From c685d5c6dfa0c41734e2a676142992e6e2169025 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 1 Oct 2020 21:01:59 +0500 Subject: [PATCH 1/2] Auto endings for text files --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..2125666142 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file From 752c05b41ccdb43c5aa320c559a58dbb95e124aa Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 1 Oct 2020 21:24:51 +0500 Subject: [PATCH 2/2] Adds renormalized files after file ending change --- .gitignore | 58 +- ChangeLog/0.0.0.txt | 958 +- ChangeLog/0.1.0_Beta_1.txt | 4 +- ChangeLog/0.1.0_Beta_2.txt | 6 +- ChangeLog/0.1.0_Beta_3.txt | 22 +- ChangeLog/0.1.0_Beta_4.txt | 12 +- ChangeLog/mkchangelog.ps1 | 82 +- Directory.Build.props | 164 +- Extensions/TestCommon/App.config | 12 +- Extensions/TestCommon/AssemblyExtensions.cs | 32 +- Extensions/TestCommon/CommonModelTest.cs | 134 +- .../TestCommon/DomainConfigurationFactory.cs | 42 +- .../HasAccessToConfigurationTest.cs | 44 +- Extensions/TestCommon/Model/Bar.cs | 82 +- Extensions/TestCommon/Model/Bar2.cs | 78 +- Extensions/TestCommon/Model/Foo.cs | 62 +- Extensions/TestCommon/Model/Foo2.cs | 62 +- .../TestCommon/Model/LinqCompilerContainer.cs | 36 +- Extensions/TestCommon/Model/Point.cs | 34 +- Extensions/TestCommon/Model/Rectangle.cs | 36 +- Extensions/TestCommon/TestCommon.csproj | 48 +- Extensions/TestCommon/TestConfiguration.cs | 200 +- .../TestCommon/Tests/TestConfigurationTest.cs | 34 +- .../App.config | 12 +- .../AutoBuildTest.cs | 36 +- .../Extensions.cs | 32 +- ...angeFieldWhichDefinedInAncestorClassBug.cs | 162 +- ...ira0565_IgnoringTakeMethodOnTranslation.cs | 586 +- .../Other.cs | 560 +- .../ReferenceFields.cs | 952 +- .../Structures.cs | 262 +- .../Xtensive.Orm.BulkOperations.Tests.csproj | 50 +- .../BulkExtensions.cs | 264 +- .../Xtensive.Orm.BulkOperations/IUpdatable.cs | 22 +- .../Internals/AddValueContext.cs | 38 +- .../Internals/BaseSqlVisitor.cs | 1074 +- .../Internals/BulkDeleteOperation.cs | 172 +- .../Internals/BulkUpdateOperation.cs | 292 +- .../Internals/ComputedExpressionSqlVisitor.cs | 44 +- .../Internals/ExpressionExtensions.cs | 72 +- .../Internals/ExpressionVisitor.cs | 682 +- .../Internals/Extensions.cs | 24 +- .../Internals/InsertOperation.cs | 188 +- .../Internals/Operation.cs | 198 +- .../Internals/PrimaryIndexMapping.cs | 34 +- .../Internals/QueryOperation.cs | 406 +- .../Internals/SetDescriptor.cs | 36 +- .../Internals/SetOperation.cs | 562 +- .../Internals/SetStatement.cs | 140 +- .../Internals/Updatable.cs | 52 +- .../Xtensive.Orm.BulkOperations/Readme.txt | 164 +- .../Xtensive.Orm.BulkOperations.csproj | 50 +- .../AccessToLocalizationOnUpgrade.cs | 156 +- .../App.config | 22 +- .../AutoBuildTest.cs | 66 +- .../CurrentThreadTest.cs | 104 +- .../DirectEditTest.cs | 90 +- .../LocalizationScopeTest.cs | 110 +- .../Model/Page.cs | 82 +- .../Model/PageLocalization.cs | 60 +- .../QueryTests.cs | 202 +- .../Xtensive.Orm.Localization.Tests.csproj | 50 +- .../Elements/ConfigurationSection.cs | 70 +- .../DefaultCultureConfigurationElement.cs | 54 +- .../LocalizationConfiguration.cs | 212 +- .../Xtensive.Orm.Localization/ILocalizable.cs | 40 +- .../LocalizationExpressionBuilder.cs | 84 +- .../LocalizationExpressionVisitor.cs | 84 +- .../Internals/LocalizationPair.cs | 74 +- .../Internals/LocalizationScope.cs | 104 +- .../Internals/QueryPreprocessor.cs | 118 +- .../Internals/TypeLocalizationInfo.cs | 66 +- .../Internals/TypeLocalizationMap.cs | 108 +- .../Xtensive.Orm.Localization/Localization.cs | 138 +- .../LocalizationContext.cs | 170 +- .../LocalizationModule.cs | 58 +- .../LocalizationPolicy.cs | 42 +- .../LocalizationSet.cs | 164 +- .../QueryExtensions.cs | 62 +- .../Xtensive.Orm.Localization/Readme.txt | 242 +- .../Xtensive.Orm.Localization.csproj | 50 +- .../App.config | 12 +- .../NLog.config | 22 +- .../TestFixture.cs | 44 +- .../Xtensive.Orm.Logging.NLog.Tests.csproj | 60 +- Extensions/Xtensive.Orm.Logging.NLog/Log.cs | 100 +- .../Xtensive.Orm.Logging.NLog/LogProvider.cs | 30 +- .../Xtensive.Orm.Logging.NLog/Readme.txt | 100 +- .../Xtensive.Orm.Logging.NLog.csproj | 54 +- .../App.config | 40 +- .../TestFixture.cs | 48 +- .../Xtensive.Orm.Logging.log4net.Tests.csproj | 48 +- .../Xtensive.Orm.Logging.log4net/Log.cs | 100 +- .../LogProvider.cs | 38 +- .../Xtensive.Orm.Logging.log4net/Readme.txt | 130 +- .../Xtensive.Orm.Logging.log4net.csproj | 54 +- .../App.config | 20 +- .../AutoBuildTest.cs | 54 +- .../Extensions.cs | 40 +- .../Tests/Other.cs | 194 +- .../Tests/Reprocessing.cs | 710 +- .../Xtensive.Orm.Reprocessing.Tests.csproj | 50 +- .../Configuration/ConfigurationSection.cs | 72 +- .../ReprocessingConfiguration.cs | 184 +- .../DomainBuildErrorEventArgs.cs | 60 +- .../DomainBuilder.cs | 68 +- .../DomainExtensions.cs | 340 +- .../ExecuteActionStrategy.cs | 364 +- .../ExecuteErrorEventArgs.cs | 88 +- .../ExecutionContext.cs | 94 +- .../HandleReprocessableExceptionStrategy.cs | 50 +- ...HandleUniqueConstraintViolationStrategy.cs | 74 +- .../IExecuteActionStrategy.cs | 44 +- .../IExecuteConfiguration.cs | 92 +- .../Internals/ExecuteConfiguration.cs | 98 +- .../Internals/Extensions.cs | 28 +- .../NoReprocessStrategy.cs | 16 +- .../Xtensive.Orm.Reprocessing/Readme.txt | 124 +- .../ReprocessAttribute.cs | 238 +- .../ReprocessableDomainBuilder.cs | 128 +- .../RollbackTransactionException.cs | 20 +- .../StandardExecutionStrategy.cs | 42 +- .../Xtensive.Orm.Reprocessing.csproj | 54 +- .../Xtensive.Orm.Security.Tests/App.config | 42 +- .../AutoBuildTest.cs | 218 +- .../Model/Branch.cs | 48 +- .../Model/Customer.cs | 74 +- .../Model/Employee.cs | 42 +- .../Model/VipCustomer.cs | 44 +- .../Permissions/CustomerPermission.cs | 36 +- .../Permissions/VipCustomerPermission.cs | 46 +- .../Roles/AircraftManagerRole.cs | 64 +- .../Roles/BranchOfficeManagerRole.cs | 72 +- .../Roles/EmployeeRole.cs | 42 +- .../Roles/SalesManagerRole.cs | 76 +- .../Roles/SalesPersonRole.cs | 64 +- .../Tests/AuthenticationTests.cs | 84 +- .../Tests/ConfigurationTests.cs | 160 +- .../Tests/HashingServicesTests.cs | 192 +- .../Tests/ImpersonationContextTests.cs | 316 +- .../Tests/PermissionSetTests.cs | 128 +- .../Xtensive.Orm.Security.Tests.csproj | 50 +- ...thenticationServiceConfigurationElement.cs | 56 +- .../Elements/ConfigurationSection.cs | 94 +- .../HashingServiceConfigurationElement.cs | 56 +- .../Configuration/SecurityConfiguration.cs | 212 +- .../Cryptography/GenericHashingService.cs | 192 +- .../Cryptography/MD5HashingService.cs | 62 +- .../Cryptography/PlainHashingService.cs | 58 +- .../Cryptography/SHA1HashingService.cs | 60 +- .../Cryptography/SHA256HashingService.cs | 60 +- .../Cryptography/SHA384HashingService.cs | 60 +- .../Cryptography/SHA512HashingService.cs | 60 +- .../Xtensive.Orm.Security/GenericPrincipal.cs | 116 +- .../ImpersonationContext.cs | 166 +- .../Interfaces/IAuthenticationService.cs | 52 +- .../Interfaces/IHashingService.cs | 60 +- .../Interfaces/IPrincipal.cs | 58 +- .../Xtensive.Orm.Security/Interfaces/IRole.cs | 74 +- .../Xtensive.Orm.Security/Permission.cs | 256 +- .../Xtensive.Orm.Security/PermissionSet.cs | 148 +- Extensions/Xtensive.Orm.Security/Principal.cs | 130 +- Extensions/Xtensive.Orm.Security/Readme.txt | 470 +- Extensions/Xtensive.Orm.Security/Role.cs | 180 +- .../SecureQueryRootBuilder.cs | 188 +- .../Services/GenericAuthenticationService.cs | 178 +- .../SessionExtensions.cs | 250 +- .../Xtensive.Orm.Security.csproj | 56 +- .../Xtensive.Orm.Tracking.Tests/App.config | 12 +- .../AutoBuildTest.cs | 122 +- .../Model/MyChildEntity.cs | 34 +- .../Model/MyEntity.cs | 94 +- .../Model/MyEntitySetItem.cs | 56 +- .../Model/MyEnum.cs | 26 +- .../Model/MyReferenceProperty.cs | 56 +- .../Model/MyStructure.cs | 80 +- .../ServiceRegistrationTest.cs | 56 +- .../Xtensive.Orm.Tracking.Tests/TestHelper.cs | 62 +- .../TrackingItemTests.cs | 288 +- .../TrackingMonitorTests.cs | 808 +- .../TrackingStackFrameTests.cs | 186 +- .../Xtensive.Orm.Tracking.Tests.csproj | 54 +- .../Xtensive.Orm.Tracking/ChangedValue.cs | 76 +- .../Xtensive.Orm.Tracking/DomainExtensions.cs | 40 +- .../Interfaces/IDomainTrackingMonitor.cs | 20 +- .../Interfaces/ISessionTrackingMonitor.cs | 16 +- .../Interfaces/ITrackingItem.cs | 30 +- .../Interfaces/ITrackingMonitor.cs | 48 +- .../Internals/DomainTrackingMonitor.cs | 70 +- .../Internals/SessionTrackingMonitor.cs | 170 +- .../Internals/TrackingItem.cs | 206 +- .../Internals/TrackingMonitor.cs | 64 +- .../Internals/TrackingStackFrame.cs | 126 +- Extensions/Xtensive.Orm.Tracking/Readme.txt | 126 +- .../SessionExtensions.cs | 40 +- .../TrackingCompletedEventArgs.cs | 72 +- .../TrackingItemState.cs | 62 +- .../Xtensive.Orm.Tracking.csproj | 54 +- .../AplicationBuilderExtensions.cs | 60 +- Extensions/Xtensive.Orm.Web/DomainBuilder.cs | 56 +- Extensions/Xtensive.Orm.Web/Readme.txt | 132 +- Extensions/Xtensive.Orm.Web/SessionManager.cs | 404 +- .../Xtensive.Orm.Web/Xtensive.Orm.Web.csproj | 56 +- MSBuild/DataObjects.Net.InternalBuild.targets | 20 +- MSBuild/DataObjects.Net.targets | 108 +- Orm.sln | 494 +- .../Orm.Providers.Firebird/DomainHandler.cs | 40 +- .../Orm.Providers.Firebird/HandlerFactory.cs | 34 +- .../Orm.Providers.Firebird/SqlCompiler.cs | 38 +- .../Sql.Drivers.Firebird/Connection.cs | 198 +- .../Sql.Drivers.Firebird/Constants.cs | 32 +- .../Sql.Drivers.Firebird/Driver.cs | 112 +- .../Sql.Drivers.Firebird/DriverFactory.cs | 210 +- .../Resources/Strings.Designer.cs | 162 +- .../Resources/Strings.resx | 250 +- .../Sql.Drivers.Firebird/v2_5/Compiler.cs | 624 +- .../Sql.Drivers.Firebird/v2_5/Driver.cs | 94 +- .../v2_5/Extractor.Queries.cs | 392 +- .../Sql.Drivers.Firebird/v2_5/Extractor.cs | 852 +- .../v2_5/ServerInfoProvider.cs | 560 +- .../Sql.Drivers.Firebird/v2_5/Translator.cs | 660 +- .../Sql.Drivers.Firebird/v2_5/TypeMapper.cs | 248 +- .../Xtensive.Orm.Firebird.csproj | 50 +- .../Advanced/CustomLinqCompilerTest.cs | 404 +- .../Advanced/CustomSqlCompilerTest.cs | 334 +- .../Advanced/JoinsAndSubqueriesTest.cs | 214 +- Orm/Xtensive.Orm.Manual/App.config | 106 +- .../Attributes/AttributesTest.cs | 316 +- .../Caching/CalculatedValueCachingTest.cs | 366 +- .../Concurrency/LockingTest.cs | 358 +- .../Concurrency/VersionsTest.cs | 608 +- .../DomainAndSessionSample.cs | 426 +- .../Entities/TestFixture.cs | 136 +- .../EntitySets/EntitySetsTest.cs | 456 +- .../FutureQueries/FutureQueries.sql | 64 +- .../FutureQueries/FutureQueriesTest.cs | 184 +- .../Indexes/TestFixture.cs | 202 +- .../Intro/CheatSheetTest.cs | 546 +- .../Intro/HelloWorldTest.cs | 130 +- .../CustomKeyGeneratorsTest.cs | 248 +- .../AuditAndOpenGenericsTest.cs | 908 +- .../ModellingDomain/IndexAttributeTest.cs | 190 +- .../Persistent/TestFixture.cs | 126 +- Orm/Xtensive.Orm.Manual/Prefetch/Prefetch.sql | 86 +- .../Prefetch/PrefetchTest.cs | 550 +- .../Services/DirectSqlAccessorTest.cs | 152 +- .../Services/DirectStateAccessorTest.cs | 320 +- .../Structures/TestFixture.cs | 196 +- .../Transactions/NestedTransactionsTest.cs | 298 +- .../Transactions/SessionSwitchingTest.cs | 216 +- .../Upgrade/Model_1/Model.cs | 56 +- .../Upgrade/Model_2/Model.cs | 92 +- .../Upgrade/Model_2/Upgrader.cs | 54 +- .../Upgrade/Model_3/Model.cs | 94 +- .../Upgrade/Model_3/Upgrader.cs | 60 +- .../Upgrade/Model_4/Model.cs | 132 +- .../Upgrade/Model_4/Upgrader.cs | 90 +- .../Upgrade/UpgradeHandlerEnabler.cs | 30 +- .../Upgrade/UpgradeTest.cs | 268 +- .../Xtensive.Orm.Manual.csproj | 90 +- .../Orm.Providers.MySql/DomainHandler.cs | 40 +- .../Orm.Providers.MySql/HandlerFactory.cs | 34 +- .../Orm.Providers.MySql/SqlCompiler.cs | 40 +- .../Sql.Drivers.MySql/Connection.cs | 222 +- .../Sql.Drivers.MySql/Driver.cs | 122 +- .../Sql.Drivers.MySql/DriverFactory.cs | 212 +- .../Resources/Strings.Designer.cs | 234 +- .../Sql.Drivers.MySql/Resources/Strings.resx | 274 +- .../Sql.Drivers.MySql/v5_0/Compiler.cs | 576 +- .../Sql.Drivers.MySql/v5_0/Driver.cs | 100 +- .../v5_0/Extractor.Queries.cs | 356 +- .../Sql.Drivers.MySql/v5_0/Extractor.cs | 1072 +- .../v5_0/ServiceInfoProvider.cs | 646 +- .../Sql.Drivers.MySql/v5_0/Translator.cs | 1260 +- .../Sql.Drivers.MySql/v5_0/TypeMapper.cs | 256 +- .../Sql.Drivers.MySql/v5_1/Compiler.cs | 34 +- .../Sql.Drivers.MySql/v5_1/Driver.cs | 90 +- .../Sql.Drivers.MySql/v5_1/Extractor.cs | 34 +- .../v5_1/ServerInfoProvider.cs | 34 +- .../Sql.Drivers.MySql/v5_1/Translator.cs | 32 +- .../Sql.Drivers.MySql/v5_1/TypeMapper.cs | 34 +- .../Sql.Drivers.MySql/v5_5/Compiler.cs | 34 +- .../Sql.Drivers.MySql/v5_5/Driver.cs | 90 +- .../Sql.Drivers.MySql/v5_5/Extractor.cs | 34 +- .../v5_5/ServerInfoProvider.cs | 66 +- .../Sql.Drivers.MySql/v5_5/Translator.cs | 34 +- .../Sql.Drivers.MySql/v5_5/TypeMapper.cs | 34 +- .../Sql.Drivers.MySql/v5_6/Compiler.cs | 36 +- .../Sql.Drivers.MySql/v5_6/Driver.cs | 92 +- .../Sql.Drivers.MySql/v5_6/Extractor.cs | 34 +- .../v5_6/ServerInfoProvider.cs | 34 +- .../Sql.Drivers.MySql/v5_6/Translator.cs | 72 +- .../Sql.Drivers.MySql/v5_6/TypeMapper.cs | 36 +- .../Xtensive.Orm.MySql.csproj | 58 +- .../Orm.Providers.Oracle/DomainHandler.cs | 40 +- .../Orm.Providers.Oracle/HandlerFactory.cs | 34 +- .../Orm.Providers.Oracle/SqlCompiler.cs | 88 +- .../Sql.Drivers.Oracle/BinaryLargeObject.cs | 152 +- .../CharacterLargeObject.cs | 152 +- .../Sql.Drivers.Oracle/Connection.cs | 240 +- .../Sql.Drivers.Oracle/Driver.cs | 100 +- .../Sql.Drivers.Oracle/DriverFactory.cs | 196 +- .../Resources/Strings.Designer.cs | 234 +- .../Sql.Drivers.Oracle/Resources/Strings.resx | 274 +- .../Sql.Drivers.Oracle/v09/Compiler.cs | 826 +- .../Sql.Drivers.Oracle/v09/Driver.cs | 118 +- .../v09/Extractor.Queries.cs | 496 +- .../Sql.Drivers.Oracle/v09/Extractor.cs | 1036 +- .../v09/ServerInfoProvider.cs | 542 +- .../Sql.Drivers.Oracle/v09/Translator.cs | 716 +- .../Sql.Drivers.Oracle/v09/TypeMapper.cs | 558 +- .../Sql.Drivers.Oracle/v10/Compiler.cs | 42 +- .../Sql.Drivers.Oracle/v10/Driver.cs | 92 +- .../Sql.Drivers.Oracle/v10/Extractor.cs | 54 +- .../v10/ServerInfoProvider.cs | 60 +- .../Sql.Drivers.Oracle/v10/Translator.cs | 46 +- .../Sql.Drivers.Oracle/v10/TypeMapper.cs | 74 +- .../Sql.Drivers.Oracle/v11/Compiler.cs | 42 +- .../Sql.Drivers.Oracle/v11/Driver.cs | 92 +- .../Sql.Drivers.Oracle/v11/Extractor.cs | 40 +- .../v11/ServerInfoProvider.cs | 34 +- .../Sql.Drivers.Oracle/v11/Translator.cs | 40 +- .../Sql.Drivers.Oracle/v11/TypeMapper.cs | 40 +- .../Xtensive.Orm.Oracle.csproj | 58 +- .../Orm.Providers.PostgreSql/DomainHandler.cs | 74 +- .../HandlerFactory.cs | 34 +- .../NpgsqlBoxCompilers.cs | 224 +- .../NpgsqlCircleCompilers.cs | 128 +- .../NpgsqlLSegCompilers.cs | 128 +- .../NpgsqlPathCompilers.cs | 68 +- .../NpgsqlPointCompilers.cs | 128 +- .../NpgsqlPolygonCompilers.cs | 98 +- .../PostgresqlSqlDml.cs | 276 +- .../PostgresqlSqlFunctionType.cs | 80 +- .../Orm.Providers.PostgreSql/SqlCompiler.cs | 114 +- .../Sql.Drivers.PostgreSql/Connection.cs | 202 +- .../Sql.Drivers.PostgreSql/Driver.cs | 208 +- .../Sql.Drivers.PostgreSql/DriverFactory.cs | 212 +- .../PostgreSqlTypeMapper.cs | 124 +- .../Sql.Drivers.PostgreSql/RelOptions.cs | 20 +- .../Resources/Strings.Designer.cs | 216 +- .../Resources/Strings.resx | 268 +- .../Sql.Drivers.PostgreSql/v10_0/Compiler.cs | 34 +- .../Sql.Drivers.PostgreSql/v10_0/Driver.cs | 86 +- .../Sql.Drivers.PostgreSql/v10_0/Extractor.cs | 164 +- .../v10_0/ServerInfoProvider.cs | 34 +- .../v10_0/Translator.cs | 34 +- .../v10_0/TypeMapper.cs | 36 +- .../Sql.Drivers.PostgreSql/v8_0/BoxMapper.cs | 44 +- .../v8_0/CircleMapper.cs | 44 +- .../Sql.Drivers.PostgreSql/v8_0/Compiler.cs | 874 +- .../v8_0/CustomSqlType.cs | 82 +- .../Sql.Drivers.PostgreSql/v8_0/Driver.cs | 152 +- .../Sql.Drivers.PostgreSql/v8_0/Extractor.cs | 2076 +- .../Sql.Drivers.PostgreSql/v8_0/LSegMapper.cs | 44 +- .../Sql.Drivers.PostgreSql/v8_0/PathMapper.cs | 96 +- .../v8_0/PointMapper.cs | 44 +- .../v8_0/PolygonMapper.cs | 94 +- .../v8_0/ServerInfoProvider.cs | 652 +- .../Sql.Drivers.PostgreSql/v8_0/Translator.cs | 1794 +- .../Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs | 440 +- .../Sql.Drivers.PostgreSql/v8_1/Compiler.cs | 40 +- .../Sql.Drivers.PostgreSql/v8_1/Driver.cs | 96 +- .../Sql.Drivers.PostgreSql/v8_1/Extractor.cs | 26 +- .../v8_1/ServerInfoProvider.cs | 30 +- .../Sql.Drivers.PostgreSql/v8_1/Translator.cs | 106 +- .../Sql.Drivers.PostgreSql/v8_1/TypeMapper.cs | 40 +- .../Sql.Drivers.PostgreSql/v8_2/Compiler.cs | 40 +- .../Sql.Drivers.PostgreSql/v8_2/Driver.cs | 94 +- .../Sql.Drivers.PostgreSql/v8_2/Extractor.cs | 164 +- .../v8_2/ServerInfoProvider.cs | 44 +- .../Sql.Drivers.PostgreSql/v8_2/Translator.cs | 90 +- .../Sql.Drivers.PostgreSql/v8_2/TypeMapper.cs | 38 +- .../Sql.Drivers.PostgreSql/v8_3/Compiler.cs | 204 +- .../Sql.Drivers.PostgreSql/v8_3/Driver.cs | 94 +- .../Sql.Drivers.PostgreSql/v8_3/Extractor.cs | 78 +- .../v8_3/ServerInfoProvider.cs | 92 +- .../Sql.Drivers.PostgreSql/v8_3/Translator.cs | 172 +- .../Sql.Drivers.PostgreSql/v8_3/TypeMapper.cs | 74 +- .../Sql.Drivers.PostgreSql/v8_4/Compiler.cs | 34 +- .../Sql.Drivers.PostgreSql/v8_4/Driver.cs | 90 +- .../Sql.Drivers.PostgreSql/v8_4/Extractor.cs | 54 +- .../v8_4/ServerInfoProvider.cs | 52 +- .../Sql.Drivers.PostgreSql/v8_4/Translator.cs | 34 +- .../Sql.Drivers.PostgreSql/v8_4/TypeMapper.cs | 34 +- .../Sql.Drivers.PostgreSql/v9_0/Compiler.cs | 34 +- .../Sql.Drivers.PostgreSql/v9_0/Driver.cs | 90 +- .../Sql.Drivers.PostgreSql/v9_0/Extractor.cs | 34 +- .../v9_0/ServerInfoProvider.cs | 38 +- .../Sql.Drivers.PostgreSql/v9_0/Translator.cs | 72 +- .../Sql.Drivers.PostgreSql/v9_0/TypeMapper.cs | 34 +- .../Sql.Drivers.PostgreSql/v9_1/Compiler.cs | 34 +- .../Sql.Drivers.PostgreSql/v9_1/Driver.cs | 90 +- .../Sql.Drivers.PostgreSql/v9_1/Extractor.cs | 308 +- .../v9_1/ServerInfoProvider.cs | 38 +- .../Sql.Drivers.PostgreSql/v9_1/Translator.cs | 72 +- .../Sql.Drivers.PostgreSql/v9_1/TypeMapper.cs | 34 +- .../Xtensive.Orm.PostgreSql.csproj | 70 +- .../Orm.Providers.Sqlite/DomainHandler.cs | 42 +- .../Orm.Providers.Sqlite/HandlerFactory.cs | 34 +- .../Orm.Providers.Sqlite/SqlCompiler.cs | 40 +- .../Collations/CurrentCultureCollation.cs | 38 +- .../CurrentCultureIgnoreCaseCollation.cs | 38 +- .../Collations/InvariantCultureCollation.cs | 38 +- .../InvariantCultureIgnoreCaseCollation.cs | 38 +- .../Collations/OrdinalCollation.cs | 38 +- .../Collations/OrdinalIgnoreCaseCollation.cs | 38 +- .../Sql.Drivers.Sqlite/Connection.cs | 202 +- .../Sql.Drivers.Sqlite/Driver.cs | 78 +- .../Sql.Drivers.Sqlite/DriverFactory.cs | 160 +- .../Sql.Drivers.Sqlite/ProviderInitializer.cs | 296 +- .../Resources/Strings.Designer.cs | 272 +- .../Sql.Drivers.Sqlite/Resources/Strings.resx | 286 +- .../Sql.Drivers.Sqlite/v3/Compiler.cs | 1006 +- .../Sql.Drivers.Sqlite/v3/Driver.cs | 120 +- .../Sql.Drivers.Sqlite/v3/Extractor.cs | 618 +- .../v3/ServerInfoProvider.cs | 560 +- .../Sql.Drivers.Sqlite/v3/Translator.cs | 1090 +- .../Sql.Drivers.Sqlite/v3/TypeMapper.cs | 272 +- .../Xtensive.Orm.Sqlite.csproj | 58 +- Orm/Xtensive.Orm.Tests.Core/App.config | 98 +- .../ArgumentValidatorTest.cs | 54 +- .../Arithmetics/AritmeticsTest.cs | 200 +- .../Caching/CachePerformanceTest.cs | 352 +- .../Caching/InfiniteCacheTest.cs | 456 +- .../Caching/LruCacheTest.cs | 672 +- .../Caching/WeakCacheTest.cs | 354 +- .../Caching/WeakestCacheTest.cs | 200 +- .../Collections/ChainedBufferTest.cs | 424 +- .../Collections/CollectionBaseTest.cs | 224 +- .../Collections/DirectionCollectionTest.cs | 60 +- .../Collections/EnumerableExtensionsTest.cs | 334 +- .../Collections/ExtensionCollectionTest.cs | 82 +- .../Collections/FlagCollectionTest.cs | 190 +- .../Collections/LinkedListTest.cs | 72 +- .../Collections/NativeTypeClassifierTest.cs | 96 +- .../Collections/PriorityQueueTest.cs | 198 +- .../Collections/ReadOnlyCollectionTest.cs | 184 +- .../Collections/ReadOnlyDictionaryTest.cs | 146 +- .../Collections/ReadOnlyListTest.cs | 236 +- .../Collections/ReadOnlySetTest.cs | 166 +- .../Collections/SetTestA.cs | 78 +- .../Collections/SetTests.cs | 54 +- .../Collections/ThreadSafeDictionaryTest.cs | 274 +- .../Collections/TopologicalSorterTest.cs | 334 +- .../Comparison/ComparerProviderTestModel.cs | 280 +- .../Comparison/ComparerProviderTests.cs | 708 +- .../EqualityComparerProviderTests.cs | 162 +- .../Comparison/StringComparisonTest.cs | 212 +- .../Conversion/ConverterProviderTest.cs | 76 +- .../Conversion/ConverterTest.cs | 614 +- .../Internals/BooleanConverterTest.cs | 114 +- .../Conversion/Internals/ByteConverterTest.cs | 114 +- .../Conversion/Internals/CharConverterTest.cs | 166 +- .../Conversion/Internals/ConverterTestBase.cs | 190 +- .../Internals/DateTimeConverterTest.cs | 160 +- .../Internals/DecimalConverterTest.cs | 134 +- .../Internals/DoubleConverterTest.cs | 144 +- .../Conversion/Internals/GuidConverterTest.cs | 144 +- .../Internals/Int16ConverterTest.cs | 114 +- .../Internals/Int32ConverterTest.cs | 114 +- .../Internals/Int64ConverterTest.cs | 120 +- .../Internals/SByteConverterTest.cs | 114 +- .../Internals/SingleConverterTest.cs | 162 +- .../Internals/StringAdvancedConverter.cs | 104 +- .../Internals/StringConverterTest.cs | 198 +- .../Internals/TestConverterProvider.cs | 38 +- .../Internals/TimeSpanConverterTest.cs | 126 +- .../Internals/UInt16ConverterTest.cs | 114 +- .../Internals/UInt32converterTest.cs | 114 +- .../Internals/UInt64ConverterTest.cs | 120 +- .../Diagnostics/DebugInfoTest.cs | 58 +- .../Diagnostics/LogMessageTest.cs | 150 +- .../Diagnostics/MeasurementTest.cs | 134 +- .../Diagnostics/RuntimeInfoTest.cs | 142 +- .../DotNetFramework/AllocationTest.cs | 756 +- .../DotNetFramework/CallTest.cs | 1596 +- .../DotNetFramework/CastTest.cs | 220 +- .../DotNetFramework/CloningTest.cs | 294 +- .../DotNetFramework/ConstraintsTest.cs | 318 +- .../DotNetFramework/CoreFeaturesTest.cs | 1454 +- .../DotNetFramework/FieldTypeTest.cs | 348 +- .../DotNetFramework/GenericFeaturesTest.cs | 226 +- .../DotNetFramework/InterfaceTest.cs | 162 +- .../DotNetFramework/MemoryAccessTypeTest.cs | 230 +- .../DotNetFramework/NewTupleLogicTest.cs | 364 +- .../DotNetFramework/PointersTest.cs | 198 +- .../DotNetFramework/StaticMethodTest.cs | 138 +- .../DotNetFramework/SwitchVsArrayTest.cs | 194 +- .../DotNetFramework/ThreadingTest.cs | 526 +- .../DotNetFramework/ValidationTest.cs | 306 +- .../Helpers/StringExtensionsTest.cs | 142 +- .../Helpers/TopologicalSorterTest.cs | 318 +- Orm/Xtensive.Orm.Tests.Core/IoC/MainTest.cs | 250 +- .../Linq/CachingExpressionCompilerTest.cs | 346 +- .../Linq/ConstantExtractorTest.cs | 104 +- .../Linq/ExpressionTestBase.cs | 262 +- .../Linq/ExpressionTreeTest.cs | 270 +- .../Linq/ExpressionWriterTest.cs | 78 +- .../Linq/SerializableExpressionsTest.cs | 318 +- .../Logging/InternalLogProviderTests.cs | 134 +- .../Logging/LogManagerTests.cs | 146 +- .../Logging/WriteToLogInstanceTests.cs | 472 +- .../Logging/WriteToLogTests.cs | 444 +- .../Modelling/DataUpgradeTest.cs | 354 +- .../Modelling/DatabaseModel/Database.cs | 94 +- .../DatabaseModel/DatabaseCollection.cs | 42 +- .../Modelling/DatabaseModel/Index.cs | 106 +- .../DatabaseModel/IndexCollection.cs | 42 +- .../Modelling/DatabaseModel/NodeBase.cs | 144 +- .../DatabaseModel/NodeCollectionBase.cs | 42 +- .../Modelling/DatabaseModel/PrimaryIndex.cs | 52 +- .../Modelling/DatabaseModel/Ref.cs | 82 +- .../Modelling/DatabaseModel/Role.cs | 50 +- .../Modelling/DatabaseModel/RoleCollection.cs | 42 +- .../Modelling/DatabaseModel/RoleRef.cs | 64 +- .../DatabaseModel/RoleRefCollection.cs | 42 +- .../Modelling/DatabaseModel/Schema.cs | 74 +- .../DatabaseModel/SchemaCollection.cs | 42 +- .../Modelling/DatabaseModel/SecondaryIndex.cs | 52 +- .../Modelling/DatabaseModel/Security.cs | 84 +- .../Modelling/DatabaseModel/Server.cs | 114 +- .../Modelling/DatabaseModel/Table.cs | 92 +- .../DatabaseModel/TableCollection.cs | 42 +- .../Modelling/DatabaseModel/User.cs | 96 +- .../Modelling/DatabaseModel/UserCollection.cs | 38 +- .../Modelling/DatabaseModelTest.cs | 734 +- .../Modelling/IndexingModel/ColumnInfo.cs | 168 +- .../IndexingModel/ColumnInfoCollection.cs | 56 +- .../Modelling/IndexingModel/ColumnInfoRef.cs | 62 +- .../Exceptions/ValidationException.cs | 140 +- .../IndexingModel/ForeignKeyCollection.cs | 50 +- .../ForeignKeyColumnCollection.cs | 78 +- .../IndexingModel/ForeignKeyColumnRef.cs | 74 +- .../Modelling/IndexingModel/ForeignKeyInfo.cs | 250 +- .../IndexingModel/FullTextColumnRef.cs | 120 +- .../FullTextColumnRefCollection.cs | 48 +- .../IndexingModel/FullTextIndexInfo.cs | 136 +- .../IndexingModel/IncludedColumnRef.cs | 76 +- .../IncludedColumnRefCollection.cs | 46 +- .../Modelling/IndexingModel/IndexInfo.cs | 142 +- .../Modelling/IndexingModel/KeyColumnRef.cs | 84 +- .../IndexingModel/KeyColumnRefCollection.cs | 46 +- .../IndexingModel/KeyColumnRef{TParent}.cs | 146 +- .../Modelling/IndexingModel/NodeBase.cs | 126 +- .../IndexingModel/NodeCollectionBase.cs | 58 +- .../IndexingModel/PrimaryIndexInfo.cs | 192 +- .../IndexingModel/PrimaryKeyColumnRef.cs | 84 +- .../PrimaryKeyColumnRefCollection.cs | 46 +- .../Modelling/IndexingModel/Ref.cs | 124 +- .../IndexingModel/ReferentialAction.cs | 74 +- .../Resources/Strings.Designer.cs | 540 +- .../IndexingModel/Resources/Strings.resx | 382 +- .../IndexingModel/SecondaryIndexInfo.cs | 256 +- .../SecondaryIndexInfoCollection.cs | 50 +- .../Modelling/IndexingModel/StorageInfo.cs | 120 +- .../Modelling/IndexingModel/TableInfo.cs | 228 +- .../IndexingModel/TableInfoCollection.cs | 50 +- .../Modelling/IndexingModel/TypeInfo.cs | 436 +- .../Modelling/IndexingModel/ValueColumnRef.cs | 74 +- .../IndexingModel/ValueColumnRefCollection.cs | 46 +- .../Modelling/IndexingModelTest.cs | 1036 +- .../Parameters/ParametersTest.cs | 152 +- .../Performance/ComparerPerformanceTest.cs | 396 +- .../Performance/TuplePerformanceTest.cs | 172 +- .../Reflection/AttributeHelperTest.cs | 442 +- .../DelegateHelperCreateDelegateTest.cs | 326 +- .../Reflection/TypeHelperTest.cs | 966 +- .../Reflection/TypeHelperTestModel.cs | 666 +- .../Resources/TestResources.Designer.cs | 144 +- .../Resources/TestResources.resx | 246 +- .../Testing/AssertExTest.cs | 78 +- .../Testing/InstanceGeneratorTest.cs | 274 +- .../Testing/RandomManagerTest.cs | 186 +- .../Tuples/DifferentialTupleTest.cs | 146 +- .../Tuples/DummyTuple.cs | 178 +- .../Tuples/FlagsTest.cs | 76 +- .../Tuples/LongTupleTest.cs | 132 +- .../Tuples/Transform/CutInTransformTest.cs | 218 +- .../Tuples/Transform/MapTransformTest.cs | 52 +- .../Tuples/Transform/MergeTransformTest.cs | 298 +- .../Tuples/Transform/ReadOnlyTransformTest.cs | 160 +- .../Tuples/Transform/SegmentTransformTest.cs | 188 +- .../Tuples/TupleBehaviorTest.cs | 240 +- .../Tuples/TupleBehaviorTestBase.cs | 454 +- .../Tuples/TupleComparerTest.cs | 422 +- .../Tuples/TupleDescriptorTest.cs | 270 +- .../Tuples/TuplePerformanceTest.cs | 856 +- .../Tuples/TupleSerializationTest.cs | 146 +- Orm/Xtensive.Orm.Tests.Core/UrlInfoTest.cs | 60 +- .../Xtensive.Orm.Tests.Core.csproj | 64 +- Orm/Xtensive.Orm.Tests.FSharp/App.config | 54 +- Orm/Xtensive.Orm.Tests.FSharp/FsUnit.fs | 78 +- Orm/Xtensive.Orm.Tests.FSharp/Model.fs | 32 +- Orm/Xtensive.Orm.Tests.FSharp/Test.fs | 74 +- .../Xtensive.Orm.Tests.FSharp.fsproj | 146 +- Orm/Xtensive.Orm.Tests.Framework/App.config | 12 +- .../AssemblyExtensions.cs | 36 +- Orm/Xtensive.Orm.Tests.Framework/AssertEx.cs | 250 +- .../AutoBuildTest.cs | 206 +- .../DO-Tests-Plus.sql | 438 +- Orm/Xtensive.Orm.Tests.Framework/DO-Tests.sql | 100 +- Orm/Xtensive.Orm.Tests.Framework/DebugInfo.cs | 216 +- .../DomainConfigurationFactory.cs | 104 +- .../DomainModelExtensions.cs | 534 +- Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs | 4602 +- .../HasConfigurationAccessTest.cs | 78 +- .../HighResolutionTime.cs | 100 +- .../IndexInfoExtensions.cs | 98 +- .../InheritanceSchemaModifier.cs | 222 +- .../InstanceGenerationUtils.cs | 206 +- .../InstanceGeneratorProvider.cs | 130 +- .../Interfaces/IInstanceGenerator.cs | 60 +- .../Interfaces/IInstanceGeneratorBase.cs | 68 +- .../Interfaces/IInstanceGeneratorProvider.cs | 58 +- .../Internals/ArrayInstanceGenerator.cs | 60 +- .../Internals/BooleanInstanceGenerator.cs | 62 +- .../Internals/ByteInstanceGenerator.cs | 54 +- .../Internals/CharInstanceGenerator.cs | 64 +- .../Internals/DateTimeInstanceGenerator.cs | 72 +- .../Internals/DecimalInstanceGenerator.cs | 58 +- .../Internals/DoubleInstanceGenerator.cs | 54 +- .../Internals/EnumInstanceGenerator.cs | 62 +- .../Internals/GuidInstanceGenerator.cs | 58 +- .../Internals/InstanceGeneratorBase.cs | 152 +- .../Internals/Int16InstanceGenerator.cs | 54 +- .../Internals/Int32InstanceGenerator.cs | 54 +- .../Internals/Int64InstanceGenerator.cs | 66 +- .../KeyValuePairInstanceGenerator.cs | 72 +- .../Internals/NullableInstanceGenerator.cs | 66 +- .../Internals/PairInstanceGenerator.cs | 60 +- .../Internals/SByteInstanceGenerator.cs | 64 +- .../Internals/SingleInstanceGenerator.cs | 60 +- .../Internals/StringInstanceGenerator.cs | 54 +- .../Internals/TripletInstanceGenerator.cs | 62 +- .../Internals/TupleInstanceGenerator.cs | 150 +- .../Internals/UInt16InstanceGenerator.cs | 58 +- .../Internals/UInt32InstanceGenerator.cs | 58 +- .../Internals/UInt64InstanceGenerator.cs | 60 +- .../Measurement.cs | 466 +- .../MeasurementOptions.cs | 90 +- Orm/Xtensive.Orm.Tests.Framework/Orm.config | 286 +- .../RandomManager.cs | 194 +- Orm/Xtensive.Orm.Tests.Framework/Require.cs | 164 +- .../RuntimeInfo.cs | 222 +- .../SeedVariatorType.cs | 84 +- .../StorageProvider.cs | 42 +- .../StorageProviderInfo.cs | 206 +- .../StorageProviderVersion.cs | 54 +- .../StorageTestHelper.cs | 190 +- .../TestConfiguration.cs | 210 +- .../TestHelper.cs | 102 +- Orm/Xtensive.Orm.Tests.Framework/TestInfo.cs | 164 +- .../TestSqlDriver.cs | 122 +- .../TypeIdBehavior.cs | 30 +- .../TypeIdModifier.cs | 160 +- ...tanceGenerator{T,TBase1,TBase2, TBase3}.cs | 100 +- ...ppingInstanceGenerator{T,TBase1,TBase2}.cs | 86 +- .../WrappingInstanceGenerator{T,TBase}.cs | 72 +- .../Xtensive.Orm.Tests.Framework.csproj | 92 +- Orm/Xtensive.Orm.Tests.Sql/App.config | 12 +- Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs | 1342 +- Orm/Xtensive.Orm.Tests.Sql/CollectionTest.cs | 78 +- Orm/Xtensive.Orm.Tests.Sql/CompilerTest.cs | 518 +- .../DateTimeIntervalTest.cs | 452 +- .../DateTimeOffsetTest.cs | 412 +- .../DriverFactoryTest.cs | 210 +- .../ExceptionTypesTest.cs | 610 +- .../Firebird/CompilerTest.cs | 32 +- .../Firebird/DateTimeIntervalTest.cs | 64 +- .../Firebird/ExceptionTypesTest.cs | 66 +- .../Firebird/ExtractorTest.cs | 78 +- .../Firebird/IndexTest.cs | 146 +- .../Firebird/QueryTest.cs | 92 +- .../Firebird/SavepointTest.cs | 70 +- .../Firebird/TestHelpers.cs | 124 +- .../Firebird/TypeMappingTest.cs | 108 +- Orm/Xtensive.Orm.Tests.Sql/IndexTest.cs | 150 +- .../MakeNamesUnreadableTest.cs | 926 +- .../MySQL/CompilerTest.cs | 32 +- .../MySQL/DateTimeIntervalTests.cs | 546 +- .../MySQL/ExtractorTest.cs | 360 +- Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs | 752 +- Orm/Xtensive.Orm.Tests.Sql/MySQL/Sakila.cs | 1016 +- .../MySQL/SakilaDb/CreateTestUser.sql | 12 +- .../MySQL/SakilaDb/sakila-data.sql | 324 +- .../MySQL/SakilaExtractorTest.cs | 2068 +- .../MySQL/TypeMappingTests.cs | 48 +- .../Oracle/DateTimeIntervalTest.cs | 36 +- .../Oracle/DateTimeOffsetTest.cs | 38 +- .../Oracle/ExceptionTypesTest.cs | 36 +- .../Oracle/ExtractorTest.cs | 118 +- .../Oracle/SavepointsTest.cs | 36 +- .../Oracle/TypeMappingTest.cs | 70 +- Orm/Xtensive.Orm.Tests.Sql/Oracle/UberTest.cs | 348 +- .../PostgreSql/CatalogComparer.cs | 600 +- .../PostgreSql/DateTimeIntervalTest.cs | 36 +- .../PostgreSql/ExceptionTypesTest.cs | 36 +- .../PostgreSql/ExtractorTest.cs | 190 +- .../PostgreSql/IndexTest.cs | 112 +- .../PostgreSql/NpgsqlTypeConstructorTest.cs | 212 +- .../PostgreSql/SavepointsTest.cs | 36 +- .../PostgreSql/SqlDomTests.cs | 4328 +- .../PostgreSql/TypeMappingTest.cs | 36 +- Orm/Xtensive.Orm.Tests.Sql/ReplaceTests.cs | 872 +- Orm/Xtensive.Orm.Tests.Sql/SavepointsTest.cs | 180 +- .../SqlServer/AdventureWorks.cs | 1556 +- .../SqlServer/CompilerTest.cs | 32 +- .../SqlServer/CompilerTests.cs | 394 +- .../SqlServer/ConnectionTest.cs | 90 +- .../SqlServer/DateTimeIntervalTest.cs | 46 +- .../SqlServer/DateTimeOffsetTest.cs | 40 +- .../SqlServer/ErrorMessageParserTest.cs | 240 +- .../SqlServer/ExceptionTypesTest.cs | 36 +- .../SqlServer/ExtractorTest.cs | 1040 +- .../SqlServer/IndexTest.cs | 142 +- .../SqlServer/MSSQLExtractorTests.cs | 1394 +- .../SqlServer/MSSQLTests.cs | 8352 +- .../SqlServer/MiscTests.cs | 796 +- .../SqlServer/SavepointsTest.cs | 36 +- .../SqlServer/TypeMappingTest.cs | 36 +- .../SqlServerCe/DateTimeIntervalTest.cs | 46 +- .../SqlServerCe/ExceptionTypesTest.cs | 62 +- .../SqlServerCe/ExtractorTest.cs | 106 +- .../SqlServerCe/TypeMappingTest.cs | 36 +- Orm/Xtensive.Orm.Tests.Sql/SqlTest.cs | 340 +- Orm/Xtensive.Orm.Tests.Sql/Sqlite/Chinook.cs | 276 +- .../Sqlite/ChinookSchemaCreator.cs | 744 +- .../Sqlite/ChinookTest.cs | 1918 +- .../Sqlite/DateTimeIntervalTest.cs | 38 +- .../Sqlite/DateTimeOffsetTest.cs | 48 +- .../Sqlite/ExtractorTest.cs | 100 +- .../Sqlite/MiscTests.cs | 736 +- .../Sqlite/TypeMappingTests.cs | 48 +- .../TestConnectionInfoProvider.cs | 86 +- Orm/Xtensive.Orm.Tests.Sql/TypeMappingTest.cs | 546 +- .../Xtensive.Orm.Tests.Sql.csproj | 90 +- Orm/Xtensive.Orm.Tests.VB/App.config | 54 +- .../Linq/ConversionTest.vb | 514 +- .../Linq/DateTimeTest.vb | 326 +- .../Linq/OperatorsTest.vb | 126 +- Orm/Xtensive.Orm.Tests.VB/Linq/StringTest.vb | 346 +- Orm/Xtensive.Orm.Tests.VB/Model/Model.vb | 86 +- .../Model/PersistenceTest.vb | 68 +- .../Model/PersistentPropertyWeavingTest.vb | 584 +- .../My Project/Application.Designer.vb | 26 +- .../My Project/Application.myapp | 20 +- .../My Project/AssemblyInfo.vb | 70 +- .../My Project/Resources.Designer.vb | 126 +- .../My Project/Resources.resx | 232 +- .../My Project/Settings.Designer.vb | 146 +- .../My Project/Settings.settings | 14 +- .../Xtensive.Orm.Tests.VB.vbproj | 280 +- Orm/Xtensive.Orm.Tests/App.config | 570 +- Orm/Xtensive.Orm.Tests/Chinook.xml | 206738 +++++++-------- .../Configuration/AppConfigTest.cs | 804 +- .../Configuration/SchemaTest.cs | 236 +- .../SessionInitializationTest.cs | 112 +- .../Configuration/TypeRegistryTest.cs | 266 +- .../DomainConfigurationFactoryTest.cs | 84 +- .../Indexing/ForeignKeyInfoTest.cs | 130 +- .../Indexing/PrimaryIndexInfoTest.cs | 296 +- .../Indexing/SecondaryIndexInfoTest.cs | 194 +- .../Indexing/StorageActionTest.cs | 114 +- .../Indexing/StorageInfoTest.cs | 204 +- .../Interfaces/DoubleIndexedInterfaceTest.cs | 142 +- .../Interfaces/InterfaceImplementationTest.cs | 312 +- .../Interfaces/InterfaceTest.cs | 330 +- .../Interfaces/KeyStructureConflictTest.cs | 136 +- .../Interfaces/TypeIdModeConflictTest.cs | 114 +- .../Interfaces/UnusedTypeRemovalTest.cs | 160 +- .../Issues/BatchingCommandProcessorFrenzy.cs | 98 +- .../Issues/ClientProfileEntitySetTest.cs | 272 +- .../Issues/CustomCompilerException.cs | 276 +- .../Issues/CustomCompilerFeatureTest.cs | 672 +- .../Issues/InterfaceEntitySetTest.cs | 136 +- ...sue0001_MultipleHierarchyRootAttributes.cs | 98 +- .../Issue0002_PrimaryKeyWithLazyLoad.cs | 86 +- .../Issues/Issue0003_NullablePrimaryKey.cs | 88 +- ...e0004_PairAttributeMisusageIsNotHandled.cs | 134 +- .../Issue0005_EntitySetItemEnhancement.cs | 60 +- .../Issue0007_InvalidNotNullConstraint.cs | 138 +- ...e0009_2SymmetricTablesForMNRelationship.cs | 134 +- .../Issue0011_MultipleFieldPersistence.cs | 90 +- .../Issues/Issue0012_TakeSkipSequence.cs | 150 +- .../Issue0013_SqlBuilderRequestTaskBug.cs | 148 +- ...0014_SymmetricRelationshipIsUnsupported.cs | 240 +- .../Issues/Issue0016_FieldOfInterfaceType.cs | 152 +- .../Issue0017_ReferentialActionCascade.cs | 142 +- .../Issues/Issue0021_InvalidSqlQuery.cs | 186 +- .../Issue0028_1_1SymmetricAssociationBug.cs | 196 +- ...e0036_AutomaticGenericTypesRegistration.cs | 186 +- .../Issue0082_ReferentialManagerProblem.cs | 148 +- .../Issue0096_NumerousSchemaExtraction.cs | 160 +- .../Issues/Issue0167_SingleTableProblem.cs | 106 +- .../Issues/Issue0188_ModelBuilderError.cs | 110 +- .../Issues/Issue0245_StructureWhere.cs | 166 +- .../Issues/Issue0262_StructureAssignment.cs | 232 +- .../Issues/Issue0271_EntityNotInserted.cs | 152 +- .../Issues/Issue0276_DuplicateIndex.cs | 136 +- .../Issues/Issue0282_EntitySetContains.cs | 128 +- .../Issues/Issue0296_DeferredConstraints.cs | 138 +- ...Issue0298_InheritedAssociationIsIgnored.cs | 206 +- .../Issues/Issue0307_EntitySetOfType.cs | 246 +- .../Issues/Issue0331_ForgetHierarchyRoot.cs | 118 +- .../Issues/Issue0351_NameBuilderProblem.cs | 114 +- ...0359_UpgradeUsingAutoshortenTransaction.cs | 90 +- ...Issue0370_EntitiSetIsNotHandledProperly.cs | 142 +- .../Issues/Issue0371_ObjectEquals.cs | 258 +- .../Issue0372_SelfReferenceWithInheritance.cs | 204 +- .../Issues/Issue0376_RemoveFieldHint.cs | 428 +- .../Issues/Issue0391_OnRemoveActionNone.cs | 136 +- ...sue0394_UndefinedSqlTypeExtractionError.cs | 140 +- .../Issues/Issue0402_WrongEntitySetQuery.cs | 228 +- .../Issue0408_EntitySetNullReference.cs | 106 +- .../Container.cs | 60 +- .../CreateObjects.cs | 98 +- .../Document.History.cs | 40 +- .../Document.cs | 334 +- .../DocumentLink.cs | 76 +- .../EchoProcessor.cs | 38 +- .../ErrorDocument.cs | 56 +- .../HistoryEntry.cs | 54 +- .../HistoryEntryVisibility.cs | 42 +- .../Processor.cs | 230 +- .../QueueProcessor.cs | 446 +- .../Issue0409_ConstructorTransactional.cs | 120 +- ..._GetStructureFieldsForComplexStructures.cs | 242 +- .../Issues/Issue0424_SqlCommandIsNull.cs | 140 +- .../Issues/Issue0435_BatchingFail.cs | 152 +- .../Issue0452_OrderByIncorrectColumn.cs | 480 +- .../Issues/Issue0457_EntityStateToString.cs | 98 +- .../Issues/Issue0485_EntitySetDescendant.cs | 186 +- .../Issues/Issue0490_GroupByWithTypeId.cs | 68 +- .../Issues/Issue0493_BadImageFormatTest.cs | 136 +- ...NullableGetValueOrDefaultIsNotSupported.cs | 74 +- .../Issues/Issue0559_EntitySetQueryError.cs | 174 +- .../Issue0585_TakeSkipJoinMappingError.cs | 404 +- .../Issues/Issue0587_ByteArrayEquals.cs | 162 +- .../Issues/Issue0593_OverrideDefaultSchema.cs | 122 +- .../Issue0597_OpenGenericsInDomainModel.cs | 310 +- .../Issue0624_EntitySetSubqueryError.cs | 214 +- .../Issue0626_SequenceContainsNoElements.cs | 176 +- .../Issue0628_ExecuteFutureScalarError.cs | 122 +- .../Issues/Issue0630_NullReferenceOnSelect.cs | 178 +- .../Issues/Issue0634_PairToMisuse.cs | 338 +- .../Issues/Issue0641_GroupBySumError.cs | 198 +- .../Issues/Issue0643_EntitySetAddInCtor.cs | 154 +- .../Issues/Issue0647_WrongLinqQuery.cs | 516 +- .../Issue0648_MultiThreadNullReference.cs | 144 +- .../Issue0676_NonNullableReferenceBug.cs | 384 +- .../Issues/Issue0682_FieldInfoIsNullable.cs | 92 +- ...WeirdExceptionWhenMissingConnectionInfo.cs | 68 +- .../Issues/Issue0690_RemoveAndCreate.cs | 298 +- .../Issues/Issue0696_EntitySetItemAddBug.cs | 472 +- ...e0713_InconsistentDefaultDateTimeValues.cs | 160 +- .../Issues/Issue0715_NestedTypeBug.cs | 150 +- .../Issues/Issue0717_VersionCheckBug.cs | 188 +- .../Issues/Issue0733_UseINNER_JOIN.cs | 158 +- .../Issues/Issue0737_PersistentFieldState.cs | 142 +- .../Issues/Issue0751_EntitySetEquals.cs | 498 +- .../Issue0754_CopyFieldHint_MoveFieldHint.cs | 122 +- .../ModelVersion1.cs | 58 +- .../ModelVersion2.cs | 60 +- .../Upgrader.cs | 46 +- .../Issues/Issue0764_LinqTranslationError.cs | 154 +- .../Issues/Issue0765_LinqTranslationError.cs | 178 +- .../Issues/Issue0766_LinqTranslationError.cs | 112 +- .../Issue0767_QueryByInterfaceException.cs | 198 +- .../Issues/Issue0768_WrongJoinBehavior.cs | 276 +- .../Issue0771_AbstractTypeRegistration.cs | 182 +- .../Issue0773_UnableTranslateUnionQuery.cs | 174 +- ...ue0775_WrongLinqQueryOverComputedFields.cs | 354 +- ...76_OrderingCorrectorOfAggregateProvider.cs | 258 +- .../Issue0777_WrongLinqQueryConditional.cs | 126 +- .../Issues/Issue0785_GenericStructureBugs.cs | 164 +- .../Issues/Issue0788_EntityIsDetached.cs | 258 +- .../Issues/Issue0792_OrderByWithDistinct.cs | 94 +- .../Issues/Issue0800_OrderByEnum.cs | 112 +- .../Issues/Issue0806_ColumnNamingError.cs | 362 +- .../Issues/Issue0808_StructSerialization.cs | 136 +- .../Issue0813_AuxilaryTableMappingNameBug.cs | 148 +- .../Issue0817_LocalCollectionWithEnum.cs | 170 +- .../Issues/Issue0818_NanosecondTrancation.cs | 118 +- .../Issues/Issue0820_GroupByWithDatePart.cs | 224 +- .../Issue0821_StructureNulComparisonInLinq.cs | 120 +- .../Issues/Issue0825_StrangeLinqBehavior.cs | 342 +- .../Issues/Issue0826_OperandTypeClash.cs | 156 +- .../Issue0827_LinqDtoMaterialization.cs | 394 +- .../Issue0828_LinqMaterializeException.cs | 188 +- .../Issues/Issue0835_QueryNestedTooDeep.cs | 1284 +- .../Issues/Issue0839_MultithreadingBug.cs | 280 +- .../Issues/Issue0844_GroupByConstant.cs | 88 +- .../Issues/Issue0845_KeyTypeAccessBug.cs | 110 +- .../Issues/Issue0847_IsOperator.cs | 156 +- .../Issues/Issue0851_AnyMappingError.cs | 174 +- .../Issues/Issue0860_DateTimeDate.cs | 114 +- .../Issue679,681_EntitySetRelatedBugs.cs | 210 +- .../Issues/IssueA363_WrongInnerJoin.cs | 170 +- ...ropertyForPrivatePropertiesOfInheritors.cs | 138 +- .../IssueA401_AmbiguousMatchFoundException.cs | 128 +- .../Issues/IssueA408_TargetException.cs | 196 +- .../Issues/IssueA413_KeyNotFoundException.cs | 298 +- ...leToCompileModelWithPersistentInterface.cs | 136 +- .../IssueA424_QueryByInterfaceException.cs | 166 +- ...IssueJIRA0003_OrderByStructureFieldLost.cs | 144 +- ...20_CustomLINQCompilerContainerInterface.cs | 228 +- .../IssueJIRA0028_StructureOnSetError.cs | 148 +- ...036_AutoTransactionsOpenModeDoesNotWork.cs | 182 +- .../Issues/IssueJIRA0085.cs | 302 +- .../IssueJira0042_IndexAttributeIsOmitted.cs | 102 +- ...sueJira0071_DistinctDoesNotWorkProperly.cs | 152 +- .../IssueJira0083_DtoMaterialization.cs | 150 +- ...ueJira0102_NoForeignKeyOnInterfaceField.cs | 134 +- .../IssueJira0116_InterfacesCastAndIndexes.cs | 132 +- .../Generated.cs | 200 +- .../ICountry.cs | 14 +- .../IEmployee.cs | 26 +- .../IParty.cs | 102 +- .../IPerson.cs | 26 +- .../IRecord.cs | 76 +- .../Record.cs | 166 +- .../Issues/IssueJira0117_FKStructureTest.cs | 272 +- .../IssueJira0149_LinqTranslationError.cs | 210 +- .../IssueJira0165_CaseSensitiveFieldNames.cs | 104 +- ...eJira0168_RemoveQueryableExtensionFails.cs | 102 +- .../Issues/IssueJira0171_DateTimeOffset.cs | 796 +- ...ssueJira0179_NullableBooleanFieldsQuery.cs | 300 +- .../ModelVersion1.cs | 90 +- .../ModelVersion2.cs | 86 +- .../UpgradeTest.cs | 182 +- .../Upgrader.cs | 218 +- .../Issues/IssueJira0187_TypeCastInContain.cs | 200 +- ...ira0188_MissingFKsForComplexHierarchies.cs | 284 +- ..._WrongResultWhenInClauseArgumentIsEmpty.cs | 232 +- ...eJira0195_DeleteAndCreateWithValidation.cs | 170 +- .../IssueJira0196_GuidAsTypeDiscriminator.cs | 130 +- .../IssueJira0197_ExtendedErrorInformation.cs | 220 +- .../IssueJira0202_OnRemoveActionOverriding.cs | 146 +- .../ModelVersion1.cs | 124 +- .../ModelVersion2.cs | 76 +- .../UpgradeTest.cs | 142 +- .../Upgrader.cs | 220 +- .../Issues/IssueJira0213_GroupByNewDate.cs | 326 +- ...AccessorDoesNotBindCommandToTransaction.cs | 106 +- ...ssueJira0221_UnableToTranslateAggregate.cs | 498 +- .../IssueJira0222_GroupByBooleanColumn.cs | 122 +- .../IssueJira0232_SupportForEnumHasFlag.cs | 468 +- .../Issues/IssueJira0238_GroupByGeneric.cs | 190 +- ...ssueJira0240_SortingInSubqueryIsOmitted.cs | 198 +- ...eJira0242_LegacyExecuteMethodsDoNotWork.cs | 230 +- .../IssueJira0243_PrefetchSyntaxSugar.cs | 322 +- ...QuerySingleInsideDelayedCompiledQueries.cs | 130 +- .../IssueJira0275_FilterComputedColumn.cs | 206 +- ...eJira0314_IncorrectTransactionDisposing.cs | 202 +- ...Jira0330_MaterializationOfNullReference.cs | 112 +- .../IssueJira0339_PrefetchViaStructure.cs | 172 +- ...hangesWithoutInboundOnlyAndOutboundOnly.cs | 510 +- .../IssueJira0357_IndexWithInheritedFields.cs | 410 +- .../IssueJira0385_OracleExtractorFailure.cs | 126 +- .../Issues/IssueJira0416_NpgsqlBox.cs | 454 +- .../Issues/IssueJira0416_NpgsqlCircle.cs | 262 +- .../Issues/IssueJira0416_NpgsqlLSeg.cs | 346 +- .../Issues/IssueJira0416_NpgsqlPath.cs | 228 +- .../Issues/IssueJira0416_NpgsqlPoint.cs | 262 +- .../Issues/IssueJira0416_NpgsqlPolygon.cs | 286 +- .../Issues/IssueJira0421_DateTimeAddXxx.cs | 238 +- ...sueJira0424_DateTimeOperationInvalidSql.cs | 148 +- .../IssueJira0425_DateTimeOperationError.cs | 110 +- ...0427_IndexOutOfRangeOnContainsOperation.cs | 100 +- ...Jira0430_PartialIndexOnBoolOrEnumFields.cs | 188 +- .../IssueJira0431_IGroupingKeyIsNotUsable.cs | 488 +- .../IssueJira0432_EnumTypeDiscriminator.cs | 114 +- ...ssueJira0433_CompiledQueryOverEntitySet.cs | 262 +- .../IssueJira0437_OperationsWithListOfInt.cs | 206 +- ...tomCompilerLoosesImplicitCastToNullable.cs | 130 +- ...Jira0441_EntitySetQueryFailsToTranslate.cs | 196 +- ...ueJira0442_AsQueryableExpressionInQuery.cs | 174 +- ...irstOrDefaultInSubqueryUsesWrongDefault.cs | 200 +- ...IssueJira0445_QueryForEntityWithEnumKey.cs | 160 +- .../IssueJira0446_TypeAsOnSubqueryOperand.cs | 122 +- ...ira0449_RenameTableInNonDefaultDatabase.cs | 226 +- .../IssueJira0449_TimeSpanMinMaxValue.cs | 104 +- ...ueJira0450_SingleOrDefaultInvalidResult.cs | 126 +- ...sueJira0451_ConnectionInitializationSql.cs | 150 +- ...eJira0459_SelfReferencingEntitiesRemove.cs | 136 +- .../IssueJira0471_LikeOperatorSupport.cs | 260 +- ...sueJira0481_EntitySetCachesInvalidState.cs | 124 +- ...timizeMultipleAggregatesWithProjections.cs | 376 +- .../IssueJira0516_PartialIndexConstruction.cs | 128 +- .../IssueJira0519_StaleKeyInEntitySet.cs | 432 +- .../IssueJira0528_LongEnumBitOperations.cs | 214 +- .../IssueJira0529_MultipleInOperations.cs | 610 +- ...a0531_IncorrectNameOfRecycledNestedType.cs | 178 +- ...ueJira0537_DropDefaultConstraintBugTest.cs | 868 +- ...eJira0538_IncorrectSortedActionSequence.cs | 282 +- ...aviorOnDomainUpgradeWithRecycledTypeBug.cs | 220 +- ...a0541_IncorrectMappingNameInSingleTable.cs | 118 +- .../IssueJira0542_OfTypeTranslationBug.cs | 174 +- ...IssueJira0546_IncorrectCachingOfQueries.cs | 730 +- ...iationOwnerFieldIsEntityAndIsPrimaryKey.cs | 110 +- ...rrectJoinSequenceTranslationInMySqlTest.cs | 288 +- .../IssueJira0551_IncorrectTypeIdFieldBug.cs | 114 +- ...3_IncorrectLeftJoinOnNotNullEntityField.cs | 474 +- .../Issues/IssueJira0555_KeyRemapBug.cs | 318 +- ...thmeticExceptionWhenSubstractionOfDates.cs | 168 +- ...rentialTupleDifferenceWhenPersistFailed.cs | 434 +- ...ExecutionOfDelayedQueriesWithoutPersist.cs | 322 +- ...Jira0563_IncorrectPersistActionSequence.cs | 6136 +- ...IssueJira0566_IndexOnRemovableEntityBug.cs | 530 +- ..._InOperationDoesNotCreateTemporaryTable.cs | 1184 +- ...IssueJira0571_MySqlKeyGenerationProblem.cs | 356 +- ...a0573_IncorrectMappingOfStructureFields.cs | 256 +- ...gesRegistryIsNotEmptyAfterPersistFailed.cs | 294 +- ...582_OverrideInterfaceDefinedAssociation.cs | 732 +- ...ira0584_IncorrectMappingOfColumnInQuery.cs | 2722 +- ...ssueJira0586_AnonymousTypeComparisonBug.cs | 272 +- .../Issues/IssueJira0587_KeyComparisonBug.cs | 294 +- ...ueJira0593_AggregateForSingleColumnTest.cs | 1454 +- ...tOperationsWithDuplicateFieldsUsageFail.cs | 256 +- ...ueJira0607_ColumnUselessRecreationsTest.cs | 1822 +- ...IssueJira0609_RewritingQueriesInClosure.cs | 272 +- ...ueJira0612_NonPairedReferencesSearchBug.cs | 152 +- ...ssueJira0613_DataCleanUpInPerformSafely.cs | 980 +- ...eMappingCachingInMaterializationContext.cs | 986 +- ...Jira0616_ExistanceProviderProcessingBug.cs | 230 +- ...a0617_IncorrectRemoveOfRedundantColumns.cs | 3412 +- ...ssueJira0619_InvalidExpressionInOrderBy.cs | 346 +- .../IssueJira0627_FieldInitializationTest.cs | 450 +- ...ra0627_PocoClassPropertyRenitialization.cs | 4526 +- ...ectColumnOrderOfPKIndexOfInterfaceTypes.cs | 2556 +- .../Issues/IssueJira0636_SessionCacheTest.cs | 2200 +- ...a0637_EntitySetFullOfNullsOnEnumeration.cs | 338 +- ...641_IndexFilterExpressionTranslationBug.cs | 186 +- ...a0643_OracleDateTimeOffsetExtractionBug.cs | 166 +- ...0647_StoredDomainModelMappingsUpdateBug.cs | 1184 +- ...Jira0656_RemapRestoresRemovedReferences.cs | 494 +- ...umExpressionsAndConstantsTranslationBug.cs | 2100 +- .../IssueJira0674_ReferenceFinderBug.cs | 250 +- ...ira0675_EntityChangeRegistryDoesntClear.cs | 566 +- ...ra0702_QueryingWithoutOpenedTransaction.cs | 132 +- ...08_StackOverflowOnDifferetialTupleMerge.cs | 132 +- ...ira0710_IndirectStructureChildFKAbsence.cs | 190 +- ...12_IncorrectDefaultEnumValueTranslation.cs | 388 +- .../IssueJira0718_EntitySetEnumerationBug.cs | 2326 +- ...ra0723_ContainsOverLocalCollectionError.cs | 106 +- ...ssueJira0728_NullGroupHasNoElementsTest.cs | 1272 +- ...ssueJira0735_WrongTypeIdsInValidateMode.cs | 150 +- .../IssueJira0778_PrefetchStackOverflow.cs | 2032 +- ...SetOperationsWithOrderAndTakeWrongQuery.cs | 260 +- ...izationCouseSqlDecimalInternalException.cs | 186 +- .../ModelVersion1.cs | 112 +- .../ModelVersion2.cs | 120 +- .../ModelVersion3.cs | 120 +- .../UpgradeTest.cs | 218 +- .../Issue_0694_SchemaUpgradeBug/Upgrader.cs | 210 +- .../ModelVersion1.cs | 42 +- .../ModelVersion2.cs | 52 +- .../UpgradeTest.cs | 154 +- .../Upgrader.cs | 216 +- .../ModelVersion1.cs | 58 +- .../ModelVersion2.cs | 120 +- .../UpgradeTest.cs | 234 +- .../Upgrader.cs | 230 +- .../ModelVersion1.cs | 46 +- .../ModelVersion2.cs | 56 +- .../UpgradeTest.cs | 178 +- .../Upgrader.cs | 230 +- .../ModelVersion1.cs | 50 +- .../ModelVersion2.cs | 68 +- .../UpgradeTest.cs | 140 +- .../Issue_0837_HintGeneratorBug/Upgrader.cs | 214 +- .../ModelVersion1.cs | 44 +- .../ModelVersion2.cs | 58 +- .../UpgradeTest.cs | 130 +- .../Issue_0841_HintGeneratorBug/Upgrader.cs | 218 +- .../ModelVersion1.cs | 44 +- .../ModelVersion2.cs | 66 +- .../UpgradeTest.cs | 148 +- .../Issue_0841_HintGeneratorBug2/Upgrader.cs | 268 +- .../ModelVersion1.cs | 44 +- .../ModelVersion2.cs | 66 +- .../UpgradeTest.cs | 146 +- .../Issue_0841_HintGeneratorBug3/Upgrader.cs | 300 +- .../ModelVersion1.cs | 44 +- .../ModelVersion2.cs | 66 +- .../UpgradeTest.cs | 134 +- .../Issue_0841_HintGeneratorBug4/Upgrader.cs | 218 +- .../Issues/Issue_OfTypeMissesImplementors.cs | 206 +- Orm/Xtensive.Orm.Tests/Issues/KeyFormatBug.cs | 204 +- .../Issues/LocalCollectionsTest.cs | 120 +- .../Issues/NotEqualsForNullableColumnTest.cs | 158 +- .../Issues/StrangeLockingExceptionTest.cs | 296 +- .../Issues/StructureFieldRemoveTest.cs | 380 +- Orm/Xtensive.Orm.Tests/Linq/AggregateTest.cs | 652 +- Orm/Xtensive.Orm.Tests/Linq/ArrayTest.cs | 362 +- .../Linq/CompiledQueriesWithClosureTest.cs | 160 +- Orm/Xtensive.Orm.Tests/Linq/ComplexTest.cs | 452 +- .../Linq/ConditionalTest.cs | 174 +- .../Linq/ContainsAnyAllTest.cs | 920 +- .../Linq/ContainsOverKeysCollectionTest.cs | 866 +- .../Linq/ContainsTableTest.cs | 246 +- .../Linq/ConvariantQueriesTest.cs | 202 +- .../Linq/CustomExpressionCompilers.cs | 408 +- .../Linq/DataContextTest.cs | 170 +- .../DateTimeAndDateTimeOffset/BaseTest.cs | 146 +- .../DateTime/ComparisonTest.cs | 114 +- .../DateTime/DateTimeToIsoTest.cs | 46 +- .../DateTime/DistinctTest.cs | 94 +- .../DateTime/GroupByTest.cs | 84 +- .../DateTime/JoinTest.cs | 144 +- .../DateTime/MinMaxTest.cs | 86 +- .../DateTime/OperationsTest.cs | 382 +- .../DateTime/OrderByTest.cs | 162 +- .../DateTime/PartsExtractionTest.cs | 326 +- .../DateTime/WhereTest.cs | 124 +- .../DateTimeBaseTest.cs | 182 +- .../DateTimeOffset/ComparisonTest.cs | 332 +- .../DateTimeOffsetConstructorTest.cs | 1046 +- .../DateTimeOffset/DistinctTest.cs | 92 +- .../DateTimeOffset/GroupByTest.cs | 98 +- .../DateTimeOffset/JoinTest.cs | 156 +- .../DateTimeOffset/MinMaxTest.cs | 100 +- .../DateTimeOffset/OperationsTest.cs | 402 +- .../DateTimeOffset/OrderByTest.cs | 164 +- .../DateTimeOffset/PartsExtractionTest.cs | 590 +- .../DateTimeOffset/WhereTest.cs | 402 +- .../DateTimeOffsetBaseTest.cs | 310 +- .../JoinResult{T}.cs | 52 +- .../Linq/DateTimeAndDateTimeOffset/Model.cs | 294 +- Orm/Xtensive.Orm.Tests/Linq/DistinctTest.cs | 778 +- .../Linq/DoubleAggregateToStructTest.cs | 170 +- .../Linq/DynamicallyDefinedFields.cs | 2772 +- Orm/Xtensive.Orm.Tests/Linq/EntitySetTest.cs | 258 +- Orm/Xtensive.Orm.Tests/Linq/ExecuteTest.cs | 116 +- .../Linq/FirstSingleTest.cs | 576 +- Orm/Xtensive.Orm.Tests/Linq/FreeTextTest.cs | 1006 +- .../Linq/FullTextColumnsDeclarationTest.cs | 230 +- Orm/Xtensive.Orm.Tests/Linq/GroupByTest.cs | 2098 +- .../GroupByTwoEntitiesWithSameColumnsTest.cs | 146 +- .../Linq/InOverSubtypeColumnTest.cs | 272 +- Orm/Xtensive.Orm.Tests/Linq/InTest.cs | 650 +- .../Linq/IndexedMethodsTest.cs | 190 +- .../Linq/Interfaces/AlphabetTest.cs | 464 +- .../Linq/Interfaces/SimpleTest.cs | 174 +- .../Linq/Interfaces/SlaveryTest.cs | 74 +- Orm/Xtensive.Orm.Tests/Linq/JoinTest.cs | 784 +- Orm/Xtensive.Orm.Tests/Linq/KeysUnionTest.cs | 156 +- .../Linq/LocalCollectionsComplexTest.cs | 676 +- .../Linq/LocalCollectionsTest.cs | 1854 +- Orm/Xtensive.Orm.Tests/Linq/LockTest.cs | 520 +- .../MemberCompilerProviderTest.Classes.cs | 820 +- .../Linq/MemberCompilerProviderTest.cs | 414 +- Orm/Xtensive.Orm.Tests/Linq/MiscTest.cs | 252 +- .../Linq/MsSamples/LinqToEntitiesSamples.cs | 2528 +- .../Linq/MsSamples/LinqToSqlSamples.cs | 3420 +- .../Linq/NestedCollectionsTest.cs | 712 +- .../Linq/NullableEnumMaterializationTest.cs | 264 +- Orm/Xtensive.Orm.Tests/Linq/OrderByTest.cs | 636 +- .../Linq/PocoProjectionWithSubqueryTest.cs | 220 +- .../Linq/ProjectToDtoWithInheritanceTest.cs | 152 +- Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs | 1154 +- .../Linq/QueryMethodTests.cs | 302 +- .../Linq/QueryPreprocessorSortingTest.cs | 308 +- .../Linq/QueryRootOverriding.cs | 338 +- Orm/Xtensive.Orm.Tests/Linq/RefTest.cs | 184 +- .../Linq/SearchConditionNodeVisitorTest.cs | 3238 +- Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs | 526 +- Orm/Xtensive.Orm.Tests/Linq/SelectManyTest.cs | 1018 +- Orm/Xtensive.Orm.Tests/Linq/SelectTest.cs | 1996 +- .../SelectWithAccessToLocalCollectionTest.cs | 214 +- .../Linq/SetOperationsTest.cs | 504 +- .../Linq/SkipTakeElementAtTest.cs | 580 +- .../Linq/SortExpressionExtractorTest.cs | 232 +- ...bqueryAndComputedColumnOptimizationTest.cs | 202 +- .../Linq/SubqueryWithCalculatedFieldTest.cs | 234 +- .../Linq/TypeAsOptimizationTest.cs | 150 +- .../Linq/TypeCastAndInheritanceTest.cs | 986 +- Orm/Xtensive.Orm.Tests/Linq/WhereTest.cs | 2676 +- .../Model/AssociationTest.cs | 1610 +- .../Model/AssociationsOverrideTest.cs | 196 +- .../Model/AutoGenericsOverrideTest.cs | 118 +- .../Model/CycleReferenceTest.cs | 124 +- .../Model/CyclicContainedStructureTest.cs | 158 +- .../Model/CyclicHierarchyDependenciesTest.cs | 144 +- ...uplicatedIndexDueToGenericInterfaceTest.cs | 156 +- .../Model/FieldConverterTest.cs | 338 +- .../DynamicallyDefinedFieldsAndIndexesTest.cs | 428 +- .../IndexOnStructureFieldNamingTest.cs | 396 +- .../FullText/IndexOnStructureFieldTest.cs | 352 +- .../Model/GenericManyToManyTest.cs | 126 +- Orm/Xtensive.Orm.Tests/Model/HierarchyTest.cs | 382 +- .../Model/IndexedStructureFieldTest.cs | 136 +- .../Model/InheritanceSchemaTest.cs | 438 +- .../Model/InheritedKeyFieldTest.cs | 144 +- .../InterfaceAssociationsModelGenerator.cs | 5710 +- .../InterfaceAssociationsModelGenerator.tt | 332 +- Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs | 1478 +- .../Model/MultidatabaseKeysTest.cs | 400 +- .../Model/NonPublicFieldTest.cs | 166 +- ...emoveActionForNonPairedAssociationsTest.cs | 164 +- Orm/Xtensive.Orm.Tests/Model/PairTest.cs | 144 +- .../Model/PersistentPropertyWeavingTest.cs | 604 +- .../Model/ReferencedKeys.cs | 130 +- .../Model/RemoveDotsAndHypensTest.cs | 138 +- .../Model/SelfContainedStructureTest.cs | 88 +- .../Model/SerializationTest.cs | 68 +- Orm/Xtensive.Orm.Tests/Model/StringKeyTest.cs | 88 +- .../StructureWithCustomConstructorTest.cs | 134 +- .../Model/UselessTypeInTheMiddleTest.cs | 152 +- .../Model/VersionInfoTest.cs | 456 +- Orm/Xtensive.Orm.Tests/ObjectModel/Chinook.cs | 640 +- .../ObjectModel/ChinookDO.cs | 620 +- .../ObjectModel/ChinookDOModelTest.cs | 214 +- .../ObjectModel/Cms/AscxTemplate.cs | 64 +- .../ObjectModel/Cms/ContentDirectory.cs | 206 +- .../Cms/ContentDirectoryCollection.cs | 64 +- .../ObjectModel/Cms/ContentFile.cs | 52 +- .../ObjectModel/Cms/ContentItem.cs | 120 +- .../ObjectModel/Cms/ContentItemCollection.cs | 68 +- .../ObjectModel/Cms/ContentReference.cs | 88 +- .../ObjectModel/Cms/ContentReferenceDto.cs | 28 +- .../ObjectModel/Cms/ContentReferenceType.cs | 26 +- .../ObjectModel/Cms/HtmlContentItem.cs | 62 +- .../ObjectModel/Cms/IContentStorageFile.cs | 32 +- .../ObjectModel/Cms/Menu.cs | 40 +- .../ObjectModel/Cms/NewsDirectory.cs | 30 +- .../ObjectModel/Cms/NewsList.cs | 42 +- .../ObjectModel/Cms/NewsPage.cs | 34 +- .../ObjectModel/Cms/Page.cs | 58 +- .../ObjectModel/Cms/PageTemplate.cs | 30 +- .../ObjectModel/Cms/WebSite.cs | 58 +- .../ObjectModel/Cms/WebSiteUrl.cs | 90 +- .../ObjectModel/GenericModel.cs | 62 +- .../ObjectModel/GraphModel.cs | 112 +- .../ObjectModel/Interfaces/Alphabet.cd | 368 +- .../ObjectModel/Interfaces/Alphabet.cs | 466 +- .../ObjectModel/Interfaces/Slavery.cd | 94 +- .../ObjectModel/Interfaces/Slavery.cs | 122 +- Orm/Xtensive.Orm.Tests/Rse/HeaderParseTest.cs | 220 +- .../Rse/IncludeProviderTest.cs | 68 +- .../Storage/AbstractGenericsTest.cs | 200 +- .../Storage/ActivatorTest.cs | 230 +- .../Storage/AggregateTest.cs | 284 +- .../Storage/AnotherValidationTest.cs | 6060 +- Orm/Xtensive.Orm.Tests/Storage/ApplyTest.cs | 226 +- .../AsyncQueries/AsAsyncTaskExtensionTest.cs | 378 +- .../AsyncQueries/AsyncQueryBaseTest.cs | 318 +- .../Compiled/ClientProfileTest.cs | 384 +- .../Compiled/ServerProfileTest.cs | 458 +- .../DelayedQueryClientProfileTest.cs | 36 +- .../DelayedQueryServerProfileTest.cs | 36 +- .../AsyncQueries/DelayedQueryTestBase.cs | 158 +- .../Storage/AsyncQueries/Model.cs | 332 +- .../PersistWithAsyncQueriesTest.cs | 842 +- .../AsyncSession/AsyncSessionOpeningTest.cs | 506 +- .../Storage/BatchingTest.cs | 290 +- ...WhenValidateEntityVersionsIsEnabledTest.cs | 346 +- .../Storage/ByteFieldStorageTest.cs | 124 +- .../Storage/CascadeRemoveTest.cs | 160 +- .../Storage/ChangedPersistOrderTest.cs | 184 +- .../ClientProfileReferentialIntegrityTest.cs | 450 +- .../Storage/ClientProfileSessionTest.cs | 170 +- .../Storage/ClosureParametersCachingTest.cs | 1850 +- .../Storage/ClusteredIndexesTest.cs | 1018 +- Orm/Xtensive.Orm.Tests/Storage/CmsTest.cs | 90 +- .../CommandProcessorContextProviderTest.cs | 106 +- .../Storage/CompiledQueryTest.cs | 152 +- .../ConcurrentCommandProcessorExecution.cs | 642 +- .../Storage/ConnectionStringSupportTest.cs | 54 +- .../Storage/ConstraintsTest.cs | 120 +- .../Storage/CoreServicesTest.cs | 520 +- .../CrossTransactionEntityAccessTest.cs | 90 +- .../Storage/CurrentSessionResolverTest.cs | 124 +- .../Storage/CustomCollationTest.cs | 154 +- .../Storage/CustomEntityConnectionTest.cs | 180 +- .../Storage/CustomEntitySetTest.cs | 168 +- .../Storage/CustomMetadataUpgrade.cs | 94 +- .../Storage/DataErrorInfo.cs | 162 +- .../Storage/DirectSqlTest.cs | 174 +- .../DisableIndexOnReferenceFieldTest.cs | 380 +- .../Storage/DisableSaveChangesTest.cs | 554 +- ...bleValidationAndImplicitConstraintsTest.cs | 94 +- .../Storage/DuplicateIndexTest.cs | 106 +- .../Storage/EncryptedConnectionStringTest.cs | 46 +- .../Storage/EntitySetRollbackTest.cs | 748 +- .../Storage/EntitySetTest.cs | 1014 +- .../Storage/ExcludeFromAutoVersionTest.cs | 122 +- ...ExecuteDelayedForIOrderedQueryableQuery.cs | 160 +- ...ailedQueryAndDbCommandNotificationsTest.cs | 254 +- .../Storage/FieldDefaultValueTest.cs | 730 +- .../Storage/FieldSqlDefaultTest.cs | 286 +- .../Storage/ForceServerVersion.cs | 132 +- .../Storage/ForeignKeyTest.cs | 588 +- Orm/Xtensive.Orm.Tests/Storage/FutureTest.cs | 226 +- .../Storage/GeneralBehaviorTest.cs | 310 +- Orm/Xtensive.Orm.Tests/Storage/GenericTest.cs | 112 +- .../Storage/IgnoreRulesValidateTest.cs | 2100 +- .../IndexesAndInheritanceSchemaTest.cs | 166 +- .../Storage/IntermediateQueryTest.cs | 244 +- .../Storage/IoC/NameBuilderAsServiceTest.cs | 78 +- .../Storage/IoC/NativeTest.cs | 108 +- .../Storage/IoC/ProxyContainerBase.cs | 62 +- .../Storage/IoC/QueryFormatterServiceTest.cs | 122 +- .../Storage/IoC/ServiceTestBase.cs | 190 +- .../Storage/IoC/SimpleNativeTest.cs | 124 +- Orm/Xtensive.Orm.Tests/Storage/KeysTest.cs | 472 +- .../Storage/LazyLoadTest.cs | 192 +- .../Storage/LegacyDb/AnimalDbBaseTest.cs | 738 +- .../Storage/LegacyDb/AnimalDbSkipTest.cs | 34 +- .../Storage/LegacyDb/AnimalDbValidateTest.cs | 34 +- .../Storage/LegacyDb/ContainerItemTest.cs | 380 +- .../Storage/LegacyDb/CrazyColumns2005Test.cs | 148 +- .../Storage/LegacyDb/CrazyColumns2008Test.cs | 166 +- .../Storage/LegacyDb/LegacyDbAutoBuildTest.cs | 138 +- .../Storage/ManyToManyValidationTest.cs | 248 +- .../Storage/MemoryProviderTest.cs | 222 +- .../Storage/Modules/Assembly0.cs | 58 +- .../Storage/Modules/Assembly1.cs | 190 +- .../Storage/Modules/Assembly2.cs | 200 +- .../Modules/ModulesRegistrationTest.cs | 202 +- .../CrossDatabaseTableMoveTest.cs | 122 +- .../Version1/Namespace1/Renamed1.cs | 34 +- .../Version1/Namespace2/Renamed2.cs | 34 +- .../Version1/UpgradeHandler.cs | 40 +- .../Version2/Namespace1/Renamed2.cs | 34 +- .../Version2/Namespace2/Renamed1.cs | 34 +- .../Version2/UpgradeHandler.cs | 64 +- .../Multimapping/CrossSchemaTableMoveTest.cs | 124 +- .../CycleReferencesDetectionTest.cs | 338 +- .../InterfaceAndAssociationMappingTest.cs | 252 +- .../Storage/Multimapping/MultidatabaseTest.cs | 66 +- .../Storage/Multimapping/MultimappingTest.cs | 68 +- .../Storage/Multimapping/MultischemaTest.cs | 74 +- .../Multinode/DatabaseMultinodeTest.cs | 88 +- .../Storage/Multinode/DynamicTypeIdTest.cs | 1052 +- .../Storage/Multinode/MultinodeTest.cs | 114 +- .../Storage/Multinode/SchemaMultinodeTest.cs | 96 +- .../Multinode/StandardMultinodeTest.cs | 338 +- .../Storage/Multinode/TypeIdAllocationTest.cs | 950 +- .../Storage/NestedTransactionsTest.cs | 266 +- .../Storage/NewProfilesTest.cs | 2244 +- .../NonPersistentCompositeObjectTest.cs | 310 +- .../Storage/NonTransactionalEntityAccess.cs | 104 +- .../Storage/NorthwindValidateTest.cs | 62 +- .../Storage/NotifyPropertyChangedTest.cs | 162 +- .../Storage/NotifyXxxTest.cs | 332 +- .../Storage/OnRemovingTest.cs | 182 +- .../Storage/OperationOrderTest.cs | 498 +- .../Storage/OverrideConnectionInfoTest.cs | 62 +- .../Storage/OverrideMetadata.cs | 258 +- .../Storage/PartialIndexTest.cs | 896 +- .../NonPairedSimplestContainerItem.cs | 34 +- .../CrudModel/PairedSimplestContainerItem.cs | 42 +- .../Storage/Performance/CrudModel/Simplest.cs | 64 +- .../CrudModel/SimplestContainer.cs | 50 +- .../Storage/Performance/DoCrudTest.cs | 1060 +- .../SqlClientCrudModel/Simplest.cs | 54 +- .../Storage/Performance/SqlClientCrudTest.cs | 606 +- Orm/Xtensive.Orm.Tests/Storage/PersistTest.cs | 140 +- .../Storage/PostgreSqlSpatialTest.cs | 276 +- .../Storage/Prefetch/Model.cs | 790 +- .../Prefetch/PrefetchDelayedElementsTest.cs | 804 +- .../Prefetch/PrefetchManagerAdvancedTest.cs | 1450 +- .../Prefetch/PrefetchManagerBasicTest.cs | 2064 +- .../Prefetch/PrefetchManagerTestBase.cs | 226 +- .../Storage/Prefetch/PrefetchTest.cs | 1874 +- .../Storage/Prefetch/PrefetchTestHelper.cs | 292 +- .../Prefetch/PrefetchWithSmallCacheTest.cs | 272 +- .../Providers/Sql/BooleanHandlingTest.cs | 1010 +- .../Storage/Providers/Sql/CharSupportTest.cs | 240 +- .../Providers/Sql/CommandTimeoutTest.cs | 114 +- .../Providers/Sql/CustomConnectionInfoTest.cs | 56 +- .../Storage/Providers/Sql/NullValuesTest.cs | 198 +- .../Storage/Providers/Sql/RoundingTest.cs | 402 +- .../Providers/Sql/StringOperationsTest.cs | 486 +- .../Providers/Sql/TableReferenceTest.cs | 420 +- .../Providers/Sql/TotalBatchingTest.cs | 258 +- .../Storage/QueryBuilderTest.cs | 216 +- .../Storage/Randomized/RandomizedTest.cs | 550 +- .../Storage/Randomized/Tree.cs | 88 +- .../Storage/Randomized/TreeNode.cs | 60 +- .../ReadOnlySupport/OracleReadOnlyTest.cs | 36 +- .../ReadOnlySupport/PostgreSqlReadOnlyTest.cs | 38 +- .../ReadOnlyStorageTestBase.cs | 400 +- .../ReadOnlySupport/SqlServerReadOnlyTest.cs | 32 +- .../Storage/ReadRemovedObjectTest.cs | 316 +- Orm/Xtensive.Orm.Tests/Storage/RefTest.cs | 116 +- .../NonPairedReferencesFromEntitiesTest.cs | 964 +- .../NonPairedReferencesFromStructures.cs | 1444 +- .../PairedReferencesFromEntitiesTest.cs | 1536 +- .../NonPairedReferencesFromEntitiesTest.cs | 998 +- .../NonPairedReferencesFromStructures.cs | 1470 +- .../PairedReferencesFromEntitiesTest.cs | 1564 +- .../Storage/ReferentialIntegrityTest.cs | 646 +- ...mapKeysWhenLazyKeyGenerationEnabledTest.cs | 268 +- .../DomainConfigurationExtensions.cs | 84 +- .../SchemaSharing/EntityManipulation/Model.cs | 194 +- .../MultidatabaseEntityManipulationTest.cs | 116 +- .../MultischemaEntityManipulationTest.cs | 108 +- .../SimpleEntityManipulationTest.cs | 1118 +- .../SchemaSharing/KeyGenerator/Model.cs | 294 +- .../KeyGenerator/MultidatabaseTest.cs | 106 +- .../KeyGenerator/MultischemaTest.cs | 100 +- .../SchemaSharing/KeyGenerator/SimpleTest.cs | 178 +- .../Storage/SerializationTest.cs | 672 +- .../Storage/SerializedQueryTest.cs | 84 +- .../Storage/SessionDeactivationTest.cs | 104 +- .../Storage/SessionEventsTest.cs | 504 +- .../Storage/SessionInitializationSqlTest.cs | 128 +- .../SessionSaveChangesPerformanceTest.cs | 168 +- .../Storage/SetFieldTest.cs | 206 +- .../Storage/SingleTableTest.cs | 140 +- .../Storage/SkippingValidationOnCommitTest.cs | 3780 +- .../StructureReferencesAnEntityTest.cs | 116 +- .../Storage/StructureTest.cs | 384 +- .../Storage/TransactionModesTest.cs | 244 +- .../Storage/TransactionScopeIntegration.cs | 202 +- .../Storage/TransactionsTest.cs | 392 +- .../Storage/TransactionsTestBase.cs | 74 +- .../Storage/TypeCompatibilityTest.cs | 730 +- .../TypeDiscriminatorFromInterfaceTest.cs | 208 +- .../Storage/UnexpectedBehaviorTest.cs | 108 +- .../Storage/UpdateVersionTest.cs | 1072 +- .../Storage/UpgradeModesTest.cs | 508 +- .../ValidateEntityVersionsOnPersistTest.cs | 268 +- .../Storage/ValidateOnlyModifiedFieldsTest.cs | 4562 +- .../ValidationConstraintsOnGenericTypeTest.cs | 170 +- .../ValidationContextClientProfileTest.cs | 206 +- .../Storage/ValidationContextTest.cs | 196 +- .../Storage/ValidationOnDemandTest.cs | 158 +- .../Storage/ValidationReferentialTest.cs | 146 +- .../Storage/ValidationTest.cs | 718 +- .../Storage/VersionBehaviorTest.cs | 984 +- .../Storage/VersionRootTests.cs | 524 +- .../Storage/VersionValidationTest.cs | 468 +- .../EntitySetOnwerVersionChangeTest.cs | 1116 +- .../Versioning/EntityVersioningPolicyTest.cs | 480 +- .../Storage/Versioning/Model.cs | 1376 +- .../Upgrade/BuildOnEmptySchemaTest.cs | 548 +- .../Upgrade/ChangeColumnCaseTest.cs | 230 +- .../Upgrade/ChangeFulltextCatalogTest.cs | 426 +- .../Upgrade/ChangeNamespaceTest.cs | 304 +- .../Upgrade/ColumnTypeTest.cs | 1002 +- .../CustomTypeIdMap/CustomTypeIdMap.cs | 2084 +- .../Upgrade/DataUpgrade/DataUpgradeTest.cs | 242 +- .../Upgrade/DataUpgrade/Model1.cs | 78 +- .../Upgrade/DataUpgrade/Model2.cs | 62 +- .../Upgrade/DataUpgrade/Upgrader.cs | 172 +- .../Upgrade/DateTimeOffsetUpgradeTest.cs | 362 +- ...isableAutoResolveNamespaceConflictsTest.cs | 210 +- .../DomainUpgradeModeExtensionsTest.cs | 120 +- .../Upgrade/DomainUpgradeSimpleTest.cs | 326 +- .../Upgrade/DomainUpgradeTest.cs | 870 +- .../Upgrade/EntitySetUpgrade/ModelVersion1.cs | 64 +- .../Upgrade/EntitySetUpgrade/ModelVersion2.cs | 44 +- .../Upgrade/EntitySetUpgrade/UpgradeTest.cs | 134 +- .../Upgrade/EntitySetUpgrade/Upgrader.cs | 206 +- .../Upgrade/ExtractSuperClassTest.cs | 304 +- .../ChangeTrackingModeComparisonTest.cs | 64 +- .../FullText/ConvertionToStorageModelTest.cs | 330 +- .../FullText/DomainUpgradeFullTextTest.cs | 104 +- .../FullText/DynamicFullTextCatalogTest.cs | 1018 +- ...lTextCatalogNameBuilderRegistrationTest.cs | 286 +- .../FullTextDataTypeColumnUpgradeTest.cs | 2068 +- .../Upgrade/FullText/ModelVersion1.cs | 40 +- .../Upgrade/FullText/ModelVersion2.cs | 42 +- .../Upgrade/FullText/ModelVersion3.cs | 50 +- .../Upgrade/FullText/ModelVersion4.cs | 50 +- .../Upgrade/FullText/ModelVersion5.cs | 50 +- .../Upgrade/FullText/ModelVersion6.cs | 46 +- .../Upgrade/FullText/Upgrader.cs | 150 +- .../HugeModelUpgrade/DatabasePerNodeTest.cs | 176 +- .../HugeModelUpgrade/MappedTypesNodesTest.cs | 176 +- .../Upgrade/HugeModelUpgrade/Measure.cs | 28 +- .../Models/ModelWithMappedTypes.cs | 41670 +-- .../Models/ModelWithMappedTypes.tt | 222 +- .../HugeModelUpgrade/Models/RegularModel.cs | 38066 +-- .../HugeModelUpgrade/Models/RegularModel.tt | 200 +- .../HugeModelUpgrade/Models/TwoPartsModel.cs | 37502 +-- .../HugeModelUpgrade/Models/TwoPartsModel.tt | 356 +- .../PerformanceResultContainer.cs | 112 +- .../HugeModelUpgrade/SchemaPerNodeTest.cs | 174 +- .../TwoDatabasesPerNodeTest.cs | 198 +- .../UpgradePerformanceCounter.cs | 126 +- .../Upgrade/IgnoreHintsTest.cs | 316 +- .../Upgrade/KeyGeneratorTableCleanUpTest.cs | 302 +- .../LegacyUpgrade/LegacyUpgradeTest.cs | 466 +- .../ModelConversion/ConvertDomainModelTest.cs | 378 +- .../ModelConversion/ForeignKeysTest.cs | 278 +- .../Upgrade/ModelVersion1.cs | 814 +- .../Upgrade/ModelVersion2.cs | 828 +- .../Upgrade/ModelVersion3.cs | 174 +- .../Upgrade/NewSkip/Model.cs | 1402 +- .../NewSkip/MultidatabaseDomainTest.cs | 876 +- .../Upgrade/NewSkip/MultischemaDomainTest.cs | 878 +- .../Upgrade/NewSkip/SimpleDomainTest.cs | 576 +- .../Upgrade/NewSkip/SingleDatabaseNodeTest.cs | 590 +- .../NewSkip/SingleSchemaNodeBuildingTest.cs | 658 +- .../Upgrade/NewSkip/SkipBuildingTestBase.cs | 272 +- .../NewUpgradeEventsAndPropertiesTest.cs | 380 +- .../NodeBasedExtractedModelBuilderTest.cs | 864 +- .../NonNullableReferenceRemovalTest.cs | 214 +- .../PerformSafelyFromEmptyDatabaseTest.cs | 100 +- .../Upgrade/PrimaryKeyModelVersion1.cs | 86 +- .../Upgrade/PrimaryKeyModelVersion2Perform.cs | 68 +- .../PrimaryKeyModelVersion2PerformSafely.cs | 96 +- .../Upgrade/PrimaryKeyUpgradeTest.cs | 298 +- .../Upgrade/Recycled/ModelVersion1.cs | 116 +- .../Upgrade/Recycled/ModelVersion2.cs | 284 +- .../Upgrade/Recycled/RecycledUpgradeTest.cs | 248 +- .../Upgrade/Recycled/Upgrader.cs | 210 +- .../Upgrade/RecycledDefinitionTest.cs | 406 +- .../RemoveColumnWithRenameTableTest.cs | 204 +- .../Upgrade/Sample3/ModelVersion1.cs | 120 +- .../Upgrade/Sample3/ModelVersion2.cs | 198 +- .../Upgrade/Sample3/Sample3UpgradeTest.cs | 176 +- .../Upgrade/Sample3/Upgrader.cs | 188 +- .../Upgrade/SchemaSharing/IgnoreRulesTest.cs | 1118 +- .../MakingSchemaExtractionResultSharedTest.cs | 130 +- .../SchemaSharing/MappingResolverTest.cs | 1372 +- .../SchemaSharing/MetadataUpdate/Model.cs | 566 +- .../MetadataUpdate/MultidatabaseTest.cs | 110 +- .../MetadataUpdate/MultischemaTest.cs | 100 +- .../MetadataUpdate/SimpleTest.cs | 214 +- .../Upgrade/SchemaSharing/Model.cs | 166 +- .../SchemaSharing/QueryBuilder/Model.cs | 736 +- .../QueryBuilder/MultidatabaseTest.cs | 86 +- .../QueryBuilder/MultischemaTest.cs | 80 +- .../SchemaSharing/QueryBuilder/SimpleTest.cs | 264 +- .../Upgrade/SchemaSharing/Requests/Model.cs | 430 +- .../Requests/MultidatabaseTest.cs | 90 +- .../SchemaSharing/Requests/MultischemaTest.cs | 82 +- .../SchemaSharing/Requests/SimpleTest.cs | 262 +- .../SchemaSharing/SqlExecutor/Model.cs | 724 +- .../SqlExecutor/MultidatabaseTest.cs | 86 +- .../SqlExecutor/MultischemaTest.cs | 82 +- .../SchemaSharing/SqlExecutor/SimpleTest.cs | 262 +- .../SchemaSharing/StorageNodeBuildingTest.cs | 822 +- .../TemporaryTableManager/Model.cs | 120 +- .../MultidatabaseTest.cs | 88 +- .../TemporaryTableManager/MultischemaTest.cs | 134 +- .../TemporaryTableManager/SimpleTest.cs | 146 +- .../Upgrade/SimpleModelVersion1.cs | 258 +- .../Upgrade/SimpleModelVersion2.cs | 256 +- .../Upgrade/SimpleUpgrader.cs | 196 +- .../Upgrade/SkipUpgradeTest.cs | 208 +- .../Upgrade/SplitHierarchyTest.cs | 288 +- .../Upgrade/SqlWorkerTest.cs | 960 +- .../Upgrade/TwoUpgradeHandlersTest.cs | 72 +- .../Upgrade/TypeConversionVerifierTest.cs | 332 +- .../Upgrade/TypeIdPreserveTest.cs | 260 +- .../TypeIdUpgrade/Many2SingleClassTest.cs | 118 +- .../Upgrade/TypeIdUpgrade/Model.cs | 62 +- .../TypeIdUpgrade/Single2ManyClassesTest.cs | 108 +- .../Upgrade/TypeIdUpgrade/Upgrader.cs | 86 +- .../TypeIdUpgrade/VersionUpgradeTest.cs | 406 +- .../UpgradeAndNamingRules/ModelVersion1.cs | 40 +- .../UpgradeAndNamingRules/ModelVersion2.cs | 40 +- .../UpgradeAndNamingRules/UpgradeTest.cs | 134 +- .../Upgrade/UpgradeAndNamingRules/Upgrader.cs | 210 +- .../DefaultNamesTest.cs | 40 +- .../DefaultNamingSettingsTest.cs | 44 +- .../LowerCaseNamesTest.cs | 40 +- .../RemoveDotsAndHyphensRule.cs | 86 +- .../RemoveDotsRuleTest.cs | 86 +- .../RemoveHyphensRuleTest.cs | 86 +- .../SourceModels.cs | 1024 +- .../SynonymsOfNamespacesTest.cs | 84 +- .../TargetModels.cs | 1410 +- .../UpgradeAndNamingRulesAdvanced/TestBase.cs | 1982 +- .../UnderscoreDotsAndHyphensRule.cs | 86 +- .../UnderscoreDotsRuleTest.cs | 86 +- .../UnderscoreHyphensRuleTest.cs | 88 +- .../UpperCaseNamesTest.cs | 40 +- .../Upgrade/UpgradeContextTest.cs | 606 +- .../Upgrade/UpgradeDateTimeOffsetTest.cs | 276 +- .../Upgrade/UpgradeTestTemplate.cs | 206 +- .../UpgradeToStructure/ModelVersion1.cs | 40 +- .../UpgradeToStructure/ModelVersion2.cs | 54 +- .../Upgrade/UpgradeToStructure/UpgradeTest.cs | 130 +- .../Upgrade/UpgradeToStructure/Upgrader.cs | 210 +- Orm/Xtensive.Orm.Tests/Upgrade/Upgrader.cs | 360 +- .../Xtensive.Orm.Tests.csproj | 214 +- .../_Manual/Validation/Person.cs | 118 +- .../Validation/PhoneNumberConstraint.cs | 84 +- .../_Manual/Validation/TestFixture.cs | 102 +- Orm/Xtensive.Orm.xsd | 658 +- Orm/Xtensive.Orm/Annotations.cs | 1046 +- Orm/Xtensive.Orm/Arithmetic/Arithmetic.cs | 290 +- Orm/Xtensive.Orm/Arithmetic/ArithmeticBase.cs | 272 +- .../Arithmetic/ArithmeticProvider.cs | 172 +- .../Arithmetic/ArithmeticRules.cs | 144 +- .../Arithmetic/ArithmeticStruct.cs | 304 +- .../Arithmetic/Interfaces/IArithmetic.cs | 172 +- .../Arithmetic/Interfaces/IArithmeticBase.cs | 38 +- .../Interfaces/IArithmeticProvider.cs | 40 +- .../Arithmetic/Internal/NullableArithmetic.cs | 200 +- .../Internal/PrimitiveArithmetics.cs | 3168 +- .../Internal/PrimitiveArithmetics.tt | 336 +- Orm/Xtensive.Orm/Arithmetic/NullBehavior.cs | 62 +- .../Arithmetic/OverflowBehavior.cs | 62 +- .../Arithmetic/WrappingArithmetic{T,TBase}.cs | 80 +- Orm/Xtensive.Orm/Caching/InfiniteCache.cs | 332 +- Orm/Xtensive.Orm/Caching/Interfaces/ICache.cs | 218 +- .../Caching/Interfaces/IInvalidatable.cs | 36 +- .../Caching/LruCache{TKey, TItem, TCached}.cs | 598 +- .../Caching/LruCache{TKey, TItem}.cs | 598 +- Orm/Xtensive.Orm/Caching/MfLruCache.cs | 950 +- Orm/Xtensive.Orm/Caching/ThreadSafeCache.cs | 362 +- Orm/Xtensive.Orm/Caching/WeakCache.cs | 640 +- Orm/Xtensive.Orm/Caching/WeakestCache.cs | 924 +- Orm/Xtensive.Orm/Collections/ArrayUtils.cs | 54 +- .../Collections/BindingCollection.cs | 336 +- Orm/Xtensive.Orm/Collections/ChainedBuffer.cs | 376 +- .../Collections/ChangeNotifierEventArgs.cs | 88 +- .../Collections/ClassifiedCollection.cs | 330 +- .../Collections/CollectionBase.cs | 970 +- .../Collections/CollectionBaseSlim.cs | 424 +- .../CollectionChangeNotifierEventArgs.cs | 118 +- Orm/Xtensive.Orm/Collections/Deque.cs | 1324 +- .../Collections/DifferentialDictionary.cs | 632 +- .../DifferentialDictionaryDifference.cs | 108 +- .../Collections/DirectionCollection.cs | 134 +- .../Collections/EnumerableUtils.cs | 146 +- .../Collections/EnumerableUtils{TItem}.cs | 162 +- .../Collections/ExtensionCollection.cs | 324 +- Orm/Xtensive.Orm/Collections/FixedList3.cs | 368 +- .../Collections/FlagCollection.cs | 820 +- Orm/Xtensive.Orm/Collections/FlagRegistry.cs | 218 +- Orm/Xtensive.Orm/Collections/Graphs/Edge.cs | 178 +- .../Collections/Graphs/Edge{TValue}.cs | 118 +- Orm/Xtensive.Orm/Collections/Graphs/Graph.cs | 226 +- Orm/Xtensive.Orm/Collections/Graphs/Node.cs | 146 +- .../Collections/Graphs/Node{TValue}.cs | 94 +- .../Graphs/TopologicalSortResult.cs | 100 +- .../Collections/Graphs/TopologicalSorter.cs | 302 +- .../Collections/Interfaces/IChangeNotifier.cs | 52 +- .../Interfaces/IClassifiedCollection.cs | 106 +- .../Interfaces/ICollectionChangeNotifier.cs | 124 +- .../Collections/Interfaces/IDeque.cs | 304 +- .../Interfaces/IExtensionCollection.cs | 116 +- .../Collections/Interfaces/IFilterable.cs | 66 +- .../Interfaces/INamedValueCollection.cs | 60 +- .../Collections/Interfaces/IPriorityQueue.cs | 248 +- .../Collections/Interfaces/ISet{T}.cs | 74 +- .../Collections/Interfaces/ITopDeque{K,V}.cs | 286 +- .../Interfaces/ITypeRegistrationProcessor.cs | 40 +- .../Internals/CollectionEventBroker.cs | 208 +- .../Internals/DictionaryEnumerator.cs | 74 +- .../Collections/Internals/ObjectPair.cs | 120 +- .../Internals/PriorityQueueItemComparer.cs | 86 +- .../Internals/TypeBasedDictionaryItem.cs | 24 +- .../Collections/Internals/TypePair.cs | 120 +- .../Collections/LazyDictionary.cs | 290 +- .../Collections/NamedValueCollection.cs | 76 +- .../Collections/NativeTypeClassifier.cs | 134 +- Orm/Xtensive.Orm/Collections/PriorityQueue.cs | 716 +- .../Collections/ReadOnlyCollection{T}.cs | 342 +- .../ReadOnlyDictionary{TKey, TValue}.cs | 588 +- .../Collections/ReadOnlyHashSet{T}.cs | 278 +- .../Collections/ReadOnlyList{T}.cs | 460 +- .../Collections/ReadOnlySet{T}.cs | 278 +- Orm/Xtensive.Orm/Collections/Set.cs | 740 +- Orm/Xtensive.Orm/Collections/SetBase.cs | 320 +- Orm/Xtensive.Orm/Collections/SetSlim.cs | 162 +- .../Collections/SinglyLinkedList.cs | 274 +- .../Collections/ThreadSafeDictionary.cs | 376 +- .../Collections/ThreadSafeList.cs | 382 +- Orm/Xtensive.Orm/Collections/TopDeque.cs | 664 +- .../Collections/TypeClassifier.cs | 90 +- .../Collections/TypeRegistration.cs | 260 +- .../Collections/TypeRegistrationElement.cs | 162 +- .../TypeRegistrationProcessorBase.cs | 198 +- Orm/Xtensive.Orm/Collections/TypeRegistry.cs | 436 +- .../Comparison/AdvancedComparer.cs | 552 +- .../Comparison/AdvancedComparerBase.cs | 374 +- .../Comparison/AdvancedComparerStruct.cs | 248 +- .../Comparison/CastingComparer.cs | 206 +- .../Comparison/ComparerProvider.cs | 244 +- Orm/Xtensive.Orm/Comparison/ComparisonRule.cs | 382 +- .../Comparison/ComparisonRules.cs | 638 +- .../Interfaces/IAdvancedComparer.cs | 90 +- .../Interfaces/IAdvancedComparerBase.cs | 52 +- .../Comparison/Interfaces/IComparer.cs | 44 +- .../Interfaces/IComparerProvider.cs | 44 +- .../Comparison/Interfaces/IHasRangeInfo.cs | 40 +- .../Interfaces/INearestValueProvider.cs | 46 +- .../Comparison/Interfaces/ISystemComparer.cs | 32 +- .../Comparison/Internals/ArrayComparer.cs | 170 +- .../Comparison/Internals/AssemblyComparer.cs | 114 +- .../Internals/BaseComparerWrapper.cs | 98 +- .../Comparison/Internals/BooleanComparer.cs | 72 +- .../Comparison/Internals/ByteComparer.cs | 54 +- .../Comparison/Internals/CharComparer.cs | 54 +- .../Comparison/Internals/DecimalComparer.cs | 54 +- .../Comparison/Internals/DoubleComparer.cs | 54 +- .../Comparison/Internals/EnumComparer.cs | 208 +- .../Internals/EnumerableInterfaceComparer.cs | 240 +- .../Comparison/Internals/GuidComparer.cs | 60 +- .../Comparison/Internals/Int16Comparer.cs | 54 +- .../Comparison/Internals/Int32Comparer.cs | 54 +- .../Comparison/Internals/Int64Comparer.cs | 54 +- .../Internals/KeyValuePairComparer.cs | 146 +- .../Internals/NoSystemComparerHandler.cs | 106 +- .../Comparison/Internals/NullableComparer.cs | 226 +- .../Comparison/Internals/ObjectComparer.cs | 180 +- .../Internals/PairComparer{T1,T2}.cs | 142 +- .../Comparison/Internals/PairComparer{T}.cs | 142 +- .../Comparison/Internals/SByteComparer.cs | 54 +- .../Comparison/Internals/SingleComparer.cs | 54 +- .../Comparison/Internals/StringComparer.cs | 248 +- .../Internals/SystemComparerStruct.cs | 74 +- .../Comparison/Internals/TupleComparer.cs | 122 +- .../Internals/TupleDescriptorComparer.cs | 104 +- .../Comparison/Internals/TypeComparer.cs | 140 +- .../Comparison/Internals/UInt16Comparer.cs | 54 +- .../Comparison/Internals/UInt32Comparer.cs | 54 +- .../Comparison/Internals/UInt64Comparer.cs | 54 +- .../Comparison/Internals/ValueTypeComparer.cs | 150 +- .../Internals/ValueTypeComparerBase.cs | 66 +- .../Comparison/ReferenceEqualityComparer.cs | 76 +- Orm/Xtensive.Orm/Comparison/SystemComparer.cs | 110 +- .../Comparison/SystemComparerProvider.cs | 88 +- Orm/Xtensive.Orm/Comparison/ValueRangeInfo.cs | 288 +- Orm/Xtensive.Orm/Comparison/WellKnown.cs | 52 +- .../WrappingComparer{T,TBase1,TBase2}.cs | 92 +- .../Comparison/WrappingComparer{T,TBase}.cs | 82 +- .../Conversion/AdvancedConverter.cs | 164 +- .../Conversion/AdvancedConverterBase.cs | 108 +- .../Conversion/AdvancedConverterProvider.cs | 254 +- .../Conversion/AdvancedConverterStruct.cs | 172 +- Orm/Xtensive.Orm/Conversion/Biconverter.cs | 244 +- .../Conversion/ConvertingEnumerable.cs | 118 +- .../Interfaces/IAdvancedConverter.cs | 58 +- .../Interfaces/IAdvancedConverterBase.cs | 38 +- .../Interfaces/IAdvancedConverterFactory.cs | 64 +- .../Interfaces/IAdvancedConverterProvider.cs | 56 +- .../Conversion/Interfaces/IBiconverter.cs | 58 +- .../Internals/BooleanAdvancedConverter.cs | 188 +- .../Internals/ByteAdvancedConverter.cs | 232 +- .../Internals/ByteRoughAdvancedConverter.cs | 56 +- .../Internals/CharAdvancedConverter.cs | 176 +- .../Internals/ConvertingEnumerator.cs | 166 +- .../Internals/DateTimeAdvancedConverter.cs | 228 +- .../DateTimeRoughAdvancedConverter.cs | 74 +- .../Internals/DecimalAdvancedConverter.cs | 56 +- .../DecimalRoughAdvancedConverter.cs | 248 +- .../Internals/DoubleAdvancedConverter.cs | 60 +- .../Internals/DoubleRoughAdvancedConverter.cs | 242 +- .../Internals/EnumAdvancedConverterFactory.cs | 160 +- ...cedConverter{TFrom, TTo, TIntermediate}.cs | 118 +- ...m, TTo, TUnderlyingFrom, TUnderlyingTo}.cs | 96 +- .../EnumAdvancedConverter{TFrom, TTo}.cs | 74 +- .../Internals/GuidAdvancedConverter.cs | 54 +- .../Internals/Int16AdvancedConverter.cs | 248 +- .../Internals/Int16RoughAdvancedConverter.cs | 56 +- .../Internals/Int32AdvancedConverter.cs | 242 +- .../Internals/Int32RoughAdvancedConverter.cs | 68 +- .../Internals/Int64AdvancedConverter.cs | 232 +- .../Internals/Int64RoughAdvancedConverter.cs | 80 +- .../NullableAdvancedConverterFactory.cs | 126 +- .../NullableForwardAdvancedConverter.cs | 64 +- .../NullableNullableAdvancedConverter.cs | 64 +- .../NullableReverseAdvancedConverter.cs | 56 +- .../ObjectAdvancedConverterFactory.cs | 118 +- ...jectToBaseAdvancedConverter{TFrom, TTo}.cs | 66 +- ...DescendantAdvancedConverter{TFrom, TTo}.cs | 66 +- .../Internals/RoughAdvancedConverterBase.cs | 58 +- .../Internals/SByteAdvancedConverter.cs | 244 +- .../Internals/SByteRoughAdvancedConverter.cs | 56 +- .../Internals/SingleAdvancedConverter.cs | 60 +- .../Internals/SingleRoughAdvancedConverter.cs | 248 +- .../Internals/StrictAdvancedConverterBase.cs | 68 +- .../Internals/StringAdvancedConverter.cs | 42 +- .../Internals/StringRoughAdvancedConverter.cs | 350 +- .../StringRoughAdvancedConverter{T}.cs | 56 +- .../Internals/TimeSpanAdvancedConverter.cs | 208 +- .../TimeSpanRoughAdvancedConverter.cs | 68 +- .../Internals/TypeAdvancedConverter.cs | 68 +- .../Internals/UInt16AdvancedConverter.cs | 242 +- .../Internals/UInt16RoughAdvancedConverter.cs | 56 +- .../Internals/UInt32AdvancedConverter.cs | 238 +- .../Internals/UInt32RoughAdvancedConverter.cs | 68 +- .../Internals/UInt64AdvancedConverter.cs | 232 +- .../Internals/UInt64RoughAdvancedConverter.cs | 80 +- .../Conversion/WrappingAdvancedConverter.cs | 102 +- Orm/Xtensive.Orm/Core/AliasGenerator.cs | 226 +- Orm/Xtensive.Orm/Core/ArgumentValidator.cs | 452 +- Orm/Xtensive.Orm/Core/AssociateProvider.cs | 622 +- Orm/Xtensive.Orm/Core/AsyncFutureResult.cs | 116 +- Orm/Xtensive.Orm/Core/Cloner.cs | 66 +- .../Core/ConfigurationCollection.cs | 108 +- .../ConfigurationCollectionElementBase.cs | 40 +- Orm/Xtensive.Orm/Core/Context.cs | 90 +- Orm/Xtensive.Orm/Core/Direction.cs | 74 +- Orm/Xtensive.Orm/Core/Disposable.cs | 132 +- Orm/Xtensive.Orm/Core/DisposableSet.cs | 236 +- Orm/Xtensive.Orm/Core/Disposable{T1,T2}.cs | 148 +- Orm/Xtensive.Orm/Core/Disposable{T}.cs | 140 +- Orm/Xtensive.Orm/Core/EnumeratorExtensions.cs | 42 +- Orm/Xtensive.Orm/Core/ExceptionAggregator.cs | 748 +- Orm/Xtensive.Orm/Core/Exceptions.cs | 436 +- .../Core/Exceptions/ActivationException.cs | 110 +- .../Core/Exceptions/AggregateException.cs | 330 +- .../Core/Extensions/ArrayExtensions.cs | 564 +- .../Core/Extensions/CollectionExtensions.cs | 316 +- .../Core/Extensions/DelegateBindExtensions.cs | 546 +- .../Core/Extensions/DelegateBindExtensions.tt | 98 +- .../Core/Extensions/DisposableExtensions.cs | 114 +- .../Core/Extensions/EnumerableExtensions.cs | 1232 +- .../Extensions/ExpressionCompileExtensions.cs | 548 +- .../Extensions/ExpressionCompileExtensions.tt | 100 +- .../Core/Extensions/ExpressionExtensions.cs | 572 +- .../Core/Extensions/HasServicesExtensions.cs | 158 +- .../Core/Extensions/ListExtensions.cs | 244 +- .../Core/Extensions/LockableExtensions.cs | 50 +- .../Extensions/ParameterContextExtensions.cs | 50 +- .../Extensions/ServiceContainerExtensions.cs | 222 +- .../Extensions/StringBuilderExtensions.cs | 178 +- .../Core/Extensions/StringExtensions.cs | 896 +- Orm/Xtensive.Orm/Core/FutureResult.cs | 32 +- .../Core/HasVersion{TValue,TVersion}.cs | 240 +- Orm/Xtensive.Orm/Core/InheritableScope.cs | 126 +- Orm/Xtensive.Orm/Core/Interfaces/IContext.cs | 62 +- .../Core/Interfaces/IContextBound.cs | 42 +- .../Core/Interfaces/IContext{TScope}.cs | 52 +- .../Core/Interfaces/IHasExtensions.cs | 40 +- .../Core/Interfaces/IHasGarbage.cs | 42 +- .../Core/Interfaces/IHasServices.cs | 48 +- Orm/Xtensive.Orm/Core/Interfaces/IHasSize.cs | 36 +- .../Core/Interfaces/IHasVersion.cs | 66 +- .../Core/Interfaces/IOperationSequence.cs | 58 +- Orm/Xtensive.Orm/Core/Interfaces/IReadOnly.cs | 30 +- Orm/Xtensive.Orm/Core/JoiningDisposable.cs | 176 +- Orm/Xtensive.Orm/Core/LockableBase.cs | 136 +- Orm/Xtensive.Orm/Core/MatchType.cs | 42 +- Orm/Xtensive.Orm/Core/MethodCacheBase.cs | 120 +- Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs | 232 +- Orm/Xtensive.Orm/Core/Pair{T}.cs | 238 +- Orm/Xtensive.Orm/Core/Parameter.cs | 282 +- Orm/Xtensive.Orm/Core/ParameterContext.cs | 252 +- Orm/Xtensive.Orm/Core/ParameterScope.cs | 234 +- Orm/Xtensive.Orm/Core/Parameter{TValue}.cs | 240 +- Orm/Xtensive.Orm/Core/Predicate.cs | 32 +- Orm/Xtensive.Orm/Core/Scope.cs | 354 +- Orm/Xtensive.Orm/Core/Segment.cs | 254 +- Orm/Xtensive.Orm/Core/SimpleScope.cs | 238 +- Orm/Xtensive.Orm/Core/SimpleXmlSerializer.cs | 94 +- .../Core/SynchronousFutureResult.cs | 86 +- Orm/Xtensive.Orm/Core/ThreadSafeCached.cs | 352 +- .../Core/Triplet{TFirst,TSecond,TThird}.cs | 264 +- Orm/Xtensive.Orm/Core/Triplet{T}.cs | 260 +- Orm/Xtensive.Orm/Core/ValueFutureResult.cs | 82 +- Orm/Xtensive.Orm/DelegateGenerator.ttinclude | 312 +- Orm/Xtensive.Orm/InternalLogs.cs | 1406 +- Orm/Xtensive.Orm/InternalLogs.tt | 140 +- .../IoC/Attributes/ServiceAttribute.cs | 138 +- .../Attributes/ServiceConstructorAttribute.cs | 38 +- .../IoC/Configuration/ConfigurationSection.cs | 70 +- .../IoC/Configuration/ContainerElement.cs | 158 +- .../ServiceRegistrationElement.cs | 164 +- .../IoC/Interfaces/IServiceContainer.cs | 164 +- .../IoC/Internals/DefaultServiceContainer.cs | 94 +- .../ServiceTypeRegistrationProcessor.cs | 46 +- Orm/Xtensive.Orm/IoC/ServiceContainer.cs | 712 +- Orm/Xtensive.Orm/IoC/ServiceContainerBase.cs | 352 +- Orm/Xtensive.Orm/IoC/ServiceRegistration.cs | 300 +- Orm/Xtensive.Orm/Linq/ConstantExtractor.cs | 224 +- Orm/Xtensive.Orm/Linq/ExpressionExtensions.cs | 166 +- Orm/Xtensive.Orm/Linq/ExpressionReplacer.cs | 118 +- Orm/Xtensive.Orm/Linq/ExpressionTree.cs | 242 +- Orm/Xtensive.Orm/Linq/ExpressionVisitor.cs | 570 +- .../Linq/ExpressionVisitor{TResult}.cs | 568 +- Orm/Xtensive.Orm/Linq/ExpressionWriter.cs | 1238 +- Orm/Xtensive.Orm/Linq/FastExpression.cs | 156 +- .../Internals/CachingExpressionCompiler.cs | 106 +- .../Linq/Internals/ExpressionComparer.cs | 528 +- .../Internals/ExpressionHashCodeCalculator.cs | 284 +- .../Linq/Internals/LambdaExpressionFactory.cs | 236 +- .../Internals/ParameterExpressionRegistry.cs | 80 +- Orm/Xtensive.Orm/Linq/QueryableMethodKind.cs | 136 +- Orm/Xtensive.Orm/Linq/QueryableVisitor.cs | 128 +- ...essionToSerializableExpressionConverter.cs | 494 +- .../Internals/ReflectionExtensions.cs | 234 +- ...alizableExpressionToExpressionConverter.cs | 496 +- .../SerializableBinaryExpression.cs | 120 +- .../SerializableConditionalExpression.cs | 102 +- .../SerializableConstantExpression.cs | 80 +- .../SerializableElementInit.cs | 94 +- .../SerializableExpression.cs | 90 +- .../SerializableInvocationExpression.cs | 92 +- .../SerializableLambdaExpression.cs | 94 +- .../SerializableListInitExpression.cs | 92 +- .../SerializableMemberAssignment.cs | 78 +- .../SerializableMemberBinding.cs | 94 +- .../SerializableMemberExpression.cs | 98 +- .../SerializableMemberInitExpression.cs | 92 +- .../SerializableMemberListBinding.cs | 80 +- .../SerializableMemberMemberBinding.cs | 80 +- .../SerializableMethodCallExpression.cs | 110 +- .../SerializableNewArrayExpression.cs | 80 +- .../SerializableNewExpression.cs | 124 +- .../SerializableParameterExpression.cs | 78 +- .../SerializableTypeBinaryExpression.cs | 96 +- .../SerializableUnaryExpression.cs | 100 +- .../Modelling/Actions/ActionHandler.cs | 100 +- .../Modelling/Actions/ActionHandlerScope.cs | 92 +- .../Modelling/Actions/ActionScope.cs | 178 +- .../Modelling/Actions/ActionSequence.cs | 286 +- .../Modelling/Actions/CreateNodeAction.cs | 248 +- .../Modelling/Actions/DataAction.cs | 90 +- .../Modelling/Actions/GroupingNodeAction.cs | 228 +- .../Actions/Interfaces/IActionHandler.cs | 38 +- .../Actions/Interfaces/IActionSequence.cs | 102 +- .../Actions/Interfaces/INodeAction.cs | 64 +- .../Modelling/Actions/MoveNodeAction.cs | 196 +- .../Modelling/Actions/NodeAction.cs | 282 +- .../Modelling/Actions/NullActionHandler.cs | 76 +- .../Modelling/Actions/PathNodeReference.cs | 216 +- .../Modelling/Actions/PropertyChangeAction.cs | 106 +- .../Modelling/Actions/RemoveNodeAction.cs | 52 +- .../Attributes/DataDependentAttribute.cs | 36 +- .../Modelling/Attributes/PropertyAttribute.cs | 110 +- .../Attributes/SystemPropertyAttribute.cs | 52 +- Orm/Xtensive.Orm/Modelling/CloningContext.cs | 204 +- Orm/Xtensive.Orm/Modelling/CloningScope.cs | 130 +- .../Modelling/Comparison/Comparer.cs | 1536 +- .../Modelling/Comparison/ComparisonContext.cs | 250 +- .../Modelling/Comparison/ComparisonStage.cs | 44 +- .../Modelling/Comparison/Difference.cs | 154 +- .../Comparison/Hints/CopyDataHint.cs | 146 +- .../Modelling/Comparison/Hints/DataHint.cs | 118 +- .../Comparison/Hints/DeleteDataHint.cs | 118 +- .../Modelling/Comparison/Hints/Hint.cs | 40 +- .../Modelling/Comparison/Hints/HintSet.cs | 504 +- .../Modelling/Comparison/Hints/HintTarget.cs | 192 +- .../Comparison/Hints/IdentityPair.cs | 106 +- .../Modelling/Comparison/Hints/IgnoreHint.cs | 104 +- .../Comparison/Hints/Interfaces/IHint.cs | 42 +- .../Comparison/Hints/Interfaces/IHintSet.cs | 132 +- .../Modelling/Comparison/Hints/RenameHint.cs | 110 +- .../Comparison/Hints/UpdateDataHint.cs | 130 +- .../Comparison/Interfaces/IComparer.cs | 76 +- .../Comparison/Interfaces/IDifference.cs | 74 +- .../Interfaces/IDifference{T, TParent}.cs | 44 +- .../Comparison/Interfaces/IDifference{T}.cs | 48 +- .../Interfaces/IHasPropertyChanges.cs | 40 +- .../Comparison/Interfaces/IUpgrader.cs | 88 +- .../Modelling/Comparison/ModelType.cs | 44 +- .../Modelling/Comparison/MovementInfo.cs | 170 +- .../Comparison/NodeCollectionDifference.cs | 134 +- .../Modelling/Comparison/NodeDifference.cs | 266 +- .../Modelling/Comparison/UpgradeActionType.cs | 60 +- .../Modelling/Comparison/UpgradeContext.cs | 330 +- .../Modelling/Comparison/UpgradeStage.cs | 86 +- .../Modelling/Comparison/Upgrader.cs | 1556 +- .../Modelling/Comparison/ValueDifference.cs | 80 +- .../Modelling/Interfaces/IModel.cs | 44 +- .../Modelling/Interfaces/INesting.cs | 102 +- .../Modelling/Interfaces/INode.cs | 180 +- .../Modelling/Interfaces/INodeCollection.cs | 136 +- .../Interfaces/INodeCollection{TNode}.cs | 80 +- .../Modelling/Interfaces/INodeReference.cs | 36 +- .../Modelling/Interfaces/INode{TParent}.cs | 58 +- .../Modelling/Interfaces/IPathNode.cs | 110 +- .../Interfaces/IPathNode{TParent, TModel}.cs | 46 +- .../Interfaces/IPathNode{TParent}.cs | 40 +- .../Modelling/Interfaces/IUnnamedNode.cs | 28 +- .../Interfaces/IUnorderedNodeCollection.cs | 34 +- Orm/Xtensive.Orm/Modelling/Nesting.cs | 176 +- .../Nesting{TNode, TParent, TProperty}.cs | 242 +- Orm/Xtensive.Orm/Modelling/Node.cs | 1858 +- Orm/Xtensive.Orm/Modelling/NodeCollection.cs | 816 +- .../NodeCollection{TNode, TParent, TModel}.cs | 140 +- Orm/Xtensive.Orm/Modelling/NodeState.cs | 60 +- .../Modelling/Node{TParent, TModel}.cs | 114 +- .../Modelling/PathNodeExtensions.cs | 72 +- .../Modelling/PropertyAccessor.cs | 426 +- .../Modelling/PropertyAccessorDictionary.cs | 132 +- .../Validation/Interfaces/IValidatable.cs | 36 +- .../Modelling/Validation/ValidationContext.cs | 188 +- .../Modelling/Validation/ValidationScope.cs | 116 +- .../docs/JetBrains.Annotations-License.txt | 402 +- .../NuGetContent/docs/Mono.Cecil-License.txt | 42 +- .../Orm/Aspects/TransactionalBehavior.cs | 32 +- .../Orm/Attributes/AssociationAttribute.cs | 198 +- .../Orm/Attributes/CompilerAttribute.cs | 326 +- .../Attributes/CompilerContainerAttribute.cs | 120 +- .../Orm/Attributes/FieldAttribute.cs | 244 +- .../Orm/Attributes/FieldMappingAttribute.cs | 78 +- .../Orm/Attributes/FullTextAttribute.cs | 100 +- .../Orm/Attributes/HierarchyRootAttribute.cs | 180 +- .../Orm/Attributes/IndexAttribute.cs | 208 +- .../Orm/Attributes/KeyAttribute.cs | 158 +- .../Orm/Attributes/KeyGeneratorAttribute.cs | 134 +- .../Orm/Attributes/KeyGeneratorKind.cs | 74 +- .../Attributes/MaterializedViewAttribute.cs | 40 +- .../Orm/Attributes/StorageAttribute.cs | 34 +- .../Orm/Attributes/SystemTypeAttribute.cs | 86 +- .../Orm/Attributes/TableMappingAttribute.cs | 82 +- .../Orm/Attributes/TypeAttribute.cs | 72 +- .../Attributes/TypeDiscriminatorAttribute.cs | 38 +- .../TypeDiscriminatorValueAttribute.cs | 90 +- .../Orm/Attributes/VersionAttribute.cs | 80 +- .../Orm/Attributes/VersionMode.cs | 68 +- .../Building/Builders/AssociationBuilder.cs | 432 +- .../Building/Builders/AttributeProcessor.cs | 858 +- .../Builders/AutoGenericCombinator.cs | 82 +- .../Builders/DatabaseDependencyBuilder.cs | 376 +- .../Orm/Building/Builders/DomainBuilder.cs | 340 +- .../Builders/DomainBuilderConfiguration.cs | 228 +- .../Orm/Building/Builders/IModelFilter.cs | 32 +- .../Orm/Building/Builders/ITypeIdProvider.cs | 28 +- .../Builders/IndexBuilder.ClassTable.cs | 278 +- .../Builders/IndexBuilder.ClusteredIndexes.cs | 284 +- .../Builders/IndexBuilder.ConcreteTable.cs | 252 +- .../Builders/IndexBuilder.FullText.cs | 304 +- .../Builders/IndexBuilder.SingleTable.cs | 240 +- .../Orm/Building/Builders/IndexBuilder.cs | 1906 +- .../Building/Builders/KeyGeneratorFactory.cs | 194 +- .../Builders/MemberCompilerProviderBuilder.cs | 296 +- .../Orm/Building/Builders/ModelBuilder.cs | 1100 +- .../Orm/Building/Builders/ModelDefBuilder.cs | 734 +- .../Building/Builders/ModelMappingBuilder.cs | 184 +- .../Builders/PartialIndexFilterBuilder.cs | 368 +- .../Building/Builders/ProviderDescriptor.cs | 208 +- .../Builders/StorageMappingBuilder.cs | 310 +- .../Builders/StorageMappingValidator.cs | 274 +- .../Orm/Building/Builders/TypeBuilder.cs | 1170 +- .../Builders/TypeGenerationMonitor.cs | 88 +- .../Orm/Building/Builders/TypeIdBuilder.cs | 252 +- .../Orm/Building/Builders/ValueTypeBuilder.cs | 132 +- .../Orm/Building/BuildingContext.cs | 232 +- .../Orm/Building/BuildingScope.cs | 66 +- .../Building/Definitions/DomainModelDef.cs | 226 +- .../Orm/Building/Definitions/FieldDef.cs | 684 +- .../Building/Definitions/FullTextFieldDef.cs | 96 +- .../Building/Definitions/FullTextIndexDef.cs | 68 +- .../Definitions/FullTextIndexDefCollection.cs | 116 +- .../Orm/Building/Definitions/HierarchyDef.cs | 130 +- .../Definitions/HierarchyDefCollection.cs | 128 +- .../Orm/Building/Definitions/IndexDef.cs | 356 +- .../Orm/Building/Definitions/TypeDef.cs | 504 +- .../Building/Definitions/TypeDefCollection.cs | 304 +- .../Orm/Building/DependencyGraph/Edge.cs | 160 +- .../Orm/Building/DependencyGraph/EdgeKind.cs | 38 +- .../Building/DependencyGraph/EdgeWeight.cs | 36 +- .../Orm/Building/DependencyGraph/Graph.cs | 128 +- .../Orm/Building/DependencyGraph/Node.cs | 72 +- .../Orm/Building/FixupActionProcessor.cs | 520 +- .../FixupActions/AddForeignKeyIndexAction.cs | 60 +- .../FixupActions/AddPrimaryIndexAction.cs | 58 +- .../FixupActions/AddTypeIdFieldAction.cs | 60 +- .../AddTypeIdToKeyFieldsAction.cs | 60 +- .../BuildGenericTypeInstancesAction.cs | 60 +- .../BuildImplementorListAction.cs | 54 +- .../FixupActions/CopyKeyFieldsAction.cs | 68 +- .../Orm/Building/FixupActions/FieldAction.cs | 44 +- .../Orm/Building/FixupActions/FixupAction.cs | 24 +- .../Building/FixupActions/HierarchyAction.cs | 38 +- .../FixupActions/MakeTypeNonAbstractAction.cs | 56 +- .../MarkFieldAsNotNullableAction.cs | 58 +- .../FixupActions/MarkFieldAsSystemAction.cs | 60 +- .../Building/FixupActions/RemoveTypeAction.cs | 60 +- .../FixupActions/ReorderFieldsAction.cs | 76 +- .../Orm/Building/FixupActions/TypeAction.cs | 38 +- .../Orm/Building/ModelInspectionResult.cs | 98 +- .../Orm/Building/ModelInspector.cs | 678 +- Orm/Xtensive.Orm/Orm/Building/Module.cs | 64 +- .../Orm/Building/PrefetchActionContainer.cs | 94 +- Orm/Xtensive.Orm/Orm/Building/SystemModule.cs | 142 +- .../Orm/Building/ValidationRule.cs | 34 +- Orm/Xtensive.Orm/Orm/Building/Validator.cs | 502 +- .../Orm/CommandProcessorContextProvider.cs | 104 +- .../Orm/Configuration/ConfigurationBase.cs | 120 +- .../Configuration/DatabaseConfiguration.cs | 234 +- .../DatabaseConfigurationCollection.cs | 94 +- .../Orm/Configuration/DomainConfiguration.cs | 1776 +- .../Orm/Configuration/DomainOptions.cs | 52 +- .../Orm/Configuration/DomainTypeRegistry.cs | 540 +- .../Elements/ConfigurationSection.cs | 102 +- .../Elements/DatabaseConfigurationElement.cs | 156 +- .../Elements/DomainConfigurationElement.cs | 902 +- .../Elements/IgnoreRuleElement.cs | 156 +- .../KeyGeneratorConfigurationElement.cs | 158 +- .../Orm/Configuration/Elements/LogElement.cs | 110 +- .../Configuration/Elements/LoggingElement.cs | 104 +- .../Elements/MappingRuleElement.cs | 152 +- .../Elements/NamespaceSynonymElement.cs | 90 +- .../Elements/NamingConventionElement.cs | 158 +- .../Elements/SessionConfigurationElement.cs | 388 +- .../Elements/VersioningConventionElement.cs | 104 +- .../Configuration/EntityVersioningPolicy.cs | 72 +- .../Orm/Configuration/IgnoreRule.cs | 276 +- .../Orm/Configuration/IgnoreRuleCollection.cs | 118 +- .../IgnoreRuleConstructionFlow.cs | 88 +- .../Interfaces/IDatabaseConfigurationFlow.cs | 56 +- .../Interfaces/IIgnoreRuleConstructionFlow.cs | 62 +- .../IKeyGeneratorConfigurationFlow.cs | 74 +- .../IMappingRuleConstructionFlow.cs | 66 +- .../Internals/ConnectionInfoParser.cs | 104 +- .../Internals/DatabaseConfigurationFlow.cs | 64 +- .../DomainTypeRegistrationHandler.cs | 112 +- .../KeyGeneratorConfigurationFlow.cs | 74 +- .../Internals/MappingRuleConstructionFlow.cs | 82 +- .../Internals/NodeConfigurationExtensions.cs | 62 +- .../KeyGeneratorConfiguration.cs | 196 +- .../KeyGeneratorConfigurationCollection.cs | 124 +- .../Orm/Configuration/LetterCasePolicy.cs | 72 +- .../LinqExtensionRegistration.cs | 130 +- .../Configuration/LinqExtensionRegistry.cs | 202 +- .../Orm/Configuration/LogConfiguration.cs | 70 +- .../Orm/Configuration/LoggingConfiguration.cs | 196 +- .../Orm/Configuration/MappingRule.cs | 250 +- .../Configuration/MappingRuleCollection.cs | 142 +- .../Configuration/NameMappingCollection.cs | 262 +- .../Orm/Configuration/NamespacePolicy.cs | 92 +- .../Orm/Configuration/NamingConvention.cs | 214 +- .../Orm/Configuration/NamingRules.cs | 102 +- .../Orm/Configuration/NodeConfiguration.cs | 288 +- .../Configuration/ReaderPreloadingPolicy.cs | 72 +- .../SchemaSyncExceptionFormat.cs | 58 +- .../Orm/Configuration/SessionCacheType.cs | 68 +- .../Orm/Configuration/SessionConfiguration.cs | 672 +- .../SessionConfigurationCollection.cs | 362 +- .../Orm/Configuration/SessionOptions.cs | 294 +- .../Orm/Configuration/SessionType.cs | 86 +- .../Orm/Configuration/VersioningConvention.cs | 124 +- .../Orm/ConflictHandlingMethod.cs | 66 +- Orm/Xtensive.Orm/Orm/ConnectionInfo.cs | 262 +- Orm/Xtensive.Orm/Orm/DbCommandEventArgs.cs | 74 +- Orm/Xtensive.Orm/Orm/Delayed.cs | 182 +- Orm/Xtensive.Orm/Orm/Domain.cs | 982 +- Orm/Xtensive.Orm/Orm/DomainBound.cs | 124 +- Orm/Xtensive.Orm/Orm/DomainUpgradeMode.cs | 152 +- Orm/Xtensive.Orm/Orm/Entity.cs | 2074 +- Orm/Xtensive.Orm/Orm/EntityEventArgs.cs | 66 +- Orm/Xtensive.Orm/Orm/EntityEventBroker.cs | 520 +- Orm/Xtensive.Orm/Orm/EntityExtensions.cs | 62 +- Orm/Xtensive.Orm/Orm/EntityFieldEventArgs.cs | 72 +- .../Orm/EntityFieldValueEventArgs.cs | 72 +- .../EntityFieldValueGetCompletedEventArgs.cs | 76 +- .../EntityFieldValueSetCompletedEventArgs.cs | 78 +- .../Orm/EntityFieldValueSetEventArgs.cs | 86 +- .../Orm/EntityRemoveCompletedEventArgs.cs | 70 +- .../Orm/EntitySetActionCompletedEventArgs.cs | 72 +- Orm/Xtensive.Orm/Orm/EntitySetBase.cs | 2000 +- Orm/Xtensive.Orm/Orm/EntitySetEventArgs.cs | 68 +- .../EntitySetItemActionCompletedEventArgs.cs | 74 +- .../Orm/EntitySetItemEventArgs.cs | 72 +- Orm/Xtensive.Orm/Orm/EntitySet{T}.cs | 536 +- Orm/Xtensive.Orm/Orm/EntityState.cs | 686 +- .../Orm/EntityVersionInfoChangedEventArgs.cs | 76 +- .../CheckConstraintViolationException.cs | 110 +- .../Exceptions/ConnectionErrorException.cs | 108 +- .../ConstraintViolationException.cs | 114 +- .../Orm/Exceptions/DeadlockException.cs | 108 +- .../Orm/Exceptions/DomainBuilderException.cs | 108 +- .../Exceptions/OperationTimeoutException.cs | 110 +- .../Exceptions/QueryTranslationException.cs | 110 +- ...ReferentialConstraintViolationException.cs | 116 +- .../ReferentialIntegrityException.cs | 162 +- .../Orm/Exceptions/ReprocessableException.cs | 112 +- .../SchemaSynchronizationException.cs | 144 +- .../Orm/Exceptions/StorageException.cs | 138 +- .../Orm/Exceptions/StorageExceptionInfo.cs | 132 +- .../Orm/Exceptions/SyntaxErrorException.cs | 112 +- ...ransactionSerializationFailureException.cs | 110 +- .../UniqueConstraintViolationException.cs | 110 +- .../Exceptions/VersionConflictException.cs | 112 +- Orm/Xtensive.Orm/Orm/ForeignKeyMode.cs | 90 +- .../Orm/FullTextChangeTrackingMode.cs | 78 +- Orm/Xtensive.Orm/Orm/FullTextMatch.cs | 82 +- .../FullTextSearchCondition/GenerationType.cs | 48 +- .../Interfaces/IComplexTerm.cs | 36 +- .../Interfaces/ICustomProximityTerm.cs | 48 +- .../Interfaces/IGenerationTerm.cs | 50 +- .../Interfaces/IOperand.cs | 72 +- .../Interfaces/IOperator.cs | 180 +- .../Interfaces/IPrefixTerm.cs | 36 +- .../Interfaces/IProximityOperand.cs | 28 +- .../IProximityOperandsConstructionFlow.cs | 68 +- .../Interfaces/IProximityTerm.cs | 40 +- .../Interfaces/ISearchConditionNode.cs | 48 +- .../Interfaces/ISearchConditionNodeVisitor.cs | 38 +- .../Interfaces/ISimpleTerm.cs | 36 +- .../Interfaces/IWeighableTerm.cs | 30 +- .../Interfaces/IWeightedTerm.cs | 40 +- .../IWeightedTermConstructionFlow.cs | 166 +- .../Internals/SearchConditionNodeFactory.cs | 160 +- .../Orm/FullTextSearchCondition/Nodes/And.cs | 52 +- .../FullTextSearchCondition/Nodes/AndNot.cs | 50 +- .../Nodes/ComplexTerm.cs | 64 +- .../Nodes/ConditionEndpoint.cs | 50 +- .../Nodes/CustomProximityTerm.cs | 116 +- .../Nodes/GenerationTerm.cs | 88 +- .../Nodes/GenericProximityTerm.cs | 70 +- .../FullTextSearchCondition/Nodes/Operand.cs | 108 +- .../FullTextSearchCondition/Nodes/Operator.cs | 230 +- .../Orm/FullTextSearchCondition/Nodes/Or.cs | 50 +- .../Nodes/PrefixTerm.cs | 72 +- .../Nodes/SimpleTerm.cs | 74 +- .../Nodes/WeightedTerm.cs | 60 +- .../ProximityOperandEndpoint.cs | 114 +- .../SearchConditionNodeType.cs | 44 +- .../WeightedTermEndpoint.cs | 280 +- Orm/Xtensive.Orm/Orm/IncludeAlgorithm.cs | 52 +- .../Orm/Interfaces/ICompletableScope.cs | 52 +- .../Orm/Interfaces/IDomainService.cs | 30 +- Orm/Xtensive.Orm/Orm/Interfaces/IEntity.cs | 194 +- .../Orm/Interfaces/IFieldValueAdapter.cs | 50 +- .../Orm/Interfaces/IHasNullEntity.cs | 40 +- .../Orm/Interfaces/IHasVersionRoots.cs | 40 +- Orm/Xtensive.Orm/Orm/Interfaces/IModule.cs | 60 +- Orm/Xtensive.Orm/Orm/Interfaces/IModule2.cs | 50 +- Orm/Xtensive.Orm/Orm/Interfaces/IOperation.cs | 152 +- .../Orm/Interfaces/IOperationLogger.cs | 64 +- .../Orm/Interfaces/IOperationSequence.cs | 60 +- .../Orm/Interfaces/IPrecondition.cs | 30 +- .../Orm/Interfaces/IQueryPreprocessor.cs | 70 +- .../Orm/Interfaces/IQueryPreprocessor2.cs | 38 +- .../Orm/Interfaces/IQueryRootBuilder.cs | 56 +- .../Orm/Interfaces/ISessionBound.cs | 40 +- .../Orm/Interfaces/ISessionService.cs | 30 +- .../Orm/Interfaces/IUniqueOperation.cs | 46 +- .../Orm/Interfaces/IVersionSetProvider.cs | 48 +- .../Orm/Interfaces/KeyGenerator.cs | 62 +- .../Orm/Interfaces/TemporaryKeyGenerator.cs | 48 +- Orm/Xtensive.Orm/Orm/Internals/Activator.cs | 140 +- .../Orm/Internals/CompiledQueryRunner.cs | 452 +- .../Orm/Internals/CompletableScope{T}.cs | 158 +- .../Orm/Internals/DelayedQueryResult.cs | 156 +- .../Orm/Internals/DelayedSequence.cs | 72 +- .../Orm/Internals/EntityChangeRegistry.cs | 218 +- .../Orm/Internals/EntitySetChangeRegistry.cs | 112 +- .../Orm/Internals/EntitySetItem.cs | 152 +- .../Orm/Internals/EntitySetState.cs | 766 +- .../Orm/Internals/EntitySetTypeState.cs | 72 +- .../Orm/Internals/FieldAccessor.cs | 84 +- .../Orm/Internals/FieldAccessorProvider.cs | 128 +- .../FieldAccessors/CachingFieldAccessor.cs | 44 +- .../FieldAccessors/DefaultFieldAccessor.cs | 96 +- .../FieldAccessors/EntityFieldAccessor.cs | 112 +- .../FieldAccessors/EntitySetFieldAccessor.cs | 64 +- .../FieldAccessors/EnumFieldAccessor.cs | 100 +- .../FieldAccessors/KeyFieldAccessor.cs | 86 +- .../FieldAccessors/StructureFieldAccessor.cs | 88 +- .../Orm/Internals/FieldAccessor{T}.cs | 78 +- .../Orm/Internals/GenericKeyFactory.cs | 62 +- Orm/Xtensive.Orm/Orm/Internals/KeyFactory.cs | 330 +- .../Orm/Internals/KeyGeneratorRegistry.cs | 108 +- .../KeyGenerators/Caching/CachingSequence.cs | 142 +- .../Caching/DomainCachingSequenceProvider.cs | 74 +- .../Caching/ICachingSequenceProvider.cs | 28 +- .../Caching/SessionCachingSequenceProvider.cs | 130 +- .../GloballyUniqueValueGenerator.cs | 68 +- .../Internals/KeyGenerators/GuidGenerator.cs | 34 +- .../StorageSequentalGenerator.cs | 80 +- .../KeyGenerators/StringGenerator.cs | 34 +- .../TemporarySequentalGenerator.cs | 110 +- Orm/Xtensive.Orm/Orm/Internals/KeyRemapper.cs | 168 +- .../Orm/Internals/Key{T1,T2,T3,T4}.cs | 190 +- .../Orm/Internals/Key{T1,T2,T3}.cs | 172 +- Orm/Xtensive.Orm/Orm/Internals/Key{T1,T2}.cs | 150 +- Orm/Xtensive.Orm/Orm/Internals/Key{T}.cs | 130 +- Orm/Xtensive.Orm/Orm/Internals/LongKey.cs | 90 +- .../NonPairedReferenceChangesRegistry.cs | 588 +- .../Internals/PairIntegrity/OperationType.cs | 28 +- .../Orm/Internals/PairIntegrity/SyncAction.cs | 68 +- .../Internals/PairIntegrity/SyncActionSet.cs | 66 +- .../Internals/PairIntegrity/SyncContext.cs | 138 +- .../Internals/PairIntegrity/SyncManager.cs | 214 +- .../Orm/Internals/PersistAction.cs | 56 +- .../Orm/Internals/PersistActionGenerator.cs | 140 +- .../Orm/Internals/PersistActionKind.cs | 52 +- .../Orm/Internals/PersistReason.cs | 100 +- Orm/Xtensive.Orm/Orm/Internals/Pinner.cs | 304 +- .../Orm/Internals/Prefetch/EntityContainer.cs | 200 +- .../Orm/Internals/Prefetch/EntityGroupTask.cs | 484 +- .../Orm/Internals/Prefetch/EntitySetTask.cs | 562 +- .../Orm/Internals/Prefetch/Fetcher.cs | 238 +- .../Orm/Internals/Prefetch/GraphContainer.cs | 416 +- .../Internals/Prefetch/Nodes/BaseFieldNode.cs | 44 +- .../Internals/Prefetch/Nodes/ExpressionMap.cs | 70 +- .../Prefetch/Nodes/ExpressionMapBuilder.cs | 276 +- .../Orm/Internals/Prefetch/Nodes/FieldNode.cs | 44 +- .../Prefetch/Nodes/IHasNestedNodes.cs | 38 +- .../Prefetch/Nodes/KeyExtractorNode.cs | 108 +- .../Orm/Internals/Prefetch/Nodes/Node.cs | 144 +- .../Prefetch/Nodes/NodeAggregator.cs | 102 +- .../Internals/Prefetch/Nodes/NodeBuilder.cs | 296 +- .../Internals/Prefetch/Nodes/NodeVisitor.cs | 154 +- .../Internals/Prefetch/Nodes/ReferenceNode.cs | 98 +- .../Orm/Internals/Prefetch/Nodes/SetNode.cs | 98 +- .../Orm/Internals/Prefetch/PrefetchFacade.cs | 324 +- .../Prefetch/PrefetchFieldDescriptor.cs | 272 +- .../Orm/Internals/Prefetch/PrefetchHelper.cs | 172 +- .../Internals/Prefetch/PrefetchKeyIterator.cs | 146 +- .../Orm/Internals/Prefetch/PrefetchManager.cs | 670 +- .../Internals/Prefetch/PrefetchProcessor.cs | 60 +- .../Prefetch/ReferencedEntityContainer.cs | 262 +- .../Internals/Prefetch/RootEntityContainer.cs | 98 +- .../Prefetch/StrongReferenceContainer.cs | 148 +- .../Orm/Internals/QueryCachingScope.cs | 104 +- Orm/Xtensive.Orm/Orm/Internals/QueryTask.cs | 146 +- .../Orm/Internals/RecordSetReader.cs | 304 +- .../Orm/Internals/ReferenceFieldChangeInfo.cs | 100 +- .../ReferenceFieldsChangesRegistry.cs | 154 +- .../Orm/Internals/ReferentialActions.cs | 126 +- .../ReferentialIntegrity/ActionProcessor.cs | 28 +- .../CascadeActionProcessor.cs | 50 +- .../ClearActionProcessor.cs | 64 +- .../DenyActionProcessor.cs | 36 +- .../NoneActionProcessor.cs | 32 +- .../ReferentialIntegrity/RemovalContext.cs | 280 +- .../ReferentialIntegrity/RemovalProcessor.cs | 410 +- .../Orm/Internals/RemapContext.cs | 136 +- .../SortingPersistActionGenerator.cs | 434 +- .../Orm/Internals/StorageNodeRegistry.cs | 98 +- .../Orm/Internals/TupleExtensions.cs | 150 +- Orm/Xtensive.Orm/Orm/Internals/TypeMapping.cs | 58 +- .../Orm/Internals/VersionGenerator.cs | 144 +- Orm/Xtensive.Orm/Orm/Key.cs | 1060 +- Orm/Xtensive.Orm/Orm/KeyEventArgs.cs | 70 +- Orm/Xtensive.Orm/Orm/KeyMapping.cs | 222 +- .../Orm/Linq/ColumnExtractionModes.cs | 42 +- .../Orm/Linq/ExpressionEvaluator.cs | 264 +- .../Orm/Linq/ExpressionExtensions.cs | 448 +- .../Orm/Linq/Expressions/ColumnExpression.cs | 146 +- .../Linq/Expressions/ConstructorExpression.cs | 198 +- .../Orm/Linq/Expressions/EntityExpression.cs | 470 +- .../Linq/Expressions/EntityFieldExpression.cs | 426 +- .../Linq/Expressions/EntitySetExpression.cs | 250 +- .../Linq/Expressions/ExtendedExpression.cs | 72 +- .../Expressions/ExtendedExpressionType.cs | 60 +- .../Orm/Linq/Expressions/FieldExpression.cs | 294 +- .../Linq/Expressions/FullTextExpression.cs | 164 +- .../Linq/Expressions/GroupingExpression.cs | 228 +- .../Interfaces/IEntityExpression.cs | 28 +- .../Interfaces/IMappedExpression.cs | 38 +- .../Interfaces/IPersistentExpression.cs | 34 +- .../Expressions/ItemProjectorExpression.cs | 418 +- .../Orm/Linq/Expressions/KeyExpression.cs | 318 +- .../Expressions/LocalCollectionExpression.cs | 196 +- .../Orm/Linq/Expressions/MarkerExpression.cs | 58 +- .../Orm/Linq/Expressions/MarkerType.cs | 36 +- .../Expressions/ParameterizedExpression.cs | 90 +- .../Expressions/PersistentFieldExpression.cs | 98 +- .../Linq/Expressions/ProjectionExpression.cs | 102 +- .../Orm/Linq/Expressions/ResultType.cs | 38 +- .../Linq/Expressions/StructureExpression.cs | 366 +- .../Expressions/StructureFieldExpression.cs | 446 +- .../Linq/Expressions/SubQueryExpression.cs | 276 +- .../Visitors/ApplyParameterAccessVisitor.cs | 122 +- .../Expressions/Visitors/ColumnGatherer.cs | 488 +- .../Visitors/EntityExpressionJoiner.cs | 68 +- .../Linq/Expressions/Visitors/EnumRewriter.cs | 106 +- .../Visitors/ExtendedExpressionReplacer.cs | 338 +- .../Visitors/ExtendedExpressionVisitor.cs | 282 +- .../Visitors/GenericExpressionVisitor.cs | 122 +- .../Visitors/IncludeFilterMappingGatherer.cs | 206 +- .../Linq/Expressions/Visitors/OwnerRemover.cs | 186 +- .../Visitors/PersistentExpressionVisitor.cs | 48 +- Orm/Xtensive.Orm/Orm/Linq/FieldExtractor.cs | 154 +- Orm/Xtensive.Orm/Orm/Linq/Grouping.cs | 56 +- .../Orm/Linq/ItemToTupleConverter.cs | 70 +- .../Orm/Linq/ItemToTupleConverter{TItem}.cs | 548 +- .../Orm/Linq/LinqBindingCollection.cs | 176 +- .../Linq/LocalCollectionKeyTypeExtractor.cs | 92 +- .../Materialization/ExpressionMaterializer.cs | 1054 +- .../ItemMaterializationContext.cs | 188 +- .../Materialization/MaterializationContext.cs | 256 +- .../Materialization/MaterializationHelper.cs | 370 +- .../Materialization/MaterializationInfo.cs | 42 +- .../Interfaces/IMemberCompilerProvider.cs | 92 +- .../Interfaces/IMemberCompilerProvider{T}.cs | 94 +- .../MemberCompilerProvider-CreateCompiler.cs | 502 +- .../MemberCompilerProvider-CreateCompiler.tt | 234 +- .../MemberCompilerProvider.cs | 694 +- .../MemberCompilerProviderFactory.cs | 74 +- Orm/Xtensive.Orm/Orm/Linq/MemberType.cs | 52 +- .../Orm/Linq/Model/GroupByQuery.cs | 34 +- .../Orm/Linq/Model/QueryFactory.cs | 134 +- .../Orm/Linq/Model/QueryParser.cs | 104 +- .../Orm/Linq/Model/QueryableMethodInfo.cs | 62 +- .../Orm/Linq/ParameterExtractor.cs | 174 +- .../Orm/Linq/ParameterizedQuery.cs | 44 +- Orm/Xtensive.Orm/Orm/Linq/QueryHelper.cs | 404 +- .../Orm/Linq/QueryPreprocessor.cs | 108 +- Orm/Xtensive.Orm/Orm/Linq/QueryProvider.cs | 288 +- Orm/Xtensive.Orm/Orm/Linq/Queryable.cs | 138 +- Orm/Xtensive.Orm/Orm/Linq/RemapContext.cs | 34 +- Orm/Xtensive.Orm/Orm/Linq/RemapScope.cs | 106 +- .../Orm/Linq/Rewriters/AggregateOptimizer.cs | 568 +- .../Linq/Rewriters/ApplyParameterRewriter.cs | 204 +- .../ApplyParameterToTupleParameterRewriter.cs | 206 +- .../Linq/Rewriters/ClosureAccessRewriter.cs | 112 +- .../Linq/Rewriters/EntitySetAccessRewriter.cs | 154 +- .../Orm/Linq/Rewriters/EqualityRewriter.cs | 120 +- .../Linq/Rewriters/NullComparsionRewriter.cs | 126 +- .../Orm/Linq/Rewriters/ParameterRewriter.cs | 76 +- .../Rewriters/PersistentIndexerRewriter.cs | 220 +- .../Rewriters/SelectManySelectorRewriter.cs | 114 +- .../SubqueryDefaultResultRewriter.cs | 144 +- .../Linq/Rewriters/SubqueryFilterRemover.cs | 234 +- .../Orm/Linq/SkipOwnerCheckScope.cs | 38 +- .../Orm/Linq/SortExpressionExtractor.cs | 164 +- Orm/Xtensive.Orm/Orm/Linq/SubQuery.cs | 214 +- Orm/Xtensive.Orm/Orm/Linq/TranslatedQuery.cs | 86 +- .../Orm/Linq/TranslatedQuery{TResult}.cs | 202 +- .../Orm/Linq/Translator.Expressions.cs | 3246 +- .../Orm/Linq/Translator.Materialization.cs | 456 +- .../Orm/Linq/Translator.Queryable.cs | 3164 +- .../Orm/Linq/TranslatorContext.cs | 324 +- Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs | 342 +- Orm/Xtensive.Orm/Orm/Linq/WellKnownMembers.cs | 790 +- Orm/Xtensive.Orm/Orm/LockBehavior.cs | 66 +- Orm/Xtensive.Orm/Orm/LockMode.cs | 66 +- Orm/Xtensive.Orm/Orm/Logging/BaseLog.cs | 278 +- Orm/Xtensive.Orm/Orm/Logging/IndentManager.cs | 118 +- .../Orm/Logging/Internals/ConsoleWriter.cs | 38 +- .../Internals/DebugOnlyConsoleWriter.cs | 72 +- .../Orm/Logging/Internals/FileWriter.cs | 72 +- .../Orm/Logging/Internals/InternalLog.cs | 64 +- .../Logging/Internals/InternalLogProvider.cs | 192 +- .../Orm/Logging/Internals/LogWriter.cs | 26 +- .../Orm/Logging/Internals/NullLog.cs | 92 +- .../Orm/Logging/Internals/SystemClock.cs | 62 +- Orm/Xtensive.Orm/Orm/Logging/LogEventInfo.cs | 180 +- Orm/Xtensive.Orm/Orm/Logging/LogLevel.cs | 38 +- Orm/Xtensive.Orm/Orm/Logging/LogManager.cs | 214 +- Orm/Xtensive.Orm/Orm/Logging/LogProvider.cs | 40 +- Orm/Xtensive.Orm/Orm/Metadata/Assembly.cs | 122 +- Orm/Xtensive.Orm/Orm/Metadata/Extension.cs | 156 +- Orm/Xtensive.Orm/Orm/Metadata/MetadataBase.cs | 88 +- Orm/Xtensive.Orm/Orm/Metadata/Type.cs | 120 +- Orm/Xtensive.Orm/Orm/Model/AssociationInfo.cs | 500 +- .../Orm/Model/AssociationInfoCollection.cs | 112 +- .../Orm/Model/ColumnAttributes.cs | 56 +- Orm/Xtensive.Orm/Orm/Model/ColumnGroup.cs | 128 +- Orm/Xtensive.Orm/Orm/Model/ColumnIndexMap.cs | 98 +- Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs | 672 +- .../Orm/Model/ColumnInfoCollection.cs | 124 +- Orm/Xtensive.Orm/Orm/Model/ColumnInfoRef.cs | 314 +- Orm/Xtensive.Orm/Orm/Model/DatabaseInfo.cs | 94 +- Orm/Xtensive.Orm/Orm/Model/DomainModel.cs | 182 +- .../Orm/Model/DomainModelExtensions.cs | 86 +- Orm/Xtensive.Orm/Orm/Model/FieldAttributes.cs | 86 +- Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs | 1704 +- .../Orm/Model/FieldInfoCollection.cs | 158 +- Orm/Xtensive.Orm/Orm/Model/FieldInfoRef.cs | 252 +- Orm/Xtensive.Orm/Orm/Model/FieldMap.cs | 196 +- .../Orm/Model/FullTextColumnInfo.cs | 70 +- .../Orm/Model/FullTextColumnInfoCollection.cs | 80 +- .../Orm/Model/FullTextIndexInfo.cs | 116 +- .../Orm/Model/FullTextIndexInfoCollection.cs | 154 +- Orm/Xtensive.Orm/Orm/Model/HierarchyInfo.cs | 182 +- .../Orm/Model/HierarchyInfoCollection.cs | 46 +- Orm/Xtensive.Orm/Orm/Model/IndexAttributes.cs | 62 +- Orm/Xtensive.Orm/Orm/Model/IndexInfo.cs | 930 +- .../Orm/Model/IndexInfoCollection.cs | 124 +- Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs | 290 +- .../Orm/Model/InheritanceSchema.cs | 64 +- .../Orm/Model/Internals/TypePairComparer.cs | 114 +- Orm/Xtensive.Orm/Orm/Model/KeyField.cs | 124 +- Orm/Xtensive.Orm/Orm/Model/KeyInfo.cs | 422 +- Orm/Xtensive.Orm/Orm/Model/MappedNode.cs | 120 +- Orm/Xtensive.Orm/Orm/Model/ModelVisitor.cs | 278 +- Orm/Xtensive.Orm/Orm/Model/Multiplicity.cs | 86 +- Orm/Xtensive.Orm/Orm/Model/Node.cs | 234 +- Orm/Xtensive.Orm/Orm/Model/NodeCollection.cs | 384 +- Orm/Xtensive.Orm/Orm/Model/OnRemoveAction.cs | 94 +- .../Orm/Model/PartialIndexFilterInfo.cs | 124 +- .../Orm/Model/SchemaMappedNode.cs | 130 +- Orm/Xtensive.Orm/Orm/Model/SequenceInfo.cs | 116 +- .../Internals/ConverterToStoredModel.cs | 270 +- .../Stored/Internals/ReferenceUpdater.cs | 468 +- .../Stored/Internals/TypeMappingUpdater.cs | 46 +- .../Orm/Model/Stored/StoredAssociationInfo.cs | 184 +- .../Orm/Model/Stored/StoredDomainModel.cs | 156 +- .../Orm/Model/Stored/StoredFieldInfo.cs | 368 +- .../Orm/Model/Stored/StoredHierarchyInfo.cs | 62 +- .../Orm/Model/Stored/StoredNode.cs | 52 +- .../Stored/StoredPartialIndexFilterInfo.cs | 90 +- .../StoredPartialIndexFilterInfoCollection.cs | 84 +- .../Orm/Model/Stored/StoredTypeInfo.cs | 458 +- Orm/Xtensive.Orm/Orm/Model/TypeAttributes.cs | 108 +- .../Orm/Model/TypeDiscriminatorMap.cs | 200 +- Orm/Xtensive.Orm/Orm/Model/TypeIdRegistry.cs | 262 +- .../Orm/Model/TypeIndexInfoCollection.cs | 352 +- Orm/Xtensive.Orm/Orm/Model/TypeInfo.cs | 1728 +- .../Orm/Model/TypeInfoCollection.cs | 908 +- Orm/Xtensive.Orm/Orm/Model/TypeInfoRef.cs | 236 +- Orm/Xtensive.Orm/Orm/NotifyChangedOptions.cs | 54 +- Orm/Xtensive.Orm/Orm/Operation.cs | 332 +- Orm/Xtensive.Orm/Orm/OperationLog.cs | 362 +- Orm/Xtensive.Orm/Orm/OperationLogType.cs | 60 +- .../Orm/Operations/EntitiesRemoveOperation.cs | 152 +- .../Orm/Operations/EntityCreateOperation.cs | 180 +- .../Orm/Operations/EntityFieldOperation.cs | 136 +- .../Orm/Operations/EntityFieldSetOperation.cs | 316 +- .../Orm/Operations/EntityIdentifierType.cs | 50 +- .../Operations/EntityInitializeOperation.cs | 112 +- .../Orm/Operations/EntityOperation.cs | 76 +- .../Orm/Operations/EntitySetClearOperation.cs | 104 +- .../Operations/EntitySetItemAddOperation.cs | 106 +- .../Orm/Operations/EntitySetItemOperation.cs | 150 +- .../EntitySetItemRemoveOperation.cs | 106 +- .../Orm/Operations/EntitySetOperation.cs | 136 +- .../BlockingOperationRegistrationScope.cs | 66 +- .../Internals/OperationRegistrationScope.cs | 202 +- .../Orm/Operations/KeyGenerateOperation.cs | 240 +- .../Orm/Operations/KeyOperation.cs | 158 +- .../Orm/Operations/KeySetOperation.cs | 196 +- .../Orm/Operations/MethodCallOperation.cs | 226 +- .../Orm/Operations/OperationCapturer.cs | 304 +- .../Operations/OperationCompletedEventArgs.cs | 78 +- .../Orm/Operations/OperationEventArgs.cs | 70 +- .../Operations/OperationExecutionContext.cs | 172 +- .../Orm/Operations/OperationRegistry.cs | 892 +- .../Orm/Operations/OperationType.cs | 52 +- .../Operations/ValidateVersionOperation.cs | 222 +- Orm/Xtensive.Orm/Orm/PersistenceState.cs | 60 +- Orm/Xtensive.Orm/Orm/Persistent.cs | 1736 +- Orm/Xtensive.Orm/Orm/PersistentFieldState.cs | 48 +- Orm/Xtensive.Orm/Orm/PrefetchExtensions.cs | 156 +- .../Orm/Providers/ChainingSessionHandler.cs | 326 +- .../BatchingCommandProcessor.cs | 502 +- .../Providers/CommandProcessing/Command.cs | 296 +- .../CommandProcessing/CommandFactory.cs | 582 +- .../CommandProcessing/CommandPart.cs | 62 +- .../CommandProcessing/CommandProcessor.cs | 234 +- .../CommandProcessorContext.cs | 156 +- .../CommandProcessorFactory.cs | 102 +- .../CommandProcessing/CursorCommandFactory.cs | 80 +- .../SimpleCommandProcessor.cs | 298 +- .../CommandProcessing/SqlLoadTask.cs | 114 +- .../CommandProcessing/SqlPersistTask.cs | 148 +- .../Providers/CommandProcessing/SqlTask.cs | 38 +- .../Orm/Providers/CommandWithDataReader.cs | 72 +- .../Orm/Providers/CompilationService.cs | 130 +- .../Orm/Providers/CompilerConfiguration.cs | 44 +- .../Orm/Providers/DbCommandExtensions.cs | 86 +- .../Orm/Providers/DbDataReaderAccessor.cs | 88 +- .../Orm/Providers/DomainBoundHandler.cs | 56 +- .../Orm/Providers/DomainHandler.cs | 424 +- .../Orm/Providers/EnumerationContext.cs | 194 +- .../Orm/Providers/EnumerationScope.cs | 56 +- .../Expressions/BooleanExpressionConverter.cs | 122 +- .../ExpressionProcessor.Helpers.cs | 640 +- .../Expressions/ExpressionProcessor.cs | 968 +- .../ExpressionTranslationContext.cs | 60 +- .../ExpressionTranslationHelpers.cs | 190 +- .../Expressions/ExpressionTranslationScope.cs | 44 +- .../MemberCompilers/DateTimeCompilers.cs | 682 +- .../DateTimeOffsetCompilers.cs | 724 +- .../MemberCompilers/DecimalCompilers.cs | 818 +- .../MemberCompilers/EnumCompilers.cs | 74 +- .../MemberCompilers/GuidCompilers.cs | 58 +- .../MemberCompilers/MathCompilers.cs | 1172 +- .../MemberCompilers/NullableCompilers.cs | 142 +- .../MemberCompilers/NumericCompilers.cs | 336 +- .../MemberCompilers/StringCompilers.cs | 1014 +- .../MemberCompilers/TimeSpanCompilers.cs | 618 +- .../MemberCompilers/VBStringsCompilers.cs | 180 +- .../MemberCompilers/VbConversionsCompilers.cs | 368 +- .../MemberCompilers/VbDateAndTimeCompilers.cs | 116 +- .../Expressions/QueryParameterIdentity.cs | 156 +- Orm/Xtensive.Orm/Orm/Providers/Handler.cs | 28 +- .../Orm/Providers/HandlerAccessor.cs | 142 +- .../Orm/Providers/HandlerFactory.cs | 144 +- .../Providers/Interfaces/IDirectSqlService.cs | 98 +- .../Interfaces/IPersistDescriptor.cs | 28 +- .../Providers/Interfaces/IProviderExecutor.cs | 106 +- .../Orm/Providers/Interfaces/IQueryRequest.cs | 34 +- .../Orm/Providers/Interfaces/ISqlExecutor.cs | 144 +- .../Providers/Interfaces/ISqlTaskProcessor.cs | 48 +- .../Interfaces/IStorageSequenceAccessor.cs | 66 +- .../Orm/Providers/IsolationLevelConverter.cs | 82 +- .../Orm/Providers/MappingResolveResult.cs | 64 +- .../Orm/Providers/MappingResolver.cs | 112 +- .../Orm/Providers/ModelMapping.cs | 200 +- .../Providers/MultidatabaseMappingResolver.cs | 288 +- .../Providers/MultischemaMappingResolver.cs | 178 +- Orm/Xtensive.Orm/Orm/Providers/NameBuilder.cs | 1204 +- .../Providers/NullSearchConditionCompiler.cs | 106 +- .../Providers/PartialIndexFilterCompiler.cs | 84 +- Orm/Xtensive.Orm/Orm/Providers/Persister.cs | 244 +- .../Orm/Providers/ProviderAttribute.cs | 74 +- .../Orm/Providers/ProviderFeatures.cs | 168 +- .../Orm/Providers/ProviderInfo.cs | 194 +- .../Orm/Providers/ProviderInfoBuilder.cs | 346 +- .../Providers/Requests/ParameterBinding.cs | 82 +- .../Requests/ParameterTransmissionType.cs | 58 +- .../Requests/PersistParameterBinding.cs | 84 +- .../Requests/PersistParameterBindingType.cs | 38 +- .../Orm/Providers/Requests/PersistRequest.cs | 150 +- .../Requests/PersistRequestBuilder.cs | 514 +- .../Requests/PersistRequestBuilderContext.cs | 122 +- .../Requests/PersistRequestBuilderTask.cs | 286 +- .../Providers/Requests/PersistRequestKind.cs | 56 +- .../Requests/QueryParameterBinding.cs | 112 +- .../Requests/QueryParameterBindingType.cs | 100 +- .../Orm/Providers/Requests/QueryRequest.cs | 196 +- .../Providers/Requests/QueryRequestOptions.cs | 52 +- .../QueryRowFilterParameterBinding.cs | 60 +- .../Providers/Requests/UserQueryRequest.cs | 68 +- .../Orm/Providers/SearchConditionCompiler.cs | 62 +- .../Orm/Providers/SequenceQuery.cs | 122 +- .../Orm/Providers/SequenceQueryBuilder.cs | 288 +- .../Orm/Providers/SequenceQueryCompartment.cs | 26 +- .../Orm/Providers/SessionExtensions.cs | 50 +- .../Orm/Providers/SessionHandler.Fetching.cs | 132 +- .../Providers/SessionHandler.References.cs | 370 +- .../SessionHandler.StateManagement.cs | 74 +- .../Providers/SessionHandler.Transactions.cs | 124 +- .../Orm/Providers/SessionHandler.cs | 204 +- .../Orm/Providers/SimpleMappingResolver.cs | 114 +- .../Orm/Providers/SqlCompiler.Aggregate.cs | 146 +- .../Orm/Providers/SqlCompiler.Apply.cs | 402 +- .../Orm/Providers/SqlCompiler.Helpers.cs | 712 +- .../Orm/Providers/SqlCompiler.Include.cs | 218 +- .../Orm/Providers/SqlCompiler.Index.cs | 508 +- .../Orm/Providers/SqlCompiler.NotSupported.cs | 38 +- .../Orm/Providers/SqlCompiler.Paging.cs | 290 +- Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.cs | 1144 +- Orm/Xtensive.Orm/Orm/Providers/SqlExecutor.cs | 332 +- .../Orm/Providers/SqlIncludeProvider.cs | 164 +- Orm/Xtensive.Orm/Orm/Providers/SqlProvider.cs | 246 +- .../Orm/Providers/SqlProviderPreparer.cs | 74 +- .../Orm/Providers/SqlSelectCorrector.cs | 60 +- .../Orm/Providers/SqlSelectProcessor.cs | 1192 +- .../Providers/SqlSessionHandler.Fetching.cs | 144 +- .../SqlSessionHandler.IDirectSqlService.cs | 102 +- .../SqlSessionHandler.IProviderExecutor.cs | 134 +- .../Orm/Providers/SqlSessionHandler.cs | 592 +- .../Orm/Providers/SqlStoreProvider.cs | 114 +- .../Orm/Providers/SqlTemporaryDataProvider.cs | 112 +- .../Orm/Providers/StorageDriver.Operations.cs | 688 +- .../StorageDriver.ValueTypeMapping.cs | 98 +- .../Orm/Providers/StorageDriver.cs | 350 +- .../Orm/Providers/StorageExceptionBuilder.cs | 218 +- .../Orm/Providers/StorageSequenceAccessor.cs | 254 +- .../EmulatedTemporaryTableBackEnd.cs | 62 +- .../RealTemporaryTableBackEnd.cs | 60 +- .../TemporaryTables/TemporaryTableBackend.cs | 84 +- .../TemporaryTableDescriptor.cs | 128 +- .../TemporaryTables/TemporaryTableManager.cs | 436 +- .../TemporaryTableStateRegistry.cs | 50 +- Orm/Xtensive.Orm/Orm/Query.cs | 1398 +- Orm/Xtensive.Orm/Orm/QueryEndpoint.cs | 1710 +- Orm/Xtensive.Orm/Orm/QueryEventArgs.cs | 72 +- Orm/Xtensive.Orm/Orm/QueryRootBuilder.cs | 100 +- Orm/Xtensive.Orm/Orm/QueryableExtensions.cs | 690 +- Orm/Xtensive.Orm/Orm/Record.cs | 188 +- .../Orm/RecycledFieldDefinition.cs | 164 +- Orm/Xtensive.Orm/Orm/RecyledDefinition.cs | 30 +- Orm/Xtensive.Orm/Orm/Ref.cs | 418 +- Orm/Xtensive.Orm/Orm/ReferenceFinder.cs | 214 +- Orm/Xtensive.Orm/Orm/ReferenceInfo.cs | 100 +- Orm/Xtensive.Orm/Orm/Rse/AggregateColumn.cs | 174 +- .../Orm/Rse/AggregateColumnDescriptor.cs | 116 +- Orm/Xtensive.Orm/Orm/Rse/AggregateType.cs | 76 +- Orm/Xtensive.Orm/Orm/Rse/ApplyParameter.cs | 182 +- Orm/Xtensive.Orm/Orm/Rse/ApplySequenceType.cs | 76 +- Orm/Xtensive.Orm/Orm/Rse/CalculatedColumn.cs | 156 +- .../Orm/Rse/CalculatedColumnDescriptor.cs | 126 +- Orm/Xtensive.Orm/Orm/Rse/Column.cs | 258 +- Orm/Xtensive.Orm/Orm/Rse/ColumnCollection.cs | 182 +- .../Orm/Rse/ColumnGroupCollection.cs | 138 +- .../Orm/Rse/CompilableProviderExtensions.cs | 432 +- .../Orm/Rse/Compilation/Compiler.cs | 660 +- .../Rse/Compilation/CompositePostCompiler.cs | 64 +- .../Rse/Compilation/CompositePreCompiler.cs | 64 +- .../Orm/Rse/Compilation/EmptyPostCompiler.cs | 34 +- .../Orm/Rse/Compilation/EmptyPreCompiler.cs | 34 +- .../Rse/Compilation/Interfaces/ICompiler.cs | 50 +- .../Compilation/Interfaces/IPostCompiler.cs | 42 +- .../Compilation/Interfaces/IPreCompiler.cs | 42 +- .../Orm/Rse/IndexInfoExtensions.cs | 52 +- Orm/Xtensive.Orm/Orm/Rse/JoinType.cs | 56 +- Orm/Xtensive.Orm/Orm/Rse/MappedColumn.cs | 198 +- .../Orm/Rse/ProviderExtensions.cs | 150 +- .../Providers/Compilable/AggregateProvider.cs | 424 +- .../Rse/Providers/Compilable/AliasProvider.cs | 102 +- .../Rse/Providers/Compilable/ApplyProvider.cs | 172 +- .../Providers/Compilable/BinaryProvider.cs | 106 +- .../Providers/Compilable/CalculateProvider.cs | 182 +- .../Providers/Compilable/ConcatProvider.cs | 152 +- .../Compilable/ContainsTableProvider.cs | 152 +- .../Providers/Compilable/DistinctProvider.cs | 58 +- .../Providers/Compilable/ExceptProvider.cs | 98 +- .../Providers/Compilable/ExistenceProvider.cs | 96 +- .../Providers/Compilable/FilterProvider.cs | 124 +- .../Providers/Compilable/FreeTextProvider.cs | 148 +- .../Providers/Compilable/IncludeProvider.cs | 228 +- .../Rse/Providers/Compilable/IndexProvider.cs | 100 +- .../Providers/Compilable/IntersectProvider.cs | 98 +- .../Rse/Providers/Compilable/JoinProvider.cs | 208 +- .../Rse/Providers/Compilable/LockProvider.cs | 116 +- .../Providers/Compilable/OrderProviderBase.cs | 206 +- .../Providers/Compilable/PagingProvider.cs | 188 +- .../Compilable/PredicateJoinProvider.cs | 102 +- .../Rse/Providers/Compilable/RawProvider.cs | 144 +- .../Providers/Compilable/RowNumberProvider.cs | 120 +- .../Rse/Providers/Compilable/SeekProvider.cs | 120 +- .../Providers/Compilable/SelectProvider.cs | 122 +- .../Rse/Providers/Compilable/SkipProvider.cs | 108 +- .../Rse/Providers/Compilable/SortProvider.cs | 64 +- .../Rse/Providers/Compilable/StoreProvider.cs | 198 +- .../Rse/Providers/Compilable/TakeProvider.cs | 108 +- .../Rse/Providers/Compilable/UnaryProvider.cs | 84 +- .../Rse/Providers/Compilable/UnionProvider.cs | 152 +- .../Rse/Providers/Compilable/VoidProvider.cs | 54 +- .../Orm/Rse/Providers/CompilableProvider.cs | 50 +- .../Providers/CompilableProviderVisitor.cs | 758 +- .../Orm/Rse/Providers/EnumerationContext.cs | 238 +- .../Providers/EnumerationContextOptions.cs | 56 +- .../Orm/Rse/Providers/EnumerationScope.cs | 96 +- .../Executable/ExecutableRawProvider.cs | 100 +- .../Orm/Rse/Providers/ExecutableProvider.cs | 326 +- .../Providers/ExecutableProvider{TOrigin}.cs | 78 +- .../Interfaces/IInlinableProvider.cs | 38 +- .../Orm/Rse/Providers/Provider.cs | 294 +- .../Orm/Rse/Providers/ProviderType.cs | 84 +- .../Orm/Rse/Providers/ProviderVisitor.cs | 578 +- Orm/Xtensive.Orm/Orm/Rse/RecordSet.cs | 312 +- .../Orm/Rse/RecordSetExtensions.cs | 188 +- Orm/Xtensive.Orm/Orm/Rse/RecordSetHeader.cs | 694 +- .../Orm/Rse/RecordSetHeaderExtensions.cs | 76 +- Orm/Xtensive.Orm/Orm/Rse/SystemColumn.cs | 108 +- .../Transformation/ApplyProviderCorrector.cs | 80 +- .../Transformation/ColumnMappingInspector.cs | 998 +- .../Internals/ApplyFilterRewriter.cs | 118 +- .../Internals/ApplyParameterSearcher.cs | 86 +- .../Internals/ApplyPredicateCollector.cs | 180 +- .../ApplyProviderCorrectorRewriter.cs | 854 +- .../Internals/CalculateProviderCollector.cs | 252 +- .../CalculateRelatedExpressionRewriter.cs | 120 +- .../Internals/CollectorHelper.cs | 194 +- .../Internals/OrderingRewriter.cs | 470 +- .../Internals/ParameterRewriter.cs | 68 +- .../Internals/SkipTakeRewriter.cs | 210 +- .../Internals/SkipTakeRewriterState.cs | 180 +- .../Rse/Transformation/OrderingCorrector.cs | 84 +- .../ProviderOrderingDescriptor.cs | 120 +- .../RedundantColumnOptimizer.cs | 50 +- .../Transformation/RedundantColumnRemover.cs | 118 +- .../Rse/Transformation/SkipTakeCorrector.cs | 72 +- .../Rse/Transformation/TupleAccessGatherer.cs | 194 +- .../Rse/Transformation/TupleAccessRewriter.cs | 190 +- .../Orm/Rse/TupleExpressionExtensions.cs | 300 +- .../Serialization/DeserializationContext.cs | 282 +- .../Orm/Serialization/DeserializationScope.cs | 74 +- .../Orm/Serialization/EntityReference.cs | 104 +- .../Orm/Serialization/SerializationContext.cs | 236 +- .../Orm/Serialization/SerializationHelper.cs | 214 +- .../Orm/Serialization/SerializationKind.cs | 46 +- .../Orm/Serialization/SerializationScope.cs | 74 +- .../Orm/Services/DirectEntityAccessor.cs | 110 +- .../Orm/Services/DirectEntitySetAccessor.cs | 360 +- .../Orm/Services/DirectPersistentAccessor.cs | 534 +- .../Orm/Services/DirectSessionAccessor.cs | 186 +- .../Orm/Services/DirectSqlAccessor.cs | 130 +- .../Orm/Services/Old/DirectStateAccessor.cs | 86 +- .../Services/Old/EntitySetStateAccessor.cs | 194 +- .../Services/Old/PersistentStateAccessor.cs | 112 +- .../Orm/Services/Old/SessionStateAccessor.cs | 232 +- .../Services/QueryBuilding/QueryBuilder.cs | 256 +- .../Services/QueryBuilding/QueryCommand.cs | 190 +- .../QueryBuilding/QueryParameterBinding.cs | 122 +- .../Services/QueryBuilding/QueryRequest.cs | 92 +- .../QueryBuilding/QueryTranslationResult.cs | 70 +- .../Orm/Services/QueryFormatter.cs | 184 +- .../Orm/Services/TransactionMonitor.cs | 104 +- Orm/Xtensive.Orm/Orm/Session.Cache.cs | 578 +- Orm/Xtensive.Orm/Orm/Session.Events.cs | 194 +- Orm/Xtensive.Orm/Orm/Session.Open.cs | 334 +- Orm/Xtensive.Orm/Orm/Session.Persist.cs | 574 +- Orm/Xtensive.Orm/Orm/Session.Query.cs | 90 +- Orm/Xtensive.Orm/Orm/Session.QueryTasks.cs | 192 +- Orm/Xtensive.Orm/Orm/Session.SystemLogic.cs | 52 +- Orm/Xtensive.Orm/Orm/Session.Transactions.cs | 684 +- Orm/Xtensive.Orm/Orm/Session.Validation.cs | 78 +- Orm/Xtensive.Orm/Orm/Session.cs | 1210 +- Orm/Xtensive.Orm/Orm/SessionBound.cs | 168 +- Orm/Xtensive.Orm/Orm/SessionEventAccessor.cs | 1036 +- Orm/Xtensive.Orm/Orm/SessionEventArgs.cs | 66 +- Orm/Xtensive.Orm/Orm/SessionScope.cs | 86 +- Orm/Xtensive.Orm/Orm/StateLifetimeToken.cs | 56 +- Orm/Xtensive.Orm/Orm/StorageNode.cs | 128 +- Orm/Xtensive.Orm/Orm/StorageNodeManager.cs | 122 +- Orm/Xtensive.Orm/Orm/Structure.cs | 984 +- Orm/Xtensive.Orm/Orm/TargetKind.cs | 94 +- Orm/Xtensive.Orm/Orm/Transaction.Open.cs | 292 +- Orm/Xtensive.Orm/Orm/Transaction.cs | 574 +- Orm/Xtensive.Orm/Orm/TransactionEventArgs.cs | 66 +- Orm/Xtensive.Orm/Orm/TransactionOpenMode.cs | 58 +- Orm/Xtensive.Orm/Orm/TransactionScope.cs | 178 +- Orm/Xtensive.Orm/Orm/TransactionState.cs | 120 +- .../Orm/TransactionStateExtensions.cs | 52 +- .../Orm/TransactionalExtensions.cs | 700 +- .../Orm/TransactionalStateContainer.cs | 178 +- Orm/Xtensive.Orm/Orm/TransactionalValue.cs | 116 +- Orm/Xtensive.Orm/Orm/TypeExtensions.cs | 80 +- Orm/Xtensive.Orm/Orm/TypeReference.cs | 86 +- Orm/Xtensive.Orm/Orm/TypeReferenceAccuracy.cs | 56 +- .../Attributes/AssemblyInfoAttribute.cs | 106 +- .../Upgrade/Attributes/RecycledAttribute.cs | 86 +- .../Upgrade/DomainUpgradeModeExtensions.cs | 286 +- .../Orm/Upgrade/FullTextCatalogNameBuilder.cs | 168 +- .../Orm/Upgrade/Hints/ChangeFieldTypeHint.cs | 210 +- .../Orm/Upgrade/Hints/CopyFieldHint.cs | 404 +- .../Orm/Upgrade/Hints/MergeTypeHint.cs | 202 +- .../Orm/Upgrade/Hints/MoveFieldHint.cs | 408 +- .../Orm/Upgrade/Hints/RecycledTypeHint.cs | 178 +- .../Orm/Upgrade/Hints/RemoveFieldHint.cs | 246 +- .../Orm/Upgrade/Hints/RemoveTypeHint.cs | 160 +- .../Orm/Upgrade/Hints/RenameFieldHint.cs | 222 +- .../Orm/Upgrade/Hints/RenameTypeHint.cs | 196 +- .../Orm/Upgrade/Hints/UpgradeHint.cs | 96 +- .../Interfaces/IFullTextCatalogNameBuilder.cs | 62 +- .../Orm/Upgrade/Interfaces/IUpgradeHandler.cs | 250 +- .../Orm/Upgrade/Internals/CatalogCloner.cs | 826 +- .../Internals/DomainExtractedModelBuilder.cs | 588 +- .../Upgrade/Internals/DomainModelConverter.cs | 1276 +- .../Extensions/DomainModelExtensions.cs | 52 +- .../Extensions/MappingResolverExtensions.cs | 50 +- .../Extensions/StoredDomainModelExtensions.cs | 74 +- .../Internals/ExtractedModelBuilderFactory.cs | 50 +- .../Upgrade/Internals/HintGenerationResult.cs | 52 +- .../Orm/Upgrade/Internals/HintGenerator.cs | 1528 +- .../Upgrade/Internals/IgnoreRulesHandler.cs | 254 +- .../ISchemaExtractionResultBuilder.cs | 12 +- .../Interfaces/IUpgradeHintValidator.cs | 30 +- .../Interfaces/IUpgradeHintsProcessor.cs | 28 +- .../Orm/Upgrade/Internals/MatchingHelper.cs | 44 +- .../Internals/Metadata/AssemblyMetadata.cs | 60 +- .../Internals/Metadata/ExtensionMetadata.cs | 60 +- .../Internals/Metadata/MetadataExtractor.cs | 266 +- .../Internals/Metadata/MetadataMapping.cs | 148 +- .../Upgrade/Internals/Metadata/MetadataSet.cs | 46 +- .../Internals/Metadata/MetadataWriter.cs | 278 +- .../Internals/Metadata/TypeMetadata.cs | 76 +- .../Internals/NodeExtractedModelBuilder.cs | 146 +- .../Internals/NullUpgradeHintsProcessor.cs | 74 +- .../Upgrade/Internals/PartialIndexInfoMap.cs | 94 +- .../Orm/Upgrade/Internals/RuleMatcher.cs | 152 +- .../Orm/Upgrade/Internals/SchemaComparer.cs | 586 +- .../Orm/Upgrade/Internals/SchemaExtractor.cs | 154 +- .../Orm/Upgrade/Internals/SchemaUpgrader.cs | 198 +- .../Upgrade/Internals/SqlActionTranslator.cs | 2496 +- .../Upgrade/Internals/SqlModelConverter.cs | 1034 +- .../Orm/Upgrade/Internals/SqlWorker.cs | 266 +- .../Orm/Upgrade/Internals/SqlWorkerResult.cs | 32 +- .../Orm/Upgrade/Internals/SqlWorkerTask.cs | 42 +- .../Orm/Upgrade/Internals/StageModelFilter.cs | 88 +- .../Orm/Upgrade/Internals/TypeIdProvider.cs | 132 +- .../Internals/UpgradeActionSequenceBuilder.cs | 158 +- .../Upgrade/Internals/UpgradeHintValidator.cs | 340 +- .../Internals/UpgradeHintsProcessingResult.cs | 114 +- .../Internals/UpgradeHintsProcessor.cs | 1130 +- .../Internals/UpgradeServiceAccessor.cs | 356 +- .../Orm/Upgrade/Model/ColumnInfoCollection.cs | 60 +- .../Orm/Upgrade/Model/ColumnInfoRef.cs | 82 +- .../Model/Exceptions/IntegrityException.cs | 114 +- .../Model/Exceptions/ValidationException.cs | 186 +- .../Orm/Upgrade/Model/ForeignKeyCollection.cs | 62 +- .../Model/ForeignKeyColumnCollection.cs | 76 +- .../Orm/Upgrade/Model/ForeignKeyColumnRef.cs | 92 +- .../Orm/Upgrade/Model/ForeignKeyInfo.cs | 340 +- .../Orm/Upgrade/Model/FullTextColumnRef.cs | 116 +- .../Model/FullTextColumnRefCollection.cs | 60 +- .../Model/FullTextIndexInfoCollection.cs | 60 +- .../Orm/Upgrade/Model/IncludedColumnRef.cs | 88 +- .../Model/IncludedColumnRefCollection.cs | 58 +- .../Orm/Upgrade/Model/KeyColumnRef.cs | 110 +- .../Upgrade/Model/KeyColumnRefCollection.cs | 56 +- .../Upgrade/Model/KeyColumnRef{TParent}.cs | 168 +- .../Orm/Upgrade/Model/NodeBase.cs | 138 +- .../Orm/Upgrade/Model/NodeCollectionBase.cs | 58 +- .../Upgrade/Model/PartialIndexFilterInfo.cs | 118 +- .../Orm/Upgrade/Model/PrimaryIndexInfo.cs | 200 +- .../Orm/Upgrade/Model/PrimaryKeyColumnRef.cs | 112 +- .../Model/PrimaryKeyColumnRefCollection.cs | 56 +- Orm/Xtensive.Orm/Orm/Upgrade/Model/Ref.cs | 124 +- .../Orm/Upgrade/Model/ReferentialAction.cs | 74 +- .../Orm/Upgrade/Model/SecondaryIndexInfo.cs | 308 +- .../Model/SecondaryIndexInfoCollection.cs | 60 +- .../Upgrade/Model/SequenceInfoCollection.cs | 60 +- .../Orm/Upgrade/Model/StorageColumnInfo.cs | 240 +- .../Upgrade/Model/StorageFullTextIndexInfo.cs | 174 +- .../Orm/Upgrade/Model/StorageIndexInfo.cs | 192 +- .../Orm/Upgrade/Model/StorageModel.cs | 172 +- .../Orm/Upgrade/Model/StorageSequenceInfo.cs | 246 +- .../Orm/Upgrade/Model/StorageTypeInfo.cs | 554 +- .../Orm/Upgrade/Model/TableInfo.cs | 208 +- .../Orm/Upgrade/Model/TableInfoCollection.cs | 60 +- .../Orm/Upgrade/Model/ValueColumnRef.cs | 88 +- .../Upgrade/Model/ValueColumnRefCollection.cs | 60 +- .../Orm/Upgrade/SchemaComparisonResult.cs | 226 +- .../Orm/Upgrade/SchemaComparisonStatus.cs | 60 +- .../Orm/Upgrade/SchemaExtractionResult.cs | 78 +- .../Orm/Upgrade/SchemaUpgradeMode.cs | 98 +- .../Orm/Upgrade/SqlUpgradeStage.cs | 100 +- .../Orm/Upgrade/SystemUpgradeHandler.cs | 704 +- .../Orm/Upgrade/TypeConversionVerifier.cs | 364 +- .../Orm/Upgrade/UpgradeActionSequence.cs | 308 +- .../Orm/Upgrade/UpgradeContext.cs | 538 +- .../Orm/Upgrade/UpgradeHandler.cs | 724 +- Orm/Xtensive.Orm/Orm/Upgrade/UpgradeScope.cs | 74 +- Orm/Xtensive.Orm/Orm/Upgrade/UpgradeStage.cs | 70 +- .../Orm/Upgrade/UpgradingDomainBuilder.cs | 1286 +- Orm/Xtensive.Orm/Orm/UrlInfo.cs | 928 +- Orm/Xtensive.Orm/Orm/UrlInfoConverter.cs | 78 +- .../Validation/Constraints/EmailConstraint.cs | 90 +- .../Constraints/FutureConstraint.cs | 80 +- .../Constraints/LengthConstraint.cs | 164 +- .../Constraints/NotEmptyConstraint.cs | 78 +- .../Constraints/NotNullConstraint.cs | 58 +- .../Constraints/NotNullOrEmptyConstraint.cs | 80 +- .../Validation/Constraints/PastConstraint.cs | 78 +- .../Validation/Constraints/RangeConstraint.cs | 234 +- .../Validation/Constraints/RegexConstraint.cs | 192 +- .../Orm/Validation/EntityErrorInfo.cs | 78 +- .../Orm/Validation/EntitySetFieldValidator.cs | 64 +- .../Orm/Validation/EntityValidator.cs | 64 +- .../Exceptions/ValidationFailedException.cs | 118 +- .../Validation/Interfaces/IObjectValidator.cs | 70 +- .../Interfaces/IPropertyValidator.cs | 106 +- .../Orm/Validation/Interfaces/IValidator.cs | 16 +- .../Internals/RealValidationContext.cs | 398 +- .../Validation/Internals/ValidationContext.cs | 72 +- .../Validation/Internals/ValidationReason.cs | 26 +- .../Internals/VoidValidationContext.cs | 104 +- .../Orm/Validation/ObjectValidator.cs | 204 +- .../Orm/Validation/PropertyValidator.cs | 318 +- .../Orm/Validation/StructureFieldValidator.cs | 66 +- .../Orm/Validation/ValidationMode.cs | 70 +- .../Orm/Validation/ValidationResult.cs | 144 +- Orm/Xtensive.Orm/Orm/VersionCapturer.cs | 306 +- Orm/Xtensive.Orm/Orm/VersionInfo.cs | 392 +- Orm/Xtensive.Orm/Orm/VersionSet.cs | 654 +- Orm/Xtensive.Orm/Orm/VersionValidator.cs | 784 +- .../Orm/Weaving/EntityInterfaceAttribute.cs | 42 +- .../Orm/Weaving/EntitySetTypeAttribute.cs | 42 +- .../Orm/Weaving/EntityTypeAttribute.cs | 44 +- .../Orm/Weaving/OverrideFieldNameAttribute.cs | 62 +- .../Orm/Weaving/PersistenceImplementation.cs | 54 +- .../Orm/Weaving/ProcessedByWeaverAttribute.cs | 44 +- .../Orm/Weaving/StructureTypeAttribute.cs | 44 +- Orm/Xtensive.Orm/Orm/WellKnown.cs | 488 +- Orm/Xtensive.Orm/Properties/Visibility.cs | 62 +- .../Reflection/AttributeHelper.cs | 238 +- .../Reflection/AttributeSearchOptions.cs | 88 +- Orm/Xtensive.Orm/Reflection/DelegateHelper.cs | 1176 +- .../Reflection/ExecutionSequenceHandler.cs | 38 +- .../Reflection/InterfaceMapping.cs | 114 +- Orm/Xtensive.Orm/Reflection/MemberHelper.cs | 600 +- Orm/Xtensive.Orm/Reflection/MethodHelper.cs | 744 +- Orm/Xtensive.Orm/Reflection/SequenceHelper.cs | 122 +- Orm/Xtensive.Orm/Reflection/TypeHelper.cs | 2294 +- .../Reflection/WellKnown.Object.cs | 62 +- .../Reflection/WellKnown.Operator.cs | 294 +- .../Reflection/WellKnown.Queryable.cs | 498 +- .../Reflection/WellKnown.Tuple.cs | 264 +- Orm/Xtensive.Orm/Reflection/WellKnown.cs | 114 +- Orm/Xtensive.Orm/Sorting/ConnectionType.cs | 52 +- Orm/Xtensive.Orm/Sorting/Node.cs | 382 +- Orm/Xtensive.Orm/Sorting/NodeConnection.cs | 180 +- ...lSortResult{TNodeItem, TConnectionItem}.cs | 74 +- .../TopologicalSortResult{TNodeItem}.cs | 66 +- Orm/Xtensive.Orm/Sorting/TopologicalSorter.cs | 492 +- .../Sql/Compiler/Internals/Compressor.cs | 412 +- .../Sql/Compiler/Internals/ContextType.cs | 22 +- .../Sql/Compiler/Internals/JoinSequence.cs | 148 +- .../Sql/Compiler/Internals/NodeVisitor.cs | 110 +- .../Compiler/Internals/Nodes/ContainerNode.cs | 146 +- .../Compiler/Internals/Nodes/CycleItemNode.cs | 50 +- .../Sql/Compiler/Internals/Nodes/CycleNode.cs | 54 +- .../Compiler/Internals/Nodes/DelimiterNode.cs | 54 +- .../Sql/Compiler/Internals/Nodes/Node.cs | 30 +- .../Internals/Nodes/PlaceholderNode.cs | 44 +- .../Sql/Compiler/Internals/Nodes/TextNode.cs | 50 +- .../Compiler/Internals/Nodes/VariantNode.cs | 54 +- .../Sql/Compiler/Internals/PostCompiler.cs | 176 +- .../RecursiveBinaryLogicExtractor.cs | 70 +- .../Sql/Compiler/SqlCompilationResult.cs | 170 +- Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs | 3488 +- .../Sql/Compiler/SqlCompilerConfiguration.cs | 134 +- .../Sql/Compiler/SqlCompilerContext.cs | 306 +- .../Sql/Compiler/SqlCompilerException.cs | 74 +- .../Sql/Compiler/SqlCompilerNamingOptions.cs | 36 +- .../Sql/Compiler/SqlCompilerNamingScope.cs | 64 +- .../Sql/Compiler/SqlCompilerOutputScope.cs | 64 +- .../Sql/Compiler/SqlDelimiterType.cs | 26 +- .../Sql/Compiler/SqlNodeActualizer.cs | 100 +- .../Sql/Compiler/SqlNodeSections.cs | 562 +- .../Sql/Compiler/SqlParameterNameProvider.cs | 100 +- .../Compiler/SqlPostCompilerConfiguration.cs | 62 +- .../Sql/Compiler/SqlTableNameProvider.cs | 206 +- .../Sql/Compiler/SqlTranslator.cs | 3710 +- Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAction.cs | 46 +- .../Sql/Ddl/Actions/SqlAddColumn.cs | 66 +- .../Sql/Ddl/Actions/SqlAddConstraint.cs | 66 +- .../Sql/Ddl/Actions/SqlAlterIdentityInfo.cs | 70 +- .../Sql/Ddl/Actions/SqlCascadableAction.cs | 44 +- .../Sql/Ddl/Actions/SqlDropColumn.cs | 80 +- .../Sql/Ddl/Actions/SqlDropConstraint.cs | 80 +- .../Sql/Ddl/Actions/SqlDropDefault.cs | 66 +- .../Sql/Ddl/Actions/SqlRenameColumn.cs | 70 +- .../Sql/Ddl/Actions/SqlSetDefault.cs | 68 +- .../Ddl/Misc/SqlAlterIdentityInfoOptions.cs | 42 +- .../Misc/SqlAlterPartitionFunctionOption.cs | 30 +- .../Sql/Ddl/Misc/SqlCommandType.cs | 32 +- Orm/Xtensive.Orm/Sql/Ddl/SqlAlterDomain.cs | 104 +- .../Sql/Ddl/SqlAlterPartitionFunction.cs | 116 +- .../Sql/Ddl/SqlAlterPartitionScheme.cs | 102 +- Orm/Xtensive.Orm/Sql/Ddl/SqlAlterSequence.cs | 124 +- Orm/Xtensive.Orm/Sql/Ddl/SqlAlterTable.cs | 104 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCommand.cs | 74 +- .../Sql/Ddl/SqlCreateAssertion.cs | 84 +- .../Sql/Ddl/SqlCreateCharcterSet.cs | 84 +- .../Sql/Ddl/SqlCreateCollation.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateDomain.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateIndex.cs | 78 +- .../Sql/Ddl/SqlCreatePartitionFunction.cs | 86 +- .../Sql/Ddl/SqlCreatePartitionScheme.cs | 86 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSchema.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSequence.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTable.cs | 84 +- .../Sql/Ddl/SqlCreateTranslation.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlCreateView.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropAssertion.cs | 84 +- .../Sql/Ddl/SqlDropCharacterSet.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropCollation.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropDomain.cs | 116 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropIndex.cs | 166 +- .../Sql/Ddl/SqlDropPartitionFunction.cs | 86 +- .../Sql/Ddl/SqlDropPartitionScheme.cs | 86 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropSchema.cs | 116 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropSequence.cs | 120 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropTable.cs | 116 +- .../Sql/Ddl/SqlDropTranslation.cs | 84 +- Orm/Xtensive.Orm/Sql/Ddl/SqlDropView.cs | 116 +- Orm/Xtensive.Orm/Sql/Ddl/SqlRenameTable.cs | 82 +- .../Dml/Collections/SqlColumnCollection.cs | 322 +- .../Sql/Dml/Collections/SqlOrderCollection.cs | 72 +- .../Collections/SqlTableColumnCollection.cs | 218 +- .../Sql/Dml/Expressions/SqlAggregate.cs | 132 +- .../Sql/Dml/Expressions/SqlArray.cs | 58 +- .../Sql/Dml/Expressions/SqlArray{T}.cs | 136 +- .../Sql/Dml/Expressions/SqlBetween.cs | 160 +- .../Sql/Dml/Expressions/SqlBinary.cs | 236 +- .../Sql/Dml/Expressions/SqlCase.cs | 296 +- .../Sql/Dml/Expressions/SqlCast.cs | 94 +- .../Sql/Dml/Expressions/SqlCollate.cs | 134 +- .../Sql/Dml/Expressions/SqlColumn.cs | 132 +- .../Sql/Dml/Expressions/SqlColumnRef.cs | 128 +- .../Sql/Dml/Expressions/SqlColumnStub.cs | 90 +- .../Sql/Dml/Expressions/SqlConcat.cs | 104 +- .../Sql/Dml/Expressions/SqlContainer.cs | 102 +- .../Sql/Dml/Expressions/SqlCursor.cs | 374 +- .../Dml/Expressions/SqlCustomFunctionCall.cs | 148 +- .../Sql/Dml/Expressions/SqlDefaultValue.cs | 66 +- .../Sql/Dml/Expressions/SqlDynamicFilter.cs | 110 +- .../Sql/Dml/Expressions/SqlExpression.cs | 472 +- .../Sql/Dml/Expressions/SqlExpressionList.cs | 218 +- .../Sql/Dml/Expressions/SqlExtract.cs | 156 +- .../Sql/Dml/Expressions/SqlFunctionCall.cs | 146 +- .../Sql/Dml/Expressions/SqlLike.cs | 186 +- .../Sql/Dml/Expressions/SqlLiteral.cs | 56 +- .../Sql/Dml/Expressions/SqlLiteral{T}.cs | 106 +- .../Sql/Dml/Expressions/SqlMatch.cs | 180 +- .../Sql/Dml/Expressions/SqlNative.cs | 580 +- .../Sql/Dml/Expressions/SqlNextValue.cs | 146 +- .../Sql/Dml/Expressions/SqlNull.cs | 66 +- .../Sql/Dml/Expressions/SqlParameterRef.cs | 112 +- .../Sql/Dml/Expressions/SqlPlaceholder.cs | 88 +- .../Sql/Dml/Expressions/SqlRound.cs | 114 +- .../Sql/Dml/Expressions/SqlRow.cs | 104 +- .../Sql/Dml/Expressions/SqlRowNumber.cs | 98 +- .../Sql/Dml/Expressions/SqlSubQuery.cs | 124 +- .../Sql/Dml/Expressions/SqlTableColumn.cs | 104 +- .../Sql/Dml/Expressions/SqlTrim.cs | 152 +- .../Sql/Dml/Expressions/SqlUnary.cs | 108 +- .../Sql/Dml/Expressions/SqlUserColumn.cs | 112 +- .../Dml/Expressions/SqlUserFunctionCall.cs | 134 +- .../Sql/Dml/Expressions/SqlVariable.cs | 138 +- .../Sql/Dml/Expressions/SqlVariant.cs | 100 +- Orm/Xtensive.Orm/Sql/Dml/Extensions.cs | 110 +- .../Sql/Dml/Hints/SqlFastFirstRowsHint.cs | 78 +- .../Sql/Dml/Hints/SqlForceJoinOrderHint.cs | 100 +- Orm/Xtensive.Orm/Sql/Dml/Hints/SqlHint.cs | 36 +- Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs | 96 +- .../Sql/Dml/Hints/SqlJoinMethod.cs | 142 +- .../Sql/Dml/Hints/SqlNativeHint.cs | 78 +- Orm/Xtensive.Orm/Sql/Dml/SqlContainsTable.cs | 210 +- .../Sql/Dml/SqlCustomFunctionType.cs | 126 +- .../Sql/Dml/SqlDateTimeOffsetPart.cs | 60 +- Orm/Xtensive.Orm/Sql/Dml/SqlDateTimePart.cs | 52 +- Orm/Xtensive.Orm/Sql/Dml/SqlFetchOption.cs | 38 +- Orm/Xtensive.Orm/Sql/Dml/SqlFragment.cs | 72 +- Orm/Xtensive.Orm/Sql/Dml/SqlFreeTextTable.cs | 218 +- Orm/Xtensive.Orm/Sql/Dml/SqlFunctionType.cs | 182 +- Orm/Xtensive.Orm/Sql/Dml/SqlIntervalPart.cs | 42 +- Orm/Xtensive.Orm/Sql/Dml/SqlJoinExpression.cs | 156 +- Orm/Xtensive.Orm/Sql/Dml/SqlJoinType.cs | 60 +- Orm/Xtensive.Orm/Sql/Dml/SqlJoinedTable.cs | 158 +- Orm/Xtensive.Orm/Sql/Dml/SqlLockType.cs | 40 +- Orm/Xtensive.Orm/Sql/Dml/SqlMatchType.cs | 80 +- Orm/Xtensive.Orm/Sql/Dml/SqlOrder.cs | 130 +- Orm/Xtensive.Orm/Sql/Dml/SqlQueryRef.cs | 188 +- Orm/Xtensive.Orm/Sql/Dml/SqlTable.cs | 312 +- Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs | 166 +- Orm/Xtensive.Orm/Sql/Dml/SqlTrimType.cs | 32 +- .../Sql/Dml/Statements/SqlAssignment.cs | 110 +- .../Sql/Dml/Statements/SqlBatch.cs | 266 +- .../Sql/Dml/Statements/SqlBreak.cs | 54 +- .../Sql/Dml/Statements/SqlCloseCursor.cs | 80 +- .../Sql/Dml/Statements/SqlContinue.cs | 54 +- .../Sql/Dml/Statements/SqlDeclareCursor.cs | 72 +- .../Sql/Dml/Statements/SqlDeclareVariable.cs | 88 +- .../Sql/Dml/Statements/SqlDelete.cs | 200 +- .../Sql/Dml/Statements/SqlFetch.cs | 154 +- Orm/Xtensive.Orm/Sql/Dml/Statements/SqlIf.cs | 170 +- .../Sql/Dml/Statements/SqlInsert.cs | 176 +- .../Sql/Dml/Statements/SqlOpenCursor.cs | 78 +- .../Sql/Dml/Statements/SqlQueryExpression.cs | 238 +- .../Sql/Dml/Statements/SqlQueryStatement.cs | 78 +- .../Sql/Dml/Statements/SqlSelect.cs | 622 +- .../Sql/Dml/Statements/SqlStatementBlock.cs | 246 +- .../Sql/Dml/Statements/SqlUpdate.cs | 222 +- .../Sql/Dml/Statements/SqlWhile.cs | 138 +- Orm/Xtensive.Orm/Sql/Info/ColumnFeatures.cs | 88 +- Orm/Xtensive.Orm/Sql/Info/ColumnInfo.cs | 58 +- .../Info/Constaints/AssertConstraintInfo.cs | 28 +- .../Constaints/CheckConstraintFeatures.cs | 54 +- .../Info/Constaints/CheckConstraintInfo.cs | 84 +- .../Constaints/ForeignKeyConstraintActions.cs | 108 +- .../ForeignKeyConstraintFeatures.cs | 56 +- .../Constaints/ForeignKeyConstraintInfo.cs | 84 +- .../PrimaryKeyConstraintFeatures.cs | 64 +- .../Constaints/PrimaryKeyConstraintInfo.cs | 90 +- .../Constaints/UniqueConstraintFeatures.cs | 64 +- .../Info/Constaints/UniqueConstraintInfo.cs | 58 +- Orm/Xtensive.Orm/Sql/Info/CoreServerInfo.cs | 174 +- .../Sql/Info/DataTypeCollection.cs | 518 +- Orm/Xtensive.Orm/Sql/Info/DataTypeFeatures.cs | 196 +- Orm/Xtensive.Orm/Sql/Info/DataTypeInfo.cs | 272 +- Orm/Xtensive.Orm/Sql/Info/DdlStatements.cs | 118 +- .../Sql/Info/DefaultSchemaInfo.cs | 68 +- Orm/Xtensive.Orm/Sql/Info/EntityInfo.cs | 90 +- .../Sql/Info/FeaturesExtensions.cs | 206 +- .../Sql/Info/FullTextSearchFeatures.cs | 56 +- .../Sql/Info/FullTextSearchInfo.cs | 58 +- Orm/Xtensive.Orm/Sql/Info/IdentityFeatures.cs | 106 +- Orm/Xtensive.Orm/Sql/Info/IdentityInfo.cs | 56 +- Orm/Xtensive.Orm/Sql/Info/IndexFeatures.cs | 136 +- Orm/Xtensive.Orm/Sql/Info/IndexInfo.cs | 130 +- Orm/Xtensive.Orm/Sql/Info/IsolationLevels.cs | 98 +- Orm/Xtensive.Orm/Sql/Info/PartitionMethods.cs | 100 +- Orm/Xtensive.Orm/Sql/Info/QueryFeatures.cs | 320 +- Orm/Xtensive.Orm/Sql/Info/QueryInfo.cs | 174 +- Orm/Xtensive.Orm/Sql/Info/SequenceFeatures.cs | 68 +- Orm/Xtensive.Orm/Sql/Info/SequenceInfo.cs | 62 +- Orm/Xtensive.Orm/Sql/Info/ServerFeatures.cs | 200 +- Orm/Xtensive.Orm/Sql/Info/ServerInfo.cs | 486 +- .../Sql/Info/ServerInfoProvider.cs | 314 +- Orm/Xtensive.Orm/Sql/Info/TableInfo.cs | 80 +- .../Sql/Info/TemporaryTableFeatures.cs | 82 +- .../Sql/Info/TemporaryTableInfo.cs | 82 +- Orm/Xtensive.Orm/Sql/Info/ValueRange.Types.cs | 162 +- Orm/Xtensive.Orm/Sql/Info/ValueRange.cs | 72 +- Orm/Xtensive.Orm/Sql/Info/ValueRange{T}.cs | 170 +- Orm/Xtensive.Orm/Sql/Info/ViewFeatures.cs | 64 +- .../Sql/Interfaces/IBinaryLargeObject.cs | 42 +- .../Sql/Interfaces/ICharacterLargeObject.cs | 42 +- .../Sql/Interfaces/ILargeObject.cs | 96 +- .../Sql/Interfaces/ISqlCompileUnit.cs | 26 +- .../Sql/Interfaces/ISqlCursorFetchTarget.cs | 24 +- Orm/Xtensive.Orm/Sql/Interfaces/ISqlLValue.cs | 24 +- Orm/Xtensive.Orm/Sql/Interfaces/ISqlNode.cs | 32 +- .../Sql/Interfaces/ISqlQueryExpression.cs | 42 +- .../Sql/Interfaces/ISqlVisitor.cs | 220 +- .../Sql/Internals/SqlNodeCloneContext.cs | 38 +- .../Sql/Internals/SqlValidator.cs | 478 +- Orm/Xtensive.Orm/Sql/Model/Action.cs | 40 +- Orm/Xtensive.Orm/Sql/Model/BoundaryType.cs | 58 +- Orm/Xtensive.Orm/Sql/Model/Catalog.cs | 412 +- Orm/Xtensive.Orm/Sql/Model/CatalogHelper.cs | 66 +- Orm/Xtensive.Orm/Sql/Model/CatalogNode.cs | 270 +- .../Sql/Model/ChangeTrackingMode.cs | 78 +- Orm/Xtensive.Orm/Sql/Model/CharacterSet.cs | 76 +- Orm/Xtensive.Orm/Sql/Model/CheckOptions.cs | 82 +- Orm/Xtensive.Orm/Sql/Model/Collation.cs | 80 +- .../Sql/Model/Constraints/Assertion.cs | 176 +- .../Sql/Model/Constraints/CheckConstraint.cs | 42 +- .../Sql/Model/Constraints/Constraint.cs | 252 +- .../Model/Constraints/DefaultConstraint.cs | 74 +- .../Sql/Model/Constraints/DomainConstraint.cs | 110 +- .../Sql/Model/Constraints/ForeignKey.cs | 224 +- .../Sql/Model/Constraints/PrimaryKey.cs | 40 +- .../Sql/Model/Constraints/TableConstraint.cs | 136 +- .../Sql/Model/Constraints/UniqueConstraint.cs | 116 +- Orm/Xtensive.Orm/Sql/Model/DataTable.cs | 184 +- Orm/Xtensive.Orm/Sql/Model/DataTableColumn.cs | 54 +- Orm/Xtensive.Orm/Sql/Model/DataTableNode.cs | 140 +- Orm/Xtensive.Orm/Sql/Model/Domain.cs | 288 +- Orm/Xtensive.Orm/Sql/Model/Extractor.cs | 224 +- Orm/Xtensive.Orm/Sql/Model/FullTextIndex.cs | 164 +- Orm/Xtensive.Orm/Sql/Model/Index.cs | 498 +- Orm/Xtensive.Orm/Sql/Model/IndexColumn.cs | 318 +- .../Sql/Model/Interfaces/IConstrainable.cs | 40 +- .../Sql/Model/Interfaces/IPairedNode.cs | 38 +- .../Sql/Model/Interfaces/IPartitionable.cs | 34 +- .../Sql/Model/Interfaces/IPermission.cs | 32 +- .../Sql/Model/Interfaces/ISequenceable.cs | 36 +- Orm/Xtensive.Orm/Sql/Model/Language.cs | 36 +- Orm/Xtensive.Orm/Sql/Model/Node.cs | 152 +- Orm/Xtensive.Orm/Sql/Model/NodeCollection.cs | 174 +- .../Sql/Model/PairedNodeCollection.cs | 154 +- Orm/Xtensive.Orm/Sql/Model/PartitionMethod.cs | 86 +- .../Sql/Model/Partitioning/HashPartition.cs | 46 +- .../Sql/Model/Partitioning/ListPartition.cs | 58 +- .../Sql/Model/Partitioning/Partition.cs | 152 +- .../Model/Partitioning/PartitionDescriptor.cs | 366 +- .../Model/Partitioning/PartitionFunction.cs | 180 +- .../Sql/Model/Partitioning/PartitionSchema.cs | 154 +- .../Sql/Model/Partitioning/RangePartition.cs | 82 +- .../Sql/Model/ReferentialAction.cs | 98 +- Orm/Xtensive.Orm/Sql/Model/Schema.cs | 552 +- Orm/Xtensive.Orm/Sql/Model/SchemaNode.cs | 132 +- Orm/Xtensive.Orm/Sql/Model/Sequence.cs | 156 +- .../Sql/Model/SequenceDescriptor.cs | 428 +- Orm/Xtensive.Orm/Sql/Model/SpatialIndex.cs | 44 +- Orm/Xtensive.Orm/Sql/Model/SqlModelVisitor.cs | 692 +- Orm/Xtensive.Orm/Sql/Model/Table.cs | 432 +- Orm/Xtensive.Orm/Sql/Model/TableColumn.cs | 424 +- Orm/Xtensive.Orm/Sql/Model/TemporaryTable.cs | 134 +- Orm/Xtensive.Orm/Sql/Model/Translation.cs | 78 +- Orm/Xtensive.Orm/Sql/Model/View.cs | 272 +- Orm/Xtensive.Orm/Sql/Model/ViewColumn.cs | 138 +- Orm/Xtensive.Orm/Sql/SqlConnection.cs | 742 +- Orm/Xtensive.Orm/Sql/SqlDdl.cs | 898 +- Orm/Xtensive.Orm/Sql/SqlDml.cs | 4146 +- Orm/Xtensive.Orm/Sql/SqlDriver.cs | 768 +- Orm/Xtensive.Orm/Sql/SqlDriverBound.cs | 58 +- .../Sql/SqlDriverConfiguration.cs | 96 +- Orm/Xtensive.Orm/Sql/SqlDriverFactory.cs | 210 +- Orm/Xtensive.Orm/Sql/SqlExceptionInfo.cs | 202 +- Orm/Xtensive.Orm/Sql/SqlExceptionType.cs | 116 +- Orm/Xtensive.Orm/Sql/SqlExtensions.cs | 104 +- Orm/Xtensive.Orm/Sql/SqlExtractionResult.cs | 48 +- Orm/Xtensive.Orm/Sql/SqlExtractionTask.cs | 88 +- Orm/Xtensive.Orm/Sql/SqlHelper.cs | 874 +- Orm/Xtensive.Orm/Sql/SqlNode.cs | 82 +- Orm/Xtensive.Orm/Sql/SqlNodeType.cs | 228 +- Orm/Xtensive.Orm/Sql/SqlStatement.cs | 38 +- Orm/Xtensive.Orm/Sql/SqlType.cs | 424 +- Orm/Xtensive.Orm/Sql/SqlValueType.cs | 482 +- .../Sql/ValueTypeMapping/CustomTypeMapper.cs | 50 +- .../Sql/ValueTypeMapping/TypeMapper.cs | 848 +- .../Sql/ValueTypeMapping/TypeMapping.cs | 122 +- .../ValueTypeMapping/TypeMappingRegistry.cs | 130 +- .../TypeMappingRegistryBuilder.cs | 124 +- .../ValueTypeMapping/ValueRangeValidator.cs | 120 +- Orm/Xtensive.Orm/Strings.Designer.cs | 20002 +- Orm/Xtensive.Orm/Strings.resx | 6854 +- Orm/Xtensive.Orm/Tuples/AccessorDelegates.cs | 56 +- Orm/Xtensive.Orm/Tuples/DifferentialTuple.cs | 468 +- Orm/Xtensive.Orm/Tuples/FastReadOnlyTuple.cs | 174 +- Orm/Xtensive.Orm/Tuples/Interfaces/ITuple.cs | 158 +- .../Tuples/Interfaces/ITupleFactory.cs | 38 +- Orm/Xtensive.Orm/Tuples/MergeBehavior.cs | 56 +- .../Tuples/Packed/FieldPackingType.cs | 26 +- .../Tuples/Packed/PackedFieldAccessor.cs | 1120 +- .../Tuples/Packed/PackedFieldDescriptor.cs | 64 +- Orm/Xtensive.Orm/Tuples/Packed/PackedTuple.cs | 286 +- Orm/Xtensive.Orm/Tuples/ReferencedTuple.cs | 140 +- Orm/Xtensive.Orm/Tuples/RegularTuple.cs | 56 +- .../Tuples/Transform/CombineTransform.cs | 172 +- .../Tuples/Transform/CutInTransform.cs | 224 +- .../Tuples/Transform/CutInTransform{T}.cs | 110 +- .../Tuples/Transform/CutOutTransform.cs | 178 +- .../Transform/Interfaces/ITupleTransform.cs | 90 +- .../Transform/Internals/MapTransformTuple.cs | 172 +- .../Transform/Internals/MapTransformTuple1.cs | 192 +- .../Transform/Internals/MapTransformTuple3.cs | 202 +- .../Internals/ReadOnlyTransformTuple.cs | 138 +- .../Tuples/Transform/MapTransform.cs | 638 +- .../Tuples/Transform/ReadOnlyTransform.cs | 162 +- .../Tuples/Transform/SegmentTransform.cs | 142 +- .../Tuples/Transform/TransformedTuple.cs | 96 +- .../TransformedTuple{TTupleTransform}.cs | 100 +- .../Tuples/Transform/TupleTransformBase.cs | 110 +- .../Tuples/Transform/TupleTransformType.cs | 70 +- .../Transform/WrappingTransformTupleBase.cs | 176 +- Orm/Xtensive.Orm/Tuples/Tuple.cs | 1198 +- Orm/Xtensive.Orm/Tuples/TupleDescriptor.cs | 624 +- Orm/Xtensive.Orm/Tuples/TupleExtensions.cs | 1114 +- Orm/Xtensive.Orm/Tuples/TupleFieldState.cs | 64 +- .../Tuples/TupleFieldStateExtensions.cs | 124 +- .../Tuples/TupleFormatExtensions.cs | 296 +- Orm/Xtensive.Orm/Tuples/TupleUpdater.cs | 102 +- Orm/Xtensive.Orm/Xtensive.Orm.csproj | 162 +- TestFileForBuildServerTests.txt | 4 +- Version.props | 18 +- Weaver/Xtensive.Orm.Weaver/AccessorKind.cs | 26 +- Weaver/Xtensive.Orm.Weaver/ActionResult.cs | 26 +- .../Application/ConsoleMessageWriter.cs | 34 +- .../Application/ExitCode.cs | 30 +- .../Application/Program.cs | 174 +- Weaver/Xtensive.Orm.Weaver/AssemblyChecker.cs | 78 +- .../Xtensive.Orm.Weaver/AssemblyProcessor.cs | 182 +- .../Xtensive.Orm.Weaver/AssemblyResolver.cs | 216 +- Weaver/Xtensive.Orm.Weaver/Extensions.cs | 126 +- Weaver/Xtensive.Orm.Weaver/FileHelper.cs | 134 +- .../FrameworkAssemblyList.cs | 306 +- .../Internals/CsPropertyChecker.cs | 84 +- .../Internals/IPersistentPropertyChecker.cs | 52 +- .../Internals/VbPropertyChecker.cs | 44 +- Weaver/Xtensive.Orm.Weaver/MessageCode.cs | 54 +- Weaver/Xtensive.Orm.Weaver/MessageLocation.cs | 90 +- Weaver/Xtensive.Orm.Weaver/MessageLogger.cs | 214 +- Weaver/Xtensive.Orm.Weaver/MessageType.cs | 26 +- Weaver/Xtensive.Orm.Weaver/MessageWriter.cs | 26 +- .../NetStandardAssemblyList.cs | 246 +- .../Xtensive.Orm.Weaver/PersistentTypeKind.cs | 32 +- .../ProcessorConfiguration.cs | 352 +- .../Xtensive.Orm.Weaver/ProcessorContext.cs | 124 +- .../Xtensive.Orm.Weaver/ProcessorMessage.cs | 148 +- Weaver/Xtensive.Orm.Weaver/ProcessorStage.cs | 34 +- .../ProcessorStageAttribute.cs | 44 +- Weaver/Xtensive.Orm.Weaver/PropertyInfo.cs | 194 +- .../Xtensive.Orm.Weaver/ReferenceRegistry.cs | 124 +- Weaver/Xtensive.Orm.Weaver/SourceLanguage.cs | 30 +- .../StageFailedException.cs | 26 +- .../Stages/ExecuteWeavingTasksStage.cs | 44 +- .../Stages/FindPersistentTypesStage.cs | 440 +- .../Stages/ImportReferencesStage.cs | 342 +- .../Stages/LoadAssemblyStage.cs | 96 +- .../Stages/MarkAssemblyStage.cs | 38 +- .../Stages/ModifyPersistentTypesStage.cs | 286 +- .../RegisterFrameworkAssembliesStage.cs | 38 +- .../RegisterNetStandardAssembliesStage.cs | 38 +- .../Stages/SaveAssemblyStage.cs | 124 +- .../Stages/TransformAssemblyStage.cs | 136 +- .../Stages/WriteStampStage.cs | 44 +- .../Stages/WriteStatusStage.cs | 108 +- .../Tasks/AddAttributeTask.cs | 86 +- .../Tasks/ImplementFactoryTask.cs | 218 +- .../Tasks/ImplementFieldAccessorTask.cs | 180 +- .../ImplementInitializablePatternTask.cs | 258 +- .../Tasks/ImplementKeySetterTask.cs | 80 +- .../Tasks/RemoveBackingFieldTask.cs | 98 +- Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs | 134 +- Weaver/Xtensive.Orm.Weaver/TypeInfo.cs | 172 +- Weaver/Xtensive.Orm.Weaver/WeavingHelper.cs | 216 +- Weaver/Xtensive.Orm.Weaver/WeavingTask.cs | 24 +- Weaver/Xtensive.Orm.Weaver/WellKnown.cs | 104 +- .../Xtensive.Orm.Weaver.csproj | 34 +- 3363 files changed, 596205 insertions(+), 596205 deletions(-) diff --git a/.gitignore b/.gitignore index eb7bd0eaf1..792bfb4f9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,29 @@ -*.suo -*.user -*.csproj.user -*.sln.cache -*.cache -*.resharper -*.ReSharper -*.resharperoptions -_ReSharper.* -*.vs10x -*.DotSettings -*.exe -*.dll -*.obj -*.pdb -*.HxS -*.chm -*.xml -*.mshc -*.orig -*.log -bin -Bin -obj -_Build -_Work -.vs -.idea -User.Directory.Build.props +*.suo +*.user +*.csproj.user +*.sln.cache +*.cache +*.resharper +*.ReSharper +*.resharperoptions +_ReSharper.* +*.vs10x +*.DotSettings +*.exe +*.dll +*.obj +*.pdb +*.HxS +*.chm +*.xml +*.mshc +*.orig +*.log +bin +Bin +obj +_Build +_Work +.vs +.idea +User.Directory.Build.props diff --git a/ChangeLog/0.0.0.txt b/ChangeLog/0.0.0.txt index e77d64ff96..875f6abd50 100644 --- a/ChangeLog/0.0.0.txt +++ b/ChangeLog/0.0.0.txt @@ -1,479 +1,479 @@ -Changes in 5.0.17 Final - - -Changes in 5.0.17 Beta_2 - -[main] Add sharing of one Sql Model across Storage Nodes - -Changes in 5.0.17 Beta_1 - -[main] Decreased amout of metadata extracted for Domains or Storage nodes building in DomainUpgradeMode.Skip - -Changes in 5.0.16 Final - -[main] Fixed error which might appear on constraints validation - -Changes in 5.0.16 Beta_1 - -[main] Added constraint option allowing to skip the constraint if the field isn't changed -[main] DifferentialTuple.Merge() operation no longer cause StackOverflow exception -[main] Fixed certain cases of foreign key absence for reference fields of structures -[main] Fixed translation of enum value as default field value -[sqlserver] Fixed extraction of information about indexes from database - -Changes in 5.0.15 Final - -[sqlserver] Added change tracking settings for full-text indexes -[sqlserver] Added API for specifying catalog name for full-text indexes - -Changes in 5.0.14 Final - -[main] Returned expected behavior of delayed queries which was changed in 5.0.11 by bug fix for IN operation. -[main] Fixed bug when Server profile sesions allowed to query database without transaction. -[mysql] Corrected column types' extraction. - -Changes in 5.0.13 Final - -[main] Fixed rare situation when all LinQ queries might be corrupted untill application restart -[main] Fixed case when contatination of two queries with Enum constants might cause error on translation -[mysql] Added support for SQL batches - -Changes in 5.0.12 Final - -[main] Fixed bug when implicit Store operation didn't create temporary table -[sqlserver] Fixed certain cases of incorrect rounding of decimals - -Changes in 5.0.11 Final - -[main] Constraints can be skipped on transaction commit -[main] Operations like EntitySet.ToList() no longer lead to incorrect EntitySet.Count value -[main] IN() operation now creates temporary tables when it supposes to -[main] Fixed translations of aggregates like IQueriable.Sum() when selector parameter can be ommited -[main] Enum contstants in IndexAttribute.Filter expression are translated correctly now -[main] Fixed certain scenarios when enum constants caused query translation error - -Changes in 5.0.11 RC2 - -[main] Fixed build in Perform/PerformSafely modes when there is no Metadata tables in database/schema -[main] Added support for CONTAINSTABLE queries for SQL Server providers -[main] Optimized memory usage for storage nodes which are build in Skip mode -[main] Full-text indexes are now allowed for fields of structures -[main] Added highest ranked matches limitation support for freetext queries -[main] ReferenceFinder now excludes references which were locally removed -[main] Fixes certains scenarios when changes do not clear on after persist -[postgresql] Fixed extraction of columns associated with DateTimeOffset fields - -Changes in 5.0.11 RC - -[main] Full-text indexes no longer cause domain building error in DomainUpgradeMode.Skip mode -[main] Fixed temporary keys remap which showed up in previous version -[postgresql] Updated version of client library -[postgresql] Added support for DateTimeOffset - -Changes in 5.0.10 Final - -[main] Remap of temporary to real keys, no longer restore nulled references to an Entity -[main] Fixed certain cases of session cache returning null for a valid key -[main] Fixed certain cases when EntitySet could return nulls instead of removed Entities on enumeration - -Changes in 5.0.10 RC - -[main] Cross-hierarchical persistent type movements are unsafe actions now -[main] Added Support for Domain building on read-only database in UpgradeMode.Skip mode -[main] Fixed incorrect translation of persistent interface queries occured in some scenairous -[main] Fixed certain cases of storage node metadata corruption -[sqlite] Added Support for DateTimeOffset fields and basic operations with them -[oracle] Corrected extraction of DateTimeOffset columns -[weaver] Fixed pdb-files handling created by Roslyn - -Changes in 5.0.9 Final - -[main] Domain building in Skip mode no longer extracts database/schema structure at all. - -Changes in 5.0.8 Final - -[main] Fixed translation of EnumerableExtensions.IsNullOrEmpty() -[main] Fixed Domain building on empty database/schema -[main] Fixed incorrect translation of POCO costructors in some cases - -Changes in 5.0.7 Final - -[main] Fixed skipping of senseless column recreations which introduced in 5.0.7 RC2 -[main] Fixed certain cases of incorrect constructor usage of POCO classes in queries - -Changes in 5.0.7 RC2 - -[main] Fixed translation of In operation in some cases -[main] FieldAttribute.NullableOnUpgrade no longer lead to senseless column copying -[main] Fixed multiple usage of same column in Set operations -[main] Correct visitation of closure subqueries -[main] Fixed Ordering by column of object type in certain scenarios -[main] Fixed materialization error which appeared in 5.0.7-RC -[main] Fixed incorrect mappings of type identifiers for storage nodes -[main] Fixed IQueryable.Any() translation in certain scenarios -[sqlserver] Corrent extraction of schema indexes - -Changes in 5.0.7 RC - -[main] Fixed mapping of type identifiers for storage nodes -[main] Weaver no longer fails building under Visual Studio 2015 -[main] Improved storage node building in UpgradeMode.Skip mode - -Changes in 5.0.6 Final - -[main] Fixed various cases of using Inner Join instead of Left Join -[main] Fixed comparison of Anonymous types with null value -[main] Fixed columns optimization for queries with ternary operator -[main] Fixed Key comparison - -Changes in 5.0.5 Final - -[sqlserver] Improved reading decimals -[sqlserver] Fixed reading decimal values which beyond the .Net decimal limits - -Changes in 5.0.4 Final - -[main] Fixed incorrect rollback of transaction in some scenarios -[main] Speeded up building of domain in UpgradeMode.Skip mode - -Changes in 5.0.4 RC - -[main] Fixed incorrect building of indexes in some cases -[main] Fixed mapping of Structure type fields -[main] Added unique identifier of session -[main] Fixed referential integrity in Client profile sessions -[mysql] Key generators no longer drop their states after restart of server -[mysql] Limitation of affected rows in Update and Delete operations -[firebird] Limitation of affected rows in Update and Delete operations -[sqlserver] Limitation of affected rows in Update and Delete operations - -Changes in 5.0.3 Final - -[main] Fixed remap of temporary keys -[main] No longer referenced entities remove correctly in client profile session -[main] Fixed weaving of implementations of types from third-party libraries -[main] Enitites restores their states after persisting failed -[main] Fixed incorrect sorting of insert operations in some cases -[mysql] Fixed substraction of dates -[sqlserver] Fixed substraction of dates -[bulkoperations] Fixed inserts and updates of fields which definded in ancestor - -Changes in 5.0.2 Final - -[main] Association between Key fields is no longer creates additional index -[main] Fixed behavior when DataObjects.Net puts type identifier to the wrong column -[main] Fixed incorrect behavior of left join in some cases -[main] Fixed clone creation of PhoneNumberConstraint validator -[mysql] Fixed incorrect statement of multiple joins - -Changes in 5.0.0 Final - -[main] Delayed/Future queries are no longer cached closure variables values in some scenarios -[main] Secondary indexes which includes inherited fields are no longer ignored in some scenarios - -Changes in 5.0.0 RC2 - -[main] Fixed handling of qeries with multiple IN operations in some scenarios -[main] Fixed handling of query to EntitySet which associates with field of Structure -[main] Added map of type identifiers UpgradeContext.UserDefinedTypeMap -[sqlserver] Fixed translation of OnUpdate and OnDelete actions for foreign keys - -Changes in 5.0.0 RC - -[main] Fixed incorrect sequence of delete or insert queries under certain scenarios -[main] Extended DelayedQuery API -[main] Added support for using dynamically defined fields in LINQ - -Changes in 5.0.0 Beta_3 - -[main] Fixed issue with concurrent writing to file log -[main] Added FieldAttribute.DefaultSqlExpression property -[main] Fixed issue with weaver command line length truncation -[main] Added support for multi-node domains -[main] Fully reworked client session profile -[postgresql] Added support for geospatial types - -Changes in 5.0.0 Beta_2 - -[main] Added support for VB.NET model assemblies -[main] Optimized compilation performance -[main] Fixed problem with automatic license activation -[main] Improved logging provider API -[main] Removed obsolete Transaction.OpenAuto() methods -[main] Session closes connection when last transaction completes -[main] Added session option NonTransactionalReads -[main] Added support for Contains operation over keys collection -[main] Added support for DateTimeOffset fields -[main] Key.TypeInfo no longer relies on implicit session - -Changes in 5.0.0 Beta_1 - -[main] New improved version of Xtensive.Tuples -[main] Validation framework is heavily reworked -[main] PostSharp is replaced with custom persistence weaver -[main] Added String.Like extension method with support in LINQ translator -[main] Persist is optimized to avoid sorting entities that do not have incoming/outgoing FK -[main] Support for .NET 3.5 and Visual Studio 2008 is removed -[main] Added support for DateTime.ToString("s") in LINQ -[main] Added support for ignoring particular tables and/or columns during Domain.Build -[main] Added support for defining recycled fields via external definitions -[main] Object-to-object mapper is removed -[main] Xtensive.Core and Xtensive.Aspects assemblies are removed -[main] Added ReSharper annotations for public API -[main] IEnumerable.Remove() extension method is marked as obsolete -[main] Installer is no longer provided (use NuGet or binaries package instead) - -Changes in 4.6.8 Final - -[main] Fixed handling of qeries with multiple IN operations in some scenarios -[main] Fixed handling of query to EntitySet which associates with field of Structure -[main] Added map of type identifiers UpgradeContext.UserDefinedTypeMap -[sqlserver] Fixed translation of OnUpdate and OnDelete actions for foreign keys - -Changes in 4.6.7 Final - -[main] Added UpgradeHandler.TypesMovementsAutoDetection option -[main] Fixed handling of bit operations for long type for many providers -[main] Fixed handling of recycled and recycled nested types under some scenarios -[main] Fixed handling of queries with muliple IN operations -[main] Fixed mapping names of columns under some scenarios -[sqlserver] Fixed dropping of default constraint under some scenarios - -Changes in 4.6.6 Final - -[main] Added DomainConfiguration.MultidatabaseKeys setting -[main] Fixed incorrect EntitySet caching in ClientProfile -[main] Fixed construction of inherited partial indexes -[main] Fixed NRE when using partial indexes over abstract types -[main] Fixed incorrect type id upgrade when type is moved to another namespace -[oracle] Exclude many standard schemes during extraction - -Changes in 4.6.5 Final - -[main] Fixed version validation for entities without explicit version columns -[main] Fixed version validation for decimal version fields -[main] Optimized aggregate translation in complex scenarios -[main] Fixed problem with access to nullable enum columns in final projection -[main] Fixed problem with missing calculated columns in final projection -[main] Fixed materialization of delayed queries with parameters in final projection -[main] Implemented merging of duplicated query parameters -[main] Improved handling of unique index conflicts during persist -[main] Implemented query batching when ValidateEntityVersions option is enabled -[sqlserver] Optimized queries that are executed during initialization -[sqlserver] Added support for full text data type columns -[sqlserver] Added ignoring of filetable objects during upgrade and schema validation -[sqlserverce] Fixed translation of DateTime operations in LINQ -[sqlite] Fixed translation of DateTime operations in LINQ -[mysql] Fixed translation of DateTime operations in LINQ - -Changes in 4.6.4 Final - -[main] Fixed regression in Session.Query.ExecuteDelayed introduced in 4.6.4 RC -[mysql] Fixed removal of self-referenced entities -[sqlite] Fixed extraction of multi-column primary keys - -Changes in 4.6.4 RC - -[main] Added version validation on persist via SessionOptions.ValidateEntityVersions -[main] Added DomainConfiguration.ConnectionInitializationSql option -[main] Improved diagnostic messages for multimapping configurations when database/schema is not found -[main] Fixed redundant delete queries when clearing key generator tables during upgrade -[main] Fixed NRE in StorageMappingBuilder when persistent type does not have a namespace -[main] Store partial index filter definitions in Metadata.Extension table instead of relying on information schema -[main] Added support for Enum.HasFlags method in LINQ -[main] Improved diagnostic message when non-LINQ method is called within Session.Query.ExecuteDelayed -[sqlite] SQLite library is upgraded to version 1.0.87.0 -[sqlserver] Fixed incorrect SQL for table rename in non-default database -[sqlite] Added support for :memory: data source - -Changes in 4.6.3 Final - -[main] Fixed incorrect column order in queries after certain schema upgrades -[main] Added DomainConfiguration.NativeLibraryCacheFolder setting -[main] Improved initialization time of TupleDescriptors - -Changes in 4.6.2 Final - -[main] Add DomainConfiguration.AllowCyclicDatabaseDependencies option - -Changes in 4.6.1 Final - -[main] Fix loading/storing of the domain model when multi-database mode is enabled -[main] Fix assignment of MappingSchema/MappingDatabase for persistent interfaces -[main] Improve exception message for missing default schema in domain configuration -[main] Fix translation of predicates similar to (object) NullableBool == (object) null -[main] Fix translation of Union() over boolean columns under certain conditions -[main] Don't enforce implicit non-nullable/length constraints in inconsistent sessions -[main] Import DataObjects.Net.targets conditionally when using NuGet package -[main] Make UpgradeHandler.IsFieldAvailable virtual -[sqlserver] Treat errors 3966 and 3971 as serialization failure - -Changes in 4.6.0 Final - -[main] Temporary limit maximal PostSharp version to 2.1.7.16 - -Changes in 4.6.0 RC - -[main] Added NamingRules.RemoveDots and NamingRules.RemoveHyphens -[main] Added Connection and Transaction properties to UpgradeContext -[main] Added Session property to UpgradeContext -[main] UpgradeStage.Initializing is marked obsolete -[main] Added OnPrepare and OnComplete methods to UpgradeHandler which are executed before and after any upgrade -[main] Added advanced version of domain builder module -[main] Correctly clean up key generator tables if entities are created in OnUpgrade() method -[main] Several methods that implicitly use Session are marked as obsolete - -Changes in 4.6.0 Beta_3 - -[main] Added advanced version of LINQ query preprocessor -[main] Fixed redundant query nesting under certain conditions -[main] Fixed redundant subqueries under certain conditions -[main] Improved formatting of SQL when chains of AND/OR operators are used -[main] Key.Create(Session) method has been renamed to Key.Generate(Session) -[main] Added Key.Create() overload that allows to specify TypeReferenceAccuracy -[main] Added DirectSessionAccessor.GetChangedEntities() method -[main] Perform upgrade in single transaction when possible -[sqlite] Added support for using SQLite provider in 64-bit processes - -Changes in 4.6.0 Beta_2 - -[main] Fixed incorrect processing of column rename for non-default database -[main] ServiceContainerBase no longer has finalizer - -Changes in 4.6.0 Beta_1 - -[main] Added support for mapping persistent types to multiple schemas and databases -[main] Key generators API are heavily reworked -[main] Added option to build Domain in parallel where possible -[main] Reduced number of stages when performing upgrade -[main] Removed many unused types from Xtensive.Core assembly -[main] ConnectionInfo, UrlInfo and ICompletableScope types moved from Xtensive.Core to Xtensive.Orm (assembly & namespace) -[sqlite] Added provider for SQLite database -[sqlserver] Use sequences for key generators for SQL Server 2012 -[sqlserver] Use native paging operators for SQL Server 2012 - -Changes in 4.5.8 Final - -[main] Fixed invalid key comparison under certain conditions -[main] Fixed EntitySet caching invalid state within DisableSaveChanges() scope -[main] Fixed overflow when storing large TimeSpan values -[main] Fixed invalid default values for SessionConfiguration.DefaultIsolationLevel and SessionConfiguration.Options -[main] Fixed support for referencing connection strings in SessionConfiguration -[mysql] Fixed translation of bitwise operations -[mysql] Fixed translation of DateTime.DayOfWeek and DateTime.DayOfYear - -Changes in 4.5.8 RC - -[main] Added QueryEndpoint.Items() method for querying EntitySets within compiled queries -[main] Added support for DateTime.AddXxx() methods in LINQ translator -[main] Added support for System.Linq.EnumerableQuery in LINQ translator -[main] Fixed incorrect column references in generated SQL for certain queries -[main] Fixed querying for types with enum type discriminators -[main] Fixed querying for types with enum key fields -[main] Fixed locking of entity that could not be persisted at the moment for some reason -[main] Fixed handling of temporary tables query with zero columns -[main] Fixed translation of GroupJoin() with temporary tables -[main] Fixed translation of Distinct() after Select() -[main] Fixed translation of ThenBy() that implicitly adds joins -[main] Fixed support for LINQ member compilers that return nullable values -[main] Optimized translation of String.IsNullOrEmpty() method -[main] Fixed translation of as with subquery operand -[main] Fixed concurrent access issues with NameBuilder.GetHash method -[main] Fixed incorrect result of FirstOrDefault/SingleOrDefault in certain subqueries -[main] Reduced number of casts in generated SQL when accessing enum fields -[main] Automatically handle namespace-only renames during upgrade -[main] PostSharp is upgraded to version 2.1.7.30 -[postgresql] Npgsql is upgraded to version 2.0.12.1 -[mysql] MySQL library is upgraded to version 6.7.4 -[firebird] Firebird library is upgraded to version 3.0.2.1 -[sqlserver] Fixed reading of large SqlDecimal values - -Changes in 4.5.7 Final - -[main] Fixed translation of GroupBy() over columns with same name -[main] Improved diagnostic message when more than one upgrade handler is provided -[main] Fixed error after changing case of a persistent field -[main] Wrap exceptions occured within user code with TargetInvocationException -[main] Fixed handling of validation aspects on generic types -[main] Fixed translation of In/Contains over field obtained with `as` operator -[main] Fixed translation of In/Contains over arbitrary expressions -[main] Fixed projection to DTO with inheritance -[main] Fixed translation of DateTime properties access on certain expressions -[main] Fixed accessing of IGrouping.Key in subqueries -[sqlserver] Fixed implementation of "truncate" operation on DateTime expressions - -Changes in 4.5.6 Final - -[main] Fix translation of predicates similar to (object) NullableBool == (object) null -[main] Fix translation of Union() over boolean columns under certain conditions -[main] Don't enforce implicit non-nullable/length constraints in inconsistent sessions -[main] Import DataObjects.Net.targets conditionally when using NuGet package -[main] Make UpgradeHandler.IsFieldAvailable virtual -[sqlserver] Treat errors 3966 and 3971 as serialization failure - -Changes in 4.5.5 Final - -[main] Temporary limit maximal PostSharp version to 2.1.7.16 - -Changes in 4.5.5 RC - -[main] Omit redundant parentheses in generated SQL for chains of set operations -[main] Correctly handle hierarchy split when doing upgrade -[sqlserverce] Fixed translation of Contains/Any/All under certain scenarios -[mysql] Correctly parse pre-release versions of MySQL (e.g. 5.5.25a) - -Changes in 4.5.4 Final - -[main] Added community edition - -Changes in 4.5.4 RC2 - -[main] Exceptions on IoC container finalization (usually they appear because dependent objects are already finalized) are now suppressed -[main] Fixed NullReferenceException in EnsureIsFetched method in SessionOptions.ReadRemovedObjects mode -[main] Entity.IsMaterializing property wasn't handled properly -[main] Transaction opening is fixed for SessionOptions.ClientProfile - -Changes in 4.5.4 RC - -[main] Fixed comparion of Key fields in interaces in LINQ queries under certain scenarios -[main] Visual experience of License Manager has been improved -[main] Fixed incorrect handling of RemoveFieldHint under certain scenarios -[main] Fixed incorrect behavior in DisconnectedEntityState.UpdateOrigin method - -Changes in 4.5.3 Final - -[main] Fix NullReferenceException under certain validation scenarios -[main] Fixed memory leak in Domain.Build() process - -Changes in 4.5.3 RC4 - -[main] Fix POCO materialization when subqueries are used -[main] Fix translation of multiple aggregate subqueries when calculated columns are used -[main] Throw descriptive exception when RenameTypeHint has invalid old type name -[sqlserver] Improve detection of serialization failure errors for SQL Server - -Changes in 4.5.3 RC3 - -[main] RemoveFieldHint, ChangeFieldTypeHint are now correctly handled for Structure fields -[main] Correctly skip full-text indexes if storage does not support them -[main] Change log is included in distribution -[mysql] Fixed index direction support for MySQL -[mysql] Improved translation of DateTime.Date for MySQL -[mysql] Fixed incorrect translation of Math.Truncate and Decimal.Truncate for MySQL -[mysql] Fixed incorrect translation of String.IndexOf for MySQL -[mysql] Fixed mapping of Single and Double types for MySQL -[mysql] Fixed schema extraction with case-sensitive collation for MySQL -[postgresql] Hex format for byte array literals is used for PostgreSQL 9.0 and later - -Changes in 4.5.3 RC2 - -[main] Validation now works in ClientProfile -[main] Fixed various errors with certian EntitySet usage scenarios in ClientProfile -[main] Fixed "Scope can't be disposed" error under certain query enumeration scenarios - -Changes in 4.5.3 RC - -[main] Fixed index duplication under certain scenarios -[main] Fixed error about duplicate index name under certain scenarios -[main] Added SessionOptions.SuppressRollbackExceptions - +Changes in 5.0.17 Final + + +Changes in 5.0.17 Beta_2 + +[main] Add sharing of one Sql Model across Storage Nodes + +Changes in 5.0.17 Beta_1 + +[main] Decreased amout of metadata extracted for Domains or Storage nodes building in DomainUpgradeMode.Skip + +Changes in 5.0.16 Final + +[main] Fixed error which might appear on constraints validation + +Changes in 5.0.16 Beta_1 + +[main] Added constraint option allowing to skip the constraint if the field isn't changed +[main] DifferentialTuple.Merge() operation no longer cause StackOverflow exception +[main] Fixed certain cases of foreign key absence for reference fields of structures +[main] Fixed translation of enum value as default field value +[sqlserver] Fixed extraction of information about indexes from database + +Changes in 5.0.15 Final + +[sqlserver] Added change tracking settings for full-text indexes +[sqlserver] Added API for specifying catalog name for full-text indexes + +Changes in 5.0.14 Final + +[main] Returned expected behavior of delayed queries which was changed in 5.0.11 by bug fix for IN operation. +[main] Fixed bug when Server profile sesions allowed to query database without transaction. +[mysql] Corrected column types' extraction. + +Changes in 5.0.13 Final + +[main] Fixed rare situation when all LinQ queries might be corrupted untill application restart +[main] Fixed case when contatination of two queries with Enum constants might cause error on translation +[mysql] Added support for SQL batches + +Changes in 5.0.12 Final + +[main] Fixed bug when implicit Store operation didn't create temporary table +[sqlserver] Fixed certain cases of incorrect rounding of decimals + +Changes in 5.0.11 Final + +[main] Constraints can be skipped on transaction commit +[main] Operations like EntitySet.ToList() no longer lead to incorrect EntitySet.Count value +[main] IN() operation now creates temporary tables when it supposes to +[main] Fixed translations of aggregates like IQueriable.Sum() when selector parameter can be ommited +[main] Enum contstants in IndexAttribute.Filter expression are translated correctly now +[main] Fixed certain scenarios when enum constants caused query translation error + +Changes in 5.0.11 RC2 + +[main] Fixed build in Perform/PerformSafely modes when there is no Metadata tables in database/schema +[main] Added support for CONTAINSTABLE queries for SQL Server providers +[main] Optimized memory usage for storage nodes which are build in Skip mode +[main] Full-text indexes are now allowed for fields of structures +[main] Added highest ranked matches limitation support for freetext queries +[main] ReferenceFinder now excludes references which were locally removed +[main] Fixes certains scenarios when changes do not clear on after persist +[postgresql] Fixed extraction of columns associated with DateTimeOffset fields + +Changes in 5.0.11 RC + +[main] Full-text indexes no longer cause domain building error in DomainUpgradeMode.Skip mode +[main] Fixed temporary keys remap which showed up in previous version +[postgresql] Updated version of client library +[postgresql] Added support for DateTimeOffset + +Changes in 5.0.10 Final + +[main] Remap of temporary to real keys, no longer restore nulled references to an Entity +[main] Fixed certain cases of session cache returning null for a valid key +[main] Fixed certain cases when EntitySet could return nulls instead of removed Entities on enumeration + +Changes in 5.0.10 RC + +[main] Cross-hierarchical persistent type movements are unsafe actions now +[main] Added Support for Domain building on read-only database in UpgradeMode.Skip mode +[main] Fixed incorrect translation of persistent interface queries occured in some scenairous +[main] Fixed certain cases of storage node metadata corruption +[sqlite] Added Support for DateTimeOffset fields and basic operations with them +[oracle] Corrected extraction of DateTimeOffset columns +[weaver] Fixed pdb-files handling created by Roslyn + +Changes in 5.0.9 Final + +[main] Domain building in Skip mode no longer extracts database/schema structure at all. + +Changes in 5.0.8 Final + +[main] Fixed translation of EnumerableExtensions.IsNullOrEmpty() +[main] Fixed Domain building on empty database/schema +[main] Fixed incorrect translation of POCO costructors in some cases + +Changes in 5.0.7 Final + +[main] Fixed skipping of senseless column recreations which introduced in 5.0.7 RC2 +[main] Fixed certain cases of incorrect constructor usage of POCO classes in queries + +Changes in 5.0.7 RC2 + +[main] Fixed translation of In operation in some cases +[main] FieldAttribute.NullableOnUpgrade no longer lead to senseless column copying +[main] Fixed multiple usage of same column in Set operations +[main] Correct visitation of closure subqueries +[main] Fixed Ordering by column of object type in certain scenarios +[main] Fixed materialization error which appeared in 5.0.7-RC +[main] Fixed incorrect mappings of type identifiers for storage nodes +[main] Fixed IQueryable.Any() translation in certain scenarios +[sqlserver] Corrent extraction of schema indexes + +Changes in 5.0.7 RC + +[main] Fixed mapping of type identifiers for storage nodes +[main] Weaver no longer fails building under Visual Studio 2015 +[main] Improved storage node building in UpgradeMode.Skip mode + +Changes in 5.0.6 Final + +[main] Fixed various cases of using Inner Join instead of Left Join +[main] Fixed comparison of Anonymous types with null value +[main] Fixed columns optimization for queries with ternary operator +[main] Fixed Key comparison + +Changes in 5.0.5 Final + +[sqlserver] Improved reading decimals +[sqlserver] Fixed reading decimal values which beyond the .Net decimal limits + +Changes in 5.0.4 Final + +[main] Fixed incorrect rollback of transaction in some scenarios +[main] Speeded up building of domain in UpgradeMode.Skip mode + +Changes in 5.0.4 RC + +[main] Fixed incorrect building of indexes in some cases +[main] Fixed mapping of Structure type fields +[main] Added unique identifier of session +[main] Fixed referential integrity in Client profile sessions +[mysql] Key generators no longer drop their states after restart of server +[mysql] Limitation of affected rows in Update and Delete operations +[firebird] Limitation of affected rows in Update and Delete operations +[sqlserver] Limitation of affected rows in Update and Delete operations + +Changes in 5.0.3 Final + +[main] Fixed remap of temporary keys +[main] No longer referenced entities remove correctly in client profile session +[main] Fixed weaving of implementations of types from third-party libraries +[main] Enitites restores their states after persisting failed +[main] Fixed incorrect sorting of insert operations in some cases +[mysql] Fixed substraction of dates +[sqlserver] Fixed substraction of dates +[bulkoperations] Fixed inserts and updates of fields which definded in ancestor + +Changes in 5.0.2 Final + +[main] Association between Key fields is no longer creates additional index +[main] Fixed behavior when DataObjects.Net puts type identifier to the wrong column +[main] Fixed incorrect behavior of left join in some cases +[main] Fixed clone creation of PhoneNumberConstraint validator +[mysql] Fixed incorrect statement of multiple joins + +Changes in 5.0.0 Final + +[main] Delayed/Future queries are no longer cached closure variables values in some scenarios +[main] Secondary indexes which includes inherited fields are no longer ignored in some scenarios + +Changes in 5.0.0 RC2 + +[main] Fixed handling of qeries with multiple IN operations in some scenarios +[main] Fixed handling of query to EntitySet which associates with field of Structure +[main] Added map of type identifiers UpgradeContext.UserDefinedTypeMap +[sqlserver] Fixed translation of OnUpdate and OnDelete actions for foreign keys + +Changes in 5.0.0 RC + +[main] Fixed incorrect sequence of delete or insert queries under certain scenarios +[main] Extended DelayedQuery API +[main] Added support for using dynamically defined fields in LINQ + +Changes in 5.0.0 Beta_3 + +[main] Fixed issue with concurrent writing to file log +[main] Added FieldAttribute.DefaultSqlExpression property +[main] Fixed issue with weaver command line length truncation +[main] Added support for multi-node domains +[main] Fully reworked client session profile +[postgresql] Added support for geospatial types + +Changes in 5.0.0 Beta_2 + +[main] Added support for VB.NET model assemblies +[main] Optimized compilation performance +[main] Fixed problem with automatic license activation +[main] Improved logging provider API +[main] Removed obsolete Transaction.OpenAuto() methods +[main] Session closes connection when last transaction completes +[main] Added session option NonTransactionalReads +[main] Added support for Contains operation over keys collection +[main] Added support for DateTimeOffset fields +[main] Key.TypeInfo no longer relies on implicit session + +Changes in 5.0.0 Beta_1 + +[main] New improved version of Xtensive.Tuples +[main] Validation framework is heavily reworked +[main] PostSharp is replaced with custom persistence weaver +[main] Added String.Like extension method with support in LINQ translator +[main] Persist is optimized to avoid sorting entities that do not have incoming/outgoing FK +[main] Support for .NET 3.5 and Visual Studio 2008 is removed +[main] Added support for DateTime.ToString("s") in LINQ +[main] Added support for ignoring particular tables and/or columns during Domain.Build +[main] Added support for defining recycled fields via external definitions +[main] Object-to-object mapper is removed +[main] Xtensive.Core and Xtensive.Aspects assemblies are removed +[main] Added ReSharper annotations for public API +[main] IEnumerable.Remove() extension method is marked as obsolete +[main] Installer is no longer provided (use NuGet or binaries package instead) + +Changes in 4.6.8 Final + +[main] Fixed handling of qeries with multiple IN operations in some scenarios +[main] Fixed handling of query to EntitySet which associates with field of Structure +[main] Added map of type identifiers UpgradeContext.UserDefinedTypeMap +[sqlserver] Fixed translation of OnUpdate and OnDelete actions for foreign keys + +Changes in 4.6.7 Final + +[main] Added UpgradeHandler.TypesMovementsAutoDetection option +[main] Fixed handling of bit operations for long type for many providers +[main] Fixed handling of recycled and recycled nested types under some scenarios +[main] Fixed handling of queries with muliple IN operations +[main] Fixed mapping names of columns under some scenarios +[sqlserver] Fixed dropping of default constraint under some scenarios + +Changes in 4.6.6 Final + +[main] Added DomainConfiguration.MultidatabaseKeys setting +[main] Fixed incorrect EntitySet caching in ClientProfile +[main] Fixed construction of inherited partial indexes +[main] Fixed NRE when using partial indexes over abstract types +[main] Fixed incorrect type id upgrade when type is moved to another namespace +[oracle] Exclude many standard schemes during extraction + +Changes in 4.6.5 Final + +[main] Fixed version validation for entities without explicit version columns +[main] Fixed version validation for decimal version fields +[main] Optimized aggregate translation in complex scenarios +[main] Fixed problem with access to nullable enum columns in final projection +[main] Fixed problem with missing calculated columns in final projection +[main] Fixed materialization of delayed queries with parameters in final projection +[main] Implemented merging of duplicated query parameters +[main] Improved handling of unique index conflicts during persist +[main] Implemented query batching when ValidateEntityVersions option is enabled +[sqlserver] Optimized queries that are executed during initialization +[sqlserver] Added support for full text data type columns +[sqlserver] Added ignoring of filetable objects during upgrade and schema validation +[sqlserverce] Fixed translation of DateTime operations in LINQ +[sqlite] Fixed translation of DateTime operations in LINQ +[mysql] Fixed translation of DateTime operations in LINQ + +Changes in 4.6.4 Final + +[main] Fixed regression in Session.Query.ExecuteDelayed introduced in 4.6.4 RC +[mysql] Fixed removal of self-referenced entities +[sqlite] Fixed extraction of multi-column primary keys + +Changes in 4.6.4 RC + +[main] Added version validation on persist via SessionOptions.ValidateEntityVersions +[main] Added DomainConfiguration.ConnectionInitializationSql option +[main] Improved diagnostic messages for multimapping configurations when database/schema is not found +[main] Fixed redundant delete queries when clearing key generator tables during upgrade +[main] Fixed NRE in StorageMappingBuilder when persistent type does not have a namespace +[main] Store partial index filter definitions in Metadata.Extension table instead of relying on information schema +[main] Added support for Enum.HasFlags method in LINQ +[main] Improved diagnostic message when non-LINQ method is called within Session.Query.ExecuteDelayed +[sqlite] SQLite library is upgraded to version 1.0.87.0 +[sqlserver] Fixed incorrect SQL for table rename in non-default database +[sqlite] Added support for :memory: data source + +Changes in 4.6.3 Final + +[main] Fixed incorrect column order in queries after certain schema upgrades +[main] Added DomainConfiguration.NativeLibraryCacheFolder setting +[main] Improved initialization time of TupleDescriptors + +Changes in 4.6.2 Final + +[main] Add DomainConfiguration.AllowCyclicDatabaseDependencies option + +Changes in 4.6.1 Final + +[main] Fix loading/storing of the domain model when multi-database mode is enabled +[main] Fix assignment of MappingSchema/MappingDatabase for persistent interfaces +[main] Improve exception message for missing default schema in domain configuration +[main] Fix translation of predicates similar to (object) NullableBool == (object) null +[main] Fix translation of Union() over boolean columns under certain conditions +[main] Don't enforce implicit non-nullable/length constraints in inconsistent sessions +[main] Import DataObjects.Net.targets conditionally when using NuGet package +[main] Make UpgradeHandler.IsFieldAvailable virtual +[sqlserver] Treat errors 3966 and 3971 as serialization failure + +Changes in 4.6.0 Final + +[main] Temporary limit maximal PostSharp version to 2.1.7.16 + +Changes in 4.6.0 RC + +[main] Added NamingRules.RemoveDots and NamingRules.RemoveHyphens +[main] Added Connection and Transaction properties to UpgradeContext +[main] Added Session property to UpgradeContext +[main] UpgradeStage.Initializing is marked obsolete +[main] Added OnPrepare and OnComplete methods to UpgradeHandler which are executed before and after any upgrade +[main] Added advanced version of domain builder module +[main] Correctly clean up key generator tables if entities are created in OnUpgrade() method +[main] Several methods that implicitly use Session are marked as obsolete + +Changes in 4.6.0 Beta_3 + +[main] Added advanced version of LINQ query preprocessor +[main] Fixed redundant query nesting under certain conditions +[main] Fixed redundant subqueries under certain conditions +[main] Improved formatting of SQL when chains of AND/OR operators are used +[main] Key.Create(Session) method has been renamed to Key.Generate(Session) +[main] Added Key.Create() overload that allows to specify TypeReferenceAccuracy +[main] Added DirectSessionAccessor.GetChangedEntities() method +[main] Perform upgrade in single transaction when possible +[sqlite] Added support for using SQLite provider in 64-bit processes + +Changes in 4.6.0 Beta_2 + +[main] Fixed incorrect processing of column rename for non-default database +[main] ServiceContainerBase no longer has finalizer + +Changes in 4.6.0 Beta_1 + +[main] Added support for mapping persistent types to multiple schemas and databases +[main] Key generators API are heavily reworked +[main] Added option to build Domain in parallel where possible +[main] Reduced number of stages when performing upgrade +[main] Removed many unused types from Xtensive.Core assembly +[main] ConnectionInfo, UrlInfo and ICompletableScope types moved from Xtensive.Core to Xtensive.Orm (assembly & namespace) +[sqlite] Added provider for SQLite database +[sqlserver] Use sequences for key generators for SQL Server 2012 +[sqlserver] Use native paging operators for SQL Server 2012 + +Changes in 4.5.8 Final + +[main] Fixed invalid key comparison under certain conditions +[main] Fixed EntitySet caching invalid state within DisableSaveChanges() scope +[main] Fixed overflow when storing large TimeSpan values +[main] Fixed invalid default values for SessionConfiguration.DefaultIsolationLevel and SessionConfiguration.Options +[main] Fixed support for referencing connection strings in SessionConfiguration +[mysql] Fixed translation of bitwise operations +[mysql] Fixed translation of DateTime.DayOfWeek and DateTime.DayOfYear + +Changes in 4.5.8 RC + +[main] Added QueryEndpoint.Items() method for querying EntitySets within compiled queries +[main] Added support for DateTime.AddXxx() methods in LINQ translator +[main] Added support for System.Linq.EnumerableQuery in LINQ translator +[main] Fixed incorrect column references in generated SQL for certain queries +[main] Fixed querying for types with enum type discriminators +[main] Fixed querying for types with enum key fields +[main] Fixed locking of entity that could not be persisted at the moment for some reason +[main] Fixed handling of temporary tables query with zero columns +[main] Fixed translation of GroupJoin() with temporary tables +[main] Fixed translation of Distinct() after Select() +[main] Fixed translation of ThenBy() that implicitly adds joins +[main] Fixed support for LINQ member compilers that return nullable values +[main] Optimized translation of String.IsNullOrEmpty() method +[main] Fixed translation of as with subquery operand +[main] Fixed concurrent access issues with NameBuilder.GetHash method +[main] Fixed incorrect result of FirstOrDefault/SingleOrDefault in certain subqueries +[main] Reduced number of casts in generated SQL when accessing enum fields +[main] Automatically handle namespace-only renames during upgrade +[main] PostSharp is upgraded to version 2.1.7.30 +[postgresql] Npgsql is upgraded to version 2.0.12.1 +[mysql] MySQL library is upgraded to version 6.7.4 +[firebird] Firebird library is upgraded to version 3.0.2.1 +[sqlserver] Fixed reading of large SqlDecimal values + +Changes in 4.5.7 Final + +[main] Fixed translation of GroupBy() over columns with same name +[main] Improved diagnostic message when more than one upgrade handler is provided +[main] Fixed error after changing case of a persistent field +[main] Wrap exceptions occured within user code with TargetInvocationException +[main] Fixed handling of validation aspects on generic types +[main] Fixed translation of In/Contains over field obtained with `as` operator +[main] Fixed translation of In/Contains over arbitrary expressions +[main] Fixed projection to DTO with inheritance +[main] Fixed translation of DateTime properties access on certain expressions +[main] Fixed accessing of IGrouping.Key in subqueries +[sqlserver] Fixed implementation of "truncate" operation on DateTime expressions + +Changes in 4.5.6 Final + +[main] Fix translation of predicates similar to (object) NullableBool == (object) null +[main] Fix translation of Union() over boolean columns under certain conditions +[main] Don't enforce implicit non-nullable/length constraints in inconsistent sessions +[main] Import DataObjects.Net.targets conditionally when using NuGet package +[main] Make UpgradeHandler.IsFieldAvailable virtual +[sqlserver] Treat errors 3966 and 3971 as serialization failure + +Changes in 4.5.5 Final + +[main] Temporary limit maximal PostSharp version to 2.1.7.16 + +Changes in 4.5.5 RC + +[main] Omit redundant parentheses in generated SQL for chains of set operations +[main] Correctly handle hierarchy split when doing upgrade +[sqlserverce] Fixed translation of Contains/Any/All under certain scenarios +[mysql] Correctly parse pre-release versions of MySQL (e.g. 5.5.25a) + +Changes in 4.5.4 Final + +[main] Added community edition + +Changes in 4.5.4 RC2 + +[main] Exceptions on IoC container finalization (usually they appear because dependent objects are already finalized) are now suppressed +[main] Fixed NullReferenceException in EnsureIsFetched method in SessionOptions.ReadRemovedObjects mode +[main] Entity.IsMaterializing property wasn't handled properly +[main] Transaction opening is fixed for SessionOptions.ClientProfile + +Changes in 4.5.4 RC + +[main] Fixed comparion of Key fields in interaces in LINQ queries under certain scenarios +[main] Visual experience of License Manager has been improved +[main] Fixed incorrect handling of RemoveFieldHint under certain scenarios +[main] Fixed incorrect behavior in DisconnectedEntityState.UpdateOrigin method + +Changes in 4.5.3 Final + +[main] Fix NullReferenceException under certain validation scenarios +[main] Fixed memory leak in Domain.Build() process + +Changes in 4.5.3 RC4 + +[main] Fix POCO materialization when subqueries are used +[main] Fix translation of multiple aggregate subqueries when calculated columns are used +[main] Throw descriptive exception when RenameTypeHint has invalid old type name +[sqlserver] Improve detection of serialization failure errors for SQL Server + +Changes in 4.5.3 RC3 + +[main] RemoveFieldHint, ChangeFieldTypeHint are now correctly handled for Structure fields +[main] Correctly skip full-text indexes if storage does not support them +[main] Change log is included in distribution +[mysql] Fixed index direction support for MySQL +[mysql] Improved translation of DateTime.Date for MySQL +[mysql] Fixed incorrect translation of Math.Truncate and Decimal.Truncate for MySQL +[mysql] Fixed incorrect translation of String.IndexOf for MySQL +[mysql] Fixed mapping of Single and Double types for MySQL +[mysql] Fixed schema extraction with case-sensitive collation for MySQL +[postgresql] Hex format for byte array literals is used for PostgreSQL 9.0 and later + +Changes in 4.5.3 RC2 + +[main] Validation now works in ClientProfile +[main] Fixed various errors with certian EntitySet usage scenarios in ClientProfile +[main] Fixed "Scope can't be disposed" error under certain query enumeration scenarios + +Changes in 4.5.3 RC + +[main] Fixed index duplication under certain scenarios +[main] Fixed error about duplicate index name under certain scenarios +[main] Added SessionOptions.SuppressRollbackExceptions + diff --git a/ChangeLog/0.1.0_Beta_1.txt b/ChangeLog/0.1.0_Beta_1.txt index 5eb3a2cafd..b84ccc1cbd 100644 --- a/ChangeLog/0.1.0_Beta_1.txt +++ b/ChangeLog/0.1.0_Beta_1.txt @@ -1,3 +1,3 @@ -[main] Added new overloads for loading DomainConfiguration and LoggingConfiguration -[main] Added LogManager.Initialize(System.Configuration.Configuration) +[main] Added new overloads for loading DomainConfiguration and LoggingConfiguration +[main] Added LogManager.Initialize(System.Configuration.Configuration) [sqlserver] No support for SqlGeometry and SqlGeography for now \ No newline at end of file diff --git a/ChangeLog/0.1.0_Beta_2.txt b/ChangeLog/0.1.0_Beta_2.txt index dafca80176..d1cc018768 100644 --- a/ChangeLog/0.1.0_Beta_2.txt +++ b/ChangeLog/0.1.0_Beta_2.txt @@ -1,4 +1,4 @@ -[main] Removed DomainConfiguration.NativeLibraryCacheFolder because SQLite no longer needs it. -[mysql] Cerain error codes were handled in order to arrange them with certain type instead of Unknown -[postgresql] DateTimeOffset is not supported as far as client library has no support for Zone part of TimeStampTZ +[main] Removed DomainConfiguration.NativeLibraryCacheFolder because SQLite no longer needs it. +[mysql] Cerain error codes were handled in order to arrange them with certain type instead of Unknown +[postgresql] DateTimeOffset is not supported as far as client library has no support for Zone part of TimeStampTZ [postgresql] Maximum scale of Decimals was reduced down to 27 \ No newline at end of file diff --git a/ChangeLog/0.1.0_Beta_3.txt b/ChangeLog/0.1.0_Beta_3.txt index 84c2b4a3ed..a70749d8a4 100644 --- a/ChangeLog/0.1.0_Beta_3.txt +++ b/ChangeLog/0.1.0_Beta_3.txt @@ -1,12 +1,12 @@ -[main] Added versioning policy allowing to set up certain rules for entity version increasing -[main] Fixed problems with setting Catalog.Name, Catalog.DbName, CatalogNode.Name and CatalogNode.DbName properties -[main] Fixed certain cases when grouping by an Entity field caused wrong results -[main] Persisting of changes to database while EntitySet enumeration doesn't break enumeration -[main] Fixed initialization of fields of non-persistent types within queries -[main] Entity.Lock() locks correct raws in database -[main] DomainUpgradeMode.Validate mode became stricter to avoid data corruption -[firebird] Made column types extraction be culture-independant -[sqlserver] Fixed extraction of default value of table columns -[sqlserver] Improved default schema detection in driver factory -[sqlserver] Updated Azure provider to Sql Server v12 provider +[main] Added versioning policy allowing to set up certain rules for entity version increasing +[main] Fixed problems with setting Catalog.Name, Catalog.DbName, CatalogNode.Name and CatalogNode.DbName properties +[main] Fixed certain cases when grouping by an Entity field caused wrong results +[main] Persisting of changes to database while EntitySet enumeration doesn't break enumeration +[main] Fixed initialization of fields of non-persistent types within queries +[main] Entity.Lock() locks correct raws in database +[main] DomainUpgradeMode.Validate mode became stricter to avoid data corruption +[firebird] Made column types extraction be culture-independant +[sqlserver] Fixed extraction of default value of table columns +[sqlserver] Improved default schema detection in driver factory +[sqlserver] Updated Azure provider to Sql Server v12 provider [weaver] Project building fails when weaving ends up with an error \ No newline at end of file diff --git a/ChangeLog/0.1.0_Beta_4.txt b/ChangeLog/0.1.0_Beta_4.txt index aa4398278c..e9e483250c 100644 --- a/ChangeLog/0.1.0_Beta_4.txt +++ b/ChangeLog/0.1.0_Beta_4.txt @@ -1,7 +1,7 @@ -[main] Introduced asynchronous session opening -[main] Introduced bunch of QueryEndpoint.ExecuteAsync() methods -[main] Add .AsAsyncTask() extensions for running queries asynchronously -[postgresql] Fixed extraction of full-text indexes for certain scenarios -[postgresql] Set upper limit for precision of decimals to 49 to handle problems in Npgsql -[postgresql] Fields of unsigned types no longer cause exception on saving them to database +[main] Introduced asynchronous session opening +[main] Introduced bunch of QueryEndpoint.ExecuteAsync() methods +[main] Add .AsAsyncTask() extensions for running queries asynchronously +[postgresql] Fixed extraction of full-text indexes for certain scenarios +[postgresql] Set upper limit for precision of decimals to 49 to handle problems in Npgsql +[postgresql] Fields of unsigned types no longer cause exception on saving them to database [postgresql] Enum fields no longer cause exception on saving them to database \ No newline at end of file diff --git a/ChangeLog/mkchangelog.ps1 b/ChangeLog/mkchangelog.ps1 index 2866a86771..3a618150ed 100644 --- a/ChangeLog/mkchangelog.ps1 +++ b/ChangeLog/mkchangelog.ps1 @@ -1,41 +1,41 @@ -$useLegacy = ($PSVersionTable.PSVersion -as [version]) -le ("2.0" -as [version]) -if ($useLegacy){ - $inputDir = Split-Path -Parent $MyInvocation.MyCommand.Path -} -else { - $inputDir = $PSScriptRoot -} -$theRootestRoot = Split-Path -Parent $inputDir; -$outputDir = Join-Path -Path $theRootestRoot -ChildPath \_Build\ProductInfo -$changeLogFile = Join-Path -Path $outputDir -ChildPath "ChangeLog.txt" -$releaseNotesFile = Join-Path -Path $outputDir -ChildPath "ReleaseNotes.txt" - -if (-not (Test-Path $outputDir)) { New-Item $outputDir -Type directory -Force } -if (Test-Path $changeLogFile) { Remove-Item $changeLogFile -Force } -if (Test-Path $releaseNotesFile) { Remove-Item $releaseNotesFile -Force } - -#perform right files order -$items = Get-ChildItem -Path $inputDir -Filter *.txt | - Select-Object -Property @{Name = "FileName"; Expression = {$_.BaseName}}, - @{Name = "File"; Expression = {$_}}, - @{Name = "ReleaseVersion"; Expression= {($_.BaseName -split "_", 2)[0] -as [Version]}}, - @{Name ="ReleaseName"; Expression= {($_.BaseName -split "_", 2)[1] }}, - @{Name ="FixedReleaseName"; Expression = {($_.BaseName -split "_", 2)[1] -replace "Z_Final", "Final"}} | - Sort-Object -Property @{Expression="ReleaseVersion";Descending=$true}, @{Expression="ReleaseName";Descending=$true} - -#compose ChangeLog and ReleaseInfo files -Foreach ($complexObject in $items) { - $isInitial = $complexObject.FileName -eq "0.0.0" - if($isInitial){ - Add-Content $changeLogFile ( Get-Content $complexObject.File.FullName) - Add-Content $changeLogFile "" - } - else{ - #on first itteration create ReleaseNotes - if (-not(Test-Path $releaseNotesFile)) { Add-Content $releaseNotesFile (Get-Content $complexObject.File.FullName) } - Add-Content $changeLogFile ("Changes in {0} {1}" -f $complexObject.ReleaseVersion, $complexObject.FixedReleaseName) - Add-Content $changeLogFile "" - Add-Content $changeLogFile ( Get-Content $complexObject.File.FullName) - Add-Content $changeLogFile "" - } -} +$useLegacy = ($PSVersionTable.PSVersion -as [version]) -le ("2.0" -as [version]) +if ($useLegacy){ + $inputDir = Split-Path -Parent $MyInvocation.MyCommand.Path +} +else { + $inputDir = $PSScriptRoot +} +$theRootestRoot = Split-Path -Parent $inputDir; +$outputDir = Join-Path -Path $theRootestRoot -ChildPath \_Build\ProductInfo +$changeLogFile = Join-Path -Path $outputDir -ChildPath "ChangeLog.txt" +$releaseNotesFile = Join-Path -Path $outputDir -ChildPath "ReleaseNotes.txt" + +if (-not (Test-Path $outputDir)) { New-Item $outputDir -Type directory -Force } +if (Test-Path $changeLogFile) { Remove-Item $changeLogFile -Force } +if (Test-Path $releaseNotesFile) { Remove-Item $releaseNotesFile -Force } + +#perform right files order +$items = Get-ChildItem -Path $inputDir -Filter *.txt | + Select-Object -Property @{Name = "FileName"; Expression = {$_.BaseName}}, + @{Name = "File"; Expression = {$_}}, + @{Name = "ReleaseVersion"; Expression= {($_.BaseName -split "_", 2)[0] -as [Version]}}, + @{Name ="ReleaseName"; Expression= {($_.BaseName -split "_", 2)[1] }}, + @{Name ="FixedReleaseName"; Expression = {($_.BaseName -split "_", 2)[1] -replace "Z_Final", "Final"}} | + Sort-Object -Property @{Expression="ReleaseVersion";Descending=$true}, @{Expression="ReleaseName";Descending=$true} + +#compose ChangeLog and ReleaseInfo files +Foreach ($complexObject in $items) { + $isInitial = $complexObject.FileName -eq "0.0.0" + if($isInitial){ + Add-Content $changeLogFile ( Get-Content $complexObject.File.FullName) + Add-Content $changeLogFile "" + } + else{ + #on first itteration create ReleaseNotes + if (-not(Test-Path $releaseNotesFile)) { Add-Content $releaseNotesFile (Get-Content $complexObject.File.FullName) } + Add-Content $changeLogFile ("Changes in {0} {1}" -f $complexObject.ReleaseVersion, $complexObject.FixedReleaseName) + Add-Content $changeLogFile "" + Add-Content $changeLogFile ( Get-Content $complexObject.File.FullName) + Add-Content $changeLogFile "" + } +} diff --git a/Directory.Build.props b/Directory.Build.props index 4d80067170..3cb1b0c402 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,82 +1,82 @@ - - - - - - - - $(BUILD_NUMBER) - 0 - $([System.DateTime]::Today.Year) - DataObjects.Net - Xtensive LLC and contributors - 2003-$(DoBuildYear) $(DoProductAuthors) - dev-$(DoBuildNumber) - $([System.Version]::new($(DoVersion)).Major) - $([System.Version]::new($(DoVersion)).Minor) - $([System.Version]::new($(DoVersion)).Build) - $(DoMajor).$(DoMinor).$(DoPatch) - $(DoVersionName)-$(DoVersionSuffix) - $(MSBuildThisFileDirectory)do-nuget.png - $(MSBuildThisFileDirectory)_Build\rev.txt - - - - 8.0 - $(MSBuildThisFileDirectory.TrimEnd('\').TrimEnd('/'))\ - Debug - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - true - true - $(SolutionDir)_Build\ - $([System.IO.Path]::GetFullPath('$(ArtifactsDir)obj\$(Configuration)\$(MSBuildProjectName)'))\ - $([System.IO.Path]::GetFullPath('$(ArtifactsDir)bin\$(Configuration)'))\ - $([System.IO.Path]::GetFullPath('$(ArtifactsDir)tests'))\ - $(BaseOutputPath) - $(BaseIntermediateOutputPath) - $(MSBuildProjectExtensionsPath)project.assets.json - $(MSBuildProjectExtensionsPath)$(MSBuildProjectName).assets.cache - - - - false - false - false - false - true - - true - snupkg - true - true - - - - - - - - - $(DoProductName) - $(DoProductAuthors) - $(DoProductAuthors) - $(DoVersionName) - $(DoMajor).$(DoMinor).0.0 - $(DoMajor).$(DoMinor).$(DoPatch).$(DoBuildNumber) - $(DoProductCopyright) - https://dataobjects.net/ - do-nuget.png - MIT - DataObjects.Net ORM BLL Persistence - $(MSBuildThisFileDirectory)_Build\$(Configuration)\packages - https://github.com/DataObjects-NET/dataobjects-net - git - - - - - - - - + + + + + + + + $(BUILD_NUMBER) + 0 + $([System.DateTime]::Today.Year) + DataObjects.Net + Xtensive LLC and contributors + 2003-$(DoBuildYear) $(DoProductAuthors) + dev-$(DoBuildNumber) + $([System.Version]::new($(DoVersion)).Major) + $([System.Version]::new($(DoVersion)).Minor) + $([System.Version]::new($(DoVersion)).Build) + $(DoMajor).$(DoMinor).$(DoPatch) + $(DoVersionName)-$(DoVersionSuffix) + $(MSBuildThisFileDirectory)do-nuget.png + $(MSBuildThisFileDirectory)_Build\rev.txt + + + + 8.0 + $(MSBuildThisFileDirectory.TrimEnd('\').TrimEnd('/'))\ + Debug + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + true + $(SolutionDir)_Build\ + $([System.IO.Path]::GetFullPath('$(ArtifactsDir)obj\$(Configuration)\$(MSBuildProjectName)'))\ + $([System.IO.Path]::GetFullPath('$(ArtifactsDir)bin\$(Configuration)'))\ + $([System.IO.Path]::GetFullPath('$(ArtifactsDir)tests'))\ + $(BaseOutputPath) + $(BaseIntermediateOutputPath) + $(MSBuildProjectExtensionsPath)project.assets.json + $(MSBuildProjectExtensionsPath)$(MSBuildProjectName).assets.cache + + + + false + false + false + false + true + + true + snupkg + true + true + + + + + + + + + $(DoProductName) + $(DoProductAuthors) + $(DoProductAuthors) + $(DoVersionName) + $(DoMajor).$(DoMinor).0.0 + $(DoMajor).$(DoMinor).$(DoPatch).$(DoBuildNumber) + $(DoProductCopyright) + https://dataobjects.net/ + do-nuget.png + MIT + DataObjects.Net ORM BLL Persistence + $(MSBuildThisFileDirectory)_Build\$(Configuration)\packages + https://github.com/DataObjects-NET/dataobjects-net + git + + + + + + + + diff --git a/Extensions/TestCommon/App.config b/Extensions/TestCommon/App.config index 57eba09a35..08f6fa3e54 100644 --- a/Extensions/TestCommon/App.config +++ b/Extensions/TestCommon/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Extensions/TestCommon/AssemblyExtensions.cs b/Extensions/TestCommon/AssemblyExtensions.cs index 766762b748..ad71969fd0 100644 --- a/Extensions/TestCommon/AssemblyExtensions.cs +++ b/Extensions/TestCommon/AssemblyExtensions.cs @@ -1,16 +1,16 @@ -using System; -using System.Reflection; -using System.Collections.Generic; -using System.Text; -using System.Configuration; - -namespace TestCommon -{ - public static class AssemblyExtensions - { - public static Configuration GetAssemblyConfiguration(this Assembly assembly) - { - return ConfigurationManager.OpenExeConfiguration(assembly.Location); - } - } -} +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Text; +using System.Configuration; + +namespace TestCommon +{ + public static class AssemblyExtensions + { + public static Configuration GetAssemblyConfiguration(this Assembly assembly) + { + return ConfigurationManager.OpenExeConfiguration(assembly.Location); + } + } +} diff --git a/Extensions/TestCommon/CommonModelTest.cs b/Extensions/TestCommon/CommonModelTest.cs index f27a1f6699..b0cc5a881c 100644 --- a/Extensions/TestCommon/CommonModelTest.cs +++ b/Extensions/TestCommon/CommonModelTest.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2019-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. - -using System.Collections.Generic; -using NUnit.Framework; -using TestCommon.Model; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; - -namespace TestCommon -{ - [TestFixture] - public abstract class CommonModelTest - { - private List notDisposed; - - protected Domain Domain { get; private set; } - - [SetUp] - public virtual void SetUp() - { - CheckRequirements(); - var config = BuildConfiguration(); - Domain = BuildDomain(config); - notDisposed = new List(); - Domain.SessionOpen += (sender, args) => { - notDisposed.Add(args.Session); - args.Session.Events.Disposing += (o, eventArgs) => { - lock (notDisposed) { - notDisposed.Remove(args.Session); - } - }; - }; - PopulateData(); - } - - [TearDown] - public virtual void TearDown() - { - if (notDisposed!=null) - Assert.That(notDisposed, Is.Empty); - Assert.That(SessionScope.CurrentSession, Is.Null); - Domain.DisposeSafely(); - } - - protected virtual DomainConfiguration BuildConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (Bar).Assembly); - return configuration; - } - - protected virtual Domain BuildDomain(DomainConfiguration configuration) - { - return Domain.Build(configuration); - } - - protected virtual void PopulateData() - { - } - - protected virtual void CheckRequirements() - { - } - } +// Copyright (C) 2019-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System.Collections.Generic; +using NUnit.Framework; +using TestCommon.Model; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; + +namespace TestCommon +{ + [TestFixture] + public abstract class CommonModelTest + { + private List notDisposed; + + protected Domain Domain { get; private set; } + + [SetUp] + public virtual void SetUp() + { + CheckRequirements(); + var config = BuildConfiguration(); + Domain = BuildDomain(config); + notDisposed = new List(); + Domain.SessionOpen += (sender, args) => { + notDisposed.Add(args.Session); + args.Session.Events.Disposing += (o, eventArgs) => { + lock (notDisposed) { + notDisposed.Remove(args.Session); + } + }; + }; + PopulateData(); + } + + [TearDown] + public virtual void TearDown() + { + if (notDisposed!=null) + Assert.That(notDisposed, Is.Empty); + Assert.That(SessionScope.CurrentSession, Is.Null); + Domain.DisposeSafely(); + } + + protected virtual DomainConfiguration BuildConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (Bar).Assembly); + return configuration; + } + + protected virtual Domain BuildDomain(DomainConfiguration configuration) + { + return Domain.Build(configuration); + } + + protected virtual void PopulateData() + { + } + + protected virtual void CheckRequirements() + { + } + } } \ No newline at end of file diff --git a/Extensions/TestCommon/DomainConfigurationFactory.cs b/Extensions/TestCommon/DomainConfigurationFactory.cs index 1e4e58f60e..66002c08ab 100644 --- a/Extensions/TestCommon/DomainConfigurationFactory.cs +++ b/Extensions/TestCommon/DomainConfigurationFactory.cs @@ -1,22 +1,22 @@ -using Xtensive.Orm; -using Xtensive.Orm.Configuration; - -namespace TestCommon -{ - public static class DomainConfigurationFactory - { - public static DomainConfiguration Create(string name = null) - { - var testConfiguration = TestConfiguration.Instance; - var storageName = name ?? testConfiguration.Storage; - - var configuration = typeof(DomainConfigurationFactory).Assembly.GetAssemblyConfiguration(); - var domainConfiguration = DomainConfiguration.Load(configuration, storageName); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - var customConnectionInfo = testConfiguration.GetConnectionInfo(storageName); - if (customConnectionInfo != null) - domainConfiguration.ConnectionInfo = customConnectionInfo; - return domainConfiguration; - } - } +using Xtensive.Orm; +using Xtensive.Orm.Configuration; + +namespace TestCommon +{ + public static class DomainConfigurationFactory + { + public static DomainConfiguration Create(string name = null) + { + var testConfiguration = TestConfiguration.Instance; + var storageName = name ?? testConfiguration.Storage; + + var configuration = typeof(DomainConfigurationFactory).Assembly.GetAssemblyConfiguration(); + var domainConfiguration = DomainConfiguration.Load(configuration, storageName); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + var customConnectionInfo = testConfiguration.GetConnectionInfo(storageName); + if (customConnectionInfo != null) + domainConfiguration.ConnectionInfo = customConnectionInfo; + return domainConfiguration; + } + } } \ No newline at end of file diff --git a/Extensions/TestCommon/HasAccessToConfigurationTest.cs b/Extensions/TestCommon/HasAccessToConfigurationTest.cs index 38663523e0..7b8b935f65 100644 --- a/Extensions/TestCommon/HasAccessToConfigurationTest.cs +++ b/Extensions/TestCommon/HasAccessToConfigurationTest.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -namespace TestCommon -{ - [TestFixture] - public abstract class HasConfigurationAccessTest - { - public System.Configuration.Configuration Configuration - { - get { return GetConfigurationForTestAssembly(); } - } - - private System.Configuration.Configuration GetConfigurationForTestAssembly() - { - return GetType().Assembly.GetAssemblyConfiguration(); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +namespace TestCommon +{ + [TestFixture] + public abstract class HasConfigurationAccessTest + { + public System.Configuration.Configuration Configuration + { + get { return GetConfigurationForTestAssembly(); } + } + + private System.Configuration.Configuration GetConfigurationForTestAssembly() + { + return GetType().Assembly.GetAssemblyConfiguration(); + } + } +} diff --git a/Extensions/TestCommon/Model/Bar.cs b/Extensions/TestCommon/Model/Bar.cs index a07ff86e11..b6e04e1f44 100644 --- a/Extensions/TestCommon/Model/Bar.cs +++ b/Extensions/TestCommon/Model/Bar.cs @@ -1,42 +1,42 @@ -using System; -using Xtensive.Orm; - -namespace TestCommon.Model -{ - [HierarchyRoot] - public class Bar : Entity - { - [Field] - [Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public int Count { get; set; } - - [Field] - public string Description { get; set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - public Rectangle Rectangle { get; set; } - - [Field] - [Association("Bar")] - public EntitySet Foo { get; set; } - - public Bar(Session session) - : base(session) - { - } - - public Bar(Session session, int id) - : base(session, id) - { - } - } +using System; +using Xtensive.Orm; + +namespace TestCommon.Model +{ + [HierarchyRoot] + public class Bar : Entity + { + [Field] + [Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public int Count { get; set; } + + [Field] + public string Description { get; set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + public Rectangle Rectangle { get; set; } + + [Field] + [Association("Bar")] + public EntitySet Foo { get; set; } + + public Bar(Session session) + : base(session) + { + } + + public Bar(Session session, int id) + : base(session, id) + { + } + } } \ No newline at end of file diff --git a/Extensions/TestCommon/Model/Bar2.cs b/Extensions/TestCommon/Model/Bar2.cs index 1d55c09fce..48c3152148 100644 --- a/Extensions/TestCommon/Model/Bar2.cs +++ b/Extensions/TestCommon/Model/Bar2.cs @@ -1,39 +1,39 @@ -using System; -using Xtensive.Orm; - -namespace TestCommon.Model -{ - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Bar2 : Entity - { - public Bar2(Session session, DateTime id, Guid id2) - : base(session, id, id2) - { - } - - [Field] - [Key(0)] - public DateTime Id { get; set; } - - [Field] - [Key(1)] - public Guid Id2 { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public int Count { get; set; } - - [Field] - public string Description { get; set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - [Association("Bar")] - public EntitySet Foo { get; set; } - } -} +using System; +using Xtensive.Orm; + +namespace TestCommon.Model +{ + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Bar2 : Entity + { + public Bar2(Session session, DateTime id, Guid id2) + : base(session, id, id2) + { + } + + [Field] + [Key(0)] + public DateTime Id { get; set; } + + [Field] + [Key(1)] + public Guid Id2 { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public int Count { get; set; } + + [Field] + public string Description { get; set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + [Association("Bar")] + public EntitySet Foo { get; set; } + } +} diff --git a/Extensions/TestCommon/Model/Foo.cs b/Extensions/TestCommon/Model/Foo.cs index f4af4eaf41..a590c47b93 100644 --- a/Extensions/TestCommon/Model/Foo.cs +++ b/Extensions/TestCommon/Model/Foo.cs @@ -1,32 +1,32 @@ -using Xtensive.Orm; - -namespace TestCommon.Model -{ - [HierarchyRoot] - [Index("Name", Unique = true)] - public class Foo : Entity - { - [Field] - [Key] - public int Id { get; set; } - - [Field(Length = 150)] - public string Name { get; set; } - - [Field] - [Association("Foo")] - public Bar Bar { get; set; } - - public string Name1 { get; set; } - - public Foo(Session session) - : base(session) - { - } - - public Foo(Session session, int id) - : base(session, id) - { - } - } +using Xtensive.Orm; + +namespace TestCommon.Model +{ + [HierarchyRoot] + [Index("Name", Unique = true)] + public class Foo : Entity + { + [Field] + [Key] + public int Id { get; set; } + + [Field(Length = 150)] + public string Name { get; set; } + + [Field] + [Association("Foo")] + public Bar Bar { get; set; } + + public string Name1 { get; set; } + + public Foo(Session session) + : base(session) + { + } + + public Foo(Session session, int id) + : base(session, id) + { + } + } } \ No newline at end of file diff --git a/Extensions/TestCommon/Model/Foo2.cs b/Extensions/TestCommon/Model/Foo2.cs index 774158df83..667b3f7960 100644 --- a/Extensions/TestCommon/Model/Foo2.cs +++ b/Extensions/TestCommon/Model/Foo2.cs @@ -1,31 +1,31 @@ -using Xtensive.Orm; - -namespace TestCommon.Model -{ - [HierarchyRoot] - [Index("Name", Unique = true)] - [KeyGenerator(KeyGeneratorKind.None)] - public class Foo2 : Entity - { - - public Foo2(Session session, decimal id, string id2) - : base(session, id, id2) - { - } - - [Field] - [Key(0)] - public decimal Id { get; set; } - - [Field(Length = 32)] - [Key(1)] - public string Id2 { get; set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - [Association("Foo")] - public Bar2 Bar { get; set; } - } -} +using Xtensive.Orm; + +namespace TestCommon.Model +{ + [HierarchyRoot] + [Index("Name", Unique = true)] + [KeyGenerator(KeyGeneratorKind.None)] + public class Foo2 : Entity + { + + public Foo2(Session session, decimal id, string id2) + : base(session, id, id2) + { + } + + [Field] + [Key(0)] + public decimal Id { get; set; } + + [Field(Length = 32)] + [Key(1)] + public string Id2 { get; set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + [Association("Foo")] + public Bar2 Bar { get; set; } + } +} diff --git a/Extensions/TestCommon/Model/LinqCompilerContainer.cs b/Extensions/TestCommon/Model/LinqCompilerContainer.cs index a5b36df2e4..5f52b18ee4 100644 --- a/Extensions/TestCommon/Model/LinqCompilerContainer.cs +++ b/Extensions/TestCommon/Model/LinqCompilerContainer.cs @@ -1,19 +1,19 @@ -using System; -using System.Linq.Expressions; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm; - -namespace TestCommon.Model -{ - [CompilerContainer(typeof (Expression))] - public static class LinqCompilerContainer - { - [Compiler(typeof (Foo), "Name1", TargetKind.PropertyGet)] - public static Expression Text1(Expression expression) - { - Expression> ex = p => p.Name + "test"; - return ex.BindParameters(expression); - } - } +using System; +using System.Linq.Expressions; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm; + +namespace TestCommon.Model +{ + [CompilerContainer(typeof (Expression))] + public static class LinqCompilerContainer + { + [Compiler(typeof (Foo), "Name1", TargetKind.PropertyGet)] + public static Expression Text1(Expression expression) + { + Expression> ex = p => p.Name + "test"; + return ex.BindParameters(expression); + } + } } \ No newline at end of file diff --git a/Extensions/TestCommon/Model/Point.cs b/Extensions/TestCommon/Model/Point.cs index a668202c3c..1ac4ec0a5a 100644 --- a/Extensions/TestCommon/Model/Point.cs +++ b/Extensions/TestCommon/Model/Point.cs @@ -1,17 +1,17 @@ -using Xtensive.Orm; - -namespace TestCommon.Model -{ - public class Point : Structure - { - [Field] - public int? X { get; set; } - - [Field] - public int? Y { get; set; } - - public Point(Session session) - : base(session) - {} - } -} +using Xtensive.Orm; + +namespace TestCommon.Model +{ + public class Point : Structure + { + [Field] + public int? X { get; set; } + + [Field] + public int? Y { get; set; } + + public Point(Session session) + : base(session) + {} + } +} diff --git a/Extensions/TestCommon/Model/Rectangle.cs b/Extensions/TestCommon/Model/Rectangle.cs index 5c1d2228aa..2b75a0d08b 100644 --- a/Extensions/TestCommon/Model/Rectangle.cs +++ b/Extensions/TestCommon/Model/Rectangle.cs @@ -1,18 +1,18 @@ -using Xtensive.Orm; - -namespace TestCommon.Model -{ - public class Rectangle : Structure - { - [Field] - public int? BorderWidth { get; set; } - [Field] - public Point First { get; set; } - [Field] - public Point Second { get; set; } - - public Rectangle(Session session) - : base(session) - {} - } -} +using Xtensive.Orm; + +namespace TestCommon.Model +{ + public class Rectangle : Structure + { + [Field] + public int? BorderWidth { get; set; } + [Field] + public Point First { get; set; } + [Field] + public Point Second { get; set; } + + public Rectangle(Session session) + : base(session) + {} + } +} diff --git a/Extensions/TestCommon/TestCommon.csproj b/Extensions/TestCommon/TestCommon.csproj index 019d13a4f0..48d5dccb46 100644 --- a/Extensions/TestCommon/TestCommon.csproj +++ b/Extensions/TestCommon/TestCommon.csproj @@ -1,25 +1,25 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - true - ..\Extensions.snk - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + true + ..\Extensions.snk + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/TestCommon/TestConfiguration.cs b/Extensions/TestCommon/TestConfiguration.cs index 8884cea918..38369533e7 100644 --- a/Extensions/TestCommon/TestConfiguration.cs +++ b/Extensions/TestCommon/TestConfiguration.cs @@ -1,100 +1,100 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Xtensive.Orm; - -namespace TestCommon -{ - public sealed class TestConfiguration - { - private const string StorageKey = "DO_STORAGE"; - private const string StorageFileKey = "DO_STORAGE_FILE"; - private const string ConfigurationFileKey = "DO_CONFIG_FILE"; - private const string DefaultStorage = "default"; - - private static readonly object InstanceLock = new object(); - private static TestConfiguration InstanceValue; - - private readonly Dictionary configuration; - - public static TestConfiguration Instance - { - get - { - lock (InstanceLock) { - if (InstanceValue==null) - InstanceValue = new TestConfiguration(); - return InstanceValue; - } - } - } - - public string Storage { get; private set; } - - public ConnectionInfo GetConnectionInfo(string name) - { - var value = GetConfigurationVariable(name); - if (value==null) - return null; - - if (!value.StartsWith("[")) - return new ConnectionInfo(value); - - var items = value.Split(new[] {'[', ']'}, StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToArray(); - if (items.Length!=2) - throw new InvalidOperationException(string.Format("Invalid connection string format: {0}", value)); - return new ConnectionInfo(items[0], items[1]); - } - - private string GetEnvironmentVariable(string key) - { - return new[] {EnvironmentVariableTarget.Process, EnvironmentVariableTarget.User, EnvironmentVariableTarget.Machine} - .Select(target => Environment.GetEnvironmentVariable(key, target)) - .FirstOrDefault(result => !string.IsNullOrEmpty(result)); - } - - private string GetConfigurationVariable(string key) - { - string result; - if (configuration.TryGetValue(key, out result) && !string.IsNullOrEmpty(result)) - return result; - return null; - } - - private static Dictionary ParseConfigurationFile(string file) - { - var entries = - from line in File.ReadAllLines(file) - let items = line.Trim().Split(new[] {'='}, 2) - where items.Length==2 - let key = items[0].Trim() - let value = items[1].Trim() - where key!=string.Empty && value!=string.Empty - select new {key, value}; - return entries.ToDictionary(i => i.key, i => i.value); - } - - private Dictionary LoadConfiguration() - { - var configurationFile = GetEnvironmentVariable(ConfigurationFileKey); - if (configurationFile!=null && File.Exists(configurationFile)) - return ParseConfigurationFile(configurationFile); - return new Dictionary(); - } - - private string GetStorageFromFile() - { - var storageFile = GetEnvironmentVariable(StorageFileKey); - if (storageFile!=null && File.Exists(storageFile)) - return File.ReadAllLines(storageFile).Select(l => l.Trim()).FirstOrDefault(l => !string.IsNullOrEmpty(l)); - return null; - } - - private TestConfiguration() - { - configuration = LoadConfiguration(); - Storage = GetEnvironmentVariable(StorageKey) ?? GetStorageFromFile() ?? DefaultStorage; - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Xtensive.Orm; + +namespace TestCommon +{ + public sealed class TestConfiguration + { + private const string StorageKey = "DO_STORAGE"; + private const string StorageFileKey = "DO_STORAGE_FILE"; + private const string ConfigurationFileKey = "DO_CONFIG_FILE"; + private const string DefaultStorage = "default"; + + private static readonly object InstanceLock = new object(); + private static TestConfiguration InstanceValue; + + private readonly Dictionary configuration; + + public static TestConfiguration Instance + { + get + { + lock (InstanceLock) { + if (InstanceValue==null) + InstanceValue = new TestConfiguration(); + return InstanceValue; + } + } + } + + public string Storage { get; private set; } + + public ConnectionInfo GetConnectionInfo(string name) + { + var value = GetConfigurationVariable(name); + if (value==null) + return null; + + if (!value.StartsWith("[")) + return new ConnectionInfo(value); + + var items = value.Split(new[] {'[', ']'}, StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToArray(); + if (items.Length!=2) + throw new InvalidOperationException(string.Format("Invalid connection string format: {0}", value)); + return new ConnectionInfo(items[0], items[1]); + } + + private string GetEnvironmentVariable(string key) + { + return new[] {EnvironmentVariableTarget.Process, EnvironmentVariableTarget.User, EnvironmentVariableTarget.Machine} + .Select(target => Environment.GetEnvironmentVariable(key, target)) + .FirstOrDefault(result => !string.IsNullOrEmpty(result)); + } + + private string GetConfigurationVariable(string key) + { + string result; + if (configuration.TryGetValue(key, out result) && !string.IsNullOrEmpty(result)) + return result; + return null; + } + + private static Dictionary ParseConfigurationFile(string file) + { + var entries = + from line in File.ReadAllLines(file) + let items = line.Trim().Split(new[] {'='}, 2) + where items.Length==2 + let key = items[0].Trim() + let value = items[1].Trim() + where key!=string.Empty && value!=string.Empty + select new {key, value}; + return entries.ToDictionary(i => i.key, i => i.value); + } + + private Dictionary LoadConfiguration() + { + var configurationFile = GetEnvironmentVariable(ConfigurationFileKey); + if (configurationFile!=null && File.Exists(configurationFile)) + return ParseConfigurationFile(configurationFile); + return new Dictionary(); + } + + private string GetStorageFromFile() + { + var storageFile = GetEnvironmentVariable(StorageFileKey); + if (storageFile!=null && File.Exists(storageFile)) + return File.ReadAllLines(storageFile).Select(l => l.Trim()).FirstOrDefault(l => !string.IsNullOrEmpty(l)); + return null; + } + + private TestConfiguration() + { + configuration = LoadConfiguration(); + Storage = GetEnvironmentVariable(StorageKey) ?? GetStorageFromFile() ?? DefaultStorage; + } + } +} diff --git a/Extensions/TestCommon/Tests/TestConfigurationTest.cs b/Extensions/TestCommon/Tests/TestConfigurationTest.cs index 8d83b2335a..7c25adc63c 100644 --- a/Extensions/TestCommon/Tests/TestConfigurationTest.cs +++ b/Extensions/TestCommon/Tests/TestConfigurationTest.cs @@ -1,18 +1,18 @@ -using System; -using NUnit.Framework; - -namespace TestCommon.Tests -{ - [TestFixture] - public class TestConfigurationTest - { - [Test] - public void Test() - { - var storage = TestConfiguration.Instance.Storage; - Console.WriteLine("storage: {0}", storage); - var configuration = DomainConfigurationFactory.Create(); - Console.WriteLine("connection: {0}", configuration.ConnectionInfo); - } - } +using System; +using NUnit.Framework; + +namespace TestCommon.Tests +{ + [TestFixture] + public class TestConfigurationTest + { + [Test] + public void Test() + { + var storage = TestConfiguration.Instance.Storage; + Console.WriteLine("storage: {0}", storage); + var configuration = DomainConfigurationFactory.Create(); + Console.WriteLine("connection: {0}", configuration.ConnectionInfo); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/App.config b/Extensions/Xtensive.Orm.BulkOperations.Tests/App.config index 1d60debcec..2aa19088d9 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/App.config +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/AutoBuildTest.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/AutoBuildTest.cs index a3209574b1..09c6d280c3 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/AutoBuildTest.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/AutoBuildTest.cs @@ -1,19 +1,19 @@ -using NUnit.Framework; -using TestCommon; -using TestCommon.Model; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.BulkOperations.Tests -{ - [TestFixture] - public abstract class AutoBuildTest : CommonModelTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (IUpdatable<>).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly); - return configuration; - } - } +using NUnit.Framework; +using TestCommon; +using TestCommon.Model; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.BulkOperations.Tests +{ + [TestFixture] + public abstract class AutoBuildTest : CommonModelTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (IUpdatable<>).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly); + return configuration; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Extensions.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/Extensions.cs index 73095ca54c..7f10d10e70 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Extensions.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Extensions.cs @@ -1,17 +1,17 @@ -using System; -using NUnit.Framework; -using NUnit.Framework.Constraints; - -namespace Xtensive.Orm.BulkOperations.Tests -{ - public static class Extensions - { - public static void AssertCommandCount(this Session session, IResolveConstraint expression, Action action) - { - int count = 0; - session.Events.DbCommandExecuting += (sender, args) => count++; - action(); - Assert.That(count, expression); - } - } +using System; +using NUnit.Framework; +using NUnit.Framework.Constraints; + +namespace Xtensive.Orm.BulkOperations.Tests +{ + public static class Extensions + { + public static void AssertCommandCount(this Session session, IResolveConstraint expression, Action action) + { + int count = 0; + session.Events.DbCommandExecuting += (sender, args) => count++; + action(); + Assert.That(count, expression); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug.cs index 9b04847ac8..e6b2923ec8 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.10.16 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Model; -using Xtensive.Orm.BulkOperations.Tests.Issues.Model; - -namespace Xtensive.Orm.BulkOperations.Tests.Issues.Model -{ - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class ServiceMaterial : AbstractBaseForServiceMaterial - { - [Field, Key] - public int Id { get; set; } - - [Field] - public PreservedService Owner { get; set; } - } - - [HierarchyRoot] - public class PreservedService : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet ServiceMaterials { get; set; } - } - - public abstract class AbstractBaseForServiceMaterial : Entity - { - [Field] - public bool Active { get; set; } - } -} - -namespace Xtensive.Orm.BulkOperations.Tests.Issues -{ - public class IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug : AutoBuildTest - { - [Test] - public void UpdateTest() - { - List keys = new List(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - var owner = new PreservedService(); - keys.Add(owner.Id); - new ServiceMaterial { Active = false, Owner = owner }; - } - transaction.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => session.Query.All().Where(el => !el.Owner.Id.In(keys)).Set(el => el.Active, false).Update()); - } - } - - [Test] - public void InsertTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=>session.Query.Insert(() => new ServiceMaterial { Active = true, Owner = null })); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.10.16 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Model; +using Xtensive.Orm.BulkOperations.Tests.Issues.Model; + +namespace Xtensive.Orm.BulkOperations.Tests.Issues.Model +{ + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class ServiceMaterial : AbstractBaseForServiceMaterial + { + [Field, Key] + public int Id { get; set; } + + [Field] + public PreservedService Owner { get; set; } + } + + [HierarchyRoot] + public class PreservedService : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet ServiceMaterials { get; set; } + } + + public abstract class AbstractBaseForServiceMaterial : Entity + { + [Field] + public bool Active { get; set; } + } +} + +namespace Xtensive.Orm.BulkOperations.Tests.Issues +{ + public class IssueJira0560_ChangeFieldWhichDefinedInAncestorClassBug : AutoBuildTest + { + [Test] + public void UpdateTest() + { + List keys = new List(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + var owner = new PreservedService(); + keys.Add(owner.Id); + new ServiceMaterial { Active = false, Owner = owner }; + } + transaction.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => session.Query.All().Where(el => !el.Owner.Id.In(keys)).Set(el => el.Active, false).Update()); + } + } + + [Test] + public void InsertTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=>session.Query.Insert(() => new ServiceMaterial { Active = true, Owner = null })); + } + } + } +} diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0565_IgnoringTakeMethodOnTranslation.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0565_IgnoringTakeMethodOnTranslation.cs index fa0b7ad60f..57e60ab38c 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0565_IgnoringTakeMethodOnTranslation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Issues/IssueJira0565_IgnoringTakeMethodOnTranslation.cs @@ -1,293 +1,293 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.06 - -using System; -using System.Linq; -using NUnit.Framework; -using TestCommon.Model; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.BulkOperations.Tests.Issues -{ - public class IssueJira0565_IgnoringTakeMethodOnTranslation : AutoBuildTest - { - [Test] - public void UpdateOperationWithoutLimitation01() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All(); - var expectedUpdatedCount = baseQuery.Count(); - var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); - Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); - var updatedList = baseQuery.Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); - } - } - - [Test] - public void UpdateOperationWithoutLimitation02() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 51).Union(session.Query.All().Where(el => el.Id > 200)); - var expectedUpdatedCount = baseQuery.Count(); - var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); - Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); - var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); - } - } - - [Test] - public void DeleteOperationWithoutLimitation01() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All(); - var expectedDeletedCount = baseQuery.Count(); - var deletedCount = baseQuery.Delete(); - Assert.That(deletedCount, Is.EqualTo(expectedDeletedCount)); - var updatedList = baseQuery.ToList(); - Assert.That(updatedList.Count, Is.EqualTo(0)); - } - } - - [Test] - public void DeleteOperationWithoutLimitation02() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 51).Union(session.Query.All().Where(el => el.Id > 200)); - var expectedDeletedCount = baseQuery.Count(); - var deletedCount = baseQuery.Delete(); - Assert.That(deletedCount, Is.EqualTo(expectedDeletedCount)); - } - } - - [Test] - public void UpdateOperationWithLimitation01() - { - SupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Take(200); - var expectedUpdatedCount = baseQuery.Count(); - var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); - Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); - var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); - } - } - - [Test] - public void UpdateOperationWithLimitation02() - { - SupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 100).Take(50).Union(session.Query.All().Where(el => el.Id > 100).Take(50)); - var expectedUpdatedCount = baseQuery.Count(); - var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); - Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); - var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); - } - } - - [Test] - public void UpdateOperationWithLimitation03() - { - SupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100); - var expectedUpdatedCount = baseQuery.Count(); - var updated = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); - Assert.That(updated, Is.EqualTo(expectedUpdatedCount)); - var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.That(updatedList.Count, Is.EqualTo(100)); - } - } - - [Test] - public void UpdateOperationWithLimitation04() - { - DoesNotSupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()){ - Assert.Throws(()=>session.Query.All().Take(200).Set(el => el.Description, "UpdatedAgain").Update()); - } - } - - [Test] - public void UpdateOperationWithLimitation05() - { - DoesNotSupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - ()=>session.Query.All().Where(el => el.Id < 100) - .Union(session.Query.All().Where(el => el.Id > 100)) - .Take(100) - .Set(el => el.Description, "UpdatedAgain") - .Update() - ); - } - } - - [Test] - public void DeleteOperationWithLimitation01() - { - SupportsDeleteLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var updated = session.Query.All().Take(100).Delete(); - Assert.AreEqual(100, updated); - var updatedList = session.Query.All().ToList(); - Assert.AreEqual(150, updatedList.Count); - } - } - - [Test] - public void DeleteOperationWithLimitation02() - { - SupportsDeleteLimitation(); - if(StringComparer.InvariantCultureIgnoreCase.Compare(Domain.StorageProviderInfo.ProviderName, WellKnown.Provider.Firebird)==0) - IgnoreMe("Ignored due to FireBird ignores Take X in delete statement", null); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 100).Take(50).Union(session.Query.All().Where(el => el.Id > 100).Take(50)); - var expectedDeletedCount = baseQuery.Count(); - var updatedCount = baseQuery.Delete(); - Assert.That(updatedCount, Is.EqualTo(expectedDeletedCount)); - } - } - - [Test] - public void DeleteOperationWithLimitation03() - { - SupportsDeleteLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var baseQuery = session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100); - var expectedDeletedCount = baseQuery.Count(); - var updated = baseQuery.Delete(); - Assert.That(updated, Is.EqualTo(expectedDeletedCount)); - } - } - - [Test] - public void DeleteOperationWithLimitation04() - { - DoesNotSupportsDeleteLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(()=>session.Query.All().Take(100).Delete()); - } - } - - [Test] - public void DeleteOperationWithLimitation05() - { - DoesNotSupportsDeleteLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100).Delete()); - } - } - - [Test] - public void UpdateOperationTableAsSource() - { - SupportsUpdateLimitation(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All().Take(200).ToList(); - Assert.AreEqual(200, list.Count); - var updated = session.Query.All().Take(200).Set(el => el.Description, "Updated").Update(); - Assert.AreEqual(200, updated); - var updatedList = session.Query.All().Where(el => el.Description=="Updated").ToList(); - Assert.AreEqual(200, updatedList.Count); - updated = session.Query.All().Set(el => el.Description, "UpdatedAgain").Update(); - Assert.AreEqual(250, updated); - updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); - Assert.AreEqual(250, updatedList.Count); - } - } - - protected override void PopulateData() - { - base.PopulateData(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i< 250; i++) { - new Bar(session); - } - transaction.Complete(); - } - } - - protected override Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - private void SupportsUpdateLimitation() - { - if (!Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit) && - !Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom)) - IgnoreMe("This provider does not support limitation of affecred rows on update.", null); - } - - private void DoesNotSupportsUpdateLimitation() - { - if (Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit) || - Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom)) - IgnoreMe("This provider supports update limitation", null); - } - - private void SupportsDeleteLimitation() - { - if (!Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit) && - !Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom)) - IgnoreMe("This provider does not support limitation of affecred rows on delet.", null); - } - - private void DoesNotSupportsDeleteLimitation() - { - if (Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit) || - Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom)) - IgnoreMe("This provider support delete limitation", null); - } - - private static void IgnoreMe(string format, object argument, string reason = null) - { - var message = string.Format(format, argument); - if (!string.IsNullOrEmpty(reason)) - message = string.Format("{0}. Reason: {1}", message, reason); - throw new IgnoreException(message); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.06 + +using System; +using System.Linq; +using NUnit.Framework; +using TestCommon.Model; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.BulkOperations.Tests.Issues +{ + public class IssueJira0565_IgnoringTakeMethodOnTranslation : AutoBuildTest + { + [Test] + public void UpdateOperationWithoutLimitation01() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All(); + var expectedUpdatedCount = baseQuery.Count(); + var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); + Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); + var updatedList = baseQuery.Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); + } + } + + [Test] + public void UpdateOperationWithoutLimitation02() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 51).Union(session.Query.All().Where(el => el.Id > 200)); + var expectedUpdatedCount = baseQuery.Count(); + var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); + Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); + var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); + } + } + + [Test] + public void DeleteOperationWithoutLimitation01() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All(); + var expectedDeletedCount = baseQuery.Count(); + var deletedCount = baseQuery.Delete(); + Assert.That(deletedCount, Is.EqualTo(expectedDeletedCount)); + var updatedList = baseQuery.ToList(); + Assert.That(updatedList.Count, Is.EqualTo(0)); + } + } + + [Test] + public void DeleteOperationWithoutLimitation02() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 51).Union(session.Query.All().Where(el => el.Id > 200)); + var expectedDeletedCount = baseQuery.Count(); + var deletedCount = baseQuery.Delete(); + Assert.That(deletedCount, Is.EqualTo(expectedDeletedCount)); + } + } + + [Test] + public void UpdateOperationWithLimitation01() + { + SupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Take(200); + var expectedUpdatedCount = baseQuery.Count(); + var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); + Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); + var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.That(updatedList.Count, Is.EqualTo(expectedUpdatedCount)); + } + } + + [Test] + public void UpdateOperationWithLimitation02() + { + SupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 100).Take(50).Union(session.Query.All().Where(el => el.Id > 100).Take(50)); + var expectedUpdatedCount = baseQuery.Count(); + var updatedCount = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); + Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); + var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.That(updatedCount, Is.EqualTo(expectedUpdatedCount)); + } + } + + [Test] + public void UpdateOperationWithLimitation03() + { + SupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100); + var expectedUpdatedCount = baseQuery.Count(); + var updated = baseQuery.Set(el => el.Description, "UpdatedAgain").Update(); + Assert.That(updated, Is.EqualTo(expectedUpdatedCount)); + var updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.That(updatedList.Count, Is.EqualTo(100)); + } + } + + [Test] + public void UpdateOperationWithLimitation04() + { + DoesNotSupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()){ + Assert.Throws(()=>session.Query.All().Take(200).Set(el => el.Description, "UpdatedAgain").Update()); + } + } + + [Test] + public void UpdateOperationWithLimitation05() + { + DoesNotSupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + ()=>session.Query.All().Where(el => el.Id < 100) + .Union(session.Query.All().Where(el => el.Id > 100)) + .Take(100) + .Set(el => el.Description, "UpdatedAgain") + .Update() + ); + } + } + + [Test] + public void DeleteOperationWithLimitation01() + { + SupportsDeleteLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var updated = session.Query.All().Take(100).Delete(); + Assert.AreEqual(100, updated); + var updatedList = session.Query.All().ToList(); + Assert.AreEqual(150, updatedList.Count); + } + } + + [Test] + public void DeleteOperationWithLimitation02() + { + SupportsDeleteLimitation(); + if(StringComparer.InvariantCultureIgnoreCase.Compare(Domain.StorageProviderInfo.ProviderName, WellKnown.Provider.Firebird)==0) + IgnoreMe("Ignored due to FireBird ignores Take X in delete statement", null); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 100).Take(50).Union(session.Query.All().Where(el => el.Id > 100).Take(50)); + var expectedDeletedCount = baseQuery.Count(); + var updatedCount = baseQuery.Delete(); + Assert.That(updatedCount, Is.EqualTo(expectedDeletedCount)); + } + } + + [Test] + public void DeleteOperationWithLimitation03() + { + SupportsDeleteLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var baseQuery = session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100); + var expectedDeletedCount = baseQuery.Count(); + var updated = baseQuery.Delete(); + Assert.That(updated, Is.EqualTo(expectedDeletedCount)); + } + } + + [Test] + public void DeleteOperationWithLimitation04() + { + DoesNotSupportsDeleteLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(()=>session.Query.All().Take(100).Delete()); + } + } + + [Test] + public void DeleteOperationWithLimitation05() + { + DoesNotSupportsDeleteLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => session.Query.All().Where(el => el.Id < 100).Union(session.Query.All().Where(el => el.Id > 100)).Take(100).Delete()); + } + } + + [Test] + public void UpdateOperationTableAsSource() + { + SupportsUpdateLimitation(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All().Take(200).ToList(); + Assert.AreEqual(200, list.Count); + var updated = session.Query.All().Take(200).Set(el => el.Description, "Updated").Update(); + Assert.AreEqual(200, updated); + var updatedList = session.Query.All().Where(el => el.Description=="Updated").ToList(); + Assert.AreEqual(200, updatedList.Count); + updated = session.Query.All().Set(el => el.Description, "UpdatedAgain").Update(); + Assert.AreEqual(250, updated); + updatedList = session.Query.All().Where(el => el.Description=="UpdatedAgain").ToList(); + Assert.AreEqual(250, updatedList.Count); + } + } + + protected override void PopulateData() + { + base.PopulateData(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i< 250; i++) { + new Bar(session); + } + transaction.Complete(); + } + } + + protected override Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + private void SupportsUpdateLimitation() + { + if (!Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit) && + !Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom)) + IgnoreMe("This provider does not support limitation of affecred rows on update.", null); + } + + private void DoesNotSupportsUpdateLimitation() + { + if (Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit) || + Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom)) + IgnoreMe("This provider supports update limitation", null); + } + + private void SupportsDeleteLimitation() + { + if (!Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit) && + !Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom)) + IgnoreMe("This provider does not support limitation of affecred rows on delet.", null); + } + + private void DoesNotSupportsDeleteLimitation() + { + if (Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit) || + Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom)) + IgnoreMe("This provider support delete limitation", null); + } + + private static void IgnoreMe(string format, object argument, string reason = null) + { + var message = string.Format(format, argument); + if (!string.IsNullOrEmpty(reason)) + message = string.Format("{0}. Reason: {1}", message, reason); + throw new IgnoreException(message); + } + } +} diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Other.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/Other.cs index 2e8bc888aa..00791c25e7 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Other.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Other.cs @@ -1,281 +1,281 @@ -// Copyright (C) 2012-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexander Ovchinnikov -// Created: 2012.02.29 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using TestCommon.Model; -using Xtensive.Orm.Rse; - -namespace Xtensive.Orm.BulkOperations.Tests -{ - internal class Other : AutoBuildTest - { - [Test] - public void CompositeKeyUpdate() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - DateTime date1 = DateTime.Now; - DateTime date2 = DateTime.Now.AddDays(1); - Guid id1 = Guid.NewGuid(); - Guid id2 = Guid.NewGuid(); - var foo1 = new Bar2(session, date1, id1) {Name = "test"}; - var foo2 = new Bar2(session, date2, id1); - var foo3 = new Bar2(session, date2, id2) {Name = "test"}; - int updated = session.Query.All().Where(a => a.Name=="test").Set(a => a.Name, "abccba").Update(); - Assert.That(updated, Is.EqualTo(2)); - Assert.That(foo1.Name, Is.EqualTo("abccba")); - Assert.That(foo3.Name, Is.EqualTo("abccba")); - Assert.That(foo2.Name, Is.Null); - trx.Complete(); - } - } - } - - [Test] - public void SimpleDelete() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar1 = new Bar(session) {Name = "test", Count = 3}; - var bar2 = new Bar(session); - var bar3 = new Bar(session); - bar3.Foo.Add(new Foo(session) {Name = "Foo"}); - string s = "test"; - - int deleted = session.Query.All().Where(a => a.Name==s).Delete(); - Assert.That(bar1.IsRemoved, Is.True); - Assert.That(bar2.IsRemoved, Is.False); - Assert.That(bar3.IsRemoved, Is.False); - Assert.That(deleted, Is.EqualTo(1)); - - session.Query.All().Where(a => a.Foo.Any(b => b.Name=="Foo")).Update(a => new Bar(null) {Name = ""}); - deleted = session.Query.All().Where(a => a.Foo.Count(b => b.Name=="Foo")==0).Delete(); - Assert.That(bar2.IsRemoved, Is.True); - Assert.That(bar3.IsRemoved, Is.False); - Assert.That(deleted, Is.EqualTo(1)); - trx.Complete(); - } - } - } - - [Test] - public void SimpleInsert() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - string s1 = "abccba"; - int i = 5; - Key key = - session.Query.Insert(() => new Bar(session) {Name = "test1" + s1, Count = i * 2 + 1, Description = null}); - Assert.That(key, Is.EqualTo(Key.Create(session.Domain, 1))); - var bar = session.Query.Single(key); - Assert.That(bar.Name, Is.EqualTo("test1abccba")); - Assert.That(bar.Count, Is.EqualTo(11)); - Assert.That(bar.Description, Is.Null); - - key = - session.Query.Insert( - () => new Bar(session) {Id = 100, Name = "test" + s1, Count = i * 2 + 1, Description = null}); - Assert.That(key, Is.EqualTo(Key.Create(session.Domain, 100))); - bar = session.Query.Single(key); - Assert.That(bar.Name, Is.EqualTo("testabccba")); - Assert.That(bar.Count, Is.EqualTo(11)); - Assert.That(bar.Description, Is.Null); - - trx.Complete(); - } - } - } - - [Test] - public void SimpleUpdate() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar1 = new Bar(session) {Name = "test", Count = 3}; - var bar2 = new Bar(session); - string s = "test"; - string s1 = "abccba"; - int updated = - session.Query.All().Where(a => a.Name.Contains(s)).Update( - a => new Bar(session) {Name = a.Name + s1, Count = a.Count * 2, Description = null}); - Assert.That(bar1.Name, Is.EqualTo("testabccba")); - Assert.That(bar1.Description, Is.Null); - Assert.That(bar1.Count, Is.EqualTo(6)); - Assert.That(updated, Is.EqualTo(1)); - trx.Complete(); - } - } - } - - [Test] - public void SubqueryInsert() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - new Foo(session) {Name = "test"}; - new Bar(session) {Name = "test1"}; - session.SaveChanges(); - Key key = null; - session.AssertCommandCount( - Is.EqualTo(1), - () => { key = session.Query.Insert(() => new Bar(session) {Count = session.Query.All().Max(b => b.Count)}); }); - var bar = session.Query.Single(key); - Assert.That(bar.Count, Is.EqualTo(0)); - trx.Complete(); - } - } - } - - [Test] - public void SubqueryUpdate() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session); - var bar2 = new Bar(session) {Count = 1}; - new Foo(session) {Bar = bar, Name = "test"}; - new Foo(session) {Bar = bar, Name = "test1"}; - session.Query.All().Where(a => a.Count==a.Foo.Count - 2).Set(a => a.Count, a => a.Foo.Count).Update(); - Assert.That(bar.Count, Is.EqualTo(2)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Where(a => a.Count==session.Query.All().Max(b => b.Count) + 1).Set(a => a.Count, a => session.Query.All().Min(b => b.Count)).Update()); - Assert.That(bar.Count, Is.EqualTo(2)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Where(a => a.Count==session.Query.All().Max(b => b.Count) + 1).Set(a => a.Count, a => session.Query.All().Count()).Update()); - - trx.Complete(); - } - } - } - - [Test] - public void UpdateViaSet() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar1 = new Bar(session) {Name = "test", Count = 3}; - var bar2 = new Bar(session); - string s = "test"; - string s1 = "abccba"; - int updated = - session.Query.All().Where(a => a.Name.Contains(s)).Set(a => a.Name, s1).Set( - a => a.Count, a => a.Count * 2).Set(a => a.Description, a => a.Name + s1).Update(); - Assert.That(bar1.Name, Is.EqualTo("abccba")); - Assert.That(bar1.Description, Is.EqualTo("testabccba")); - Assert.That(bar1.Count, Is.EqualTo(6)); - Assert.That(updated, Is.EqualTo(1)); - trx.Complete(); - } - } - } - - [Test] - public void UpdateWithReferenceToUpdatingEntity() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var foo1 = new Foo(session) {Name = "Test"}; - var foo2 = new Foo(session); - var foo3 = new Foo(session) {Name = "Test1"}; - var bar1 = new Bar(session) {Name = "Test"}; - var bar2 = new Bar(session); - Assert.Throws(()=>session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Name==a.Name)).Update()); - Assert.That(foo1.Bar, Is.Null); - Assert.That(foo2.Bar, Is.Null); - Assert.That(foo3.Bar, Is.Null); - trx.Complete(); - } - } - } - [Test] - public void In() - { - using (Session session = Domain.OpenSession()) - using (TransactionScope trx = session.OpenTransaction()) { - var bar1 = new Bar(session, 1); - var bar3 = new Bar(session, 3); - var bar5 = new Bar(session, 5); - var bar6 = new Bar(session, 6); - var list = new List() {1, 2, 3, 4, 5}; - - session.Query.All() - .Where(a => a.Id.In(IncludeAlgorithm.Auto, list)) - .Set(a => a.Count, 2) - .Update(); - Assert.That(bar1.Count, Is.EqualTo(2)); - Assert.That(bar3.Count, Is.EqualTo(2)); - Assert.That(bar5.Count, Is.EqualTo(2)); - Assert.That(bar6.Count, Is.EqualTo(0)); - - session.Query.All() - .Where(a => a.Id.In(IncludeAlgorithm.ComplexCondition, list)) - .Set(a => a.Count, 3) - .Update(); - Assert.That(bar1.Count, Is.EqualTo(3)); - Assert.That(bar3.Count, Is.EqualTo(3)); - Assert.That(bar5.Count, Is.EqualTo(3)); - Assert.That(bar6.Count, Is.EqualTo(0)); - - session.Query.All() - .Where(a => a.Id.In(list)) - .Set(a => a.Count, 4) - .Update(); - Assert.That(bar1.Count, Is.EqualTo(4)); - Assert.That(bar3.Count, Is.EqualTo(4)); - Assert.That(bar5.Count, Is.EqualTo(4)); - Assert.That(bar6.Count, Is.EqualTo(0)); - - session.Query.All() - .Where(a => a.Id.In(1, 2, 3, 4, 5)) - .Set(a => a.Count, 5) - .Update(); - Assert.That(bar1.Count, Is.EqualTo(5)); - Assert.That(bar3.Count, Is.EqualTo(5)); - Assert.That(bar5.Count, Is.EqualTo(5)); - Assert.That(bar6.Count, Is.EqualTo(0)); - - trx.Complete(); - } - } - - [Test] - public void InWithCombinationWithFieldUsageUpdate() - { - using (Session session = Domain.OpenSession()) - using (TransactionScope trx = session.OpenTransaction()) { - var idsToUpdate = new[] { 99, 100, 102 }; - var prefix = "abc"; - - var bar1 = new Bar(session, 100) { Name = "test1", Count = 3 }; - var bar2 = new Bar(session, 101) { Name = "test2", Count = 4 }; - var bar3 = new Bar(session, 102) { Name = "test3", Count = 5 }; - session.SaveChanges(); - - var updatedCount = session.Query.All() - .Where(b => b.Id.In(IncludeAlgorithm.ComplexCondition, idsToUpdate)) - .Update(bar => new Bar(session) { Name = prefix + bar.Name }); - Assert.That(updatedCount, Is.EqualTo(2)); - - var all = session.Query.All().Where(b=> b.Id == 100 || b.Id == 101 || b.Id == 102).ToList(); - var updatedEntities = all.Where(b => b.Id.In(idsToUpdate)); - Assert.That(updatedEntities.All(e => e.Name.StartsWith(prefix)), Is.True); - - var leftEntities = all.Where(b => !b.Id.In(idsToUpdate)); - Assert.That(leftEntities.All(e => e.Name.StartsWith(prefix)), Is.False); - - trx.Complete(); - } - } - } +// Copyright (C) 2012-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexander Ovchinnikov +// Created: 2012.02.29 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using TestCommon.Model; +using Xtensive.Orm.Rse; + +namespace Xtensive.Orm.BulkOperations.Tests +{ + internal class Other : AutoBuildTest + { + [Test] + public void CompositeKeyUpdate() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + DateTime date1 = DateTime.Now; + DateTime date2 = DateTime.Now.AddDays(1); + Guid id1 = Guid.NewGuid(); + Guid id2 = Guid.NewGuid(); + var foo1 = new Bar2(session, date1, id1) {Name = "test"}; + var foo2 = new Bar2(session, date2, id1); + var foo3 = new Bar2(session, date2, id2) {Name = "test"}; + int updated = session.Query.All().Where(a => a.Name=="test").Set(a => a.Name, "abccba").Update(); + Assert.That(updated, Is.EqualTo(2)); + Assert.That(foo1.Name, Is.EqualTo("abccba")); + Assert.That(foo3.Name, Is.EqualTo("abccba")); + Assert.That(foo2.Name, Is.Null); + trx.Complete(); + } + } + } + + [Test] + public void SimpleDelete() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar1 = new Bar(session) {Name = "test", Count = 3}; + var bar2 = new Bar(session); + var bar3 = new Bar(session); + bar3.Foo.Add(new Foo(session) {Name = "Foo"}); + string s = "test"; + + int deleted = session.Query.All().Where(a => a.Name==s).Delete(); + Assert.That(bar1.IsRemoved, Is.True); + Assert.That(bar2.IsRemoved, Is.False); + Assert.That(bar3.IsRemoved, Is.False); + Assert.That(deleted, Is.EqualTo(1)); + + session.Query.All().Where(a => a.Foo.Any(b => b.Name=="Foo")).Update(a => new Bar(null) {Name = ""}); + deleted = session.Query.All().Where(a => a.Foo.Count(b => b.Name=="Foo")==0).Delete(); + Assert.That(bar2.IsRemoved, Is.True); + Assert.That(bar3.IsRemoved, Is.False); + Assert.That(deleted, Is.EqualTo(1)); + trx.Complete(); + } + } + } + + [Test] + public void SimpleInsert() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + string s1 = "abccba"; + int i = 5; + Key key = + session.Query.Insert(() => new Bar(session) {Name = "test1" + s1, Count = i * 2 + 1, Description = null}); + Assert.That(key, Is.EqualTo(Key.Create(session.Domain, 1))); + var bar = session.Query.Single(key); + Assert.That(bar.Name, Is.EqualTo("test1abccba")); + Assert.That(bar.Count, Is.EqualTo(11)); + Assert.That(bar.Description, Is.Null); + + key = + session.Query.Insert( + () => new Bar(session) {Id = 100, Name = "test" + s1, Count = i * 2 + 1, Description = null}); + Assert.That(key, Is.EqualTo(Key.Create(session.Domain, 100))); + bar = session.Query.Single(key); + Assert.That(bar.Name, Is.EqualTo("testabccba")); + Assert.That(bar.Count, Is.EqualTo(11)); + Assert.That(bar.Description, Is.Null); + + trx.Complete(); + } + } + } + + [Test] + public void SimpleUpdate() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar1 = new Bar(session) {Name = "test", Count = 3}; + var bar2 = new Bar(session); + string s = "test"; + string s1 = "abccba"; + int updated = + session.Query.All().Where(a => a.Name.Contains(s)).Update( + a => new Bar(session) {Name = a.Name + s1, Count = a.Count * 2, Description = null}); + Assert.That(bar1.Name, Is.EqualTo("testabccba")); + Assert.That(bar1.Description, Is.Null); + Assert.That(bar1.Count, Is.EqualTo(6)); + Assert.That(updated, Is.EqualTo(1)); + trx.Complete(); + } + } + } + + [Test] + public void SubqueryInsert() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + new Foo(session) {Name = "test"}; + new Bar(session) {Name = "test1"}; + session.SaveChanges(); + Key key = null; + session.AssertCommandCount( + Is.EqualTo(1), + () => { key = session.Query.Insert(() => new Bar(session) {Count = session.Query.All().Max(b => b.Count)}); }); + var bar = session.Query.Single(key); + Assert.That(bar.Count, Is.EqualTo(0)); + trx.Complete(); + } + } + } + + [Test] + public void SubqueryUpdate() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session); + var bar2 = new Bar(session) {Count = 1}; + new Foo(session) {Bar = bar, Name = "test"}; + new Foo(session) {Bar = bar, Name = "test1"}; + session.Query.All().Where(a => a.Count==a.Foo.Count - 2).Set(a => a.Count, a => a.Foo.Count).Update(); + Assert.That(bar.Count, Is.EqualTo(2)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Where(a => a.Count==session.Query.All().Max(b => b.Count) + 1).Set(a => a.Count, a => session.Query.All().Min(b => b.Count)).Update()); + Assert.That(bar.Count, Is.EqualTo(2)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Where(a => a.Count==session.Query.All().Max(b => b.Count) + 1).Set(a => a.Count, a => session.Query.All().Count()).Update()); + + trx.Complete(); + } + } + } + + [Test] + public void UpdateViaSet() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar1 = new Bar(session) {Name = "test", Count = 3}; + var bar2 = new Bar(session); + string s = "test"; + string s1 = "abccba"; + int updated = + session.Query.All().Where(a => a.Name.Contains(s)).Set(a => a.Name, s1).Set( + a => a.Count, a => a.Count * 2).Set(a => a.Description, a => a.Name + s1).Update(); + Assert.That(bar1.Name, Is.EqualTo("abccba")); + Assert.That(bar1.Description, Is.EqualTo("testabccba")); + Assert.That(bar1.Count, Is.EqualTo(6)); + Assert.That(updated, Is.EqualTo(1)); + trx.Complete(); + } + } + } + + [Test] + public void UpdateWithReferenceToUpdatingEntity() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var foo1 = new Foo(session) {Name = "Test"}; + var foo2 = new Foo(session); + var foo3 = new Foo(session) {Name = "Test1"}; + var bar1 = new Bar(session) {Name = "Test"}; + var bar2 = new Bar(session); + Assert.Throws(()=>session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Name==a.Name)).Update()); + Assert.That(foo1.Bar, Is.Null); + Assert.That(foo2.Bar, Is.Null); + Assert.That(foo3.Bar, Is.Null); + trx.Complete(); + } + } + } + [Test] + public void In() + { + using (Session session = Domain.OpenSession()) + using (TransactionScope trx = session.OpenTransaction()) { + var bar1 = new Bar(session, 1); + var bar3 = new Bar(session, 3); + var bar5 = new Bar(session, 5); + var bar6 = new Bar(session, 6); + var list = new List() {1, 2, 3, 4, 5}; + + session.Query.All() + .Where(a => a.Id.In(IncludeAlgorithm.Auto, list)) + .Set(a => a.Count, 2) + .Update(); + Assert.That(bar1.Count, Is.EqualTo(2)); + Assert.That(bar3.Count, Is.EqualTo(2)); + Assert.That(bar5.Count, Is.EqualTo(2)); + Assert.That(bar6.Count, Is.EqualTo(0)); + + session.Query.All() + .Where(a => a.Id.In(IncludeAlgorithm.ComplexCondition, list)) + .Set(a => a.Count, 3) + .Update(); + Assert.That(bar1.Count, Is.EqualTo(3)); + Assert.That(bar3.Count, Is.EqualTo(3)); + Assert.That(bar5.Count, Is.EqualTo(3)); + Assert.That(bar6.Count, Is.EqualTo(0)); + + session.Query.All() + .Where(a => a.Id.In(list)) + .Set(a => a.Count, 4) + .Update(); + Assert.That(bar1.Count, Is.EqualTo(4)); + Assert.That(bar3.Count, Is.EqualTo(4)); + Assert.That(bar5.Count, Is.EqualTo(4)); + Assert.That(bar6.Count, Is.EqualTo(0)); + + session.Query.All() + .Where(a => a.Id.In(1, 2, 3, 4, 5)) + .Set(a => a.Count, 5) + .Update(); + Assert.That(bar1.Count, Is.EqualTo(5)); + Assert.That(bar3.Count, Is.EqualTo(5)); + Assert.That(bar5.Count, Is.EqualTo(5)); + Assert.That(bar6.Count, Is.EqualTo(0)); + + trx.Complete(); + } + } + + [Test] + public void InWithCombinationWithFieldUsageUpdate() + { + using (Session session = Domain.OpenSession()) + using (TransactionScope trx = session.OpenTransaction()) { + var idsToUpdate = new[] { 99, 100, 102 }; + var prefix = "abc"; + + var bar1 = new Bar(session, 100) { Name = "test1", Count = 3 }; + var bar2 = new Bar(session, 101) { Name = "test2", Count = 4 }; + var bar3 = new Bar(session, 102) { Name = "test3", Count = 5 }; + session.SaveChanges(); + + var updatedCount = session.Query.All() + .Where(b => b.Id.In(IncludeAlgorithm.ComplexCondition, idsToUpdate)) + .Update(bar => new Bar(session) { Name = prefix + bar.Name }); + Assert.That(updatedCount, Is.EqualTo(2)); + + var all = session.Query.All().Where(b=> b.Id == 100 || b.Id == 101 || b.Id == 102).ToList(); + var updatedEntities = all.Where(b => b.Id.In(idsToUpdate)); + Assert.That(updatedEntities.All(e => e.Name.StartsWith(prefix)), Is.True); + + var leftEntities = all.Where(b => !b.Id.In(idsToUpdate)); + Assert.That(leftEntities.All(e => e.Name.StartsWith(prefix)), Is.False); + + trx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/ReferenceFields.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/ReferenceFields.cs index b490c17863..39a5a4bf89 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/ReferenceFields.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/ReferenceFields.cs @@ -1,477 +1,477 @@ -using System; -using System.Linq; -using NUnit.Framework; -using TestCommon.Model; - -namespace Xtensive.Orm.BulkOperations.Tests -{ - internal class ReferenceFields : AutoBuildTest - { - [Test] - public void InsertClientSideReferenceField() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session); - var foo = new Foo(session); - - Key key = session.Query.Insert(() => new Foo(session) {Bar = bar, Name = "test"}); - var foo2 = session.Query.Single(key); - Assert.That(foo2.Bar, Is.EqualTo(bar)); - - key = session.Query.Insert(() => new Foo(session) {Bar = null, Name = "test1"}); - foo2 = session.Query.Single(key); - Assert.That(foo2.Bar, Is.Null); - - trx.Complete(); - } - } - } - - [Test] - public void InsertClientSideReferenceField2() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar2(session, DateTime.Now, Guid.NewGuid()); - var foo = new Foo2(session, 1, "1"); - - Key key = session.Query.Insert(() => new Foo2(null, 0, null) {Bar = bar, Id = 0, Id2 = "test", Name = "test"}); - var foo2 = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo2.Bar)); - - key = session.Query.Insert(() => new Foo2(null, 0, null) {Bar = null, Id = 0, Id2 = "test1", Name = "test1"}); - foo2 = session.Query.Single(key); - Assert.That(foo2.Bar, Is.Null); - - trx.Complete(); - } - } - } - - [Test] - public void UpdateServerSideReferenceField() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session); - var foo = new Foo(session); - var bara = new Bar(session); - session.SaveChanges(); - Assert.That(foo.Bar, Is.Null); - int one = 1; - - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.Single(Key.Create(Domain, typeof (Bar), 1))). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.Single(Key.Create(Domain, 1))). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), () => session.Query.All().Set(a => a.Bar, a => session.Query.Single(1)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, typeof (Bar), 1))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, 1))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Set(a => a.Bar, a => session.Query.SingleOrDefault(1)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id==one).First()). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Id==1)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.All().Where(b => b.Id==1).FirstOrDefault()).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().FirstOrDefault(b => b.Id==1)). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id==1).Single()). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Set(a => a.Bar, a => session.Query.All().Single(b => b.Id==1)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.All().Where(b => b.Id==1).SingleOrDefault()).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().SingleOrDefault(b => b.Id==1)). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - trx.Complete(); - } - } - } - - [Test] - public void InsertServerSideReferenceField() - { - using (Session session = Domain.OpenSession()) - { - using (TransactionScope trx = session.OpenTransaction()) - { - var bar = new Bar(session); - var foo1 = new Foo(session); - session.SaveChanges(); - Assert.That(foo1.Bar, Is.Null); - int one = 1; - Key key = null; - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = (Bar)session.Query.Single(Key.Create(Domain, typeof(Bar), 1)), Name = "test" }) - ); - var foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.Single(Key.Create(Domain, 1)), Name = "test1" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.Single(1), Name = "test2" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = (Bar)session.Query.SingleOrDefault(Key.Create(Domain, typeof(Bar), 1)), Name = "test3" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = null, Name = "test4" }) - ); - foo = session.Query.Single(key); - Assert.That(foo.Bar, Is.Null); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.SingleOrDefault(1), Name = "test5" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == one).First(), Name = "test6" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().First(b => b.Id == 1), Name = "test7" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).FirstOrDefault(), Name = "test8" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().FirstOrDefault(b => b.Id == 1), Name = "test9" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).Single(), Name = "test10" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Single(b => b.Id == 1), Name = "test11" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).SingleOrDefault(), Name = "test12" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.AssertCommandCount( - Is.EqualTo(1), - () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().SingleOrDefault(b => b.Id == 1), Name = "test13" }) - ); - foo = session.Query.Single(key); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - trx.Complete(); - } - } - } - - [Test] - public void UpdateServerSideReferenceField2() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - DateTime date = DateTime.Now; - Guid id = Guid.NewGuid(); - var bar = new Bar2(session, date, id); - var foo = new Foo2(session, 1, "1"); - var bar2 = new Bar2(session, DateTime.Now, Guid.NewGuid()); - session.SaveChanges(); - Assert.That(foo.Bar, Is.Null); - - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.Single(Key.Create(Domain, typeof (Bar2), date, id))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.Single(Key.Create(Domain, date, id))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Set(a => a.Bar, a => session.Query.Single(date, id)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, typeof (Bar2), date, id))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, date, id))).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => session.Query.All().Set(a => a.Bar, a => session.Query.SingleOrDefault(date, id)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).First()). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Id2==id)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).FirstOrDefault()).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().FirstOrDefault(b => b.Id2==id)). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).Single()). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().Single(b => b.Id2==id)).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set( - a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).SingleOrDefault()).Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.AssertCommandCount( - Is.EqualTo(1), - () => - session.Query.All().Set(a => a.Bar, a => session.Query.All().SingleOrDefault(b => b.Id2==id)). - Update()); - Assert.That(bar, Is.EqualTo(foo.Bar)); - trx.Complete(); - } - } - } - - [Test] - public void UpdateClientSideReferenceField() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session); - var foo = new Foo(session); - var bar2 = new Bar(session); - session.Query.All().Set(a => a.Bar, bar).Update(); - Assert.That(bar, Is.EqualTo(foo.Bar)); - session.Query.All().Set(a => a.Bar, (Bar) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.Query.All().Update(a => new Foo(session) {Bar = bar}); - Assert.That(bar, Is.EqualTo(foo.Bar)); - session.Query.All().Update(a => new Foo(session) {Bar = null}); - Assert.That(foo.Bar, Is.Null); - trx.Complete(); - } - } - } - - [Test] - public void UpdateClientSideReferenceField2() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar2(session, DateTime.Now, Guid.NewGuid()); - var foo = new Foo2(session, 1, "1"); - var bar2 = new Bar2(session, DateTime.Now, Guid.NewGuid()); - session.Query.All().Set(a => a.Bar, bar).Update(); - Assert.That(bar, Is.EqualTo(foo.Bar)); - session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); - Assert.That(foo.Bar, Is.Null); - session.Query.All().Update(a => new Foo2(null, 0, null) {Bar = bar}); - Assert.That(bar, Is.EqualTo(foo.Bar)); - session.Query.All().Update(a => new Foo2(null, 0, null) {Bar = null}); - Assert.That(foo.Bar, Is.Null); - trx.Complete(); - } - } - } - } +using System; +using System.Linq; +using NUnit.Framework; +using TestCommon.Model; + +namespace Xtensive.Orm.BulkOperations.Tests +{ + internal class ReferenceFields : AutoBuildTest + { + [Test] + public void InsertClientSideReferenceField() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session); + var foo = new Foo(session); + + Key key = session.Query.Insert(() => new Foo(session) {Bar = bar, Name = "test"}); + var foo2 = session.Query.Single(key); + Assert.That(foo2.Bar, Is.EqualTo(bar)); + + key = session.Query.Insert(() => new Foo(session) {Bar = null, Name = "test1"}); + foo2 = session.Query.Single(key); + Assert.That(foo2.Bar, Is.Null); + + trx.Complete(); + } + } + } + + [Test] + public void InsertClientSideReferenceField2() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar2(session, DateTime.Now, Guid.NewGuid()); + var foo = new Foo2(session, 1, "1"); + + Key key = session.Query.Insert(() => new Foo2(null, 0, null) {Bar = bar, Id = 0, Id2 = "test", Name = "test"}); + var foo2 = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo2.Bar)); + + key = session.Query.Insert(() => new Foo2(null, 0, null) {Bar = null, Id = 0, Id2 = "test1", Name = "test1"}); + foo2 = session.Query.Single(key); + Assert.That(foo2.Bar, Is.Null); + + trx.Complete(); + } + } + } + + [Test] + public void UpdateServerSideReferenceField() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session); + var foo = new Foo(session); + var bara = new Bar(session); + session.SaveChanges(); + Assert.That(foo.Bar, Is.Null); + int one = 1; + + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.Single(Key.Create(Domain, typeof (Bar), 1))). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.Single(Key.Create(Domain, 1))). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), () => session.Query.All().Set(a => a.Bar, a => session.Query.Single(1)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, typeof (Bar), 1))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, 1))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Set(a => a.Bar, a => session.Query.SingleOrDefault(1)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id==one).First()). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Id==1)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.All().Where(b => b.Id==1).FirstOrDefault()).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().FirstOrDefault(b => b.Id==1)). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id==1).Single()). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Set(a => a.Bar, a => session.Query.All().Single(b => b.Id==1)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.All().Where(b => b.Id==1).SingleOrDefault()).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().SingleOrDefault(b => b.Id==1)). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + trx.Complete(); + } + } + } + + [Test] + public void InsertServerSideReferenceField() + { + using (Session session = Domain.OpenSession()) + { + using (TransactionScope trx = session.OpenTransaction()) + { + var bar = new Bar(session); + var foo1 = new Foo(session); + session.SaveChanges(); + Assert.That(foo1.Bar, Is.Null); + int one = 1; + Key key = null; + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = (Bar)session.Query.Single(Key.Create(Domain, typeof(Bar), 1)), Name = "test" }) + ); + var foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.Single(Key.Create(Domain, 1)), Name = "test1" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.Single(1), Name = "test2" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = (Bar)session.Query.SingleOrDefault(Key.Create(Domain, typeof(Bar), 1)), Name = "test3" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = null, Name = "test4" }) + ); + foo = session.Query.Single(key); + Assert.That(foo.Bar, Is.Null); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.SingleOrDefault(1), Name = "test5" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == one).First(), Name = "test6" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().First(b => b.Id == 1), Name = "test7" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).FirstOrDefault(), Name = "test8" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().FirstOrDefault(b => b.Id == 1), Name = "test9" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).Single(), Name = "test10" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Single(b => b.Id == 1), Name = "test11" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().Where(b => b.Id == 1).SingleOrDefault(), Name = "test12" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.AssertCommandCount( + Is.EqualTo(1), + () => key = session.Query.Insert(() => new Foo(session) { Bar = session.Query.All().SingleOrDefault(b => b.Id == 1), Name = "test13" }) + ); + foo = session.Query.Single(key); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + trx.Complete(); + } + } + } + + [Test] + public void UpdateServerSideReferenceField2() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + DateTime date = DateTime.Now; + Guid id = Guid.NewGuid(); + var bar = new Bar2(session, date, id); + var foo = new Foo2(session, 1, "1"); + var bar2 = new Bar2(session, DateTime.Now, Guid.NewGuid()); + session.SaveChanges(); + Assert.That(foo.Bar, Is.Null); + + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.Single(Key.Create(Domain, typeof (Bar2), date, id))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.Single(Key.Create(Domain, date, id))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Set(a => a.Bar, a => session.Query.Single(date, id)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, typeof (Bar2), date, id))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.SingleOrDefault(Key.Create(Domain, date, id))).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => session.Query.All().Set(a => a.Bar, a => session.Query.SingleOrDefault(date, id)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).First()). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().First(b => b.Id2==id)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).FirstOrDefault()).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().FirstOrDefault(b => b.Id2==id)). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).Single()). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().Single(b => b.Id2==id)).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set( + a => a.Bar, a => session.Query.All().Where(b => b.Id2==id).SingleOrDefault()).Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.AssertCommandCount( + Is.EqualTo(1), + () => + session.Query.All().Set(a => a.Bar, a => session.Query.All().SingleOrDefault(b => b.Id2==id)). + Update()); + Assert.That(bar, Is.EqualTo(foo.Bar)); + trx.Complete(); + } + } + } + + [Test] + public void UpdateClientSideReferenceField() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session); + var foo = new Foo(session); + var bar2 = new Bar(session); + session.Query.All().Set(a => a.Bar, bar).Update(); + Assert.That(bar, Is.EqualTo(foo.Bar)); + session.Query.All().Set(a => a.Bar, (Bar) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.Query.All().Update(a => new Foo(session) {Bar = bar}); + Assert.That(bar, Is.EqualTo(foo.Bar)); + session.Query.All().Update(a => new Foo(session) {Bar = null}); + Assert.That(foo.Bar, Is.Null); + trx.Complete(); + } + } + } + + [Test] + public void UpdateClientSideReferenceField2() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar2(session, DateTime.Now, Guid.NewGuid()); + var foo = new Foo2(session, 1, "1"); + var bar2 = new Bar2(session, DateTime.Now, Guid.NewGuid()); + session.Query.All().Set(a => a.Bar, bar).Update(); + Assert.That(bar, Is.EqualTo(foo.Bar)); + session.Query.All().Set(a => a.Bar, (Bar2) null).Update(); + Assert.That(foo.Bar, Is.Null); + session.Query.All().Update(a => new Foo2(null, 0, null) {Bar = bar}); + Assert.That(bar, Is.EqualTo(foo.Bar)); + session.Query.All().Update(a => new Foo2(null, 0, null) {Bar = null}); + Assert.That(foo.Bar, Is.Null); + trx.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Structures.cs b/Extensions/Xtensive.Orm.BulkOperations.Tests/Structures.cs index 22406935ce..49e211b07a 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Structures.cs +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Structures.cs @@ -1,132 +1,132 @@ -using System.Linq; -using NUnit.Framework; -using TestCommon.Model; - -namespace Xtensive.Orm.BulkOperations.Tests -{ - internal class Structures : AutoBuildTest - { - [Test] - public void StructuresSet() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session) {Count = 5}; - - session.Query.All().Set(a => a.Rectangle, new Rectangle(session) {BorderWidth = 1}).Update(); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(1)); - - session.Query.All().Set(a => a.Rectangle, new Rectangle(session)).Update(); - Assert.That(bar.Rectangle.BorderWidth, Is.Null); - - session.Query.All().Set( - a => a.Rectangle, new Rectangle(session) {BorderWidth = 2, First = new Point(session) {X = 3, Y = 4}}).Update( - ); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(2)); - Assert.That(bar.Rectangle.First.X, Is.EqualTo(3)); - Assert.That(bar.Rectangle.First.Y, Is.EqualTo(4)); - Assert.That(bar.Rectangle.Second.X, Is.Null); - bar.Rectangle = new Rectangle(session); - - session.Query.All().Set(a => a.Rectangle.First.X, 1).Update(); - Assert.That(bar.Rectangle.First.X, Is.EqualTo(1)); - Assert.That(bar.Rectangle.Second.X, Is.Null); - bar.Rectangle = new Rectangle(session); - - /*var bar2 = new Bar(session); - session.SaveChanges(); - session.AssertCommandCount(Is.EqualTo(1), () => { - session.Query.All().Where(a => a.Id==bar2.Id).Set( - a => a.Rectangle, - a => session.Query.All().Where(b => a.Id==bar.Id).Select(b => b.Rectangle).First()). - Update(); - }); - Assert.That( bar2.Rectangle.First.X, Is.EqualTo(1)); - Assert.That(bar2.Rectangle.Second.X, Is.Null); - bar2.Remove();*/ - - session.Query.All().Set(a => a.Rectangle.BorderWidth, a => a.Count * 2).Update(); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(10)); - - bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; - session.Query.All().Set(a => a.Rectangle.BorderWidth, 1).Set( - a => a.Rectangle.First, a => new Point(session) {X = 2}).Update(); - Assert.That( - bar.Rectangle, - Is.EqualTo( - new Rectangle(session) { - BorderWidth = 1, - First = new Point(session) {X = 2, Y = 2}, - Second = new Point(session) {X = 3, Y = 4} - })); - bar.Rectangle = new Rectangle(session); - - bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; - session.Query.All().Set(a => a.Rectangle.BorderWidth, 1).Set( - a => a.Rectangle.First, new Point(session) {X = 2}).Update(); - Assert.That( - bar.Rectangle, - Is.EqualTo( - new Rectangle(session) { - BorderWidth = 1, - First = new Point(session) {X = 2, Y = null}, - Second = new Point(session) {X = 3, Y = 4} - })); - bar.Rectangle = new Rectangle(session); - trx.Complete(); - } - } - } - - [Test] - public void StructuresUpdate() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope trx = session.OpenTransaction()) { - var bar = new Bar(session) {Count = 5}; - - session.Query.All().Update( - a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 1}}); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(1)); - - session.Query.All().Update(a => new Bar(null) {Rectangle = new Rectangle(session)}); - Assert.That(bar.Rectangle.BorderWidth, Is.Null); - - session.Query.All().Update( - a => - new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 2, First = new Point(session) {X = 3, Y = 4}}}); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(2)); - Assert.That(bar.Rectangle.First.X, Is.EqualTo(3)); - Assert.That(bar.Rectangle.First.Y, Is.EqualTo(4)); - Assert.That(bar.Rectangle.Second.X, Is.Null); - bar.Rectangle = new Rectangle(session); - - session.Query.All().Update( - a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = a.Count * 2}}); - Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(10)); - bar.Rectangle = new Rectangle(session); - - bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; - session.Query.All().Update( - a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 1, First = new Point(session) {X = 2}}}); - Assert.That( - bar.Rectangle, - Is.EqualTo( - new Rectangle(session) { - BorderWidth = 1, - First = new Point(session) {X = 2, Y = 2}, - Second = new Point(session) {X = 3, Y = 4} - })); - bar.Rectangle = new Rectangle(session); - - var rectangle = new Rectangle(session) {BorderWidth = 1, First = new Point(session) {X = 2}}; - bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; - session.Query.All().Update(a => new Bar(null) {Rectangle = rectangle}); - Assert.That(bar.Rectangle, Is.EqualTo(rectangle)); - bar.Rectangle = new Rectangle(session); - trx.Complete(); - } - } - } - } +using System.Linq; +using NUnit.Framework; +using TestCommon.Model; + +namespace Xtensive.Orm.BulkOperations.Tests +{ + internal class Structures : AutoBuildTest + { + [Test] + public void StructuresSet() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session) {Count = 5}; + + session.Query.All().Set(a => a.Rectangle, new Rectangle(session) {BorderWidth = 1}).Update(); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(1)); + + session.Query.All().Set(a => a.Rectangle, new Rectangle(session)).Update(); + Assert.That(bar.Rectangle.BorderWidth, Is.Null); + + session.Query.All().Set( + a => a.Rectangle, new Rectangle(session) {BorderWidth = 2, First = new Point(session) {X = 3, Y = 4}}).Update( + ); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(2)); + Assert.That(bar.Rectangle.First.X, Is.EqualTo(3)); + Assert.That(bar.Rectangle.First.Y, Is.EqualTo(4)); + Assert.That(bar.Rectangle.Second.X, Is.Null); + bar.Rectangle = new Rectangle(session); + + session.Query.All().Set(a => a.Rectangle.First.X, 1).Update(); + Assert.That(bar.Rectangle.First.X, Is.EqualTo(1)); + Assert.That(bar.Rectangle.Second.X, Is.Null); + bar.Rectangle = new Rectangle(session); + + /*var bar2 = new Bar(session); + session.SaveChanges(); + session.AssertCommandCount(Is.EqualTo(1), () => { + session.Query.All().Where(a => a.Id==bar2.Id).Set( + a => a.Rectangle, + a => session.Query.All().Where(b => a.Id==bar.Id).Select(b => b.Rectangle).First()). + Update(); + }); + Assert.That( bar2.Rectangle.First.X, Is.EqualTo(1)); + Assert.That(bar2.Rectangle.Second.X, Is.Null); + bar2.Remove();*/ + + session.Query.All().Set(a => a.Rectangle.BorderWidth, a => a.Count * 2).Update(); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(10)); + + bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; + session.Query.All().Set(a => a.Rectangle.BorderWidth, 1).Set( + a => a.Rectangle.First, a => new Point(session) {X = 2}).Update(); + Assert.That( + bar.Rectangle, + Is.EqualTo( + new Rectangle(session) { + BorderWidth = 1, + First = new Point(session) {X = 2, Y = 2}, + Second = new Point(session) {X = 3, Y = 4} + })); + bar.Rectangle = new Rectangle(session); + + bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; + session.Query.All().Set(a => a.Rectangle.BorderWidth, 1).Set( + a => a.Rectangle.First, new Point(session) {X = 2}).Update(); + Assert.That( + bar.Rectangle, + Is.EqualTo( + new Rectangle(session) { + BorderWidth = 1, + First = new Point(session) {X = 2, Y = null}, + Second = new Point(session) {X = 3, Y = 4} + })); + bar.Rectangle = new Rectangle(session); + trx.Complete(); + } + } + } + + [Test] + public void StructuresUpdate() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope trx = session.OpenTransaction()) { + var bar = new Bar(session) {Count = 5}; + + session.Query.All().Update( + a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 1}}); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(1)); + + session.Query.All().Update(a => new Bar(null) {Rectangle = new Rectangle(session)}); + Assert.That(bar.Rectangle.BorderWidth, Is.Null); + + session.Query.All().Update( + a => + new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 2, First = new Point(session) {X = 3, Y = 4}}}); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(2)); + Assert.That(bar.Rectangle.First.X, Is.EqualTo(3)); + Assert.That(bar.Rectangle.First.Y, Is.EqualTo(4)); + Assert.That(bar.Rectangle.Second.X, Is.Null); + bar.Rectangle = new Rectangle(session); + + session.Query.All().Update( + a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = a.Count * 2}}); + Assert.That(bar.Rectangle.BorderWidth, Is.EqualTo(10)); + bar.Rectangle = new Rectangle(session); + + bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; + session.Query.All().Update( + a => new Bar(null) {Rectangle = new Rectangle(session) {BorderWidth = 1, First = new Point(session) {X = 2}}}); + Assert.That( + bar.Rectangle, + Is.EqualTo( + new Rectangle(session) { + BorderWidth = 1, + First = new Point(session) {X = 2, Y = 2}, + Second = new Point(session) {X = 3, Y = 4} + })); + bar.Rectangle = new Rectangle(session); + + var rectangle = new Rectangle(session) {BorderWidth = 1, First = new Point(session) {X = 2}}; + bar.Rectangle = new Rectangle(session) {First = new Point(session) {X = 1, Y = 2}, Second = new Point(session) {X = 3, Y = 4}}; + session.Query.All().Update(a => new Bar(null) {Rectangle = rectangle}); + Assert.That(bar.Rectangle, Is.EqualTo(rectangle)); + bar.Rectangle = new Rectangle(session); + trx.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations.Tests/Xtensive.Orm.BulkOperations.Tests.csproj b/Extensions/Xtensive.Orm.BulkOperations.Tests/Xtensive.Orm.BulkOperations.Tests.csproj index 5644d90241..ec1f988580 100644 --- a/Extensions/Xtensive.Orm.BulkOperations.Tests/Xtensive.Orm.BulkOperations.Tests.csproj +++ b/Extensions/Xtensive.Orm.BulkOperations.Tests/Xtensive.Orm.BulkOperations.Tests.csproj @@ -1,26 +1,26 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/BulkExtensions.cs b/Extensions/Xtensive.Orm.BulkOperations/BulkExtensions.cs index 718169ed73..63e6825cae 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/BulkExtensions.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/BulkExtensions.cs @@ -1,133 +1,133 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Xtensive.Orm; - -namespace Xtensive.Orm.BulkOperations -{ - /// - /// Extension methods for bulk operation. - /// - public static class BulkExtensions - { - /// - /// Executes bulk delete of entities specified by the query. - /// - /// Type of the entity. - /// The query. - /// Number of the deleted entities. - public static int Delete(this IQueryable query) where T : class, IEntity - { - return new BulkDeleteOperation(query).Execute(); - } - - /// - /// Executes bulk update of entities specified by the query. - /// - /// The type of the entity. - /// The type of the field. - /// The query. - /// The expression, that specify the field. - /// The expression, that specify new value of the field. - /// Instance of . - [Pure] - public static IUpdatable Set(this IQueryable query, Expression> field, - Expression> update) where T: IEntity - { - return new Updatable(query, field, update); - } - - /// - /// Executes bulk update of entities specified by the query. - /// - /// The type of the entity. - /// The type of the field. - /// , that describes UPDATE operation. - /// The expression, that specify the field. - /// The expression, that specify new value of the field. - /// Instance of . - [Pure] - public static IUpdatable Set(this IUpdatable query, Expression> field, - Expression> update) where T: IEntity - { - return new Updatable((Updatable) query, field, update); - } - - /// - /// Executes bulk update of entities specified by the query. - /// - /// The type of the entity. - /// The type of the field. - /// The query. - /// The expression, that specify the field. - /// New value of the field. - /// Instance of . - [Pure] - public static IUpdatable Set(this IQueryable query, Expression> field, - TResult value) where T: IEntity - { - return Set(query, field, a => value); - } - - /// - /// Executes bulk update of entities specified by the query. - /// - /// The type of the entity. - /// The type of the field. - /// , that describes UPDATE operation. - /// The expression, that specify the field. - /// New value of the field. - /// Instance of . - [Pure] - public static IUpdatable Set(this IUpdatable query, Expression> field, - TResult value) where T: IEntity - { - return Set(query, field, a => value); - } - - /// - /// Executes the UPDATE operation. - /// - /// Type of the entity. - /// The query. - /// The expression, that specify new values. Constructor parameters are ignored. - /// Number of updated entities. - public static int Update(this IQueryable query, Expression> evaluator) where T : class, IEntity - { - return new BulkUpdateOperation(query, evaluator).Execute(); - } - - /// - /// Executes the UPDATE operation. - /// - /// Type of the entity. - /// The query. - /// Number of updated entities. - public static int Update(this IUpdatable query) where T : class, IEntity - { - return new BulkUpdateOperation(query).Execute(); - } - - /// - /// Executes INSERT operation. - /// - /// Type of the entity. - /// The query endpoint. - /// The expression, tha specify new values. - /// Key of the created entity. - public static Key Insert(this QueryEndpoint queryEndpoint, Expression> evaluator) where T : Entity - { - var operation = new InsertOperation(queryEndpoint.Provider, evaluator); - operation.Execute(); - return operation.Key; - } - - #region Non-public methods - - - #endregion - } +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using Xtensive.Orm; + +namespace Xtensive.Orm.BulkOperations +{ + /// + /// Extension methods for bulk operation. + /// + public static class BulkExtensions + { + /// + /// Executes bulk delete of entities specified by the query. + /// + /// Type of the entity. + /// The query. + /// Number of the deleted entities. + public static int Delete(this IQueryable query) where T : class, IEntity + { + return new BulkDeleteOperation(query).Execute(); + } + + /// + /// Executes bulk update of entities specified by the query. + /// + /// The type of the entity. + /// The type of the field. + /// The query. + /// The expression, that specify the field. + /// The expression, that specify new value of the field. + /// Instance of . + [Pure] + public static IUpdatable Set(this IQueryable query, Expression> field, + Expression> update) where T: IEntity + { + return new Updatable(query, field, update); + } + + /// + /// Executes bulk update of entities specified by the query. + /// + /// The type of the entity. + /// The type of the field. + /// , that describes UPDATE operation. + /// The expression, that specify the field. + /// The expression, that specify new value of the field. + /// Instance of . + [Pure] + public static IUpdatable Set(this IUpdatable query, Expression> field, + Expression> update) where T: IEntity + { + return new Updatable((Updatable) query, field, update); + } + + /// + /// Executes bulk update of entities specified by the query. + /// + /// The type of the entity. + /// The type of the field. + /// The query. + /// The expression, that specify the field. + /// New value of the field. + /// Instance of . + [Pure] + public static IUpdatable Set(this IQueryable query, Expression> field, + TResult value) where T: IEntity + { + return Set(query, field, a => value); + } + + /// + /// Executes bulk update of entities specified by the query. + /// + /// The type of the entity. + /// The type of the field. + /// , that describes UPDATE operation. + /// The expression, that specify the field. + /// New value of the field. + /// Instance of . + [Pure] + public static IUpdatable Set(this IUpdatable query, Expression> field, + TResult value) where T: IEntity + { + return Set(query, field, a => value); + } + + /// + /// Executes the UPDATE operation. + /// + /// Type of the entity. + /// The query. + /// The expression, that specify new values. Constructor parameters are ignored. + /// Number of updated entities. + public static int Update(this IQueryable query, Expression> evaluator) where T : class, IEntity + { + return new BulkUpdateOperation(query, evaluator).Execute(); + } + + /// + /// Executes the UPDATE operation. + /// + /// Type of the entity. + /// The query. + /// Number of updated entities. + public static int Update(this IUpdatable query) where T : class, IEntity + { + return new BulkUpdateOperation(query).Execute(); + } + + /// + /// Executes INSERT operation. + /// + /// Type of the entity. + /// The query endpoint. + /// The expression, tha specify new values. + /// Key of the created entity. + public static Key Insert(this QueryEndpoint queryEndpoint, Expression> evaluator) where T : Entity + { + var operation = new InsertOperation(queryEndpoint.Provider, evaluator); + operation.Execute(); + return operation.Key; + } + + #region Non-public methods + + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/IUpdatable.cs b/Extensions/Xtensive.Orm.BulkOperations/IUpdatable.cs index a666532655..7ed1899311 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/IUpdatable.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/IUpdatable.cs @@ -1,12 +1,12 @@ -using Xtensive.Orm.BulkOperations; - -namespace Xtensive.Orm -{ - /// - /// Marker interface for correct work of BulkExtensions.Update methods. - /// - /// Type of the entity. - public interface IUpdatable where T : IEntity - { - } +using Xtensive.Orm.BulkOperations; + +namespace Xtensive.Orm +{ + /// + /// Marker interface for correct work of BulkExtensions.Update methods. + /// + /// Type of the entity. + public interface IUpdatable where T : IEntity + { + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/AddValueContext.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/AddValueContext.cs index a0cfeefdca..a9bc2668a7 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/AddValueContext.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/AddValueContext.cs @@ -1,20 +1,20 @@ -using System.Linq.Expressions; -using Xtensive.Orm.Model; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal class AddValueContext - { - public bool EntityParamExists { get; set; } - - public SetDescriptor Descriptor { get; set; } - - public LambdaExpression Lambda { get; set; } - public SetStatement Statement { get; set; } - - public FieldInfo Field { get; set; } - - public bool SubqueryExists { get; set; } - } +using System.Linq.Expressions; +using Xtensive.Orm.Model; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal class AddValueContext + { + public bool EntityParamExists { get; set; } + + public SetDescriptor Descriptor { get; set; } + + public LambdaExpression Lambda { get; set; } + public SetStatement Statement { get; set; } + + public FieldInfo Field { get; set; } + + public bool SubqueryExists { get; set; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/BaseSqlVisitor.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/BaseSqlVisitor.cs index 463ae2ef1c..c73794d515 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/BaseSqlVisitor.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/BaseSqlVisitor.cs @@ -1,538 +1,538 @@ -using System.Collections.Generic; -using Xtensive.Sql; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal abstract class BaseSqlVisitor : ISqlVisitor - { - private readonly List nodes = new List(); - - public virtual void Visit(SqlAggregate node) - { - VisitInternal(node.Expression); - } - - public virtual void Visit(SqlAlterDomain node) - { - VisitInternal(node.Action); - } - - public virtual void Visit(SqlAlterPartitionFunction node) - { - } - - public virtual void Visit(SqlAlterPartitionScheme node) - { - } - - public virtual void Visit(SqlAlterTable node) - { - VisitInternal(node.Action); - } - - public virtual void Visit(SqlAlterSequence node) - { - } - - public virtual void Visit(SqlArray node) - { - } - - public virtual void Visit(SqlAssignment node) - { - VisitInternal(node.Left); - VisitInternal(node.Right); - } - - public virtual void Visit(SqlBatch node) - { - foreach (SqlStatement statement in node) - VisitInternal(statement); - } - - public virtual void Visit(SqlBetween node) - { - VisitInternal(node.Expression); - VisitInternal(node.Left); - VisitInternal(node.Right); - } - - public virtual void Visit(SqlBinary node) - { - VisitInternal(node.Left); - VisitInternal(node.Right); - } - - public virtual void Visit(SqlBreak node) - { - } - - public virtual void Visit(SqlCase node) - { - VisitInternal(node.Else); - VisitInternal(node.Value); - foreach (KeyValuePair pair in node) { - VisitInternal(pair.Key); - VisitInternal(pair.Value); - } - } - - public virtual void Visit(SqlCast node) - { - VisitInternal(node.Operand); - } - - public virtual void Visit(SqlCloseCursor node) - { - VisitInternal(node.Cursor); - } - - public virtual void Visit(SqlCollate node) - { - VisitInternal(node.Operand); - } - - public virtual void Visit(SqlColumnRef node) - { - VisitInternal(node.SqlColumn); - VisitInternal(node.SqlTable); - } - - public virtual void Visit(SqlConcat node) - { - foreach (SqlExpression expression in node) - VisitInternal(expression); - } - - public virtual void Visit(SqlContinue node) - { - } - - public virtual void Visit(SqlContainer node) - { - } - - public virtual void Visit(SqlCommand node) - { - } - - public virtual void Visit(SqlContainsTable node) - { - VisitInternal(node.Asterisk); - foreach (SqlTableColumn column in node.Columns) - VisitInternal(column); - VisitInternal(node.SearchCondition); - foreach (SqlTableColumn column in node.TargetColumns) - VisitInternal(column); - VisitInternal(node.TargetTable); - } - - public virtual void Visit(SqlCreateAssertion node) - { - } - - public virtual void Visit(SqlCreateCharacterSet node) - { - } - - public virtual void Visit(SqlCreateCollation node) - { - } - - public virtual void Visit(SqlCreateDomain node) - { - } - - public virtual void Visit(SqlCreateIndex node) - { - } - - public virtual void Visit(SqlCreatePartitionFunction node) - { - } - - public virtual void Visit(SqlCreatePartitionScheme node) - { - } - - public virtual void Visit(SqlCreateSchema node) - { - } - - public virtual void Visit(SqlCreateSequence node) - { - } - - public virtual void Visit(SqlCreateTable node) - { - } - - public virtual void Visit(SqlCreateTranslation node) - { - } - - public virtual void Visit(SqlCreateView node) - { - } - - public virtual void Visit(SqlCursor node) - { - VisitInternal(node.Query); - foreach (SqlColumn column in node.Columns) - VisitInternal(column); - } - - public virtual void Visit(SqlDeclareCursor node) - { - VisitInternal(node.Cursor); - } - - public virtual void Visit(SqlDefaultValue node) - { - } - - public virtual void Visit(SqlDelete node) - { - VisitInternal(node.From); - VisitInternal(node.Where); - } - - public virtual void Visit(SqlDropAssertion node) - { - } - - public virtual void Visit(SqlDropCharacterSet node) - { - } - - public virtual void Visit(SqlDropCollation node) - { - } - - public virtual void Visit(SqlDropDomain node) - { - } - - public virtual void Visit(SqlDropIndex node) - { - } - - public virtual void Visit(SqlDropPartitionFunction node) - { - } - - public virtual void Visit(SqlDropPartitionScheme node) - { - } - - public virtual void Visit(SqlDropSchema node) - { - } - - public virtual void Visit(SqlDropSequence node) - { - } - - public virtual void Visit(SqlDropTable node) - { - } - - public virtual void Visit(SqlDropTranslation node) - { - } - - public virtual void Visit(SqlDropView node) - { - } - - public virtual void Visit(SqlDynamicFilter node) - { - foreach (SqlExpression expression in node.Expressions) - VisitInternal(expression); - } - - public virtual void Visit(SqlPlaceholder node) - { - } - - public virtual void Visit(SqlExtract node) - { - VisitInternal(node.Operand); - } - - public virtual void Visit(SqlFastFirstRowsHint node) - { - } - - public virtual void Visit(SqlFetch node) - { - VisitInternal(node.Cursor); - VisitInternal(node.RowCount); - foreach (ISqlCursorFetchTarget target in node.Targets) - VisitInternal(target); - } - - public virtual void Visit(SqlForceJoinOrderHint node) - { - foreach (SqlTable table in node.Tables) - VisitInternal(table); - } - - public virtual void Visit(SqlFreeTextTable node) - { - VisitInternal(node.Asterisk); - foreach (SqlTableColumn column in node.Columns) - VisitInternal(column); - VisitInternal(node.FreeText); - foreach (SqlTableColumn column in node.TargetColumns) - VisitInternal(column); - VisitInternal(node.TargetTable); - } - - public virtual void Visit(SqlFunctionCall node) - { - foreach (SqlExpression expression in node.Arguments) - VisitInternal(expression); - } - - public virtual void Visit(SqlCustomFunctionCall node) - { - foreach (SqlExpression expression in node.Arguments) - VisitInternal(expression); - } - - public virtual void Visit(SqlIf node) - { - VisitInternal(node.Condition); - VisitInternal(node.False); - VisitInternal(node.True); - } - - public virtual void Visit(SqlInsert node) - { - VisitInternal(node.From); - VisitInternal(node.Into); - foreach (var pair in node.Values) { - VisitInternal(pair.Key); - VisitInternal(pair.Value); - } - } - - public virtual void Visit(SqlJoinExpression node) - { - VisitInternal(node.Expression); - VisitInternal(node.Left); - VisitInternal(node.Right); - } - - public virtual void Visit(SqlJoinHint node) - { - VisitInternal(node.Table); - } - - public virtual void Visit(SqlLike node) - { - VisitInternal(node.Escape); - VisitInternal(node.Expression); - VisitInternal(node.Pattern); - } - - public virtual void Visit(SqlLiteral node) - { - } - - public virtual void Visit(SqlMatch node) - { - VisitInternal(node.SubQuery); - VisitInternal(node.Value); - } - - public virtual void Visit(SqlNative node) - { - } - - public virtual void Visit(SqlNativeHint node) - { - } - - public virtual void Visit(SqlNextValue value) - { - } - - public virtual void Visit(SqlNull node) - { - } - - public virtual void Visit(SqlOpenCursor node) - { - VisitInternal(node.Cursor); - } - - public virtual void Visit(SqlOrder node) - { - VisitInternal(node.Expression); - } - - public virtual void Visit(SqlParameterRef node) - { - } - - public virtual void Visit(SqlRound node) - { - VisitInternal(node.Argument); - VisitInternal(node.Length); - } - - public virtual void Visit(SqlQueryExpression node) - { - VisitInternal(node.Left); - VisitInternal(node.Right); - foreach (ISqlQueryExpression expression in node) - VisitInternal(expression); - } - - public virtual void Visit(SqlQueryRef node) - { - VisitInternal(node.Asterisk); - foreach (SqlTableColumn column in node.Columns) - VisitInternal(column); - VisitInternal(node.Query); - foreach (SqlTable table in node) - VisitInternal(table); - } - - public virtual void Visit(SqlRow node) - { - foreach (SqlExpression expression in node) - VisitInternal(expression); - } - - public virtual void Visit(SqlRowNumber node) - { - foreach (SqlOrder order in node.OrderBy) - VisitInternal(order); - } - - public virtual void Visit(SqlRenameTable node) - { - } - - public virtual void Visit(SqlStatementBlock node) - { - foreach (SqlStatement statement in node) - VisitInternal(statement); - } - - public virtual void Visit(SqlTableColumn node) - { - VisitInternal(node.SqlTable); - } - - public virtual void Visit(SqlTableRef node) - { - VisitInternal(node.Asterisk); - foreach (SqlTableColumn column in node.Columns) - VisitInternal(column); - } - - public virtual void Visit(SqlTrim node) - { - VisitInternal(node.Expression); - } - - public virtual void Visit(SqlSelect node) - { - VisitInternal(node.Asterisk); - foreach (SqlColumn column in node.Columns) - VisitInternal(column); - VisitInternal(node.From); - foreach (SqlColumn column in node.GroupBy) - VisitInternal(column); - VisitInternal(node.Having); - foreach (SqlHint hint in node.Hints) - VisitInternal(hint); - VisitInternal(node.Limit); - VisitInternal(node.Offset); - foreach (SqlOrder order in node.OrderBy) - VisitInternal(order); - VisitInternal(node.Where); - } - - public virtual void Visit(SqlSubQuery node) - { - VisitInternal(node.Query); - } - - public virtual void Visit(SqlUnary node) - { - VisitInternal(node.Operand); - } - - public virtual void Visit(SqlUpdate node) - { - VisitInternal(node.From); - foreach (SqlHint hint in node.Hints) - VisitInternal(hint); - VisitInternal(node.Update); - foreach (var pair in node.Values) { - VisitInternal(pair.Key); - VisitInternal(pair.Value); - } - VisitInternal(node.Where); - } - - public virtual void Visit(SqlUserColumn node) - { - VisitInternal(node.Expression); - VisitInternal(node.SqlTable); - } - - public virtual void Visit(SqlUserFunctionCall node) - { - foreach (SqlExpression argument in node.Arguments) - VisitInternal(argument); - } - - public virtual void Visit(SqlDeclareVariable node) - { - VisitInternal(node.Variable); - } - - public virtual void Visit(SqlVariable node) - { - } - - public virtual void Visit(SqlVariant node) - { - VisitInternal(node.Alternative); - VisitInternal(node.Main); - } - - public virtual void Visit(SqlWhile node) - { - VisitInternal(node.Condition); - VisitInternal(node.Statement); - } - - - public virtual void Visit(SqlFragment node) - { - VisitInternal(node.Expression); - } - - #region Non-public methods - - private void VisitInternal(ISqlNode node) - { - if (nodes.FindIndex(a => ReferenceEquals(a, node)) > -1) - return; - nodes.Add(node); - if (node!=null) - node.AcceptVisitor(this); - } - - #endregion - } +using System.Collections.Generic; +using Xtensive.Sql; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal abstract class BaseSqlVisitor : ISqlVisitor + { + private readonly List nodes = new List(); + + public virtual void Visit(SqlAggregate node) + { + VisitInternal(node.Expression); + } + + public virtual void Visit(SqlAlterDomain node) + { + VisitInternal(node.Action); + } + + public virtual void Visit(SqlAlterPartitionFunction node) + { + } + + public virtual void Visit(SqlAlterPartitionScheme node) + { + } + + public virtual void Visit(SqlAlterTable node) + { + VisitInternal(node.Action); + } + + public virtual void Visit(SqlAlterSequence node) + { + } + + public virtual void Visit(SqlArray node) + { + } + + public virtual void Visit(SqlAssignment node) + { + VisitInternal(node.Left); + VisitInternal(node.Right); + } + + public virtual void Visit(SqlBatch node) + { + foreach (SqlStatement statement in node) + VisitInternal(statement); + } + + public virtual void Visit(SqlBetween node) + { + VisitInternal(node.Expression); + VisitInternal(node.Left); + VisitInternal(node.Right); + } + + public virtual void Visit(SqlBinary node) + { + VisitInternal(node.Left); + VisitInternal(node.Right); + } + + public virtual void Visit(SqlBreak node) + { + } + + public virtual void Visit(SqlCase node) + { + VisitInternal(node.Else); + VisitInternal(node.Value); + foreach (KeyValuePair pair in node) { + VisitInternal(pair.Key); + VisitInternal(pair.Value); + } + } + + public virtual void Visit(SqlCast node) + { + VisitInternal(node.Operand); + } + + public virtual void Visit(SqlCloseCursor node) + { + VisitInternal(node.Cursor); + } + + public virtual void Visit(SqlCollate node) + { + VisitInternal(node.Operand); + } + + public virtual void Visit(SqlColumnRef node) + { + VisitInternal(node.SqlColumn); + VisitInternal(node.SqlTable); + } + + public virtual void Visit(SqlConcat node) + { + foreach (SqlExpression expression in node) + VisitInternal(expression); + } + + public virtual void Visit(SqlContinue node) + { + } + + public virtual void Visit(SqlContainer node) + { + } + + public virtual void Visit(SqlCommand node) + { + } + + public virtual void Visit(SqlContainsTable node) + { + VisitInternal(node.Asterisk); + foreach (SqlTableColumn column in node.Columns) + VisitInternal(column); + VisitInternal(node.SearchCondition); + foreach (SqlTableColumn column in node.TargetColumns) + VisitInternal(column); + VisitInternal(node.TargetTable); + } + + public virtual void Visit(SqlCreateAssertion node) + { + } + + public virtual void Visit(SqlCreateCharacterSet node) + { + } + + public virtual void Visit(SqlCreateCollation node) + { + } + + public virtual void Visit(SqlCreateDomain node) + { + } + + public virtual void Visit(SqlCreateIndex node) + { + } + + public virtual void Visit(SqlCreatePartitionFunction node) + { + } + + public virtual void Visit(SqlCreatePartitionScheme node) + { + } + + public virtual void Visit(SqlCreateSchema node) + { + } + + public virtual void Visit(SqlCreateSequence node) + { + } + + public virtual void Visit(SqlCreateTable node) + { + } + + public virtual void Visit(SqlCreateTranslation node) + { + } + + public virtual void Visit(SqlCreateView node) + { + } + + public virtual void Visit(SqlCursor node) + { + VisitInternal(node.Query); + foreach (SqlColumn column in node.Columns) + VisitInternal(column); + } + + public virtual void Visit(SqlDeclareCursor node) + { + VisitInternal(node.Cursor); + } + + public virtual void Visit(SqlDefaultValue node) + { + } + + public virtual void Visit(SqlDelete node) + { + VisitInternal(node.From); + VisitInternal(node.Where); + } + + public virtual void Visit(SqlDropAssertion node) + { + } + + public virtual void Visit(SqlDropCharacterSet node) + { + } + + public virtual void Visit(SqlDropCollation node) + { + } + + public virtual void Visit(SqlDropDomain node) + { + } + + public virtual void Visit(SqlDropIndex node) + { + } + + public virtual void Visit(SqlDropPartitionFunction node) + { + } + + public virtual void Visit(SqlDropPartitionScheme node) + { + } + + public virtual void Visit(SqlDropSchema node) + { + } + + public virtual void Visit(SqlDropSequence node) + { + } + + public virtual void Visit(SqlDropTable node) + { + } + + public virtual void Visit(SqlDropTranslation node) + { + } + + public virtual void Visit(SqlDropView node) + { + } + + public virtual void Visit(SqlDynamicFilter node) + { + foreach (SqlExpression expression in node.Expressions) + VisitInternal(expression); + } + + public virtual void Visit(SqlPlaceholder node) + { + } + + public virtual void Visit(SqlExtract node) + { + VisitInternal(node.Operand); + } + + public virtual void Visit(SqlFastFirstRowsHint node) + { + } + + public virtual void Visit(SqlFetch node) + { + VisitInternal(node.Cursor); + VisitInternal(node.RowCount); + foreach (ISqlCursorFetchTarget target in node.Targets) + VisitInternal(target); + } + + public virtual void Visit(SqlForceJoinOrderHint node) + { + foreach (SqlTable table in node.Tables) + VisitInternal(table); + } + + public virtual void Visit(SqlFreeTextTable node) + { + VisitInternal(node.Asterisk); + foreach (SqlTableColumn column in node.Columns) + VisitInternal(column); + VisitInternal(node.FreeText); + foreach (SqlTableColumn column in node.TargetColumns) + VisitInternal(column); + VisitInternal(node.TargetTable); + } + + public virtual void Visit(SqlFunctionCall node) + { + foreach (SqlExpression expression in node.Arguments) + VisitInternal(expression); + } + + public virtual void Visit(SqlCustomFunctionCall node) + { + foreach (SqlExpression expression in node.Arguments) + VisitInternal(expression); + } + + public virtual void Visit(SqlIf node) + { + VisitInternal(node.Condition); + VisitInternal(node.False); + VisitInternal(node.True); + } + + public virtual void Visit(SqlInsert node) + { + VisitInternal(node.From); + VisitInternal(node.Into); + foreach (var pair in node.Values) { + VisitInternal(pair.Key); + VisitInternal(pair.Value); + } + } + + public virtual void Visit(SqlJoinExpression node) + { + VisitInternal(node.Expression); + VisitInternal(node.Left); + VisitInternal(node.Right); + } + + public virtual void Visit(SqlJoinHint node) + { + VisitInternal(node.Table); + } + + public virtual void Visit(SqlLike node) + { + VisitInternal(node.Escape); + VisitInternal(node.Expression); + VisitInternal(node.Pattern); + } + + public virtual void Visit(SqlLiteral node) + { + } + + public virtual void Visit(SqlMatch node) + { + VisitInternal(node.SubQuery); + VisitInternal(node.Value); + } + + public virtual void Visit(SqlNative node) + { + } + + public virtual void Visit(SqlNativeHint node) + { + } + + public virtual void Visit(SqlNextValue value) + { + } + + public virtual void Visit(SqlNull node) + { + } + + public virtual void Visit(SqlOpenCursor node) + { + VisitInternal(node.Cursor); + } + + public virtual void Visit(SqlOrder node) + { + VisitInternal(node.Expression); + } + + public virtual void Visit(SqlParameterRef node) + { + } + + public virtual void Visit(SqlRound node) + { + VisitInternal(node.Argument); + VisitInternal(node.Length); + } + + public virtual void Visit(SqlQueryExpression node) + { + VisitInternal(node.Left); + VisitInternal(node.Right); + foreach (ISqlQueryExpression expression in node) + VisitInternal(expression); + } + + public virtual void Visit(SqlQueryRef node) + { + VisitInternal(node.Asterisk); + foreach (SqlTableColumn column in node.Columns) + VisitInternal(column); + VisitInternal(node.Query); + foreach (SqlTable table in node) + VisitInternal(table); + } + + public virtual void Visit(SqlRow node) + { + foreach (SqlExpression expression in node) + VisitInternal(expression); + } + + public virtual void Visit(SqlRowNumber node) + { + foreach (SqlOrder order in node.OrderBy) + VisitInternal(order); + } + + public virtual void Visit(SqlRenameTable node) + { + } + + public virtual void Visit(SqlStatementBlock node) + { + foreach (SqlStatement statement in node) + VisitInternal(statement); + } + + public virtual void Visit(SqlTableColumn node) + { + VisitInternal(node.SqlTable); + } + + public virtual void Visit(SqlTableRef node) + { + VisitInternal(node.Asterisk); + foreach (SqlTableColumn column in node.Columns) + VisitInternal(column); + } + + public virtual void Visit(SqlTrim node) + { + VisitInternal(node.Expression); + } + + public virtual void Visit(SqlSelect node) + { + VisitInternal(node.Asterisk); + foreach (SqlColumn column in node.Columns) + VisitInternal(column); + VisitInternal(node.From); + foreach (SqlColumn column in node.GroupBy) + VisitInternal(column); + VisitInternal(node.Having); + foreach (SqlHint hint in node.Hints) + VisitInternal(hint); + VisitInternal(node.Limit); + VisitInternal(node.Offset); + foreach (SqlOrder order in node.OrderBy) + VisitInternal(order); + VisitInternal(node.Where); + } + + public virtual void Visit(SqlSubQuery node) + { + VisitInternal(node.Query); + } + + public virtual void Visit(SqlUnary node) + { + VisitInternal(node.Operand); + } + + public virtual void Visit(SqlUpdate node) + { + VisitInternal(node.From); + foreach (SqlHint hint in node.Hints) + VisitInternal(hint); + VisitInternal(node.Update); + foreach (var pair in node.Values) { + VisitInternal(pair.Key); + VisitInternal(pair.Value); + } + VisitInternal(node.Where); + } + + public virtual void Visit(SqlUserColumn node) + { + VisitInternal(node.Expression); + VisitInternal(node.SqlTable); + } + + public virtual void Visit(SqlUserFunctionCall node) + { + foreach (SqlExpression argument in node.Arguments) + VisitInternal(argument); + } + + public virtual void Visit(SqlDeclareVariable node) + { + VisitInternal(node.Variable); + } + + public virtual void Visit(SqlVariable node) + { + } + + public virtual void Visit(SqlVariant node) + { + VisitInternal(node.Alternative); + VisitInternal(node.Main); + } + + public virtual void Visit(SqlWhile node) + { + VisitInternal(node.Condition); + VisitInternal(node.Statement); + } + + + public virtual void Visit(SqlFragment node) + { + VisitInternal(node.Expression); + } + + #region Non-public methods + + private void VisitInternal(ISqlNode node) + { + if (nodes.FindIndex(a => ReferenceEquals(a, node)) > -1) + return; + nodes.Add(node); + if (node!=null) + node.AcceptVisitor(this); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkDeleteOperation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkDeleteOperation.cs index ecf435ea76..a8a91228a8 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkDeleteOperation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkDeleteOperation.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2019-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. - -using System; -using System.Linq; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Services; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal class BulkDeleteOperation : QueryOperation - where T : class, IEntity - { - #region Non-public methods - - protected override int ExecuteInternal() - { - _ = base.ExecuteInternal(); - QueryTranslationResult request = GetRequest(query); - Bindings = request.ParameterBindings.ToList(); - if (PrimaryIndexes.Length > 1) - throw new NotImplementedException("Inheritance is not implemented"); - SqlDelete delete = SqlDml.Delete(SqlDml.TableRef(PrimaryIndexes[0].Table)); - Join(delete, (SqlSelect) request.Query); - using var command = ToCommand(delete); - return command.ExecuteNonQuery(); - } - - protected override SqlTableRef GetStatementTable(SqlStatement statement) - { - var delete = (SqlDelete) statement; - return delete.Delete; - } - - protected override SqlExpression GetStatementWhere(SqlStatement statement) - { - var delete = (SqlDelete) statement; - return delete.Where; - } - - protected override void SetStatementFrom(SqlStatement statement, SqlTable from) - { - var delete = (SqlDelete) statement; - delete.From = from; - } - - protected override void SetStatementTable(SqlStatement statement, SqlTableRef table) - { - var delete = (SqlDelete) statement; - delete.Delete = table; - } - - protected override void SetStatementWhere(SqlStatement statement, SqlExpression @where) - { - var delete = (SqlDelete) statement; - delete.Where = where; - } - - protected override void SetStatementLimit(SqlStatement statement, SqlExpression limit) - { - var delete = (SqlDelete) statement; - delete.Limit = limit; - } - - protected override bool SupportsJoin() - { - return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom); - } - - protected override bool SupportsLimitation() - { - return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit); - } - - #endregion - - public BulkDeleteOperation(IQueryable query) - : base((QueryProvider) query.Provider) - { - this.query = query; - } - } +// Copyright (C) 2019-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System; +using System.Linq; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal class BulkDeleteOperation : QueryOperation + where T : class, IEntity + { + #region Non-public methods + + protected override int ExecuteInternal() + { + _ = base.ExecuteInternal(); + QueryTranslationResult request = GetRequest(query); + Bindings = request.ParameterBindings.ToList(); + if (PrimaryIndexes.Length > 1) + throw new NotImplementedException("Inheritance is not implemented"); + SqlDelete delete = SqlDml.Delete(SqlDml.TableRef(PrimaryIndexes[0].Table)); + Join(delete, (SqlSelect) request.Query); + using var command = ToCommand(delete); + return command.ExecuteNonQuery(); + } + + protected override SqlTableRef GetStatementTable(SqlStatement statement) + { + var delete = (SqlDelete) statement; + return delete.Delete; + } + + protected override SqlExpression GetStatementWhere(SqlStatement statement) + { + var delete = (SqlDelete) statement; + return delete.Where; + } + + protected override void SetStatementFrom(SqlStatement statement, SqlTable from) + { + var delete = (SqlDelete) statement; + delete.From = from; + } + + protected override void SetStatementTable(SqlStatement statement, SqlTableRef table) + { + var delete = (SqlDelete) statement; + delete.Delete = table; + } + + protected override void SetStatementWhere(SqlStatement statement, SqlExpression @where) + { + var delete = (SqlDelete) statement; + delete.Where = where; + } + + protected override void SetStatementLimit(SqlStatement statement, SqlExpression limit) + { + var delete = (SqlDelete) statement; + delete.Limit = limit; + } + + protected override bool SupportsJoin() + { + return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom); + } + + protected override bool SupportsLimitation() + { + return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit); + } + + #endregion + + public BulkDeleteOperation(IQueryable query) + : base((QueryProvider) query.Provider) + { + this.query = query; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkUpdateOperation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkUpdateOperation.cs index 22ba3c61b6..e127d4e6dd 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkUpdateOperation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/BulkUpdateOperation.cs @@ -1,147 +1,147 @@ -// Copyright (C) 2007-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Services; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using FieldInfo = Xtensive.Orm.Model.FieldInfo; -using QueryParameterBinding = Xtensive.Orm.Services.QueryParameterBinding; - -namespace Xtensive.Orm.BulkOperations -{ - internal class BulkUpdateOperation : QueryOperation - where T : class, IEntity - { - private readonly SetOperation setOperation; - - #region Non-public methods - - protected override int ExecuteInternal() - { - _ = base.ExecuteInternal(); - QueryTranslationResult request = GetRequest(query); - Bindings = request.ParameterBindings.ToList(); - if (PrimaryIndexes.Length > 1) - throw new NotImplementedException("Inheritance is not implemented"); - SqlUpdate update = SqlDml.Update(SqlDml.TableRef(PrimaryIndexes[0].Table)); - setOperation.Statement = SetStatement.Create(update); - Join(update, (SqlSelect) request.Query); - setOperation.AddValues(); - using var command = ToCommand(update); - return command.ExecuteNonQuery(); - } - - protected override SqlTableRef GetStatementTable(SqlStatement statement) - { - var update = (SqlUpdate) statement; - return update.Update; - } - - protected override SqlExpression GetStatementWhere(SqlStatement statement) - { - var update = (SqlUpdate) statement; - return update.Where; - } - - protected override void SetStatementFrom(SqlStatement statement, SqlTable from) - { - var update = (SqlUpdate)statement; - update.From = from; - } - - protected override void SetStatementTable(SqlStatement statement, SqlTableRef table) - { - var update = (SqlUpdate) statement; - update.Update = table; - } - - protected override void SetStatementWhere(SqlStatement statement, SqlExpression @where) - { - var update = (SqlUpdate) statement; - update.Where = where; - } - - protected override void SetStatementLimit(SqlStatement statement, SqlExpression limit) - { - var update = (SqlUpdate) statement; - update.Limit = limit; - } - - protected override bool SupportsJoin() - { - return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom); - } - - protected override bool SupportsLimitation() - { - return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit); - } - - - #endregion - - public BulkUpdateOperation(IQueryable query, List descriptors) - : base((QueryProvider) query.Provider) - { - this.query = query; - setOperation = new SetOperation(this, descriptors); - } - - public BulkUpdateOperation(IQueryable query, Expression> evaluator) - : base((QueryProvider) query.Provider) - { - this.query = query; - int memberInitCount = 0; - ParameterExpression parameter = evaluator.Parameters[0]; - List descriptors = null; - evaluator.Visit( - delegate(MemberInitExpression ex) { - if (memberInitCount > 0) - return ex; - memberInitCount++; - descriptors = (from MemberAssignment assigment in ex.Bindings - select - new SetDescriptor( - TypeInfo.Fields.First(a => a.UnderlyingProperty==assigment.Member), parameter, assigment.Expression)). - ToList(); - return ex; - }); - setOperation=new SetOperation(this, descriptors); - } - - public BulkUpdateOperation(IUpdatable query) - : base((QueryProvider) ((Updatable) query).Query.Provider) - { - var descriptors = new List(); - var q = (Updatable) query; - this.query = q.Query; - foreach (var expression in q.Expressions) { - var lambda = (LambdaExpression) expression.Item1; - Expression ex = lambda.Body; - var ex1 = lambda.Body as UnaryExpression; - if (ex1!=null && ex1.NodeType==ExpressionType.Convert) - ex = ex1.Operand; - var member = (PropertyInfo) ((MemberExpression) ex).Member; - lambda = (LambdaExpression) expression.Item2; - var propertyInfo = TypeInfo.Fields.FirstOrDefault(a => a.UnderlyingProperty==member); - if (propertyInfo==null) { - if (member.ReflectedType.IsAssignableFrom(TypeInfo.UnderlyingType)) { - member = TypeInfo.UnderlyingType.GetProperty(member.Name); - propertyInfo = TypeInfo.Fields.FirstOrDefault(field => field.UnderlyingProperty==member); - } - } - descriptors.Add( - new SetDescriptor(propertyInfo, lambda.Parameters[0], lambda.Body)); - } - setOperation=new SetOperation(this, descriptors); - } - } +// Copyright (C) 2007-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using FieldInfo = Xtensive.Orm.Model.FieldInfo; +using QueryParameterBinding = Xtensive.Orm.Services.QueryParameterBinding; + +namespace Xtensive.Orm.BulkOperations +{ + internal class BulkUpdateOperation : QueryOperation + where T : class, IEntity + { + private readonly SetOperation setOperation; + + #region Non-public methods + + protected override int ExecuteInternal() + { + _ = base.ExecuteInternal(); + QueryTranslationResult request = GetRequest(query); + Bindings = request.ParameterBindings.ToList(); + if (PrimaryIndexes.Length > 1) + throw new NotImplementedException("Inheritance is not implemented"); + SqlUpdate update = SqlDml.Update(SqlDml.TableRef(PrimaryIndexes[0].Table)); + setOperation.Statement = SetStatement.Create(update); + Join(update, (SqlSelect) request.Query); + setOperation.AddValues(); + using var command = ToCommand(update); + return command.ExecuteNonQuery(); + } + + protected override SqlTableRef GetStatementTable(SqlStatement statement) + { + var update = (SqlUpdate) statement; + return update.Update; + } + + protected override SqlExpression GetStatementWhere(SqlStatement statement) + { + var update = (SqlUpdate) statement; + return update.Where; + } + + protected override void SetStatementFrom(SqlStatement statement, SqlTable from) + { + var update = (SqlUpdate)statement; + update.From = from; + } + + protected override void SetStatementTable(SqlStatement statement, SqlTableRef table) + { + var update = (SqlUpdate) statement; + update.Update = table; + } + + protected override void SetStatementWhere(SqlStatement statement, SqlExpression @where) + { + var update = (SqlUpdate) statement; + update.Where = where; + } + + protected override void SetStatementLimit(SqlStatement statement, SqlExpression limit) + { + var update = (SqlUpdate) statement; + update.Limit = limit; + } + + protected override bool SupportsJoin() + { + return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateFrom); + } + + protected override bool SupportsLimitation() + { + return DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.UpdateLimit); + } + + + #endregion + + public BulkUpdateOperation(IQueryable query, List descriptors) + : base((QueryProvider) query.Provider) + { + this.query = query; + setOperation = new SetOperation(this, descriptors); + } + + public BulkUpdateOperation(IQueryable query, Expression> evaluator) + : base((QueryProvider) query.Provider) + { + this.query = query; + int memberInitCount = 0; + ParameterExpression parameter = evaluator.Parameters[0]; + List descriptors = null; + evaluator.Visit( + delegate(MemberInitExpression ex) { + if (memberInitCount > 0) + return ex; + memberInitCount++; + descriptors = (from MemberAssignment assigment in ex.Bindings + select + new SetDescriptor( + TypeInfo.Fields.First(a => a.UnderlyingProperty==assigment.Member), parameter, assigment.Expression)). + ToList(); + return ex; + }); + setOperation=new SetOperation(this, descriptors); + } + + public BulkUpdateOperation(IUpdatable query) + : base((QueryProvider) ((Updatable) query).Query.Provider) + { + var descriptors = new List(); + var q = (Updatable) query; + this.query = q.Query; + foreach (var expression in q.Expressions) { + var lambda = (LambdaExpression) expression.Item1; + Expression ex = lambda.Body; + var ex1 = lambda.Body as UnaryExpression; + if (ex1!=null && ex1.NodeType==ExpressionType.Convert) + ex = ex1.Operand; + var member = (PropertyInfo) ((MemberExpression) ex).Member; + lambda = (LambdaExpression) expression.Item2; + var propertyInfo = TypeInfo.Fields.FirstOrDefault(a => a.UnderlyingProperty==member); + if (propertyInfo==null) { + if (member.ReflectedType.IsAssignableFrom(TypeInfo.UnderlyingType)) { + member = TypeInfo.UnderlyingType.GetProperty(member.Name); + propertyInfo = TypeInfo.Fields.FirstOrDefault(field => field.UnderlyingProperty==member); + } + } + descriptors.Add( + new SetDescriptor(propertyInfo, lambda.Parameters[0], lambda.Body)); + } + setOperation=new SetOperation(this, descriptors); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/ComputedExpressionSqlVisitor.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/ComputedExpressionSqlVisitor.cs index 3f92eb9141..b1dec409cc 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/ComputedExpressionSqlVisitor.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/ComputedExpressionSqlVisitor.cs @@ -1,23 +1,23 @@ -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal class ComputedExpressionSqlVisitor : BaseSqlVisitor - { - private readonly SqlTable from; - private readonly SqlTable to; - - public override void Visit(SqlTableColumn node) - { - if (node.SqlTable==from) - node.ReplaceWith(SqlDml.TableColumn(to, node.Name)); - } - - public ComputedExpressionSqlVisitor(SqlTable from, SqlTable to) - { - this.from = from; - this.to = to; - } - } +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal class ComputedExpressionSqlVisitor : BaseSqlVisitor + { + private readonly SqlTable from; + private readonly SqlTable to; + + public override void Visit(SqlTableColumn node) + { + if (node.SqlTable==from) + node.ReplaceWith(SqlDml.TableColumn(to, node.Name)); + } + + public ComputedExpressionSqlVisitor(SqlTable from, SqlTable to) + { + this.from = from; + this.to = to; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionExtensions.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionExtensions.cs index dad34575c7..79b740e811 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionExtensions.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionExtensions.cs @@ -1,37 +1,37 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using Xtensive.Linq; -using Xtensive.Reflection; - -namespace Xtensive.Orm.BulkOperations -{ - internal static class ExpressionExtensions - { - public static bool IsContainsQuery(this Expression expression) - { - bool b = false; - expression.Visit( - delegate(Expression e) { - if (e.Type.IsOfGenericInterface(typeof (IQueryable<>))) - b = true; - return e; - }); - return b; - } - - #region Non-public methods - - internal static object Invoke(this Expression expression) - { - return FastExpression.Lambda(typeof (Func<>).MakeGenericType(expression.Type), expression).Compile().DynamicInvoke(); - } - - internal static Expression Visit(this Expression exp, Func visitor) where T : Expression - { - return ExpressionVisitor.Visit(exp, visitor); - } - - #endregion - } +using System; +using System.Linq; +using System.Linq.Expressions; +using Xtensive.Linq; +using Xtensive.Reflection; + +namespace Xtensive.Orm.BulkOperations +{ + internal static class ExpressionExtensions + { + public static bool IsContainsQuery(this Expression expression) + { + bool b = false; + expression.Visit( + delegate(Expression e) { + if (e.Type.IsOfGenericInterface(typeof (IQueryable<>))) + b = true; + return e; + }); + return b; + } + + #region Non-public methods + + internal static object Invoke(this Expression expression) + { + return FastExpression.Lambda(typeof (Func<>).MakeGenericType(expression.Type), expression).Compile().DynamicInvoke(); + } + + internal static Expression Visit(this Expression exp, Func visitor) where T : Expression + { + return ExpressionVisitor.Visit(exp, visitor); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionVisitor.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionVisitor.cs index e568eca763..ef3c6670ce 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionVisitor.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/ExpressionVisitor.cs @@ -1,342 +1,342 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq.Expressions; - -namespace Xtensive.Orm.BulkOperations -{ - /// - /// This class visits every Parameter expression in an expression tree and calls a delegate - /// to optionally replace the parameter. This is useful where two expression trees need to - /// be merged (and they don't share the same ParameterExpressions). - /// - internal class ExpressionVisitor : ExpressionVisitor - where T : Expression - { - private readonly Func visitor; - - public static Expression Visit(Expression exp, Func visitor) - { - return new ExpressionVisitor(visitor).Visit(exp); - } - - #region Non-public methods - - protected override Expression Visit(Expression exp) - { - if (exp is T && visitor!=null) - exp = visitor((T) exp); - - return base.Visit(exp); - } - - #endregion - - private ExpressionVisitor(Func visitor) - { - this.visitor = visitor; - } - } - - /// - /// Expression visitor - /// (from http://blogs.msdn.com/mattwar/archive/2007/07/31/linq-building-an-iqueryable-provider-part-ii.aspx) - /// - internal abstract class ExpressionVisitor - { - #region Non-public methods - - protected virtual Expression Visit(Expression exp) - { - if (exp==null) - return null; - switch (exp.NodeType) { - case ExpressionType.Negate: - case ExpressionType.NegateChecked: - case ExpressionType.Not: - case ExpressionType.Convert: - case ExpressionType.ConvertChecked: - case ExpressionType.ArrayLength: - case ExpressionType.Quote: - case ExpressionType.TypeAs: - return VisitUnary((UnaryExpression) exp); - case ExpressionType.Add: - case ExpressionType.AddChecked: - case ExpressionType.Subtract: - case ExpressionType.SubtractChecked: - case ExpressionType.Multiply: - case ExpressionType.MultiplyChecked: - case ExpressionType.Divide: - case ExpressionType.Modulo: - case ExpressionType.And: - case ExpressionType.AndAlso: - case ExpressionType.Or: - case ExpressionType.OrElse: - case ExpressionType.LessThan: - case ExpressionType.LessThanOrEqual: - case ExpressionType.GreaterThan: - case ExpressionType.GreaterThanOrEqual: - case ExpressionType.Equal: - case ExpressionType.NotEqual: - case ExpressionType.Coalesce: - case ExpressionType.ArrayIndex: - case ExpressionType.RightShift: - case ExpressionType.LeftShift: - case ExpressionType.ExclusiveOr: - return VisitBinary((BinaryExpression) exp); - case ExpressionType.TypeIs: - return VisitTypeIs((TypeBinaryExpression) exp); - case ExpressionType.Conditional: - return VisitConditional((ConditionalExpression) exp); - case ExpressionType.Constant: - return VisitConstant((ConstantExpression) exp); - case ExpressionType.Parameter: - return VisitParameter((ParameterExpression) exp); - case ExpressionType.MemberAccess: - return VisitMemberAccess((MemberExpression) exp); - case ExpressionType.Call: - return VisitMethodCall((MethodCallExpression) exp); - case ExpressionType.Lambda: - return VisitLambda((LambdaExpression) exp); - case ExpressionType.New: - return VisitNew((NewExpression) exp); - case ExpressionType.NewArrayInit: - case ExpressionType.NewArrayBounds: - return VisitNewArray((NewArrayExpression) exp); - case ExpressionType.Invoke: - return VisitInvocation((InvocationExpression) exp); - case ExpressionType.MemberInit: - return VisitMemberInit((MemberInitExpression) exp); - case ExpressionType.ListInit: - return VisitListInit((ListInitExpression) exp); - default: - throw new Exception(String.Format("Unhandled expression type: '{0}'", exp.NodeType)); - } - } - - private Expression VisitBinary(BinaryExpression b) - { - Expression left = Visit(b.Left); - Expression right = Visit(b.Right); - Expression conversion = Visit(b.Conversion); - if (left!=b.Left || right!=b.Right || conversion!=b.Conversion) { - if (b.NodeType==ExpressionType.Coalesce) - return Expression.Coalesce(left, right, conversion as LambdaExpression); - return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method); - } - return b; - } - - private MemberBinding VisitBinding(MemberBinding binding) - { - switch (binding.BindingType) { - case MemberBindingType.Assignment: - return VisitMemberAssignment((MemberAssignment) binding); - case MemberBindingType.MemberBinding: - return VisitMemberMemberBinding((MemberMemberBinding) binding); - case MemberBindingType.ListBinding: - return VisitMemberListBinding((MemberListBinding) binding); - default: - throw new Exception(String.Format("Unhandled binding type '{0}'", binding.BindingType)); - } - } - - private IEnumerable VisitBindingList(ReadOnlyCollection original) - { - List list = null; - for (int i = 0, n = original.Count; i < n; i++) { - MemberBinding b = VisitBinding(original[i]); - if (list!=null) - list.Add(b); - else if (b!=original[i]) { - list = new List(n); - for (int j = 0; j < i; j++) - list.Add(original[j]); - list.Add(b); - } - } - if (list!=null) - return list; - return original; - } - - private Expression VisitConditional(ConditionalExpression c) - { - Expression test = Visit(c.Test); - Expression ifTrue = Visit(c.IfTrue); - Expression ifFalse = Visit(c.IfFalse); - if (test!=c.Test || ifTrue!=c.IfTrue || ifFalse!=c.IfFalse) - return Expression.Condition(test, ifTrue, ifFalse); - return c; - } - - private Expression VisitConstant(ConstantExpression c) - { - return c; - } - - private ElementInit VisitElementInitializer(ElementInit initializer) - { - IEnumerable arguments = VisitExpressionList(initializer.Arguments); - if (arguments!=initializer.Arguments) - return Expression.ElementInit(initializer.AddMethod, arguments); - return initializer; - } - - private IEnumerable VisitElementInitializerList(ReadOnlyCollection original) - { - List list = null; - for (int i = 0, n = original.Count; i < n; i++) { - ElementInit init = VisitElementInitializer(original[i]); - if (list!=null) - list.Add(init); - else if (init!=original[i]) { - list = new List(n); - for (int j = 0; j < i; j++) - list.Add(original[j]); - list.Add(init); - } - } - if (list!=null) - return list; - return original; - } - - private IEnumerable VisitExpressionList(ReadOnlyCollection original) - { - List list = null; - for (int i = 0, n = original.Count; i < n; i++) { - var p = Visit(original[i]); - if (list!=null) - list.Add(p); - else if (p!=original[i]) { - list = new List(n); - for (int j = 0; j < i; j++) - list.Add(original[j]); - list.Add(p); - } - } - if (list!=null) - return list.AsReadOnly(); - return original; - } - - private Expression VisitInvocation(InvocationExpression iv) - { - IEnumerable args = VisitExpressionList(iv.Arguments); - Expression expr = Visit(iv.Expression); - if (args!=iv.Arguments || expr!=iv.Expression) - return Expression.Invoke(expr, args); - return iv; - } - - private Expression VisitLambda(LambdaExpression lambda) - { - Expression body = Visit(lambda.Body); - if (body!=lambda.Body) - return Expression.Lambda(lambda.Type, body, lambda.Parameters); - return lambda; - } - - private Expression VisitListInit(ListInitExpression init) - { - NewExpression n = VisitNew(init.NewExpression); - IEnumerable initializers = VisitElementInitializerList(init.Initializers); - if (n!=init.NewExpression || initializers!=init.Initializers) - return Expression.ListInit(n, initializers); - return init; - } - - private Expression VisitMemberAccess(MemberExpression m) - { - Expression exp = Visit(m.Expression); - if (exp!=m.Expression) - return Expression.MakeMemberAccess(exp, m.Member); - return m; - } - - private MemberAssignment VisitMemberAssignment(MemberAssignment assignment) - { - Expression e = Visit(assignment.Expression); - if (e!=assignment.Expression) - return Expression.Bind(assignment.Member, e); - return assignment; - } - - private Expression VisitMemberInit(MemberInitExpression init) - { - NewExpression n = VisitNew(init.NewExpression); - IEnumerable bindings = VisitBindingList(init.Bindings); - if (n!=init.NewExpression || bindings!=init.Bindings) - return Expression.MemberInit(n, bindings); - return init; - } - - private MemberListBinding VisitMemberListBinding(MemberListBinding binding) - { - IEnumerable initializers = VisitElementInitializerList(binding.Initializers); - if (initializers!=binding.Initializers) - return Expression.ListBind(binding.Member, initializers); - return binding; - } - - private MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) - { - IEnumerable bindings = VisitBindingList(binding.Bindings); - if (bindings!=binding.Bindings) - return Expression.MemberBind(binding.Member, bindings); - return binding; - } - - private Expression VisitMethodCall(MethodCallExpression m) - { - Expression obj = Visit(m.Object); - IEnumerable args = VisitExpressionList(m.Arguments); - if (obj!=m.Object || args!=m.Arguments) - return Expression.Call(obj, m.Method, args); - return m; - } - - private NewExpression VisitNew(NewExpression nex) - { - IEnumerable args = VisitExpressionList(nex.Arguments); - if (args!=nex.Arguments) - return Expression.New(nex.Constructor, args, nex.Members); - return nex; - } - - private Expression VisitNewArray(NewArrayExpression na) - { - IEnumerable exprs = VisitExpressionList(na.Expressions); - if (exprs!=na.Expressions) { - if (na.NodeType==ExpressionType.NewArrayInit) - return Expression.NewArrayInit(na.Type.GetElementType(), exprs); - return Expression.NewArrayBounds(na.Type.GetElementType(), exprs); - } - return na; - } - - private Expression VisitParameter(ParameterExpression p) - { - return p; - } - - private Expression VisitTypeIs(TypeBinaryExpression b) - { - Expression expr = Visit(b.Expression); - if (expr!=b.Expression) - return Expression.TypeIs(expr, b.TypeOperand); - return b; - } - - private Expression VisitUnary(UnaryExpression u) - { - Expression operand = Visit(u.Operand); - if (operand!=u.Operand) - return Expression.MakeUnary(u.NodeType, operand, u.Type, u.Method); - return u; - } - - #endregion - } +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq.Expressions; + +namespace Xtensive.Orm.BulkOperations +{ + /// + /// This class visits every Parameter expression in an expression tree and calls a delegate + /// to optionally replace the parameter. This is useful where two expression trees need to + /// be merged (and they don't share the same ParameterExpressions). + /// + internal class ExpressionVisitor : ExpressionVisitor + where T : Expression + { + private readonly Func visitor; + + public static Expression Visit(Expression exp, Func visitor) + { + return new ExpressionVisitor(visitor).Visit(exp); + } + + #region Non-public methods + + protected override Expression Visit(Expression exp) + { + if (exp is T && visitor!=null) + exp = visitor((T) exp); + + return base.Visit(exp); + } + + #endregion + + private ExpressionVisitor(Func visitor) + { + this.visitor = visitor; + } + } + + /// + /// Expression visitor + /// (from http://blogs.msdn.com/mattwar/archive/2007/07/31/linq-building-an-iqueryable-provider-part-ii.aspx) + /// + internal abstract class ExpressionVisitor + { + #region Non-public methods + + protected virtual Expression Visit(Expression exp) + { + if (exp==null) + return null; + switch (exp.NodeType) { + case ExpressionType.Negate: + case ExpressionType.NegateChecked: + case ExpressionType.Not: + case ExpressionType.Convert: + case ExpressionType.ConvertChecked: + case ExpressionType.ArrayLength: + case ExpressionType.Quote: + case ExpressionType.TypeAs: + return VisitUnary((UnaryExpression) exp); + case ExpressionType.Add: + case ExpressionType.AddChecked: + case ExpressionType.Subtract: + case ExpressionType.SubtractChecked: + case ExpressionType.Multiply: + case ExpressionType.MultiplyChecked: + case ExpressionType.Divide: + case ExpressionType.Modulo: + case ExpressionType.And: + case ExpressionType.AndAlso: + case ExpressionType.Or: + case ExpressionType.OrElse: + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: + case ExpressionType.Equal: + case ExpressionType.NotEqual: + case ExpressionType.Coalesce: + case ExpressionType.ArrayIndex: + case ExpressionType.RightShift: + case ExpressionType.LeftShift: + case ExpressionType.ExclusiveOr: + return VisitBinary((BinaryExpression) exp); + case ExpressionType.TypeIs: + return VisitTypeIs((TypeBinaryExpression) exp); + case ExpressionType.Conditional: + return VisitConditional((ConditionalExpression) exp); + case ExpressionType.Constant: + return VisitConstant((ConstantExpression) exp); + case ExpressionType.Parameter: + return VisitParameter((ParameterExpression) exp); + case ExpressionType.MemberAccess: + return VisitMemberAccess((MemberExpression) exp); + case ExpressionType.Call: + return VisitMethodCall((MethodCallExpression) exp); + case ExpressionType.Lambda: + return VisitLambda((LambdaExpression) exp); + case ExpressionType.New: + return VisitNew((NewExpression) exp); + case ExpressionType.NewArrayInit: + case ExpressionType.NewArrayBounds: + return VisitNewArray((NewArrayExpression) exp); + case ExpressionType.Invoke: + return VisitInvocation((InvocationExpression) exp); + case ExpressionType.MemberInit: + return VisitMemberInit((MemberInitExpression) exp); + case ExpressionType.ListInit: + return VisitListInit((ListInitExpression) exp); + default: + throw new Exception(String.Format("Unhandled expression type: '{0}'", exp.NodeType)); + } + } + + private Expression VisitBinary(BinaryExpression b) + { + Expression left = Visit(b.Left); + Expression right = Visit(b.Right); + Expression conversion = Visit(b.Conversion); + if (left!=b.Left || right!=b.Right || conversion!=b.Conversion) { + if (b.NodeType==ExpressionType.Coalesce) + return Expression.Coalesce(left, right, conversion as LambdaExpression); + return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method); + } + return b; + } + + private MemberBinding VisitBinding(MemberBinding binding) + { + switch (binding.BindingType) { + case MemberBindingType.Assignment: + return VisitMemberAssignment((MemberAssignment) binding); + case MemberBindingType.MemberBinding: + return VisitMemberMemberBinding((MemberMemberBinding) binding); + case MemberBindingType.ListBinding: + return VisitMemberListBinding((MemberListBinding) binding); + default: + throw new Exception(String.Format("Unhandled binding type '{0}'", binding.BindingType)); + } + } + + private IEnumerable VisitBindingList(ReadOnlyCollection original) + { + List list = null; + for (int i = 0, n = original.Count; i < n; i++) { + MemberBinding b = VisitBinding(original[i]); + if (list!=null) + list.Add(b); + else if (b!=original[i]) { + list = new List(n); + for (int j = 0; j < i; j++) + list.Add(original[j]); + list.Add(b); + } + } + if (list!=null) + return list; + return original; + } + + private Expression VisitConditional(ConditionalExpression c) + { + Expression test = Visit(c.Test); + Expression ifTrue = Visit(c.IfTrue); + Expression ifFalse = Visit(c.IfFalse); + if (test!=c.Test || ifTrue!=c.IfTrue || ifFalse!=c.IfFalse) + return Expression.Condition(test, ifTrue, ifFalse); + return c; + } + + private Expression VisitConstant(ConstantExpression c) + { + return c; + } + + private ElementInit VisitElementInitializer(ElementInit initializer) + { + IEnumerable arguments = VisitExpressionList(initializer.Arguments); + if (arguments!=initializer.Arguments) + return Expression.ElementInit(initializer.AddMethod, arguments); + return initializer; + } + + private IEnumerable VisitElementInitializerList(ReadOnlyCollection original) + { + List list = null; + for (int i = 0, n = original.Count; i < n; i++) { + ElementInit init = VisitElementInitializer(original[i]); + if (list!=null) + list.Add(init); + else if (init!=original[i]) { + list = new List(n); + for (int j = 0; j < i; j++) + list.Add(original[j]); + list.Add(init); + } + } + if (list!=null) + return list; + return original; + } + + private IEnumerable VisitExpressionList(ReadOnlyCollection original) + { + List list = null; + for (int i = 0, n = original.Count; i < n; i++) { + var p = Visit(original[i]); + if (list!=null) + list.Add(p); + else if (p!=original[i]) { + list = new List(n); + for (int j = 0; j < i; j++) + list.Add(original[j]); + list.Add(p); + } + } + if (list!=null) + return list.AsReadOnly(); + return original; + } + + private Expression VisitInvocation(InvocationExpression iv) + { + IEnumerable args = VisitExpressionList(iv.Arguments); + Expression expr = Visit(iv.Expression); + if (args!=iv.Arguments || expr!=iv.Expression) + return Expression.Invoke(expr, args); + return iv; + } + + private Expression VisitLambda(LambdaExpression lambda) + { + Expression body = Visit(lambda.Body); + if (body!=lambda.Body) + return Expression.Lambda(lambda.Type, body, lambda.Parameters); + return lambda; + } + + private Expression VisitListInit(ListInitExpression init) + { + NewExpression n = VisitNew(init.NewExpression); + IEnumerable initializers = VisitElementInitializerList(init.Initializers); + if (n!=init.NewExpression || initializers!=init.Initializers) + return Expression.ListInit(n, initializers); + return init; + } + + private Expression VisitMemberAccess(MemberExpression m) + { + Expression exp = Visit(m.Expression); + if (exp!=m.Expression) + return Expression.MakeMemberAccess(exp, m.Member); + return m; + } + + private MemberAssignment VisitMemberAssignment(MemberAssignment assignment) + { + Expression e = Visit(assignment.Expression); + if (e!=assignment.Expression) + return Expression.Bind(assignment.Member, e); + return assignment; + } + + private Expression VisitMemberInit(MemberInitExpression init) + { + NewExpression n = VisitNew(init.NewExpression); + IEnumerable bindings = VisitBindingList(init.Bindings); + if (n!=init.NewExpression || bindings!=init.Bindings) + return Expression.MemberInit(n, bindings); + return init; + } + + private MemberListBinding VisitMemberListBinding(MemberListBinding binding) + { + IEnumerable initializers = VisitElementInitializerList(binding.Initializers); + if (initializers!=binding.Initializers) + return Expression.ListBind(binding.Member, initializers); + return binding; + } + + private MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) + { + IEnumerable bindings = VisitBindingList(binding.Bindings); + if (bindings!=binding.Bindings) + return Expression.MemberBind(binding.Member, bindings); + return binding; + } + + private Expression VisitMethodCall(MethodCallExpression m) + { + Expression obj = Visit(m.Object); + IEnumerable args = VisitExpressionList(m.Arguments); + if (obj!=m.Object || args!=m.Arguments) + return Expression.Call(obj, m.Method, args); + return m; + } + + private NewExpression VisitNew(NewExpression nex) + { + IEnumerable args = VisitExpressionList(nex.Arguments); + if (args!=nex.Arguments) + return Expression.New(nex.Constructor, args, nex.Members); + return nex; + } + + private Expression VisitNewArray(NewArrayExpression na) + { + IEnumerable exprs = VisitExpressionList(na.Expressions); + if (exprs!=na.Expressions) { + if (na.NodeType==ExpressionType.NewArrayInit) + return Expression.NewArrayInit(na.Type.GetElementType(), exprs); + return Expression.NewArrayBounds(na.Type.GetElementType(), exprs); + } + return na; + } + + private Expression VisitParameter(ParameterExpression p) + { + return p; + } + + private Expression VisitTypeIs(TypeBinaryExpression b) + { + Expression expr = Visit(b.Expression); + if (expr!=b.Expression) + return Expression.TypeIs(expr, b.TypeOperand); + return b; + } + + private Expression VisitUnary(UnaryExpression u) + { + Expression operand = Visit(u.Operand); + if (operand!=u.Operand) + return Expression.MakeUnary(u.NodeType, operand, u.Type, u.Method); + return u; + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/Extensions.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/Extensions.cs index a85942beee..1e2281e428 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/Extensions.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/Extensions.cs @@ -1,13 +1,13 @@ -using System.Data.Common; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Services; - -internal static class Extensions -{ - public static void EnsureTransactionIsStarted(this Session session) - { - var accessor = session.Services.Demand(); - DbTransaction notUsed = accessor.Transaction; //ensure transaction is started - } +using System.Data.Common; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Services; + +internal static class Extensions +{ + public static void EnsureTransactionIsStarted(this Session session) + { + var accessor = session.Services.Demand(); + DbTransaction notUsed = accessor.Transaction; //ensure transaction is started + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/InsertOperation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/InsertOperation.cs index f1a690c3c2..6cd353503b 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/InsertOperation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/InsertOperation.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2019-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Model; -using Xtensive.Orm.Services; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal class InsertOperation : Operation - where T : Entity - { - private readonly SetOperation setOperation; - - #region Non-public methods - - protected override int ExecuteInternal() - { - Bindings = new List(); - if (PrimaryIndexes.Length > 1) - throw new NotImplementedException("Inheritance is not implemented"); - SqlInsert insert = SqlDml.Insert(SqlDml.TableRef(PrimaryIndexes[0].Table)); - setOperation.Statement = SetStatement.Create(insert); - setOperation.AddValues(); - using var command = ToCommand(insert); - return command.ExecuteNonQuery(); - } - - #endregion - - public InsertOperation(QueryProvider queryProvider, Expression> evaluator) - : base(queryProvider) - { - int memberInitCount = 0; - ParameterExpression parameter = Expression.Parameter(typeof (T)); - List descriptors = null; - evaluator.Visit( - delegate(MemberInitExpression ex) { - if (memberInitCount > 0) - return ex; - memberInitCount++; - descriptors = new List(); - foreach (MemberAssignment assignment in ex.Bindings) { - var fieldInfo = TypeInfo.Fields.FirstOrDefault(a => a.UnderlyingProperty==assignment.Member); - if (fieldInfo==null) - if (assignment.Member.ReflectedType.IsAssignableFrom(TypeInfo.UnderlyingType)) { - var property = TypeInfo.UnderlyingType.GetProperty(assignment.Member.Name); - fieldInfo = TypeInfo.Fields.FirstOrDefault(field => field.UnderlyingProperty==property); - } - descriptors.Add( - new SetDescriptor(fieldInfo, parameter, assignment.Expression)); - } - return ex; - }); - AddKey(descriptors); - setOperation = new SetOperation(this, descriptors); - } - - private void AddKey(List descriptors) - { - var count = descriptors.Count(a => a.Field.IsPrimaryKey); - int i; - if (count==0) { - var key = Key.Generate(Session); - i = 0; - foreach (var fieldInfo in TypeInfo.Key.Fields) { - descriptors.Add(new SetDescriptor(fieldInfo, Expression.Parameter(typeof(T)), Expression.Constant(key.Value.GetValue(i)))); - i++; - } - Key = key; - return; - } - if(count a.Field.Equals(field)); - keys[i] = descriptor.Expression.Invoke(); - i++; - } - Key = Key.Create(Session.Domain, keys); - } - - public Key Key { get; private set; } - } +// Copyright (C) 2019-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Model; +using Xtensive.Orm.Services; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal class InsertOperation : Operation + where T : Entity + { + private readonly SetOperation setOperation; + + #region Non-public methods + + protected override int ExecuteInternal() + { + Bindings = new List(); + if (PrimaryIndexes.Length > 1) + throw new NotImplementedException("Inheritance is not implemented"); + SqlInsert insert = SqlDml.Insert(SqlDml.TableRef(PrimaryIndexes[0].Table)); + setOperation.Statement = SetStatement.Create(insert); + setOperation.AddValues(); + using var command = ToCommand(insert); + return command.ExecuteNonQuery(); + } + + #endregion + + public InsertOperation(QueryProvider queryProvider, Expression> evaluator) + : base(queryProvider) + { + int memberInitCount = 0; + ParameterExpression parameter = Expression.Parameter(typeof (T)); + List descriptors = null; + evaluator.Visit( + delegate(MemberInitExpression ex) { + if (memberInitCount > 0) + return ex; + memberInitCount++; + descriptors = new List(); + foreach (MemberAssignment assignment in ex.Bindings) { + var fieldInfo = TypeInfo.Fields.FirstOrDefault(a => a.UnderlyingProperty==assignment.Member); + if (fieldInfo==null) + if (assignment.Member.ReflectedType.IsAssignableFrom(TypeInfo.UnderlyingType)) { + var property = TypeInfo.UnderlyingType.GetProperty(assignment.Member.Name); + fieldInfo = TypeInfo.Fields.FirstOrDefault(field => field.UnderlyingProperty==property); + } + descriptors.Add( + new SetDescriptor(fieldInfo, parameter, assignment.Expression)); + } + return ex; + }); + AddKey(descriptors); + setOperation = new SetOperation(this, descriptors); + } + + private void AddKey(List descriptors) + { + var count = descriptors.Count(a => a.Field.IsPrimaryKey); + int i; + if (count==0) { + var key = Key.Generate(Session); + i = 0; + foreach (var fieldInfo in TypeInfo.Key.Fields) { + descriptors.Add(new SetDescriptor(fieldInfo, Expression.Parameter(typeof(T)), Expression.Constant(key.Value.GetValue(i)))); + i++; + } + Key = key; + return; + } + if(count a.Field.Equals(field)); + keys[i] = descriptor.Expression.Invoke(); + i++; + } + Key = Key.Create(Session.Domain, keys); + } + + public Key Key { get; private set; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/Operation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/Operation.cs index 62579cf5c3..5176778834 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/Operation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/Operation.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2019-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Services; -using Xtensive.Sql.Model; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using QueryParameterBinding = Xtensive.Orm.Services.QueryParameterBinding; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.BulkOperations -{ - internal abstract class Operation - where T : class, IEntity - { - private static readonly MethodInfo TranslateQueryMethod = typeof(QueryBuilder).GetMethod("TranslateQuery"); - public readonly QueryProvider QueryProvider; - public List Bindings; - protected DomainHandler DomainHandler; - protected PrimaryIndexMapping[] PrimaryIndexes; - public QueryBuilder QueryBuilder; - public Session Session; - protected TypeInfo TypeInfo; - public SqlTableRef JoinedTableRef; - - public int Execute() - { - EnsureTransactionIsStarted(); - QueryProvider.Session.SaveChanges(); - int value = ExecuteInternal(); - SessionStateAccessor accessor = DirectStateAccessor.Get(QueryProvider.Session); - accessor.Invalidate(); - return value; - } - - #region Non-public methods - - protected void EnsureTransactionIsStarted() - { - var accessor = QueryProvider.Session.Services.Demand(); -#pragma warning disable 168 - DbTransaction notUsed = accessor.Transaction; -#pragma warning restore 168 - } - - protected abstract int ExecuteInternal(); - - public QueryTranslationResult GetRequest(IQueryable query) - { - return QueryBuilder.TranslateQuery(query); - } - - public QueryTranslationResult GetRequest(Type type, IQueryable query) - { - return - (QueryTranslationResult) TranslateQueryMethod.MakeGenericMethod(type).Invoke(QueryBuilder, new object[] {query}); - } - - public TypeInfo GetTypeInfo(Type entityType) - { - return Session.Domain.Model.Hierarchies.SelectMany(a => a.Types).Single(a => a.UnderlyingType==entityType); - } - - #endregion - - protected Operation(QueryProvider queryProvider) - { - QueryProvider = queryProvider; - Type entityType = typeof (T); - Session = queryProvider.Session; - DomainHandler = Session.Domain.Services.Get(); - TypeInfo = - queryProvider.Session.Domain.Model.Hierarchies.SelectMany(a => a.Types).Single( - a => a.UnderlyingType==entityType); - var mapping = Session.StorageNode.Mapping; - PrimaryIndexes = TypeInfo.AffectedIndexes - .Where(i => i.IsPrimary) - .Select(i => new PrimaryIndexMapping(i, mapping[i.ReflectedType])) - .ToArray(); - QueryBuilder = Session.Services.Get(); - } - - protected QueryCommand ToCommand(SqlStatement statement) - { - return - QueryBuilder.CreateCommand( - QueryBuilder.CreateRequest(QueryBuilder.CompileQuery((ISqlCompileUnit) statement), Bindings)); - } - } +// Copyright (C) 2019-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; +using Xtensive.Sql.Model; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using QueryParameterBinding = Xtensive.Orm.Services.QueryParameterBinding; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.BulkOperations +{ + internal abstract class Operation + where T : class, IEntity + { + private static readonly MethodInfo TranslateQueryMethod = typeof(QueryBuilder).GetMethod("TranslateQuery"); + public readonly QueryProvider QueryProvider; + public List Bindings; + protected DomainHandler DomainHandler; + protected PrimaryIndexMapping[] PrimaryIndexes; + public QueryBuilder QueryBuilder; + public Session Session; + protected TypeInfo TypeInfo; + public SqlTableRef JoinedTableRef; + + public int Execute() + { + EnsureTransactionIsStarted(); + QueryProvider.Session.SaveChanges(); + int value = ExecuteInternal(); + SessionStateAccessor accessor = DirectStateAccessor.Get(QueryProvider.Session); + accessor.Invalidate(); + return value; + } + + #region Non-public methods + + protected void EnsureTransactionIsStarted() + { + var accessor = QueryProvider.Session.Services.Demand(); +#pragma warning disable 168 + DbTransaction notUsed = accessor.Transaction; +#pragma warning restore 168 + } + + protected abstract int ExecuteInternal(); + + public QueryTranslationResult GetRequest(IQueryable query) + { + return QueryBuilder.TranslateQuery(query); + } + + public QueryTranslationResult GetRequest(Type type, IQueryable query) + { + return + (QueryTranslationResult) TranslateQueryMethod.MakeGenericMethod(type).Invoke(QueryBuilder, new object[] {query}); + } + + public TypeInfo GetTypeInfo(Type entityType) + { + return Session.Domain.Model.Hierarchies.SelectMany(a => a.Types).Single(a => a.UnderlyingType==entityType); + } + + #endregion + + protected Operation(QueryProvider queryProvider) + { + QueryProvider = queryProvider; + Type entityType = typeof (T); + Session = queryProvider.Session; + DomainHandler = Session.Domain.Services.Get(); + TypeInfo = + queryProvider.Session.Domain.Model.Hierarchies.SelectMany(a => a.Types).Single( + a => a.UnderlyingType==entityType); + var mapping = Session.StorageNode.Mapping; + PrimaryIndexes = TypeInfo.AffectedIndexes + .Where(i => i.IsPrimary) + .Select(i => new PrimaryIndexMapping(i, mapping[i.ReflectedType])) + .ToArray(); + QueryBuilder = Session.Services.Get(); + } + + protected QueryCommand ToCommand(SqlStatement statement) + { + return + QueryBuilder.CreateCommand( + QueryBuilder.CreateRequest(QueryBuilder.CompileQuery((ISqlCompileUnit) statement), Bindings)); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/PrimaryIndexMapping.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/PrimaryIndexMapping.cs index 3a499def90..2937eac466 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/PrimaryIndexMapping.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/PrimaryIndexMapping.cs @@ -1,18 +1,18 @@ -using Xtensive.Orm.Model; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.BulkOperations -{ - internal sealed class PrimaryIndexMapping - { - public IndexInfo PrimaryIndex { get; private set; } - - public Table Table { get; private set; } - - public PrimaryIndexMapping(IndexInfo index, Table table) - { - PrimaryIndex = index; - Table = table; - } - } +using Xtensive.Orm.Model; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.BulkOperations +{ + internal sealed class PrimaryIndexMapping + { + public IndexInfo PrimaryIndex { get; private set; } + + public Table Table { get; private set; } + + public PrimaryIndexMapping(IndexInfo index, Table table) + { + PrimaryIndex = index; + Table = table; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/QueryOperation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/QueryOperation.cs index 04665a4409..c99c0dda84 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/QueryOperation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/QueryOperation.cs @@ -1,204 +1,204 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Model; -using Xtensive.Orm.Rse; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal abstract class QueryOperation : Operation - where T : class, IEntity - { - private readonly static MethodInfo inMethod = GetInMethod(); - protected IQueryable query; - - protected QueryOperation(QueryProvider queryProvider) - : base(queryProvider) - { - } - - private static MethodInfo GetInMethod() - { - foreach (var method in typeof (QueryableExtensions).GetMethods().Where(a => string.Equals(a.Name, "In", StringComparison.Ordinal))) { - var parameters = method.GetParameters(); - if (parameters.Length == 3 && string.Equals(parameters[2].ParameterType.Name, "IEnumerable`1", StringComparison.Ordinal)) - return method; - } - return null; - } - - protected override int ExecuteInternal() - { - Expression e = query.Expression.Visit((MethodCallExpression ex) => - { - var methodInfo = ex.Method; - //rewrite localCollection.Contains(entity.SomeField) -> entity.SomeField.In(localCollection) - if (methodInfo.DeclaringType == typeof(Enumerable) && - string.Equals(methodInfo.Name, "Contains", StringComparison.Ordinal) && - ex.Arguments.Count == 2) { - var localCollection = ex.Arguments[0];//IEnumerable - var valueToCheck = ex.Arguments[1]; - var genericInMethod = inMethod.MakeGenericMethod(new[] { valueToCheck.Type }); - ex = Expression.Call(genericInMethod, valueToCheck, Expression.Constant(IncludeAlgorithm.ComplexCondition), localCollection); - methodInfo = ex.Method; - } - - if (methodInfo.DeclaringType == typeof(QueryableExtensions) && - string.Equals(methodInfo.Name, "In", StringComparison.Ordinal) && - ex.Arguments.Count > 1) { - if (ex.Arguments[1].Type == typeof(IncludeAlgorithm)) { - var algorithm = (IncludeAlgorithm) ex.Arguments[1].Invoke(); - if (algorithm == IncludeAlgorithm.TemporaryTable) { - throw new NotSupportedException("IncludeAlgorithm.TemporaryTable is not supported"); - } - if (algorithm == IncludeAlgorithm.Auto) { - List arguments = ex.Arguments.ToList(); - arguments[1] = Expression.Constant(IncludeAlgorithm.ComplexCondition); - ex = Expression.Call(methodInfo, arguments); - } - } - else { - List arguments = ex.Arguments.ToList(); - arguments.Insert(1, Expression.Constant(IncludeAlgorithm.ComplexCondition)); - List types = methodInfo.GetParameters().Select(a => a.ParameterType).ToList(); - types.Insert(1, typeof(IncludeAlgorithm)); - ex = Expression.Call(inMethod.MakeGenericMethod(methodInfo.GetGenericArguments()), - arguments.ToArray()); - } - } - return ex; - }); - query = QueryProvider.CreateQuery(e); - return 0; - } - - #region Non-public methods - - protected abstract SqlTableRef GetStatementTable(SqlStatement statement); - protected abstract SqlExpression GetStatementWhere(SqlStatement statement); - - protected void Join(SqlQueryStatement statement, SqlSelect select) - { - if (select.HasLimit) - JoinWhenQueryHasLimitation(statement, select); - else - JoinWhenQueryHasNoLimitation(statement, select); - } - - protected abstract void SetStatementFrom(SqlStatement statement, SqlTable from); - protected abstract void SetStatementTable(SqlStatement statement, SqlTableRef table); - protected abstract void SetStatementWhere(SqlStatement statement, SqlExpression where); - protected abstract void SetStatementLimit(SqlStatement statement, SqlExpression limit); - protected abstract bool SupportsJoin(); - protected abstract bool SupportsLimitation(); - - private void JoinWhenQueryHasLimitation(SqlStatement statement, SqlSelect select) - { - if (!SupportsLimitation() && !SupportsJoin()) - throw new NotSupportedException("This provider does not supported limitation of affected rows."); - - var sqlTableRef = @select.From as SqlTableRef; - if (sqlTableRef!=null) { - SetStatementTable(statement, sqlTableRef); - JoinedTableRef = sqlTableRef; - } - else - sqlTableRef = GetStatementTable(statement); - if (SupportsLimitation()) { - SetStatementLimit(statement, select.Limit); - SetStatementWhere(statement, select.Where); - } - else - JoinViaFrom(statement, select); - - - } - private void JoinWhenQueryHasNoLimitation(SqlStatement statement, SqlSelect select) - { - var sqlTableRef = @select.From as SqlTableRef; - if (sqlTableRef!=null) { - SetStatementTable(statement, sqlTableRef); - SetStatementWhere(statement, select.Where); - JoinedTableRef = sqlTableRef; - return; - } - - if (SupportsJoin()) - JoinViaFrom(statement, select); - else - JoinViaIn(statement, select); - } - - private void JoinViaIn(SqlStatement statement, SqlSelect @select) - { - SqlTableRef table = GetStatementTable(statement); - SqlExpression where = GetStatementWhere(statement); - JoinedTableRef = table; - PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; - var columns = new List(); - foreach (ColumnInfo columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys) - { - SqlSelect s = select.ShallowClone(); - foreach (ColumnInfo column in columns) - { - SqlBinary ex = SqlDml.Equals(SqlDml.TableColumn(s.From, column.Name), SqlDml.TableColumn(table, column.Name)); - s.Where = s.Where.IsNullReference() ? ex : SqlDml.And(s.Where, ex); - } - s.Columns.Clear(); - s.Columns.Add(SqlDml.TableColumn(s.From, columnInfo.Name)); - SqlBinary @in = SqlDml.In(SqlDml.TableColumn(table, columnInfo.Name), s); - @where = @where.IsNullReference() ? @in : SqlDml.And(@where, @in); - columns.Add(columnInfo); - } - SetStatementWhere(statement, where); - } - - - private void JoinViaFrom(SqlStatement statement, SqlSelect select) - { - var queryRef = SqlDml.QueryRef(select, "source"); - SetStatementFrom(statement, queryRef); - var sqlTableRef = GetStatementTable(statement); - SqlExpression whereExpression = null; - PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; - foreach (ColumnInfo columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys) { - var leftColumn = queryRef.Columns[columnInfo.Name]; - var rightColumn = sqlTableRef==null ? GetStatementTable(statement).Columns[columnInfo.Name] : sqlTableRef.Columns[columnInfo.Name]; - if (leftColumn==null || rightColumn==null) - throw new InvalidOperationException("Source query doesn't contain one of key columns of updated table."); - var columnEqualityExperssion = SqlDml.Equals(queryRef.Columns[columnInfo.Name], sqlTableRef.Columns[columnInfo.Name]); - if (whereExpression==null) - whereExpression = columnEqualityExperssion; - else - whereExpression = SqlDml.And(whereExpression, columnEqualityExperssion); - } - SetStatementWhere(statement, whereExpression); - } - - private void JoinViaJoin(SqlStatement statement, SqlSelect @select) - { - PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; - SqlTableRef left = SqlDml.TableRef(indexMapping.Table); - SqlQueryRef right = SqlDml.QueryRef(@select); - SqlExpression joinExpression = null; - for (int i = 0; i < indexMapping.PrimaryIndex.KeyColumns.Count; i++) - { - SqlBinary binary = (left.Columns[i] == right.Columns[i]); - if (joinExpression.IsNullReference()) - joinExpression = binary; - else - joinExpression &= binary; - } - JoinedTableRef = left; - SqlJoinedTable joinedTable = left.InnerJoin(right, joinExpression); - SetStatementFrom(statement, joinedTable); - } - - #endregion - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Model; +using Xtensive.Orm.Rse; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal abstract class QueryOperation : Operation + where T : class, IEntity + { + private readonly static MethodInfo inMethod = GetInMethod(); + protected IQueryable query; + + protected QueryOperation(QueryProvider queryProvider) + : base(queryProvider) + { + } + + private static MethodInfo GetInMethod() + { + foreach (var method in typeof (QueryableExtensions).GetMethods().Where(a => string.Equals(a.Name, "In", StringComparison.Ordinal))) { + var parameters = method.GetParameters(); + if (parameters.Length == 3 && string.Equals(parameters[2].ParameterType.Name, "IEnumerable`1", StringComparison.Ordinal)) + return method; + } + return null; + } + + protected override int ExecuteInternal() + { + Expression e = query.Expression.Visit((MethodCallExpression ex) => + { + var methodInfo = ex.Method; + //rewrite localCollection.Contains(entity.SomeField) -> entity.SomeField.In(localCollection) + if (methodInfo.DeclaringType == typeof(Enumerable) && + string.Equals(methodInfo.Name, "Contains", StringComparison.Ordinal) && + ex.Arguments.Count == 2) { + var localCollection = ex.Arguments[0];//IEnumerable + var valueToCheck = ex.Arguments[1]; + var genericInMethod = inMethod.MakeGenericMethod(new[] { valueToCheck.Type }); + ex = Expression.Call(genericInMethod, valueToCheck, Expression.Constant(IncludeAlgorithm.ComplexCondition), localCollection); + methodInfo = ex.Method; + } + + if (methodInfo.DeclaringType == typeof(QueryableExtensions) && + string.Equals(methodInfo.Name, "In", StringComparison.Ordinal) && + ex.Arguments.Count > 1) { + if (ex.Arguments[1].Type == typeof(IncludeAlgorithm)) { + var algorithm = (IncludeAlgorithm) ex.Arguments[1].Invoke(); + if (algorithm == IncludeAlgorithm.TemporaryTable) { + throw new NotSupportedException("IncludeAlgorithm.TemporaryTable is not supported"); + } + if (algorithm == IncludeAlgorithm.Auto) { + List arguments = ex.Arguments.ToList(); + arguments[1] = Expression.Constant(IncludeAlgorithm.ComplexCondition); + ex = Expression.Call(methodInfo, arguments); + } + } + else { + List arguments = ex.Arguments.ToList(); + arguments.Insert(1, Expression.Constant(IncludeAlgorithm.ComplexCondition)); + List types = methodInfo.GetParameters().Select(a => a.ParameterType).ToList(); + types.Insert(1, typeof(IncludeAlgorithm)); + ex = Expression.Call(inMethod.MakeGenericMethod(methodInfo.GetGenericArguments()), + arguments.ToArray()); + } + } + return ex; + }); + query = QueryProvider.CreateQuery(e); + return 0; + } + + #region Non-public methods + + protected abstract SqlTableRef GetStatementTable(SqlStatement statement); + protected abstract SqlExpression GetStatementWhere(SqlStatement statement); + + protected void Join(SqlQueryStatement statement, SqlSelect select) + { + if (select.HasLimit) + JoinWhenQueryHasLimitation(statement, select); + else + JoinWhenQueryHasNoLimitation(statement, select); + } + + protected abstract void SetStatementFrom(SqlStatement statement, SqlTable from); + protected abstract void SetStatementTable(SqlStatement statement, SqlTableRef table); + protected abstract void SetStatementWhere(SqlStatement statement, SqlExpression where); + protected abstract void SetStatementLimit(SqlStatement statement, SqlExpression limit); + protected abstract bool SupportsJoin(); + protected abstract bool SupportsLimitation(); + + private void JoinWhenQueryHasLimitation(SqlStatement statement, SqlSelect select) + { + if (!SupportsLimitation() && !SupportsJoin()) + throw new NotSupportedException("This provider does not supported limitation of affected rows."); + + var sqlTableRef = @select.From as SqlTableRef; + if (sqlTableRef!=null) { + SetStatementTable(statement, sqlTableRef); + JoinedTableRef = sqlTableRef; + } + else + sqlTableRef = GetStatementTable(statement); + if (SupportsLimitation()) { + SetStatementLimit(statement, select.Limit); + SetStatementWhere(statement, select.Where); + } + else + JoinViaFrom(statement, select); + + + } + private void JoinWhenQueryHasNoLimitation(SqlStatement statement, SqlSelect select) + { + var sqlTableRef = @select.From as SqlTableRef; + if (sqlTableRef!=null) { + SetStatementTable(statement, sqlTableRef); + SetStatementWhere(statement, select.Where); + JoinedTableRef = sqlTableRef; + return; + } + + if (SupportsJoin()) + JoinViaFrom(statement, select); + else + JoinViaIn(statement, select); + } + + private void JoinViaIn(SqlStatement statement, SqlSelect @select) + { + SqlTableRef table = GetStatementTable(statement); + SqlExpression where = GetStatementWhere(statement); + JoinedTableRef = table; + PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; + var columns = new List(); + foreach (ColumnInfo columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys) + { + SqlSelect s = select.ShallowClone(); + foreach (ColumnInfo column in columns) + { + SqlBinary ex = SqlDml.Equals(SqlDml.TableColumn(s.From, column.Name), SqlDml.TableColumn(table, column.Name)); + s.Where = s.Where.IsNullReference() ? ex : SqlDml.And(s.Where, ex); + } + s.Columns.Clear(); + s.Columns.Add(SqlDml.TableColumn(s.From, columnInfo.Name)); + SqlBinary @in = SqlDml.In(SqlDml.TableColumn(table, columnInfo.Name), s); + @where = @where.IsNullReference() ? @in : SqlDml.And(@where, @in); + columns.Add(columnInfo); + } + SetStatementWhere(statement, where); + } + + + private void JoinViaFrom(SqlStatement statement, SqlSelect select) + { + var queryRef = SqlDml.QueryRef(select, "source"); + SetStatementFrom(statement, queryRef); + var sqlTableRef = GetStatementTable(statement); + SqlExpression whereExpression = null; + PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; + foreach (ColumnInfo columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys) { + var leftColumn = queryRef.Columns[columnInfo.Name]; + var rightColumn = sqlTableRef==null ? GetStatementTable(statement).Columns[columnInfo.Name] : sqlTableRef.Columns[columnInfo.Name]; + if (leftColumn==null || rightColumn==null) + throw new InvalidOperationException("Source query doesn't contain one of key columns of updated table."); + var columnEqualityExperssion = SqlDml.Equals(queryRef.Columns[columnInfo.Name], sqlTableRef.Columns[columnInfo.Name]); + if (whereExpression==null) + whereExpression = columnEqualityExperssion; + else + whereExpression = SqlDml.And(whereExpression, columnEqualityExperssion); + } + SetStatementWhere(statement, whereExpression); + } + + private void JoinViaJoin(SqlStatement statement, SqlSelect @select) + { + PrimaryIndexMapping indexMapping = PrimaryIndexes[0]; + SqlTableRef left = SqlDml.TableRef(indexMapping.Table); + SqlQueryRef right = SqlDml.QueryRef(@select); + SqlExpression joinExpression = null; + for (int i = 0; i < indexMapping.PrimaryIndex.KeyColumns.Count; i++) + { + SqlBinary binary = (left.Columns[i] == right.Columns[i]); + if (joinExpression.IsNullReference()) + joinExpression = binary; + else + joinExpression &= binary; + } + JoinedTableRef = left; + SqlJoinedTable joinedTable = left.InnerJoin(right, joinExpression); + SetStatementFrom(statement, joinedTable); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetDescriptor.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetDescriptor.cs index 93ff428316..a56202a8d0 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetDescriptor.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetDescriptor.cs @@ -1,19 +1,19 @@ -using System.Linq.Expressions; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.BulkOperations -{ - internal class SetDescriptor - { - public FieldInfo Field { get; private set; } - public ParameterExpression Parameter { get; private set; } - public Expression Expression { get; private set; } - - public SetDescriptor(FieldInfo field, ParameterExpression parameter, Expression expression) - { - Field = field; - Parameter = parameter; - Expression = expression; - } - } +using System.Linq.Expressions; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.BulkOperations +{ + internal class SetDescriptor + { + public FieldInfo Field { get; private set; } + public ParameterExpression Parameter { get; private set; } + public Expression Expression { get; private set; } + + public SetDescriptor(FieldInfo field, ParameterExpression parameter, Expression expression) + { + Field = field; + Parameter = parameter; + Expression = expression; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetOperation.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetOperation.cs index 9bccbb9f87..91777ffff8 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetOperation.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetOperation.cs @@ -1,282 +1,282 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using Xtensive.Orm.Model; -using Xtensive.Orm.Services; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Core; -using Xtensive.Linq; - -namespace Xtensive.Orm.BulkOperations -{ - internal class SetOperation - where T : class, IEntity - { - private readonly Operation parent; - - public List Descriptors { get; set; } - public SetStatement Statement { get; set; } - - #region Non-public methods - - private void PreprocessStructures() - { - bool changed = true; - while (changed) - { - changed = false; - foreach (SetDescriptor setDescriptor in Descriptors.Where(a => a.Field.IsStructure).ToArray()) - { - var memberInit = setDescriptor.Expression as MemberInitExpression; - if (memberInit != null) - { - changed = true; - Descriptors.Remove(setDescriptor); - foreach (MemberAssignment binding in memberInit.Bindings) - { - FieldInfo f = setDescriptor.Field.Fields.First(a => a.UnderlyingProperty == binding.Member); - Descriptors.Add(new SetDescriptor(f, setDescriptor.Parameter, binding.Expression)); - } - } - else - foreach (FieldInfo f in setDescriptor.Field.Fields.Where(a => !a.IsStructure)) - { - changed = true; - string name = f.Name; - if (setDescriptor.Field.IsStructure) - name = name.Remove(0, setDescriptor.Field.Name.Length + 1); - Descriptors.Remove(setDescriptor); - Expression ex = setDescriptor.Expression; - var call = ex as MethodCallExpression; - if (call != null && call.Method.DeclaringType == typeof(Queryable) && - call.Method.Name.In("First", "FirstOrDefault", "Single", "SingleOrDefault")) - throw new NotSupportedException("Subqueries with structures are not supported"); - /*ex = call.Arguments[0]; - ParameterExpression parameter = Expression.Parameter(setDescriptor.Expression.Type, "parameter"); - var list = new List {f}; - while (list.Last().Parent != setDescriptor.Field) - list.Add(f.Parent); - list.Reverse(); - Expression member = parameter; - foreach (Model.FieldInfo f2 in list) - member = Expression.MakeMemberAccess(member, f2.UnderlyingProperty); - LambdaExpression lambda = - Expression.Lambda( - typeof (Func<,>).MakeGenericType(parameter.Type, f.ValueType), member, parameter); - ex = Expression.Call( - typeof (Queryable), "Select", new[] {parameter.Type, f.ValueType}, ex, lambda); - ex = Expression.Call(typeof (Queryable), call.Method.Name, new[] {f.ValueType}, ex);*/ - else - { - //ex = Expression.Convert(ex, typeof(Structure)); - var list = new List { f }; - while (list.Last().Parent != setDescriptor.Field) - list.Add(f.Parent); - list.Reverse(); - Expression member = ex; - foreach (FieldInfo f2 in list) - member = Expression.MakeMemberAccess(member, f2.UnderlyingProperty); - ex = member; - } - Descriptors.Add(new SetDescriptor(f, setDescriptor.Parameter, ex)); - } - } - } - } - private void AddComputedStaticExpression(AddValueContext addContext) - { - SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); - var all = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] { typeof(T) }); - MethodCallExpression selectExpression = Expression.Call( - typeof(Queryable), - "OrderBy", - addContext.Lambda.Type.GetGenericArguments(), - all, - addContext.Lambda); - QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery(selectExpression)); - var sqlSelect = ((SqlSelect)request.Query); - SqlExpression ex = sqlSelect.OrderBy[0].Expression; - var placeholder = ex as SqlPlaceholder; - if (placeholder == null) - { - parent.Bindings.AddRange(request.ParameterBindings); - addContext.Statement.AddValue(column, ex); - return; - } - //hack for this case - addContext.Lambda=(LambdaExpression) addContext.Lambda.Visit((Expression e) => - { - if (e.Type != typeof (Session)) - return e; - return Expression.Property(addContext.Lambda.Parameters[0], "Session"); - }); - AddComputedExpression(addContext); - } - - private void AddComputedExpression(AddValueContext addContext) - { - SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); - var all = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] {typeof (T)}); - MethodCallExpression selectExpression = Expression.Call( - typeof (Queryable), - "OrderBy", - addContext.Lambda.Type.GetGenericArguments(), - all, - addContext.Lambda); - QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery(selectExpression)); - var sqlSelect = ((SqlSelect) request.Query); - SqlExpression ex = sqlSelect.OrderBy[0].Expression; - parent.Bindings.AddRange(request.ParameterBindings); - - if(parent.JoinedTableRef!=null) - ex.AcceptVisitor(new ComputedExpressionSqlVisitor(sqlSelect.From, parent.JoinedTableRef)); - - addContext.Statement.AddValue(column, ex); - } - - private void AddConstantValue(AddValueContext addContext) - { - SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); - SqlExpression value; - object constant = FastExpression.Lambda(addContext.Lambda.Body).Compile().DynamicInvoke(); - if (constant==null) - value = SqlDml.Null; - else { - QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(constant.GetType(), () => constant); - parent.Bindings.Add(binding); - value = binding.ParameterReference; - } - addContext.Statement.AddValue(column, value); - } - - private void AddEntityValue(AddValueContext addContext) - { - if (addContext.EntityParamExists) - throw new NotSupportedException("Expressions with reference to updating entity are not supported"); - var methodCall = addContext.Descriptor.Expression as MethodCallExpression; - int i; - if (methodCall!=null) { - if (methodCall.Method.DeclaringType==typeof (QueryEndpoint) && - methodCall.Method.Name.In("Single", "SingleOrDefault")) { - object[] keys; - if (methodCall.Arguments[0].Type==typeof (Key) || methodCall.Arguments[0].Type.IsSubclassOf(typeof (Key))) { - var key = (Key) methodCall.Arguments[0].Invoke(); - keys = new object[key.Value.Count]; - for (i = 0; i < keys.Length; i++) - keys[i] = key.Value.GetValue(i); - } - else - keys = (object[]) methodCall.Arguments[0].Invoke(); - i = -1; - foreach (ColumnInfo column in addContext.Field.Columns) { - i++; - SqlExpression value; - if (keys[i]==null) - value = SqlDml.Null; - else { - object v = keys[i]; - QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v); - parent.Bindings.Add(binding); - value = binding.ParameterReference; - } - SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name); - addContext.Statement.AddValue(c, value); - } - return; - } - if (methodCall.Method.DeclaringType==typeof (Queryable) && - methodCall.Method.Name.In("Single", "SingleOrDefault", "First", "FirstOrDefault")) { - Expression exp = methodCall.Arguments[0]; - TypeInfo info = parent.GetTypeInfo(addContext.Field.ValueType); - if (methodCall.Arguments.Count==2) - exp = Expression.Call( - typeof (Queryable), "Where", new[] {info.UnderlyingType}, exp, methodCall.Arguments[1]); - exp = Expression.Call(typeof (Queryable), "Take", new[] {info.UnderlyingType}, exp, Expression.Constant(1)); - i = -1; - foreach (FieldInfo field in - info.Key.Fields) { - i++; - ParameterExpression p = Expression.Parameter(info.UnderlyingType); - LambdaExpression lambda = - FastExpression.Lambda( - typeof (Func<,>).MakeGenericType(info.UnderlyingType, field.ValueType), - Expression.MakeMemberAccess(p, field.UnderlyingProperty), - p); - IQueryable q = - ((IQueryProvider)parent.QueryProvider).CreateQuery( - Expression.Call(typeof (Queryable), "Select", new[] {info.UnderlyingType, field.ValueType}, exp, lambda)); - QueryTranslationResult request = parent.GetRequest(field.ValueType, q); - parent.Bindings.AddRange(request.ParameterBindings); - SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Columns[i].Name); - addContext.Statement.AddValue(c, SqlDml.SubQuery((ISqlQueryExpression) request.Query)); - } - return; - } - } - i = -1; - var entity = (IEntity) FastExpression.Lambda(addContext.Lambda.Body, null).Compile().DynamicInvoke(); - foreach (ColumnInfo column in addContext.Field.Columns) { - i++; - SqlExpression value; - if (entity==null) - value = SqlDml.Null; - else { - object v = entity.Key.Value.GetValue(i); - QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v); - parent.Bindings.Add(binding); - value = binding.ParameterReference; - } - SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name); - addContext.Statement.AddValue(c, value); - } - } - - public void AddValues() - { - foreach (SetDescriptor descriptor in Descriptors) { - var addContext = new AddValueContext { - Descriptor = descriptor, - Lambda = - FastExpression.Lambda( - typeof (Func<,>).MakeGenericType(typeof (T), descriptor.Expression.Type), - descriptor.Expression, - descriptor.Parameter), - Statement = Statement - }; - descriptor.Expression.Visit( - delegate(ParameterExpression p) { - // ReSharper disable AccessToModifiedClosure - if (p==descriptor.Parameter) - // ReSharper restore AccessToModifiedClosure - addContext.EntityParamExists = true; - return p; - }); - addContext.SubqueryExists = descriptor.Expression.IsContainsQuery(); - addContext.Field = descriptor.Field; - if (addContext.Field.IsEntitySet) - throw new NotSupportedException("EntitySets are not supported"); - if (addContext.Field.IsEntity) { - AddEntityValue(addContext); - continue; - } - if(!addContext.EntityParamExists && addContext.SubqueryExists) - AddComputedStaticExpression(addContext); - else if (addContext.EntityParamExists || addContext.SubqueryExists) - AddComputedExpression(addContext); - else - AddConstantValue(addContext); - } - } - - #endregion - - public SetOperation(Operation parent, List descriptors) - { - this.parent = parent; - Descriptors = descriptors; - PreprocessStructures(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using Xtensive.Orm.Model; +using Xtensive.Orm.Services; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Core; +using Xtensive.Linq; + +namespace Xtensive.Orm.BulkOperations +{ + internal class SetOperation + where T : class, IEntity + { + private readonly Operation parent; + + public List Descriptors { get; set; } + public SetStatement Statement { get; set; } + + #region Non-public methods + + private void PreprocessStructures() + { + bool changed = true; + while (changed) + { + changed = false; + foreach (SetDescriptor setDescriptor in Descriptors.Where(a => a.Field.IsStructure).ToArray()) + { + var memberInit = setDescriptor.Expression as MemberInitExpression; + if (memberInit != null) + { + changed = true; + Descriptors.Remove(setDescriptor); + foreach (MemberAssignment binding in memberInit.Bindings) + { + FieldInfo f = setDescriptor.Field.Fields.First(a => a.UnderlyingProperty == binding.Member); + Descriptors.Add(new SetDescriptor(f, setDescriptor.Parameter, binding.Expression)); + } + } + else + foreach (FieldInfo f in setDescriptor.Field.Fields.Where(a => !a.IsStructure)) + { + changed = true; + string name = f.Name; + if (setDescriptor.Field.IsStructure) + name = name.Remove(0, setDescriptor.Field.Name.Length + 1); + Descriptors.Remove(setDescriptor); + Expression ex = setDescriptor.Expression; + var call = ex as MethodCallExpression; + if (call != null && call.Method.DeclaringType == typeof(Queryable) && + call.Method.Name.In("First", "FirstOrDefault", "Single", "SingleOrDefault")) + throw new NotSupportedException("Subqueries with structures are not supported"); + /*ex = call.Arguments[0]; + ParameterExpression parameter = Expression.Parameter(setDescriptor.Expression.Type, "parameter"); + var list = new List {f}; + while (list.Last().Parent != setDescriptor.Field) + list.Add(f.Parent); + list.Reverse(); + Expression member = parameter; + foreach (Model.FieldInfo f2 in list) + member = Expression.MakeMemberAccess(member, f2.UnderlyingProperty); + LambdaExpression lambda = + Expression.Lambda( + typeof (Func<,>).MakeGenericType(parameter.Type, f.ValueType), member, parameter); + ex = Expression.Call( + typeof (Queryable), "Select", new[] {parameter.Type, f.ValueType}, ex, lambda); + ex = Expression.Call(typeof (Queryable), call.Method.Name, new[] {f.ValueType}, ex);*/ + else + { + //ex = Expression.Convert(ex, typeof(Structure)); + var list = new List { f }; + while (list.Last().Parent != setDescriptor.Field) + list.Add(f.Parent); + list.Reverse(); + Expression member = ex; + foreach (FieldInfo f2 in list) + member = Expression.MakeMemberAccess(member, f2.UnderlyingProperty); + ex = member; + } + Descriptors.Add(new SetDescriptor(f, setDescriptor.Parameter, ex)); + } + } + } + } + private void AddComputedStaticExpression(AddValueContext addContext) + { + SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); + var all = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] { typeof(T) }); + MethodCallExpression selectExpression = Expression.Call( + typeof(Queryable), + "OrderBy", + addContext.Lambda.Type.GetGenericArguments(), + all, + addContext.Lambda); + QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery(selectExpression)); + var sqlSelect = ((SqlSelect)request.Query); + SqlExpression ex = sqlSelect.OrderBy[0].Expression; + var placeholder = ex as SqlPlaceholder; + if (placeholder == null) + { + parent.Bindings.AddRange(request.ParameterBindings); + addContext.Statement.AddValue(column, ex); + return; + } + //hack for this case + addContext.Lambda=(LambdaExpression) addContext.Lambda.Visit((Expression e) => + { + if (e.Type != typeof (Session)) + return e; + return Expression.Property(addContext.Lambda.Parameters[0], "Session"); + }); + AddComputedExpression(addContext); + } + + private void AddComputedExpression(AddValueContext addContext) + { + SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); + var all = Expression.Call(Expression.Constant(parent.Session.Query), "All", new[] {typeof (T)}); + MethodCallExpression selectExpression = Expression.Call( + typeof (Queryable), + "OrderBy", + addContext.Lambda.Type.GetGenericArguments(), + all, + addContext.Lambda); + QueryTranslationResult request = parent.GetRequest(parent.QueryProvider.CreateQuery(selectExpression)); + var sqlSelect = ((SqlSelect) request.Query); + SqlExpression ex = sqlSelect.OrderBy[0].Expression; + parent.Bindings.AddRange(request.ParameterBindings); + + if(parent.JoinedTableRef!=null) + ex.AcceptVisitor(new ComputedExpressionSqlVisitor(sqlSelect.From, parent.JoinedTableRef)); + + addContext.Statement.AddValue(column, ex); + } + + private void AddConstantValue(AddValueContext addContext) + { + SqlTableColumn column = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Column.Name); + SqlExpression value; + object constant = FastExpression.Lambda(addContext.Lambda.Body).Compile().DynamicInvoke(); + if (constant==null) + value = SqlDml.Null; + else { + QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(constant.GetType(), () => constant); + parent.Bindings.Add(binding); + value = binding.ParameterReference; + } + addContext.Statement.AddValue(column, value); + } + + private void AddEntityValue(AddValueContext addContext) + { + if (addContext.EntityParamExists) + throw new NotSupportedException("Expressions with reference to updating entity are not supported"); + var methodCall = addContext.Descriptor.Expression as MethodCallExpression; + int i; + if (methodCall!=null) { + if (methodCall.Method.DeclaringType==typeof (QueryEndpoint) && + methodCall.Method.Name.In("Single", "SingleOrDefault")) { + object[] keys; + if (methodCall.Arguments[0].Type==typeof (Key) || methodCall.Arguments[0].Type.IsSubclassOf(typeof (Key))) { + var key = (Key) methodCall.Arguments[0].Invoke(); + keys = new object[key.Value.Count]; + for (i = 0; i < keys.Length; i++) + keys[i] = key.Value.GetValue(i); + } + else + keys = (object[]) methodCall.Arguments[0].Invoke(); + i = -1; + foreach (ColumnInfo column in addContext.Field.Columns) { + i++; + SqlExpression value; + if (keys[i]==null) + value = SqlDml.Null; + else { + object v = keys[i]; + QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v); + parent.Bindings.Add(binding); + value = binding.ParameterReference; + } + SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name); + addContext.Statement.AddValue(c, value); + } + return; + } + if (methodCall.Method.DeclaringType==typeof (Queryable) && + methodCall.Method.Name.In("Single", "SingleOrDefault", "First", "FirstOrDefault")) { + Expression exp = methodCall.Arguments[0]; + TypeInfo info = parent.GetTypeInfo(addContext.Field.ValueType); + if (methodCall.Arguments.Count==2) + exp = Expression.Call( + typeof (Queryable), "Where", new[] {info.UnderlyingType}, exp, methodCall.Arguments[1]); + exp = Expression.Call(typeof (Queryable), "Take", new[] {info.UnderlyingType}, exp, Expression.Constant(1)); + i = -1; + foreach (FieldInfo field in + info.Key.Fields) { + i++; + ParameterExpression p = Expression.Parameter(info.UnderlyingType); + LambdaExpression lambda = + FastExpression.Lambda( + typeof (Func<,>).MakeGenericType(info.UnderlyingType, field.ValueType), + Expression.MakeMemberAccess(p, field.UnderlyingProperty), + p); + IQueryable q = + ((IQueryProvider)parent.QueryProvider).CreateQuery( + Expression.Call(typeof (Queryable), "Select", new[] {info.UnderlyingType, field.ValueType}, exp, lambda)); + QueryTranslationResult request = parent.GetRequest(field.ValueType, q); + parent.Bindings.AddRange(request.ParameterBindings); + SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, addContext.Field.Columns[i].Name); + addContext.Statement.AddValue(c, SqlDml.SubQuery((ISqlQueryExpression) request.Query)); + } + return; + } + } + i = -1; + var entity = (IEntity) FastExpression.Lambda(addContext.Lambda.Body, null).Compile().DynamicInvoke(); + foreach (ColumnInfo column in addContext.Field.Columns) { + i++; + SqlExpression value; + if (entity==null) + value = SqlDml.Null; + else { + object v = entity.Key.Value.GetValue(i); + QueryParameterBinding binding = parent.QueryBuilder.CreateParameterBinding(v.GetType(), () => v); + parent.Bindings.Add(binding); + value = binding.ParameterReference; + } + SqlTableColumn c = SqlDml.TableColumn(addContext.Statement.Table, column.Name); + addContext.Statement.AddValue(c, value); + } + } + + public void AddValues() + { + foreach (SetDescriptor descriptor in Descriptors) { + var addContext = new AddValueContext { + Descriptor = descriptor, + Lambda = + FastExpression.Lambda( + typeof (Func<,>).MakeGenericType(typeof (T), descriptor.Expression.Type), + descriptor.Expression, + descriptor.Parameter), + Statement = Statement + }; + descriptor.Expression.Visit( + delegate(ParameterExpression p) { + // ReSharper disable AccessToModifiedClosure + if (p==descriptor.Parameter) + // ReSharper restore AccessToModifiedClosure + addContext.EntityParamExists = true; + return p; + }); + addContext.SubqueryExists = descriptor.Expression.IsContainsQuery(); + addContext.Field = descriptor.Field; + if (addContext.Field.IsEntitySet) + throw new NotSupportedException("EntitySets are not supported"); + if (addContext.Field.IsEntity) { + AddEntityValue(addContext); + continue; + } + if(!addContext.EntityParamExists && addContext.SubqueryExists) + AddComputedStaticExpression(addContext); + else if (addContext.EntityParamExists || addContext.SubqueryExists) + AddComputedExpression(addContext); + else + AddConstantValue(addContext); + } + } + + #endregion + + public SetOperation(Operation parent, List descriptors) + { + this.parent = parent; + Descriptors = descriptors; + PreprocessStructures(); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetStatement.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetStatement.cs index cfa8645649..dd2d62223f 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/SetStatement.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/SetStatement.cs @@ -1,71 +1,71 @@ -using System; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.BulkOperations -{ - internal abstract class SetStatement - { - #region Nested type: Insert - - private class Insert : SetStatement - { - private SqlInsert insert - { - get { return (SqlInsert) statement; } - } - - public override SqlTable Table - { - get { return insert.Into; } - } - - public override void AddValue(SqlTableColumn column, SqlExpression value) - { - insert.Values.Add(column, value); - } - } - - #endregion - - #region Nested type: Update - - private class Update : SetStatement - { - private SqlUpdate update - { - get { return (SqlUpdate) statement; } - } - - public override SqlTable Table - { - get { return update.Update; } - } - - public override void AddValue(SqlTableColumn column, SqlExpression value) - { - update.Values.Add(column, value); - } - } - - #endregion - - private SqlQueryStatement statement; - - public static SetStatement Create(SqlQueryStatement statement) - { - SetStatement result; - if (statement is SqlUpdate) - result = new Update(); - else if (statement is SqlInsert) - result = new Insert(); - else - throw new InvalidOperationException("Statement must be SqlUpdate or SqlInsert"); - result.statement = statement; - return result; - } - - public abstract SqlTable Table { get; } - public abstract void AddValue(SqlTableColumn column, SqlExpression value); - } +using System; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.BulkOperations +{ + internal abstract class SetStatement + { + #region Nested type: Insert + + private class Insert : SetStatement + { + private SqlInsert insert + { + get { return (SqlInsert) statement; } + } + + public override SqlTable Table + { + get { return insert.Into; } + } + + public override void AddValue(SqlTableColumn column, SqlExpression value) + { + insert.Values.Add(column, value); + } + } + + #endregion + + #region Nested type: Update + + private class Update : SetStatement + { + private SqlUpdate update + { + get { return (SqlUpdate) statement; } + } + + public override SqlTable Table + { + get { return update.Update; } + } + + public override void AddValue(SqlTableColumn column, SqlExpression value) + { + update.Values.Add(column, value); + } + } + + #endregion + + private SqlQueryStatement statement; + + public static SetStatement Create(SqlQueryStatement statement) + { + SetStatement result; + if (statement is SqlUpdate) + result = new Update(); + else if (statement is SqlInsert) + result = new Insert(); + else + throw new InvalidOperationException("Statement must be SqlUpdate or SqlInsert"); + result.statement = statement; + return result; + } + + public abstract SqlTable Table { get; } + public abstract void AddValue(SqlTableColumn column, SqlExpression value); + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Internals/Updatable.cs b/Extensions/Xtensive.Orm.BulkOperations/Internals/Updatable.cs index 1678a7bebe..9b417bb184 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Internals/Updatable.cs +++ b/Extensions/Xtensive.Orm.BulkOperations/Internals/Updatable.cs @@ -1,27 +1,27 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace Xtensive.Orm.BulkOperations -{ - internal class Updatable : IUpdatable where T : IEntity - { - internal readonly List> Expressions; - internal readonly IQueryable Query; - - public Updatable(Updatable updatable, Expression field, Expression update) - { - Query = updatable.Query; - Expressions = new List>(updatable.Expressions.Count + 1); - Expressions.AddRange(updatable.Expressions); - Expressions.Add(Tuple.Create(field, update)); - } - - public Updatable(IQueryable query, Expression field, Expression update) - { - Query = query; - Expressions = new List>(1) {Tuple.Create(field, update)}; - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace Xtensive.Orm.BulkOperations +{ + internal class Updatable : IUpdatable where T : IEntity + { + internal readonly List> Expressions; + internal readonly IQueryable Query; + + public Updatable(Updatable updatable, Expression field, Expression update) + { + Query = updatable.Query; + Expressions = new List>(updatable.Expressions.Count + 1); + Expressions.AddRange(updatable.Expressions); + Expressions.Add(Tuple.Create(field, update)); + } + + public Updatable(IQueryable query, Expression field, Expression update) + { + Query = query; + Expressions = new List>(1) {Tuple.Create(field, update)}; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Readme.txt b/Extensions/Xtensive.Orm.BulkOperations/Readme.txt index 7bebea8f63..a906cfbd92 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Readme.txt +++ b/Extensions/Xtensive.Orm.BulkOperations/Readme.txt @@ -1,83 +1,83 @@ -=========================== -Xtensive.Orm.BulkOperations -=========================== - -Summary -------- -The extension provides a set of IQueryable extension methods that are translated -to server-side UPDATE or DELETE commands. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) - -Implementation -------------- -1. Add reference to Xtensive.Orm.BulkOperations assembly - -Demo ----- -1. Update primitive property with a constant value, e.g.: - -Query.All() - .Where(a => a.Id == 1) - .Set(a => a.Count, 2) - .Update(); - -2. Updating persistent property with expression, computed on server, e.g.: - -Query.All() - .Where(a => a.Id==1) - .Set(a => a.Count, a => a.Description.Length) - .Update(); - -3. Setting a reference to an entity that is already loaded into current Session - -// Emulating entity loading -var bar = Query.Single(1); - -Query.All() - .Where(a => a.Id == 2) - .Set(a => a.Bar, bar) - .Update(); - -4. Setting a reference to an entity that is not loaded into Session, 1st way - -Query.All() - .Where(a => a.Id == 1) - .Set(a => a.Bar, a => Query.Single(1)) - .Update(); - -5. Setting a reference to an entity that is not loaded into Session, 2nd way - -Query.All() - .Where(a => a.Id == 1) - .Set(a => a.Bar, a => Query.All().Single(b => b.Name == "test")) - .Update(); - -6. Constructing update expressions of the fly - -bool condition = CheckCondition(); -var query = Query.All() - .Where(a => a.Id == 1) - .Set(a => a.Count, 2); - -if(condition) - query = query.Set(a => a.Name, a => a.Name + "test"); -query.Update(); - -7. Updating lots of properties at once - -Query.All() - .Where(a => a.Id == 1) - .Update(a => new Bar(null) { Count = 2, Name = a.Name + "test", dozens of other properties... }); - -8. Deleting entities - -Query.All() - .Where(a => a.Id == 1) - .Delete(); - -References ----------- +=========================== +Xtensive.Orm.BulkOperations +=========================== + +Summary +------- +The extension provides a set of IQueryable extension methods that are translated +to server-side UPDATE or DELETE commands. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) + +Implementation +------------- +1. Add reference to Xtensive.Orm.BulkOperations assembly + +Demo +---- +1. Update primitive property with a constant value, e.g.: + +Query.All() + .Where(a => a.Id == 1) + .Set(a => a.Count, 2) + .Update(); + +2. Updating persistent property with expression, computed on server, e.g.: + +Query.All() + .Where(a => a.Id==1) + .Set(a => a.Count, a => a.Description.Length) + .Update(); + +3. Setting a reference to an entity that is already loaded into current Session + +// Emulating entity loading +var bar = Query.Single(1); + +Query.All() + .Where(a => a.Id == 2) + .Set(a => a.Bar, bar) + .Update(); + +4. Setting a reference to an entity that is not loaded into Session, 1st way + +Query.All() + .Where(a => a.Id == 1) + .Set(a => a.Bar, a => Query.Single(1)) + .Update(); + +5. Setting a reference to an entity that is not loaded into Session, 2nd way + +Query.All() + .Where(a => a.Id == 1) + .Set(a => a.Bar, a => Query.All().Single(b => b.Name == "test")) + .Update(); + +6. Constructing update expressions of the fly + +bool condition = CheckCondition(); +var query = Query.All() + .Where(a => a.Id == 1) + .Set(a => a.Count, 2); + +if(condition) + query = query.Set(a => a.Name, a => a.Name + "test"); +query.Update(); + +7. Updating lots of properties at once + +Query.All() + .Where(a => a.Id == 1) + .Update(a => new Bar(null) { Count = 2, Name = a.Name + "test", dozens of other properties... }); + +8. Deleting entities + +Query.All() + .Where(a => a.Id == 1) + .Delete(); + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.BulkOperations/Xtensive.Orm.BulkOperations.csproj b/Extensions/Xtensive.Orm.BulkOperations/Xtensive.Orm.BulkOperations.csproj index a1371a80d3..17f1b03518 100644 --- a/Extensions/Xtensive.Orm.BulkOperations/Xtensive.Orm.BulkOperations.csproj +++ b/Extensions/Xtensive.Orm.BulkOperations/Xtensive.Orm.BulkOperations.csproj @@ -1,26 +1,26 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.BulkOperations - Bulk operations extension for $(DoProductName) - $(Title) - Adds support for bulk insert, update and delete operations for $(DoProductName)-powered domain models - true - ..\Extensions.snk - true - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.BulkOperations + Bulk operations extension for $(DoProductName) + $(Title) + Adds support for bulk insert, update and delete operations for $(DoProductName)-powered domain models + true + ..\Extensions.snk + true + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/AccessToLocalizationOnUpgrade.cs b/Extensions/Xtensive.Orm.Localization.Tests/AccessToLocalizationOnUpgrade.cs index 137104ebf1..353ae0b46a 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/AccessToLocalizationOnUpgrade.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/AccessToLocalizationOnUpgrade.cs @@ -1,78 +1,78 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using NUnit.Framework; -using TestCommon; -using Xtensive.Orm.Localization.Tests.Model; -using Xtensive.Orm.Upgrade; -using Xtensive.Orm.Localization.Tests.Model.Upgrader; - -namespace Xtensive.Orm.Localization.Tests.Model.Upgrader -{ - public class CustomUpgradeHandler : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - Query.All().FirstOrDefault(x => x.Title=="Welcome!"); - } - } -} - -namespace Xtensive.Orm.Localization.Tests -{ - [TestFixture] - public class AccessToLocalizationOnUpgrade - { - public static CultureInfo EnglishCulture = new CultureInfo("en-US"); - public static string EnglishTitle = "Welcome!"; - public static string EnglishContent = "My dear guests, welcome to my birthday party!"; - - public static CultureInfo SpanishCulture = new CultureInfo("es-ES"); - public static string SpanishTitle = "Bienvenido!"; - public static string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; - - [OneTimeSetUp] - public void TestFixtureSetup() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (ILocalizable<>).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - // populating database - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - transaction.Complete(); - } - } - - [Test] - public void MainTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (ILocalizable<>).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); - configuration.Types.Register(typeof (CustomUpgradeHandler)); - configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All().FirstOrDefault(x => x.Title==EnglishTitle); - } - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using NUnit.Framework; +using TestCommon; +using Xtensive.Orm.Localization.Tests.Model; +using Xtensive.Orm.Upgrade; +using Xtensive.Orm.Localization.Tests.Model.Upgrader; + +namespace Xtensive.Orm.Localization.Tests.Model.Upgrader +{ + public class CustomUpgradeHandler : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + Query.All().FirstOrDefault(x => x.Title=="Welcome!"); + } + } +} + +namespace Xtensive.Orm.Localization.Tests +{ + [TestFixture] + public class AccessToLocalizationOnUpgrade + { + public static CultureInfo EnglishCulture = new CultureInfo("en-US"); + public static string EnglishTitle = "Welcome!"; + public static string EnglishContent = "My dear guests, welcome to my birthday party!"; + + public static CultureInfo SpanishCulture = new CultureInfo("es-ES"); + public static string SpanishTitle = "Bienvenido!"; + public static string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; + + [OneTimeSetUp] + public void TestFixtureSetup() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (ILocalizable<>).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + // populating database + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + transaction.Complete(); + } + } + + [Test] + public void MainTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (ILocalizable<>).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); + configuration.Types.Register(typeof (CustomUpgradeHandler)); + configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All().FirstOrDefault(x => x.Title==EnglishTitle); + } + } + } +} diff --git a/Extensions/Xtensive.Orm.Localization.Tests/App.config b/Extensions/Xtensive.Orm.Localization.Tests/App.config index 4652f9a13c..8c902fe35a 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/App.config +++ b/Extensions/Xtensive.Orm.Localization.Tests/App.config @@ -1,11 +1,11 @@ - - - -
-
- - - - - - + + + +
+
+ + + + + + diff --git a/Extensions/Xtensive.Orm.Localization.Tests/AutoBuildTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/AutoBuildTest.cs index 9154fcd376..0e5d338e21 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/AutoBuildTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/AutoBuildTest.cs @@ -1,34 +1,34 @@ -using System.Globalization; -using NUnit.Framework; -using TestCommon; - -namespace Xtensive.Orm.Localization.Tests -{ - [TestFixture] - public abstract class AutoBuildTest - { - public static CultureInfo EnglishCulture = new CultureInfo("en-US"); - public static string EnglishTitle = "Welcome!"; - public static string EnglishContent = "My dear guests, welcome to my birthday party!"; - - public static CultureInfo SpanishCulture = new CultureInfo("es-ES"); - public static string SpanishTitle = "Bienvenido!"; - public static string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; - - protected Domain Domain { get; private set; } - - [OneTimeSetUp] - public void OneTimeSetUp() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (ILocalizable<>).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); - Domain = Domain.Build(configuration); - PopulateDatabase(); - } - - protected virtual void PopulateDatabase() - { - } - } +using System.Globalization; +using NUnit.Framework; +using TestCommon; + +namespace Xtensive.Orm.Localization.Tests +{ + [TestFixture] + public abstract class AutoBuildTest + { + public static CultureInfo EnglishCulture = new CultureInfo("en-US"); + public static string EnglishTitle = "Welcome!"; + public static string EnglishContent = "My dear guests, welcome to my birthday party!"; + + public static CultureInfo SpanishCulture = new CultureInfo("es-ES"); + public static string SpanishTitle = "Bienvenido!"; + public static string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; + + protected Domain Domain { get; private set; } + + [OneTimeSetUp] + public void OneTimeSetUp() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (ILocalizable<>).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); + Domain = Domain.Build(configuration); + PopulateDatabase(); + } + + protected virtual void PopulateDatabase() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/CurrentThreadTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/CurrentThreadTest.cs index 1472811876..0f149dd287 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/CurrentThreadTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/CurrentThreadTest.cs @@ -1,53 +1,53 @@ -using System.Linq; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Localization.Tests.Model; - -namespace Xtensive.Orm.Localization.Tests -{ - public class CurrentThreadTest : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - var welcomePage = new Page(session); - - // Editing localizable properties through CurrentThread.CurrentCulture - Thread.CurrentThread.CurrentCulture = EnglishCulture; - welcomePage.Title = EnglishTitle; - welcomePage.Content = EnglishContent; - - // The same entity, the same properties, but another culture - Thread.CurrentThread.CurrentCulture = SpanishCulture; - welcomePage.Title = SpanishTitle; - welcomePage.Content = SpanishContent; - - ts.Complete(); - } - } - - // Checking the presence of localizable & localization entities - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(2, session.Query.All().Count()); - - var page = session.Query.All().First(); - Thread.CurrentThread.CurrentCulture = EnglishCulture; - Assert.AreEqual(EnglishTitle, page.Title); - Assert.AreEqual(EnglishContent, page.Content); - - Thread.CurrentThread.CurrentCulture = SpanishCulture; - Assert.AreEqual(SpanishTitle, page.Title); - Assert.AreEqual(SpanishContent, page.Content); - - ts.Complete(); - } - } - } - } +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Localization.Tests.Model; + +namespace Xtensive.Orm.Localization.Tests +{ + public class CurrentThreadTest : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + var welcomePage = new Page(session); + + // Editing localizable properties through CurrentThread.CurrentCulture + Thread.CurrentThread.CurrentCulture = EnglishCulture; + welcomePage.Title = EnglishTitle; + welcomePage.Content = EnglishContent; + + // The same entity, the same properties, but another culture + Thread.CurrentThread.CurrentCulture = SpanishCulture; + welcomePage.Title = SpanishTitle; + welcomePage.Content = SpanishContent; + + ts.Complete(); + } + } + + // Checking the presence of localizable & localization entities + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(2, session.Query.All().Count()); + + var page = session.Query.All().First(); + Thread.CurrentThread.CurrentCulture = EnglishCulture; + Assert.AreEqual(EnglishTitle, page.Title); + Assert.AreEqual(EnglishContent, page.Content); + + Thread.CurrentThread.CurrentCulture = SpanishCulture; + Assert.AreEqual(SpanishTitle, page.Title); + Assert.AreEqual(SpanishContent, page.Content); + + ts.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/DirectEditTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/DirectEditTest.cs index 7def1a8765..0e22a72e4f 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/DirectEditTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/DirectEditTest.cs @@ -1,46 +1,46 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Localization.Tests.Model; - -namespace Xtensive.Orm.Localization.Tests -{ - public class DirectEditTest : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - var welcomePage = new Page(session); - - // Editing localizations directly - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - ts.Complete(); - } - } - - // Checking the presence of localizable & localization entities - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(2, session.Query.All().Count()); - - var page = session.Query.All().First(); - Assert.AreEqual(EnglishTitle, page.Localizations[EnglishCulture].Title); - Assert.AreEqual(EnglishContent, page.Localizations[EnglishCulture].Content); - - Assert.AreEqual(SpanishTitle, page.Localizations[SpanishCulture].Title); - Assert.AreEqual(SpanishContent, page.Localizations[SpanishCulture].Content); - - ts.Complete(); - } - } - } - } +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Localization.Tests.Model; + +namespace Xtensive.Orm.Localization.Tests +{ + public class DirectEditTest : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + var welcomePage = new Page(session); + + // Editing localizations directly + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + ts.Complete(); + } + } + + // Checking the presence of localizable & localization entities + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(2, session.Query.All().Count()); + + var page = session.Query.All().First(); + Assert.AreEqual(EnglishTitle, page.Localizations[EnglishCulture].Title); + Assert.AreEqual(EnglishContent, page.Localizations[EnglishCulture].Content); + + Assert.AreEqual(SpanishTitle, page.Localizations[SpanishCulture].Title); + Assert.AreEqual(SpanishContent, page.Localizations[SpanishCulture].Content); + + ts.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/LocalizationScopeTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/LocalizationScopeTest.cs index f29c2a4ab2..dd59707afa 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/LocalizationScopeTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/LocalizationScopeTest.cs @@ -1,56 +1,56 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Localization.Tests.Model; - -namespace Xtensive.Orm.Localization.Tests -{ - public class LocalizationScopeTest : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - var welcomePage = new Page(session); - - // Editing localizable properties through localization scope - using (new LocalizationScope(EnglishCulture)) { - welcomePage.Title = EnglishTitle; - welcomePage.Content = EnglishContent; - } - - // The same entity, the same properties, but another culture - using (new LocalizationScope(SpanishCulture)) { - welcomePage.Title = SpanishTitle; - welcomePage.Content = SpanishContent; - } - - ts.Complete(); - } - } - - // Checking the presence of localizable & localization entities - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(2, session.Query.All().Count()); - - var page = session.Query.All().First(); - using (new LocalizationScope(EnglishCulture)) { - Assert.AreEqual(EnglishTitle, page.Title); - Assert.AreEqual(EnglishContent, page.Content); - } - - using (new LocalizationScope(SpanishCulture)) { - Assert.AreEqual(SpanishTitle, page.Title); - Assert.AreEqual(SpanishContent, page.Content); - } - - ts.Complete(); - } - } - } - } +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Localization.Tests.Model; + +namespace Xtensive.Orm.Localization.Tests +{ + public class LocalizationScopeTest : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + var welcomePage = new Page(session); + + // Editing localizable properties through localization scope + using (new LocalizationScope(EnglishCulture)) { + welcomePage.Title = EnglishTitle; + welcomePage.Content = EnglishContent; + } + + // The same entity, the same properties, but another culture + using (new LocalizationScope(SpanishCulture)) { + welcomePage.Title = SpanishTitle; + welcomePage.Content = SpanishContent; + } + + ts.Complete(); + } + } + + // Checking the presence of localizable & localization entities + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(2, session.Query.All().Count()); + + var page = session.Query.All().First(); + using (new LocalizationScope(EnglishCulture)) { + Assert.AreEqual(EnglishTitle, page.Title); + Assert.AreEqual(EnglishContent, page.Content); + } + + using (new LocalizationScope(SpanishCulture)) { + Assert.AreEqual(SpanishTitle, page.Title); + Assert.AreEqual(SpanishContent, page.Content); + } + + ts.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/Model/Page.cs b/Extensions/Xtensive.Orm.Localization.Tests/Model/Page.cs index 00d18567a0..f21be4054c 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/Model/Page.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/Model/Page.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.27 - -using System; -using Xtensive.Orm; - -namespace Xtensive.Orm.Localization.Tests.Model -{ - [Serializable] - [HierarchyRoot] - public class Page : Entity, ILocalizable - { - [Field, Key] - public int Id { get; private set; } - - // Non-persistent field - public string Title - { - get { return Localizations.Current.Title; } - set { Localizations.Current.Title = value; } - } - - // Non-persistent field - public string Content - { - get { return Localizations.Current.Content; } - set { Localizations.Current.Content = value; } - } - - /// - [Field] - public LocalizationSet Localizations { get; private set; } - - public Page(Session session) - : base(session) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.27 + +using System; +using Xtensive.Orm; + +namespace Xtensive.Orm.Localization.Tests.Model +{ + [Serializable] + [HierarchyRoot] + public class Page : Entity, ILocalizable + { + [Field, Key] + public int Id { get; private set; } + + // Non-persistent field + public string Title + { + get { return Localizations.Current.Title; } + set { Localizations.Current.Title = value; } + } + + // Non-persistent field + public string Content + { + get { return Localizations.Current.Content; } + set { Localizations.Current.Content = value; } + } + + /// + [Field] + public LocalizationSet Localizations { get; private set; } + + public Page(Session session) + : base(session) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/Model/PageLocalization.cs b/Extensions/Xtensive.Orm.Localization.Tests/Model/PageLocalization.cs index 17360e4091..271ec03e0c 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/Model/PageLocalization.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/Model/PageLocalization.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.27 - -using System; -using System.Globalization; -using Xtensive.Orm; - -namespace Xtensive.Orm.Localization.Tests.Model -{ - [Serializable] - [HierarchyRoot] - public class PageLocalization : Localization - { - [Field(Length = 100)] - public string Title { get; set; } - - [Field] - public string Content { get; set; } - - [Field] - public string MyContent { get; set; } - - public PageLocalization(Session session, CultureInfo culture, Page target) - : base(session, culture, target) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.27 + +using System; +using System.Globalization; +using Xtensive.Orm; + +namespace Xtensive.Orm.Localization.Tests.Model +{ + [Serializable] + [HierarchyRoot] + public class PageLocalization : Localization + { + [Field(Length = 100)] + public string Title { get; set; } + + [Field] + public string Content { get; set; } + + [Field] + public string MyContent { get; set; } + + public PageLocalization(Session session, CultureInfo culture, Page target) + : base(session, culture, target) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/QueryTests.cs b/Extensions/Xtensive.Orm.Localization.Tests/QueryTests.cs index 2055903408..8a3f6ee4ef 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/QueryTests.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/QueryTests.cs @@ -1,102 +1,102 @@ -using System; -using System.Linq; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Localization.Tests.Model; - -namespace Xtensive.Orm.Localization.Tests -{ - [TestFixture] - public class QueryTests : AutoBuildTest - { - protected override void PopulateDatabase() - { - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - // populating database - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - ts.Complete(); - } - } - } - - [Test] - public void ImplicitJoinViaPreprocessorTest() - { - Thread.CurrentThread.CurrentCulture = EnglishCulture; - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - string title = EnglishTitle; - var query = from p in session.Query.All() - where p.Title==title - select p; - Assert.AreEqual(1, query.Count()); - - ts.Complete(); - } - } - } - - [Test] - public void ExplicitJoinTest() - { - Thread.CurrentThread.CurrentCulture = EnglishCulture; - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - using (new LocalizationScope(SpanishCulture)) { - var query = from p in session.Query.All() - join pl in session.Query.All() - on p equals pl.Target - where pl.CultureName == LocalizationContext.Current.CultureName && pl.Title == SpanishTitle - select p; - Assert.AreEqual(1, query.Count()); - } - - ts.Complete(); - } - } - } - - [Test] - public void QueryForLocalizationPairTest() - { - Thread.CurrentThread.CurrentCulture = EnglishCulture; - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - var pairs = from pair in session.Query.All() - where pair.Localization.Title==EnglishTitle - select pair.Target; - Assert.AreEqual(1, pairs.Count()); - - ts.Complete(); - } - } - } - - [Test] - public void UnknownCultureTest() - { - Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ru-RU"); - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - - var query = from p in session.Query.All() - select p.Title; - Console.Write(query.First()); - Assert.AreEqual(1, query.Count()); - - ts.Complete(); - } - } - } - } +using System; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Localization.Tests.Model; + +namespace Xtensive.Orm.Localization.Tests +{ + [TestFixture] + public class QueryTests : AutoBuildTest + { + protected override void PopulateDatabase() + { + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + // populating database + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + ts.Complete(); + } + } + } + + [Test] + public void ImplicitJoinViaPreprocessorTest() + { + Thread.CurrentThread.CurrentCulture = EnglishCulture; + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + string title = EnglishTitle; + var query = from p in session.Query.All() + where p.Title==title + select p; + Assert.AreEqual(1, query.Count()); + + ts.Complete(); + } + } + } + + [Test] + public void ExplicitJoinTest() + { + Thread.CurrentThread.CurrentCulture = EnglishCulture; + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + using (new LocalizationScope(SpanishCulture)) { + var query = from p in session.Query.All() + join pl in session.Query.All() + on p equals pl.Target + where pl.CultureName == LocalizationContext.Current.CultureName && pl.Title == SpanishTitle + select p; + Assert.AreEqual(1, query.Count()); + } + + ts.Complete(); + } + } + } + + [Test] + public void QueryForLocalizationPairTest() + { + Thread.CurrentThread.CurrentCulture = EnglishCulture; + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + var pairs = from pair in session.Query.All() + where pair.Localization.Title==EnglishTitle + select pair.Target; + Assert.AreEqual(1, pairs.Count()); + + ts.Complete(); + } + } + } + + [Test] + public void UnknownCultureTest() + { + Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ru-RU"); + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + + var query = from p in session.Query.All() + select p.Title; + Console.Write(query.First()); + Assert.AreEqual(1, query.Count()); + + ts.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization.Tests/Xtensive.Orm.Localization.Tests.csproj b/Extensions/Xtensive.Orm.Localization.Tests/Xtensive.Orm.Localization.Tests.csproj index 47ac5dc92f..f694de8895 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/Xtensive.Orm.Localization.Tests.csproj +++ b/Extensions/Xtensive.Orm.Localization.Tests/Xtensive.Orm.Localization.Tests.csproj @@ -1,26 +1,26 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Configuration/Elements/ConfigurationSection.cs b/Extensions/Xtensive.Orm.Localization/Configuration/Elements/ConfigurationSection.cs index 3f4020b8cc..c13ec91716 100644 --- a/Extensions/Xtensive.Orm.Localization/Configuration/Elements/ConfigurationSection.cs +++ b/Extensions/Xtensive.Orm.Localization/Configuration/Elements/ConfigurationSection.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.07.06 - -using System; -using System.Configuration; - -namespace Xtensive.Orm.Localization.Configuration -{ - /// - /// A root element of localization configuration section within a configuration file. - /// - public class ConfigurationSection : System.Configuration.ConfigurationSection - { - /// - /// Gets default section name for security configuration. - /// Value is "Xtensive.Orm.Localization". - /// - public static readonly string DefaultSectionName = "Xtensive.Orm.Localization"; - - private const string DefaultCultureElementName = "defaultCulture"; - - /// - /// Gets or sets the authentication service. - /// - /// The authentication service. - [ConfigurationProperty(DefaultCultureElementName, IsRequired = false)] - public DefaultCultureConfigurationElement DefaultCulture - { - get { return (DefaultCultureConfigurationElement) this[DefaultCultureElementName]; } - set { this[DefaultCultureElementName] = value; } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.07.06 + +using System; +using System.Configuration; + +namespace Xtensive.Orm.Localization.Configuration +{ + /// + /// A root element of localization configuration section within a configuration file. + /// + public class ConfigurationSection : System.Configuration.ConfigurationSection + { + /// + /// Gets default section name for security configuration. + /// Value is "Xtensive.Orm.Localization". + /// + public static readonly string DefaultSectionName = "Xtensive.Orm.Localization"; + + private const string DefaultCultureElementName = "defaultCulture"; + + /// + /// Gets or sets the authentication service. + /// + /// The authentication service. + [ConfigurationProperty(DefaultCultureElementName, IsRequired = false)] + public DefaultCultureConfigurationElement DefaultCulture + { + get { return (DefaultCultureConfigurationElement) this[DefaultCultureElementName]; } + set { this[DefaultCultureElementName] = value; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Configuration/Elements/DefaultCultureConfigurationElement.cs b/Extensions/Xtensive.Orm.Localization/Configuration/Elements/DefaultCultureConfigurationElement.cs index 54f973af80..35b761fbe0 100644 --- a/Extensions/Xtensive.Orm.Localization/Configuration/Elements/DefaultCultureConfigurationElement.cs +++ b/Extensions/Xtensive.Orm.Localization/Configuration/Elements/DefaultCultureConfigurationElement.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.07.06 - -using System.Configuration; - -namespace Xtensive.Orm.Localization.Configuration -{ - /// - /// Default culture configuration element within a configuration file. - /// - public class DefaultCultureConfigurationElement : ConfigurationElement - { - private const string NameElementName = "name"; - - /// - /// Gets or sets the name of the default culture. - /// - [ConfigurationProperty(NameElementName, IsRequired = false)] - public string Name - { - get { return (string) this[NameElementName]; } - set { this[NameElementName] = value; } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.07.06 + +using System.Configuration; + +namespace Xtensive.Orm.Localization.Configuration +{ + /// + /// Default culture configuration element within a configuration file. + /// + public class DefaultCultureConfigurationElement : ConfigurationElement + { + private const string NameElementName = "name"; + + /// + /// Gets or sets the name of the default culture. + /// + [ConfigurationProperty(NameElementName, IsRequired = false)] + public string Name + { + get { return (string) this[NameElementName]; } + set { this[NameElementName] = value; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Configuration/LocalizationConfiguration.cs b/Extensions/Xtensive.Orm.Localization/Configuration/LocalizationConfiguration.cs index 37e709d256..aab701d997 100644 --- a/Extensions/Xtensive.Orm.Localization/Configuration/LocalizationConfiguration.cs +++ b/Extensions/Xtensive.Orm.Localization/Configuration/LocalizationConfiguration.cs @@ -1,107 +1,107 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.07.06 - -using System; -using System.Configuration; -using System.Globalization; -using System.Threading; - -namespace Xtensive.Orm.Localization.Configuration -{ - /// - /// The configuration of the localization extension. - /// - [Serializable] - public class LocalizationConfiguration - { - /// - /// Default SectionName value: - /// "". - /// - public const string DefaultSectionName = "Xtensive.Orm.Localization"; - - /// - /// Gets or sets the default culture. - /// - /// The default culture. - public CultureInfo DefaultCulture { get; private set; } - - /// - /// Loads the - /// from application configuration file (section with ). - /// - /// - /// The . - /// - public static LocalizationConfiguration Load() - { - return Load(DefaultSectionName); - } - - /// - /// Loads the - /// from application configuration file (section with ). - /// - /// Name of the section. - /// - /// The . - /// - public static LocalizationConfiguration Load(string sectionName) - { - var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); - return GetConfigurationFromSection(section); - } - - /// - /// Loads the - /// from given configuration (section with ). - /// - /// The configuration to load from. - /// - /// The . - /// - public static LocalizationConfiguration Load(System.Configuration.Configuration configuration) - { - return Load(configuration, DefaultSectionName); - } - - /// - /// Loads the - /// from application configuration file (section with ). - /// - /// The configuration to load from. - /// Name of the section. - /// - /// The . - /// - public static LocalizationConfiguration Load(System.Configuration.Configuration configuration, string sectionName) - { - var section = (ConfigurationSection) configuration.GetSection(sectionName); - return GetConfigurationFromSection(section); - } - - private static LocalizationConfiguration GetConfigurationFromSection(ConfigurationSection configurationSection) - { - var result = new LocalizationConfiguration(); - result.DefaultCulture = Thread.CurrentThread.CurrentCulture; - - string cultureName = configurationSection==null - ? string.Empty - : configurationSection.DefaultCulture.Name; - if (string.IsNullOrEmpty(cultureName)) - return result; - - try { - var culture = new CultureInfo(cultureName); - result.DefaultCulture = culture; - } - catch (CultureNotFoundException) - { - } - return result; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.07.06 + +using System; +using System.Configuration; +using System.Globalization; +using System.Threading; + +namespace Xtensive.Orm.Localization.Configuration +{ + /// + /// The configuration of the localization extension. + /// + [Serializable] + public class LocalizationConfiguration + { + /// + /// Default SectionName value: + /// "". + /// + public const string DefaultSectionName = "Xtensive.Orm.Localization"; + + /// + /// Gets or sets the default culture. + /// + /// The default culture. + public CultureInfo DefaultCulture { get; private set; } + + /// + /// Loads the + /// from application configuration file (section with ). + /// + /// + /// The . + /// + public static LocalizationConfiguration Load() + { + return Load(DefaultSectionName); + } + + /// + /// Loads the + /// from application configuration file (section with ). + /// + /// Name of the section. + /// + /// The . + /// + public static LocalizationConfiguration Load(string sectionName) + { + var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); + return GetConfigurationFromSection(section); + } + + /// + /// Loads the + /// from given configuration (section with ). + /// + /// The configuration to load from. + /// + /// The . + /// + public static LocalizationConfiguration Load(System.Configuration.Configuration configuration) + { + return Load(configuration, DefaultSectionName); + } + + /// + /// Loads the + /// from application configuration file (section with ). + /// + /// The configuration to load from. + /// Name of the section. + /// + /// The . + /// + public static LocalizationConfiguration Load(System.Configuration.Configuration configuration, string sectionName) + { + var section = (ConfigurationSection) configuration.GetSection(sectionName); + return GetConfigurationFromSection(section); + } + + private static LocalizationConfiguration GetConfigurationFromSection(ConfigurationSection configurationSection) + { + var result = new LocalizationConfiguration(); + result.DefaultCulture = Thread.CurrentThread.CurrentCulture; + + string cultureName = configurationSection==null + ? string.Empty + : configurationSection.DefaultCulture.Name; + if (string.IsNullOrEmpty(cultureName)) + return result; + + try { + var culture = new CultureInfo(cultureName); + result.DefaultCulture = culture; + } + catch (CultureNotFoundException) + { + } + return result; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/ILocalizable.cs b/Extensions/Xtensive.Orm.Localization/ILocalizable.cs index 13b3ad18ce..e4c7141c24 100644 --- a/Extensions/Xtensive.Orm.Localization/ILocalizable.cs +++ b/Extensions/Xtensive.Orm.Localization/ILocalizable.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.22 - -namespace Xtensive.Orm.Localization -{ - /// - /// Defines localization contract. - /// - /// Entity - public interface ILocalizable - where T : Localization - { - /// - /// Set of localizations. - /// - LocalizationSet Localizations { get; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.22 + +namespace Xtensive.Orm.Localization +{ + /// + /// Defines localization contract. + /// + /// Entity + public interface ILocalizable + where T : Localization + { + /// + /// Set of localizations. + /// + LocalizationSet Localizations { get; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionBuilder.cs b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionBuilder.cs index 0ae3b47d0b..5602eb4901 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionBuilder.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionBuilder.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.28 - -using System; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; - -namespace Xtensive.Orm.Localization -{ - internal static class LocalizationExpressionBuilder - { - private static readonly MethodInfo BuildExpressionMethodInfo = typeof(LocalizationExpressionBuilder).GetMethod("BuildExpression", BindingFlags.NonPublic | BindingFlags.Static); - - public static LambdaExpression BuildExpression(TypeLocalizationInfo localizationInfo, MemberExpression me, string defaultCultureName) - { - return (LambdaExpression)BuildExpressionMethodInfo - .MakeGenericMethod(localizationInfo.LocalizationTypeInfo.UnderlyingType) - .Invoke(null, new object[] { me.Member.Name, defaultCultureName }); - - } - - // Helper method for building lambda expression in generic way - private static LambdaExpression BuildExpression(string propertyName, string defaultCultureName) - where TLocalization : Localization - { - Expression, string>> result = set => set - .Where(localization => localization.CultureName == LocalizationContext.Current.CultureName) - .Select(localization => (string)localization[propertyName]) - .FirstOrDefault() - ?? - set - .Where(localization => localization.CultureName == defaultCultureName) - .Select(localization => (string)localization[propertyName]) - .FirstOrDefault(); - - return result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.28 + +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Xtensive.Orm.Localization +{ + internal static class LocalizationExpressionBuilder + { + private static readonly MethodInfo BuildExpressionMethodInfo = typeof(LocalizationExpressionBuilder).GetMethod("BuildExpression", BindingFlags.NonPublic | BindingFlags.Static); + + public static LambdaExpression BuildExpression(TypeLocalizationInfo localizationInfo, MemberExpression me, string defaultCultureName) + { + return (LambdaExpression)BuildExpressionMethodInfo + .MakeGenericMethod(localizationInfo.LocalizationTypeInfo.UnderlyingType) + .Invoke(null, new object[] { me.Member.Name, defaultCultureName }); + + } + + // Helper method for building lambda expression in generic way + private static LambdaExpression BuildExpression(string propertyName, string defaultCultureName) + where TLocalization : Localization + { + Expression, string>> result = set => set + .Where(localization => localization.CultureName == LocalizationContext.Current.CultureName) + .Select(localization => (string)localization[propertyName]) + .FirstOrDefault() + ?? + set + .Where(localization => localization.CultureName == defaultCultureName) + .Select(localization => (string)localization[propertyName]) + .FirstOrDefault(); + + return result; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionVisitor.cs b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionVisitor.cs index 54e9000cb3..3c52e71e76 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionVisitor.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationExpressionVisitor.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.16 - -using System.Linq.Expressions; -using Xtensive.Core; -using ExpressionVisitor = Xtensive.Linq.ExpressionVisitor; - -namespace Xtensive.Orm.Localization -{ - internal class LocalizationExpressionVisitor : ExpressionVisitor - { - public TypeLocalizationMap Map { get; private set; } - - public Expression VisitExpression(Expression query) - { - return Visit(query); - } - - /// - protected override Expression VisitMemberAccess(MemberExpression me) - { - if (Map == null) - return me; - - var localizationInfo = Map.Get(me.Member.ReflectedType); - if (localizationInfo == null || !localizationInfo.LocalizationTypeInfo.Fields.Contains(me.Member.Name)) - return base.VisitMemberAccess(me); - - var localizationSetExpression = Expression.MakeMemberAccess(me.Expression, localizationInfo.LocalizationSetProperty); - var localizationExpression = LocalizationExpressionBuilder.BuildExpression(localizationInfo, me, Map.Configuration.DefaultCulture.Name); - - return localizationExpression.BindParameters(localizationSetExpression); - } - - public LocalizationExpressionVisitor(TypeLocalizationMap map) - { - Map = map; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.16 + +using System.Linq.Expressions; +using Xtensive.Core; +using ExpressionVisitor = Xtensive.Linq.ExpressionVisitor; + +namespace Xtensive.Orm.Localization +{ + internal class LocalizationExpressionVisitor : ExpressionVisitor + { + public TypeLocalizationMap Map { get; private set; } + + public Expression VisitExpression(Expression query) + { + return Visit(query); + } + + /// + protected override Expression VisitMemberAccess(MemberExpression me) + { + if (Map == null) + return me; + + var localizationInfo = Map.Get(me.Member.ReflectedType); + if (localizationInfo == null || !localizationInfo.LocalizationTypeInfo.Fields.Contains(me.Member.Name)) + return base.VisitMemberAccess(me); + + var localizationSetExpression = Expression.MakeMemberAccess(me.Expression, localizationInfo.LocalizationSetProperty); + var localizationExpression = LocalizationExpressionBuilder.BuildExpression(localizationInfo, me, Map.Configuration.DefaultCulture.Name); + + return localizationExpression.BindParameters(localizationSetExpression); + } + + public LocalizationExpressionVisitor(TypeLocalizationMap map) + { + Map = map; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationPair.cs b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationPair.cs index e254c8c8b3..77df13c3b2 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationPair.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationPair.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.16 - -namespace Xtensive.Orm.Localization -{ - /// - /// A pair of localizable entity and its localization. - /// - /// The type of the target. - /// The type of the localization. - public struct LocalizationPair where TTarget: Entity where TLocalization: Localization - { - /// - /// Gets or sets the localizable entity. - /// - public TTarget Target { get; private set; } - - /// - /// Gets or sets the localization. - /// - public TLocalization Localization { get; private set; } - - /// - /// Initializes new instance of this type. - /// - /// The target. - /// The localization. - public LocalizationPair(TTarget target, TLocalization localization) - : this() - { - Target = target; - Localization = localization; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.16 + +namespace Xtensive.Orm.Localization +{ + /// + /// A pair of localizable entity and its localization. + /// + /// The type of the target. + /// The type of the localization. + public struct LocalizationPair where TTarget: Entity where TLocalization: Localization + { + /// + /// Gets or sets the localizable entity. + /// + public TTarget Target { get; private set; } + + /// + /// Gets or sets the localization. + /// + public TLocalization Localization { get; private set; } + + /// + /// Initializes new instance of this type. + /// + /// The target. + /// The localization. + public LocalizationPair(TTarget target, TLocalization localization) + : this() + { + Target = target; + Localization = localization; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationScope.cs b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationScope.cs index 6a2c0e9fdc..ac8d050e1b 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/LocalizationScope.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/LocalizationScope.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.01 - -using System.Globalization; -using Xtensive.Core; - -namespace Xtensive.Orm.Localization -{ - /// - /// Scope of localization. - /// - public class LocalizationScope : Scope - { - /// - /// Gets the current localization scope. - /// - /// The current localization scope. Returns in case it is absent. - public static LocalizationScope Current - { - get { return (LocalizationScope) CurrentScope; } - } - - /// - /// Gets the context of this scope. - /// - public new LocalizationContext Context - { - get { return CurrentContext; } - } - - /// - /// Initializes new instance of this type. - /// - /// The culture. - public LocalizationScope(CultureInfo culture) - : this(culture, LocalizationPolicy.Default) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The culture. - /// The policy. - public LocalizationScope(CultureInfo culture, LocalizationPolicy policy) - : base(new LocalizationContext(culture, policy)) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.01 + +using System.Globalization; +using Xtensive.Core; + +namespace Xtensive.Orm.Localization +{ + /// + /// Scope of localization. + /// + public class LocalizationScope : Scope + { + /// + /// Gets the current localization scope. + /// + /// The current localization scope. Returns in case it is absent. + public static LocalizationScope Current + { + get { return (LocalizationScope) CurrentScope; } + } + + /// + /// Gets the context of this scope. + /// + public new LocalizationContext Context + { + get { return CurrentContext; } + } + + /// + /// Initializes new instance of this type. + /// + /// The culture. + public LocalizationScope(CultureInfo culture) + : this(culture, LocalizationPolicy.Default) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The culture. + /// The policy. + public LocalizationScope(CultureInfo culture, LocalizationPolicy policy) + : base(new LocalizationContext(culture, policy)) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/QueryPreprocessor.cs b/Extensions/Xtensive.Orm.Localization/Internals/QueryPreprocessor.cs index 1067861a4b..b6aeb8395e 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/QueryPreprocessor.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/QueryPreprocessor.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.28 - -using System.Linq.Expressions; -using Xtensive.IoC; - -namespace Xtensive.Orm.Localization -{ - [Service(typeof(IQueryPreprocessor))] - internal class QueryPreprocessor : DomainBound, IQueryPreprocessor - { - private LocalizationExpressionVisitor visitor; - - /// - public Expression Apply(Expression query) - { - if (!IsInitialized) - TryInitialize(); - - if (!IsInitialized) - return query; - - return visitor.VisitExpression(query); - } - - private void TryInitialize() - { - // if there is a context then query is from upgrade handler - // so it is right to initialize localization here and allow user to - // perform query. - // Following initialization in IModule will be skipped - if (Upgrade.UpgradeScope.CurrentContext!=null) - TypeLocalizationMap.Initialize(Domain); - - var map = Domain.Extensions.Get(); - if (map != null) - visitor = new LocalizationExpressionVisitor(map); - } - - private bool IsInitialized - { - get { return visitor != null; } - } - - /// - public bool IsDependentOn(IQueryPreprocessor other) - { - return false; - } - - [ServiceConstructor] - public QueryPreprocessor(Domain domain) - : base(domain) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.28 + +using System.Linq.Expressions; +using Xtensive.IoC; + +namespace Xtensive.Orm.Localization +{ + [Service(typeof(IQueryPreprocessor))] + internal class QueryPreprocessor : DomainBound, IQueryPreprocessor + { + private LocalizationExpressionVisitor visitor; + + /// + public Expression Apply(Expression query) + { + if (!IsInitialized) + TryInitialize(); + + if (!IsInitialized) + return query; + + return visitor.VisitExpression(query); + } + + private void TryInitialize() + { + // if there is a context then query is from upgrade handler + // so it is right to initialize localization here and allow user to + // perform query. + // Following initialization in IModule will be skipped + if (Upgrade.UpgradeScope.CurrentContext!=null) + TypeLocalizationMap.Initialize(Domain); + + var map = Domain.Extensions.Get(); + if (map != null) + visitor = new LocalizationExpressionVisitor(map); + } + + private bool IsInitialized + { + get { return visitor != null; } + } + + /// + public bool IsDependentOn(IQueryPreprocessor other) + { + return false; + } + + [ServiceConstructor] + public QueryPreprocessor(Domain domain) + : base(domain) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationInfo.cs b/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationInfo.cs index b0d3cdda6e..2b57991ce9 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationInfo.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationInfo.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.28 - -using System; -using System.Reflection; -using Xtensive.Orm.Model; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.Localization -{ - internal class TypeLocalizationInfo - { - public Type LocalizableType { get; private set; } - - public Type LocalizationType { get { return LocalizationTypeInfo.UnderlyingType; } } - - public TypeInfo LocalizationTypeInfo { get; private set; } - - public PropertyInfo LocalizationSetProperty { get; private set; } - - - // Constructor - - public TypeLocalizationInfo(Type localizableType, TypeInfo localizationType) - { - LocalizableType = localizableType; - LocalizationTypeInfo = localizationType; - LocalizationSetProperty = localizableType.GetProperty("Localizations"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.28 + +using System; +using System.Reflection; +using Xtensive.Orm.Model; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.Localization +{ + internal class TypeLocalizationInfo + { + public Type LocalizableType { get; private set; } + + public Type LocalizationType { get { return LocalizationTypeInfo.UnderlyingType; } } + + public TypeInfo LocalizationTypeInfo { get; private set; } + + public PropertyInfo LocalizationSetProperty { get; private set; } + + + // Constructor + + public TypeLocalizationInfo(Type localizableType, TypeInfo localizationType) + { + LocalizableType = localizableType; + LocalizationTypeInfo = localizationType; + LocalizationSetProperty = localizableType.GetProperty("Localizations"); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationMap.cs b/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationMap.cs index b0e231bfca..51e17ff140 100644 --- a/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationMap.cs +++ b/Extensions/Xtensive.Orm.Localization/Internals/TypeLocalizationMap.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.28 - -using System; -using System.Collections.Generic; -using Xtensive.Orm.Localization.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Localization -{ - internal class TypeLocalizationMap - { - private readonly Dictionary map = new Dictionary(); - - public LocalizationConfiguration Configuration { get; private set; } - - public static void Initialize(Domain domain) - { - if (domain == null) - throw new ArgumentNullException("domain"); - if (domain.Extensions.Get() != null) - return; - - var map = new TypeLocalizationMap() { - Configuration = LocalizationConfiguration.Load() - }; - foreach (var localizableTypeInfo in domain.Model.Types.Entities) { - var type = localizableTypeInfo.UnderlyingType; - if (!type.IsOfGenericInterface(typeof (ILocalizable<>))) - continue; - var localizationType = type.GetInterface("ILocalizable`1").GetGenericArguments()[0]; - map.Register(type, domain.Model.Types[localizationType]); - } - domain.Extensions.Set(map); - } - - public TypeLocalizationInfo Get(Type localizableType) - { - TypeLocalizationInfo result; - if (map.TryGetValue(localizableType, out result)) - return result; - return null; - } - - private void Register(Type localizableType, TypeInfo localizationType) - { - map[localizableType] = new TypeLocalizationInfo(localizableType, localizationType); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.28 + +using System; +using System.Collections.Generic; +using Xtensive.Orm.Localization.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Localization +{ + internal class TypeLocalizationMap + { + private readonly Dictionary map = new Dictionary(); + + public LocalizationConfiguration Configuration { get; private set; } + + public static void Initialize(Domain domain) + { + if (domain == null) + throw new ArgumentNullException("domain"); + if (domain.Extensions.Get() != null) + return; + + var map = new TypeLocalizationMap() { + Configuration = LocalizationConfiguration.Load() + }; + foreach (var localizableTypeInfo in domain.Model.Types.Entities) { + var type = localizableTypeInfo.UnderlyingType; + if (!type.IsOfGenericInterface(typeof (ILocalizable<>))) + continue; + var localizationType = type.GetInterface("ILocalizable`1").GetGenericArguments()[0]; + map.Register(type, domain.Model.Types[localizationType]); + } + domain.Extensions.Set(map); + } + + public TypeLocalizationInfo Get(Type localizableType) + { + TypeLocalizationInfo result; + if (map.TryGetValue(localizableType, out result)) + return result; + return null; + } + + private void Register(Type localizableType, TypeInfo localizationType) + { + map[localizableType] = new TypeLocalizationInfo(localizableType, localizationType); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Localization.cs b/Extensions/Xtensive.Orm.Localization/Localization.cs index c5cfb36e95..8fdbc9757e 100644 --- a/Extensions/Xtensive.Orm.Localization/Localization.cs +++ b/Extensions/Xtensive.Orm.Localization/Localization.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.27 - -using System; -using System.Globalization; - -namespace Xtensive.Orm.Localization -{ - /// - /// Base localization class. - /// - [Serializable] - public abstract class Localization : Entity - { - /// - /// Gets or sets the name of the culture this particular localization is corresponds to. - /// - /// The name of the culture. - [Field(Length = 10), Key(0)] - public string CultureName { get; private set; } - - - // Constructor - - /// - /// Initializes new instance of this type. - /// - /// The session. - /// The culture. - /// The target. - protected Localization(Session session, CultureInfo culture, Entity target) - : base(session, culture.Name, target) - { - } - } - - /// - /// Base localization class with typed reference to localizable one. - /// - /// - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - public abstract class Localization : Localization where T : Entity - { - /// - /// Gets the target that is being localized. - /// - /// The target. - [Field, Key(1)] - [Association(PairTo = "Localizations", OnTargetRemove = OnRemoveAction.Cascade)] - public T Target { get; private set; } - - - // Constructor - - /// - /// Initializes new instance of this type. - /// - /// The session. - /// The culture. - /// The target. - protected Localization(Session session, CultureInfo culture, T target) - : base(session, culture, target) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.27 + +using System; +using System.Globalization; + +namespace Xtensive.Orm.Localization +{ + /// + /// Base localization class. + /// + [Serializable] + public abstract class Localization : Entity + { + /// + /// Gets or sets the name of the culture this particular localization is corresponds to. + /// + /// The name of the culture. + [Field(Length = 10), Key(0)] + public string CultureName { get; private set; } + + + // Constructor + + /// + /// Initializes new instance of this type. + /// + /// The session. + /// The culture. + /// The target. + protected Localization(Session session, CultureInfo culture, Entity target) + : base(session, culture.Name, target) + { + } + } + + /// + /// Base localization class with typed reference to localizable one. + /// + /// + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + public abstract class Localization : Localization where T : Entity + { + /// + /// Gets the target that is being localized. + /// + /// The target. + [Field, Key(1)] + [Association(PairTo = "Localizations", OnTargetRemove = OnRemoveAction.Cascade)] + public T Target { get; private set; } + + + // Constructor + + /// + /// Initializes new instance of this type. + /// + /// The session. + /// The culture. + /// The target. + protected Localization(Session session, CultureInfo culture, T target) + : base(session, culture, target) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/LocalizationContext.cs b/Extensions/Xtensive.Orm.Localization/LocalizationContext.cs index 3bcb73ccfe..6944a8b210 100644 --- a/Extensions/Xtensive.Orm.Localization/LocalizationContext.cs +++ b/Extensions/Xtensive.Orm.Localization/LocalizationContext.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.30 - -using System; -using System.Globalization; -using System.Threading; -using Xtensive.Core; - -namespace Xtensive.Orm.Localization -{ - /// - /// Localization context. - /// - public class LocalizationContext - { - private static LocalizationContext current; - - /// - /// Gets or sets the culture of this instance. - /// - /// The culture. - public CultureInfo Culture { get; private set; } - - /// - /// Gets or sets the name of the culture. - /// - /// The name of the culture. - public string CultureName { get; private set; } - - /// - /// Gets or sets the localization policy. - /// - /// The policy. - public LocalizationPolicy Policy { get; private set; } - - /// - /// Gets the current localization context. - /// - /// The current localization context. - public static LocalizationContext Current - { - get - { - var scope = LocalizationScope.Current; - if (scope!=null) - return scope.Context; - - var threadCulture = Thread.CurrentThread.CurrentCulture; - if (current==null || (current!=null && current.Culture!=threadCulture)) - current = new LocalizationContext(threadCulture); - - return current; - } - } - - - // Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The culture. - /// - public LocalizationContext(CultureInfo culture) - : this(culture, LocalizationPolicy.Default) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The culture. - /// The policy. - /// - public LocalizationContext(CultureInfo culture, LocalizationPolicy policy) - { - ArgumentValidator.EnsureArgumentNotNull(culture, "culture"); - Culture = culture; - CultureName = culture.Name; - Policy = policy; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.30 + +using System; +using System.Globalization; +using System.Threading; +using Xtensive.Core; + +namespace Xtensive.Orm.Localization +{ + /// + /// Localization context. + /// + public class LocalizationContext + { + private static LocalizationContext current; + + /// + /// Gets or sets the culture of this instance. + /// + /// The culture. + public CultureInfo Culture { get; private set; } + + /// + /// Gets or sets the name of the culture. + /// + /// The name of the culture. + public string CultureName { get; private set; } + + /// + /// Gets or sets the localization policy. + /// + /// The policy. + public LocalizationPolicy Policy { get; private set; } + + /// + /// Gets the current localization context. + /// + /// The current localization context. + public static LocalizationContext Current + { + get + { + var scope = LocalizationScope.Current; + if (scope!=null) + return scope.Context; + + var threadCulture = Thread.CurrentThread.CurrentCulture; + if (current==null || (current!=null && current.Culture!=threadCulture)) + current = new LocalizationContext(threadCulture); + + return current; + } + } + + + // Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The culture. + /// + public LocalizationContext(CultureInfo culture) + : this(culture, LocalizationPolicy.Default) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The culture. + /// The policy. + /// + public LocalizationContext(CultureInfo culture, LocalizationPolicy policy) + { + ArgumentValidator.EnsureArgumentNotNull(culture, "culture"); + Culture = culture; + CultureName = culture.Name; + Policy = policy; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/LocalizationModule.cs b/Extensions/Xtensive.Orm.Localization/LocalizationModule.cs index f5bf86fd2d..c2403a23f1 100644 --- a/Extensions/Xtensive.Orm.Localization/LocalizationModule.cs +++ b/Extensions/Xtensive.Orm.Localization/LocalizationModule.cs @@ -1,29 +1,29 @@ -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; - -namespace Xtensive.Orm.Localization -{ - /// - /// implementation for localization extension - /// - public class LocalizationModule : IModule - { - /// - /// Called when 'complex' build process is completed. - /// - /// The built domain. - public void OnBuilt(Domain domain) - { - TypeLocalizationMap.Initialize(domain); - } - - /// - /// Called when the build of is completed. - /// - /// The domain building context. - /// The domain model definition. - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - } - } -} +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; + +namespace Xtensive.Orm.Localization +{ + /// + /// implementation for localization extension + /// + public class LocalizationModule : IModule + { + /// + /// Called when 'complex' build process is completed. + /// + /// The built domain. + public void OnBuilt(Domain domain) + { + TypeLocalizationMap.Initialize(domain); + } + + /// + /// Called when the build of is completed. + /// + /// The domain building context. + /// The domain model definition. + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + } + } +} diff --git a/Extensions/Xtensive.Orm.Localization/LocalizationPolicy.cs b/Extensions/Xtensive.Orm.Localization/LocalizationPolicy.cs index 2fff730445..e56f46984c 100644 --- a/Extensions/Xtensive.Orm.Localization/LocalizationPolicy.cs +++ b/Extensions/Xtensive.Orm.Localization/LocalizationPolicy.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.30 - -using System; - -namespace Xtensive.Orm.Localization -{ - /// - /// Localization policy. - /// - [Serializable] - public enum LocalizationPolicy - { - /// - /// Default policy. New localization instance should be created in case it is absent. - /// - Default = 0, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.30 + +using System; + +namespace Xtensive.Orm.Localization +{ + /// + /// Localization policy. + /// + [Serializable] + public enum LocalizationPolicy + { + /// + /// Default policy. New localization instance should be created in case it is absent. + /// + Default = 0, + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/LocalizationSet.cs b/Extensions/Xtensive.Orm.Localization/LocalizationSet.cs index fd49789a25..d2ec63120a 100644 --- a/Extensions/Xtensive.Orm.Localization/LocalizationSet.cs +++ b/Extensions/Xtensive.Orm.Localization/LocalizationSet.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.30 - -using System; -using System.Globalization; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Localization -{ - /// - /// Set of localizations of type. - /// - /// The type of the item. - public class LocalizationSet : EntitySet where TItem : Localization - { - private TItem current; - - /// - /// Gets the appropriate according to the specified culture. - /// - public TItem this[CultureInfo culture] - { - get - { - var key = Key.Create(Session.Domain, Session.StorageNode.Id, typeof (TItem), TypeReferenceAccuracy.BaseType, culture.Name, Owner.Key); - var result = Session.Query.SingleOrDefault(key); - if (result!=null) - return result; - - // If we are here, then requested localization is absent, we are to create new or wrap the default one - // TODO: Apply policy rules. For now we create new item. - result = Create(culture); - return result; - } - } - - /// - /// Gets the currently active localization. - /// - /// The current localization. - public TItem Current - { - get { return GetCurrent(); } - } - - private TItem GetCurrent() - { - var context = LocalizationContext.Current; - - // Checking whether current localization fits current localization context - if (current != null && current.CultureName == context.CultureName) - return current; - - // If current localization is absent, fetching the requested one - var result = this[context.Culture]; - if (result != null) - current = result; - return result; - } - - private TItem Create(CultureInfo culture) - { - // TODO: Cache delegate on type initialization stage - return (TItem) Activator.CreateInstance(typeof (TItem), Session, culture, Owner); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The owner. - /// The field. - public LocalizationSet(Entity owner, FieldInfo field) - : base(owner, field) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.30 + +using System; +using System.Globalization; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Localization +{ + /// + /// Set of localizations of type. + /// + /// The type of the item. + public class LocalizationSet : EntitySet where TItem : Localization + { + private TItem current; + + /// + /// Gets the appropriate according to the specified culture. + /// + public TItem this[CultureInfo culture] + { + get + { + var key = Key.Create(Session.Domain, Session.StorageNode.Id, typeof (TItem), TypeReferenceAccuracy.BaseType, culture.Name, Owner.Key); + var result = Session.Query.SingleOrDefault(key); + if (result!=null) + return result; + + // If we are here, then requested localization is absent, we are to create new or wrap the default one + // TODO: Apply policy rules. For now we create new item. + result = Create(culture); + return result; + } + } + + /// + /// Gets the currently active localization. + /// + /// The current localization. + public TItem Current + { + get { return GetCurrent(); } + } + + private TItem GetCurrent() + { + var context = LocalizationContext.Current; + + // Checking whether current localization fits current localization context + if (current != null && current.CultureName == context.CultureName) + return current; + + // If current localization is absent, fetching the requested one + var result = this[context.Culture]; + if (result != null) + current = result; + return result; + } + + private TItem Create(CultureInfo culture) + { + // TODO: Cache delegate on type initialization stage + return (TItem) Activator.CreateInstance(typeof (TItem), Session, culture, Owner); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The owner. + /// The field. + public LocalizationSet(Entity owner, FieldInfo field) + : base(owner, field) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/QueryExtensions.cs b/Extensions/Xtensive.Orm.Localization/QueryExtensions.cs index 64948bcf29..f76b33bcdc 100644 --- a/Extensions/Xtensive.Orm.Localization/QueryExtensions.cs +++ b/Extensions/Xtensive.Orm.Localization/QueryExtensions.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.16 - -using System.Linq; -using Xtensive.Orm; - -namespace Xtensive.Orm.Localization -{ - /// - /// Query root for localizable and localization entities. - /// - public static class QueryExtensions - { - /// - /// Starting point for every query for localizable entities. - /// - /// The type of the target. - /// The type of the localization. - /// - public static IQueryable> All(this QueryEndpoint query) where TTarget: Entity where TLocalization: Localization - { - return from target in query.All() - join localization in query.All() - on target equals localization.Target - where localization.CultureName==LocalizationContext.Current.CultureName - select new LocalizationPair(target, localization); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.16 + +using System.Linq; +using Xtensive.Orm; + +namespace Xtensive.Orm.Localization +{ + /// + /// Query root for localizable and localization entities. + /// + public static class QueryExtensions + { + /// + /// Starting point for every query for localizable entities. + /// + /// The type of the target. + /// The type of the localization. + /// + public static IQueryable> All(this QueryEndpoint query) where TTarget: Entity where TLocalization: Localization + { + return from target in query.All() + join localization in query.All() + on target equals localization.Target + where localization.CultureName==LocalizationContext.Current.CultureName + select new LocalizationPair(target, localization); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Readme.txt b/Extensions/Xtensive.Orm.Localization/Readme.txt index 7121873aad..0021eb534a 100644 --- a/Extensions/Xtensive.Orm.Localization/Readme.txt +++ b/Extensions/Xtensive.Orm.Localization/Readme.txt @@ -1,122 +1,122 @@ -========================= -Xtensive.Orm.Localization -========================= - -Summary -------- -The extension transparently solves a task of application or service localization. -This implies that localizable resources are a part of domain model so they are stored in database. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Localization assembly -2. Include types from Xtensive.Orm.Localization assembly into the domain: - - - - - - - - - - - - - 2.1 Optionally add default localization configuration - -
- - - - - - -3. Implement ILocalizable on your localizable entities, e.g.: - - [HierarchyRoot] - public class Page : Entity, ILocalizable - { - [Field, Key] - public int Id { get; private set; } - - // Localizable field. Note that it is non-persistent - public string Title - { - get { return Localizations.Current.Title; } - set { Localizations.Current.Title = value; } - } - - [Field] // This is a storage of all localizations for Page class - public LocalizationSet Localizations { get; private set; } - - public Page(Session session) : base(session) {} - } - -4. Define corresponding localizations, e.g.: - - [HierarchyRoot] - public class PageLocalization : Localization - { - [Field(Length = 100)] - public string Title { get; set; } - - public PageLocalization(Session session, CultureInfo culture, Page target) - : base(session, culture, target) {} - } - -Demo ----- -1. Access localizable properties as regular ones, e.g.: - - page.Title = "Welcome"; - string title = page.Title; - -2. Mass editing of localizable properties: - - var en = new CultureInfo("en-US"); - var sp = new CultureInfo("es-ES"); - var page = new Page(session); - page.Localizations[en].Title = "Welcome"; - page.Localizations[sp].Title = "Bienvenido"; - -3. Value of localizable properties reflects culture of the current Thread, e.g.: - - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - string title = page.Title; // title is "Welcome" - - Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); - string title = page.Title; // title is "Bienvenido" - -4. Instead of altering CurrentThread, instance of LocalizationScope can be used, e.g.: - - using (new LocalizationScope(new CultureInfo("en-US"))) { - string title = page.Title; // title is "Welcome" - } - - using (new LocalizationScope(new CultureInfo("es-ES"))) { - string title = page.Title; // title is "Bienvenido" - } - -5. LINQ queries that include localizable properties are transparently translated - - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - var query = from p in session.Query.All() - where p.Title=="Welcome" - select p; - Assert.AreEqual(1, query.Count()); - - Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); - var query = from p in session.Query.All() - where p.Title=="Bienvenido" - select p; - Assert.AreEqual(1, query.Count()); - - -References ----------- +========================= +Xtensive.Orm.Localization +========================= + +Summary +------- +The extension transparently solves a task of application or service localization. +This implies that localizable resources are a part of domain model so they are stored in database. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Localization assembly +2. Include types from Xtensive.Orm.Localization assembly into the domain: + + + + + + + + + + + + + 2.1 Optionally add default localization configuration + +
+ + + + + + +3. Implement ILocalizable on your localizable entities, e.g.: + + [HierarchyRoot] + public class Page : Entity, ILocalizable + { + [Field, Key] + public int Id { get; private set; } + + // Localizable field. Note that it is non-persistent + public string Title + { + get { return Localizations.Current.Title; } + set { Localizations.Current.Title = value; } + } + + [Field] // This is a storage of all localizations for Page class + public LocalizationSet Localizations { get; private set; } + + public Page(Session session) : base(session) {} + } + +4. Define corresponding localizations, e.g.: + + [HierarchyRoot] + public class PageLocalization : Localization + { + [Field(Length = 100)] + public string Title { get; set; } + + public PageLocalization(Session session, CultureInfo culture, Page target) + : base(session, culture, target) {} + } + +Demo +---- +1. Access localizable properties as regular ones, e.g.: + + page.Title = "Welcome"; + string title = page.Title; + +2. Mass editing of localizable properties: + + var en = new CultureInfo("en-US"); + var sp = new CultureInfo("es-ES"); + var page = new Page(session); + page.Localizations[en].Title = "Welcome"; + page.Localizations[sp].Title = "Bienvenido"; + +3. Value of localizable properties reflects culture of the current Thread, e.g.: + + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + string title = page.Title; // title is "Welcome" + + Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); + string title = page.Title; // title is "Bienvenido" + +4. Instead of altering CurrentThread, instance of LocalizationScope can be used, e.g.: + + using (new LocalizationScope(new CultureInfo("en-US"))) { + string title = page.Title; // title is "Welcome" + } + + using (new LocalizationScope(new CultureInfo("es-ES"))) { + string title = page.Title; // title is "Bienvenido" + } + +5. LINQ queries that include localizable properties are transparently translated + + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + var query = from p in session.Query.All() + where p.Title=="Welcome" + select p; + Assert.AreEqual(1, query.Count()); + + Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); + var query = from p in session.Query.All() + where p.Title=="Bienvenido" + select p; + Assert.AreEqual(1, query.Count()); + + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Localization/Xtensive.Orm.Localization.csproj b/Extensions/Xtensive.Orm.Localization/Xtensive.Orm.Localization.csproj index eae10bdfe6..bd3df7fe00 100644 --- a/Extensions/Xtensive.Orm.Localization/Xtensive.Orm.Localization.csproj +++ b/Extensions/Xtensive.Orm.Localization/Xtensive.Orm.Localization.csproj @@ -1,26 +1,26 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Localization - Localization extension for $(DoProductName) - $(Title) - Adds support for easy localization for $(DoProductName)-powered domain models - true - ..\Extensions.snk - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Localization + Localization extension for $(DoProductName) + $(Title) + Adds support for easy localization for $(DoProductName)-powered domain models + true + ..\Extensions.snk + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog.Tests/App.config b/Extensions/Xtensive.Orm.Logging.NLog.Tests/App.config index 041647c58d..8fc984bbd3 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog.Tests/App.config +++ b/Extensions/Xtensive.Orm.Logging.NLog.Tests/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog.Tests/NLog.config b/Extensions/Xtensive.Orm.Logging.NLog.Tests/NLog.config index 3b95f4c6dc..ba21045803 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog.Tests/NLog.config +++ b/Extensions/Xtensive.Orm.Logging.NLog.Tests/NLog.config @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog.Tests/TestFixture.cs b/Extensions/Xtensive.Orm.Logging.NLog.Tests/TestFixture.cs index 659f485533..74427ef96b 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog.Tests/TestFixture.cs +++ b/Extensions/Xtensive.Orm.Logging.NLog.Tests/TestFixture.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2013.12.13 - -using NUnit.Framework; - -namespace Xtensive.Orm.Logging.NLog.Tests -{ - [TestFixture] - public class TestFixture - { - [Test] - public void LogManagerTest() - { - var logManager = LogManager.Default; - logManager.Initialize(new LogProvider()); - var logger = LogManager.Default.GetLog("Xtensive.Orm"); - Assert.IsInstanceOf(logger); - } - } +// Copyright (C) 2003-2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2013.12.13 + +using NUnit.Framework; + +namespace Xtensive.Orm.Logging.NLog.Tests +{ + [TestFixture] + public class TestFixture + { + [Test] + public void LogManagerTest() + { + var logManager = LogManager.Default; + logManager.Initialize(new LogProvider()); + var logger = LogManager.Default.GetLog("Xtensive.Orm"); + Assert.IsInstanceOf(logger); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog.Tests/Xtensive.Orm.Logging.NLog.Tests.csproj b/Extensions/Xtensive.Orm.Logging.NLog.Tests/Xtensive.Orm.Logging.NLog.Tests.csproj index dd76bdbcfe..7321afc217 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog.Tests/Xtensive.Orm.Logging.NLog.Tests.csproj +++ b/Extensions/Xtensive.Orm.Logging.NLog.Tests/Xtensive.Orm.Logging.NLog.Tests.csproj @@ -1,31 +1,31 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - Always - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + Always + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog/Log.cs b/Extensions/Xtensive.Orm.Logging.NLog/Log.cs index 65758c12f4..b331b2e9cb 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog/Log.cs +++ b/Extensions/Xtensive.Orm.Logging.NLog/Log.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2013.12.13 - -using NLog; -using NLogLevel = NLog.LogLevel; -using NLogManager = NLog.LogManager; - -namespace Xtensive.Orm.Logging.NLog -{ - public class Log : BaseLog - { - private readonly Logger target; - - private static NLogLevel ConvertLevel(LogLevel level) - { - switch (level) { - case LogLevel.Debug: - return NLogLevel.Debug; - case LogLevel.Error: - return NLogLevel.Error; - case LogLevel.FatalError: - return NLogLevel.Fatal; - case LogLevel.Warning: - return NLogLevel.Warn; - default: - return NLogLevel.Info; - } - } - - public override bool IsLogged(LogLevel level) - { - return target.IsEnabled(ConvertLevel(level)); - } - - public override void Write(LogEventInfo info) - { - if (info.Exception!=null) - target.Log(ConvertLevel(info.Level), info.Exception, info.FormattedMessage); - else - target.Log(ConvertLevel(info.Level), info.FormattedMessage); - } - - public Log(string name) - { - target = NLogManager.GetLogger(name); - } - } +// Copyright (C) 2003-2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2013.12.13 + +using NLog; +using NLogLevel = NLog.LogLevel; +using NLogManager = NLog.LogManager; + +namespace Xtensive.Orm.Logging.NLog +{ + public class Log : BaseLog + { + private readonly Logger target; + + private static NLogLevel ConvertLevel(LogLevel level) + { + switch (level) { + case LogLevel.Debug: + return NLogLevel.Debug; + case LogLevel.Error: + return NLogLevel.Error; + case LogLevel.FatalError: + return NLogLevel.Fatal; + case LogLevel.Warning: + return NLogLevel.Warn; + default: + return NLogLevel.Info; + } + } + + public override bool IsLogged(LogLevel level) + { + return target.IsEnabled(ConvertLevel(level)); + } + + public override void Write(LogEventInfo info) + { + if (info.Exception!=null) + target.Log(ConvertLevel(info.Level), info.Exception, info.FormattedMessage); + else + target.Log(ConvertLevel(info.Level), info.FormattedMessage); + } + + public Log(string name) + { + target = NLogManager.GetLogger(name); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog/LogProvider.cs b/Extensions/Xtensive.Orm.Logging.NLog/LogProvider.cs index ac33a1b70e..2a44abc2b1 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog/LogProvider.cs +++ b/Extensions/Xtensive.Orm.Logging.NLog/LogProvider.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2013.12.13 - -namespace Xtensive.Orm.Logging.NLog -{ - public class LogProvider : Logging.LogProvider - { - public override BaseLog GetLog(string logName) - { - return new Log(logName); - } - } +// Copyright (C) 2003-2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2013.12.13 + +namespace Xtensive.Orm.Logging.NLog +{ + public class LogProvider : Logging.LogProvider + { + public override BaseLog GetLog(string logName) + { + return new Log(logName); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog/Readme.txt b/Extensions/Xtensive.Orm.Logging.NLog/Readme.txt index b2365bfdb7..1a243baf07 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog/Readme.txt +++ b/Extensions/Xtensive.Orm.Logging.NLog/Readme.txt @@ -1,51 +1,51 @@ -========================= -Xtensive.Orm.Logging.NLog -========================= - -Summary -------- -The extension provides integration points between DataObjects.Net internal logging system and NLog. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later or later (http://dataobjects.net) -NLog 4.5 or later (http://nlog-project.org) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Logging.NLog assembly -2. Set up log provider in Xtensive.Orm configuration section - - - - - - - - - -3. Configure NLog (https://github.com/nlog/nlog/wiki/Tutorial), e.g.: - - - - - - - - - - - - - -You can choose from the following predefined internal loggers: - - "Xtensive.Orm" - - "Xtensive.Orm.Upgrade" - - "Xtensive.Orm.Building" - - "Xtensive.Orm.Core" - - "Xtensive.Orm.Sql" - -References ----------- +========================= +Xtensive.Orm.Logging.NLog +========================= + +Summary +------- +The extension provides integration points between DataObjects.Net internal logging system and NLog. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later or later (http://dataobjects.net) +NLog 4.5 or later (http://nlog-project.org) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Logging.NLog assembly +2. Set up log provider in Xtensive.Orm configuration section + + + + + + + + + +3. Configure NLog (https://github.com/nlog/nlog/wiki/Tutorial), e.g.: + + + + + + + + + + + + + +You can choose from the following predefined internal loggers: + - "Xtensive.Orm" + - "Xtensive.Orm.Upgrade" + - "Xtensive.Orm.Building" + - "Xtensive.Orm.Core" + - "Xtensive.Orm.Sql" + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.NLog/Xtensive.Orm.Logging.NLog.csproj b/Extensions/Xtensive.Orm.Logging.NLog/Xtensive.Orm.Logging.NLog.csproj index 351be572a8..9607dc4d68 100644 --- a/Extensions/Xtensive.Orm.Logging.NLog/Xtensive.Orm.Logging.NLog.csproj +++ b/Extensions/Xtensive.Orm.Logging.NLog/Xtensive.Orm.Logging.NLog.csproj @@ -1,28 +1,28 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Logging.NLog - $(DoProductName) logging provider for NLog - $(Title) - Adds support for logging via NLog for $(DoProductName) - true - ..\Extensions.snk - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Logging.NLog + $(DoProductName) logging provider for NLog + $(Title) + Adds support for logging via NLog for $(DoProductName) + true + ..\Extensions.snk + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.log4net.Tests/App.config b/Extensions/Xtensive.Orm.Logging.log4net.Tests/App.config index 2cdf6f3814..837ae00c6b 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net.Tests/App.config +++ b/Extensions/Xtensive.Orm.Logging.log4net.Tests/App.config @@ -1,21 +1,21 @@ - - - -
-
- - - - - - - - - - - - - - - + + + +
+
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.log4net.Tests/TestFixture.cs b/Extensions/Xtensive.Orm.Logging.log4net.Tests/TestFixture.cs index 69287371f6..1384055f21 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net.Tests/TestFixture.cs +++ b/Extensions/Xtensive.Orm.Logging.log4net.Tests/TestFixture.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.20 - -using NUnit.Framework; - - -namespace Xtensive.Orm.Logging.log4net.Tests -{ - [TestFixture] - public class TestFixture - { - [Test] - public void LogManagerTest() - { - var logManager = LogManager.Default; - logManager.Initialize(new LogProvider()); - var logger = LogManager.Default.GetLog("Xtensive.Orm"); - Assert.IsInstanceOf(logger); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.20 + +using NUnit.Framework; + + +namespace Xtensive.Orm.Logging.log4net.Tests +{ + [TestFixture] + public class TestFixture + { + [Test] + public void LogManagerTest() + { + var logManager = LogManager.Default; + logManager.Initialize(new LogProvider()); + var logger = LogManager.Default.GetLog("Xtensive.Orm"); + Assert.IsInstanceOf(logger); + } + } +} diff --git a/Extensions/Xtensive.Orm.Logging.log4net.Tests/Xtensive.Orm.Logging.log4net.Tests.csproj b/Extensions/Xtensive.Orm.Logging.log4net.Tests/Xtensive.Orm.Logging.log4net.Tests.csproj index aeafb8ccf9..7798fc94ba 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net.Tests/Xtensive.Orm.Logging.log4net.Tests.csproj +++ b/Extensions/Xtensive.Orm.Logging.log4net.Tests/Xtensive.Orm.Logging.log4net.Tests.csproj @@ -1,25 +1,25 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.log4net/Log.cs b/Extensions/Xtensive.Orm.Logging.log4net/Log.cs index 41a15c38c9..4934adb650 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net/Log.cs +++ b/Extensions/Xtensive.Orm.Logging.log4net/Log.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.20 - -using System.Reflection; -using log4net.Core; -using log4netLogManager = log4net.LogManager; -using log4netLog = log4net.ILog; - -namespace Xtensive.Orm.Logging.log4net -{ - public class Log : BaseLog - { - private log4netLog target; - - private Level ConvertLevel(LogLevel level) - { - switch (level) { - case LogLevel.Debug: - return Level.Debug; - case LogLevel.Info: - return Level.Info; - case LogLevel.Warning: - return Level.Warn; - case LogLevel.Error: - return Level.Error; - case LogLevel.FatalError: - return Level.Fatal; - default: - return Level.Info; - } - } - public override bool IsLogged(LogLevel level) - { - return target.Logger.IsEnabledFor(ConvertLevel(level)); - } - - public override void Write(LogEventInfo info) - { - target.Logger.Log(target.Logger.GetType(), ConvertLevel(info.Level), info.FormattedMessage, info.Exception); - } - - public Log(Assembly repositoryAssembly, string name) - { - target = log4netLogManager.GetLogger(repositoryAssembly, name); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.20 + +using System.Reflection; +using log4net.Core; +using log4netLogManager = log4net.LogManager; +using log4netLog = log4net.ILog; + +namespace Xtensive.Orm.Logging.log4net +{ + public class Log : BaseLog + { + private log4netLog target; + + private Level ConvertLevel(LogLevel level) + { + switch (level) { + case LogLevel.Debug: + return Level.Debug; + case LogLevel.Info: + return Level.Info; + case LogLevel.Warning: + return Level.Warn; + case LogLevel.Error: + return Level.Error; + case LogLevel.FatalError: + return Level.Fatal; + default: + return Level.Info; + } + } + public override bool IsLogged(LogLevel level) + { + return target.Logger.IsEnabledFor(ConvertLevel(level)); + } + + public override void Write(LogEventInfo info) + { + target.Logger.Log(target.Logger.GetType(), ConvertLevel(info.Level), info.FormattedMessage, info.Exception); + } + + public Log(Assembly repositoryAssembly, string name) + { + target = log4netLogManager.GetLogger(repositoryAssembly, name); + } + } +} diff --git a/Extensions/Xtensive.Orm.Logging.log4net/LogProvider.cs b/Extensions/Xtensive.Orm.Logging.log4net/LogProvider.cs index df497d10ea..be9ffa0e80 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net/LogProvider.cs +++ b/Extensions/Xtensive.Orm.Logging.log4net/LogProvider.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.20 - -using System.Reflection; -using log4netManager = log4net.LogManager; - -namespace Xtensive.Orm.Logging.log4net -{ - public class LogProvider : Logging.LogProvider - { - public override BaseLog GetLog(string logName) - { - return new Log(Assembly.GetCallingAssembly(), logName); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.20 + +using System.Reflection; +using log4netManager = log4net.LogManager; + +namespace Xtensive.Orm.Logging.log4net +{ + public class LogProvider : Logging.LogProvider + { + public override BaseLog GetLog(string logName) + { + return new Log(Assembly.GetCallingAssembly(), logName); + } + } +} diff --git a/Extensions/Xtensive.Orm.Logging.log4net/Readme.txt b/Extensions/Xtensive.Orm.Logging.log4net/Readme.txt index 5c83c43054..e897bfada6 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net/Readme.txt +++ b/Extensions/Xtensive.Orm.Logging.log4net/Readme.txt @@ -1,66 +1,66 @@ -============================ -Xtensive.Orm.Logging.log4net -============================ - -Summary -------- -The extension provides integration points between DataObjects.Net internal logging system and log4net. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) -log4net 2.0.8 or later (http://logging.apache.org/log4net/) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Logging.log4net assembly -2. Set up log provider in Xtensive.Orm configuration section - - - - - - - - - -3. Configure log4net (http://logging.apache.org/log4net/release/manual/configuration.html), e.g.: - - - - - ... -
- - - - - - - - - - - - - - - - - - - - - - - -You can choose from the following predefined internal loggers: - - "Xtensive.Orm" - - "Xtensive.Orm.Upgrade" - - "Xtensive.Orm.Building" - - "Xtensive.Orm.Core" - - "Xtensive.Orm.Sql" - -References ----------- +============================ +Xtensive.Orm.Logging.log4net +============================ + +Summary +------- +The extension provides integration points between DataObjects.Net internal logging system and log4net. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) +log4net 2.0.8 or later (http://logging.apache.org/log4net/) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Logging.log4net assembly +2. Set up log provider in Xtensive.Orm configuration section + + + + + + + + + +3. Configure log4net (http://logging.apache.org/log4net/release/manual/configuration.html), e.g.: + + + + + ... +
+ + + + + + + + + + + + + + + + + + + + + + + +You can choose from the following predefined internal loggers: + - "Xtensive.Orm" + - "Xtensive.Orm.Upgrade" + - "Xtensive.Orm.Building" + - "Xtensive.Orm.Core" + - "Xtensive.Orm.Sql" + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Logging.log4net/Xtensive.Orm.Logging.log4net.csproj b/Extensions/Xtensive.Orm.Logging.log4net/Xtensive.Orm.Logging.log4net.csproj index 3ad072790e..eb3d1e252a 100644 --- a/Extensions/Xtensive.Orm.Logging.log4net/Xtensive.Orm.Logging.log4net.csproj +++ b/Extensions/Xtensive.Orm.Logging.log4net/Xtensive.Orm.Logging.log4net.csproj @@ -1,28 +1,28 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Logging.log4net - $(DoProductName) logging provider for log4net - $(Title) - Adds support for logging via log4net for $(DoProductName) - true - ..\Extensions.snk - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Logging.log4net + $(DoProductName) logging provider for log4net + $(Title) + Adds support for logging via log4net for $(DoProductName) + true + ..\Extensions.snk + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/App.config b/Extensions/Xtensive.Orm.Reprocessing.Tests/App.config index aac73c6a11..cfe235c4cc 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/App.config +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/App.config @@ -1,11 +1,11 @@ - - - -
-
- - - + + + +
+
+ + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/AutoBuildTest.cs b/Extensions/Xtensive.Orm.Reprocessing.Tests/AutoBuildTest.cs index 2fe811e99f..aff8998f43 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/AutoBuildTest.cs +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/AutoBuildTest.cs @@ -1,28 +1,28 @@ -using NUnit.Framework; -using TestCommon; -using TestCommon.Model; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Reprocessing.Tests -{ - [TestFixture] - public abstract class AutoBuildTest : CommonModelTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (IExecuteActionStrategy).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly); - return configuration; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - var domain = base.BuildDomain(configuration); - if (domain.StorageProviderInfo.Supports(ProviderFeatures.ExclusiveWriterConnection)) - Assert.Ignore("This storage does not support multiple sessions writing to the same database, ignoring"); - return domain; - } - } +using NUnit.Framework; +using TestCommon; +using TestCommon.Model; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Reprocessing.Tests +{ + [TestFixture] + public abstract class AutoBuildTest : CommonModelTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (IExecuteActionStrategy).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly); + return configuration; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + if (domain.StorageProviderInfo.Supports(ProviderFeatures.ExclusiveWriterConnection)) + Assert.Ignore("This storage does not support multiple sessions writing to the same database, ignoring"); + return domain; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/Extensions.cs b/Extensions/Xtensive.Orm.Reprocessing.Tests/Extensions.cs index ab03a9b4aa..3884d22a81 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/Extensions.cs +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/Extensions.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Text; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Services; - -namespace TestCommon.Model -{ - static class Extensions - { - public static void EnsureTransactionIsStarted(this Session session) - { - var accessor = session.Services.Demand(); - DbTransaction notUsed = accessor.Transaction; - } - } -} +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Services; + +namespace TestCommon.Model +{ + static class Extensions + { + public static void EnsureTransactionIsStarted(this Session session) + { + var accessor = session.Services.Demand(); + DbTransaction notUsed = accessor.Transaction; + } + } +} diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Other.cs b/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Other.cs index bca66dbf37..a366a83623 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Other.cs +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Other.cs @@ -1,98 +1,98 @@ -using System.Linq; -using System.Transactions; -using NUnit.Framework; -using TestCommon.Model; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Reprocessing.Configuration; - -namespace Xtensive.Orm.Reprocessing.Tests -{ - public class Other : AutoBuildTest - { - private class TestExecuteStrategy : HandleUniqueConstraintViolationStrategy - { - #region Non-public methods - - protected override bool OnError(ExecuteErrorEventArgs context) - { - return context.Attempt < 2; - } - - #endregion - } - - [Test] - public void ExecuteStrategy() - { - int i = 0; - try { - ReprocessingConfiguration config = Domain.GetReprocessingConfiguration(); - config.DefaultExecuteStrategy = typeof (TestExecuteStrategy); - Domain.Execute( - session => { - new Foo(session) {Name = "test"}; - i++; - if (i < 5) - new Foo(session) {Name = "test"}; - }); - } - catch { - Assert.That(i, Is.EqualTo(2)); - } - } - - [Test] - public void NestedNewSession() - { - Domain.Execute( - session => { - using (Session.Deactivate()) { - Domain.Execute(session2 => Assert.That(session2, Is.Not.SameAs(session))); - } - }); - } - - [Test] - public void NestedSessionReuse() - { - Domain.Execute(session1 => Domain.Execute(session2 => Assert.That(session1, Is.SameAs(session2)))); - } - - [Test] - public void Test() - { - Domain.Execute(session => { - new Foo(session); - }); - Domain.Execute(session => { - session.Query.All().ToArray(); - Domain.WithIsolationLevel(IsolationLevel.Serializable).Execute(session2 => { - session2.Query.All().ToArray(); - }); - }); - } - - [Test] - public void ParentIsDisconnectedState() - { - Domain.Execute(session => - { - new Bar(session); - }); - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using(session.Activate()) - { - var bar = session.Query.All().FirstOrDefault(); - bar=new Bar(session); - session.SaveChanges(); - Domain.Execute(session1 => - { - bar = session1.Query.All().FirstOrDefault(); - bar=new Bar(session1); - }); - session.SaveChanges(); - } - Domain.Execute(session => Assert.That(session.Query.All().Count(), Is.EqualTo(3))); - } - } +using System.Linq; +using System.Transactions; +using NUnit.Framework; +using TestCommon.Model; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Reprocessing.Configuration; + +namespace Xtensive.Orm.Reprocessing.Tests +{ + public class Other : AutoBuildTest + { + private class TestExecuteStrategy : HandleUniqueConstraintViolationStrategy + { + #region Non-public methods + + protected override bool OnError(ExecuteErrorEventArgs context) + { + return context.Attempt < 2; + } + + #endregion + } + + [Test] + public void ExecuteStrategy() + { + int i = 0; + try { + ReprocessingConfiguration config = Domain.GetReprocessingConfiguration(); + config.DefaultExecuteStrategy = typeof (TestExecuteStrategy); + Domain.Execute( + session => { + new Foo(session) {Name = "test"}; + i++; + if (i < 5) + new Foo(session) {Name = "test"}; + }); + } + catch { + Assert.That(i, Is.EqualTo(2)); + } + } + + [Test] + public void NestedNewSession() + { + Domain.Execute( + session => { + using (Session.Deactivate()) { + Domain.Execute(session2 => Assert.That(session2, Is.Not.SameAs(session))); + } + }); + } + + [Test] + public void NestedSessionReuse() + { + Domain.Execute(session1 => Domain.Execute(session2 => Assert.That(session1, Is.SameAs(session2)))); + } + + [Test] + public void Test() + { + Domain.Execute(session => { + new Foo(session); + }); + Domain.Execute(session => { + session.Query.All().ToArray(); + Domain.WithIsolationLevel(IsolationLevel.Serializable).Execute(session2 => { + session2.Query.All().ToArray(); + }); + }); + } + + [Test] + public void ParentIsDisconnectedState() + { + Domain.Execute(session => + { + new Bar(session); + }); + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using(session.Activate()) + { + var bar = session.Query.All().FirstOrDefault(); + bar=new Bar(session); + session.SaveChanges(); + Domain.Execute(session1 => + { + bar = session1.Query.All().FirstOrDefault(); + bar=new Bar(session1); + }); + session.SaveChanges(); + } + Domain.Execute(session => Assert.That(session.Query.All().Count(), Is.EqualTo(3))); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Reprocessing.cs b/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Reprocessing.cs index 135fcd88fc..e0640bdc83 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Reprocessing.cs +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/Tests/Reprocessing.cs @@ -1,356 +1,356 @@ -// ReSharper disable ConvertToConstant.Local -// ReSharper disable ReturnValueOfPureMethodIsNotUsed -// ReSharper disable AccessToModifiedClosure - -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Transactions; -using NUnit.Framework; -using TestCommon.Model; - -namespace Xtensive.Orm.Reprocessing.Tests -{ - public class Reprocessing : AutoBuildTest - { - private int Bar2Count() - { - return Domain.Execute(session => Queryable.Count(session.Query.All())); - } - - private class Context - { - private readonly Domain domain; - public int Count; - private AutoResetEvent wait1 = new AutoResetEvent(false); - private AutoResetEvent wait2 = new AutoResetEvent(false); - - public void Deadlock(bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) - { - domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( - session => { - Interlocked.Increment(ref Count); - new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; - if (first) { - session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - if (wait1!=null) { - wait1.Set(); - wait2.WaitOne(); - wait1 = null; - } - session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - } - else { - session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - if (wait2!=null) { - wait2.Set(); - wait1.WaitOne(); - wait2 = null; - } - session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - } - }); - } - - public void External( - bool first, - IsolationLevel? isolationLevel, - TransactionOpenMode? transactionOpenMode, - Action action) - { - using (Session session = domain.OpenSession()) - using (Xtensive.Orm.TransactionScope tran = isolationLevel==null ? null : session.OpenTransaction()) - using (session.Activate()) { - if (tran!=null) { - session.EnsureTransactionIsStarted(); - new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; - } - if (first) { - if (wait1!=null && wait2!=null) { - wait1.Set(); - wait2.WaitOne(); - } - } - else if (wait1!=null && wait2!=null) { - wait2.Set(); - wait1.WaitOne(); - } - action(first, isolationLevel, transactionOpenMode); - if (tran!=null) - tran.Complete(); - } - } - - public void Parent( - bool first, - IsolationLevel? isolationLevel, - TransactionOpenMode? transactionOpenMode, - IExecuteActionStrategy strategy, - Action action) - { - domain.WithStrategy(strategy).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( - session => { - session.EnsureTransactionIsStarted(); - new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; - if (first) { - if (wait1!=null && wait2!=null) { - wait1.Set(); - wait2.WaitOne(); - } - } - else if (wait1!=null && wait2!=null) { - wait2.Set(); - wait1.WaitOne(); - } - action(first, isolationLevel, transactionOpenMode); - }); - } - - public void Run( - IsolationLevel? isolationLevel, - TransactionOpenMode? transactionOpenMode, - Action action) - { - domain.Execute( - session => { - session.Remove(session.Query.All()); - session.Remove(session.Query.All()); - session.Remove(session.Query.All()); - new Bar(session); - new Foo(session); - }); - Parallel.Invoke( - () => action(true, isolationLevel, transactionOpenMode), - () => action(false, isolationLevel, transactionOpenMode)); - } - - public void UniqueConstraintViolation( - bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) - { - domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( - session => { - Interlocked.Increment(ref Count); - session.EnsureTransactionIsStarted(); - new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; - string name = "test"; - if (!session.Query.All().Any(a => a.Name==name)) { - if (first) { - if (wait1!=null && wait2!=null) { - wait1.Set(); - wait2.WaitOne(); - wait1 = null; - } - } - else if (wait2!=null && wait2!=null) { - wait2.Set(); - wait1.WaitOne(); - wait2 = null; - } - new Foo(session) {Name = name}; - } - session.SaveChanges(); - }); - } - - public void UniqueConstraintViolationPrimaryKey( - bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) - { - domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( - session => { - Interlocked.Increment(ref Count); - session.EnsureTransactionIsStarted(); - new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; - int id = 10; - if (session.Query.SingleOrDefault(id)==null) { - AutoResetEvent w1 = wait1; - AutoResetEvent w2 = wait2; - if (first) { - if (w1!=null && w2!=null) { - w1.Set(); - w2.WaitOne(); - wait1 = null; - } - } - else if (w1!=null && w2!=null) { - w2.Set(); - w1.WaitOne(); - wait2 = null; - } - new Foo(session, id) {Name = Guid.NewGuid().ToString()}; - } - session.SaveChanges(); - }); - } - - public Context(Domain domain) - { - this.domain = domain; - } - } - - [Test] - public void Test() - { - var context = new Context(Domain); - context.Run(null, null, context.UniqueConstraintViolation); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(2)); - - context = new Context(Domain); - context.Run(IsolationLevel.Serializable, null, context.Deadlock); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(2)); - - - //nested serializable deadlock - context = new Context(Domain); - context.Run( - IsolationLevel.Serializable, - null, - (b, level, open) => context.Parent(b, level, open, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock)); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - - //nested snapshot deadlock - context = new Context(Domain); - context.Run( - IsolationLevel.Snapshot, - null, - (b, level, open) => context.Parent(b, level, open, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock)); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - - //nested nested serializable deadlock - context = new Context(Domain); - context.Run( - IsolationLevel.Serializable, - null, - (b, level, open) => - context.Parent( - b, - level, - open, - ExecuteActionStrategy.HandleReprocessableException, - (b1, level1, open1) => - context.Parent(b1, level1, open1, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock))); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(6)); - - //nested snapshot UniqueConstraint PrimaryKey - context = new Context(Domain); - context.Run( - IsolationLevel.Snapshot, - null, - (b, level, open) => - context.Parent( - b, level, open, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolationPrimaryKey)); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - - //nested snapshot UniqueConstraint UniqueIndex - context = new Context(Domain); - context.Run( - IsolationLevel.Snapshot, - null, - (b, level, open) => - context.Parent( - b, level, null, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolation)); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - - //ExternalWithoutTransaction nested snapshot UniqueConstraint - context = new Context(Domain); - context.Run( - IsolationLevel.Snapshot, - null, - (b, level, open) => - context.External( - b, - null, - open, - (b1, level1, open1) => - context.Parent( - b1, - IsolationLevel.Snapshot, - open1, - ExecuteActionStrategy.HandleUniqueConstraintViolation, - context.UniqueConstraintViolation))); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - - //ExternalWithTransaction nested snapshot UniqueConstraint - context = new Context(Domain); - var ex = - Assert.Throws( - () => - context.Run( - IsolationLevel.Snapshot, - null, - (b, level, open) => - context.External( - b, - level, - open, - (b1, level1, open1) => - context.Parent( - b1, - level1, - open1, - ExecuteActionStrategy.HandleUniqueConstraintViolation, - context.UniqueConstraintViolation)))); - Assert.That( - ex.InnerExceptions.Single(), - Is.TypeOf().Or.TypeOf().With.Property("InnerException").TypeOf - ()); - Assert.That(context.Count, Is.EqualTo(2)); - Assert.That(Bar2Count(), Is.EqualTo(3)); - - //nested UniqueConstraint with auto transaction - context = new Context(Domain); - context.Run( - IsolationLevel.ReadUncommitted, - TransactionOpenMode.Auto, - (b, l, o) => - context.Parent(b, l, o, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolation)); - Assert.That(context.Count, Is.EqualTo(3)); - Assert.That(Bar2Count(), Is.EqualTo(4)); - } - - [Test] - public void UniqueConstraintViolationExceptionPrimary() - { - int i = 0; - Domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).Execute( - session => { - new Foo(session, i); - i++; - if (i < 5) - new Foo(session, i); - } - ); - Assert.That(i, Is.EqualTo(5)); - } - - [Test] - public void UniqueConstraintViolationExceptionUnique() - { - int i = 0; - bool b = false; - ExecuteActionStrategy.HandleUniqueConstraintViolation.Error += (sender, args) => b = true; - Domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).Execute( - session => { - new Foo(session) {Name = "test"}; - i++; - if (i < 5) - new Foo(session) {Name = "test"}; - }); - Assert.That(i, Is.EqualTo(5)); - Assert.That(b, Is.True); - } - } -} - -// ReSharper restore ReturnValueOfPureMethodIsNotUsed -// ReSharper restore ConvertToConstant.Local +// ReSharper disable ConvertToConstant.Local +// ReSharper disable ReturnValueOfPureMethodIsNotUsed +// ReSharper disable AccessToModifiedClosure + +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Transactions; +using NUnit.Framework; +using TestCommon.Model; + +namespace Xtensive.Orm.Reprocessing.Tests +{ + public class Reprocessing : AutoBuildTest + { + private int Bar2Count() + { + return Domain.Execute(session => Queryable.Count(session.Query.All())); + } + + private class Context + { + private readonly Domain domain; + public int Count; + private AutoResetEvent wait1 = new AutoResetEvent(false); + private AutoResetEvent wait2 = new AutoResetEvent(false); + + public void Deadlock(bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) + { + domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( + session => { + Interlocked.Increment(ref Count); + new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; + if (first) { + session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + if (wait1!=null) { + wait1.Set(); + wait2.WaitOne(); + wait1 = null; + } + session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + } + else { + session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + if (wait2!=null) { + wait2.Set(); + wait1.WaitOne(); + wait2 = null; + } + session.Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + } + }); + } + + public void External( + bool first, + IsolationLevel? isolationLevel, + TransactionOpenMode? transactionOpenMode, + Action action) + { + using (Session session = domain.OpenSession()) + using (Xtensive.Orm.TransactionScope tran = isolationLevel==null ? null : session.OpenTransaction()) + using (session.Activate()) { + if (tran!=null) { + session.EnsureTransactionIsStarted(); + new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; + } + if (first) { + if (wait1!=null && wait2!=null) { + wait1.Set(); + wait2.WaitOne(); + } + } + else if (wait1!=null && wait2!=null) { + wait2.Set(); + wait1.WaitOne(); + } + action(first, isolationLevel, transactionOpenMode); + if (tran!=null) + tran.Complete(); + } + } + + public void Parent( + bool first, + IsolationLevel? isolationLevel, + TransactionOpenMode? transactionOpenMode, + IExecuteActionStrategy strategy, + Action action) + { + domain.WithStrategy(strategy).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( + session => { + session.EnsureTransactionIsStarted(); + new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; + if (first) { + if (wait1!=null && wait2!=null) { + wait1.Set(); + wait2.WaitOne(); + } + } + else if (wait1!=null && wait2!=null) { + wait2.Set(); + wait1.WaitOne(); + } + action(first, isolationLevel, transactionOpenMode); + }); + } + + public void Run( + IsolationLevel? isolationLevel, + TransactionOpenMode? transactionOpenMode, + Action action) + { + domain.Execute( + session => { + session.Remove(session.Query.All()); + session.Remove(session.Query.All()); + session.Remove(session.Query.All()); + new Bar(session); + new Foo(session); + }); + Parallel.Invoke( + () => action(true, isolationLevel, transactionOpenMode), + () => action(false, isolationLevel, transactionOpenMode)); + } + + public void UniqueConstraintViolation( + bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) + { + domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( + session => { + Interlocked.Increment(ref Count); + session.EnsureTransactionIsStarted(); + new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; + string name = "test"; + if (!session.Query.All().Any(a => a.Name==name)) { + if (first) { + if (wait1!=null && wait2!=null) { + wait1.Set(); + wait2.WaitOne(); + wait1 = null; + } + } + else if (wait2!=null && wait2!=null) { + wait2.Set(); + wait1.WaitOne(); + wait2 = null; + } + new Foo(session) {Name = name}; + } + session.SaveChanges(); + }); + } + + public void UniqueConstraintViolationPrimaryKey( + bool first, IsolationLevel? isolationLevel, TransactionOpenMode? transactionOpenMode) + { + domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).WithIsolationLevel(isolationLevel.GetValueOrDefault(IsolationLevel.RepeatableRead)).WithTransactionOpenMode(transactionOpenMode.GetValueOrDefault(TransactionOpenMode.New)).Execute( + session => { + Interlocked.Increment(ref Count); + session.EnsureTransactionIsStarted(); + new Bar2(session, DateTime.Now, Guid.NewGuid()) {Name = Guid.NewGuid().ToString()}; + int id = 10; + if (session.Query.SingleOrDefault(id)==null) { + AutoResetEvent w1 = wait1; + AutoResetEvent w2 = wait2; + if (first) { + if (w1!=null && w2!=null) { + w1.Set(); + w2.WaitOne(); + wait1 = null; + } + } + else if (w1!=null && w2!=null) { + w2.Set(); + w1.WaitOne(); + wait2 = null; + } + new Foo(session, id) {Name = Guid.NewGuid().ToString()}; + } + session.SaveChanges(); + }); + } + + public Context(Domain domain) + { + this.domain = domain; + } + } + + [Test] + public void Test() + { + var context = new Context(Domain); + context.Run(null, null, context.UniqueConstraintViolation); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(2)); + + context = new Context(Domain); + context.Run(IsolationLevel.Serializable, null, context.Deadlock); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(2)); + + + //nested serializable deadlock + context = new Context(Domain); + context.Run( + IsolationLevel.Serializable, + null, + (b, level, open) => context.Parent(b, level, open, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock)); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + + //nested snapshot deadlock + context = new Context(Domain); + context.Run( + IsolationLevel.Snapshot, + null, + (b, level, open) => context.Parent(b, level, open, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock)); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + + //nested nested serializable deadlock + context = new Context(Domain); + context.Run( + IsolationLevel.Serializable, + null, + (b, level, open) => + context.Parent( + b, + level, + open, + ExecuteActionStrategy.HandleReprocessableException, + (b1, level1, open1) => + context.Parent(b1, level1, open1, ExecuteActionStrategy.HandleReprocessableException, context.Deadlock))); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(6)); + + //nested snapshot UniqueConstraint PrimaryKey + context = new Context(Domain); + context.Run( + IsolationLevel.Snapshot, + null, + (b, level, open) => + context.Parent( + b, level, open, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolationPrimaryKey)); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + + //nested snapshot UniqueConstraint UniqueIndex + context = new Context(Domain); + context.Run( + IsolationLevel.Snapshot, + null, + (b, level, open) => + context.Parent( + b, level, null, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolation)); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + + //ExternalWithoutTransaction nested snapshot UniqueConstraint + context = new Context(Domain); + context.Run( + IsolationLevel.Snapshot, + null, + (b, level, open) => + context.External( + b, + null, + open, + (b1, level1, open1) => + context.Parent( + b1, + IsolationLevel.Snapshot, + open1, + ExecuteActionStrategy.HandleUniqueConstraintViolation, + context.UniqueConstraintViolation))); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + + //ExternalWithTransaction nested snapshot UniqueConstraint + context = new Context(Domain); + var ex = + Assert.Throws( + () => + context.Run( + IsolationLevel.Snapshot, + null, + (b, level, open) => + context.External( + b, + level, + open, + (b1, level1, open1) => + context.Parent( + b1, + level1, + open1, + ExecuteActionStrategy.HandleUniqueConstraintViolation, + context.UniqueConstraintViolation)))); + Assert.That( + ex.InnerExceptions.Single(), + Is.TypeOf().Or.TypeOf().With.Property("InnerException").TypeOf + ()); + Assert.That(context.Count, Is.EqualTo(2)); + Assert.That(Bar2Count(), Is.EqualTo(3)); + + //nested UniqueConstraint with auto transaction + context = new Context(Domain); + context.Run( + IsolationLevel.ReadUncommitted, + TransactionOpenMode.Auto, + (b, l, o) => + context.Parent(b, l, o, ExecuteActionStrategy.HandleUniqueConstraintViolation, context.UniqueConstraintViolation)); + Assert.That(context.Count, Is.EqualTo(3)); + Assert.That(Bar2Count(), Is.EqualTo(4)); + } + + [Test] + public void UniqueConstraintViolationExceptionPrimary() + { + int i = 0; + Domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).Execute( + session => { + new Foo(session, i); + i++; + if (i < 5) + new Foo(session, i); + } + ); + Assert.That(i, Is.EqualTo(5)); + } + + [Test] + public void UniqueConstraintViolationExceptionUnique() + { + int i = 0; + bool b = false; + ExecuteActionStrategy.HandleUniqueConstraintViolation.Error += (sender, args) => b = true; + Domain.WithStrategy(ExecuteActionStrategy.HandleUniqueConstraintViolation).Execute( + session => { + new Foo(session) {Name = "test"}; + i++; + if (i < 5) + new Foo(session) {Name = "test"}; + }); + Assert.That(i, Is.EqualTo(5)); + Assert.That(b, Is.True); + } + } +} + +// ReSharper restore ReturnValueOfPureMethodIsNotUsed +// ReSharper restore ConvertToConstant.Local // ReSharper restore AccessToModifiedClosure \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing.Tests/Xtensive.Orm.Reprocessing.Tests.csproj b/Extensions/Xtensive.Orm.Reprocessing.Tests/Xtensive.Orm.Reprocessing.Tests.csproj index d87178bb25..0819158e90 100644 --- a/Extensions/Xtensive.Orm.Reprocessing.Tests/Xtensive.Orm.Reprocessing.Tests.csproj +++ b/Extensions/Xtensive.Orm.Reprocessing.Tests/Xtensive.Orm.Reprocessing.Tests.csproj @@ -1,26 +1,26 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/Configuration/ConfigurationSection.cs b/Extensions/Xtensive.Orm.Reprocessing/Configuration/ConfigurationSection.cs index e433ce31df..d93d13802c 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Configuration/ConfigurationSection.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/Configuration/ConfigurationSection.cs @@ -1,37 +1,37 @@ -using System; -using System.ComponentModel; -using System.Configuration; - -namespace Xtensive.Orm.Reprocessing.Configuration -{ - /// - /// A root element of reprocessing configuration section within a configuration file. - /// - public class ConfigurationSection : System.Configuration.ConfigurationSection - { - /// - /// Gets default section name for reprocessing configuration. - /// Value is "Xtensive.Reprocessing". - /// - public static readonly string DefaultSectionName = "Xtensive.Orm.Reprocessing"; - - /// - /// Gets or sets default transaction open mode. - /// - [ConfigurationProperty("defaultTransactionOpenMode", DefaultValue = TransactionOpenMode.New)] - public TransactionOpenMode DefaultTransactionOpenMode - { - get { return (TransactionOpenMode) this["defaultTransactionOpenMode"]; } - } - - /// - /// Gets or sets default execute strategy - /// - [ConfigurationProperty("defaultExecuteStrategy", DefaultValue = typeof (HandleReprocessableExceptionStrategy))] - [TypeConverter(typeof (TypeNameConverter))] - public Type DefaultExecuteStrategy - { - get { return (Type) this["defaultExecuteStrategy"]; } - } - } +using System; +using System.ComponentModel; +using System.Configuration; + +namespace Xtensive.Orm.Reprocessing.Configuration +{ + /// + /// A root element of reprocessing configuration section within a configuration file. + /// + public class ConfigurationSection : System.Configuration.ConfigurationSection + { + /// + /// Gets default section name for reprocessing configuration. + /// Value is "Xtensive.Reprocessing". + /// + public static readonly string DefaultSectionName = "Xtensive.Orm.Reprocessing"; + + /// + /// Gets or sets default transaction open mode. + /// + [ConfigurationProperty("defaultTransactionOpenMode", DefaultValue = TransactionOpenMode.New)] + public TransactionOpenMode DefaultTransactionOpenMode + { + get { return (TransactionOpenMode) this["defaultTransactionOpenMode"]; } + } + + /// + /// Gets or sets default execute strategy + /// + [ConfigurationProperty("defaultExecuteStrategy", DefaultValue = typeof (HandleReprocessableExceptionStrategy))] + [TypeConverter(typeof (TypeNameConverter))] + public Type DefaultExecuteStrategy + { + get { return (Type) this["defaultExecuteStrategy"]; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/Configuration/ReprocessingConfiguration.cs b/Extensions/Xtensive.Orm.Reprocessing/Configuration/ReprocessingConfiguration.cs index 0fe9646c87..12b6ec5612 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Configuration/ReprocessingConfiguration.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/Configuration/ReprocessingConfiguration.cs @@ -1,93 +1,93 @@ -using System; -using System.Configuration; -using Xtensive.Core; - -namespace Xtensive.Orm.Reprocessing.Configuration -{ - /// - /// The configuration of the reprocessing system. - /// - public class ReprocessingConfiguration - { - /// - /// Gets default value of the property. - /// - public static readonly TransactionOpenMode DefaultDefaultTransactionOpenMode = TransactionOpenMode.New; - - /// - /// Gets default value of the property. - /// - public static readonly Type DefaultDefaultExecuteStrategy = typeof (HandleReprocessableExceptionStrategy); - - /// - /// Gets or sets default value of the parameter. - /// - public TransactionOpenMode DefaultTransactionOpenMode { get; set; } - - /// - /// Gets or sets default value of the parameter. - /// - public Type DefaultExecuteStrategy { get; set; } - - /// - /// Loads the reprocessing configuration from default section in application configuration file. - /// - /// The reprocessing configuration. - public static ReprocessingConfiguration Load() - { - return Load(ConfigurationSection.DefaultSectionName); - } - - /// - /// Loads the reprocessing configuration from sectionName section in application configuration file. - /// - /// Name of the section. - /// The reprocessing configuration. - public static ReprocessingConfiguration Load(string sectionName) - { - var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); - return GetConfigurationFromSection(section); - } - - /// - /// /// Loads the reprocessing configuration from default sectionName section in given configuration. - /// - /// The configuration to load from. - /// The reprocessing configuration. - public static ReprocessingConfiguration Load(System.Configuration.Configuration configuration) - { - return Load(configuration, ConfigurationSection.DefaultSectionName); - } - - /// - /// /// Loads the reprocessing configuration from section in given configuration file. - /// - /// The configuration to load from. - /// The section to load from. - /// The reprocessing configuration. - public static ReprocessingConfiguration Load(System.Configuration.Configuration configuration, string sectionName) - { - var section = (ConfigurationSection) configuration.GetSection(sectionName); - return GetConfigurationFromSection(section); - } - - private static ReprocessingConfiguration GetConfigurationFromSection(ConfigurationSection section) - { - return section==null - ? new ReprocessingConfiguration() - : new ReprocessingConfiguration { - DefaultExecuteStrategy = section.DefaultExecuteStrategy, - DefaultTransactionOpenMode = section.DefaultTransactionOpenMode - }; - } - - /// - /// Initializes a new instance of the class. - /// - public ReprocessingConfiguration() - { - DefaultExecuteStrategy = DefaultDefaultExecuteStrategy; - DefaultTransactionOpenMode = DefaultDefaultTransactionOpenMode; - } - } +using System; +using System.Configuration; +using Xtensive.Core; + +namespace Xtensive.Orm.Reprocessing.Configuration +{ + /// + /// The configuration of the reprocessing system. + /// + public class ReprocessingConfiguration + { + /// + /// Gets default value of the property. + /// + public static readonly TransactionOpenMode DefaultDefaultTransactionOpenMode = TransactionOpenMode.New; + + /// + /// Gets default value of the property. + /// + public static readonly Type DefaultDefaultExecuteStrategy = typeof (HandleReprocessableExceptionStrategy); + + /// + /// Gets or sets default value of the parameter. + /// + public TransactionOpenMode DefaultTransactionOpenMode { get; set; } + + /// + /// Gets or sets default value of the parameter. + /// + public Type DefaultExecuteStrategy { get; set; } + + /// + /// Loads the reprocessing configuration from default section in application configuration file. + /// + /// The reprocessing configuration. + public static ReprocessingConfiguration Load() + { + return Load(ConfigurationSection.DefaultSectionName); + } + + /// + /// Loads the reprocessing configuration from sectionName section in application configuration file. + /// + /// Name of the section. + /// The reprocessing configuration. + public static ReprocessingConfiguration Load(string sectionName) + { + var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); + return GetConfigurationFromSection(section); + } + + /// + /// /// Loads the reprocessing configuration from default sectionName section in given configuration. + /// + /// The configuration to load from. + /// The reprocessing configuration. + public static ReprocessingConfiguration Load(System.Configuration.Configuration configuration) + { + return Load(configuration, ConfigurationSection.DefaultSectionName); + } + + /// + /// /// Loads the reprocessing configuration from section in given configuration file. + /// + /// The configuration to load from. + /// The section to load from. + /// The reprocessing configuration. + public static ReprocessingConfiguration Load(System.Configuration.Configuration configuration, string sectionName) + { + var section = (ConfigurationSection) configuration.GetSection(sectionName); + return GetConfigurationFromSection(section); + } + + private static ReprocessingConfiguration GetConfigurationFromSection(ConfigurationSection section) + { + return section==null + ? new ReprocessingConfiguration() + : new ReprocessingConfiguration { + DefaultExecuteStrategy = section.DefaultExecuteStrategy, + DefaultTransactionOpenMode = section.DefaultTransactionOpenMode + }; + } + + /// + /// Initializes a new instance of the class. + /// + public ReprocessingConfiguration() + { + DefaultExecuteStrategy = DefaultDefaultExecuteStrategy; + DefaultTransactionOpenMode = DefaultDefaultTransactionOpenMode; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/DomainBuildErrorEventArgs.cs b/Extensions/Xtensive.Orm.Reprocessing/DomainBuildErrorEventArgs.cs index 3ef7dcd54d..fe36287ecd 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/DomainBuildErrorEventArgs.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/DomainBuildErrorEventArgs.cs @@ -1,30 +1,30 @@ -using System; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Contains event data. - /// - public class DomainBuildErrorEventArgs : EventArgs - { - /// - /// Initializes a new instance of the class. - /// - /// The exception. - /// The attempt number. - public DomainBuildErrorEventArgs(Exception exception, int attempt) - { - Exception = exception; - Attempt = attempt; - } - - /// - /// Gets the exception. - /// - public Exception Exception { get; private set; } - /// - /// Gets the attempt number. - /// - public int Attempt { get; private set; } - } -} +using System; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Contains event data. + /// + public class DomainBuildErrorEventArgs : EventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// The exception. + /// The attempt number. + public DomainBuildErrorEventArgs(Exception exception, int attempt) + { + Exception = exception; + Attempt = attempt; + } + + /// + /// Gets the exception. + /// + public Exception Exception { get; private set; } + /// + /// Gets the attempt number. + /// + public int Attempt { get; private set; } + } +} diff --git a/Extensions/Xtensive.Orm.Reprocessing/DomainBuilder.cs b/Extensions/Xtensive.Orm.Reprocessing/DomainBuilder.cs index 04ee218917..db59efe07a 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/DomainBuilder.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/DomainBuilder.cs @@ -1,35 +1,35 @@ -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Domain builder without reprocessing. - /// - public class DomainBuilder - { - /// - /// Builds the domain with specified config. - /// - /// The config. - /// The domain. - public virtual Domain Build(DomainConfiguration config) - { - try - { - var domain = Domain.Build(config); - return domain; - } - catch (InvalidOperationException e) - { - var ex = e.InnerException as ReflectionTypeLoadException; - if (ex != null) - throw new InvalidOperationException( - string.Join("\r\n", ex.LoaderExceptions.Select(a => a.Message)), ex); - throw; - } - } - } +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Domain builder without reprocessing. + /// + public class DomainBuilder + { + /// + /// Builds the domain with specified config. + /// + /// The config. + /// The domain. + public virtual Domain Build(DomainConfiguration config) + { + try + { + var domain = Domain.Build(config); + return domain; + } + catch (InvalidOperationException e) + { + var ex = e.InnerException as ReflectionTypeLoadException; + if (ex != null) + throw new InvalidOperationException( + string.Join("\r\n", ex.LoaderExceptions.Select(a => a.Message)), ex); + throw; + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/DomainExtensions.cs b/Extensions/Xtensive.Orm.Reprocessing/DomainExtensions.cs index 4c43d7443e..e4ea44a7de 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/DomainExtensions.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/DomainExtensions.cs @@ -1,171 +1,171 @@ -using System; -using System.Transactions; -using Xtensive.Orm.Reprocessing.Configuration; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Extends . - /// - public static class DomainExtensions - { - /// - /// Executes a reprocessable task. - /// - /// The domain of the task. - /// Isolation level of the task. - /// Transaction open mode of the task. - /// Execute strategy of the task. - /// Task with result. - public static void Execute( - this Domain domain, - Action action, - IExecuteActionStrategy strategy = null, - IsolationLevel isolationLevel = IsolationLevel.Unspecified, - TransactionOpenMode? transactionOpenMode = null) - { - ExecuteInternal(domain, isolationLevel, transactionOpenMode, strategy, action); - } - - /// - /// Executes a reprocessable task. - /// - /// The domain of the task. - /// Isolation level of the task. - /// Transaction open mode of the task. - /// Execute strategy of the task. - /// Task with T result. - /// Return type of the task. - /// The task result. - public static T Execute( - this Domain domain, - Func func, - IExecuteActionStrategy strategy = null, - IsolationLevel isolationLevel = IsolationLevel.Unspecified, - TransactionOpenMode? transactionOpenMode = null) - { - return ExecuteInternal(domain, isolationLevel, transactionOpenMode, strategy, func); - } - - /// - /// Gets the reprocessing configuration. - /// - /// The domain. - /// The reprocessing configuration. - public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain) - { - var result = domain.Extensions.Get(); - if (result==null) { - result = ReprocessingConfiguration.Load(); - domain.Extensions.Set(result); - } - return result; - } - - /// - /// Gets the reprocessing configuration from given . - /// - /// The domain. - /// - /// The reprocessing configuration. - public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain, System.Configuration.Configuration configuration) - { - var result = domain.Extensions.Get(); - if (result==null) { - result = ReprocessingConfiguration.Load(configuration); - domain.Extensions.Set(result); - } - return result; - } - - /// - /// Gets the reprocessing configuration from given and . - /// - /// The domain. - /// Non-default application configuration. - /// Non-default section. - /// The reprocessing configuration. - public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain, System.Configuration.Configuration configuration, string sectionName) - { - var result = domain.Extensions.Get(); - if (result==null) { - result = ReprocessingConfiguration.Load(configuration, sectionName); - domain.Extensions.Set(result); - } - return result; - } - - /// - /// Starts flow - /// and provides to use. - /// - /// The domain. - /// Isolation level to use. - /// Created . - public static IExecuteConfiguration WithIsolationLevel(this Domain domain, IsolationLevel isolationLevel) - { - return new ExecuteConfiguration(domain).WithIsolationLevel(isolationLevel); - } - - /// - /// Starts flow - /// and provides to use. - /// - /// The domain. - /// Strategy to use. - /// Created . - public static IExecuteConfiguration WithStrategy(this Domain domain, IExecuteActionStrategy strategy) - { - return new ExecuteConfiguration(domain).WithStrategy(strategy); - } - - /// - /// Starts flow - /// and provides to use. - /// - /// The domain. - /// Transaction open mode to use. - /// Created . - public static IExecuteConfiguration WithTransactionOpenMode(this Domain domain, TransactionOpenMode transactionOpenMode) - { - return new ExecuteConfiguration(domain).WithTransactionOpenMode(transactionOpenMode); - } - - #region Non-public methods - - internal static void ExecuteInternal( - this Domain domain, - IsolationLevel isolationLevel, - TransactionOpenMode? transactionOpenMode, - IExecuteActionStrategy strategy, - Action action) - { - ExecuteInternal( - domain, - isolationLevel, - transactionOpenMode, - strategy, - a => { - action(a); - return null; - }); - } - - internal static T ExecuteInternal( - this Domain domain, - IsolationLevel isolationLevel, - TransactionOpenMode? transactionOpenMode, - IExecuteActionStrategy strategy, - Func func) - { - ReprocessingConfiguration config = domain.GetReprocessingConfiguration(); - if (strategy==null) - strategy = ExecuteActionStrategy.GetSingleton(config.DefaultExecuteStrategy); - if (transactionOpenMode==null) - transactionOpenMode = config.DefaultTransactionOpenMode; - return strategy.Execute(new ExecutionContext(domain, isolationLevel, transactionOpenMode.Value, func)); - } - - #endregion - } +using System; +using System.Transactions; +using Xtensive.Orm.Reprocessing.Configuration; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Extends . + /// + public static class DomainExtensions + { + /// + /// Executes a reprocessable task. + /// + /// The domain of the task. + /// Isolation level of the task. + /// Transaction open mode of the task. + /// Execute strategy of the task. + /// Task with result. + public static void Execute( + this Domain domain, + Action action, + IExecuteActionStrategy strategy = null, + IsolationLevel isolationLevel = IsolationLevel.Unspecified, + TransactionOpenMode? transactionOpenMode = null) + { + ExecuteInternal(domain, isolationLevel, transactionOpenMode, strategy, action); + } + + /// + /// Executes a reprocessable task. + /// + /// The domain of the task. + /// Isolation level of the task. + /// Transaction open mode of the task. + /// Execute strategy of the task. + /// Task with T result. + /// Return type of the task. + /// The task result. + public static T Execute( + this Domain domain, + Func func, + IExecuteActionStrategy strategy = null, + IsolationLevel isolationLevel = IsolationLevel.Unspecified, + TransactionOpenMode? transactionOpenMode = null) + { + return ExecuteInternal(domain, isolationLevel, transactionOpenMode, strategy, func); + } + + /// + /// Gets the reprocessing configuration. + /// + /// The domain. + /// The reprocessing configuration. + public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain) + { + var result = domain.Extensions.Get(); + if (result==null) { + result = ReprocessingConfiguration.Load(); + domain.Extensions.Set(result); + } + return result; + } + + /// + /// Gets the reprocessing configuration from given . + /// + /// The domain. + /// + /// The reprocessing configuration. + public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain, System.Configuration.Configuration configuration) + { + var result = domain.Extensions.Get(); + if (result==null) { + result = ReprocessingConfiguration.Load(configuration); + domain.Extensions.Set(result); + } + return result; + } + + /// + /// Gets the reprocessing configuration from given and . + /// + /// The domain. + /// Non-default application configuration. + /// Non-default section. + /// The reprocessing configuration. + public static ReprocessingConfiguration GetReprocessingConfiguration(this Domain domain, System.Configuration.Configuration configuration, string sectionName) + { + var result = domain.Extensions.Get(); + if (result==null) { + result = ReprocessingConfiguration.Load(configuration, sectionName); + domain.Extensions.Set(result); + } + return result; + } + + /// + /// Starts flow + /// and provides to use. + /// + /// The domain. + /// Isolation level to use. + /// Created . + public static IExecuteConfiguration WithIsolationLevel(this Domain domain, IsolationLevel isolationLevel) + { + return new ExecuteConfiguration(domain).WithIsolationLevel(isolationLevel); + } + + /// + /// Starts flow + /// and provides to use. + /// + /// The domain. + /// Strategy to use. + /// Created . + public static IExecuteConfiguration WithStrategy(this Domain domain, IExecuteActionStrategy strategy) + { + return new ExecuteConfiguration(domain).WithStrategy(strategy); + } + + /// + /// Starts flow + /// and provides to use. + /// + /// The domain. + /// Transaction open mode to use. + /// Created . + public static IExecuteConfiguration WithTransactionOpenMode(this Domain domain, TransactionOpenMode transactionOpenMode) + { + return new ExecuteConfiguration(domain).WithTransactionOpenMode(transactionOpenMode); + } + + #region Non-public methods + + internal static void ExecuteInternal( + this Domain domain, + IsolationLevel isolationLevel, + TransactionOpenMode? transactionOpenMode, + IExecuteActionStrategy strategy, + Action action) + { + ExecuteInternal( + domain, + isolationLevel, + transactionOpenMode, + strategy, + a => { + action(a); + return null; + }); + } + + internal static T ExecuteInternal( + this Domain domain, + IsolationLevel isolationLevel, + TransactionOpenMode? transactionOpenMode, + IExecuteActionStrategy strategy, + Func func) + { + ReprocessingConfiguration config = domain.GetReprocessingConfiguration(); + if (strategy==null) + strategy = ExecuteActionStrategy.GetSingleton(config.DefaultExecuteStrategy); + if (transactionOpenMode==null) + transactionOpenMode = config.DefaultTransactionOpenMode; + return strategy.Execute(new ExecutionContext(domain, isolationLevel, transactionOpenMode.Value, func)); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/ExecuteActionStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/ExecuteActionStrategy.cs index 068f01cf36..18b2124c82 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/ExecuteActionStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/ExecuteActionStrategy.cs @@ -1,183 +1,183 @@ -using System; -using System.Collections.Concurrent; -using System.Transactions; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using SystemTransaction = System.Transactions.Transaction; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Base class for the standard execute action strategies. - /// - public abstract class ExecuteActionStrategy : IExecuteActionStrategy - { - private static readonly ConcurrentDictionary Singletons = - new ConcurrentDictionary(); - - /// - /// Gets singleton of the . - /// - public static readonly HandleReprocessableExceptionStrategy HandleReprocessableException = - new HandleReprocessableExceptionStrategy(); - - /// - /// Gets singleton of the . - /// - public static readonly HandleUniqueConstraintViolationStrategy HandleUniqueConstraintViolation = - new HandleUniqueConstraintViolationStrategy(); - - /// - /// Gets singleton of the . - /// - public static readonly NoReprocessStrategy NoReprocess = new NoReprocessStrategy(); - - /// - /// Gets or sets attempts limit. - /// - public int Attempts { get; set; } - - /// - /// Execute task. - /// - /// Task return type. - /// The context of this task. - /// - /// Task result. - /// - public virtual T Execute(ExecutionContext context) - { - int i = 0; - while (true) - { - Session session = null; - TransactionScope tran = null; - bool needBreak = false; - Transaction transaction = null; - try - { - T result; - SessionScope sessionScope = null; - try - { - try - { - IsolationLevel isolationLevel = context.IsolationLevel; - SystemTransaction currentTransaction = SystemTransaction.Current; - if (isolationLevel == IsolationLevel.Unspecified && currentTransaction != null) - isolationLevel = currentTransaction.IsolationLevel; - session = SessionScope.CurrentSession; - if (session == null) - { - session = context.Domain.OpenSession(); - sessionScope = session.Activate(); - } - if (currentTransaction != null && session.Transaction != null) - session.EnsureTransactionIsStarted(); - tran = (currentTransaction != null && currentTransaction.TransactionInformation.DistributedIdentifier != Guid.Empty) || - (session.Transaction != null && session.Transaction.IsDisconnected) - ? session.OpenTransaction(isolationLevel) - : session.OpenTransaction(context.TransactionOpenMode, isolationLevel); - transaction = session.Transaction; - result = context.Function(session); - tran.Complete(); - } - finally - { - try - { - tran.DisposeSafely(); - } - catch (StorageException e) - { - if (e.InnerException == null || !(e.InnerException is InvalidOperationException) || - e.InnerException.Source != "System.Data") - throw; - if (tran.Transaction.IsNested) - needBreak = true; - } - } - } - finally - { - sessionScope.DisposeSafely(); - if (SessionScope.CurrentSession != session) - session.DisposeSafely(); - } - return result; - } - catch (Exception e) - { - if ((SystemTransaction.Current != null && - SystemTransaction.Current.TransactionInformation.DistributedIdentifier != Guid.Empty) || - (transaction != null && (transaction.State == TransactionState.Active || transaction.IsDisconnected))) - throw; - if (e is RollbackTransactionException) - return default(T); - i++; - if (needBreak || !HandleException(new ExecuteErrorEventArgs(e, session, transaction, i))) - throw; - } - } - } - - /// - /// Gets the singleton of the specified strategy - /// - /// The type of the strategy. - /// The singleton. - public static IExecuteActionStrategy GetSingleton(Type type) - { - if (type==typeof (HandleReprocessableExceptionStrategy)) - return HandleReprocessableException; - if (type==typeof (HandleUniqueConstraintViolationStrategy)) - return HandleUniqueConstraintViolation; - if (type==typeof (NoReprocessStrategy)) - return NoReprocess; - return Singletons.GetOrAdd(type, a => (IExecuteActionStrategy) Activator.CreateInstance(type)); - } - - #region Non-public methods - - /// - /// Handles the exception. - /// - /// The instance containing the exception data. - /// True if needs to reprocess the task, otherwise false. - protected virtual bool HandleException(ExecuteErrorEventArgs eventArgs) - { - return false; - } - - /// - /// Raises the event. - /// - /// The instance containing the event data. - /// True if needs to reprocess the task. - protected virtual bool OnError(ExecuteErrorEventArgs eventArgs) - { - if (Error!=null) - Error(this, eventArgs); - return eventArgs.Attempt < Attempts; - } - - #endregion - - #region IExecuteActionStrategy Members - - /// - /// Occurs when unhandled exception is thrown - /// - public event EventHandler Error; - - #endregion - - /// - /// Initializes a new instance of the class. - /// - protected ExecuteActionStrategy() - { - Attempts = 5; - } - } +using System; +using System.Collections.Concurrent; +using System.Transactions; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using SystemTransaction = System.Transactions.Transaction; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Base class for the standard execute action strategies. + /// + public abstract class ExecuteActionStrategy : IExecuteActionStrategy + { + private static readonly ConcurrentDictionary Singletons = + new ConcurrentDictionary(); + + /// + /// Gets singleton of the . + /// + public static readonly HandleReprocessableExceptionStrategy HandleReprocessableException = + new HandleReprocessableExceptionStrategy(); + + /// + /// Gets singleton of the . + /// + public static readonly HandleUniqueConstraintViolationStrategy HandleUniqueConstraintViolation = + new HandleUniqueConstraintViolationStrategy(); + + /// + /// Gets singleton of the . + /// + public static readonly NoReprocessStrategy NoReprocess = new NoReprocessStrategy(); + + /// + /// Gets or sets attempts limit. + /// + public int Attempts { get; set; } + + /// + /// Execute task. + /// + /// Task return type. + /// The context of this task. + /// + /// Task result. + /// + public virtual T Execute(ExecutionContext context) + { + int i = 0; + while (true) + { + Session session = null; + TransactionScope tran = null; + bool needBreak = false; + Transaction transaction = null; + try + { + T result; + SessionScope sessionScope = null; + try + { + try + { + IsolationLevel isolationLevel = context.IsolationLevel; + SystemTransaction currentTransaction = SystemTransaction.Current; + if (isolationLevel == IsolationLevel.Unspecified && currentTransaction != null) + isolationLevel = currentTransaction.IsolationLevel; + session = SessionScope.CurrentSession; + if (session == null) + { + session = context.Domain.OpenSession(); + sessionScope = session.Activate(); + } + if (currentTransaction != null && session.Transaction != null) + session.EnsureTransactionIsStarted(); + tran = (currentTransaction != null && currentTransaction.TransactionInformation.DistributedIdentifier != Guid.Empty) || + (session.Transaction != null && session.Transaction.IsDisconnected) + ? session.OpenTransaction(isolationLevel) + : session.OpenTransaction(context.TransactionOpenMode, isolationLevel); + transaction = session.Transaction; + result = context.Function(session); + tran.Complete(); + } + finally + { + try + { + tran.DisposeSafely(); + } + catch (StorageException e) + { + if (e.InnerException == null || !(e.InnerException is InvalidOperationException) || + e.InnerException.Source != "System.Data") + throw; + if (tran.Transaction.IsNested) + needBreak = true; + } + } + } + finally + { + sessionScope.DisposeSafely(); + if (SessionScope.CurrentSession != session) + session.DisposeSafely(); + } + return result; + } + catch (Exception e) + { + if ((SystemTransaction.Current != null && + SystemTransaction.Current.TransactionInformation.DistributedIdentifier != Guid.Empty) || + (transaction != null && (transaction.State == TransactionState.Active || transaction.IsDisconnected))) + throw; + if (e is RollbackTransactionException) + return default(T); + i++; + if (needBreak || !HandleException(new ExecuteErrorEventArgs(e, session, transaction, i))) + throw; + } + } + } + + /// + /// Gets the singleton of the specified strategy + /// + /// The type of the strategy. + /// The singleton. + public static IExecuteActionStrategy GetSingleton(Type type) + { + if (type==typeof (HandleReprocessableExceptionStrategy)) + return HandleReprocessableException; + if (type==typeof (HandleUniqueConstraintViolationStrategy)) + return HandleUniqueConstraintViolation; + if (type==typeof (NoReprocessStrategy)) + return NoReprocess; + return Singletons.GetOrAdd(type, a => (IExecuteActionStrategy) Activator.CreateInstance(type)); + } + + #region Non-public methods + + /// + /// Handles the exception. + /// + /// The instance containing the exception data. + /// True if needs to reprocess the task, otherwise false. + protected virtual bool HandleException(ExecuteErrorEventArgs eventArgs) + { + return false; + } + + /// + /// Raises the event. + /// + /// The instance containing the event data. + /// True if needs to reprocess the task. + protected virtual bool OnError(ExecuteErrorEventArgs eventArgs) + { + if (Error!=null) + Error(this, eventArgs); + return eventArgs.Attempt < Attempts; + } + + #endregion + + #region IExecuteActionStrategy Members + + /// + /// Occurs when unhandled exception is thrown + /// + public event EventHandler Error; + + #endregion + + /// + /// Initializes a new instance of the class. + /// + protected ExecuteActionStrategy() + { + Attempts = 5; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/ExecuteErrorEventArgs.cs b/Extensions/Xtensive.Orm.Reprocessing/ExecuteErrorEventArgs.cs index b2b13a03b4..59e5d62235 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/ExecuteErrorEventArgs.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/ExecuteErrorEventArgs.cs @@ -1,45 +1,45 @@ -using System; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Provides data for the event - /// - public class ExecuteErrorEventArgs : EventArgs - { - /// - /// Gets the attempt number of this task. - /// - public int Attempt { get; private set; } - - /// - /// Gets the exception of this task. - /// - public Exception Exception { get; private set; } - - /// - /// Gets the session of this task. Session will have outer transaction. - /// - public Session Session { get; private set; } - - /// - /// Gets the transaction of this task. - /// - public Transaction Transaction { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The exception. - /// The session with outer transaction. - /// The transaction of this task. Transaction will be in state. - /// The attempt number. - public ExecuteErrorEventArgs(Exception exception, Session session, Transaction transaction, int attempt) - { - Attempt = attempt; - Exception = exception; - Session = session; - Transaction = transaction; - } - } +using System; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Provides data for the event + /// + public class ExecuteErrorEventArgs : EventArgs + { + /// + /// Gets the attempt number of this task. + /// + public int Attempt { get; private set; } + + /// + /// Gets the exception of this task. + /// + public Exception Exception { get; private set; } + + /// + /// Gets the session of this task. Session will have outer transaction. + /// + public Session Session { get; private set; } + + /// + /// Gets the transaction of this task. + /// + public Transaction Transaction { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The exception. + /// The session with outer transaction. + /// The transaction of this task. Transaction will be in state. + /// The attempt number. + public ExecuteErrorEventArgs(Exception exception, Session session, Transaction transaction, int attempt) + { + Attempt = attempt; + Exception = exception; + Session = session; + Transaction = transaction; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/ExecutionContext.cs b/Extensions/Xtensive.Orm.Reprocessing/ExecutionContext.cs index 18c5348070..43d35015df 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/ExecutionContext.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/ExecutionContext.cs @@ -1,48 +1,48 @@ -using System; -using System.Transactions; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Task execution context. - /// - /// Return type of the task. if the task is specified by - public class ExecutionContext - { - /// - /// Gets the domain of this task. - /// - public Domain Domain { get; private set; } - - /// - /// Gets the of this task. - /// - public IsolationLevel IsolationLevel { get; private set; } - - /// - /// Gets the task. - /// - public Func Function { get; private set; } - - /// - /// Gets the of this task - /// - public TransactionOpenMode TransactionOpenMode { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The domain. - /// The isolation level. - /// The transaction open mode. - /// The task. - public ExecutionContext( - Domain domain, IsolationLevel isolationLevel, TransactionOpenMode transactionOpenMode, Func function) - { - Domain = domain; - IsolationLevel = isolationLevel; - TransactionOpenMode = transactionOpenMode; - Function = function; - } - } +using System; +using System.Transactions; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Task execution context. + /// + /// Return type of the task. if the task is specified by + public class ExecutionContext + { + /// + /// Gets the domain of this task. + /// + public Domain Domain { get; private set; } + + /// + /// Gets the of this task. + /// + public IsolationLevel IsolationLevel { get; private set; } + + /// + /// Gets the task. + /// + public Func Function { get; private set; } + + /// + /// Gets the of this task + /// + public TransactionOpenMode TransactionOpenMode { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The domain. + /// The isolation level. + /// The transaction open mode. + /// The task. + public ExecutionContext( + Domain domain, IsolationLevel isolationLevel, TransactionOpenMode transactionOpenMode, Func function) + { + Domain = domain; + IsolationLevel = isolationLevel; + TransactionOpenMode = transactionOpenMode; + Function = function; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/HandleReprocessableExceptionStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/HandleReprocessableExceptionStrategy.cs index fefc436d95..824cb41c43 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/HandleReprocessableExceptionStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/HandleReprocessableExceptionStrategy.cs @@ -1,26 +1,26 @@ -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Reprocess task when is thrown. - /// - public class HandleReprocessableExceptionStrategy : ExecuteActionStrategy - { - #region Non-public methods - - /// - /// Handles the exception. - /// - /// The instance containing the exception data. - /// - /// True if needs to reprocess the task, otherwise false. - /// - protected override bool HandleException(ExecuteErrorEventArgs eventArgs) - { - if (eventArgs.Exception is ReprocessableException) - return OnError(eventArgs); - return base.HandleException(eventArgs); - } - - #endregion - } +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Reprocess task when is thrown. + /// + public class HandleReprocessableExceptionStrategy : ExecuteActionStrategy + { + #region Non-public methods + + /// + /// Handles the exception. + /// + /// The instance containing the exception data. + /// + /// True if needs to reprocess the task, otherwise false. + /// + protected override bool HandleException(ExecuteErrorEventArgs eventArgs) + { + if (eventArgs.Exception is ReprocessableException) + return OnError(eventArgs); + return base.HandleException(eventArgs); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/HandleUniqueConstraintViolationStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/HandleUniqueConstraintViolationStrategy.cs index c404544369..1cabc2e06f 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/HandleUniqueConstraintViolationStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/HandleUniqueConstraintViolationStrategy.cs @@ -1,38 +1,38 @@ -using System.Data.SqlClient; -using System.Transactions; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Reprocess task when or are thrown. - /// - public class HandleUniqueConstraintViolationStrategy : HandleReprocessableExceptionStrategy - { - #region Non-public methods - - /// - /// Handles the exception. - /// - /// The instance containing the exception data. - /// - /// True if needs to reprocess the task, otherwise false. - /// - protected override bool HandleException(ExecuteErrorEventArgs eventArgs) - { - if (eventArgs.Transaction!=null && eventArgs.Transaction.IsNested && - eventArgs.Transaction.IsolationLevel==IsolationLevel.Snapshot) - return false; - if (eventArgs.Exception is UniqueConstraintViolationException) - return OnError(eventArgs); - var ex = eventArgs.Exception as StorageException; - if (ex!=null) { - var ex1 = ex.InnerException as SqlException; - if (ex1!=null && ex1.Number==2601) - return OnError(eventArgs); - } - return base.HandleException(eventArgs); - } - - #endregion - } +using System.Data.SqlClient; +using System.Transactions; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Reprocess task when or are thrown. + /// + public class HandleUniqueConstraintViolationStrategy : HandleReprocessableExceptionStrategy + { + #region Non-public methods + + /// + /// Handles the exception. + /// + /// The instance containing the exception data. + /// + /// True if needs to reprocess the task, otherwise false. + /// + protected override bool HandleException(ExecuteErrorEventArgs eventArgs) + { + if (eventArgs.Transaction!=null && eventArgs.Transaction.IsNested && + eventArgs.Transaction.IsolationLevel==IsolationLevel.Snapshot) + return false; + if (eventArgs.Exception is UniqueConstraintViolationException) + return OnError(eventArgs); + var ex = eventArgs.Exception as StorageException; + if (ex!=null) { + var ex1 = ex.InnerException as SqlException; + if (ex1!=null && ex1.Number==2601) + return OnError(eventArgs); + } + return base.HandleException(eventArgs); + } + + #endregion + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/IExecuteActionStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/IExecuteActionStrategy.cs index 2efc977f1b..ba18032c18 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/IExecuteActionStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/IExecuteActionStrategy.cs @@ -1,23 +1,23 @@ -using System; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Defines action strategy contract. - /// - public interface IExecuteActionStrategy - { - /// - /// Execute task. - /// - /// The context of this task. - /// Task return type. - /// Task result. - T Execute(ExecutionContext context); - - /// - /// Occurs when unhandled exception is thrown - /// - event EventHandler Error; - } +using System; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Defines action strategy contract. + /// + public interface IExecuteActionStrategy + { + /// + /// Execute task. + /// + /// The context of this task. + /// Task return type. + /// Task result. + T Execute(ExecutionContext context); + + /// + /// Occurs when unhandled exception is thrown + /// + event EventHandler Error; + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/IExecuteConfiguration.cs b/Extensions/Xtensive.Orm.Reprocessing/IExecuteConfiguration.cs index 7020fab67e..27bb73772e 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/IExecuteConfiguration.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/IExecuteConfiguration.cs @@ -1,46 +1,46 @@ -using System; -using System.Transactions; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Configuration for executing reprocessable operation. - /// - public interface IExecuteConfiguration - { - /// - /// Specifies to use for this configuration. - /// - /// Strategy to use. - /// This instance. - IExecuteConfiguration WithStrategy(IExecuteActionStrategy strategy); - - /// - /// Specifies to use for this configuration. - /// - /// Isolation level to use. - /// This instance. - IExecuteConfiguration WithIsolationLevel(IsolationLevel isolationLevel); - - /// - /// Specifies to use for this configuration. - /// - /// Transction open mode to use. - /// This instance. - IExecuteConfiguration WithTransactionOpenMode(TransactionOpenMode transactionOpenMode); - - /// - /// Executes specified reprocessable . - /// - /// Action to execute. - void Execute(Action action); - - /// - /// Executes specified reprocessable . - /// - /// Type of the result. - /// Function to execute. - /// Result of execution. - T Execute(Func func); - } -} +using System; +using System.Transactions; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Configuration for executing reprocessable operation. + /// + public interface IExecuteConfiguration + { + /// + /// Specifies to use for this configuration. + /// + /// Strategy to use. + /// This instance. + IExecuteConfiguration WithStrategy(IExecuteActionStrategy strategy); + + /// + /// Specifies to use for this configuration. + /// + /// Isolation level to use. + /// This instance. + IExecuteConfiguration WithIsolationLevel(IsolationLevel isolationLevel); + + /// + /// Specifies to use for this configuration. + /// + /// Transction open mode to use. + /// This instance. + IExecuteConfiguration WithTransactionOpenMode(TransactionOpenMode transactionOpenMode); + + /// + /// Executes specified reprocessable . + /// + /// Action to execute. + void Execute(Action action); + + /// + /// Executes specified reprocessable . + /// + /// Type of the result. + /// Function to execute. + /// Result of execution. + T Execute(Func func); + } +} diff --git a/Extensions/Xtensive.Orm.Reprocessing/Internals/ExecuteConfiguration.cs b/Extensions/Xtensive.Orm.Reprocessing/Internals/ExecuteConfiguration.cs index af62733348..e5a8ccf5af 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Internals/ExecuteConfiguration.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/Internals/ExecuteConfiguration.cs @@ -1,50 +1,50 @@ -using System; -using System.Transactions; - -namespace Xtensive.Orm.Reprocessing -{ - internal class ExecuteConfiguration : IExecuteConfiguration - { - public ExecuteConfiguration(Domain domain) - { - Domain = domain; - IsolationLevel = IsolationLevel.Unspecified; - } - - protected Domain Domain { get; private set; } - - public IExecuteActionStrategy Strategy { get; set; } - - public IsolationLevel IsolationLevel { get; set; } - - public TransactionOpenMode? TransactionOpenMode { get; set; } - - public IExecuteConfiguration WithIsolationLevel(IsolationLevel isolationLevel) - { - IsolationLevel = isolationLevel; - return this; - } - - public IExecuteConfiguration WithStrategy(IExecuteActionStrategy strategy) - { - Strategy = strategy; - return this; - } - - public IExecuteConfiguration WithTransactionOpenMode(TransactionOpenMode transactionOpenMode) - { - TransactionOpenMode = transactionOpenMode; - return this; - } - - public void Execute(Action action) - { - Domain.ExecuteInternal(IsolationLevel, TransactionOpenMode, Strategy, action); - } - - public T Execute(Func func) - { - return Domain.ExecuteInternal(IsolationLevel, TransactionOpenMode, Strategy, func); - } - } +using System; +using System.Transactions; + +namespace Xtensive.Orm.Reprocessing +{ + internal class ExecuteConfiguration : IExecuteConfiguration + { + public ExecuteConfiguration(Domain domain) + { + Domain = domain; + IsolationLevel = IsolationLevel.Unspecified; + } + + protected Domain Domain { get; private set; } + + public IExecuteActionStrategy Strategy { get; set; } + + public IsolationLevel IsolationLevel { get; set; } + + public TransactionOpenMode? TransactionOpenMode { get; set; } + + public IExecuteConfiguration WithIsolationLevel(IsolationLevel isolationLevel) + { + IsolationLevel = isolationLevel; + return this; + } + + public IExecuteConfiguration WithStrategy(IExecuteActionStrategy strategy) + { + Strategy = strategy; + return this; + } + + public IExecuteConfiguration WithTransactionOpenMode(TransactionOpenMode transactionOpenMode) + { + TransactionOpenMode = transactionOpenMode; + return this; + } + + public void Execute(Action action) + { + Domain.ExecuteInternal(IsolationLevel, TransactionOpenMode, Strategy, action); + } + + public T Execute(Func func) + { + return Domain.ExecuteInternal(IsolationLevel, TransactionOpenMode, Strategy, func); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/Internals/Extensions.cs b/Extensions/Xtensive.Orm.Reprocessing/Internals/Extensions.cs index ca7d36e8f2..e5323052b1 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Internals/Extensions.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/Internals/Extensions.cs @@ -1,15 +1,15 @@ -using System.Data.Common; -using Xtensive.Core; -using Xtensive.Orm.Services; - -namespace Xtensive.Orm.Reprocessing -{ - internal static class Extensions - { - public static void EnsureTransactionIsStarted(this Session session) - { - var accessor = session.Services.Demand(); - DbTransaction notUsed = accessor.Transaction; - } - } +using System.Data.Common; +using Xtensive.Core; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Reprocessing +{ + internal static class Extensions + { + public static void EnsureTransactionIsStarted(this Session session) + { + var accessor = session.Services.Demand(); + DbTransaction notUsed = accessor.Transaction; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/NoReprocessStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/NoReprocessStrategy.cs index a66d1bc16a..9fa4249b53 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/NoReprocessStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/NoReprocessStrategy.cs @@ -1,9 +1,9 @@ -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Never reprocess the task. - /// - public class NoReprocessStrategy : ExecuteActionStrategy - { - } +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Never reprocess the task. + /// + public class NoReprocessStrategy : ExecuteActionStrategy + { + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/Readme.txt b/Extensions/Xtensive.Orm.Reprocessing/Readme.txt index 82e1acaa6a..3fa77cb955 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Readme.txt +++ b/Extensions/Xtensive.Orm.Reprocessing/Readme.txt @@ -1,63 +1,63 @@ -========================= -Xtensive.Orm.Reprocessing -========================= - -Summary -------- -The extension provides API for reprocessible operations. The reprocessible operation -should represent a separate block of logic, usually a delegate of a method and be transactional. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Reprocessing assembly - -Demo ----- -1. Simple reprocessible operation looks like this: - -Domain.Execute(session => - { - // Task logic - }); - -2. There are 3 strategies that can be used for task execution: -- HandleReprocessibleException strategy - The strategy catches all reprocessible expections (deadlock and transaction serialization exceptions) - and makes another attempt to execute the task -- HandleUniqueConstraintViolation strategy - The same as previous one but also catches unique constraint violation exception -- NoReprocess strategy - No reprocessing is provided - -To indicate that a particular strategy should be used, use the following syntax: - -Domain.WithStrategy(new HandleReprocessExceptionStrategy()) - .Execute(session => - { - // Task logic - }); - -3. To omit setting up the strategy each time consider configuring it in -application configuration file, e.g.: - - - ... -
- - - - - -Having that done, in scenarios with no strategy specified, the extension will automatically use -the strategy from the configuration. - -References ----------- +========================= +Xtensive.Orm.Reprocessing +========================= + +Summary +------- +The extension provides API for reprocessible operations. The reprocessible operation +should represent a separate block of logic, usually a delegate of a method and be transactional. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Reprocessing assembly + +Demo +---- +1. Simple reprocessible operation looks like this: + +Domain.Execute(session => + { + // Task logic + }); + +2. There are 3 strategies that can be used for task execution: +- HandleReprocessibleException strategy + The strategy catches all reprocessible expections (deadlock and transaction serialization exceptions) + and makes another attempt to execute the task +- HandleUniqueConstraintViolation strategy + The same as previous one but also catches unique constraint violation exception +- NoReprocess strategy + No reprocessing is provided + +To indicate that a particular strategy should be used, use the following syntax: + +Domain.WithStrategy(new HandleReprocessExceptionStrategy()) + .Execute(session => + { + // Task logic + }); + +3. To omit setting up the strategy each time consider configuring it in +application configuration file, e.g.: + + + ... +
+ + + + + +Having that done, in scenarios with no strategy specified, the extension will automatically use +the strategy from the configuration. + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/ReprocessAttribute.cs b/Extensions/Xtensive.Orm.Reprocessing/ReprocessAttribute.cs index c07e211b27..275c53630e 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/ReprocessAttribute.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/ReprocessAttribute.cs @@ -1,119 +1,119 @@ -#if NOT_IMPLMENETED - -using System; -using System.Transactions; -using PostSharp.Aspects; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Execute method in reprocessable mode. - /// - [Serializable] - public class ReprocessAttribute : MethodInterceptionAspect - { - private StandardExecutionStrategy? _strategy; - private TransactionOpenMode? _transactionOpenMode; - - /// - /// Gets or sets the custom strategy. This property overrides property if set. - /// - /// - /// The custom strategy. - /// - public Type CustomStrategy { get; set; } - /// - /// Gets or sets the standard strategy. - /// - /// - /// The strategy. - /// - public StandardExecutionStrategy Strategy - { - get { return _strategy.GetValueOrDefault(); } - set { _strategy = value; } - } - - /// - /// Gets or sets the isolation level. - /// - /// - /// The isolation level. - /// - public IsolationLevel IsolationLevel { get; set; } - - /// - /// Gets or sets the transaction open mode. - /// - /// - /// The transaction open mode. - /// - public TransactionOpenMode TransactionOpenMode - { - get { return _transactionOpenMode.GetValueOrDefault(); } - set { _transactionOpenMode = value; } - } - - - /// - /// Gets or sets the domain in which context should run all methods marked with this attribute. - /// - /// - /// The domain. - /// - public static Domain Domain { get; set; } - - /// - /// Method invoked instead of the method to which the aspect has been applied. - /// - /// Advice arguments. - public override void OnInvoke(MethodInterceptionArgs args) - { - IExecuteActionStrategy strategy = null; - if (CustomStrategy != null) - strategy = ExecuteActionStrategy.GetSingleton(CustomStrategy); - else if (_strategy != null) - { - switch (_strategy.Value) - { - case StandardExecutionStrategy.HandleReprocessableException: - strategy = ExecuteActionStrategy.HandleReprocessableException; - break; - case StandardExecutionStrategy.NoReprocess: - strategy = ExecuteActionStrategy.NoReprocess; - break; - case StandardExecutionStrategy.HandleUniqueConstraintViolation: - strategy = ExecuteActionStrategy.HandleUniqueConstraintViolation; - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - GetDomain().ExecuteInternal(IsolationLevel, _transactionOpenMode, strategy, session => args.Proceed()); - } - - #region Non-public methods - - /// - /// Gets the domain in wich context should run. - /// - /// The domain. - protected virtual Domain GetDomain() - { - return Domain; - } - - #endregion - - /// - /// Initializes a new instance of the class. - /// - public ReprocessAttribute() - { - IsolationLevel = IsolationLevel.Unspecified; - } - } -} - -#endif +#if NOT_IMPLMENETED + +using System; +using System.Transactions; +using PostSharp.Aspects; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Execute method in reprocessable mode. + /// + [Serializable] + public class ReprocessAttribute : MethodInterceptionAspect + { + private StandardExecutionStrategy? _strategy; + private TransactionOpenMode? _transactionOpenMode; + + /// + /// Gets or sets the custom strategy. This property overrides property if set. + /// + /// + /// The custom strategy. + /// + public Type CustomStrategy { get; set; } + /// + /// Gets or sets the standard strategy. + /// + /// + /// The strategy. + /// + public StandardExecutionStrategy Strategy + { + get { return _strategy.GetValueOrDefault(); } + set { _strategy = value; } + } + + /// + /// Gets or sets the isolation level. + /// + /// + /// The isolation level. + /// + public IsolationLevel IsolationLevel { get; set; } + + /// + /// Gets or sets the transaction open mode. + /// + /// + /// The transaction open mode. + /// + public TransactionOpenMode TransactionOpenMode + { + get { return _transactionOpenMode.GetValueOrDefault(); } + set { _transactionOpenMode = value; } + } + + + /// + /// Gets or sets the domain in which context should run all methods marked with this attribute. + /// + /// + /// The domain. + /// + public static Domain Domain { get; set; } + + /// + /// Method invoked instead of the method to which the aspect has been applied. + /// + /// Advice arguments. + public override void OnInvoke(MethodInterceptionArgs args) + { + IExecuteActionStrategy strategy = null; + if (CustomStrategy != null) + strategy = ExecuteActionStrategy.GetSingleton(CustomStrategy); + else if (_strategy != null) + { + switch (_strategy.Value) + { + case StandardExecutionStrategy.HandleReprocessableException: + strategy = ExecuteActionStrategy.HandleReprocessableException; + break; + case StandardExecutionStrategy.NoReprocess: + strategy = ExecuteActionStrategy.NoReprocess; + break; + case StandardExecutionStrategy.HandleUniqueConstraintViolation: + strategy = ExecuteActionStrategy.HandleUniqueConstraintViolation; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + GetDomain().ExecuteInternal(IsolationLevel, _transactionOpenMode, strategy, session => args.Proceed()); + } + + #region Non-public methods + + /// + /// Gets the domain in wich context should run. + /// + /// The domain. + protected virtual Domain GetDomain() + { + return Domain; + } + + #endregion + + /// + /// Initializes a new instance of the class. + /// + public ReprocessAttribute() + { + IsolationLevel = IsolationLevel.Unspecified; + } + } +} + +#endif diff --git a/Extensions/Xtensive.Orm.Reprocessing/ReprocessableDomainBuilder.cs b/Extensions/Xtensive.Orm.Reprocessing/ReprocessableDomainBuilder.cs index 2ab44d4f25..803e0e9419 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/ReprocessableDomainBuilder.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/ReprocessableDomainBuilder.cs @@ -1,65 +1,65 @@ -using System; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Domain builder with reprocess after - /// - public class ReprocessableDomainBuilder : DomainBuilder - { - /// - /// Initializes a new instance of the class. - /// - public ReprocessableDomainBuilder() - { - Attempts = 5; - } - - /// - /// Gets or sets the number of attempts. - /// - /// - /// The number of attempts. - /// - public int Attempts { get; set; } - - /// - /// Builds the domain with specified configuration. - /// - /// The configuration. - /// The domain. - public override Domain Build(DomainConfiguration config) - { - int i = 0; - while (true) - { - try - { - return base.Build(config); - } - catch (ReprocessableException) - { - i++; - if (i >= Attempts) - throw; - } - } - } - - /// - /// Raises the event. - /// - /// The instance containing the event data. - protected virtual void OnError(DomainBuildErrorEventArgs args) - { - if (Error != null) - Error(this, args); - } - - /// - /// Occurs when is thrown. - /// - public event EventHandler Error; - } +using System; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Domain builder with reprocess after + /// + public class ReprocessableDomainBuilder : DomainBuilder + { + /// + /// Initializes a new instance of the class. + /// + public ReprocessableDomainBuilder() + { + Attempts = 5; + } + + /// + /// Gets or sets the number of attempts. + /// + /// + /// The number of attempts. + /// + public int Attempts { get; set; } + + /// + /// Builds the domain with specified configuration. + /// + /// The configuration. + /// The domain. + public override Domain Build(DomainConfiguration config) + { + int i = 0; + while (true) + { + try + { + return base.Build(config); + } + catch (ReprocessableException) + { + i++; + if (i >= Attempts) + throw; + } + } + } + + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected virtual void OnError(DomainBuildErrorEventArgs args) + { + if (Error != null) + Error(this, args); + } + + /// + /// Occurs when is thrown. + /// + public event EventHandler Error; + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/RollbackTransactionException.cs b/Extensions/Xtensive.Orm.Reprocessing/RollbackTransactionException.cs index 3987e60a74..005520f8c2 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/RollbackTransactionException.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/RollbackTransactionException.cs @@ -1,11 +1,11 @@ -using System; - -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Tells to reprocessing engine, that needs to rollback transaction and return default value. - /// - public class RollbackTransactionException : Exception - { - } +using System; + +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Tells to reprocessing engine, that needs to rollback transaction and return default value. + /// + public class RollbackTransactionException : Exception + { + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Reprocessing/StandardExecutionStrategy.cs b/Extensions/Xtensive.Orm.Reprocessing/StandardExecutionStrategy.cs index c5dec8e699..a05284b76c 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/StandardExecutionStrategy.cs +++ b/Extensions/Xtensive.Orm.Reprocessing/StandardExecutionStrategy.cs @@ -1,21 +1,21 @@ -namespace Xtensive.Orm.Reprocessing -{ - /// - /// Contains standard reprocess strategies. - /// - public enum StandardExecutionStrategy - { - /// - /// - /// - HandleReprocessableException, - /// - /// - /// - NoReprocess, - /// - /// - /// - HandleUniqueConstraintViolation - } -} +namespace Xtensive.Orm.Reprocessing +{ + /// + /// Contains standard reprocess strategies. + /// + public enum StandardExecutionStrategy + { + /// + /// + /// + HandleReprocessableException, + /// + /// + /// + NoReprocess, + /// + /// + /// + HandleUniqueConstraintViolation + } +} diff --git a/Extensions/Xtensive.Orm.Reprocessing/Xtensive.Orm.Reprocessing.csproj b/Extensions/Xtensive.Orm.Reprocessing/Xtensive.Orm.Reprocessing.csproj index 2d4e778b77..7ff48added 100644 --- a/Extensions/Xtensive.Orm.Reprocessing/Xtensive.Orm.Reprocessing.csproj +++ b/Extensions/Xtensive.Orm.Reprocessing/Xtensive.Orm.Reprocessing.csproj @@ -1,28 +1,28 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Reprocessing - Operation reprocessing extension for $(DoProductName) - $(Title) - Adds support for reprocessable operations for $(DoProductName)-powered projects - true - ..\Extensions.snk - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Reprocessing + Operation reprocessing extension for $(DoProductName) + $(Title) + Adds support for reprocessable operations for $(DoProductName)-powered projects + true + ..\Extensions.snk + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/App.config b/Extensions/Xtensive.Orm.Security.Tests/App.config index c3d739db57..5d3d3d31f0 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/App.config +++ b/Extensions/Xtensive.Orm.Security.Tests/App.config @@ -1,22 +1,22 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - + + + +
+
+
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/AutoBuildTest.cs b/Extensions/Xtensive.Orm.Security.Tests/AutoBuildTest.cs index 044bec773f..802897c0b0 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/AutoBuildTest.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/AutoBuildTest.cs @@ -1,109 +1,109 @@ -using System.Configuration; -using NUnit.Framework; -using System; -using TestCommon; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Roles; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Security.Tests -{ - [TestFixture] - public abstract class AutoBuildTest - { - protected Domain Domain { get; private set; } - - [OneTimeSetUp] - public virtual void OneTimeSetUp() - { - var config = BuildConfiguration(); - Domain = BuildDomain(config); - PopulateData(); - } - - [OneTimeTearDown] - public virtual void OneTimeTearDown() - { - Domain.DisposeSafely(); - } - - protected virtual DomainConfiguration BuildConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (Permission).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly); - return configuration; - } - - protected virtual Domain BuildDomain(DomainConfiguration configuration) - { - try { - return Domain.Build(configuration); - } - catch (Exception e) { - Console.WriteLine(GetType().GetFullName()); - Console.WriteLine(e); - throw; - } - } - - protected virtual void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - // Branches - var southBranch = new Branch(session) { Name = "South"}; - var northBranch = new Branch(session) { Name = "North"}; - - // Customers - new Customer(session) {IsAutomobileIndustry = true, Branch = southBranch}; - new VipCustomer(session) {IsAircraftIndustry = true, Reason = "High sales", Branch = southBranch}; - new VipCustomer(session) {Reason = "Relative", Branch = northBranch}; - - // Roles - var salesPersonRole = new SalesPersonRole(session); - var salesManagerRole = new SalesManagerRole(session); - var automobileManagerRole = new AutomobileManagerRole(session); - var aircraftManagerRole = new AircraftManagerRole(session); - var southBranchOfficeManager = new BranchOfficeManagerRole(session, southBranch); - var northBranchOfficeManager = new BranchOfficeManagerRole(session, northBranch); - - // Employees - var u1 = new Employee(session); - u1.Roles.Add(salesPersonRole); - u1.Name = "SalesPerson"; - - var u2 = new Employee(session); - u2.Roles.Add(salesManagerRole); - u2.Name = "SalesManager"; - - var u3 = new Employee(session); - u3.Roles.Add(automobileManagerRole); - u3.Name = "AutomobileManager"; - - var u4 = new Employee(session); - u4.Roles.Add(aircraftManagerRole); - u4.Name = "AircraftManager"; - - var u5 = new Employee(session); - u5.Roles.Add(southBranchOfficeManager); - u5.Name = "SouthBranchOfficeManager"; - - var u6 = new Employee(session); - u6.Roles.Add(northBranchOfficeManager); - u6.Name = "NorthBranchOfficeManager"; - - var u7 = new Employee(session); - u7.Roles.Add(southBranchOfficeManager); - u7.Roles.Add(northBranchOfficeManager); - u7.Name = "AllBranchOfficeManager"; - t.Complete(); - } - } - } - } -} +using System.Configuration; +using NUnit.Framework; +using System; +using TestCommon; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Roles; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Security.Tests +{ + [TestFixture] + public abstract class AutoBuildTest + { + protected Domain Domain { get; private set; } + + [OneTimeSetUp] + public virtual void OneTimeSetUp() + { + var config = BuildConfiguration(); + Domain = BuildDomain(config); + PopulateData(); + } + + [OneTimeTearDown] + public virtual void OneTimeTearDown() + { + Domain.DisposeSafely(); + } + + protected virtual DomainConfiguration BuildConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (Permission).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly); + return configuration; + } + + protected virtual Domain BuildDomain(DomainConfiguration configuration) + { + try { + return Domain.Build(configuration); + } + catch (Exception e) { + Console.WriteLine(GetType().GetFullName()); + Console.WriteLine(e); + throw; + } + } + + protected virtual void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + // Branches + var southBranch = new Branch(session) { Name = "South"}; + var northBranch = new Branch(session) { Name = "North"}; + + // Customers + new Customer(session) {IsAutomobileIndustry = true, Branch = southBranch}; + new VipCustomer(session) {IsAircraftIndustry = true, Reason = "High sales", Branch = southBranch}; + new VipCustomer(session) {Reason = "Relative", Branch = northBranch}; + + // Roles + var salesPersonRole = new SalesPersonRole(session); + var salesManagerRole = new SalesManagerRole(session); + var automobileManagerRole = new AutomobileManagerRole(session); + var aircraftManagerRole = new AircraftManagerRole(session); + var southBranchOfficeManager = new BranchOfficeManagerRole(session, southBranch); + var northBranchOfficeManager = new BranchOfficeManagerRole(session, northBranch); + + // Employees + var u1 = new Employee(session); + u1.Roles.Add(salesPersonRole); + u1.Name = "SalesPerson"; + + var u2 = new Employee(session); + u2.Roles.Add(salesManagerRole); + u2.Name = "SalesManager"; + + var u3 = new Employee(session); + u3.Roles.Add(automobileManagerRole); + u3.Name = "AutomobileManager"; + + var u4 = new Employee(session); + u4.Roles.Add(aircraftManagerRole); + u4.Name = "AircraftManager"; + + var u5 = new Employee(session); + u5.Roles.Add(southBranchOfficeManager); + u5.Name = "SouthBranchOfficeManager"; + + var u6 = new Employee(session); + u6.Roles.Add(northBranchOfficeManager); + u6.Name = "NorthBranchOfficeManager"; + + var u7 = new Employee(session); + u7.Roles.Add(southBranchOfficeManager); + u7.Roles.Add(northBranchOfficeManager); + u7.Name = "AllBranchOfficeManager"; + t.Complete(); + } + } + } + } +} diff --git a/Extensions/Xtensive.Orm.Security.Tests/Model/Branch.cs b/Extensions/Xtensive.Orm.Security.Tests/Model/Branch.cs index 196653dba6..d6b432f4fc 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Model/Branch.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Model/Branch.cs @@ -1,25 +1,25 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.26 - -using System; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security.Tests.Model -{ - [HierarchyRoot] - public class Branch : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Branch(Session session) - : base(session) - {} - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.26 + +using System; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security.Tests.Model +{ + [HierarchyRoot] + public class Branch : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Branch(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Model/Customer.cs b/Extensions/Xtensive.Orm.Security.Tests/Model/Customer.cs index 084f9c3dd5..5842545969 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Model/Customer.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Model/Customer.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Security.Tests.Model -{ - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public bool IsVip { get; protected set; } - - [Field] - public bool IsAutomobileIndustry { get; set; } - - [Field] - public bool IsAircraftIndustry { get; set; } - - [Field] - public Branch Branch { get; set; } - - public Customer(Session session) - : base(session) - { - IsVip = false; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Security.Tests.Model +{ + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public bool IsVip { get; protected set; } + + [Field] + public bool IsAutomobileIndustry { get; set; } + + [Field] + public bool IsAircraftIndustry { get; set; } + + [Field] + public Branch Branch { get; set; } + + public Customer(Session session) + : base(session) + { + IsVip = false; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Model/Employee.cs b/Extensions/Xtensive.Orm.Security.Tests/Model/Employee.cs index 9f6032f3ea..3f5d8272d8 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Model/Employee.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Model/Employee.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security.Tests.Model -{ - [HierarchyRoot] - public class Employee : GenericPrincipal - { - [Field, Key] - public int Id { get; private set; } - - public Employee(Session session) - : base(session) - {} - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security.Tests.Model +{ + [HierarchyRoot] + public class Employee : GenericPrincipal + { + [Field, Key] + public int Id { get; private set; } + + public Employee(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Model/VipCustomer.cs b/Extensions/Xtensive.Orm.Security.Tests/Model/VipCustomer.cs index 22ef337338..7565ba7b7b 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Model/VipCustomer.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Model/VipCustomer.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security.Tests.Model -{ - public class VipCustomer : Customer - { - [Field] - public string Reason { get; set; } - - public VipCustomer(Session session) - : base(session) - { - IsVip = true; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security.Tests.Model +{ + public class VipCustomer : Customer + { + [Field] + public string Reason { get; set; } + + public VipCustomer(Session session) + : base(session) + { + IsVip = true; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Permissions/CustomerPermission.cs b/Extensions/Xtensive.Orm.Security.Tests/Permissions/CustomerPermission.cs index 8b00bd20c1..4651e7b7ad 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Permissions/CustomerPermission.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Permissions/CustomerPermission.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; - -namespace Xtensive.Orm.Security.Tests.Permissions -{ - public class CustomerPermission : Permission - { - public CustomerPermission(bool canWrite, Func> query) : base(canWrite, query) - {} - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; + +namespace Xtensive.Orm.Security.Tests.Permissions +{ + public class CustomerPermission : Permission + { + public CustomerPermission(bool canWrite, Func> query) : base(canWrite, query) + {} + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Permissions/VipCustomerPermission.cs b/Extensions/Xtensive.Orm.Security.Tests/Permissions/VipCustomerPermission.cs index 245fd24a98..79b9b28852 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Permissions/VipCustomerPermission.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Permissions/VipCustomerPermission.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; - -namespace Xtensive.Orm.Security.Tests.Permissions -{ - public class VipCustomerPermission : Permission - { - public bool CanDiscount { get; private set; } - - public VipCustomerPermission(Func> query) - : base(true, query) - { - CanDiscount = true; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; + +namespace Xtensive.Orm.Security.Tests.Permissions +{ + public class VipCustomerPermission : Permission + { + public bool CanDiscount { get; private set; } + + public VipCustomerPermission(Func> query) + : base(true, query) + { + CanDiscount = true; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Roles/AircraftManagerRole.cs b/Extensions/Xtensive.Orm.Security.Tests/Roles/AircraftManagerRole.cs index 402485342c..8e6679df81 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Roles/AircraftManagerRole.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Roles/AircraftManagerRole.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Permissions; - -namespace Xtensive.Orm.Security.Tests.Roles -{ - public class AircraftManagerRole : EmployeeRole - { - private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All() - .Where(c => c.IsAircraftIndustry); - } - - protected override void RegisterPermissions() - { - RegisterPermission(new CustomerPermission(true, GetCustomers)); - } - - public AircraftManagerRole(Session session) - : base(session) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Permissions; + +namespace Xtensive.Orm.Security.Tests.Roles +{ + public class AircraftManagerRole : EmployeeRole + { + private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All() + .Where(c => c.IsAircraftIndustry); + } + + protected override void RegisterPermissions() + { + RegisterPermission(new CustomerPermission(true, GetCustomers)); + } + + public AircraftManagerRole(Session session) + : base(session) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Roles/BranchOfficeManagerRole.cs b/Extensions/Xtensive.Orm.Security.Tests/Roles/BranchOfficeManagerRole.cs index a2b27a1c03..b6d91bc22e 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Roles/BranchOfficeManagerRole.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Roles/BranchOfficeManagerRole.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.26 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; - -namespace Xtensive.Orm.Security.Tests.Roles -{ - public class BranchOfficeManagerRole : EmployeeRole - { - [Field] - public Branch Branch { get; set; } - - private IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All() - .Where(c => c.Branch == Branch); - } - - protected override void RegisterPermissions() - { - RegisterPermission(new Permission(true, GetCustomers)); - } - - public BranchOfficeManagerRole(Session session, Branch branch) - : base(session) - { - Branch = branch; - Name = branch.Name + "OfficeManager"; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.26 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; + +namespace Xtensive.Orm.Security.Tests.Roles +{ + public class BranchOfficeManagerRole : EmployeeRole + { + [Field] + public Branch Branch { get; set; } + + private IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All() + .Where(c => c.Branch == Branch); + } + + protected override void RegisterPermissions() + { + RegisterPermission(new Permission(true, GetCustomers)); + } + + public BranchOfficeManagerRole(Session session, Branch branch) + : base(session) + { + Branch = branch; + Name = branch.Name + "OfficeManager"; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Roles/EmployeeRole.cs b/Extensions/Xtensive.Orm.Security.Tests/Roles/EmployeeRole.cs index bbda0fc322..6cf085ac3b 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Roles/EmployeeRole.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Roles/EmployeeRole.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.26 - -using Xtensive.Orm; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Security.Tests.Roles -{ - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public abstract class EmployeeRole : Role - { - [Field, Key] - public int Id { get; private set; } - - protected EmployeeRole(Session session) - : base(session) - {} - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.26 + +using Xtensive.Orm; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Security.Tests.Roles +{ + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public abstract class EmployeeRole : Role + { + [Field, Key] + public int Id { get; private set; } + + protected EmployeeRole(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesManagerRole.cs b/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesManagerRole.cs index 04c8bb9a5e..2a65a340a0 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesManagerRole.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesManagerRole.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Permissions; - -namespace Xtensive.Orm.Security.Tests.Roles -{ - public class SalesManagerRole : SalesPersonRole - { - private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All(); - } - - private static IQueryable GetVipCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All().Where(v => v.Reason != "Relative"); - } - - protected override void OnInitialize() - { - base.OnInitialize(); - RegisterPermission(new CustomerPermission(true, GetCustomers)); - RegisterPermission(new VipCustomerPermission(GetVipCustomers)); - } - - public SalesManagerRole(Session session) - : base(session) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Permissions; + +namespace Xtensive.Orm.Security.Tests.Roles +{ + public class SalesManagerRole : SalesPersonRole + { + private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All(); + } + + private static IQueryable GetVipCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All().Where(v => v.Reason != "Relative"); + } + + protected override void OnInitialize() + { + base.OnInitialize(); + RegisterPermission(new CustomerPermission(true, GetCustomers)); + RegisterPermission(new VipCustomerPermission(GetVipCustomers)); + } + + public SalesManagerRole(Session session) + : base(session) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesPersonRole.cs b/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesPersonRole.cs index d9e19baac2..3556bc327a 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesPersonRole.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Roles/SalesPersonRole.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Linq; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Permissions; - -namespace Xtensive.Orm.Security.Tests.Roles -{ - public class SalesPersonRole : EmployeeRole - { - private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All() - .Where(c => c.IsVip == false); - } - - protected override void RegisterPermissions() - { - RegisterPermission(new CustomerPermission(true, GetCustomers)); - } - - public SalesPersonRole(Session session) - : base(session) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Linq; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Permissions; + +namespace Xtensive.Orm.Security.Tests.Roles +{ + public class SalesPersonRole : EmployeeRole + { + private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All() + .Where(c => c.IsVip == false); + } + + protected override void RegisterPermissions() + { + RegisterPermission(new CustomerPermission(true, GetCustomers)); + } + + public SalesPersonRole(Session session) + : base(session) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Tests/AuthenticationTests.cs b/Extensions/Xtensive.Orm.Security.Tests/Tests/AuthenticationTests.cs index e88373f6fb..2caddf6014 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Tests/AuthenticationTests.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Tests/AuthenticationTests.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.10 - -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Security.Tests.Model; - -namespace Xtensive.Orm.Security.Tests -{ - public class AuthenticationTests : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var trx = session.OpenTransaction()) { - - var employee = new Employee(session); - employee.Name = "Steve Ballmer"; - employee.SetPassword("developers, developers, developers, developers"); - Assert.That(employee.PasswordHash, Is.Not.Null.Or.Empty); - - trx.Complete(); - } - } - - using (var session = Domain.OpenSession()) { - using (var trx = session.OpenTransaction()) { - - Assert.That(session.Authenticate("Steve Ballmer", "Steve Ballmer"), Is.Null); - Assert.That(session.Authenticate("developers, developers, developers, developers", "Steve Ballmer"), Is.Null); - Assert.That(session.Authenticate("Steve Ballmer", "developers, developers, developers, developers"), Is.Not.Null); - - trx.Complete(); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.10 + +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Security.Tests.Model; + +namespace Xtensive.Orm.Security.Tests +{ + public class AuthenticationTests : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var trx = session.OpenTransaction()) { + + var employee = new Employee(session); + employee.Name = "Steve Ballmer"; + employee.SetPassword("developers, developers, developers, developers"); + Assert.That(employee.PasswordHash, Is.Not.Null.Or.Empty); + + trx.Complete(); + } + } + + using (var session = Domain.OpenSession()) { + using (var trx = session.OpenTransaction()) { + + Assert.That(session.Authenticate("Steve Ballmer", "Steve Ballmer"), Is.Null); + Assert.That(session.Authenticate("developers, developers, developers, developers", "Steve Ballmer"), Is.Null); + Assert.That(session.Authenticate("Steve Ballmer", "developers, developers, developers, developers"), Is.Not.Null); + + trx.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Tests/ConfigurationTests.cs b/Extensions/Xtensive.Orm.Security.Tests/Tests/ConfigurationTests.cs index d37e7cb18c..54d4b6118c 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Tests/ConfigurationTests.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Tests/ConfigurationTests.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.07 - -using NUnit.Framework; -using TestCommon; -using Xtensive.Orm.Security.Configuration; - -namespace Xtensive.Orm.Security.Tests -{ - [TestFixture] - public class ConfigurationTests : HasConfigurationAccessTest - { - [Test] - public void HashingServiceNameTest() - { - var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.WithName"); - Assert.That(section, Is.Not.Null); - Assert.That(section.HashingService, Is.Not.Null); - Assert.That(section.HashingService.Name, Is.Not.Null); - Assert.That(section.HashingService.Name, Is.EqualTo("md5")); - - var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.WithName"); - Assert.That(config, Is.Not.Null); - Assert.That(config.HashingServiceName, Is.EqualTo("md5")); - } - - [Test] - public void HashingServiceEmptyTest() - { - var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.WithoutName"); - Assert.That(section, Is.Not.Null); - Assert.That(section.HashingService, Is.Not.Null); - Assert.That(section.HashingService.Name, Is.Null.Or.Empty); - - var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.WithoutName"); - Assert.That(config, Is.Not.Null); - Assert.That(config.HashingServiceName, Is.EqualTo("plain")); - } - - [Test] - public void HashingServiceAbsentTest() - { - var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.Empty"); - Assert.That(section, Is.Not.Null); - Assert.That(section.HashingService, Is.Not.Null); - Assert.That(section.HashingService.Name, Is.Null.Or.Empty); - - var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.Empty"); - Assert.That(config, Is.Not.Null); - Assert.That(config.HashingServiceName, Is.EqualTo("plain")); - } - - [Test] - public void HashingServiceNoConfigTest() - { - var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.XXX"); - Assert.That(section, Is.Null); - - var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.XXX"); - Assert.That(config, Is.Not.Null); - Assert.That(config.HashingServiceName, Is.EqualTo("plain")); - } - - [Test] - public void HashingServiceDefaultTest() - { - var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security"); - Assert.That(section, Is.Not.Null); - Assert.That(section.HashingService, Is.Not.Null); - Assert.That(section.HashingService.Name, Is.Not.Null.Or.Empty); - Assert.That(section.HashingService.Name, Is.EqualTo("sha1")); - - var config = SecurityConfiguration.Load(Configuration); - Assert.That(config, Is.Not.Null); - Assert.That(config.HashingServiceName, Is.EqualTo("sha1")); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.07 + +using NUnit.Framework; +using TestCommon; +using Xtensive.Orm.Security.Configuration; + +namespace Xtensive.Orm.Security.Tests +{ + [TestFixture] + public class ConfigurationTests : HasConfigurationAccessTest + { + [Test] + public void HashingServiceNameTest() + { + var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.WithName"); + Assert.That(section, Is.Not.Null); + Assert.That(section.HashingService, Is.Not.Null); + Assert.That(section.HashingService.Name, Is.Not.Null); + Assert.That(section.HashingService.Name, Is.EqualTo("md5")); + + var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.WithName"); + Assert.That(config, Is.Not.Null); + Assert.That(config.HashingServiceName, Is.EqualTo("md5")); + } + + [Test] + public void HashingServiceEmptyTest() + { + var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.WithoutName"); + Assert.That(section, Is.Not.Null); + Assert.That(section.HashingService, Is.Not.Null); + Assert.That(section.HashingService.Name, Is.Null.Or.Empty); + + var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.WithoutName"); + Assert.That(config, Is.Not.Null); + Assert.That(config.HashingServiceName, Is.EqualTo("plain")); + } + + [Test] + public void HashingServiceAbsentTest() + { + var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.Empty"); + Assert.That(section, Is.Not.Null); + Assert.That(section.HashingService, Is.Not.Null); + Assert.That(section.HashingService.Name, Is.Null.Or.Empty); + + var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.Empty"); + Assert.That(config, Is.Not.Null); + Assert.That(config.HashingServiceName, Is.EqualTo("plain")); + } + + [Test] + public void HashingServiceNoConfigTest() + { + var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security.XXX"); + Assert.That(section, Is.Null); + + var config = SecurityConfiguration.Load(Configuration, "Xtensive.Orm.Security.XXX"); + Assert.That(config, Is.Not.Null); + Assert.That(config.HashingServiceName, Is.EqualTo("plain")); + } + + [Test] + public void HashingServiceDefaultTest() + { + var section = (Configuration.ConfigurationSection) Configuration.GetSection("Xtensive.Orm.Security"); + Assert.That(section, Is.Not.Null); + Assert.That(section.HashingService, Is.Not.Null); + Assert.That(section.HashingService.Name, Is.Not.Null.Or.Empty); + Assert.That(section.HashingService.Name, Is.EqualTo("sha1")); + + var config = SecurityConfiguration.Load(Configuration); + Assert.That(config, Is.Not.Null); + Assert.That(config.HashingServiceName, Is.EqualTo("sha1")); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Tests/HashingServicesTests.cs b/Extensions/Xtensive.Orm.Security.Tests/Tests/HashingServicesTests.cs index 58f430c9f8..ddacd59d5a 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Tests/HashingServicesTests.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Tests/HashingServicesTests.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Security.Cryptography; - -namespace Xtensive.Orm.Security.Tests -{ - [TestFixture] - public class HashingServicesTests : AutoBuildTest - { - private List values; - - [Test] - public void PlainHashingServiceTest() - { - var service = new Cryptography.PlainHashingService(); - - foreach (string value in values) - Assert.AreEqual(value, service.ComputeHash(value)); - } - - [Test] - public void SHA1HashingServiceTest() - { - ExecuteTest(new SHA1HashingService(), new SHA1HashingService()); - } - - [Test] - public void SHA256HashingServiceTest() - { - ExecuteTest(new SHA256HashingService(), new SHA256HashingService()); - } - - [Test] - public void SHA384HashingServiceTest() - { - ExecuteTest(new SHA384HashingService(), new SHA384HashingService()); - } - - [Test] - public void SHA512HashingServiceTest() - { - ExecuteTest(new SHA512HashingService(), new SHA512HashingService()); - } - - private void ExecuteTest(IHashingService service1, IHashingService service2) - { - foreach (string value in values) { - var hash = service1.ComputeHash(value); - Assert.IsNotEmpty(hash); - Assert.IsTrue(service2.VerifyHash(value, hash)); - Assert.IsFalse(service2.VerifyHash(value, Convert.ToBase64String(new byte[] {33, 32,23,23,23,23,23,23,23,23,2,32,3,23,23,23}))); - } - } - - [Test] - public void InitializationTest() - { - var s = Domain.Services.Get("md5"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - - s = Domain.Services.Get("sha1"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - - s = Domain.Services.Get("sha256"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - - s = Domain.Services.Get("sha384"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - - s = Domain.Services.Get("sha512"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - - s = Domain.Services.Get("plain"); - Assert.IsNotNull(s); - Assert.IsInstanceOf(s); - } - - public HashingServicesTests() - { - values = Assembly.GetExecutingAssembly().GetTypes().Select(t => t.Name).ToList(); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Security.Cryptography; + +namespace Xtensive.Orm.Security.Tests +{ + [TestFixture] + public class HashingServicesTests : AutoBuildTest + { + private List values; + + [Test] + public void PlainHashingServiceTest() + { + var service = new Cryptography.PlainHashingService(); + + foreach (string value in values) + Assert.AreEqual(value, service.ComputeHash(value)); + } + + [Test] + public void SHA1HashingServiceTest() + { + ExecuteTest(new SHA1HashingService(), new SHA1HashingService()); + } + + [Test] + public void SHA256HashingServiceTest() + { + ExecuteTest(new SHA256HashingService(), new SHA256HashingService()); + } + + [Test] + public void SHA384HashingServiceTest() + { + ExecuteTest(new SHA384HashingService(), new SHA384HashingService()); + } + + [Test] + public void SHA512HashingServiceTest() + { + ExecuteTest(new SHA512HashingService(), new SHA512HashingService()); + } + + private void ExecuteTest(IHashingService service1, IHashingService service2) + { + foreach (string value in values) { + var hash = service1.ComputeHash(value); + Assert.IsNotEmpty(hash); + Assert.IsTrue(service2.VerifyHash(value, hash)); + Assert.IsFalse(service2.VerifyHash(value, Convert.ToBase64String(new byte[] {33, 32,23,23,23,23,23,23,23,23,2,32,3,23,23,23}))); + } + } + + [Test] + public void InitializationTest() + { + var s = Domain.Services.Get("md5"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + + s = Domain.Services.Get("sha1"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + + s = Domain.Services.Get("sha256"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + + s = Domain.Services.Get("sha384"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + + s = Domain.Services.Get("sha512"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + + s = Domain.Services.Get("plain"); + Assert.IsNotNull(s); + Assert.IsInstanceOf(s); + } + + public HashingServicesTests() + { + values = Assembly.GetExecutingAssembly().GetTypes().Select(t => t.Name).ToList(); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Tests/ImpersonationContextTests.cs b/Extensions/Xtensive.Orm.Security.Tests/Tests/ImpersonationContextTests.cs index 9cb58cd4cc..6cadbae27f 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Tests/ImpersonationContextTests.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Tests/ImpersonationContextTests.cs @@ -1,159 +1,159 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Roles; - -namespace Xtensive.Orm.Security.Tests -{ - [TestFixture] - public class ImpersonationContextTests : AutoBuildTest - { - [Test] - public void SessionImpersonateTest() - { - using (var session = Domain.OpenSession()) { - using (var trx = session.OpenTransaction()) { - - var u = session.Query.All().First(); - var ic = session.Impersonate(u); - Assert.IsNotNull(ic); - Assert.IsNotNull(session.GetImpersonationContext()); - Assert.AreSame(ic, session.GetImpersonationContext()); - Assert.AreSame(u, ic.Principal); - - ic.Undo(); - Assert.IsNull(session.GetImpersonationContext()); - - // Should not fail in case multiple Undo - ic.Undo(); - ic.Undo(); - // Should not fail if Dispose after Undo - ic.Dispose(); - - ic = session.Impersonate(u); - ic.Dispose(); - Assert.IsNull(session.GetImpersonationContext()); - // Should not fail if Undo after Dispose - ic.Undo(); - - trx.Complete(); - } - } - } - - [Test] - public void NestedSessionImpersonationTest() - { - using (var s = Domain.OpenSession()) { - using (var t = s.OpenTransaction()) { - - var users = s.Query.All().ToList(); - var u1 = users[0]; - var u2 = users[1]; - var ic1 = s.Impersonate(u1); - Assert.IsNotNull(ic1); - Assert.IsNotNull(s.GetImpersonationContext()); - Assert.AreSame(ic1, s.GetImpersonationContext()); - Assert.AreSame(u1, ic1.Principal); - - var ic2 = s.Impersonate(u2); - Assert.IsNotNull(ic2); - Assert.IsNotNull(s.GetImpersonationContext()); - Assert.AreSame(ic2, s.GetImpersonationContext()); - Assert.AreNotSame(ic1, ic2); - Assert.AreSame(u2, ic2.Principal); - - // Outer context can't be undone while is not active - ic1.Undo(); - Assert.AreSame(ic2, s.GetImpersonationContext()); - - ic2.Undo(); - // After outer context is undone, the nested one becomes outer - Assert.AreSame(ic1, s.GetImpersonationContext()); - - t.Complete(); - } - } - } - - [Test] - public void SecureQueryTest() - { - using (var s = Domain.OpenSession()) { - using (var t = s.OpenTransaction()) { - - Assert.AreEqual(3, s.Query.All().Count()); - - var u1 = s.Query.All().Single(u => u.Name == "SalesPerson"); - using (var ic = s.Impersonate(u1)) { - - Assert.AreEqual(1, s.Query.All().Count()); - Assert.AreEqual(0, s.Query.All().Count()); - ic.Undo(); - } - - var u2 = s.Query.All().Single(u => u.Name == "SalesManager"); - using (var ic = s.Impersonate(u2)) { - - Assert.AreEqual(3, s.Query.All().Count()); - Assert.AreEqual(2, s.Query.All().Count()); - ic.Undo(); - } - - var u3 = s.Query.All().Single(u => u.Name == "AutomobileManager"); - using (var ic = s.Impersonate(u3)) { - - Assert.AreEqual(1, s.Query.All().Count()); - ic.Undo(); - } - - var u4 = s.Query.All().Single(u => u.Name == "AircraftManager"); - using (var ic = s.Impersonate(u4)) { - - Assert.AreEqual(1, s.Query.All().Count()); - ic.Undo(); - } - - // Merging 2 roles - u4.Roles.Add(s.Query.All().OfType().Single()); - using (var ic = s.Impersonate(u4)) { - - Assert.AreEqual(2, s.Query.All().Count()); - ic.Undo(); - } - - var u5 = s.Query.All().Single(u => u.Name == "SouthBranchOfficeManager"); - using (var ic = s.Impersonate(u5)) { - - Assert.AreEqual(2, s.Query.All().Count()); - ic.Undo(); - } - - var u6 = s.Query.All().Single(u => u.Name == "NorthBranchOfficeManager"); - using (var ic = s.Impersonate(u6)) { - - Assert.AreEqual(1, s.Query.All().Count()); - ic.Undo(); - } - - var u7 = s.Query.All().Single(u => u.Name == "AllBranchOfficeManager"); - using (var ic = s.Impersonate(u7)) { - - Assert.AreEqual(3, s.Query.All().Count()); - ic.Undo(); - } - - t.Complete(); - } - } - } - - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Roles; + +namespace Xtensive.Orm.Security.Tests +{ + [TestFixture] + public class ImpersonationContextTests : AutoBuildTest + { + [Test] + public void SessionImpersonateTest() + { + using (var session = Domain.OpenSession()) { + using (var trx = session.OpenTransaction()) { + + var u = session.Query.All().First(); + var ic = session.Impersonate(u); + Assert.IsNotNull(ic); + Assert.IsNotNull(session.GetImpersonationContext()); + Assert.AreSame(ic, session.GetImpersonationContext()); + Assert.AreSame(u, ic.Principal); + + ic.Undo(); + Assert.IsNull(session.GetImpersonationContext()); + + // Should not fail in case multiple Undo + ic.Undo(); + ic.Undo(); + // Should not fail if Dispose after Undo + ic.Dispose(); + + ic = session.Impersonate(u); + ic.Dispose(); + Assert.IsNull(session.GetImpersonationContext()); + // Should not fail if Undo after Dispose + ic.Undo(); + + trx.Complete(); + } + } + } + + [Test] + public void NestedSessionImpersonationTest() + { + using (var s = Domain.OpenSession()) { + using (var t = s.OpenTransaction()) { + + var users = s.Query.All().ToList(); + var u1 = users[0]; + var u2 = users[1]; + var ic1 = s.Impersonate(u1); + Assert.IsNotNull(ic1); + Assert.IsNotNull(s.GetImpersonationContext()); + Assert.AreSame(ic1, s.GetImpersonationContext()); + Assert.AreSame(u1, ic1.Principal); + + var ic2 = s.Impersonate(u2); + Assert.IsNotNull(ic2); + Assert.IsNotNull(s.GetImpersonationContext()); + Assert.AreSame(ic2, s.GetImpersonationContext()); + Assert.AreNotSame(ic1, ic2); + Assert.AreSame(u2, ic2.Principal); + + // Outer context can't be undone while is not active + ic1.Undo(); + Assert.AreSame(ic2, s.GetImpersonationContext()); + + ic2.Undo(); + // After outer context is undone, the nested one becomes outer + Assert.AreSame(ic1, s.GetImpersonationContext()); + + t.Complete(); + } + } + } + + [Test] + public void SecureQueryTest() + { + using (var s = Domain.OpenSession()) { + using (var t = s.OpenTransaction()) { + + Assert.AreEqual(3, s.Query.All().Count()); + + var u1 = s.Query.All().Single(u => u.Name == "SalesPerson"); + using (var ic = s.Impersonate(u1)) { + + Assert.AreEqual(1, s.Query.All().Count()); + Assert.AreEqual(0, s.Query.All().Count()); + ic.Undo(); + } + + var u2 = s.Query.All().Single(u => u.Name == "SalesManager"); + using (var ic = s.Impersonate(u2)) { + + Assert.AreEqual(3, s.Query.All().Count()); + Assert.AreEqual(2, s.Query.All().Count()); + ic.Undo(); + } + + var u3 = s.Query.All().Single(u => u.Name == "AutomobileManager"); + using (var ic = s.Impersonate(u3)) { + + Assert.AreEqual(1, s.Query.All().Count()); + ic.Undo(); + } + + var u4 = s.Query.All().Single(u => u.Name == "AircraftManager"); + using (var ic = s.Impersonate(u4)) { + + Assert.AreEqual(1, s.Query.All().Count()); + ic.Undo(); + } + + // Merging 2 roles + u4.Roles.Add(s.Query.All().OfType().Single()); + using (var ic = s.Impersonate(u4)) { + + Assert.AreEqual(2, s.Query.All().Count()); + ic.Undo(); + } + + var u5 = s.Query.All().Single(u => u.Name == "SouthBranchOfficeManager"); + using (var ic = s.Impersonate(u5)) { + + Assert.AreEqual(2, s.Query.All().Count()); + ic.Undo(); + } + + var u6 = s.Query.All().Single(u => u.Name == "NorthBranchOfficeManager"); + using (var ic = s.Impersonate(u6)) { + + Assert.AreEqual(1, s.Query.All().Count()); + ic.Undo(); + } + + var u7 = s.Query.All().Single(u => u.Name == "AllBranchOfficeManager"); + using (var ic = s.Impersonate(u7)) { + + Assert.AreEqual(3, s.Query.All().Count()); + ic.Undo(); + } + + t.Complete(); + } + } + } + + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Tests/PermissionSetTests.cs b/Extensions/Xtensive.Orm.Security.Tests/Tests/PermissionSetTests.cs index a91985ffe4..61701982b6 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Tests/PermissionSetTests.cs +++ b/Extensions/Xtensive.Orm.Security.Tests/Tests/PermissionSetTests.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.30 - -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Security.Tests.Model; -using Xtensive.Orm.Security.Tests.Permissions; -using Xtensive.Orm.Security.Tests.Roles; - -namespace Xtensive.Orm.Security.Tests -{ - [TestFixture] - public class PermissionSetTests : AutoBuildTest - { - [Test] - public void SalesManagerRoleTest() - { - using (Session s = Domain.OpenSession()) { - using (TransactionScope t = s.OpenTransaction()) { - var role = new SalesManagerRole(s); - var roles = new List {role}; - var permissions = new PermissionSet(roles); - - Assert.AreEqual(role.Permissions.Count, permissions.Count); - Assert.IsTrue(permissions.Contains>(p => p.CanRead)); - Assert.IsTrue(permissions.Contains>(p => p.CanWrite)); - - Assert.IsTrue(permissions.Contains(p => p.CanRead)); - Assert.IsTrue(permissions.Contains(p => p.CanWrite)); - - Assert.IsTrue(permissions.Contains(p => p.CanRead)); - Assert.IsTrue(permissions.Contains(p => p.CanWrite)); - Assert.IsTrue(permissions.Contains(p => p.CanDiscount)); - } - } - } - - [Test] - public void SalesPersonRoleTest() - { - using (Session s = Domain.OpenSession()) { - using (TransactionScope t = s.OpenTransaction()) { - var role = new SalesPersonRole(s); - var roles = new List {role}; - var permissions = new PermissionSet(roles); - - Assert.AreEqual(role.Permissions.Count, permissions.Count); - Assert.IsTrue(permissions.Contains>(p => p.CanRead)); - Assert.IsTrue(permissions.Contains>(p => p.CanWrite)); - - Assert.IsTrue(permissions.Contains(p => p.CanRead)); - Assert.IsTrue(permissions.Contains(p => p.CanWrite)); - - Assert.IsFalse(permissions.Contains(p => p.CanRead)); - Assert.IsFalse(permissions.Contains(p => p.CanWrite)); - Assert.IsFalse(permissions.Contains(p => p.CanDiscount)); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.30 + +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Security.Tests.Model; +using Xtensive.Orm.Security.Tests.Permissions; +using Xtensive.Orm.Security.Tests.Roles; + +namespace Xtensive.Orm.Security.Tests +{ + [TestFixture] + public class PermissionSetTests : AutoBuildTest + { + [Test] + public void SalesManagerRoleTest() + { + using (Session s = Domain.OpenSession()) { + using (TransactionScope t = s.OpenTransaction()) { + var role = new SalesManagerRole(s); + var roles = new List {role}; + var permissions = new PermissionSet(roles); + + Assert.AreEqual(role.Permissions.Count, permissions.Count); + Assert.IsTrue(permissions.Contains>(p => p.CanRead)); + Assert.IsTrue(permissions.Contains>(p => p.CanWrite)); + + Assert.IsTrue(permissions.Contains(p => p.CanRead)); + Assert.IsTrue(permissions.Contains(p => p.CanWrite)); + + Assert.IsTrue(permissions.Contains(p => p.CanRead)); + Assert.IsTrue(permissions.Contains(p => p.CanWrite)); + Assert.IsTrue(permissions.Contains(p => p.CanDiscount)); + } + } + } + + [Test] + public void SalesPersonRoleTest() + { + using (Session s = Domain.OpenSession()) { + using (TransactionScope t = s.OpenTransaction()) { + var role = new SalesPersonRole(s); + var roles = new List {role}; + var permissions = new PermissionSet(roles); + + Assert.AreEqual(role.Permissions.Count, permissions.Count); + Assert.IsTrue(permissions.Contains>(p => p.CanRead)); + Assert.IsTrue(permissions.Contains>(p => p.CanWrite)); + + Assert.IsTrue(permissions.Contains(p => p.CanRead)); + Assert.IsTrue(permissions.Contains(p => p.CanWrite)); + + Assert.IsFalse(permissions.Contains(p => p.CanRead)); + Assert.IsFalse(permissions.Contains(p => p.CanWrite)); + Assert.IsFalse(permissions.Contains(p => p.CanDiscount)); + } + } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security.Tests/Xtensive.Orm.Security.Tests.csproj b/Extensions/Xtensive.Orm.Security.Tests/Xtensive.Orm.Security.Tests.csproj index d8fbab1819..e071ac66a6 100644 --- a/Extensions/Xtensive.Orm.Security.Tests/Xtensive.Orm.Security.Tests.csproj +++ b/Extensions/Xtensive.Orm.Security.Tests/Xtensive.Orm.Security.Tests.csproj @@ -1,26 +1,26 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Configuration/Elements/AuthenticationServiceConfigurationElement.cs b/Extensions/Xtensive.Orm.Security/Configuration/Elements/AuthenticationServiceConfigurationElement.cs index 90e0e72809..86cdf4c051 100644 --- a/Extensions/Xtensive.Orm.Security/Configuration/Elements/AuthenticationServiceConfigurationElement.cs +++ b/Extensions/Xtensive.Orm.Security/Configuration/Elements/AuthenticationServiceConfigurationElement.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.07 - -using System; -using System.Configuration; - -namespace Xtensive.Orm.Security.Configuration -{ - /// - /// Authentication service configuration element within a configuration file. - /// - public class AuthenticationServiceConfigurationElement : ConfigurationElement - { - private const string NameElementName = "name"; - - /// - /// Gets or sets the name of the authentication service. - /// - [ConfigurationProperty(NameElementName, IsRequired = false)] - public string Name - { - get { return (string) this[NameElementName]; } - set { this[NameElementName] = value; } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.07 + +using System; +using System.Configuration; + +namespace Xtensive.Orm.Security.Configuration +{ + /// + /// Authentication service configuration element within a configuration file. + /// + public class AuthenticationServiceConfigurationElement : ConfigurationElement + { + private const string NameElementName = "name"; + + /// + /// Gets or sets the name of the authentication service. + /// + [ConfigurationProperty(NameElementName, IsRequired = false)] + public string Name + { + get { return (string) this[NameElementName]; } + set { this[NameElementName] = value; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Configuration/Elements/ConfigurationSection.cs b/Extensions/Xtensive.Orm.Security/Configuration/Elements/ConfigurationSection.cs index 5eb074d89e..ca3fe8cf06 100644 --- a/Extensions/Xtensive.Orm.Security/Configuration/Elements/ConfigurationSection.cs +++ b/Extensions/Xtensive.Orm.Security/Configuration/Elements/ConfigurationSection.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.07 - -using System; -using System.Configuration; - -namespace Xtensive.Orm.Security.Configuration -{ - /// - /// A root element of security configuration section within a configuration file. - /// - public class ConfigurationSection : System.Configuration.ConfigurationSection - { - /// - /// Gets default section name for security configuration. - /// Value is "Xtensive.Orm.Security". - /// - public static readonly string DefaultSectionName = "Xtensive.Orm.Security"; - - private const string HashingServiceElementName = "hashingService"; - private const string AuthenticationServiceElementName = "authenticationService"; - - /// - /// Gets or sets the hashing service. - /// - /// The hashing service. - [ConfigurationProperty(HashingServiceElementName, IsRequired = false)] - public HashingServiceConfigurationElement HashingService - { - get { return (HashingServiceConfigurationElement) this[HashingServiceElementName]; } - set { this[HashingServiceElementName] = value; } - } - - /// - /// Gets or sets the authentication service. - /// - /// The authentication service. - [ConfigurationProperty(AuthenticationServiceElementName, IsRequired = false)] - public AuthenticationServiceConfigurationElement AuthenticationService - { - get { return (AuthenticationServiceConfigurationElement) this[AuthenticationServiceElementName]; } - set { this[AuthenticationServiceElementName] = value; } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.07 + +using System; +using System.Configuration; + +namespace Xtensive.Orm.Security.Configuration +{ + /// + /// A root element of security configuration section within a configuration file. + /// + public class ConfigurationSection : System.Configuration.ConfigurationSection + { + /// + /// Gets default section name for security configuration. + /// Value is "Xtensive.Orm.Security". + /// + public static readonly string DefaultSectionName = "Xtensive.Orm.Security"; + + private const string HashingServiceElementName = "hashingService"; + private const string AuthenticationServiceElementName = "authenticationService"; + + /// + /// Gets or sets the hashing service. + /// + /// The hashing service. + [ConfigurationProperty(HashingServiceElementName, IsRequired = false)] + public HashingServiceConfigurationElement HashingService + { + get { return (HashingServiceConfigurationElement) this[HashingServiceElementName]; } + set { this[HashingServiceElementName] = value; } + } + + /// + /// Gets or sets the authentication service. + /// + /// The authentication service. + [ConfigurationProperty(AuthenticationServiceElementName, IsRequired = false)] + public AuthenticationServiceConfigurationElement AuthenticationService + { + get { return (AuthenticationServiceConfigurationElement) this[AuthenticationServiceElementName]; } + set { this[AuthenticationServiceElementName] = value; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Configuration/Elements/HashingServiceConfigurationElement.cs b/Extensions/Xtensive.Orm.Security/Configuration/Elements/HashingServiceConfigurationElement.cs index 5109c509ee..81be992993 100644 --- a/Extensions/Xtensive.Orm.Security/Configuration/Elements/HashingServiceConfigurationElement.cs +++ b/Extensions/Xtensive.Orm.Security/Configuration/Elements/HashingServiceConfigurationElement.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.07 - -using System; -using System.Configuration; - -namespace Xtensive.Orm.Security.Configuration -{ - /// - /// Hashing service configuration element within a configuration file. - /// - public class HashingServiceConfigurationElement : ConfigurationElement - { - private const string NameElementName = "name"; - - /// - /// Gets or sets the name of the hashing service. - /// - [ConfigurationProperty(NameElementName, IsRequired = false)] - public string Name - { - get { return (string) this[NameElementName]; } - set { this[NameElementName] = value; } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.07 + +using System; +using System.Configuration; + +namespace Xtensive.Orm.Security.Configuration +{ + /// + /// Hashing service configuration element within a configuration file. + /// + public class HashingServiceConfigurationElement : ConfigurationElement + { + private const string NameElementName = "name"; + + /// + /// Gets or sets the name of the hashing service. + /// + [ConfigurationProperty(NameElementName, IsRequired = false)] + public string Name + { + get { return (string) this[NameElementName]; } + set { this[NameElementName] = value; } + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Configuration/SecurityConfiguration.cs b/Extensions/Xtensive.Orm.Security/Configuration/SecurityConfiguration.cs index 0e6d96d1a1..8346a6497c 100644 --- a/Extensions/Xtensive.Orm.Security/Configuration/SecurityConfiguration.cs +++ b/Extensions/Xtensive.Orm.Security/Configuration/SecurityConfiguration.cs @@ -1,107 +1,107 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.10 - -using System; -using System.Configuration; - -namespace Xtensive.Orm.Security.Configuration -{ - /// - /// The configuration of the security system. - /// - [Serializable] - public class SecurityConfiguration - { - /// - /// Default SectionName value: - /// "". - /// - public const string DefaultSectionName = "Xtensive.Orm.Security"; - - /// - /// Gets or sets the name of the hashing service. - /// - /// The name of the hashing service. - public string HashingServiceName { get; private set; } - - /// - /// Gets or sets the name of the authentication service. - /// - /// The name of the authentication service. - public string AuthenticationServiceName { get; private set; } - - /// - /// Loads the - /// from application configuration file (section with ). - /// - /// - /// The . - /// - public static SecurityConfiguration Load() - { - return Load(DefaultSectionName); - } - - /// - /// Loads the - /// from application configuration file (section with ). - /// - /// Name of the section. - /// - /// The . - /// - public static SecurityConfiguration Load(string sectionName) - { - var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); - return GetConfigurationFromSection(section); - } - - /// - /// Loads the - /// from given configuration (section with ). - /// - /// Configuration to load from. - /// The . - public static SecurityConfiguration Load(System.Configuration.Configuration configuration) - { - return Load(configuration, DefaultSectionName); - } - - /// - /// Loads the - /// from given configuration (section with ). - /// - /// Configuration to load from. - /// Name of the section - /// The . - public static SecurityConfiguration Load(System.Configuration.Configuration configuration, string sectionName) - { - var configurationSection = (ConfigurationSection)configuration.GetSection(sectionName); - return GetConfigurationFromSection(configurationSection); - } - - private static SecurityConfiguration GetConfigurationFromSection(ConfigurationSection configurationSection) - { - var result = new SecurityConfiguration(); - - string hashingService = configurationSection==null - ? string.Empty - : configurationSection.HashingService.Name; - if (string.IsNullOrEmpty(hashingService)) - hashingService = "plain"; - result.HashingServiceName = hashingService.ToLowerInvariant(); - - string authenticationService = configurationSection==null - ? string.Empty - : configurationSection.AuthenticationService.Name; - if (string.IsNullOrEmpty(authenticationService)) - authenticationService = "default"; - result.AuthenticationServiceName = authenticationService.ToLowerInvariant(); - - return result; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.10 + +using System; +using System.Configuration; + +namespace Xtensive.Orm.Security.Configuration +{ + /// + /// The configuration of the security system. + /// + [Serializable] + public class SecurityConfiguration + { + /// + /// Default SectionName value: + /// "". + /// + public const string DefaultSectionName = "Xtensive.Orm.Security"; + + /// + /// Gets or sets the name of the hashing service. + /// + /// The name of the hashing service. + public string HashingServiceName { get; private set; } + + /// + /// Gets or sets the name of the authentication service. + /// + /// The name of the authentication service. + public string AuthenticationServiceName { get; private set; } + + /// + /// Loads the + /// from application configuration file (section with ). + /// + /// + /// The . + /// + public static SecurityConfiguration Load() + { + return Load(DefaultSectionName); + } + + /// + /// Loads the + /// from application configuration file (section with ). + /// + /// Name of the section. + /// + /// The . + /// + public static SecurityConfiguration Load(string sectionName) + { + var section = (ConfigurationSection) ConfigurationManager.GetSection(sectionName); + return GetConfigurationFromSection(section); + } + + /// + /// Loads the + /// from given configuration (section with ). + /// + /// Configuration to load from. + /// The . + public static SecurityConfiguration Load(System.Configuration.Configuration configuration) + { + return Load(configuration, DefaultSectionName); + } + + /// + /// Loads the + /// from given configuration (section with ). + /// + /// Configuration to load from. + /// Name of the section + /// The . + public static SecurityConfiguration Load(System.Configuration.Configuration configuration, string sectionName) + { + var configurationSection = (ConfigurationSection)configuration.GetSection(sectionName); + return GetConfigurationFromSection(configurationSection); + } + + private static SecurityConfiguration GetConfigurationFromSection(ConfigurationSection configurationSection) + { + var result = new SecurityConfiguration(); + + string hashingService = configurationSection==null + ? string.Empty + : configurationSection.HashingService.Name; + if (string.IsNullOrEmpty(hashingService)) + hashingService = "plain"; + result.HashingServiceName = hashingService.ToLowerInvariant(); + + string authenticationService = configurationSection==null + ? string.Empty + : configurationSection.AuthenticationService.Name; + if (string.IsNullOrEmpty(authenticationService)) + authenticationService = "default"; + result.AuthenticationServiceName = authenticationService.ToLowerInvariant(); + + return result; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/GenericHashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/GenericHashingService.cs index f779a838c0..a725e6ac8e 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/GenericHashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/GenericHashingService.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.10 - -using System; -using System.Linq; -using System.Security.Cryptography; -using System.Text; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Generic implementation. - /// - public abstract class GenericHashingService : IHashingService - { - /// - /// The size of salt. - /// - public const int SaltSize = 8; - - /// - /// Gets the hash algorithm. - /// - /// Hash algorithm to use. - protected abstract HashAlgorithm GetHashAlgorithm(); - - /// - /// Gets the salt. - /// - /// The salt. - protected byte[] GetSalt() - { - var salt = new byte[SaltSize]; - using (var rng = new RNGCryptoServiceProvider()) { - rng.GetBytes(salt); - return salt; - } - } - - /// - /// Computes the hash. - /// - /// The password. - /// The salt. - /// String representation of hash. - protected string ComputeHash(byte[] password, byte[] salt) - { - using (var hasher = GetHashAlgorithm()) { - var hash = hasher.ComputeHash(salt.Concat(password).ToArray()); - return Convert.ToBase64String(hash.Concat(salt).ToArray()); - } - } - - #region IHashingService Members - - /// - public string ComputeHash(string password) - { - return ComputeHash(Encoding.UTF8.GetBytes(password), GetSalt()); - } - - /// - public bool VerifyHash(string password, string hash) - { - byte[] source; - try { - source = Convert.FromBase64String(hash); - } - catch (FormatException) { - return false; - } - - int hashSize; - using (var hasher = GetHashAlgorithm()) - hashSize = hasher.HashSize / 8; - - if (source.Length < hashSize) - return false; - - var salt = source.Skip(hashSize).ToArray(); - var currentHash = ComputeHash(Encoding.UTF8.GetBytes(password), salt); - return StringComparer.Ordinal.Compare(hash, currentHash)==0; - } - - #endregion - - /// - /// Initializes a new instance of the class. - /// - protected GenericHashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.10 + +using System; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Generic implementation. + /// + public abstract class GenericHashingService : IHashingService + { + /// + /// The size of salt. + /// + public const int SaltSize = 8; + + /// + /// Gets the hash algorithm. + /// + /// Hash algorithm to use. + protected abstract HashAlgorithm GetHashAlgorithm(); + + /// + /// Gets the salt. + /// + /// The salt. + protected byte[] GetSalt() + { + var salt = new byte[SaltSize]; + using (var rng = new RNGCryptoServiceProvider()) { + rng.GetBytes(salt); + return salt; + } + } + + /// + /// Computes the hash. + /// + /// The password. + /// The salt. + /// String representation of hash. + protected string ComputeHash(byte[] password, byte[] salt) + { + using (var hasher = GetHashAlgorithm()) { + var hash = hasher.ComputeHash(salt.Concat(password).ToArray()); + return Convert.ToBase64String(hash.Concat(salt).ToArray()); + } + } + + #region IHashingService Members + + /// + public string ComputeHash(string password) + { + return ComputeHash(Encoding.UTF8.GetBytes(password), GetSalt()); + } + + /// + public bool VerifyHash(string password, string hash) + { + byte[] source; + try { + source = Convert.FromBase64String(hash); + } + catch (FormatException) { + return false; + } + + int hashSize; + using (var hasher = GetHashAlgorithm()) + hashSize = hasher.HashSize / 8; + + if (source.Length < hashSize) + return false; + + var salt = source.Skip(hashSize).ToArray(); + var currentHash = ComputeHash(Encoding.UTF8.GetBytes(password), salt); + return StringComparer.Ordinal.Compare(hash, currentHash)==0; + } + + #endregion + + /// + /// Initializes a new instance of the class. + /// + protected GenericHashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/MD5HashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/MD5HashingService.cs index 18128ccfff..ba57eafb89 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/MD5HashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/MD5HashingService.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Cryptography; -using System.Text; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of with MD5 algorithm. - /// - [Service(typeof (IHashingService), Singleton = true, Name = "md5")] - public class MD5HashingService : GenericHashingService - { - /// - protected override HashAlgorithm GetHashAlgorithm() - { - return new MD5CryptoServiceProvider(); - } - - /// - /// Initializes a new instance of the class. - /// - public MD5HashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Cryptography; +using System.Text; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of with MD5 algorithm. + /// + [Service(typeof (IHashingService), Singleton = true, Name = "md5")] + public class MD5HashingService : GenericHashingService + { + /// + protected override HashAlgorithm GetHashAlgorithm() + { + return new MD5CryptoServiceProvider(); + } + + /// + /// Initializes a new instance of the class. + /// + public MD5HashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/PlainHashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/PlainHashingService.cs index bf9663f266..db8ccfe314 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/PlainHashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/PlainHashingService.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of without any hashing. - /// - [Service(typeof(IHashingService), Singleton = true, Name = "plain")] - public class PlainHashingService : IHashingService - { - /// - public string ComputeHash(string password) - { - return password; - } - - /// - public bool VerifyHash(string password, string hash) - { - return StringComparer.Ordinal.Compare(password, hash) == 0; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of without any hashing. + /// + [Service(typeof(IHashingService), Singleton = true, Name = "plain")] + public class PlainHashingService : IHashingService + { + /// + public string ComputeHash(string password) + { + return password; + } + + /// + public bool VerifyHash(string password, string hash) + { + return StringComparer.Ordinal.Compare(password, hash) == 0; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/SHA1HashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/SHA1HashingService.cs index ac1a5d658e..03a71e6cc3 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/SHA1HashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/SHA1HashingService.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Cryptography; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of with SHA1 algorithm. - /// - [Service(typeof (IHashingService), Singleton = true, Name = "sha1")] - public class SHA1HashingService : GenericHashingService - { - /// - protected override HashAlgorithm GetHashAlgorithm() - { - return new SHA1Managed(); - } - - /// - /// Initializes a new instance of the class. - /// - public SHA1HashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Cryptography; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of with SHA1 algorithm. + /// + [Service(typeof (IHashingService), Singleton = true, Name = "sha1")] + public class SHA1HashingService : GenericHashingService + { + /// + protected override HashAlgorithm GetHashAlgorithm() + { + return new SHA1Managed(); + } + + /// + /// Initializes a new instance of the class. + /// + public SHA1HashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/SHA256HashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/SHA256HashingService.cs index dbf715bc2d..01ad385ccb 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/SHA256HashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/SHA256HashingService.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Cryptography; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of with SHA256 algorithm. - /// - [Service(typeof (IHashingService), Singleton = true, Name = "sha256")] - public class SHA256HashingService : GenericHashingService - { - /// - protected override HashAlgorithm GetHashAlgorithm() - { - return new SHA256Managed(); - } - - /// - /// Initializes a new instance of the class. - /// - public SHA256HashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Cryptography; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of with SHA256 algorithm. + /// + [Service(typeof (IHashingService), Singleton = true, Name = "sha256")] + public class SHA256HashingService : GenericHashingService + { + /// + protected override HashAlgorithm GetHashAlgorithm() + { + return new SHA256Managed(); + } + + /// + /// Initializes a new instance of the class. + /// + public SHA256HashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/SHA384HashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/SHA384HashingService.cs index f52038fc44..f2a0b4e99b 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/SHA384HashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/SHA384HashingService.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Cryptography; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of with SHA384 algorithm. - /// - [Service(typeof (IHashingService), Singleton = true, Name = "sha384")] - public class SHA384HashingService : GenericHashingService - { - /// - protected override HashAlgorithm GetHashAlgorithm() - { - return new SHA384Managed(); - } - - /// - /// Initializes a new instance of the class. - /// - public SHA384HashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Cryptography; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of with SHA384 algorithm. + /// + [Service(typeof (IHashingService), Singleton = true, Name = "sha384")] + public class SHA384HashingService : GenericHashingService + { + /// + protected override HashAlgorithm GetHashAlgorithm() + { + return new SHA384Managed(); + } + + /// + /// Initializes a new instance of the class. + /// + public SHA384HashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Cryptography/SHA512HashingService.cs b/Extensions/Xtensive.Orm.Security/Cryptography/SHA512HashingService.cs index 3b70feb806..817a6b1e54 100644 --- a/Extensions/Xtensive.Orm.Security/Cryptography/SHA512HashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Cryptography/SHA512HashingService.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Cryptography; -using Xtensive.IoC; - -namespace Xtensive.Orm.Security.Cryptography -{ - /// - /// Implementation of with SHA512 algorithm. - /// - [Service(typeof (IHashingService), Singleton = true, Name = "sha512")] - public class SHA512HashingService : GenericHashingService - { - /// - protected override HashAlgorithm GetHashAlgorithm() - { - return new SHA512Managed(); - } - - /// - /// Initializes a new instance of the class. - /// - public SHA512HashingService() - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Cryptography; +using Xtensive.IoC; + +namespace Xtensive.Orm.Security.Cryptography +{ + /// + /// Implementation of with SHA512 algorithm. + /// + [Service(typeof (IHashingService), Singleton = true, Name = "sha512")] + public class SHA512HashingService : GenericHashingService + { + /// + protected override HashAlgorithm GetHashAlgorithm() + { + return new SHA512Managed(); + } + + /// + /// Initializes a new instance of the class. + /// + public SHA512HashingService() + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/GenericPrincipal.cs b/Extensions/Xtensive.Orm.Security/GenericPrincipal.cs index 4d32511db5..0e40a4f42b 100644 --- a/Extensions/Xtensive.Orm.Security/GenericPrincipal.cs +++ b/Extensions/Xtensive.Orm.Security/GenericPrincipal.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System; -using Xtensive.Orm; -using Xtensive.Orm.Security.Configuration; - -namespace Xtensive.Orm.Security -{ - /// - /// Defines generic principal that can be used in username/password authentication scheme. - /// - public abstract class GenericPrincipal : Principal - { - /// - /// Gets or sets the password hash. - /// - /// The password hash. - [Field(Length = 128)] - public string PasswordHash { get; protected set; } - - /// - /// Sets the password. - /// - /// The password. - public virtual void SetPassword(string password) - { - var config = Session.GetSecurityConfiguration(); - var service = Session.Services.Get(config.HashingServiceName); - - if (service == null) - throw new InvalidOperationException(string.Format("Hashing service by name {0} is not found. Check Xtensive.Security configuration", config.HashingServiceName)); - - PasswordHash = service.ComputeHash(password); - } - - /// - /// Initializes a new instance of the class. - /// - /// The session. - protected GenericPrincipal(Session session) - : base(session) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The session. - /// Key values. - protected GenericPrincipal(Session session, params object[] values) - : base(session, values) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System; +using Xtensive.Orm; +using Xtensive.Orm.Security.Configuration; + +namespace Xtensive.Orm.Security +{ + /// + /// Defines generic principal that can be used in username/password authentication scheme. + /// + public abstract class GenericPrincipal : Principal + { + /// + /// Gets or sets the password hash. + /// + /// The password hash. + [Field(Length = 128)] + public string PasswordHash { get; protected set; } + + /// + /// Sets the password. + /// + /// The password. + public virtual void SetPassword(string password) + { + var config = Session.GetSecurityConfiguration(); + var service = Session.Services.Get(config.HashingServiceName); + + if (service == null) + throw new InvalidOperationException(string.Format("Hashing service by name {0} is not found. Check Xtensive.Security configuration", config.HashingServiceName)); + + PasswordHash = service.ComputeHash(password); + } + + /// + /// Initializes a new instance of the class. + /// + /// The session. + protected GenericPrincipal(Session session) + : base(session) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The session. + /// Key values. + protected GenericPrincipal(Session session, params object[] values) + : base(session, values) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/ImpersonationContext.cs b/Extensions/Xtensive.Orm.Security/ImpersonationContext.cs index 2d2f5bf66a..2987438f6d 100644 --- a/Extensions/Xtensive.Orm.Security/ImpersonationContext.cs +++ b/Extensions/Xtensive.Orm.Security/ImpersonationContext.cs @@ -1,83 +1,83 @@ -using System; -using Xtensive.Core; - -namespace Xtensive.Orm.Security -{ - /// - /// Defines an impersonation context that holds a set of all permission for current user and - /// provides secure queries. - /// - public class ImpersonationContext : SessionBound, - IDisposable - { - private readonly IDisposable queryRootScope; - private readonly ImpersonationContext outerContext; - - /// - /// Gets or sets the current principal. - /// - /// The principal. - public IPrincipal Principal { get; private set; } - - /// - /// Gets or sets the permissions for the current principal. - /// - /// The permissions. - public PermissionSet Permissions { get; private set; } - - /// - /// Invalidates this instance. Permissions for the current principal will be recalculated. - /// - public void Invalidate() - { - Permissions = new PermissionSet(Principal.Roles); - } - - /// - /// Reverts the impersonation context to the outer one. - /// - public void Undo() - { - queryRootScope.Dispose(); - Session.UndoImpersonation(this, outerContext); - } - - /// - public void Dispose() - { - Dispose(true); - } - - /// - protected virtual void Dispose(bool disposing) - { - if (disposing) - Undo(); - } - - /// - /// Initializes a new instance of the class. - /// - /// The principal. - /// The outer context. - public ImpersonationContext(IPrincipal principal, ImpersonationContext outerContext) - : base(principal.Session) - { - ArgumentValidator.EnsureArgumentNotNull(principal, "principal"); - - this.outerContext = outerContext; - Principal = principal; - Permissions = new PermissionSet(principal.Roles); - - QueryEndpoint insecureQuery; - var existingBuilder = Session.Query.RootBuilder as SecureQueryRootBuilder; - if (existingBuilder != null) - insecureQuery = existingBuilder.InsecureQuery; - else - insecureQuery = Session.Query; - - queryRootScope = Session.OverrideQueryRoot( - new SecureQueryRootBuilder(Session, insecureQuery)); - } - } -} +using System; +using Xtensive.Core; + +namespace Xtensive.Orm.Security +{ + /// + /// Defines an impersonation context that holds a set of all permission for current user and + /// provides secure queries. + /// + public class ImpersonationContext : SessionBound, + IDisposable + { + private readonly IDisposable queryRootScope; + private readonly ImpersonationContext outerContext; + + /// + /// Gets or sets the current principal. + /// + /// The principal. + public IPrincipal Principal { get; private set; } + + /// + /// Gets or sets the permissions for the current principal. + /// + /// The permissions. + public PermissionSet Permissions { get; private set; } + + /// + /// Invalidates this instance. Permissions for the current principal will be recalculated. + /// + public void Invalidate() + { + Permissions = new PermissionSet(Principal.Roles); + } + + /// + /// Reverts the impersonation context to the outer one. + /// + public void Undo() + { + queryRootScope.Dispose(); + Session.UndoImpersonation(this, outerContext); + } + + /// + public void Dispose() + { + Dispose(true); + } + + /// + protected virtual void Dispose(bool disposing) + { + if (disposing) + Undo(); + } + + /// + /// Initializes a new instance of the class. + /// + /// The principal. + /// The outer context. + public ImpersonationContext(IPrincipal principal, ImpersonationContext outerContext) + : base(principal.Session) + { + ArgumentValidator.EnsureArgumentNotNull(principal, "principal"); + + this.outerContext = outerContext; + Principal = principal; + Permissions = new PermissionSet(principal.Roles); + + QueryEndpoint insecureQuery; + var existingBuilder = Session.Query.RootBuilder as SecureQueryRootBuilder; + if (existingBuilder != null) + insecureQuery = existingBuilder.InsecureQuery; + else + insecureQuery = Session.Query; + + queryRootScope = Session.OverrideQueryRoot( + new SecureQueryRootBuilder(Session, insecureQuery)); + } + } +} diff --git a/Extensions/Xtensive.Orm.Security/Interfaces/IAuthenticationService.cs b/Extensions/Xtensive.Orm.Security/Interfaces/IAuthenticationService.cs index cbfebc2287..2b632a7d56 100644 --- a/Extensions/Xtensive.Orm.Security/Interfaces/IAuthenticationService.cs +++ b/Extensions/Xtensive.Orm.Security/Interfaces/IAuthenticationService.cs @@ -1,27 +1,27 @@ -using System.Security.Principal; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Authentication service. - /// - public interface IAuthenticationService : ISessionService - { - /// - /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. - /// - /// The identity. - /// The arguments to validate, e.g. password. - /// instance if the credentials are valid and if they are not. - IPrincipal Authenticate(IIdentity identity, params object[] args); - - /// - /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. - /// - /// The user name. - /// The arguments to validate, e.g. password. - /// instance if the credentials are valid and if they are not. - IPrincipal Authenticate(string name, params object[] args); - } +using System.Security.Principal; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Authentication service. + /// + public interface IAuthenticationService : ISessionService + { + /// + /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. + /// + /// The identity. + /// The arguments to validate, e.g. password. + /// instance if the credentials are valid and if they are not. + IPrincipal Authenticate(IIdentity identity, params object[] args); + + /// + /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. + /// + /// The user name. + /// The arguments to validate, e.g. password. + /// instance if the credentials are valid and if they are not. + IPrincipal Authenticate(string name, params object[] args); + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Interfaces/IHashingService.cs b/Extensions/Xtensive.Orm.Security/Interfaces/IHashingService.cs index 2de1549271..fcf0e66f37 100644 --- a/Extensions/Xtensive.Orm.Security/Interfaces/IHashingService.cs +++ b/Extensions/Xtensive.Orm.Security/Interfaces/IHashingService.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Hashing service. - /// - public interface IHashingService : IDomainService - { - /// - /// Computes the hash. - /// - /// The password. - /// String representation of hash. - string ComputeHash(string password); - - /// - /// Verifies the hash. - /// - /// The password. - /// The hash. - /// if hashes are equal; otherwise . - bool VerifyHash(string password, string hash); - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Hashing service. + /// + public interface IHashingService : IDomainService + { + /// + /// Computes the hash. + /// + /// The password. + /// String representation of hash. + string ComputeHash(string password); + + /// + /// Verifies the hash. + /// + /// The password. + /// The hash. + /// if hashes are equal; otherwise . + bool VerifyHash(string password, string hash); + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Interfaces/IPrincipal.cs b/Extensions/Xtensive.Orm.Security/Interfaces/IPrincipal.cs index 26f78d1241..36a8f6b83c 100644 --- a/Extensions/Xtensive.Orm.Security/Interfaces/IPrincipal.cs +++ b/Extensions/Xtensive.Orm.Security/Interfaces/IPrincipal.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.26 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Defines the basic functionality of a principal object. - /// - public interface IPrincipal : IEntity, System.Security.Principal.IPrincipal - { - /// - /// Gets the name of the current principal. - /// - /// The name. - [Field] - string Name { get; } - - /// - /// Gets the roles of the current principal. - /// - /// The roles. - [Field] - EntitySet Roles { get; } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.26 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Defines the basic functionality of a principal object. + /// + public interface IPrincipal : IEntity, System.Security.Principal.IPrincipal + { + /// + /// Gets the name of the current principal. + /// + /// The name. + [Field] + string Name { get; } + + /// + /// Gets the roles of the current principal. + /// + /// The roles. + [Field] + EntitySet Roles { get; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Interfaces/IRole.cs b/Extensions/Xtensive.Orm.Security/Interfaces/IRole.cs index cc18f03b8a..e0c5937682 100644 --- a/Extensions/Xtensive.Orm.Security/Interfaces/IRole.cs +++ b/Extensions/Xtensive.Orm.Security/Interfaces/IRole.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.26 - -using System.Collections.Generic; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Defines a role. - /// - public interface IRole : IEntity - { - /// - /// Gets the name of the current role. - /// - /// The name. - [Field] - string Name { get; } - - /// - /// Gets the principals associated with the current role. - /// - /// The principals. - [Field] - [Association(PairTo = "Roles", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Principals { get; } - - /// - /// Gets the permissions associated with the current role. - /// - /// The permissions. - IList Permissions { get; } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.26 + +using System.Collections.Generic; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Defines a role. + /// + public interface IRole : IEntity + { + /// + /// Gets the name of the current role. + /// + /// The name. + [Field] + string Name { get; } + + /// + /// Gets the principals associated with the current role. + /// + /// The principals. + [Field] + [Association(PairTo = "Roles", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Principals { get; } + + /// + /// Gets the permissions associated with the current role. + /// + /// The permissions. + IList Permissions { get; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Permission.cs b/Extensions/Xtensive.Orm.Security/Permission.cs index 0b6cbe8cfb..2f04d3b2e0 100644 --- a/Extensions/Xtensive.Orm.Security/Permission.cs +++ b/Extensions/Xtensive.Orm.Security/Permission.cs @@ -1,128 +1,128 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.10 - -using System; -using System.Linq; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Defines a permission for a persistent type that is represented by property. - /// - public abstract class Permission - { - /// - /// Gets or sets the type of entity. - /// - /// The type of entity. - public Type Type { get; private set; } - - /// - /// Specifies whether a permission is given to read entities of . - /// - public bool CanRead { get; private set; } - - /// - /// Specifies whether a permission is given to write entities of . - /// - public bool CanWrite { get; private set; } - - /// - /// Gets or sets the query that filters entities of . - /// - public Func> Query { get; protected set; } - - #region GetHashcode & Equals members - - /// - public bool Equals(Permission other) - { - if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) return true; - return Equals(other.Type, Type) && other.CanRead.Equals(CanRead) && other.CanWrite.Equals(CanWrite) && Equals(other.Query, Query); - } - - /// - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != typeof (Permission)) return false; - return Equals((Permission) obj); - } - - /// - public override int GetHashCode() - { - unchecked { - int result = (Type != null ? Type.GetHashCode() : 0); - result = (result*397) ^ CanRead.GetHashCode(); - result = (result*397) ^ CanWrite.GetHashCode(); - result = (result*397) ^ (Query != null ? Query.GetHashCode() : 0); - return result; - } - } - - #endregion - - /// - /// Initializes a new instance of the class. - /// - /// The type of entity. - /// Specifies whether permission is given or not to write entities of type. - protected Permission(Type type, bool canWrite) - { - Type = type; - CanRead = true; - CanWrite = canWrite; - } - } - - /// - /// Defines a permission for a persistent type that is represented by property. - /// - /// Type of entity - public class Permission : Permission where T : class, IEntity - { - /// - /// Initializes a new instance of the class. - /// - public Permission() - : this(false) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Specifies whether permission is given or not to write entities of type. - public Permission(bool canWrite) - : base(typeof(T), canWrite) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The query that filters entities of type. - public Permission(Func> query) - : this(false, query) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Specifies whether permission is given or not to write entities of type. - /// The query that filters entities of type. - public Permission(bool canWrite, Func> query) - : base(typeof(T), canWrite) - { - Query = query; - } - } -} +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.10 + +using System; +using System.Linq; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Defines a permission for a persistent type that is represented by property. + /// + public abstract class Permission + { + /// + /// Gets or sets the type of entity. + /// + /// The type of entity. + public Type Type { get; private set; } + + /// + /// Specifies whether a permission is given to read entities of . + /// + public bool CanRead { get; private set; } + + /// + /// Specifies whether a permission is given to write entities of . + /// + public bool CanWrite { get; private set; } + + /// + /// Gets or sets the query that filters entities of . + /// + public Func> Query { get; protected set; } + + #region GetHashcode & Equals members + + /// + public bool Equals(Permission other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.Type, Type) && other.CanRead.Equals(CanRead) && other.CanWrite.Equals(CanWrite) && Equals(other.Query, Query); + } + + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Permission)) return false; + return Equals((Permission) obj); + } + + /// + public override int GetHashCode() + { + unchecked { + int result = (Type != null ? Type.GetHashCode() : 0); + result = (result*397) ^ CanRead.GetHashCode(); + result = (result*397) ^ CanWrite.GetHashCode(); + result = (result*397) ^ (Query != null ? Query.GetHashCode() : 0); + return result; + } + } + + #endregion + + /// + /// Initializes a new instance of the class. + /// + /// The type of entity. + /// Specifies whether permission is given or not to write entities of type. + protected Permission(Type type, bool canWrite) + { + Type = type; + CanRead = true; + CanWrite = canWrite; + } + } + + /// + /// Defines a permission for a persistent type that is represented by property. + /// + /// Type of entity + public class Permission : Permission where T : class, IEntity + { + /// + /// Initializes a new instance of the class. + /// + public Permission() + : this(false) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Specifies whether permission is given or not to write entities of type. + public Permission(bool canWrite) + : base(typeof(T), canWrite) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The query that filters entities of type. + public Permission(Func> query) + : this(false, query) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Specifies whether permission is given or not to write entities of type. + /// The query that filters entities of type. + public Permission(bool canWrite, Func> query) + : base(typeof(T), canWrite) + { + Query = query; + } + } +} diff --git a/Extensions/Xtensive.Orm.Security/PermissionSet.cs b/Extensions/Xtensive.Orm.Security/PermissionSet.cs index 3c3feb8a22..dce583dc1b 100644 --- a/Extensions/Xtensive.Orm.Security/PermissionSet.cs +++ b/Extensions/Xtensive.Orm.Security/PermissionSet.cs @@ -1,74 +1,74 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Xtensive.Orm.Security -{ - /// - /// A set of permissions. - /// - public class PermissionSet : IEnumerable - { - private readonly HashSet permissions = new HashSet(); - - /// - /// Gets the count. - /// - public int Count - { - get { return permissions.Count; } - } - - /// - /// Gets a permission specified by . - /// - /// The type of the permission. - public TPermission Get() - where TPermission : Permission - { - foreach (var item in this) { - var permission = item as TPermission; - if (permission != null) - return permission; - } - return null; - } - - /// - /// Determines whether this instance contains a permission of the specified with the specified predicate. - /// - /// The type of the permission. - /// The predicate. - /// - /// if this instance contains a permission of the specified with the specified predicate; otherwise, . - /// - public bool Contains(Func predicate) - where TPermission : Permission - { - var permission = Get(); - return permission != null && predicate(permission); - } - - /// - public IEnumerator GetEnumerator() - { - return ((IEnumerable) permissions).GetEnumerator(); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Initializes a new instance of the class. - /// - /// The roles. - public PermissionSet(IEnumerable roles) - { - foreach (var role in roles) - permissions.UnionWith(role.Permissions); - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Xtensive.Orm.Security +{ + /// + /// A set of permissions. + /// + public class PermissionSet : IEnumerable + { + private readonly HashSet permissions = new HashSet(); + + /// + /// Gets the count. + /// + public int Count + { + get { return permissions.Count; } + } + + /// + /// Gets a permission specified by . + /// + /// The type of the permission. + public TPermission Get() + where TPermission : Permission + { + foreach (var item in this) { + var permission = item as TPermission; + if (permission != null) + return permission; + } + return null; + } + + /// + /// Determines whether this instance contains a permission of the specified with the specified predicate. + /// + /// The type of the permission. + /// The predicate. + /// + /// if this instance contains a permission of the specified with the specified predicate; otherwise, . + /// + public bool Contains(Func predicate) + where TPermission : Permission + { + var permission = Get(); + return permission != null && predicate(permission); + } + + /// + public IEnumerator GetEnumerator() + { + return ((IEnumerable) permissions).GetEnumerator(); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Initializes a new instance of the class. + /// + /// The roles. + public PermissionSet(IEnumerable roles) + { + foreach (var role in roles) + permissions.UnionWith(role.Permissions); + } + } +} diff --git a/Extensions/Xtensive.Orm.Security/Principal.cs b/Extensions/Xtensive.Orm.Security/Principal.cs index b36b67f6a6..5ea0689765 100644 --- a/Extensions/Xtensive.Orm.Security/Principal.cs +++ b/Extensions/Xtensive.Orm.Security/Principal.cs @@ -1,66 +1,66 @@ -using System.Linq; -using System.Security.Principal; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Security -{ - /// - /// Base implementation. - /// - [Index("Name", Unique = true)] - public abstract class Principal : Entity, IPrincipal - { - private IIdentity identity; - - #region IPrincipal Members - - /// - [NotNullConstraint(IsImmediate = true)] - [Field(Length = 128)] - public string Name { get; set; } - - /// - [Field] - public EntitySet Roles { get; private set; } - - /// - public virtual IIdentity Identity - { - get - { - if (identity != null) - return identity; - - identity = new GenericIdentity(Name); - return identity; - } - } - - /// - public bool IsInRole(string role) - { - return Roles.Any(r => r.Name == role); - } - - #endregion - - /// - /// Initializes a new instance of the class. - /// - /// The session. - protected Principal(Session session) - : base(session) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The session. - /// Key values. - protected Principal(Session session, params object[] values) - : base(session, values) - { - } - } +using System.Linq; +using System.Security.Principal; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Security +{ + /// + /// Base implementation. + /// + [Index("Name", Unique = true)] + public abstract class Principal : Entity, IPrincipal + { + private IIdentity identity; + + #region IPrincipal Members + + /// + [NotNullConstraint(IsImmediate = true)] + [Field(Length = 128)] + public string Name { get; set; } + + /// + [Field] + public EntitySet Roles { get; private set; } + + /// + public virtual IIdentity Identity + { + get + { + if (identity != null) + return identity; + + identity = new GenericIdentity(Name); + return identity; + } + } + + /// + public bool IsInRole(string role) + { + return Roles.Any(r => r.Name == role); + } + + #endregion + + /// + /// Initializes a new instance of the class. + /// + /// The session. + protected Principal(Session session) + : base(session) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The session. + /// Key values. + protected Principal(Session session, params object[] values) + : base(session, values) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Readme.txt b/Extensions/Xtensive.Orm.Security/Readme.txt index 6b429d61ad..edad87223a 100644 --- a/Extensions/Xtensive.Orm.Security/Readme.txt +++ b/Extensions/Xtensive.Orm.Security/Readme.txt @@ -1,236 +1,236 @@ -===================== -Xtensive.Orm.Security -===================== - -Summary -------- -The extension provides full-fledged security layer (authentication services, principals, roles, secured queries) -There are 2 main parts that can also be used separately: authentication services and role-based access to domain entities - -Prerequisites -------------- -DataObjects.Net 0.1 or later (http://dataobjects.net) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Security assembly -2. Include types from Xtensive.Orm.Security assembly into the domain: - - - - - - - - - - - - -3. If you are planning to use one of authentication services add - -
- -and set up the desired hashing service: - - - - - - -Demo ----- - -1. Define a class that inherits GenericPrincipal class that will describe your users, e.g.: - - [HierarchyRoot] - public class User : GenericPrincipal - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string LastName { get; set; } - - [Field] - public string FirstName { get; set; } - - ... - - public User(Session session) : base(session) {} - } - -2. Having the User class defined, it can be used for user creation and authentication. - - // Creating a user - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var user = new User(session); - user.Name = "admin"; - user.SetPassword("password"); - transaction.Complete(); - } - } - - // Authenticating a user - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var user = session.Authenticate("admin", "password"); - transaction.Complete(); - } - } - -3. Define a hierarchy of roles. A role is a set of permissions for a job fuction within a company, e.g.: - -EmployeeRole -| -|- StockManagerRole -| -|- SalesRepresentativeRole - | - |- SalesManagerRole - | - |- SalesPresidentRole - - // This is base role for all employees - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public abstract class EmployeeRole : Role - { - [Field, Key] - public int Id { get; set; } - - protected override void RegisterPermissions() - { - // All employees can read products - RegisterPermission(new Permission()); - // All employees can read other employees - RegisterPermission(new Permission()); - } - - protected EmployeeRole(Session session) - : base(session) {} - } - - public class StockManagerRole : EmployeeRole - { - protected override void RegisterPermissions() - { - // Stock manager inherits Employee permissions - base.RegisterPermissions(); - - // Stock manager can read and write products - RegisterPermission(new Permission(canWrite:true)); - } - - public StockManagerRole(Session session) - : base(session) {} - } - - // Create instances of roles on first domain initialization - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - new SalesRepresentativeRole(session); - new SalesManagerRole(session); - new SalesPresidentRole(session); - new StockManagerRole(session); - transaction.Complete(); - } - } - -4. Members of staff are assigned particular roles, e.g.: - - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var stockManagerRole = session.Query.All().Single(); - var user = new User(session); - user.Name = "peter"; - user.SetPassword("password"); - user.Roles.Add(stockManagerRole); - transaction.Complete(); - } - } - -5. Checking whether a user has the required role - - user.IsInRole("StockManagerRole"); - // or - user.Roles.Contains(stockManagerRole); - -6. Session impersonation - - using (var imContext = session.Impersonate(user)) { - // inside the region the session is impersonated with the specified - // principal and set of their roles and permissions - - // Checking whether the user has a permission for reading Customer entities - imContext.Permissions.Contains>(p => p.CanRead); - - // Checking whether the user has a permission for writing to Customer entities - imContext.Permissions.Contains>(p => p.CanWrite); - - // another way - var p = imContext.Permissions.Get>(); - if (p != null && p.CanRead) - // allow doing some stuff - } - -To end the impersonation call ImpersonationContext.Undo() or Dispose() method. -Impersonation contexts can be nested, e.g.: - - using (var userContext = session.Impersonate(user)) { - // do some user-related stuff - - using (var adminContext = session.Impersonate(admin)) { - // do some admin stuff - } - - // we are still in user impersonation context - } - // no context here - -7. Secure (restrictive) queries -A role may set up a condition that will be automatically added to any query and limits the query results, e.g.: - - public class AutomobileManagerRole : EmployeeRole - { - private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) - { - return query.All() - .Where(customer => customer.IsAutomobileIndustry); - } - - protected override void RegisterPermissions() - { - base.RegisterPermissions(); - // This permission tells that a principal can read/write customers - // but only those that are returned by the specified condition - RegisterPermission(new CustomerPermission(true, GetCustomers)); - } - - public AutomobileManagerRole(Session session) - : base(session) {} - } - -Now all employees that have AutomobileManagerRole will read -customers that have IsAutomobileIndustry property set to true, e.g.: - - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var automobileManagerRole = session.Query.All().Single(); - var user = new User(session); - user.Name = "peter"; - user.SetPassword("password"); - user.Roles.Add(automobileManagerRole); - - using (var context = session.Impersonate(user)) { - var customers = Query.All(); - // Inside the impersonation context the above-mentioned query condition - // will be added automatically so user will get only automobile customers - } - transaction.Complete(); - } - } - -References ----------- +===================== +Xtensive.Orm.Security +===================== + +Summary +------- +The extension provides full-fledged security layer (authentication services, principals, roles, secured queries) +There are 2 main parts that can also be used separately: authentication services and role-based access to domain entities + +Prerequisites +------------- +DataObjects.Net 0.1 or later (http://dataobjects.net) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Security assembly +2. Include types from Xtensive.Orm.Security assembly into the domain: + + + + + + + + + + + + +3. If you are planning to use one of authentication services add + +
+ +and set up the desired hashing service: + + + + + + +Demo +---- + +1. Define a class that inherits GenericPrincipal class that will describe your users, e.g.: + + [HierarchyRoot] + public class User : GenericPrincipal + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string LastName { get; set; } + + [Field] + public string FirstName { get; set; } + + ... + + public User(Session session) : base(session) {} + } + +2. Having the User class defined, it can be used for user creation and authentication. + + // Creating a user + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var user = new User(session); + user.Name = "admin"; + user.SetPassword("password"); + transaction.Complete(); + } + } + + // Authenticating a user + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var user = session.Authenticate("admin", "password"); + transaction.Complete(); + } + } + +3. Define a hierarchy of roles. A role is a set of permissions for a job fuction within a company, e.g.: + +EmployeeRole +| +|- StockManagerRole +| +|- SalesRepresentativeRole + | + |- SalesManagerRole + | + |- SalesPresidentRole + + // This is base role for all employees + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public abstract class EmployeeRole : Role + { + [Field, Key] + public int Id { get; set; } + + protected override void RegisterPermissions() + { + // All employees can read products + RegisterPermission(new Permission()); + // All employees can read other employees + RegisterPermission(new Permission()); + } + + protected EmployeeRole(Session session) + : base(session) {} + } + + public class StockManagerRole : EmployeeRole + { + protected override void RegisterPermissions() + { + // Stock manager inherits Employee permissions + base.RegisterPermissions(); + + // Stock manager can read and write products + RegisterPermission(new Permission(canWrite:true)); + } + + public StockManagerRole(Session session) + : base(session) {} + } + + // Create instances of roles on first domain initialization + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + new SalesRepresentativeRole(session); + new SalesManagerRole(session); + new SalesPresidentRole(session); + new StockManagerRole(session); + transaction.Complete(); + } + } + +4. Members of staff are assigned particular roles, e.g.: + + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var stockManagerRole = session.Query.All().Single(); + var user = new User(session); + user.Name = "peter"; + user.SetPassword("password"); + user.Roles.Add(stockManagerRole); + transaction.Complete(); + } + } + +5. Checking whether a user has the required role + + user.IsInRole("StockManagerRole"); + // or + user.Roles.Contains(stockManagerRole); + +6. Session impersonation + + using (var imContext = session.Impersonate(user)) { + // inside the region the session is impersonated with the specified + // principal and set of their roles and permissions + + // Checking whether the user has a permission for reading Customer entities + imContext.Permissions.Contains>(p => p.CanRead); + + // Checking whether the user has a permission for writing to Customer entities + imContext.Permissions.Contains>(p => p.CanWrite); + + // another way + var p = imContext.Permissions.Get>(); + if (p != null && p.CanRead) + // allow doing some stuff + } + +To end the impersonation call ImpersonationContext.Undo() or Dispose() method. +Impersonation contexts can be nested, e.g.: + + using (var userContext = session.Impersonate(user)) { + // do some user-related stuff + + using (var adminContext = session.Impersonate(admin)) { + // do some admin stuff + } + + // we are still in user impersonation context + } + // no context here + +7. Secure (restrictive) queries +A role may set up a condition that will be automatically added to any query and limits the query results, e.g.: + + public class AutomobileManagerRole : EmployeeRole + { + private static IQueryable GetCustomers(ImpersonationContext context, QueryEndpoint query) + { + return query.All() + .Where(customer => customer.IsAutomobileIndustry); + } + + protected override void RegisterPermissions() + { + base.RegisterPermissions(); + // This permission tells that a principal can read/write customers + // but only those that are returned by the specified condition + RegisterPermission(new CustomerPermission(true, GetCustomers)); + } + + public AutomobileManagerRole(Session session) + : base(session) {} + } + +Now all employees that have AutomobileManagerRole will read +customers that have IsAutomobileIndustry property set to true, e.g.: + + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var automobileManagerRole = session.Query.All().Single(); + var user = new User(session); + user.Name = "peter"; + user.SetPassword("password"); + user.Roles.Add(automobileManagerRole); + + using (var context = session.Impersonate(user)) { + var customers = Query.All(); + // Inside the impersonation context the above-mentioned query condition + // will be added automatically so user will get only automobile customers + } + transaction.Complete(); + } + } + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Role.cs b/Extensions/Xtensive.Orm.Security/Role.cs index ad48bec285..a057bb225c 100644 --- a/Extensions/Xtensive.Orm.Security/Role.cs +++ b/Extensions/Xtensive.Orm.Security/Role.cs @@ -1,90 +1,90 @@ -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Security -{ - /// - /// Base implementation of interface. - /// - [Index("Name", Unique = true)] - public abstract class Role : Entity, IRole - { - private List permissions; - private ReadOnlyList readOnlyPermissions; - - /// - [NotNullConstraint(IsImmediate = true)] - [Field(Length = 128)] - public string Name { get; protected set; } - - /// - [Field] - public EntitySet Principals { get; private set; } - - /// - public IList Permissions - { - get { return readOnlyPermissions; } - } - - /// - /// Registers the permission. - /// - /// The permission. - protected void RegisterPermission(Permission permission) - { - if (permissions.Count == 0) { - permissions.Add(permission); - return; - } - - // Rewriting permission if any - for (int i = 0; i < permissions.Count; i++) { - var item = permissions[i]; - if (item.Type != permission.Type) - continue; - - permissions[i] = permission; - return; - } - - permissions.Add(permission); - } - - /// - protected override void OnInitialize() - { - base.OnInitialize(); - permissions = new List(); - readOnlyPermissions = new ReadOnlyList(permissions); - RegisterPermissions(); - } - - /// - /// Registers the permissions. - /// - protected abstract void RegisterPermissions(); - - /// - /// Initializes a new instance of the class. - /// - /// The session. - protected Role(Session session) - : base(session) - { - Name = GetType().Name; - } - - /// - /// Initializes a new instance of the class. - /// - /// The session. - /// Key values. - protected Role(Session session, params object[] values) - : base(session, values) - { - Name = GetType().Name; - } - } -} +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Security +{ + /// + /// Base implementation of interface. + /// + [Index("Name", Unique = true)] + public abstract class Role : Entity, IRole + { + private List permissions; + private ReadOnlyList readOnlyPermissions; + + /// + [NotNullConstraint(IsImmediate = true)] + [Field(Length = 128)] + public string Name { get; protected set; } + + /// + [Field] + public EntitySet Principals { get; private set; } + + /// + public IList Permissions + { + get { return readOnlyPermissions; } + } + + /// + /// Registers the permission. + /// + /// The permission. + protected void RegisterPermission(Permission permission) + { + if (permissions.Count == 0) { + permissions.Add(permission); + return; + } + + // Rewriting permission if any + for (int i = 0; i < permissions.Count; i++) { + var item = permissions[i]; + if (item.Type != permission.Type) + continue; + + permissions[i] = permission; + return; + } + + permissions.Add(permission); + } + + /// + protected override void OnInitialize() + { + base.OnInitialize(); + permissions = new List(); + readOnlyPermissions = new ReadOnlyList(permissions); + RegisterPermissions(); + } + + /// + /// Registers the permissions. + /// + protected abstract void RegisterPermissions(); + + /// + /// Initializes a new instance of the class. + /// + /// The session. + protected Role(Session session) + : base(session) + { + Name = GetType().Name; + } + + /// + /// Initializes a new instance of the class. + /// + /// The session. + /// Key values. + protected Role(Session session, params object[] values) + : base(session, values) + { + Name = GetType().Name; + } + } +} diff --git a/Extensions/Xtensive.Orm.Security/SecureQueryRootBuilder.cs b/Extensions/Xtensive.Orm.Security/SecureQueryRootBuilder.cs index 9fe636d2d7..4bf8042d42 100644 --- a/Extensions/Xtensive.Orm.Security/SecureQueryRootBuilder.cs +++ b/Extensions/Xtensive.Orm.Security/SecureQueryRootBuilder.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using Xtensive.Linq; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// A with support of secure queries. - /// - public class SecureQueryRootBuilder : QueryRootBuilder - { - private Session session; - internal QueryEndpoint InsecureQuery { get; private set; } - - /// - protected override Expression BuildRootExpression() - { - var context = session.GetImpersonationContext(); - if (context == null) - return InsecureQuery.All().Expression; - - return GetSecureQuery(context).Expression; - } - - private IQueryable GetSecureQuery(ImpersonationContext context) where T: class, IEntity - { - var candidates = new List>(); - var queryType = typeof(T); - - foreach (var permission in context.Permissions) { - var permissionType = permission.Type; - - // Query & Permission - if (queryType == permissionType) { - // Permission doesn't have restrictive query. Investigation of other permissions doesn't make sense - if (permission.Query == null) - return InsecureQuery.All(); - - candidates.Add((IQueryable) permission.Query(context, InsecureQuery)); - } - // Query && Permission - else if (queryType.IsAssignableFrom(permissionType)) { - // Permission doesn't have restrictive query. Adding Query to candidates - if (permission.Query == null) { - candidates.Add((IQueryable) InsecureQuery.All(permissionType)); - continue; - } - var p = Expression.Parameter(queryType, "p"); - var where = (Expression>) FastExpression.Lambda(Expression.Not(Expression.TypeIs(p, permissionType)), p); - candidates.Add(InsecureQuery.All().Where(where).Concat(permission.Query(context, InsecureQuery).OfType())); - } - // Query && Permission - else if (permissionType.IsAssignableFrom(queryType)) { - // Permission doesn't have restrictive query. Investigation of other permissions doesn't make sense - if (permission.Query == null) - return InsecureQuery.All(); - - candidates.Add(permission.Query(context, InsecureQuery).OfType()); - } - } - if (candidates.Count == 0) - return InsecureQuery.All(); - - if (candidates.Count == 1) - return candidates[0]; - - var result = candidates[0]; - for (int i = 1; i < candidates.Count; i++) - result = result.Union(candidates[i]); - - return result; - } - - - /// - /// Initializes a new instance of the class. - /// - /// The session. - /// The original instance. - public SecureQueryRootBuilder(Session session, QueryEndpoint origin) - { - this.session = session; - InsecureQuery = origin; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using Xtensive.Linq; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// A with support of secure queries. + /// + public class SecureQueryRootBuilder : QueryRootBuilder + { + private Session session; + internal QueryEndpoint InsecureQuery { get; private set; } + + /// + protected override Expression BuildRootExpression() + { + var context = session.GetImpersonationContext(); + if (context == null) + return InsecureQuery.All().Expression; + + return GetSecureQuery(context).Expression; + } + + private IQueryable GetSecureQuery(ImpersonationContext context) where T: class, IEntity + { + var candidates = new List>(); + var queryType = typeof(T); + + foreach (var permission in context.Permissions) { + var permissionType = permission.Type; + + // Query & Permission + if (queryType == permissionType) { + // Permission doesn't have restrictive query. Investigation of other permissions doesn't make sense + if (permission.Query == null) + return InsecureQuery.All(); + + candidates.Add((IQueryable) permission.Query(context, InsecureQuery)); + } + // Query && Permission + else if (queryType.IsAssignableFrom(permissionType)) { + // Permission doesn't have restrictive query. Adding Query to candidates + if (permission.Query == null) { + candidates.Add((IQueryable) InsecureQuery.All(permissionType)); + continue; + } + var p = Expression.Parameter(queryType, "p"); + var where = (Expression>) FastExpression.Lambda(Expression.Not(Expression.TypeIs(p, permissionType)), p); + candidates.Add(InsecureQuery.All().Where(where).Concat(permission.Query(context, InsecureQuery).OfType())); + } + // Query && Permission + else if (permissionType.IsAssignableFrom(queryType)) { + // Permission doesn't have restrictive query. Investigation of other permissions doesn't make sense + if (permission.Query == null) + return InsecureQuery.All(); + + candidates.Add(permission.Query(context, InsecureQuery).OfType()); + } + } + if (candidates.Count == 0) + return InsecureQuery.All(); + + if (candidates.Count == 1) + return candidates[0]; + + var result = candidates[0]; + for (int i = 1; i < candidates.Count; i++) + result = result.Union(candidates[i]); + + return result; + } + + + /// + /// Initializes a new instance of the class. + /// + /// The session. + /// The original instance. + public SecureQueryRootBuilder(Session session, QueryEndpoint origin) + { + this.session = session; + InsecureQuery = origin; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Services/GenericAuthenticationService.cs b/Extensions/Xtensive.Orm.Security/Services/GenericAuthenticationService.cs index 1ec4777651..2d90a97929 100644 --- a/Extensions/Xtensive.Orm.Security/Services/GenericAuthenticationService.cs +++ b/Extensions/Xtensive.Orm.Security/Services/GenericAuthenticationService.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.16 - -using System; -using System.Linq; -using System.Security.Principal; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Orm; - -namespace Xtensive.Orm.Security -{ - /// - /// Provides authentication for with username/password authentication scheme. - /// - [Service(typeof(IAuthenticationService), Singleton = true, Name = "default")] - public class GenericAuthenticationService : SessionBound, IAuthenticationService - { - /// - public IPrincipal Authenticate(IIdentity identity, params object[] args) - { - ArgumentValidator.EnsureArgumentNotNull(identity, "identity"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(identity.Name, "identity.Name"); - - return Authenticate(identity.Name, args); - } - - /// - public IPrincipal Authenticate(string name, params object[] args) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - - string password = string.Empty; - if (args != null && args.Length > 0) - password = (string) args[0]; - - return Authenticate(name, password); - - } - - /// - /// Authenticates the specified username and password pair. - /// - /// The username. - /// The password. - /// instance if the credentials are valid and if they are not. - protected virtual IPrincipal Authenticate(string username, string password) - { - var config = Session.GetSecurityConfiguration(); - var service = Session.Services.Get(config.HashingServiceName); - - if (service == null) - throw new InvalidOperationException(string.Format("Hashing service by name {0} is not found. Check Xtensive.Security configuration", config.HashingServiceName)); - - // GenericPrincipal is not in the model, let's find its descendant - var model = Session.Domain.Model; - var rootPrincipalType = model.Hierarchies - .Select(h => h.Root.UnderlyingType) - .FirstOrDefault(t => typeof (GenericPrincipal).IsAssignableFrom(t)); - - if (rootPrincipalType == null) - throw new InvalidOperationException("No descendants of GenericPrincipal type are found in domain model"); - - var candidate = (Session.Query.All(rootPrincipalType) as IQueryable) - .Where(u => u.Name == username) - .SingleOrDefault(); - - if (candidate != null && service.VerifyHash(password, candidate.PasswordHash)) - return candidate; - - return null; - } - - /// - /// Initializes a new instance of the class. - /// - /// , to which current instance - /// is bound. - /// - /// is . - [ServiceConstructor] - public GenericAuthenticationService(Session session) - : base(session) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.16 + +using System; +using System.Linq; +using System.Security.Principal; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Orm; + +namespace Xtensive.Orm.Security +{ + /// + /// Provides authentication for with username/password authentication scheme. + /// + [Service(typeof(IAuthenticationService), Singleton = true, Name = "default")] + public class GenericAuthenticationService : SessionBound, IAuthenticationService + { + /// + public IPrincipal Authenticate(IIdentity identity, params object[] args) + { + ArgumentValidator.EnsureArgumentNotNull(identity, "identity"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(identity.Name, "identity.Name"); + + return Authenticate(identity.Name, args); + } + + /// + public IPrincipal Authenticate(string name, params object[] args) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + + string password = string.Empty; + if (args != null && args.Length > 0) + password = (string) args[0]; + + return Authenticate(name, password); + + } + + /// + /// Authenticates the specified username and password pair. + /// + /// The username. + /// The password. + /// instance if the credentials are valid and if they are not. + protected virtual IPrincipal Authenticate(string username, string password) + { + var config = Session.GetSecurityConfiguration(); + var service = Session.Services.Get(config.HashingServiceName); + + if (service == null) + throw new InvalidOperationException(string.Format("Hashing service by name {0} is not found. Check Xtensive.Security configuration", config.HashingServiceName)); + + // GenericPrincipal is not in the model, let's find its descendant + var model = Session.Domain.Model; + var rootPrincipalType = model.Hierarchies + .Select(h => h.Root.UnderlyingType) + .FirstOrDefault(t => typeof (GenericPrincipal).IsAssignableFrom(t)); + + if (rootPrincipalType == null) + throw new InvalidOperationException("No descendants of GenericPrincipal type are found in domain model"); + + var candidate = (Session.Query.All(rootPrincipalType) as IQueryable) + .Where(u => u.Name == username) + .SingleOrDefault(); + + if (candidate != null && service.VerifyHash(password, candidate.PasswordHash)) + return candidate; + + return null; + } + + /// + /// Initializes a new instance of the class. + /// + /// , to which current instance + /// is bound. + /// + /// is . + [ServiceConstructor] + public GenericAuthenticationService(Session session) + : base(session) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/SessionExtensions.cs b/Extensions/Xtensive.Orm.Security/SessionExtensions.cs index 4da78cb50c..4df2ecefb4 100644 --- a/Extensions/Xtensive.Orm.Security/SessionExtensions.cs +++ b/Extensions/Xtensive.Orm.Security/SessionExtensions.cs @@ -1,126 +1,126 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.22 - -using System.Security.Principal; -using Xtensive.Core; -using Xtensive.Orm.Security; -using Xtensive.Orm.Security.Configuration; -using IPrincipal = Xtensive.Orm.Security.IPrincipal; - -namespace Xtensive.Orm -{ - /// - /// Session extension methods for security-related stuff. - /// - public static class SessionExtensions - { - /// - /// Gets the security configuration. - /// - /// The session. - /// instance. - public static SecurityConfiguration GetSecurityConfiguration(this Session session) - { - var result = session.Domain.Extensions.Get(); - if (result == null) { - result = SecurityConfiguration.Load(); - session.Domain.Extensions.Set(result); - } - return result; - } - - /// - /// Gets the current impersonation context. - /// - /// The session. - /// instance. - public static ImpersonationContext GetImpersonationContext(this Session session) - { - ArgumentValidator.EnsureArgumentNotNull(session, "session"); - - return session.Extensions.Get(); - } - - /// - /// Impersonates the specified session. - /// - /// The session. - /// The principal. - /// instance. - public static ImpersonationContext Impersonate(this Session session, IPrincipal principal) - { - ArgumentValidator.EnsureArgumentNotNull(session, "session"); - ArgumentValidator.EnsureArgumentNotNull(principal, "principal"); - - var currentContext = session.GetImpersonationContext(); - - var context = new ImpersonationContext(principal, currentContext); - session.Extensions.Set(context); - - return context; - } - - /// - /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. - /// - /// The session. - /// The identity. - /// The arguments to validate, e.g. password. - /// - /// instance if the credentials are valid and if they are not. - /// - public static IPrincipal Authenticate(this Session session, IIdentity identity, params object[] args) - { - return Authenticate(session, identity.Name, args); - } - - /// - /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. - /// - /// The session. - /// The user name. - /// The arguments to validate, e.g. password. - /// - /// instance if the credentials are valid and if they are not. - /// - public static IPrincipal Authenticate(this Session session, string name, params object[] args) - { - var config = GetSecurityConfiguration(session); - var service = session.Services.Get(config.AuthenticationServiceName); - return service.Authenticate(name, args); - } - - private static void ClearImpersonationContext(this Session session) - { - ArgumentValidator.EnsureArgumentNotNull(session, "session"); - - session.Extensions.Set(null); - } - - private static void SetImpersonationContext(this Session session, ImpersonationContext context) - { - ArgumentValidator.EnsureArgumentNotNull(session, "session"); - ArgumentValidator.EnsureArgumentNotNull(context, "context"); - - session.Extensions.Set(context); - } - - internal static void UndoImpersonation(this Session session, ImpersonationContext innerContext, ImpersonationContext outerContext) - { - ArgumentValidator.EnsureArgumentNotNull(session, "session"); - ArgumentValidator.EnsureArgumentNotNull(innerContext, "innerContext"); - // outerContext can be null - - var currentContext = session.GetImpersonationContext(); - if (currentContext != innerContext) - return; - - session.ClearImpersonationContext(); - if (outerContext != null) - session.SetImpersonationContext(outerContext); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.22 + +using System.Security.Principal; +using Xtensive.Core; +using Xtensive.Orm.Security; +using Xtensive.Orm.Security.Configuration; +using IPrincipal = Xtensive.Orm.Security.IPrincipal; + +namespace Xtensive.Orm +{ + /// + /// Session extension methods for security-related stuff. + /// + public static class SessionExtensions + { + /// + /// Gets the security configuration. + /// + /// The session. + /// instance. + public static SecurityConfiguration GetSecurityConfiguration(this Session session) + { + var result = session.Domain.Extensions.Get(); + if (result == null) { + result = SecurityConfiguration.Load(); + session.Domain.Extensions.Set(result); + } + return result; + } + + /// + /// Gets the current impersonation context. + /// + /// The session. + /// instance. + public static ImpersonationContext GetImpersonationContext(this Session session) + { + ArgumentValidator.EnsureArgumentNotNull(session, "session"); + + return session.Extensions.Get(); + } + + /// + /// Impersonates the specified session. + /// + /// The session. + /// The principal. + /// instance. + public static ImpersonationContext Impersonate(this Session session, IPrincipal principal) + { + ArgumentValidator.EnsureArgumentNotNull(session, "session"); + ArgumentValidator.EnsureArgumentNotNull(principal, "principal"); + + var currentContext = session.GetImpersonationContext(); + + var context = new ImpersonationContext(principal, currentContext); + session.Extensions.Set(context); + + return context; + } + + /// + /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. + /// + /// The session. + /// The identity. + /// The arguments to validate, e.g. password. + /// + /// instance if the credentials are valid and if they are not. + /// + public static IPrincipal Authenticate(this Session session, IIdentity identity, params object[] args) + { + return Authenticate(session, identity.Name, args); + } + + /// + /// Authenticates a user's credentials. Returns instance if the credentials are valid and if they are not. + /// + /// The session. + /// The user name. + /// The arguments to validate, e.g. password. + /// + /// instance if the credentials are valid and if they are not. + /// + public static IPrincipal Authenticate(this Session session, string name, params object[] args) + { + var config = GetSecurityConfiguration(session); + var service = session.Services.Get(config.AuthenticationServiceName); + return service.Authenticate(name, args); + } + + private static void ClearImpersonationContext(this Session session) + { + ArgumentValidator.EnsureArgumentNotNull(session, "session"); + + session.Extensions.Set(null); + } + + private static void SetImpersonationContext(this Session session, ImpersonationContext context) + { + ArgumentValidator.EnsureArgumentNotNull(session, "session"); + ArgumentValidator.EnsureArgumentNotNull(context, "context"); + + session.Extensions.Set(context); + } + + internal static void UndoImpersonation(this Session session, ImpersonationContext innerContext, ImpersonationContext outerContext) + { + ArgumentValidator.EnsureArgumentNotNull(session, "session"); + ArgumentValidator.EnsureArgumentNotNull(innerContext, "innerContext"); + // outerContext can be null + + var currentContext = session.GetImpersonationContext(); + if (currentContext != innerContext) + return; + + session.ClearImpersonationContext(); + if (outerContext != null) + session.SetImpersonationContext(outerContext); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Security/Xtensive.Orm.Security.csproj b/Extensions/Xtensive.Orm.Security/Xtensive.Orm.Security.csproj index e58b6eb801..87750c89fd 100644 --- a/Extensions/Xtensive.Orm.Security/Xtensive.Orm.Security.csproj +++ b/Extensions/Xtensive.Orm.Security/Xtensive.Orm.Security.csproj @@ -1,29 +1,29 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Security - Security extension for $(DoProductName) - $(Title) - Adds security layer for $(DoProductName)-powered projects - true - ..\Extensions.snk - - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Security + Security extension for $(DoProductName) + $(Title) + Adds security layer for $(DoProductName)-powered projects + true + ..\Extensions.snk + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/App.config b/Extensions/Xtensive.Orm.Tracking.Tests/App.config index 57eba09a35..08f6fa3e54 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/App.config +++ b/Extensions/Xtensive.Orm.Tracking.Tests/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/AutoBuildTest.cs b/Extensions/Xtensive.Orm.Tracking.Tests/AutoBuildTest.cs index 5e92b5131e..7efc93a30e 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/AutoBuildTest.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/AutoBuildTest.cs @@ -1,61 +1,61 @@ -using NUnit.Framework; -using System; -using TestCommon; -using Xtensive.Core; -using Xtensive.Orm.Tracking.Tests.Model; -using Xtensive.Reflection; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tracking.Tests -{ - [TestFixture] - public abstract class AutoBuildTest - { - protected Domain Domain { get; private set; } - - [SetUp] - public virtual void TestSetUp() - { - - } - - [TearDown] - public virtual void TestTearDown() - { - - } - - [OneTimeSetUp] - public virtual void TestFixtureSetUp() - { - var config = BuildConfiguration(); - Domain = BuildDomain(config); - } - - [OneTimeTearDown] - public virtual void TestFixtureTearDown() - { - Domain.DisposeSafely(); - } - - protected virtual DomainConfiguration BuildConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (ITrackingMonitor).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly); - return configuration; - } - - protected virtual Domain BuildDomain(DomainConfiguration configuration) - { - try { - return Domain.Build(configuration); - } - catch (Exception e) { - Console.WriteLine(GetType().GetFullName()); - Console.WriteLine(e); - throw; - } - } - } -} +using NUnit.Framework; +using System; +using TestCommon; +using Xtensive.Core; +using Xtensive.Orm.Tracking.Tests.Model; +using Xtensive.Reflection; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tracking.Tests +{ + [TestFixture] + public abstract class AutoBuildTest + { + protected Domain Domain { get; private set; } + + [SetUp] + public virtual void TestSetUp() + { + + } + + [TearDown] + public virtual void TestTearDown() + { + + } + + [OneTimeSetUp] + public virtual void TestFixtureSetUp() + { + var config = BuildConfiguration(); + Domain = BuildDomain(config); + } + + [OneTimeTearDown] + public virtual void TestFixtureTearDown() + { + Domain.DisposeSafely(); + } + + protected virtual DomainConfiguration BuildConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (ITrackingMonitor).Assembly); + configuration.Types.Register(typeof (AutoBuildTest).Assembly); + return configuration; + } + + protected virtual Domain BuildDomain(DomainConfiguration configuration) + { + try { + return Domain.Build(configuration); + } + catch (Exception e) { + Console.WriteLine(GetType().GetFullName()); + Console.WriteLine(e); + throw; + } + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyChildEntity.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyChildEntity.cs index 28629871eb..015cce0831 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyChildEntity.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyChildEntity.cs @@ -1,18 +1,18 @@ -namespace Xtensive.Orm.Tracking.Tests.Model -{ - public class MyChildEntity : MyEntity - { - [Field] - public string ChildField { get; set; } - - public MyChildEntity(Session session) - : base(session) - { - } - - public MyChildEntity(Session session, int id) - : base(session, id) - { - } - } +namespace Xtensive.Orm.Tracking.Tests.Model +{ + public class MyChildEntity : MyEntity + { + [Field] + public string ChildField { get; set; } + + public MyChildEntity(Session session) + : base(session) + { + } + + public MyChildEntity(Session session, int id) + : base(session, id) + { + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntity.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntity.cs index 0e04352935..6a7bebe7f3 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntity.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntity.cs @@ -1,47 +1,47 @@ -using System; - -namespace Xtensive.Orm.Tracking.Tests.Model -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field(Length = 100)] - public string Text2 { get; set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - public int Int { get; set; } - - [Field] - public MyEnum Enum { get; set; } - - [Field] - public MyStructure Structure { get; set; } - - [Field] - public MyReferenceProperty Property { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; set; } - - public MyEntity(Session session) - : base(session) - { - } - - public MyEntity(Session session, int id) - : base(session, id) - { - } - } -} +using System; + +namespace Xtensive.Orm.Tracking.Tests.Model +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field(Length = 100)] + public string Text2 { get; set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + public int Int { get; set; } + + [Field] + public MyEnum Enum { get; set; } + + [Field] + public MyStructure Structure { get; set; } + + [Field] + public MyReferenceProperty Property { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; set; } + + public MyEntity(Session session) + : base(session) + { + } + + public MyEntity(Session session, int id) + : base(session, id) + { + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntitySetItem.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntitySetItem.cs index c6904385f2..cc9e97f154 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntitySetItem.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEntitySetItem.cs @@ -1,28 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tracking.Tests.Model -{ - [HierarchyRoot] - public class MyEntitySetItem : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field(Length = 100)] - public string ItemText { get; set; } - - public MyEntitySetItem() - : base() - { - } - - public MyEntitySetItem(Session session) - : base(session) - { - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tracking.Tests.Model +{ + [HierarchyRoot] + public class MyEntitySetItem : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field(Length = 100)] + public string ItemText { get; set; } + + public MyEntitySetItem() + : base() + { + } + + public MyEntitySetItem(Session session) + : base(session) + { + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEnum.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEnum.cs index b05a922027..2c684efee6 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEnum.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyEnum.cs @@ -1,13 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Xtensive.Orm.Tracking.Tests.Model -{ - public enum MyEnum - { - First, - Second - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Xtensive.Orm.Tracking.Tests.Model +{ + public enum MyEnum + { + First, + Second + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyReferenceProperty.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyReferenceProperty.cs index a9a53d825e..1482804f69 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyReferenceProperty.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyReferenceProperty.cs @@ -1,28 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tracking.Tests.Model -{ - [HierarchyRoot] - public class MyReferenceProperty : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - public MyReferenceProperty() - : base() - { - } - - public MyReferenceProperty(Session session) - : base(session) - { - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tracking.Tests.Model +{ + [HierarchyRoot] + public class MyReferenceProperty : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + public MyReferenceProperty() + : base() + { + } + + public MyReferenceProperty(Session session) + : base(session) + { + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyStructure.cs b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyStructure.cs index e03d263296..96f578ab39 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyStructure.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Model/MyStructure.cs @@ -1,40 +1,40 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tracking.Tests.Model -{ - public class MyStructure : Structure - { - [Field] - public MyEntitySubStructure SubStructure { get; set; } - - [Field] - public int Z { get; set; } - - public MyStructure() : base() { } - public MyStructure(Session session) : base(session) {} - public override string ToString() - { - return string.Format("MyEntityStructure: Z={0}, SubStructure=({1})", Z, SubStructure); - } - } - - public class MyEntitySubStructure : Structure - { - [Field] - public int X { get; set; } - - [Field] - public int Y { get; set; } - - public MyEntitySubStructure() : base() { } - public MyEntitySubStructure(Session session) : base(session) { } - public override string ToString() - { - return string.Format("MyEntitySubStructure: X={0}, Y={1}", X, Y); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tracking.Tests.Model +{ + public class MyStructure : Structure + { + [Field] + public MyEntitySubStructure SubStructure { get; set; } + + [Field] + public int Z { get; set; } + + public MyStructure() : base() { } + public MyStructure(Session session) : base(session) {} + public override string ToString() + { + return string.Format("MyEntityStructure: Z={0}, SubStructure=({1})", Z, SubStructure); + } + } + + public class MyEntitySubStructure : Structure + { + [Field] + public int X { get; set; } + + [Field] + public int Y { get; set; } + + public MyEntitySubStructure() : base() { } + public MyEntitySubStructure(Session session) : base(session) { } + public override string ToString() + { + return string.Format("MyEntitySubStructure: X={0}, Y={1}", X, Y); + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/ServiceRegistrationTest.cs b/Extensions/Xtensive.Orm.Tracking.Tests/ServiceRegistrationTest.cs index 31bbbe242f..7e5f32f0dc 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/ServiceRegistrationTest.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/ServiceRegistrationTest.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.16 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tracking.Tests -{ - [TestFixture] - public class ServiceRegistrationTest : AutoBuildTest - { - [Test] - public void ShouldReturnInstanceOfTrackingMonitor() - { - var tm = Domain.Services.Get(); - Assert.IsNotNull(tm); - } - - [Test] - public void ShouldReturnSameInstanceOfTrackingMonitor() - { - var tm1 = Domain.Services.Get(); - var tm2 = Domain.Services.Get(); - Assert.AreSame(tm1, tm2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.16 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tracking.Tests +{ + [TestFixture] + public class ServiceRegistrationTest : AutoBuildTest + { + [Test] + public void ShouldReturnInstanceOfTrackingMonitor() + { + var tm = Domain.Services.Get(); + Assert.IsNotNull(tm); + } + + [Test] + public void ShouldReturnSameInstanceOfTrackingMonitor() + { + var tm1 = Domain.Services.Get(); + var tm2 = Domain.Services.Get(); + Assert.AreSame(tm1, tm2); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/TestHelper.cs b/Extensions/Xtensive.Orm.Tracking.Tests/TestHelper.cs index ae0a999085..e3125261b0 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/TestHelper.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/TestHelper.cs @@ -1,31 +1,31 @@ -using System; -using System.Reflection; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tracking.Tests -{ - public static class TestHelper - { - private static readonly Type TrackingItemType; - private static readonly MethodInfo MergeWithMethod; - - public static void Merge(ITrackingItem target, ITrackingItem source) - { - MergeWithMethod.Invoke(target, new object[] {source}); - } - - public static ITrackingItem CreateTrackingItem(Key key, TrackingItemState state) - { - var tuple = Tuple.Create(typeof (string)); - var diff = new DifferentialTuple(tuple); - return (ITrackingItem) Activator.CreateInstance(TrackingItemType, key, state, diff); - } - - static TestHelper() - { - TrackingItemType = typeof (ITrackingItem).Assembly.GetType("Xtensive.Orm.Tracking.TrackingItem"); - MergeWithMethod = TrackingItemType.GetMethod("MergeWith"); - } - } -} +using System; +using System.Reflection; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tracking.Tests +{ + public static class TestHelper + { + private static readonly Type TrackingItemType; + private static readonly MethodInfo MergeWithMethod; + + public static void Merge(ITrackingItem target, ITrackingItem source) + { + MergeWithMethod.Invoke(target, new object[] {source}); + } + + public static ITrackingItem CreateTrackingItem(Key key, TrackingItemState state) + { + var tuple = Tuple.Create(typeof (string)); + var diff = new DifferentialTuple(tuple); + return (ITrackingItem) Activator.CreateInstance(TrackingItemType, key, state, diff); + } + + static TestHelper() + { + TrackingItemType = typeof (ITrackingItem).Assembly.GetType("Xtensive.Orm.Tracking.TrackingItem"); + MergeWithMethod = TrackingItemType.GetMethod("MergeWith"); + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingItemTests.cs b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingItemTests.cs index 684ccc1e63..24338d1451 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingItemTests.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingItemTests.cs @@ -1,145 +1,145 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.16 - -using NUnit.Framework; -using Xtensive.Orm.Tracking.Tests.Model; -using Xtensive.Tuples; - -namespace Xtensive.Orm.Tracking.Tests -{ - [TestFixture] - public class TrackingItemTests : AutoBuildTest - { - [Test] - public void MergeNewAndNewTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); - target.RawData.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Created, target.State); - } - - [Test] - public void MergeNewAndModifiedTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); - target.RawData.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Created, target.State); - } - - [Test] - public void MergeNewAndRemovedTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); - target.RawData.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Deleted, target.State); - } - - [Test] - public void MergeModifiedAndModifiedTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); - target.RawData.Origin.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Changed, target.State); - } - - [Test] - public void MergeModifiedAndRemovedTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); - target.RawData.Origin.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Deleted, target.State); - } - - [Test] - public void MergeRemovedAndRemovedTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); - target.RawData.Origin.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Deleted, target.State); - } - - [Test] - public void MergeRemovedAndNewTest() - { - var key = Key.Create(Domain, typeof(MyEntity), 1); - - var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); - target.RawData.Origin.SetValue(0, "value1"); - - var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); - source.RawData.SetValue(0, "value2"); - - TestHelper.Merge(target, source); - - Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); - Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); - Assert.AreEqual(TrackingItemState.Changed, target.State); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.16 + +using NUnit.Framework; +using Xtensive.Orm.Tracking.Tests.Model; +using Xtensive.Tuples; + +namespace Xtensive.Orm.Tracking.Tests +{ + [TestFixture] + public class TrackingItemTests : AutoBuildTest + { + [Test] + public void MergeNewAndNewTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); + target.RawData.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Created, target.State); + } + + [Test] + public void MergeNewAndModifiedTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); + target.RawData.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Created, target.State); + } + + [Test] + public void MergeNewAndRemovedTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); + target.RawData.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Deleted, target.State); + } + + [Test] + public void MergeModifiedAndModifiedTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); + target.RawData.Origin.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Changed, target.State); + } + + [Test] + public void MergeModifiedAndRemovedTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Changed); + target.RawData.Origin.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Deleted, target.State); + } + + [Test] + public void MergeRemovedAndRemovedTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); + target.RawData.Origin.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsTrue(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value1", target.RawData.Origin.GetValue(0)); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Deleted, target.State); + } + + [Test] + public void MergeRemovedAndNewTest() + { + var key = Key.Create(Domain, typeof(MyEntity), 1); + + var target = TestHelper.CreateTrackingItem(key, TrackingItemState.Deleted); + target.RawData.Origin.SetValue(0, "value1"); + + var source = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); + source.RawData.SetValue(0, "value2"); + + TestHelper.Merge(target, source); + + Assert.IsFalse(target.RawData.Origin.GetFieldState(0) == TupleFieldState.Available); + Assert.AreEqual("value2", target.RawData.Difference.GetValue(0)); + Assert.AreEqual(TrackingItemState.Changed, target.State); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingMonitorTests.cs b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingMonitorTests.cs index b6597f75d4..88f4637377 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingMonitorTests.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingMonitorTests.cs @@ -1,405 +1,405 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.17 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tracking.Tests.Model; - -namespace Xtensive.Orm.Tracking.Tests -{ - [TestFixture] - public class TrackingMonitorTests : AutoBuildTest - { - private bool listenerIsCalled; - - public override void TestSetUp() - { - listenerIsCalled = false; - } - - private void ListenerIsCalled() - { - listenerIsCalled = true; - } - - [Test] - public void CreateInOutermostTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateInOutermostListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateInOutermostListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateInOutermostListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Created, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - } - - [Test] - public void CreateAndModifyInOutermostTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateAndModifyInOutermostListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - session.SaveChanges(); - e.Text = "some text"; - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateAndModifyInOutermostListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateAndModifyInOutermostListener(object sender, TrackingCompletedEventArgs e) - { - foreach (var change in e.Changes) { - Console.WriteLine(change.Key); - Console.WriteLine(change.State); - foreach (var value in change.ChangedValues) { - Console.WriteLine(value.Field.Name); - Console.WriteLine(value.OriginalValue); - Console.WriteLine(value.NewValue); - } - } - - - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Created, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - } - - [Test] - public void CreateAndRemoveInOutermostTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateAndRemoveInOutermostListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - e.Text = "some text"; - session.SaveChanges(); - e.Remove(); - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateAndRemoveInOutermostListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateAndRemoveInOutermostListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Deleted, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - } - - [Test] - public void CreateAndRollbackInOutermostTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateAndRollbackInOutermostListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - //t.Complete(); Emulating transaction rollback - } - } - } - finally { - monitor.TrackingCompleted -= CreateAndRollbackInOutermostListener; - } - } - - private void CreateAndRollbackInOutermostListener(object sender, TrackingCompletedEventArgs e) - { - throw new AssertionException("This must not be called when outermost transaction is rolled back"); - } - - [Test] - public void CreateInOutermostAndNestedTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateInOutermostAndNestedListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e1 = new MyEntity(session); - e1.Text = "some text"; - using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { - var e2 = new MyEntity(session); - e2.Text = "some text"; - t2.Complete(); - } - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateInOutermostAndNestedListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateInOutermostAndNestedListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(2, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Created, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - ti = e.Changes.Skip(1).First(); - Assert.AreEqual(TrackingItemState.Created, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - } - - [Test] - public void CreateInOutermostAndModifyInNestedTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateInOutermostAndModifyInNestedListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - e.Text = "some text"; - session.SaveChanges(); - using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { - e.Text2 = "another text"; - t2.Complete(); - } - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateInOutermostAndModifyInNestedListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateInOutermostAndModifyInNestedListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Created, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - Assert.AreEqual("another text", ti.RawData.GetValue(3)); - } - - [Test] - public void CreateInOutermostAndRemoveInNestedTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateInOutermostAndRemoveInNestedListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - e.Text = "some text"; - session.SaveChanges(); - using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { - e.Remove(); - t2.Complete(); - } - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateInOutermostAndRemoveInNestedListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateInOutermostAndRemoveInNestedListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Deleted, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual("some text", ti.RawData.GetValue(2)); - } - - [Test] - public void RemoveInOutermostAndCreateInNestedTest() - { - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += RemoveInOutermostAndCreateInNestedListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - int id = e.Id; - e.Text = "some text"; - e.Remove(); - session.SaveChanges(); - using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { - e = new MyEntity(session, id); - e.Text2 = "another text"; - t2.Complete(); - } - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= RemoveInOutermostAndCreateInNestedListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void RemoveInOutermostAndCreateInNestedListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Changed, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual(null, ti.RawData.GetValue(2)); - Assert.AreEqual("another text", ti.RawData.GetValue(3)); - } - - [Test] - public void CreateAndModifyInNextTest() - { - - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - key = e.Key; - e.Text = "some text"; - t.Complete(); - } - } - - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateAndModifyInNextListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = session.Query.Single(key); - e.Text = "another text"; - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateAndModifyInNextListener; - Assert.IsTrue(listenerIsCalled); - } - } - - [Test] - public void TrackPartiallyLoadedEntity() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyChildEntity(session); - key = e.Key; - e.Text = "some text"; - t.Complete(); - } - } - - var monitor = Domain.Services.Get(); - monitor.TrackingCompleted += CreateAndModifyInNextListener; - - try { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var entities = session.Query.All().Where(e => e.Key==key); - foreach (var e in entities) - e.Text = "another text"; - t.Complete(); - } - } - } - finally { - monitor.TrackingCompleted -= CreateAndModifyInNextListener; - Assert.IsTrue(listenerIsCalled); - } - } - - private void CreateAndModifyInNextListener(object sender, TrackingCompletedEventArgs e) - { - ListenerIsCalled(); - Assert.IsNotNull(e.Changes); - Assert.AreEqual(1, e.Changes.Count()); - var ti = e.Changes.First(); - Assert.AreEqual(TrackingItemState.Changed, ti.State); - Assert.IsNotNull(ti.Key); - Assert.IsNotNull(ti.RawData); - Assert.AreEqual(1, ti.ChangedValues.Count()); - var changedValue = ti.ChangedValues.First(); - Assert.AreEqual("some text", changedValue.OriginalValue); - Assert.AreEqual("another text", changedValue.NewValue); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.17 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tracking.Tests.Model; + +namespace Xtensive.Orm.Tracking.Tests +{ + [TestFixture] + public class TrackingMonitorTests : AutoBuildTest + { + private bool listenerIsCalled; + + public override void TestSetUp() + { + listenerIsCalled = false; + } + + private void ListenerIsCalled() + { + listenerIsCalled = true; + } + + [Test] + public void CreateInOutermostTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateInOutermostListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateInOutermostListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateInOutermostListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Created, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + } + + [Test] + public void CreateAndModifyInOutermostTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateAndModifyInOutermostListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + session.SaveChanges(); + e.Text = "some text"; + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateAndModifyInOutermostListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateAndModifyInOutermostListener(object sender, TrackingCompletedEventArgs e) + { + foreach (var change in e.Changes) { + Console.WriteLine(change.Key); + Console.WriteLine(change.State); + foreach (var value in change.ChangedValues) { + Console.WriteLine(value.Field.Name); + Console.WriteLine(value.OriginalValue); + Console.WriteLine(value.NewValue); + } + } + + + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Created, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + } + + [Test] + public void CreateAndRemoveInOutermostTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateAndRemoveInOutermostListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + e.Text = "some text"; + session.SaveChanges(); + e.Remove(); + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateAndRemoveInOutermostListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateAndRemoveInOutermostListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Deleted, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + } + + [Test] + public void CreateAndRollbackInOutermostTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateAndRollbackInOutermostListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + //t.Complete(); Emulating transaction rollback + } + } + } + finally { + monitor.TrackingCompleted -= CreateAndRollbackInOutermostListener; + } + } + + private void CreateAndRollbackInOutermostListener(object sender, TrackingCompletedEventArgs e) + { + throw new AssertionException("This must not be called when outermost transaction is rolled back"); + } + + [Test] + public void CreateInOutermostAndNestedTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateInOutermostAndNestedListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e1 = new MyEntity(session); + e1.Text = "some text"; + using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { + var e2 = new MyEntity(session); + e2.Text = "some text"; + t2.Complete(); + } + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateInOutermostAndNestedListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateInOutermostAndNestedListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(2, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Created, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + ti = e.Changes.Skip(1).First(); + Assert.AreEqual(TrackingItemState.Created, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + } + + [Test] + public void CreateInOutermostAndModifyInNestedTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateInOutermostAndModifyInNestedListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + e.Text = "some text"; + session.SaveChanges(); + using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { + e.Text2 = "another text"; + t2.Complete(); + } + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateInOutermostAndModifyInNestedListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateInOutermostAndModifyInNestedListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Created, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + Assert.AreEqual("another text", ti.RawData.GetValue(3)); + } + + [Test] + public void CreateInOutermostAndRemoveInNestedTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateInOutermostAndRemoveInNestedListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + e.Text = "some text"; + session.SaveChanges(); + using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { + e.Remove(); + t2.Complete(); + } + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateInOutermostAndRemoveInNestedListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateInOutermostAndRemoveInNestedListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Deleted, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual("some text", ti.RawData.GetValue(2)); + } + + [Test] + public void RemoveInOutermostAndCreateInNestedTest() + { + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += RemoveInOutermostAndCreateInNestedListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + int id = e.Id; + e.Text = "some text"; + e.Remove(); + session.SaveChanges(); + using (var t2 = session.OpenTransaction(TransactionOpenMode.New)) { + e = new MyEntity(session, id); + e.Text2 = "another text"; + t2.Complete(); + } + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= RemoveInOutermostAndCreateInNestedListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void RemoveInOutermostAndCreateInNestedListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Changed, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual(null, ti.RawData.GetValue(2)); + Assert.AreEqual("another text", ti.RawData.GetValue(3)); + } + + [Test] + public void CreateAndModifyInNextTest() + { + + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + key = e.Key; + e.Text = "some text"; + t.Complete(); + } + } + + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateAndModifyInNextListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = session.Query.Single(key); + e.Text = "another text"; + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateAndModifyInNextListener; + Assert.IsTrue(listenerIsCalled); + } + } + + [Test] + public void TrackPartiallyLoadedEntity() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyChildEntity(session); + key = e.Key; + e.Text = "some text"; + t.Complete(); + } + } + + var monitor = Domain.Services.Get(); + monitor.TrackingCompleted += CreateAndModifyInNextListener; + + try { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var entities = session.Query.All().Where(e => e.Key==key); + foreach (var e in entities) + e.Text = "another text"; + t.Complete(); + } + } + } + finally { + monitor.TrackingCompleted -= CreateAndModifyInNextListener; + Assert.IsTrue(listenerIsCalled); + } + } + + private void CreateAndModifyInNextListener(object sender, TrackingCompletedEventArgs e) + { + ListenerIsCalled(); + Assert.IsNotNull(e.Changes); + Assert.AreEqual(1, e.Changes.Count()); + var ti = e.Changes.First(); + Assert.AreEqual(TrackingItemState.Changed, ti.State); + Assert.IsNotNull(ti.Key); + Assert.IsNotNull(ti.RawData); + Assert.AreEqual(1, ti.ChangedValues.Count()); + var changedValue = ti.ChangedValues.First(); + Assert.AreEqual("some text", changedValue.OriginalValue); + Assert.AreEqual("another text", changedValue.NewValue); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingStackFrameTests.cs b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingStackFrameTests.cs index f8779d2bd1..98227c9c2a 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/TrackingStackFrameTests.cs +++ b/Extensions/Xtensive.Orm.Tracking.Tests/TrackingStackFrameTests.cs @@ -1,93 +1,93 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tracking.Tests.Model; - -namespace Xtensive.Orm.Tracking.Tests -{ - [TestFixture] - public class TrackingStackFrameTests : AutoBuildTest - { -// [Test] -// public void SafelyInsertTheSameItemTwiceTest() -// { -// var frame = new TrackingStackFrame(); -// var key = Key.Create(Domain, typeof(MyEntity), 1); -// var item = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); -// frame.Register(item); -// frame.Register(item); -// } -// -// [Test] -// public void MergeTwoEmptyFramesTest() -// { -// var target = new TrackingStackFrame(); -// var source = new TrackingStackFrame(); -// target.MergeWith(source); -// -// Assert.AreEqual(0, target.Count); -// } -// -// [Test] -// public void MergeEmptyFrameWithNonEmptyFrameTest() -// { -// var key = Key.Create(Domain, typeof(MyEntity), 1); -// var target = new TrackingStackFrame(); -// -// var source = new TrackingStackFrame(); -// source.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); -// -// target.MergeWith(source); -// -// Assert.AreEqual(source.Count, target.Count); -// } -// -// [Test] -// public void MergeNonEmptyFrameWithEmptyFrameTest() -// { -// var key = Key.Create(Domain, typeof(MyEntity), 1); -// var target = new TrackingStackFrame(); -// target.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); -// int count = target.Count; -// -// var source = new TrackingStackFrame(); -// -// target.MergeWith(source); -// -// Assert.AreEqual(count, target.Count); -// } -// -// [Test] -// public void MergeFramesWithTheSameItemsTest() -// { -// var key = Key.Create(Domain, typeof(MyEntity), 1); -// var target = new TrackingStackFrame(); -// target.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); -// int count = target.Count; -// -// var source = new TrackingStackFrame(); -// source.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Changed)); -// -// target.MergeWith(source); -// -// Assert.AreEqual(count, target.Count); -// Assert.AreEqual(TrackingItemState.Created, target.Single().State); -// } -// -// [Test] -// public void MergeFramesWithDifferentItemsTest() -// { -// var key1 = Key.Create(Domain, typeof(MyEntity), 1); -// var key2 = Key.Create(Domain, typeof(MyEntity), 2); -// var target = new TrackingStackFrame(); -// target.Register(TestHelper.CreateTrackingItem(key1, TrackingItemState.Created)); -// -// var source = new TrackingStackFrame(); -// source.Register(TestHelper.CreateTrackingItem(key2, TrackingItemState.Changed)); -// int count = target.Count + source.Count; -// -// target.MergeWith(source); -// -// Assert.AreEqual(count, target.Count); -// } - } -} +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tracking.Tests.Model; + +namespace Xtensive.Orm.Tracking.Tests +{ + [TestFixture] + public class TrackingStackFrameTests : AutoBuildTest + { +// [Test] +// public void SafelyInsertTheSameItemTwiceTest() +// { +// var frame = new TrackingStackFrame(); +// var key = Key.Create(Domain, typeof(MyEntity), 1); +// var item = TestHelper.CreateTrackingItem(key, TrackingItemState.Created); +// frame.Register(item); +// frame.Register(item); +// } +// +// [Test] +// public void MergeTwoEmptyFramesTest() +// { +// var target = new TrackingStackFrame(); +// var source = new TrackingStackFrame(); +// target.MergeWith(source); +// +// Assert.AreEqual(0, target.Count); +// } +// +// [Test] +// public void MergeEmptyFrameWithNonEmptyFrameTest() +// { +// var key = Key.Create(Domain, typeof(MyEntity), 1); +// var target = new TrackingStackFrame(); +// +// var source = new TrackingStackFrame(); +// source.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); +// +// target.MergeWith(source); +// +// Assert.AreEqual(source.Count, target.Count); +// } +// +// [Test] +// public void MergeNonEmptyFrameWithEmptyFrameTest() +// { +// var key = Key.Create(Domain, typeof(MyEntity), 1); +// var target = new TrackingStackFrame(); +// target.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); +// int count = target.Count; +// +// var source = new TrackingStackFrame(); +// +// target.MergeWith(source); +// +// Assert.AreEqual(count, target.Count); +// } +// +// [Test] +// public void MergeFramesWithTheSameItemsTest() +// { +// var key = Key.Create(Domain, typeof(MyEntity), 1); +// var target = new TrackingStackFrame(); +// target.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Created)); +// int count = target.Count; +// +// var source = new TrackingStackFrame(); +// source.Register(TestHelper.CreateTrackingItem(key, TrackingItemState.Changed)); +// +// target.MergeWith(source); +// +// Assert.AreEqual(count, target.Count); +// Assert.AreEqual(TrackingItemState.Created, target.Single().State); +// } +// +// [Test] +// public void MergeFramesWithDifferentItemsTest() +// { +// var key1 = Key.Create(Domain, typeof(MyEntity), 1); +// var key2 = Key.Create(Domain, typeof(MyEntity), 2); +// var target = new TrackingStackFrame(); +// target.Register(TestHelper.CreateTrackingItem(key1, TrackingItemState.Created)); +// +// var source = new TrackingStackFrame(); +// source.Register(TestHelper.CreateTrackingItem(key2, TrackingItemState.Changed)); +// int count = target.Count + source.Count; +// +// target.MergeWith(source); +// +// Assert.AreEqual(count, target.Count); +// } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking.Tests/Xtensive.Orm.Tracking.Tests.csproj b/Extensions/Xtensive.Orm.Tracking.Tests/Xtensive.Orm.Tracking.Tests.csproj index c0391e3e14..ed38c2ac38 100644 --- a/Extensions/Xtensive.Orm.Tracking.Tests/Xtensive.Orm.Tracking.Tests.csproj +++ b/Extensions/Xtensive.Orm.Tracking.Tests/Xtensive.Orm.Tracking.Tests.csproj @@ -1,28 +1,28 @@ - - - ..\..\_Build\$(Configuration)\lib\ - - false - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - - - + + + ..\..\_Build\$(Configuration)\lib\ + + false + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/ChangedValue.cs b/Extensions/Xtensive.Orm.Tracking/ChangedValue.cs index aed0e1cbe1..3e4e724b31 100644 --- a/Extensions/Xtensive.Orm.Tracking/ChangedValue.cs +++ b/Extensions/Xtensive.Orm.Tracking/ChangedValue.cs @@ -1,38 +1,38 @@ -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tracking -{ - /// - /// Represents a pair of original and changed values for a persistent field - /// - public sealed class ChangedValue - { - /// - /// Gets the field. - /// - public FieldInfo Field { get; private set; } - - /// - /// Gets the original value. - /// - public object OriginalValue { get; private set; } - - /// - /// Gets the new value. - /// - public object NewValue { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The field. - /// The original value. - /// The new value. - public ChangedValue(FieldInfo field, object originalValue, object newValue) - { - Field = field; - OriginalValue = originalValue; - NewValue = newValue; - } - } -} +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tracking +{ + /// + /// Represents a pair of original and changed values for a persistent field + /// + public sealed class ChangedValue + { + /// + /// Gets the field. + /// + public FieldInfo Field { get; private set; } + + /// + /// Gets the original value. + /// + public object OriginalValue { get; private set; } + + /// + /// Gets the new value. + /// + public object NewValue { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The field. + /// The original value. + /// The new value. + public ChangedValue(FieldInfo field, object originalValue, object newValue) + { + Field = field; + OriginalValue = originalValue; + NewValue = newValue; + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking/DomainExtensions.cs b/Extensions/Xtensive.Orm.Tracking/DomainExtensions.cs index 2b2db95673..f8d367310a 100644 --- a/Extensions/Xtensive.Orm.Tracking/DomainExtensions.cs +++ b/Extensions/Xtensive.Orm.Tracking/DomainExtensions.cs @@ -1,20 +1,20 @@ -using Xtensive.Orm.Tracking; - -namespace Xtensive.Orm -{ - /// - /// extensions for Xtensive.Orm.Tracking. - /// - public static class DomainExtensions - { - /// - /// Gets the implementation. - /// - /// The domain. - /// - public static IDomainTrackingMonitor GetTrackingMonitor(this Domain domain) - { - return domain.Services.Get(); - } - } -} +using Xtensive.Orm.Tracking; + +namespace Xtensive.Orm +{ + /// + /// extensions for Xtensive.Orm.Tracking. + /// + public static class DomainExtensions + { + /// + /// Gets the implementation. + /// + /// The domain. + /// + public static IDomainTrackingMonitor GetTrackingMonitor(this Domain domain) + { + return domain.Services.Get(); + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking/Interfaces/IDomainTrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Interfaces/IDomainTrackingMonitor.cs index 52ac088aec..fa7d8ff333 100644 --- a/Extensions/Xtensive.Orm.Tracking/Interfaces/IDomainTrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Interfaces/IDomainTrackingMonitor.cs @@ -1,11 +1,11 @@ -using System; - -namespace Xtensive.Orm.Tracking -{ - /// - /// Marker interface for domain version of . - /// - public interface IDomainTrackingMonitor : ITrackingMonitor - { - } +using System; + +namespace Xtensive.Orm.Tracking +{ + /// + /// Marker interface for domain version of . + /// + public interface IDomainTrackingMonitor : ITrackingMonitor + { + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Interfaces/ISessionTrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Interfaces/ISessionTrackingMonitor.cs index 9ebe959764..ddb8d461da 100644 --- a/Extensions/Xtensive.Orm.Tracking/Interfaces/ISessionTrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Interfaces/ISessionTrackingMonitor.cs @@ -1,9 +1,9 @@ -namespace Xtensive.Orm.Tracking -{ - /// - /// Marker interface for session version of . - /// - public interface ISessionTrackingMonitor : ITrackingMonitor - { - } +namespace Xtensive.Orm.Tracking +{ + /// + /// Marker interface for session version of . + /// + public interface ISessionTrackingMonitor : ITrackingMonitor + { + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingItem.cs b/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingItem.cs index a0958bdae0..0f300cab74 100644 --- a/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingItem.cs +++ b/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingItem.cs @@ -1,16 +1,16 @@ -using System.Collections.Generic; -using Xtensive.Tuples; - -namespace Xtensive.Orm.Tracking -{ - public interface ITrackingItem - { - Key Key { get; } - - DifferentialTuple RawData { get; } - - TrackingItemState State { get; } - - IList ChangedValues { get; } - } +using System.Collections.Generic; +using Xtensive.Tuples; + +namespace Xtensive.Orm.Tracking +{ + public interface ITrackingItem + { + Key Key { get; } + + DifferentialTuple RawData { get; } + + TrackingItemState State { get; } + + IList ChangedValues { get; } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingMonitor.cs index 99c3036b09..4a3d3fda36 100644 --- a/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Interfaces/ITrackingMonitor.cs @@ -1,25 +1,25 @@ -using System; - -namespace Xtensive.Orm.Tracking -{ - /// - /// Base tracking monitor interface - /// - public interface ITrackingMonitor - { - /// - /// Occurs when a single tracking operation is completed. - /// - event EventHandler TrackingCompleted; - - /// - /// Enables tracking. - /// - void Enable(); - - /// - /// Disables tracking. - /// - void Disable(); - } +using System; + +namespace Xtensive.Orm.Tracking +{ + /// + /// Base tracking monitor interface + /// + public interface ITrackingMonitor + { + /// + /// Occurs when a single tracking operation is completed. + /// + event EventHandler TrackingCompleted; + + /// + /// Enables tracking. + /// + void Enable(); + + /// + /// Disables tracking. + /// + void Disable(); + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Internals/DomainTrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Internals/DomainTrackingMonitor.cs index 527bce1998..3271f983e2 100644 --- a/Extensions/Xtensive.Orm.Tracking/Internals/DomainTrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Internals/DomainTrackingMonitor.cs @@ -1,36 +1,36 @@ -using System; -using Xtensive.IoC; - -namespace Xtensive.Orm.Tracking -{ - [Service(typeof (IDomainTrackingMonitor), Singleton = true)] - internal sealed class DomainTrackingMonitor : TrackingMonitor, IDomainTrackingMonitor, IDomainService - { - private void OnOpenSession(object sender, SessionEventArgs args) - { - var session = args.Session; - - if (session.Configuration.Type==Configuration.SessionType.KeyGenerator) - return; - if (session.Configuration.Type==Configuration.SessionType.System) - return; - - var monitor = session.Services.Get(); - - monitor.TrackingCompleted += OnTrackingCompleted; - } - - private void OnTrackingCompleted(object sender, TrackingCompletedEventArgs e) - { - RaiseTrackingCompleted(e); - } - - [ServiceConstructor] - public DomainTrackingMonitor(Domain domain) - { - if (domain==null) - throw new ArgumentNullException("domain"); - domain.SessionOpen += OnOpenSession; - } - } +using System; +using Xtensive.IoC; + +namespace Xtensive.Orm.Tracking +{ + [Service(typeof (IDomainTrackingMonitor), Singleton = true)] + internal sealed class DomainTrackingMonitor : TrackingMonitor, IDomainTrackingMonitor, IDomainService + { + private void OnOpenSession(object sender, SessionEventArgs args) + { + var session = args.Session; + + if (session.Configuration.Type==Configuration.SessionType.KeyGenerator) + return; + if (session.Configuration.Type==Configuration.SessionType.System) + return; + + var monitor = session.Services.Get(); + + monitor.TrackingCompleted += OnTrackingCompleted; + } + + private void OnTrackingCompleted(object sender, TrackingCompletedEventArgs e) + { + RaiseTrackingCompleted(e); + } + + [ServiceConstructor] + public DomainTrackingMonitor(Domain domain) + { + if (domain==null) + throw new ArgumentNullException("domain"); + domain.SessionOpen += OnOpenSession; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Internals/SessionTrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Internals/SessionTrackingMonitor.cs index f16fe036c1..8be6553538 100644 --- a/Extensions/Xtensive.Orm.Tracking/Internals/SessionTrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Internals/SessionTrackingMonitor.cs @@ -1,86 +1,86 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.IoC; -using Xtensive.Orm.Services; - -namespace Xtensive.Orm.Tracking -{ - [Service(typeof (ISessionTrackingMonitor), Singleton = true)] - internal sealed class SessionTrackingMonitor : TrackingMonitor, ISessionTrackingMonitor, ISessionService - { - private readonly Session session; - private readonly DirectSessionAccessor accessor; - private readonly Stack stack; - - private void Subscribe() - { - session.Events.Persisting += OnPersisting; - session.Events.TransactionOpened += OnOpenTransaction; - session.Events.TransactionCommitted += OnCommitTransaction; - session.Events.TransactionRollbacked += OnRollbackTransaction; - } - - private void OnOpenTransaction(object sender, TransactionEventArgs e) - { - stack.Push(new TrackingStackFrame()); - } - - private void OnCommitTransaction(object sender, TransactionEventArgs e) - { - var source = stack.Pop(); - var target = stack.Peek(); - target.MergeWith(source); - - if (e.Transaction.IsNested) - return; - - var items = target.Cast().ToList().AsReadOnly(); - target.Clear(); - - RaiseTrackingCompleted(new TrackingCompletedEventArgs(session, items)); - } - - private void OnRollbackTransaction(object sender, TransactionEventArgs e) - { - stack.Pop(); - } - - private void OnPersisting(object sender, EventArgs e) - { - var frame = stack.Peek(); - - foreach (var state in accessor.GetChangedEntities(PersistenceState.Removed)) - frame.Register(new TrackingItem(state.Key, TrackingItemState.Deleted, state.DifferentialTuple)); - - foreach (var state in accessor.GetChangedEntities(PersistenceState.New)) - frame.Register(new TrackingItem(state.Key, TrackingItemState.Created, state.DifferentialTuple)); - - foreach (var state in accessor.GetChangedEntities(PersistenceState.Modified)) - frame.Register(new TrackingItem(state.Key, TrackingItemState.Changed, state.DifferentialTuple)); - } - - /// - /// Initializes a new instance of the class. - /// - /// , to which current instance - /// is bound. - /// is . - [ServiceConstructor] - public SessionTrackingMonitor(Session session, DirectSessionAccessor accessor) - { - if (session==null) - throw new ArgumentNullException("session"); - if (accessor==null) - throw new ArgumentNullException("accessor"); - - this.session = session; - this.accessor = accessor; - - stack = new Stack(); - stack.Push(new TrackingStackFrame()); - - Subscribe(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.IoC; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Tracking +{ + [Service(typeof (ISessionTrackingMonitor), Singleton = true)] + internal sealed class SessionTrackingMonitor : TrackingMonitor, ISessionTrackingMonitor, ISessionService + { + private readonly Session session; + private readonly DirectSessionAccessor accessor; + private readonly Stack stack; + + private void Subscribe() + { + session.Events.Persisting += OnPersisting; + session.Events.TransactionOpened += OnOpenTransaction; + session.Events.TransactionCommitted += OnCommitTransaction; + session.Events.TransactionRollbacked += OnRollbackTransaction; + } + + private void OnOpenTransaction(object sender, TransactionEventArgs e) + { + stack.Push(new TrackingStackFrame()); + } + + private void OnCommitTransaction(object sender, TransactionEventArgs e) + { + var source = stack.Pop(); + var target = stack.Peek(); + target.MergeWith(source); + + if (e.Transaction.IsNested) + return; + + var items = target.Cast().ToList().AsReadOnly(); + target.Clear(); + + RaiseTrackingCompleted(new TrackingCompletedEventArgs(session, items)); + } + + private void OnRollbackTransaction(object sender, TransactionEventArgs e) + { + stack.Pop(); + } + + private void OnPersisting(object sender, EventArgs e) + { + var frame = stack.Peek(); + + foreach (var state in accessor.GetChangedEntities(PersistenceState.Removed)) + frame.Register(new TrackingItem(state.Key, TrackingItemState.Deleted, state.DifferentialTuple)); + + foreach (var state in accessor.GetChangedEntities(PersistenceState.New)) + frame.Register(new TrackingItem(state.Key, TrackingItemState.Created, state.DifferentialTuple)); + + foreach (var state in accessor.GetChangedEntities(PersistenceState.Modified)) + frame.Register(new TrackingItem(state.Key, TrackingItemState.Changed, state.DifferentialTuple)); + } + + /// + /// Initializes a new instance of the class. + /// + /// , to which current instance + /// is bound. + /// is . + [ServiceConstructor] + public SessionTrackingMonitor(Session session, DirectSessionAccessor accessor) + { + if (session==null) + throw new ArgumentNullException("session"); + if (accessor==null) + throw new ArgumentNullException("accessor"); + + this.session = session; + this.accessor = accessor; + + stack = new Stack(); + stack.Push(new TrackingStackFrame()); + + Subscribe(); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingItem.cs b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingItem.cs index 2b37972e1f..e3600118d9 100644 --- a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingItem.cs +++ b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingItem.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.16 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tracking -{ - [DebuggerDisplay("{Key}")] - internal sealed class TrackingItem : ITrackingItem - { - private IList cachedChangedValues; - - public Key Key { get; private set; } - - public DifferentialTuple RawData { get; private set; } - - public TrackingItemState State { get; private set; } - - public IList ChangedValues - { - get - { - if (cachedChangedValues==null) - cachedChangedValues = CalculateChangedValues().ToList().AsReadOnly(); - return cachedChangedValues; - } - } - - public void MergeWith(TrackingItem source) - { - if (source==null) - throw new ArgumentNullException("source"); - - if (State==TrackingItemState.Deleted && source.State==TrackingItemState.Created) { - State = TrackingItemState.Changed; - RawData = source.RawData; // TODO: Check whether a clone is required - return; - } - - if (State==TrackingItemState.Created && source.State==TrackingItemState.Changed) { - State = TrackingItemState.Created; - MergeWith(source.RawData.Difference); - return; - } - - MergeWith(source.RawData.Difference); - State = source.State; - } - - private IEnumerable CalculateChangedValues() - { - var originalValues = RawData.Origin; - var changedValues = RawData.Difference; - - if (State==TrackingItemState.Created) { - originalValues = null; - changedValues = RawData.Origin; - } - - foreach (var field in Key.TypeInfo.Fields.Where(f => f.Column!=null)) { - object origValue = null, changedValue = null; - int fieldIndex = field.MappingInfo.Offset; - TupleFieldState fieldState; - if (originalValues!=null) - origValue = originalValues.GetValue(fieldIndex, out fieldState); - if (changedValues!=null) { - changedValue = changedValues.GetValue(fieldIndex, out fieldState); - if (!fieldState.IsAvailable()) - continue; - } - yield return new ChangedValue(field, origValue, changedValue); - } - } - - private void MergeWith(Tuple difference) - { - if (RawData.Difference==null) - RawData.Difference = difference; - else - RawData.Difference.MergeWith(difference, MergeBehavior.PreferDifference); - } - - public TrackingItem(Key key, TrackingItemState state, DifferentialTuple tuple) - { - if (key==null) - throw new ArgumentNullException("key"); - if (state!=TrackingItemState.Deleted && tuple==null) - throw new ArgumentNullException("tuple"); - - Key = key; - if (tuple!=null) - RawData = (DifferentialTuple) tuple.Clone(); - State = state; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.16 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tracking +{ + [DebuggerDisplay("{Key}")] + internal sealed class TrackingItem : ITrackingItem + { + private IList cachedChangedValues; + + public Key Key { get; private set; } + + public DifferentialTuple RawData { get; private set; } + + public TrackingItemState State { get; private set; } + + public IList ChangedValues + { + get + { + if (cachedChangedValues==null) + cachedChangedValues = CalculateChangedValues().ToList().AsReadOnly(); + return cachedChangedValues; + } + } + + public void MergeWith(TrackingItem source) + { + if (source==null) + throw new ArgumentNullException("source"); + + if (State==TrackingItemState.Deleted && source.State==TrackingItemState.Created) { + State = TrackingItemState.Changed; + RawData = source.RawData; // TODO: Check whether a clone is required + return; + } + + if (State==TrackingItemState.Created && source.State==TrackingItemState.Changed) { + State = TrackingItemState.Created; + MergeWith(source.RawData.Difference); + return; + } + + MergeWith(source.RawData.Difference); + State = source.State; + } + + private IEnumerable CalculateChangedValues() + { + var originalValues = RawData.Origin; + var changedValues = RawData.Difference; + + if (State==TrackingItemState.Created) { + originalValues = null; + changedValues = RawData.Origin; + } + + foreach (var field in Key.TypeInfo.Fields.Where(f => f.Column!=null)) { + object origValue = null, changedValue = null; + int fieldIndex = field.MappingInfo.Offset; + TupleFieldState fieldState; + if (originalValues!=null) + origValue = originalValues.GetValue(fieldIndex, out fieldState); + if (changedValues!=null) { + changedValue = changedValues.GetValue(fieldIndex, out fieldState); + if (!fieldState.IsAvailable()) + continue; + } + yield return new ChangedValue(field, origValue, changedValue); + } + } + + private void MergeWith(Tuple difference) + { + if (RawData.Difference==null) + RawData.Difference = difference; + else + RawData.Difference.MergeWith(difference, MergeBehavior.PreferDifference); + } + + public TrackingItem(Key key, TrackingItemState state, DifferentialTuple tuple) + { + if (key==null) + throw new ArgumentNullException("key"); + if (state!=TrackingItemState.Deleted && tuple==null) + throw new ArgumentNullException("tuple"); + + Key = key; + if (tuple!=null) + RawData = (DifferentialTuple) tuple.Clone(); + State = state; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingMonitor.cs b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingMonitor.cs index 6785d308fe..9ff7bc6ff8 100644 --- a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingMonitor.cs +++ b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingMonitor.cs @@ -1,33 +1,33 @@ -using System; - -namespace Xtensive.Orm.Tracking -{ - internal abstract class TrackingMonitor : ITrackingMonitor - { - private int disableCount; - - public event EventHandler TrackingCompleted; - - public void Disable() - { - disableCount++; - } - - public void Enable() - { - if (disableCount==0) - throw new InvalidOperationException("Tracking monitor is not disabled"); - disableCount--; - } - - protected void RaiseTrackingCompleted(TrackingCompletedEventArgs e) - { - if (disableCount > 0) - return; - var handler = TrackingCompleted; - if (handler==null) - return; - handler.Invoke(this, e); - } - } +using System; + +namespace Xtensive.Orm.Tracking +{ + internal abstract class TrackingMonitor : ITrackingMonitor + { + private int disableCount; + + public event EventHandler TrackingCompleted; + + public void Disable() + { + disableCount++; + } + + public void Enable() + { + if (disableCount==0) + throw new InvalidOperationException("Tracking monitor is not disabled"); + disableCount--; + } + + protected void RaiseTrackingCompleted(TrackingCompletedEventArgs e) + { + if (disableCount > 0) + return; + var handler = TrackingCompleted; + if (handler==null) + return; + handler.Invoke(this, e); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingStackFrame.cs b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingStackFrame.cs index b0b7318130..ba72d5b262 100644 --- a/Extensions/Xtensive.Orm.Tracking/Internals/TrackingStackFrame.cs +++ b/Extensions/Xtensive.Orm.Tracking/Internals/TrackingStackFrame.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.16 - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tracking -{ - internal sealed class TrackingStackFrame : IEnumerable - { - private readonly Dictionary items = new Dictionary(); - - public int Count { get { return items.Count; } } - - public void Register(TrackingItem item) - { - if (item==null) - throw new ArgumentNullException("item"); - - TrackingItem existing; - if (items.TryGetValue(item.Key, out existing)) { - if (item==existing) - return; - - existing.MergeWith(item); - return; - } - items.Add(item.Key, item); - } - - public void Clear() - { - items.Clear(); - } - - public void MergeWith(TrackingStackFrame source) - { - if (source==null) - throw new ArgumentNullException("source"); - - foreach (var sourceItem in source) { - TrackingItem target; - if (items.TryGetValue(sourceItem.Key, out target)) - target.MergeWith(sourceItem); - else - items.Add(sourceItem.Key, sourceItem); - } - } - - public IEnumerator GetEnumerator() - { - return items.Values.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.16 + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tracking +{ + internal sealed class TrackingStackFrame : IEnumerable + { + private readonly Dictionary items = new Dictionary(); + + public int Count { get { return items.Count; } } + + public void Register(TrackingItem item) + { + if (item==null) + throw new ArgumentNullException("item"); + + TrackingItem existing; + if (items.TryGetValue(item.Key, out existing)) { + if (item==existing) + return; + + existing.MergeWith(item); + return; + } + items.Add(item.Key, item); + } + + public void Clear() + { + items.Clear(); + } + + public void MergeWith(TrackingStackFrame source) + { + if (source==null) + throw new ArgumentNullException("source"); + + foreach (var sourceItem in source) { + TrackingItem target; + if (items.TryGetValue(sourceItem.Key, out target)) + target.MergeWith(sourceItem); + else + items.Add(sourceItem.Key, sourceItem); + } + } + + public IEnumerator GetEnumerator() + { + return items.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Readme.txt b/Extensions/Xtensive.Orm.Tracking/Readme.txt index 00b72087cb..db1aaf1550 100644 --- a/Extensions/Xtensive.Orm.Tracking/Readme.txt +++ b/Extensions/Xtensive.Orm.Tracking/Readme.txt @@ -1,64 +1,64 @@ -===================== -Xtensive.Orm.Tracking -===================== - -Summary -------- -Provides tracking/auditing funtionality on Session/Domain level. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) - -Implementation --------------- -1. Add reference to Xtensive.Orm.Tracking assembly -2. Include types from Xtensive.Orm.Tracking assembly into the domain: - - - - - - - - - - - -3. To track changes on Session level obtain an instance of ISessionTrackingMonitor through Session.Services.Get() method To track changes on Domain level (from all sessions) obtain an instance of IDomainTrackingMonitor through Domain.Services.Get() method -4. Subscribe to TrackingCompleted event. After each tracked transaction is committed you receive the TrackingCompletedEventArgs object. -5. TrackingCompletedEventArgs.Changes contains a collection of ITrackingItem objects, each of them represents a set of changes that occured to an Entity within the transaction committed. - -Demo ----- -1. Subscribe to ISessionTrackingMonitor/IDomainTrackingMonitor TrackingCompleted event -var monitor = Domain.Services.Get(); -monitor.TrackingCompleted += TrackingCompletedListener; - -2. Do some changes to persistent entities -using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e = new MyEntity(session); - e.Text = "some text"; - t.Complete(); - } -} - -3. Handle TrackingCompleted event call and do whatever you want with tracked changes. -private void TrackingCompletedListener(object sender, TrackingCompletedEventArgs e) -{ - foreach (var change in e.Changes) { - Console.WriteLine(change.Key); - Console.WriteLine(change.State); - - foreach (var value in change.ChangedValues) { - Console.WriteLine(value.Field.Name); - Console.WriteLine(value.OriginalValue); - Console.WriteLine(value.NewValue); - } - } -} - -References ----------- +===================== +Xtensive.Orm.Tracking +===================== + +Summary +------- +Provides tracking/auditing funtionality on Session/Domain level. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) + +Implementation +-------------- +1. Add reference to Xtensive.Orm.Tracking assembly +2. Include types from Xtensive.Orm.Tracking assembly into the domain: + + + + + + + + + + + +3. To track changes on Session level obtain an instance of ISessionTrackingMonitor through Session.Services.Get() method To track changes on Domain level (from all sessions) obtain an instance of IDomainTrackingMonitor through Domain.Services.Get() method +4. Subscribe to TrackingCompleted event. After each tracked transaction is committed you receive the TrackingCompletedEventArgs object. +5. TrackingCompletedEventArgs.Changes contains a collection of ITrackingItem objects, each of them represents a set of changes that occured to an Entity within the transaction committed. + +Demo +---- +1. Subscribe to ISessionTrackingMonitor/IDomainTrackingMonitor TrackingCompleted event +var monitor = Domain.Services.Get(); +monitor.TrackingCompleted += TrackingCompletedListener; + +2. Do some changes to persistent entities +using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e = new MyEntity(session); + e.Text = "some text"; + t.Complete(); + } +} + +3. Handle TrackingCompleted event call and do whatever you want with tracked changes. +private void TrackingCompletedListener(object sender, TrackingCompletedEventArgs e) +{ + foreach (var change in e.Changes) { + Console.WriteLine(change.Key); + Console.WriteLine(change.State); + + foreach (var value in change.ChangedValues) { + Console.WriteLine(value.Field.Name); + Console.WriteLine(value.OriginalValue); + Console.WriteLine(value.NewValue); + } + } +} + +References +---------- http://doextensions.codeplex.com \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/SessionExtensions.cs b/Extensions/Xtensive.Orm.Tracking/SessionExtensions.cs index dd37006917..1e85f3256c 100644 --- a/Extensions/Xtensive.Orm.Tracking/SessionExtensions.cs +++ b/Extensions/Xtensive.Orm.Tracking/SessionExtensions.cs @@ -1,20 +1,20 @@ -using Xtensive.Orm.Tracking; - -namespace Xtensive.Orm -{ - /// - /// extensions for Xtensive.Orm.Tracking. - /// - public static class SessionExtensions - { - /// - /// Gets the implementation. - /// - /// The session. - /// - public static ISessionTrackingMonitor GetTrackingMonitor(this Session session) - { - return session.Services.Get(); - } - } -} +using Xtensive.Orm.Tracking; + +namespace Xtensive.Orm +{ + /// + /// extensions for Xtensive.Orm.Tracking. + /// + public static class SessionExtensions + { + /// + /// Gets the implementation. + /// + /// The session. + /// + public static ISessionTrackingMonitor GetTrackingMonitor(this Session session) + { + return session.Services.Get(); + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking/TrackingCompletedEventArgs.cs b/Extensions/Xtensive.Orm.Tracking/TrackingCompletedEventArgs.cs index 3551134985..dd9a2a1341 100644 --- a/Extensions/Xtensive.Orm.Tracking/TrackingCompletedEventArgs.cs +++ b/Extensions/Xtensive.Orm.Tracking/TrackingCompletedEventArgs.cs @@ -1,36 +1,36 @@ -using System; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tracking -{ - /// - /// Event arguments for event. - /// - public sealed class TrackingCompletedEventArgs : EventArgs - { - /// - /// Gets session this changes occured in. - /// - public Session Session { get; private set; } - - /// - /// Gets the changes. - /// - public IEnumerable Changes { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The changes. - public TrackingCompletedEventArgs(Session session, IEnumerable changes) - { - if (session==null) - throw new ArgumentNullException("session"); - if (changes == null) - throw new ArgumentNullException("changes"); - - Session = session; - Changes = changes; - } - } -} +using System; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tracking +{ + /// + /// Event arguments for event. + /// + public sealed class TrackingCompletedEventArgs : EventArgs + { + /// + /// Gets session this changes occured in. + /// + public Session Session { get; private set; } + + /// + /// Gets the changes. + /// + public IEnumerable Changes { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The changes. + public TrackingCompletedEventArgs(Session session, IEnumerable changes) + { + if (session==null) + throw new ArgumentNullException("session"); + if (changes == null) + throw new ArgumentNullException("changes"); + + Session = session; + Changes = changes; + } + } +} diff --git a/Extensions/Xtensive.Orm.Tracking/TrackingItemState.cs b/Extensions/Xtensive.Orm.Tracking/TrackingItemState.cs index 9a49dddfdd..7fb1fec5d3 100644 --- a/Extensions/Xtensive.Orm.Tracking/TrackingItemState.cs +++ b/Extensions/Xtensive.Orm.Tracking/TrackingItemState.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2012.05.16 - -using System; - -namespace Xtensive.Orm.Tracking -{ - /// - /// State of - /// - [Serializable] - public enum TrackingItemState - { - /// - /// Entity was created - /// - Created = 0, - - /// - /// Entity was changed - /// - Changed = 1, - - /// - /// Entity was removed - /// - Deleted = 2, - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2012.05.16 + +using System; + +namespace Xtensive.Orm.Tracking +{ + /// + /// State of + /// + [Serializable] + public enum TrackingItemState + { + /// + /// Entity was created + /// + Created = 0, + + /// + /// Entity was changed + /// + Changed = 1, + + /// + /// Entity was removed + /// + Deleted = 2, + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Tracking/Xtensive.Orm.Tracking.csproj b/Extensions/Xtensive.Orm.Tracking/Xtensive.Orm.Tracking.csproj index f3afcf7b8b..ba907993f8 100644 --- a/Extensions/Xtensive.Orm.Tracking/Xtensive.Orm.Tracking.csproj +++ b/Extensions/Xtensive.Orm.Tracking/Xtensive.Orm.Tracking.csproj @@ -1,28 +1,28 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netstandard2.0 - Xtensive.Orm.Tracking - Change tracking extension for $(DoProductName) - $(Title) - Adds tracking functionality for $(DoProductName)-powered projects - true - ..\Extensions.snk - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netstandard2.0 + Xtensive.Orm.Tracking + Change tracking extension for $(DoProductName) + $(Title) + Adds tracking functionality for $(DoProductName)-powered projects + true + ..\Extensions.snk + + + + + + + + + + + + + \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Web/AplicationBuilderExtensions.cs b/Extensions/Xtensive.Orm.Web/AplicationBuilderExtensions.cs index c9ce085d1b..b06831f096 100644 --- a/Extensions/Xtensive.Orm.Web/AplicationBuilderExtensions.cs +++ b/Extensions/Xtensive.Orm.Web/AplicationBuilderExtensions.cs @@ -1,31 +1,31 @@ -using System; -using Xtensive.Core; -using Microsoft.AspNetCore.Builder; - -namespace Xtensive.Orm.Web -{ - public static class AplicationBuilderExtensions - { - /// - /// Adds to ASP.NET Core middleware pipeline. - /// - /// instance. - /// with . - public static IApplicationBuilder UseSessionManager(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - - /// - /// Adds to ASP.NET Core middleware pipeline. - /// - /// instance. - /// User-defined session provider which will be used instead of built-in provider. - /// with . - public static IApplicationBuilder UseSessionManager(this IApplicationBuilder builder, Func> sessionProvider) - { - SessionManager.SessionProvider = sessionProvider; - return builder.UseMiddleware(); - } - } +using System; +using Xtensive.Core; +using Microsoft.AspNetCore.Builder; + +namespace Xtensive.Orm.Web +{ + public static class AplicationBuilderExtensions + { + /// + /// Adds to ASP.NET Core middleware pipeline. + /// + /// instance. + /// with . + public static IApplicationBuilder UseSessionManager(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + + /// + /// Adds to ASP.NET Core middleware pipeline. + /// + /// instance. + /// User-defined session provider which will be used instead of built-in provider. + /// with . + public static IApplicationBuilder UseSessionManager(this IApplicationBuilder builder, Func> sessionProvider) + { + SessionManager.SessionProvider = sessionProvider; + return builder.UseMiddleware(); + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Web/DomainBuilder.cs b/Extensions/Xtensive.Orm.Web/DomainBuilder.cs index 8083e423b0..331b597008 100644 --- a/Extensions/Xtensive.Orm.Web/DomainBuilder.cs +++ b/Extensions/Xtensive.Orm.Web/DomainBuilder.cs @@ -1,29 +1,29 @@ -using Xtensive.Orm; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Web -{ - ///// - ///// Builds based on application configuration file - ///// - //public static class DomainBuilder - //{ - // /// - // /// Builds the default . - // /// - // public static Domain Build() - // { - // return Build("Default"); - // } - - // /// - // /// Builds the with the specified name. - // /// - // public static Domain Build(string name) - // { - // var config = DomainConfiguration.Load(name); - // var domain = Domain.Build(config); - // return domain; - // } - //} +using Xtensive.Orm; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Web +{ + ///// + ///// Builds based on application configuration file + ///// + //public static class DomainBuilder + //{ + // /// + // /// Builds the default . + // /// + // public static Domain Build() + // { + // return Build("Default"); + // } + + // /// + // /// Builds the with the specified name. + // /// + // public static Domain Build(string name) + // { + // var config = DomainConfiguration.Load(name); + // var domain = Domain.Build(config); + // return domain; + // } + //} } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Web/Readme.txt b/Extensions/Xtensive.Orm.Web/Readme.txt index 0a3a1254d6..68b81ecd7d 100644 --- a/Extensions/Xtensive.Orm.Web/Readme.txt +++ b/Extensions/Xtensive.Orm.Web/Readme.txt @@ -1,67 +1,67 @@ -================ -Xtensive.Orm.Web -================ - -Summary -------- -The extension adds integration for DataObjects.Net Core and ASP.NET Core. It contains SessionManager class -which is middleware and can be used as part of ASP.NET Core Pipeline. SessionManager opens session and transaction on going down the pipeline -and disposes them on going up the pipeline. - -SessionManager has the following features: -1. When Session.Current is accessed, and there is no current Session, it will provide a new instance of Session. - In that case a new transaction will be created. It will be committed when the pipeline execution returns to SessionManager without any exception, - otherwise it will be rolled back. -2. Setting SessionManager.Demand().HasErrors to true will lead to rollback of this transaction. -3. SessionManager.Current (and SessionManager.Demand()) returns the instance of SessionManager - bound to the current pipeline execution, i.e. current SessionManager. - Its Session property (if not null) is the same value as the one provided by Session.Current. - -Note that presence of SessionManager does not prevent you from creating Sessions manually. -It operates relying on Session.Resolver event, which is raised only when there is no current Session. - -Finally, no automatic Session + transaction will be provided, if you don't use Session.Current/Session.Demand() methods -in your code (directly or indirectly). So e.g. requests to static web pages won't lead to any DB interaction. - -Prerequisites -------------- -DataObjects.Net Core 0.1 or later (http://dataobjects.net) - -Implementation --------------- -To start using SessionManager it should be added to ASP.NET Middleware pipeline in Startup class like in example below - -public class Startup -{ - public Startup(IConfiguration configuration) - { - - } - - public void ConfigureServices(IServiceCollection services) - { - // Configure services - } - - public void Configure(IApplicationBuilder app, IHostingEnvironment env) - { - // Configure parts of the pipeline which are before SessionManager. - // It will be unable to use SessionManager functionality in these parts - // For instance, - app.UseStaticFiles() - - // Add session manager to the pipeline - app.UseSessionManager(); - - // Configure parts of the pipeline which are after SessionManager. - // These parts will work with SessionManager. - - // For instance, MVC controllers will be able to query data using DataObjects.Net - app.UseMvc(routes => - { - routes.MapRoute( - name: "default", - template: "{controller=Home}/{action=Index}/{id?}"); - }); - } +================ +Xtensive.Orm.Web +================ + +Summary +------- +The extension adds integration for DataObjects.Net Core and ASP.NET Core. It contains SessionManager class +which is middleware and can be used as part of ASP.NET Core Pipeline. SessionManager opens session and transaction on going down the pipeline +and disposes them on going up the pipeline. + +SessionManager has the following features: +1. When Session.Current is accessed, and there is no current Session, it will provide a new instance of Session. + In that case a new transaction will be created. It will be committed when the pipeline execution returns to SessionManager without any exception, + otherwise it will be rolled back. +2. Setting SessionManager.Demand().HasErrors to true will lead to rollback of this transaction. +3. SessionManager.Current (and SessionManager.Demand()) returns the instance of SessionManager + bound to the current pipeline execution, i.e. current SessionManager. + Its Session property (if not null) is the same value as the one provided by Session.Current. + +Note that presence of SessionManager does not prevent you from creating Sessions manually. +It operates relying on Session.Resolver event, which is raised only when there is no current Session. + +Finally, no automatic Session + transaction will be provided, if you don't use Session.Current/Session.Demand() methods +in your code (directly or indirectly). So e.g. requests to static web pages won't lead to any DB interaction. + +Prerequisites +------------- +DataObjects.Net Core 0.1 or later (http://dataobjects.net) + +Implementation +-------------- +To start using SessionManager it should be added to ASP.NET Middleware pipeline in Startup class like in example below + +public class Startup +{ + public Startup(IConfiguration configuration) + { + + } + + public void ConfigureServices(IServiceCollection services) + { + // Configure services + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + // Configure parts of the pipeline which are before SessionManager. + // It will be unable to use SessionManager functionality in these parts + // For instance, + app.UseStaticFiles() + + // Add session manager to the pipeline + app.UseSessionManager(); + + // Configure parts of the pipeline which are after SessionManager. + // These parts will work with SessionManager. + + // For instance, MVC controllers will be able to query data using DataObjects.Net + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Home}/{action=Index}/{id?}"); + }); + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Web/SessionManager.cs b/Extensions/Xtensive.Orm.Web/SessionManager.cs index 0922ca9be8..c0ab378efc 100644 --- a/Extensions/Xtensive.Orm.Web/SessionManager.cs +++ b/Extensions/Xtensive.Orm.Web/SessionManager.cs @@ -1,203 +1,203 @@ -using System; -using Xtensive.Core; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Builder; -using System.Threading.Tasks; -using System.Threading; - -namespace Xtensive.Orm.Web -{ - /// - /// Provides access to current . - /// - public class SessionManager - { - private static SessionManager current; - private static Func> sessionProvider; - - private static AsyncLocal> sessionAndTransactionPair = new AsyncLocal>(); - private static readonly AsyncLocal hasErrors = new AsyncLocal(); - - private readonly RequestDelegate nextMiddlewareRunner; - - /// - /// Gets or sets a delegate which will be used to provide session instead of build-in mechanisms. - /// - public static Func> SessionProvider - { - protected get - { - return sessionProvider; - } - set - { - if (sessionProvider != null) - throw Exceptions.AlreadyInitialized("SessionProvider"); - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - sessionProvider = value; - } - } - - /// - /// Gives access to current SessionManager. - /// - public static SessionManager Current - { - get - { - return current; - } - } - - /// - /// Gives access to current SessionManager. - /// - /// - /// SessionManager is not introduced to the pipeline or the the pipeline has not been configured yet. - public static SessionManager Demand() - { - var current = Current; - if (current == null) - throw new InvalidOperationException("SessionManager is not introduced to the pipeline or the the pipeline has not been configured yet."); - return current; - } - - - /// - /// Shows whether session is opened - /// - public bool HasSession - { - get { return sessionAndTransactionPair.Value != null && sessionAndTransactionPair.Value.First != null; } - } - - /// - /// Gets provided session. - /// - /// Session hasn't been opened yet - public Session Session - { - get - { - EnsureSessionIsProvided(); - return sessionAndTransactionPair.Value.First; - } - } - - /// - /// Gets or sets value indicating whether an error has occurred - /// on execution of the current request and transaction should be rollbacked. - /// - public bool HasErrors - { - get { return hasErrors.Value; } - set { hasErrors.Value = value; } - } - - /// - /// Current step of pipeline executor - /// - /// The HttpContext for current pipeline execution - /// Task - public async Task Invoke(HttpContext context) - { - BeforeActions(context); - - try - { - await nextMiddlewareRunner.Invoke(context); - } - catch (Exception) - { - HasErrors = true; - throw; - } - finally - { - AfterActions(context); - } - - } - - private static Domain GetDomain(HttpContext context) - { - return (Domain)context.RequestServices.GetService(typeof(Domain)); - } - - private static void EnableSessionResolver() - { - if (Session.Resolver == null) - Session.Resolver = () => Demand().Session; - } - - private static void DisableSessionResolver() - { - Session.Resolver = null; - } - - private void BeforeActions(HttpContext context) - { - var domain = GetDomain(context); - if (domain == null) - throw new InvalidOperationException("There is no domain registered in services. Make sure you add it in Startup.ConfigureServices(IServiceCollection) method."); - - hasErrors.Value = false; - ProvideSession(domain, context); - EnableSessionResolver(); - } - - private void AfterActions(HttpContext context) - { - DisableSessionResolver(); - var pair = sessionAndTransactionPair.Value; - sessionAndTransactionPair.Value = new Pair(null, null); - - pair.Second.Dispose(); - pair.First.Dispose(); - } - - private void ProvideSession(Domain domain, HttpContext context) - { - if (sessionAndTransactionPair.Value.First!=null) - throw new InvalidOperationException("Session has already provided."); - - Pair pair; - - if (sessionProvider == null) - pair = ProvideSessionInternal(domain, context); - else - pair = SessionProvider.Invoke(); - sessionAndTransactionPair.Value = pair; - } - - private Pair ProvideSessionInternal(Domain domain, HttpContext context) - { - var newSession = domain.OpenSession(); // Open, but don't activate! - var transactionScope = newSession.OpenTransaction(); - var newResource = transactionScope.Join(newSession); - return new Pair(newSession, new Disposable(disposing => { - try - { - if (!HasErrors) - transactionScope.Complete(); - } - finally - { - newResource.DisposeSafely(); - } - })); - } - - private void EnsureSessionIsProvided() - { - if (sessionAndTransactionPair.Value.First == null) - throw new InvalidOperationException("Session is not provided"); - } - - public SessionManager(RequestDelegate next) - { - nextMiddlewareRunner = next; - current = this; - } - } +using System; +using Xtensive.Core; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder; +using System.Threading.Tasks; +using System.Threading; + +namespace Xtensive.Orm.Web +{ + /// + /// Provides access to current . + /// + public class SessionManager + { + private static SessionManager current; + private static Func> sessionProvider; + + private static AsyncLocal> sessionAndTransactionPair = new AsyncLocal>(); + private static readonly AsyncLocal hasErrors = new AsyncLocal(); + + private readonly RequestDelegate nextMiddlewareRunner; + + /// + /// Gets or sets a delegate which will be used to provide session instead of build-in mechanisms. + /// + public static Func> SessionProvider + { + protected get + { + return sessionProvider; + } + set + { + if (sessionProvider != null) + throw Exceptions.AlreadyInitialized("SessionProvider"); + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + sessionProvider = value; + } + } + + /// + /// Gives access to current SessionManager. + /// + public static SessionManager Current + { + get + { + return current; + } + } + + /// + /// Gives access to current SessionManager. + /// + /// + /// SessionManager is not introduced to the pipeline or the the pipeline has not been configured yet. + public static SessionManager Demand() + { + var current = Current; + if (current == null) + throw new InvalidOperationException("SessionManager is not introduced to the pipeline or the the pipeline has not been configured yet."); + return current; + } + + + /// + /// Shows whether session is opened + /// + public bool HasSession + { + get { return sessionAndTransactionPair.Value != null && sessionAndTransactionPair.Value.First != null; } + } + + /// + /// Gets provided session. + /// + /// Session hasn't been opened yet + public Session Session + { + get + { + EnsureSessionIsProvided(); + return sessionAndTransactionPair.Value.First; + } + } + + /// + /// Gets or sets value indicating whether an error has occurred + /// on execution of the current request and transaction should be rollbacked. + /// + public bool HasErrors + { + get { return hasErrors.Value; } + set { hasErrors.Value = value; } + } + + /// + /// Current step of pipeline executor + /// + /// The HttpContext for current pipeline execution + /// Task + public async Task Invoke(HttpContext context) + { + BeforeActions(context); + + try + { + await nextMiddlewareRunner.Invoke(context); + } + catch (Exception) + { + HasErrors = true; + throw; + } + finally + { + AfterActions(context); + } + + } + + private static Domain GetDomain(HttpContext context) + { + return (Domain)context.RequestServices.GetService(typeof(Domain)); + } + + private static void EnableSessionResolver() + { + if (Session.Resolver == null) + Session.Resolver = () => Demand().Session; + } + + private static void DisableSessionResolver() + { + Session.Resolver = null; + } + + private void BeforeActions(HttpContext context) + { + var domain = GetDomain(context); + if (domain == null) + throw new InvalidOperationException("There is no domain registered in services. Make sure you add it in Startup.ConfigureServices(IServiceCollection) method."); + + hasErrors.Value = false; + ProvideSession(domain, context); + EnableSessionResolver(); + } + + private void AfterActions(HttpContext context) + { + DisableSessionResolver(); + var pair = sessionAndTransactionPair.Value; + sessionAndTransactionPair.Value = new Pair(null, null); + + pair.Second.Dispose(); + pair.First.Dispose(); + } + + private void ProvideSession(Domain domain, HttpContext context) + { + if (sessionAndTransactionPair.Value.First!=null) + throw new InvalidOperationException("Session has already provided."); + + Pair pair; + + if (sessionProvider == null) + pair = ProvideSessionInternal(domain, context); + else + pair = SessionProvider.Invoke(); + sessionAndTransactionPair.Value = pair; + } + + private Pair ProvideSessionInternal(Domain domain, HttpContext context) + { + var newSession = domain.OpenSession(); // Open, but don't activate! + var transactionScope = newSession.OpenTransaction(); + var newResource = transactionScope.Join(newSession); + return new Pair(newSession, new Disposable(disposing => { + try + { + if (!HasErrors) + transactionScope.Complete(); + } + finally + { + newResource.DisposeSafely(); + } + })); + } + + private void EnsureSessionIsProvided() + { + if (sessionAndTransactionPair.Value.First == null) + throw new InvalidOperationException("Session is not provided"); + } + + public SessionManager(RequestDelegate next) + { + nextMiddlewareRunner = next; + current = this; + } + } } \ No newline at end of file diff --git a/Extensions/Xtensive.Orm.Web/Xtensive.Orm.Web.csproj b/Extensions/Xtensive.Orm.Web/Xtensive.Orm.Web.csproj index d752868a78..789ee9293c 100644 --- a/Extensions/Xtensive.Orm.Web/Xtensive.Orm.Web.csproj +++ b/Extensions/Xtensive.Orm.Web/Xtensive.Orm.Web.csproj @@ -1,29 +1,29 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml - - - netcoreapp2.0 - Xtensive.Orm.Web - $(DoProductName) integration with ASP.NET Core - $(Title) - Adds integration with ASP.NET for $(DoProductName)-powered projects - true - ..\Extensions.snk - - - - - - - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\$(AssemblyName).xml + + + netcoreapp2.0 + Xtensive.Orm.Web + $(DoProductName) integration with ASP.NET Core + $(Title) + Adds integration with ASP.NET for $(DoProductName)-powered projects + true + ..\Extensions.snk + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MSBuild/DataObjects.Net.InternalBuild.targets b/MSBuild/DataObjects.Net.InternalBuild.targets index 3c0f0bdbec..fe00a0f7ae 100644 --- a/MSBuild/DataObjects.Net.InternalBuild.targets +++ b/MSBuild/DataObjects.Net.InternalBuild.targets @@ -1,10 +1,10 @@ - - - - - $(MSBuildThisFileDirectory)\..\_Build\$(Configuration)\ - - - - - + + + + + $(MSBuildThisFileDirectory)\..\_Build\$(Configuration)\ + + + + + diff --git a/MSBuild/DataObjects.Net.targets b/MSBuild/DataObjects.Net.targets index 96209fda07..cf878a800d 100644 --- a/MSBuild/DataObjects.Net.targets +++ b/MSBuild/DataObjects.Net.targets @@ -1,54 +1,54 @@ - - - - - - - - $(CompileDependsOn);XtensiveOrmBuild - $(MSBuildThisFileDirectory) - $(XtensiveOrmPath)\ - $(XtensiveOrmPath)tools\weaver\Xtensive.Orm.Weaver.dll - $(XtensiveOrmBuildDependsOn) - - - - - - - @(IntermediateAssembly -> '%(FullPath).weaver-cmd') - dotnet "$(XtensiveOrmWeaver)" @"$(XtensiveOrmWeaverResponseFile)" - - - - - - - - - - - - - - - - - - + + + + + + + + $(CompileDependsOn);XtensiveOrmBuild + $(MSBuildThisFileDirectory) + $(XtensiveOrmPath)\ + $(XtensiveOrmPath)tools\weaver\Xtensive.Orm.Weaver.dll + $(XtensiveOrmBuildDependsOn) + + + + + + + @(IntermediateAssembly -> '%(FullPath).weaver-cmd') + dotnet "$(XtensiveOrmWeaver)" @"$(XtensiveOrmWeaverResponseFile)" + + + + + + + + + + + + + + + + + + diff --git a/Orm.sln b/Orm.sln index bdba3c6625..7509f84d9c 100644 --- a/Orm.sln +++ b/Orm.sln @@ -1,247 +1,247 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29521.150 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm", "Orm\Xtensive.Orm\Xtensive.Orm.csproj", "{064D5B81-8D54-4F2F-9649-952F71E27E14}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Framework", "Orm\Xtensive.Orm.Tests.Framework\Xtensive.Orm.Tests.Framework.csproj", "{4E5C9208-426B-4536-AF7C-994C07E83FFA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests", "Orm\Xtensive.Orm.Tests\Xtensive.Orm.Tests.csproj", "{4A985241-6698-47AA-A9DD-F3847600D542}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Core", "Orm\Xtensive.Orm.Tests.Core\Xtensive.Orm.Tests.Core.csproj", "{411F1ECB-053D-470A-9B75-49D715B440D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Manual", "Orm\Xtensive.Orm.Manual\Xtensive.Orm.Manual.csproj", "{36F889C0-F5D9-43DF-9E6E-D18C97673973}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Sql", "Orm\Xtensive.Orm.Tests.Sql\Xtensive.Orm.Tests.Sql.csproj", "{E6268FB3-D38A-4849-A43D-CB0FF7B67E60}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.PostgreSql", "Orm\Xtensive.Orm.PostgreSql\Xtensive.Orm.PostgreSql.csproj", "{C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Firebird", "Orm\Xtensive.Orm.Firebird\Xtensive.Orm.Firebird.csproj", "{CB5E5E27-C723-494D-B288-036267823D28}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Oracle", "Orm\Xtensive.Orm.Oracle\Xtensive.Orm.Oracle.csproj", "{38F31CBB-034B-4231-91BE-D7D24C8A20F9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.MySql", "Orm\Xtensive.Orm.MySql\Xtensive.Orm.MySql.csproj", "{53CB563A-BE93-4061-BDB3-AC3B69093A90}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Sqlite", "Orm\Xtensive.Orm.Sqlite\Xtensive.Orm.Sqlite.csproj", "{6CA1FDE2-ECBA-4580-97C3-A00B707558DB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orm.Libs", "Orm.Libs", "{2302847B-292A-4650-A852-BDED40E1BB1C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orm.Tests", "Orm.Tests", "{8AAB1719-253A-47D2-970F-1911CFEE84B7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions.Libs", "Extensions.Libs", "{C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions.Tests", "Extensions.Tests", "{DC441957-AF79-423D-AA60-2F102926F6D2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.BulkOperations", "Extensions\Xtensive.Orm.BulkOperations\Xtensive.Orm.BulkOperations.csproj", "{DC44D096-DF24-41EC-9841-07F33E0A8EA3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Localization", "Extensions\Xtensive.Orm.Localization\Xtensive.Orm.Localization.csproj", "{1E0545D6-D979-48E0-A311-064BEDCE5A62}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.log4net", "Extensions\Xtensive.Orm.Logging.log4net\Xtensive.Orm.Logging.log4net.csproj", "{BA58CD9C-139B-41AB-915D-962765DFADBA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.NLog", "Extensions\Xtensive.Orm.Logging.NLog\Xtensive.Orm.Logging.NLog.csproj", "{6E052601-9E0C-473D-A617-AD74DED24DC0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Reprocessing", "Extensions\Xtensive.Orm.Reprocessing\Xtensive.Orm.Reprocessing.csproj", "{CE6BC11C-E785-4F10-A945-2416FD001689}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Security", "Extensions\Xtensive.Orm.Security\Xtensive.Orm.Security.csproj", "{48827567-3991-4767-BED5-C76CAD47628E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tracking", "Extensions\Xtensive.Orm.Tracking\Xtensive.Orm.Tracking.csproj", "{9CB81088-CF8A-400C-B80A-2D9782ED5B10}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Web", "Extensions\Xtensive.Orm.Web\Xtensive.Orm.Web.csproj", "{5E809296-02AA-4657-9FC1-CE0E0828B2B5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestCommon", "Extensions\TestCommon\TestCommon.csproj", "{0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.BulkOperations.Tests", "Extensions\Xtensive.Orm.BulkOperations.Tests\Xtensive.Orm.BulkOperations.Tests.csproj", "{23550452-235D-4413-952B-BB8A45CAF8B1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Localization.Tests", "Extensions\Xtensive.Orm.Localization.Tests\Xtensive.Orm.Localization.Tests.csproj", "{643D0EC3-D15E-4061-A3B7-EBB54EEB3069}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.log4net.Tests", "Extensions\Xtensive.Orm.Logging.log4net.Tests\Xtensive.Orm.Logging.log4net.Tests.csproj", "{2481997F-AC95-43B2-8A4E-0210E50387D5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.NLog.Tests", "Extensions\Xtensive.Orm.Logging.NLog.Tests\Xtensive.Orm.Logging.NLog.Tests.csproj", "{04580B17-B4FC-41A8-8ABC-336822F4ADB9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Reprocessing.Tests", "Extensions\Xtensive.Orm.Reprocessing.Tests\Xtensive.Orm.Reprocessing.Tests.csproj", "{6CBBB146-851F-49A6-88EC-01FFE455815B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Security.Tests", "Extensions\Xtensive.Orm.Security.Tests\Xtensive.Orm.Security.Tests.csproj", "{3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tracking.Tests", "Extensions\Xtensive.Orm.Tracking.Tests\Xtensive.Orm.Tracking.Tests.csproj", "{15CC7358-3A5B-4146-A5CB-78DAE75E88E6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Cfg", ".Cfg", "{C02BF3D5-F591-454D-81D4-A3135A24FB81}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitignore = .gitignore - Directory.Build.props = Directory.Build.props - User.Directory.Build.props.example = User.Directory.Build.props.example - Version.props = Version.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Weaver", "Weaver\Xtensive.Orm.Weaver\Xtensive.Orm.Weaver.csproj", "{75B3DB45-3055-4A22-854A-BD271D5E4218}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xtensive.Orm.SqlServer", "Orm\Xtensive.Orm.SqlServer\Xtensive.Orm.SqlServer.csproj", "{45000ADE-F647-4171-A91A-428CDF682603}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Publish", ".Publish", "{5726BBD8-14F9-4909-B765-3E7709223B61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPublish", "Publish\NuGetPublish.csproj", "{2CC55F3E-8EA5-4305-8716-D5B944120F82}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {064D5B81-8D54-4F2F-9649-952F71E27E14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {064D5B81-8D54-4F2F-9649-952F71E27E14}.Debug|Any CPU.Build.0 = Debug|Any CPU - {064D5B81-8D54-4F2F-9649-952F71E27E14}.Release|Any CPU.ActiveCfg = Release|Any CPU - {064D5B81-8D54-4F2F-9649-952F71E27E14}.Release|Any CPU.Build.0 = Release|Any CPU - {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Release|Any CPU.Build.0 = Release|Any CPU - {4A985241-6698-47AA-A9DD-F3847600D542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A985241-6698-47AA-A9DD-F3847600D542}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A985241-6698-47AA-A9DD-F3847600D542}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A985241-6698-47AA-A9DD-F3847600D542}.Release|Any CPU.Build.0 = Release|Any CPU - {411F1ECB-053D-470A-9B75-49D715B440D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {411F1ECB-053D-470A-9B75-49D715B440D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {411F1ECB-053D-470A-9B75-49D715B440D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {411F1ECB-053D-470A-9B75-49D715B440D6}.Release|Any CPU.Build.0 = Release|Any CPU - {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Release|Any CPU.Build.0 = Release|Any CPU - {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Release|Any CPU.Build.0 = Release|Any CPU - {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Release|Any CPU.Build.0 = Release|Any CPU - {CB5E5E27-C723-494D-B288-036267823D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB5E5E27-C723-494D-B288-036267823D28}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB5E5E27-C723-494D-B288-036267823D28}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB5E5E27-C723-494D-B288-036267823D28}.Release|Any CPU.Build.0 = Release|Any CPU - {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Release|Any CPU.Build.0 = Release|Any CPU - {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Debug|Any CPU.Build.0 = Debug|Any CPU - {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Release|Any CPU.Build.0 = Release|Any CPU - {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Release|Any CPU.Build.0 = Release|Any CPU - {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Release|Any CPU.Build.0 = Release|Any CPU - {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Release|Any CPU.Build.0 = Release|Any CPU - {BA58CD9C-139B-41AB-915D-962765DFADBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BA58CD9C-139B-41AB-915D-962765DFADBA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA58CD9C-139B-41AB-915D-962765DFADBA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BA58CD9C-139B-41AB-915D-962765DFADBA}.Release|Any CPU.Build.0 = Release|Any CPU - {6E052601-9E0C-473D-A617-AD74DED24DC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E052601-9E0C-473D-A617-AD74DED24DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E052601-9E0C-473D-A617-AD74DED24DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E052601-9E0C-473D-A617-AD74DED24DC0}.Release|Any CPU.Build.0 = Release|Any CPU - {CE6BC11C-E785-4F10-A945-2416FD001689}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CE6BC11C-E785-4F10-A945-2416FD001689}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE6BC11C-E785-4F10-A945-2416FD001689}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CE6BC11C-E785-4F10-A945-2416FD001689}.Release|Any CPU.Build.0 = Release|Any CPU - {48827567-3991-4767-BED5-C76CAD47628E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {48827567-3991-4767-BED5-C76CAD47628E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {48827567-3991-4767-BED5-C76CAD47628E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {48827567-3991-4767-BED5-C76CAD47628E}.Release|Any CPU.Build.0 = Release|Any CPU - {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Release|Any CPU.Build.0 = Release|Any CPU - {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Release|Any CPU.Build.0 = Release|Any CPU - {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Release|Any CPU.Build.0 = Release|Any CPU - {23550452-235D-4413-952B-BB8A45CAF8B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23550452-235D-4413-952B-BB8A45CAF8B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23550452-235D-4413-952B-BB8A45CAF8B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23550452-235D-4413-952B-BB8A45CAF8B1}.Release|Any CPU.Build.0 = Release|Any CPU - {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Debug|Any CPU.Build.0 = Debug|Any CPU - {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Release|Any CPU.ActiveCfg = Release|Any CPU - {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Release|Any CPU.Build.0 = Release|Any CPU - {2481997F-AC95-43B2-8A4E-0210E50387D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2481997F-AC95-43B2-8A4E-0210E50387D5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2481997F-AC95-43B2-8A4E-0210E50387D5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2481997F-AC95-43B2-8A4E-0210E50387D5}.Release|Any CPU.Build.0 = Release|Any CPU - {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Release|Any CPU.Build.0 = Release|Any CPU - {6CBBB146-851F-49A6-88EC-01FFE455815B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CBBB146-851F-49A6-88EC-01FFE455815B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CBBB146-851F-49A6-88EC-01FFE455815B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CBBB146-851F-49A6-88EC-01FFE455815B}.Release|Any CPU.Build.0 = Release|Any CPU - {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Release|Any CPU.Build.0 = Release|Any CPU - {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Release|Any CPU.Build.0 = Release|Any CPU - {75B3DB45-3055-4A22-854A-BD271D5E4218}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {75B3DB45-3055-4A22-854A-BD271D5E4218}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75B3DB45-3055-4A22-854A-BD271D5E4218}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75B3DB45-3055-4A22-854A-BD271D5E4218}.Release|Any CPU.Build.0 = Release|Any CPU - {45000ADE-F647-4171-A91A-428CDF682603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45000ADE-F647-4171-A91A-428CDF682603}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45000ADE-F647-4171-A91A-428CDF682603}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45000ADE-F647-4171-A91A-428CDF682603}.Release|Any CPU.Build.0 = Release|Any CPU - {2CC55F3E-8EA5-4305-8716-D5B944120F82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CC55F3E-8EA5-4305-8716-D5B944120F82}.Release|Any CPU.ActiveCfg = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {064D5B81-8D54-4F2F-9649-952F71E27E14} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {4E5C9208-426B-4536-AF7C-994C07E83FFA} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} - {4A985241-6698-47AA-A9DD-F3847600D542} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} - {411F1ECB-053D-470A-9B75-49D715B440D6} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} - {36F889C0-F5D9-43DF-9E6E-D18C97673973} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} - {E6268FB3-D38A-4849-A43D-CB0FF7B67E60} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} - {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {CB5E5E27-C723-494D-B288-036267823D28} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {38F31CBB-034B-4231-91BE-D7D24C8A20F9} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {53CB563A-BE93-4061-BDB3-AC3B69093A90} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {6CA1FDE2-ECBA-4580-97C3-A00B707558DB} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {DC44D096-DF24-41EC-9841-07F33E0A8EA3} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {1E0545D6-D979-48E0-A311-064BEDCE5A62} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {BA58CD9C-139B-41AB-915D-962765DFADBA} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {6E052601-9E0C-473D-A617-AD74DED24DC0} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {CE6BC11C-E785-4F10-A945-2416FD001689} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {48827567-3991-4767-BED5-C76CAD47628E} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {9CB81088-CF8A-400C-B80A-2D9782ED5B10} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {5E809296-02AA-4657-9FC1-CE0E0828B2B5} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} - {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {23550452-235D-4413-952B-BB8A45CAF8B1} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {643D0EC3-D15E-4061-A3B7-EBB54EEB3069} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {2481997F-AC95-43B2-8A4E-0210E50387D5} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {04580B17-B4FC-41A8-8ABC-336822F4ADB9} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {6CBBB146-851F-49A6-88EC-01FFE455815B} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {15CC7358-3A5B-4146-A5CB-78DAE75E88E6} = {DC441957-AF79-423D-AA60-2F102926F6D2} - {45000ADE-F647-4171-A91A-428CDF682603} = {2302847B-292A-4650-A852-BDED40E1BB1C} - {2CC55F3E-8EA5-4305-8716-D5B944120F82} = {5726BBD8-14F9-4909-B765-3E7709223B61} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F995719A-8D35-49A3-B271-42898A587F57} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29521.150 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm", "Orm\Xtensive.Orm\Xtensive.Orm.csproj", "{064D5B81-8D54-4F2F-9649-952F71E27E14}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Framework", "Orm\Xtensive.Orm.Tests.Framework\Xtensive.Orm.Tests.Framework.csproj", "{4E5C9208-426B-4536-AF7C-994C07E83FFA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests", "Orm\Xtensive.Orm.Tests\Xtensive.Orm.Tests.csproj", "{4A985241-6698-47AA-A9DD-F3847600D542}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Core", "Orm\Xtensive.Orm.Tests.Core\Xtensive.Orm.Tests.Core.csproj", "{411F1ECB-053D-470A-9B75-49D715B440D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Manual", "Orm\Xtensive.Orm.Manual\Xtensive.Orm.Manual.csproj", "{36F889C0-F5D9-43DF-9E6E-D18C97673973}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tests.Sql", "Orm\Xtensive.Orm.Tests.Sql\Xtensive.Orm.Tests.Sql.csproj", "{E6268FB3-D38A-4849-A43D-CB0FF7B67E60}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.PostgreSql", "Orm\Xtensive.Orm.PostgreSql\Xtensive.Orm.PostgreSql.csproj", "{C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Firebird", "Orm\Xtensive.Orm.Firebird\Xtensive.Orm.Firebird.csproj", "{CB5E5E27-C723-494D-B288-036267823D28}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Oracle", "Orm\Xtensive.Orm.Oracle\Xtensive.Orm.Oracle.csproj", "{38F31CBB-034B-4231-91BE-D7D24C8A20F9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.MySql", "Orm\Xtensive.Orm.MySql\Xtensive.Orm.MySql.csproj", "{53CB563A-BE93-4061-BDB3-AC3B69093A90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Sqlite", "Orm\Xtensive.Orm.Sqlite\Xtensive.Orm.Sqlite.csproj", "{6CA1FDE2-ECBA-4580-97C3-A00B707558DB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orm.Libs", "Orm.Libs", "{2302847B-292A-4650-A852-BDED40E1BB1C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Orm.Tests", "Orm.Tests", "{8AAB1719-253A-47D2-970F-1911CFEE84B7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions.Libs", "Extensions.Libs", "{C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions.Tests", "Extensions.Tests", "{DC441957-AF79-423D-AA60-2F102926F6D2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.BulkOperations", "Extensions\Xtensive.Orm.BulkOperations\Xtensive.Orm.BulkOperations.csproj", "{DC44D096-DF24-41EC-9841-07F33E0A8EA3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Localization", "Extensions\Xtensive.Orm.Localization\Xtensive.Orm.Localization.csproj", "{1E0545D6-D979-48E0-A311-064BEDCE5A62}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.log4net", "Extensions\Xtensive.Orm.Logging.log4net\Xtensive.Orm.Logging.log4net.csproj", "{BA58CD9C-139B-41AB-915D-962765DFADBA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.NLog", "Extensions\Xtensive.Orm.Logging.NLog\Xtensive.Orm.Logging.NLog.csproj", "{6E052601-9E0C-473D-A617-AD74DED24DC0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Reprocessing", "Extensions\Xtensive.Orm.Reprocessing\Xtensive.Orm.Reprocessing.csproj", "{CE6BC11C-E785-4F10-A945-2416FD001689}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Security", "Extensions\Xtensive.Orm.Security\Xtensive.Orm.Security.csproj", "{48827567-3991-4767-BED5-C76CAD47628E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tracking", "Extensions\Xtensive.Orm.Tracking\Xtensive.Orm.Tracking.csproj", "{9CB81088-CF8A-400C-B80A-2D9782ED5B10}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Web", "Extensions\Xtensive.Orm.Web\Xtensive.Orm.Web.csproj", "{5E809296-02AA-4657-9FC1-CE0E0828B2B5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestCommon", "Extensions\TestCommon\TestCommon.csproj", "{0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.BulkOperations.Tests", "Extensions\Xtensive.Orm.BulkOperations.Tests\Xtensive.Orm.BulkOperations.Tests.csproj", "{23550452-235D-4413-952B-BB8A45CAF8B1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Localization.Tests", "Extensions\Xtensive.Orm.Localization.Tests\Xtensive.Orm.Localization.Tests.csproj", "{643D0EC3-D15E-4061-A3B7-EBB54EEB3069}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.log4net.Tests", "Extensions\Xtensive.Orm.Logging.log4net.Tests\Xtensive.Orm.Logging.log4net.Tests.csproj", "{2481997F-AC95-43B2-8A4E-0210E50387D5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Logging.NLog.Tests", "Extensions\Xtensive.Orm.Logging.NLog.Tests\Xtensive.Orm.Logging.NLog.Tests.csproj", "{04580B17-B4FC-41A8-8ABC-336822F4ADB9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Reprocessing.Tests", "Extensions\Xtensive.Orm.Reprocessing.Tests\Xtensive.Orm.Reprocessing.Tests.csproj", "{6CBBB146-851F-49A6-88EC-01FFE455815B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Security.Tests", "Extensions\Xtensive.Orm.Security.Tests\Xtensive.Orm.Security.Tests.csproj", "{3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Tracking.Tests", "Extensions\Xtensive.Orm.Tracking.Tests\Xtensive.Orm.Tracking.Tests.csproj", "{15CC7358-3A5B-4146-A5CB-78DAE75E88E6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Cfg", ".Cfg", "{C02BF3D5-F591-454D-81D4-A3135A24FB81}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + User.Directory.Build.props.example = User.Directory.Build.props.example + Version.props = Version.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xtensive.Orm.Weaver", "Weaver\Xtensive.Orm.Weaver\Xtensive.Orm.Weaver.csproj", "{75B3DB45-3055-4A22-854A-BD271D5E4218}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xtensive.Orm.SqlServer", "Orm\Xtensive.Orm.SqlServer\Xtensive.Orm.SqlServer.csproj", "{45000ADE-F647-4171-A91A-428CDF682603}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Publish", ".Publish", "{5726BBD8-14F9-4909-B765-3E7709223B61}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPublish", "Publish\NuGetPublish.csproj", "{2CC55F3E-8EA5-4305-8716-D5B944120F82}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {064D5B81-8D54-4F2F-9649-952F71E27E14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {064D5B81-8D54-4F2F-9649-952F71E27E14}.Debug|Any CPU.Build.0 = Debug|Any CPU + {064D5B81-8D54-4F2F-9649-952F71E27E14}.Release|Any CPU.ActiveCfg = Release|Any CPU + {064D5B81-8D54-4F2F-9649-952F71E27E14}.Release|Any CPU.Build.0 = Release|Any CPU + {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E5C9208-426B-4536-AF7C-994C07E83FFA}.Release|Any CPU.Build.0 = Release|Any CPU + {4A985241-6698-47AA-A9DD-F3847600D542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A985241-6698-47AA-A9DD-F3847600D542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A985241-6698-47AA-A9DD-F3847600D542}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A985241-6698-47AA-A9DD-F3847600D542}.Release|Any CPU.Build.0 = Release|Any CPU + {411F1ECB-053D-470A-9B75-49D715B440D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {411F1ECB-053D-470A-9B75-49D715B440D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {411F1ECB-053D-470A-9B75-49D715B440D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {411F1ECB-053D-470A-9B75-49D715B440D6}.Release|Any CPU.Build.0 = Release|Any CPU + {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36F889C0-F5D9-43DF-9E6E-D18C97673973}.Release|Any CPU.Build.0 = Release|Any CPU + {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6268FB3-D38A-4849-A43D-CB0FF7B67E60}.Release|Any CPU.Build.0 = Release|Any CPU + {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9}.Release|Any CPU.Build.0 = Release|Any CPU + {CB5E5E27-C723-494D-B288-036267823D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB5E5E27-C723-494D-B288-036267823D28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB5E5E27-C723-494D-B288-036267823D28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB5E5E27-C723-494D-B288-036267823D28}.Release|Any CPU.Build.0 = Release|Any CPU + {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38F31CBB-034B-4231-91BE-D7D24C8A20F9}.Release|Any CPU.Build.0 = Release|Any CPU + {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53CB563A-BE93-4061-BDB3-AC3B69093A90}.Release|Any CPU.Build.0 = Release|Any CPU + {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CA1FDE2-ECBA-4580-97C3-A00B707558DB}.Release|Any CPU.Build.0 = Release|Any CPU + {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC44D096-DF24-41EC-9841-07F33E0A8EA3}.Release|Any CPU.Build.0 = Release|Any CPU + {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E0545D6-D979-48E0-A311-064BEDCE5A62}.Release|Any CPU.Build.0 = Release|Any CPU + {BA58CD9C-139B-41AB-915D-962765DFADBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA58CD9C-139B-41AB-915D-962765DFADBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA58CD9C-139B-41AB-915D-962765DFADBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA58CD9C-139B-41AB-915D-962765DFADBA}.Release|Any CPU.Build.0 = Release|Any CPU + {6E052601-9E0C-473D-A617-AD74DED24DC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E052601-9E0C-473D-A617-AD74DED24DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E052601-9E0C-473D-A617-AD74DED24DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E052601-9E0C-473D-A617-AD74DED24DC0}.Release|Any CPU.Build.0 = Release|Any CPU + {CE6BC11C-E785-4F10-A945-2416FD001689}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE6BC11C-E785-4F10-A945-2416FD001689}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE6BC11C-E785-4F10-A945-2416FD001689}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE6BC11C-E785-4F10-A945-2416FD001689}.Release|Any CPU.Build.0 = Release|Any CPU + {48827567-3991-4767-BED5-C76CAD47628E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48827567-3991-4767-BED5-C76CAD47628E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48827567-3991-4767-BED5-C76CAD47628E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48827567-3991-4767-BED5-C76CAD47628E}.Release|Any CPU.Build.0 = Release|Any CPU + {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CB81088-CF8A-400C-B80A-2D9782ED5B10}.Release|Any CPU.Build.0 = Release|Any CPU + {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E809296-02AA-4657-9FC1-CE0E0828B2B5}.Release|Any CPU.Build.0 = Release|Any CPU + {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291}.Release|Any CPU.Build.0 = Release|Any CPU + {23550452-235D-4413-952B-BB8A45CAF8B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23550452-235D-4413-952B-BB8A45CAF8B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23550452-235D-4413-952B-BB8A45CAF8B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23550452-235D-4413-952B-BB8A45CAF8B1}.Release|Any CPU.Build.0 = Release|Any CPU + {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Debug|Any CPU.Build.0 = Debug|Any CPU + {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Release|Any CPU.ActiveCfg = Release|Any CPU + {643D0EC3-D15E-4061-A3B7-EBB54EEB3069}.Release|Any CPU.Build.0 = Release|Any CPU + {2481997F-AC95-43B2-8A4E-0210E50387D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2481997F-AC95-43B2-8A4E-0210E50387D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2481997F-AC95-43B2-8A4E-0210E50387D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2481997F-AC95-43B2-8A4E-0210E50387D5}.Release|Any CPU.Build.0 = Release|Any CPU + {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04580B17-B4FC-41A8-8ABC-336822F4ADB9}.Release|Any CPU.Build.0 = Release|Any CPU + {6CBBB146-851F-49A6-88EC-01FFE455815B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CBBB146-851F-49A6-88EC-01FFE455815B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CBBB146-851F-49A6-88EC-01FFE455815B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CBBB146-851F-49A6-88EC-01FFE455815B}.Release|Any CPU.Build.0 = Release|Any CPU + {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9}.Release|Any CPU.Build.0 = Release|Any CPU + {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15CC7358-3A5B-4146-A5CB-78DAE75E88E6}.Release|Any CPU.Build.0 = Release|Any CPU + {75B3DB45-3055-4A22-854A-BD271D5E4218}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75B3DB45-3055-4A22-854A-BD271D5E4218}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75B3DB45-3055-4A22-854A-BD271D5E4218}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75B3DB45-3055-4A22-854A-BD271D5E4218}.Release|Any CPU.Build.0 = Release|Any CPU + {45000ADE-F647-4171-A91A-428CDF682603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45000ADE-F647-4171-A91A-428CDF682603}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45000ADE-F647-4171-A91A-428CDF682603}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45000ADE-F647-4171-A91A-428CDF682603}.Release|Any CPU.Build.0 = Release|Any CPU + {2CC55F3E-8EA5-4305-8716-D5B944120F82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CC55F3E-8EA5-4305-8716-D5B944120F82}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {064D5B81-8D54-4F2F-9649-952F71E27E14} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {4E5C9208-426B-4536-AF7C-994C07E83FFA} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} + {4A985241-6698-47AA-A9DD-F3847600D542} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} + {411F1ECB-053D-470A-9B75-49D715B440D6} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} + {36F889C0-F5D9-43DF-9E6E-D18C97673973} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} + {E6268FB3-D38A-4849-A43D-CB0FF7B67E60} = {8AAB1719-253A-47D2-970F-1911CFEE84B7} + {C9B5BFED-85BC-47AE-8872-0BA97AF7B8B9} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {CB5E5E27-C723-494D-B288-036267823D28} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {38F31CBB-034B-4231-91BE-D7D24C8A20F9} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {53CB563A-BE93-4061-BDB3-AC3B69093A90} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {6CA1FDE2-ECBA-4580-97C3-A00B707558DB} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {DC44D096-DF24-41EC-9841-07F33E0A8EA3} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {1E0545D6-D979-48E0-A311-064BEDCE5A62} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {BA58CD9C-139B-41AB-915D-962765DFADBA} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {6E052601-9E0C-473D-A617-AD74DED24DC0} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {CE6BC11C-E785-4F10-A945-2416FD001689} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {48827567-3991-4767-BED5-C76CAD47628E} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {9CB81088-CF8A-400C-B80A-2D9782ED5B10} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {5E809296-02AA-4657-9FC1-CE0E0828B2B5} = {C4AA9FB1-2A47-4E3A-A78C-BBE20EDCB3E1} + {0AB4E2E3-9F74-4CB9-A25D-5C8FD38D9291} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {23550452-235D-4413-952B-BB8A45CAF8B1} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {643D0EC3-D15E-4061-A3B7-EBB54EEB3069} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {2481997F-AC95-43B2-8A4E-0210E50387D5} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {04580B17-B4FC-41A8-8ABC-336822F4ADB9} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {6CBBB146-851F-49A6-88EC-01FFE455815B} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {3AC7C076-26BA-4185-A0FC-2B97D7AF48D9} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {15CC7358-3A5B-4146-A5CB-78DAE75E88E6} = {DC441957-AF79-423D-AA60-2F102926F6D2} + {45000ADE-F647-4171-A91A-428CDF682603} = {2302847B-292A-4650-A852-BDED40E1BB1C} + {2CC55F3E-8EA5-4305-8716-D5B944120F82} = {5726BBD8-14F9-4909-B765-3E7709223B61} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F995719A-8D35-49A3-B271-42898A587F57} + EndGlobalSection +EndGlobal diff --git a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/DomainHandler.cs b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/DomainHandler.cs index be1a8b1a3b..daddfff6c0 100644 --- a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/DomainHandler.cs +++ b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/DomainHandler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.01.27 - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.Firebird -{ - /// - /// A domain handler for Firebird RDBMS. - /// - public class DomainHandler : Providers.DomainHandler - { - protected override ICompiler CreateCompiler(CompilerConfiguration configuration) - { - return new SqlCompiler(Handlers, configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.01.27 + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.Firebird +{ + /// + /// A domain handler for Firebird RDBMS. + /// + public class DomainHandler : Providers.DomainHandler + { + protected override ICompiler CreateCompiler(CompilerConfiguration configuration) + { + return new SqlCompiler(Handlers, configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/HandlerFactory.cs b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/HandlerFactory.cs index fb1c501be6..f104f5d802 100644 --- a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/HandlerFactory.cs +++ b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/HandlerFactory.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.01.27 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Providers.Firebird -{ - /// - /// Storage provider for Firebird. - /// - [Provider(WellKnown.Provider.Firebird, typeof (Xtensive.Sql.Drivers.Firebird.DriverFactory))] - public class HandlerFactory : Providers.HandlerFactory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.01.27 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Providers.Firebird +{ + /// + /// Storage provider for Firebird. + /// + [Provider(WellKnown.Provider.Firebird, typeof (Xtensive.Sql.Drivers.Firebird.DriverFactory))] + public class HandlerFactory : Providers.HandlerFactory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/SqlCompiler.cs b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/SqlCompiler.cs index 2234e2fd2a..26c8cebf19 100644 --- a/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/SqlCompiler.cs +++ b/Orm/Xtensive.Orm.Firebird/Orm.Providers.Firebird/SqlCompiler.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.01.27 - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.Firebird -{ - internal class SqlCompiler : Providers.SqlCompiler - { - // Constructors - - public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) - : base(handlers, configuration) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.01.27 + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.Firebird +{ + internal class SqlCompiler : Providers.SqlCompiler + { + // Constructors + + public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) + : base(handlers, configuration) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Connection.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Connection.cs index d89324bea3..6610093690 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Connection.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Connection.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.08 - -using System; -using System.Data; -using System.Data.Common; -using FirebirdSql.Data.FirebirdClient; -using Xtensive.Orm; - -namespace Xtensive.Sql.Drivers.Firebird -{ - internal class Connection : SqlConnection - { - private FbConnection underlyingConnection; - private FbTransaction activeTransaction; - - /// - public override DbConnection UnderlyingConnection - { - get { return underlyingConnection; } - } - - /// - public override DbTransaction ActiveTransaction - { - get { return activeTransaction; } - } - - /// - public override DbParameter CreateParameter() - { - return new FbParameter(); - } - - /// - public override void BeginTransaction() - { - BeginTransaction(IsolationLevel.Serializable); - } - - /// - public override void BeginTransaction(IsolationLevel isolationLevel) - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - - var transactionOptions = new FbTransactionOptions {WaitTimeout = TimeSpan.FromSeconds(10)}; - switch (SqlHelper.ReduceIsolationLevel(isolationLevel)) { - case IsolationLevel.ReadCommitted: - transactionOptions.TransactionBehavior = FbTransactionBehavior.ReadCommitted - | FbTransactionBehavior.NoRecVersion - | FbTransactionBehavior.Write - | FbTransactionBehavior.NoWait; - break; - case IsolationLevel.Serializable: - transactionOptions.TransactionBehavior = FbTransactionBehavior.Concurrency - | FbTransactionBehavior.Write - | FbTransactionBehavior.Wait; - break; - } - activeTransaction = underlyingConnection.BeginTransaction(transactionOptions); - } - - /// - protected override void ClearActiveTransaction() - { - activeTransaction = null; - } - - /// - protected override void ClearUnderlyingConnection() - { - underlyingConnection = null; - } - - /// - public override void MakeSavepoint(string name) - { - EnsureTransactionIsActive(); - activeTransaction.Save(name); - } - - /// - public override void RollbackToSavepoint(string name) - { - EnsureTransactionIsActive(); - activeTransaction.Rollback(name); - } - - // Constructors - public Connection(SqlDriver driver) - : base(driver) - { - underlyingConnection = new FbConnection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.08 + +using System; +using System.Data; +using System.Data.Common; +using FirebirdSql.Data.FirebirdClient; +using Xtensive.Orm; + +namespace Xtensive.Sql.Drivers.Firebird +{ + internal class Connection : SqlConnection + { + private FbConnection underlyingConnection; + private FbTransaction activeTransaction; + + /// + public override DbConnection UnderlyingConnection + { + get { return underlyingConnection; } + } + + /// + public override DbTransaction ActiveTransaction + { + get { return activeTransaction; } + } + + /// + public override DbParameter CreateParameter() + { + return new FbParameter(); + } + + /// + public override void BeginTransaction() + { + BeginTransaction(IsolationLevel.Serializable); + } + + /// + public override void BeginTransaction(IsolationLevel isolationLevel) + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + + var transactionOptions = new FbTransactionOptions {WaitTimeout = TimeSpan.FromSeconds(10)}; + switch (SqlHelper.ReduceIsolationLevel(isolationLevel)) { + case IsolationLevel.ReadCommitted: + transactionOptions.TransactionBehavior = FbTransactionBehavior.ReadCommitted + | FbTransactionBehavior.NoRecVersion + | FbTransactionBehavior.Write + | FbTransactionBehavior.NoWait; + break; + case IsolationLevel.Serializable: + transactionOptions.TransactionBehavior = FbTransactionBehavior.Concurrency + | FbTransactionBehavior.Write + | FbTransactionBehavior.Wait; + break; + } + activeTransaction = underlyingConnection.BeginTransaction(transactionOptions); + } + + /// + protected override void ClearActiveTransaction() + { + activeTransaction = null; + } + + /// + protected override void ClearUnderlyingConnection() + { + underlyingConnection = null; + } + + /// + public override void MakeSavepoint(string name) + { + EnsureTransactionIsActive(); + activeTransaction.Save(name); + } + + /// + public override void RollbackToSavepoint(string name) + { + EnsureTransactionIsActive(); + activeTransaction.Rollback(name); + } + + // Constructors + public Connection(SqlDriver driver) + : base(driver) + { + underlyingConnection = new FbConnection(); + } + } } ; \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Constants.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Constants.cs index 7a79316f04..6b3fe68949 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Constants.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Constants.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.08 - -using System; - -namespace Xtensive.Sql.Drivers.Firebird -{ - internal static class Constants - { - public const string DefaultSchemaName = ""; // "Firebird"; - - public const string DateTimeFormatString = @"''\'yyyy\.MM\.dd HH\:mm\:ss\:FFF\'''"; - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.08 + +using System; + +namespace Xtensive.Sql.Drivers.Firebird +{ + internal static class Constants + { + public const string DefaultSchemaName = ""; // "Firebird"; + + public const string DateTimeFormatString = @"''\'yyyy\.MM\.dd HH\:mm\:ss\:FFF\'''"; + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Driver.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Driver.cs index 37165474df..58798f7293 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Driver.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Driver.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.08 - -using System.Linq; -using Xtensive.Sql.Info; -using FirebirdSql.Data.FirebirdClient; - -namespace Xtensive.Sql.Drivers.Firebird -{ - internal abstract class Driver : SqlDriver - { - /// - protected override SqlConnection DoCreateConnection() - { - return new Connection(this); - } - - /// - public override SqlExceptionType GetExceptionType(System.Exception exception) - { - var nativeException = exception as FbException; - if (nativeException==null) - return base.GetExceptionType(exception); - var fbError = nativeException.Errors.LastOrDefault(); - if (fbError==null) - return base.GetExceptionType(exception); - switch (fbError.Number) { - case 335544569: - return SqlExceptionType.SyntaxError; - case 335544347: // exactly: validation error for column - case 335544558: // exactly: operation violates check constraint - return SqlExceptionType.CheckConstraintViolation; - case 335544665: - return SqlExceptionType.UniqueConstraintViolation; - case 335544466: - return SqlExceptionType.ReferentialConstraintViolation; - case 335544336: // exactly: deadlock - case 335544345: // exactly: lock conflict on no wait transaction - return SqlExceptionType.Deadlock; - case 335544510: // exactly: lock_timeout on wait transaction - return SqlExceptionType.OperationTimeout; - default: - return SqlExceptionType.Unknown; - } - } - - // Constructors - - protected Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.08 + +using System.Linq; +using Xtensive.Sql.Info; +using FirebirdSql.Data.FirebirdClient; + +namespace Xtensive.Sql.Drivers.Firebird +{ + internal abstract class Driver : SqlDriver + { + /// + protected override SqlConnection DoCreateConnection() + { + return new Connection(this); + } + + /// + public override SqlExceptionType GetExceptionType(System.Exception exception) + { + var nativeException = exception as FbException; + if (nativeException==null) + return base.GetExceptionType(exception); + var fbError = nativeException.Errors.LastOrDefault(); + if (fbError==null) + return base.GetExceptionType(exception); + switch (fbError.Number) { + case 335544569: + return SqlExceptionType.SyntaxError; + case 335544347: // exactly: validation error for column + case 335544558: // exactly: operation violates check constraint + return SqlExceptionType.CheckConstraintViolation; + case 335544665: + return SqlExceptionType.UniqueConstraintViolation; + case 335544466: + return SqlExceptionType.ReferentialConstraintViolation; + case 335544336: // exactly: deadlock + case 335544345: // exactly: lock conflict on no wait transaction + return SqlExceptionType.Deadlock; + case 335544510: // exactly: lock_timeout on wait transaction + return SqlExceptionType.OperationTimeout; + default: + return SqlExceptionType.Unknown; + } + } + + // Constructors + + protected Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs index 0e5e451004..ebef162ec7 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.08 - -using System; -using System.Data.Common; -using System.Text.RegularExpressions; -using FirebirdSql.Data.FirebirdClient; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Drivers.Firebird.Resources; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Firebird -{ - /// - /// A factory for Firebird. - /// - public class DriverFactory : SqlDriverFactory - { - private const int DefaultPort = 3050; - - private const string DataSourceFormat = - "server={0};port={1};database={2};"; - - private const string DatabaseAndSchemaQuery = - "select mon$database_name, '" + Constants.DefaultSchemaName + "' from mon$database"; - - private const string ServerVersionParser = @"\d{1,3}\.\d{1,3}(?:\.\d{1,6})+"; - - /// - protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - using (var connection = new FbConnection(connectionString)) { - connection.Open(); - SqlHelper.ExecuteInitializationSql(connection, configuration); - var dataSource = new FbConnectionStringBuilder(connectionString).DataSource; - var defaultSchema = GetDefaultSchema(connection); - var coreServerInfo = new CoreServerInfo { - ServerVersion = GetVersionFromServerVersionString(connection.ServerVersion), - ConnectionString = connectionString, - MultipleActiveResultSets = true, - DatabaseName = defaultSchema.Database, - DefaultSchemaName = defaultSchema.Schema, - }; - - if (Int32.Parse(coreServerInfo.ServerVersion.Major.ToString() + coreServerInfo.ServerVersion.Minor.ToString()) < 25) - throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported); - if (coreServerInfo.ServerVersion.Major==2 && coreServerInfo.ServerVersion.Minor==5) - return new v2_5.Driver(coreServerInfo); - return null; - } - } - - /// - protected override string BuildConnectionString(UrlInfo connectionUrl) - { - SqlHelper.ValidateConnectionUrl(connectionUrl); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl.Resource, "connectionUrl.Resource"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl.Host, "connectionUrl.Host"); - - var builder = new FbConnectionStringBuilder(); - - // host, port, database - if (!string.IsNullOrEmpty(connectionUrl.Host)) { - int port = connectionUrl.Port!=0 ? connectionUrl.Port : DefaultPort; - // builder.DataSource = string.Format(DataSourceFormat, connectionUrl.Host, port, connectionUrl.Resource); - builder.Database = connectionUrl.Resource; - builder.DataSource = connectionUrl.Host; - builder.Dialect = 3; - builder.Pooling = false; - builder.Port = port; - builder.ReturnRecordsAffected = true; - } - - // user, password - if (!string.IsNullOrEmpty(connectionUrl.User)) { - builder.UserID = connectionUrl.User; - builder.Password = connectionUrl.Password; - } - - // custom options - foreach (var parameter in connectionUrl.Params) - builder.Add(parameter.Key, parameter.Value); - - return builder.ToString(); - } - - /// - protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) - { - return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); - } - - private Version GetVersionFromServerVersionString(string serverVersionString) - { - var matcher = new Regex(ServerVersionParser); - var match = matcher.Match(serverVersionString); - if (!match.Success) - throw new InvalidOperationException("Unable to parse server version"); - return new Version(match.Value); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.08 + +using System; +using System.Data.Common; +using System.Text.RegularExpressions; +using FirebirdSql.Data.FirebirdClient; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Drivers.Firebird.Resources; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Firebird +{ + /// + /// A factory for Firebird. + /// + public class DriverFactory : SqlDriverFactory + { + private const int DefaultPort = 3050; + + private const string DataSourceFormat = + "server={0};port={1};database={2};"; + + private const string DatabaseAndSchemaQuery = + "select mon$database_name, '" + Constants.DefaultSchemaName + "' from mon$database"; + + private const string ServerVersionParser = @"\d{1,3}\.\d{1,3}(?:\.\d{1,6})+"; + + /// + protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + using (var connection = new FbConnection(connectionString)) { + connection.Open(); + SqlHelper.ExecuteInitializationSql(connection, configuration); + var dataSource = new FbConnectionStringBuilder(connectionString).DataSource; + var defaultSchema = GetDefaultSchema(connection); + var coreServerInfo = new CoreServerInfo { + ServerVersion = GetVersionFromServerVersionString(connection.ServerVersion), + ConnectionString = connectionString, + MultipleActiveResultSets = true, + DatabaseName = defaultSchema.Database, + DefaultSchemaName = defaultSchema.Schema, + }; + + if (Int32.Parse(coreServerInfo.ServerVersion.Major.ToString() + coreServerInfo.ServerVersion.Minor.ToString()) < 25) + throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported); + if (coreServerInfo.ServerVersion.Major==2 && coreServerInfo.ServerVersion.Minor==5) + return new v2_5.Driver(coreServerInfo); + return null; + } + } + + /// + protected override string BuildConnectionString(UrlInfo connectionUrl) + { + SqlHelper.ValidateConnectionUrl(connectionUrl); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl.Resource, "connectionUrl.Resource"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl.Host, "connectionUrl.Host"); + + var builder = new FbConnectionStringBuilder(); + + // host, port, database + if (!string.IsNullOrEmpty(connectionUrl.Host)) { + int port = connectionUrl.Port!=0 ? connectionUrl.Port : DefaultPort; + // builder.DataSource = string.Format(DataSourceFormat, connectionUrl.Host, port, connectionUrl.Resource); + builder.Database = connectionUrl.Resource; + builder.DataSource = connectionUrl.Host; + builder.Dialect = 3; + builder.Pooling = false; + builder.Port = port; + builder.ReturnRecordsAffected = true; + } + + // user, password + if (!string.IsNullOrEmpty(connectionUrl.User)) { + builder.UserID = connectionUrl.User; + builder.Password = connectionUrl.Password; + } + + // custom options + foreach (var parameter in connectionUrl.Params) + builder.Add(parameter.Key, parameter.Value); + + return builder.ToString(); + } + + /// + protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) + { + return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); + } + + private Version GetVersionFromServerVersionString(string serverVersionString) + { + var matcher = new Regex(ServerVersionParser); + var match = matcher.Match(serverVersionString); + if (!match.Success) + throw new InvalidOperationException("Unable to parse server version"); + return new Version(match.Value); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.Designer.cs index c2327038e1..55c1209a20 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.Designer.cs @@ -1,81 +1,81 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Sql.Drivers.Firebird.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Firebird.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Firebird version below 2.5 is not supported!. - /// - internal static string ExFirebirdBelow25IsNotSupported { - get { - return ResourceManager.GetString("ExFirebirdBelow25IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid smallint value for bool!. - /// - internal static string ExInvalidBooleanSmallintValue { - get { - return ResourceManager.GetString("ExInvalidBooleanSmallintValue", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Sql.Drivers.Firebird.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Firebird.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Firebird version below 2.5 is not supported!. + /// + internal static string ExFirebirdBelow25IsNotSupported { + get { + return ResourceManager.GetString("ExFirebirdBelow25IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid smallint value for bool!. + /// + internal static string ExInvalidBooleanSmallintValue { + get { + return ResourceManager.GetString("ExInvalidBooleanSmallintValue", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.resx b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.resx index b9e598418c..4414275e5e 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/Resources/Strings.resx @@ -1,126 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Firebird version below 2.5 is not supported! - - - Invalid smallint value for bool! - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Firebird version below 2.5 is not supported! + + + Invalid smallint value for bool! + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs index 075b2ba2b4..ab47b9c79f 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs @@ -1,313 +1,313 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.17 - -using System; -using System.Linq; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal class Compiler : SqlCompiler - { - protected static readonly long NanosecondsPerDay = TimeSpan.FromDays(1).Ticks * 100; - protected static readonly long NanosecondsPerSecond = 1000000000; - protected static readonly long NanosecondsPerMillisecond = 1000000; - protected static readonly long MillisecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds; - protected static readonly long MillisecondsPerSecond = 1000L; - private bool case_SqlDateTimePart_DayOfYear; - private bool case_SqlDateTimePart_Second; - - - /// - public override void Visit(SqlSelect node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); - VisitSelectLimitOffset(node); - VisitSelectColumns(node); - VisitSelectFrom(node); - VisitSelectWhere(node); - VisitSelectGroupBy(node); - VisitSelectOrderBy(node); - VisitSelectLock(node); - context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); - } - } - - /// - public override void VisitSelectFrom(SqlSelect node) - { - if (node.From!=null) - base.VisitSelectFrom(node); - else - context.Output.AppendText("FROM RDB$DATABASE"); - } - - /// - public override void Visit(SqlQueryExpression node) - { - using (context.EnterScope(node)) { - bool needOpeningParenthesis = false; - bool needClosingParenthesis = false; - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); - if (needOpeningParenthesis) - context.Output.AppendText("("); - node.Left.AcceptVisitor(this); - if (needClosingParenthesis) - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(node.NodeType)); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); - if (needOpeningParenthesis) - context.Output.AppendText("("); - node.Right.AcceptVisitor(this); - if (needClosingParenthesis) - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); - } - } - - /// - public override void Visit(SqlExtract node) - { - switch (node.IntervalPart) { - case SqlIntervalPart.Day: - Visit(CastToLong(node.Operand / NanosecondsPerDay)); - return; - case SqlIntervalPart.Hour: - Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24); - return; - case SqlIntervalPart.Minute: - Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60); - return; - case SqlIntervalPart.Second: - Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60); - return; - case SqlIntervalPart.Millisecond: - Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond); - return; - case SqlIntervalPart.Nanosecond: - Visit(CastToLong(node.Operand)); - return; - } - switch (node.DateTimePart) { - case SqlDateTimePart.DayOfYear: - if (!case_SqlDateTimePart_DayOfYear) { - case_SqlDateTimePart_DayOfYear = true; - Visit(SqlDml.Add(node, SqlDml.Literal(1))); - case_SqlDateTimePart_DayOfYear = false; - } - else - base.Visit(node); - return; - case SqlDateTimePart.Second: - if (!case_SqlDateTimePart_Second) { - case_SqlDateTimePart_Second = true; - Visit(SqlDml.Truncate(node)); - case_SqlDateTimePart_Second = false; - } - else - base.Visit(node); - return; - } - base.Visit(node); - } - - /// - public override void Visit(SqlUnary node) - { - if (node.NodeType==SqlNodeType.BitNot) { - Visit(BitNot(node.Operand)); - return; - } - base.Visit(node); - } - - /// - public override void Visit(SqlBinary node) - { - switch (node.NodeType) { - case SqlNodeType.DateTimePlusInterval: - DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusInterval: - DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusDateTime: - DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.Modulo: - Visit(SqlDml.FunctionCall(translator.Translate(SqlNodeType.Modulo), node.Left, node.Right)); - return; - case SqlNodeType.BitAnd: - BitAnd(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.BitOr: - BitOr(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.BitXor: - BitXor(node.Left, node.Right).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - /// - public override void Visit(SqlFunctionCall node) - { - switch (node.FunctionType) { - case SqlFunctionType.Concat: - var exprs = new SqlExpression[node.Arguments.Count]; - node.Arguments.CopyTo(exprs, 0); - Visit(SqlDml.Concat(exprs)); - return; - case SqlFunctionType.DateTimeTruncate: - Visit(SqlDml.Cast(node.Arguments[0], new SqlValueType("Date"))); - return; - case SqlFunctionType.IntervalToMilliseconds: - Visit(CastToLong(node.Arguments[0]) / NanosecondsPerMillisecond); - return; - case SqlFunctionType.IntervalConstruct: - case SqlFunctionType.IntervalToNanoseconds: - Visit(CastToLong(node.Arguments[0])); - return; - case SqlFunctionType.DateTimeAddMonths: - Visit(DateAddMonth(node.Arguments[0], node.Arguments[1])); - return; - case SqlFunctionType.DateTimeAddYears: - Visit(DateAddYear(node.Arguments[0], node.Arguments[1])); - return; - case SqlFunctionType.DateTimeConstruct: - Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Cast(SqlDml.Literal(new DateTime(2001, 1, 1)), SqlType.DateTime), - node.Arguments[0] - 2001), - node.Arguments[1] - 1), - node.Arguments[2] - 1)); - return; - case SqlFunctionType.DateTimeToStringIso: - Visit(DateTimeToStringIso(node.Arguments[0])); - return; - } - - base.Visit(node); - } - - public override void Visit(SqlRenameTable node) - { - throw new NotSupportedException(); - } - - public override void Visit(SqlAlterSequence node) - { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - - #region Static helpers - - protected static SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) - { - return CastToLong(DateDiffDay(date2, date1)) * NanosecondsPerDay - + - CastToLong(DateDiffMillisecond(DateAddDay(date2, DateDiffDay(date2, date1)), date1)) * - NanosecondsPerMillisecond; - } - - protected static SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) - { - return DateAddMillisecond( - DateAddDay(date, interval / NanosecondsPerDay), - (interval / NanosecondsPerMillisecond) % (MillisecondsPerDay)); - } - - protected static SqlCast CastToLong(SqlExpression arg) - { - return SqlDml.Cast(arg, SqlType.Int64); - } - - protected static SqlUserFunctionCall DateDiffDay(SqlExpression date1, SqlExpression date2) - { - return SqlDml.FunctionCall("DATEDIFF", SqlDml.Native("DAY"), date1, date2); - } - - protected static SqlUserFunctionCall DateDiffMillisecond(SqlExpression date1, SqlExpression date2) - { - return SqlDml.FunctionCall("DATEDIFF", SqlDml.Native("MILLISECOND"), date1, date2); - } - - protected static SqlUserFunctionCall DateAddYear(SqlExpression date, SqlExpression years) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("YEAR"), years, date); - } - - protected static SqlUserFunctionCall DateAddMonth(SqlExpression date, SqlExpression months) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MONTH"), months, date); - } - - protected static SqlUserFunctionCall DateAddDay(SqlExpression date, SqlExpression days) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("DAY"), days, date); - } - - protected static SqlUserFunctionCall DateAddHour(SqlExpression date, SqlExpression hours) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("HOUR"), hours, date); - } - - protected static SqlUserFunctionCall DateAddMinute(SqlExpression date, SqlExpression minutes) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MINUTE"), minutes, date); - } - - protected static SqlUserFunctionCall DateAddSecond(SqlExpression date, SqlExpression seconds) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("SECOND"), seconds, date); - } - - protected static SqlUserFunctionCall DateAddMillisecond(SqlExpression date, SqlExpression milliseconds) - { - return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MILLISECOND"), milliseconds, date); - } - - protected static SqlUserFunctionCall BitAnd(SqlExpression left, SqlExpression right) - { - return SqlDml.FunctionCall("BIN_AND", left, right); - } - - protected static SqlUserFunctionCall BitOr(SqlExpression left, SqlExpression right) - { - return SqlDml.FunctionCall("BIN_OR", left, right); - } - - protected static SqlUserFunctionCall BitXor(SqlExpression left, SqlExpression right) - { - return SqlDml.FunctionCall("BIN_XOR", left, right); - } - - protected static SqlUserFunctionCall BitNot(SqlExpression operand) - { - return SqlDml.FunctionCall("BIN_NOT", operand); - } - - protected static SqlConcat DateTimeToStringIso(SqlExpression dateTime) - { - var date = SqlDml.Substring(dateTime, 0, 10); - var time = SqlDml.Substring(dateTime, 11, 8); - - return SqlDml.Concat(date, SqlDml.Literal("T"), time); - } - - #endregion - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.17 + +using System; +using System.Linq; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal class Compiler : SqlCompiler + { + protected static readonly long NanosecondsPerDay = TimeSpan.FromDays(1).Ticks * 100; + protected static readonly long NanosecondsPerSecond = 1000000000; + protected static readonly long NanosecondsPerMillisecond = 1000000; + protected static readonly long MillisecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds; + protected static readonly long MillisecondsPerSecond = 1000L; + private bool case_SqlDateTimePart_DayOfYear; + private bool case_SqlDateTimePart_Second; + + + /// + public override void Visit(SqlSelect node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); + VisitSelectLimitOffset(node); + VisitSelectColumns(node); + VisitSelectFrom(node); + VisitSelectWhere(node); + VisitSelectGroupBy(node); + VisitSelectOrderBy(node); + VisitSelectLock(node); + context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); + } + } + + /// + public override void VisitSelectFrom(SqlSelect node) + { + if (node.From!=null) + base.VisitSelectFrom(node); + else + context.Output.AppendText("FROM RDB$DATABASE"); + } + + /// + public override void Visit(SqlQueryExpression node) + { + using (context.EnterScope(node)) { + bool needOpeningParenthesis = false; + bool needClosingParenthesis = false; + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); + if (needOpeningParenthesis) + context.Output.AppendText("("); + node.Left.AcceptVisitor(this); + if (needClosingParenthesis) + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(node.NodeType)); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); + if (needOpeningParenthesis) + context.Output.AppendText("("); + node.Right.AcceptVisitor(this); + if (needClosingParenthesis) + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); + } + } + + /// + public override void Visit(SqlExtract node) + { + switch (node.IntervalPart) { + case SqlIntervalPart.Day: + Visit(CastToLong(node.Operand / NanosecondsPerDay)); + return; + case SqlIntervalPart.Hour: + Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24); + return; + case SqlIntervalPart.Minute: + Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60); + return; + case SqlIntervalPart.Second: + Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60); + return; + case SqlIntervalPart.Millisecond: + Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond); + return; + case SqlIntervalPart.Nanosecond: + Visit(CastToLong(node.Operand)); + return; + } + switch (node.DateTimePart) { + case SqlDateTimePart.DayOfYear: + if (!case_SqlDateTimePart_DayOfYear) { + case_SqlDateTimePart_DayOfYear = true; + Visit(SqlDml.Add(node, SqlDml.Literal(1))); + case_SqlDateTimePart_DayOfYear = false; + } + else + base.Visit(node); + return; + case SqlDateTimePart.Second: + if (!case_SqlDateTimePart_Second) { + case_SqlDateTimePart_Second = true; + Visit(SqlDml.Truncate(node)); + case_SqlDateTimePart_Second = false; + } + else + base.Visit(node); + return; + } + base.Visit(node); + } + + /// + public override void Visit(SqlUnary node) + { + if (node.NodeType==SqlNodeType.BitNot) { + Visit(BitNot(node.Operand)); + return; + } + base.Visit(node); + } + + /// + public override void Visit(SqlBinary node) + { + switch (node.NodeType) { + case SqlNodeType.DateTimePlusInterval: + DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusInterval: + DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusDateTime: + DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.Modulo: + Visit(SqlDml.FunctionCall(translator.Translate(SqlNodeType.Modulo), node.Left, node.Right)); + return; + case SqlNodeType.BitAnd: + BitAnd(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.BitOr: + BitOr(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.BitXor: + BitXor(node.Left, node.Right).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + /// + public override void Visit(SqlFunctionCall node) + { + switch (node.FunctionType) { + case SqlFunctionType.Concat: + var exprs = new SqlExpression[node.Arguments.Count]; + node.Arguments.CopyTo(exprs, 0); + Visit(SqlDml.Concat(exprs)); + return; + case SqlFunctionType.DateTimeTruncate: + Visit(SqlDml.Cast(node.Arguments[0], new SqlValueType("Date"))); + return; + case SqlFunctionType.IntervalToMilliseconds: + Visit(CastToLong(node.Arguments[0]) / NanosecondsPerMillisecond); + return; + case SqlFunctionType.IntervalConstruct: + case SqlFunctionType.IntervalToNanoseconds: + Visit(CastToLong(node.Arguments[0])); + return; + case SqlFunctionType.DateTimeAddMonths: + Visit(DateAddMonth(node.Arguments[0], node.Arguments[1])); + return; + case SqlFunctionType.DateTimeAddYears: + Visit(DateAddYear(node.Arguments[0], node.Arguments[1])); + return; + case SqlFunctionType.DateTimeConstruct: + Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Cast(SqlDml.Literal(new DateTime(2001, 1, 1)), SqlType.DateTime), + node.Arguments[0] - 2001), + node.Arguments[1] - 1), + node.Arguments[2] - 1)); + return; + case SqlFunctionType.DateTimeToStringIso: + Visit(DateTimeToStringIso(node.Arguments[0])); + return; + } + + base.Visit(node); + } + + public override void Visit(SqlRenameTable node) + { + throw new NotSupportedException(); + } + + public override void Visit(SqlAlterSequence node) + { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + + #region Static helpers + + protected static SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) + { + return CastToLong(DateDiffDay(date2, date1)) * NanosecondsPerDay + + + CastToLong(DateDiffMillisecond(DateAddDay(date2, DateDiffDay(date2, date1)), date1)) * + NanosecondsPerMillisecond; + } + + protected static SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) + { + return DateAddMillisecond( + DateAddDay(date, interval / NanosecondsPerDay), + (interval / NanosecondsPerMillisecond) % (MillisecondsPerDay)); + } + + protected static SqlCast CastToLong(SqlExpression arg) + { + return SqlDml.Cast(arg, SqlType.Int64); + } + + protected static SqlUserFunctionCall DateDiffDay(SqlExpression date1, SqlExpression date2) + { + return SqlDml.FunctionCall("DATEDIFF", SqlDml.Native("DAY"), date1, date2); + } + + protected static SqlUserFunctionCall DateDiffMillisecond(SqlExpression date1, SqlExpression date2) + { + return SqlDml.FunctionCall("DATEDIFF", SqlDml.Native("MILLISECOND"), date1, date2); + } + + protected static SqlUserFunctionCall DateAddYear(SqlExpression date, SqlExpression years) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("YEAR"), years, date); + } + + protected static SqlUserFunctionCall DateAddMonth(SqlExpression date, SqlExpression months) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MONTH"), months, date); + } + + protected static SqlUserFunctionCall DateAddDay(SqlExpression date, SqlExpression days) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("DAY"), days, date); + } + + protected static SqlUserFunctionCall DateAddHour(SqlExpression date, SqlExpression hours) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("HOUR"), hours, date); + } + + protected static SqlUserFunctionCall DateAddMinute(SqlExpression date, SqlExpression minutes) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MINUTE"), minutes, date); + } + + protected static SqlUserFunctionCall DateAddSecond(SqlExpression date, SqlExpression seconds) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("SECOND"), seconds, date); + } + + protected static SqlUserFunctionCall DateAddMillisecond(SqlExpression date, SqlExpression milliseconds) + { + return SqlDml.FunctionCall("DATEADD", SqlDml.Native("MILLISECOND"), milliseconds, date); + } + + protected static SqlUserFunctionCall BitAnd(SqlExpression left, SqlExpression right) + { + return SqlDml.FunctionCall("BIN_AND", left, right); + } + + protected static SqlUserFunctionCall BitOr(SqlExpression left, SqlExpression right) + { + return SqlDml.FunctionCall("BIN_OR", left, right); + } + + protected static SqlUserFunctionCall BitXor(SqlExpression left, SqlExpression right) + { + return SqlDml.FunctionCall("BIN_XOR", left, right); + } + + protected static SqlUserFunctionCall BitNot(SqlExpression operand) + { + return SqlDml.FunctionCall("BIN_NOT", operand); + } + + protected static SqlConcat DateTimeToStringIso(SqlExpression dateTime) + { + var date = SqlDml.Substring(dateTime, 0, 10); + var time = SqlDml.Substring(dateTime, 11, 8); + + return SqlDml.Concat(date, SqlDml.Literal("T"), time); + } + + #endregion + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Driver.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Driver.cs index ac72cb182f..f915c31c80 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Driver.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Driver.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.10 - -using System; -using Xtensive.Sql.Info; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal class Driver : Firebird.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - // throw new NotImplementedException("Firebird.v2_5.Compiler"); - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.10 + +using System; +using Xtensive.Sql.Info; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal class Driver : Firebird.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + // throw new NotImplementedException("Firebird.v2_5.Compiler"); + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.Queries.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.Queries.cs index 31ff526715..5fc48fe696 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.Queries.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.Queries.cs @@ -1,197 +1,197 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.13 - -using System; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal partial class Extractor - { - protected virtual string GetExtractSchemasQuery() - { - return @"select " + Constants.DefaultSchemaName + @"from rdb$database"; - } - - protected virtual string GetExtractTablesQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(rdb$relation_name) as table_name - ,rdb$relation_type as table_type -from rdb$relations -where rdb$relation_type in (0, 5, 4) and rdb$relation_name not starts with 'RDB$' and rdb$relation_name not starts with 'MON$'"; - } - - protected virtual string GetExtractTableColumnsQuery() - { - return @" -select schema - ,table_name - ,ordinal_position - ,column_name - ,field_type - ,column_subtype - ,column_size - ,numeric_precision - ,-numeric_scale as numeric_scale - ,character_max_length - ,(1 - coalesce(column_nullable,0)) as column_nullable - ,column_default -from (select cast(null as varchar(30)) as schema - ,trim(rfr.rdb$relation_name) as table_name - ,trim(rfr.rdb$field_name) as column_name - ,fld.rdb$field_sub_type as column_subtype - ,cast(fld.rdb$field_length as integer) as column_size - ,cast(fld.rdb$field_precision as integer) as numeric_precision - ,cast(fld.rdb$field_scale as integer) as numeric_scale - ,cast(fld.rdb$character_length as integer) as character_max_length - ,cast(fld.rdb$field_length as integer) as character_octet_length - ,rfr.rdb$field_position as ordinal_position - ,trim(rfr.rdb$field_source) as domain_name - ,trim(rfr.rdb$default_source) as column_default - ,trim(fld.rdb$computed_source) as computed_source - ,fld.rdb$dimensions as column_array - ,coalesce(fld.rdb$null_flag, rfr.rdb$null_flag) as column_nullable - ,0 as is_readonly - ,fld.rdb$field_type as field_type - ,trim(cs.rdb$character_set_name) as character_set_name - ,trim(coll.rdb$collation_name) as collation_name - ,trim(rfr.rdb$description) as description - from rdb$relations rr join rdb$relation_fields rfr on rfr.rdb$relation_name = rr.rdb$relation_name - left join rdb$fields fld on rfr.rdb$field_source = fld.rdb$field_name - left join rdb$character_sets cs - on cs.rdb$character_set_id = fld.rdb$character_set_id - left join rdb$collations coll - on (coll.rdb$collation_id = fld.rdb$collation_id - and coll.rdb$character_set_id = fld.rdb$character_set_id) - where rr.rdb$relation_type in (0, 4, 5) and rr.rdb$relation_name not starts with 'RDB$' and rr.rdb$relation_name not starts with 'MON$' - order by table_name, ordinal_position)"; - } - - protected virtual string GetExtractViewsQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(rdb$relation_name) as table_name - ,rdb$view_source as view_source -from rdb$relations -where rdb$relation_type = 1"; - } - - protected virtual string GetExtractViewColumnsQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(rfr.rdb$relation_name) as table_name - ,trim(rfr.rdb$field_name) as column_name - ,rfr.rdb$field_position as ordinal_position -from rdb$relations rr join rdb$relation_fields rfr on rfr.rdb$relation_name = rr.rdb$relation_name -where rr.rdb$relation_type = 1 -order by rfr.rdb$relation_name, rfr.rdb$field_position"; - } - - protected virtual string GetExtractIndexesQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(ri.rdb$relation_name) as table_name - ,trim(ri.rdb$index_name) as index_name - ,ri.rdb$index_id as index_seq - ,ri.rdb$index_type as descend - ,ri.rdb$unique_flag as unique_flag - ,trim(ris.rdb$field_name) as column_name - ,ris.rdb$field_position as column_position - ,ri.rdb$expression_source as expression_source -from rdb$indices ri left join rdb$index_segments ris on ris.rdb$index_name = ri.rdb$index_name -where ri.rdb$system_flag = 0 - and not exists - (select 1 - from rdb$relation_constraints rc - where rc.rdb$constraint_type in ('PRIMARY KEY', 'FOREIGN KEY') - and rc.rdb$relation_name = ri.rdb$relation_name - and rc.rdb$index_name = ri.rdb$index_name) -order by ri.rdb$relation_name, ri.rdb$index_id, ris.rdb$field_position"; - } - - protected virtual string GetExtractForeignKeysQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(co.rdb$relation_name) as table_name - ,trim(co.rdb$constraint_name) as constraint_name - ,trim(co.rdb$deferrable) as is_deferrable - ,trim(co.rdb$initially_deferred) as deferred - ,trim(ref.rdb$delete_rule) as delete_rule - ,trim(coidxseg.rdb$field_name) as column_name - ,coidxseg.rdb$field_position as column_position - ,cast(null as varchar(30)) as referenced_schema - ,trim(refidx.rdb$relation_name) as referenced_table_name - ,trim(refidxseg.rdb$field_name) as referenced_column_name - ,trim(ref.rdb$match_option) as match_option - ,trim(ref.rdb$update_rule) as update_rule -from rdb$relation_constraints co join rdb$ref_constraints ref on co.rdb$constraint_name = ref.rdb$constraint_name - join rdb$indices tempidx - on co.rdb$index_name = tempidx.rdb$index_name - join rdb$index_segments coidxseg - on co.rdb$index_name = coidxseg.rdb$index_name - join rdb$relation_constraints unqc - on ref.rdb$const_name_uq = unqc.rdb$constraint_name and unqc.rdb$constraint_type in ('UNIQUE', 'PRIMARY KEY') - join rdb$indices refidx - on refidx.rdb$index_name = unqc.rdb$index_name and refidx.rdb$relation_name not starts with 'RDB$' - join rdb$index_segments refidxseg - on refidx.rdb$index_name = refidxseg.rdb$index_name - and coidxseg.rdb$field_position = refidxseg.rdb$field_position -where co.rdb$constraint_type = 'FOREIGN KEY' -order by co.rdb$relation_name, co.rdb$constraint_name, coidxseg.rdb$field_position"; - } - - protected virtual string GetExtractUniqueAndPrimaryKeyConstraintsQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(rel.rdb$relation_name) as table_name - ,trim(rel.rdb$constraint_name) as constraint_name - ,trim(rel.rdb$constraint_type) constraint_type - ,trim(seg.rdb$field_name) as column_name - ,seg.rdb$field_position as column_position -from rdb$relation_constraints rel left join rdb$indices idx on rel.rdb$index_name = idx.rdb$index_name - left join rdb$index_segments seg - on idx.rdb$index_name = seg.rdb$index_name -where rel.rdb$constraint_type in ('PRIMARY KEY', 'UNIQUE') -order by rel.rdb$relation_name, rel.rdb$constraint_name, seg.rdb$field_position"; - } - - protected virtual string GetExtractCheckConstraintsQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(chktb.rdb$relation_name) as table_name - ,trim(chktb.rdb$constraint_name) as constraint_name - ,trim(trig.rdb$trigger_source) as check_clausule -from rdb$relation_constraints chktb inner join rdb$check_constraints chk - on (chktb.rdb$constraint_name = chk.rdb$constraint_name and chktb.rdb$constraint_type = 'CHECK') - inner join rdb$triggers trig - on chk.rdb$trigger_name = trig.rdb$trigger_name and trig.rdb$trigger_type = 1 -order by chktb.rdb$relation_name, chktb.rdb$constraint_name"; - } - - protected virtual string GetExtractSequencesQuery() - { - return @" -select cast(null as varchar(30)) as schema - ,trim(rdb$generator_name) as sequence_name -from rdb$generators -where rdb$system_flag = 0"; - } - - protected virtual string GetExtractSequenceValueQuery() - { - return @" -select GEN_ID({0}, 0) -from rdb$database"; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.13 + +using System; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal partial class Extractor + { + protected virtual string GetExtractSchemasQuery() + { + return @"select " + Constants.DefaultSchemaName + @"from rdb$database"; + } + + protected virtual string GetExtractTablesQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(rdb$relation_name) as table_name + ,rdb$relation_type as table_type +from rdb$relations +where rdb$relation_type in (0, 5, 4) and rdb$relation_name not starts with 'RDB$' and rdb$relation_name not starts with 'MON$'"; + } + + protected virtual string GetExtractTableColumnsQuery() + { + return @" +select schema + ,table_name + ,ordinal_position + ,column_name + ,field_type + ,column_subtype + ,column_size + ,numeric_precision + ,-numeric_scale as numeric_scale + ,character_max_length + ,(1 - coalesce(column_nullable,0)) as column_nullable + ,column_default +from (select cast(null as varchar(30)) as schema + ,trim(rfr.rdb$relation_name) as table_name + ,trim(rfr.rdb$field_name) as column_name + ,fld.rdb$field_sub_type as column_subtype + ,cast(fld.rdb$field_length as integer) as column_size + ,cast(fld.rdb$field_precision as integer) as numeric_precision + ,cast(fld.rdb$field_scale as integer) as numeric_scale + ,cast(fld.rdb$character_length as integer) as character_max_length + ,cast(fld.rdb$field_length as integer) as character_octet_length + ,rfr.rdb$field_position as ordinal_position + ,trim(rfr.rdb$field_source) as domain_name + ,trim(rfr.rdb$default_source) as column_default + ,trim(fld.rdb$computed_source) as computed_source + ,fld.rdb$dimensions as column_array + ,coalesce(fld.rdb$null_flag, rfr.rdb$null_flag) as column_nullable + ,0 as is_readonly + ,fld.rdb$field_type as field_type + ,trim(cs.rdb$character_set_name) as character_set_name + ,trim(coll.rdb$collation_name) as collation_name + ,trim(rfr.rdb$description) as description + from rdb$relations rr join rdb$relation_fields rfr on rfr.rdb$relation_name = rr.rdb$relation_name + left join rdb$fields fld on rfr.rdb$field_source = fld.rdb$field_name + left join rdb$character_sets cs + on cs.rdb$character_set_id = fld.rdb$character_set_id + left join rdb$collations coll + on (coll.rdb$collation_id = fld.rdb$collation_id + and coll.rdb$character_set_id = fld.rdb$character_set_id) + where rr.rdb$relation_type in (0, 4, 5) and rr.rdb$relation_name not starts with 'RDB$' and rr.rdb$relation_name not starts with 'MON$' + order by table_name, ordinal_position)"; + } + + protected virtual string GetExtractViewsQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(rdb$relation_name) as table_name + ,rdb$view_source as view_source +from rdb$relations +where rdb$relation_type = 1"; + } + + protected virtual string GetExtractViewColumnsQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(rfr.rdb$relation_name) as table_name + ,trim(rfr.rdb$field_name) as column_name + ,rfr.rdb$field_position as ordinal_position +from rdb$relations rr join rdb$relation_fields rfr on rfr.rdb$relation_name = rr.rdb$relation_name +where rr.rdb$relation_type = 1 +order by rfr.rdb$relation_name, rfr.rdb$field_position"; + } + + protected virtual string GetExtractIndexesQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(ri.rdb$relation_name) as table_name + ,trim(ri.rdb$index_name) as index_name + ,ri.rdb$index_id as index_seq + ,ri.rdb$index_type as descend + ,ri.rdb$unique_flag as unique_flag + ,trim(ris.rdb$field_name) as column_name + ,ris.rdb$field_position as column_position + ,ri.rdb$expression_source as expression_source +from rdb$indices ri left join rdb$index_segments ris on ris.rdb$index_name = ri.rdb$index_name +where ri.rdb$system_flag = 0 + and not exists + (select 1 + from rdb$relation_constraints rc + where rc.rdb$constraint_type in ('PRIMARY KEY', 'FOREIGN KEY') + and rc.rdb$relation_name = ri.rdb$relation_name + and rc.rdb$index_name = ri.rdb$index_name) +order by ri.rdb$relation_name, ri.rdb$index_id, ris.rdb$field_position"; + } + + protected virtual string GetExtractForeignKeysQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(co.rdb$relation_name) as table_name + ,trim(co.rdb$constraint_name) as constraint_name + ,trim(co.rdb$deferrable) as is_deferrable + ,trim(co.rdb$initially_deferred) as deferred + ,trim(ref.rdb$delete_rule) as delete_rule + ,trim(coidxseg.rdb$field_name) as column_name + ,coidxseg.rdb$field_position as column_position + ,cast(null as varchar(30)) as referenced_schema + ,trim(refidx.rdb$relation_name) as referenced_table_name + ,trim(refidxseg.rdb$field_name) as referenced_column_name + ,trim(ref.rdb$match_option) as match_option + ,trim(ref.rdb$update_rule) as update_rule +from rdb$relation_constraints co join rdb$ref_constraints ref on co.rdb$constraint_name = ref.rdb$constraint_name + join rdb$indices tempidx + on co.rdb$index_name = tempidx.rdb$index_name + join rdb$index_segments coidxseg + on co.rdb$index_name = coidxseg.rdb$index_name + join rdb$relation_constraints unqc + on ref.rdb$const_name_uq = unqc.rdb$constraint_name and unqc.rdb$constraint_type in ('UNIQUE', 'PRIMARY KEY') + join rdb$indices refidx + on refidx.rdb$index_name = unqc.rdb$index_name and refidx.rdb$relation_name not starts with 'RDB$' + join rdb$index_segments refidxseg + on refidx.rdb$index_name = refidxseg.rdb$index_name + and coidxseg.rdb$field_position = refidxseg.rdb$field_position +where co.rdb$constraint_type = 'FOREIGN KEY' +order by co.rdb$relation_name, co.rdb$constraint_name, coidxseg.rdb$field_position"; + } + + protected virtual string GetExtractUniqueAndPrimaryKeyConstraintsQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(rel.rdb$relation_name) as table_name + ,trim(rel.rdb$constraint_name) as constraint_name + ,trim(rel.rdb$constraint_type) constraint_type + ,trim(seg.rdb$field_name) as column_name + ,seg.rdb$field_position as column_position +from rdb$relation_constraints rel left join rdb$indices idx on rel.rdb$index_name = idx.rdb$index_name + left join rdb$index_segments seg + on idx.rdb$index_name = seg.rdb$index_name +where rel.rdb$constraint_type in ('PRIMARY KEY', 'UNIQUE') +order by rel.rdb$relation_name, rel.rdb$constraint_name, seg.rdb$field_position"; + } + + protected virtual string GetExtractCheckConstraintsQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(chktb.rdb$relation_name) as table_name + ,trim(chktb.rdb$constraint_name) as constraint_name + ,trim(trig.rdb$trigger_source) as check_clausule +from rdb$relation_constraints chktb inner join rdb$check_constraints chk + on (chktb.rdb$constraint_name = chk.rdb$constraint_name and chktb.rdb$constraint_type = 'CHECK') + inner join rdb$triggers trig + on chk.rdb$trigger_name = trig.rdb$trigger_name and trig.rdb$trigger_type = 1 +order by chktb.rdb$relation_name, chktb.rdb$constraint_name"; + } + + protected virtual string GetExtractSequencesQuery() + { + return @" +select cast(null as varchar(30)) as schema + ,trim(rdb$generator_name) as sequence_name +from rdb$generators +where rdb$system_flag = 0"; + } + + protected virtual string GetExtractSequenceValueQuery() + { + return @" +select GEN_ID({0}, 0) +from rdb$database"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.cs index 779dd77bf5..faf0f904e9 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Extractor.cs @@ -1,427 +1,427 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.13 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using Xtensive.Sql.Drivers.Firebird.Resources; -using Xtensive.Sql.Model; -using Constraint = Xtensive.Sql.Model.Constraint; -using Xtensive.Sql.Dml; -using Xtensive.Core; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal partial class Extractor : Model.Extractor - { - private const int DefaultNumericPrecision = 18; - private const int DefaultNumericScale = 0; - - private Catalog theCatalog; - private string targetSchema; - - public override Catalog ExtractCatalog(string catalogName) - { - theCatalog = new Catalog(catalogName); - targetSchema = null; - ExtractSchemas(); - ExtractCatalogContents(); - return theCatalog; - } - - public override Schema ExtractSchema(string catalogName, string schemaName) - { - theCatalog = new Catalog(catalogName); - targetSchema = schemaName.ToUpperInvariant(); - theCatalog.CreateSchema(targetSchema); - ExtractCatalogContents(); - return theCatalog.Schemas[0]; - // return theCatalog.Schemas[targetSchema]; - } - - private void ExtractCatalogContents() - { - ExtractTables(); - ExtractTableColumns(); - ExtractViews(); - ExtractViewColumns(); - ExtractIndexes(); - ExtractForeignKeys(); - ExtractCheckConstaints(); - ExtractUniqueAndPrimaryKeyConstraints(); - ExtractSequences(); - } - - private void ExtractSchemas() - { - var defaultSchemaName = Driver.CoreServerInfo.DefaultSchemaName.ToUpperInvariant(); - var defaultSchema = theCatalog.CreateSchema(defaultSchemaName); - theCatalog.DefaultSchema = defaultSchema; - } - - private void ExtractTables() - { - using (var reader = Connection.CreateCommand(GetExtractTablesQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - while (reader.Read()) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - string tableName = reader.GetString(1).Trim(); - int tableType = reader.GetInt16(2); - bool isTemporary = tableType==4 || tableType==5; - if (isTemporary) { - var table = schema.CreateTemporaryTable(tableName); - table.PreserveRows = tableType==4; - table.IsGlobal = true; - } - else - schema.CreateTable(tableName); - } - } - } - - private void ExtractTableColumns() - { - using ( - var reader = Connection.CreateCommand(GetExtractTableColumnsQuery()).ExecuteReader(CommandBehavior.SingleResult) - ) { - Table table = null; - int lastColumnId = int.MaxValue; - while (reader.Read()) { - int columnSeq = reader.GetInt16(2); - if (columnSeq <= lastColumnId) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1).Trim()]; - } - var column = table.CreateColumn(reader.GetString(3)); - column.DataType = CreateValueType(reader, 4, 5, 7, 8, 9); - column.IsNullable = ReadBool(reader, 10); - var defaultValue = ReadStringOrNull(reader, 11); - if (!string.IsNullOrEmpty(defaultValue)) - column.DefaultValue = SqlDml.Native(defaultValue); - lastColumnId = columnSeq; - } - } - } - - private void ExtractViews() - { - using (var reader = Connection.CreateCommand(GetExtractViewsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - while (reader.Read()) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - var view = reader.GetString(1).Trim(); - var definition = ReadStringOrNull(reader, 2); - if (string.IsNullOrEmpty(definition)) - schema.CreateView(view); - else - schema.CreateView(view, SqlDml.Native(definition)); - } - } - } - - private void ExtractViewColumns() - { - using ( - var reader = Connection.CreateCommand(GetExtractViewColumnsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - int lastColumnId = int.MaxValue; - View view = null; - while (reader.Read()) { - int columnId = reader.GetInt16(3); - if (columnId <= lastColumnId) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - view = schema.Views[reader.GetString(1).Trim()]; - } - view.CreateColumn(reader.GetString(2).Trim()); - lastColumnId = columnId; - } - } - } - - private void ExtractIndexes() - { - using (var reader = Connection.CreateCommand(GetExtractIndexesQuery()).ExecuteReader(CommandBehavior.SingleResult) - ) { - string indexName = string.Empty; - string lastIndexName = string.Empty; - Table table = null; - Index index = null; - - while (reader.Read()) { - SqlExpression expression = null; - indexName = reader.GetString(2).Trim(); - if (indexName!=lastIndexName) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1).Trim()]; - index = table.CreateIndex(indexName); - index.IsUnique = ReadBool(reader, 5); - index.IsBitmap = false; - index.IsClustered = false; - if (!reader.IsDBNull(8)) // expression index - expression = SqlDml.Native(reader.GetString(8).Trim()); - } - if (expression==null) { - var column = table.TableColumns[reader.GetString(6).Trim()]; - bool isDescending = ReadBool(reader, 4); - index.CreateIndexColumn(column, !isDescending); - } - else { - bool isDescending = ReadBool(reader, 4); - index.CreateIndexColumn(expression, !isDescending); - } - lastIndexName = indexName; - } - } - } - - private void ExtractForeignKeys() - { - using ( - var reader = Connection.CreateCommand(GetExtractForeignKeysQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - int lastColumnPosition = int.MaxValue; - ForeignKey constraint = null; - Table referencingTable = null; - Table referencedTable = null; - while (reader.Read()) { - int columnPosition = reader.GetInt16(7); - if (columnPosition <= lastColumnPosition) { - var referencingSchema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - referencingTable = referencingSchema.Tables[reader.GetString(1).Trim()]; - constraint = referencingTable.CreateForeignKey(reader.GetString(2).Trim()); - ReadConstraintProperties(constraint, reader, 3, 4); - ReadCascadeAction(constraint, reader, 5); - var referencedSchema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(8)]; - referencedTable = referencedSchema.Tables[reader.GetString(9).Trim()]; - constraint.ReferencedTable = referencedTable; - } - var referencingColumn = referencingTable.TableColumns[reader.GetString(6).Trim()]; - var referencedColumn = referencedTable.TableColumns[reader.GetString(10).Trim()]; - constraint.Columns.Add(referencingColumn); - constraint.ReferencedColumns.Add(referencedColumn); - lastColumnPosition = columnPosition; - } - } - } - - private void ExtractUniqueAndPrimaryKeyConstraints() - { - using ( - var reader = - Connection.CreateCommand(GetExtractUniqueAndPrimaryKeyConstraintsQuery()).ExecuteReader( - CommandBehavior.SingleResult)) { - Table table = null; - string constraintName = null; - string constraintType = null; - var columns = new List(); - int lastColumnPosition = -1; - while (reader.Read()) { - int columnPosition = reader.GetInt16(5); - if (columnPosition <= lastColumnPosition) { - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - columns.Clear(); - } - if (columns.Count==0) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1).Trim()]; - constraintName = reader.GetString(2).Trim(); - constraintType = reader.GetString(3).Trim(); - } - columns.Add(table.TableColumns[reader.GetString(4).Trim()]); - lastColumnPosition = columnPosition; - } - if (columns.Count > 0) - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - } - } - - private void ExtractCheckConstaints() - { - using ( - var reader = - Connection.CreateCommand(GetExtractCheckConstraintsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - while (reader.Read()) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - var table = schema.Tables[reader.GetString(1).Trim()]; - var name = reader.GetString(2).Trim(); - var condition = reader.GetString(3).Trim(); - var constraint = table.CreateCheckConstraint(name, condition); - } - } - } - - private void ExtractSequences() - { - using ( - var reader = Connection.CreateCommand(GetExtractSequencesQuery()).ExecuteReader(CommandBehavior.SingleResult)) { - while (reader.Read()) { - var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; - var sequence = schema.CreateSequence(reader.GetString(1).Trim()); - var descriptor = sequence.SequenceDescriptor; - descriptor.MinValue = 0; - // TODO: Firebird quickfix, we must implement support for arbitrary incr. in comparer - descriptor.Increment = 128; - } - } - - { - foreach (var sequence in theCatalog.DefaultSchema.Sequences) { - var query = string.Format(GetExtractSequenceValueQuery(), Driver.Translator.QuoteIdentifier(sequence.Name)); - using (var command = Connection.CreateCommand(query)) - using (var reader = command.ExecuteReader(CommandBehavior.SingleResult)) { - while (reader.Read()) - sequence.SequenceDescriptor.MinValue = reader.GetInt64(0); - } - } - } - } - - private SqlValueType CreateValueType(IDataRecord row, - int majorTypeIndex, int minorTypeIndex, int precisionIndex, int scaleIndex, int charLengthIndex) - { - var majorType = row.GetInt16(majorTypeIndex); - var minorType = row.GetValue(minorTypeIndex)==DBNull.Value ? (short?)null : row.GetInt16(minorTypeIndex); - var typeName = GetTypeName(majorType, minorType).Trim(); - - if (typeName == "NUMERIC" || typeName == "DECIMAL") { - int precision = Convert.ToInt32(row[precisionIndex]); - int scale = Convert.ToInt32(row[scaleIndex]); - return new SqlValueType(SqlType.Decimal, precision, scale); - } - if (typeName.StartsWith("TIMESTAMP")) - return new SqlValueType(SqlType.DateTime); - if (typeName=="VARCHAR" || typeName=="CHAR") { - int length = Convert.ToInt32(row[charLengthIndex]); - var sqlType = typeName.Length == 4 ? SqlType.Char : SqlType.VarChar; - return new SqlValueType(sqlType, length); - } - - if (typeName=="BLOB SUB TYPE 0") - return new SqlValueType(SqlType.VarCharMax); - - if (typeName=="BLOB SUB TYPE 1") - return new SqlValueType(SqlType.VarBinaryMax); - - var typeInfo = Driver.ServerInfo.DataTypes[typeName]; - return typeInfo != null - ? new SqlValueType(typeInfo.Type) - : new SqlValueType(typeName); - } - - - private static void CreateIndexBasedConstraint( - Table table, string constraintName, string constraintType, List columns) - { - switch (constraintType.Trim()) { - case "PRIMARY KEY": - table.CreatePrimaryKey(constraintName, columns.ToArray()); - return; - case "UNIQUE": - table.CreateUniqueConstraint(constraintName, columns.ToArray()); - return; - default: - throw new ArgumentOutOfRangeException("constraintType"); - } - } - - private static bool ReadBool(IDataRecord row, int index) - { - short value = row.IsDBNull(index) ? (short) 0 : Convert.ToInt16(row.GetString(index) ?? "0"); - switch (value) { - case 1: - return true; - case 0: - return false; - default: - throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanSmallintValue, value)); - } - } - - private static string ReadStringOrNull(IDataRecord row, int index) - { - return row.IsDBNull(index) ? null : row.GetString(index).Trim(); - } - - private static void ReadConstraintProperties(Constraint constraint, - IDataRecord row, int isDeferrableIndex, int isInitiallyDeferredIndex) - { - constraint.IsDeferrable = ReadStringOrNull(row, isDeferrableIndex)=="YES"; - constraint.IsInitiallyDeferred = ReadStringOrNull(row, isInitiallyDeferredIndex)=="YES"; - } - - private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) - { - var deleteRule = ReadStringOrNull(row, deleteRuleIndex); - switch (deleteRule) { - case "CASCADE": - foreignKey.OnDelete = ReferentialAction.Cascade; - return; - case "SET NULL": - foreignKey.OnDelete = ReferentialAction.SetNull; - return; - case "NO ACTION": - foreignKey.OnDelete = ReferentialAction.NoAction; - return; - case "RESTRICT": // behaves like NO ACTION - foreignKey.OnDelete = ReferentialAction.NoAction; - return; - case "SET DEFAULT": - foreignKey.OnDelete = ReferentialAction.SetDefault; - return; - } - } - - private static string GetTypeName(int majorTypeIndentifier, int? minorTypeIdentifier) - { - switch (majorTypeIndentifier) { - case 7: - return minorTypeIdentifier==2 - ? "NUMERIC" - : minorTypeIdentifier==1 - ? "DECIMAL" - : "SMALLINT"; - case 8: - return minorTypeIdentifier==2 - ? "NUMERIC" - : minorTypeIdentifier==1 - ? "DECIMAL" - : "INTEGER"; - case 10: return "FLOAT"; - case 12: return "DATE"; - case 13: return "TIME"; - case 14: return "CHAR"; - case 16: - return minorTypeIdentifier==2 - ? "NUMERIC" - : minorTypeIdentifier==1 - ? "DECIMAL" - : "BIGINT"; - case 27: return "DOUBLE PRECISION"; - case 35: return "TIMESTAMP"; - case 37: return "VARCHAR"; - case 261: - return minorTypeIdentifier==0 - ? "BLOB SUB TYPE 1" - : minorTypeIdentifier==1 - ? "BLOB SUB TYPE 0" - : String.Empty; - default: - return string.Empty; - } - } - - protected override DbDataReader ExecuteReader(ISqlCompileUnit statement) - { - var commandText = Connection.Driver.Compile(statement).GetCommandText(); - // base.ExecuteReader(...) cannot be used because it disposes the DbCommand so it makes returned DbDataReader unusable - return Connection.CreateCommand(commandText).ExecuteReader(); - } - - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.13 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using Xtensive.Sql.Drivers.Firebird.Resources; +using Xtensive.Sql.Model; +using Constraint = Xtensive.Sql.Model.Constraint; +using Xtensive.Sql.Dml; +using Xtensive.Core; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal partial class Extractor : Model.Extractor + { + private const int DefaultNumericPrecision = 18; + private const int DefaultNumericScale = 0; + + private Catalog theCatalog; + private string targetSchema; + + public override Catalog ExtractCatalog(string catalogName) + { + theCatalog = new Catalog(catalogName); + targetSchema = null; + ExtractSchemas(); + ExtractCatalogContents(); + return theCatalog; + } + + public override Schema ExtractSchema(string catalogName, string schemaName) + { + theCatalog = new Catalog(catalogName); + targetSchema = schemaName.ToUpperInvariant(); + theCatalog.CreateSchema(targetSchema); + ExtractCatalogContents(); + return theCatalog.Schemas[0]; + // return theCatalog.Schemas[targetSchema]; + } + + private void ExtractCatalogContents() + { + ExtractTables(); + ExtractTableColumns(); + ExtractViews(); + ExtractViewColumns(); + ExtractIndexes(); + ExtractForeignKeys(); + ExtractCheckConstaints(); + ExtractUniqueAndPrimaryKeyConstraints(); + ExtractSequences(); + } + + private void ExtractSchemas() + { + var defaultSchemaName = Driver.CoreServerInfo.DefaultSchemaName.ToUpperInvariant(); + var defaultSchema = theCatalog.CreateSchema(defaultSchemaName); + theCatalog.DefaultSchema = defaultSchema; + } + + private void ExtractTables() + { + using (var reader = Connection.CreateCommand(GetExtractTablesQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + while (reader.Read()) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + string tableName = reader.GetString(1).Trim(); + int tableType = reader.GetInt16(2); + bool isTemporary = tableType==4 || tableType==5; + if (isTemporary) { + var table = schema.CreateTemporaryTable(tableName); + table.PreserveRows = tableType==4; + table.IsGlobal = true; + } + else + schema.CreateTable(tableName); + } + } + } + + private void ExtractTableColumns() + { + using ( + var reader = Connection.CreateCommand(GetExtractTableColumnsQuery()).ExecuteReader(CommandBehavior.SingleResult) + ) { + Table table = null; + int lastColumnId = int.MaxValue; + while (reader.Read()) { + int columnSeq = reader.GetInt16(2); + if (columnSeq <= lastColumnId) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1).Trim()]; + } + var column = table.CreateColumn(reader.GetString(3)); + column.DataType = CreateValueType(reader, 4, 5, 7, 8, 9); + column.IsNullable = ReadBool(reader, 10); + var defaultValue = ReadStringOrNull(reader, 11); + if (!string.IsNullOrEmpty(defaultValue)) + column.DefaultValue = SqlDml.Native(defaultValue); + lastColumnId = columnSeq; + } + } + } + + private void ExtractViews() + { + using (var reader = Connection.CreateCommand(GetExtractViewsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + while (reader.Read()) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + var view = reader.GetString(1).Trim(); + var definition = ReadStringOrNull(reader, 2); + if (string.IsNullOrEmpty(definition)) + schema.CreateView(view); + else + schema.CreateView(view, SqlDml.Native(definition)); + } + } + } + + private void ExtractViewColumns() + { + using ( + var reader = Connection.CreateCommand(GetExtractViewColumnsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + int lastColumnId = int.MaxValue; + View view = null; + while (reader.Read()) { + int columnId = reader.GetInt16(3); + if (columnId <= lastColumnId) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + view = schema.Views[reader.GetString(1).Trim()]; + } + view.CreateColumn(reader.GetString(2).Trim()); + lastColumnId = columnId; + } + } + } + + private void ExtractIndexes() + { + using (var reader = Connection.CreateCommand(GetExtractIndexesQuery()).ExecuteReader(CommandBehavior.SingleResult) + ) { + string indexName = string.Empty; + string lastIndexName = string.Empty; + Table table = null; + Index index = null; + + while (reader.Read()) { + SqlExpression expression = null; + indexName = reader.GetString(2).Trim(); + if (indexName!=lastIndexName) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1).Trim()]; + index = table.CreateIndex(indexName); + index.IsUnique = ReadBool(reader, 5); + index.IsBitmap = false; + index.IsClustered = false; + if (!reader.IsDBNull(8)) // expression index + expression = SqlDml.Native(reader.GetString(8).Trim()); + } + if (expression==null) { + var column = table.TableColumns[reader.GetString(6).Trim()]; + bool isDescending = ReadBool(reader, 4); + index.CreateIndexColumn(column, !isDescending); + } + else { + bool isDescending = ReadBool(reader, 4); + index.CreateIndexColumn(expression, !isDescending); + } + lastIndexName = indexName; + } + } + } + + private void ExtractForeignKeys() + { + using ( + var reader = Connection.CreateCommand(GetExtractForeignKeysQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + int lastColumnPosition = int.MaxValue; + ForeignKey constraint = null; + Table referencingTable = null; + Table referencedTable = null; + while (reader.Read()) { + int columnPosition = reader.GetInt16(7); + if (columnPosition <= lastColumnPosition) { + var referencingSchema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + referencingTable = referencingSchema.Tables[reader.GetString(1).Trim()]; + constraint = referencingTable.CreateForeignKey(reader.GetString(2).Trim()); + ReadConstraintProperties(constraint, reader, 3, 4); + ReadCascadeAction(constraint, reader, 5); + var referencedSchema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(8)]; + referencedTable = referencedSchema.Tables[reader.GetString(9).Trim()]; + constraint.ReferencedTable = referencedTable; + } + var referencingColumn = referencingTable.TableColumns[reader.GetString(6).Trim()]; + var referencedColumn = referencedTable.TableColumns[reader.GetString(10).Trim()]; + constraint.Columns.Add(referencingColumn); + constraint.ReferencedColumns.Add(referencedColumn); + lastColumnPosition = columnPosition; + } + } + } + + private void ExtractUniqueAndPrimaryKeyConstraints() + { + using ( + var reader = + Connection.CreateCommand(GetExtractUniqueAndPrimaryKeyConstraintsQuery()).ExecuteReader( + CommandBehavior.SingleResult)) { + Table table = null; + string constraintName = null; + string constraintType = null; + var columns = new List(); + int lastColumnPosition = -1; + while (reader.Read()) { + int columnPosition = reader.GetInt16(5); + if (columnPosition <= lastColumnPosition) { + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + columns.Clear(); + } + if (columns.Count==0) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1).Trim()]; + constraintName = reader.GetString(2).Trim(); + constraintType = reader.GetString(3).Trim(); + } + columns.Add(table.TableColumns[reader.GetString(4).Trim()]); + lastColumnPosition = columnPosition; + } + if (columns.Count > 0) + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + } + } + + private void ExtractCheckConstaints() + { + using ( + var reader = + Connection.CreateCommand(GetExtractCheckConstraintsQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + while (reader.Read()) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + var table = schema.Tables[reader.GetString(1).Trim()]; + var name = reader.GetString(2).Trim(); + var condition = reader.GetString(3).Trim(); + var constraint = table.CreateCheckConstraint(name, condition); + } + } + } + + private void ExtractSequences() + { + using ( + var reader = Connection.CreateCommand(GetExtractSequencesQuery()).ExecuteReader(CommandBehavior.SingleResult)) { + while (reader.Read()) { + var schema = theCatalog.DefaultSchema; // theCatalog.Schemas[reader.GetString(0)]; + var sequence = schema.CreateSequence(reader.GetString(1).Trim()); + var descriptor = sequence.SequenceDescriptor; + descriptor.MinValue = 0; + // TODO: Firebird quickfix, we must implement support for arbitrary incr. in comparer + descriptor.Increment = 128; + } + } + + { + foreach (var sequence in theCatalog.DefaultSchema.Sequences) { + var query = string.Format(GetExtractSequenceValueQuery(), Driver.Translator.QuoteIdentifier(sequence.Name)); + using (var command = Connection.CreateCommand(query)) + using (var reader = command.ExecuteReader(CommandBehavior.SingleResult)) { + while (reader.Read()) + sequence.SequenceDescriptor.MinValue = reader.GetInt64(0); + } + } + } + } + + private SqlValueType CreateValueType(IDataRecord row, + int majorTypeIndex, int minorTypeIndex, int precisionIndex, int scaleIndex, int charLengthIndex) + { + var majorType = row.GetInt16(majorTypeIndex); + var minorType = row.GetValue(minorTypeIndex)==DBNull.Value ? (short?)null : row.GetInt16(minorTypeIndex); + var typeName = GetTypeName(majorType, minorType).Trim(); + + if (typeName == "NUMERIC" || typeName == "DECIMAL") { + int precision = Convert.ToInt32(row[precisionIndex]); + int scale = Convert.ToInt32(row[scaleIndex]); + return new SqlValueType(SqlType.Decimal, precision, scale); + } + if (typeName.StartsWith("TIMESTAMP")) + return new SqlValueType(SqlType.DateTime); + if (typeName=="VARCHAR" || typeName=="CHAR") { + int length = Convert.ToInt32(row[charLengthIndex]); + var sqlType = typeName.Length == 4 ? SqlType.Char : SqlType.VarChar; + return new SqlValueType(sqlType, length); + } + + if (typeName=="BLOB SUB TYPE 0") + return new SqlValueType(SqlType.VarCharMax); + + if (typeName=="BLOB SUB TYPE 1") + return new SqlValueType(SqlType.VarBinaryMax); + + var typeInfo = Driver.ServerInfo.DataTypes[typeName]; + return typeInfo != null + ? new SqlValueType(typeInfo.Type) + : new SqlValueType(typeName); + } + + + private static void CreateIndexBasedConstraint( + Table table, string constraintName, string constraintType, List columns) + { + switch (constraintType.Trim()) { + case "PRIMARY KEY": + table.CreatePrimaryKey(constraintName, columns.ToArray()); + return; + case "UNIQUE": + table.CreateUniqueConstraint(constraintName, columns.ToArray()); + return; + default: + throw new ArgumentOutOfRangeException("constraintType"); + } + } + + private static bool ReadBool(IDataRecord row, int index) + { + short value = row.IsDBNull(index) ? (short) 0 : Convert.ToInt16(row.GetString(index) ?? "0"); + switch (value) { + case 1: + return true; + case 0: + return false; + default: + throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanSmallintValue, value)); + } + } + + private static string ReadStringOrNull(IDataRecord row, int index) + { + return row.IsDBNull(index) ? null : row.GetString(index).Trim(); + } + + private static void ReadConstraintProperties(Constraint constraint, + IDataRecord row, int isDeferrableIndex, int isInitiallyDeferredIndex) + { + constraint.IsDeferrable = ReadStringOrNull(row, isDeferrableIndex)=="YES"; + constraint.IsInitiallyDeferred = ReadStringOrNull(row, isInitiallyDeferredIndex)=="YES"; + } + + private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) + { + var deleteRule = ReadStringOrNull(row, deleteRuleIndex); + switch (deleteRule) { + case "CASCADE": + foreignKey.OnDelete = ReferentialAction.Cascade; + return; + case "SET NULL": + foreignKey.OnDelete = ReferentialAction.SetNull; + return; + case "NO ACTION": + foreignKey.OnDelete = ReferentialAction.NoAction; + return; + case "RESTRICT": // behaves like NO ACTION + foreignKey.OnDelete = ReferentialAction.NoAction; + return; + case "SET DEFAULT": + foreignKey.OnDelete = ReferentialAction.SetDefault; + return; + } + } + + private static string GetTypeName(int majorTypeIndentifier, int? minorTypeIdentifier) + { + switch (majorTypeIndentifier) { + case 7: + return minorTypeIdentifier==2 + ? "NUMERIC" + : minorTypeIdentifier==1 + ? "DECIMAL" + : "SMALLINT"; + case 8: + return minorTypeIdentifier==2 + ? "NUMERIC" + : minorTypeIdentifier==1 + ? "DECIMAL" + : "INTEGER"; + case 10: return "FLOAT"; + case 12: return "DATE"; + case 13: return "TIME"; + case 14: return "CHAR"; + case 16: + return minorTypeIdentifier==2 + ? "NUMERIC" + : minorTypeIdentifier==1 + ? "DECIMAL" + : "BIGINT"; + case 27: return "DOUBLE PRECISION"; + case 35: return "TIMESTAMP"; + case 37: return "VARCHAR"; + case 261: + return minorTypeIdentifier==0 + ? "BLOB SUB TYPE 1" + : minorTypeIdentifier==1 + ? "BLOB SUB TYPE 0" + : String.Empty; + default: + return string.Empty; + } + } + + protected override DbDataReader ExecuteReader(ISqlCompileUnit statement) + { + var commandText = Connection.Driver.Compile(statement).GetCommandText(); + // base.ExecuteReader(...) cannot be used because it disposes the DbCommand so it makes returned DbDataReader unusable + return Connection.CreateCommand(commandText).ExecuteReader(); + } + + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/ServerInfoProvider.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/ServerInfoProvider.cs index 5444419e44..f78a3407f0 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/ServerInfoProvider.cs @@ -1,281 +1,281 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.10 - -using System; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal class ServerInfoProvider : Info.ServerInfoProvider - { - private const int MaxIdentifierLength = 30; - private const int DoNotKnow = int.MaxValue; - private const int MaxCharLength = 2000; // physical constraint=32762, but because of http://tracker.firebirdsql.org/browse/CORE-1117; - // The limit is 64kB for statement text, 64kB for compiled BLR and 48kB for execution plan. - private const int MaxTextLength = int.MaxValue; - - private readonly string databaseName; - private readonly string defaultSchemaName; - - public override EntityInfo GetCollationInfo() - { - return null; - } - - public override EntityInfo GetCharacterSetInfo() - { - return null; - } - - public override EntityInfo GetTranslationInfo() - { - return null; - } - - public override EntityInfo GetTriggerInfo() - { - var triggerInfo = new EntityInfo(); - triggerInfo.AllowedDdlStatements = DdlStatements.All; - triggerInfo.MaxIdentifierLength = MaxIdentifierLength; - return triggerInfo; - } - - public override EntityInfo GetStoredProcedureInfo() - { - var storedProcedureInfo = new EntityInfo(); - storedProcedureInfo.AllowedDdlStatements = DdlStatements.All; - storedProcedureInfo.MaxIdentifierLength = MaxIdentifierLength; - return storedProcedureInfo; - } - - public override SequenceInfo GetSequenceInfo() - { - var sequenceInfo = new SequenceInfo(); - sequenceInfo.AllowedDdlStatements = DdlStatements.All; - sequenceInfo.Features = SequenceFeatures.None; - sequenceInfo.MaxIdentifierLength = MaxIdentifierLength; - return sequenceInfo; - } - - public override EntityInfo GetDatabaseInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override ColumnInfo GetColumnInfo() - { - var columnInfo = new ColumnInfo(); - columnInfo.AllowedDdlStatements = DdlStatements.All; - columnInfo.Features = ColumnFeatures.Computed; - columnInfo.MaxIdentifierLength = MaxIdentifierLength; - return columnInfo; - } - - public override EntityInfo GetViewInfo() - { - var viewInfo = new EntityInfo(); - viewInfo.AllowedDdlStatements = DdlStatements.All & ~DdlStatements.Rename; - viewInfo.MaxIdentifierLength = MaxIdentifierLength; - return viewInfo; - } - - public override EntityInfo GetSchemaInfo() - { - var schemaInfo = new EntityInfo(); - schemaInfo.AllowedDdlStatements = DdlStatements.None; - schemaInfo.MaxIdentifierLength = MaxIdentifierLength; - return schemaInfo; - } - - public override TableInfo GetTableInfo() - { - var tableInfo = new TableInfo(); - tableInfo.AllowedDdlStatements = DdlStatements.All & ~DdlStatements.Rename; - tableInfo.MaxIdentifierLength = MaxIdentifierLength; - tableInfo.MaxNumberOfColumns = 256; // not a correct value, Depends on data types used. (Example: 16,384 INTEGER (4-byte) values per row.) - tableInfo.PartitionMethods = PartitionMethods.None; - return tableInfo; - } - - public override TemporaryTableInfo GetTemporaryTableInfo() - { - return null; - } - - public override CheckConstraintInfo GetCheckConstraintInfo() - { - var checkContraintsInfo = new CheckConstraintInfo(); - checkContraintsInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - checkContraintsInfo.MaxIdentifierLength = MaxIdentifierLength; - checkContraintsInfo.MaxExpressionLength = MaxCharLength; - checkContraintsInfo.Features = CheckConstraintFeatures.None; - return checkContraintsInfo; - } - - public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() - { - var primaryKeyInfo = new PrimaryKeyConstraintInfo(); - primaryKeyInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; - primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.None; - return primaryKeyInfo; - } - - public override UniqueConstraintInfo GetUniqueConstraintInfo() - { - var uniqueContraintInfo = new UniqueConstraintInfo(); - uniqueContraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - uniqueContraintInfo.MaxIdentifierLength = MaxIdentifierLength; - uniqueContraintInfo.Features = UniqueConstraintFeatures.None; - return uniqueContraintInfo; - } - - public override IndexInfo GetIndexInfo() - { - var indexInfo = new IndexInfo(); - indexInfo.AllowedDdlStatements = DdlStatements.All; - indexInfo.MaxIdentifierLength = MaxIdentifierLength; - indexInfo.Features = - IndexFeatures.Unique | - IndexFeatures.Expressions; - indexInfo.MaxNumberOfColumns = 10; // just my opinion - indexInfo.MaxLength = 4096; // PageSize/4/CharacterSetSizeInByte - indexInfo.PartitionMethods = PartitionMethods.None; - return indexInfo; - } - - public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() - { - var foreignKeyConstraintInfo = new ForeignKeyConstraintInfo(); - foreignKeyConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - foreignKeyConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - foreignKeyConstraintInfo.Features = ForeignKeyConstraintFeatures.None; - foreignKeyConstraintInfo.Actions = - ForeignKeyConstraintActions.Cascade | - ForeignKeyConstraintActions.NoAction | - ForeignKeyConstraintActions.SetDefault | - ForeignKeyConstraintActions.SetNull; - return foreignKeyConstraintInfo; - } - - public override FullTextSearchInfo GetFullTextInfo() - { - return null; - // var info = new FullTextSearchInfo(); - // info.Features = FullTextSearchFeatures.Full; - // return info; - } - - public override QueryInfo GetQueryInfo() - { - var queryInfo = new QueryInfo(); - queryInfo.MaxNestedSubqueriesAmount = 100; - queryInfo.ParameterPrefix = "@"; - queryInfo.MaxLength = MaxCharLength; - queryInfo.MaxComparisonOperations = DoNotKnow; - queryInfo.Features = - QueryFeatures.NamedParameters | - QueryFeatures.ParameterPrefix | - QueryFeatures.ScalarSubquery | - QueryFeatures.Paging | - QueryFeatures.Limit | - QueryFeatures.Offset | - QueryFeatures.UpdateLimit | - QueryFeatures.DeleteLimit; - return queryInfo; - } - - public override ServerFeatures GetServerFeatures() - { - return ServerFeatures.Savepoints; - } - - public override IdentityInfo GetIdentityInfo() - { - return null; - } - - public override DataTypeCollection GetDataTypesInfo() - { - var commonFeatures = - DataTypeFeatures.Grouping | - DataTypeFeatures.Indexing | - DataTypeFeatures.KeyConstraint | - DataTypeFeatures.Nullable | - DataTypeFeatures.Ordering | - DataTypeFeatures.Multiple | - DataTypeFeatures.Default; - var lobFeatures = - DataTypeFeatures.Nullable | - DataTypeFeatures.Multiple | - DataTypeFeatures.Default; - - var dtc = new DataTypeCollection(); - - dtc.Int16 = DataTypeInfo.Range(SqlType.Int16, commonFeatures, - ValueRange.Int16, - "smallint"); - - dtc.Int32 = DataTypeInfo.Range(SqlType.Int32, commonFeatures, - ValueRange.Int32, "integer"); - - dtc.Int64 = DataTypeInfo.Range(SqlType.Int64, commonFeatures, - ValueRange.Int64, "bigint"); - - dtc.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, commonFeatures, - ValueRange.Decimal, 18, "numeric", "decimal"); - - dtc.Float = DataTypeInfo.Range(SqlType.Float, commonFeatures, - ValueRange.Float, "float"); - - dtc.Double = DataTypeInfo.Range(SqlType.Double, commonFeatures, - ValueRange.Double, "double precision"); - - dtc.DateTime = DataTypeInfo.Range(SqlType.DateTime, commonFeatures, - ValueRange.DateTime, "timestamp"); - - dtc.Char = DataTypeInfo.Stream(SqlType.Char, commonFeatures, MaxCharLength, "char"); - dtc.VarChar = DataTypeInfo.Stream(SqlType.VarChar, commonFeatures, MaxCharLength, "varchar"); - dtc.VarCharMax = DataTypeInfo.Stream(SqlType.VarCharMax, lobFeatures, MaxTextLength, "blob sub_type 1"); - dtc.VarBinaryMax = DataTypeInfo.Stream(SqlType.VarBinaryMax, lobFeatures, MaxTextLength, "blob sub_type 0"); - - return dtc; - } - - public override IsolationLevels GetIsolationLevels() - { - return IsolationLevels.ReadCommitted | IsolationLevels.ReadUncommitted | IsolationLevels.RepeatableRead; - } - - public override EntityInfo GetDomainInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override AssertConstraintInfo GetAssertionInfo() - { - return null; - } - - public override int GetStringIndexingBase() - { - return 1; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.10 + +using System; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal class ServerInfoProvider : Info.ServerInfoProvider + { + private const int MaxIdentifierLength = 30; + private const int DoNotKnow = int.MaxValue; + private const int MaxCharLength = 2000; // physical constraint=32762, but because of http://tracker.firebirdsql.org/browse/CORE-1117; + // The limit is 64kB for statement text, 64kB for compiled BLR and 48kB for execution plan. + private const int MaxTextLength = int.MaxValue; + + private readonly string databaseName; + private readonly string defaultSchemaName; + + public override EntityInfo GetCollationInfo() + { + return null; + } + + public override EntityInfo GetCharacterSetInfo() + { + return null; + } + + public override EntityInfo GetTranslationInfo() + { + return null; + } + + public override EntityInfo GetTriggerInfo() + { + var triggerInfo = new EntityInfo(); + triggerInfo.AllowedDdlStatements = DdlStatements.All; + triggerInfo.MaxIdentifierLength = MaxIdentifierLength; + return triggerInfo; + } + + public override EntityInfo GetStoredProcedureInfo() + { + var storedProcedureInfo = new EntityInfo(); + storedProcedureInfo.AllowedDdlStatements = DdlStatements.All; + storedProcedureInfo.MaxIdentifierLength = MaxIdentifierLength; + return storedProcedureInfo; + } + + public override SequenceInfo GetSequenceInfo() + { + var sequenceInfo = new SequenceInfo(); + sequenceInfo.AllowedDdlStatements = DdlStatements.All; + sequenceInfo.Features = SequenceFeatures.None; + sequenceInfo.MaxIdentifierLength = MaxIdentifierLength; + return sequenceInfo; + } + + public override EntityInfo GetDatabaseInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override ColumnInfo GetColumnInfo() + { + var columnInfo = new ColumnInfo(); + columnInfo.AllowedDdlStatements = DdlStatements.All; + columnInfo.Features = ColumnFeatures.Computed; + columnInfo.MaxIdentifierLength = MaxIdentifierLength; + return columnInfo; + } + + public override EntityInfo GetViewInfo() + { + var viewInfo = new EntityInfo(); + viewInfo.AllowedDdlStatements = DdlStatements.All & ~DdlStatements.Rename; + viewInfo.MaxIdentifierLength = MaxIdentifierLength; + return viewInfo; + } + + public override EntityInfo GetSchemaInfo() + { + var schemaInfo = new EntityInfo(); + schemaInfo.AllowedDdlStatements = DdlStatements.None; + schemaInfo.MaxIdentifierLength = MaxIdentifierLength; + return schemaInfo; + } + + public override TableInfo GetTableInfo() + { + var tableInfo = new TableInfo(); + tableInfo.AllowedDdlStatements = DdlStatements.All & ~DdlStatements.Rename; + tableInfo.MaxIdentifierLength = MaxIdentifierLength; + tableInfo.MaxNumberOfColumns = 256; // not a correct value, Depends on data types used. (Example: 16,384 INTEGER (4-byte) values per row.) + tableInfo.PartitionMethods = PartitionMethods.None; + return tableInfo; + } + + public override TemporaryTableInfo GetTemporaryTableInfo() + { + return null; + } + + public override CheckConstraintInfo GetCheckConstraintInfo() + { + var checkContraintsInfo = new CheckConstraintInfo(); + checkContraintsInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + checkContraintsInfo.MaxIdentifierLength = MaxIdentifierLength; + checkContraintsInfo.MaxExpressionLength = MaxCharLength; + checkContraintsInfo.Features = CheckConstraintFeatures.None; + return checkContraintsInfo; + } + + public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() + { + var primaryKeyInfo = new PrimaryKeyConstraintInfo(); + primaryKeyInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; + primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.None; + return primaryKeyInfo; + } + + public override UniqueConstraintInfo GetUniqueConstraintInfo() + { + var uniqueContraintInfo = new UniqueConstraintInfo(); + uniqueContraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + uniqueContraintInfo.MaxIdentifierLength = MaxIdentifierLength; + uniqueContraintInfo.Features = UniqueConstraintFeatures.None; + return uniqueContraintInfo; + } + + public override IndexInfo GetIndexInfo() + { + var indexInfo = new IndexInfo(); + indexInfo.AllowedDdlStatements = DdlStatements.All; + indexInfo.MaxIdentifierLength = MaxIdentifierLength; + indexInfo.Features = + IndexFeatures.Unique | + IndexFeatures.Expressions; + indexInfo.MaxNumberOfColumns = 10; // just my opinion + indexInfo.MaxLength = 4096; // PageSize/4/CharacterSetSizeInByte + indexInfo.PartitionMethods = PartitionMethods.None; + return indexInfo; + } + + public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() + { + var foreignKeyConstraintInfo = new ForeignKeyConstraintInfo(); + foreignKeyConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + foreignKeyConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + foreignKeyConstraintInfo.Features = ForeignKeyConstraintFeatures.None; + foreignKeyConstraintInfo.Actions = + ForeignKeyConstraintActions.Cascade | + ForeignKeyConstraintActions.NoAction | + ForeignKeyConstraintActions.SetDefault | + ForeignKeyConstraintActions.SetNull; + return foreignKeyConstraintInfo; + } + + public override FullTextSearchInfo GetFullTextInfo() + { + return null; + // var info = new FullTextSearchInfo(); + // info.Features = FullTextSearchFeatures.Full; + // return info; + } + + public override QueryInfo GetQueryInfo() + { + var queryInfo = new QueryInfo(); + queryInfo.MaxNestedSubqueriesAmount = 100; + queryInfo.ParameterPrefix = "@"; + queryInfo.MaxLength = MaxCharLength; + queryInfo.MaxComparisonOperations = DoNotKnow; + queryInfo.Features = + QueryFeatures.NamedParameters | + QueryFeatures.ParameterPrefix | + QueryFeatures.ScalarSubquery | + QueryFeatures.Paging | + QueryFeatures.Limit | + QueryFeatures.Offset | + QueryFeatures.UpdateLimit | + QueryFeatures.DeleteLimit; + return queryInfo; + } + + public override ServerFeatures GetServerFeatures() + { + return ServerFeatures.Savepoints; + } + + public override IdentityInfo GetIdentityInfo() + { + return null; + } + + public override DataTypeCollection GetDataTypesInfo() + { + var commonFeatures = + DataTypeFeatures.Grouping | + DataTypeFeatures.Indexing | + DataTypeFeatures.KeyConstraint | + DataTypeFeatures.Nullable | + DataTypeFeatures.Ordering | + DataTypeFeatures.Multiple | + DataTypeFeatures.Default; + var lobFeatures = + DataTypeFeatures.Nullable | + DataTypeFeatures.Multiple | + DataTypeFeatures.Default; + + var dtc = new DataTypeCollection(); + + dtc.Int16 = DataTypeInfo.Range(SqlType.Int16, commonFeatures, + ValueRange.Int16, + "smallint"); + + dtc.Int32 = DataTypeInfo.Range(SqlType.Int32, commonFeatures, + ValueRange.Int32, "integer"); + + dtc.Int64 = DataTypeInfo.Range(SqlType.Int64, commonFeatures, + ValueRange.Int64, "bigint"); + + dtc.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, commonFeatures, + ValueRange.Decimal, 18, "numeric", "decimal"); + + dtc.Float = DataTypeInfo.Range(SqlType.Float, commonFeatures, + ValueRange.Float, "float"); + + dtc.Double = DataTypeInfo.Range(SqlType.Double, commonFeatures, + ValueRange.Double, "double precision"); + + dtc.DateTime = DataTypeInfo.Range(SqlType.DateTime, commonFeatures, + ValueRange.DateTime, "timestamp"); + + dtc.Char = DataTypeInfo.Stream(SqlType.Char, commonFeatures, MaxCharLength, "char"); + dtc.VarChar = DataTypeInfo.Stream(SqlType.VarChar, commonFeatures, MaxCharLength, "varchar"); + dtc.VarCharMax = DataTypeInfo.Stream(SqlType.VarCharMax, lobFeatures, MaxTextLength, "blob sub_type 1"); + dtc.VarBinaryMax = DataTypeInfo.Stream(SqlType.VarBinaryMax, lobFeatures, MaxTextLength, "blob sub_type 0"); + + return dtc; + } + + public override IsolationLevels GetIsolationLevels() + { + return IsolationLevels.ReadCommitted | IsolationLevels.ReadUncommitted | IsolationLevels.RepeatableRead; + } + + public override EntityInfo GetDomainInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override AssertConstraintInfo GetAssertionInfo() + { + return null; + } + + public override int GetStringIndexingBase() + { + return 1; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs index a3030e9f50..795ae91dd2 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs @@ -1,331 +1,331 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.17 - -using System.Linq; -using Xtensive.Sql.Compiler; -using System; -using System.Text; -using Xtensive.Core; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Model; - - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal class Translator : SqlTranslator - { - public override string DateTimeFormatString - { - get { return Constants.DateTimeFormatString; } - } - - public override string TimeSpanFormatString - { - get { return string.Empty; } - } - - /// - public override string QuoteIdentifier(params string[] names) - { - return SqlHelper.QuoteIdentifierWithQuotes(names); - } - - /// - public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, - SequenceDescriptorSection section) - { - switch (section) { - case SequenceDescriptorSection.StartValue: - return string.Empty; - case SequenceDescriptorSection.RestartValue: - if (descriptor.StartValue.HasValue) - return "RESTART WITH " + descriptor.StartValue.Value; - return string.Empty; - case SequenceDescriptorSection.Increment: - return string.Empty; - case SequenceDescriptorSection.MaxValue: - return string.Empty; - case SequenceDescriptorSection.MinValue: - return string.Empty; - case SequenceDescriptorSection.AlterMaxValue: - return string.Empty; - case SequenceDescriptorSection.AlterMinValue: - return string.Empty; - case SequenceDescriptorSection.IsCyclic: - return string.Empty; - default: - return string.Empty; - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) - { - switch (section) { - case AlterTableSection.AddColumn: - return "ADD"; - case AlterTableSection.AlterColumn: - return "ALTER"; - case AlterTableSection.DropColumn: - return "DROP"; - case AlterTableSection.RenameColumn: - return "ALTER"; - case AlterTableSection.DropBehavior: - return string.Empty; - } - return base.Translate(context, node, section); - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropTable node) - { - return "DROP TABLE " + Translate(context, node.Table); - } - - /// - public override string Translate(SqlCompilerContext context, object literalValue) - { - var literalType = literalValue.GetType(); - switch (Type.GetTypeCode(literalType)) { - case TypeCode.Boolean: - return (bool) literalValue ? "1" : "0"; - case TypeCode.UInt64: - return QuoteString(((UInt64) literalValue).ToString()); - } - if (literalType==typeof (byte[])) { - var values = (byte[]) literalValue; - var builder = new StringBuilder(2 * (values.Length + 1)); - builder.Append("x'"); - builder.AppendHexArray(values); - builder.Append("'"); - return builder.ToString(); - } - if (literalType==typeof (Guid)) - return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); - if (literalType==typeof (TimeSpan)) - return Convert.ToString((long) ((TimeSpan) literalValue).Ticks * 100); - return base.Translate(context, literalValue); - } - - /// - public override string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.Equals: - return "="; - case SqlNodeType.NotEquals: - return "<>"; - case SqlNodeType.Modulo: - return "MOD"; - case SqlNodeType.DateTimeMinusDateTime: - return "-"; - case SqlNodeType.Except: - throw SqlHelper.NotSupported(type.ToString()); - case SqlNodeType.Intersect: - throw SqlHelper.NotSupported(type.ToString()); - case SqlNodeType.BitAnd: - return "BIN_AND"; - case SqlNodeType.BitOr: - return "BIN_OR"; - case SqlNodeType.BitXor: - return "BIN_XOR"; - case SqlNodeType.Overlaps: - throw SqlHelper.NotSupported(type.ToString()); - default: - return base.Translate(type); - } - } - - /// - public override string Translate(SqlFunctionType type) - { - switch (type) { - case SqlFunctionType.CharLength: - return "CHAR_LENGTH"; - case SqlFunctionType.BinaryLength: - return "OCTET_LENGTH"; - case SqlFunctionType.Truncate: - return "TRUNC"; - case SqlFunctionType.IntervalNegate: - return "-"; - case SqlFunctionType.Log: - return "LN"; - case SqlFunctionType.Log10: - return "LOG10"; - case SqlFunctionType.Ceiling: - return "CEIL"; - case SqlFunctionType.PadLeft: - return "LPAD"; - case SqlFunctionType.PadRight: - return "RPAD"; - case SqlFunctionType.Concat: - return "||"; - case SqlFunctionType.SystemUser: - case SqlFunctionType.SessionUser: - return base.Translate(SqlFunctionType.CurrentUser); - case SqlFunctionType.Degrees: - case SqlFunctionType.Radians: - case SqlFunctionType.Square: - throw SqlHelper.NotSupported(type.ToString()); - case SqlFunctionType.IntervalAbs: - return Translate(SqlFunctionType.Abs); - default: - return base.Translate(type); - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "GEN_ID("; - case NodeSection.Exit: - return "," + node.Increment + ")"; - } - return string.Empty; - } - - /// - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.Shared) || lockType.Supports(SqlLockType.SkipLocked)) - return base.Translate(lockType); - return "WITH LOCK"; - } - - /// - public override string Translate(SqlDateTimePart dateTimePart) - { - switch (dateTimePart) { - case SqlDateTimePart.DayOfYear: - return "YEARDAY"; - case SqlDateTimePart.DayOfWeek: - return "WEEKDAY"; - } - return base.Translate(dateTimePart); - } - - /// - public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.Limit: - return "FIRST"; - case SelectSection.Offset: - return "SKIP"; - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - switch (section) { - case UpdateSection.Limit: - return "ROWS"; - } - return base.Translate(context, node, section); - } - - /// - public override string Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) - { - switch (section) { - case DeleteSection.Limit: - return "ROWS"; - } - return base.Translate(context, node, section); - } - - /// - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - switch (section) { - case CreateIndexSection.Entry: - Index index = node.Index; - var builder = new StringBuilder(); - builder.Append("CREATE "); - if (index.IsUnique) - builder.Append("UNIQUE "); - //else if (!index.IsAscending) - // builder.Append("DESC "); - builder.Append("INDEX " + QuoteIdentifier(index.DbName)); - builder.Append(" ON " + Translate(context, index.DataTable)); - return builder.ToString(); - case CreateIndexSection.ColumnsEnter: - if (node.Index.Columns[0].Expression!=null) { - if (node.Index.Columns.Count > 1) - SqlHelper.NotSupported("expression index with multiple column"); - return "COMPUTED BY ("; - } - else - return "("; - } - return base.Translate(context, node, section); - } - - /// - public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) - { - switch (section) { - case ConstraintSection.Exit: - ForeignKey fk = constraint as ForeignKey; - StringBuilder sb = new StringBuilder(); - sb.Append(")"); - if (fk!=null) { - if (fk.OnUpdate!=ReferentialAction.NoAction) - sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); - if (fk.OnDelete!=ReferentialAction.NoAction) - sb.Append(" ON DELETE " + Translate(fk.OnDelete)); - } - return sb.ToString(); - } - return base.Translate(context, constraint, section); - } - - /// - public override string Translate(SqlCompilerContext context, SqlAlterSequence node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "SET GENERATOR " + Translate(context, node.Sequence); - case NodeSection.Exit: - return "TO " + (node.SequenceDescriptor.LastValue.HasValue ? node.SequenceDescriptor.LastValue : 0); - } - return string.Empty; - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropIndex node) - { - if (!node.Index.IsFullText) - return "DROP INDEX " + QuoteIdentifier(node.Index.DbName); - else - return "DROP FULLTEXT INDEX ON " + Translate(context, node.Index.DataTable); - } - - public override string Translate(SqlCompilerContext context, SqlDropSequence node) - { - return "DROP SEQUENCE " + Translate(context, node.Sequence); - } - - public override string Translate(SqlCompilerContext context, SqlQueryRef node, TableSection section) - { - if (context.GetTraversalPath().Any(n => n.NodeType==SqlNodeType.Insert)) - return string.Empty; - return base.Translate(context, node, section); - } - - // Constructors - - /// - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.17 + +using System.Linq; +using Xtensive.Sql.Compiler; +using System; +using System.Text; +using Xtensive.Core; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Model; + + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal class Translator : SqlTranslator + { + public override string DateTimeFormatString + { + get { return Constants.DateTimeFormatString; } + } + + public override string TimeSpanFormatString + { + get { return string.Empty; } + } + + /// + public override string QuoteIdentifier(params string[] names) + { + return SqlHelper.QuoteIdentifierWithQuotes(names); + } + + /// + public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, + SequenceDescriptorSection section) + { + switch (section) { + case SequenceDescriptorSection.StartValue: + return string.Empty; + case SequenceDescriptorSection.RestartValue: + if (descriptor.StartValue.HasValue) + return "RESTART WITH " + descriptor.StartValue.Value; + return string.Empty; + case SequenceDescriptorSection.Increment: + return string.Empty; + case SequenceDescriptorSection.MaxValue: + return string.Empty; + case SequenceDescriptorSection.MinValue: + return string.Empty; + case SequenceDescriptorSection.AlterMaxValue: + return string.Empty; + case SequenceDescriptorSection.AlterMinValue: + return string.Empty; + case SequenceDescriptorSection.IsCyclic: + return string.Empty; + default: + return string.Empty; + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) + { + switch (section) { + case AlterTableSection.AddColumn: + return "ADD"; + case AlterTableSection.AlterColumn: + return "ALTER"; + case AlterTableSection.DropColumn: + return "DROP"; + case AlterTableSection.RenameColumn: + return "ALTER"; + case AlterTableSection.DropBehavior: + return string.Empty; + } + return base.Translate(context, node, section); + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropTable node) + { + return "DROP TABLE " + Translate(context, node.Table); + } + + /// + public override string Translate(SqlCompilerContext context, object literalValue) + { + var literalType = literalValue.GetType(); + switch (Type.GetTypeCode(literalType)) { + case TypeCode.Boolean: + return (bool) literalValue ? "1" : "0"; + case TypeCode.UInt64: + return QuoteString(((UInt64) literalValue).ToString()); + } + if (literalType==typeof (byte[])) { + var values = (byte[]) literalValue; + var builder = new StringBuilder(2 * (values.Length + 1)); + builder.Append("x'"); + builder.AppendHexArray(values); + builder.Append("'"); + return builder.ToString(); + } + if (literalType==typeof (Guid)) + return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); + if (literalType==typeof (TimeSpan)) + return Convert.ToString((long) ((TimeSpan) literalValue).Ticks * 100); + return base.Translate(context, literalValue); + } + + /// + public override string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.Equals: + return "="; + case SqlNodeType.NotEquals: + return "<>"; + case SqlNodeType.Modulo: + return "MOD"; + case SqlNodeType.DateTimeMinusDateTime: + return "-"; + case SqlNodeType.Except: + throw SqlHelper.NotSupported(type.ToString()); + case SqlNodeType.Intersect: + throw SqlHelper.NotSupported(type.ToString()); + case SqlNodeType.BitAnd: + return "BIN_AND"; + case SqlNodeType.BitOr: + return "BIN_OR"; + case SqlNodeType.BitXor: + return "BIN_XOR"; + case SqlNodeType.Overlaps: + throw SqlHelper.NotSupported(type.ToString()); + default: + return base.Translate(type); + } + } + + /// + public override string Translate(SqlFunctionType type) + { + switch (type) { + case SqlFunctionType.CharLength: + return "CHAR_LENGTH"; + case SqlFunctionType.BinaryLength: + return "OCTET_LENGTH"; + case SqlFunctionType.Truncate: + return "TRUNC"; + case SqlFunctionType.IntervalNegate: + return "-"; + case SqlFunctionType.Log: + return "LN"; + case SqlFunctionType.Log10: + return "LOG10"; + case SqlFunctionType.Ceiling: + return "CEIL"; + case SqlFunctionType.PadLeft: + return "LPAD"; + case SqlFunctionType.PadRight: + return "RPAD"; + case SqlFunctionType.Concat: + return "||"; + case SqlFunctionType.SystemUser: + case SqlFunctionType.SessionUser: + return base.Translate(SqlFunctionType.CurrentUser); + case SqlFunctionType.Degrees: + case SqlFunctionType.Radians: + case SqlFunctionType.Square: + throw SqlHelper.NotSupported(type.ToString()); + case SqlFunctionType.IntervalAbs: + return Translate(SqlFunctionType.Abs); + default: + return base.Translate(type); + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "GEN_ID("; + case NodeSection.Exit: + return "," + node.Increment + ")"; + } + return string.Empty; + } + + /// + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.Shared) || lockType.Supports(SqlLockType.SkipLocked)) + return base.Translate(lockType); + return "WITH LOCK"; + } + + /// + public override string Translate(SqlDateTimePart dateTimePart) + { + switch (dateTimePart) { + case SqlDateTimePart.DayOfYear: + return "YEARDAY"; + case SqlDateTimePart.DayOfWeek: + return "WEEKDAY"; + } + return base.Translate(dateTimePart); + } + + /// + public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + { + switch (section) { + case SelectSection.Limit: + return "FIRST"; + case SelectSection.Offset: + return "SKIP"; + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) + { + switch (section) { + case UpdateSection.Limit: + return "ROWS"; + } + return base.Translate(context, node, section); + } + + /// + public override string Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) + { + switch (section) { + case DeleteSection.Limit: + return "ROWS"; + } + return base.Translate(context, node, section); + } + + /// + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + switch (section) { + case CreateIndexSection.Entry: + Index index = node.Index; + var builder = new StringBuilder(); + builder.Append("CREATE "); + if (index.IsUnique) + builder.Append("UNIQUE "); + //else if (!index.IsAscending) + // builder.Append("DESC "); + builder.Append("INDEX " + QuoteIdentifier(index.DbName)); + builder.Append(" ON " + Translate(context, index.DataTable)); + return builder.ToString(); + case CreateIndexSection.ColumnsEnter: + if (node.Index.Columns[0].Expression!=null) { + if (node.Index.Columns.Count > 1) + SqlHelper.NotSupported("expression index with multiple column"); + return "COMPUTED BY ("; + } + else + return "("; + } + return base.Translate(context, node, section); + } + + /// + public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) + { + switch (section) { + case ConstraintSection.Exit: + ForeignKey fk = constraint as ForeignKey; + StringBuilder sb = new StringBuilder(); + sb.Append(")"); + if (fk!=null) { + if (fk.OnUpdate!=ReferentialAction.NoAction) + sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); + if (fk.OnDelete!=ReferentialAction.NoAction) + sb.Append(" ON DELETE " + Translate(fk.OnDelete)); + } + return sb.ToString(); + } + return base.Translate(context, constraint, section); + } + + /// + public override string Translate(SqlCompilerContext context, SqlAlterSequence node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "SET GENERATOR " + Translate(context, node.Sequence); + case NodeSection.Exit: + return "TO " + (node.SequenceDescriptor.LastValue.HasValue ? node.SequenceDescriptor.LastValue : 0); + } + return string.Empty; + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropIndex node) + { + if (!node.Index.IsFullText) + return "DROP INDEX " + QuoteIdentifier(node.Index.DbName); + else + return "DROP FULLTEXT INDEX ON " + Translate(context, node.Index.DataTable); + } + + public override string Translate(SqlCompilerContext context, SqlDropSequence node) + { + return "DROP SEQUENCE " + Translate(context, node.Sequence); + } + + public override string Translate(SqlCompilerContext context, SqlQueryRef node, TableSection section) + { + if (context.GetTraversalPath().Any(n => n.NodeType==SqlNodeType.Insert)) + return string.Empty; + return base.Translate(context, node, section); + } + + // Constructors + + /// + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/TypeMapper.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/TypeMapper.cs index d16bc1753b..6816888c7d 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/TypeMapper.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/TypeMapper.cs @@ -1,125 +1,125 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.10 - -using System; -using System.Data.Common; -using System.Data; - -namespace Xtensive.Sql.Drivers.Firebird.v2_5 -{ - internal class TypeMapper : Sql.TypeMapper - { - public override bool IsParameterCastRequired(Type type) - { - return true; - } - - public override SqlValueType MapBoolean(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - public override SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return base.MapInt(length, precision, scale); - } - - public override SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return base.MapLong(length, precision, scale); - } - - public override SqlValueType MapULong(int? length, int? precision, int? scale) - { - return base.MapString(30, null, null); - ; - } - - public override SqlValueType MapChar(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Char, 1); - } - - public override SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return base.MapString(36, null, null); - ; - } - - public override SqlValueType MapByte(int? length, int? precision, int? scale) - { - return base.MapShort(length, precision, scale); - } - - public override SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return base.MapShort(length, precision, scale); - } - - public override object ReadGuid(DbDataReader reader, int index) - { - string s = reader.GetString(index); - if (string.IsNullOrEmpty(s)) - return null; - return SqlHelper.GuidFromString(s); - } - - public override object ReadChar(DbDataReader reader, int index) - { - char c = (char) base.ReadChar(reader, index); - if (char.IsControl(c) || char.IsPunctuation(c)) - return c; - if (char.IsWhiteSpace(c)) - return null; - return c; - } - - public override void BindChar(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - if (value==null || (default(char).Equals(value))) { - parameter.Value = DBNull.Value; - return; - } - var _char = (char) value; - parameter.Value = _char==default(char) ? string.Empty : _char.ToString(); - } - - public override object ReadString(DbDataReader reader, int index) - { - string s = (string) base.ReadString(reader, index); - if (s!=null) - s = s.Trim(); - return s; - } - - public override void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - parameter.Value = value ?? DBNull.Value; - } - - public override void BindBoolean(DbParameter parameter, object value) - { - object val = DBNull.Value; - if (value!=null) - val = ((bool) value) ? (short) 1 : (short) 0; - BindShort(parameter, val); - } - - public override void BindGuid(DbParameter parameter, object value) - { - BindString(parameter, value==null ? DBNull.Value : (object) SqlHelper.GuidToString((Guid) value)); - } - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.10 + +using System; +using System.Data.Common; +using System.Data; + +namespace Xtensive.Sql.Drivers.Firebird.v2_5 +{ + internal class TypeMapper : Sql.TypeMapper + { + public override bool IsParameterCastRequired(Type type) + { + return true; + } + + public override SqlValueType MapBoolean(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + public override SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return base.MapInt(length, precision, scale); + } + + public override SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return base.MapLong(length, precision, scale); + } + + public override SqlValueType MapULong(int? length, int? precision, int? scale) + { + return base.MapString(30, null, null); + ; + } + + public override SqlValueType MapChar(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Char, 1); + } + + public override SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return base.MapString(36, null, null); + ; + } + + public override SqlValueType MapByte(int? length, int? precision, int? scale) + { + return base.MapShort(length, precision, scale); + } + + public override SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return base.MapShort(length, precision, scale); + } + + public override object ReadGuid(DbDataReader reader, int index) + { + string s = reader.GetString(index); + if (string.IsNullOrEmpty(s)) + return null; + return SqlHelper.GuidFromString(s); + } + + public override object ReadChar(DbDataReader reader, int index) + { + char c = (char) base.ReadChar(reader, index); + if (char.IsControl(c) || char.IsPunctuation(c)) + return c; + if (char.IsWhiteSpace(c)) + return null; + return c; + } + + public override void BindChar(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + if (value==null || (default(char).Equals(value))) { + parameter.Value = DBNull.Value; + return; + } + var _char = (char) value; + parameter.Value = _char==default(char) ? string.Empty : _char.ToString(); + } + + public override object ReadString(DbDataReader reader, int index) + { + string s = (string) base.ReadString(reader, index); + if (s!=null) + s = s.Trim(); + return s; + } + + public override void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + parameter.Value = value ?? DBNull.Value; + } + + public override void BindBoolean(DbParameter parameter, object value) + { + object val = DBNull.Value; + if (value!=null) + val = ((bool) value) ? (short) 1 : (short) 0; + BindShort(parameter, val); + } + + public override void BindGuid(DbParameter parameter, object value) + { + BindString(parameter, value==null ? DBNull.Value : (object) SqlHelper.GuidToString((Guid) value)); + } + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Firebird/Xtensive.Orm.Firebird.csproj b/Orm/Xtensive.Orm.Firebird/Xtensive.Orm.Firebird.csproj index 0bade88328..d7c0edc6bd 100644 --- a/Orm/Xtensive.Orm.Firebird/Xtensive.Orm.Firebird.csproj +++ b/Orm/Xtensive.Orm.Firebird/Xtensive.Orm.Firebird.csproj @@ -1,26 +1,26 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Firebird.xml - - - netstandard2.0 - Xtensive - Xtensive.Orm.Firebird - $(DoProductName) provider for Firebird - $(Title) - Adds support for Firebird to $(DoProductName) - true - ..\Orm.snk - true - 2 - - - - - - - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Firebird.xml + + + netstandard2.0 + Xtensive + Xtensive.Orm.Firebird + $(DoProductName) provider for Firebird + $(Title) + Adds support for Firebird to $(DoProductName) + true + ..\Orm.snk + true + 2 + + + + + + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Advanced/CustomLinqCompilerTest.cs b/Orm/Xtensive.Orm.Manual/Advanced/CustomLinqCompilerTest.cs index 81868b4da9..58aa10fb86 100644 --- a/Orm/Xtensive.Orm.Manual/Advanced/CustomLinqCompilerTest.cs +++ b/Orm/Xtensive.Orm.Manual/Advanced/CustomLinqCompilerTest.cs @@ -1,203 +1,203 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.16 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Advanced.CustomLinqCompiler -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field] - [Key] - public int Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public DateTime BirthDay { get; set; } - - public string FullName - { - get { return string.Format("{0} {1}", FirstName, LastName); } - } - - public string FullName2 - { - get { return string.Format("{0} {1}", FirstName, LastName); } - } - - public string AddPrefix(string prefix) - { - return string.Format("{0}{1}", prefix, LastName); - } - - public Person(Session session) - : base(session) - {} - } - - #endregion - - #region Compiler container - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Person), "FullName", TargetKind.PropertyGet)] - public static Expression FullName(Expression personExpression) - { - var spaceExpression = Expression.Constant(" "); - var firstNameExpression = Expression.Property(personExpression, "FirstName"); - var lastNameExpression = Expression.Property(personExpression, "lastName"); - var methodInfo = typeof (string).GetMethod("Concat", - new[] {typeof (string), typeof (string), typeof (string)} ); - var concatExpression = Expression.Call( - methodInfo, - firstNameExpression, - spaceExpression, - lastNameExpression); - return concatExpression; - } - - [Compiler(typeof (Person), "FullName2", TargetKind.PropertyGet)] - public static Expression FullName2(Expression personExpression) - { - // FullName logic. Since "ex" expression type exactly specified, - // C# compiler allows to use "Person" properties. - Expression> ex = - person => person.FirstName + " " + person.LastName; - - // Binding lambda parameters replaces parameter usage in lambda, - // so that binding expression becomes like this: - // personExpression.FirstName + " " + personExpression.LastName - return ex.BindParameters(personExpression); - } - - [Compiler(typeof (Person), "AddPrefix", TargetKind.Method)] - public static Expression AddPrefix(Expression personExpression, Expression prefixExpression) - { - Expression> ex = - (person, prefix) => prefix + person.LastName; - return ex.BindParameters(personExpression, prefixExpression); - } - } - - #endregion - - [TestFixture] - public class CustomLinqCompilerTest - { - private Domain existingDomain; - - [Test] - public void PropertyTest() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var expectedFullNames = session.Query.All().AsEnumerable() - .OrderBy(p => p.Id) - .Select(p => p.FullName); - Assert.Greater(expectedFullNames.Count(), 0); - var fullNames = session.Query.All() - .OrderBy(p => p.Id) - .Select(p => p.FullName); - Assert.IsTrue(expectedFullNames.SequenceEqual(fullNames)); - } - } - } - - [Test] - public void Property2Test() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var expectedFullNames = session.Query.All().AsEnumerable() - .OrderBy(p => p.Id) - .Select(p => p.FullName2); - Assert.Greater(expectedFullNames.Count(), 0); - var fullNames = session.Query.All() - .OrderBy(p => p.Id) - .Select(p => p.FullName2); - Assert.IsTrue(expectedFullNames.SequenceEqual(fullNames)); - } - } - } - - [Test] - public void MethodTest() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var expectedStrings = session.Query.All().AsEnumerable() - .OrderBy(p => p.Id) - .Select(p => p.AddPrefix("Mr. ")); - var resultStrings = session.Query.All() - .OrderBy(p => p.Id) - .Select(p => p.AddPrefix("Mr. ")); - Assert.IsTrue(expectedStrings.SequenceEqual(resultStrings)); - } - } - } - - [Test] - public void Method2Test() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var expectedStrings = session.Query.All().AsEnumerable() - .OrderBy(p => p.Id) - .Select(p => p.AddPrefix(p.Id.ToString())); - var resultStrings = session.Query.All() - .OrderBy(p => p.Id) - .Select(p => p.AddPrefix(p.Id.ToString())); - Assert.IsTrue(expectedStrings.SequenceEqual(resultStrings)); - } - } - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - config.Types.Register(typeof (CustomLinqCompilerContainer)); - - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - // Creating initial content - new Person(session) {FirstName = "Ivan", LastName = "Semenov"}; - new Person(session) {FirstName = "John", LastName = "Smith"}; - new Person(session) {FirstName = "Andrew", LastName = "Politkovsky"}; - - transactionScope.Complete(); - } - } - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.16 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Advanced.CustomLinqCompiler +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field] + [Key] + public int Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public DateTime BirthDay { get; set; } + + public string FullName + { + get { return string.Format("{0} {1}", FirstName, LastName); } + } + + public string FullName2 + { + get { return string.Format("{0} {1}", FirstName, LastName); } + } + + public string AddPrefix(string prefix) + { + return string.Format("{0}{1}", prefix, LastName); + } + + public Person(Session session) + : base(session) + {} + } + + #endregion + + #region Compiler container + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Person), "FullName", TargetKind.PropertyGet)] + public static Expression FullName(Expression personExpression) + { + var spaceExpression = Expression.Constant(" "); + var firstNameExpression = Expression.Property(personExpression, "FirstName"); + var lastNameExpression = Expression.Property(personExpression, "lastName"); + var methodInfo = typeof (string).GetMethod("Concat", + new[] {typeof (string), typeof (string), typeof (string)} ); + var concatExpression = Expression.Call( + methodInfo, + firstNameExpression, + spaceExpression, + lastNameExpression); + return concatExpression; + } + + [Compiler(typeof (Person), "FullName2", TargetKind.PropertyGet)] + public static Expression FullName2(Expression personExpression) + { + // FullName logic. Since "ex" expression type exactly specified, + // C# compiler allows to use "Person" properties. + Expression> ex = + person => person.FirstName + " " + person.LastName; + + // Binding lambda parameters replaces parameter usage in lambda, + // so that binding expression becomes like this: + // personExpression.FirstName + " " + personExpression.LastName + return ex.BindParameters(personExpression); + } + + [Compiler(typeof (Person), "AddPrefix", TargetKind.Method)] + public static Expression AddPrefix(Expression personExpression, Expression prefixExpression) + { + Expression> ex = + (person, prefix) => prefix + person.LastName; + return ex.BindParameters(personExpression, prefixExpression); + } + } + + #endregion + + [TestFixture] + public class CustomLinqCompilerTest + { + private Domain existingDomain; + + [Test] + public void PropertyTest() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var expectedFullNames = session.Query.All().AsEnumerable() + .OrderBy(p => p.Id) + .Select(p => p.FullName); + Assert.Greater(expectedFullNames.Count(), 0); + var fullNames = session.Query.All() + .OrderBy(p => p.Id) + .Select(p => p.FullName); + Assert.IsTrue(expectedFullNames.SequenceEqual(fullNames)); + } + } + } + + [Test] + public void Property2Test() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var expectedFullNames = session.Query.All().AsEnumerable() + .OrderBy(p => p.Id) + .Select(p => p.FullName2); + Assert.Greater(expectedFullNames.Count(), 0); + var fullNames = session.Query.All() + .OrderBy(p => p.Id) + .Select(p => p.FullName2); + Assert.IsTrue(expectedFullNames.SequenceEqual(fullNames)); + } + } + } + + [Test] + public void MethodTest() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var expectedStrings = session.Query.All().AsEnumerable() + .OrderBy(p => p.Id) + .Select(p => p.AddPrefix("Mr. ")); + var resultStrings = session.Query.All() + .OrderBy(p => p.Id) + .Select(p => p.AddPrefix("Mr. ")); + Assert.IsTrue(expectedStrings.SequenceEqual(resultStrings)); + } + } + } + + [Test] + public void Method2Test() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var expectedStrings = session.Query.All().AsEnumerable() + .OrderBy(p => p.Id) + .Select(p => p.AddPrefix(p.Id.ToString())); + var resultStrings = session.Query.All() + .OrderBy(p => p.Id) + .Select(p => p.AddPrefix(p.Id.ToString())); + Assert.IsTrue(expectedStrings.SequenceEqual(resultStrings)); + } + } + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + config.Types.Register(typeof (CustomLinqCompilerContainer)); + + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + // Creating initial content + new Person(session) {FirstName = "Ivan", LastName = "Semenov"}; + new Person(session) {FirstName = "John", LastName = "Smith"}; + new Person(session) {FirstName = "Andrew", LastName = "Politkovsky"}; + + transactionScope.Complete(); + } + } + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Advanced/CustomSqlCompilerTest.cs b/Orm/Xtensive.Orm.Manual/Advanced/CustomSqlCompilerTest.cs index dffa65d74c..598efbfb19 100644 --- a/Orm/Xtensive.Orm.Manual/Advanced/CustomSqlCompilerTest.cs +++ b/Orm/Xtensive.Orm.Manual/Advanced/CustomSqlCompilerTest.cs @@ -1,168 +1,168 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.11 - -using System; -using NUnit.Framework; -using Xtensive.Linq; -using Xtensive.Orm.Tests; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using System.Linq; - -namespace Xtensive.Orm.Manual.Advanced.CustomSqlCompiler -{ - #region Model - - [Serializable] - public class Address : Structure - { - [Field(Length = 200)] - public string Country { get; set; } - - [Field(Length = 200)] - public string City { get; set; } - - [Field(Length = 200)] - public string Street { get; set; } - - [Field(Length = 200)] - public string Building { get; set; } - - public Address(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public Address Address { get; set; } - - public Person(Session session) - : base(session) - {} - } - - #endregion - - #region Extension methods to compile - - public static class CustomSqlCompilerStringExtensions - { - public static char GetThirdChar(this string source) - { - return source[2]; - } - - public static string BuildAddressString(string country, string city, string building) - { - return string.Format("{0}, {1}-{2}", country, city, building); - } - } - - #endregion - - #region Compiler container - - [CompilerContainer(typeof(SqlExpression))] - public static class CustomSqlCompilerContainer - { - [Compiler(typeof(CustomSqlCompilerStringExtensions), "GetThirdChar", TargetKind.Method | TargetKind.Static)] - public static SqlExpression GetThirdChar(SqlExpression _this) - { - return SqlDml.Substring(_this, 2, 1); - } - - [Compiler(typeof(CustomSqlCompilerStringExtensions), "BuildAddressString", TargetKind.Method | TargetKind.Static)] - public static SqlExpression BuildAddressString(SqlExpression countryExpression, SqlExpression streetExpression, SqlExpression buildingExpression) - { - return SqlDml.Concat(countryExpression, SqlDml.Literal(", "), streetExpression, SqlDml.Literal("-"), buildingExpression); - } - } - - #endregion - - [TestFixture] - public class CustomSqlCompilerTest - { - private Domain existingDomain; - - [Test] - public void GetThirdCharTest() - { - var domain = GetDomain(); - - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var thirdChars = session.Query.All() - .Select(p => p.Name.GetThirdChar()) - .OrderBy(thirdChar => thirdChar) - .ToList(); - Assert.IsTrue(thirdChars.SequenceEqual(new[] {'a','r'})); - } - } - } - - [Test] - public void BuildAddressStringTest() - { - var domain = GetDomain(); - - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var addresses = session.Query.All() - .Select(p => CustomSqlCompilerStringExtensions.BuildAddressString( - p.Address.Country, p.Address.City, p.Address.Building)) - .OrderBy(a => a) - .ToList(); - var expectedAddresses = session.Query.All().AsEnumerable() - .Select(p => CustomSqlCompilerStringExtensions.BuildAddressString( - p.Address.Country, p.Address.City, p.Address.Building)) - .OrderBy(a=>a); - Assert.IsTrue(addresses.SequenceEqual(expectedAddresses)); - } - } - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - config.Types.Register(typeof (CustomSqlCompilerContainer)); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - // Creating initial content - new Person(session) { - Name = "Tereza", Address = new Address (session) { - Country = "Czech Republic", City = "Prague", Street = "Vinohradska", Building = "34" - } - }; - new Person(session) { - Name = "Ivan", Address = new Address (session) { - Country = "Russia", City = "Ekaterinburg", Street = "Lenina", Building = "11/2" - } - }; - - transactionScope.Complete(); - } - } - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.11 + +using System; +using NUnit.Framework; +using Xtensive.Linq; +using Xtensive.Orm.Tests; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using System.Linq; + +namespace Xtensive.Orm.Manual.Advanced.CustomSqlCompiler +{ + #region Model + + [Serializable] + public class Address : Structure + { + [Field(Length = 200)] + public string Country { get; set; } + + [Field(Length = 200)] + public string City { get; set; } + + [Field(Length = 200)] + public string Street { get; set; } + + [Field(Length = 200)] + public string Building { get; set; } + + public Address(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public Address Address { get; set; } + + public Person(Session session) + : base(session) + {} + } + + #endregion + + #region Extension methods to compile + + public static class CustomSqlCompilerStringExtensions + { + public static char GetThirdChar(this string source) + { + return source[2]; + } + + public static string BuildAddressString(string country, string city, string building) + { + return string.Format("{0}, {1}-{2}", country, city, building); + } + } + + #endregion + + #region Compiler container + + [CompilerContainer(typeof(SqlExpression))] + public static class CustomSqlCompilerContainer + { + [Compiler(typeof(CustomSqlCompilerStringExtensions), "GetThirdChar", TargetKind.Method | TargetKind.Static)] + public static SqlExpression GetThirdChar(SqlExpression _this) + { + return SqlDml.Substring(_this, 2, 1); + } + + [Compiler(typeof(CustomSqlCompilerStringExtensions), "BuildAddressString", TargetKind.Method | TargetKind.Static)] + public static SqlExpression BuildAddressString(SqlExpression countryExpression, SqlExpression streetExpression, SqlExpression buildingExpression) + { + return SqlDml.Concat(countryExpression, SqlDml.Literal(", "), streetExpression, SqlDml.Literal("-"), buildingExpression); + } + } + + #endregion + + [TestFixture] + public class CustomSqlCompilerTest + { + private Domain existingDomain; + + [Test] + public void GetThirdCharTest() + { + var domain = GetDomain(); + + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var thirdChars = session.Query.All() + .Select(p => p.Name.GetThirdChar()) + .OrderBy(thirdChar => thirdChar) + .ToList(); + Assert.IsTrue(thirdChars.SequenceEqual(new[] {'a','r'})); + } + } + } + + [Test] + public void BuildAddressStringTest() + { + var domain = GetDomain(); + + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var addresses = session.Query.All() + .Select(p => CustomSqlCompilerStringExtensions.BuildAddressString( + p.Address.Country, p.Address.City, p.Address.Building)) + .OrderBy(a => a) + .ToList(); + var expectedAddresses = session.Query.All().AsEnumerable() + .Select(p => CustomSqlCompilerStringExtensions.BuildAddressString( + p.Address.Country, p.Address.City, p.Address.Building)) + .OrderBy(a=>a); + Assert.IsTrue(addresses.SequenceEqual(expectedAddresses)); + } + } + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + config.Types.Register(typeof (CustomSqlCompilerContainer)); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + // Creating initial content + new Person(session) { + Name = "Tereza", Address = new Address (session) { + Country = "Czech Republic", City = "Prague", Street = "Vinohradska", Building = "34" + } + }; + new Person(session) { + Name = "Ivan", Address = new Address (session) { + Country = "Russia", City = "Ekaterinburg", Street = "Lenina", Building = "11/2" + } + }; + + transactionScope.Complete(); + } + } + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Advanced/JoinsAndSubqueriesTest.cs b/Orm/Xtensive.Orm.Manual/Advanced/JoinsAndSubqueriesTest.cs index 8c8ef94f68..d870e15be2 100644 --- a/Orm/Xtensive.Orm.Manual/Advanced/JoinsAndSubqueriesTest.cs +++ b/Orm/Xtensive.Orm.Manual/Advanced/JoinsAndSubqueriesTest.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.24 - -using System; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Advanced.JoinsAndSubqueriesTest -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field][Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Person(Session session) - : base(session) - {} - } - - [Serializable] - public class Employee : Person - { - [Field] - public decimal Salary { get; set; } - - public Employee(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class JoinsAndSubqueriesTest - { - private Domain existingDomain; - - [Test] - public void QueryForInheritedEntityTest() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var employees = session.Query.All(); - employees.ToList(); - } - } - } - - [Test] - public void SubQueryForInheritedEntityTest() - { - var domain = GetDomain(); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var query = session.Query.All() - .Select(employee => - new { - employee, - Namesakes = session.Query.All() - .Where(person => person.Name == employee.Name) - }); - - // Enumerate query - foreach (var employeeData in query) { - // Enumerate each subquery element - foreach (var namesake in employeeData.Namesakes) { - // Do something with employee, namesake - } - } - } - } - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - // Creating initial content - new Person (session) {Name = "John"}; - new Person (session) {Name = "Susan"}; - - transactionScope.Complete(); - } - } - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.24 + +using System; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Advanced.JoinsAndSubqueriesTest +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field][Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Person(Session session) + : base(session) + {} + } + + [Serializable] + public class Employee : Person + { + [Field] + public decimal Salary { get; set; } + + public Employee(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class JoinsAndSubqueriesTest + { + private Domain existingDomain; + + [Test] + public void QueryForInheritedEntityTest() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var employees = session.Query.All(); + employees.ToList(); + } + } + } + + [Test] + public void SubQueryForInheritedEntityTest() + { + var domain = GetDomain(); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var query = session.Query.All() + .Select(employee => + new { + employee, + Namesakes = session.Query.All() + .Where(person => person.Name == employee.Name) + }); + + // Enumerate query + foreach (var employeeData in query) { + // Enumerate each subquery element + foreach (var namesake in employeeData.Namesakes) { + // Do something with employee, namesake + } + } + } + } + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + // Creating initial content + new Person (session) {Name = "John"}; + new Person (session) {Name = "Susan"}; + + transactionScope.Complete(); + } + } + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/App.config b/Orm/Xtensive.Orm.Manual/App.config index e65cf89f8d..cbff8e781d 100644 --- a/Orm/Xtensive.Orm.Manual/App.config +++ b/Orm/Xtensive.Orm.Manual/App.config @@ -1,53 +1,53 @@ - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Manual/Attributes/AttributesTest.cs b/Orm/Xtensive.Orm.Manual/Attributes/AttributesTest.cs index 375a516961..69641ff417 100644 --- a/Orm/Xtensive.Orm.Manual/Attributes/AttributesTest.cs +++ b/Orm/Xtensive.Orm.Manual/Attributes/AttributesTest.cs @@ -1,159 +1,159 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.11 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Manual.Attributes -{ - #region Custom key generator - - // Custom int key generator - [Service(typeof (KeyGenerator), Name = "CustomInt32KeyGenerator")] - public class CustomInt32KeyGenerator : KeyGenerator - { - private int counter; - - public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) - { - } - - public override Tuple GenerateKey(KeyInfo keyInfo, Session session) - { - return Tuple.Create(counter++); - } - } - - #endregion - - #region Model - - [Serializable] - // All descendant entities will be placed in the same table. - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - // Index on field "ISBN" that includes additiona "Title" field along with keyfield. - [Index("ISBN", IncludedFields = new[] {"Title"})] - // "Book" keys will be generated by custom "CustomKeyGenerator" key generator. - // KeyGenerator will generate 1024 keys per iteration. - [KeyGenerator(KeyGeneratorKind.Custom, Name = "CustomInt32KeyGenerator")] - public abstract class Book : Entity - { - // This field will be used for descendant entities type information. - [Field, TypeDiscriminator] - public bool BookType { get; private set; } - - [Key(Direction = Direction.Negative), Field] - public int Id { get; private set; } - - [Field, Version] - public int Version { get; private set; } - - [Field] - public string ISBN { get; set; } - - // Field will be mapped to "BookTitle" table column. - [Field, FieldMapping("BookTitle")] - public int Title { get; set; } - - // Field associated to "Books" field int the "Author" entity - [Association(PairTo = "Books")] - [Field] - public Author Author { get; set; } - - protected Book(Session session) - : base(session) - { - } - } - - [Serializable] - // If "BookType" field contains "true" value, the entity is "SciFi" - [TypeDiscriminatorValue(true)] - // Index on field "SciFiDescription" that includes additional "SciFiDescriptionDate" field along with keyfield. - [Index("SciFiDescription", IncludedFields = new[] {"SciFiDescriptionDate"})] - public class SciFi : Book - { - [Field(LazyLoad = true, Length = 4000)] - public string SciFiDescription { get; set; } - - [Field(LazyLoad = true)] - public DateTime SciFiDescriptionDate { get; set; } - - public SciFi(Session session) - : base(session) - { - } - } - - [Serializable] - // If "BookType" field contains "false" value, the entity is "Horror" - [TypeDiscriminatorValue(false)] - public class Horror : Book - { - public Horror(Session session) - : base(session) - { - } - } - - [Serializable] - // Entity "Author" will be mapped to "Persons" table. - [TableMapping("Persons")] - // Key will include "TypeId" field. - [HierarchyRoot(IncludeTypeId = true)] - public class Author : Entity - { - // Key field. The default key generator will be used - // because [HierarchyRoot] attribute does not specify custom key generator - [Key] - [Field] - public int Id { get; private set; } - - [Field(LazyLoad = true)] - public string Name { get; set; } - - // Then author removed, all its books will be removed too. - [Field, Association(OnOwnerRemove = OnRemoveAction.Cascade)] - public EntitySet Books { get; set; } - - public Author(Session session) - : base(session) - { - } - } - - #endregion - - [TestFixture] - public class AttributesTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Author).Assembly, typeof (Author).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var author = new Author(session); - var sciFi = new SciFi(session) {Author = author}; - var horror = new Horror(session) {Author = author}; - - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.11 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Manual.Attributes +{ + #region Custom key generator + + // Custom int key generator + [Service(typeof (KeyGenerator), Name = "CustomInt32KeyGenerator")] + public class CustomInt32KeyGenerator : KeyGenerator + { + private int counter; + + public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) + { + } + + public override Tuple GenerateKey(KeyInfo keyInfo, Session session) + { + return Tuple.Create(counter++); + } + } + + #endregion + + #region Model + + [Serializable] + // All descendant entities will be placed in the same table. + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + // Index on field "ISBN" that includes additiona "Title" field along with keyfield. + [Index("ISBN", IncludedFields = new[] {"Title"})] + // "Book" keys will be generated by custom "CustomKeyGenerator" key generator. + // KeyGenerator will generate 1024 keys per iteration. + [KeyGenerator(KeyGeneratorKind.Custom, Name = "CustomInt32KeyGenerator")] + public abstract class Book : Entity + { + // This field will be used for descendant entities type information. + [Field, TypeDiscriminator] + public bool BookType { get; private set; } + + [Key(Direction = Direction.Negative), Field] + public int Id { get; private set; } + + [Field, Version] + public int Version { get; private set; } + + [Field] + public string ISBN { get; set; } + + // Field will be mapped to "BookTitle" table column. + [Field, FieldMapping("BookTitle")] + public int Title { get; set; } + + // Field associated to "Books" field int the "Author" entity + [Association(PairTo = "Books")] + [Field] + public Author Author { get; set; } + + protected Book(Session session) + : base(session) + { + } + } + + [Serializable] + // If "BookType" field contains "true" value, the entity is "SciFi" + [TypeDiscriminatorValue(true)] + // Index on field "SciFiDescription" that includes additional "SciFiDescriptionDate" field along with keyfield. + [Index("SciFiDescription", IncludedFields = new[] {"SciFiDescriptionDate"})] + public class SciFi : Book + { + [Field(LazyLoad = true, Length = 4000)] + public string SciFiDescription { get; set; } + + [Field(LazyLoad = true)] + public DateTime SciFiDescriptionDate { get; set; } + + public SciFi(Session session) + : base(session) + { + } + } + + [Serializable] + // If "BookType" field contains "false" value, the entity is "Horror" + [TypeDiscriminatorValue(false)] + public class Horror : Book + { + public Horror(Session session) + : base(session) + { + } + } + + [Serializable] + // Entity "Author" will be mapped to "Persons" table. + [TableMapping("Persons")] + // Key will include "TypeId" field. + [HierarchyRoot(IncludeTypeId = true)] + public class Author : Entity + { + // Key field. The default key generator will be used + // because [HierarchyRoot] attribute does not specify custom key generator + [Key] + [Field] + public int Id { get; private set; } + + [Field(LazyLoad = true)] + public string Name { get; set; } + + // Then author removed, all its books will be removed too. + [Field, Association(OnOwnerRemove = OnRemoveAction.Cascade)] + public EntitySet Books { get; set; } + + public Author(Session session) + : base(session) + { + } + } + + #endregion + + [TestFixture] + public class AttributesTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Author).Assembly, typeof (Author).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var author = new Author(session); + var sciFi = new SciFi(session) {Author = author}; + var horror = new Horror(session) {Author = author}; + + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Caching/CalculatedValueCachingTest.cs b/Orm/Xtensive.Orm.Manual/Caching/CalculatedValueCachingTest.cs index 41dba21f6f..f8e26c8f52 100644 --- a/Orm/Xtensive.Orm.Manual/Caching/CalculatedValueCachingTest.cs +++ b/Orm/Xtensive.Orm.Manual/Caching/CalculatedValueCachingTest.cs @@ -1,184 +1,184 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.18 - -using System; -using System.Linq.Expressions; -using System.Threading; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Core; -using Xtensive.Linq; -using System.Linq; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Caching -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Product : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Name { get; set; } - - [Field] - public double Price { get; set; } - - [Field] - [Association(PairTo = "Product")] - public EntitySet Orders { get; private set; } - - public override string ToString() - { - return string.Format("Product #{0}, Name={1}, Orders.Count={2}", - Id, Name, Orders.Count); - } - - public Product(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - // Tagging type - private class TotalPriceServices { } - - private TransactionalValue totalPriceCached; - - [Key, Field] - public int Id { get; private set; } - - [Field] - public Product Product { get; set; } - - [Field] - public double Quantity { get; set; } - - public double TotalPrice { - get { - return Quantity * Product.Price; - } - } - - public double TotalPriceCached { - get { - if (totalPriceCached==null) { - var session = Session; - totalPriceCached = new TransactionalValue(session, () => TotalPrice); - if (session.Extensions.Get()==null) { - session.Extensions.Set(new TotalPriceServices()); - // Setting up the tag to ensure the event handles is attached - // just once for each Session - session.Events.EntityFieldValueSetting += ((sender, e) => { - var order = e.Entity as Order; - if (order!=null && (e.Field.Name=="Quantity" || e.Field.Name=="Product")) { - if (order.totalPriceCached!=null) - order.totalPriceCached.Invalidate(); - } - var product = e.Entity as Product; - if (product!=null && e.Field.Name=="Price") - foreach (var pOrder in product.Orders) - if (pOrder.totalPriceCached!=null) - pOrder.totalPriceCached.Invalidate(); - }); - } - } - return totalPriceCached.Value; - } - } - - public override string ToString() - { - return string.Format("Order #{0}, Product={1}, Quantity={2}", - Id, Product.Name, Quantity); - } - - public Order(Session session) - : base(session) - {} - } - - #endregion - - #region LINQ rewriter (compiler container) for TotalPrice - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - // Uber-cool custom LINQ translator for non-persistent - // Order.TotalPrice property - [Compiler(typeof (Order), "TotalPrice", TargetKind.PropertyGet)] - public static Expression TotalPrice(Expression orderExpression) - { - Expression> e = - person => person.Quantity * person.Product.Price; - return e.BindParameters(orderExpression); - } - } - - #endregion - - [TestFixture] - public class CalculatedValueCachingTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Product).Assembly, typeof(Product).Namespace); - config.Types.Register(typeof(CustomLinqCompilerContainer)); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var apple = new Product (session) {Name = "Apple", Price = 2.0}; - var appleOrder = new Order (session) {Product = apple, Quantity = 1}; - // var banana = new Product {Name = "Banana", Price = 1.0}; - // var bananaOrder = new Order {Product = banana, Quantity = 2}; - - // First time calculation - CheckTotalPrice(appleOrder); - - using (session.OpenTransaction(TransactionOpenMode.New)) { - appleOrder.Quantity = 3; - apple.Price = 3; - // Automatic update - CheckTotalPrice(appleOrder); - // No transactionScope.Complete(), so here we get a rollback - } - - // Recovery after rollback - CheckTotalPrice(appleOrder); - - Console.WriteLine("Sleeping for 1 sec."); - Thread.Sleep(TimeSpan.FromSeconds(1.1)); - } - } - } - - private void CheckTotalPrice(Order order) - { - var totalPrice = order.TotalPrice; - - // Checking cached value - Assert.AreEqual(totalPrice, order.TotalPriceCached); - // Checking the value in LINQ query - Assert.AreEqual(totalPrice, - order.Session.Query.All() - .Where(o => o==order) - .Select(o => o.TotalPrice) - .Single()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.18 + +using System; +using System.Linq.Expressions; +using System.Threading; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Core; +using Xtensive.Linq; +using System.Linq; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Caching +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Product : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Name { get; set; } + + [Field] + public double Price { get; set; } + + [Field] + [Association(PairTo = "Product")] + public EntitySet Orders { get; private set; } + + public override string ToString() + { + return string.Format("Product #{0}, Name={1}, Orders.Count={2}", + Id, Name, Orders.Count); + } + + public Product(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + // Tagging type + private class TotalPriceServices { } + + private TransactionalValue totalPriceCached; + + [Key, Field] + public int Id { get; private set; } + + [Field] + public Product Product { get; set; } + + [Field] + public double Quantity { get; set; } + + public double TotalPrice { + get { + return Quantity * Product.Price; + } + } + + public double TotalPriceCached { + get { + if (totalPriceCached==null) { + var session = Session; + totalPriceCached = new TransactionalValue(session, () => TotalPrice); + if (session.Extensions.Get()==null) { + session.Extensions.Set(new TotalPriceServices()); + // Setting up the tag to ensure the event handles is attached + // just once for each Session + session.Events.EntityFieldValueSetting += ((sender, e) => { + var order = e.Entity as Order; + if (order!=null && (e.Field.Name=="Quantity" || e.Field.Name=="Product")) { + if (order.totalPriceCached!=null) + order.totalPriceCached.Invalidate(); + } + var product = e.Entity as Product; + if (product!=null && e.Field.Name=="Price") + foreach (var pOrder in product.Orders) + if (pOrder.totalPriceCached!=null) + pOrder.totalPriceCached.Invalidate(); + }); + } + } + return totalPriceCached.Value; + } + } + + public override string ToString() + { + return string.Format("Order #{0}, Product={1}, Quantity={2}", + Id, Product.Name, Quantity); + } + + public Order(Session session) + : base(session) + {} + } + + #endregion + + #region LINQ rewriter (compiler container) for TotalPrice + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + // Uber-cool custom LINQ translator for non-persistent + // Order.TotalPrice property + [Compiler(typeof (Order), "TotalPrice", TargetKind.PropertyGet)] + public static Expression TotalPrice(Expression orderExpression) + { + Expression> e = + person => person.Quantity * person.Product.Price; + return e.BindParameters(orderExpression); + } + } + + #endregion + + [TestFixture] + public class CalculatedValueCachingTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Product).Assembly, typeof(Product).Namespace); + config.Types.Register(typeof(CustomLinqCompilerContainer)); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var apple = new Product (session) {Name = "Apple", Price = 2.0}; + var appleOrder = new Order (session) {Product = apple, Quantity = 1}; + // var banana = new Product {Name = "Banana", Price = 1.0}; + // var bananaOrder = new Order {Product = banana, Quantity = 2}; + + // First time calculation + CheckTotalPrice(appleOrder); + + using (session.OpenTransaction(TransactionOpenMode.New)) { + appleOrder.Quantity = 3; + apple.Price = 3; + // Automatic update + CheckTotalPrice(appleOrder); + // No transactionScope.Complete(), so here we get a rollback + } + + // Recovery after rollback + CheckTotalPrice(appleOrder); + + Console.WriteLine("Sleeping for 1 sec."); + Thread.Sleep(TimeSpan.FromSeconds(1.1)); + } + } + } + + private void CheckTotalPrice(Order order) + { + var totalPrice = order.TotalPrice; + + // Checking cached value + Assert.AreEqual(totalPrice, order.TotalPriceCached); + // Checking the value in LINQ query + Assert.AreEqual(totalPrice, + order.Session.Query.All() + .Where(o => o==order) + .Select(o => o.TotalPrice) + .Single()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Concurrency/LockingTest.cs b/Orm/Xtensive.Orm.Manual/Concurrency/LockingTest.cs index 8b2eed5f2a..43abcf5882 100644 --- a/Orm/Xtensive.Orm.Manual/Concurrency/LockingTest.cs +++ b/Orm/Xtensive.Orm.Manual/Concurrency/LockingTest.cs @@ -1,180 +1,180 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.11 - -using System; -using System.Linq; -using System.Threading; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Tests; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Manual.Concurrency.Locking -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Counter : Entity - { - [Key, Field] - public string Name { get; private set; } - - [Field] - public int Value { get; set; } - - public Counter(Session session, string name) - : base(session, name) - {} - } - - #endregion - - [TestFixture] - public class LockingTest - { - public enum LockingMode - { - None, - EntityLock, - QueryLock - } - - private const string LockingTestName = "LockingTest"; - private const int TestTime = 5000; - private Domain existingDomain; - private volatile LockingMode lockingMode; - private volatile IsolationLevel isolationLevel; - private long threadCount; - private Key counterKey; - - - [Test] - public void CombinedTest() - { - lockingMode = LockingMode.None; - isolationLevel = IsolationLevel.ReadCommitted; - Run("Counter isn't isolated."); - - isolationLevel = IsolationLevel.RepeatableRead; - Run("There are deadlocks or version conflicts, but counter is isolated."); - - lockingMode = LockingMode.EntityLock; - Run("Still can be a deadlock, since lock happen after read."); - - lockingMode = LockingMode.QueryLock; - Run("No deadlocks, counter isolation."); - } - - private void Run(string remark) - { - using (var session = GetDomain().OpenSession()) - using (var tx = session.OpenTransaction()) { - Counter counter; - if (counterKey==null) { - counter = new Counter(session, LockingTestName); - counterKey = counter.Key; - } - else - counter = session.Query.Single(counterKey); - counter.Value = 0; - tx.Complete(); - } - - Console.WriteLine("{0}, LockingMode={1}, IsolationLevel = {2}", LockingTestName, lockingMode, isolationLevel); - Console.WriteLine("{0}", remark); - ThreadPool.QueueUserWorkItem(TestThread, 500); - ThreadPool.QueueUserWorkItem(TestThread, 333); - WaitForCompletion(); - - using (var session = GetDomain().OpenSession()) - using (var tx = session.OpenTransaction()) { - var counter = session.Query.Single(counterKey); - Console.WriteLine("Final counter.Value = {0}", counter.Value); - tx.Complete(); - } - - Console.WriteLine(); - } - - private void TestThread(object state) - { - int delay = (int) state; - var startTime = DateTime.UtcNow; - var threadNumber = Interlocked.Increment(ref threadCount); - try { - string threadName = string.Format("Thread {0}", threadNumber).Indent(2 + (int) (threadNumber - 1) * 5); - using (var session = GetDomain().OpenSession()) { - while ((DateTime.UtcNow - startTime).TotalMilliseconds < TestTime) { - try { - Console.WriteLine("{0}: beginning of transaction", threadName); - using (var tx = session.OpenTransaction(isolationLevel)) { - Counter counter; - if (lockingMode!=LockingMode.QueryLock) { - Console.WriteLine("{0}: reading shared counter", threadName); - counter = session.Query.Single(counterKey); - if (lockingMode==LockingMode.EntityLock) { - Console.WriteLine("{0}: locking counter", threadName); - counter.Lock(LockMode.Exclusive, LockBehavior.Wait); - Console.WriteLine("{0}: counter is locked", threadName); - } - } - else { - Console.WriteLine("{0}: reading & locking shared counter", threadName); - counter = session.Query.All() - .Where(c => c.Key==counterKey) - .Lock(LockMode.Exclusive, LockBehavior.Wait) - .Single(); - } - Console.WriteLine("{0}: delay ({1}ms)", threadName, delay); - Thread.Sleep(delay); - Console.WriteLine("{0}: incrementing counter", threadName); - counter.Value++; - Console.WriteLine("{0}: counter.Value = {1}", threadName, counter.Value); - Console.WriteLine("{0}: committing transaction", threadName); - tx.Complete(); - } - Console.WriteLine("{0}: transaction is committed", threadName); - } - catch (Exception e) { - Console.WriteLine("{0}: error: {1}", - threadName, e.GetType().GetShortName()); - Console.WriteLine("{0}: transaction is rolled back", threadName); - } - } - } - } - finally { - Interlocked.Decrement(ref threadCount); - } - } - - private void WaitForCompletion() - { - Thread.Sleep(500); - while (Interlocked.Read(ref threadCount) > 0) - Thread.Sleep(100); - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Sessions.Add(new SessionConfiguration("Default") { - DefaultIsolationLevel = IsolationLevel.Serializable - }); - config.Types.Register(typeof (Counter).Assembly, typeof (Counter).Namespace); - var domain = Domain.Build(config); - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.11 + +using System; +using System.Linq; +using System.Threading; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Tests; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Manual.Concurrency.Locking +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Counter : Entity + { + [Key, Field] + public string Name { get; private set; } + + [Field] + public int Value { get; set; } + + public Counter(Session session, string name) + : base(session, name) + {} + } + + #endregion + + [TestFixture] + public class LockingTest + { + public enum LockingMode + { + None, + EntityLock, + QueryLock + } + + private const string LockingTestName = "LockingTest"; + private const int TestTime = 5000; + private Domain existingDomain; + private volatile LockingMode lockingMode; + private volatile IsolationLevel isolationLevel; + private long threadCount; + private Key counterKey; + + + [Test] + public void CombinedTest() + { + lockingMode = LockingMode.None; + isolationLevel = IsolationLevel.ReadCommitted; + Run("Counter isn't isolated."); + + isolationLevel = IsolationLevel.RepeatableRead; + Run("There are deadlocks or version conflicts, but counter is isolated."); + + lockingMode = LockingMode.EntityLock; + Run("Still can be a deadlock, since lock happen after read."); + + lockingMode = LockingMode.QueryLock; + Run("No deadlocks, counter isolation."); + } + + private void Run(string remark) + { + using (var session = GetDomain().OpenSession()) + using (var tx = session.OpenTransaction()) { + Counter counter; + if (counterKey==null) { + counter = new Counter(session, LockingTestName); + counterKey = counter.Key; + } + else + counter = session.Query.Single(counterKey); + counter.Value = 0; + tx.Complete(); + } + + Console.WriteLine("{0}, LockingMode={1}, IsolationLevel = {2}", LockingTestName, lockingMode, isolationLevel); + Console.WriteLine("{0}", remark); + ThreadPool.QueueUserWorkItem(TestThread, 500); + ThreadPool.QueueUserWorkItem(TestThread, 333); + WaitForCompletion(); + + using (var session = GetDomain().OpenSession()) + using (var tx = session.OpenTransaction()) { + var counter = session.Query.Single(counterKey); + Console.WriteLine("Final counter.Value = {0}", counter.Value); + tx.Complete(); + } + + Console.WriteLine(); + } + + private void TestThread(object state) + { + int delay = (int) state; + var startTime = DateTime.UtcNow; + var threadNumber = Interlocked.Increment(ref threadCount); + try { + string threadName = string.Format("Thread {0}", threadNumber).Indent(2 + (int) (threadNumber - 1) * 5); + using (var session = GetDomain().OpenSession()) { + while ((DateTime.UtcNow - startTime).TotalMilliseconds < TestTime) { + try { + Console.WriteLine("{0}: beginning of transaction", threadName); + using (var tx = session.OpenTransaction(isolationLevel)) { + Counter counter; + if (lockingMode!=LockingMode.QueryLock) { + Console.WriteLine("{0}: reading shared counter", threadName); + counter = session.Query.Single(counterKey); + if (lockingMode==LockingMode.EntityLock) { + Console.WriteLine("{0}: locking counter", threadName); + counter.Lock(LockMode.Exclusive, LockBehavior.Wait); + Console.WriteLine("{0}: counter is locked", threadName); + } + } + else { + Console.WriteLine("{0}: reading & locking shared counter", threadName); + counter = session.Query.All() + .Where(c => c.Key==counterKey) + .Lock(LockMode.Exclusive, LockBehavior.Wait) + .Single(); + } + Console.WriteLine("{0}: delay ({1}ms)", threadName, delay); + Thread.Sleep(delay); + Console.WriteLine("{0}: incrementing counter", threadName); + counter.Value++; + Console.WriteLine("{0}: counter.Value = {1}", threadName, counter.Value); + Console.WriteLine("{0}: committing transaction", threadName); + tx.Complete(); + } + Console.WriteLine("{0}: transaction is committed", threadName); + } + catch (Exception e) { + Console.WriteLine("{0}: error: {1}", + threadName, e.GetType().GetShortName()); + Console.WriteLine("{0}: transaction is rolled back", threadName); + } + } + } + } + finally { + Interlocked.Decrement(ref threadCount); + } + } + + private void WaitForCompletion() + { + Thread.Sleep(500); + while (Interlocked.Read(ref threadCount) > 0) + Thread.Sleep(100); + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Sessions.Add(new SessionConfiguration("Default") { + DefaultIsolationLevel = IsolationLevel.Serializable + }); + config.Types.Register(typeof (Counter).Assembly, typeof (Counter).Namespace); + var domain = Domain.Build(config); + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Concurrency/VersionsTest.cs b/Orm/Xtensive.Orm.Manual/Concurrency/VersionsTest.cs index 40a1dd9951..2d02b09def 100644 --- a/Orm/Xtensive.Orm.Manual/Concurrency/VersionsTest.cs +++ b/Orm/Xtensive.Orm.Manual/Concurrency/VersionsTest.cs @@ -1,305 +1,305 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.11 - -using System; -using System.Linq; -using System.Threading; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Model; -using Xtensive.Orm.Rse; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Manual.Concurrency.Versions -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field(Length = 200)] - public string SecondName { get; set; } - - [Field] - [Association(PairTo = "Friends")] - public EntitySet Friends { get; private set; } - - [Field] - public Company Company { get; set; } - - public string FullName { - get { - return string.Format("{0} {1}", Name, SecondName); - } - } - - public override string ToString() - { - return ToString(false); - } - - public string ToString(bool withFriends) - { - if (withFriends) - return string.Format("Person('{0}', Friends={1})", FullName, Friends.ToCommaDelimitedString()); - return string.Format("Person('{0}')", FullName); - } - - public Person(Session session, string fullName) - : base (session) - { - var pair = fullName.RevertibleSplitFirstAndTail('\\', ','); - SecondName = pair.First.Trim(); - Name = pair.Second.Trim(); - } - } - - [Serializable] - [HierarchyRoot] - public class Company : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field, Version] - // If HandleVersionInfoUpdate() isn't implemented, default implementation - // (relying on VersionGenerator.GenerateNextVersion(...) method) is used. - public int Version { get; private set; } - - [Field] - [Association(PairTo = "Company")] - // By default any EntitySet change also leads to Version change - public EntitySet Employees { get; private set; } - - public override string ToString() - { - return ToString(true); - } - - public string ToString(bool withPersons) - { - if (withPersons) - return string.Format("Company('{0}', Employees: {1})", Name, Employees.ToCommaDelimitedString()); - return string.Format("Company('{0}')", Name); - } - - public Company(Session session, string name) - : base (session) - { - Name = name; - } - } - - #endregion - - [TestFixture] - public class VersionsTest - { - private Domain existingDomain; - - [Test] - public void CombinedTest() - { - var domain = GetDomain(); - - using (var session = domain.OpenSession()) { - Person alex; - VersionInfo alexVersion; - Person dmitri; - VersionInfo dmitriVersion; - Company xtensive; - VersionInfo xtensiveVersion; - using (var tx = session.OpenTransaction()) { - alex = new Person(session, "Yakunin, Alex"); - alexVersion = alex.VersionInfo; - Dump(alex); - dmitri = new Person(session, "Maximov, Dmitri"); - dmitriVersion = dmitri.VersionInfo; - Dump(dmitri); - - alex.Friends.Add(dmitri); - // Automatically provided versions won't change because of change in EntitySet! - Assert.AreEqual(alexVersion, alex.VersionInfo); - Assert.AreEqual(dmitriVersion, dmitri.VersionInfo); - - xtensive = new Company (session, "X-tensive.com"); - xtensiveVersion = xtensive.VersionInfo; - Dump(xtensive); - tx.Complete(); - } - - using (var tx = session.OpenTransaction()) { - string newName = "Xtensive"; - Console.WriteLine("Changing {0} name to {1}", xtensive.Name, newName); - xtensive.Name = newName; - Dump(xtensive); - Assert.AreNotEqual(xtensiveVersion, xtensive.VersionInfo); // company version changed - xtensiveVersion = xtensive.VersionInfo; - - Console.WriteLine("Xtensive.Employees.Add(Alex)"); - xtensive.Employees.Add(alex); - Dump(xtensive); - Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); // company version already updated in current transaction - Assert.AreNotEqual(alexVersion, alex.VersionInfo); - xtensiveVersion = xtensive.VersionInfo; - alexVersion = alex.VersionInfo; - tx.Complete(); - } - - int xtensiveVersionFieldValue; - using (var tx = session.OpenTransaction()) { - Console.WriteLine("Dmitri.Company = Xtensive"); - dmitri.Company = xtensive; - Dump(xtensive); - Assert.AreNotEqual(xtensiveVersion, xtensive.VersionInfo); - Assert.AreNotEqual(dmitriVersion, dmitri.VersionInfo); - xtensiveVersion = xtensive.VersionInfo; - dmitriVersion = dmitri.VersionInfo; - - Console.WriteLine("Transaction rollback test, before:"); - Dump(xtensive); - xtensiveVersionFieldValue = xtensive.Version; - tx.Complete(); - } - - using (var tx = session.OpenTransaction()) { - xtensive.Employees.Remove(alex); - // Xtensive version is changed - var newXtensiveVersionInsideTransaction = xtensive.VersionInfo; - Assert.AreNotEqual(xtensiveVersion, newXtensiveVersionInsideTransaction); - Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version - 1); // Incremented - // Alex version is changed - Assert.AreNotEqual(alexVersion, alex.VersionInfo); - - xtensive.Employees.Remove(dmitri); - // Xtensive version is NOT changed, since we try to update each version - // just once per transaction - Assert.AreEqual(newXtensiveVersionInsideTransaction, xtensive.VersionInfo); - Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version - 1); // No increment now - // Dmitri's version is changed - Assert.AreNotEqual(dmitriVersion, dmitri.VersionInfo); - - Console.WriteLine("Transaction rollback test, inside:"); - Dump(xtensive); - // tx.Complete(); // Rollback! - } - - Console.WriteLine("Transaction rollback test, after:"); - - using (var tx = session.OpenTransaction()) { - Dump(xtensive); - - // Let's check if everything is rolled back - Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); - Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version); - Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); - Assert.AreEqual(dmitriVersion, dmitri.VersionInfo); - } - } - } - - [Test] - public void VersionValidatorTest() - { - var domain = GetDomain(); - - using (var session = domain.OpenSession()) - using (var scope = session.Activate()) { - var versions = new VersionSet(); - - Person alex; - Person dmitri; - using (var tx = session.OpenTransaction()) { - alex = new Person(session, "Yakunin, Alex"); - dmitri = new Person(session, "Maximov, Dmitri"); - tx.Complete(); - } - - using (VersionCapturer.Attach(session, versions)) - using (var tx = session.OpenTransaction()) { - // Simulating entity displaying @ web page - // By default this leads to their addition to VersionSet - Dump(alex); - Dump(dmitri); - tx.Complete(); - } - - // Let's clone VersionSet (actually - serialize & deserialize) - versions = Cloner.Clone(versions); - // And dump it - Dump(versions); - - using (VersionValidator.Attach(session, versions)) - using (var tx = session.OpenTransaction()) { - alex.Name = "Edited Alex"; // Passes - alex.Name = "Edited again"; // Passes, because this is not the very first modification - tx.Complete(); - } - - AssertEx.Throws(() => { - using (VersionValidator.Attach(session, versions)) - using (var tx = session.OpenTransaction()) { - alex.Name = "And again"; - tx.Complete(); - } // Version check fails on Session.Persist() here - }); - - using (var tx = session.OpenTransaction()) - versions.Add(alex, true); // Overwriting versions - Dump(versions); - - using (VersionValidator.Attach(session, versions)) - using (var tx = session.OpenTransaction()) { - alex.Name = "Edited again"; // Passes now - tx.Complete(); - } - } - } - - private void Dump(Entity entity) - { - Console.WriteLine("Entity: {0}", entity); - Console.WriteLine(" Key: {0}", entity.Key); - Console.WriteLine(" VersionInfo: {0}", entity.VersionInfo); - Console.WriteLine(); - } - - private void Dump(VersionSet versions) - { - Console.WriteLine("VersionSet: \r\n{0}", - versions - .Select(pair => new Pair(pair.Key, pair.Value)) - .ToDelimitedString("\r\n") - .Indent(2, true) - ); - Console.WriteLine(); - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - var domain = Domain.Build(config); - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.11 + +using System; +using System.Linq; +using System.Threading; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Model; +using Xtensive.Orm.Rse; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Manual.Concurrency.Versions +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field(Length = 200)] + public string SecondName { get; set; } + + [Field] + [Association(PairTo = "Friends")] + public EntitySet Friends { get; private set; } + + [Field] + public Company Company { get; set; } + + public string FullName { + get { + return string.Format("{0} {1}", Name, SecondName); + } + } + + public override string ToString() + { + return ToString(false); + } + + public string ToString(bool withFriends) + { + if (withFriends) + return string.Format("Person('{0}', Friends={1})", FullName, Friends.ToCommaDelimitedString()); + return string.Format("Person('{0}')", FullName); + } + + public Person(Session session, string fullName) + : base (session) + { + var pair = fullName.RevertibleSplitFirstAndTail('\\', ','); + SecondName = pair.First.Trim(); + Name = pair.Second.Trim(); + } + } + + [Serializable] + [HierarchyRoot] + public class Company : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field, Version] + // If HandleVersionInfoUpdate() isn't implemented, default implementation + // (relying on VersionGenerator.GenerateNextVersion(...) method) is used. + public int Version { get; private set; } + + [Field] + [Association(PairTo = "Company")] + // By default any EntitySet change also leads to Version change + public EntitySet Employees { get; private set; } + + public override string ToString() + { + return ToString(true); + } + + public string ToString(bool withPersons) + { + if (withPersons) + return string.Format("Company('{0}', Employees: {1})", Name, Employees.ToCommaDelimitedString()); + return string.Format("Company('{0}')", Name); + } + + public Company(Session session, string name) + : base (session) + { + Name = name; + } + } + + #endregion + + [TestFixture] + public class VersionsTest + { + private Domain existingDomain; + + [Test] + public void CombinedTest() + { + var domain = GetDomain(); + + using (var session = domain.OpenSession()) { + Person alex; + VersionInfo alexVersion; + Person dmitri; + VersionInfo dmitriVersion; + Company xtensive; + VersionInfo xtensiveVersion; + using (var tx = session.OpenTransaction()) { + alex = new Person(session, "Yakunin, Alex"); + alexVersion = alex.VersionInfo; + Dump(alex); + dmitri = new Person(session, "Maximov, Dmitri"); + dmitriVersion = dmitri.VersionInfo; + Dump(dmitri); + + alex.Friends.Add(dmitri); + // Automatically provided versions won't change because of change in EntitySet! + Assert.AreEqual(alexVersion, alex.VersionInfo); + Assert.AreEqual(dmitriVersion, dmitri.VersionInfo); + + xtensive = new Company (session, "X-tensive.com"); + xtensiveVersion = xtensive.VersionInfo; + Dump(xtensive); + tx.Complete(); + } + + using (var tx = session.OpenTransaction()) { + string newName = "Xtensive"; + Console.WriteLine("Changing {0} name to {1}", xtensive.Name, newName); + xtensive.Name = newName; + Dump(xtensive); + Assert.AreNotEqual(xtensiveVersion, xtensive.VersionInfo); // company version changed + xtensiveVersion = xtensive.VersionInfo; + + Console.WriteLine("Xtensive.Employees.Add(Alex)"); + xtensive.Employees.Add(alex); + Dump(xtensive); + Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); // company version already updated in current transaction + Assert.AreNotEqual(alexVersion, alex.VersionInfo); + xtensiveVersion = xtensive.VersionInfo; + alexVersion = alex.VersionInfo; + tx.Complete(); + } + + int xtensiveVersionFieldValue; + using (var tx = session.OpenTransaction()) { + Console.WriteLine("Dmitri.Company = Xtensive"); + dmitri.Company = xtensive; + Dump(xtensive); + Assert.AreNotEqual(xtensiveVersion, xtensive.VersionInfo); + Assert.AreNotEqual(dmitriVersion, dmitri.VersionInfo); + xtensiveVersion = xtensive.VersionInfo; + dmitriVersion = dmitri.VersionInfo; + + Console.WriteLine("Transaction rollback test, before:"); + Dump(xtensive); + xtensiveVersionFieldValue = xtensive.Version; + tx.Complete(); + } + + using (var tx = session.OpenTransaction()) { + xtensive.Employees.Remove(alex); + // Xtensive version is changed + var newXtensiveVersionInsideTransaction = xtensive.VersionInfo; + Assert.AreNotEqual(xtensiveVersion, newXtensiveVersionInsideTransaction); + Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version - 1); // Incremented + // Alex version is changed + Assert.AreNotEqual(alexVersion, alex.VersionInfo); + + xtensive.Employees.Remove(dmitri); + // Xtensive version is NOT changed, since we try to update each version + // just once per transaction + Assert.AreEqual(newXtensiveVersionInsideTransaction, xtensive.VersionInfo); + Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version - 1); // No increment now + // Dmitri's version is changed + Assert.AreNotEqual(dmitriVersion, dmitri.VersionInfo); + + Console.WriteLine("Transaction rollback test, inside:"); + Dump(xtensive); + // tx.Complete(); // Rollback! + } + + Console.WriteLine("Transaction rollback test, after:"); + + using (var tx = session.OpenTransaction()) { + Dump(xtensive); + + // Let's check if everything is rolled back + Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); + Assert.AreEqual(xtensiveVersionFieldValue, xtensive.Version); + Assert.AreEqual(xtensiveVersion, xtensive.VersionInfo); + Assert.AreEqual(dmitriVersion, dmitri.VersionInfo); + } + } + } + + [Test] + public void VersionValidatorTest() + { + var domain = GetDomain(); + + using (var session = domain.OpenSession()) + using (var scope = session.Activate()) { + var versions = new VersionSet(); + + Person alex; + Person dmitri; + using (var tx = session.OpenTransaction()) { + alex = new Person(session, "Yakunin, Alex"); + dmitri = new Person(session, "Maximov, Dmitri"); + tx.Complete(); + } + + using (VersionCapturer.Attach(session, versions)) + using (var tx = session.OpenTransaction()) { + // Simulating entity displaying @ web page + // By default this leads to their addition to VersionSet + Dump(alex); + Dump(dmitri); + tx.Complete(); + } + + // Let's clone VersionSet (actually - serialize & deserialize) + versions = Cloner.Clone(versions); + // And dump it + Dump(versions); + + using (VersionValidator.Attach(session, versions)) + using (var tx = session.OpenTransaction()) { + alex.Name = "Edited Alex"; // Passes + alex.Name = "Edited again"; // Passes, because this is not the very first modification + tx.Complete(); + } + + AssertEx.Throws(() => { + using (VersionValidator.Attach(session, versions)) + using (var tx = session.OpenTransaction()) { + alex.Name = "And again"; + tx.Complete(); + } // Version check fails on Session.Persist() here + }); + + using (var tx = session.OpenTransaction()) + versions.Add(alex, true); // Overwriting versions + Dump(versions); + + using (VersionValidator.Attach(session, versions)) + using (var tx = session.OpenTransaction()) { + alex.Name = "Edited again"; // Passes now + tx.Complete(); + } + } + } + + private void Dump(Entity entity) + { + Console.WriteLine("Entity: {0}", entity); + Console.WriteLine(" Key: {0}", entity.Key); + Console.WriteLine(" VersionInfo: {0}", entity.VersionInfo); + Console.WriteLine(); + } + + private void Dump(VersionSet versions) + { + Console.WriteLine("VersionSet: \r\n{0}", + versions + .Select(pair => new Pair(pair.Key, pair.Value)) + .ToDelimitedString("\r\n") + .Indent(2, true) + ); + Console.WriteLine(); + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + var domain = Domain.Build(config); + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/DomainAndSession/DomainAndSessionSample.cs b/Orm/Xtensive.Orm.Manual/DomainAndSession/DomainAndSessionSample.cs index 7968ba4f96..82c4bb51cb 100644 --- a/Orm/Xtensive.Orm.Manual/DomainAndSession/DomainAndSessionSample.cs +++ b/Orm/Xtensive.Orm.Manual/DomainAndSession/DomainAndSessionSample.cs @@ -1,213 +1,213 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.17 - -using System; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.DomainAndSession -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - // Providing session explicitly - public Person(Session session) - : base(session) - {} - - // Active session is required - public Person() - {} - } - - #endregion - - [TestFixture] - public class DomainAndSessionSample : HasConfigurationAccessTest - { - #region Connection URL examples - - public const string SqlServerUrl1 = @"sqlserver://localhost/MyDatabase"; - public const string SqlServerUrl2 = @"sqlserver://dbServer\MSSQL2008/Production"; - public const string OracleUrl1 = @"oracle://user:password@localhost/MyDatabase"; - public const string OracleUrl2 = @"oracle://user:password@dbServer:5511/MyDatabase"; - public const string PostrgeSqlUrl1 = @"postgresql://user:password@127.0.0.1:8032/MyDatabase?Encoding=Unicode"; - public const string PostrgeSqlUrl2 = @"postgresql://user:password@dbServer/MyDatabase?Pooling=on&MinPoolSize=1&MaxPoolSize=5"; - public const string InMemoryUrl = @"memory://localhost/MyDatabase"; - - #endregion - - [Test] - public void OpenSessionTest() - { - #region Domain sample - - // Creating new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var person = new Person(session); - person.Name = "Barack Obama"; - - transactionScope.Complete(); - } - } - - #endregion - } - - [Test] - public void ConnectionStringTest() - { - #region Connection string sample - - // Creating new Domain configuration - var config = DomainConfigurationFactory.CreateForConnectionStringTest(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - #endregion - } - - [Test] - [Explicit("Needs MS SQL 2016 to be installed locally and also be available by localhost")] - public void ConnectionStringInAppConfigTest() - { - #region Connection string in App.config sample - - // Creating new Domain configuration - var config = LoadDomainConfiguration("mssql2016cs"); - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - #endregion - } - - [Test] - public void CurrentSessionTest() - { - #region Session sample - - // Creating new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - int personId; - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - personId = new Person(session).Id; - - transactionScope.Complete(); - } - } - - // Opens the session with default configuration - ServerProfile. Auto actiovation option is disabled. - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - // you need to provide session explicitly - var newPerson = new Person(session); - var fetchedPerson = session.Query.Single(personId); - - Console.WriteLine("Current session is null: {0}", Session.Current==null); - Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session==session); - Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session==session); - - transactionScope.Complete(); - } - } - - // New session configuration with actiovation option enabled. - var sessionConfiguration = new SessionConfiguration(SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges); - using (var session = domain.OpenSession(sessionConfiguration)) { - using (var transactionScope = session.OpenTransaction()) { - - // you don't need to provide session explicitly. Active session will be used instead. - var newPerson = new Person(); - var fetchedPerson = session.Query.Single(personId); - - Console.WriteLine("Our session is current: {0}", Session.Current==session); - Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session==session); - Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session==session); - - transactionScope.Complete(); - } - } - - #endregion - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var person = new Person(session); - person.Name = "Barack Obama"; - - transactionScope.Complete(); - } - } - } - - [Test] - public void SessionConfigurationTest() - { - // Creating new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - // First named Session configuration - var sessionCongfigOne = new SessionConfiguration { - BatchSize = 25, - DefaultIsolationLevel = IsolationLevel.RepeatableRead, - CacheSize = 16384, - Options = SessionOptions.ServerProfile - }; - - // Second named Session configuration - var sessionConfigTwo = config.Sessions["TestSession"]; - - Assert.AreEqual(sessionConfigTwo.BatchSize, sessionCongfigOne.BatchSize); - Assert.AreEqual(sessionConfigTwo.DefaultIsolationLevel, sessionCongfigOne.DefaultIsolationLevel); - Assert.AreEqual(sessionConfigTwo.CacheSize, sessionCongfigOne.CacheSize); - Assert.AreEqual(sessionConfigTwo.Options, sessionCongfigOne.Options); - - using (domain.OpenSession(sessionConfigTwo)) { - // ... - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.17 + +using System; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.DomainAndSession +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + // Providing session explicitly + public Person(Session session) + : base(session) + {} + + // Active session is required + public Person() + {} + } + + #endregion + + [TestFixture] + public class DomainAndSessionSample : HasConfigurationAccessTest + { + #region Connection URL examples + + public const string SqlServerUrl1 = @"sqlserver://localhost/MyDatabase"; + public const string SqlServerUrl2 = @"sqlserver://dbServer\MSSQL2008/Production"; + public const string OracleUrl1 = @"oracle://user:password@localhost/MyDatabase"; + public const string OracleUrl2 = @"oracle://user:password@dbServer:5511/MyDatabase"; + public const string PostrgeSqlUrl1 = @"postgresql://user:password@127.0.0.1:8032/MyDatabase?Encoding=Unicode"; + public const string PostrgeSqlUrl2 = @"postgresql://user:password@dbServer/MyDatabase?Pooling=on&MinPoolSize=1&MaxPoolSize=5"; + public const string InMemoryUrl = @"memory://localhost/MyDatabase"; + + #endregion + + [Test] + public void OpenSessionTest() + { + #region Domain sample + + // Creating new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var person = new Person(session); + person.Name = "Barack Obama"; + + transactionScope.Complete(); + } + } + + #endregion + } + + [Test] + public void ConnectionStringTest() + { + #region Connection string sample + + // Creating new Domain configuration + var config = DomainConfigurationFactory.CreateForConnectionStringTest(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + #endregion + } + + [Test] + [Explicit("Needs MS SQL 2016 to be installed locally and also be available by localhost")] + public void ConnectionStringInAppConfigTest() + { + #region Connection string in App.config sample + + // Creating new Domain configuration + var config = LoadDomainConfiguration("mssql2016cs"); + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + #endregion + } + + [Test] + public void CurrentSessionTest() + { + #region Session sample + + // Creating new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + int personId; + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + personId = new Person(session).Id; + + transactionScope.Complete(); + } + } + + // Opens the session with default configuration - ServerProfile. Auto actiovation option is disabled. + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + // you need to provide session explicitly + var newPerson = new Person(session); + var fetchedPerson = session.Query.Single(personId); + + Console.WriteLine("Current session is null: {0}", Session.Current==null); + Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session==session); + Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session==session); + + transactionScope.Complete(); + } + } + + // New session configuration with actiovation option enabled. + var sessionConfiguration = new SessionConfiguration(SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges); + using (var session = domain.OpenSession(sessionConfiguration)) { + using (var transactionScope = session.OpenTransaction()) { + + // you don't need to provide session explicitly. Active session will be used instead. + var newPerson = new Person(); + var fetchedPerson = session.Query.Single(personId); + + Console.WriteLine("Our session is current: {0}", Session.Current==session); + Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session==session); + Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session==session); + + transactionScope.Complete(); + } + } + + #endregion + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var person = new Person(session); + person.Name = "Barack Obama"; + + transactionScope.Complete(); + } + } + } + + [Test] + public void SessionConfigurationTest() + { + // Creating new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Person).Assembly, typeof(Person).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + // First named Session configuration + var sessionCongfigOne = new SessionConfiguration { + BatchSize = 25, + DefaultIsolationLevel = IsolationLevel.RepeatableRead, + CacheSize = 16384, + Options = SessionOptions.ServerProfile + }; + + // Second named Session configuration + var sessionConfigTwo = config.Sessions["TestSession"]; + + Assert.AreEqual(sessionConfigTwo.BatchSize, sessionCongfigOne.BatchSize); + Assert.AreEqual(sessionConfigTwo.DefaultIsolationLevel, sessionCongfigOne.DefaultIsolationLevel); + Assert.AreEqual(sessionConfigTwo.CacheSize, sessionCongfigOne.CacheSize); + Assert.AreEqual(sessionConfigTwo.Options, sessionCongfigOne.Options); + + using (domain.OpenSession(sessionConfigTwo)) { + // ... + } + } + } +} diff --git a/Orm/Xtensive.Orm.Manual/Entities/TestFixture.cs b/Orm/Xtensive.Orm.Manual/Entities/TestFixture.cs index ef54b508d4..c9644a0f28 100644 --- a/Orm/Xtensive.Orm.Manual/Entities/TestFixture.cs +++ b/Orm/Xtensive.Orm.Manual/Entities/TestFixture.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.25 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Entities -{ - [TestFixture] - public class TestFixture - { - [Serializable] - [HierarchyRoot] - public abstract class Document : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - public int Number { get; set; } - } - - [Serializable] - public class Order : Document - { - [Field] - public Product Product { get; set; } - - [Field] - public UnitOfMeasure UnitOfMeasure { get; set; } - - [Field] - public double Amount { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Product : Entity - { - [Key, Field(Length = 100)] - public Guid Code { get; private set; } - - [Field(Length = 100)] - public string Name { get; set; } - - public Product(string code) : base(code) { } - } - - public enum UnitOfMeasure { Barrels, Tons, Liters } - - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Product)); -// config.Types.Register(typeof(Document).Assembly, typeof(Document).Namespace); - Domain.Build(config); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.25 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Entities +{ + [TestFixture] + public class TestFixture + { + [Serializable] + [HierarchyRoot] + public abstract class Document : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + public int Number { get; set; } + } + + [Serializable] + public class Order : Document + { + [Field] + public Product Product { get; set; } + + [Field] + public UnitOfMeasure UnitOfMeasure { get; set; } + + [Field] + public double Amount { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Product : Entity + { + [Key, Field(Length = 100)] + public Guid Code { get; private set; } + + [Field(Length = 100)] + public string Name { get; set; } + + public Product(string code) : base(code) { } + } + + public enum UnitOfMeasure { Barrels, Tons, Liters } + + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Product)); +// config.Types.Register(typeof(Document).Assembly, typeof(Document).Namespace); + Domain.Build(config); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/EntitySets/EntitySetsTest.cs b/Orm/Xtensive.Orm.Manual/EntitySets/EntitySetsTest.cs index fb96e63493..46f0be3632 100644 --- a/Orm/Xtensive.Orm.Manual/EntitySets/EntitySetsTest.cs +++ b/Orm/Xtensive.Orm.Manual/EntitySets/EntitySetsTest.cs @@ -1,229 +1,229 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.29 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.EntitySets -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class User : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Account Account { get; set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public EntitySet FavoritePages { get; private set; } - - [Field] - [Association( - OnOwnerRemove = OnRemoveAction.Cascade, - OnTargetRemove = OnRemoveAction.Clear)] - public WebPage PersonalPage { get; set; } - - [Field] - [Association(PairTo = "Author")] - public EntitySet BlogPosts { get; private set; } - - [Field] - [Association(PairTo = "Friends")] - public EntitySet Friends { get; private set; } - - [Field] - [Association(PairTo = "Participants")] - public EntitySet Meetings { get; private set; } - - public User(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class WebPage : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Title { get; set; } - - [Field(Length = 200)] - public string Url { get; set; } - - public WebPage(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class BlogPost : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Title { get; set; } - - [Field(Length = 1000)] - public string Content { get; set; } - - [Field] - public User Author { get; set;} - - public BlogPost(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Meeting : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public DateTime Date { get; set; } - - [Field(Length = 100)] - public string Description { get; set; } - - [Field] - public EntitySet Participants { get; private set; } - - public Meeting(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Account : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, Association(PairTo = "Account", - OnOwnerRemove = OnRemoveAction.Deny, - OnTargetRemove = OnRemoveAction.Cascade)] - public User User { get; set; } - - public Account(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class EntitySetsTest - { - [Test] - public void OneToManyTest() - { - var domain = BuildDomain(); - - using (var session = domain.OpenSession()) - using (session.OpenTransaction()) { - var user = new User(session); - - var firstPost = new BlogPost(session) {Title = "First post"}; - user.BlogPosts.Add(firstPost); - - Assert.AreEqual(user, firstPost.Author); - - var secondPost = new BlogPost(session) {Title = "Second post"}; - secondPost.Author = user; - - Assert.IsTrue(user.BlogPosts.Contains(secondPost)); - - user.BlogPosts.Remove(secondPost); - - Assert.IsNull(secondPost.Author); - } - } - - [Test] - public void OneToOneTest() - { - var domain = BuildDomain(); - using (var session = domain.OpenSession()) - using (session.OpenTransaction()) { - var user = new User(session); - var account = new Account(session); - user.Account = account; - - Assert.AreEqual(user, account.User); - - user.Account = null; - Assert.IsNull(account.User); - - account.User = user; - Assert.AreEqual(user, account.User); - - AssertEx.Throws(account.Remove); - - user.Remove(); - Assert.IsTrue(account.IsRemoved); - } - } - - [Test] - public void EntitySetTest() - { - var domain = BuildDomain(); - using (var session = domain.OpenSession()) - using (session.OpenTransaction()) { - var user = new User(session) {Name = "Alex"}; - - var xtensive = new WebPage(session) {Title = "Xtensive company", Url = "http://www.x-tensive.com"}; - var dataobjects = new WebPage(session) {Title = "DataObjects.Net", Url = "http://www.dataobjects.net"}; - - user.FavoritePages.Add(xtensive); - user.FavoritePages.Add(dataobjects); - - foreach (var page in user.FavoritePages) - Console.WriteLine("{0} ( {1} )", page.Title, page.Url); - - Assert.AreEqual(2, user.FavoritePages.Count); - Assert.AreEqual(1, SelectPages(user).Count()); - - user.FavoritePages.Add(xtensive); - Assert.AreEqual(2, user.FavoritePages.Count); - } - } - - private IEnumerable SelectPages(User user) - { - return - from page in user.FavoritePages - where page.Url.StartsWith("http://www.x-tensive.com") - select page.Title; - } - - private Domain BuildDomain() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); - return Domain.Build(config); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.29 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.EntitySets +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class User : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Account Account { get; set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public EntitySet FavoritePages { get; private set; } + + [Field] + [Association( + OnOwnerRemove = OnRemoveAction.Cascade, + OnTargetRemove = OnRemoveAction.Clear)] + public WebPage PersonalPage { get; set; } + + [Field] + [Association(PairTo = "Author")] + public EntitySet BlogPosts { get; private set; } + + [Field] + [Association(PairTo = "Friends")] + public EntitySet Friends { get; private set; } + + [Field] + [Association(PairTo = "Participants")] + public EntitySet Meetings { get; private set; } + + public User(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class WebPage : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Title { get; set; } + + [Field(Length = 200)] + public string Url { get; set; } + + public WebPage(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class BlogPost : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Title { get; set; } + + [Field(Length = 1000)] + public string Content { get; set; } + + [Field] + public User Author { get; set;} + + public BlogPost(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Meeting : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public DateTime Date { get; set; } + + [Field(Length = 100)] + public string Description { get; set; } + + [Field] + public EntitySet Participants { get; private set; } + + public Meeting(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Account : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, Association(PairTo = "Account", + OnOwnerRemove = OnRemoveAction.Deny, + OnTargetRemove = OnRemoveAction.Cascade)] + public User User { get; set; } + + public Account(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class EntitySetsTest + { + [Test] + public void OneToManyTest() + { + var domain = BuildDomain(); + + using (var session = domain.OpenSession()) + using (session.OpenTransaction()) { + var user = new User(session); + + var firstPost = new BlogPost(session) {Title = "First post"}; + user.BlogPosts.Add(firstPost); + + Assert.AreEqual(user, firstPost.Author); + + var secondPost = new BlogPost(session) {Title = "Second post"}; + secondPost.Author = user; + + Assert.IsTrue(user.BlogPosts.Contains(secondPost)); + + user.BlogPosts.Remove(secondPost); + + Assert.IsNull(secondPost.Author); + } + } + + [Test] + public void OneToOneTest() + { + var domain = BuildDomain(); + using (var session = domain.OpenSession()) + using (session.OpenTransaction()) { + var user = new User(session); + var account = new Account(session); + user.Account = account; + + Assert.AreEqual(user, account.User); + + user.Account = null; + Assert.IsNull(account.User); + + account.User = user; + Assert.AreEqual(user, account.User); + + AssertEx.Throws(account.Remove); + + user.Remove(); + Assert.IsTrue(account.IsRemoved); + } + } + + [Test] + public void EntitySetTest() + { + var domain = BuildDomain(); + using (var session = domain.OpenSession()) + using (session.OpenTransaction()) { + var user = new User(session) {Name = "Alex"}; + + var xtensive = new WebPage(session) {Title = "Xtensive company", Url = "http://www.x-tensive.com"}; + var dataobjects = new WebPage(session) {Title = "DataObjects.Net", Url = "http://www.dataobjects.net"}; + + user.FavoritePages.Add(xtensive); + user.FavoritePages.Add(dataobjects); + + foreach (var page in user.FavoritePages) + Console.WriteLine("{0} ( {1} )", page.Title, page.Url); + + Assert.AreEqual(2, user.FavoritePages.Count); + Assert.AreEqual(1, SelectPages(user).Count()); + + user.FavoritePages.Add(xtensive); + Assert.AreEqual(2, user.FavoritePages.Count); + } + } + + private IEnumerable SelectPages(User user) + { + return + from page in user.FavoritePages + where page.Url.StartsWith("http://www.x-tensive.com") + select page.Title; + } + + private Domain BuildDomain() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); + return Domain.Build(config); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueries.sql b/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueries.sql index 810f00a0c4..d8f59f7534 100644 --- a/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueries.sql +++ b/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueries.sql @@ -1,32 +1,32 @@ --- Batch 1 -exec sp_executesql N' -INSERT INTO [dbo].[Person] ([Id], [Name], [BirthDay], [Manager.Id]) -VALUES (@p1_0, @p1_1, @p1_2, @p1_3); - -INSERT INTO [dbo].[Person] ([Id], [Name], [BirthDay], [Manager.Id]) -VALUES (@p2_0, @p2_1, @p2_2, @p2_3); - -SELECT COUNT_BIG(*) AS [column] -FROM ( - SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] - FROM [dbo].[Person] [a] - WHERE ([a].[Manager.Id] IS NOT NULL)) [b]; - -SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] -FROM [dbo].[Person] [a] -WHERE ((SELECT COUNT_BIG(*) FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] - FROM [dbo].[Person] [b] - WHERE ([b].[Manager.Id] = [a].[Id])) [c]) <> 0); - -SELECT [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] -FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] - FROM [dbo].[Person] [b]) [a] -ORDER BY [a].[Name] ASC; - -',N' -@p1_0 int,@p1_1 nvarchar(7),@p1_2 datetime,@p1_3 int, -@p2_0 int,@p2_1 nvarchar(8),@p2_2 datetime,@p2_3 int', -@p1_0=2,@p1_1=N'Manager',@p1_2='1753-01-01 00:00:00:000',@p1_3=NULL, -@p2_0=1,@p2_1=N'Employee',@p2_2='1753-01-01 00:00:00:000',@p2_3=2 +-- Batch 1 +exec sp_executesql N' +INSERT INTO [dbo].[Person] ([Id], [Name], [BirthDay], [Manager.Id]) +VALUES (@p1_0, @p1_1, @p1_2, @p1_3); + +INSERT INTO [dbo].[Person] ([Id], [Name], [BirthDay], [Manager.Id]) +VALUES (@p2_0, @p2_1, @p2_2, @p2_3); + +SELECT COUNT_BIG(*) AS [column] +FROM ( + SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] + FROM [dbo].[Person] [a] + WHERE ([a].[Manager.Id] IS NOT NULL)) [b]; + +SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] +FROM [dbo].[Person] [a] +WHERE ((SELECT COUNT_BIG(*) FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] + FROM [dbo].[Person] [b] + WHERE ([b].[Manager.Id] = [a].[Id])) [c]) <> 0); + +SELECT [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] +FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] + FROM [dbo].[Person] [b]) [a] +ORDER BY [a].[Name] ASC; + +',N' +@p1_0 int,@p1_1 nvarchar(7),@p1_2 datetime,@p1_3 int, +@p2_0 int,@p2_1 nvarchar(8),@p2_2 datetime,@p2_3 int', +@p1_0=2,@p1_1=N'Manager',@p1_2='1753-01-01 00:00:00:000',@p1_3=NULL, +@p2_0=1,@p2_1=N'Employee',@p2_2='1753-01-01 00:00:00:000',@p2_3=2 diff --git a/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueriesTest.cs b/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueriesTest.cs index 68b6911395..063ec261f4 100644 --- a/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueriesTest.cs +++ b/Orm/Xtensive.Orm.Manual/FutureQueries/FutureQueriesTest.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.31 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.FutureQueries -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public DateTime BirthDay { get; set; } - - [Field] - public Person Manager { get; set; } - - [Field] - [Association(PairTo = "Manager")] - public EntitySet Employees { get; private set; } - - public override string ToString() - { - return Name; - } - - public Person(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class FutureQueriesTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var employee = new Person(session) {Name = "Employee"}; - var manager = new Person(session) {Name = "Manager"}; - manager.Employees.Add(employee); - - var simpleCompiledQuery = session.Query.Execute(qe => - from person in qe.All() - orderby person.Name - select person - ); - var managedPersonCount = session.Query.ExecuteDelayed(qe => ( - from person in qe.All() - where person.Manager!=null - select person - ).Count()); - var personsWithEmployees = session.Query.ExecuteDelayed(qe => - from person in session.Query.All() - where person.Employees.Count!=0 - select person - ); - - Console.WriteLine("All persons: {0}", - simpleCompiledQuery.ToCommaDelimitedString()); - Console.WriteLine("Managed person count: {0}", - managedPersonCount.Value); - Console.WriteLine("Person with employees: {0}", - personsWithEmployees.ToCommaDelimitedString()); - - transactionScope.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.31 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.FutureQueries +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public DateTime BirthDay { get; set; } + + [Field] + public Person Manager { get; set; } + + [Field] + [Association(PairTo = "Manager")] + public EntitySet Employees { get; private set; } + + public override string ToString() + { + return Name; + } + + public Person(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class FutureQueriesTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var employee = new Person(session) {Name = "Employee"}; + var manager = new Person(session) {Name = "Manager"}; + manager.Employees.Add(employee); + + var simpleCompiledQuery = session.Query.Execute(qe => + from person in qe.All() + orderby person.Name + select person + ); + var managedPersonCount = session.Query.ExecuteDelayed(qe => ( + from person in qe.All() + where person.Manager!=null + select person + ).Count()); + var personsWithEmployees = session.Query.ExecuteDelayed(qe => + from person in session.Query.All() + where person.Employees.Count!=0 + select person + ); + + Console.WriteLine("All persons: {0}", + simpleCompiledQuery.ToCommaDelimitedString()); + Console.WriteLine("Managed person count: {0}", + managedPersonCount.Value); + Console.WriteLine("Person with employees: {0}", + personsWithEmployees.ToCommaDelimitedString()); + + transactionScope.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Indexes/TestFixture.cs b/Orm/Xtensive.Orm.Manual/Indexes/TestFixture.cs index af581fdaa4..7ccbad81b6 100644 --- a/Orm/Xtensive.Orm.Manual/Indexes/TestFixture.cs +++ b/Orm/Xtensive.Orm.Manual/Indexes/TestFixture.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.16 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Indexes -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Pet : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Person Owner { get; set; } - - public Pet(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - [Index("Email", Unique = true)] - [Index("FirstName", "LastName")] - [Index("Nickname", Unique = true)] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Nickname { get; set; } - - [Field] - public string Email { get; set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - public Person(Session session) - : base(session) - {} - } - - public enum OrderStatus - { - WaitingConfirmation, - Active, - Completed, - } - - [HierarchyRoot, Index("Status", Filter = "StatusIndexRange")] - public class Order : Entity - { - private static Expression> StatusIndexRange() - { - // Skip completed orders - return order => order.Status!=OrderStatus.Completed; - } - - [Key, Field] - public long Id { get; private set; } - - [Field] - public OrderStatus Status { get; set; } - } - - #endregion - - [TestFixture] - public class TestFixture - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Pet).Assembly, typeof (Pet).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - // ... - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.16 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Indexes +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Pet : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Person Owner { get; set; } + + public Pet(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + [Index("Email", Unique = true)] + [Index("FirstName", "LastName")] + [Index("Nickname", Unique = true)] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Nickname { get; set; } + + [Field] + public string Email { get; set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + public Person(Session session) + : base(session) + {} + } + + public enum OrderStatus + { + WaitingConfirmation, + Active, + Completed, + } + + [HierarchyRoot, Index("Status", Filter = "StatusIndexRange")] + public class Order : Entity + { + private static Expression> StatusIndexRange() + { + // Skip completed orders + return order => order.Status!=OrderStatus.Completed; + } + + [Key, Field] + public long Id { get; private set; } + + [Field] + public OrderStatus Status { get; set; } + } + + #endregion + + [TestFixture] + public class TestFixture + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Pet).Assembly, typeof (Pet).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + // ... + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Intro/CheatSheetTest.cs b/Orm/Xtensive.Orm.Manual/Intro/CheatSheetTest.cs index f6ab6af430..b351ee8546 100644 --- a/Orm/Xtensive.Orm.Manual/Intro/CheatSheetTest.cs +++ b/Orm/Xtensive.Orm.Manual/Intro/CheatSheetTest.cs @@ -1,274 +1,274 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.23 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Intro.CheatSheet -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class User : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public EntitySet FavoritePages { get; private set; } - - [Field] - [Association( - OnOwnerRemove = OnRemoveAction.Cascade, - OnTargetRemove = OnRemoveAction.Clear)] - public WebPage PersonalPage { get; set; } - - [Field] - [Association(PairTo = "Author")] - public EntitySet BlogPosts { get; private set; } - - [Field] - [Association(PairTo = "Friends")] - public EntitySet Friends { get; private set; } - - public User(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class WebPage : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Title { get; set; } - - [Field(Length = 200)] - public string Url { get; set; } - - public WebPage(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class BlogPost : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Title { get; set; } - - [Field(Length = 1000)] - public string Content { get; set; } - - [Field] - public User Author { get; set;} - - public BlogPost(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class CheatSheetTest - { - [Test] - public void MainTest() - { - // Creatign new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Modifying it by registering the persistent types - config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - Key dmitriKey; - int dmitriId; - string dmitriKeyString; - - // Opening Session - using (var session = domain.OpenSession()) { - - // Opening transaction - using (var transactionScope = session.OpenTransaction()) { - - // Creating user - var dmitri = new User(session) { - Name = "Dmitri" - }; - - // Storing entity key - dmitriKey = dmitri.Key; - dmitriKeyString = dmitriKey.Format(); - dmitriId = dmitri.Id; - - Console.WriteLine("Dmitri's Key (human readable): {0}", dmitriKey); - Console.WriteLine("Dmitri's Key (serializable): {0}", dmitriKeyString); - Console.WriteLine("Dmitri's Id: {0}", dmitriId); - - // Marking the transaction scope as completed to commit it - transactionScope.Complete(); - } - - // Opening another transaction - using (var transactionScope = session.OpenTransaction()) { - // Parses the serialized key - var anotherDimtriKey = Key.Parse(session.Domain, dmitriKeyString); - // Keys are equal - Assert.AreEqual(dmitriKey, anotherDimtriKey); - - // Materialization on fetch - var dmitri = session.Query.Single(dmitriKey); - // Alternative way to do the same - var anotherDmitri = session.Query.SingleOrDefault(dmitriKey); - Assert.AreSame(dmitri, anotherDmitri); - // Fetching by key value(s) - anotherDmitri = session.Query.Single(dmitriId); - Assert.AreSame(dmitri, anotherDmitri); - - // Querying the storage using regular LINQ query - var query = - from user in session.Query.All() - where user.Name=="Dmitri" - select user; - Assert.AreSame(dmitri, query.First()); - - // Querying the storage using compiled query - anotherDmitri = session.Query.Execute(qe => // Default caching key is methodof( () => ... ) - from user in session.Query.All() - where user.Name=="Dmitri" - select user).First(); - Assert.AreSame(dmitri, anotherDmitri); - - // Querying the storage using compiled future scalar query - var delayedDmitry1 = session.Query.ExecuteDelayed(qe => ( - from user in qe.All() - where user.Name=="Dmitri" - select user - ).FirstOrDefault()); - var delayedDmitry2 = session.Query.ExecuteDelayed(qe => ( - from user in qe.All() - where user.Id==dmitriId - select user - ).First()); - Assert.AreSame(dmitri, delayedDmitry1.Value); // Both queries are executed at once here - Assert.AreSame(dmitri, delayedDmitry2.Value); - - // Modifying the entity - dmitri.Name = "Dmitri Maximov"; - - // Opening new nested transaction - using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { - // Removing the entity - dmitri.Remove(); - Assert.IsTrue(dmitri.IsRemoved); - AssertEx.Throws(() => { - var dmitryName = dmitri.Name; - }); - // No nestedScope.Complete(), so nested transaction will be rolled back - } - - // Transparent Entity state update - Assert.IsFalse(dmitri.IsRemoved); - Assert.AreEqual("Dmitri Maximov", dmitri.Name); - - // Creating few more objects - var xtensiveWebPage = new WebPage (session) { - Title = "Xtensive Web Site", - Url = "http://www.x-tensive.com" - }; - var alexYakuninBlogPage = new WebPage (session) { - Title = "Alex Yakunin's Blog", - Url = "http://blog.alexyakunin.com" - }; - var subsonicPage = new WebPage (session) { - Title = "SubSonic project page", - Url = "http://www.subsonicproject.com/" - }; - - // Adding the items to EntitySet - dmitri.FavoritePages.Add(xtensiveWebPage); - dmitri.FavoritePages.Add(alexYakuninBlogPage); - dmitri.FavoritePages.Add(subsonicPage); - - // Removing the item from EntitySet - dmitri.FavoritePages.Remove(subsonicPage); - - // Getting count of items in EntitySet - Console.WriteLine("Dmitri's favorite page count: {0}", dmitri.FavoritePages.Count); - Assert.AreEqual(2, dmitri.FavoritePages.Count); - Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query - - // Enumerating EntitySet - foreach (var page in dmitri.FavoritePages) - Console.WriteLine("Dmitri's favorite page: {0} ({1})", page.Title, page.Url); - - // Checking for the containment - Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage)); - Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); - Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); - - // Opening new nested transaction - using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { - // Clearing the EntitySet - dmitri.FavoritePages.Clear(); - Assert.IsFalse(dmitri.FavoritePages.Contains(xtensiveWebPage)); - Assert.IsFalse(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); - Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); - Assert.AreEqual(0, dmitri.FavoritePages.Count); - Assert.AreEqual(0, dmitri.FavoritePages.Count()); // By query - // No nestedScope.Complete(), so nested transaction will be rolled back - } - - // Transparent EntitySet state update - Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage)); - Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); - Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); - Assert.AreEqual(2, dmitri.FavoritePages.Count); - Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query - - // Finally, let's query the EntitySet: - - // Query construction - var dmitryFavoriteBlogs = - from page in dmitri.FavoritePages - where page.Url.ToLower().Contains("blog") - select page; - - // Query execution - var dmitryFavoriteBlogList = dmitryFavoriteBlogs.ToList(); - - // Printing the results - Console.WriteLine("Dmitri's favorite blog count: {0}", dmitryFavoriteBlogList.Count); - foreach (var page in dmitryFavoriteBlogList) - Console.WriteLine("Dmitri's favorite blog: {0} ({1})", page.Title, page.Url); - - Assert.IsTrue(dmitryFavoriteBlogList.Contains(alexYakuninBlogPage)); - Assert.IsFalse(dmitryFavoriteBlogList.Contains(xtensiveWebPage)); - Assert.AreEqual(1, dmitryFavoriteBlogList.Count); - - // Marking the transaction scope as completed to commit it - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.23 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Intro.CheatSheet +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class User : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public EntitySet FavoritePages { get; private set; } + + [Field] + [Association( + OnOwnerRemove = OnRemoveAction.Cascade, + OnTargetRemove = OnRemoveAction.Clear)] + public WebPage PersonalPage { get; set; } + + [Field] + [Association(PairTo = "Author")] + public EntitySet BlogPosts { get; private set; } + + [Field] + [Association(PairTo = "Friends")] + public EntitySet Friends { get; private set; } + + public User(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class WebPage : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Title { get; set; } + + [Field(Length = 200)] + public string Url { get; set; } + + public WebPage(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class BlogPost : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Title { get; set; } + + [Field(Length = 1000)] + public string Content { get; set; } + + [Field] + public User Author { get; set;} + + public BlogPost(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class CheatSheetTest + { + [Test] + public void MainTest() + { + // Creatign new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Modifying it by registering the persistent types + config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + Key dmitriKey; + int dmitriId; + string dmitriKeyString; + + // Opening Session + using (var session = domain.OpenSession()) { + + // Opening transaction + using (var transactionScope = session.OpenTransaction()) { + + // Creating user + var dmitri = new User(session) { + Name = "Dmitri" + }; + + // Storing entity key + dmitriKey = dmitri.Key; + dmitriKeyString = dmitriKey.Format(); + dmitriId = dmitri.Id; + + Console.WriteLine("Dmitri's Key (human readable): {0}", dmitriKey); + Console.WriteLine("Dmitri's Key (serializable): {0}", dmitriKeyString); + Console.WriteLine("Dmitri's Id: {0}", dmitriId); + + // Marking the transaction scope as completed to commit it + transactionScope.Complete(); + } + + // Opening another transaction + using (var transactionScope = session.OpenTransaction()) { + // Parses the serialized key + var anotherDimtriKey = Key.Parse(session.Domain, dmitriKeyString); + // Keys are equal + Assert.AreEqual(dmitriKey, anotherDimtriKey); + + // Materialization on fetch + var dmitri = session.Query.Single(dmitriKey); + // Alternative way to do the same + var anotherDmitri = session.Query.SingleOrDefault(dmitriKey); + Assert.AreSame(dmitri, anotherDmitri); + // Fetching by key value(s) + anotherDmitri = session.Query.Single(dmitriId); + Assert.AreSame(dmitri, anotherDmitri); + + // Querying the storage using regular LINQ query + var query = + from user in session.Query.All() + where user.Name=="Dmitri" + select user; + Assert.AreSame(dmitri, query.First()); + + // Querying the storage using compiled query + anotherDmitri = session.Query.Execute(qe => // Default caching key is methodof( () => ... ) + from user in session.Query.All() + where user.Name=="Dmitri" + select user).First(); + Assert.AreSame(dmitri, anotherDmitri); + + // Querying the storage using compiled future scalar query + var delayedDmitry1 = session.Query.ExecuteDelayed(qe => ( + from user in qe.All() + where user.Name=="Dmitri" + select user + ).FirstOrDefault()); + var delayedDmitry2 = session.Query.ExecuteDelayed(qe => ( + from user in qe.All() + where user.Id==dmitriId + select user + ).First()); + Assert.AreSame(dmitri, delayedDmitry1.Value); // Both queries are executed at once here + Assert.AreSame(dmitri, delayedDmitry2.Value); + + // Modifying the entity + dmitri.Name = "Dmitri Maximov"; + + // Opening new nested transaction + using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { + // Removing the entity + dmitri.Remove(); + Assert.IsTrue(dmitri.IsRemoved); + AssertEx.Throws(() => { + var dmitryName = dmitri.Name; + }); + // No nestedScope.Complete(), so nested transaction will be rolled back + } + + // Transparent Entity state update + Assert.IsFalse(dmitri.IsRemoved); + Assert.AreEqual("Dmitri Maximov", dmitri.Name); + + // Creating few more objects + var xtensiveWebPage = new WebPage (session) { + Title = "Xtensive Web Site", + Url = "http://www.x-tensive.com" + }; + var alexYakuninBlogPage = new WebPage (session) { + Title = "Alex Yakunin's Blog", + Url = "http://blog.alexyakunin.com" + }; + var subsonicPage = new WebPage (session) { + Title = "SubSonic project page", + Url = "http://www.subsonicproject.com/" + }; + + // Adding the items to EntitySet + dmitri.FavoritePages.Add(xtensiveWebPage); + dmitri.FavoritePages.Add(alexYakuninBlogPage); + dmitri.FavoritePages.Add(subsonicPage); + + // Removing the item from EntitySet + dmitri.FavoritePages.Remove(subsonicPage); + + // Getting count of items in EntitySet + Console.WriteLine("Dmitri's favorite page count: {0}", dmitri.FavoritePages.Count); + Assert.AreEqual(2, dmitri.FavoritePages.Count); + Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query + + // Enumerating EntitySet + foreach (var page in dmitri.FavoritePages) + Console.WriteLine("Dmitri's favorite page: {0} ({1})", page.Title, page.Url); + + // Checking for the containment + Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage)); + Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); + Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); + + // Opening new nested transaction + using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { + // Clearing the EntitySet + dmitri.FavoritePages.Clear(); + Assert.IsFalse(dmitri.FavoritePages.Contains(xtensiveWebPage)); + Assert.IsFalse(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); + Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); + Assert.AreEqual(0, dmitri.FavoritePages.Count); + Assert.AreEqual(0, dmitri.FavoritePages.Count()); // By query + // No nestedScope.Complete(), so nested transaction will be rolled back + } + + // Transparent EntitySet state update + Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage)); + Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage)); + Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage)); + Assert.AreEqual(2, dmitri.FavoritePages.Count); + Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query + + // Finally, let's query the EntitySet: + + // Query construction + var dmitryFavoriteBlogs = + from page in dmitri.FavoritePages + where page.Url.ToLower().Contains("blog") + select page; + + // Query execution + var dmitryFavoriteBlogList = dmitryFavoriteBlogs.ToList(); + + // Printing the results + Console.WriteLine("Dmitri's favorite blog count: {0}", dmitryFavoriteBlogList.Count); + foreach (var page in dmitryFavoriteBlogList) + Console.WriteLine("Dmitri's favorite blog: {0} ({1})", page.Title, page.Url); + + Assert.IsTrue(dmitryFavoriteBlogList.Contains(alexYakuninBlogPage)); + Assert.IsFalse(dmitryFavoriteBlogList.Contains(xtensiveWebPage)); + Assert.AreEqual(1, dmitryFavoriteBlogList.Count); + + // Marking the transaction scope as completed to commit it + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Intro/HelloWorldTest.cs b/Orm/Xtensive.Orm.Manual/Intro/HelloWorldTest.cs index cfa71a4548..88124da74f 100644 --- a/Orm/Xtensive.Orm.Manual/Intro/HelloWorldTest.cs +++ b/Orm/Xtensive.Orm.Manual/Intro/HelloWorldTest.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Intro.HelloWorld -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - #endregion - - [TestFixture] - public class HelloWorldTest - { - [Test] - public void MainTest() - { - // Creatign new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - // Modifying it by registering the persistent types - config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - // Session don't activated by default - Debug.Assert(Session.Current == null); - } - - var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.AutoActivation); - using (var session = domain.OpenSession(sessionConfiguration)) - using (var transactionScope = session.OpenTransaction()) { - Debug.Assert(Session.Current == session); - var helloWorld = new MyEntity { Text = "Hello World!" }; - // Marking transaction as committable - transactionScope.Complete(); - } - - // Reading all persisted objects from another Session - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - foreach (var myEntity in session.Query.All()) - Console.WriteLine(myEntity.Text); - transactionScope.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Intro.HelloWorld +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + #endregion + + [TestFixture] + public class HelloWorldTest + { + [Test] + public void MainTest() + { + // Creatign new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + // Modifying it by registering the persistent types + config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + // Session don't activated by default + Debug.Assert(Session.Current == null); + } + + var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.AutoActivation); + using (var session = domain.OpenSession(sessionConfiguration)) + using (var transactionScope = session.OpenTransaction()) { + Debug.Assert(Session.Current == session); + var helloWorld = new MyEntity { Text = "Hello World!" }; + // Marking transaction as committable + transactionScope.Complete(); + } + + // Reading all persisted objects from another Session + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + foreach (var myEntity in session.Query.All()) + Console.WriteLine(myEntity.Text); + transactionScope.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Legacy/CustomKeyGenerators/CustomKeyGeneratorsTest.cs b/Orm/Xtensive.Orm.Manual/Legacy/CustomKeyGenerators/CustomKeyGeneratorsTest.cs index 1a86ed95c7..92ed2a2cc6 100644 --- a/Orm/Xtensive.Orm.Manual/Legacy/CustomKeyGenerators/CustomKeyGeneratorsTest.cs +++ b/Orm/Xtensive.Orm.Manual/Legacy/CustomKeyGenerators/CustomKeyGeneratorsTest.cs @@ -1,125 +1,125 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.01.28 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Legacy.CustomKeyGenerators -{ - #region Model - - [Serializable] - [HierarchyRoot] - [KeyGenerator(Name = "Author")] - public class Author : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public EntitySet Books { get; private set; } - - public override string ToString() - { - return Name; - } - - // Constructors - - public Author(Session session) - : base(session) - { - } - - public Author(Session session, int id) - : base(session, id) - { - } - } - - [Serializable] - [HierarchyRoot] - [KeyGenerator(Name = "Book")] - public class Book : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Books")] - public EntitySet Authors { get; private set; } - - public override string ToString() - { - return string.Format("{0} by {1}", - Name, Authors.ToCommaDelimitedString()); - } - - // Constructors - - public Book(Session session) - : base (session) - { - } - - public Book(Session session, int id) - : base(session, id) - { - } - } - - #endregion - - [TestFixture] - public class CustomKeyGeneratorsTest - { - [Test] - public void CombinedTest() - { - // Creating new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Registering all types in the specified assembly and namespace - config.Types.Register(typeof (Author).Assembly, typeof(Author).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - // Creating two authors - var joseph = new Author(session) {Name = "Joseph Albahari"}; - var ben = new Author(session) {Name = "Ben Albahari"}; - - // Creating the Book book with book.Id = joseph.Id - var book = new Book (session, joseph.Id) {Name = "C# 4.0 in a Nutshell"}; - book.Authors.Add(joseph); - book.Authors.Add(ben); - - // Testing ProxyKeyGenerator - Assert.AreSame(joseph, session.Query.SingleOrDefault(joseph.Key)); - Assert.AreSame(ben, session.Query.SingleOrDefault(ben.Key)); - // Must fail, if [KeyGenerator(typeof(ProxyKeyGenerator))] - // line is commented - Assert.AreSame(book, session.Query.SingleOrDefault(book.Key)); - - // Let's finally print the Book - Console.WriteLine(book); - - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.01.28 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Legacy.CustomKeyGenerators +{ + #region Model + + [Serializable] + [HierarchyRoot] + [KeyGenerator(Name = "Author")] + public class Author : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public EntitySet Books { get; private set; } + + public override string ToString() + { + return Name; + } + + // Constructors + + public Author(Session session) + : base(session) + { + } + + public Author(Session session, int id) + : base(session, id) + { + } + } + + [Serializable] + [HierarchyRoot] + [KeyGenerator(Name = "Book")] + public class Book : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Books")] + public EntitySet Authors { get; private set; } + + public override string ToString() + { + return string.Format("{0} by {1}", + Name, Authors.ToCommaDelimitedString()); + } + + // Constructors + + public Book(Session session) + : base (session) + { + } + + public Book(Session session, int id) + : base(session, id) + { + } + } + + #endregion + + [TestFixture] + public class CustomKeyGeneratorsTest + { + [Test] + public void CombinedTest() + { + // Creating new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Registering all types in the specified assembly and namespace + config.Types.Register(typeof (Author).Assembly, typeof(Author).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + // Creating two authors + var joseph = new Author(session) {Name = "Joseph Albahari"}; + var ben = new Author(session) {Name = "Ben Albahari"}; + + // Creating the Book book with book.Id = joseph.Id + var book = new Book (session, joseph.Id) {Name = "C# 4.0 in a Nutshell"}; + book.Authors.Add(joseph); + book.Authors.Add(ben); + + // Testing ProxyKeyGenerator + Assert.AreSame(joseph, session.Query.SingleOrDefault(joseph.Key)); + Assert.AreSame(ben, session.Query.SingleOrDefault(ben.Key)); + // Must fail, if [KeyGenerator(typeof(ProxyKeyGenerator))] + // line is commented + Assert.AreSame(book, session.Query.SingleOrDefault(book.Key)); + + // Let's finally print the Book + Console.WriteLine(book); + + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/ModellingDomain/AuditAndOpenGenericsTest.cs b/Orm/Xtensive.Orm.Manual/ModellingDomain/AuditAndOpenGenericsTest.cs index 31ba5c88a5..cfe7b1bc82 100644 --- a/Orm/Xtensive.Orm.Manual/ModellingDomain/AuditAndOpenGenericsTest.cs +++ b/Orm/Xtensive.Orm.Manual/ModellingDomain/AuditAndOpenGenericsTest.cs @@ -1,455 +1,455 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.17 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Tests; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Manual.ModellingDomain.AuditAndOpenGenericsTest -{ - #region Model - - [Serializable] - [HierarchyRoot] - [KeyGenerator(Name = "Transaction")] // To ensure there is its own sequence - [Index("Guid", Unique = true)] - public class TransactionInfo : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Guid Guid { get; internal set; } - - [Field] - public DateTime TimeStamp { get; internal set; } - - [Field] - public TimeSpan Duration { get; internal set; } - - public override string ToString() - { - return string.Format("Transaction #{0} ({1}, {2} ms)", - Id, TimeStamp, Duration.TotalMilliseconds); - } - - // Only this assmebly may create or modify this instance - internal TransactionInfo(Session session) - : base (session) - { - var thisType = typeof (TransactionInfo); - try { - Initialize(thisType); - } - catch (Exception e) { - InitializationError(thisType, e); - throw; - } - } - } - - public enum EntityChangeType - { - Created, - Changed, - Removed - } - - [Serializable] - [HierarchyRoot] - [Index("Transaction", "EntityKey", Unique = true)] - public abstract class AuditRecord : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public TransactionInfo Transaction { get; internal set; } - - [Field] - public Key EntityKey { get; internal set; } - - [Field] - public EntityChangeType ChangeType { get; internal set; } - - [Field] - public string EntityAsString { get; internal set; } - - public abstract Entity UntypedEntity { get; internal set; } - - protected AuditRecord(Session session) - : base(session) - {} - } - - // Unused, here it is just to show one more open generic - [Serializable] - [HierarchyRoot] - public sealed class SyncInfo : Entity - where T: Entity - { - [Field, Key] - [Association(OnTargetRemove = OnRemoveAction.None)] - public T Entity { get; private set; } - - public SyncInfo(Session session) - : base(session) - {} - } - - [Serializable] - public sealed class AuditRecord : AuditRecord - where T: Entity - { - public override Entity UntypedEntity { - get { return Entity; } - internal set { Entity = (T) value; } - } - - [Field] - // Required to eliminate FK contraint: - [Association(OnTargetRemove = OnRemoveAction.None)] - public T Entity { get; private set; } - - public override string ToString() - { - return string.Format("{0,7} {1}\r\n{2,7} Current state: {3}", - ChangeType, - EntityAsString, - string.Empty, - Entity==null || Entity.IsRemoved ? "removed " + EntityKey : Entity.ToString()); - } - - // Only this assmebly may create or modify this instance - internal AuditRecord() - : base (Session.Demand()) - { - var thisType = typeof (AuditRecord<>); - try { - Initialize(thisType); - } - catch (Exception e) { - InitializationError(thisType, e); - throw; - } - } - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Pets { get; private set; } - - public override string ToString() - { - return string.Format("{0} {1}, Id: #{2}, Pets: {3}", - GetType().GetShortName(), Name, - Id, Pets.Select(p => p.Name).ToCommaDelimitedString()); - } - - public Person(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Person Owner { get; set; } - - public override string ToString() - { - return string.Format("{0} {1}, Id: #{2}, Owner: {3}", GetType().GetShortName(), Name, - Id, Owner==null ? "none" : Owner.Name); - } - - public Animal(Session session) - : base(session) - {} - } - - [Serializable] - public class Cat : Animal - { - public Cat(Session session) - : base(session) - {} - } - - [Serializable] - public class Dog : Animal - { - public Dog(Session session) - : base(session) - {} - } - - #endregion - - #region SimpleAuditModule (IModule) - - public sealed class SimpleAuditModule : IModule - { - private class AuditModuleInfo - { - public HashSet CreatedEntities = new HashSet(); - public HashSet ChangedEntities = new HashSet(); - - public AuditModuleInfo() - { - } - } - - private Domain Domain { get; set; } - - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - {} - - public void OnBuilt(Domain domain) - { - Domain = domain; - domain.SessionOpen += (source, args) => { - args.Session.Events.TransactionOpened += TransactionOpened; - args.Session.Events.TransactionCommitting += TransactionCommitting; - args.Session.Events.EntityCreated += (sender, e) => EntityEvent(sender, e, true); - args.Session.Events.EntityRemoveCompleted += (sender, e) => EntityEvent(sender, e, false); - args.Session.Events.EntityFieldValueSetCompleted += (sender, e) => EntityEvent(sender, e, false); - // To catches events from EntitySet fields - args.Session.Events.EntityVersionInfoChanged += (sender, e) => EntityEvent(sender, e, false); - }; - } - - private void TransactionOpened(object sender, TransactionEventArgs e) - { - var transaction = e.Transaction; - if (transaction.IsNested) - return; - var session = transaction.Session; - if (session.IsDisconnected) - return; - var info = new AuditModuleInfo(); - session.Extensions.Set(info); - } - - private void TransactionCommitting(object sender, TransactionEventArgs e) - { - var transaction = e.Transaction; - if (transaction.IsNested) - return; - var session = transaction.Session; - if (session.IsDisconnected) - return; - var info = session.Extensions.Get(); - if (info.ChangedEntities.Count==0) - return; // Logging only writing transactions - - var transactionInfo = new TransactionInfo (session) { - Guid = transaction.Guid, - TimeStamp = transaction.TimeStamp - }; - using (var ss = session.Activate()) { - var batches = info.ChangedEntities.Batch(); // To avoid further GCs, if set is large - foreach (var changedEntities in batches) { - session.Query.Many(changedEntities).Run(); - foreach (var key in changedEntities) { - var entity = session.Query.SingleOrDefault(key); - bool isRemoved = entity==null || entity.IsRemoved; - bool isCreated = info.CreatedEntities.Contains(key); - if (isRemoved && isCreated) - continue; // Nothing really happened ;) - - var entityHierarchyRootType = (isRemoved ? key.TypeInfo : entity.TypeInfo).Hierarchy.Root.UnderlyingType; - var recordType = typeof (AuditRecord<>).MakeGenericType(entityHierarchyRootType); - var auditRecord = (AuditRecord) Activator.CreateInstance(recordType, true); - auditRecord.Transaction = transactionInfo; - auditRecord.ChangeType = - isRemoved ? EntityChangeType.Removed : // Order is important here! - isCreated ? EntityChangeType.Created : - EntityChangeType.Changed; - auditRecord.EntityAsString = isRemoved ? key.ToString() : entity.ToString(); - auditRecord.EntityKey = key; - if (!isRemoved) - auditRecord.UntypedEntity = entity; - } - // In the end of all, to log it more precisely: - transactionInfo.Duration = DateTime.UtcNow - transactionInfo.TimeStamp; - } - } - } - - private void EntityEvent(object sender, EntityEventArgs e, bool created) - { - try { - var entity = e.Entity; - if (entity is AuditRecord) - return; // Avoding recursion ;) - if (entity is TransactionInfo) - return; // That's silly ;) - var session = entity.Session; - if (session.IsDisconnected) - return; - var info = session.Extensions.Get(); - if (info.ChangedEntities.Contains(entity.Key)) - return; - info.ChangedEntities.Add(entity.Key); - if (created) - info.CreatedEntities.Add(entity.Key); - } - catch { - // Must not affect on operation! - return; - } - } - } - - #endregion - - [TestFixture] - public class AuditAndOpenGenericsTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - DumpAutoRegisteredGenericInstances(domain); - - Cat tom; - Cat musya; - Person alex; - using (var session = domain.OpenSession()) - using (var ss = session.Activate()) { - using (var tx = session.OpenTransaction()) { - tom = new Cat (session) {Name = "Tom"}; - new Dog (session) {Name = "Sharik"}; - tx.Complete(); - } - using (var tx = session.OpenTransaction()) { - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(2, session.Query.All>().Count()); - musya = new Cat(session); - tx.Complete(); - } - - // Auto transactions - using (var tx = session.OpenTransaction()) { - musya.Name = "Musya"; - musya.Remove(); - tx.Complete(); - } - - // Rollback test - using (var tx = session.OpenTransaction()) { - tom.Name = "Shushera"; - // tx.Complete(); - } - - // Another session & transaction - using (Session.Deactivate()) // Blocks session switching check - using (var session2 = domain.OpenSession()) { - using (var tx = session2.OpenTransaction()) { - alex = new Person (session2) {Name = "Alex"}; - tx.Complete(); - } - } - - using (var tx = session.OpenTransaction()) { - alex = session.Query.Single(alex.Key); // Materializing entity from enother Session here - } - - using (var tx = session.OpenTransaction()) - { - tom.Owner = alex; - tx.Complete(); - } - - // And now - the magic! - using (var tx = session.OpenTransaction()) { - DumpAuditLog(); - } - } - } - - private void DumpAutoRegisteredGenericInstances(Domain domain) - { - var registeredTypes = ( - from typeInfo in domain.Model.Types - orderby typeInfo.UnderlyingType.GetShortName() - select typeInfo).ToList(); - - var autoGenericInstances = ( - from typeInfo in registeredTypes - where typeInfo.IsAutoGenericInstance - select typeInfo).ToList(); - - Console.WriteLine("Automatically registered generic instances:"); - foreach (var typeInfo in autoGenericInstances) - Console.WriteLine(" {0}", typeInfo.UnderlyingType.GetShortName()); - Console.WriteLine(); - Assert.AreEqual(8, autoGenericInstances.Count); - } - - private void DumpAuditLog() - { - Console.WriteLine("Audit log:"); - var session = Session.Demand(); - var auditTable = - from record in session.Query.All() - let transaction = record.Transaction - orderby transaction.Id , record.EntityKey - select new {Record = record, Transaction = transaction}; - - // Prefetching AuditRecord - so far we're sure there is only - // AuditRecord fields and Transaction, but we need descendant fields - // as well. - Session.Demand().Query - .Many(auditTable.Select(e => e.Record.Key)) - .Run(); - // Prefetching AuditRecord.EntityKey - Session.Demand().Query - .Many(auditTable.Select(e => e.Record.EntityKey)) - .Run(); - - TransactionInfo lastTransaction = null; - foreach (var entry in auditTable) { - var transaction = entry.Transaction; - if (lastTransaction!=transaction) { - // Client-side grouping ;) Actually, for nicer output. - Console.WriteLine(); - Console.WriteLine(transaction.ToString()); - lastTransaction = transaction; - } - Console.WriteLine(entry.Record.ToString().Indent(2)); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.17 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Tests; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Manual.ModellingDomain.AuditAndOpenGenericsTest +{ + #region Model + + [Serializable] + [HierarchyRoot] + [KeyGenerator(Name = "Transaction")] // To ensure there is its own sequence + [Index("Guid", Unique = true)] + public class TransactionInfo : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Guid Guid { get; internal set; } + + [Field] + public DateTime TimeStamp { get; internal set; } + + [Field] + public TimeSpan Duration { get; internal set; } + + public override string ToString() + { + return string.Format("Transaction #{0} ({1}, {2} ms)", + Id, TimeStamp, Duration.TotalMilliseconds); + } + + // Only this assmebly may create or modify this instance + internal TransactionInfo(Session session) + : base (session) + { + var thisType = typeof (TransactionInfo); + try { + Initialize(thisType); + } + catch (Exception e) { + InitializationError(thisType, e); + throw; + } + } + } + + public enum EntityChangeType + { + Created, + Changed, + Removed + } + + [Serializable] + [HierarchyRoot] + [Index("Transaction", "EntityKey", Unique = true)] + public abstract class AuditRecord : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public TransactionInfo Transaction { get; internal set; } + + [Field] + public Key EntityKey { get; internal set; } + + [Field] + public EntityChangeType ChangeType { get; internal set; } + + [Field] + public string EntityAsString { get; internal set; } + + public abstract Entity UntypedEntity { get; internal set; } + + protected AuditRecord(Session session) + : base(session) + {} + } + + // Unused, here it is just to show one more open generic + [Serializable] + [HierarchyRoot] + public sealed class SyncInfo : Entity + where T: Entity + { + [Field, Key] + [Association(OnTargetRemove = OnRemoveAction.None)] + public T Entity { get; private set; } + + public SyncInfo(Session session) + : base(session) + {} + } + + [Serializable] + public sealed class AuditRecord : AuditRecord + where T: Entity + { + public override Entity UntypedEntity { + get { return Entity; } + internal set { Entity = (T) value; } + } + + [Field] + // Required to eliminate FK contraint: + [Association(OnTargetRemove = OnRemoveAction.None)] + public T Entity { get; private set; } + + public override string ToString() + { + return string.Format("{0,7} {1}\r\n{2,7} Current state: {3}", + ChangeType, + EntityAsString, + string.Empty, + Entity==null || Entity.IsRemoved ? "removed " + EntityKey : Entity.ToString()); + } + + // Only this assmebly may create or modify this instance + internal AuditRecord() + : base (Session.Demand()) + { + var thisType = typeof (AuditRecord<>); + try { + Initialize(thisType); + } + catch (Exception e) { + InitializationError(thisType, e); + throw; + } + } + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Pets { get; private set; } + + public override string ToString() + { + return string.Format("{0} {1}, Id: #{2}, Pets: {3}", + GetType().GetShortName(), Name, + Id, Pets.Select(p => p.Name).ToCommaDelimitedString()); + } + + public Person(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Person Owner { get; set; } + + public override string ToString() + { + return string.Format("{0} {1}, Id: #{2}, Owner: {3}", GetType().GetShortName(), Name, + Id, Owner==null ? "none" : Owner.Name); + } + + public Animal(Session session) + : base(session) + {} + } + + [Serializable] + public class Cat : Animal + { + public Cat(Session session) + : base(session) + {} + } + + [Serializable] + public class Dog : Animal + { + public Dog(Session session) + : base(session) + {} + } + + #endregion + + #region SimpleAuditModule (IModule) + + public sealed class SimpleAuditModule : IModule + { + private class AuditModuleInfo + { + public HashSet CreatedEntities = new HashSet(); + public HashSet ChangedEntities = new HashSet(); + + public AuditModuleInfo() + { + } + } + + private Domain Domain { get; set; } + + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + {} + + public void OnBuilt(Domain domain) + { + Domain = domain; + domain.SessionOpen += (source, args) => { + args.Session.Events.TransactionOpened += TransactionOpened; + args.Session.Events.TransactionCommitting += TransactionCommitting; + args.Session.Events.EntityCreated += (sender, e) => EntityEvent(sender, e, true); + args.Session.Events.EntityRemoveCompleted += (sender, e) => EntityEvent(sender, e, false); + args.Session.Events.EntityFieldValueSetCompleted += (sender, e) => EntityEvent(sender, e, false); + // To catches events from EntitySet fields + args.Session.Events.EntityVersionInfoChanged += (sender, e) => EntityEvent(sender, e, false); + }; + } + + private void TransactionOpened(object sender, TransactionEventArgs e) + { + var transaction = e.Transaction; + if (transaction.IsNested) + return; + var session = transaction.Session; + if (session.IsDisconnected) + return; + var info = new AuditModuleInfo(); + session.Extensions.Set(info); + } + + private void TransactionCommitting(object sender, TransactionEventArgs e) + { + var transaction = e.Transaction; + if (transaction.IsNested) + return; + var session = transaction.Session; + if (session.IsDisconnected) + return; + var info = session.Extensions.Get(); + if (info.ChangedEntities.Count==0) + return; // Logging only writing transactions + + var transactionInfo = new TransactionInfo (session) { + Guid = transaction.Guid, + TimeStamp = transaction.TimeStamp + }; + using (var ss = session.Activate()) { + var batches = info.ChangedEntities.Batch(); // To avoid further GCs, if set is large + foreach (var changedEntities in batches) { + session.Query.Many(changedEntities).Run(); + foreach (var key in changedEntities) { + var entity = session.Query.SingleOrDefault(key); + bool isRemoved = entity==null || entity.IsRemoved; + bool isCreated = info.CreatedEntities.Contains(key); + if (isRemoved && isCreated) + continue; // Nothing really happened ;) + + var entityHierarchyRootType = (isRemoved ? key.TypeInfo : entity.TypeInfo).Hierarchy.Root.UnderlyingType; + var recordType = typeof (AuditRecord<>).MakeGenericType(entityHierarchyRootType); + var auditRecord = (AuditRecord) Activator.CreateInstance(recordType, true); + auditRecord.Transaction = transactionInfo; + auditRecord.ChangeType = + isRemoved ? EntityChangeType.Removed : // Order is important here! + isCreated ? EntityChangeType.Created : + EntityChangeType.Changed; + auditRecord.EntityAsString = isRemoved ? key.ToString() : entity.ToString(); + auditRecord.EntityKey = key; + if (!isRemoved) + auditRecord.UntypedEntity = entity; + } + // In the end of all, to log it more precisely: + transactionInfo.Duration = DateTime.UtcNow - transactionInfo.TimeStamp; + } + } + } + + private void EntityEvent(object sender, EntityEventArgs e, bool created) + { + try { + var entity = e.Entity; + if (entity is AuditRecord) + return; // Avoding recursion ;) + if (entity is TransactionInfo) + return; // That's silly ;) + var session = entity.Session; + if (session.IsDisconnected) + return; + var info = session.Extensions.Get(); + if (info.ChangedEntities.Contains(entity.Key)) + return; + info.ChangedEntities.Add(entity.Key); + if (created) + info.CreatedEntities.Add(entity.Key); + } + catch { + // Must not affect on operation! + return; + } + } + } + + #endregion + + [TestFixture] + public class AuditAndOpenGenericsTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + DumpAutoRegisteredGenericInstances(domain); + + Cat tom; + Cat musya; + Person alex; + using (var session = domain.OpenSession()) + using (var ss = session.Activate()) { + using (var tx = session.OpenTransaction()) { + tom = new Cat (session) {Name = "Tom"}; + new Dog (session) {Name = "Sharik"}; + tx.Complete(); + } + using (var tx = session.OpenTransaction()) { + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(2, session.Query.All>().Count()); + musya = new Cat(session); + tx.Complete(); + } + + // Auto transactions + using (var tx = session.OpenTransaction()) { + musya.Name = "Musya"; + musya.Remove(); + tx.Complete(); + } + + // Rollback test + using (var tx = session.OpenTransaction()) { + tom.Name = "Shushera"; + // tx.Complete(); + } + + // Another session & transaction + using (Session.Deactivate()) // Blocks session switching check + using (var session2 = domain.OpenSession()) { + using (var tx = session2.OpenTransaction()) { + alex = new Person (session2) {Name = "Alex"}; + tx.Complete(); + } + } + + using (var tx = session.OpenTransaction()) { + alex = session.Query.Single(alex.Key); // Materializing entity from enother Session here + } + + using (var tx = session.OpenTransaction()) + { + tom.Owner = alex; + tx.Complete(); + } + + // And now - the magic! + using (var tx = session.OpenTransaction()) { + DumpAuditLog(); + } + } + } + + private void DumpAutoRegisteredGenericInstances(Domain domain) + { + var registeredTypes = ( + from typeInfo in domain.Model.Types + orderby typeInfo.UnderlyingType.GetShortName() + select typeInfo).ToList(); + + var autoGenericInstances = ( + from typeInfo in registeredTypes + where typeInfo.IsAutoGenericInstance + select typeInfo).ToList(); + + Console.WriteLine("Automatically registered generic instances:"); + foreach (var typeInfo in autoGenericInstances) + Console.WriteLine(" {0}", typeInfo.UnderlyingType.GetShortName()); + Console.WriteLine(); + Assert.AreEqual(8, autoGenericInstances.Count); + } + + private void DumpAuditLog() + { + Console.WriteLine("Audit log:"); + var session = Session.Demand(); + var auditTable = + from record in session.Query.All() + let transaction = record.Transaction + orderby transaction.Id , record.EntityKey + select new {Record = record, Transaction = transaction}; + + // Prefetching AuditRecord - so far we're sure there is only + // AuditRecord fields and Transaction, but we need descendant fields + // as well. + Session.Demand().Query + .Many(auditTable.Select(e => e.Record.Key)) + .Run(); + // Prefetching AuditRecord.EntityKey + Session.Demand().Query + .Many(auditTable.Select(e => e.Record.EntityKey)) + .Run(); + + TransactionInfo lastTransaction = null; + foreach (var entry in auditTable) { + var transaction = entry.Transaction; + if (lastTransaction!=transaction) { + // Client-side grouping ;) Actually, for nicer output. + Console.WriteLine(); + Console.WriteLine(transaction.ToString()); + lastTransaction = transaction; + } + Console.WriteLine(entry.Record.ToString().Indent(2)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/ModellingDomain/IndexAttributeTest.cs b/Orm/Xtensive.Orm.Manual/ModellingDomain/IndexAttributeTest.cs index 3a67513b63..a2ade42e3e 100644 --- a/Orm/Xtensive.Orm.Manual/ModellingDomain/IndexAttributeTest.cs +++ b/Orm/Xtensive.Orm.Manual/ModellingDomain/IndexAttributeTest.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.17 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.ModellingDomain.IndexAttribute_ -{ - #region Model - - [Serializable] - [Index("FirstName", "LastName", Unique = true)] - [Index("Age")] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public int Age { get; set; } - - public Person(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class IndexAttributeTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person)); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - var alex = new Person (session) { FirstName = "Alex", LastName = "Kofman", Age = 26}; - var ivan = new Person (session) { FirstName = "Ivan", LastName = "Galkin", Age = 28}; - - Assert.AreEqual(alex, GetPersonByName(session, "Alex", "Kofman")); - - var adults = GetPersonOverAge(session, 27); - Assert.AreEqual(1, adults.Count()); - Assert.AreEqual(ivan, adults.First()); - - transactionScope.Complete(); - } - - AssertEx.Throws(() => { - using (var transactionScope = session.OpenTransaction()) { - new Person (session) {FirstName = "Alex", LastName = "Kofman", Age = 0}; - transactionScope.Complete(); - } - }); - } - } - - public IEnumerable GetPersonOverAge(Session session, int age) - { - // Filtering and ordering uses secondary index - return - from person in session.Query.All() - where person.Age > age - orderby person.Age - select person; - } - - public Person GetPersonByName(Session session, string firstName, string lastName) - { - // Filtering uses unique secondary index - return ( - from person in session.Query.All() - where person.FirstName==firstName && person.LastName==lastName - select person - ).FirstOrDefault(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.17 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.ModellingDomain.IndexAttribute_ +{ + #region Model + + [Serializable] + [Index("FirstName", "LastName", Unique = true)] + [Index("Age")] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public int Age { get; set; } + + public Person(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class IndexAttributeTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person)); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + var alex = new Person (session) { FirstName = "Alex", LastName = "Kofman", Age = 26}; + var ivan = new Person (session) { FirstName = "Ivan", LastName = "Galkin", Age = 28}; + + Assert.AreEqual(alex, GetPersonByName(session, "Alex", "Kofman")); + + var adults = GetPersonOverAge(session, 27); + Assert.AreEqual(1, adults.Count()); + Assert.AreEqual(ivan, adults.First()); + + transactionScope.Complete(); + } + + AssertEx.Throws(() => { + using (var transactionScope = session.OpenTransaction()) { + new Person (session) {FirstName = "Alex", LastName = "Kofman", Age = 0}; + transactionScope.Complete(); + } + }); + } + } + + public IEnumerable GetPersonOverAge(Session session, int age) + { + // Filtering and ordering uses secondary index + return + from person in session.Query.All() + where person.Age > age + orderby person.Age + select person; + } + + public Person GetPersonByName(Session session, string firstName, string lastName) + { + // Filtering uses unique secondary index + return ( + from person in session.Query.All() + where person.FirstName==firstName && person.LastName==lastName + select person + ).FirstOrDefault(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Persistent/TestFixture.cs b/Orm/Xtensive.Orm.Manual/Persistent/TestFixture.cs index 3dcf297ced..6abcefa0fb 100644 --- a/Orm/Xtensive.Orm.Manual/Persistent/TestFixture.cs +++ b/Orm/Xtensive.Orm.Manual/Persistent/TestFixture.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.24 - - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Persistent -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public DateTime BirthDay { get; set; } - - [Field(LazyLoad = true, Length = 10000)] - public Byte[] Photo { get; set; } - - [Field] - public EntitySet Friends { get; private set; } - - [Field(Length = 100)] - public string Email - { - get { return GetFieldValue("Email"); } - set - { - SetFieldValue("Email", value); - Mailer.SendEmailChangedNotification(this); - } - } - } - - public static class Mailer - { - public static void SendEmailChangedNotification(Person person) - { - } - } - - [TestFixture] - public class TestFixture - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person)); - Domain.Build(config); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.24 + + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Persistent +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public DateTime BirthDay { get; set; } + + [Field(LazyLoad = true, Length = 10000)] + public Byte[] Photo { get; set; } + + [Field] + public EntitySet Friends { get; private set; } + + [Field(Length = 100)] + public string Email + { + get { return GetFieldValue("Email"); } + set + { + SetFieldValue("Email", value); + Mailer.SendEmailChangedNotification(this); + } + } + } + + public static class Mailer + { + public static void SendEmailChangedNotification(Person person) + { + } + } + + [TestFixture] + public class TestFixture + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person)); + Domain.Build(config); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Prefetch/Prefetch.sql b/Orm/Xtensive.Orm.Manual/Prefetch/Prefetch.sql index ab21bf06ad..4f9e5df5c7 100644 --- a/Orm/Xtensive.Orm.Manual/Prefetch/Prefetch.sql +++ b/Orm/Xtensive.Orm.Manual/Prefetch/Prefetch.sql @@ -1,44 +1,44 @@ --- Batch 1 -SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a]; - --- Batch 2 -exec sp_executesql N' -SELECT [a].[Id], [a].[TypeId], [a].[Photo] FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Photo], [b].[Manager.Id] - FROM [dbo].[Person] [b]) [a] -WHERE [a].[Id] IN (@p1_0_0_0, @p1_0_1_0); - -SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a] -WHERE ([a].[Manager.Id] = @p2_0); - -SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a] -WHERE ([a].[Manager.Id] = @p3_0); - -',N'@p1_0_0_0 int,@p1_0_1_0 int,@p2_0 int,@p3_0 int',@p1_0_0_0=1,@p1_0_1_0=2,@p2_0=1,@p3_0=2 - - --- Batch 1 -SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a]; - --- Batch 2 -exec sp_executesql N' -SELECT [a].[Id], [a].[TypeId], [a].[Photo] FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Photo], [b].[Manager.Id] - FROM [dbo].[Person] [b]) [a] -WHERE [a].[Id] IN (@p1_0_0_0, @p1_0_1_0); - -SELECT TOP 40 [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] -FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] - FROM [dbo].[Person] [b] - WHERE ([b].[Manager.Id] = @p2_0)) [a] -ORDER BY [a].[Id] ASC; - -SELECT TOP 40 [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] -FROM ( - SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] - FROM [dbo].[Person] [b] - WHERE ([b].[Manager.Id] = @p3_0)) [a] -ORDER BY [a].[Id] ASC; - +-- Batch 1 +SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a]; + +-- Batch 2 +exec sp_executesql N' +SELECT [a].[Id], [a].[TypeId], [a].[Photo] FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Photo], [b].[Manager.Id] + FROM [dbo].[Person] [b]) [a] +WHERE [a].[Id] IN (@p1_0_0_0, @p1_0_1_0); + +SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a] +WHERE ([a].[Manager.Id] = @p2_0); + +SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a] +WHERE ([a].[Manager.Id] = @p3_0); + +',N'@p1_0_0_0 int,@p1_0_1_0 int,@p2_0 int,@p3_0 int',@p1_0_0_0=1,@p1_0_1_0=2,@p2_0=1,@p3_0=2 + + +-- Batch 1 +SELECT [a].[Id], 101 AS [TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] FROM [dbo].[Person] [a]; + +-- Batch 2 +exec sp_executesql N' +SELECT [a].[Id], [a].[TypeId], [a].[Photo] FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Photo], [b].[Manager.Id] + FROM [dbo].[Person] [b]) [a] +WHERE [a].[Id] IN (@p1_0_0_0, @p1_0_1_0); + +SELECT TOP 40 [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] +FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] + FROM [dbo].[Person] [b] + WHERE ([b].[Manager.Id] = @p2_0)) [a] +ORDER BY [a].[Id] ASC; + +SELECT TOP 40 [a].[Id], [a].[TypeId], [a].[Name], [a].[BirthDay], [a].[Manager.Id] +FROM ( + SELECT [b].[Id], 101 AS [TypeId], [b].[Name], [b].[BirthDay], [b].[Manager.Id] + FROM [dbo].[Person] [b] + WHERE ([b].[Manager.Id] = @p3_0)) [a] +ORDER BY [a].[Id] ASC; + ',N'@p1_0_0_0 int,@p1_0_1_0 int,@p2_0 int,@p3_0 int',@p1_0_0_0=1,@p1_0_1_0=2,@p2_0=1,@p3_0=2 \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Prefetch/PrefetchTest.cs b/Orm/Xtensive.Orm.Manual/Prefetch/PrefetchTest.cs index 974346f210..583ea20653 100644 --- a/Orm/Xtensive.Orm.Manual/Prefetch/PrefetchTest.cs +++ b/Orm/Xtensive.Orm.Manual/Prefetch/PrefetchTest.cs @@ -1,276 +1,276 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.24 - -using System; -using NUnit.Framework; -using System.Linq; -using System.Threading.Tasks; -using Xtensive.Core; -using Xtensive.Orm.Internals.Prefetch; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Prefetch -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public DateTime BirthDay { get; set; } - - [Field(LazyLoad = true, Length = 65536)] - public byte[] Photo { get; set; } - - [Field] - public Person Manager { get; set; } - - [Field] - [Association(PairTo = "Manager")] - public EntitySet Employees { get; private set; } - - public Key ManagerKey { - get { return GetReferenceKey(TypeInfo.Fields["Manager"]); } - } - - public Person(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class PrefetchTest - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - - var employee = new Person(session) {Name = "Employee", Photo = new byte[] {8, 0}}; - var manager = new Person(session) {Name = "Manager", Photo = new byte[] {8, 0}}; - manager.Employees.Add(employee); - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var persons = session.Query.All() - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => e.Photo)) // and lazy load field of each of its items - .Prefetch(p => p.Manager); // Referenced entity - foreach (var person in persons) { - // some code here... - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var personIds = session.Query.All().Select(p => p.Id); - var prefetchedPersons = session.Query.Many(personIds) - .Prefetch(p => new { p.Photo, p.Manager }) // Lazy load field and Referenced entity - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => new { e.Photo, e.Manager })); // and lazy load field and referenced entity of each of its items - foreach (var person in prefetchedPersons) { - // some code here... - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var persons = session.Query.All() - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees.Prefetch(e => e.Photo)) // EntitySet Employees and lazy load field of each of its items with the limit on number of items to be loaded - .Prefetch(p => p.Manager.Photo); // Referenced entity and lazy load field for each of them - foreach (var person in persons) { - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); - if (person.ManagerKey != null) { - Assert.IsNotNull(DirectStateAccessor.Get(session)[person.ManagerKey]); - Assert.IsTrue(DirectStateAccessor.Get(person.Manager).GetFieldState("Photo")==PersistentFieldState.Loaded); - } - // some code here... - } - transactionScope.Complete(); - } - } - - [Test] - public async Task MainAsyncTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var employee = new Person(session) {Name = "Employee", Photo = new byte[] {8, 0}}; - var manager = new Person(session) {Name = "Manager", Photo = new byte[] {8, 0}}; - manager.Employees.Add(employee); - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var persons = session.Query.All() - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => e.Photo)) // and lazy load field of each of its items - .Prefetch(p => p.Manager) // Referenced entity - .AsAsync(); - foreach (var person in await persons) { - // some code here... - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var personIds = session.Query.All().Select(p => p.Id); - var prefetchedPersons = session.Query.Many(personIds) - .Prefetch(p => new {p.Photo, p.Manager}) // Lazy load field and Referenced entity - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => new {e.Photo, e.Manager})) // and lazy load field and referenced entity of each of its items - .AsAsync(); - foreach (var person in await prefetchedPersons) { - // some code here... - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var persons = session.Query.All() - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees.Prefetch(e => e.Photo)) // EntitySet Employees and lazy load field of each of its items with the limit on number of items to be loaded - .Prefetch(p => p.Manager.Photo) // Referenced entity and lazy load field for each of them - .AsAsync(); - foreach (var person in await persons) { - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); - if (person.ManagerKey!=null) { - Assert.IsNotNull(DirectStateAccessor.Get(session)[person.ManagerKey]); - Assert.IsTrue(DirectStateAccessor.Get(person.Manager).GetFieldState("Photo")==PersistentFieldState.Loaded); - } - // some code here... - } - transactionScope.Complete(); - } - } - - [Test] - public void MultipleBatchesTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - var domain = Domain.Build(config); - - int count = 1000; - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var random = new Random(10); - for (int i = 0; i < count; i++) - new Person(session) {Name = i.ToString(), Photo = new[] {(byte) (i % 256)}}; - var persons = session.Query.All().OrderBy(p => p.Id).ToArray(); - for (int i = 0; i0) - person.Manager = persons[random.Next(count)]; - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var prefetchedPersons = ( - from person in session.Query.All() - orderby person.Name - select person) - .Take(100) - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => e.Photo)) // and lazy load field of each of its items - .Prefetch(p => p.Manager); // Referenced entity - foreach (var person in prefetchedPersons) { - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person.Employees).IsFullyLoaded); - foreach (var employee in person.Employees) - Assert.IsTrue(DirectStateAccessor.Get(employee).GetFieldState("Photo")==PersistentFieldState.Loaded); - } - transactionScope.Complete(); - } - } - - [Test] - public async Task MultipleBatchesAsyncTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - var domain = Domain.Build(config); - - int count = 1000; - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()){ - var random = new Random(10); - for (int i = 0; i < count; i++) - new Person(session) { Name = i.ToString(), Photo = new[] { (byte)(i % 256) } }; - var persons = session.Query.All().OrderBy(p => p.Id).ToArray(); - for (int i = 0; i < count; i++) { - var person = persons[i]; - if (random.Next(5) > 0) - person.Manager = persons[random.Next(count)]; - } - transactionScope.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var prefetchedPersons = ( - from person in session.Query.All() - orderby person.Name - select person) - .Take(100) - .Prefetch(p => p.Photo) // Lazy load field - .Prefetch(p => p.Employees // EntitySet Employees - .Prefetch(e => e.Photo)) // and lazy load field of each of its items - .Prefetch(p => p.Manager) // Referenced entity - .AsAsync(); - foreach (var person in await prefetchedPersons) { - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); - Assert.IsTrue(DirectStateAccessor.Get(person.Employees).IsFullyLoaded); - foreach (var employee in person.Employees) - Assert.IsTrue(DirectStateAccessor.Get(employee).GetFieldState("Photo")==PersistentFieldState.Loaded); - } - transactionScope.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.24 + +using System; +using NUnit.Framework; +using System.Linq; +using System.Threading.Tasks; +using Xtensive.Core; +using Xtensive.Orm.Internals.Prefetch; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Prefetch +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public DateTime BirthDay { get; set; } + + [Field(LazyLoad = true, Length = 65536)] + public byte[] Photo { get; set; } + + [Field] + public Person Manager { get; set; } + + [Field] + [Association(PairTo = "Manager")] + public EntitySet Employees { get; private set; } + + public Key ManagerKey { + get { return GetReferenceKey(TypeInfo.Fields["Manager"]); } + } + + public Person(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class PrefetchTest + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + + var employee = new Person(session) {Name = "Employee", Photo = new byte[] {8, 0}}; + var manager = new Person(session) {Name = "Manager", Photo = new byte[] {8, 0}}; + manager.Employees.Add(employee); + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var persons = session.Query.All() + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => e.Photo)) // and lazy load field of each of its items + .Prefetch(p => p.Manager); // Referenced entity + foreach (var person in persons) { + // some code here... + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var personIds = session.Query.All().Select(p => p.Id); + var prefetchedPersons = session.Query.Many(personIds) + .Prefetch(p => new { p.Photo, p.Manager }) // Lazy load field and Referenced entity + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => new { e.Photo, e.Manager })); // and lazy load field and referenced entity of each of its items + foreach (var person in prefetchedPersons) { + // some code here... + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var persons = session.Query.All() + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees.Prefetch(e => e.Photo)) // EntitySet Employees and lazy load field of each of its items with the limit on number of items to be loaded + .Prefetch(p => p.Manager.Photo); // Referenced entity and lazy load field for each of them + foreach (var person in persons) { + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); + if (person.ManagerKey != null) { + Assert.IsNotNull(DirectStateAccessor.Get(session)[person.ManagerKey]); + Assert.IsTrue(DirectStateAccessor.Get(person.Manager).GetFieldState("Photo")==PersistentFieldState.Loaded); + } + // some code here... + } + transactionScope.Complete(); + } + } + + [Test] + public async Task MainAsyncTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var employee = new Person(session) {Name = "Employee", Photo = new byte[] {8, 0}}; + var manager = new Person(session) {Name = "Manager", Photo = new byte[] {8, 0}}; + manager.Employees.Add(employee); + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var persons = session.Query.All() + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => e.Photo)) // and lazy load field of each of its items + .Prefetch(p => p.Manager) // Referenced entity + .AsAsync(); + foreach (var person in await persons) { + // some code here... + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var personIds = session.Query.All().Select(p => p.Id); + var prefetchedPersons = session.Query.Many(personIds) + .Prefetch(p => new {p.Photo, p.Manager}) // Lazy load field and Referenced entity + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => new {e.Photo, e.Manager})) // and lazy load field and referenced entity of each of its items + .AsAsync(); + foreach (var person in await prefetchedPersons) { + // some code here... + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var persons = session.Query.All() + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees.Prefetch(e => e.Photo)) // EntitySet Employees and lazy load field of each of its items with the limit on number of items to be loaded + .Prefetch(p => p.Manager.Photo) // Referenced entity and lazy load field for each of them + .AsAsync(); + foreach (var person in await persons) { + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); + if (person.ManagerKey!=null) { + Assert.IsNotNull(DirectStateAccessor.Get(session)[person.ManagerKey]); + Assert.IsTrue(DirectStateAccessor.Get(person.Manager).GetFieldState("Photo")==PersistentFieldState.Loaded); + } + // some code here... + } + transactionScope.Complete(); + } + } + + [Test] + public void MultipleBatchesTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + var domain = Domain.Build(config); + + int count = 1000; + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var random = new Random(10); + for (int i = 0; i < count; i++) + new Person(session) {Name = i.ToString(), Photo = new[] {(byte) (i % 256)}}; + var persons = session.Query.All().OrderBy(p => p.Id).ToArray(); + for (int i = 0; i0) + person.Manager = persons[random.Next(count)]; + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var prefetchedPersons = ( + from person in session.Query.All() + orderby person.Name + select person) + .Take(100) + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => e.Photo)) // and lazy load field of each of its items + .Prefetch(p => p.Manager); // Referenced entity + foreach (var person in prefetchedPersons) { + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person.Employees).IsFullyLoaded); + foreach (var employee in person.Employees) + Assert.IsTrue(DirectStateAccessor.Get(employee).GetFieldState("Photo")==PersistentFieldState.Loaded); + } + transactionScope.Complete(); + } + } + + [Test] + public async Task MultipleBatchesAsyncTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + var domain = Domain.Build(config); + + int count = 1000; + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()){ + var random = new Random(10); + for (int i = 0; i < count; i++) + new Person(session) { Name = i.ToString(), Photo = new[] { (byte)(i % 256) } }; + var persons = session.Query.All().OrderBy(p => p.Id).ToArray(); + for (int i = 0; i < count; i++) { + var person = persons[i]; + if (random.Next(5) > 0) + person.Manager = persons[random.Next(count)]; + } + transactionScope.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var prefetchedPersons = ( + from person in session.Query.All() + orderby person.Name + select person) + .Take(100) + .Prefetch(p => p.Photo) // Lazy load field + .Prefetch(p => p.Employees // EntitySet Employees + .Prefetch(e => e.Photo)) // and lazy load field of each of its items + .Prefetch(p => p.Manager) // Referenced entity + .AsAsync(); + foreach (var person in await prefetchedPersons) { + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager")==PersistentFieldState.Loaded); + Assert.IsTrue(DirectStateAccessor.Get(person.Employees).IsFullyLoaded); + foreach (var employee in person.Employees) + Assert.IsTrue(DirectStateAccessor.Get(employee).GetFieldState("Photo")==PersistentFieldState.Loaded); + } + transactionScope.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Services/DirectSqlAccessorTest.cs b/Orm/Xtensive.Orm.Manual/Services/DirectSqlAccessorTest.cs index 30a3e89adc..a5f0daf8fa 100644 --- a/Orm/Xtensive.Orm.Manual/Services/DirectSqlAccessorTest.cs +++ b/Orm/Xtensive.Orm.Manual/Services/DirectSqlAccessorTest.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2010.02.24 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Services; - -namespace Xtensive.Orm.Manual.Services -{ - [TestFixture] - public sealed class DirectSqlAccessorTest - { - #region Model - - [HierarchyRoot] - public class Article : Entity - { - [Field, Key] - public int Id {get; private set;} - [Field] - public string Title { get; set; } - [Field] - public string Content { get; set; } - - public Article(Session session) - : base(session) - {} - } - - #endregion - - [Test] - public void CombinedTest() - { - var domain = BuildDomain(); - - using (var session = domain.OpenSession()) { - var directSql = session.Services.Demand(); - using (var t = session.OpenTransaction()) { - var article = new Article(session) {Title = "Some title", Content = "Some content"}; - session.SaveChanges(); // Ensures changes are flushed - - // Article is created: - Assert.IsFalse(article.IsRemoved); - - // Direct SQL command execution - var command = session.Services.Demand().CreateCommand(); - command.CommandText = "DELETE FROM [dbo].[DirectSqlAccessorTest.Article];"; - command.ExecuteNonQuery(); - - // Let's invalidate session cache after this - DirectStateAccessor.Get(session).Invalidate(); - - // Entity is really removed: - Assert.IsTrue(article.IsRemoved); - Assert.IsNull(session.Query.SingleOrDefault(article.Key)); - - t.Complete(); - } - } - } - - private static Domain BuildDomain() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof(Simple).Assembly, typeof(Simple).Namespace); - return Domain.Build(config); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2010.02.24 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Manual.Services +{ + [TestFixture] + public sealed class DirectSqlAccessorTest + { + #region Model + + [HierarchyRoot] + public class Article : Entity + { + [Field, Key] + public int Id {get; private set;} + [Field] + public string Title { get; set; } + [Field] + public string Content { get; set; } + + public Article(Session session) + : base(session) + {} + } + + #endregion + + [Test] + public void CombinedTest() + { + var domain = BuildDomain(); + + using (var session = domain.OpenSession()) { + var directSql = session.Services.Demand(); + using (var t = session.OpenTransaction()) { + var article = new Article(session) {Title = "Some title", Content = "Some content"}; + session.SaveChanges(); // Ensures changes are flushed + + // Article is created: + Assert.IsFalse(article.IsRemoved); + + // Direct SQL command execution + var command = session.Services.Demand().CreateCommand(); + command.CommandText = "DELETE FROM [dbo].[DirectSqlAccessorTest.Article];"; + command.ExecuteNonQuery(); + + // Let's invalidate session cache after this + DirectStateAccessor.Get(session).Invalidate(); + + // Entity is really removed: + Assert.IsTrue(article.IsRemoved); + Assert.IsNull(session.Query.SingleOrDefault(article.Key)); + + t.Complete(); + } + } + } + + private static Domain BuildDomain() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof(Simple).Assembly, typeof(Simple).Namespace); + return Domain.Build(config); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Services/DirectStateAccessorTest.cs b/Orm/Xtensive.Orm.Manual/Services/DirectStateAccessorTest.cs index 2709a6ea7c..ff6c17d6ed 100644 --- a/Orm/Xtensive.Orm.Manual/Services/DirectStateAccessorTest.cs +++ b/Orm/Xtensive.Orm.Manual/Services/DirectStateAccessorTest.cs @@ -1,161 +1,161 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2010.02.24 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Services -{ - #region Model - - [HierarchyRoot] - public class Simple : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Value { get; set; } - - public Simple(Session session) - : base(session) - {} - } - - [HierarchyRoot] - public class Container : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public EntitySet Entities { get; private set; } - - public Container(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public sealed class DirectStateAccessorTest - { - [Test] - public void SessionStateAccessorTest() - { - var domain = BuildDomain(); - - using (var session = domain.OpenSession()) { - Key entityKey; - string originalValue; - using (var tx = session.OpenTransaction()) { - var entity = new Simple (session) { - Value = Guid.NewGuid().ToString() - }; - entityKey = entity.Key; - session.SaveChanges(); - - // Let's get session cache accessor - var sessionState = DirectStateAccessor.Get(session); - - // Get the number of cached entities - Assert.AreEqual(1, sessionState.Count); - - // Enumerate cached entites - foreach (var e in sessionState) { - if (e==entity) - continue; - Assert.Fail(); - } - - // Let's remember the value & change it - originalValue = entity.Value; - entity.Value += "Modified"; - - // Clear cached state of all the entities in session - sessionState.Invalidate(); - - // The field value hasn't been modified due to invalidation - Assert.AreEqual(originalValue, entity.Value); - - tx.Complete(); - } - } - } - - [Test] - public void PersistentStateAccessorTest() - { - var domain = BuildDomain(); - - using (var session = domain.OpenSession()) { - Key entityKey; - using (var tx = session.OpenTransaction()) { - var entity = new Simple (session) {Value = Guid.NewGuid().ToString()}; - entityKey = entity.Key; - tx.Complete(); - } - using (var tx = session.OpenTransaction()) { - var entity = session.Query.Single(entityKey); - var entityState = DirectStateAccessor.Get(entity); - - var valueFieldState = entityState.GetFieldState("Value"); - Assert.AreEqual(PersistentFieldState.Loaded, valueFieldState); - - entity.Value += "Modified"; - valueFieldState = entityState.GetFieldState("Value"); - Assert.AreEqual(PersistentFieldState.Modified, valueFieldState); - - tx.Complete(); - } - } - } - - [Test] - public void EntitySetAccessorTest() - { - var domain = BuildDomain(); - - using (var session = domain.OpenSession()) { - Key containerKey; - Key firstContainedKey; - using (var tx = session.OpenTransaction()) { - var container = new Container(session); - containerKey = container.Key; - container.Entities.Add(new Simple(session)); - firstContainedKey = container.Entities.Single().Key; - container.Entities.Add(new Simple(session)); - container.Entities.Add(new Simple(session)); - tx.Complete(); - } - using (var tx = session.OpenTransaction()) { - var container = session.Query.Single(containerKey); - var entitySetState = DirectStateAccessor.Get(container.Entities); - Assert.IsFalse(entitySetState.IsFullyLoaded); - foreach (var simple in container.Entities) { - break; // To do nothing, but just call GetEnumerator() - } - Assert.IsTrue(entitySetState.IsFullyLoaded); // Enumeration attempt leads to full loading - Assert.IsTrue(entitySetState.IsCountAvailable); // So Count is available as well - Assert.AreEqual(3, entitySetState.Count); - Assert.IsTrue(entitySetState.Contains(firstContainedKey)); - } - } - } - - private static Domain BuildDomain() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.Types.Register(typeof(Simple).Assembly, typeof(Simple).Namespace); - return Domain.Build(config); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2010.02.24 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Services +{ + #region Model + + [HierarchyRoot] + public class Simple : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Value { get; set; } + + public Simple(Session session) + : base(session) + {} + } + + [HierarchyRoot] + public class Container : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public EntitySet Entities { get; private set; } + + public Container(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public sealed class DirectStateAccessorTest + { + [Test] + public void SessionStateAccessorTest() + { + var domain = BuildDomain(); + + using (var session = domain.OpenSession()) { + Key entityKey; + string originalValue; + using (var tx = session.OpenTransaction()) { + var entity = new Simple (session) { + Value = Guid.NewGuid().ToString() + }; + entityKey = entity.Key; + session.SaveChanges(); + + // Let's get session cache accessor + var sessionState = DirectStateAccessor.Get(session); + + // Get the number of cached entities + Assert.AreEqual(1, sessionState.Count); + + // Enumerate cached entites + foreach (var e in sessionState) { + if (e==entity) + continue; + Assert.Fail(); + } + + // Let's remember the value & change it + originalValue = entity.Value; + entity.Value += "Modified"; + + // Clear cached state of all the entities in session + sessionState.Invalidate(); + + // The field value hasn't been modified due to invalidation + Assert.AreEqual(originalValue, entity.Value); + + tx.Complete(); + } + } + } + + [Test] + public void PersistentStateAccessorTest() + { + var domain = BuildDomain(); + + using (var session = domain.OpenSession()) { + Key entityKey; + using (var tx = session.OpenTransaction()) { + var entity = new Simple (session) {Value = Guid.NewGuid().ToString()}; + entityKey = entity.Key; + tx.Complete(); + } + using (var tx = session.OpenTransaction()) { + var entity = session.Query.Single(entityKey); + var entityState = DirectStateAccessor.Get(entity); + + var valueFieldState = entityState.GetFieldState("Value"); + Assert.AreEqual(PersistentFieldState.Loaded, valueFieldState); + + entity.Value += "Modified"; + valueFieldState = entityState.GetFieldState("Value"); + Assert.AreEqual(PersistentFieldState.Modified, valueFieldState); + + tx.Complete(); + } + } + } + + [Test] + public void EntitySetAccessorTest() + { + var domain = BuildDomain(); + + using (var session = domain.OpenSession()) { + Key containerKey; + Key firstContainedKey; + using (var tx = session.OpenTransaction()) { + var container = new Container(session); + containerKey = container.Key; + container.Entities.Add(new Simple(session)); + firstContainedKey = container.Entities.Single().Key; + container.Entities.Add(new Simple(session)); + container.Entities.Add(new Simple(session)); + tx.Complete(); + } + using (var tx = session.OpenTransaction()) { + var container = session.Query.Single(containerKey); + var entitySetState = DirectStateAccessor.Get(container.Entities); + Assert.IsFalse(entitySetState.IsFullyLoaded); + foreach (var simple in container.Entities) { + break; // To do nothing, but just call GetEnumerator() + } + Assert.IsTrue(entitySetState.IsFullyLoaded); // Enumeration attempt leads to full loading + Assert.IsTrue(entitySetState.IsCountAvailable); // So Count is available as well + Assert.AreEqual(3, entitySetState.Count); + Assert.IsTrue(entitySetState.Contains(firstContainedKey)); + } + } + } + + private static Domain BuildDomain() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.Types.Register(typeof(Simple).Assembly, typeof(Simple).Namespace); + return Domain.Build(config); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Structures/TestFixture.cs b/Orm/Xtensive.Orm.Manual/Structures/TestFixture.cs index b0625757a2..615940817c 100644 --- a/Orm/Xtensive.Orm.Manual/Structures/TestFixture.cs +++ b/Orm/Xtensive.Orm.Manual/Structures/TestFixture.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.16 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Structures -{ - [Serializable] - public class Point : Structure - { - [Field] - public int X { get; set; } - - [Field] - public int Y { get; set; } - - public Point() {} - - public Point(int x, int y) - { - X = x; - Y = y; - } - } - - [Serializable] - [HierarchyRoot] - public class Range : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Point Left { get; set; } - - [Field] - public Point Right { get; set; } - - public Range(Session session) - : base(session) - {} - } -} - -namespace Xtensive.Orm.Manual.Structures -{ - [TestFixture] - public class TestFixture - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Range).Assembly, typeof (Range).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - // Example 1 - Range range = new Range(session); - range.Left.X = 0; - range.Left.Y = 0; - - // getting "range.Left" value - Point point = range.Left; - // "range.Left" & "point" are the same instance - Assert.IsTrue(ReferenceEquals(point, range.Left)); - - // Let's modify "point" instance. - // "range.Left" will be changed automatically - point.X = 10; - Assert.AreEqual(10, range.Left.X); - - // Example 2 - // Copy-on-assignment behavior - range.Right = range.Left; - // Instances are not equal although they have the same values - Assert.IsFalse(ReferenceEquals(range.Right, range.Left)); - Assert.AreEqual(range.Right.X, range.Left.X); - Assert.AreEqual(range.Right.Y, range.Left.Y); - - // Example 3 - var points = session.Query.All().Select(r => r.Left); - // or - var ranges = session.Query.All().Where(r => r.Left == new Point(0, 10)); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.16 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Structures +{ + [Serializable] + public class Point : Structure + { + [Field] + public int X { get; set; } + + [Field] + public int Y { get; set; } + + public Point() {} + + public Point(int x, int y) + { + X = x; + Y = y; + } + } + + [Serializable] + [HierarchyRoot] + public class Range : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Point Left { get; set; } + + [Field] + public Point Right { get; set; } + + public Range(Session session) + : base(session) + {} + } +} + +namespace Xtensive.Orm.Manual.Structures +{ + [TestFixture] + public class TestFixture + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Range).Assembly, typeof (Range).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + // Example 1 + Range range = new Range(session); + range.Left.X = 0; + range.Left.Y = 0; + + // getting "range.Left" value + Point point = range.Left; + // "range.Left" & "point" are the same instance + Assert.IsTrue(ReferenceEquals(point, range.Left)); + + // Let's modify "point" instance. + // "range.Left" will be changed automatically + point.X = 10; + Assert.AreEqual(10, range.Left.X); + + // Example 2 + // Copy-on-assignment behavior + range.Right = range.Left; + // Instances are not equal although they have the same values + Assert.IsFalse(ReferenceEquals(range.Right, range.Left)); + Assert.AreEqual(range.Right.X, range.Left.X); + Assert.AreEqual(range.Right.Y, range.Left.Y); + + // Example 3 + var points = session.Query.All().Select(r => r.Left); + // or + var ranges = session.Query.All().Where(r => r.Left == new Point(0, 10)); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Transactions/NestedTransactionsTest.cs b/Orm/Xtensive.Orm.Manual/Transactions/NestedTransactionsTest.cs index 059be8831d..5e26b584ba 100644 --- a/Orm/Xtensive.Orm.Manual/Transactions/NestedTransactionsTest.cs +++ b/Orm/Xtensive.Orm.Manual/Transactions/NestedTransactionsTest.cs @@ -1,150 +1,150 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.12.23 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm; - -namespace Xtensive.Orm.Manual.Transactions.NestedTransactions -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class User : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - - [Field] - public EntitySet FavoritePages { get; private set; } - - [Field] - [Association( - OnOwnerRemove = OnRemoveAction.Cascade, - OnTargetRemove = OnRemoveAction.Clear)] - public WebPage PersonalPage { get; set; } - - [Field] - [Association(PairTo = "Author")] - public EntitySet BlogPosts { get; private set; } - - [Field] - [Association(PairTo = "Friends")] - public EntitySet Friends { get; private set; } - - public void RemoveAndCancel() - { - using (Session.OpenTransaction(TransactionOpenMode.New)) { - Remove(); - throw new InvalidOperationException("Cancelled."); - } - } - - public User(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class WebPage : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Title { get; set; } - - [Field(Length = 200)] - public string Url { get; set; } - - public WebPage(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class BlogPost : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Title { get; set; } - - [Field(Length = 1000)] - public string Content { get; set; } - - [Field] - public User Author { get; set;} - - public BlogPost(Session session) - : base(session) - {} - } - - #endregion - - [TestFixture] - public class NestedTransactionsTest - { - [Test] - public void MainTest() - { - // Creatign new Domain configuration - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - // Modifying it by registering the persistent types - config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); - // And finally building the domain - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - // Creating user - var dmitri = new User (session) { - Name = "Dmitri" - }; - - // Modifying the entity - dmitri.Name = "Dmitri Maximov"; - - // Opening new nested transaction - using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { - // Removing the entity - dmitri.Remove(); - Assert.IsTrue(dmitri.IsRemoved); - AssertEx.Throws(() => { - var dmitryName = dmitri.Name; - }); - // No nestedScope.Complete(), so nested transaction will be rolled back - } - - // Transparent Entity state update - Assert.IsFalse(dmitri.IsRemoved); - Assert.AreEqual("Dmitri Maximov", dmitri.Name); - - // Repeating the same, but using transactional method - AssertEx.Throws(dmitri.RemoveAndCancel); - - // Transparent Entity state update - Assert.IsFalse(dmitri.IsRemoved); - Assert.AreEqual("Dmitri Maximov", dmitri.Name); - - // Marking the transaction scope as completed to commit it - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.12.23 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm; + +namespace Xtensive.Orm.Manual.Transactions.NestedTransactions +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class User : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + + [Field] + public EntitySet FavoritePages { get; private set; } + + [Field] + [Association( + OnOwnerRemove = OnRemoveAction.Cascade, + OnTargetRemove = OnRemoveAction.Clear)] + public WebPage PersonalPage { get; set; } + + [Field] + [Association(PairTo = "Author")] + public EntitySet BlogPosts { get; private set; } + + [Field] + [Association(PairTo = "Friends")] + public EntitySet Friends { get; private set; } + + public void RemoveAndCancel() + { + using (Session.OpenTransaction(TransactionOpenMode.New)) { + Remove(); + throw new InvalidOperationException("Cancelled."); + } + } + + public User(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class WebPage : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Title { get; set; } + + [Field(Length = 200)] + public string Url { get; set; } + + public WebPage(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class BlogPost : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Title { get; set; } + + [Field(Length = 1000)] + public string Content { get; set; } + + [Field] + public User Author { get; set;} + + public BlogPost(Session session) + : base(session) + {} + } + + #endregion + + [TestFixture] + public class NestedTransactionsTest + { + [Test] + public void MainTest() + { + // Creatign new Domain configuration + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + // Modifying it by registering the persistent types + config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); + // And finally building the domain + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + // Creating user + var dmitri = new User (session) { + Name = "Dmitri" + }; + + // Modifying the entity + dmitri.Name = "Dmitri Maximov"; + + // Opening new nested transaction + using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) { + // Removing the entity + dmitri.Remove(); + Assert.IsTrue(dmitri.IsRemoved); + AssertEx.Throws(() => { + var dmitryName = dmitri.Name; + }); + // No nestedScope.Complete(), so nested transaction will be rolled back + } + + // Transparent Entity state update + Assert.IsFalse(dmitri.IsRemoved); + Assert.AreEqual("Dmitri Maximov", dmitri.Name); + + // Repeating the same, but using transactional method + AssertEx.Throws(dmitri.RemoveAndCancel); + + // Transparent Entity state update + Assert.IsFalse(dmitri.IsRemoved); + Assert.AreEqual("Dmitri Maximov", dmitri.Name); + + // Marking the transaction scope as completed to commit it + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Transactions/SessionSwitchingTest.cs b/Orm/Xtensive.Orm.Manual/Transactions/SessionSwitchingTest.cs index 0f889dd1bd..1dc724501b 100644 --- a/Orm/Xtensive.Orm.Manual/Transactions/SessionSwitchingTest.cs +++ b/Orm/Xtensive.Orm.Manual/Transactions/SessionSwitchingTest.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.11 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using System.Linq; - -namespace Xtensive.Orm.Manual.Transactions.SessionSwitching -{ - #region Model - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 200)] - public string Name { get; set; } - } - - #endregion - - [TestFixture] - public class SessionSwitchingTest - { - private Domain existingDomain; - - [Test] - public void DenySwitchingTest() - { - var domain = GetDomain(); - - var sessionCfg = new SessionConfiguration(); - sessionCfg.Options |= SessionOptions.AutoActivation; - sessionCfg.Options |= SessionOptions.NonTransactionalReads; - - using (var sessionA = domain.OpenSession(sessionCfg)) { // Open & activate - var personA = sessionA.Query.All().First(); - using (var sessionB = domain.OpenSession(sessionCfg)) { // Open & activate - // Session switching (from sessionB to sessionA) will be detected here, - // but allowed, since there is no running transaction - string name = personA.Name; - - using (var tx = Session.Demand().OpenTransaction()) { - // Session switching (from sessionB to sessionA) will be detected & blocked here - AssertEx.Throws(() => { - name = personA.Name; - }); - // Blocking session switching check - using (Session.Deactivate()) { - name = personA.Name; - } - } - } - } - } - - [Test] - public void AllowSwitchingTest() - { - var domain = GetDomain(); - - var sessionCfg = new SessionConfiguration(); - sessionCfg.Options |= SessionOptions.AllowSwitching; - sessionCfg.Options |= SessionOptions.AutoActivation; - sessionCfg.Options |= SessionOptions.NonTransactionalReads; - - using (var sessionA = domain.OpenSession(sessionCfg)) { // Open & activate - var personA = sessionA.Query.All().First(); - using (var sessionB = domain.OpenSession(sessionCfg)) { // Open & activate - // Session switching (from sessionB to sessionA) will be detected here, but allowed - using (var tx = Session.Demand().OpenTransaction()) { - var name = personA.Name; - } - } - } - } - - private Domain GetDomain() - { - if (existingDomain==null) { - var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - var domain = Domain.Build(config); - var sessionCfg = new SessionConfiguration(); - sessionCfg.Options |= SessionOptions.AutoActivation; - using (var session = domain.OpenSession(sessionCfg)) { - using (var transactionScope = session.OpenTransaction()) { - // Creating initial content - new Person {Name = "Tereza"}; - new Person {Name = "Ivan"}; - - transactionScope.Complete(); - } - } - existingDomain = domain; - } - return existingDomain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.11 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using System.Linq; + +namespace Xtensive.Orm.Manual.Transactions.SessionSwitching +{ + #region Model + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 200)] + public string Name { get; set; } + } + + #endregion + + [TestFixture] + public class SessionSwitchingTest + { + private Domain existingDomain; + + [Test] + public void DenySwitchingTest() + { + var domain = GetDomain(); + + var sessionCfg = new SessionConfiguration(); + sessionCfg.Options |= SessionOptions.AutoActivation; + sessionCfg.Options |= SessionOptions.NonTransactionalReads; + + using (var sessionA = domain.OpenSession(sessionCfg)) { // Open & activate + var personA = sessionA.Query.All().First(); + using (var sessionB = domain.OpenSession(sessionCfg)) { // Open & activate + // Session switching (from sessionB to sessionA) will be detected here, + // but allowed, since there is no running transaction + string name = personA.Name; + + using (var tx = Session.Demand().OpenTransaction()) { + // Session switching (from sessionB to sessionA) will be detected & blocked here + AssertEx.Throws(() => { + name = personA.Name; + }); + // Blocking session switching check + using (Session.Deactivate()) { + name = personA.Name; + } + } + } + } + } + + [Test] + public void AllowSwitchingTest() + { + var domain = GetDomain(); + + var sessionCfg = new SessionConfiguration(); + sessionCfg.Options |= SessionOptions.AllowSwitching; + sessionCfg.Options |= SessionOptions.AutoActivation; + sessionCfg.Options |= SessionOptions.NonTransactionalReads; + + using (var sessionA = domain.OpenSession(sessionCfg)) { // Open & activate + var personA = sessionA.Query.All().First(); + using (var sessionB = domain.OpenSession(sessionCfg)) { // Open & activate + // Session switching (from sessionB to sessionA) will be detected here, but allowed + using (var tx = Session.Demand().OpenTransaction()) { + var name = personA.Name; + } + } + } + } + + private Domain GetDomain() + { + if (existingDomain==null) { + var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + var domain = Domain.Build(config); + var sessionCfg = new SessionConfiguration(); + sessionCfg.Options |= SessionOptions.AutoActivation; + using (var session = domain.OpenSession(sessionCfg)) { + using (var transactionScope = session.OpenTransaction()) { + // Creating initial content + new Person {Name = "Tereza"}; + new Person {Name = "Ivan"}; + + transactionScope.Complete(); + } + } + existingDomain = domain; + } + return existingDomain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_1/Model.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_1/Model.cs index 80122fecf2..adcbcee237 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_1/Model.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_1/Model.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.11 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Manual.Upgrade.Model_1 -{ - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - [Key, Field] - public int Id { get; private set;} - - [Field] - public string ProductName { get; set; } - - [Field] - public int Quantity { get; set; } - - public Order(Session session) - : base(session) - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.11 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Manual.Upgrade.Model_1 +{ + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + [Key, Field] + public int Id { get; private set;} + + [Field] + public string ProductName { get; set; } + + [Field] + public int Quantity { get; set; } + + public Order(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Model.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Model.cs index 90ef514a56..d05c6f9a77 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Model.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Model.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.11 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Manual.Upgrade.Model_2 -{ - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - [Key, Field] - public int Id { get; private set;} - - [Field] - public string ProductName { get; set; } - - [Field] - public Customer Customer { get; set;} - - [Field] - public int Quantity { get; set; } - - public Order(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Customer(Session session) - : base(session) - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.11 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Manual.Upgrade.Model_2 +{ + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + [Key, Field] + public int Id { get; private set;} + + [Field] + public string ProductName { get; set; } + + [Field] + public Customer Customer { get; set;} + + [Field] + public int Quantity { get; set; } + + public Order(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Customer(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Upgrader.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Upgrader.cs index 20644ac391..0dd02ad03a 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Upgrader.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_2/Upgrader.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.12 - -using System; -using System.Diagnostics; -using Xtensive.Collections; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Manual.Upgrade.Model_2 -{ - public class Upgrader : UpgradeHandler - { - public override bool IsEnabled - { - get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } - } - - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RenameTypeHint( - typeof (Model_1.Order).FullName, typeof (Order))); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.12 + +using System; +using System.Diagnostics; +using Xtensive.Collections; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Manual.Upgrade.Model_2 +{ + public class Upgrader : UpgradeHandler + { + public override bool IsEnabled + { + get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } + } + + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RenameTypeHint( + typeof (Model_1.Order).FullName, typeof (Order))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Model.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Model.cs index adb07db4df..478a26e707 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Model.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Model.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.12 - -using System; - -namespace Xtensive.Orm.Manual.Upgrade.Model_3 -{ - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - // ... - - [Key, Field] - public int Id { get; private set; } - - [Field] - public string ProductName { get; set; } - - [Field] - public int Quantity { get; set; } - - [Field] - public Person Customer { get; set;} - - public Order(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string FullName { get; set; } - - public Person(Session session) - : base(session) - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.12 + +using System; + +namespace Xtensive.Orm.Manual.Upgrade.Model_3 +{ + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + // ... + + [Key, Field] + public int Id { get; private set; } + + [Field] + public string ProductName { get; set; } + + [Field] + public int Quantity { get; set; } + + [Field] + public Person Customer { get; set;} + + public Order(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string FullName { get; set; } + + public Person(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Upgrader.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Upgrader.cs index c8e4ffd649..c6f7aae028 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Upgrader.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_3/Upgrader.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.12 - -using System; -using Xtensive.Collections; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Manual.Upgrade.Model_3 -{ - public class Upgrader : UpgradeHandler - { - public override bool IsEnabled - { - get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } - } - - protected override void AddUpgradeHints(ISet hints) - { - hints.Add( - new RenameTypeHint(typeof (Model_2.Order).FullName, typeof (Order))); - hints.Add( - new RenameTypeHint(typeof (Model_2.Customer).FullName, typeof (Person))); - hints.Add( - new RenameFieldHint(typeof (Person), "Name", "FullName")); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.12 + +using System; +using Xtensive.Collections; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Manual.Upgrade.Model_3 +{ + public class Upgrader : UpgradeHandler + { + public override bool IsEnabled + { + get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } + } + + protected override void AddUpgradeHints(ISet hints) + { + hints.Add( + new RenameTypeHint(typeof (Model_2.Order).FullName, typeof (Order))); + hints.Add( + new RenameTypeHint(typeof (Model_2.Customer).FullName, typeof (Person))); + hints.Add( + new RenameFieldHint(typeof (Person), "Name", "FullName")); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Model.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Model.cs index 468fe12049..ed00ca0278 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Model.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Model.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.19 - -using System; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Manual.Upgrade.Model_4 -{ - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - // ... - - [Key, Field] - public int Id { get; private set; } - - [Field] - public Product Product { get; set; } - - [Field, Obsolete, Recycled] - public string ProductName { get; set; } - - [Field] - public int Quantity { get; set; } - - [Field] - public Person Customer { get; set;} - - public Order(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Product : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Product(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string FullName { get; set; } - - public Person(Session session) - : base(session) - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.19 + +using System; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Manual.Upgrade.Model_4 +{ + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + // ... + + [Key, Field] + public int Id { get; private set; } + + [Field] + public Product Product { get; set; } + + [Field, Obsolete, Recycled] + public string ProductName { get; set; } + + [Field] + public int Quantity { get; set; } + + [Field] + public Person Customer { get; set;} + + public Order(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Product : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Product(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string FullName { get; set; } + + public Person(Session session) + : base(session) + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Upgrader.cs b/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Upgrader.cs index 8f08911a70..b21b55c35b 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Upgrader.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/Model_4/Upgrader.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.19 - -using System; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Manual.Upgrade.Model_4 -{ - public class Upgrader : UpgradeHandler - { - public override bool IsEnabled - { - get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } - } - - protected override void AddUpgradeHints(ISet hints) - { - hints.Add( - new RenameTypeHint(typeof (Model_3.Order).FullName, typeof (Order))); - hints.Add( - new RenameTypeHint(typeof (Model_3.Person).FullName, typeof (Person))); - } - - public override void OnUpgrade() - { - var session = Session.Demand(); - foreach (var order in session.Query.All()) { - var product = session.Query.All() -#pragma warning disable 612,618 - .SingleOrDefault(p => p.Name==order.ProductName); -#pragma warning restore 612,618 - if (product==null) -#pragma warning disable 612,618 - product = new Product (session) { Name = order.ProductName }; -#pragma warning restore 612,618 - order.Product = product; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.19 + +using System; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Manual.Upgrade.Model_4 +{ + public class Upgrader : UpgradeHandler + { + public override bool IsEnabled + { + get { return UpgradeHandlerEnabler.EnabledUpgradeHandler==GetType(); } + } + + protected override void AddUpgradeHints(ISet hints) + { + hints.Add( + new RenameTypeHint(typeof (Model_3.Order).FullName, typeof (Order))); + hints.Add( + new RenameTypeHint(typeof (Model_3.Person).FullName, typeof (Person))); + } + + public override void OnUpgrade() + { + var session = Session.Demand(); + foreach (var order in session.Query.All()) { + var product = session.Query.All() +#pragma warning disable 612,618 + .SingleOrDefault(p => p.Name==order.ProductName); +#pragma warning restore 612,618 + if (product==null) +#pragma warning disable 612,618 + product = new Product (session) { Name = order.ProductName }; +#pragma warning restore 612,618 + order.Product = product; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeHandlerEnabler.cs b/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeHandlerEnabler.cs index fdcd6c39f0..60bb322066 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeHandlerEnabler.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeHandlerEnabler.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.12 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Manual.Upgrade -{ - public static class UpgradeHandlerEnabler - { - public static Type EnabledUpgradeHandler { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.12 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Manual.Upgrade +{ + public static class UpgradeHandlerEnabler + { + public static Type EnabledUpgradeHandler { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeTest.cs b/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeTest.cs index a729700d2c..3ae4fe1961 100644 --- a/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Manual/Upgrade/UpgradeTest.cs @@ -1,135 +1,135 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.11.11 - -using System; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Manual.Upgrade -{ - [TestFixture] - public class UpgradeTest - { - private readonly Assembly myAssembly = typeof (Model_1.Order).Assembly; - - [Test] - public void Test() - { - UpgradeHandlerEnabler.EnabledUpgradeHandler = null; - try { - BuildFirstDomain(); - - UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_2.Upgrader); - BuildSecondDomain(); - - UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_3.Upgrader); - BuildThirdDomain(); - - UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_4.Upgrader); - BuildFourthDomain(); - } - finally { - UpgradeHandlerEnabler.EnabledUpgradeHandler = null; - } - } - - private void BuildFirstDomain() - { - var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - domainConfig.Types.Register(myAssembly, typeof (Model_1.Order).Namespace); - domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; - var domain = Domain.Build(domainConfig); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var mMorder = - new Model_1.Order(session) { ProductName = "Cheese", Quantity = 10 }; - new Model_1.Order(session) { ProductName = "Wine", Quantity = 2 }; - new Model_1.Order(session) { ProductName = "Wine", Quantity = 5 }; - - transactionScope.Complete(); - } - } - } - - private void BuildSecondDomain() - { - var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - domainConfig.Types.Register(myAssembly, typeof (Model_2.Order).Namespace); - domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; - var domain = Domain.Build(domainConfig); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var cheeseOrder = session.Query.All().FirstOrDefault(o => o.ProductName == "Cheese"); - - Assert.IsNotNull(cheeseOrder); - Assert.AreEqual(10, cheeseOrder.Quantity); - Assert.IsNull(cheeseOrder.Customer); - cheeseOrder.Customer = new Model_2.Customer(session) {Name = "Michael"}; - - var customer = new Model_2.Customer(session) {Name = "Tony"}; - foreach (var order in session.Query.All()) - if (order.Customer==null) - order.Customer = customer; - - transactionScope.Complete(); - } - } - } - - public void BuildThirdDomain() - { - var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - domainConfig.Types.Register(myAssembly, typeof (Model_3.Order).Namespace); - domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; - var domain = Domain.Build(domainConfig); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var cheeseOrder = session.Query.All().FirstOrDefault(o => o.ProductName == "Cheese"); - - Assert.IsNotNull(cheeseOrder); - Assert.AreEqual(10, cheeseOrder.Quantity); - Assert.AreEqual("Michael", cheeseOrder.Customer.FullName); - - transactionScope.Complete(); - } - } - } - - public void BuildFourthDomain() - { - var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); - domainConfig.Types.Register(myAssembly, typeof (Model_4.Order).Namespace); - domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; - var domain = Domain.Build(domainConfig); - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - int productCount = session.Query.All().Count(); - Assert.AreEqual(2, productCount); - - var order = session.Query.All().First(); - - AssertEx.Throws(() => { -#pragma warning disable 612,618 - var name = order.ProductName; -#pragma warning restore 612,618 - }); - - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.11.11 + +using System; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Manual.Upgrade +{ + [TestFixture] + public class UpgradeTest + { + private readonly Assembly myAssembly = typeof (Model_1.Order).Assembly; + + [Test] + public void Test() + { + UpgradeHandlerEnabler.EnabledUpgradeHandler = null; + try { + BuildFirstDomain(); + + UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_2.Upgrader); + BuildSecondDomain(); + + UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_3.Upgrader); + BuildThirdDomain(); + + UpgradeHandlerEnabler.EnabledUpgradeHandler = typeof (Model_4.Upgrader); + BuildFourthDomain(); + } + finally { + UpgradeHandlerEnabler.EnabledUpgradeHandler = null; + } + } + + private void BuildFirstDomain() + { + var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + domainConfig.Types.Register(myAssembly, typeof (Model_1.Order).Namespace); + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + var domain = Domain.Build(domainConfig); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var mMorder = + new Model_1.Order(session) { ProductName = "Cheese", Quantity = 10 }; + new Model_1.Order(session) { ProductName = "Wine", Quantity = 2 }; + new Model_1.Order(session) { ProductName = "Wine", Quantity = 5 }; + + transactionScope.Complete(); + } + } + } + + private void BuildSecondDomain() + { + var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + domainConfig.Types.Register(myAssembly, typeof (Model_2.Order).Namespace); + domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; + var domain = Domain.Build(domainConfig); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var cheeseOrder = session.Query.All().FirstOrDefault(o => o.ProductName == "Cheese"); + + Assert.IsNotNull(cheeseOrder); + Assert.AreEqual(10, cheeseOrder.Quantity); + Assert.IsNull(cheeseOrder.Customer); + cheeseOrder.Customer = new Model_2.Customer(session) {Name = "Michael"}; + + var customer = new Model_2.Customer(session) {Name = "Tony"}; + foreach (var order in session.Query.All()) + if (order.Customer==null) + order.Customer = customer; + + transactionScope.Complete(); + } + } + } + + public void BuildThirdDomain() + { + var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + domainConfig.Types.Register(myAssembly, typeof (Model_3.Order).Namespace); + domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; + var domain = Domain.Build(domainConfig); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var cheeseOrder = session.Query.All().FirstOrDefault(o => o.ProductName == "Cheese"); + + Assert.IsNotNull(cheeseOrder); + Assert.AreEqual(10, cheeseOrder.Quantity); + Assert.AreEqual("Michael", cheeseOrder.Customer.FullName); + + transactionScope.Complete(); + } + } + } + + public void BuildFourthDomain() + { + var domainConfig = DomainConfigurationFactory.CreateWithoutSessionConfigurations(); + domainConfig.Types.Register(myAssembly, typeof (Model_4.Order).Namespace); + domainConfig.UpgradeMode = DomainUpgradeMode.PerformSafely; + var domain = Domain.Build(domainConfig); + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + int productCount = session.Query.All().Count(); + Assert.AreEqual(2, productCount); + + var order = session.Query.All().First(); + + AssertEx.Throws(() => { +#pragma warning disable 612,618 + var name = order.ProductName; +#pragma warning restore 612,618 + }); + + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Manual/Xtensive.Orm.Manual.csproj b/Orm/Xtensive.Orm.Manual/Xtensive.Orm.Manual.csproj index 5166bae242..dbb2f02849 100644 --- a/Orm/Xtensive.Orm.Manual/Xtensive.Orm.Manual.csproj +++ b/Orm/Xtensive.Orm.Manual/Xtensive.Orm.Manual.csproj @@ -1,46 +1,46 @@ - - - true - false - ..\..\_Build\$(Configuration)\lib\ - - - netcoreapp2.0 - Xtensive - Xtensive.Orm.Tests.Manual - true - ..\Orm.snk - true - 2 - - - TRACE;DEBUG;NETCOREAPP - - - TRACE;NETCOREAPP - - - - - - - - - - - - - - - - - - - - - - - - - + + + true + false + ..\..\_Build\$(Configuration)\lib\ + + + netcoreapp2.0 + Xtensive + Xtensive.Orm.Tests.Manual + true + ..\Orm.snk + true + 2 + + + TRACE;DEBUG;NETCOREAPP + + + TRACE;NETCOREAPP + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/DomainHandler.cs b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/DomainHandler.cs index 8c755a389e..9a8d023cc3 100644 --- a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/DomainHandler.cs +++ b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/DomainHandler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.MySql -{ - /// - /// A domain handler for MySql RDBMS. - /// - public class DomainHandler : Providers.DomainHandler - { - protected override ICompiler CreateCompiler(CompilerConfiguration configuration) - { - return new SqlCompiler(Handlers, configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.MySql +{ + /// + /// A domain handler for MySql RDBMS. + /// + public class DomainHandler : Providers.DomainHandler + { + protected override ICompiler CreateCompiler(CompilerConfiguration configuration) + { + return new SqlCompiler(Handlers, configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/HandlerFactory.cs b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/HandlerFactory.cs index b554f70d18..92e1f6b14b 100644 --- a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/HandlerFactory.cs +++ b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/HandlerFactory.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Providers.MySql -{ - /// - /// Storage provider for MySql. - /// - [Provider(WellKnown.Provider.MySql, typeof (Xtensive.Sql.Drivers.MySql.DriverFactory))] - public class HandlerFactory : Providers.HandlerFactory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Providers.MySql +{ + /// + /// Storage provider for MySql. + /// + [Provider(WellKnown.Provider.MySql, typeof (Xtensive.Sql.Drivers.MySql.DriverFactory))] + public class HandlerFactory : Providers.HandlerFactory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/SqlCompiler.cs b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/SqlCompiler.cs index 97c67bbca7..e8cb5d4c9b 100644 --- a/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/SqlCompiler.cs +++ b/Orm/Xtensive.Orm.MySql/Orm.Providers.MySql/SqlCompiler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.MySql -{ - internal class SqlCompiler : Providers.SqlCompiler - { - // Constructors - - public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) - : base(handlers, configuration) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.MySql +{ + internal class SqlCompiler : Providers.SqlCompiler + { + // Constructors + + public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) + : base(handlers, configuration) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Connection.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Connection.cs index 70389d8a5f..8fd5de0c31 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Connection.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Connection.cs @@ -1,112 +1,112 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System.Data; -using System.Data.Common; -using System.Security; -using MySql.Data.MySqlClient; - -namespace Xtensive.Sql.Drivers.MySql -{ - internal class Connection : SqlConnection - { - private MySqlConnection underlyingConnection; - private MySqlTransaction activeTransaction; - - /// - public override DbConnection UnderlyingConnection - { - get { return underlyingConnection; } - } - - /// - public override DbTransaction ActiveTransaction - { - get { return activeTransaction; } - } - - /// - [SecuritySafeCritical] - public override DbParameter CreateParameter() - { - return new MySqlParameter(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction() - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - - activeTransaction = underlyingConnection.BeginTransaction(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction(IsolationLevel isolationLevel) - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - - activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); - } - - /// - public override void MakeSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - - string commandText = string.Format("SAVEPOINT {0}", name); - using (DbCommand command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void RollbackToSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - - string commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); - using (DbCommand command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void ReleaseSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - - string commandText = string.Format("RELEASE SAVEPOINT {0}", name); - using (DbCommand command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - protected override void ClearActiveTransaction() - { - activeTransaction = null; - } - - /// - protected override void ClearUnderlyingConnection() - { - underlyingConnection = null; - } - - // Constructors - - [SecuritySafeCritical] - public Connection(SqlDriver driver) - : base(driver) - { - underlyingConnection = new MySqlConnection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System.Data; +using System.Data.Common; +using System.Security; +using MySql.Data.MySqlClient; + +namespace Xtensive.Sql.Drivers.MySql +{ + internal class Connection : SqlConnection + { + private MySqlConnection underlyingConnection; + private MySqlTransaction activeTransaction; + + /// + public override DbConnection UnderlyingConnection + { + get { return underlyingConnection; } + } + + /// + public override DbTransaction ActiveTransaction + { + get { return activeTransaction; } + } + + /// + [SecuritySafeCritical] + public override DbParameter CreateParameter() + { + return new MySqlParameter(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction() + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + + activeTransaction = underlyingConnection.BeginTransaction(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction(IsolationLevel isolationLevel) + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + + activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); + } + + /// + public override void MakeSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + + string commandText = string.Format("SAVEPOINT {0}", name); + using (DbCommand command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void RollbackToSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + + string commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); + using (DbCommand command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void ReleaseSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + + string commandText = string.Format("RELEASE SAVEPOINT {0}", name); + using (DbCommand command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + protected override void ClearActiveTransaction() + { + activeTransaction = null; + } + + /// + protected override void ClearUnderlyingConnection() + { + underlyingConnection = null; + } + + // Constructors + + [SecuritySafeCritical] + public Connection(SqlDriver driver) + : base(driver) + { + underlyingConnection = new MySqlConnection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Driver.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Driver.cs index 0726166105..1461d31f8c 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Driver.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Driver.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Runtime.CompilerServices; -using MySql.Data.MySqlClient; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql -{ - internal abstract class Driver : SqlDriver - { - /// - protected override SqlConnection DoCreateConnection() - { - return new Connection(this); - } - - /// - public override SqlExceptionType GetExceptionType(Exception exception) - { - var nativeException = exception as MySqlException; - if (nativeException == null) - return SqlExceptionType.Unknown; - int errorCode = nativeException.Number; - string errorMessage = nativeException.Message; - - //TODO: intepret some of the error codes (Malisa) - //http://dev.mysql.com/doc/refman/5.0/en/error-handling.html - - switch (errorCode) { - case 2002: - case 2003: - return SqlExceptionType.ConnectionError; - case 1149: - return SqlExceptionType.SyntaxError; - case 1169: - return SqlExceptionType.UniqueConstraintViolation; - case 1205: - return SqlExceptionType.OperationTimeout; - case 1213: - return SqlExceptionType.Deadlock; - case 1216: - case 1217: - return SqlExceptionType.ReferentialConstraintViolation; - case 1613: - return SqlExceptionType.OperationTimeout; - default: - return SqlExceptionType.Unknown; - } - } - - // Constructors - - protected Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Runtime.CompilerServices; +using MySql.Data.MySqlClient; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql +{ + internal abstract class Driver : SqlDriver + { + /// + protected override SqlConnection DoCreateConnection() + { + return new Connection(this); + } + + /// + public override SqlExceptionType GetExceptionType(Exception exception) + { + var nativeException = exception as MySqlException; + if (nativeException == null) + return SqlExceptionType.Unknown; + int errorCode = nativeException.Number; + string errorMessage = nativeException.Message; + + //TODO: intepret some of the error codes (Malisa) + //http://dev.mysql.com/doc/refman/5.0/en/error-handling.html + + switch (errorCode) { + case 2002: + case 2003: + return SqlExceptionType.ConnectionError; + case 1149: + return SqlExceptionType.SyntaxError; + case 1169: + return SqlExceptionType.UniqueConstraintViolation; + case 1205: + return SqlExceptionType.OperationTimeout; + case 1213: + return SqlExceptionType.Deadlock; + case 1216: + case 1217: + return SqlExceptionType.ReferentialConstraintViolation; + case 1613: + return SqlExceptionType.OperationTimeout; + default: + return SqlExceptionType.Unknown; + } + } + + // Constructors + + protected Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs index ab558765ff..0ed434f692 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs @@ -1,107 +1,107 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Data.Common; -using System.Linq; -using System.Security; -using MySql.Data.MySqlClient; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Drivers.MySql.Resources; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql -{ - /// - /// A factory for MySQL. - /// - public class DriverFactory : SqlDriverFactory - { - private const string DataSourceFormat = "{0}:{1}/{2}"; - private const string DatabaseAndSchemaQuery = "select database(), schema()"; - - /// - [SecuritySafeCritical] - protected override string BuildConnectionString(UrlInfo url) - { - SqlHelper.ValidateConnectionUrl(url); - - var builder = new MySqlConnectionStringBuilder(); - - // host, port, database - builder.Server = url.Host; - if (url.Port!=0) - builder.Port = (uint) url.Port; - builder.Database = url.Resource ?? string.Empty; - - // user, password - if (string.IsNullOrEmpty(url.User)) - throw new Exception(Strings.ExUserNameRequired); - - builder.UserID = url.User; - builder.Password = url.Password; - - // custom options - foreach (var param in url.Params) - builder[param.Key] = param.Value; - - return builder.ToString(); - } - - private static Version ParseVersion(string version) - { - // For pre-release versions characters might be used in addition to digits - // Skip any non-supported chars before creating Version - - var fixedVersion = new string(version.Where(ch => char.IsDigit(ch) || ch=='.').ToArray()); - return new Version(fixedVersion); - } - - /// - [SecuritySafeCritical] - protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - using (var connection = new MySqlConnection(connectionString)) { - connection.Open(); - SqlHelper.ExecuteInitializationSql(connection, configuration); - var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion) - ? connection.ServerVersion - : configuration.ForcedServerVersion; - var version = ParseVersion(versionString); - - var builder = new MySqlConnectionStringBuilder(connectionString); - var dataSource = string.Format(DataSourceFormat, builder.Server, builder.Port, builder.Database); - var defaultSchema = GetDefaultSchema(connection); - var coreServerInfo = new CoreServerInfo { - ServerVersion = version, - ConnectionString = connectionString, - MultipleActiveResultSets = false, - DatabaseName = defaultSchema.Database, - DefaultSchemaName = defaultSchema.Schema, - }; - - if (version.Major < 5) - throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported); - if (version.Major==5 && version.Minor==0) - return new v5_0.Driver(coreServerInfo); - if (version.Major==5 && version.Minor==1) - return new v5_1.Driver(coreServerInfo); - if (version.Major==5 && version.Minor==5) - return new v5_5.Driver(coreServerInfo); - if (version.Major==5 && version.Minor==6) - return new v5_6.Driver(coreServerInfo); - return new v5_6.Driver(coreServerInfo); - } - } - - /// - protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) - { - return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Data.Common; +using System.Linq; +using System.Security; +using MySql.Data.MySqlClient; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Drivers.MySql.Resources; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql +{ + /// + /// A factory for MySQL. + /// + public class DriverFactory : SqlDriverFactory + { + private const string DataSourceFormat = "{0}:{1}/{2}"; + private const string DatabaseAndSchemaQuery = "select database(), schema()"; + + /// + [SecuritySafeCritical] + protected override string BuildConnectionString(UrlInfo url) + { + SqlHelper.ValidateConnectionUrl(url); + + var builder = new MySqlConnectionStringBuilder(); + + // host, port, database + builder.Server = url.Host; + if (url.Port!=0) + builder.Port = (uint) url.Port; + builder.Database = url.Resource ?? string.Empty; + + // user, password + if (string.IsNullOrEmpty(url.User)) + throw new Exception(Strings.ExUserNameRequired); + + builder.UserID = url.User; + builder.Password = url.Password; + + // custom options + foreach (var param in url.Params) + builder[param.Key] = param.Value; + + return builder.ToString(); + } + + private static Version ParseVersion(string version) + { + // For pre-release versions characters might be used in addition to digits + // Skip any non-supported chars before creating Version + + var fixedVersion = new string(version.Where(ch => char.IsDigit(ch) || ch=='.').ToArray()); + return new Version(fixedVersion); + } + + /// + [SecuritySafeCritical] + protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + using (var connection = new MySqlConnection(connectionString)) { + connection.Open(); + SqlHelper.ExecuteInitializationSql(connection, configuration); + var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion) + ? connection.ServerVersion + : configuration.ForcedServerVersion; + var version = ParseVersion(versionString); + + var builder = new MySqlConnectionStringBuilder(connectionString); + var dataSource = string.Format(DataSourceFormat, builder.Server, builder.Port, builder.Database); + var defaultSchema = GetDefaultSchema(connection); + var coreServerInfo = new CoreServerInfo { + ServerVersion = version, + ConnectionString = connectionString, + MultipleActiveResultSets = false, + DatabaseName = defaultSchema.Database, + DefaultSchemaName = defaultSchema.Schema, + }; + + if (version.Major < 5) + throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported); + if (version.Major==5 && version.Minor==0) + return new v5_0.Driver(coreServerInfo); + if (version.Major==5 && version.Minor==1) + return new v5_1.Driver(coreServerInfo); + if (version.Major==5 && version.Minor==5) + return new v5_5.Driver(coreServerInfo); + if (version.Major==5 && version.Minor==6) + return new v5_6.Driver(coreServerInfo); + return new v5_6.Driver(coreServerInfo); + } + } + + /// + protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) + { + return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.Designer.cs index a33b70cfc2..ee0df2c30d 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.Designer.cs @@ -1,117 +1,117 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Sql.Drivers.MySql.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.MySql.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Date type {0} is not supported.. - /// - internal static string ExCannotSupportEnum { - get { - return ResourceManager.GetString("ExCannotSupportEnum", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySQL supports CURSORS only on stores procedures and functions.. - /// - internal static string ExCursorsOnlyForProcsAndFuncs { - get { - return ResourceManager.GetString("ExCursorsOnlyForProcsAndFuncs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySQL does not support sequences.. - /// - internal static string ExDoesNotSupportSequences { - get { - return ResourceManager.GetString("ExDoesNotSupportSequences", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Boolean String. - /// - internal static string ExInvalidBooleanStringX { - get { - return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySQL version below 5.0 is not supported.. - /// - internal static string ExMySqlBelow50IsNotSupported { - get { - return ResourceManager.GetString("ExMySqlBelow50IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySQL Username is required.. - /// - internal static string ExUserNameRequired { - get { - return ResourceManager.GetString("ExUserNameRequired", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Sql.Drivers.MySql.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.MySql.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Date type {0} is not supported.. + /// + internal static string ExCannotSupportEnum { + get { + return ResourceManager.GetString("ExCannotSupportEnum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL supports CURSORS only on stores procedures and functions.. + /// + internal static string ExCursorsOnlyForProcsAndFuncs { + get { + return ResourceManager.GetString("ExCursorsOnlyForProcsAndFuncs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL does not support sequences.. + /// + internal static string ExDoesNotSupportSequences { + get { + return ResourceManager.GetString("ExDoesNotSupportSequences", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Boolean String. + /// + internal static string ExInvalidBooleanStringX { + get { + return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL version below 5.0 is not supported.. + /// + internal static string ExMySqlBelow50IsNotSupported { + get { + return ResourceManager.GetString("ExMySqlBelow50IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL Username is required.. + /// + internal static string ExUserNameRequired { + get { + return ResourceManager.GetString("ExUserNameRequired", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.resx b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.resx index a86a0f72d6..b8e8b5ec35 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/Resources/Strings.resx @@ -1,138 +1,138 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Date type {0} is not supported. - - - MySQL supports CURSORS only on stores procedures and functions. - - - MySQL does not support sequences. - - - Invalid Boolean String - - - MySQL version below 5.0 is not supported. - - - MySQL Username is required. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Date type {0} is not supported. + + + MySQL supports CURSORS only on stores procedures and functions. + + + MySQL does not support sequences. + + + Invalid Boolean String + + + MySQL version below 5.0 is not supported. + + + MySQL Username is required. + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs index 8055ffdc4b..a8ec7b5870 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs @@ -1,289 +1,289 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal class Compiler : SqlCompiler - { - protected static readonly long NanosecondsPerDay = TimeSpan.FromDays(1).Ticks * 100; - protected static readonly long NanosecondsPerSecond = 1000000000; - protected static readonly long NanosecondsPerMillisecond = 1000000; - protected static readonly long NanosecondsPerMicrosecond = 1000; - protected static readonly long MillisecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds; - protected static readonly long MillisecondsPerSecond = 1000L; - - /// - public override void Visit(SqlSelect node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); - VisitSelectColumns(node); - VisitSelectFrom(node); - VisitSelectHints(node); - VisitSelectWhere(node); - VisitSelectGroupBy(node); - VisitSelectOrderBy(node); - VisitSelectLimitOffset(node); - VisitSelectLock(node); - context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); - } - } - - /// - public override void Visit(SqlAlterTable node) - { - var renameColumnAction = node.Action as SqlRenameColumn; - if (renameColumnAction!=null) - context.Output.AppendText(((Translator) translator).Translate(context, renameColumnAction)); - else if (node.Action is SqlDropConstraint) { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); - - var action = node.Action as SqlDropConstraint; - var constraint = action.Constraint as TableConstraint; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); - if (constraint is ForeignKey) - context.Output.AppendText("FOREIGN KEY " + translator.QuoteIdentifier(constraint.DbName)); - else if (constraint is PrimaryKey) - context.Output.AppendText("PRIMARY KEY "); - else - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); - } - } - else - base.Visit(node); - } - - /// - public override void Visit(SqlFreeTextTable node) - { - //See Readme.txt point 6. - throw SqlHelper.NotSupported("FreeText"); - } - - /// - public override void Visit(SqlBinary node) - { - switch (node.NodeType) { - case SqlNodeType.DateTimePlusInterval: - DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusDateTime: - DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusInterval: - DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - /// - public override void Visit(SqlUnary node) - { - if (node.NodeType==SqlNodeType.BitNot) { - Visit(BitNot(node.Operand)); - return; - } - base.Visit(node); - } - - protected virtual SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) - { - return CastToDecimal(DateDiffDay(date1, date2), 18, 0) * NanosecondsPerDay - + - CastToDecimal(DateDiffMicrosecond(DateAddDay(date2, DateDiffDay(date1, date2)), date1), 18, 0) * NanosecondsPerMicrosecond; - } - - protected virtual SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) - { - return DateAddMicrosecond( - DateAddDay(date, ((interval - (interval % NanosecondsPerDay)) + ((interval % NanosecondsPerDay) > (NanosecondsPerDay / 2) ? 0 : 1)) / NanosecondsPerDay), - (interval / NanosecondsPerMillisecond * NanosecondsPerMicrosecond) % (MillisecondsPerDay * NanosecondsPerMicrosecond)); - } - - /// - /// //Thanks to Csaba Beer. - public override void Visit(SqlQueryExpression node) - { - using (context.EnterScope(node)) { - bool needOpeningParenthesis = false; - bool needClosingParenthesis = false; - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); - if (needOpeningParenthesis) - context.Output.AppendText("("); - node.Left.AcceptVisitor(this); - if (needClosingParenthesis) - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(node.NodeType)); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); - if (needOpeningParenthesis) - context.Output.AppendText("("); - node.Right.AcceptVisitor(this); - if (needClosingParenthesis) - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); - } - } - - /// - public override void Visit(SqlFunctionCall node) - { - switch (node.FunctionType) { - case SqlFunctionType.Truncate: - var argument = node.Arguments[0]; - SqlDml.FunctionCall("TRUNCATE", argument, SqlDml.Literal(0)).AcceptVisitor(this); - return; - case SqlFunctionType.Concat: - var exprs = new SqlExpression[node.Arguments.Count]; - node.Arguments.CopyTo(exprs, 0); - Visit(SqlDml.Concat(exprs)); - return; - case SqlFunctionType.CharLength: - SqlDml.FunctionCall(translator.Translate(SqlFunctionType.CharLength), node.Arguments[0]).AcceptVisitor(this); - // SqlDml.CharLength(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.PadLeft: - case SqlFunctionType.PadRight: - SqlHelper.GenericPad(node).AcceptVisitor(this); - return; - case SqlFunctionType.Rand: - SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Rand)).AcceptVisitor(this); - return; - case SqlFunctionType.Square: - SqlDml.Power(node.Arguments[0], 2).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalToMilliseconds: - Visit(CastToLong(node.Arguments[0]) / NanosecondsPerMillisecond); - return; - case SqlFunctionType.IntervalConstruct: - case SqlFunctionType.IntervalToNanoseconds: - Visit(CastToLong(node.Arguments[0])); - return; - case SqlFunctionType.DateTimeAddMonths: - Visit(DateAddMonth(node.Arguments[0], node.Arguments[1])); - return; - case SqlFunctionType.DateTimeAddYears: - Visit(DateAddYear(node.Arguments[0], node.Arguments[1])); - return; - case SqlFunctionType.DateTimeConstruct: - Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Literal(new DateTime(2001, 1, 1)), - node.Arguments[0] - 2001), - node.Arguments[1] - 1), - node.Arguments[2] - 1)); - return; - case SqlFunctionType.DateTimeToStringIso: - Visit(DateTimeToStringIso(node.Arguments[0])); - return; - } - - base.Visit(node); - } - - public override void VisitSelectLimitOffset(SqlSelect node) - { - if (!node.Limit.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); - node.Limit.AcceptVisitor(this); - } - if (!node.Offset.IsNullReference()) { - if (node.Limit.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); - context.Output.AppendText(" 18446744073709551615 "); // magic number from http://dev.mysql.com/doc/refman/5.0/en/select.html - } - context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); - node.Offset.AcceptVisitor(this); - } - } - - public override void Visit(SqlExtract node) - { - if (node.DateTimePart==SqlDateTimePart.DayOfWeek || node.DateTimePart==SqlDateTimePart.DayOfYear) { - Visit(SqlDml.FunctionCall(node.DateTimePart.ToString(), node.Operand)); - return; - } - base.Visit(node); - } - - #region Static helpers - - private static SqlCast CastToLong(SqlExpression arg) - { - return SqlDml.Cast(arg, SqlType.Int64); - } - - private static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) - { - return SqlDml.Cast(arg, SqlType.Decimal, precision, scale); - } - - private static SqlUserFunctionCall DateDiffDay(SqlExpression date1, SqlExpression date2) - { - return SqlDml.FunctionCall("DATEDIFF", date1, date2); - } - - private static SqlUserFunctionCall DateDiffMicrosecond(SqlExpression date1, SqlExpression date2) - { - return SqlDml.FunctionCall("TIMESTAMPDIFF", SqlDml.Native("MICROSECOND"), date1, date2); - } - - private static SqlUserFunctionCall DateAddYear(SqlExpression date, SqlExpression years) - { - return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("YEAR"), years, date); - } - - private static SqlUserFunctionCall DateAddMonth(SqlExpression date, SqlExpression months) - { - return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("MONTH"), months, date); - } - - private static SqlUserFunctionCall DateAddDay(SqlExpression date, SqlExpression days) - { - return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("DAY"), days, date); - } - - private static SqlUserFunctionCall DateAddMicrosecond(SqlExpression date, SqlExpression microseconds) - { - return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("MICROSECOND"), microseconds, date); - } - - - protected static SqlUserFunctionCall DateTimeToStringIso(SqlExpression dateTime) - { - return SqlDml.FunctionCall("DATE_FORMAT", dateTime, "%Y-%m-%dT%T"); - } - - protected static SqlUserFunctionCall BitNot(SqlExpression operand) - { - return SqlDml.FunctionCall( - "CAST", - SqlDml.RawConcat( - SqlDml.Native("~"), - SqlDml.RawConcat( - operand, - SqlDml.Native("AS SIGNED")))); - } - - #endregion - - // Constructors - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal class Compiler : SqlCompiler + { + protected static readonly long NanosecondsPerDay = TimeSpan.FromDays(1).Ticks * 100; + protected static readonly long NanosecondsPerSecond = 1000000000; + protected static readonly long NanosecondsPerMillisecond = 1000000; + protected static readonly long NanosecondsPerMicrosecond = 1000; + protected static readonly long MillisecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds; + protected static readonly long MillisecondsPerSecond = 1000L; + + /// + public override void Visit(SqlSelect node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); + VisitSelectColumns(node); + VisitSelectFrom(node); + VisitSelectHints(node); + VisitSelectWhere(node); + VisitSelectGroupBy(node); + VisitSelectOrderBy(node); + VisitSelectLimitOffset(node); + VisitSelectLock(node); + context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); + } + } + + /// + public override void Visit(SqlAlterTable node) + { + var renameColumnAction = node.Action as SqlRenameColumn; + if (renameColumnAction!=null) + context.Output.AppendText(((Translator) translator).Translate(context, renameColumnAction)); + else if (node.Action is SqlDropConstraint) { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); + + var action = node.Action as SqlDropConstraint; + var constraint = action.Constraint as TableConstraint; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); + if (constraint is ForeignKey) + context.Output.AppendText("FOREIGN KEY " + translator.QuoteIdentifier(constraint.DbName)); + else if (constraint is PrimaryKey) + context.Output.AppendText("PRIMARY KEY "); + else + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); + } + } + else + base.Visit(node); + } + + /// + public override void Visit(SqlFreeTextTable node) + { + //See Readme.txt point 6. + throw SqlHelper.NotSupported("FreeText"); + } + + /// + public override void Visit(SqlBinary node) + { + switch (node.NodeType) { + case SqlNodeType.DateTimePlusInterval: + DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusDateTime: + DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusInterval: + DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + /// + public override void Visit(SqlUnary node) + { + if (node.NodeType==SqlNodeType.BitNot) { + Visit(BitNot(node.Operand)); + return; + } + base.Visit(node); + } + + protected virtual SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) + { + return CastToDecimal(DateDiffDay(date1, date2), 18, 0) * NanosecondsPerDay + + + CastToDecimal(DateDiffMicrosecond(DateAddDay(date2, DateDiffDay(date1, date2)), date1), 18, 0) * NanosecondsPerMicrosecond; + } + + protected virtual SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) + { + return DateAddMicrosecond( + DateAddDay(date, ((interval - (interval % NanosecondsPerDay)) + ((interval % NanosecondsPerDay) > (NanosecondsPerDay / 2) ? 0 : 1)) / NanosecondsPerDay), + (interval / NanosecondsPerMillisecond * NanosecondsPerMicrosecond) % (MillisecondsPerDay * NanosecondsPerMicrosecond)); + } + + /// + /// //Thanks to Csaba Beer. + public override void Visit(SqlQueryExpression node) + { + using (context.EnterScope(node)) { + bool needOpeningParenthesis = false; + bool needClosingParenthesis = false; + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); + if (needOpeningParenthesis) + context.Output.AppendText("("); + node.Left.AcceptVisitor(this); + if (needClosingParenthesis) + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(node.NodeType)); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); + if (needOpeningParenthesis) + context.Output.AppendText("("); + node.Right.AcceptVisitor(this); + if (needClosingParenthesis) + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); + } + } + + /// + public override void Visit(SqlFunctionCall node) + { + switch (node.FunctionType) { + case SqlFunctionType.Truncate: + var argument = node.Arguments[0]; + SqlDml.FunctionCall("TRUNCATE", argument, SqlDml.Literal(0)).AcceptVisitor(this); + return; + case SqlFunctionType.Concat: + var exprs = new SqlExpression[node.Arguments.Count]; + node.Arguments.CopyTo(exprs, 0); + Visit(SqlDml.Concat(exprs)); + return; + case SqlFunctionType.CharLength: + SqlDml.FunctionCall(translator.Translate(SqlFunctionType.CharLength), node.Arguments[0]).AcceptVisitor(this); + // SqlDml.CharLength(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.PadLeft: + case SqlFunctionType.PadRight: + SqlHelper.GenericPad(node).AcceptVisitor(this); + return; + case SqlFunctionType.Rand: + SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Rand)).AcceptVisitor(this); + return; + case SqlFunctionType.Square: + SqlDml.Power(node.Arguments[0], 2).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalToMilliseconds: + Visit(CastToLong(node.Arguments[0]) / NanosecondsPerMillisecond); + return; + case SqlFunctionType.IntervalConstruct: + case SqlFunctionType.IntervalToNanoseconds: + Visit(CastToLong(node.Arguments[0])); + return; + case SqlFunctionType.DateTimeAddMonths: + Visit(DateAddMonth(node.Arguments[0], node.Arguments[1])); + return; + case SqlFunctionType.DateTimeAddYears: + Visit(DateAddYear(node.Arguments[0], node.Arguments[1])); + return; + case SqlFunctionType.DateTimeConstruct: + Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Literal(new DateTime(2001, 1, 1)), + node.Arguments[0] - 2001), + node.Arguments[1] - 1), + node.Arguments[2] - 1)); + return; + case SqlFunctionType.DateTimeToStringIso: + Visit(DateTimeToStringIso(node.Arguments[0])); + return; + } + + base.Visit(node); + } + + public override void VisitSelectLimitOffset(SqlSelect node) + { + if (!node.Limit.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); + node.Limit.AcceptVisitor(this); + } + if (!node.Offset.IsNullReference()) { + if (node.Limit.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); + context.Output.AppendText(" 18446744073709551615 "); // magic number from http://dev.mysql.com/doc/refman/5.0/en/select.html + } + context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); + node.Offset.AcceptVisitor(this); + } + } + + public override void Visit(SqlExtract node) + { + if (node.DateTimePart==SqlDateTimePart.DayOfWeek || node.DateTimePart==SqlDateTimePart.DayOfYear) { + Visit(SqlDml.FunctionCall(node.DateTimePart.ToString(), node.Operand)); + return; + } + base.Visit(node); + } + + #region Static helpers + + private static SqlCast CastToLong(SqlExpression arg) + { + return SqlDml.Cast(arg, SqlType.Int64); + } + + private static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) + { + return SqlDml.Cast(arg, SqlType.Decimal, precision, scale); + } + + private static SqlUserFunctionCall DateDiffDay(SqlExpression date1, SqlExpression date2) + { + return SqlDml.FunctionCall("DATEDIFF", date1, date2); + } + + private static SqlUserFunctionCall DateDiffMicrosecond(SqlExpression date1, SqlExpression date2) + { + return SqlDml.FunctionCall("TIMESTAMPDIFF", SqlDml.Native("MICROSECOND"), date1, date2); + } + + private static SqlUserFunctionCall DateAddYear(SqlExpression date, SqlExpression years) + { + return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("YEAR"), years, date); + } + + private static SqlUserFunctionCall DateAddMonth(SqlExpression date, SqlExpression months) + { + return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("MONTH"), months, date); + } + + private static SqlUserFunctionCall DateAddDay(SqlExpression date, SqlExpression days) + { + return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("DAY"), days, date); + } + + private static SqlUserFunctionCall DateAddMicrosecond(SqlExpression date, SqlExpression microseconds) + { + return SqlDml.FunctionCall("TIMESTAMPADD", SqlDml.Native("MICROSECOND"), microseconds, date); + } + + + protected static SqlUserFunctionCall DateTimeToStringIso(SqlExpression dateTime) + { + return SqlDml.FunctionCall("DATE_FORMAT", dateTime, "%Y-%m-%dT%T"); + } + + protected static SqlUserFunctionCall BitNot(SqlExpression operand) + { + return SqlDml.FunctionCall( + "CAST", + SqlDml.RawConcat( + SqlDml.Native("~"), + SqlDml.RawConcat( + operand, + SqlDml.Native("AS SIGNED")))); + } + + #endregion + + // Constructors + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Driver.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Driver.cs index 1daaad4744..56e35caafa 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Driver.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Driver.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal class Driver : MySql.Driver - { - /// - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - /// - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - /// - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - /// - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - /// - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal class Driver : MySql.Driver + { + /// + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + /// + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + /// + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + /// + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + /// + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.Queries.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.Queries.cs index e772307a9b..5ac75e6a4d 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.Queries.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.Queries.cs @@ -1,179 +1,179 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal partial class Extractor - { - protected const string SchemaFilterPlaceholder = "{SCHEMA_FILTER}"; - protected const string TableFilterPlaceholder = "{TABLE_FILTER}"; - protected const string IndexesFilterPlaceholder = "{INDEXES_FILTER}"; - - protected string GetExtractTablesQuery() - { - return - @"SELECT - t.table_schema, - t.table_name, - t.table_type - FROM information_schema.tables t - WHERE t.table_schema {SCHEMA_FILTER}"; - } - - protected string GetExtractTableColumnsQuery() - { - return - @"SELECT - c.table_schema, - c.table_name, - c.ordinal_position, - c.column_name, - c.data_type, - c.is_nullable, - c.column_type, - c.character_maximum_length, - c.numeric_precision, - c.numeric_scale, - c.collation_name, - c.column_key, - c.column_default, - c.Extra, - t.auto_increment - FROM information_schema.columns c LEFT OUTER JOIN information_schema.tables t ON (c.table_name = t.table_name) - WHERE c.table_schema {SCHEMA_FILTER} - AND t.table_schema {SCHEMA_FILTER} - AND c.table_name {TABLE_FILTER} - ORDER BY - c.table_schema, - c.table_name, - c.ordinal_position"; - } - - protected string GetExtractViewsQuery() - { - return - @"SELECT - v.table_schema, - v.table_name, - v.view_definition - FROM information_schema.views v - WHERE - v.table_schema {SCHEMA_FILTER}"; - } - - protected string GetExtractViewColumnsQuery() - { - return - @"SELECT - v.table_schema, - v.table_name, - c.column_name, - c.ordinal_position, - v.view_definition - FROM information_schema.views v - INNER JOIN information_schema.columns c - ON ((c.table_schema = v.table_schema) - AND (c.table_name = v.table_name)) - WHERE - c.table_schema {SCHEMA_FILTER} - ORDER BY - c.table_schema, - v.table_name, - c.ordinal_position"; - } - - protected string GetExtractIndexesQuery() - { - return - @"SELECT - s.table_schema, - s.table_name, - s.index_name, - s.non_unique, - s.index_type, - s.seq_in_index, - s.column_name, - s.cardinality, - s.sub_part, - s.nullable - FROM - information_schema.statistics s - WHERE - (s.table_schema {SCHEMA_FILTER} - AND s.index_name <> 'PRIMARY') - ORDER BY - s.table_schema, - s.table_name, - s.index_name, - s.seq_in_index"; - } - - protected string GetExtractForeignKeysQuery() - { - return - @"SELECT - r.constraint_schema, - r.table_name, - r.constraint_name, - r.delete_rule, - c.column_name, - c.ordinal_position, - c.referenced_table_schema, - c.referenced_table_name, - c.referenced_column_name - FROM - information_schema.referential_constraints r join - information_schema.key_column_usage c - on ((r.table_name = c.table_name) and (r.constraint_schema = c.table_schema) and (r.constraint_name = c.constraint_name)) - WHERE - (r.constraint_schema {SCHEMA_FILTER}) - AND c.constraint_name <> 'PRIMARY' - ORDER BY - r.constraint_schema, r.table_name, r.constraint_name, c.ordinal_position"; - } - - protected string GetExtractCheckConstraintsQuery() - { - return - @"SELECT - t.constraint_schema, - t.constraint_name, - t.table_schema, - t.table_name, - t.constraint_type - FROM - information_schema.table_constraints t - WHERE - (t.constraint_schema {SCHEMA_FILTER}) - AND t.constraint_type = 'CHECK'"; - } - - protected string GetExtractUniqueAndPrimaryKeyConstraintsQuery() - { - return - @"SELECT - t.constraint_schema, - t.table_name, - t.constraint_name, - t.constraint_type, - c.column_name, - c.ordinal_position - FROM - information_schema.table_constraints t join - information_schema.key_column_usage c - ON ((t.table_name = c.table_name) and (t.constraint_schema = c.table_schema) AND (t.constraint_name = c.constraint_name)) - WHERE - (t.constraint_schema {SCHEMA_FILTER}) - AND (t.table_name {TABLE_FILTER}) - AND t.constraint_type in('PRIMARY KEY', 'UNIQUE') - ORDER BY - t.constraint_schema, - t.table_name, - t.constraint_name, - c.ordinal_position"; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal partial class Extractor + { + protected const string SchemaFilterPlaceholder = "{SCHEMA_FILTER}"; + protected const string TableFilterPlaceholder = "{TABLE_FILTER}"; + protected const string IndexesFilterPlaceholder = "{INDEXES_FILTER}"; + + protected string GetExtractTablesQuery() + { + return + @"SELECT + t.table_schema, + t.table_name, + t.table_type + FROM information_schema.tables t + WHERE t.table_schema {SCHEMA_FILTER}"; + } + + protected string GetExtractTableColumnsQuery() + { + return + @"SELECT + c.table_schema, + c.table_name, + c.ordinal_position, + c.column_name, + c.data_type, + c.is_nullable, + c.column_type, + c.character_maximum_length, + c.numeric_precision, + c.numeric_scale, + c.collation_name, + c.column_key, + c.column_default, + c.Extra, + t.auto_increment + FROM information_schema.columns c LEFT OUTER JOIN information_schema.tables t ON (c.table_name = t.table_name) + WHERE c.table_schema {SCHEMA_FILTER} + AND t.table_schema {SCHEMA_FILTER} + AND c.table_name {TABLE_FILTER} + ORDER BY + c.table_schema, + c.table_name, + c.ordinal_position"; + } + + protected string GetExtractViewsQuery() + { + return + @"SELECT + v.table_schema, + v.table_name, + v.view_definition + FROM information_schema.views v + WHERE + v.table_schema {SCHEMA_FILTER}"; + } + + protected string GetExtractViewColumnsQuery() + { + return + @"SELECT + v.table_schema, + v.table_name, + c.column_name, + c.ordinal_position, + v.view_definition + FROM information_schema.views v + INNER JOIN information_schema.columns c + ON ((c.table_schema = v.table_schema) + AND (c.table_name = v.table_name)) + WHERE + c.table_schema {SCHEMA_FILTER} + ORDER BY + c.table_schema, + v.table_name, + c.ordinal_position"; + } + + protected string GetExtractIndexesQuery() + { + return + @"SELECT + s.table_schema, + s.table_name, + s.index_name, + s.non_unique, + s.index_type, + s.seq_in_index, + s.column_name, + s.cardinality, + s.sub_part, + s.nullable + FROM + information_schema.statistics s + WHERE + (s.table_schema {SCHEMA_FILTER} + AND s.index_name <> 'PRIMARY') + ORDER BY + s.table_schema, + s.table_name, + s.index_name, + s.seq_in_index"; + } + + protected string GetExtractForeignKeysQuery() + { + return + @"SELECT + r.constraint_schema, + r.table_name, + r.constraint_name, + r.delete_rule, + c.column_name, + c.ordinal_position, + c.referenced_table_schema, + c.referenced_table_name, + c.referenced_column_name + FROM + information_schema.referential_constraints r join + information_schema.key_column_usage c + on ((r.table_name = c.table_name) and (r.constraint_schema = c.table_schema) and (r.constraint_name = c.constraint_name)) + WHERE + (r.constraint_schema {SCHEMA_FILTER}) + AND c.constraint_name <> 'PRIMARY' + ORDER BY + r.constraint_schema, r.table_name, r.constraint_name, c.ordinal_position"; + } + + protected string GetExtractCheckConstraintsQuery() + { + return + @"SELECT + t.constraint_schema, + t.constraint_name, + t.table_schema, + t.table_name, + t.constraint_type + FROM + information_schema.table_constraints t + WHERE + (t.constraint_schema {SCHEMA_FILTER}) + AND t.constraint_type = 'CHECK'"; + } + + protected string GetExtractUniqueAndPrimaryKeyConstraintsQuery() + { + return + @"SELECT + t.constraint_schema, + t.table_name, + t.constraint_name, + t.constraint_type, + c.column_name, + c.ordinal_position + FROM + information_schema.table_constraints t join + information_schema.key_column_usage c + ON ((t.table_name = c.table_name) and (t.constraint_schema = c.table_schema) AND (t.constraint_name = c.constraint_name)) + WHERE + (t.constraint_schema {SCHEMA_FILTER}) + AND (t.table_name {TABLE_FILTER}) + AND t.constraint_type in('PRIMARY KEY', 'UNIQUE') + ORDER BY + t.constraint_schema, + t.table_name, + t.constraint_name, + c.ordinal_position"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs index 266144419e..aaf0945009 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs @@ -1,537 +1,537 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using Xtensive.Sql.Drivers.MySql.Resources; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal partial class Extractor : Model.Extractor - { - private const int DefaultPrecision = 38; - private const int DefaultScale = 0; - - private readonly Dictionary replacementsRegistry = new Dictionary(); - private string targetSchema; - private Catalog theCatalog; - - /// - /// - public override Catalog ExtractCatalog(string catalogName) - { - theCatalog = new Catalog(catalogName); - targetSchema = null; - RegisterReplacements(replacementsRegistry); - var schema = ExtractSchema(string.Empty, Driver.CoreServerInfo.DefaultSchemaName); - return schema.Catalog; - } - - /// - public override Schema ExtractSchema(string catalogName, string schemaName) - { - theCatalog = new Catalog(catalogName); - targetSchema = schemaName; - var result = theCatalog.CreateSchema(targetSchema); - RegisterReplacements(replacementsRegistry); - ExtractCatalogContents(); - return result; - } - - private void ExtractCatalogContents() - { - ExtractTables(); - ExtractTableColumns(); - ExtractViews(); - ExtractViewColumns(); - ExtractIndexes(); - ExtractForeignKeys(); - ExtractCheckConstaints(); - ExtractUniqueAndPrimaryKeyConstraints(); - } - - // ---- ExtractTables - // 0 table_schema, - // 1 table_name, - // 2 table_type - private void ExtractTables() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractTablesQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - while (reader.Read()) { - var schemaName = reader.GetString(0); - var schema = theCatalog.Schemas[schemaName]; - var tableName = reader.GetString(1); - schema.CreateTable(tableName); - } - } - } - - // ---- ExtractTableColumns - // 0 table_schema - // 1 table_name - // 2 ordinal_position - // 3 column_name - // 4 data_type - // 5 is_nullable - // 6 column_type - // 7 character_maximum_length - // 8 numeric_precision - // 9 numeric_scale - // 10 collation_name - // 11 column_key - // 12 column_default - // 13 Extra - private void ExtractTableColumns() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractTableColumnsQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - Table table = null; - Schema schema = null; - TableColumn column = null; - int lastColumnId = int.MaxValue; - while (reader.Read()) { - int columnId = ReadInt(reader, 2); - if (columnId <= lastColumnId) { - //Schema - schema = theCatalog.Schemas[reader.GetString(0)]; - - //Table - table = schema.Tables[reader.GetString(1)]; - } - - //Column - column = table.CreateColumn(reader.GetString(3)); - - //Collation - string collationName = ReadStringOrNull(reader, 10); - if (!string.IsNullOrEmpty(collationName)) - column.Collation = schema.Collations[collationName] ?? schema.CreateCollation(collationName); - - //Data type - column.DataType = CreateValueType(reader, 4, 8, 9, 7); - - //Nullable - column.IsNullable = ReadBool(reader, 5); - - //Default - string defaultValue = ReadStringOrNull(reader, 12); - if (!string.IsNullOrEmpty(defaultValue)) - column.DefaultValue = SqlDml.Native(defaultValue); - - // AutoIncrement - if (ReadAutoIncrement(reader, 13)) - column.SequenceDescriptor = new SequenceDescriptor(column, ReadInt(reader, 14), 1); - - //Column number. - lastColumnId = columnId; - } - } - } - - //---- ExtractViews - // 0 table_schema, - // 1 table_name, - // 2 view_definition - private void ExtractViews() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractViewsQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - while (reader.Read()) { - Schema schema = theCatalog.Schemas[reader.GetString(0)]; - string view = reader.GetString(1); - string definition = ReadStringOrNull(reader, 2); - if (string.IsNullOrEmpty(definition)) - schema.CreateView(view); - else - schema.CreateView(view, SqlDml.Native(definition)); - } - } - } - - //---- ExtractViewColumns - // 0 table_schema, - // 1 table_name, - // 2 column_name, - // 3 ordinal_position, - // 4 view_definition - private void ExtractViewColumns() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractViewColumnsQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - int lastColumnId = int.MaxValue; - View view = null; - while (reader.Read()) { - int columnId = ReadInt(reader, 3); - if (columnId <= lastColumnId) { - Schema schema = theCatalog.Schemas[reader.GetString(0)]; - view = schema.Views[reader.GetString(1)]; - } - view.CreateColumn(reader.GetString(2)); - lastColumnId = columnId; - } - } - } - - //---- ExtractIndexes - // 0 table_schema, - // 1 table_name, - // 2 index_name, - // 3 non_unique, - // 4 index_type, - // 5 seq_in_index, - // 6 column_name, - // 7 cardinality, - // 8 sub_part, - // 9 nullable - private void ExtractIndexes() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractIndexesQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - int lastColumnPosition = int.MaxValue; - Table table = null; - Index index = null; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 5); - if (columnPosition <= lastColumnPosition) { - Schema schema = theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1)]; - if (IsFullTextIndex(reader, 4)) { - table.CreateFullTextIndex(reader.GetString(2)); - } - else { - index = table.CreateIndex(reader.GetString(2)); - index.IsUnique = reader.GetInt32(3)==0; - } - } - TableColumn column = table.TableColumns[reader.GetString(6)]; - index.CreateIndexColumn(column); - - lastColumnPosition = columnPosition; - } - } - } - - //.... ExtractForeignKeys - // 0 constraint_schema, - // 1 table_name, - // 2 constraint_name, - // 3 delete_rule, - // 4 column_name, - // 5 ordinal_position, - // 6 referenced_table_schema, - // 7 referenced_table_name, - // 8 referenced_column_name - private void ExtractForeignKeys() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractForeignKeysQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - int lastColumnPosition = int.MaxValue; - ForeignKey constraint = null; - Table referencingTable = null; - Table referencedTable = null; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 5); - if (columnPosition <= lastColumnPosition) { - Schema referencingSchema = theCatalog.Schemas[reader.GetString(0)]; - referencingTable = referencingSchema.Tables[reader.GetString(1)]; - constraint = referencingTable.CreateForeignKey(reader.GetString(2)); - //ReadConstraintProperties(constraint, reader, 3, 4); - ReadCascadeAction(constraint, reader, 3); - Schema referencedSchema = theCatalog.Schemas[reader.GetString(0)]; //Schema same as current - referencedTable = referencedSchema.Tables[reader.GetString(7)]; - constraint.ReferencedTable = referencedTable; - } - TableColumn referencingColumn = referencingTable.TableColumns[reader.GetString(4)]; - TableColumn referencedColumn = referencedTable.TableColumns[reader.GetString(8)]; - constraint.Columns.Add(referencingColumn); - constraint.ReferencedColumns.Add(referencedColumn); - lastColumnPosition = columnPosition; - } - } - } - - //---- ExtractUniqueAndPrimaryKeyConstraints - // 0 constraint_schema, - // 1 table_name, - // 2 constraint_name, - // 3 constraint_type, - // 4 column_name, - // 5 ordinal_position - private void ExtractUniqueAndPrimaryKeyConstraints() - { - using (var command = Connection.CreateCommand(PerformReplacements(GetExtractUniqueAndPrimaryKeyConstraintsQuery()))) - using (DbDataReader reader = command.ExecuteReader()) { - Table table = null; - string constraintName = null; - string constraintType = null; - var columns = new List(); - int lastColumnPosition = -1; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 5); - if (columnPosition <= lastColumnPosition) { - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - columns.Clear(); - } - if (columns.Count==0) { - var schemaName = reader.GetString(0); - var tableName = reader.GetString(1); - var schema = theCatalog.Schemas[schemaName]; - if (schema==null) - throw new InvalidOperationException(string.Format("Schema '{0}' is not found", schemaName)); - table = schema.Tables[tableName]; - if (table==null) - throw new InvalidOperationException(string.Format("Table '{0}' is not found in schema '{1}'", tableName, schemaName)); - constraintName = reader.GetString(2); - constraintType = reader.GetString(3); - } - columns.Add(table.TableColumns[reader.GetString(4)]); - lastColumnPosition = columnPosition; - } - if (columns.Count > 0) - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - } - } - - //--- ExtractCheckConstaints - // 0 - constraint_schema, - // 1 - constraint_name, - // 2 - table_schema, - // 3 - table_name, - // 4 - constraint_type - private void ExtractCheckConstaints() - { - #region Commented Code - - //NOT yet supported! - //using (var reader = ExecuteReader(GetExtractCheckConstraintsQuery())) - //{ - // while (reader.Read()) - // { - // var schema = theCatalog.Schemas[reader.GetString(0)]; - // var table = schema.Tables[reader.GetString(3)]; - // var name = reader.GetString(1); - - // // It returns empty string instead of the actual value. - // var condition = string.IsNullOrEmpty(reader.GetString(3)) - // ? null - // : SqlDml.Native(reader.GetString(3)); - // var constraint = table.CreateCheckConstraint(name, condition); - // // ReadConstraintProperties(constraint, reader, 4, 5); - // } - //} - - #endregion - } - - private SqlValueType CreateValueType(IDataRecord row, - int typeNameIndex, int precisionIndex, int scaleIndex, int charLengthIndex) - { - string typeName = row.GetString(typeNameIndex).ToUpperInvariant(); - string columnName = row.GetString(6).ToUpperInvariant(); - - int precision = row.IsDBNull(precisionIndex) ? DefaultPrecision : ReadInt(row, precisionIndex); - int scale = row.IsDBNull(scaleIndex) ? DefaultScale : ReadInt(row, scaleIndex); - - var decimalAssignedNames = new List(){"DECIMAL", "NUMERIC", "NUMBER"}; - var doubleAssignedNames = new List(){"DOUBLE", "REAL"}; - - if (decimalAssignedNames.Contains(typeName)) - return new SqlValueType(SqlType.Decimal, precision, scale); - - if(doubleAssignedNames.Contains(typeName)) - return new SqlValueType(SqlType.Double); - - if (columnName=="TINYINT(1)") { - return new SqlValueType(SqlType.Boolean); - } - - if (typeName.StartsWith("TINYINT")) { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Int8); - } - - if (typeName.StartsWith("SMALLINT")) { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Int16); - } - - if (typeName.StartsWith("MEDIUMINT")) //There is not 34bit Int in SqlType - { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Int32); - } - - if (typeName.StartsWith("INT")) { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Int32); - } - - if (typeName.StartsWith("BIGINT")) { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Int64); - } - - if (typeName.StartsWith("TIME")) { - // "timestamp precision" is saved as "scale", ignoring too - return new SqlValueType(SqlType.DateTime); - } - if (typeName.StartsWith("YEAR")) { - // "timestamp precision" is saved as "scale", ignoring too - return new SqlValueType(SqlType.Decimal, 4, 0); - } - - if (typeName=="LONGTEXT") { - return new SqlValueType(SqlType.VarCharMax); - } - - if (typeName.Contains("TEXT")) { - int length = ReadInt(row, charLengthIndex); - return new SqlValueType(SqlType.VarCharMax, length); - } - - if (typeName.Contains("BLOB")) { - return new SqlValueType(SqlType.VarBinaryMax); - } - - if (typeName=="VARBINARY") { - int length = ReadInt(row, charLengthIndex); - return new SqlValueType(SqlType.VarBinary, length); - } - - if (typeName=="VARCHAR" || typeName=="CHAR") { - int length = Convert.ToInt32(row[charLengthIndex]); - SqlType sqlType = typeName.Length==4 ? SqlType.Char : SqlType.VarChar; - return new SqlValueType(sqlType, length); - } - DataTypeInfo typeInfo = Driver.ServerInfo.DataTypes[typeName]; - return typeInfo!=null - ? new SqlValueType(typeInfo.Type) - : new SqlValueType(typeName); - } - - private static void CreateIndexBasedConstraint( - Table table, string constraintName, string constraintType, List columns) - { - switch (constraintType) { - case "PRIMARY KEY": - table.CreatePrimaryKey(constraintName, columns.ToArray()); - return; - case "UNIQUE": - table.CreateUniqueConstraint(constraintName, columns.ToArray()); - return; - default: - throw new ArgumentOutOfRangeException("constraintType"); - } - } - - private static bool ReadBool(IDataRecord row, int index) - { - string value = row.GetString(index); - switch (value) { - case "Y": - case "YES": - case "ENABLED": - case "UNIQUE": - return true; - case "N": - case "NO": - case "DISABLED": - case "NONUNIQUE": - return false; - default: - throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)); - } - } - - private static bool IsFullTextIndex(IDataRecord row, int index) - { - string value = ReadStringOrNull(row, index); - if (!string.IsNullOrEmpty(value)) { - value = value.ToUpperInvariant(); - return value=="FULLTEXT"; - } - return false; - } - - private static bool ReadAutoIncrement(IDataRecord row, int index) - { - string value = ReadStringOrNull(row, index); - if (!string.IsNullOrEmpty(value)) { - value = value.ToUpperInvariant(); - return value=="AUTO_INCREMENT"; - } - return false; - } - - private static long ReadLong(IDataRecord row, int index) - { - decimal value = row.GetDecimal(index); - return value > long.MaxValue ? long.MaxValue : (long) value; - } - - private static int ReadInt(IDataRecord row, int index) - { - decimal value = row.GetDecimal(index); - return value > int.MaxValue ? int.MaxValue : (int) value; - } - - private static string ReadStringOrNull(IDataRecord row, int index) - { - return row.IsDBNull(index) ? null : row.GetString(index); - } - - private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) - { - string deleteRule = row.GetString(deleteRuleIndex); - switch (deleteRule) { - case "CASCADE": - foreignKey.OnDelete = ReferentialAction.Cascade; - return; - case "SET NULL": - foreignKey.OnDelete = ReferentialAction.SetNull; - return; - case "NO ACTION": - foreignKey.OnDelete = ReferentialAction.NoAction; - return; - } - } - - protected virtual void RegisterReplacements(Dictionary replacements) - { - string schemaFilter = targetSchema!=null - ? "= " + SqlHelper.QuoteString(targetSchema) - : "NOT IN ('INFORMATION_SCHEMA', 'MYSQL', 'PERFORMANCE_SCHEMA')"; - - replacements[SchemaFilterPlaceholder] = schemaFilter; - replacements[IndexesFilterPlaceholder] = "1 > 0"; - replacements[TableFilterPlaceholder] = "IS NOT NULL"; - } - - private string PerformReplacements(string query) - { - foreach (var registry in replacementsRegistry) - query = query.Replace(registry.Key, registry.Value); - return query; - } - - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using Xtensive.Sql.Drivers.MySql.Resources; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal partial class Extractor : Model.Extractor + { + private const int DefaultPrecision = 38; + private const int DefaultScale = 0; + + private readonly Dictionary replacementsRegistry = new Dictionary(); + private string targetSchema; + private Catalog theCatalog; + + /// + /// + public override Catalog ExtractCatalog(string catalogName) + { + theCatalog = new Catalog(catalogName); + targetSchema = null; + RegisterReplacements(replacementsRegistry); + var schema = ExtractSchema(string.Empty, Driver.CoreServerInfo.DefaultSchemaName); + return schema.Catalog; + } + + /// + public override Schema ExtractSchema(string catalogName, string schemaName) + { + theCatalog = new Catalog(catalogName); + targetSchema = schemaName; + var result = theCatalog.CreateSchema(targetSchema); + RegisterReplacements(replacementsRegistry); + ExtractCatalogContents(); + return result; + } + + private void ExtractCatalogContents() + { + ExtractTables(); + ExtractTableColumns(); + ExtractViews(); + ExtractViewColumns(); + ExtractIndexes(); + ExtractForeignKeys(); + ExtractCheckConstaints(); + ExtractUniqueAndPrimaryKeyConstraints(); + } + + // ---- ExtractTables + // 0 table_schema, + // 1 table_name, + // 2 table_type + private void ExtractTables() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractTablesQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + while (reader.Read()) { + var schemaName = reader.GetString(0); + var schema = theCatalog.Schemas[schemaName]; + var tableName = reader.GetString(1); + schema.CreateTable(tableName); + } + } + } + + // ---- ExtractTableColumns + // 0 table_schema + // 1 table_name + // 2 ordinal_position + // 3 column_name + // 4 data_type + // 5 is_nullable + // 6 column_type + // 7 character_maximum_length + // 8 numeric_precision + // 9 numeric_scale + // 10 collation_name + // 11 column_key + // 12 column_default + // 13 Extra + private void ExtractTableColumns() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractTableColumnsQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + Table table = null; + Schema schema = null; + TableColumn column = null; + int lastColumnId = int.MaxValue; + while (reader.Read()) { + int columnId = ReadInt(reader, 2); + if (columnId <= lastColumnId) { + //Schema + schema = theCatalog.Schemas[reader.GetString(0)]; + + //Table + table = schema.Tables[reader.GetString(1)]; + } + + //Column + column = table.CreateColumn(reader.GetString(3)); + + //Collation + string collationName = ReadStringOrNull(reader, 10); + if (!string.IsNullOrEmpty(collationName)) + column.Collation = schema.Collations[collationName] ?? schema.CreateCollation(collationName); + + //Data type + column.DataType = CreateValueType(reader, 4, 8, 9, 7); + + //Nullable + column.IsNullable = ReadBool(reader, 5); + + //Default + string defaultValue = ReadStringOrNull(reader, 12); + if (!string.IsNullOrEmpty(defaultValue)) + column.DefaultValue = SqlDml.Native(defaultValue); + + // AutoIncrement + if (ReadAutoIncrement(reader, 13)) + column.SequenceDescriptor = new SequenceDescriptor(column, ReadInt(reader, 14), 1); + + //Column number. + lastColumnId = columnId; + } + } + } + + //---- ExtractViews + // 0 table_schema, + // 1 table_name, + // 2 view_definition + private void ExtractViews() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractViewsQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + while (reader.Read()) { + Schema schema = theCatalog.Schemas[reader.GetString(0)]; + string view = reader.GetString(1); + string definition = ReadStringOrNull(reader, 2); + if (string.IsNullOrEmpty(definition)) + schema.CreateView(view); + else + schema.CreateView(view, SqlDml.Native(definition)); + } + } + } + + //---- ExtractViewColumns + // 0 table_schema, + // 1 table_name, + // 2 column_name, + // 3 ordinal_position, + // 4 view_definition + private void ExtractViewColumns() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractViewColumnsQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + int lastColumnId = int.MaxValue; + View view = null; + while (reader.Read()) { + int columnId = ReadInt(reader, 3); + if (columnId <= lastColumnId) { + Schema schema = theCatalog.Schemas[reader.GetString(0)]; + view = schema.Views[reader.GetString(1)]; + } + view.CreateColumn(reader.GetString(2)); + lastColumnId = columnId; + } + } + } + + //---- ExtractIndexes + // 0 table_schema, + // 1 table_name, + // 2 index_name, + // 3 non_unique, + // 4 index_type, + // 5 seq_in_index, + // 6 column_name, + // 7 cardinality, + // 8 sub_part, + // 9 nullable + private void ExtractIndexes() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractIndexesQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + int lastColumnPosition = int.MaxValue; + Table table = null; + Index index = null; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 5); + if (columnPosition <= lastColumnPosition) { + Schema schema = theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1)]; + if (IsFullTextIndex(reader, 4)) { + table.CreateFullTextIndex(reader.GetString(2)); + } + else { + index = table.CreateIndex(reader.GetString(2)); + index.IsUnique = reader.GetInt32(3)==0; + } + } + TableColumn column = table.TableColumns[reader.GetString(6)]; + index.CreateIndexColumn(column); + + lastColumnPosition = columnPosition; + } + } + } + + //.... ExtractForeignKeys + // 0 constraint_schema, + // 1 table_name, + // 2 constraint_name, + // 3 delete_rule, + // 4 column_name, + // 5 ordinal_position, + // 6 referenced_table_schema, + // 7 referenced_table_name, + // 8 referenced_column_name + private void ExtractForeignKeys() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractForeignKeysQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + int lastColumnPosition = int.MaxValue; + ForeignKey constraint = null; + Table referencingTable = null; + Table referencedTable = null; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 5); + if (columnPosition <= lastColumnPosition) { + Schema referencingSchema = theCatalog.Schemas[reader.GetString(0)]; + referencingTable = referencingSchema.Tables[reader.GetString(1)]; + constraint = referencingTable.CreateForeignKey(reader.GetString(2)); + //ReadConstraintProperties(constraint, reader, 3, 4); + ReadCascadeAction(constraint, reader, 3); + Schema referencedSchema = theCatalog.Schemas[reader.GetString(0)]; //Schema same as current + referencedTable = referencedSchema.Tables[reader.GetString(7)]; + constraint.ReferencedTable = referencedTable; + } + TableColumn referencingColumn = referencingTable.TableColumns[reader.GetString(4)]; + TableColumn referencedColumn = referencedTable.TableColumns[reader.GetString(8)]; + constraint.Columns.Add(referencingColumn); + constraint.ReferencedColumns.Add(referencedColumn); + lastColumnPosition = columnPosition; + } + } + } + + //---- ExtractUniqueAndPrimaryKeyConstraints + // 0 constraint_schema, + // 1 table_name, + // 2 constraint_name, + // 3 constraint_type, + // 4 column_name, + // 5 ordinal_position + private void ExtractUniqueAndPrimaryKeyConstraints() + { + using (var command = Connection.CreateCommand(PerformReplacements(GetExtractUniqueAndPrimaryKeyConstraintsQuery()))) + using (DbDataReader reader = command.ExecuteReader()) { + Table table = null; + string constraintName = null; + string constraintType = null; + var columns = new List(); + int lastColumnPosition = -1; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 5); + if (columnPosition <= lastColumnPosition) { + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + columns.Clear(); + } + if (columns.Count==0) { + var schemaName = reader.GetString(0); + var tableName = reader.GetString(1); + var schema = theCatalog.Schemas[schemaName]; + if (schema==null) + throw new InvalidOperationException(string.Format("Schema '{0}' is not found", schemaName)); + table = schema.Tables[tableName]; + if (table==null) + throw new InvalidOperationException(string.Format("Table '{0}' is not found in schema '{1}'", tableName, schemaName)); + constraintName = reader.GetString(2); + constraintType = reader.GetString(3); + } + columns.Add(table.TableColumns[reader.GetString(4)]); + lastColumnPosition = columnPosition; + } + if (columns.Count > 0) + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + } + } + + //--- ExtractCheckConstaints + // 0 - constraint_schema, + // 1 - constraint_name, + // 2 - table_schema, + // 3 - table_name, + // 4 - constraint_type + private void ExtractCheckConstaints() + { + #region Commented Code + + //NOT yet supported! + //using (var reader = ExecuteReader(GetExtractCheckConstraintsQuery())) + //{ + // while (reader.Read()) + // { + // var schema = theCatalog.Schemas[reader.GetString(0)]; + // var table = schema.Tables[reader.GetString(3)]; + // var name = reader.GetString(1); + + // // It returns empty string instead of the actual value. + // var condition = string.IsNullOrEmpty(reader.GetString(3)) + // ? null + // : SqlDml.Native(reader.GetString(3)); + // var constraint = table.CreateCheckConstraint(name, condition); + // // ReadConstraintProperties(constraint, reader, 4, 5); + // } + //} + + #endregion + } + + private SqlValueType CreateValueType(IDataRecord row, + int typeNameIndex, int precisionIndex, int scaleIndex, int charLengthIndex) + { + string typeName = row.GetString(typeNameIndex).ToUpperInvariant(); + string columnName = row.GetString(6).ToUpperInvariant(); + + int precision = row.IsDBNull(precisionIndex) ? DefaultPrecision : ReadInt(row, precisionIndex); + int scale = row.IsDBNull(scaleIndex) ? DefaultScale : ReadInt(row, scaleIndex); + + var decimalAssignedNames = new List(){"DECIMAL", "NUMERIC", "NUMBER"}; + var doubleAssignedNames = new List(){"DOUBLE", "REAL"}; + + if (decimalAssignedNames.Contains(typeName)) + return new SqlValueType(SqlType.Decimal, precision, scale); + + if(doubleAssignedNames.Contains(typeName)) + return new SqlValueType(SqlType.Double); + + if (columnName=="TINYINT(1)") { + return new SqlValueType(SqlType.Boolean); + } + + if (typeName.StartsWith("TINYINT")) { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Int8); + } + + if (typeName.StartsWith("SMALLINT")) { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Int16); + } + + if (typeName.StartsWith("MEDIUMINT")) //There is not 34bit Int in SqlType + { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Int32); + } + + if (typeName.StartsWith("INT")) { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Int32); + } + + if (typeName.StartsWith("BIGINT")) { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Int64); + } + + if (typeName.StartsWith("TIME")) { + // "timestamp precision" is saved as "scale", ignoring too + return new SqlValueType(SqlType.DateTime); + } + if (typeName.StartsWith("YEAR")) { + // "timestamp precision" is saved as "scale", ignoring too + return new SqlValueType(SqlType.Decimal, 4, 0); + } + + if (typeName=="LONGTEXT") { + return new SqlValueType(SqlType.VarCharMax); + } + + if (typeName.Contains("TEXT")) { + int length = ReadInt(row, charLengthIndex); + return new SqlValueType(SqlType.VarCharMax, length); + } + + if (typeName.Contains("BLOB")) { + return new SqlValueType(SqlType.VarBinaryMax); + } + + if (typeName=="VARBINARY") { + int length = ReadInt(row, charLengthIndex); + return new SqlValueType(SqlType.VarBinary, length); + } + + if (typeName=="VARCHAR" || typeName=="CHAR") { + int length = Convert.ToInt32(row[charLengthIndex]); + SqlType sqlType = typeName.Length==4 ? SqlType.Char : SqlType.VarChar; + return new SqlValueType(sqlType, length); + } + DataTypeInfo typeInfo = Driver.ServerInfo.DataTypes[typeName]; + return typeInfo!=null + ? new SqlValueType(typeInfo.Type) + : new SqlValueType(typeName); + } + + private static void CreateIndexBasedConstraint( + Table table, string constraintName, string constraintType, List columns) + { + switch (constraintType) { + case "PRIMARY KEY": + table.CreatePrimaryKey(constraintName, columns.ToArray()); + return; + case "UNIQUE": + table.CreateUniqueConstraint(constraintName, columns.ToArray()); + return; + default: + throw new ArgumentOutOfRangeException("constraintType"); + } + } + + private static bool ReadBool(IDataRecord row, int index) + { + string value = row.GetString(index); + switch (value) { + case "Y": + case "YES": + case "ENABLED": + case "UNIQUE": + return true; + case "N": + case "NO": + case "DISABLED": + case "NONUNIQUE": + return false; + default: + throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)); + } + } + + private static bool IsFullTextIndex(IDataRecord row, int index) + { + string value = ReadStringOrNull(row, index); + if (!string.IsNullOrEmpty(value)) { + value = value.ToUpperInvariant(); + return value=="FULLTEXT"; + } + return false; + } + + private static bool ReadAutoIncrement(IDataRecord row, int index) + { + string value = ReadStringOrNull(row, index); + if (!string.IsNullOrEmpty(value)) { + value = value.ToUpperInvariant(); + return value=="AUTO_INCREMENT"; + } + return false; + } + + private static long ReadLong(IDataRecord row, int index) + { + decimal value = row.GetDecimal(index); + return value > long.MaxValue ? long.MaxValue : (long) value; + } + + private static int ReadInt(IDataRecord row, int index) + { + decimal value = row.GetDecimal(index); + return value > int.MaxValue ? int.MaxValue : (int) value; + } + + private static string ReadStringOrNull(IDataRecord row, int index) + { + return row.IsDBNull(index) ? null : row.GetString(index); + } + + private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) + { + string deleteRule = row.GetString(deleteRuleIndex); + switch (deleteRule) { + case "CASCADE": + foreignKey.OnDelete = ReferentialAction.Cascade; + return; + case "SET NULL": + foreignKey.OnDelete = ReferentialAction.SetNull; + return; + case "NO ACTION": + foreignKey.OnDelete = ReferentialAction.NoAction; + return; + } + } + + protected virtual void RegisterReplacements(Dictionary replacements) + { + string schemaFilter = targetSchema!=null + ? "= " + SqlHelper.QuoteString(targetSchema) + : "NOT IN ('INFORMATION_SCHEMA', 'MYSQL', 'PERFORMANCE_SCHEMA')"; + + replacements[SchemaFilterPlaceholder] = schemaFilter; + replacements[IndexesFilterPlaceholder] = "1 > 0"; + replacements[TableFilterPlaceholder] = "IS NOT NULL"; + } + + private string PerformReplacements(string query) + { + foreach (var registry in replacementsRegistry) + query = query.Replace(registry.Key, registry.Value); + return query; + } + + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/ServiceInfoProvider.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/ServiceInfoProvider.cs index 571c5fa29d..29ebadb496 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/ServiceInfoProvider.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/ServiceInfoProvider.cs @@ -1,324 +1,324 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal class ServerInfoProvider : Info.ServerInfoProvider - { - private const int MaxIdentifierLength = 64; - - private readonly string databaseName; - private readonly string defaultSchemaName; - - /// - public override EntityInfo GetCollationInfo() - { - return null; - } - - /// - public override EntityInfo GetCharacterSetInfo() - { - var characterSetInfo = new EntityInfo(); - characterSetInfo.MaxIdentifierLength = MaxIdentifierLength; - characterSetInfo.AllowedDdlStatements = DdlStatements.None; - return characterSetInfo; - } - - /// - public override EntityInfo GetTranslationInfo() - { - var translationInfo = new EntityInfo(); - translationInfo.MaxIdentifierLength = MaxIdentifierLength; - translationInfo.AllowedDdlStatements = DdlStatements.None; - return translationInfo; - } - - /// - public override EntityInfo GetTriggerInfo() - { - var triggerInfo = new EntityInfo(); - triggerInfo.MaxIdentifierLength = MaxIdentifierLength; - triggerInfo.AllowedDdlStatements = DdlStatements.All; - return triggerInfo; - } - - /// - public override EntityInfo GetStoredProcedureInfo() - { - var procedureInfo = new EntityInfo(); - procedureInfo.MaxIdentifierLength = MaxIdentifierLength; - procedureInfo.AllowedDdlStatements = DdlStatements.All; - return procedureInfo; - } - - /// - public override SequenceInfo GetSequenceInfo() - { - return null; - } - - /// - public override EntityInfo GetDatabaseInfo() - { - var databaseInfo = new EntityInfo(); - databaseInfo.MaxIdentifierLength = MaxIdentifierLength; - databaseInfo.AllowedDdlStatements = DdlStatements.All; - return databaseInfo; - } - - /// - public override ColumnInfo GetColumnInfo() - { - var columnInfo = new ColumnInfo(); - columnInfo.MaxIdentifierLength = MaxIdentifierLength; - columnInfo.Features = ColumnFeatures.Identity | ColumnFeatures.Computed; - columnInfo.AllowedDdlStatements = DdlStatements.All; - return columnInfo; - } - - /// - public override EntityInfo GetViewInfo() - { - var viewInfo = new EntityInfo(); - viewInfo.MaxIdentifierLength = MaxIdentifierLength; - viewInfo.AllowedDdlStatements = DdlStatements.All; - return viewInfo; - } - - /// - public override EntityInfo GetSchemaInfo() - { - var schemaInfo = new EntityInfo(); - schemaInfo.MaxIdentifierLength = MaxIdentifierLength; - schemaInfo.AllowedDdlStatements = DdlStatements.All; - return schemaInfo; - } - - /// - public override TableInfo GetTableInfo() - { - var tableInfo = new TableInfo(); - tableInfo.MaxIdentifierLength = MaxIdentifierLength; - tableInfo.AllowedDdlStatements = DdlStatements.All; - tableInfo.PartitionMethods = PartitionMethods.None; - return tableInfo; - } - - /// - public override TemporaryTableInfo GetTemporaryTableInfo() - { - var temporaryTableInfo = new TemporaryTableInfo(); - temporaryTableInfo.MaxIdentifierLength = 116; - temporaryTableInfo.Features = TemporaryTableFeatures.Global | TemporaryTableFeatures.Local; - temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; - return temporaryTableInfo; - } - - /// - public override CheckConstraintInfo GetCheckConstraintInfo() - { - var checkConstraintInfo = new CheckConstraintInfo(); - checkConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - checkConstraintInfo.MaxExpressionLength = 4000; - checkConstraintInfo.Features = CheckConstraintFeatures.None; - checkConstraintInfo.AllowedDdlStatements = DdlStatements.All; - return checkConstraintInfo; - } - - /// - public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() - { - var primaryKeyInfo = new PrimaryKeyConstraintInfo(); - primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; - primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Clustered; - primaryKeyInfo.AllowedDdlStatements = DdlStatements.All; - primaryKeyInfo.ConstantName = "PRIMARY"; - return primaryKeyInfo; - } - - /// - public override UniqueConstraintInfo GetUniqueConstraintInfo() - { - var uniqueConstraintInfo = new UniqueConstraintInfo(); - uniqueConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - uniqueConstraintInfo.Features = UniqueConstraintFeatures.Clustered | UniqueConstraintFeatures.Nullable; - uniqueConstraintInfo.AllowedDdlStatements = DdlStatements.All; - return uniqueConstraintInfo; - } - - /// - public override IndexInfo GetIndexInfo() - { - var indexInfo = new IndexInfo(); - indexInfo.MaxIdentifierLength = MaxIdentifierLength; - indexInfo.MaxNumberOfColumns = 16; - indexInfo.MaxLength = 900; - indexInfo.AllowedDdlStatements = DdlStatements.All; - indexInfo.Features = IndexFeatures.Unique | IndexFeatures.FullText; - indexInfo.PartitionMethods = PartitionMethods.None; - return indexInfo; - } - - /// - public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() - { - var referenceConstraintInfo = new ForeignKeyConstraintInfo(); - referenceConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - referenceConstraintInfo.Actions = - ForeignKeyConstraintActions.NoAction | - ForeignKeyConstraintActions.Cascade | - ForeignKeyConstraintActions.SetDefault | - ForeignKeyConstraintActions.SetNull; - referenceConstraintInfo.AllowedDdlStatements = DdlStatements.All; - return referenceConstraintInfo; - } - - /// - public override FullTextSearchInfo GetFullTextInfo() - { - return null; - } - - /// - public override QueryInfo GetQueryInfo() - { - var queryInfo = new QueryInfo(); - queryInfo.MaxLength = 60000 * 4000; - queryInfo.MaxComparisonOperations = 1000; - queryInfo.MaxNestedSubqueriesAmount = 32; //TODO: Determine max nested sub queries and variables. - queryInfo.ParameterPrefix = "?"; - queryInfo.Features = - QueryFeatures.NamedParameters | - QueryFeatures.ParameterPrefix | - QueryFeatures.Limit | - QueryFeatures.Offset | - QueryFeatures.InsertDefaultValues | - QueryFeatures.UpdateDefaultValues | - QueryFeatures.UpdateLimit | - QueryFeatures.DeleteLimit | - QueryFeatures.ExplicitJoinOrder | - QueryFeatures.ScalarSubquery | - QueryFeatures.SelfReferencingRowRemovalIsError | - QueryFeatures.StrictJoinSyntax | - QueryFeatures.Batches; - return queryInfo; - } - - /// - public override ServerFeatures GetServerFeatures() - { - return ServerFeatures.Savepoints | ServerFeatures.TransactionalDdl; - } - - /// - public override IdentityInfo GetIdentityInfo() - { - var identityInfo = new IdentityInfo(); - identityInfo.Features = IdentityFeatures.Seed | IdentityFeatures.AutoIncrement | IdentityFeatures.AutoIncrementSettingsInMemory; - return identityInfo; - } - - /// - public override DataTypeCollection GetDataTypesInfo() - { - var types = new DataTypeCollection(); - - DataTypeFeatures common = DataTypeFeatures.Default | DataTypeFeatures.Nullable | DataTypeFeatures.NonKeyIndexing | - DataTypeFeatures.Grouping | DataTypeFeatures.Ordering | DataTypeFeatures.Multiple; - - DataTypeFeatures index = DataTypeFeatures.Indexing | DataTypeFeatures.KeyConstraint; - - DataTypeFeatures identity = DataTypeFeatures.Identity; - - types.Boolean = DataTypeInfo.Range(SqlType.Boolean, common | index, - ValueRange.Bool, "boolean"); - - types.Int8 = DataTypeInfo.Range(SqlType.Int8, common | index | identity, - ValueRange.Byte, "tinyint"); - - types.Int16 = DataTypeInfo.Range(SqlType.Int16, common | index | identity, - ValueRange.Int16, "smallint"); - - types.Int32 = DataTypeInfo.Range(SqlType.Int32, common | index | identity, - ValueRange.Int32, "int"); - - types.Int64 = DataTypeInfo.Range(SqlType.Int64, common | index | identity, - ValueRange.Int64, "bigint"); - - types.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, common | index, - ValueRange.Decimal, 38, "decimal", "numeric", "year"); - - types.Float = DataTypeInfo.Range(SqlType.Float, common | index, - ValueRange.Float, "float"); - - types.Double = DataTypeInfo.Range(SqlType.Double, common | index, - ValueRange.Double, "double precision"); - - types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, - new ValueRange(new DateTime(1000, 1, 1), new DateTime(9999, 12, 31)), - "datetime", "time"); - - types.Char = DataTypeInfo.Stream(SqlType.Char, common | index, 255, "char"); - types.VarChar = DataTypeInfo.Stream(SqlType.VarChar, common | index, 4000, "varchar"); - - types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common, "longtext"); - - types.Binary = DataTypeInfo.Stream(SqlType.Binary, common | index, 255, "binary"); - types.VarBinary = DataTypeInfo.Stream(SqlType.VarBinary, common | index, 4000, "varbinary"); - types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "longblob"); - //types.Guid = DataTypeInfo.Regular(SqlType.Guid, common | index, "uuid()"); - - return types; - } - - /// - public override IsolationLevels GetIsolationLevels() - { - var levels = - IsolationLevels.ReadUncommitted | - IsolationLevels.ReadCommitted | - IsolationLevels.RepeatableRead | - IsolationLevels.Serializable | - IsolationLevels.Snapshot; - return levels; - } - - /// - public override EntityInfo GetDomainInfo() - { - var domainInfo = new EntityInfo(); - domainInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - domainInfo.MaxIdentifierLength = MaxIdentifierLength; - return domainInfo; - } - - /// - public override AssertConstraintInfo GetAssertionInfo() - { - var assertConstraintInfo = new AssertConstraintInfo(); - assertConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - assertConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - return assertConstraintInfo; - } - - /// - public override int GetStringIndexingBase() - { - return 1; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal class ServerInfoProvider : Info.ServerInfoProvider + { + private const int MaxIdentifierLength = 64; + + private readonly string databaseName; + private readonly string defaultSchemaName; + + /// + public override EntityInfo GetCollationInfo() + { + return null; + } + + /// + public override EntityInfo GetCharacterSetInfo() + { + var characterSetInfo = new EntityInfo(); + characterSetInfo.MaxIdentifierLength = MaxIdentifierLength; + characterSetInfo.AllowedDdlStatements = DdlStatements.None; + return characterSetInfo; + } + + /// + public override EntityInfo GetTranslationInfo() + { + var translationInfo = new EntityInfo(); + translationInfo.MaxIdentifierLength = MaxIdentifierLength; + translationInfo.AllowedDdlStatements = DdlStatements.None; + return translationInfo; + } + + /// + public override EntityInfo GetTriggerInfo() + { + var triggerInfo = new EntityInfo(); + triggerInfo.MaxIdentifierLength = MaxIdentifierLength; + triggerInfo.AllowedDdlStatements = DdlStatements.All; + return triggerInfo; + } + + /// + public override EntityInfo GetStoredProcedureInfo() + { + var procedureInfo = new EntityInfo(); + procedureInfo.MaxIdentifierLength = MaxIdentifierLength; + procedureInfo.AllowedDdlStatements = DdlStatements.All; + return procedureInfo; + } + + /// + public override SequenceInfo GetSequenceInfo() + { + return null; + } + + /// + public override EntityInfo GetDatabaseInfo() + { + var databaseInfo = new EntityInfo(); + databaseInfo.MaxIdentifierLength = MaxIdentifierLength; + databaseInfo.AllowedDdlStatements = DdlStatements.All; + return databaseInfo; + } + + /// + public override ColumnInfo GetColumnInfo() + { + var columnInfo = new ColumnInfo(); + columnInfo.MaxIdentifierLength = MaxIdentifierLength; + columnInfo.Features = ColumnFeatures.Identity | ColumnFeatures.Computed; + columnInfo.AllowedDdlStatements = DdlStatements.All; + return columnInfo; + } + + /// + public override EntityInfo GetViewInfo() + { + var viewInfo = new EntityInfo(); + viewInfo.MaxIdentifierLength = MaxIdentifierLength; + viewInfo.AllowedDdlStatements = DdlStatements.All; + return viewInfo; + } + + /// + public override EntityInfo GetSchemaInfo() + { + var schemaInfo = new EntityInfo(); + schemaInfo.MaxIdentifierLength = MaxIdentifierLength; + schemaInfo.AllowedDdlStatements = DdlStatements.All; + return schemaInfo; + } + + /// + public override TableInfo GetTableInfo() + { + var tableInfo = new TableInfo(); + tableInfo.MaxIdentifierLength = MaxIdentifierLength; + tableInfo.AllowedDdlStatements = DdlStatements.All; + tableInfo.PartitionMethods = PartitionMethods.None; + return tableInfo; + } + + /// + public override TemporaryTableInfo GetTemporaryTableInfo() + { + var temporaryTableInfo = new TemporaryTableInfo(); + temporaryTableInfo.MaxIdentifierLength = 116; + temporaryTableInfo.Features = TemporaryTableFeatures.Global | TemporaryTableFeatures.Local; + temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; + return temporaryTableInfo; + } + + /// + public override CheckConstraintInfo GetCheckConstraintInfo() + { + var checkConstraintInfo = new CheckConstraintInfo(); + checkConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + checkConstraintInfo.MaxExpressionLength = 4000; + checkConstraintInfo.Features = CheckConstraintFeatures.None; + checkConstraintInfo.AllowedDdlStatements = DdlStatements.All; + return checkConstraintInfo; + } + + /// + public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() + { + var primaryKeyInfo = new PrimaryKeyConstraintInfo(); + primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; + primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Clustered; + primaryKeyInfo.AllowedDdlStatements = DdlStatements.All; + primaryKeyInfo.ConstantName = "PRIMARY"; + return primaryKeyInfo; + } + + /// + public override UniqueConstraintInfo GetUniqueConstraintInfo() + { + var uniqueConstraintInfo = new UniqueConstraintInfo(); + uniqueConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + uniqueConstraintInfo.Features = UniqueConstraintFeatures.Clustered | UniqueConstraintFeatures.Nullable; + uniqueConstraintInfo.AllowedDdlStatements = DdlStatements.All; + return uniqueConstraintInfo; + } + + /// + public override IndexInfo GetIndexInfo() + { + var indexInfo = new IndexInfo(); + indexInfo.MaxIdentifierLength = MaxIdentifierLength; + indexInfo.MaxNumberOfColumns = 16; + indexInfo.MaxLength = 900; + indexInfo.AllowedDdlStatements = DdlStatements.All; + indexInfo.Features = IndexFeatures.Unique | IndexFeatures.FullText; + indexInfo.PartitionMethods = PartitionMethods.None; + return indexInfo; + } + + /// + public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() + { + var referenceConstraintInfo = new ForeignKeyConstraintInfo(); + referenceConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + referenceConstraintInfo.Actions = + ForeignKeyConstraintActions.NoAction | + ForeignKeyConstraintActions.Cascade | + ForeignKeyConstraintActions.SetDefault | + ForeignKeyConstraintActions.SetNull; + referenceConstraintInfo.AllowedDdlStatements = DdlStatements.All; + return referenceConstraintInfo; + } + + /// + public override FullTextSearchInfo GetFullTextInfo() + { + return null; + } + + /// + public override QueryInfo GetQueryInfo() + { + var queryInfo = new QueryInfo(); + queryInfo.MaxLength = 60000 * 4000; + queryInfo.MaxComparisonOperations = 1000; + queryInfo.MaxNestedSubqueriesAmount = 32; //TODO: Determine max nested sub queries and variables. + queryInfo.ParameterPrefix = "?"; + queryInfo.Features = + QueryFeatures.NamedParameters | + QueryFeatures.ParameterPrefix | + QueryFeatures.Limit | + QueryFeatures.Offset | + QueryFeatures.InsertDefaultValues | + QueryFeatures.UpdateDefaultValues | + QueryFeatures.UpdateLimit | + QueryFeatures.DeleteLimit | + QueryFeatures.ExplicitJoinOrder | + QueryFeatures.ScalarSubquery | + QueryFeatures.SelfReferencingRowRemovalIsError | + QueryFeatures.StrictJoinSyntax | + QueryFeatures.Batches; + return queryInfo; + } + + /// + public override ServerFeatures GetServerFeatures() + { + return ServerFeatures.Savepoints | ServerFeatures.TransactionalDdl; + } + + /// + public override IdentityInfo GetIdentityInfo() + { + var identityInfo = new IdentityInfo(); + identityInfo.Features = IdentityFeatures.Seed | IdentityFeatures.AutoIncrement | IdentityFeatures.AutoIncrementSettingsInMemory; + return identityInfo; + } + + /// + public override DataTypeCollection GetDataTypesInfo() + { + var types = new DataTypeCollection(); + + DataTypeFeatures common = DataTypeFeatures.Default | DataTypeFeatures.Nullable | DataTypeFeatures.NonKeyIndexing | + DataTypeFeatures.Grouping | DataTypeFeatures.Ordering | DataTypeFeatures.Multiple; + + DataTypeFeatures index = DataTypeFeatures.Indexing | DataTypeFeatures.KeyConstraint; + + DataTypeFeatures identity = DataTypeFeatures.Identity; + + types.Boolean = DataTypeInfo.Range(SqlType.Boolean, common | index, + ValueRange.Bool, "boolean"); + + types.Int8 = DataTypeInfo.Range(SqlType.Int8, common | index | identity, + ValueRange.Byte, "tinyint"); + + types.Int16 = DataTypeInfo.Range(SqlType.Int16, common | index | identity, + ValueRange.Int16, "smallint"); + + types.Int32 = DataTypeInfo.Range(SqlType.Int32, common | index | identity, + ValueRange.Int32, "int"); + + types.Int64 = DataTypeInfo.Range(SqlType.Int64, common | index | identity, + ValueRange.Int64, "bigint"); + + types.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, common | index, + ValueRange.Decimal, 38, "decimal", "numeric", "year"); + + types.Float = DataTypeInfo.Range(SqlType.Float, common | index, + ValueRange.Float, "float"); + + types.Double = DataTypeInfo.Range(SqlType.Double, common | index, + ValueRange.Double, "double precision"); + + types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, + new ValueRange(new DateTime(1000, 1, 1), new DateTime(9999, 12, 31)), + "datetime", "time"); + + types.Char = DataTypeInfo.Stream(SqlType.Char, common | index, 255, "char"); + types.VarChar = DataTypeInfo.Stream(SqlType.VarChar, common | index, 4000, "varchar"); + + types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common, "longtext"); + + types.Binary = DataTypeInfo.Stream(SqlType.Binary, common | index, 255, "binary"); + types.VarBinary = DataTypeInfo.Stream(SqlType.VarBinary, common | index, 4000, "varbinary"); + types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "longblob"); + //types.Guid = DataTypeInfo.Regular(SqlType.Guid, common | index, "uuid()"); + + return types; + } + + /// + public override IsolationLevels GetIsolationLevels() + { + var levels = + IsolationLevels.ReadUncommitted | + IsolationLevels.ReadCommitted | + IsolationLevels.RepeatableRead | + IsolationLevels.Serializable | + IsolationLevels.Snapshot; + return levels; + } + + /// + public override EntityInfo GetDomainInfo() + { + var domainInfo = new EntityInfo(); + domainInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + domainInfo.MaxIdentifierLength = MaxIdentifierLength; + return domainInfo; + } + + /// + public override AssertConstraintInfo GetAssertionInfo() + { + var assertConstraintInfo = new AssertConstraintInfo(); + assertConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + assertConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + return assertConstraintInfo; + } + + /// + public override int GetStringIndexingBase() + { + return 1; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs index f44404e97f..94152a0322 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs @@ -1,631 +1,631 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using Xtensive.Core; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Drivers.MySql.Resources; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal class Translator : SqlTranslator - { - public override string DateTimeFormatString - { - get { return @"\'yyyy\-MM\-dd HH\:mm\:ss\.ffffff\'"; } - } - - public override string TimeSpanFormatString - { - get { return string.Empty; } - } - - public override string DdlStatementDelimiter - { - get { return ";"; } - } - - public override string BatchItemDelimiter - { - get { return ";\r\n"; } - } - - public override void Initialize() - { - base.Initialize(); - - FloatNumberFormat.NumberDecimalSeparator = "."; - FloatNumberFormat.NumberGroupSeparator = ""; - - DoubleNumberFormat.NumberDecimalSeparator = "."; - DoubleNumberFormat.NumberGroupSeparator = ""; - } - - /// - [DebuggerStepThrough] - public override string QuoteIdentifier(params string[] names) - { - return SqlHelper.QuoteIdentifierWithBackTick(names); - } - - /// - [DebuggerStepThrough] - public override string QuoteString(string str) - { - return "'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; - } - - public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.HintsEntry: - return string.Empty; - case SelectSection.HintsExit: - if (node.Hints.Count==0) - return string.Empty; - var hints = new List(node.Hints.Count); - foreach (SqlHint hint in node.Hints) { - if (hint is SqlNativeHint) - hints.Add(QuoteIdentifier((hint as SqlNativeHint).HintText)); - } - return hints.Count > 0 ? "USE INDEX (" + string.Join(", ", hints.ToArray()) + ")" : string.Empty; - default: - return base.Translate(context, node, section); - } - } - - /// - public override string Translate(SqlFunctionType type) - { - switch (type) { - case SqlFunctionType.LastAutoGeneratedId: - return "LAST_INSERT_ID()"; - case SqlFunctionType.SystemUser: - return "SYSTEM_USER()"; - case SqlFunctionType.User: - case SqlFunctionType.CurrentUser: - return "CURRENT_USER()"; - case SqlFunctionType.SessionUser: - return "SESSION_USER()"; - case SqlFunctionType.NullIf: - return "IFNULL"; - case SqlFunctionType.Coalesce: - return "COALESCE"; - case SqlFunctionType.BinaryLength: - return "LENGTH"; - - //datetime/timespan - - case SqlFunctionType.DateTimeTruncate: - return "DATE"; - case SqlFunctionType.CurrentDate: - return "CURDATE()"; - case SqlFunctionType.CurrentTimeStamp: - return "NOW()"; - case SqlFunctionType.IntervalNegate: - return "-"; - case SqlFunctionType.DateTimeAddYears: - case SqlFunctionType.DateTimeAddMonths: - case SqlFunctionType.DateTimeConstruct: - case SqlFunctionType.IntervalToMilliseconds: - return string.Empty; - //string - - case SqlFunctionType.CharLength: - return "CHAR_LENGTH"; - case SqlFunctionType.Lower: - return "LCASE"; - case SqlFunctionType.Position: - return "LOCATE"; - case SqlFunctionType.Substring: - return "SUBSTRING"; - case SqlFunctionType.Upper: - return "UCASE"; - case SqlFunctionType.Concat: - return "CONCAT()"; - //math - - case SqlFunctionType.Abs: - return "ABS"; - case SqlFunctionType.Acos: - return "ACOS"; - case SqlFunctionType.Asin: - return "ASIN"; - case SqlFunctionType.Atan: - return "ATAN"; - case SqlFunctionType.Atan2: - return "ATAN2"; - case SqlFunctionType.Ceiling: - return "CEIL"; - case SqlFunctionType.Cos: - return "COS"; - case SqlFunctionType.Cot: - return "COT"; - case SqlFunctionType.Degrees: - return "DEGREES"; - case SqlFunctionType.Exp: - return "EXP"; - case SqlFunctionType.Floor: - return "FLOOR"; - case SqlFunctionType.Log: - return "LN"; - case SqlFunctionType.Log10: - return "LOG"; - case SqlFunctionType.Pi: - return "PI"; - case SqlFunctionType.Power: - return "POWER"; - case SqlFunctionType.Radians: - return "RADIANS"; - case SqlFunctionType.Rand: - return "RAND"; - case SqlFunctionType.Round: - return "ROUND"; - case SqlFunctionType.Truncate: - return "TRUNCATE"; - case SqlFunctionType.Sign: - return "SIGN"; - case SqlFunctionType.Sqrt: - return "SQRT"; - case SqlFunctionType.Tan: - return "TAN"; - default: - return base.Translate(type); - } - } - - /// - public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, - SequenceDescriptorSection section) - { - return string.Empty; - //throw new NotSupportedException(Strings.ExDoesNotSupportSequences); - } - - /// - public override string Translate(ReferentialAction action) - { - switch (action) { - case ReferentialAction.Cascade: - return "CASCADE"; - case ReferentialAction.NoAction: - return "NO ACTION"; - case ReferentialAction.Restrict: - return "RESTRICT"; - case ReferentialAction.SetDefault: - return "SET DEFAULT"; - case ReferentialAction.SetNull: - return "SET NULL"; - } - return string.Empty; - } - - /// - public override string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.Concat: - return ","; - case SqlNodeType.DateTimePlusInterval: - return "+"; - case SqlNodeType.DateTimeMinusInterval: - case SqlNodeType.DateTimeMinusDateTime: - return "-"; - case SqlNodeType.Equals: - return "="; - case SqlNodeType.NotEquals: - return "<>"; - case SqlNodeType.Modulo: - return "MOD"; - case SqlNodeType.Intersect: - case SqlNodeType.Except: - throw SqlHelper.NotSupported(type.ToString()); - case SqlNodeType.BitAnd: - return "&"; - case SqlNodeType.BitOr: - return "|"; - case SqlNodeType.BitXor: - return "^"; - case SqlNodeType.Overlaps: - throw SqlHelper.NotSupported(type.ToString()); - default: - return base.Translate(type); - } - } - - //TODO: Concat Fix and not introduce problems with numerics. a+b. Translate 'a' + 'b' => concat('a', 'b') - //public override string Translate(SqlCompilerContext context, SqlBinary node, NodeSection section) - //{ - // switch (section) - // { - // case NodeSection.Entry: - // return (node.NodeType == SqlNodeType.RawConcat) ? string.Empty : "CONCAT("; - // case NodeSection.Exit: - // return (node.NodeType == SqlNodeType.RawConcat) ? string.Empty : ClosingParenthesis; - // } - // return string.Empty; - //} - - public override string Translate(SqlCompilerContext context, SqlConcat node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "CONCAT("; - case NodeSection.Exit: - return ")"; - default: - return string.Empty; - } - } - - public override string Translate(SqlCompilerContext context, SchemaNode node) - { - return QuoteIdentifier(new[] {node.Name}); - } - - - public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) - { - switch (section) { - case CreateTableSection.Entry: - var builder = new StringBuilder(); - builder.Append("CREATE "); - var temporaryTable = node.Table as TemporaryTable; - if (temporaryTable!=null) { - builder.Append("TEMPORARY TABLE " + Translate(context, temporaryTable)); - } - else { - builder.Append("TABLE " + Translate(context, node.Table)); - } - return builder.ToString(); - case CreateTableSection.Exit: - return string.Empty; - } - return base.Translate(context, node, section); - } - - - public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) - { - switch (section) { - case TableColumnSection.Exit: - return string.Empty; - case TableColumnSection.GeneratedExit: - return "AUTO_INCREMENT"; //Workaround based on fake sequence. - default: - return base.Translate(context, column, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - Index index = node.Index; - switch (section) { - case CreateIndexSection.Entry: - return string.Format("CREATE {0}INDEX {1} USING BTREE ON {2} " - , index.IsUnique ? "UNIQUE " : (index.IsFullText ? "FULLTEXT " : String.Empty) - , QuoteIdentifier(index.Name) - , Translate(context, index.DataTable)); - - case CreateIndexSection.Exit: - return string.Empty; - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlDropIndex node) - { - return string.Format("DROP INDEX {0} ON {1}", QuoteIdentifier(node.Index.Name), - QuoteIdentifier(node.Index.DataTable.Name)); - } - - public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) - { - switch (section) { - case ConstraintSection.Entry: - if (constraint is PrimaryKey) - return string.Empty; - return base.Translate(context, constraint, section); - case ConstraintSection.Exit: { - var fk = constraint as ForeignKey; - var sb = new StringBuilder(); - sb.Append(")"); - if (fk!=null) { - if (fk.OnUpdate!=ReferentialAction.NoAction) - sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); - if (fk.OnDelete!=ReferentialAction.NoAction) - sb.Append(" ON DELETE " + Translate(fk.OnDelete)); - } - return sb.ToString(); - } - default: - return base.Translate(context, constraint, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) - { - switch (section) { - case AlterTableSection.DropBehavior: - var cascadableAction = node.Action as SqlCascadableAction; - if (cascadableAction==null || !cascadableAction.Cascade) - return string.Empty; - if (cascadableAction is SqlDropConstraint) - return string.Empty; - return cascadableAction.Cascade ? "CASCADE" : "RESTRICT"; - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) - { - if (section==InsertSection.DefaultValues) - return "() VALUES ()"; - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlBreak node) - { - return string.Empty; - //throw new NotSupportedException(Strings.ExCursorsOnlyForProcsAndFuncs); - } - - public override string Translate(SqlValueType type) - { - // we need to explicitly specify maximum interval precision - if (type.Type==SqlType.Interval) - return "decimal(18, 18)"; - return base.Translate(type); - } - - /// - public override string Translate(SqlCompilerContext context, object literalValue) - { - Type literalType = literalValue.GetType(); - switch (Type.GetTypeCode(literalType)) { - case TypeCode.Boolean: - return (bool) literalValue ? "1" : "0"; - case TypeCode.UInt64: - return QuoteString(((UInt64) literalValue).ToString()); - } - if (literalType==typeof (byte[])) { - var values = (byte[]) literalValue; - var builder = new StringBuilder(2 * (values.Length + 1)); - builder.Append("x'"); - builder.AppendHexArray(values); - builder.Append("'"); - return builder.ToString(); - } - if (literalType==typeof (Guid)) - return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); - if (literalType==typeof (TimeSpan)) - return Convert.ToString(((TimeSpan) literalValue).Ticks * 100); - return base.Translate(context, literalValue); - } - - /// - public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) - { - bool isSecond = node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second; - bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond || - node.IntervalPart==SqlIntervalPart.Millisecond; - if (!(isSecond || isMillisecond)) - return base.Translate(context, node, section); - switch (section) { - case ExtractSection.Entry: - return "(extract("; - case ExtractSection.Exit: - return isMillisecond ? ") % 1000)" : "))"; - default: - return base.Translate(context, node, section); - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlFunctionCall node, - FunctionCallSection section, int position) - { - switch (section) { - case FunctionCallSection.Entry: - switch (node.FunctionType) { - case SqlFunctionType.LastAutoGeneratedId: - case SqlFunctionType.CurrentUser: - case SqlFunctionType.SessionUser: - case SqlFunctionType.SystemUser: - case SqlFunctionType.User: - case SqlFunctionType.CurrentDate: - case SqlFunctionType.CurrentTimeStamp: - return Translate(node.FunctionType); - } - break; - case FunctionCallSection.ArgumentEntry: - return string.Empty; - case FunctionCallSection.ArgumentDelimiter: - return ArgumentDelimiter; - } - - return base.Translate(context, node, section, position); - } - - /// - public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) - { - throw new NotSupportedException(Strings.ExDoesNotSupportSequences); - } - - /// - public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - var sqlType = node.Type.Type; - - if (sqlType==SqlType.Binary || - sqlType==SqlType.Char || - sqlType==SqlType.Interval || - sqlType==SqlType.DateTime) - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return "AS " + Translate(node.Type) + ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - if (sqlType==SqlType.Int16 || - sqlType==SqlType.Int32) - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return "AS SIGNED " + Translate(node.Type) + ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - if (sqlType==SqlType.Decimal) { - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return "AS " + Translate(node.Type) + ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - } - if (sqlType==SqlType.Decimal || - sqlType==SqlType.Double || - sqlType==SqlType.Float) - switch (section) { - case NodeSection.Entry: - return String.Empty; - case NodeSection.Exit: - return String.Empty; - default: - throw new ArgumentOutOfRangeException("section"); - } - return string.Empty; - } - - /// - public override string Translate(SqlDateTimePart part) - { - switch (part) { - case SqlDateTimePart.Millisecond: - return "MICROSECOND"; - case SqlDateTimePart.Day: - return "DAY"; - case SqlDateTimePart.Year: - return "YEAR"; - case SqlDateTimePart.Month: - return "MONTH"; - case SqlDateTimePart.Hour: - return "HOUR"; - case SqlDateTimePart.Minute: - return "MINUTE"; - } - - return base.Translate(part); - } - - /// - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.Shared)) - return "LOCK IN SHARE MODE"; - if (lockType.Supports(SqlLockType.SkipLocked) || lockType.Supports(SqlLockType.ThrowIfLocked)) - return base.Translate(lockType); - return "FOR UPDATE"; - } - - //----------------------- Other Vendor Type MySQL Type - //BOOL TINYINT - //BOOLEAN TINYINT - //CHARACTER VARYING(M) VARCHAR(M) - //FIXED DECIMAL - //FLOAT4 FLOAT - //FLOAT8 DOUBLE - //INT1 TINYINT - //INT2 SMALLINT - //INT3 MEDIUMINT - //INT4 INT - //INT8 BIGINT - //LONG VARBINARY MEDIUMBLOB - //LONG VARCHAR MEDIUMTEXT - //LONG MEDIUMTEXT - //MIDDLEINT MEDIUMINT - //NUMERIC DECIMAL - protected virtual string TranslateClrType(Type type) - { - switch (Type.GetTypeCode(type)) { - case TypeCode.Boolean: - return "bool"; - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - return "int2"; - case TypeCode.UInt16: - case TypeCode.Int32: - return "int4"; - case TypeCode.UInt32: - case TypeCode.Int64: - return "int8"; - case TypeCode.UInt64: - case TypeCode.Decimal: - return "numeric"; - case TypeCode.Single: - return "float4"; - case TypeCode.Double: - return "float8"; - case TypeCode.Char: - case TypeCode.String: - return "text"; - case TypeCode.DateTime: - return "timestamp"; - default: - if (type==typeof (TimeSpan)) - return "numeric"; - if (type==typeof (Guid)) - return "text"; - return "text"; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlRenameColumn action) //TODO: Work on this. - { - string schemaName = action.Column.Table.Schema.DbName; - string tableName = action.Column.Table.DbName; - string columnName = action.Column.DbName; - - //alter table `actor` change column last_name1 last_name varchar(45) - - var builder = new StringBuilder(); - builder.Append("ALTER TABLE "); - builder.Append(QuoteIdentifier(tableName)); - builder.Append(" CHANGE COLUMN "); - builder.Append(QuoteIdentifier(columnName)); - builder.Append(" "); - builder.Append(QuoteIdentifier(action.NewName)); - builder.Append(" "); - builder.Append(Translate(action.Column.DataType)); - - return builder.ToString(); - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using Xtensive.Core; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Drivers.MySql.Resources; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal class Translator : SqlTranslator + { + public override string DateTimeFormatString + { + get { return @"\'yyyy\-MM\-dd HH\:mm\:ss\.ffffff\'"; } + } + + public override string TimeSpanFormatString + { + get { return string.Empty; } + } + + public override string DdlStatementDelimiter + { + get { return ";"; } + } + + public override string BatchItemDelimiter + { + get { return ";\r\n"; } + } + + public override void Initialize() + { + base.Initialize(); + + FloatNumberFormat.NumberDecimalSeparator = "."; + FloatNumberFormat.NumberGroupSeparator = ""; + + DoubleNumberFormat.NumberDecimalSeparator = "."; + DoubleNumberFormat.NumberGroupSeparator = ""; + } + + /// + [DebuggerStepThrough] + public override string QuoteIdentifier(params string[] names) + { + return SqlHelper.QuoteIdentifierWithBackTick(names); + } + + /// + [DebuggerStepThrough] + public override string QuoteString(string str) + { + return "'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; + } + + public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + { + switch (section) { + case SelectSection.HintsEntry: + return string.Empty; + case SelectSection.HintsExit: + if (node.Hints.Count==0) + return string.Empty; + var hints = new List(node.Hints.Count); + foreach (SqlHint hint in node.Hints) { + if (hint is SqlNativeHint) + hints.Add(QuoteIdentifier((hint as SqlNativeHint).HintText)); + } + return hints.Count > 0 ? "USE INDEX (" + string.Join(", ", hints.ToArray()) + ")" : string.Empty; + default: + return base.Translate(context, node, section); + } + } + + /// + public override string Translate(SqlFunctionType type) + { + switch (type) { + case SqlFunctionType.LastAutoGeneratedId: + return "LAST_INSERT_ID()"; + case SqlFunctionType.SystemUser: + return "SYSTEM_USER()"; + case SqlFunctionType.User: + case SqlFunctionType.CurrentUser: + return "CURRENT_USER()"; + case SqlFunctionType.SessionUser: + return "SESSION_USER()"; + case SqlFunctionType.NullIf: + return "IFNULL"; + case SqlFunctionType.Coalesce: + return "COALESCE"; + case SqlFunctionType.BinaryLength: + return "LENGTH"; + + //datetime/timespan + + case SqlFunctionType.DateTimeTruncate: + return "DATE"; + case SqlFunctionType.CurrentDate: + return "CURDATE()"; + case SqlFunctionType.CurrentTimeStamp: + return "NOW()"; + case SqlFunctionType.IntervalNegate: + return "-"; + case SqlFunctionType.DateTimeAddYears: + case SqlFunctionType.DateTimeAddMonths: + case SqlFunctionType.DateTimeConstruct: + case SqlFunctionType.IntervalToMilliseconds: + return string.Empty; + //string + + case SqlFunctionType.CharLength: + return "CHAR_LENGTH"; + case SqlFunctionType.Lower: + return "LCASE"; + case SqlFunctionType.Position: + return "LOCATE"; + case SqlFunctionType.Substring: + return "SUBSTRING"; + case SqlFunctionType.Upper: + return "UCASE"; + case SqlFunctionType.Concat: + return "CONCAT()"; + //math + + case SqlFunctionType.Abs: + return "ABS"; + case SqlFunctionType.Acos: + return "ACOS"; + case SqlFunctionType.Asin: + return "ASIN"; + case SqlFunctionType.Atan: + return "ATAN"; + case SqlFunctionType.Atan2: + return "ATAN2"; + case SqlFunctionType.Ceiling: + return "CEIL"; + case SqlFunctionType.Cos: + return "COS"; + case SqlFunctionType.Cot: + return "COT"; + case SqlFunctionType.Degrees: + return "DEGREES"; + case SqlFunctionType.Exp: + return "EXP"; + case SqlFunctionType.Floor: + return "FLOOR"; + case SqlFunctionType.Log: + return "LN"; + case SqlFunctionType.Log10: + return "LOG"; + case SqlFunctionType.Pi: + return "PI"; + case SqlFunctionType.Power: + return "POWER"; + case SqlFunctionType.Radians: + return "RADIANS"; + case SqlFunctionType.Rand: + return "RAND"; + case SqlFunctionType.Round: + return "ROUND"; + case SqlFunctionType.Truncate: + return "TRUNCATE"; + case SqlFunctionType.Sign: + return "SIGN"; + case SqlFunctionType.Sqrt: + return "SQRT"; + case SqlFunctionType.Tan: + return "TAN"; + default: + return base.Translate(type); + } + } + + /// + public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, + SequenceDescriptorSection section) + { + return string.Empty; + //throw new NotSupportedException(Strings.ExDoesNotSupportSequences); + } + + /// + public override string Translate(ReferentialAction action) + { + switch (action) { + case ReferentialAction.Cascade: + return "CASCADE"; + case ReferentialAction.NoAction: + return "NO ACTION"; + case ReferentialAction.Restrict: + return "RESTRICT"; + case ReferentialAction.SetDefault: + return "SET DEFAULT"; + case ReferentialAction.SetNull: + return "SET NULL"; + } + return string.Empty; + } + + /// + public override string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.Concat: + return ","; + case SqlNodeType.DateTimePlusInterval: + return "+"; + case SqlNodeType.DateTimeMinusInterval: + case SqlNodeType.DateTimeMinusDateTime: + return "-"; + case SqlNodeType.Equals: + return "="; + case SqlNodeType.NotEquals: + return "<>"; + case SqlNodeType.Modulo: + return "MOD"; + case SqlNodeType.Intersect: + case SqlNodeType.Except: + throw SqlHelper.NotSupported(type.ToString()); + case SqlNodeType.BitAnd: + return "&"; + case SqlNodeType.BitOr: + return "|"; + case SqlNodeType.BitXor: + return "^"; + case SqlNodeType.Overlaps: + throw SqlHelper.NotSupported(type.ToString()); + default: + return base.Translate(type); + } + } + + //TODO: Concat Fix and not introduce problems with numerics. a+b. Translate 'a' + 'b' => concat('a', 'b') + //public override string Translate(SqlCompilerContext context, SqlBinary node, NodeSection section) + //{ + // switch (section) + // { + // case NodeSection.Entry: + // return (node.NodeType == SqlNodeType.RawConcat) ? string.Empty : "CONCAT("; + // case NodeSection.Exit: + // return (node.NodeType == SqlNodeType.RawConcat) ? string.Empty : ClosingParenthesis; + // } + // return string.Empty; + //} + + public override string Translate(SqlCompilerContext context, SqlConcat node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "CONCAT("; + case NodeSection.Exit: + return ")"; + default: + return string.Empty; + } + } + + public override string Translate(SqlCompilerContext context, SchemaNode node) + { + return QuoteIdentifier(new[] {node.Name}); + } + + + public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) + { + switch (section) { + case CreateTableSection.Entry: + var builder = new StringBuilder(); + builder.Append("CREATE "); + var temporaryTable = node.Table as TemporaryTable; + if (temporaryTable!=null) { + builder.Append("TEMPORARY TABLE " + Translate(context, temporaryTable)); + } + else { + builder.Append("TABLE " + Translate(context, node.Table)); + } + return builder.ToString(); + case CreateTableSection.Exit: + return string.Empty; + } + return base.Translate(context, node, section); + } + + + public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) + { + switch (section) { + case TableColumnSection.Exit: + return string.Empty; + case TableColumnSection.GeneratedExit: + return "AUTO_INCREMENT"; //Workaround based on fake sequence. + default: + return base.Translate(context, column, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + Index index = node.Index; + switch (section) { + case CreateIndexSection.Entry: + return string.Format("CREATE {0}INDEX {1} USING BTREE ON {2} " + , index.IsUnique ? "UNIQUE " : (index.IsFullText ? "FULLTEXT " : String.Empty) + , QuoteIdentifier(index.Name) + , Translate(context, index.DataTable)); + + case CreateIndexSection.Exit: + return string.Empty; + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlDropIndex node) + { + return string.Format("DROP INDEX {0} ON {1}", QuoteIdentifier(node.Index.Name), + QuoteIdentifier(node.Index.DataTable.Name)); + } + + public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) + { + switch (section) { + case ConstraintSection.Entry: + if (constraint is PrimaryKey) + return string.Empty; + return base.Translate(context, constraint, section); + case ConstraintSection.Exit: { + var fk = constraint as ForeignKey; + var sb = new StringBuilder(); + sb.Append(")"); + if (fk!=null) { + if (fk.OnUpdate!=ReferentialAction.NoAction) + sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); + if (fk.OnDelete!=ReferentialAction.NoAction) + sb.Append(" ON DELETE " + Translate(fk.OnDelete)); + } + return sb.ToString(); + } + default: + return base.Translate(context, constraint, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) + { + switch (section) { + case AlterTableSection.DropBehavior: + var cascadableAction = node.Action as SqlCascadableAction; + if (cascadableAction==null || !cascadableAction.Cascade) + return string.Empty; + if (cascadableAction is SqlDropConstraint) + return string.Empty; + return cascadableAction.Cascade ? "CASCADE" : "RESTRICT"; + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) + { + if (section==InsertSection.DefaultValues) + return "() VALUES ()"; + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlBreak node) + { + return string.Empty; + //throw new NotSupportedException(Strings.ExCursorsOnlyForProcsAndFuncs); + } + + public override string Translate(SqlValueType type) + { + // we need to explicitly specify maximum interval precision + if (type.Type==SqlType.Interval) + return "decimal(18, 18)"; + return base.Translate(type); + } + + /// + public override string Translate(SqlCompilerContext context, object literalValue) + { + Type literalType = literalValue.GetType(); + switch (Type.GetTypeCode(literalType)) { + case TypeCode.Boolean: + return (bool) literalValue ? "1" : "0"; + case TypeCode.UInt64: + return QuoteString(((UInt64) literalValue).ToString()); + } + if (literalType==typeof (byte[])) { + var values = (byte[]) literalValue; + var builder = new StringBuilder(2 * (values.Length + 1)); + builder.Append("x'"); + builder.AppendHexArray(values); + builder.Append("'"); + return builder.ToString(); + } + if (literalType==typeof (Guid)) + return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); + if (literalType==typeof (TimeSpan)) + return Convert.ToString(((TimeSpan) literalValue).Ticks * 100); + return base.Translate(context, literalValue); + } + + /// + public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) + { + bool isSecond = node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second; + bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond || + node.IntervalPart==SqlIntervalPart.Millisecond; + if (!(isSecond || isMillisecond)) + return base.Translate(context, node, section); + switch (section) { + case ExtractSection.Entry: + return "(extract("; + case ExtractSection.Exit: + return isMillisecond ? ") % 1000)" : "))"; + default: + return base.Translate(context, node, section); + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlFunctionCall node, + FunctionCallSection section, int position) + { + switch (section) { + case FunctionCallSection.Entry: + switch (node.FunctionType) { + case SqlFunctionType.LastAutoGeneratedId: + case SqlFunctionType.CurrentUser: + case SqlFunctionType.SessionUser: + case SqlFunctionType.SystemUser: + case SqlFunctionType.User: + case SqlFunctionType.CurrentDate: + case SqlFunctionType.CurrentTimeStamp: + return Translate(node.FunctionType); + } + break; + case FunctionCallSection.ArgumentEntry: + return string.Empty; + case FunctionCallSection.ArgumentDelimiter: + return ArgumentDelimiter; + } + + return base.Translate(context, node, section, position); + } + + /// + public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) + { + throw new NotSupportedException(Strings.ExDoesNotSupportSequences); + } + + /// + public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + var sqlType = node.Type.Type; + + if (sqlType==SqlType.Binary || + sqlType==SqlType.Char || + sqlType==SqlType.Interval || + sqlType==SqlType.DateTime) + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return "AS " + Translate(node.Type) + ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + if (sqlType==SqlType.Int16 || + sqlType==SqlType.Int32) + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return "AS SIGNED " + Translate(node.Type) + ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + if (sqlType==SqlType.Decimal) { + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return "AS " + Translate(node.Type) + ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + } + if (sqlType==SqlType.Decimal || + sqlType==SqlType.Double || + sqlType==SqlType.Float) + switch (section) { + case NodeSection.Entry: + return String.Empty; + case NodeSection.Exit: + return String.Empty; + default: + throw new ArgumentOutOfRangeException("section"); + } + return string.Empty; + } + + /// + public override string Translate(SqlDateTimePart part) + { + switch (part) { + case SqlDateTimePart.Millisecond: + return "MICROSECOND"; + case SqlDateTimePart.Day: + return "DAY"; + case SqlDateTimePart.Year: + return "YEAR"; + case SqlDateTimePart.Month: + return "MONTH"; + case SqlDateTimePart.Hour: + return "HOUR"; + case SqlDateTimePart.Minute: + return "MINUTE"; + } + + return base.Translate(part); + } + + /// + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.Shared)) + return "LOCK IN SHARE MODE"; + if (lockType.Supports(SqlLockType.SkipLocked) || lockType.Supports(SqlLockType.ThrowIfLocked)) + return base.Translate(lockType); + return "FOR UPDATE"; + } + + //----------------------- Other Vendor Type MySQL Type + //BOOL TINYINT + //BOOLEAN TINYINT + //CHARACTER VARYING(M) VARCHAR(M) + //FIXED DECIMAL + //FLOAT4 FLOAT + //FLOAT8 DOUBLE + //INT1 TINYINT + //INT2 SMALLINT + //INT3 MEDIUMINT + //INT4 INT + //INT8 BIGINT + //LONG VARBINARY MEDIUMBLOB + //LONG VARCHAR MEDIUMTEXT + //LONG MEDIUMTEXT + //MIDDLEINT MEDIUMINT + //NUMERIC DECIMAL + protected virtual string TranslateClrType(Type type) + { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + return "bool"; + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + return "int2"; + case TypeCode.UInt16: + case TypeCode.Int32: + return "int4"; + case TypeCode.UInt32: + case TypeCode.Int64: + return "int8"; + case TypeCode.UInt64: + case TypeCode.Decimal: + return "numeric"; + case TypeCode.Single: + return "float4"; + case TypeCode.Double: + return "float8"; + case TypeCode.Char: + case TypeCode.String: + return "text"; + case TypeCode.DateTime: + return "timestamp"; + default: + if (type==typeof (TimeSpan)) + return "numeric"; + if (type==typeof (Guid)) + return "text"; + return "text"; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlRenameColumn action) //TODO: Work on this. + { + string schemaName = action.Column.Table.Schema.DbName; + string tableName = action.Column.Table.DbName; + string columnName = action.Column.DbName; + + //alter table `actor` change column last_name1 last_name varchar(45) + + var builder = new StringBuilder(); + builder.Append("ALTER TABLE "); + builder.Append(QuoteIdentifier(tableName)); + builder.Append(" CHANGE COLUMN "); + builder.Append(QuoteIdentifier(columnName)); + builder.Append(" "); + builder.Append(QuoteIdentifier(action.NewName)); + builder.Append(" "); + builder.Append(Translate(action.Column.DataType)); + + return builder.ToString(); + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/TypeMapper.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/TypeMapper.cs index b65580a68f..c28298917a 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/TypeMapper.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/TypeMapper.cs @@ -1,129 +1,129 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Data; -using System.Data.Common; -using System.Security; - -namespace Xtensive.Sql.Drivers.MySql.v5_0 -{ - internal class TypeMapper : Sql.TypeMapper - { - /// - public override bool IsParameterCastRequired(Type type) - { - switch (Type.GetTypeCode(type)) { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.DateTime: - return true; - } - if (type==typeof (Guid)) - return true; - if (type==typeof (TimeSpan)) - return true; - if (type==typeof (byte[])) - return true; - return false; - } - - /// - public override void BindSByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int16; - parameter.Value = value ?? DBNull.Value; - } - - /// - public override void BindUShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int32; - parameter.Value = value ?? DBNull.Value; - } - - /// - public override void BindUInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int64; - parameter.Value = value ?? DBNull.Value; - } - - /// - public override void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value ?? DBNull.Value; - } - - /// - public override void BindGuid(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); - } - - /// - public override SqlValueType MapByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - /// - public override SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - /// - public override SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int32); - } - - /// - public override SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - /// - public override SqlValueType MapULong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, 20, 0); - } - - /// - public override SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarChar, 32); - } - - /// - public override object ReadByte(DbDataReader reader, int index) - { - return Convert.ToByte(reader[index]); - } - - /// - public override object ReadGuid(DbDataReader reader, int index) - { - return SqlHelper.GuidFromString(reader.GetString(index)); - } - - // Constructors - - [SecuritySafeCritical] - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Data; +using System.Data.Common; +using System.Security; + +namespace Xtensive.Sql.Drivers.MySql.v5_0 +{ + internal class TypeMapper : Sql.TypeMapper + { + /// + public override bool IsParameterCastRequired(Type type) + { + switch (Type.GetTypeCode(type)) { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.DateTime: + return true; + } + if (type==typeof (Guid)) + return true; + if (type==typeof (TimeSpan)) + return true; + if (type==typeof (byte[])) + return true; + return false; + } + + /// + public override void BindSByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int16; + parameter.Value = value ?? DBNull.Value; + } + + /// + public override void BindUShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int32; + parameter.Value = value ?? DBNull.Value; + } + + /// + public override void BindUInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int64; + parameter.Value = value ?? DBNull.Value; + } + + /// + public override void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value ?? DBNull.Value; + } + + /// + public override void BindGuid(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); + } + + /// + public override SqlValueType MapByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + /// + public override SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + /// + public override SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int32); + } + + /// + public override SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + /// + public override SqlValueType MapULong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, 20, 0); + } + + /// + public override SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarChar, 32); + } + + /// + public override object ReadByte(DbDataReader reader, int index) + { + return Convert.ToByte(reader[index]); + } + + /// + public override object ReadGuid(DbDataReader reader, int index) + { + return SqlHelper.GuidFromString(reader.GetString(index)); + } + + // Constructors + + [SecuritySafeCritical] + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Compiler.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Compiler.cs index bb22989478..5adde698b3 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Compiler.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class Compiler : v5_0.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class Compiler : v5_0.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Driver.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Driver.cs index cb504ff405..cfafa1981f 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Driver.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class Driver : MySql.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class Driver : MySql.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Extractor.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Extractor.cs index c92eb0a519..4aae59f8f2 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Extractor.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Extractor.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class Extractor : v5_0.Extractor - { - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class Extractor : v5_0.Extractor + { + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/ServerInfoProvider.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/ServerInfoProvider.cs index 3d6abf4f2e..06556a9742 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/ServerInfoProvider.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class ServerInfoProvider : v5_0.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class ServerInfoProvider : v5_0.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Translator.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Translator.cs index 04190bc4c4..ab582199b5 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Translator.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/Translator.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class Translator : v5_0.Translator - { - // Constructors - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class Translator : v5_0.Translator + { + // Constructors + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/TypeMapper.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/TypeMapper.cs index 4f7c41adee..94d68f6f63 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/TypeMapper.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_1/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_1 -{ - internal class TypeMapper : v5_0.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_1 +{ + internal class TypeMapper : v5_0.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Compiler.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Compiler.cs index 7dcb2a57c7..7e13920f8c 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Compiler.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class Compiler : v5_1.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class Compiler : v5_1.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Driver.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Driver.cs index 39e3245219..0642f2a8fa 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Driver.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class Driver : MySql.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class Driver : MySql.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Extractor.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Extractor.cs index 2847b894c9..88ebd16727 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Extractor.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Extractor.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class Extractor : v5_1.Extractor - { - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class Extractor : v5_1.Extractor + { + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/ServerInfoProvider.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/ServerInfoProvider.cs index ab14b35b63..0a01541bf4 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/ServerInfoProvider.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class ServerInfoProvider : v5_1.ServerInfoProvider - { - private const int MaxIdentifierLength = 128; - - - /// - public override TableInfo GetTableInfo() - { - var tableInfo = new TableInfo(); - tableInfo.MaxIdentifierLength = MaxIdentifierLength; - tableInfo.AllowedDdlStatements = DdlStatements.All; - // From version 5.1.14 - tableInfo.PartitionMethods = PartitionMethods.Hash | PartitionMethods.Range | PartitionMethods.List; - return tableInfo; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class ServerInfoProvider : v5_1.ServerInfoProvider + { + private const int MaxIdentifierLength = 128; + + + /// + public override TableInfo GetTableInfo() + { + var tableInfo = new TableInfo(); + tableInfo.MaxIdentifierLength = MaxIdentifierLength; + tableInfo.AllowedDdlStatements = DdlStatements.All; + // From version 5.1.14 + tableInfo.PartitionMethods = PartitionMethods.Hash | PartitionMethods.Range | PartitionMethods.List; + return tableInfo; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Translator.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Translator.cs index 9b526338f8..95bce090bc 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Translator.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/Translator.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class Translator : v5_1.Translator - { - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class Translator : v5_1.Translator + { + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/TypeMapper.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/TypeMapper.cs index d2218554dc..63c7e28dd0 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/TypeMapper.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_5/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.20 - -namespace Xtensive.Sql.Drivers.MySql.v5_5 -{ - internal class TypeMapper : v5_1.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.20 + +namespace Xtensive.Sql.Drivers.MySql.v5_5 +{ + internal class TypeMapper : v5_1.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Compiler.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Compiler.cs index 134bf12f85..e35b3aebeb 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Compiler.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class Compiler : v5_5.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class Compiler : v5_5.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Driver.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Driver.cs index 52d942325d..c83c903844 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Driver.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class Driver : MySql.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class Driver : MySql.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } +} diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Extractor.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Extractor.cs index ea690847be..3b3971c8c7 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Extractor.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Extractor.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class Extractor : v5_5.Extractor - { - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class Extractor : v5_5.Extractor + { + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/ServerInfoProvider.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/ServerInfoProvider.cs index c2460dbe10..e8586c20c8 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/ServerInfoProvider.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class ServerInfoProvider : v5_5.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class ServerInfoProvider : v5_5.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Translator.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Translator.cs index 3ea41d878e..e876df177e 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Translator.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/Translator.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -using System; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class Translator : v5_5.Translator - { - /// - public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - if (node.Type.Type==SqlType.DateTime) - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return "AS " + Translate(node.Type) + "(6))"; - default: - throw new ArgumentOutOfRangeException("section"); - } - return base.Translate(context, node, section); - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +using System; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class Translator : v5_5.Translator + { + /// + public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + if (node.Type.Type==SqlType.DateTime) + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return "AS " + Translate(node.Type) + "(6))"; + default: + throw new ArgumentOutOfRangeException("section"); + } + return base.Translate(context, node, section); + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/TypeMapper.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/TypeMapper.cs index d704ae77aa..8e83f9f690 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/TypeMapper.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_6/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.30 - -namespace Xtensive.Sql.Drivers.MySql.v5_6 -{ - internal class TypeMapper : v5_5.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.30 + +namespace Xtensive.Sql.Drivers.MySql.v5_6 +{ + internal class TypeMapper : v5_5.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.MySql/Xtensive.Orm.MySql.csproj b/Orm/Xtensive.Orm.MySql/Xtensive.Orm.MySql.csproj index 1ba36ed0fd..a141f960f9 100644 --- a/Orm/Xtensive.Orm.MySql/Xtensive.Orm.MySql.csproj +++ b/Orm/Xtensive.Orm.MySql/Xtensive.Orm.MySql.csproj @@ -1,30 +1,30 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.MySql.xml - - - netstandard2.0 - Xtensive - Xtensive.Orm.MySql - $(DoProductName) provider for MySQL - $(Title) - Adds support for MySQL to $(DoProductName) - true - ..\Orm.snk - true - 2 - - - - - - - - - - Properties\Visibility.cs - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.MySql.xml + + + netstandard2.0 + Xtensive + Xtensive.Orm.MySql + $(DoProductName) provider for MySQL + $(Title) + Adds support for MySQL to $(DoProductName) + true + ..\Orm.snk + true + 2 + + + + + + + + + + Properties\Visibility.cs + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/DomainHandler.cs b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/DomainHandler.cs index d4e7266fcc..515ec2327d 100644 --- a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/DomainHandler.cs +++ b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/DomainHandler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.04 - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.Oracle -{ - /// - /// A domain handler for Oracle RDBMS. - /// - public class DomainHandler : Providers.DomainHandler - { - protected override ICompiler CreateCompiler(CompilerConfiguration configuration) - { - return new SqlCompiler(Handlers, configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.04 + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.Oracle +{ + /// + /// A domain handler for Oracle RDBMS. + /// + public class DomainHandler : Providers.DomainHandler + { + protected override ICompiler CreateCompiler(CompilerConfiguration configuration) + { + return new SqlCompiler(Handlers, configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/HandlerFactory.cs b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/HandlerFactory.cs index 51dda0f8d6..5085608804 100644 --- a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/HandlerFactory.cs +++ b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/HandlerFactory.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.04 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Providers.Oracle -{ - /// - /// Storage provider for Oracle. - /// - [Provider(WellKnown.Provider.Oracle, typeof (Xtensive.Sql.Drivers.Oracle.DriverFactory))] - public class HandlerFactory : Providers.HandlerFactory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.04 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Providers.Oracle +{ + /// + /// Storage provider for Oracle. + /// + [Provider(WellKnown.Provider.Oracle, typeof (Xtensive.Sql.Drivers.Oracle.DriverFactory))] + public class HandlerFactory : Providers.HandlerFactory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/SqlCompiler.cs b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/SqlCompiler.cs index f4f7a33860..7026269c63 100644 --- a/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/SqlCompiler.cs +++ b/Orm/Xtensive.Orm.Oracle/Orm.Providers.Oracle/SqlCompiler.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.07 - -using System; -using System.Collections.Generic; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Rse.Compilation; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Providers.Oracle -{ - internal class SqlCompiler : Providers.SqlCompiler - { - protected override string ProcessAliasedName(string name) - { - return Handlers.NameBuilder.ApplyNamingRules(name); - } - - protected override SqlExpression ProcessAggregate(SqlProvider source, List sourceColumns, AggregateColumn aggregateColumn) - { - var result = base.ProcessAggregate(source, sourceColumns, aggregateColumn); - if (aggregateColumn.AggregateType==AggregateType.Avg) { - switch (Type.GetTypeCode(aggregateColumn.Type)) { - case TypeCode.Single: - case TypeCode.Double: - result = SqlDml.Cast(result, Driver.MapValueType(aggregateColumn.Type)); - break; - } - } - return result; - } - - - // Constructors - - public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) - : base(handlers, configuration) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.07 + +using System; +using System.Collections.Generic; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Rse.Compilation; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Providers.Oracle +{ + internal class SqlCompiler : Providers.SqlCompiler + { + protected override string ProcessAliasedName(string name) + { + return Handlers.NameBuilder.ApplyNamingRules(name); + } + + protected override SqlExpression ProcessAggregate(SqlProvider source, List sourceColumns, AggregateColumn aggregateColumn) + { + var result = base.ProcessAggregate(source, sourceColumns, aggregateColumn); + if (aggregateColumn.AggregateType==AggregateType.Avg) { + switch (Type.GetTypeCode(aggregateColumn.Type)) { + case TypeCode.Single: + case TypeCode.Double: + result = SqlDml.Cast(result, Driver.MapValueType(aggregateColumn.Type)); + break; + } + } + return result; + } + + + // Constructors + + public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) + : base(handlers, configuration) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/BinaryLargeObject.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/BinaryLargeObject.cs index 67d825541f..53b69a773a 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/BinaryLargeObject.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/BinaryLargeObject.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; -using System.Data.Common; - -namespace Xtensive.Sql.Drivers.Oracle -{ - internal sealed class BinaryLargeObject : IBinaryLargeObject - { - private readonly OracleConnection connection; - private OracleBlob lob; - - public bool IsNull { get { return lob==null; } } - public bool IsEmpty { get { return lob!=null && lob.IsEmpty; } } - - public void Dispose() - { - FreeLob(); - } - - public void Erase() - { - EnsureLobIsNotNull(); - lob.Erase(); - } - - public void Nullify() - { - FreeLob(); - } - - public void Write(byte[] buffer, int offset, int count) - { - EnsureLobIsNotNull(); - lob.Write(buffer, offset, count); - } - - public void BindTo(DbParameter parameter) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.Value = lob ?? OracleBlob.Null; - nativeParameter.OracleDbType = OracleDbType.Blob; - } - - #region Private / internal methods - - private void EnsureLobIsNotNull() - { - if (lob!=null) - return; - lob = new OracleBlob(connection); - } - - private void FreeLob() - { - if (lob==null) - return; - lob.Close(); - lob.Dispose(); - lob = null; - } - - #endregion - - // Constructors - - public BinaryLargeObject(OracleConnection connection) - { - this.connection = connection; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; +using System.Data.Common; + +namespace Xtensive.Sql.Drivers.Oracle +{ + internal sealed class BinaryLargeObject : IBinaryLargeObject + { + private readonly OracleConnection connection; + private OracleBlob lob; + + public bool IsNull { get { return lob==null; } } + public bool IsEmpty { get { return lob!=null && lob.IsEmpty; } } + + public void Dispose() + { + FreeLob(); + } + + public void Erase() + { + EnsureLobIsNotNull(); + lob.Erase(); + } + + public void Nullify() + { + FreeLob(); + } + + public void Write(byte[] buffer, int offset, int count) + { + EnsureLobIsNotNull(); + lob.Write(buffer, offset, count); + } + + public void BindTo(DbParameter parameter) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.Value = lob ?? OracleBlob.Null; + nativeParameter.OracleDbType = OracleDbType.Blob; + } + + #region Private / internal methods + + private void EnsureLobIsNotNull() + { + if (lob!=null) + return; + lob = new OracleBlob(connection); + } + + private void FreeLob() + { + if (lob==null) + return; + lob.Close(); + lob.Dispose(); + lob = null; + } + + #endregion + + // Constructors + + public BinaryLargeObject(OracleConnection connection) + { + this.connection = connection; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/CharacterLargeObject.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/CharacterLargeObject.cs index 39c496354e..e07573c76b 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/CharacterLargeObject.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/CharacterLargeObject.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; -using System.Data.Common; - -namespace Xtensive.Sql.Drivers.Oracle -{ - internal sealed class CharacterLargeObject : ICharacterLargeObject - { - private readonly OracleConnection connection; - private OracleClob lob; - - public bool IsNull { get { return lob==null; } } - public bool IsEmpty { get { return lob!=null && lob.IsEmpty; } } - - public void Dispose() - { - FreeLob(); - } - - public void Erase() - { - EnsureLobIsNotNull(); - lob.Erase(); - } - - public void Nullify() - { - FreeLob(); - } - - public void Write(char[] buffer, int offset, int count) - { - EnsureLobIsNotNull(); - lob.Write(buffer, offset, count); - } - - public void BindTo(DbParameter parameter) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.Value = lob ?? OracleClob.Null; - nativeParameter.OracleDbType = OracleDbType.NClob; - } - - #region Private / internal methods - - private void EnsureLobIsNotNull() - { - if (lob!=null) - return; - lob = new OracleClob(connection, false, true); - } - - private void FreeLob() - { - if (lob==null) - return; - lob.Close(); - lob.Dispose(); - lob = null; - } - - #endregion - - // Constructors - - public CharacterLargeObject(OracleConnection connection) - { - this.connection = connection; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; +using System.Data.Common; + +namespace Xtensive.Sql.Drivers.Oracle +{ + internal sealed class CharacterLargeObject : ICharacterLargeObject + { + private readonly OracleConnection connection; + private OracleClob lob; + + public bool IsNull { get { return lob==null; } } + public bool IsEmpty { get { return lob!=null && lob.IsEmpty; } } + + public void Dispose() + { + FreeLob(); + } + + public void Erase() + { + EnsureLobIsNotNull(); + lob.Erase(); + } + + public void Nullify() + { + FreeLob(); + } + + public void Write(char[] buffer, int offset, int count) + { + EnsureLobIsNotNull(); + lob.Write(buffer, offset, count); + } + + public void BindTo(DbParameter parameter) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.Value = lob ?? OracleClob.Null; + nativeParameter.OracleDbType = OracleDbType.NClob; + } + + #region Private / internal methods + + private void EnsureLobIsNotNull() + { + if (lob!=null) + return; + lob = new OracleClob(connection, false, true); + } + + private void FreeLob() + { + if (lob==null) + return; + lob.Close(); + lob.Dispose(); + lob = null; + } + + #endregion + + // Constructors + + public CharacterLargeObject(OracleConnection connection) + { + this.connection = connection; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Connection.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Connection.cs index 73c4e0b9e6..d3d2697d46 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Connection.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Connection.cs @@ -1,121 +1,121 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -using Oracle.ManagedDataAccess.Client; -using System.Data; -using System.Data.Common; -using Xtensive.Orm; - -namespace Xtensive.Sql.Drivers.Oracle -{ - internal class Connection : SqlConnection - { - private OracleConnection underlyingConnection; - private OracleTransaction activeTransaction; - - /// - public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } - - /// - public override DbTransaction ActiveTransaction { get { return activeTransaction; } } - - /// - public override DbParameter CreateParameter() - { - return new OracleParameter(); - } - - /// - public override DbParameter CreateCursorParameter() - { - var result = new OracleParameter { - OracleDbType = OracleDbType.RefCursor, - Direction = ParameterDirection.Output - }; - return result; - } - - /// - public override IBinaryLargeObject CreateBinaryLargeObject() - { - EnsureIsNotDisposed(); - return new BinaryLargeObject(underlyingConnection); - } - - /// - public override ICharacterLargeObject CreateCharacterLargeObject() - { - EnsureIsNotDisposed(); - return new CharacterLargeObject(underlyingConnection); - } - - /// - public override void BeginTransaction() - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(); - } - - /// - public override void BeginTransaction(IsolationLevel isolationLevel) - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); - } - - /// - public override void MakeSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - activeTransaction.Save(name); - } - - /// - public override void RollbackToSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - activeTransaction.Rollback(name); - } - - /// - public override void ReleaseSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - // nothing - } - - /// - protected override void ClearActiveTransaction() - { - activeTransaction = null; - } - - /// - protected override void ClearUnderlyingConnection() - { - underlyingConnection = null; - } - - /// - protected override DbCommand CreateNativeCommand() - { - return new OracleCommand {Connection = underlyingConnection, BindByName = true}; - } - - // Constructors - - public Connection(SqlDriver driver) - : base(driver) - { - underlyingConnection = new OracleConnection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +using Oracle.ManagedDataAccess.Client; +using System.Data; +using System.Data.Common; +using Xtensive.Orm; + +namespace Xtensive.Sql.Drivers.Oracle +{ + internal class Connection : SqlConnection + { + private OracleConnection underlyingConnection; + private OracleTransaction activeTransaction; + + /// + public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } + + /// + public override DbTransaction ActiveTransaction { get { return activeTransaction; } } + + /// + public override DbParameter CreateParameter() + { + return new OracleParameter(); + } + + /// + public override DbParameter CreateCursorParameter() + { + var result = new OracleParameter { + OracleDbType = OracleDbType.RefCursor, + Direction = ParameterDirection.Output + }; + return result; + } + + /// + public override IBinaryLargeObject CreateBinaryLargeObject() + { + EnsureIsNotDisposed(); + return new BinaryLargeObject(underlyingConnection); + } + + /// + public override ICharacterLargeObject CreateCharacterLargeObject() + { + EnsureIsNotDisposed(); + return new CharacterLargeObject(underlyingConnection); + } + + /// + public override void BeginTransaction() + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(); + } + + /// + public override void BeginTransaction(IsolationLevel isolationLevel) + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); + } + + /// + public override void MakeSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + activeTransaction.Save(name); + } + + /// + public override void RollbackToSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + activeTransaction.Rollback(name); + } + + /// + public override void ReleaseSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + // nothing + } + + /// + protected override void ClearActiveTransaction() + { + activeTransaction = null; + } + + /// + protected override void ClearUnderlyingConnection() + { + underlyingConnection = null; + } + + /// + protected override DbCommand CreateNativeCommand() + { + return new OracleCommand {Connection = underlyingConnection, BindByName = true}; + } + + // Constructors + + public Connection(SqlDriver driver) + : base(driver) + { + underlyingConnection = new OracleConnection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Driver.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Driver.cs index 5e37ebebfe..14c2440e50 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Driver.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Driver.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Oracle.ManagedDataAccess.Client; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle -{ - internal abstract class Driver : SqlDriver - { - protected override SqlConnection DoCreateConnection() - { - return new Connection(this); - } - - public override SqlExceptionType GetExceptionType(System.Exception exception) - { - var nativeException = exception as OracleException; - if (nativeException==null) - return SqlExceptionType.Unknown; - switch (nativeException.Number) { - case 1: - return SqlExceptionType.UniqueConstraintViolation; - case 2291: - case 2292: - return SqlExceptionType.ReferentialConstraintViolation; - case 1400: - case 2290: - return SqlExceptionType.CheckConstraintViolation; - case 60: - return SqlExceptionType.Deadlock; - case 1555: - case 8177: - return SqlExceptionType.SerializationFailure; - default: - return SqlExceptionType.Unknown; - } - } - - // Constructors - - protected Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Oracle.ManagedDataAccess.Client; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle +{ + internal abstract class Driver : SqlDriver + { + protected override SqlConnection DoCreateConnection() + { + return new Connection(this); + } + + public override SqlExceptionType GetExceptionType(System.Exception exception) + { + var nativeException = exception as OracleException; + if (nativeException==null) + return SqlExceptionType.Unknown; + switch (nativeException.Number) { + case 1: + return SqlExceptionType.UniqueConstraintViolation; + case 2291: + case 2292: + return SqlExceptionType.ReferentialConstraintViolation; + case 1400: + case 2290: + return SqlExceptionType.CheckConstraintViolation; + case 60: + return SqlExceptionType.Deadlock; + case 1555: + case 8177: + return SqlExceptionType.SerializationFailure; + default: + return SqlExceptionType.Unknown; + } + } + + // Constructors + + protected Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs index c679613743..56de8f860f 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.16 - -using System; -using System.Data.Common; -using System.Linq; -using Oracle.ManagedDataAccess.Client; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Info; -using Xtensive.Sql.Drivers.Oracle.Resources; - -namespace Xtensive.Sql.Drivers.Oracle -{ - /// - /// A factory for Oracle. - /// - public class DriverFactory : SqlDriverFactory - { - private const int DefaultPort = 1521; - private const string DataSourceFormat = - "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))"; - private const string DatabaseAndSchemaQuery = - "select sys_context('USERENV', 'DB_NAME'), sys_context('USERENV', 'CURRENT_SCHEMA') from dual"; - - private static Version ParseVersion(string version) - { - var items = version.Split('.').Take(4).Select(int.Parse).ToArray(); - return new Version(items[0], items[1], items[2], items[3]); - } - - protected override string BuildConnectionString(UrlInfo url) - { - SqlHelper.ValidateConnectionUrl(url); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(url.Resource, "url.Resource"); - - var builder = new OracleConnectionStringBuilder(); - - // host, port, database - if (!string.IsNullOrEmpty(url.Host)) { - int port = url.Port!=0 ? url.Port : DefaultPort; - builder.DataSource = string.Format(DataSourceFormat, url.Host, port, url.Resource); - } - else - builder.DataSource = url.Resource; // Plain TNS name - - // user, password - if (!string.IsNullOrEmpty(url.User)) { - builder.UserID = url.User; - builder.Password = url.Password; - } - else - builder.UserID = "/"; - - // custom options - foreach (var parameter in url.Params) - builder.Add(parameter.Key, parameter.Value); - - return builder.ToString(); - } - - /// - protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - using (var connection = new OracleConnection(connectionString)) { - connection.Open(); - SqlHelper.ExecuteInitializationSql(connection, configuration); - var version = string.IsNullOrEmpty(configuration.ForcedServerVersion) - ? ParseVersion(connection.ServerVersion) - : new Version(configuration.ForcedServerVersion); - var dataSource = new OracleConnectionStringBuilder(connectionString).DataSource; - var defaultSchema = GetDefaultSchema(connection); - var coreServerInfo = new CoreServerInfo { - ServerVersion = version, - ConnectionString = connectionString, - MultipleActiveResultSets = true, - DatabaseName = defaultSchema.Database, - DefaultSchemaName = defaultSchema.Schema, - }; - if (version.Major < 9 || version.Major==9 && version.Minor < 2) - throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported); - if (version.Major==9) - return new v09.Driver(coreServerInfo); - if (version.Major==10) - return new v10.Driver(coreServerInfo); - return new v11.Driver(coreServerInfo); - } - } - - /// - protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) - { - return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.16 + +using System; +using System.Data.Common; +using System.Linq; +using Oracle.ManagedDataAccess.Client; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Info; +using Xtensive.Sql.Drivers.Oracle.Resources; + +namespace Xtensive.Sql.Drivers.Oracle +{ + /// + /// A factory for Oracle. + /// + public class DriverFactory : SqlDriverFactory + { + private const int DefaultPort = 1521; + private const string DataSourceFormat = + "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))"; + private const string DatabaseAndSchemaQuery = + "select sys_context('USERENV', 'DB_NAME'), sys_context('USERENV', 'CURRENT_SCHEMA') from dual"; + + private static Version ParseVersion(string version) + { + var items = version.Split('.').Take(4).Select(int.Parse).ToArray(); + return new Version(items[0], items[1], items[2], items[3]); + } + + protected override string BuildConnectionString(UrlInfo url) + { + SqlHelper.ValidateConnectionUrl(url); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(url.Resource, "url.Resource"); + + var builder = new OracleConnectionStringBuilder(); + + // host, port, database + if (!string.IsNullOrEmpty(url.Host)) { + int port = url.Port!=0 ? url.Port : DefaultPort; + builder.DataSource = string.Format(DataSourceFormat, url.Host, port, url.Resource); + } + else + builder.DataSource = url.Resource; // Plain TNS name + + // user, password + if (!string.IsNullOrEmpty(url.User)) { + builder.UserID = url.User; + builder.Password = url.Password; + } + else + builder.UserID = "/"; + + // custom options + foreach (var parameter in url.Params) + builder.Add(parameter.Key, parameter.Value); + + return builder.ToString(); + } + + /// + protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + using (var connection = new OracleConnection(connectionString)) { + connection.Open(); + SqlHelper.ExecuteInitializationSql(connection, configuration); + var version = string.IsNullOrEmpty(configuration.ForcedServerVersion) + ? ParseVersion(connection.ServerVersion) + : new Version(configuration.ForcedServerVersion); + var dataSource = new OracleConnectionStringBuilder(connectionString).DataSource; + var defaultSchema = GetDefaultSchema(connection); + var coreServerInfo = new CoreServerInfo { + ServerVersion = version, + ConnectionString = connectionString, + MultipleActiveResultSets = true, + DatabaseName = defaultSchema.Database, + DefaultSchemaName = defaultSchema.Schema, + }; + if (version.Major < 9 || version.Major==9 && version.Minor < 2) + throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported); + if (version.Major==9) + return new v09.Driver(coreServerInfo); + if (version.Major==10) + return new v10.Driver(coreServerInfo); + return new v11.Driver(coreServerInfo); + } + } + + /// + protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) + { + return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.Designer.cs index 8a324c369f..4464196c88 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.Designer.cs @@ -1,117 +1,117 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Sql.Drivers.Oracle.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Oracle.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to ALTER SEQUENCE RESTART WITH is not supported. - /// - internal static string ExAlterSequenceRestartWithIsNotSupported { - get { - return ResourceManager.GetString("ExAlterSequenceRestartWithIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid boolean string '{0}'. - /// - internal static string ExInvalidBooleanStringX { - get { - return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Oracle below 9i2 is not supported.. - /// - internal static string ExOracleBelow9i2IsNotSupported { - get { - return ResourceManager.GetString("ExOracleBelow9i2IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Oracle does not support local temporary tables. - /// - internal static string ExOracleDoesNotSupportLocalTemporaryTables { - get { - return ResourceManager.GetString("ExOracleDoesNotSupportLocalTemporaryTables", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Oracle does not support trimming more that one character at once. - /// - internal static string ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce { - get { - return ResourceManager.GetString("ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Oracle does not support UPDATE FROM statements. - /// - internal static string ExOracleDoesNotSupportUpdateFromStatements { - get { - return ResourceManager.GetString("ExOracleDoesNotSupportUpdateFromStatements", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Sql.Drivers.Oracle.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Oracle.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to ALTER SEQUENCE RESTART WITH is not supported. + /// + internal static string ExAlterSequenceRestartWithIsNotSupported { + get { + return ResourceManager.GetString("ExAlterSequenceRestartWithIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid boolean string '{0}'. + /// + internal static string ExInvalidBooleanStringX { + get { + return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Oracle below 9i2 is not supported.. + /// + internal static string ExOracleBelow9i2IsNotSupported { + get { + return ResourceManager.GetString("ExOracleBelow9i2IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Oracle does not support local temporary tables. + /// + internal static string ExOracleDoesNotSupportLocalTemporaryTables { + get { + return ResourceManager.GetString("ExOracleDoesNotSupportLocalTemporaryTables", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Oracle does not support trimming more that one character at once. + /// + internal static string ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce { + get { + return ResourceManager.GetString("ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Oracle does not support UPDATE FROM statements. + /// + internal static string ExOracleDoesNotSupportUpdateFromStatements { + get { + return ResourceManager.GetString("ExOracleDoesNotSupportUpdateFromStatements", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.resx b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.resx index fc729a688c..f6b8c7e557 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/Resources/Strings.resx @@ -1,138 +1,138 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Oracle below 9i2 is not supported. - - - Invalid boolean string '{0}' - - - Oracle does not support UPDATE FROM statements - - - ALTER SEQUENCE RESTART WITH is not supported - - - Oracle does not support local temporary tables - - - Oracle does not support trimming more that one character at once - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Oracle below 9i2 is not supported. + + + Invalid boolean string '{0}' + + + Oracle does not support UPDATE FROM statements + + + ALTER SEQUENCE RESTART WITH is not supported + + + Oracle does not support local temporary tables + + + Oracle does not support trimming more that one character at once + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs index be000d19aa..f7bd2f0d1d 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs @@ -1,414 +1,414 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Xtensive.Core; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using Xtensive.Sql.Drivers.Oracle.Resources; -using System.Linq; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal class Compiler : SqlCompiler - { - private static readonly SqlExpression SundayNumber = SqlDml.Native( - "TO_NUMBER(TO_CHAR(TIMESTAMP '2009-07-26 00:00:00.000', 'D'))"); - - public override void Visit(SqlFunctionCall node) - { - switch (node.FunctionType) { - case SqlFunctionType.PadLeft: - case SqlFunctionType.PadRight: - SqlHelper.GenericPad(node).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddYears: - case SqlFunctionType.DateTimeAddYears: - DateTimeAddComponent(node.Arguments[0], node.Arguments[1], true).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddMonths: - case SqlFunctionType.DateTimeAddMonths: - DateTimeAddComponent(node.Arguments[0], node.Arguments[1], false).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalConstruct: - IntervalConstruct(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeConstruct: - DateTimeConstruct(node.Arguments[0], node.Arguments[1], node.Arguments[2]).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalAbs: - SqlHelper.IntervalAbs(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalToMilliseconds: - SqlHelper.IntervalToMilliseconds(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalToNanoseconds: - SqlHelper.IntervalToNanoseconds(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.Position: - Position(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - case SqlFunctionType.CharLength: - SqlDml.Coalesce(SqlDml.FunctionCall("LENGTH", node.Arguments[0]), 0).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToStringIso: - DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetConstruct: - DateTimeOffsetConstruct(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetTimeOfDay: - DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetToLocalTime: - DateTimeOffsetToLocalTime(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToDateTimeOffset: - DateTimeToDateTimeOffset(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetToUtcTime: - DateTimeOffsetToUtcTime(node.Arguments[0]).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - public override void Visit(SqlCreateTable node) - { - var table = node.Table as TemporaryTable; - if (table!=null && !table.IsGlobal) - throw new NotSupportedException(Strings.ExOracleDoesNotSupportLocalTemporaryTables); - base.Visit(node); - } - - public override void Visit(SqlTrim node) - { - if (node.TrimCharacters!=null && node.TrimCharacters.Length > 1) - throw new NotSupportedException(Strings.ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce); - base.Visit(node); - } - - public override void Visit(SqlExtract node) - { - switch (node.DateTimeOffsetPart) { - case SqlDateTimeOffsetPart.Day: - DateTimeOffsetExtractPart(node.Operand, "DD").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Hour: - DateTimeOffsetExtractPart(node.Operand, "HH24").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Millisecond: - DateTimeOffsetExtractPart(node.Operand, "FF3").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Nanosecond: - DateTimeOffsetExtractPart(node.Operand, "FF9").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Minute: - DateTimeOffsetExtractPart(node.Operand, "MI").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Month: - DateTimeOffsetExtractPart(node.Operand, "MM").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Second: - DateTimeOffsetExtractPart(node.Operand, "SS").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Year: - DateTimeOffsetExtractPart(node.Operand, "YYYY").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.TimeZoneHour: - DateTimeOffsetExtractPart(node.Operand, "TZH").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.TimeZoneMinute: - DateTimeOffsetExtractPart(node.Operand, "TZM").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.DayOfWeek: - DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.DayOfYear: - DateTimeOffsetExtractPart(node.Operand, "DDD").AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Date: - DateTimeOffsetTruncate(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.DateTime: - DateTimeOffsetTruncateOffset(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.LocalDateTime: - DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.UtcDateTime: - DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Offset: - DateTimeOffsetPartOffset(node.Operand).AcceptVisitor(this); - return; - } - switch (node.DateTimePart) { - case SqlDateTimePart.DayOfYear: - DateTimeExtractDayOfYear(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimePart.DayOfWeek: - DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - public override void VisitSelectFrom(SqlSelect node) - { - if (node.From!=null) - base.VisitSelectFrom(node); - else - context.Output.AppendText("FROM DUAL"); - } - - public override void Visit(SqlJoinHint node) - { - var method = translator.Translate(node.Method); - if (string.IsNullOrEmpty(method)) - return; - context.Output.AppendText(method); - context.Output.AppendText("("); - node.Table.AcceptVisitor(this); - context.Output.AppendText(")"); - } - - public override void Visit(SqlFastFirstRowsHint node) - { - context.Output.AppendText(string.Format("FIRST_ROWS({0})", node.Amount)); - } - - public override void Visit(SqlNativeHint node) - { - context.Output.AppendText(node.HintText); - } - - public override void Visit(SqlForceJoinOrderHint node) - { - if (node.Tables.IsNullOrEmpty()) - context.Output.AppendText("ORDERED"); - else { - context.Output.AppendText("LEADING("); - using (context.EnterCollectionScope()) - foreach (var table in node.Tables) - table.AcceptVisitor(this); - context.Output.AppendText(")"); - } - } - - public override void Visit(SqlUpdate node) - { - if (node.From!=null) - throw new NotSupportedException(Strings.ExOracleDoesNotSupportUpdateFromStatements); - base.Visit(node); - } - - public override void Visit(SqlUnary node) - { - switch (node.NodeType) { - case SqlNodeType.BitNot: - BitNot(node.Operand).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - public override void Visit(SqlBinary node) - { - switch (node.NodeType) { - case SqlNodeType.Modulo: - SqlDml.FunctionCall("MOD", node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.BitAnd: - BitAnd(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.BitOr: - BitOr(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.BitXor: - BitXor(node.Left, node.Right).AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - private static SqlExpression DateTimeAddComponent(SqlExpression dateTime, SqlExpression units, bool isYear) - { - return dateTime + SqlDml.FunctionCall( - "NumToYmInterval", units, AnsiString(isYear ? "year" : "month")); - } - - private static SqlExpression IntervalConstruct(SqlExpression nanoseconds) - { - const long nanosecondsPerSecond = 1000000000; - return SqlDml.FunctionCall("NumToDsInterval", - nanoseconds / SqlDml.Literal(nanosecondsPerSecond), AnsiString("second")); - } - - private static SqlExpression DateTimeConstruct(SqlExpression years, SqlExpression months, SqlExpression days) - { - return SqlDml.FunctionCall("TO_TIMESTAMP", - SqlDml.FunctionCall("TO_CHAR", ((years * 100) + months) * 100 + days), - AnsiString("YYYYMMDD")); - } - - private static SqlExpression DateTimeExtractDayOfWeek(SqlExpression dateTime) - { - // TO_CHAR with 'D' returns values depending on NLS_TERRITORY setting, - // so sunday can be 1 or 7 - // there is no equivalent for sqlserver's @@DATEFIRST function - // so we need to emulate it with very stupid code - return (SqlDml.FunctionCall("TO_NUMBER", SqlDml.FunctionCall("TO_CHAR", dateTime, AnsiString("D"))) + 7 - SundayNumber) % 7; - } - - private static SqlExpression DateTimeExtractDayOfYear(SqlExpression dateTime) - { - return SqlDml.FunctionCall("TO_NUMBER", SqlDml.FunctionCall("TO_CHAR", dateTime, AnsiString("DDD"))); - } - - private static SqlExpression BitAnd(SqlExpression left, SqlExpression right) - { - return SqlDml.FunctionCall("BITAND", left, right); - } - - private static SqlExpression BitOr(SqlExpression left, SqlExpression right) - { - return left + right - BitAnd(left, right); - } - - private static SqlExpression BitXor(SqlExpression left, SqlExpression right) - { - return BitOr(left, right) - BitAnd(left, right); - } - - private static SqlExpression BitNot(SqlExpression operand) - { - return -1 - operand; - } - - private static SqlExpression Position(SqlExpression substring, SqlExpression _string) //TODO : look into this (Malisa) - { - return SqlDml.FunctionCall("INSTR", _string, substring) - 1; - } - - private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) - { - return SqlDml.FunctionCall("To_Char", dateTime, "YYYY-MM-DD\"T\"HH24:MI:SS"); - } - - private static SqlExpression DateTimeOffsetConstruct(SqlExpression dateTime, SqlExpression offset) - { - var offsetToInt = offset as SqlLiteral; - - return SqlDml.FunctionCall("FROM_TZ", - dateTime, - AnsiString(string.Format("{0}{1}:{2}", - (offsetToInt.Value < 0) ? "-" : "+", - offsetToInt.Value / 60, - offsetToInt.Value % 60)) - ); - } - - private static SqlExpression DateTimeOffsetPartOffset(SqlExpression dateTimeOffset) - { - return SqlDml.Cast(dateTimeOffset, SqlType.DateTime) - - SqlDml.Cast(DateTimeOffsetToUtcDateTime(dateTimeOffset), SqlType.DateTime); - } - - private static SqlExpression DateTimeOffsetTimeOfDay(SqlExpression dateTimeOffset) - { - return SqlDml.Cast(dateTimeOffset, SqlType.DateTime) - - SqlDml.Truncate(SqlDml.Cast(dateTimeOffset, SqlType.DateTime)); - } - - private static SqlExpression DateTimeOffsetTruncateOffset(SqlExpression dateTimeOffset) - { - return SqlDml.Cast(dateTimeOffset, SqlType.DateTime); - } - - private static SqlExpression DateTimeOffsetTruncate(SqlExpression dateTimeOffset) - { - return SqlDml.Truncate(dateTimeOffset); - } - - private static SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("SYS_EXTRACT_UTC", dateTimeOffset); - } - - private static SqlExpression DateTimeOffsetExtractPart(SqlExpression dateTimeOffset, string dateTimeOffsetPart) - { - return SqlDml.FunctionCall("TO_CHAR", dateTimeOffset, AnsiString(dateTimeOffsetPart)); - } - - private static SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression dateTimeOffset) - { - return SqlDml.Cast( - SqlDml.DateTimePlusInterval( - DateTimeOffsetToUtcDateTime(dateTimeOffset), - SqlDml.DateTimeMinusDateTime( - DateTimeOffsetToUtcDateTime( - SqlDml.Native("SYSTIMESTAMP")), - SqlDml.Native("SYSTIMESTAMP"))), - SqlType.DateTime); - } - - - private static SqlExpression DateTimeOffsetToLocalTime(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("FROM_TZ", - SqlDml.Cast( - dateTimeOffset - - - (SysExtractUtc(SqlDml.Native("CURRENT_TIMESTAMP")) - - SysExtractUtc( - SqlDml.FunctionCall("FROM_TZ", - SqlDml.Cast(SqlDml.Native("CURRENT_TIMESTAMP"), SqlType.DateTime), - DateTimeOffsetExtractPart(dateTimeOffset, "TZR")))), - SqlType.DateTime) - , SqlDml.Native("sessiontimezone")); - } - - private static SqlExpression SysExtractUtc(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("SYS_EXTRACT_UTC", dateTimeOffset); - } - - private static SqlExpression DateTimeToDateTimeOffset(SqlExpression dateTime) - { - return SqlDml.Cast(dateTime, SqlType.DateTimeOffset); - } - - private static SqlExpression DateTimeOffsetToUtcTime(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("FROM_TZ", - DateTimeOffsetToUtcDateTime(dateTimeOffset), - AnsiString("+00:00")); - } - - private static SqlExpression AnsiString(string value) - { - return SqlDml.Native("'" + value + "'"); - } - - // Constructors - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Xtensive.Core; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using Xtensive.Sql.Drivers.Oracle.Resources; +using System.Linq; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal class Compiler : SqlCompiler + { + private static readonly SqlExpression SundayNumber = SqlDml.Native( + "TO_NUMBER(TO_CHAR(TIMESTAMP '2009-07-26 00:00:00.000', 'D'))"); + + public override void Visit(SqlFunctionCall node) + { + switch (node.FunctionType) { + case SqlFunctionType.PadLeft: + case SqlFunctionType.PadRight: + SqlHelper.GenericPad(node).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddYears: + case SqlFunctionType.DateTimeAddYears: + DateTimeAddComponent(node.Arguments[0], node.Arguments[1], true).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddMonths: + case SqlFunctionType.DateTimeAddMonths: + DateTimeAddComponent(node.Arguments[0], node.Arguments[1], false).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalConstruct: + IntervalConstruct(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeConstruct: + DateTimeConstruct(node.Arguments[0], node.Arguments[1], node.Arguments[2]).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalAbs: + SqlHelper.IntervalAbs(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalToMilliseconds: + SqlHelper.IntervalToMilliseconds(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalToNanoseconds: + SqlHelper.IntervalToNanoseconds(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.Position: + Position(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + case SqlFunctionType.CharLength: + SqlDml.Coalesce(SqlDml.FunctionCall("LENGTH", node.Arguments[0]), 0).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToStringIso: + DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetConstruct: + DateTimeOffsetConstruct(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetTimeOfDay: + DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetToLocalTime: + DateTimeOffsetToLocalTime(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToDateTimeOffset: + DateTimeToDateTimeOffset(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetToUtcTime: + DateTimeOffsetToUtcTime(node.Arguments[0]).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + public override void Visit(SqlCreateTable node) + { + var table = node.Table as TemporaryTable; + if (table!=null && !table.IsGlobal) + throw new NotSupportedException(Strings.ExOracleDoesNotSupportLocalTemporaryTables); + base.Visit(node); + } + + public override void Visit(SqlTrim node) + { + if (node.TrimCharacters!=null && node.TrimCharacters.Length > 1) + throw new NotSupportedException(Strings.ExOracleDoesNotSupportTrimmingMoreThatOneCharacterAtOnce); + base.Visit(node); + } + + public override void Visit(SqlExtract node) + { + switch (node.DateTimeOffsetPart) { + case SqlDateTimeOffsetPart.Day: + DateTimeOffsetExtractPart(node.Operand, "DD").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Hour: + DateTimeOffsetExtractPart(node.Operand, "HH24").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Millisecond: + DateTimeOffsetExtractPart(node.Operand, "FF3").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Nanosecond: + DateTimeOffsetExtractPart(node.Operand, "FF9").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Minute: + DateTimeOffsetExtractPart(node.Operand, "MI").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Month: + DateTimeOffsetExtractPart(node.Operand, "MM").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Second: + DateTimeOffsetExtractPart(node.Operand, "SS").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Year: + DateTimeOffsetExtractPart(node.Operand, "YYYY").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.TimeZoneHour: + DateTimeOffsetExtractPart(node.Operand, "TZH").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.TimeZoneMinute: + DateTimeOffsetExtractPart(node.Operand, "TZM").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.DayOfWeek: + DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.DayOfYear: + DateTimeOffsetExtractPart(node.Operand, "DDD").AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Date: + DateTimeOffsetTruncate(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.DateTime: + DateTimeOffsetTruncateOffset(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.LocalDateTime: + DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.UtcDateTime: + DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Offset: + DateTimeOffsetPartOffset(node.Operand).AcceptVisitor(this); + return; + } + switch (node.DateTimePart) { + case SqlDateTimePart.DayOfYear: + DateTimeExtractDayOfYear(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimePart.DayOfWeek: + DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + public override void VisitSelectFrom(SqlSelect node) + { + if (node.From!=null) + base.VisitSelectFrom(node); + else + context.Output.AppendText("FROM DUAL"); + } + + public override void Visit(SqlJoinHint node) + { + var method = translator.Translate(node.Method); + if (string.IsNullOrEmpty(method)) + return; + context.Output.AppendText(method); + context.Output.AppendText("("); + node.Table.AcceptVisitor(this); + context.Output.AppendText(")"); + } + + public override void Visit(SqlFastFirstRowsHint node) + { + context.Output.AppendText(string.Format("FIRST_ROWS({0})", node.Amount)); + } + + public override void Visit(SqlNativeHint node) + { + context.Output.AppendText(node.HintText); + } + + public override void Visit(SqlForceJoinOrderHint node) + { + if (node.Tables.IsNullOrEmpty()) + context.Output.AppendText("ORDERED"); + else { + context.Output.AppendText("LEADING("); + using (context.EnterCollectionScope()) + foreach (var table in node.Tables) + table.AcceptVisitor(this); + context.Output.AppendText(")"); + } + } + + public override void Visit(SqlUpdate node) + { + if (node.From!=null) + throw new NotSupportedException(Strings.ExOracleDoesNotSupportUpdateFromStatements); + base.Visit(node); + } + + public override void Visit(SqlUnary node) + { + switch (node.NodeType) { + case SqlNodeType.BitNot: + BitNot(node.Operand).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + public override void Visit(SqlBinary node) + { + switch (node.NodeType) { + case SqlNodeType.Modulo: + SqlDml.FunctionCall("MOD", node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.BitAnd: + BitAnd(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.BitOr: + BitOr(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.BitXor: + BitXor(node.Left, node.Right).AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + private static SqlExpression DateTimeAddComponent(SqlExpression dateTime, SqlExpression units, bool isYear) + { + return dateTime + SqlDml.FunctionCall( + "NumToYmInterval", units, AnsiString(isYear ? "year" : "month")); + } + + private static SqlExpression IntervalConstruct(SqlExpression nanoseconds) + { + const long nanosecondsPerSecond = 1000000000; + return SqlDml.FunctionCall("NumToDsInterval", + nanoseconds / SqlDml.Literal(nanosecondsPerSecond), AnsiString("second")); + } + + private static SqlExpression DateTimeConstruct(SqlExpression years, SqlExpression months, SqlExpression days) + { + return SqlDml.FunctionCall("TO_TIMESTAMP", + SqlDml.FunctionCall("TO_CHAR", ((years * 100) + months) * 100 + days), + AnsiString("YYYYMMDD")); + } + + private static SqlExpression DateTimeExtractDayOfWeek(SqlExpression dateTime) + { + // TO_CHAR with 'D' returns values depending on NLS_TERRITORY setting, + // so sunday can be 1 or 7 + // there is no equivalent for sqlserver's @@DATEFIRST function + // so we need to emulate it with very stupid code + return (SqlDml.FunctionCall("TO_NUMBER", SqlDml.FunctionCall("TO_CHAR", dateTime, AnsiString("D"))) + 7 - SundayNumber) % 7; + } + + private static SqlExpression DateTimeExtractDayOfYear(SqlExpression dateTime) + { + return SqlDml.FunctionCall("TO_NUMBER", SqlDml.FunctionCall("TO_CHAR", dateTime, AnsiString("DDD"))); + } + + private static SqlExpression BitAnd(SqlExpression left, SqlExpression right) + { + return SqlDml.FunctionCall("BITAND", left, right); + } + + private static SqlExpression BitOr(SqlExpression left, SqlExpression right) + { + return left + right - BitAnd(left, right); + } + + private static SqlExpression BitXor(SqlExpression left, SqlExpression right) + { + return BitOr(left, right) - BitAnd(left, right); + } + + private static SqlExpression BitNot(SqlExpression operand) + { + return -1 - operand; + } + + private static SqlExpression Position(SqlExpression substring, SqlExpression _string) //TODO : look into this (Malisa) + { + return SqlDml.FunctionCall("INSTR", _string, substring) - 1; + } + + private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) + { + return SqlDml.FunctionCall("To_Char", dateTime, "YYYY-MM-DD\"T\"HH24:MI:SS"); + } + + private static SqlExpression DateTimeOffsetConstruct(SqlExpression dateTime, SqlExpression offset) + { + var offsetToInt = offset as SqlLiteral; + + return SqlDml.FunctionCall("FROM_TZ", + dateTime, + AnsiString(string.Format("{0}{1}:{2}", + (offsetToInt.Value < 0) ? "-" : "+", + offsetToInt.Value / 60, + offsetToInt.Value % 60)) + ); + } + + private static SqlExpression DateTimeOffsetPartOffset(SqlExpression dateTimeOffset) + { + return SqlDml.Cast(dateTimeOffset, SqlType.DateTime) + - SqlDml.Cast(DateTimeOffsetToUtcDateTime(dateTimeOffset), SqlType.DateTime); + } + + private static SqlExpression DateTimeOffsetTimeOfDay(SqlExpression dateTimeOffset) + { + return SqlDml.Cast(dateTimeOffset, SqlType.DateTime) + - SqlDml.Truncate(SqlDml.Cast(dateTimeOffset, SqlType.DateTime)); + } + + private static SqlExpression DateTimeOffsetTruncateOffset(SqlExpression dateTimeOffset) + { + return SqlDml.Cast(dateTimeOffset, SqlType.DateTime); + } + + private static SqlExpression DateTimeOffsetTruncate(SqlExpression dateTimeOffset) + { + return SqlDml.Truncate(dateTimeOffset); + } + + private static SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("SYS_EXTRACT_UTC", dateTimeOffset); + } + + private static SqlExpression DateTimeOffsetExtractPart(SqlExpression dateTimeOffset, string dateTimeOffsetPart) + { + return SqlDml.FunctionCall("TO_CHAR", dateTimeOffset, AnsiString(dateTimeOffsetPart)); + } + + private static SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression dateTimeOffset) + { + return SqlDml.Cast( + SqlDml.DateTimePlusInterval( + DateTimeOffsetToUtcDateTime(dateTimeOffset), + SqlDml.DateTimeMinusDateTime( + DateTimeOffsetToUtcDateTime( + SqlDml.Native("SYSTIMESTAMP")), + SqlDml.Native("SYSTIMESTAMP"))), + SqlType.DateTime); + } + + + private static SqlExpression DateTimeOffsetToLocalTime(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("FROM_TZ", + SqlDml.Cast( + dateTimeOffset + - + (SysExtractUtc(SqlDml.Native("CURRENT_TIMESTAMP")) + - SysExtractUtc( + SqlDml.FunctionCall("FROM_TZ", + SqlDml.Cast(SqlDml.Native("CURRENT_TIMESTAMP"), SqlType.DateTime), + DateTimeOffsetExtractPart(dateTimeOffset, "TZR")))), + SqlType.DateTime) + , SqlDml.Native("sessiontimezone")); + } + + private static SqlExpression SysExtractUtc(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("SYS_EXTRACT_UTC", dateTimeOffset); + } + + private static SqlExpression DateTimeToDateTimeOffset(SqlExpression dateTime) + { + return SqlDml.Cast(dateTime, SqlType.DateTimeOffset); + } + + private static SqlExpression DateTimeOffsetToUtcTime(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("FROM_TZ", + DateTimeOffsetToUtcDateTime(dateTimeOffset), + AnsiString("+00:00")); + } + + private static SqlExpression AnsiString(string value) + { + return SqlDml.Native("'" + value + "'"); + } + + // Constructors + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Driver.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Driver.cs index 9bee3c07d4..a6f5004797 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Driver.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Driver.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal class Driver : Oracle.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) - { - builder.Add(typeof (DateTimeOffset), - builder.Mapper.ReadDateTimeOffset, - builder.Mapper.BindDateTimeOffset, - builder.Mapper.MapDateTimeOffset); - } - - protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) - { - builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal class Driver : Oracle.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) + { + builder.Add(typeof (DateTimeOffset), + builder.Mapper.ReadDateTimeOffset, + builder.Mapper.BindDateTimeOffset, + builder.Mapper.MapDateTimeOffset); + } + + protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) + { + builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.Queries.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.Queries.cs index a461371d3c..f86db4b1bd 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.Queries.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.Queries.cs @@ -1,249 +1,249 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.16 - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - partial class Extractor - { - protected const string SchemaFilterPlaceholder = "{SCHEMA_FILTER}"; - protected const string TableFilterPlaceholder = "{TABLE_FILTER}"; - protected const string IndexesFilterPlaceholder = "{INDEXES_FILTER}"; - - protected string GetExtractSchemasQuery() - { - return -@"SELECT - USERNAME -FROM - SYS.ALL_USERS"; - } - - protected string GetExtractTablesQuery() - { - return -@"SELECT - OWNER, - TABLE_NAME, - TEMPORARY, - DURATION -FROM - SYS.ALL_TABLES -WHERE - (NESTED = 'NO') - AND (OWNER {SCHEMA_FILTER}) - AND (TABLE_NAME {TABLE_FILTER})"; - } - - protected string GetExtractTableColumnsQuery() - { - return -@"SELECT - columns.OWNER, - columns.TABLE_NAME, - columns.COLUMN_NAME, - columns.DATA_TYPE, - columns.DATA_PRECISION, - columns.DATA_SCALE, - columns.CHAR_LENGTH, - columns.NULLABLE, - columns.DATA_DEFAULT, - columns.COLUMN_ID -FROM - SYS.ALL_TAB_COLUMNS columns - JOIN SYS.ALL_TABLES tables - ON ((columns.TABLE_NAME = tables.TABLE_NAME) - AND (columns.OWNER = tables.OWNER)) -WHERE - columns.OWNER {SCHEMA_FILTER} - AND columns.TABLE_NAME {TABLE_FILTER} -ORDER BY - columns.OWNER, - columns.TABLE_NAME, - columns.COLUMN_ID"; - } - - protected string GetExtractViewsQuery() - { - return -@"SELECT - OWNER, - VIEW_NAME, - TEXT -FROM - SYS.ALL_VIEWS views -WHERE - OWNER {SCHEMA_FILTER}"; - } - - protected string GetExtractViewColumnsQuery() - { - return -@"SELECT - columns.OWNER, - columns.TABLE_NAME, - columns.COLUMN_NAME, - columns.COLUMN_ID -FROM - SYS.ALL_TAB_COLUMNS columns - JOIN SYS.ALL_VIEWS views - ON ((columns.TABLE_NAME = views.VIEW_NAME) - AND (columns.OWNER = views.OWNER)) -WHERE - columns.OWNER {SCHEMA_FILTER} -ORDER BY - columns.OWNER, - columns.TABLE_NAME, - columns.COLUMN_ID"; - } - - protected string GetExtractIndexesQuery() - { - return -@"SELECT - indexes.TABLE_OWNER, - indexes.TABLE_NAME, - indexes.INDEX_NAME, - indexes.UNIQUENESS, - indexes.INDEX_TYPE, - indexes.PCT_FREE, - columns.COLUMN_POSITION, - columns.COLUMN_NAME, - columns.DESCEND, - expressions.COLUMN_EXPRESSION -FROM - SYS.ALL_IND_COLUMNS columns - JOIN SYS.ALL_INDEXES indexes - ON ((indexes.INDEX_NAME = columns.INDEX_NAME) - AND (indexes.OWNER = columns.INDEX_OWNER)) - LEFT JOIN SYS.ALL_IND_EXPRESSIONS expressions - ON ((columns.INDEX_NAME = expressions.INDEX_NAME) - AND (columns.INDEX_OWNER = expressions.INDEX_OWNER) - AND (columns.COLUMN_POSITION = expressions.COLUMN_POSITION)) -WHERE - indexes.INDEX_TYPE IN ('NORMAL', 'BITMAP', 'FUNCTION-BASED NORMAL', 'FUNCTION-BASED BITMAP') - AND (indexes.TABLE_NAME {TABLE_FILTER}) - AND (indexes.TABLE_OWNER {SCHEMA_FILTER}) - AND ({INDEXES_FILTER}) - AND ((indexes.OWNER, indexes.INDEX_NAME) NOT IN ( - SELECT - constraints.INDEX_OWNER, - constraints.INDEX_NAME - FROM - SYS.ALL_CONSTRAINTS constraints - JOIN SYS.ALL_TABLES tables - ON ((constraints.OWNER = tables.OWNER) - AND (constraints.TABLE_NAME = tables.TABLE_NAME)) - WHERE - (constraints.CONSTRAINT_TYPE IN ('P', 'U') - AND (constraints.OWNER {SCHEMA_FILTER})))) -ORDER BY - indexes.TABLE_OWNER, - indexes.TABLE_NAME, - indexes.INDEX_NAME, - columns.COLUMN_POSITION"; - } - - protected string GetExtractForeignKeysQuery() - { - return -@"SELECT - constraints.OWNER, - constraints.TABLE_NAME, - constraints.CONSTRAINT_NAME, - constraints.""DEFERRABLE"", - constraints.""DEFERRED"", - constraints.DELETE_RULE, - columns.COLUMN_NAME, - columns.POSITION, - rel_columns.OWNER, - rel_columns.TABLE_NAME, - rel_columns.COLUMN_NAME -FROM - SYS.ALL_CONSTRAINTS constraints - JOIN SYS.ALL_CONS_COLUMNS columns - ON ((constraints.CONSTRAINT_NAME = columns.CONSTRAINT_NAME) - AND (constraints.OWNER = columns.OWNER)) - JOIN SYS.ALL_CONS_COLUMNS rel_columns - ON ((constraints.R_CONSTRAINT_NAME = rel_columns.CONSTRAINT_NAME) - AND (constraints.R_OWNER = rel_columns.OWNER) - AND (columns.POSITION = rel_columns.POSITION)) - JOIN SYS.ALL_TABLES tables - ON ((constraints.OWNER = tables.OWNER) - AND (constraints.TABLE_NAME = tables.TABLE_NAME)) -WHERE - (constraints.CONSTRAINT_TYPE = 'R') - AND (constraints.OWNER {SCHEMA_FILTER}) -ORDER BY - constraints.OWNER, constraints.TABLE_NAME, constraints.CONSTRAINT_NAME, rel_columns.POSITION"; - } - - protected string GetExtractCheckConstraintsQuery() - { - return -@"SELECT - constraints.OWNER, - constraints.TABLE_NAME, - constraints.CONSTRAINT_NAME, - constraints.SEARCH_CONDITION, - constraints.""DEFERRABLE"", - constraints.""DEFERRED"" -FROM - SYS.ALL_CONSTRAINTS constraints - JOIN SYS.ALL_TABLES tables - ON ((constraints.OWNER = tables.OWNER) - AND (constraints.TABLE_NAME = tables.TABLE_NAME)) -WHERE - (constraints.CONSTRAINT_TYPE = 'C') - AND (constraints.GENERATED = 'USER NAME') - AND (constraints.OWNER {SCHEMA_FILTER})"; - } - - protected string GetExtractUniqueAndPrimaryKeyConstraintsQuery() - { - return -@"SELECT - constraints.OWNER, - constraints.TABLE_NAME, - constraints.CONSTRAINT_NAME, - constraints.CONSTRAINT_TYPE, - columns.COLUMN_NAME, - columns.POSITION -FROM - SYS.ALL_CONSTRAINTS constraints - JOIN SYS.ALL_CONS_COLUMNS columns - ON ((constraints.CONSTRAINT_NAME = columns.CONSTRAINT_NAME) - AND (constraints.OWNER = columns.OWNER)) - JOIN SYS.ALL_TABLES tables - ON ((constraints.OWNER = tables.OWNER) - AND (constraints.TABLE_NAME = tables.TABLE_NAME)) -WHERE - (constraints.CONSTRAINT_TYPE IN ('P', 'U')) - AND (constraints.OWNER {SCHEMA_FILTER}) - AND (constraints.TABLE_NAME {TABLE_FILTER}) -ORDER BY - constraints.OWNER, - constraints.TABLE_NAME, - constraints.CONSTRAINT_NAME, - columns.POSITION"; - } - - protected virtual string GetExtractSequencesQuery() - { - return -@"SELECT - SEQUENCE_OWNER, - SEQUENCE_NAME, - MIN_VALUE, - MAX_VALUE, - INCREMENT_BY, - CYCLE_FLAG -FROM - SYS.ALL_SEQUENCES -WHERE - SEQUENCE_OWNER {SCHEMA_FILTER}"; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.16 + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + partial class Extractor + { + protected const string SchemaFilterPlaceholder = "{SCHEMA_FILTER}"; + protected const string TableFilterPlaceholder = "{TABLE_FILTER}"; + protected const string IndexesFilterPlaceholder = "{INDEXES_FILTER}"; + + protected string GetExtractSchemasQuery() + { + return +@"SELECT + USERNAME +FROM + SYS.ALL_USERS"; + } + + protected string GetExtractTablesQuery() + { + return +@"SELECT + OWNER, + TABLE_NAME, + TEMPORARY, + DURATION +FROM + SYS.ALL_TABLES +WHERE + (NESTED = 'NO') + AND (OWNER {SCHEMA_FILTER}) + AND (TABLE_NAME {TABLE_FILTER})"; + } + + protected string GetExtractTableColumnsQuery() + { + return +@"SELECT + columns.OWNER, + columns.TABLE_NAME, + columns.COLUMN_NAME, + columns.DATA_TYPE, + columns.DATA_PRECISION, + columns.DATA_SCALE, + columns.CHAR_LENGTH, + columns.NULLABLE, + columns.DATA_DEFAULT, + columns.COLUMN_ID +FROM + SYS.ALL_TAB_COLUMNS columns + JOIN SYS.ALL_TABLES tables + ON ((columns.TABLE_NAME = tables.TABLE_NAME) + AND (columns.OWNER = tables.OWNER)) +WHERE + columns.OWNER {SCHEMA_FILTER} + AND columns.TABLE_NAME {TABLE_FILTER} +ORDER BY + columns.OWNER, + columns.TABLE_NAME, + columns.COLUMN_ID"; + } + + protected string GetExtractViewsQuery() + { + return +@"SELECT + OWNER, + VIEW_NAME, + TEXT +FROM + SYS.ALL_VIEWS views +WHERE + OWNER {SCHEMA_FILTER}"; + } + + protected string GetExtractViewColumnsQuery() + { + return +@"SELECT + columns.OWNER, + columns.TABLE_NAME, + columns.COLUMN_NAME, + columns.COLUMN_ID +FROM + SYS.ALL_TAB_COLUMNS columns + JOIN SYS.ALL_VIEWS views + ON ((columns.TABLE_NAME = views.VIEW_NAME) + AND (columns.OWNER = views.OWNER)) +WHERE + columns.OWNER {SCHEMA_FILTER} +ORDER BY + columns.OWNER, + columns.TABLE_NAME, + columns.COLUMN_ID"; + } + + protected string GetExtractIndexesQuery() + { + return +@"SELECT + indexes.TABLE_OWNER, + indexes.TABLE_NAME, + indexes.INDEX_NAME, + indexes.UNIQUENESS, + indexes.INDEX_TYPE, + indexes.PCT_FREE, + columns.COLUMN_POSITION, + columns.COLUMN_NAME, + columns.DESCEND, + expressions.COLUMN_EXPRESSION +FROM + SYS.ALL_IND_COLUMNS columns + JOIN SYS.ALL_INDEXES indexes + ON ((indexes.INDEX_NAME = columns.INDEX_NAME) + AND (indexes.OWNER = columns.INDEX_OWNER)) + LEFT JOIN SYS.ALL_IND_EXPRESSIONS expressions + ON ((columns.INDEX_NAME = expressions.INDEX_NAME) + AND (columns.INDEX_OWNER = expressions.INDEX_OWNER) + AND (columns.COLUMN_POSITION = expressions.COLUMN_POSITION)) +WHERE + indexes.INDEX_TYPE IN ('NORMAL', 'BITMAP', 'FUNCTION-BASED NORMAL', 'FUNCTION-BASED BITMAP') + AND (indexes.TABLE_NAME {TABLE_FILTER}) + AND (indexes.TABLE_OWNER {SCHEMA_FILTER}) + AND ({INDEXES_FILTER}) + AND ((indexes.OWNER, indexes.INDEX_NAME) NOT IN ( + SELECT + constraints.INDEX_OWNER, + constraints.INDEX_NAME + FROM + SYS.ALL_CONSTRAINTS constraints + JOIN SYS.ALL_TABLES tables + ON ((constraints.OWNER = tables.OWNER) + AND (constraints.TABLE_NAME = tables.TABLE_NAME)) + WHERE + (constraints.CONSTRAINT_TYPE IN ('P', 'U') + AND (constraints.OWNER {SCHEMA_FILTER})))) +ORDER BY + indexes.TABLE_OWNER, + indexes.TABLE_NAME, + indexes.INDEX_NAME, + columns.COLUMN_POSITION"; + } + + protected string GetExtractForeignKeysQuery() + { + return +@"SELECT + constraints.OWNER, + constraints.TABLE_NAME, + constraints.CONSTRAINT_NAME, + constraints.""DEFERRABLE"", + constraints.""DEFERRED"", + constraints.DELETE_RULE, + columns.COLUMN_NAME, + columns.POSITION, + rel_columns.OWNER, + rel_columns.TABLE_NAME, + rel_columns.COLUMN_NAME +FROM + SYS.ALL_CONSTRAINTS constraints + JOIN SYS.ALL_CONS_COLUMNS columns + ON ((constraints.CONSTRAINT_NAME = columns.CONSTRAINT_NAME) + AND (constraints.OWNER = columns.OWNER)) + JOIN SYS.ALL_CONS_COLUMNS rel_columns + ON ((constraints.R_CONSTRAINT_NAME = rel_columns.CONSTRAINT_NAME) + AND (constraints.R_OWNER = rel_columns.OWNER) + AND (columns.POSITION = rel_columns.POSITION)) + JOIN SYS.ALL_TABLES tables + ON ((constraints.OWNER = tables.OWNER) + AND (constraints.TABLE_NAME = tables.TABLE_NAME)) +WHERE + (constraints.CONSTRAINT_TYPE = 'R') + AND (constraints.OWNER {SCHEMA_FILTER}) +ORDER BY + constraints.OWNER, constraints.TABLE_NAME, constraints.CONSTRAINT_NAME, rel_columns.POSITION"; + } + + protected string GetExtractCheckConstraintsQuery() + { + return +@"SELECT + constraints.OWNER, + constraints.TABLE_NAME, + constraints.CONSTRAINT_NAME, + constraints.SEARCH_CONDITION, + constraints.""DEFERRABLE"", + constraints.""DEFERRED"" +FROM + SYS.ALL_CONSTRAINTS constraints + JOIN SYS.ALL_TABLES tables + ON ((constraints.OWNER = tables.OWNER) + AND (constraints.TABLE_NAME = tables.TABLE_NAME)) +WHERE + (constraints.CONSTRAINT_TYPE = 'C') + AND (constraints.GENERATED = 'USER NAME') + AND (constraints.OWNER {SCHEMA_FILTER})"; + } + + protected string GetExtractUniqueAndPrimaryKeyConstraintsQuery() + { + return +@"SELECT + constraints.OWNER, + constraints.TABLE_NAME, + constraints.CONSTRAINT_NAME, + constraints.CONSTRAINT_TYPE, + columns.COLUMN_NAME, + columns.POSITION +FROM + SYS.ALL_CONSTRAINTS constraints + JOIN SYS.ALL_CONS_COLUMNS columns + ON ((constraints.CONSTRAINT_NAME = columns.CONSTRAINT_NAME) + AND (constraints.OWNER = columns.OWNER)) + JOIN SYS.ALL_TABLES tables + ON ((constraints.OWNER = tables.OWNER) + AND (constraints.TABLE_NAME = tables.TABLE_NAME)) +WHERE + (constraints.CONSTRAINT_TYPE IN ('P', 'U')) + AND (constraints.OWNER {SCHEMA_FILTER}) + AND (constraints.TABLE_NAME {TABLE_FILTER}) +ORDER BY + constraints.OWNER, + constraints.TABLE_NAME, + constraints.CONSTRAINT_NAME, + columns.POSITION"; + } + + protected virtual string GetExtractSequencesQuery() + { + return +@"SELECT + SEQUENCE_OWNER, + SEQUENCE_NAME, + MIN_VALUE, + MAX_VALUE, + INCREMENT_BY, + CYCLE_FLAG +FROM + SYS.ALL_SEQUENCES +WHERE + SEQUENCE_OWNER {SCHEMA_FILTER}"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.cs index 7628d8b000..dadb3b0346 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.cs @@ -1,519 +1,519 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Linq; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Xtensive.Core; -using Xtensive.Sql.Model; -using Xtensive.Sql.Drivers.Oracle.Resources; -using Constraint=Xtensive.Sql.Model.Constraint; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal partial class Extractor : Model.Extractor - { - private const int DefaultPrecision = 38; - private const int DefaultScale = 0; - - private readonly HashSet targetSchemes = new HashSet(); - private readonly Dictionary replacementsRegistry = new Dictionary(); - - private Catalog theCatalog; - - private string nonSystemSchemasFilter; - - public override Catalog ExtractCatalog(string catalogName) - { - theCatalog = new Catalog(catalogName); - targetSchemes.Clear(); - - RegisterReplacements(replacementsRegistry); - ExtractSchemas(); - ExtractCatalogContents(); - return theCatalog; - } - - public override Schema ExtractSchema(string catalogName, string schemaName) - { - targetSchemes.Clear(); - theCatalog = new Catalog(catalogName); - var targetSchema = schemaName.ToUpperInvariant(); - targetSchemes.Add(targetSchema); - - RegisterReplacements(replacementsRegistry); - ExtractSchemas(); - EnsureShemasExists(theCatalog, new []{schemaName}); - ExtractCatalogContents(); - return theCatalog.Schemas[targetSchema]; - } - - public override Catalog ExtractSchemes(string catalogName, string[] schemaNames) - { - theCatalog = new Catalog(catalogName); - targetSchemes.Clear(); - foreach (var schemaName in schemaNames) { - var targetSchema = schemaName.ToUpperInvariant(); - targetSchemes.Add(targetSchema); - } - - RegisterReplacements(replacementsRegistry); - ExtractSchemas(); - EnsureShemasExists(theCatalog, schemaNames); - ExtractCatalogContents(); - return theCatalog; - } - - private void ExtractCatalogContents() - { - ExtractTables(); - ExtractTableColumns(); - ExtractViews(); - ExtractViewColumns(); - ExtractIndexes(); - ExtractForeignKeys(); - ExtractCheckConstaints(); - ExtractUniqueAndPrimaryKeyConstraints(); - ExtractSequences(); - } - - private void ExtractSchemas() - { - // oracle does not clearly distinct users and schemas. - // so we extract just users. - using (var reader = ExecuteReader(GetExtractSchemasQuery())) - while (reader.Read()) - theCatalog.CreateSchema(reader.GetString(0)); - // choosing the default schema - var defaultSchemaName = Driver.CoreServerInfo.DefaultSchemaName.ToUpperInvariant(); - var defaultSchema = theCatalog.Schemas[defaultSchemaName]; - theCatalog.DefaultSchema = defaultSchema; - } - - private void ExtractTables() - { - using (var reader = ExecuteReader(GetExtractTablesQuery())) { - while (reader.Read()) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - string tableName = reader.GetString(1); - bool isTemporary = ReadBool(reader, 2); - if (isTemporary) { - var table = schema.CreateTemporaryTable(tableName); - table.PreserveRows = reader.GetString(3)=="SYS$SESSION"; - table.IsGlobal = true; - } - else { - schema.CreateTable(tableName); - } - } - } - } - - private void ExtractTableColumns() - { - using (var reader = ExecuteReader(GetExtractTableColumnsQuery())) { - Table table = null; - int lastColumnId = int.MaxValue; - while (reader.Read()) { - int columnId = ReadInt(reader, 9); - if (columnId <= lastColumnId) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1)]; - } - var column = table.CreateColumn(reader.GetString(2)); - column.DataType = CreateValueType(reader, 3, 4, 5, 6); - column.IsNullable = ReadBool(reader, 7); - var defaultValue = ReadStringOrNull(reader, 8); - if (!string.IsNullOrEmpty(defaultValue)) - column.DefaultValue = SqlDml.Native(defaultValue); - lastColumnId = columnId; - } - } - } - - private void ExtractViews() - { - using (var reader = ExecuteReader(GetExtractViewsQuery())) { - while (reader.Read()) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - var view = reader.GetString(1); - var definition = ReadStringOrNull(reader, 2); - if (string.IsNullOrEmpty(definition)) - schema.CreateView(view); - else - schema.CreateView(view, SqlDml.Native(definition)); - } - } - } - - private void ExtractViewColumns() - { - using (var reader = ExecuteReader(GetExtractViewColumnsQuery())) { - int lastColumnId = int.MaxValue; - View view = null; - while (reader.Read()) { - int columnId = ReadInt(reader, 3); - if (columnId <= lastColumnId) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - view = schema.Views[reader.GetString(1)]; - } - view.CreateColumn(reader.GetString(2)); - lastColumnId = columnId; - } - } - } - - private void ExtractIndexes() - { - // it's possible to have table and index in different schemas in oracle. - // we silently ignore this, indexes are always belong to the same schema as its table. - using (var reader = (OracleDataReader) ExecuteReader(GetExtractIndexesQuery())) { - int lastColumnPosition = int.MaxValue; - Table table = null; - Index index = null; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 6); - if (columnPosition <= lastColumnPosition) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1)]; - index = table.CreateIndex(reader.GetString(2)); - index.IsUnique = ReadBool(reader, 3); - index.IsBitmap = reader.GetString(4).EndsWith("BITMAP"); - if (!reader.IsDBNull(5)) { - int pctFree = ReadInt(reader, 5); - index.FillFactor = (byte) (100 - pctFree); - } - } - var columnName = reader.IsDBNull(9) ? reader.GetString(7) : reader.GetOracleString(9).Value; - columnName = columnName.Trim('"'); - var column = table.TableColumns[columnName]; - bool isAscending = reader.GetString(8)=="ASC"; - index.CreateIndexColumn(column, isAscending); - lastColumnPosition = columnPosition; - } - } - } - - private void ExtractForeignKeys() - { - using (var reader = ExecuteReader(GetExtractForeignKeysQuery())) { - int lastColumnPosition = int.MaxValue; - ForeignKey constraint = null; - Table referencingTable = null; - Table referencedTable = null; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 7); - if (columnPosition <= lastColumnPosition) { - var referencingSchema = theCatalog.Schemas[reader.GetString(0)]; - referencingTable = referencingSchema.Tables[reader.GetString(1)]; - constraint = referencingTable.CreateForeignKey(reader.GetString(2)); - ReadConstraintProperties(constraint, reader, 3, 4); - ReadCascadeAction(constraint, reader, 5); - var referencedSchema = theCatalog.Schemas[reader.GetString(8)]; - referencedTable = referencedSchema.Tables[reader.GetString(9)]; - constraint.ReferencedTable = referencedTable; - } - var referencingColumn = referencingTable.TableColumns[reader.GetString(6)]; - var referencedColumn = referencedTable.TableColumns[reader.GetString(10)]; - constraint.Columns.Add(referencingColumn); - constraint.ReferencedColumns.Add(referencedColumn); - lastColumnPosition = columnPosition; - } - } - } - - private void ExtractUniqueAndPrimaryKeyConstraints() - { - using (var reader = ExecuteReader(GetExtractUniqueAndPrimaryKeyConstraintsQuery())) { - Table table = null; - string constraintName = null; - string constraintType = null; - var columns = new List(); - int lastColumnPosition = -1; - while (reader.Read()) { - int columnPosition = ReadInt(reader, 5); - if (columnPosition <= lastColumnPosition) { - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - columns.Clear(); - } - if (columns.Count==0) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - table = schema.Tables[reader.GetString(1)]; - constraintName = reader.GetString(2); - constraintType = reader.GetString(3); - } - columns.Add(table.TableColumns[reader.GetString(4)]); - lastColumnPosition = columnPosition; - } - if (columns.Count > 0) - CreateIndexBasedConstraint(table, constraintName, constraintType, columns); - } - } - - private void ExtractCheckConstaints() - { - using (var reader = ExecuteReader(GetExtractCheckConstraintsQuery())) { - while (reader.Read()) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - var table = schema.Tables[reader.GetString(1)]; - var name = reader.GetString(2); - // It looks like ODP.NET sometimes fail to read a LONG column via GetString - // It returns empty string instead of the actual value. - var condition = string.IsNullOrEmpty(reader.GetString(3)) - ? null - : SqlDml.Native(reader.GetString(3)); - var constraint = table.CreateCheckConstraint(name, condition); - ReadConstraintProperties(constraint, reader, 4, 5); - } - } - } - - private void ExtractSequences() - { - using (var reader = ExecuteReader(GetExtractSequencesQuery())) { - while (reader.Read()) { - var schema = theCatalog.Schemas[reader.GetString(0)]; - var sequence = schema.CreateSequence(reader.GetString(1)); - var descriptor = sequence.SequenceDescriptor; - descriptor.MinValue = ReadLong(reader, 2); - descriptor.MaxValue = ReadLong(reader, 3); - descriptor.Increment = ReadLong(reader, 4); - descriptor.IsCyclic = ReadBool(reader, 5); - } - } - } - - private SqlValueType CreateValueType(IDataRecord row, - int typeNameIndex, int precisionIndex, int scaleIndex, int charLengthIndex) - { - string typeName = row.GetString(typeNameIndex); - if (typeName=="NUMBER") { - int precision = row.IsDBNull(precisionIndex) ? DefaultPrecision : ReadInt(row, precisionIndex); - int scale = row.IsDBNull(scaleIndex) ? DefaultScale : ReadInt(row, scaleIndex); - return new SqlValueType(SqlType.Decimal, precision, scale); - } - if (typeName.StartsWith("INTERVAL DAY")) { - // ignoring "day precision" and "second precision" - // although they can be read as "scale" and "precision" - return new SqlValueType(SqlType.Interval); - } - if (typeName.StartsWith("TIMESTAMP")) { - // "timestamp precision" is saved as "scale", ignoring too - if (typeName.Contains("WITH TIME ZONE")) - return new SqlValueType(SqlType.DateTimeOffset); - return new SqlValueType(SqlType.DateTime); - } - if (typeName=="NVARCHAR2" || typeName=="NCHAR") { - int length = ReadInt(row, charLengthIndex); - var sqlType = typeName.Length==5 ? SqlType.Char : SqlType.VarChar; - return new SqlValueType(sqlType, length); - } - var typeInfo = Driver.ServerInfo.DataTypes[typeName]; - return typeInfo!=null - ? new SqlValueType(typeInfo.Type) - : new SqlValueType(typeName); - } - - private static void CreateIndexBasedConstraint( - Table table, string constraintName, string constraintType, List columns) - { - switch (constraintType) { - case "P": - table.CreatePrimaryKey(constraintName, columns.ToArray()); - return; - case "U": - table.CreateUniqueConstraint(constraintName, columns.ToArray()); - return; - default: - throw new ArgumentOutOfRangeException("constraintType"); - } - } - - private static bool ReadBool(IDataRecord row, int index) - { - var value = row.GetString(index); - switch (value) { - case "Y": - case "YES": - case "ENABLED": - case "UNIQUE": - return true; - case "N": - case "NO": - case "DISABLED": - case "NONUNIQUE": - return false; - default: - throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)); - } - } - - private static long ReadLong(IDataRecord row, int index) - { - decimal value = row.GetDecimal(index); - - if (value > long.MaxValue) - return long.MaxValue; - - if (value < long.MinValue) - return long.MinValue; - - return (long)value; - } - - private static int ReadInt(IDataRecord row, int index) - { - decimal value = row.GetDecimal(index); - - if (value > int.MaxValue) - return int.MaxValue; - - if (value < int.MinValue) - return int.MinValue; - - return (int)value; - } - - private static string ReadStringOrNull(IDataRecord row, int index) - { - return row.IsDBNull(index) ? null : row.GetString(index); - } - - private static void ReadConstraintProperties(Constraint constraint, - IDataRecord row, int isDeferrableIndex, int isInitiallyDeferredIndex) - { - constraint.IsDeferrable = row.GetString(isDeferrableIndex)=="DEFERRABLE"; - constraint.IsInitiallyDeferred = row.GetString(isInitiallyDeferredIndex)=="DEFERRED"; - } - - private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) - { - var deleteRule = row.GetString(deleteRuleIndex); - switch (deleteRule) { - case "CASCADE": - foreignKey.OnDelete = ReferentialAction.Cascade; - return; - case "SET NULL": - foreignKey.OnDelete = ReferentialAction.SetNull; - return; - case "NO ACTION": - foreignKey.OnDelete = ReferentialAction.NoAction; - return; - } - } - - protected virtual void RegisterReplacements(Dictionary replacements) - { - var schemaFilter = targetSchemes!=null && targetSchemes.Count!=0 - ? MakeSchemaFilter() - //? "= " + SqlHelper.QuoteString(targetSchema) - : GetNonSystemSchemasFilter(); - replacements[SchemaFilterPlaceholder] = schemaFilter; - replacements[IndexesFilterPlaceholder] = "1 > 0"; - replacements[TableFilterPlaceholder] = "IS NOT NULL"; - } - - private string PerformReplacements(string query) - { - foreach (var registry in replacementsRegistry) - query = query.Replace(registry.Key, registry.Value); - return query; - } - - private string MakeSchemaFilter() - { - var schemaStrings = targetSchemes.Select(SqlHelper.QuoteString); - var schemaList = string.Join(",", schemaStrings); - return string.Format("IN ({0})", schemaList); - } - - protected override DbDataReader ExecuteReader(string commandText) - { - var realCommandText = PerformReplacements(commandText); - using (var command = (OracleCommand) Connection.CreateCommand(realCommandText)) { - // This option is required to access LONG columns - command.InitialLONGFetchSize = -1; - return command.ExecuteReader(); - } - } - - protected override DbDataReader ExecuteReader(ISqlCompileUnit statement) - { - var commandText = Connection.Driver.Compile(statement).GetCommandText(); - return base.ExecuteReader(PerformReplacements(commandText)); - } - - protected virtual IEnumerable GetSystemSchemas() - { - return new[] { - "ANONYMOUS", - "APEX_PUBLIC_USER", - "APEX_040000", - "CTXSYS", - "DBSNMP", - "DIP", - "EXFSYS", - "FLOWS_%", - "FLOWS_FILES", - "LBACSYS", - "MDDATA", - "MDSYS", - "MGMT_VIEW", - "OLAPSYS", - "ORACLE_OCM", - "ORDDATA", - "ORDPLUGINS", - "ORDSYS", - "OUTLN", - "OWBSYS", - "SI_INFORMTN_SCHEMA", - "SPATIAL_CSW_ADMIN_USR", - "SPATIAL_WFS_ADMIN_USR", - "SYS", - "SYSMAN", - "SYSTEM", - "WKPROXY", - "WKSYS", - "WK_TEST", - "WMSYS", - "XDB", - "XS$NULL", - }; - } - - private string GetNonSystemSchemasFilter() - { - if (nonSystemSchemasFilter==null) { - var schemaStrings = GetSystemSchemas().Select(SqlHelper.QuoteString).ToArray(); - var schemaList = string.Join(",", schemaStrings); - nonSystemSchemasFilter = string.Format("NOT IN ({0})", schemaList); - } - return nonSystemSchemasFilter; - } - - private void EnsureShemasExists(Catalog catalog, string[] schemaNames) - { - foreach (var schemaName in schemaNames) { - var realSchemaName = schemaName.ToUpperInvariant(); - var schema = catalog.Schemas[realSchemaName]; - if (schema==null) - catalog.CreateSchema(realSchemaName); - } - } - - - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Xtensive.Core; +using Xtensive.Sql.Model; +using Xtensive.Sql.Drivers.Oracle.Resources; +using Constraint=Xtensive.Sql.Model.Constraint; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal partial class Extractor : Model.Extractor + { + private const int DefaultPrecision = 38; + private const int DefaultScale = 0; + + private readonly HashSet targetSchemes = new HashSet(); + private readonly Dictionary replacementsRegistry = new Dictionary(); + + private Catalog theCatalog; + + private string nonSystemSchemasFilter; + + public override Catalog ExtractCatalog(string catalogName) + { + theCatalog = new Catalog(catalogName); + targetSchemes.Clear(); + + RegisterReplacements(replacementsRegistry); + ExtractSchemas(); + ExtractCatalogContents(); + return theCatalog; + } + + public override Schema ExtractSchema(string catalogName, string schemaName) + { + targetSchemes.Clear(); + theCatalog = new Catalog(catalogName); + var targetSchema = schemaName.ToUpperInvariant(); + targetSchemes.Add(targetSchema); + + RegisterReplacements(replacementsRegistry); + ExtractSchemas(); + EnsureShemasExists(theCatalog, new []{schemaName}); + ExtractCatalogContents(); + return theCatalog.Schemas[targetSchema]; + } + + public override Catalog ExtractSchemes(string catalogName, string[] schemaNames) + { + theCatalog = new Catalog(catalogName); + targetSchemes.Clear(); + foreach (var schemaName in schemaNames) { + var targetSchema = schemaName.ToUpperInvariant(); + targetSchemes.Add(targetSchema); + } + + RegisterReplacements(replacementsRegistry); + ExtractSchemas(); + EnsureShemasExists(theCatalog, schemaNames); + ExtractCatalogContents(); + return theCatalog; + } + + private void ExtractCatalogContents() + { + ExtractTables(); + ExtractTableColumns(); + ExtractViews(); + ExtractViewColumns(); + ExtractIndexes(); + ExtractForeignKeys(); + ExtractCheckConstaints(); + ExtractUniqueAndPrimaryKeyConstraints(); + ExtractSequences(); + } + + private void ExtractSchemas() + { + // oracle does not clearly distinct users and schemas. + // so we extract just users. + using (var reader = ExecuteReader(GetExtractSchemasQuery())) + while (reader.Read()) + theCatalog.CreateSchema(reader.GetString(0)); + // choosing the default schema + var defaultSchemaName = Driver.CoreServerInfo.DefaultSchemaName.ToUpperInvariant(); + var defaultSchema = theCatalog.Schemas[defaultSchemaName]; + theCatalog.DefaultSchema = defaultSchema; + } + + private void ExtractTables() + { + using (var reader = ExecuteReader(GetExtractTablesQuery())) { + while (reader.Read()) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + string tableName = reader.GetString(1); + bool isTemporary = ReadBool(reader, 2); + if (isTemporary) { + var table = schema.CreateTemporaryTable(tableName); + table.PreserveRows = reader.GetString(3)=="SYS$SESSION"; + table.IsGlobal = true; + } + else { + schema.CreateTable(tableName); + } + } + } + } + + private void ExtractTableColumns() + { + using (var reader = ExecuteReader(GetExtractTableColumnsQuery())) { + Table table = null; + int lastColumnId = int.MaxValue; + while (reader.Read()) { + int columnId = ReadInt(reader, 9); + if (columnId <= lastColumnId) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1)]; + } + var column = table.CreateColumn(reader.GetString(2)); + column.DataType = CreateValueType(reader, 3, 4, 5, 6); + column.IsNullable = ReadBool(reader, 7); + var defaultValue = ReadStringOrNull(reader, 8); + if (!string.IsNullOrEmpty(defaultValue)) + column.DefaultValue = SqlDml.Native(defaultValue); + lastColumnId = columnId; + } + } + } + + private void ExtractViews() + { + using (var reader = ExecuteReader(GetExtractViewsQuery())) { + while (reader.Read()) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + var view = reader.GetString(1); + var definition = ReadStringOrNull(reader, 2); + if (string.IsNullOrEmpty(definition)) + schema.CreateView(view); + else + schema.CreateView(view, SqlDml.Native(definition)); + } + } + } + + private void ExtractViewColumns() + { + using (var reader = ExecuteReader(GetExtractViewColumnsQuery())) { + int lastColumnId = int.MaxValue; + View view = null; + while (reader.Read()) { + int columnId = ReadInt(reader, 3); + if (columnId <= lastColumnId) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + view = schema.Views[reader.GetString(1)]; + } + view.CreateColumn(reader.GetString(2)); + lastColumnId = columnId; + } + } + } + + private void ExtractIndexes() + { + // it's possible to have table and index in different schemas in oracle. + // we silently ignore this, indexes are always belong to the same schema as its table. + using (var reader = (OracleDataReader) ExecuteReader(GetExtractIndexesQuery())) { + int lastColumnPosition = int.MaxValue; + Table table = null; + Index index = null; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 6); + if (columnPosition <= lastColumnPosition) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1)]; + index = table.CreateIndex(reader.GetString(2)); + index.IsUnique = ReadBool(reader, 3); + index.IsBitmap = reader.GetString(4).EndsWith("BITMAP"); + if (!reader.IsDBNull(5)) { + int pctFree = ReadInt(reader, 5); + index.FillFactor = (byte) (100 - pctFree); + } + } + var columnName = reader.IsDBNull(9) ? reader.GetString(7) : reader.GetOracleString(9).Value; + columnName = columnName.Trim('"'); + var column = table.TableColumns[columnName]; + bool isAscending = reader.GetString(8)=="ASC"; + index.CreateIndexColumn(column, isAscending); + lastColumnPosition = columnPosition; + } + } + } + + private void ExtractForeignKeys() + { + using (var reader = ExecuteReader(GetExtractForeignKeysQuery())) { + int lastColumnPosition = int.MaxValue; + ForeignKey constraint = null; + Table referencingTable = null; + Table referencedTable = null; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 7); + if (columnPosition <= lastColumnPosition) { + var referencingSchema = theCatalog.Schemas[reader.GetString(0)]; + referencingTable = referencingSchema.Tables[reader.GetString(1)]; + constraint = referencingTable.CreateForeignKey(reader.GetString(2)); + ReadConstraintProperties(constraint, reader, 3, 4); + ReadCascadeAction(constraint, reader, 5); + var referencedSchema = theCatalog.Schemas[reader.GetString(8)]; + referencedTable = referencedSchema.Tables[reader.GetString(9)]; + constraint.ReferencedTable = referencedTable; + } + var referencingColumn = referencingTable.TableColumns[reader.GetString(6)]; + var referencedColumn = referencedTable.TableColumns[reader.GetString(10)]; + constraint.Columns.Add(referencingColumn); + constraint.ReferencedColumns.Add(referencedColumn); + lastColumnPosition = columnPosition; + } + } + } + + private void ExtractUniqueAndPrimaryKeyConstraints() + { + using (var reader = ExecuteReader(GetExtractUniqueAndPrimaryKeyConstraintsQuery())) { + Table table = null; + string constraintName = null; + string constraintType = null; + var columns = new List(); + int lastColumnPosition = -1; + while (reader.Read()) { + int columnPosition = ReadInt(reader, 5); + if (columnPosition <= lastColumnPosition) { + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + columns.Clear(); + } + if (columns.Count==0) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + table = schema.Tables[reader.GetString(1)]; + constraintName = reader.GetString(2); + constraintType = reader.GetString(3); + } + columns.Add(table.TableColumns[reader.GetString(4)]); + lastColumnPosition = columnPosition; + } + if (columns.Count > 0) + CreateIndexBasedConstraint(table, constraintName, constraintType, columns); + } + } + + private void ExtractCheckConstaints() + { + using (var reader = ExecuteReader(GetExtractCheckConstraintsQuery())) { + while (reader.Read()) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + var table = schema.Tables[reader.GetString(1)]; + var name = reader.GetString(2); + // It looks like ODP.NET sometimes fail to read a LONG column via GetString + // It returns empty string instead of the actual value. + var condition = string.IsNullOrEmpty(reader.GetString(3)) + ? null + : SqlDml.Native(reader.GetString(3)); + var constraint = table.CreateCheckConstraint(name, condition); + ReadConstraintProperties(constraint, reader, 4, 5); + } + } + } + + private void ExtractSequences() + { + using (var reader = ExecuteReader(GetExtractSequencesQuery())) { + while (reader.Read()) { + var schema = theCatalog.Schemas[reader.GetString(0)]; + var sequence = schema.CreateSequence(reader.GetString(1)); + var descriptor = sequence.SequenceDescriptor; + descriptor.MinValue = ReadLong(reader, 2); + descriptor.MaxValue = ReadLong(reader, 3); + descriptor.Increment = ReadLong(reader, 4); + descriptor.IsCyclic = ReadBool(reader, 5); + } + } + } + + private SqlValueType CreateValueType(IDataRecord row, + int typeNameIndex, int precisionIndex, int scaleIndex, int charLengthIndex) + { + string typeName = row.GetString(typeNameIndex); + if (typeName=="NUMBER") { + int precision = row.IsDBNull(precisionIndex) ? DefaultPrecision : ReadInt(row, precisionIndex); + int scale = row.IsDBNull(scaleIndex) ? DefaultScale : ReadInt(row, scaleIndex); + return new SqlValueType(SqlType.Decimal, precision, scale); + } + if (typeName.StartsWith("INTERVAL DAY")) { + // ignoring "day precision" and "second precision" + // although they can be read as "scale" and "precision" + return new SqlValueType(SqlType.Interval); + } + if (typeName.StartsWith("TIMESTAMP")) { + // "timestamp precision" is saved as "scale", ignoring too + if (typeName.Contains("WITH TIME ZONE")) + return new SqlValueType(SqlType.DateTimeOffset); + return new SqlValueType(SqlType.DateTime); + } + if (typeName=="NVARCHAR2" || typeName=="NCHAR") { + int length = ReadInt(row, charLengthIndex); + var sqlType = typeName.Length==5 ? SqlType.Char : SqlType.VarChar; + return new SqlValueType(sqlType, length); + } + var typeInfo = Driver.ServerInfo.DataTypes[typeName]; + return typeInfo!=null + ? new SqlValueType(typeInfo.Type) + : new SqlValueType(typeName); + } + + private static void CreateIndexBasedConstraint( + Table table, string constraintName, string constraintType, List columns) + { + switch (constraintType) { + case "P": + table.CreatePrimaryKey(constraintName, columns.ToArray()); + return; + case "U": + table.CreateUniqueConstraint(constraintName, columns.ToArray()); + return; + default: + throw new ArgumentOutOfRangeException("constraintType"); + } + } + + private static bool ReadBool(IDataRecord row, int index) + { + var value = row.GetString(index); + switch (value) { + case "Y": + case "YES": + case "ENABLED": + case "UNIQUE": + return true; + case "N": + case "NO": + case "DISABLED": + case "NONUNIQUE": + return false; + default: + throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)); + } + } + + private static long ReadLong(IDataRecord row, int index) + { + decimal value = row.GetDecimal(index); + + if (value > long.MaxValue) + return long.MaxValue; + + if (value < long.MinValue) + return long.MinValue; + + return (long)value; + } + + private static int ReadInt(IDataRecord row, int index) + { + decimal value = row.GetDecimal(index); + + if (value > int.MaxValue) + return int.MaxValue; + + if (value < int.MinValue) + return int.MinValue; + + return (int)value; + } + + private static string ReadStringOrNull(IDataRecord row, int index) + { + return row.IsDBNull(index) ? null : row.GetString(index); + } + + private static void ReadConstraintProperties(Constraint constraint, + IDataRecord row, int isDeferrableIndex, int isInitiallyDeferredIndex) + { + constraint.IsDeferrable = row.GetString(isDeferrableIndex)=="DEFERRABLE"; + constraint.IsInitiallyDeferred = row.GetString(isInitiallyDeferredIndex)=="DEFERRED"; + } + + private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) + { + var deleteRule = row.GetString(deleteRuleIndex); + switch (deleteRule) { + case "CASCADE": + foreignKey.OnDelete = ReferentialAction.Cascade; + return; + case "SET NULL": + foreignKey.OnDelete = ReferentialAction.SetNull; + return; + case "NO ACTION": + foreignKey.OnDelete = ReferentialAction.NoAction; + return; + } + } + + protected virtual void RegisterReplacements(Dictionary replacements) + { + var schemaFilter = targetSchemes!=null && targetSchemes.Count!=0 + ? MakeSchemaFilter() + //? "= " + SqlHelper.QuoteString(targetSchema) + : GetNonSystemSchemasFilter(); + replacements[SchemaFilterPlaceholder] = schemaFilter; + replacements[IndexesFilterPlaceholder] = "1 > 0"; + replacements[TableFilterPlaceholder] = "IS NOT NULL"; + } + + private string PerformReplacements(string query) + { + foreach (var registry in replacementsRegistry) + query = query.Replace(registry.Key, registry.Value); + return query; + } + + private string MakeSchemaFilter() + { + var schemaStrings = targetSchemes.Select(SqlHelper.QuoteString); + var schemaList = string.Join(",", schemaStrings); + return string.Format("IN ({0})", schemaList); + } + + protected override DbDataReader ExecuteReader(string commandText) + { + var realCommandText = PerformReplacements(commandText); + using (var command = (OracleCommand) Connection.CreateCommand(realCommandText)) { + // This option is required to access LONG columns + command.InitialLONGFetchSize = -1; + return command.ExecuteReader(); + } + } + + protected override DbDataReader ExecuteReader(ISqlCompileUnit statement) + { + var commandText = Connection.Driver.Compile(statement).GetCommandText(); + return base.ExecuteReader(PerformReplacements(commandText)); + } + + protected virtual IEnumerable GetSystemSchemas() + { + return new[] { + "ANONYMOUS", + "APEX_PUBLIC_USER", + "APEX_040000", + "CTXSYS", + "DBSNMP", + "DIP", + "EXFSYS", + "FLOWS_%", + "FLOWS_FILES", + "LBACSYS", + "MDDATA", + "MDSYS", + "MGMT_VIEW", + "OLAPSYS", + "ORACLE_OCM", + "ORDDATA", + "ORDPLUGINS", + "ORDSYS", + "OUTLN", + "OWBSYS", + "SI_INFORMTN_SCHEMA", + "SPATIAL_CSW_ADMIN_USR", + "SPATIAL_WFS_ADMIN_USR", + "SYS", + "SYSMAN", + "SYSTEM", + "WKPROXY", + "WKSYS", + "WK_TEST", + "WMSYS", + "XDB", + "XS$NULL", + }; + } + + private string GetNonSystemSchemasFilter() + { + if (nonSystemSchemasFilter==null) { + var schemaStrings = GetSystemSchemas().Select(SqlHelper.QuoteString).ToArray(); + var schemaList = string.Join(",", schemaStrings); + nonSystemSchemasFilter = string.Format("NOT IN ({0})", schemaList); + } + return nonSystemSchemasFilter; + } + + private void EnsureShemasExists(Catalog catalog, string[] schemaNames) + { + foreach (var schemaName in schemaNames) { + var realSchemaName = schemaName.ToUpperInvariant(); + var schema = catalog.Schemas[realSchemaName]; + if (schema==null) + catalog.CreateSchema(realSchemaName); + } + } + + + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs index dcb996a23e..ebbe49c329 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs @@ -1,272 +1,272 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Oracle.ManagedDataAccess.Client; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal class ServerInfoProvider : Info.ServerInfoProvider - { - private const int MaxIdentifierLength = 30; - private const int DoNotKnow = int.MaxValue; - - private readonly string databaseName; - private readonly string defaultSchemaName; - - public override EntityInfo GetCollationInfo() - { - return null; - } - - public override EntityInfo GetCharacterSetInfo() - { - return null; - } - - public override EntityInfo GetTranslationInfo() - { - return null; - } - - public override EntityInfo GetTriggerInfo() - { - var triggerInfo = new EntityInfo(); - triggerInfo.AllowedDdlStatements = DdlStatements.All; - triggerInfo.MaxIdentifierLength = MaxIdentifierLength; - return triggerInfo; - } - - public override EntityInfo GetStoredProcedureInfo() - { - var storedProcedureInfo = new EntityInfo(); - storedProcedureInfo.AllowedDdlStatements = DdlStatements.All; - storedProcedureInfo.MaxIdentifierLength = MaxIdentifierLength; - return storedProcedureInfo; - } - - public override SequenceInfo GetSequenceInfo() - { - var sequenceInfo = new SequenceInfo(); - sequenceInfo.AllowedDdlStatements = DdlStatements.All; - sequenceInfo.Features = SequenceFeatures.Cache; - sequenceInfo.MaxIdentifierLength = MaxIdentifierLength; - return sequenceInfo; - } - - public override EntityInfo GetDatabaseInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.None; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override ColumnInfo GetColumnInfo() - { - var columnInfo = new ColumnInfo(); - columnInfo.AllowedDdlStatements = DdlStatements.All; - columnInfo.Features = ColumnFeatures.Computed; - columnInfo.MaxIdentifierLength = MaxIdentifierLength; - return columnInfo; - } - - public override EntityInfo GetViewInfo() - { - var viewInfo = new EntityInfo(); - viewInfo.AllowedDdlStatements = DdlStatements.All; - viewInfo.MaxIdentifierLength = MaxIdentifierLength; - return viewInfo; - } - - public override EntityInfo GetSchemaInfo() - { - var schemaInfo = new EntityInfo(); - schemaInfo.AllowedDdlStatements = DdlStatements.All; - schemaInfo.MaxIdentifierLength = MaxIdentifierLength; - return schemaInfo; - } - - public override TableInfo GetTableInfo() - { - var tableInfo = new TableInfo(); - tableInfo.AllowedDdlStatements = DdlStatements.All; - tableInfo.MaxIdentifierLength = MaxIdentifierLength; - tableInfo.PartitionMethods = - PartitionMethods.Hash | - PartitionMethods.List | - PartitionMethods.Range | - PartitionMethods.Interval; - return tableInfo; - } - - public override TemporaryTableInfo GetTemporaryTableInfo() - { - var temporaryTableInfo = new TemporaryTableInfo(); - temporaryTableInfo.Features = - TemporaryTableFeatures.Global | - TemporaryTableFeatures.DeleteRowsOnCommit | - TemporaryTableFeatures.PreserveRowsOnCommit; - temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; - temporaryTableInfo.MaxIdentifierLength = MaxIdentifierLength; - return temporaryTableInfo; - } - - public override CheckConstraintInfo GetCheckConstraintInfo() - { - var checkContraintsInfo = new CheckConstraintInfo(); - checkContraintsInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - checkContraintsInfo.MaxIdentifierLength = MaxIdentifierLength; - checkContraintsInfo.MaxExpressionLength = DoNotKnow; - checkContraintsInfo.Features = CheckConstraintFeatures.Deferrable; - return checkContraintsInfo; - } - - public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() - { - var primaryKeyInfo = new PrimaryKeyConstraintInfo(); - primaryKeyInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Nullable; - primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; - return primaryKeyInfo; - } - - public override UniqueConstraintInfo GetUniqueConstraintInfo() - { - var uniqueContraintInfo = new UniqueConstraintInfo(); - uniqueContraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - uniqueContraintInfo.Features = UniqueConstraintFeatures.Nullable; - uniqueContraintInfo.MaxIdentifierLength = MaxIdentifierLength; - return uniqueContraintInfo; - } - - public override IndexInfo GetIndexInfo() - { - var indexInfo = new IndexInfo(); - indexInfo.AllowedDdlStatements = DdlStatements.All; - indexInfo.MaxIdentifierLength = MaxIdentifierLength; - indexInfo.Features = - IndexFeatures.Unique | - IndexFeatures.SortOrder; - indexInfo.PartitionMethods = - PartitionMethods.Hash | - PartitionMethods.Interval | - PartitionMethods.List | - PartitionMethods.Range; - return indexInfo; - } - - public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() - { - var foreignKeyConstraintInfo = new ForeignKeyConstraintInfo(); - foreignKeyConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - foreignKeyConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - foreignKeyConstraintInfo.Features = ForeignKeyConstraintFeatures.Deferrable; - foreignKeyConstraintInfo.Actions = - ForeignKeyConstraintActions.Cascade | - ForeignKeyConstraintActions.NoAction | - ForeignKeyConstraintActions.SetDefault | - ForeignKeyConstraintActions.SetNull; - return foreignKeyConstraintInfo; - } - - public override FullTextSearchInfo GetFullTextInfo() - { - return null; - } - - public override QueryInfo GetQueryInfo() - { - var queryInfo = new QueryInfo(); - queryInfo.MaxNestedSubqueriesAmount = 255; - queryInfo.ParameterPrefix = ":"; - queryInfo.MaxLength = DoNotKnow; - queryInfo.MaxComparisonOperations = DoNotKnow; - queryInfo.Features = - QueryFeatures.NamedParameters | - QueryFeatures.ParameterPrefix | - QueryFeatures.Hints | - QueryFeatures.DmlBatches | - QueryFeatures.InsertDefaultValues | - QueryFeatures.UpdateDefaultValues | - QueryFeatures.MultischemaQueries | - QueryFeatures.RowNumber; - return queryInfo; - } - - public override ServerFeatures GetServerFeatures() - { - return ServerFeatures.Savepoints | - ServerFeatures.LargeObjects | - ServerFeatures.CursorParameters | - ServerFeatures.MultipleResultsViaCursorParameters; - } - - public override IdentityInfo GetIdentityInfo() - { - return null; - } - - public override DataTypeCollection GetDataTypesInfo() - { - const DataTypeFeatures common = DataTypeFeatures.Default | DataTypeFeatures.Nullable | - DataTypeFeatures.NonKeyIndexing | DataTypeFeatures.Grouping | DataTypeFeatures.Ordering | - DataTypeFeatures.Multiple; - const DataTypeFeatures index = DataTypeFeatures.Indexing | DataTypeFeatures.Clustering | - DataTypeFeatures.FillFactor | DataTypeFeatures.KeyConstraint; - var types = new DataTypeCollection(); - - types.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, common | index, - ValueRange.Decimal, 38, "number"); - types.Float = DataTypeInfo.Range(SqlType.Float, common | index, - ValueRange.Float, "real"); - types.Double = DataTypeInfo.Range(SqlType.Double, common | index, - ValueRange.Double, "double precision", "float"); - types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, - ValueRange.DateTime, "timestamp"); - types.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, common | index, - ValueRange.DateTimeOffset, "TIMESTAMP WITH TIME ZONE"); - types.Interval = DataTypeInfo.Range(SqlType.Interval, common | index, - ValueRange.TimeSpan, "interval day to second"); - - types.Char = DataTypeInfo.Stream(SqlType.Char, - common | index | DataTypeFeatures.ZeroLengthValueIsNull, 2000, "nchar"); - types.VarChar = DataTypeInfo.Stream(SqlType.VarChar, - common | index | DataTypeFeatures.ZeroLengthValueIsNull, 2000, "nvarchar2"); - types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common, "nclob"); - types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "blob"); - return types; - } - - public override IsolationLevels GetIsolationLevels() - { - return IsolationLevels.ReadCommitted | IsolationLevels.Serializable; - } - - public override EntityInfo GetDomainInfo() - { - return null; - } - - public override AssertConstraintInfo GetAssertionInfo() - { - return null; - } - - public override int GetStringIndexingBase() - { - return 1; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Oracle.ManagedDataAccess.Client; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal class ServerInfoProvider : Info.ServerInfoProvider + { + private const int MaxIdentifierLength = 30; + private const int DoNotKnow = int.MaxValue; + + private readonly string databaseName; + private readonly string defaultSchemaName; + + public override EntityInfo GetCollationInfo() + { + return null; + } + + public override EntityInfo GetCharacterSetInfo() + { + return null; + } + + public override EntityInfo GetTranslationInfo() + { + return null; + } + + public override EntityInfo GetTriggerInfo() + { + var triggerInfo = new EntityInfo(); + triggerInfo.AllowedDdlStatements = DdlStatements.All; + triggerInfo.MaxIdentifierLength = MaxIdentifierLength; + return triggerInfo; + } + + public override EntityInfo GetStoredProcedureInfo() + { + var storedProcedureInfo = new EntityInfo(); + storedProcedureInfo.AllowedDdlStatements = DdlStatements.All; + storedProcedureInfo.MaxIdentifierLength = MaxIdentifierLength; + return storedProcedureInfo; + } + + public override SequenceInfo GetSequenceInfo() + { + var sequenceInfo = new SequenceInfo(); + sequenceInfo.AllowedDdlStatements = DdlStatements.All; + sequenceInfo.Features = SequenceFeatures.Cache; + sequenceInfo.MaxIdentifierLength = MaxIdentifierLength; + return sequenceInfo; + } + + public override EntityInfo GetDatabaseInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.None; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override ColumnInfo GetColumnInfo() + { + var columnInfo = new ColumnInfo(); + columnInfo.AllowedDdlStatements = DdlStatements.All; + columnInfo.Features = ColumnFeatures.Computed; + columnInfo.MaxIdentifierLength = MaxIdentifierLength; + return columnInfo; + } + + public override EntityInfo GetViewInfo() + { + var viewInfo = new EntityInfo(); + viewInfo.AllowedDdlStatements = DdlStatements.All; + viewInfo.MaxIdentifierLength = MaxIdentifierLength; + return viewInfo; + } + + public override EntityInfo GetSchemaInfo() + { + var schemaInfo = new EntityInfo(); + schemaInfo.AllowedDdlStatements = DdlStatements.All; + schemaInfo.MaxIdentifierLength = MaxIdentifierLength; + return schemaInfo; + } + + public override TableInfo GetTableInfo() + { + var tableInfo = new TableInfo(); + tableInfo.AllowedDdlStatements = DdlStatements.All; + tableInfo.MaxIdentifierLength = MaxIdentifierLength; + tableInfo.PartitionMethods = + PartitionMethods.Hash | + PartitionMethods.List | + PartitionMethods.Range | + PartitionMethods.Interval; + return tableInfo; + } + + public override TemporaryTableInfo GetTemporaryTableInfo() + { + var temporaryTableInfo = new TemporaryTableInfo(); + temporaryTableInfo.Features = + TemporaryTableFeatures.Global | + TemporaryTableFeatures.DeleteRowsOnCommit | + TemporaryTableFeatures.PreserveRowsOnCommit; + temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; + temporaryTableInfo.MaxIdentifierLength = MaxIdentifierLength; + return temporaryTableInfo; + } + + public override CheckConstraintInfo GetCheckConstraintInfo() + { + var checkContraintsInfo = new CheckConstraintInfo(); + checkContraintsInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + checkContraintsInfo.MaxIdentifierLength = MaxIdentifierLength; + checkContraintsInfo.MaxExpressionLength = DoNotKnow; + checkContraintsInfo.Features = CheckConstraintFeatures.Deferrable; + return checkContraintsInfo; + } + + public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() + { + var primaryKeyInfo = new PrimaryKeyConstraintInfo(); + primaryKeyInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Nullable; + primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; + return primaryKeyInfo; + } + + public override UniqueConstraintInfo GetUniqueConstraintInfo() + { + var uniqueContraintInfo = new UniqueConstraintInfo(); + uniqueContraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + uniqueContraintInfo.Features = UniqueConstraintFeatures.Nullable; + uniqueContraintInfo.MaxIdentifierLength = MaxIdentifierLength; + return uniqueContraintInfo; + } + + public override IndexInfo GetIndexInfo() + { + var indexInfo = new IndexInfo(); + indexInfo.AllowedDdlStatements = DdlStatements.All; + indexInfo.MaxIdentifierLength = MaxIdentifierLength; + indexInfo.Features = + IndexFeatures.Unique | + IndexFeatures.SortOrder; + indexInfo.PartitionMethods = + PartitionMethods.Hash | + PartitionMethods.Interval | + PartitionMethods.List | + PartitionMethods.Range; + return indexInfo; + } + + public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() + { + var foreignKeyConstraintInfo = new ForeignKeyConstraintInfo(); + foreignKeyConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + foreignKeyConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + foreignKeyConstraintInfo.Features = ForeignKeyConstraintFeatures.Deferrable; + foreignKeyConstraintInfo.Actions = + ForeignKeyConstraintActions.Cascade | + ForeignKeyConstraintActions.NoAction | + ForeignKeyConstraintActions.SetDefault | + ForeignKeyConstraintActions.SetNull; + return foreignKeyConstraintInfo; + } + + public override FullTextSearchInfo GetFullTextInfo() + { + return null; + } + + public override QueryInfo GetQueryInfo() + { + var queryInfo = new QueryInfo(); + queryInfo.MaxNestedSubqueriesAmount = 255; + queryInfo.ParameterPrefix = ":"; + queryInfo.MaxLength = DoNotKnow; + queryInfo.MaxComparisonOperations = DoNotKnow; + queryInfo.Features = + QueryFeatures.NamedParameters | + QueryFeatures.ParameterPrefix | + QueryFeatures.Hints | + QueryFeatures.DmlBatches | + QueryFeatures.InsertDefaultValues | + QueryFeatures.UpdateDefaultValues | + QueryFeatures.MultischemaQueries | + QueryFeatures.RowNumber; + return queryInfo; + } + + public override ServerFeatures GetServerFeatures() + { + return ServerFeatures.Savepoints | + ServerFeatures.LargeObjects | + ServerFeatures.CursorParameters | + ServerFeatures.MultipleResultsViaCursorParameters; + } + + public override IdentityInfo GetIdentityInfo() + { + return null; + } + + public override DataTypeCollection GetDataTypesInfo() + { + const DataTypeFeatures common = DataTypeFeatures.Default | DataTypeFeatures.Nullable | + DataTypeFeatures.NonKeyIndexing | DataTypeFeatures.Grouping | DataTypeFeatures.Ordering | + DataTypeFeatures.Multiple; + const DataTypeFeatures index = DataTypeFeatures.Indexing | DataTypeFeatures.Clustering | + DataTypeFeatures.FillFactor | DataTypeFeatures.KeyConstraint; + var types = new DataTypeCollection(); + + types.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, common | index, + ValueRange.Decimal, 38, "number"); + types.Float = DataTypeInfo.Range(SqlType.Float, common | index, + ValueRange.Float, "real"); + types.Double = DataTypeInfo.Range(SqlType.Double, common | index, + ValueRange.Double, "double precision", "float"); + types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, + ValueRange.DateTime, "timestamp"); + types.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, common | index, + ValueRange.DateTimeOffset, "TIMESTAMP WITH TIME ZONE"); + types.Interval = DataTypeInfo.Range(SqlType.Interval, common | index, + ValueRange.TimeSpan, "interval day to second"); + + types.Char = DataTypeInfo.Stream(SqlType.Char, + common | index | DataTypeFeatures.ZeroLengthValueIsNull, 2000, "nchar"); + types.VarChar = DataTypeInfo.Stream(SqlType.VarChar, + common | index | DataTypeFeatures.ZeroLengthValueIsNull, 2000, "nvarchar2"); + types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common, "nclob"); + types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "blob"); + return types; + } + + public override IsolationLevels GetIsolationLevels() + { + return IsolationLevels.ReadCommitted | IsolationLevels.Serializable; + } + + public override EntityInfo GetDomainInfo() + { + return null; + } + + public override AssertConstraintInfo GetAssertionInfo() + { + return null; + } + + public override int GetStringIndexingBase() + { + return 1; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs index ba24658fca..ee749053a7 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs @@ -1,359 +1,359 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Text; -using Xtensive.Core; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using Xtensive.Sql.Drivers.Oracle.Resources; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal class Translator : SqlTranslator - { - public override string NewLine { get { return "\n"; } } - - public override string BatchBegin { get { return "BEGIN\n"; } } - public override string BatchEnd { get { return "END;\n"; } } - - public override string DateTimeFormatString { get { return @"'(TIMESTAMP '\'yyyy\-MM\-dd HH\:mm\:ss\.fff\'\)"; } } - public override string TimeSpanFormatString { get { return "(INTERVAL '{0}{1} {2}:{3}:{4}.{5:000}' DAY(6) TO SECOND(3))"; } } - public string DateTimeOffsetFormatString { get { return @"'(TIMESTAMP '\'yyyy\-MM\-dd HH\:mm\:ss\.fff\ zzz\'\)"; } } - - public override void Initialize() - { - base.Initialize(); - FloatNumberFormat.NumberDecimalSeparator = "."; - FloatNumberFormat.NumberGroupSeparator = ""; - FloatNumberFormat.NaNSymbol = "BINARY_FLOAT_NAN"; - FloatNumberFormat.PositiveInfinitySymbol = "+BINARY_FLOAT_INFINITY"; - FloatNumberFormat.NegativeInfinitySymbol = "-BINARY_FLOAT_INFINITY"; - - DoubleNumberFormat.NumberDecimalSeparator = "."; - DoubleNumberFormat.NumberGroupSeparator = ""; - DoubleNumberFormat.NaNSymbol = "BINARY_DOUBLE_NAN"; - DoubleNumberFormat.PositiveInfinitySymbol = "+BINARY_DOUBLE_INFINITY"; - DoubleNumberFormat.NegativeInfinitySymbol = "-BINARY_DOUBLE_INFINITY"; - } - - public override string QuoteIdentifier(params string[] names) - { - return SqlHelper.QuoteIdentifierWithQuotes(names); - } - - public override string QuoteString(string str) - { - return "N" + base.QuoteString(str); - } - - public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.HintsEntry: - return "/*+"; - case SelectSection.HintsExit: - return "*/"; - case SelectSection.Limit: - case SelectSection.Offset: - throw new NotSupportedException(); - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlJoinMethod method) - { - // TODO: add more hints - switch (method) { - case SqlJoinMethod.Loop: - return "use_nl"; - case SqlJoinMethod.Merge: - return "use_merge"; - case SqlJoinMethod.Hash: - return "use_hash"; - default: - return string.Empty; - } - } - - public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) - { - switch(section) { - case NodeSection.Exit: - return ".nextval"; - default: - return string.Empty; - } - } - - public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) - { - if (node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second) - switch (section) { - case ExtractSection.Entry: - return "TRUNC(EXTRACT("; - case ExtractSection.Exit: - return "))"; - default: - return base.Translate(context, node, section); - } - - if (node.DateTimePart==SqlDateTimePart.Millisecond || node.IntervalPart==SqlIntervalPart.Millisecond) - switch (section) { - case ExtractSection.Entry: - return "MOD(EXTRACT("; - case ExtractSection.Exit: - return ")*1000,1000)"; - default: - return base.Translate(context, node, section); - } - - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlDropTable node) - { - return "DROP TABLE " + Translate(context, node.Table) + (node.Cascade ? " CASCADE CONSTRAINTS" : string.Empty); - } - - public override string Translate(SqlCompilerContext context, SqlDropSequence node) - { - return "DROP SEQUENCE " + Translate(context, node.Sequence); - } - - public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) - { - switch (section) { - case AlterTableSection.AddColumn: - return "ADD"; - case AlterTableSection.DropBehavior: - var cascadableAction = node.Action as SqlCascadableAction; - if (cascadableAction==null || !cascadableAction.Cascade) - return string.Empty; - if (cascadableAction is SqlDropConstraint) - return "CASCADE"; - if (cascadableAction is SqlDropColumn) - return "CASCADE CONSTRAINTS"; - throw new ArgumentOutOfRangeException("node.Action"); - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, object literalValue) - { - var literalType = literalValue.GetType(); - switch (Type.GetTypeCode(literalType)) { - case TypeCode.Boolean: - return (bool) literalValue ? "1" : "0"; - } - if (literalType==typeof(byte[])) { - var values = (byte[]) literalValue; - var builder = new StringBuilder(2 * (values.Length + 1)); - builder.Append("'"); - builder.AppendHexArray(values); - builder.Append("'"); - return builder.ToString(); - } - if (literalType==typeof(Guid)) - return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); - if (literalType==typeof (DateTimeOffset)) - return ((DateTimeOffset) literalValue).ToString(DateTimeOffsetFormatString); - return base.Translate(context, literalValue); - } - - public override string Translate(SqlCompilerContext context, SqlDropIndex node) - { - return "DROP INDEX " + Translate(node.Index); - } - - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - var builder = new StringBuilder(); - var index = node.Index; - switch (section) { - case CreateIndexSection.Entry: - builder.Append("CREATE "); - if (index.IsUnique) - builder.Append("UNIQUE "); - else if (index.IsBitmap) - builder.Append("BITMAP "); - builder.Append("INDEX "); - builder.Append(Translate(index)); - builder.Append(" ON "); - builder.Append(Translate(context, index.DataTable)); - return builder.ToString(); - case CreateIndexSection.Exit: - break; - case CreateIndexSection.ColumnsEnter: - return "("; - case CreateIndexSection.ColumnsExit: - return ")"; - case CreateIndexSection.NonkeyColumnsEnter: - break; - case CreateIndexSection.NonkeyColumnsExit: - break; - case CreateIndexSection.StorageOptions: - break; - case CreateIndexSection.Where: - break; - default: - throw new ArgumentOutOfRangeException("section"); - } - return string.Empty; - } - - public virtual string Translate(Index node) - { - return node.DataTable.Schema!=null - ? QuoteIdentifier(node.DataTable.Schema.DbName, node.DbName) - : QuoteIdentifier(node.DbName); - } - - public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) - { - if (node.FunctionType==SqlFunctionType.Log10 && section==FunctionCallSection.Exit) - return ", 10)"; - switch (section) { - case FunctionCallSection.ArgumentEntry: - return string.Empty; - case FunctionCallSection.ArgumentDelimiter: - return ArgumentDelimiter; - default: - return base.Translate(context, node, section, position); - } - } - - public override string Translate(SqlCompilerContext context, - SequenceDescriptor descriptor, SequenceDescriptorSection section) - { - switch (section) { - case SequenceDescriptorSection.RestartValue: - if (descriptor.StartValue.HasValue) - throw new NotSupportedException(Strings.ExAlterSequenceRestartWithIsNotSupported); - break; - case SequenceDescriptorSection.AlterMaxValue: - if (!descriptor.MaxValue.HasValue) - return "NOMAXVALUE"; - break; - case SequenceDescriptorSection.AlterMinValue: - if (!descriptor.MinValue.HasValue) - return "NOMINVALUE"; - break; - } - return base.Translate(context, descriptor, section); - } - - public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - var sqlType = node.Type.Type; - - if (sqlType==SqlType.Char || - sqlType==SqlType.VarChar || - sqlType==SqlType.VarCharMax) - switch (section) { - case NodeSection.Entry: - return "TO_CHAR("; - case NodeSection.Exit: - return ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlValueType type) - { - // we need to explicitly specify maximum interval precision - if (type.Type==SqlType.Interval) - return "INTERVAL DAY(6) TO SECOND(3)"; - return base.Translate(type); - } - - public override string Translate(SqlDateTimePart part) - { - switch (part) { - case SqlDateTimePart.DayOfWeek: - case SqlDateTimePart.DayOfYear: - throw new NotSupportedException(); - case SqlDateTimePart.Millisecond: - return "SECOND"; - default: - return base.Translate(part); - } - } - - public override string Translate(SqlIntervalPart part) - { - switch (part) { - case SqlIntervalPart.Millisecond: - return "SECOND"; - default: - return base.Translate(part); - } - } - - public override string Translate(SqlFunctionType type) - { - switch (type) { - case SqlFunctionType.Truncate: - case SqlFunctionType.DateTimeTruncate: - return "TRUNC"; - case SqlFunctionType.IntervalNegate: - return "-1*"; - case SqlFunctionType.Substring: - return "SUBSTR"; - case SqlFunctionType.Log: - return "LN"; - case SqlFunctionType.Log10: - return "LOG"; - case SqlFunctionType.Ceiling: - return "CEIL"; - case SqlFunctionType.CurrentDateTimeOffset: - return "CURRENT_TIMESTAMP"; - default: - return base.Translate(type); - } - } - - public override string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.DateTimeOffsetPlusInterval: - case SqlNodeType.DateTimePlusInterval: - return "+"; - case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: - case SqlNodeType.DateTimeOffsetMinusInterval: - case SqlNodeType.DateTimeMinusInterval: - case SqlNodeType.DateTimeMinusDateTime: - return "-"; - case SqlNodeType.Except: - return "MINUS"; - default: - return base.Translate(type); - } - } - - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.Shared) || lockType.Supports(SqlLockType.SkipLocked)) - return base.Translate(lockType); - return lockType.Supports(SqlLockType.ThrowIfLocked) - ? "FOR UPDATE NOWAIT" - : "FOR UPDATE"; - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Text; +using Xtensive.Core; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using Xtensive.Sql.Drivers.Oracle.Resources; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal class Translator : SqlTranslator + { + public override string NewLine { get { return "\n"; } } + + public override string BatchBegin { get { return "BEGIN\n"; } } + public override string BatchEnd { get { return "END;\n"; } } + + public override string DateTimeFormatString { get { return @"'(TIMESTAMP '\'yyyy\-MM\-dd HH\:mm\:ss\.fff\'\)"; } } + public override string TimeSpanFormatString { get { return "(INTERVAL '{0}{1} {2}:{3}:{4}.{5:000}' DAY(6) TO SECOND(3))"; } } + public string DateTimeOffsetFormatString { get { return @"'(TIMESTAMP '\'yyyy\-MM\-dd HH\:mm\:ss\.fff\ zzz\'\)"; } } + + public override void Initialize() + { + base.Initialize(); + FloatNumberFormat.NumberDecimalSeparator = "."; + FloatNumberFormat.NumberGroupSeparator = ""; + FloatNumberFormat.NaNSymbol = "BINARY_FLOAT_NAN"; + FloatNumberFormat.PositiveInfinitySymbol = "+BINARY_FLOAT_INFINITY"; + FloatNumberFormat.NegativeInfinitySymbol = "-BINARY_FLOAT_INFINITY"; + + DoubleNumberFormat.NumberDecimalSeparator = "."; + DoubleNumberFormat.NumberGroupSeparator = ""; + DoubleNumberFormat.NaNSymbol = "BINARY_DOUBLE_NAN"; + DoubleNumberFormat.PositiveInfinitySymbol = "+BINARY_DOUBLE_INFINITY"; + DoubleNumberFormat.NegativeInfinitySymbol = "-BINARY_DOUBLE_INFINITY"; + } + + public override string QuoteIdentifier(params string[] names) + { + return SqlHelper.QuoteIdentifierWithQuotes(names); + } + + public override string QuoteString(string str) + { + return "N" + base.QuoteString(str); + } + + public override string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + { + switch (section) { + case SelectSection.HintsEntry: + return "/*+"; + case SelectSection.HintsExit: + return "*/"; + case SelectSection.Limit: + case SelectSection.Offset: + throw new NotSupportedException(); + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlJoinMethod method) + { + // TODO: add more hints + switch (method) { + case SqlJoinMethod.Loop: + return "use_nl"; + case SqlJoinMethod.Merge: + return "use_merge"; + case SqlJoinMethod.Hash: + return "use_hash"; + default: + return string.Empty; + } + } + + public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) + { + switch(section) { + case NodeSection.Exit: + return ".nextval"; + default: + return string.Empty; + } + } + + public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) + { + if (node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second) + switch (section) { + case ExtractSection.Entry: + return "TRUNC(EXTRACT("; + case ExtractSection.Exit: + return "))"; + default: + return base.Translate(context, node, section); + } + + if (node.DateTimePart==SqlDateTimePart.Millisecond || node.IntervalPart==SqlIntervalPart.Millisecond) + switch (section) { + case ExtractSection.Entry: + return "MOD(EXTRACT("; + case ExtractSection.Exit: + return ")*1000,1000)"; + default: + return base.Translate(context, node, section); + } + + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlDropTable node) + { + return "DROP TABLE " + Translate(context, node.Table) + (node.Cascade ? " CASCADE CONSTRAINTS" : string.Empty); + } + + public override string Translate(SqlCompilerContext context, SqlDropSequence node) + { + return "DROP SEQUENCE " + Translate(context, node.Sequence); + } + + public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) + { + switch (section) { + case AlterTableSection.AddColumn: + return "ADD"; + case AlterTableSection.DropBehavior: + var cascadableAction = node.Action as SqlCascadableAction; + if (cascadableAction==null || !cascadableAction.Cascade) + return string.Empty; + if (cascadableAction is SqlDropConstraint) + return "CASCADE"; + if (cascadableAction is SqlDropColumn) + return "CASCADE CONSTRAINTS"; + throw new ArgumentOutOfRangeException("node.Action"); + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, object literalValue) + { + var literalType = literalValue.GetType(); + switch (Type.GetTypeCode(literalType)) { + case TypeCode.Boolean: + return (bool) literalValue ? "1" : "0"; + } + if (literalType==typeof(byte[])) { + var values = (byte[]) literalValue; + var builder = new StringBuilder(2 * (values.Length + 1)); + builder.Append("'"); + builder.AppendHexArray(values); + builder.Append("'"); + return builder.ToString(); + } + if (literalType==typeof(Guid)) + return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); + if (literalType==typeof (DateTimeOffset)) + return ((DateTimeOffset) literalValue).ToString(DateTimeOffsetFormatString); + return base.Translate(context, literalValue); + } + + public override string Translate(SqlCompilerContext context, SqlDropIndex node) + { + return "DROP INDEX " + Translate(node.Index); + } + + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + var builder = new StringBuilder(); + var index = node.Index; + switch (section) { + case CreateIndexSection.Entry: + builder.Append("CREATE "); + if (index.IsUnique) + builder.Append("UNIQUE "); + else if (index.IsBitmap) + builder.Append("BITMAP "); + builder.Append("INDEX "); + builder.Append(Translate(index)); + builder.Append(" ON "); + builder.Append(Translate(context, index.DataTable)); + return builder.ToString(); + case CreateIndexSection.Exit: + break; + case CreateIndexSection.ColumnsEnter: + return "("; + case CreateIndexSection.ColumnsExit: + return ")"; + case CreateIndexSection.NonkeyColumnsEnter: + break; + case CreateIndexSection.NonkeyColumnsExit: + break; + case CreateIndexSection.StorageOptions: + break; + case CreateIndexSection.Where: + break; + default: + throw new ArgumentOutOfRangeException("section"); + } + return string.Empty; + } + + public virtual string Translate(Index node) + { + return node.DataTable.Schema!=null + ? QuoteIdentifier(node.DataTable.Schema.DbName, node.DbName) + : QuoteIdentifier(node.DbName); + } + + public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) + { + if (node.FunctionType==SqlFunctionType.Log10 && section==FunctionCallSection.Exit) + return ", 10)"; + switch (section) { + case FunctionCallSection.ArgumentEntry: + return string.Empty; + case FunctionCallSection.ArgumentDelimiter: + return ArgumentDelimiter; + default: + return base.Translate(context, node, section, position); + } + } + + public override string Translate(SqlCompilerContext context, + SequenceDescriptor descriptor, SequenceDescriptorSection section) + { + switch (section) { + case SequenceDescriptorSection.RestartValue: + if (descriptor.StartValue.HasValue) + throw new NotSupportedException(Strings.ExAlterSequenceRestartWithIsNotSupported); + break; + case SequenceDescriptorSection.AlterMaxValue: + if (!descriptor.MaxValue.HasValue) + return "NOMAXVALUE"; + break; + case SequenceDescriptorSection.AlterMinValue: + if (!descriptor.MinValue.HasValue) + return "NOMINVALUE"; + break; + } + return base.Translate(context, descriptor, section); + } + + public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + var sqlType = node.Type.Type; + + if (sqlType==SqlType.Char || + sqlType==SqlType.VarChar || + sqlType==SqlType.VarCharMax) + switch (section) { + case NodeSection.Entry: + return "TO_CHAR("; + case NodeSection.Exit: + return ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlValueType type) + { + // we need to explicitly specify maximum interval precision + if (type.Type==SqlType.Interval) + return "INTERVAL DAY(6) TO SECOND(3)"; + return base.Translate(type); + } + + public override string Translate(SqlDateTimePart part) + { + switch (part) { + case SqlDateTimePart.DayOfWeek: + case SqlDateTimePart.DayOfYear: + throw new NotSupportedException(); + case SqlDateTimePart.Millisecond: + return "SECOND"; + default: + return base.Translate(part); + } + } + + public override string Translate(SqlIntervalPart part) + { + switch (part) { + case SqlIntervalPart.Millisecond: + return "SECOND"; + default: + return base.Translate(part); + } + } + + public override string Translate(SqlFunctionType type) + { + switch (type) { + case SqlFunctionType.Truncate: + case SqlFunctionType.DateTimeTruncate: + return "TRUNC"; + case SqlFunctionType.IntervalNegate: + return "-1*"; + case SqlFunctionType.Substring: + return "SUBSTR"; + case SqlFunctionType.Log: + return "LN"; + case SqlFunctionType.Log10: + return "LOG"; + case SqlFunctionType.Ceiling: + return "CEIL"; + case SqlFunctionType.CurrentDateTimeOffset: + return "CURRENT_TIMESTAMP"; + default: + return base.Translate(type); + } + } + + public override string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.DateTimeOffsetPlusInterval: + case SqlNodeType.DateTimePlusInterval: + return "+"; + case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: + case SqlNodeType.DateTimeOffsetMinusInterval: + case SqlNodeType.DateTimeMinusInterval: + case SqlNodeType.DateTimeMinusDateTime: + return "-"; + case SqlNodeType.Except: + return "MINUS"; + default: + return base.Translate(type); + } + } + + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.Shared) || lockType.Supports(SqlLockType.SkipLocked)) + return base.Translate(lockType); + return lockType.Supports(SqlLockType.ThrowIfLocked) + ? "FOR UPDATE NOWAIT" + : "FOR UPDATE"; + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs index ded430ebe1..c6b0802042 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs @@ -1,280 +1,280 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Data; -using System.Data.Common; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Xtensive.Sql.Drivers.Oracle.v09 -{ - internal class TypeMapper : Sql.TypeMapper - { - private const int BooleanPrecision = 1; - private const int BytePrecision = 3; - private const int ShortPrecision = 5; - private const int IntPrecision = 10; - private const int LongPrecision = 20; - - public override void BindBoolean(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : ((bool) value ? 1.0m : 0.0m); - } - - public override void BindByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (byte) value; - } - - public override void BindSByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (sbyte) value; - } - - public override void BindShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (short) value; - } - - public override void BindUShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (ushort) value; - } - - public override void BindInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (int) value; - } - - public override void BindUInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (uint) value; - } - - public override void BindLong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (long) value; - } - - public override void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value==null ? (object) DBNull.Value : (decimal) (ulong) value; - } - - public override void BindFloat(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.Single; - nativeParameter.Value = value ?? DBNull.Value; - } - - public override void BindDouble(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.Double; - nativeParameter.Value = value ?? DBNull.Value; - } - - public override void BindDateTimeOffset(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.TimeStampTZ; - nativeParameter.Value = value==null ? (object) DBNull.Value : new OracleTimeStampTZ(((DateTimeOffset) value).DateTime, ((DateTimeOffset) value).Offset.ToString()); - } - - public override void BindTimeSpan(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.IntervalDS; - nativeParameter.Value = value==null ? (object) DBNull.Value : new OracleIntervalDS((TimeSpan) value); - } - - public override void BindByteArray(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.Blob; - nativeParameter.Value = value ?? DBNull.Value; - } - - public override void BindGuid(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); - } - - public override void BindString(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.NVarchar2; - nativeParameter.Value = value ?? DBNull.Value; - } - - public override object ReadBoolean(DbDataReader reader, int index) - { - //return reader.GetDecimal(index)!=0.0m; - return Math.Abs(ReadDecimalSafely(reader, index, BooleanPrecision, 0)) > 0.3m; - } - - public override object ReadByte(DbDataReader reader, int index) - { - //return (byte) reader.GetDecimal(index); - return (byte) ReadDecimalSafely(reader, index, BytePrecision, 0); - } - - public override object ReadSByte(DbDataReader reader, int index) - { - //return (sbyte) reader.GetDecimal(index); - return (sbyte) ReadDecimalSafely(reader, index, BytePrecision, 0); - } - - public override object ReadShort(DbDataReader reader, int index) - { - //return (short) reader.GetDecimal(index); - return (short) ReadDecimalSafely(reader, index, ShortPrecision, 0); - } - - public override object ReadUShort(DbDataReader reader, int index) - { - //return (ushort) reader.GetDecimal(index); - return (ushort) ReadDecimalSafely(reader, index, ShortPrecision, 0); - } - - public override object ReadInt(DbDataReader reader, int index) - { - //return (int) reader.GetDecimal(index); - return (int) ReadDecimalSafely(reader, index, IntPrecision, 0); - } - - public override object ReadUInt(DbDataReader reader, int index) - { - //return (uint) reader.GetDecimal(index); - return (uint) ReadDecimalSafely(reader, index, IntPrecision, 0); - } - - public override object ReadLong(DbDataReader reader, int index) - { - //return (long) reader.GetDecimal(index); - return (long) ReadDecimalSafely(reader, index, LongPrecision, 0); - } - - public override object ReadULong(DbDataReader reader, int index) - { - //return (ulong) reader.GetDecimal(index); - return (ulong) ReadDecimalSafely(reader, index, LongPrecision, 0); - } - - public override object ReadDecimal(DbDataReader reader, int index) - { - return ReadDecimalSafely(reader, index, MaxDecimalPrecision.Value, MaxDecimalPrecision.Value / 2); - } - - public override object ReadFloat(DbDataReader reader, int index) - { - return Convert.ToSingle(reader[index]); - } - - public override object ReadDouble(DbDataReader reader, int index) - { - return Convert.ToDouble(reader[index]); - } - - public override object ReadDateTimeOffset(DbDataReader reader, int index) - { - var nativeReader = (OracleDataReader) reader; - return new DateTimeOffset(nativeReader.GetOracleTimeStampTZ(index).Value, nativeReader.GetOracleTimeStampTZ(index).GetTimeZoneOffset()); - } - - public override object ReadTimeSpan(DbDataReader reader, int index) - { - var nativeReader = (OracleDataReader) reader; - return (TimeSpan) nativeReader.GetOracleIntervalDS(index); - } - - public override object ReadGuid(DbDataReader reader, int index) - { - return SqlHelper.GuidFromString(reader.GetString(index)); - } - - private static decimal ReadDecimalSafely(DbDataReader reader, int index, int newPrecision, int newScale) - { - var nativeReader = (OracleDataReader) reader; - var result = OracleDecimal.ConvertToPrecScale(nativeReader.GetOracleDecimal(index), newPrecision, newScale); - return result.Value; - } - - public override SqlValueType MapBoolean(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, BooleanPrecision, 0); - } - - public override SqlValueType MapByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, BytePrecision, 0); - } - - public override SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, BytePrecision, 0); - } - - public override SqlValueType MapShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, ShortPrecision, 0); - } - - public override SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, ShortPrecision, 0); - } - - public override SqlValueType MapInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, IntPrecision, 0); - } - - public override SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, IntPrecision, 0); - } - - public override SqlValueType MapLong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, LongPrecision, 0); - } - - public override SqlValueType MapULong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, LongPrecision, 0); - } - - public override SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarChar, 32); - } - - public override SqlValueType MapTimeSpan(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Interval); - } - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Data; +using System.Data.Common; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Xtensive.Sql.Drivers.Oracle.v09 +{ + internal class TypeMapper : Sql.TypeMapper + { + private const int BooleanPrecision = 1; + private const int BytePrecision = 3; + private const int ShortPrecision = 5; + private const int IntPrecision = 10; + private const int LongPrecision = 20; + + public override void BindBoolean(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : ((bool) value ? 1.0m : 0.0m); + } + + public override void BindByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (byte) value; + } + + public override void BindSByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (sbyte) value; + } + + public override void BindShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (short) value; + } + + public override void BindUShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (ushort) value; + } + + public override void BindInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (int) value; + } + + public override void BindUInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (uint) value; + } + + public override void BindLong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (long) value; + } + + public override void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value==null ? (object) DBNull.Value : (decimal) (ulong) value; + } + + public override void BindFloat(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.Single; + nativeParameter.Value = value ?? DBNull.Value; + } + + public override void BindDouble(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.Double; + nativeParameter.Value = value ?? DBNull.Value; + } + + public override void BindDateTimeOffset(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.TimeStampTZ; + nativeParameter.Value = value==null ? (object) DBNull.Value : new OracleTimeStampTZ(((DateTimeOffset) value).DateTime, ((DateTimeOffset) value).Offset.ToString()); + } + + public override void BindTimeSpan(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.IntervalDS; + nativeParameter.Value = value==null ? (object) DBNull.Value : new OracleIntervalDS((TimeSpan) value); + } + + public override void BindByteArray(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.Blob; + nativeParameter.Value = value ?? DBNull.Value; + } + + public override void BindGuid(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); + } + + public override void BindString(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.NVarchar2; + nativeParameter.Value = value ?? DBNull.Value; + } + + public override object ReadBoolean(DbDataReader reader, int index) + { + //return reader.GetDecimal(index)!=0.0m; + return Math.Abs(ReadDecimalSafely(reader, index, BooleanPrecision, 0)) > 0.3m; + } + + public override object ReadByte(DbDataReader reader, int index) + { + //return (byte) reader.GetDecimal(index); + return (byte) ReadDecimalSafely(reader, index, BytePrecision, 0); + } + + public override object ReadSByte(DbDataReader reader, int index) + { + //return (sbyte) reader.GetDecimal(index); + return (sbyte) ReadDecimalSafely(reader, index, BytePrecision, 0); + } + + public override object ReadShort(DbDataReader reader, int index) + { + //return (short) reader.GetDecimal(index); + return (short) ReadDecimalSafely(reader, index, ShortPrecision, 0); + } + + public override object ReadUShort(DbDataReader reader, int index) + { + //return (ushort) reader.GetDecimal(index); + return (ushort) ReadDecimalSafely(reader, index, ShortPrecision, 0); + } + + public override object ReadInt(DbDataReader reader, int index) + { + //return (int) reader.GetDecimal(index); + return (int) ReadDecimalSafely(reader, index, IntPrecision, 0); + } + + public override object ReadUInt(DbDataReader reader, int index) + { + //return (uint) reader.GetDecimal(index); + return (uint) ReadDecimalSafely(reader, index, IntPrecision, 0); + } + + public override object ReadLong(DbDataReader reader, int index) + { + //return (long) reader.GetDecimal(index); + return (long) ReadDecimalSafely(reader, index, LongPrecision, 0); + } + + public override object ReadULong(DbDataReader reader, int index) + { + //return (ulong) reader.GetDecimal(index); + return (ulong) ReadDecimalSafely(reader, index, LongPrecision, 0); + } + + public override object ReadDecimal(DbDataReader reader, int index) + { + return ReadDecimalSafely(reader, index, MaxDecimalPrecision.Value, MaxDecimalPrecision.Value / 2); + } + + public override object ReadFloat(DbDataReader reader, int index) + { + return Convert.ToSingle(reader[index]); + } + + public override object ReadDouble(DbDataReader reader, int index) + { + return Convert.ToDouble(reader[index]); + } + + public override object ReadDateTimeOffset(DbDataReader reader, int index) + { + var nativeReader = (OracleDataReader) reader; + return new DateTimeOffset(nativeReader.GetOracleTimeStampTZ(index).Value, nativeReader.GetOracleTimeStampTZ(index).GetTimeZoneOffset()); + } + + public override object ReadTimeSpan(DbDataReader reader, int index) + { + var nativeReader = (OracleDataReader) reader; + return (TimeSpan) nativeReader.GetOracleIntervalDS(index); + } + + public override object ReadGuid(DbDataReader reader, int index) + { + return SqlHelper.GuidFromString(reader.GetString(index)); + } + + private static decimal ReadDecimalSafely(DbDataReader reader, int index, int newPrecision, int newScale) + { + var nativeReader = (OracleDataReader) reader; + var result = OracleDecimal.ConvertToPrecScale(nativeReader.GetOracleDecimal(index), newPrecision, newScale); + return result.Value; + } + + public override SqlValueType MapBoolean(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, BooleanPrecision, 0); + } + + public override SqlValueType MapByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, BytePrecision, 0); + } + + public override SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, BytePrecision, 0); + } + + public override SqlValueType MapShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, ShortPrecision, 0); + } + + public override SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, ShortPrecision, 0); + } + + public override SqlValueType MapInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, IntPrecision, 0); + } + + public override SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, IntPrecision, 0); + } + + public override SqlValueType MapLong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, LongPrecision, 0); + } + + public override SqlValueType MapULong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, LongPrecision, 0); + } + + public override SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarChar, 32); + } + + public override SqlValueType MapTimeSpan(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Interval); + } + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Compiler.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Compiler.cs index 5d58e5c60a..c9f2c54fe6 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Compiler.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Compiler.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Diagnostics; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class Compiler : v09.Compiler - { - // Constructors - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Diagnostics; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class Compiler : v09.Compiler + { + // Constructors + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Driver.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Driver.cs index dd0df7cad1..c4dc80c0c0 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Driver.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Driver.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class Driver : v09.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class Driver : v09.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Extractor.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Extractor.cs index 21464155df..6bd1cd80c9 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Extractor.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Extractor.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System.Collections.Generic; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class Extractor : v09.Extractor - { - protected override void RegisterReplacements(Dictionary replacements) - { - base.RegisterReplacements(replacements); - replacements[TableFilterPlaceholder] = "NOT LIKE 'BIN$%'"; - replacements[IndexesFilterPlaceholder] = "indexes.DROPPED = 'NO'"; - } - - - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System.Collections.Generic; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class Extractor : v09.Extractor + { + protected override void RegisterReplacements(Dictionary replacements) + { + base.RegisterReplacements(replacements); + replacements[TableFilterPlaceholder] = "NOT LIKE 'BIN$%'"; + replacements[IndexesFilterPlaceholder] = "indexes.DROPPED = 'NO'"; + } + + + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/ServerInfoProvider.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/ServerInfoProvider.cs index cadbacb493..dfdf848006 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/ServerInfoProvider.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class ServerInfoProvider : v09.ServerInfoProvider - { - public override DataTypeCollection GetDataTypesInfo() - { - var types = base.GetDataTypesInfo(); - types.Float = DataTypeInfo.Range(SqlType.Float, types.Float.Features, - ValueRange.Float, "binary_float", "real"); - types.Double = DataTypeInfo.Range(SqlType.Double, types.Double.Features, - ValueRange.Double, "binary_double", "double precision", "float"); - return types; - } - - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class ServerInfoProvider : v09.ServerInfoProvider + { + public override DataTypeCollection GetDataTypesInfo() + { + var types = base.GetDataTypesInfo(); + types.Float = DataTypeInfo.Range(SqlType.Float, types.Float.Features, + ValueRange.Float, "binary_float", "real"); + types.Double = DataTypeInfo.Range(SqlType.Double, types.Double.Features, + ValueRange.Double, "binary_double", "double precision", "float"); + return types; + } + + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Translator.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Translator.cs index 190b63832f..4146b5eb17 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Translator.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/Translator.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class Translator : v09.Translator - { - public override string FloatFormatString { get { return base.FloatFormatString + "f"; } } - public override string DoubleFormatString { get { return base.DoubleFormatString + "d"; } } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class Translator : v09.Translator + { + public override string FloatFormatString { get { return base.FloatFormatString + "f"; } } + public override string DoubleFormatString { get { return base.DoubleFormatString + "d"; } } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/TypeMapper.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/TypeMapper.cs index 3993c6e095..ec93021377 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/TypeMapper.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v10/TypeMapper.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.18 - -using System; -using System.Data.Common; -using System.Diagnostics; -using Oracle.ManagedDataAccess.Client; - -namespace Xtensive.Sql.Drivers.Oracle.v10 -{ - internal class TypeMapper : v09.TypeMapper - { - public override void BindFloat(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.BinaryFloat; - nativeParameter.Value = value ?? DBNull.Value; - } - - public override void BindDouble(DbParameter parameter, object value) - { - var nativeParameter = (OracleParameter) parameter; - nativeParameter.OracleDbType = OracleDbType.BinaryDouble; - nativeParameter.Value = value ?? DBNull.Value; - } - - - // Constructor - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.18 + +using System; +using System.Data.Common; +using System.Diagnostics; +using Oracle.ManagedDataAccess.Client; + +namespace Xtensive.Sql.Drivers.Oracle.v10 +{ + internal class TypeMapper : v09.TypeMapper + { + public override void BindFloat(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.BinaryFloat; + nativeParameter.Value = value ?? DBNull.Value; + } + + public override void BindDouble(DbParameter parameter, object value) + { + var nativeParameter = (OracleParameter) parameter; + nativeParameter.OracleDbType = OracleDbType.BinaryDouble; + nativeParameter.Value = value ?? DBNull.Value; + } + + + // Constructor + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Compiler.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Compiler.cs index 44948b86f1..a06eba02f8 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Compiler.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Compiler.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Diagnostics; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class Compiler : v10.Compiler - { - // Constructors - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Diagnostics; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class Compiler : v10.Compiler + { + // Constructors + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Driver.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Driver.cs index 3afed8b3c5..fea87bbe4a 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Driver.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Driver.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class Driver : v10.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class Driver : v10.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Extractor.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Extractor.cs index 1c272e1f56..3b8a63753c 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Extractor.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Extractor.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class Extractor : v10.Extractor - { - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class Extractor : v10.Extractor + { + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/ServerInfoProvider.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/ServerInfoProvider.cs index 7c5ec71585..8a5e662116 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/ServerInfoProvider.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class ServerInfoProvider : v10.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class ServerInfoProvider : v10.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs index d1e842202c..ee9f2e7bb3 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class Translator : v10.Translator - { - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class Translator : v10.Translator + { + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/TypeMapper.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/TypeMapper.cs index 21e55a7d8c..61e39d250f 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/TypeMapper.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/TypeMapper.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.18 - -using System; -using System.Diagnostics; - -namespace Xtensive.Sql.Drivers.Oracle.v11 -{ - internal class TypeMapper : v10.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.18 + +using System; +using System.Diagnostics; + +namespace Xtensive.Sql.Drivers.Oracle.v11 +{ + internal class TypeMapper : v10.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Oracle/Xtensive.Orm.Oracle.csproj b/Orm/Xtensive.Orm.Oracle/Xtensive.Orm.Oracle.csproj index c8ca288a2b..e464492ba6 100644 --- a/Orm/Xtensive.Orm.Oracle/Xtensive.Orm.Oracle.csproj +++ b/Orm/Xtensive.Orm.Oracle/Xtensive.Orm.Oracle.csproj @@ -1,30 +1,30 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Oracle.xml - - - netstandard2.0 - Xtensive - Xtensive.Orm.Oracle - $(DoProductName) provider for Oracle - $(Title) - Adds support for Oracle database to $(DoProductName) - true - ..\Orm.snk - true - 2 - - - - - - - - - - Properties\Visibility.cs - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Oracle.xml + + + netstandard2.0 + Xtensive + Xtensive.Orm.Oracle + $(DoProductName) provider for Oracle + $(Title) + Adds support for Oracle database to $(DoProductName) + true + ..\Orm.snk + true + 2 + + + + + + + + + + Properties\Visibility.cs + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/DomainHandler.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/DomainHandler.cs index b4a88a0e65..df419936ca 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/DomainHandler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/DomainHandler.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.07.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - /// - /// A domain handler specific to PostgreSQL RDBMS. - /// - public class DomainHandler : Providers.DomainHandler - { - protected override ICompiler CreateCompiler(CompilerConfiguration configuration) - { - return new SqlCompiler(Handlers, configuration); - } - - protected override IEnumerable GetProviderCompilerContainers() - { - return base.GetProviderCompilerContainers() - .Concat(new[] { - typeof (NpgsqlPointCompilers), - typeof (NpgsqlLSegCompilers), - typeof (NpgsqlBoxCompilers), - typeof (NpgsqlCircleCompilers), - typeof (NpgsqlPathCompilers), - typeof (NpgsqlPolygonCompilers) - }); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.07.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + /// + /// A domain handler specific to PostgreSQL RDBMS. + /// + public class DomainHandler : Providers.DomainHandler + { + protected override ICompiler CreateCompiler(CompilerConfiguration configuration) + { + return new SqlCompiler(Handlers, configuration); + } + + protected override IEnumerable GetProviderCompilerContainers() + { + return base.GetProviderCompilerContainers() + .Concat(new[] { + typeof (NpgsqlPointCompilers), + typeof (NpgsqlLSegCompilers), + typeof (NpgsqlBoxCompilers), + typeof (NpgsqlCircleCompilers), + typeof (NpgsqlPathCompilers), + typeof (NpgsqlPolygonCompilers) + }); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/HandlerFactory.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/HandlerFactory.cs index 3649272914..4e1782d35b 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/HandlerFactory.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/HandlerFactory.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.09.15 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - /// - /// Storage provider for PostgreSQL. - /// - [Provider(WellKnown.Provider.PostgreSql, typeof (Xtensive.Sql.Drivers.PostgreSql.DriverFactory))] - public class HandlerFactory : Providers.HandlerFactory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.09.15 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + /// + /// Storage provider for PostgreSQL. + /// + [Provider(WellKnown.Provider.PostgreSql, typeof (Xtensive.Sql.Drivers.PostgreSql.DriverFactory))] + public class HandlerFactory : Providers.HandlerFactory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlBoxCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlBoxCompilers.cs index 9f0da54372..9f0d17819d 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlBoxCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlBoxCompilers.cs @@ -1,112 +1,112 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; -using Operator = Xtensive.Reflection.WellKnown.Operator; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal class NpgsqlBoxCompilers - { - #region Extractors - - [Compiler(typeof (NpgsqlBox), "UpperRight", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlBoxExtractUpperRightPoint(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0); - } - - [Compiler(typeof (NpgsqlBox), "LowerLeft", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlBoxExtractLowerLeftPoint(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1); - } - - [Compiler(typeof (NpgsqlBox), "Right", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractRight(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractX(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0)); - } - - [Compiler(typeof (NpgsqlBox), "Top", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractTop(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractY(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0)); - } - - [Compiler(typeof (NpgsqlBox), "Left", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractLeft(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractX(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1)); - } - - [Compiler(typeof (NpgsqlBox), "Bottom", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractBottom(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractY(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1)); - } - - [Compiler(typeof (NpgsqlBox), "Height", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractHeight(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlBoxExtractHeight(_this); - } - - [Compiler(typeof (NpgsqlBox), "Width", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractWidth(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlBoxExtractWidth(_this); - } - - #endregion - - #region Operators - - [Compiler(typeof (NpgsqlBox), Operator.Equality, TargetKind.Operator)] - public static SqlExpression NpgsqlBoxOperatorEquality( - [Type(typeof (NpgsqlBox))] SqlExpression left, - [Type(typeof (NpgsqlBox))] SqlExpression right) - { - return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); - } - - [Compiler(typeof (NpgsqlBox), Operator.Inequality, TargetKind.Operator)] - public static SqlExpression NpgsqlBoxOperatorInequality( - [Type(typeof (NpgsqlBox))] SqlExpression left, - [Type(typeof (NpgsqlBox))] SqlExpression right) - { - return !NpgsqlBoxOperatorEquality(left, right); - } - - #endregion - - #region Constructors - - [Compiler(typeof (NpgsqlBox), null, TargetKind.Constructor)] - public static SqlExpression NpgsqlBoxConstructor( - [Type(typeof (float))] SqlExpression top, - [Type(typeof (float))] SqlExpression right, - [Type(typeof (float))] SqlExpression bottom, - [Type(typeof (float))] SqlExpression left) - { - return PostgresqlSqlDml.NpgsqlBoxConstructor( - PostgresqlSqlDml.NpgsqlPointConstructor(right, top), - PostgresqlSqlDml.NpgsqlPointConstructor(left, bottom)); - } - - [Compiler(typeof (NpgsqlBox), null, TargetKind.Constructor)] - public static SqlExpression NpgsqlBoxConstructor( - [Type(typeof (NpgsqlPoint))] SqlExpression upperRight, - [Type(typeof (NpgsqlPoint))] SqlExpression lowerLeft) - { - return PostgresqlSqlDml.NpgsqlBoxConstructor(upperRight, lowerLeft); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; +using Operator = Xtensive.Reflection.WellKnown.Operator; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal class NpgsqlBoxCompilers + { + #region Extractors + + [Compiler(typeof (NpgsqlBox), "UpperRight", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlBoxExtractUpperRightPoint(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0); + } + + [Compiler(typeof (NpgsqlBox), "LowerLeft", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlBoxExtractLowerLeftPoint(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1); + } + + [Compiler(typeof (NpgsqlBox), "Right", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractRight(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractX(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0)); + } + + [Compiler(typeof (NpgsqlBox), "Top", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractTop(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractY(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0)); + } + + [Compiler(typeof (NpgsqlBox), "Left", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractLeft(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractX(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1)); + } + + [Compiler(typeof (NpgsqlBox), "Bottom", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractBottom(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractY(PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1)); + } + + [Compiler(typeof (NpgsqlBox), "Height", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractHeight(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlBoxExtractHeight(_this); + } + + [Compiler(typeof (NpgsqlBox), "Width", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractWidth(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlBoxExtractWidth(_this); + } + + #endregion + + #region Operators + + [Compiler(typeof (NpgsqlBox), Operator.Equality, TargetKind.Operator)] + public static SqlExpression NpgsqlBoxOperatorEquality( + [Type(typeof (NpgsqlBox))] SqlExpression left, + [Type(typeof (NpgsqlBox))] SqlExpression right) + { + return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); + } + + [Compiler(typeof (NpgsqlBox), Operator.Inequality, TargetKind.Operator)] + public static SqlExpression NpgsqlBoxOperatorInequality( + [Type(typeof (NpgsqlBox))] SqlExpression left, + [Type(typeof (NpgsqlBox))] SqlExpression right) + { + return !NpgsqlBoxOperatorEquality(left, right); + } + + #endregion + + #region Constructors + + [Compiler(typeof (NpgsqlBox), null, TargetKind.Constructor)] + public static SqlExpression NpgsqlBoxConstructor( + [Type(typeof (float))] SqlExpression top, + [Type(typeof (float))] SqlExpression right, + [Type(typeof (float))] SqlExpression bottom, + [Type(typeof (float))] SqlExpression left) + { + return PostgresqlSqlDml.NpgsqlBoxConstructor( + PostgresqlSqlDml.NpgsqlPointConstructor(right, top), + PostgresqlSqlDml.NpgsqlPointConstructor(left, bottom)); + } + + [Compiler(typeof (NpgsqlBox), null, TargetKind.Constructor)] + public static SqlExpression NpgsqlBoxConstructor( + [Type(typeof (NpgsqlPoint))] SqlExpression upperRight, + [Type(typeof (NpgsqlPoint))] SqlExpression lowerLeft) + { + return PostgresqlSqlDml.NpgsqlBoxConstructor(upperRight, lowerLeft); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlCircleCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlCircleCompilers.cs index 1c55159b12..e388751d02 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlCircleCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlCircleCompilers.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; -using Operator = Xtensive.Reflection.WellKnown.Operator; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal class NpgsqlCircleCompilers - { - #region Extractors - - [Compiler(typeof (NpgsqlCircle), "Center", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlCircleExtractCenterPoint(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlCircleExtractCenter(_this); - } - - [Compiler(typeof (NpgsqlCircle), "Radius", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlCircleExtractRadius(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlCircleExtractRadius(_this); - } - - #endregion - - #region Operators - - [Compiler(typeof (NpgsqlCircle), Operator.Equality, TargetKind.Operator)] - public static SqlExpression NpgsqlCircleOperatorEquality( - [Type(typeof (NpgsqlCircle))] SqlExpression left, - [Type(typeof (NpgsqlCircle))] SqlExpression right) - { - return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); - } - - [Compiler(typeof (NpgsqlCircle), Operator.Inequality, TargetKind.Operator)] - public static SqlExpression NpgsqlCircleOperatorInequality( - [Type(typeof (NpgsqlCircle))] SqlExpression left, - [Type(typeof (NpgsqlCircle))] SqlExpression right) - { - return left!=right; - } - - #endregion - - #region Constructors - - [Compiler(typeof (NpgsqlCircle), null, TargetKind.Constructor)] - public static SqlExpression NpgsqlCircleConstructor( - [Type(typeof (NpgsqlPoint))] SqlExpression center, - [Type(typeof (double))] SqlExpression radius) - { - return PostgresqlSqlDml.NpgsqlCircleConstructor(center, radius); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; +using Operator = Xtensive.Reflection.WellKnown.Operator; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal class NpgsqlCircleCompilers + { + #region Extractors + + [Compiler(typeof (NpgsqlCircle), "Center", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlCircleExtractCenterPoint(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlCircleExtractCenter(_this); + } + + [Compiler(typeof (NpgsqlCircle), "Radius", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlCircleExtractRadius(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlCircleExtractRadius(_this); + } + + #endregion + + #region Operators + + [Compiler(typeof (NpgsqlCircle), Operator.Equality, TargetKind.Operator)] + public static SqlExpression NpgsqlCircleOperatorEquality( + [Type(typeof (NpgsqlCircle))] SqlExpression left, + [Type(typeof (NpgsqlCircle))] SqlExpression right) + { + return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); + } + + [Compiler(typeof (NpgsqlCircle), Operator.Inequality, TargetKind.Operator)] + public static SqlExpression NpgsqlCircleOperatorInequality( + [Type(typeof (NpgsqlCircle))] SqlExpression left, + [Type(typeof (NpgsqlCircle))] SqlExpression right) + { + return left!=right; + } + + #endregion + + #region Constructors + + [Compiler(typeof (NpgsqlCircle), null, TargetKind.Constructor)] + public static SqlExpression NpgsqlCircleConstructor( + [Type(typeof (NpgsqlPoint))] SqlExpression center, + [Type(typeof (double))] SqlExpression radius) + { + return PostgresqlSqlDml.NpgsqlCircleConstructor(center, radius); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlLSegCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlLSegCompilers.cs index 9125061920..b6ff01fff5 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlLSegCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlLSegCompilers.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; -using Operator = Xtensive.Reflection.WellKnown.Operator; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal static class NpgsqlLSegCompilers - { - #region Extractors - - [Compiler(typeof (NpgsqlLSeg), "Start", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlLSegExtractStartPoint(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0); - } - - [Compiler(typeof (NpgsqlLSeg), "End", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlLSegExtractEndPoint(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1); - } - - #endregion - - #region Operators - - [Compiler(typeof (NpgsqlLSeg), Operator.Equality, TargetKind.Operator)] - public static SqlExpression NpgsqlLSegOperatorEquality( - [Type(typeof (NpgsqlLSeg))] SqlExpression left, - [Type(typeof (NpgsqlLSeg))] SqlExpression right) - { - return left==right; - } - - [Compiler(typeof (NpgsqlLSeg), Operator.Inequality, TargetKind.Operator)] - public static SqlExpression NpgsqlLSegOperatorInequality( - [Type(typeof (NpgsqlLSeg))] SqlExpression left, - [Type(typeof (NpgsqlLSeg))] SqlExpression right) - { - return left!=right; - } - - #endregion - - #region Constructors - - [Compiler(typeof (NpgsqlLSeg), null, TargetKind.Constructor)] - public static SqlExpression NpgsqlLSegConstructor( - [Type(typeof (NpgsqlPoint))] SqlExpression start, - [Type(typeof (NpgsqlPoint))] SqlExpression end) - { - return PostgresqlSqlDml.NpgsqlLSegConstructor(start, end); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; +using Operator = Xtensive.Reflection.WellKnown.Operator; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal static class NpgsqlLSegCompilers + { + #region Extractors + + [Compiler(typeof (NpgsqlLSeg), "Start", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlLSegExtractStartPoint(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 0); + } + + [Compiler(typeof (NpgsqlLSeg), "End", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlLSegExtractEndPoint(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlTypeExtractPoint(_this, 1); + } + + #endregion + + #region Operators + + [Compiler(typeof (NpgsqlLSeg), Operator.Equality, TargetKind.Operator)] + public static SqlExpression NpgsqlLSegOperatorEquality( + [Type(typeof (NpgsqlLSeg))] SqlExpression left, + [Type(typeof (NpgsqlLSeg))] SqlExpression right) + { + return left==right; + } + + [Compiler(typeof (NpgsqlLSeg), Operator.Inequality, TargetKind.Operator)] + public static SqlExpression NpgsqlLSegOperatorInequality( + [Type(typeof (NpgsqlLSeg))] SqlExpression left, + [Type(typeof (NpgsqlLSeg))] SqlExpression right) + { + return left!=right; + } + + #endregion + + #region Constructors + + [Compiler(typeof (NpgsqlLSeg), null, TargetKind.Constructor)] + public static SqlExpression NpgsqlLSegConstructor( + [Type(typeof (NpgsqlPoint))] SqlExpression start, + [Type(typeof (NpgsqlPoint))] SqlExpression end) + { + return PostgresqlSqlDml.NpgsqlLSegConstructor(start, end); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPathCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPathCompilers.cs index 8d8dbbe3bd..ea571ea4d8 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPathCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPathCompilers.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal class NpgsqlPathCompilers - { - [Compiler(typeof (NpgsqlPath), "Count", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPathCount(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPathAndPolygonCount(_this); - } - - [Compiler(typeof (NpgsqlPath), "Open", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPathOpen(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPathAndPolygonOpen(_this); - } - - [Compiler(typeof (NpgsqlPath), "Contains", TargetKind.Method)] - public static SqlExpression NpgsqlPathContains(SqlExpression _this, - [Type(typeof (NpgsqlPoint))] SqlExpression point) - { - return PostgresqlSqlDml.NpgsqlPathAndPolygonContains(_this, point); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal class NpgsqlPathCompilers + { + [Compiler(typeof (NpgsqlPath), "Count", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPathCount(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPathAndPolygonCount(_this); + } + + [Compiler(typeof (NpgsqlPath), "Open", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPathOpen(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPathAndPolygonOpen(_this); + } + + [Compiler(typeof (NpgsqlPath), "Contains", TargetKind.Method)] + public static SqlExpression NpgsqlPathContains(SqlExpression _this, + [Type(typeof (NpgsqlPoint))] SqlExpression point) + { + return PostgresqlSqlDml.NpgsqlPathAndPolygonContains(_this, point); + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPointCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPointCompilers.cs index 6a210187e7..52e0c7c0d0 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPointCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPointCompilers.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.05 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; -using Operator = Xtensive.Reflection.WellKnown.Operator; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal static class NpgsqlPointCompilers - { - #region Extractors - - [Compiler(typeof (NpgsqlPoint), "X", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractX(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractX(_this); - } - - [Compiler(typeof (NpgsqlPoint), "Y", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPointExtractY(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPointExtractY(_this); - } - - #endregion - - #region Operators - - [Compiler(typeof (NpgsqlPoint), Operator.Equality, TargetKind.Operator)] - public static SqlExpression NpgsqlPointOperatorEquality( - [Type(typeof (NpgsqlPoint))] SqlExpression left, - [Type(typeof (NpgsqlPoint))] SqlExpression right) - { - return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); - } - - [Compiler(typeof (NpgsqlPoint), Operator.Inequality, TargetKind.Operator)] - public static SqlExpression NpgsqlPointOperatorInequality( - [Type(typeof (NpgsqlPoint))] SqlExpression left, - [Type(typeof (NpgsqlPoint))] SqlExpression right) - { - return left!=right; - } - - #endregion - - #region Constructors - - [Compiler(typeof (NpgsqlPoint), null, TargetKind.Constructor)] - public static SqlExpression NpgsqlPointConstructor( - [Type(typeof (float))] SqlExpression x, - [Type(typeof (float))] SqlExpression y) - { - return PostgresqlSqlDml.NpgsqlPointConstructor(x, y); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.05 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; +using Operator = Xtensive.Reflection.WellKnown.Operator; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal static class NpgsqlPointCompilers + { + #region Extractors + + [Compiler(typeof (NpgsqlPoint), "X", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractX(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractX(_this); + } + + [Compiler(typeof (NpgsqlPoint), "Y", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPointExtractY(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPointExtractY(_this); + } + + #endregion + + #region Operators + + [Compiler(typeof (NpgsqlPoint), Operator.Equality, TargetKind.Operator)] + public static SqlExpression NpgsqlPointOperatorEquality( + [Type(typeof (NpgsqlPoint))] SqlExpression left, + [Type(typeof (NpgsqlPoint))] SqlExpression right) + { + return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); + } + + [Compiler(typeof (NpgsqlPoint), Operator.Inequality, TargetKind.Operator)] + public static SqlExpression NpgsqlPointOperatorInequality( + [Type(typeof (NpgsqlPoint))] SqlExpression left, + [Type(typeof (NpgsqlPoint))] SqlExpression right) + { + return left!=right; + } + + #endregion + + #region Constructors + + [Compiler(typeof (NpgsqlPoint), null, TargetKind.Constructor)] + public static SqlExpression NpgsqlPointConstructor( + [Type(typeof (float))] SqlExpression x, + [Type(typeof (float))] SqlExpression y) + { + return PostgresqlSqlDml.NpgsqlPointConstructor(x, y); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPolygonCompilers.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPolygonCompilers.cs index c84a3cc029..e756a50711 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPolygonCompilers.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/NpgsqlPolygonCompilers.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using NpgsqlTypes; -using Xtensive.Sql.Dml; -using Operator = Xtensive.Reflection.WellKnown.Operator; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - [CompilerContainer(typeof (SqlExpression))] - internal class NpgsqlPolygonCompilers - { - [Compiler(typeof (NpgsqlPolygon), "Count", TargetKind.PropertyGet)] - public static SqlExpression NpgsqlPolygonCount(SqlExpression _this) - { - return PostgresqlSqlDml.NpgsqlPathAndPolygonCount(_this); - } - - [Compiler(typeof (NpgsqlPolygon), "Contains", TargetKind.Method)] - public static SqlExpression NpgsqlPolygonContains(SqlExpression _this, - [Type(typeof (NpgsqlPoint))] SqlExpression point) - { - return PostgresqlSqlDml.NpgsqlPathAndPolygonContains(_this, point); - } - - #region Operators - - [Compiler(typeof (NpgsqlPolygon), Operator.Equality, TargetKind.Operator)] - public static SqlExpression NpgsqlPolygonOperatorEquality( - [Type(typeof (NpgsqlPolygon))] SqlExpression left, - [Type(typeof (NpgsqlPolygon))] SqlExpression right) - { - return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); - } - - [Compiler(typeof(NpgsqlPolygon), Operator.Inequality, TargetKind.Operator)] - public static SqlExpression NpgsqlPolygonOperatorInequality( - [Type(typeof(NpgsqlPolygon))] SqlExpression left, - [Type(typeof(NpgsqlPolygon))] SqlExpression right) - { - return !NpgsqlPolygonOperatorEquality(left, right); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using NpgsqlTypes; +using Xtensive.Sql.Dml; +using Operator = Xtensive.Reflection.WellKnown.Operator; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + [CompilerContainer(typeof (SqlExpression))] + internal class NpgsqlPolygonCompilers + { + [Compiler(typeof (NpgsqlPolygon), "Count", TargetKind.PropertyGet)] + public static SqlExpression NpgsqlPolygonCount(SqlExpression _this) + { + return PostgresqlSqlDml.NpgsqlPathAndPolygonCount(_this); + } + + [Compiler(typeof (NpgsqlPolygon), "Contains", TargetKind.Method)] + public static SqlExpression NpgsqlPolygonContains(SqlExpression _this, + [Type(typeof (NpgsqlPoint))] SqlExpression point) + { + return PostgresqlSqlDml.NpgsqlPathAndPolygonContains(_this, point); + } + + #region Operators + + [Compiler(typeof (NpgsqlPolygon), Operator.Equality, TargetKind.Operator)] + public static SqlExpression NpgsqlPolygonOperatorEquality( + [Type(typeof (NpgsqlPolygon))] SqlExpression left, + [Type(typeof (NpgsqlPolygon))] SqlExpression right) + { + return PostgresqlSqlDml.NpgsqlTypeOperatorEquality(left, right); + } + + [Compiler(typeof(NpgsqlPolygon), Operator.Inequality, TargetKind.Operator)] + public static SqlExpression NpgsqlPolygonOperatorInequality( + [Type(typeof(NpgsqlPolygon))] SqlExpression left, + [Type(typeof(NpgsqlPolygon))] SqlExpression right) + { + return !NpgsqlPolygonOperatorEquality(left, right); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlDml.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlDml.cs index 70700eef48..7dca35dde1 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlDml.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlDml.cs @@ -1,138 +1,138 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06; - -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - /// - /// A factory for SQL DML operations for Postgresql DBMS. - /// - public class PostgresqlSqlDml - { - #region Spatial types - - public static SqlExpression NpgsqlTypeExtractPoint(SqlExpression operand, SqlExpression numberPoint) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(numberPoint, "numberPoint"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlTypeExtractPoint, operand, numberPoint); - } - - public static SqlExpression NpgsqlTypeOperatorEquality(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlTypeOperatorEquality, left, right); - } - - #region NpgsqlPoint - - public static SqlExpression NpgsqlPointConstructor(SqlExpression x, SqlExpression y) - { - ArgumentValidator.EnsureArgumentNotNull(x, "x"); - ArgumentValidator.EnsureArgumentNotNull(y, "y"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointConstructor, x, y); - } - - public static SqlExpression NpgsqlPointExtractX(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointExtractX, operand); - } - - public static SqlExpression NpgsqlPointExtractY(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointExtractY, operand); - } - - #endregion - - #region NpgsqlBox - - public static SqlExpression NpgsqlBoxConstructor(SqlExpression upperRight, SqlExpression lowerLeft) - { - ArgumentValidator.EnsureArgumentNotNull(upperRight, "upperRight"); - ArgumentValidator.EnsureArgumentNotNull(lowerLeft, "lowerLeft"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxConstructor, upperRight, lowerLeft); - } - - public static SqlExpression NpgsqlBoxExtractHeight(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxExtractHeight, operand); - } - - public static SqlExpression NpgsqlBoxExtractWidth(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxExtractWidth, operand); - } - - #endregion - - #region NpgsqlCircle - - public static SqlExpression NpgsqlCircleConstructor(SqlExpression center, SqlExpression radius) - { - ArgumentValidator.EnsureArgumentNotNull(center, "center"); - ArgumentValidator.EnsureArgumentNotNull(radius, "radius"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleConstructor, center, radius); - } - - public static SqlExpression NpgsqlCircleExtractCenter(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleExtractCenter, operand); - } - - public static SqlExpression NpgsqlCircleExtractRadius(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleExtractRadius, operand); - } - - #endregion - - #region NpgsqlLSeg - - public static SqlExpression NpgsqlLSegConstructor(SqlExpression start, SqlExpression end) - { - ArgumentValidator.EnsureArgumentNotNull(start, "start"); - ArgumentValidator.EnsureArgumentNotNull(end, "end"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlLSegConstructor, start, end); - } - - #endregion - - #region NpgsqlPath and NpgsqlPolygon - - public static SqlExpression NpgsqlPathAndPolygonCount(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonCount, operand); - } - - public static SqlExpression NpgsqlPathAndPolygonOpen(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonOpen, operand); - } - - public static SqlExpression NpgsqlPathAndPolygonContains(SqlExpression operand, SqlExpression point) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(point, "point"); - return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonContains, operand, point); - } - - #endregion - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06; + +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + /// + /// A factory for SQL DML operations for Postgresql DBMS. + /// + public class PostgresqlSqlDml + { + #region Spatial types + + public static SqlExpression NpgsqlTypeExtractPoint(SqlExpression operand, SqlExpression numberPoint) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(numberPoint, "numberPoint"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlTypeExtractPoint, operand, numberPoint); + } + + public static SqlExpression NpgsqlTypeOperatorEquality(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlTypeOperatorEquality, left, right); + } + + #region NpgsqlPoint + + public static SqlExpression NpgsqlPointConstructor(SqlExpression x, SqlExpression y) + { + ArgumentValidator.EnsureArgumentNotNull(x, "x"); + ArgumentValidator.EnsureArgumentNotNull(y, "y"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointConstructor, x, y); + } + + public static SqlExpression NpgsqlPointExtractX(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointExtractX, operand); + } + + public static SqlExpression NpgsqlPointExtractY(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPointExtractY, operand); + } + + #endregion + + #region NpgsqlBox + + public static SqlExpression NpgsqlBoxConstructor(SqlExpression upperRight, SqlExpression lowerLeft) + { + ArgumentValidator.EnsureArgumentNotNull(upperRight, "upperRight"); + ArgumentValidator.EnsureArgumentNotNull(lowerLeft, "lowerLeft"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxConstructor, upperRight, lowerLeft); + } + + public static SqlExpression NpgsqlBoxExtractHeight(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxExtractHeight, operand); + } + + public static SqlExpression NpgsqlBoxExtractWidth(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlBoxExtractWidth, operand); + } + + #endregion + + #region NpgsqlCircle + + public static SqlExpression NpgsqlCircleConstructor(SqlExpression center, SqlExpression radius) + { + ArgumentValidator.EnsureArgumentNotNull(center, "center"); + ArgumentValidator.EnsureArgumentNotNull(radius, "radius"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleConstructor, center, radius); + } + + public static SqlExpression NpgsqlCircleExtractCenter(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleExtractCenter, operand); + } + + public static SqlExpression NpgsqlCircleExtractRadius(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlCircleExtractRadius, operand); + } + + #endregion + + #region NpgsqlLSeg + + public static SqlExpression NpgsqlLSegConstructor(SqlExpression start, SqlExpression end) + { + ArgumentValidator.EnsureArgumentNotNull(start, "start"); + ArgumentValidator.EnsureArgumentNotNull(end, "end"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlLSegConstructor, start, end); + } + + #endregion + + #region NpgsqlPath and NpgsqlPolygon + + public static SqlExpression NpgsqlPathAndPolygonCount(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonCount, operand); + } + + public static SqlExpression NpgsqlPathAndPolygonOpen(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonOpen, operand); + } + + public static SqlExpression NpgsqlPathAndPolygonContains(SqlExpression operand, SqlExpression point) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(point, "point"); + return new SqlCustomFunctionCall(PostgresqlSqlFunctionType.NpgsqlPathAndPolygonContains, operand, point); + } + + #endregion + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlFunctionType.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlFunctionType.cs index 19c14d676c..7f62d4716e 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlFunctionType.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/PostgresqlSqlFunctionType.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - public static class PostgresqlSqlFunctionType - { - // Npgsql - public static readonly SqlCustomFunctionType NpgsqlTypeExtractPoint = new SqlCustomFunctionType("NpgsqlTypeExtractPoint"); - public static readonly SqlCustomFunctionType NpgsqlTypeOperatorEquality = new SqlCustomFunctionType("NpgsqlTypeOperatorEquality"); - - // NpgsqlPoint - public static readonly SqlCustomFunctionType NpgsqlPointConstructor = new SqlCustomFunctionType("NpgsqlPointConstructor"); - public static readonly SqlCustomFunctionType NpgsqlPointExtractX = new SqlCustomFunctionType("NpgsqlPointExtractX"); - public static readonly SqlCustomFunctionType NpgsqlPointExtractY = new SqlCustomFunctionType("NpgsqlPointExtractY"); - - // NpgsqlBox - public static readonly SqlCustomFunctionType NpgsqlBoxConstructor = new SqlCustomFunctionType("NpgsqlBoxConstructor"); - public static readonly SqlCustomFunctionType NpgsqlBoxExtractHeight = new SqlCustomFunctionType("NpgsqlBoxExtractHeight"); - public static readonly SqlCustomFunctionType NpgsqlBoxExtractWidth = new SqlCustomFunctionType("NpgsqlBoxExtractWidth"); - - // NpgsqlCircle - public static readonly SqlCustomFunctionType NpgsqlCircleConstructor = new SqlCustomFunctionType("NpgsqlCircleConstructor"); - public static readonly SqlCustomFunctionType NpgsqlCircleExtractCenter = new SqlCustomFunctionType("NpgsqlCircleExtractCenter"); - public static readonly SqlCustomFunctionType NpgsqlCircleExtractRadius = new SqlCustomFunctionType("NpgsqlCircleExtractRadius"); - - // NpgsqlLSeg - public static readonly SqlCustomFunctionType NpgsqlLSegConstructor = new SqlCustomFunctionType("NpgsqlLSegConstructor"); - - // NpgsqlPath and NpgsqlPolygon - public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonCount = new SqlCustomFunctionType("NpgsqlPathAndPolygonCount"); - public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonOpen = new SqlCustomFunctionType("NpgsqlPathAndPolygonOpen"); - public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonContains = new SqlCustomFunctionType("NpgsqlPathAndPolygonContains"); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + public static class PostgresqlSqlFunctionType + { + // Npgsql + public static readonly SqlCustomFunctionType NpgsqlTypeExtractPoint = new SqlCustomFunctionType("NpgsqlTypeExtractPoint"); + public static readonly SqlCustomFunctionType NpgsqlTypeOperatorEquality = new SqlCustomFunctionType("NpgsqlTypeOperatorEquality"); + + // NpgsqlPoint + public static readonly SqlCustomFunctionType NpgsqlPointConstructor = new SqlCustomFunctionType("NpgsqlPointConstructor"); + public static readonly SqlCustomFunctionType NpgsqlPointExtractX = new SqlCustomFunctionType("NpgsqlPointExtractX"); + public static readonly SqlCustomFunctionType NpgsqlPointExtractY = new SqlCustomFunctionType("NpgsqlPointExtractY"); + + // NpgsqlBox + public static readonly SqlCustomFunctionType NpgsqlBoxConstructor = new SqlCustomFunctionType("NpgsqlBoxConstructor"); + public static readonly SqlCustomFunctionType NpgsqlBoxExtractHeight = new SqlCustomFunctionType("NpgsqlBoxExtractHeight"); + public static readonly SqlCustomFunctionType NpgsqlBoxExtractWidth = new SqlCustomFunctionType("NpgsqlBoxExtractWidth"); + + // NpgsqlCircle + public static readonly SqlCustomFunctionType NpgsqlCircleConstructor = new SqlCustomFunctionType("NpgsqlCircleConstructor"); + public static readonly SqlCustomFunctionType NpgsqlCircleExtractCenter = new SqlCustomFunctionType("NpgsqlCircleExtractCenter"); + public static readonly SqlCustomFunctionType NpgsqlCircleExtractRadius = new SqlCustomFunctionType("NpgsqlCircleExtractRadius"); + + // NpgsqlLSeg + public static readonly SqlCustomFunctionType NpgsqlLSegConstructor = new SqlCustomFunctionType("NpgsqlLSegConstructor"); + + // NpgsqlPath and NpgsqlPolygon + public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonCount = new SqlCustomFunctionType("NpgsqlPathAndPolygonCount"); + public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonOpen = new SqlCustomFunctionType("NpgsqlPathAndPolygonOpen"); + public static readonly SqlCustomFunctionType NpgsqlPathAndPolygonContains = new SqlCustomFunctionType("NpgsqlPathAndPolygonContains"); + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/SqlCompiler.cs b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/SqlCompiler.cs index c5ba2566f2..bc68600cbf 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/SqlCompiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/SqlCompiler.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.27 - -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Rse.Compilation; -using Xtensive.Orm.Rse.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Providers.PostgreSql -{ - internal class SqlCompiler : Providers.SqlCompiler - { - protected override SqlProvider VisitFreeText(FreeTextProvider provider) - { - var rankColumnName = provider.Header.Columns.Last().Name; - var stringTypeMapping = Driver.GetTypeMapping(typeof(string)); - var binding = new QueryParameterBinding(stringTypeMapping, - provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular); - - SqlSelect select = SqlDml.Select(); - var realPrimaryIndex = provider.PrimaryIndex.Resolve(Handlers.Domain.Model); - var index = realPrimaryIndex.ReflectedType.Indexes.PrimaryIndex; - var query = BuildProviderQuery(index); - var table = Mapping[realPrimaryIndex.ReflectedType]; - var fromTable = SqlDml.FreeTextTable(table, binding.ParameterReference, table.Columns.Select(column => column.Name).AddOne(rankColumnName).ToList()); - var fromTableRef = SqlDml.QueryRef(fromTable); - foreach (var column in query.Columns) - select.Columns.Add(fromTableRef.Columns[column.Name] ?? column); - select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[rankColumnName], SqlType.Double), rankColumnName); - select.From = fromTableRef; - if (provider.TopN!=null) { - select.Limit = provider.TopN.Invoke(); - select.OrderBy.Add(select.Columns[rankColumnName], false); - } - return CreateProvider(select, binding, provider); - } - - protected override SqlExpression ProcessAggregate(SqlProvider source, List sourceColumns, AggregateColumn aggregateColumn) - { - var result = base.ProcessAggregate(source, sourceColumns, aggregateColumn); - if (aggregateColumn.AggregateType==AggregateType.Sum || aggregateColumn.AggregateType==AggregateType.Avg) - result = SqlDml.Cast(result, Driver.MapValueType(aggregateColumn.Type)); - return result; - } - - public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) - : base(handlers, configuration) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.27 + +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Rse.Compilation; +using Xtensive.Orm.Rse.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Providers.PostgreSql +{ + internal class SqlCompiler : Providers.SqlCompiler + { + protected override SqlProvider VisitFreeText(FreeTextProvider provider) + { + var rankColumnName = provider.Header.Columns.Last().Name; + var stringTypeMapping = Driver.GetTypeMapping(typeof(string)); + var binding = new QueryParameterBinding(stringTypeMapping, + provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular); + + SqlSelect select = SqlDml.Select(); + var realPrimaryIndex = provider.PrimaryIndex.Resolve(Handlers.Domain.Model); + var index = realPrimaryIndex.ReflectedType.Indexes.PrimaryIndex; + var query = BuildProviderQuery(index); + var table = Mapping[realPrimaryIndex.ReflectedType]; + var fromTable = SqlDml.FreeTextTable(table, binding.ParameterReference, table.Columns.Select(column => column.Name).AddOne(rankColumnName).ToList()); + var fromTableRef = SqlDml.QueryRef(fromTable); + foreach (var column in query.Columns) + select.Columns.Add(fromTableRef.Columns[column.Name] ?? column); + select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[rankColumnName], SqlType.Double), rankColumnName); + select.From = fromTableRef; + if (provider.TopN!=null) { + select.Limit = provider.TopN.Invoke(); + select.OrderBy.Add(select.Columns[rankColumnName], false); + } + return CreateProvider(select, binding, provider); + } + + protected override SqlExpression ProcessAggregate(SqlProvider source, List sourceColumns, AggregateColumn aggregateColumn) + { + var result = base.ProcessAggregate(source, sourceColumns, aggregateColumn); + if (aggregateColumn.AggregateType==AggregateType.Sum || aggregateColumn.AggregateType==AggregateType.Avg) + result = SqlDml.Cast(result, Driver.MapValueType(aggregateColumn.Type)); + return result; + } + + public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) + : base(handlers, configuration) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Connection.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Connection.cs index 6075e282e3..ce77aa9ce8 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Connection.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Connection.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -using System.Security; -using Npgsql; -using System.Data; -using System.Data.Common; -using Xtensive.Orm; - -namespace Xtensive.Sql.Drivers.PostgreSql -{ - internal class Connection : SqlConnection - { - private NpgsqlConnection underlyingConnection; - private NpgsqlTransaction activeTransaction; - - /// - public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } - - /// - public override DbTransaction ActiveTransaction { get { return activeTransaction; } } - - /// - [SecuritySafeCritical] - public override DbParameter CreateParameter() - { - return new NpgsqlParameter(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction() - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction(IsolationLevel isolationLevel) - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); - } - - /// - public override void MakeSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("SAVEPOINT {0}", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void RollbackToSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void ReleaseSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("RELEASE SAVEPOINT {0}", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - protected override void ClearActiveTransaction() - { - activeTransaction = null; - } - - /// - protected override void ClearUnderlyingConnection() - { - underlyingConnection = null; - } - - // Constructors - - [SecuritySafeCritical] - public Connection(SqlDriver driver) - : base(driver) - { - underlyingConnection = new NpgsqlConnection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +using System.Security; +using Npgsql; +using System.Data; +using System.Data.Common; +using Xtensive.Orm; + +namespace Xtensive.Sql.Drivers.PostgreSql +{ + internal class Connection : SqlConnection + { + private NpgsqlConnection underlyingConnection; + private NpgsqlTransaction activeTransaction; + + /// + public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } + + /// + public override DbTransaction ActiveTransaction { get { return activeTransaction; } } + + /// + [SecuritySafeCritical] + public override DbParameter CreateParameter() + { + return new NpgsqlParameter(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction() + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction(IsolationLevel isolationLevel) + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); + } + + /// + public override void MakeSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("SAVEPOINT {0}", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void RollbackToSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void ReleaseSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("RELEASE SAVEPOINT {0}", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + protected override void ClearActiveTransaction() + { + activeTransaction = null; + } + + /// + protected override void ClearUnderlyingConnection() + { + underlyingConnection = null; + } + + // Constructors + + [SecuritySafeCritical] + public Connection(SqlDriver driver) + : base(driver) + { + underlyingConnection = new NpgsqlConnection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Driver.cs index cecda2806a..e462d792be 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Driver.cs @@ -1,105 +1,105 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.IO; -using System.Net.Sockets; -using System.Security; -using Npgsql; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql -{ - internal abstract class Driver : SqlDriver - { - [SecuritySafeCritical] - protected override SqlConnection DoCreateConnection() - { - return new Connection(this); - } - - [SecuritySafeCritical] - public override SqlExceptionType GetExceptionType(Exception exception) - { - // PostgresException is server-side exception. - // NpgsqlException is might be a client-side exception. - // for instance, Timeout of connection is client-side now (don't know why:)) - var serverSideException = exception as PostgresException; - if (serverSideException!=null) - return ProcessServerSideException(serverSideException); - - var clientSideException = exception as NpgsqlException; - if (clientSideException!=null) - return ProcessClientSideException(clientSideException); - - return SqlExceptionType.Unknown; - } - - private SqlExceptionType ProcessServerSideException(PostgresException serverSideException) - { - // There is no guaranteed way to detect a operation timeout. - // We simply check that error message says something about CommandTimeout connection parameter. - if (serverSideException.Message.ToUpperInvariant().Contains("COMMANDTIMEOUT")) - return SqlExceptionType.OperationTimeout; - - if (serverSideException.SqlState.Length!=5) - return SqlExceptionType.Unknown; - - var errorCode = serverSideException.SqlState.ToUpperInvariant(); - var errorCodeClass = errorCode.Substring(0, 2); - - // Error codes have been taken from - // http://www.postgresql.org/docs/8.4/static/errcodes-appendix.html - - switch (errorCodeClass) { - case "08": // connection_exception - return SqlExceptionType.ConnectionError; - case "42": // syntax_error_or_access_rule_violation - if (errorCode == "42501") - return SqlExceptionType.Unknown; - return SqlExceptionType.SyntaxError; - } - - switch (errorCode) { - case "23502": // not_null_violation - case "23514": // check_violation - return SqlExceptionType.CheckConstraintViolation; - case "23001": // restrict_violation - case "23503": // foreign_key_violation - return SqlExceptionType.ReferentialConstraintViolation; - case "23505": // unique_violation - return SqlExceptionType.UniqueConstraintViolation; - case "40P01": // deadlock_detected - return SqlExceptionType.Deadlock; - case "40001": // serialization_failure - return SqlExceptionType.SerializationFailure; - } - - return SqlExceptionType.Unknown; - } - - private SqlExceptionType ProcessClientSideException(NpgsqlException clientSideException) - { - var innerException = clientSideException.InnerException; - if (innerException==null) - return SqlExceptionType.Unknown; - var ioException = innerException as IOException; - if (ioException!=null) { - if (ioException.InnerException!=null) { - var socetException = ioException.InnerException as SocketException; - if (socetException!=null && socetException.SocketErrorCode==SocketError.TimedOut) - return SqlExceptionType.OperationTimeout; - } - } - return SqlExceptionType.Unknown; - } - - // Constructors - - protected Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.IO; +using System.Net.Sockets; +using System.Security; +using Npgsql; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql +{ + internal abstract class Driver : SqlDriver + { + [SecuritySafeCritical] + protected override SqlConnection DoCreateConnection() + { + return new Connection(this); + } + + [SecuritySafeCritical] + public override SqlExceptionType GetExceptionType(Exception exception) + { + // PostgresException is server-side exception. + // NpgsqlException is might be a client-side exception. + // for instance, Timeout of connection is client-side now (don't know why:)) + var serverSideException = exception as PostgresException; + if (serverSideException!=null) + return ProcessServerSideException(serverSideException); + + var clientSideException = exception as NpgsqlException; + if (clientSideException!=null) + return ProcessClientSideException(clientSideException); + + return SqlExceptionType.Unknown; + } + + private SqlExceptionType ProcessServerSideException(PostgresException serverSideException) + { + // There is no guaranteed way to detect a operation timeout. + // We simply check that error message says something about CommandTimeout connection parameter. + if (serverSideException.Message.ToUpperInvariant().Contains("COMMANDTIMEOUT")) + return SqlExceptionType.OperationTimeout; + + if (serverSideException.SqlState.Length!=5) + return SqlExceptionType.Unknown; + + var errorCode = serverSideException.SqlState.ToUpperInvariant(); + var errorCodeClass = errorCode.Substring(0, 2); + + // Error codes have been taken from + // http://www.postgresql.org/docs/8.4/static/errcodes-appendix.html + + switch (errorCodeClass) { + case "08": // connection_exception + return SqlExceptionType.ConnectionError; + case "42": // syntax_error_or_access_rule_violation + if (errorCode == "42501") + return SqlExceptionType.Unknown; + return SqlExceptionType.SyntaxError; + } + + switch (errorCode) { + case "23502": // not_null_violation + case "23514": // check_violation + return SqlExceptionType.CheckConstraintViolation; + case "23001": // restrict_violation + case "23503": // foreign_key_violation + return SqlExceptionType.ReferentialConstraintViolation; + case "23505": // unique_violation + return SqlExceptionType.UniqueConstraintViolation; + case "40P01": // deadlock_detected + return SqlExceptionType.Deadlock; + case "40001": // serialization_failure + return SqlExceptionType.SerializationFailure; + } + + return SqlExceptionType.Unknown; + } + + private SqlExceptionType ProcessClientSideException(NpgsqlException clientSideException) + { + var innerException = clientSideException.InnerException; + if (innerException==null) + return SqlExceptionType.Unknown; + var ioException = innerException as IOException; + if (ioException!=null) { + if (ioException.InnerException!=null) { + var socetException = ioException.InnerException as SocketException; + if (socetException!=null && socetException.SocketErrorCode==SocketError.TimedOut) + return SqlExceptionType.OperationTimeout; + } + } + return SqlExceptionType.Unknown; + } + + // Constructors + + protected Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/DriverFactory.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/DriverFactory.cs index e2737ab486..ca54fe9d40 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/DriverFactory.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/DriverFactory.cs @@ -1,107 +1,107 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using System.Data.Common; -using System.Security; -using Npgsql; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Info; -using Xtensive.Sql.Drivers.PostgreSql.Resources; - -namespace Xtensive.Sql.Drivers.PostgreSql -{ - /// - /// A factory for PostgreSQL. - /// - public class DriverFactory : SqlDriverFactory - { - private const string DataSourceFormat = "{0}:{1}/{2}"; - private const string DatabaseAndSchemaQuery = "select current_database(), current_schema()"; - - /// - [SecuritySafeCritical] - protected override string BuildConnectionString(UrlInfo url) - { - SqlHelper.ValidateConnectionUrl(url); - - var builder = new NpgsqlConnectionStringBuilder(); - - // host, port, database - builder.Host = url.Host; - if (url.Port!=0) - builder.Port = url.Port; - builder.Database = url.Resource ?? string.Empty; - - // user, password - if (!String.IsNullOrEmpty(url.User)) { -#if NETSTANDARD - builder.Username = url.User; -#else - builder.UserName = url.User; -#endif - builder.Password = url.Password; - } - else - builder.IntegratedSecurity = true; - - // custom options - foreach (var param in url.Params) - builder[param.Key] = param.Value; - - return builder.ToString(); - } - - /// - [SecuritySafeCritical] - protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - using (var connection = new NpgsqlConnection(connectionString)) { - connection.Open(); - SqlHelper.ExecuteInitializationSql(connection, configuration); - var version = string.IsNullOrEmpty(configuration.ForcedServerVersion) - ? connection.PostgreSqlVersion - : new Version(configuration.ForcedServerVersion); - var builder = new NpgsqlConnectionStringBuilder(connectionString); - var dataSource = string.Format(DataSourceFormat, builder.Host, builder.Port, builder.Database); - var defaultSchema = GetDefaultSchema(connection); - var coreServerInfo = new CoreServerInfo { - ServerVersion = version, - ConnectionString = connectionString, - MultipleActiveResultSets = false, - DatabaseName = defaultSchema.Database, - DefaultSchemaName = defaultSchema.Schema, - }; - - if (version.Major < 8 || version.Major==8 && version.Minor < 3) - throw new NotSupportedException(Strings.ExPostgreSqlBelow83IsNotSupported); - - // We support 8.3, 8.4 and any 9.0+ - - if (version.Major==8) { - if (version.Minor==3) - return new v8_3.Driver(coreServerInfo); - return new v8_4.Driver(coreServerInfo); - } - - if (version.Major==9) { - if (version.Minor==0) - return new v9_0.Driver(coreServerInfo); - return new v9_1.Driver(coreServerInfo); - } - - return new v10_0.Driver(coreServerInfo); - } - } - - /// - protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) - { - return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using System.Data.Common; +using System.Security; +using Npgsql; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Info; +using Xtensive.Sql.Drivers.PostgreSql.Resources; + +namespace Xtensive.Sql.Drivers.PostgreSql +{ + /// + /// A factory for PostgreSQL. + /// + public class DriverFactory : SqlDriverFactory + { + private const string DataSourceFormat = "{0}:{1}/{2}"; + private const string DatabaseAndSchemaQuery = "select current_database(), current_schema()"; + + /// + [SecuritySafeCritical] + protected override string BuildConnectionString(UrlInfo url) + { + SqlHelper.ValidateConnectionUrl(url); + + var builder = new NpgsqlConnectionStringBuilder(); + + // host, port, database + builder.Host = url.Host; + if (url.Port!=0) + builder.Port = url.Port; + builder.Database = url.Resource ?? string.Empty; + + // user, password + if (!String.IsNullOrEmpty(url.User)) { +#if NETSTANDARD + builder.Username = url.User; +#else + builder.UserName = url.User; +#endif + builder.Password = url.Password; + } + else + builder.IntegratedSecurity = true; + + // custom options + foreach (var param in url.Params) + builder[param.Key] = param.Value; + + return builder.ToString(); + } + + /// + [SecuritySafeCritical] + protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + using (var connection = new NpgsqlConnection(connectionString)) { + connection.Open(); + SqlHelper.ExecuteInitializationSql(connection, configuration); + var version = string.IsNullOrEmpty(configuration.ForcedServerVersion) + ? connection.PostgreSqlVersion + : new Version(configuration.ForcedServerVersion); + var builder = new NpgsqlConnectionStringBuilder(connectionString); + var dataSource = string.Format(DataSourceFormat, builder.Host, builder.Port, builder.Database); + var defaultSchema = GetDefaultSchema(connection); + var coreServerInfo = new CoreServerInfo { + ServerVersion = version, + ConnectionString = connectionString, + MultipleActiveResultSets = false, + DatabaseName = defaultSchema.Database, + DefaultSchemaName = defaultSchema.Schema, + }; + + if (version.Major < 8 || version.Major==8 && version.Minor < 3) + throw new NotSupportedException(Strings.ExPostgreSqlBelow83IsNotSupported); + + // We support 8.3, 8.4 and any 9.0+ + + if (version.Major==8) { + if (version.Minor==3) + return new v8_3.Driver(coreServerInfo); + return new v8_4.Driver(coreServerInfo); + } + + if (version.Major==9) { + if (version.Minor==0) + return new v9_0.Driver(coreServerInfo); + return new v9_1.Driver(coreServerInfo); + } + + return new v10_0.Driver(coreServerInfo); + } + } + + /// + protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) + { + return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/PostgreSqlTypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/PostgreSqlTypeMapper.cs index a9569f50ca..b12aeb29cd 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/PostgreSqlTypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/PostgreSqlTypeMapper.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.09 - -using System; -using System.Data.Common; -using Npgsql; -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql -{ - internal abstract class PostgreSqlTypeMapper : CustomTypeMapper - { - private readonly Type type; - private readonly NpgsqlDbType npgsqlDbType; - private readonly SqlType sqlType; - - public override bool Enabled - { - get { return type!=null; } - } - - public override Type Type - { - get { return type; } - } - - public override void BindValue(DbParameter parameter, object value) - { - if (value==null) { - parameter.Value = DBNull.Value; - return; - } - - var npgsqlParameter = (NpgsqlParameter) parameter; - npgsqlParameter.Value = value; - npgsqlParameter.NpgsqlDbType = npgsqlDbType; - } - - public override object ReadValue(DbDataReader reader, int index) - { - return reader.GetValue(index); - } - - public override SqlValueType MapType(int? length, int? precision, int? scale) - { - return new SqlValueType(sqlType); - } - - // Constructors - - protected PostgreSqlTypeMapper(string frameworkType, NpgsqlDbType npgsqlDbType, SqlType sqlType) - { - type = Type.GetType(frameworkType); - - this.npgsqlDbType = npgsqlDbType; - this.sqlType = sqlType; - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.09 + +using System; +using System.Data.Common; +using Npgsql; +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql +{ + internal abstract class PostgreSqlTypeMapper : CustomTypeMapper + { + private readonly Type type; + private readonly NpgsqlDbType npgsqlDbType; + private readonly SqlType sqlType; + + public override bool Enabled + { + get { return type!=null; } + } + + public override Type Type + { + get { return type; } + } + + public override void BindValue(DbParameter parameter, object value) + { + if (value==null) { + parameter.Value = DBNull.Value; + return; + } + + var npgsqlParameter = (NpgsqlParameter) parameter; + npgsqlParameter.Value = value; + npgsqlParameter.NpgsqlDbType = npgsqlDbType; + } + + public override object ReadValue(DbDataReader reader, int index) + { + return reader.GetValue(index); + } + + public override SqlValueType MapType(int? length, int? precision, int? scale) + { + return new SqlValueType(sqlType); + } + + // Constructors + + protected PostgreSqlTypeMapper(string frameworkType, NpgsqlDbType npgsqlDbType, SqlType sqlType) + { + type = Type.GetType(frameworkType); + + this.npgsqlDbType = npgsqlDbType; + this.sqlType = sqlType; + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/RelOptions.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/RelOptions.cs index 1c21126a82..37948826dd 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/RelOptions.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/RelOptions.cs @@ -1,11 +1,11 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Drivers.PostgreSql -{ - internal class RelOptions - { - public byte? FillFactor { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Drivers.PostgreSql +{ + internal class RelOptions + { + public byte? FillFactor { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.Designer.cs index 5ed1498972..4c190843dc 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.Designer.cs @@ -1,108 +1,108 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Sql.Drivers.PostgreSql.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.PostgreSql.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to FreeText search on custom columns not supported.. - /// - internal static string ExFreeTextSearchOnCustomColumnsNotSupported { - get { - return ResourceManager.GetString("ExFreeTextSearchOnCustomColumnsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PostgreSQL below 8.3 is not supported.. - /// - internal static string ExPostgreSqlBelow83IsNotSupported { - get { - return ResourceManager.GetString("ExPostgreSqlBelow83IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SqlMatch.Value must be an SqlRow instance.. - /// - internal static string ExSqlMatchValueMustBeAnSqlRowInstance { - get { - return ResourceManager.GetString("ExSqlMatchValueMustBeAnSqlRowInstance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type of given parameter cannot be treated as offset for DateTimeOffset construction.. - /// - internal static string ExTheTypeOfGivenParameterCannotBeTreatedAsOffsetForDateTimeOffsetConstruction { - get { - return ResourceManager.GetString("ExTheTypeOfGivenParameterCannotBeTreatedAsOffsetForDateTimeOffsetConstruction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to URL contains invalid {0} specification. {0} has to be {1}.. - /// - internal static string ExUrlContainsInvalidXSpecificationXHasToBeY { - get { - return ResourceManager.GetString("ExUrlContainsInvalidXSpecificationXHasToBeY", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Sql.Drivers.PostgreSql.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.PostgreSql.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to FreeText search on custom columns not supported.. + /// + internal static string ExFreeTextSearchOnCustomColumnsNotSupported { + get { + return ResourceManager.GetString("ExFreeTextSearchOnCustomColumnsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PostgreSQL below 8.3 is not supported.. + /// + internal static string ExPostgreSqlBelow83IsNotSupported { + get { + return ResourceManager.GetString("ExPostgreSqlBelow83IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SqlMatch.Value must be an SqlRow instance.. + /// + internal static string ExSqlMatchValueMustBeAnSqlRowInstance { + get { + return ResourceManager.GetString("ExSqlMatchValueMustBeAnSqlRowInstance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type of given parameter cannot be treated as offset for DateTimeOffset construction.. + /// + internal static string ExTheTypeOfGivenParameterCannotBeTreatedAsOffsetForDateTimeOffsetConstruction { + get { + return ResourceManager.GetString("ExTheTypeOfGivenParameterCannotBeTreatedAsOffsetForDateTimeOffsetConstruction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URL contains invalid {0} specification. {0} has to be {1}.. + /// + internal static string ExUrlContainsInvalidXSpecificationXHasToBeY { + get { + return ResourceManager.GetString("ExUrlContainsInvalidXSpecificationXHasToBeY", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.resx b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.resx index 3d235b252b..ad9e8d4ae0 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/Resources/Strings.resx @@ -1,135 +1,135 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - PostgreSQL below 8.3 is not supported. - - - URL contains invalid {0} specification. {0} has to be {1}. - - - FreeText search on custom columns not supported. - - - SqlMatch.Value must be an SqlRow instance. - - - The type of given parameter cannot be treated as offset for DateTimeOffset construction. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + PostgreSQL below 8.3 is not supported. + + + URL contains invalid {0} specification. {0} has to be {1}. + + + FreeText search on custom columns not supported. + + + SqlMatch.Value must be an SqlRow instance. + + + The type of given parameter cannot be treated as offset for DateTimeOffset construction. + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Compiler.cs index c0e4ca59b1..df45369d21 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class Compiler : v9_1.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class Compiler : v9_1.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Driver.cs index e2aafead2d..9a29c2fa9c 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Driver.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class Driver : v9_0.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - public Driver(CoreServerInfo coreServerInfo) : base(coreServerInfo) - { - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class Driver : v9_0.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + public Driver(CoreServerInfo coreServerInfo) : base(coreServerInfo) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Extractor.cs index 8cc55c6851..1ec0455f3b 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Extractor.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -using System; -using System.Data.Common; -using Xtensive.Core; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class Extractor : v9_1.Extractor - { - /// - /// Reference to system table pg_sequence. - /// - protected SqlTableRef PgSequence => SqlDml.TableRef(PgCatalogSchema.Tables["pg_sequence"]); - - protected override void BuildPgCatalogSchema(Schema schema) - { - base.BuildPgCatalogSchema(schema); - var t = schema.CreateTable("pg_sequence"); - CreateOidColumn(t, "seqrelid"); - CreateOidColumn(t, "seqtypid"); - CreateInt8Column(t, "seqstart"); - CreateInt8Column(t, "seqincrement"); - CreateInt8Column(t, "seqmax"); - CreateInt8Column(t, "seqmin"); - CreateInt8Column(t, "seqcache"); - CreateBoolColumn(t, "seqcycle"); - } - - protected override void ExtractSequenses(ExtractionContext context) - { - var sequenceMap = context.SequenceMap; - - if (sequenceMap.Count > 0) { - // select all the sequences registered in map - var tableRef = PgSequence; - var select = SqlDml.Select(tableRef); - select.Where = SqlDml.In(tableRef["seqrelid"], SqlDml.Array(sequenceMap.Keys.ToArray())); - - using (DbCommand cmd = Connection.CreateCommand(select)) - using (DbDataReader dr = cmd.ExecuteReader()) { - while (dr.Read()) { - var seqId = Convert.ToInt64(dr["seqrelid"]); - var sequence = context.SequenceMap[seqId]; - ReadSequenceDescriptor(dr, sequence.SequenceDescriptor); - } - } - } - } - - protected override void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) - { - descriptor.Increment = Convert.ToInt64(reader["seqincrement"]); - descriptor.IsCyclic = Convert.ToBoolean(reader["seqcycle"]); - descriptor.MinValue = Convert.ToInt64(reader["seqmin"]); - descriptor.MaxValue = Convert.ToInt64(reader["seqmax"]); - descriptor.StartValue = Convert.ToInt64(reader["seqstart"]); - } - - protected void CreateOidColumn(Table table, string name) - { - table.CreateColumn(name, new SqlValueType(SqlType.Int64)); - } - - protected void CreateInt8Column(Table table, string name) - { - table.CreateColumn(name, new SqlValueType(SqlType.Int64)); - } - - // Consructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +using System; +using System.Data.Common; +using Xtensive.Core; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class Extractor : v9_1.Extractor + { + /// + /// Reference to system table pg_sequence. + /// + protected SqlTableRef PgSequence => SqlDml.TableRef(PgCatalogSchema.Tables["pg_sequence"]); + + protected override void BuildPgCatalogSchema(Schema schema) + { + base.BuildPgCatalogSchema(schema); + var t = schema.CreateTable("pg_sequence"); + CreateOidColumn(t, "seqrelid"); + CreateOidColumn(t, "seqtypid"); + CreateInt8Column(t, "seqstart"); + CreateInt8Column(t, "seqincrement"); + CreateInt8Column(t, "seqmax"); + CreateInt8Column(t, "seqmin"); + CreateInt8Column(t, "seqcache"); + CreateBoolColumn(t, "seqcycle"); + } + + protected override void ExtractSequenses(ExtractionContext context) + { + var sequenceMap = context.SequenceMap; + + if (sequenceMap.Count > 0) { + // select all the sequences registered in map + var tableRef = PgSequence; + var select = SqlDml.Select(tableRef); + select.Where = SqlDml.In(tableRef["seqrelid"], SqlDml.Array(sequenceMap.Keys.ToArray())); + + using (DbCommand cmd = Connection.CreateCommand(select)) + using (DbDataReader dr = cmd.ExecuteReader()) { + while (dr.Read()) { + var seqId = Convert.ToInt64(dr["seqrelid"]); + var sequence = context.SequenceMap[seqId]; + ReadSequenceDescriptor(dr, sequence.SequenceDescriptor); + } + } + } + } + + protected override void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) + { + descriptor.Increment = Convert.ToInt64(reader["seqincrement"]); + descriptor.IsCyclic = Convert.ToBoolean(reader["seqcycle"]); + descriptor.MinValue = Convert.ToInt64(reader["seqmin"]); + descriptor.MaxValue = Convert.ToInt64(reader["seqmax"]); + descriptor.StartValue = Convert.ToInt64(reader["seqstart"]); + } + + protected void CreateOidColumn(Table table, string name) + { + table.CreateColumn(name, new SqlValueType(SqlType.Int64)); + } + + protected void CreateInt8Column(Table table, string name) + { + table.CreateColumn(name, new SqlValueType(SqlType.Int64)); + } + + // Consructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/ServerInfoProvider.cs index 83f78204e0..8bb24be295 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/ServerInfoProvider.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class ServerInfoProvider : v9_0.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class ServerInfoProvider : v9_0.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Translator.cs index dc2694d9f5..c7123aeb68 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/Translator.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class Translator : v9_1.Translator - { - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class Translator : v9_1.Translator + { + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/TypeMapper.cs index fa187012e0..03eb6502ea 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v10_0/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.25 - -namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 -{ - internal class TypeMapper : v9_1.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.25 + +namespace Xtensive.Sql.Drivers.PostgreSql.v10_0 +{ + internal class TypeMapper : v9_1.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/BoxMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/BoxMapper.cs index b449c0767a..a8df7d13a7 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/BoxMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/BoxMapper.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.10 - -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class BoxMapper : PostgreSqlTypeMapper - { - private static readonly string BoxTypeName = typeof (NpgsqlBox).AssemblyQualifiedName; - - // Constructors - - public BoxMapper() - : base(BoxTypeName, NpgsqlDbType.Box, CustomSqlType.Box) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.10 + +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class BoxMapper : PostgreSqlTypeMapper + { + private static readonly string BoxTypeName = typeof (NpgsqlBox).AssemblyQualifiedName; + + // Constructors + + public BoxMapper() + : base(BoxTypeName, NpgsqlDbType.Box, CustomSqlType.Box) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CircleMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CircleMapper.cs index e7bdca7801..f789787994 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CircleMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CircleMapper.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.10 - -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class CircleMapper : PostgreSqlTypeMapper - { - private static readonly string CircleTypeName = typeof (NpgsqlCircle).AssemblyQualifiedName; - - // Constructors - - public CircleMapper() - : base(CircleTypeName, NpgsqlDbType.Circle, CustomSqlType.Circle) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.10 + +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class CircleMapper : PostgreSqlTypeMapper + { + private static readonly string CircleTypeName = typeof (NpgsqlCircle).AssemblyQualifiedName; + + // Constructors + + public CircleMapper() + : base(CircleTypeName, NpgsqlDbType.Circle, CustomSqlType.Circle) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs index eac894a0e6..8a49a35da4 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs @@ -1,438 +1,438 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Linq; -using Xtensive.Orm.Providers.PostgreSql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; -using SqlCompiler = Xtensive.Sql.Compiler.SqlCompiler; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class Compiler : SqlCompiler - { - private static readonly SqlNative OneYearInterval = SqlDml.Native("interval '1 year'"); - private static readonly SqlNative OneMonthInterval = SqlDml.Native("interval '1 month'"); - private static readonly SqlNative OneDayInterval = SqlDml.Native("interval '1 day'"); - private static readonly SqlNative OneMinuteInterval = SqlDml.Native("interval '1 minute'"); - private static readonly SqlNative OneSecondInterval = SqlDml.Native("interval '1 second'"); - - public override void Visit(SqlDeclareCursor node) - { - } - - public override void Visit(SqlOpenCursor node) - { - base.Visit(node.Cursor.Declare()); - } - - public override void Visit(SqlBinary node) - { - var right = node.Right as SqlArray; - if (!right.IsNullReference() && (node.NodeType==SqlNodeType.In || node.NodeType==SqlNodeType.NotIn)) { - var row = SqlDml.Row(right.GetValues().Select(value => SqlDml.Literal(value)).ToArray()); - base.Visit(node.NodeType==SqlNodeType.In ? SqlDml.In(node.Left, row) : SqlDml.NotIn(node.Left, row)); - } - else { - //switch (node.NodeType) { - // case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: - // (node.Left - node.Right).AcceptVisitor(this); - // return; - // case SqlNodeType.DateTimeOffsetMinusInterval: - // (node.Left - node.Right).AcceptVisitor(this); - // return; - // case SqlNodeType.DateTimeOffsetPlusInterval: - // (node.Left + node.Right).AcceptVisitor(this); - // return; - //} - base.Visit(node); - } - } - - public override void Visit(SqlFunctionCall node) - { - const double nanosecondsPerSecond = 1000000000.0; - - switch (node.FunctionType) { - case SqlFunctionType.PadLeft: - case SqlFunctionType.PadRight: - SqlHelper.GenericPad(node).AcceptVisitor(this); - return; - case SqlFunctionType.Rand: - SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Rand)).AcceptVisitor(this); - return; - case SqlFunctionType.Square: - SqlDml.Power(node.Arguments[0], 2).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalConstruct: - ((node.Arguments[0] / SqlDml.Literal(nanosecondsPerSecond)) * OneSecondInterval).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalToMilliseconds: - SqlHelper.IntervalToMilliseconds(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalToNanoseconds: - SqlHelper.IntervalToNanoseconds(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.IntervalAbs: - SqlHelper.IntervalAbs(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeConstruct: - var newNode = (SqlDml.Literal(new DateTime(2001, 1, 1)) - + OneYearInterval * (node.Arguments[0] - 2001) - + OneMonthInterval * (node.Arguments[1] - 1) - + OneDayInterval * (node.Arguments[2] - 1)); - newNode.AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeTruncate: - (SqlDml.FunctionCall("date_trunc", "day", node.Arguments[0])).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeAddMonths: - (node.Arguments[0] + node.Arguments[1] * OneMonthInterval).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeAddYears: - (node.Arguments[0] + node.Arguments[1] * OneYearInterval).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToStringIso: - DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); - return; - /* - case SqlFunctionType.DateTimeOffsetTimeOfDay: - DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddMonths: - SqlDml.Cast(node.Arguments[0] + node.Arguments[1] * OneMonthInterval, SqlType.DateTimeOffset).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddYears: - SqlDml.Cast(node.Arguments[0] + node.Arguments[1] * OneYearInterval, SqlType.DateTimeOffset).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetConstruct: - ConstructDateTimeOffset(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToDateTimeOffset: - SqlDml.Cast(node.Arguments[0], SqlType.DateTimeOffset).AcceptVisitor(this); - return; - */ - } - base.Visit(node); - } - - public override void Visit(SqlCustomFunctionCall node) - { - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointExtractX) { - NpgsqlPointExtractPart(node.Arguments[0], 0).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointExtractY) { - NpgsqlPointExtractPart(node.Arguments[0], 1).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlTypeExtractPoint) { - NpgsqlTypeExtractPoint(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxExtractHeight) { - NpgsqlBoxExtractHeight(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxExtractWidth) { - NpgsqlBoxExtractWidth(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleExtractCenter) { - NpgsqlCircleExtractCenter(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleExtractRadius) { - NpgsqlCircleExtractRadius(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonCount) { - NpgsqlPathAndPolygonCount(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonOpen) { - NpgsqlPathAndPolygonOpen(node.Arguments[0]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonContains) { - NpgsqlPathAndPolygonContains(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlTypeOperatorEquality) { - NpgsqlTypeOperatorEquality(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointConstructor) { - var newNode = SqlDml.RawConcat( - NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "point'"), - SqlDml.Native("'")); - newNode.AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxConstructor) { - NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "box").AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleConstructor) { - NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "circle").AcceptVisitor(this); - return; - } - if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlLSegConstructor) { - NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "lseg").AcceptVisitor(this); - return; - } - base.Visit(node); - } - - - private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) - { - return SqlDml.FunctionCall("To_Char", dateTime, "YYYY-MM-DD\"T\"HH24:MI:SS"); - } - - private static SqlExpression IntervalToIsoString(SqlExpression interval, bool signed) - { - if (!signed) - return SqlDml.FunctionCall("TO_CHAR", interval, "HH24:MI"); - var hours = SqlDml.FunctionCall("TO_CHAR", SqlDml.Extract(SqlIntervalPart.Hour, interval), "SG09"); - var minutes = SqlDml.FunctionCall("TO_CHAR", SqlDml.Extract(SqlIntervalPart.Minute, interval), "FM09"); - return SqlDml.Concat(hours, ":", minutes); - } - - protected static SqlExpression NpgsqlPointExtractPart(SqlExpression expression, int part) - { - return SqlDml.RawConcat(expression, SqlDml.Native(String.Format("[{0}]", part))); - } - - protected static SqlExpression NpgsqlTypeExtractPoint(SqlExpression expression, SqlExpression numberPoint) - { - var numberPointAsInt = numberPoint as SqlLiteral; - int valueNumberPoint = numberPointAsInt!=null ? numberPointAsInt.Value : 0; - - return SqlDml.RawConcat( - SqlDml.Native("("), - SqlDml.RawConcat( - expression, - SqlDml.Native(String.Format("[{0}])", valueNumberPoint)))); - } - - protected static SqlExpression NpgsqlBoxExtractHeight(SqlExpression expression) - { - return SqlDml.FunctionCall("HEIGHT", expression); - } - - protected static SqlExpression NpgsqlBoxExtractWidth(SqlExpression expression) - { - return SqlDml.FunctionCall("WIDTH", expression); - } - - protected static SqlExpression NpgsqlCircleExtractCenter(SqlExpression expression) - { - return SqlDml.RawConcat(SqlDml.Native("@@"), expression); - } - - protected static SqlExpression NpgsqlCircleExtractRadius(SqlExpression expression) - { - return SqlDml.FunctionCall("RADIUS", expression); - } - - protected static SqlExpression NpgsqlPathAndPolygonCount(SqlExpression expression) - { - return SqlDml.FunctionCall("NPOINTS", expression); - } - - protected static SqlExpression NpgsqlPathAndPolygonOpen(SqlExpression expression) - { - return SqlDml.FunctionCall("ISOPEN", expression); - } - - protected static SqlExpression NpgsqlPathAndPolygonContains(SqlExpression expression, SqlExpression point) - { - return SqlDml.RawConcat( - expression, - SqlDml.RawConcat( - SqlDml.Native("@>"), - point)); - } - - protected static SqlExpression NpgsqlTypeOperatorEquality(SqlExpression left, SqlExpression right) - { - return SqlDml.RawConcat(left, - SqlDml.RawConcat( - SqlDml.Native("~="), - right)); - } - - private static SqlExpression NpgsqlTypeConstructor(SqlExpression left, SqlExpression right, string type) - { - return SqlDml.RawConcat( - SqlDml.Native(String.Format("{0}(", type)), - SqlDml.RawConcat(left, - SqlDml.RawConcat( - SqlDml.Native(","), - SqlDml.RawConcat( - right, - SqlDml.Native(")"))))); - } - - /* - public override void Visit(SqlExtract node) - { - switch (node.DateTimeOffsetPart) { - case SqlDateTimeOffsetPart.Date: - DateTimeOffsetExtractDate(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.DateTime: - DateTimeOffsetExtractDateTime(node.Operand).AcceptVisitor(this); - return; - - case SqlDateTimeOffsetPart.UtcDateTime: - DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.LocalDateTime: - DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Offset: - DateTimeOffsetExtractOffset(node); - return; - } - base.Visit(node); - } - */ - - /* - protected SqlExpression DateTimeOffsetExtractDate(SqlExpression timestamp) - { - return SqlDml.FunctionCall("DATE", timestamp); - } - - protected SqlExpression DateTimeOffsetExtractDateTime(SqlExpression timestamp) - { - return SqlDml.Cast(timestamp, SqlType.DateTime); - } - - protected SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression timeStamp) - { - return GetDateTimeInTimeZone(timeStamp, TimeSpan.Zero); - } - - protected SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression timestamp) - { - return SqlDml.Cast(timestamp, SqlType.DateTime); - } - - protected void DateTimeOffsetExtractOffset(SqlExtract node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, ExtractSection.Entry)); - var part = node.DateTimePart!=SqlDateTimePart.Nothing - ? translator.Translate(node.DateTimePart) - : node.IntervalPart!=SqlIntervalPart.Nothing - ? translator.Translate(node.IntervalPart) - : translator.Translate(node.DateTimeOffsetPart); - context.Output.AppendText(part); - context.Output.AppendText(translator.Translate(context, node, ExtractSection.From)); - node.Operand.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, ExtractSection.Exit)); - context.Output.AppendText(translator.Translate(SqlNodeType.Multiply)); - OneSecondInterval.AcceptVisitor(this); - } - } - - protected SqlExpression DateTimeOffsetTimeOfDay(SqlExpression timestamp) - { - return DateTimeOffsetSubstract(timestamp, SqlDml.DateTimeTruncate(timestamp)); - } - - protected SqlExpression DateTimeOffsetSubstract(SqlExpression timestamp1, SqlExpression timestamp2) - { - return timestamp1 - timestamp2; - } - - protected SqlExpression ConstructDateTimeOffset(SqlExpression dateTimeExpression, SqlExpression offsetInMinutes) - { - var dateTimeAsStringExpression = GetDateTimeAsStringExpression(dateTimeExpression); - var offsetAsStringExpression = GetOffsetAsStringExpression(offsetInMinutes); - return ConstructDateTimeOffsetFromExpressions(dateTimeAsStringExpression, offsetAsStringExpression); - } - - protected SqlExpression ConstructDateTimeOffsetFromExpressions(SqlExpression datetimeStringExpression, SqlExpression offsetStringExpression) - { - return SqlDml.Cast(SqlDml.Concat(datetimeStringExpression, " ", offsetStringExpression), SqlType.DateTimeOffset); - } - */ - /* - protected SqlExpression GetDateTimeAsStringExpression(SqlExpression dateTimeExpression) - { - return SqlDml.FunctionCall("To_Char", dateTimeExpression, "YYYY-MM-DD\"T\"HH24:MI:SS.MS"); - } - */ - - /* - protected SqlExpression GetOffsetAsStringExpression(SqlExpression offsetInMinutes) - { - int hours = 0; - int minutes = 0; - //if something simple as double or int or even timespan can be separated into hours and minutes parts - if (TryDivideOffsetIntoParts(offsetInMinutes, ref hours, ref minutes)) - return SqlDml.Native(string.Format("'{0}'", ZoneStringFromParts(hours, minutes))); - - var intervalExpression = offsetInMinutes * OneMinuteInterval; - return IntervalToIsoString(intervalExpression, true); - } - */ - - /* - private string ZoneStringFromParts(int hours, int minutes) - { - return string.Format("{0}{1:00}:{2:00}", hours < 0 ? "-" : "+", Math.Abs(hours), Math.Abs(minutes)); - } - - private SqlExpression GetDateTimeInTimeZone(SqlExpression expression, SqlExpression zone) - { - return SqlDml.FunctionCall("TIMEZONE", zone, expression); - } - */ - - /* - private SqlExpression GetServerTimeZone() - { - return SqlDml.FunctionCall("CURRENT_SETTING", SqlDml.Literal("TIMEZONE")); - } - */ - - /* - private bool TryDivideOffsetIntoParts(SqlExpression offsetInMinutes, ref int hours , ref int minutes) - { - var offsetToDouble = offsetInMinutes as SqlLiteral; - if (offsetToDouble!=null) { - hours = (int) offsetToDouble.Value / 60; - minutes = Math.Abs((int) offsetToDouble.Value % 60); - return true; - } - var offsetToInt = offsetInMinutes as SqlLiteral; - if (offsetToInt!=null) { - hours = offsetToInt.Value / 60; - minutes = Math.Abs(offsetToInt.Value % 60); - return true; - } - var offsetToTimeSpan = offsetInMinutes as SqlLiteral; - if (offsetToTimeSpan!=null) { - var totalMinutes = offsetToTimeSpan.Value.TotalMinutes; - hours = (int)totalMinutes / 60; - minutes = Math.Abs((int)totalMinutes % 60); - return true; - } - return false; - }*/ - - // Constructors - - protected internal Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Linq; +using Xtensive.Orm.Providers.PostgreSql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; +using SqlCompiler = Xtensive.Sql.Compiler.SqlCompiler; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class Compiler : SqlCompiler + { + private static readonly SqlNative OneYearInterval = SqlDml.Native("interval '1 year'"); + private static readonly SqlNative OneMonthInterval = SqlDml.Native("interval '1 month'"); + private static readonly SqlNative OneDayInterval = SqlDml.Native("interval '1 day'"); + private static readonly SqlNative OneMinuteInterval = SqlDml.Native("interval '1 minute'"); + private static readonly SqlNative OneSecondInterval = SqlDml.Native("interval '1 second'"); + + public override void Visit(SqlDeclareCursor node) + { + } + + public override void Visit(SqlOpenCursor node) + { + base.Visit(node.Cursor.Declare()); + } + + public override void Visit(SqlBinary node) + { + var right = node.Right as SqlArray; + if (!right.IsNullReference() && (node.NodeType==SqlNodeType.In || node.NodeType==SqlNodeType.NotIn)) { + var row = SqlDml.Row(right.GetValues().Select(value => SqlDml.Literal(value)).ToArray()); + base.Visit(node.NodeType==SqlNodeType.In ? SqlDml.In(node.Left, row) : SqlDml.NotIn(node.Left, row)); + } + else { + //switch (node.NodeType) { + // case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: + // (node.Left - node.Right).AcceptVisitor(this); + // return; + // case SqlNodeType.DateTimeOffsetMinusInterval: + // (node.Left - node.Right).AcceptVisitor(this); + // return; + // case SqlNodeType.DateTimeOffsetPlusInterval: + // (node.Left + node.Right).AcceptVisitor(this); + // return; + //} + base.Visit(node); + } + } + + public override void Visit(SqlFunctionCall node) + { + const double nanosecondsPerSecond = 1000000000.0; + + switch (node.FunctionType) { + case SqlFunctionType.PadLeft: + case SqlFunctionType.PadRight: + SqlHelper.GenericPad(node).AcceptVisitor(this); + return; + case SqlFunctionType.Rand: + SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Rand)).AcceptVisitor(this); + return; + case SqlFunctionType.Square: + SqlDml.Power(node.Arguments[0], 2).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalConstruct: + ((node.Arguments[0] / SqlDml.Literal(nanosecondsPerSecond)) * OneSecondInterval).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalToMilliseconds: + SqlHelper.IntervalToMilliseconds(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalToNanoseconds: + SqlHelper.IntervalToNanoseconds(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.IntervalAbs: + SqlHelper.IntervalAbs(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeConstruct: + var newNode = (SqlDml.Literal(new DateTime(2001, 1, 1)) + + OneYearInterval * (node.Arguments[0] - 2001) + + OneMonthInterval * (node.Arguments[1] - 1) + + OneDayInterval * (node.Arguments[2] - 1)); + newNode.AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeTruncate: + (SqlDml.FunctionCall("date_trunc", "day", node.Arguments[0])).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeAddMonths: + (node.Arguments[0] + node.Arguments[1] * OneMonthInterval).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeAddYears: + (node.Arguments[0] + node.Arguments[1] * OneYearInterval).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToStringIso: + DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); + return; + /* + case SqlFunctionType.DateTimeOffsetTimeOfDay: + DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddMonths: + SqlDml.Cast(node.Arguments[0] + node.Arguments[1] * OneMonthInterval, SqlType.DateTimeOffset).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddYears: + SqlDml.Cast(node.Arguments[0] + node.Arguments[1] * OneYearInterval, SqlType.DateTimeOffset).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetConstruct: + ConstructDateTimeOffset(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToDateTimeOffset: + SqlDml.Cast(node.Arguments[0], SqlType.DateTimeOffset).AcceptVisitor(this); + return; + */ + } + base.Visit(node); + } + + public override void Visit(SqlCustomFunctionCall node) + { + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointExtractX) { + NpgsqlPointExtractPart(node.Arguments[0], 0).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointExtractY) { + NpgsqlPointExtractPart(node.Arguments[0], 1).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlTypeExtractPoint) { + NpgsqlTypeExtractPoint(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxExtractHeight) { + NpgsqlBoxExtractHeight(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxExtractWidth) { + NpgsqlBoxExtractWidth(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleExtractCenter) { + NpgsqlCircleExtractCenter(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleExtractRadius) { + NpgsqlCircleExtractRadius(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonCount) { + NpgsqlPathAndPolygonCount(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonOpen) { + NpgsqlPathAndPolygonOpen(node.Arguments[0]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPathAndPolygonContains) { + NpgsqlPathAndPolygonContains(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlTypeOperatorEquality) { + NpgsqlTypeOperatorEquality(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlPointConstructor) { + var newNode = SqlDml.RawConcat( + NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "point'"), + SqlDml.Native("'")); + newNode.AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlBoxConstructor) { + NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "box").AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlCircleConstructor) { + NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "circle").AcceptVisitor(this); + return; + } + if (node.FunctionType==PostgresqlSqlFunctionType.NpgsqlLSegConstructor) { + NpgsqlTypeConstructor(node.Arguments[0], node.Arguments[1], "lseg").AcceptVisitor(this); + return; + } + base.Visit(node); + } + + + private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) + { + return SqlDml.FunctionCall("To_Char", dateTime, "YYYY-MM-DD\"T\"HH24:MI:SS"); + } + + private static SqlExpression IntervalToIsoString(SqlExpression interval, bool signed) + { + if (!signed) + return SqlDml.FunctionCall("TO_CHAR", interval, "HH24:MI"); + var hours = SqlDml.FunctionCall("TO_CHAR", SqlDml.Extract(SqlIntervalPart.Hour, interval), "SG09"); + var minutes = SqlDml.FunctionCall("TO_CHAR", SqlDml.Extract(SqlIntervalPart.Minute, interval), "FM09"); + return SqlDml.Concat(hours, ":", minutes); + } + + protected static SqlExpression NpgsqlPointExtractPart(SqlExpression expression, int part) + { + return SqlDml.RawConcat(expression, SqlDml.Native(String.Format("[{0}]", part))); + } + + protected static SqlExpression NpgsqlTypeExtractPoint(SqlExpression expression, SqlExpression numberPoint) + { + var numberPointAsInt = numberPoint as SqlLiteral; + int valueNumberPoint = numberPointAsInt!=null ? numberPointAsInt.Value : 0; + + return SqlDml.RawConcat( + SqlDml.Native("("), + SqlDml.RawConcat( + expression, + SqlDml.Native(String.Format("[{0}])", valueNumberPoint)))); + } + + protected static SqlExpression NpgsqlBoxExtractHeight(SqlExpression expression) + { + return SqlDml.FunctionCall("HEIGHT", expression); + } + + protected static SqlExpression NpgsqlBoxExtractWidth(SqlExpression expression) + { + return SqlDml.FunctionCall("WIDTH", expression); + } + + protected static SqlExpression NpgsqlCircleExtractCenter(SqlExpression expression) + { + return SqlDml.RawConcat(SqlDml.Native("@@"), expression); + } + + protected static SqlExpression NpgsqlCircleExtractRadius(SqlExpression expression) + { + return SqlDml.FunctionCall("RADIUS", expression); + } + + protected static SqlExpression NpgsqlPathAndPolygonCount(SqlExpression expression) + { + return SqlDml.FunctionCall("NPOINTS", expression); + } + + protected static SqlExpression NpgsqlPathAndPolygonOpen(SqlExpression expression) + { + return SqlDml.FunctionCall("ISOPEN", expression); + } + + protected static SqlExpression NpgsqlPathAndPolygonContains(SqlExpression expression, SqlExpression point) + { + return SqlDml.RawConcat( + expression, + SqlDml.RawConcat( + SqlDml.Native("@>"), + point)); + } + + protected static SqlExpression NpgsqlTypeOperatorEquality(SqlExpression left, SqlExpression right) + { + return SqlDml.RawConcat(left, + SqlDml.RawConcat( + SqlDml.Native("~="), + right)); + } + + private static SqlExpression NpgsqlTypeConstructor(SqlExpression left, SqlExpression right, string type) + { + return SqlDml.RawConcat( + SqlDml.Native(String.Format("{0}(", type)), + SqlDml.RawConcat(left, + SqlDml.RawConcat( + SqlDml.Native(","), + SqlDml.RawConcat( + right, + SqlDml.Native(")"))))); + } + + /* + public override void Visit(SqlExtract node) + { + switch (node.DateTimeOffsetPart) { + case SqlDateTimeOffsetPart.Date: + DateTimeOffsetExtractDate(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.DateTime: + DateTimeOffsetExtractDateTime(node.Operand).AcceptVisitor(this); + return; + + case SqlDateTimeOffsetPart.UtcDateTime: + DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.LocalDateTime: + DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Offset: + DateTimeOffsetExtractOffset(node); + return; + } + base.Visit(node); + } + */ + + /* + protected SqlExpression DateTimeOffsetExtractDate(SqlExpression timestamp) + { + return SqlDml.FunctionCall("DATE", timestamp); + } + + protected SqlExpression DateTimeOffsetExtractDateTime(SqlExpression timestamp) + { + return SqlDml.Cast(timestamp, SqlType.DateTime); + } + + protected SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression timeStamp) + { + return GetDateTimeInTimeZone(timeStamp, TimeSpan.Zero); + } + + protected SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression timestamp) + { + return SqlDml.Cast(timestamp, SqlType.DateTime); + } + + protected void DateTimeOffsetExtractOffset(SqlExtract node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, ExtractSection.Entry)); + var part = node.DateTimePart!=SqlDateTimePart.Nothing + ? translator.Translate(node.DateTimePart) + : node.IntervalPart!=SqlIntervalPart.Nothing + ? translator.Translate(node.IntervalPart) + : translator.Translate(node.DateTimeOffsetPart); + context.Output.AppendText(part); + context.Output.AppendText(translator.Translate(context, node, ExtractSection.From)); + node.Operand.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, ExtractSection.Exit)); + context.Output.AppendText(translator.Translate(SqlNodeType.Multiply)); + OneSecondInterval.AcceptVisitor(this); + } + } + + protected SqlExpression DateTimeOffsetTimeOfDay(SqlExpression timestamp) + { + return DateTimeOffsetSubstract(timestamp, SqlDml.DateTimeTruncate(timestamp)); + } + + protected SqlExpression DateTimeOffsetSubstract(SqlExpression timestamp1, SqlExpression timestamp2) + { + return timestamp1 - timestamp2; + } + + protected SqlExpression ConstructDateTimeOffset(SqlExpression dateTimeExpression, SqlExpression offsetInMinutes) + { + var dateTimeAsStringExpression = GetDateTimeAsStringExpression(dateTimeExpression); + var offsetAsStringExpression = GetOffsetAsStringExpression(offsetInMinutes); + return ConstructDateTimeOffsetFromExpressions(dateTimeAsStringExpression, offsetAsStringExpression); + } + + protected SqlExpression ConstructDateTimeOffsetFromExpressions(SqlExpression datetimeStringExpression, SqlExpression offsetStringExpression) + { + return SqlDml.Cast(SqlDml.Concat(datetimeStringExpression, " ", offsetStringExpression), SqlType.DateTimeOffset); + } + */ + /* + protected SqlExpression GetDateTimeAsStringExpression(SqlExpression dateTimeExpression) + { + return SqlDml.FunctionCall("To_Char", dateTimeExpression, "YYYY-MM-DD\"T\"HH24:MI:SS.MS"); + } + */ + + /* + protected SqlExpression GetOffsetAsStringExpression(SqlExpression offsetInMinutes) + { + int hours = 0; + int minutes = 0; + //if something simple as double or int or even timespan can be separated into hours and minutes parts + if (TryDivideOffsetIntoParts(offsetInMinutes, ref hours, ref minutes)) + return SqlDml.Native(string.Format("'{0}'", ZoneStringFromParts(hours, minutes))); + + var intervalExpression = offsetInMinutes * OneMinuteInterval; + return IntervalToIsoString(intervalExpression, true); + } + */ + + /* + private string ZoneStringFromParts(int hours, int minutes) + { + return string.Format("{0}{1:00}:{2:00}", hours < 0 ? "-" : "+", Math.Abs(hours), Math.Abs(minutes)); + } + + private SqlExpression GetDateTimeInTimeZone(SqlExpression expression, SqlExpression zone) + { + return SqlDml.FunctionCall("TIMEZONE", zone, expression); + } + */ + + /* + private SqlExpression GetServerTimeZone() + { + return SqlDml.FunctionCall("CURRENT_SETTING", SqlDml.Literal("TIMEZONE")); + } + */ + + /* + private bool TryDivideOffsetIntoParts(SqlExpression offsetInMinutes, ref int hours , ref int minutes) + { + var offsetToDouble = offsetInMinutes as SqlLiteral; + if (offsetToDouble!=null) { + hours = (int) offsetToDouble.Value / 60; + minutes = Math.Abs((int) offsetToDouble.Value % 60); + return true; + } + var offsetToInt = offsetInMinutes as SqlLiteral; + if (offsetToInt!=null) { + hours = offsetToInt.Value / 60; + minutes = Math.Abs(offsetToInt.Value % 60); + return true; + } + var offsetToTimeSpan = offsetInMinutes as SqlLiteral; + if (offsetToTimeSpan!=null) { + var totalMinutes = offsetToTimeSpan.Value.TotalMinutes; + hours = (int)totalMinutes / 60; + minutes = Math.Abs((int)totalMinutes % 60); + return true; + } + return false; + }*/ + + // Constructors + + protected internal Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CustomSqlType.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CustomSqlType.cs index 89e1d6d511..a6c2b33108 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CustomSqlType.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/CustomSqlType.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.09 - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - public static class CustomSqlType - { - /// - /// Point, like in NpgsqlTypes - /// - public static readonly SqlType Point = new SqlType("Point"); - - /// - /// LSeg, like in NpgsqlTypes - /// - public static readonly SqlType LSeg = new SqlType("LSeg"); - - /// - /// Box, like in NpgsqlTypes - /// - public static readonly SqlType Box = new SqlType("Box"); - - /// - /// Path, like in NpgsqlTypes - /// - public static readonly SqlType Path = new SqlType("Path"); - - /// - /// Polygon, like in NpgsqlTypes - /// - public static readonly SqlType Polygon = new SqlType("Polygon"); - - /// - /// Circle, like in NpgsqlTypes - /// - public static readonly SqlType Circle = new SqlType("Circle"); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.09 + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + public static class CustomSqlType + { + /// + /// Point, like in NpgsqlTypes + /// + public static readonly SqlType Point = new SqlType("Point"); + + /// + /// LSeg, like in NpgsqlTypes + /// + public static readonly SqlType LSeg = new SqlType("LSeg"); + + /// + /// Box, like in NpgsqlTypes + /// + public static readonly SqlType Box = new SqlType("Box"); + + /// + /// Path, like in NpgsqlTypes + /// + public static readonly SqlType Path = new SqlType("Path"); + + /// + /// Polygon, like in NpgsqlTypes + /// + public static readonly SqlType Polygon = new SqlType("Polygon"); + + /// + /// Circle, like in NpgsqlTypes + /// + public static readonly SqlType Circle = new SqlType("Circle"); + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Driver.cs index 336af46c0e..1b21446e89 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Driver.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using NpgsqlTypes; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class Driver : PostgreSql.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) - { - builder.Add(new PointMapper()); - builder.Add(new LSegMapper()); - builder.Add(new BoxMapper()); - builder.Add(new PathMapper()); - builder.Add(new PolygonMapper()); - builder.Add(new CircleMapper()); - /* - builder.Add(typeof (DateTimeOffset), - builder.Mapper.ReadDateTimeOffset, - builder.Mapper.BindDateTimeOffset, - builder.Mapper.MapDateTimeOffset); - */ - } - - protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) - { - builder.AddReverse(CustomSqlType.Point, typeof (NpgsqlPoint)); - builder.AddReverse(CustomSqlType.LSeg, typeof (NpgsqlLSeg)); - builder.AddReverse(CustomSqlType.Box, typeof (NpgsqlBox)); - builder.AddReverse(CustomSqlType.Path, typeof (NpgsqlPath)); - builder.AddReverse(CustomSqlType.Polygon, typeof (NpgsqlPolygon)); - builder.AddReverse(CustomSqlType.Circle, typeof (NpgsqlCircle)); - /* - builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); - */ - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using NpgsqlTypes; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class Driver : PostgreSql.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) + { + builder.Add(new PointMapper()); + builder.Add(new LSegMapper()); + builder.Add(new BoxMapper()); + builder.Add(new PathMapper()); + builder.Add(new PolygonMapper()); + builder.Add(new CircleMapper()); + /* + builder.Add(typeof (DateTimeOffset), + builder.Mapper.ReadDateTimeOffset, + builder.Mapper.BindDateTimeOffset, + builder.Mapper.MapDateTimeOffset); + */ + } + + protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) + { + builder.AddReverse(CustomSqlType.Point, typeof (NpgsqlPoint)); + builder.AddReverse(CustomSqlType.LSeg, typeof (NpgsqlLSeg)); + builder.AddReverse(CustomSqlType.Box, typeof (NpgsqlBox)); + builder.AddReverse(CustomSqlType.Path, typeof (NpgsqlPath)); + builder.AddReverse(CustomSqlType.Polygon, typeof (NpgsqlPolygon)); + builder.AddReverse(CustomSqlType.Circle, typeof (NpgsqlCircle)); + /* + builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); + */ + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Extractor.cs index 4a4069c29e..cbc9a80b3c 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Extractor.cs @@ -1,1039 +1,1039 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Diagnostics; -using System.Text; -using System.Text.RegularExpressions; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; -using Xtensive.Sql.Dml; -using System.Linq; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class Extractor : Model.Extractor - { - protected sealed class ExtractionContext - { - /// - /// Specific schemas to extract - /// - public readonly Dictionary TargetSchemes = new Dictionary(); - - /// - /// Extracted users. - /// - public readonly Dictionary UserLookup = new Dictionary(); - - /// - /// Catalog to extract information. - /// - public readonly Catalog Catalog; - - /// - /// Extracted schemas. - /// - public readonly Dictionary SchemaMap = new Dictionary(); - - /// - /// Extracted schemas identifiers. - /// - public readonly Dictionary ReversedSchemaMap = new Dictionary(); - - /// - /// Extracted tables. - /// - public readonly Dictionary TableMap = new Dictionary(); - - /// - /// Extracted views. - /// - public readonly Dictionary ViewMap = new Dictionary(); - - /// - /// Extracted sequences. - /// - public readonly Dictionary SequenceMap = new Dictionary(); - - /// - /// Extracted index expressions. - /// - public readonly Dictionary ExpressionIndexMap = new Dictionary(); - - /// - /// Extracted domains. - /// - public readonly Dictionary DomainMap = new Dictionary(); - - /// - /// Extracted columns connected grouped by owner (table or view) - /// - public readonly Dictionary> TableColumnMap = new Dictionary>(); - - public long CurrentUserSysId { get; set; } = -1; - public long? CurrentUserIdentifier { get; set; } - - public ExtractionContext(Catalog catalog) - { - Catalog = catalog; - } - } - - protected class ExpressionIndexInfo - { - public Index Index { get; set; } - public short[] Columns { get; set; } - - public ExpressionIndexInfo(Index index, short[] columns) - { - Index = index; - Columns = columns; - } - } - - private static ThreadSafeDictionary pgCatalogs = ThreadSafeDictionary.Create(new object()); - - protected long PgClassOid { get; private set; } - protected Schema PgCatalogSchema { get; private set; } - - #region Table reference creator properties - - /// - /// Reference to system table pg_user. - /// - protected SqlTableRef PgUser => SqlDml.TableRef(PgCatalogSchema.Tables["pg_user"]); - - /// - /// Reference to system table pg_tablespace. - /// - protected SqlTableRef PgTablespace => SqlDml.TableRef(PgCatalogSchema.Tables["pg_tablespace"]); - - /// - /// Reference to system table pg_namespace. - /// - protected SqlTableRef PgNamespace => SqlDml.TableRef(PgCatalogSchema.Tables["pg_namespace"]); - - /// - /// Reference to system table pg_class. - /// - protected SqlTableRef PgClass => SqlDml.TableRef(PgCatalogSchema.Tables["pg_class"]); - - /// - /// Reference to system table pg_index. - /// - protected SqlTableRef PgIndex => SqlDml.TableRef(PgCatalogSchema.Tables["pg_index"]); - - /// - /// Reference to system table pg_attribute. - /// - protected SqlTableRef PgAttribute => SqlDml.TableRef(PgCatalogSchema.Tables["pg_attribute"]); - - /// - /// Reference to system table pg_attrdef. - /// - protected SqlTableRef PgAttrDef => SqlDml.TableRef(PgCatalogSchema.Tables["pg_attrdef"]); - - /// - /// Reference to system table pg_views. - /// - protected SqlTableRef PgViews => SqlDml.TableRef(PgCatalogSchema.Tables["pg_views"]); - - /// - /// Reference to system table pg_constraint. - /// - protected SqlTableRef PgConstraint => SqlDml.TableRef(PgCatalogSchema.Tables["pg_constraint"]); - - /// - /// Reference to system table pg_type. - /// - protected SqlTableRef PgType => SqlDml.TableRef(PgCatalogSchema.Tables["pg_type"]); - - /// - /// Reference to system table pg_depend. - /// - protected SqlTableRef PgDepend => SqlDml.TableRef(PgCatalogSchema.Tables["pg_depend"]); - - #endregion - - #region Initialization - - protected override void Initialize() - { - PgCatalogSchema = pgCatalogs.GetValue(GetType(), CreatePgCatalogSchema); - - // Query OID of some system catalog tables for using them in pg_depend lookups - - SqlTableRef rel = PgClass; - SqlSelect q = SqlDml.Select(rel); - q.Where = SqlDml.In(rel["relname"], SqlDml.Row("pg_class")); - q.Columns.Add(rel["oid"]); - q.Columns.Add(rel["relname"]); - - using (var cmd = Connection.CreateCommand(q)) - using (var dr = cmd.ExecuteReader()) - while (dr.Read()) { - long oid = Convert.ToInt64(dr[0]); - string name = dr.GetString(1); - if (name=="pg_class") - PgClassOid = oid; - } - } - - private Schema CreatePgCatalogSchema(Type dummy) - { - var pgCatalog = new Catalog("info_catalog"); - var pgSchema = pgCatalog.CreateSchema("pg_catalog"); - BuildPgCatalogSchema(pgSchema); - return pgSchema; - } - - protected virtual void BuildPgCatalogSchema(Schema schema) - { - Table t; - t = schema.CreateTable("pg_user"); - CreateTextColumn(t, "usename"); - CreateInt4Column(t, "usesysid"); - - t = schema.CreateTable("pg_tablespace"); - CreateOidColumn(t); - CreateTextColumn(t, "spcname"); - CreateInt4Column(t, "spcowner"); - - t = schema.CreateTable("pg_namespace"); - CreateOidColumn(t); - CreateTextColumn(t, "nspname"); - CreateInt4Column(t, "nspowner"); - - t = schema.CreateTable("pg_class"); - CreateOidColumn(t); - CreateTextColumn(t, "relname"); - CreateInt4Column(t, "relnamespace"); - CreateInt4Column(t, "relowner"); - CreateInt4Column(t, "reltablespace"); - CreateChar1Column(t, "relkind"); - - t = schema.CreateTable("pg_index"); - CreateOidColumn(t); - CreateInt4Column(t, "indexrelid"); - CreateInt4Column(t, "indrelid"); - CreateBoolColumn(t, "indisunique"); - CreateBoolColumn(t, "indisprimary"); - CreateBoolColumn(t, "indisclustered"); - CreateTextColumn(t, "indkey"); - CreateTextColumn(t, "indoption"); - CreateTextColumn(t, "indexprs"); - CreateTextColumn(t, "indpred"); - CreateInt2Column(t, "indnatts"); - - t = schema.CreateTable("pg_attribute"); - CreateOidColumn(t); - CreateInt4Column(t, "attrelid"); - CreateTextColumn(t, "attname"); - CreateInt4Column(t, "atttypid"); - CreateInt2Column(t, "attlen"); - CreateInt2Column(t, "attnum"); - CreateInt4Column(t, "atttypmod"); - CreateBoolColumn(t, "attnotnull"); - CreateBoolColumn(t, "atthasdef"); - CreateBoolColumn(t, "attisdropped"); - - t = schema.CreateTable("pg_attrdef"); - CreateOidColumn(t); - CreateInt4Column(t, "adrelid"); - CreateInt2Column(t, "adnum"); - CreateTextColumn(t, "adsrc"); - - t = schema.CreateTable("pg_constraint"); - CreateOidColumn(t); - CreateTextColumn(t, "conname"); - CreateInt4Column(t, "connamespace"); - CreateChar1Column(t, "contype"); - CreateBoolColumn(t, "condeferrable"); - CreateBoolColumn(t, "condeferred"); - CreateInt4Column(t, "conrelid"); - CreateInt4Column(t, "contypid"); - CreateInt4Column(t, "confrelid"); - CreateChar1Column(t, "confupdtype"); - CreateChar1Column(t, "confdeltype"); - CreateChar1Column(t, "confmatchtype"); - CreateTextColumn(t, "conkey"); - CreateTextColumn(t, "confkey"); - CreateTextColumn(t, "consrc"); - - t = schema.CreateTable("pg_type"); - CreateOidColumn(t); - CreateTextColumn(t, "typname"); - CreateInt4Column(t, "typbasetype"); - CreateInt4Column(t, "typnamespace"); - CreateInt4Column(t, "typowner"); - CreateChar1Column(t, "typtype"); - CreateBoolColumn(t, "typnotnull"); - CreateInt2Column(t, "typlen"); - CreateInt4Column(t, "typtypmod"); - CreateTextColumn(t, "typdefault"); - CreateBoolColumn(t, "typisdefined"); - - t = schema.CreateTable("pg_depend"); - CreateInt4Column(t, "classid"); - CreateInt4Column(t, "objid"); - CreateInt4Column(t, "objsubid"); - CreateInt4Column(t, "refclassid"); - CreateInt4Column(t, "refobjid"); - CreateInt4Column(t, "refobjsubid"); - CreateChar1Column(t, "deptype"); - } - - #endregion - - public override Catalog ExtractCatalog(string catalogName) - { - var catalog = new Catalog(catalogName); - var context = new ExtractionContext(catalog); - ExtractUsers(context); - ExtractSchemas(context); - return catalog; - } - - public override Schema ExtractSchema(string catalogName, string schemaName) - { - var catalog = new Catalog(catalogName); - var context = new ExtractionContext(catalog); - context.TargetSchemes.Add(schemaName, catalog.CreateSchema(schemaName)); - ExtractUsers(context); - ExtractSchemas(context); - var result = context.TargetSchemes[schemaName]; - return result; - } - - public override Catalog ExtractSchemes(string catalogName, string[] schemaNames) - { - var catalog = new Catalog(catalogName); - var context = new ExtractionContext(catalog); - foreach (var schemaName in schemaNames) - context.TargetSchemes.Add(schemaName, catalog.CreateSchema(schemaName)); - ExtractUsers(context); - ExtractSchemas(context); - return catalog; - } - - /// - /// Extracts users and puts them to and sets current user identifier - /// - /// - protected void ExtractUsers(ExtractionContext context) - { - context.UserLookup.Clear(); - string me; - using (var command = Connection.CreateCommand("SELECT user")) - me = (string) command.ExecuteScalar(); - - using (DbCommand cmd = Connection.CreateCommand("SELECT usename, usesysid FROM pg_user")) - using (DbDataReader dr = cmd.ExecuteReader()) { - while (dr.Read()) { - string name = dr[0].ToString(); - long sysid = Convert.ToInt64(dr[1]); - context.UserLookup.Add(sysid, name); - if (name==me) - context.CurrentUserSysId = sysid; - } - } - } - - /// - /// Extracts complete information about schemas. - /// - /// The context. - protected void ExtractSchemas(ExtractionContext context) - { - context.CurrentUserIdentifier = GetMyUserSysId(context.CurrentUserSysId); - - //Extraction of public schemas and schemas which is owned by current user - ExtractSchemasInfo(context); - - //Extraction of tables, views and sequences - ExtractSchemaContents(context); - - //Extraction of columns of table and view - ExtractTableAndViewColumns(context); - - //Extraction of table indexes - ExtractTableIndexes(context); - - //Extraction of domains - ExtractDomains(context); - - //Extraction of table and domain constraints - ExtractTableAndDomainConstraints(context); - - //sequence infos - ExtractSequenses(context); - } - - /// - /// Extracts general information about existing schemas, nothing else. - /// - /// The context. - protected virtual void ExtractSchemasInfo(ExtractionContext context) - { - var namespaceTable1 = PgNamespace; - var namespaceTable2 = PgNamespace; - var selectPublic = SqlDml.Select(namespaceTable1); - selectPublic.Where = namespaceTable1["nspname"]=="public" - && namespaceTable1["nspowner"] != context.CurrentUserIdentifier; - selectPublic.Columns.Add(namespaceTable1["nspname"]); - selectPublic.Columns.Add(namespaceTable1["oid"]); - selectPublic.Columns.Add(namespaceTable1["nspowner"]); - - var selectMine = SqlDml.Select(namespaceTable2); - selectMine.Where = namespaceTable2["nspowner"]==context.CurrentUserIdentifier; - selectMine.Columns.Add(namespaceTable2["nspname"]); - selectMine.Columns.Add(namespaceTable2["oid"]); - selectMine.Columns.Add(namespaceTable2["nspowner"]); - - var union = selectPublic.UnionAll(selectMine); - var catalog = context.Catalog; - - using (var command = Connection.CreateCommand(union)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var oid = Convert.ToInt64(dataReader["oid"]); - var name = dataReader["nspname"].ToString(); - var owner = Convert.ToInt64(dataReader["nspowner"]); - - var schema = catalog.Schemas[name] ?? catalog.CreateSchema(name); - if (name=="public") - catalog.DefaultSchema = schema; - schema.Owner = context.UserLookup[owner]; - context.SchemaMap[oid] = schema; - context.ReversedSchemaMap[schema] = oid; - } - } - } - - /// - /// Extracts general information schemas' content like tables, view, sequences and puts it to the context. - /// - /// The context. - protected virtual void ExtractSchemaContents(ExtractionContext context) - { - var catalog = context.Catalog; - var targetSchemes = context.TargetSchemes; - - if (context.SchemaMap.Count > 0) { - var relationsTable = PgClass; - var tablespacesTable = PgTablespace; - - var join = relationsTable.LeftOuterJoin(tablespacesTable, tablespacesTable["oid"]==relationsTable["reltablespace"]); - var select = SqlDml.Select(join); - select.Where = relationsTable["relowner"]==context.CurrentUserIdentifier - && SqlDml.In(relationsTable["relkind"], SqlDml.Row('r', 'v', 'S')); - - if (targetSchemes!=null && targetSchemes.Count > 0) { - var schemesIndexes = catalog.Schemas.Where(sch => targetSchemes.ContainsKey(sch.Name)).Select(sch => context.ReversedSchemaMap[sch]); - select.Where &= SqlDml.In(relationsTable["relnamespace"], CreateOidRow(schemesIndexes)); - } - select.Columns.Add(relationsTable["oid"], "reloid"); - select.Columns.Add(relationsTable["relname"]); - select.Columns.Add(relationsTable["relkind"]); - select.Columns.Add(relationsTable["relnamespace"]); - select.Columns.Add(tablespacesTable["spcname"]); - select.Columns.Add(new Func(() => { - SqlCase defCase = SqlDml.Case(relationsTable["relkind"]); - defCase.Add('v', SqlDml.FunctionCall("pg_get_viewdef", relationsTable["oid"])); - return defCase; - })(), "definition"); - - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var relationOid = Convert.ToInt64(dataReader["reloid"]); - var relationKind = dataReader["relkind"].ToString(); - var relationName = dataReader["relname"].ToString(); - var relationNamespace = Convert.ToInt64(dataReader["relnamespace"]); - - Schema schema; - if (!context.SchemaMap.TryGetValue(relationNamespace, out schema)) - continue; - Debug.Assert(schema!=null); - if (relationKind=="r") { - var table = schema.CreateTable(relationName); - var tableSpaceName = dataReader["spcname"]; - if (tableSpaceName != DBNull.Value && tableSpaceName != null) - table.Filegroup = Convert.ToString(tableSpaceName); - context.TableMap.Add(relationOid, table); - } - else if (relationKind=="v") { - var definition = dataReader["definition"].ToString(); - var view = schema.CreateView(relationName, SqlDml.Native(definition), CheckOptions.None); - context.ViewMap.Add(relationOid, view); - } - else if (relationKind=="S") { - var sequence = schema.CreateSequence(relationName); - context.SequenceMap.Add(relationOid, sequence); - } - } - } - } - } - - /// - /// Extracts information about columns for items listed in and and fills . - /// - /// The context - protected virtual void ExtractTableAndViewColumns(ExtractionContext context) - { - var tableMap = context.TableMap; - var viewMap = context.ViewMap; - var tableColumns = context.TableColumnMap; - - if (tableMap.Count > 0 || viewMap.Count > 0) { - var columnsTable = PgAttribute; - var dafaultValuesTable = PgAttrDef; - var typesTable = PgType; - - var select = SqlDml.Select(columnsTable - .LeftOuterJoin(dafaultValuesTable, columnsTable["attrelid"]==dafaultValuesTable["adrelid"] && columnsTable["attnum"]==dafaultValuesTable["adnum"]) - .InnerJoin(typesTable, typesTable["oid"]==columnsTable["atttypid"])); - - select.Where = columnsTable["attisdropped"]==false && - columnsTable["attnum"] > 0 && - (SqlDml.In(columnsTable["attrelid"], CreateOidRow(tableMap.Keys)) || - SqlDml.In(columnsTable["attrelid"], CreateOidRow(viewMap.Keys))); - - select.Columns.Add(columnsTable["attrelid"]); - select.Columns.Add(columnsTable["attnum"]); - select.Columns.Add(columnsTable["attname"]); - select.Columns.Add(typesTable["typname"]); - select.Columns.Add(columnsTable["atttypmod"]); - select.Columns.Add(columnsTable["attnotnull"]); - select.Columns.Add(columnsTable["atthasdef"]); - select.Columns.Add(dafaultValuesTable["adsrc"]); - select.OrderBy.Add(columnsTable["attrelid"]); - select.OrderBy.Add(columnsTable["attnum"]); - - using (var command = Connection.CreateCommand(select)) - using (DbDataReader dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var columnOwnerId = Convert.ToInt64(dataReader["attrelid"]); - var columnId = Convert.ToInt64(dataReader["attnum"]); - var columnName = dataReader["attname"].ToString(); - if (tableMap.ContainsKey(columnOwnerId)) { - var table = tableMap[columnOwnerId]; - Debug.Assert(table != null); - TableColumn col = table.CreateColumn(columnName); - if (!tableColumns.ContainsKey(columnOwnerId)) - tableColumns.Add(columnOwnerId, new Dictionary()); - tableColumns[columnOwnerId].Add(columnId, col); - - var columnTypeName = dataReader["typname"].ToString(); - var columnTypeSpecificData = Convert.ToInt32(dataReader["atttypmod"]); - var notNullFlag = dataReader.GetBoolean(dataReader.GetOrdinal("attnotnull")); - var defaultValueFlag = dataReader.GetBoolean(dataReader.GetOrdinal("atthasdef")); - if (defaultValueFlag) { - var defaultValue = dataReader["adsrc"].ToString(); - col.DefaultValue = SqlDml.Native(defaultValue); - } - col.IsNullable = !notNullFlag; - col.DataType = GetSqlValueType(columnTypeName, columnTypeSpecificData); - } - else { - var view = viewMap[columnOwnerId]; - Debug.Assert(view != null); - view.CreateColumn(columnName); - } - } - } - } - } - - /// - /// Extracts information about indexes for the tables listed in . - /// - /// The context - protected virtual void ExtractTableIndexes(ExtractionContext context) - { - var tableMap = context.TableMap; - var tableColumns = context.TableColumnMap; - - if (tableMap.Count > 0) { - var tableSpacesTable = PgTablespace; - var relationsTable = PgClass; - var indexTable = PgIndex; - var dependencyTable = PgDepend; - - //subselect that index was not created automatically - var subSelect = SqlDml.Select(dependencyTable); - subSelect.Where = dependencyTable["classid"]==PgClassOid && - dependencyTable["objid"]==indexTable["indexrelid"] && - dependencyTable["deptype"]=='i'; - subSelect.Columns.Add(dependencyTable[0]); - - //not automatically created indexes of our tables - var select = SqlDml.Select(indexTable - .InnerJoin(relationsTable, relationsTable["oid"]==indexTable["indexrelid"]) - .LeftOuterJoin(tableSpacesTable, tableSpacesTable["oid"]==relationsTable["reltablespace"])); - select.Where = SqlDml.In(indexTable["indrelid"], CreateOidRow(tableMap.Keys)) && !SqlDml.Exists(subSelect); - select.Columns.Add(indexTable["indrelid"]); - select.Columns.Add(indexTable["indexrelid"]); - select.Columns.Add(relationsTable["relname"]); - select.Columns.Add(indexTable["indisunique"]); - select.Columns.Add(indexTable["indisclustered"]); - select.Columns.Add(indexTable["indkey"]); - select.Columns.Add(tableSpacesTable["spcname"]); - select.Columns.Add(indexTable["indnatts"]); - select.Columns.Add(indexTable["indexprs"]); - select.Columns.Add(indexTable["indpred"]); - select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"]), "inddef"); - AddSpecialIndexQueryColumns(select, tableSpacesTable, relationsTable, indexTable, dependencyTable); - - int maxColumnNumber = 0; - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var tableIdentifier = Convert.ToInt64(dataReader["indrelid"]); - var indexIdentifier = Convert.ToInt64(dataReader["indexrelid"]); - var indexName = dataReader["relname"].ToString(); - var isUnique = dataReader.GetBoolean(dataReader.GetOrdinal("indisunique")); - var isClustered = dataReader.GetBoolean(dataReader.GetOrdinal("indisclustered")); - var indexKey = (short[])dataReader["indkey"]; - - var tablespaceName = (dataReader["spcname"]!=DBNull.Value) ? dataReader["spcname"].ToString() : (string)null; - var filterExpression = (dataReader["indpred"]!=DBNull.Value) ? dataReader["indpred"].ToString() : string.Empty; - - var table = tableMap[tableIdentifier]; - - var fullTextRegex = @"(?<=CREATE INDEX \S+ ON \S+ USING (?:gist|gin)(?:\s|\S)*)to_tsvector\('(\w+)'::regconfig, \(*(?:(?:\s|\)|\(|\|)*(?:\(""(\S+)""\)|'\s')::text)+\)"; - var indexScript = dataReader["inddef"].ToString(); - var matches = Regex.Matches(indexScript, fullTextRegex, RegexOptions.Compiled); - if (matches.Count > 0) { - // Fulltext index - var fullTextIndex = table.CreateFullTextIndex(indexName); - foreach (Match match in matches) { - var columnConfigurationName = match.Groups[1].Value; - foreach (Capture capture in match.Groups[2].Captures) { - var columnName = capture.Value; - var fullTextColumn = fullTextIndex.Columns[columnName] ?? fullTextIndex.CreateIndexColumn(table.Columns.Single(column => column.Name == columnName)); - if (fullTextColumn.Languages[columnConfigurationName]==null) - fullTextColumn.Languages.Add(new Language(columnConfigurationName)); - } - } - } - else { - //Regular index - var index = table.CreateIndex(indexName); - index.IsBitmap = false; - index.IsUnique = isUnique; - index.Filegroup = tablespaceName; - if (!string.IsNullOrEmpty(filterExpression)) - index.Where = SqlDml.Native(filterExpression); - - // Expression-based index - var some = dataReader["indexprs"]; - if (some!=DBNull.Value) { - context.ExpressionIndexMap[indexIdentifier] = new ExpressionIndexInfo(index, indexKey); - int columnNumber = dataReader.GetInt16(dataReader.GetOrdinal("indnatts")); - if (columnNumber > maxColumnNumber) - maxColumnNumber = columnNumber; - } - else { - for (int j = 0; j < indexKey.Length; j++) { - int colIndex = indexKey[j]; - if (colIndex > 0) - index.CreateIndexColumn(tableColumns[tableIdentifier][colIndex], true); - else{ - int z = 7; - //column index is 0 - //this means that this index column is an expression - //which is not possible with SqlDom tables - } - } - } - ReadSpecialIndexProperties(dataReader, index); - } - } - } - - var expressionIndexMap = context.ExpressionIndexMap; - - if (expressionIndexMap.Count > 0) { - select = SqlDml.Select(indexTable); - select.Columns.Add(indexTable["indrelid"]); - select.Columns.Add(indexTable["indexrelid"]); - - for (int i = 1; i <= maxColumnNumber; i++) - select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"], i, true), i.ToString()); - select.Where = SqlDml.In(indexTable["indexrelid"], SqlDml.Array(expressionIndexMap.Keys.ToArray())); - - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var exprIndexInfo = expressionIndexMap[Convert.ToInt64(dataReader[1])]; - for (int j = 0; j < exprIndexInfo.Columns.Length; j++) { - int colIndex = exprIndexInfo.Columns[j]; - if (colIndex > 0) - exprIndexInfo.Index.CreateIndexColumn(tableColumns[Convert.ToInt64(dataReader[0])][colIndex], true); - else - exprIndexInfo.Index.CreateIndexColumn(SqlDml.Native(dataReader[(j + 1).ToString()].ToString())); - } - } - } - } - } - } - - /// - /// Extracts information about domains for the schemas listed in and fills - /// - /// The context. - protected virtual void ExtractDomains(ExtractionContext context) - { - var schemaIndex = context.SchemaMap; - var domains = context.DomainMap; - - if (schemaIndex.Count > 0) { - var typeTable = PgType; - var baseTypeTable = PgType; - var select = SqlDml.Select(typeTable.InnerJoin(baseTypeTable, baseTypeTable["oid"]==typeTable["typbasetype"])); - select.Where = typeTable["typisdefined"]==true && - typeTable["typtype"]=='d' && - SqlDml.In(typeTable["typnamespace"], CreateOidRow(schemaIndex.Keys)) && - typeTable["typowner"]==context.CurrentUserIdentifier; - select.Columns.Add(typeTable["oid"]); - select.Columns.Add(typeTable["typname"], "typname"); - select.Columns.Add(typeTable["typnamespace"], "typnamespace"); - select.Columns.Add(typeTable["typtypmod"], "typmod"); - select.Columns.Add(typeTable["typdefault"], "default"); - select.Columns.Add(baseTypeTable["typname"], "basetypname"); - - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var typeId = Convert.ToInt64(dataReader["oid"]); - var typeNamespace = Convert.ToInt64(dataReader["typnamespace"]); - var typeName = dataReader["typname"].ToString(); - var baseTypeName = dataReader["basetypname"].ToString(); - int typmod = Convert.ToInt32(dataReader["typmod"]); - var defaultValue = (dataReader["default"]!=DBNull.Value) ? dataReader["default"].ToString() : (string)null; - - Schema schema; - if (!schemaIndex.TryGetValue(typeNamespace, out schema)) - continue; - var domain = schema.CreateDomain(typeName, GetSqlValueType(baseTypeName, typmod)); - domain.DefaultValue = (defaultValue==null) ? (SqlExpression)SqlDml.Null : (SqlExpression)SqlDml.Native(defaultValue); - domains.Add(typeId, domain); - } - } - } - } - - /// - /// Extracts table and domain constraints for items listed in and . - /// - /// The context. - protected virtual void ExtractTableAndDomainConstraints(ExtractionContext context) - { - var tableMap = context.TableMap; - var domainMap = context.DomainMap; - var tableColumns = context.TableColumnMap; - - if (tableMap.Count > 0 || domainMap.Count > 0) { - var constraintTable = PgConstraint; - var select = SqlDml.Select(constraintTable); - select.Where = SqlDml.In(constraintTable["conrelid"], CreateOidRow(tableMap.Keys)) || - SqlDml.In(constraintTable["contypid"], CreateOidRow(domainMap.Keys)); - - select.Columns.AddRange(constraintTable["conname"], - constraintTable["contype"], - constraintTable["condeferrable"], - constraintTable["condeferred"], - constraintTable["conrelid"], - constraintTable["contypid"], - constraintTable["conkey"], - constraintTable["consrc"], - constraintTable["confrelid"], - constraintTable["confkey"], - constraintTable["confupdtype"], - constraintTable["confdeltype"], - constraintTable["confmatchtype"]); - - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var constraintType = dataReader["contype"].ToString()[0]; - var constraintName = dataReader["conname"].ToString(); - var isDeferrable = dataReader.GetBoolean(dataReader.GetOrdinal("condeferrable")); - var isDeferred = dataReader.GetBoolean(dataReader.GetOrdinal("condeferred")); - var tableId = Convert.ToInt64(dataReader["conrelid"]); - var domainId = Convert.ToInt64(dataReader["contypid"]); - object constraintKeyColumns = dataReader["conkey"]; - - if (tableId!=0) { - //table constraint - var table = tableMap[tableId]; - if (constraintType=='c') { - //[c]heck - var consrc = dataReader["consrc"].ToString(); - var constraint = table.CreateCheckConstraint(constraintName, SqlDml.Native(consrc)); - constraint.IsDeferrable = isDeferrable; - constraint.IsInitiallyDeferred = isDeferred; - } - else { - var columnsOfTable = tableColumns[tableId]; - if (constraintType=='u' || constraintType=='p') { - //[u]nique or [p]rimary key - UniqueConstraint constraint = (constraintType=='u') - ? table.CreateUniqueConstraint(constraintName) - : table.CreatePrimaryKey(constraintName); - - constraint.IsDeferrable = isDeferrable; - constraint.IsInitiallyDeferred = isDeferred; - int[] colIndexes = ReadIntArray(constraintKeyColumns); - for (int i = 0; i < colIndexes.Length; i++) - constraint.Columns.Add(columnsOfTable[colIndexes[i]]); - } - else if (constraintType=='f') { - //[f]oreign key - object confkey = dataReader["confkey"]; - var referencedTableId = Convert.ToInt64(dataReader["confrelid"]); - var updateAction = dataReader["confupdtype"].ToString()[0]; - var deleteAction = dataReader["confdeltype"].ToString()[0]; - var matchType = dataReader["confmatchtype"].ToString()[0]; - - var foreignKey = table.CreateForeignKey(constraintName); - foreignKey.IsDeferrable = isDeferrable; - foreignKey.IsInitiallyDeferred = isDeferred; - foreignKey.OnDelete = GetReferentialAction(deleteAction); - foreignKey.OnUpdate = GetReferentialAction(updateAction); - foreignKey.MatchType = GetMatchType(matchType); - foreignKey.ReferencedTable = tableMap[referencedTableId]; - - var fkeyColumns = tableColumns[referencedTableId]; - - int[] colIndexes = ReadIntArray(constraintKeyColumns); - for (int i = 0; i < colIndexes.Length; i++) - foreignKey.Columns.Add(columnsOfTable[colIndexes[i]]); - - colIndexes = ReadIntArray(confkey); - for (int i = 0; i < colIndexes.Length; i++) - foreignKey.ReferencedColumns.Add(fkeyColumns[colIndexes[i]]); - } - } - } - else if (domainId!=0) { - //domain constraint - if (constraintType=='c') { - //check - string consrc = dataReader["consrc"].ToString(); - var domain = domainMap[domainId]; - var constraint = domain.CreateConstraint(constraintName, SqlDml.Native(consrc)); - constraint.IsDeferrable = isDeferrable; - constraint.IsInitiallyDeferred = isDeferred; - } - } - } - } - } - } - - /// - /// Extracts sequences listed in . - /// - /// The context - protected virtual void ExtractSequenses(ExtractionContext context) - { - var sequenceMap = context.SequenceMap; - - if (sequenceMap.Count > 0) { - //Have to do it traditional string concat because cannot select from - //a sequence with Sql.Dom - var query = new StringBuilder(); { - Sequence[] seqArray = new Sequence[sequenceMap.Count]; - sequenceMap.Values.CopyTo(seqArray, 0); - Sequence seq = seqArray[0]; - query.AppendFormat("SELECT * FROM (\nSELECT {0} as id, * FROM {1}", 0, - Driver.Translator.Translate(null, seq)); // context is not used in PostrgreSQL translator - for (int i = 1; i < sequenceMap.Count; i++) - { - seq = seqArray[i]; - query.AppendFormat("\nUNION ALL\nSELECT {0} as id, * FROM {1}", i, - Driver.Translator.Translate(null, seq)); // context is not used in PostgreSQL translator - } - query.Append("\n) all_sequences\nORDER BY id"); - } - - using (DbCommand cmd = Connection.UnderlyingConnection.CreateCommand()) { - cmd.CommandText = query.ToString(); - using (DbDataReader dr = cmd.ExecuteReader()) { - foreach (Sequence seq in sequenceMap.Values) { - dr.Read(); - ReadSequenceDescriptor(dr, seq.SequenceDescriptor); - } - } - } - } - } - - protected virtual void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) - { - } - - protected virtual void ReadSpecialIndexProperties(DbDataReader dr, Index i) - { - } - - protected virtual void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) - { - descriptor.Increment = Convert.ToInt64(reader["increment_by"]); - descriptor.IsCyclic = Convert.ToBoolean(reader["is_cycled"]); - descriptor.MinValue = Convert.ToInt64(reader["min_value"]); - descriptor.MaxValue = Convert.ToInt64(reader["max_value"]); - descriptor.StartValue = Convert.ToInt64(reader["min_value"]); - } - - #region Column creation methods - - protected void CreateOidColumn(Table t) - { - t.CreateColumn("oid", new SqlValueType(SqlType.Int64)); - } - - protected void CreateInt2Column(Table t, string name) - { - t.CreateColumn(name, new SqlValueType(SqlType.Int16)); - } - - protected void CreateInt4Column(Table t, string name) - { - t.CreateColumn(name, new SqlValueType(SqlType.Int32)); - } - - protected void CreateChar1Column(Table t, string name) - { - t.CreateColumn(name, new SqlValueType(SqlType.Char, 1)); - } - - protected void CreateTextColumn(Table t, string name) - { - t.CreateColumn(name, new SqlValueType(SqlType.VarChar)); - } - - protected void CreateBoolColumn(Table t, string name) - { - t.CreateColumn(name, new SqlValueType(SqlType.Boolean)); - } - - #endregion - - protected SqlValueType GetSqlValueType(string typname, int typmod) - { - DataTypeInfo typeInfo = Driver.ServerInfo.DataTypes[typname]; - // Unlike MS SQL extractor we do not set precision/scale/length for unknown type, - // 'cause we don't know how to treat typmod - if (typeInfo==null) - return new SqlValueType(typname); - - if (typeInfo.Type==SqlType.Decimal) { - if (typmod==-1) - // in this case we cannot determine the actual precision and scale - // it should be avoided - return new SqlValueType(typeInfo.Type); - int precision; - int scale; - GetPrecisionAndScale(typmod, out precision, out scale); - return new SqlValueType(typeInfo.Type, precision, scale); - } - /* - if (typeInfo.Type==SqlType.DateTimeOffset) - return new SqlValueType(typeInfo.Type); - */ - return typmod!=-1 - ? new SqlValueType(typeInfo.Type, typmod - 4) - : new SqlValueType(typeInfo.Type); - } - - protected void GetPrecisionAndScale(int typmod, out int precision, out int scale) - { - //high word - precision = ((typmod - 4) >> 16); - //low word - scale = ((typmod - 4) & 0xFFFF); - } - - protected ReferentialAction GetReferentialAction(char c) - { - switch (c) { - case 'c': - return ReferentialAction.Cascade; - case 'n': - return ReferentialAction.SetNull; - case 'd': - return ReferentialAction.SetDefault; - case 'r': - return ReferentialAction.Restrict; - default: - return ReferentialAction.NoAction; //a - } - } - - protected SqlMatchType GetMatchType(char c) - { - switch (c) { - case 'f': - return SqlMatchType.Full; //f - default: - return SqlMatchType.None; //u - } - } - - protected SqlRow CreateOidRow(IEnumerable oids) - { - var result = SqlDml.Row(); - foreach (var oid in oids) - result.Add(oid); - // make sure it is not empty, so that "IN" expression always works - // add an invalid OID value - if (result.Count==0) - result.Add(-1000); - return result; - } - - private int[] ReadIntArray(object value) - { - var shortArray = value as short[]; - if (shortArray!=null) { - var result = new int[shortArray.Length]; - for (int i = 0; i < shortArray.Length; i++) - result[i] = shortArray[i]; - return result; - } - var intArray = value as int[]; - if (intArray!=null) - return intArray; - throw new InvalidOperationException(); - } - - /// - /// Gets and caches the inner identifier of the current database user. - /// - private long GetMyUserSysId(long mUserSysId) - { - if (mUserSysId < 0) - using (var cmd = Connection.CreateCommand("SELECT usesysid FROM pg_user WHERE usename = user")) - return Convert.ToInt64(cmd.ExecuteScalar()); - return mUserSysId; - } - - // Constructor - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; +using Xtensive.Sql.Dml; +using System.Linq; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class Extractor : Model.Extractor + { + protected sealed class ExtractionContext + { + /// + /// Specific schemas to extract + /// + public readonly Dictionary TargetSchemes = new Dictionary(); + + /// + /// Extracted users. + /// + public readonly Dictionary UserLookup = new Dictionary(); + + /// + /// Catalog to extract information. + /// + public readonly Catalog Catalog; + + /// + /// Extracted schemas. + /// + public readonly Dictionary SchemaMap = new Dictionary(); + + /// + /// Extracted schemas identifiers. + /// + public readonly Dictionary ReversedSchemaMap = new Dictionary(); + + /// + /// Extracted tables. + /// + public readonly Dictionary TableMap = new Dictionary(); + + /// + /// Extracted views. + /// + public readonly Dictionary ViewMap = new Dictionary(); + + /// + /// Extracted sequences. + /// + public readonly Dictionary SequenceMap = new Dictionary(); + + /// + /// Extracted index expressions. + /// + public readonly Dictionary ExpressionIndexMap = new Dictionary(); + + /// + /// Extracted domains. + /// + public readonly Dictionary DomainMap = new Dictionary(); + + /// + /// Extracted columns connected grouped by owner (table or view) + /// + public readonly Dictionary> TableColumnMap = new Dictionary>(); + + public long CurrentUserSysId { get; set; } = -1; + public long? CurrentUserIdentifier { get; set; } + + public ExtractionContext(Catalog catalog) + { + Catalog = catalog; + } + } + + protected class ExpressionIndexInfo + { + public Index Index { get; set; } + public short[] Columns { get; set; } + + public ExpressionIndexInfo(Index index, short[] columns) + { + Index = index; + Columns = columns; + } + } + + private static ThreadSafeDictionary pgCatalogs = ThreadSafeDictionary.Create(new object()); + + protected long PgClassOid { get; private set; } + protected Schema PgCatalogSchema { get; private set; } + + #region Table reference creator properties + + /// + /// Reference to system table pg_user. + /// + protected SqlTableRef PgUser => SqlDml.TableRef(PgCatalogSchema.Tables["pg_user"]); + + /// + /// Reference to system table pg_tablespace. + /// + protected SqlTableRef PgTablespace => SqlDml.TableRef(PgCatalogSchema.Tables["pg_tablespace"]); + + /// + /// Reference to system table pg_namespace. + /// + protected SqlTableRef PgNamespace => SqlDml.TableRef(PgCatalogSchema.Tables["pg_namespace"]); + + /// + /// Reference to system table pg_class. + /// + protected SqlTableRef PgClass => SqlDml.TableRef(PgCatalogSchema.Tables["pg_class"]); + + /// + /// Reference to system table pg_index. + /// + protected SqlTableRef PgIndex => SqlDml.TableRef(PgCatalogSchema.Tables["pg_index"]); + + /// + /// Reference to system table pg_attribute. + /// + protected SqlTableRef PgAttribute => SqlDml.TableRef(PgCatalogSchema.Tables["pg_attribute"]); + + /// + /// Reference to system table pg_attrdef. + /// + protected SqlTableRef PgAttrDef => SqlDml.TableRef(PgCatalogSchema.Tables["pg_attrdef"]); + + /// + /// Reference to system table pg_views. + /// + protected SqlTableRef PgViews => SqlDml.TableRef(PgCatalogSchema.Tables["pg_views"]); + + /// + /// Reference to system table pg_constraint. + /// + protected SqlTableRef PgConstraint => SqlDml.TableRef(PgCatalogSchema.Tables["pg_constraint"]); + + /// + /// Reference to system table pg_type. + /// + protected SqlTableRef PgType => SqlDml.TableRef(PgCatalogSchema.Tables["pg_type"]); + + /// + /// Reference to system table pg_depend. + /// + protected SqlTableRef PgDepend => SqlDml.TableRef(PgCatalogSchema.Tables["pg_depend"]); + + #endregion + + #region Initialization + + protected override void Initialize() + { + PgCatalogSchema = pgCatalogs.GetValue(GetType(), CreatePgCatalogSchema); + + // Query OID of some system catalog tables for using them in pg_depend lookups + + SqlTableRef rel = PgClass; + SqlSelect q = SqlDml.Select(rel); + q.Where = SqlDml.In(rel["relname"], SqlDml.Row("pg_class")); + q.Columns.Add(rel["oid"]); + q.Columns.Add(rel["relname"]); + + using (var cmd = Connection.CreateCommand(q)) + using (var dr = cmd.ExecuteReader()) + while (dr.Read()) { + long oid = Convert.ToInt64(dr[0]); + string name = dr.GetString(1); + if (name=="pg_class") + PgClassOid = oid; + } + } + + private Schema CreatePgCatalogSchema(Type dummy) + { + var pgCatalog = new Catalog("info_catalog"); + var pgSchema = pgCatalog.CreateSchema("pg_catalog"); + BuildPgCatalogSchema(pgSchema); + return pgSchema; + } + + protected virtual void BuildPgCatalogSchema(Schema schema) + { + Table t; + t = schema.CreateTable("pg_user"); + CreateTextColumn(t, "usename"); + CreateInt4Column(t, "usesysid"); + + t = schema.CreateTable("pg_tablespace"); + CreateOidColumn(t); + CreateTextColumn(t, "spcname"); + CreateInt4Column(t, "spcowner"); + + t = schema.CreateTable("pg_namespace"); + CreateOidColumn(t); + CreateTextColumn(t, "nspname"); + CreateInt4Column(t, "nspowner"); + + t = schema.CreateTable("pg_class"); + CreateOidColumn(t); + CreateTextColumn(t, "relname"); + CreateInt4Column(t, "relnamespace"); + CreateInt4Column(t, "relowner"); + CreateInt4Column(t, "reltablespace"); + CreateChar1Column(t, "relkind"); + + t = schema.CreateTable("pg_index"); + CreateOidColumn(t); + CreateInt4Column(t, "indexrelid"); + CreateInt4Column(t, "indrelid"); + CreateBoolColumn(t, "indisunique"); + CreateBoolColumn(t, "indisprimary"); + CreateBoolColumn(t, "indisclustered"); + CreateTextColumn(t, "indkey"); + CreateTextColumn(t, "indoption"); + CreateTextColumn(t, "indexprs"); + CreateTextColumn(t, "indpred"); + CreateInt2Column(t, "indnatts"); + + t = schema.CreateTable("pg_attribute"); + CreateOidColumn(t); + CreateInt4Column(t, "attrelid"); + CreateTextColumn(t, "attname"); + CreateInt4Column(t, "atttypid"); + CreateInt2Column(t, "attlen"); + CreateInt2Column(t, "attnum"); + CreateInt4Column(t, "atttypmod"); + CreateBoolColumn(t, "attnotnull"); + CreateBoolColumn(t, "atthasdef"); + CreateBoolColumn(t, "attisdropped"); + + t = schema.CreateTable("pg_attrdef"); + CreateOidColumn(t); + CreateInt4Column(t, "adrelid"); + CreateInt2Column(t, "adnum"); + CreateTextColumn(t, "adsrc"); + + t = schema.CreateTable("pg_constraint"); + CreateOidColumn(t); + CreateTextColumn(t, "conname"); + CreateInt4Column(t, "connamespace"); + CreateChar1Column(t, "contype"); + CreateBoolColumn(t, "condeferrable"); + CreateBoolColumn(t, "condeferred"); + CreateInt4Column(t, "conrelid"); + CreateInt4Column(t, "contypid"); + CreateInt4Column(t, "confrelid"); + CreateChar1Column(t, "confupdtype"); + CreateChar1Column(t, "confdeltype"); + CreateChar1Column(t, "confmatchtype"); + CreateTextColumn(t, "conkey"); + CreateTextColumn(t, "confkey"); + CreateTextColumn(t, "consrc"); + + t = schema.CreateTable("pg_type"); + CreateOidColumn(t); + CreateTextColumn(t, "typname"); + CreateInt4Column(t, "typbasetype"); + CreateInt4Column(t, "typnamespace"); + CreateInt4Column(t, "typowner"); + CreateChar1Column(t, "typtype"); + CreateBoolColumn(t, "typnotnull"); + CreateInt2Column(t, "typlen"); + CreateInt4Column(t, "typtypmod"); + CreateTextColumn(t, "typdefault"); + CreateBoolColumn(t, "typisdefined"); + + t = schema.CreateTable("pg_depend"); + CreateInt4Column(t, "classid"); + CreateInt4Column(t, "objid"); + CreateInt4Column(t, "objsubid"); + CreateInt4Column(t, "refclassid"); + CreateInt4Column(t, "refobjid"); + CreateInt4Column(t, "refobjsubid"); + CreateChar1Column(t, "deptype"); + } + + #endregion + + public override Catalog ExtractCatalog(string catalogName) + { + var catalog = new Catalog(catalogName); + var context = new ExtractionContext(catalog); + ExtractUsers(context); + ExtractSchemas(context); + return catalog; + } + + public override Schema ExtractSchema(string catalogName, string schemaName) + { + var catalog = new Catalog(catalogName); + var context = new ExtractionContext(catalog); + context.TargetSchemes.Add(schemaName, catalog.CreateSchema(schemaName)); + ExtractUsers(context); + ExtractSchemas(context); + var result = context.TargetSchemes[schemaName]; + return result; + } + + public override Catalog ExtractSchemes(string catalogName, string[] schemaNames) + { + var catalog = new Catalog(catalogName); + var context = new ExtractionContext(catalog); + foreach (var schemaName in schemaNames) + context.TargetSchemes.Add(schemaName, catalog.CreateSchema(schemaName)); + ExtractUsers(context); + ExtractSchemas(context); + return catalog; + } + + /// + /// Extracts users and puts them to and sets current user identifier + /// + /// + protected void ExtractUsers(ExtractionContext context) + { + context.UserLookup.Clear(); + string me; + using (var command = Connection.CreateCommand("SELECT user")) + me = (string) command.ExecuteScalar(); + + using (DbCommand cmd = Connection.CreateCommand("SELECT usename, usesysid FROM pg_user")) + using (DbDataReader dr = cmd.ExecuteReader()) { + while (dr.Read()) { + string name = dr[0].ToString(); + long sysid = Convert.ToInt64(dr[1]); + context.UserLookup.Add(sysid, name); + if (name==me) + context.CurrentUserSysId = sysid; + } + } + } + + /// + /// Extracts complete information about schemas. + /// + /// The context. + protected void ExtractSchemas(ExtractionContext context) + { + context.CurrentUserIdentifier = GetMyUserSysId(context.CurrentUserSysId); + + //Extraction of public schemas and schemas which is owned by current user + ExtractSchemasInfo(context); + + //Extraction of tables, views and sequences + ExtractSchemaContents(context); + + //Extraction of columns of table and view + ExtractTableAndViewColumns(context); + + //Extraction of table indexes + ExtractTableIndexes(context); + + //Extraction of domains + ExtractDomains(context); + + //Extraction of table and domain constraints + ExtractTableAndDomainConstraints(context); + + //sequence infos + ExtractSequenses(context); + } + + /// + /// Extracts general information about existing schemas, nothing else. + /// + /// The context. + protected virtual void ExtractSchemasInfo(ExtractionContext context) + { + var namespaceTable1 = PgNamespace; + var namespaceTable2 = PgNamespace; + var selectPublic = SqlDml.Select(namespaceTable1); + selectPublic.Where = namespaceTable1["nspname"]=="public" + && namespaceTable1["nspowner"] != context.CurrentUserIdentifier; + selectPublic.Columns.Add(namespaceTable1["nspname"]); + selectPublic.Columns.Add(namespaceTable1["oid"]); + selectPublic.Columns.Add(namespaceTable1["nspowner"]); + + var selectMine = SqlDml.Select(namespaceTable2); + selectMine.Where = namespaceTable2["nspowner"]==context.CurrentUserIdentifier; + selectMine.Columns.Add(namespaceTable2["nspname"]); + selectMine.Columns.Add(namespaceTable2["oid"]); + selectMine.Columns.Add(namespaceTable2["nspowner"]); + + var union = selectPublic.UnionAll(selectMine); + var catalog = context.Catalog; + + using (var command = Connection.CreateCommand(union)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var oid = Convert.ToInt64(dataReader["oid"]); + var name = dataReader["nspname"].ToString(); + var owner = Convert.ToInt64(dataReader["nspowner"]); + + var schema = catalog.Schemas[name] ?? catalog.CreateSchema(name); + if (name=="public") + catalog.DefaultSchema = schema; + schema.Owner = context.UserLookup[owner]; + context.SchemaMap[oid] = schema; + context.ReversedSchemaMap[schema] = oid; + } + } + } + + /// + /// Extracts general information schemas' content like tables, view, sequences and puts it to the context. + /// + /// The context. + protected virtual void ExtractSchemaContents(ExtractionContext context) + { + var catalog = context.Catalog; + var targetSchemes = context.TargetSchemes; + + if (context.SchemaMap.Count > 0) { + var relationsTable = PgClass; + var tablespacesTable = PgTablespace; + + var join = relationsTable.LeftOuterJoin(tablespacesTable, tablespacesTable["oid"]==relationsTable["reltablespace"]); + var select = SqlDml.Select(join); + select.Where = relationsTable["relowner"]==context.CurrentUserIdentifier + && SqlDml.In(relationsTable["relkind"], SqlDml.Row('r', 'v', 'S')); + + if (targetSchemes!=null && targetSchemes.Count > 0) { + var schemesIndexes = catalog.Schemas.Where(sch => targetSchemes.ContainsKey(sch.Name)).Select(sch => context.ReversedSchemaMap[sch]); + select.Where &= SqlDml.In(relationsTable["relnamespace"], CreateOidRow(schemesIndexes)); + } + select.Columns.Add(relationsTable["oid"], "reloid"); + select.Columns.Add(relationsTable["relname"]); + select.Columns.Add(relationsTable["relkind"]); + select.Columns.Add(relationsTable["relnamespace"]); + select.Columns.Add(tablespacesTable["spcname"]); + select.Columns.Add(new Func(() => { + SqlCase defCase = SqlDml.Case(relationsTable["relkind"]); + defCase.Add('v', SqlDml.FunctionCall("pg_get_viewdef", relationsTable["oid"])); + return defCase; + })(), "definition"); + + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var relationOid = Convert.ToInt64(dataReader["reloid"]); + var relationKind = dataReader["relkind"].ToString(); + var relationName = dataReader["relname"].ToString(); + var relationNamespace = Convert.ToInt64(dataReader["relnamespace"]); + + Schema schema; + if (!context.SchemaMap.TryGetValue(relationNamespace, out schema)) + continue; + Debug.Assert(schema!=null); + if (relationKind=="r") { + var table = schema.CreateTable(relationName); + var tableSpaceName = dataReader["spcname"]; + if (tableSpaceName != DBNull.Value && tableSpaceName != null) + table.Filegroup = Convert.ToString(tableSpaceName); + context.TableMap.Add(relationOid, table); + } + else if (relationKind=="v") { + var definition = dataReader["definition"].ToString(); + var view = schema.CreateView(relationName, SqlDml.Native(definition), CheckOptions.None); + context.ViewMap.Add(relationOid, view); + } + else if (relationKind=="S") { + var sequence = schema.CreateSequence(relationName); + context.SequenceMap.Add(relationOid, sequence); + } + } + } + } + } + + /// + /// Extracts information about columns for items listed in and and fills . + /// + /// The context + protected virtual void ExtractTableAndViewColumns(ExtractionContext context) + { + var tableMap = context.TableMap; + var viewMap = context.ViewMap; + var tableColumns = context.TableColumnMap; + + if (tableMap.Count > 0 || viewMap.Count > 0) { + var columnsTable = PgAttribute; + var dafaultValuesTable = PgAttrDef; + var typesTable = PgType; + + var select = SqlDml.Select(columnsTable + .LeftOuterJoin(dafaultValuesTable, columnsTable["attrelid"]==dafaultValuesTable["adrelid"] && columnsTable["attnum"]==dafaultValuesTable["adnum"]) + .InnerJoin(typesTable, typesTable["oid"]==columnsTable["atttypid"])); + + select.Where = columnsTable["attisdropped"]==false && + columnsTable["attnum"] > 0 && + (SqlDml.In(columnsTable["attrelid"], CreateOidRow(tableMap.Keys)) || + SqlDml.In(columnsTable["attrelid"], CreateOidRow(viewMap.Keys))); + + select.Columns.Add(columnsTable["attrelid"]); + select.Columns.Add(columnsTable["attnum"]); + select.Columns.Add(columnsTable["attname"]); + select.Columns.Add(typesTable["typname"]); + select.Columns.Add(columnsTable["atttypmod"]); + select.Columns.Add(columnsTable["attnotnull"]); + select.Columns.Add(columnsTable["atthasdef"]); + select.Columns.Add(dafaultValuesTable["adsrc"]); + select.OrderBy.Add(columnsTable["attrelid"]); + select.OrderBy.Add(columnsTable["attnum"]); + + using (var command = Connection.CreateCommand(select)) + using (DbDataReader dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var columnOwnerId = Convert.ToInt64(dataReader["attrelid"]); + var columnId = Convert.ToInt64(dataReader["attnum"]); + var columnName = dataReader["attname"].ToString(); + if (tableMap.ContainsKey(columnOwnerId)) { + var table = tableMap[columnOwnerId]; + Debug.Assert(table != null); + TableColumn col = table.CreateColumn(columnName); + if (!tableColumns.ContainsKey(columnOwnerId)) + tableColumns.Add(columnOwnerId, new Dictionary()); + tableColumns[columnOwnerId].Add(columnId, col); + + var columnTypeName = dataReader["typname"].ToString(); + var columnTypeSpecificData = Convert.ToInt32(dataReader["atttypmod"]); + var notNullFlag = dataReader.GetBoolean(dataReader.GetOrdinal("attnotnull")); + var defaultValueFlag = dataReader.GetBoolean(dataReader.GetOrdinal("atthasdef")); + if (defaultValueFlag) { + var defaultValue = dataReader["adsrc"].ToString(); + col.DefaultValue = SqlDml.Native(defaultValue); + } + col.IsNullable = !notNullFlag; + col.DataType = GetSqlValueType(columnTypeName, columnTypeSpecificData); + } + else { + var view = viewMap[columnOwnerId]; + Debug.Assert(view != null); + view.CreateColumn(columnName); + } + } + } + } + } + + /// + /// Extracts information about indexes for the tables listed in . + /// + /// The context + protected virtual void ExtractTableIndexes(ExtractionContext context) + { + var tableMap = context.TableMap; + var tableColumns = context.TableColumnMap; + + if (tableMap.Count > 0) { + var tableSpacesTable = PgTablespace; + var relationsTable = PgClass; + var indexTable = PgIndex; + var dependencyTable = PgDepend; + + //subselect that index was not created automatically + var subSelect = SqlDml.Select(dependencyTable); + subSelect.Where = dependencyTable["classid"]==PgClassOid && + dependencyTable["objid"]==indexTable["indexrelid"] && + dependencyTable["deptype"]=='i'; + subSelect.Columns.Add(dependencyTable[0]); + + //not automatically created indexes of our tables + var select = SqlDml.Select(indexTable + .InnerJoin(relationsTable, relationsTable["oid"]==indexTable["indexrelid"]) + .LeftOuterJoin(tableSpacesTable, tableSpacesTable["oid"]==relationsTable["reltablespace"])); + select.Where = SqlDml.In(indexTable["indrelid"], CreateOidRow(tableMap.Keys)) && !SqlDml.Exists(subSelect); + select.Columns.Add(indexTable["indrelid"]); + select.Columns.Add(indexTable["indexrelid"]); + select.Columns.Add(relationsTable["relname"]); + select.Columns.Add(indexTable["indisunique"]); + select.Columns.Add(indexTable["indisclustered"]); + select.Columns.Add(indexTable["indkey"]); + select.Columns.Add(tableSpacesTable["spcname"]); + select.Columns.Add(indexTable["indnatts"]); + select.Columns.Add(indexTable["indexprs"]); + select.Columns.Add(indexTable["indpred"]); + select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"]), "inddef"); + AddSpecialIndexQueryColumns(select, tableSpacesTable, relationsTable, indexTable, dependencyTable); + + int maxColumnNumber = 0; + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var tableIdentifier = Convert.ToInt64(dataReader["indrelid"]); + var indexIdentifier = Convert.ToInt64(dataReader["indexrelid"]); + var indexName = dataReader["relname"].ToString(); + var isUnique = dataReader.GetBoolean(dataReader.GetOrdinal("indisunique")); + var isClustered = dataReader.GetBoolean(dataReader.GetOrdinal("indisclustered")); + var indexKey = (short[])dataReader["indkey"]; + + var tablespaceName = (dataReader["spcname"]!=DBNull.Value) ? dataReader["spcname"].ToString() : (string)null; + var filterExpression = (dataReader["indpred"]!=DBNull.Value) ? dataReader["indpred"].ToString() : string.Empty; + + var table = tableMap[tableIdentifier]; + + var fullTextRegex = @"(?<=CREATE INDEX \S+ ON \S+ USING (?:gist|gin)(?:\s|\S)*)to_tsvector\('(\w+)'::regconfig, \(*(?:(?:\s|\)|\(|\|)*(?:\(""(\S+)""\)|'\s')::text)+\)"; + var indexScript = dataReader["inddef"].ToString(); + var matches = Regex.Matches(indexScript, fullTextRegex, RegexOptions.Compiled); + if (matches.Count > 0) { + // Fulltext index + var fullTextIndex = table.CreateFullTextIndex(indexName); + foreach (Match match in matches) { + var columnConfigurationName = match.Groups[1].Value; + foreach (Capture capture in match.Groups[2].Captures) { + var columnName = capture.Value; + var fullTextColumn = fullTextIndex.Columns[columnName] ?? fullTextIndex.CreateIndexColumn(table.Columns.Single(column => column.Name == columnName)); + if (fullTextColumn.Languages[columnConfigurationName]==null) + fullTextColumn.Languages.Add(new Language(columnConfigurationName)); + } + } + } + else { + //Regular index + var index = table.CreateIndex(indexName); + index.IsBitmap = false; + index.IsUnique = isUnique; + index.Filegroup = tablespaceName; + if (!string.IsNullOrEmpty(filterExpression)) + index.Where = SqlDml.Native(filterExpression); + + // Expression-based index + var some = dataReader["indexprs"]; + if (some!=DBNull.Value) { + context.ExpressionIndexMap[indexIdentifier] = new ExpressionIndexInfo(index, indexKey); + int columnNumber = dataReader.GetInt16(dataReader.GetOrdinal("indnatts")); + if (columnNumber > maxColumnNumber) + maxColumnNumber = columnNumber; + } + else { + for (int j = 0; j < indexKey.Length; j++) { + int colIndex = indexKey[j]; + if (colIndex > 0) + index.CreateIndexColumn(tableColumns[tableIdentifier][colIndex], true); + else{ + int z = 7; + //column index is 0 + //this means that this index column is an expression + //which is not possible with SqlDom tables + } + } + } + ReadSpecialIndexProperties(dataReader, index); + } + } + } + + var expressionIndexMap = context.ExpressionIndexMap; + + if (expressionIndexMap.Count > 0) { + select = SqlDml.Select(indexTable); + select.Columns.Add(indexTable["indrelid"]); + select.Columns.Add(indexTable["indexrelid"]); + + for (int i = 1; i <= maxColumnNumber; i++) + select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"], i, true), i.ToString()); + select.Where = SqlDml.In(indexTable["indexrelid"], SqlDml.Array(expressionIndexMap.Keys.ToArray())); + + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var exprIndexInfo = expressionIndexMap[Convert.ToInt64(dataReader[1])]; + for (int j = 0; j < exprIndexInfo.Columns.Length; j++) { + int colIndex = exprIndexInfo.Columns[j]; + if (colIndex > 0) + exprIndexInfo.Index.CreateIndexColumn(tableColumns[Convert.ToInt64(dataReader[0])][colIndex], true); + else + exprIndexInfo.Index.CreateIndexColumn(SqlDml.Native(dataReader[(j + 1).ToString()].ToString())); + } + } + } + } + } + } + + /// + /// Extracts information about domains for the schemas listed in and fills + /// + /// The context. + protected virtual void ExtractDomains(ExtractionContext context) + { + var schemaIndex = context.SchemaMap; + var domains = context.DomainMap; + + if (schemaIndex.Count > 0) { + var typeTable = PgType; + var baseTypeTable = PgType; + var select = SqlDml.Select(typeTable.InnerJoin(baseTypeTable, baseTypeTable["oid"]==typeTable["typbasetype"])); + select.Where = typeTable["typisdefined"]==true && + typeTable["typtype"]=='d' && + SqlDml.In(typeTable["typnamespace"], CreateOidRow(schemaIndex.Keys)) && + typeTable["typowner"]==context.CurrentUserIdentifier; + select.Columns.Add(typeTable["oid"]); + select.Columns.Add(typeTable["typname"], "typname"); + select.Columns.Add(typeTable["typnamespace"], "typnamespace"); + select.Columns.Add(typeTable["typtypmod"], "typmod"); + select.Columns.Add(typeTable["typdefault"], "default"); + select.Columns.Add(baseTypeTable["typname"], "basetypname"); + + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var typeId = Convert.ToInt64(dataReader["oid"]); + var typeNamespace = Convert.ToInt64(dataReader["typnamespace"]); + var typeName = dataReader["typname"].ToString(); + var baseTypeName = dataReader["basetypname"].ToString(); + int typmod = Convert.ToInt32(dataReader["typmod"]); + var defaultValue = (dataReader["default"]!=DBNull.Value) ? dataReader["default"].ToString() : (string)null; + + Schema schema; + if (!schemaIndex.TryGetValue(typeNamespace, out schema)) + continue; + var domain = schema.CreateDomain(typeName, GetSqlValueType(baseTypeName, typmod)); + domain.DefaultValue = (defaultValue==null) ? (SqlExpression)SqlDml.Null : (SqlExpression)SqlDml.Native(defaultValue); + domains.Add(typeId, domain); + } + } + } + } + + /// + /// Extracts table and domain constraints for items listed in and . + /// + /// The context. + protected virtual void ExtractTableAndDomainConstraints(ExtractionContext context) + { + var tableMap = context.TableMap; + var domainMap = context.DomainMap; + var tableColumns = context.TableColumnMap; + + if (tableMap.Count > 0 || domainMap.Count > 0) { + var constraintTable = PgConstraint; + var select = SqlDml.Select(constraintTable); + select.Where = SqlDml.In(constraintTable["conrelid"], CreateOidRow(tableMap.Keys)) || + SqlDml.In(constraintTable["contypid"], CreateOidRow(domainMap.Keys)); + + select.Columns.AddRange(constraintTable["conname"], + constraintTable["contype"], + constraintTable["condeferrable"], + constraintTable["condeferred"], + constraintTable["conrelid"], + constraintTable["contypid"], + constraintTable["conkey"], + constraintTable["consrc"], + constraintTable["confrelid"], + constraintTable["confkey"], + constraintTable["confupdtype"], + constraintTable["confdeltype"], + constraintTable["confmatchtype"]); + + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var constraintType = dataReader["contype"].ToString()[0]; + var constraintName = dataReader["conname"].ToString(); + var isDeferrable = dataReader.GetBoolean(dataReader.GetOrdinal("condeferrable")); + var isDeferred = dataReader.GetBoolean(dataReader.GetOrdinal("condeferred")); + var tableId = Convert.ToInt64(dataReader["conrelid"]); + var domainId = Convert.ToInt64(dataReader["contypid"]); + object constraintKeyColumns = dataReader["conkey"]; + + if (tableId!=0) { + //table constraint + var table = tableMap[tableId]; + if (constraintType=='c') { + //[c]heck + var consrc = dataReader["consrc"].ToString(); + var constraint = table.CreateCheckConstraint(constraintName, SqlDml.Native(consrc)); + constraint.IsDeferrable = isDeferrable; + constraint.IsInitiallyDeferred = isDeferred; + } + else { + var columnsOfTable = tableColumns[tableId]; + if (constraintType=='u' || constraintType=='p') { + //[u]nique or [p]rimary key + UniqueConstraint constraint = (constraintType=='u') + ? table.CreateUniqueConstraint(constraintName) + : table.CreatePrimaryKey(constraintName); + + constraint.IsDeferrable = isDeferrable; + constraint.IsInitiallyDeferred = isDeferred; + int[] colIndexes = ReadIntArray(constraintKeyColumns); + for (int i = 0; i < colIndexes.Length; i++) + constraint.Columns.Add(columnsOfTable[colIndexes[i]]); + } + else if (constraintType=='f') { + //[f]oreign key + object confkey = dataReader["confkey"]; + var referencedTableId = Convert.ToInt64(dataReader["confrelid"]); + var updateAction = dataReader["confupdtype"].ToString()[0]; + var deleteAction = dataReader["confdeltype"].ToString()[0]; + var matchType = dataReader["confmatchtype"].ToString()[0]; + + var foreignKey = table.CreateForeignKey(constraintName); + foreignKey.IsDeferrable = isDeferrable; + foreignKey.IsInitiallyDeferred = isDeferred; + foreignKey.OnDelete = GetReferentialAction(deleteAction); + foreignKey.OnUpdate = GetReferentialAction(updateAction); + foreignKey.MatchType = GetMatchType(matchType); + foreignKey.ReferencedTable = tableMap[referencedTableId]; + + var fkeyColumns = tableColumns[referencedTableId]; + + int[] colIndexes = ReadIntArray(constraintKeyColumns); + for (int i = 0; i < colIndexes.Length; i++) + foreignKey.Columns.Add(columnsOfTable[colIndexes[i]]); + + colIndexes = ReadIntArray(confkey); + for (int i = 0; i < colIndexes.Length; i++) + foreignKey.ReferencedColumns.Add(fkeyColumns[colIndexes[i]]); + } + } + } + else if (domainId!=0) { + //domain constraint + if (constraintType=='c') { + //check + string consrc = dataReader["consrc"].ToString(); + var domain = domainMap[domainId]; + var constraint = domain.CreateConstraint(constraintName, SqlDml.Native(consrc)); + constraint.IsDeferrable = isDeferrable; + constraint.IsInitiallyDeferred = isDeferred; + } + } + } + } + } + } + + /// + /// Extracts sequences listed in . + /// + /// The context + protected virtual void ExtractSequenses(ExtractionContext context) + { + var sequenceMap = context.SequenceMap; + + if (sequenceMap.Count > 0) { + //Have to do it traditional string concat because cannot select from + //a sequence with Sql.Dom + var query = new StringBuilder(); { + Sequence[] seqArray = new Sequence[sequenceMap.Count]; + sequenceMap.Values.CopyTo(seqArray, 0); + Sequence seq = seqArray[0]; + query.AppendFormat("SELECT * FROM (\nSELECT {0} as id, * FROM {1}", 0, + Driver.Translator.Translate(null, seq)); // context is not used in PostrgreSQL translator + for (int i = 1; i < sequenceMap.Count; i++) + { + seq = seqArray[i]; + query.AppendFormat("\nUNION ALL\nSELECT {0} as id, * FROM {1}", i, + Driver.Translator.Translate(null, seq)); // context is not used in PostgreSQL translator + } + query.Append("\n) all_sequences\nORDER BY id"); + } + + using (DbCommand cmd = Connection.UnderlyingConnection.CreateCommand()) { + cmd.CommandText = query.ToString(); + using (DbDataReader dr = cmd.ExecuteReader()) { + foreach (Sequence seq in sequenceMap.Values) { + dr.Read(); + ReadSequenceDescriptor(dr, seq.SequenceDescriptor); + } + } + } + } + } + + protected virtual void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) + { + } + + protected virtual void ReadSpecialIndexProperties(DbDataReader dr, Index i) + { + } + + protected virtual void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) + { + descriptor.Increment = Convert.ToInt64(reader["increment_by"]); + descriptor.IsCyclic = Convert.ToBoolean(reader["is_cycled"]); + descriptor.MinValue = Convert.ToInt64(reader["min_value"]); + descriptor.MaxValue = Convert.ToInt64(reader["max_value"]); + descriptor.StartValue = Convert.ToInt64(reader["min_value"]); + } + + #region Column creation methods + + protected void CreateOidColumn(Table t) + { + t.CreateColumn("oid", new SqlValueType(SqlType.Int64)); + } + + protected void CreateInt2Column(Table t, string name) + { + t.CreateColumn(name, new SqlValueType(SqlType.Int16)); + } + + protected void CreateInt4Column(Table t, string name) + { + t.CreateColumn(name, new SqlValueType(SqlType.Int32)); + } + + protected void CreateChar1Column(Table t, string name) + { + t.CreateColumn(name, new SqlValueType(SqlType.Char, 1)); + } + + protected void CreateTextColumn(Table t, string name) + { + t.CreateColumn(name, new SqlValueType(SqlType.VarChar)); + } + + protected void CreateBoolColumn(Table t, string name) + { + t.CreateColumn(name, new SqlValueType(SqlType.Boolean)); + } + + #endregion + + protected SqlValueType GetSqlValueType(string typname, int typmod) + { + DataTypeInfo typeInfo = Driver.ServerInfo.DataTypes[typname]; + // Unlike MS SQL extractor we do not set precision/scale/length for unknown type, + // 'cause we don't know how to treat typmod + if (typeInfo==null) + return new SqlValueType(typname); + + if (typeInfo.Type==SqlType.Decimal) { + if (typmod==-1) + // in this case we cannot determine the actual precision and scale + // it should be avoided + return new SqlValueType(typeInfo.Type); + int precision; + int scale; + GetPrecisionAndScale(typmod, out precision, out scale); + return new SqlValueType(typeInfo.Type, precision, scale); + } + /* + if (typeInfo.Type==SqlType.DateTimeOffset) + return new SqlValueType(typeInfo.Type); + */ + return typmod!=-1 + ? new SqlValueType(typeInfo.Type, typmod - 4) + : new SqlValueType(typeInfo.Type); + } + + protected void GetPrecisionAndScale(int typmod, out int precision, out int scale) + { + //high word + precision = ((typmod - 4) >> 16); + //low word + scale = ((typmod - 4) & 0xFFFF); + } + + protected ReferentialAction GetReferentialAction(char c) + { + switch (c) { + case 'c': + return ReferentialAction.Cascade; + case 'n': + return ReferentialAction.SetNull; + case 'd': + return ReferentialAction.SetDefault; + case 'r': + return ReferentialAction.Restrict; + default: + return ReferentialAction.NoAction; //a + } + } + + protected SqlMatchType GetMatchType(char c) + { + switch (c) { + case 'f': + return SqlMatchType.Full; //f + default: + return SqlMatchType.None; //u + } + } + + protected SqlRow CreateOidRow(IEnumerable oids) + { + var result = SqlDml.Row(); + foreach (var oid in oids) + result.Add(oid); + // make sure it is not empty, so that "IN" expression always works + // add an invalid OID value + if (result.Count==0) + result.Add(-1000); + return result; + } + + private int[] ReadIntArray(object value) + { + var shortArray = value as short[]; + if (shortArray!=null) { + var result = new int[shortArray.Length]; + for (int i = 0; i < shortArray.Length; i++) + result[i] = shortArray[i]; + return result; + } + var intArray = value as int[]; + if (intArray!=null) + return intArray; + throw new InvalidOperationException(); + } + + /// + /// Gets and caches the inner identifier of the current database user. + /// + private long GetMyUserSysId(long mUserSysId) + { + if (mUserSysId < 0) + using (var cmd = Connection.CreateCommand("SELECT usesysid FROM pg_user WHERE usename = user")) + return Convert.ToInt64(cmd.ExecuteScalar()); + return mUserSysId; + } + + // Constructor + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/LSegMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/LSegMapper.cs index cca0543760..1dc7eec0c7 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/LSegMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/LSegMapper.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.10 - -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class LSegMapper : PostgreSqlTypeMapper - { - private static readonly string LSegTypeName = typeof (NpgsqlLSeg).AssemblyQualifiedName; - - // Constructors - - public LSegMapper() - : base(LSegTypeName, NpgsqlDbType.LSeg, CustomSqlType.LSeg) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.10 + +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class LSegMapper : PostgreSqlTypeMapper + { + private static readonly string LSegTypeName = typeof (NpgsqlLSeg).AssemblyQualifiedName; + + // Constructors + + public LSegMapper() + : base(LSegTypeName, NpgsqlDbType.LSeg, CustomSqlType.LSeg) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PathMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PathMapper.cs index a163131bd8..8efda00e7f 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PathMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PathMapper.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.10 - -using System; -using System.Data.Common; -using Npgsql; -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class PathMapper : PostgreSqlTypeMapper - { - private static readonly string PathTypeName = typeof (NpgsqlPath).AssemblyQualifiedName; - - public override void BindValue(DbParameter parameter, object value) - { - if (value==null) { - parameter.Value = DBNull.Value; - return; - } - - var npgsqlParameter = (NpgsqlParameter) parameter; - - npgsqlParameter.Value = value; - npgsqlParameter.NpgsqlDbType = NpgsqlDbType.Path; - - // The method Equals(Object, Object), wrapped in a block 'try', - // is required in order to determine that the value NpgsqlPath has been initialized with no parameters. - try { - value.Equals(value); - } - catch (Exception) { - // If the value NpgsqlPath has been initialized with no parameters, then must set the initial value. - npgsqlParameter.Value = new NpgsqlPath(new[] {new NpgsqlPoint()}); - } - } - - // Constructors - - public PathMapper() - : base(PathTypeName, NpgsqlDbType.Path, CustomSqlType.Path) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.10 + +using System; +using System.Data.Common; +using Npgsql; +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class PathMapper : PostgreSqlTypeMapper + { + private static readonly string PathTypeName = typeof (NpgsqlPath).AssemblyQualifiedName; + + public override void BindValue(DbParameter parameter, object value) + { + if (value==null) { + parameter.Value = DBNull.Value; + return; + } + + var npgsqlParameter = (NpgsqlParameter) parameter; + + npgsqlParameter.Value = value; + npgsqlParameter.NpgsqlDbType = NpgsqlDbType.Path; + + // The method Equals(Object, Object), wrapped in a block 'try', + // is required in order to determine that the value NpgsqlPath has been initialized with no parameters. + try { + value.Equals(value); + } + catch (Exception) { + // If the value NpgsqlPath has been initialized with no parameters, then must set the initial value. + npgsqlParameter.Value = new NpgsqlPath(new[] {new NpgsqlPoint()}); + } + } + + // Constructors + + public PathMapper() + : base(PathTypeName, NpgsqlDbType.Path, CustomSqlType.Path) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PointMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PointMapper.cs index 64a301ba86..54072c7f77 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PointMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PointMapper.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.09 - -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class PointMapper : PostgreSqlTypeMapper - { - private static readonly string PointTypeName = typeof (NpgsqlPoint).AssemblyQualifiedName; - - // Constructors - - public PointMapper() - : base(PointTypeName, NpgsqlDbType.Point, CustomSqlType.Point) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.09 + +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class PointMapper : PostgreSqlTypeMapper + { + private static readonly string PointTypeName = typeof (NpgsqlPoint).AssemblyQualifiedName; + + // Constructors + + public PointMapper() + : base(PointTypeName, NpgsqlDbType.Point, CustomSqlType.Point) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PolygonMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PolygonMapper.cs index eb2f9d05d5..dd1bfaf7b5 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PolygonMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/PolygonMapper.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.04.10 - -using System; -using System.Data.Common; -using Npgsql; -using NpgsqlTypes; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal sealed class PolygonMapper : PostgreSqlTypeMapper - { - private static readonly string PolygonTypeName = typeof (NpgsqlPolygon).AssemblyQualifiedName; - - public override void BindValue(DbParameter parameter, object value) - { - if (value==null) { - parameter.Value = DBNull.Value; - return; - } - - var npgsqlParameter = (NpgsqlParameter) parameter; - npgsqlParameter.Value = value; - npgsqlParameter.NpgsqlDbType = NpgsqlDbType.Polygon; - - // The method Equals(Object, Object), wrapped in a block 'try', - // is required in order to determine that the value NpgsqlPolygon has been initialized with no parameters. - try { - value.Equals(value); - } - catch (Exception) { - // If the value NpgsqlPolygon has been initialized with no parameters, then must set the initial value. - npgsqlParameter.Value = new NpgsqlPolygon(new[] {new NpgsqlPoint()}); - } - } - - // Constructors - - public PolygonMapper() - : base(PolygonTypeName, NpgsqlDbType.Polygon, CustomSqlType.Polygon) - { - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.04.10 + +using System; +using System.Data.Common; +using Npgsql; +using NpgsqlTypes; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal sealed class PolygonMapper : PostgreSqlTypeMapper + { + private static readonly string PolygonTypeName = typeof (NpgsqlPolygon).AssemblyQualifiedName; + + public override void BindValue(DbParameter parameter, object value) + { + if (value==null) { + parameter.Value = DBNull.Value; + return; + } + + var npgsqlParameter = (NpgsqlParameter) parameter; + npgsqlParameter.Value = value; + npgsqlParameter.NpgsqlDbType = NpgsqlDbType.Polygon; + + // The method Equals(Object, Object), wrapped in a block 'try', + // is required in order to determine that the value NpgsqlPolygon has been initialized with no parameters. + try { + value.Equals(value); + } + catch (Exception) { + // If the value NpgsqlPolygon has been initialized with no parameters, then must set the initial value. + npgsqlParameter.Value = new NpgsqlPolygon(new[] {new NpgsqlPoint()}); + } + } + + // Constructors + + public PolygonMapper() + : base(PolygonTypeName, NpgsqlDbType.Polygon, CustomSqlType.Polygon) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/ServerInfoProvider.cs index ca1cd5674e..dd56a436e1 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/ServerInfoProvider.cs @@ -1,327 +1,327 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class ServerInfoProvider : Info.ServerInfoProvider - { - // These two options are actually compile-time configurable. - private const int MaxIdentifierLength = 63; - private const int MaxIndexKeys = 32; - - private const int MaxTextLength = (int.MaxValue >> 1) - 1000; - private const int MaxCharLength = 10485760; - - private readonly string defaultSchemaName; - private readonly string databaseName; - - protected virtual IndexFeatures GetIndexFeatures() - { - return IndexFeatures.Unique | IndexFeatures.Filtered | IndexFeatures.Expressions; - } - - protected virtual int GetMaxTextLength() - { - return MaxTextLength; - } - - protected virtual int GetMaxCharLength() - { - return MaxCharLength; - } - - public virtual short GetMaxDateTimePrecision() - { - return 6; - } - - - public override EntityInfo GetDatabaseInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override EntityInfo GetSchemaInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override TableInfo GetTableInfo() - { - var info = new TableInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - info.PartitionMethods = PartitionMethods.None; - return info; - } - - public override TemporaryTableInfo GetTemporaryTableInfo() - { - var info = new TemporaryTableInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.Features = TemporaryTableFeatures.Local - | TemporaryTableFeatures.DeleteRowsOnCommit - | TemporaryTableFeatures.PreserveRowsOnCommit; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override IndexInfo GetIndexInfo() - { - var info = new IndexInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.Features = GetIndexFeatures(); - info.MaxNumberOfColumns = MaxIndexKeys; - info.MaxIdentifierLength = MaxIdentifierLength; - // Pg 8.2: 8191 byte - info.MaxLength = 2000; - return info; - } - - public override ColumnInfo GetColumnInfo() - { - var info = new ColumnInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.Features = ColumnFeatures.None; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override CheckConstraintInfo GetCheckConstraintInfo() - { - var info = new CheckConstraintInfo(); - info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - info.MaxIdentifierLength = MaxIdentifierLength; - info.Features = CheckConstraintFeatures.None; - // TODO: more exactly - info.MaxExpressionLength = GetMaxTextLength(); - return info; - } - - public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() - { - var info = new PrimaryKeyConstraintInfo(); - info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override FullTextSearchInfo GetFullTextInfo() - { - return null; - } - - public override UniqueConstraintInfo GetUniqueConstraintInfo() - { - var info = new UniqueConstraintInfo(); - info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - info.Features = UniqueConstraintFeatures.Nullable; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() - { - var info = new ForeignKeyConstraintInfo(); - info.Actions = - ForeignKeyConstraintActions.Cascade | - ForeignKeyConstraintActions.NoAction | - ForeignKeyConstraintActions.Restrict | - ForeignKeyConstraintActions.SetDefault | - ForeignKeyConstraintActions.SetNull; - info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - info.Features = ForeignKeyConstraintFeatures.Deferrable; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override EntityInfo GetViewInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - - public override DataTypeCollection GetDataTypesInfo() - { - var commonFeatures = - DataTypeFeatures.Clustering | - DataTypeFeatures.Grouping | - DataTypeFeatures.Indexing | - DataTypeFeatures.KeyConstraint | - DataTypeFeatures.Nullable | - DataTypeFeatures.Ordering | - DataTypeFeatures.Multiple | - DataTypeFeatures.Default; - - var dtc = new DataTypeCollection(); - - dtc.Boolean = DataTypeInfo.Range(SqlType.Boolean, commonFeatures, - ValueRange.Bool, "boolean", "bool"); - - dtc.Int16 = DataTypeInfo.Range(SqlType.Int16, commonFeatures, - ValueRange.Int16, - "smallint", "int2"); - - dtc.Int32 = DataTypeInfo.Range(SqlType.Int32, commonFeatures, - ValueRange.Int32, "integer", "int4"); - - dtc.Int64 = DataTypeInfo.Range(SqlType.Int64, commonFeatures, - ValueRange.Int64, "bigint", "int8"); - - dtc.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, commonFeatures, - ValueRange.Decimal, 49, "numeric", "decimal"); - - dtc.Float = DataTypeInfo.Range(SqlType.Float, commonFeatures, - ValueRange.Float, "real", "float4"); - - dtc.Double = DataTypeInfo.Range(SqlType.Double, commonFeatures, - ValueRange.Double, "double precision", "float8"); - - dtc.DateTime = DataTypeInfo.Range(SqlType.DateTime, commonFeatures, - ValueRange.DateTime, "timestamp"); - - dtc.Interval = DataTypeInfo.Range(SqlType.Interval, commonFeatures, - ValueRange.TimeSpan, "interval"); - - dtc.Char = DataTypeInfo.Stream(SqlType.Char, commonFeatures, MaxCharLength, "character", "char", "bpchar"); - dtc.VarChar = DataTypeInfo.Stream(SqlType.VarChar, commonFeatures, MaxCharLength, "character varying", "varchar"); - dtc.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, commonFeatures, "text"); - dtc.VarBinaryMax = DataTypeInfo.Stream(SqlType.VarBinaryMax, commonFeatures, MaxTextLength, "bytea"); - /* - dtc.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, commonFeatures, - new ValueRange(new DateTimeOffset(1, 1, 1, 0, 0, 0, 0, new TimeSpan(0)), - new DateTimeOffset(9999, 12, 31, 0, 0, 0, 0, new TimeSpan(0))), - "timestamptz"); - */ - - var geo = DataTypeFeatures.Default | DataTypeFeatures.Nullable | DataTypeFeatures.Multiple | DataTypeFeatures.Spatial; - - dtc.Add(CustomSqlType.Point, DataTypeInfo.Regular(CustomSqlType.Point, geo, "point")); - dtc.Add(CustomSqlType.LSeg, DataTypeInfo.Regular(CustomSqlType.LSeg, geo, "lseg")); - dtc.Add(CustomSqlType.Box, DataTypeInfo.Regular(CustomSqlType.Box, geo, "box")); - dtc.Add(CustomSqlType.Path, DataTypeInfo.Regular(CustomSqlType.Path, geo, "path")); - dtc.Add(CustomSqlType.Polygon, DataTypeInfo.Regular(CustomSqlType.Polygon, geo, "polygon")); - dtc.Add(CustomSqlType.Circle, DataTypeInfo.Regular(CustomSqlType.Circle, geo, "circle")); - - return dtc; - } - - - public override EntityInfo GetDomainInfo() - { - var info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override SequenceInfo GetSequenceInfo() - { - var info = new SequenceInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.Features = SequenceFeatures.Cache; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override EntityInfo GetStoredProcedureInfo() - { - EntityInfo info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - public override EntityInfo GetTriggerInfo() - { - EntityInfo info = new EntityInfo(); - info.AllowedDdlStatements = DdlStatements.All; - info.MaxIdentifierLength = MaxIdentifierLength; - return info; - } - - - public override IsolationLevels GetIsolationLevels() - { - return IsolationLevels.ReadCommitted | IsolationLevels.Serializable; - } - - public override QueryInfo GetQueryInfo() - { - var info = new QueryInfo(); - info.Features = - QueryFeatures.Batches | - QueryFeatures.NamedParameters | - QueryFeatures.ParameterPrefix | - QueryFeatures.FullBooleanExpressionSupport | - QueryFeatures.UpdateFrom | - QueryFeatures.Limit | - QueryFeatures.Offset | - QueryFeatures.MulticolumnIn | - QueryFeatures.InsertDefaultValues | - QueryFeatures.UpdateDefaultValues | - QueryFeatures.MultischemaQueries | - QueryFeatures.ScalarSubquery; - info.ParameterPrefix = "@"; - info.MaxComparisonOperations = 1000000; - info.MaxLength = 1000000; - info.MaxNestedSubqueriesAmount = 100; - return info; - } - - public override ServerFeatures GetServerFeatures() - { - return ServerFeatures.Savepoints | ServerFeatures.TransactionalDdl | ServerFeatures.TransactionalFullTextDdl; - } - - public override IdentityInfo GetIdentityInfo() - { - return null; - } - - public override AssertConstraintInfo GetAssertionInfo() - { - return null; - } - - public override EntityInfo GetCharacterSetInfo() - { - return null; - } - - public override EntityInfo GetCollationInfo() - { - return null; - } - - public override EntityInfo GetTranslationInfo() - { - return null; - } - - public override int GetStringIndexingBase() - { - return 1; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class ServerInfoProvider : Info.ServerInfoProvider + { + // These two options are actually compile-time configurable. + private const int MaxIdentifierLength = 63; + private const int MaxIndexKeys = 32; + + private const int MaxTextLength = (int.MaxValue >> 1) - 1000; + private const int MaxCharLength = 10485760; + + private readonly string defaultSchemaName; + private readonly string databaseName; + + protected virtual IndexFeatures GetIndexFeatures() + { + return IndexFeatures.Unique | IndexFeatures.Filtered | IndexFeatures.Expressions; + } + + protected virtual int GetMaxTextLength() + { + return MaxTextLength; + } + + protected virtual int GetMaxCharLength() + { + return MaxCharLength; + } + + public virtual short GetMaxDateTimePrecision() + { + return 6; + } + + + public override EntityInfo GetDatabaseInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override EntityInfo GetSchemaInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override TableInfo GetTableInfo() + { + var info = new TableInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + info.PartitionMethods = PartitionMethods.None; + return info; + } + + public override TemporaryTableInfo GetTemporaryTableInfo() + { + var info = new TemporaryTableInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.Features = TemporaryTableFeatures.Local + | TemporaryTableFeatures.DeleteRowsOnCommit + | TemporaryTableFeatures.PreserveRowsOnCommit; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override IndexInfo GetIndexInfo() + { + var info = new IndexInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.Features = GetIndexFeatures(); + info.MaxNumberOfColumns = MaxIndexKeys; + info.MaxIdentifierLength = MaxIdentifierLength; + // Pg 8.2: 8191 byte + info.MaxLength = 2000; + return info; + } + + public override ColumnInfo GetColumnInfo() + { + var info = new ColumnInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.Features = ColumnFeatures.None; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override CheckConstraintInfo GetCheckConstraintInfo() + { + var info = new CheckConstraintInfo(); + info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + info.MaxIdentifierLength = MaxIdentifierLength; + info.Features = CheckConstraintFeatures.None; + // TODO: more exactly + info.MaxExpressionLength = GetMaxTextLength(); + return info; + } + + public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() + { + var info = new PrimaryKeyConstraintInfo(); + info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override FullTextSearchInfo GetFullTextInfo() + { + return null; + } + + public override UniqueConstraintInfo GetUniqueConstraintInfo() + { + var info = new UniqueConstraintInfo(); + info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + info.Features = UniqueConstraintFeatures.Nullable; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() + { + var info = new ForeignKeyConstraintInfo(); + info.Actions = + ForeignKeyConstraintActions.Cascade | + ForeignKeyConstraintActions.NoAction | + ForeignKeyConstraintActions.Restrict | + ForeignKeyConstraintActions.SetDefault | + ForeignKeyConstraintActions.SetNull; + info.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + info.Features = ForeignKeyConstraintFeatures.Deferrable; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override EntityInfo GetViewInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + + public override DataTypeCollection GetDataTypesInfo() + { + var commonFeatures = + DataTypeFeatures.Clustering | + DataTypeFeatures.Grouping | + DataTypeFeatures.Indexing | + DataTypeFeatures.KeyConstraint | + DataTypeFeatures.Nullable | + DataTypeFeatures.Ordering | + DataTypeFeatures.Multiple | + DataTypeFeatures.Default; + + var dtc = new DataTypeCollection(); + + dtc.Boolean = DataTypeInfo.Range(SqlType.Boolean, commonFeatures, + ValueRange.Bool, "boolean", "bool"); + + dtc.Int16 = DataTypeInfo.Range(SqlType.Int16, commonFeatures, + ValueRange.Int16, + "smallint", "int2"); + + dtc.Int32 = DataTypeInfo.Range(SqlType.Int32, commonFeatures, + ValueRange.Int32, "integer", "int4"); + + dtc.Int64 = DataTypeInfo.Range(SqlType.Int64, commonFeatures, + ValueRange.Int64, "bigint", "int8"); + + dtc.Decimal = DataTypeInfo.Fractional(SqlType.Decimal, commonFeatures, + ValueRange.Decimal, 49, "numeric", "decimal"); + + dtc.Float = DataTypeInfo.Range(SqlType.Float, commonFeatures, + ValueRange.Float, "real", "float4"); + + dtc.Double = DataTypeInfo.Range(SqlType.Double, commonFeatures, + ValueRange.Double, "double precision", "float8"); + + dtc.DateTime = DataTypeInfo.Range(SqlType.DateTime, commonFeatures, + ValueRange.DateTime, "timestamp"); + + dtc.Interval = DataTypeInfo.Range(SqlType.Interval, commonFeatures, + ValueRange.TimeSpan, "interval"); + + dtc.Char = DataTypeInfo.Stream(SqlType.Char, commonFeatures, MaxCharLength, "character", "char", "bpchar"); + dtc.VarChar = DataTypeInfo.Stream(SqlType.VarChar, commonFeatures, MaxCharLength, "character varying", "varchar"); + dtc.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, commonFeatures, "text"); + dtc.VarBinaryMax = DataTypeInfo.Stream(SqlType.VarBinaryMax, commonFeatures, MaxTextLength, "bytea"); + /* + dtc.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, commonFeatures, + new ValueRange(new DateTimeOffset(1, 1, 1, 0, 0, 0, 0, new TimeSpan(0)), + new DateTimeOffset(9999, 12, 31, 0, 0, 0, 0, new TimeSpan(0))), + "timestamptz"); + */ + + var geo = DataTypeFeatures.Default | DataTypeFeatures.Nullable | DataTypeFeatures.Multiple | DataTypeFeatures.Spatial; + + dtc.Add(CustomSqlType.Point, DataTypeInfo.Regular(CustomSqlType.Point, geo, "point")); + dtc.Add(CustomSqlType.LSeg, DataTypeInfo.Regular(CustomSqlType.LSeg, geo, "lseg")); + dtc.Add(CustomSqlType.Box, DataTypeInfo.Regular(CustomSqlType.Box, geo, "box")); + dtc.Add(CustomSqlType.Path, DataTypeInfo.Regular(CustomSqlType.Path, geo, "path")); + dtc.Add(CustomSqlType.Polygon, DataTypeInfo.Regular(CustomSqlType.Polygon, geo, "polygon")); + dtc.Add(CustomSqlType.Circle, DataTypeInfo.Regular(CustomSqlType.Circle, geo, "circle")); + + return dtc; + } + + + public override EntityInfo GetDomainInfo() + { + var info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override SequenceInfo GetSequenceInfo() + { + var info = new SequenceInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.Features = SequenceFeatures.Cache; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override EntityInfo GetStoredProcedureInfo() + { + EntityInfo info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + public override EntityInfo GetTriggerInfo() + { + EntityInfo info = new EntityInfo(); + info.AllowedDdlStatements = DdlStatements.All; + info.MaxIdentifierLength = MaxIdentifierLength; + return info; + } + + + public override IsolationLevels GetIsolationLevels() + { + return IsolationLevels.ReadCommitted | IsolationLevels.Serializable; + } + + public override QueryInfo GetQueryInfo() + { + var info = new QueryInfo(); + info.Features = + QueryFeatures.Batches | + QueryFeatures.NamedParameters | + QueryFeatures.ParameterPrefix | + QueryFeatures.FullBooleanExpressionSupport | + QueryFeatures.UpdateFrom | + QueryFeatures.Limit | + QueryFeatures.Offset | + QueryFeatures.MulticolumnIn | + QueryFeatures.InsertDefaultValues | + QueryFeatures.UpdateDefaultValues | + QueryFeatures.MultischemaQueries | + QueryFeatures.ScalarSubquery; + info.ParameterPrefix = "@"; + info.MaxComparisonOperations = 1000000; + info.MaxLength = 1000000; + info.MaxNestedSubqueriesAmount = 100; + return info; + } + + public override ServerFeatures GetServerFeatures() + { + return ServerFeatures.Savepoints | ServerFeatures.TransactionalDdl | ServerFeatures.TransactionalFullTextDdl; + } + + public override IdentityInfo GetIdentityInfo() + { + return null; + } + + public override AssertConstraintInfo GetAssertionInfo() + { + return null; + } + + public override EntityInfo GetCharacterSetInfo() + { + return null; + } + + public override EntityInfo GetCollationInfo() + { + return null; + } + + public override EntityInfo GetTranslationInfo() + { + return null; + } + + public override int GetStringIndexingBase() + { + return 1; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs index 78ef78101b..448d5d8e37 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs @@ -1,898 +1,898 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Diagnostics; -using System.Text; -using NpgsqlTypes; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Model; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Drivers.PostgreSql.Resources; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class Translator : SqlTranslator - { - public override string DateTimeFormatString { get { return @"\'yyyyMMdd HHmmss.ffffff\''::timestamp(6)'"; } } - public override string TimeSpanFormatString { get { return "'{0}{1} days {0}{2}:{3}:{4}.{5:000}'::interval"; } } - - public override string FloatFormatString { get { return base.FloatFormatString + "'::float4'"; } } - public override string DoubleFormatString { get { return base.DoubleFormatString + "'::float8'"; } } - - /* - public string DateTimeOffsetFormatString { get { return @"\'yyyyMMdd HHmmss.ffffff zzz\''::timestamp(6) with time zone'"; } } - */ - - - public override void Initialize() - { - base.Initialize(); - FloatNumberFormat.NumberDecimalSeparator = "."; - FloatNumberFormat.NumberGroupSeparator = ""; - FloatNumberFormat.NaNSymbol = "'Nan'::float4"; - FloatNumberFormat.NegativeInfinitySymbol = "'-Infinity'::float4"; - FloatNumberFormat.PositiveInfinitySymbol = "'Infinity'::float4"; - - DoubleNumberFormat.NumberDecimalSeparator = "."; - DoubleNumberFormat.NumberGroupSeparator = ""; - DoubleNumberFormat.NaNSymbol = "'Nan'::float8"; - DoubleNumberFormat.NegativeInfinitySymbol = "'-Infinity'::float8"; - DoubleNumberFormat.PositiveInfinitySymbol = "'Infinity'::float8"; - } - - public override string DdlStatementDelimiter { get { return ";"; } } - public override string BatchItemDelimiter { get { return ";\r\n"; } } - - [DebuggerStepThrough] - public override string QuoteIdentifier(params string[] names) - { - return SqlHelper.QuoteIdentifierWithQuotes(names); - } - - [DebuggerStepThrough] - public override string QuoteString(string str) - { - return "'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; - } - - public override string Translate(SqlFunctionType type) - { - switch (type) { - case SqlFunctionType.SystemUser: - return string.Empty; - case SqlFunctionType.User: - case SqlFunctionType.CurrentUser: - return "current_user"; - case SqlFunctionType.SessionUser: - return "session_user"; - case SqlFunctionType.NullIf: - return "nullif"; - case SqlFunctionType.Coalesce: - return "coalesce"; - case SqlFunctionType.BinaryLength: - return "length"; - - //datetime/timespan - - case SqlFunctionType.CurrentDate: - return "date_trunc('day', current_timestamp)"; - case SqlFunctionType.CurrentTimeStamp: - return "current_timestamp"; - case SqlFunctionType.IntervalNegate: - return "-"; - - //string - - case SqlFunctionType.CharLength: - return "char_length"; - case SqlFunctionType.Lower: - return "lower"; - case SqlFunctionType.Position: - return "position"; - case SqlFunctionType.Substring: - return "substring"; - case SqlFunctionType.Upper: - return "upper"; - case SqlFunctionType.Concat: - return "textcat"; - - //math - - case SqlFunctionType.Abs: - return "abs"; - case SqlFunctionType.Acos: - return "acos"; - case SqlFunctionType.Asin: - return "asin"; - case SqlFunctionType.Atan: - return "atan"; - case SqlFunctionType.Atan2: - return "atan2"; - case SqlFunctionType.Ceiling: - return "ceil"; - case SqlFunctionType.Cos: - return "cos"; - case SqlFunctionType.Cot: - return "cot"; - case SqlFunctionType.Degrees: - return "degrees"; - case SqlFunctionType.Exp: - return "exp"; - case SqlFunctionType.Floor: - return "floor"; - case SqlFunctionType.Log: - return "ln"; - case SqlFunctionType.Log10: - return "log"; - case SqlFunctionType.Pi: - return "pi"; - case SqlFunctionType.Power: - return "power"; - case SqlFunctionType.Radians: - return "radians"; - case SqlFunctionType.Rand: - return "random"; - case SqlFunctionType.Round: - return "round"; - case SqlFunctionType.Truncate: - return "trunc"; - case SqlFunctionType.Sign: - return "sign"; - case SqlFunctionType.Sqrt: - return "sqrt"; - case SqlFunctionType.Tan: - return "tan"; - - default: - return base.Translate(type); - } - } - - public override string Translate(ReferentialAction action) - { - switch (action) { - case ReferentialAction.Cascade: - return "CASCADE"; - case ReferentialAction.NoAction: - return "NO ACTION"; - case ReferentialAction.Restrict: - return "RESTRICT"; - case ReferentialAction.SetDefault: - return "SET DEFAULT"; - case ReferentialAction.SetNull: - return "SET NULL"; - } - return string.Empty; - } - - public override string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.BitXor: - return "#"; - case SqlNodeType.Modulo: - return "%"; - case SqlNodeType.Overlaps: - return "OVERLAPS"; - case SqlNodeType.DateTimePlusInterval: - return "+"; - case SqlNodeType.DateTimeMinusInterval: - case SqlNodeType.DateTimeMinusDateTime: - return "-"; - default: - return base.Translate(type); - } - } - - public override string Translate(SqlMatchType mt) - { - switch (mt) { - case SqlMatchType.Full: - return "FULL"; - default: - return "SIMPLE"; - } - } - - public override string Translate(SqlCompilerContext context, SchemaNode node) - { - TemporaryTable tmp = node as TemporaryTable; - //temporary tables need no schema qualifier - if (tmp==null && node.Schema!=null) { - if (context==null)// extractor for some reason uses this method without context - return QuoteIdentifier(new[] {node.Schema.Name, node.Name}); - return QuoteIdentifier(new[] {context.SqlNodeActualizer.Actualize(node.Schema), node.Name}); - - } - return QuoteIdentifier(new[] {node.Name}); - } - - public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) - { - switch (section) { - case CreateTableSection.Exit: - return "WITHOUT OIDS " + base.Translate(context, node, section); - - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) - { - switch (section) { - case TableColumnSection.Exit: - case TableColumnSection.SetIdentityInfoElement: - case TableColumnSection.GenerationExpressionExit: - case TableColumnSection.Collate: - return string.Empty; - default: - return base.Translate(context, column, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - Index index = node.Index; - switch (section) { - case CreateIndexSection.Entry: - return string.Format("CREATE {0}INDEX {1} ON {2} {3}(" - , index.IsUnique ? "UNIQUE " : String.Empty - , QuoteIdentifier(index.Name) - , Translate(context, index.DataTable) - , index.IsSpatial ? "USING GIST" : String.Empty); - case CreateIndexSection.StorageOptions: - var builder = new StringBuilder(); - builder.Append(")"); - AppendIndexStorageParameters(builder, index); - if (!string.IsNullOrEmpty(index.Filegroup)) - builder.Append(" TABLESPACE " + QuoteIdentifier(index.Filegroup)); - return builder.ToString(); - case CreateIndexSection.Exit: - return string.Empty; - case CreateIndexSection.Where: - return " WHERE "; - default: - return string.Empty; - } - } - - protected virtual void AppendIndexStorageParameters(StringBuilder builder, Index index) - { - } - - public override string Translate(SqlCompilerContext context, SqlDropIndex node) - { - string indexName; - if (context==null) - indexName = QuoteIdentifier(node.Index.DataTable.Schema.Name, node.Index.Name); - else - indexName = QuoteIdentifier(context.SqlNodeActualizer.Actualize(node.Index.DataTable.Schema), node.Index.Name); - return "DROP INDEX " + indexName; - } - - public override string Translate(SqlCompilerContext context, SqlBreak node) - { - return "EXIT"; - } - - public override string Translate(SqlCompilerContext context, SqlContinue node) - { - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, SqlDeclareVariable node) - { - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, SqlAssignment node, NodeSection section) - { - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, object literalValue) - { - var literalType = literalValue.GetType(); - if (literalType==typeof(byte[])) - return TranslateByteArrayLiteral((byte[]) literalValue); - if (literalType==typeof(Guid)) - return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); - /* - if(literalType==typeof(DateTimeOffset)) - return ((DateTimeOffset)literalValue).ToString(DateTimeOffsetFormatString); - */ - - if (literalType==typeof (NpgsqlPoint)) { - var point = (NpgsqlPoint) literalValue; - return String.Format("point'({0},{1})'", point.X, point.Y); - } - if (literalType==typeof (NpgsqlLSeg)) { - var lSeg = (NpgsqlLSeg) literalValue; - return String.Format("lseg'[({0},{1}),({2},{3})]'", lSeg.Start.X, lSeg.Start.Y, lSeg.End.X, lSeg.End.Y); - } - if (literalType==typeof (NpgsqlBox)) { - var box = (NpgsqlBox) literalValue; - return String.Format("box'({0},{1}),({2},{3})'", box.LowerLeft.X, box.LowerLeft.Y, box.UpperRight.X, box.UpperRight.Y); - } - if (literalType==typeof (NpgsqlPath)) - return String.Format("path'(({0},{1}))'", 0, 0); - if (literalType==typeof (NpgsqlPolygon)) - return String.Format("polygon'((0,0))'"); - if (literalType==typeof (NpgsqlCircle)) { - var circle = (NpgsqlCircle) literalValue; - return String.Format("circle'<({0},{1}),{2}>'", circle.Center.X, circle.Center.Y, circle.Radius); - } - return base.Translate(context, literalValue); - } - - public override string Translate(SqlCompilerContext context, SqlArray node, ArraySection section) - { - switch (section) { - case ArraySection.Entry: - return "ARRAY["; - case ArraySection.Exit: - return "]"; - case ArraySection.EmptyArray: - return string.Format("'{{}}'::{0}[]", TranslateClrType(node.ItemType)); - default: - throw new ArgumentOutOfRangeException("section"); - } - } - - public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) - { - bool isSecond = node.DateTimePart==SqlDateTimePart.Second - || node.IntervalPart==SqlIntervalPart.Second - /*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Second*/; - bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond - || node.IntervalPart==SqlIntervalPart.Millisecond - /*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Millisecond*/; - if (!(isSecond || isMillisecond)) - return base.Translate(context, node, section); - switch (section) { - case ExtractSection.Entry: - if (isSecond) - return "(trunc(extract("; - return "(extract("; - case ExtractSection.Exit: - if (isMillisecond) - return ")::int8 % 1000)"; - if (isSecond) - return ")))"; - return ")::int8)"; - //return isMillisecond ? ")::int8 % 1000)" : ")::int8)"; - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlDeclareCursor node, DeclareCursorSection section) - { - switch (section) { - case DeclareCursorSection.Entry: - return ("DECLARE " + QuoteIdentifier(node.Cursor.Name)); - case DeclareCursorSection.Sensivity: - return ""; - case DeclareCursorSection.Scrollability: - return node.Cursor.Scroll ? "SCROLL" : "NO SCROLL"; - case DeclareCursorSection.Cursor: - return "CURSOR"; - case DeclareCursorSection.Holdability: - return node.Cursor.WithHold ? "WITH HOLD" : ""; - case DeclareCursorSection.Returnability: - case DeclareCursorSection.Updatability: - case DeclareCursorSection.Exit: - return ""; - - case DeclareCursorSection.For: - return "FOR"; - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) - { - switch (section) { - case FetchSection.Entry: - return "FETCH " + node.Option.ToString().ToUpper(); - case FetchSection.Targets: - return "FROM " + QuoteIdentifier(node.Cursor.Name); - case FetchSection.Exit: - break; - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlOpenCursor node) - { - // DECLARE CURSOR already opens it - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, SqlMatch node, MatchSection section) - { - switch (section) { - case MatchSection.Entry: - //MATCH is not supported by PostgreSQL, we need some workaround - SqlRow row = node.Value as SqlRow; - if (row!=null) { - SqlSelect finalQuery = SqlDml.Select(); - finalQuery.Columns.Add(5); - switch (node.MatchType) { - #region SIMPLE - - case SqlMatchType.None: { - bool existsNull = false; - SqlCase c = SqlDml.Case(); - { - bool subQueryNeeded = true; - //if any of the row elements is NULL then true - if (row.Count > 0) { - bool allLiteral = true; //if true then there is no NULL element - SqlExpression when1 = null; - for (int i = 0; i < row.Count; i++) { - bool elementIsNotLiteral = row[i].NodeType!=SqlNodeType.Literal; - //if the row element is the NULL value - if (row[i].NodeType==SqlNodeType.Null) { - existsNull = true; - break; - } - if (allLiteral && elementIsNotLiteral) - allLiteral = false; - if (elementIsNotLiteral) { - if (when1==null) - when1 = SqlDml.IsNull(row[i]); - else - when1 = when1 || SqlDml.IsNull(row[i]); - } - } - if (existsNull) { - //Some row element is the NULL value, MATCH result is true - subQueryNeeded = false; - } - else if (allLiteral) { - //No row element is the NULL value - subQueryNeeded = true; - } - else //(!whenNotNeeded) - { - //Check if any row element is NULL - c.Add(when1==null ? true : when1, true); - subQueryNeeded = true; - } - } - //find row in subquery - if (subQueryNeeded) { - SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); - SqlSelect q1 = SqlDml.Select(originalQuery); - q1.Columns.Add(1); - { - SqlTableColumnCollection columns = originalQuery.Columns; - SqlExpression where = null; - for (int i = 0; i < columns.Count; i++) { - if (i==0) - where = columns[i]==row[i]; - else - where = where && columns[i]==row[i]; - if (node.Unique) - q1.GroupBy.Add(columns[i]); - } - q1.Where = where; - if (node.Unique) - q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; - } - //c.Add(Sql.Exists(q1), true); - c.Else = SqlDml.Exists(q1); - } - } - if (c.Else==null) - c.Else = false; - if (existsNull) - finalQuery.Where = null; - else if (c.Count > 0) - finalQuery.Where = c; - else - finalQuery.Where = c.Else; - break; - } - - #endregion - - #region FULL - - case SqlMatchType.Full: { - SqlCase c1 = SqlDml.Case(); - { - bool noMoreWhenNeeded = false; - bool allNull = true; - SqlExpression when1 = true; - //if all row elements are null then true - if (row.Count > 0) { - bool whenNotNeeded = false; - for (int i = 0; i < row.Count; i++) { - //if any row element is surely not the NULL value - if (row[i].NodeType==SqlNodeType.Literal) { - whenNotNeeded = true; - break; - } - if (allNull && row[i].NodeType!=SqlNodeType.Null) { - allNull = false; - } - if (i==0) - when1 = SqlDml.IsNull(row[i]); - else - when1 = when1 && SqlDml.IsNull(row[i]); - } - if (allNull) { - when1 = true; - } - if (!whenNotNeeded) - c1.Add(when1, true); - } - if (!noMoreWhenNeeded) { - bool whenNotNeeded = false; - bool allLiteral = true; - SqlExpression when2 = true; - //if no row elements are null then subcase - for (int i = 0; i < row.Count; i++) { - if (row[i].NodeType==SqlNodeType.Null) { - whenNotNeeded = true; - when2 = false; - break; - } - if (allLiteral && row[i].NodeType!=SqlNodeType.Literal) - allLiteral = false; - if (i==0) - when2 = SqlDml.IsNotNull(row[i]); - else - when2 = when2 && SqlDml.IsNotNull(row[i]); - } - if (allLiteral) { - when2 = true; - } - if (!whenNotNeeded) { - //find row in subquery - SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); - SqlSelect q1 = SqlDml.Select(originalQuery); - q1.Columns.Add(1); - { - SqlTableColumnCollection columns = originalQuery.Columns; - SqlExpression where = null; - for (int i = 0; i < columns.Count; i++) { - if (i==0) - where = columns[i]==row[i]; - else - where = where && columns[i]==row[i]; - if (node.Unique) - q1.GroupBy.Add(columns[i]); - } - q1.Where = where; - if (node.Unique) - q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; - } - c1.Add(when2, SqlDml.Exists(q1)); - } - } - //else false - c1.Else = false; - } - if (c1.Count > 0) - finalQuery.Where = c1; - else - finalQuery.Where = false; - break; - } - - #endregion - - #region PARTIAL - - case SqlMatchType.Partial: { - bool allNull = true; - SqlCase c1 = SqlDml.Case(); - { - SqlExpression when1 = true; - //if all row elements are null then true - if (row.Count > 0) { - bool whenNotNeeded = false; - for (int i = 0; i < row.Count; i++) { - //if any row element is surely not the NULL value - if (row[i].NodeType==SqlNodeType.Literal) { - allNull = false; - whenNotNeeded = true; - break; - } - if (allNull && row[i].NodeType!=SqlNodeType.Null) { - allNull = false; - } - if (i==0) - when1 = SqlDml.IsNull(row[i]); - else - when1 = when1 && SqlDml.IsNull(row[i]); - } - if (allNull) { - when1 = true; - } - if (!whenNotNeeded) - c1.Add(when1, true); - } - //otherwise - if (!allNull) { - //find row in subquery - SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); - SqlSelect q1 = SqlDml.Select(originalQuery); - q1.Columns.Add(8); - { - SqlTableColumnCollection columns = originalQuery.Columns; - SqlExpression where = null; - for (int i = 0; i < columns.Count; i++) { - //if row[i] would be NULL then c3 would result in true, - if (row[i].NodeType!=SqlNodeType.Null) { - SqlCase c3 = SqlDml.Case(); - c3.Add(SqlDml.IsNull(row[i]), true); - c3.Else = row[i]==columns[i]; - - if (where==null) - where = c3; - else - where = where && c3; - } - if (node.Unique) { - SqlCase c4 = SqlDml.Case(); - c4.Add(SqlDml.IsNull(row[i]), 0); - c4.Else = columns[i]; - q1.GroupBy.Add(c4); - } - } - q1.Where = where; - if (node.Unique) - q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; - } - c1.Else = SqlDml.Exists(q1); - } - } - if (c1.Else==null) - c1.Else = false; - if (allNull) - finalQuery.Where = null; - else if (c1.Count > 0) - finalQuery.Where = c1; - else - finalQuery.Where = c1.Else; - } - break; - - #endregion - } - SqlMatch newNode = SqlDml.Match(SqlDml.Row(), SqlDml.SubQuery(finalQuery).Query, node.Unique, node.MatchType); - node.ReplaceWith(newNode); - return "EXISTS(SELECT '"; - } - else { - throw new InvalidOperationException(Strings.ExSqlMatchValueMustBeAnSqlRowInstance); - } - case MatchSection.Specification: - return "' WHERE EXISTS"; - case MatchSection.Exit: - return ")"; - } - return string.Empty; - } - - private SqlSelect CreateSelectForUniqueMatchNoneOrFull(SqlRow row, SqlSelect query) - { - /* - select exists(select 1 - from (original subquery) x - where x.a1=r.a1 and x.a2=r.a2 - group by x.a1, x.a2 - having count(*)=1 - ) } - */ - SqlSelect q0 = SqlDml.Select(); - { - SqlQueryRef originalQuery = SqlDml.QueryRef(query); - SqlSelect q1 = SqlDml.Select(originalQuery); - q1.Columns.Add(1); - q1.Where = true; //initially true - { - int index = 0; - foreach (SqlColumn col in originalQuery.Columns) { - q1.Where = q1.Where && col==row[index]; - q1.GroupBy.Add(col); - index++; - } - q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; - } - q0.Columns.Add(SqlDml.Exists(q1)); - } - return q0; - } - - - public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) - { - switch (section) { - case FunctionCallSection.Entry: - switch (node.FunctionType) { - case SqlFunctionType.CurrentUser: - case SqlFunctionType.SessionUser: - case SqlFunctionType.SystemUser: - case SqlFunctionType.User: - case SqlFunctionType.CurrentDate: - case SqlFunctionType.CurrentTimeStamp: - return Translate(node.FunctionType); - } - break; - } - - return base.Translate(context, node, section, position); - } - - public override string Translate(SqlCompilerContext context, SqlUnary node, NodeSection section) - { - //substitute UNIQUE predicate with a more complex EXISTS predicate, - //because UNIQUE is not supported - - if (node.NodeType==SqlNodeType.Unique) { - var origSubselect = node.Operand as SqlSubQuery; - if (origSubselect!=null) { - SqlQueryRef origQuery = SqlDml.QueryRef(origSubselect.Query); - SqlSelect existsOp = SqlDml.Select(origQuery); - existsOp.Columns.Add(1); - existsOp.Where = true; - foreach (SqlColumn col in origQuery.Columns) { - existsOp.Where = existsOp.Where && SqlDml.IsNotNull(col); - existsOp.GroupBy.Add(col); - } - existsOp.Having = SqlDml.Count(SqlDml.Asterisk) > 1; - existsOp.Limit = 1; - - node.ReplaceWith(SqlDml.Not(SqlDml.Exists(existsOp))); - } - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) - { - if (section==NodeSection.Entry) - return "nextval('"; - if (section==NodeSection.Exit) - return "')"; - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - // casting this way behaves differently: -32768::int2 is out of range ! We need (-32768)::int2 - switch (section) { - case NodeSection.Entry: - return "("; - - case NodeSection.Exit: - return ")::" + Translate(node.Type); - } - return string.Empty; - } - - public override string Translate(SqlDateTimePart part) - { - switch (part) { - case SqlDateTimePart.Millisecond: - return "MILLISECONDS"; - case SqlDateTimePart.DayOfYear: - return "DOY"; - case SqlDateTimePart.DayOfWeek: - return "DOW"; - } - - return base.Translate(part); - } - - /* - public override string Translate(SqlDateTimeOffsetPart part) - { - switch (part) { - case SqlDateTimeOffsetPart.Millisecond: - return "MILLISECONDS"; - case SqlDateTimeOffsetPart.DayOfYear: - return "DOY"; - case SqlDateTimeOffsetPart.DayOfWeek: - return "DOW"; - case SqlDateTimeOffsetPart.Offset: - return "TIMEZONE"; - case SqlDateTimeOffsetPart.TimeZoneHour: - return "TIMEZONE_HOUR"; - case SqlDateTimeOffsetPart.TimeZoneMinute: - return "TIMEZONE_MINUTE"; - } - - return base.Translate(part); - } - */ - - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.SkipLocked) - || lockType.Supports(SqlLockType.Shared) - || lockType.Supports(SqlLockType.ThrowIfLocked)) - return base.Translate(lockType); - return "FOR UPDATE"; - } - - protected virtual string TranslateClrType(Type type) - { - switch (Type.GetTypeCode(type)) { - case TypeCode.Boolean: - return "bool"; - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - return "int2"; - case TypeCode.UInt16: - case TypeCode.Int32: - return "int4"; - case TypeCode.UInt32: - case TypeCode.Int64: - return "int8"; - case TypeCode.UInt64: - case TypeCode.Decimal: - return "numeric"; - case TypeCode.Single: - return "float4"; - case TypeCode.Double: - return "float8"; - case TypeCode.Char: - case TypeCode.String: - return "text"; - case TypeCode.DateTime: - return "timestamp"; - default: - if (type==typeof (TimeSpan)) - return "interval"; - if (type==typeof(Guid)) - return "bytea"; - return "text"; - } - } - - private static string TranslateByteArrayLiteral(byte[] array) - { - if (array.Length==0) - return "''::bytea"; - - var chars = new char[1 + 5 * array.Length + 8]; - chars[0] = '\''; - chars[chars.Length - 1] = 'a'; - chars[chars.Length - 2] = 'e'; - chars[chars.Length - 3] = 't'; - chars[chars.Length - 4] = 'y'; - chars[chars.Length - 5] = 'b'; - chars[chars.Length - 6] = ':'; - chars[chars.Length - 7] = ':'; - chars[chars.Length - 8] = '\''; - - for (int n = 1, i = 0; i < array.Length; i++, n += 5) { - chars[n] = chars[n + 1] = '\\'; - chars[n + 2] = (char) ('0' + (7 & (array[i] >> 6))); - chars[n + 3] = (char) ('0' + (7 & (array[i] >> 3))); - chars[n + 4] = (char) ('0' + (7 & (array[i] >> 0))); - } - - return new string(chars); - } - - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Diagnostics; +using System.Text; +using NpgsqlTypes; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Model; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Drivers.PostgreSql.Resources; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class Translator : SqlTranslator + { + public override string DateTimeFormatString { get { return @"\'yyyyMMdd HHmmss.ffffff\''::timestamp(6)'"; } } + public override string TimeSpanFormatString { get { return "'{0}{1} days {0}{2}:{3}:{4}.{5:000}'::interval"; } } + + public override string FloatFormatString { get { return base.FloatFormatString + "'::float4'"; } } + public override string DoubleFormatString { get { return base.DoubleFormatString + "'::float8'"; } } + + /* + public string DateTimeOffsetFormatString { get { return @"\'yyyyMMdd HHmmss.ffffff zzz\''::timestamp(6) with time zone'"; } } + */ + + + public override void Initialize() + { + base.Initialize(); + FloatNumberFormat.NumberDecimalSeparator = "."; + FloatNumberFormat.NumberGroupSeparator = ""; + FloatNumberFormat.NaNSymbol = "'Nan'::float4"; + FloatNumberFormat.NegativeInfinitySymbol = "'-Infinity'::float4"; + FloatNumberFormat.PositiveInfinitySymbol = "'Infinity'::float4"; + + DoubleNumberFormat.NumberDecimalSeparator = "."; + DoubleNumberFormat.NumberGroupSeparator = ""; + DoubleNumberFormat.NaNSymbol = "'Nan'::float8"; + DoubleNumberFormat.NegativeInfinitySymbol = "'-Infinity'::float8"; + DoubleNumberFormat.PositiveInfinitySymbol = "'Infinity'::float8"; + } + + public override string DdlStatementDelimiter { get { return ";"; } } + public override string BatchItemDelimiter { get { return ";\r\n"; } } + + [DebuggerStepThrough] + public override string QuoteIdentifier(params string[] names) + { + return SqlHelper.QuoteIdentifierWithQuotes(names); + } + + [DebuggerStepThrough] + public override string QuoteString(string str) + { + return "'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; + } + + public override string Translate(SqlFunctionType type) + { + switch (type) { + case SqlFunctionType.SystemUser: + return string.Empty; + case SqlFunctionType.User: + case SqlFunctionType.CurrentUser: + return "current_user"; + case SqlFunctionType.SessionUser: + return "session_user"; + case SqlFunctionType.NullIf: + return "nullif"; + case SqlFunctionType.Coalesce: + return "coalesce"; + case SqlFunctionType.BinaryLength: + return "length"; + + //datetime/timespan + + case SqlFunctionType.CurrentDate: + return "date_trunc('day', current_timestamp)"; + case SqlFunctionType.CurrentTimeStamp: + return "current_timestamp"; + case SqlFunctionType.IntervalNegate: + return "-"; + + //string + + case SqlFunctionType.CharLength: + return "char_length"; + case SqlFunctionType.Lower: + return "lower"; + case SqlFunctionType.Position: + return "position"; + case SqlFunctionType.Substring: + return "substring"; + case SqlFunctionType.Upper: + return "upper"; + case SqlFunctionType.Concat: + return "textcat"; + + //math + + case SqlFunctionType.Abs: + return "abs"; + case SqlFunctionType.Acos: + return "acos"; + case SqlFunctionType.Asin: + return "asin"; + case SqlFunctionType.Atan: + return "atan"; + case SqlFunctionType.Atan2: + return "atan2"; + case SqlFunctionType.Ceiling: + return "ceil"; + case SqlFunctionType.Cos: + return "cos"; + case SqlFunctionType.Cot: + return "cot"; + case SqlFunctionType.Degrees: + return "degrees"; + case SqlFunctionType.Exp: + return "exp"; + case SqlFunctionType.Floor: + return "floor"; + case SqlFunctionType.Log: + return "ln"; + case SqlFunctionType.Log10: + return "log"; + case SqlFunctionType.Pi: + return "pi"; + case SqlFunctionType.Power: + return "power"; + case SqlFunctionType.Radians: + return "radians"; + case SqlFunctionType.Rand: + return "random"; + case SqlFunctionType.Round: + return "round"; + case SqlFunctionType.Truncate: + return "trunc"; + case SqlFunctionType.Sign: + return "sign"; + case SqlFunctionType.Sqrt: + return "sqrt"; + case SqlFunctionType.Tan: + return "tan"; + + default: + return base.Translate(type); + } + } + + public override string Translate(ReferentialAction action) + { + switch (action) { + case ReferentialAction.Cascade: + return "CASCADE"; + case ReferentialAction.NoAction: + return "NO ACTION"; + case ReferentialAction.Restrict: + return "RESTRICT"; + case ReferentialAction.SetDefault: + return "SET DEFAULT"; + case ReferentialAction.SetNull: + return "SET NULL"; + } + return string.Empty; + } + + public override string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.BitXor: + return "#"; + case SqlNodeType.Modulo: + return "%"; + case SqlNodeType.Overlaps: + return "OVERLAPS"; + case SqlNodeType.DateTimePlusInterval: + return "+"; + case SqlNodeType.DateTimeMinusInterval: + case SqlNodeType.DateTimeMinusDateTime: + return "-"; + default: + return base.Translate(type); + } + } + + public override string Translate(SqlMatchType mt) + { + switch (mt) { + case SqlMatchType.Full: + return "FULL"; + default: + return "SIMPLE"; + } + } + + public override string Translate(SqlCompilerContext context, SchemaNode node) + { + TemporaryTable tmp = node as TemporaryTable; + //temporary tables need no schema qualifier + if (tmp==null && node.Schema!=null) { + if (context==null)// extractor for some reason uses this method without context + return QuoteIdentifier(new[] {node.Schema.Name, node.Name}); + return QuoteIdentifier(new[] {context.SqlNodeActualizer.Actualize(node.Schema), node.Name}); + + } + return QuoteIdentifier(new[] {node.Name}); + } + + public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) + { + switch (section) { + case CreateTableSection.Exit: + return "WITHOUT OIDS " + base.Translate(context, node, section); + + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) + { + switch (section) { + case TableColumnSection.Exit: + case TableColumnSection.SetIdentityInfoElement: + case TableColumnSection.GenerationExpressionExit: + case TableColumnSection.Collate: + return string.Empty; + default: + return base.Translate(context, column, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + Index index = node.Index; + switch (section) { + case CreateIndexSection.Entry: + return string.Format("CREATE {0}INDEX {1} ON {2} {3}(" + , index.IsUnique ? "UNIQUE " : String.Empty + , QuoteIdentifier(index.Name) + , Translate(context, index.DataTable) + , index.IsSpatial ? "USING GIST" : String.Empty); + case CreateIndexSection.StorageOptions: + var builder = new StringBuilder(); + builder.Append(")"); + AppendIndexStorageParameters(builder, index); + if (!string.IsNullOrEmpty(index.Filegroup)) + builder.Append(" TABLESPACE " + QuoteIdentifier(index.Filegroup)); + return builder.ToString(); + case CreateIndexSection.Exit: + return string.Empty; + case CreateIndexSection.Where: + return " WHERE "; + default: + return string.Empty; + } + } + + protected virtual void AppendIndexStorageParameters(StringBuilder builder, Index index) + { + } + + public override string Translate(SqlCompilerContext context, SqlDropIndex node) + { + string indexName; + if (context==null) + indexName = QuoteIdentifier(node.Index.DataTable.Schema.Name, node.Index.Name); + else + indexName = QuoteIdentifier(context.SqlNodeActualizer.Actualize(node.Index.DataTable.Schema), node.Index.Name); + return "DROP INDEX " + indexName; + } + + public override string Translate(SqlCompilerContext context, SqlBreak node) + { + return "EXIT"; + } + + public override string Translate(SqlCompilerContext context, SqlContinue node) + { + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, SqlDeclareVariable node) + { + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, SqlAssignment node, NodeSection section) + { + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, object literalValue) + { + var literalType = literalValue.GetType(); + if (literalType==typeof(byte[])) + return TranslateByteArrayLiteral((byte[]) literalValue); + if (literalType==typeof(Guid)) + return QuoteString(SqlHelper.GuidToString((Guid) literalValue)); + /* + if(literalType==typeof(DateTimeOffset)) + return ((DateTimeOffset)literalValue).ToString(DateTimeOffsetFormatString); + */ + + if (literalType==typeof (NpgsqlPoint)) { + var point = (NpgsqlPoint) literalValue; + return String.Format("point'({0},{1})'", point.X, point.Y); + } + if (literalType==typeof (NpgsqlLSeg)) { + var lSeg = (NpgsqlLSeg) literalValue; + return String.Format("lseg'[({0},{1}),({2},{3})]'", lSeg.Start.X, lSeg.Start.Y, lSeg.End.X, lSeg.End.Y); + } + if (literalType==typeof (NpgsqlBox)) { + var box = (NpgsqlBox) literalValue; + return String.Format("box'({0},{1}),({2},{3})'", box.LowerLeft.X, box.LowerLeft.Y, box.UpperRight.X, box.UpperRight.Y); + } + if (literalType==typeof (NpgsqlPath)) + return String.Format("path'(({0},{1}))'", 0, 0); + if (literalType==typeof (NpgsqlPolygon)) + return String.Format("polygon'((0,0))'"); + if (literalType==typeof (NpgsqlCircle)) { + var circle = (NpgsqlCircle) literalValue; + return String.Format("circle'<({0},{1}),{2}>'", circle.Center.X, circle.Center.Y, circle.Radius); + } + return base.Translate(context, literalValue); + } + + public override string Translate(SqlCompilerContext context, SqlArray node, ArraySection section) + { + switch (section) { + case ArraySection.Entry: + return "ARRAY["; + case ArraySection.Exit: + return "]"; + case ArraySection.EmptyArray: + return string.Format("'{{}}'::{0}[]", TranslateClrType(node.ItemType)); + default: + throw new ArgumentOutOfRangeException("section"); + } + } + + public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) + { + bool isSecond = node.DateTimePart==SqlDateTimePart.Second + || node.IntervalPart==SqlIntervalPart.Second + /*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Second*/; + bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond + || node.IntervalPart==SqlIntervalPart.Millisecond + /*|| node.DateTimeOffsetPart==SqlDateTimeOffsetPart.Millisecond*/; + if (!(isSecond || isMillisecond)) + return base.Translate(context, node, section); + switch (section) { + case ExtractSection.Entry: + if (isSecond) + return "(trunc(extract("; + return "(extract("; + case ExtractSection.Exit: + if (isMillisecond) + return ")::int8 % 1000)"; + if (isSecond) + return ")))"; + return ")::int8)"; + //return isMillisecond ? ")::int8 % 1000)" : ")::int8)"; + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlDeclareCursor node, DeclareCursorSection section) + { + switch (section) { + case DeclareCursorSection.Entry: + return ("DECLARE " + QuoteIdentifier(node.Cursor.Name)); + case DeclareCursorSection.Sensivity: + return ""; + case DeclareCursorSection.Scrollability: + return node.Cursor.Scroll ? "SCROLL" : "NO SCROLL"; + case DeclareCursorSection.Cursor: + return "CURSOR"; + case DeclareCursorSection.Holdability: + return node.Cursor.WithHold ? "WITH HOLD" : ""; + case DeclareCursorSection.Returnability: + case DeclareCursorSection.Updatability: + case DeclareCursorSection.Exit: + return ""; + + case DeclareCursorSection.For: + return "FOR"; + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) + { + switch (section) { + case FetchSection.Entry: + return "FETCH " + node.Option.ToString().ToUpper(); + case FetchSection.Targets: + return "FROM " + QuoteIdentifier(node.Cursor.Name); + case FetchSection.Exit: + break; + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlOpenCursor node) + { + // DECLARE CURSOR already opens it + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, SqlMatch node, MatchSection section) + { + switch (section) { + case MatchSection.Entry: + //MATCH is not supported by PostgreSQL, we need some workaround + SqlRow row = node.Value as SqlRow; + if (row!=null) { + SqlSelect finalQuery = SqlDml.Select(); + finalQuery.Columns.Add(5); + switch (node.MatchType) { + #region SIMPLE + + case SqlMatchType.None: { + bool existsNull = false; + SqlCase c = SqlDml.Case(); + { + bool subQueryNeeded = true; + //if any of the row elements is NULL then true + if (row.Count > 0) { + bool allLiteral = true; //if true then there is no NULL element + SqlExpression when1 = null; + for (int i = 0; i < row.Count; i++) { + bool elementIsNotLiteral = row[i].NodeType!=SqlNodeType.Literal; + //if the row element is the NULL value + if (row[i].NodeType==SqlNodeType.Null) { + existsNull = true; + break; + } + if (allLiteral && elementIsNotLiteral) + allLiteral = false; + if (elementIsNotLiteral) { + if (when1==null) + when1 = SqlDml.IsNull(row[i]); + else + when1 = when1 || SqlDml.IsNull(row[i]); + } + } + if (existsNull) { + //Some row element is the NULL value, MATCH result is true + subQueryNeeded = false; + } + else if (allLiteral) { + //No row element is the NULL value + subQueryNeeded = true; + } + else //(!whenNotNeeded) + { + //Check if any row element is NULL + c.Add(when1==null ? true : when1, true); + subQueryNeeded = true; + } + } + //find row in subquery + if (subQueryNeeded) { + SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); + SqlSelect q1 = SqlDml.Select(originalQuery); + q1.Columns.Add(1); + { + SqlTableColumnCollection columns = originalQuery.Columns; + SqlExpression where = null; + for (int i = 0; i < columns.Count; i++) { + if (i==0) + where = columns[i]==row[i]; + else + where = where && columns[i]==row[i]; + if (node.Unique) + q1.GroupBy.Add(columns[i]); + } + q1.Where = where; + if (node.Unique) + q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; + } + //c.Add(Sql.Exists(q1), true); + c.Else = SqlDml.Exists(q1); + } + } + if (c.Else==null) + c.Else = false; + if (existsNull) + finalQuery.Where = null; + else if (c.Count > 0) + finalQuery.Where = c; + else + finalQuery.Where = c.Else; + break; + } + + #endregion + + #region FULL + + case SqlMatchType.Full: { + SqlCase c1 = SqlDml.Case(); + { + bool noMoreWhenNeeded = false; + bool allNull = true; + SqlExpression when1 = true; + //if all row elements are null then true + if (row.Count > 0) { + bool whenNotNeeded = false; + for (int i = 0; i < row.Count; i++) { + //if any row element is surely not the NULL value + if (row[i].NodeType==SqlNodeType.Literal) { + whenNotNeeded = true; + break; + } + if (allNull && row[i].NodeType!=SqlNodeType.Null) { + allNull = false; + } + if (i==0) + when1 = SqlDml.IsNull(row[i]); + else + when1 = when1 && SqlDml.IsNull(row[i]); + } + if (allNull) { + when1 = true; + } + if (!whenNotNeeded) + c1.Add(when1, true); + } + if (!noMoreWhenNeeded) { + bool whenNotNeeded = false; + bool allLiteral = true; + SqlExpression when2 = true; + //if no row elements are null then subcase + for (int i = 0; i < row.Count; i++) { + if (row[i].NodeType==SqlNodeType.Null) { + whenNotNeeded = true; + when2 = false; + break; + } + if (allLiteral && row[i].NodeType!=SqlNodeType.Literal) + allLiteral = false; + if (i==0) + when2 = SqlDml.IsNotNull(row[i]); + else + when2 = when2 && SqlDml.IsNotNull(row[i]); + } + if (allLiteral) { + when2 = true; + } + if (!whenNotNeeded) { + //find row in subquery + SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); + SqlSelect q1 = SqlDml.Select(originalQuery); + q1.Columns.Add(1); + { + SqlTableColumnCollection columns = originalQuery.Columns; + SqlExpression where = null; + for (int i = 0; i < columns.Count; i++) { + if (i==0) + where = columns[i]==row[i]; + else + where = where && columns[i]==row[i]; + if (node.Unique) + q1.GroupBy.Add(columns[i]); + } + q1.Where = where; + if (node.Unique) + q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; + } + c1.Add(when2, SqlDml.Exists(q1)); + } + } + //else false + c1.Else = false; + } + if (c1.Count > 0) + finalQuery.Where = c1; + else + finalQuery.Where = false; + break; + } + + #endregion + + #region PARTIAL + + case SqlMatchType.Partial: { + bool allNull = true; + SqlCase c1 = SqlDml.Case(); + { + SqlExpression when1 = true; + //if all row elements are null then true + if (row.Count > 0) { + bool whenNotNeeded = false; + for (int i = 0; i < row.Count; i++) { + //if any row element is surely not the NULL value + if (row[i].NodeType==SqlNodeType.Literal) { + allNull = false; + whenNotNeeded = true; + break; + } + if (allNull && row[i].NodeType!=SqlNodeType.Null) { + allNull = false; + } + if (i==0) + when1 = SqlDml.IsNull(row[i]); + else + when1 = when1 && SqlDml.IsNull(row[i]); + } + if (allNull) { + when1 = true; + } + if (!whenNotNeeded) + c1.Add(when1, true); + } + //otherwise + if (!allNull) { + //find row in subquery + SqlQueryRef originalQuery = SqlDml.QueryRef(node.SubQuery.Query); + SqlSelect q1 = SqlDml.Select(originalQuery); + q1.Columns.Add(8); + { + SqlTableColumnCollection columns = originalQuery.Columns; + SqlExpression where = null; + for (int i = 0; i < columns.Count; i++) { + //if row[i] would be NULL then c3 would result in true, + if (row[i].NodeType!=SqlNodeType.Null) { + SqlCase c3 = SqlDml.Case(); + c3.Add(SqlDml.IsNull(row[i]), true); + c3.Else = row[i]==columns[i]; + + if (where==null) + where = c3; + else + where = where && c3; + } + if (node.Unique) { + SqlCase c4 = SqlDml.Case(); + c4.Add(SqlDml.IsNull(row[i]), 0); + c4.Else = columns[i]; + q1.GroupBy.Add(c4); + } + } + q1.Where = where; + if (node.Unique) + q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; + } + c1.Else = SqlDml.Exists(q1); + } + } + if (c1.Else==null) + c1.Else = false; + if (allNull) + finalQuery.Where = null; + else if (c1.Count > 0) + finalQuery.Where = c1; + else + finalQuery.Where = c1.Else; + } + break; + + #endregion + } + SqlMatch newNode = SqlDml.Match(SqlDml.Row(), SqlDml.SubQuery(finalQuery).Query, node.Unique, node.MatchType); + node.ReplaceWith(newNode); + return "EXISTS(SELECT '"; + } + else { + throw new InvalidOperationException(Strings.ExSqlMatchValueMustBeAnSqlRowInstance); + } + case MatchSection.Specification: + return "' WHERE EXISTS"; + case MatchSection.Exit: + return ")"; + } + return string.Empty; + } + + private SqlSelect CreateSelectForUniqueMatchNoneOrFull(SqlRow row, SqlSelect query) + { + /* + select exists(select 1 + from (original subquery) x + where x.a1=r.a1 and x.a2=r.a2 + group by x.a1, x.a2 + having count(*)=1 + ) } + */ + SqlSelect q0 = SqlDml.Select(); + { + SqlQueryRef originalQuery = SqlDml.QueryRef(query); + SqlSelect q1 = SqlDml.Select(originalQuery); + q1.Columns.Add(1); + q1.Where = true; //initially true + { + int index = 0; + foreach (SqlColumn col in originalQuery.Columns) { + q1.Where = q1.Where && col==row[index]; + q1.GroupBy.Add(col); + index++; + } + q1.Having = SqlDml.Count(SqlDml.Asterisk)==1; + } + q0.Columns.Add(SqlDml.Exists(q1)); + } + return q0; + } + + + public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) + { + switch (section) { + case FunctionCallSection.Entry: + switch (node.FunctionType) { + case SqlFunctionType.CurrentUser: + case SqlFunctionType.SessionUser: + case SqlFunctionType.SystemUser: + case SqlFunctionType.User: + case SqlFunctionType.CurrentDate: + case SqlFunctionType.CurrentTimeStamp: + return Translate(node.FunctionType); + } + break; + } + + return base.Translate(context, node, section, position); + } + + public override string Translate(SqlCompilerContext context, SqlUnary node, NodeSection section) + { + //substitute UNIQUE predicate with a more complex EXISTS predicate, + //because UNIQUE is not supported + + if (node.NodeType==SqlNodeType.Unique) { + var origSubselect = node.Operand as SqlSubQuery; + if (origSubselect!=null) { + SqlQueryRef origQuery = SqlDml.QueryRef(origSubselect.Query); + SqlSelect existsOp = SqlDml.Select(origQuery); + existsOp.Columns.Add(1); + existsOp.Where = true; + foreach (SqlColumn col in origQuery.Columns) { + existsOp.Where = existsOp.Where && SqlDml.IsNotNull(col); + existsOp.GroupBy.Add(col); + } + existsOp.Having = SqlDml.Count(SqlDml.Asterisk) > 1; + existsOp.Limit = 1; + + node.ReplaceWith(SqlDml.Not(SqlDml.Exists(existsOp))); + } + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) + { + if (section==NodeSection.Entry) + return "nextval('"; + if (section==NodeSection.Exit) + return "')"; + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + // casting this way behaves differently: -32768::int2 is out of range ! We need (-32768)::int2 + switch (section) { + case NodeSection.Entry: + return "("; + + case NodeSection.Exit: + return ")::" + Translate(node.Type); + } + return string.Empty; + } + + public override string Translate(SqlDateTimePart part) + { + switch (part) { + case SqlDateTimePart.Millisecond: + return "MILLISECONDS"; + case SqlDateTimePart.DayOfYear: + return "DOY"; + case SqlDateTimePart.DayOfWeek: + return "DOW"; + } + + return base.Translate(part); + } + + /* + public override string Translate(SqlDateTimeOffsetPart part) + { + switch (part) { + case SqlDateTimeOffsetPart.Millisecond: + return "MILLISECONDS"; + case SqlDateTimeOffsetPart.DayOfYear: + return "DOY"; + case SqlDateTimeOffsetPart.DayOfWeek: + return "DOW"; + case SqlDateTimeOffsetPart.Offset: + return "TIMEZONE"; + case SqlDateTimeOffsetPart.TimeZoneHour: + return "TIMEZONE_HOUR"; + case SqlDateTimeOffsetPart.TimeZoneMinute: + return "TIMEZONE_MINUTE"; + } + + return base.Translate(part); + } + */ + + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.SkipLocked) + || lockType.Supports(SqlLockType.Shared) + || lockType.Supports(SqlLockType.ThrowIfLocked)) + return base.Translate(lockType); + return "FOR UPDATE"; + } + + protected virtual string TranslateClrType(Type type) + { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + return "bool"; + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + return "int2"; + case TypeCode.UInt16: + case TypeCode.Int32: + return "int4"; + case TypeCode.UInt32: + case TypeCode.Int64: + return "int8"; + case TypeCode.UInt64: + case TypeCode.Decimal: + return "numeric"; + case TypeCode.Single: + return "float4"; + case TypeCode.Double: + return "float8"; + case TypeCode.Char: + case TypeCode.String: + return "text"; + case TypeCode.DateTime: + return "timestamp"; + default: + if (type==typeof (TimeSpan)) + return "interval"; + if (type==typeof(Guid)) + return "bytea"; + return "text"; + } + } + + private static string TranslateByteArrayLiteral(byte[] array) + { + if (array.Length==0) + return "''::bytea"; + + var chars = new char[1 + 5 * array.Length + 8]; + chars[0] = '\''; + chars[chars.Length - 1] = 'a'; + chars[chars.Length - 2] = 'e'; + chars[chars.Length - 3] = 't'; + chars[chars.Length - 4] = 'y'; + chars[chars.Length - 5] = 'b'; + chars[chars.Length - 6] = ':'; + chars[chars.Length - 7] = ':'; + chars[chars.Length - 8] = '\''; + + for (int n = 1, i = 0; i < array.Length; i++, n += 5) { + chars[n] = chars[n + 1] = '\\'; + chars[n + 2] = (char) ('0' + (7 & (array[i] >> 6))); + chars[n + 3] = (char) ('0' + (7 & (array[i] >> 3))); + chars[n + 4] = (char) ('0' + (7 & (array[i] >> 0))); + } + + return new string(chars); + } + + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs index 2c904f6d00..ae213883c3 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs @@ -1,221 +1,221 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using System.Data; -using System.Data.Common; -using System.Security; -using Npgsql; -using NpgsqlTypes; - - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 -{ - internal class TypeMapper : Sql.TypeMapper - { - public override bool IsParameterCastRequired(Type type) - { - switch (Type.GetTypeCode(type)) { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.DateTime: - return true; - } - //if (type==typeof (DateTimeOffset)) - // return true; - if (type==typeof(Guid)) - return true; - if (type==typeof(TimeSpan)) - return true; - if (type==typeof(byte[])) - return true; - return false; - } - - public override void BindByte(DbParameter parameter, object value) - { - if(value==null) - base.BindByte(parameter, value); - else - base.BindByte(parameter, Convert.ToByte(value)); - } - - public override void BindShort(DbParameter parameter, object value) - { - if (value==null) - base.BindShort(parameter, value); - else - base.BindShort(parameter, Convert.ToInt16(value)); - } - - public override void BindInt(DbParameter parameter, object value) - { - if (value==null) - base.BindInt(parameter, value); - else - base.BindInt(parameter, Convert.ToInt32(value)); - } - - public override void BindLong(DbParameter parameter, object value) - { - if (value==null) - base.BindLong(parameter, value); - else - base.BindLong(parameter, Convert.ToInt64(value)); - } - - public override void BindSByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int16; - if (value==null) - parameter.Value = DBNull.Value; - else - parameter.Value = Convert.ToInt16(value); - } - - public override void BindUShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int32; - if (value==null) - parameter.Value = DBNull.Value; - else - parameter.Value = Convert.ToInt32(value); - } - - public override void BindUInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int64; - if (value==null) - parameter.Value = DBNull.Value; - else - parameter.Value = Convert.ToInt64(value); - } - - public override void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - if (value == null) - parameter.Value = DBNull.Value; - else - parameter.Value = Convert.ToDecimal(value); - } - - [SecuritySafeCritical] - public override void BindTimeSpan(DbParameter parameter, object value) - { - var nativeParameter = (NpgsqlParameter) parameter; - nativeParameter.NpgsqlDbType = NpgsqlDbType.Interval; - nativeParameter.Value = value!=null - ? (object) new NpgsqlTimeSpan((TimeSpan) value) - : DBNull.Value; - } - - public override void BindGuid(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); - } - - /* - [SecuritySafeCritical] - public override void BindDateTimeOffset(DbParameter parameter, object value) - { - var nativeParameter = (NpgsqlParameter) parameter; - nativeParameter.NpgsqlDbType = NpgsqlDbType.TimestampTZ; - nativeParameter.NpgsqlValue = value!=null - ? (object)(NpgsqlTimeStampTZ) (DateTimeOffset) value - : (object)DBNull.Value; - } - */ - - public override SqlValueType MapByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - public override SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - public override SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int32); - } - - public override SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - public override SqlValueType MapULong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal, 20, 0); - } - - public override SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarChar, 32); - } - - public override SqlValueType MapTimeSpan(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Interval); - } - - public override object ReadByte(DbDataReader reader, int index) - { - return Convert.ToByte(reader[index]); - } - - public override object ReadGuid(DbDataReader reader, int index) - { - return SqlHelper.GuidFromString(reader.GetString(index)); - } - - [SecuritySafeCritical] - public override object ReadTimeSpan(DbDataReader reader, int index) - { - var nativeReader = (NpgsqlDataReader) reader; - return (TimeSpan) nativeReader.GetInterval(index); - } - - public override object ReadDecimal(DbDataReader reader, int index) - { - var nativeReader = (NpgsqlDataReader) reader; - return nativeReader.GetDecimal(index); - } - - /* - [SecuritySafeCritical] - public override object ReadDateTimeOffset(DbDataReader reader, int index) - { - var nativeReader = (NpgsqlDataReader)reader; - return (DateTimeOffset)nativeReader.GetTimeStampTZ(index); - } - */ - - protected virtual SqlValueType ReduceDecimalScale(SqlValueType sqlType, int newScale) - { - if (sqlType.Type!=SqlType.Decimal) - return sqlType; - if (!sqlType.Precision.HasValue) - return sqlType; - return new SqlValueType(sqlType.Type, sqlType.Precision.Value, newScale); - } - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using System.Data; +using System.Data.Common; +using System.Security; +using Npgsql; +using NpgsqlTypes; + + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_0 +{ + internal class TypeMapper : Sql.TypeMapper + { + public override bool IsParameterCastRequired(Type type) + { + switch (Type.GetTypeCode(type)) { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.DateTime: + return true; + } + //if (type==typeof (DateTimeOffset)) + // return true; + if (type==typeof(Guid)) + return true; + if (type==typeof(TimeSpan)) + return true; + if (type==typeof(byte[])) + return true; + return false; + } + + public override void BindByte(DbParameter parameter, object value) + { + if(value==null) + base.BindByte(parameter, value); + else + base.BindByte(parameter, Convert.ToByte(value)); + } + + public override void BindShort(DbParameter parameter, object value) + { + if (value==null) + base.BindShort(parameter, value); + else + base.BindShort(parameter, Convert.ToInt16(value)); + } + + public override void BindInt(DbParameter parameter, object value) + { + if (value==null) + base.BindInt(parameter, value); + else + base.BindInt(parameter, Convert.ToInt32(value)); + } + + public override void BindLong(DbParameter parameter, object value) + { + if (value==null) + base.BindLong(parameter, value); + else + base.BindLong(parameter, Convert.ToInt64(value)); + } + + public override void BindSByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int16; + if (value==null) + parameter.Value = DBNull.Value; + else + parameter.Value = Convert.ToInt16(value); + } + + public override void BindUShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int32; + if (value==null) + parameter.Value = DBNull.Value; + else + parameter.Value = Convert.ToInt32(value); + } + + public override void BindUInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int64; + if (value==null) + parameter.Value = DBNull.Value; + else + parameter.Value = Convert.ToInt64(value); + } + + public override void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + if (value == null) + parameter.Value = DBNull.Value; + else + parameter.Value = Convert.ToDecimal(value); + } + + [SecuritySafeCritical] + public override void BindTimeSpan(DbParameter parameter, object value) + { + var nativeParameter = (NpgsqlParameter) parameter; + nativeParameter.NpgsqlDbType = NpgsqlDbType.Interval; + nativeParameter.Value = value!=null + ? (object) new NpgsqlTimeSpan((TimeSpan) value) + : DBNull.Value; + } + + public override void BindGuid(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + parameter.Value = value==null ? (object) DBNull.Value : SqlHelper.GuidToString((Guid) value); + } + + /* + [SecuritySafeCritical] + public override void BindDateTimeOffset(DbParameter parameter, object value) + { + var nativeParameter = (NpgsqlParameter) parameter; + nativeParameter.NpgsqlDbType = NpgsqlDbType.TimestampTZ; + nativeParameter.NpgsqlValue = value!=null + ? (object)(NpgsqlTimeStampTZ) (DateTimeOffset) value + : (object)DBNull.Value; + } + */ + + public override SqlValueType MapByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + public override SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + public override SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int32); + } + + public override SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + public override SqlValueType MapULong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal, 20, 0); + } + + public override SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarChar, 32); + } + + public override SqlValueType MapTimeSpan(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Interval); + } + + public override object ReadByte(DbDataReader reader, int index) + { + return Convert.ToByte(reader[index]); + } + + public override object ReadGuid(DbDataReader reader, int index) + { + return SqlHelper.GuidFromString(reader.GetString(index)); + } + + [SecuritySafeCritical] + public override object ReadTimeSpan(DbDataReader reader, int index) + { + var nativeReader = (NpgsqlDataReader) reader; + return (TimeSpan) nativeReader.GetInterval(index); + } + + public override object ReadDecimal(DbDataReader reader, int index) + { + var nativeReader = (NpgsqlDataReader) reader; + return nativeReader.GetDecimal(index); + } + + /* + [SecuritySafeCritical] + public override object ReadDateTimeOffset(DbDataReader reader, int index) + { + var nativeReader = (NpgsqlDataReader)reader; + return (DateTimeOffset)nativeReader.GetTimeStampTZ(index); + } + */ + + protected virtual SqlValueType ReduceDecimalScale(SqlValueType sqlType, int newScale) + { + if (sqlType.Type!=SqlType.Decimal) + return sqlType; + if (!sqlType.Precision.HasValue) + return sqlType; + return new SqlValueType(sqlType.Type, sqlType.Precision.Value, newScale); + } + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Compiler.cs index 655fd86745..5b6ed87667 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Compiler.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.16 - -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class Compiler : v8_0.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.16 + +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class Compiler : v8_0.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Driver.cs index 250507a200..6b038e0c38 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Driver.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using Npgsql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class Driver : v8_0.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using Npgsql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class Driver : v8_0.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Extractor.cs index e6d8e7a75f..5148fcfc26 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Extractor.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class Extractor : v8_0.Extractor - { - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class Extractor : v8_0.Extractor + { + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/ServerInfoProvider.cs index 5267896643..a4caab3c92 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/ServerInfoProvider.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class ServerInfoProvider : v8_0.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class ServerInfoProvider : v8_0.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Translator.cs index a369100362..c8fefcd4b9 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/Translator.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class Translator : v8_0.Translator - { - public override string Translate(SqlCompilerContext context, SqlContinue node) - { - return "CONTINUE"; - } - - public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) - { - switch (node.IntervalPart) { - case SqlIntervalPart.Day: - case SqlIntervalPart.Hour: - break; - default: - return base.Translate(context, node, section); - } - switch (section) { - case ExtractSection.From: - return "from justify_hours("; - case ExtractSection.Exit: - return "))"; - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.SkipLocked)) - return base.Translate(lockType); - return string.Format("FOR {0}{1}", - lockType.Supports(SqlLockType.Shared) ? "SHARE" : "UPDATE", - lockType.Supports(SqlLockType.ThrowIfLocked) ? " NOWAIT" : ""); - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class Translator : v8_0.Translator + { + public override string Translate(SqlCompilerContext context, SqlContinue node) + { + return "CONTINUE"; + } + + public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section) + { + switch (node.IntervalPart) { + case SqlIntervalPart.Day: + case SqlIntervalPart.Hour: + break; + default: + return base.Translate(context, node, section); + } + switch (section) { + case ExtractSection.From: + return "from justify_hours("; + case ExtractSection.Exit: + return "))"; + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.SkipLocked)) + return base.Translate(lockType); + return string.Format("FOR {0}{1}", + lockType.Supports(SqlLockType.Shared) ? "SHARE" : "UPDATE", + lockType.Supports(SqlLockType.ThrowIfLocked) ? " NOWAIT" : ""); + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/TypeMapper.cs index 06eaf7a817..d5a7c70072 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_1/TypeMapper.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 -{ - internal class TypeMapper : v8_0.TypeMapper - { - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_1 +{ + internal class TypeMapper : v8_0.TypeMapper + { + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Compiler.cs index 67c5c6322f..cc2540ce52 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Compiler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using System.Diagnostics; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class Compiler : v8_1.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using System.Diagnostics; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class Compiler : v8_1.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Driver.cs index 157acdcc4f..ca00d2714f 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Driver.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using Npgsql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class Driver : v8_1.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using Npgsql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class Driver : v8_1.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Extractor.cs index 78f96836e6..8eec302a76 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Extractor.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data.Common; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class Extractor : v8_1.Extractor - { - protected override void BuildPgCatalogSchema(Schema schema) - { - base.BuildPgCatalogSchema(schema); - var table = schema.Tables["pg_class"]; - // fillfactor extension - CreateTextColumn(table, "reloptions"); - } - - protected RelOptions ParseRelOptions(object value) - { - var result = new RelOptions(); - var options = value as string[]; - if (options==null) - return result; - for (int i = 0; i < options.Length; i++) { - options[i] = options[i].Trim(); - string optionName; - string optionValue = ""; - int pos = options[i].IndexOf('='); - if (pos >= 0) { - optionName = options[i].Substring(0, pos).ToLower(); - optionValue = options[i].Substring(pos + 1); - } - else { - optionName = options[i]; - } - ReadRelOption(optionName, optionValue, result); - } - return result; - } - - /// - /// Reads a certain reloption value. - /// - /// The name of the option in lowercase - /// The value of the option, maybe empty, but not null - /// - protected virtual void ReadRelOption(string optionName, string optionValue, RelOptions options) - { - if (optionName=="fillfactor") { - byte value = 0; - Byte.TryParse(optionValue, out value); - if (value > 0) - options.FillFactor = value; - } - } - - - protected override void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) - { - query.Columns.Add(rel["reloptions"]); - } - - protected override void ReadSpecialIndexProperties(DbDataReader dr, Index i) - { - base.ReadSpecialIndexProperties(dr, i); - if (dr["reloptions"]!=DBNull.Value) { - RelOptions ro = ParseRelOptions(dr["reloptions"]); - i.FillFactor = ro.FillFactor; - } - } - - // Constructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data.Common; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class Extractor : v8_1.Extractor + { + protected override void BuildPgCatalogSchema(Schema schema) + { + base.BuildPgCatalogSchema(schema); + var table = schema.Tables["pg_class"]; + // fillfactor extension + CreateTextColumn(table, "reloptions"); + } + + protected RelOptions ParseRelOptions(object value) + { + var result = new RelOptions(); + var options = value as string[]; + if (options==null) + return result; + for (int i = 0; i < options.Length; i++) { + options[i] = options[i].Trim(); + string optionName; + string optionValue = ""; + int pos = options[i].IndexOf('='); + if (pos >= 0) { + optionName = options[i].Substring(0, pos).ToLower(); + optionValue = options[i].Substring(pos + 1); + } + else { + optionName = options[i]; + } + ReadRelOption(optionName, optionValue, result); + } + return result; + } + + /// + /// Reads a certain reloption value. + /// + /// The name of the option in lowercase + /// The value of the option, maybe empty, but not null + /// + protected virtual void ReadRelOption(string optionName, string optionValue, RelOptions options) + { + if (optionName=="fillfactor") { + byte value = 0; + Byte.TryParse(optionValue, out value); + if (value > 0) + options.FillFactor = value; + } + } + + + protected override void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) + { + query.Columns.Add(rel["reloptions"]); + } + + protected override void ReadSpecialIndexProperties(DbDataReader dr, Index i) + { + base.ReadSpecialIndexProperties(dr, i); + if (dr["reloptions"]!=DBNull.Value) { + RelOptions ro = ParseRelOptions(dr["reloptions"]); + i.FillFactor = ro.FillFactor; + } + } + + // Constructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/ServerInfoProvider.cs index 51f722539a..2723bcb8b2 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/ServerInfoProvider.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class ServerInfoProvider : v8_1.ServerInfoProvider - { - protected override IndexFeatures GetIndexFeatures() - { - return base.GetIndexFeatures() | IndexFeatures.FillFactor; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class ServerInfoProvider : v8_1.ServerInfoProvider + { + protected override IndexFeatures GetIndexFeatures() + { + return base.GetIndexFeatures() | IndexFeatures.FillFactor; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Translator.cs index 2945d569ab..97ccc0c6a9 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/Translator.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Diagnostics; -using System.Text; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class Translator : v8_1.Translator - { - [DebuggerStepThrough] - public override string QuoteString(string str) - { - return "E'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; - } - - protected override void AppendIndexStorageParameters(StringBuilder builder, Index index) - { - if (index.FillFactor!=null) - builder.AppendFormat("WITH(FILLFACTOR={0})", index.FillFactor); - } - - public override string Translate(SqlFunctionType type) - { - switch (type) { - //date - case SqlFunctionType.CurrentDate: - return "date_trunc('day', clock_timestamp())"; - case SqlFunctionType.CurrentTimeStamp: - return "clock_timestamp()"; - default: - return base.Translate(type); - } - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Diagnostics; +using System.Text; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class Translator : v8_1.Translator + { + [DebuggerStepThrough] + public override string QuoteString(string str) + { + return "E'" + str.Replace("'", "''").Replace(@"\", @"\\").Replace("\0", string.Empty) + "'"; + } + + protected override void AppendIndexStorageParameters(StringBuilder builder, Index index) + { + if (index.FillFactor!=null) + builder.AppendFormat("WITH(FILLFACTOR={0})", index.FillFactor); + } + + public override string Translate(SqlFunctionType type) + { + switch (type) { + //date + case SqlFunctionType.CurrentDate: + return "date_trunc('day', clock_timestamp())"; + case SqlFunctionType.CurrentTimeStamp: + return "clock_timestamp()"; + default: + return base.Translate(type); + } + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/TypeMapper.cs index f124e2fc53..9b299d2cb4 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_2/TypeMapper.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 -{ - internal class TypeMapper : v8_1.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_2 +{ + internal class TypeMapper : v8_1.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Compiler.cs index 5677725398..5b12e6a21b 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Compiler.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using System.Linq; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using Xtensive.Sql.Drivers.PostgreSql.Resources; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class Compiler : v8_2.Compiler - { - public override void Visit(SqlCreateIndex node, IndexColumn item) - { - if (!node.Index.IsFullText) - base.Visit(node, item); - // FullText builds expression instead of list of columns in Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - } - - - public override void Visit(SqlFreeTextTable node) - { - if (node.TargetColumns.Count!=1 || node.TargetColumns[0]!=node.TargetTable.Asterisk) - throw new NotSupportedException(Strings.ExFreeTextSearchOnCustomColumnsNotSupported); - - FullTextIndex fullTextIndex = node.TargetTable.DataTable.Indexes.OfType().Single(); - string alias = context.TableNameProvider.GetName(node); - string vector = ((Translator) translator).GetFulltextVector(context, fullTextIndex); - string tableName = translator.QuoteIdentifier(node.TargetTable.Name); - int internalColumnIndex = 0; - while (node.Columns["column" + internalColumnIndex]!=null) - internalColumnIndex++; - string vectorName = translator.QuoteIdentifier("column" + internalColumnIndex); - internalColumnIndex++; - while (node.Columns["column" + internalColumnIndex]!=null) - internalColumnIndex++; - string queryName = translator.QuoteIdentifier("column" + internalColumnIndex); - - context.Output.AppendText("(SELECT "); - for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++) { - if (columnIndex!=0) - context.Output.AppendText(translator.ColumnDelimiter); - context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name)); - } - context.Output.AppendText(translator.ColumnDelimiter); - context.Output.AppendText("ts_rank_cd("); - context.Output.AppendText(vectorName); - context.Output.AppendText(translator.ArgumentDelimiter); - context.Output.AppendText(queryName); - context.Output.AppendText(") AS"); - context.Output.AppendText(translator.QuoteIdentifier(node.Columns[node.Columns.Count - 1].Name)); - context.Output.AppendText(" FROM (SELECT "); - for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++) { - if (columnIndex!=0) - context.Output.AppendText(translator.ColumnDelimiter); - context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name)); - } - context.Output.AppendText(translator.ColumnDelimiter); - context.Output.AppendText(string.Format("{0} AS {1}", vector, vectorName)); - context.Output.AppendText(translator.ColumnDelimiter); - - var languages = fullTextIndex - .Columns - .SelectMany(column => column.Languages) - .Select(language => language.Name) - .Distinct() - .ToList(); - context.Output.AppendText("("); - for (int i = 0; i < languages.Count; i++) { - if (i!=0) - context.Output.AppendText(" || "); - var language = languages[i]; - context.Output.AppendText("to_tsquery('"); - context.Output.AppendText(language); - context.Output.AppendText("'::regconfig, "); - context.Output.AppendText("replace(trim(regexp_replace("); - node.FreeText.AcceptVisitor(this); - context.Output.AppendText(@",'\\W+', ' ', 'g')),' ', '|')"); - context.Output.AppendText(")"); - } - context.Output.AppendText(")"); - - context.Output.AppendText(string.Format(" AS {0}", queryName)); - context.Output.AppendText(string.Format(" FROM {0}) AS {1} WHERE {2} @@ {3})", tableName, alias, vectorName, queryName)); - } - - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using System.Linq; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using Xtensive.Sql.Drivers.PostgreSql.Resources; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class Compiler : v8_2.Compiler + { + public override void Visit(SqlCreateIndex node, IndexColumn item) + { + if (!node.Index.IsFullText) + base.Visit(node, item); + // FullText builds expression instead of list of columns in Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + } + + + public override void Visit(SqlFreeTextTable node) + { + if (node.TargetColumns.Count!=1 || node.TargetColumns[0]!=node.TargetTable.Asterisk) + throw new NotSupportedException(Strings.ExFreeTextSearchOnCustomColumnsNotSupported); + + FullTextIndex fullTextIndex = node.TargetTable.DataTable.Indexes.OfType().Single(); + string alias = context.TableNameProvider.GetName(node); + string vector = ((Translator) translator).GetFulltextVector(context, fullTextIndex); + string tableName = translator.QuoteIdentifier(node.TargetTable.Name); + int internalColumnIndex = 0; + while (node.Columns["column" + internalColumnIndex]!=null) + internalColumnIndex++; + string vectorName = translator.QuoteIdentifier("column" + internalColumnIndex); + internalColumnIndex++; + while (node.Columns["column" + internalColumnIndex]!=null) + internalColumnIndex++; + string queryName = translator.QuoteIdentifier("column" + internalColumnIndex); + + context.Output.AppendText("(SELECT "); + for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++) { + if (columnIndex!=0) + context.Output.AppendText(translator.ColumnDelimiter); + context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name)); + } + context.Output.AppendText(translator.ColumnDelimiter); + context.Output.AppendText("ts_rank_cd("); + context.Output.AppendText(vectorName); + context.Output.AppendText(translator.ArgumentDelimiter); + context.Output.AppendText(queryName); + context.Output.AppendText(") AS"); + context.Output.AppendText(translator.QuoteIdentifier(node.Columns[node.Columns.Count - 1].Name)); + context.Output.AppendText(" FROM (SELECT "); + for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++) { + if (columnIndex!=0) + context.Output.AppendText(translator.ColumnDelimiter); + context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name)); + } + context.Output.AppendText(translator.ColumnDelimiter); + context.Output.AppendText(string.Format("{0} AS {1}", vector, vectorName)); + context.Output.AppendText(translator.ColumnDelimiter); + + var languages = fullTextIndex + .Columns + .SelectMany(column => column.Languages) + .Select(language => language.Name) + .Distinct() + .ToList(); + context.Output.AppendText("("); + for (int i = 0; i < languages.Count; i++) { + if (i!=0) + context.Output.AppendText(" || "); + var language = languages[i]; + context.Output.AppendText("to_tsquery('"); + context.Output.AppendText(language); + context.Output.AppendText("'::regconfig, "); + context.Output.AppendText("replace(trim(regexp_replace("); + node.FreeText.AcceptVisitor(this); + context.Output.AppendText(@",'\\W+', ' ', 'g')),' ', '|')"); + context.Output.AppendText(")"); + } + context.Output.AppendText(")"); + + context.Output.AppendText(string.Format(" AS {0}", queryName)); + context.Output.AppendText(string.Format(" FROM {0}) AS {1} WHERE {2} @@ {3})", tableName, alias, vectorName, queryName)); + } + + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Driver.cs index d58ae41b3d..c12a2bfe45 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Driver.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using Npgsql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class Driver : v8_2.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using Npgsql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class Driver : v8_2.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Extractor.cs index 40e205c3b1..0bf2ec674c 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Extractor.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data.Common; -using Xtensive.Sql.Model; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class Extractor : v8_2.Extractor - { - private const int indoptionDesc = 0x0001; - - protected override void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) - { - base.AddSpecialIndexQueryColumns(query, spc, rel, ind, depend); - query.Columns.Add(ind["indoption"]); - } - - protected override void ReadSpecialIndexProperties(DbDataReader dr, Index i) - { - base.ReadSpecialIndexProperties(dr, i); - var indoption = (short [])dr["indoption"]; - for (int j = 0; j < indoption.Length; j++) { - int option = indoption[j]; - if ((option & indoptionDesc)==indoptionDesc) - i.Columns[j].Ascending = false; - } - } - - // Consructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data.Common; +using Xtensive.Sql.Model; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class Extractor : v8_2.Extractor + { + private const int indoptionDesc = 0x0001; + + protected override void AddSpecialIndexQueryColumns(SqlSelect query, SqlTableRef spc, SqlTableRef rel, SqlTableRef ind, SqlTableRef depend) + { + base.AddSpecialIndexQueryColumns(query, spc, rel, ind, depend); + query.Columns.Add(ind["indoption"]); + } + + protected override void ReadSpecialIndexProperties(DbDataReader dr, Index i) + { + base.ReadSpecialIndexProperties(dr, i); + var indoption = (short [])dr["indoption"]; + for (int j = 0; j < indoption.Length; j++) { + int option = indoption[j]; + if ((option & indoptionDesc)==indoptionDesc) + i.Columns[j].Ascending = false; + } + } + + // Consructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/ServerInfoProvider.cs index 7f83e78e60..51dcfb0d3a 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/ServerInfoProvider.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class ServerInfoProvider : v8_2.ServerInfoProvider - { - protected override IndexFeatures GetIndexFeatures() - { - return base.GetIndexFeatures() | IndexFeatures.SortOrder | IndexFeatures.FullText; - } - - public override FullTextSearchInfo GetFullTextInfo() - { - return new FullTextSearchInfo {Features = FullTextSearchFeatures.Full}; - } - - public override DataTypeCollection GetDataTypesInfo() - { - var commonFeatures = - DataTypeFeatures.Clustering | - DataTypeFeatures.Grouping | - DataTypeFeatures.Indexing | - DataTypeFeatures.KeyConstraint | - DataTypeFeatures.Nullable | - DataTypeFeatures.Ordering | - DataTypeFeatures.Multiple | - DataTypeFeatures.Default; - - - DataTypeCollection dtc = base.GetDataTypesInfo(); - dtc.Guid = DataTypeInfo.Regular(SqlType.Guid, commonFeatures, "uuid"); - - return dtc; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class ServerInfoProvider : v8_2.ServerInfoProvider + { + protected override IndexFeatures GetIndexFeatures() + { + return base.GetIndexFeatures() | IndexFeatures.SortOrder | IndexFeatures.FullText; + } + + public override FullTextSearchInfo GetFullTextInfo() + { + return new FullTextSearchInfo {Features = FullTextSearchFeatures.Full}; + } + + public override DataTypeCollection GetDataTypesInfo() + { + var commonFeatures = + DataTypeFeatures.Clustering | + DataTypeFeatures.Grouping | + DataTypeFeatures.Indexing | + DataTypeFeatures.KeyConstraint | + DataTypeFeatures.Nullable | + DataTypeFeatures.Ordering | + DataTypeFeatures.Multiple | + DataTypeFeatures.Default; + + + DataTypeCollection dtc = base.GetDataTypesInfo(); + dtc.Guid = DataTypeInfo.Regular(SqlType.Guid, commonFeatures, "uuid"); + + return dtc; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs index 1dee0ce77a..9e756febf1 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Text; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using System.Linq; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class Translator : v8_2.Translator - { - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - var index = node.Index; - if (!index.IsFullText) - return base.Translate(context, node, section); - switch (section) { - case CreateIndexSection.Entry: - return string.Format("CREATE INDEX {0} ON {1} USING gin (" - , QuoteIdentifier(index.Name) - , Translate(context, index.DataTable)); - case CreateIndexSection.ColumnsExit: - // Add actual columns list - return string.Concat(GetFulltextVector(context, (FullTextIndex) node.Index), base.Translate(context, node, section)); - default: - return base.Translate(context, node, section); - } - } - - public override string Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) - { - switch (section) { - case NodeSection.Exit: - return (node.Ascending) ? "ASC NULLS FIRST" : "DESC NULLS LAST"; - } - return string.Empty; - } - - internal protected string GetFulltextVector(SqlCompilerContext context, FullTextIndex index) - { - var sb = new StringBuilder(); - sb.Append("("); - var languageGroups = index - .Columns - .SelectMany(column => column.Languages, (column, language) => new {column, language}) - .GroupBy(pair => pair.language, pair => pair.column) - .ToList(); - for (int i = 0; i < languageGroups.Count; i++) { - if (i!=0) - sb.Append(" || "); - var group = languageGroups[i]; - var columns = group.ToList(); - sb.Append("to_tsvector('"); - sb.Append(group.Key.Name); - sb.Append("'::regconfig, "); - for (int j = 0; j < columns.Count; j++) { - if (j!=0) - sb.Append(" || ' '::text"); - IndexColumn column = columns[j]; - sb.AppendFormat("({0})::text", QuoteIdentifier(column.Name)); - } - sb.Append(")"); - } - sb.Append(")"); - return sb.ToString(); - } - - protected override string TranslateClrType(Type type) - { - if (type == typeof(Guid)) - return "uuid"; - return base.TranslateClrType(type); - } - - // Constuctors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Text; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using System.Linq; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class Translator : v8_2.Translator + { + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + var index = node.Index; + if (!index.IsFullText) + return base.Translate(context, node, section); + switch (section) { + case CreateIndexSection.Entry: + return string.Format("CREATE INDEX {0} ON {1} USING gin (" + , QuoteIdentifier(index.Name) + , Translate(context, index.DataTable)); + case CreateIndexSection.ColumnsExit: + // Add actual columns list + return string.Concat(GetFulltextVector(context, (FullTextIndex) node.Index), base.Translate(context, node, section)); + default: + return base.Translate(context, node, section); + } + } + + public override string Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) + { + switch (section) { + case NodeSection.Exit: + return (node.Ascending) ? "ASC NULLS FIRST" : "DESC NULLS LAST"; + } + return string.Empty; + } + + internal protected string GetFulltextVector(SqlCompilerContext context, FullTextIndex index) + { + var sb = new StringBuilder(); + sb.Append("("); + var languageGroups = index + .Columns + .SelectMany(column => column.Languages, (column, language) => new {column, language}) + .GroupBy(pair => pair.language, pair => pair.column) + .ToList(); + for (int i = 0; i < languageGroups.Count; i++) { + if (i!=0) + sb.Append(" || "); + var group = languageGroups[i]; + var columns = group.ToList(); + sb.Append("to_tsvector('"); + sb.Append(group.Key.Name); + sb.Append("'::regconfig, "); + for (int j = 0; j < columns.Count; j++) { + if (j!=0) + sb.Append(" || ' '::text"); + IndexColumn column = columns[j]; + sb.AppendFormat("({0})::text", QuoteIdentifier(column.Name)); + } + sb.Append(")"); + } + sb.Append(")"); + return sb.ToString(); + } + + protected override string TranslateClrType(Type type) + { + if (type == typeof(Guid)) + return "uuid"; + return base.TranslateClrType(type); + } + + // Constuctors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/TypeMapper.cs index d3a3ab6b76..6c5246a8fa 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/TypeMapper.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System; -using System.Data; -using System.Data.Common; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 -{ - internal class TypeMapper : v8_2.TypeMapper - { - public override void BindGuid(DbParameter parameter, object value) - { - parameter.DbType = DbType.Guid; - parameter.Value = value ?? DBNull.Value; - } - - public override object ReadGuid(DbDataReader reader, int index) - { - return reader.GetGuid(index); - } - - public override SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Guid); - } - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System; +using System.Data; +using System.Data.Common; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_3 +{ + internal class TypeMapper : v8_2.TypeMapper + { + public override void BindGuid(DbParameter parameter, object value) + { + parameter.DbType = DbType.Guid; + parameter.Value = value ?? DBNull.Value; + } + + public override object ReadGuid(DbDataReader reader, int index) + { + return reader.GetGuid(index); + } + + public override SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Guid); + } + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Compiler.cs index 0aa4808005..9cd0955084 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.07 - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class Compiler : v8_3.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.07 + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class Compiler : v8_3.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Driver.cs index cad577ce3b..a5431440a5 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kryuchkov -// Created: 2009.07.07 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class Driver : v8_3.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kryuchkov +// Created: 2009.07.07 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class Driver : v8_3.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Extractor.cs index 4f5a991a1b..ff12789e2d 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Extractor.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kryuchkov -// Created: 2009.07.07 - -using System; -using System.Data.Common; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class Extractor : v8_3.Extractor - { - protected override void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) - { - base.ReadSequenceDescriptor(reader, descriptor); - descriptor.StartValue = Convert.ToInt64(reader["start_value"]); - } - - // Consructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kryuchkov +// Created: 2009.07.07 + +using System; +using System.Data.Common; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class Extractor : v8_3.Extractor + { + protected override void ReadSequenceDescriptor(DbDataReader reader, SequenceDescriptor descriptor) + { + base.ReadSequenceDescriptor(reader, descriptor); + descriptor.StartValue = Convert.ToInt64(reader["start_value"]); + } + + // Consructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/ServerInfoProvider.cs index 07a1f58ffd..f073f341fc 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/ServerInfoProvider.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kryuchkov -// Created: 2009.07.07 - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class ServerInfoProvider : v8_3.ServerInfoProvider - { - public override QueryInfo GetQueryInfo() - { - var queryInfo = base.GetQueryInfo(); - queryInfo.Features |= QueryFeatures.RowNumber; - return queryInfo; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kryuchkov +// Created: 2009.07.07 + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class ServerInfoProvider : v8_3.ServerInfoProvider + { + public override QueryInfo GetQueryInfo() + { + var queryInfo = base.GetQueryInfo(); + queryInfo.Features |= QueryFeatures.RowNumber; + return queryInfo; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Translator.cs index 2b973c5d12..bdc091fba1 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/Translator.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kryuchkov -// Created: 2009.07.07 - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class Translator : v8_3.Translator - { - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kryuchkov +// Created: 2009.07.07 + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class Translator : v8_3.Translator + { + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/TypeMapper.cs index edd1b00640..4c6d824843 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_4/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 -{ - internal class TypeMapper : v8_3.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +namespace Xtensive.Sql.Drivers.PostgreSql.v8_4 +{ + internal class TypeMapper : v8_3.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Compiler.cs index 36b4b3eacc..6cb24050a9 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class Compiler : v8_4.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class Compiler : v8_4.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Driver.cs index 1a1dd2ef00..56989699b0 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class Driver : v8_4.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class Driver : v8_4.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Extractor.cs index 2b6b143fc0..049bafc7f0 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Extractor.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class Extractor : v8_4.Extractor - { - // Consructors - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class Extractor : v8_4.Extractor + { + // Consructors + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/ServerInfoProvider.cs index ad5c9c98cb..bbf281cea0 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/ServerInfoProvider.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class ServerInfoProvider : v8_4.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class ServerInfoProvider : v8_4.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Translator.cs index 6a4f233d9d..12d8bb7981 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/Translator.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -using System.Text; -using Xtensive.Core; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class Translator : v8_4.Translator - { - public override string Translate(SqlCompilerContext context, object literalValue) - { - var array = literalValue as byte[]; - if (array==null) - return base.Translate(context, literalValue); - - var result = new StringBuilder(array.Length * 2 + 6); - - result.Append(@"E'\\x"); - result.AppendHexArray(array); - result.Append("'"); - - return result.ToString(); - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +using System.Text; +using Xtensive.Core; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class Translator : v8_4.Translator + { + public override string Translate(SqlCompilerContext context, object literalValue) + { + var array = literalValue as byte[]; + if (array==null) + return base.Translate(context, literalValue); + + var result = new StringBuilder(array.Length * 2 + 6); + + result.Append(@"E'\\x"); + result.AppendHexArray(array); + result.Append("'"); + + return result.ToString(); + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/TypeMapper.cs index 0af2931f2b..abc0562fa5 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_0/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 -{ - internal class TypeMapper : v8_4.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_0 +{ + internal class TypeMapper : v8_4.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Compiler.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Compiler.cs index 665a384bfa..c8f6923a7b 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Compiler.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Compiler.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class Compiler : v9_0.Compiler - { - // Constructors - - public Compiler(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class Compiler : v9_0.Compiler + { + // Constructors + + public Compiler(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Driver.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Driver.cs index cfa0b6961f..e4f87e8c91 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Driver.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Driver.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class Driver : v9_0.Driver - { - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class Driver : v9_0.Driver + { + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Extractor.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Extractor.cs index 5471062b02..3fa356c8c8 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Extractor.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Extractor.cs @@ -1,155 +1,155 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -using System; -using System.Linq; -using System.Text.RegularExpressions; -using Xtensive.Arithmetic; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class Extractor : v9_0.Extractor - { - // Consructors - - protected override void ExtractTableIndexes(ExtractionContext context) - { - var tableMap = context.TableMap; - var tableColumns = context.TableColumnMap; - - if (tableMap.Count > 0) { - var tableSpacesTable = PgTablespace; - var relationsTable = PgClass; - var indexTable = PgIndex; - var dependencyTable = PgDepend; - - //subselect that index was not created automatically - var subSelect = SqlDml.Select(dependencyTable); - subSelect.Where = dependencyTable["classid"]==PgClassOid && - dependencyTable["objid"]==indexTable["indexrelid"] && - dependencyTable["deptype"]=='i'; - subSelect.Columns.Add(dependencyTable[0]); - - //not automatically created indexes of our tables - var select = SqlDml.Select(indexTable - .InnerJoin(relationsTable, relationsTable["oid"] == indexTable["indexrelid"]) - .LeftOuterJoin(tableSpacesTable, tableSpacesTable["oid"] == relationsTable["reltablespace"])); - select.Where = SqlDml.In(indexTable["indrelid"], CreateOidRow(tableMap.Keys)) && !SqlDml.Exists(subSelect); - select.Columns.Add(indexTable["indrelid"]); - select.Columns.Add(indexTable["indexrelid"]); - select.Columns.Add(relationsTable["relname"]); - select.Columns.Add(indexTable["indisunique"]); - select.Columns.Add(indexTable["indisclustered"]); - select.Columns.Add(indexTable["indkey"]); - select.Columns.Add(tableSpacesTable["spcname"]); - select.Columns.Add(indexTable["indnatts"]); - select.Columns.Add(SqlDml.FunctionCall("pg_get_expr", indexTable["indexprs"], indexTable["indrelid"], true), "indexprstext"); - select.Columns.Add(SqlDml.FunctionCall("pg_get_expr", indexTable["indpred"], indexTable["indrelid"], true), "indpredtext"); - select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"]), "inddef"); - AddSpecialIndexQueryColumns(select, tableSpacesTable, relationsTable, indexTable, dependencyTable); - - int maxColumnNumber = 0; - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var tableIdentifier = Convert.ToInt64(dataReader["indrelid"]); - var indexIdentifier = Convert.ToInt64(dataReader["indexrelid"]); - var indexName = dataReader["relname"].ToString(); - var isUnique = dataReader.GetBoolean(dataReader.GetOrdinal("indisunique")); - var isClustered = dataReader.GetBoolean(dataReader.GetOrdinal("indisclustered")); - var indexKey = (short[]) dataReader["indkey"]; - - var tablespaceName = (dataReader["spcname"]!=DBNull.Value) ? dataReader["spcname"].ToString() : (string) null; - var filterExpression = (dataReader["indpredtext"]!=DBNull.Value) ? dataReader["indpredtext"].ToString() : string.Empty; - - var table = tableMap[tableIdentifier]; - - var fullTextRegex = @"(?<=CREATE INDEX \S+ ON \S+ USING (?:gist|gin)(?:\s|\S)*)to_tsvector\('(\w+)'::regconfig, \(*(?:(?:\s|\)|\(|\|)*(?:\(""(\S+)""\)|'\s')::text)+\)"; - var indexScript = dataReader["inddef"].ToString(); - var matches = Regex.Matches(indexScript, fullTextRegex, RegexOptions.Compiled); - if (matches.Count > 0) { - // Fulltext index - var fullTextIndex = table.CreateFullTextIndex(indexName); - foreach (Match match in matches) { - var columnConfigurationName = match.Groups[1].Value; - foreach (Capture capture in match.Groups[2].Captures) { - var columnName = capture.Value; - var fullTextColumn = fullTextIndex.Columns[columnName] ?? fullTextIndex.CreateIndexColumn(table.Columns.Single(column => column.Name == columnName)); - if (fullTextColumn.Languages[columnConfigurationName] == null) - fullTextColumn.Languages.Add(new Language(columnConfigurationName)); - } - } - } - else { - //Regular index - var index = table.CreateIndex(indexName); - index.IsBitmap = false; - index.IsUnique = isUnique; - index.Filegroup = tablespaceName; - if (!string.IsNullOrEmpty(filterExpression)) - index.Where = SqlDml.Native(filterExpression); - - // Expression-based index - var some = dataReader["indexprstext"]; - if (some!=DBNull.Value) { - context.ExpressionIndexMap[indexIdentifier] = new ExpressionIndexInfo(index, indexKey); - int columnNumber = dataReader.GetInt16(dataReader.GetOrdinal("indnatts")); - if (columnNumber > maxColumnNumber) - maxColumnNumber = columnNumber; - } - else { - for (int j = 0; j < indexKey.Length; j++) { - int colIndex = indexKey[j]; - if (colIndex > 0) - index.CreateIndexColumn(tableColumns[tableIdentifier][colIndex], true); - else { - int z = 7; - //column index is 0 - //this means that this index column is an expression - //which is not possible with SqlDom tables - } - } - } - ReadSpecialIndexProperties(dataReader, index); - } - } - } - - var expressionIndexMap = context.ExpressionIndexMap; - - if (expressionIndexMap.Count > 0) { - select = SqlDml.Select(indexTable); - select.Columns.Add(indexTable["indrelid"]); - select.Columns.Add(indexTable["indexrelid"]); - - for (int i = 1; i <= maxColumnNumber; i++) - select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"], i, true), i.ToString()); - select.Where = SqlDml.In(indexTable["indexrelid"], SqlDml.Array(expressionIndexMap.Keys.ToArray())); - - using (var command = Connection.CreateCommand(select)) - using (var dataReader = command.ExecuteReader()) { - while (dataReader.Read()) { - var exprIndexInfo = expressionIndexMap[Convert.ToInt64(dataReader[1])]; - for (int j = 0; j < exprIndexInfo.Columns.Length; j++) { - int colIndex = exprIndexInfo.Columns[j]; - if (colIndex > 0) - exprIndexInfo.Index.CreateIndexColumn(tableColumns[Convert.ToInt64(dataReader[0])][colIndex], true); - else - exprIndexInfo.Index.CreateIndexColumn(SqlDml.Native(dataReader[(j + 1).ToString()].ToString())); - } - } - } - } - } - } - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +using System; +using System.Linq; +using System.Text.RegularExpressions; +using Xtensive.Arithmetic; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class Extractor : v9_0.Extractor + { + // Consructors + + protected override void ExtractTableIndexes(ExtractionContext context) + { + var tableMap = context.TableMap; + var tableColumns = context.TableColumnMap; + + if (tableMap.Count > 0) { + var tableSpacesTable = PgTablespace; + var relationsTable = PgClass; + var indexTable = PgIndex; + var dependencyTable = PgDepend; + + //subselect that index was not created automatically + var subSelect = SqlDml.Select(dependencyTable); + subSelect.Where = dependencyTable["classid"]==PgClassOid && + dependencyTable["objid"]==indexTable["indexrelid"] && + dependencyTable["deptype"]=='i'; + subSelect.Columns.Add(dependencyTable[0]); + + //not automatically created indexes of our tables + var select = SqlDml.Select(indexTable + .InnerJoin(relationsTable, relationsTable["oid"] == indexTable["indexrelid"]) + .LeftOuterJoin(tableSpacesTable, tableSpacesTable["oid"] == relationsTable["reltablespace"])); + select.Where = SqlDml.In(indexTable["indrelid"], CreateOidRow(tableMap.Keys)) && !SqlDml.Exists(subSelect); + select.Columns.Add(indexTable["indrelid"]); + select.Columns.Add(indexTable["indexrelid"]); + select.Columns.Add(relationsTable["relname"]); + select.Columns.Add(indexTable["indisunique"]); + select.Columns.Add(indexTable["indisclustered"]); + select.Columns.Add(indexTable["indkey"]); + select.Columns.Add(tableSpacesTable["spcname"]); + select.Columns.Add(indexTable["indnatts"]); + select.Columns.Add(SqlDml.FunctionCall("pg_get_expr", indexTable["indexprs"], indexTable["indrelid"], true), "indexprstext"); + select.Columns.Add(SqlDml.FunctionCall("pg_get_expr", indexTable["indpred"], indexTable["indrelid"], true), "indpredtext"); + select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"]), "inddef"); + AddSpecialIndexQueryColumns(select, tableSpacesTable, relationsTable, indexTable, dependencyTable); + + int maxColumnNumber = 0; + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var tableIdentifier = Convert.ToInt64(dataReader["indrelid"]); + var indexIdentifier = Convert.ToInt64(dataReader["indexrelid"]); + var indexName = dataReader["relname"].ToString(); + var isUnique = dataReader.GetBoolean(dataReader.GetOrdinal("indisunique")); + var isClustered = dataReader.GetBoolean(dataReader.GetOrdinal("indisclustered")); + var indexKey = (short[]) dataReader["indkey"]; + + var tablespaceName = (dataReader["spcname"]!=DBNull.Value) ? dataReader["spcname"].ToString() : (string) null; + var filterExpression = (dataReader["indpredtext"]!=DBNull.Value) ? dataReader["indpredtext"].ToString() : string.Empty; + + var table = tableMap[tableIdentifier]; + + var fullTextRegex = @"(?<=CREATE INDEX \S+ ON \S+ USING (?:gist|gin)(?:\s|\S)*)to_tsvector\('(\w+)'::regconfig, \(*(?:(?:\s|\)|\(|\|)*(?:\(""(\S+)""\)|'\s')::text)+\)"; + var indexScript = dataReader["inddef"].ToString(); + var matches = Regex.Matches(indexScript, fullTextRegex, RegexOptions.Compiled); + if (matches.Count > 0) { + // Fulltext index + var fullTextIndex = table.CreateFullTextIndex(indexName); + foreach (Match match in matches) { + var columnConfigurationName = match.Groups[1].Value; + foreach (Capture capture in match.Groups[2].Captures) { + var columnName = capture.Value; + var fullTextColumn = fullTextIndex.Columns[columnName] ?? fullTextIndex.CreateIndexColumn(table.Columns.Single(column => column.Name == columnName)); + if (fullTextColumn.Languages[columnConfigurationName] == null) + fullTextColumn.Languages.Add(new Language(columnConfigurationName)); + } + } + } + else { + //Regular index + var index = table.CreateIndex(indexName); + index.IsBitmap = false; + index.IsUnique = isUnique; + index.Filegroup = tablespaceName; + if (!string.IsNullOrEmpty(filterExpression)) + index.Where = SqlDml.Native(filterExpression); + + // Expression-based index + var some = dataReader["indexprstext"]; + if (some!=DBNull.Value) { + context.ExpressionIndexMap[indexIdentifier] = new ExpressionIndexInfo(index, indexKey); + int columnNumber = dataReader.GetInt16(dataReader.GetOrdinal("indnatts")); + if (columnNumber > maxColumnNumber) + maxColumnNumber = columnNumber; + } + else { + for (int j = 0; j < indexKey.Length; j++) { + int colIndex = indexKey[j]; + if (colIndex > 0) + index.CreateIndexColumn(tableColumns[tableIdentifier][colIndex], true); + else { + int z = 7; + //column index is 0 + //this means that this index column is an expression + //which is not possible with SqlDom tables + } + } + } + ReadSpecialIndexProperties(dataReader, index); + } + } + } + + var expressionIndexMap = context.ExpressionIndexMap; + + if (expressionIndexMap.Count > 0) { + select = SqlDml.Select(indexTable); + select.Columns.Add(indexTable["indrelid"]); + select.Columns.Add(indexTable["indexrelid"]); + + for (int i = 1; i <= maxColumnNumber; i++) + select.Columns.Add(SqlDml.FunctionCall("pg_get_indexdef", indexTable["indexrelid"], i, true), i.ToString()); + select.Where = SqlDml.In(indexTable["indexrelid"], SqlDml.Array(expressionIndexMap.Keys.ToArray())); + + using (var command = Connection.CreateCommand(select)) + using (var dataReader = command.ExecuteReader()) { + while (dataReader.Read()) { + var exprIndexInfo = expressionIndexMap[Convert.ToInt64(dataReader[1])]; + for (int j = 0; j < exprIndexInfo.Columns.Length; j++) { + int colIndex = exprIndexInfo.Columns[j]; + if (colIndex > 0) + exprIndexInfo.Index.CreateIndexColumn(tableColumns[Convert.ToInt64(dataReader[0])][colIndex], true); + else + exprIndexInfo.Index.CreateIndexColumn(SqlDml.Native(dataReader[(j + 1).ToString()].ToString())); + } + } + } + } + } + } + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/ServerInfoProvider.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/ServerInfoProvider.cs index 7b2f243207..09b98e3102 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/ServerInfoProvider.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class ServerInfoProvider : v9_0.ServerInfoProvider - { - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class ServerInfoProvider : v9_0.ServerInfoProvider + { + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Translator.cs index e5a7c2b109..70e00c6717 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/Translator.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -using System.Text; -using Xtensive.Core; -using Xtensive.Sql.Compiler; - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class Translator : v9_0.Translator - { - public override string Translate(SqlCompilerContext context, object literalValue) - { - var array = literalValue as byte[]; - if (array==null) - return base.Translate(context, literalValue); - - var result = new StringBuilder(array.Length * 2 + 6); - - result.Append(@"E'\\x"); - result.AppendHexArray(array); - result.Append("'"); - - return result.ToString(); - } - - // Constructors - - public Translator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +using System.Text; +using Xtensive.Core; +using Xtensive.Sql.Compiler; + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class Translator : v9_0.Translator + { + public override string Translate(SqlCompilerContext context, object literalValue) + { + var array = literalValue as byte[]; + if (array==null) + return base.Translate(context, literalValue); + + var result = new StringBuilder(array.Length * 2 + 6); + + result.Append(@"E'\\x"); + result.AppendHexArray(array); + result.Append("'"); + + return result.ToString(); + } + + // Constructors + + public Translator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/TypeMapper.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/TypeMapper.cs index b9c180b03b..bcb349af88 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/TypeMapper.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v9_1/TypeMapper.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.10 - -namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 -{ - internal class TypeMapper : v9_0.TypeMapper - { - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.10 + +namespace Xtensive.Sql.Drivers.PostgreSql.v9_1 +{ + internal class TypeMapper : v9_0.TypeMapper + { + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Xtensive.Orm.PostgreSql.csproj b/Orm/Xtensive.Orm.PostgreSql/Xtensive.Orm.PostgreSql.csproj index 1991363f84..698c3eb7aa 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Xtensive.Orm.PostgreSql.csproj +++ b/Orm/Xtensive.Orm.PostgreSql/Xtensive.Orm.PostgreSql.csproj @@ -1,36 +1,36 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.PostgreSql.xml - - - netstandard2.0 - Xtensive - Xtensive.Orm.PostgreSql - $(DoProductName) provider for PostgreSQL - $(Title) - Adds support for PostgreSQL to $(DoProductName) - true - ..\Orm.snk - true - 2 - - - TRACE;DEBUG;NETSTANDARD - - - TRACE;NETSTANDARD - - - - - - - - - - Properties\Visibility.cs - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.PostgreSql.xml + + + netstandard2.0 + Xtensive + Xtensive.Orm.PostgreSql + $(DoProductName) provider for PostgreSQL + $(Title) + Adds support for PostgreSQL to $(DoProductName) + true + ..\Orm.snk + true + 2 + + + TRACE;DEBUG;NETSTANDARD + + + TRACE;NETSTANDARD + + + + + + + + + + Properties\Visibility.cs + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/DomainHandler.cs b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/DomainHandler.cs index bfdbe4f9bb..3dbe3e69c9 100644 --- a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/DomainHandler.cs +++ b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/DomainHandler.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - -using Xtensive.Sql.Drivers.Sqlite; -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.Sqlite -{ - /// - /// A domain handler for Sqlite RDBMS. - /// - public class DomainHandler : Providers.DomainHandler - { - protected override ICompiler CreateCompiler(CompilerConfiguration configuration) - { - return new SqlCompiler(Handlers, configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + +using Xtensive.Sql.Drivers.Sqlite; +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.Sqlite +{ + /// + /// A domain handler for Sqlite RDBMS. + /// + public class DomainHandler : Providers.DomainHandler + { + protected override ICompiler CreateCompiler(CompilerConfiguration configuration) + { + return new SqlCompiler(Handlers, configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/HandlerFactory.cs b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/HandlerFactory.cs index dd870253d2..c769c0e516 100644 --- a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/HandlerFactory.cs +++ b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/HandlerFactory.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - -using Xtensive.Orm; - -namespace Xtensive.Orm.Providers.Sqlite -{ - /// - /// Storage provider for Sqlite. - /// - [Provider(WellKnown.Provider.Sqlite, typeof (Sql.Drivers.Sqlite.DriverFactory))] - public class HandlerFactory : Providers.HandlerFactory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + +using Xtensive.Orm; + +namespace Xtensive.Orm.Providers.Sqlite +{ + /// + /// Storage provider for Sqlite. + /// + [Provider(WellKnown.Provider.Sqlite, typeof (Sql.Drivers.Sqlite.DriverFactory))] + public class HandlerFactory : Providers.HandlerFactory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/SqlCompiler.cs b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/SqlCompiler.cs index c8d50f90e8..6d886b74fe 100644 --- a/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/SqlCompiler.cs +++ b/Orm/Xtensive.Orm.Sqlite/Orm.Providers.Sqlite/SqlCompiler.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.25 - -using Xtensive.Orm.Rse.Compilation; - -namespace Xtensive.Orm.Providers.Sqlite -{ - internal class SqlCompiler : Providers.SqlCompiler - { - - // Constructors - - public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) - : base(handlers, configuration) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.25 + +using Xtensive.Orm.Rse.Compilation; + +namespace Xtensive.Orm.Providers.Sqlite +{ + internal class SqlCompiler : Providers.SqlCompiler + { + + // Constructors + + public SqlCompiler(HandlerAccessor handlers, CompilerConfiguration configuration) + : base(handlers, configuration) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureCollation.cs index 0985c825da..3013f5c6df 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_CurrentCulture")] - public class CurrentCultureCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.CurrentCulture.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_CurrentCulture")] + public class CurrentCultureCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.CurrentCulture.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureIgnoreCaseCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureIgnoreCaseCollation.cs index ea162ee8cc..6a6ffccf7e 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureIgnoreCaseCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/CurrentCultureIgnoreCaseCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_CurrentCulture_IgnoreCase")] - public class CurrentCultureIgnoreCaseCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.CurrentCultureIgnoreCase.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_CurrentCulture_IgnoreCase")] + public class CurrentCultureIgnoreCaseCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.CurrentCultureIgnoreCase.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureCollation.cs index df8785ce05..d7964279e1 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_InvariantCulture")] - public class InvariantCultureCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.InvariantCulture.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_InvariantCulture")] + public class InvariantCultureCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.InvariantCulture.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureIgnoreCaseCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureIgnoreCaseCollation.cs index afe4ed840b..63dc354bbd 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureIgnoreCaseCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/InvariantCultureIgnoreCaseCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_InvariantCulture_IgnoreCase")] - public class InvariantCultureIgnoreCaseCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.InvariantCultureIgnoreCase.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_InvariantCulture_IgnoreCase")] + public class InvariantCultureIgnoreCaseCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.InvariantCultureIgnoreCase.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalCollation.cs index 81b24c1a5b..295530c784 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_Ordinal")] - public class OrdinalCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.Ordinal.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_Ordinal")] + public class OrdinalCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.Ordinal.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalIgnoreCaseCollation.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalIgnoreCaseCollation.cs index eb21074cbd..a9ab9af426 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalIgnoreCaseCollation.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Collations/OrdinalIgnoreCaseCollation.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Data.SQLite; - -namespace Xtensive.Sql.Drivers.Sqlite.Collations -{ - [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_Ordinal_IgnoreCase")] - public class OrdinalIgnoreCaseCollation : SQLiteFunction - { - public override int Compare(string param1, string param2) - { - return StringComparer.OrdinalIgnoreCase.Compare(param1, param2); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Data.SQLite; + +namespace Xtensive.Sql.Drivers.Sqlite.Collations +{ + [SQLiteFunction(FuncType = FunctionType.Collation, Name = "StringComparer_Ordinal_IgnoreCase")] + public class OrdinalIgnoreCaseCollation : SQLiteFunction + { + public override int Compare(string param1, string param2) + { + return StringComparer.OrdinalIgnoreCase.Compare(param1, param2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Connection.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Connection.cs index f42fb5488e..9803112d69 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Connection.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Connection.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System.Data; -using System.Data.Common; -using System.Data.SQLite; -using System.Security; - -namespace Xtensive.Sql.Drivers.Sqlite -{ - internal class Connection : SqlConnection - { - private SQLiteConnection underlyingConnection; - private SQLiteTransaction activeTransaction; - - /// - public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } - - /// - public override DbTransaction ActiveTransaction { get { return activeTransaction; } } - - /// - [SecuritySafeCritical] - public override DbParameter CreateParameter() - { - return new SQLiteParameter(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction() - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(); - } - - /// - [SecuritySafeCritical] - public override void BeginTransaction(IsolationLevel isolationLevel) - { - EnsureIsNotDisposed(); - EnsureTransactionIsNotActive(); - activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); - } - - /// - public override void MakeSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("SAVEPOINT {0}", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void RollbackToSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - public override void ReleaseSavepoint(string name) - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - var commandText = string.Format("RELEASE SAVEPOINT {0}", name); - using (var command = CreateCommand(commandText)) - command.ExecuteNonQuery(); - } - - /// - protected override void ClearActiveTransaction() - { - activeTransaction = null; - } - - /// - protected override void ClearUnderlyingConnection() - { - underlyingConnection = null; - } - - // Constructors - - /// - [SecuritySafeCritical] - public Connection(SqlDriver driver) - : base(driver) - { - underlyingConnection = new SQLiteConnection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System.Data; +using System.Data.Common; +using System.Data.SQLite; +using System.Security; + +namespace Xtensive.Sql.Drivers.Sqlite +{ + internal class Connection : SqlConnection + { + private SQLiteConnection underlyingConnection; + private SQLiteTransaction activeTransaction; + + /// + public override DbConnection UnderlyingConnection { get { return underlyingConnection; } } + + /// + public override DbTransaction ActiveTransaction { get { return activeTransaction; } } + + /// + [SecuritySafeCritical] + public override DbParameter CreateParameter() + { + return new SQLiteParameter(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction() + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(); + } + + /// + [SecuritySafeCritical] + public override void BeginTransaction(IsolationLevel isolationLevel) + { + EnsureIsNotDisposed(); + EnsureTransactionIsNotActive(); + activeTransaction = underlyingConnection.BeginTransaction(SqlHelper.ReduceIsolationLevel(isolationLevel)); + } + + /// + public override void MakeSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("SAVEPOINT {0}", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void RollbackToSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + public override void ReleaseSavepoint(string name) + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + var commandText = string.Format("RELEASE SAVEPOINT {0}", name); + using (var command = CreateCommand(commandText)) + command.ExecuteNonQuery(); + } + + /// + protected override void ClearActiveTransaction() + { + activeTransaction = null; + } + + /// + protected override void ClearUnderlyingConnection() + { + underlyingConnection = null; + } + + // Constructors + + /// + [SecuritySafeCritical] + public Connection(SqlDriver driver) + : base(driver) + { + underlyingConnection = new SQLiteConnection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Driver.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Driver.cs index d735a89e3a..32fd6bdeaf 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Driver.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Driver.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using System.Data.SQLite; -using System.Security; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Sqlite -{ - internal abstract class Driver : SqlDriver - { - /// - [SecuritySafeCritical] - protected override SqlConnection DoCreateConnection() - { - return new Connection(this); - } - - /// - [SecuritySafeCritical] - public override SqlExceptionType GetExceptionType(Exception exception) - { - var nativeException = exception as SQLiteException; - return SqlExceptionType.Unknown; - } - - // Constructors - - /// - protected Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using System.Data.SQLite; +using System.Security; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Sqlite +{ + internal abstract class Driver : SqlDriver + { + /// + [SecuritySafeCritical] + protected override SqlConnection DoCreateConnection() + { + return new Connection(this); + } + + /// + [SecuritySafeCritical] + public override SqlExceptionType GetExceptionType(Exception exception) + { + var nativeException = exception as SQLiteException; + return SqlExceptionType.Unknown; + } + + // Constructors + + /// + protected Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/DriverFactory.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/DriverFactory.cs index 0b79fb78a2..e617f92645 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/DriverFactory.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/DriverFactory.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using System.Data.Common; -using System.Data.SQLite; -using System.Text.RegularExpressions; -using Xtensive.Orm; -using Xtensive.Sql.Drivers.Sqlite.Resources; -using Xtensive.Sql.Drivers.Sqlite.v3; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Sqlite -{ - /// - /// A factory for SQLite. - /// - public class DriverFactory : SqlDriverFactory - { - private static readonly Regex DataSourceExtractor = new Regex(@"(.*Data Source *= *)(.*)($|;.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - - private string GetDataSource(string connectionString) - { - var match = DataSourceExtractor.Match(connectionString); - if (!match.Success) - return ""; - var dataSource = match.Groups[2].Captures[0].Value; - if (dataSource.Length > 1 && dataSource.StartsWith("'") && dataSource.EndsWith("'")) - dataSource = dataSource.Substring(1, dataSource.Length - 2); - return dataSource; - } - - /// - protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - return DoCreateDriver(connectionString, configuration); - } - - private SqlDriver DoCreateDriver(string connectionString, SqlDriverConfiguration configuration) - { - using (var connection = new SQLiteConnection(connectionString)) { - connection.Open(); - SqlHelper.ExecuteInitializationSql(connection, configuration); - var version = new Version(connection.ServerVersion); - var defaultSchema = GetDefaultSchema(connection); - var coreServerInfo = new CoreServerInfo { - ServerVersion = version, - ConnectionString = connectionString, - MultipleActiveResultSets = false, - DatabaseName = defaultSchema.Database, - DefaultSchemaName = defaultSchema.Schema, - }; - - if (version.Major < 3) - throw new NotSupportedException(Strings.ExSqlLiteServerBelow3IsNotSupported); - return new v3.Driver(coreServerInfo); - } - } - - /// - protected override string BuildConnectionString(UrlInfo url) - { - SqlHelper.ValidateConnectionUrl(url); - string result = string.Format("Data Source = {0}", url.Resource); - - if (!string.IsNullOrEmpty(url.Password)) - result += String.Format("; Password = '{0}'", url.Password); - - return result; - } - - /// - protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) - { - return new DefaultSchemaInfo(GetDataSource(connection.ConnectionString), Extractor.DefaultSchemaName); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using System.Data.Common; +using System.Data.SQLite; +using System.Text.RegularExpressions; +using Xtensive.Orm; +using Xtensive.Sql.Drivers.Sqlite.Resources; +using Xtensive.Sql.Drivers.Sqlite.v3; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Sqlite +{ + /// + /// A factory for SQLite. + /// + public class DriverFactory : SqlDriverFactory + { + private static readonly Regex DataSourceExtractor = new Regex(@"(.*Data Source *= *)(.*)($|;.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + + private string GetDataSource(string connectionString) + { + var match = DataSourceExtractor.Match(connectionString); + if (!match.Success) + return ""; + var dataSource = match.Groups[2].Captures[0].Value; + if (dataSource.Length > 1 && dataSource.StartsWith("'") && dataSource.EndsWith("'")) + dataSource = dataSource.Substring(1, dataSource.Length - 2); + return dataSource; + } + + /// + protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + return DoCreateDriver(connectionString, configuration); + } + + private SqlDriver DoCreateDriver(string connectionString, SqlDriverConfiguration configuration) + { + using (var connection = new SQLiteConnection(connectionString)) { + connection.Open(); + SqlHelper.ExecuteInitializationSql(connection, configuration); + var version = new Version(connection.ServerVersion); + var defaultSchema = GetDefaultSchema(connection); + var coreServerInfo = new CoreServerInfo { + ServerVersion = version, + ConnectionString = connectionString, + MultipleActiveResultSets = false, + DatabaseName = defaultSchema.Database, + DefaultSchemaName = defaultSchema.Schema, + }; + + if (version.Major < 3) + throw new NotSupportedException(Strings.ExSqlLiteServerBelow3IsNotSupported); + return new v3.Driver(coreServerInfo); + } + } + + /// + protected override string BuildConnectionString(UrlInfo url) + { + SqlHelper.ValidateConnectionUrl(url); + string result = string.Format("Data Source = {0}", url.Resource); + + if (!string.IsNullOrEmpty(url.Password)) + result += String.Format("; Password = '{0}'", url.Password); + + return result; + } + + /// + protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction) + { + return new DefaultSchemaInfo(GetDataSource(connection.ConnectionString), Extractor.DefaultSchemaName); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/ProviderInitializer.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/ProviderInitializer.cs index d6b9242f13..0f25299790 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/ProviderInitializer.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/ProviderInitializer.cs @@ -1,148 +1,148 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.08.21 - -using System; -using System.Data.SQLite; -using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Threading; -using Xtensive.Core; -using Xtensive.Sql.Drivers.Sqlite.Resources; - -namespace Xtensive.Sql.Drivers.Sqlite -{ - internal static class ProviderInitializer - { - private const string ProductName = "DataObjects.Net"; - private const string LibraryDirectory = "Native"; - private const string LibraryFileName = "SQLite.Interop.dll"; - private const string LibraryResourceNameFormat = @"Xtensive.Sql.Drivers.Sqlite.NativeModules.{0}_{1}.SQLite.Interop.dll"; - private const string LibraryMutexFormat = @"{0}_Native_{1}"; - - private const string FrameworkName = "Net40"; - - private static volatile bool IsInitialized; - private static readonly object SyncRoot = new object(); - - public static void Run(string nativeLibraryCacheFolder) - { - if (IsInitialized) - return; - lock (SyncRoot) { - if (IsInitialized) - return; - IsInitialized = true; - ExtractAndLoadNativeLibrary(nativeLibraryCacheFolder); - RegisterCollations(); - } - } - - private static Stream GetLibraryStream() - { - var resourceName = string.Format(LibraryResourceNameFormat, FrameworkName, IntPtr.Size * 8); - var result = typeof (ProviderInitializer).Assembly.GetManifestResourceStream(resourceName); - if (result==null) - throw new InvalidOperationException(string.Format(Strings.ExResourceXIsMissing, resourceName)); - return result; - } - - private static string GetLibraryHash() - { - using (var hashProvider = new SHA1Managed()) { - hashProvider.Initialize(); - using (var stream = GetLibraryStream()) - hashProvider.ComputeHash(stream); - var hash = hashProvider.Hash.Take(8).ToArray(); - return new StringBuilder().AppendHexArray(hash).ToString(); - } - } - - private static string GetLibraryFileName(string nativeLibraryCacheFolder, string moduleHash) - { - string basePath; - - if (!string.IsNullOrEmpty(nativeLibraryCacheFolder)) { - basePath = nativeLibraryCacheFolder; - } - else { - var localApplicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - if (string.IsNullOrEmpty(localApplicationData)) - throw new InvalidOperationException(Strings.ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder); - basePath = Path.Combine(Path.Combine(localApplicationData, ProductName), LibraryDirectory); - } - - return Path.Combine(Path.Combine(basePath, moduleHash), LibraryFileName); - } - - private static void ExtractLibrary(string moduleFileName) - { - if (File.Exists(moduleFileName)) - return; - - var moduleDirName = Path.GetDirectoryName(moduleFileName); - - if (!Directory.Exists(moduleDirName)) - Directory.CreateDirectory(moduleDirName); - - try { - using (var fileStream = new FileStream(moduleFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None)) - using (var resourceStream = GetLibraryStream()) { - var buffer = new byte[1024 * 32]; - int bytesRead; - while ((bytesRead = resourceStream.Read(buffer, 0, buffer.Length)) > 0) - fileStream.Write(buffer, 0, bytesRead); - } - } - catch { - File.Delete(moduleFileName); - throw; - } - } - - private static void ExtractAndLoadNativeLibrary(string nativeLibraryCacheFolder) - { - var hash = GetLibraryHash(); - var moduleFileName = GetLibraryFileName(nativeLibraryCacheFolder, hash); - var mutexName = string.Format(LibraryMutexFormat, ProductName, hash); - - using (var mutex = new Mutex(false, mutexName)) { - mutex.WaitOne(); - try { - ExtractLibrary(moduleFileName); - } - finally { - mutex.ReleaseMutex(); - } - } - - LoadNativeLibrary(moduleFileName); - } - - [System.Runtime.InteropServices.DllImport("kernel32.dll")] - private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags); - - private static void LoadNativeLibrary(string moduleFileName) - { - const uint loadWithAlteredSearchPath = 0x00000008; - var result = LoadLibraryEx(moduleFileName, IntPtr.Zero, loadWithAlteredSearchPath); - if (result==IntPtr.Zero) - throw new InvalidOperationException(string.Format(Strings.ExFailedToLoadNativeModuleX, moduleFileName)); - } - - private static void RegisterCollations() - { - // Register our helper collations - - var functions = typeof (DriverFactory).Assembly.GetTypes() - .Where(t => typeof (SQLiteFunction).IsAssignableFrom(t)); - - foreach (var f in functions) - SQLiteFunction.RegisterFunction(f); - } - } -} +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.08.21 + +using System; +using System.Data.SQLite; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using Xtensive.Core; +using Xtensive.Sql.Drivers.Sqlite.Resources; + +namespace Xtensive.Sql.Drivers.Sqlite +{ + internal static class ProviderInitializer + { + private const string ProductName = "DataObjects.Net"; + private const string LibraryDirectory = "Native"; + private const string LibraryFileName = "SQLite.Interop.dll"; + private const string LibraryResourceNameFormat = @"Xtensive.Sql.Drivers.Sqlite.NativeModules.{0}_{1}.SQLite.Interop.dll"; + private const string LibraryMutexFormat = @"{0}_Native_{1}"; + + private const string FrameworkName = "Net40"; + + private static volatile bool IsInitialized; + private static readonly object SyncRoot = new object(); + + public static void Run(string nativeLibraryCacheFolder) + { + if (IsInitialized) + return; + lock (SyncRoot) { + if (IsInitialized) + return; + IsInitialized = true; + ExtractAndLoadNativeLibrary(nativeLibraryCacheFolder); + RegisterCollations(); + } + } + + private static Stream GetLibraryStream() + { + var resourceName = string.Format(LibraryResourceNameFormat, FrameworkName, IntPtr.Size * 8); + var result = typeof (ProviderInitializer).Assembly.GetManifestResourceStream(resourceName); + if (result==null) + throw new InvalidOperationException(string.Format(Strings.ExResourceXIsMissing, resourceName)); + return result; + } + + private static string GetLibraryHash() + { + using (var hashProvider = new SHA1Managed()) { + hashProvider.Initialize(); + using (var stream = GetLibraryStream()) + hashProvider.ComputeHash(stream); + var hash = hashProvider.Hash.Take(8).ToArray(); + return new StringBuilder().AppendHexArray(hash).ToString(); + } + } + + private static string GetLibraryFileName(string nativeLibraryCacheFolder, string moduleHash) + { + string basePath; + + if (!string.IsNullOrEmpty(nativeLibraryCacheFolder)) { + basePath = nativeLibraryCacheFolder; + } + else { + var localApplicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + if (string.IsNullOrEmpty(localApplicationData)) + throw new InvalidOperationException(Strings.ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder); + basePath = Path.Combine(Path.Combine(localApplicationData, ProductName), LibraryDirectory); + } + + return Path.Combine(Path.Combine(basePath, moduleHash), LibraryFileName); + } + + private static void ExtractLibrary(string moduleFileName) + { + if (File.Exists(moduleFileName)) + return; + + var moduleDirName = Path.GetDirectoryName(moduleFileName); + + if (!Directory.Exists(moduleDirName)) + Directory.CreateDirectory(moduleDirName); + + try { + using (var fileStream = new FileStream(moduleFileName, FileMode.CreateNew, FileAccess.Write, FileShare.None)) + using (var resourceStream = GetLibraryStream()) { + var buffer = new byte[1024 * 32]; + int bytesRead; + while ((bytesRead = resourceStream.Read(buffer, 0, buffer.Length)) > 0) + fileStream.Write(buffer, 0, bytesRead); + } + } + catch { + File.Delete(moduleFileName); + throw; + } + } + + private static void ExtractAndLoadNativeLibrary(string nativeLibraryCacheFolder) + { + var hash = GetLibraryHash(); + var moduleFileName = GetLibraryFileName(nativeLibraryCacheFolder, hash); + var mutexName = string.Format(LibraryMutexFormat, ProductName, hash); + + using (var mutex = new Mutex(false, mutexName)) { + mutex.WaitOne(); + try { + ExtractLibrary(moduleFileName); + } + finally { + mutex.ReleaseMutex(); + } + } + + LoadNativeLibrary(moduleFileName); + } + + [System.Runtime.InteropServices.DllImport("kernel32.dll")] + private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags); + + private static void LoadNativeLibrary(string moduleFileName) + { + const uint loadWithAlteredSearchPath = 0x00000008; + var result = LoadLibraryEx(moduleFileName, IntPtr.Zero, loadWithAlteredSearchPath); + if (result==IntPtr.Zero) + throw new InvalidOperationException(string.Format(Strings.ExFailedToLoadNativeModuleX, moduleFileName)); + } + + private static void RegisterCollations() + { + // Register our helper collations + + var functions = typeof (DriverFactory).Assembly.GetTypes() + .Where(t => typeof (SQLiteFunction).IsAssignableFrom(t)); + + foreach (var f in functions) + SQLiteFunction.RegisterFunction(f); + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.Designer.cs index 42b54a8e42..534561a42d 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.Designer.cs @@ -1,136 +1,136 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Sql.Drivers.Sqlite.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Sqlite.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Failed to load native module '{0}'.. - /// - internal static string ExFailedToLoadNativeModuleX { - get { - return ResourceManager.GetString("ExFailedToLoadNativeModuleX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid boolean string '{0}'.. - /// - internal static string ExInvalidBooleanStringX { - get { - return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Local application data is not available for the current process. Please set DomainConfiguration.NativeLibraryCacheFolder setting.. - /// - internal static string ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder { - get { - return ResourceManager.GetString("ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder" + - "", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation '{0}' is not supported. - /// - internal static string ExOperationXIsNotSupported { - get { - return ResourceManager.GetString("ExOperationXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resource '{0}' is missing.. - /// - internal static string ExResourceXIsMissing { - get { - return ResourceManager.GetString("ExResourceXIsMissing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SQLite Server below version 3 is not supported.. - /// - internal static string ExSqlLiteServerBelow3IsNotSupported { - get { - return ResourceManager.GetString("ExSqlLiteServerBelow3IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ExTablePropertyIsNotSet. - /// - internal static string ExTablePropertyIsNotSet { - get { - return ResourceManager.GetString("ExTablePropertyIsNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ExUnboundColumn {0}. - /// - internal static string ExUnboundColumn { - get { - return ResourceManager.GetString("ExUnboundColumn", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Sql.Drivers.Sqlite.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Sql.Drivers.Sqlite.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Failed to load native module '{0}'.. + /// + internal static string ExFailedToLoadNativeModuleX { + get { + return ResourceManager.GetString("ExFailedToLoadNativeModuleX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid boolean string '{0}'.. + /// + internal static string ExInvalidBooleanStringX { + get { + return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Local application data is not available for the current process. Please set DomainConfiguration.NativeLibraryCacheFolder setting.. + /// + internal static string ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder { + get { + return ResourceManager.GetString("ExLocalApplicationDataIsNotAvailableSetDomainConfiguratioNativeLibraryCacheFolder" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation '{0}' is not supported. + /// + internal static string ExOperationXIsNotSupported { + get { + return ResourceManager.GetString("ExOperationXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resource '{0}' is missing.. + /// + internal static string ExResourceXIsMissing { + get { + return ResourceManager.GetString("ExResourceXIsMissing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SQLite Server below version 3 is not supported.. + /// + internal static string ExSqlLiteServerBelow3IsNotSupported { + get { + return ResourceManager.GetString("ExSqlLiteServerBelow3IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ExTablePropertyIsNotSet. + /// + internal static string ExTablePropertyIsNotSet { + get { + return ResourceManager.GetString("ExTablePropertyIsNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ExUnboundColumn {0}. + /// + internal static string ExUnboundColumn { + get { + return ResourceManager.GetString("ExUnboundColumn", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.resx b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.resx index 81ab875cc7..21b68ff2bf 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/Resources/Strings.resx @@ -1,144 +1,144 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SQLite Server below version 3 is not supported. - - - Operation '{0}' is not supported - - - Invalid boolean string '{0}'. - - - ExTablePropertyIsNotSet - - - ExUnboundColumn {0} - - - Resource '{0}' is missing. - - - Failed to load native module '{0}'. - - - Local application data is not available for the current process. Please set DomainConfiguration.NativeLibraryCacheFolder setting. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + SQLite Server below version 3 is not supported. + + + Operation '{0}' is not supported + + + Invalid boolean string '{0}'. + + + ExTablePropertyIsNotSet + + + ExUnboundColumn {0} + + + Resource '{0}' is missing. + + + Failed to load native module '{0}'. + + + Local application data is not available for the current process. Please set DomainConfiguration.NativeLibraryCacheFolder setting. + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs index 47663ddfe1..2d1ee3a494 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs @@ -1,503 +1,503 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class Compiler : SqlCompiler - { - private static readonly long NanosecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds * NanosecondsPerMillisecond; - private static readonly long NanosecondsPerHour = (long) TimeSpan.FromHours(1).TotalMilliseconds * NanosecondsPerMillisecond; - private static readonly long NanosecondsPerSecond = (long) TimeSpan.FromSeconds(1).TotalMilliseconds * NanosecondsPerMillisecond; - private static readonly long MillisecondsPerSecond = (long) TimeSpan.FromSeconds(1).TotalMilliseconds; - private static readonly int StartOffsetIndex = DateTimeOffsetExampleString.IndexOf('+'); - - private const long NanosecondsPerMillisecond = 1000000L; - private const string DateFormat = "%Y-%m-%d 00:00:00.000"; - private const string DateTimeFormat = "%Y-%m-%d %H:%M:%f"; - private const string DateTimeIsoFormat = "%Y-%m-%dT%H:%M:%S"; - private const string DateTimeOffsetExampleString = "2001-02-03 04:05:06.789+02.45"; - - - protected override bool VisitCreateTableConstraints(SqlCreateTable node, IEnumerable constraints, bool hasItems) - { - // SQLite has special syntax for autoincrement primary keys - // We write everything when doing translation for column definition - // and should skip any PK definitions here. - var hasAutoIncrementColumn = node.Table.TableColumns.Any(c => c.SequenceDescriptor!=null); - constraints = hasAutoIncrementColumn ? constraints.Where(c => !(c is PrimaryKey)) : constraints; - return base.VisitCreateTableConstraints(node, constraints, hasItems); - } - - public override void Visit(SqlBinary node) - { - switch (node.NodeType) { - // Bit XOR is not supported by SQLite - // but it can be easily emulated using remaining bit operators - case SqlNodeType.BitXor: - // A ^ B = (A | B) & ~(A & B) - var replacement = SqlDml.BitAnd( - SqlDml.BitOr(node.Left, node.Right), - SqlDml.BitNot(SqlDml.BitAnd(node.Left, node.Right))); - replacement.AcceptVisitor(this); - return; - case SqlNodeType.DateTimePlusInterval: - DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusInterval: - DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeMinusDateTime: - case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: - DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); - return; - case SqlNodeType.DateTimeOffsetPlusInterval: - SqlDml.Concat( - DateTimeAddInterval(DateTimeOffsetExtractDateTimeAsString(node.Left), node.Right), - DateTimeOffsetExtractOffsetAsString(node.Left)) - .AcceptVisitor(this); - return; - case SqlNodeType.DateTimeOffsetMinusInterval: - SqlDml.Concat( - DateTimeAddInterval(DateTimeOffsetExtractDateTimeAsString(node.Left), -node.Right), - DateTimeOffsetExtractOffsetAsString(node.Left)) - .AcceptVisitor(this); - return; - default: - base.Visit(node); - return; - } - } - - public override void Visit(SqlAlterTable node) - { - var renameColumnAction = node.Action as SqlRenameColumn; - if (renameColumnAction!=null) - context.Output.AppendText(((Translator) translator).Translate(context, renameColumnAction)); - else if (node.Action is SqlDropConstraint) { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); - - var action = node.Action as SqlDropConstraint; - var constraint = action.Constraint as TableConstraint; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); - if (constraint is ForeignKey) - context.Output.AppendText("REFERENCES " + translator.QuoteIdentifier(constraint.DbName)); - else - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); - } - } - else - base.Visit(node); - } - - public override void Visit(SqlExtract node) - { - if (node.IntervalPart!=SqlIntervalPart.Nothing) { - VisitInterval(node); - return; - } - if (node.DateTimePart!=SqlDateTimePart.Nothing) { - VisitDateTime(node); - return; - } - if (node.DateTimeOffsetPart!=SqlDateTimeOffsetPart.Nothing) { - VisitDateTimeOffset(node); - return; - } - base.Visit(node); - } - - public override void Visit(SqlFreeTextTable node) - { - throw SqlHelper.NotSupported("FreeText"); - } - - public override void Visit(SqlFunctionCall node) - { - switch (node.FunctionType) { - case SqlFunctionType.CharLength: - (SqlDml.FunctionCall("LENGTH", node.Arguments) / 2).AcceptVisitor(this); - return; - case SqlFunctionType.PadLeft: - case SqlFunctionType.PadRight: - return; - case SqlFunctionType.Concat: - var nod = node.Arguments[0]; - return; - case SqlFunctionType.Round: - // Round should always be called with 2 arguments - if (node.Arguments.Count==1) { - Visit(SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Round), node.Arguments[0], SqlDml.Literal(0))); - return; - } - break; - case SqlFunctionType.Truncate: - Visit(CastToLong(node.Arguments[0])); - return; - case SqlFunctionType.IntervalConstruct: - Visit(CastToLong(node.Arguments[0])); - return; - case SqlFunctionType.IntervalToNanoseconds: - Visit(CastToLong(node.Arguments[0])); - return; - case SqlFunctionType.IntervalToMilliseconds: - Visit(CastToLong(node.Arguments[0] / NanosecondsPerMillisecond)); - return; - case SqlFunctionType.DateTimeAddMonths: - DateAddMonth(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeAddYears: - DateAddYear(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeTruncate: - DateTimeTruncate(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeConstruct: - DateAddDay(DateAddMonth(DateAddYear(SqlDml.Literal(new DateTime(2001, 1, 1)), - node.Arguments[0] - 2001), - node.Arguments[1] - 1), - node.Arguments[2] - 1).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToStringIso: - DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddMonths: - SqlDml.Concat(DateAddMonth(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), node.Arguments[1]), DateTimeOffsetExtractOffsetAsString(node.Arguments[0])).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetAddYears: - SqlDml.Concat(DateAddYear(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), node.Arguments[1]), DateTimeOffsetExtractOffsetAsString(node.Arguments[0])).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetConstruct: - SqlDml.Concat(node.Arguments[0], OffsetToOffsetAsString(node.Arguments[1])).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetToLocalTime: - SqlDml.Concat(DateTimeOffsetToLocalDateTime(node.Arguments[0]), ServerOffsetAsString()).AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetToUtcTime: - SqlDml.Concat(DateTimeOffsetToUtcDateTime(node.Arguments[0]), "+00:00").AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeOffsetTimeOfDay: - SqlDml.DateTimeMinusDateTime( - DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), - DateTimeTruncate(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]))) - .AcceptVisitor(this); - return; - case SqlFunctionType.DateTimeToDateTimeOffset: - SqlDml.Concat(DateTime(node.Arguments[0]), ServerOffsetAsString()).AcceptVisitor(this); - return; - } - base.Visit(node); - } - - public override void Visit(SqlQueryExpression node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); - node.Left.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(node.NodeType)); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); - node.Right.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); - } - } - - public override void Visit(SqlSelect node) - { - // For hinting limitations see http://www.sqlite.org/lang_indexedby.html - - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); - VisitSelectColumns(node); - VisitSelectFrom(node); - VisitSelectWhere(node); - VisitSelectGroupBy(node); - VisitSelectOrderBy(node); - VisitSelectLimitOffset(node); - context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); - } - } - - public override void Visit(SqlTrim node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, TrimSection.Entry)); - context.Output.AppendText(translator.Translate(node.TrimType)); - node.Expression.AcceptVisitor(this); - if (node.TrimCharacters!=null) { - context.Output.AppendText(","); - context.Output.AppendText(translator.Translate(context, node.TrimCharacters)); - } - context.Output.AppendText(translator.Translate(context, node, TrimSection.Exit)); - } - } - - /// - public override void VisitSelectLimitOffset(SqlSelect node) - { - // SQLite requires limit to be present if offset it used, - // luckily negatives value does the job. - - var isSpecialCase = !node.HasLimit && node.HasOffset; - - if (!isSpecialCase) { - base.VisitSelectLimitOffset(node); - return; - } - - context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); - SqlDml.Literal(-1).AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, SelectSection.LimitEnd)); - - context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); - node.Offset.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, SelectSection.OffsetEnd)); - } - - public override void Visit(SqlCreateIndex node, IndexColumn item) - { - base.Visit(node, item); - - var column = item.Column as TableColumn; - if (column!=null && column.Collation!=null) - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Collate)); - } - - private void VisitInterval(SqlExtract node) - { - switch (node.IntervalPart) { - case SqlIntervalPart.Day: - Visit(CastToLong(node.Operand / NanosecondsPerDay)); - return; - case SqlIntervalPart.Hour: - Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24); - return; - case SqlIntervalPart.Minute: - Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60); - return; - case SqlIntervalPart.Second: - Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60); - return; - case SqlIntervalPart.Millisecond: - Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond); - return; - case SqlIntervalPart.Nanosecond: - Visit(CastToLong(node.Operand % NanosecondsPerMillisecond)); - return; - } - } - - private void VisitDateTime(SqlExtract node) - { - if (node.DateTimePart==SqlDateTimePart.Millisecond) { - Visit(CastToLong(DateGetMilliseconds(node.Operand))); - return; - } - base.Visit(node); - } - - private void VisitDateTimeOffset(SqlExtract node) - { - switch (node.DateTimeOffsetPart) { - case SqlDateTimeOffsetPart.Date: - DateTimeTruncate(DateTimeOffsetExtractDateTimeAsString(node.Operand)).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.DateTime: - DateTime(DateTimeOffsetExtractDateTimeAsString(node.Operand)).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.LocalDateTime: - DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.UtcDateTime: - DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.Offset: - (DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand)).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.TimeZoneHour: - (DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand) / NanosecondsPerHour).AcceptVisitor(this); - return; - case SqlDateTimeOffsetPart.TimeZoneMinute: - (((DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand)) % NanosecondsPerHour) / (60 * NanosecondsPerSecond)).AcceptVisitor(this); - return; - } - Visit(SqlDml.Extract(ConvertDateTimeOffsetPartToDateTimePart(node.DateTimeOffsetPart), DateTimeOffsetExtractDateTimeAsString(node.Operand))); - } - - private static SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) - { - return DateAddSeconds(date, interval / Convert.ToDouble(NanosecondsPerSecond)); - } - - private static SqlExpression DateTimeTruncate(SqlExpression date) - { - return DateTime(SqlDml.FunctionCall("STRFTIME", DateFormat, date)); - } - - private static SqlExpression DateTime(SqlExpression date) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date); - } - - private static SqlCast CastToInt(SqlExpression arg) - { - return SqlDml.Cast(arg, SqlType.Int32); - } - - private static SqlCast CastToLong(SqlExpression arg) - { - return SqlDml.Cast(arg, SqlType.Int64); - } - - private static SqlExpression OffsetToOffsetAsString(SqlExpression offset) - { - var sign = '+'; - var offsetAsInt = offset as SqlLiteral; - var offsetAsDouble = offset as SqlLiteral; - if (offsetAsInt!=null) { - if (offsetAsInt.Value < 0) { - sign = '-'; - offset = -offset; - } - } - else if (offsetAsDouble!=null) { - if (offsetAsDouble.Value < 0) { - sign = '-'; - offset = -offset; - } - } - return SqlDml.Concat(sign, ToStringWithLeadZero(CastToInt(offset / 60), 2), ':', ToStringWithLeadZero(CastToInt(offset % 60), 2)); - } - - /// Truncate string from start, if length larger resultStringLength; Add lead zero, if length less resultStringLength - /// (2, 3) => "002"; (41, 3) => "041", (4321, 3) => "321" - private static SqlExpression ToStringWithLeadZero(SqlExpression expression, int resultStringLength) - { - return SqlDml.Substring(SqlDml.Concat(new String('0', resultStringLength), expression), -resultStringLength - 1, resultStringLength); - } - - private static SqlExpression DateTimeOffsetExtractDateTimeAsString(SqlExpression dateTimeOffset) - { - return SqlDml.Substring(dateTimeOffset, 0, StartOffsetIndex); - } - - private static SqlExpression DateTimeOffsetExtractOffsetAsString(SqlExpression dateTimeOffset) - { - return SqlDml.Substring(dateTimeOffset, StartOffsetIndex); - } - - private static SqlExpression DateTimeOffsetExtractOffsetAsTotalNanoseconds(SqlExpression dateTimeOffset) - { - return DateTimeSubtractDateTime(DateTimeOffsetExtractDateTimeAsString(dateTimeOffset), dateTimeOffset); - } - - private static SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, dateTimeOffset, "LOCALTIME", "UTC"); - } - - private static SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression dateTimeOffset) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, dateTimeOffset, "LOCALTIME"); - } - - private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeIsoFormat, dateTime); - } - - private static SqlExpression DateAddYear(SqlExpression date, SqlExpression years) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(years, " ", "YEARS")); - } - - private static SqlExpression DateAddMonth(SqlExpression date, SqlExpression months) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(months, " ", "MONTHS")); - } - - private static SqlExpression DateAddDay(SqlExpression date, SqlExpression days) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(days, " ", "DAYS")); - } - - private static SqlExpression DateAddSeconds(SqlExpression date, SqlExpression seconds) - { - return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(seconds, " ", "SECONDS")); - } - - private static SqlExpression DateGetMilliseconds(SqlExpression date) - { - return CastToLong(SqlDml.FunctionCall("STRFTIME", "%f", date) * MillisecondsPerSecond) - - CastToLong(SqlDml.FunctionCall("STRFTIME", "%S", date) * MillisecondsPerSecond); - } - - private static SqlExpression DateGetTotalSeconds(SqlExpression date) - { - return SqlDml.FunctionCall("STRFTIME", "%s", date); - } - - private static SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) - { - return ((DateGetTotalSeconds(date1) - DateGetTotalSeconds(date2)) * MillisecondsPerSecond - + DateGetMilliseconds(date1) - DateGetMilliseconds(date2)) * NanosecondsPerMillisecond; - } - - private static SqlExpression ServerOffsetAsString() - { - const string constDateTime = "2016-01-01 12:00:00"; - return OffsetToOffsetAsString((SqlDml.FunctionCall("STRFTIME", "%s", constDateTime) - SqlDml.FunctionCall("STRFTIME", "%s", constDateTime, "UTC")) / 60); - } - - private static SqlDateTimePart ConvertDateTimeOffsetPartToDateTimePart(SqlDateTimeOffsetPart dateTimeOffsetPart) - { - switch (dateTimeOffsetPart) { - case SqlDateTimeOffsetPart.Year: - return SqlDateTimePart.Year; - case SqlDateTimeOffsetPart.Month: - return SqlDateTimePart.Month; - case SqlDateTimeOffsetPart.Day: - return SqlDateTimePart.Day; - case SqlDateTimeOffsetPart.Hour: - return SqlDateTimePart.Hour; - case SqlDateTimeOffsetPart.Minute: - return SqlDateTimePart.Minute; - case SqlDateTimeOffsetPart.Second: - return SqlDateTimePart.Second; - case SqlDateTimeOffsetPart.Millisecond: - return SqlDateTimePart.Millisecond; - case SqlDateTimeOffsetPart.Nanosecond: - return SqlDateTimePart.Nanosecond; - case SqlDateTimeOffsetPart.DayOfYear: - return SqlDateTimePart.DayOfYear; - case SqlDateTimeOffsetPart.DayOfWeek: - return SqlDateTimePart.DayOfWeek; - case SqlDateTimeOffsetPart.TimeZoneHour: - return SqlDateTimePart.TimeZoneHour; - case SqlDateTimeOffsetPart.TimeZoneMinute: - return SqlDateTimePart.TimeZoneMinute; - } - throw SqlHelper.NotSupported(string.Format("Converting {0} to SqlDateTimePart", dateTimeOffsetPart)); - } - - // Constructors - - /// The driver. - public Compiler(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class Compiler : SqlCompiler + { + private static readonly long NanosecondsPerDay = (long) TimeSpan.FromDays(1).TotalMilliseconds * NanosecondsPerMillisecond; + private static readonly long NanosecondsPerHour = (long) TimeSpan.FromHours(1).TotalMilliseconds * NanosecondsPerMillisecond; + private static readonly long NanosecondsPerSecond = (long) TimeSpan.FromSeconds(1).TotalMilliseconds * NanosecondsPerMillisecond; + private static readonly long MillisecondsPerSecond = (long) TimeSpan.FromSeconds(1).TotalMilliseconds; + private static readonly int StartOffsetIndex = DateTimeOffsetExampleString.IndexOf('+'); + + private const long NanosecondsPerMillisecond = 1000000L; + private const string DateFormat = "%Y-%m-%d 00:00:00.000"; + private const string DateTimeFormat = "%Y-%m-%d %H:%M:%f"; + private const string DateTimeIsoFormat = "%Y-%m-%dT%H:%M:%S"; + private const string DateTimeOffsetExampleString = "2001-02-03 04:05:06.789+02.45"; + + + protected override bool VisitCreateTableConstraints(SqlCreateTable node, IEnumerable constraints, bool hasItems) + { + // SQLite has special syntax for autoincrement primary keys + // We write everything when doing translation for column definition + // and should skip any PK definitions here. + var hasAutoIncrementColumn = node.Table.TableColumns.Any(c => c.SequenceDescriptor!=null); + constraints = hasAutoIncrementColumn ? constraints.Where(c => !(c is PrimaryKey)) : constraints; + return base.VisitCreateTableConstraints(node, constraints, hasItems); + } + + public override void Visit(SqlBinary node) + { + switch (node.NodeType) { + // Bit XOR is not supported by SQLite + // but it can be easily emulated using remaining bit operators + case SqlNodeType.BitXor: + // A ^ B = (A | B) & ~(A & B) + var replacement = SqlDml.BitAnd( + SqlDml.BitOr(node.Left, node.Right), + SqlDml.BitNot(SqlDml.BitAnd(node.Left, node.Right))); + replacement.AcceptVisitor(this); + return; + case SqlNodeType.DateTimePlusInterval: + DateTimeAddInterval(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusInterval: + DateTimeAddInterval(node.Left, -node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeMinusDateTime: + case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: + DateTimeSubtractDateTime(node.Left, node.Right).AcceptVisitor(this); + return; + case SqlNodeType.DateTimeOffsetPlusInterval: + SqlDml.Concat( + DateTimeAddInterval(DateTimeOffsetExtractDateTimeAsString(node.Left), node.Right), + DateTimeOffsetExtractOffsetAsString(node.Left)) + .AcceptVisitor(this); + return; + case SqlNodeType.DateTimeOffsetMinusInterval: + SqlDml.Concat( + DateTimeAddInterval(DateTimeOffsetExtractDateTimeAsString(node.Left), -node.Right), + DateTimeOffsetExtractOffsetAsString(node.Left)) + .AcceptVisitor(this); + return; + default: + base.Visit(node); + return; + } + } + + public override void Visit(SqlAlterTable node) + { + var renameColumnAction = node.Action as SqlRenameColumn; + if (renameColumnAction!=null) + context.Output.AppendText(((Translator) translator).Translate(context, renameColumnAction)); + else if (node.Action is SqlDropConstraint) { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); + + var action = node.Action as SqlDropConstraint; + var constraint = action.Constraint as TableConstraint; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); + if (constraint is ForeignKey) + context.Output.AppendText("REFERENCES " + translator.QuoteIdentifier(constraint.DbName)); + else + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); + } + } + else + base.Visit(node); + } + + public override void Visit(SqlExtract node) + { + if (node.IntervalPart!=SqlIntervalPart.Nothing) { + VisitInterval(node); + return; + } + if (node.DateTimePart!=SqlDateTimePart.Nothing) { + VisitDateTime(node); + return; + } + if (node.DateTimeOffsetPart!=SqlDateTimeOffsetPart.Nothing) { + VisitDateTimeOffset(node); + return; + } + base.Visit(node); + } + + public override void Visit(SqlFreeTextTable node) + { + throw SqlHelper.NotSupported("FreeText"); + } + + public override void Visit(SqlFunctionCall node) + { + switch (node.FunctionType) { + case SqlFunctionType.CharLength: + (SqlDml.FunctionCall("LENGTH", node.Arguments) / 2).AcceptVisitor(this); + return; + case SqlFunctionType.PadLeft: + case SqlFunctionType.PadRight: + return; + case SqlFunctionType.Concat: + var nod = node.Arguments[0]; + return; + case SqlFunctionType.Round: + // Round should always be called with 2 arguments + if (node.Arguments.Count==1) { + Visit(SqlDml.FunctionCall(translator.Translate(SqlFunctionType.Round), node.Arguments[0], SqlDml.Literal(0))); + return; + } + break; + case SqlFunctionType.Truncate: + Visit(CastToLong(node.Arguments[0])); + return; + case SqlFunctionType.IntervalConstruct: + Visit(CastToLong(node.Arguments[0])); + return; + case SqlFunctionType.IntervalToNanoseconds: + Visit(CastToLong(node.Arguments[0])); + return; + case SqlFunctionType.IntervalToMilliseconds: + Visit(CastToLong(node.Arguments[0] / NanosecondsPerMillisecond)); + return; + case SqlFunctionType.DateTimeAddMonths: + DateAddMonth(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeAddYears: + DateAddYear(node.Arguments[0], node.Arguments[1]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeTruncate: + DateTimeTruncate(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeConstruct: + DateAddDay(DateAddMonth(DateAddYear(SqlDml.Literal(new DateTime(2001, 1, 1)), + node.Arguments[0] - 2001), + node.Arguments[1] - 1), + node.Arguments[2] - 1).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToStringIso: + DateTimeToStringIso(node.Arguments[0]).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddMonths: + SqlDml.Concat(DateAddMonth(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), node.Arguments[1]), DateTimeOffsetExtractOffsetAsString(node.Arguments[0])).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetAddYears: + SqlDml.Concat(DateAddYear(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), node.Arguments[1]), DateTimeOffsetExtractOffsetAsString(node.Arguments[0])).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetConstruct: + SqlDml.Concat(node.Arguments[0], OffsetToOffsetAsString(node.Arguments[1])).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetToLocalTime: + SqlDml.Concat(DateTimeOffsetToLocalDateTime(node.Arguments[0]), ServerOffsetAsString()).AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetToUtcTime: + SqlDml.Concat(DateTimeOffsetToUtcDateTime(node.Arguments[0]), "+00:00").AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeOffsetTimeOfDay: + SqlDml.DateTimeMinusDateTime( + DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]), + DateTimeTruncate(DateTimeOffsetExtractDateTimeAsString(node.Arguments[0]))) + .AcceptVisitor(this); + return; + case SqlFunctionType.DateTimeToDateTimeOffset: + SqlDml.Concat(DateTime(node.Arguments[0]), ServerOffsetAsString()).AcceptVisitor(this); + return; + } + base.Visit(node); + } + + public override void Visit(SqlQueryExpression node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); + node.Left.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(node.NodeType)); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); + node.Right.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); + } + } + + public override void Visit(SqlSelect node) + { + // For hinting limitations see http://www.sqlite.org/lang_indexedby.html + + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); + VisitSelectColumns(node); + VisitSelectFrom(node); + VisitSelectWhere(node); + VisitSelectGroupBy(node); + VisitSelectOrderBy(node); + VisitSelectLimitOffset(node); + context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); + } + } + + public override void Visit(SqlTrim node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, TrimSection.Entry)); + context.Output.AppendText(translator.Translate(node.TrimType)); + node.Expression.AcceptVisitor(this); + if (node.TrimCharacters!=null) { + context.Output.AppendText(","); + context.Output.AppendText(translator.Translate(context, node.TrimCharacters)); + } + context.Output.AppendText(translator.Translate(context, node, TrimSection.Exit)); + } + } + + /// + public override void VisitSelectLimitOffset(SqlSelect node) + { + // SQLite requires limit to be present if offset it used, + // luckily negatives value does the job. + + var isSpecialCase = !node.HasLimit && node.HasOffset; + + if (!isSpecialCase) { + base.VisitSelectLimitOffset(node); + return; + } + + context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); + SqlDml.Literal(-1).AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, SelectSection.LimitEnd)); + + context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); + node.Offset.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, SelectSection.OffsetEnd)); + } + + public override void Visit(SqlCreateIndex node, IndexColumn item) + { + base.Visit(node, item); + + var column = item.Column as TableColumn; + if (column!=null && column.Collation!=null) + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Collate)); + } + + private void VisitInterval(SqlExtract node) + { + switch (node.IntervalPart) { + case SqlIntervalPart.Day: + Visit(CastToLong(node.Operand / NanosecondsPerDay)); + return; + case SqlIntervalPart.Hour: + Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24); + return; + case SqlIntervalPart.Minute: + Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60); + return; + case SqlIntervalPart.Second: + Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60); + return; + case SqlIntervalPart.Millisecond: + Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond); + return; + case SqlIntervalPart.Nanosecond: + Visit(CastToLong(node.Operand % NanosecondsPerMillisecond)); + return; + } + } + + private void VisitDateTime(SqlExtract node) + { + if (node.DateTimePart==SqlDateTimePart.Millisecond) { + Visit(CastToLong(DateGetMilliseconds(node.Operand))); + return; + } + base.Visit(node); + } + + private void VisitDateTimeOffset(SqlExtract node) + { + switch (node.DateTimeOffsetPart) { + case SqlDateTimeOffsetPart.Date: + DateTimeTruncate(DateTimeOffsetExtractDateTimeAsString(node.Operand)).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.DateTime: + DateTime(DateTimeOffsetExtractDateTimeAsString(node.Operand)).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.LocalDateTime: + DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.UtcDateTime: + DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.Offset: + (DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand)).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.TimeZoneHour: + (DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand) / NanosecondsPerHour).AcceptVisitor(this); + return; + case SqlDateTimeOffsetPart.TimeZoneMinute: + (((DateTimeOffsetExtractOffsetAsTotalNanoseconds(node.Operand)) % NanosecondsPerHour) / (60 * NanosecondsPerSecond)).AcceptVisitor(this); + return; + } + Visit(SqlDml.Extract(ConvertDateTimeOffsetPartToDateTimePart(node.DateTimeOffsetPart), DateTimeOffsetExtractDateTimeAsString(node.Operand))); + } + + private static SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpression interval) + { + return DateAddSeconds(date, interval / Convert.ToDouble(NanosecondsPerSecond)); + } + + private static SqlExpression DateTimeTruncate(SqlExpression date) + { + return DateTime(SqlDml.FunctionCall("STRFTIME", DateFormat, date)); + } + + private static SqlExpression DateTime(SqlExpression date) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date); + } + + private static SqlCast CastToInt(SqlExpression arg) + { + return SqlDml.Cast(arg, SqlType.Int32); + } + + private static SqlCast CastToLong(SqlExpression arg) + { + return SqlDml.Cast(arg, SqlType.Int64); + } + + private static SqlExpression OffsetToOffsetAsString(SqlExpression offset) + { + var sign = '+'; + var offsetAsInt = offset as SqlLiteral; + var offsetAsDouble = offset as SqlLiteral; + if (offsetAsInt!=null) { + if (offsetAsInt.Value < 0) { + sign = '-'; + offset = -offset; + } + } + else if (offsetAsDouble!=null) { + if (offsetAsDouble.Value < 0) { + sign = '-'; + offset = -offset; + } + } + return SqlDml.Concat(sign, ToStringWithLeadZero(CastToInt(offset / 60), 2), ':', ToStringWithLeadZero(CastToInt(offset % 60), 2)); + } + + /// Truncate string from start, if length larger resultStringLength; Add lead zero, if length less resultStringLength + /// (2, 3) => "002"; (41, 3) => "041", (4321, 3) => "321" + private static SqlExpression ToStringWithLeadZero(SqlExpression expression, int resultStringLength) + { + return SqlDml.Substring(SqlDml.Concat(new String('0', resultStringLength), expression), -resultStringLength - 1, resultStringLength); + } + + private static SqlExpression DateTimeOffsetExtractDateTimeAsString(SqlExpression dateTimeOffset) + { + return SqlDml.Substring(dateTimeOffset, 0, StartOffsetIndex); + } + + private static SqlExpression DateTimeOffsetExtractOffsetAsString(SqlExpression dateTimeOffset) + { + return SqlDml.Substring(dateTimeOffset, StartOffsetIndex); + } + + private static SqlExpression DateTimeOffsetExtractOffsetAsTotalNanoseconds(SqlExpression dateTimeOffset) + { + return DateTimeSubtractDateTime(DateTimeOffsetExtractDateTimeAsString(dateTimeOffset), dateTimeOffset); + } + + private static SqlExpression DateTimeOffsetToUtcDateTime(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, dateTimeOffset, "LOCALTIME", "UTC"); + } + + private static SqlExpression DateTimeOffsetToLocalDateTime(SqlExpression dateTimeOffset) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, dateTimeOffset, "LOCALTIME"); + } + + private static SqlExpression DateTimeToStringIso(SqlExpression dateTime) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeIsoFormat, dateTime); + } + + private static SqlExpression DateAddYear(SqlExpression date, SqlExpression years) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(years, " ", "YEARS")); + } + + private static SqlExpression DateAddMonth(SqlExpression date, SqlExpression months) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(months, " ", "MONTHS")); + } + + private static SqlExpression DateAddDay(SqlExpression date, SqlExpression days) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(days, " ", "DAYS")); + } + + private static SqlExpression DateAddSeconds(SqlExpression date, SqlExpression seconds) + { + return SqlDml.FunctionCall("STRFTIME", DateTimeFormat, date, SqlDml.Concat(seconds, " ", "SECONDS")); + } + + private static SqlExpression DateGetMilliseconds(SqlExpression date) + { + return CastToLong(SqlDml.FunctionCall("STRFTIME", "%f", date) * MillisecondsPerSecond) - + CastToLong(SqlDml.FunctionCall("STRFTIME", "%S", date) * MillisecondsPerSecond); + } + + private static SqlExpression DateGetTotalSeconds(SqlExpression date) + { + return SqlDml.FunctionCall("STRFTIME", "%s", date); + } + + private static SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) + { + return ((DateGetTotalSeconds(date1) - DateGetTotalSeconds(date2)) * MillisecondsPerSecond + + DateGetMilliseconds(date1) - DateGetMilliseconds(date2)) * NanosecondsPerMillisecond; + } + + private static SqlExpression ServerOffsetAsString() + { + const string constDateTime = "2016-01-01 12:00:00"; + return OffsetToOffsetAsString((SqlDml.FunctionCall("STRFTIME", "%s", constDateTime) - SqlDml.FunctionCall("STRFTIME", "%s", constDateTime, "UTC")) / 60); + } + + private static SqlDateTimePart ConvertDateTimeOffsetPartToDateTimePart(SqlDateTimeOffsetPart dateTimeOffsetPart) + { + switch (dateTimeOffsetPart) { + case SqlDateTimeOffsetPart.Year: + return SqlDateTimePart.Year; + case SqlDateTimeOffsetPart.Month: + return SqlDateTimePart.Month; + case SqlDateTimeOffsetPart.Day: + return SqlDateTimePart.Day; + case SqlDateTimeOffsetPart.Hour: + return SqlDateTimePart.Hour; + case SqlDateTimeOffsetPart.Minute: + return SqlDateTimePart.Minute; + case SqlDateTimeOffsetPart.Second: + return SqlDateTimePart.Second; + case SqlDateTimeOffsetPart.Millisecond: + return SqlDateTimePart.Millisecond; + case SqlDateTimeOffsetPart.Nanosecond: + return SqlDateTimePart.Nanosecond; + case SqlDateTimeOffsetPart.DayOfYear: + return SqlDateTimePart.DayOfYear; + case SqlDateTimeOffsetPart.DayOfWeek: + return SqlDateTimePart.DayOfWeek; + case SqlDateTimeOffsetPart.TimeZoneHour: + return SqlDateTimePart.TimeZoneHour; + case SqlDateTimeOffsetPart.TimeZoneMinute: + return SqlDateTimePart.TimeZoneMinute; + } + throw SqlHelper.NotSupported(string.Format("Converting {0} to SqlDateTimePart", dateTimeOffsetPart)); + } + + // Constructors + + /// The driver. + public Compiler(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Driver.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Driver.cs index c2d40468c5..1da2c1cd03 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Driver.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Driver.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class Driver : Sqlite.Driver - { - protected override SqlCompiler CreateCompiler() - { - return new Compiler(this); - } - - protected override Model.Extractor CreateExtractor() - { - return new Extractor(this); - } - - protected override SqlTranslator CreateTranslator() - { - return new Translator(this); - } - - protected override Sql.TypeMapper CreateTypeMapper() - { - return new TypeMapper(this); - } - - protected override Info.ServerInfoProvider CreateServerInfoProvider() - { - return new ServerInfoProvider(this); - } - - protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) - { - builder.Add(typeof (DateTimeOffset), - builder.Mapper.ReadDateTimeOffset, - builder.Mapper.BindDateTimeOffset, - builder.Mapper.MapDateTimeOffset); - } - - protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) - { - builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); - } - - // Constructors - - public Driver(CoreServerInfo coreServerInfo) - : base(coreServerInfo) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class Driver : Sqlite.Driver + { + protected override SqlCompiler CreateCompiler() + { + return new Compiler(this); + } + + protected override Model.Extractor CreateExtractor() + { + return new Extractor(this); + } + + protected override SqlTranslator CreateTranslator() + { + return new Translator(this); + } + + protected override Sql.TypeMapper CreateTypeMapper() + { + return new TypeMapper(this); + } + + protected override Info.ServerInfoProvider CreateServerInfoProvider() + { + return new ServerInfoProvider(this); + } + + protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder) + { + builder.Add(typeof (DateTimeOffset), + builder.Mapper.ReadDateTimeOffset, + builder.Mapper.BindDateTimeOffset, + builder.Mapper.MapDateTimeOffset); + } + + protected override void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) + { + builder.AddReverse(SqlType.DateTimeOffset, typeof (DateTimeOffset)); + } + + // Constructors + + public Driver(CoreServerInfo coreServerInfo) + : base(coreServerInfo) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Extractor.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Extractor.cs index 9f3c597f33..e3cf48da59 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Extractor.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Extractor.cs @@ -1,310 +1,310 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.Linq; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class Extractor : Model.Extractor - { - public const string PrimaryKeyName = "PrimaryKey"; - - internal const string DefaultSchemaName = "Main"; - - private const string SqliteSequence = "sqlite_sequence"; - private const string SqliteMaster = "sqlite_master"; - - private Schema schema; - private Catalog catalog; - - /// - public override Catalog ExtractCatalog(string catalogName) - { - catalog = new Catalog(catalogName); - schema = catalog.CreateSchema(DefaultSchemaName); - ExtractCatalogContents(); - return catalog; - } - - /// - public override Schema ExtractSchema(string catalogName, string schemaName) - { - catalog = new Catalog(catalogName); - schema = catalog.CreateSchema(schemaName); - ExtractCatalogContents(); - return catalog.Schemas.Single(); - } - - private void ExtractCatalogContents() - { - ExtractTables(); - ExtractViews(); - ExtractColumns(); - ExtractIndexes(); - ExtractForeignKeys(); - } - - private void ExtractTables() - { - const string query = "SELECT [name] FROM [Main].[sqlite_master] WHERE type = 'table' AND name NOT LIKE 'sqlite?_%' ESCAPE '?'"; - using (var cmd = Connection.CreateCommand(query)) - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) { - schema.CreateTable(reader.GetString(0)); - } - } - } - - public bool DoesTableExist(string tableName) - { - var select = string.Format("SELECT name FROM {0} WHERE type = 'table' AND name='{1}'", SqliteMaster, tableName); - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) - return reader.Read(); - } - - private int? GetIncrementValue(string tableName) - { - if (!DoesTableExist(SqliteSequence)) - return null; - - var select = string.Format("SELECT seq from {0} WHERE name = '{1}' ", SqliteSequence, tableName); - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) - return ReadNullableInt(reader, "seq"); - return null; - } - } - - private void ExtractColumns() - { - foreach (var table in schema.Tables) { - var select = string.Format("PRAGMA table_info([{0}])", table.Name); - var primaryKeyItems = new Dictionary(); - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) { - var tableSchema = table.Schema; - string tableName = table.Name; - - // Column Name - var tableColumn = table.CreateColumn(reader.GetString(1)); - - // Column Type - tableColumn.DataType = ParseValueType(reader.GetString(2)); - - // IsNullable - tableColumn.IsNullable = ReadInt(reader, 3)==0; - - // Default Value - var defaultValue = ReadStringOrNull(reader, 4); - if (!string.IsNullOrEmpty(defaultValue) && string.Compare("NULL", defaultValue, StringComparison.OrdinalIgnoreCase)!=0) - tableColumn.DefaultValue = defaultValue; - - var primaryKeyPosition = ReadInt(reader, 5); - if (primaryKeyPosition > 0) { - primaryKeyItems.Add(primaryKeyPosition, tableColumn); - if (primaryKeyPosition==1) { - // Auto Increment - var incrementValue = GetIncrementValue(tableName); - if (incrementValue!=null) - tableColumn.SequenceDescriptor = new SequenceDescriptor(tableColumn, incrementValue, 1); - } - } - } - } - - if (primaryKeyItems.Count > 0) - table.CreatePrimaryKey(PrimaryKeyName, - primaryKeyItems.OrderBy(i => i.Key).Select(i => i.Value).ToArray()); - } - } - - private IEnumerable ColumnNamesFromIndex(string indexName) - { - var select = string.Format("PRAGMA index_info([{0}])", indexName); - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) - yield return ReadStringOrNull(reader, 2); - } - } - - private void ExtractViews() - { - const string select = "SELECT [name], sql FROM [Main].[sqlite_master] WHERE type = 'view' AND name NOT LIKE 'sqlite?_%' ESCAPE '?'"; - using (var reader = ExecuteReader(select)) { - while (reader.Read()) { - string view = reader.GetString(0); - string definition = ReadStringOrNull(reader, 1); - if (string.IsNullOrEmpty(definition)) - schema.CreateView(view); - else - schema.CreateView(view, SqlDml.Native(definition)); - } - } - } - - private void ExtractIndexes() - { - foreach (var table in schema.Tables) { - var select = string.Format("PRAGMA index_list([{0}])", table.Name); - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) { - var tableSchema = table.Schema; - var tableName = table.Name; - var indexName = ReadStringOrNull(reader, 1); - if (indexName.StartsWith("sqlite_autoindex_")) { - // Special index used for primary keys - // It should be hidden here, because PK are already extracted in ExtractColumns() - continue; - } - var unique = reader.GetBoolean(2); - var index = table.CreateIndex(indexName); - index.IsUnique = unique; - foreach (var columnName in ColumnNamesFromIndex(indexName)) - index.CreateIndexColumn(table.TableColumns[columnName]); - } - } - } - } - - private void ExtractForeignKeys() - { - foreach (var table in schema.Tables) { - var select = string.Format("PRAGMA foreign_key_list([{0}])", table.Name); - - int lastColumnPosition = int.MaxValue; - ForeignKey constraint = null; - Table referencingTable = null; - Table referencedTable = null; - - using (var cmd = Connection.CreateCommand(select)) - using (IDataReader reader = cmd.ExecuteReader()) { - ForeignKey foreignKey = null; - while (reader.Read()) { - var foreignKeyName = String.Format(CultureInfo.InvariantCulture, "FK_{0}_{1}", referencingTable.Name, ReadStringOrNull(reader, 2)); - - int columnPosition = ReadInt(reader, 5); - if (columnPosition <= lastColumnPosition) { - referencingTable = table; - constraint = referencingTable.CreateForeignKey(foreignKeyName); - - ReadCascadeAction(constraint, reader, 7); - var referencedSchema = table.Schema; //Schema same as current - referencedTable = referencedSchema.Tables[ReadStringOrNull(reader, 2)]; - constraint.ReferencedTable = referencedTable; - } - var referencingColumn = referencingTable.TableColumns[reader.GetString(3)]; - var referencedColumn = referencedTable.TableColumns[reader.GetString(4)]; - constraint.Columns.Add(referencingColumn); - constraint.ReferencedColumns.Add(referencedColumn); - lastColumnPosition = columnPosition; - } - } - } - } - - private ReferentialAction GetReferentialAction(string actionName) - { - if (actionName.ToUpper()=="SET NULL") - return ReferentialAction.SetNull; - if (actionName.ToUpper()=="SET DEFAULT") - return ReferentialAction.SetDefault; - if (actionName.StartsWith("CASCADE")) - return ReferentialAction.Cascade; - return ReferentialAction.NoAction; - } - - private SqlValueType ParseValueType(string typeDefinition) - { - string typeName = ParseTypeName(typeDefinition); - - // First try predefined names first - var typeInfo = Driver.ServerInfo.DataTypes[typeName]; - if (typeInfo!=null) - return new SqlValueType(typeInfo.Type); - - // If it didn't succeed use generic matching algorithm - // (rules are taken from sqlite docs) - - // (1) If the declared type contains the string "INT" then it is assigned INTEGER affinity. - if (typeName.Contains("int")) - return new SqlValueType(SqlType.Int64); - - // (2) If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" - // then that column has TEXT affinity. - if (typeName.Contains("char") || typeName.Contains("clob") || typeName.Contains("text")) - return new SqlValueType(SqlType.VarCharMax); - - // (3) If the declared type for a column contains the string "BLOB" - // or if no type is specified then the column has affinity NONE. - if (typeName.Contains("blob") || typeName==string.Empty) - return new SqlValueType(SqlType.VarBinaryMax); - - // (4) If the declared type for a column contains any of the strings - // "REAL", "FLOA", or "DOUB" then the column has REAL affinity. - if (typeName.Contains("real") || typeName.Contains("floa") || typeName.Contains("doub")) - return new SqlValueType(SqlType.Double); - - // (5) Otherwise, the affinity is NUMERIC. - return new SqlValueType(SqlType.Decimal); - } - - private string ParseTypeName(string typeDefinition) - { - var result = typeDefinition - .SkipWhile(char.IsWhiteSpace) - .TakeWhile(ch => char.IsLetterOrDigit(ch) || char.IsWhiteSpace(ch)) - .ToArray(); - return new string(result).ToLowerInvariant(); - } - - private static int ReadInt(IDataRecord row, int index) - { - decimal value = row.GetDecimal(index); - return value > int.MaxValue ? int.MaxValue : (int) value; - } - - private static string ReadStringOrNull(IDataRecord row, int index) - { - return row.IsDBNull(index) ? null : row.GetString(index); - } - - private static int? ReadNullableInt(IDataRecord reader, string column) - { - return Convert.IsDBNull(reader[column]) ? null : (int?) Convert.ToInt32(reader[column]); - } - - private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) - { - var deleteRule = row.GetString(deleteRuleIndex); - switch (deleteRule) { - case "CASCADE": - foreignKey.OnDelete = ReferentialAction.Cascade; - return; - case "SET NULL": - foreignKey.OnDelete = ReferentialAction.SetNull; - return; - case "NO ACTION": - foreignKey.OnDelete = ReferentialAction.NoAction; - return; - } - } - - public Extractor(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Linq; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class Extractor : Model.Extractor + { + public const string PrimaryKeyName = "PrimaryKey"; + + internal const string DefaultSchemaName = "Main"; + + private const string SqliteSequence = "sqlite_sequence"; + private const string SqliteMaster = "sqlite_master"; + + private Schema schema; + private Catalog catalog; + + /// + public override Catalog ExtractCatalog(string catalogName) + { + catalog = new Catalog(catalogName); + schema = catalog.CreateSchema(DefaultSchemaName); + ExtractCatalogContents(); + return catalog; + } + + /// + public override Schema ExtractSchema(string catalogName, string schemaName) + { + catalog = new Catalog(catalogName); + schema = catalog.CreateSchema(schemaName); + ExtractCatalogContents(); + return catalog.Schemas.Single(); + } + + private void ExtractCatalogContents() + { + ExtractTables(); + ExtractViews(); + ExtractColumns(); + ExtractIndexes(); + ExtractForeignKeys(); + } + + private void ExtractTables() + { + const string query = "SELECT [name] FROM [Main].[sqlite_master] WHERE type = 'table' AND name NOT LIKE 'sqlite?_%' ESCAPE '?'"; + using (var cmd = Connection.CreateCommand(query)) + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) { + schema.CreateTable(reader.GetString(0)); + } + } + } + + public bool DoesTableExist(string tableName) + { + var select = string.Format("SELECT name FROM {0} WHERE type = 'table' AND name='{1}'", SqliteMaster, tableName); + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) + return reader.Read(); + } + + private int? GetIncrementValue(string tableName) + { + if (!DoesTableExist(SqliteSequence)) + return null; + + var select = string.Format("SELECT seq from {0} WHERE name = '{1}' ", SqliteSequence, tableName); + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) + return ReadNullableInt(reader, "seq"); + return null; + } + } + + private void ExtractColumns() + { + foreach (var table in schema.Tables) { + var select = string.Format("PRAGMA table_info([{0}])", table.Name); + var primaryKeyItems = new Dictionary(); + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) { + var tableSchema = table.Schema; + string tableName = table.Name; + + // Column Name + var tableColumn = table.CreateColumn(reader.GetString(1)); + + // Column Type + tableColumn.DataType = ParseValueType(reader.GetString(2)); + + // IsNullable + tableColumn.IsNullable = ReadInt(reader, 3)==0; + + // Default Value + var defaultValue = ReadStringOrNull(reader, 4); + if (!string.IsNullOrEmpty(defaultValue) && string.Compare("NULL", defaultValue, StringComparison.OrdinalIgnoreCase)!=0) + tableColumn.DefaultValue = defaultValue; + + var primaryKeyPosition = ReadInt(reader, 5); + if (primaryKeyPosition > 0) { + primaryKeyItems.Add(primaryKeyPosition, tableColumn); + if (primaryKeyPosition==1) { + // Auto Increment + var incrementValue = GetIncrementValue(tableName); + if (incrementValue!=null) + tableColumn.SequenceDescriptor = new SequenceDescriptor(tableColumn, incrementValue, 1); + } + } + } + } + + if (primaryKeyItems.Count > 0) + table.CreatePrimaryKey(PrimaryKeyName, + primaryKeyItems.OrderBy(i => i.Key).Select(i => i.Value).ToArray()); + } + } + + private IEnumerable ColumnNamesFromIndex(string indexName) + { + var select = string.Format("PRAGMA index_info([{0}])", indexName); + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) + yield return ReadStringOrNull(reader, 2); + } + } + + private void ExtractViews() + { + const string select = "SELECT [name], sql FROM [Main].[sqlite_master] WHERE type = 'view' AND name NOT LIKE 'sqlite?_%' ESCAPE '?'"; + using (var reader = ExecuteReader(select)) { + while (reader.Read()) { + string view = reader.GetString(0); + string definition = ReadStringOrNull(reader, 1); + if (string.IsNullOrEmpty(definition)) + schema.CreateView(view); + else + schema.CreateView(view, SqlDml.Native(definition)); + } + } + } + + private void ExtractIndexes() + { + foreach (var table in schema.Tables) { + var select = string.Format("PRAGMA index_list([{0}])", table.Name); + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) { + var tableSchema = table.Schema; + var tableName = table.Name; + var indexName = ReadStringOrNull(reader, 1); + if (indexName.StartsWith("sqlite_autoindex_")) { + // Special index used for primary keys + // It should be hidden here, because PK are already extracted in ExtractColumns() + continue; + } + var unique = reader.GetBoolean(2); + var index = table.CreateIndex(indexName); + index.IsUnique = unique; + foreach (var columnName in ColumnNamesFromIndex(indexName)) + index.CreateIndexColumn(table.TableColumns[columnName]); + } + } + } + } + + private void ExtractForeignKeys() + { + foreach (var table in schema.Tables) { + var select = string.Format("PRAGMA foreign_key_list([{0}])", table.Name); + + int lastColumnPosition = int.MaxValue; + ForeignKey constraint = null; + Table referencingTable = null; + Table referencedTable = null; + + using (var cmd = Connection.CreateCommand(select)) + using (IDataReader reader = cmd.ExecuteReader()) { + ForeignKey foreignKey = null; + while (reader.Read()) { + var foreignKeyName = String.Format(CultureInfo.InvariantCulture, "FK_{0}_{1}", referencingTable.Name, ReadStringOrNull(reader, 2)); + + int columnPosition = ReadInt(reader, 5); + if (columnPosition <= lastColumnPosition) { + referencingTable = table; + constraint = referencingTable.CreateForeignKey(foreignKeyName); + + ReadCascadeAction(constraint, reader, 7); + var referencedSchema = table.Schema; //Schema same as current + referencedTable = referencedSchema.Tables[ReadStringOrNull(reader, 2)]; + constraint.ReferencedTable = referencedTable; + } + var referencingColumn = referencingTable.TableColumns[reader.GetString(3)]; + var referencedColumn = referencedTable.TableColumns[reader.GetString(4)]; + constraint.Columns.Add(referencingColumn); + constraint.ReferencedColumns.Add(referencedColumn); + lastColumnPosition = columnPosition; + } + } + } + } + + private ReferentialAction GetReferentialAction(string actionName) + { + if (actionName.ToUpper()=="SET NULL") + return ReferentialAction.SetNull; + if (actionName.ToUpper()=="SET DEFAULT") + return ReferentialAction.SetDefault; + if (actionName.StartsWith("CASCADE")) + return ReferentialAction.Cascade; + return ReferentialAction.NoAction; + } + + private SqlValueType ParseValueType(string typeDefinition) + { + string typeName = ParseTypeName(typeDefinition); + + // First try predefined names first + var typeInfo = Driver.ServerInfo.DataTypes[typeName]; + if (typeInfo!=null) + return new SqlValueType(typeInfo.Type); + + // If it didn't succeed use generic matching algorithm + // (rules are taken from sqlite docs) + + // (1) If the declared type contains the string "INT" then it is assigned INTEGER affinity. + if (typeName.Contains("int")) + return new SqlValueType(SqlType.Int64); + + // (2) If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" + // then that column has TEXT affinity. + if (typeName.Contains("char") || typeName.Contains("clob") || typeName.Contains("text")) + return new SqlValueType(SqlType.VarCharMax); + + // (3) If the declared type for a column contains the string "BLOB" + // or if no type is specified then the column has affinity NONE. + if (typeName.Contains("blob") || typeName==string.Empty) + return new SqlValueType(SqlType.VarBinaryMax); + + // (4) If the declared type for a column contains any of the strings + // "REAL", "FLOA", or "DOUB" then the column has REAL affinity. + if (typeName.Contains("real") || typeName.Contains("floa") || typeName.Contains("doub")) + return new SqlValueType(SqlType.Double); + + // (5) Otherwise, the affinity is NUMERIC. + return new SqlValueType(SqlType.Decimal); + } + + private string ParseTypeName(string typeDefinition) + { + var result = typeDefinition + .SkipWhile(char.IsWhiteSpace) + .TakeWhile(ch => char.IsLetterOrDigit(ch) || char.IsWhiteSpace(ch)) + .ToArray(); + return new string(result).ToLowerInvariant(); + } + + private static int ReadInt(IDataRecord row, int index) + { + decimal value = row.GetDecimal(index); + return value > int.MaxValue ? int.MaxValue : (int) value; + } + + private static string ReadStringOrNull(IDataRecord row, int index) + { + return row.IsDBNull(index) ? null : row.GetString(index); + } + + private static int? ReadNullableInt(IDataRecord reader, string column) + { + return Convert.IsDBNull(reader[column]) ? null : (int?) Convert.ToInt32(reader[column]); + } + + private static void ReadCascadeAction(ForeignKey foreignKey, IDataRecord row, int deleteRuleIndex) + { + var deleteRule = row.GetString(deleteRuleIndex); + switch (deleteRule) { + case "CASCADE": + foreignKey.OnDelete = ReferentialAction.Cascade; + return; + case "SET NULL": + foreignKey.OnDelete = ReferentialAction.SetNull; + return; + case "NO ACTION": + foreignKey.OnDelete = ReferentialAction.NoAction; + return; + } + } + + public Extractor(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/ServerInfoProvider.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/ServerInfoProvider.cs index 4b1e4112d5..ea95a8e539 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/ServerInfoProvider.cs @@ -1,280 +1,280 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class ServerInfoProvider : Info.ServerInfoProvider - { - private const int MaxIdentifierLength = 64; - - private readonly string databaseName; - private readonly string defaultSchemaName; - - public override EntityInfo GetCollationInfo() - { - EntityInfo collationInfo = new EntityInfo(); - collationInfo.MaxIdentifierLength = MaxIdentifierLength; - collationInfo.AllowedDdlStatements = DdlStatements.None; - return collationInfo; - } - - public override EntityInfo GetCharacterSetInfo() - { - EntityInfo characterSetInfo = new EntityInfo(); - characterSetInfo.MaxIdentifierLength = MaxIdentifierLength; - characterSetInfo.AllowedDdlStatements = DdlStatements.None; - return characterSetInfo; - } - - public override EntityInfo GetTranslationInfo() - { - return null; - } - - public override EntityInfo GetTriggerInfo() - { - EntityInfo triggerInfo = new EntityInfo(); - triggerInfo.MaxIdentifierLength = MaxIdentifierLength; - triggerInfo.AllowedDdlStatements = DdlStatements.All; - return triggerInfo; - } - - public override EntityInfo GetStoredProcedureInfo() - { - return null; - } - - public override SequenceInfo GetSequenceInfo() - { - return null; - } - - public override EntityInfo GetDatabaseInfo() - { - EntityInfo databaseInfo = new EntityInfo(); - databaseInfo.MaxIdentifierLength = MaxIdentifierLength; - databaseInfo.AllowedDdlStatements = DdlStatements.All; - return databaseInfo; - } - - public override ColumnInfo GetColumnInfo() - { - ColumnInfo columnInfo = new ColumnInfo(); - columnInfo.MaxIdentifierLength = MaxIdentifierLength; - columnInfo.Features = ColumnFeatures.Identity | ColumnFeatures.Computed; - columnInfo.AllowedDdlStatements = DdlStatements.Create; - return columnInfo; - } - - public override EntityInfo GetViewInfo() - { - EntityInfo viewInfo = new EntityInfo(); - viewInfo.MaxIdentifierLength = MaxIdentifierLength; - viewInfo.AllowedDdlStatements = DdlStatements.All; - return viewInfo; - } - - public override EntityInfo GetSchemaInfo() - { - EntityInfo schemaInfo = new EntityInfo(); - schemaInfo.MaxIdentifierLength = MaxIdentifierLength; - schemaInfo.AllowedDdlStatements = DdlStatements.All; - return schemaInfo; - } - - public override TableInfo GetTableInfo() - { - var tableInfo = new TableInfo(); - tableInfo.MaxIdentifierLength = MaxIdentifierLength; - tableInfo.AllowedDdlStatements = DdlStatements.All; - tableInfo.PartitionMethods = PartitionMethods.List | PartitionMethods.Range | PartitionMethods.Hash; - return tableInfo; - } - - public override TemporaryTableInfo GetTemporaryTableInfo() - { - var temporaryTableInfo = new TemporaryTableInfo(); - temporaryTableInfo.MaxIdentifierLength = MaxIdentifierLength; - temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; - temporaryTableInfo.Features = TemporaryTableFeatures.Local; - return temporaryTableInfo; - } - - public override CheckConstraintInfo GetCheckConstraintInfo() - { - var checkConstraintInfo = new CheckConstraintInfo(); - checkConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - checkConstraintInfo.MaxExpressionLength = 4000; - checkConstraintInfo.Features = CheckConstraintFeatures.None; - checkConstraintInfo.AllowedDdlStatements = DdlStatements.All; - return checkConstraintInfo; - } - - public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() - { - var primaryKeyInfo = new PrimaryKeyConstraintInfo(); - primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; - primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Clustered; - primaryKeyInfo.AllowedDdlStatements = DdlStatements.All; - primaryKeyInfo.ConstantName = Extractor.PrimaryKeyName; - return primaryKeyInfo; - } - - public override FullTextSearchInfo GetFullTextInfo() - { - return null; - } - - public override UniqueConstraintInfo GetUniqueConstraintInfo() - { - var uniqueConstraintInfo = new UniqueConstraintInfo(); - uniqueConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - uniqueConstraintInfo.Features = UniqueConstraintFeatures.Nullable; - uniqueConstraintInfo.AllowedDdlStatements = DdlStatements.All; - return uniqueConstraintInfo; - } - - public override IndexInfo GetIndexInfo() - { - var indexInfo = new IndexInfo(); - indexInfo.MaxIdentifierLength = MaxIdentifierLength; - indexInfo.MaxNumberOfColumns = 16; - indexInfo.MaxLength = 900; - indexInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - // SQLite supports sort order but this is not enabled by default - // Also extract is incapable of extracting such information anyway - indexInfo.Features = IndexFeatures.Unique; - indexInfo.PartitionMethods = PartitionMethods.None; - return indexInfo; - } - - public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() - { - return null; - } - - public override QueryInfo GetQueryInfo() - { - var queryInfo = new QueryInfo(); - queryInfo.MaxLength = 1000000; //http://www.sqlite.org/limits.html - queryInfo.MaxComparisonOperations = 1000; - queryInfo.MaxNestedSubqueriesAmount = 32; - queryInfo.ParameterPrefix = "@"; - queryInfo.Features = - QueryFeatures.NamedParameters - | QueryFeatures.ParameterPrefix - | QueryFeatures.Limit - | QueryFeatures.Offset - | QueryFeatures.InsertDefaultValues - | QueryFeatures.StrictJoinSyntax - | QueryFeatures.ScalarSubquery; - return queryInfo; - } - - public override ServerFeatures GetServerFeatures() - { - var result = ServerFeatures.Savepoints - | ServerFeatures.TransactionalKeyGenerators - | ServerFeatures.ExclusiveWriterConnection - | ServerFeatures.DateTimeEmulation - | ServerFeatures.DateTimeOffsetEmulation; - var dataSource = Driver.CoreServerInfo.DatabaseName.Trim().ToLowerInvariant(); - if (dataSource==":memory:") - result |= ServerFeatures.SingleConnection; - return result; - } - - public override IdentityInfo GetIdentityInfo() - { - var identityInfo = new IdentityInfo(); - identityInfo.Features = IdentityFeatures.None; - return identityInfo; - } - - public override DataTypeCollection GetDataTypesInfo() - { - var types = new DataTypeCollection(); - - var common = DataTypeFeatures.Default | DataTypeFeatures.Nullable - | DataTypeFeatures.NonKeyIndexing | DataTypeFeatures.Grouping - | DataTypeFeatures.Ordering | DataTypeFeatures.Multiple; - - var index = DataTypeFeatures.Indexing | DataTypeFeatures.Clustering - | DataTypeFeatures.FillFactor | DataTypeFeatures.KeyConstraint; - - var identity = DataTypeFeatures.Identity; - - types.Boolean = DataTypeInfo.Range(SqlType.Boolean, common | index, ValueRange.Bool, "bit"); - - types.UInt8 = DataTypeInfo.Range(SqlType.UInt8, common | index | identity, ValueRange.Byte, "tinyint"); - - types.Int16 = DataTypeInfo.Range(SqlType.Int16, common | index | identity, ValueRange.Int16, "smallint"); - - types.Int32 = DataTypeInfo.Range(SqlType.Int32, common | index | identity, ValueRange.Int32, "integer", "int"); - - types.Int64 = DataTypeInfo.Range(SqlType.Int64, common | index | identity, ValueRange.Int64, "bigint"); - - types.Decimal = DataTypeInfo.Regular(SqlType.Decimal, common | index, "decimal", "numeric"); - - types.Float = DataTypeInfo.Range(SqlType.Float, common | index, ValueRange.Float, "real"); - - types.Double = DataTypeInfo.Range(SqlType.Double, common | index, ValueRange.Double, "float"); - - types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, ValueRange.DateTime, "datetime"); - - types.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, common | index, ValueRange.DateTimeOffset, "datetimeoffset"); - - types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common | index, - "varchar", "nvarchar", "nchar", "char", "text", "xml"); - types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "blob"); - - types.Guid = DataTypeInfo.Regular(SqlType.Guid, common | index, "uniqueidentifier", "guid"); - - return types; - } - - public override IsolationLevels GetIsolationLevels() - { - var levels = IsolationLevels.ReadUncommitted - | IsolationLevels.ReadCommitted - | IsolationLevels.RepeatableRead - | IsolationLevels.Serializable - | IsolationLevels.Snapshot; - return levels; - } - - public override EntityInfo GetDomainInfo() - { - var domainInfo = new EntityInfo(); - domainInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - domainInfo.MaxIdentifierLength = MaxIdentifierLength; - return domainInfo; - } - - public override AssertConstraintInfo GetAssertionInfo() - { - var assertConstraintInfo = new AssertConstraintInfo(); - assertConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; - assertConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; - return assertConstraintInfo; - } - - public override int GetStringIndexingBase() - { - return 1; - } - - // Constructors - - public ServerInfoProvider(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class ServerInfoProvider : Info.ServerInfoProvider + { + private const int MaxIdentifierLength = 64; + + private readonly string databaseName; + private readonly string defaultSchemaName; + + public override EntityInfo GetCollationInfo() + { + EntityInfo collationInfo = new EntityInfo(); + collationInfo.MaxIdentifierLength = MaxIdentifierLength; + collationInfo.AllowedDdlStatements = DdlStatements.None; + return collationInfo; + } + + public override EntityInfo GetCharacterSetInfo() + { + EntityInfo characterSetInfo = new EntityInfo(); + characterSetInfo.MaxIdentifierLength = MaxIdentifierLength; + characterSetInfo.AllowedDdlStatements = DdlStatements.None; + return characterSetInfo; + } + + public override EntityInfo GetTranslationInfo() + { + return null; + } + + public override EntityInfo GetTriggerInfo() + { + EntityInfo triggerInfo = new EntityInfo(); + triggerInfo.MaxIdentifierLength = MaxIdentifierLength; + triggerInfo.AllowedDdlStatements = DdlStatements.All; + return triggerInfo; + } + + public override EntityInfo GetStoredProcedureInfo() + { + return null; + } + + public override SequenceInfo GetSequenceInfo() + { + return null; + } + + public override EntityInfo GetDatabaseInfo() + { + EntityInfo databaseInfo = new EntityInfo(); + databaseInfo.MaxIdentifierLength = MaxIdentifierLength; + databaseInfo.AllowedDdlStatements = DdlStatements.All; + return databaseInfo; + } + + public override ColumnInfo GetColumnInfo() + { + ColumnInfo columnInfo = new ColumnInfo(); + columnInfo.MaxIdentifierLength = MaxIdentifierLength; + columnInfo.Features = ColumnFeatures.Identity | ColumnFeatures.Computed; + columnInfo.AllowedDdlStatements = DdlStatements.Create; + return columnInfo; + } + + public override EntityInfo GetViewInfo() + { + EntityInfo viewInfo = new EntityInfo(); + viewInfo.MaxIdentifierLength = MaxIdentifierLength; + viewInfo.AllowedDdlStatements = DdlStatements.All; + return viewInfo; + } + + public override EntityInfo GetSchemaInfo() + { + EntityInfo schemaInfo = new EntityInfo(); + schemaInfo.MaxIdentifierLength = MaxIdentifierLength; + schemaInfo.AllowedDdlStatements = DdlStatements.All; + return schemaInfo; + } + + public override TableInfo GetTableInfo() + { + var tableInfo = new TableInfo(); + tableInfo.MaxIdentifierLength = MaxIdentifierLength; + tableInfo.AllowedDdlStatements = DdlStatements.All; + tableInfo.PartitionMethods = PartitionMethods.List | PartitionMethods.Range | PartitionMethods.Hash; + return tableInfo; + } + + public override TemporaryTableInfo GetTemporaryTableInfo() + { + var temporaryTableInfo = new TemporaryTableInfo(); + temporaryTableInfo.MaxIdentifierLength = MaxIdentifierLength; + temporaryTableInfo.AllowedDdlStatements = DdlStatements.All; + temporaryTableInfo.Features = TemporaryTableFeatures.Local; + return temporaryTableInfo; + } + + public override CheckConstraintInfo GetCheckConstraintInfo() + { + var checkConstraintInfo = new CheckConstraintInfo(); + checkConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + checkConstraintInfo.MaxExpressionLength = 4000; + checkConstraintInfo.Features = CheckConstraintFeatures.None; + checkConstraintInfo.AllowedDdlStatements = DdlStatements.All; + return checkConstraintInfo; + } + + public override PrimaryKeyConstraintInfo GetPrimaryKeyInfo() + { + var primaryKeyInfo = new PrimaryKeyConstraintInfo(); + primaryKeyInfo.MaxIdentifierLength = MaxIdentifierLength; + primaryKeyInfo.Features = PrimaryKeyConstraintFeatures.Clustered; + primaryKeyInfo.AllowedDdlStatements = DdlStatements.All; + primaryKeyInfo.ConstantName = Extractor.PrimaryKeyName; + return primaryKeyInfo; + } + + public override FullTextSearchInfo GetFullTextInfo() + { + return null; + } + + public override UniqueConstraintInfo GetUniqueConstraintInfo() + { + var uniqueConstraintInfo = new UniqueConstraintInfo(); + uniqueConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + uniqueConstraintInfo.Features = UniqueConstraintFeatures.Nullable; + uniqueConstraintInfo.AllowedDdlStatements = DdlStatements.All; + return uniqueConstraintInfo; + } + + public override IndexInfo GetIndexInfo() + { + var indexInfo = new IndexInfo(); + indexInfo.MaxIdentifierLength = MaxIdentifierLength; + indexInfo.MaxNumberOfColumns = 16; + indexInfo.MaxLength = 900; + indexInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + // SQLite supports sort order but this is not enabled by default + // Also extract is incapable of extracting such information anyway + indexInfo.Features = IndexFeatures.Unique; + indexInfo.PartitionMethods = PartitionMethods.None; + return indexInfo; + } + + public override ForeignKeyConstraintInfo GetForeignKeyConstraintInfo() + { + return null; + } + + public override QueryInfo GetQueryInfo() + { + var queryInfo = new QueryInfo(); + queryInfo.MaxLength = 1000000; //http://www.sqlite.org/limits.html + queryInfo.MaxComparisonOperations = 1000; + queryInfo.MaxNestedSubqueriesAmount = 32; + queryInfo.ParameterPrefix = "@"; + queryInfo.Features = + QueryFeatures.NamedParameters + | QueryFeatures.ParameterPrefix + | QueryFeatures.Limit + | QueryFeatures.Offset + | QueryFeatures.InsertDefaultValues + | QueryFeatures.StrictJoinSyntax + | QueryFeatures.ScalarSubquery; + return queryInfo; + } + + public override ServerFeatures GetServerFeatures() + { + var result = ServerFeatures.Savepoints + | ServerFeatures.TransactionalKeyGenerators + | ServerFeatures.ExclusiveWriterConnection + | ServerFeatures.DateTimeEmulation + | ServerFeatures.DateTimeOffsetEmulation; + var dataSource = Driver.CoreServerInfo.DatabaseName.Trim().ToLowerInvariant(); + if (dataSource==":memory:") + result |= ServerFeatures.SingleConnection; + return result; + } + + public override IdentityInfo GetIdentityInfo() + { + var identityInfo = new IdentityInfo(); + identityInfo.Features = IdentityFeatures.None; + return identityInfo; + } + + public override DataTypeCollection GetDataTypesInfo() + { + var types = new DataTypeCollection(); + + var common = DataTypeFeatures.Default | DataTypeFeatures.Nullable + | DataTypeFeatures.NonKeyIndexing | DataTypeFeatures.Grouping + | DataTypeFeatures.Ordering | DataTypeFeatures.Multiple; + + var index = DataTypeFeatures.Indexing | DataTypeFeatures.Clustering + | DataTypeFeatures.FillFactor | DataTypeFeatures.KeyConstraint; + + var identity = DataTypeFeatures.Identity; + + types.Boolean = DataTypeInfo.Range(SqlType.Boolean, common | index, ValueRange.Bool, "bit"); + + types.UInt8 = DataTypeInfo.Range(SqlType.UInt8, common | index | identity, ValueRange.Byte, "tinyint"); + + types.Int16 = DataTypeInfo.Range(SqlType.Int16, common | index | identity, ValueRange.Int16, "smallint"); + + types.Int32 = DataTypeInfo.Range(SqlType.Int32, common | index | identity, ValueRange.Int32, "integer", "int"); + + types.Int64 = DataTypeInfo.Range(SqlType.Int64, common | index | identity, ValueRange.Int64, "bigint"); + + types.Decimal = DataTypeInfo.Regular(SqlType.Decimal, common | index, "decimal", "numeric"); + + types.Float = DataTypeInfo.Range(SqlType.Float, common | index, ValueRange.Float, "real"); + + types.Double = DataTypeInfo.Range(SqlType.Double, common | index, ValueRange.Double, "float"); + + types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index, ValueRange.DateTime, "datetime"); + + types.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, common | index, ValueRange.DateTimeOffset, "datetimeoffset"); + + types.VarCharMax = DataTypeInfo.Regular(SqlType.VarCharMax, common | index, + "varchar", "nvarchar", "nchar", "char", "text", "xml"); + types.VarBinaryMax = DataTypeInfo.Regular(SqlType.VarBinaryMax, common, "blob"); + + types.Guid = DataTypeInfo.Regular(SqlType.Guid, common | index, "uniqueidentifier", "guid"); + + return types; + } + + public override IsolationLevels GetIsolationLevels() + { + var levels = IsolationLevels.ReadUncommitted + | IsolationLevels.ReadCommitted + | IsolationLevels.RepeatableRead + | IsolationLevels.Serializable + | IsolationLevels.Snapshot; + return levels; + } + + public override EntityInfo GetDomainInfo() + { + var domainInfo = new EntityInfo(); + domainInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + domainInfo.MaxIdentifierLength = MaxIdentifierLength; + return domainInfo; + } + + public override AssertConstraintInfo GetAssertionInfo() + { + var assertConstraintInfo = new AssertConstraintInfo(); + assertConstraintInfo.AllowedDdlStatements = DdlStatements.Create | DdlStatements.Drop; + assertConstraintInfo.MaxIdentifierLength = MaxIdentifierLength; + return assertConstraintInfo; + } + + public override int GetStringIndexingBase() + { + return 1; + } + + // Constructors + + public ServerInfoProvider(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs index 72697ad2c8..e15784b594 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs @@ -1,545 +1,545 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04. - -using System; -using System.Text; -using System.Linq; -using Xtensive.Core; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class Translator : SqlTranslator - { - private const string DateTimeCastFormat = "%Y-%m-%d %H:%M:%f"; - - /// - public override string DateTimeFormatString - { - get { return @"\'yyyy\-MM\-dd HH\:mm\:ss.fff\'"; } - } - - public virtual string DateTimeOffsetFormatString - { - get { return @"\'yyyy\-MM\-dd HH\:mm\:ss.fffK\'"; } - } - - public override string TimeSpanFormatString - { - get { return @"{0}{1}"; } - } - - /// - public override string DdlStatementDelimiter - { - get { return ";"; } - } - - /// - public override string BatchItemDelimiter - { - get { return ";\r\n"; } - } - - /// - public override void Initialize() - { - base.Initialize(); - FloatNumberFormat.NumberDecimalSeparator = "."; - DoubleNumberFormat.NumberDecimalSeparator = "."; - } - - /// - public override string Translate(SqlCompilerContext context, SchemaNode node) - { - return QuoteIdentifier(node.DbName); - } - - /// - public override string Translate(SqlFunctionType functionType) - { - switch (functionType) { - case SqlFunctionType.Acos: - case SqlFunctionType.Asin: - case SqlFunctionType.Atan: - case SqlFunctionType.Atan2: - case SqlFunctionType.Sin: - case SqlFunctionType.SessionUser: - case SqlFunctionType.Sqrt: - case SqlFunctionType.Square: - case SqlFunctionType.Tan: - case SqlFunctionType.Position: - case SqlFunctionType.Power: - throw SqlHelper.NotSupported(functionType.ToString()); - case SqlFunctionType.Concat: - return "||"; - case SqlFunctionType.IntervalAbs: - return "ABS"; - case SqlFunctionType.Substring: - return "SUBSTR"; - case SqlFunctionType.IntervalNegate: - return "-"; - case SqlFunctionType.CurrentDate: - return "DATE()"; - case SqlFunctionType.BinaryLength: - return "LENGTH"; - case SqlFunctionType.LastAutoGeneratedId: - return "LAST_INSERT_ROWID()"; - case SqlFunctionType.DateTimeAddMonths: - return "DATE"; - case SqlFunctionType.DateTimeConstruct: - return "DATETIME"; - } - return base.Translate(functionType); - } - - public override string Translate(SqlCompilerContext context, object literalValue) - { - var literalType = literalValue.GetType(); - - if (literalType==typeof (byte[])) - return ByteArrayToString((byte[]) literalValue); - if (literalType==typeof (TimeSpan)) - return Convert.ToString((long) ((TimeSpan) literalValue).Ticks * 100); - if (literalType==typeof (Boolean)) - return ((Boolean) literalValue) ? "1" : "0"; - if (literalType==typeof (Guid)) - return ByteArrayToString(((Guid) literalValue).ToByteArray()); - if (literalType==typeof (DateTimeOffset)) - return ((DateTimeOffset) literalValue).ToString(DateTimeOffsetFormatString, DateTimeFormat); - - return base.Translate(context, literalValue); - } - - private string ByteArrayToString(byte[] literalValue) - { - var result = new StringBuilder(literalValue.Length * 2 + 3); - result.Append("x'"); - result.AppendHexArray(literalValue); - result.Append("'"); - return result.ToString(); - } - - /// - public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) - { - switch (section) { - case AlterTableSection.Entry: - return "ALTER TABLE " + Translate(context, node.Table); - case AlterTableSection.AddColumn: - return "ADD"; - case AlterTableSection.Exit: - return string.Empty; - default: - throw SqlHelper.NotSupported(node.Action.GetType().Name); - } - } - - /// - public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) - { - switch (section) { - case ConstraintSection.Exit: - ForeignKey fk = constraint as ForeignKey; - if (fk!=null) { - if (fk.OnUpdate==ReferentialAction.Cascade) - return ") ON UPDATE CASCADE"; - if (fk.OnDelete==ReferentialAction.Cascade) - return ") ON DELETE CASCADE"; - } - return ")"; - default: - return base.Translate(context, constraint, section); - } - } - - /// - public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) - { - //switch (section) { - // case SequenceDescriptorSection.Increment: - // if (descriptor.Increment.HasValue) - // return "AUTOINCREMENT"; - // return string.Empty; - //} - return string.Empty; - } - - /// - public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) - { - switch (section) { - case CreateTableSection.Entry: - var builder = new StringBuilder(); - builder.Append("CREATE "); - var temporaryTable = node.Table as TemporaryTable; - if (temporaryTable!=null) - builder.Append("TEMPORARY TABLE " + Translate(context, temporaryTable)); - else - builder.Append("TABLE " + Translate(context, node.Table)); - return builder.ToString(); - case CreateTableSection.Exit: - return string.Empty; - } - return base.Translate(context, node, section); - } - - public override string Translate(SqlCompilerContext context, SqlCreateView node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - var sb = new StringBuilder(); - if (node.View.ViewColumns.Count > 0) { - sb.Append(" ("); - bool first = true; - foreach (DataTableColumn c in node.View.ViewColumns) { - if (first) - first = false; - else - sb.Append(ColumnDelimiter); - sb.Append(c.DbName); - } - sb.Append(")"); - } - return sb.ToString(); - case NodeSection.Exit: - return string.Empty; - default: - return string.Empty; - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropSchema node) - { - throw SqlHelper.NotSupported(node.GetType().Name); - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropTable node) - { - return "DROP TABLE IF EXISTS " + Translate(context, node.Table); - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropView node) - { - return "DROP VIEW IF EXISTS " + Translate(context, node.View); - } - - /// - public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) - { - if (node.FunctionType==SqlFunctionType.LastAutoGeneratedId) { - if (section==FunctionCallSection.Entry) - return Translate(node.FunctionType); - if (section==FunctionCallSection.Exit) - return string.Empty; - } - switch (section) { - case FunctionCallSection.ArgumentEntry: - return string.Empty; - case FunctionCallSection.ArgumentDelimiter: - return ArgumentDelimiter; - default: - return base.Translate(context, node, section, position); - } - } - - public override string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - switch (section) { - case UpdateSection.Entry: - return "UPDATE"; - case UpdateSection.Set: - return "SET"; - case UpdateSection.From: - return "FROM"; - case UpdateSection.Where: - return "WHERE"; - } - return string.Empty; - } - - public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - Index index = node.Index; - switch (section) { - case CreateIndexSection.Entry: - return string.Format("CREATE {0} INDEX {1} ON {2} ", index.IsUnique ? "UNIQUE" : String.Empty, QuoteIdentifier(index.Name), QuoteIdentifier(index.DataTable.Name)); - - case CreateIndexSection.Exit: - return string.Empty; - default: - return base.Translate(context, node, section); - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlDropIndex node) - { - var dropIndexTemplate = "DROP INDEX {0}.{1}"; - if (context==null) - return string.Format(dropIndexTemplate, node.Index.DataTable.Schema.Name, QuoteIdentifier(node.Index.DbName)); - return string.Format(dropIndexTemplate, context.SqlNodeActualizer.Actualize(node.Index.DataTable.Schema), QuoteIdentifier(node.Index.DbName)); - } - - /// - public override string Translate(SqlJoinMethod method) - { - switch (method) { - case SqlJoinMethod.Hash: - return "HASH"; - case SqlJoinMethod.Merge: - return "MERGE"; - case SqlJoinMethod.Loop: - return "LOOP"; - case SqlJoinMethod.Remote: - return "REMOTE"; - default: - return string.Empty; - } - } - - public override string Translate(SqlDateTimePart dateTimePart) - { - switch (dateTimePart) { - case SqlDateTimePart.Year: - return "'%Y'"; - case SqlDateTimePart.Month: - return "'%m'"; - case SqlDateTimePart.Day: - return "'%d'"; - case SqlDateTimePart.DayOfWeek: - return "'%w'"; - case SqlDateTimePart.DayOfYear: - return "'%j'"; - case SqlDateTimePart.Hour: - return "'%H'"; - case SqlDateTimePart.Minute: - return "'%M'"; - case SqlDateTimePart.Second: - return "'%S'"; - default: - throw SqlHelper.NotSupported(dateTimePart.ToString()); - } - } - - public override string Translate(SqlIntervalPart intervalPart) - { - throw SqlHelper.NotSupported(intervalPart.ToString()); - } - - /// - public override string Translate(SqlCompilerContext context, SqlExtract extract, ExtractSection section) - { - switch (section) { - case ExtractSection.Entry: - return "CAST(STRFTIME("; - case ExtractSection.From: - return ", "; - case ExtractSection.Exit: - return ") as INTEGER)"; - default: - return string.Empty; - } - } - - /// - public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - //http://www.sqlite.org/lang_expr.html - var sqlType = node.Type.Type; - - if (sqlType==SqlType.DateTime || - sqlType==SqlType.DateTimeOffset) { - switch (section) { - case NodeSection.Entry: - return string.Format("STRFTIME('{0}', ", DateTimeCastFormat); - case NodeSection.Exit: - return ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - } - - if (sqlType==SqlType.Binary || - sqlType==SqlType.Char || - sqlType==SqlType.Interval || - sqlType==SqlType.Int16 || - sqlType==SqlType.Int32 || - sqlType==SqlType.Int64) - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return "AS " + Translate(node.Type) + ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - if (sqlType==SqlType.Decimal || - sqlType==SqlType.Double || - sqlType==SqlType.Float) - switch (section) { - case NodeSection.Entry: - return string.Empty; - case NodeSection.Exit: - return "+ 0.0"; - default: - throw new ArgumentOutOfRangeException("section"); - } - return string.Empty; - } - - /// - public virtual string Translate(SqlCompilerContext context, SqlRenameColumn action) - { - throw SqlHelper.NotSupported(action.GetType().Name); - } - - /// - public override string Translate(SqlCompilerContext context, SqlTrim node, TrimSection section) - { - switch (section) { - case TrimSection.Entry: - switch (node.TrimType) { - case SqlTrimType.Leading: - return "LTRIM("; - case SqlTrimType.Trailing: - return "RTRIM("; - case SqlTrimType.Both: - return "TRIM("; - default: - throw new ArgumentOutOfRangeException(); - } - case TrimSection.Exit: - switch (node.TrimType) { - case SqlTrimType.Leading: - case SqlTrimType.Trailing: - return ")"; - case SqlTrimType.Both: - return ")"; - default: - throw new ArgumentOutOfRangeException(); - } - default: - throw new ArgumentOutOfRangeException(); - } - } - - /// - public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) - { - switch (section) { - case TableColumnSection.Type: - if (column.SequenceDescriptor==null) - return base.Translate(context, column, section); - return "integer"; // SQLite requires autoincrement columns to have exactly 'integer' type. - case TableColumnSection.Exit: - if (column.SequenceDescriptor==null) - return string.Empty; - var primaryKey = column.Table.TableConstraints.OfType().FirstOrDefault(); - if (primaryKey==null) - return string.Empty; - return string.Format("CONSTRAINT {0} PRIMARY KEY AUTOINCREMENT", QuoteIdentifier(primaryKey.Name)); - case TableColumnSection.GeneratedExit: - return string.Empty; - default: - return base.Translate(context, column, section); - } - } - - /// - public override string Translate(Collation collation) - { - return collation.DbName; - } - - /// - public override string Translate(SqlTrimType type) - { - return string.Empty; - } - - /// - public override string Translate(SqlLockType lockType) - { - if (lockType.Supports(SqlLockType.Shared)) - return "SHARED"; - if (lockType.Supports(SqlLockType.Exclusive)) - return "EXCLUSIVE"; - if (lockType.Supports(SqlLockType.SkipLocked) || lockType.Supports(SqlLockType.ThrowIfLocked)) - return base.Translate(lockType); - return "PENDING"; //http://www.sqlite.org/lockingv3.html Not sure whether this is the best alternative. - } - - /// - public override string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.DateTimePlusInterval: - case SqlNodeType.DateTimeOffsetPlusInterval: - return "+"; - case SqlNodeType.DateTimeMinusInterval: - case SqlNodeType.DateTimeMinusDateTime: - case SqlNodeType.DateTimeOffsetMinusInterval: - case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: - return "-"; - case SqlNodeType.Overlaps: - throw SqlHelper.NotSupported(type.ToString()); - default: - return base.Translate(type); - } - } - - protected virtual string TranslateClrType(Type type) - { - switch (Type.GetTypeCode(type)) { - case TypeCode.Boolean: - return "bit"; - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - return "int"; - case TypeCode.Int64: - case TypeCode.UInt64: - return "bigint"; - case TypeCode.Decimal: - case TypeCode.Single: - case TypeCode.Double: - return "numeric"; - case TypeCode.Char: - case TypeCode.String: - return "text"; - case TypeCode.DateTime: - return "timestamp"; - default: - if (type==typeof (TimeSpan)) - return "bigint"; - if (type==typeof (Guid)) - return "guid"; - return "text"; - } - } - - // Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The driver. - protected internal Translator(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04. + +using System; +using System.Text; +using System.Linq; +using Xtensive.Core; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class Translator : SqlTranslator + { + private const string DateTimeCastFormat = "%Y-%m-%d %H:%M:%f"; + + /// + public override string DateTimeFormatString + { + get { return @"\'yyyy\-MM\-dd HH\:mm\:ss.fff\'"; } + } + + public virtual string DateTimeOffsetFormatString + { + get { return @"\'yyyy\-MM\-dd HH\:mm\:ss.fffK\'"; } + } + + public override string TimeSpanFormatString + { + get { return @"{0}{1}"; } + } + + /// + public override string DdlStatementDelimiter + { + get { return ";"; } + } + + /// + public override string BatchItemDelimiter + { + get { return ";\r\n"; } + } + + /// + public override void Initialize() + { + base.Initialize(); + FloatNumberFormat.NumberDecimalSeparator = "."; + DoubleNumberFormat.NumberDecimalSeparator = "."; + } + + /// + public override string Translate(SqlCompilerContext context, SchemaNode node) + { + return QuoteIdentifier(node.DbName); + } + + /// + public override string Translate(SqlFunctionType functionType) + { + switch (functionType) { + case SqlFunctionType.Acos: + case SqlFunctionType.Asin: + case SqlFunctionType.Atan: + case SqlFunctionType.Atan2: + case SqlFunctionType.Sin: + case SqlFunctionType.SessionUser: + case SqlFunctionType.Sqrt: + case SqlFunctionType.Square: + case SqlFunctionType.Tan: + case SqlFunctionType.Position: + case SqlFunctionType.Power: + throw SqlHelper.NotSupported(functionType.ToString()); + case SqlFunctionType.Concat: + return "||"; + case SqlFunctionType.IntervalAbs: + return "ABS"; + case SqlFunctionType.Substring: + return "SUBSTR"; + case SqlFunctionType.IntervalNegate: + return "-"; + case SqlFunctionType.CurrentDate: + return "DATE()"; + case SqlFunctionType.BinaryLength: + return "LENGTH"; + case SqlFunctionType.LastAutoGeneratedId: + return "LAST_INSERT_ROWID()"; + case SqlFunctionType.DateTimeAddMonths: + return "DATE"; + case SqlFunctionType.DateTimeConstruct: + return "DATETIME"; + } + return base.Translate(functionType); + } + + public override string Translate(SqlCompilerContext context, object literalValue) + { + var literalType = literalValue.GetType(); + + if (literalType==typeof (byte[])) + return ByteArrayToString((byte[]) literalValue); + if (literalType==typeof (TimeSpan)) + return Convert.ToString((long) ((TimeSpan) literalValue).Ticks * 100); + if (literalType==typeof (Boolean)) + return ((Boolean) literalValue) ? "1" : "0"; + if (literalType==typeof (Guid)) + return ByteArrayToString(((Guid) literalValue).ToByteArray()); + if (literalType==typeof (DateTimeOffset)) + return ((DateTimeOffset) literalValue).ToString(DateTimeOffsetFormatString, DateTimeFormat); + + return base.Translate(context, literalValue); + } + + private string ByteArrayToString(byte[] literalValue) + { + var result = new StringBuilder(literalValue.Length * 2 + 3); + result.Append("x'"); + result.AppendHexArray(literalValue); + result.Append("'"); + return result.ToString(); + } + + /// + public override string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) + { + switch (section) { + case AlterTableSection.Entry: + return "ALTER TABLE " + Translate(context, node.Table); + case AlterTableSection.AddColumn: + return "ADD"; + case AlterTableSection.Exit: + return string.Empty; + default: + throw SqlHelper.NotSupported(node.Action.GetType().Name); + } + } + + /// + public override string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) + { + switch (section) { + case ConstraintSection.Exit: + ForeignKey fk = constraint as ForeignKey; + if (fk!=null) { + if (fk.OnUpdate==ReferentialAction.Cascade) + return ") ON UPDATE CASCADE"; + if (fk.OnDelete==ReferentialAction.Cascade) + return ") ON DELETE CASCADE"; + } + return ")"; + default: + return base.Translate(context, constraint, section); + } + } + + /// + public override string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) + { + //switch (section) { + // case SequenceDescriptorSection.Increment: + // if (descriptor.Increment.HasValue) + // return "AUTOINCREMENT"; + // return string.Empty; + //} + return string.Empty; + } + + /// + public override string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) + { + switch (section) { + case CreateTableSection.Entry: + var builder = new StringBuilder(); + builder.Append("CREATE "); + var temporaryTable = node.Table as TemporaryTable; + if (temporaryTable!=null) + builder.Append("TEMPORARY TABLE " + Translate(context, temporaryTable)); + else + builder.Append("TABLE " + Translate(context, node.Table)); + return builder.ToString(); + case CreateTableSection.Exit: + return string.Empty; + } + return base.Translate(context, node, section); + } + + public override string Translate(SqlCompilerContext context, SqlCreateView node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + var sb = new StringBuilder(); + if (node.View.ViewColumns.Count > 0) { + sb.Append(" ("); + bool first = true; + foreach (DataTableColumn c in node.View.ViewColumns) { + if (first) + first = false; + else + sb.Append(ColumnDelimiter); + sb.Append(c.DbName); + } + sb.Append(")"); + } + return sb.ToString(); + case NodeSection.Exit: + return string.Empty; + default: + return string.Empty; + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropSchema node) + { + throw SqlHelper.NotSupported(node.GetType().Name); + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropTable node) + { + return "DROP TABLE IF EXISTS " + Translate(context, node.Table); + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropView node) + { + return "DROP VIEW IF EXISTS " + Translate(context, node.View); + } + + /// + public override string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) + { + if (node.FunctionType==SqlFunctionType.LastAutoGeneratedId) { + if (section==FunctionCallSection.Entry) + return Translate(node.FunctionType); + if (section==FunctionCallSection.Exit) + return string.Empty; + } + switch (section) { + case FunctionCallSection.ArgumentEntry: + return string.Empty; + case FunctionCallSection.ArgumentDelimiter: + return ArgumentDelimiter; + default: + return base.Translate(context, node, section, position); + } + } + + public override string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) + { + switch (section) { + case UpdateSection.Entry: + return "UPDATE"; + case UpdateSection.Set: + return "SET"; + case UpdateSection.From: + return "FROM"; + case UpdateSection.Where: + return "WHERE"; + } + return string.Empty; + } + + public override string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + Index index = node.Index; + switch (section) { + case CreateIndexSection.Entry: + return string.Format("CREATE {0} INDEX {1} ON {2} ", index.IsUnique ? "UNIQUE" : String.Empty, QuoteIdentifier(index.Name), QuoteIdentifier(index.DataTable.Name)); + + case CreateIndexSection.Exit: + return string.Empty; + default: + return base.Translate(context, node, section); + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlDropIndex node) + { + var dropIndexTemplate = "DROP INDEX {0}.{1}"; + if (context==null) + return string.Format(dropIndexTemplate, node.Index.DataTable.Schema.Name, QuoteIdentifier(node.Index.DbName)); + return string.Format(dropIndexTemplate, context.SqlNodeActualizer.Actualize(node.Index.DataTable.Schema), QuoteIdentifier(node.Index.DbName)); + } + + /// + public override string Translate(SqlJoinMethod method) + { + switch (method) { + case SqlJoinMethod.Hash: + return "HASH"; + case SqlJoinMethod.Merge: + return "MERGE"; + case SqlJoinMethod.Loop: + return "LOOP"; + case SqlJoinMethod.Remote: + return "REMOTE"; + default: + return string.Empty; + } + } + + public override string Translate(SqlDateTimePart dateTimePart) + { + switch (dateTimePart) { + case SqlDateTimePart.Year: + return "'%Y'"; + case SqlDateTimePart.Month: + return "'%m'"; + case SqlDateTimePart.Day: + return "'%d'"; + case SqlDateTimePart.DayOfWeek: + return "'%w'"; + case SqlDateTimePart.DayOfYear: + return "'%j'"; + case SqlDateTimePart.Hour: + return "'%H'"; + case SqlDateTimePart.Minute: + return "'%M'"; + case SqlDateTimePart.Second: + return "'%S'"; + default: + throw SqlHelper.NotSupported(dateTimePart.ToString()); + } + } + + public override string Translate(SqlIntervalPart intervalPart) + { + throw SqlHelper.NotSupported(intervalPart.ToString()); + } + + /// + public override string Translate(SqlCompilerContext context, SqlExtract extract, ExtractSection section) + { + switch (section) { + case ExtractSection.Entry: + return "CAST(STRFTIME("; + case ExtractSection.From: + return ", "; + case ExtractSection.Exit: + return ") as INTEGER)"; + default: + return string.Empty; + } + } + + /// + public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + //http://www.sqlite.org/lang_expr.html + var sqlType = node.Type.Type; + + if (sqlType==SqlType.DateTime || + sqlType==SqlType.DateTimeOffset) { + switch (section) { + case NodeSection.Entry: + return string.Format("STRFTIME('{0}', ", DateTimeCastFormat); + case NodeSection.Exit: + return ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + } + + if (sqlType==SqlType.Binary || + sqlType==SqlType.Char || + sqlType==SqlType.Interval || + sqlType==SqlType.Int16 || + sqlType==SqlType.Int32 || + sqlType==SqlType.Int64) + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return "AS " + Translate(node.Type) + ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + if (sqlType==SqlType.Decimal || + sqlType==SqlType.Double || + sqlType==SqlType.Float) + switch (section) { + case NodeSection.Entry: + return string.Empty; + case NodeSection.Exit: + return "+ 0.0"; + default: + throw new ArgumentOutOfRangeException("section"); + } + return string.Empty; + } + + /// + public virtual string Translate(SqlCompilerContext context, SqlRenameColumn action) + { + throw SqlHelper.NotSupported(action.GetType().Name); + } + + /// + public override string Translate(SqlCompilerContext context, SqlTrim node, TrimSection section) + { + switch (section) { + case TrimSection.Entry: + switch (node.TrimType) { + case SqlTrimType.Leading: + return "LTRIM("; + case SqlTrimType.Trailing: + return "RTRIM("; + case SqlTrimType.Both: + return "TRIM("; + default: + throw new ArgumentOutOfRangeException(); + } + case TrimSection.Exit: + switch (node.TrimType) { + case SqlTrimType.Leading: + case SqlTrimType.Trailing: + return ")"; + case SqlTrimType.Both: + return ")"; + default: + throw new ArgumentOutOfRangeException(); + } + default: + throw new ArgumentOutOfRangeException(); + } + } + + /// + public override string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) + { + switch (section) { + case TableColumnSection.Type: + if (column.SequenceDescriptor==null) + return base.Translate(context, column, section); + return "integer"; // SQLite requires autoincrement columns to have exactly 'integer' type. + case TableColumnSection.Exit: + if (column.SequenceDescriptor==null) + return string.Empty; + var primaryKey = column.Table.TableConstraints.OfType().FirstOrDefault(); + if (primaryKey==null) + return string.Empty; + return string.Format("CONSTRAINT {0} PRIMARY KEY AUTOINCREMENT", QuoteIdentifier(primaryKey.Name)); + case TableColumnSection.GeneratedExit: + return string.Empty; + default: + return base.Translate(context, column, section); + } + } + + /// + public override string Translate(Collation collation) + { + return collation.DbName; + } + + /// + public override string Translate(SqlTrimType type) + { + return string.Empty; + } + + /// + public override string Translate(SqlLockType lockType) + { + if (lockType.Supports(SqlLockType.Shared)) + return "SHARED"; + if (lockType.Supports(SqlLockType.Exclusive)) + return "EXCLUSIVE"; + if (lockType.Supports(SqlLockType.SkipLocked) || lockType.Supports(SqlLockType.ThrowIfLocked)) + return base.Translate(lockType); + return "PENDING"; //http://www.sqlite.org/lockingv3.html Not sure whether this is the best alternative. + } + + /// + public override string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.DateTimePlusInterval: + case SqlNodeType.DateTimeOffsetPlusInterval: + return "+"; + case SqlNodeType.DateTimeMinusInterval: + case SqlNodeType.DateTimeMinusDateTime: + case SqlNodeType.DateTimeOffsetMinusInterval: + case SqlNodeType.DateTimeOffsetMinusDateTimeOffset: + return "-"; + case SqlNodeType.Overlaps: + throw SqlHelper.NotSupported(type.ToString()); + default: + return base.Translate(type); + } + } + + protected virtual string TranslateClrType(Type type) + { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + return "bit"; + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + return "int"; + case TypeCode.Int64: + case TypeCode.UInt64: + return "bigint"; + case TypeCode.Decimal: + case TypeCode.Single: + case TypeCode.Double: + return "numeric"; + case TypeCode.Char: + case TypeCode.String: + return "text"; + case TypeCode.DateTime: + return "timestamp"; + default: + if (type==typeof (TimeSpan)) + return "bigint"; + if (type==typeof (Guid)) + return "guid"; + return "text"; + } + } + + // Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The driver. + protected internal Translator(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/TypeMapper.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/TypeMapper.cs index 9f46a0965c..86205567d5 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/TypeMapper.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/TypeMapper.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.04.29 - -using System; -using System.Data; -using System.Data.Common; -using System.Data.SQLite; -using System.Globalization; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Drivers.Sqlite.v3 -{ - internal class TypeMapper : Sql.TypeMapper - { - private ValueRange dateTimeRange; - private ValueRange dateTimeOffsetRange; - - private const string DateTimeOffsetFormat = "yyyy-MM-dd HH:mm:ss.fffK"; - - public override object ReadBoolean(DbDataReader reader, int index) - { - var value = reader.GetDecimal(index); - return SQLiteConvert.ToBoolean(value); - } - - public override object ReadDateTimeOffset(DbDataReader reader, int index) - { - var value = reader.GetString(index); - return DateTimeOffset.ParseExact(value, DateTimeOffsetFormat, CultureInfo.InvariantCulture); - } - - public override void BindSByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int16; - parameter.Value = value ?? DBNull.Value; - } - - public override void BindUShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int32; - parameter.Value = value ?? DBNull.Value; - } - - public override void BindUInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int64; - parameter.Value = value ?? DBNull.Value; - } - - public override void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value ?? DBNull.Value; - } - - public override void BindDateTime(DbParameter parameter, object value) - { - if (value!=null) - value = ValueRangeValidator.Correct((DateTime) value, dateTimeRange); - base.BindDateTime(parameter, value); - } - - public override void BindDateTimeOffset(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - if (value==null) { - parameter.Value = DBNull.Value; - return; - } - var correctValue = ValueRangeValidator.Correct((DateTimeOffset) value, dateTimeOffsetRange); - parameter.Value = correctValue.ToString(DateTimeOffsetFormat, CultureInfo.InvariantCulture); - } - - public override SqlValueType MapDecimal(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Decimal); - } - - public override SqlValueType MapChar(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarCharMax); - } - - public override SqlValueType MapString(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarCharMax); - } - - public override SqlValueType MapByteArray(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarBinaryMax); - } - - public override SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - public override SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int32); - } - - public override SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - public override SqlValueType MapULong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - public override SqlValueType MapDateTimeOffset(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.DateTimeOffset); - } - - public override void Initialize() - { - base.Initialize(); - dateTimeRange = (ValueRange) Driver.ServerInfo.DataTypes.DateTime.ValueRange; - dateTimeOffsetRange = (ValueRange) Driver.ServerInfo.DataTypes.DateTimeOffset.ValueRange; - } - - // Constructors - - public TypeMapper(SqlDriver driver) - : base(driver) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.04.29 + +using System; +using System.Data; +using System.Data.Common; +using System.Data.SQLite; +using System.Globalization; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Drivers.Sqlite.v3 +{ + internal class TypeMapper : Sql.TypeMapper + { + private ValueRange dateTimeRange; + private ValueRange dateTimeOffsetRange; + + private const string DateTimeOffsetFormat = "yyyy-MM-dd HH:mm:ss.fffK"; + + public override object ReadBoolean(DbDataReader reader, int index) + { + var value = reader.GetDecimal(index); + return SQLiteConvert.ToBoolean(value); + } + + public override object ReadDateTimeOffset(DbDataReader reader, int index) + { + var value = reader.GetString(index); + return DateTimeOffset.ParseExact(value, DateTimeOffsetFormat, CultureInfo.InvariantCulture); + } + + public override void BindSByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int16; + parameter.Value = value ?? DBNull.Value; + } + + public override void BindUShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int32; + parameter.Value = value ?? DBNull.Value; + } + + public override void BindUInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int64; + parameter.Value = value ?? DBNull.Value; + } + + public override void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value ?? DBNull.Value; + } + + public override void BindDateTime(DbParameter parameter, object value) + { + if (value!=null) + value = ValueRangeValidator.Correct((DateTime) value, dateTimeRange); + base.BindDateTime(parameter, value); + } + + public override void BindDateTimeOffset(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + if (value==null) { + parameter.Value = DBNull.Value; + return; + } + var correctValue = ValueRangeValidator.Correct((DateTimeOffset) value, dateTimeOffsetRange); + parameter.Value = correctValue.ToString(DateTimeOffsetFormat, CultureInfo.InvariantCulture); + } + + public override SqlValueType MapDecimal(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Decimal); + } + + public override SqlValueType MapChar(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarCharMax); + } + + public override SqlValueType MapString(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarCharMax); + } + + public override SqlValueType MapByteArray(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarBinaryMax); + } + + public override SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + public override SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int32); + } + + public override SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + public override SqlValueType MapULong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + public override SqlValueType MapDateTimeOffset(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.DateTimeOffset); + } + + public override void Initialize() + { + base.Initialize(); + dateTimeRange = (ValueRange) Driver.ServerInfo.DataTypes.DateTime.ValueRange; + dateTimeOffsetRange = (ValueRange) Driver.ServerInfo.DataTypes.DateTimeOffset.ValueRange; + } + + // Constructors + + public TypeMapper(SqlDriver driver) + : base(driver) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Sqlite/Xtensive.Orm.Sqlite.csproj b/Orm/Xtensive.Orm.Sqlite/Xtensive.Orm.Sqlite.csproj index d63e28e9ba..e9abfd5c21 100644 --- a/Orm/Xtensive.Orm.Sqlite/Xtensive.Orm.Sqlite.csproj +++ b/Orm/Xtensive.Orm.Sqlite/Xtensive.Orm.Sqlite.csproj @@ -1,30 +1,30 @@ - - - true - ..\..\_Build\$(Configuration)\lib\ - ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Sqlite.xml - - - netstandard2.0 - Xtensive - Xtensive.Orm.Sqlite - $(DoProductName) provider for SQLite - $(Title) - Adds support for SQLite to $(DoProductName) - true - ..\Orm.snk - true - 2 - - - - - - - - - - Properties\Visibility.cs - - + + + true + ..\..\_Build\$(Configuration)\lib\ + ..\..\_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.Sqlite.xml + + + netstandard2.0 + Xtensive + Xtensive.Orm.Sqlite + $(DoProductName) provider for SQLite + $(Title) + Adds support for SQLite to $(DoProductName) + true + ..\Orm.snk + true + 2 + + + + + + + + + + Properties\Visibility.cs + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/App.config b/Orm/Xtensive.Orm.Tests.Core/App.config index 4d50086aff..956b97cb37 100644 --- a/Orm/Xtensive.Orm.Tests.Core/App.config +++ b/Orm/Xtensive.Orm.Tests.Core/App.config @@ -1,49 +1,49 @@ - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests.Core/ArgumentValidatorTest.cs b/Orm/Xtensive.Orm.Tests.Core/ArgumentValidatorTest.cs index a5f9c79515..fedb316c8f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/ArgumentValidatorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/ArgumentValidatorTest.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.15 - -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core -{ - [TestFixture] - public class ArgumentValidatorTest - { - [Test] - public void CombinedTest() - { - ArgumentValidator.EnsureArgumentIsGreaterThan(1, 0, "x"); - AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsGreaterThan(0, 0, "x")); - AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsGreaterThan(-1, 0, "x")); - - ArgumentValidator.EnsureArgumentIsLessThan(-1, 0, "x"); - AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsLessThan(0, 0, "x")); - AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsLessThan(1, 0, "x")); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.15 + +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core +{ + [TestFixture] + public class ArgumentValidatorTest + { + [Test] + public void CombinedTest() + { + ArgumentValidator.EnsureArgumentIsGreaterThan(1, 0, "x"); + AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsGreaterThan(0, 0, "x")); + AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsGreaterThan(-1, 0, "x")); + + ArgumentValidator.EnsureArgumentIsLessThan(-1, 0, "x"); + AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsLessThan(0, 0, "x")); + AssertEx.ThrowsArgumentOutOfRangeException(() => ArgumentValidator.EnsureArgumentIsLessThan(1, 0, "x")); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Arithmetics/AritmeticsTest.cs b/Orm/Xtensive.Orm.Tests.Core/Arithmetics/AritmeticsTest.cs index fb5d3cabd4..d0144f08bb 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Arithmetics/AritmeticsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Arithmetics/AritmeticsTest.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.22 - -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Arithmetic; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Arithmetics -{ - [TestFixture] - public class AritmeticsTest - { - private readonly Random random = RandomManager.CreateRandom(); - - [Test] - public void Test() - { - const int count = 100; - Assert.IsNull(Arithmetic.Default); - Arithmetic longArithmetic = Arithmetic.Default; - Arithmetic doubleArithmetic = Arithmetic.Default; - Arithmetic intArithmetic = Arithmetic.Default; - Assert.IsNotNull(longArithmetic); - Assert.IsNotNull(doubleArithmetic); - Assert.IsNotNull(intArithmetic); - Assert.AreEqual(longArithmetic.Implementation.GetType().Name, "Int64Arithmetic"); - Assert.AreEqual(intArithmetic.Implementation.GetType().Name, "Int32Arithmetic"); - Assert.AreEqual(doubleArithmetic.Implementation.GetType().Name, "DoubleArithmetic"); - checked { - IEnumerable longValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); - foreach (long longValue in longValues) { - AssertEx.ResultsAreEqual(() => (long) (longValue/12.34d), () => longArithmetic.Divide(longValue, 12.34d)); - AssertEx.ResultsAreEqual(() => (long) (longValue*12.34d), () => longArithmetic.Multiply(longValue, 12.34d)); - AssertEx.ResultsAreEqual(() => longValue + longValue, () => longArithmetic.Add(longValue, longValue)); - AssertEx.ResultsAreEqual(() => longValue - longValue, () => longArithmetic.Subtract(longValue, longValue)); - AssertEx.ResultsAreEqual(() => -longValue, () => longArithmetic.Negation(longValue)); - } - IEnumerable intValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); - foreach (int intValue in intValues) { - AssertEx.ResultsAreEqual(() => (int) (intValue/12.34d), () => intArithmetic.Divide(intValue, 12.34d)); - AssertEx.ResultsAreEqual(() => (int) (intValue*12.34d), () => intArithmetic.Multiply(intValue, 12.34d)); - AssertEx.ResultsAreEqual(() => intValue + intValue, () => intArithmetic.Add(intValue, intValue)); - AssertEx.ResultsAreEqual(() => intValue - intValue, () => intArithmetic.Subtract(intValue, intValue)); - AssertEx.ResultsAreEqual(() => -intValue, () => intArithmetic.Negation(intValue)); - } - IEnumerable doubleValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); - foreach (double doubleValue in doubleValues) { - AssertEx.ResultsAreEqual(() => doubleValue/12.34d, () => doubleArithmetic.Divide(doubleValue, 12.34d)); - AssertEx.ResultsAreEqual(() => doubleValue*12.34d, () => doubleArithmetic.Multiply(doubleValue, 12.34d)); - AssertEx.ResultsAreEqual(() => doubleValue + doubleValue, () => doubleArithmetic.Add(doubleValue, doubleValue)); - AssertEx.ResultsAreEqual(() => doubleValue - doubleValue, () => doubleArithmetic.Subtract(doubleValue, doubleValue)); - AssertEx.ResultsAreEqual(() => -doubleValue, () => doubleArithmetic.Negation(doubleValue)); - } - } - } - - - [Test] - [Explicit] - public void PerfTest() - { - int count = 500*1000*1000; - PerfTestInternal(count); - PerfTestInternal(count); - } - - [Test] - public void RulesTest() - { - Arithmetic defaultArithmetic = Arithmetic.Default; - Arithmetic arithmetic1 = - defaultArithmetic.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsNull, OverflowBehavior.AllowOverflow)); - Arithmetic arithmetic2 = - arithmetic1.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsZero, OverflowBehavior.DenyOverflow)); - Arithmetic arithmetic3 = - defaultArithmetic.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsNull, OverflowBehavior.AllowOverflow)); - Assert.AreEqual(arithmetic1, arithmetic3); - Assert.AreNotEqual(arithmetic1, arithmetic2); - } - - private void PerfTestInternal(int count) - { - // Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - T instance1 = generator.GetInstance(random); - T instance2 = generator.GetInstance(random); - Arithmetic arithmetic = Arithmetic.Default; - using(new Measurement(typeof(T).Name, count)) { - for(int i=0;i.Default); + Arithmetic longArithmetic = Arithmetic.Default; + Arithmetic doubleArithmetic = Arithmetic.Default; + Arithmetic intArithmetic = Arithmetic.Default; + Assert.IsNotNull(longArithmetic); + Assert.IsNotNull(doubleArithmetic); + Assert.IsNotNull(intArithmetic); + Assert.AreEqual(longArithmetic.Implementation.GetType().Name, "Int64Arithmetic"); + Assert.AreEqual(intArithmetic.Implementation.GetType().Name, "Int32Arithmetic"); + Assert.AreEqual(doubleArithmetic.Implementation.GetType().Name, "DoubleArithmetic"); + checked { + IEnumerable longValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); + foreach (long longValue in longValues) { + AssertEx.ResultsAreEqual(() => (long) (longValue/12.34d), () => longArithmetic.Divide(longValue, 12.34d)); + AssertEx.ResultsAreEqual(() => (long) (longValue*12.34d), () => longArithmetic.Multiply(longValue, 12.34d)); + AssertEx.ResultsAreEqual(() => longValue + longValue, () => longArithmetic.Add(longValue, longValue)); + AssertEx.ResultsAreEqual(() => longValue - longValue, () => longArithmetic.Subtract(longValue, longValue)); + AssertEx.ResultsAreEqual(() => -longValue, () => longArithmetic.Negation(longValue)); + } + IEnumerable intValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); + foreach (int intValue in intValues) { + AssertEx.ResultsAreEqual(() => (int) (intValue/12.34d), () => intArithmetic.Divide(intValue, 12.34d)); + AssertEx.ResultsAreEqual(() => (int) (intValue*12.34d), () => intArithmetic.Multiply(intValue, 12.34d)); + AssertEx.ResultsAreEqual(() => intValue + intValue, () => intArithmetic.Add(intValue, intValue)); + AssertEx.ResultsAreEqual(() => intValue - intValue, () => intArithmetic.Subtract(intValue, intValue)); + AssertEx.ResultsAreEqual(() => -intValue, () => intArithmetic.Negation(intValue)); + } + IEnumerable doubleValues = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(random, count); + foreach (double doubleValue in doubleValues) { + AssertEx.ResultsAreEqual(() => doubleValue/12.34d, () => doubleArithmetic.Divide(doubleValue, 12.34d)); + AssertEx.ResultsAreEqual(() => doubleValue*12.34d, () => doubleArithmetic.Multiply(doubleValue, 12.34d)); + AssertEx.ResultsAreEqual(() => doubleValue + doubleValue, () => doubleArithmetic.Add(doubleValue, doubleValue)); + AssertEx.ResultsAreEqual(() => doubleValue - doubleValue, () => doubleArithmetic.Subtract(doubleValue, doubleValue)); + AssertEx.ResultsAreEqual(() => -doubleValue, () => doubleArithmetic.Negation(doubleValue)); + } + } + } + + + [Test] + [Explicit] + public void PerfTest() + { + int count = 500*1000*1000; + PerfTestInternal(count); + PerfTestInternal(count); + } + + [Test] + public void RulesTest() + { + Arithmetic defaultArithmetic = Arithmetic.Default; + Arithmetic arithmetic1 = + defaultArithmetic.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsNull, OverflowBehavior.AllowOverflow)); + Arithmetic arithmetic2 = + arithmetic1.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsZero, OverflowBehavior.DenyOverflow)); + Arithmetic arithmetic3 = + defaultArithmetic.ApplyRules(new ArithmeticRules(NullBehavior.ThreatNullAsNull, OverflowBehavior.AllowOverflow)); + Assert.AreEqual(arithmetic1, arithmetic3); + Assert.AreNotEqual(arithmetic1, arithmetic2); + } + + private void PerfTestInternal(int count) + { + // Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + T instance1 = generator.GetInstance(random); + T instance2 = generator.GetInstance(random); + Arithmetic arithmetic = Arithmetic.Default; + using(new Measurement(typeof(T).Name, count)) { + for(int i=0;i, IIdentified, IHasSize - { - public string Value { get; private set; } - - object IIdentified.Identifier - { - get { return Identifier; } - } - - public Item Identifier - { - get { return this; } - } - - public long Size - { - get { return 1; } - } - - public bool Equals(Item obj) - { - if (obj==null) - return false; - return obj.Value==Value; - } - - public override bool Equals(object obj) - { - return Equals(obj as Item); - } - - public override int GetHashCode() - { - return (Value!=null ? Value.GetHashCode() : 0); - } - - public override string ToString() - { - return string.Format("{0}", Value); - } - - public Item(string value) - { - Value = value; - } - } - - #endregion - - public const int LruCapacity = 90000; - public const int MfuCapacity = 10000; - public const int Capacity = LruCapacity + MfuCapacity; - - public const int BaseCount = 10000000; - public const int InsertCount = (int) (1.1 * Capacity); - - private static LruCache lruCache = - new LruCache(Capacity, i => i); - private static LruCache lruCache2 = - new LruCache(Capacity, i => i); - private static MfLruCache mfLruCache = - new MfLruCache(LruCapacity, MfuCapacity, 5, i => i); - private static WeakCache weakCache = - new WeakCache(false, i => i); - private static WeakestCache weakestCache = - new WeakestCache(false, false, i => i); - private static LruCache lruWeakestCache = - new LruCache(LruCapacity + MfuCapacity, i => i, - new WeakestCache(false, false, i => i)); - private static InfiniteCache infiniteCache = new InfiniteCache(i => i); - private static ICache[] caches = new ICache[] {lruCache, lruCache2, mfLruCache, weakCache, weakestCache, lruWeakestCache, infiniteCache}; - - private bool warmup = false; - - [Test] - public void RegularTest() - { - warmup = true; - CombinedTest(10, 10); - warmup = false; - CombinedTest(BaseCount / 10, InsertCount / 10); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - warmup = true; - CombinedTest(10, 10); - warmup = false; - CombinedTest(BaseCount, InsertCount); - } - - [Test] - [Explicit] - [Category("Profile")] - public void ProfileTest() - { - caches = new ICache[] {lruWeakestCache}; - int insertCount = InsertCount*10; - InsertTest(insertCount); - FetchTest(BaseCount); - - } - - private void CombinedTest(int baseCount, int insertCount) - { - InsertTest(insertCount); - FetchTest(baseCount); - } - - private void InsertTest(int count) - { - foreach (var cache in caches) { - - Queue items = new Queue(); - for (int i = 0; i < count; i++) { - items.Enqueue(new Item((i % InsertCount).ToString())); - } - - TestHelper.CollectGarbage(); - string title = string.Format("Insert ({0})", cache.GetType().GetShortName()); - using (warmup ? null : new Measurement(title, items.Count)) { - while (items.Count > 0) { - cache.Add(items.Dequeue()); - } - } - } - } - - private void FetchTest(int count) - { - var r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - var items = new List(); - var itemsCount = 0; - foreach (var i in InstanceGenerationUtils.GetInstances(r, 0.9)) { - items.Add(new Item((i % InsertCount).ToString())); - if (++itemsCount > count) - break; - } - - foreach (var cache in caches) { - TestHelper.CollectGarbage(); - string title = string.Format("Fetch ({0})", cache.GetType().GetShortName()); - using (warmup ? null : new Measurement(title, items.Count)) { - foreach (var item in items) { - var o = cache[item, true]; - } - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.09.27 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Caching +{ + [TestFixture] + public class CachePerformanceTest + { + #region Nested type: Item + + [DebuggerDisplay("{Value}")] + public class Item : IEquatable, IIdentified, IHasSize + { + public string Value { get; private set; } + + object IIdentified.Identifier + { + get { return Identifier; } + } + + public Item Identifier + { + get { return this; } + } + + public long Size + { + get { return 1; } + } + + public bool Equals(Item obj) + { + if (obj==null) + return false; + return obj.Value==Value; + } + + public override bool Equals(object obj) + { + return Equals(obj as Item); + } + + public override int GetHashCode() + { + return (Value!=null ? Value.GetHashCode() : 0); + } + + public override string ToString() + { + return string.Format("{0}", Value); + } + + public Item(string value) + { + Value = value; + } + } + + #endregion + + public const int LruCapacity = 90000; + public const int MfuCapacity = 10000; + public const int Capacity = LruCapacity + MfuCapacity; + + public const int BaseCount = 10000000; + public const int InsertCount = (int) (1.1 * Capacity); + + private static LruCache lruCache = + new LruCache(Capacity, i => i); + private static LruCache lruCache2 = + new LruCache(Capacity, i => i); + private static MfLruCache mfLruCache = + new MfLruCache(LruCapacity, MfuCapacity, 5, i => i); + private static WeakCache weakCache = + new WeakCache(false, i => i); + private static WeakestCache weakestCache = + new WeakestCache(false, false, i => i); + private static LruCache lruWeakestCache = + new LruCache(LruCapacity + MfuCapacity, i => i, + new WeakestCache(false, false, i => i)); + private static InfiniteCache infiniteCache = new InfiniteCache(i => i); + private static ICache[] caches = new ICache[] {lruCache, lruCache2, mfLruCache, weakCache, weakestCache, lruWeakestCache, infiniteCache}; + + private bool warmup = false; + + [Test] + public void RegularTest() + { + warmup = true; + CombinedTest(10, 10); + warmup = false; + CombinedTest(BaseCount / 10, InsertCount / 10); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + warmup = true; + CombinedTest(10, 10); + warmup = false; + CombinedTest(BaseCount, InsertCount); + } + + [Test] + [Explicit] + [Category("Profile")] + public void ProfileTest() + { + caches = new ICache[] {lruWeakestCache}; + int insertCount = InsertCount*10; + InsertTest(insertCount); + FetchTest(BaseCount); + + } + + private void CombinedTest(int baseCount, int insertCount) + { + InsertTest(insertCount); + FetchTest(baseCount); + } + + private void InsertTest(int count) + { + foreach (var cache in caches) { + + Queue items = new Queue(); + for (int i = 0; i < count; i++) { + items.Enqueue(new Item((i % InsertCount).ToString())); + } + + TestHelper.CollectGarbage(); + string title = string.Format("Insert ({0})", cache.GetType().GetShortName()); + using (warmup ? null : new Measurement(title, items.Count)) { + while (items.Count > 0) { + cache.Add(items.Dequeue()); + } + } + } + } + + private void FetchTest(int count) + { + var r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + var items = new List(); + var itemsCount = 0; + foreach (var i in InstanceGenerationUtils.GetInstances(r, 0.9)) { + items.Add(new Item((i % InsertCount).ToString())); + if (++itemsCount > count) + break; + } + + foreach (var cache in caches) { + TestHelper.CollectGarbage(); + string title = string.Format("Fetch ({0})", cache.GetType().GetShortName()); + using (warmup ? null : new Measurement(title, items.Count)) { + foreach (var item in items) { + var o = cache[item, true]; + } + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/InfiniteCacheTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/InfiniteCacheTest.cs index 50ebbd1d1a..3a364b2aa1 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/InfiniteCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/InfiniteCacheTest.cs @@ -1,228 +1,228 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.11 - -using System; -using System.Diagnostics; -using System.Threading; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Caching -{ - internal class TestItem : - IIdentified, - IHasSize - { - public string Key { get; set; } - - public string Value { get; set; } - - object IIdentified.Identifier - { - get { return Identifier; } - } - - public string Identifier - { - get { return Value; } - } - - public long Size - { - get { return Value.Length; } - } - - public TestItem(string value) - { - Key = value; - Value = value; - } - - public TestItem(string key, string value) - { - Key = key; - Value = value; - } - } - - - [TestFixture] - public class InfiniteCacheTest - { - private InfiniteCache globalCache; - private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - - [Test] - public void ConstructorsTest() - { - var cache = new InfiniteCache(value => value.Key); - - Assert.IsNotNull(cache.KeyExtractor); - - var item = new TestItem("100"); - cache.Add(item); - - Assert.AreEqual(1, cache.Count); - } - - [Test] - public void ConstructorDenyTest() - { - Assert.Throws(() => { var cache = new InfiniteCache(null); }); - } - - [Test] - public void ConstructorDenyTest2() - { - Assert.Throws(() => { var cache = new InfiniteCache(-1, i => i.Text); }); - } - - [Test] - public void AddRemoveTest() - { - var cache = new InfiniteCache(value => value.Key); - - TestItem item = new TestItem("1"); - cache.Add(item); - Assert.AreEqual(1, cache.Count); - - item = new TestItem("2"); - cache.Add(item); - Assert.AreEqual(2, cache.Count); - Assert.AreEqual(item, cache[item.Key, false]); - - ICache icache = cache; - Assert.AreEqual(item, icache[item.Value, false]); - Assert.AreEqual(null, icache["3", false]); - - item = new TestItem("2", "3"); - cache.Add(item, false); - Assert.AreEqual("2", cache["2", false].Value); - cache.Add(item, true); - Assert.AreEqual("3", cache["2", false].Value); - - cache.Remove(item); - Assert.AreEqual(1, cache.Count); - - cache.Clear(); - Assert.AreEqual(0, cache.Count); - } - - [Test] - public void AddDenyTest() - { - var cache = new InfiniteCache(value => value.Key); - Assert.Throws(() => cache.Add(null)); - } - - [Test] - public void RemoveDenyTest() - { - var cache = new InfiniteCache(value => value.Key); - Assert.Throws(() => cache.Remove((TestItem)null)); - } - - [Test] - public void RemoveDenyTest1() - { - var cache = new InfiniteCache(value => value.Key); - Assert.Throws(() => cache.Remove((TestItem)null)); - } - - [Test] - public void IEnumerableTest() - { - var cache = new InfiniteCache(value => value.Key); - - for (int i = 0; i < 100; i++) - cache.Add(new TestItem("item " + i)); - - Assert.AreEqual(cache.Count, 100); - - int itemsCount = 0; - foreach (TestItem testClass in cache) - { - Assert.IsTrue(testClass != null); - itemsCount++; - } - Assert.AreEqual(itemsCount, 100); - } - - private static bool canFinish = true; - - [Test] - public void SynchronizationTest() - { - globalCache = new InfiniteCache(value => value.Key); - - var addThreads = new Thread[10]; - var removeThreads = new Thread[10]; - for (int i = 0; i < 10; i++) - { - addThreads[i] = new Thread(AddItem); - removeThreads[i] = new Thread(RemoveItem); - } - - try - { - for (int i = 0; i < 10; i++) - addThreads[i].Start(); - Thread.Sleep(10); - for (int i = 0; i < 10; i++) - removeThreads[i].Start(); - Thread.Sleep(200); - } - finally - { - canFinish = true; - for (int i = 0; i < 10; i++) - { - addThreads[i].Join(); - removeThreads[i].Join(); - } - } - Assert.IsTrue(globalCache.Count >= 0); - - globalCache = null; - } - - private void AddItem() - { - int count = random.Next(100000); - while (!canFinish) - { - lock (globalCache) - { - globalCache.Add(new TestItem("Item " + count)); - } - count++; - } - } - - private void RemoveItem() - { - while (!canFinish) - { - TestItem test = null; - lock (globalCache) - { - foreach (TestItem testClass in globalCache) - { - test = testClass; - break; - } - } - if (test != null) lock (globalCache) - { - globalCache.Remove(test); - } - } - } - } - -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.11 + +using System; +using System.Diagnostics; +using System.Threading; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Caching +{ + internal class TestItem : + IIdentified, + IHasSize + { + public string Key { get; set; } + + public string Value { get; set; } + + object IIdentified.Identifier + { + get { return Identifier; } + } + + public string Identifier + { + get { return Value; } + } + + public long Size + { + get { return Value.Length; } + } + + public TestItem(string value) + { + Key = value; + Value = value; + } + + public TestItem(string key, string value) + { + Key = key; + Value = value; + } + } + + + [TestFixture] + public class InfiniteCacheTest + { + private InfiniteCache globalCache; + private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + + [Test] + public void ConstructorsTest() + { + var cache = new InfiniteCache(value => value.Key); + + Assert.IsNotNull(cache.KeyExtractor); + + var item = new TestItem("100"); + cache.Add(item); + + Assert.AreEqual(1, cache.Count); + } + + [Test] + public void ConstructorDenyTest() + { + Assert.Throws(() => { var cache = new InfiniteCache(null); }); + } + + [Test] + public void ConstructorDenyTest2() + { + Assert.Throws(() => { var cache = new InfiniteCache(-1, i => i.Text); }); + } + + [Test] + public void AddRemoveTest() + { + var cache = new InfiniteCache(value => value.Key); + + TestItem item = new TestItem("1"); + cache.Add(item); + Assert.AreEqual(1, cache.Count); + + item = new TestItem("2"); + cache.Add(item); + Assert.AreEqual(2, cache.Count); + Assert.AreEqual(item, cache[item.Key, false]); + + ICache icache = cache; + Assert.AreEqual(item, icache[item.Value, false]); + Assert.AreEqual(null, icache["3", false]); + + item = new TestItem("2", "3"); + cache.Add(item, false); + Assert.AreEqual("2", cache["2", false].Value); + cache.Add(item, true); + Assert.AreEqual("3", cache["2", false].Value); + + cache.Remove(item); + Assert.AreEqual(1, cache.Count); + + cache.Clear(); + Assert.AreEqual(0, cache.Count); + } + + [Test] + public void AddDenyTest() + { + var cache = new InfiniteCache(value => value.Key); + Assert.Throws(() => cache.Add(null)); + } + + [Test] + public void RemoveDenyTest() + { + var cache = new InfiniteCache(value => value.Key); + Assert.Throws(() => cache.Remove((TestItem)null)); + } + + [Test] + public void RemoveDenyTest1() + { + var cache = new InfiniteCache(value => value.Key); + Assert.Throws(() => cache.Remove((TestItem)null)); + } + + [Test] + public void IEnumerableTest() + { + var cache = new InfiniteCache(value => value.Key); + + for (int i = 0; i < 100; i++) + cache.Add(new TestItem("item " + i)); + + Assert.AreEqual(cache.Count, 100); + + int itemsCount = 0; + foreach (TestItem testClass in cache) + { + Assert.IsTrue(testClass != null); + itemsCount++; + } + Assert.AreEqual(itemsCount, 100); + } + + private static bool canFinish = true; + + [Test] + public void SynchronizationTest() + { + globalCache = new InfiniteCache(value => value.Key); + + var addThreads = new Thread[10]; + var removeThreads = new Thread[10]; + for (int i = 0; i < 10; i++) + { + addThreads[i] = new Thread(AddItem); + removeThreads[i] = new Thread(RemoveItem); + } + + try + { + for (int i = 0; i < 10; i++) + addThreads[i].Start(); + Thread.Sleep(10); + for (int i = 0; i < 10; i++) + removeThreads[i].Start(); + Thread.Sleep(200); + } + finally + { + canFinish = true; + for (int i = 0; i < 10; i++) + { + addThreads[i].Join(); + removeThreads[i].Join(); + } + } + Assert.IsTrue(globalCache.Count >= 0); + + globalCache = null; + } + + private void AddItem() + { + int count = random.Next(100000); + while (!canFinish) + { + lock (globalCache) + { + globalCache.Add(new TestItem("Item " + count)); + } + count++; + } + } + + private void RemoveItem() + { + while (!canFinish) + { + TestItem test = null; + lock (globalCache) + { + foreach (TestItem testClass in globalCache) + { + test = testClass; + break; + } + } + if (test != null) lock (globalCache) + { + globalCache.Remove(test); + } + } + } + } + +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/LruCacheTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/LruCacheTest.cs index 1de27d589c..87c8306c0c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/LruCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/LruCacheTest.cs @@ -1,336 +1,336 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Conversion; -using Xtensive.Core; -using Xtensive.Orm.Tests; - - -namespace Xtensive.Orm.Tests.Core.Caching -{ - internal class TestClass : - IIdentified, - IHasSize - { - public string Text { get; set; } - - object IIdentified.Identifier - { - get { return Identifier; } - } - - public string Identifier - { - get { return Text; } - } - - public long Size - { - get { return Text.Length; } - } - - public TestClass(string text) - { - Text = text; - } - } - - [Serializable] - internal class TestClassAdvancedConverter : - AdvancedConverterBase, - IAdvancedConverter - { - public TestClassAdvancedConverter(IAdvancedConverterProvider provider) - : base(provider) - { - } - - #region IAdvancedConverter Members - - public string Convert(TestClass value) - { - return value.Text; - } - - public bool IsRough - { - get { return false; } - } - - #endregion - } - - [TestFixture] - public class LruCacheTest - { - private LruCache globalCache; - private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - - class BadTestClass: - IIdentified, - IHasSize - { - object IIdentified.Identifier - { - get { return Identifier; } - } - - public string Identifier - { - get { return null; } - } - - public long Size - { - get { return 1; } - } - } - - [Test] - public void ConstructorsTest() - { - var cache = new LruCache( - 1000, - value => value.Text); - - var cache1 = new LruCache( - 1000, - (value) => value.Text, - new Biconverter(value => value, value => value)); - - - TestClass item = new TestClass("1"); - cache.Add(item); - cache1.Add(item); - Assert.AreEqual(1, cache.Size); - Assert.AreEqual(1, cache1.Count); - - for (int i=0;i<100000;i++) { - TestClass test = new TestClass(""+i); - cache1.Add(test); - } - } - - [Test] - public void ConstructorDenyTest() - { - Assert.Throws(() => { - var cache = - new LruCache( - -1, - value => value.Text - ); - }); - } - - [Test] - public void AddRemoveTest() - { - var cache = new LruCache( - 100, - value => value.Text); - - TestClass item = new TestClass("1"); - cache.Add(item); - Assert.AreEqual(1, cache.Count); - item = new TestClass("2"); - cache.Add(item); - Assert.AreEqual(2, cache.Count); - Assert.AreEqual(item, cache[item.Text, false]); - ICache icache = cache; - Assert.AreEqual(item, icache[item.Text, false]); - Assert.AreEqual(null, icache["3", false]); - cache.Remove(item); - Assert.AreEqual(1, cache.Count); - cache.Clear(); - Assert.AreEqual(0, cache.Count); - } - - [Test] - public void AddDenyTest1() - { - var cache = new LruCache( - 100, - value => value.Text); - Assert.Throws(() => cache.Add(null)); - } - - [Test] - public void AddDenyTest3() - { - var cache = - new LruCache( - 100, - value => value.Identifier); - Assert.Throws(() => cache.Add(new BadTestClass())); - } - - [Test] - public void RemoveDenyTest1() - { - var cache = - new LruCache( - 100, - value => value.Text); - Assert.Throws(() => cache.Remove(null)); - } - - [Test] - public void RemoveDenyTest2() - { - var cache = - new LruCache( - 100, - value => value.Text); - Assert.Throws(() => cache.RemoveKey(null)); - } - - [Test] - public void RemoveDenyTest3() - { - var cache = - new LruCache( - 100, - value => value.Identifier); - BadTestClass test1 = new BadTestClass(); - Assert.Throws(() => cache.Remove(test1)); - } - - [Test] - public void IEnumerableTest() - { - var cache = - new LruCache( - 10000, - value => value.Text); - for (int i = 0; i < 100; i++) - { - cache.Add(new TestClass("item " + i)); - } - Assert.AreEqual(100, cache.Count); - - int itemsCount = 0; - foreach (TestClass testClass in cache) - { - Assert.IsTrue(testClass.Text.StartsWith("item")); - itemsCount++; - } - Assert.AreEqual(100, itemsCount); - } - - private static bool canFinish = true; - - [Test] - public void SynchronizationTest() - { - globalCache = - new LruCache( - 1000, - value => value.Text); - - using (new ThreadPoolThreadsIncreaser(20, 20)) { - var addThreads = new Task[10]; - var removeThreads = new Task[10]; - var cancellationTokenSource = new CancellationTokenSource(); - - for (int i = 0; i < 10; i++) { - addThreads[i] = new Task(() => AddItem(cancellationTokenSource.Token), cancellationTokenSource.Token); - removeThreads[i] = new Task(() => RemoveItem(cancellationTokenSource.Token), cancellationTokenSource.Token); - } - - try { - for (int i = 0; i < 10; i++) { - addThreads[i].Start(); - } - Thread.Sleep(10); - - for (int i = 0; i < 10; i++) { - removeThreads[i].Start(); - } - Thread.Sleep(200); - } - finally { - cancellationTokenSource.Cancel(); - Thread.Sleep(20); - } - } - - Assert.IsTrue(globalCache.Count >= 0); - globalCache = null; - } - - private void AddItem(CancellationToken cancellationToken) - { - int count = random.Next(100000); - int counter = 0; - bool whileCondition = (counter++) < 10 || !cancellationToken.IsCancellationRequested; - while (!cancellationToken.IsCancellationRequested) { - globalCache.Add(new TestClass("item " + count)); - count++; - } - cancellationToken.ThrowIfCancellationRequested(); - } - - private void RemoveItem(CancellationToken cancellationToken) - { - int counter = 0; - while (!cancellationToken.IsCancellationRequested) { - TestClass test = null; - foreach (TestClass testClass in globalCache) { - test = testClass; - break; - } - if (test!=null) - globalCache.Remove(test); - } - cancellationToken.ThrowIfCancellationRequested(); - } - - private class ThreadPoolThreadsIncreaser : Disposable - { - private int previousWorkingThreadsCount; - private int previousIOThreadsCount; - - private static Func A; - private static Func B; - - private void Increase(int workingThreadsCount, int ioThreadsCount) - { - int minWorkingThreads; - int minIOTheads; - ThreadPool.GetMinThreads(out minWorkingThreads, out minIOTheads); - previousWorkingThreadsCount = minWorkingThreads; - previousIOThreadsCount = minIOTheads; - - ThreadPool.SetMinThreads(workingThreadsCount, ioThreadsCount); - } - - private static void Decrease(bool disposing, Func workingThreadsCountAcccessor, Func ioThreadsCountAcccessor) - { - ThreadPool.SetMinThreads(workingThreadsCountAcccessor(), ioThreadsCountAcccessor()); - } - - private int Aa() - { - return previousWorkingThreadsCount; - } - - private int Bb() - { - return previousIOThreadsCount; - } - - - - public ThreadPoolThreadsIncreaser(int workingThreadsCount, int ioThreadsCount) - : base((disposing)=>Decrease(disposing, A, B)) - { - Increase(workingThreadsCount, ioThreadsCount); - A = Aa; - B = Bb; - } - } - } -} +using System; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Conversion; +using Xtensive.Core; +using Xtensive.Orm.Tests; + + +namespace Xtensive.Orm.Tests.Core.Caching +{ + internal class TestClass : + IIdentified, + IHasSize + { + public string Text { get; set; } + + object IIdentified.Identifier + { + get { return Identifier; } + } + + public string Identifier + { + get { return Text; } + } + + public long Size + { + get { return Text.Length; } + } + + public TestClass(string text) + { + Text = text; + } + } + + [Serializable] + internal class TestClassAdvancedConverter : + AdvancedConverterBase, + IAdvancedConverter + { + public TestClassAdvancedConverter(IAdvancedConverterProvider provider) + : base(provider) + { + } + + #region IAdvancedConverter Members + + public string Convert(TestClass value) + { + return value.Text; + } + + public bool IsRough + { + get { return false; } + } + + #endregion + } + + [TestFixture] + public class LruCacheTest + { + private LruCache globalCache; + private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + + class BadTestClass: + IIdentified, + IHasSize + { + object IIdentified.Identifier + { + get { return Identifier; } + } + + public string Identifier + { + get { return null; } + } + + public long Size + { + get { return 1; } + } + } + + [Test] + public void ConstructorsTest() + { + var cache = new LruCache( + 1000, + value => value.Text); + + var cache1 = new LruCache( + 1000, + (value) => value.Text, + new Biconverter(value => value, value => value)); + + + TestClass item = new TestClass("1"); + cache.Add(item); + cache1.Add(item); + Assert.AreEqual(1, cache.Size); + Assert.AreEqual(1, cache1.Count); + + for (int i=0;i<100000;i++) { + TestClass test = new TestClass(""+i); + cache1.Add(test); + } + } + + [Test] + public void ConstructorDenyTest() + { + Assert.Throws(() => { + var cache = + new LruCache( + -1, + value => value.Text + ); + }); + } + + [Test] + public void AddRemoveTest() + { + var cache = new LruCache( + 100, + value => value.Text); + + TestClass item = new TestClass("1"); + cache.Add(item); + Assert.AreEqual(1, cache.Count); + item = new TestClass("2"); + cache.Add(item); + Assert.AreEqual(2, cache.Count); + Assert.AreEqual(item, cache[item.Text, false]); + ICache icache = cache; + Assert.AreEqual(item, icache[item.Text, false]); + Assert.AreEqual(null, icache["3", false]); + cache.Remove(item); + Assert.AreEqual(1, cache.Count); + cache.Clear(); + Assert.AreEqual(0, cache.Count); + } + + [Test] + public void AddDenyTest1() + { + var cache = new LruCache( + 100, + value => value.Text); + Assert.Throws(() => cache.Add(null)); + } + + [Test] + public void AddDenyTest3() + { + var cache = + new LruCache( + 100, + value => value.Identifier); + Assert.Throws(() => cache.Add(new BadTestClass())); + } + + [Test] + public void RemoveDenyTest1() + { + var cache = + new LruCache( + 100, + value => value.Text); + Assert.Throws(() => cache.Remove(null)); + } + + [Test] + public void RemoveDenyTest2() + { + var cache = + new LruCache( + 100, + value => value.Text); + Assert.Throws(() => cache.RemoveKey(null)); + } + + [Test] + public void RemoveDenyTest3() + { + var cache = + new LruCache( + 100, + value => value.Identifier); + BadTestClass test1 = new BadTestClass(); + Assert.Throws(() => cache.Remove(test1)); + } + + [Test] + public void IEnumerableTest() + { + var cache = + new LruCache( + 10000, + value => value.Text); + for (int i = 0; i < 100; i++) + { + cache.Add(new TestClass("item " + i)); + } + Assert.AreEqual(100, cache.Count); + + int itemsCount = 0; + foreach (TestClass testClass in cache) + { + Assert.IsTrue(testClass.Text.StartsWith("item")); + itemsCount++; + } + Assert.AreEqual(100, itemsCount); + } + + private static bool canFinish = true; + + [Test] + public void SynchronizationTest() + { + globalCache = + new LruCache( + 1000, + value => value.Text); + + using (new ThreadPoolThreadsIncreaser(20, 20)) { + var addThreads = new Task[10]; + var removeThreads = new Task[10]; + var cancellationTokenSource = new CancellationTokenSource(); + + for (int i = 0; i < 10; i++) { + addThreads[i] = new Task(() => AddItem(cancellationTokenSource.Token), cancellationTokenSource.Token); + removeThreads[i] = new Task(() => RemoveItem(cancellationTokenSource.Token), cancellationTokenSource.Token); + } + + try { + for (int i = 0; i < 10; i++) { + addThreads[i].Start(); + } + Thread.Sleep(10); + + for (int i = 0; i < 10; i++) { + removeThreads[i].Start(); + } + Thread.Sleep(200); + } + finally { + cancellationTokenSource.Cancel(); + Thread.Sleep(20); + } + } + + Assert.IsTrue(globalCache.Count >= 0); + globalCache = null; + } + + private void AddItem(CancellationToken cancellationToken) + { + int count = random.Next(100000); + int counter = 0; + bool whileCondition = (counter++) < 10 || !cancellationToken.IsCancellationRequested; + while (!cancellationToken.IsCancellationRequested) { + globalCache.Add(new TestClass("item " + count)); + count++; + } + cancellationToken.ThrowIfCancellationRequested(); + } + + private void RemoveItem(CancellationToken cancellationToken) + { + int counter = 0; + while (!cancellationToken.IsCancellationRequested) { + TestClass test = null; + foreach (TestClass testClass in globalCache) { + test = testClass; + break; + } + if (test!=null) + globalCache.Remove(test); + } + cancellationToken.ThrowIfCancellationRequested(); + } + + private class ThreadPoolThreadsIncreaser : Disposable + { + private int previousWorkingThreadsCount; + private int previousIOThreadsCount; + + private static Func A; + private static Func B; + + private void Increase(int workingThreadsCount, int ioThreadsCount) + { + int minWorkingThreads; + int minIOTheads; + ThreadPool.GetMinThreads(out minWorkingThreads, out minIOTheads); + previousWorkingThreadsCount = minWorkingThreads; + previousIOThreadsCount = minIOTheads; + + ThreadPool.SetMinThreads(workingThreadsCount, ioThreadsCount); + } + + private static void Decrease(bool disposing, Func workingThreadsCountAcccessor, Func ioThreadsCountAcccessor) + { + ThreadPool.SetMinThreads(workingThreadsCountAcccessor(), ioThreadsCountAcccessor()); + } + + private int Aa() + { + return previousWorkingThreadsCount; + } + + private int Bb() + { + return previousIOThreadsCount; + } + + + + public ThreadPoolThreadsIncreaser(int workingThreadsCount, int ioThreadsCount) + : base((disposing)=>Decrease(disposing, A, B)) + { + Increase(workingThreadsCount, ioThreadsCount); + A = Aa; + B = Bb; + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakCacheTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakCacheTest.cs index 90ec0dd682..cacb970545 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakCacheTest.cs @@ -1,177 +1,177 @@ -using System; -using System.Threading; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Caching -{ - public class BadTestClass - { - } - - [TestFixture] - public class WeakCacheTest - { - private WeakCache globalCache; - private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - - [Test] - public void ConstructorsTest() - { - var cache = new WeakCache( - false, value => value.Text); - - Assert.IsNotNull(cache.KeyExtractor); - - var item = new TestClass("100"); - cache.Add(item); - - Assert.AreEqual(1, cache.Count); - } - - [Test] - public void ConstructorDenyTest() - { - Assert.Throws(() => { var cache = new WeakCache(false, null); }); - } - - [Test] - public void AddRemoveTest() - { - var cache = new WeakCache(false, value => value.Text); - - TestClass item = new TestClass("1"); - cache.Add(item); - Assert.AreEqual(1, cache.Count); - - item = new TestClass("2"); - cache.Add(item); - Assert.AreEqual(2, cache.Count); - Assert.AreEqual(item, cache[item.Text, false]); - - ICache icache = cache; - Assert.AreEqual(item, icache[item.Text, false]); - Assert.AreEqual(null, icache["3", false]); - - cache.Remove(item); - Assert.AreEqual(1, cache.Count); - - cache.Clear(); - Assert.AreEqual(0, cache.Count); - } - - [Test] - public void AddDenyTest() - { - var cache = new WeakCache(false, value => value.Text); - Assert.Throws(() => cache.Add(null)); - } - - [Test] - public void RemoveDenyTest() - { - var cache = new WeakCache(false, value => value.Text); - Assert.Throws(() => cache.Remove((TestClass) null)); - } - - [Test] - public void RemoveDenyTest1() - { - var cache = new WeakCache(false, value => value.Text); - Assert.Throws(() => cache.Remove((TestClass)null)); - } - - [Test] - public void IEnumerableTest() - { - var cache = new WeakCache(false, value => value.Text); - - for (int i = 0; i < 100; i++) - cache.Add(new TestClass("item " + i)); - - Assert.IsTrue(cache.Count >= 0); - Assert.IsTrue(cache.Count <= 100); - - int itemsCount = 0; - foreach (TestClass testClass in cache) { - Assert.IsTrue(testClass == null || testClass.Text.StartsWith("item"), "Line 182"); - itemsCount++; - } - Assert.IsTrue(itemsCount >= 0); - Assert.IsTrue(itemsCount <= 100); - - TestHelper.CollectGarbage(true); - - itemsCount = 0; - foreach (TestClass testClass in cache) { - Assert.IsTrue(testClass == null || testClass.Text.StartsWith("item"), "Line 196"); - itemsCount++; - } - Assert.IsTrue(itemsCount >= 0); - Assert.IsTrue(itemsCount <= 100); - } - - private static bool canFinish = true; - - [Test] - public void SynchronizationTest() - { - globalCache = new WeakCache(false, value => value.Text); - - var addThreads = new Thread[10]; - var removeThreads = new Thread[10]; - for (int i = 0; i < 10; i++) { - addThreads[i] = new Thread(AddItem); - removeThreads[i] = new Thread(RemoveItem); - } - - try { - for (int i = 0; i < 10; i++) - addThreads[i].Start(); - Thread.Sleep(10); - for (int i = 0; i < 10; i++) - removeThreads[i].Start(); - Thread.Sleep(200); - } - finally { - canFinish = true; - for (int i = 0; i < 10; i++) { - addThreads[i].Join(); - removeThreads[i].Join(); - } - } - Assert.IsTrue(globalCache.Count >= 0); - - globalCache = null; - } - - private void AddItem() - { - int count = random.Next(100000); - while (!canFinish) - { - lock (globalCache) { - globalCache.Add(new TestClass("Item " + count)); - } - count++; - } - } - - private void RemoveItem() - { - while (!canFinish) { - TestClass test = null; - lock (globalCache) { - foreach (TestClass testClass in globalCache) { - test = testClass; - break; - } - } - if (test != null) lock (globalCache) { - globalCache.Remove(test); - } - } - } - } -} +using System; +using System.Threading; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Caching +{ + public class BadTestClass + { + } + + [TestFixture] + public class WeakCacheTest + { + private WeakCache globalCache; + private Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + + [Test] + public void ConstructorsTest() + { + var cache = new WeakCache( + false, value => value.Text); + + Assert.IsNotNull(cache.KeyExtractor); + + var item = new TestClass("100"); + cache.Add(item); + + Assert.AreEqual(1, cache.Count); + } + + [Test] + public void ConstructorDenyTest() + { + Assert.Throws(() => { var cache = new WeakCache(false, null); }); + } + + [Test] + public void AddRemoveTest() + { + var cache = new WeakCache(false, value => value.Text); + + TestClass item = new TestClass("1"); + cache.Add(item); + Assert.AreEqual(1, cache.Count); + + item = new TestClass("2"); + cache.Add(item); + Assert.AreEqual(2, cache.Count); + Assert.AreEqual(item, cache[item.Text, false]); + + ICache icache = cache; + Assert.AreEqual(item, icache[item.Text, false]); + Assert.AreEqual(null, icache["3", false]); + + cache.Remove(item); + Assert.AreEqual(1, cache.Count); + + cache.Clear(); + Assert.AreEqual(0, cache.Count); + } + + [Test] + public void AddDenyTest() + { + var cache = new WeakCache(false, value => value.Text); + Assert.Throws(() => cache.Add(null)); + } + + [Test] + public void RemoveDenyTest() + { + var cache = new WeakCache(false, value => value.Text); + Assert.Throws(() => cache.Remove((TestClass) null)); + } + + [Test] + public void RemoveDenyTest1() + { + var cache = new WeakCache(false, value => value.Text); + Assert.Throws(() => cache.Remove((TestClass)null)); + } + + [Test] + public void IEnumerableTest() + { + var cache = new WeakCache(false, value => value.Text); + + for (int i = 0; i < 100; i++) + cache.Add(new TestClass("item " + i)); + + Assert.IsTrue(cache.Count >= 0); + Assert.IsTrue(cache.Count <= 100); + + int itemsCount = 0; + foreach (TestClass testClass in cache) { + Assert.IsTrue(testClass == null || testClass.Text.StartsWith("item"), "Line 182"); + itemsCount++; + } + Assert.IsTrue(itemsCount >= 0); + Assert.IsTrue(itemsCount <= 100); + + TestHelper.CollectGarbage(true); + + itemsCount = 0; + foreach (TestClass testClass in cache) { + Assert.IsTrue(testClass == null || testClass.Text.StartsWith("item"), "Line 196"); + itemsCount++; + } + Assert.IsTrue(itemsCount >= 0); + Assert.IsTrue(itemsCount <= 100); + } + + private static bool canFinish = true; + + [Test] + public void SynchronizationTest() + { + globalCache = new WeakCache(false, value => value.Text); + + var addThreads = new Thread[10]; + var removeThreads = new Thread[10]; + for (int i = 0; i < 10; i++) { + addThreads[i] = new Thread(AddItem); + removeThreads[i] = new Thread(RemoveItem); + } + + try { + for (int i = 0; i < 10; i++) + addThreads[i].Start(); + Thread.Sleep(10); + for (int i = 0; i < 10; i++) + removeThreads[i].Start(); + Thread.Sleep(200); + } + finally { + canFinish = true; + for (int i = 0; i < 10; i++) { + addThreads[i].Join(); + removeThreads[i].Join(); + } + } + Assert.IsTrue(globalCache.Count >= 0); + + globalCache = null; + } + + private void AddItem() + { + int count = random.Next(100000); + while (!canFinish) + { + lock (globalCache) { + globalCache.Add(new TestClass("Item " + count)); + } + count++; + } + } + + private void RemoveItem() + { + while (!canFinish) { + TestClass test = null; + lock (globalCache) { + foreach (TestClass testClass in globalCache) { + test = testClass; + break; + } + } + if (test != null) lock (globalCache) { + globalCache.Remove(test); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs index ec2cfa331d..5e8efb8e59 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.09.29 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Caching; -using System.Linq; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Caching -{ - [TestFixture] - public class WeakestCacheTest - { - #region Nested type: Item - - [DebuggerDisplay("{Value}")] - public class Item : IEquatable - { - public string Value { get; private set; } - - public bool Equals(Item obj) - { - if (obj==null) - return false; - return obj.Value==Value; - } - - public override bool Equals(object obj) - { - return Equals(obj as Item); - } - - public override int GetHashCode() - { - return (Value!=null ? Value.GetHashCode() : 0); - } - - public override string ToString() - { - return string.Format("{0}", Value); - } - - public Item(string value) - { - Value = value; - } - } - - #endregion - - private volatile Item item1; - - [Test] - public void CombinedTest() - { - var cache = new WeakestCache(false, false, i => i); - - item1 = new Item("1"); - cache.Add(item1); - - Assert.AreSame(item1, cache.First()); - Assert.AreSame(item1, cache[new Item("1"), true]); - - cache.Remove(item1); - Assert.AreEqual(0, cache.Count); - - cache.Add(item1); - TestHelper.CollectGarbage(true); - cache.CollectGarbage(); - Assert.AreEqual(1, cache.Count); - - item1 = null; - TestHelper.CollectGarbage(true); - cache.CollectGarbage(); - Assert.AreEqual(0, cache.Count); - - Assert.IsNull(cache[new Item("1"), true]); - } - - [Test] - public void ProfileTest() - { - var cache = new WeakestCache(false, false, i => i); - var measurement = new Measurement(); - for (int i = 0,j = 0; i < 1000000; i++, j++) { - var item = new Item(i.ToString()); - cache.Add(item); - if (j == 100000) { - j = 0; - Console.Out.WriteLine(measurement.ToString()); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.09.29 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Caching; +using System.Linq; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Caching +{ + [TestFixture] + public class WeakestCacheTest + { + #region Nested type: Item + + [DebuggerDisplay("{Value}")] + public class Item : IEquatable + { + public string Value { get; private set; } + + public bool Equals(Item obj) + { + if (obj==null) + return false; + return obj.Value==Value; + } + + public override bool Equals(object obj) + { + return Equals(obj as Item); + } + + public override int GetHashCode() + { + return (Value!=null ? Value.GetHashCode() : 0); + } + + public override string ToString() + { + return string.Format("{0}", Value); + } + + public Item(string value) + { + Value = value; + } + } + + #endregion + + private volatile Item item1; + + [Test] + public void CombinedTest() + { + var cache = new WeakestCache(false, false, i => i); + + item1 = new Item("1"); + cache.Add(item1); + + Assert.AreSame(item1, cache.First()); + Assert.AreSame(item1, cache[new Item("1"), true]); + + cache.Remove(item1); + Assert.AreEqual(0, cache.Count); + + cache.Add(item1); + TestHelper.CollectGarbage(true); + cache.CollectGarbage(); + Assert.AreEqual(1, cache.Count); + + item1 = null; + TestHelper.CollectGarbage(true); + cache.CollectGarbage(); + Assert.AreEqual(0, cache.Count); + + Assert.IsNull(cache[new Item("1"), true]); + } + + [Test] + public void ProfileTest() + { + var cache = new WeakestCache(false, false, i => i); + var measurement = new Measurement(); + for (int i = 0,j = 0; i < 1000000; i++, j++) { + var item = new Item(i.ToString()); + cache.Add(item); + if (j == 100000) { + j = 0; + Console.Out.WriteLine(measurement.ToString()); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ChainedBufferTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ChainedBufferTest.cs index 4438644fa5..87bcce0898 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ChainedBufferTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ChainedBufferTest.cs @@ -1,213 +1,213 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.08.19 - -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Collections; - -namespace Xtensive.Tests.Collections -{ - [TestFixture] - public class ChainedBufferTest - { - [Test] - public void EmptyTest() - { - var buffer = new ChainedBuffer(); - Assert.That(buffer.Count, Is.EqualTo(0)); - } - - [Test] - public void AddTest() - { - int count = 40; - int index = 0; - var buffer1 = new ChainedBuffer(); - var buffer2 = new ChainedBuffer(); - - for (int i = 0; i < count; i++) { - buffer1.Add(i); - buffer2.Add(null); - } - - Assert.That(buffer1.Count, Is.EqualTo(count)); - Assert.That(buffer2.Count, Is.EqualTo(count)); - - foreach (var b in buffer1) { - Assert.That(buffer1.Contains(index)); - ++index; - } - - Assert.That(buffer2.Contains(null)); - } - - - [Test] - public void ClearTest() - { - int count = 40; - var buffer1 = new ChainedBuffer(); - for (int i = 0; i < count; i++) - buffer1.Add(i.ToString()); - - buffer1.Clear(); - - Assert.That(buffer1.Count, Is.EqualTo(0)); - - buffer1.Add("Hello"); - Assert.That(buffer1.Count, Is.EqualTo(1)); - Assert.That(buffer1.First(), Is.EqualTo("Hello")); - Assert.That(buffer1.Contains("Hello")); - } - - [Test] - public void ContainsTest() - { - int count = 40; - int index = 0; - - var buffer1 = new ChainedBuffer(); - var buffer2 = new ChainedBuffer(); - - for (int i = 0; i < count; i++) { - buffer1.Add(i); - buffer2.Add(null); - } - - foreach (var buf in buffer1) { - Assert.That(buffer1.Contains(index)); - ++index; - } - - Assert.That(buffer2.Contains(null)); - } - - [Test] - public void CopyToTest() - { - int count = 40; - int arrayIndex = 10; - int[] intArray = new int[count+arrayIndex]; - var buffer1 = new ChainedBuffer(); - bool flag = true; - - for (int i = 0; i < count; i++) - buffer1.Add(i); - - buffer1.CopyTo(intArray, arrayIndex); - - for (int i = 0; i < count; i++) - if (intArray[i + arrayIndex] != i) - flag = false; - - Assert.That(buffer1.Count + arrayIndex, Is.EqualTo(intArray.Length)); - Assert.That(flag); - } - - [Test] - public void AddRangeTest() - { - int count = 40; - int arrayCount = 10; - int index = 0; - int[] intArray = new int[arrayCount]; - var buffer1 = new ChainedBuffer(); - - for (int i = 0; i < arrayCount; i++) - intArray[i] = i + count; - - for (int i = 0; i < count; i++) - buffer1.Add(i); - - buffer1.AddRange(intArray); - - foreach (var buf in buffer1) { - Assert.That(buffer1.Contains(index)); - ++index; - } - } - - [Test] - public void GetEnumeratorTest() - { - int count = 40; - int index = 0; - var buffer1 = new ChainedBuffer(); - - for (int i = 0; i < count; i++) - buffer1.Add(i); - - Assert.AreEqual(count, buffer1.Count); - - foreach (var buf in buffer1) { - Assert.That(buf, Is.EqualTo(index)); - ++index; - } - } - - [Test] - public void ConstructorIntArrayTest() - { - int index = 0; - int arrayCount = 40; - int[] intArray = new int[arrayCount]; - - for (int i = 0; i < arrayCount; i++) - intArray[i] = i; - - var buffer1 = new ChainedBuffer(intArray); - - Assert.AreEqual(arrayCount, buffer1.Count); - - foreach (var buf in buffer1) { - Assert.That(buf, Is.EqualTo(index)); - ++index; - } - } - - [Test] - public void ConstructorIntArrayAndMaxNodeSizeTest() - { - int index = 0; - int arrayCount = 40; - int maxNodeSize = 20; - int[] intArray = new int[arrayCount]; - - for (int i = 0; i < arrayCount; i++) - intArray[i] = i; - - var buffer1 = new ChainedBuffer(intArray, maxNodeSize); - - Assert.AreEqual(arrayCount, buffer1.Count); - - foreach (var buf in buffer1) { - Assert.That(buf, Is.EqualTo(index)); - ++index; - } - } - - [Test] - public void ConstructorMaxNodeSizeTest() - { - int count = 40; - int index = 0; - int maxNodeSize = 10; - var buffer1 = new ChainedBuffer(maxNodeSize); - - for (int i = 0; i < count; i++) - buffer1.Add(i); - - Assert.AreEqual(count, buffer1.Count); - - foreach (var buf in buffer1) { - Assert.That(buf, Is.EqualTo(index)); - ++index; - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.08.19 + +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Collections; + +namespace Xtensive.Tests.Collections +{ + [TestFixture] + public class ChainedBufferTest + { + [Test] + public void EmptyTest() + { + var buffer = new ChainedBuffer(); + Assert.That(buffer.Count, Is.EqualTo(0)); + } + + [Test] + public void AddTest() + { + int count = 40; + int index = 0; + var buffer1 = new ChainedBuffer(); + var buffer2 = new ChainedBuffer(); + + for (int i = 0; i < count; i++) { + buffer1.Add(i); + buffer2.Add(null); + } + + Assert.That(buffer1.Count, Is.EqualTo(count)); + Assert.That(buffer2.Count, Is.EqualTo(count)); + + foreach (var b in buffer1) { + Assert.That(buffer1.Contains(index)); + ++index; + } + + Assert.That(buffer2.Contains(null)); + } + + + [Test] + public void ClearTest() + { + int count = 40; + var buffer1 = new ChainedBuffer(); + for (int i = 0; i < count; i++) + buffer1.Add(i.ToString()); + + buffer1.Clear(); + + Assert.That(buffer1.Count, Is.EqualTo(0)); + + buffer1.Add("Hello"); + Assert.That(buffer1.Count, Is.EqualTo(1)); + Assert.That(buffer1.First(), Is.EqualTo("Hello")); + Assert.That(buffer1.Contains("Hello")); + } + + [Test] + public void ContainsTest() + { + int count = 40; + int index = 0; + + var buffer1 = new ChainedBuffer(); + var buffer2 = new ChainedBuffer(); + + for (int i = 0; i < count; i++) { + buffer1.Add(i); + buffer2.Add(null); + } + + foreach (var buf in buffer1) { + Assert.That(buffer1.Contains(index)); + ++index; + } + + Assert.That(buffer2.Contains(null)); + } + + [Test] + public void CopyToTest() + { + int count = 40; + int arrayIndex = 10; + int[] intArray = new int[count+arrayIndex]; + var buffer1 = new ChainedBuffer(); + bool flag = true; + + for (int i = 0; i < count; i++) + buffer1.Add(i); + + buffer1.CopyTo(intArray, arrayIndex); + + for (int i = 0; i < count; i++) + if (intArray[i + arrayIndex] != i) + flag = false; + + Assert.That(buffer1.Count + arrayIndex, Is.EqualTo(intArray.Length)); + Assert.That(flag); + } + + [Test] + public void AddRangeTest() + { + int count = 40; + int arrayCount = 10; + int index = 0; + int[] intArray = new int[arrayCount]; + var buffer1 = new ChainedBuffer(); + + for (int i = 0; i < arrayCount; i++) + intArray[i] = i + count; + + for (int i = 0; i < count; i++) + buffer1.Add(i); + + buffer1.AddRange(intArray); + + foreach (var buf in buffer1) { + Assert.That(buffer1.Contains(index)); + ++index; + } + } + + [Test] + public void GetEnumeratorTest() + { + int count = 40; + int index = 0; + var buffer1 = new ChainedBuffer(); + + for (int i = 0; i < count; i++) + buffer1.Add(i); + + Assert.AreEqual(count, buffer1.Count); + + foreach (var buf in buffer1) { + Assert.That(buf, Is.EqualTo(index)); + ++index; + } + } + + [Test] + public void ConstructorIntArrayTest() + { + int index = 0; + int arrayCount = 40; + int[] intArray = new int[arrayCount]; + + for (int i = 0; i < arrayCount; i++) + intArray[i] = i; + + var buffer1 = new ChainedBuffer(intArray); + + Assert.AreEqual(arrayCount, buffer1.Count); + + foreach (var buf in buffer1) { + Assert.That(buf, Is.EqualTo(index)); + ++index; + } + } + + [Test] + public void ConstructorIntArrayAndMaxNodeSizeTest() + { + int index = 0; + int arrayCount = 40; + int maxNodeSize = 20; + int[] intArray = new int[arrayCount]; + + for (int i = 0; i < arrayCount; i++) + intArray[i] = i; + + var buffer1 = new ChainedBuffer(intArray, maxNodeSize); + + Assert.AreEqual(arrayCount, buffer1.Count); + + foreach (var buf in buffer1) { + Assert.That(buf, Is.EqualTo(index)); + ++index; + } + } + + [Test] + public void ConstructorMaxNodeSizeTest() + { + int count = 40; + int index = 0; + int maxNodeSize = 10; + var buffer1 = new ChainedBuffer(maxNodeSize); + + for (int i = 0; i < count; i++) + buffer1.Add(i); + + Assert.AreEqual(count, buffer1.Count); + + foreach (var buf in buffer1) { + Assert.That(buf, Is.EqualTo(index)); + ++index; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/CollectionBaseTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/CollectionBaseTest.cs index a7f18ae111..0dbd492e15 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/CollectionBaseTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/CollectionBaseTest.cs @@ -1,112 +1,112 @@ -using System; -using System.IO; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using System.Threading; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Orm.Tests; - - -namespace Xtensive.Orm.Tests.Core.Collections -{ - - [TestFixture] - public class CollectionBaseTest - { - private IntegerCollection globalCollection; - private readonly Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - - [Serializable] - public class IntegerCollection : CollectionBase - { - public IntegerCollection() - { - } - } - - [Test, Ignore("")] - public void SynchronizationTest() - { - globalCollection = new IntegerCollection(); - - - Thread[] addThreads = new Thread[10]; - Thread[] removeThreads = new Thread[10]; - Thread[] getThreads = new Thread[10]; - Thread[] containsThreads = new Thread[10]; - for (int i = 0; i < 10; i++) - { - addThreads[i] = new Thread(AddItem); - removeThreads[i] = new Thread(RemoveItem); - getThreads[i] = new Thread(GetItem); - containsThreads[i] = new Thread(Contains); - } - - for (int i = 0; i < 10; i++) { - addThreads[i].Start(); - getThreads[i].Start(); - containsThreads[i].Start(); - } - Thread.Sleep(10); - - for (int i = 0; i < 10; i++) { - removeThreads[i].Start(); - } - Thread.Sleep(1000); - - for (int i = 0; i < 10; i++) { - removeThreads[i].Abort(); - addThreads[i].Abort(); - } - - Assert.IsTrue(globalCollection.Count > 0); - globalCollection = null; - } - - private void AddItem() - { - int count = random.Next(100000); - while (true) { - globalCollection.Add(count); - count++; - } - } - - private void GetItem() - { - int value = globalCollection[globalCollection.Count/2]; - } - - private void Contains() - { - int item = random.Next(100000); - globalCollection.Contains(item); - } - - private void RemoveItem() - { - while (true) { - int test=0; - foreach (int n in globalCollection) - { - test = n; - break; - } - globalCollection.Remove(test); - } - } - - [Test] - public void SerializationTest() - { - globalCollection = new IntegerCollection(); - MemoryStream ms = new MemoryStream(); - BinaryFormatter bf = new BinaryFormatter(); - bf.Serialize(ms, globalCollection); - - ms.Seek(0, SeekOrigin.Begin); - globalCollection = (IntegerCollection)bf.Deserialize(ms); - } - } -} +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Threading; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Orm.Tests; + + +namespace Xtensive.Orm.Tests.Core.Collections +{ + + [TestFixture] + public class CollectionBaseTest + { + private IntegerCollection globalCollection; + private readonly Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + + [Serializable] + public class IntegerCollection : CollectionBase + { + public IntegerCollection() + { + } + } + + [Test, Ignore("")] + public void SynchronizationTest() + { + globalCollection = new IntegerCollection(); + + + Thread[] addThreads = new Thread[10]; + Thread[] removeThreads = new Thread[10]; + Thread[] getThreads = new Thread[10]; + Thread[] containsThreads = new Thread[10]; + for (int i = 0; i < 10; i++) + { + addThreads[i] = new Thread(AddItem); + removeThreads[i] = new Thread(RemoveItem); + getThreads[i] = new Thread(GetItem); + containsThreads[i] = new Thread(Contains); + } + + for (int i = 0; i < 10; i++) { + addThreads[i].Start(); + getThreads[i].Start(); + containsThreads[i].Start(); + } + Thread.Sleep(10); + + for (int i = 0; i < 10; i++) { + removeThreads[i].Start(); + } + Thread.Sleep(1000); + + for (int i = 0; i < 10; i++) { + removeThreads[i].Abort(); + addThreads[i].Abort(); + } + + Assert.IsTrue(globalCollection.Count > 0); + globalCollection = null; + } + + private void AddItem() + { + int count = random.Next(100000); + while (true) { + globalCollection.Add(count); + count++; + } + } + + private void GetItem() + { + int value = globalCollection[globalCollection.Count/2]; + } + + private void Contains() + { + int item = random.Next(100000); + globalCollection.Contains(item); + } + + private void RemoveItem() + { + while (true) { + int test=0; + foreach (int n in globalCollection) + { + test = n; + break; + } + globalCollection.Remove(test); + } + } + + [Test] + public void SerializationTest() + { + globalCollection = new IntegerCollection(); + MemoryStream ms = new MemoryStream(); + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(ms, globalCollection); + + ms.Seek(0, SeekOrigin.Begin); + globalCollection = (IntegerCollection)bf.Deserialize(ms); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/DirectionCollectionTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/DirectionCollectionTest.cs index 976d868014..24b97cd09a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/DirectionCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/DirectionCollectionTest.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2007.11.23 - -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class DirectionCollectionTest - { - public void Test() - { - DirectionCollection collection = new DirectionCollection(); - collection["a"] = Direction.Negative; - collection["b"] = Direction.Negative; - collection["c"] = Direction.Positive; - collection["d"] = Direction.Positive; - collection["e"] = Direction.Negative; - Assert.AreEqual(Direction.Negative, collection["a"]); - Assert.AreEqual(Direction.Negative, collection["b"]); - Assert.AreEqual(Direction.Positive, collection["c"]); - Assert.AreEqual(Direction.Positive, collection["d"]); - Assert.AreEqual(Direction.Negative, collection["e"]); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2007.11.23 + +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class DirectionCollectionTest + { + public void Test() + { + DirectionCollection collection = new DirectionCollection(); + collection["a"] = Direction.Negative; + collection["b"] = Direction.Negative; + collection["c"] = Direction.Positive; + collection["d"] = Direction.Positive; + collection["e"] = Direction.Negative; + Assert.AreEqual(Direction.Negative, collection["a"]); + Assert.AreEqual(Direction.Negative, collection["b"]); + Assert.AreEqual(Direction.Positive, collection["c"]); + Assert.AreEqual(Direction.Positive, collection["d"]); + Assert.AreEqual(Direction.Negative, collection["e"]); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/EnumerableExtensionsTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/EnumerableExtensionsTest.cs index 1c6fa29ab0..737e7ec72a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/EnumerableExtensionsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/EnumerableExtensionsTest.cs @@ -1,168 +1,168 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2009.06.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - internal class Node - { - public List Children { get; set; } - public readonly string Name; - - public Node(string name) - { - Name = name; - } - } - - [TestFixture] - public sealed class EnumerableExtensionsTest - { - [Test] - public void RootFirstTest() - { - var root = CreateHierarchy(); - var result = Flatten(root, true); - var expected = new List{root}; - expected.Add(root.Children[0]); - expected.AddRange(root.Children[0].Children); - expected.Add(root.Children[1]); - expected.AddRange(root.Children[1].Children); - expected.Add(root.Children[2]); - expected.Add(root.Children[3]); - expected.Add(root.Children[4]); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void RootLastTest() - { - var root = CreateHierarchy(); - var result = Flatten(root, false); - var expected = new List(); - expected.AddRange(root.Children[0].Children); - expected.Add(root.Children[0]); - expected.AddRange(root.Children[1].Children); - expected.Add(root.Children[1]); - expected.Add(root.Children[2]); - expected.Add(root.Children[3]); - expected.Add(root.Children[4]); - expected.Add(root); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void ExitActionTest() - { - var hierarchy = CreateHierarchy(); - var exitActionResult = new List(); - Console.WriteLine("test"); - var result = Flatten(hierarchy, false, exitActionResult.Add); - var expected = new List{hierarchy}; - expected.Add(hierarchy.Children[0]); - expected.AddRange(hierarchy.Children[0].Children); - expected.Add(hierarchy.Children[1]); - expected.AddRange(hierarchy.Children[1].Children); - expected.Add(hierarchy.Children[2]); - expected.Add(hierarchy.Children[3]); - expected.Add(hierarchy.Children[4]); - var cachedResult = result.ToList(); - Assert.IsTrue(cachedResult.SequenceEqual(exitActionResult)); - } - - private static Node CreateHierarchy() - { - return new Node("0") { - Children = new List { - new Node("0.0") { - Children = new List { - new Node("0.0.0") {Children = null}, - new Node("0.0.1") {Children = new List()}, - null - } - }, - new Node("0.1") { - Children = new List { - new Node("0.1.0") {Children = new List()}, - new Node("0.1.1") {Children = new List()}, - new Node("0.1.2") {Children = new List()} - } - }, - null, - new Node("0.3") {Children = null}, - new Node("0.4") {Children = new List()}, - } - }; - } - - private static IEnumerable Flatten(Node root, bool rootFirst) - { - return Flatten(root, rootFirst, null); - } - - private static IEnumerable Flatten(Node root, bool rootFirst, Action exitAction) - { - return EnumerableUtils.One(root).Flatten(n => n != null ? n.Children : null, exitAction, rootFirst); - } - - [Test] - public void BatchTest() - { - var source = InstanceGenerationUtils.GetInstances(new Random(), 0.1).Take(258); - const int initialBatchSize = 8; - const int maximalBatchSize = 32; - const int fastFirstCount = 10; - var result = source.Batch(fastFirstCount, initialBatchSize, maximalBatchSize); - Assert.AreEqual(fastFirstCount, result.TakeWhile(e => !(e is List)).Count()); - var batchSize = initialBatchSize; - Assert.IsTrue(result.Skip(fastFirstCount).All(e => { - var r = ((List) e).Count==batchSize; - if(batchSize < maximalBatchSize) - batchSize *= 2; - return r; - })); - Assert.AreEqual(batchSize, 32); - } - - [Test] - public void ApplyBeforeAndAfter() - { - const int totalCount = 256; - const int batchSize = 32; - var source = InstanceGenerationUtils.GetInstances(new Random(), 0.1).Take(totalCount); - var batches = source.Batch(0, batchSize, batchSize); - var count = 0; - Assert.AreEqual(totalCount / batchSize, batches.ApplyBeforeAndAfter(() => count++, null).Count()); - Assert.AreEqual(totalCount / batchSize + 1, count); - count = 0; - Assert.AreEqual(totalCount / batchSize, batches.ApplyBeforeAndAfter(null, () => count++).Count()); - Assert.AreEqual(totalCount / batchSize + 1, count); - } - - [Test] - public void AtLeastAtMostTest() - { - Assert.AreEqual(true, new[] {1, 2, 3, 4}.AtLeast(3)); - Assert.AreEqual(true, new[] {1, 2, 3}.AtLeast(3)); - Assert.AreEqual(false, new[] {1}.AtLeast(2)); - Assert.AreEqual(true, new[] {1, 2}.AtLeast(0)); - Assert.AreEqual(true, new int[0].AtLeast(-1)); - - Assert.AreEqual(false, new[] {1, 2, 3, 4}.AtMost(3)); - Assert.AreEqual(true, new[] {1, 2, 3}.AtMost(3)); - Assert.AreEqual(true, new[] {1}.AtMost(2)); - Assert.AreEqual(false, new[] {1, 2}.AtMost(0)); - Assert.AreEqual(false, new int[0].AtMost(-1)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2009.06.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + internal class Node + { + public List Children { get; set; } + public readonly string Name; + + public Node(string name) + { + Name = name; + } + } + + [TestFixture] + public sealed class EnumerableExtensionsTest + { + [Test] + public void RootFirstTest() + { + var root = CreateHierarchy(); + var result = Flatten(root, true); + var expected = new List{root}; + expected.Add(root.Children[0]); + expected.AddRange(root.Children[0].Children); + expected.Add(root.Children[1]); + expected.AddRange(root.Children[1].Children); + expected.Add(root.Children[2]); + expected.Add(root.Children[3]); + expected.Add(root.Children[4]); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void RootLastTest() + { + var root = CreateHierarchy(); + var result = Flatten(root, false); + var expected = new List(); + expected.AddRange(root.Children[0].Children); + expected.Add(root.Children[0]); + expected.AddRange(root.Children[1].Children); + expected.Add(root.Children[1]); + expected.Add(root.Children[2]); + expected.Add(root.Children[3]); + expected.Add(root.Children[4]); + expected.Add(root); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void ExitActionTest() + { + var hierarchy = CreateHierarchy(); + var exitActionResult = new List(); + Console.WriteLine("test"); + var result = Flatten(hierarchy, false, exitActionResult.Add); + var expected = new List{hierarchy}; + expected.Add(hierarchy.Children[0]); + expected.AddRange(hierarchy.Children[0].Children); + expected.Add(hierarchy.Children[1]); + expected.AddRange(hierarchy.Children[1].Children); + expected.Add(hierarchy.Children[2]); + expected.Add(hierarchy.Children[3]); + expected.Add(hierarchy.Children[4]); + var cachedResult = result.ToList(); + Assert.IsTrue(cachedResult.SequenceEqual(exitActionResult)); + } + + private static Node CreateHierarchy() + { + return new Node("0") { + Children = new List { + new Node("0.0") { + Children = new List { + new Node("0.0.0") {Children = null}, + new Node("0.0.1") {Children = new List()}, + null + } + }, + new Node("0.1") { + Children = new List { + new Node("0.1.0") {Children = new List()}, + new Node("0.1.1") {Children = new List()}, + new Node("0.1.2") {Children = new List()} + } + }, + null, + new Node("0.3") {Children = null}, + new Node("0.4") {Children = new List()}, + } + }; + } + + private static IEnumerable Flatten(Node root, bool rootFirst) + { + return Flatten(root, rootFirst, null); + } + + private static IEnumerable Flatten(Node root, bool rootFirst, Action exitAction) + { + return EnumerableUtils.One(root).Flatten(n => n != null ? n.Children : null, exitAction, rootFirst); + } + + [Test] + public void BatchTest() + { + var source = InstanceGenerationUtils.GetInstances(new Random(), 0.1).Take(258); + const int initialBatchSize = 8; + const int maximalBatchSize = 32; + const int fastFirstCount = 10; + var result = source.Batch(fastFirstCount, initialBatchSize, maximalBatchSize); + Assert.AreEqual(fastFirstCount, result.TakeWhile(e => !(e is List)).Count()); + var batchSize = initialBatchSize; + Assert.IsTrue(result.Skip(fastFirstCount).All(e => { + var r = ((List) e).Count==batchSize; + if(batchSize < maximalBatchSize) + batchSize *= 2; + return r; + })); + Assert.AreEqual(batchSize, 32); + } + + [Test] + public void ApplyBeforeAndAfter() + { + const int totalCount = 256; + const int batchSize = 32; + var source = InstanceGenerationUtils.GetInstances(new Random(), 0.1).Take(totalCount); + var batches = source.Batch(0, batchSize, batchSize); + var count = 0; + Assert.AreEqual(totalCount / batchSize, batches.ApplyBeforeAndAfter(() => count++, null).Count()); + Assert.AreEqual(totalCount / batchSize + 1, count); + count = 0; + Assert.AreEqual(totalCount / batchSize, batches.ApplyBeforeAndAfter(null, () => count++).Count()); + Assert.AreEqual(totalCount / batchSize + 1, count); + } + + [Test] + public void AtLeastAtMostTest() + { + Assert.AreEqual(true, new[] {1, 2, 3, 4}.AtLeast(3)); + Assert.AreEqual(true, new[] {1, 2, 3}.AtLeast(3)); + Assert.AreEqual(false, new[] {1}.AtLeast(2)); + Assert.AreEqual(true, new[] {1, 2}.AtLeast(0)); + Assert.AreEqual(true, new int[0].AtLeast(-1)); + + Assert.AreEqual(false, new[] {1, 2, 3, 4}.AtMost(3)); + Assert.AreEqual(true, new[] {1, 2, 3}.AtMost(3)); + Assert.AreEqual(true, new[] {1}.AtMost(2)); + Assert.AreEqual(false, new[] {1, 2}.AtMost(0)); + Assert.AreEqual(false, new int[0].AtMost(-1)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ExtensionCollectionTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ExtensionCollectionTest.cs index 7beb9a6e08..f10d690884 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ExtensionCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ExtensionCollectionTest.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.07.03 - -using System; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ExtensionCollectionTest - { - [Test] - public void CombinedTest() - { - var c = new ExtensionCollection(); - Assert.AreEqual(0, c.Count); - Assert.IsNull(c.Get()); - AssertEx.ThrowsArgumentException(() => c.Set(typeof(int), 1)); - c.Set(this); - Assert.AreEqual(1, c.Count); - Assert.AreSame(this, c.Get()); - - c.Lock(); - AssertEx.Throws(() => c.Set(this)); - - var cc = (ExtensionCollection) c.Clone(); - AssertEx.HasSameElements(c, cc); - - var o = new object(); - cc.Set(o); - Assert.AreEqual(2, cc.Count); - Assert.AreSame(this, cc.Get()); - Assert.AreSame(o, cc.Get()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.07.03 + +using System; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class ExtensionCollectionTest + { + [Test] + public void CombinedTest() + { + var c = new ExtensionCollection(); + Assert.AreEqual(0, c.Count); + Assert.IsNull(c.Get()); + AssertEx.ThrowsArgumentException(() => c.Set(typeof(int), 1)); + c.Set(this); + Assert.AreEqual(1, c.Count); + Assert.AreSame(this, c.Get()); + + c.Lock(); + AssertEx.Throws(() => c.Set(this)); + + var cc = (ExtensionCollection) c.Clone(); + AssertEx.HasSameElements(c, cc); + + var o = new object(); + cc.Set(o); + Assert.AreEqual(2, cc.Count); + Assert.AreSame(this, cc.Get()); + Assert.AreSame(o, cc.Get()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/FlagCollectionTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/FlagCollectionTest.cs index d3a83f2a81..312842ed58 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/FlagCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/FlagCollectionTest.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2007.10.01 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Conversion; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class FlagCollectionTest - { - private const int ItemCount = 32; - private static readonly IntConverter intConverter = new IntConverter(); - private static readonly Biconverter converter = new Biconverter(intConverter, intConverter); - - internal class IntConverter: - IAdvancedConverter, - IAdvancedConverter - { - public bool Convert(int value) - { - if (value >= 0) - return true; - return false; - } - - public int Convert(bool value) - { - return value ? 1 : -1; - } - - public bool IsRough - { - get { return false; } - } - - public IAdvancedConverterProvider Provider - { - get { return null; } - } - } - - [Test] - public void AddTest() - { - Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - FlagCollection flagCollection = new FlagCollection(converter); - for (int i = 0; i < ItemCount; i++) { - flagCollection.Add(new object(), random.Next(-100,100)); - } - Assert.AreEqual(ItemCount, flagCollection.Count ); - - FlagCollection flagCollection1 = new FlagCollection(converter, flagCollection); - Assert.AreEqual(flagCollection, flagCollection1); - } - - [Test] - public void BitVectorTest() - { - FlagCollection flagCollection = new FlagCollection(converter); - flagCollection.Add(new object(), -100); - flagCollection.Add(new object(), 100); - IList list = new List(flagCollection.Values); - Assert.AreEqual(-1, list[0]); - Assert.AreEqual(1, list[1]); - } - - [Test] - public void AddRemoveTest() - { - Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); - List> collection = new List>(); - for (int i = 0; i < ItemCount; i++) { - collection.Add(new KeyValuePair(new object(), random.Next(-100, 100))); - } - FlagCollection flagCollection = new FlagCollection(converter, collection); - for (int i = 0; i < ItemCount; i++) { - KeyValuePair pair = collection[i]; - Assert.AreEqual(pair.Key, flagCollection[i].Key); - Assert.AreEqual(pair.Value >= 0, flagCollection[pair.Key] >= 0); - } - - foreach (KeyValuePair pair in collection) { - flagCollection.Remove(pair.Key); - } - Assert.AreEqual(0, flagCollection.Count); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2007.10.01 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Conversion; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class FlagCollectionTest + { + private const int ItemCount = 32; + private static readonly IntConverter intConverter = new IntConverter(); + private static readonly Biconverter converter = new Biconverter(intConverter, intConverter); + + internal class IntConverter: + IAdvancedConverter, + IAdvancedConverter + { + public bool Convert(int value) + { + if (value >= 0) + return true; + return false; + } + + public int Convert(bool value) + { + return value ? 1 : -1; + } + + public bool IsRough + { + get { return false; } + } + + public IAdvancedConverterProvider Provider + { + get { return null; } + } + } + + [Test] + public void AddTest() + { + Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + FlagCollection flagCollection = new FlagCollection(converter); + for (int i = 0; i < ItemCount; i++) { + flagCollection.Add(new object(), random.Next(-100,100)); + } + Assert.AreEqual(ItemCount, flagCollection.Count ); + + FlagCollection flagCollection1 = new FlagCollection(converter, flagCollection); + Assert.AreEqual(flagCollection, flagCollection1); + } + + [Test] + public void BitVectorTest() + { + FlagCollection flagCollection = new FlagCollection(converter); + flagCollection.Add(new object(), -100); + flagCollection.Add(new object(), 100); + IList list = new List(flagCollection.Values); + Assert.AreEqual(-1, list[0]); + Assert.AreEqual(1, list[1]); + } + + [Test] + public void AddRemoveTest() + { + Random random = RandomManager.CreateRandom((int)DateTime.Now.Ticks); + List> collection = new List>(); + for (int i = 0; i < ItemCount; i++) { + collection.Add(new KeyValuePair(new object(), random.Next(-100, 100))); + } + FlagCollection flagCollection = new FlagCollection(converter, collection); + for (int i = 0; i < ItemCount; i++) { + KeyValuePair pair = collection[i]; + Assert.AreEqual(pair.Key, flagCollection[i].Key); + Assert.AreEqual(pair.Value >= 0, flagCollection[pair.Key] >= 0); + } + + foreach (KeyValuePair pair in collection) { + flagCollection.Remove(pair.Key); + } + Assert.AreEqual(0, flagCollection.Count); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/LinkedListTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/LinkedListTest.cs index e15f5d834c..ef6d57429d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/LinkedListTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/LinkedListTest.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.01.17 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Collections; -using System.Linq; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class LinkedListTest - { - [Test] - public void AddTest() - { - var list = new SinglyLinkedList(0); - list = list.Add(1); - list = list.Add(2); - list = list.Add(3); - Assert.AreEqual(4, list.Count); - Assert.IsTrue(list.SequenceEqual(new []{3,2,1,0})); - } - - [Test] - public void SequenceTest() - { - var list = new SinglyLinkedList(new[] {0, 1, 2, 3}); - Assert.AreEqual(4, list.Count); - Assert.IsTrue(list.SequenceEqual(new[] {0, 1, 2, 3})); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.01.17 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Collections; +using System.Linq; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class LinkedListTest + { + [Test] + public void AddTest() + { + var list = new SinglyLinkedList(0); + list = list.Add(1); + list = list.Add(2); + list = list.Add(3); + Assert.AreEqual(4, list.Count); + Assert.IsTrue(list.SequenceEqual(new []{3,2,1,0})); + } + + [Test] + public void SequenceTest() + { + var list = new SinglyLinkedList(new[] {0, 1, 2, 3}); + Assert.AreEqual(4, list.Count); + Assert.IsTrue(list.SequenceEqual(new[] {0, 1, 2, 3})); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/NativeTypeClassifierTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/NativeTypeClassifierTest.cs index df17c704e3..f1bea28ca8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/NativeTypeClassifierTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/NativeTypeClassifierTest.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.07.02 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Orm.Tests; -using System.Linq; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class NativeTypeClassifierTest - { - [Test] - public void CombinedTest() - { - var classifier = new NativeTypeClassifier(false); - - var o = new object(); - classifier.Add(o); - Assert.IsTrue(classifier.Contains(o)); - Assert.AreEqual(1, classifier.Count); - Assert.AreEqual(1, classifier.ClassCount); - Assert.AreEqual(1, classifier.GetItems().Count()); - Assert.AreEqual(0, classifier.GetItems().Count()); - - var l = new List(); - classifier.Add(l); - Assert.IsTrue(classifier.Contains(l)); - Assert.AreEqual(2, classifier.Count); - Assert.AreEqual(10, classifier.ClassCount); - Assert.AreEqual(2, classifier.GetItems().Count()); - Assert.AreEqual(1, classifier.GetItems>().Count()); - - classifier.Remove(l); - Assert.IsTrue(classifier.Contains(o)); - Assert.AreEqual(1, classifier.Count); - Assert.AreEqual(1, classifier.ClassCount); - Assert.AreEqual(1, classifier.GetItems().Count()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.07.02 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Orm.Tests; +using System.Linq; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class NativeTypeClassifierTest + { + [Test] + public void CombinedTest() + { + var classifier = new NativeTypeClassifier(false); + + var o = new object(); + classifier.Add(o); + Assert.IsTrue(classifier.Contains(o)); + Assert.AreEqual(1, classifier.Count); + Assert.AreEqual(1, classifier.ClassCount); + Assert.AreEqual(1, classifier.GetItems().Count()); + Assert.AreEqual(0, classifier.GetItems().Count()); + + var l = new List(); + classifier.Add(l); + Assert.IsTrue(classifier.Contains(l)); + Assert.AreEqual(2, classifier.Count); + Assert.AreEqual(10, classifier.ClassCount); + Assert.AreEqual(2, classifier.GetItems().Count()); + Assert.AreEqual(1, classifier.GetItems>().Count()); + + classifier.Remove(l); + Assert.IsTrue(classifier.Contains(o)); + Assert.AreEqual(1, classifier.Count); + Assert.AreEqual(1, classifier.ClassCount); + Assert.AreEqual(1, classifier.GetItems().Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/PriorityQueueTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/PriorityQueueTest.cs index 115ed31da2..6e728f2398 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/PriorityQueueTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/PriorityQueueTest.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2007.06.15 - -using System; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; - - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class PriorityQueueTest - { - [Test] - public void FastEnqueeDequeTest() - { - PriorityQueue pq = new PriorityQueue(); - int count = 10000; - using (new Measurement("Fast Enqueue test", count)) { - for (int i = 0; i < count; i++) - { - pq.Enqueue(DateTime.Now.ToString(), Guid.NewGuid().ToString()); - } - } - Assert.AreEqual(pq.Count, count); - using (new Measurement("Fast Dequeue test", count)) { - while (pq.Count > 0) - pq.Dequeue(); - } - } - - [Test] - public void EnqueueDequeTest() - { - PriorityQueue pqAsc = new PriorityQueue(Direction.Negative); - for (int i = 0; i < 10000; i++) - { - string data = Guid.NewGuid().ToString(); - pqAsc.Enqueue(data, data); - } - for (int i = 0; i < pqAsc.Count - 1; i++) - { - Assert.Greater(pqAsc[i], pqAsc[i + 1]); - } - - PriorityQueue pqDesc = new PriorityQueue(Direction.Positive); - for (int i = 0; i < 10000; i++) - { - string data = Guid.NewGuid().ToString(); - pqDesc.Enqueue(data, data); - } - for (int i = 0; i < pqDesc.Count - 1; i++) - { - Assert.Less(pqDesc[i], pqDesc[i + 1]); - } - - } - - [Test] - public void RemoveTest() - { - PriorityQueue pq = new PriorityQueue(); - string item = "item"; - Assert.Throws(() => { - pq.Enqueue("1", "s1"); - pq.Enqueue(item, "s2"); - pq.Enqueue("3", "s3"); - pq.Remove("fff"); - }); - } - - [Test] - public void DequeRangeTest() - { - PriorityQueue pq = new PriorityQueue(Direction.Positive); - pq.Enqueue("item1.1", "s1"); - pq.Enqueue("item1.2", "s1"); - pq.Enqueue("item2.1", "s2"); - pq.Enqueue("item2.2", "s2"); - pq.Enqueue("item3", "s3"); - string[] result = pq.DequeueRange("s2"); - Assert.AreEqual(5, pq.Count + result.Length); - Assert.AreEqual(4, result.Length); - - PriorityQueue pqDesc = new PriorityQueue(Direction.Negative); - pqDesc.Enqueue("item1.1", "s1"); - pqDesc.Enqueue("item1.2", "s1"); - pqDesc.Enqueue("item2.1", "s2"); - pqDesc.Enqueue("item2.2", "s2"); - pqDesc.Enqueue("item3", "s3"); - string[] resultDesc = pqDesc.DequeueRange("s2"); - Assert.AreEqual(5, pqDesc.Count + resultDesc.Length); - Assert.AreEqual(3, resultDesc.Length); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2007.06.15 + +using System; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; + + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class PriorityQueueTest + { + [Test] + public void FastEnqueeDequeTest() + { + PriorityQueue pq = new PriorityQueue(); + int count = 10000; + using (new Measurement("Fast Enqueue test", count)) { + for (int i = 0; i < count; i++) + { + pq.Enqueue(DateTime.Now.ToString(), Guid.NewGuid().ToString()); + } + } + Assert.AreEqual(pq.Count, count); + using (new Measurement("Fast Dequeue test", count)) { + while (pq.Count > 0) + pq.Dequeue(); + } + } + + [Test] + public void EnqueueDequeTest() + { + PriorityQueue pqAsc = new PriorityQueue(Direction.Negative); + for (int i = 0; i < 10000; i++) + { + string data = Guid.NewGuid().ToString(); + pqAsc.Enqueue(data, data); + } + for (int i = 0; i < pqAsc.Count - 1; i++) + { + Assert.Greater(pqAsc[i], pqAsc[i + 1]); + } + + PriorityQueue pqDesc = new PriorityQueue(Direction.Positive); + for (int i = 0; i < 10000; i++) + { + string data = Guid.NewGuid().ToString(); + pqDesc.Enqueue(data, data); + } + for (int i = 0; i < pqDesc.Count - 1; i++) + { + Assert.Less(pqDesc[i], pqDesc[i + 1]); + } + + } + + [Test] + public void RemoveTest() + { + PriorityQueue pq = new PriorityQueue(); + string item = "item"; + Assert.Throws(() => { + pq.Enqueue("1", "s1"); + pq.Enqueue(item, "s2"); + pq.Enqueue("3", "s3"); + pq.Remove("fff"); + }); + } + + [Test] + public void DequeRangeTest() + { + PriorityQueue pq = new PriorityQueue(Direction.Positive); + pq.Enqueue("item1.1", "s1"); + pq.Enqueue("item1.2", "s1"); + pq.Enqueue("item2.1", "s2"); + pq.Enqueue("item2.2", "s2"); + pq.Enqueue("item3", "s3"); + string[] result = pq.DequeueRange("s2"); + Assert.AreEqual(5, pq.Count + result.Length); + Assert.AreEqual(4, result.Length); + + PriorityQueue pqDesc = new PriorityQueue(Direction.Negative); + pqDesc.Enqueue("item1.1", "s1"); + pqDesc.Enqueue("item1.2", "s1"); + pqDesc.Enqueue("item2.1", "s2"); + pqDesc.Enqueue("item2.2", "s2"); + pqDesc.Enqueue("item3", "s3"); + string[] resultDesc = pqDesc.DequeueRange("s2"); + Assert.AreEqual(5, pqDesc.Count + resultDesc.Length); + Assert.AreEqual(3, resultDesc.Length); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyCollectionTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyCollectionTest.cs index 9b7868f996..eaaaa517d5 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyCollectionTest.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2007.06.04 - -using System; -using System.Collections.Generic; -using System.IO; -using NUnit.Framework; -using Xtensive.Collections; -using System.Runtime.Serialization.Formatters.Binary; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ReadOnlyCollectionTest - { - private List innerCol; - private ReadOnlyCollection readOnlyCollection; - - [OneTimeSetUp] - public void Init() - { - innerCol = new List(); - readOnlyCollection = new ReadOnlyCollection(innerCol); - } - - [Test] - public void ReadOnlyCollection_Add() - { - Assert.Throws(() => readOnlyCollection.Add("Add")); - } - - [Test] - public void ReadOnlyCollection_Remove() - { - Assert.Throws(() => { - innerCol.Add("Remove"); - try { - readOnlyCollection.Remove("Remove"); - } - finally { - innerCol.Clear(); - } - }); - } - - [Test] - public void ReadOnlyCollection_Clear() - { - Assert.Throws(() => { - innerCol.Add("Clear"); - try { - readOnlyCollection.Clear(); - } - finally { - innerCol.Clear(); - } - }); - } - - [Test] - public void CopyToTest() - { - innerCol.Clear(); - innerCol.Add("element"); - innerCol.Add("element 2"); - string[] array = new string[3]; - readOnlyCollection.CopyTo(array, 1); - Assert.IsTrue(array[0]==null); - if (array[1]=="element") - Assert.IsTrue(array[2]=="element 2"); - else - Assert.IsTrue(array[2]=="element"); - } - - [Test] - public void SerializationTest() - { - BinaryFormatter serizalizer = new BinaryFormatter(); - MemoryStream stream = new MemoryStream(); - serizalizer.Serialize(stream, readOnlyCollection); - stream.Position = 0; - ReadOnlyCollection deserialized = (ReadOnlyCollection)serizalizer.Deserialize(stream); - Assert.AreEqual(deserialized.Count, readOnlyCollection.Count); - foreach (string s in deserialized) - Assert.IsTrue(readOnlyCollection.Contains(s)); - foreach (string s in readOnlyCollection) - Assert.IsTrue(deserialized.Contains(s)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2007.06.04 + +using System; +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using Xtensive.Collections; +using System.Runtime.Serialization.Formatters.Binary; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class ReadOnlyCollectionTest + { + private List innerCol; + private ReadOnlyCollection readOnlyCollection; + + [OneTimeSetUp] + public void Init() + { + innerCol = new List(); + readOnlyCollection = new ReadOnlyCollection(innerCol); + } + + [Test] + public void ReadOnlyCollection_Add() + { + Assert.Throws(() => readOnlyCollection.Add("Add")); + } + + [Test] + public void ReadOnlyCollection_Remove() + { + Assert.Throws(() => { + innerCol.Add("Remove"); + try { + readOnlyCollection.Remove("Remove"); + } + finally { + innerCol.Clear(); + } + }); + } + + [Test] + public void ReadOnlyCollection_Clear() + { + Assert.Throws(() => { + innerCol.Add("Clear"); + try { + readOnlyCollection.Clear(); + } + finally { + innerCol.Clear(); + } + }); + } + + [Test] + public void CopyToTest() + { + innerCol.Clear(); + innerCol.Add("element"); + innerCol.Add("element 2"); + string[] array = new string[3]; + readOnlyCollection.CopyTo(array, 1); + Assert.IsTrue(array[0]==null); + if (array[1]=="element") + Assert.IsTrue(array[2]=="element 2"); + else + Assert.IsTrue(array[2]=="element"); + } + + [Test] + public void SerializationTest() + { + BinaryFormatter serizalizer = new BinaryFormatter(); + MemoryStream stream = new MemoryStream(); + serizalizer.Serialize(stream, readOnlyCollection); + stream.Position = 0; + ReadOnlyCollection deserialized = (ReadOnlyCollection)serizalizer.Deserialize(stream); + Assert.AreEqual(deserialized.Count, readOnlyCollection.Count); + foreach (string s in deserialized) + Assert.IsTrue(readOnlyCollection.Contains(s)); + foreach (string s in readOnlyCollection) + Assert.IsTrue(deserialized.Contains(s)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyDictionaryTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyDictionaryTest.cs index 3ad47c257f..99913296d6 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyDictionaryTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyDictionaryTest.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2007.06.04 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using System.Text; -using NUnit.Framework; -using System.Collections; -using Xtensive.Collections; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ReadOnlyDictionaryTest - { - private Dictionary innerDictionary; - private IDictionary readOnlyDictionary; - - [OneTimeSetUp] - public void Init() - { - this.innerDictionary = new Dictionary(); - this.readOnlyDictionary = new ReadOnlyDictionary(innerDictionary); - } - - [Test] - public void Test_Set() - { - Assert.Throws(() => { - this.innerDictionary[1] = "value"; - try { - this.readOnlyDictionary[1] = "newValue"; - } - finally { - Assert.IsTrue((string)readOnlyDictionary[1] == "value"); - } - }); - } - - [Test] - public void Test_Clear() - { - Assert.Throws(() => { - this.innerDictionary[1] = "value"; - try { - this.readOnlyDictionary.Clear(); - } - finally { - Assert.IsTrue((string)readOnlyDictionary[1] == "value"); - } - }); - } - - [Test] - public void SerializationTest() - { - BinaryFormatter serizalizer = new BinaryFormatter(); - MemoryStream stream = new MemoryStream(); - serizalizer.Serialize(stream, readOnlyDictionary); - stream.Position = 0; - ReadOnlyDictionary deserialized = (ReadOnlyDictionary)serizalizer.Deserialize(stream); - Assert.AreEqual(deserialized.Count, readOnlyDictionary.Count); - foreach (KeyValuePair pair in readOnlyDictionary) - Assert.IsTrue(deserialized.Contains(pair)); - foreach (KeyValuePair pair in deserialized) - Assert.IsTrue(readOnlyDictionary.Contains(pair)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2007.06.04 + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using NUnit.Framework; +using System.Collections; +using Xtensive.Collections; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class ReadOnlyDictionaryTest + { + private Dictionary innerDictionary; + private IDictionary readOnlyDictionary; + + [OneTimeSetUp] + public void Init() + { + this.innerDictionary = new Dictionary(); + this.readOnlyDictionary = new ReadOnlyDictionary(innerDictionary); + } + + [Test] + public void Test_Set() + { + Assert.Throws(() => { + this.innerDictionary[1] = "value"; + try { + this.readOnlyDictionary[1] = "newValue"; + } + finally { + Assert.IsTrue((string)readOnlyDictionary[1] == "value"); + } + }); + } + + [Test] + public void Test_Clear() + { + Assert.Throws(() => { + this.innerDictionary[1] = "value"; + try { + this.readOnlyDictionary.Clear(); + } + finally { + Assert.IsTrue((string)readOnlyDictionary[1] == "value"); + } + }); + } + + [Test] + public void SerializationTest() + { + BinaryFormatter serizalizer = new BinaryFormatter(); + MemoryStream stream = new MemoryStream(); + serizalizer.Serialize(stream, readOnlyDictionary); + stream.Position = 0; + ReadOnlyDictionary deserialized = (ReadOnlyDictionary)serizalizer.Deserialize(stream); + Assert.AreEqual(deserialized.Count, readOnlyDictionary.Count); + foreach (KeyValuePair pair in readOnlyDictionary) + Assert.IsTrue(deserialized.Contains(pair)); + foreach (KeyValuePair pair in deserialized) + Assert.IsTrue(readOnlyDictionary.Contains(pair)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyListTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyListTest.cs index 86eff1932e..545542610f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyListTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlyListTest.cs @@ -1,119 +1,119 @@ -// Copyright (C) YEAR Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Ilyin -// Created: 8 2007 . - -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using NUnit.Framework; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Collections; -using System; -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ReadOnlyListTest - { - private IList innerList; - private IList readOnlyList; - - [OneTimeSetUp] - public void Init() - { - List localInnerSet = new List(); - innerList = localInnerSet; - this.readOnlyList = new ReadOnlyList(localInnerSet); - } - - [Test] - public void Test_Add() - { - Assert.Throws(() => { - innerList.Clear(); - try { - readOnlyList.Add("element"); - } - finally { - Assert.IsTrue(readOnlyList.Count == 0); - } - }); - } - - [Test] - public void Test_Remove() - { - Assert.Throws(() => { - innerList.Clear(); - innerList.Add("element"); - try { - readOnlyList.Remove("element"); - } - finally { - Assert.IsTrue(readOnlyList.Count == 1); - } - }); - } - - [Test] - public void Test_RemoveAt() - { - Assert.Throws(() => { - innerList.Clear(); - innerList.Add("element"); - try { - readOnlyList.RemoveAt(0); - } - finally { - Assert.IsTrue(readOnlyList.Count == 1); - } - }); - } - - [Test] - public void Test_Clear() - { - Assert.Throws(() => { - innerList.Clear(); - innerList.Add("element"); - try { - readOnlyList.Clear(); - } - finally { - Assert.IsTrue(readOnlyList.Count == 1); - } - }); - } - - [Test] - public void CopyToTest() - { - innerList.Clear(); - innerList.Add("element"); - innerList.Add("element 2"); - string[] array = new string[3]; - readOnlyList.CopyTo(array, 1); - Assert.IsTrue(array[0]==null); - if (array[1]=="element") - Assert.IsTrue(array[2]=="element 2"); - else - Assert.IsTrue(array[2]=="element"); - } - - [Test] - public void SerializationTest() - { - BinaryFormatter serizalizer = new BinaryFormatter(); - MemoryStream stream = new MemoryStream(); - serizalizer.Serialize(stream, readOnlyList); - stream.Position = 0; - ReadOnlyList deserialized = (ReadOnlyList)serizalizer.Deserialize(stream); - Assert.AreEqual(deserialized.Count, readOnlyList.Count); - foreach (string s in deserialized) - Assert.IsTrue(readOnlyList.Contains(s)); - foreach (string s in readOnlyList) - Assert.IsTrue(deserialized.Contains(s)); - } - } +// Copyright (C) YEAR Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Ilyin +// Created: 8 2007 . + +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using NUnit.Framework; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Collections; +using System; +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class ReadOnlyListTest + { + private IList innerList; + private IList readOnlyList; + + [OneTimeSetUp] + public void Init() + { + List localInnerSet = new List(); + innerList = localInnerSet; + this.readOnlyList = new ReadOnlyList(localInnerSet); + } + + [Test] + public void Test_Add() + { + Assert.Throws(() => { + innerList.Clear(); + try { + readOnlyList.Add("element"); + } + finally { + Assert.IsTrue(readOnlyList.Count == 0); + } + }); + } + + [Test] + public void Test_Remove() + { + Assert.Throws(() => { + innerList.Clear(); + innerList.Add("element"); + try { + readOnlyList.Remove("element"); + } + finally { + Assert.IsTrue(readOnlyList.Count == 1); + } + }); + } + + [Test] + public void Test_RemoveAt() + { + Assert.Throws(() => { + innerList.Clear(); + innerList.Add("element"); + try { + readOnlyList.RemoveAt(0); + } + finally { + Assert.IsTrue(readOnlyList.Count == 1); + } + }); + } + + [Test] + public void Test_Clear() + { + Assert.Throws(() => { + innerList.Clear(); + innerList.Add("element"); + try { + readOnlyList.Clear(); + } + finally { + Assert.IsTrue(readOnlyList.Count == 1); + } + }); + } + + [Test] + public void CopyToTest() + { + innerList.Clear(); + innerList.Add("element"); + innerList.Add("element 2"); + string[] array = new string[3]; + readOnlyList.CopyTo(array, 1); + Assert.IsTrue(array[0]==null); + if (array[1]=="element") + Assert.IsTrue(array[2]=="element 2"); + else + Assert.IsTrue(array[2]=="element"); + } + + [Test] + public void SerializationTest() + { + BinaryFormatter serizalizer = new BinaryFormatter(); + MemoryStream stream = new MemoryStream(); + serizalizer.Serialize(stream, readOnlyList); + stream.Position = 0; + ReadOnlyList deserialized = (ReadOnlyList)serizalizer.Deserialize(stream); + Assert.AreEqual(deserialized.Count, readOnlyList.Count); + foreach (string s in deserialized) + Assert.IsTrue(readOnlyList.Contains(s)); + foreach (string s in readOnlyList) + Assert.IsTrue(deserialized.Contains(s)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlySetTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlySetTest.cs index 2ce696e3da..682e197cad 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlySetTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ReadOnlySetTest.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2007.06.04 - -using System; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ReadOnlySetTest - { - private ISet set; - private ReadOnlySet readOnlySet; - - [OneTimeSetUp] - public void Init() - { - set = new SetSlim(); - readOnlySet = new ReadOnlySet(set); - } - - [Test] - public void Test_Add() - { - Assert.Throws(() => { - int count = readOnlySet.Count; - try { - readOnlySet.Add("Element"); - } - finally { - Assert.AreEqual(count, readOnlySet.Count); - } - }); - } - - [Test] - public void Test_Remove() - { - Assert.Throws(() => { - set.Add("Element"); - int count = readOnlySet.Count; - try { - readOnlySet.Remove("Element"); - } - finally { - Assert.AreEqual(count, readOnlySet.Count); - } - }); - - } - - [Test] - public void CopyToTest() - { - set.Clear(); - set.Add("Element"); - set.Add("Element"); - set.Add("Element 2"); - string[] array = new string[3]; - readOnlySet.CopyTo(array, 1); - Assert.IsTrue(array[0]==null); - if (array[1]=="Element") - Assert.IsTrue(array[2]=="Element 2"); - else - Assert.IsTrue(array[2]=="Element"); - } - - [Test] - public void SerializationTest() - { - var deserialized = Cloner.Clone(readOnlySet); - Assert.AreEqual(deserialized.Count, readOnlySet.Count); - foreach (string s in readOnlySet) - Assert.IsTrue(deserialized.Contains(s)); - foreach (string s in deserialized) - Assert.IsTrue(readOnlySet.Contains(s)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2007.06.04 + +using System; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class ReadOnlySetTest + { + private ISet set; + private ReadOnlySet readOnlySet; + + [OneTimeSetUp] + public void Init() + { + set = new SetSlim(); + readOnlySet = new ReadOnlySet(set); + } + + [Test] + public void Test_Add() + { + Assert.Throws(() => { + int count = readOnlySet.Count; + try { + readOnlySet.Add("Element"); + } + finally { + Assert.AreEqual(count, readOnlySet.Count); + } + }); + } + + [Test] + public void Test_Remove() + { + Assert.Throws(() => { + set.Add("Element"); + int count = readOnlySet.Count; + try { + readOnlySet.Remove("Element"); + } + finally { + Assert.AreEqual(count, readOnlySet.Count); + } + }); + + } + + [Test] + public void CopyToTest() + { + set.Clear(); + set.Add("Element"); + set.Add("Element"); + set.Add("Element 2"); + string[] array = new string[3]; + readOnlySet.CopyTo(array, 1); + Assert.IsTrue(array[0]==null); + if (array[1]=="Element") + Assert.IsTrue(array[2]=="Element 2"); + else + Assert.IsTrue(array[2]=="Element"); + } + + [Test] + public void SerializationTest() + { + var deserialized = Cloner.Clone(readOnlySet); + Assert.AreEqual(deserialized.Count, readOnlySet.Count); + foreach (string s in readOnlySet) + Assert.IsTrue(deserialized.Contains(s)); + foreach (string s in deserialized) + Assert.IsTrue(readOnlySet.Contains(s)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/SetTestA.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/SetTestA.cs index c6ce7b3a85..ce3831175a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/SetTestA.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/SetTestA.cs @@ -1,40 +1,40 @@ -using System; -using NUnit.Framework; -using Xtensive.Collections; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class SetTestA - { - [Test] - public void RemoveAt() - { - int count = 10; - int removeCount = 5; - Assert.LessOrEqual(removeCount, count); - ISet set = new Set(); - for (int i = 0; i < count; i++) - set.Add(i); - Assert.AreEqual(count, set.Count); - } - - [Test] - public void Add() - { - string[] strings = {"abc", "dfg", "ag", "abc"}; - - SetSlim C = new SetSlim(strings); - - SetSlim B = new SetSlim(); - B.Add(1); - B.Add(2); - B.Add(2); - B.Add(3); - - if (B.Count!=3 || C.Count!=3) { - throw new Exception("Set.AddRange"); - } - } - } +using System; +using NUnit.Framework; +using Xtensive.Collections; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class SetTestA + { + [Test] + public void RemoveAt() + { + int count = 10; + int removeCount = 5; + Assert.LessOrEqual(removeCount, count); + ISet set = new Set(); + for (int i = 0; i < count; i++) + set.Add(i); + Assert.AreEqual(count, set.Count); + } + + [Test] + public void Add() + { + string[] strings = {"abc", "dfg", "ag", "abc"}; + + SetSlim C = new SetSlim(strings); + + SetSlim B = new SetSlim(); + B.Add(1); + B.Add(2); + B.Add(2); + B.Add(3); + + if (B.Count!=3 || C.Count!=3) { + throw new Exception("Set.AddRange"); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/SetTests.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/SetTests.cs index 3f76046081..2ed8074d0d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/SetTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/SetTests.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2007.10.23 - -using NUnit.Framework; -using Xtensive.Collections; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class SetTests - { - [Test] - public void AddRemoveTest() - { - ISet set = new SetSlim(); - Assert.IsTrue(set.Add(0)); - Assert.IsFalse(set.Add(0)); - Assert.IsTrue(set.Contains(0)); - Assert.AreEqual(set.Count, 1); - Assert.AreEqual(set[0], 0); - Assert.IsTrue(set.Remove(0)); - Assert.AreEqual(set.Count, 0); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2007.10.23 + +using NUnit.Framework; +using Xtensive.Collections; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class SetTests + { + [Test] + public void AddRemoveTest() + { + ISet set = new SetSlim(); + Assert.IsTrue(set.Add(0)); + Assert.IsFalse(set.Add(0)); + Assert.IsTrue(set.Contains(0)); + Assert.AreEqual(set.Count, 1); + Assert.AreEqual(set[0], 0); + Assert.IsTrue(set.Remove(0)); + Assert.AreEqual(set.Count, 0); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Collections/ThreadSafeDictionaryTest.cs b/Orm/Xtensive.Orm.Tests.Core/Collections/ThreadSafeDictionaryTest.cs index a0282ccc54..0482f44684 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Collections/ThreadSafeDictionaryTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Collections/ThreadSafeDictionaryTest.cs @@ -1,138 +1,138 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.20 - -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Collections; - -namespace Xtensive.Orm.Tests.Core.Collections -{ - [TestFixture] - public class ThreadSafeDictionaryTest - { - private const int FillCount = 10; - private Dictionary d = new Dictionary(); - private ThreadSafeDictionary tsd = ThreadSafeDictionary.Create(new object()); - - - [Test] - public void CombinedTest() - { - var dictionary = ThreadSafeDictionary.Create(new object()); - - // SetValue - string one; - Assert.IsFalse( - dictionary.TryGetValue(1, out one)); - Assert.IsNull(one); - - dictionary.SetValue(1, "One"); - - Assert.IsTrue( - dictionary.TryGetValue(1, out one)); - - Assert.AreEqual("One", one); - - // GetValue with generaors - string two = dictionary.GetValue(2, - delegate { return "Two"; }); - - Assert.AreEqual("Two", two); - - bool twoRecalculated = false; - - two = dictionary.GetValue(2, - delegate - { - twoRecalculated = true; - return "Two"; - }); - - Assert.AreEqual("Two", two); - Assert.IsFalse(twoRecalculated); - - // Null value - string zero = dictionary.GetValue(0, - delegate { return null; }); - - Assert.AreEqual(null, zero); - - bool zeroRecalculated = false; - - zero = dictionary.GetValue(0, - delegate - { - zeroRecalculated = true; - return null; - }); - - Assert.IsNull(zero); - Assert.IsFalse(zeroRecalculated); - - - var dictionary2 = ThreadSafeDictionary.Create(new object()); - - int i; - dictionary2.TryGetValue(0, out i); - Assert.AreEqual(0, i); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - FillThreadSafeDictionary(); - FillDictionary(); - DictionaryReadTest(1000); - ThreadSafeDictionaryReadTest(1000); - int count = 10000000; - int r1, r2; - using (new Measurement("Reading ThreadSafeDictionary", count)) { - r1 = ThreadSafeDictionaryReadTest(count); - } - using (new Measurement("Reading Dictionary", count)) { - r2 = DictionaryReadTest(count); - } - Assert.AreEqual(r1, r2); - } - - private void FillThreadSafeDictionary() - { - for (int i = 0; i d = new Dictionary(); + private ThreadSafeDictionary tsd = ThreadSafeDictionary.Create(new object()); + + + [Test] + public void CombinedTest() + { + var dictionary = ThreadSafeDictionary.Create(new object()); + + // SetValue + string one; + Assert.IsFalse( + dictionary.TryGetValue(1, out one)); + Assert.IsNull(one); + + dictionary.SetValue(1, "One"); + + Assert.IsTrue( + dictionary.TryGetValue(1, out one)); + + Assert.AreEqual("One", one); + + // GetValue with generaors + string two = dictionary.GetValue(2, + delegate { return "Two"; }); + + Assert.AreEqual("Two", two); + + bool twoRecalculated = false; + + two = dictionary.GetValue(2, + delegate + { + twoRecalculated = true; + return "Two"; + }); + + Assert.AreEqual("Two", two); + Assert.IsFalse(twoRecalculated); + + // Null value + string zero = dictionary.GetValue(0, + delegate { return null; }); + + Assert.AreEqual(null, zero); + + bool zeroRecalculated = false; + + zero = dictionary.GetValue(0, + delegate + { + zeroRecalculated = true; + return null; + }); + + Assert.IsNull(zero); + Assert.IsFalse(zeroRecalculated); + + + var dictionary2 = ThreadSafeDictionary.Create(new object()); + + int i; + dictionary2.TryGetValue(0, out i); + Assert.AreEqual(0, i); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + FillThreadSafeDictionary(); + FillDictionary(); + DictionaryReadTest(1000); + ThreadSafeDictionaryReadTest(1000); + int count = 10000000; + int r1, r2; + using (new Measurement("Reading ThreadSafeDictionary", count)) { + r1 = ThreadSafeDictionaryReadTest(count); + } + using (new Measurement("Reading Dictionary", count)) { + r2 = DictionaryReadTest(count); + } + Assert.AreEqual(r1, r2); + } + + private void FillThreadSafeDictionary() + { + for (int i = 0; i>(); - for (int i = 0; i < nodeCount; i++) - nodes.Add(new Node(i)); - int edgeCount = 0; - foreach (var from in nodes) { - int outgoingEdgeCount = rnd.Next(averageEdgeCount); - for (int i = 0; i < outgoingEdgeCount; i++) { - var to = nodes[rnd.Next(allowLoops ? nodeCount : @from.Value)]; - if (from==to) - continue; - var c = new Edge(@from, to, edgeCount++); - } - } - var graph = new Graph, Edge>(nodes); - - GC.GetTotalMemory(true); - using (new Measurement("Sorting", nodeCount + edgeCount)) { - var result = TopologicalSorter.Sort(graph, e => true); - Assert.IsFalse(result.HasLoops); - } - GC.GetTotalMemory(true); - } - - [Test] - public void SelfReferenceTest() - { - var node = new Node(1); - var edge = new Edge(node, node, 1); - var graph = new Graph, Edge>(EnumerableUtils.One(node)); - - List> removedEdges; - var result = TopologicalSorter.Sort(graph, e => e.Source==e.Target); - Assert.AreEqual(1, result.SortedNodes.Count); - Assert.AreSame(node, result.SortedNodes[0]); - Assert.AreEqual(1, result.BrokenEdges.Count); - Assert.AreSame(edge, result.BrokenEdges[0]); - Assert.AreEqual(0, node.Edges.Count()); - } - - [Test] - public void RemoveEdgeTest1() - { - var node1 = new Node(1); - var node2 = new Node(2); - var connection12_1 = new Edge(node1, node2, 1); - var connection12_2 = new Edge(node1, node2, 2); - var connection21_1 = new Edge(node2, node1, 3); - var graph = new Graph, Edge>(new[] {node2, node1}); - - var result = TopologicalSorter.Sort(graph, e => e.Value==3); - Assert.AreEqual(2, result.SortedNodes.Count); - Assert.AreEqual(1, result.BrokenEdges.Count); - } - - [Test] - public void RemoveEdgeTest2() - { - var node1 = new Node(1); - var node2 = new Node(2); - var connection12_1 = new Edge(node1, node2, 1); - var connection12_2 = new Edge(node1, node2, 2); - var connection21_1 = new Edge(node2, node1, 3); - var graph = new Graph, Edge>(new[] {node2, node1}); - - var result = TopologicalSorter.Sort(graph, e => e.Value!=3); - Assert.AreEqual(2, result.SortedNodes.Count); - Assert.AreEqual(2, result.BrokenEdges.Count); - } - - [Test] - public void CombinedTest() - { - TestSort(new[] {4, 3, 2, 1}, - (i1, i2) => !(i1 == 3 || i2 == 3), - new [] {3}, - new[] {4, 2, 1}); - TestSort(new[] {3, 2, 1}, - (i1, i2) => i1 >= i2, - new[] {1, 2, 3}, - new int[0]); - TestSort(new[] {3, 2, 1}, - (i1, i2) => true, - new int[0], - new[] {1, 2, 3}); - TestSort(new[] {3, 2, 1}, - (i1, i2) => false, - new[] {3, 2, 1}, - new int[0]); - } - - private void TestSort(T[] nodeValues, Predicate connector, T[] expected, T[] loops) - { - // WIth edge breaker, that breaks only self-referencing edges - var nodes = nodeValues.Select(v => new Node(v)).ToList(); - var graph = new Graph, Edge>(nodes); - graph.AddEdges((s,t) => connector(s.Value, t.Value) ? new Edge(s,t) : null); - int selfReferencingEdgeCount = graph.Edges.Count(e => e.Source == e.Target); - - var result = TopologicalSorter.Sort(graph, e => e.Source==e.Target); - var actual = result.SortedNodes.Select(n => n.Value).ToArray(); - var actualLoops = result.LoopNodes.Select(n => n.Value).ToArray(); - - AssertEx.HasSameElements(expected, actual); - AssertEx.HasSameElements(loops, actualLoops); - Assert.AreEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); - - // With edge breaker (any edge can be broken) - nodes = nodeValues.Select(v => new Node(v)).ToList(); - graph = new Graph, Edge>(nodes); - graph.AddEdges((s,t) => connector(s.Value, t.Value) ? new Edge(s,t) : null); - - result = TopologicalSorter.Sort(graph, e => true); - actual = result.SortedNodes.Select(n => n.Value).ToArray(); - actualLoops = result.LoopNodes.Select(n => n.Value).ToArray(); - - Assert.AreEqual(nodeValues.Length, actual.Length); - Assert.AreEqual(0, actualLoops.Length); - if (loops.Length==0) - Assert.AreEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); - else - Assert.AreNotEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.08 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Collections.Graphs; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Collections +{ + [TestFixture] + public class TopologicalSorterTest + { + [Test, Explicit] + public void PerformanceTest() + { + using (TestLog.InfoRegion("No loops")) { + InternalPerformanceTest(10000, 10, false); + InternalPerformanceTest(100, 10, false); + InternalPerformanceTest(1000, 10, false); + InternalPerformanceTest(10000, 10, false); + InternalPerformanceTest(100000, 10, false); + } + TestLog.Info(""); + using (TestLog.InfoRegion("With loop removal")) { + InternalPerformanceTest(10000, 10, true); + InternalPerformanceTest(100, 10, true); + InternalPerformanceTest(1000, 10, true); + InternalPerformanceTest(10000, 10, true); + InternalPerformanceTest(100000, 10, true); + } + } + + private static void InternalPerformanceTest(int nodeCount, int averageEdgeCount, bool allowLoops) + { + TestLog.Info("Building graph: {0} nodes, {1} edges/node in average.", nodeCount, averageEdgeCount); + var rnd = new Random(); + var nodes = new List>(); + for (int i = 0; i < nodeCount; i++) + nodes.Add(new Node(i)); + int edgeCount = 0; + foreach (var from in nodes) { + int outgoingEdgeCount = rnd.Next(averageEdgeCount); + for (int i = 0; i < outgoingEdgeCount; i++) { + var to = nodes[rnd.Next(allowLoops ? nodeCount : @from.Value)]; + if (from==to) + continue; + var c = new Edge(@from, to, edgeCount++); + } + } + var graph = new Graph, Edge>(nodes); + + GC.GetTotalMemory(true); + using (new Measurement("Sorting", nodeCount + edgeCount)) { + var result = TopologicalSorter.Sort(graph, e => true); + Assert.IsFalse(result.HasLoops); + } + GC.GetTotalMemory(true); + } + + [Test] + public void SelfReferenceTest() + { + var node = new Node(1); + var edge = new Edge(node, node, 1); + var graph = new Graph, Edge>(EnumerableUtils.One(node)); + + List> removedEdges; + var result = TopologicalSorter.Sort(graph, e => e.Source==e.Target); + Assert.AreEqual(1, result.SortedNodes.Count); + Assert.AreSame(node, result.SortedNodes[0]); + Assert.AreEqual(1, result.BrokenEdges.Count); + Assert.AreSame(edge, result.BrokenEdges[0]); + Assert.AreEqual(0, node.Edges.Count()); + } + + [Test] + public void RemoveEdgeTest1() + { + var node1 = new Node(1); + var node2 = new Node(2); + var connection12_1 = new Edge(node1, node2, 1); + var connection12_2 = new Edge(node1, node2, 2); + var connection21_1 = new Edge(node2, node1, 3); + var graph = new Graph, Edge>(new[] {node2, node1}); + + var result = TopologicalSorter.Sort(graph, e => e.Value==3); + Assert.AreEqual(2, result.SortedNodes.Count); + Assert.AreEqual(1, result.BrokenEdges.Count); + } + + [Test] + public void RemoveEdgeTest2() + { + var node1 = new Node(1); + var node2 = new Node(2); + var connection12_1 = new Edge(node1, node2, 1); + var connection12_2 = new Edge(node1, node2, 2); + var connection21_1 = new Edge(node2, node1, 3); + var graph = new Graph, Edge>(new[] {node2, node1}); + + var result = TopologicalSorter.Sort(graph, e => e.Value!=3); + Assert.AreEqual(2, result.SortedNodes.Count); + Assert.AreEqual(2, result.BrokenEdges.Count); + } + + [Test] + public void CombinedTest() + { + TestSort(new[] {4, 3, 2, 1}, + (i1, i2) => !(i1 == 3 || i2 == 3), + new [] {3}, + new[] {4, 2, 1}); + TestSort(new[] {3, 2, 1}, + (i1, i2) => i1 >= i2, + new[] {1, 2, 3}, + new int[0]); + TestSort(new[] {3, 2, 1}, + (i1, i2) => true, + new int[0], + new[] {1, 2, 3}); + TestSort(new[] {3, 2, 1}, + (i1, i2) => false, + new[] {3, 2, 1}, + new int[0]); + } + + private void TestSort(T[] nodeValues, Predicate connector, T[] expected, T[] loops) + { + // WIth edge breaker, that breaks only self-referencing edges + var nodes = nodeValues.Select(v => new Node(v)).ToList(); + var graph = new Graph, Edge>(nodes); + graph.AddEdges((s,t) => connector(s.Value, t.Value) ? new Edge(s,t) : null); + int selfReferencingEdgeCount = graph.Edges.Count(e => e.Source == e.Target); + + var result = TopologicalSorter.Sort(graph, e => e.Source==e.Target); + var actual = result.SortedNodes.Select(n => n.Value).ToArray(); + var actualLoops = result.LoopNodes.Select(n => n.Value).ToArray(); + + AssertEx.HasSameElements(expected, actual); + AssertEx.HasSameElements(loops, actualLoops); + Assert.AreEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); + + // With edge breaker (any edge can be broken) + nodes = nodeValues.Select(v => new Node(v)).ToList(); + graph = new Graph, Edge>(nodes); + graph.AddEdges((s,t) => connector(s.Value, t.Value) ? new Edge(s,t) : null); + + result = TopologicalSorter.Sort(graph, e => true); + actual = result.SortedNodes.Select(n => n.Value).ToArray(); + actualLoops = result.LoopNodes.Select(n => n.Value).ToArray(); + + Assert.AreEqual(nodeValues.Length, actual.Length); + Assert.AreEqual(0, actualLoops.Length); + if (loops.Length==0) + Assert.AreEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); + else + Assert.AreNotEqual(selfReferencingEdgeCount, result.BrokenEdges.Count); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTestModel.cs b/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTestModel.cs index c2196d496a..f0eb32652d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTestModel.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTestModel.cs @@ -1,140 +1,140 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.12.17 - -using System; -using Xtensive.Comparison; - -namespace Xtensive.Orm.Tests.Core.Comparison -{ - public class Wrapper - { - public T Value; - - public Wrapper(T value) - { - Value = value; - } - } - - public class Wrapper1 : Wrapper - { - public Wrapper1(T value) - : base(value) - { - } - } - - public class Wrapper2: Wrapper - { - public T2 Value2; - - public Wrapper2(T1 value, T2 value2) : base(value) - { - Value2 = value2; - } - } - - public class Wrapper2a: Wrapper - { - public T2 Value2; - - public Wrapper2a(T1 value, T2 value2) : base(value) - { - Value2 = value2; - } - } - - public class WrapperComparer: WrappingComparer, T> - { - protected override IAdvancedComparer> CreateNew(ComparisonRules rules) - { - return new WrapperComparer(Provider, ComparisonRules.Combine(rules)); - } - - public override int Compare(Wrapper x, Wrapper y) - { - return BaseComparer.Compare(x.Value, y.Value); - } - - public override bool Equals(Wrapper x, Wrapper y) - { - return BaseComparer.Equals(x.Value, y.Value); - } - - public override int GetHashCode(Wrapper obj) - { - return BaseComparer.GetHashCode(obj.Value); - } - - public WrapperComparer(IComparerProvider provider, ComparisonRules comparisonRules) - : base(provider, comparisonRules) - { - } - } - - public class Wrapper1Comparer: WrappingComparer, T> - { - protected override IAdvancedComparer> CreateNew(ComparisonRules rules) - { - return new Wrapper1Comparer(Provider, ComparisonRules.Combine(rules)); - } - - public override int Compare(Wrapper1 x, Wrapper1 y) - { - return BaseComparer.Compare(x.Value, y.Value); - } - - public override bool Equals(Wrapper1 x, Wrapper1 y) - { - return BaseComparer.Equals(x.Value, y.Value); - } - - public override int GetHashCode(Wrapper1 obj) - { - return BaseComparer.GetHashCode(obj.Value); - } - - public Wrapper1Comparer(IComparerProvider provider, ComparisonRules comparisonRules) - : base(provider, comparisonRules) - { - } - } - - public class Wrapper2Comparer: WrappingComparer, T1, T2> - { - protected override IAdvancedComparer> CreateNew(ComparisonRules rules) - { - return new Wrapper2Comparer(Provider, ComparisonRules.Combine(rules)); - } - - public override int Compare(Wrapper2 x, Wrapper2 y) - { - int r = BaseComparer1.Compare(x.Value, y.Value); - if (r==0) - r = BaseComparer2.Compare(x.Value2, y.Value2); - return r; - } - - public override bool Equals(Wrapper2 x, Wrapper2 y) - { - bool r = BaseComparer1.Equals(x.Value, y.Value); - if (r) - r = BaseComparer2.Equals(x.Value2, y.Value2); - return r; - } - - public override int GetHashCode(Wrapper2 obj) - { - int r = BaseComparer1.GetHashCode(obj.Value); - return r ^ BaseComparer2.GetHashCode(obj.Value2); - } - - public Wrapper2Comparer(IComparerProvider provider, ComparisonRules comparisonRules) - : base(provider, comparisonRules) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.12.17 + +using System; +using Xtensive.Comparison; + +namespace Xtensive.Orm.Tests.Core.Comparison +{ + public class Wrapper + { + public T Value; + + public Wrapper(T value) + { + Value = value; + } + } + + public class Wrapper1 : Wrapper + { + public Wrapper1(T value) + : base(value) + { + } + } + + public class Wrapper2: Wrapper + { + public T2 Value2; + + public Wrapper2(T1 value, T2 value2) : base(value) + { + Value2 = value2; + } + } + + public class Wrapper2a: Wrapper + { + public T2 Value2; + + public Wrapper2a(T1 value, T2 value2) : base(value) + { + Value2 = value2; + } + } + + public class WrapperComparer: WrappingComparer, T> + { + protected override IAdvancedComparer> CreateNew(ComparisonRules rules) + { + return new WrapperComparer(Provider, ComparisonRules.Combine(rules)); + } + + public override int Compare(Wrapper x, Wrapper y) + { + return BaseComparer.Compare(x.Value, y.Value); + } + + public override bool Equals(Wrapper x, Wrapper y) + { + return BaseComparer.Equals(x.Value, y.Value); + } + + public override int GetHashCode(Wrapper obj) + { + return BaseComparer.GetHashCode(obj.Value); + } + + public WrapperComparer(IComparerProvider provider, ComparisonRules comparisonRules) + : base(provider, comparisonRules) + { + } + } + + public class Wrapper1Comparer: WrappingComparer, T> + { + protected override IAdvancedComparer> CreateNew(ComparisonRules rules) + { + return new Wrapper1Comparer(Provider, ComparisonRules.Combine(rules)); + } + + public override int Compare(Wrapper1 x, Wrapper1 y) + { + return BaseComparer.Compare(x.Value, y.Value); + } + + public override bool Equals(Wrapper1 x, Wrapper1 y) + { + return BaseComparer.Equals(x.Value, y.Value); + } + + public override int GetHashCode(Wrapper1 obj) + { + return BaseComparer.GetHashCode(obj.Value); + } + + public Wrapper1Comparer(IComparerProvider provider, ComparisonRules comparisonRules) + : base(provider, comparisonRules) + { + } + } + + public class Wrapper2Comparer: WrappingComparer, T1, T2> + { + protected override IAdvancedComparer> CreateNew(ComparisonRules rules) + { + return new Wrapper2Comparer(Provider, ComparisonRules.Combine(rules)); + } + + public override int Compare(Wrapper2 x, Wrapper2 y) + { + int r = BaseComparer1.Compare(x.Value, y.Value); + if (r==0) + r = BaseComparer2.Compare(x.Value2, y.Value2); + return r; + } + + public override bool Equals(Wrapper2 x, Wrapper2 y) + { + bool r = BaseComparer1.Equals(x.Value, y.Value); + if (r) + r = BaseComparer2.Equals(x.Value2, y.Value2); + return r; + } + + public override int GetHashCode(Wrapper2 obj) + { + int r = BaseComparer1.GetHashCode(obj.Value); + return r ^ BaseComparer2.GetHashCode(obj.Value2); + } + + public Wrapper2Comparer(IComparerProvider provider, ComparisonRules comparisonRules) + : base(provider, comparisonRules) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTests.cs b/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTests.cs index df8a705f4d..eb6cdf95ba 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Comparison/ComparerProviderTests.cs @@ -1,355 +1,355 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.12.17 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Comparison -{ - [TestFixture] - public class ComparerProviderTests - { - [Test] - public void PairComparerTest() - { - Assert.IsNotNull(AdvancedComparer>.System); - Assert.IsNotNull(AdvancedComparer>.Default); - } - - [Test] - public void SerializationTest() - { - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer.Compare); - var deserializedComparer = Cloner.Clone(comparer); - Assert.IsNotNull(deserializedComparer.Compare); - } - - [Test] - [Explicit] - [Category("Performance")] - public void GettingDefaultComparerPerformanceTest() - { - GettingDefaultComparerLoop(100); - int count = 1000000; - using (new Measurement("Getting default comparer", count)) { - GettingDefaultComparerLoop(count); - } - } - - private static void GettingDefaultComparerLoop(int count) - { - for (int i = 0; i < count; i++) { - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - ComparerProvider.Default.GetComparer(); - } - } - - - private class TestClass - { - private string x; - private int y; - } - - - [Test] - public void ClassTest() - { - AdvancedComparerStruct dd = AdvancedComparerStruct.System; - } - - [Test] - public void Int32ComparerTest() - { - int o1 = 1; - int o2 = 2; - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer); - Assert.AreEqual("Int32Comparer", comparer.Implementation.GetType().Name); - Assert.Greater(comparer.Compare(o2,o1), 0); - Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); - Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); - Assert.AreEqual(int.MinValue, comparer.ValueRangeInfo.MinValue); - Assert.AreEqual(int.MaxValue, comparer.ValueRangeInfo.MaxValue); - Assert.AreEqual(1, comparer.ValueRangeInfo.DeltaValue); - Assert.AreEqual(1, comparer.GetNearestValue(0, Direction.Positive)); - Assert.AreEqual(0, comparer.GetNearestValue(1, Direction.Negative)); - } - - [Test] - public void StringComparerTest() - { - string o1 = "1"; - string o2 = "2"; - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer); - Assert.AreEqual("StringComparer", comparer.Implementation.GetType().Name); - Assert.Greater(comparer.Compare(o2,o1), 0); - Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); - Assert.IsFalse(comparer.ValueRangeInfo.HasMaxValue); - Assert.AreEqual(null, comparer.ValueRangeInfo.MinValue); - AssertEx.ThrowsInvalidOperationException(delegate {string s = comparer.ValueRangeInfo.MaxValue;}); - - char z = char.MaxValue; - char y = unchecked ((char) (char.MaxValue - 1)); - char a = char.MinValue; - - string str = "BCD"; - str = comparer.GetNearestValue(str, Direction.Negative); - Assert.AreEqual("BCC" + z, str); - str = comparer.GetNearestValue(str, Direction.Negative); - Assert.AreEqual("BCC" + y + z, str); - str = comparer.GetNearestValue(str, Direction.Negative); - Assert.AreEqual("BCC" + y + y + z, str); - str = comparer.GetNearestValue(str, Direction.Positive); - Assert.AreEqual("BCC" + y + z, str); - str = comparer.GetNearestValue(str, Direction.Positive); - Assert.AreEqual("BCC" + z, str); - str = comparer.GetNearestValue(str, Direction.Positive); - Assert.AreEqual("BCD", str); - str = comparer.GetNearestValue(str, Direction.Positive); - Assert.AreEqual("BCD" + a, str); - str = comparer.GetNearestValue(str, Direction.Positive); - Assert.AreEqual("BCD" + a + a, str); - str = comparer.GetNearestValue(str, Direction.Negative); - Assert.AreEqual("BCD" + a, str); - str = comparer.GetNearestValue(str, Direction.Negative); - Assert.AreEqual("BCD", str); - Assert.IsNull(comparer.GetNearestValue(null, Direction.Negative)); - Assert.IsNull(comparer.GetNearestValue(string.Empty, Direction.Negative)); - Assert.AreEqual(string.Empty, comparer.GetNearestValue(null, Direction.Positive)); - Assert.AreEqual(char.MaxValue.ToString(), comparer.GetNearestValue(char.MaxValue.ToString(), Direction.Positive)); - AssertEx.Throws(delegate { comparer.GetNearestValue(str, Direction.None); }); - } - -// [Test] -// public void EntireComparerTest() -// { -// AdvancedComparer> comparer = AdvancedComparer>.Default; -// Assert.IsNotNull(comparer); -// Assert.AreEqual("EntireComparer`1", comparer.Implementation.GetType().Name); -// Assert.AreEqual(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(InfinityType.Positive)), 0); -// Assert.AreEqual(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(InfinityType.Negative)), 0); -// Assert.Greater(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(InfinityType.Negative)), 0); -// Assert.Greater(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(100)), 0); -// Assert.Less(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(InfinityType.Positive)), 0); -// Assert.Less(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(100)), 0); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); -// Assert.AreEqual(Entire.MinValue, comparer.ValueRangeInfo.MinValue); -// Assert.AreEqual(Entire.MaxValue, comparer.ValueRangeInfo.MaxValue); -// Assert.AreEqual(Entire.Create(1), comparer.ValueRangeInfo.DeltaValue); -// } - -// [Test] -// public void EntireInterfaceComparerTest() -// { -// AdvancedComparer> comparer = AdvancedComparer>.Default; -// Assert.IsNotNull(comparer); -// Assert.AreEqual("EntireInterfaceComparer`1", comparer.Implementation.GetType().Name); -// Assert.AreEqual(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(InfinityType.Positive)), 0); -// Assert.AreEqual(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(InfinityType.Negative)), 0); -// Assert.Greater(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(InfinityType.Negative)), 0); -// Assert.Greater(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(100)), 0); -// Assert.Less(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(InfinityType.Positive)), 0); -// Assert.Less(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(100)), 0); -// Assert.AreNotEqual(comparer.Compare(new Entire(1, Direction.Positive), new Entire(2)), 0); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); -// Assert.AreEqual(Entire.MinValue, comparer.ValueRangeInfo.MinValue); -// Assert.AreEqual(Entire.MaxValue, comparer.ValueRangeInfo.MaxValue); -// Assert.AreEqual(Entire.Create(1), comparer.ValueRangeInfo.DeltaValue); -// } - -// [Test] -// public void ReversedComparerTest() -// { -// { -// AdvancedComparer> comparer = AdvancedComparer>.Default; -// Assert.IsNotNull(comparer); -// Assert.AreEqual("ReversedComparer`1", comparer.Implementation.GetType().Name); -// Assert.Less(comparer.Compare(10, 1), 0); -// Assert.Greater(comparer.Compare(1, 10), 0); -// Assert.AreEqual(comparer.Compare(10, 10), 0); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); -// Assert.AreEqual(new Reversed(int.MaxValue), new Reversed(int.MaxValue)); -// Assert.AreEqual(new Reversed(int.MaxValue), comparer.ValueRangeInfo.MinValue); -// Assert.AreEqual(new Reversed(int.MinValue), comparer.ValueRangeInfo.MaxValue); -// Assert.AreEqual(new Reversed(1), comparer.ValueRangeInfo.DeltaValue); -// } -// -// { -// AdvancedComparer> comparer = AdvancedComparer>.Default; -// Assert.IsNotNull(comparer); -// Assert.AreEqual("ReversedComparer`1", comparer.Implementation.GetType().Name); -// Assert.Less(comparer.Compare(10, 1), 0); -// Assert.Greater(comparer.Compare(1, 10), 0); -// Assert.AreEqual(comparer.Compare(10, 10), 0); -// Assert.Greater(comparer.Compare(1, 10), 0); -// Assert.Less(comparer.Compare(10, 1), 0); -// Assert.AreEqual(comparer.Compare(10, 10), 0); -// Assert.Greater(comparer.Compare(null, 10), 0); -// Assert.AreEqual(comparer.Compare(null, null), 0); -// Assert.Less(comparer.Compare(10, null), 0); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); -// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); -// Assert.AreEqual(new Reversed(int.MaxValue), comparer.ValueRangeInfo.MinValue); -// Assert.AreEqual(new Reversed(), comparer.ValueRangeInfo.MaxValue); -// Assert.AreEqual(new Reversed(1), comparer.ValueRangeInfo.DeltaValue); -// } -// } - - [Test] - public void NullableComparerTest() - { - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer); - Assert.AreEqual("NullableComparer`1", comparer.Implementation.GetType().Name); - Assert.Greater(comparer.Compare(10, 1), 0); - Assert.Less(comparer.Compare(1, 10), 0); - Assert.AreEqual(comparer.Compare(10, 10), 0); - Assert.Less(comparer.Compare(1, 10), 0); - Assert.Greater(comparer.Compare(10, 1), 0); - Assert.AreEqual(comparer.Compare(10, 10), 0); - Assert.Less(comparer.Compare(null, 10), 0); - Assert.AreEqual(comparer.Compare(null, null), 0); - Assert.Greater(comparer.Compare(10, null), 0); - Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); - Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); - Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); - Assert.AreEqual(null, comparer.ValueRangeInfo.MinValue); - Assert.AreEqual(int.MaxValue, comparer.ValueRangeInfo.MaxValue); - Assert.AreEqual(1, comparer.ValueRangeInfo.DeltaValue); - } - - [Test] - public void EnumComparerTest() - { - AdvancedComparer comparer = AdvancedComparer.System; - Assert.IsNotNull(comparer); - Assert.AreEqual("EnumComparer`2", comparer.Implementation.GetType().Name); - Assert.Greater(comparer.Compare(Direction.Positive, Direction.Negative), 0); - Assert.Greater(comparer.Compare(Direction.Positive, Direction.None), 0); - Assert.Less(comparer.Compare(Direction.Negative, Direction.Positive), 0); - Assert.Less(comparer.Compare(Direction.Negative, Direction.None), 0); - Assert.AreEqual(comparer.Compare(Direction.Positive, Direction.Positive), 0); - Assert.AreEqual(comparer.Compare(Direction.None, Direction.None), 0); - Assert.AreEqual(comparer.Compare(Direction.Negative, Direction.Negative), 0); - - Assert.IsTrue(comparer.Equals(comparer.ValueRangeInfo.MaxValue, Direction.Positive)); - Assert.IsTrue(comparer.Equals(comparer.ValueRangeInfo.MinValue, Direction.Negative)); - Assert.IsFalse(comparer.Equals(Direction.Positive, Direction.Negative)); - - Assert.AreEqual(comparer.GetNearestValue(Direction.Negative, Direction.Negative), Direction.Negative); - Assert.AreEqual(comparer.GetNearestValue(Direction.Negative, Direction.Positive), Direction.None); - Assert.AreEqual(comparer.GetNearestValue(Direction.Positive, Direction.Negative), Direction.None); - Assert.AreEqual(comparer.GetNearestValue(Direction.Positive, Direction.Positive), Direction.Positive); - Assert.AreEqual(comparer.GetNearestValue(Direction.None, Direction.Negative), Direction.Negative); - Assert.AreEqual(comparer.GetNearestValue(Direction.None, Direction.Positive), Direction.Positive); - Assert.IsFalse(comparer.ValueRangeInfo.HasDeltaValue); - } - - [Test] - public void CustomComparerTest() - { - Wrapper o1 = new Wrapper(1); - Wrapper o2 = new Wrapper(2); - AdvancedComparer> comparer = AdvancedComparer>.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "WrapperComparer*"); - Assert.Greater(comparer.Compare(o2,o1), 0); - } - - [Test] - public void CustomComparerTest2() - { - Wrapper2 o1 = new Wrapper2(0,1); - Wrapper2 o2 = new Wrapper2(0,2); - AdvancedComparer> comparer = AdvancedComparer>.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "Wrapper2Comparer*"); - Assert.Greater(comparer.Compare(o2,o1), 0); - } - - [Test] - public void InheritedComparerTest() - { - Wrapper2a o1 = new Wrapper2a(0,1); - Wrapper2a o2 = new Wrapper2a(0,2); - AdvancedComparer> comparer = AdvancedComparer>.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "BaseComparerWrapper*"); - Assert.AreEqual(comparer.Compare(o2,o1), 0); - } - - [Test] - public void CastingComparerTest() - { - Wrapper1 o1 = new Wrapper1(1); - Wrapper1 o2 = new Wrapper1(2); - AdvancedComparer> comparer = AdvancedComparer>.Default.Cast>(); - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "CastingComparer*"); - Assert.Greater(comparer.Compare(o2,o1), 0); - } - -// [Test] -// public void TupleEntireComparerTest() -// { -// List fields = new List(3); -// fields.AddRange(new Type[] {typeof(int), typeof(bool), typeof(string)}); -// TupleDescriptor tupleDescriptor = TupleDescriptor.Create(fields); -// Tuple tuple = Tuple.Create(tupleDescriptor); -// tuple.SetValue(0, 1); -// tuple.SetValue(1, true); -// tuple.SetValue(2, "TupleEntire"); -// IEntire entire1 = Entire.Create(tuple); -// IEntire entire2 = Entire.Create(tuple); -// AdvancedComparer> comparer = AdvancedComparer>.Default; -// AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "EntireInterfaceComparer*"); -// -//// entire2.Shift(1); -//// Assert.IsFalse(c.Equals(entire1, entire2)); -//// Assert.AreEqual(-1, c.Compare(entire1, entire2)); -//// -//// entire1.Shift(); -//// Assert.IsFalse(c.Equals(entire1, entire2)); -//// Assert.AreEqual(1, c.Compare(entire1, entire2)); -//// -//// entire2.Shift(); -//// Assert.IsTrue(c.Equals(entire1, entire2)); -//// Assert.AreEqual(0, c.Compare(entire1, entire2)); -// } - - int ToReflect1(Direction d) - { - return (int) d; - } - - Direction ToReflect2(int i) - { - return (Direction) i; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.12.17 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Comparison +{ + [TestFixture] + public class ComparerProviderTests + { + [Test] + public void PairComparerTest() + { + Assert.IsNotNull(AdvancedComparer>.System); + Assert.IsNotNull(AdvancedComparer>.Default); + } + + [Test] + public void SerializationTest() + { + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer.Compare); + var deserializedComparer = Cloner.Clone(comparer); + Assert.IsNotNull(deserializedComparer.Compare); + } + + [Test] + [Explicit] + [Category("Performance")] + public void GettingDefaultComparerPerformanceTest() + { + GettingDefaultComparerLoop(100); + int count = 1000000; + using (new Measurement("Getting default comparer", count)) { + GettingDefaultComparerLoop(count); + } + } + + private static void GettingDefaultComparerLoop(int count) + { + for (int i = 0; i < count; i++) { + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + ComparerProvider.Default.GetComparer(); + } + } + + + private class TestClass + { + private string x; + private int y; + } + + + [Test] + public void ClassTest() + { + AdvancedComparerStruct dd = AdvancedComparerStruct.System; + } + + [Test] + public void Int32ComparerTest() + { + int o1 = 1; + int o2 = 2; + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer); + Assert.AreEqual("Int32Comparer", comparer.Implementation.GetType().Name); + Assert.Greater(comparer.Compare(o2,o1), 0); + Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); + Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); + Assert.AreEqual(int.MinValue, comparer.ValueRangeInfo.MinValue); + Assert.AreEqual(int.MaxValue, comparer.ValueRangeInfo.MaxValue); + Assert.AreEqual(1, comparer.ValueRangeInfo.DeltaValue); + Assert.AreEqual(1, comparer.GetNearestValue(0, Direction.Positive)); + Assert.AreEqual(0, comparer.GetNearestValue(1, Direction.Negative)); + } + + [Test] + public void StringComparerTest() + { + string o1 = "1"; + string o2 = "2"; + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer); + Assert.AreEqual("StringComparer", comparer.Implementation.GetType().Name); + Assert.Greater(comparer.Compare(o2,o1), 0); + Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); + Assert.IsFalse(comparer.ValueRangeInfo.HasMaxValue); + Assert.AreEqual(null, comparer.ValueRangeInfo.MinValue); + AssertEx.ThrowsInvalidOperationException(delegate {string s = comparer.ValueRangeInfo.MaxValue;}); + + char z = char.MaxValue; + char y = unchecked ((char) (char.MaxValue - 1)); + char a = char.MinValue; + + string str = "BCD"; + str = comparer.GetNearestValue(str, Direction.Negative); + Assert.AreEqual("BCC" + z, str); + str = comparer.GetNearestValue(str, Direction.Negative); + Assert.AreEqual("BCC" + y + z, str); + str = comparer.GetNearestValue(str, Direction.Negative); + Assert.AreEqual("BCC" + y + y + z, str); + str = comparer.GetNearestValue(str, Direction.Positive); + Assert.AreEqual("BCC" + y + z, str); + str = comparer.GetNearestValue(str, Direction.Positive); + Assert.AreEqual("BCC" + z, str); + str = comparer.GetNearestValue(str, Direction.Positive); + Assert.AreEqual("BCD", str); + str = comparer.GetNearestValue(str, Direction.Positive); + Assert.AreEqual("BCD" + a, str); + str = comparer.GetNearestValue(str, Direction.Positive); + Assert.AreEqual("BCD" + a + a, str); + str = comparer.GetNearestValue(str, Direction.Negative); + Assert.AreEqual("BCD" + a, str); + str = comparer.GetNearestValue(str, Direction.Negative); + Assert.AreEqual("BCD", str); + Assert.IsNull(comparer.GetNearestValue(null, Direction.Negative)); + Assert.IsNull(comparer.GetNearestValue(string.Empty, Direction.Negative)); + Assert.AreEqual(string.Empty, comparer.GetNearestValue(null, Direction.Positive)); + Assert.AreEqual(char.MaxValue.ToString(), comparer.GetNearestValue(char.MaxValue.ToString(), Direction.Positive)); + AssertEx.Throws(delegate { comparer.GetNearestValue(str, Direction.None); }); + } + +// [Test] +// public void EntireComparerTest() +// { +// AdvancedComparer> comparer = AdvancedComparer>.Default; +// Assert.IsNotNull(comparer); +// Assert.AreEqual("EntireComparer`1", comparer.Implementation.GetType().Name); +// Assert.AreEqual(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(InfinityType.Positive)), 0); +// Assert.AreEqual(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(InfinityType.Negative)), 0); +// Assert.Greater(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(InfinityType.Negative)), 0); +// Assert.Greater(comparer.Compare((Entire)Entire.Create(InfinityType.Positive), (Entire)Entire.Create(100)), 0); +// Assert.Less(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(InfinityType.Positive)), 0); +// Assert.Less(comparer.Compare((Entire)Entire.Create(InfinityType.Negative), (Entire)Entire.Create(100)), 0); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); +// Assert.AreEqual(Entire.MinValue, comparer.ValueRangeInfo.MinValue); +// Assert.AreEqual(Entire.MaxValue, comparer.ValueRangeInfo.MaxValue); +// Assert.AreEqual(Entire.Create(1), comparer.ValueRangeInfo.DeltaValue); +// } + +// [Test] +// public void EntireInterfaceComparerTest() +// { +// AdvancedComparer> comparer = AdvancedComparer>.Default; +// Assert.IsNotNull(comparer); +// Assert.AreEqual("EntireInterfaceComparer`1", comparer.Implementation.GetType().Name); +// Assert.AreEqual(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(InfinityType.Positive)), 0); +// Assert.AreEqual(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(InfinityType.Negative)), 0); +// Assert.Greater(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(InfinityType.Negative)), 0); +// Assert.Greater(comparer.Compare(Entire.Create(InfinityType.Positive), Entire.Create(100)), 0); +// Assert.Less(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(InfinityType.Positive)), 0); +// Assert.Less(comparer.Compare(Entire.Create(InfinityType.Negative), Entire.Create(100)), 0); +// Assert.AreNotEqual(comparer.Compare(new Entire(1, Direction.Positive), new Entire(2)), 0); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); +// Assert.AreEqual(Entire.MinValue, comparer.ValueRangeInfo.MinValue); +// Assert.AreEqual(Entire.MaxValue, comparer.ValueRangeInfo.MaxValue); +// Assert.AreEqual(Entire.Create(1), comparer.ValueRangeInfo.DeltaValue); +// } + +// [Test] +// public void ReversedComparerTest() +// { +// { +// AdvancedComparer> comparer = AdvancedComparer>.Default; +// Assert.IsNotNull(comparer); +// Assert.AreEqual("ReversedComparer`1", comparer.Implementation.GetType().Name); +// Assert.Less(comparer.Compare(10, 1), 0); +// Assert.Greater(comparer.Compare(1, 10), 0); +// Assert.AreEqual(comparer.Compare(10, 10), 0); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); +// Assert.AreEqual(new Reversed(int.MaxValue), new Reversed(int.MaxValue)); +// Assert.AreEqual(new Reversed(int.MaxValue), comparer.ValueRangeInfo.MinValue); +// Assert.AreEqual(new Reversed(int.MinValue), comparer.ValueRangeInfo.MaxValue); +// Assert.AreEqual(new Reversed(1), comparer.ValueRangeInfo.DeltaValue); +// } +// +// { +// AdvancedComparer> comparer = AdvancedComparer>.Default; +// Assert.IsNotNull(comparer); +// Assert.AreEqual("ReversedComparer`1", comparer.Implementation.GetType().Name); +// Assert.Less(comparer.Compare(10, 1), 0); +// Assert.Greater(comparer.Compare(1, 10), 0); +// Assert.AreEqual(comparer.Compare(10, 10), 0); +// Assert.Greater(comparer.Compare(1, 10), 0); +// Assert.Less(comparer.Compare(10, 1), 0); +// Assert.AreEqual(comparer.Compare(10, 10), 0); +// Assert.Greater(comparer.Compare(null, 10), 0); +// Assert.AreEqual(comparer.Compare(null, null), 0); +// Assert.Less(comparer.Compare(10, null), 0); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); +// Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); +// Assert.AreEqual(new Reversed(int.MaxValue), comparer.ValueRangeInfo.MinValue); +// Assert.AreEqual(new Reversed(), comparer.ValueRangeInfo.MaxValue); +// Assert.AreEqual(new Reversed(1), comparer.ValueRangeInfo.DeltaValue); +// } +// } + + [Test] + public void NullableComparerTest() + { + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer); + Assert.AreEqual("NullableComparer`1", comparer.Implementation.GetType().Name); + Assert.Greater(comparer.Compare(10, 1), 0); + Assert.Less(comparer.Compare(1, 10), 0); + Assert.AreEqual(comparer.Compare(10, 10), 0); + Assert.Less(comparer.Compare(1, 10), 0); + Assert.Greater(comparer.Compare(10, 1), 0); + Assert.AreEqual(comparer.Compare(10, 10), 0); + Assert.Less(comparer.Compare(null, 10), 0); + Assert.AreEqual(comparer.Compare(null, null), 0); + Assert.Greater(comparer.Compare(10, null), 0); + Assert.IsTrue(comparer.ValueRangeInfo.HasMinValue); + Assert.IsTrue(comparer.ValueRangeInfo.HasMaxValue); + Assert.IsTrue(comparer.ValueRangeInfo.HasDeltaValue); + Assert.AreEqual(null, comparer.ValueRangeInfo.MinValue); + Assert.AreEqual(int.MaxValue, comparer.ValueRangeInfo.MaxValue); + Assert.AreEqual(1, comparer.ValueRangeInfo.DeltaValue); + } + + [Test] + public void EnumComparerTest() + { + AdvancedComparer comparer = AdvancedComparer.System; + Assert.IsNotNull(comparer); + Assert.AreEqual("EnumComparer`2", comparer.Implementation.GetType().Name); + Assert.Greater(comparer.Compare(Direction.Positive, Direction.Negative), 0); + Assert.Greater(comparer.Compare(Direction.Positive, Direction.None), 0); + Assert.Less(comparer.Compare(Direction.Negative, Direction.Positive), 0); + Assert.Less(comparer.Compare(Direction.Negative, Direction.None), 0); + Assert.AreEqual(comparer.Compare(Direction.Positive, Direction.Positive), 0); + Assert.AreEqual(comparer.Compare(Direction.None, Direction.None), 0); + Assert.AreEqual(comparer.Compare(Direction.Negative, Direction.Negative), 0); + + Assert.IsTrue(comparer.Equals(comparer.ValueRangeInfo.MaxValue, Direction.Positive)); + Assert.IsTrue(comparer.Equals(comparer.ValueRangeInfo.MinValue, Direction.Negative)); + Assert.IsFalse(comparer.Equals(Direction.Positive, Direction.Negative)); + + Assert.AreEqual(comparer.GetNearestValue(Direction.Negative, Direction.Negative), Direction.Negative); + Assert.AreEqual(comparer.GetNearestValue(Direction.Negative, Direction.Positive), Direction.None); + Assert.AreEqual(comparer.GetNearestValue(Direction.Positive, Direction.Negative), Direction.None); + Assert.AreEqual(comparer.GetNearestValue(Direction.Positive, Direction.Positive), Direction.Positive); + Assert.AreEqual(comparer.GetNearestValue(Direction.None, Direction.Negative), Direction.Negative); + Assert.AreEqual(comparer.GetNearestValue(Direction.None, Direction.Positive), Direction.Positive); + Assert.IsFalse(comparer.ValueRangeInfo.HasDeltaValue); + } + + [Test] + public void CustomComparerTest() + { + Wrapper o1 = new Wrapper(1); + Wrapper o2 = new Wrapper(2); + AdvancedComparer> comparer = AdvancedComparer>.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "WrapperComparer*"); + Assert.Greater(comparer.Compare(o2,o1), 0); + } + + [Test] + public void CustomComparerTest2() + { + Wrapper2 o1 = new Wrapper2(0,1); + Wrapper2 o2 = new Wrapper2(0,2); + AdvancedComparer> comparer = AdvancedComparer>.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "Wrapper2Comparer*"); + Assert.Greater(comparer.Compare(o2,o1), 0); + } + + [Test] + public void InheritedComparerTest() + { + Wrapper2a o1 = new Wrapper2a(0,1); + Wrapper2a o2 = new Wrapper2a(0,2); + AdvancedComparer> comparer = AdvancedComparer>.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "BaseComparerWrapper*"); + Assert.AreEqual(comparer.Compare(o2,o1), 0); + } + + [Test] + public void CastingComparerTest() + { + Wrapper1 o1 = new Wrapper1(1); + Wrapper1 o2 = new Wrapper1(2); + AdvancedComparer> comparer = AdvancedComparer>.Default.Cast>(); + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "CastingComparer*"); + Assert.Greater(comparer.Compare(o2,o1), 0); + } + +// [Test] +// public void TupleEntireComparerTest() +// { +// List fields = new List(3); +// fields.AddRange(new Type[] {typeof(int), typeof(bool), typeof(string)}); +// TupleDescriptor tupleDescriptor = TupleDescriptor.Create(fields); +// Tuple tuple = Tuple.Create(tupleDescriptor); +// tuple.SetValue(0, 1); +// tuple.SetValue(1, true); +// tuple.SetValue(2, "TupleEntire"); +// IEntire entire1 = Entire.Create(tuple); +// IEntire entire2 = Entire.Create(tuple); +// AdvancedComparer> comparer = AdvancedComparer>.Default; +// AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "EntireInterfaceComparer*"); +// +//// entire2.Shift(1); +//// Assert.IsFalse(c.Equals(entire1, entire2)); +//// Assert.AreEqual(-1, c.Compare(entire1, entire2)); +//// +//// entire1.Shift(); +//// Assert.IsFalse(c.Equals(entire1, entire2)); +//// Assert.AreEqual(1, c.Compare(entire1, entire2)); +//// +//// entire2.Shift(); +//// Assert.IsTrue(c.Equals(entire1, entire2)); +//// Assert.AreEqual(0, c.Compare(entire1, entire2)); +// } + + int ToReflect1(Direction d) + { + return (int) d; + } + + Direction ToReflect2(int i) + { + return (Direction) i; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Comparison/EqualityComparerProviderTests.cs b/Orm/Xtensive.Orm.Tests.Core/Comparison/EqualityComparerProviderTests.cs index 51a49df911..c4c7f8b373 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Comparison/EqualityComparerProviderTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Comparison/EqualityComparerProviderTests.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.12.17 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Comparison -{ - [TestFixture] - public class EqualityComparerProviderTests - { - [Test] - public void Int32ComparerTest() - { - int o1 = 1; - int o2 = 2; - Func hash = delegate(int item) { return item.GetHashCode(); }; - long a = hash(o2); - Func hash1 = delegate(long item) { return item.GetHashCode(); }; - long a1 = hash1(o2); - - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "Int32Comparer*"); - Assert.IsFalse(comparer.Equals(o2,o1)); - Assert.IsFalse(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); - Assert.IsTrue(comparer.Equals(1,o1)); - Assert.IsTrue(comparer.Equals(2,o2)); - } - - [Test] - public void StringComparerTest() - { - string o1 = "1"; - string o2 = "2"; - AdvancedComparer comparer = AdvancedComparer.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "StringComparer*"); - Assert.IsFalse(comparer.Equals(o2,o1)); - Assert.IsFalse(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); - Assert.IsTrue(comparer.Equals("1",o1)); - Assert.IsTrue(comparer.Equals("2",o2)); - } - - [Test] - public void InheritedComparerTest() - { - Wrapper2a o1 = new Wrapper2a(0,1); - Wrapper2a o2 = new Wrapper2a(0,2); - AdvancedComparer> comparer = AdvancedComparer>.Default; - Assert.IsNotNull(comparer); - AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "BaseComparerWrapper*"); - Assert.IsTrue(comparer.Equals(o2,o1)); - Assert.IsTrue(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); - } - - [Test] - public void GetCashCodeInvocationTest() - { - int i = 5; - object o = i; - Assert.AreEqual(GetHashCodeInvocationOnStruct(i), GetHashCodeInvocationOnObject(o)); - } - - - private static int GetHashCodeInvocationOnStruct(int i) - { - return i.GetHashCode(); - } - - private static int GetHashCodeInvocationOnObject(object o) - { - return o.GetHashCode(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.12.17 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Comparison +{ + [TestFixture] + public class EqualityComparerProviderTests + { + [Test] + public void Int32ComparerTest() + { + int o1 = 1; + int o2 = 2; + Func hash = delegate(int item) { return item.GetHashCode(); }; + long a = hash(o2); + Func hash1 = delegate(long item) { return item.GetHashCode(); }; + long a1 = hash1(o2); + + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "Int32Comparer*"); + Assert.IsFalse(comparer.Equals(o2,o1)); + Assert.IsFalse(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); + Assert.IsTrue(comparer.Equals(1,o1)); + Assert.IsTrue(comparer.Equals(2,o2)); + } + + [Test] + public void StringComparerTest() + { + string o1 = "1"; + string o2 = "2"; + AdvancedComparer comparer = AdvancedComparer.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "StringComparer*"); + Assert.IsFalse(comparer.Equals(o2,o1)); + Assert.IsFalse(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); + Assert.IsTrue(comparer.Equals("1",o1)); + Assert.IsTrue(comparer.Equals("2",o2)); + } + + [Test] + public void InheritedComparerTest() + { + Wrapper2a o1 = new Wrapper2a(0,1); + Wrapper2a o2 = new Wrapper2a(0,2); + AdvancedComparer> comparer = AdvancedComparer>.Default; + Assert.IsNotNull(comparer); + AssertEx.IsPatternMatch(comparer.Implementation.GetType().Name, "BaseComparerWrapper*"); + Assert.IsTrue(comparer.Equals(o2,o1)); + Assert.IsTrue(comparer.GetHashCode(o1)==comparer.GetHashCode(o2)); + } + + [Test] + public void GetCashCodeInvocationTest() + { + int i = 5; + object o = i; + Assert.AreEqual(GetHashCodeInvocationOnStruct(i), GetHashCodeInvocationOnObject(o)); + } + + + private static int GetHashCodeInvocationOnStruct(int i) + { + return i.GetHashCode(); + } + + private static int GetHashCodeInvocationOnObject(object o) + { + return o.GetHashCode(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Comparison/StringComparisonTest.cs b/Orm/Xtensive.Orm.Tests.Core/Comparison/StringComparisonTest.cs index 81692926aa..49efd88077 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Comparison/StringComparisonTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Comparison/StringComparisonTest.cs @@ -1,107 +1,107 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.05.08 - -using System; -using System.Globalization; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.Comparison -{ - [TestFixture] - public class StringComparisonTest - { - [Ignore("")] - [Test] - public void StringCompare() - { - // var x = "X" + char.MaxValue + char.MaxValue; - int z = char.MaxValue; - int z1 = short.MaxValue; - int z2 = ushort.MaxValue; - string x = "X" + (char) 0xDBFF + (char) 0xDFFF; - string y = "X"; - - string a = "" + (char)0xDBFF + (char)0xDFFF + (char)0xDBFF + (char)0xDFFF; - string b = "" + (char)0xDBFF + (char)0xDFFF; - - var ordinal = string.CompareOrdinal(a, b); - var ordinal2 = CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.None); - // CultureInfo.CurrentCulture.TextInfo. - - foreach (CultureInfo cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures)) { - TestLog.Info(cultureInfo.EnglishName); - int result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.None); - Assert.Greater(result, 0); - result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.IgnoreKanaType); - Assert.Greater(result, 0); - result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.Ordinal); - Assert.Greater(result, 0); - result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.OrdinalIgnoreCase); - Assert.Greater(result, 0); - result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.StringSort); - Assert.Greater(result, 0); - } - - Func compare0 = CultureInfo.GetCultureInfo(0x7c04).CompareInfo.Compare; - Func compare1 = CultureInfo.CurrentCulture.CompareInfo.Compare; - Func compare2 = CultureInfo.InvariantCulture.CompareInfo.Compare; - Func compare3 = CultureInfo.CurrentCulture.CompareInfo.Compare; - Func compare4 = CultureInfo.CurrentCulture.CompareInfo.Compare; - Func compare5 = string.Compare; - - int actual0 = compare0(x, y); - int actual1 = compare1(x, y); - int actual2 = compare2(x, y); - int actual3 = compare3(x, y, CompareOptions.None); - int actual4 = compare4(x, y, CompareOptions.None); - int actual5 = compare3(x, y, CompareOptions.Ordinal); - int actual6 = compare4(x, y, CompareOptions.Ordinal); - int actual7 = compare5(x, y); - int i = 0; - Assert.Greater(actual0, 0); - Assert.Greater(actual1, 0); - Assert.Greater(actual2, 0); - Assert.Greater(actual3, 0); - Assert.Greater(actual4, 0); - Assert.Greater(actual5, 0); - Assert.Greater(actual6, 0); - Assert.Greater(actual7, 0); - } - - [Test] - public void PerformanceTest() - { - const int iterationCount = 10000000; - var a = "ASDFGHJK KQ WE RTYUI ZXCV BNDFGHJTY UI XCV BNDF GHJRTYVBNV BN"; - var b = "ASDFGHJK KQ WE RTYUI ZXCV BNDFGHJTY UI KJHFVB cultureCompare = CultureInfo.CurrentCulture.CompareInfo.Compare; - Func invariantCompare = CultureInfo.CurrentCulture.CompareInfo.Compare; - Func ordinalCompare = string.CompareOrdinal; - TestLog.Info("Testing performance of string comparison..."); - - using (new Measurement("string.CompareOrdinal", iterationCount)) - for (int i = 0; i < iterationCount; i++) - ordinalCompare(a, b); - - using (new Measurement("CurrentCulture Compare default", iterationCount)) - for (int i = 0; i < iterationCount; i++) - cultureCompare(a, b, CompareOptions.None); - - using (new Measurement("CurrentCulture Compare ordinal", iterationCount)) - for (int i = 0; i < iterationCount; i++) - cultureCompare(a, b, CompareOptions.Ordinal); - - using (new Measurement("InvariantCulture Compare default", iterationCount)) - for (int i = 0; i < iterationCount; i++) - invariantCompare(a, b, CompareOptions.None); - - using (new Measurement("InvariantCulture Compare ordinal", iterationCount)) - for (int i = 0; i < iterationCount; i++) - invariantCompare(a, b, CompareOptions.Ordinal); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.05.08 + +using System; +using System.Globalization; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.Comparison +{ + [TestFixture] + public class StringComparisonTest + { + [Ignore("")] + [Test] + public void StringCompare() + { + // var x = "X" + char.MaxValue + char.MaxValue; + int z = char.MaxValue; + int z1 = short.MaxValue; + int z2 = ushort.MaxValue; + string x = "X" + (char) 0xDBFF + (char) 0xDFFF; + string y = "X"; + + string a = "" + (char)0xDBFF + (char)0xDFFF + (char)0xDBFF + (char)0xDFFF; + string b = "" + (char)0xDBFF + (char)0xDFFF; + + var ordinal = string.CompareOrdinal(a, b); + var ordinal2 = CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.None); + // CultureInfo.CurrentCulture.TextInfo. + + foreach (CultureInfo cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures)) { + TestLog.Info(cultureInfo.EnglishName); + int result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.None); + Assert.Greater(result, 0); + result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.IgnoreKanaType); + Assert.Greater(result, 0); + result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.Ordinal); + Assert.Greater(result, 0); + result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.OrdinalIgnoreCase); + Assert.Greater(result, 0); + result = cultureInfo.CompareInfo.Compare(x, y, CompareOptions.StringSort); + Assert.Greater(result, 0); + } + + Func compare0 = CultureInfo.GetCultureInfo(0x7c04).CompareInfo.Compare; + Func compare1 = CultureInfo.CurrentCulture.CompareInfo.Compare; + Func compare2 = CultureInfo.InvariantCulture.CompareInfo.Compare; + Func compare3 = CultureInfo.CurrentCulture.CompareInfo.Compare; + Func compare4 = CultureInfo.CurrentCulture.CompareInfo.Compare; + Func compare5 = string.Compare; + + int actual0 = compare0(x, y); + int actual1 = compare1(x, y); + int actual2 = compare2(x, y); + int actual3 = compare3(x, y, CompareOptions.None); + int actual4 = compare4(x, y, CompareOptions.None); + int actual5 = compare3(x, y, CompareOptions.Ordinal); + int actual6 = compare4(x, y, CompareOptions.Ordinal); + int actual7 = compare5(x, y); + int i = 0; + Assert.Greater(actual0, 0); + Assert.Greater(actual1, 0); + Assert.Greater(actual2, 0); + Assert.Greater(actual3, 0); + Assert.Greater(actual4, 0); + Assert.Greater(actual5, 0); + Assert.Greater(actual6, 0); + Assert.Greater(actual7, 0); + } + + [Test] + public void PerformanceTest() + { + const int iterationCount = 10000000; + var a = "ASDFGHJK KQ WE RTYUI ZXCV BNDFGHJTY UI XCV BNDF GHJRTYVBNV BN"; + var b = "ASDFGHJK KQ WE RTYUI ZXCV BNDFGHJTY UI KJHFVB cultureCompare = CultureInfo.CurrentCulture.CompareInfo.Compare; + Func invariantCompare = CultureInfo.CurrentCulture.CompareInfo.Compare; + Func ordinalCompare = string.CompareOrdinal; + TestLog.Info("Testing performance of string comparison..."); + + using (new Measurement("string.CompareOrdinal", iterationCount)) + for (int i = 0; i < iterationCount; i++) + ordinalCompare(a, b); + + using (new Measurement("CurrentCulture Compare default", iterationCount)) + for (int i = 0; i < iterationCount; i++) + cultureCompare(a, b, CompareOptions.None); + + using (new Measurement("CurrentCulture Compare ordinal", iterationCount)) + for (int i = 0; i < iterationCount; i++) + cultureCompare(a, b, CompareOptions.Ordinal); + + using (new Measurement("InvariantCulture Compare default", iterationCount)) + for (int i = 0; i < iterationCount; i++) + invariantCompare(a, b, CompareOptions.None); + + using (new Measurement("InvariantCulture Compare ordinal", iterationCount)) + for (int i = 0; i < iterationCount; i++) + invariantCompare(a, b, CompareOptions.Ordinal); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterProviderTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterProviderTest.cs index 8da119b4e0..46c1eed6c5 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterProviderTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterProviderTest.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.21 - -using NUnit.Framework; -using Xtensive.Conversion; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class ConverterProviderTest - { - [Test] - public void ConverterTest() - { - IAdvancedConverterProvider provider = AdvancedConverterProvider.Default; - AdvancedConverter intStringAdvancedConverter = provider.GetConverter(); - Assert.AreEqual("Int32AdvancedConverter", intStringAdvancedConverter.Implementation.GetType().Name); - Assert.IsTrue(!(intStringAdvancedConverter.IsRough)); - Assert.IsFalse(intStringAdvancedConverter.IsRough); - int intValue = 1234; - string intToStringValue = intStringAdvancedConverter.Convert(intValue); - TestLog.Info("IntToString: {0} {1}", intValue, intToStringValue); - Assert.AreEqual(intValue.ToString(), intToStringValue); - } - - [Test] - public void CustomConverterTest() - { - IAdvancedConverterProvider provider = new TestConverterProvider(); - AdvancedConverter customStringToIntAdvancedConverter = provider.GetConverter(); - AdvancedConverter customIntToStringAdvancedConverter = provider.GetConverter(); - Assert.AreEqual(typeof(StringAdvancedConverter), customStringToIntAdvancedConverter.Implementation.GetType()); - Assert.AreEqual(typeof(StringAdvancedConverter), customIntToStringAdvancedConverter.Implementation.GetType()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.21 + +using NUnit.Framework; +using Xtensive.Conversion; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class ConverterProviderTest + { + [Test] + public void ConverterTest() + { + IAdvancedConverterProvider provider = AdvancedConverterProvider.Default; + AdvancedConverter intStringAdvancedConverter = provider.GetConverter(); + Assert.AreEqual("Int32AdvancedConverter", intStringAdvancedConverter.Implementation.GetType().Name); + Assert.IsTrue(!(intStringAdvancedConverter.IsRough)); + Assert.IsFalse(intStringAdvancedConverter.IsRough); + int intValue = 1234; + string intToStringValue = intStringAdvancedConverter.Convert(intValue); + TestLog.Info("IntToString: {0} {1}", intValue, intToStringValue); + Assert.AreEqual(intValue.ToString(), intToStringValue); + } + + [Test] + public void CustomConverterTest() + { + IAdvancedConverterProvider provider = new TestConverterProvider(); + AdvancedConverter customStringToIntAdvancedConverter = provider.GetConverter(); + AdvancedConverter customIntToStringAdvancedConverter = provider.GetConverter(); + Assert.AreEqual(typeof(StringAdvancedConverter), customStringToIntAdvancedConverter.Implementation.GetType()); + Assert.AreEqual(typeof(StringAdvancedConverter), customIntToStringAdvancedConverter.Implementation.GetType()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterTest.cs index 6842f66931..426fd64006 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/ConverterTest.cs @@ -1,308 +1,308 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2007.10.03 - -using System; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Conversion; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; -using MethodInfo=System.Reflection.MethodInfo; -using PropertyInfo=System.Reflection.PropertyInfo; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class ConverterTest : ConverterTestBase - { - private readonly IAdvancedConverterProvider provider = AdvancedConverterProvider.Default; - private static readonly Random random = RandomManager.CreateRandom(SeedVariatorType.CallingType); - private const int enumTestCount = 1000; - - private readonly Type[] types = new Type[] { - typeof (bool), - typeof (byte), - typeof (sbyte), - typeof (short), - typeof (ushort), - typeof (int), - typeof (uint), - typeof (long), - typeof (ulong), - typeof (float), - typeof (double), - typeof (decimal), - typeof (DateTime), - typeof (Guid), - typeof (string), - typeof (char) - }; - - public enum ByteEnum : byte - { - Value1_1, - Value1_2, - Value1_3, - } - - public enum SByteEnum : sbyte - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum IntEnum : int - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum UIntEnum : uint - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum ShortEnum : short - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum UShortEnum : ushort - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum LongEnum : long - { - Value2_1, - Value2_2, - Value2_3, - } - - public enum ULongEnum : ulong - { - Value2_1, - Value2_2, - Value2_3, - } - - [Test] - [Explicit] - [Category("Debug")] - public void DelegateTest() - { - Converter converter = DelegateHelper.CreatePrimitiveCastDelegate(); - converter(ByteEnum.Value1_1); - } - - [Test] - public void EnumTest() - { - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - } - - private void EnumTestInternal() - { - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - EnumTestInternal(); - } - - private void EnumTestInternal() - { - AdvancedConverter advancedConverter = AdvancedConverter.Default; - AdvancedConverter backwardAdvancedConverter = AdvancedConverter.Default; - IInstanceGenerator instanceGenerator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Assert.IsNotNull(advancedConverter); - Assert.IsNotNull(backwardAdvancedConverter); - Assert.IsNotNull(instanceGenerator); - foreach (TFrom from in instanceGenerator.GetInstances(random, enumTestCount)) { - TTo result = advancedConverter.Convert(from); - TFrom backwardResult = backwardAdvancedConverter.Convert(result); - Assert.AreEqual(from, backwardResult); - } - } - - [Test] - public void ConstructorTest() - { - Biconverter bi = new Biconverter( - delegate(int value) { return value > 0; }, - delegate(bool value) { return value ? 1 : -1; }); - Assert.AreEqual(true, bi.ConvertForward(1)); - Assert.AreEqual(false, bi.ConvertForward(0)); - Assert.AreEqual(1, bi.ConvertBackward(true)); - Assert.AreEqual(-1, bi.ConvertBackward(false)); - } - - [Test] - public void Test() - { - foreach (Type typeFrom in types) { - foreach (Type typeTo in types) { - //AdvancedConverter(); - Type providerType = provider.GetType(); - MethodInfo getConverterMethod = - providerType.GetMethod("GetConverter", ArrayUtils.EmptyArray).GetGenericMethodDefinition().MakeGenericMethod(new Type[] {typeFrom, typeTo}); - object converter = null; - try { - converter = getConverterMethod.Invoke(provider, null); - } - catch { - TestLog.Info("Conversion from {0} to {1} is not supported", typeFrom.GetShortName(), typeTo.GetShortName()); - } - if (converter!=null) { - Type maskInterface = typeof (IAdvancedConverter<,>).MakeGenericType(new Type[] {typeFrom, typeTo}); - Type[] foundInterfaces = - converter.GetType().FindInterfaces( - delegate(Type typeObj, Object criteriaObj) { return typeObj==maskInterface; }, null); - foreach (Type type in foundInterfaces) { - PropertyInfo propertyInfo = type.GetProperty("IsRough"); - bool isRough = (bool) propertyInfo.GetValue(converter, null); - TestLog.Info("Conversion from {0} to {1} is {2}", typeFrom.GetShortName(), - typeTo.GetShortName(), isRough ? "Rough" : "Strict"); - } - } - } - } - } - - [Test] - public void NullableTest() - { - int count = 100; - - NullableTestInternal(count, true); - NullableTestInternal(count, false); - NullableTestInternal(count, true); - - NullableTestInternal(count, false); - NullableTestInternal(count, true); - NullableTestInternal(count, true); - - NullableTestInternal(count, false); - } - - private void NullableTestInternal(int count, bool assertNullConversion) - { - AdvancedConverter advancedConverter = AdvancedConverter.Default; - Assert.IsNotNull(advancedConverter); - Type fromType = typeof (TFrom); - Type toType = typeof (TTo); - bool fromIsNullable = fromType.IsNullable(); - Type fromNonNullableType = fromIsNullable ? fromType.GetGenericArguments()[0] : typeof (TFrom); - - // Random test - Action nullableConverterTest = - DelegateHelper.CreateDelegate>(this, GetType(), - "NullableConverterTest", fromNonNullableType, fromType, toType); - nullableConverterTest.Invoke(advancedConverter, count); - - // Null test - if (fromIsNullable) { - if (assertNullConversion) { - AssertEx.Throws(delegate { advancedConverter.Convert((TFrom) (object) null); }); - } - else { - advancedConverter.Convert((TFrom) (object) null); - } - } - } - - private void NullableConverterTest(object converterObject, int count) - { - AdvancedConverter advancedConverter = (AdvancedConverter) converterObject; - AdvancedConverter reverseAdvancedConverter = AdvancedConverter.Default; - IInstanceGenerator instanceGenerator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - foreach (T instance in instanceGenerator.GetInstances(random, count)) { - TTo result = advancedConverter.Convert((TFrom) (object) instance); - if (reverseAdvancedConverter!=null) { - TFrom backwardResult = reverseAdvancedConverter.Convert(result); - if (!advancedConverter.IsRough && !reverseAdvancedConverter.IsRough) - Assert.AreEqual(instance, backwardResult); - } - } - } - - private byte Enum1ToByte(ByteEnum value) - { - return (byte) value; - } - - private sbyte Enum1ToSByte(ByteEnum value) - { - return (sbyte) value; - } - - private ulong Enum1ToULong(ByteEnum value) - { - return (ulong) value; - } - - private long Enum1ToLong(ByteEnum value) - { - return (long) value; - } - - private ByteEnum ByteToEnum1(byte value) - { - return (ByteEnum) value; - } - - private ByteEnum SByteToEnum1(sbyte value) - { - return (ByteEnum) value; - } - - private ByteEnum ULongToEnum1(ulong value) - { - return (ByteEnum) value; - } - - private ByteEnum LongToEnum1(long value) - { - return (ByteEnum) value; - } - - private SByteEnum ULongToEnum2(ulong value) - { - return (SByteEnum) value; - } - - private SByteEnum LongToEnum2(long value) - { - return (SByteEnum) value; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2007.10.03 + +using System; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Conversion; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; +using MethodInfo=System.Reflection.MethodInfo; +using PropertyInfo=System.Reflection.PropertyInfo; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class ConverterTest : ConverterTestBase + { + private readonly IAdvancedConverterProvider provider = AdvancedConverterProvider.Default; + private static readonly Random random = RandomManager.CreateRandom(SeedVariatorType.CallingType); + private const int enumTestCount = 1000; + + private readonly Type[] types = new Type[] { + typeof (bool), + typeof (byte), + typeof (sbyte), + typeof (short), + typeof (ushort), + typeof (int), + typeof (uint), + typeof (long), + typeof (ulong), + typeof (float), + typeof (double), + typeof (decimal), + typeof (DateTime), + typeof (Guid), + typeof (string), + typeof (char) + }; + + public enum ByteEnum : byte + { + Value1_1, + Value1_2, + Value1_3, + } + + public enum SByteEnum : sbyte + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum IntEnum : int + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum UIntEnum : uint + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum ShortEnum : short + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum UShortEnum : ushort + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum LongEnum : long + { + Value2_1, + Value2_2, + Value2_3, + } + + public enum ULongEnum : ulong + { + Value2_1, + Value2_2, + Value2_3, + } + + [Test] + [Explicit] + [Category("Debug")] + public void DelegateTest() + { + Converter converter = DelegateHelper.CreatePrimitiveCastDelegate(); + converter(ByteEnum.Value1_1); + } + + [Test] + public void EnumTest() + { + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + } + + private void EnumTestInternal() + { + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + EnumTestInternal(); + } + + private void EnumTestInternal() + { + AdvancedConverter advancedConverter = AdvancedConverter.Default; + AdvancedConverter backwardAdvancedConverter = AdvancedConverter.Default; + IInstanceGenerator instanceGenerator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Assert.IsNotNull(advancedConverter); + Assert.IsNotNull(backwardAdvancedConverter); + Assert.IsNotNull(instanceGenerator); + foreach (TFrom from in instanceGenerator.GetInstances(random, enumTestCount)) { + TTo result = advancedConverter.Convert(from); + TFrom backwardResult = backwardAdvancedConverter.Convert(result); + Assert.AreEqual(from, backwardResult); + } + } + + [Test] + public void ConstructorTest() + { + Biconverter bi = new Biconverter( + delegate(int value) { return value > 0; }, + delegate(bool value) { return value ? 1 : -1; }); + Assert.AreEqual(true, bi.ConvertForward(1)); + Assert.AreEqual(false, bi.ConvertForward(0)); + Assert.AreEqual(1, bi.ConvertBackward(true)); + Assert.AreEqual(-1, bi.ConvertBackward(false)); + } + + [Test] + public void Test() + { + foreach (Type typeFrom in types) { + foreach (Type typeTo in types) { + //AdvancedConverter(); + Type providerType = provider.GetType(); + MethodInfo getConverterMethod = + providerType.GetMethod("GetConverter", ArrayUtils.EmptyArray).GetGenericMethodDefinition().MakeGenericMethod(new Type[] {typeFrom, typeTo}); + object converter = null; + try { + converter = getConverterMethod.Invoke(provider, null); + } + catch { + TestLog.Info("Conversion from {0} to {1} is not supported", typeFrom.GetShortName(), typeTo.GetShortName()); + } + if (converter!=null) { + Type maskInterface = typeof (IAdvancedConverter<,>).MakeGenericType(new Type[] {typeFrom, typeTo}); + Type[] foundInterfaces = + converter.GetType().FindInterfaces( + delegate(Type typeObj, Object criteriaObj) { return typeObj==maskInterface; }, null); + foreach (Type type in foundInterfaces) { + PropertyInfo propertyInfo = type.GetProperty("IsRough"); + bool isRough = (bool) propertyInfo.GetValue(converter, null); + TestLog.Info("Conversion from {0} to {1} is {2}", typeFrom.GetShortName(), + typeTo.GetShortName(), isRough ? "Rough" : "Strict"); + } + } + } + } + } + + [Test] + public void NullableTest() + { + int count = 100; + + NullableTestInternal(count, true); + NullableTestInternal(count, false); + NullableTestInternal(count, true); + + NullableTestInternal(count, false); + NullableTestInternal(count, true); + NullableTestInternal(count, true); + + NullableTestInternal(count, false); + } + + private void NullableTestInternal(int count, bool assertNullConversion) + { + AdvancedConverter advancedConverter = AdvancedConverter.Default; + Assert.IsNotNull(advancedConverter); + Type fromType = typeof (TFrom); + Type toType = typeof (TTo); + bool fromIsNullable = fromType.IsNullable(); + Type fromNonNullableType = fromIsNullable ? fromType.GetGenericArguments()[0] : typeof (TFrom); + + // Random test + Action nullableConverterTest = + DelegateHelper.CreateDelegate>(this, GetType(), + "NullableConverterTest", fromNonNullableType, fromType, toType); + nullableConverterTest.Invoke(advancedConverter, count); + + // Null test + if (fromIsNullable) { + if (assertNullConversion) { + AssertEx.Throws(delegate { advancedConverter.Convert((TFrom) (object) null); }); + } + else { + advancedConverter.Convert((TFrom) (object) null); + } + } + } + + private void NullableConverterTest(object converterObject, int count) + { + AdvancedConverter advancedConverter = (AdvancedConverter) converterObject; + AdvancedConverter reverseAdvancedConverter = AdvancedConverter.Default; + IInstanceGenerator instanceGenerator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + foreach (T instance in instanceGenerator.GetInstances(random, count)) { + TTo result = advancedConverter.Convert((TFrom) (object) instance); + if (reverseAdvancedConverter!=null) { + TFrom backwardResult = reverseAdvancedConverter.Convert(result); + if (!advancedConverter.IsRough && !reverseAdvancedConverter.IsRough) + Assert.AreEqual(instance, backwardResult); + } + } + } + + private byte Enum1ToByte(ByteEnum value) + { + return (byte) value; + } + + private sbyte Enum1ToSByte(ByteEnum value) + { + return (sbyte) value; + } + + private ulong Enum1ToULong(ByteEnum value) + { + return (ulong) value; + } + + private long Enum1ToLong(ByteEnum value) + { + return (long) value; + } + + private ByteEnum ByteToEnum1(byte value) + { + return (ByteEnum) value; + } + + private ByteEnum SByteToEnum1(sbyte value) + { + return (ByteEnum) value; + } + + private ByteEnum ULongToEnum1(ulong value) + { + return (ByteEnum) value; + } + + private ByteEnum LongToEnum1(long value) + { + return (ByteEnum) value; + } + + private SByteEnum ULongToEnum2(ulong value) + { + return (SByteEnum) value; + } + + private SByteEnum LongToEnum2(long value) + { + return (SByteEnum) value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/BooleanConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/BooleanConverterTest.cs index eade883acf..a4627d588f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/BooleanConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/BooleanConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class BooleanConverterTest : ConverterTestBase - { - private readonly bool[] constants = { false, true }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - foreach (bool constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class BooleanConverterTest : ConverterTestBase + { + private readonly bool[] constants = { false, true }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + foreach (bool constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ByteConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ByteConverterTest.cs index 4b644cb78b..4f0a6b3c9d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ByteConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ByteConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class ByteConverterTest : ConverterTestBase - { - private readonly byte[] constants = { 0, 1, 123, 0x7F, 0xFF}; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - foreach (byte constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class ByteConverterTest : ConverterTestBase + { + private readonly byte[] constants = { 0, 1, 123, 0x7F, 0xFF}; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + foreach (byte constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/CharConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/CharConverterTest.cs index b7d170bbaf..8a6467cb1b 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/CharConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/CharConverterTest.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.28 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class CharConverterTest : ConverterTestBase - { - private readonly char[] constants = { 'A', '\0', '0', (char)123, (char)0x7F, (char)0xFF, (char)0x7FFF, (char)0xFFFF, 'к'}; - private const int iterationCount = 100; - - [Test] - public void SingleTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 100; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void DoubleTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 100; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void DecimalTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 100; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - foreach (char constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.28 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class CharConverterTest : ConverterTestBase + { + private readonly char[] constants = { 'A', '\0', '0', (char)123, (char)0x7F, (char)0xFF, (char)0x7FFF, (char)0xFFFF, 'к'}; + private const int iterationCount = 100; + + [Test] + public void SingleTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 100; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void DoubleTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 100; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void DecimalTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 100; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + foreach (char constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ConverterTestBase.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ConverterTestBase.cs index edecb232e7..7db63314ab 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ConverterTestBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/ConverterTestBase.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - public class ConverterTestBase - { - protected bool UseLog; - - public void OneValueTest(TFrom value, int count) - { - AdvancedConverter advancedConverterTo = null; - AdvancedConverter advancedConverterFrom = null; - try { - advancedConverterTo = AdvancedConverter.Default; - advancedConverterFrom = AdvancedConverter.Default; - } - catch (InvalidOperationException e) { - if (UseLog) - TestLog.Info("{0}", e.Message); - } - - for (int i = 0; i < count; i++) { - bool innerLogFlag = UseLog && (i==0); - if (advancedConverterTo!=null) { - try { - TTo convertedValue = advancedConverterTo.Convert(value); - if (innerLogFlag) - TestLog.Info("Converting {0} of {1} type. Result: {2} of {3} type", value, - typeof(TFrom).GetShortName(), - convertedValue, typeof(TTo).GetShortName()); - if (advancedConverterFrom != null) { - try { - TFrom reconvertedValue = advancedConverterFrom.Convert(convertedValue); - if (innerLogFlag) - TestLog.Info("Reconverting {0} of {1} type. Result: {2} of {3} type.", convertedValue, - typeof(TTo).GetShortName(), - reconvertedValue, typeof(TFrom).GetShortName()); - if ((advancedConverterTo.IsRough)) { - if (innerLogFlag) - TestLog.Info("Conversion from {0} to {1} is rough.", - typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); - } - else - Assert.AreEqual(value, reconvertedValue, "reconvertedValue"); - } - catch (OverflowException e) { - if (innerLogFlag) - TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, - typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); - } - catch (ArgumentOutOfRangeException e) { - if (innerLogFlag) - TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, - typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); - } - catch (FormatException e) { - if (innerLogFlag) - TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, - typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); - } - } - } - catch (OverflowException e) { - if (innerLogFlag) - TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, - typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); - } - catch (ArgumentOutOfRangeException e) { - if (innerLogFlag) - TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, - typeof (TFrom).GetShortName(), typeof (TTo).GetShortName()); - } - catch (FormatException e) { - if (innerLogFlag) - TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, - typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); - } - } - else if (innerLogFlag) - TestLog.Info("Conversion from {0} to {1} is not supported.", typeof (TFrom).GetShortName(), - typeof (TTo).GetShortName()); - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + public class ConverterTestBase + { + protected bool UseLog; + + public void OneValueTest(TFrom value, int count) + { + AdvancedConverter advancedConverterTo = null; + AdvancedConverter advancedConverterFrom = null; + try { + advancedConverterTo = AdvancedConverter.Default; + advancedConverterFrom = AdvancedConverter.Default; + } + catch (InvalidOperationException e) { + if (UseLog) + TestLog.Info("{0}", e.Message); + } + + for (int i = 0; i < count; i++) { + bool innerLogFlag = UseLog && (i==0); + if (advancedConverterTo!=null) { + try { + TTo convertedValue = advancedConverterTo.Convert(value); + if (innerLogFlag) + TestLog.Info("Converting {0} of {1} type. Result: {2} of {3} type", value, + typeof(TFrom).GetShortName(), + convertedValue, typeof(TTo).GetShortName()); + if (advancedConverterFrom != null) { + try { + TFrom reconvertedValue = advancedConverterFrom.Convert(convertedValue); + if (innerLogFlag) + TestLog.Info("Reconverting {0} of {1} type. Result: {2} of {3} type.", convertedValue, + typeof(TTo).GetShortName(), + reconvertedValue, typeof(TFrom).GetShortName()); + if ((advancedConverterTo.IsRough)) { + if (innerLogFlag) + TestLog.Info("Conversion from {0} to {1} is rough.", + typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); + } + else + Assert.AreEqual(value, reconvertedValue, "reconvertedValue"); + } + catch (OverflowException e) { + if (innerLogFlag) + TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, + typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); + } + catch (ArgumentOutOfRangeException e) { + if (innerLogFlag) + TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, + typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); + } + catch (FormatException e) { + if (innerLogFlag) + TestLog.Info(e, "Reconversion of {0} of {1} type to type {2} failed.", convertedValue, + typeof(TTo).GetShortName(), typeof(TFrom).GetShortName()); + } + } + } + catch (OverflowException e) { + if (innerLogFlag) + TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, + typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); + } + catch (ArgumentOutOfRangeException e) { + if (innerLogFlag) + TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, + typeof (TFrom).GetShortName(), typeof (TTo).GetShortName()); + } + catch (FormatException e) { + if (innerLogFlag) + TestLog.Info(e, "Conversion of {0} of {1} type to type {2} failed.", value, + typeof(TFrom).GetShortName(), typeof(TTo).GetShortName()); + } + } + else if (innerLogFlag) + TestLog.Info("Conversion from {0} to {1} is not supported.", typeof (TFrom).GetShortName(), + typeof (TTo).GetShortName()); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DateTimeConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DateTimeConverterTest.cs index 0f882de759..a39cb6cd90 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DateTimeConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DateTimeConverterTest.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using System.Globalization; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class DateTimeConverterTest : ConverterTestBase - { - private readonly DateTime[] constants = { DateTime.Now, new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Local), - new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), - new DateTime(0x7FFFFFFF), new DateTime(223372036854714932), - new DateTime(0xFFFF), new DateTime(3155378975999999999), - DateTime.MinValue, DateTime.MaxValue}; - private const int iterationCount = 100; - - [Test] - public void Test() - { - TestLog.Info("{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss.fff %K", CultureInfo.InvariantCulture)); - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 1; i++) - TestLog.Info("{0}", generator.GetInstance(random).ToString("yyyy/MM/dd hh:mm:ss.fff %K", CultureInfo.InvariantCulture)); - } - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 100; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - foreach (DateTime constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using System.Globalization; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class DateTimeConverterTest : ConverterTestBase + { + private readonly DateTime[] constants = { DateTime.Now, new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Local), + new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + new DateTime(0x7FFFFFFF), new DateTime(223372036854714932), + new DateTime(0xFFFF), new DateTime(3155378975999999999), + DateTime.MinValue, DateTime.MaxValue}; + private const int iterationCount = 100; + + [Test] + public void Test() + { + TestLog.Info("{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss.fff %K", CultureInfo.InvariantCulture)); + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 1; i++) + TestLog.Info("{0}", generator.GetInstance(random).ToString("yyyy/MM/dd hh:mm:ss.fff %K", CultureInfo.InvariantCulture)); + } + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 100; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + foreach (DateTime constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DecimalConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DecimalConverterTest.cs index 17a17bd011..87cec752b4 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DecimalConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DecimalConverterTest.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class DecimalConverterTest : ConverterTestBase - { - private readonly decimal[] constants = { 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, - 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, decimal.MinValue, decimal.MaxValue, - (decimal)2.5, (decimal)1.6E-308d, (decimal)234.14748366, (decimal)-0.4503599627370496}; - private const int iterationCount = 100; - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount*1000; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - foreach (decimal constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class DecimalConverterTest : ConverterTestBase + { + private readonly decimal[] constants = { 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, + 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, decimal.MinValue, decimal.MaxValue, + (decimal)2.5, (decimal)1.6E-308d, (decimal)234.14748366, (decimal)-0.4503599627370496}; + private const int iterationCount = 100; + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount*1000; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + foreach (decimal constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DoubleConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DoubleConverterTest.cs index 84104931a0..f0981b78a0 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DoubleConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/DoubleConverterTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class DoubleConverterTest : ConverterTestBase - { - private readonly double[] constants = { - 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, - 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, double.MinValue, - double.MaxValue, double.NegativeInfinity, double.PositiveInfinity, double.Epsilon, -double.Epsilon, - 2.14748366444444444444444444444444444444444444444444444444444444444444444444444444444444444444E-323d, - 2.14748366E+11d, 2.14748366E+12d, 2.14748366E+13d, 2.14748366E+14d, 2.14748366E+15d, 2.14748366E+16d, - 1.6E+308d, 2.14748366E+37d, 0.4503599627370496 - }; - private const int iterationCount = 100; - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 10000; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - foreach (double constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class DoubleConverterTest : ConverterTestBase + { + private readonly double[] constants = { + 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, + 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, double.MinValue, + double.MaxValue, double.NegativeInfinity, double.PositiveInfinity, double.Epsilon, -double.Epsilon, + 2.14748366444444444444444444444444444444444444444444444444444444444444444444444444444444444444E-323d, + 2.14748366E+11d, 2.14748366E+12d, 2.14748366E+13d, 2.14748366E+14d, 2.14748366E+15d, 2.14748366E+16d, + 1.6E+308d, 2.14748366E+37d, 0.4503599627370496 + }; + private const int iterationCount = 100; + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 10000; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + foreach (double constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/GuidConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/GuidConverterTest.cs index f2013c65f5..fe65a29422 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/GuidConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/GuidConverterTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class GuidConverterTest : ConverterTestBase - { - private Guid[] constants; - private const int iterationCount = 100; - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 100; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - constants = new Guid[10]; - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < 10; i++) - constants[i] = generator.GetInstance(random); - - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - foreach (Guid constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class GuidConverterTest : ConverterTestBase + { + private Guid[] constants; + private const int iterationCount = 100; + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 100; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + constants = new Guid[10]; + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < 10; i++) + constants[i] = generator.GetInstance(random); + + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + foreach (Guid constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int16ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int16ConverterTest.cs index 9ff4951aa0..6638568a76 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int16ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int16ConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class Int16ConverterTest : ConverterTestBase - { - private readonly short[] constants = { 0, -1, 1, 123, 0x7F, 0xFF, 0x7FFF, -32768 }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - foreach (short constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class Int16ConverterTest : ConverterTestBase + { + private readonly short[] constants = { 0, -1, 1, 123, 0x7F, 0xFF, 0x7FFF, -32768 }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + foreach (short constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int32ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int32ConverterTest.cs index 00a08db242..5ba19cc727 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int32ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int32ConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class Int32ConverterTest : ConverterTestBase - { - private readonly int[] constants = { 0, 1, 123, 0x7F, 0xFF, 0x7FFFFFFF, -2147483648, 0xFFFF, 0x7FFF }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - foreach (int constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class Int32ConverterTest : ConverterTestBase + { + private readonly int[] constants = { 0, 1, 123, 0x7F, 0xFF, 0x7FFFFFFF, -2147483648, 0xFFFF, 0x7FFF }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + foreach (int constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int64ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int64ConverterTest.cs index 3878e34a7e..94b3672ac9 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int64ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/Int64ConverterTest.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class Int64ConverterTest : ConverterTestBase - { - private readonly long[] constants = { - 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, - 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935 - }; - private const int iterationCount = 100; - - [Test] - public void MainTest () - { - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - foreach (long constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class Int64ConverterTest : ConverterTestBase + { + private readonly long[] constants = { + 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, + 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935 + }; + private const int iterationCount = 100; + + [Test] + public void MainTest () + { + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + foreach (long constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SByteConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SByteConverterTest.cs index 15cae4bb72..63f6a048af 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SByteConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SByteConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class SByteConverterTest : ConverterTestBase - { - private readonly sbyte[] constants = { 0, -1, 1, 123, 0x7F, -128 }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - foreach (sbyte constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class SByteConverterTest : ConverterTestBase + { + private readonly sbyte[] constants = { 0, -1, 1, 123, 0x7F, -128 }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + foreach (sbyte constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SingleConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SingleConverterTest.cs index 8c263a027c..8b2fc6a2aa 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SingleConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/SingleConverterTest.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class SingleConverterTest : ConverterTestBase - { - private readonly float[] constants = { - 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, - 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, float.MinValue, - float.MaxValue, float.NegativeInfinity, float.PositiveInfinity, float.Epsilon, -float.Epsilon, - 2.14748366E+09f, 2.14748366E+11f, 2.14748366E+12f, 2.14748366E+13f, 2.14748366E+14f, - 2.14748366E+15f, 2.14748366E+16f, 2.14748366E+38f, 2.14748366E+37f - }; - private const int iterationCount = 100; - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 10000; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - // Proves that float-to-double is a rough conversion. - [Test] - public void DoubleTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 10000; i++) - OneValueTest(generator.GetInstance(random), 1); - } - - [Test] - public void CombinedTest() - { - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - foreach (float constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class SingleConverterTest : ConverterTestBase + { + private readonly float[] constants = { + 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, -9223372036854714932, + 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, -72057594037927935, float.MinValue, + float.MaxValue, float.NegativeInfinity, float.PositiveInfinity, float.Epsilon, -float.Epsilon, + 2.14748366E+09f, 2.14748366E+11f, 2.14748366E+12f, 2.14748366E+13f, 2.14748366E+14f, + 2.14748366E+15f, 2.14748366E+16f, 2.14748366E+38f, 2.14748366E+37f + }; + private const int iterationCount = 100; + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 10000; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + // Proves that float-to-double is a rough conversion. + [Test] + public void DoubleTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 10000; i++) + OneValueTest(generator.GetInstance(random), 1); + } + + [Test] + public void CombinedTest() + { + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + foreach (float constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringAdvancedConverter.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringAdvancedConverter.cs index 9ecb85e98b..286e415186 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringAdvancedConverter.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringAdvancedConverter.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.21 - -using System; -using Xtensive.Conversion; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - public class StringAdvancedConverter: - IAdvancedConverter, - IAdvancedConverter - { - int IAdvancedConverter.Convert(string value) - { - return int.Parse(value); - } - - /// - /// Gets if converter is rough, otherwise gets . - /// - bool IAdvancedConverter.IsRough - { - get { return false; } - } - - public string Convert(int value) - { - return value.ToString(); - } - - /// - /// Gets if converter is rough, otherwise gets . - /// - public bool IsRough - { - get { return false; } - } - - public IAdvancedConverterProvider Provider - { - get { return null; } - } - - public StringAdvancedConverter(IAdvancedConverterProvider provider) - { - - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.21 + +using System; +using Xtensive.Conversion; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + public class StringAdvancedConverter: + IAdvancedConverter, + IAdvancedConverter + { + int IAdvancedConverter.Convert(string value) + { + return int.Parse(value); + } + + /// + /// Gets if converter is rough, otherwise gets . + /// + bool IAdvancedConverter.IsRough + { + get { return false; } + } + + public string Convert(int value) + { + return value.ToString(); + } + + /// + /// Gets if converter is rough, otherwise gets . + /// + public bool IsRough + { + get { return false; } + } + + public IAdvancedConverterProvider Provider + { + get { return null; } + } + + public StringAdvancedConverter(IAdvancedConverterProvider provider) + { + + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringConverterTest.cs index af4639229c..b9403634e8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/StringConverterTest.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.26 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class StringConverterTest : ConverterTestBase - { - private readonly string[] numericConstants = { - "0x7FFFFFFFFFFF1234", "123", "012", "0x7F", "0x0a", "0xFF", "0x7FFFFFFF", "-9223372036854714932", - "0xFFFF", "0x7FFF", "0xFFFFFFFF", "0xFFFFFFFFFFFFFF", "-72057594037927935", "", "0", "\n", "2.5", "abcd" - }; - - private readonly string[] fractionalConstants = { - "2.5", "1.6E-308d", "234.14748366", "-0.4503599627370496", - }; - private readonly string[] guidConstants = { "12345678-9012-3456-78990-123456789022" }; - private readonly string[] booleanConstants = {"false", "FALSE", "true", "tRue"}; - private readonly string[] dateTimeConstants = {}; - private const int iterationCount = 100; - - [Test] - public void BooleanTest() - { - foreach (string constant in booleanConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - [Explicit] - public void BooleanTestWithLog() - { - foreach (string constant in booleanConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - public void NumericTest() - { - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in numericConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - public void FractionalTest() - { - foreach (string constant in fractionalConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in fractionalConstants) - OneValueTest(constant, iterationCount); - foreach (string constant in fractionalConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - public void DateTimeTest() - { - foreach (string constant in dateTimeConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - public void GuidTest() - { - foreach (string constant in guidConstants) - OneValueTest(constant, iterationCount); - } - - [Test] - public void StringTest() - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - for (int i = 0; i < iterationCount * 1000; i++) - OneValueTest(generator.GetInstance(random), 1); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.26 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class StringConverterTest : ConverterTestBase + { + private readonly string[] numericConstants = { + "0x7FFFFFFFFFFF1234", "123", "012", "0x7F", "0x0a", "0xFF", "0x7FFFFFFF", "-9223372036854714932", + "0xFFFF", "0x7FFF", "0xFFFFFFFF", "0xFFFFFFFFFFFFFF", "-72057594037927935", "", "0", "\n", "2.5", "abcd" + }; + + private readonly string[] fractionalConstants = { + "2.5", "1.6E-308d", "234.14748366", "-0.4503599627370496", + }; + private readonly string[] guidConstants = { "12345678-9012-3456-78990-123456789022" }; + private readonly string[] booleanConstants = {"false", "FALSE", "true", "tRue"}; + private readonly string[] dateTimeConstants = {}; + private const int iterationCount = 100; + + [Test] + public void BooleanTest() + { + foreach (string constant in booleanConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + [Explicit] + public void BooleanTestWithLog() + { + foreach (string constant in booleanConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + public void NumericTest() + { + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in numericConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + public void FractionalTest() + { + foreach (string constant in fractionalConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in fractionalConstants) + OneValueTest(constant, iterationCount); + foreach (string constant in fractionalConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + public void DateTimeTest() + { + foreach (string constant in dateTimeConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + public void GuidTest() + { + foreach (string constant in guidConstants) + OneValueTest(constant, iterationCount); + } + + [Test] + public void StringTest() + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + Random random = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + for (int i = 0; i < iterationCount * 1000; i++) + OneValueTest(generator.GetInstance(random), 1); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TestConverterProvider.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TestConverterProvider.cs index 8320ff3bda..b22328aefc 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TestConverterProvider.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TestConverterProvider.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.21 - -using System; -using Xtensive.Conversion; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - public class TestConverterProvider : AdvancedConverterProvider - { - public TestConverterProvider() - { - Type t = typeof(StringAdvancedConverter); - AddHighPriorityLocation(t.Assembly, t.Namespace, true); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.21 + +using System; +using Xtensive.Conversion; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + public class TestConverterProvider : AdvancedConverterProvider + { + public TestConverterProvider() + { + Type t = typeof(StringAdvancedConverter); + AddHighPriorityLocation(t.Assembly, t.Namespace, true); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TimeSpanConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TimeSpanConverterTest.cs index 161499d27b..fa8f8ce847 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TimeSpanConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/TimeSpanConverterTest.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.11.12 - -using System; -using System.Globalization; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class TimeSpanConverterTest : ConverterTestBase - { - private readonly TimeSpan[] constants = { new TimeSpan( 1 ), - new TimeSpan( 10, 20, 30, 40, 50 ), - new TimeSpan( 1111, 2222, 3333, 4444, 5555 ), - TimeSpan.FromDays( 20.84745602 ), - new TimeSpan(0x7FFFFFFF), new TimeSpan(223372036854714932), - new TimeSpan(0xFFFF), new TimeSpan(3155378975999999999), - TimeSpan.MinValue, TimeSpan.MaxValue}; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - foreach (TimeSpan constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.11.12 + +using System; +using System.Globalization; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class TimeSpanConverterTest : ConverterTestBase + { + private readonly TimeSpan[] constants = { new TimeSpan( 1 ), + new TimeSpan( 10, 20, 30, 40, 50 ), + new TimeSpan( 1111, 2222, 3333, 4444, 5555 ), + TimeSpan.FromDays( 20.84745602 ), + new TimeSpan(0x7FFFFFFF), new TimeSpan(223372036854714932), + new TimeSpan(0xFFFF), new TimeSpan(3155378975999999999), + TimeSpan.MinValue, TimeSpan.MaxValue}; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + foreach (TimeSpan constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt16ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt16ConverterTest.cs index 5ba62395b1..9a10e2af4c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt16ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt16ConverterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class UInt16ConverterTest : ConverterTestBase - { - private readonly ushort[] constants = { 0, 1, 123, 0x7F, 0xFF, 0xFFFF, 0x7FFF }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - foreach (ushort constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class UInt16ConverterTest : ConverterTestBase + { + private readonly ushort[] constants = { 0, 1, 123, 0x7F, 0xFF, 0xFFFF, 0x7FFF }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + foreach (ushort constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt32converterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt32converterTest.cs index 1be37f2fa4..7573abf531 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt32converterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt32converterTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class UInt32ConverterTest : ConverterTestBase - { - private readonly uint[] constants = { 0, 1, 123, 0x7F, 0xFF, 0x7FFFFFFF, 0xFFFF, 0x7FFF, 0xFFFFFFFF }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - foreach (uint constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class UInt32ConverterTest : ConverterTestBase + { + private readonly uint[] constants = { 0, 1, 123, 0x7F, 0xFF, 0x7FFFFFFF, 0xFFFF, 0x7FFF, 0xFFFFFFFF }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + foreach (uint constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt64ConverterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt64ConverterTest.cs index 83715a5d3e..c83e401999 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt64ConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Conversion/Internals/UInt64ConverterTest.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.25 - -using System; -using NUnit.Framework; -using Xtensive.Conversion; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Conversion -{ - [TestFixture] - public class UInt64ConverterTest : ConverterTestBase - { - private readonly ulong[] constants = { - 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, 0x800000000000EDCC, - 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF1234 - }; - private const int iterationCount = 100; - - [Test] - public void CombinedTest() - { - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - foreach (ulong constant in constants) - OneValueTest(constant, iterationCount); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.25 + +using System; +using NUnit.Framework; +using Xtensive.Conversion; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Conversion +{ + [TestFixture] + public class UInt64ConverterTest : ConverterTestBase + { + private readonly ulong[] constants = { + 0x7FFFFFFFFFFF1234, 0, 123, 0x7F, 0xFF, 0x7FFFFFFF, 0x800000000000EDCC, + 0xFFFF, 0x7FFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF1234 + }; + private const int iterationCount = 100; + + [Test] + public void CombinedTest() + { + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + foreach (ulong constant in constants) + OneValueTest(constant, iterationCount); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Diagnostics/DebugInfoTest.cs b/Orm/Xtensive.Orm.Tests.Core/Diagnostics/DebugInfoTest.cs index aeada9447e..6a1ae909e5 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Diagnostics/DebugInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Diagnostics/DebugInfoTest.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.10.03 - -using System; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.Diagnostics -{ - [TestFixture] - public class DebugInfoTest - { - [Test] - public void CompoundTest() - { - TestLog.Info("Is running on build server: {0}", DebugInfo.IsRunningOnBuildServer); - TestLog.Info("Is unit test session running: {0}", DebugInfo.IsUnitTestSessionRunning); - Assert.IsTrue(DebugInfo.IsUnitTestSessionRunning); - int count = 1000000; - bool b = true; - using (new Measurement("DebugInfo.IsUnitTestSessionRunning", count)) { - for (int i = 0; i900000); - Assert.IsTrue(diff<1100000); - TestLog.Info("After array allocation: "+m.ToString()); - Thread.Sleep(150); - a = null; - m.DisposeSafely(); - try { - m.Complete(); - Assert.Fail("InvalidOperationException expected."); - } - catch (InvalidOperationException) { - } - Assert.IsTrue(m.TimeSpent.TotalMilliseconds > 100); - Assert.IsTrue(m.TimeSpent.TotalMilliseconds < 200); - Assert.IsTrue(m.MemoryAllocated < 1000); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.10.03 + +using System; +using System.Threading; +using NUnit.Framework; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Core.Diagnostics +{ + [TestFixture] + public class MeasurementTest + { + [Test] + [Ignore("TODO: AY check it ASAP")] + public void CompoundTest() + { + // This part ensures everything below is JITter + using (Measurement m = new Measurement()) { + TestLog.Info("Ignore: TimeSpent = " + m.TimeSpent.TotalMilliseconds.ToString()); + Assert.AreEqual(m.Name, "Unnamed"); + m.OperationCount = 10; + Assert.AreEqual(m.OperationCount,10); + TestLog.Info("Ignore: MemoryAllocated = " + m.MemoryAllocated.ToString()); + Assert.IsTrue(m.MemoryAllocated < 2000000); + TestLog.Info("Before array allocation: "+m.ToString()); + object[] a = new object[1000]; + Thread.Sleep(10); + TestLog.Info("After array allocation: "+m.ToString()); + a = null; + } + + // Actual test + { + Measurement m = new Measurement("Named"); + Assert.AreEqual(m.Name, "Named"); + m.OperationCount = 10; + Assert.AreEqual(m.OperationCount, 10); + m.OperationCount = 0; + Assert.IsTrue(m.TimeSpent.TotalMilliseconds < 5); + TestLog.Info("Before array allocation: "+m.ToString()); + long before = m.MemoryAllocated; + byte[] a = new byte[1000000]; + a[0] = 1; + long diff = m.MemoryAllocated-before; + TestLog.Info("Difference: " + diff); + Assert.IsTrue(diff>900000); + Assert.IsTrue(diff<1100000); + TestLog.Info("After array allocation: "+m.ToString()); + Thread.Sleep(150); + a = null; + m.DisposeSafely(); + try { + m.Complete(); + Assert.Fail("InvalidOperationException expected."); + } + catch (InvalidOperationException) { + } + Assert.IsTrue(m.TimeSpent.TotalMilliseconds > 100); + Assert.IsTrue(m.TimeSpent.TotalMilliseconds < 200); + Assert.IsTrue(m.MemoryAllocated < 1000); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Diagnostics/RuntimeInfoTest.cs b/Orm/Xtensive.Orm.Tests.Core/Diagnostics/RuntimeInfoTest.cs index 11c5bc0c46..ef08355a3c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Diagnostics/RuntimeInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Diagnostics/RuntimeInfoTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.10.03 - -using System; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.Diagnostics -{ - [TestFixture] - public class RuntimeInfoTest - { - private sealed class Empty { - public Empty Pointer1; - public Empty Pointer2; - } - - private static int GetDefaultStructLayoutPack() - { - int measureCount = 128; - int maxPack = 128; - int allocationToPackFactor = 4; - Empty[] objects = new Empty[16384]; - int[] packCounts = new int[maxPack]; - int bestPack = 0; - int bestPackCount = 0; - for (int i = 0; imaxPack) - continue; - packCounts[pack]++; - if (bestPackCountmaxPack) - bestPack = 4; - return bestPack; - } - - private static long GetFreeMemory() - { -// GC.Collect(); -// GC.WaitForPendingFinalizers(); -// GC.Collect(); - return GC.GetTotalMemory(false); - } - - [Test, Explicit] - public void CompoundTest() - { - TestLog.Info("PointerSize: {0}", RuntimeInfo.PointerSize); - TestLog.Info("DefaultStructLayoutPack: {0}", RuntimeInfo.DefaultStructLayoutPack); - Assert.AreEqual(RuntimeInfo.PointerSize, IntPtr.Size); - for (int i = 0; i<100; i++) - Assert.AreEqual(RuntimeInfo.DefaultStructLayoutPack, GetDefaultStructLayoutPack()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.10.03 + +using System; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.Diagnostics +{ + [TestFixture] + public class RuntimeInfoTest + { + private sealed class Empty { + public Empty Pointer1; + public Empty Pointer2; + } + + private static int GetDefaultStructLayoutPack() + { + int measureCount = 128; + int maxPack = 128; + int allocationToPackFactor = 4; + Empty[] objects = new Empty[16384]; + int[] packCounts = new int[maxPack]; + int bestPack = 0; + int bestPackCount = 0; + for (int i = 0; imaxPack) + continue; + packCounts[pack]++; + if (bestPackCountmaxPack) + bestPack = 4; + return bestPack; + } + + private static long GetFreeMemory() + { +// GC.Collect(); +// GC.WaitForPendingFinalizers(); +// GC.Collect(); + return GC.GetTotalMemory(false); + } + + [Test, Explicit] + public void CompoundTest() + { + TestLog.Info("PointerSize: {0}", RuntimeInfo.PointerSize); + TestLog.Info("DefaultStructLayoutPack: {0}", RuntimeInfo.DefaultStructLayoutPack); + Assert.AreEqual(RuntimeInfo.PointerSize, IntPtr.Size); + for (int i = 0; i<100; i++) + Assert.AreEqual(RuntimeInfo.DefaultStructLayoutPack, GetDefaultStructLayoutPack()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/AllocationTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/AllocationTest.cs index 79810b5819..75ed67e1c1 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/AllocationTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/AllocationTest.cs @@ -1,379 +1,379 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.04.17 - -using System; -using System.Runtime.Serialization; -using NUnit.Framework; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - public abstract class RootObject - { - - } - - public class InheritedObject1 : RootObject - { - - } - - public class InheritedObject2 : InheritedObject1 - { - - } - - public sealed class InheritedObject3 : InheritedObject2 - { - public object Reference; - } - - public sealed class SlimObject - { - public object Reference; - } - - public sealed class FinalizableSlimObject - { - public object Reference; - - ~FinalizableSlimObject() - { - } - } - - public struct SlimStruct - { - public object Reference1; - public object Reference2; - public object Reference3; - } - - - [TestFixture] - public class AllocationTest - { - public const int IterationCount = 10000000; - public const int MbSize = 1024*1024; - public readonly static int ClassSize = IntPtr.Size * 3; - public readonly static int StructSize = IntPtr.Size * 3; - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - Test(1); - Test(0.1); - Test(0.01); - Test(0.001); - } - - [Test] - public void RegularTest() - { - Test(0.01); - Test(0.001); - } - - private void Test(double speedFactor) - { - TestLog.Info("Class size: {0} bytes", ClassSize); - TestClassAllocation(speedFactor); - TestStructAllocation(speedFactor); - } - - private void TestClassAllocation(double speedFactor) - { - // Warmup - int iterations = 100; - AllocateClass_SlimObject(iterations); - AllocateClass_SlimObject_ByFormatterServices(iterations); - AllocateClass_FinalizableSlimObject(iterations); - AllocateClass_InheritedObject3(iterations); - AllocateClass(iterations); - AllocateClass(iterations); - AllocateClassArray_SlimObject(new SlimObject[iterations]); - AllocateClassArray_InheritedObject3(new InheritedObject3[iterations]); - AllocateClassArray_FinalizableSlimObject(new FinalizableSlimObject[iterations]); - AllocateClassArray(new SlimObject[iterations]); - AllocateClassArray(new FinalizableSlimObject[iterations]); - // Real test - iterations = (int)(IterationCount*speedFactor) / 10 * 10; - using (TestLog.InfoRegion("Object allocation")) { - TestHelper.CollectGarbage(); - using (TestLog.InfoRegion("Allocation to nothing")) { - using (new Measurement("SlimObject", MeasurementOptions.Log, iterations)) - AllocateClass_SlimObject(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("SlimObject (using FormatterServices)", MeasurementOptions.Log, iterations)) - AllocateClass_SlimObject_ByFormatterServices(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("FinalizableSlimObject", MeasurementOptions.Log, iterations)) - AllocateClass_FinalizableSlimObject(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("SlimObject, generic", MeasurementOptions.Log, iterations)) - AllocateClass(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("FinalizableSlimObject, generic", MeasurementOptions.Log, iterations)) - AllocateClass(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("InheritedObject3", MeasurementOptions.Log, iterations)) - AllocateClass_InheritedObject3(iterations); - TestHelper.CollectGarbage(); - } - using (TestLog.InfoRegion("Allocation to array")) { - using (new Measurement("SlimObject", MeasurementOptions.Log, iterations)) - AllocateClassArray_SlimObject(new SlimObject[iterations]); - TestHelper.CollectGarbage(); - using (new Measurement("FinalizableSlimObject", MeasurementOptions.Log, iterations)) - AllocateClassArray_FinalizableSlimObject(new FinalizableSlimObject[iterations]); - TestHelper.CollectGarbage(); - using (new Measurement("SlimObject, generic", MeasurementOptions.Log, iterations)) - AllocateClassArray(new SlimObject[iterations]); - TestHelper.CollectGarbage(); - using (new Measurement("FinalizableSlimObject, generic", MeasurementOptions.Log, iterations)) - AllocateClassArray(new FinalizableSlimObject[iterations]); - TestHelper.CollectGarbage(); - using (new Measurement("InheritedObject3", MeasurementOptions.Log, iterations)) - AllocateClassArray_InheritedObject3(new InheritedObject3[iterations]); - TestHelper.CollectGarbage(); - } - } - } - - private void TestStructAllocation(double speedFactor) - { - // Warmup - int iterations = 100; - AllocateStructArray_SlimStruct(iterations); - AllocateStructArray(iterations); - AllocateBoxedStructArray_SlimStruct(new object[iterations]); - AllocateBoxedStructArray(new object[iterations]); - // Real test - iterations = (int)(IterationCount*speedFactor) / 10 * 10; - using (TestLog.InfoRegion("Struct allocation")) { - TestHelper.CollectGarbage(); - using (TestLog.InfoRegion("Allocation of array")) { - using (new Measurement("SlimStruct", MeasurementOptions.Log, iterations)) - AllocateStructArray_SlimStruct(iterations); - TestHelper.CollectGarbage(); - using (new Measurement("SlimStruct, generic", MeasurementOptions.Log, iterations)) - AllocateStructArray(iterations); - TestHelper.CollectGarbage(); - } - using (TestLog.InfoRegion("Allocation of array with boxing")) { - using (new Measurement("SlimStruct", MeasurementOptions.Log, iterations)) - AllocateBoxedStructArray_SlimStruct(new object[iterations]); - TestHelper.CollectGarbage(); - using (new Measurement("SlimStruct, generic", MeasurementOptions.Log, iterations)) - AllocateBoxedStructArray(new object[iterations]); - TestHelper.CollectGarbage(); - } - } - } - - private void AllocateClass_SlimObject(int iterationCount) - { - for (int i = 0; i(int iterationCount) - where T: class, new() - { - for (int i = 0; i(T[] array) - where T: class, new() - { - int iterationCount = array.Length; - for (int i = 0; i(int iterationCount) - where T: struct - { - object o = new T[iterationCount]; - } - - private void AllocateBoxedStructArray_SlimStruct(object[] array) - { - int iterationCount = array.Length; - for (int i = 0; i(object[] array) - where T: struct - { - int iterationCount = array.Length; - for (int i = 0; i(iterations); + AllocateClass(iterations); + AllocateClassArray_SlimObject(new SlimObject[iterations]); + AllocateClassArray_InheritedObject3(new InheritedObject3[iterations]); + AllocateClassArray_FinalizableSlimObject(new FinalizableSlimObject[iterations]); + AllocateClassArray(new SlimObject[iterations]); + AllocateClassArray(new FinalizableSlimObject[iterations]); + // Real test + iterations = (int)(IterationCount*speedFactor) / 10 * 10; + using (TestLog.InfoRegion("Object allocation")) { + TestHelper.CollectGarbage(); + using (TestLog.InfoRegion("Allocation to nothing")) { + using (new Measurement("SlimObject", MeasurementOptions.Log, iterations)) + AllocateClass_SlimObject(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("SlimObject (using FormatterServices)", MeasurementOptions.Log, iterations)) + AllocateClass_SlimObject_ByFormatterServices(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("FinalizableSlimObject", MeasurementOptions.Log, iterations)) + AllocateClass_FinalizableSlimObject(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("SlimObject, generic", MeasurementOptions.Log, iterations)) + AllocateClass(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("FinalizableSlimObject, generic", MeasurementOptions.Log, iterations)) + AllocateClass(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("InheritedObject3", MeasurementOptions.Log, iterations)) + AllocateClass_InheritedObject3(iterations); + TestHelper.CollectGarbage(); + } + using (TestLog.InfoRegion("Allocation to array")) { + using (new Measurement("SlimObject", MeasurementOptions.Log, iterations)) + AllocateClassArray_SlimObject(new SlimObject[iterations]); + TestHelper.CollectGarbage(); + using (new Measurement("FinalizableSlimObject", MeasurementOptions.Log, iterations)) + AllocateClassArray_FinalizableSlimObject(new FinalizableSlimObject[iterations]); + TestHelper.CollectGarbage(); + using (new Measurement("SlimObject, generic", MeasurementOptions.Log, iterations)) + AllocateClassArray(new SlimObject[iterations]); + TestHelper.CollectGarbage(); + using (new Measurement("FinalizableSlimObject, generic", MeasurementOptions.Log, iterations)) + AllocateClassArray(new FinalizableSlimObject[iterations]); + TestHelper.CollectGarbage(); + using (new Measurement("InheritedObject3", MeasurementOptions.Log, iterations)) + AllocateClassArray_InheritedObject3(new InheritedObject3[iterations]); + TestHelper.CollectGarbage(); + } + } + } + + private void TestStructAllocation(double speedFactor) + { + // Warmup + int iterations = 100; + AllocateStructArray_SlimStruct(iterations); + AllocateStructArray(iterations); + AllocateBoxedStructArray_SlimStruct(new object[iterations]); + AllocateBoxedStructArray(new object[iterations]); + // Real test + iterations = (int)(IterationCount*speedFactor) / 10 * 10; + using (TestLog.InfoRegion("Struct allocation")) { + TestHelper.CollectGarbage(); + using (TestLog.InfoRegion("Allocation of array")) { + using (new Measurement("SlimStruct", MeasurementOptions.Log, iterations)) + AllocateStructArray_SlimStruct(iterations); + TestHelper.CollectGarbage(); + using (new Measurement("SlimStruct, generic", MeasurementOptions.Log, iterations)) + AllocateStructArray(iterations); + TestHelper.CollectGarbage(); + } + using (TestLog.InfoRegion("Allocation of array with boxing")) { + using (new Measurement("SlimStruct", MeasurementOptions.Log, iterations)) + AllocateBoxedStructArray_SlimStruct(new object[iterations]); + TestHelper.CollectGarbage(); + using (new Measurement("SlimStruct, generic", MeasurementOptions.Log, iterations)) + AllocateBoxedStructArray(new object[iterations]); + TestHelper.CollectGarbage(); + } + } + } + + private void AllocateClass_SlimObject(int iterationCount) + { + for (int i = 0; i(int iterationCount) + where T: class, new() + { + for (int i = 0; i(T[] array) + where T: class, new() + { + int iterationCount = array.Length; + for (int i = 0; i(int iterationCount) + where T: struct + { + object o = new T[iterationCount]; + } + + private void AllocateBoxedStructArray_SlimStruct(object[] array) + { + int iterationCount = array.Length; + for (int i = 0; i(object[] array) + where T: struct + { + int iterationCount = array.Length; + for (int i = 0; i - { - T Value { get; set; } - T GetValue(); - void GenericMethod1(); - void GenericMethod2(); - } - - public abstract class ContainerBase - { - public abstract T Value { get; set; } - public abstract T GetValue(); - public abstract object BoxedValue { get; set; } - public abstract void GenericMethod1(); - public abstract void GenericMethod2(); - } - - public sealed class Container: ContainerBase, IContainer - { - private T value; - - T IContainer.Value { - get { return value; } - set { this.value = value; } - } - - public override T Value { - get { return value; } - set { this.value = value; } - } - - public override T GetValue() - { - return value; - } - - public override object BoxedValue { - get { return value; } - set { this.value = (T)value; } - } - - public void Method() - { - } - - public void Method1() - { - } - - public void Method2() - { - } - - public override void GenericMethod1() - { - } - - public override void GenericMethod2() - { - } - - public Container(T value) - { - this.value = value; - } - } - - public class Caller - { - private IContainer container; - - public virtual void GetContainerValue() - { - container.GetValue(); - } - - public Caller(IContainer container) - { - this.container = container; - } - } - - [TestFixture] - public class CallTest - { - public class FastCache - { - public static IContainer Value; - } - - private bool isRegularTestRunning; - public const int IterationCount = 10000000; - - [Test] - public void RegularTest() - { - isRegularTestRunning = true; - Test(0.01); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - isRegularTestRunning = false; - Test(1); - } - - [Test] - [Explicit] - [Category("Profile")] - public void ProfileTest() - { - isRegularTestRunning = false; - GVMethod1CallTest(1); - GVMethod1CallTest(1); - } - - public virtual int? DefaultNullableMethod() - { - return null; - } - - public virtual int? NullableMethod(int i) - { - var result = new int?(i); - return result; - } - - [Test] - public void NullableResultMethodTest() - { - using (new Measurement("Default int?", IterationCount)) - for (int i = 0; i < IterationCount; i++) { - var result = DefaultNullableMethod(); - } - - using (new Measurement("New instance int?", IterationCount)) - for (int i = 0; i < IterationCount; i++) { - var result = NullableMethod(i); - } - } - - public void Test(double speedFactor) - { - MethodCallTest(1*speedFactor); - GMethod1CallTest(1*speedFactor); - GMethod2CallTest(1*speedFactor); - VMethodCallTest(1*speedFactor); - VMethodCallTest(1*speedFactor); - VMethodCallTest(1*speedFactor); -// VMethodCallTest(1*speedFactor); -// VMethodCallTest(0.5*speedFactor); -// VMethodCallTest>(0.2*speedFactor); - VMethodCallTest, Pair>>(0.1*speedFactor); - VMethodCallTest(0.3*speedFactor); - GVMethod1CallTest(0.5*speedFactor); - GVMethod1CallTest(0.5*speedFactor); - GVMethod2CallTest(0.25*speedFactor); - GVMethod2CallTest(0.25*speedFactor); - } - - private void MethodCallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - Container c = new Container(o); - Action a = c.Method; - // Warmup - int iterations = 100; - CallClassMethod(c, iterations); - a.Invoke(); - CastClassMethod(c, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Regular call test:"); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (Orm.Logging.IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Method ", MeasurementOptions.Log, iterations)) - CallClassMethod(c, iterations); - // Cleanup(); - using (new Measurement("Method (by delegate)", MeasurementOptions.Log, iterations)) - CallAction(a, iterations); - // Cleanup(); - using (new Measurement("Method cast ", MeasurementOptions.Log, iterations)) - CastClassMethod(c, iterations); - Cleanup(); - } - } - - private void GMethod1CallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - Container c = new Container(o); - Action a = c.Method1; - // Warmup - int iterations = 100; - CallClassGMethod1(c, iterations); - a.Invoke(); - CastClassGMethod1(c, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Regular call test (1 generic argument: {0}):", typeof(T1).GetShortName()); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Method 1 ", MeasurementOptions.Log, iterations)) - CallClassGMethod1(c, iterations); - // Cleanup(); - using (new Measurement("Method 1 (by delegate)", MeasurementOptions.Log, iterations)) - CallAction(a, iterations); - // Cleanup(); - using (new Measurement("Method 1 cast ", MeasurementOptions.Log, iterations)) - CastClassGMethod1(c, iterations); - Cleanup(); - } - } - - private void GMethod2CallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - Container c = new Container(o); - Action a = c.Method2; - // Warmup - int iterations = 100; - CallClassGMethod2(c, iterations); - a.Invoke(); - CastClassGMethod2(c, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Regular call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName()); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Method 2 ", MeasurementOptions.Log, iterations)) - CallClassGMethod2(c, iterations); - // Cleanup(); - using (new Measurement("Method 2 (by delegate)", MeasurementOptions.Log, iterations)) - CallAction(a, iterations); - // Cleanup(); - using (new Measurement("Method 2 cast ", MeasurementOptions.Log, iterations)) - CastClassGMethod2(c, iterations); - Cleanup(); - } - } - - private void VMethodCallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - ContainerBase c = new Container(o); - IContainer ic = (IContainer)c; - // Warmup - int iterations = 100; - FastCache.Value = null; - CallClassVMethod(c, iterations); - CallClassVMethod_WithBoxing(c, iterations); - CallInterfaceVMethod(ic, iterations); - CallInterfaceVMethod_WithoutCaching(ic, iterations); - CallInterfaceVMethod_WithCast(c, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Virtual call test:"); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Virtual method (typed) ", MeasurementOptions.Log, iterations)) - CallClassVMethod(c, iterations); - // Cleanup(); - using (new Measurement("Virtual method (with boxing) ", MeasurementOptions.Log, iterations)) - CallClassVMethod_WithBoxing(c, iterations); - Cleanup(); - using (new Measurement("Virtual method cast ", MeasurementOptions.Log, iterations)) - CastClassVMethod(c, iterations); - Cleanup(); - using (new Measurement("Interface method ", MeasurementOptions.Log, iterations)) - CallInterfaceVMethod(ic, iterations); - Cleanup(); - using (new Measurement("Interface method (worst case) ", MeasurementOptions.Log, iterations)) - CallInterfaceVMethod_WithoutCaching(ic, iterations); - Cleanup(); - using (new Measurement("Interface method (with cast) ", MeasurementOptions.Log, iterations)) - CallInterfaceVMethod_WithCast(c, iterations); - Cleanup(); - using (new Measurement("Interface method cast ", MeasurementOptions.Log, iterations)) - CastInterfaceVMethod(ic, iterations); - Cleanup(); - } - } - - private void GVMethod1CallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - ContainerBase c = new Container(o); - IContainer ic = (IContainer)c; - Action a1 = c.GenericMethod1; - Action a2 = ic.GenericMethod1; - // Warmup - int iterations = 100; - CallClassGVMethod1(c, iterations); - CallInterfaceGVMethod1(ic, iterations); - a1.Invoke(); - a2.Invoke(); - CastClassGVMethod1(c, iterations); - CastInterfaceGVMethod1(ic, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Virtual generic call test (1 generic argument: {0}):", typeof(T1).GetShortName()); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Generic method 1 (class) ", MeasurementOptions.Log, iterations)) - CallClassGVMethod1(c, iterations); - // Cleanup(); - using (new Measurement("Generic method 1 (class, by delegate) ", MeasurementOptions.Log, iterations)) - CallAction(a1, iterations); - // Cleanup(); - using (new Measurement("Generic method 1 cast (class) ", MeasurementOptions.Log, iterations)) - CastClassGVMethod1(c, iterations); - Cleanup(); - using (new Measurement("Generic method 1 (interface) ", MeasurementOptions.Log, iterations)) - CallInterfaceGVMethod1(ic, iterations); - // Cleanup(); - using (new Measurement("Generic method 1 (interface, by delegate)", MeasurementOptions.Log, iterations)) - CallAction(a2, iterations); - // Cleanup(); - using (new Measurement("Generic method 1 cast (interface) ", MeasurementOptions.Log, iterations)) - CastInterfaceGVMethod1(ic, iterations); - Cleanup(); - } - } - - private void GVMethod2CallTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - ContainerBase c = new Container(o); - IContainer ic = (IContainer)c; - Action a1 = c.GenericMethod2; - Action a2 = ic.GenericMethod2; - // Warmup - int iterations = 100; - CallClassGVMethod2(c, iterations); - CallInterfaceGVMethod2(ic, iterations); - a1.Invoke(); - a2.Invoke(); - CastClassGVMethod2(c, iterations); - CastInterfaceGVMethod2(ic, iterations); - // Real test - iterations = (int)(IterationCount*speedFactor); - TestLog.Info("Virtual generic call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName()); - TestLog.Info(" Type: {0}", typeof(T).GetShortName()); - FastCache.Value = null; - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("Generic method 2 (class) ", MeasurementOptions.Log, iterations)) - CallClassGVMethod2(c, iterations); - // Cleanup(); - using (new Measurement("Generic method 2 (class, by delegate) ", MeasurementOptions.Log, iterations)) - CallAction(a1, iterations); - // Cleanup(); - using (new Measurement("Generic method 2 cast (class) ", MeasurementOptions.Log, iterations)) - CastClassGVMethod2(c, iterations); - Cleanup(); - using (new Measurement("Generic method 2 (interface) ", MeasurementOptions.Log, iterations)) - CallInterfaceGVMethod2(ic, iterations); - // Cleanup(); - using (new Measurement("Generic method 2 (interface, by delegate)", MeasurementOptions.Log, iterations)) - CallAction(a2, iterations); - // Cleanup(); - using (new Measurement("Generic method 2 cast (interface) ", MeasurementOptions.Log, iterations)) - CastInterfaceGVMethod2(ic, iterations); - Cleanup(); - } - } - - private void CallAction(Action a, int count) - { - for (int i = 0; i(Container c, int count) - { - for (int i = 0; i(Container c, int count) - { - Action a; - for (int i = 0; i(Container c, int count) - { - for (int i = 0; i(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - c.Method1(); - } - } - - private void CastClassGMethod1(Container c, int count) - { - Action a; - for (int i = 0; i; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - a = c.Method1; - } - } - - private void CallClassGMethod2(Container c, int count) - { - for (int i = 0; i(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - c.Method2(); - } - } - - private void CastClassGMethod2(Container c, int count) - { - Action a; - for (int i = 0; i; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - a = c.Method2; - } - } - - private void CallClassVMethod(ContainerBase c, int count) - { - T o; - for (int i = 0; i(ContainerBase c, int count) - { - Func f; - for (int i = 0; i(ContainerBase c, int count) - { - T o; - for (int i = 0; i(IContainer c, int count) - { - T o; - for (int i = 0; i(IContainer c, int count) - { - var caller = new Caller(c); - for (int i = 0; i(IContainer c, int count) - { - Func f; - for (int i = 0; i(ContainerBase c, int count) - { - IContainer ic; - T o; - for (int i = 0; i)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - ic = (IContainer)c; - o = ic.Value; - } - } - - private void CallClassGVMethod1(ContainerBase c, int count) - { - for (int i = 0; i(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - } - } - - private void CastClassGVMethod1(ContainerBase c, int count) - { - Action a; - for (int i = 0; i; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - } - } - - private void CallInterfaceGVMethod1(IContainer c, int count) - { - for (int i = 0; i(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - c.GenericMethod1(); - } - } - - private void CastInterfaceGVMethod1(IContainer c, int count) - { - Action a; - for (int i = 0; i; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - a = c.GenericMethod1; - } - } - - private void CallClassGVMethod2(ContainerBase c, int count) - { - for (int i = 0; i(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - } - } - - private void CastClassGVMethod2(ContainerBase c, int count) - { - Action a; - for (int i = 0; i; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - } - } - - private void CallInterfaceGVMethod2(IContainer c, int count) - { - for (int i = 0; i(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - c.GenericMethod2(); - } - } - - private void CastInterfaceGVMethod2(IContainer c, int count) - { - Action a; - for (int i = 0; i; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - a = c.GenericMethod2; - } - } - - private void Cleanup() - { - int baseSleepTime = 100; - if (isRegularTestRunning) - baseSleepTime = 1; - - for (int i = 0; i<5; i++) { - GC.GetTotalMemory(true); - Thread.Sleep(baseSleepTime); - } - Thread.Sleep(5*baseSleepTime); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.29 + +using System; +using System.Threading; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Logging; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + public interface IContainer + { + T Value { get; set; } + T GetValue(); + void GenericMethod1(); + void GenericMethod2(); + } + + public abstract class ContainerBase + { + public abstract T Value { get; set; } + public abstract T GetValue(); + public abstract object BoxedValue { get; set; } + public abstract void GenericMethod1(); + public abstract void GenericMethod2(); + } + + public sealed class Container: ContainerBase, IContainer + { + private T value; + + T IContainer.Value { + get { return value; } + set { this.value = value; } + } + + public override T Value { + get { return value; } + set { this.value = value; } + } + + public override T GetValue() + { + return value; + } + + public override object BoxedValue { + get { return value; } + set { this.value = (T)value; } + } + + public void Method() + { + } + + public void Method1() + { + } + + public void Method2() + { + } + + public override void GenericMethod1() + { + } + + public override void GenericMethod2() + { + } + + public Container(T value) + { + this.value = value; + } + } + + public class Caller + { + private IContainer container; + + public virtual void GetContainerValue() + { + container.GetValue(); + } + + public Caller(IContainer container) + { + this.container = container; + } + } + + [TestFixture] + public class CallTest + { + public class FastCache + { + public static IContainer Value; + } + + private bool isRegularTestRunning; + public const int IterationCount = 10000000; + + [Test] + public void RegularTest() + { + isRegularTestRunning = true; + Test(0.01); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PeformanceTest() + { + isRegularTestRunning = false; + Test(1); + } + + [Test] + [Explicit] + [Category("Profile")] + public void ProfileTest() + { + isRegularTestRunning = false; + GVMethod1CallTest(1); + GVMethod1CallTest(1); + } + + public virtual int? DefaultNullableMethod() + { + return null; + } + + public virtual int? NullableMethod(int i) + { + var result = new int?(i); + return result; + } + + [Test] + public void NullableResultMethodTest() + { + using (new Measurement("Default int?", IterationCount)) + for (int i = 0; i < IterationCount; i++) { + var result = DefaultNullableMethod(); + } + + using (new Measurement("New instance int?", IterationCount)) + for (int i = 0; i < IterationCount; i++) { + var result = NullableMethod(i); + } + } + + public void Test(double speedFactor) + { + MethodCallTest(1*speedFactor); + GMethod1CallTest(1*speedFactor); + GMethod2CallTest(1*speedFactor); + VMethodCallTest(1*speedFactor); + VMethodCallTest(1*speedFactor); + VMethodCallTest(1*speedFactor); +// VMethodCallTest(1*speedFactor); +// VMethodCallTest(0.5*speedFactor); +// VMethodCallTest>(0.2*speedFactor); + VMethodCallTest, Pair>>(0.1*speedFactor); + VMethodCallTest(0.3*speedFactor); + GVMethod1CallTest(0.5*speedFactor); + GVMethod1CallTest(0.5*speedFactor); + GVMethod2CallTest(0.25*speedFactor); + GVMethod2CallTest(0.25*speedFactor); + } + + private void MethodCallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + Container c = new Container(o); + Action a = c.Method; + // Warmup + int iterations = 100; + CallClassMethod(c, iterations); + a.Invoke(); + CastClassMethod(c, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Regular call test:"); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (Orm.Logging.IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Method ", MeasurementOptions.Log, iterations)) + CallClassMethod(c, iterations); + // Cleanup(); + using (new Measurement("Method (by delegate)", MeasurementOptions.Log, iterations)) + CallAction(a, iterations); + // Cleanup(); + using (new Measurement("Method cast ", MeasurementOptions.Log, iterations)) + CastClassMethod(c, iterations); + Cleanup(); + } + } + + private void GMethod1CallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + Container c = new Container(o); + Action a = c.Method1; + // Warmup + int iterations = 100; + CallClassGMethod1(c, iterations); + a.Invoke(); + CastClassGMethod1(c, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Regular call test (1 generic argument: {0}):", typeof(T1).GetShortName()); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Method 1 ", MeasurementOptions.Log, iterations)) + CallClassGMethod1(c, iterations); + // Cleanup(); + using (new Measurement("Method 1 (by delegate)", MeasurementOptions.Log, iterations)) + CallAction(a, iterations); + // Cleanup(); + using (new Measurement("Method 1 cast ", MeasurementOptions.Log, iterations)) + CastClassGMethod1(c, iterations); + Cleanup(); + } + } + + private void GMethod2CallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + Container c = new Container(o); + Action a = c.Method2; + // Warmup + int iterations = 100; + CallClassGMethod2(c, iterations); + a.Invoke(); + CastClassGMethod2(c, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Regular call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName()); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Method 2 ", MeasurementOptions.Log, iterations)) + CallClassGMethod2(c, iterations); + // Cleanup(); + using (new Measurement("Method 2 (by delegate)", MeasurementOptions.Log, iterations)) + CallAction(a, iterations); + // Cleanup(); + using (new Measurement("Method 2 cast ", MeasurementOptions.Log, iterations)) + CastClassGMethod2(c, iterations); + Cleanup(); + } + } + + private void VMethodCallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + ContainerBase c = new Container(o); + IContainer ic = (IContainer)c; + // Warmup + int iterations = 100; + FastCache.Value = null; + CallClassVMethod(c, iterations); + CallClassVMethod_WithBoxing(c, iterations); + CallInterfaceVMethod(ic, iterations); + CallInterfaceVMethod_WithoutCaching(ic, iterations); + CallInterfaceVMethod_WithCast(c, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Virtual call test:"); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Virtual method (typed) ", MeasurementOptions.Log, iterations)) + CallClassVMethod(c, iterations); + // Cleanup(); + using (new Measurement("Virtual method (with boxing) ", MeasurementOptions.Log, iterations)) + CallClassVMethod_WithBoxing(c, iterations); + Cleanup(); + using (new Measurement("Virtual method cast ", MeasurementOptions.Log, iterations)) + CastClassVMethod(c, iterations); + Cleanup(); + using (new Measurement("Interface method ", MeasurementOptions.Log, iterations)) + CallInterfaceVMethod(ic, iterations); + Cleanup(); + using (new Measurement("Interface method (worst case) ", MeasurementOptions.Log, iterations)) + CallInterfaceVMethod_WithoutCaching(ic, iterations); + Cleanup(); + using (new Measurement("Interface method (with cast) ", MeasurementOptions.Log, iterations)) + CallInterfaceVMethod_WithCast(c, iterations); + Cleanup(); + using (new Measurement("Interface method cast ", MeasurementOptions.Log, iterations)) + CastInterfaceVMethod(ic, iterations); + Cleanup(); + } + } + + private void GVMethod1CallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + ContainerBase c = new Container(o); + IContainer ic = (IContainer)c; + Action a1 = c.GenericMethod1; + Action a2 = ic.GenericMethod1; + // Warmup + int iterations = 100; + CallClassGVMethod1(c, iterations); + CallInterfaceGVMethod1(ic, iterations); + a1.Invoke(); + a2.Invoke(); + CastClassGVMethod1(c, iterations); + CastInterfaceGVMethod1(ic, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Virtual generic call test (1 generic argument: {0}):", typeof(T1).GetShortName()); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Generic method 1 (class) ", MeasurementOptions.Log, iterations)) + CallClassGVMethod1(c, iterations); + // Cleanup(); + using (new Measurement("Generic method 1 (class, by delegate) ", MeasurementOptions.Log, iterations)) + CallAction(a1, iterations); + // Cleanup(); + using (new Measurement("Generic method 1 cast (class) ", MeasurementOptions.Log, iterations)) + CastClassGVMethod1(c, iterations); + Cleanup(); + using (new Measurement("Generic method 1 (interface) ", MeasurementOptions.Log, iterations)) + CallInterfaceGVMethod1(ic, iterations); + // Cleanup(); + using (new Measurement("Generic method 1 (interface, by delegate)", MeasurementOptions.Log, iterations)) + CallAction(a2, iterations); + // Cleanup(); + using (new Measurement("Generic method 1 cast (interface) ", MeasurementOptions.Log, iterations)) + CastInterfaceGVMethod1(ic, iterations); + Cleanup(); + } + } + + private void GVMethod2CallTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + ContainerBase c = new Container(o); + IContainer ic = (IContainer)c; + Action a1 = c.GenericMethod2; + Action a2 = ic.GenericMethod2; + // Warmup + int iterations = 100; + CallClassGVMethod2(c, iterations); + CallInterfaceGVMethod2(ic, iterations); + a1.Invoke(); + a2.Invoke(); + CastClassGVMethod2(c, iterations); + CastInterfaceGVMethod2(ic, iterations); + // Real test + iterations = (int)(IterationCount*speedFactor); + TestLog.Info("Virtual generic call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName()); + TestLog.Info(" Type: {0}", typeof(T).GetShortName()); + FastCache.Value = null; + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("Generic method 2 (class) ", MeasurementOptions.Log, iterations)) + CallClassGVMethod2(c, iterations); + // Cleanup(); + using (new Measurement("Generic method 2 (class, by delegate) ", MeasurementOptions.Log, iterations)) + CallAction(a1, iterations); + // Cleanup(); + using (new Measurement("Generic method 2 cast (class) ", MeasurementOptions.Log, iterations)) + CastClassGVMethod2(c, iterations); + Cleanup(); + using (new Measurement("Generic method 2 (interface) ", MeasurementOptions.Log, iterations)) + CallInterfaceGVMethod2(ic, iterations); + // Cleanup(); + using (new Measurement("Generic method 2 (interface, by delegate)", MeasurementOptions.Log, iterations)) + CallAction(a2, iterations); + // Cleanup(); + using (new Measurement("Generic method 2 cast (interface) ", MeasurementOptions.Log, iterations)) + CastInterfaceGVMethod2(ic, iterations); + Cleanup(); + } + } + + private void CallAction(Action a, int count) + { + for (int i = 0; i(Container c, int count) + { + for (int i = 0; i(Container c, int count) + { + Action a; + for (int i = 0; i(Container c, int count) + { + for (int i = 0; i(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + c.Method1(); + } + } + + private void CastClassGMethod1(Container c, int count) + { + Action a; + for (int i = 0; i; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + a = c.Method1; + } + } + + private void CallClassGMethod2(Container c, int count) + { + for (int i = 0; i(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + c.Method2(); + } + } + + private void CastClassGMethod2(Container c, int count) + { + Action a; + for (int i = 0; i; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + a = c.Method2; + } + } + + private void CallClassVMethod(ContainerBase c, int count) + { + T o; + for (int i = 0; i(ContainerBase c, int count) + { + Func f; + for (int i = 0; i(ContainerBase c, int count) + { + T o; + for (int i = 0; i(IContainer c, int count) + { + T o; + for (int i = 0; i(IContainer c, int count) + { + var caller = new Caller(c); + for (int i = 0; i(IContainer c, int count) + { + Func f; + for (int i = 0; i(ContainerBase c, int count) + { + IContainer ic; + T o; + for (int i = 0; i)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + ic = (IContainer)c; + o = ic.Value; + } + } + + private void CallClassGVMethod1(ContainerBase c, int count) + { + for (int i = 0; i(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + } + } + + private void CastClassGVMethod1(ContainerBase c, int count) + { + Action a; + for (int i = 0; i; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + } + } + + private void CallInterfaceGVMethod1(IContainer c, int count) + { + for (int i = 0; i(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + c.GenericMethod1(); + } + } + + private void CastInterfaceGVMethod1(IContainer c, int count) + { + Action a; + for (int i = 0; i; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + a = c.GenericMethod1; + } + } + + private void CallClassGVMethod2(ContainerBase c, int count) + { + for (int i = 0; i(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + } + } + + private void CastClassGVMethod2(ContainerBase c, int count) + { + Action a; + for (int i = 0; i; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + } + } + + private void CallInterfaceGVMethod2(IContainer c, int count) + { + for (int i = 0; i(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + c.GenericMethod2(); + } + } + + private void CastInterfaceGVMethod2(IContainer c, int count) + { + Action a; + for (int i = 0; i; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + a = c.GenericMethod2; + } + } + + private void Cleanup() + { + int baseSleepTime = 100; + if (isRegularTestRunning) + baseSleepTime = 1; + + for (int i = 0; i<5; i++) { + GC.GetTotalMemory(true); + Thread.Sleep(baseSleepTime); + } + Thread.Sleep(5*baseSleepTime); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CastTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CastTest.cs index 4ac9ce42b6..37bef44b01 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CastTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CastTest.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.11.21 - -using System; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class CastTest - { - private interface IInterface - { - int InterfaceMethod(); - } - - private class Root - { - public int Method() - { - return 0; - } - } - - private class Derived : Root, IInterface - { - public int InterfaceMethod() - { - return 1; - } - } - - private const int operationsCount = (int)1E6; - - [Test] - public void Test() - { - Console.Out.WriteLine("Warmup..."); - InternalTest(10); - Console.Out.WriteLine("Testing..."); - InternalTest(operationsCount); - } - - private void InternalTest(int count) - { - object o = new Derived(); - Func func = i => i; - Delegate d = func; - - using(new Measurement("Checking cast to class", count)) { - for (int i = 0; i < count; i++) { - var result = o is Root; - } - } - using(new Measurement("Casting to class", count)) { - for (int i = 0; i < count; i++) { - var root = o as Root; - } - } - using(new Measurement("Casting to interface", count)) { - for (int i = 0; i < count; i++) { - var iInterface = o as IInterface; - } - } - using(new Measurement("Casting delegates", count)) { - for (int i = 0; i < count; i++) { - var result = d as Func; - } - } - using(new Measurement("Casting to class and null-check", count)) { - for (int i = 0; i < count; i++) { - var root = o as Root; - if (root == null) - throw new InvalidCastException(); - } - } - using(new Measurement("Casting to interface and null-check", count)) { - for (int i = 0; i < count; i++) { - var iInterface = o as IInterface; - if (iInterface == null) - throw new InvalidCastException(); - } - } - using(new Measurement("Casting delegates and null-check", count)) { - for (int i = 0; i < count; i++) { - var result = d as Func; - if (result == null) - throw new InvalidCastException(); - } - } - using(new Measurement("Explicit casting to class", count)) { - for (int i = 0; i < count; i++) { - var root = (Root)o; - } - } - using(new Measurement("Explicit casting to interface", count)) { - for (int i = 0; i < count; i++) { - var iInterface = (IInterface)o; - } - } - using(new Measurement("Explicit casting delegates", count)) { - for (int i = 0; i < count; i++) { - var result = (Func)d; - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.11.21 + +using System; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class CastTest + { + private interface IInterface + { + int InterfaceMethod(); + } + + private class Root + { + public int Method() + { + return 0; + } + } + + private class Derived : Root, IInterface + { + public int InterfaceMethod() + { + return 1; + } + } + + private const int operationsCount = (int)1E6; + + [Test] + public void Test() + { + Console.Out.WriteLine("Warmup..."); + InternalTest(10); + Console.Out.WriteLine("Testing..."); + InternalTest(operationsCount); + } + + private void InternalTest(int count) + { + object o = new Derived(); + Func func = i => i; + Delegate d = func; + + using(new Measurement("Checking cast to class", count)) { + for (int i = 0; i < count; i++) { + var result = o is Root; + } + } + using(new Measurement("Casting to class", count)) { + for (int i = 0; i < count; i++) { + var root = o as Root; + } + } + using(new Measurement("Casting to interface", count)) { + for (int i = 0; i < count; i++) { + var iInterface = o as IInterface; + } + } + using(new Measurement("Casting delegates", count)) { + for (int i = 0; i < count; i++) { + var result = d as Func; + } + } + using(new Measurement("Casting to class and null-check", count)) { + for (int i = 0; i < count; i++) { + var root = o as Root; + if (root == null) + throw new InvalidCastException(); + } + } + using(new Measurement("Casting to interface and null-check", count)) { + for (int i = 0; i < count; i++) { + var iInterface = o as IInterface; + if (iInterface == null) + throw new InvalidCastException(); + } + } + using(new Measurement("Casting delegates and null-check", count)) { + for (int i = 0; i < count; i++) { + var result = d as Func; + if (result == null) + throw new InvalidCastException(); + } + } + using(new Measurement("Explicit casting to class", count)) { + for (int i = 0; i < count; i++) { + var root = (Root)o; + } + } + using(new Measurement("Explicit casting to interface", count)) { + for (int i = 0; i < count; i++) { + var iInterface = (IInterface)o; + } + } + using(new Measurement("Explicit casting delegates", count)) { + for (int i = 0; i < count; i++) { + var result = (Func)d; + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CloningTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CloningTest.cs index d8f479879f..0db3920df0 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CloningTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CloningTest.cs @@ -1,148 +1,148 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.24 - -using System; -using System.Threading; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - public class Cloneable - { - public T Value; - - public Cloneable CloneByMC() - { - return (Cloneable) MemberwiseClone(); - } - - public Cloneable CloneByC() - { - return new Cloneable(this); - } - - public Cloneable(T value) - { - Value = value; - } - - public Cloneable(Cloneable source) - { - Value = source.Value; - } - } - - - [TestFixture] - public class CloningTest - { - private bool isRegularTestRunning; - public const int CloneTestArrayLength = 1000000; - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - isRegularTestRunning = false; - Test(1); - } - - [Test] - public void RegularTest() - { - isRegularTestRunning = true; - Test(0.01); - } - - public void Test(double speedFactor) - { - CloneTest(1*speedFactor); - CloneTest(1*speedFactor); - CloneTest(1*speedFactor); - CloneTest(1*speedFactor); - CloneTest(0.5*speedFactor); - CloneTest>(0.2*speedFactor); - CloneTest, Pair>>(0.1*speedFactor); - CloneTest(0.3*speedFactor); - } - - private void CloneTest(double speedFactor) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - Cloneable c = new Cloneable(o); - // Warmup - Cloneable[] a = new Cloneable[100]; - CloneByMCLoop(c, a); - CloneByCLoop(c, a); - // Real test - a = new Cloneable[(int)(CloneTestArrayLength*speedFactor / 10 * 10)]; - TestLog.Info("Cloning test:"); - TestLog.Info(" Type: {0}, length: {1}", c.GetType().GetShortName(), a.Length); - using (IndentManager.IncreaseIndent()) { - Cleanup(); - using (new Measurement("MemberwiseClone ", MeasurementOptions.Log, a.Length)) - CloneByMCLoop(c, a); - Cleanup(); - using (new Measurement("CopyingConstructor", MeasurementOptions.Log, a.Length)) - CloneByCLoop(c, a); - Cleanup(); - } - } - - private void CloneByMCLoop(Cloneable c, Cloneable[] a) - { - int count = a.Length; - for (int i = 0; i(Cloneable c, Cloneable[] a) - { - int count = a.Length; - for (int i = 0; i + { + public T Value; + + public Cloneable CloneByMC() + { + return (Cloneable) MemberwiseClone(); + } + + public Cloneable CloneByC() + { + return new Cloneable(this); + } + + public Cloneable(T value) + { + Value = value; + } + + public Cloneable(Cloneable source) + { + Value = source.Value; + } + } + + + [TestFixture] + public class CloningTest + { + private bool isRegularTestRunning; + public const int CloneTestArrayLength = 1000000; + + [Test] + [Explicit] + [Category("Performance")] + public void PeformanceTest() + { + isRegularTestRunning = false; + Test(1); + } + + [Test] + public void RegularTest() + { + isRegularTestRunning = true; + Test(0.01); + } + + public void Test(double speedFactor) + { + CloneTest(1*speedFactor); + CloneTest(1*speedFactor); + CloneTest(1*speedFactor); + CloneTest(1*speedFactor); + CloneTest(0.5*speedFactor); + CloneTest>(0.2*speedFactor); + CloneTest, Pair>>(0.1*speedFactor); + CloneTest(0.3*speedFactor); + } + + private void CloneTest(double speedFactor) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + Cloneable c = new Cloneable(o); + // Warmup + Cloneable[] a = new Cloneable[100]; + CloneByMCLoop(c, a); + CloneByCLoop(c, a); + // Real test + a = new Cloneable[(int)(CloneTestArrayLength*speedFactor / 10 * 10)]; + TestLog.Info("Cloning test:"); + TestLog.Info(" Type: {0}, length: {1}", c.GetType().GetShortName(), a.Length); + using (IndentManager.IncreaseIndent()) { + Cleanup(); + using (new Measurement("MemberwiseClone ", MeasurementOptions.Log, a.Length)) + CloneByMCLoop(c, a); + Cleanup(); + using (new Measurement("CopyingConstructor", MeasurementOptions.Log, a.Length)) + CloneByCLoop(c, a); + Cleanup(); + } + } + + private void CloneByMCLoop(Cloneable c, Cloneable[] a) + { + int count = a.Length; + for (int i = 0; i(Cloneable c, Cloneable[] a) + { + int count = a.Length; + for (int i = 0; i - { - bool IsCorrect(T value); - } - - public abstract class Constraint : IConstraint - { - public abstract bool IsCorrect(T value); - } - - public class GenericIntConstraint : Constraint - { - public override bool IsCorrect(int value) - { - return value < 100; - } - } - - public class GenericStringConstraint : IConstraint - { - public virtual bool IsCorrect(string value) - { - return string.IsNullOrEmpty(value); - } - } - - public void TestBoxingInt(IConstraint constraint, int count) - { - for (int j = 0; j) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - ((IConstraint) constraint).IsCorrect(i); - } - } - - public void TestGenericString(object constraint, int count) - { - for (int i = 0; i) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - ((IConstraint) constraint).IsCorrect(s); - } - } - - [Test] - [Explicit] - [Category("Performance")] - public void Test() - { - const int iterations = 100000; - - using (new Measurement("Boxing int ", MeasurementOptions.Log, iterations * 10)) { - - Constraint constraint = new IntConstraint(); - TestBoxingInt(constraint, iterations); - } - - using (new Measurement("Generic int", MeasurementOptions.Log, iterations * 10)) { - - object constraint = new GenericIntConstraint(); - TestGenericInt(constraint, iterations); - } - - using (new Measurement("Boxing string ", MeasurementOptions.Log, iterations * 10)) { - - Constraint constraint = new StringConstraint(); - TestBoxingString(constraint, iterations); - } - - using (new Measurement("Generic string", MeasurementOptions.Log, iterations * 10 )) { - - object constraint = new GenericStringConstraint(); - TestGenericString(constraint, iterations); - } - } - } -} +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class ConstraintsTest + { + public interface IConstraint + { + bool IsCorrect(object value); + } + + public abstract class Constraint : IConstraint + { + public abstract bool IsCorrect(object value); + } + + public class IntConstraint : Constraint + { + public override bool IsCorrect(object value) + { + return (int)value < 100; + } + } + + public class StringConstraint : Constraint + { + public override bool IsCorrect(object value) + { + return string.IsNullOrEmpty((string) value); + } + } + + public interface IConstraint + { + bool IsCorrect(T value); + } + + public abstract class Constraint : IConstraint + { + public abstract bool IsCorrect(T value); + } + + public class GenericIntConstraint : Constraint + { + public override bool IsCorrect(int value) + { + return value < 100; + } + } + + public class GenericStringConstraint : IConstraint + { + public virtual bool IsCorrect(string value) + { + return string.IsNullOrEmpty(value); + } + } + + public void TestBoxingInt(IConstraint constraint, int count) + { + for (int j = 0; j) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + ((IConstraint) constraint).IsCorrect(i); + } + } + + public void TestGenericString(object constraint, int count) + { + for (int i = 0; i) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + ((IConstraint) constraint).IsCorrect(s); + } + } + + [Test] + [Explicit] + [Category("Performance")] + public void Test() + { + const int iterations = 100000; + + using (new Measurement("Boxing int ", MeasurementOptions.Log, iterations * 10)) { + + Constraint constraint = new IntConstraint(); + TestBoxingInt(constraint, iterations); + } + + using (new Measurement("Generic int", MeasurementOptions.Log, iterations * 10)) { + + object constraint = new GenericIntConstraint(); + TestGenericInt(constraint, iterations); + } + + using (new Measurement("Boxing string ", MeasurementOptions.Log, iterations * 10)) { + + Constraint constraint = new StringConstraint(); + TestBoxingString(constraint, iterations); + } + + using (new Measurement("Generic string", MeasurementOptions.Log, iterations * 10 )) { + + object constraint = new GenericStringConstraint(); + TestGenericString(constraint, iterations); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CoreFeaturesTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CoreFeaturesTest.cs index a0b0690f84..9a9239f748 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CoreFeaturesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/CoreFeaturesTest.cs @@ -1,728 +1,728 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.04.17 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class CoreFeaturesTest - { - public const int IterationCount = 100000000; - public const int KSize = 1024; - public const int MSize = KSize*1024; - public const int SizeMin = 8 * KSize; - public const int SizeMax = 16 * MSize; - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - Test(1); - } - - [Test] - public void RegularTest() - { - Test(0.01); - } - - private void Test(double speedFactor) - { - // Warmup - TestInt32(100, true); - TestInt64(100, true); - TestDouble(100, true); - TestCast(100, true); - TestArray(100, true); - TestList(100, true); - TestDictionary(100, true); - // Actual tests - int count = (int)(IterationCount * speedFactor); - int sizeMax = TestInfo.IsPerformanceTestRunning ? SizeMax : SizeMax / 8; - TestInt32(count, false); - TestInt64(count, false); - TestDouble(count, false); - TestCast(count, false); - for (int size = SizeMin; size<=sizeMax; size *= 2) { - TestArray(size, false); - TestList(size, false); - TestDictionary(size, false); - } - } - - private void TestInt32(int count, bool warmup) - { - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("int operations")) { - int j = 0; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Empty loop", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i++) { - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Increment int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = i * 0; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = i / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - } - } - } - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Empty loop", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i++) { - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Increment int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = i * 0; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing int", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = i / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - } - } - } - } - } - - private void TestInt64(int count, bool warmup) - { - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("long operations")) { - long j = 0; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Empty loop", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i++) { - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Increment long", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = (long)i * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = (long)i / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - } - } - } - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Empty loop", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i++) { - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Increment long", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - j++; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - j = j + 10; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = (long)i * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - j = j * 3; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing long", MeasurementOptions.Log, count)) { - for (long i = 0; i < count; i+=10) { - j = (long)i / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - j = j / 3; - } - } - } - } - } - - private void TestDouble(int count, bool warmup) - { - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("double operations")) { - double j = 0; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = (double)i * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = (double)i / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - } - } - } - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Adding double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - j = j + 10.0; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Multiplying double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = (double)i * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - j = j * 1.0000000000001; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Dividing double", MeasurementOptions.Log, count)) { - for (int i = 0; i < count; i+=10) { - j = (double)i / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - j = j / 1.0000000000001; - } - } - } - } - } - - private IDisposable EmptyDisposable() - { - return new Disposable(delegate { }); - } - - private void TestCast(int size, bool warmup) - { - size = size / 10 * 10; - // Test - object o = EmptyDisposable(); - object t; - Disposable d = null; - IDisposable id = null; - TestHelper.CollectGarbage(); - using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Casts")) { - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("Box int ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - t = i++; - } - } - TestHelper.CollectGarbage(); - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("To ancestor ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i+=10) { - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - d = (Disposable)o; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("To interface", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i+=10) { - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - id = (IDisposable)o; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("To ancestor (as)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i+=10) { - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - d = o as Disposable; - } - } - using (warmup ? (IDisposable) new Disposable(delegate { }) : - new Measurement("To interface (as)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i+=10) { - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - id = o as IDisposable; - } - } - } - } - - private void TestArray(int size, bool warmup) - { - size = size / 10 * 10; - int[] ints = new int[size]; - IEnumerable eInts = ints; - for (int i = 0; i < size; i++) - ints[i] = i; - // Test - TestHelper.CollectGarbage(); - int j = size; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int array, {0,6}K", (size+10) / KSize))) { - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i++) { - ints[i] = i; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Enumerating ", MeasurementOptions.Log, size)) { - foreach (int k in eInts) { - } - } - } - ints = null; - TestHelper.CollectGarbage(); - } - - private void TestList(int size, bool warmup) - { - size = size / 10 * 10; - List ints = new List(size); - IEnumerable eInts = ints; - for (int i = 0; i < size; i++) - ints.Add(i); - // Test - TestHelper.CollectGarbage(); - int j = size; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int list, {0,6}K", (size+10) / KSize))) { - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i++) { - ints[i] = i; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Enumerating ", MeasurementOptions.Log, size)) { - foreach (int k in eInts) { - } - } - } - ints = null; - TestHelper.CollectGarbage(); - } - - private void TestDictionary(int size, bool warmup) - { - size = size / 10 * 10; - Dictionary ints = new Dictionary(size); - IEnumerable> eInts = ints; - // Test - TestHelper.CollectGarbage(); - int j = size; - using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int dictionary, {0,6}K", (size+10) / KSize))) { - ints.Clear(); - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - ints[i++] = i; - } - } - ints.Clear(); - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; i++) { - ints[i] = i; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { - for (int i = 0; i < size; ) { - j = ints[i++]; - } - } - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Enumerating ", MeasurementOptions.Log, size)) { - foreach (KeyValuePair k in eInts) { - } - } - } - ints = null; - TestHelper.CollectGarbage(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.04.17 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class CoreFeaturesTest + { + public const int IterationCount = 100000000; + public const int KSize = 1024; + public const int MSize = KSize*1024; + public const int SizeMin = 8 * KSize; + public const int SizeMax = 16 * MSize; + + [Test] + [Explicit] + [Category("Performance")] + public void PeformanceTest() + { + Test(1); + } + + [Test] + public void RegularTest() + { + Test(0.01); + } + + private void Test(double speedFactor) + { + // Warmup + TestInt32(100, true); + TestInt64(100, true); + TestDouble(100, true); + TestCast(100, true); + TestArray(100, true); + TestList(100, true); + TestDictionary(100, true); + // Actual tests + int count = (int)(IterationCount * speedFactor); + int sizeMax = TestInfo.IsPerformanceTestRunning ? SizeMax : SizeMax / 8; + TestInt32(count, false); + TestInt64(count, false); + TestDouble(count, false); + TestCast(count, false); + for (int size = SizeMin; size<=sizeMax; size *= 2) { + TestArray(size, false); + TestList(size, false); + TestDictionary(size, false); + } + } + + private void TestInt32(int count, bool warmup) + { + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("int operations")) { + int j = 0; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Empty loop", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i++) { + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Increment int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = i * 0; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = i / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + } + } + } + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Empty loop", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i++) { + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Increment int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = i * 0; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing int", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = i / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + } + } + } + } + } + + private void TestInt64(int count, bool warmup) + { + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("long operations")) { + long j = 0; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Empty loop", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i++) { + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Increment long", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = (long)i * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = (long)i / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + } + } + } + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Empty loop", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i++) { + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Increment long", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + j++; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + j = j + 10; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = (long)i * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + j = j * 3; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing long", MeasurementOptions.Log, count)) { + for (long i = 0; i < count; i+=10) { + j = (long)i / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + j = j / 3; + } + } + } + } + } + + private void TestDouble(int count, bool warmup) + { + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("double operations")) { + double j = 0; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Unchecked")) unchecked{ + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = (double)i * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = (double)i / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + } + } + } + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Checked")) checked{ + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Adding double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + j = j + 10.0; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Multiplying double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = (double)i * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + j = j * 1.0000000000001; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Dividing double", MeasurementOptions.Log, count)) { + for (int i = 0; i < count; i+=10) { + j = (double)i / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + j = j / 1.0000000000001; + } + } + } + } + } + + private IDisposable EmptyDisposable() + { + return new Disposable(delegate { }); + } + + private void TestCast(int size, bool warmup) + { + size = size / 10 * 10; + // Test + object o = EmptyDisposable(); + object t; + Disposable d = null; + IDisposable id = null; + TestHelper.CollectGarbage(); + using (warmup ? EmptyDisposable() : TestLog.InfoRegion("Casts")) { + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("Box int ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + t = i++; + } + } + TestHelper.CollectGarbage(); + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("To ancestor ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i+=10) { + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + d = (Disposable)o; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("To interface", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i+=10) { + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + id = (IDisposable)o; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("To ancestor (as)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i+=10) { + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + d = o as Disposable; + } + } + using (warmup ? (IDisposable) new Disposable(delegate { }) : + new Measurement("To interface (as)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i+=10) { + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + id = o as IDisposable; + } + } + } + } + + private void TestArray(int size, bool warmup) + { + size = size / 10 * 10; + int[] ints = new int[size]; + IEnumerable eInts = ints; + for (int i = 0; i < size; i++) + ints[i] = i; + // Test + TestHelper.CollectGarbage(); + int j = size; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int array, {0,6}K", (size+10) / KSize))) { + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i++) { + ints[i] = i; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Enumerating ", MeasurementOptions.Log, size)) { + foreach (int k in eInts) { + } + } + } + ints = null; + TestHelper.CollectGarbage(); + } + + private void TestList(int size, bool warmup) + { + size = size / 10 * 10; + List ints = new List(size); + IEnumerable eInts = ints; + for (int i = 0; i < size; i++) + ints.Add(i); + // Test + TestHelper.CollectGarbage(); + int j = size; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int list, {0,6}K", (size+10) / KSize))) { + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i++) { + ints[i] = i; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Enumerating ", MeasurementOptions.Log, size)) { + foreach (int k in eInts) { + } + } + } + ints = null; + TestHelper.CollectGarbage(); + } + + private void TestDictionary(int size, bool warmup) + { + size = size / 10 * 10; + Dictionary ints = new Dictionary(size); + IEnumerable> eInts = ints; + // Test + TestHelper.CollectGarbage(); + int j = size; + using (warmup ? EmptyDisposable() : TestLog.InfoRegion(string.Format("int dictionary, {0,6}K", (size+10) / KSize))) { + ints.Clear(); + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + ints[i++] = i; + } + } + ints.Clear(); + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Filling (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; i++) { + ints[i] = i; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x10)", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Reading (x1) ", MeasurementOptions.Log, size)) { + for (int i = 0; i < size; ) { + j = ints[i++]; + } + } + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Enumerating ", MeasurementOptions.Log, size)) { + foreach (KeyValuePair k in eInts) { + } + } + } + ints = null; + TestHelper.CollectGarbage(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/FieldTypeTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/FieldTypeTest.cs index c121d9dd9b..98676216fe 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/FieldTypeTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/FieldTypeTest.cs @@ -1,175 +1,175 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.09.01 - -using System; -using System.Threading; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class FieldTypeTest - { - #region Nested type: ThreadData - - internal static class ThreadData - where T : class - { - private struct SlotData - { - public int ManagerThreadId; - public T Value; - - public SlotData(int managerThreadId, T value) - { - ManagerThreadId = managerThreadId; - Value = value; - } - } - - private const int MaxData = 65536; - private const int MaxDataMask = MaxData-1; - private static object[] data; - private static Type slotDataType; - - public static T Get() - { - int tid = Thread.CurrentThread.ManagedThreadId; - object bigSlot = data[tid & MaxDataMask]; - if (bigSlot==null) - return null; - if (bigSlot.GetType()!=slotDataType) - return bigSlot as T; - else - return GetFromBigSlot(tid, bigSlot); - } - - private static T GetFromBigSlot(int tid, object bigSlot) - { - var slots = bigSlot as SlotData[]; - foreach (var slot in slots) { - if (slot.ManagerThreadId==tid) - return slot.Value; - } - return null; - } - - public static void Set(T value) - { - var thread = Thread.CurrentThread; - int tid = thread.ManagedThreadId; - var index = tid & MaxDataMask; - object bigSlot = data[index]; - lock (data) { - var slots = bigSlot as SlotData[]; - if (slots==null) { - data[index] = value; - Thread.MemoryBarrier(); - return; - } - var newSlots = new SlotData[slots.Length]; - slots.CopyTo(newSlots, 1); - newSlots[0] = new SlotData(tid, value); - data[index] = newSlots; - Thread.MemoryBarrier(); - } - } - - public static void Initiialize() - { - data = new object[MaxData]; - slotDataType = typeof (SlotData); - } - } - - #endregion - - public const int IterationCount = 1000000000; - - public object InstanceField; - public object VolatileInstanceField; - public static object StaticField; - - public static AsyncLocal ThreadStaticFieldAsync = new AsyncLocal(); - - public class Host - { - public static object StaticField; - - public virtual void GetStaticField(int iterationCount) - { - object o = null; - for (int i = 0; i : Host - { - // We're using different StaticField here - public new static object StaticField; - - public override void GetStaticField(int iterationCount) - { - object o = null; - for (int i = 0; i(); - using (new Measurement("Static field of Host", MeasurementOptions.Log, ic)) - host.GetStaticField(ic); - - host = new Host(); - using (new Measurement("Static field of Host", MeasurementOptions.Log, ic)) - host.GetStaticField(ic); - - ic /= 100; - using (new Measurement("ThreadStatic field", MeasurementOptions.Log, ic)) - for (int i = 0; i.Initiialize(); - ThreadData.Set(this); - using (new Measurement("Own ThreadData", MeasurementOptions.Log, ic)) - for (int i = 0; i.Get(); - byte[] bytes; - int length = 128; - using (new Measurement("new byte[128]", MeasurementOptions.Log, ic)) - for (int i = 0; i + + internal static class ThreadData + where T : class + { + private struct SlotData + { + public int ManagerThreadId; + public T Value; + + public SlotData(int managerThreadId, T value) + { + ManagerThreadId = managerThreadId; + Value = value; + } + } + + private const int MaxData = 65536; + private const int MaxDataMask = MaxData-1; + private static object[] data; + private static Type slotDataType; + + public static T Get() + { + int tid = Thread.CurrentThread.ManagedThreadId; + object bigSlot = data[tid & MaxDataMask]; + if (bigSlot==null) + return null; + if (bigSlot.GetType()!=slotDataType) + return bigSlot as T; + else + return GetFromBigSlot(tid, bigSlot); + } + + private static T GetFromBigSlot(int tid, object bigSlot) + { + var slots = bigSlot as SlotData[]; + foreach (var slot in slots) { + if (slot.ManagerThreadId==tid) + return slot.Value; + } + return null; + } + + public static void Set(T value) + { + var thread = Thread.CurrentThread; + int tid = thread.ManagedThreadId; + var index = tid & MaxDataMask; + object bigSlot = data[index]; + lock (data) { + var slots = bigSlot as SlotData[]; + if (slots==null) { + data[index] = value; + Thread.MemoryBarrier(); + return; + } + var newSlots = new SlotData[slots.Length]; + slots.CopyTo(newSlots, 1); + newSlots[0] = new SlotData(tid, value); + data[index] = newSlots; + Thread.MemoryBarrier(); + } + } + + public static void Initiialize() + { + data = new object[MaxData]; + slotDataType = typeof (SlotData); + } + } + + #endregion + + public const int IterationCount = 1000000000; + + public object InstanceField; + public object VolatileInstanceField; + public static object StaticField; + + public static AsyncLocal ThreadStaticFieldAsync = new AsyncLocal(); + + public class Host + { + public static object StaticField; + + public virtual void GetStaticField(int iterationCount) + { + object o = null; + for (int i = 0; i : Host + { + // We're using different StaticField here + public new static object StaticField; + + public override void GetStaticField(int iterationCount) + { + object o = null; + for (int i = 0; i(); + using (new Measurement("Static field of Host", MeasurementOptions.Log, ic)) + host.GetStaticField(ic); + + host = new Host(); + using (new Measurement("Static field of Host", MeasurementOptions.Log, ic)) + host.GetStaticField(ic); + + ic /= 100; + using (new Measurement("ThreadStatic field", MeasurementOptions.Log, ic)) + for (int i = 0; i.Initiialize(); + ThreadData.Set(this); + using (new Measurement("Own ThreadData", MeasurementOptions.Log, ic)) + for (int i = 0; i.Get(); + byte[] bytes; + int length = 128; + using (new Measurement("new byte[128]", MeasurementOptions.Log, ic)) + for (int i = 0; i(); - - using (new Measurement("default(string) equals null", IterationCount)) - DefaultEqualToNull(); - - using (new Measurement("default(int?) equals null", IterationCount)) - DefaultEqualToNull(); - } - - private void DefaultEqualToNull() - { - for (int i = 0; i < IterationCount; i++) { - var result = null == default(T); - } - } - - [Test] - public void EqualToNullTest() - { - Assert.AreEqual(default(int?), CastTo(null)); - // int - EqualToNull(0); - EqualToNull(1); - // Nullable - EqualToNull(null, "null"); - EqualToNull(0); - EqualToNull(1); - // String - EqualToNull(null, "null"); - EqualToNull(string.Empty, "string.Empty"); - EqualToNull("A"); - } - - [Test] - public void DefaultTest() - { - Default(); - Default(); - Default(); - } - - [Test] - public void DefaultByReferenceTest() - { - DefaultByReference(); - DefaultByReference(); - DefaultByReference(); - } - - [Test] - public void IsStructTest() - { - InnerIsStruct(); - InnerIsStruct(); - InnerIsStruct(); - } - - private T CastTo(object o) - { - return (T) o; - } - - private void EqualToNull(T o) - { - EqualToNull(o, o is string ? "\""+o+"\"" : o.ToString()); - } - - private void EqualToNull(T o, string oAsString) - { - TestLog.Info("{0}: null {1}= {2}.", typeof(T).GetShortName(), null==o ? "=" : "!", oAsString); - } - - private void Default() - { - TestLog.Info("{0}: default {1}= null.", typeof(T).GetShortName(), null==default(T) ? "=" : "!"); - } - - private void DefaultByReference() - { - TestLog.Info("{0}: ReferenceEquals(default) {1}= true.", typeof(T).GetShortName(), ReferenceEquals(default(T), null) ? "=" : "!"); - } - - private void InnerIsStruct() - { - TestLog.Info("{0}: IsStruct() {1}= true.", typeof(T).GetShortName(), IsStruct() ? "=" : "!"); - } - - private bool IsStruct() - { - return typeof (ValueType).IsAssignableFrom(typeof (T)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.24 + +using System; +using NUnit.Framework; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class GenericFeaturesTest + { + private const int IterationCount = 10000000; + + [Test] + public void EqualityPerformanceTest() + { + using(new Measurement("default(int) equals null", IterationCount)) + DefaultEqualToNull(); + + using (new Measurement("default(string) equals null", IterationCount)) + DefaultEqualToNull(); + + using (new Measurement("default(int?) equals null", IterationCount)) + DefaultEqualToNull(); + } + + private void DefaultEqualToNull() + { + for (int i = 0; i < IterationCount; i++) { + var result = null == default(T); + } + } + + [Test] + public void EqualToNullTest() + { + Assert.AreEqual(default(int?), CastTo(null)); + // int + EqualToNull(0); + EqualToNull(1); + // Nullable + EqualToNull(null, "null"); + EqualToNull(0); + EqualToNull(1); + // String + EqualToNull(null, "null"); + EqualToNull(string.Empty, "string.Empty"); + EqualToNull("A"); + } + + [Test] + public void DefaultTest() + { + Default(); + Default(); + Default(); + } + + [Test] + public void DefaultByReferenceTest() + { + DefaultByReference(); + DefaultByReference(); + DefaultByReference(); + } + + [Test] + public void IsStructTest() + { + InnerIsStruct(); + InnerIsStruct(); + InnerIsStruct(); + } + + private T CastTo(object o) + { + return (T) o; + } + + private void EqualToNull(T o) + { + EqualToNull(o, o is string ? "\""+o+"\"" : o.ToString()); + } + + private void EqualToNull(T o, string oAsString) + { + TestLog.Info("{0}: null {1}= {2}.", typeof(T).GetShortName(), null==o ? "=" : "!", oAsString); + } + + private void Default() + { + TestLog.Info("{0}: default {1}= null.", typeof(T).GetShortName(), null==default(T) ? "=" : "!"); + } + + private void DefaultByReference() + { + TestLog.Info("{0}: ReferenceEquals(default) {1}= true.", typeof(T).GetShortName(), ReferenceEquals(default(T), null) ? "=" : "!"); + } + + private void InnerIsStruct() + { + TestLog.Info("{0}: IsStruct() {1}= true.", typeof(T).GetShortName(), IsStruct() ? "=" : "!"); + } + + private bool IsStruct() + { + return typeof (ValueType).IsAssignableFrom(typeof (T)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/InterfaceTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/InterfaceTest.cs index 14fceda5e5..cb3ae6ab5d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/InterfaceTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/InterfaceTest.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.10.01 - -using System; -using System.Diagnostics; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - internal interface IComposite - { - string First { get; set; } - string Second { get; set; } - } - - internal class A : IComposite - { - string IComposite.First { get; set; } - public string Second { get; set; } - - public A() - {} - - public A(string first, string second) - { - ((IComposite)this).First = first; - Second = second; - } - } - - internal class B : A - { -// public string First { get; set; } - } - - internal class C : IComposite - { - public string First { get; set; } - public string Second { get; set; } - } - - internal class D : C, IComposite - { - string IComposite.First { get; set; } - } - - internal class E : D - { - - } - - [TestFixture] - public class InterfaceTest - { - [Test] - public void Test() - { - var a = new A("First", "Second"); - var b = new B(); - b.Second = "B.Second"; - var i = (IComposite) b; - i.First = "B.First"; - Assert.AreEqual("B.First", i.First); - var e = new E(); - e.First = "First"; - e.Second = "Second"; - - var c = (C) e; - Assert.AreEqual("First", c.First); - - var ii = (IComposite) e; - Assert.IsNull(ii.First); - - var guid1 = Guid.NewGuid(); - var guid2 = Guid.NewGuid(); - guid1.Equals(guid2); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.10.01 + +using System; +using System.Diagnostics; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + internal interface IComposite + { + string First { get; set; } + string Second { get; set; } + } + + internal class A : IComposite + { + string IComposite.First { get; set; } + public string Second { get; set; } + + public A() + {} + + public A(string first, string second) + { + ((IComposite)this).First = first; + Second = second; + } + } + + internal class B : A + { +// public string First { get; set; } + } + + internal class C : IComposite + { + public string First { get; set; } + public string Second { get; set; } + } + + internal class D : C, IComposite + { + string IComposite.First { get; set; } + } + + internal class E : D + { + + } + + [TestFixture] + public class InterfaceTest + { + [Test] + public void Test() + { + var a = new A("First", "Second"); + var b = new B(); + b.Second = "B.Second"; + var i = (IComposite) b; + i.First = "B.First"; + Assert.AreEqual("B.First", i.First); + var e = new E(); + e.First = "First"; + e.Second = "Second"; + + var c = (C) e; + Assert.AreEqual("First", c.First); + + var ii = (IComposite) e; + Assert.IsNull(ii.First); + + var guid1 = Guid.NewGuid(); + var guid2 = Guid.NewGuid(); + guid1.Equals(guid2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/MemoryAccessTypeTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/MemoryAccessTypeTest.cs index cc352e02d8..4e7727b64e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/MemoryAccessTypeTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/MemoryAccessTypeTest.cs @@ -1,116 +1,116 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.04.17 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class MemoryAccessTypeTest - { - public const int IterationCount = 10000000; - public const int MbSize = 1024*1024; - public const int RamSizeMin = MbSize / 4; - public const int RamSizeMaxN = 16 * MbSize; - public const int RamSizeMaxP = 256 * MbSize; - public readonly static int ItemSize = IntPtr.Size * 2; - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - Test(1); - } - - [Test] - public void RegularTest() - { - Test(0.01); - } - - private void Test(double speedFactor) - { - // Warmup - TestAccess(100, 100, OrderedSequence, true); - TestAccess(100, 100, RandomSequence, true); - // Actual tests - TestLog.Info("Item size: {0} bytes", ItemSize); - int ramSizeMax = TestInfo.IsPerformanceTestRunning ? RamSizeMaxP : RamSizeMaxN; - using (TestLog.InfoRegion("Sequential access")) - for (int ramSize = RamSizeMin; ramSize<=ramSizeMax; ramSize *= 2) - TestAccess(ramSize / ItemSize, (int) (IterationCount * speedFactor), OrderedSequence, false); - using (TestLog.InfoRegion("Random access")) - for (int ramSize = RamSizeMin; ramSize<=ramSizeMax; ramSize *= 2) - TestAccess(ramSize / ItemSize, (int) (IterationCount * speedFactor), RandomSequence, false); - } - - private void TestAccess(int size, int count, Func> generator, bool warmup) - { - size = size / 10 * 10; - Pair[] pairs = new Pair[size]; - // Filling the data - IEnumerable nexts = generator.Invoke(size); - int i = 0; - foreach (int next in nexts) - pairs[i++] = new Pair(i, next); - // Test - Pair current = new Pair(); - TestHelper.CollectGarbage(); - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement( - string.Format("{0,6:F2} MB", (double)size * ItemSize / MbSize), - MeasurementOptions.Log, count)) { - for (i = 0; i < count; i+=10) { - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - current = pairs[current.Second]; - } - } - pairs = null; - TestHelper.CollectGarbage(); - } - - private IEnumerable OrderedSequence(int count) - { - for (int i = 0; i RandomSequence(int count) - { - int[] ints = new int[count]; - // Filling - for (int i = 0; i> generator, bool warmup) + { + size = size / 10 * 10; + Pair[] pairs = new Pair[size]; + // Filling the data + IEnumerable nexts = generator.Invoke(size); + int i = 0; + foreach (int next in nexts) + pairs[i++] = new Pair(i, next); + // Test + Pair current = new Pair(); + TestHelper.CollectGarbage(); + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement( + string.Format("{0,6:F2} MB", (double)size * ItemSize / MbSize), + MeasurementOptions.Log, count)) { + for (i = 0; i < count; i+=10) { + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + current = pairs[current.Second]; + } + } + pairs = null; + TestHelper.CollectGarbage(); + } + + private IEnumerable OrderedSequence(int count) + { + for (int i = 0; i RandomSequence(int count) + { + int[] ints = new int[count]; + // Filling + for (int i = 0; i(TestTuple tuple, out TupleFieldState fieldState); - - public abstract class TestTuple - { - public abstract object GetValue(int i, out TupleFieldState fieldState); - public abstract void SetValue(int i, object value); - - public virtual Delegate GetValueGetter(int i) - { - return null; - } - - public virtual Delegate GetValueSetter(int i) - { - return null; - } - - public T GetValue(int i, out TupleFieldState fieldState) - { - var func = GetValueGetter(i) as TupleFieldGetter; - if (func!=null) - return func.Invoke(this, out fieldState); - else - return (T) GetValue(i, out fieldState); - } - - public void SetValue(int i, T value) - { - var action = GetValueSetter(i) as Action; - if (action!=null) - action.Invoke(this, value); - else - SetValue(i, (object) value); - } - } - - public class BoxingTuple : TestTuple - { - protected long[] values = new long[1]; - - public override object GetValue(int i, out TupleFieldState fieldState) - { - fieldState = TupleFieldState.Available; - return values[i]; - } - - public override void SetValue(int i, object value) - { - values[i] = (long) value; - } - } - - public class NonBoxingTuple : TestTuple - { - private static Delegate[] getters; - private static Delegate[] setters; - protected long value1; - - public override object GetValue(int i, out TupleFieldState fieldState) - { - if (i!=0) - throw new ArgumentOutOfRangeException("i"); - fieldState = TupleFieldState.Available; - return value1; - } - - public override void SetValue(int i, object value) - { - if (i!=0) - throw new ArgumentOutOfRangeException("i"); - value1 = (long) value; - } - - public override Delegate GetValueGetter(int i) - { - return getters[i]; - } - - public override Delegate GetValueSetter(int i) - { - return setters[i]; - } - - static NonBoxingTuple() - { - getters = new Delegate[1]; - TupleFieldGetter getter1 = delegate(TestTuple t, out TupleFieldState s) { - s = TupleFieldState.Available; - return ((NonBoxingTuple) t).value1; - }; - getters[0] = getter1; - - setters = new Delegate[1]; - Action setter1 = (t,v) => ((NonBoxingTuple) t).value1 = v; - setters[0] = setter1; - } - } - - #endregion - - [Test] - public void RegularTest() - { - warmup = true; - Test((int) (0.01 * IterationCount)); - warmup = false; - Test((int) (0.01 * IterationCount)); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - warmup = true; - Test((int) (0.1 * IterationCount)); - warmup = false; - Test((int) (1.0 * IterationCount)); - } - - private void Test(int count) - { - using (warmup ? new Disposable(delegate { }) : - TestLog.InfoRegion("With boxing")) - TestTupleAccess(new BoxingTuple(), count); - using (warmup ? new Disposable(delegate { }) : - TestLog.InfoRegion("Without boxing")) - TestTupleAccess(new NonBoxingTuple(), count); - } - - private void TestTupleAccess(TestTuple tuple, int count) - { - object[] pressure; - TestHelper.CollectGarbage(); - pressure = new object[count / MemoryPressureFactor]; - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Setter", count)) { - for (long i = 0; i < count; i++) { - tuple.SetValue(0, i); -// if (0 == (i & (MemoryPressureFactor-1))) -// pressure[i >> MemoryPressureShift] = new object(); - } - } - pressure = null; - TestHelper.CollectGarbage(); - pressure = new object[count / MemoryPressureFactor]; - TupleFieldState fieldState; - using (warmup ? (IDisposable)new Disposable(delegate { }) : - new Measurement("Getter", count)) { - for (long i = 0; i < count; i++) { - tuple.GetValue(0, out fieldState); -// if (0 == (i & (MemoryPressureFactor-1))) -// pressure[i >> MemoryPressureShift] = new object(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.09.02 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class NewTupleLogicTest + { + public const int IterationCount = 10000000; + public const int MemoryPressureShift = 4; + public const int MemoryPressureFactor = 16; + private bool warmup = false; + + #region Nested types: TestTuple, BoxingTuple, NonBoxingTuple + + public delegate T TupleFieldGetter(TestTuple tuple, out TupleFieldState fieldState); + + public abstract class TestTuple + { + public abstract object GetValue(int i, out TupleFieldState fieldState); + public abstract void SetValue(int i, object value); + + public virtual Delegate GetValueGetter(int i) + { + return null; + } + + public virtual Delegate GetValueSetter(int i) + { + return null; + } + + public T GetValue(int i, out TupleFieldState fieldState) + { + var func = GetValueGetter(i) as TupleFieldGetter; + if (func!=null) + return func.Invoke(this, out fieldState); + else + return (T) GetValue(i, out fieldState); + } + + public void SetValue(int i, T value) + { + var action = GetValueSetter(i) as Action; + if (action!=null) + action.Invoke(this, value); + else + SetValue(i, (object) value); + } + } + + public class BoxingTuple : TestTuple + { + protected long[] values = new long[1]; + + public override object GetValue(int i, out TupleFieldState fieldState) + { + fieldState = TupleFieldState.Available; + return values[i]; + } + + public override void SetValue(int i, object value) + { + values[i] = (long) value; + } + } + + public class NonBoxingTuple : TestTuple + { + private static Delegate[] getters; + private static Delegate[] setters; + protected long value1; + + public override object GetValue(int i, out TupleFieldState fieldState) + { + if (i!=0) + throw new ArgumentOutOfRangeException("i"); + fieldState = TupleFieldState.Available; + return value1; + } + + public override void SetValue(int i, object value) + { + if (i!=0) + throw new ArgumentOutOfRangeException("i"); + value1 = (long) value; + } + + public override Delegate GetValueGetter(int i) + { + return getters[i]; + } + + public override Delegate GetValueSetter(int i) + { + return setters[i]; + } + + static NonBoxingTuple() + { + getters = new Delegate[1]; + TupleFieldGetter getter1 = delegate(TestTuple t, out TupleFieldState s) { + s = TupleFieldState.Available; + return ((NonBoxingTuple) t).value1; + }; + getters[0] = getter1; + + setters = new Delegate[1]; + Action setter1 = (t,v) => ((NonBoxingTuple) t).value1 = v; + setters[0] = setter1; + } + } + + #endregion + + [Test] + public void RegularTest() + { + warmup = true; + Test((int) (0.01 * IterationCount)); + warmup = false; + Test((int) (0.01 * IterationCount)); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PeformanceTest() + { + warmup = true; + Test((int) (0.1 * IterationCount)); + warmup = false; + Test((int) (1.0 * IterationCount)); + } + + private void Test(int count) + { + using (warmup ? new Disposable(delegate { }) : + TestLog.InfoRegion("With boxing")) + TestTupleAccess(new BoxingTuple(), count); + using (warmup ? new Disposable(delegate { }) : + TestLog.InfoRegion("Without boxing")) + TestTupleAccess(new NonBoxingTuple(), count); + } + + private void TestTupleAccess(TestTuple tuple, int count) + { + object[] pressure; + TestHelper.CollectGarbage(); + pressure = new object[count / MemoryPressureFactor]; + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Setter", count)) { + for (long i = 0; i < count; i++) { + tuple.SetValue(0, i); +// if (0 == (i & (MemoryPressureFactor-1))) +// pressure[i >> MemoryPressureShift] = new object(); + } + } + pressure = null; + TestHelper.CollectGarbage(); + pressure = new object[count / MemoryPressureFactor]; + TupleFieldState fieldState; + using (warmup ? (IDisposable)new Disposable(delegate { }) : + new Measurement("Getter", count)) { + for (long i = 0; i < count; i++) { + tuple.GetValue(0, out fieldState); +// if (0 == (i & (MemoryPressureFactor-1))) +// pressure[i >> MemoryPressureShift] = new object(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/PointersTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/PointersTest.cs index 1c5567d77b..073ba0b42e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/PointersTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/PointersTest.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.05.27 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class PointersTest - { - public const int IterationCount = 10000000; - public static bool warmup = true; - - public class Container - { - public T Value; - - public Container(T value) - { - Value = value; - } - } - - [Test] - public void RegularTest() - { - InnerTest(0.001); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - InnerTest(1); - } - - private void InnerTest(double speedFactor) - { - for (int i = 0; i<2; warmup = (++i)==0) { - double sf = warmup ? speedFactor / 10 : speedFactor; - AccessFieldTest(sf); - AccessFieldTest(sf); - } - } - - private void AccessFieldTest(double speedFactor) - { - int count = (int)(IterationCount * speedFactor); - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); - Container c = new Container(o); - if (!warmup) - TestLog.Info("Type: {0}, length: {1}", o.GetType().GetShortName(), count); - using (IndentManager.IncreaseIndent()) { - - if (!warmup) - TestLog.Info("Direct field access test:"); - using (IndentManager.IncreaseIndent()) { - TestHelper.CollectGarbage(); - using (new Measurement("Read ", warmup ? 0 : MeasurementOptions.Log, count)) - for (int i = 0; i + { + public T Value; + + public Container(T value) + { + Value = value; + } + } + + [Test] + public void RegularTest() + { + InnerTest(0.001); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + InnerTest(1); + } + + private void InnerTest(double speedFactor) + { + for (int i = 0; i<2; warmup = (++i)==0) { + double sf = warmup ? speedFactor / 10 : speedFactor; + AccessFieldTest(sf); + AccessFieldTest(sf); + } + } + + private void AccessFieldTest(double speedFactor) + { + int count = (int)(IterationCount * speedFactor); + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + T o = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(r); + Container c = new Container(o); + if (!warmup) + TestLog.Info("Type: {0}, length: {1}", o.GetType().GetShortName(), count); + using (IndentManager.IncreaseIndent()) { + + if (!warmup) + TestLog.Info("Direct field access test:"); + using (IndentManager.IncreaseIndent()) { + TestHelper.CollectGarbage(); + using (new Measurement("Read ", warmup ? 0 : MeasurementOptions.Log, count)) + for (int i = 0; i100) - passCountBase /= 10; - - TestHelper.CollectGarbage(); - using (warmup ? null : TestLog.InfoRegion(string.Format("{0} threads", threadCount))) { - ThreadedTest(target, passCountBase, target.ExecuteLock); - ThreadedTest(target, passCountBase, target.ExecuteReadLock); - ThreadedTest(target, passCountBase, target.ExecuteWriteLock); - if (threadCount>1) { - ThreadedTest(target, passCountBase / 200, target.ExecuteWaitLock); - ThreadedTest(target, passCountBase / 400, target.ExecuteSleepLock); - } - } - } - - private void InvokeAsyncTest(double speedFactor, int threadCount) - { - threads = new Thread[threadCount]; - Target target = new Target(); - target.ThreadCount = threadCount; - int passCountBase = (int)(IterationCount * speedFactor); - if (threadCount>100) - passCountBase /= 10; - - TestHelper.CollectGarbage(); - using (warmup ? null : TestLog.InfoRegion(string.Format("{0} threads", threadCount))) { - ThreadedTest(target, passCountBase/100, target.ExecuteInvokeAsync); - } - } - - private static void ThreadedTest(Target target, int passCount, ParameterizedThreadStart method) - { - int threadCount = threads.Length; - target.ThreadCount = threadCount; - target.PassCount = passCount; - target.Stop = false; - for (int i = 0; i < threadCount; i++) { - Thread t = new Thread(method); - threads[i] = t; - } - for (int i = 0; i < threadCount; i++) - threads[i].Start(i); - for (int i = 0; i < threadCount; i++) { - threads[i].Join(); - target.Stop = true; - } - TestHelper.CollectGarbage(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.05.27 + +using System; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Logging; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.DotNetFramework +{ + [TestFixture] + public class ThreadingTest + { + public const int IterationCount = 1000000; + public static bool warmup = true; + public static Thread[] threads; + + private class Target + { + public int ThreadCount; + public int PassCount; + public bool Stop; + public Thread LastAccessor; + public object ObjectLock = new object(); + public ReaderWriterLockSlim SlimLock = new ReaderWriterLockSlim(); + + public void ExecuteLock(object argument) + { + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int lockCount = 0; + int switchCount = 0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Regular lock", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + lock (ObjectLock) { + lockCount++; + if (LastAccessor!=thread) { + LastAccessor = thread; + switchCount++; + } + } + } + if (log) + TestLog.Info(" Switch rate: {0} ({1:F3}%)", switchCount, switchCount * 1.0 / lockCount); + } + } + + public void ExecuteReadLock(object argument) + { + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int lockCount = 0; + int switchCount = 0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Read lock ", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + SlimLock.EnterReadLock(); + try { + lockCount++; + if (LastAccessor!=thread) { + LastAccessor = thread; + switchCount++; + } + } + finally { + SlimLock.ExitReadLock(); + } + } + if (log) + TestLog.Info(" Switch rate: {0} ({1:F3}%)", switchCount, switchCount * 1.0 / lockCount); + } + } + + public void ExecuteWriteLock(object argument) + { + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int lockCount = 0; + int switchCount = 0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Write lock ", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + SlimLock.EnterWriteLock(); + try { + lockCount++; + if (LastAccessor!=thread) { + LastAccessor = thread; + switchCount++; + } + } + finally { + SlimLock.ExitWriteLock(); + } + } + if (log) + TestLog.Info(" Switch rate: {0} ({1:F3}%)", switchCount, switchCount * 1.0 / lockCount); + } + } + + public void ExecuteWaitLock(object argument) + { + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Wait lock ", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + Wait: + while (LastAccessor==thread) { + if (Stop) + return; + } + lock (ObjectLock) { + if (LastAccessor==thread) + goto Wait; + LastAccessor = thread; + } + } + } + } + + public void ExecuteSleepLock(object argument) + { + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Sleep lock ", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + Wait: + while (LastAccessor==thread) { + if (Stop) + return; + } + lock (ObjectLock) { + if (LastAccessor==thread) + goto Wait; + LastAccessor = thread; + } + Thread.Sleep(0); + } + } + } + + public void ExecuteInvokeAsync(object argument) + { + Action d = delegate { + return; + }; + using (IndentManager.IncreaseIndent()) { + bool log = !warmup && (int) argument==0; + int passCount = PassCount; + Thread thread = Thread.CurrentThread; + using (new Measurement("Execute", log ? MeasurementOptions.Log : 0, passCount)) + for (int j = 0; j < passCount; j++) { + IAsyncResult r = d.BeginInvoke(null, null); + d.EndInvoke(r); + } + } + } + } + + [Test] + public void RegularTest() + { + Test(0.00001); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + Test(1); + } + + + private void Test(double speedFactor) + { + for (int i = 0; i<2; warmup = (++i)==0) { + double sf = warmup ? speedFactor / 100 : speedFactor; + LockTest(sf, 1); + if (!warmup) { + LockTest(sf, 2); + LockTest(sf, 4); + LockTest(sf, 8); + LockTest(sf, 16); + LockTest(sf, 256); + LockTest(sf, 1024); + } + InvokeAsyncTest(sf, 1); + if (!warmup) { + InvokeAsyncTest(sf, 2); + InvokeAsyncTest(sf, 4); + InvokeAsyncTest(sf, 8); + } + } + } + + private void LockTest(double speedFactor, int threadCount) + { + threads = new Thread[threadCount]; + Target target = new Target(); + target.ThreadCount = threadCount; + int passCountBase = (int)(IterationCount * speedFactor); + if (threadCount>100) + passCountBase /= 10; + + TestHelper.CollectGarbage(); + using (warmup ? null : TestLog.InfoRegion(string.Format("{0} threads", threadCount))) { + ThreadedTest(target, passCountBase, target.ExecuteLock); + ThreadedTest(target, passCountBase, target.ExecuteReadLock); + ThreadedTest(target, passCountBase, target.ExecuteWriteLock); + if (threadCount>1) { + ThreadedTest(target, passCountBase / 200, target.ExecuteWaitLock); + ThreadedTest(target, passCountBase / 400, target.ExecuteSleepLock); + } + } + } + + private void InvokeAsyncTest(double speedFactor, int threadCount) + { + threads = new Thread[threadCount]; + Target target = new Target(); + target.ThreadCount = threadCount; + int passCountBase = (int)(IterationCount * speedFactor); + if (threadCount>100) + passCountBase /= 10; + + TestHelper.CollectGarbage(); + using (warmup ? null : TestLog.InfoRegion(string.Format("{0} threads", threadCount))) { + ThreadedTest(target, passCountBase/100, target.ExecuteInvokeAsync); + } + } + + private static void ThreadedTest(Target target, int passCount, ParameterizedThreadStart method) + { + int threadCount = threads.Length; + target.ThreadCount = threadCount; + target.PassCount = passCount; + target.Stop = false; + for (int i = 0; i < threadCount; i++) { + Thread t = new Thread(method); + threads[i] = t; + } + for (int i = 0; i < threadCount; i++) + threads[i].Start(i); + for (int i = 0; i < threadCount; i++) { + threads[i].Join(); + target.Stop = true; + } + TestHelper.CollectGarbage(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/ValidationTest.cs b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/ValidationTest.cs index 02451a6f18..0e3ef60aba 100644 --- a/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/ValidationTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/DotNetFramework/ValidationTest.cs @@ -1,154 +1,154 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.24 - -using System; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.DotNetFramework -{ - [TestFixture] - public class ValidationTest - { - public const int IterationCount = 1000000; - - private class Holder - { - public virtual void ThrowNoException() - { - return; - } - - public virtual void ThrowException() - { - throw new InvalidOperationException(); - } - } - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - Test(1); - } - - [Test] - public void RegularTest() - { - Test(0.01); - } - - private void Test(double speedFactor) - { - RunTryCatchTest(speedFactor); - RunNullCheckTest(speedFactor); - } - - private void RunTryCatchTest(double speedFactor) - { - int count = (int)(IterationCount * speedFactor); - // Warmup - Holder h = new Holder(); - NoTryNoExceptionLoop(h, 10); - TryNoExceptionLoop(h, 10); - TryCatchExceptionLoop(h, 10); - // Real test - TestLog.Info("Try-catch test:"); - using (IndentManager.IncreaseIndent()) { - TestHelper.CollectGarbage(); - using (new Measurement("NoTryNoException ", MeasurementOptions.Log, count)) - NoTryNoExceptionLoop(h, count); - TestHelper.CollectGarbage(); - using (new Measurement("TryNoException ", MeasurementOptions.Log, count)) - TryNoExceptionLoop(h, count); - TestHelper.CollectGarbage(); - using (new Measurement("TryCatchException", MeasurementOptions.Log, count)) - TryCatchExceptionLoop(h, count); - TestHelper.CollectGarbage(); - } - } - - private void RunNullCheckTest(double speedFactor) - { - int count = (int)(IterationCount * speedFactor); - // Warmup - Holder[] holders = new Holder[10]; - FillHolders(holders); - NoCheckLoop(holders); - NullCheckLoop(holders); - // Real test - holders = new Holder[count]; - FillHolders(holders); - TestLog.Info("Null check test:"); - using (IndentManager.IncreaseIndent()) { - TestHelper.CollectGarbage(); - using (new Measurement("No check ", MeasurementOptions.Log, count)) - NoCheckLoop(holders); - TestHelper.CollectGarbage(); - using (new Measurement("Null check ", MeasurementOptions.Log, count)) - NullCheckLoop(holders); - TestHelper.CollectGarbage(); - } - } - - private void NoTryNoExceptionLoop(Holder h, int count) - { - for (int i = 0; i(() => { - Assert.AreEqual("uewryewsf".Like("%sf"), true); - Assert.AreEqual("s__asdf".Like("_%asdf"), true); - Assert.AreEqual("dsfEEEE".Like("dsf%"), true); - Assert.AreEqual("Afigdf".Like("_figdf"), true); - Assert.AreEqual("fsdfASDsdfs".Like("fsdf___sdfs"), true); - Assert.AreEqual("my name is Alex.".Like("my name is _____"), true); - Assert.AreEqual("how old are you?".Like("how old % you_"), true); - Assert.AreEqual("hi, I'm alex. I'm 26".Like("hi, I'm ____. I'm %"), true); - Assert.AreEqual("it's another test string%%%".Like("it's another test string!%!%!%"), false); - Assert.AreEqual("it's another test string%%%".Like("it's another test string!%!%!%", '!'), true); - Assert.AreEqual("string with error.".Like("String with error_"), false); - Assert.AreEqual("Another string with error.".Like("another string with err%."), false); - Assert.AreEqual("aRRRRa%".Like("a%a%%", '%'), true); - }); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.17 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Helpers +{ + [TestFixture] + public class StringExtensionsTest + { + [Test] + public void RevertibleSplitJoinTest() + { + Assert.AreEqual("A,B,C", new[] {"A", "B", "C"}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {"A", "B", "C"}, "A,B,C".RevertibleSplit('\\', ',')); + + Assert.AreEqual("A,B", new[] {"A", "B"}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {"A", "B"}, "A,B".RevertibleSplit('\\', ',')); + + Assert.AreEqual("A", new[] {"A"}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {"A"}, "A".RevertibleSplit('\\', ',')); + + Assert.AreEqual("", new[] {""}.RevertibleJoin('\\', ',')); + Assert.AreEqual("", new string[] {}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {""}, "".RevertibleSplit('\\', ',')); + + Assert.AreEqual("\\,", new[] {","}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {","}, "\\,".RevertibleSplit('\\', ',')); + + Assert.AreEqual("\\,,", new[] {",",""}.RevertibleJoin('\\', ',')); + AssertEx.HasSameElements(new[] {",", ""}, "\\,,".RevertibleSplit('\\', ',')); + } + + [Test] + public void IndentTest() + { + Assert.AreEqual("A".Indent(0), "A"); + Assert.AreEqual("A".Indent(1), " A"); + Assert.AreEqual("A".Indent(2), " A"); + + Assert.AreEqual("A".Indent(1, false), "A"); + Assert.AreEqual("A\r\nB".Indent(1, false), "A\r\n B"); + Assert.AreEqual("A\r\nB".Indent(1, true), " A\r\n B"); + } + + [Test] + public void LikeExtensionTest() + { + Assert.Throws(() => { + Assert.AreEqual("uewryewsf".Like("%sf"), true); + Assert.AreEqual("s__asdf".Like("_%asdf"), true); + Assert.AreEqual("dsfEEEE".Like("dsf%"), true); + Assert.AreEqual("Afigdf".Like("_figdf"), true); + Assert.AreEqual("fsdfASDsdfs".Like("fsdf___sdfs"), true); + Assert.AreEqual("my name is Alex.".Like("my name is _____"), true); + Assert.AreEqual("how old are you?".Like("how old % you_"), true); + Assert.AreEqual("hi, I'm alex. I'm 26".Like("hi, I'm ____. I'm %"), true); + Assert.AreEqual("it's another test string%%%".Like("it's another test string!%!%!%"), false); + Assert.AreEqual("it's another test string%%%".Like("it's another test string!%!%!%", '!'), true); + Assert.AreEqual("string with error.".Like("String with error_"), false); + Assert.AreEqual("Another string with error.".Like("another string with err%."), false); + Assert.AreEqual("aRRRRa%".Like("a%a%%", '%'), true); + }); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Helpers/TopologicalSorterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Helpers/TopologicalSorterTest.cs index 7e997947ba..510fa970e8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Helpers/TopologicalSorterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Helpers/TopologicalSorterTest.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.08.08 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sorting; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Helpers -{ - [TestFixture] - public class TopologicalSorterTest - { - [Test, Explicit] - public void PerformanceTest() - { - using (TestLog.InfoRegion("No loops")) { - InternalPerformanceTest(10000, 10, false); - InternalPerformanceTest(100, 10, false); - InternalPerformanceTest(1000, 10, false); - InternalPerformanceTest(10000, 10, false); - InternalPerformanceTest(100000, 10, false); - } - TestLog.Info(""); - using (TestLog.InfoRegion("With loop removal")) { - InternalPerformanceTest(10000, 10, true); - InternalPerformanceTest(100, 10, true); - InternalPerformanceTest(1000, 10, true); - InternalPerformanceTest(10000, 10, true); - InternalPerformanceTest(100000, 10, true); - } - } - - private static void InternalPerformanceTest(int nodeCount, int averageConnectionCount, bool allowLoops) - { - TestLog.Info("Building graph: {0} nodes, {1} connections/node in average.", nodeCount, averageConnectionCount); - var rnd = new Random(); - var nodes = new List>(); - for (int i = 0; i < nodeCount; i++) - nodes.Add(new Node(i)); - int connectionCount = 0; - foreach (var from in nodes) { - int outgoingConnectionCount = rnd.Next(averageConnectionCount); - for (int i = 0; i < outgoingConnectionCount; i++) { - var to = nodes[rnd.Next(allowLoops ? nodeCount : @from.Item)]; - if (from==to) - continue; - var c = new NodeConnection(@from, to, connectionCount++); - c.BindToNodes(); - } - } - - GC.GetTotalMemory(true); - using (new Measurement("Sorting", nodeCount + connectionCount)) { - List> removedEdges; - var result = TopologicalSorter.Sort(nodes, out removedEdges); - if (!allowLoops) - Assert.AreEqual(nodeCount, result.Count); - } - GC.GetTotalMemory(true); - } - - [Test] - public void SelfReferenceTest() - { - var node = new Node(1); - var connection = new NodeConnection(node, node, "ConnectionItem"); - connection.BindToNodes(); - - List> removedEdges; - List result = TopologicalSorter.Sort(EnumerableUtils.One(node), out removedEdges); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(node.Item, result[0]); - Assert.AreEqual(1, removedEdges.Count); - Assert.AreEqual(connection, removedEdges[0]); - } - - [Test] - public void RemoveWholeNodeTest() - { - var node1 = new Node(1); - var node2 = new Node(2); - var connection12_1 = new NodeConnection(node1, node2, "ConnectionItem 1->2 1"); - connection12_1.BindToNodes(); - var connection12_2 = new NodeConnection(node1, node2, "ConnectionItem 1->2 2"); - connection12_2.BindToNodes(); - var connection21_1 = new NodeConnection(node2, node1, "ConnectionItem 2->1 1"); - connection21_1.BindToNodes(); - - // Remove edge by edge. - - List> removedEdges; - List result = TopologicalSorter.Sort(new[] {node2, node1}, out removedEdges); - Assert.AreEqual(2, result.Count); - Assert.AreEqual(node1.Item, result[0]); - Assert.AreEqual(node2.Item, result[1]); - - Assert.AreEqual(1, removedEdges.Count); - Assert.AreEqual(connection21_1, removedEdges[0]); - - // Remove whole node - connection12_1.BindToNodes(); - connection12_2.BindToNodes(); - connection21_1.BindToNodes(); - - result = TopologicalSorter.Sort(new[] {node2, node1}, out removedEdges, true); - Assert.AreEqual(2, result.Count); - Assert.AreEqual(node1.Item, result[1]); - Assert.AreEqual(node2.Item, result[0]); - - Assert.AreEqual(2, removedEdges.Count); - Assert.AreEqual(0, removedEdges.Except(new[] {connection12_1, connection12_2}).Count()); - } - - [Test] - public void CombinedTest() - { - TestSort(new[] {4, 3, 2, 1}, (i1, i2) => !(i1 == 3 || i2 == 3), null, new[] {4, 2, 1}); - TestSort(new[] {3, 2, 1}, (i1, i2) => i1 >= i2, new[] {1, 2, 3}, null); - TestSort(new[] {3, 2, 1}, (i1, i2) => true, null, new[] {1, 2, 3}); - TestSort(new[] {3, 2, 1}, (i1, i2) => false, new[] {3, 2, 1}, null); - } - - private void TestSort(T[] data, Predicate connector, T[] expected, T[] loops) - { - List> actualLoopNodes; - List actual = TopologicalSorter.Sort(data, connector, out actualLoopNodes); - T[] actualLoops = null; - if (actualLoopNodes != null) - actualLoops = actualLoopNodes - .Where(n => n.OutgoingConnectionCount != 0) - .Select(n => n.Item) - .ToArray(); - - AssertEx.HasSameElements(expected, actual); - AssertEx.HasSameElements(loops, actualLoops); - - List> removedEdges; - List sortWithRemove = TopologicalSorter.Sort(data, connector, out removedEdges); - Assert.AreEqual(sortWithRemove.Count, data.Length); - if (loops == null) { - Assert.AreEqual(sortWithRemove.Count, actual.Count); - for (int i = 0; i < actual.Count; i++) { - Assert.AreEqual(sortWithRemove[i], actual[i]); - } - } - else { - TestLog.Debug("Loops detected"); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.08 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sorting; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Helpers +{ + [TestFixture] + public class TopologicalSorterTest + { + [Test, Explicit] + public void PerformanceTest() + { + using (TestLog.InfoRegion("No loops")) { + InternalPerformanceTest(10000, 10, false); + InternalPerformanceTest(100, 10, false); + InternalPerformanceTest(1000, 10, false); + InternalPerformanceTest(10000, 10, false); + InternalPerformanceTest(100000, 10, false); + } + TestLog.Info(""); + using (TestLog.InfoRegion("With loop removal")) { + InternalPerformanceTest(10000, 10, true); + InternalPerformanceTest(100, 10, true); + InternalPerformanceTest(1000, 10, true); + InternalPerformanceTest(10000, 10, true); + InternalPerformanceTest(100000, 10, true); + } + } + + private static void InternalPerformanceTest(int nodeCount, int averageConnectionCount, bool allowLoops) + { + TestLog.Info("Building graph: {0} nodes, {1} connections/node in average.", nodeCount, averageConnectionCount); + var rnd = new Random(); + var nodes = new List>(); + for (int i = 0; i < nodeCount; i++) + nodes.Add(new Node(i)); + int connectionCount = 0; + foreach (var from in nodes) { + int outgoingConnectionCount = rnd.Next(averageConnectionCount); + for (int i = 0; i < outgoingConnectionCount; i++) { + var to = nodes[rnd.Next(allowLoops ? nodeCount : @from.Item)]; + if (from==to) + continue; + var c = new NodeConnection(@from, to, connectionCount++); + c.BindToNodes(); + } + } + + GC.GetTotalMemory(true); + using (new Measurement("Sorting", nodeCount + connectionCount)) { + List> removedEdges; + var result = TopologicalSorter.Sort(nodes, out removedEdges); + if (!allowLoops) + Assert.AreEqual(nodeCount, result.Count); + } + GC.GetTotalMemory(true); + } + + [Test] + public void SelfReferenceTest() + { + var node = new Node(1); + var connection = new NodeConnection(node, node, "ConnectionItem"); + connection.BindToNodes(); + + List> removedEdges; + List result = TopologicalSorter.Sort(EnumerableUtils.One(node), out removedEdges); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(node.Item, result[0]); + Assert.AreEqual(1, removedEdges.Count); + Assert.AreEqual(connection, removedEdges[0]); + } + + [Test] + public void RemoveWholeNodeTest() + { + var node1 = new Node(1); + var node2 = new Node(2); + var connection12_1 = new NodeConnection(node1, node2, "ConnectionItem 1->2 1"); + connection12_1.BindToNodes(); + var connection12_2 = new NodeConnection(node1, node2, "ConnectionItem 1->2 2"); + connection12_2.BindToNodes(); + var connection21_1 = new NodeConnection(node2, node1, "ConnectionItem 2->1 1"); + connection21_1.BindToNodes(); + + // Remove edge by edge. + + List> removedEdges; + List result = TopologicalSorter.Sort(new[] {node2, node1}, out removedEdges); + Assert.AreEqual(2, result.Count); + Assert.AreEqual(node1.Item, result[0]); + Assert.AreEqual(node2.Item, result[1]); + + Assert.AreEqual(1, removedEdges.Count); + Assert.AreEqual(connection21_1, removedEdges[0]); + + // Remove whole node + connection12_1.BindToNodes(); + connection12_2.BindToNodes(); + connection21_1.BindToNodes(); + + result = TopologicalSorter.Sort(new[] {node2, node1}, out removedEdges, true); + Assert.AreEqual(2, result.Count); + Assert.AreEqual(node1.Item, result[1]); + Assert.AreEqual(node2.Item, result[0]); + + Assert.AreEqual(2, removedEdges.Count); + Assert.AreEqual(0, removedEdges.Except(new[] {connection12_1, connection12_2}).Count()); + } + + [Test] + public void CombinedTest() + { + TestSort(new[] {4, 3, 2, 1}, (i1, i2) => !(i1 == 3 || i2 == 3), null, new[] {4, 2, 1}); + TestSort(new[] {3, 2, 1}, (i1, i2) => i1 >= i2, new[] {1, 2, 3}, null); + TestSort(new[] {3, 2, 1}, (i1, i2) => true, null, new[] {1, 2, 3}); + TestSort(new[] {3, 2, 1}, (i1, i2) => false, new[] {3, 2, 1}, null); + } + + private void TestSort(T[] data, Predicate connector, T[] expected, T[] loops) + { + List> actualLoopNodes; + List actual = TopologicalSorter.Sort(data, connector, out actualLoopNodes); + T[] actualLoops = null; + if (actualLoopNodes != null) + actualLoops = actualLoopNodes + .Where(n => n.OutgoingConnectionCount != 0) + .Select(n => n.Item) + .ToArray(); + + AssertEx.HasSameElements(expected, actual); + AssertEx.HasSameElements(loops, actualLoops); + + List> removedEdges; + List sortWithRemove = TopologicalSorter.Sort(data, connector, out removedEdges); + Assert.AreEqual(sortWithRemove.Count, data.Length); + if (loops == null) { + Assert.AreEqual(sortWithRemove.Count, actual.Count); + for (int i = 0; i < actual.Count; i++) { + Assert.AreEqual(sortWithRemove[i], actual[i]); + } + } + else { + TestLog.Debug("Loops detected"); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/IoC/MainTest.cs b/Orm/Xtensive.Orm.Tests.Core/IoC/MainTest.cs index d875e54ddd..5dc8da6b35 100644 --- a/Orm/Xtensive.Orm.Tests.Core/IoC/MainTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/IoC/MainTest.cs @@ -1,126 +1,126 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.15 - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Orm.Tests; -using ConfigurationSection=Xtensive.IoC.Configuration.ConfigurationSection; - -namespace Xtensive.Orm.Tests.Core.IoC -{ - public interface IPrintService - { - void Print(string msg); - } - - public interface IPrinter - { - void Print(string msg); - } - - public interface ISelfConsumer - { - } - - [Service(typeof(IPrintService), Default = true)] - public class ConsoleService : IPrintService - { - public IPrinter Printer { get; private set; } - - public void Print(string msg) - { - Console.WriteLine(msg); - } - - [ServiceConstructor] - public ConsoleService(IPrinter printer) - { - Printer = printer; - } - } - - public class DebugService : IPrintService - { - public void Print(string msg) - { - Debug.WriteLine(msg); - } - } - - [Service(typeof(IPrintService), "AutoDebug", Singleton = false)] - public class NamedAutoDebugService : IPrintService - { - public void Print(string msg) - { - Debug.WriteLine(msg); - } - } - - [Service(typeof(ISelfConsumer))] - public class SelfConsumer : ISelfConsumer - { - [ServiceConstructor] - public SelfConsumer(ISelfConsumer baseConsumer) - { - } - } - - [TestFixture] - public class MainTest : HasConfigurationAccessTest - { - [Test] - public void DefaultSectionContainerTest() - { - var defaultSectionContainer = ServiceContainer.Create(Configuration); - var ps = defaultSectionContainer.Get(); - Assert.IsNotNull(ps); - - var services = new List(defaultSectionContainer.GetAll()); - Assert.AreEqual(1, services.Count); - - var singleton1 = defaultSectionContainer.Get("Console"); - var singleton2 = defaultSectionContainer.Get("Console"); - Assert.AreSame(singleton1, singleton2); - - var instance1 = defaultSectionContainer.Get("AutoDebug"); - var instance2 = defaultSectionContainer.Get("AutoDebug"); - Assert.AreNotSame(instance1, instance2); - } - - [Test] - public void CustomContainerTest() - { - var container = ServiceContainer.Create(Configuration, "second"); - - var ps = container.Get(); - Assert.IsNotNull(ps); - - var services = new List(container.GetAll()); - Assert.AreEqual(1, services.Count); - - var singleton1 = container.Get("Debug"); - var singleton2 = container.Get("Debug"); - Assert.AreSame(singleton1, singleton2); - - Assert.IsNull(container.Get("Console")); - } - - [Test] - public void SelfConsumerTest() - { - var container = ServiceContainer.Create(Configuration); - - AssertEx.Throws(() => { - var s = container.Get(); - }); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.15 + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Orm.Tests; +using ConfigurationSection=Xtensive.IoC.Configuration.ConfigurationSection; + +namespace Xtensive.Orm.Tests.Core.IoC +{ + public interface IPrintService + { + void Print(string msg); + } + + public interface IPrinter + { + void Print(string msg); + } + + public interface ISelfConsumer + { + } + + [Service(typeof(IPrintService), Default = true)] + public class ConsoleService : IPrintService + { + public IPrinter Printer { get; private set; } + + public void Print(string msg) + { + Console.WriteLine(msg); + } + + [ServiceConstructor] + public ConsoleService(IPrinter printer) + { + Printer = printer; + } + } + + public class DebugService : IPrintService + { + public void Print(string msg) + { + Debug.WriteLine(msg); + } + } + + [Service(typeof(IPrintService), "AutoDebug", Singleton = false)] + public class NamedAutoDebugService : IPrintService + { + public void Print(string msg) + { + Debug.WriteLine(msg); + } + } + + [Service(typeof(ISelfConsumer))] + public class SelfConsumer : ISelfConsumer + { + [ServiceConstructor] + public SelfConsumer(ISelfConsumer baseConsumer) + { + } + } + + [TestFixture] + public class MainTest : HasConfigurationAccessTest + { + [Test] + public void DefaultSectionContainerTest() + { + var defaultSectionContainer = ServiceContainer.Create(Configuration); + var ps = defaultSectionContainer.Get(); + Assert.IsNotNull(ps); + + var services = new List(defaultSectionContainer.GetAll()); + Assert.AreEqual(1, services.Count); + + var singleton1 = defaultSectionContainer.Get("Console"); + var singleton2 = defaultSectionContainer.Get("Console"); + Assert.AreSame(singleton1, singleton2); + + var instance1 = defaultSectionContainer.Get("AutoDebug"); + var instance2 = defaultSectionContainer.Get("AutoDebug"); + Assert.AreNotSame(instance1, instance2); + } + + [Test] + public void CustomContainerTest() + { + var container = ServiceContainer.Create(Configuration, "second"); + + var ps = container.Get(); + Assert.IsNotNull(ps); + + var services = new List(container.GetAll()); + Assert.AreEqual(1, services.Count); + + var singleton1 = container.Get("Debug"); + var singleton2 = container.Get("Debug"); + Assert.AreSame(singleton1, singleton2); + + Assert.IsNull(container.Get("Console")); + } + + [Test] + public void SelfConsumerTest() + { + var container = ServiceContainer.Create(Configuration); + + AssertEx.Throws(() => { + var s = container.Get(); + }); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/CachingExpressionCompilerTest.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/CachingExpressionCompilerTest.cs index 6da3636f81..1a42ddc4a8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/CachingExpressionCompilerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/CachingExpressionCompilerTest.cs @@ -1,174 +1,174 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.07 - -using System; -using System.Collections; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Linq; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [TestFixture] - public class CachingExpressionCompilerTest - { - [Test] - public void InterfaceImplicitCastTest() - { - Expression> lambda = n => Enumerable.Range(1, n); - lambda.CachingCompile(); - } - - #region Performance testing - - private const int warpUpOperationCount = 1; - private const int actualOperationCount = 1000; - - [Test] - [Explicit] - [Category("Performance")] - public void AlwaysNewExpressionTest() - { - int i = 0; - Func>> lambdaGenerator = () => { - i++; - return (a, b) => i; - }; - RunCompilePerformanceTest(lambdaGenerator, true); - RunCompilePerformanceTest(lambdaGenerator, false); - } - - [Test] - [Explicit] - [Category("Performance")] - public void SimpleExpressionPerformanceTest() - { - Expression> lambda = (a, b) => a + b; - RunCompilePerformanceTest(lambda, true); - RunCompilePerformanceTest(lambda, false); - } - - [Test] - [Explicit] - [Category("Performance")] - public void ComplexExpressionPerformanceTest() - { - Expression> lambda = - (a, b) => new {Result = a + b * 2 / a}.Result + DateTime.Now.Day * a * b - a + b; - RunCompilePerformanceTest(lambda, true); - RunCompilePerformanceTest(lambda, false); - } - - [Test] - [Explicit] - [Category("Performance")] - public void CombinedTest() - { - Expression> lambda = - (a, b) => new {Result = a + b * 2 / (a + 1)}.Result + DateTime.Now.Day * a * b - a + b; - RunCompileAndInvokePerformanceTest(lambda, true); - RunCompileAndInvokePerformanceTest(lambda, false); - } - - [Test] - [Ignore("Results depend on order of calling")] - [Category("Performance")] - public void CallOverheadTest() - { - var parameter = Expression.Parameter(typeof (int), "p"); - Expression> plusOne = Expression.Lambda>( - Expression.Add(parameter, Expression.Constant(1)), parameter); - - ClearCompilerCache(); - var original = plusOne.Compile(); - var cached = plusOne.CachingCompile(); - - RunCallOverheadTest(original, cached, true); - RunCallOverheadTest(original, cached, false); - } - - private static void RunCallOverheadTest(Func original, Func cached, bool warmUp) - { - int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; - int k = 0; - - k = 0; - using (CreateMeasurement(warmUp, "Call cached: ", operationCount)) - for (int i = 0; i < operationCount; i++) - k = cached.Invoke(k); - - k = 0; - using (CreateMeasurement(warmUp, "Call original: ", operationCount)) - for (int i = 0; i < operationCount; i++) - k = original.Invoke(k); - } - - private static void RunCompilePerformanceTest(Func>> lambdaGenerator, bool warmUp) - { - int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; - using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) - lambdaGenerator.Invoke().Compile(); - ClearCompilerCache(); - using (CreateMeasurement(warmUp, "With caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) - lambdaGenerator.Invoke().CachingCompile(); - } - - private static void RunCompilePerformanceTest(Expression> lambda, bool warmUp) - { - int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; - using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) - lambda.Compile(); - ClearCompilerCache(); - using (CreateMeasurement(warmUp, "With caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) - lambda.CachingCompile(); - } - - private static void RunCompileAndInvokePerformanceTest(Expression> lambda, bool warmUp) - { - int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; - using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) { - var func = lambda.Compile(); - func(i, i); - } - - ClearCompilerCache(); - using (CreateMeasurement(warmUp, "With caching: ", operationCount)) - for (int i = 0; i < operationCount; i++) { - var func = lambda.CachingCompile(); - func(i, i); - } - } - - private static void ClearCompilerCache() - { - var type = typeof(Pair<>).Assembly.GetType("Xtensive.Linq.CachingExpressionCompiler"); - var instance = type.InvokeMember("Instance", - BindingFlags.Public | BindingFlags.Static | BindingFlags.GetProperty, - null, null, ArrayUtils.EmptyArray); - type.InvokeMember("ClearCache", - BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, - null, instance, ArrayUtils.EmptyArray); - } - - private static IDisposable CreateMeasurement(bool warmUp, string name, int operationCount) - { - return warmUp - ? new Measurement(name, MeasurementOptions.None, operationCount) - : new Measurement(name, operationCount); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.07 + +using System; +using System.Collections; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Linq; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [TestFixture] + public class CachingExpressionCompilerTest + { + [Test] + public void InterfaceImplicitCastTest() + { + Expression> lambda = n => Enumerable.Range(1, n); + lambda.CachingCompile(); + } + + #region Performance testing + + private const int warpUpOperationCount = 1; + private const int actualOperationCount = 1000; + + [Test] + [Explicit] + [Category("Performance")] + public void AlwaysNewExpressionTest() + { + int i = 0; + Func>> lambdaGenerator = () => { + i++; + return (a, b) => i; + }; + RunCompilePerformanceTest(lambdaGenerator, true); + RunCompilePerformanceTest(lambdaGenerator, false); + } + + [Test] + [Explicit] + [Category("Performance")] + public void SimpleExpressionPerformanceTest() + { + Expression> lambda = (a, b) => a + b; + RunCompilePerformanceTest(lambda, true); + RunCompilePerformanceTest(lambda, false); + } + + [Test] + [Explicit] + [Category("Performance")] + public void ComplexExpressionPerformanceTest() + { + Expression> lambda = + (a, b) => new {Result = a + b * 2 / a}.Result + DateTime.Now.Day * a * b - a + b; + RunCompilePerformanceTest(lambda, true); + RunCompilePerformanceTest(lambda, false); + } + + [Test] + [Explicit] + [Category("Performance")] + public void CombinedTest() + { + Expression> lambda = + (a, b) => new {Result = a + b * 2 / (a + 1)}.Result + DateTime.Now.Day * a * b - a + b; + RunCompileAndInvokePerformanceTest(lambda, true); + RunCompileAndInvokePerformanceTest(lambda, false); + } + + [Test] + [Ignore("Results depend on order of calling")] + [Category("Performance")] + public void CallOverheadTest() + { + var parameter = Expression.Parameter(typeof (int), "p"); + Expression> plusOne = Expression.Lambda>( + Expression.Add(parameter, Expression.Constant(1)), parameter); + + ClearCompilerCache(); + var original = plusOne.Compile(); + var cached = plusOne.CachingCompile(); + + RunCallOverheadTest(original, cached, true); + RunCallOverheadTest(original, cached, false); + } + + private static void RunCallOverheadTest(Func original, Func cached, bool warmUp) + { + int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; + int k = 0; + + k = 0; + using (CreateMeasurement(warmUp, "Call cached: ", operationCount)) + for (int i = 0; i < operationCount; i++) + k = cached.Invoke(k); + + k = 0; + using (CreateMeasurement(warmUp, "Call original: ", operationCount)) + for (int i = 0; i < operationCount; i++) + k = original.Invoke(k); + } + + private static void RunCompilePerformanceTest(Func>> lambdaGenerator, bool warmUp) + { + int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; + using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) + lambdaGenerator.Invoke().Compile(); + ClearCompilerCache(); + using (CreateMeasurement(warmUp, "With caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) + lambdaGenerator.Invoke().CachingCompile(); + } + + private static void RunCompilePerformanceTest(Expression> lambda, bool warmUp) + { + int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; + using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) + lambda.Compile(); + ClearCompilerCache(); + using (CreateMeasurement(warmUp, "With caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) + lambda.CachingCompile(); + } + + private static void RunCompileAndInvokePerformanceTest(Expression> lambda, bool warmUp) + { + int operationCount = warmUp ? warpUpOperationCount : actualOperationCount; + using (CreateMeasurement(warmUp, "Without caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) { + var func = lambda.Compile(); + func(i, i); + } + + ClearCompilerCache(); + using (CreateMeasurement(warmUp, "With caching: ", operationCount)) + for (int i = 0; i < operationCount; i++) { + var func = lambda.CachingCompile(); + func(i, i); + } + } + + private static void ClearCompilerCache() + { + var type = typeof(Pair<>).Assembly.GetType("Xtensive.Linq.CachingExpressionCompiler"); + var instance = type.InvokeMember("Instance", + BindingFlags.Public | BindingFlags.Static | BindingFlags.GetProperty, + null, null, ArrayUtils.EmptyArray); + type.InvokeMember("ClearCache", + BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, + null, instance, ArrayUtils.EmptyArray); + } + + private static IDisposable CreateMeasurement(bool warmUp, string name, int operationCount) + { + return warmUp + ? new Measurement(name, MeasurementOptions.None, operationCount) + : new Measurement(name, operationCount); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/ConstantExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/ConstantExtractorTest.cs index 6f8af696ea..660557bc7f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/ConstantExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/ConstantExtractorTest.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.07 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [TestFixture] - public class ConstantExtractorTest : ExpressionTestBase - { - [Test] - public void ComplexTest() - { - foreach (var e in Expressions) { - Console.WriteLine(e.ToString(true)); - new ConstantExtractor(e).Process(); - Console.WriteLine("OK"); - } - } - - [Test] - public void SimpleTest() - { - var ex = new ConstantExtractor(CreateAdd(1)); - var ey = new ConstantExtractor(CreateAdd(2)); - - var tx = ex.Process().ToExpressionTree(); - var ty = ey.Process().ToExpressionTree(); - - var cx = (int) ex.GetConstants()[0]; - var cy = (int) ey.GetConstants()[0]; - - Assert.AreEqual(cx, 1); - Assert.AreEqual(cy, 2); - Assert.AreEqual(tx, ty); - } - - private static Expression> CreateAdd(int n) - { - var parameter = Expression.Parameter(typeof (int), "x" + n); - return (Expression>) Expression.Lambda( - Expression.Add(parameter, Expression.Constant(n)), parameter - ); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.07 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [TestFixture] + public class ConstantExtractorTest : ExpressionTestBase + { + [Test] + public void ComplexTest() + { + foreach (var e in Expressions) { + Console.WriteLine(e.ToString(true)); + new ConstantExtractor(e).Process(); + Console.WriteLine("OK"); + } + } + + [Test] + public void SimpleTest() + { + var ex = new ConstantExtractor(CreateAdd(1)); + var ey = new ConstantExtractor(CreateAdd(2)); + + var tx = ex.Process().ToExpressionTree(); + var ty = ey.Process().ToExpressionTree(); + + var cx = (int) ex.GetConstants()[0]; + var cy = (int) ey.GetConstants()[0]; + + Assert.AreEqual(cx, 1); + Assert.AreEqual(cy, 2); + Assert.AreEqual(tx, ty); + } + + private static Expression> CreateAdd(int n) + { + var parameter = Expression.Parameter(typeof (int), "x" + n); + return (Expression>) Expression.Lambda( + Expression.Add(parameter, Expression.Constant(n)), parameter + ); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTestBase.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTestBase.cs index a3ee69d315..ff9e4a1876 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTestBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTestBase.cs @@ -1,132 +1,132 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.13 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Collections; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [Serializable] - public class ExpressionTestBase - { - public LambdaExpression[] Expressions { get; private set; } - - #region Nested types : Helper class, struct - - private struct Struct - { - public int Id; - } - - private class Helper - { - public int Field; - - public Helper NestedClass; - - public List NestedCollection; - - public int InstanceGenericMethod(int value) - { - return value + typeof(T).Name.Length + +GetHashCode(); - } - - public static int StaticGenericMethod(int value) - { - return value + typeof (T).GetHashCode(); - } - } - - #endregion - - [OneTimeSetUp] - public virtual void TestFixtureSetUp() - { - Expressions = new LambdaExpression[] - { - // Simple expression - (Expression>) (k => k + 1), - - // Instance method call - (Expression>) (p => p.ToString()), - - // Static method call - (Expression>) ((a, b) => Console.Write("{0} + {1} = {2}", a, b, a + b)), - - // Instance generic method call - (Expression>) (h => h.InstanceGenericMethod(0)), - - // Static generic method call - (Expression>) (() => Helper.StaticGenericMethod(0)), - - // Instance generic method call (with generic argument being generic type) - (Expression>) (h => h.InstanceGenericMethod>(0)), - - // Static generic method call (with generic argument being generic type) - (Expression>) (() => Helper.StaticGenericMethod>(0)), - - // Static (extension) generic method call - (Expression>, IEnumerable>>) (funcs => funcs.Select(f => f.Invoke())), - - // Anonymous type constructor - (Expression>) (s => new {Value = s}), - - // Static property access + binary operator - (Expression>) (d => (d - DateTime.Now).Duration().ToString()), - - // Constructor + a lots of generics - (Expression>>) (i => new List(i)), - (Expression>>>) (i => new List>(i)), - (Expression>>>>) (i => new List>>(i)), - (Expression>>>>>) (i => new List>>>(i)), - - // Static generic method call + static method call + constant expression - (Expression>>>) (x => Expression.Lambda>(Expression.Constant(x))), - - // Constructor - (Expression>) ((y, m, d) => new DateTime(y, m, d)), - - // List init expression - (Expression>>) (s => new List {s.Length}), - - // Array init expression - (Expression>) (g => new[] {g}), - - // Delegate call - (Expression>) (() => ((Func) (x => x + 1)).Invoke(5)), - - // Conditional + new array + static property of generic type - // Stupid casts are required because otherwise expression won't construct at runtime - (Expression>) (k => k <= 0 ? (byte[]) ArrayUtils.EmptyArray : (byte[]) new byte[k]), - - // TypeIs - (Expression>) (o => o is string), - - // Coalesce + constructor + member assignment - (Expression>) (o => o ?? new Helper {Field = 5}), - - // Member list init - (Expression>) (() => new Helper {NestedCollection = {1,2,3}}), - - // Member member binding - (Expression>) (() => new Helper {NestedClass = {Field = 5}}), - - // Struct constructor - (Expression>) (a => new Struct {Id = 2}), - - // Don't know how to write InvocationExpression in C# syntax :-( - Expression.Lambda>( - Expression.Invoke( - Expression.Lambda>(Expression.Constant(0), Expression.Parameter(typeof(int), "p")), - Expression.Constant(1))) - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.13 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Collections; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [Serializable] + public class ExpressionTestBase + { + public LambdaExpression[] Expressions { get; private set; } + + #region Nested types : Helper class, struct + + private struct Struct + { + public int Id; + } + + private class Helper + { + public int Field; + + public Helper NestedClass; + + public List NestedCollection; + + public int InstanceGenericMethod(int value) + { + return value + typeof(T).Name.Length + +GetHashCode(); + } + + public static int StaticGenericMethod(int value) + { + return value + typeof (T).GetHashCode(); + } + } + + #endregion + + [OneTimeSetUp] + public virtual void TestFixtureSetUp() + { + Expressions = new LambdaExpression[] + { + // Simple expression + (Expression>) (k => k + 1), + + // Instance method call + (Expression>) (p => p.ToString()), + + // Static method call + (Expression>) ((a, b) => Console.Write("{0} + {1} = {2}", a, b, a + b)), + + // Instance generic method call + (Expression>) (h => h.InstanceGenericMethod(0)), + + // Static generic method call + (Expression>) (() => Helper.StaticGenericMethod(0)), + + // Instance generic method call (with generic argument being generic type) + (Expression>) (h => h.InstanceGenericMethod>(0)), + + // Static generic method call (with generic argument being generic type) + (Expression>) (() => Helper.StaticGenericMethod>(0)), + + // Static (extension) generic method call + (Expression>, IEnumerable>>) (funcs => funcs.Select(f => f.Invoke())), + + // Anonymous type constructor + (Expression>) (s => new {Value = s}), + + // Static property access + binary operator + (Expression>) (d => (d - DateTime.Now).Duration().ToString()), + + // Constructor + a lots of generics + (Expression>>) (i => new List(i)), + (Expression>>>) (i => new List>(i)), + (Expression>>>>) (i => new List>>(i)), + (Expression>>>>>) (i => new List>>>(i)), + + // Static generic method call + static method call + constant expression + (Expression>>>) (x => Expression.Lambda>(Expression.Constant(x))), + + // Constructor + (Expression>) ((y, m, d) => new DateTime(y, m, d)), + + // List init expression + (Expression>>) (s => new List {s.Length}), + + // Array init expression + (Expression>) (g => new[] {g}), + + // Delegate call + (Expression>) (() => ((Func) (x => x + 1)).Invoke(5)), + + // Conditional + new array + static property of generic type + // Stupid casts are required because otherwise expression won't construct at runtime + (Expression>) (k => k <= 0 ? (byte[]) ArrayUtils.EmptyArray : (byte[]) new byte[k]), + + // TypeIs + (Expression>) (o => o is string), + + // Coalesce + constructor + member assignment + (Expression>) (o => o ?? new Helper {Field = 5}), + + // Member list init + (Expression>) (() => new Helper {NestedCollection = {1,2,3}}), + + // Member member binding + (Expression>) (() => new Helper {NestedClass = {Field = 5}}), + + // Struct constructor + (Expression>) (a => new Struct {Id = 2}), + + // Don't know how to write InvocationExpression in C# syntax :-( + Expression.Lambda>( + Expression.Invoke( + Expression.Lambda>(Expression.Constant(0), Expression.Parameter(typeof(int), "p")), + Expression.Constant(1))) + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTreeTest.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTreeTest.cs index 3584ff9194..109f0bd369 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTreeTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionTreeTest.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.07 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [TestFixture] - public class ExpressionTreeTest : ExpressionTestBase - { - [Test] - public void ComplexTest() - { - foreach (var e in Expressions) { - Console.WriteLine(e.ToString(true)); - var x = e.ToExpressionTree(); - var y = e.ToExpressionTree(); - Assert.AreEqual(x, y); - Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); - Console.WriteLine("OK"); - } - } - - [Test] - public void SameExpressionTest() - { - var e = CreateSum().ToExpressionTree(); - Assert.AreEqual(e, e); - Assert.AreEqual(e.GetHashCode(), e.GetHashCode()); - } - - [Test] - public void SameDeclarationTest() - { - var x = CreateSum().ToExpressionTree(); - var y = CreateSum().ToExpressionTree(); - Assert.AreEqual(x, y); - Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); - } - - [Test] - public void NotEqualTest() - { - var x = CreateSum().ToExpressionTree(); - var y = CreateProduct().ToExpressionTree(); - Assert.AreNotEqual(x, y); - } - - [Test] - public void DifferentParameterNamesTest() - { - var x = CreateSum().ToExpressionTree(); - var y = CreateSum2().ToExpressionTree(); - Assert.AreEqual(x, y); - Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); - } - - [Test] - public void AnonymousTest() - { - Expression> x = n => new {Value = n}; - Expression> y = k => new {Value = k}; - var tx = x.ToExpressionTree(); - var ty = y.ToExpressionTree(); - Assert.AreEqual(tx, ty); - Assert.AreEqual(tx.GetHashCode(), ty.GetHashCode()); - } - - [Test] - public void ComplexExpressionTest() - { - Expression> sum = (a, b) => new { Result = a + b * 2 / a }.Result + DateTime.Now.Day * a * b - a + b; - var x = sum.ToExpressionTree(); - var y = sum.ToExpressionTree(); - Assert.AreEqual(x, y); - Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); - } - - [Test] - public void UnboundParametersTest() - { - Expression> i1 = x => x + 1; - Expression> i2 = x => x + 1; - - var p1 = i1.Parameters[0].ToExpressionTree(); - var p2 = i2.Parameters[0].ToExpressionTree(); - - Assert.AreEqual(p1, p2); - Assert.AreEqual(p1.GetHashCode(), p2.GetHashCode()); - } - - [Test] - public void NullEqualityTest() - { - Expression> expression = x => x + 1; - var t = expression.ToExpressionTree(); - - Assert.That(!t.Equals(null)); - - Assert.That(null!=t); - Assert.That(t!=null); - - Assert.That(!(t==null)); - Assert.That(!(null==t)); - - t = null; - - Assert.That(t==null); - Assert.That(null==t); - Assert.That(!(t!=null)); - Assert.That(!(null!=t)); - } - - private static Expression> CreateProduct() - { - return (a, b) => a * b; - } - - private static Expression> CreateSum() - { - return (a, b) => a + b; - } - - private static Expression> CreateSum2() - { - return (x, y) => x + y; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.07 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [TestFixture] + public class ExpressionTreeTest : ExpressionTestBase + { + [Test] + public void ComplexTest() + { + foreach (var e in Expressions) { + Console.WriteLine(e.ToString(true)); + var x = e.ToExpressionTree(); + var y = e.ToExpressionTree(); + Assert.AreEqual(x, y); + Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); + Console.WriteLine("OK"); + } + } + + [Test] + public void SameExpressionTest() + { + var e = CreateSum().ToExpressionTree(); + Assert.AreEqual(e, e); + Assert.AreEqual(e.GetHashCode(), e.GetHashCode()); + } + + [Test] + public void SameDeclarationTest() + { + var x = CreateSum().ToExpressionTree(); + var y = CreateSum().ToExpressionTree(); + Assert.AreEqual(x, y); + Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); + } + + [Test] + public void NotEqualTest() + { + var x = CreateSum().ToExpressionTree(); + var y = CreateProduct().ToExpressionTree(); + Assert.AreNotEqual(x, y); + } + + [Test] + public void DifferentParameterNamesTest() + { + var x = CreateSum().ToExpressionTree(); + var y = CreateSum2().ToExpressionTree(); + Assert.AreEqual(x, y); + Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); + } + + [Test] + public void AnonymousTest() + { + Expression> x = n => new {Value = n}; + Expression> y = k => new {Value = k}; + var tx = x.ToExpressionTree(); + var ty = y.ToExpressionTree(); + Assert.AreEqual(tx, ty); + Assert.AreEqual(tx.GetHashCode(), ty.GetHashCode()); + } + + [Test] + public void ComplexExpressionTest() + { + Expression> sum = (a, b) => new { Result = a + b * 2 / a }.Result + DateTime.Now.Day * a * b - a + b; + var x = sum.ToExpressionTree(); + var y = sum.ToExpressionTree(); + Assert.AreEqual(x, y); + Assert.AreEqual(x.GetHashCode(), y.GetHashCode()); + } + + [Test] + public void UnboundParametersTest() + { + Expression> i1 = x => x + 1; + Expression> i2 = x => x + 1; + + var p1 = i1.Parameters[0].ToExpressionTree(); + var p2 = i2.Parameters[0].ToExpressionTree(); + + Assert.AreEqual(p1, p2); + Assert.AreEqual(p1.GetHashCode(), p2.GetHashCode()); + } + + [Test] + public void NullEqualityTest() + { + Expression> expression = x => x + 1; + var t = expression.ToExpressionTree(); + + Assert.That(!t.Equals(null)); + + Assert.That(null!=t); + Assert.That(t!=null); + + Assert.That(!(t==null)); + Assert.That(!(null==t)); + + t = null; + + Assert.That(t==null); + Assert.That(null==t); + Assert.That(!(t!=null)); + Assert.That(!(null!=t)); + } + + private static Expression> CreateProduct() + { + return (a, b) => a * b; + } + + private static Expression> CreateSum() + { + return (a, b) => a + b; + } + + private static Expression> CreateSum2() + { + return (x, y) => x + y; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionWriterTest.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionWriterTest.cs index 33ff966bc0..677e34d634 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionWriterTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/ExpressionWriterTest.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.02.09 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [TestFixture] - public class ExpressionWriterTest - { - [Test] - public void CombinedTest() - { - IEnumerable enumerable = new[] {"A", "B", "C"}; - var queryable = enumerable.AsQueryable(); - - int p = 1; - - Dump(from i in queryable where i.Length==p select i); - Dump(from i in queryable select new {i.Length}); - Dump(from i in queryable select i.Length); - Dump(from i in queryable select i.GetType()==typeof(IComparer)); - var pair = new Pair("A","B"); - Dump(from i in queryable select i==pair.First); - } - - private void Dump(IQueryable query) - { - TestLog.Info("Default: {0}", query.Expression.ToString()); - TestLog.Info("C#: {0}", query.Expression.ToString(true)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.02.09 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [TestFixture] + public class ExpressionWriterTest + { + [Test] + public void CombinedTest() + { + IEnumerable enumerable = new[] {"A", "B", "C"}; + var queryable = enumerable.AsQueryable(); + + int p = 1; + + Dump(from i in queryable where i.Length==p select i); + Dump(from i in queryable select new {i.Length}); + Dump(from i in queryable select i.Length); + Dump(from i in queryable select i.GetType()==typeof(IComparer)); + var pair = new Pair("A","B"); + Dump(from i in queryable select i==pair.First); + } + + private void Dump(IQueryable query) + { + TestLog.Info("Default: {0}", query.Expression.ToString()); + TestLog.Info("C#: {0}", query.Expression.ToString(true)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Linq/SerializableExpressionsTest.cs b/Orm/Xtensive.Orm.Tests.Core/Linq/SerializableExpressionsTest.cs index 5c7e558185..69cd0d4bfd 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Linq/SerializableExpressionsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Linq/SerializableExpressionsTest.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.13 - -using System; -using System.IO; -using System.Linq; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using System.Runtime.Serialization.Formatters; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Linq.SerializableExpressions; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests.Core.Linq -{ - [TestFixture] - public class SerializableExpressionsTest : ExpressionTestBase - { - public IEnumerable SerializableExpressionTypes - { - get { - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableBinaryExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableConditionalExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableConstantExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableElementInit); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableInvocationExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableLambdaExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableListInitExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberAssignment); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberBinding); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberInitExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberListBinding); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberMemberBinding); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMethodCallExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableNewArrayExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableNewExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableParameterExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableTypeBinaryExpression); - yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableUnaryExpression); - } - } - - [Test] - public void ConvertTest() - { - foreach (var origin in Expressions) { - Console.WriteLine(origin.ToString(true)); - var converted = origin.ToSerializableExpression().ToExpression(); - Assert.AreEqual(origin.ToExpressionTree(), converted.ToExpressionTree()); - Console.WriteLine("OK"); - } - } - - [Test] - public void BinaryFormatterSerializeTest() - { - RunSerializeTest(new BinaryFormatter()); - } - - [Test] - public void NetDataContractSerializeTest() - { - var list = SerializableExpressionTypes.ToList(); - var settings = new DataContractSerializerSettings(); - settings.KnownTypes = list; - settings.PreserveObjectReferences = true; - RunSerializeTest(new DataContractSerializer(typeof(SerializableExpression), settings)); - } - - private void RunSerializeTest(XmlObjectSerializer serializer) - { - var stream = new MemoryStream(); - foreach (var expression in Expressions) { - Console.WriteLine(expression.ToString(true)); - serializer.WriteObject(stream, expression.ToSerializableExpression()); - stream.Seek(0, SeekOrigin.Begin); - var serialized = (SerializableExpression) serializer.ReadObject(stream); - stream.SetLength(0); - Assert.AreEqual(expression.ToExpressionTree(), serialized.ToExpression().ToExpressionTree()); - Console.WriteLine("OK"); - } - } - - private void RunSerializeTest(IFormatter serializer) - { - var stream = new MemoryStream(); - foreach (var expression in Expressions) { - Console.WriteLine(expression.ToString(true)); - serializer.Serialize(stream, expression.ToSerializableExpression()); - stream.Seek(0, SeekOrigin.Begin); - var serialized = (SerializableExpression)serializer.Deserialize(stream); - stream.SetLength(0); - Assert.AreEqual(expression.ToExpressionTree(), serialized.ToExpression().ToExpressionTree()); - Console.WriteLine("OK"); - } - } - - #region Performance test - - private const int warmUpOperationCount = 10; - private const int actualOperationCount = 10000; - - [Test] - [Category("Performance")] - [Explicit] - public void SerializeBenchmarkTest() - { - var list = SerializableExpressionTypes.ToList(); - var settings = new DataContractSerializerSettings(); - settings.KnownTypes = list; - settings.PreserveObjectReferences = true; - - RunSerializeBenchmark(new DataContractSerializer(typeof (SerializableExpression), settings), true); - RunSerializeBenchmark(new DataContractSerializer(typeof (SerializableExpression), settings), false); - } - - private void RunSerializeBenchmark(XmlObjectSerializer serializer, bool warmUp) - { - int operationCount = warmUp ? warmUpOperationCount : actualOperationCount; - var stream = new MemoryStream(); - int operation = 0; - long length = 0; - using (CreateMeasurement(warmUp, serializer.GetType().Name, operationCount)) - while (operation < operationCount) { - foreach (var expression in Expressions) { - operation++; - if (operation > operationCount) - break; - serializer.WriteObject(stream, expression.ToSerializableExpression()); - length += stream.Position; - stream.Seek(0, SeekOrigin.Begin); - var serialized = (SerializableExpression)serializer.ReadObject(stream); - stream.SetLength(0); - } - } -// for (int i = 0; i < operationCount; i++) { -// serializer.Serialize(stream, Expressions[expressionIndex].ToSerializableExpression()); -// length += stream.Length; -// stream.SetLength(0); -// } - Console.Out.WriteLine("Stream size: {0} Kb", length / 1024); - } - - private static IDisposable CreateMeasurement(bool warmUp, string name, int operationCount) - { - return warmUp - ? new Measurement(name, MeasurementOptions.None, operationCount) - : new Measurement(name, operationCount); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.13 + +using System; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Runtime.Serialization.Formatters; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Linq.SerializableExpressions; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests.Core.Linq +{ + [TestFixture] + public class SerializableExpressionsTest : ExpressionTestBase + { + public IEnumerable SerializableExpressionTypes + { + get { + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableBinaryExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableConditionalExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableConstantExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableElementInit); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableInvocationExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableLambdaExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableListInitExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberAssignment); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberBinding); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberInitExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberListBinding); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMemberMemberBinding); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableMethodCallExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableNewArrayExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableNewExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableParameterExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableTypeBinaryExpression); + yield return typeof(Xtensive.Linq.SerializableExpressions.SerializableUnaryExpression); + } + } + + [Test] + public void ConvertTest() + { + foreach (var origin in Expressions) { + Console.WriteLine(origin.ToString(true)); + var converted = origin.ToSerializableExpression().ToExpression(); + Assert.AreEqual(origin.ToExpressionTree(), converted.ToExpressionTree()); + Console.WriteLine("OK"); + } + } + + [Test] + public void BinaryFormatterSerializeTest() + { + RunSerializeTest(new BinaryFormatter()); + } + + [Test] + public void NetDataContractSerializeTest() + { + var list = SerializableExpressionTypes.ToList(); + var settings = new DataContractSerializerSettings(); + settings.KnownTypes = list; + settings.PreserveObjectReferences = true; + RunSerializeTest(new DataContractSerializer(typeof(SerializableExpression), settings)); + } + + private void RunSerializeTest(XmlObjectSerializer serializer) + { + var stream = new MemoryStream(); + foreach (var expression in Expressions) { + Console.WriteLine(expression.ToString(true)); + serializer.WriteObject(stream, expression.ToSerializableExpression()); + stream.Seek(0, SeekOrigin.Begin); + var serialized = (SerializableExpression) serializer.ReadObject(stream); + stream.SetLength(0); + Assert.AreEqual(expression.ToExpressionTree(), serialized.ToExpression().ToExpressionTree()); + Console.WriteLine("OK"); + } + } + + private void RunSerializeTest(IFormatter serializer) + { + var stream = new MemoryStream(); + foreach (var expression in Expressions) { + Console.WriteLine(expression.ToString(true)); + serializer.Serialize(stream, expression.ToSerializableExpression()); + stream.Seek(0, SeekOrigin.Begin); + var serialized = (SerializableExpression)serializer.Deserialize(stream); + stream.SetLength(0); + Assert.AreEqual(expression.ToExpressionTree(), serialized.ToExpression().ToExpressionTree()); + Console.WriteLine("OK"); + } + } + + #region Performance test + + private const int warmUpOperationCount = 10; + private const int actualOperationCount = 10000; + + [Test] + [Category("Performance")] + [Explicit] + public void SerializeBenchmarkTest() + { + var list = SerializableExpressionTypes.ToList(); + var settings = new DataContractSerializerSettings(); + settings.KnownTypes = list; + settings.PreserveObjectReferences = true; + + RunSerializeBenchmark(new DataContractSerializer(typeof (SerializableExpression), settings), true); + RunSerializeBenchmark(new DataContractSerializer(typeof (SerializableExpression), settings), false); + } + + private void RunSerializeBenchmark(XmlObjectSerializer serializer, bool warmUp) + { + int operationCount = warmUp ? warmUpOperationCount : actualOperationCount; + var stream = new MemoryStream(); + int operation = 0; + long length = 0; + using (CreateMeasurement(warmUp, serializer.GetType().Name, operationCount)) + while (operation < operationCount) { + foreach (var expression in Expressions) { + operation++; + if (operation > operationCount) + break; + serializer.WriteObject(stream, expression.ToSerializableExpression()); + length += stream.Position; + stream.Seek(0, SeekOrigin.Begin); + var serialized = (SerializableExpression)serializer.ReadObject(stream); + stream.SetLength(0); + } + } +// for (int i = 0; i < operationCount; i++) { +// serializer.Serialize(stream, Expressions[expressionIndex].ToSerializableExpression()); +// length += stream.Length; +// stream.SetLength(0); +// } + Console.Out.WriteLine("Stream size: {0} Kb", length / 1024); + } + + private static IDisposable CreateMeasurement(bool warmUp, string name, int operationCount) + { + return warmUp + ? new Measurement(name, MeasurementOptions.None, operationCount) + : new Measurement(name, operationCount); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Logging/InternalLogProviderTests.cs b/Orm/Xtensive.Orm.Tests.Core/Logging/InternalLogProviderTests.cs index b63c45628a..d22f6816bb 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Logging/InternalLogProviderTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Logging/InternalLogProviderTests.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.10.14 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Logging; - -namespace Xtensive.Orm.Tests.Core.Logging -{ - [TestFixture] - public class InternalLogProviderTests : HasConfigurationAccessTest - { - [Test] - public void DefaultInitializationTest() - { - var logProvider = new InternalLogProvider(); - var logger = logProvider.GetLog("someLogNameWhichDoesNotContainsInLogList"); - Assert.That(logger, Is.InstanceOf()); - } - - [Test] - public void ParameterizedInitializationTest() - { - var configuration = LoadLoggingConfiguration("LoggingConfiguration"); - var logProvider = new InternalLogProvider(configuration.Logs); - var logger = logProvider.GetLog("Trash"); - - Assert.That(logger.Name, Is.EqualTo("Trash")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("NullLog"); - Assert.That(logger.Name, Is.EqualTo("NullLog")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("FileLog"); - Assert.That(logger.Name, Is.EqualTo("FileLog")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("AnotherLogName"); - Assert.That(logger.Name, Is.EqualTo("AnotherLogName")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("LogName"); - Assert.That(logger.Name, Is.EqualTo("LogName")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("SecondLogName"); - Assert.That(logger.Name, Is.EqualTo("SecondLogName")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("FirstLogName"); - Assert.That(logger.Name, Is.EqualTo("FirstLogName")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("SomeLogName"); - Assert.That(logger.Name, Is.EqualTo("SomeLogName")); - Assert.That(logger, Is.InstanceOf()); - - logger = logProvider.GetLog("LogNameNot in list"); - Assert.That(logger.Name, Is.EqualTo("LogNameNot in list")); - Assert.That(logger, Is.InstanceOf()); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.10.14 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Logging; + +namespace Xtensive.Orm.Tests.Core.Logging +{ + [TestFixture] + public class InternalLogProviderTests : HasConfigurationAccessTest + { + [Test] + public void DefaultInitializationTest() + { + var logProvider = new InternalLogProvider(); + var logger = logProvider.GetLog("someLogNameWhichDoesNotContainsInLogList"); + Assert.That(logger, Is.InstanceOf()); + } + + [Test] + public void ParameterizedInitializationTest() + { + var configuration = LoadLoggingConfiguration("LoggingConfiguration"); + var logProvider = new InternalLogProvider(configuration.Logs); + var logger = logProvider.GetLog("Trash"); + + Assert.That(logger.Name, Is.EqualTo("Trash")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("NullLog"); + Assert.That(logger.Name, Is.EqualTo("NullLog")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("FileLog"); + Assert.That(logger.Name, Is.EqualTo("FileLog")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("AnotherLogName"); + Assert.That(logger.Name, Is.EqualTo("AnotherLogName")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("LogName"); + Assert.That(logger.Name, Is.EqualTo("LogName")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("SecondLogName"); + Assert.That(logger.Name, Is.EqualTo("SecondLogName")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("FirstLogName"); + Assert.That(logger.Name, Is.EqualTo("FirstLogName")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("SomeLogName"); + Assert.That(logger.Name, Is.EqualTo("SomeLogName")); + Assert.That(logger, Is.InstanceOf()); + + logger = logProvider.GetLog("LogNameNot in list"); + Assert.That(logger.Name, Is.EqualTo("LogNameNot in list")); + Assert.That(logger, Is.InstanceOf()); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Logging/LogManagerTests.cs b/Orm/Xtensive.Orm.Tests.Core/Logging/LogManagerTests.cs index 8e6b97ea4c..0b1b85b3e8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Logging/LogManagerTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Logging/LogManagerTests.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.10.14 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Logging; - -namespace Xtensive.Orm.Tests.Core.Logging -{ - [TestFixture] - public class LogManagerTests : HasConfigurationAccessTest - { - [Test] - public void LogManagerInitializationFromConfigLogs() - { - LogManager manager = new LogManager(); - manager.Initialize(Configuration); - } - - [Test] - public void LogManagerInitializatioLogsFromCode() - { - var configuration = new LoggingConfiguration(); - var logs = new List(); - logs.Add(new LogConfiguration("FileLog", "log.txt")); - logs.Add(new LogConfiguration("ConsoleLog", "Console")); - logs.Add(new LogConfiguration("DebugOnlyConsoleLog, AnotherFileLog", "None")); - configuration.Logs = logs; - LogManager manager = new LogManager(); - manager.Initialize(configuration); - } - - [Test] - public void LogManagerInitializationByProvider() - { - var provider = new InternalLogProvider(); - LogManager manager = new LogManager(); - manager.Initialize(provider); - } - - [Test] - public void TryGetLogBeforeInitialization() - { - Assert.Throws(() => { - LogManager manager = new LogManager(); - manager.GetLog("FileLog"); - manager.Initialize(Configuration); - }); - } - - [Test] - public void LogManagerAutoInitializationBeforeInitializationTest() - { - Assert.Throws(() => { - LogManager manager = new LogManager(); - manager.AutoInitialize(); - manager.Initialize(Configuration); - }); - } - - [Test] - public void LogManagerAutoInitializationAfterInitializationTest() - { - LogManager manager = new LogManager(); - manager.Initialize(Configuration); - manager.AutoInitialize(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.10.14 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Logging; + +namespace Xtensive.Orm.Tests.Core.Logging +{ + [TestFixture] + public class LogManagerTests : HasConfigurationAccessTest + { + [Test] + public void LogManagerInitializationFromConfigLogs() + { + LogManager manager = new LogManager(); + manager.Initialize(Configuration); + } + + [Test] + public void LogManagerInitializatioLogsFromCode() + { + var configuration = new LoggingConfiguration(); + var logs = new List(); + logs.Add(new LogConfiguration("FileLog", "log.txt")); + logs.Add(new LogConfiguration("ConsoleLog", "Console")); + logs.Add(new LogConfiguration("DebugOnlyConsoleLog, AnotherFileLog", "None")); + configuration.Logs = logs; + LogManager manager = new LogManager(); + manager.Initialize(configuration); + } + + [Test] + public void LogManagerInitializationByProvider() + { + var provider = new InternalLogProvider(); + LogManager manager = new LogManager(); + manager.Initialize(provider); + } + + [Test] + public void TryGetLogBeforeInitialization() + { + Assert.Throws(() => { + LogManager manager = new LogManager(); + manager.GetLog("FileLog"); + manager.Initialize(Configuration); + }); + } + + [Test] + public void LogManagerAutoInitializationBeforeInitializationTest() + { + Assert.Throws(() => { + LogManager manager = new LogManager(); + manager.AutoInitialize(); + manager.Initialize(Configuration); + }); + } + + [Test] + public void LogManagerAutoInitializationAfterInitializationTest() + { + LogManager manager = new LogManager(); + manager.Initialize(Configuration); + manager.AutoInitialize(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogInstanceTests.cs b/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogInstanceTests.cs index 0b122f1b3b..2583e31a9e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogInstanceTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogInstanceTests.cs @@ -1,237 +1,237 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.10.14 - -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Logging; - -namespace Xtensive.Orm.Tests.Core.Logging -{ - [TestFixture] - public class WriteToLogInstanceTests: HasConfigurationAccessTest - { - private LoggingConfiguration configuration; - - [OneTimeSetUp] - public void Setup() - { - configuration = LoadLoggingConfiguration("LoggingConfiguration"); - } - - [Test] - public void WriteToConsole() - { - var manager = new LogManager(); - manager.Initialize(configuration); - var logger = manager.GetLog("LogName"); - - logger.Debug("Test message", null); - logger.Debug("Test message with parameter {0}", new object[] { 1 }); - logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Debug("Test message", new object[] { 1 }); - logger.Debug("Test message {0}", null); - logger.Debug(null, null, new Exception("exception")); - logger.Debug(null, new object[] { 1 }); - - logger.Info("Test message", null); - logger.Info("Test message with parameter {0}", new object[] { 1 }); - logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Info("Test message", new object[] { 1 }); - logger.Info("Test message {0}", null); - logger.Info(null, null, new Exception("exception")); - logger.Info(null, new object[] { 1 }); - - logger.Warning("Test message", null); - logger.Warning("Test message with parameter {0}", new object[] { 1 }); - logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Warning("Test message", new object[] { 1 }); - logger.Warning("Test message {0}", null); - logger.Warning(null, null, new Exception("exception")); - logger.Warning(null, new object[] { 1 }); - - logger.Error("Test message", null); - logger.Error("Test message with parameter {0}", new object[] { 1 }); - logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Error("Test message", new object[] { 1 }); - logger.Error("Test message {0}", null); - logger.Error(null, null, new Exception("exception")); - logger.Error(null, new object[] { 1 }); - - logger.FatalError("Test message", null); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.FatalError("Test message", new object[] { 1 }); - logger.FatalError("Test message {0}", null); - logger.FatalError(null, null, new Exception("exception")); - logger.FatalError(null, new object[] { 1 }); - } - - [Test] - public void WriteToDebugOnlyConsole() - { - if (!Debugger.IsAttached) - throw new IgnoreException("This test requeres to attach a debugger."); - var manager = new LogManager(); - manager.Initialize(configuration); - var logger = manager.GetLog("SomeLogName"); - - logger.Debug("Test message", null); - logger.Debug("Test message with parameter {0}", new object[] { 1 }); - logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Debug("Test message", new object[] { 1 }); - logger.Debug("Test message {0}", null); - logger.Debug(null, null, new Exception("exception")); - logger.Debug(null, new object[] { 1 }); - - logger.Info("Test message", null); - logger.Info("Test message with parameter {0}", new object[] { 1 }); - logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Info("Test message", new object[] { 1 }); - logger.Info("Test message {0}", null); - logger.Info(null, null, new Exception("exception")); - logger.Info(null, new object[] { 1 }); - - logger.Warning("Test message", null); - logger.Warning("Test message with parameter {0}", new object[] { 1 }); - logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Warning("Test message", new object[] { 1 }); - logger.Warning("Test message {0}", null); - logger.Warning(null, null, new Exception("exception")); - logger.Warning(null, new object[] { 1 }); - - logger.Error("Test message", null); - logger.Error("Test message with parameter {0}", new object[] { 1 }); - logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Error("Test message", new object[] { 1 }); - logger.Error("Test message {0}", null); - logger.Error(null, null, new Exception("exception")); - logger.Error(null, new object[] { 1 }); - - logger.FatalError("Test message", null); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.FatalError("Test message", new object[] { 1 }); - logger.FatalError("Test message {0}", null); - logger.FatalError(null, null, new Exception("exception")); - logger.FatalError(null, new object[] { 1 }); - } - - [Test] - public void WriteToFileAbsolutePath() - { - string filePath = Path.GetFullPath("log.txt"); - var localConfiguration = new LoggingConfiguration(); - localConfiguration.Logs.Add(new LogConfiguration("FileLog", filePath)); - - if (File.Exists(filePath)) - File.Delete(filePath); - var manager = new LogManager(); - manager.Initialize(localConfiguration); - var logger = manager.GetLog("FileLog"); - - logger.Debug("Test message", null); - logger.Debug("Test message with parameter {0}", new object[] { 1 }); - logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Debug("Test message", new object[] { 1 }); - logger.Debug("Test message {0}", null); - logger.Debug(null, null, new Exception("exception")); - logger.Debug(null, new object[] { 1 }); - - logger.Info("Test message", null); - logger.Info("Test message with parameter {0}", new object[] { 1 }); - logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Info("Test message", new object[] { 1 }); - logger.Info("Test message {0}", null); - logger.Info(null, null, new Exception("exception")); - logger.Info(null, new object[] { 1 }); - - logger.Warning("Test message", null); - logger.Warning("Test message with parameter {0}", new object[] { 1 }); - logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Warning("Test message", new object[] { 1 }); - logger.Warning("Test message {0}", null); - logger.Warning(null, null, new Exception("exception")); - logger.Warning(null, new object[] { 1 }); - - logger.Error("Test message", null); - logger.Error("Test message with parameter {0}", new object[] { 1 }); - logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Error("Test message", new object[] { 1 }); - logger.Error("Test message {0}", null); - logger.Error(null, null, new Exception("exception")); - logger.Error(null, new object[] { 1 }); - - logger.FatalError("Test message", null); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.FatalError("Test message", new object[] { 1 }); - logger.FatalError("Test message {0}", null); - logger.FatalError(null, null, new Exception("exception")); - logger.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - - [Test] - public void WriteToFileRelativePath() - { - string filePath = "log.txt"; - if (File.Exists(filePath)) - File.Delete(filePath); - var manager = new LogManager(); - manager.Initialize(configuration); - var logger = manager.GetLog("FileLog"); - - logger.Debug("Test message", null); - logger.Debug("Test message with parameter {0}", new object[] { 1 }); - logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Debug("Test message", new object[] { 1 }); - logger.Debug("Test message {0}", null); - logger.Debug(null, null, new Exception("exception")); - logger.Debug(null, new object[] { 1 }); - - logger.Info("Test message", null); - logger.Info("Test message with parameter {0}", new object[] { 1 }); - logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Info("Test message", new object[] { 1 }); - logger.Info("Test message {0}", null); - logger.Info(null, null, new Exception("exception")); - logger.Info(null, new object[] { 1 }); - - logger.Warning("Test message", null); - logger.Warning("Test message with parameter {0}", new object[] { 1 }); - logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Warning("Test message", new object[] { 1 }); - logger.Warning("Test message {0}", null); - logger.Warning(null, null, new Exception("exception")); - logger.Warning(null, new object[] { 1 }); - - logger.Error("Test message", null); - logger.Error("Test message with parameter {0}", new object[] { 1 }); - logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.Error("Test message", new object[] { 1 }); - logger.Error("Test message {0}", null); - logger.Error(null, null, new Exception("exception")); - logger.Error(null, new object[] { 1 }); - - logger.FatalError("Test message", null); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }); - logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); - logger.FatalError("Test message", new object[] { 1 }); - logger.FatalError("Test message {0}", null); - logger.FatalError(null, null, new Exception("exception")); - logger.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.10.14 + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Logging; + +namespace Xtensive.Orm.Tests.Core.Logging +{ + [TestFixture] + public class WriteToLogInstanceTests: HasConfigurationAccessTest + { + private LoggingConfiguration configuration; + + [OneTimeSetUp] + public void Setup() + { + configuration = LoadLoggingConfiguration("LoggingConfiguration"); + } + + [Test] + public void WriteToConsole() + { + var manager = new LogManager(); + manager.Initialize(configuration); + var logger = manager.GetLog("LogName"); + + logger.Debug("Test message", null); + logger.Debug("Test message with parameter {0}", new object[] { 1 }); + logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Debug("Test message", new object[] { 1 }); + logger.Debug("Test message {0}", null); + logger.Debug(null, null, new Exception("exception")); + logger.Debug(null, new object[] { 1 }); + + logger.Info("Test message", null); + logger.Info("Test message with parameter {0}", new object[] { 1 }); + logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Info("Test message", new object[] { 1 }); + logger.Info("Test message {0}", null); + logger.Info(null, null, new Exception("exception")); + logger.Info(null, new object[] { 1 }); + + logger.Warning("Test message", null); + logger.Warning("Test message with parameter {0}", new object[] { 1 }); + logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Warning("Test message", new object[] { 1 }); + logger.Warning("Test message {0}", null); + logger.Warning(null, null, new Exception("exception")); + logger.Warning(null, new object[] { 1 }); + + logger.Error("Test message", null); + logger.Error("Test message with parameter {0}", new object[] { 1 }); + logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Error("Test message", new object[] { 1 }); + logger.Error("Test message {0}", null); + logger.Error(null, null, new Exception("exception")); + logger.Error(null, new object[] { 1 }); + + logger.FatalError("Test message", null); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.FatalError("Test message", new object[] { 1 }); + logger.FatalError("Test message {0}", null); + logger.FatalError(null, null, new Exception("exception")); + logger.FatalError(null, new object[] { 1 }); + } + + [Test] + public void WriteToDebugOnlyConsole() + { + if (!Debugger.IsAttached) + throw new IgnoreException("This test requeres to attach a debugger."); + var manager = new LogManager(); + manager.Initialize(configuration); + var logger = manager.GetLog("SomeLogName"); + + logger.Debug("Test message", null); + logger.Debug("Test message with parameter {0}", new object[] { 1 }); + logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Debug("Test message", new object[] { 1 }); + logger.Debug("Test message {0}", null); + logger.Debug(null, null, new Exception("exception")); + logger.Debug(null, new object[] { 1 }); + + logger.Info("Test message", null); + logger.Info("Test message with parameter {0}", new object[] { 1 }); + logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Info("Test message", new object[] { 1 }); + logger.Info("Test message {0}", null); + logger.Info(null, null, new Exception("exception")); + logger.Info(null, new object[] { 1 }); + + logger.Warning("Test message", null); + logger.Warning("Test message with parameter {0}", new object[] { 1 }); + logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Warning("Test message", new object[] { 1 }); + logger.Warning("Test message {0}", null); + logger.Warning(null, null, new Exception("exception")); + logger.Warning(null, new object[] { 1 }); + + logger.Error("Test message", null); + logger.Error("Test message with parameter {0}", new object[] { 1 }); + logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Error("Test message", new object[] { 1 }); + logger.Error("Test message {0}", null); + logger.Error(null, null, new Exception("exception")); + logger.Error(null, new object[] { 1 }); + + logger.FatalError("Test message", null); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.FatalError("Test message", new object[] { 1 }); + logger.FatalError("Test message {0}", null); + logger.FatalError(null, null, new Exception("exception")); + logger.FatalError(null, new object[] { 1 }); + } + + [Test] + public void WriteToFileAbsolutePath() + { + string filePath = Path.GetFullPath("log.txt"); + var localConfiguration = new LoggingConfiguration(); + localConfiguration.Logs.Add(new LogConfiguration("FileLog", filePath)); + + if (File.Exists(filePath)) + File.Delete(filePath); + var manager = new LogManager(); + manager.Initialize(localConfiguration); + var logger = manager.GetLog("FileLog"); + + logger.Debug("Test message", null); + logger.Debug("Test message with parameter {0}", new object[] { 1 }); + logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Debug("Test message", new object[] { 1 }); + logger.Debug("Test message {0}", null); + logger.Debug(null, null, new Exception("exception")); + logger.Debug(null, new object[] { 1 }); + + logger.Info("Test message", null); + logger.Info("Test message with parameter {0}", new object[] { 1 }); + logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Info("Test message", new object[] { 1 }); + logger.Info("Test message {0}", null); + logger.Info(null, null, new Exception("exception")); + logger.Info(null, new object[] { 1 }); + + logger.Warning("Test message", null); + logger.Warning("Test message with parameter {0}", new object[] { 1 }); + logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Warning("Test message", new object[] { 1 }); + logger.Warning("Test message {0}", null); + logger.Warning(null, null, new Exception("exception")); + logger.Warning(null, new object[] { 1 }); + + logger.Error("Test message", null); + logger.Error("Test message with parameter {0}", new object[] { 1 }); + logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Error("Test message", new object[] { 1 }); + logger.Error("Test message {0}", null); + logger.Error(null, null, new Exception("exception")); + logger.Error(null, new object[] { 1 }); + + logger.FatalError("Test message", null); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.FatalError("Test message", new object[] { 1 }); + logger.FatalError("Test message {0}", null); + logger.FatalError(null, null, new Exception("exception")); + logger.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + + [Test] + public void WriteToFileRelativePath() + { + string filePath = "log.txt"; + if (File.Exists(filePath)) + File.Delete(filePath); + var manager = new LogManager(); + manager.Initialize(configuration); + var logger = manager.GetLog("FileLog"); + + logger.Debug("Test message", null); + logger.Debug("Test message with parameter {0}", new object[] { 1 }); + logger.Debug("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Debug("Test message", new object[] { 1 }); + logger.Debug("Test message {0}", null); + logger.Debug(null, null, new Exception("exception")); + logger.Debug(null, new object[] { 1 }); + + logger.Info("Test message", null); + logger.Info("Test message with parameter {0}", new object[] { 1 }); + logger.Info("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Info("Test message", new object[] { 1 }); + logger.Info("Test message {0}", null); + logger.Info(null, null, new Exception("exception")); + logger.Info(null, new object[] { 1 }); + + logger.Warning("Test message", null); + logger.Warning("Test message with parameter {0}", new object[] { 1 }); + logger.Warning("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Warning("Test message", new object[] { 1 }); + logger.Warning("Test message {0}", null); + logger.Warning(null, null, new Exception("exception")); + logger.Warning(null, new object[] { 1 }); + + logger.Error("Test message", null); + logger.Error("Test message with parameter {0}", new object[] { 1 }); + logger.Error("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.Error("Test message", new object[] { 1 }); + logger.Error("Test message {0}", null); + logger.Error(null, null, new Exception("exception")); + logger.Error(null, new object[] { 1 }); + + logger.FatalError("Test message", null); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }); + logger.FatalError("Test message with parameter {0}", new object[] { 1 }, new Exception("exception")); + logger.FatalError("Test message", new object[] { 1 }); + logger.FatalError("Test message {0}", null); + logger.FatalError(null, null, new Exception("exception")); + logger.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogTests.cs b/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogTests.cs index 8a9873625b..f19065c831 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogTests.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Logging/WriteToLogTests.cs @@ -1,223 +1,223 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.10.14 - -using System; -using System.IO; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Logging; - -namespace Xtensive.Orm.Tests.Core.Logging -{ - [TestFixture] - public class WriteToLogTests : HasConfigurationAccessTest - { - private const string filePath = "Log.txt"; - - [OneTimeSetUp] - public void SetUp() - { - LogManager.Default.Initialize(Configuration); - } - - [Test] - public void OrmLogTest() - { - if (File.Exists(filePath)) - File.Delete(filePath); - OrmLog.Debug("Test message", null); - OrmLog.Debug("Test message with parameter {0}", new object[] { 1 }); - OrmLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - OrmLog.Debug("Test message", new object[] { 1 }); - OrmLog.Debug("Test message {0}", null); - OrmLog.Debug(new Exception("Some exeption")); - OrmLog.Debug(null, new object[] { 1 }); - - OrmLog.Info("Test message", null); - OrmLog.Info("Test message with parameter {0}", new object[] { 1 }); - OrmLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - OrmLog.Info("Test message", new object[] { 1 }); - OrmLog.Info("Test message {0}", null); - OrmLog.Info(new Exception("Some exeption")); - OrmLog.Info(null, new object[] { 1 }); - - OrmLog.Warning("Test message", null); - OrmLog.Warning("Test message with parameter {0}", new object[] { 1 }); - OrmLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - OrmLog.Warning("Test message", new object[] { 1 }); - OrmLog.Warning("Test message {0}", null); - OrmLog.Warning(new Exception("Some exeption")); - OrmLog.Warning(null, new object[] { 1 }); - - OrmLog.Error("Test message", null); - OrmLog.Error("Test message with parameter {0}", new object[] { 1 }); - OrmLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - OrmLog.Error("Test message", new object[] { 1 }); - OrmLog.Error("Test message {0}", null); - OrmLog.Error(new Exception("Some exeption")); - OrmLog.Error(null, new object[] { 1 }); - - OrmLog.FatalError("Test message", null); - OrmLog.FatalError("Test message with parameter {0}", new object[] { 1 }); - OrmLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - OrmLog.FatalError("Test message", new object[] { 1 }); - OrmLog.FatalError("Test message {0}", null); - OrmLog.FatalError(new Exception("Some exeption")); - OrmLog.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - - [Test] - public void BuildLogTest() - { - if (File.Exists(filePath)) - File.Delete(filePath); - BuildLog.Debug("Test message", null); - BuildLog.Debug("Test message with parameter {0}", new object[] { 1 }); - BuildLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - BuildLog.Debug("Test message", new object[] { 1 }); - BuildLog.Debug("Test message {0}", null); - BuildLog.Debug(new Exception("Some exeption")); - BuildLog.Debug(null, new object[] { 1 }); - - BuildLog.Info("Test message", null); - BuildLog.Info("Test message with parameter {0}", new object[] { 1 }); - BuildLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - BuildLog.Info("Test message", new object[] { 1 }); - BuildLog.Info("Test message {0}", null); - BuildLog.Info(new Exception("Some exeption")); - BuildLog.Info(null, new object[] { 1 }); - - BuildLog.Warning("Test message", null); - BuildLog.Warning("Test message with parameter {0}", new object[] { 1 }); - BuildLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - BuildLog.Warning("Test message", new object[] { 1 }); - BuildLog.Warning("Test message {0}", null); - BuildLog.Warning(new Exception("Some exeption")); - BuildLog.Warning(null, new object[] { 1 }); - - BuildLog.Error("Test message", null); - BuildLog.Error("Test message with parameter {0}", new object[] { 1 }); - BuildLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - BuildLog.Error("Test message", new object[] { 1 }); - BuildLog.Error("Test message {0}", null); - BuildLog.Error(new Exception("Some exeption")); - BuildLog.Error(null, new object[] { 1 }); - - BuildLog.FatalError("Test message", null); - BuildLog.FatalError("Test message with parameter {0}", new object[] { 1 }); - BuildLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - BuildLog.FatalError("Test message", new object[] { 1 }); - BuildLog.FatalError("Test message {0}", null); - BuildLog.FatalError(new Exception("Some exeption")); - BuildLog.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - - [Test] - public void UpgradeLogTest() - { - if (File.Exists(filePath)) - File.Delete(filePath); - UpgradeLog.Debug("Test message", null); - UpgradeLog.Debug("Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Debug("Test message", new object[] { 1 }); - UpgradeLog.Debug("Test message {0}", null); - UpgradeLog.Debug(new Exception("Some exeption")); - UpgradeLog.Debug(null, new object[] { 1 }); - - UpgradeLog.Info("Test message", null); - UpgradeLog.Info("Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Info("Test message", new object[] { 1 }); - UpgradeLog.Info("Test message {0}", null); - UpgradeLog.Info(new Exception("Some exeption")); - UpgradeLog.Info(null, new object[] { 1 }); - - UpgradeLog.Warning("Test message", null); - UpgradeLog.Warning("Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Warning("Test message", new object[] { 1 }); - UpgradeLog.Warning("Test message {0}", null); - UpgradeLog.Warning(new Exception("Some exeption")); - UpgradeLog.Warning(null, new object[] { 1 }); - - UpgradeLog.Error("Test message", null); - UpgradeLog.Error("Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.Error("Test message", new object[] { 1 }); - UpgradeLog.Error("Test message {0}", null); - UpgradeLog.Error(new Exception("Some exeption")); - UpgradeLog.Error(null, new object[] { 1 }); - - UpgradeLog.FatalError("Test message", null); - UpgradeLog.FatalError("Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - UpgradeLog.FatalError("Test message", new object[] { 1 }); - UpgradeLog.FatalError("Test message {0}", null); - UpgradeLog.FatalError(new Exception("Some exeption")); - UpgradeLog.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - - [Test] - public void SqlLogTest() - { - if (File.Exists(filePath)) - File.Delete(filePath); - SqlLog.Debug("Test message", null); - SqlLog.Debug("Test message with parameter {0}", new object[] { 1 }); - SqlLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - SqlLog.Debug("Test message", new object[] { 1 }); - SqlLog.Debug("Test message {0}", null); - SqlLog.Debug(new Exception("Some exeption")); - SqlLog.Debug(null, new object[] { 1 }); - - SqlLog.Info("Test message", null); - SqlLog.Info("Test message with parameter {0}", new object[] { 1 }); - SqlLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - SqlLog.Info("Test message", new object[] { 1 }); - SqlLog.Info("Test message {0}", null); - SqlLog.Info(new Exception("Some exeption")); - SqlLog.Info(null, new object[] { 1 }); - - SqlLog.Warning("Test message", null); - SqlLog.Warning("Test message with parameter {0}", new object[] { 1 }); - SqlLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - SqlLog.Warning("Test message", new object[] { 1 }); - SqlLog.Warning("Test message {0}", null); - SqlLog.Warning(new Exception("Some exeption")); - SqlLog.Warning(null, new object[] { 1 }); - - SqlLog.Error("Test message", null); - SqlLog.Error("Test message with parameter {0}", new object[] { 1 }); - SqlLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - SqlLog.Error("Test message", new object[] { 1 }); - SqlLog.Error("Test message {0}", null); - SqlLog.Error(new Exception("Some exeption")); - SqlLog.Error(null, new object[] { 1 }); - - SqlLog.FatalError("Test message", null); - SqlLog.FatalError("Test message with parameter {0}", new object[] { 1 }); - SqlLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); - SqlLog.FatalError("Test message", new object[] { 1 }); - SqlLog.FatalError("Test message {0}", null); - SqlLog.FatalError(new Exception("Some exeption")); - SqlLog.FatalError(null, new object[] { 1 }); - - Assert.IsTrue(File.Exists(filePath)); - Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.10.14 + +using System; +using System.IO; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Logging; + +namespace Xtensive.Orm.Tests.Core.Logging +{ + [TestFixture] + public class WriteToLogTests : HasConfigurationAccessTest + { + private const string filePath = "Log.txt"; + + [OneTimeSetUp] + public void SetUp() + { + LogManager.Default.Initialize(Configuration); + } + + [Test] + public void OrmLogTest() + { + if (File.Exists(filePath)) + File.Delete(filePath); + OrmLog.Debug("Test message", null); + OrmLog.Debug("Test message with parameter {0}", new object[] { 1 }); + OrmLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + OrmLog.Debug("Test message", new object[] { 1 }); + OrmLog.Debug("Test message {0}", null); + OrmLog.Debug(new Exception("Some exeption")); + OrmLog.Debug(null, new object[] { 1 }); + + OrmLog.Info("Test message", null); + OrmLog.Info("Test message with parameter {0}", new object[] { 1 }); + OrmLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + OrmLog.Info("Test message", new object[] { 1 }); + OrmLog.Info("Test message {0}", null); + OrmLog.Info(new Exception("Some exeption")); + OrmLog.Info(null, new object[] { 1 }); + + OrmLog.Warning("Test message", null); + OrmLog.Warning("Test message with parameter {0}", new object[] { 1 }); + OrmLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + OrmLog.Warning("Test message", new object[] { 1 }); + OrmLog.Warning("Test message {0}", null); + OrmLog.Warning(new Exception("Some exeption")); + OrmLog.Warning(null, new object[] { 1 }); + + OrmLog.Error("Test message", null); + OrmLog.Error("Test message with parameter {0}", new object[] { 1 }); + OrmLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + OrmLog.Error("Test message", new object[] { 1 }); + OrmLog.Error("Test message {0}", null); + OrmLog.Error(new Exception("Some exeption")); + OrmLog.Error(null, new object[] { 1 }); + + OrmLog.FatalError("Test message", null); + OrmLog.FatalError("Test message with parameter {0}", new object[] { 1 }); + OrmLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + OrmLog.FatalError("Test message", new object[] { 1 }); + OrmLog.FatalError("Test message {0}", null); + OrmLog.FatalError(new Exception("Some exeption")); + OrmLog.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + + [Test] + public void BuildLogTest() + { + if (File.Exists(filePath)) + File.Delete(filePath); + BuildLog.Debug("Test message", null); + BuildLog.Debug("Test message with parameter {0}", new object[] { 1 }); + BuildLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + BuildLog.Debug("Test message", new object[] { 1 }); + BuildLog.Debug("Test message {0}", null); + BuildLog.Debug(new Exception("Some exeption")); + BuildLog.Debug(null, new object[] { 1 }); + + BuildLog.Info("Test message", null); + BuildLog.Info("Test message with parameter {0}", new object[] { 1 }); + BuildLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + BuildLog.Info("Test message", new object[] { 1 }); + BuildLog.Info("Test message {0}", null); + BuildLog.Info(new Exception("Some exeption")); + BuildLog.Info(null, new object[] { 1 }); + + BuildLog.Warning("Test message", null); + BuildLog.Warning("Test message with parameter {0}", new object[] { 1 }); + BuildLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + BuildLog.Warning("Test message", new object[] { 1 }); + BuildLog.Warning("Test message {0}", null); + BuildLog.Warning(new Exception("Some exeption")); + BuildLog.Warning(null, new object[] { 1 }); + + BuildLog.Error("Test message", null); + BuildLog.Error("Test message with parameter {0}", new object[] { 1 }); + BuildLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + BuildLog.Error("Test message", new object[] { 1 }); + BuildLog.Error("Test message {0}", null); + BuildLog.Error(new Exception("Some exeption")); + BuildLog.Error(null, new object[] { 1 }); + + BuildLog.FatalError("Test message", null); + BuildLog.FatalError("Test message with parameter {0}", new object[] { 1 }); + BuildLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + BuildLog.FatalError("Test message", new object[] { 1 }); + BuildLog.FatalError("Test message {0}", null); + BuildLog.FatalError(new Exception("Some exeption")); + BuildLog.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + + [Test] + public void UpgradeLogTest() + { + if (File.Exists(filePath)) + File.Delete(filePath); + UpgradeLog.Debug("Test message", null); + UpgradeLog.Debug("Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Debug("Test message", new object[] { 1 }); + UpgradeLog.Debug("Test message {0}", null); + UpgradeLog.Debug(new Exception("Some exeption")); + UpgradeLog.Debug(null, new object[] { 1 }); + + UpgradeLog.Info("Test message", null); + UpgradeLog.Info("Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Info("Test message", new object[] { 1 }); + UpgradeLog.Info("Test message {0}", null); + UpgradeLog.Info(new Exception("Some exeption")); + UpgradeLog.Info(null, new object[] { 1 }); + + UpgradeLog.Warning("Test message", null); + UpgradeLog.Warning("Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Warning("Test message", new object[] { 1 }); + UpgradeLog.Warning("Test message {0}", null); + UpgradeLog.Warning(new Exception("Some exeption")); + UpgradeLog.Warning(null, new object[] { 1 }); + + UpgradeLog.Error("Test message", null); + UpgradeLog.Error("Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.Error("Test message", new object[] { 1 }); + UpgradeLog.Error("Test message {0}", null); + UpgradeLog.Error(new Exception("Some exeption")); + UpgradeLog.Error(null, new object[] { 1 }); + + UpgradeLog.FatalError("Test message", null); + UpgradeLog.FatalError("Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + UpgradeLog.FatalError("Test message", new object[] { 1 }); + UpgradeLog.FatalError("Test message {0}", null); + UpgradeLog.FatalError(new Exception("Some exeption")); + UpgradeLog.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + + [Test] + public void SqlLogTest() + { + if (File.Exists(filePath)) + File.Delete(filePath); + SqlLog.Debug("Test message", null); + SqlLog.Debug("Test message with parameter {0}", new object[] { 1 }); + SqlLog.Debug(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + SqlLog.Debug("Test message", new object[] { 1 }); + SqlLog.Debug("Test message {0}", null); + SqlLog.Debug(new Exception("Some exeption")); + SqlLog.Debug(null, new object[] { 1 }); + + SqlLog.Info("Test message", null); + SqlLog.Info("Test message with parameter {0}", new object[] { 1 }); + SqlLog.Info(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + SqlLog.Info("Test message", new object[] { 1 }); + SqlLog.Info("Test message {0}", null); + SqlLog.Info(new Exception("Some exeption")); + SqlLog.Info(null, new object[] { 1 }); + + SqlLog.Warning("Test message", null); + SqlLog.Warning("Test message with parameter {0}", new object[] { 1 }); + SqlLog.Warning(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + SqlLog.Warning("Test message", new object[] { 1 }); + SqlLog.Warning("Test message {0}", null); + SqlLog.Warning(new Exception("Some exeption")); + SqlLog.Warning(null, new object[] { 1 }); + + SqlLog.Error("Test message", null); + SqlLog.Error("Test message with parameter {0}", new object[] { 1 }); + SqlLog.Error(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + SqlLog.Error("Test message", new object[] { 1 }); + SqlLog.Error("Test message {0}", null); + SqlLog.Error(new Exception("Some exeption")); + SqlLog.Error(null, new object[] { 1 }); + + SqlLog.FatalError("Test message", null); + SqlLog.FatalError("Test message with parameter {0}", new object[] { 1 }); + SqlLog.FatalError(new Exception("Some exception"), "Test message with parameter {0}", new object[] { 1 }); + SqlLog.FatalError("Test message", new object[] { 1 }); + SqlLog.FatalError("Test message {0}", null); + SqlLog.FatalError(new Exception("Some exeption")); + SqlLog.FatalError(null, new object[] { 1 }); + + Assert.IsTrue(File.Exists(filePath)); + Assert.AreEqual(File.ReadAllLines(filePath).Count(), 35); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DataUpgradeTest.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DataUpgradeTest.cs index c6a6ccc382..6ff682ae63 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DataUpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DataUpgradeTest.cs @@ -1,178 +1,178 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.04.17 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Tests.Core.Modelling.IndexingModel; - -namespace Xtensive.Orm.Tests.Core.Modelling -{ - [TestFixture] - public class DataUpgradeTest - { - [Test] - public void CreateModelTest() - { - var storage = CreateSimpleStorageModel(); - } - - [Test] - public void RemoveTypeTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var fkCRefB = s2.Resolve("Tables/C/ForeignKeys/FK_CRefB") as ForeignKeyInfo; - var tB = s2.Resolve("Tables/B") as TableInfo; - fkCRefB.Remove(); - tB.Remove(); - - var deleteDataHint = new DeleteDataHint( - "Tables/A", - new List {new IdentityPair("Tables/A/Columns/Id", "102", true)}); - var updateDataHint1 = new UpdateDataHint( - "Tables/C", - new List() {new IdentityPair("Tables/C/Columns/RefA", "Tables/B/Columns/Id", false)}, - new List> {new Pair("Tables/C/Columns/RefA", "null")}); - var updateDataHint2 = new UpdateDataHint( - "Tables/C", - new List{new IdentityPair("Tables/C/Columns/RefB", "Tables/B/Columns/Id", false)}, - new List>{new Pair("Tables/C/Columns/RefB", "null")}); - - hs.Add(deleteDataHint); - hs.Add(updateDataHint1); - hs.Add(updateDataHint2); - }, - (diff, actions) => { }); - } - - [Test] - public void RemoveForeignKeyTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var refCC = s2.Resolve("Tables/C/Columns/RefC") as ColumnInfo; - refCC.Type = new TypeInfo(typeof(int?), true); - }, - (diff, actions) => { }); - } - - private static StorageInfo CreateSimpleStorageModel() - { - var storage = new StorageInfo("Storage"); - - // Model: - // class A:Entity {int Id, int Data} - // class B:A {int Id} - // class C:B {int Id; A RefA; B RefB; C RefC} - - var tA = new TableInfo(storage, "A"); - var tB = new TableInfo(storage, "B"); - var tC = new TableInfo(storage, "C"); - - var idA = new ColumnInfo(tA, "Id", new TypeInfo(typeof (int))); - var idB = new ColumnInfo(tB, "Id", new TypeInfo(typeof (int))); - var idC = new ColumnInfo(tC, "Id", new TypeInfo(typeof (int))); - - var refCA = new ColumnInfo(tC, "RefA", new TypeInfo(typeof (int))); - var refCB = new ColumnInfo(tC, "RefB", new TypeInfo(typeof (int))); - var refCC = new ColumnInfo(tC, "RefC", new TypeInfo(typeof (int))); - - var dataA = new ColumnInfo(tA, "Data", new TypeInfo(typeof (int))); - - var pkA = new PrimaryIndexInfo(tA, "PK_A"); - var pkB = new PrimaryIndexInfo(tB, "PK_B"); - var pkC = new PrimaryIndexInfo(tC, "PK_C"); - new KeyColumnRef(pkA, idA); - new KeyColumnRef(pkB, idB); - new KeyColumnRef(pkC, idC); - pkC.PopulateValueColumns(); - pkA.PopulateValueColumns(); - - var ixRefCA = new SecondaryIndexInfo(tC, "FK_CRefA"); - new KeyColumnRef(ixRefCA, refCA); - ixRefCA.PopulatePrimaryKeyColumns(); - var ixRefCB = new SecondaryIndexInfo(tC, "FK_CRefB"); - new KeyColumnRef(ixRefCB, refCB); - ixRefCB.PopulatePrimaryKeyColumns(); - var ixRefCC = new SecondaryIndexInfo(tC, "FK_CRefC"); - new KeyColumnRef(ixRefCC, refCC); - ixRefCC.PopulatePrimaryKeyColumns(); - - var fkCRefA = new ForeignKeyInfo(tC, "FK_CRefA"); - fkCRefA.PrimaryKey = pkA; - fkCRefA.ForeignKeyColumns.Set(ixRefCA); - - var fkCRefB = new ForeignKeyInfo(tC, "FK_CRefB"); - fkCRefB.PrimaryKey = pkB; - fkCRefB.ForeignKeyColumns.Set(ixRefCB); - - var fkCRefC = new ForeignKeyInfo(tC, "FK_CRefC"); - fkCRefC.PrimaryKey = pkC; - fkCRefC.ForeignKeyColumns.Set(ixRefCC); - - var fkCA = new ForeignKeyInfo(tC, "FK_CA"); - fkCA.PrimaryKey = pkA; - fkCA.ForeignKeyColumns.Set(pkC); - - var fkBA = new ForeignKeyInfo(tB, "FK_BA"); - fkBA.PrimaryKey = pkA; - fkBA.ForeignKeyColumns.Set(pkB); - - storage.Validate(); - - return storage; - } - - #region Private methods - - private static void TestUpdate(StorageInfo origin, Action mutator, Action validator) - { - // - ;) - TestUpdate(origin, mutator, validator, true); - // TestUpdate(origin, mutator, null, false); - } - - private static void TestUpdate(StorageInfo origin, Action mutator, Action validator, bool useHints) - { - var s1 = Clone(origin); - var s2 = Clone(origin); - var hints = new HintSet(s1, s2); - mutator.Invoke(s1, s2, hints); - if (!useHints) - hints = new HintSet(s1, s2); - TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); - s1.Dump(); - s2.Dump(); - s1.Validate(); - s2.Validate(); - - // Comparing different models - TestLog.Info("Comparing models:"); - var comparer = new Comparer(); - var diff = comparer.Compare(s1, s2, hints); - TestLog.Info("\r\nDifference:\r\n{0}", diff); - var actions = new ActionSequence() { - new Upgrader().GetUpgradeSequence(diff, hints, comparer) - }; - TestLog.Info("\r\nActions:\r\n{0}", actions); - if (validator!=null) - validator.Invoke(diff, actions); - } - - private static StorageInfo Clone(StorageInfo server) - { - return (StorageInfo) server.Clone(null, server.Name); - // return (StorageInfo) LegacyBinarySerializer.Instance.Clone(server); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.04.17 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Tests.Core.Modelling.IndexingModel; + +namespace Xtensive.Orm.Tests.Core.Modelling +{ + [TestFixture] + public class DataUpgradeTest + { + [Test] + public void CreateModelTest() + { + var storage = CreateSimpleStorageModel(); + } + + [Test] + public void RemoveTypeTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var fkCRefB = s2.Resolve("Tables/C/ForeignKeys/FK_CRefB") as ForeignKeyInfo; + var tB = s2.Resolve("Tables/B") as TableInfo; + fkCRefB.Remove(); + tB.Remove(); + + var deleteDataHint = new DeleteDataHint( + "Tables/A", + new List {new IdentityPair("Tables/A/Columns/Id", "102", true)}); + var updateDataHint1 = new UpdateDataHint( + "Tables/C", + new List() {new IdentityPair("Tables/C/Columns/RefA", "Tables/B/Columns/Id", false)}, + new List> {new Pair("Tables/C/Columns/RefA", "null")}); + var updateDataHint2 = new UpdateDataHint( + "Tables/C", + new List{new IdentityPair("Tables/C/Columns/RefB", "Tables/B/Columns/Id", false)}, + new List>{new Pair("Tables/C/Columns/RefB", "null")}); + + hs.Add(deleteDataHint); + hs.Add(updateDataHint1); + hs.Add(updateDataHint2); + }, + (diff, actions) => { }); + } + + [Test] + public void RemoveForeignKeyTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var refCC = s2.Resolve("Tables/C/Columns/RefC") as ColumnInfo; + refCC.Type = new TypeInfo(typeof(int?), true); + }, + (diff, actions) => { }); + } + + private static StorageInfo CreateSimpleStorageModel() + { + var storage = new StorageInfo("Storage"); + + // Model: + // class A:Entity {int Id, int Data} + // class B:A {int Id} + // class C:B {int Id; A RefA; B RefB; C RefC} + + var tA = new TableInfo(storage, "A"); + var tB = new TableInfo(storage, "B"); + var tC = new TableInfo(storage, "C"); + + var idA = new ColumnInfo(tA, "Id", new TypeInfo(typeof (int))); + var idB = new ColumnInfo(tB, "Id", new TypeInfo(typeof (int))); + var idC = new ColumnInfo(tC, "Id", new TypeInfo(typeof (int))); + + var refCA = new ColumnInfo(tC, "RefA", new TypeInfo(typeof (int))); + var refCB = new ColumnInfo(tC, "RefB", new TypeInfo(typeof (int))); + var refCC = new ColumnInfo(tC, "RefC", new TypeInfo(typeof (int))); + + var dataA = new ColumnInfo(tA, "Data", new TypeInfo(typeof (int))); + + var pkA = new PrimaryIndexInfo(tA, "PK_A"); + var pkB = new PrimaryIndexInfo(tB, "PK_B"); + var pkC = new PrimaryIndexInfo(tC, "PK_C"); + new KeyColumnRef(pkA, idA); + new KeyColumnRef(pkB, idB); + new KeyColumnRef(pkC, idC); + pkC.PopulateValueColumns(); + pkA.PopulateValueColumns(); + + var ixRefCA = new SecondaryIndexInfo(tC, "FK_CRefA"); + new KeyColumnRef(ixRefCA, refCA); + ixRefCA.PopulatePrimaryKeyColumns(); + var ixRefCB = new SecondaryIndexInfo(tC, "FK_CRefB"); + new KeyColumnRef(ixRefCB, refCB); + ixRefCB.PopulatePrimaryKeyColumns(); + var ixRefCC = new SecondaryIndexInfo(tC, "FK_CRefC"); + new KeyColumnRef(ixRefCC, refCC); + ixRefCC.PopulatePrimaryKeyColumns(); + + var fkCRefA = new ForeignKeyInfo(tC, "FK_CRefA"); + fkCRefA.PrimaryKey = pkA; + fkCRefA.ForeignKeyColumns.Set(ixRefCA); + + var fkCRefB = new ForeignKeyInfo(tC, "FK_CRefB"); + fkCRefB.PrimaryKey = pkB; + fkCRefB.ForeignKeyColumns.Set(ixRefCB); + + var fkCRefC = new ForeignKeyInfo(tC, "FK_CRefC"); + fkCRefC.PrimaryKey = pkC; + fkCRefC.ForeignKeyColumns.Set(ixRefCC); + + var fkCA = new ForeignKeyInfo(tC, "FK_CA"); + fkCA.PrimaryKey = pkA; + fkCA.ForeignKeyColumns.Set(pkC); + + var fkBA = new ForeignKeyInfo(tB, "FK_BA"); + fkBA.PrimaryKey = pkA; + fkBA.ForeignKeyColumns.Set(pkB); + + storage.Validate(); + + return storage; + } + + #region Private methods + + private static void TestUpdate(StorageInfo origin, Action mutator, Action validator) + { + // - ;) + TestUpdate(origin, mutator, validator, true); + // TestUpdate(origin, mutator, null, false); + } + + private static void TestUpdate(StorageInfo origin, Action mutator, Action validator, bool useHints) + { + var s1 = Clone(origin); + var s2 = Clone(origin); + var hints = new HintSet(s1, s2); + mutator.Invoke(s1, s2, hints); + if (!useHints) + hints = new HintSet(s1, s2); + TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); + s1.Dump(); + s2.Dump(); + s1.Validate(); + s2.Validate(); + + // Comparing different models + TestLog.Info("Comparing models:"); + var comparer = new Comparer(); + var diff = comparer.Compare(s1, s2, hints); + TestLog.Info("\r\nDifference:\r\n{0}", diff); + var actions = new ActionSequence() { + new Upgrader().GetUpgradeSequence(diff, hints, comparer) + }; + TestLog.Info("\r\nActions:\r\n{0}", actions); + if (validator!=null) + validator.Invoke(diff, actions); + } + + private static StorageInfo Clone(StorageInfo server) + { + return (StorageInfo) server.Clone(null, server.Name); + // return (StorageInfo) LegacyBinarySerializer.Instance.Clone(server); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Database.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Database.cs index 851c2a0a9a..435b0edc1f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Database.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Database.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Database : NodeBase - { - private User owner; - - [Property(Priority = -1000)] - public User Owner - { - get { return owner; } - set { - ChangeProperty("Owner", value, (x,v) => ((Database)x).owner = v); - } - } - - [Property] - public SchemaCollection Schemas { get; private set; } - - protected override Nesting CreateNesting() - { - return new Nesting(this, "Databases"); - } - - protected override void Initialize() - { - base.Initialize(); - if (Schemas==null) - Schemas = new SchemaCollection(this); - } - - - public Database(Server parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Database : NodeBase + { + private User owner; + + [Property(Priority = -1000)] + public User Owner + { + get { return owner; } + set { + ChangeProperty("Owner", value, (x,v) => ((Database)x).owner = v); + } + } + + [Property] + public SchemaCollection Schemas { get; private set; } + + protected override Nesting CreateNesting() + { + return new Nesting(this, "Databases"); + } + + protected override void Initialize() + { + base.Initialize(); + if (Schemas==null) + Schemas = new SchemaCollection(this); + } + + + public Database(Server parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/DatabaseCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/DatabaseCollection.cs index 7cad22e55e..1d5d328e7c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/DatabaseCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/DatabaseCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class DatabaseCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - internal DatabaseCollection(Server parent) - : base(parent, "Databases") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class DatabaseCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + internal DatabaseCollection(Server parent) + : base(parent, "Databases") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Index.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Index.cs index d4f66e806c..84452cc475 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Index.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Index.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using Xtensive.Core; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public abstract class Index : NodeBase - { - private bool isPrimary; - private bool isUnique; - - /// - /// Gets a value indicating whether this is primary index. - /// - [Property (IgnoreInComparison = true)] - public bool IsPrimary { - get { return isPrimary; } - } - - /// - /// Gets or sets a value indicating whether this index is unique. - /// - /// Index is . - [Property] - public bool IsUnique { - get { return isUnique; } - set { - if (IsPrimary && !value) - throw Exceptions.AlreadyInitialized("IsUnique"); - ChangeProperty("IsUnique", value, (x,v) => ((Index)x).isUnique = v); - } - } - - protected override void Initialize() - { - isPrimary = this is PrimaryIndex; - if (isPrimary) - isUnique = true; - base.Initialize(); - } - - public Index(Table parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using Xtensive.Core; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public abstract class Index : NodeBase
+ { + private bool isPrimary; + private bool isUnique; + + /// + /// Gets a value indicating whether this is primary index. + /// + [Property (IgnoreInComparison = true)] + public bool IsPrimary { + get { return isPrimary; } + } + + /// + /// Gets or sets a value indicating whether this index is unique. + /// + /// Index is . + [Property] + public bool IsUnique { + get { return isUnique; } + set { + if (IsPrimary && !value) + throw Exceptions.AlreadyInitialized("IsUnique"); + ChangeProperty("IsUnique", value, (x,v) => ((Index)x).isUnique = v); + } + } + + protected override void Initialize() + { + isPrimary = this is PrimaryIndex; + if (isPrimary) + isUnique = true; + base.Initialize(); + } + + public Index(Table parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/IndexCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/IndexCollection.cs index bb73f97489..a2052e80d7 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/IndexCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/IndexCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class SecondaryIndexCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - public SecondaryIndexCollection(Table parent) - : base(parent, "SecondaryIndexes") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class SecondaryIndexCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + public SecondaryIndexCollection(Table parent) + : base(parent, "SecondaryIndexes") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeBase.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeBase.cs index 6e2fc82b0e..8b25034564 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeBase.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; -using Xtensive.Reflection; -using Xtensive.Modelling.Attributes; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public abstract class NodeBase : Node - where TParent : Node - { - protected override void PerformCreate() - { - base.PerformCreate(); - TestLog.Info("Created: {0}", this); - } - - protected override void PerformMove(Node newParent, string newName, int newIndex) - { - using (TestLog.InfoRegion("Moving: {0}", this)) { - if (Parent!=newParent) - TestLog.Info("new Parent={0}", newParent); - if (Name!=newName) - TestLog.Info("new Name={0}", newName); - if (Index!=newIndex) - TestLog.Info("new Index={0}", newIndex); - base.PerformMove(newParent, newName, newIndex); - } - } - - protected override void PerformShift(int offset) - { - TestLog.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); - base.PerformShift(offset); - } - - protected override void PerformRemove(Node source) - { - base.PerformRemove(source); - if (source==this) - TestLog.Info("Removed: {0}", this); - } - - protected override void OnPropertyChanged(string name) - { - base.OnPropertyChanged(name); - var accessor = PropertyAccessors.GetValueOrDefault(name); - if (accessor!=null) { - if (!accessor.HasGetter) - return; - if (accessor.IsSystem) - return; - TestLog.Info("Changed: {0}, {1} = {2}", this, name, GetProperty(name)); - } - } - - - // Constructors - - protected NodeBase(TParent parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; +using Xtensive.Reflection; +using Xtensive.Modelling.Attributes; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public abstract class NodeBase : Node + where TParent : Node + { + protected override void PerformCreate() + { + base.PerformCreate(); + TestLog.Info("Created: {0}", this); + } + + protected override void PerformMove(Node newParent, string newName, int newIndex) + { + using (TestLog.InfoRegion("Moving: {0}", this)) { + if (Parent!=newParent) + TestLog.Info("new Parent={0}", newParent); + if (Name!=newName) + TestLog.Info("new Name={0}", newName); + if (Index!=newIndex) + TestLog.Info("new Index={0}", newIndex); + base.PerformMove(newParent, newName, newIndex); + } + } + + protected override void PerformShift(int offset) + { + TestLog.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); + base.PerformShift(offset); + } + + protected override void PerformRemove(Node source) + { + base.PerformRemove(source); + if (source==this) + TestLog.Info("Removed: {0}", this); + } + + protected override void OnPropertyChanged(string name) + { + base.OnPropertyChanged(name); + var accessor = PropertyAccessors.GetValueOrDefault(name); + if (accessor!=null) { + if (!accessor.HasGetter) + return; + if (accessor.IsSystem) + return; + TestLog.Info("Changed: {0}, {1} = {2}", this, name, GetProperty(name)); + } + } + + + // Constructors + + protected NodeBase(TParent parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeCollectionBase.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeCollectionBase.cs index 57122b8cdd..3d8839313f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeCollectionBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/NodeCollectionBase.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public class NodeCollectionBase : NodeCollection - where TNode : Node - where TParent : Node - { - public NodeCollectionBase(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public class NodeCollectionBase : NodeCollection + where TNode : Node + where TParent : Node + { + public NodeCollectionBase(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/PrimaryIndex.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/PrimaryIndex.cs index f828c20022..75c205e02d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/PrimaryIndex.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/PrimaryIndex.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class PrimaryIndex : Index - { - protected override Nesting CreateNesting() - { - return new Nesting(this, "PrimaryIndex"); - } - - - public PrimaryIndex(Table parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class PrimaryIndex : Index + { + protected override Nesting CreateNesting() + { + return new Nesting(this, "PrimaryIndex"); + } + + + public PrimaryIndex(Table parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Ref.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Ref.cs index 61243f888b..1eee59cc92 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Ref.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Ref.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using System.Diagnostics; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public abstract class Ref : NodeBase, - INodeReference - where TTarget : Node - where TParent : Node - { - private TTarget value; - - [Property(IsImmutable = true)] - public TTarget Value { - get { return value; } - set { - ChangeProperty("Value", value, (x,v) => ((Ref)x).value = v); - } - } - - Node INodeReference.Value { - get { return Value; } - set { Value = (TTarget) value; } - } - - - public Ref(TParent parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using System.Diagnostics; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public abstract class Ref : NodeBase, + INodeReference + where TTarget : Node + where TParent : Node + { + private TTarget value; + + [Property(IsImmutable = true)] + public TTarget Value { + get { return value; } + set { + ChangeProperty("Value", value, (x,v) => ((Ref)x).value = v); + } + } + + Node INodeReference.Value { + get { return Value; } + set { Value = (TTarget) value; } + } + + + public Ref(TParent parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Role.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Role.cs index e0643a5324..f004264e18 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Role.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Role.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Role : NodeBase - { - protected override Nesting CreateNesting() - { - return new Nesting(this, "Roles"); - } - - - public Role(Security parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Role : NodeBase + { + protected override Nesting CreateNesting() + { + return new Nesting(this, "Roles"); + } + + + public Role(Security parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleCollection.cs index 6aede6317c..0eecf9fa92 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class RoleCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - internal RoleCollection(Security parent) - : base(parent, "Roles") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class RoleCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + internal RoleCollection(Security parent) + : base(parent, "Roles") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRef.cs index b3da36a15b..427f86f72a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRef.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class RoleRef : Ref, - IUnnamedNode - { - protected override Nesting CreateNesting() - { - return new Nesting(this, "Roles"); - } - - public RoleRef(User parent, Role role) - : base(parent, null) - { - Value = role; - } - - public RoleRef(User parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class RoleRef : Ref, + IUnnamedNode + { + protected override Nesting CreateNesting() + { + return new Nesting(this, "Roles"); + } + + public RoleRef(User parent, Role role) + : base(parent, null) + { + Value = role; + } + + public RoleRef(User parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRefCollection.cs index ab878e5442..adda544c0f 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/RoleRefCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class RoleRefCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - public RoleRefCollection(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class RoleRefCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + public RoleRefCollection(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Schema.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Schema.cs index 186ac1eaf5..5a8dd1c827 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Schema.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Schema.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Schema : NodeBase - { - [Property] - public TableCollection Tables { get; private set; } - - protected override Nesting CreateNesting() - { - return new Nesting(this, "Schemas"); - } - - protected override void Initialize() - { - base.Initialize(); - if (Tables==null) - Tables = new TableCollection(this); - } - - - public Schema(Database parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Schema : NodeBase + { + [Property] + public TableCollection Tables { get; private set; } + + protected override Nesting CreateNesting() + { + return new Nesting(this, "Schemas"); + } + + protected override void Initialize() + { + base.Initialize(); + if (Tables==null) + Tables = new TableCollection(this); + } + + + public Schema(Database parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SchemaCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SchemaCollection.cs index 219a3eb158..651a456b21 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SchemaCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SchemaCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class SchemaCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - internal SchemaCollection(Database parent) - : base(parent, "Schemas") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class SchemaCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + internal SchemaCollection(Database parent) + : base(parent, "Schemas") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SecondaryIndex.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SecondaryIndex.cs index 0c71c548a1..51439de0cc 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SecondaryIndex.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/SecondaryIndex.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class SecondaryIndex : Index - { - protected override Nesting CreateNesting() - { - return new Nesting(this, "SecondaryIndexes"); - } - - - public SecondaryIndex(Table parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class SecondaryIndex : Index + { + protected override Nesting CreateNesting() + { + return new Nesting(this, "SecondaryIndexes"); + } + + + public SecondaryIndex(Table parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Security.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Security.cs index 2518f4b7a0..77199376c9 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Security.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Security.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.20 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Security : NodeBase - { - [Property(Priority = 100)] - public RoleCollection Roles { get; private set; } - - [Property(Priority = 200)] - public UserCollection Users { get; private set; } - - protected override Nesting CreateNesting() - { - return new Nesting(this, "Security"); - } - - protected override void Initialize() - { - base.Initialize(); - if (Users==null) - Users = new UserCollection(this); - if (Roles==null) - Roles = new RoleCollection(this); - } - - - public Security(Server parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.20 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Security : NodeBase + { + [Property(Priority = 100)] + public RoleCollection Roles { get; private set; } + + [Property(Priority = 200)] + public UserCollection Users { get; private set; } + + protected override Nesting CreateNesting() + { + return new Nesting(this, "Security"); + } + + protected override void Initialize() + { + base.Initialize(); + if (Users==null) + Users = new UserCollection(this); + if (Roles==null) + Roles = new RoleCollection(this); + } + + + public Security(Server parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Server.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Server.cs index f5535660d3..0bafffe518 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Server.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Server.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Server : NodeBase, - IModel - { - private ActionSequence actions; - private Security security; - - public ActionSequence Actions { - get { return actions; } - set { - this.EnsureIsEditable(); - actions = value; - } - } - - [Property] - public DatabaseCollection Databases { get; private set; } - - [Property(Priority = -1000)] - public Security Security { - get { return security; } - set { - ChangeProperty("Security", value, (x,v) => ((Server)x).security = v); - } - } - - protected override Nesting CreateNesting() - { - return new Nesting(this); - } - - protected override void Initialize() - { - base.Initialize(); - if (Databases==null) - Databases = new DatabaseCollection(this); - } - - - public Server(string name) - : base(null, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Server : NodeBase, + IModel + { + private ActionSequence actions; + private Security security; + + public ActionSequence Actions { + get { return actions; } + set { + this.EnsureIsEditable(); + actions = value; + } + } + + [Property] + public DatabaseCollection Databases { get; private set; } + + [Property(Priority = -1000)] + public Security Security { + get { return security; } + set { + ChangeProperty("Security", value, (x,v) => ((Server)x).security = v); + } + } + + protected override Nesting CreateNesting() + { + return new Nesting(this); + } + + protected override void Initialize() + { + base.Initialize(); + if (Databases==null) + Databases = new DatabaseCollection(this); + } + + + public Server(string name) + : base(null, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Table.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Table.cs index 66a2bad73d..8e7b59e6ea 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Table.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/Table.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class Table : NodeBase - { - private PrimaryIndex primaryIndex; - - [Property(Priority = 100)] - public PrimaryIndex PrimaryIndex { - get { return primaryIndex; } - set { - ChangeProperty("PrimaryIndex", value, (x,v) => ((Table)x).primaryIndex = v); - } - } - - [Property(Priority = 200)] - public SecondaryIndexCollection SecondaryIndexes { get; private set; } - - protected override Nesting CreateNesting() - { - return new Nesting(this, "Tables"); - } - - protected override void Initialize() - { - base.Initialize(); - if (SecondaryIndexes==null) - SecondaryIndexes = new SecondaryIndexCollection(this); - } - - - public Table(Schema parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class Table : NodeBase + { + private PrimaryIndex primaryIndex; + + [Property(Priority = 100)] + public PrimaryIndex PrimaryIndex { + get { return primaryIndex; } + set { + ChangeProperty("PrimaryIndex", value, (x,v) => ((Table)x).primaryIndex = v); + } + } + + [Property(Priority = 200)] + public SecondaryIndexCollection SecondaryIndexes { get; private set; } + + protected override Nesting CreateNesting() + { + return new Nesting(this, "Tables"); + } + + protected override void Initialize() + { + base.Initialize(); + if (SecondaryIndexes==null) + SecondaryIndexes = new SecondaryIndexCollection(this); + } + + + public Table(Schema parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/TableCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/TableCollection.cs index 66e4e51b3c..7c5b0182b1 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/TableCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/TableCollection.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class TableCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - internal TableCollection(Schema parent) - : base(parent, "Tables") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class TableCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + internal TableCollection(Schema parent) + : base(parent, "Tables") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/User.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/User.cs index 290204ba0c..53f13312c2 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/User.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/User.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class User : NodeBase - { - private string password; - - [Property] - public string Password - { - get { return password; } - set { - ChangeProperty("Password", value, (x,v) => ((User)x).password = v); - } - } - - [Property(Priority = 100)] - public RoleRefCollection Roles { get; private set; } - - protected override Nesting CreateNesting() - { - return new Nesting(this, "Users"); - } - - protected override void Initialize() - { - base.Initialize(); - if (Roles==null) - Roles = new RoleRefCollection(this, "Roles"); - } - - - public User(Security parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class User : NodeBase + { + private string password; + + [Property] + public string Password + { + get { return password; } + set { + ChangeProperty("Password", value, (x,v) => ((User)x).password = v); + } + } + + [Property(Priority = 100)] + public RoleRefCollection Roles { get; private set; } + + protected override Nesting CreateNesting() + { + return new Nesting(this, "Users"); + } + + protected override void Initialize() + { + base.Initialize(); + if (Roles==null) + Roles = new RoleRefCollection(this, "Roles"); + } + + + public User(Security parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/UserCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/UserCollection.cs index 6f48c62dc5..2683106acc 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/UserCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModel/UserCollection.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel -{ - [Serializable] - public sealed class UserCollection : NodeCollectionBase - { - internal UserCollection(Security parent) - : base(parent, "Users") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Tests.Core.Modelling.DatabaseModel +{ + [Serializable] + public sealed class UserCollection : NodeCollectionBase + { + internal UserCollection(Security parent) + : base(parent, "Users") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModelTest.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModelTest.cs index f0332d0e9b..a41d8497a2 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModelTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/DatabaseModelTest.cs @@ -1,368 +1,368 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.03.18 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Core.Modelling.DatabaseModel; - -namespace Xtensive.Orm.Tests.Core.Modelling -{ - [TestFixture] - public class DatabaseModelTest - { - private Server srv; - private DatabaseModel.Security sec1; - private DatabaseModel.Security sec2; - private User u1; - private User u2; - private Role r1; - private Role r2; - private Database db1; - private Database db2; - private Schema s1; - private Schema s2; - private Table t1; - private Table t2; - - [OneTimeSetUp] - public void Setup() - { - srv = new Server("srv"); - srv.Actions = new ActionSequence(); - sec1 = new DatabaseModel.Security(srv, "sec1"); - u1 = new User(sec1, "u1") { Password = "1"}; - u1.Password = "u1"; - u2 = new User(sec1, "u2") { Password = "2"}; - u2.Password = "u2"; - r1 = new Role(sec1, "r1"); - r2 = new Role(sec1, "r2"); - new RoleRef(u1, r1); - new RoleRef(u1, r2); - new RoleRef(u2, r2); - // sec2 = new Security(srv, "sec2"); - db1 = new Database(srv, "db1") { Owner = u1 }; - db2 = new Database(srv, "db2") { Owner = u1 }; - s1 = new Schema(db1, "s1"); - t1 = new Table(s1, "t1"); - new PrimaryIndex(t1, "PK_t1"); - new SecondaryIndex(t1, "SI_t1a"); - new SecondaryIndex(t1, "SI_t1b"); - new SecondaryIndex(t1, "SI_t1ab"); - s2 = new Schema(db1, "s2"); - t2 = new Table(s2, "t2"); - new PrimaryIndex(t2, "PK_t2"); - new SecondaryIndex(t2, "SI_t2a"); - new SecondaryIndex(t2, "SI_t2ab"); - } - - [Test] - [Ignore("TODO: AY check it ASAP")] - public void SerializationTest() - { - var clone = Cloner.Clone(srv); -// clone.Dump(); - clone.Validate(); - } - - [Test] - public void CloneTest() - { - var clone = Clone(srv); - clone.Validate(); -// clone.Dump(); - } - - [Test] - public void BaseComparisonTest() - { - var source = new Server("Source"); - var target = srv; - target.Validate(); - - TestLog.Info("Source model:"); -// source.Dump(); - TestLog.Info("Target model:"); -// target.Dump(); - - var comparer = new Comparer(); - var hints = new HintSet(source, target) { - new RenameHint("", "") - }; - Difference diff = comparer.Compare(source, target, hints); - TestLog.Info("Difference: \r\n{0}", diff); - - var actions = new ActionSequence { - new Upgrader().GetUpgradeSequence(diff, hints, comparer) - }; - TestLog.Info("Actions: \r\n{0}", actions); - - TestLog.Info("Applying actions..."); - actions.Apply(source); - - TestLog.Info("Updated Model 1:"); -// source.Dump(); - } - - [Test] - public void ComplexComparisonTest() - { - srv.Validate(); - TestUpdate((s1, s2, hs) => { - s1.Databases[1].Remove(); - s2.Databases[0].Remove(); - s2.Security.Users[0].Name = "Renamed"; - hs.Add(new RenameHint(s1.Security.Users[0].Path, s2.Security.Users[0].Path)); - }); - } - - [Test] - public void ComplexReferenceComparisonTest() - { - srv.Validate(); - TestUpdate((s1, s2, hs) => { - var s1r = s1.Security.Roles[0]; - RemoveReferencesTo(s1r); - s1r.Remove(); - var s2r = s2.Security.Roles[1]; - RemoveReferencesTo(s2r); - s2r.Remove(); - }); - } - - private void RemoveReferencesTo(Role role) - { - var s = role.Model; - var roleRefs = new List(); - foreach (var roleRef in s.Security.Users.SelectMany(u => u.Roles)) - if (roleRef.Value==role) - roleRefs.Add(roleRef); - foreach (var roleRef in roleRefs) - roleRef.Remove(); - } - - [Test] - public void CreateActionsTest() - { - TestLog.Info("Model:"); - srv.Dump(); - TestLog.Info("Actions:"); - TestLog.Info("{0}", srv.Actions); - - TestLog.Info("Creating new model..."); - var srvx = new Server("srv"); - TestLog.Info("Applying actions..."); - srv.Actions.Apply(srvx); - TestLog.Info("Updated model:"); -// srvx.Dump(); - } - - [Test] - [Ignore("TODO: AY check it ASAP")] - public void UnnamedNodeTest() - { - var rr0 = u1.Roles[0]; - var rr1 = u1.Roles[1]; - Assert.AreEqual(rr0.Name, "0"); - Assert.AreEqual(rr1.Name, "1"); - - rr0.Index = 1; - Assert.AreEqual(rr0.Name, "1"); - Assert.AreEqual(rr1.Name, "0"); - Assert.AreEqual(rr0, u1.Roles[1]); - Assert.AreEqual(rr1, u1.Roles[0]); - - rr0.Index = 0; - Assert.AreEqual(rr0.Name, "0"); - Assert.AreEqual(rr1.Name, "1"); - Assert.AreEqual(rr0, u1.Roles[0]); - Assert.AreEqual(rr1, u1.Roles[1]); - } - - [Test] - public void IndexAndParentTest() - { - // srv - Assert.AreEqual(srv.Index, 0); - srv.Index = 0; - Assert.AreEqual(srv.Index, 0); - AssertEx.Throws( - () => srv.Index=1); - AssertEx.Throws( - () => srv.Index=-1); - - // db1, db2 - Assert.AreEqual(db1.Index, 0); - Assert.AreEqual(db2.Index, 1); - AssertEx.Throws( - () => db1.Index=-1); - AssertEx.Throws( - () => db1.Index=2); - db1.Index = 0; - Assert.AreEqual(db1.Index, 0); - Assert.AreEqual(db2.Index, 1); - db1.Index = 1; - Assert.AreEqual(db1.Index, 1); - Assert.AreEqual(db2.Index, 0); - db2.Index = 1; - Assert.AreEqual(db1.Index, 0); - Assert.AreEqual(db2.Index, 1); - - // s1, s2 : index - Assert.AreEqual(s1.Parent, db1); - Assert.AreEqual(s2.Parent, db1); - s1.Parent = db1; - Assert.AreEqual(s1.Parent, db1); - s1.Parent = db2; - Assert.AreEqual(s1.Parent, db2); - Assert.AreEqual(s2.Parent, db1); - Assert.AreEqual(s1.Index, 0); - Assert.AreEqual(s2.Index, 0); - s2.Parent = db2; - Assert.AreEqual(s1.Parent, db2); - Assert.AreEqual(s2.Parent, db2); - Assert.AreEqual(s1.Index, 0); - Assert.AreEqual(s2.Index, 1); - s2.Parent = db1; - s1.Parent = db1; - Assert.AreEqual(s1.Index, 1); - Assert.AreEqual(s2.Index, 0); - s1.Index = 0; - Assert.AreEqual(s1.Index, 0); - Assert.AreEqual(s2.Index, 1); - Assert.AreEqual(s1.Parent, db1); - Assert.AreEqual(s2.Parent, db1); - } - - [Test] - public void ContainerPropertyTest() - { - srv.Security.Remove(); - Assert.AreEqual(sec1.State, NodeState.Removed); - Assert.AreEqual(srv.Security, null); - - sec2 = new DatabaseModel.Security(srv, "sec2"); - Assert.AreEqual(srv.Security, sec2); - AssertEx.Throws( - () => sec1 = new DatabaseModel.Security(srv, "sec3")); - - sec2.Remove(); - Assert.AreEqual(sec2.State, NodeState.Removed); - Assert.AreEqual(srv.Security, null); - - sec1 = new DatabaseModel.Security(srv, "sec1"); - Assert.AreEqual(srv.Security, sec1); - } - - [Test] - public void PathTest() - { - Assert.AreEqual(srv.Path, string.Empty); - Assert.AreEqual(srv, srv.Resolve(string.Empty)); - - Assert.AreEqual(srv.Databases.Path, "Databases"); - Assert.AreEqual(srv.Databases, srv.Resolve("Databases")); - - Assert.AreEqual(srv.Security.Path, "Security"); - Assert.AreEqual(srv.Security, srv.Resolve("Security")); - - Assert.AreEqual(srv.Security.Users.Path, "Security/Users"); - Assert.AreEqual(srv.Security.Users, srv.Resolve("Security/Users")); - - Assert.AreEqual(db2.Path, "Databases/db2"); - Assert.AreEqual(db2, srv.Resolve("Databases/db2")); - - Assert.AreEqual(db2.Schemas.Path, "Databases/db2/Schemas"); - Assert.AreEqual(db2.Schemas, srv.Resolve("Databases/db2/Schemas")); - - Assert.AreEqual(s1.Path, "Databases/db1/Schemas/s1"); - Assert.AreEqual(s1, srv.Resolve("Databases/db1/Schemas/s1")); - - Assert.AreEqual(s2.Path, "Databases/db1/Schemas/s2"); - Assert.AreEqual(s2, srv.Resolve("Databases/db1/Schemas/s2")); - } - - [Test] - public void DumpTest() - { -// srv.Dump(); - } - - [Test] - public void ApplyTest() - { - TestLog.Info("Model:"); - srv.Dump(); - TestLog.Info("Actions:"); - TestLog.Info("{0}", srv.Actions); - - TestLog.Info("Creating new model..."); - var srvx = new Server("srv"); - TestLog.Info("Applying actions..."); - srv.Actions.Apply(srvx); - TestLog.Info("Updated model:"); -// srvx.Dump(); - } - - [Test] - public void LockModelTest() - { - srv.Lock(true); - AssertEx.Throws( - () => new Database(srv, "newDatabase")); - AssertEx.Throws( - () => srv.Databases.Clear()); - } - - #region Private methods - - private void TestUpdate(Action update) - { - TestUpdate(update, true); - TestUpdate(update, false); - } - - private void TestUpdate(Action update, bool useHints) - { - var s1 = Clone(srv); - var s2 = Clone(srv); - var hints = new HintSet(s1, s2); - update.Invoke(s1, s2, hints); - if (!useHints) - hints = new HintSet(s1, s2); - TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); -// s1.Dump(); -// s2.Dump(); - s1.Validate(); - s2.Validate(); - - // Comparing different models - TestLog.Info("Comparing models:"); - var comparer = new Comparer(); - var diff = comparer.Compare(s1, s2, hints); - TestLog.Info("\r\nDifference:\r\n{0}", diff); - var actions = new ActionSequence() { - new Upgrader().GetUpgradeSequence(diff, hints, comparer) - }; - TestLog.Info("\r\nActions:\r\n{0}", actions); - } - - private Server Clone(Server server) - { - return (Server) server.Clone(null, server.Name); - // return (Server) LegacyBinarySerializer.Instance.Clone(server); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.03.18 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Core.Modelling.DatabaseModel; + +namespace Xtensive.Orm.Tests.Core.Modelling +{ + [TestFixture] + public class DatabaseModelTest + { + private Server srv; + private DatabaseModel.Security sec1; + private DatabaseModel.Security sec2; + private User u1; + private User u2; + private Role r1; + private Role r2; + private Database db1; + private Database db2; + private Schema s1; + private Schema s2; + private Table t1; + private Table t2; + + [OneTimeSetUp] + public void Setup() + { + srv = new Server("srv"); + srv.Actions = new ActionSequence(); + sec1 = new DatabaseModel.Security(srv, "sec1"); + u1 = new User(sec1, "u1") { Password = "1"}; + u1.Password = "u1"; + u2 = new User(sec1, "u2") { Password = "2"}; + u2.Password = "u2"; + r1 = new Role(sec1, "r1"); + r2 = new Role(sec1, "r2"); + new RoleRef(u1, r1); + new RoleRef(u1, r2); + new RoleRef(u2, r2); + // sec2 = new Security(srv, "sec2"); + db1 = new Database(srv, "db1") { Owner = u1 }; + db2 = new Database(srv, "db2") { Owner = u1 }; + s1 = new Schema(db1, "s1"); + t1 = new Table(s1, "t1"); + new PrimaryIndex(t1, "PK_t1"); + new SecondaryIndex(t1, "SI_t1a"); + new SecondaryIndex(t1, "SI_t1b"); + new SecondaryIndex(t1, "SI_t1ab"); + s2 = new Schema(db1, "s2"); + t2 = new Table(s2, "t2"); + new PrimaryIndex(t2, "PK_t2"); + new SecondaryIndex(t2, "SI_t2a"); + new SecondaryIndex(t2, "SI_t2ab"); + } + + [Test] + [Ignore("TODO: AY check it ASAP")] + public void SerializationTest() + { + var clone = Cloner.Clone(srv); +// clone.Dump(); + clone.Validate(); + } + + [Test] + public void CloneTest() + { + var clone = Clone(srv); + clone.Validate(); +// clone.Dump(); + } + + [Test] + public void BaseComparisonTest() + { + var source = new Server("Source"); + var target = srv; + target.Validate(); + + TestLog.Info("Source model:"); +// source.Dump(); + TestLog.Info("Target model:"); +// target.Dump(); + + var comparer = new Comparer(); + var hints = new HintSet(source, target) { + new RenameHint("", "") + }; + Difference diff = comparer.Compare(source, target, hints); + TestLog.Info("Difference: \r\n{0}", diff); + + var actions = new ActionSequence { + new Upgrader().GetUpgradeSequence(diff, hints, comparer) + }; + TestLog.Info("Actions: \r\n{0}", actions); + + TestLog.Info("Applying actions..."); + actions.Apply(source); + + TestLog.Info("Updated Model 1:"); +// source.Dump(); + } + + [Test] + public void ComplexComparisonTest() + { + srv.Validate(); + TestUpdate((s1, s2, hs) => { + s1.Databases[1].Remove(); + s2.Databases[0].Remove(); + s2.Security.Users[0].Name = "Renamed"; + hs.Add(new RenameHint(s1.Security.Users[0].Path, s2.Security.Users[0].Path)); + }); + } + + [Test] + public void ComplexReferenceComparisonTest() + { + srv.Validate(); + TestUpdate((s1, s2, hs) => { + var s1r = s1.Security.Roles[0]; + RemoveReferencesTo(s1r); + s1r.Remove(); + var s2r = s2.Security.Roles[1]; + RemoveReferencesTo(s2r); + s2r.Remove(); + }); + } + + private void RemoveReferencesTo(Role role) + { + var s = role.Model; + var roleRefs = new List(); + foreach (var roleRef in s.Security.Users.SelectMany(u => u.Roles)) + if (roleRef.Value==role) + roleRefs.Add(roleRef); + foreach (var roleRef in roleRefs) + roleRef.Remove(); + } + + [Test] + public void CreateActionsTest() + { + TestLog.Info("Model:"); + srv.Dump(); + TestLog.Info("Actions:"); + TestLog.Info("{0}", srv.Actions); + + TestLog.Info("Creating new model..."); + var srvx = new Server("srv"); + TestLog.Info("Applying actions..."); + srv.Actions.Apply(srvx); + TestLog.Info("Updated model:"); +// srvx.Dump(); + } + + [Test] + [Ignore("TODO: AY check it ASAP")] + public void UnnamedNodeTest() + { + var rr0 = u1.Roles[0]; + var rr1 = u1.Roles[1]; + Assert.AreEqual(rr0.Name, "0"); + Assert.AreEqual(rr1.Name, "1"); + + rr0.Index = 1; + Assert.AreEqual(rr0.Name, "1"); + Assert.AreEqual(rr1.Name, "0"); + Assert.AreEqual(rr0, u1.Roles[1]); + Assert.AreEqual(rr1, u1.Roles[0]); + + rr0.Index = 0; + Assert.AreEqual(rr0.Name, "0"); + Assert.AreEqual(rr1.Name, "1"); + Assert.AreEqual(rr0, u1.Roles[0]); + Assert.AreEqual(rr1, u1.Roles[1]); + } + + [Test] + public void IndexAndParentTest() + { + // srv + Assert.AreEqual(srv.Index, 0); + srv.Index = 0; + Assert.AreEqual(srv.Index, 0); + AssertEx.Throws( + () => srv.Index=1); + AssertEx.Throws( + () => srv.Index=-1); + + // db1, db2 + Assert.AreEqual(db1.Index, 0); + Assert.AreEqual(db2.Index, 1); + AssertEx.Throws( + () => db1.Index=-1); + AssertEx.Throws( + () => db1.Index=2); + db1.Index = 0; + Assert.AreEqual(db1.Index, 0); + Assert.AreEqual(db2.Index, 1); + db1.Index = 1; + Assert.AreEqual(db1.Index, 1); + Assert.AreEqual(db2.Index, 0); + db2.Index = 1; + Assert.AreEqual(db1.Index, 0); + Assert.AreEqual(db2.Index, 1); + + // s1, s2 : index + Assert.AreEqual(s1.Parent, db1); + Assert.AreEqual(s2.Parent, db1); + s1.Parent = db1; + Assert.AreEqual(s1.Parent, db1); + s1.Parent = db2; + Assert.AreEqual(s1.Parent, db2); + Assert.AreEqual(s2.Parent, db1); + Assert.AreEqual(s1.Index, 0); + Assert.AreEqual(s2.Index, 0); + s2.Parent = db2; + Assert.AreEqual(s1.Parent, db2); + Assert.AreEqual(s2.Parent, db2); + Assert.AreEqual(s1.Index, 0); + Assert.AreEqual(s2.Index, 1); + s2.Parent = db1; + s1.Parent = db1; + Assert.AreEqual(s1.Index, 1); + Assert.AreEqual(s2.Index, 0); + s1.Index = 0; + Assert.AreEqual(s1.Index, 0); + Assert.AreEqual(s2.Index, 1); + Assert.AreEqual(s1.Parent, db1); + Assert.AreEqual(s2.Parent, db1); + } + + [Test] + public void ContainerPropertyTest() + { + srv.Security.Remove(); + Assert.AreEqual(sec1.State, NodeState.Removed); + Assert.AreEqual(srv.Security, null); + + sec2 = new DatabaseModel.Security(srv, "sec2"); + Assert.AreEqual(srv.Security, sec2); + AssertEx.Throws( + () => sec1 = new DatabaseModel.Security(srv, "sec3")); + + sec2.Remove(); + Assert.AreEqual(sec2.State, NodeState.Removed); + Assert.AreEqual(srv.Security, null); + + sec1 = new DatabaseModel.Security(srv, "sec1"); + Assert.AreEqual(srv.Security, sec1); + } + + [Test] + public void PathTest() + { + Assert.AreEqual(srv.Path, string.Empty); + Assert.AreEqual(srv, srv.Resolve(string.Empty)); + + Assert.AreEqual(srv.Databases.Path, "Databases"); + Assert.AreEqual(srv.Databases, srv.Resolve("Databases")); + + Assert.AreEqual(srv.Security.Path, "Security"); + Assert.AreEqual(srv.Security, srv.Resolve("Security")); + + Assert.AreEqual(srv.Security.Users.Path, "Security/Users"); + Assert.AreEqual(srv.Security.Users, srv.Resolve("Security/Users")); + + Assert.AreEqual(db2.Path, "Databases/db2"); + Assert.AreEqual(db2, srv.Resolve("Databases/db2")); + + Assert.AreEqual(db2.Schemas.Path, "Databases/db2/Schemas"); + Assert.AreEqual(db2.Schemas, srv.Resolve("Databases/db2/Schemas")); + + Assert.AreEqual(s1.Path, "Databases/db1/Schemas/s1"); + Assert.AreEqual(s1, srv.Resolve("Databases/db1/Schemas/s1")); + + Assert.AreEqual(s2.Path, "Databases/db1/Schemas/s2"); + Assert.AreEqual(s2, srv.Resolve("Databases/db1/Schemas/s2")); + } + + [Test] + public void DumpTest() + { +// srv.Dump(); + } + + [Test] + public void ApplyTest() + { + TestLog.Info("Model:"); + srv.Dump(); + TestLog.Info("Actions:"); + TestLog.Info("{0}", srv.Actions); + + TestLog.Info("Creating new model..."); + var srvx = new Server("srv"); + TestLog.Info("Applying actions..."); + srv.Actions.Apply(srvx); + TestLog.Info("Updated model:"); +// srvx.Dump(); + } + + [Test] + public void LockModelTest() + { + srv.Lock(true); + AssertEx.Throws( + () => new Database(srv, "newDatabase")); + AssertEx.Throws( + () => srv.Databases.Clear()); + } + + #region Private methods + + private void TestUpdate(Action update) + { + TestUpdate(update, true); + TestUpdate(update, false); + } + + private void TestUpdate(Action update, bool useHints) + { + var s1 = Clone(srv); + var s2 = Clone(srv); + var hints = new HintSet(s1, s2); + update.Invoke(s1, s2, hints); + if (!useHints) + hints = new HintSet(s1, s2); + TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); +// s1.Dump(); +// s2.Dump(); + s1.Validate(); + s2.Validate(); + + // Comparing different models + TestLog.Info("Comparing models:"); + var comparer = new Comparer(); + var diff = comparer.Compare(s1, s2, hints); + TestLog.Info("\r\nDifference:\r\n{0}", diff); + var actions = new ActionSequence() { + new Upgrader().GetUpgradeSequence(diff, hints, comparer) + }; + TestLog.Info("\r\nActions:\r\n{0}", actions); + } + + private Server Clone(Server server) + { + return (Server) server.Clone(null, server.Name); + // return (Server) LegacyBinarySerializer.Instance.Clone(server); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfo.cs index 0c879a178b..d47c3b9dae 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfo.cs @@ -1,85 +1,85 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Column. - /// - [Serializable] - public sealed class ColumnInfo: NodeBase - { - private TypeInfo type; - - /// - /// Gets or sets the type of the column. - /// - [Property(Priority = -1000, IsImmutable = true)] - public TypeInfo Type { - get { return type; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Type", value)) { - type = value; - scope.Commit(); - } - } - } - - /// - /// Validation error. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - if (Type==null) { - ea.Execute(() => { - throw new ValidationException( - string.Format(Strings.ExUndefinedTypeOfColumnX, Name), - Path); - }); - } - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Columns"); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The parent table. - /// The name. - public ColumnInfo(TableInfo table, string name) - : base(table, name) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The parent table. - /// The column name. - /// Type of the column. - public ColumnInfo(TableInfo table, string name, TypeInfo columnType) - : this(table, name) - { - Type = columnType; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Column. + /// + [Serializable] + public sealed class ColumnInfo: NodeBase + { + private TypeInfo type; + + /// + /// Gets or sets the type of the column. + /// + [Property(Priority = -1000, IsImmutable = true)] + public TypeInfo Type { + get { return type; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Type", value)) { + type = value; + scope.Commit(); + } + } + } + + /// + /// Validation error. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + if (Type==null) { + ea.Execute(() => { + throw new ValidationException( + string.Format(Strings.ExUndefinedTypeOfColumnX, Name), + Path); + }); + } + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Columns"); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The parent table. + /// The name. + public ColumnInfo(TableInfo table, string name) + : base(table, name) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The parent table. + /// The column name. + /// Type of the column. + public ColumnInfo(TableInfo table, string name, TypeInfo columnType) + : this(table, name) + { + Type = columnType; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoCollection.cs index 6ebce99442..7011fd26aa 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoCollection.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Column collection. - /// - [Serializable] - public sealed class ColumnInfoCollection : NodeCollectionBase - { - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The parent. - public ColumnInfoCollection(Node parent) - : base(parent, "Columns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Column collection. + /// + [Serializable] + public sealed class ColumnInfoCollection : NodeCollectionBase + { + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The parent. + public ColumnInfoCollection(Node parent) + : base(parent, "Columns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoRef.cs index b67440dd8f..7fe17fe2d3 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ColumnInfoRef.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// An abstract base class for all columns refs. - /// - [Serializable] - public abstract class ColumnInfoRef: Ref - where TParent: Node - { - // Constructors - - protected ColumnInfoRef(TParent parent) - : base(parent) - { - } - - protected ColumnInfoRef(TParent parent, ColumnInfo column) - : base(parent) - { - Value = column; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// An abstract base class for all columns refs. + /// + [Serializable] + public abstract class ColumnInfoRef: Ref + where TParent: Node + { + // Constructors + + protected ColumnInfoRef(TParent parent) + : base(parent) + { + } + + protected ColumnInfoRef(TParent parent, ColumnInfo column) + : base(parent) + { + Value = column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Exceptions/ValidationException.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Exceptions/ValidationException.cs index 2d7c2e489b..db4b330778 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Exceptions/ValidationException.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Exceptions/ValidationException.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Runtime.Serialization; -using System.Security; -using System.Security.Permissions; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Describes errors detected during - /// . execution. - /// - [Serializable] - public class ValidationException : Exception - { - /// - /// Gets the path of the node which validation has failed. - /// - public string NodePath { get; private set; } - - - // Constructors - - /// - protected ValidationException() - { - } - - /// - public ValidationException(string message) - : base(message) - { - } - - /// - public ValidationException(string message, Exception innerException) - : base(message, innerException) - { - } - - public ValidationException(string message, string nodePath) - : base(message) - { - NodePath = nodePath; - } - - #region Serializing members - - /// - protected ValidationException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - NodePath = info.GetString("NodePath"); - } - - /// - [SecurityCritical] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("NodePath", NodePath); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Runtime.Serialization; +using System.Security; +using System.Security.Permissions; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Describes errors detected during + /// . execution. + /// + [Serializable] + public class ValidationException : Exception + { + /// + /// Gets the path of the node which validation has failed. + /// + public string NodePath { get; private set; } + + + // Constructors + + /// + protected ValidationException() + { + } + + /// + public ValidationException(string message) + : base(message) + { + } + + /// + public ValidationException(string message, Exception innerException) + : base(message, innerException) + { + } + + public ValidationException(string message, string nodePath) + : base(message) + { + NodePath = nodePath; + } + + #region Serializing members + + /// + protected ValidationException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + NodePath = info.GetString("NodePath"); + } + + /// + [SecurityCritical] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("NodePath", NodePath); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyCollection.cs index 4d243d6c8d..9c02cab018 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyCollection.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Foreign key collection. - /// - [Serializable] - public sealed class ForeignKeyCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - public ForeignKeyCollection(TableInfo table) - : base(table, "ForeignKeys") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Foreign key collection. + /// + [Serializable] + public sealed class ForeignKeyCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + public ForeignKeyCollection(TableInfo table) + : base(table, "ForeignKeys") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnCollection.cs index 06cc1c6257..6b91936604 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnCollection.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.20 - -using System; -using System.Diagnostics; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class ForeignKeyColumnCollection : NodeCollectionBase - { - /// - /// Replaces all column references to references to columns of - /// specified index. - /// - /// The index to use. - public void Set(IndexInfo source) - { - Clear(); - foreach (var keyColumn in source.KeyColumns) - new ForeignKeyColumnRef(Parent, keyColumn.Value); - } - - - // Constructors - - /// - public ForeignKeyColumnCollection(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.20 + +using System; +using System.Diagnostics; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class ForeignKeyColumnCollection : NodeCollectionBase + { + /// + /// Replaces all column references to references to columns of + /// specified index. + /// + /// The index to use. + public void Set(IndexInfo source) + { + Clear(); + foreach (var keyColumn in source.KeyColumns) + new ForeignKeyColumnRef(Parent, keyColumn.Value); + } + + + // Constructors + + /// + public ForeignKeyColumnCollection(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnRef.cs index 448b30b3fb..7f469190d0 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyColumnRef.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to foreign key column. - /// - [Serializable] - public sealed class ForeignKeyColumnRef : Ref - { - protected override Nesting CreateNesting() - { - return new Nesting( - this, "ForeignKeyColumns"); - } - - - // Constructor - - public ForeignKeyColumnRef(ForeignKeyInfo parent) - : base(parent) - { - } - - public ForeignKeyColumnRef(ForeignKeyInfo parent, ColumnInfo column) - : base(parent) - { - Value = column; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to foreign key column. + /// + [Serializable] + public sealed class ForeignKeyColumnRef : Ref + { + protected override Nesting CreateNesting() + { + return new Nesting( + this, "ForeignKeyColumns"); + } + + + // Constructor + + public ForeignKeyColumnRef(ForeignKeyInfo parent) + : base(parent) + { + } + + public ForeignKeyColumnRef(ForeignKeyInfo parent, ColumnInfo column) + : base(parent) + { + Value = column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyInfo.cs index 1d4bce5a14..c34be4bd48 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ForeignKeyInfo.cs @@ -1,126 +1,126 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Foreign key. - /// - [Serializable] - [DataDependent] - public sealed class ForeignKeyInfo : NodeBase - { - private ReferentialAction onUpdateAction; - private ReferentialAction onRemoveAction; - private PrimaryIndexInfo primaryKey; - - /// - /// Gets or sets the foreign index. - /// - [Property(Priority = -1100)] - public PrimaryIndexInfo PrimaryKey { - get { return primaryKey; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("PrimaryKey", value)) { - primaryKey = value; - scope.Commit(); - } - } - } - - /// - /// Gets foreign key columns. - /// - [Property] - public ForeignKeyColumnCollection ForeignKeyColumns { get; private set; } - - /// - /// Gets or sets the "on remove" action. - /// - [Property(Priority = -110)] - public ReferentialAction OnRemoveAction { - get { return onRemoveAction; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("OnUpdateAction", value)) { - onRemoveAction = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the "on update" action. - /// - [Property(Priority = -100)] - public ReferentialAction OnUpdateAction { - get { return onUpdateAction; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("OnUpdateAction", value)) { - onUpdateAction = value; - scope.Commit(); - } - } - } - - /// - /// Validations errors. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - - if (PrimaryKey==null) { - ea.Execute(() => { - throw new ValidationException(Strings.ExUndefinedPrimaryKey, Path); - }); - } - - var pkTypes = PrimaryKey.KeyColumns.Select(c => c.Value.Type); - var fkTypes = ForeignKeyColumns.Select(c => c.Value.Type); - if (pkTypes.Count()!=pkTypes.Zip(fkTypes).Where(p => p.First.Type==p.Second.Type.StripNullable()).Count()) { - ea.Execute(() => { - throw new ValidationException( - Strings.ExInvalidForeignKeyStructure, Path); - }); - } - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "ForeignKeys"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (ForeignKeyColumns==null) - ForeignKeyColumns = new ForeignKeyColumnCollection(this, "ForeignKeyColumns"); - } - - - // Constructors - - public ForeignKeyInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Foreign key. + /// + [Serializable] + [DataDependent] + public sealed class ForeignKeyInfo : NodeBase + { + private ReferentialAction onUpdateAction; + private ReferentialAction onRemoveAction; + private PrimaryIndexInfo primaryKey; + + /// + /// Gets or sets the foreign index. + /// + [Property(Priority = -1100)] + public PrimaryIndexInfo PrimaryKey { + get { return primaryKey; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("PrimaryKey", value)) { + primaryKey = value; + scope.Commit(); + } + } + } + + /// + /// Gets foreign key columns. + /// + [Property] + public ForeignKeyColumnCollection ForeignKeyColumns { get; private set; } + + /// + /// Gets or sets the "on remove" action. + /// + [Property(Priority = -110)] + public ReferentialAction OnRemoveAction { + get { return onRemoveAction; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("OnUpdateAction", value)) { + onRemoveAction = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the "on update" action. + /// + [Property(Priority = -100)] + public ReferentialAction OnUpdateAction { + get { return onUpdateAction; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("OnUpdateAction", value)) { + onUpdateAction = value; + scope.Commit(); + } + } + } + + /// + /// Validations errors. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + + if (PrimaryKey==null) { + ea.Execute(() => { + throw new ValidationException(Strings.ExUndefinedPrimaryKey, Path); + }); + } + + var pkTypes = PrimaryKey.KeyColumns.Select(c => c.Value.Type); + var fkTypes = ForeignKeyColumns.Select(c => c.Value.Type); + if (pkTypes.Count()!=pkTypes.Zip(fkTypes).Where(p => p.First.Type==p.Second.Type.StripNullable()).Count()) { + ea.Execute(() => { + throw new ValidationException( + Strings.ExInvalidForeignKeyStructure, Path); + }); + } + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "ForeignKeys"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (ForeignKeyColumns==null) + ForeignKeyColumns = new ForeignKeyColumnCollection(this, "ForeignKeyColumns"); + } + + + // Constructors + + public ForeignKeyInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRef.cs index 19f221026f..c30dca295b 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRef.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Reference to full-text column. - /// - [Serializable] - public sealed class FullTextColumnRef : ColumnInfoRef - { - [Property(Priority = -1100)] - public string Language { get; set; } - - [Property(Priority = -1200)] - public string Type { get; set; } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Columns"); - } - - - // Constructors - - /// - public FullTextColumnRef(FullTextIndexInfo parent) - : base(parent) - {} - - /// - public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column) - : base(parent, column) - {} - - /// - public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column, string language) - : base(parent, column) - { - Language = language; - } - - /// - public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column, string language, string type) - : base(parent, column) - { - Language = language; - Type = type; - } - - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Reference to full-text column. + /// + [Serializable] + public sealed class FullTextColumnRef : ColumnInfoRef + { + [Property(Priority = -1100)] + public string Language { get; set; } + + [Property(Priority = -1200)] + public string Type { get; set; } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Columns"); + } + + + // Constructors + + /// + public FullTextColumnRef(FullTextIndexInfo parent) + : base(parent) + {} + + /// + public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column) + : base(parent, column) + {} + + /// + public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column, string language) + : base(parent, column) + { + Language = language; + } + + /// + public FullTextColumnRef(FullTextIndexInfo parent, ColumnInfo column, string language, string type) + : base(parent, column) + { + Language = language; + Type = type; + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRefCollection.cs index 130ea0a027..bec3e5c118 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextColumnRefCollection.cs @@ -1,25 +1,25 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class FullTextColumnRefCollection : NodeCollectionBase - { - - // Constructors - - public FullTextColumnRefCollection(FullTextIndexInfo parent) - : base(parent, "Columns") - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class FullTextColumnRefCollection : NodeCollectionBase + { + + // Constructors + + public FullTextColumnRefCollection(FullTextIndexInfo parent) + : base(parent, "Columns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextIndexInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextIndexInfo.cs index 12a92b2236..2409eea7cf 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextIndexInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/FullTextIndexInfo.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Full-text index. - /// - [Serializable] - public sealed class FullTextIndexInfo : NodeBase - { - /// - /// Gets columns. - /// - [Property(Priority = -1000)] - public FullTextColumnRefCollection Columns { get; private set; } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "FullTextIndex"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (Columns == null) - Columns = new FullTextColumnRefCollection(this); - } - - /// - /// - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - base.ValidateState(); - - var tableColumns = Parent.Columns; - var columns = Columns.Select(keyRef => keyRef.Value).ToList(); - - if (columns.Count == 0) { - ea.Execute(() => { - throw new ValidationException("IDDQ", Path); - }); - } - - ea.Complete(); - } - } - - // Constructors - - public FullTextIndexInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Full-text index. + /// + [Serializable] + public sealed class FullTextIndexInfo : NodeBase + { + /// + /// Gets columns. + /// + [Property(Priority = -1000)] + public FullTextColumnRefCollection Columns { get; private set; } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "FullTextIndex"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (Columns == null) + Columns = new FullTextColumnRefCollection(this); + } + + /// + /// + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + base.ValidateState(); + + var tableColumns = Parent.Columns; + var columns = Columns.Select(keyRef => keyRef.Value).ToList(); + + if (columns.Count == 0) { + ea.Execute(() => { + throw new ValidationException("IDDQ", Path); + }); + } + + ea.Complete(); + } + } + + // Constructors + + public FullTextIndexInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRef.cs index e5e4f8b2d9..75fbaffe6e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRef.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to included column. - /// - [Serializable] - public sealed class IncludedColumnRef : ColumnInfoRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting( - this, "IncludedColumns"); - } - - - // Constructors - - /// - public IncludedColumnRef(SecondaryIndexInfo parent) - : base(parent) - { - } - - public IncludedColumnRef(SecondaryIndexInfo parent, ColumnInfo column) - : base(parent, column) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to included column. + /// + [Serializable] + public sealed class IncludedColumnRef : ColumnInfoRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting( + this, "IncludedColumns"); + } + + + // Constructors + + /// + public IncludedColumnRef(SecondaryIndexInfo parent) + : base(parent) + { + } + + public IncludedColumnRef(SecondaryIndexInfo parent, ColumnInfo column) + : base(parent, column) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRefCollection.cs index 5bd56b1d89..3f4e5288c7 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IncludedColumnRefCollection.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class IncludedColumnRefCollection: NodeCollectionBase - { - // Constructors - - public IncludedColumnRefCollection(SecondaryIndexInfo parent) - : base(parent, "ValueColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class IncludedColumnRefCollection: NodeCollectionBase + { + // Constructors + + public IncludedColumnRefCollection(SecondaryIndexInfo parent) + : base(parent, "ValueColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IndexInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IndexInfo.cs index b8ab743c08..6224231d9c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IndexInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/IndexInfo.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Core; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// The base abstract class for all indexes. - /// - [Serializable] - public abstract class IndexInfo : NodeBase - { - private bool isUnique; - - /// - /// Gets a value indicating whether this instance is unique. - /// - /// Already initialized. - [Property(Priority = -1100)] - public bool IsUnique { - get { return isUnique; } - set { - EnsureIsEditable(); - if (IsPrimary && !value) - throw Exceptions.AlreadyInitialized("IsUnique"); - using (var scope = LogPropertyChange("IsUnique", value)) - { - isUnique = value; - scope.Commit(); - } - } - } - - /// - /// Gets a value indicating whether this instance is primary. - /// - [Property(IgnoreInComparison = true)] - public bool IsPrimary { get; private set; } - - /// - /// Gets key columns. - /// - [Property(Priority = -1000)] - public KeyColumnRefCollection KeyColumns { get; private set; } - - - /// - protected override void Initialize() - { - base.Initialize(); - IsPrimary = this is PrimaryIndexInfo; - if (IsPrimary) - isUnique = true; - if (KeyColumns==null) - KeyColumns = new KeyColumnRefCollection(this); - } - - - // Constructors - - protected IndexInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Core; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// The base abstract class for all indexes. + /// + [Serializable] + public abstract class IndexInfo : NodeBase + { + private bool isUnique; + + /// + /// Gets a value indicating whether this instance is unique. + /// + /// Already initialized. + [Property(Priority = -1100)] + public bool IsUnique { + get { return isUnique; } + set { + EnsureIsEditable(); + if (IsPrimary && !value) + throw Exceptions.AlreadyInitialized("IsUnique"); + using (var scope = LogPropertyChange("IsUnique", value)) + { + isUnique = value; + scope.Commit(); + } + } + } + + /// + /// Gets a value indicating whether this instance is primary. + /// + [Property(IgnoreInComparison = true)] + public bool IsPrimary { get; private set; } + + /// + /// Gets key columns. + /// + [Property(Priority = -1000)] + public KeyColumnRefCollection KeyColumns { get; private set; } + + + /// + protected override void Initialize() + { + base.Initialize(); + IsPrimary = this is PrimaryIndexInfo; + if (IsPrimary) + isUnique = true; + if (KeyColumns==null) + KeyColumns = new KeyColumnRefCollection(this); + } + + + // Constructors + + protected IndexInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef.cs index 739ea07db9..8d1bb3b135 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to key column. - /// - [Serializable] - public sealed class KeyColumnRef: KeyColumnRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "KeyColumns"); - } - - - // Constructors - - public KeyColumnRef(IndexInfo parent) - : base(parent) - { - } - - public KeyColumnRef(IndexInfo parent, ColumnInfo column) - : base(parent, column) - { - } - - public KeyColumnRef(IndexInfo parent, ColumnInfo column, Direction direction) - : base(parent, column, direction) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to key column. + /// + [Serializable] + public sealed class KeyColumnRef: KeyColumnRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "KeyColumns"); + } + + + // Constructors + + public KeyColumnRef(IndexInfo parent) + : base(parent) + { + } + + public KeyColumnRef(IndexInfo parent, ColumnInfo column) + : base(parent, column) + { + } + + public KeyColumnRef(IndexInfo parent, ColumnInfo column, Direction direction) + : base(parent, column, direction) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRefCollection.cs index 91e9647182..504a90d3d7 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRefCollection.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class KeyColumnRefCollection : NodeCollectionBase - { - // Constructors - - public KeyColumnRefCollection(IndexInfo parent) - : base(parent, "KeyColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class KeyColumnRefCollection : NodeCollectionBase + { + // Constructors + + public KeyColumnRefCollection(IndexInfo parent) + : base(parent, "KeyColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef{TParent}.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef{TParent}.cs index a4fb0d43fe..deb0282563 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef{TParent}.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/KeyColumnRef{TParent}.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to key column. - /// - [Serializable] - public abstract class KeyColumnRef: ColumnInfoRef - where TParent: IndexInfo - { - private Direction direction; - - /// - /// Gets or sets the column direction. - /// - [Property(Priority = -1000)] - public Direction Direction { - get { return direction; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Direction", value)) { - direction = value; - scope.Commit(); - } - } - } - - /// - /// Invalid value - /// (). - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - if (direction==Direction.None) { - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidDirectionValue, Path); - }); - } - ea.Complete(); - } - } - - - // Constructors - - /// - public KeyColumnRef(TParent parent) - : base(parent) - { - } - - public KeyColumnRef(TParent parent, ColumnInfo column) - : base(parent, column) - { - Direction = Direction.Positive; - } - - public KeyColumnRef(TParent parent, ColumnInfo column, Direction direction) - : base(parent, column) - { - Direction = direction; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to key column. + /// + [Serializable] + public abstract class KeyColumnRef: ColumnInfoRef + where TParent: IndexInfo + { + private Direction direction; + + /// + /// Gets or sets the column direction. + /// + [Property(Priority = -1000)] + public Direction Direction { + get { return direction; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Direction", value)) { + direction = value; + scope.Commit(); + } + } + } + + /// + /// Invalid value + /// (). + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + if (direction==Direction.None) { + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidDirectionValue, Path); + }); + } + ea.Complete(); + } + } + + + // Constructors + + /// + public KeyColumnRef(TParent parent) + : base(parent) + { + } + + public KeyColumnRef(TParent parent, ColumnInfo column) + : base(parent, column) + { + Direction = Direction.Positive; + } + + public KeyColumnRef(TParent parent, ColumnInfo column, Direction direction) + : base(parent, column) + { + Direction = direction; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeBase.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeBase.cs index 3c763923d2..c47f869a4d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeBase.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - - /// - /// A base class for all nodes in storage model. - /// - /// The type of the parent node. - [Serializable] - public abstract class NodeBase : Node - where TParent : Node - { - /// - protected override void PerformCreate() - { - base.PerformCreate(); - TestLog.Info("Created: {0}", this); - } - - /// - protected override void PerformMove(Node newParent, string newName, int newIndex) - { - using (TestLog.InfoRegion("Moving: {0}", this)) { - if (Parent!=newParent) - TestLog.Info("new Parent={0}", newParent); - if (Name!=newName) - TestLog.Info("new Name={0}", newName); - if (Index!=newIndex) - TestLog.Info("new Index={0}", newIndex); - base.PerformMove(newParent, newName, newIndex); - } - } - - /// - protected override void PerformShift(int offset) - { - TestLog.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); - base.PerformShift(offset); - } - - /// - protected override void ValidateRemove() - { - base.ValidateRemove(); - TestLog.Info("Removed: {0}", this); - } - - - //Constructors - - protected NodeBase(TParent parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + + /// + /// A base class for all nodes in storage model. + /// + /// The type of the parent node. + [Serializable] + public abstract class NodeBase : Node + where TParent : Node + { + /// + protected override void PerformCreate() + { + base.PerformCreate(); + TestLog.Info("Created: {0}", this); + } + + /// + protected override void PerformMove(Node newParent, string newName, int newIndex) + { + using (TestLog.InfoRegion("Moving: {0}", this)) { + if (Parent!=newParent) + TestLog.Info("new Parent={0}", newParent); + if (Name!=newName) + TestLog.Info("new Name={0}", newName); + if (Index!=newIndex) + TestLog.Info("new Index={0}", newIndex); + base.PerformMove(newParent, newName, newIndex); + } + } + + /// + protected override void PerformShift(int offset) + { + TestLog.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); + base.PerformShift(offset); + } + + /// + protected override void ValidateRemove() + { + base.ValidateRemove(); + TestLog.Info("Removed: {0}", this); + } + + + //Constructors + + protected NodeBase(TParent parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeCollectionBase.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeCollectionBase.cs index b46c89cda9..bbb648a25a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeCollectionBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/NodeCollectionBase.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// An abstract base class for any collection of storage model nodes. - /// - /// The type of the node. - /// The type of the parent node. - [Serializable] - public abstract class NodeCollectionBase : NodeCollection - where TNode : Node - where TParent : Node - { - // Constructors - - /// - protected NodeCollectionBase(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// An abstract base class for any collection of storage model nodes. + /// + /// The type of the node. + /// The type of the parent node. + [Serializable] + public abstract class NodeCollectionBase : NodeCollection + where TNode : Node + where TParent : Node + { + // Constructors + + /// + protected NodeCollectionBase(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryIndexInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryIndexInfo.cs index 101fdda8f0..69ba6f9bec 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryIndexInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryIndexInfo.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Primary index. - /// - [Serializable] - public sealed class PrimaryIndexInfo : IndexInfo - { - /// - /// Gets value columns. - /// - [Property(IgnoreInComparison = true)] - public ValueColumnRefCollection ValueColumns { get; private set; } - - /// - /// Populates collection by - /// including all the columns except - /// into it. - /// - public void PopulateValueColumns() - { - var keySet = EnumerableExtensions.ToHashSet(KeyColumns.Select(kc => kc.Value)); - - foreach (var column in Parent.Columns.Where(c => !keySet.Contains(c))) - new ValueColumnRef(this, column); - } - - /// - /// Validation error. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - base.ValidateState(); - - var tableColumns = Parent.Columns; - var keys = KeyColumns.Select(keyRef => keyRef.Value).ToList(); - var values = ValueColumns.Select(valueRef => valueRef.Value).ToList(); - var all = keys.Concat(values).ToList(); - - if (keys.Count==0) - ea.Execute(() => { - throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); - }); - if (keys.Where(ci => ci.Type.IsNullable).Count() > 0) - ea.Execute(() => { - throw new ValidationException(Strings.ExPrimaryKeyColumnCanNotBeNullable, Path); - }); - - if (all.Count!=tableColumns.Count) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); - }); - if (all.Zip(tableColumns).Where(p => p.First!=p.Second).Any()) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); - }); - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "PrimaryIndex"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (ValueColumns==null) - ValueColumns = new ValueColumnRefCollection(this); - } - - - // Constructors - public PrimaryIndexInfo(TableInfo table, string name) - : base(table, name) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Primary index. + /// + [Serializable] + public sealed class PrimaryIndexInfo : IndexInfo + { + /// + /// Gets value columns. + /// + [Property(IgnoreInComparison = true)] + public ValueColumnRefCollection ValueColumns { get; private set; } + + /// + /// Populates collection by + /// including all the columns except + /// into it. + /// + public void PopulateValueColumns() + { + var keySet = EnumerableExtensions.ToHashSet(KeyColumns.Select(kc => kc.Value)); + + foreach (var column in Parent.Columns.Where(c => !keySet.Contains(c))) + new ValueColumnRef(this, column); + } + + /// + /// Validation error. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + base.ValidateState(); + + var tableColumns = Parent.Columns; + var keys = KeyColumns.Select(keyRef => keyRef.Value).ToList(); + var values = ValueColumns.Select(valueRef => valueRef.Value).ToList(); + var all = keys.Concat(values).ToList(); + + if (keys.Count==0) + ea.Execute(() => { + throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); + }); + if (keys.Where(ci => ci.Type.IsNullable).Count() > 0) + ea.Execute(() => { + throw new ValidationException(Strings.ExPrimaryKeyColumnCanNotBeNullable, Path); + }); + + if (all.Count!=tableColumns.Count) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); + }); + if (all.Zip(tableColumns).Where(p => p.First!=p.Second).Any()) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); + }); + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "PrimaryIndex"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (ValueColumns==null) + ValueColumns = new ValueColumnRefCollection(this); + } + + + // Constructors + public PrimaryIndexInfo(TableInfo table, string name) + : base(table, name) + { + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRef.cs index 1f984c526f..191a50fbe2 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRef.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to key column. - /// - [Serializable] - public sealed class PrimaryKeyColumnRef: KeyColumnRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "PrimaryKeyColumns"); - } - - - // Constructors - - public PrimaryKeyColumnRef(SecondaryIndexInfo parent) - : base(parent) - { - } - - public PrimaryKeyColumnRef(SecondaryIndexInfo parent, ColumnInfo column) - : base(parent, column) - { - } - - public PrimaryKeyColumnRef(SecondaryIndexInfo parent, ColumnInfo column, Direction direction) - : base(parent, column, direction) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to key column. + /// + [Serializable] + public sealed class PrimaryKeyColumnRef: KeyColumnRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "PrimaryKeyColumns"); + } + + + // Constructors + + public PrimaryKeyColumnRef(SecondaryIndexInfo parent) + : base(parent) + { + } + + public PrimaryKeyColumnRef(SecondaryIndexInfo parent, ColumnInfo column) + : base(parent, column) + { + } + + public PrimaryKeyColumnRef(SecondaryIndexInfo parent, ColumnInfo column, Direction direction) + : base(parent, column, direction) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRefCollection.cs index 1632529a24..844273704e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/PrimaryKeyColumnRefCollection.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class PrimaryKeyColumnRefCollection : NodeCollectionBase - { - // Constructors - - public PrimaryKeyColumnRefCollection(SecondaryIndexInfo parent) - : base(parent, "PrimaryKeyColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class PrimaryKeyColumnRefCollection : NodeCollectionBase + { + // Constructors + + public PrimaryKeyColumnRefCollection(SecondaryIndexInfo parent) + : base(parent, "PrimaryKeyColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Ref.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Ref.cs index b06453ed05..cd8e86d985 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Ref.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Ref.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// The reference to model node. - /// - /// The type of the target node. - /// The type of the parent node. - [Serializable] - public abstract class Ref : NodeBase, - IUnnamedNode, - INodeReference - where TTarget : Node - where TParent : Node - { - private TTarget value; - - /// - /// Gets or sets referenced node. - /// - /// Value is already initialized. - [Property(Priority = 0)] - public TTarget Value - { - get { return value; } - set - { -// if (this.value!=null) -// throw Exceptions.AlreadyInitialized("Value"); - EnsureIsEditable(); - using (var scope = LogPropertyChange("Value", value)) { - this.value = value; - scope.Commit(); - } - } - } - - Node INodeReference.Value - { - get { return Value; } - set { Value = (TTarget)value; } - } - - - // Constructors - - /// - protected Ref(TParent parent) - : base(parent, null) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// The reference to model node. + /// + /// The type of the target node. + /// The type of the parent node. + [Serializable] + public abstract class Ref : NodeBase, + IUnnamedNode, + INodeReference + where TTarget : Node + where TParent : Node + { + private TTarget value; + + /// + /// Gets or sets referenced node. + /// + /// Value is already initialized. + [Property(Priority = 0)] + public TTarget Value + { + get { return value; } + set + { +// if (this.value!=null) +// throw Exceptions.AlreadyInitialized("Value"); + EnsureIsEditable(); + using (var scope = LogPropertyChange("Value", value)) { + this.value = value; + scope.Commit(); + } + } + } + + Node INodeReference.Value + { + get { return Value; } + set { Value = (TTarget)value; } + } + + + // Constructors + + /// + protected Ref(TParent parent) + : base(parent, null) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ReferentialAction.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ReferentialAction.cs index 7e3537686c..36a0342367 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ReferentialAction.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ReferentialAction.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.17 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Referential integrity maintenance actions. - /// - [Serializable] - public enum ReferentialAction - { - /// - /// Do nothing to maintain referential integrity. - /// - None = 0, - /// - /// The same as . - /// - Default = Restrict, - /// - /// Restricts primary key update \ removal when it is referenced by some foreign key. - /// - Restrict = 1, - /// - /// Cascades primary key update \ removal to its foreign key. - /// - Cascade = 2, - /// - /// Clears the foreign key on its primary key update \ removal. - /// - Clear = 3, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.17 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Referential integrity maintenance actions. + /// + [Serializable] + public enum ReferentialAction + { + /// + /// Do nothing to maintain referential integrity. + /// + None = 0, + /// + /// The same as . + /// + Default = Restrict, + /// + /// Restricts primary key update \ removal when it is referenced by some foreign key. + /// + Restrict = 1, + /// + /// Cascades primary key update \ removal to its foreign key. + /// + Cascade = 2, + /// + /// Clears the foreign key on its primary key update \ removal. + /// + Clear = 3, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.Designer.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.Designer.cs index 2adf27380d..a3a100a1c4 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.Designer.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.Designer.cs @@ -1,270 +1,270 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Modelling.IndexingModel.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Modelling.IndexingModel.Resources.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to , . - /// - internal static string Comma { - get { - return ResourceManager.GetString("Comma", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not find reference to column "{0}".. - /// - internal static string ExCanNotFindReferenceToColumnX { - get { - return ResourceManager.GetString("ExCanNotFindReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column "{0}" contains both key and value collections.. - /// - internal static string ExColumnXContainsBothKeyAndValueCollections { - get { - return ResourceManager.GetString("ExColumnXContainsBothKeyAndValueCollections", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to KeyColumns collection is empty.. - /// - internal static string ExEmptyKeyColumnsCollection { - get { - return ResourceManager.GetString("ExEmptyKeyColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Direction value (Direction.None).. - /// - internal static string ExInvalidDirectionValue { - get { - return ResourceManager.GetString("ExInvalidDirectionValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence.. - /// - internal static string ExInvalidForeignKeyStructure { - get { - return ResourceManager.GetString("ExInvalidForeignKeyStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to IncludedColumns collection is invalid.. - /// - internal static string ExInvalidIncludedColumnsCollection { - get { - return ResourceManager.GetString("ExInvalidIncludedColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PrimaryKeyColumns collection is invalid.. - /// - internal static string ExInvalidPrimaryKeyColumnsCollection { - get { - return ResourceManager.GetString("ExInvalidPrimaryKeyColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table.. - /// - internal static string ExInvalidPrimaryKeyStructure { - get { - return ResourceManager.GetString("ExInvalidPrimaryKeyStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to IncludedColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneIncludedColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneIncludedColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to KeyColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneKeyColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneKeyColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ValueColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneValueColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneValueColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Primary key column can not be nullable.. - /// - internal static string ExPrimaryKeyColumnCanNotBeNullable { - get { - return ResourceManager.GetString("ExPrimaryKeyColumnCanNotBeNullable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referenced column "{0}" does not belong to index "{1}".. - /// - internal static string ExReferencedColumnXDoesNotBelongToIndexY { - get { - return ResourceManager.GetString("ExReferencedColumnXDoesNotBelongToIndexY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ForeignKey is undefined.. - /// - internal static string ExUndefinedForeignKey { - get { - return ResourceManager.GetString("ExUndefinedForeignKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PrimaryKey is undefined.. - /// - internal static string ExUndefinedPrimaryKey { - get { - return ResourceManager.GetString("ExUndefinedPrimaryKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of column "{0}" is undefined.. - /// - internal static string ExUndefinedTypeOfColumnX { - get { - return ResourceManager.GetString("ExUndefinedTypeOfColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Length. - /// - internal static string Length { - get { - return ResourceManager.GetString("Length", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ?. - /// - internal static string NullableMark { - get { - return ResourceManager.GetString("NullableMark", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Precision. - /// - internal static string Precision { - get { - return ResourceManager.GetString("Precision", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: {1}. - /// - internal static string PropertyPairFormat { - get { - return ResourceManager.GetString("PropertyPairFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scale. - /// - internal static string Scale { - get { - return ResourceManager.GetString("Scale", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type. - /// - internal static string Type { - get { - return ResourceManager.GetString("Type", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Modelling.IndexingModel.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Modelling.IndexingModel.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string Comma { + get { + return ResourceManager.GetString("Comma", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not find reference to column "{0}".. + /// + internal static string ExCanNotFindReferenceToColumnX { + get { + return ResourceManager.GetString("ExCanNotFindReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column "{0}" contains both key and value collections.. + /// + internal static string ExColumnXContainsBothKeyAndValueCollections { + get { + return ResourceManager.GetString("ExColumnXContainsBothKeyAndValueCollections", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KeyColumns collection is empty.. + /// + internal static string ExEmptyKeyColumnsCollection { + get { + return ResourceManager.GetString("ExEmptyKeyColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Direction value (Direction.None).. + /// + internal static string ExInvalidDirectionValue { + get { + return ResourceManager.GetString("ExInvalidDirectionValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence.. + /// + internal static string ExInvalidForeignKeyStructure { + get { + return ResourceManager.GetString("ExInvalidForeignKeyStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IncludedColumns collection is invalid.. + /// + internal static string ExInvalidIncludedColumnsCollection { + get { + return ResourceManager.GetString("ExInvalidIncludedColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PrimaryKeyColumns collection is invalid.. + /// + internal static string ExInvalidPrimaryKeyColumnsCollection { + get { + return ResourceManager.GetString("ExInvalidPrimaryKeyColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table.. + /// + internal static string ExInvalidPrimaryKeyStructure { + get { + return ResourceManager.GetString("ExInvalidPrimaryKeyStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IncludedColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneIncludedColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneIncludedColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KeyColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneKeyColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneKeyColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ValueColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneValueColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneValueColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary key column can not be nullable.. + /// + internal static string ExPrimaryKeyColumnCanNotBeNullable { + get { + return ResourceManager.GetString("ExPrimaryKeyColumnCanNotBeNullable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referenced column "{0}" does not belong to index "{1}".. + /// + internal static string ExReferencedColumnXDoesNotBelongToIndexY { + get { + return ResourceManager.GetString("ExReferencedColumnXDoesNotBelongToIndexY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ForeignKey is undefined.. + /// + internal static string ExUndefinedForeignKey { + get { + return ResourceManager.GetString("ExUndefinedForeignKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PrimaryKey is undefined.. + /// + internal static string ExUndefinedPrimaryKey { + get { + return ResourceManager.GetString("ExUndefinedPrimaryKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of column "{0}" is undefined.. + /// + internal static string ExUndefinedTypeOfColumnX { + get { + return ResourceManager.GetString("ExUndefinedTypeOfColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Length. + /// + internal static string Length { + get { + return ResourceManager.GetString("Length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ?. + /// + internal static string NullableMark { + get { + return ResourceManager.GetString("NullableMark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Precision. + /// + internal static string Precision { + get { + return ResourceManager.GetString("Precision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: {1}. + /// + internal static string PropertyPairFormat { + get { + return ResourceManager.GetString("PropertyPairFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale. + /// + internal static string Scale { + get { + return ResourceManager.GetString("Scale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + internal static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.resx b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.resx index 8f308f34d7..2988b9c999 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.resx +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Resources/Strings.resx @@ -1,192 +1,192 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - KeyColumns collection is empty. - - - Column "{0}" contains both key and value collections. - - - Can not find reference to column "{0}". - - - KeyColumns collection contains more then one reference to column "{0}". - - - Referenced column "{0}" does not belong to index "{1}". - - - ValueColumns collection contains more then one reference to column "{0}". - - - Type of column "{0}" is undefined. - - - PrimaryKey is undefined. - - - Primary key column can not be nullable. - - - ForeignKey is undefined. - - - Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence. - - - Culture - - - Length - - - Precision - - - Scale - - - Type - - - {0}: {1} - - - , - - - Invalid Direction value (Direction.None). - - - PrimaryKeyColumns collection is invalid. - - - IncludedColumns collection is invalid. - - - IncludedColumns collection contains more then one reference to column "{0}". - - - ? - - - Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + KeyColumns collection is empty. + + + Column "{0}" contains both key and value collections. + + + Can not find reference to column "{0}". + + + KeyColumns collection contains more then one reference to column "{0}". + + + Referenced column "{0}" does not belong to index "{1}". + + + ValueColumns collection contains more then one reference to column "{0}". + + + Type of column "{0}" is undefined. + + + PrimaryKey is undefined. + + + Primary key column can not be nullable. + + + ForeignKey is undefined. + + + Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence. + + + Culture + + + Length + + + Precision + + + Scale + + + Type + + + {0}: {1} + + + , + + + Invalid Direction value (Direction.None). + + + PrimaryKeyColumns collection is invalid. + + + IncludedColumns collection is invalid. + + + IncludedColumns collection contains more then one reference to column "{0}". + + + ? + + + Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table. + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfo.cs index 1e51a30d60..d2e1d8a3bd 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfo.cs @@ -1,129 +1,129 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Secondary index. - /// - [Serializable] - public sealed class SecondaryIndexInfo : IndexInfo - { - /// - /// Gets value columns. - /// - [Property(Priority = -110)] - public PrimaryKeyColumnRefCollection PrimaryKeyColumns { get; private set; } - - /// - /// Gets included columns. - /// - [Property(Priority = -100)] - public IncludedColumnRefCollection IncludedColumns { get; private set; } - - /// - /// Populates collection by - /// copying them from primary index. - /// - public void PopulatePrimaryKeyColumns() - { - foreach (var kcr in Parent.PrimaryIndex.KeyColumns) - new PrimaryKeyColumnRef(this, kcr.Value, kcr.Direction); - } - - /// - /// Empty secondary key columns collection. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - - // Secondary key columns: empty set, duplicates - var keyColumns = KeyColumns.Select(valueRef => valueRef.Value).ToList(); - if (keyColumns.Count==0) - ea.Execute(() => { - throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); - }); - foreach (var group in keyColumns - .GroupBy(keyColumn => keyColumn) - .Where(group => group.Count() > 1)) - ea.Execute((_column) => { - throw new ValidationException( - string.Format(Strings.ExMoreThenOneKeyColumnReferenceToColumnX, _column.Name), - Path); - }, group.Key); - - // Primary key columns - if (PrimaryKeyColumns.Count!=Parent.PrimaryIndex.KeyColumns.Count) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); - }); - for (int i = 0; i < PrimaryKeyColumns.Count; i++) { - var ref1 = PrimaryKeyColumns[i]; - var ref2 = Parent.PrimaryIndex.KeyColumns[i]; - if (ref1.Value!=ref2.Value || ref1.Direction!=ref2.Direction) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); - }); - } - - // Included columns - var fullKeySet = EnumerableExtensions.ToHashSet(KeyColumns - .Select(cr => cr.Value) - .Concat(PrimaryKeyColumns.Select(cr => cr.Value))); - - foreach (var columnRef in IncludedColumns) { - if (fullKeySet.Contains(columnRef.Value)) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidIncludedColumnsCollection, Path); - }); - } - - foreach (var group in IncludedColumns - .GroupBy(keyColumn => keyColumn) - .Where(group => group.Count() > 1)) { - ea.Execute((_column) => { - throw new ValidationException( - string.Format(Strings.ExMoreThenOneIncludedColumnReferenceToColumnX, _column.Name), - Path); - }, group.Key); - } - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "SecondaryIndexes"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (PrimaryKeyColumns==null) - PrimaryKeyColumns = new PrimaryKeyColumnRefCollection(this); - if (IncludedColumns==null) - IncludedColumns = new IncludedColumnRefCollection(this); - } - - - // Constructors - - public SecondaryIndexInfo(TableInfo table, string name) - : base(table, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Secondary index. + /// + [Serializable] + public sealed class SecondaryIndexInfo : IndexInfo + { + /// + /// Gets value columns. + /// + [Property(Priority = -110)] + public PrimaryKeyColumnRefCollection PrimaryKeyColumns { get; private set; } + + /// + /// Gets included columns. + /// + [Property(Priority = -100)] + public IncludedColumnRefCollection IncludedColumns { get; private set; } + + /// + /// Populates collection by + /// copying them from primary index. + /// + public void PopulatePrimaryKeyColumns() + { + foreach (var kcr in Parent.PrimaryIndex.KeyColumns) + new PrimaryKeyColumnRef(this, kcr.Value, kcr.Direction); + } + + /// + /// Empty secondary key columns collection. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + + // Secondary key columns: empty set, duplicates + var keyColumns = KeyColumns.Select(valueRef => valueRef.Value).ToList(); + if (keyColumns.Count==0) + ea.Execute(() => { + throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); + }); + foreach (var group in keyColumns + .GroupBy(keyColumn => keyColumn) + .Where(group => group.Count() > 1)) + ea.Execute((_column) => { + throw new ValidationException( + string.Format(Strings.ExMoreThenOneKeyColumnReferenceToColumnX, _column.Name), + Path); + }, group.Key); + + // Primary key columns + if (PrimaryKeyColumns.Count!=Parent.PrimaryIndex.KeyColumns.Count) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); + }); + for (int i = 0; i < PrimaryKeyColumns.Count; i++) { + var ref1 = PrimaryKeyColumns[i]; + var ref2 = Parent.PrimaryIndex.KeyColumns[i]; + if (ref1.Value!=ref2.Value || ref1.Direction!=ref2.Direction) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); + }); + } + + // Included columns + var fullKeySet = EnumerableExtensions.ToHashSet(KeyColumns + .Select(cr => cr.Value) + .Concat(PrimaryKeyColumns.Select(cr => cr.Value))); + + foreach (var columnRef in IncludedColumns) { + if (fullKeySet.Contains(columnRef.Value)) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidIncludedColumnsCollection, Path); + }); + } + + foreach (var group in IncludedColumns + .GroupBy(keyColumn => keyColumn) + .Where(group => group.Count() > 1)) { + ea.Execute((_column) => { + throw new ValidationException( + string.Format(Strings.ExMoreThenOneIncludedColumnReferenceToColumnX, _column.Name), + Path); + }, group.Key); + } + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "SecondaryIndexes"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (PrimaryKeyColumns==null) + PrimaryKeyColumns = new PrimaryKeyColumnRefCollection(this); + if (IncludedColumns==null) + IncludedColumns = new IncludedColumnRefCollection(this); + } + + + // Constructors + + public SecondaryIndexInfo(TableInfo table, string name) + : base(table, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfoCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfoCollection.cs index 22c7545f2b..1975d2e956 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfoCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/SecondaryIndexInfoCollection.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of secondary indexes. - /// - [Serializable] - public sealed class SecondaryIndexInfoCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - public SecondaryIndexInfoCollection(TableInfo table) - : base(table, "SecondaryIndexes") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of secondary indexes. + /// + [Serializable] + public sealed class SecondaryIndexInfoCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + public SecondaryIndexInfoCollection(TableInfo table) + : base(table, "SecondaryIndexes") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/StorageInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/StorageInfo.cs index b6128f345d..8f59c25582 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/StorageInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/StorageInfo.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Indexing storage. - /// - [Serializable] - public sealed class StorageInfo : NodeBase, - IModel - { - private ActionSequence actions; - - /// - public ActionSequence Actions { - get { return actions; } - set { - EnsureIsEditable(); - actions = value; - } - } - - /// - /// Gets tables. - /// - [Property(Priority = 0)] - public TableInfoCollection Tables { get; private set; } - - /// - protected override void Initialize() - { - base.Initialize(); - - if (Tables == null) - Tables = new TableInfoCollection(this); - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this); - } - - - // Constructors - - public StorageInfo(string name) - : base(null, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Indexing storage. + /// + [Serializable] + public sealed class StorageInfo : NodeBase, + IModel + { + private ActionSequence actions; + + /// + public ActionSequence Actions { + get { return actions; } + set { + EnsureIsEditable(); + actions = value; + } + } + + /// + /// Gets tables. + /// + [Property(Priority = 0)] + public TableInfoCollection Tables { get; private set; } + + /// + protected override void Initialize() + { + base.Initialize(); + + if (Tables == null) + Tables = new TableInfoCollection(this); + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this); + } + + + // Constructors + + public StorageInfo(string name) + : base(null, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfo.cs index d3ace03780..296d2a8178 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfo.cs @@ -1,115 +1,115 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Table. - /// - [Serializable] - public sealed class TableInfo : NodeBase - { - private PrimaryIndexInfo primaryIndex; - private FullTextIndexInfo fullTextIndex; - - /// - /// Gets columns. - /// - [Property(Priority = -2000)] - public ColumnInfoCollection Columns { get; private set; } - - /// - /// Gets or sets the primary index. - /// - [Property(Priority = -1200, IsImmutable = true, RecreateParent = true)] - public PrimaryIndexInfo PrimaryIndex { - get { return primaryIndex; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("PrimaryIndex", value)) { - primaryIndex = value; - scope.Commit(); - } - } - } - - /// - /// Gets secondary indexes. - /// - [Property(Priority = -1100, IsImmutable = true)] - public SecondaryIndexInfoCollection SecondaryIndexes { get; private set; } - - /// - /// Gets foreign keys. - /// - [Property(Priority = -1000, IsImmutable = true, DependencyRootType = typeof (TableInfoCollection))] - public ForeignKeyCollection ForeignKeys { get; private set; } - - /// - /// Gets or sets the full-text index. - /// - [Property(Priority = -900)] - public FullTextIndexInfo FullTextIndex - { - get { return fullTextIndex; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("FullTextIndex", value)) { - fullTextIndex = value; - scope.Commit(); - } - } - } - - /// - /// Gets all indexes belongs to the table. - /// - /// iterator. - public IEnumerable AllIndexes - { - get - { - yield return PrimaryIndex; - foreach (var indexInfo in SecondaryIndexes) - yield return indexInfo; - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Tables"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - - if (Columns==null) - Columns = new ColumnInfoCollection(this); - if (SecondaryIndexes == null) - SecondaryIndexes = new SecondaryIndexInfoCollection(this); - if (ForeignKeys == null) - ForeignKeys = new ForeignKeyCollection(this); - } - - - // Constructors - - /// - public TableInfo(StorageInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Table. + /// + [Serializable] + public sealed class TableInfo : NodeBase + { + private PrimaryIndexInfo primaryIndex; + private FullTextIndexInfo fullTextIndex; + + /// + /// Gets columns. + /// + [Property(Priority = -2000)] + public ColumnInfoCollection Columns { get; private set; } + + /// + /// Gets or sets the primary index. + /// + [Property(Priority = -1200, IsImmutable = true, RecreateParent = true)] + public PrimaryIndexInfo PrimaryIndex { + get { return primaryIndex; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("PrimaryIndex", value)) { + primaryIndex = value; + scope.Commit(); + } + } + } + + /// + /// Gets secondary indexes. + /// + [Property(Priority = -1100, IsImmutable = true)] + public SecondaryIndexInfoCollection SecondaryIndexes { get; private set; } + + /// + /// Gets foreign keys. + /// + [Property(Priority = -1000, IsImmutable = true, DependencyRootType = typeof (TableInfoCollection))] + public ForeignKeyCollection ForeignKeys { get; private set; } + + /// + /// Gets or sets the full-text index. + /// + [Property(Priority = -900)] + public FullTextIndexInfo FullTextIndex + { + get { return fullTextIndex; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("FullTextIndex", value)) { + fullTextIndex = value; + scope.Commit(); + } + } + } + + /// + /// Gets all indexes belongs to the table. + /// + /// iterator. + public IEnumerable AllIndexes + { + get + { + yield return PrimaryIndex; + foreach (var indexInfo in SecondaryIndexes) + yield return indexInfo; + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Tables"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + + if (Columns==null) + Columns = new ColumnInfoCollection(this); + if (SecondaryIndexes == null) + SecondaryIndexes = new SecondaryIndexInfoCollection(this); + if (ForeignKeys == null) + ForeignKeys = new ForeignKeyCollection(this); + } + + + // Constructors + + /// + public TableInfo(StorageInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfoCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfoCollection.cs index bf0d90eb32..a0a66c6bd1 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfoCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TableInfoCollection.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class TableInfoCollection: NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - public TableInfoCollection(StorageInfo storage) - : base(storage, "Tables") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class TableInfoCollection: NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + public TableInfoCollection(StorageInfo storage) + : base(storage, "Tables") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs index 8fadf49e53..cffe70ef5a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs @@ -1,219 +1,219 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using System.Globalization; -using Xtensive.Core; -using System.Text; -using Xtensive.Reflection; -using Xtensive.Modelling.Validation; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// Type of table column. - /// - [Serializable] - public sealed class TypeInfo : IEquatable, - IValidatable, - ICloneable - { - /// - /// Gets the type of the data. - /// - public Type Type { get; private set; } - - /// - /// Indicates whether is nullable. - /// - public bool IsNullable { get; private set; } - - /// - /// Gets the length. - /// - public int Length { get; private set; } - - /// - /// Gets the culture. - /// - public CultureInfo Culture { get; private set; } - - /// - /// Gets the scale. - /// - public int Scale { get; private set; } - - /// - /// Gets the precision. - /// - public int Precision { get; private set; } - - /// - public void Validate() - { - // TODO: Implement - } - - #region Implementation of ICloneable - - public object Clone() - { - var clone = new TypeInfo(Type, IsNullable); - clone.Length = Length; - clone.Culture = Culture; - clone.Scale = Scale; - clone.Precision = Precision; - return clone; - } - - #endregion - - #region Equality members - - public bool Equals(TypeInfo other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return - other.Type==Type && - other.IsNullable==IsNullable && - other.Length==Length && - other.Scale==Scale && - other.Precision==Precision; - } - - /// - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (TypeInfo)) - return false; - return Equals((TypeInfo) obj); - } - - /// - public override int GetHashCode() - { - unchecked { - int result = (Type!=null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (IsNullable ? 1 : 0); - result = (result * 397) ^ Length; - result = (result * 397) ^ Scale; - result = (result * 397) ^ Precision; - if (Culture!=null) - result = (result * 397) ^ Culture.GetHashCode(); - return result; - } - } - - /// - /// Implements the operator ==. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator ==(TypeInfo left, TypeInfo right) - { - return Equals(left, right); - } - - /// - /// Implements the operator !=. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator !=(TypeInfo left, TypeInfo right) - { - return !Equals(left, right); - } - - #endregion - - /// - public override string ToString() - { - var sb = new StringBuilder(); - var type = Type; - if (type.IsNullable()) - type = type.GetGenericArguments()[0]; - sb.Append(string.Format(Strings.PropertyPairFormat, Strings.Type, type.GetShortName())); - if (IsNullable) - sb.Append(Strings.NullableMark); - if (Length > 0) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Length, Length)); - if (Culture!=null) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Culture, Culture)); - if (Scale > 0) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Scale, Scale)); - if (Precision > 0) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Precision, Precision)); - return sb.ToString(); - } - - // Constructors - - - public TypeInfo(Type type) - : this(type, type.IsClass || type.IsNullable()) - { - } - - public TypeInfo(Type type, int length) - : this(type, type.IsClass || type.IsNullable(), length) - { - } - - public TypeInfo(Type type, int length, CultureInfo culture) - : this(type, type.IsClass || type.IsNullable(), length, culture) - { - } - - public TypeInfo(Type type, int length, int scale, int precision) - : this(type, type.IsClass || type.IsNullable(), length, scale, precision) - { - } - - public TypeInfo(Type type, bool isNullable) - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - if (isNullable && type.IsValueType && !type.IsNullable()) - ArgumentValidator.EnsureArgumentIsInRange(true, false, false, "isNullable"); - Type = type; - IsNullable = isNullable; - } - - public TypeInfo(Type type, bool isNullable, int length) - : this(type, isNullable) - { - ArgumentValidator.EnsureArgumentIsInRange(length, 0, int.MaxValue, "length"); - Length = length; - } - - public TypeInfo(Type type, bool isNullable, int length, CultureInfo culture) - : this(type, isNullable, length) - { - ArgumentValidator.EnsureArgumentNotNull(culture, "culture"); - Culture = culture; - } - - public TypeInfo(Type type, bool isNullable, int length, int scale, int precision) - : this(type, isNullable, length) - { - Scale = scale; - Precision = precision; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using System.Globalization; +using Xtensive.Core; +using System.Text; +using Xtensive.Reflection; +using Xtensive.Modelling.Validation; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// Type of table column. + /// + [Serializable] + public sealed class TypeInfo : IEquatable, + IValidatable, + ICloneable + { + /// + /// Gets the type of the data. + /// + public Type Type { get; private set; } + + /// + /// Indicates whether is nullable. + /// + public bool IsNullable { get; private set; } + + /// + /// Gets the length. + /// + public int Length { get; private set; } + + /// + /// Gets the culture. + /// + public CultureInfo Culture { get; private set; } + + /// + /// Gets the scale. + /// + public int Scale { get; private set; } + + /// + /// Gets the precision. + /// + public int Precision { get; private set; } + + /// + public void Validate() + { + // TODO: Implement + } + + #region Implementation of ICloneable + + public object Clone() + { + var clone = new TypeInfo(Type, IsNullable); + clone.Length = Length; + clone.Culture = Culture; + clone.Scale = Scale; + clone.Precision = Precision; + return clone; + } + + #endregion + + #region Equality members + + public bool Equals(TypeInfo other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return + other.Type==Type && + other.IsNullable==IsNullable && + other.Length==Length && + other.Scale==Scale && + other.Precision==Precision; + } + + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (TypeInfo)) + return false; + return Equals((TypeInfo) obj); + } + + /// + public override int GetHashCode() + { + unchecked { + int result = (Type!=null ? Type.GetHashCode() : 0); + result = (result * 397) ^ (IsNullable ? 1 : 0); + result = (result * 397) ^ Length; + result = (result * 397) ^ Scale; + result = (result * 397) ^ Precision; + if (Culture!=null) + result = (result * 397) ^ Culture.GetHashCode(); + return result; + } + } + + /// + /// Implements the operator ==. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator ==(TypeInfo left, TypeInfo right) + { + return Equals(left, right); + } + + /// + /// Implements the operator !=. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator !=(TypeInfo left, TypeInfo right) + { + return !Equals(left, right); + } + + #endregion + + /// + public override string ToString() + { + var sb = new StringBuilder(); + var type = Type; + if (type.IsNullable()) + type = type.GetGenericArguments()[0]; + sb.Append(string.Format(Strings.PropertyPairFormat, Strings.Type, type.GetShortName())); + if (IsNullable) + sb.Append(Strings.NullableMark); + if (Length > 0) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Length, Length)); + if (Culture!=null) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Culture, Culture)); + if (Scale > 0) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Scale, Scale)); + if (Precision > 0) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Precision, Precision)); + return sb.ToString(); + } + + // Constructors + + + public TypeInfo(Type type) + : this(type, type.IsClass || type.IsNullable()) + { + } + + public TypeInfo(Type type, int length) + : this(type, type.IsClass || type.IsNullable(), length) + { + } + + public TypeInfo(Type type, int length, CultureInfo culture) + : this(type, type.IsClass || type.IsNullable(), length, culture) + { + } + + public TypeInfo(Type type, int length, int scale, int precision) + : this(type, type.IsClass || type.IsNullable(), length, scale, precision) + { + } + + public TypeInfo(Type type, bool isNullable) + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + if (isNullable && type.IsValueType && !type.IsNullable()) + ArgumentValidator.EnsureArgumentIsInRange(true, false, false, "isNullable"); + Type = type; + IsNullable = isNullable; + } + + public TypeInfo(Type type, bool isNullable, int length) + : this(type, isNullable) + { + ArgumentValidator.EnsureArgumentIsInRange(length, 0, int.MaxValue, "length"); + Length = length; + } + + public TypeInfo(Type type, bool isNullable, int length, CultureInfo culture) + : this(type, isNullable, length) + { + ArgumentValidator.EnsureArgumentNotNull(culture, "culture"); + Culture = culture; + } + + public TypeInfo(Type type, bool isNullable, int length, int scale, int precision) + : this(type, isNullable, length) + { + Scale = scale; + Precision = precision; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRef.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRef.cs index 498e1c6dee..68b09354e7 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRef.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRef.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// References to value column. - /// - [Serializable] - public sealed class ValueColumnRef : ColumnInfoRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting( - this, "ValueColumns"); - } - - - // Constructors - - public ValueColumnRef(PrimaryIndexInfo parent) - : base(parent) - { - } - - public ValueColumnRef(PrimaryIndexInfo parent, ColumnInfo column) - : base(parent, column) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// References to value column. + /// + [Serializable] + public sealed class ValueColumnRef : ColumnInfoRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting( + this, "ValueColumns"); + } + + + // Constructors + + public ValueColumnRef(PrimaryIndexInfo parent) + : base(parent) + { + } + + public ValueColumnRef(PrimaryIndexInfo parent, ColumnInfo column) + : base(parent, column) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRefCollection.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRefCollection.cs index d19ecad268..59036d095d 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRefCollection.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/ValueColumnRefCollection.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class ValueColumnRefCollection: NodeCollectionBase - { - // Constructors - - public ValueColumnRefCollection(PrimaryIndexInfo parent) - : base(parent, "ValueColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +namespace Xtensive.Orm.Tests.Core.Modelling.IndexingModel +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class ValueColumnRefCollection: NodeCollectionBase + { + // Constructors + + public ValueColumnRefCollection(PrimaryIndexInfo parent) + : base(parent, "ValueColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModelTest.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModelTest.cs index 892a033f63..c17e16a1f2 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModelTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModelTest.cs @@ -1,519 +1,519 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.04.17 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using System.Linq; -using Xtensive.Orm.Tests.Core.Modelling.IndexingModel; - -namespace Xtensive.Orm.Tests.Core.Modelling -{ - [TestFixture] - public class IndexingModelTest - { - [Test] - public void RenameNodeTest() - { - var storage = CreateSimpleStorageModel(); - var tTypes = storage.Tables["Types"]; - tTypes.SecondaryIndexes["IX_Value"].Name = "IX_Value_New"; - tTypes.PrimaryIndex.Name = "PK_Types_New"; - } - - [Test] - public void SimpleTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { }, - (diff, actions) => Assert.IsNull(diff)); - } - - [Test] - public void MutualRenameTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - new ColumnInfo(s1.Tables["Types"], "Temp_Data", new TypeInfo(typeof (int))); - RepopulateValueColumns(s1, "Types"); - new ColumnInfo(s2.Tables["Types"], "Temp_Data", new TypeInfo(typeof (int))); - RepopulateValueColumns(s2, "Types"); - var oldTTypes = s1.Tables["Types"]; - var oldCValue = oldTTypes.Columns["Value"]; - var oldCData = oldTTypes.Columns["Data"]; - var oldTObjects = s1.Tables["Objects"]; - var newTTypes = s2.Tables["Types"]; - var newCValue = newTTypes.Columns["Value"]; - var newCData = newTTypes.Columns["Data"]; - var newTObjects = s2.Tables["Objects"]; - oldTTypes.PrimaryIndex.Name = "PK_Types_Old"; - newTTypes.PrimaryIndex.Name = "PK_Types_New"; - newCValue.Name = "Temp"; - newCData.Name = "Value"; - newCValue.Name = "Data"; - newTTypes.Name = "Temp"; - newTObjects.Name = "Types"; - newTTypes.Name = "Objects"; - hs.Add(new RenameHint(oldCData.Path, newCData.Path)); - hs.Add(new RenameHint(oldCValue.Path, newCValue.Path)); - hs.Add(new RenameHint(oldTTypes.Path, newTTypes.Path)); - hs.Add(new RenameHint(oldTObjects.Path, newTObjects.Path)); - }, - (diff, actions) => { }); - } - - [Test] - public void MutualRenameTest2() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var types = s2.Resolve("Tables/Types") as TableInfo; - var objects= s2.Resolve("Tables/Objects") as TableInfo; - types.Name = "Temp"; - objects.Name = "Types"; - types.Name = "Objects"; - types.Columns["Value"].Name = "NewValue"; - RepopulateValueColumns(s2, "Objects"); - hs.Add(new RenameHint("Tables/Types", "Tables/Objects")); - hs.Add(new RenameHint("Tables/Objects", "Tables/Types")); - hs.Add(new RenameHint("Tables/Types/Columns/Value", "Tables/Objects/Columns/NewValue")); - }, - (diff, actions) => { }); - } - - [Test] - public void RemoveDependentPropertyTest1() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var o = (TableInfo) s2.Resolve("Tables/Objects"); - o.Remove(); - }, - (diff, actions) => Assert.IsTrue( - actions - .Flatten() - .OfType() - .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); - } - - [Test] - public void RemoveDependentPropertyTest2() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var t1 = (TableInfo) s2.Resolve("Tables/Types"); - var t2 = (TableInfo) s2.Resolve("Tables/Objects"); - t1.Remove(); - t2.Remove(); - }, - (diff, actions) => Assert.IsTrue( - actions - .Flatten() - .OfType() - .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); - } - - [Test] - public void RemoveDependentPropertyTest3() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var t1 = (TableInfo) s2.Resolve("Tables/Types"); - t1.Columns["Value"].Name = "NewValue"; - RepopulateValueColumns(s2, "Types"); - }, - (diff, actions) => Assert.IsTrue( - actions - .Flatten() - .OfType() - .Any(a => a.Path == "Tables/Types/Columns/Value"))); - } - - [Test] - public void RemoveDependentPropertyTest4() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var t1 = (TableInfo) s2.Resolve("Tables/Objects"); - var c1 = t1.Columns["TypeId"]; - var oldPath = c1.Path; - c1.Name = "NewTypeId"; - hs.Add(new RenameHint(oldPath, c1.Path)); - }, - (diff, actions) => { }); - } - - [Test] - public void IgnoreHintTest() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var o = s1.Resolve("Tables/Objects") as TableInfo; - new ColumnInfo(o, "IgnoredColumn", new TypeInfo(typeof (int))); - RepopulateValueColumns(s1, "Objects"); - hs.Add(new IgnoreHint("Tables/Objects/Columns/IgnoredColumn")); - }, - (diff, actions) => - Assert.IsNull(diff)); - } - - [Test] - public void RenameTest1() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (s1, s2, hs) => { - var o2 = (TableInfo) s2.Resolve("Tables/Objects"); - string o2OldPath = o2.Path; - o2.Name = "NewObjects"; - hs.Add(new RenameHint(o2OldPath, o2.Path)); - }, - (diff, actions) => { }); - } - - [Test] - public void RenameTest2() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (source, target, hs) => { - var type = (TableInfo)target.Resolve("Tables/Types"); - var typeOldPath = type.Path; - var pkType = type.PrimaryIndex; - var pkOldPath = pkType.Path; - - pkType.Name = "PK_NewTypes"; - type.Name = "NewTypes"; - - hs.Add(new RenameHint(typeOldPath, type.Path)); - }, - (diff, actions) => { - var flatten = actions.Flatten().ToList(); - Assert.AreEqual(11, flatten.Count); - }); - } - - [Test] - public void RenameTest3() - { - var storage = CreateSimpleStorageModel(); - storage.Tables["Types"].Index = storage.Tables.Count - 1; - - TestUpdate(storage, (s1, s2, hs) => { - var t2 = (TableInfo) s2.Resolve("Tables/Types"); - string t2OldPath = t2.Path; - t2.Name = "NewTypes"; - hs.Add(new RenameHint(t2OldPath, t2.Path)); - }, - (diff, actions) => { - var flatten = actions.Flatten().ToList(); - Assert.AreEqual(1, flatten.Count); - Assert.IsTrue(flatten.All(a => a is MoveNodeAction)); - }); - } - - [Test] - public void RenameTest4() - { - var storage = new StorageInfo("."); - new TableInfo(storage, "Employee"); - - TestUpdate(storage, (s1, s2, hs) => { - s2.Tables.Clear(); - new TableInfo(s2, "Employee"); - new TableInfo(s2, "RcEmployee"); - - hs.Add(new RenameHint("Tables/Employee", "Tables/RcEmployee")); - }, - (diff, actions) => { - }); - } - - [Test] - public void ChangeFullTextIndexTest() - { - var storage = CreateSimpleStorageModel(); - - TestUpdate(storage, (source, target, hs) => { - var type = (TableInfo) target.Resolve("Tables/Types"); - var ftIndex = type.FullTextIndex; - var valueColumn = type.Columns["Value"]; - var oldPath = valueColumn.Path; - valueColumn.Name = "StringValue"; - var dataColumn = type.Columns["Data"]; - new FullTextColumnRef(ftIndex, dataColumn); - hs.Add(new RenameHint(oldPath, valueColumn.Path)); - }, - (diff, actions) => { -// var flatten = actions.Flatten().ToList(); -// Assert.AreEqual(1, flatten.Count); -// Assert.IsTrue(flatten.All(a => a is MoveNodeAction)); - }); - } - - [Test] - public void MoveColumnTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - new ColumnInfo(s1.Tables["Types"], "ColumnToRemove", new TypeInfo(typeof (int))); - var oldColumn = s1.Tables["Types"].Columns["Data"]; - ((Node) s2.Resolve(oldColumn.Path)).Remove(); - var newColumn = new ColumnInfo(s2.Tables["Objects"], "Data", oldColumn.Type); - RepopulateValueColumns(s1, "Types"); - RepopulateValueColumns(s2, "Types"); - RepopulateValueColumns(s2, "Objects"); - - var copyDataHint = new CopyDataHint( - "Tables/Types", - new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/Objects/Columns/TypeId", false)}, - new List> {new Pair("Tables/Types/Columns/Data", "Tables/Objects/Columns/Data")}); - - hs.Add(copyDataHint); - }, - (diff, actions)=> { }); - } - - [Test] - public void MoveColumnFromRemovedTableTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var oldColumn = s1.Tables["Types"].Columns["Data"]; - s2.Tables["Objects"].ForeignKeys.Clear(); - s2.Tables["Types"].Remove(); - var newColumn = new ColumnInfo(s2.Tables["Objects"], "Data", oldColumn.Type); - RepopulateValueColumns(s1, "Types"); - RepopulateValueColumns(s2, "Objects"); - - var copyDataHint = new CopyDataHint( - "Tables/Types", - new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/Objects/Columns/TypeId", false)}, - new List> {new Pair("Tables/Types/Columns/Data", "Tables/Objects/Columns/Data")}); - - hs.Add(copyDataHint); - }, - (diff, actions) => { }); - } - - [Test] - public void MoveColumnFromRemovedTableToRenamedTableTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var oldColumn = s1.Tables["Types"].Columns["Data"]; - s2.Tables["Objects"].ForeignKeys.Clear(); - s2.Tables["Types"].Remove(); - s2.Tables["Objects"].Name = "NewObjects"; - var newColumn = new ColumnInfo(s2.Tables["NewObjects"], "NewData", oldColumn.Type); - RepopulateValueColumns(s1, "Types"); - RepopulateValueColumns(s2, "NewObjects"); - - hs.Add(new RenameHint(s1.Tables["Objects"].Path, s2.Tables["NewObjects"].Path)); - var copyDataHint = new CopyDataHint( - "Tables/Types", - new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/NewObjects/Columns/TypeId", false)}, - new List> {new Pair("Tables/Types/Columns/Data", "Tables/NewObjects/Columns/NewData")}); - - hs.Add(copyDataHint); - }, - (diff, actions) => { }); - } - - [Test] - public void ChangePrimaryColumnTypeTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s, t, hs) => { - var pk = t.Tables["Types"].PrimaryIndex; - var id = t.Tables["Types"].Columns["Id"]; - id.Type = new TypeInfo(typeof(Guid)); - var fk = t.Tables["Objects"].ForeignKeys["FK_TypeId"]; - fk.ForeignKeyColumns.Set(pk); - }, - (diff, actions) => { }); - } - - [Test] - public void ChangeColumnTypeTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var column = s2.Tables["Types"].Columns["Data"]; - column.Type = new TypeInfo(typeof (int)); - }, - (diff, actions) => { }); - } - - [Test] - public void RemoveReferencedTable() - { - var storage = CreateSimpleStorageModel(); - storage.Dump(); - - TestUpdate(storage, (s1, s2, hs) => { - var types = (TableInfo) s2.Resolve("Tables/Types"); - var objects = (TableInfo) s2.Resolve("Tables/Objects"); - objects.ForeignKeys.Clear(); - types.Remove(); - }, - (diff, actions) => Assert.IsTrue( - actions - .Flatten() - .OfType() - .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); - } - - [Test] - public void ComplexTest() - { - var storage = CreateSimpleStorageModel(); - TestUpdate(storage, (s1, s2, hs) => { - var oldColumn = s1.Tables["Types"].Columns["Data"]; - s2.Tables["Types"].Remove(); - s2.Tables["Objects"].ForeignKeys[0].Remove(); - s2.Tables["Objects"].Name = "NewObjects"; - s2.Tables["NewObjects"].Columns["Id"].Name = "NewId"; - var newColumn = new ColumnInfo(s2.Tables["NewObjects"], "NewData", oldColumn.Type); - s2.Tables["NewObjects"].PrimaryIndex.ValueColumns.Clear(); - s2.Tables["NewObjects"].PrimaryIndex.PopulateValueColumns(); - - hs.Add(new RenameHint(s1.Tables["Objects"].Path, - s2.Tables["NewObjects"].Path)); - hs.Add(new RenameHint(s1.Tables["Objects"].Columns["Id"].Path, - s2.Tables["NewObjects"].Columns["NewId"].Path)); - var copyDataHint = new CopyDataHint( - "Tables/Types", - new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/NewObjects/Columns/TypeId", false)}, - new List> {new Pair("Tables/Types/Columns/Data", "Tables/NewObjects/Columns/NewData")}); - - hs.Add(copyDataHint); - }, - (diff, actions) => { }); - } - - private static StorageInfo CreateSimpleStorageModel() - { - var storage = new StorageInfo("Storage"); - - // Types table - var t = new TableInfo(storage, "Types"); - var tId = new ColumnInfo(t, "Id") { - Type = new TypeInfo(typeof (int), false) - }; - var tValue = new ColumnInfo(t, "Value") { - Type = new TypeInfo(typeof (string), 1024) - }; - var tData = new ColumnInfo(t, "Data") { - Type = new TypeInfo(typeof (byte[]), 1024*1024) - }; - - var tiPk = new PrimaryIndexInfo(t, "PK_Types"); - new KeyColumnRef(tiPk, tId); - tiPk.PopulateValueColumns(); - - var tiValue = new SecondaryIndexInfo(t, "IX_Value"); - new KeyColumnRef(tiValue, tValue); - tiValue.PopulatePrimaryKeyColumns(); - - var tiFt = new FullTextIndexInfo(t, "FT_Index"); - new FullTextColumnRef(tiFt, tValue); - - // Objects table - var o = new TableInfo(storage, "Objects"); - var oId = new ColumnInfo(o, "Id") { - Type = new TypeInfo(typeof (long), false) - }; - var oTypeId = new ColumnInfo(o, "TypeId") { - Type = new TypeInfo(typeof (int), false) - }; - var oValue = new ColumnInfo(o, "Value") { - Type = new TypeInfo(typeof (string), 1024) - }; - - var oiPk = new PrimaryIndexInfo(o, "PK_Objects"); - new KeyColumnRef(oiPk, oId); - oiPk.PopulateValueColumns(); - - var oiTypeId = new SecondaryIndexInfo(o, "IX_TypeId"); - new KeyColumnRef(oiTypeId, oTypeId); - oiTypeId.PopulatePrimaryKeyColumns(); - - var oiValue = new SecondaryIndexInfo(o, "IX_Value"); - new KeyColumnRef(oiValue, oValue); - new IncludedColumnRef(oiValue, oTypeId); - oiValue.PopulatePrimaryKeyColumns(); - - var ofkTypeId = new ForeignKeyInfo(o, "FK_TypeId") { - PrimaryKey = tiPk, - }; - ofkTypeId.ForeignKeyColumns.Set(oiTypeId); - - storage.Validate(); - return storage; - } - - #region Private methods - - private static void RepopulateValueColumns(StorageInfo model, string tableName) - { - var pk = model.Tables[tableName].PrimaryIndex; - pk.ValueColumns.Clear(); - pk.PopulateValueColumns(); - } - - private static void TestUpdate(StorageInfo origin, Action mutator, Action validator) - { - // - ;) - TestUpdate(origin, mutator, validator, true); - // TestUpdate(origin, mutator, null, false); - } - - private static void TestUpdate(StorageInfo origin, Action mutator, Action validator, bool useHints) - { - var s1 = Clone(origin); - var s2 = Clone(origin); - var hints = new HintSet(s1, s2); - mutator.Invoke(s1, s2, hints); - if (!useHints) - hints = new HintSet(s1, s2); - TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); - s1.Validate(); - s2.Validate(); - - // Comparing different models - TestLog.Info("Comparing models:"); - var comparer = new Comparer(); - var diff = comparer.Compare(s1, s2, hints); - TestLog.Info("\r\nDifference:\r\n{0}", diff); - var actions = new ActionSequence() { - new Upgrader().GetUpgradeSequence(diff, hints, comparer) - }; - TestLog.Info("\r\nActions:\r\n{0}", actions); - if (validator!=null) - validator.Invoke(diff, actions); - } - - private static StorageInfo Clone(StorageInfo server) - { - return (StorageInfo) server.Clone(null, server.Name); - // return (StorageInfo) LegacyBinarySerializer.Instance.Clone(server); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.04.17 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using System.Linq; +using Xtensive.Orm.Tests.Core.Modelling.IndexingModel; + +namespace Xtensive.Orm.Tests.Core.Modelling +{ + [TestFixture] + public class IndexingModelTest + { + [Test] + public void RenameNodeTest() + { + var storage = CreateSimpleStorageModel(); + var tTypes = storage.Tables["Types"]; + tTypes.SecondaryIndexes["IX_Value"].Name = "IX_Value_New"; + tTypes.PrimaryIndex.Name = "PK_Types_New"; + } + + [Test] + public void SimpleTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { }, + (diff, actions) => Assert.IsNull(diff)); + } + + [Test] + public void MutualRenameTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + new ColumnInfo(s1.Tables["Types"], "Temp_Data", new TypeInfo(typeof (int))); + RepopulateValueColumns(s1, "Types"); + new ColumnInfo(s2.Tables["Types"], "Temp_Data", new TypeInfo(typeof (int))); + RepopulateValueColumns(s2, "Types"); + var oldTTypes = s1.Tables["Types"]; + var oldCValue = oldTTypes.Columns["Value"]; + var oldCData = oldTTypes.Columns["Data"]; + var oldTObjects = s1.Tables["Objects"]; + var newTTypes = s2.Tables["Types"]; + var newCValue = newTTypes.Columns["Value"]; + var newCData = newTTypes.Columns["Data"]; + var newTObjects = s2.Tables["Objects"]; + oldTTypes.PrimaryIndex.Name = "PK_Types_Old"; + newTTypes.PrimaryIndex.Name = "PK_Types_New"; + newCValue.Name = "Temp"; + newCData.Name = "Value"; + newCValue.Name = "Data"; + newTTypes.Name = "Temp"; + newTObjects.Name = "Types"; + newTTypes.Name = "Objects"; + hs.Add(new RenameHint(oldCData.Path, newCData.Path)); + hs.Add(new RenameHint(oldCValue.Path, newCValue.Path)); + hs.Add(new RenameHint(oldTTypes.Path, newTTypes.Path)); + hs.Add(new RenameHint(oldTObjects.Path, newTObjects.Path)); + }, + (diff, actions) => { }); + } + + [Test] + public void MutualRenameTest2() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var types = s2.Resolve("Tables/Types") as TableInfo; + var objects= s2.Resolve("Tables/Objects") as TableInfo; + types.Name = "Temp"; + objects.Name = "Types"; + types.Name = "Objects"; + types.Columns["Value"].Name = "NewValue"; + RepopulateValueColumns(s2, "Objects"); + hs.Add(new RenameHint("Tables/Types", "Tables/Objects")); + hs.Add(new RenameHint("Tables/Objects", "Tables/Types")); + hs.Add(new RenameHint("Tables/Types/Columns/Value", "Tables/Objects/Columns/NewValue")); + }, + (diff, actions) => { }); + } + + [Test] + public void RemoveDependentPropertyTest1() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var o = (TableInfo) s2.Resolve("Tables/Objects"); + o.Remove(); + }, + (diff, actions) => Assert.IsTrue( + actions + .Flatten() + .OfType() + .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); + } + + [Test] + public void RemoveDependentPropertyTest2() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var t1 = (TableInfo) s2.Resolve("Tables/Types"); + var t2 = (TableInfo) s2.Resolve("Tables/Objects"); + t1.Remove(); + t2.Remove(); + }, + (diff, actions) => Assert.IsTrue( + actions + .Flatten() + .OfType() + .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); + } + + [Test] + public void RemoveDependentPropertyTest3() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var t1 = (TableInfo) s2.Resolve("Tables/Types"); + t1.Columns["Value"].Name = "NewValue"; + RepopulateValueColumns(s2, "Types"); + }, + (diff, actions) => Assert.IsTrue( + actions + .Flatten() + .OfType() + .Any(a => a.Path == "Tables/Types/Columns/Value"))); + } + + [Test] + public void RemoveDependentPropertyTest4() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var t1 = (TableInfo) s2.Resolve("Tables/Objects"); + var c1 = t1.Columns["TypeId"]; + var oldPath = c1.Path; + c1.Name = "NewTypeId"; + hs.Add(new RenameHint(oldPath, c1.Path)); + }, + (diff, actions) => { }); + } + + [Test] + public void IgnoreHintTest() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var o = s1.Resolve("Tables/Objects") as TableInfo; + new ColumnInfo(o, "IgnoredColumn", new TypeInfo(typeof (int))); + RepopulateValueColumns(s1, "Objects"); + hs.Add(new IgnoreHint("Tables/Objects/Columns/IgnoredColumn")); + }, + (diff, actions) => + Assert.IsNull(diff)); + } + + [Test] + public void RenameTest1() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (s1, s2, hs) => { + var o2 = (TableInfo) s2.Resolve("Tables/Objects"); + string o2OldPath = o2.Path; + o2.Name = "NewObjects"; + hs.Add(new RenameHint(o2OldPath, o2.Path)); + }, + (diff, actions) => { }); + } + + [Test] + public void RenameTest2() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (source, target, hs) => { + var type = (TableInfo)target.Resolve("Tables/Types"); + var typeOldPath = type.Path; + var pkType = type.PrimaryIndex; + var pkOldPath = pkType.Path; + + pkType.Name = "PK_NewTypes"; + type.Name = "NewTypes"; + + hs.Add(new RenameHint(typeOldPath, type.Path)); + }, + (diff, actions) => { + var flatten = actions.Flatten().ToList(); + Assert.AreEqual(11, flatten.Count); + }); + } + + [Test] + public void RenameTest3() + { + var storage = CreateSimpleStorageModel(); + storage.Tables["Types"].Index = storage.Tables.Count - 1; + + TestUpdate(storage, (s1, s2, hs) => { + var t2 = (TableInfo) s2.Resolve("Tables/Types"); + string t2OldPath = t2.Path; + t2.Name = "NewTypes"; + hs.Add(new RenameHint(t2OldPath, t2.Path)); + }, + (diff, actions) => { + var flatten = actions.Flatten().ToList(); + Assert.AreEqual(1, flatten.Count); + Assert.IsTrue(flatten.All(a => a is MoveNodeAction)); + }); + } + + [Test] + public void RenameTest4() + { + var storage = new StorageInfo("."); + new TableInfo(storage, "Employee"); + + TestUpdate(storage, (s1, s2, hs) => { + s2.Tables.Clear(); + new TableInfo(s2, "Employee"); + new TableInfo(s2, "RcEmployee"); + + hs.Add(new RenameHint("Tables/Employee", "Tables/RcEmployee")); + }, + (diff, actions) => { + }); + } + + [Test] + public void ChangeFullTextIndexTest() + { + var storage = CreateSimpleStorageModel(); + + TestUpdate(storage, (source, target, hs) => { + var type = (TableInfo) target.Resolve("Tables/Types"); + var ftIndex = type.FullTextIndex; + var valueColumn = type.Columns["Value"]; + var oldPath = valueColumn.Path; + valueColumn.Name = "StringValue"; + var dataColumn = type.Columns["Data"]; + new FullTextColumnRef(ftIndex, dataColumn); + hs.Add(new RenameHint(oldPath, valueColumn.Path)); + }, + (diff, actions) => { +// var flatten = actions.Flatten().ToList(); +// Assert.AreEqual(1, flatten.Count); +// Assert.IsTrue(flatten.All(a => a is MoveNodeAction)); + }); + } + + [Test] + public void MoveColumnTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + new ColumnInfo(s1.Tables["Types"], "ColumnToRemove", new TypeInfo(typeof (int))); + var oldColumn = s1.Tables["Types"].Columns["Data"]; + ((Node) s2.Resolve(oldColumn.Path)).Remove(); + var newColumn = new ColumnInfo(s2.Tables["Objects"], "Data", oldColumn.Type); + RepopulateValueColumns(s1, "Types"); + RepopulateValueColumns(s2, "Types"); + RepopulateValueColumns(s2, "Objects"); + + var copyDataHint = new CopyDataHint( + "Tables/Types", + new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/Objects/Columns/TypeId", false)}, + new List> {new Pair("Tables/Types/Columns/Data", "Tables/Objects/Columns/Data")}); + + hs.Add(copyDataHint); + }, + (diff, actions)=> { }); + } + + [Test] + public void MoveColumnFromRemovedTableTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var oldColumn = s1.Tables["Types"].Columns["Data"]; + s2.Tables["Objects"].ForeignKeys.Clear(); + s2.Tables["Types"].Remove(); + var newColumn = new ColumnInfo(s2.Tables["Objects"], "Data", oldColumn.Type); + RepopulateValueColumns(s1, "Types"); + RepopulateValueColumns(s2, "Objects"); + + var copyDataHint = new CopyDataHint( + "Tables/Types", + new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/Objects/Columns/TypeId", false)}, + new List> {new Pair("Tables/Types/Columns/Data", "Tables/Objects/Columns/Data")}); + + hs.Add(copyDataHint); + }, + (diff, actions) => { }); + } + + [Test] + public void MoveColumnFromRemovedTableToRenamedTableTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var oldColumn = s1.Tables["Types"].Columns["Data"]; + s2.Tables["Objects"].ForeignKeys.Clear(); + s2.Tables["Types"].Remove(); + s2.Tables["Objects"].Name = "NewObjects"; + var newColumn = new ColumnInfo(s2.Tables["NewObjects"], "NewData", oldColumn.Type); + RepopulateValueColumns(s1, "Types"); + RepopulateValueColumns(s2, "NewObjects"); + + hs.Add(new RenameHint(s1.Tables["Objects"].Path, s2.Tables["NewObjects"].Path)); + var copyDataHint = new CopyDataHint( + "Tables/Types", + new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/NewObjects/Columns/TypeId", false)}, + new List> {new Pair("Tables/Types/Columns/Data", "Tables/NewObjects/Columns/NewData")}); + + hs.Add(copyDataHint); + }, + (diff, actions) => { }); + } + + [Test] + public void ChangePrimaryColumnTypeTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s, t, hs) => { + var pk = t.Tables["Types"].PrimaryIndex; + var id = t.Tables["Types"].Columns["Id"]; + id.Type = new TypeInfo(typeof(Guid)); + var fk = t.Tables["Objects"].ForeignKeys["FK_TypeId"]; + fk.ForeignKeyColumns.Set(pk); + }, + (diff, actions) => { }); + } + + [Test] + public void ChangeColumnTypeTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var column = s2.Tables["Types"].Columns["Data"]; + column.Type = new TypeInfo(typeof (int)); + }, + (diff, actions) => { }); + } + + [Test] + public void RemoveReferencedTable() + { + var storage = CreateSimpleStorageModel(); + storage.Dump(); + + TestUpdate(storage, (s1, s2, hs) => { + var types = (TableInfo) s2.Resolve("Tables/Types"); + var objects = (TableInfo) s2.Resolve("Tables/Objects"); + objects.ForeignKeys.Clear(); + types.Remove(); + }, + (diff, actions) => Assert.IsTrue( + actions + .Flatten() + .OfType() + .Any(a => a.Path=="Tables/Objects/ForeignKeys/FK_TypeId"))); + } + + [Test] + public void ComplexTest() + { + var storage = CreateSimpleStorageModel(); + TestUpdate(storage, (s1, s2, hs) => { + var oldColumn = s1.Tables["Types"].Columns["Data"]; + s2.Tables["Types"].Remove(); + s2.Tables["Objects"].ForeignKeys[0].Remove(); + s2.Tables["Objects"].Name = "NewObjects"; + s2.Tables["NewObjects"].Columns["Id"].Name = "NewId"; + var newColumn = new ColumnInfo(s2.Tables["NewObjects"], "NewData", oldColumn.Type); + s2.Tables["NewObjects"].PrimaryIndex.ValueColumns.Clear(); + s2.Tables["NewObjects"].PrimaryIndex.PopulateValueColumns(); + + hs.Add(new RenameHint(s1.Tables["Objects"].Path, + s2.Tables["NewObjects"].Path)); + hs.Add(new RenameHint(s1.Tables["Objects"].Columns["Id"].Path, + s2.Tables["NewObjects"].Columns["NewId"].Path)); + var copyDataHint = new CopyDataHint( + "Tables/Types", + new List {new IdentityPair("Tables/Types/Columns/Id", "Tables/NewObjects/Columns/TypeId", false)}, + new List> {new Pair("Tables/Types/Columns/Data", "Tables/NewObjects/Columns/NewData")}); + + hs.Add(copyDataHint); + }, + (diff, actions) => { }); + } + + private static StorageInfo CreateSimpleStorageModel() + { + var storage = new StorageInfo("Storage"); + + // Types table + var t = new TableInfo(storage, "Types"); + var tId = new ColumnInfo(t, "Id") { + Type = new TypeInfo(typeof (int), false) + }; + var tValue = new ColumnInfo(t, "Value") { + Type = new TypeInfo(typeof (string), 1024) + }; + var tData = new ColumnInfo(t, "Data") { + Type = new TypeInfo(typeof (byte[]), 1024*1024) + }; + + var tiPk = new PrimaryIndexInfo(t, "PK_Types"); + new KeyColumnRef(tiPk, tId); + tiPk.PopulateValueColumns(); + + var tiValue = new SecondaryIndexInfo(t, "IX_Value"); + new KeyColumnRef(tiValue, tValue); + tiValue.PopulatePrimaryKeyColumns(); + + var tiFt = new FullTextIndexInfo(t, "FT_Index"); + new FullTextColumnRef(tiFt, tValue); + + // Objects table + var o = new TableInfo(storage, "Objects"); + var oId = new ColumnInfo(o, "Id") { + Type = new TypeInfo(typeof (long), false) + }; + var oTypeId = new ColumnInfo(o, "TypeId") { + Type = new TypeInfo(typeof (int), false) + }; + var oValue = new ColumnInfo(o, "Value") { + Type = new TypeInfo(typeof (string), 1024) + }; + + var oiPk = new PrimaryIndexInfo(o, "PK_Objects"); + new KeyColumnRef(oiPk, oId); + oiPk.PopulateValueColumns(); + + var oiTypeId = new SecondaryIndexInfo(o, "IX_TypeId"); + new KeyColumnRef(oiTypeId, oTypeId); + oiTypeId.PopulatePrimaryKeyColumns(); + + var oiValue = new SecondaryIndexInfo(o, "IX_Value"); + new KeyColumnRef(oiValue, oValue); + new IncludedColumnRef(oiValue, oTypeId); + oiValue.PopulatePrimaryKeyColumns(); + + var ofkTypeId = new ForeignKeyInfo(o, "FK_TypeId") { + PrimaryKey = tiPk, + }; + ofkTypeId.ForeignKeyColumns.Set(oiTypeId); + + storage.Validate(); + return storage; + } + + #region Private methods + + private static void RepopulateValueColumns(StorageInfo model, string tableName) + { + var pk = model.Tables[tableName].PrimaryIndex; + pk.ValueColumns.Clear(); + pk.PopulateValueColumns(); + } + + private static void TestUpdate(StorageInfo origin, Action mutator, Action validator) + { + // - ;) + TestUpdate(origin, mutator, validator, true); + // TestUpdate(origin, mutator, null, false); + } + + private static void TestUpdate(StorageInfo origin, Action mutator, Action validator, bool useHints) + { + var s1 = Clone(origin); + var s2 = Clone(origin); + var hints = new HintSet(s1, s2); + mutator.Invoke(s1, s2, hints); + if (!useHints) + hints = new HintSet(s1, s2); + TestLog.Info("Update test ({0} hints)", useHints ? "with" : "without"); + s1.Validate(); + s2.Validate(); + + // Comparing different models + TestLog.Info("Comparing models:"); + var comparer = new Comparer(); + var diff = comparer.Compare(s1, s2, hints); + TestLog.Info("\r\nDifference:\r\n{0}", diff); + var actions = new ActionSequence() { + new Upgrader().GetUpgradeSequence(diff, hints, comparer) + }; + TestLog.Info("\r\nActions:\r\n{0}", actions); + if (validator!=null) + validator.Invoke(diff, actions); + } + + private static StorageInfo Clone(StorageInfo server) + { + return (StorageInfo) server.Clone(null, server.Name); + // return (StorageInfo) LegacyBinarySerializer.Instance.Clone(server); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Parameters/ParametersTest.cs b/Orm/Xtensive.Orm.Tests.Core/Parameters/ParametersTest.cs index a122b1ecc3..37baad593c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Parameters/ParametersTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Parameters/ParametersTest.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2008.08.18 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Parameters -{ - [TestFixture] - public class ParametersTest - { - [Test] - public void CombinedTest() - { - var parameter = new Parameter(); - - Assert.AreEqual(null, parameter.ExpectedValue); - Assert.IsFalse(parameter.IsExpectedValueSet); - - parameter = new Parameter(1); - - Assert.AreEqual(1, parameter.ExpectedValue); - - AssertEx.Throws(delegate { - parameter.Value = 5; - }); - - var firstContext = new ParameterContext(); - - using (firstContext.Activate()) { - - AssertEx.Throws(delegate { - int i = parameter.Value; - }); - - parameter.Value = 10; - Assert.AreEqual(10, parameter.Value); - - using (ParameterContext.ExpectedValues.Activate()) { - Assert.AreEqual(1, parameter.Value); - AssertEx.ThrowsInvalidOperationException(() => parameter.Value = 1); - } - - Assert.AreEqual(10, parameter.Value); - - parameter.Value = 15; - Assert.AreEqual(15, parameter.Value); - - using (new ParameterContext().Activate()) { - Assert.AreEqual(15, parameter.Value); - - parameter.Value = 20; - Assert.AreEqual(20, parameter.Value); - - // Reactivating first context - using (firstContext.Activate()) { - Assert.AreEqual(15, parameter.Value); - parameter.Value = 25; - } - - Assert.AreEqual(20, parameter.Value); - } - - Assert.AreEqual(25, parameter.Value); - } - - AssertEx.Throws(delegate { - int i = parameter.Value; - }); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2008.08.18 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Parameters +{ + [TestFixture] + public class ParametersTest + { + [Test] + public void CombinedTest() + { + var parameter = new Parameter(); + + Assert.AreEqual(null, parameter.ExpectedValue); + Assert.IsFalse(parameter.IsExpectedValueSet); + + parameter = new Parameter(1); + + Assert.AreEqual(1, parameter.ExpectedValue); + + AssertEx.Throws(delegate { + parameter.Value = 5; + }); + + var firstContext = new ParameterContext(); + + using (firstContext.Activate()) { + + AssertEx.Throws(delegate { + int i = parameter.Value; + }); + + parameter.Value = 10; + Assert.AreEqual(10, parameter.Value); + + using (ParameterContext.ExpectedValues.Activate()) { + Assert.AreEqual(1, parameter.Value); + AssertEx.ThrowsInvalidOperationException(() => parameter.Value = 1); + } + + Assert.AreEqual(10, parameter.Value); + + parameter.Value = 15; + Assert.AreEqual(15, parameter.Value); + + using (new ParameterContext().Activate()) { + Assert.AreEqual(15, parameter.Value); + + parameter.Value = 20; + Assert.AreEqual(20, parameter.Value); + + // Reactivating first context + using (firstContext.Activate()) { + Assert.AreEqual(15, parameter.Value); + parameter.Value = 25; + } + + Assert.AreEqual(20, parameter.Value); + } + + Assert.AreEqual(25, parameter.Value); + } + + AssertEx.Throws(delegate { + int i = parameter.Value; + }); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Performance/ComparerPerformanceTest.cs b/Orm/Xtensive.Orm.Tests.Core/Performance/ComparerPerformanceTest.cs index 6d5e24adfe..fef2d0af04 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Performance/ComparerPerformanceTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Performance/ComparerPerformanceTest.cs @@ -1,198 +1,198 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.23 - -using System; -using System.Collections.Generic; -using System.Globalization; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Core; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Xtensive.Tuples; -using Xtensive.Orm.Tests; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Performance -{ - public sealed class InvariantStringComparer: IComparer - { - public int Compare(string x, string y) - { - return CultureInfo.InvariantCulture.CompareInfo.Compare(x, y, CompareOptions.None); - } - } - - [TestFixture] - public class ComparerPerformanceTest - { - public const int TwoValueTestIterations = 1000000; - public const int ArrayTestShortLength = 1000; - public const int ArrayTestShortIterations = 100; - public const int ArrayTestLongLength = 100000; - public const int ArrayTestLongIterations = 1; - - [Test] - [Explicit] - [Category("Performance")] - public void PeformanceTest() - { - Test(0.5); - } - - [Test] - [Explicit] - [Category("Profile")] - public void ProfileTest() - { -// StructTest(0.5); -// StructTest(1); - ClassTest(0.2); - } - - [Test] - [Explicit] - [Category("Performance")] - public void RegularTest() - { - Test(0.001); - } - - [Test] - public void ShortTest() - { - StructTest(0.5); - StructTest(1); - ClassTest(0.2); - } - - public void Test(double speedFactor) - { - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(1 * speedFactor); - StructTest(0.5 * speedFactor); - StructTest(0.5 * speedFactor); - ClassTest(0.2 * speedFactor); - ClassTest(0.2 * speedFactor); - } - - public void ClassTest(double speedFactor) - where T: class - { - InnerTest(speedFactor); - } - - public void StructTest(double speedFactor) - where T: struct - { - InnerTest(speedFactor); - InnerTest(speedFactor); - } - - public void InnerTest(double speedFactor) - { - TestLog.Info("Type {0}:", typeof(T).GetShortName()); - using (IndentManager.IncreaseIndent()) { - TwoValuesTest((int)(TwoValueTestIterations*speedFactor)); - ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 0); - ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 0.5); - ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 1); - ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 0); - ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 0.5); - ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 1); - } - } - - public void TwoValuesTest(int count) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - IInstanceGenerator g = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - IEnumerator sequence = InstanceGenerationUtils.GetInstances(g, r, 1).GetEnumerator(); - sequence.MoveNext(); - T o1 = sequence.Current; - sequence.MoveNext(); - T o1c = sequence.Current; - T o2 = g.GetInstance(r); - AdvancedComparerStruct c1 = AdvancedComparer.System; - AdvancedComparerStruct c2 = AdvancedComparer.Default; - if (!TestInfo.IsProfileTestRunning) - SimpleComparisonLoop(c1, o1, o2, 1000); - SimpleComparisonLoop(c2, o1, o2, 1000); - TestLog.Info("Values comparison:"); - TestLog.Info(" Type: {0}, instances: {1} x 2, {2}", typeof(T).GetShortName(), o1, o2); - using (IndentManager.IncreaseIndent()) { - TestHelper.CollectGarbage(); - if (!TestInfo.IsProfileTestRunning) { - using (new Measurement("Default comparer (equal) ", MeasurementOptions.Log, count)) - SimpleComparisonLoop(c1, o1, o1c, count); - TestHelper.CollectGarbage(); - using (new Measurement("Default comparer (different)", MeasurementOptions.Log, count)) - SimpleComparisonLoop(c1, o1, o2, count); - TestHelper.CollectGarbage(); - } - using (new Measurement("Xtensive comparer (equal) ", MeasurementOptions.Log, count)) - SimpleComparisonLoop(c2, o1, o1c, count); - using (new Measurement("Xtensive comparer (different)", MeasurementOptions.Log, count)) - SimpleComparisonLoop(c2, o1, o2, count); - TestHelper.CollectGarbage(); - } - } - - public void ArrayTest(int length, int count, double equalityProbability) - { - Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - IInstanceGenerator g = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - IEnumerator sequence = InstanceGenerationUtils.GetInstances(g, r, equalityProbability).GetEnumerator(); - sequence.MoveNext(); - T[] array = new T[length]; - for (int i = 0; i c1 = AdvancedComparer.System; - AdvancedComparerStruct c2 = AdvancedComparer.Default; - if (!TestInfo.IsProfileTestRunning) - ArrayComparisonLoop(c1, array, 1); - ArrayComparisonLoop(c2, array, 1); - TestLog.Info("Array comparison (equality probability = {0}):", (int)(equalityProbability*100)); - TestLog.Info(" Type: {0}, array length: {1}", typeof(T).GetShortName(), length); - using (IndentManager.IncreaseIndent()) { - TestHelper.CollectGarbage(); - if (!TestInfo.IsProfileTestRunning) { - using (new Measurement("Default comparer", MeasurementOptions.Log, (length - 1) * count)) - ArrayComparisonLoop(c1, array, count); - TestHelper.CollectGarbage(); - } - using (new Measurement("Xtensive comparer", MeasurementOptions.Log, (length-1)*count)) - ArrayComparisonLoop(c2, array, count); - TestHelper.CollectGarbage(); - } - } - - private static void SimpleComparisonLoop(AdvancedComparerStruct c, T o1, T o2, int count) - { - for (int i = 0; i(AdvancedComparerStruct c, T[] array, int count) - { - int length = array.Length; - for (int j = 0; j + { + public int Compare(string x, string y) + { + return CultureInfo.InvariantCulture.CompareInfo.Compare(x, y, CompareOptions.None); + } + } + + [TestFixture] + public class ComparerPerformanceTest + { + public const int TwoValueTestIterations = 1000000; + public const int ArrayTestShortLength = 1000; + public const int ArrayTestShortIterations = 100; + public const int ArrayTestLongLength = 100000; + public const int ArrayTestLongIterations = 1; + + [Test] + [Explicit] + [Category("Performance")] + public void PeformanceTest() + { + Test(0.5); + } + + [Test] + [Explicit] + [Category("Profile")] + public void ProfileTest() + { +// StructTest(0.5); +// StructTest(1); + ClassTest(0.2); + } + + [Test] + [Explicit] + [Category("Performance")] + public void RegularTest() + { + Test(0.001); + } + + [Test] + public void ShortTest() + { + StructTest(0.5); + StructTest(1); + ClassTest(0.2); + } + + public void Test(double speedFactor) + { + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(1 * speedFactor); + StructTest(0.5 * speedFactor); + StructTest(0.5 * speedFactor); + ClassTest(0.2 * speedFactor); + ClassTest(0.2 * speedFactor); + } + + public void ClassTest(double speedFactor) + where T: class + { + InnerTest(speedFactor); + } + + public void StructTest(double speedFactor) + where T: struct + { + InnerTest(speedFactor); + InnerTest(speedFactor); + } + + public void InnerTest(double speedFactor) + { + TestLog.Info("Type {0}:", typeof(T).GetShortName()); + using (IndentManager.IncreaseIndent()) { + TwoValuesTest((int)(TwoValueTestIterations*speedFactor)); + ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 0); + ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 0.5); + ArrayTest((int)(ArrayTestShortLength*speedFactor), ArrayTestShortIterations, 1); + ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 0); + ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 0.5); + ArrayTest((int)(ArrayTestLongLength*speedFactor), ArrayTestLongIterations, 1); + } + } + + public void TwoValuesTest(int count) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + IInstanceGenerator g = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + IEnumerator sequence = InstanceGenerationUtils.GetInstances(g, r, 1).GetEnumerator(); + sequence.MoveNext(); + T o1 = sequence.Current; + sequence.MoveNext(); + T o1c = sequence.Current; + T o2 = g.GetInstance(r); + AdvancedComparerStruct c1 = AdvancedComparer.System; + AdvancedComparerStruct c2 = AdvancedComparer.Default; + if (!TestInfo.IsProfileTestRunning) + SimpleComparisonLoop(c1, o1, o2, 1000); + SimpleComparisonLoop(c2, o1, o2, 1000); + TestLog.Info("Values comparison:"); + TestLog.Info(" Type: {0}, instances: {1} x 2, {2}", typeof(T).GetShortName(), o1, o2); + using (IndentManager.IncreaseIndent()) { + TestHelper.CollectGarbage(); + if (!TestInfo.IsProfileTestRunning) { + using (new Measurement("Default comparer (equal) ", MeasurementOptions.Log, count)) + SimpleComparisonLoop(c1, o1, o1c, count); + TestHelper.CollectGarbage(); + using (new Measurement("Default comparer (different)", MeasurementOptions.Log, count)) + SimpleComparisonLoop(c1, o1, o2, count); + TestHelper.CollectGarbage(); + } + using (new Measurement("Xtensive comparer (equal) ", MeasurementOptions.Log, count)) + SimpleComparisonLoop(c2, o1, o1c, count); + using (new Measurement("Xtensive comparer (different)", MeasurementOptions.Log, count)) + SimpleComparisonLoop(c2, o1, o2, count); + TestHelper.CollectGarbage(); + } + } + + public void ArrayTest(int length, int count, double equalityProbability) + { + Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + IInstanceGenerator g = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + IEnumerator sequence = InstanceGenerationUtils.GetInstances(g, r, equalityProbability).GetEnumerator(); + sequence.MoveNext(); + T[] array = new T[length]; + for (int i = 0; i c1 = AdvancedComparer.System; + AdvancedComparerStruct c2 = AdvancedComparer.Default; + if (!TestInfo.IsProfileTestRunning) + ArrayComparisonLoop(c1, array, 1); + ArrayComparisonLoop(c2, array, 1); + TestLog.Info("Array comparison (equality probability = {0}):", (int)(equalityProbability*100)); + TestLog.Info(" Type: {0}, array length: {1}", typeof(T).GetShortName(), length); + using (IndentManager.IncreaseIndent()) { + TestHelper.CollectGarbage(); + if (!TestInfo.IsProfileTestRunning) { + using (new Measurement("Default comparer", MeasurementOptions.Log, (length - 1) * count)) + ArrayComparisonLoop(c1, array, count); + TestHelper.CollectGarbage(); + } + using (new Measurement("Xtensive comparer", MeasurementOptions.Log, (length-1)*count)) + ArrayComparisonLoop(c2, array, count); + TestHelper.CollectGarbage(); + } + } + + private static void SimpleComparisonLoop(AdvancedComparerStruct c, T o1, T o2, int count) + { + for (int i = 0; i(AdvancedComparerStruct c, T[] array, int count) + { + int length = array.Length; + for (int j = 0; j b.GetProperty("StrangeProperty", BindingFlags.Instance | BindingFlags.Public) - .GetSetMethod(true) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Base.StrangeProperty"); - - ValidateIds(() => d.GetProperty("NewProperty", BindingFlags.Instance | BindingFlags.NonPublic) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Derived.NewProperty"); - - ValidateIds(() => b.GetProperty("NewProperty", BindingFlags.Instance | BindingFlags.NonPublic) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Base.NewProperty"); - - ValidateId(() => b.GetAttribute(AttributeSearchOptions.InheritAll), - "Base"); - ValidateId(() => l.GetAttribute(AttributeSearchOptions.InheritNone), - "Last"); - - ValidateIds(() => l.GetAttributes(AttributeSearchOptions.InheritAll), - "Last, Derived, Base"); - ValidateIds(() => d.GetAttributes(AttributeSearchOptions.InheritAll), - "Derived, Base"); - - ValidateIds(() => l.GetProperty("Property").GetGetMethod() - .GetAttributes(AttributeSearchOptions.InheritAll), - "Last.Property, Derived.get_Property, Base.get_Property"); - - ValidateIds(() => l.GetMethod("Method", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Last.Method(object), Base.Method(object)"); - - ValidateIds(() => d.GetMethod("Method", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Derived.Method(string)"); - - ValidateIds(() => (i.GetProperty("Property").GetImplementation(l) as PropertyInfo).GetGetMethod(true) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Last.IBase.get_Property, IBase.get_Property"); - - ValidateIds(() => i.GetMethod("IMethod").GetImplementation(d) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Base.IMethod(), IBase.IMethod()"); - - ValidateIds(() => i.GetMethod("IMethod").GetImplementation(l) - .GetAttributes(AttributeSearchOptions.InheritAll), - "Last.IMethod(), Base.IMethod(), IBase.IMethod()"); - } - - private static void ValidateId(Expression> getAttribute, string expected) - { - TestLog.Info("Trying: {0}", getAttribute.ToString(true)); - var attribute = getAttribute.Compile().Invoke(); - TestLog.Info(" Expect: {0}", expected); - TestLog.Info(" Actual: {0}", attribute.Value); - Assert.AreEqual(expected, attribute.Value); - } - - private static void ValidateIds(Expression>> getAttributes, string expected) - { - TestLog.Info("Trying: {0}", getAttributes.ToString(true)); - var attributes = getAttributes.Compile().Invoke(); - var actual = attributes.Select(a => a.Value).ToCommaDelimitedString(); - TestLog.Info(" Expect: {0}", expected); - TestLog.Info(" Actual: {0}", actual); - Assert.AreEqual(expected, actual); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.06 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Core.Reflection +{ + [TestFixture] + public class AttributeHelperTest + { + [AttributeUsage(AttributeTargets.All)] + public class IdAttribute: Attribute + { + public string Value { get; set; } + + public IdAttribute(string value) + { + Value = value; + } + } + + [Id("IBase")] + interface IBase + { + [Id("IBase.Property")] + int Property + { + [Id("IBase.get_Property")] + get; + [Id("IBase.set_Property")] + set; + } + + [Id("IBase.IMethod()")] + void IMethod(); + } + + [Id("Base")] + class Base : IBase + { + [Id("Base.Property")] + public virtual int Property { + [Id("Base.get_Property")] + get; + [Id("Base.set_Property")] + private set; } + + [Id("Base.IBase.Property")] + int IBase.Property + { + [Id("Base.IBase.get_Property")] + get { return Property; } + [Id("Base.IBase.set_Property")] + set { Property = value; } + } + + [Id("Base.NewProperty")] + int NewProperty { get; set; } + + [Id("Base.StrangeProperty")] + public int StrangeProperty { get; internal set; } + + [Id("Base.Method(object)")] + protected virtual void Method(object o) + { + } + + [Id("Base.IMethod()")] + public virtual void IMethod() + { + } + } + + [Id("Derived")] + class Derived : Base + { + [Id("Derived.Property")] + public override int Property { + [Id("Derived.get_Property")] + get { + return base.Property; + } + } + + [Id("Derived.NewProperty")] + int NewProperty { get; set; } + + [Id("Derived.Method(string)")] + protected virtual void Method(string s) + { + } + } + + [Id("Last")] + class Last : Derived, + IBase + { + [Id("Last.Property")] + public override int Property { + get { + return base.Property; + } + } + + [Id("Last.IBase.Property")] + int IBase.Property { + [Id("Last.IBase.get_Property")] + get { return Property; } + [Id("Last.IBase.set_Property")] + set { return; } + } + + [Id("Last.Method(object)")] + protected override void Method(object o) + { + } + + [Id("Last.IMethod()")] + public override void IMethod() + { + } + } + + [Test] + public void DebugTest() + { + Type i = typeof (IBase); + Type b = typeof (Base); + Type d = typeof (Derived); + Type l = typeof (Last); + + TestLog.Info("{0}", i.GetProperty("Property").GetImplementation(b)); + } + + [Test] + public void CombinedTest() + { + Type i = typeof (IBase); + Type b = typeof (Base); + Type d = typeof (Derived); + Type l = typeof (Last); + + ValidateIds(() => b.GetProperty("StrangeProperty", BindingFlags.Instance | BindingFlags.Public) + .GetSetMethod(true) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Base.StrangeProperty"); + + ValidateIds(() => d.GetProperty("NewProperty", BindingFlags.Instance | BindingFlags.NonPublic) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Derived.NewProperty"); + + ValidateIds(() => b.GetProperty("NewProperty", BindingFlags.Instance | BindingFlags.NonPublic) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Base.NewProperty"); + + ValidateId(() => b.GetAttribute(AttributeSearchOptions.InheritAll), + "Base"); + ValidateId(() => l.GetAttribute(AttributeSearchOptions.InheritNone), + "Last"); + + ValidateIds(() => l.GetAttributes(AttributeSearchOptions.InheritAll), + "Last, Derived, Base"); + ValidateIds(() => d.GetAttributes(AttributeSearchOptions.InheritAll), + "Derived, Base"); + + ValidateIds(() => l.GetProperty("Property").GetGetMethod() + .GetAttributes(AttributeSearchOptions.InheritAll), + "Last.Property, Derived.get_Property, Base.get_Property"); + + ValidateIds(() => l.GetMethod("Method", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Last.Method(object), Base.Method(object)"); + + ValidateIds(() => d.GetMethod("Method", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Derived.Method(string)"); + + ValidateIds(() => (i.GetProperty("Property").GetImplementation(l) as PropertyInfo).GetGetMethod(true) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Last.IBase.get_Property, IBase.get_Property"); + + ValidateIds(() => i.GetMethod("IMethod").GetImplementation(d) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Base.IMethod(), IBase.IMethod()"); + + ValidateIds(() => i.GetMethod("IMethod").GetImplementation(l) + .GetAttributes(AttributeSearchOptions.InheritAll), + "Last.IMethod(), Base.IMethod(), IBase.IMethod()"); + } + + private static void ValidateId(Expression> getAttribute, string expected) + { + TestLog.Info("Trying: {0}", getAttribute.ToString(true)); + var attribute = getAttribute.Compile().Invoke(); + TestLog.Info(" Expect: {0}", expected); + TestLog.Info(" Actual: {0}", attribute.Value); + Assert.AreEqual(expected, attribute.Value); + } + + private static void ValidateIds(Expression>> getAttributes, string expected) + { + TestLog.Info("Trying: {0}", getAttributes.ToString(true)); + var attributes = getAttributes.Compile().Invoke(); + var actual = attributes.Select(a => a.Value).ToCommaDelimitedString(); + TestLog.Info(" Expect: {0}", expected); + TestLog.Info(" Actual: {0}", actual); + Assert.AreEqual(expected, actual); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Reflection/DelegateHelperCreateDelegateTest.cs b/Orm/Xtensive.Orm.Tests.Core/Reflection/DelegateHelperCreateDelegateTest.cs index fe43798508..596505b3e4 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Reflection/DelegateHelperCreateDelegateTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Reflection/DelegateHelperCreateDelegateTest.cs @@ -1,164 +1,164 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.02.09 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Reflection -{ - internal struct ExecutionData - { - public int CallCount; - public IList CalledForTypes; - - public static ExecutionData Create() - { - ExecutionData result = default(ExecutionData); - result.CalledForTypes = new List(); - return result; - } - } - - [TestFixture] - public class DelegateHelperCreateDelegateTest - { - public int passCount = 1000; - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - passCount *= 10000; - try { - RegularTest(); - } - finally { - passCount /= 10000; - } - } - - [Test] - public void RegularTest() - { - TestTypes(new Type[] {}); - TestTypes(new Type[] { - typeof(bool), - }); - TestTypes(new Type[] { - typeof(string), - }); - TestTypes(new Type[] { - typeof(int), - typeof(int?), - }); - TestTypes(new Type[] { - typeof(long), - typeof(Guid), - typeof(string), - typeof(int), - typeof(int), - }); - } - - private void TestTypes(Type[] types) - { - TupleDescriptor descriptor = TupleDescriptor.Create(types); - TestLog.Info("Testing sequence {0}:", descriptor); - using (IndentManager.IncreaseIndent()) { - // Logic test - LogicTest(types, this, GetType(), "SequenceAStep"); - LogicTest(types, null, GetType(), "SequenceAStaticStep"); - - // Performance tests - ExecutionData data = ExecutionData.Create(); - ExecutionSequenceHandler[] delegates; - - int count = passCount / 1000; - delegates = DelegateHelper.CreateDelegates>( - this, GetType(), "SequenceBStep", types); - TestHelper.CollectGarbage(); - using (new Measurement("Creating delegates", count)) - for (int i = 0; i>( - this, GetType(), "SequenceBStep", types); - - count = passCount; - DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive); - data = ExecutionData.Create(); - TestHelper.CollectGarbage(); - using (new Measurement("Executing delegates", count)) - for (int i = 0; i[] delegates = - DelegateHelper.CreateDelegates>( - callTarget, type, methodName, types); - - Assert.AreEqual(types.Length, delegates.Length); - for (int i = 0; i d = - DelegateHelper.CreateDelegate>( - callTarget, type, methodName, types[i]); - Assert.AreSame(d.Target, delegates[i].Target); - Assert.AreSame(d.Method, delegates[i].Method); - } - - ExecutionData data = ExecutionData.Create(); - DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive); - Assert.IsTrue(AdvancedComparer>.Default.Equals(types, data.CalledForTypes)); - - data = ExecutionData.Create(); - DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Negative); - Assert.IsTrue(AdvancedComparer>.Default.Equals(types, Reverse(data.CalledForTypes))); - } - - public static IEnumerable Reverse(IList list) - { - ArgumentValidator.EnsureArgumentNotNull(list, "list"); - for (int i = list.Count-1; i>=0; i--) - yield return list[i]; - } - - private bool SequenceAStep(ref ExecutionData data, int index) - { - data.CalledForTypes.Add(typeof(T)); - return false; - } - - private static bool SequenceAStaticStep(ref ExecutionData data, int index) - { - data.CalledForTypes.Add(typeof(T)); - return false; - } - - private bool SequenceBStep(ref ExecutionData data, int index) - { - data.CallCount++; - return false; - } - - bool Execute(ref ExecutionData actionData, int fieldIndex) - { - actionData.CallCount++; - return false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.02.09 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Logging; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Reflection +{ + internal struct ExecutionData + { + public int CallCount; + public IList CalledForTypes; + + public static ExecutionData Create() + { + ExecutionData result = default(ExecutionData); + result.CalledForTypes = new List(); + return result; + } + } + + [TestFixture] + public class DelegateHelperCreateDelegateTest + { + public int passCount = 1000; + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + passCount *= 10000; + try { + RegularTest(); + } + finally { + passCount /= 10000; + } + } + + [Test] + public void RegularTest() + { + TestTypes(new Type[] {}); + TestTypes(new Type[] { + typeof(bool), + }); + TestTypes(new Type[] { + typeof(string), + }); + TestTypes(new Type[] { + typeof(int), + typeof(int?), + }); + TestTypes(new Type[] { + typeof(long), + typeof(Guid), + typeof(string), + typeof(int), + typeof(int), + }); + } + + private void TestTypes(Type[] types) + { + TupleDescriptor descriptor = TupleDescriptor.Create(types); + TestLog.Info("Testing sequence {0}:", descriptor); + using (IndentManager.IncreaseIndent()) { + // Logic test + LogicTest(types, this, GetType(), "SequenceAStep"); + LogicTest(types, null, GetType(), "SequenceAStaticStep"); + + // Performance tests + ExecutionData data = ExecutionData.Create(); + ExecutionSequenceHandler[] delegates; + + int count = passCount / 1000; + delegates = DelegateHelper.CreateDelegates>( + this, GetType(), "SequenceBStep", types); + TestHelper.CollectGarbage(); + using (new Measurement("Creating delegates", count)) + for (int i = 0; i>( + this, GetType(), "SequenceBStep", types); + + count = passCount; + DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive); + data = ExecutionData.Create(); + TestHelper.CollectGarbage(); + using (new Measurement("Executing delegates", count)) + for (int i = 0; i[] delegates = + DelegateHelper.CreateDelegates>( + callTarget, type, methodName, types); + + Assert.AreEqual(types.Length, delegates.Length); + for (int i = 0; i d = + DelegateHelper.CreateDelegate>( + callTarget, type, methodName, types[i]); + Assert.AreSame(d.Target, delegates[i].Target); + Assert.AreSame(d.Method, delegates[i].Method); + } + + ExecutionData data = ExecutionData.Create(); + DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive); + Assert.IsTrue(AdvancedComparer>.Default.Equals(types, data.CalledForTypes)); + + data = ExecutionData.Create(); + DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Negative); + Assert.IsTrue(AdvancedComparer>.Default.Equals(types, Reverse(data.CalledForTypes))); + } + + public static IEnumerable Reverse(IList list) + { + ArgumentValidator.EnsureArgumentNotNull(list, "list"); + for (int i = list.Count-1; i>=0; i--) + yield return list[i]; + } + + private bool SequenceAStep(ref ExecutionData data, int index) + { + data.CalledForTypes.Add(typeof(T)); + return false; + } + + private static bool SequenceAStaticStep(ref ExecutionData data, int index) + { + data.CalledForTypes.Add(typeof(T)); + return false; + } + + private bool SequenceBStep(ref ExecutionData data, int index) + { + data.CallCount++; + return false; + } + + bool Execute(ref ExecutionData actionData, int fieldIndex) + { + actionData.CallCount++; + return false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTest.cs b/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTest.cs index 676caaf8c9..0efe2ec3b5 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTest.cs @@ -1,484 +1,484 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.12.17 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Reflection -{ - [TestFixture] - public class TypeHelperTest - { - string[] associateSuffix = new string[]{"Associate"}; - string[] testHandlerSuffix = new string[]{"TestHandler"}; - private Pair[] locations = new Pair[] {}; - private Type foundFor; - object o; - - [Test] - public void DirectAssociateTest() - { - // Checking class A associates - o = TypeHelper.CreateAssociate(typeof (A), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate(typeof (AI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (AIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (AIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - } - - [Test] - public void InheritedAssociateTest1() - { - // Checking class B associates - o = TypeHelper.CreateAssociate(typeof (BA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate(typeof (BI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (BIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (BIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - } - - [Test] - public void InheritedAssociateTest2() - { - // Checking class C associates - o = TypeHelper.CreateAssociate(typeof (CB), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate(typeof (CBI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (CBIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (CBIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - } - - [Test] - public void InheritedAssociateTest3() - { - // Checking class D associates - o = TypeHelper.CreateAssociate(typeof (DA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate(typeof (DAI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (DAIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (DAIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - } - - [Test] - public void OverridenAssociateTest() - { - // Checking class E associates - o = TypeHelper.CreateAssociate(typeof (EA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate(typeof (EAI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (EAIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>(typeof (EAIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - } - - [Test] - public void MultipleMatchAssociateTest() - { - // Checking multiple match associates - try { - TypeHelper.CreateAssociate( - typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - try { - TypeHelper.CreateAssociate( - typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - - o = TypeHelper.CreateAssociate( - typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>( - typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - - try { - TypeHelper.CreateAssociate( - typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - try { - TypeHelper.CreateAssociate( - typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - - o = TypeHelper.CreateAssociate( - typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>( - typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - - try { - TypeHelper.CreateAssociate( - typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - try { - TypeHelper.CreateAssociate( - typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - - o = TypeHelper.CreateAssociate( - typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - o = TypeHelper.CreateAssociate>( - typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); - Assert.IsNotNull(o); - - try { - TypeHelper.CreateAssociate(typeof(SomeCloneableEnumerable), out foundFor, testHandlerSuffix, null, locations); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - o = TypeHelper.CreateAssociate(typeof(SomeCloneableEnumerable), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - - try { - TypeHelper.CreateAssociate(typeof(string), out foundFor, testHandlerSuffix, null, locations); - Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); - } - catch (InvalidOperationException) { - } - } - - [Test] - public void SystemTypeAssociateTest() - { - // System type associates tests - o = TypeHelper.CreateAssociate>(typeof(int), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - - o = TypeHelper.CreateAssociate>(typeof(long), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - - o = TypeHelper.CreateAssociate(typeof(BitVector32), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate>>(typeof(string), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); - } - - [Test] - public void ArrayAssociateTest() - { - // Array associates tests - o = TypeHelper.CreateAssociate>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(ArrayTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate>(typeof(int[,]), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(Array2DTestHandler), o.GetType()); - } - - [Test] - public void EnumerableAssociateTest() - { - // Enumerable associates tests - o = TypeHelper.CreateAssociate>>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate(typeof(List), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate(typeof(SomeEnumerable), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); - } - - [Test] - public void GenericAssociateTest() - { - // Generic associates tests - o = TypeHelper.CreateAssociate>(typeof(double), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); - - o = TypeHelper.CreateAssociate>(typeof(object), out foundFor, testHandlerSuffix, null, locations); - Assert.IsNotNull(o); - Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); - } - - [Test] - public void CreateDummyTypeTest() - { - Type t1 = TypeHelper.CreateDummyType("Test1", typeof(object), false); - Assert.IsNotNull(t1); - AssertEx.IsPatternMatch(t1.Name, "Test1*"); - TestLog.Info("t1 name: {0}", t1.GetFullName()); - - Type t2 = TypeHelper.CreateDummyType("Test2", typeof(object), false); - Assert.IsNotNull(t2); - AssertEx.IsPatternMatch(t2.Name, "Test2*"); - TestLog.Info("t2 name: {0}", t2.GetFullName()); - - Assert.AreNotEqual(t1, t2); - - Type listType = typeof (List<>); - IList list = (IList)TypeHelper.Activate(listType.Assembly, listType.FullName, new Type[] {t1}, null); - TestLog.Info("List name: {0}", list.GetType().GetFullName()); - } - - #region Nested types - public class TestClass - { - public string value; - - public TestClass() - { - value = "Default Constructor"; - } - - public TestClass(string value) - { - this.value = value; - } - - public TestClass(int intValue, string stringValue) - { - value = intValue.ToString() + stringValue; - } - - private static TestClass ttttt(int intValue, string stringValue) - { - return new TestClass(intValue, stringValue); - - } - } - #endregion - - [Test] - public void CreateDummyTypeConstructorTest() - { - Type type = TypeHelper.CreateDummyType("Test2", typeof(TestClass), true); - var defaultConstructorInstance = (TestClass)type.Activate(null); - Assert.AreEqual(defaultConstructorInstance.value, "Default Constructor"); - var customConstructorInstance1 = (TestClass)type.Activate(null, "Custom constructor"); - Assert.AreEqual(customConstructorInstance1.value, "Custom constructor"); - var customConstructorInstance2 = (TestClass)type.Activate(null, 11, "test"); - Assert.AreEqual(customConstructorInstance2.value, "11test"); - var methods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static); - Assert.AreEqual(3, methods.Length); - var ctor1 = (TestClass)methods[0].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[0], null); - var ctor2 = (TestClass)methods[1].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[] { "Custom constructor" }, null); - var ctor3 =(TestClass) methods[2].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[] { 11, "test" }, null); - Assert.AreEqual(ctor1.value, defaultConstructorInstance.value); - Assert.AreEqual(ctor2.value, customConstructorInstance1.value); - Assert.AreEqual(ctor3.value, customConstructorInstance2.value); - } - - [Test] - public void GetNameAndAddSuffixTest() - { - Type t = typeof (A<,>); - string fName = t.GetFullName(); - Assert.AreEqual(t.Namespace + ".A<,>", fName); - string sName = t.GetShortName(); - Assert.AreEqual("A<,>", sName); - string wsName = TypeHelper.AddSuffix(fName, "#"); - Assert.AreEqual(t.Namespace + ".A#<,>", wsName); - fName = t.FullName; - wsName = TypeHelper.AddSuffix(fName, "#"); - Assert.AreEqual(t.Namespace + ".A#`2", wsName); - - t = typeof (A); - fName = t.GetFullName(); - Assert.AreEqual(t.Namespace + ".A", fName); - sName = t.GetShortName(); - Assert.AreEqual("A", sName); - wsName = TypeHelper.AddSuffix(fName, "#"); - Assert.AreEqual(t.Namespace + ".A#", wsName); - fName = t.FullName; - wsName = TypeHelper.AddSuffix(fName, "#"); - AssertEx.IsPatternMatch(wsName, t.Namespace + ".A#`2[[*]]"); - - t = typeof (A.B); - fName = t.GetFullName(); - Assert.AreEqual(t.Namespace + ".A+B", fName); - sName = t.GetShortName(); - Assert.AreEqual("A+B", sName); - - t = t.GetGenericTypeDefinition().GetGenericArguments()[2]; - fName = t.GetFullName(); - Assert.AreEqual("T3", fName); - sName = t.GetShortName(); - Assert.AreEqual("T3", sName); - } - - [Test] - public void ActivateTest() - { - o = TypeHelper.Activate(GetType().Assembly, typeof (A).FullName, null, 1, "2"); - Assert.IsNotNull(o); - A a = o as A; - Assert.IsNotNull(a); - Assert.AreEqual(1, a.F1); - Assert.AreEqual("2", a.F2); - - o = TypeHelper.Activate(GetType().Assembly, typeof (A<,>).FullName, - new Type[] {typeof(int), typeof(string)}, 1, "2"); - Assert.IsNotNull(o); - a = o as A; - Assert.IsNotNull(a); - Assert.AreEqual(1, a.F1); - Assert.AreEqual("2", a.F2); - } - - [Test] - public void IsNumericTest() - { - var numericTypes = new[] { - typeof (byte), - typeof (byte?), - typeof (sbyte), - typeof (sbyte?), - typeof (short), - typeof (short?), - typeof (ushort), - typeof (ushort?), - typeof (int), - typeof (int?), - typeof (uint), - typeof (uint?), - typeof (long), - typeof (long?), - typeof (ulong), - typeof (ulong?), - typeof (float), - typeof (float?), - typeof (double), - typeof (double?), - typeof (decimal), - typeof (decimal?) - }; - - var nonNumericTypes = new[] { - typeof (string), - typeof (char), - typeof (char?), - typeof (bool), - typeof (bool?), - typeof (DateTime), - typeof (DateTime?), - typeof (TimeSpan), - typeof (TimeSpan?), - typeof (Guid), - typeof (Guid?), - typeof (TypeCode), - typeof (TypeCode?), - typeof (byte[]), - typeof (Key), - this.GetType(), - }; - - foreach (var numericType in numericTypes) { - Assert.IsTrue(numericType.IsNumericType()); - } - - foreach (var nonNumericType in nonNumericTypes) { - Assert.IsFalse(nonNumericType.IsNumericType()); - } - } - - [Test] - public void IsNullableTest() - { - var nullableTypes = new[] { - typeof (Nullable<>), - typeof (byte?), - typeof (sbyte?), - typeof (short?), - typeof (ushort?), - typeof (int?), - typeof (uint?), - typeof (long?), - typeof (ulong?), - typeof (float?), - typeof (double?), - typeof (decimal?), - typeof (Guid?) - }; - - var nonNullableTypes = new[] { - typeof (string), - typeof (char), - typeof (bool), - typeof (DateTime), - typeof (TimeSpan), - typeof (Guid), - typeof (TypeCode), - typeof (byte[]), - typeof (Key), - this.GetType() - }; - - foreach (var type in nullableTypes) { - Assert.IsTrue(type.IsNullable()); - } - - foreach (var type in nonNullableTypes) { - Assert.IsFalse(type.IsNullable()); - } - } - - [Test] - public void GenericIsNullableTest() - { - Assert.IsTrue(TypeHelper.IsNullable()); - Assert.IsTrue(TypeHelper.IsNullable()); - - Assert.IsFalse(TypeHelper.IsNullable()); - Assert.IsFalse(TypeHelper.IsNullable()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.12.17 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Reflection +{ + [TestFixture] + public class TypeHelperTest + { + string[] associateSuffix = new string[]{"Associate"}; + string[] testHandlerSuffix = new string[]{"TestHandler"}; + private Pair[] locations = new Pair[] {}; + private Type foundFor; + object o; + + [Test] + public void DirectAssociateTest() + { + // Checking class A associates + o = TypeHelper.CreateAssociate(typeof (A), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate(typeof (AI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (AIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (AIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + } + + [Test] + public void InheritedAssociateTest1() + { + // Checking class B associates + o = TypeHelper.CreateAssociate(typeof (BA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate(typeof (BI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (BIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (BIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + } + + [Test] + public void InheritedAssociateTest2() + { + // Checking class C associates + o = TypeHelper.CreateAssociate(typeof (CB), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate(typeof (CBI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (CBIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (CBIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + } + + [Test] + public void InheritedAssociateTest3() + { + // Checking class D associates + o = TypeHelper.CreateAssociate(typeof (DA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate(typeof (DAI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (DAIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (DAIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + } + + [Test] + public void OverridenAssociateTest() + { + // Checking class E associates + o = TypeHelper.CreateAssociate(typeof (EA), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate(typeof (EAI), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (EAIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>(typeof (EAIT2), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + } + + [Test] + public void MultipleMatchAssociateTest() + { + // Checking multiple match associates + try { + TypeHelper.CreateAssociate( + typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + try { + TypeHelper.CreateAssociate( + typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + + o = TypeHelper.CreateAssociate( + typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>( + typeof (FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + + try { + TypeHelper.CreateAssociate( + typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + try { + TypeHelper.CreateAssociate( + typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + + o = TypeHelper.CreateAssociate( + typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>( + typeof (GFIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + + try { + TypeHelper.CreateAssociate( + typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + try { + TypeHelper.CreateAssociate( + typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + + o = TypeHelper.CreateAssociate( + typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + o = TypeHelper.CreateAssociate>( + typeof (GIT2FIIT), out foundFor, associateSuffix, ArrayUtils.EmptyArray); + Assert.IsNotNull(o); + + try { + TypeHelper.CreateAssociate(typeof(SomeCloneableEnumerable), out foundFor, testHandlerSuffix, null, locations); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + o = TypeHelper.CreateAssociate(typeof(SomeCloneableEnumerable), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + + try { + TypeHelper.CreateAssociate(typeof(string), out foundFor, testHandlerSuffix, null, locations); + Assert.Fail("{0} expected.", typeof (InvalidOperationException).Name); + } + catch (InvalidOperationException) { + } + } + + [Test] + public void SystemTypeAssociateTest() + { + // System type associates tests + o = TypeHelper.CreateAssociate>(typeof(int), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + + o = TypeHelper.CreateAssociate>(typeof(long), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + + o = TypeHelper.CreateAssociate(typeof(BitVector32), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate>>(typeof(string), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); + } + + [Test] + public void ArrayAssociateTest() + { + // Array associates tests + o = TypeHelper.CreateAssociate>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(ArrayTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate>(typeof(int[,]), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(Array2DTestHandler), o.GetType()); + } + + [Test] + public void EnumerableAssociateTest() + { + // Enumerable associates tests + o = TypeHelper.CreateAssociate>>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate>(typeof(int[]), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate(typeof(List), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate(typeof(SomeEnumerable), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(EnumerableInterfaceTestHandler), o.GetType()); + } + + [Test] + public void GenericAssociateTest() + { + // Generic associates tests + o = TypeHelper.CreateAssociate>(typeof(double), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); + + o = TypeHelper.CreateAssociate>(typeof(object), out foundFor, testHandlerSuffix, null, locations); + Assert.IsNotNull(o); + Assert.AreEqual(typeof(ObjectTestHandler), o.GetType()); + } + + [Test] + public void CreateDummyTypeTest() + { + Type t1 = TypeHelper.CreateDummyType("Test1", typeof(object), false); + Assert.IsNotNull(t1); + AssertEx.IsPatternMatch(t1.Name, "Test1*"); + TestLog.Info("t1 name: {0}", t1.GetFullName()); + + Type t2 = TypeHelper.CreateDummyType("Test2", typeof(object), false); + Assert.IsNotNull(t2); + AssertEx.IsPatternMatch(t2.Name, "Test2*"); + TestLog.Info("t2 name: {0}", t2.GetFullName()); + + Assert.AreNotEqual(t1, t2); + + Type listType = typeof (List<>); + IList list = (IList)TypeHelper.Activate(listType.Assembly, listType.FullName, new Type[] {t1}, null); + TestLog.Info("List name: {0}", list.GetType().GetFullName()); + } + + #region Nested types + public class TestClass + { + public string value; + + public TestClass() + { + value = "Default Constructor"; + } + + public TestClass(string value) + { + this.value = value; + } + + public TestClass(int intValue, string stringValue) + { + value = intValue.ToString() + stringValue; + } + + private static TestClass ttttt(int intValue, string stringValue) + { + return new TestClass(intValue, stringValue); + + } + } + #endregion + + [Test] + public void CreateDummyTypeConstructorTest() + { + Type type = TypeHelper.CreateDummyType("Test2", typeof(TestClass), true); + var defaultConstructorInstance = (TestClass)type.Activate(null); + Assert.AreEqual(defaultConstructorInstance.value, "Default Constructor"); + var customConstructorInstance1 = (TestClass)type.Activate(null, "Custom constructor"); + Assert.AreEqual(customConstructorInstance1.value, "Custom constructor"); + var customConstructorInstance2 = (TestClass)type.Activate(null, 11, "test"); + Assert.AreEqual(customConstructorInstance2.value, "11test"); + var methods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static); + Assert.AreEqual(3, methods.Length); + var ctor1 = (TestClass)methods[0].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[0], null); + var ctor2 = (TestClass)methods[1].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[] { "Custom constructor" }, null); + var ctor3 =(TestClass) methods[2].Invoke(null, BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, new object[] { 11, "test" }, null); + Assert.AreEqual(ctor1.value, defaultConstructorInstance.value); + Assert.AreEqual(ctor2.value, customConstructorInstance1.value); + Assert.AreEqual(ctor3.value, customConstructorInstance2.value); + } + + [Test] + public void GetNameAndAddSuffixTest() + { + Type t = typeof (A<,>); + string fName = t.GetFullName(); + Assert.AreEqual(t.Namespace + ".A<,>", fName); + string sName = t.GetShortName(); + Assert.AreEqual("A<,>", sName); + string wsName = TypeHelper.AddSuffix(fName, "#"); + Assert.AreEqual(t.Namespace + ".A#<,>", wsName); + fName = t.FullName; + wsName = TypeHelper.AddSuffix(fName, "#"); + Assert.AreEqual(t.Namespace + ".A#`2", wsName); + + t = typeof (A); + fName = t.GetFullName(); + Assert.AreEqual(t.Namespace + ".A", fName); + sName = t.GetShortName(); + Assert.AreEqual("A", sName); + wsName = TypeHelper.AddSuffix(fName, "#"); + Assert.AreEqual(t.Namespace + ".A#", wsName); + fName = t.FullName; + wsName = TypeHelper.AddSuffix(fName, "#"); + AssertEx.IsPatternMatch(wsName, t.Namespace + ".A#`2[[*]]"); + + t = typeof (A.B); + fName = t.GetFullName(); + Assert.AreEqual(t.Namespace + ".A+B", fName); + sName = t.GetShortName(); + Assert.AreEqual("A+B", sName); + + t = t.GetGenericTypeDefinition().GetGenericArguments()[2]; + fName = t.GetFullName(); + Assert.AreEqual("T3", fName); + sName = t.GetShortName(); + Assert.AreEqual("T3", sName); + } + + [Test] + public void ActivateTest() + { + o = TypeHelper.Activate(GetType().Assembly, typeof (A).FullName, null, 1, "2"); + Assert.IsNotNull(o); + A a = o as A; + Assert.IsNotNull(a); + Assert.AreEqual(1, a.F1); + Assert.AreEqual("2", a.F2); + + o = TypeHelper.Activate(GetType().Assembly, typeof (A<,>).FullName, + new Type[] {typeof(int), typeof(string)}, 1, "2"); + Assert.IsNotNull(o); + a = o as A; + Assert.IsNotNull(a); + Assert.AreEqual(1, a.F1); + Assert.AreEqual("2", a.F2); + } + + [Test] + public void IsNumericTest() + { + var numericTypes = new[] { + typeof (byte), + typeof (byte?), + typeof (sbyte), + typeof (sbyte?), + typeof (short), + typeof (short?), + typeof (ushort), + typeof (ushort?), + typeof (int), + typeof (int?), + typeof (uint), + typeof (uint?), + typeof (long), + typeof (long?), + typeof (ulong), + typeof (ulong?), + typeof (float), + typeof (float?), + typeof (double), + typeof (double?), + typeof (decimal), + typeof (decimal?) + }; + + var nonNumericTypes = new[] { + typeof (string), + typeof (char), + typeof (char?), + typeof (bool), + typeof (bool?), + typeof (DateTime), + typeof (DateTime?), + typeof (TimeSpan), + typeof (TimeSpan?), + typeof (Guid), + typeof (Guid?), + typeof (TypeCode), + typeof (TypeCode?), + typeof (byte[]), + typeof (Key), + this.GetType(), + }; + + foreach (var numericType in numericTypes) { + Assert.IsTrue(numericType.IsNumericType()); + } + + foreach (var nonNumericType in nonNumericTypes) { + Assert.IsFalse(nonNumericType.IsNumericType()); + } + } + + [Test] + public void IsNullableTest() + { + var nullableTypes = new[] { + typeof (Nullable<>), + typeof (byte?), + typeof (sbyte?), + typeof (short?), + typeof (ushort?), + typeof (int?), + typeof (uint?), + typeof (long?), + typeof (ulong?), + typeof (float?), + typeof (double?), + typeof (decimal?), + typeof (Guid?) + }; + + var nonNullableTypes = new[] { + typeof (string), + typeof (char), + typeof (bool), + typeof (DateTime), + typeof (TimeSpan), + typeof (Guid), + typeof (TypeCode), + typeof (byte[]), + typeof (Key), + this.GetType() + }; + + foreach (var type in nullableTypes) { + Assert.IsTrue(type.IsNullable()); + } + + foreach (var type in nonNullableTypes) { + Assert.IsFalse(type.IsNullable()); + } + } + + [Test] + public void GenericIsNullableTest() + { + Assert.IsTrue(TypeHelper.IsNullable()); + Assert.IsTrue(TypeHelper.IsNullable()); + + Assert.IsFalse(TypeHelper.IsNullable()); + Assert.IsFalse(TypeHelper.IsNullable()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTestModel.cs b/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTestModel.cs index 9376063d16..f664dbab04 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTestModel.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Reflection/TypeHelperTestModel.cs @@ -1,334 +1,334 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.20 - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests.Core.Reflection -{ - - #region GetTypeName test model - - public class A - { - public class B - { - } - - public T1 F1; - public T2 F2; - - public A() - { - } - - public A(T1 f1, T2 f2) - { - F1 = f1; - F2 = f2; - } - } - - #endregion - - #region CreateAssociate test model - - // Interfaces - - public interface IAssociate - { - } - - public interface I - { - } - - public interface IT - { - } - - public interface IT2 - { - } - - // Interface associates - - public class InterfaceAssociate: IAssociate - { - } - - public class TInterfaceAssociate: IAssociate - { - } - - public class T2InterfaceAssociate: IAssociate - { - } - - // Class 1 - - public class A - { - } - - public class AI: A, I - { - } - - public class AIT: A, IT - { - } - - public class AIT2: A, IT2 - { - } - - // Class 1 associates (all direct) - - public class AAssociate: IAssociate - { - } - - public class AIAssociate: IAssociate - { - } - - public class AITAssociate: IAssociate - { - } - - public class AIT2Associate: IAssociate - { - } - - // Class 2 - - public class BA: A - { - } - - public class BI: I - { - } - - public class BIT: IT - { - } - - public class BIT2: IT2 - { - } - - // No class 2 associates (all indirect, => to A & I associates) - - // Class 3 - - public class CB: BA - { - } - - public class CBI: BI - { - } - - public class CBIT: BIT - { - } - - public class CBIT2: BIT2 - { - } - - // No class 3 associates (all indirect, => to A & I associates) - - // Class 4 - - public class DA: A - { - } - - public class DAI: AI - { - } - - public class DAIT: AIT - { - } - - public class DAIT2: AIT2 - { - } - - // No class 4 associates (all indirect, => to A associates) - - // Class 5 - - public class EA: A - { - } - - public class EAI: AI - { - } - - public class EAIT: AIT - { - } - - public class EAIT2: AIT2 - { - } - - // Class 5 associates (all direct) - - public class EAAssociate: IAssociate - { - } - - public class EAIAssociate: IAssociate - { - } - - public class EAITAssociate: IAssociate - { - } - - public class EAIT2Associate: IAssociate - { - } - - // Wrong classes - - public class FIIT: I, IT - { - } - - public class GFIIT: FIIT - { - } - - public class GIT2FIIT: FIIT, IT2 - { - } - - // Associates to base types, common interface - - public class SomeEnumerable : - IEnumerable - { - public IEnumerator GetEnumerator() - { - throw new NotImplementedException(); - } - } - - public class SomeCloneableEnumerable : SomeEnumerable, - ICloneable - { - public object Clone() - { - throw new NotImplementedException(); - } - } - - public interface ITestHandler - { - object DoSomethingWithValue(object value); - } - - public interface ITestHandler: ITestHandler - { - T DoSomethingWithValue(T value); - } - - public class TestHandlerBase: ITestHandler - { - public object DoSomethingWithValue(object value) - { - return value; - } - } - - public class ObjectTestHandler : TestHandlerBase, - ITestHandler - { - } - - public class ObjectTestHandler : TestHandlerBase, - ITestHandler - { - public T DoSomethingWithValue(T value) - { - return value; - } - } - - public class Int32TestHandler : TestHandlerBase, - ITestHandler - { - public int DoSomethingWithValue(int value) - { - return value; - } - } - - public class Int64TestHandler : TestHandlerBase, - ITestHandler - { - public long DoSomethingWithValue(long value) - { - return value; - } - } - - public class ArrayTestHandler : TestHandlerBase, - ITestHandler - { - public T[] DoSomethingWithValue(T[] value) - { - return value; - } - } - - public class Array2DTestHandler : TestHandlerBase, - ITestHandler - { - public T[,] DoSomethingWithValue(T[,] value) - { - return value; - } - } - - public class EnumerableInterfaceTestHandler : TestHandlerBase, - ITestHandler - { - public IEnumerable DoSomethingWithValue(IEnumerable value) - { - return value; - } - } - - public class EnumerableInterfaceTestHandler : TestHandlerBase, - ITestHandler> - { - public IEnumerable DoSomethingWithValue(IEnumerable value) - { - return value; - } - } - - public class CloneableInterfaceTestHandler : TestHandlerBase, - ITestHandler - { - public ICloneable DoSomethingWithValue(ICloneable value) - { - return value; - } - } - - #endregion +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.20 + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests.Core.Reflection +{ + + #region GetTypeName test model + + public class A + { + public class B + { + } + + public T1 F1; + public T2 F2; + + public A() + { + } + + public A(T1 f1, T2 f2) + { + F1 = f1; + F2 = f2; + } + } + + #endregion + + #region CreateAssociate test model + + // Interfaces + + public interface IAssociate + { + } + + public interface I + { + } + + public interface IT + { + } + + public interface IT2 + { + } + + // Interface associates + + public class InterfaceAssociate: IAssociate + { + } + + public class TInterfaceAssociate: IAssociate + { + } + + public class T2InterfaceAssociate: IAssociate + { + } + + // Class 1 + + public class A + { + } + + public class AI: A, I + { + } + + public class AIT: A, IT + { + } + + public class AIT2: A, IT2 + { + } + + // Class 1 associates (all direct) + + public class AAssociate: IAssociate + { + } + + public class AIAssociate: IAssociate + { + } + + public class AITAssociate: IAssociate + { + } + + public class AIT2Associate: IAssociate + { + } + + // Class 2 + + public class BA: A + { + } + + public class BI: I + { + } + + public class BIT: IT + { + } + + public class BIT2: IT2 + { + } + + // No class 2 associates (all indirect, => to A & I associates) + + // Class 3 + + public class CB: BA + { + } + + public class CBI: BI + { + } + + public class CBIT: BIT + { + } + + public class CBIT2: BIT2 + { + } + + // No class 3 associates (all indirect, => to A & I associates) + + // Class 4 + + public class DA: A + { + } + + public class DAI: AI + { + } + + public class DAIT: AIT + { + } + + public class DAIT2: AIT2 + { + } + + // No class 4 associates (all indirect, => to A associates) + + // Class 5 + + public class EA: A + { + } + + public class EAI: AI + { + } + + public class EAIT: AIT + { + } + + public class EAIT2: AIT2 + { + } + + // Class 5 associates (all direct) + + public class EAAssociate: IAssociate + { + } + + public class EAIAssociate: IAssociate + { + } + + public class EAITAssociate: IAssociate + { + } + + public class EAIT2Associate: IAssociate + { + } + + // Wrong classes + + public class FIIT: I, IT + { + } + + public class GFIIT: FIIT + { + } + + public class GIT2FIIT: FIIT, IT2 + { + } + + // Associates to base types, common interface + + public class SomeEnumerable : + IEnumerable + { + public IEnumerator GetEnumerator() + { + throw new NotImplementedException(); + } + } + + public class SomeCloneableEnumerable : SomeEnumerable, + ICloneable + { + public object Clone() + { + throw new NotImplementedException(); + } + } + + public interface ITestHandler + { + object DoSomethingWithValue(object value); + } + + public interface ITestHandler: ITestHandler + { + T DoSomethingWithValue(T value); + } + + public class TestHandlerBase: ITestHandler + { + public object DoSomethingWithValue(object value) + { + return value; + } + } + + public class ObjectTestHandler : TestHandlerBase, + ITestHandler + { + } + + public class ObjectTestHandler : TestHandlerBase, + ITestHandler + { + public T DoSomethingWithValue(T value) + { + return value; + } + } + + public class Int32TestHandler : TestHandlerBase, + ITestHandler + { + public int DoSomethingWithValue(int value) + { + return value; + } + } + + public class Int64TestHandler : TestHandlerBase, + ITestHandler + { + public long DoSomethingWithValue(long value) + { + return value; + } + } + + public class ArrayTestHandler : TestHandlerBase, + ITestHandler + { + public T[] DoSomethingWithValue(T[] value) + { + return value; + } + } + + public class Array2DTestHandler : TestHandlerBase, + ITestHandler + { + public T[,] DoSomethingWithValue(T[,] value) + { + return value; + } + } + + public class EnumerableInterfaceTestHandler : TestHandlerBase, + ITestHandler + { + public IEnumerable DoSomethingWithValue(IEnumerable value) + { + return value; + } + } + + public class EnumerableInterfaceTestHandler : TestHandlerBase, + ITestHandler> + { + public IEnumerable DoSomethingWithValue(IEnumerable value) + { + return value; + } + } + + public class CloneableInterfaceTestHandler : TestHandlerBase, + ITestHandler + { + public ICloneable DoSomethingWithValue(ICloneable value) + { + return value; + } + } + + #endregion } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.Designer.cs b/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.Designer.cs index cfa480f2c5..b282f33bf2 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.Designer.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.Designer.cs @@ -1,72 +1,72 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class TestResources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal TestResources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Resources.TestResources", typeof(TestResources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to TestValue. - /// - internal static string TestKey { - get { - return ResourceManager.GetString("TestKey", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class TestResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal TestResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Resources.TestResources", typeof(TestResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to TestValue. + /// + internal static string TestKey { + get { + return ResourceManager.GetString("TestKey", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.resx b/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.resx index ddd15d9ec6..741babc400 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.resx +++ b/Orm/Xtensive.Orm.Tests.Core/Resources/TestResources.resx @@ -1,124 +1,124 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - TestValue - This resource is used for ResourceHelperTest - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + TestValue + This resource is used for ResourceHelperTest + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Testing/AssertExTest.cs b/Orm/Xtensive.Orm.Tests.Core/Testing/AssertExTest.cs index e6fb4896b2..657352d257 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Testing/AssertExTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Testing/AssertExTest.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: -// Created: 2007.10.20 - -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Core.Testing -{ - [TestFixture] - public class AssertExTest - { - [Test] - public void IsRegexMatchTest() - { - AssertEx.IsRegexMatch("A B C D", "^.*B.*D.*$"); - AssertEx.IsRegexMatch("A B C D", "^.*B C.*$"); - AssertEx.IsRegexMatch("A B C D", "^A B C.*$"); - AssertEx.IsRegexMatch("A B C D", "^.*B C.*D$"); - AssertEx.IsRegexMatch("A B C D", "^A B C D$"); - AssertEx.IsRegexMatch("A B C D", "^.*A B C D.*$"); - AssertEx.IsRegexMatch("A B C D", "B.*C.*"); - AssertEx.IsNotRegexMatch("A B C D", "^B.*C.*$"); - AssertEx.IsNotRegexMatch("A B C D", "^A B.*C$"); - AssertEx.IsNotRegexMatch("A B C D", "^A.*C.*B.*D$"); - } - - [Test] - public void IsPatternMatchTest() - { - AssertEx.IsPatternMatch("*A*B?C*D*", "*B*D*"); - AssertEx.IsPatternMatch("*A*B?C*D*", "*B?C*"); - AssertEx.IsPatternMatch("*A*B?C*D*", "*A???C*"); - AssertEx.IsNotPatternMatch("*A*B?C*D*", "A*C"); - AssertEx.IsNotPatternMatch("*A*B?C*D*", "A?B"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: +// Created: 2007.10.20 + +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Core.Testing +{ + [TestFixture] + public class AssertExTest + { + [Test] + public void IsRegexMatchTest() + { + AssertEx.IsRegexMatch("A B C D", "^.*B.*D.*$"); + AssertEx.IsRegexMatch("A B C D", "^.*B C.*$"); + AssertEx.IsRegexMatch("A B C D", "^A B C.*$"); + AssertEx.IsRegexMatch("A B C D", "^.*B C.*D$"); + AssertEx.IsRegexMatch("A B C D", "^A B C D$"); + AssertEx.IsRegexMatch("A B C D", "^.*A B C D.*$"); + AssertEx.IsRegexMatch("A B C D", "B.*C.*"); + AssertEx.IsNotRegexMatch("A B C D", "^B.*C.*$"); + AssertEx.IsNotRegexMatch("A B C D", "^A B.*C$"); + AssertEx.IsNotRegexMatch("A B C D", "^A.*C.*B.*D$"); + } + + [Test] + public void IsPatternMatchTest() + { + AssertEx.IsPatternMatch("*A*B?C*D*", "*B*D*"); + AssertEx.IsPatternMatch("*A*B?C*D*", "*B?C*"); + AssertEx.IsPatternMatch("*A*B?C*D*", "*A???C*"); + AssertEx.IsNotPatternMatch("*A*B?C*D*", "A*C"); + AssertEx.IsNotPatternMatch("*A*B?C*D*", "A?B"); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Testing/InstanceGeneratorTest.cs b/Orm/Xtensive.Orm.Tests.Core/Testing/InstanceGeneratorTest.cs index 08c7384f65..4b49d810cf 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Testing/InstanceGeneratorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Testing/InstanceGeneratorTest.cs @@ -1,138 +1,138 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.24 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Orm.Logging; -using Xtensive.Reflection; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Testing -{ - // Verifies that 2 generated sequences of given type have appropriate share of coincident elements. - // Checks all system types. - [TestFixture] - public class InstanceGeneratorTest - { - private const int BaseSequenceLength = 1000000; - - [Test] - public void RegularTest() - { - TestSequence(BaseSequenceLength / 10); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - TestSequence(BaseSequenceLength); - } - - public void TestSequence(int sequenceLength) - { - double baseTolerance = 0.05/(sequenceLength/10000d); - TestSequence (sequenceLength, OP(1d/2), baseTolerance*10); - TestSequence(sequenceLength, NP(1d/2), baseTolerance*10); - TestSequence (sequenceLength, OP(1d/256), baseTolerance); - TestSequence(sequenceLength, NP(1d/256), baseTolerance); - TestSequence (sequenceLength, OP(1d/65536), baseTolerance); - TestSequence(sequenceLength, NP(1d/65536), baseTolerance); - TestSequence (sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence (sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence (sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence (sequenceLength, OP(1d/65536), baseTolerance); - TestSequence(sequenceLength, NP(1d/65536), baseTolerance); - TestSequence (sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence (sequenceLength, OP(1d/256), baseTolerance); - TestSequence(sequenceLength, NP(1d/256), baseTolerance); - TestSequence (sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence (sequenceLength, OP(1d/65536), baseTolerance); - TestSequence(sequenceLength, NP(1d/65536), baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength, 0, baseTolerance); - TestSequence(sequenceLength/10, 0, baseTolerance*10); - } - - // Calculates probability for original type (actually does nothing) - public static double OP(double p) - { - return p; - } - - // Calculates probability for nullable type - public static double NP(double p) - { - return p; -// double np = 0.01; -// return np*np + (1-np)*(1-np)*p; - } - - public void TestSequence(int size, double expectedShare, double shareTolerance) - { - TestLog.Info("{0} random sequence, {1} items:", typeof(T).GetShortName(), size); - using (IndentManager.IncreaseIndent()) { - TestLog.Info("Expected probability: {0}, tolerance: {1}.", expectedShare, shareTolerance); - // Testing the same sequence - Random r1 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - Random r2 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - double equalityProbability = GetEqualityProbability(r1, r2, size); - Assert.AreEqual(1, equalityProbability); - // Testing different sequences - r1 = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); - r2 = RandomManager.CreateRandom(2, SeedVariatorType.CallingMethod); - using (new Measurement("Generation and comparison", size*2)) - equalityProbability = GetEqualityProbability(r1, r2, size); - TestLog.Info("Actual probability: {0}.", equalityProbability); - Assert.AreEqual(expectedShare, equalityProbability, shareTolerance); - } - } - - public double GetEqualityProbability(Random r1, Random r2, int size) - { - IEnumerator enumerator1 = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(r1, size).GetEnumerator(); - IEnumerator enumerator2 = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(r2, size).GetEnumerator(); - AdvancedComparer comparer = AdvancedComparer.Default; - int equalCount = 0; - int totalCount = 0; - while (true) - { - bool isMoved1 = enumerator1.MoveNext(); - bool isMoved2 = enumerator2.MoveNext(); - if (isMoved1 != isMoved2) - return 0; - if (!isMoved1) - break; - totalCount++; - if (CheckIfEquals(comparer, enumerator1.Current, enumerator2.Current)) - equalCount++; - } - return (totalCount==0)?1:(double)equalCount/(double)totalCount; - } - - private bool CheckIfEquals(AdvancedComparer comparer, T x, T y) - { - // Tuple is no longer implementation of IComparable - // so need to use Equals - if (x is Tuple) - return comparer.Equals(x, y); - return comparer.Compare(x, y)==0; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.24 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Orm.Logging; +using Xtensive.Reflection; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Testing +{ + // Verifies that 2 generated sequences of given type have appropriate share of coincident elements. + // Checks all system types. + [TestFixture] + public class InstanceGeneratorTest + { + private const int BaseSequenceLength = 1000000; + + [Test] + public void RegularTest() + { + TestSequence(BaseSequenceLength / 10); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + TestSequence(BaseSequenceLength); + } + + public void TestSequence(int sequenceLength) + { + double baseTolerance = 0.05/(sequenceLength/10000d); + TestSequence (sequenceLength, OP(1d/2), baseTolerance*10); + TestSequence(sequenceLength, NP(1d/2), baseTolerance*10); + TestSequence (sequenceLength, OP(1d/256), baseTolerance); + TestSequence(sequenceLength, NP(1d/256), baseTolerance); + TestSequence (sequenceLength, OP(1d/65536), baseTolerance); + TestSequence(sequenceLength, NP(1d/65536), baseTolerance); + TestSequence (sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence (sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence (sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence (sequenceLength, OP(1d/65536), baseTolerance); + TestSequence(sequenceLength, NP(1d/65536), baseTolerance); + TestSequence (sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence (sequenceLength, OP(1d/256), baseTolerance); + TestSequence(sequenceLength, NP(1d/256), baseTolerance); + TestSequence (sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence (sequenceLength, OP(1d/65536), baseTolerance); + TestSequence(sequenceLength, NP(1d/65536), baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength, 0, baseTolerance); + TestSequence(sequenceLength/10, 0, baseTolerance*10); + } + + // Calculates probability for original type (actually does nothing) + public static double OP(double p) + { + return p; + } + + // Calculates probability for nullable type + public static double NP(double p) + { + return p; +// double np = 0.01; +// return np*np + (1-np)*(1-np)*p; + } + + public void TestSequence(int size, double expectedShare, double shareTolerance) + { + TestLog.Info("{0} random sequence, {1} items:", typeof(T).GetShortName(), size); + using (IndentManager.IncreaseIndent()) { + TestLog.Info("Expected probability: {0}, tolerance: {1}.", expectedShare, shareTolerance); + // Testing the same sequence + Random r1 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + Random r2 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + double equalityProbability = GetEqualityProbability(r1, r2, size); + Assert.AreEqual(1, equalityProbability); + // Testing different sequences + r1 = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod); + r2 = RandomManager.CreateRandom(2, SeedVariatorType.CallingMethod); + using (new Measurement("Generation and comparison", size*2)) + equalityProbability = GetEqualityProbability(r1, r2, size); + TestLog.Info("Actual probability: {0}.", equalityProbability); + Assert.AreEqual(expectedShare, equalityProbability, shareTolerance); + } + } + + public double GetEqualityProbability(Random r1, Random r2, int size) + { + IEnumerator enumerator1 = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(r1, size).GetEnumerator(); + IEnumerator enumerator2 = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstances(r2, size).GetEnumerator(); + AdvancedComparer comparer = AdvancedComparer.Default; + int equalCount = 0; + int totalCount = 0; + while (true) + { + bool isMoved1 = enumerator1.MoveNext(); + bool isMoved2 = enumerator2.MoveNext(); + if (isMoved1 != isMoved2) + return 0; + if (!isMoved1) + break; + totalCount++; + if (CheckIfEquals(comparer, enumerator1.Current, enumerator2.Current)) + equalCount++; + } + return (totalCount==0)?1:(double)equalCount/(double)totalCount; + } + + private bool CheckIfEquals(AdvancedComparer comparer, T x, T y) + { + // Tuple is no longer implementation of IComparable + // so need to use Equals + if (x is Tuple) + return comparer.Equals(x, y); + return comparer.Compare(x, y)==0; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Testing/RandomManagerTest.cs b/Orm/Xtensive.Orm.Tests.Core/Testing/RandomManagerTest.cs index 246b20f3f4..0365756889 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Testing/RandomManagerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Testing/RandomManagerTest.cs @@ -1,94 +1,94 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.09 - -using System; -using System.Runtime.CompilerServices; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core.Testing -{ - [TestFixture] - public class RandomManagerTest - { - private class RandomManagerInvoker - { - [MethodImpl(MethodImplOptions.NoInlining)] - public virtual Random CreateRandom1(SeedVariatorType variatorType) - { - return RandomManager.CreateRandom(variatorType); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public virtual Random CreateRandom2(SeedVariatorType variatorType) - { - return RandomManager.CreateRandom(variatorType); - } - } - - private class RandomManagerInvoker2: RandomManagerInvoker - { - [MethodImpl(MethodImplOptions.NoInlining)] - public override Random CreateRandom1(SeedVariatorType variatorType) - { - return RandomManager.CreateRandom(variatorType); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public override Random CreateRandom2(SeedVariatorType variatorType) - { - return RandomManager.CreateRandom(variatorType); - } - } - - [Test] - public virtual void SeedVariationTest_None() - { - RandomManagerInvoker r1 = new RandomManagerInvoker(); - RandomManagerInvoker r2 = new RandomManagerInvoker2(); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.None).Next(), - r2.CreateRandom1(SeedVariatorType.None).Next()); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.None).Next(), - r1.CreateRandom2(SeedVariatorType.None).Next()); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.None).Next(), - r2.CreateRandom1(SeedVariatorType.None).Next()); - } - - [Test] - public virtual void SeedVariationTest_CallingMethod() - { - RandomManagerInvoker r1 = new RandomManagerInvoker(); - RandomManagerInvoker r2 = new RandomManagerInvoker2(); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), - r1.CreateRandom1(SeedVariatorType.CallingMethod).Next()); - Assert.AreNotEqual( - r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), - r1.CreateRandom2(SeedVariatorType.CallingMethod).Next()); - Assert.AreNotEqual( - r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), - r2.CreateRandom1(SeedVariatorType.CallingMethod).Next()); - } - - [Test] - public virtual void SeedVariationTest_CallingType() - { - RandomManagerInvoker r1 = new RandomManagerInvoker(); - RandomManagerInvoker r2 = new RandomManagerInvoker2(); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.CallingType).Next(), - r1.CreateRandom1(SeedVariatorType.CallingType).Next()); - Assert.AreEqual( - r1.CreateRandom1(SeedVariatorType.CallingType).Next(), - r1.CreateRandom2(SeedVariatorType.CallingType).Next()); - Assert.AreNotEqual( - r1.CreateRandom1(SeedVariatorType.CallingType).Next(), - r2.CreateRandom1(SeedVariatorType.CallingType).Next()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.09 + +using System; +using System.Runtime.CompilerServices; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core.Testing +{ + [TestFixture] + public class RandomManagerTest + { + private class RandomManagerInvoker + { + [MethodImpl(MethodImplOptions.NoInlining)] + public virtual Random CreateRandom1(SeedVariatorType variatorType) + { + return RandomManager.CreateRandom(variatorType); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public virtual Random CreateRandom2(SeedVariatorType variatorType) + { + return RandomManager.CreateRandom(variatorType); + } + } + + private class RandomManagerInvoker2: RandomManagerInvoker + { + [MethodImpl(MethodImplOptions.NoInlining)] + public override Random CreateRandom1(SeedVariatorType variatorType) + { + return RandomManager.CreateRandom(variatorType); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public override Random CreateRandom2(SeedVariatorType variatorType) + { + return RandomManager.CreateRandom(variatorType); + } + } + + [Test] + public virtual void SeedVariationTest_None() + { + RandomManagerInvoker r1 = new RandomManagerInvoker(); + RandomManagerInvoker r2 = new RandomManagerInvoker2(); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.None).Next(), + r2.CreateRandom1(SeedVariatorType.None).Next()); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.None).Next(), + r1.CreateRandom2(SeedVariatorType.None).Next()); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.None).Next(), + r2.CreateRandom1(SeedVariatorType.None).Next()); + } + + [Test] + public virtual void SeedVariationTest_CallingMethod() + { + RandomManagerInvoker r1 = new RandomManagerInvoker(); + RandomManagerInvoker r2 = new RandomManagerInvoker2(); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), + r1.CreateRandom1(SeedVariatorType.CallingMethod).Next()); + Assert.AreNotEqual( + r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), + r1.CreateRandom2(SeedVariatorType.CallingMethod).Next()); + Assert.AreNotEqual( + r1.CreateRandom1(SeedVariatorType.CallingMethod).Next(), + r2.CreateRandom1(SeedVariatorType.CallingMethod).Next()); + } + + [Test] + public virtual void SeedVariationTest_CallingType() + { + RandomManagerInvoker r1 = new RandomManagerInvoker(); + RandomManagerInvoker r2 = new RandomManagerInvoker2(); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.CallingType).Next(), + r1.CreateRandom1(SeedVariatorType.CallingType).Next()); + Assert.AreEqual( + r1.CreateRandom1(SeedVariatorType.CallingType).Next(), + r1.CreateRandom2(SeedVariatorType.CallingType).Next()); + Assert.AreNotEqual( + r1.CreateRandom1(SeedVariatorType.CallingType).Next(), + r2.CreateRandom1(SeedVariatorType.CallingType).Next()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/DifferentialTupleTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/DifferentialTupleTest.cs index c07f12b81c..a3321301e8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/DifferentialTupleTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/DifferentialTupleTest.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2008.05.23 - -using System.Collections.Generic; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class DifferentialTupleTest : TupleBehaviorTestBase - { - [Test] - public void DifferentialTest() - { - TupleDescriptor descriptor = TupleDescriptor.Create(fieldTypes); - Xtensive.Tuples.Tuple t1 = Tuple.Create(descriptor); - Xtensive.Tuples.Tuple t2 = t1.Clone(); - PopulateData(fieldTypes, t2, t1); - - DifferentialTuple d = new DifferentialTuple(t1); - AssertAreSame(t1, d); - - PopulateData(fieldTypes, t1, d); - AssertAreSame(t1, d); - DifferentialTuple c = (DifferentialTuple)d.Clone(); - AssertAreSame(d, c); - - d.Reset(); - AssertAreSame(t2, d); - AssertAreSame(t1, c.ToRegular()); - } - - [Test] - public new void Test() - { - base.Test(); - } - - [Test] - public new void BehaviorTest() - { - base.BehaviorTest(); - } - - [Test] - public new void EmptyFieldsTest() - { - base.EmptyFieldsTest(); - } - - [Test] - public new void RandomTest() - { - base.RandomTest(); - } - - protected override Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor) - { - return new DifferentialTuple(Tuple.Create(descriptor)); - } - - protected override Xtensive.Tuples.Tuple CreateTestTuple(Xtensive.Tuples.Tuple source) - { - return new DifferentialTuple(source); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2008.05.23 + +using System.Collections.Generic; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class DifferentialTupleTest : TupleBehaviorTestBase + { + [Test] + public void DifferentialTest() + { + TupleDescriptor descriptor = TupleDescriptor.Create(fieldTypes); + Xtensive.Tuples.Tuple t1 = Tuple.Create(descriptor); + Xtensive.Tuples.Tuple t2 = t1.Clone(); + PopulateData(fieldTypes, t2, t1); + + DifferentialTuple d = new DifferentialTuple(t1); + AssertAreSame(t1, d); + + PopulateData(fieldTypes, t1, d); + AssertAreSame(t1, d); + DifferentialTuple c = (DifferentialTuple)d.Clone(); + AssertAreSame(d, c); + + d.Reset(); + AssertAreSame(t2, d); + AssertAreSame(t1, c.ToRegular()); + } + + [Test] + public new void Test() + { + base.Test(); + } + + [Test] + public new void BehaviorTest() + { + base.BehaviorTest(); + } + + [Test] + public new void EmptyFieldsTest() + { + base.EmptyFieldsTest(); + } + + [Test] + public new void RandomTest() + { + base.RandomTest(); + } + + protected override Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor) + { + return new DifferentialTuple(Tuple.Create(descriptor)); + } + + protected override Xtensive.Tuples.Tuple CreateTestTuple(Xtensive.Tuples.Tuple source) + { + return new DifferentialTuple(source); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/DummyTuple.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/DummyTuple.cs index fb03aea06e..6a0997aa81 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/DummyTuple.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/DummyTuple.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.01.24 - -using System; -using System.Collections; -using Xtensive.Core; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - public class DummyTuple: Xtensive.Tuples.Tuple - { - private TupleDescriptor descriptor; - private BitArray available; - private object[] values; - - public override TupleDescriptor Descriptor - { - get { return descriptor; } - } - - public object this[int fieldIndex] - { - get { return GetValue(fieldIndex); } - set { SetValue(fieldIndex, value); } - } - - public override Xtensive.Tuples.Tuple CreateNew() - { - return new DummyTuple(descriptor); - } - - public override Xtensive.Tuples.Tuple Clone() - { - DummyTuple tuple = (DummyTuple)CreateNew(); - tuple.values = (object[])values.Clone(); - tuple.available = available; - return tuple; - } - - public override TupleFieldState GetFieldState(int fieldIndex) - { - if (!available[fieldIndex]) - return 0; - return values[fieldIndex] == null ? - TupleFieldState.Null | TupleFieldState.Available : - TupleFieldState.Available; - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - if ((fieldState & TupleFieldState.Available) == TupleFieldState.Available) - available[fieldIndex] = true; - else - available[fieldIndex] = false; - - if ((fieldState & TupleFieldState.Null) == TupleFieldState.Null) - values[fieldIndex] = null; - } - - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - fieldState = GetFieldState(fieldIndex); - return values[fieldIndex]; - } - - public override void SetValue(int fieldIndex, object fieldValue) - { - if (fieldValue != null && !descriptor[fieldIndex].IsAssignableFrom(fieldValue.GetType())) - throw new InvalidCastException(); - values[fieldIndex] = fieldValue; - available[fieldIndex] = true; - } - - - // Constructors - - public DummyTuple(TupleDescriptor descriptor) - { - ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); - this.descriptor = descriptor; - values = new object[descriptor.Count]; - available = new BitArray(new bool[descriptor.Count]); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.01.24 + +using System; +using System.Collections; +using Xtensive.Core; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + public class DummyTuple: Xtensive.Tuples.Tuple + { + private TupleDescriptor descriptor; + private BitArray available; + private object[] values; + + public override TupleDescriptor Descriptor + { + get { return descriptor; } + } + + public object this[int fieldIndex] + { + get { return GetValue(fieldIndex); } + set { SetValue(fieldIndex, value); } + } + + public override Xtensive.Tuples.Tuple CreateNew() + { + return new DummyTuple(descriptor); + } + + public override Xtensive.Tuples.Tuple Clone() + { + DummyTuple tuple = (DummyTuple)CreateNew(); + tuple.values = (object[])values.Clone(); + tuple.available = available; + return tuple; + } + + public override TupleFieldState GetFieldState(int fieldIndex) + { + if (!available[fieldIndex]) + return 0; + return values[fieldIndex] == null ? + TupleFieldState.Null | TupleFieldState.Available : + TupleFieldState.Available; + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + if ((fieldState & TupleFieldState.Available) == TupleFieldState.Available) + available[fieldIndex] = true; + else + available[fieldIndex] = false; + + if ((fieldState & TupleFieldState.Null) == TupleFieldState.Null) + values[fieldIndex] = null; + } + + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + fieldState = GetFieldState(fieldIndex); + return values[fieldIndex]; + } + + public override void SetValue(int fieldIndex, object fieldValue) + { + if (fieldValue != null && !descriptor[fieldIndex].IsAssignableFrom(fieldValue.GetType())) + throw new InvalidCastException(); + values[fieldIndex] = fieldValue; + available[fieldIndex] = true; + } + + + // Constructors + + public DummyTuple(TupleDescriptor descriptor) + { + ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); + this.descriptor = descriptor; + values = new object[descriptor.Count]; + available = new BitArray(new bool[descriptor.Count]); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/FlagsTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/FlagsTest.cs index 7aebdcba82..7e4ed4357c 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/FlagsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/FlagsTest.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.27 - -using NUnit.Framework; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class FlagsTest - { - [Test] - public void Main() - { - Tuple t = Tuple.Create(0, null); - Assert.IsTrue(t.GetFieldState(0).IsAvailable()); - Assert.IsFalse(t.GetFieldState(0).IsNull()); - Assert.IsTrue(t.GetFieldState(1).IsAvailable()); - Assert.IsTrue(t.GetFieldState(1).IsNull()); - t.SetValue(0, null); - t.SetValue(1, null); - Assert.IsTrue(t.GetFieldState(0).IsAvailable()); - Assert.IsTrue(t.GetFieldState(1).IsAvailable()); - Assert.IsTrue(t.GetFieldState(0).IsNull()); - Assert.IsTrue(t.GetFieldState(1).IsNull()); - t.SetValue(0, new int?(32)); - Assert.IsTrue(t.GetFieldState(0).IsAvailable()); - Assert.IsFalse(t.GetFieldState(0).IsNull()); - t.SetValue(0, (int?) null); - Assert.IsTrue(t.GetFieldState(0).IsAvailable()); - Assert.IsTrue(t.GetFieldState(0).IsNull()); - - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.27 + +using NUnit.Framework; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class FlagsTest + { + [Test] + public void Main() + { + Tuple t = Tuple.Create(0, null); + Assert.IsTrue(t.GetFieldState(0).IsAvailable()); + Assert.IsFalse(t.GetFieldState(0).IsNull()); + Assert.IsTrue(t.GetFieldState(1).IsAvailable()); + Assert.IsTrue(t.GetFieldState(1).IsNull()); + t.SetValue(0, null); + t.SetValue(1, null); + Assert.IsTrue(t.GetFieldState(0).IsAvailable()); + Assert.IsTrue(t.GetFieldState(1).IsAvailable()); + Assert.IsTrue(t.GetFieldState(0).IsNull()); + Assert.IsTrue(t.GetFieldState(1).IsNull()); + t.SetValue(0, new int?(32)); + Assert.IsTrue(t.GetFieldState(0).IsAvailable()); + Assert.IsFalse(t.GetFieldState(0).IsNull()); + t.SetValue(0, (int?) null); + Assert.IsTrue(t.GetFieldState(0).IsAvailable()); + Assert.IsTrue(t.GetFieldState(0).IsNull()); + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/LongTupleTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/LongTupleTest.cs index dd4f629e1c..91dac38372 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/LongTupleTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/LongTupleTest.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2011.04.18 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Tuple=Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class LongTupleTest - { - [Test] - public void CombinedTest() - { - int minLength = 30; - int maxLength = 200; - int iterationCount = 1000; - var rnd = RandomManager.CreateRandom(); - var generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - for (int i = 0; i < iterationCount; i++) { - int count = rnd.Next(maxLength - minLength); - - // Preparing data for test - var fields = new Type[count]; - var data = new int[count]; - for (int j = 0; j < count; j++) { - data[j] = generator.GetInstance(rnd); - fields[j] = typeof (int); - } - - { - // Testing writes (untyped) - var tuple = Tuple.Create(fields); - for (int j = 0; j < count; j++) - tuple.SetValue(j, (object) data[j]); - // Testing reads (untyped) - for (int j = 0; j < count; j++) - Assert.AreEqual(data[j], tuple.GetValue(j)); - // Testing serialization - var tuple2 = Cloner.Clone(tuple); - Assert.AreEqual(tuple, tuple2); - Assert.AreEqual(tuple.Descriptor, tuple2.Descriptor); - // Testing reads (untyped)); - for (int j = 0; j < count; j++) - Assert.AreEqual(data[j], tuple2.GetValue(j)); - } - - { - // Testing writes (typed) - var tuple = Tuple.Create(fields); - for (int j = 0; j < count; j++) - tuple.SetValue(j, data[j]); - // Testing reads (typed) - for (int j = 0; j < count; j++) - Assert.AreEqual(data[j], tuple.GetValue(j)); - } - } - } - } +// Copyright (C) 2003-2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2011.04.18 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Tuple=Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class LongTupleTest + { + [Test] + public void CombinedTest() + { + int minLength = 30; + int maxLength = 200; + int iterationCount = 1000; + var rnd = RandomManager.CreateRandom(); + var generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + for (int i = 0; i < iterationCount; i++) { + int count = rnd.Next(maxLength - minLength); + + // Preparing data for test + var fields = new Type[count]; + var data = new int[count]; + for (int j = 0; j < count; j++) { + data[j] = generator.GetInstance(rnd); + fields[j] = typeof (int); + } + + { + // Testing writes (untyped) + var tuple = Tuple.Create(fields); + for (int j = 0; j < count; j++) + tuple.SetValue(j, (object) data[j]); + // Testing reads (untyped) + for (int j = 0; j < count; j++) + Assert.AreEqual(data[j], tuple.GetValue(j)); + // Testing serialization + var tuple2 = Cloner.Clone(tuple); + Assert.AreEqual(tuple, tuple2); + Assert.AreEqual(tuple.Descriptor, tuple2.Descriptor); + // Testing reads (untyped)); + for (int j = 0; j < count; j++) + Assert.AreEqual(data[j], tuple2.GetValue(j)); + } + + { + // Testing writes (typed) + var tuple = Tuple.Create(fields); + for (int j = 0; j < count; j++) + tuple.SetValue(j, data[j]); + // Testing reads (typed) + for (int j = 0; j < count; j++) + Assert.AreEqual(data[j], tuple.GetValue(j)); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/CutInTransformTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/CutInTransformTest.cs index 427e1857e1..47c4971b95 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/CutInTransformTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/CutInTransformTest.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.06.23 - -using System; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Tuples; -using Xtensive.Orm.Tests; -using Xtensive.Tuples.Transform; -using Tuple = Xtensive.Tuples.Tuple; - - -namespace Xtensive.Orm.Tests.Core.Tuples.Transform -{ - [TestFixture] - public class CutInTransformTest - { - public const int IterationCount = 1000000; - public static Xtensive.Tuples.Tuple t1 = Xtensive.Tuples.Tuple.Create(3, 4.0, "5"); - public static Xtensive.Tuples.Tuple t2 = Xtensive.Tuples.Tuple.Create(1, "2"); - public const int CutInIndex = 1; - public const string value = "qwe"; - - [Test] - public void BaseTest() - { - TestLog.InfoRegion("CutInTransform test"); - TestLog.Info("Originals: {0}, {1}, index {2}", t1, t2, CutInIndex); - CutInTransform ct = new CutInTransform(false, CutInIndex, t1.Descriptor, t2.Descriptor); - CutInTransform ctro = new CutInTransform(true, CutInIndex, t1.Descriptor, t2.Descriptor); - Xtensive.Tuples.Tuple wt1 = ct.Apply(TupleTransformType.TransformedTuple, t1, t2); - TestLog.Info("Wrapper: {0}", wt1); - Xtensive.Tuples.Tuple ct1 = ct.Apply(TupleTransformType.Tuple, t1, t2); - TestLog.Info("Copy: {0}", ct1); - Xtensive.Tuples.Tuple wt2 = ctro.Apply(TupleTransformType.TransformedTuple, t1, t2); - Xtensive.Tuples.Tuple ct2 = ctro.Apply(TupleTransformType.Tuple, t1, t2); - Assert.AreEqual(wt1, wt2); - Assert.AreEqual(wt2, ct1); - Assert.AreEqual(ct1, ct2); - - TestLog.InfoRegion("CutInTransform test"); - TestLog.Info("Originals: {0}, {1}, index {2}", t1, value, CutInIndex); - CutInTransform ctt = new CutInTransform(false, CutInIndex, t1.Descriptor); - CutInTransform cttro = new CutInTransform(true, CutInIndex, t1.Descriptor); - Xtensive.Tuples.Tuple wtt1 = ctt.Apply(TupleTransformType.TransformedTuple, t1, value); - TestLog.Info("Wrapper: {0}", wtt1); - Xtensive.Tuples.Tuple ctt1 = ctt.Apply(TupleTransformType.Tuple, t1, value); - TestLog.Info("Copy: {0}", ctt1); - Xtensive.Tuples.Tuple wtt2 = cttro.Apply(TupleTransformType.TransformedTuple, t1, value); - Xtensive.Tuples.Tuple ctt2 = cttro.Apply(TupleTransformType.Tuple, t1, value); - Assert.AreEqual(wtt1, wtt2); - Assert.AreEqual(wtt2, ctt1); - Assert.AreEqual(ctt1, ctt2); - - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - TestLog.InfoRegion("CutInTransform test"); - CutInTransform mt = new CutInTransform(false, CutInIndex, t1.Descriptor, t1.Descriptor); - Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t1, t1); - Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t1, t1); - Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t1, t1); - Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t1, t1); - PerformanceTransformTesting(ct1, ct2, wt1, wt2); - - TestLog.InfoRegion("CutInTransform test"); - CutInTransform mtt = new CutInTransform(false, CutInIndex, t1.Descriptor); - Xtensive.Tuples.Tuple wtt1 = mtt.Apply(TupleTransformType.TransformedTuple, t1, value); - Xtensive.Tuples.Tuple wtt2 = mtt.Apply(TupleTransformType.TransformedTuple, t1, value); - Xtensive.Tuples.Tuple ctt1 = mtt.Apply(TupleTransformType.Tuple, t1, value); - Xtensive.Tuples.Tuple ctt2 = mtt.Apply(TupleTransformType.Tuple, t1, value); - PerformanceTransformTesting(ctt1, ctt2, wtt1, wtt2); - - } - - public void PerformanceTransformTesting(Xtensive.Tuples.Tuple tuple1, Xtensive.Tuples.Tuple tuple2, Xtensive.Tuples.Tuple tuple3, Xtensive.Tuples.Tuple tuple4) - { - int count = IterationCount; - - AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; - comparer.Equals(tuple1, tuple2); - comparer.Equals(tuple1, tuple3); - comparer.Equals(tuple3, tuple4); - - TestHelper.CollectGarbage(); - using (new Measurement("O&O", MeasurementOptions.Log, count)) - for (int i = 0; i < count; i++) - comparer.Equals(tuple1, tuple2); - - TestHelper.CollectGarbage(); - using (new Measurement("O&W", MeasurementOptions.Log, count)) - for (int i = 0; i < count; i++) - comparer.Equals(tuple1, tuple3); - - TestHelper.CollectGarbage(); - using (new Measurement("W&W", MeasurementOptions.Log, count)) - for (int i = 0; i < count; i++) - comparer.Equals(tuple3, tuple4); - - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.06.23 + +using System; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Tuples; +using Xtensive.Orm.Tests; +using Xtensive.Tuples.Transform; +using Tuple = Xtensive.Tuples.Tuple; + + +namespace Xtensive.Orm.Tests.Core.Tuples.Transform +{ + [TestFixture] + public class CutInTransformTest + { + public const int IterationCount = 1000000; + public static Xtensive.Tuples.Tuple t1 = Xtensive.Tuples.Tuple.Create(3, 4.0, "5"); + public static Xtensive.Tuples.Tuple t2 = Xtensive.Tuples.Tuple.Create(1, "2"); + public const int CutInIndex = 1; + public const string value = "qwe"; + + [Test] + public void BaseTest() + { + TestLog.InfoRegion("CutInTransform test"); + TestLog.Info("Originals: {0}, {1}, index {2}", t1, t2, CutInIndex); + CutInTransform ct = new CutInTransform(false, CutInIndex, t1.Descriptor, t2.Descriptor); + CutInTransform ctro = new CutInTransform(true, CutInIndex, t1.Descriptor, t2.Descriptor); + Xtensive.Tuples.Tuple wt1 = ct.Apply(TupleTransformType.TransformedTuple, t1, t2); + TestLog.Info("Wrapper: {0}", wt1); + Xtensive.Tuples.Tuple ct1 = ct.Apply(TupleTransformType.Tuple, t1, t2); + TestLog.Info("Copy: {0}", ct1); + Xtensive.Tuples.Tuple wt2 = ctro.Apply(TupleTransformType.TransformedTuple, t1, t2); + Xtensive.Tuples.Tuple ct2 = ctro.Apply(TupleTransformType.Tuple, t1, t2); + Assert.AreEqual(wt1, wt2); + Assert.AreEqual(wt2, ct1); + Assert.AreEqual(ct1, ct2); + + TestLog.InfoRegion("CutInTransform test"); + TestLog.Info("Originals: {0}, {1}, index {2}", t1, value, CutInIndex); + CutInTransform ctt = new CutInTransform(false, CutInIndex, t1.Descriptor); + CutInTransform cttro = new CutInTransform(true, CutInIndex, t1.Descriptor); + Xtensive.Tuples.Tuple wtt1 = ctt.Apply(TupleTransformType.TransformedTuple, t1, value); + TestLog.Info("Wrapper: {0}", wtt1); + Xtensive.Tuples.Tuple ctt1 = ctt.Apply(TupleTransformType.Tuple, t1, value); + TestLog.Info("Copy: {0}", ctt1); + Xtensive.Tuples.Tuple wtt2 = cttro.Apply(TupleTransformType.TransformedTuple, t1, value); + Xtensive.Tuples.Tuple ctt2 = cttro.Apply(TupleTransformType.Tuple, t1, value); + Assert.AreEqual(wtt1, wtt2); + Assert.AreEqual(wtt2, ctt1); + Assert.AreEqual(ctt1, ctt2); + + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + TestLog.InfoRegion("CutInTransform test"); + CutInTransform mt = new CutInTransform(false, CutInIndex, t1.Descriptor, t1.Descriptor); + Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t1, t1); + Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t1, t1); + Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t1, t1); + Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t1, t1); + PerformanceTransformTesting(ct1, ct2, wt1, wt2); + + TestLog.InfoRegion("CutInTransform test"); + CutInTransform mtt = new CutInTransform(false, CutInIndex, t1.Descriptor); + Xtensive.Tuples.Tuple wtt1 = mtt.Apply(TupleTransformType.TransformedTuple, t1, value); + Xtensive.Tuples.Tuple wtt2 = mtt.Apply(TupleTransformType.TransformedTuple, t1, value); + Xtensive.Tuples.Tuple ctt1 = mtt.Apply(TupleTransformType.Tuple, t1, value); + Xtensive.Tuples.Tuple ctt2 = mtt.Apply(TupleTransformType.Tuple, t1, value); + PerformanceTransformTesting(ctt1, ctt2, wtt1, wtt2); + + } + + public void PerformanceTransformTesting(Xtensive.Tuples.Tuple tuple1, Xtensive.Tuples.Tuple tuple2, Xtensive.Tuples.Tuple tuple3, Xtensive.Tuples.Tuple tuple4) + { + int count = IterationCount; + + AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; + comparer.Equals(tuple1, tuple2); + comparer.Equals(tuple1, tuple3); + comparer.Equals(tuple3, tuple4); + + TestHelper.CollectGarbage(); + using (new Measurement("O&O", MeasurementOptions.Log, count)) + for (int i = 0; i < count; i++) + comparer.Equals(tuple1, tuple2); + + TestHelper.CollectGarbage(); + using (new Measurement("O&W", MeasurementOptions.Log, count)) + for (int i = 0; i < count; i++) + comparer.Equals(tuple1, tuple3); + + TestHelper.CollectGarbage(); + using (new Measurement("W&W", MeasurementOptions.Log, count)) + for (int i = 0; i < count; i++) + comparer.Equals(tuple3, tuple4); + + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MapTransformTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MapTransformTest.cs index 186f7ba63f..f2be75612e 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MapTransformTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MapTransformTest.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.08 - -using NUnit.Framework; -using Xtensive.Tuples; -using Xtensive.Tuples.Transform; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples.Transform -{ - [TestFixture] - public class MapTransformTest - { - public void MainTest() - { - Xtensive.Tuples.Tuple source = Tuple.Create(1); - MapTransform transform = new MapTransform(true, TupleDescriptor.Create(), new[] {-1, 0}); - Xtensive.Tuples.Tuple result = transform.Apply(TupleTransformType.TransformedTuple, source); - Assert.AreEqual(TupleFieldState.Default, result.GetFieldState(0)); - Assert.AreEqual(TupleFieldState.Available, result.GetFieldState(1)); - Assert.AreEqual(TupleFieldState.Default, result.GetFieldState(2)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.08 + +using NUnit.Framework; +using Xtensive.Tuples; +using Xtensive.Tuples.Transform; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples.Transform +{ + [TestFixture] + public class MapTransformTest + { + public void MainTest() + { + Xtensive.Tuples.Tuple source = Tuple.Create(1); + MapTransform transform = new MapTransform(true, TupleDescriptor.Create(), new[] {-1, 0}); + Xtensive.Tuples.Tuple result = transform.Apply(TupleTransformType.TransformedTuple, source); + Assert.AreEqual(TupleFieldState.Default, result.GetFieldState(0)); + Assert.AreEqual(TupleFieldState.Available, result.GetFieldState(1)); + Assert.AreEqual(TupleFieldState.Default, result.GetFieldState(2)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MergeTransformTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MergeTransformTest.cs index d41989ead6..96e33fc3ab 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MergeTransformTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/Transform/MergeTransformTest.cs @@ -1,150 +1,150 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.05 - -using System; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Core; -using Xtensive.Tuples; -using Xtensive.Orm.Tests; -using Xtensive.Tuples.Transform; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples.Transform -{ - [TestFixture] - public class MergeTransformTest - { - public const int IterationCount = 1000000; - - [Test] - public void BaseTest() - { - Xtensive.Tuples.Tuple t1 = Xtensive.Tuples.Tuple.Create(1, "2"); - Xtensive.Tuples.Tuple t2 = Xtensive.Tuples.Tuple.Create(3, 4.0, "5"); - TestLog.Info("Originals: {0}, {1}", t1, t2); - - CombineTransform mt = new CombineTransform(false, t1.Descriptor, t2.Descriptor); - CombineTransform mtro = new CombineTransform(true, t1.Descriptor, t2.Descriptor); - - Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t1, t2); - TestLog.Info("Wrapper: {0}", wt1); - Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t1, t2); - TestLog.Info("Copy: {0}", ct1); - Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t1, t2); - Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t1, t2); - - Assert.AreEqual(wt1, wt2); - Assert.AreEqual(wt2, ct1); - Assert.AreEqual(ct1, ct2); - - wt1.SetValue(2, 0); - Assert.AreEqual(t2.GetValue(0), wt1.GetValue(2)); - Assert.AreEqual(wt1, wt2); - Assert.AreNotEqual(wt2, ct1); - Assert.AreEqual(ct1, ct2); - - ct1.SetValue(2, 0); - Assert.AreEqual(t2.GetValue(0), ct1.GetValue(2)); - Assert.AreEqual(wt1, wt2); - Assert.AreEqual(wt2, ct1); - Assert.AreNotEqual(ct1, ct2); - - Xtensive.Tuples.Tuple wtro = mtro.Apply(TupleTransformType.TransformedTuple, t1, t2); - AssertEx.Throws(delegate { - wtro.SetValue(2, 0); - }); - - CombineTransform mt3 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor); - Xtensive.Tuples.Tuple wt3 = mt3.Apply(TupleTransformType.TransformedTuple, t1, t1, t1); - TestLog.Info("Wrapper: {0}", wt3); - Xtensive.Tuples.Tuple ct3 = mt3.Apply(TupleTransformType.Tuple, t1, t1, t1); - TestLog.Info("Copy: {0}", ct3); - t1.SetValue(0,0); - Assert.AreEqual(wt3.GetValue(4), t1.GetValue(0)); - t1.SetValue(0,1); - - CombineTransform mt4 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor, t1.Descriptor); - Xtensive.Tuples.Tuple wt4 = mt4.Apply(TupleTransformType.TransformedTuple, t1, t1, t1, t1); - TestLog.Info("Wrapper: {0}", wt4); - Xtensive.Tuples.Tuple ct4 = mt4.Apply(TupleTransformType.Tuple, t1, t1, t1, t1); - TestLog.Info("Copy: {0}", ct4); - t1.SetValue(0,0); - Assert.AreEqual(wt4.GetValue(6), t1.GetValue(0)); - t1.SetValue(0,1); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest1() - { - AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; - Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1); - CombineTransform mt = new CombineTransform(false, t.Descriptor, t.Descriptor); - Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t, t); - Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t, t); - Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t, t); - Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t, t); - int count = IterationCount; - - comparer.Equals(ct1, ct2); - comparer.Equals(ct1, wt1); - comparer.Equals(wt1, wt2); - - TestHelper.CollectGarbage(); - using (new Measurement("O&O", MeasurementOptions.Log, count)) - for (int i = 0; i comparer = AdvancedComparerStruct.Default; - Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1); - CombineTransform mt = new CombineTransform(false, t.Descriptor, t.Descriptor, t.Descriptor, t.Descriptor); - SegmentTransform st = new SegmentTransform(false, mt.Descriptor, new Segment(1,2)); - Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t)); - Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t)); - Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t)); - Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t)); - int count = IterationCount; - - comparer.Equals(ct1, ct2); - comparer.Equals(ct1, wt1); - comparer.Equals(wt1, wt2); - - TestHelper.CollectGarbage(); - using (new Measurement("O&O", MeasurementOptions.Log, count)) - for (int i = 0; i(delegate { + wtro.SetValue(2, 0); + }); + + CombineTransform mt3 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor); + Xtensive.Tuples.Tuple wt3 = mt3.Apply(TupleTransformType.TransformedTuple, t1, t1, t1); + TestLog.Info("Wrapper: {0}", wt3); + Xtensive.Tuples.Tuple ct3 = mt3.Apply(TupleTransformType.Tuple, t1, t1, t1); + TestLog.Info("Copy: {0}", ct3); + t1.SetValue(0,0); + Assert.AreEqual(wt3.GetValue(4), t1.GetValue(0)); + t1.SetValue(0,1); + + CombineTransform mt4 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor, t1.Descriptor); + Xtensive.Tuples.Tuple wt4 = mt4.Apply(TupleTransformType.TransformedTuple, t1, t1, t1, t1); + TestLog.Info("Wrapper: {0}", wt4); + Xtensive.Tuples.Tuple ct4 = mt4.Apply(TupleTransformType.Tuple, t1, t1, t1, t1); + TestLog.Info("Copy: {0}", ct4); + t1.SetValue(0,0); + Assert.AreEqual(wt4.GetValue(6), t1.GetValue(0)); + t1.SetValue(0,1); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest1() + { + AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; + Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1); + CombineTransform mt = new CombineTransform(false, t.Descriptor, t.Descriptor); + Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t, t); + Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t, t); + Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t, t); + Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t, t); + int count = IterationCount; + + comparer.Equals(ct1, ct2); + comparer.Equals(ct1, wt1); + comparer.Equals(wt1, wt2); + + TestHelper.CollectGarbage(); + using (new Measurement("O&O", MeasurementOptions.Log, count)) + for (int i = 0; i comparer = AdvancedComparerStruct.Default; + Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1); + CombineTransform mt = new CombineTransform(false, t.Descriptor, t.Descriptor, t.Descriptor, t.Descriptor); + SegmentTransform st = new SegmentTransform(false, mt.Descriptor, new Segment(1,2)); + Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t)); + Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t)); + Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t)); + Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t)); + int count = IterationCount; + + comparer.Equals(ct1, ct2); + comparer.Equals(ct1, wt1); + comparer.Equals(wt1, wt2); + + TestHelper.CollectGarbage(); + using (new Measurement("O&O", MeasurementOptions.Log, count)) + for (int i = 0; i(delegate { - rt.SetValue(0, 2); - }); - - Xtensive.Tuples.Tuple ct = t.ToReadOnly(TupleTransformType.Tuple); - TestLog.Info("Copy: {0}", ct); - Assert.AreEqual(t, ct); - t.SetValue(0, 2); - Assert.AreNotEqual(t, ct); - t.SetValue(0, 1); - AssertEx.Throws(delegate { - ct.SetValue(0, 2); - }); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; - Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1, 2); - Xtensive.Tuples.Tuple ct = t.ToRegular(); - Xtensive.Tuples.Tuple wt = t.ToReadOnly(TupleTransformType.TransformedTuple); - Xtensive.Tuples.Tuple wtc = t.ToReadOnly(TupleTransformType.TransformedTuple); - int count = IterationCount; - - comparer.Equals(t, ct); - comparer.Equals(t, wt); - comparer.Equals(wt, wtc); - - TestHelper.CollectGarbage(); - using (new Measurement("O&O", MeasurementOptions.Log, count)) - for (int i = 0; i(delegate { + rt.SetValue(0, 2); + }); + + Xtensive.Tuples.Tuple ct = t.ToReadOnly(TupleTransformType.Tuple); + TestLog.Info("Copy: {0}", ct); + Assert.AreEqual(t, ct); + t.SetValue(0, 2); + Assert.AreNotEqual(t, ct); + t.SetValue(0, 1); + AssertEx.Throws(delegate { + ct.SetValue(0, 2); + }); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; + Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1, 2); + Xtensive.Tuples.Tuple ct = t.ToRegular(); + Xtensive.Tuples.Tuple wt = t.ToReadOnly(TupleTransformType.TransformedTuple); + Xtensive.Tuples.Tuple wtc = t.ToReadOnly(TupleTransformType.TransformedTuple); + int count = IterationCount; + + comparer.Equals(t, ct); + comparer.Equals(t, wt); + comparer.Equals(wt, wtc); + + TestHelper.CollectGarbage(); + using (new Measurement("O&O", MeasurementOptions.Log, count)) + for (int i = 0; i(1,2)); - SegmentTransform stro = new SegmentTransform(true, t.Descriptor, new Segment(1,2)); - - Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, t); - TestLog.Info("Wrapper: {0}", wt1); - Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, t); - TestLog.Info("Copy: {0}", ct1); - Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, t); - Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, t); - - Assert.AreEqual(wt1, wt2); - Assert.AreEqual(wt2, ct1); - Assert.AreEqual(ct1, ct2); - - wt1.SetValue(1, 1); - Assert.AreEqual(t.GetValue(2), wt1.GetValue(1)); - Assert.AreEqual(wt1, wt2); - Assert.AreNotEqual(wt2, ct1); - Assert.AreEqual(ct1, ct2); - - ct1.SetValue(1, 1); - Assert.AreEqual(t.GetValue(2), ct1.GetValue(1)); - Assert.AreEqual(wt1, wt2); - Assert.AreEqual(wt2, ct1); - Assert.AreNotEqual(ct1, ct2); - - Xtensive.Tuples.Tuple wtro = stro.Apply(TupleTransformType.TransformedTuple, t); - AssertEx.Throws(delegate { - wtro.SetValue(1, 1); - }); - } - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; - Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1, 2, 3, 4); - SegmentTransform st = new SegmentTransform(false, t.Descriptor, new Segment(1,2)); - Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, t); - Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, t); - Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, t); - Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, t); - int count = IterationCount; - - comparer.Equals(ct1, ct2); - comparer.Equals(ct1, wt1); - comparer.Equals(wt1, wt2); - - TestHelper.CollectGarbage(); - using (new Measurement("O&O", MeasurementOptions.Log, count)) - for (int i = 0; i(1,2)); + SegmentTransform stro = new SegmentTransform(true, t.Descriptor, new Segment(1,2)); + + Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, t); + TestLog.Info("Wrapper: {0}", wt1); + Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, t); + TestLog.Info("Copy: {0}", ct1); + Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, t); + Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, t); + + Assert.AreEqual(wt1, wt2); + Assert.AreEqual(wt2, ct1); + Assert.AreEqual(ct1, ct2); + + wt1.SetValue(1, 1); + Assert.AreEqual(t.GetValue(2), wt1.GetValue(1)); + Assert.AreEqual(wt1, wt2); + Assert.AreNotEqual(wt2, ct1); + Assert.AreEqual(ct1, ct2); + + ct1.SetValue(1, 1); + Assert.AreEqual(t.GetValue(2), ct1.GetValue(1)); + Assert.AreEqual(wt1, wt2); + Assert.AreEqual(wt2, ct1); + Assert.AreNotEqual(ct1, ct2); + + Xtensive.Tuples.Tuple wtro = stro.Apply(TupleTransformType.TransformedTuple, t); + AssertEx.Throws(delegate { + wtro.SetValue(1, 1); + }); + } + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + AdvancedComparerStruct comparer = AdvancedComparerStruct.Default; + Xtensive.Tuples.Tuple t = Xtensive.Tuples.Tuple.Create(1, 2, 3, 4); + SegmentTransform st = new SegmentTransform(false, t.Descriptor, new Segment(1,2)); + Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, t); + Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, t); + Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, t); + Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, t); + int count = IterationCount; + + comparer.Equals(ct1, ct2); + comparer.Equals(ct1, wt1); + comparer.Equals(wt1, wt2); + + TestHelper.CollectGarbage(); + using (new Measurement("O&O", MeasurementOptions.Log, count)) + for (int i = 0; i(0); - var hashCode = tuple.GetHashCode(); - } - - [Test] - public new void BehaviorTest() - { - base.BehaviorTest(); - } - - [Test] - public new void EmptyFieldsTest() - { - base.EmptyFieldsTest(); - } - - [Test] - public new void RandomTest() - { - base.RandomTest(); - } - - [Test] - public new void CopyTest() - { - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - int loopCount = 10; - int offset = random.Next(fieldTypes.Length); - Type[] sourceTypes; - - Type[] targetTypes = GetTestTypes(loopCount, out sourceTypes, offset); - - Xtensive.Tuples.Tuple source = Xtensive.Tuples.Tuple.Create(sourceTypes); - Xtensive.Tuples.Tuple target = Xtensive.Tuples.Tuple.Create(targetTypes); - Xtensive.Tuples.Tuple sameTypeTarget = Xtensive.Tuples.Tuple.Create(sourceTypes); - - PopulateData(sourceTypes, source); - PopulateData(targetTypes, target); - PopulateData(sourceTypes, sameTypeTarget); - - int startingIndex = random.Next(fieldTypes.Length * loopCount / 3) + fieldTypes.Length; - int startingTargetIndex = (random.Next(loopCount / 4) + 1) * fieldTypes.Length + offset + startingIndex % fieldTypes.Length; - int count = random.Next(fieldTypes.Length * loopCount / 4); - - source.CopyTo(target, startingIndex, startingTargetIndex, count); - - AssertAreSame(source, target, startingIndex, startingTargetIndex, count); - - source.CopyTo(sameTypeTarget, source.Count); - - AssertAreSame(source, sameTypeTarget); - - } - - private Type[] GetTestTypes(int loopCount, out Type[] sourceTypes, int offset) - { - sourceTypes = new Type[fieldTypes.Length * loopCount]; - Type[] targetTypes = new Type[fieldTypes.Length * loopCount]; - - - Array.Copy(fieldTypes, 0, targetTypes, 0, fieldTypes.Length); - Array.Copy(fieldTypes, 0, targetTypes, (loopCount - 1) * fieldTypes.Length, fieldTypes.Length); - for (int i = 0; i < loopCount; i++) { - Array.Copy(fieldTypes, 0, sourceTypes, i * fieldTypes.Length, fieldTypes.Length); - Array.Copy(fieldTypes, 0, targetTypes, i * fieldTypes.Length + offset, i + 1 == loopCount ? 0 : fieldTypes.Length); - } - return targetTypes; - } - - protected override Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor) - { - return Xtensive.Tuples.Tuple.Create(descriptor); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.01.24 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class TupleBehaviorTest : TupleBehaviorTestBase + { + [Test] + public void GetFieldStateTest() + { + Xtensive.Tuples.Tuple tuple = Xtensive.Tuples.Tuple.Create(typeof (string)); + TupleFieldState fieldState = tuple.GetFieldState(0); + Assert.IsTrue(Enum.IsDefined(typeof (TupleFieldState), fieldState)); + } + + [Test] + public new void Test() + { + base.Test(); + } + + enum TestEnum : sbyte + { + One = 5, + Two + } + + [Test] + public void EnumGetHashCodeTest() + { + var flag = BindingFlags.Instance; + var tuple = Xtensive.Tuples.Tuple.Create(flag); + var clone = tuple.Clone(); + Console.Out.WriteLine((int)flag); + Assert.AreEqual(tuple,clone); + var value = tuple.GetValue(0); + var hashCode = tuple.GetHashCode(); + } + + [Test] + public new void BehaviorTest() + { + base.BehaviorTest(); + } + + [Test] + public new void EmptyFieldsTest() + { + base.EmptyFieldsTest(); + } + + [Test] + public new void RandomTest() + { + base.RandomTest(); + } + + [Test] + public new void CopyTest() + { + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + int loopCount = 10; + int offset = random.Next(fieldTypes.Length); + Type[] sourceTypes; + + Type[] targetTypes = GetTestTypes(loopCount, out sourceTypes, offset); + + Xtensive.Tuples.Tuple source = Xtensive.Tuples.Tuple.Create(sourceTypes); + Xtensive.Tuples.Tuple target = Xtensive.Tuples.Tuple.Create(targetTypes); + Xtensive.Tuples.Tuple sameTypeTarget = Xtensive.Tuples.Tuple.Create(sourceTypes); + + PopulateData(sourceTypes, source); + PopulateData(targetTypes, target); + PopulateData(sourceTypes, sameTypeTarget); + + int startingIndex = random.Next(fieldTypes.Length * loopCount / 3) + fieldTypes.Length; + int startingTargetIndex = (random.Next(loopCount / 4) + 1) * fieldTypes.Length + offset + startingIndex % fieldTypes.Length; + int count = random.Next(fieldTypes.Length * loopCount / 4); + + source.CopyTo(target, startingIndex, startingTargetIndex, count); + + AssertAreSame(source, target, startingIndex, startingTargetIndex, count); + + source.CopyTo(sameTypeTarget, source.Count); + + AssertAreSame(source, sameTypeTarget); + + } + + private Type[] GetTestTypes(int loopCount, out Type[] sourceTypes, int offset) + { + sourceTypes = new Type[fieldTypes.Length * loopCount]; + Type[] targetTypes = new Type[fieldTypes.Length * loopCount]; + + + Array.Copy(fieldTypes, 0, targetTypes, 0, fieldTypes.Length); + Array.Copy(fieldTypes, 0, targetTypes, (loopCount - 1) * fieldTypes.Length, fieldTypes.Length); + for (int i = 0; i < loopCount; i++) { + Array.Copy(fieldTypes, 0, sourceTypes, i * fieldTypes.Length, fieldTypes.Length); + Array.Copy(fieldTypes, 0, targetTypes, i * fieldTypes.Length + offset, i + 1 == loopCount ? 0 : fieldTypes.Length); + } + return targetTypes; + } + + protected override Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor) + { + return Xtensive.Tuples.Tuple.Create(descriptor); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleBehaviorTestBase.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleBehaviorTestBase.cs index 4ab2f78dbe..1ef1abb0c1 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleBehaviorTestBase.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleBehaviorTestBase.cs @@ -1,227 +1,227 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2008.05.23 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Tuples; -using MethodInfo=System.Reflection.MethodInfo; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - public abstract class TupleBehaviorTestBase - { - protected static readonly Type[] fieldTypes = - new Type[]{ - typeof (int), - typeof (byte), - typeof (short), - typeof (string), - typeof (DateTime), - typeof (decimal), - typeof (float), - }; - - private const int MaxFieldCount = 100; - - protected abstract Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor); - - protected virtual Xtensive.Tuples.Tuple CreateTestTuple(Xtensive.Tuples.Tuple source) - { - return source; - } - - public void Test() - { - var types = Enumerable.Range(0, 4).Select(_ => typeof(short)).ToArray(); - var d = TupleDescriptor.Create(types); - var dummyTuple = new DummyTuple(d); - var tuple = CreateTestTuple(d); - PopulateData(types, dummyTuple, tuple); - AssertAreSame(dummyTuple, tuple); - } - - protected static void PopulateData(IList types, ITuple sourceTuple, ITuple tuple) - { - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - MethodInfo setValueMethodGeneric = - typeof(TupleBehaviorTestBase).GetMethod("SetValue", BindingFlags.NonPublic | BindingFlags.Static); - for (int fieldIndex = 0; fieldIndex < types.Count / 2; fieldIndex++) { - Type type = types[fieldIndex]; - MethodInfo setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); - setValueMethod.Invoke(null, new object[] { sourceTuple, tuple, fieldIndex, random }); - } - } - - protected static void PopulateData(IList types, Xtensive.Tuples.Tuple tuple) - { - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - MethodInfo setValueMethodGeneric = - typeof(TupleBehaviorTestBase).GetMethod("InternalSetValue", BindingFlags.NonPublic | BindingFlags.Static); - for (int fieldIndex = 0; fieldIndex < tuple.Count; fieldIndex++) { - Type type = types[fieldIndex % types.Count]; - MethodInfo setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); - setValueMethod.Invoke(null, new object[] { tuple, fieldIndex, random }); - } - } - - public void BehaviorTest() - { - var types = new Type[] {typeof(int), typeof(bool), typeof(string)}; - var d = TupleDescriptor.Create(types); - TestTuple(CreateTestTuple(d)); - TestTuple(new DummyTuple(d)); - } - - private static void TestTuple(Xtensive.Tuples.Tuple tuple) - { - Assert.IsFalse(tuple.GetFieldState(0).IsAvailable()); - - try { - tuple.GetFieldState(0).IsNull(); - throw new AssertionException("Value is not available. No one knows if it is null or not."); - } catch (InvalidOperationException) { - } - - tuple.SetValue(0, 1); - Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); - Assert.IsFalse(tuple.GetFieldState(0).IsNull()); - Assert.IsTrue(tuple.GetFieldState(0).HasValue()); - Assert.AreEqual(1, tuple.GetValue(0)); - Assert.AreEqual(1, tuple.GetValue(0)); - Assert.AreEqual(new int?(1), tuple.GetValue(0)); - - tuple.SetValue(0, null); - Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); - Assert.IsTrue(tuple.GetFieldState(0).IsNull()); - Assert.IsFalse(tuple.GetFieldState(0).HasValue()); - Assert.AreEqual(null, tuple.GetValue(0)); - Assert.AreEqual(null, tuple.GetValue(0)); - - tuple.SetValue(0, null); - Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); - Assert.IsTrue(tuple.GetFieldState(0).IsNull()); - Assert.IsFalse(tuple.GetFieldState(0).HasValue()); - Assert.AreEqual(null, tuple.GetValue(0)); - Assert.AreEqual(null, tuple.GetValue(0)); - Assert.AreEqual(null, tuple.GetValueOrDefault(0)); - Assert.AreEqual(null, tuple.GetValueOrDefault(0)); - - try { - tuple.GetValue(1); - throw new AssertionException("Value should not be available."); - } catch (InvalidOperationException) { - } - - try { - tuple.GetValue(2); - throw new AssertionException("Value should not be available."); - } catch (InvalidOperationException) { - } - - try { - tuple.GetValue(0); - throw new AssertionException("Null reference or Invalid cast exception should be thrown."); - } - catch (NullReferenceException) {} - catch (InvalidCastException) {} - - Assert.IsTrue(tuple.Equals(tuple)); - } - - public void EmptyFieldsTest() - { - var d = TupleDescriptor.Create(Array.Empty()); - var dummyTuple = new DummyTuple(d); - var tuple = CreateTestTuple(d); - Assert.AreEqual(0, tuple.Count); - } - - public void RandomTest() - { - const int IterationCount = 10; - int iteration = 0; - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - - MethodInfo setValueMethodGeneric = - typeof(TupleBehaviorTestBase).GetMethod("SetValue", BindingFlags.NonPublic | BindingFlags.Static); - IList descriptorList = new List(); - - while (iteration++ < IterationCount) { - var fieldCount = random.Next(0, MaxFieldCount); - var types = new List(fieldCount); - for (int i = 0; i < fieldCount; i++) - types.Add(fieldTypes[random.Next(0, fieldTypes.Length - 1)]); - var d = TupleDescriptor.Create(types.ToArray()); - descriptorList.Add(d); - } - - foreach (TupleDescriptor descriptor in descriptorList) { - var dummyTuple = new DummyTuple(descriptor); - var tuple = CreateTestTuple(descriptor); - for (int fieldIndex = 0; fieldIndex < tuple.Count / 2; fieldIndex++) { - var type = descriptor[fieldIndex]; - var setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); - setValueMethod.Invoke(null, new object[] { dummyTuple, tuple, fieldIndex, random }); - } - AssertAreSame(dummyTuple, tuple); - } - } - - protected void AssertAreSame(ITuple dummyTuple, ITuple tuple) - { - for (int i = 0; i < dummyTuple.Count; i++) { - bool available = dummyTuple.GetFieldState(i).IsAvailable(); - try { - Assert.AreEqual(available, tuple.GetFieldState(i).IsAvailable()); - } - catch (AssertionException) - { - Console.Out.WriteLine(string.Format("Tuple type: {0}", tuple.GetType().Name)); - Console.Out.WriteLine(string.Format("Field Index: {0}", i)); - Console.Out.WriteLine(); - } - - } - Assert.AreEqual(dummyTuple.GetHashCode(), tuple.GetHashCode()); - Assert.IsTrue(dummyTuple.Equals(tuple)); - Assert.IsTrue(tuple.Equals(dummyTuple)); - } - - protected void AssertAreSame(ITuple source, ITuple target, int startIndex, int targetStartIndex, int count) - { - for (int i = 0; i < count; i++) { - bool available = source.GetFieldState(i + startIndex).IsAvailable(); - try { - Assert.AreEqual(available, target.GetFieldState(i + targetStartIndex).IsAvailable()); - Assert.AreEqual(source.GetValue(i + startIndex), target.GetValue(i + targetStartIndex)); - } - catch (AssertionException) { - Console.Out.WriteLine(string.Format("Tuple type: {0}", target.GetType().Name)); - Console.Out.WriteLine(string.Format("Field Index: {0}", i)); - Console.Out.WriteLine(); - } - } - } - - private static void SetValue(ITuple dummyTuple, ITuple tuple, int fieldIndex, Random random) - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - T instance = generator.GetInstance(random); - dummyTuple.SetValue(fieldIndex, instance); - tuple.SetValue(fieldIndex, instance); - } - - private static void InternalSetValue(Xtensive.Tuples.Tuple tuple, int fieldIndex, Random random) - { - IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); - T instance = generator.GetInstance(random); - tuple.SetValue(fieldIndex, instance); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2008.05.23 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Tuples; +using MethodInfo=System.Reflection.MethodInfo; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + public abstract class TupleBehaviorTestBase + { + protected static readonly Type[] fieldTypes = + new Type[]{ + typeof (int), + typeof (byte), + typeof (short), + typeof (string), + typeof (DateTime), + typeof (decimal), + typeof (float), + }; + + private const int MaxFieldCount = 100; + + protected abstract Xtensive.Tuples.Tuple CreateTestTuple(TupleDescriptor descriptor); + + protected virtual Xtensive.Tuples.Tuple CreateTestTuple(Xtensive.Tuples.Tuple source) + { + return source; + } + + public void Test() + { + var types = Enumerable.Range(0, 4).Select(_ => typeof(short)).ToArray(); + var d = TupleDescriptor.Create(types); + var dummyTuple = new DummyTuple(d); + var tuple = CreateTestTuple(d); + PopulateData(types, dummyTuple, tuple); + AssertAreSame(dummyTuple, tuple); + } + + protected static void PopulateData(IList types, ITuple sourceTuple, ITuple tuple) + { + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + MethodInfo setValueMethodGeneric = + typeof(TupleBehaviorTestBase).GetMethod("SetValue", BindingFlags.NonPublic | BindingFlags.Static); + for (int fieldIndex = 0; fieldIndex < types.Count / 2; fieldIndex++) { + Type type = types[fieldIndex]; + MethodInfo setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); + setValueMethod.Invoke(null, new object[] { sourceTuple, tuple, fieldIndex, random }); + } + } + + protected static void PopulateData(IList types, Xtensive.Tuples.Tuple tuple) + { + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + MethodInfo setValueMethodGeneric = + typeof(TupleBehaviorTestBase).GetMethod("InternalSetValue", BindingFlags.NonPublic | BindingFlags.Static); + for (int fieldIndex = 0; fieldIndex < tuple.Count; fieldIndex++) { + Type type = types[fieldIndex % types.Count]; + MethodInfo setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); + setValueMethod.Invoke(null, new object[] { tuple, fieldIndex, random }); + } + } + + public void BehaviorTest() + { + var types = new Type[] {typeof(int), typeof(bool), typeof(string)}; + var d = TupleDescriptor.Create(types); + TestTuple(CreateTestTuple(d)); + TestTuple(new DummyTuple(d)); + } + + private static void TestTuple(Xtensive.Tuples.Tuple tuple) + { + Assert.IsFalse(tuple.GetFieldState(0).IsAvailable()); + + try { + tuple.GetFieldState(0).IsNull(); + throw new AssertionException("Value is not available. No one knows if it is null or not."); + } catch (InvalidOperationException) { + } + + tuple.SetValue(0, 1); + Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); + Assert.IsFalse(tuple.GetFieldState(0).IsNull()); + Assert.IsTrue(tuple.GetFieldState(0).HasValue()); + Assert.AreEqual(1, tuple.GetValue(0)); + Assert.AreEqual(1, tuple.GetValue(0)); + Assert.AreEqual(new int?(1), tuple.GetValue(0)); + + tuple.SetValue(0, null); + Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); + Assert.IsTrue(tuple.GetFieldState(0).IsNull()); + Assert.IsFalse(tuple.GetFieldState(0).HasValue()); + Assert.AreEqual(null, tuple.GetValue(0)); + Assert.AreEqual(null, tuple.GetValue(0)); + + tuple.SetValue(0, null); + Assert.IsTrue(tuple.GetFieldState(0).IsAvailable()); + Assert.IsTrue(tuple.GetFieldState(0).IsNull()); + Assert.IsFalse(tuple.GetFieldState(0).HasValue()); + Assert.AreEqual(null, tuple.GetValue(0)); + Assert.AreEqual(null, tuple.GetValue(0)); + Assert.AreEqual(null, tuple.GetValueOrDefault(0)); + Assert.AreEqual(null, tuple.GetValueOrDefault(0)); + + try { + tuple.GetValue(1); + throw new AssertionException("Value should not be available."); + } catch (InvalidOperationException) { + } + + try { + tuple.GetValue(2); + throw new AssertionException("Value should not be available."); + } catch (InvalidOperationException) { + } + + try { + tuple.GetValue(0); + throw new AssertionException("Null reference or Invalid cast exception should be thrown."); + } + catch (NullReferenceException) {} + catch (InvalidCastException) {} + + Assert.IsTrue(tuple.Equals(tuple)); + } + + public void EmptyFieldsTest() + { + var d = TupleDescriptor.Create(Array.Empty()); + var dummyTuple = new DummyTuple(d); + var tuple = CreateTestTuple(d); + Assert.AreEqual(0, tuple.Count); + } + + public void RandomTest() + { + const int IterationCount = 10; + int iteration = 0; + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + + MethodInfo setValueMethodGeneric = + typeof(TupleBehaviorTestBase).GetMethod("SetValue", BindingFlags.NonPublic | BindingFlags.Static); + IList descriptorList = new List(); + + while (iteration++ < IterationCount) { + var fieldCount = random.Next(0, MaxFieldCount); + var types = new List(fieldCount); + for (int i = 0; i < fieldCount; i++) + types.Add(fieldTypes[random.Next(0, fieldTypes.Length - 1)]); + var d = TupleDescriptor.Create(types.ToArray()); + descriptorList.Add(d); + } + + foreach (TupleDescriptor descriptor in descriptorList) { + var dummyTuple = new DummyTuple(descriptor); + var tuple = CreateTestTuple(descriptor); + for (int fieldIndex = 0; fieldIndex < tuple.Count / 2; fieldIndex++) { + var type = descriptor[fieldIndex]; + var setValueMethod = setValueMethodGeneric.MakeGenericMethod(type); + setValueMethod.Invoke(null, new object[] { dummyTuple, tuple, fieldIndex, random }); + } + AssertAreSame(dummyTuple, tuple); + } + } + + protected void AssertAreSame(ITuple dummyTuple, ITuple tuple) + { + for (int i = 0; i < dummyTuple.Count; i++) { + bool available = dummyTuple.GetFieldState(i).IsAvailable(); + try { + Assert.AreEqual(available, tuple.GetFieldState(i).IsAvailable()); + } + catch (AssertionException) + { + Console.Out.WriteLine(string.Format("Tuple type: {0}", tuple.GetType().Name)); + Console.Out.WriteLine(string.Format("Field Index: {0}", i)); + Console.Out.WriteLine(); + } + + } + Assert.AreEqual(dummyTuple.GetHashCode(), tuple.GetHashCode()); + Assert.IsTrue(dummyTuple.Equals(tuple)); + Assert.IsTrue(tuple.Equals(dummyTuple)); + } + + protected void AssertAreSame(ITuple source, ITuple target, int startIndex, int targetStartIndex, int count) + { + for (int i = 0; i < count; i++) { + bool available = source.GetFieldState(i + startIndex).IsAvailable(); + try { + Assert.AreEqual(available, target.GetFieldState(i + targetStartIndex).IsAvailable()); + Assert.AreEqual(source.GetValue(i + startIndex), target.GetValue(i + targetStartIndex)); + } + catch (AssertionException) { + Console.Out.WriteLine(string.Format("Tuple type: {0}", target.GetType().Name)); + Console.Out.WriteLine(string.Format("Field Index: {0}", i)); + Console.Out.WriteLine(); + } + } + } + + private static void SetValue(ITuple dummyTuple, ITuple tuple, int fieldIndex, Random random) + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + T instance = generator.GetInstance(random); + dummyTuple.SetValue(fieldIndex, instance); + tuple.SetValue(fieldIndex, instance); + } + + private static void InternalSetValue(Xtensive.Tuples.Tuple tuple, int fieldIndex, Random random) + { + IInstanceGenerator generator = InstanceGeneratorProvider.Default.GetInstanceGenerator(); + T instance = generator.GetInstance(random); + tuple.SetValue(fieldIndex, instance); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleComparerTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleComparerTest.cs index d7b9de764e..57d642c12a 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleComparerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleComparerTest.cs @@ -1,212 +1,212 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2007.08.23 - -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class TupleComparerTest - { - private Type[] types1 = new Type[] { typeof(int), typeof(string) }; - private Type[] types2 = new Type[] { typeof(int), typeof(string), typeof(DateTime) }; - - private readonly AdvancedComparer advancedComparer = AdvancedComparer.Default; - private readonly IEqualityComparer equalityComparer = EqualityComparer.Default; - private readonly IComparer comparer = Comparer.Default; - - bool ManualEquals(Xtensive.Tuples.Tuple x, Xtensive.Tuples.Tuple y) - { - if (y != null) { - TupleFieldState state; - TupleFieldState state2; - if (x == y) - return true; - if (x.Descriptor != y.Descriptor) - return false; - var flag = x.GetValue(0, out state) == y.GetValue(0, out state2); - if ((state == state2) && ((state != TupleFieldState.Available) || flag)) - return true; - } - return false; - } - - [Test] - public void EqualityTest() - { - var x = Xtensive.Tuples.Tuple.Create(10); - var y = Xtensive.Tuples.Tuple.Create(10); - Assert.IsTrue(ManualEquals(x,y)); - Assert.AreEqual(x,y); - } - - [Test] - public void EmptyTupleTest() - { - Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(new Type[] {}); - Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(new Type[] {}); - - CheckComparisons(tuple1, tuple2, 0); - CheckComparisons(tuple1, tuple1, 0); - } - - [Test] - public void DifferentSizeAndTypeTest() - { - CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create("1"), -1); - CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create(1, "1"), -1); - CheckComparisons(Xtensive.Tuples.Tuple.Create(0), Xtensive.Tuples.Tuple.Create(1, "1"), -1); - CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create(0, "1"), 1); - } - - [Test] - public void DebugTest() - { - Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(types1); - Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(types2); - - tuple1.SetValue(1, "test"); // null-"test" null-null-null - tuple2.SetValue(1, "test"); // null-"test" null-"test"-null - CheckComparisons(tuple1, tuple2, -1);; - } - - [Test] - public void BaseTest() - { - Assert.AreEqual("TupleComparer", advancedComparer.Implementation.GetType().Name); - - Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(types1); - Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(types2); - - CheckComparisons(tuple1, tuple1, 0); - CheckComparisons(tuple1, tuple2, -1); - - // Same length - tuple1 = Xtensive.Tuples.Tuple.Create(types1); - tuple2 = Xtensive.Tuples.Tuple.Create(types1); - - CheckComparisons(tuple1, tuple2, 0); - - tuple1.SetValue(1, "test"); // null-"test" null-null - CheckComparisons(tuple1, tuple2, 1); - - tuple2.SetValue(1, "test"); // null-"test" null-"test" - CheckComparisons(tuple1, tuple2, 0); - - tuple2.SetValue(1, null); // null-"test" null-null - CheckComparisons(tuple1, tuple2, 1); - - tuple1.SetValue(0, 123); // 123-"test" null-null - CheckComparisons(tuple1, tuple2, 1); - - tuple2.SetValue(0, 123); // 123-"test" 123-null - CheckComparisons(tuple1, tuple2, 1); - - tuple2.SetValue(1, "test"); - tuple1.SetValue(1, null); // 123-null 123-"test" - CheckComparisons(tuple1, tuple2, -1); - } - - [Test] - public void GuidTupleEqualsTest() - { - var guid1 = Guid.NewGuid(); - var guid2 = Guid.NewGuid(); - Assert.IsFalse(guid1.Equals(guid2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(guid1); - var tuple2 = Xtensive.Tuples.Tuple.Create(guid2); - var condition = tuple1.Equals(tuple2); - Assert.IsFalse(condition); - } - - [Test] - public void DateTimeTupleEqualsTest() - { - var dateTime1 = DateTime.Now; - var dateTime2 = dateTime1.AddMinutes(1); - Assert.IsFalse(dateTime1.Equals(dateTime2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(dateTime1); - var tuple2 = Xtensive.Tuples.Tuple.Create(dateTime2); - Assert.IsFalse(tuple1.Equals(tuple2)); - } - - [Test] - public void TimeSpanTupleEqualsTest() - { - var timeSpan1 = TimeSpan.FromMinutes(10); - var timeSpan2 = TimeSpan.FromMinutes(15); - Assert.IsFalse(timeSpan1.Equals(timeSpan2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(timeSpan1); - var tuple2 = Xtensive.Tuples.Tuple.Create(timeSpan2); - Assert.IsFalse(tuple1.Equals(tuple2)); - } - - [Test] - public void IntTupleEqualsTest() - { - var int1 = 10; - var int2 = 15; - Assert.IsFalse(int1.Equals(int2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(int1); - var tuple2 = Xtensive.Tuples.Tuple.Create(int2); - Assert.IsFalse(tuple1.Equals(tuple2)); - } - - [Test] - public void CharTupleEqualsTest() - { - var char1 = 'a'; - var char2 = 'b'; - Assert.IsFalse(char1.Equals(char2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(char1); - var tuple2 = Xtensive.Tuples.Tuple.Create(char2); - Assert.IsFalse(tuple1.Equals(tuple2)); - } - - [Test] - public void StringTupleEqualsTest() - { - var string1 = "a"; - var string2 = "b"; - Assert.IsFalse(string1.Equals(string2)); - var tuple1 = Xtensive.Tuples.Tuple.Create(string1); - var tuple2 = Xtensive.Tuples.Tuple.Create(string2); - Assert.IsFalse(tuple1.Equals(tuple2)); - } - - private void CheckComparisons(Xtensive.Tuples.Tuple x, Xtensive.Tuples.Tuple y, int expectedResult) - { - expectedResult = Normalize(expectedResult); - bool boolResult = expectedResult==0; - Assert.AreEqual(boolResult, x.Equals(y)); - Assert.AreEqual(boolResult, equalityComparer.Equals(x, y)); - Assert.AreEqual(boolResult, advancedComparer.Equals(x, y)); - - // Reverse - expectedResult *= -1; - Assert.AreEqual(boolResult, equalityComparer.Equals(y, x)); - Assert.AreEqual(boolResult, y.Equals(x)); - Assert.AreEqual(boolResult, advancedComparer.Equals(y, x)); - } - - private static int Normalize(int i) - { - if (i<0) - return -1; - else if (i>0) - return 1; - else - return 0; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2007.08.23 + +using System; +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class TupleComparerTest + { + private Type[] types1 = new Type[] { typeof(int), typeof(string) }; + private Type[] types2 = new Type[] { typeof(int), typeof(string), typeof(DateTime) }; + + private readonly AdvancedComparer advancedComparer = AdvancedComparer.Default; + private readonly IEqualityComparer equalityComparer = EqualityComparer.Default; + private readonly IComparer comparer = Comparer.Default; + + bool ManualEquals(Xtensive.Tuples.Tuple x, Xtensive.Tuples.Tuple y) + { + if (y != null) { + TupleFieldState state; + TupleFieldState state2; + if (x == y) + return true; + if (x.Descriptor != y.Descriptor) + return false; + var flag = x.GetValue(0, out state) == y.GetValue(0, out state2); + if ((state == state2) && ((state != TupleFieldState.Available) || flag)) + return true; + } + return false; + } + + [Test] + public void EqualityTest() + { + var x = Xtensive.Tuples.Tuple.Create(10); + var y = Xtensive.Tuples.Tuple.Create(10); + Assert.IsTrue(ManualEquals(x,y)); + Assert.AreEqual(x,y); + } + + [Test] + public void EmptyTupleTest() + { + Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(new Type[] {}); + Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(new Type[] {}); + + CheckComparisons(tuple1, tuple2, 0); + CheckComparisons(tuple1, tuple1, 0); + } + + [Test] + public void DifferentSizeAndTypeTest() + { + CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create("1"), -1); + CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create(1, "1"), -1); + CheckComparisons(Xtensive.Tuples.Tuple.Create(0), Xtensive.Tuples.Tuple.Create(1, "1"), -1); + CheckComparisons(Xtensive.Tuples.Tuple.Create(1), Xtensive.Tuples.Tuple.Create(0, "1"), 1); + } + + [Test] + public void DebugTest() + { + Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(types1); + Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(types2); + + tuple1.SetValue(1, "test"); // null-"test" null-null-null + tuple2.SetValue(1, "test"); // null-"test" null-"test"-null + CheckComparisons(tuple1, tuple2, -1);; + } + + [Test] + public void BaseTest() + { + Assert.AreEqual("TupleComparer", advancedComparer.Implementation.GetType().Name); + + Xtensive.Tuples.Tuple tuple1 = Xtensive.Tuples.Tuple.Create(types1); + Xtensive.Tuples.Tuple tuple2 = Xtensive.Tuples.Tuple.Create(types2); + + CheckComparisons(tuple1, tuple1, 0); + CheckComparisons(tuple1, tuple2, -1); + + // Same length + tuple1 = Xtensive.Tuples.Tuple.Create(types1); + tuple2 = Xtensive.Tuples.Tuple.Create(types1); + + CheckComparisons(tuple1, tuple2, 0); + + tuple1.SetValue(1, "test"); // null-"test" null-null + CheckComparisons(tuple1, tuple2, 1); + + tuple2.SetValue(1, "test"); // null-"test" null-"test" + CheckComparisons(tuple1, tuple2, 0); + + tuple2.SetValue(1, null); // null-"test" null-null + CheckComparisons(tuple1, tuple2, 1); + + tuple1.SetValue(0, 123); // 123-"test" null-null + CheckComparisons(tuple1, tuple2, 1); + + tuple2.SetValue(0, 123); // 123-"test" 123-null + CheckComparisons(tuple1, tuple2, 1); + + tuple2.SetValue(1, "test"); + tuple1.SetValue(1, null); // 123-null 123-"test" + CheckComparisons(tuple1, tuple2, -1); + } + + [Test] + public void GuidTupleEqualsTest() + { + var guid1 = Guid.NewGuid(); + var guid2 = Guid.NewGuid(); + Assert.IsFalse(guid1.Equals(guid2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(guid1); + var tuple2 = Xtensive.Tuples.Tuple.Create(guid2); + var condition = tuple1.Equals(tuple2); + Assert.IsFalse(condition); + } + + [Test] + public void DateTimeTupleEqualsTest() + { + var dateTime1 = DateTime.Now; + var dateTime2 = dateTime1.AddMinutes(1); + Assert.IsFalse(dateTime1.Equals(dateTime2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(dateTime1); + var tuple2 = Xtensive.Tuples.Tuple.Create(dateTime2); + Assert.IsFalse(tuple1.Equals(tuple2)); + } + + [Test] + public void TimeSpanTupleEqualsTest() + { + var timeSpan1 = TimeSpan.FromMinutes(10); + var timeSpan2 = TimeSpan.FromMinutes(15); + Assert.IsFalse(timeSpan1.Equals(timeSpan2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(timeSpan1); + var tuple2 = Xtensive.Tuples.Tuple.Create(timeSpan2); + Assert.IsFalse(tuple1.Equals(tuple2)); + } + + [Test] + public void IntTupleEqualsTest() + { + var int1 = 10; + var int2 = 15; + Assert.IsFalse(int1.Equals(int2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(int1); + var tuple2 = Xtensive.Tuples.Tuple.Create(int2); + Assert.IsFalse(tuple1.Equals(tuple2)); + } + + [Test] + public void CharTupleEqualsTest() + { + var char1 = 'a'; + var char2 = 'b'; + Assert.IsFalse(char1.Equals(char2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(char1); + var tuple2 = Xtensive.Tuples.Tuple.Create(char2); + Assert.IsFalse(tuple1.Equals(tuple2)); + } + + [Test] + public void StringTupleEqualsTest() + { + var string1 = "a"; + var string2 = "b"; + Assert.IsFalse(string1.Equals(string2)); + var tuple1 = Xtensive.Tuples.Tuple.Create(string1); + var tuple2 = Xtensive.Tuples.Tuple.Create(string2); + Assert.IsFalse(tuple1.Equals(tuple2)); + } + + private void CheckComparisons(Xtensive.Tuples.Tuple x, Xtensive.Tuples.Tuple y, int expectedResult) + { + expectedResult = Normalize(expectedResult); + bool boolResult = expectedResult==0; + Assert.AreEqual(boolResult, x.Equals(y)); + Assert.AreEqual(boolResult, equalityComparer.Equals(x, y)); + Assert.AreEqual(boolResult, advancedComparer.Equals(x, y)); + + // Reverse + expectedResult *= -1; + Assert.AreEqual(boolResult, equalityComparer.Equals(y, x)); + Assert.AreEqual(boolResult, y.Equals(x)); + Assert.AreEqual(boolResult, advancedComparer.Equals(y, x)); + } + + private static int Normalize(int i) + { + if (i<0) + return -1; + else if (i>0) + return 1; + else + return 0; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleDescriptorTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleDescriptorTest.cs index c0c74e6d67..2267ad2118 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleDescriptorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleDescriptorTest.cs @@ -1,135 +1,135 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.25 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Tuples; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class TupleDescriptorTest - { - public static readonly Type[] FieldTypes = new Type[] { - typeof (bool), - typeof (bool?), - typeof (byte), - typeof (byte?), - typeof (sbyte), - typeof (sbyte?), - typeof (char), - typeof (char?), - typeof (short), - typeof (short?), - typeof (int), - typeof (int?), - typeof (long), - typeof (long?), - typeof (float), - typeof (float?), - typeof (double), - typeof (double?), - typeof (KeyValuePair), - typeof (KeyValuePair), - typeof (KeyValuePair), - typeof (KeyValuePair), - typeof (KeyValuePair?), - typeof (KeyValuePair?), - typeof (KeyValuePair?), - typeof (KeyValuePair?), - typeof (string) - }; - - [Test] - [Explicit] - [Category("Performance")] - public void PerformanceTest() - { - var rnd = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - var count = 100; - var types = new List(); - var descriptors = new List(); - using (new Measurement("Creating descriptors {T1}, {T1,T2}, ...", count)) { - for (var i = 0; i(size); - for (var j = 0; j < size; j++) - types.Add(FieldTypes[rnd.Next(FieldTypes.Length)]); - descriptors.Add(TupleDescriptor.Create(types.ToArray())); - } - } - - count = 100000; - size = 10; - types = new List(size); - for (var j = 0; j < size; j++) - types.Add(FieldTypes[rnd.Next(FieldTypes.Length)]); - using (new Measurement("Creating the same descriptor", count)) { - for (var i = 0; i), + typeof (KeyValuePair), + typeof (KeyValuePair), + typeof (KeyValuePair), + typeof (KeyValuePair?), + typeof (KeyValuePair?), + typeof (KeyValuePair?), + typeof (KeyValuePair?), + typeof (string) + }; + + [Test] + [Explicit] + [Category("Performance")] + public void PerformanceTest() + { + var rnd = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + var count = 100; + var types = new List(); + var descriptors = new List(); + using (new Measurement("Creating descriptors {T1}, {T1,T2}, ...", count)) { + for (var i = 0; i(size); + for (var j = 0; j < size; j++) + types.Add(FieldTypes[rnd.Next(FieldTypes.Length)]); + descriptors.Add(TupleDescriptor.Create(types.ToArray())); + } + } + + count = 100000; + size = 10; + types = new List(size); + for (var j = 0; j < size; j++) + types.Add(FieldTypes[rnd.Next(FieldTypes.Length)]); + using (new Measurement("Creating the same descriptor", count)) { + for (var i = 0; i), - typeof (string), - }; - - private static readonly Type[] shortFieldTypes = - new Type[] { - typeof (int), - }; - - private static readonly Type[] typicalFieldTypes = - new Type[] { - typeof (long), - typeof (int), - typeof (string), - }; - - [Test] - public void BasicTest() - { - var t = Tuple.Create(TupleDescriptor.Create(new [] { - typeof(string), typeof(int), typeof(string), - typeof(TimeSpan), typeof(string), typeof(string) - })); - t.SetValue(0, string.Empty); - t.SetValue(2, "n\\a"); - t.SetValue(3, new TimeSpan()); - t.SetValue(4, null); - t.SetValue(5, "null"); - - var s = t.Format(); - var tt = Xtensive.Tuples.Tuple.Parse(t.Descriptor, s); - - Assert.AreEqual(t, tt); - } - - - [Test] - [Explicit, Category("Performance")] - public void GeneratorTest() - { - const int fieldCount = 10; - const int iterationCount = 100; - int iteration = 0; - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - using (new Measurement("Random Tuple generation", iterationCount)) { - while (iteration++ < iterationCount) { - var fieldTypes = new List(); - for (int i = 0; i < fieldCount; i++) - fieldTypes.Add(allFieldTypes[random.Next(allFieldTypes.Length)]); - var d = TupleDescriptor.Create(fieldTypes.ToArray()); - var tuple = Tuple.Create(d); - } - } - } - - [Test] - [Explicit, Category("Profile")] - public void ProfileIntFieldAccessTest() - { - const int iterationCount = 10000000; - TupleDescriptor descriptor = TupleDescriptor.Create(shortFieldTypes); - Tuple tuple = Tuple.Create(descriptor); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, (object) i); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, i); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, i); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - } - - [Test] - [Explicit, Category("Profile")] - public void ProfileDecimalFieldAccessTest() - { - const int iterationCount = 10000000; - TupleDescriptor descriptor = TupleDescriptor.Create(); - Tuple tuple = Tuple.Create(descriptor); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, (object) (decimal) i); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, (decimal) i); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, i); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - } - - [Test] - [Explicit, Category("Profile")] - public void ProfileGuidFieldAccessTest() - { - const int iterationCount = 10000000; - TupleDescriptor descriptor = TupleDescriptor.Create(); - Tuple tuple = Tuple.Create(descriptor); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, Guid.Empty); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, Guid.Empty); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, Guid.Empty); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - } - - [Test] - [Explicit, Category("Performance")] - public void FieldAccessTest() - { - const int iterationCount = 10000000; - TupleDescriptor descriptor = TupleDescriptor.Create(shortFieldTypes); - Tuple tuple = Tuple.Create(descriptor); - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, (object) i); - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, i); - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - - using (new Measurement("Tuple.SetValue?", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, null); - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, (object) i); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValueOrDefault(0); - - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, i); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValueOrDefault(0); - - using (new Measurement("Tuple.SetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.SetValue(0, new int?(i)); - using (new Measurement("Tuple.GetValue", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValue(0); - using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - TupleFieldState state; - tuple.GetValue(0, out state); - } - using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.GetValueOrDefault(0); - } - - [Test] - [Explicit, Category("Performance")] - public void CreateExistingTupleTest() - { - const int iterationCount = 10000000; - TupleDescriptor descriptor = TupleDescriptor.Create(typicalFieldTypes); - Xtensive.Tuples.Tuple tuple = Xtensive.Tuples.Tuple.Create(descriptor); - using (new Measurement("CreateNew", iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.CreateNew(); - using (new Measurement("TupleDescriptor.CreateTuple", iterationCount)) - for (int i = 0; i < iterationCount; i++) - Xtensive.Tuples.Tuple.Create(descriptor); - } - - [Test] - [Explicit, Category("Performance")] - public void CopyToTest() - { - const int iterationCount = 10000000; - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - Xtensive.Tuples.Tuple tuple = Xtensive.Tuples.Tuple.Create(10, 20, 234.456f, 2345.34534d, "aaaaaaaaaaa", DateTime.Now); - var hashCode = tuple.GetHashCode(); - var copy = tuple.CreateNew(); - - // Warmup - for (int i = 0; i < iterationCount / 10; i++) - tuple.CopyTo(copy); - - // Actual run - TestHelper.CollectGarbage(true); - // TestLog.Info("Get ready..."); - using (new Measurement("Copying tuples", MeasurementOptions.Log, iterationCount)) { - for (int i = 0; i < iterationCount; i++) - tuple.CopyTo(copy); - } - } - - [Test] - [Explicit, Category("Performance")] - public void EqualsTest() - { - const int iterationCount = 10000000; - Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); - var tuple = Xtensive.Tuples.Tuple.Create(10, 20, 234.456f, 2345.34534d, "aaaaaaaaaaa", DateTime.Now); - var clone = tuple.Clone(); - Assert.AreEqual(tuple.GetHashCode(), clone.GetHashCode()); - var equals = AdvancedComparer.System.Equals; - - // Warmup - for (int i = 0; i < iterationCount / 10; i++) { - tuple.Equals(clone); - equals(tuple, clone); - } - - // Actual run - TestHelper.CollectGarbage(true); - // TestLog.Info("Get ready..."); - using (new Measurement("Comparing using AdvancedComparer tuples", MeasurementOptions.Log, iterationCount)) - for (int i = 0; i < iterationCount; i++) - equals(tuple, clone); - using (new Measurement("Comparing using Equals tuples", MeasurementOptions.Log, iterationCount)) - for (int i = 0; i < iterationCount; i++) - tuple.Equals(clone); - } - - [Test] - [Explicit, Category("Performance")] - public void MemoryUsageTest() - { - const int iterationCount = 1000000; - var descriptor = TupleDescriptor.Create(typicalFieldTypes); - var tuple = Xtensive.Tuples.Tuple.Create(descriptor); - var dummyTuple = new DummyTuple(descriptor); - var tuplesList = new List(iterationCount); - - int iteration = 0; - using (new Measurement("DummyTuple memory usage", iterationCount)) - while (iteration++ <= iterationCount) - tuplesList.Add(dummyTuple.CreateNew()); - tuplesList.Clear(); - TestHelper.CollectGarbage(true); - iteration = 0; - using (new Measurement("Tuple memory usage", iterationCount)) - while (iteration++ <= iterationCount) - tuplesList.Add(tuple.CreateNew()); - } - - [Test] - [Explicit, Category("Performance")] - public void FormatTest() - { - const int iterationCount = 1000000; - var output = new List(iterationCount); - - var descriptor = TupleDescriptor.Create(typicalFieldTypes); - var tuple = Tuple.Create(descriptor); - tuple.SetValue(0, 123L); - tuple.SetValue(2, "hello"); - - using (new Measurement("Format", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - var formatted = tuple.Format(); - output.Add(formatted); - } - } - - [Test] - [Explicit, Category("Performance")] - public void ParseTest() - { - const int iterationCount = 1000000; - var output = new List(iterationCount); - - var descriptor = TupleDescriptor.Create(typicalFieldTypes); - var tuple = Tuple.Create(descriptor); - tuple.SetValue(0, 123L); - tuple.SetValue(2, "hello"); - var source = tuple.Format(); - - using (new Measurement("Parse", iterationCount)) - for (int i = 0; i < iterationCount; i++) { - var parsed = descriptor.Parse(source); - output.Add(parsed); - } - } - - [Test] - [Explicit, Category("Performance")] - public void GeneratorAdvancedTest() - { - var types = new[] { - typeof (int), - typeof (long), - typeof (float), - typeof (double), - typeof (string), - typeof (DateTime), - typeof (TimeSpan), - typeof (byte[]) - }; - - var sizeRandomizer = new Random(); - var typeRandomizer = new Random(); - - const int maxSize = 30; - const int runCount = 10000; - - using (new Measurement("Create tuple with random descriptor", runCount)) - for (int i = 0; i < runCount; i++) { - var count = sizeRandomizer.Next(maxSize + 1); - var tupleTypes = Enumerable.Repeat(0, count) - .Select(_ => types[typeRandomizer.Next(types.Length)]) - .ToArray(count); - var descriptor = TupleDescriptor.Create(tupleTypes); - var tuple = Tuple.Create(descriptor); - } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class TuplePerformanceTest + { + private static readonly Type[] allFieldTypes = + new Type[] { + typeof (bool), + typeof (byte), + typeof (sbyte), + typeof (char), + typeof (short), + typeof (int), + typeof (long), + typeof (float), + typeof (double), + typeof (Guid), + typeof (DateTime), + typeof (KeyValuePair), + typeof (string), + }; + + private static readonly Type[] shortFieldTypes = + new Type[] { + typeof (int), + }; + + private static readonly Type[] typicalFieldTypes = + new Type[] { + typeof (long), + typeof (int), + typeof (string), + }; + + [Test] + public void BasicTest() + { + var t = Tuple.Create(TupleDescriptor.Create(new [] { + typeof(string), typeof(int), typeof(string), + typeof(TimeSpan), typeof(string), typeof(string) + })); + t.SetValue(0, string.Empty); + t.SetValue(2, "n\\a"); + t.SetValue(3, new TimeSpan()); + t.SetValue(4, null); + t.SetValue(5, "null"); + + var s = t.Format(); + var tt = Xtensive.Tuples.Tuple.Parse(t.Descriptor, s); + + Assert.AreEqual(t, tt); + } + + + [Test] + [Explicit, Category("Performance")] + public void GeneratorTest() + { + const int fieldCount = 10; + const int iterationCount = 100; + int iteration = 0; + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + using (new Measurement("Random Tuple generation", iterationCount)) { + while (iteration++ < iterationCount) { + var fieldTypes = new List(); + for (int i = 0; i < fieldCount; i++) + fieldTypes.Add(allFieldTypes[random.Next(allFieldTypes.Length)]); + var d = TupleDescriptor.Create(fieldTypes.ToArray()); + var tuple = Tuple.Create(d); + } + } + } + + [Test] + [Explicit, Category("Profile")] + public void ProfileIntFieldAccessTest() + { + const int iterationCount = 10000000; + TupleDescriptor descriptor = TupleDescriptor.Create(shortFieldTypes); + Tuple tuple = Tuple.Create(descriptor); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, (object) i); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, i); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, i); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + } + + [Test] + [Explicit, Category("Profile")] + public void ProfileDecimalFieldAccessTest() + { + const int iterationCount = 10000000; + TupleDescriptor descriptor = TupleDescriptor.Create(); + Tuple tuple = Tuple.Create(descriptor); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, (object) (decimal) i); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, (decimal) i); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, i); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + } + + [Test] + [Explicit, Category("Profile")] + public void ProfileGuidFieldAccessTest() + { + const int iterationCount = 10000000; + TupleDescriptor descriptor = TupleDescriptor.Create(); + Tuple tuple = Tuple.Create(descriptor); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, Guid.Empty); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, Guid.Empty); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, Guid.Empty); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + } + + [Test] + [Explicit, Category("Performance")] + public void FieldAccessTest() + { + const int iterationCount = 10000000; + TupleDescriptor descriptor = TupleDescriptor.Create(shortFieldTypes); + Tuple tuple = Tuple.Create(descriptor); + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, (object) i); + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, i); + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + + using (new Measurement("Tuple.SetValue?", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, null); + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, (object) i); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValueOrDefault(0); + + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, i); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValueOrDefault(0); + + using (new Measurement("Tuple.SetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.SetValue(0, new int?(i)); + using (new Measurement("Tuple.GetValue", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValue(0); + using (new Measurement("Tuple.GetValue(_,_)", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + TupleFieldState state; + tuple.GetValue(0, out state); + } + using (new Measurement("Tuple.GetValueOrDefault", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.GetValueOrDefault(0); + } + + [Test] + [Explicit, Category("Performance")] + public void CreateExistingTupleTest() + { + const int iterationCount = 10000000; + TupleDescriptor descriptor = TupleDescriptor.Create(typicalFieldTypes); + Xtensive.Tuples.Tuple tuple = Xtensive.Tuples.Tuple.Create(descriptor); + using (new Measurement("CreateNew", iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.CreateNew(); + using (new Measurement("TupleDescriptor.CreateTuple", iterationCount)) + for (int i = 0; i < iterationCount; i++) + Xtensive.Tuples.Tuple.Create(descriptor); + } + + [Test] + [Explicit, Category("Performance")] + public void CopyToTest() + { + const int iterationCount = 10000000; + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + Xtensive.Tuples.Tuple tuple = Xtensive.Tuples.Tuple.Create(10, 20, 234.456f, 2345.34534d, "aaaaaaaaaaa", DateTime.Now); + var hashCode = tuple.GetHashCode(); + var copy = tuple.CreateNew(); + + // Warmup + for (int i = 0; i < iterationCount / 10; i++) + tuple.CopyTo(copy); + + // Actual run + TestHelper.CollectGarbage(true); + // TestLog.Info("Get ready..."); + using (new Measurement("Copying tuples", MeasurementOptions.Log, iterationCount)) { + for (int i = 0; i < iterationCount; i++) + tuple.CopyTo(copy); + } + } + + [Test] + [Explicit, Category("Performance")] + public void EqualsTest() + { + const int iterationCount = 10000000; + Random random = RandomManager.CreateRandom(SeedVariatorType.CallingMethod); + var tuple = Xtensive.Tuples.Tuple.Create(10, 20, 234.456f, 2345.34534d, "aaaaaaaaaaa", DateTime.Now); + var clone = tuple.Clone(); + Assert.AreEqual(tuple.GetHashCode(), clone.GetHashCode()); + var equals = AdvancedComparer.System.Equals; + + // Warmup + for (int i = 0; i < iterationCount / 10; i++) { + tuple.Equals(clone); + equals(tuple, clone); + } + + // Actual run + TestHelper.CollectGarbage(true); + // TestLog.Info("Get ready..."); + using (new Measurement("Comparing using AdvancedComparer tuples", MeasurementOptions.Log, iterationCount)) + for (int i = 0; i < iterationCount; i++) + equals(tuple, clone); + using (new Measurement("Comparing using Equals tuples", MeasurementOptions.Log, iterationCount)) + for (int i = 0; i < iterationCount; i++) + tuple.Equals(clone); + } + + [Test] + [Explicit, Category("Performance")] + public void MemoryUsageTest() + { + const int iterationCount = 1000000; + var descriptor = TupleDescriptor.Create(typicalFieldTypes); + var tuple = Xtensive.Tuples.Tuple.Create(descriptor); + var dummyTuple = new DummyTuple(descriptor); + var tuplesList = new List(iterationCount); + + int iteration = 0; + using (new Measurement("DummyTuple memory usage", iterationCount)) + while (iteration++ <= iterationCount) + tuplesList.Add(dummyTuple.CreateNew()); + tuplesList.Clear(); + TestHelper.CollectGarbage(true); + iteration = 0; + using (new Measurement("Tuple memory usage", iterationCount)) + while (iteration++ <= iterationCount) + tuplesList.Add(tuple.CreateNew()); + } + + [Test] + [Explicit, Category("Performance")] + public void FormatTest() + { + const int iterationCount = 1000000; + var output = new List(iterationCount); + + var descriptor = TupleDescriptor.Create(typicalFieldTypes); + var tuple = Tuple.Create(descriptor); + tuple.SetValue(0, 123L); + tuple.SetValue(2, "hello"); + + using (new Measurement("Format", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + var formatted = tuple.Format(); + output.Add(formatted); + } + } + + [Test] + [Explicit, Category("Performance")] + public void ParseTest() + { + const int iterationCount = 1000000; + var output = new List(iterationCount); + + var descriptor = TupleDescriptor.Create(typicalFieldTypes); + var tuple = Tuple.Create(descriptor); + tuple.SetValue(0, 123L); + tuple.SetValue(2, "hello"); + var source = tuple.Format(); + + using (new Measurement("Parse", iterationCount)) + for (int i = 0; i < iterationCount; i++) { + var parsed = descriptor.Parse(source); + output.Add(parsed); + } + } + + [Test] + [Explicit, Category("Performance")] + public void GeneratorAdvancedTest() + { + var types = new[] { + typeof (int), + typeof (long), + typeof (float), + typeof (double), + typeof (string), + typeof (DateTime), + typeof (TimeSpan), + typeof (byte[]) + }; + + var sizeRandomizer = new Random(); + var typeRandomizer = new Random(); + + const int maxSize = 30; + const int runCount = 10000; + + using (new Measurement("Create tuple with random descriptor", runCount)) + for (int i = 0; i < runCount; i++) { + var count = sizeRandomizer.Next(maxSize + 1); + var tupleTypes = Enumerable.Repeat(0, count) + .Select(_ => types[typeRandomizer.Next(types.Length)]) + .ToArray(count); + var descriptor = TupleDescriptor.Create(tupleTypes); + var tuple = Tuple.Create(descriptor); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleSerializationTest.cs b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleSerializationTest.cs index 0cc7d5387d..324dc06dfb 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleSerializationTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Tuples/TupleSerializationTest.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.08.27 - -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; - -namespace Xtensive.Orm.Tests.Core.Tuples -{ - [TestFixture] - public class TupleSerializationTest - { - [Test] - public void BaseTest() - { - var tuple = Tuple.Create(1, false); - var clone = CloneBySerialization(tuple); - Assert.IsFalse(clone==null); - Assert.AreEqual(tuple, clone); - } - - [Test] - public void CombinedTest() - { - var t = Tuple.Create(1, false); - Assert.AreEqual(t, CloneBySerialization(t)); - - t = Tuple.Create(t.Descriptor); - t.SetValue(1, true); - Assert.AreEqual(t, CloneBySerialization(t)); - } - - [Test] - public void SerializationWithNullValuesTest() - { - var t = Tuple.Create(typeof (string), typeof (int)); - t.SetValue(0, null); - t.SetValue(1, null); - - Assert.AreEqual(t, CloneBySerialization(t)); - } - - [Test] - public void DifferentialTupleSerializationTest() - { - var origin = Tuple.Create(1, 2); - var dt1 = new DifferentialTuple(origin); - dt1.SetValue(1,3); - var dt2 = new DifferentialTuple(origin); - dt1.SetValue(1,4); - var all = new[] {dt1, dt2}; - - var clone = Cloner.Clone(all); - AssertEx.HasSameElements(all, clone); - - var dt1Clone = clone[0]; - var dt2Clone = clone[1]; - var originClone = dt1Clone.Origin; - Assert.AreSame(originClone, dt2Clone.Origin); - originClone.SetValue(0,2); - Assert.AreEqual(2, dt1Clone.GetValue(0)); - Assert.AreEqual(2, dt2Clone.GetValue(0)); - } - - private static Tuple CloneBySerialization(Tuple source) - { - return Cloner.Clone(source); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.27 + +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; + +namespace Xtensive.Orm.Tests.Core.Tuples +{ + [TestFixture] + public class TupleSerializationTest + { + [Test] + public void BaseTest() + { + var tuple = Tuple.Create(1, false); + var clone = CloneBySerialization(tuple); + Assert.IsFalse(clone==null); + Assert.AreEqual(tuple, clone); + } + + [Test] + public void CombinedTest() + { + var t = Tuple.Create(1, false); + Assert.AreEqual(t, CloneBySerialization(t)); + + t = Tuple.Create(t.Descriptor); + t.SetValue(1, true); + Assert.AreEqual(t, CloneBySerialization(t)); + } + + [Test] + public void SerializationWithNullValuesTest() + { + var t = Tuple.Create(typeof (string), typeof (int)); + t.SetValue(0, null); + t.SetValue(1, null); + + Assert.AreEqual(t, CloneBySerialization(t)); + } + + [Test] + public void DifferentialTupleSerializationTest() + { + var origin = Tuple.Create(1, 2); + var dt1 = new DifferentialTuple(origin); + dt1.SetValue(1,3); + var dt2 = new DifferentialTuple(origin); + dt1.SetValue(1,4); + var all = new[] {dt1, dt2}; + + var clone = Cloner.Clone(all); + AssertEx.HasSameElements(all, clone); + + var dt1Clone = clone[0]; + var dt2Clone = clone[1]; + var originClone = dt1Clone.Origin; + Assert.AreSame(originClone, dt2Clone.Origin); + originClone.SetValue(0,2); + Assert.AreEqual(2, dt1Clone.GetValue(0)); + Assert.AreEqual(2, dt2Clone.GetValue(0)); + } + + private static Tuple CloneBySerialization(Tuple source) + { + return Cloner.Clone(source); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/UrlInfoTest.cs b/Orm/Xtensive.Orm.Tests.Core/UrlInfoTest.cs index 10ed1e5e63..0f6dddd643 100644 --- a/Orm/Xtensive.Orm.Tests.Core/UrlInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/UrlInfoTest.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Ilyin -// Created: 2007.07.18 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Core -{ - [TestFixture] - public class UrlInfoTest - { - [Test] - public void CombinedTest() - { - UrlInfo a1 = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter=someValue&someParameter2=someValue2"); - UrlInfo a2 = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter=someValue&someParameter2=someValue2"); - UrlInfo aX = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter2=someValue2&someParameter=someValue"); - UrlInfo b = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl"); - - Assert.IsTrue(a1.GetHashCode()==a2.GetHashCode()); - Assert.IsTrue(a1.GetHashCode()!=aX.GetHashCode()); - Assert.IsTrue(a1.GetHashCode()!=b.GetHashCode()); - - Assert.IsTrue(a1.Equals(a2)); - Assert.IsFalse(a1.Equals(aX)); - Assert.IsFalse(a1.Equals(b)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Ilyin +// Created: 2007.07.18 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Core +{ + [TestFixture] + public class UrlInfoTest + { + [Test] + public void CombinedTest() + { + UrlInfo a1 = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter=someValue&someParameter2=someValue2"); + UrlInfo a2 = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter=someValue&someParameter2=someValue2"); + UrlInfo aX = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl?someParameter2=someValue2&someParameter=someValue"); + UrlInfo b = UrlInfo.Parse("tcp://user:password@someHost:1000/someUrl/someUrl"); + + Assert.IsTrue(a1.GetHashCode()==a2.GetHashCode()); + Assert.IsTrue(a1.GetHashCode()!=aX.GetHashCode()); + Assert.IsTrue(a1.GetHashCode()!=b.GetHashCode()); + + Assert.IsTrue(a1.Equals(a2)); + Assert.IsFalse(a1.Equals(aX)); + Assert.IsFalse(a1.Equals(b)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Core/Xtensive.Orm.Tests.Core.csproj b/Orm/Xtensive.Orm.Tests.Core/Xtensive.Orm.Tests.Core.csproj index ae24476095..5c39c1d419 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Xtensive.Orm.Tests.Core.csproj +++ b/Orm/Xtensive.Orm.Tests.Core/Xtensive.Orm.Tests.Core.csproj @@ -1,33 +1,33 @@ - - - true - false - ..\..\_Build\$(Configuration)\lib\ - - - netcoreapp2.0 - 2.0.3 - Xtensive - true - ..\Orm.snk - true - 2 - - - TRACE;DEBUG;NETCOREAPP - - - TRACE;NETCOREAPP - - - - - - - - - - - - + + + true + false + ..\..\_Build\$(Configuration)\lib\ + + + netcoreapp2.0 + 2.0.3 + Xtensive + true + ..\Orm.snk + true + 2 + + + TRACE;DEBUG;NETCOREAPP + + + TRACE;NETCOREAPP + + + + + + + + + + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.FSharp/App.config b/Orm/Xtensive.Orm.Tests.FSharp/App.config index 9d0b93f1cb..e8316e3e0c 100644 --- a/Orm/Xtensive.Orm.Tests.FSharp/App.config +++ b/Orm/Xtensive.Orm.Tests.FSharp/App.config @@ -1,27 +1,27 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - + + + +
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests.FSharp/FsUnit.fs b/Orm/Xtensive.Orm.Tests.FSharp/FsUnit.fs index 9603219064..e8b9408ee6 100644 --- a/Orm/Xtensive.Orm.Tests.FSharp/FsUnit.fs +++ b/Orm/Xtensive.Orm.Tests.FSharp/FsUnit.fs @@ -1,39 +1,39 @@ -module FsUnit -open NUnit.Framework -open NUnit.Framework.Constraints - -let should (f : 'a -> #Constraint) x (y : obj) = - let c = f x - let y = - match y with - | :? (unit -> unit) -> box (new TestDelegate(y :?> unit -> unit)) - | _ -> y - Assert.That(y, c) - -let equal x = new EqualConstraint(x) - -let not x = new NotConstraint(x) - -let contain x = new ContainsConstraint(x) - -let haveLength n = Has.Length.EqualTo(n) - -let haveCount n = Has.Count.EqualTo(n) - -let be = id - -let Null = new NullConstraint() - -let Empty = new EmptyConstraint() - -let EmptyString = new EmptyStringConstraint() - -let NullOrEmptyString = new NullOrEmptyStringConstraint() - -let True = new TrueConstraint() - -let False = new FalseConstraint() - -let sameAs x = new SameAsConstraint(x) - -let throw = Throws.TypeOf +module FsUnit +open NUnit.Framework +open NUnit.Framework.Constraints + +let should (f : 'a -> #Constraint) x (y : obj) = + let c = f x + let y = + match y with + | :? (unit -> unit) -> box (new TestDelegate(y :?> unit -> unit)) + | _ -> y + Assert.That(y, c) + +let equal x = new EqualConstraint(x) + +let not x = new NotConstraint(x) + +let contain x = new ContainsConstraint(x) + +let haveLength n = Has.Length.EqualTo(n) + +let haveCount n = Has.Count.EqualTo(n) + +let be = id + +let Null = new NullConstraint() + +let Empty = new EmptyConstraint() + +let EmptyString = new EmptyStringConstraint() + +let NullOrEmptyString = new NullOrEmptyStringConstraint() + +let True = new TrueConstraint() + +let False = new FalseConstraint() + +let sameAs x = new SameAsConstraint(x) + +let throw = Throws.TypeOf diff --git a/Orm/Xtensive.Orm.Tests.FSharp/Model.fs b/Orm/Xtensive.Orm.Tests.FSharp/Model.fs index 27e8dd9716..2d9aac969a 100644 --- a/Orm/Xtensive.Orm.Tests.FSharp/Model.fs +++ b/Orm/Xtensive.Orm.Tests.FSharp/Model.fs @@ -1,16 +1,16 @@ -module Model -open Xtensive.Orm - -[] -type Person() = - inherit Entity() - - [] - member this.Id - with get() = this.GetFieldValue "Id" - and private set(v: int) = this.SetFieldValue ("Id", v) - - [] - member this.Name - with get() = this.GetFieldValue "Name" - and set(v: string) = this.SetFieldValue ("Name", v) +module Model +open Xtensive.Orm + +[] +type Person() = + inherit Entity() + + [] + member this.Id + with get() = this.GetFieldValue "Id" + and private set(v: int) = this.SetFieldValue ("Id", v) + + [] + member this.Name + with get() = this.GetFieldValue "Name" + and set(v: string) = this.SetFieldValue ("Name", v) diff --git a/Orm/Xtensive.Orm.Tests.FSharp/Test.fs b/Orm/Xtensive.Orm.Tests.FSharp/Test.fs index b7f00be6ed..c7984dd0cf 100644 --- a/Orm/Xtensive.Orm.Tests.FSharp/Test.fs +++ b/Orm/Xtensive.Orm.Tests.FSharp/Test.fs @@ -1,37 +1,37 @@ -module Test - -open FsUnit -open NUnit.Framework -open Xtensive.Orm -open Xtensive.Orm.Tests -open Model -open Microsoft.FSharp.Linq -open Microsoft.FSharp.Linq.Query - -[] -type Fixture() = - inherit AutoBuildTest() - - override this.BuildConfiguration() = - let config = base.BuildConfiguration () - config.Types.Register typeof - config - - [] - member this. - ``Should persist an entity and query it back via Linq``() = - use session = base.Domain.OpenSession () - use ts = session.OpenTransaction () - Person (Name = "John") |> ignore - let persons = session.Query.All () - let query = - query <@ seq { - for p in persons do - if p.Name = "John" then - yield p - } @> - let list = query |> Seq.toArray - Assert.AreEqual(1, list.Length) - let fetched = list.[0] - Assert.AreEqual ("John", fetched.Name) - +module Test + +open FsUnit +open NUnit.Framework +open Xtensive.Orm +open Xtensive.Orm.Tests +open Model +open Microsoft.FSharp.Linq +open Microsoft.FSharp.Linq.Query + +[] +type Fixture() = + inherit AutoBuildTest() + + override this.BuildConfiguration() = + let config = base.BuildConfiguration () + config.Types.Register typeof + config + + [] + member this. + ``Should persist an entity and query it back via Linq``() = + use session = base.Domain.OpenSession () + use ts = session.OpenTransaction () + Person (Name = "John") |> ignore + let persons = session.Query.All () + let query = + query <@ seq { + for p in persons do + if p.Name = "John" then + yield p + } @> + let list = query |> Seq.toArray + Assert.AreEqual(1, list.Length) + let fetched = list.[0] + Assert.AreEqual ("John", fetched.Name) + diff --git a/Orm/Xtensive.Orm.Tests.FSharp/Xtensive.Orm.Tests.FSharp.fsproj b/Orm/Xtensive.Orm.Tests.FSharp/Xtensive.Orm.Tests.FSharp.fsproj index b6dd57c5d4..404687b91b 100644 --- a/Orm/Xtensive.Orm.Tests.FSharp/Xtensive.Orm.Tests.FSharp.fsproj +++ b/Orm/Xtensive.Orm.Tests.FSharp/Xtensive.Orm.Tests.FSharp.fsproj @@ -1,74 +1,74 @@ - - - - Net40-Debug - AnyCPU - 8.0.30703 - 2.0 - {cf9ed41f-2548-46b6-aa46-71efe5067681} - Library - Xtensive.Orm.Tests.FSharp - Xtensive.Orm.Tests.FSharp - Xtensive.Orm.Tests.FSharp - - - true - full - false - false - ..\..\_Build\Binaries\Debug\Lib\Net40\ - DEBUG;TRACE - 3 - v4.0 - - - portable - true - true - ..\..\_Build\Binaries\Release\Lib\Net40\ - TRACE - 3 - v4.0 - - - - - - - - - - ..\..\Lib\FSharpPowerPack\FSharp.PowerPack.Linq.dll - - - - - False - ..\..\Lib\NUnit\nunit.framework.dll - - - - - - - Xtensive.Orm.Tests.Framework - {f2ce47f7-8170-4fc4-b619-d32e6398d4f9} - True - - - Xtensive.Orm - {628737e8-3581-4793-99c8-9a4d2d83fea0} - True - - - - - - + + + + Net40-Debug + AnyCPU + 8.0.30703 + 2.0 + {cf9ed41f-2548-46b6-aa46-71efe5067681} + Library + Xtensive.Orm.Tests.FSharp + Xtensive.Orm.Tests.FSharp + Xtensive.Orm.Tests.FSharp + + + true + full + false + false + ..\..\_Build\Binaries\Debug\Lib\Net40\ + DEBUG;TRACE + 3 + v4.0 + + + portable + true + true + ..\..\_Build\Binaries\Release\Lib\Net40\ + TRACE + 3 + v4.0 + + + + + + + + + + ..\..\Lib\FSharpPowerPack\FSharp.PowerPack.Linq.dll + + + + + False + ..\..\Lib\NUnit\nunit.framework.dll + + + + + + + Xtensive.Orm.Tests.Framework + {f2ce47f7-8170-4fc4-b619-d32e6398d4f9} + True + + + Xtensive.Orm + {628737e8-3581-4793-99c8-9a4d2d83fea0} + True + + + + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/App.config b/Orm/Xtensive.Orm.Tests.Framework/App.config index 80ae31eb84..80088e7243 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/App.config +++ b/Orm/Xtensive.Orm.Tests.Framework/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/AssemblyExtensions.cs b/Orm/Xtensive.Orm.Tests.Framework/AssemblyExtensions.cs index a0b4195359..cd02b2608d 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/AssemblyExtensions.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/AssemblyExtensions.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.08.31 - -using System.Configuration; -using System.Reflection; - -namespace Xtensive.Orm.Tests -{ - public static class AssemblyExtensions - { - public static System.Configuration.Configuration GetAssemblyConfiguration(this Assembly assembly) - { - return ConfigurationManager.OpenExeConfiguration(assembly.Location); - } - } +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.08.31 + +using System.Configuration; +using System.Reflection; + +namespace Xtensive.Orm.Tests +{ + public static class AssemblyExtensions + { + public static System.Configuration.Configuration GetAssemblyConfiguration(this Assembly assembly) + { + return ConfigurationManager.OpenExeConfiguration(assembly.Location); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/AssertEx.cs b/Orm/Xtensive.Orm.Tests.Framework/AssertEx.cs index b9f28350af..75d3c9767a 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/AssertEx.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/AssertEx.cs @@ -1,126 +1,126 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: -// Created: 2007.10.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using JetBrains.Annotations; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests -{ - /// - /// Additional assertion methods. - /// - public static class AssertEx - { - public static void IsPatternMatch(string source, string pattern) - { - pattern = "^"+Regex.Escape(pattern)+"$"; - pattern = pattern.Replace(@"\*", @".*"); - pattern = pattern.Replace(@"\?", @"."); - Regex r = new Regex(pattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); - Assert.IsTrue(r.IsMatch(source)); - } - - public static void IsNotPatternMatch(string source, string pattern) - { - pattern = "^"+Regex.Escape(pattern)+"$"; - pattern = pattern.Replace(@"\*", @".*"); - pattern = pattern.Replace(@"\?", @"."); - Regex r = new Regex(pattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); - Assert.IsFalse(r.IsMatch(source)); - } - - public static void IsRegexMatch(string source, string regexPattern) - { - Regex r = new Regex(regexPattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); - Assert.IsTrue(r.IsMatch(source)); - } - - public static void IsNotRegexMatch(string source, string regexPattern) - { - Regex r = new Regex(regexPattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); - Assert.IsFalse(r.IsMatch(source)); - } - - public static void HasSameElements(IEnumerable expected, IEnumerable actual) - { - if (expected==null) - Assert.IsNull(actual); - else { - var expectedSet = new Set(expected); - var hasAll = actual.Aggregate(true, (result, current) => result && expectedSet.Contains(current)); - Assert.IsTrue(hasAll, "Collections do not have same elements"); - } - } - - public static void ResultsAreEqual(Func f1, Func f2) - { - T r1 = default(T); - T r2 = default(T); - Exception e1 = null; - try { - r1 = f1.Invoke(); - } - catch (Exception e) { - e1 = e; - } - try { - r2 = f2.Invoke(); - } - catch (Exception e2) { - Assert.IsNotNull(e1); - Assert.AreEqual(e1.GetType(), e2.GetType()); - return; - } - Assert.AreEqual(r1, r2); - } - - public static void Throws([InstantHandle] Action action) - where TException: Exception - { - bool thrown = false; - try { - action.Invoke(); - } - catch (TException) { - thrown = true; - } - if (!thrown) - Assert.Fail(string.Format("Expected '{0}' was not thrown.", typeof(TException).GetShortName())); - } - - public static void ThrowsNotSupportedException([InstantHandle] Action action) - { - Throws(action); - } - - public static void ThrowsInvalidOperationException([InstantHandle] Action action) - { - Throws(action); - } - - public static void ThrowsArgumentException([InstantHandle] Action action) - { - Throws(action); - } - - public static void ThrowsArgumentOutOfRangeException([InstantHandle] Action action) - { - Throws(action); - } - - public static void ThrowsArgumentNullException([InstantHandle] Action action) - { - Throws(action); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: +// Created: 2007.10.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using JetBrains.Annotations; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests +{ + /// + /// Additional assertion methods. + /// + public static class AssertEx + { + public static void IsPatternMatch(string source, string pattern) + { + pattern = "^"+Regex.Escape(pattern)+"$"; + pattern = pattern.Replace(@"\*", @".*"); + pattern = pattern.Replace(@"\?", @"."); + Regex r = new Regex(pattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); + Assert.IsTrue(r.IsMatch(source)); + } + + public static void IsNotPatternMatch(string source, string pattern) + { + pattern = "^"+Regex.Escape(pattern)+"$"; + pattern = pattern.Replace(@"\*", @".*"); + pattern = pattern.Replace(@"\?", @"."); + Regex r = new Regex(pattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); + Assert.IsFalse(r.IsMatch(source)); + } + + public static void IsRegexMatch(string source, string regexPattern) + { + Regex r = new Regex(regexPattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); + Assert.IsTrue(r.IsMatch(source)); + } + + public static void IsNotRegexMatch(string source, string regexPattern) + { + Regex r = new Regex(regexPattern, RegexOptions.Singleline | RegexOptions.CultureInvariant); + Assert.IsFalse(r.IsMatch(source)); + } + + public static void HasSameElements(IEnumerable expected, IEnumerable actual) + { + if (expected==null) + Assert.IsNull(actual); + else { + var expectedSet = new Set(expected); + var hasAll = actual.Aggregate(true, (result, current) => result && expectedSet.Contains(current)); + Assert.IsTrue(hasAll, "Collections do not have same elements"); + } + } + + public static void ResultsAreEqual(Func f1, Func f2) + { + T r1 = default(T); + T r2 = default(T); + Exception e1 = null; + try { + r1 = f1.Invoke(); + } + catch (Exception e) { + e1 = e; + } + try { + r2 = f2.Invoke(); + } + catch (Exception e2) { + Assert.IsNotNull(e1); + Assert.AreEqual(e1.GetType(), e2.GetType()); + return; + } + Assert.AreEqual(r1, r2); + } + + public static void Throws([InstantHandle] Action action) + where TException: Exception + { + bool thrown = false; + try { + action.Invoke(); + } + catch (TException) { + thrown = true; + } + if (!thrown) + Assert.Fail(string.Format("Expected '{0}' was not thrown.", typeof(TException).GetShortName())); + } + + public static void ThrowsNotSupportedException([InstantHandle] Action action) + { + Throws(action); + } + + public static void ThrowsInvalidOperationException([InstantHandle] Action action) + { + Throws(action); + } + + public static void ThrowsArgumentException([InstantHandle] Action action) + { + Throws(action); + } + + public static void ThrowsArgumentOutOfRangeException([InstantHandle] Action action) + { + Throws(action); + } + + public static void ThrowsArgumentNullException([InstantHandle] Action action) + { + Throws(action); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/AutoBuildTest.cs b/Orm/Xtensive.Orm.Tests.Framework/AutoBuildTest.cs index 179a43e21e..235be3c6ee 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/AutoBuildTest.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/AutoBuildTest.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.07.31 - -using System.Diagnostics; -using NUnit.Framework; -using System; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests -{ - [TestFixture] - public abstract class AutoBuildTest : HasConfigurationAccessTest - { - private const string ErrorInTestFixtureSetup = "Error in TestFixtureSetUp:\r\n{0}"; - private DisposableSet disposables; - - protected ProviderInfo ProviderInfo { get; set; } - protected Domain Domain { get; set; } - - [OneTimeSetUp] - public virtual void TestFixtureSetUp() - { - try { - CheckRequirements(); - RebuildDomain(); - } - catch (IgnoreException) { - throw; - } - catch (Exception e) { - Debug.WriteLine(ErrorInTestFixtureSetup, e); - throw; - } - } - - [OneTimeTearDown] - public virtual void TestFixtureTearDown() - { - disposables.DisposeSafely(true); - Domain.DisposeSafely(true); - } - - protected virtual DomainConfiguration BuildConfiguration() - { - return DomainConfigurationFactory.Create(); - } - - protected void RebuildDomain() - { - disposables.DisposeSafely(true); - Domain.DisposeSafely(true); - - var config = BuildConfiguration(); - Domain = BuildDomain(config); - PopulateData(); - - if (Domain!=null) - ProviderInfo = Domain.StorageProviderInfo; - } - - protected virtual void PopulateData() - { - } - - protected virtual void CheckRequirements() - { - } - - protected void CreateSessionAndTransaction() - { - try { - disposables = new DisposableSet(); - var session = Domain.OpenSession(); - disposables.Add(session); - var transaction = session.OpenTransaction(); - disposables.Add(transaction); - } - catch { - disposables.DisposeSafely(); - disposables = null; - throw; - } - } - - protected virtual Domain BuildDomain(DomainConfiguration configuration) - { - try { - return Domain.Build(configuration); - } - catch (Exception e) { - TestLog.Error(GetType().GetFullName()); - TestLog.Error(e); - throw; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.07.31 + +using System.Diagnostics; +using NUnit.Framework; +using System; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests +{ + [TestFixture] + public abstract class AutoBuildTest : HasConfigurationAccessTest + { + private const string ErrorInTestFixtureSetup = "Error in TestFixtureSetUp:\r\n{0}"; + private DisposableSet disposables; + + protected ProviderInfo ProviderInfo { get; set; } + protected Domain Domain { get; set; } + + [OneTimeSetUp] + public virtual void TestFixtureSetUp() + { + try { + CheckRequirements(); + RebuildDomain(); + } + catch (IgnoreException) { + throw; + } + catch (Exception e) { + Debug.WriteLine(ErrorInTestFixtureSetup, e); + throw; + } + } + + [OneTimeTearDown] + public virtual void TestFixtureTearDown() + { + disposables.DisposeSafely(true); + Domain.DisposeSafely(true); + } + + protected virtual DomainConfiguration BuildConfiguration() + { + return DomainConfigurationFactory.Create(); + } + + protected void RebuildDomain() + { + disposables.DisposeSafely(true); + Domain.DisposeSafely(true); + + var config = BuildConfiguration(); + Domain = BuildDomain(config); + PopulateData(); + + if (Domain!=null) + ProviderInfo = Domain.StorageProviderInfo; + } + + protected virtual void PopulateData() + { + } + + protected virtual void CheckRequirements() + { + } + + protected void CreateSessionAndTransaction() + { + try { + disposables = new DisposableSet(); + var session = Domain.OpenSession(); + disposables.Add(session); + var transaction = session.OpenTransaction(); + disposables.Add(transaction); + } + catch { + disposables.DisposeSafely(); + disposables = null; + throw; + } + } + + protected virtual Domain BuildDomain(DomainConfiguration configuration) + { + try { + return Domain.Build(configuration); + } + catch (Exception e) { + TestLog.Error(GetType().GetFullName()); + TestLog.Error(e); + throw; + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Framework/DO-Tests-Plus.sql b/Orm/Xtensive.Orm.Tests.Framework/DO-Tests-Plus.sql index 4cd9c2cb57..d11d425100 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/DO-Tests-Plus.sql +++ b/Orm/Xtensive.Orm.Tests.Framework/DO-Tests-Plus.sql @@ -1,219 +1,219 @@ --------------- --- DO-Tests-1 --------------- - --- Dropping the database -USE master -GO -if exists (select * from sysdatabases where name='DO-Tests-1') - drop database [DO-Tests-1] -GO - --- Creating the database -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @data_directory NVARCHAR(520) -SELECT @data_directory = @server_directory + N'DATA\' - -EXECUTE (N'CREATE DATABASE [DO-Tests-1] - ON PRIMARY (NAME = N''DO-Tests-1'', FILENAME = N''' + @data_directory + N'DO-Tests-1.mdf'') - LOG ON (NAME = N''DO-Tests-1_log'', FILENAME = N''' + @data_directory + N'DO-Tests-1.ldf'')') -GO - -USE [DO-Tests-1] -GO - -ALTER DATABASE [DO-Tests-1] -SET ALLOW_SNAPSHOT_ISOLATION ON - -ALTER DATABASE [DO-Tests-1] -SET READ_COMMITTED_SNAPSHOT ON - --- Enabling full-text indexing there -IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) -begin -EXEC [dbo].[sp_fulltext_database] @action = 'enable' -end -GO - --- And creating full-text catalogue -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @ftdata_directory NVARCHAR(520) -SELECT @ftdata_directory = @server_directory + N'FTData\' - -EXECUTE (N'CREATE FULLTEXT CATALOG [Default] -IN PATH N''' + @ftdata_directory + N'DO-Tests-1'' -WITH ACCENT_SENSITIVITY = ON -AS DEFAULT -AUTHORIZATION [dbo]') -GO - --------------- --- DO-Tests-2 --------------- - --- Dropping the database -USE master -GO -if exists (select * from sysdatabases where name='DO-Tests-2') - drop database [DO-Tests-2] -GO - --- Creating the database -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @data_directory NVARCHAR(520) -SELECT @data_directory = @server_directory + N'DATA\' - -EXECUTE (N'CREATE DATABASE [DO-Tests-2] - ON PRIMARY (NAME = N''DO-Tests-2'', FILENAME = N''' + @data_directory + N'DO-Tests-2.mdf'') - LOG ON (NAME = N''DO-Tests-2_log'', FILENAME = N''' + @data_directory + N'DO-Tests-2.ldf'')') -GO - -USE [DO-Tests-2] -GO - -ALTER DATABASE [DO-Tests-2] -SET ALLOW_SNAPSHOT_ISOLATION ON - -ALTER DATABASE [DO-Tests-2] -SET READ_COMMITTED_SNAPSHOT ON - --- Enabling full-text indexing there -IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) -begin -EXEC [dbo].[sp_fulltext_database] @action = 'enable' -end -GO - --- And creating full-text catalogue -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @ftdata_directory NVARCHAR(520) -SELECT @ftdata_directory = @server_directory + N'FTData\' - -EXECUTE (N'CREATE FULLTEXT CATALOG [Default] -IN PATH N''' + @ftdata_directory + N'DO-Tests-2'' -WITH ACCENT_SENSITIVITY = ON -AS DEFAULT -AUTHORIZATION [dbo]') -GO - --------------- --- DO-Tests-3 --------------- - --- Dropping the database -USE master -GO -if exists (select * from sysdatabases where name='DO-Tests-3') - drop database [DO-Tests-3] -GO - --- Creating the database -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @data_directory NVARCHAR(520) -SELECT @data_directory = @server_directory + N'DATA\' - -EXECUTE (N'CREATE DATABASE [DO-Tests-3] - ON PRIMARY (NAME = N''DO-Tests-3'', FILENAME = N''' + @data_directory + N'DO-Tests-3.mdf'') - LOG ON (NAME = N''DO-Tests-3_log'', FILENAME = N''' + @data_directory + N'DO-Tests-3.ldf'')') -GO - -USE [DO-Tests-3] -GO - -ALTER DATABASE [DO-Tests-3] -SET ALLOW_SNAPSHOT_ISOLATION ON - -ALTER DATABASE [DO-Tests-3] -SET READ_COMMITTED_SNAPSHOT ON - --- Enabling full-text indexing there -IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) -begin -EXEC [dbo].[sp_fulltext_database] @action = 'enable' -end -GO - --- And creating full-text catalogue -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @ftdata_directory NVARCHAR(520) -SELECT @ftdata_directory = @server_directory + N'FTData\' - -EXECUTE (N'CREATE FULLTEXT CATALOG [Default] -IN PATH N''' + @ftdata_directory + N'DO-Tests-3'' -WITH ACCENT_SENSITIVITY = ON -AS DEFAULT -AUTHORIZATION [dbo]') -GO - --------------- --- DO-Tests-4 --------------- - --- Dropping the database -USE master -GO -if exists (select * from sysdatabases where name='DO-Tests-4') - drop database [DO-Tests-4] -GO - --- Creating the database -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @data_directory NVARCHAR(520) -SELECT @data_directory = @server_directory + N'DATA\' - -EXECUTE (N'CREATE DATABASE [DO-Tests-4] - ON PRIMARY (NAME = N''DO-Tests-4'', FILENAME = N''' + @data_directory + N'DO-Tests-4.mdf'') - LOG ON (NAME = N''DO-Tests-4_log'', FILENAME = N''' + @data_directory + N'DO-Tests-4.ldf'')') -GO - -USE [DO-Tests-4] -GO - -ALTER DATABASE [DO-Tests-4] -SET ALLOW_SNAPSHOT_ISOLATION ON - -ALTER DATABASE [DO-Tests-4] -SET READ_COMMITTED_SNAPSHOT ON - --- Enabling full-text indexing there -IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) -begin -EXEC [dbo].[sp_fulltext_database] @action = 'enable' -end -GO - --- And creating full-text catalogue -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @ftdata_directory NVARCHAR(520) -SELECT @ftdata_directory = @server_directory + N'FTData\' - -EXECUTE (N'CREATE FULLTEXT CATALOG [Default] -IN PATH N''' + @ftdata_directory + N'DO-Tests-4'' -WITH ACCENT_SENSITIVITY = ON -AS DEFAULT -AUTHORIZATION [dbo]') -GO +-------------- +-- DO-Tests-1 +-------------- + +-- Dropping the database +USE master +GO +if exists (select * from sysdatabases where name='DO-Tests-1') + drop database [DO-Tests-1] +GO + +-- Creating the database +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @data_directory NVARCHAR(520) +SELECT @data_directory = @server_directory + N'DATA\' + +EXECUTE (N'CREATE DATABASE [DO-Tests-1] + ON PRIMARY (NAME = N''DO-Tests-1'', FILENAME = N''' + @data_directory + N'DO-Tests-1.mdf'') + LOG ON (NAME = N''DO-Tests-1_log'', FILENAME = N''' + @data_directory + N'DO-Tests-1.ldf'')') +GO + +USE [DO-Tests-1] +GO + +ALTER DATABASE [DO-Tests-1] +SET ALLOW_SNAPSHOT_ISOLATION ON + +ALTER DATABASE [DO-Tests-1] +SET READ_COMMITTED_SNAPSHOT ON + +-- Enabling full-text indexing there +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +-- And creating full-text catalogue +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @ftdata_directory NVARCHAR(520) +SELECT @ftdata_directory = @server_directory + N'FTData\' + +EXECUTE (N'CREATE FULLTEXT CATALOG [Default] +IN PATH N''' + @ftdata_directory + N'DO-Tests-1'' +WITH ACCENT_SENSITIVITY = ON +AS DEFAULT +AUTHORIZATION [dbo]') +GO + +-------------- +-- DO-Tests-2 +-------------- + +-- Dropping the database +USE master +GO +if exists (select * from sysdatabases where name='DO-Tests-2') + drop database [DO-Tests-2] +GO + +-- Creating the database +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @data_directory NVARCHAR(520) +SELECT @data_directory = @server_directory + N'DATA\' + +EXECUTE (N'CREATE DATABASE [DO-Tests-2] + ON PRIMARY (NAME = N''DO-Tests-2'', FILENAME = N''' + @data_directory + N'DO-Tests-2.mdf'') + LOG ON (NAME = N''DO-Tests-2_log'', FILENAME = N''' + @data_directory + N'DO-Tests-2.ldf'')') +GO + +USE [DO-Tests-2] +GO + +ALTER DATABASE [DO-Tests-2] +SET ALLOW_SNAPSHOT_ISOLATION ON + +ALTER DATABASE [DO-Tests-2] +SET READ_COMMITTED_SNAPSHOT ON + +-- Enabling full-text indexing there +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +-- And creating full-text catalogue +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @ftdata_directory NVARCHAR(520) +SELECT @ftdata_directory = @server_directory + N'FTData\' + +EXECUTE (N'CREATE FULLTEXT CATALOG [Default] +IN PATH N''' + @ftdata_directory + N'DO-Tests-2'' +WITH ACCENT_SENSITIVITY = ON +AS DEFAULT +AUTHORIZATION [dbo]') +GO + +-------------- +-- DO-Tests-3 +-------------- + +-- Dropping the database +USE master +GO +if exists (select * from sysdatabases where name='DO-Tests-3') + drop database [DO-Tests-3] +GO + +-- Creating the database +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @data_directory NVARCHAR(520) +SELECT @data_directory = @server_directory + N'DATA\' + +EXECUTE (N'CREATE DATABASE [DO-Tests-3] + ON PRIMARY (NAME = N''DO-Tests-3'', FILENAME = N''' + @data_directory + N'DO-Tests-3.mdf'') + LOG ON (NAME = N''DO-Tests-3_log'', FILENAME = N''' + @data_directory + N'DO-Tests-3.ldf'')') +GO + +USE [DO-Tests-3] +GO + +ALTER DATABASE [DO-Tests-3] +SET ALLOW_SNAPSHOT_ISOLATION ON + +ALTER DATABASE [DO-Tests-3] +SET READ_COMMITTED_SNAPSHOT ON + +-- Enabling full-text indexing there +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +-- And creating full-text catalogue +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @ftdata_directory NVARCHAR(520) +SELECT @ftdata_directory = @server_directory + N'FTData\' + +EXECUTE (N'CREATE FULLTEXT CATALOG [Default] +IN PATH N''' + @ftdata_directory + N'DO-Tests-3'' +WITH ACCENT_SENSITIVITY = ON +AS DEFAULT +AUTHORIZATION [dbo]') +GO + +-------------- +-- DO-Tests-4 +-------------- + +-- Dropping the database +USE master +GO +if exists (select * from sysdatabases where name='DO-Tests-4') + drop database [DO-Tests-4] +GO + +-- Creating the database +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @data_directory NVARCHAR(520) +SELECT @data_directory = @server_directory + N'DATA\' + +EXECUTE (N'CREATE DATABASE [DO-Tests-4] + ON PRIMARY (NAME = N''DO-Tests-4'', FILENAME = N''' + @data_directory + N'DO-Tests-4.mdf'') + LOG ON (NAME = N''DO-Tests-4_log'', FILENAME = N''' + @data_directory + N'DO-Tests-4.ldf'')') +GO + +USE [DO-Tests-4] +GO + +ALTER DATABASE [DO-Tests-4] +SET ALLOW_SNAPSHOT_ISOLATION ON + +ALTER DATABASE [DO-Tests-4] +SET READ_COMMITTED_SNAPSHOT ON + +-- Enabling full-text indexing there +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +-- And creating full-text catalogue +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @ftdata_directory NVARCHAR(520) +SELECT @ftdata_directory = @server_directory + N'FTData\' + +EXECUTE (N'CREATE FULLTEXT CATALOG [Default] +IN PATH N''' + @ftdata_directory + N'DO-Tests-4'' +WITH ACCENT_SENSITIVITY = ON +AS DEFAULT +AUTHORIZATION [dbo]') +GO diff --git a/Orm/Xtensive.Orm.Tests.Framework/DO-Tests.sql b/Orm/Xtensive.Orm.Tests.Framework/DO-Tests.sql index 166574b468..e0cf0fc6fd 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/DO-Tests.sql +++ b/Orm/Xtensive.Orm.Tests.Framework/DO-Tests.sql @@ -1,50 +1,50 @@ --- Dropping the database -USE master -GO -if exists (select * from sysdatabases where name='DO-Tests') - drop database [DO-Tests] -GO - --- Creating the database -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @data_directory NVARCHAR(520) -SELECT @data_directory = @server_directory + N'DATA\' - -EXECUTE (N'CREATE DATABASE [DO-Tests] - ON PRIMARY (NAME = N''DO-Tests'', FILENAME = N''' + @data_directory + N'DO-Tests.mdf'') - LOG ON (NAME = N''DO-Tests_log'', FILENAME = N''' + @data_directory + N'DO-Tests.ldf'')') -GO - -USE [DO-Tests] -GO - -ALTER DATABASE [DO-Tests] -SET ALLOW_SNAPSHOT_ISOLATION ON - -ALTER DATABASE [DO-Tests] -SET READ_COMMITTED_SNAPSHOT ON - --- Enabling full-text indexing there -IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) -begin -EXEC [dbo].[sp_fulltext_database] @action = 'enable' -end -GO - --- And creating full-text catalogue -DECLARE @server_directory NVARCHAR(520) -SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) -FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 - -DECLARE @ftdata_directory NVARCHAR(520) -SELECT @ftdata_directory = @server_directory + N'FTData\' - -EXECUTE (N'CREATE FULLTEXT CATALOG [Default] -IN PATH N''' + @ftdata_directory + N'DO-Tests'' -WITH ACCENT_SENSITIVITY = ON -AS DEFAULT -AUTHORIZATION [dbo]') -GO +-- Dropping the database +USE master +GO +if exists (select * from sysdatabases where name='DO-Tests') + drop database [DO-Tests] +GO + +-- Creating the database +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @data_directory NVARCHAR(520) +SELECT @data_directory = @server_directory + N'DATA\' + +EXECUTE (N'CREATE DATABASE [DO-Tests] + ON PRIMARY (NAME = N''DO-Tests'', FILENAME = N''' + @data_directory + N'DO-Tests.mdf'') + LOG ON (NAME = N''DO-Tests_log'', FILENAME = N''' + @data_directory + N'DO-Tests.ldf'')') +GO + +USE [DO-Tests] +GO + +ALTER DATABASE [DO-Tests] +SET ALLOW_SNAPSHOT_ISOLATION ON + +ALTER DATABASE [DO-Tests] +SET READ_COMMITTED_SNAPSHOT ON + +-- Enabling full-text indexing there +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +-- And creating full-text catalogue +DECLARE @server_directory NVARCHAR(520) +SELECT @server_directory = SUBSTRING(filename, 1, CHARINDEX(N'DATA\master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +DECLARE @ftdata_directory NVARCHAR(520) +SELECT @ftdata_directory = @server_directory + N'FTData\' + +EXECUTE (N'CREATE FULLTEXT CATALOG [Default] +IN PATH N''' + @ftdata_directory + N'DO-Tests'' +WITH ACCENT_SENSITIVITY = ON +AS DEFAULT +AUTHORIZATION [dbo]') +GO diff --git a/Orm/Xtensive.Orm.Tests.Framework/DebugInfo.cs b/Orm/Xtensive.Orm.Tests.Framework/DebugInfo.cs index 42b382800b..9403b681e0 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/DebugInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/DebugInfo.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.10.03 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Security; - -namespace Xtensive.Orm.Tests -{ - /// - /// Provides various debugging related information. - /// - public static class DebugInfo - { - private static int isUnitTestSessionRunning; - private static int isRunningOnBuildServer; - private static Dictionary testFixtureAttributes; - private static Dictionary buildServerLaunchers; - private static Dictionary buildServerEnvironmentVariables; - - /// - /// , if current method is executed under unit test runner. - /// - /// - /// Currently only NUnit tests are recognized. - /// Note that value of this property is detected just once - during its first call. - /// - public static bool IsUnitTestSessionRunning - { - get { - if (isUnitTestSessionRunning==0) { - int newIsUnitTestSessionRunning = -1; - StackFrame[] stackFrames = new StackTrace().GetFrames(); - foreach (StackFrame frame in stackFrames) { - Type type = frame.GetMethod().DeclaringType; - Attribute[] typeAttributes = Attribute.GetCustomAttributes(type, false); - for (int i = 0; i < typeAttributes.Length; i++) { - bool ignore; - if (testFixtureAttributes.TryGetValue(typeAttributes[i].GetType().FullName, out ignore)) { - newIsUnitTestSessionRunning = 1; - break; - } - } - if (newIsUnitTestSessionRunning==1) - break; - } - isUnitTestSessionRunning = newIsUnitTestSessionRunning; - } - return isUnitTestSessionRunning==1; - } - } - - /// - /// , if current method is executed on build server. - /// - /// - /// Currently only TeamCity is recognized. - /// Note that value of this property is detected just once - during its first call. - /// - public static bool IsRunningOnBuildServer - { - [SecuritySafeCritical] - get { - if (isRunningOnBuildServer==0) { - int newIsRunningOnBuildServer = -1; - Process p = Process.GetCurrentProcess(); - var fileName = p.MainModule.FileName; - string exeName = Path.GetFileName(fileName); - if (buildServerLaunchers.ContainsKey(exeName)) - newIsRunningOnBuildServer = 1; - else { - foreach (DictionaryEntry e in Environment.GetEnvironmentVariables()) { - if (buildServerEnvironmentVariables.ContainsKey(e.Key as string)) { - newIsRunningOnBuildServer = 1; - break; - } - } - } - isRunningOnBuildServer = newIsRunningOnBuildServer; - } - return isRunningOnBuildServer==1; - } - } - - // Constructors - - static DebugInfo() - { - testFixtureAttributes = new Dictionary(); - testFixtureAttributes.Add("NUnit.Framework.TestFixtureAttribute", true); - - buildServerLaunchers = new Dictionary(); - buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher1.1.exe", true); - buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher2.0.exe", true); - buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher2.0.VSTS.exe", true); - - buildServerEnvironmentVariables = new Dictionary(); - buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher.msbuild.task", true); - buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher1.1", true); - buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher2.0", true); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.10.03 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Security; + +namespace Xtensive.Orm.Tests +{ + /// + /// Provides various debugging related information. + /// + public static class DebugInfo + { + private static int isUnitTestSessionRunning; + private static int isRunningOnBuildServer; + private static Dictionary testFixtureAttributes; + private static Dictionary buildServerLaunchers; + private static Dictionary buildServerEnvironmentVariables; + + /// + /// , if current method is executed under unit test runner. + /// + /// + /// Currently only NUnit tests are recognized. + /// Note that value of this property is detected just once - during its first call. + /// + public static bool IsUnitTestSessionRunning + { + get { + if (isUnitTestSessionRunning==0) { + int newIsUnitTestSessionRunning = -1; + StackFrame[] stackFrames = new StackTrace().GetFrames(); + foreach (StackFrame frame in stackFrames) { + Type type = frame.GetMethod().DeclaringType; + Attribute[] typeAttributes = Attribute.GetCustomAttributes(type, false); + for (int i = 0; i < typeAttributes.Length; i++) { + bool ignore; + if (testFixtureAttributes.TryGetValue(typeAttributes[i].GetType().FullName, out ignore)) { + newIsUnitTestSessionRunning = 1; + break; + } + } + if (newIsUnitTestSessionRunning==1) + break; + } + isUnitTestSessionRunning = newIsUnitTestSessionRunning; + } + return isUnitTestSessionRunning==1; + } + } + + /// + /// , if current method is executed on build server. + /// + /// + /// Currently only TeamCity is recognized. + /// Note that value of this property is detected just once - during its first call. + /// + public static bool IsRunningOnBuildServer + { + [SecuritySafeCritical] + get { + if (isRunningOnBuildServer==0) { + int newIsRunningOnBuildServer = -1; + Process p = Process.GetCurrentProcess(); + var fileName = p.MainModule.FileName; + string exeName = Path.GetFileName(fileName); + if (buildServerLaunchers.ContainsKey(exeName)) + newIsRunningOnBuildServer = 1; + else { + foreach (DictionaryEntry e in Environment.GetEnvironmentVariables()) { + if (buildServerEnvironmentVariables.ContainsKey(e.Key as string)) { + newIsRunningOnBuildServer = 1; + break; + } + } + } + isRunningOnBuildServer = newIsRunningOnBuildServer; + } + return isRunningOnBuildServer==1; + } + } + + // Constructors + + static DebugInfo() + { + testFixtureAttributes = new Dictionary(); + testFixtureAttributes.Add("NUnit.Framework.TestFixtureAttribute", true); + + buildServerLaunchers = new Dictionary(); + buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher1.1.exe", true); + buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher2.0.exe", true); + buildServerLaunchers.Add("JetBrains.BuildServer.NUnitLauncher2.0.VSTS.exe", true); + + buildServerEnvironmentVariables = new Dictionary(); + buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher.msbuild.task", true); + buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher1.1", true); + buildServerEnvironmentVariables.Add("teamcity.dotnet.nunitlauncher2.0", true); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/DomainConfigurationFactory.cs b/Orm/Xtensive.Orm.Tests.Framework/DomainConfigurationFactory.cs index 093ec5ec60..c29e601c56 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/DomainConfigurationFactory.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/DomainConfigurationFactory.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.05 - -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests -{ - public static class DomainConfigurationFactory - { - public static DomainConfiguration Create() - { - return Create(TestConfiguration.Instance.Storage, false, true); - } - - public static DomainConfiguration CreateForConnectionStringTest() - { - return Create(TestConfiguration.Instance.Storage, true, true); - } - - public static DomainConfiguration CreateForCrudTest(string provider) - { - return Create(provider, false, false); - } - - public static DomainConfiguration CreateWithoutSessionConfigurations() - { - return Create(TestConfiguration.Instance.Storage, false, false); - } - - private static DomainConfiguration Create(string storage, bool useConnectionString, bool addSessionConfiguration) - { - if (useConnectionString) - storage += "cs"; - - var configuration = typeof(DomainConfigurationFactory).Assembly.GetAssemblyConfiguration(); - var domainConfiguration = DomainConfiguration.Load(configuration, storage); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - var customConnectionInfo = TestConfiguration.Instance.GetConnectionInfo(storage); - if (customConnectionInfo!=null) - domainConfiguration.ConnectionInfo = customConnectionInfo; - if (addSessionConfiguration) { - var defaultConfiguration = new SessionConfiguration( - WellKnown.Sessions.Default, SessionOptions.ServerProfile | SessionOptions.AutoActivation); - domainConfiguration.Sessions.Add(defaultConfiguration); - } - return domainConfiguration; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.05 + +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests +{ + public static class DomainConfigurationFactory + { + public static DomainConfiguration Create() + { + return Create(TestConfiguration.Instance.Storage, false, true); + } + + public static DomainConfiguration CreateForConnectionStringTest() + { + return Create(TestConfiguration.Instance.Storage, true, true); + } + + public static DomainConfiguration CreateForCrudTest(string provider) + { + return Create(provider, false, false); + } + + public static DomainConfiguration CreateWithoutSessionConfigurations() + { + return Create(TestConfiguration.Instance.Storage, false, false); + } + + private static DomainConfiguration Create(string storage, bool useConnectionString, bool addSessionConfiguration) + { + if (useConnectionString) + storage += "cs"; + + var configuration = typeof(DomainConfigurationFactory).Assembly.GetAssemblyConfiguration(); + var domainConfiguration = DomainConfiguration.Load(configuration, storage); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + var customConnectionInfo = TestConfiguration.Instance.GetConnectionInfo(storage); + if (customConnectionInfo!=null) + domainConfiguration.ConnectionInfo = customConnectionInfo; + if (addSessionConfiguration) { + var defaultConfiguration = new SessionConfiguration( + WellKnown.Sessions.Default, SessionOptions.ServerProfile | SessionOptions.AutoActivation); + domainConfiguration.Sessions.Add(defaultConfiguration); + } + return domainConfiguration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs b/Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs index 893b015fcb..a05b6db296 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs @@ -1,268 +1,268 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.06.21 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests -{ - public static class DomainModelExtensions - { - public static void Dump(this DomainModel target) - { - Console.WriteLine("----------------------------------------"); - Console.WriteLine("Model dump"); - Console.WriteLine("----------------------------------------"); - Console.WriteLine("Structures:"); - foreach (TypeInfo type in target.Types.Structures) { - type.DumpName(1); - type.Dump(2); - } - Console.WriteLine("Hierarchies:"); - foreach (HierarchyInfo hierarchy in target.Hierarchies) { - hierarchy.Root.DumpName(1); - hierarchy.Dump(2); - } - Console.WriteLine("Entities:"); - foreach (TypeInfo type in target.Types.Entities) { - type.DumpName(1); - type.Dump(2); - } - Console.WriteLine("Interfaces:"); - foreach (TypeInfo type in target.Types.Interfaces) { - type.DumpName(1); - type.Dump(2); - } - Console.WriteLine("Associations:"); - foreach (AssociationInfo association in target.Associations) { - association.DumpName(1); - association.Dump(2); - } - Console.WriteLine("Indexes:"); - foreach (IndexInfo index in target.Types.Where(type => type.IsEntity).SelectMany(type => type.Indexes)) { - index.DumpName(1); - index.Dump(2); - } - foreach (IndexInfo index in target.Types.Where(type => type.IsInterface).SelectMany(type => type.Indexes)) { - index.DumpName(1); - index.Dump(2); - } - } - - public static void Dump(this TypeInfoCollection target) - { - Console.WriteLine("Structures:"); - foreach (TypeInfo type in target.Structures) { - type.DumpName(1); - type.DumpAncestor(2); - type.DumpDescendants(2); - } - Console.WriteLine("Entities:"); - foreach (TypeInfo type in target.Entities) { - type.DumpName(1); - type.DumpAncestor(2); - type.DumpDescendants(2); - type.DumpInterfaces(2); - } - Console.WriteLine("Interfaces:"); - foreach (TypeInfo type in target.Interfaces) { - type.DumpName(1); - type.DumpInterfaces(2); - type.DumpDescendants(2); - type.DumpImplementors(2); - } - } - - public static void DumpAncestor(this TypeInfo target, int indent) - { - TypeInfo ancestor = target.GetAncestor(); - if (ancestor!=null) - WriteLine(indent + 1, "Ancestor: " + ancestor.Name); - else { - WriteLine(indent + 1, "Ancestor: None"); - } - } - - public static void DumpDescendants(this TypeInfo target, int indent) - { - WriteLine(indent, "Descendants:"); - HashSet direct = new HashSet(target.GetDescendants()); - foreach (TypeInfo descendant in target.GetDescendants(true)) { - if (direct.Contains(descendant)) - WriteLine(indent + 1, descendant.Name + " (direct)"); - else - WriteLine(indent + 1, descendant.Name); - } - } - - public static void DumpInterfaces(this TypeInfo target, int indent) - { - WriteLine(indent, "Interfaces:"); - HashSet direct = new HashSet(target.GetInterfaces()); - foreach (TypeInfo @interface in target.GetInterfaces(true)) { - if (direct.Contains(@interface)) - WriteLine(indent + 1, @interface.Name + " (direct)"); - else - WriteLine(indent + 1, @interface.Name); - } - } - - public static void DumpImplementors(this TypeInfo target, int indent) - { - WriteLine(indent, "Implementors:"); - HashSet direct = new HashSet(target.GetImplementors()); - foreach (TypeInfo implementor in target.GetImplementors(true)) { - if (direct.Contains(implementor)) - WriteLine(indent + 1, implementor.Name + " (direct)"); - else - WriteLine(indent + 1, implementor.Name); - } - } - - public static void DumpName(this Node target, int indent) - { - WriteLine(indent, target.Name); - } - - public static void DumpMappingName(this MappedNode target, int indent) - { - if (target.MappingName.IsNullOrEmpty()) - return; - WriteLine(indent, "MappingName: " + target.MappingName); - } - - public static void Dump(this HierarchyInfo target, int indent) - { - WriteLine(indent, "InheritanceSchema: " + target.InheritanceSchema); - WriteLine(indent, "KeyFields:"); - foreach (var pair in target.Root.Fields.Where(f => f.IsPrimaryKey)) { - WriteLine(indent + 1, pair.Name + "(" + pair.ValueType + ") "); - } - } - - public static void Dump(this AssociationInfo target, int indent) - { - WriteLine(indent, "Referencing type: " + target.OwnerType.Name); - WriteLine(indent, "Referencing field: " + target.OwnerField.Name); - WriteLine(indent, "Referenced type: " + target.TargetType.Name); - WriteLine(indent, "Multiplicity: " + target.Multiplicity); - WriteLine(indent, "On Delete: " + target.OnTargetRemove); - WriteLine(indent, "Master: " + target.IsMaster); - if (target.Reversed!=null) - WriteLine(indent, "Reversed: " + target.Reversed.Name); - } - - public static void Dump(this TypeInfo target, int indent) - { - if (target.IsEntity) { - WriteLine(indent, "Hierarchy: " + target.Hierarchy.Root.Name); - if (target.Hierarchy.Root!=target) - WriteLine(indent, "Ancestor: " + target.GetAncestor().Name); - } - else if (target.IsInterface) { - WriteLine(indent, "Implementors: " + target.GetImplementors().Select(t => t.Name).ToCommaDelimitedString()); - } - - target.DumpMappingName(indent); - WriteLine(indent, "UnderlyingType: " + target.UnderlyingType.FullName); - WriteLine(indent, "Attributes: " + target.Attributes); - WriteLine(indent, "Fields:"); - foreach (FieldInfo field in target.Fields) { - field.DumpName(indent + 1); - field.Dump(indent + 2); - } - WriteLine(indent, "Columns:"); - foreach (ColumnInfo column in target.Columns) { - column.DumpName(indent + 1); - column.Dump(indent + 2); - } - if (target.IsEntity && target.FieldMap.Count > 0) { - WriteLine(indent + 1, "FieldMap:"); - foreach (KeyValuePair pair in target.FieldMap) - WriteLine(indent + 2, pair.Key.ReflectedType.Name + "." + pair.Key.Name + " => " + pair.Value.Name); - } - if (target.IsEntity || target.IsInterface) { - if (target.Indexes.Count > 0) { - WriteLine(indent, "Indexes:"); - foreach (var index in target.Indexes) - index.DumpName(indent + 1); - } - } - } - - public static void Dump(this IndexInfo target, int indent) - { - WriteLine(indent, "ShortName: " + target.ShortName); - WriteLine(indent, "Attributes: " + target.Attributes); - WriteLine(indent, "DeclaringType: " + target.DeclaringType.Name); - WriteLine(indent, "ReflectedType: " + target.ReflectedType.Name); - if (target.IsVirtual) { - WriteLine(indent, "BaseIndexes:"); - foreach (IndexInfo baseIndex in target.UnderlyingIndexes) { - baseIndex.DumpName(indent + 1); - WriteLine(indent + 2, "Attributes: " + baseIndex.Attributes); - } - } - WriteLine(indent, "Column group:"); - WriteLine(indent + 1, "Columns: " + target.Group.Columns.Select(i => target.Columns[i]).ToCommaDelimitedString()); - - WriteLine(indent, "KeyColumns:"); - foreach (KeyValuePair pair in target.KeyColumns) { - WriteLine(indent + 1, pair.Key.Name); - WriteLine(indent + 2, "Direction: " + pair.Value); - pair.Key.Dump(indent + 2); - } - WriteLine(indent, "IncludedColumns:"); - foreach (ColumnInfo column in target.IncludedColumns) { - column.DumpName(indent + 1); - column.Dump(indent + 2); - } - WriteLine(indent, "ValueColumns:"); - foreach (ColumnInfo column in target.ValueColumns) { - column.DumpName(indent + 1); - column.Dump(indent + 2); - } - } - - public static void Dump(this FieldInfo target, int indent) - { - WriteLine(indent, "OriginalName: " + target.OriginalName); - WriteLine(indent, "ValueType: " + target.ValueType.Name); - WriteLine(indent, "Attributes: " + target.Attributes); - if (target.DeclaringType!=target.ReflectedType) - WriteLine(indent, "DeclaringType: " + target.DeclaringType.Name); - target.DumpMappingName(indent); - if (target.UnderlyingProperty!=null) - WriteLine(indent, "UnderlyingProperty: " + target.UnderlyingProperty.Name); - if (target.Length.HasValue) - WriteLine(indent, "Length: " + target.Length); - if (target.Column!=null) - WriteLine(indent, "Column: " + target.Column.Name); - WriteLine(indent, "MappingInfo: " + target.MappingInfo); - } - - public static void Dump(this ColumnInfo target, int indent) - { - WriteLine(indent, "ValueType: " + target.ValueType.Name); - WriteLine(indent, "Attributes: " + target.Attributes); - if (target.Length.HasValue) - WriteLine(indent, "Length: " + target.Length); - } - - private static void WriteLine(int indent, string value) - { - Console.WriteLine(GetIndent(indent) + value); - } - - private static string GetIndent(int indent) - { - return new string(' ', indent * 2); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.06.21 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests +{ + public static class DomainModelExtensions + { + public static void Dump(this DomainModel target) + { + Console.WriteLine("----------------------------------------"); + Console.WriteLine("Model dump"); + Console.WriteLine("----------------------------------------"); + Console.WriteLine("Structures:"); + foreach (TypeInfo type in target.Types.Structures) { + type.DumpName(1); + type.Dump(2); + } + Console.WriteLine("Hierarchies:"); + foreach (HierarchyInfo hierarchy in target.Hierarchies) { + hierarchy.Root.DumpName(1); + hierarchy.Dump(2); + } + Console.WriteLine("Entities:"); + foreach (TypeInfo type in target.Types.Entities) { + type.DumpName(1); + type.Dump(2); + } + Console.WriteLine("Interfaces:"); + foreach (TypeInfo type in target.Types.Interfaces) { + type.DumpName(1); + type.Dump(2); + } + Console.WriteLine("Associations:"); + foreach (AssociationInfo association in target.Associations) { + association.DumpName(1); + association.Dump(2); + } + Console.WriteLine("Indexes:"); + foreach (IndexInfo index in target.Types.Where(type => type.IsEntity).SelectMany(type => type.Indexes)) { + index.DumpName(1); + index.Dump(2); + } + foreach (IndexInfo index in target.Types.Where(type => type.IsInterface).SelectMany(type => type.Indexes)) { + index.DumpName(1); + index.Dump(2); + } + } + + public static void Dump(this TypeInfoCollection target) + { + Console.WriteLine("Structures:"); + foreach (TypeInfo type in target.Structures) { + type.DumpName(1); + type.DumpAncestor(2); + type.DumpDescendants(2); + } + Console.WriteLine("Entities:"); + foreach (TypeInfo type in target.Entities) { + type.DumpName(1); + type.DumpAncestor(2); + type.DumpDescendants(2); + type.DumpInterfaces(2); + } + Console.WriteLine("Interfaces:"); + foreach (TypeInfo type in target.Interfaces) { + type.DumpName(1); + type.DumpInterfaces(2); + type.DumpDescendants(2); + type.DumpImplementors(2); + } + } + + public static void DumpAncestor(this TypeInfo target, int indent) + { + TypeInfo ancestor = target.GetAncestor(); + if (ancestor!=null) + WriteLine(indent + 1, "Ancestor: " + ancestor.Name); + else { + WriteLine(indent + 1, "Ancestor: None"); + } + } + + public static void DumpDescendants(this TypeInfo target, int indent) + { + WriteLine(indent, "Descendants:"); + HashSet direct = new HashSet(target.GetDescendants()); + foreach (TypeInfo descendant in target.GetDescendants(true)) { + if (direct.Contains(descendant)) + WriteLine(indent + 1, descendant.Name + " (direct)"); + else + WriteLine(indent + 1, descendant.Name); + } + } + + public static void DumpInterfaces(this TypeInfo target, int indent) + { + WriteLine(indent, "Interfaces:"); + HashSet direct = new HashSet(target.GetInterfaces()); + foreach (TypeInfo @interface in target.GetInterfaces(true)) { + if (direct.Contains(@interface)) + WriteLine(indent + 1, @interface.Name + " (direct)"); + else + WriteLine(indent + 1, @interface.Name); + } + } + + public static void DumpImplementors(this TypeInfo target, int indent) + { + WriteLine(indent, "Implementors:"); + HashSet direct = new HashSet(target.GetImplementors()); + foreach (TypeInfo implementor in target.GetImplementors(true)) { + if (direct.Contains(implementor)) + WriteLine(indent + 1, implementor.Name + " (direct)"); + else + WriteLine(indent + 1, implementor.Name); + } + } + + public static void DumpName(this Node target, int indent) + { + WriteLine(indent, target.Name); + } + + public static void DumpMappingName(this MappedNode target, int indent) + { + if (target.MappingName.IsNullOrEmpty()) + return; + WriteLine(indent, "MappingName: " + target.MappingName); + } + + public static void Dump(this HierarchyInfo target, int indent) + { + WriteLine(indent, "InheritanceSchema: " + target.InheritanceSchema); + WriteLine(indent, "KeyFields:"); + foreach (var pair in target.Root.Fields.Where(f => f.IsPrimaryKey)) { + WriteLine(indent + 1, pair.Name + "(" + pair.ValueType + ") "); + } + } + + public static void Dump(this AssociationInfo target, int indent) + { + WriteLine(indent, "Referencing type: " + target.OwnerType.Name); + WriteLine(indent, "Referencing field: " + target.OwnerField.Name); + WriteLine(indent, "Referenced type: " + target.TargetType.Name); + WriteLine(indent, "Multiplicity: " + target.Multiplicity); + WriteLine(indent, "On Delete: " + target.OnTargetRemove); + WriteLine(indent, "Master: " + target.IsMaster); + if (target.Reversed!=null) + WriteLine(indent, "Reversed: " + target.Reversed.Name); + } + + public static void Dump(this TypeInfo target, int indent) + { + if (target.IsEntity) { + WriteLine(indent, "Hierarchy: " + target.Hierarchy.Root.Name); + if (target.Hierarchy.Root!=target) + WriteLine(indent, "Ancestor: " + target.GetAncestor().Name); + } + else if (target.IsInterface) { + WriteLine(indent, "Implementors: " + target.GetImplementors().Select(t => t.Name).ToCommaDelimitedString()); + } + + target.DumpMappingName(indent); + WriteLine(indent, "UnderlyingType: " + target.UnderlyingType.FullName); + WriteLine(indent, "Attributes: " + target.Attributes); + WriteLine(indent, "Fields:"); + foreach (FieldInfo field in target.Fields) { + field.DumpName(indent + 1); + field.Dump(indent + 2); + } + WriteLine(indent, "Columns:"); + foreach (ColumnInfo column in target.Columns) { + column.DumpName(indent + 1); + column.Dump(indent + 2); + } + if (target.IsEntity && target.FieldMap.Count > 0) { + WriteLine(indent + 1, "FieldMap:"); + foreach (KeyValuePair pair in target.FieldMap) + WriteLine(indent + 2, pair.Key.ReflectedType.Name + "." + pair.Key.Name + " => " + pair.Value.Name); + } + if (target.IsEntity || target.IsInterface) { + if (target.Indexes.Count > 0) { + WriteLine(indent, "Indexes:"); + foreach (var index in target.Indexes) + index.DumpName(indent + 1); + } + } + } + + public static void Dump(this IndexInfo target, int indent) + { + WriteLine(indent, "ShortName: " + target.ShortName); + WriteLine(indent, "Attributes: " + target.Attributes); + WriteLine(indent, "DeclaringType: " + target.DeclaringType.Name); + WriteLine(indent, "ReflectedType: " + target.ReflectedType.Name); + if (target.IsVirtual) { + WriteLine(indent, "BaseIndexes:"); + foreach (IndexInfo baseIndex in target.UnderlyingIndexes) { + baseIndex.DumpName(indent + 1); + WriteLine(indent + 2, "Attributes: " + baseIndex.Attributes); + } + } + WriteLine(indent, "Column group:"); + WriteLine(indent + 1, "Columns: " + target.Group.Columns.Select(i => target.Columns[i]).ToCommaDelimitedString()); + + WriteLine(indent, "KeyColumns:"); + foreach (KeyValuePair pair in target.KeyColumns) { + WriteLine(indent + 1, pair.Key.Name); + WriteLine(indent + 2, "Direction: " + pair.Value); + pair.Key.Dump(indent + 2); + } + WriteLine(indent, "IncludedColumns:"); + foreach (ColumnInfo column in target.IncludedColumns) { + column.DumpName(indent + 1); + column.Dump(indent + 2); + } + WriteLine(indent, "ValueColumns:"); + foreach (ColumnInfo column in target.ValueColumns) { + column.DumpName(indent + 1); + column.Dump(indent + 2); + } + } + + public static void Dump(this FieldInfo target, int indent) + { + WriteLine(indent, "OriginalName: " + target.OriginalName); + WriteLine(indent, "ValueType: " + target.ValueType.Name); + WriteLine(indent, "Attributes: " + target.Attributes); + if (target.DeclaringType!=target.ReflectedType) + WriteLine(indent, "DeclaringType: " + target.DeclaringType.Name); + target.DumpMappingName(indent); + if (target.UnderlyingProperty!=null) + WriteLine(indent, "UnderlyingProperty: " + target.UnderlyingProperty.Name); + if (target.Length.HasValue) + WriteLine(indent, "Length: " + target.Length); + if (target.Column!=null) + WriteLine(indent, "Column: " + target.Column.Name); + WriteLine(indent, "MappingInfo: " + target.MappingInfo); + } + + public static void Dump(this ColumnInfo target, int indent) + { + WriteLine(indent, "ValueType: " + target.ValueType.Name); + WriteLine(indent, "Attributes: " + target.Attributes); + if (target.Length.HasValue) + WriteLine(indent, "Length: " + target.Length); + } + + private static void WriteLine(int indent, string value) + { + Console.WriteLine(GetIndent(indent) + value); + } + + private static string GetIndent(int indent) + { + return new string(' ', indent * 2); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs b/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs index f0153a1bcd..01ce6463cf 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs @@ -1,2302 +1,2302 @@ -//Copyright (C) Microsoft Corporation. All rights reserved. - -using System.Collections.Generic; -using System.Globalization; -using System.Linq.Expressions; -using System.Reflection; -using System.Reflection.Emit; -using System.Text; -using System.Threading; - -namespace System.Linq.Dynamic -{ - public static class DynamicQueryable - { - public static IQueryable Where(this IQueryable source, string predicate, params object[] values) - { - return (IQueryable) Where((IQueryable) source, predicate, values); - } - - public static IQueryable Where(this IQueryable source, string predicate, params object[] values) - { - if (source == null) throw new ArgumentNullException("source"); - if (predicate == null) throw new ArgumentNullException("predicate"); - LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof (bool), predicate, values); - return source.Provider.CreateQuery( - Expression.Call( - typeof (Queryable), "Where", - new[] {source.ElementType}, - source.Expression, Expression.Quote(lambda))); - } - - public static IQueryable Select(this IQueryable source, string selector, params object[] values) - { - if (source == null) throw new ArgumentNullException("source"); - if (selector == null) throw new ArgumentNullException("selector"); - LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, null, selector, values); - return source.Provider.CreateQuery( - Expression.Call( - typeof (Queryable), "Select", - new[] {source.ElementType, lambda.Body.Type}, - source.Expression, Expression.Quote(lambda))); - } - - public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) - { - return (IQueryable) OrderBy((IQueryable) source, ordering, values); - } - - public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) - { - if (source == null) throw new ArgumentNullException("source"); - if (ordering == null) throw new ArgumentNullException("ordering"); - var parameters = new[] - { - Expression.Parameter(source.ElementType, "") - }; - var parser = new ExpressionParser(parameters, ordering, values); - IEnumerable orderings = parser.ParseOrdering(); - Expression queryExpr = source.Expression; - string methodAsc = "OrderBy"; - string methodDesc = "OrderByDescending"; - foreach (DynamicOrdering o in orderings) - { - queryExpr = Expression.Call( - typeof (Queryable), o.Ascending ? methodAsc : methodDesc, - new[] {source.ElementType, o.Selector.Type}, - queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters))); - methodAsc = "ThenBy"; - methodDesc = "ThenByDescending"; - } - return source.Provider.CreateQuery(queryExpr); - } - - public static IQueryable Take(this IQueryable source, int count) - { - if (source == null) throw new ArgumentNullException("source"); - return source.Provider.CreateQuery( - Expression.Call( - typeof (Queryable), "Take", - new[] {source.ElementType}, - source.Expression, Expression.Constant(count))); - } - - public static IQueryable Skip(this IQueryable source, int count) - { - if (source == null) throw new ArgumentNullException("source"); - return source.Provider.CreateQuery( - Expression.Call( - typeof (Queryable), "Skip", - new[] {source.ElementType}, - source.Expression, Expression.Constant(count))); - } - - public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, - params object[] values) - { - if (source == null) throw new ArgumentNullException("source"); - if (keySelector == null) throw new ArgumentNullException("keySelector"); - if (elementSelector == null) throw new ArgumentNullException("elementSelector"); - LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values); - LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values); - return source.Provider.CreateQuery( - Expression.Call( - typeof (Queryable), "GroupBy", - new[] {source.ElementType, keyLambda.Body.Type, elementLambda.Body.Type}, - source.Expression, Expression.Quote(keyLambda), Expression.Quote(elementLambda))); - } - - public static bool Any(this IQueryable source) - { - if (source == null) throw new ArgumentNullException("source"); - return (bool) source.Provider.Execute( - Expression.Call( - typeof (Queryable), "Any", - new[] {source.ElementType}, source.Expression)); - } - - public static int Count(this IQueryable source) - { - if (source == null) throw new ArgumentNullException("source"); - return (int) source.Provider.Execute( - Expression.Call( - typeof (Queryable), "Count", - new[] {source.ElementType}, source.Expression)); - } - } - - public abstract class DynamicClass - { - public override string ToString() - { - PropertyInfo[] props = GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); - var sb = new StringBuilder(); - sb.Append("{"); - for (int i = 0; i < props.Length; i++) - { - if (i > 0) sb.Append(", "); - sb.Append(props[i].Name); - sb.Append("="); - sb.Append(props[i].GetValue(this, null)); - } - sb.Append("}"); - return sb.ToString(); - } - } - - public class DynamicProperty - { - private readonly string name; - private readonly Type type; - - public DynamicProperty(string name, Type type) - { - if (name == null) throw new ArgumentNullException("name"); - if (type == null) throw new ArgumentNullException("type"); - this.name = name; - this.type = type; - } - - public string Name - { - get { return name; } - } - - public Type Type - { - get { return type; } - } - } - - public static class DynamicExpression - { - public static Expression Parse(Type resultType, string expression, params object[] values) - { - var parser = new ExpressionParser(null, expression, values); - return parser.Parse(resultType); - } - - public static LambdaExpression ParseLambda(Type itType, Type resultType, string expression, params object[] values) - { - return ParseLambda(new[] {Expression.Parameter(itType, "")}, resultType, expression, values); - } - - public static LambdaExpression ParseLambda(ParameterExpression[] parameters, Type resultType, string expression, - params object[] values) - { - var parser = new ExpressionParser(parameters, expression, values); - return Expression.Lambda(parser.Parse(resultType), parameters); - } - - public static Expression> ParseLambda(string expression, params object[] values) - { - return (Expression>) ParseLambda(typeof (T), typeof (S), expression, values); - } - - public static Type CreateClass(params DynamicProperty[] properties) - { - return ClassFactory.Instance.GetDynamicClass(properties); - } - - public static Type CreateClass(IEnumerable properties) - { - return ClassFactory.Instance.GetDynamicClass(properties); - } - } - - internal class DynamicOrdering - { - public bool Ascending; - public Expression Selector; - } - - internal class Signature : IEquatable - { - public int hashCode; - public DynamicProperty[] properties; - - public Signature(IEnumerable properties) - { - this.properties = properties.ToArray(); - hashCode = 0; - foreach (DynamicProperty p in properties) - { - hashCode ^= p.Name.GetHashCode() ^ p.Type.GetHashCode(); - } - } - - #region IEquatable Members - - public bool Equals(Signature other) - { - if (properties.Length != other.properties.Length) return false; - for (int i = 0; i < properties.Length; i++) - { - if (properties[i].Name != other.properties[i].Name || - properties[i].Type != other.properties[i].Type) return false; - } - return true; - } - - #endregion - - public override int GetHashCode() - { - return hashCode; - } - - public override bool Equals(object obj) - { - return obj is Signature ? Equals((Signature) obj) : false; - } - } - - internal class ClassFactory - { - public static readonly ClassFactory Instance = new ClassFactory(); - - // Trigger lazy initialization of static fields - - private readonly Dictionary classes; - private readonly ModuleBuilder module; - private readonly ReaderWriterLock rwLock; - private int classCount; - - private ClassFactory() - { - var name = new AssemblyName("DynamicClasses"); - AssemblyBuilder assembly = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); - -#if ENABLE_LINQ_PARTIAL_TRUST - new ReflectionPermission(PermissionState.Unrestricted).Assert(); -#endif - try - { - module = assembly.DefineDynamicModule("Module"); - } - finally - { -#if ENABLE_LINQ_PARTIAL_TRUST - PermissionSet.RevertAssert(); -#endif - } - classes = new Dictionary(); - rwLock = new ReaderWriterLock(); - } - - public Type GetDynamicClass(IEnumerable properties) - { - rwLock.AcquireReaderLock(Timeout.Infinite); - try - { - var signature = new Signature(properties); - Type type; - if (!classes.TryGetValue(signature, out type)) - { - type = CreateDynamicClass(signature.properties); - classes.Add(signature, type); - } - return type; - } - finally - { - rwLock.ReleaseReaderLock(); - } - } - - private Type CreateDynamicClass(DynamicProperty[] properties) - { - LockCookie cookie = rwLock.UpgradeToWriterLock(Timeout.Infinite); - try - { - string typeName = "DynamicClass" + (classCount + 1); -#if ENABLE_LINQ_PARTIAL_TRUST - new ReflectionPermission(PermissionState.Unrestricted).Assert(); -#endif - try - { - TypeBuilder tb = module.DefineType(typeName, TypeAttributes.Class | - TypeAttributes.Public, typeof (DynamicClass)); - FieldInfo[] fields = GenerateProperties(tb, properties); - GenerateEquals(tb, fields); - GenerateGetHashCode(tb, fields); - Type result = tb.CreateTypeInfo().AsType(); - classCount++; - return result; - } - finally - { -#if ENABLE_LINQ_PARTIAL_TRUST - PermissionSet.RevertAssert(); -#endif - } - } - finally - { - rwLock.DowngradeFromWriterLock(ref cookie); - } - } - - private FieldInfo[] GenerateProperties(TypeBuilder tb, DynamicProperty[] properties) - { - FieldInfo[] fields = new FieldBuilder[properties.Length]; - for (int i = 0; i < properties.Length; i++) - { - DynamicProperty dp = properties[i]; - FieldBuilder fb = tb.DefineField("_" + dp.Name, dp.Type, FieldAttributes.Private); - PropertyBuilder pb = tb.DefineProperty(dp.Name, PropertyAttributes.HasDefault, dp.Type, null); - MethodBuilder mbGet = tb.DefineMethod("get_" + dp.Name, - MethodAttributes.Public | MethodAttributes.SpecialName | - MethodAttributes.HideBySig, - dp.Type, Type.EmptyTypes); - ILGenerator genGet = mbGet.GetILGenerator(); - genGet.Emit(OpCodes.Ldarg_0); - genGet.Emit(OpCodes.Ldfld, fb); - genGet.Emit(OpCodes.Ret); - MethodBuilder mbSet = tb.DefineMethod("set_" + dp.Name, - MethodAttributes.Public | MethodAttributes.SpecialName | - MethodAttributes.HideBySig, - null, new[] {dp.Type}); - ILGenerator genSet = mbSet.GetILGenerator(); - genSet.Emit(OpCodes.Ldarg_0); - genSet.Emit(OpCodes.Ldarg_1); - genSet.Emit(OpCodes.Stfld, fb); - genSet.Emit(OpCodes.Ret); - pb.SetGetMethod(mbGet); - pb.SetSetMethod(mbSet); - fields[i] = fb; - } - return fields; - } - - private void GenerateEquals(TypeBuilder tb, FieldInfo[] fields) - { - MethodBuilder mb = tb.DefineMethod("Equals", - MethodAttributes.Public | MethodAttributes.ReuseSlot | - MethodAttributes.Virtual | MethodAttributes.HideBySig, - typeof (bool), new[] {typeof (object)}); - ILGenerator gen = mb.GetILGenerator(); - LocalBuilder other = gen.DeclareLocal(tb); - Label next = gen.DefineLabel(); - gen.Emit(OpCodes.Ldarg_1); - gen.Emit(OpCodes.Isinst, tb); - gen.Emit(OpCodes.Stloc, other); - gen.Emit(OpCodes.Ldloc, other); - gen.Emit(OpCodes.Brtrue_S, next); - gen.Emit(OpCodes.Ldc_I4_0); - gen.Emit(OpCodes.Ret); - gen.MarkLabel(next); - foreach (FieldInfo field in fields) - { - Type ft = field.FieldType; - Type ct = typeof (EqualityComparer<>).MakeGenericType(ft); - next = gen.DefineLabel(); - gen.EmitCall(OpCodes.Call, ct.GetMethod("get_Default"), null); - gen.Emit(OpCodes.Ldarg_0); - gen.Emit(OpCodes.Ldfld, field); - gen.Emit(OpCodes.Ldloc, other); - gen.Emit(OpCodes.Ldfld, field); - gen.EmitCall(OpCodes.Callvirt, ct.GetMethod("Equals", new[] {ft, ft}), null); - gen.Emit(OpCodes.Brtrue_S, next); - gen.Emit(OpCodes.Ldc_I4_0); - gen.Emit(OpCodes.Ret); - gen.MarkLabel(next); - } - gen.Emit(OpCodes.Ldc_I4_1); - gen.Emit(OpCodes.Ret); - } - - private void GenerateGetHashCode(TypeBuilder tb, FieldInfo[] fields) - { - MethodBuilder mb = tb.DefineMethod("GetHashCode", - MethodAttributes.Public | MethodAttributes.ReuseSlot | - MethodAttributes.Virtual | MethodAttributes.HideBySig, - typeof (int), Type.EmptyTypes); - ILGenerator gen = mb.GetILGenerator(); - gen.Emit(OpCodes.Ldc_I4_0); - foreach (FieldInfo field in fields) - { - Type ft = field.FieldType; - Type ct = typeof (EqualityComparer<>).MakeGenericType(ft); - gen.EmitCall(OpCodes.Call, ct.GetMethod("get_Default"), null); - gen.Emit(OpCodes.Ldarg_0); - gen.Emit(OpCodes.Ldfld, field); - gen.EmitCall(OpCodes.Callvirt, ct.GetMethod("GetHashCode", new[] {ft}), null); - gen.Emit(OpCodes.Xor); - } - gen.Emit(OpCodes.Ret); - } - } - - public sealed class ParseException : Exception - { - private readonly int position; - - public ParseException(string message, int position) - : base(message) - { - this.position = position; - } - - public int Position - { - get { return position; } - } - - public override string ToString() - { - return string.Format(Res.ParseExceptionFormat, Message, position); - } - } - - internal class ExpressionParser - { - private struct Token - { - public TokenId id; - public int pos; - public string text; - } - - private enum TokenId - { - Unknown, - End, - Identifier, - StringLiteral, - IntegerLiteral, - RealLiteral, - Exclamation, - Percent, - Amphersand, - OpenParen, - CloseParen, - Asterisk, - Plus, - Comma, - Minus, - Dot, - Slash, - Colon, - LessThan, - Equal, - GreaterThan, - Question, - OpenBracket, - CloseBracket, - Bar, - ExclamationEqual, - DoubleAmphersand, - LessThanEqual, - LessGreater, - DoubleEqual, - GreaterThanEqual, - DoubleBar - } - - private interface ILogicalSignatures - { - void F(bool x, bool y); - void F(bool? x, bool? y); - } - - private interface IArithmeticSignatures - { - void F(int x, int y); - void F(uint x, uint y); - void F(long x, long y); - void F(ulong x, ulong y); - void F(float x, float y); - void F(double x, double y); - void F(decimal x, decimal y); - void F(int? x, int? y); - void F(uint? x, uint? y); - void F(long? x, long? y); - void F(ulong? x, ulong? y); - void F(float? x, float? y); - void F(double? x, double? y); - void F(decimal? x, decimal? y); - } - - private interface IRelationalSignatures : IArithmeticSignatures - { - void F(string x, string y); - void F(char x, char y); - void F(DateTime x, DateTime y); - void F(TimeSpan x, TimeSpan y); - void F(char? x, char? y); - void F(DateTime? x, DateTime? y); - void F(TimeSpan? x, TimeSpan? y); - } - - private interface IEqualitySignatures : IRelationalSignatures - { - void F(bool x, bool y); - void F(bool? x, bool? y); - } - - private interface IAddSignatures : IArithmeticSignatures - { - void F(DateTime x, TimeSpan y); - void F(TimeSpan x, TimeSpan y); - void F(DateTime? x, TimeSpan? y); - void F(TimeSpan? x, TimeSpan? y); - } - - private interface ISubtractSignatures : IAddSignatures - { - void F(DateTime x, DateTime y); - void F(DateTime? x, DateTime? y); - } - - private interface INegationSignatures - { - void F(int x); - void F(long x); - void F(float x); - void F(double x); - void F(decimal x); - void F(int? x); - void F(long? x); - void F(float? x); - void F(double? x); - void F(decimal? x); - } - - private interface INotSignatures - { - void F(bool x); - void F(bool? x); - } - - private interface IEnumerableSignatures - { - void Where(bool predicate); - void Any(); - void Any(bool predicate); - void All(bool predicate); - void Count(); - void Count(bool predicate); - void Min(object selector); - void Max(object selector); - void Sum(int selector); - void Sum(int? selector); - void Sum(long selector); - void Sum(long? selector); - void Sum(float selector); - void Sum(float? selector); - void Sum(double selector); - void Sum(double? selector); - void Sum(decimal selector); - void Sum(decimal? selector); - void Average(int selector); - void Average(int? selector); - void Average(long selector); - void Average(long? selector); - void Average(float selector); - void Average(float? selector); - void Average(double selector); - void Average(double? selector); - void Average(decimal selector); - void Average(decimal? selector); - } - - private static readonly Type[] predefinedTypes = { - typeof (Object), - typeof (Boolean), - typeof (Char), - typeof (String), - typeof (SByte), - typeof (Byte), - typeof (Int16), - typeof (UInt16), - typeof (Int32), - typeof (UInt32), - typeof (Int64), - typeof (UInt64), - typeof (Single), - typeof (Double), - typeof (Decimal), - typeof (DateTime), - typeof (TimeSpan), - typeof (Guid), - typeof (Math), - typeof (Convert) - }; - - private static readonly Expression trueLiteral = Expression.Constant(true); - private static readonly Expression falseLiteral = Expression.Constant(false); - private static readonly Expression nullLiteral = Expression.Constant(null); - - private static readonly string keywordIt = "it"; - private static readonly string keywordIif = "iif"; - private static readonly string keywordNew = "new"; - - private static Dictionary keywords; - - private readonly Dictionary symbols; - private IDictionary externals; - private readonly Dictionary literals; - private ParameterExpression it; - private readonly string text; - private int textPos; - private readonly int textLen; - private char ch; - private Token token; - - public ExpressionParser(ParameterExpression[] parameters, string expression, object[] values) - { - if (expression == null) throw new ArgumentNullException("expression"); - if (keywords == null) keywords = CreateKeywords(); - symbols = new Dictionary(StringComparer.OrdinalIgnoreCase); - literals = new Dictionary(); - if (parameters != null) ProcessParameters(parameters); - if (values != null) ProcessValues(values); - text = expression; - textLen = text.Length; - SetTextPos(0); - NextToken(); - } - - private void ProcessParameters(ParameterExpression[] parameters) - { - foreach (ParameterExpression pe in parameters) - if (!String.IsNullOrEmpty(pe.Name)) - AddSymbol(pe.Name, pe); - if (parameters.Length == 1 && String.IsNullOrEmpty(parameters[0].Name)) - it = parameters[0]; - } - - private void ProcessValues(object[] values) - { - for (int i = 0; i < values.Length; i++) - { - object value = values[i]; - if (i == values.Length - 1 && value is IDictionary) - { - externals = (IDictionary) value; - } - else - { - AddSymbol("@" + i.ToString(CultureInfo.InvariantCulture), value); - } - } - } - - private void AddSymbol(string name, object value) - { - if (symbols.ContainsKey(name)) - throw ParseError(Res.DuplicateIdentifier, name); - symbols.Add(name, value); - } - - public Expression Parse(Type resultType) - { - int exprPos = token.pos; - Expression expr = ParseExpression(); - if (resultType != null) - if ((expr = PromoteExpression(expr, resultType, true)) == null) - throw ParseError(exprPos, Res.ExpressionTypeMismatch, GetTypeName(resultType)); - ValidateToken(TokenId.End, Res.SyntaxError); - return expr; - } - -#pragma warning disable 0219 - public IEnumerable ParseOrdering() - { - var orderings = new List(); - while (true) - { - Expression expr = ParseExpression(); - bool ascending = true; - if (TokenIdentifierIs("asc") || TokenIdentifierIs("ascending")) - { - NextToken(); - } - else if (TokenIdentifierIs("desc") || TokenIdentifierIs("descending")) - { - NextToken(); - ascending = false; - } - orderings.Add(new DynamicOrdering {Selector = expr, Ascending = ascending}); - if (token.id != TokenId.Comma) break; - NextToken(); - } - ValidateToken(TokenId.End, Res.SyntaxError); - return orderings; - } -#pragma warning restore 0219 - - // ?: operator - private Expression ParseExpression() - { - int errorPos = token.pos; - Expression expr = ParseLogicalOr(); - if (token.id == TokenId.Question) - { - NextToken(); - Expression expr1 = ParseExpression(); - ValidateToken(TokenId.Colon, Res.ColonExpected); - NextToken(); - Expression expr2 = ParseExpression(); - expr = GenerateConditional(expr, expr1, expr2, errorPos); - } - return expr; - } - - // ||, or operator - private Expression ParseLogicalOr() - { - Expression left = ParseLogicalAnd(); - while (token.id == TokenId.DoubleBar || TokenIdentifierIs("or")) - { - Token op = token; - NextToken(); - Expression right = ParseLogicalAnd(); - CheckAndPromoteOperands(typeof (ILogicalSignatures), op.text, ref left, ref right, op.pos); - left = Expression.OrElse(left, right); - } - return left; - } - - // &&, and operator - private Expression ParseLogicalAnd() - { - Expression left = ParseComparison(); - while (token.id == TokenId.DoubleAmphersand || TokenIdentifierIs("and")) - { - Token op = token; - NextToken(); - Expression right = ParseComparison(); - CheckAndPromoteOperands(typeof (ILogicalSignatures), op.text, ref left, ref right, op.pos); - left = Expression.AndAlso(left, right); - } - return left; - } - - // =, ==, !=, <>, >, >=, <, <= operators - private Expression ParseComparison() - { - Expression left = ParseAdditive(); - while (token.id == TokenId.Equal || token.id == TokenId.DoubleEqual || - token.id == TokenId.ExclamationEqual || token.id == TokenId.LessGreater || - token.id == TokenId.GreaterThan || token.id == TokenId.GreaterThanEqual || - token.id == TokenId.LessThan || token.id == TokenId.LessThanEqual) - { - Token op = token; - NextToken(); - Expression right = ParseAdditive(); - bool isEquality = op.id == TokenId.Equal || op.id == TokenId.DoubleEqual || - op.id == TokenId.ExclamationEqual || op.id == TokenId.LessGreater; - if (isEquality && !left.Type.IsValueType && !right.Type.IsValueType) - { - if (left.Type != right.Type) - { - if (left.Type.IsAssignableFrom(right.Type)) - { - right = Expression.Convert(right, left.Type); - } - else if (right.Type.IsAssignableFrom(left.Type)) - { - left = Expression.Convert(left, right.Type); - } - else - { - throw IncompatibleOperandsError(op.text, left, right, op.pos); - } - } - } - else if (IsEnumType(left.Type) || IsEnumType(right.Type)) - { - if (left.Type != right.Type) - { - Expression e; - if ((e = PromoteExpression(right, left.Type, true)) != null) - { - right = e; - } - else if ((e = PromoteExpression(left, right.Type, true)) != null) - { - left = e; - } - else - { - throw IncompatibleOperandsError(op.text, left, right, op.pos); - } - } - } - else - { - CheckAndPromoteOperands(isEquality ? typeof (IEqualitySignatures) : typeof (IRelationalSignatures), - op.text, ref left, ref right, op.pos); - } - switch (op.id) - { - case TokenId.Equal: - case TokenId.DoubleEqual: - left = GenerateEqual(left, right); - break; - case TokenId.ExclamationEqual: - case TokenId.LessGreater: - left = GenerateNotEqual(left, right); - break; - case TokenId.GreaterThan: - left = GenerateGreaterThan(left, right); - break; - case TokenId.GreaterThanEqual: - left = GenerateGreaterThanEqual(left, right); - break; - case TokenId.LessThan: - left = GenerateLessThan(left, right); - break; - case TokenId.LessThanEqual: - left = GenerateLessThanEqual(left, right); - break; - } - } - return left; - } - - // +, -, & operators - private Expression ParseAdditive() - { - Expression left = ParseMultiplicative(); - while (token.id == TokenId.Plus || token.id == TokenId.Minus || - token.id == TokenId.Amphersand) - { - Token op = token; - NextToken(); - Expression right = ParseMultiplicative(); - switch (op.id) - { - case TokenId.Plus: - if (left.Type == typeof (string) || right.Type == typeof (string)) - goto case TokenId.Amphersand; - CheckAndPromoteOperands(typeof (IAddSignatures), op.text, ref left, ref right, op.pos); - left = GenerateAdd(left, right); - break; - case TokenId.Minus: - CheckAndPromoteOperands(typeof (ISubtractSignatures), op.text, ref left, ref right, op.pos); - left = GenerateSubtract(left, right); - break; - case TokenId.Amphersand: - left = GenerateStringConcat(left, right); - break; - } - } - return left; - } - - // *, /, %, mod operators - private Expression ParseMultiplicative() - { - Expression left = ParseUnary(); - while (token.id == TokenId.Asterisk || token.id == TokenId.Slash || - token.id == TokenId.Percent || TokenIdentifierIs("mod")) - { - Token op = token; - NextToken(); - Expression right = ParseUnary(); - CheckAndPromoteOperands(typeof (IArithmeticSignatures), op.text, ref left, ref right, op.pos); - switch (op.id) - { - case TokenId.Asterisk: - left = Expression.Multiply(left, right); - break; - case TokenId.Slash: - left = Expression.Divide(left, right); - break; - case TokenId.Percent: - case TokenId.Identifier: - left = Expression.Modulo(left, right); - break; - } - } - return left; - } - - // -, !, not unary operators - private Expression ParseUnary() - { - if (token.id == TokenId.Minus || token.id == TokenId.Exclamation || - TokenIdentifierIs("not")) - { - Token op = token; - NextToken(); - if (op.id == TokenId.Minus && (token.id == TokenId.IntegerLiteral || - token.id == TokenId.RealLiteral)) - { - token.text = "-" + token.text; - token.pos = op.pos; - return ParsePrimary(); - } - Expression expr = ParseUnary(); - if (op.id == TokenId.Minus) - { - CheckAndPromoteOperand(typeof (INegationSignatures), op.text, ref expr, op.pos); - expr = Expression.Negate(expr); - } - else - { - CheckAndPromoteOperand(typeof (INotSignatures), op.text, ref expr, op.pos); - expr = Expression.Not(expr); - } - return expr; - } - return ParsePrimary(); - } - - private Expression ParsePrimary() - { - Expression expr = ParsePrimaryStart(); - while (true) - { - if (token.id == TokenId.Dot) - { - NextToken(); - expr = ParseMemberAccess(null, expr); - } - else if (token.id == TokenId.OpenBracket) - { - expr = ParseElementAccess(expr); - } - else - { - break; - } - } - return expr; - } - - private Expression ParsePrimaryStart() - { - switch (token.id) - { - case TokenId.Identifier: - return ParseIdentifier(); - case TokenId.StringLiteral: - return ParseStringLiteral(); - case TokenId.IntegerLiteral: - return ParseIntegerLiteral(); - case TokenId.RealLiteral: - return ParseRealLiteral(); - case TokenId.OpenParen: - return ParseParenExpression(); - default: - throw ParseError(Res.ExpressionExpected); - } - } - - private Expression ParseStringLiteral() - { - ValidateToken(TokenId.StringLiteral); - char quote = token.text[0]; - string s = token.text.Substring(1, token.text.Length - 2); - int start = 0; - while (true) - { - int i = s.IndexOf(quote, start); - if (i < 0) break; - s = s.Remove(i, 1); - start = i + 1; - } - if (quote == '\'') - { - if (s.Length != 1) - throw ParseError(Res.InvalidCharacterLiteral); - NextToken(); - return CreateLiteral(s[0], s); - } - NextToken(); - return CreateLiteral(s, s); - } - - private Expression ParseIntegerLiteral() - { - ValidateToken(TokenId.IntegerLiteral); - string text = token.text; - if (text[0] != '-') - { - ulong value; - if (!UInt64.TryParse(text, out value)) - throw ParseError(Res.InvalidIntegerLiteral, text); - NextToken(); - if (value <= Int32.MaxValue) return CreateLiteral((int) value, text); - if (value <= UInt32.MaxValue) return CreateLiteral((uint) value, text); - if (value <= Int64.MaxValue) return CreateLiteral((long) value, text); - return CreateLiteral(value, text); - } - else - { - long value; - if (!Int64.TryParse(text, out value)) - throw ParseError(Res.InvalidIntegerLiteral, text); - NextToken(); - if (value >= Int32.MinValue && value <= Int32.MaxValue) - return CreateLiteral((int) value, text); - return CreateLiteral(value, text); - } - } - - private Expression ParseRealLiteral() - { - ValidateToken(TokenId.RealLiteral); - string text = token.text; - object value = null; - char last = text[text.Length - 1]; - if (last == 'F' || last == 'f') - { - float f; - if (Single.TryParse(text.Substring(0, text.Length - 1), out f)) value = f; - } - else - { - double d; - if (Double.TryParse(text, out d)) value = d; - } - if (value == null) throw ParseError(Res.InvalidRealLiteral, text); - NextToken(); - return CreateLiteral(value, text); - } - - private Expression CreateLiteral(object value, string text) - { - ConstantExpression expr = Expression.Constant(value); - literals.Add(expr, text); - return expr; - } - - private Expression ParseParenExpression() - { - ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); - NextToken(); - Expression e = ParseExpression(); - ValidateToken(TokenId.CloseParen, Res.CloseParenOrOperatorExpected); - NextToken(); - return e; - } - - private Expression ParseIdentifier() - { - ValidateToken(TokenId.Identifier); - object value; - if (keywords.TryGetValue(token.text, out value)) - { - if (value is Type) return ParseTypeAccess((Type) value); - if ((string) value == keywordIt) return ParseIt(); - if ((string) value == keywordIif) return ParseIif(); - if ((string) value == keywordNew) return ParseNew(); - NextToken(); - return (Expression) value; - } - if (symbols.TryGetValue(token.text, out value) || - externals != null && externals.TryGetValue(token.text, out value)) - { - var expr = value as Expression; - if (expr == null) - { - expr = Expression.Constant(value); - } - else - { - var lambda = expr as LambdaExpression; - if (lambda != null) return ParseLambdaInvocation(lambda); - } - NextToken(); - return expr; - } - if (it != null) return ParseMemberAccess(null, it); - throw ParseError(Res.UnknownIdentifier, token.text); - } - - private Expression ParseIt() - { - if (it == null) - throw ParseError(Res.NoItInScope); - NextToken(); - return it; - } - - private Expression ParseIif() - { - int errorPos = token.pos; - NextToken(); - Expression[] args = ParseArgumentList(); - if (args.Length != 3) - throw ParseError(errorPos, Res.IifRequiresThreeArgs); - return GenerateConditional(args[0], args[1], args[2], errorPos); - } - - private Expression GenerateConditional(Expression test, Expression expr1, Expression expr2, int errorPos) - { - if (test.Type != typeof (bool)) - throw ParseError(errorPos, Res.FirstExprMustBeBool); - if (expr1.Type != expr2.Type) - { - Expression expr1as2 = expr2 != nullLiteral ? PromoteExpression(expr1, expr2.Type, true) : null; - Expression expr2as1 = expr1 != nullLiteral ? PromoteExpression(expr2, expr1.Type, true) : null; - if (expr1as2 != null && expr2as1 == null) - { - expr1 = expr1as2; - } - else if (expr2as1 != null && expr1as2 == null) - { - expr2 = expr2as1; - } - else - { - string type1 = expr1 != nullLiteral ? expr1.Type.Name : "null"; - string type2 = expr2 != nullLiteral ? expr2.Type.Name : "null"; - if (expr1as2 != null && expr2as1 != null) - throw ParseError(errorPos, Res.BothTypesConvertToOther, type1, type2); - throw ParseError(errorPos, Res.NeitherTypeConvertsToOther, type1, type2); - } - } - return Expression.Condition(test, expr1, expr2); - } - - private Expression ParseNew() - { - NextToken(); - ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); - NextToken(); - var properties = new List(); - var expressions = new List(); - while (true) - { - int exprPos = token.pos; - Expression expr = ParseExpression(); - string propName; - if (TokenIdentifierIs("as")) - { - NextToken(); - propName = GetIdentifier(); - NextToken(); - } - else - { - var me = expr as MemberExpression; - if (me == null) throw ParseError(exprPos, Res.MissingAsClause); - propName = me.Member.Name; - } - expressions.Add(expr); - properties.Add(new DynamicProperty(propName, expr.Type)); - if (token.id != TokenId.Comma) break; - NextToken(); - } - ValidateToken(TokenId.CloseParen, Res.CloseParenOrCommaExpected); - NextToken(); - Type type = DynamicExpression.CreateClass(properties); - var bindings = new MemberBinding[properties.Count]; - for (int i = 0; i < bindings.Length; i++) - bindings[i] = Expression.Bind(type.GetProperty(properties[i].Name), expressions[i]); - return Expression.MemberInit(Expression.New(type), bindings); - } - - private Expression ParseLambdaInvocation(LambdaExpression lambda) - { - int errorPos = token.pos; - NextToken(); - Expression[] args = ParseArgumentList(); - MethodBase method; - if (FindMethod(lambda.Type, "Invoke", false, args, out method) != 1) - throw ParseError(errorPos, Res.ArgsIncompatibleWithLambda); - return Expression.Invoke(lambda, args); - } - - private Expression ParseTypeAccess(Type type) - { - int errorPos = token.pos; - NextToken(); - if (token.id == TokenId.Question) - { - if (!type.IsValueType || IsNullableType(type)) - throw ParseError(errorPos, Res.TypeHasNoNullableForm, GetTypeName(type)); - type = typeof (Nullable<>).MakeGenericType(type); - NextToken(); - } - if (token.id == TokenId.OpenParen) - { - Expression[] args = ParseArgumentList(); - MethodBase method; - switch (FindBestMethod(type.GetConstructors(), args, out method)) - { - case 0: - if (args.Length == 1) - return GenerateConversion(args[0], type, errorPos); - throw ParseError(errorPos, Res.NoMatchingConstructor, GetTypeName(type)); - case 1: - return Expression.New((ConstructorInfo) method, args); - default: - throw ParseError(errorPos, Res.AmbiguousConstructorInvocation, GetTypeName(type)); - } - } - ValidateToken(TokenId.Dot, Res.DotOrOpenParenExpected); - NextToken(); - return ParseMemberAccess(type, null); - } - - private Expression GenerateConversion(Expression expr, Type type, int errorPos) - { - Type exprType = expr.Type; - if (exprType == type) return expr; - if (exprType.IsValueType && type.IsValueType) - { - if ((IsNullableType(exprType) || IsNullableType(type)) && - GetNonNullableType(exprType) == GetNonNullableType(type)) - return Expression.Convert(expr, type); - if ((IsNumericType(exprType) || IsEnumType(exprType)) && - (IsNumericType(type)) || IsEnumType(type)) - return Expression.ConvertChecked(expr, type); - } - if (exprType.IsAssignableFrom(type) || type.IsAssignableFrom(exprType) || - exprType.IsInterface || type.IsInterface) - return Expression.Convert(expr, type); - throw ParseError(errorPos, Res.CannotConvertValue, - GetTypeName(exprType), GetTypeName(type)); - } - - private Expression ParseMemberAccess(Type type, Expression instance) - { - if (instance != null) type = instance.Type; - int errorPos = token.pos; - string id = GetIdentifier(); - NextToken(); - if (token.id == TokenId.OpenParen) - { - if (instance != null && type != typeof (string)) - { - Type enumerableType = FindGenericType(typeof (IEnumerable<>), type); - if (enumerableType != null) - { - Type elementType = enumerableType.GetGenericArguments()[0]; - return ParseAggregate(instance, elementType, id, errorPos); - } - } - Expression[] args = ParseArgumentList(); - MethodBase mb; - switch (FindMethod(type, id, instance == null, args, out mb)) - { - case 0: - throw ParseError(errorPos, Res.NoApplicableMethod, - id, GetTypeName(type)); - case 1: - var method = (MethodInfo) mb; - if (!IsPredefinedType(method.DeclaringType)) - throw ParseError(errorPos, Res.MethodsAreInaccessible, GetTypeName(method.DeclaringType)); - if (method.ReturnType == typeof (void)) - throw ParseError(errorPos, Res.MethodIsVoid, - id, GetTypeName(method.DeclaringType)); - return Expression.Call(instance, method, args); - default: - throw ParseError(errorPos, Res.AmbiguousMethodInvocation, - id, GetTypeName(type)); - } - } - else - { - MemberInfo member = FindPropertyOrField(type, id, instance == null); - if (member == null) - throw ParseError(errorPos, Res.UnknownPropertyOrField, - id, GetTypeName(type)); - return member is PropertyInfo - ? Expression.Property(instance, (PropertyInfo) member) - : Expression.Field(instance, (FieldInfo) member); - } - } - - private static Type FindGenericType(Type generic, Type type) - { - while (type != null && type != typeof (object)) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == generic) return type; - if (generic.IsInterface) - { - foreach (Type intfType in type.GetInterfaces()) - { - Type found = FindGenericType(generic, intfType); - if (found != null) return found; - } - } - type = type.BaseType; - } - return null; - } - - private Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos) - { - ParameterExpression outerIt = it; - ParameterExpression innerIt = Expression.Parameter(elementType, ""); - it = innerIt; - Expression[] args = ParseArgumentList(); - it = outerIt; - MethodBase signature; - if (FindMethod(typeof (IEnumerableSignatures), methodName, false, args, out signature) != 1) - throw ParseError(errorPos, Res.NoApplicableAggregate, methodName); - Type[] typeArgs; - if (signature.Name == "Min" || signature.Name == "Max") - { - typeArgs = new[] {elementType, args[0].Type}; - } - else - { - typeArgs = new[] {elementType}; - } - if (args.Length == 0) - { - args = new[] {instance}; - } - else - { - args = new[] {instance, Expression.Lambda(args[0], innerIt)}; - } - return Expression.Call(typeof (Enumerable), signature.Name, typeArgs, args); - } - - private Expression[] ParseArgumentList() - { - ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); - NextToken(); - Expression[] args = token.id != TokenId.CloseParen ? ParseArguments() : new Expression[0]; - ValidateToken(TokenId.CloseParen, Res.CloseParenOrCommaExpected); - NextToken(); - return args; - } - - private Expression[] ParseArguments() - { - var argList = new List(); - while (true) - { - argList.Add(ParseExpression()); - if (token.id != TokenId.Comma) break; - NextToken(); - } - return argList.ToArray(); - } - - private Expression ParseElementAccess(Expression expr) - { - int errorPos = token.pos; - ValidateToken(TokenId.OpenBracket, Res.OpenParenExpected); - NextToken(); - Expression[] args = ParseArguments(); - ValidateToken(TokenId.CloseBracket, Res.CloseBracketOrCommaExpected); - NextToken(); - if (expr.Type.IsArray) - { - if (expr.Type.GetArrayRank() != 1 || args.Length != 1) - throw ParseError(errorPos, Res.CannotIndexMultiDimArray); - Expression index = PromoteExpression(args[0], typeof (int), true); - if (index == null) - throw ParseError(errorPos, Res.InvalidIndex); - return Expression.ArrayIndex(expr, index); - } - else - { - MethodBase mb; - switch (FindIndexer(expr.Type, args, out mb)) - { - case 0: - throw ParseError(errorPos, Res.NoApplicableIndexer, - GetTypeName(expr.Type)); - case 1: - return Expression.Call(expr, (MethodInfo) mb, args); - default: - throw ParseError(errorPos, Res.AmbiguousIndexerInvocation, - GetTypeName(expr.Type)); - } - } - } - - private static bool IsPredefinedType(Type type) - { - foreach (Type t in predefinedTypes) if (t == type) return true; - return false; - } - - private static bool IsNullableType(Type type) - { - return type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>); - } - - private static Type GetNonNullableType(Type type) - { - return IsNullableType(type) ? type.GetGenericArguments()[0] : type; - } - - private static string GetTypeName(Type type) - { - Type baseType = GetNonNullableType(type); - string s = baseType.Name; - if (type != baseType) s += '?'; - return s; - } - - private static bool IsNumericType(Type type) - { - return GetNumericTypeKind(type) != 0; - } - - private static bool IsSignedIntegralType(Type type) - { - return GetNumericTypeKind(type) == 2; - } - - private static bool IsUnsignedIntegralType(Type type) - { - return GetNumericTypeKind(type) == 3; - } - - private static int GetNumericTypeKind(Type type) - { - type = GetNonNullableType(type); - if (type.IsEnum) return 0; - switch (Type.GetTypeCode(type)) - { - case TypeCode.Char: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return 1; - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - return 2; - case TypeCode.Byte: - case TypeCode.UInt16: - case TypeCode.UInt32: - case TypeCode.UInt64: - return 3; - default: - return 0; - } - } - - private static bool IsEnumType(Type type) - { - return GetNonNullableType(type).IsEnum; - } - - private void CheckAndPromoteOperand(Type signatures, string opName, ref Expression expr, int errorPos) - { - var args = new[] {expr}; - MethodBase method; - if (FindMethod(signatures, "F", false, args, out method) != 1) - throw ParseError(errorPos, Res.IncompatibleOperand, - opName, GetTypeName(args[0].Type)); - expr = args[0]; - } - - private void CheckAndPromoteOperands(Type signatures, string opName, ref Expression left, ref Expression right, - int errorPos) - { - var args = new[] {left, right}; - MethodBase method; - if (FindMethod(signatures, "F", false, args, out method) != 1) - throw IncompatibleOperandsError(opName, left, right, errorPos); - left = args[0]; - right = args[1]; - } - - private Exception IncompatibleOperandsError(string opName, Expression left, Expression right, int pos) - { - return ParseError(pos, Res.IncompatibleOperands, - opName, GetTypeName(left.Type), GetTypeName(right.Type)); - } - - private MemberInfo FindPropertyOrField(Type type, string memberName, bool staticAccess) - { - BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | - (staticAccess ? BindingFlags.Static : BindingFlags.Instance); - foreach (Type t in SelfAndBaseTypes(type)) - { - MemberInfo[] members = t.FindMembers(MemberTypes.Property | MemberTypes.Field, - flags, Type.FilterNameIgnoreCase, memberName); - if (members.Length != 0) return members[0]; - } - return null; - } - - private int FindMethod(Type type, string methodName, bool staticAccess, Expression[] args, out MethodBase method) - { - BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | - (staticAccess ? BindingFlags.Static : BindingFlags.Instance); - foreach (Type t in SelfAndBaseTypes(type)) - { - MemberInfo[] members = t.FindMembers(MemberTypes.Method, - flags, Type.FilterNameIgnoreCase, methodName); - int count = FindBestMethod(members.Cast(), args, out method); - if (count != 0) return count; - } - method = null; - return 0; - } - - private int FindIndexer(Type type, Expression[] args, out MethodBase method) - { - foreach (Type t in SelfAndBaseTypes(type)) - { - MemberInfo[] members = t.GetDefaultMembers(); - if (members.Length != 0) - { - IEnumerable methods = members. - OfType(). - Select(p => (MethodBase) p.GetGetMethod()). - Where(m => m != null); - int count = FindBestMethod(methods, args, out method); - if (count != 0) return count; - } - } - method = null; - return 0; - } - - private static IEnumerable SelfAndBaseTypes(Type type) - { - if (type.IsInterface) - { - var types = new List(); - AddInterface(types, type); - return types; - } - return SelfAndBaseClasses(type); - } - - private static IEnumerable SelfAndBaseClasses(Type type) - { - while (type != null) - { - yield return type; - type = type.BaseType; - } - } - - private static void AddInterface(List types, Type type) - { - if (!types.Contains(type)) - { - types.Add(type); - foreach (Type t in type.GetInterfaces()) AddInterface(types, t); - } - } - - private class MethodData - { - public Expression[] Args; - public MethodBase MethodBase; - public ParameterInfo[] Parameters; - } - - private int FindBestMethod(IEnumerable methods, Expression[] args, out MethodBase method) - { - MethodData[] applicable = methods. - Select(m => new MethodData {MethodBase = m, Parameters = m.GetParameters()}). - Where(m => IsApplicable(m, args)). - ToArray(); - if (applicable.Length > 1) - { - applicable = applicable. - Where(m => applicable.All(n => m == n || IsBetterThan(args, m, n))). - ToArray(); - } - if (applicable.Length == 1) - { - MethodData md = applicable[0]; - for (int i = 0; i < args.Length; i++) args[i] = md.Args[i]; - method = md.MethodBase; - } - else - { - method = null; - } - return applicable.Length; - } - - private bool IsApplicable(MethodData method, Expression[] args) - { - if (method.Parameters.Length != args.Length) return false; - var promotedArgs = new Expression[args.Length]; - for (int i = 0; i < args.Length; i++) - { - ParameterInfo pi = method.Parameters[i]; - if (pi.IsOut) return false; - Expression promoted = PromoteExpression(args[i], pi.ParameterType, false); - if (promoted == null) return false; - promotedArgs[i] = promoted; - } - method.Args = promotedArgs; - return true; - } - - private Expression PromoteExpression(Expression expr, Type type, bool exact) - { - if (expr.Type == type) return expr; - if (expr is ConstantExpression) - { - var ce = (ConstantExpression) expr; - if (ce == nullLiteral) - { - if (!type.IsValueType || IsNullableType(type)) - return Expression.Constant(null, type); - } - else - { - string text; - if (literals.TryGetValue(ce, out text)) - { - Type target = GetNonNullableType(type); - Object value = null; - switch (Type.GetTypeCode(ce.Type)) - { - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - value = ParseNumber(text, target); - break; - case TypeCode.Double: - if (target == typeof (decimal)) value = ParseNumber(text, target); - break; - case TypeCode.String: - value = ParseEnum(text, target); - break; - } - if (value != null) - return Expression.Constant(value, type); - } - } - } - if (IsCompatibleWith(expr.Type, type)) - { - if (type.IsValueType || exact) return Expression.Convert(expr, type); - return expr; - } - return null; - } - - private static object ParseNumber(string text, Type type) - { - switch (Type.GetTypeCode(GetNonNullableType(type))) - { - case TypeCode.SByte: - sbyte sb; - if (sbyte.TryParse(text, out sb)) return sb; - break; - case TypeCode.Byte: - byte b; - if (byte.TryParse(text, out b)) return b; - break; - case TypeCode.Int16: - short s; - if (short.TryParse(text, out s)) return s; - break; - case TypeCode.UInt16: - ushort us; - if (ushort.TryParse(text, out us)) return us; - break; - case TypeCode.Int32: - int i; - if (int.TryParse(text, out i)) return i; - break; - case TypeCode.UInt32: - uint ui; - if (uint.TryParse(text, out ui)) return ui; - break; - case TypeCode.Int64: - long l; - if (long.TryParse(text, out l)) return l; - break; - case TypeCode.UInt64: - ulong ul; - if (ulong.TryParse(text, out ul)) return ul; - break; - case TypeCode.Single: - float f; - if (float.TryParse(text, out f)) return f; - break; - case TypeCode.Double: - double d; - if (double.TryParse(text, out d)) return d; - break; - case TypeCode.Decimal: - decimal e; - if (decimal.TryParse(text, out e)) return e; - break; - } - return null; - } - - private static object ParseEnum(string name, Type type) - { - if (type.IsEnum) - { - MemberInfo[] memberInfos = type.FindMembers(MemberTypes.Field, - BindingFlags.Public | BindingFlags.DeclaredOnly | - BindingFlags.Static, - Type.FilterNameIgnoreCase, name); - if (memberInfos.Length != 0) return ((FieldInfo) memberInfos[0]).GetValue(null); - } - return null; - } - - private static bool IsCompatibleWith(Type source, Type target) - { - if (source == target) return true; - if (!target.IsValueType) return target.IsAssignableFrom(source); - Type st = GetNonNullableType(source); - Type tt = GetNonNullableType(target); - if (st != source && tt == target) return false; - TypeCode sc = st.IsEnum ? TypeCode.Object : Type.GetTypeCode(st); - TypeCode tc = tt.IsEnum ? TypeCode.Object : Type.GetTypeCode(tt); - switch (sc) - { - case TypeCode.SByte: - switch (tc) - { - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.Byte: - switch (tc) - { - case TypeCode.Byte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.Int16: - switch (tc) - { - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.UInt16: - switch (tc) - { - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.Int32: - switch (tc) - { - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.UInt32: - switch (tc) - { - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.Int64: - switch (tc) - { - case TypeCode.Int64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.UInt64: - switch (tc) - { - case TypeCode.UInt64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - } - break; - case TypeCode.Single: - switch (tc) - { - case TypeCode.Single: - case TypeCode.Double: - return true; - } - break; - default: - if (st == tt) return true; - break; - } - return false; - } - - private static bool IsBetterThan(Expression[] args, MethodData m1, MethodData m2) - { - bool better = false; - for (int i = 0; i < args.Length; i++) - { - int c = CompareConversions(args[i].Type, - m1.Parameters[i].ParameterType, - m2.Parameters[i].ParameterType); - if (c < 0) return false; - if (c > 0) better = true; - } - return better; - } - - // Return 1 if s -> t1 is a better conversion than s -> t2 - // Return -1 if s -> t2 is a better conversion than s -> t1 - // Return 0 if neither conversion is better - private static int CompareConversions(Type s, Type t1, Type t2) - { - if (t1 == t2) return 0; - if (s == t1) return 1; - if (s == t2) return -1; - bool t1t2 = IsCompatibleWith(t1, t2); - bool t2t1 = IsCompatibleWith(t2, t1); - if (t1t2 && !t2t1) return 1; - if (t2t1 && !t1t2) return -1; - if (IsSignedIntegralType(t1) && IsUnsignedIntegralType(t2)) return 1; - if (IsSignedIntegralType(t2) && IsUnsignedIntegralType(t1)) return -1; - return 0; - } - - private Expression GenerateEqual(Expression left, Expression right) - { - return Expression.Equal(left, right); - } - - private Expression GenerateNotEqual(Expression left, Expression right) - { - return Expression.NotEqual(left, right); - } - - private Expression GenerateGreaterThan(Expression left, Expression right) - { - if (left.Type == typeof (string)) - { - return Expression.GreaterThan( - GenerateStaticMethodCall("Compare", left, right), - Expression.Constant(0) - ); - } - return Expression.GreaterThan(left, right); - } - - private Expression GenerateGreaterThanEqual(Expression left, Expression right) - { - if (left.Type == typeof (string)) - { - return Expression.GreaterThanOrEqual( - GenerateStaticMethodCall("Compare", left, right), - Expression.Constant(0) - ); - } - return Expression.GreaterThanOrEqual(left, right); - } - - private Expression GenerateLessThan(Expression left, Expression right) - { - if (left.Type == typeof (string)) - { - return Expression.LessThan( - GenerateStaticMethodCall("Compare", left, right), - Expression.Constant(0) - ); - } - return Expression.LessThan(left, right); - } - - private Expression GenerateLessThanEqual(Expression left, Expression right) - { - if (left.Type == typeof (string)) - { - return Expression.LessThanOrEqual( - GenerateStaticMethodCall("Compare", left, right), - Expression.Constant(0) - ); - } - return Expression.LessThanOrEqual(left, right); - } - - private Expression GenerateAdd(Expression left, Expression right) - { - if (left.Type == typeof (string) && right.Type == typeof (string)) - { - return GenerateStaticMethodCall("Concat", left, right); - } - return Expression.Add(left, right); - } - - private Expression GenerateSubtract(Expression left, Expression right) - { - return Expression.Subtract(left, right); - } - - private Expression GenerateStringConcat(Expression left, Expression right) - { - return Expression.Call( - null, - typeof (string).GetMethod("Concat", new[] {typeof (object), typeof (object)}), - new[] {left, right}); - } - - private MethodInfo GetStaticMethod(string methodName, Expression left, Expression right) - { - return left.Type.GetMethod(methodName, new[] {left.Type, right.Type}); - } - - private Expression GenerateStaticMethodCall(string methodName, Expression left, Expression right) - { - return Expression.Call(null, GetStaticMethod(methodName, left, right), new[] {left, right}); - } - - private void SetTextPos(int pos) - { - textPos = pos; - ch = textPos < textLen ? text[textPos] : '\0'; - } - - private void NextChar() - { - if (textPos < textLen) textPos++; - ch = textPos < textLen ? text[textPos] : '\0'; - } - - private void NextToken() - { - while (Char.IsWhiteSpace(ch)) NextChar(); - TokenId t; - int tokenPos = textPos; - switch (ch) - { - case '!': - NextChar(); - if (ch == '=') - { - NextChar(); - t = TokenId.ExclamationEqual; - } - else - { - t = TokenId.Exclamation; - } - break; - case '%': - NextChar(); - t = TokenId.Percent; - break; - case '&': - NextChar(); - if (ch == '&') - { - NextChar(); - t = TokenId.DoubleAmphersand; - } - else - { - t = TokenId.Amphersand; - } - break; - case '(': - NextChar(); - t = TokenId.OpenParen; - break; - case ')': - NextChar(); - t = TokenId.CloseParen; - break; - case '*': - NextChar(); - t = TokenId.Asterisk; - break; - case '+': - NextChar(); - t = TokenId.Plus; - break; - case ',': - NextChar(); - t = TokenId.Comma; - break; - case '-': - NextChar(); - t = TokenId.Minus; - break; - case '.': - NextChar(); - t = TokenId.Dot; - break; - case '/': - NextChar(); - t = TokenId.Slash; - break; - case ':': - NextChar(); - t = TokenId.Colon; - break; - case '<': - NextChar(); - if (ch == '=') - { - NextChar(); - t = TokenId.LessThanEqual; - } - else if (ch == '>') - { - NextChar(); - t = TokenId.LessGreater; - } - else - { - t = TokenId.LessThan; - } - break; - case '=': - NextChar(); - if (ch == '=') - { - NextChar(); - t = TokenId.DoubleEqual; - } - else - { - t = TokenId.Equal; - } - break; - case '>': - NextChar(); - if (ch == '=') - { - NextChar(); - t = TokenId.GreaterThanEqual; - } - else - { - t = TokenId.GreaterThan; - } - break; - case '?': - NextChar(); - t = TokenId.Question; - break; - case '[': - NextChar(); - t = TokenId.OpenBracket; - break; - case ']': - NextChar(); - t = TokenId.CloseBracket; - break; - case '|': - NextChar(); - if (ch == '|') - { - NextChar(); - t = TokenId.DoubleBar; - } - else - { - t = TokenId.Bar; - } - break; - case '"': - case '\'': - char quote = ch; - do - { - NextChar(); - while (textPos < textLen && ch != quote) NextChar(); - if (textPos == textLen) - throw ParseError(textPos, Res.UnterminatedStringLiteral); - NextChar(); - } while (ch == quote); - t = TokenId.StringLiteral; - break; - default: - if (Char.IsLetter(ch) || ch == '@' || ch == '_') - { - do - { - NextChar(); - } while (Char.IsLetterOrDigit(ch) || ch == '_'); - t = TokenId.Identifier; - break; - } - if (Char.IsDigit(ch)) - { - t = TokenId.IntegerLiteral; - do - { - NextChar(); - } while (Char.IsDigit(ch)); - if (ch == '.') - { - t = TokenId.RealLiteral; - NextChar(); - ValidateDigit(); - do - { - NextChar(); - } while (Char.IsDigit(ch)); - } - if (ch == 'E' || ch == 'e') - { - t = TokenId.RealLiteral; - NextChar(); - if (ch == '+' || ch == '-') NextChar(); - ValidateDigit(); - do - { - NextChar(); - } while (Char.IsDigit(ch)); - } - if (ch == 'F' || ch == 'f') NextChar(); - break; - } - if (textPos == textLen) - { - t = TokenId.End; - break; - } - throw ParseError(textPos, Res.InvalidCharacter, ch); - } - token.id = t; - token.text = text.Substring(tokenPos, textPos - tokenPos); - token.pos = tokenPos; - } - - private bool TokenIdentifierIs(string id) - { - return token.id == TokenId.Identifier && String.Equals(id, token.text, StringComparison.OrdinalIgnoreCase); - } - - private string GetIdentifier() - { - ValidateToken(TokenId.Identifier, Res.IdentifierExpected); - string id = token.text; - if (id.Length > 1 && id[0] == '@') id = id.Substring(1); - return id; - } - - private void ValidateDigit() - { - if (!Char.IsDigit(ch)) throw ParseError(textPos, Res.DigitExpected); - } - - private void ValidateToken(TokenId t, string errorMessage) - { - if (token.id != t) throw ParseError(errorMessage); - } - - private void ValidateToken(TokenId t) - { - if (token.id != t) throw ParseError(Res.SyntaxError); - } - - private Exception ParseError(string format, params object[] args) - { - return ParseError(token.pos, format, args); - } - - private Exception ParseError(int pos, string format, params object[] args) - { - return new ParseException(string.Format(CultureInfo.CurrentCulture, format, args), pos); - } - - private static Dictionary CreateKeywords() - { - var d = new Dictionary(StringComparer.OrdinalIgnoreCase); - d.Add("true", trueLiteral); - d.Add("false", falseLiteral); - d.Add("null", nullLiteral); - d.Add(keywordIt, keywordIt); - d.Add(keywordIif, keywordIif); - d.Add(keywordNew, keywordNew); - foreach (Type type in predefinedTypes) d.Add(type.Name, type); - return d; - } - } - - internal static class Res - { - public const string DuplicateIdentifier = "The identifier '{0}' was defined more than once"; - public const string ExpressionTypeMismatch = "Expression of type '{0}' expected"; - public const string ExpressionExpected = "Expression expected"; - public const string InvalidCharacterLiteral = "Character literal must contain exactly one character"; - public const string InvalidIntegerLiteral = "Invalid integer literal '{0}'"; - public const string InvalidRealLiteral = "Invalid real literal '{0}'"; - public const string UnknownIdentifier = "Unknown identifier '{0}'"; - public const string NoItInScope = "No 'it' is in scope"; - public const string IifRequiresThreeArgs = "The 'iif' function requires three arguments"; - public const string FirstExprMustBeBool = "The first expression must be of type 'Boolean'"; - public const string BothTypesConvertToOther = "Both of the types '{0}' and '{1}' convert to the other"; - public const string NeitherTypeConvertsToOther = "Neither of the types '{0}' and '{1}' converts to the other"; - public const string MissingAsClause = "Expression is missing an 'as' clause"; - public const string ArgsIncompatibleWithLambda = "Argument list incompatible with lambda expression"; - public const string TypeHasNoNullableForm = "Type '{0}' has no nullable form"; - public const string NoMatchingConstructor = "No matching constructor in type '{0}'"; - public const string AmbiguousConstructorInvocation = "Ambiguous invocation of '{0}' constructor"; - public const string CannotConvertValue = "A value of type '{0}' cannot be converted to type '{1}'"; - public const string NoApplicableMethod = "No applicable method '{0}' exists in type '{1}'"; - public const string MethodsAreInaccessible = "Methods on type '{0}' are not accessible"; - public const string MethodIsVoid = "Method '{0}' in type '{1}' does not return a value"; - public const string AmbiguousMethodInvocation = "Ambiguous invocation of method '{0}' in type '{1}'"; - public const string UnknownPropertyOrField = "No property or field '{0}' exists in type '{1}'"; - public const string NoApplicableAggregate = "No applicable aggregate method '{0}' exists"; - public const string CannotIndexMultiDimArray = "Indexing of multi-dimensional arrays is not supported"; - public const string InvalidIndex = "Array index must be an integer expression"; - public const string NoApplicableIndexer = "No applicable indexer exists in type '{0}'"; - public const string AmbiguousIndexerInvocation = "Ambiguous invocation of indexer in type '{0}'"; - public const string IncompatibleOperand = "Operator '{0}' incompatible with operand type '{1}'"; - public const string IncompatibleOperands = "Operator '{0}' incompatible with operand types '{1}' and '{2}'"; - public const string UnterminatedStringLiteral = "Unterminated string literal"; - public const string InvalidCharacter = "Syntax error '{0}'"; - public const string DigitExpected = "Digit expected"; - public const string SyntaxError = "Syntax error"; - public const string TokenExpected = "{0} expected"; - public const string ParseExceptionFormat = "{0} (at index {1})"; - public const string ColonExpected = "':' expected"; - public const string OpenParenExpected = "'(' expected"; - public const string CloseParenOrOperatorExpected = "')' or operator expected"; - public const string CloseParenOrCommaExpected = "')' or ',' expected"; - public const string DotOrOpenParenExpected = "'.' or '(' expected"; - public const string OpenBracketExpected = "'[' expected"; - public const string CloseBracketOrCommaExpected = "']' or ',' expected"; - public const string IdentifierExpected = "Identifier expected"; - } +//Copyright (C) Microsoft Corporation. All rights reserved. + +using System.Collections.Generic; +using System.Globalization; +using System.Linq.Expressions; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading; + +namespace System.Linq.Dynamic +{ + public static class DynamicQueryable + { + public static IQueryable Where(this IQueryable source, string predicate, params object[] values) + { + return (IQueryable) Where((IQueryable) source, predicate, values); + } + + public static IQueryable Where(this IQueryable source, string predicate, params object[] values) + { + if (source == null) throw new ArgumentNullException("source"); + if (predicate == null) throw new ArgumentNullException("predicate"); + LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof (bool), predicate, values); + return source.Provider.CreateQuery( + Expression.Call( + typeof (Queryable), "Where", + new[] {source.ElementType}, + source.Expression, Expression.Quote(lambda))); + } + + public static IQueryable Select(this IQueryable source, string selector, params object[] values) + { + if (source == null) throw new ArgumentNullException("source"); + if (selector == null) throw new ArgumentNullException("selector"); + LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, null, selector, values); + return source.Provider.CreateQuery( + Expression.Call( + typeof (Queryable), "Select", + new[] {source.ElementType, lambda.Body.Type}, + source.Expression, Expression.Quote(lambda))); + } + + public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) + { + return (IQueryable) OrderBy((IQueryable) source, ordering, values); + } + + public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) + { + if (source == null) throw new ArgumentNullException("source"); + if (ordering == null) throw new ArgumentNullException("ordering"); + var parameters = new[] + { + Expression.Parameter(source.ElementType, "") + }; + var parser = new ExpressionParser(parameters, ordering, values); + IEnumerable orderings = parser.ParseOrdering(); + Expression queryExpr = source.Expression; + string methodAsc = "OrderBy"; + string methodDesc = "OrderByDescending"; + foreach (DynamicOrdering o in orderings) + { + queryExpr = Expression.Call( + typeof (Queryable), o.Ascending ? methodAsc : methodDesc, + new[] {source.ElementType, o.Selector.Type}, + queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters))); + methodAsc = "ThenBy"; + methodDesc = "ThenByDescending"; + } + return source.Provider.CreateQuery(queryExpr); + } + + public static IQueryable Take(this IQueryable source, int count) + { + if (source == null) throw new ArgumentNullException("source"); + return source.Provider.CreateQuery( + Expression.Call( + typeof (Queryable), "Take", + new[] {source.ElementType}, + source.Expression, Expression.Constant(count))); + } + + public static IQueryable Skip(this IQueryable source, int count) + { + if (source == null) throw new ArgumentNullException("source"); + return source.Provider.CreateQuery( + Expression.Call( + typeof (Queryable), "Skip", + new[] {source.ElementType}, + source.Expression, Expression.Constant(count))); + } + + public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, + params object[] values) + { + if (source == null) throw new ArgumentNullException("source"); + if (keySelector == null) throw new ArgumentNullException("keySelector"); + if (elementSelector == null) throw new ArgumentNullException("elementSelector"); + LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values); + LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values); + return source.Provider.CreateQuery( + Expression.Call( + typeof (Queryable), "GroupBy", + new[] {source.ElementType, keyLambda.Body.Type, elementLambda.Body.Type}, + source.Expression, Expression.Quote(keyLambda), Expression.Quote(elementLambda))); + } + + public static bool Any(this IQueryable source) + { + if (source == null) throw new ArgumentNullException("source"); + return (bool) source.Provider.Execute( + Expression.Call( + typeof (Queryable), "Any", + new[] {source.ElementType}, source.Expression)); + } + + public static int Count(this IQueryable source) + { + if (source == null) throw new ArgumentNullException("source"); + return (int) source.Provider.Execute( + Expression.Call( + typeof (Queryable), "Count", + new[] {source.ElementType}, source.Expression)); + } + } + + public abstract class DynamicClass + { + public override string ToString() + { + PropertyInfo[] props = GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + var sb = new StringBuilder(); + sb.Append("{"); + for (int i = 0; i < props.Length; i++) + { + if (i > 0) sb.Append(", "); + sb.Append(props[i].Name); + sb.Append("="); + sb.Append(props[i].GetValue(this, null)); + } + sb.Append("}"); + return sb.ToString(); + } + } + + public class DynamicProperty + { + private readonly string name; + private readonly Type type; + + public DynamicProperty(string name, Type type) + { + if (name == null) throw new ArgumentNullException("name"); + if (type == null) throw new ArgumentNullException("type"); + this.name = name; + this.type = type; + } + + public string Name + { + get { return name; } + } + + public Type Type + { + get { return type; } + } + } + + public static class DynamicExpression + { + public static Expression Parse(Type resultType, string expression, params object[] values) + { + var parser = new ExpressionParser(null, expression, values); + return parser.Parse(resultType); + } + + public static LambdaExpression ParseLambda(Type itType, Type resultType, string expression, params object[] values) + { + return ParseLambda(new[] {Expression.Parameter(itType, "")}, resultType, expression, values); + } + + public static LambdaExpression ParseLambda(ParameterExpression[] parameters, Type resultType, string expression, + params object[] values) + { + var parser = new ExpressionParser(parameters, expression, values); + return Expression.Lambda(parser.Parse(resultType), parameters); + } + + public static Expression> ParseLambda(string expression, params object[] values) + { + return (Expression>) ParseLambda(typeof (T), typeof (S), expression, values); + } + + public static Type CreateClass(params DynamicProperty[] properties) + { + return ClassFactory.Instance.GetDynamicClass(properties); + } + + public static Type CreateClass(IEnumerable properties) + { + return ClassFactory.Instance.GetDynamicClass(properties); + } + } + + internal class DynamicOrdering + { + public bool Ascending; + public Expression Selector; + } + + internal class Signature : IEquatable + { + public int hashCode; + public DynamicProperty[] properties; + + public Signature(IEnumerable properties) + { + this.properties = properties.ToArray(); + hashCode = 0; + foreach (DynamicProperty p in properties) + { + hashCode ^= p.Name.GetHashCode() ^ p.Type.GetHashCode(); + } + } + + #region IEquatable Members + + public bool Equals(Signature other) + { + if (properties.Length != other.properties.Length) return false; + for (int i = 0; i < properties.Length; i++) + { + if (properties[i].Name != other.properties[i].Name || + properties[i].Type != other.properties[i].Type) return false; + } + return true; + } + + #endregion + + public override int GetHashCode() + { + return hashCode; + } + + public override bool Equals(object obj) + { + return obj is Signature ? Equals((Signature) obj) : false; + } + } + + internal class ClassFactory + { + public static readonly ClassFactory Instance = new ClassFactory(); + + // Trigger lazy initialization of static fields + + private readonly Dictionary classes; + private readonly ModuleBuilder module; + private readonly ReaderWriterLock rwLock; + private int classCount; + + private ClassFactory() + { + var name = new AssemblyName("DynamicClasses"); + AssemblyBuilder assembly = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); + +#if ENABLE_LINQ_PARTIAL_TRUST + new ReflectionPermission(PermissionState.Unrestricted).Assert(); +#endif + try + { + module = assembly.DefineDynamicModule("Module"); + } + finally + { +#if ENABLE_LINQ_PARTIAL_TRUST + PermissionSet.RevertAssert(); +#endif + } + classes = new Dictionary(); + rwLock = new ReaderWriterLock(); + } + + public Type GetDynamicClass(IEnumerable properties) + { + rwLock.AcquireReaderLock(Timeout.Infinite); + try + { + var signature = new Signature(properties); + Type type; + if (!classes.TryGetValue(signature, out type)) + { + type = CreateDynamicClass(signature.properties); + classes.Add(signature, type); + } + return type; + } + finally + { + rwLock.ReleaseReaderLock(); + } + } + + private Type CreateDynamicClass(DynamicProperty[] properties) + { + LockCookie cookie = rwLock.UpgradeToWriterLock(Timeout.Infinite); + try + { + string typeName = "DynamicClass" + (classCount + 1); +#if ENABLE_LINQ_PARTIAL_TRUST + new ReflectionPermission(PermissionState.Unrestricted).Assert(); +#endif + try + { + TypeBuilder tb = module.DefineType(typeName, TypeAttributes.Class | + TypeAttributes.Public, typeof (DynamicClass)); + FieldInfo[] fields = GenerateProperties(tb, properties); + GenerateEquals(tb, fields); + GenerateGetHashCode(tb, fields); + Type result = tb.CreateTypeInfo().AsType(); + classCount++; + return result; + } + finally + { +#if ENABLE_LINQ_PARTIAL_TRUST + PermissionSet.RevertAssert(); +#endif + } + } + finally + { + rwLock.DowngradeFromWriterLock(ref cookie); + } + } + + private FieldInfo[] GenerateProperties(TypeBuilder tb, DynamicProperty[] properties) + { + FieldInfo[] fields = new FieldBuilder[properties.Length]; + for (int i = 0; i < properties.Length; i++) + { + DynamicProperty dp = properties[i]; + FieldBuilder fb = tb.DefineField("_" + dp.Name, dp.Type, FieldAttributes.Private); + PropertyBuilder pb = tb.DefineProperty(dp.Name, PropertyAttributes.HasDefault, dp.Type, null); + MethodBuilder mbGet = tb.DefineMethod("get_" + dp.Name, + MethodAttributes.Public | MethodAttributes.SpecialName | + MethodAttributes.HideBySig, + dp.Type, Type.EmptyTypes); + ILGenerator genGet = mbGet.GetILGenerator(); + genGet.Emit(OpCodes.Ldarg_0); + genGet.Emit(OpCodes.Ldfld, fb); + genGet.Emit(OpCodes.Ret); + MethodBuilder mbSet = tb.DefineMethod("set_" + dp.Name, + MethodAttributes.Public | MethodAttributes.SpecialName | + MethodAttributes.HideBySig, + null, new[] {dp.Type}); + ILGenerator genSet = mbSet.GetILGenerator(); + genSet.Emit(OpCodes.Ldarg_0); + genSet.Emit(OpCodes.Ldarg_1); + genSet.Emit(OpCodes.Stfld, fb); + genSet.Emit(OpCodes.Ret); + pb.SetGetMethod(mbGet); + pb.SetSetMethod(mbSet); + fields[i] = fb; + } + return fields; + } + + private void GenerateEquals(TypeBuilder tb, FieldInfo[] fields) + { + MethodBuilder mb = tb.DefineMethod("Equals", + MethodAttributes.Public | MethodAttributes.ReuseSlot | + MethodAttributes.Virtual | MethodAttributes.HideBySig, + typeof (bool), new[] {typeof (object)}); + ILGenerator gen = mb.GetILGenerator(); + LocalBuilder other = gen.DeclareLocal(tb); + Label next = gen.DefineLabel(); + gen.Emit(OpCodes.Ldarg_1); + gen.Emit(OpCodes.Isinst, tb); + gen.Emit(OpCodes.Stloc, other); + gen.Emit(OpCodes.Ldloc, other); + gen.Emit(OpCodes.Brtrue_S, next); + gen.Emit(OpCodes.Ldc_I4_0); + gen.Emit(OpCodes.Ret); + gen.MarkLabel(next); + foreach (FieldInfo field in fields) + { + Type ft = field.FieldType; + Type ct = typeof (EqualityComparer<>).MakeGenericType(ft); + next = gen.DefineLabel(); + gen.EmitCall(OpCodes.Call, ct.GetMethod("get_Default"), null); + gen.Emit(OpCodes.Ldarg_0); + gen.Emit(OpCodes.Ldfld, field); + gen.Emit(OpCodes.Ldloc, other); + gen.Emit(OpCodes.Ldfld, field); + gen.EmitCall(OpCodes.Callvirt, ct.GetMethod("Equals", new[] {ft, ft}), null); + gen.Emit(OpCodes.Brtrue_S, next); + gen.Emit(OpCodes.Ldc_I4_0); + gen.Emit(OpCodes.Ret); + gen.MarkLabel(next); + } + gen.Emit(OpCodes.Ldc_I4_1); + gen.Emit(OpCodes.Ret); + } + + private void GenerateGetHashCode(TypeBuilder tb, FieldInfo[] fields) + { + MethodBuilder mb = tb.DefineMethod("GetHashCode", + MethodAttributes.Public | MethodAttributes.ReuseSlot | + MethodAttributes.Virtual | MethodAttributes.HideBySig, + typeof (int), Type.EmptyTypes); + ILGenerator gen = mb.GetILGenerator(); + gen.Emit(OpCodes.Ldc_I4_0); + foreach (FieldInfo field in fields) + { + Type ft = field.FieldType; + Type ct = typeof (EqualityComparer<>).MakeGenericType(ft); + gen.EmitCall(OpCodes.Call, ct.GetMethod("get_Default"), null); + gen.Emit(OpCodes.Ldarg_0); + gen.Emit(OpCodes.Ldfld, field); + gen.EmitCall(OpCodes.Callvirt, ct.GetMethod("GetHashCode", new[] {ft}), null); + gen.Emit(OpCodes.Xor); + } + gen.Emit(OpCodes.Ret); + } + } + + public sealed class ParseException : Exception + { + private readonly int position; + + public ParseException(string message, int position) + : base(message) + { + this.position = position; + } + + public int Position + { + get { return position; } + } + + public override string ToString() + { + return string.Format(Res.ParseExceptionFormat, Message, position); + } + } + + internal class ExpressionParser + { + private struct Token + { + public TokenId id; + public int pos; + public string text; + } + + private enum TokenId + { + Unknown, + End, + Identifier, + StringLiteral, + IntegerLiteral, + RealLiteral, + Exclamation, + Percent, + Amphersand, + OpenParen, + CloseParen, + Asterisk, + Plus, + Comma, + Minus, + Dot, + Slash, + Colon, + LessThan, + Equal, + GreaterThan, + Question, + OpenBracket, + CloseBracket, + Bar, + ExclamationEqual, + DoubleAmphersand, + LessThanEqual, + LessGreater, + DoubleEqual, + GreaterThanEqual, + DoubleBar + } + + private interface ILogicalSignatures + { + void F(bool x, bool y); + void F(bool? x, bool? y); + } + + private interface IArithmeticSignatures + { + void F(int x, int y); + void F(uint x, uint y); + void F(long x, long y); + void F(ulong x, ulong y); + void F(float x, float y); + void F(double x, double y); + void F(decimal x, decimal y); + void F(int? x, int? y); + void F(uint? x, uint? y); + void F(long? x, long? y); + void F(ulong? x, ulong? y); + void F(float? x, float? y); + void F(double? x, double? y); + void F(decimal? x, decimal? y); + } + + private interface IRelationalSignatures : IArithmeticSignatures + { + void F(string x, string y); + void F(char x, char y); + void F(DateTime x, DateTime y); + void F(TimeSpan x, TimeSpan y); + void F(char? x, char? y); + void F(DateTime? x, DateTime? y); + void F(TimeSpan? x, TimeSpan? y); + } + + private interface IEqualitySignatures : IRelationalSignatures + { + void F(bool x, bool y); + void F(bool? x, bool? y); + } + + private interface IAddSignatures : IArithmeticSignatures + { + void F(DateTime x, TimeSpan y); + void F(TimeSpan x, TimeSpan y); + void F(DateTime? x, TimeSpan? y); + void F(TimeSpan? x, TimeSpan? y); + } + + private interface ISubtractSignatures : IAddSignatures + { + void F(DateTime x, DateTime y); + void F(DateTime? x, DateTime? y); + } + + private interface INegationSignatures + { + void F(int x); + void F(long x); + void F(float x); + void F(double x); + void F(decimal x); + void F(int? x); + void F(long? x); + void F(float? x); + void F(double? x); + void F(decimal? x); + } + + private interface INotSignatures + { + void F(bool x); + void F(bool? x); + } + + private interface IEnumerableSignatures + { + void Where(bool predicate); + void Any(); + void Any(bool predicate); + void All(bool predicate); + void Count(); + void Count(bool predicate); + void Min(object selector); + void Max(object selector); + void Sum(int selector); + void Sum(int? selector); + void Sum(long selector); + void Sum(long? selector); + void Sum(float selector); + void Sum(float? selector); + void Sum(double selector); + void Sum(double? selector); + void Sum(decimal selector); + void Sum(decimal? selector); + void Average(int selector); + void Average(int? selector); + void Average(long selector); + void Average(long? selector); + void Average(float selector); + void Average(float? selector); + void Average(double selector); + void Average(double? selector); + void Average(decimal selector); + void Average(decimal? selector); + } + + private static readonly Type[] predefinedTypes = { + typeof (Object), + typeof (Boolean), + typeof (Char), + typeof (String), + typeof (SByte), + typeof (Byte), + typeof (Int16), + typeof (UInt16), + typeof (Int32), + typeof (UInt32), + typeof (Int64), + typeof (UInt64), + typeof (Single), + typeof (Double), + typeof (Decimal), + typeof (DateTime), + typeof (TimeSpan), + typeof (Guid), + typeof (Math), + typeof (Convert) + }; + + private static readonly Expression trueLiteral = Expression.Constant(true); + private static readonly Expression falseLiteral = Expression.Constant(false); + private static readonly Expression nullLiteral = Expression.Constant(null); + + private static readonly string keywordIt = "it"; + private static readonly string keywordIif = "iif"; + private static readonly string keywordNew = "new"; + + private static Dictionary keywords; + + private readonly Dictionary symbols; + private IDictionary externals; + private readonly Dictionary literals; + private ParameterExpression it; + private readonly string text; + private int textPos; + private readonly int textLen; + private char ch; + private Token token; + + public ExpressionParser(ParameterExpression[] parameters, string expression, object[] values) + { + if (expression == null) throw new ArgumentNullException("expression"); + if (keywords == null) keywords = CreateKeywords(); + symbols = new Dictionary(StringComparer.OrdinalIgnoreCase); + literals = new Dictionary(); + if (parameters != null) ProcessParameters(parameters); + if (values != null) ProcessValues(values); + text = expression; + textLen = text.Length; + SetTextPos(0); + NextToken(); + } + + private void ProcessParameters(ParameterExpression[] parameters) + { + foreach (ParameterExpression pe in parameters) + if (!String.IsNullOrEmpty(pe.Name)) + AddSymbol(pe.Name, pe); + if (parameters.Length == 1 && String.IsNullOrEmpty(parameters[0].Name)) + it = parameters[0]; + } + + private void ProcessValues(object[] values) + { + for (int i = 0; i < values.Length; i++) + { + object value = values[i]; + if (i == values.Length - 1 && value is IDictionary) + { + externals = (IDictionary) value; + } + else + { + AddSymbol("@" + i.ToString(CultureInfo.InvariantCulture), value); + } + } + } + + private void AddSymbol(string name, object value) + { + if (symbols.ContainsKey(name)) + throw ParseError(Res.DuplicateIdentifier, name); + symbols.Add(name, value); + } + + public Expression Parse(Type resultType) + { + int exprPos = token.pos; + Expression expr = ParseExpression(); + if (resultType != null) + if ((expr = PromoteExpression(expr, resultType, true)) == null) + throw ParseError(exprPos, Res.ExpressionTypeMismatch, GetTypeName(resultType)); + ValidateToken(TokenId.End, Res.SyntaxError); + return expr; + } + +#pragma warning disable 0219 + public IEnumerable ParseOrdering() + { + var orderings = new List(); + while (true) + { + Expression expr = ParseExpression(); + bool ascending = true; + if (TokenIdentifierIs("asc") || TokenIdentifierIs("ascending")) + { + NextToken(); + } + else if (TokenIdentifierIs("desc") || TokenIdentifierIs("descending")) + { + NextToken(); + ascending = false; + } + orderings.Add(new DynamicOrdering {Selector = expr, Ascending = ascending}); + if (token.id != TokenId.Comma) break; + NextToken(); + } + ValidateToken(TokenId.End, Res.SyntaxError); + return orderings; + } +#pragma warning restore 0219 + + // ?: operator + private Expression ParseExpression() + { + int errorPos = token.pos; + Expression expr = ParseLogicalOr(); + if (token.id == TokenId.Question) + { + NextToken(); + Expression expr1 = ParseExpression(); + ValidateToken(TokenId.Colon, Res.ColonExpected); + NextToken(); + Expression expr2 = ParseExpression(); + expr = GenerateConditional(expr, expr1, expr2, errorPos); + } + return expr; + } + + // ||, or operator + private Expression ParseLogicalOr() + { + Expression left = ParseLogicalAnd(); + while (token.id == TokenId.DoubleBar || TokenIdentifierIs("or")) + { + Token op = token; + NextToken(); + Expression right = ParseLogicalAnd(); + CheckAndPromoteOperands(typeof (ILogicalSignatures), op.text, ref left, ref right, op.pos); + left = Expression.OrElse(left, right); + } + return left; + } + + // &&, and operator + private Expression ParseLogicalAnd() + { + Expression left = ParseComparison(); + while (token.id == TokenId.DoubleAmphersand || TokenIdentifierIs("and")) + { + Token op = token; + NextToken(); + Expression right = ParseComparison(); + CheckAndPromoteOperands(typeof (ILogicalSignatures), op.text, ref left, ref right, op.pos); + left = Expression.AndAlso(left, right); + } + return left; + } + + // =, ==, !=, <>, >, >=, <, <= operators + private Expression ParseComparison() + { + Expression left = ParseAdditive(); + while (token.id == TokenId.Equal || token.id == TokenId.DoubleEqual || + token.id == TokenId.ExclamationEqual || token.id == TokenId.LessGreater || + token.id == TokenId.GreaterThan || token.id == TokenId.GreaterThanEqual || + token.id == TokenId.LessThan || token.id == TokenId.LessThanEqual) + { + Token op = token; + NextToken(); + Expression right = ParseAdditive(); + bool isEquality = op.id == TokenId.Equal || op.id == TokenId.DoubleEqual || + op.id == TokenId.ExclamationEqual || op.id == TokenId.LessGreater; + if (isEquality && !left.Type.IsValueType && !right.Type.IsValueType) + { + if (left.Type != right.Type) + { + if (left.Type.IsAssignableFrom(right.Type)) + { + right = Expression.Convert(right, left.Type); + } + else if (right.Type.IsAssignableFrom(left.Type)) + { + left = Expression.Convert(left, right.Type); + } + else + { + throw IncompatibleOperandsError(op.text, left, right, op.pos); + } + } + } + else if (IsEnumType(left.Type) || IsEnumType(right.Type)) + { + if (left.Type != right.Type) + { + Expression e; + if ((e = PromoteExpression(right, left.Type, true)) != null) + { + right = e; + } + else if ((e = PromoteExpression(left, right.Type, true)) != null) + { + left = e; + } + else + { + throw IncompatibleOperandsError(op.text, left, right, op.pos); + } + } + } + else + { + CheckAndPromoteOperands(isEquality ? typeof (IEqualitySignatures) : typeof (IRelationalSignatures), + op.text, ref left, ref right, op.pos); + } + switch (op.id) + { + case TokenId.Equal: + case TokenId.DoubleEqual: + left = GenerateEqual(left, right); + break; + case TokenId.ExclamationEqual: + case TokenId.LessGreater: + left = GenerateNotEqual(left, right); + break; + case TokenId.GreaterThan: + left = GenerateGreaterThan(left, right); + break; + case TokenId.GreaterThanEqual: + left = GenerateGreaterThanEqual(left, right); + break; + case TokenId.LessThan: + left = GenerateLessThan(left, right); + break; + case TokenId.LessThanEqual: + left = GenerateLessThanEqual(left, right); + break; + } + } + return left; + } + + // +, -, & operators + private Expression ParseAdditive() + { + Expression left = ParseMultiplicative(); + while (token.id == TokenId.Plus || token.id == TokenId.Minus || + token.id == TokenId.Amphersand) + { + Token op = token; + NextToken(); + Expression right = ParseMultiplicative(); + switch (op.id) + { + case TokenId.Plus: + if (left.Type == typeof (string) || right.Type == typeof (string)) + goto case TokenId.Amphersand; + CheckAndPromoteOperands(typeof (IAddSignatures), op.text, ref left, ref right, op.pos); + left = GenerateAdd(left, right); + break; + case TokenId.Minus: + CheckAndPromoteOperands(typeof (ISubtractSignatures), op.text, ref left, ref right, op.pos); + left = GenerateSubtract(left, right); + break; + case TokenId.Amphersand: + left = GenerateStringConcat(left, right); + break; + } + } + return left; + } + + // *, /, %, mod operators + private Expression ParseMultiplicative() + { + Expression left = ParseUnary(); + while (token.id == TokenId.Asterisk || token.id == TokenId.Slash || + token.id == TokenId.Percent || TokenIdentifierIs("mod")) + { + Token op = token; + NextToken(); + Expression right = ParseUnary(); + CheckAndPromoteOperands(typeof (IArithmeticSignatures), op.text, ref left, ref right, op.pos); + switch (op.id) + { + case TokenId.Asterisk: + left = Expression.Multiply(left, right); + break; + case TokenId.Slash: + left = Expression.Divide(left, right); + break; + case TokenId.Percent: + case TokenId.Identifier: + left = Expression.Modulo(left, right); + break; + } + } + return left; + } + + // -, !, not unary operators + private Expression ParseUnary() + { + if (token.id == TokenId.Minus || token.id == TokenId.Exclamation || + TokenIdentifierIs("not")) + { + Token op = token; + NextToken(); + if (op.id == TokenId.Minus && (token.id == TokenId.IntegerLiteral || + token.id == TokenId.RealLiteral)) + { + token.text = "-" + token.text; + token.pos = op.pos; + return ParsePrimary(); + } + Expression expr = ParseUnary(); + if (op.id == TokenId.Minus) + { + CheckAndPromoteOperand(typeof (INegationSignatures), op.text, ref expr, op.pos); + expr = Expression.Negate(expr); + } + else + { + CheckAndPromoteOperand(typeof (INotSignatures), op.text, ref expr, op.pos); + expr = Expression.Not(expr); + } + return expr; + } + return ParsePrimary(); + } + + private Expression ParsePrimary() + { + Expression expr = ParsePrimaryStart(); + while (true) + { + if (token.id == TokenId.Dot) + { + NextToken(); + expr = ParseMemberAccess(null, expr); + } + else if (token.id == TokenId.OpenBracket) + { + expr = ParseElementAccess(expr); + } + else + { + break; + } + } + return expr; + } + + private Expression ParsePrimaryStart() + { + switch (token.id) + { + case TokenId.Identifier: + return ParseIdentifier(); + case TokenId.StringLiteral: + return ParseStringLiteral(); + case TokenId.IntegerLiteral: + return ParseIntegerLiteral(); + case TokenId.RealLiteral: + return ParseRealLiteral(); + case TokenId.OpenParen: + return ParseParenExpression(); + default: + throw ParseError(Res.ExpressionExpected); + } + } + + private Expression ParseStringLiteral() + { + ValidateToken(TokenId.StringLiteral); + char quote = token.text[0]; + string s = token.text.Substring(1, token.text.Length - 2); + int start = 0; + while (true) + { + int i = s.IndexOf(quote, start); + if (i < 0) break; + s = s.Remove(i, 1); + start = i + 1; + } + if (quote == '\'') + { + if (s.Length != 1) + throw ParseError(Res.InvalidCharacterLiteral); + NextToken(); + return CreateLiteral(s[0], s); + } + NextToken(); + return CreateLiteral(s, s); + } + + private Expression ParseIntegerLiteral() + { + ValidateToken(TokenId.IntegerLiteral); + string text = token.text; + if (text[0] != '-') + { + ulong value; + if (!UInt64.TryParse(text, out value)) + throw ParseError(Res.InvalidIntegerLiteral, text); + NextToken(); + if (value <= Int32.MaxValue) return CreateLiteral((int) value, text); + if (value <= UInt32.MaxValue) return CreateLiteral((uint) value, text); + if (value <= Int64.MaxValue) return CreateLiteral((long) value, text); + return CreateLiteral(value, text); + } + else + { + long value; + if (!Int64.TryParse(text, out value)) + throw ParseError(Res.InvalidIntegerLiteral, text); + NextToken(); + if (value >= Int32.MinValue && value <= Int32.MaxValue) + return CreateLiteral((int) value, text); + return CreateLiteral(value, text); + } + } + + private Expression ParseRealLiteral() + { + ValidateToken(TokenId.RealLiteral); + string text = token.text; + object value = null; + char last = text[text.Length - 1]; + if (last == 'F' || last == 'f') + { + float f; + if (Single.TryParse(text.Substring(0, text.Length - 1), out f)) value = f; + } + else + { + double d; + if (Double.TryParse(text, out d)) value = d; + } + if (value == null) throw ParseError(Res.InvalidRealLiteral, text); + NextToken(); + return CreateLiteral(value, text); + } + + private Expression CreateLiteral(object value, string text) + { + ConstantExpression expr = Expression.Constant(value); + literals.Add(expr, text); + return expr; + } + + private Expression ParseParenExpression() + { + ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); + NextToken(); + Expression e = ParseExpression(); + ValidateToken(TokenId.CloseParen, Res.CloseParenOrOperatorExpected); + NextToken(); + return e; + } + + private Expression ParseIdentifier() + { + ValidateToken(TokenId.Identifier); + object value; + if (keywords.TryGetValue(token.text, out value)) + { + if (value is Type) return ParseTypeAccess((Type) value); + if ((string) value == keywordIt) return ParseIt(); + if ((string) value == keywordIif) return ParseIif(); + if ((string) value == keywordNew) return ParseNew(); + NextToken(); + return (Expression) value; + } + if (symbols.TryGetValue(token.text, out value) || + externals != null && externals.TryGetValue(token.text, out value)) + { + var expr = value as Expression; + if (expr == null) + { + expr = Expression.Constant(value); + } + else + { + var lambda = expr as LambdaExpression; + if (lambda != null) return ParseLambdaInvocation(lambda); + } + NextToken(); + return expr; + } + if (it != null) return ParseMemberAccess(null, it); + throw ParseError(Res.UnknownIdentifier, token.text); + } + + private Expression ParseIt() + { + if (it == null) + throw ParseError(Res.NoItInScope); + NextToken(); + return it; + } + + private Expression ParseIif() + { + int errorPos = token.pos; + NextToken(); + Expression[] args = ParseArgumentList(); + if (args.Length != 3) + throw ParseError(errorPos, Res.IifRequiresThreeArgs); + return GenerateConditional(args[0], args[1], args[2], errorPos); + } + + private Expression GenerateConditional(Expression test, Expression expr1, Expression expr2, int errorPos) + { + if (test.Type != typeof (bool)) + throw ParseError(errorPos, Res.FirstExprMustBeBool); + if (expr1.Type != expr2.Type) + { + Expression expr1as2 = expr2 != nullLiteral ? PromoteExpression(expr1, expr2.Type, true) : null; + Expression expr2as1 = expr1 != nullLiteral ? PromoteExpression(expr2, expr1.Type, true) : null; + if (expr1as2 != null && expr2as1 == null) + { + expr1 = expr1as2; + } + else if (expr2as1 != null && expr1as2 == null) + { + expr2 = expr2as1; + } + else + { + string type1 = expr1 != nullLiteral ? expr1.Type.Name : "null"; + string type2 = expr2 != nullLiteral ? expr2.Type.Name : "null"; + if (expr1as2 != null && expr2as1 != null) + throw ParseError(errorPos, Res.BothTypesConvertToOther, type1, type2); + throw ParseError(errorPos, Res.NeitherTypeConvertsToOther, type1, type2); + } + } + return Expression.Condition(test, expr1, expr2); + } + + private Expression ParseNew() + { + NextToken(); + ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); + NextToken(); + var properties = new List(); + var expressions = new List(); + while (true) + { + int exprPos = token.pos; + Expression expr = ParseExpression(); + string propName; + if (TokenIdentifierIs("as")) + { + NextToken(); + propName = GetIdentifier(); + NextToken(); + } + else + { + var me = expr as MemberExpression; + if (me == null) throw ParseError(exprPos, Res.MissingAsClause); + propName = me.Member.Name; + } + expressions.Add(expr); + properties.Add(new DynamicProperty(propName, expr.Type)); + if (token.id != TokenId.Comma) break; + NextToken(); + } + ValidateToken(TokenId.CloseParen, Res.CloseParenOrCommaExpected); + NextToken(); + Type type = DynamicExpression.CreateClass(properties); + var bindings = new MemberBinding[properties.Count]; + for (int i = 0; i < bindings.Length; i++) + bindings[i] = Expression.Bind(type.GetProperty(properties[i].Name), expressions[i]); + return Expression.MemberInit(Expression.New(type), bindings); + } + + private Expression ParseLambdaInvocation(LambdaExpression lambda) + { + int errorPos = token.pos; + NextToken(); + Expression[] args = ParseArgumentList(); + MethodBase method; + if (FindMethod(lambda.Type, "Invoke", false, args, out method) != 1) + throw ParseError(errorPos, Res.ArgsIncompatibleWithLambda); + return Expression.Invoke(lambda, args); + } + + private Expression ParseTypeAccess(Type type) + { + int errorPos = token.pos; + NextToken(); + if (token.id == TokenId.Question) + { + if (!type.IsValueType || IsNullableType(type)) + throw ParseError(errorPos, Res.TypeHasNoNullableForm, GetTypeName(type)); + type = typeof (Nullable<>).MakeGenericType(type); + NextToken(); + } + if (token.id == TokenId.OpenParen) + { + Expression[] args = ParseArgumentList(); + MethodBase method; + switch (FindBestMethod(type.GetConstructors(), args, out method)) + { + case 0: + if (args.Length == 1) + return GenerateConversion(args[0], type, errorPos); + throw ParseError(errorPos, Res.NoMatchingConstructor, GetTypeName(type)); + case 1: + return Expression.New((ConstructorInfo) method, args); + default: + throw ParseError(errorPos, Res.AmbiguousConstructorInvocation, GetTypeName(type)); + } + } + ValidateToken(TokenId.Dot, Res.DotOrOpenParenExpected); + NextToken(); + return ParseMemberAccess(type, null); + } + + private Expression GenerateConversion(Expression expr, Type type, int errorPos) + { + Type exprType = expr.Type; + if (exprType == type) return expr; + if (exprType.IsValueType && type.IsValueType) + { + if ((IsNullableType(exprType) || IsNullableType(type)) && + GetNonNullableType(exprType) == GetNonNullableType(type)) + return Expression.Convert(expr, type); + if ((IsNumericType(exprType) || IsEnumType(exprType)) && + (IsNumericType(type)) || IsEnumType(type)) + return Expression.ConvertChecked(expr, type); + } + if (exprType.IsAssignableFrom(type) || type.IsAssignableFrom(exprType) || + exprType.IsInterface || type.IsInterface) + return Expression.Convert(expr, type); + throw ParseError(errorPos, Res.CannotConvertValue, + GetTypeName(exprType), GetTypeName(type)); + } + + private Expression ParseMemberAccess(Type type, Expression instance) + { + if (instance != null) type = instance.Type; + int errorPos = token.pos; + string id = GetIdentifier(); + NextToken(); + if (token.id == TokenId.OpenParen) + { + if (instance != null && type != typeof (string)) + { + Type enumerableType = FindGenericType(typeof (IEnumerable<>), type); + if (enumerableType != null) + { + Type elementType = enumerableType.GetGenericArguments()[0]; + return ParseAggregate(instance, elementType, id, errorPos); + } + } + Expression[] args = ParseArgumentList(); + MethodBase mb; + switch (FindMethod(type, id, instance == null, args, out mb)) + { + case 0: + throw ParseError(errorPos, Res.NoApplicableMethod, + id, GetTypeName(type)); + case 1: + var method = (MethodInfo) mb; + if (!IsPredefinedType(method.DeclaringType)) + throw ParseError(errorPos, Res.MethodsAreInaccessible, GetTypeName(method.DeclaringType)); + if (method.ReturnType == typeof (void)) + throw ParseError(errorPos, Res.MethodIsVoid, + id, GetTypeName(method.DeclaringType)); + return Expression.Call(instance, method, args); + default: + throw ParseError(errorPos, Res.AmbiguousMethodInvocation, + id, GetTypeName(type)); + } + } + else + { + MemberInfo member = FindPropertyOrField(type, id, instance == null); + if (member == null) + throw ParseError(errorPos, Res.UnknownPropertyOrField, + id, GetTypeName(type)); + return member is PropertyInfo + ? Expression.Property(instance, (PropertyInfo) member) + : Expression.Field(instance, (FieldInfo) member); + } + } + + private static Type FindGenericType(Type generic, Type type) + { + while (type != null && type != typeof (object)) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == generic) return type; + if (generic.IsInterface) + { + foreach (Type intfType in type.GetInterfaces()) + { + Type found = FindGenericType(generic, intfType); + if (found != null) return found; + } + } + type = type.BaseType; + } + return null; + } + + private Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos) + { + ParameterExpression outerIt = it; + ParameterExpression innerIt = Expression.Parameter(elementType, ""); + it = innerIt; + Expression[] args = ParseArgumentList(); + it = outerIt; + MethodBase signature; + if (FindMethod(typeof (IEnumerableSignatures), methodName, false, args, out signature) != 1) + throw ParseError(errorPos, Res.NoApplicableAggregate, methodName); + Type[] typeArgs; + if (signature.Name == "Min" || signature.Name == "Max") + { + typeArgs = new[] {elementType, args[0].Type}; + } + else + { + typeArgs = new[] {elementType}; + } + if (args.Length == 0) + { + args = new[] {instance}; + } + else + { + args = new[] {instance, Expression.Lambda(args[0], innerIt)}; + } + return Expression.Call(typeof (Enumerable), signature.Name, typeArgs, args); + } + + private Expression[] ParseArgumentList() + { + ValidateToken(TokenId.OpenParen, Res.OpenParenExpected); + NextToken(); + Expression[] args = token.id != TokenId.CloseParen ? ParseArguments() : new Expression[0]; + ValidateToken(TokenId.CloseParen, Res.CloseParenOrCommaExpected); + NextToken(); + return args; + } + + private Expression[] ParseArguments() + { + var argList = new List(); + while (true) + { + argList.Add(ParseExpression()); + if (token.id != TokenId.Comma) break; + NextToken(); + } + return argList.ToArray(); + } + + private Expression ParseElementAccess(Expression expr) + { + int errorPos = token.pos; + ValidateToken(TokenId.OpenBracket, Res.OpenParenExpected); + NextToken(); + Expression[] args = ParseArguments(); + ValidateToken(TokenId.CloseBracket, Res.CloseBracketOrCommaExpected); + NextToken(); + if (expr.Type.IsArray) + { + if (expr.Type.GetArrayRank() != 1 || args.Length != 1) + throw ParseError(errorPos, Res.CannotIndexMultiDimArray); + Expression index = PromoteExpression(args[0], typeof (int), true); + if (index == null) + throw ParseError(errorPos, Res.InvalidIndex); + return Expression.ArrayIndex(expr, index); + } + else + { + MethodBase mb; + switch (FindIndexer(expr.Type, args, out mb)) + { + case 0: + throw ParseError(errorPos, Res.NoApplicableIndexer, + GetTypeName(expr.Type)); + case 1: + return Expression.Call(expr, (MethodInfo) mb, args); + default: + throw ParseError(errorPos, Res.AmbiguousIndexerInvocation, + GetTypeName(expr.Type)); + } + } + } + + private static bool IsPredefinedType(Type type) + { + foreach (Type t in predefinedTypes) if (t == type) return true; + return false; + } + + private static bool IsNullableType(Type type) + { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>); + } + + private static Type GetNonNullableType(Type type) + { + return IsNullableType(type) ? type.GetGenericArguments()[0] : type; + } + + private static string GetTypeName(Type type) + { + Type baseType = GetNonNullableType(type); + string s = baseType.Name; + if (type != baseType) s += '?'; + return s; + } + + private static bool IsNumericType(Type type) + { + return GetNumericTypeKind(type) != 0; + } + + private static bool IsSignedIntegralType(Type type) + { + return GetNumericTypeKind(type) == 2; + } + + private static bool IsUnsignedIntegralType(Type type) + { + return GetNumericTypeKind(type) == 3; + } + + private static int GetNumericTypeKind(Type type) + { + type = GetNonNullableType(type); + if (type.IsEnum) return 0; + switch (Type.GetTypeCode(type)) + { + case TypeCode.Char: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return 1; + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + return 2; + case TypeCode.Byte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + return 3; + default: + return 0; + } + } + + private static bool IsEnumType(Type type) + { + return GetNonNullableType(type).IsEnum; + } + + private void CheckAndPromoteOperand(Type signatures, string opName, ref Expression expr, int errorPos) + { + var args = new[] {expr}; + MethodBase method; + if (FindMethod(signatures, "F", false, args, out method) != 1) + throw ParseError(errorPos, Res.IncompatibleOperand, + opName, GetTypeName(args[0].Type)); + expr = args[0]; + } + + private void CheckAndPromoteOperands(Type signatures, string opName, ref Expression left, ref Expression right, + int errorPos) + { + var args = new[] {left, right}; + MethodBase method; + if (FindMethod(signatures, "F", false, args, out method) != 1) + throw IncompatibleOperandsError(opName, left, right, errorPos); + left = args[0]; + right = args[1]; + } + + private Exception IncompatibleOperandsError(string opName, Expression left, Expression right, int pos) + { + return ParseError(pos, Res.IncompatibleOperands, + opName, GetTypeName(left.Type), GetTypeName(right.Type)); + } + + private MemberInfo FindPropertyOrField(Type type, string memberName, bool staticAccess) + { + BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | + (staticAccess ? BindingFlags.Static : BindingFlags.Instance); + foreach (Type t in SelfAndBaseTypes(type)) + { + MemberInfo[] members = t.FindMembers(MemberTypes.Property | MemberTypes.Field, + flags, Type.FilterNameIgnoreCase, memberName); + if (members.Length != 0) return members[0]; + } + return null; + } + + private int FindMethod(Type type, string methodName, bool staticAccess, Expression[] args, out MethodBase method) + { + BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | + (staticAccess ? BindingFlags.Static : BindingFlags.Instance); + foreach (Type t in SelfAndBaseTypes(type)) + { + MemberInfo[] members = t.FindMembers(MemberTypes.Method, + flags, Type.FilterNameIgnoreCase, methodName); + int count = FindBestMethod(members.Cast(), args, out method); + if (count != 0) return count; + } + method = null; + return 0; + } + + private int FindIndexer(Type type, Expression[] args, out MethodBase method) + { + foreach (Type t in SelfAndBaseTypes(type)) + { + MemberInfo[] members = t.GetDefaultMembers(); + if (members.Length != 0) + { + IEnumerable methods = members. + OfType(). + Select(p => (MethodBase) p.GetGetMethod()). + Where(m => m != null); + int count = FindBestMethod(methods, args, out method); + if (count != 0) return count; + } + } + method = null; + return 0; + } + + private static IEnumerable SelfAndBaseTypes(Type type) + { + if (type.IsInterface) + { + var types = new List(); + AddInterface(types, type); + return types; + } + return SelfAndBaseClasses(type); + } + + private static IEnumerable SelfAndBaseClasses(Type type) + { + while (type != null) + { + yield return type; + type = type.BaseType; + } + } + + private static void AddInterface(List types, Type type) + { + if (!types.Contains(type)) + { + types.Add(type); + foreach (Type t in type.GetInterfaces()) AddInterface(types, t); + } + } + + private class MethodData + { + public Expression[] Args; + public MethodBase MethodBase; + public ParameterInfo[] Parameters; + } + + private int FindBestMethod(IEnumerable methods, Expression[] args, out MethodBase method) + { + MethodData[] applicable = methods. + Select(m => new MethodData {MethodBase = m, Parameters = m.GetParameters()}). + Where(m => IsApplicable(m, args)). + ToArray(); + if (applicable.Length > 1) + { + applicable = applicable. + Where(m => applicable.All(n => m == n || IsBetterThan(args, m, n))). + ToArray(); + } + if (applicable.Length == 1) + { + MethodData md = applicable[0]; + for (int i = 0; i < args.Length; i++) args[i] = md.Args[i]; + method = md.MethodBase; + } + else + { + method = null; + } + return applicable.Length; + } + + private bool IsApplicable(MethodData method, Expression[] args) + { + if (method.Parameters.Length != args.Length) return false; + var promotedArgs = new Expression[args.Length]; + for (int i = 0; i < args.Length; i++) + { + ParameterInfo pi = method.Parameters[i]; + if (pi.IsOut) return false; + Expression promoted = PromoteExpression(args[i], pi.ParameterType, false); + if (promoted == null) return false; + promotedArgs[i] = promoted; + } + method.Args = promotedArgs; + return true; + } + + private Expression PromoteExpression(Expression expr, Type type, bool exact) + { + if (expr.Type == type) return expr; + if (expr is ConstantExpression) + { + var ce = (ConstantExpression) expr; + if (ce == nullLiteral) + { + if (!type.IsValueType || IsNullableType(type)) + return Expression.Constant(null, type); + } + else + { + string text; + if (literals.TryGetValue(ce, out text)) + { + Type target = GetNonNullableType(type); + Object value = null; + switch (Type.GetTypeCode(ce.Type)) + { + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + value = ParseNumber(text, target); + break; + case TypeCode.Double: + if (target == typeof (decimal)) value = ParseNumber(text, target); + break; + case TypeCode.String: + value = ParseEnum(text, target); + break; + } + if (value != null) + return Expression.Constant(value, type); + } + } + } + if (IsCompatibleWith(expr.Type, type)) + { + if (type.IsValueType || exact) return Expression.Convert(expr, type); + return expr; + } + return null; + } + + private static object ParseNumber(string text, Type type) + { + switch (Type.GetTypeCode(GetNonNullableType(type))) + { + case TypeCode.SByte: + sbyte sb; + if (sbyte.TryParse(text, out sb)) return sb; + break; + case TypeCode.Byte: + byte b; + if (byte.TryParse(text, out b)) return b; + break; + case TypeCode.Int16: + short s; + if (short.TryParse(text, out s)) return s; + break; + case TypeCode.UInt16: + ushort us; + if (ushort.TryParse(text, out us)) return us; + break; + case TypeCode.Int32: + int i; + if (int.TryParse(text, out i)) return i; + break; + case TypeCode.UInt32: + uint ui; + if (uint.TryParse(text, out ui)) return ui; + break; + case TypeCode.Int64: + long l; + if (long.TryParse(text, out l)) return l; + break; + case TypeCode.UInt64: + ulong ul; + if (ulong.TryParse(text, out ul)) return ul; + break; + case TypeCode.Single: + float f; + if (float.TryParse(text, out f)) return f; + break; + case TypeCode.Double: + double d; + if (double.TryParse(text, out d)) return d; + break; + case TypeCode.Decimal: + decimal e; + if (decimal.TryParse(text, out e)) return e; + break; + } + return null; + } + + private static object ParseEnum(string name, Type type) + { + if (type.IsEnum) + { + MemberInfo[] memberInfos = type.FindMembers(MemberTypes.Field, + BindingFlags.Public | BindingFlags.DeclaredOnly | + BindingFlags.Static, + Type.FilterNameIgnoreCase, name); + if (memberInfos.Length != 0) return ((FieldInfo) memberInfos[0]).GetValue(null); + } + return null; + } + + private static bool IsCompatibleWith(Type source, Type target) + { + if (source == target) return true; + if (!target.IsValueType) return target.IsAssignableFrom(source); + Type st = GetNonNullableType(source); + Type tt = GetNonNullableType(target); + if (st != source && tt == target) return false; + TypeCode sc = st.IsEnum ? TypeCode.Object : Type.GetTypeCode(st); + TypeCode tc = tt.IsEnum ? TypeCode.Object : Type.GetTypeCode(tt); + switch (sc) + { + case TypeCode.SByte: + switch (tc) + { + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.Byte: + switch (tc) + { + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.Int16: + switch (tc) + { + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.UInt16: + switch (tc) + { + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.Int32: + switch (tc) + { + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.UInt32: + switch (tc) + { + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.Int64: + switch (tc) + { + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.UInt64: + switch (tc) + { + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + break; + case TypeCode.Single: + switch (tc) + { + case TypeCode.Single: + case TypeCode.Double: + return true; + } + break; + default: + if (st == tt) return true; + break; + } + return false; + } + + private static bool IsBetterThan(Expression[] args, MethodData m1, MethodData m2) + { + bool better = false; + for (int i = 0; i < args.Length; i++) + { + int c = CompareConversions(args[i].Type, + m1.Parameters[i].ParameterType, + m2.Parameters[i].ParameterType); + if (c < 0) return false; + if (c > 0) better = true; + } + return better; + } + + // Return 1 if s -> t1 is a better conversion than s -> t2 + // Return -1 if s -> t2 is a better conversion than s -> t1 + // Return 0 if neither conversion is better + private static int CompareConversions(Type s, Type t1, Type t2) + { + if (t1 == t2) return 0; + if (s == t1) return 1; + if (s == t2) return -1; + bool t1t2 = IsCompatibleWith(t1, t2); + bool t2t1 = IsCompatibleWith(t2, t1); + if (t1t2 && !t2t1) return 1; + if (t2t1 && !t1t2) return -1; + if (IsSignedIntegralType(t1) && IsUnsignedIntegralType(t2)) return 1; + if (IsSignedIntegralType(t2) && IsUnsignedIntegralType(t1)) return -1; + return 0; + } + + private Expression GenerateEqual(Expression left, Expression right) + { + return Expression.Equal(left, right); + } + + private Expression GenerateNotEqual(Expression left, Expression right) + { + return Expression.NotEqual(left, right); + } + + private Expression GenerateGreaterThan(Expression left, Expression right) + { + if (left.Type == typeof (string)) + { + return Expression.GreaterThan( + GenerateStaticMethodCall("Compare", left, right), + Expression.Constant(0) + ); + } + return Expression.GreaterThan(left, right); + } + + private Expression GenerateGreaterThanEqual(Expression left, Expression right) + { + if (left.Type == typeof (string)) + { + return Expression.GreaterThanOrEqual( + GenerateStaticMethodCall("Compare", left, right), + Expression.Constant(0) + ); + } + return Expression.GreaterThanOrEqual(left, right); + } + + private Expression GenerateLessThan(Expression left, Expression right) + { + if (left.Type == typeof (string)) + { + return Expression.LessThan( + GenerateStaticMethodCall("Compare", left, right), + Expression.Constant(0) + ); + } + return Expression.LessThan(left, right); + } + + private Expression GenerateLessThanEqual(Expression left, Expression right) + { + if (left.Type == typeof (string)) + { + return Expression.LessThanOrEqual( + GenerateStaticMethodCall("Compare", left, right), + Expression.Constant(0) + ); + } + return Expression.LessThanOrEqual(left, right); + } + + private Expression GenerateAdd(Expression left, Expression right) + { + if (left.Type == typeof (string) && right.Type == typeof (string)) + { + return GenerateStaticMethodCall("Concat", left, right); + } + return Expression.Add(left, right); + } + + private Expression GenerateSubtract(Expression left, Expression right) + { + return Expression.Subtract(left, right); + } + + private Expression GenerateStringConcat(Expression left, Expression right) + { + return Expression.Call( + null, + typeof (string).GetMethod("Concat", new[] {typeof (object), typeof (object)}), + new[] {left, right}); + } + + private MethodInfo GetStaticMethod(string methodName, Expression left, Expression right) + { + return left.Type.GetMethod(methodName, new[] {left.Type, right.Type}); + } + + private Expression GenerateStaticMethodCall(string methodName, Expression left, Expression right) + { + return Expression.Call(null, GetStaticMethod(methodName, left, right), new[] {left, right}); + } + + private void SetTextPos(int pos) + { + textPos = pos; + ch = textPos < textLen ? text[textPos] : '\0'; + } + + private void NextChar() + { + if (textPos < textLen) textPos++; + ch = textPos < textLen ? text[textPos] : '\0'; + } + + private void NextToken() + { + while (Char.IsWhiteSpace(ch)) NextChar(); + TokenId t; + int tokenPos = textPos; + switch (ch) + { + case '!': + NextChar(); + if (ch == '=') + { + NextChar(); + t = TokenId.ExclamationEqual; + } + else + { + t = TokenId.Exclamation; + } + break; + case '%': + NextChar(); + t = TokenId.Percent; + break; + case '&': + NextChar(); + if (ch == '&') + { + NextChar(); + t = TokenId.DoubleAmphersand; + } + else + { + t = TokenId.Amphersand; + } + break; + case '(': + NextChar(); + t = TokenId.OpenParen; + break; + case ')': + NextChar(); + t = TokenId.CloseParen; + break; + case '*': + NextChar(); + t = TokenId.Asterisk; + break; + case '+': + NextChar(); + t = TokenId.Plus; + break; + case ',': + NextChar(); + t = TokenId.Comma; + break; + case '-': + NextChar(); + t = TokenId.Minus; + break; + case '.': + NextChar(); + t = TokenId.Dot; + break; + case '/': + NextChar(); + t = TokenId.Slash; + break; + case ':': + NextChar(); + t = TokenId.Colon; + break; + case '<': + NextChar(); + if (ch == '=') + { + NextChar(); + t = TokenId.LessThanEqual; + } + else if (ch == '>') + { + NextChar(); + t = TokenId.LessGreater; + } + else + { + t = TokenId.LessThan; + } + break; + case '=': + NextChar(); + if (ch == '=') + { + NextChar(); + t = TokenId.DoubleEqual; + } + else + { + t = TokenId.Equal; + } + break; + case '>': + NextChar(); + if (ch == '=') + { + NextChar(); + t = TokenId.GreaterThanEqual; + } + else + { + t = TokenId.GreaterThan; + } + break; + case '?': + NextChar(); + t = TokenId.Question; + break; + case '[': + NextChar(); + t = TokenId.OpenBracket; + break; + case ']': + NextChar(); + t = TokenId.CloseBracket; + break; + case '|': + NextChar(); + if (ch == '|') + { + NextChar(); + t = TokenId.DoubleBar; + } + else + { + t = TokenId.Bar; + } + break; + case '"': + case '\'': + char quote = ch; + do + { + NextChar(); + while (textPos < textLen && ch != quote) NextChar(); + if (textPos == textLen) + throw ParseError(textPos, Res.UnterminatedStringLiteral); + NextChar(); + } while (ch == quote); + t = TokenId.StringLiteral; + break; + default: + if (Char.IsLetter(ch) || ch == '@' || ch == '_') + { + do + { + NextChar(); + } while (Char.IsLetterOrDigit(ch) || ch == '_'); + t = TokenId.Identifier; + break; + } + if (Char.IsDigit(ch)) + { + t = TokenId.IntegerLiteral; + do + { + NextChar(); + } while (Char.IsDigit(ch)); + if (ch == '.') + { + t = TokenId.RealLiteral; + NextChar(); + ValidateDigit(); + do + { + NextChar(); + } while (Char.IsDigit(ch)); + } + if (ch == 'E' || ch == 'e') + { + t = TokenId.RealLiteral; + NextChar(); + if (ch == '+' || ch == '-') NextChar(); + ValidateDigit(); + do + { + NextChar(); + } while (Char.IsDigit(ch)); + } + if (ch == 'F' || ch == 'f') NextChar(); + break; + } + if (textPos == textLen) + { + t = TokenId.End; + break; + } + throw ParseError(textPos, Res.InvalidCharacter, ch); + } + token.id = t; + token.text = text.Substring(tokenPos, textPos - tokenPos); + token.pos = tokenPos; + } + + private bool TokenIdentifierIs(string id) + { + return token.id == TokenId.Identifier && String.Equals(id, token.text, StringComparison.OrdinalIgnoreCase); + } + + private string GetIdentifier() + { + ValidateToken(TokenId.Identifier, Res.IdentifierExpected); + string id = token.text; + if (id.Length > 1 && id[0] == '@') id = id.Substring(1); + return id; + } + + private void ValidateDigit() + { + if (!Char.IsDigit(ch)) throw ParseError(textPos, Res.DigitExpected); + } + + private void ValidateToken(TokenId t, string errorMessage) + { + if (token.id != t) throw ParseError(errorMessage); + } + + private void ValidateToken(TokenId t) + { + if (token.id != t) throw ParseError(Res.SyntaxError); + } + + private Exception ParseError(string format, params object[] args) + { + return ParseError(token.pos, format, args); + } + + private Exception ParseError(int pos, string format, params object[] args) + { + return new ParseException(string.Format(CultureInfo.CurrentCulture, format, args), pos); + } + + private static Dictionary CreateKeywords() + { + var d = new Dictionary(StringComparer.OrdinalIgnoreCase); + d.Add("true", trueLiteral); + d.Add("false", falseLiteral); + d.Add("null", nullLiteral); + d.Add(keywordIt, keywordIt); + d.Add(keywordIif, keywordIif); + d.Add(keywordNew, keywordNew); + foreach (Type type in predefinedTypes) d.Add(type.Name, type); + return d; + } + } + + internal static class Res + { + public const string DuplicateIdentifier = "The identifier '{0}' was defined more than once"; + public const string ExpressionTypeMismatch = "Expression of type '{0}' expected"; + public const string ExpressionExpected = "Expression expected"; + public const string InvalidCharacterLiteral = "Character literal must contain exactly one character"; + public const string InvalidIntegerLiteral = "Invalid integer literal '{0}'"; + public const string InvalidRealLiteral = "Invalid real literal '{0}'"; + public const string UnknownIdentifier = "Unknown identifier '{0}'"; + public const string NoItInScope = "No 'it' is in scope"; + public const string IifRequiresThreeArgs = "The 'iif' function requires three arguments"; + public const string FirstExprMustBeBool = "The first expression must be of type 'Boolean'"; + public const string BothTypesConvertToOther = "Both of the types '{0}' and '{1}' convert to the other"; + public const string NeitherTypeConvertsToOther = "Neither of the types '{0}' and '{1}' converts to the other"; + public const string MissingAsClause = "Expression is missing an 'as' clause"; + public const string ArgsIncompatibleWithLambda = "Argument list incompatible with lambda expression"; + public const string TypeHasNoNullableForm = "Type '{0}' has no nullable form"; + public const string NoMatchingConstructor = "No matching constructor in type '{0}'"; + public const string AmbiguousConstructorInvocation = "Ambiguous invocation of '{0}' constructor"; + public const string CannotConvertValue = "A value of type '{0}' cannot be converted to type '{1}'"; + public const string NoApplicableMethod = "No applicable method '{0}' exists in type '{1}'"; + public const string MethodsAreInaccessible = "Methods on type '{0}' are not accessible"; + public const string MethodIsVoid = "Method '{0}' in type '{1}' does not return a value"; + public const string AmbiguousMethodInvocation = "Ambiguous invocation of method '{0}' in type '{1}'"; + public const string UnknownPropertyOrField = "No property or field '{0}' exists in type '{1}'"; + public const string NoApplicableAggregate = "No applicable aggregate method '{0}' exists"; + public const string CannotIndexMultiDimArray = "Indexing of multi-dimensional arrays is not supported"; + public const string InvalidIndex = "Array index must be an integer expression"; + public const string NoApplicableIndexer = "No applicable indexer exists in type '{0}'"; + public const string AmbiguousIndexerInvocation = "Ambiguous invocation of indexer in type '{0}'"; + public const string IncompatibleOperand = "Operator '{0}' incompatible with operand type '{1}'"; + public const string IncompatibleOperands = "Operator '{0}' incompatible with operand types '{1}' and '{2}'"; + public const string UnterminatedStringLiteral = "Unterminated string literal"; + public const string InvalidCharacter = "Syntax error '{0}'"; + public const string DigitExpected = "Digit expected"; + public const string SyntaxError = "Syntax error"; + public const string TokenExpected = "{0} expected"; + public const string ParseExceptionFormat = "{0} (at index {1})"; + public const string ColonExpected = "':' expected"; + public const string OpenParenExpected = "'(' expected"; + public const string CloseParenOrOperatorExpected = "')' or operator expected"; + public const string CloseParenOrCommaExpected = "')' or ',' expected"; + public const string DotOrOpenParenExpected = "'.' or '(' expected"; + public const string OpenBracketExpected = "'[' expected"; + public const string CloseBracketOrCommaExpected = "']' or ',' expected"; + public const string IdentifierExpected = "Identifier expected"; + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/HasConfigurationAccessTest.cs b/Orm/Xtensive.Orm.Tests.Framework/HasConfigurationAccessTest.cs index 2d99304076..d195b2f6bf 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/HasConfigurationAccessTest.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/HasConfigurationAccessTest.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.08.31 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests -{ - [TestFixture] - public abstract class HasConfigurationAccessTest - { - public System.Configuration.Configuration Configuration - { - get { return GetConfigurationForTestAssembly(); } - } - - protected DomainConfiguration LoadDomainConfiguration(string name) - { - return DomainConfiguration.Load(Configuration, name); - } - - protected DomainConfiguration LoadDomainConfiguration(string sectionName, string name) - { - return DomainConfiguration.Load(Configuration, sectionName, name); - } - - protected LoggingConfiguration LoadLoggingConfiguration(string sectionName) - { - return LoggingConfiguration.Load(Configuration, sectionName); - } - - private System.Configuration.Configuration GetConfigurationForTestAssembly() - { - return GetType().Assembly.GetAssemblyConfiguration(); - } - } +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.08.31 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests +{ + [TestFixture] + public abstract class HasConfigurationAccessTest + { + public System.Configuration.Configuration Configuration + { + get { return GetConfigurationForTestAssembly(); } + } + + protected DomainConfiguration LoadDomainConfiguration(string name) + { + return DomainConfiguration.Load(Configuration, name); + } + + protected DomainConfiguration LoadDomainConfiguration(string sectionName, string name) + { + return DomainConfiguration.Load(Configuration, sectionName, name); + } + + protected LoggingConfiguration LoadLoggingConfiguration(string sectionName) + { + return LoggingConfiguration.Load(Configuration, sectionName); + } + + private System.Configuration.Configuration GetConfigurationForTestAssembly() + { + return GetType().Assembly.GetAssemblyConfiguration(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/HighResolutionTime.cs b/Orm/Xtensive.Orm.Tests.Framework/HighResolutionTime.cs index 89bb9ee01a..74aca1db73 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/HighResolutionTime.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/HighResolutionTime.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.06.11 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Tests -{ - /// - /// A timer providing much higher resolution rather then default one. - /// - public class HighResolutionTime - { - private static DateTime startTime = DateTime.MinValue; - private static Stopwatch startTimer = null; - - // Static methods - - /// - /// Gets current date and time (like DateTime.Now), - /// but with the higher precision. - /// - // /// Thrown if system date \ time has been changed. - public static DateTime Now { - get { - lock (startTimer) { - DateTime now = startTime.Add(startTimer.Elapsed); - // TODO: Implement system date \ time change notification. - // Exception isn't good here, since: - // - How to finally recover from it? - // - When we should stop throwing it? -// if (now.Subtract(DateTime.Now).Duration().TotalMilliseconds>100) -// throw new SystemTimeChangedException(); - return now; - } - } - } - - - // Type initializer - - static HighResolutionTime() - { - startTime = DateTime.Now; - startTimer = Stopwatch.StartNew(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.06.11 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Tests +{ + /// + /// A timer providing much higher resolution rather then default one. + /// + public class HighResolutionTime + { + private static DateTime startTime = DateTime.MinValue; + private static Stopwatch startTimer = null; + + // Static methods + + /// + /// Gets current date and time (like DateTime.Now), + /// but with the higher precision. + /// + // /// Thrown if system date \ time has been changed. + public static DateTime Now { + get { + lock (startTimer) { + DateTime now = startTime.Add(startTimer.Elapsed); + // TODO: Implement system date \ time change notification. + // Exception isn't good here, since: + // - How to finally recover from it? + // - When we should stop throwing it? +// if (now.Subtract(DateTime.Now).Duration().TotalMilliseconds>100) +// throw new SystemTimeChangedException(); + return now; + } + } + } + + + // Type initializer + + static HighResolutionTime() + { + startTime = DateTime.Now; + startTimer = Stopwatch.StartNew(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/IndexInfoExtensions.cs b/Orm/Xtensive.Orm.Tests.Framework/IndexInfoExtensions.cs index 2f6728a071..3012b11b87 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/IndexInfoExtensions.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/IndexInfoExtensions.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.10.09 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests -{ - public static class IndexInfoExtensions - { - private const int IndentMultiplier = 2; - - public static void Dump(this IndexInfo index) - { - Console.WriteLine("----------------------------------------"); - Console.WriteLine("Index dump"); - Console.WriteLine("----------------------------------------"); - Dump(index, 0); - } - - public static void Dump(IndexInfo index, int indent) - { - Console.Out.WriteLine(""); - WriteLine("Name: " + index.Name, indent); - WriteLine("Attributes: " + index.Attributes, indent); - WriteLine("ReflectedType: " + index.ReflectedType.Name, indent); - WriteLine("Columns: " + index.Columns.Select(p => p.Name).ToCommaDelimitedString(), indent); - if (index.IsVirtual) { - if ((index.Attributes & IndexAttributes.Filtered) == IndexAttributes.Filtered) - WriteLine("FilterByTypes: " + index.FilterByTypes.ToCommaDelimitedString(), indent); - else if ((index.Attributes & IndexAttributes.View) == IndexAttributes.View) - WriteLine("SelectColumns: " + index.SelectColumns.ToCommaDelimitedString(), indent); - WriteLine("BaseIndexes: ", indent); - foreach (IndexInfo baseIndex in index.UnderlyingIndexes) - Dump(baseIndex, indent + 1); - } - } - - private static void WriteLine(string text, int indent) - { - Console.Out.Write(Enumerable.Repeat(' ', indent * IndentMultiplier).ToArray()); - Console.Out.WriteLine(text); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.10.09 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests +{ + public static class IndexInfoExtensions + { + private const int IndentMultiplier = 2; + + public static void Dump(this IndexInfo index) + { + Console.WriteLine("----------------------------------------"); + Console.WriteLine("Index dump"); + Console.WriteLine("----------------------------------------"); + Dump(index, 0); + } + + public static void Dump(IndexInfo index, int indent) + { + Console.Out.WriteLine(""); + WriteLine("Name: " + index.Name, indent); + WriteLine("Attributes: " + index.Attributes, indent); + WriteLine("ReflectedType: " + index.ReflectedType.Name, indent); + WriteLine("Columns: " + index.Columns.Select(p => p.Name).ToCommaDelimitedString(), indent); + if (index.IsVirtual) { + if ((index.Attributes & IndexAttributes.Filtered) == IndexAttributes.Filtered) + WriteLine("FilterByTypes: " + index.FilterByTypes.ToCommaDelimitedString(), indent); + else if ((index.Attributes & IndexAttributes.View) == IndexAttributes.View) + WriteLine("SelectColumns: " + index.SelectColumns.ToCommaDelimitedString(), indent); + WriteLine("BaseIndexes: ", indent); + foreach (IndexInfo baseIndex in index.UnderlyingIndexes) + Dump(baseIndex, indent + 1); + } + } + + private static void WriteLine(string text, int indent) + { + Console.Out.Write(Enumerable.Repeat(' ', indent * IndentMultiplier).ToArray()); + Console.Out.WriteLine(text); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/InheritanceSchemaModifier.cs b/Orm/Xtensive.Orm.Tests.Framework/InheritanceSchemaModifier.cs index 184242483b..27af780dc0 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/InheritanceSchemaModifier.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/InheritanceSchemaModifier.cs @@ -1,112 +1,112 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.05 - -using System; -using Xtensive.Orm; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests -{ - public abstract class InheritanceSchemaModifier : IModule - { - protected InheritanceSchema Schema { get; private set; } - - public virtual void OnBuilt(Domain domain) - { - } - - public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - foreach (HierarchyDef hierarchy in model.Hierarchies) - hierarchy.Schema = Schema; - } - - public static void ActivateModifier(InheritanceSchema schema) - { - DeactivateModifiers(); - - switch (schema) { - case InheritanceSchema.ConcreteTable: - ConcreteTableSchemaModifier.IsEnabled = true; - break; - case InheritanceSchema.SingleTable: - SingleTableSchemaModifier.IsEnabled = true; - break; - default: - ClassTableSchemaModifier.IsEnabled = true; - break; - } - } - - public static void DeactivateModifiers() - { - ConcreteTableSchemaModifier.IsEnabled = false; - SingleTableSchemaModifier.IsEnabled = false; - ClassTableSchemaModifier.IsEnabled = false; - } - - - // Constructors - - protected InheritanceSchemaModifier(InheritanceSchema schema) - { - Schema = schema; - } - } - - public class ClassTableSchemaModifier : InheritanceSchemaModifier - { - public static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - } - - public ClassTableSchemaModifier() - : base(InheritanceSchema.ClassTable) - { - } - } - - public class SingleTableSchemaModifier : InheritanceSchemaModifier - { - public static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - } - - public SingleTableSchemaModifier() - : base(InheritanceSchema.SingleTable) - { - } - } - - public class ConcreteTableSchemaModifier : InheritanceSchemaModifier - { - public static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - } - - public ConcreteTableSchemaModifier() - : base(InheritanceSchema.ConcreteTable) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.05 + +using System; +using Xtensive.Orm; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests +{ + public abstract class InheritanceSchemaModifier : IModule + { + protected InheritanceSchema Schema { get; private set; } + + public virtual void OnBuilt(Domain domain) + { + } + + public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + foreach (HierarchyDef hierarchy in model.Hierarchies) + hierarchy.Schema = Schema; + } + + public static void ActivateModifier(InheritanceSchema schema) + { + DeactivateModifiers(); + + switch (schema) { + case InheritanceSchema.ConcreteTable: + ConcreteTableSchemaModifier.IsEnabled = true; + break; + case InheritanceSchema.SingleTable: + SingleTableSchemaModifier.IsEnabled = true; + break; + default: + ClassTableSchemaModifier.IsEnabled = true; + break; + } + } + + public static void DeactivateModifiers() + { + ConcreteTableSchemaModifier.IsEnabled = false; + SingleTableSchemaModifier.IsEnabled = false; + ClassTableSchemaModifier.IsEnabled = false; + } + + + // Constructors + + protected InheritanceSchemaModifier(InheritanceSchema schema) + { + Schema = schema; + } + } + + public class ClassTableSchemaModifier : InheritanceSchemaModifier + { + public static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + } + + public ClassTableSchemaModifier() + : base(InheritanceSchema.ClassTable) + { + } + } + + public class SingleTableSchemaModifier : InheritanceSchemaModifier + { + public static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + } + + public SingleTableSchemaModifier() + : base(InheritanceSchema.SingleTable) + { + } + } + + public class ConcreteTableSchemaModifier : InheritanceSchemaModifier + { + public static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + } + + public ConcreteTableSchemaModifier() + : base(InheritanceSchema.ConcreteTable) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/InstanceGenerationUtils.cs b/Orm/Xtensive.Orm.Tests.Framework/InstanceGenerationUtils.cs index 09906894dc..630a5fa223 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/InstanceGenerationUtils.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/InstanceGenerationUtils.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.02.12 - -using System; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests -{ - /// - /// Helper type providing instance generation facilities. - /// - /// The type of generated items. - public static class InstanceGenerationUtils - { - /// - /// Generates the sequence of pairs of type - /// using default instance generator (see ). - /// - /// The random generator to use. - /// The item equality probability. - /// Described sequence. - public static IEnumerable> GetPairs(Random random, double equalityProbability) - { - return GetPairs(InstanceGeneratorProvider.Default.GetInstanceGenerator(), random, equalityProbability); - } - - /// - /// Generates the sequence of pairs of type - /// using specified instance generator. - /// - /// The instance generator to use. - /// The random generator to use. - /// The item equality probability. - /// Described sequence. - public static IEnumerable> GetPairs(IInstanceGenerator generator, Random random, double equalityProbability) - { - bool isValueType = typeof (T).IsValueType; - bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T)); - while (true) { - T x = generator.GetInstance(random); - if (random.NextDouble()(x, x); - } - else - yield return new Pair(x, generator.GetInstance(random)); - } - } - - /// - /// Generates the sequence of instances of type - /// using default instance generator (see ). - /// - /// The random generator to use. - /// The subsequent item equality probability. - /// Described sequence. - public static IEnumerable GetInstances(Random random, double equalityProbability) - { - return GetInstances(InstanceGeneratorProvider.Default.GetInstanceGenerator(), random, equalityProbability); - } - - /// - /// Generates the sequence of instances of type - /// using specified instance generator. - /// - /// The instance generator to use. - /// The random generator to use. - /// The subsequent item equality probability. - /// Described sequence. - public static IEnumerable GetInstances(IInstanceGenerator generator, Random random, double equalityProbability) - { - bool isValueType = typeof (T).IsValueType; - bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T)); - T x = default(T); - bool first = true; - while (true) { - if (first || random.NextDouble()>=equalityProbability) - x = generator.GetInstance(random); - else { - T y; - if (isValueType) - y = x; - else if (isCloneable) - y = (T) ((ICloneable)x).Clone(); - else - y = x; - x = y; - } - first = false; - yield return x; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.02.12 + +using System; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests +{ + /// + /// Helper type providing instance generation facilities. + /// + /// The type of generated items. + public static class InstanceGenerationUtils + { + /// + /// Generates the sequence of pairs of type + /// using default instance generator (see ). + /// + /// The random generator to use. + /// The item equality probability. + /// Described sequence. + public static IEnumerable> GetPairs(Random random, double equalityProbability) + { + return GetPairs(InstanceGeneratorProvider.Default.GetInstanceGenerator(), random, equalityProbability); + } + + /// + /// Generates the sequence of pairs of type + /// using specified instance generator. + /// + /// The instance generator to use. + /// The random generator to use. + /// The item equality probability. + /// Described sequence. + public static IEnumerable> GetPairs(IInstanceGenerator generator, Random random, double equalityProbability) + { + bool isValueType = typeof (T).IsValueType; + bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T)); + while (true) { + T x = generator.GetInstance(random); + if (random.NextDouble()(x, x); + } + else + yield return new Pair(x, generator.GetInstance(random)); + } + } + + /// + /// Generates the sequence of instances of type + /// using default instance generator (see ). + /// + /// The random generator to use. + /// The subsequent item equality probability. + /// Described sequence. + public static IEnumerable GetInstances(Random random, double equalityProbability) + { + return GetInstances(InstanceGeneratorProvider.Default.GetInstanceGenerator(), random, equalityProbability); + } + + /// + /// Generates the sequence of instances of type + /// using specified instance generator. + /// + /// The instance generator to use. + /// The random generator to use. + /// The subsequent item equality probability. + /// Described sequence. + public static IEnumerable GetInstances(IInstanceGenerator generator, Random random, double equalityProbability) + { + bool isValueType = typeof (T).IsValueType; + bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T)); + T x = default(T); + bool first = true; + while (true) { + if (first || random.NextDouble()>=equalityProbability) + x = generator.GetInstance(random); + else { + T y; + if (isValueType) + y = x; + else if (isCloneable) + y = (T) ((ICloneable)x).Clone(); + else + y = x; + x = y; + } + first = false; + yield return x; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/InstanceGeneratorProvider.cs b/Orm/Xtensive.Orm.Tests.Framework/InstanceGeneratorProvider.cs index d4fc9740ad..91e135853b 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/InstanceGeneratorProvider.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/InstanceGeneratorProvider.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.17 - -using System; -using System.Diagnostics; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.IoC; - -namespace Xtensive.Orm.Tests -{ - /// - /// Default provider. - /// Provides default instance generator for the specified type. - /// - [Serializable] - public class InstanceGeneratorProvider : AssociateProvider, IInstanceGeneratorProvider - { - private static readonly InstanceGeneratorProvider @default = new InstanceGeneratorProvider(); - private ThreadSafeDictionary generators = - ThreadSafeDictionary.Create(new object()); - - public static InstanceGeneratorProvider Default { - [DebuggerStepThrough] - get { return @default; } - } - - #region IInstanceGeneratorProvider members - - /// - public virtual IInstanceGenerator GetInstanceGenerator() - { - return GetAssociate, IInstanceGenerator>(); - } - - /// - public IInstanceGeneratorBase GetInstanceGenerator(Type type) - { - return generators.GetValue(type, - (_type, _this) => _this - .GetType() - .GetMethod("GetInstanceGenerator", ArrayUtils.EmptyArray) - .GetGenericMethodDefinition() - .MakeGenericMethod(new[] {_type}) - .Invoke(_this, null) - as IInstanceGeneratorBase, - this); - } - - #endregion - - - // Constructors - - - protected InstanceGeneratorProvider() - { - TypeSuffixes = new[] {"InstanceGenerator"}; - Type t = typeof (InstanceGeneratorProvider); - AddHighPriorityLocation(t.Assembly, t.Namespace); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.17 + +using System; +using System.Diagnostics; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.IoC; + +namespace Xtensive.Orm.Tests +{ + /// + /// Default provider. + /// Provides default instance generator for the specified type. + /// + [Serializable] + public class InstanceGeneratorProvider : AssociateProvider, IInstanceGeneratorProvider + { + private static readonly InstanceGeneratorProvider @default = new InstanceGeneratorProvider(); + private ThreadSafeDictionary generators = + ThreadSafeDictionary.Create(new object()); + + public static InstanceGeneratorProvider Default { + [DebuggerStepThrough] + get { return @default; } + } + + #region IInstanceGeneratorProvider members + + /// + public virtual IInstanceGenerator GetInstanceGenerator() + { + return GetAssociate, IInstanceGenerator>(); + } + + /// + public IInstanceGeneratorBase GetInstanceGenerator(Type type) + { + return generators.GetValue(type, + (_type, _this) => _this + .GetType() + .GetMethod("GetInstanceGenerator", ArrayUtils.EmptyArray) + .GetGenericMethodDefinition() + .MakeGenericMethod(new[] {_type}) + .Invoke(_this, null) + as IInstanceGeneratorBase, + this); + } + + #endregion + + + // Constructors + + + protected InstanceGeneratorProvider() + { + TypeSuffixes = new[] {"InstanceGenerator"}; + Type t = typeof (InstanceGeneratorProvider); + AddHighPriorityLocation(t.Assembly, t.Namespace); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGenerator.cs index 954cb88c07..7efff9b4ea 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGenerator.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.16 - -using System; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests -{ - /// - /// Generates random instances of specified type . - /// - /// Type of instances to generate. - public interface IInstanceGenerator: IInstanceGeneratorBase - { - /// - /// Gets new random instance. - /// - /// A new random instance. - new T GetInstance(Random random); - - /// - /// Gets the enumerable providing new sequence of random instances. - /// - /// A new enumerable providing new sequence of random instances. - new IEnumerable GetInstances(Random random, int? count); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.16 + +using System; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests +{ + /// + /// Generates random instances of specified type . + /// + /// Type of instances to generate. + public interface IInstanceGenerator: IInstanceGeneratorBase + { + /// + /// Gets new random instance. + /// + /// A new random instance. + new T GetInstance(Random random); + + /// + /// Gets the enumerable providing new sequence of random instances. + /// + /// A new enumerable providing new sequence of random instances. + new IEnumerable GetInstances(Random random, int? count); + } +} diff --git a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorBase.cs b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorBase.cs index 12cfed1074..756e92199e 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorBase.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorBase.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.03.07 - -using System; -using System.Collections; - -namespace Xtensive.Orm.Tests -{ - /// - /// Base interface for any instance generator supported by - /// . - /// - public interface IInstanceGeneratorBase - { - /// - /// Gets the provider this instance generator is associated with. - /// - IInstanceGeneratorProvider Provider { get; } - - /// - /// Gets new random instance. - /// - /// A new random instance. - object GetInstance(Random random); - - /// - /// Gets the enumerable providing new sequence of random instances. - /// - /// A new enumerable providing new sequence of random instances. - IEnumerable GetInstances(Random random, int? count); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.03.07 + +using System; +using System.Collections; + +namespace Xtensive.Orm.Tests +{ + /// + /// Base interface for any instance generator supported by + /// . + /// + public interface IInstanceGeneratorBase + { + /// + /// Gets the provider this instance generator is associated with. + /// + IInstanceGeneratorProvider Provider { get; } + + /// + /// Gets new random instance. + /// + /// A new random instance. + object GetInstance(Random random); + + /// + /// Gets the enumerable providing new sequence of random instances. + /// + /// A new enumerable providing new sequence of random instances. + IEnumerable GetInstances(Random random, int? count); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorProvider.cs b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorProvider.cs index 61324db0b1..5e10b3babc 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorProvider.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Interfaces/IInstanceGeneratorProvider.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.21 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// Instance generator provider. - /// - public interface IInstanceGeneratorProvider - { - /// - /// Gets for the specified type . - /// - /// Type to get the hasher for. - /// for the specified type . - IInstanceGenerator GetInstanceGenerator(); - - /// - /// Gets for the specified . - /// - /// Type to get the instance generator for. - /// for the specified . - IInstanceGeneratorBase GetInstanceGenerator(Type type); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.21 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// Instance generator provider. + /// + public interface IInstanceGeneratorProvider + { + /// + /// Gets for the specified type . + /// + /// Type to get the hasher for. + /// for the specified type . + IInstanceGenerator GetInstanceGenerator(); + + /// + /// Gets for the specified . + /// + /// Type to get the instance generator for. + /// for the specified . + IInstanceGeneratorBase GetInstanceGenerator(Type type); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/ArrayInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/ArrayInstanceGenerator.cs index 328d7ac0e8..44cc5d9604 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/ArrayInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/ArrayInstanceGenerator.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.25 - - -using System; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class KeyValuePairInstanceGenerator: WrappingInstanceGenerator, T1, T2> - { - public override KeyValuePair GetInstance(Random random) - { - return new KeyValuePair( - BaseGenerator1.GetInstance(random), - BaseGenerator2.GetInstance(random)); - } - - - // Constructors - - public KeyValuePairInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.25 + + +using System; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class KeyValuePairInstanceGenerator: WrappingInstanceGenerator, T1, T2> + { + public override KeyValuePair GetInstance(Random random) + { + return new KeyValuePair( + BaseGenerator1.GetInstance(random), + BaseGenerator2.GetInstance(random)); + } + + + // Constructors + + public KeyValuePairInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/BooleanInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/BooleanInstanceGenerator.cs index 32f76f73c2..744082c6b8 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/BooleanInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/BooleanInstanceGenerator.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class BooleanInstanceGenerator : InstanceGeneratorBase - { - public override bool GetInstance(Random random) - { - unchecked { - byte[] randomByte = {(byte)random.Next(0, 2)}; - - return BitConverter.ToBoolean(randomByte, 0); - } - } - - - // Constructors - - public BooleanInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class BooleanInstanceGenerator : InstanceGeneratorBase + { + public override bool GetInstance(Random random) + { + unchecked { + byte[] randomByte = {(byte)random.Next(0, 2)}; + + return BitConverter.ToBoolean(randomByte, 0); + } + } + + + // Constructors + + public BooleanInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/ByteInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/ByteInstanceGenerator.cs index 4068e82955..211add9df5 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/ByteInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/ByteInstanceGenerator.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class ByteInstanceGenerator : InstanceGeneratorBase - { - public override byte GetInstance(Random random) - { - return (byte)random.Next(byte.MinValue, byte.MaxValue + 1); - } - - - // Constructors - - public ByteInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class ByteInstanceGenerator : InstanceGeneratorBase + { + public override byte GetInstance(Random random) + { + return (byte)random.Next(byte.MinValue, byte.MaxValue + 1); + } + + + // Constructors + + public ByteInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/CharInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/CharInstanceGenerator.cs index 4c9c0fc2ec..07df3e2936 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/CharInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/CharInstanceGenerator.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class CharInstanceGenerator : InstanceGeneratorBase - { - public override char GetInstance(Random random) - { - char instance = (char)random.Next(char.MinValue, char.MaxValue + 1); - // Prevent surrogate characters. - while(char.IsSurrogate(instance)) { - instance = (char)random.Next(char.MinValue, char.MaxValue + 1); - } - return instance; - } - - - // Constructors - - public CharInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class CharInstanceGenerator : InstanceGeneratorBase + { + public override char GetInstance(Random random) + { + char instance = (char)random.Next(char.MinValue, char.MaxValue + 1); + // Prevent surrogate characters. + while(char.IsSurrogate(instance)) { + instance = (char)random.Next(char.MinValue, char.MaxValue + 1); + } + return instance; + } + + + // Constructors + + public CharInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/DateTimeInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/DateTimeInstanceGenerator.cs index 125b13eab1..bafd787548 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/DateTimeInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/DateTimeInstanceGenerator.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.22 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class DateTimeInstanceGenerator : InstanceGeneratorBase - { - private readonly IInstanceGenerator longInstanceGeneratorProvider; - - public override DateTime GetInstance(Random random) - { - long randomLong = long.MinValue; - // MinValue must be excluded - while (randomLong == long.MinValue) - randomLong = longInstanceGeneratorProvider.GetInstance(random); - long correctDateTime = Math.Abs(Math.Abs(randomLong) %(DateTime.MaxValue - DateTime.MinValue).Ticks + DateTime.MinValue.Ticks); - return new DateTime(correctDateTime); - - } - - - // Constructors - - public DateTimeInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - longInstanceGeneratorProvider = provider.GetInstanceGenerator(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.22 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class DateTimeInstanceGenerator : InstanceGeneratorBase + { + private readonly IInstanceGenerator longInstanceGeneratorProvider; + + public override DateTime GetInstance(Random random) + { + long randomLong = long.MinValue; + // MinValue must be excluded + while (randomLong == long.MinValue) + randomLong = longInstanceGeneratorProvider.GetInstance(random); + long correctDateTime = Math.Abs(Math.Abs(randomLong) %(DateTime.MaxValue - DateTime.MinValue).Ticks + DateTime.MinValue.Ticks); + return new DateTime(correctDateTime); + + } + + + // Constructors + + public DateTimeInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + longInstanceGeneratorProvider = provider.GetInstanceGenerator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/DecimalInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/DecimalInstanceGenerator.cs index 72ef7444cd..2111598314 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/DecimalInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/DecimalInstanceGenerator.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.24 - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class DecimalInstanceGenerator : InstanceGeneratorBase - { - public override decimal GetInstance(Random random) - { - unchecked { - return new decimal(random.Next(), random.Next(), random.Next(), - (random.Next() % 2 == 0), (byte)(random.Next() % 29)); - } - } - - - // Constructors - - public DecimalInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.24 + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class DecimalInstanceGenerator : InstanceGeneratorBase + { + public override decimal GetInstance(Random random) + { + unchecked { + return new decimal(random.Next(), random.Next(), random.Next(), + (random.Next() % 2 == 0), (byte)(random.Next() % 29)); + } + } + + + // Constructors + + public DecimalInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/DoubleInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/DoubleInstanceGenerator.cs index 7ddf4211f7..25af52d410 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/DoubleInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/DoubleInstanceGenerator.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class DoubleInstanceGenerator : InstanceGeneratorBase - { - public override double GetInstance(Random random) - { - return random.NextDouble(); - } - - - // Constructors - - public DoubleInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class DoubleInstanceGenerator : InstanceGeneratorBase + { + public override double GetInstance(Random random) + { + return random.NextDouble(); + } + + + // Constructors + + public DoubleInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/EnumInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/EnumInstanceGenerator.cs index a1e9935872..d401809c28 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/EnumInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/EnumInstanceGenerator.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.23 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class EnumInstanceGenerator : WrappingInstanceGenerator - where TEnum: struct - where TSystem: struct - { - private static readonly Array values = Enum.GetValues(typeof(TEnum)); - - public override TEnum GetInstance(Random random) - { - return (TEnum) values.GetValue(random.Next(values.Length)); - } - - - // Constructors - - public EnumInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.23 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class EnumInstanceGenerator : WrappingInstanceGenerator + where TEnum: struct + where TSystem: struct + { + private static readonly Array values = Enum.GetValues(typeof(TEnum)); + + public override TEnum GetInstance(Random random) + { + return (TEnum) values.GetValue(random.Next(values.Length)); + } + + + // Constructors + + public EnumInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/GuidInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/GuidInstanceGenerator.cs index cc236603de..7d0d3743bb 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/GuidInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/GuidInstanceGenerator.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.22 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class GuidInstanceGenerator : InstanceGeneratorBase - { - public override Guid GetInstance(Random random) - { - byte[] byteBuffer = new byte[16]; - random.NextBytes(byteBuffer); - return new Guid(byteBuffer); - } - - - // Constructors - - public GuidInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.22 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class GuidInstanceGenerator : InstanceGeneratorBase + { + public override Guid GetInstance(Random random) + { + byte[] byteBuffer = new byte[16]; + random.NextBytes(byteBuffer); + return new Guid(byteBuffer); + } + + + // Constructors + + public GuidInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/InstanceGeneratorBase.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/InstanceGeneratorBase.cs index cf685e31e3..d51ce30d34 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/InstanceGeneratorBase.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/InstanceGeneratorBase.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.21 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests -{ - /// - /// Base class for any random generator. - /// - /// Type of instances to generate. - [Serializable] - public abstract class InstanceGeneratorBase: - IInstanceGenerator - { - private IInstanceGeneratorProvider provider; - - /// - public IInstanceGeneratorProvider Provider - { - [DebuggerStepThrough] - get { return provider; } - } - - /// - public abstract T GetInstance(Random random); - - /// - public IEnumerable GetInstances(Random random, int? count) - { - for (int i = 0; !count.HasValue || i - object IInstanceGeneratorBase.GetInstance(Random random) - { - return GetInstance(random); - } - - /// - IEnumerable IInstanceGeneratorBase.GetInstances(Random random, int? count) - { - return GetInstances(random, count); - } - - #endregion - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// Instance generator provider this generator is bound to. - public InstanceGeneratorBase(IInstanceGeneratorProvider provider) - { - ArgumentValidator.EnsureArgumentNotNull(provider, "provider"); - this.provider = provider; - } - - public virtual void OnDeserialization(object sender) - { - if (provider==null || provider.GetType()==typeof (InstanceGeneratorProvider)) - provider = InstanceGeneratorProvider.Default; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.21 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests +{ + /// + /// Base class for any random generator. + /// + /// Type of instances to generate. + [Serializable] + public abstract class InstanceGeneratorBase: + IInstanceGenerator + { + private IInstanceGeneratorProvider provider; + + /// + public IInstanceGeneratorProvider Provider + { + [DebuggerStepThrough] + get { return provider; } + } + + /// + public abstract T GetInstance(Random random); + + /// + public IEnumerable GetInstances(Random random, int? count) + { + for (int i = 0; !count.HasValue || i + object IInstanceGeneratorBase.GetInstance(Random random) + { + return GetInstance(random); + } + + /// + IEnumerable IInstanceGeneratorBase.GetInstances(Random random, int? count) + { + return GetInstances(random, count); + } + + #endregion + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// Instance generator provider this generator is bound to. + public InstanceGeneratorBase(IInstanceGeneratorProvider provider) + { + ArgumentValidator.EnsureArgumentNotNull(provider, "provider"); + this.provider = provider; + } + + public virtual void OnDeserialization(object sender) + { + if (provider==null || provider.GetType()==typeof (InstanceGeneratorProvider)) + provider = InstanceGeneratorProvider.Default; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int16InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int16InstanceGenerator.cs index 64ef8198ce..c2b638adf5 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int16InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int16InstanceGenerator.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class Int16InstanceGenerator : InstanceGeneratorBase - { - public override short GetInstance(Random random) - { - return (short)random.Next(short.MinValue, short.MaxValue + 1); - } - - - // Constructors - - public Int16InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class Int16InstanceGenerator : InstanceGeneratorBase + { + public override short GetInstance(Random random) + { + return (short)random.Next(short.MinValue, short.MaxValue + 1); + } + + + // Constructors + + public Int16InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int32InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int32InstanceGenerator.cs index 9330fda47d..8c79942cb3 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int32InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int32InstanceGenerator.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class Int32InstanceGenerator : InstanceGeneratorBase - { - public override int GetInstance(Random random) - { - return random.Next(int.MinValue, int.MaxValue); - } - - - // Constructors - - public Int32InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class Int32InstanceGenerator : InstanceGeneratorBase + { + public override int GetInstance(Random random) + { + return random.Next(int.MinValue, int.MaxValue); + } + + + // Constructors + + public Int32InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int64InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int64InstanceGenerator.cs index 7c8f069ad2..5810ab70f8 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/Int64InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/Int64InstanceGenerator.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class Int64InstanceGenerator : InstanceGeneratorBase - { - public override long GetInstance(Random random) - { - byte[] byteBuffer = new byte[8]; - random.NextBytes(byteBuffer); - long result = 0; - for (int i = 0; i < 8; i++) { - result = (result << 8) | byteBuffer[i]; - } - return result; - } - - - // Constructors - - public Int64InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class Int64InstanceGenerator : InstanceGeneratorBase + { + public override long GetInstance(Random random) + { + byte[] byteBuffer = new byte[8]; + random.NextBytes(byteBuffer); + long result = 0; + for (int i = 0; i < 8; i++) { + result = (result << 8) | byteBuffer[i]; + } + return result; + } + + + // Constructors + + public Int64InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/KeyValuePairInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/KeyValuePairInstanceGenerator.cs index 104cc84d92..f8e5d0be4e 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/KeyValuePairInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/KeyValuePairInstanceGenerator.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.25 - - -using System; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class ArrayInstanceGenerator: WrappingInstanceGenerator - { - public const int ArrayLenght = 100; - - public override T[] GetInstance(Random random) - { - T[] result = new T[ArrayLenght]; - int i = 0; - foreach (T t in BaseGenerator.GetInstances(random, ArrayLenght)) { - result[i] = t; - i++; - } - return result; - } - - - // Constructors - - public ArrayInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.25 + + +using System; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class ArrayInstanceGenerator: WrappingInstanceGenerator + { + public const int ArrayLenght = 100; + + public override T[] GetInstance(Random random) + { + T[] result = new T[ArrayLenght]; + int i = 0; + foreach (T t in BaseGenerator.GetInstances(random, ArrayLenght)) { + result[i] = t; + i++; + } + return result; + } + + + // Constructors + + public ArrayInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/NullableInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/NullableInstanceGenerator.cs index db723105e0..f895aa9fef 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/NullableInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/NullableInstanceGenerator.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.23 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class NullableInstanceGenerator : WrappingInstanceGenerator - where T: struct - { - private const int nullProbabilityFactor = 100; - - public override T? GetInstance(Random random) - { - if (random.Next(nullProbabilityFactor)==0) - return default(T); - else - return BaseGenerator.GetInstance(random); - } - - - // Constructors - - public NullableInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.23 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class NullableInstanceGenerator : WrappingInstanceGenerator + where T: struct + { + private const int nullProbabilityFactor = 100; + + public override T? GetInstance(Random random) + { + if (random.Next(nullProbabilityFactor)==0) + return default(T); + else + return BaseGenerator.GetInstance(random); + } + + + // Constructors + + public NullableInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/PairInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/PairInstanceGenerator.cs index 2b30cc5190..7727f29a86 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/PairInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/PairInstanceGenerator.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.25 - - -using System; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class PairInstanceGenerator: WrappingInstanceGenerator, T1, T2> - { - public override Pair GetInstance(Random random) - { - return new Pair( - BaseGenerator1.GetInstance(random), - BaseGenerator2.GetInstance(random)); - } - - - // Constructors - - public PairInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.25 + + +using System; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class PairInstanceGenerator: WrappingInstanceGenerator, T1, T2> + { + public override Pair GetInstance(Random random) + { + return new Pair( + BaseGenerator1.GetInstance(random), + BaseGenerator2.GetInstance(random)); + } + + + // Constructors + + public PairInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/SByteInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/SByteInstanceGenerator.cs index 8d62867a9a..0d6f8c6862 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/SByteInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/SByteInstanceGenerator.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class SByteInstanceGenerator : InstanceGeneratorBase - { - private readonly IInstanceGenerator byteItemGenerator; - - public override sbyte GetInstance(Random random) - { - unchecked { - return (sbyte)byteItemGenerator.GetInstance(random); - } - } - - - // Constructors - - public SByteInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - byteItemGenerator = provider.GetInstanceGenerator(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class SByteInstanceGenerator : InstanceGeneratorBase + { + private readonly IInstanceGenerator byteItemGenerator; + + public override sbyte GetInstance(Random random) + { + unchecked { + return (sbyte)byteItemGenerator.GetInstance(random); + } + } + + + // Constructors + + public SByteInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + byteItemGenerator = provider.GetInstanceGenerator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/SingleInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/SingleInstanceGenerator.cs index 65002db533..fdbaac7554 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/SingleInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/SingleInstanceGenerator.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class SingleInstanceGenerator : InstanceGeneratorBase - { - - public override float GetInstance(Random random) - { - unchecked { - return (float)random.NextDouble(); - } - } - - - // Constructors - - public SingleInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class SingleInstanceGenerator : InstanceGeneratorBase + { + + public override float GetInstance(Random random) + { + unchecked { + return (float)random.NextDouble(); + } + } + + + // Constructors + + public SingleInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/StringInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/StringInstanceGenerator.cs index 8f44f75782..9800e7ca33 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/StringInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/StringInstanceGenerator.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.22 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class StringInstanceGenerator : InstanceGeneratorBase - { - public override string GetInstance(Random random) - { - return "Random String " + random.Next(); - } - - - // Constructors - - public StringInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.22 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class StringInstanceGenerator : InstanceGeneratorBase + { + public override string GetInstance(Random random) + { + return "Random String " + random.Next(); + } + + + // Constructors + + public StringInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/TripletInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/TripletInstanceGenerator.cs index 9eef877ea8..00ecba6a26 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/TripletInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/TripletInstanceGenerator.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.25 - - -using System; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class TripletInstanceGenerator: WrappingInstanceGenerator, T1, T2, T3> - { - public override Triplet GetInstance(Random random) - { - return new Triplet( - BaseGenerator1.GetInstance(random), - BaseGenerator2.GetInstance(random), - BaseGenerator3.GetInstance(random)); - } - - - // Constructors - - public TripletInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.25 + + +using System; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class TripletInstanceGenerator: WrappingInstanceGenerator, T1, T2, T3> + { + public override Triplet GetInstance(Random random) + { + return new Triplet( + BaseGenerator1.GetInstance(random), + BaseGenerator2.GetInstance(random), + BaseGenerator3.GetInstance(random)); + } + + + // Constructors + + public TripletInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/TupleInstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/TupleInstanceGenerator.cs index 990021f207..ff5ab8e455 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/TupleInstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/TupleInstanceGenerator.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.01.30 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class TupleInstanceGenerator : InstanceGeneratorBase - { - private static readonly Dictionary descriptors = new Dictionary(); // Descriptor - probability - private static readonly int commonProbability; - private readonly IInstanceGeneratorProvider provider; - - internal struct TupleGeneratorData - { - public IInstanceGeneratorProvider Provider; - public Tuples.Tuple Tuple; - public Random Random; - - public TupleGeneratorData(IInstanceGeneratorProvider provider, Tuples.Tuple tuple, Random random) - { - Provider = provider; - Tuple = tuple; - Random = random; - } - } - - public override Tuples.Tuple GetInstance(Random random) - { - int position = random.Next(0, commonProbability); - foreach (KeyValuePair descriptor in descriptors) { - if (position <= descriptor.Value) { - Type[] types = descriptor.Key; - Tuples.Tuple tuple = Tuples.Tuple.Create(types); - for (int i = 0; i < types.Length; i++) { - var type = types[i]; - object value = provider.GetInstanceGenerator(type).GetInstance(random); - tuple.SetValue(i, value); - } - return tuple; - } - position -= descriptor.Value; - } - Debug.Assert(false); - return null; - } - - - // Constructors - - public TupleInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - this.provider = provider; - } - - static TupleInstanceGenerator() - { -// descriptors.Add(new Type[] {typeof (int)}, 20); -// descriptors.Add(new Type[] {typeof (Guid)}, 20); - descriptors.Add(new Type[] {typeof (long), typeof(int), typeof(string), typeof(bool), typeof(decimal)}, 50); -// descriptors.Add(new Type[] {typeof (long), typeof (Guid)}, 20); -// descriptors.Add(new Type[] {typeof (long), typeof (Guid), typeof (byte)}, 10); - foreach (KeyValuePair descriptor in descriptors) - commonProbability += descriptor.Value; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.01.30 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class TupleInstanceGenerator : InstanceGeneratorBase + { + private static readonly Dictionary descriptors = new Dictionary(); // Descriptor - probability + private static readonly int commonProbability; + private readonly IInstanceGeneratorProvider provider; + + internal struct TupleGeneratorData + { + public IInstanceGeneratorProvider Provider; + public Tuples.Tuple Tuple; + public Random Random; + + public TupleGeneratorData(IInstanceGeneratorProvider provider, Tuples.Tuple tuple, Random random) + { + Provider = provider; + Tuple = tuple; + Random = random; + } + } + + public override Tuples.Tuple GetInstance(Random random) + { + int position = random.Next(0, commonProbability); + foreach (KeyValuePair descriptor in descriptors) { + if (position <= descriptor.Value) { + Type[] types = descriptor.Key; + Tuples.Tuple tuple = Tuples.Tuple.Create(types); + for (int i = 0; i < types.Length; i++) { + var type = types[i]; + object value = provider.GetInstanceGenerator(type).GetInstance(random); + tuple.SetValue(i, value); + } + return tuple; + } + position -= descriptor.Value; + } + Debug.Assert(false); + return null; + } + + + // Constructors + + public TupleInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + this.provider = provider; + } + + static TupleInstanceGenerator() + { +// descriptors.Add(new Type[] {typeof (int)}, 20); +// descriptors.Add(new Type[] {typeof (Guid)}, 20); + descriptors.Add(new Type[] {typeof (long), typeof(int), typeof(string), typeof(bool), typeof(decimal)}, 50); +// descriptors.Add(new Type[] {typeof (long), typeof (Guid)}, 20); +// descriptors.Add(new Type[] {typeof (long), typeof (Guid), typeof (byte)}, 10); + foreach (KeyValuePair descriptor in descriptors) + commonProbability += descriptor.Value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt16InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt16InstanceGenerator.cs index 3229737513..aa9573ebb1 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt16InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt16InstanceGenerator.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class UInt16InstanceGenerator : WrappingInstanceGenerator - { - public override ushort GetInstance(Random random) - { - unchecked { - return (ushort)BaseGenerator.GetInstance(random); - } - } - - - // Constructors - - public UInt16InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class UInt16InstanceGenerator : WrappingInstanceGenerator + { + public override ushort GetInstance(Random random) + { + unchecked { + return (ushort)BaseGenerator.GetInstance(random); + } + } + + + // Constructors + + public UInt16InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt32InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt32InstanceGenerator.cs index 7a9f151786..82b895543f 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt32InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt32InstanceGenerator.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class UInt32InstanceGenerator : WrappingInstanceGenerator - { - public override uint GetInstance(Random random) - { - unchecked { - return (uint)BaseGenerator.GetInstance(random); - } - } - - - // Constructors - - public UInt32InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class UInt32InstanceGenerator : WrappingInstanceGenerator + { + public override uint GetInstance(Random random) + { + unchecked { + return (uint)BaseGenerator.GetInstance(random); + } + } + + + // Constructors + + public UInt32InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt64InstanceGenerator.cs b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt64InstanceGenerator.cs index af320add36..e39c8fbdc7 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt64InstanceGenerator.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Internals/UInt64InstanceGenerator.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Roman Churakov -// Created: 2008.01.18 - - -using System; - - -namespace Xtensive.Orm.Tests -{ - [Serializable] - internal class UInt64InstanceGenerator : WrappingInstanceGenerator - { - public override ulong GetInstance(Random random) - { - unchecked { - return (ulong)BaseGenerator.GetInstance(random); - } - } - - - // Constructors - - public UInt64InstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Roman Churakov +// Created: 2008.01.18 + + +using System; + + +namespace Xtensive.Orm.Tests +{ + [Serializable] + internal class UInt64InstanceGenerator : WrappingInstanceGenerator + { + public override ulong GetInstance(Random random) + { + unchecked { + return (ulong)BaseGenerator.GetInstance(random); + } + } + + + // Constructors + + public UInt64InstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Measurement.cs b/Orm/Xtensive.Orm.Tests.Framework/Measurement.cs index 388c246d13..8509b7df26 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Measurement.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Measurement.cs @@ -1,234 +1,234 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.06.11 - -using System; -using System.Diagnostics; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests -{ - /// - /// Time and memory measurement helper. - /// - public class Measurement: IDisposable - { - private readonly MeasurementOptions options; - private readonly long initialBytesAllocated; - private readonly DateTime initialTime; - - private string name = ""; - private string fullName = ""; - private TimeSpan timeSpent; - private long memoryAllocated; - private int operationCount; - private bool isCompleted; - private bool isSuppressed; - - - public string Name - { - [DebuggerStepThrough] - get { return name; } - [DebuggerStepThrough] - set { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(value, "value"); - name = value; - UpdateFullName(); - } - } - - public string FullName { - [DebuggerStepThrough] - get { return fullName; } - [DebuggerStepThrough] - protected set { fullName = value; } - } - - public MeasurementOptions Options - { - [DebuggerStepThrough] - get { return options; } - } - - public bool IsCompleted - { - [DebuggerStepThrough] - get { return isCompleted; } - } - - public int OperationCount { - [DebuggerStepThrough] - get { return operationCount; } - [DebuggerStepThrough] - set { - operationCount = value; - UpdateFullName(); - } - } - - public TimeSpan TimeSpent { - get { - if (!isCompleted) - return HighResolutionTime.Now.Subtract(initialTime); - else - return timeSpent; - } - } - - public long MemoryAllocated { - get { - if (!isCompleted) - return GC.GetTotalMemory(false)-initialBytesAllocated; - else - return memoryAllocated; - } - } - - public virtual void Suppress() - { - isSuppressed = true; - } - - public virtual void Complete() - { - if (isSuppressed) - return; - if (isCompleted) - throw new InvalidOperationException(Strings.ExMeasurementIsAlreadyCompleted); - isCompleted = true; - timeSpent = HighResolutionTime.Now.Subtract(initialTime); - memoryAllocated = GC.GetTotalMemory((options & MeasurementOptions.CollectGarbageOnLeave)>0)-initialBytesAllocated; - if ((options & MeasurementOptions.Log)>0) { - if ((options & MeasurementOptions.LogEnter)>0) - CoreLog.Info("Measurement: Leave {0}.", this); - else - CoreLog.Info("Measurement: {0}.", this); - } - } - - protected virtual void UpdateFullName() - { - FullName = string.Format("{0} ({1})", name, operationCount); - } - - /// - public override string ToString() - { - double kmbBase = operationCount/TimeSpent.TotalSeconds; - string kmbFormat = "{0:F1}/s"; - if (kmbBase>=1000) { - kmbFormat = "{0:F3} K/s"; - kmbBase = kmbBase/1000; - } - if (kmbBase>=1000) { - kmbFormat = "{0:F3} M/s"; - kmbBase = kmbBase/1000; - } - if (kmbBase>=1000) { - kmbFormat = "{0:F3} B/s"; - kmbBase = kmbBase/1000; - } - return string.Format( - "{0}: Time: {1}ms, Memory: {2}kb{3}{4}", - FullName, TimeSpent.TotalMilliseconds, MemoryAllocated/1000.0, - operationCount!=0 ? string.Format(", Operations: "+kmbFormat, kmbBase) : "", - !isCompleted ? ", not completed yet" : ""); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - public Measurement() - : this(MeasurementOptions.Default) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The operation count. - public Measurement(int operationCount) - : this(MeasurementOptions.Default, operationCount) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement name. - public Measurement(string name) - : this(name, MeasurementOptions.Default) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement name. - /// The operation count. - public Measurement(string name, int operationCount) - : this(name, MeasurementOptions.Default, operationCount) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement options. - public Measurement(MeasurementOptions options) - : this("Unnamed", options) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement options. - /// The operation count. - public Measurement(MeasurementOptions options, int operationCount) - : this("Unnamed", options, operationCount) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement name. - /// The measurement options. - public Measurement(string name, MeasurementOptions options) - : this(name, options, 0) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The measurement name. - /// The measurement options. - /// The operation count. - public Measurement(string name, MeasurementOptions options, int operationCount) - { - this.options = options; - this.operationCount = operationCount; - Name = name; - if ((options & MeasurementOptions.LogEnter)>0) - CoreLog.Info("Measurement: Enter {0}.", FullName); - initialBytesAllocated = GC.GetTotalMemory((options & MeasurementOptions.CollectGarbageOnEnter)>0); - initialTime = HighResolutionTime.Now; - } - - // Destructors - - void IDisposable.Dispose() - { - if (!isCompleted) - Complete(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.06.11 + +using System; +using System.Diagnostics; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests +{ + /// + /// Time and memory measurement helper. + /// + public class Measurement: IDisposable + { + private readonly MeasurementOptions options; + private readonly long initialBytesAllocated; + private readonly DateTime initialTime; + + private string name = ""; + private string fullName = ""; + private TimeSpan timeSpent; + private long memoryAllocated; + private int operationCount; + private bool isCompleted; + private bool isSuppressed; + + + public string Name + { + [DebuggerStepThrough] + get { return name; } + [DebuggerStepThrough] + set { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(value, "value"); + name = value; + UpdateFullName(); + } + } + + public string FullName { + [DebuggerStepThrough] + get { return fullName; } + [DebuggerStepThrough] + protected set { fullName = value; } + } + + public MeasurementOptions Options + { + [DebuggerStepThrough] + get { return options; } + } + + public bool IsCompleted + { + [DebuggerStepThrough] + get { return isCompleted; } + } + + public int OperationCount { + [DebuggerStepThrough] + get { return operationCount; } + [DebuggerStepThrough] + set { + operationCount = value; + UpdateFullName(); + } + } + + public TimeSpan TimeSpent { + get { + if (!isCompleted) + return HighResolutionTime.Now.Subtract(initialTime); + else + return timeSpent; + } + } + + public long MemoryAllocated { + get { + if (!isCompleted) + return GC.GetTotalMemory(false)-initialBytesAllocated; + else + return memoryAllocated; + } + } + + public virtual void Suppress() + { + isSuppressed = true; + } + + public virtual void Complete() + { + if (isSuppressed) + return; + if (isCompleted) + throw new InvalidOperationException(Strings.ExMeasurementIsAlreadyCompleted); + isCompleted = true; + timeSpent = HighResolutionTime.Now.Subtract(initialTime); + memoryAllocated = GC.GetTotalMemory((options & MeasurementOptions.CollectGarbageOnLeave)>0)-initialBytesAllocated; + if ((options & MeasurementOptions.Log)>0) { + if ((options & MeasurementOptions.LogEnter)>0) + CoreLog.Info("Measurement: Leave {0}.", this); + else + CoreLog.Info("Measurement: {0}.", this); + } + } + + protected virtual void UpdateFullName() + { + FullName = string.Format("{0} ({1})", name, operationCount); + } + + /// + public override string ToString() + { + double kmbBase = operationCount/TimeSpent.TotalSeconds; + string kmbFormat = "{0:F1}/s"; + if (kmbBase>=1000) { + kmbFormat = "{0:F3} K/s"; + kmbBase = kmbBase/1000; + } + if (kmbBase>=1000) { + kmbFormat = "{0:F3} M/s"; + kmbBase = kmbBase/1000; + } + if (kmbBase>=1000) { + kmbFormat = "{0:F3} B/s"; + kmbBase = kmbBase/1000; + } + return string.Format( + "{0}: Time: {1}ms, Memory: {2}kb{3}{4}", + FullName, TimeSpent.TotalMilliseconds, MemoryAllocated/1000.0, + operationCount!=0 ? string.Format(", Operations: "+kmbFormat, kmbBase) : "", + !isCompleted ? ", not completed yet" : ""); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + public Measurement() + : this(MeasurementOptions.Default) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The operation count. + public Measurement(int operationCount) + : this(MeasurementOptions.Default, operationCount) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement name. + public Measurement(string name) + : this(name, MeasurementOptions.Default) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement name. + /// The operation count. + public Measurement(string name, int operationCount) + : this(name, MeasurementOptions.Default, operationCount) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement options. + public Measurement(MeasurementOptions options) + : this("Unnamed", options) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement options. + /// The operation count. + public Measurement(MeasurementOptions options, int operationCount) + : this("Unnamed", options, operationCount) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement name. + /// The measurement options. + public Measurement(string name, MeasurementOptions options) + : this(name, options, 0) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The measurement name. + /// The measurement options. + /// The operation count. + public Measurement(string name, MeasurementOptions options, int operationCount) + { + this.options = options; + this.operationCount = operationCount; + Name = name; + if ((options & MeasurementOptions.LogEnter)>0) + CoreLog.Info("Measurement: Enter {0}.", FullName); + initialBytesAllocated = GC.GetTotalMemory((options & MeasurementOptions.CollectGarbageOnEnter)>0); + initialTime = HighResolutionTime.Now; + } + + // Destructors + + void IDisposable.Dispose() + { + if (!isCompleted) + Complete(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/MeasurementOptions.cs b/Orm/Xtensive.Orm.Tests.Framework/MeasurementOptions.cs index 9f98ae30a5..5727bd0283 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/MeasurementOptions.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/MeasurementOptions.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.10.03 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// options. - /// - [Flags] - public enum MeasurementOptions - { - /// - /// Don't collect garbage and don't write to log. - /// - None = 0, - /// - /// Default measurement options: , , . - /// - Default = 0x103, - /// - /// Indicates whether garbage must be collected both on enter and leave. - /// - CollectGarbage = 0x3, - /// - /// Indicates whether garbage must be collected on enter. - /// - CollectGarbageOnEnter = 0x1, - /// - /// Indicates whether garbage must be collected on leave. - /// - CollectGarbageOnLeave = 0x2, - /// - /// Indicates whether measurement results must be logged. - /// - Log = 0x100, - /// - /// Indicates whether measurement start must be logged. - /// - LogEnter = 0x200, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.10.03 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// options. + /// + [Flags] + public enum MeasurementOptions + { + /// + /// Don't collect garbage and don't write to log. + /// + None = 0, + /// + /// Default measurement options: , , . + /// + Default = 0x103, + /// + /// Indicates whether garbage must be collected both on enter and leave. + /// + CollectGarbage = 0x3, + /// + /// Indicates whether garbage must be collected on enter. + /// + CollectGarbageOnEnter = 0x1, + /// + /// Indicates whether garbage must be collected on leave. + /// + CollectGarbageOnLeave = 0x2, + /// + /// Indicates whether measurement results must be logged. + /// + Log = 0x100, + /// + /// Indicates whether measurement start must be logged. + /// + LogEnter = 0x200, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Orm.config b/Orm/Xtensive.Orm.Tests.Framework/Orm.config index 85f9f2b745..f4827135a7 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Orm.config +++ b/Orm/Xtensive.Orm.Tests.Framework/Orm.config @@ -1,143 +1,143 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests.Framework/RandomManager.cs b/Orm/Xtensive.Orm.Tests.Framework/RandomManager.cs index 5d5a57818b..012c84a6f0 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/RandomManager.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/RandomManager.cs @@ -1,98 +1,98 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.09 - -using System; -using System.Diagnostics; -using System.IO; -using System.Reflection; - -namespace Xtensive.Orm.Tests -{ - /// - /// Creates random-seeded - /// generators when running tests on build server; - /// otherwise it creates the generator - /// - public static class RandomManager - { - private static bool isInitialized; - private static int globalSeedFactor = 0; - - public static Random CreateRandom() - { - return CreateRandom(0, SeedVariatorType.None); - } - - public static Random CreateRandom(int seedFactor) - { - return CreateRandom(seedFactor, SeedVariatorType.None); - } - - public static Random CreateRandom(SeedVariatorType seedVariatorType) - { - return CreateRandom(0, seedVariatorType); - } - - public static Random CreateRandom(int seedFactor, SeedVariatorType seedVariatorType) - { - EnsureInitialized(); - MethodBase caller = null; - int seed = unchecked (seedFactor + globalSeedFactor + GetSeedVariatorFactor(seedVariatorType, ref caller)); - if (DebugInfo.IsRunningOnBuildServer) { - TestLog.Info("RandomManager: Created Random has seed {0}.", seed); -#if DEBUG - if (caller==null) - caller = GetCallingMethod(); - TestLog.Info("RandomManager: Caller: {0}.{1}.", caller.DeclaringType.Name, caller.Name); -#endif - } - return new Random(seed); - } - - private static int GetSeedVariatorFactor(SeedVariatorType seedVariatorType, ref MethodBase caller) - { - if (seedVariatorType==SeedVariatorType.None) - return 0; - int seedFactor = 0; - if ((seedVariatorType & SeedVariatorType.CallingAssembly)!=0) - seedFactor += Path.GetFileName(Assembly.GetCallingAssembly().Location).GetHashCode(); - caller = null; - if ((seedVariatorType & SeedVariatorType.CallingMethod)!=0) { - if (caller==null) - caller = GetCallingMethod(); - seedFactor += caller.Name.GetHashCode(); - } - if ((seedVariatorType & SeedVariatorType.CallingMethod)!=0 || - (seedVariatorType & SeedVariatorType.CallingType)!=0) { - if (caller==null) - caller = GetCallingMethod(); - seedFactor += caller.DeclaringType.FullName.GetHashCode(); - } - if ((seedVariatorType & SeedVariatorType.Day)!=0) - seedFactor += DateTime.Today.DayOfYear; - return seedFactor; - } - - private static MethodBase GetCallingMethod() - { - StackTrace stackTrace = new StackTrace(); - for (int i = 1;; i++) { - MethodBase caller = stackTrace.GetFrame(i).GetMethod(); - if (caller.DeclaringType!=typeof (RandomManager)) - return caller; - } - } - - private static void EnsureInitialized() - { - if (isInitialized) - return; - if (!DebugInfo.IsUnitTestSessionRunning || DebugInfo.IsRunningOnBuildServer) - globalSeedFactor = unchecked ((int)DateTime.Now.Ticks); - isInitialized = true; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.09 + +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Xtensive.Orm.Tests +{ + /// + /// Creates random-seeded + /// generators when running tests on build server; + /// otherwise it creates the generator + /// + public static class RandomManager + { + private static bool isInitialized; + private static int globalSeedFactor = 0; + + public static Random CreateRandom() + { + return CreateRandom(0, SeedVariatorType.None); + } + + public static Random CreateRandom(int seedFactor) + { + return CreateRandom(seedFactor, SeedVariatorType.None); + } + + public static Random CreateRandom(SeedVariatorType seedVariatorType) + { + return CreateRandom(0, seedVariatorType); + } + + public static Random CreateRandom(int seedFactor, SeedVariatorType seedVariatorType) + { + EnsureInitialized(); + MethodBase caller = null; + int seed = unchecked (seedFactor + globalSeedFactor + GetSeedVariatorFactor(seedVariatorType, ref caller)); + if (DebugInfo.IsRunningOnBuildServer) { + TestLog.Info("RandomManager: Created Random has seed {0}.", seed); +#if DEBUG + if (caller==null) + caller = GetCallingMethod(); + TestLog.Info("RandomManager: Caller: {0}.{1}.", caller.DeclaringType.Name, caller.Name); +#endif + } + return new Random(seed); + } + + private static int GetSeedVariatorFactor(SeedVariatorType seedVariatorType, ref MethodBase caller) + { + if (seedVariatorType==SeedVariatorType.None) + return 0; + int seedFactor = 0; + if ((seedVariatorType & SeedVariatorType.CallingAssembly)!=0) + seedFactor += Path.GetFileName(Assembly.GetCallingAssembly().Location).GetHashCode(); + caller = null; + if ((seedVariatorType & SeedVariatorType.CallingMethod)!=0) { + if (caller==null) + caller = GetCallingMethod(); + seedFactor += caller.Name.GetHashCode(); + } + if ((seedVariatorType & SeedVariatorType.CallingMethod)!=0 || + (seedVariatorType & SeedVariatorType.CallingType)!=0) { + if (caller==null) + caller = GetCallingMethod(); + seedFactor += caller.DeclaringType.FullName.GetHashCode(); + } + if ((seedVariatorType & SeedVariatorType.Day)!=0) + seedFactor += DateTime.Today.DayOfYear; + return seedFactor; + } + + private static MethodBase GetCallingMethod() + { + StackTrace stackTrace = new StackTrace(); + for (int i = 1;; i++) { + MethodBase caller = stackTrace.GetFrame(i).GetMethod(); + if (caller.DeclaringType!=typeof (RandomManager)) + return caller; + } + } + + private static void EnsureInitialized() + { + if (isInitialized) + return; + if (!DebugInfo.IsUnitTestSessionRunning || DebugInfo.IsRunningOnBuildServer) + globalSeedFactor = unchecked ((int)DateTime.Now.Ticks); + isInitialized = true; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Require.cs b/Orm/Xtensive.Orm.Tests.Framework/Require.cs index 2dd8699d3e..6d5ccf2f34 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Require.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Require.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.11 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests -{ - public static class Require - { - public static void ProviderIs(StorageProvider allowedProviders, string reason = null) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckProviderIs(allowedProviders)) - IgnoreMe( - "This test requires one of the following providers: {0}", - allowedProviders.ToString().ToLowerInvariant(), reason); - } - - public static void ProviderIsNot(StorageProvider disallowedProviders, string reason = null) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckProviderIsNot(disallowedProviders)) - IgnoreMe( - "This test requires any provider except the following: {0}", - disallowedProviders.ToString().ToLowerInvariant(), reason); - } - - public static void ProviderVersionAtLeast(Version minimalVersion) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckProviderVersionIsAtLeast(minimalVersion)) - IgnoreMe("This test requires at least '{0}' version", minimalVersion); - } - - public static void ProviderVersionAtMost(Version maximalVersion) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckProviderVersionIsAtMost(maximalVersion)) - IgnoreMe("This test requires at most '{0}' version", maximalVersion); - } - - public static void AllFeaturesSupported(ProviderFeatures requiredFeatures) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckAllFeaturesSupported(requiredFeatures)) - IgnoreMe("This test requires storage that supports '{0}'", requiredFeatures); - } - - public static void AllFeaturesNotSupported(ProviderFeatures disallowedFeatures) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckAllFeaturesNotSupported(disallowedFeatures)) - IgnoreMe("This test requires storage that does not support '{0}'", disallowedFeatures); - } - - public static void AnyFeatureSupported(ProviderFeatures requiredFeatures) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckAnyFeatureSupported(requiredFeatures)) - IgnoreMe("This test requires storage that supports at least one of the '{0}' features", requiredFeatures); - } - - public static void AnyFeatureNotSupported(ProviderFeatures disallowedFeatures) - { - var info = StorageProviderInfo.Instance; - if (!info.CheckAnyFeatureNotSupported(disallowedFeatures)) - IgnoreMe("This test requires storage that does not support at least one of the '{0}' features", disallowedFeatures); - } - - private static void IgnoreMe(string format, object argument, string reason = null) - { - var message = string.Format(format, argument); - if (!string.IsNullOrEmpty(reason)) - message = string.Format("{0}. Reason: {1}", message, reason); - throw new IgnoreException(message); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.11 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests +{ + public static class Require + { + public static void ProviderIs(StorageProvider allowedProviders, string reason = null) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckProviderIs(allowedProviders)) + IgnoreMe( + "This test requires one of the following providers: {0}", + allowedProviders.ToString().ToLowerInvariant(), reason); + } + + public static void ProviderIsNot(StorageProvider disallowedProviders, string reason = null) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckProviderIsNot(disallowedProviders)) + IgnoreMe( + "This test requires any provider except the following: {0}", + disallowedProviders.ToString().ToLowerInvariant(), reason); + } + + public static void ProviderVersionAtLeast(Version minimalVersion) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckProviderVersionIsAtLeast(minimalVersion)) + IgnoreMe("This test requires at least '{0}' version", minimalVersion); + } + + public static void ProviderVersionAtMost(Version maximalVersion) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckProviderVersionIsAtMost(maximalVersion)) + IgnoreMe("This test requires at most '{0}' version", maximalVersion); + } + + public static void AllFeaturesSupported(ProviderFeatures requiredFeatures) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckAllFeaturesSupported(requiredFeatures)) + IgnoreMe("This test requires storage that supports '{0}'", requiredFeatures); + } + + public static void AllFeaturesNotSupported(ProviderFeatures disallowedFeatures) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckAllFeaturesNotSupported(disallowedFeatures)) + IgnoreMe("This test requires storage that does not support '{0}'", disallowedFeatures); + } + + public static void AnyFeatureSupported(ProviderFeatures requiredFeatures) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckAnyFeatureSupported(requiredFeatures)) + IgnoreMe("This test requires storage that supports at least one of the '{0}' features", requiredFeatures); + } + + public static void AnyFeatureNotSupported(ProviderFeatures disallowedFeatures) + { + var info = StorageProviderInfo.Instance; + if (!info.CheckAnyFeatureNotSupported(disallowedFeatures)) + IgnoreMe("This test requires storage that does not support at least one of the '{0}' features", disallowedFeatures); + } + + private static void IgnoreMe(string format, object argument, string reason = null) + { + var message = string.Format(format, argument); + if (!string.IsNullOrEmpty(reason)) + message = string.Format("{0}. Reason: {1}", message, reason); + throw new IgnoreException(message); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/RuntimeInfo.cs b/Orm/Xtensive.Orm.Tests.Framework/RuntimeInfo.cs index 5f2cd5fca1..013f9ff17d 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/RuntimeInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/RuntimeInfo.cs @@ -1,112 +1,112 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.04.17 - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; - -namespace Xtensive.Orm.Tests -{ - /// - /// Provides various runtime related information. - /// - public static class RuntimeInfo - { - private sealed class TwoPointers { - public TwoPointers Pointer1; - public TwoPointers Pointer2; - } - - private static int pointerSize; - private static int defaultStructLayoutPack; - private static int minimalObjectSize; - - /// - /// Gets the size of the pointer (reference field) in bytes. - /// - public static int PointerSize { - [DebuggerStepThrough] - get { - return pointerSize; - } - } - - /// - /// Gets default struct or class field alignment in bytes. - /// See StructLayoutAttribute.Pack for further information. - /// - public static int DefaultStructLayoutPack { - [DebuggerStepThrough] - get { - return defaultStructLayoutPack; - } - } - - /// - /// Gets the minimal size of any object in bytes. - /// - public static int MinimalObjectSize { - [DebuggerStepThrough] - get { - return minimalObjectSize; - } - } - - private static int GetDefaultStructLayoutPack() - { - int measureCount = 128; - int maxPack = 128; - int allocationToPackFactor = 4; - TwoPointers[] objects = new TwoPointers[16384]; - int[] packCounts = new int[maxPack]; - int bestPack = 0; - int bestPackCount = 0; - for (int i = 0; imaxPack) - continue; - packCounts[pack]++; - if (bestPackCountmaxPack) { - CoreLog.Warning("Suspicious RuntimeInfo.DefaultStructLayoutPack value is detected: {0}", bestPack); - bestPack = 4; - } - return bestPack; - } - - private static long GetFreeMemory() - { -// GC.Collect(); -// GC.WaitForPendingFinalizers(); -// GC.Collect(); - return GC.GetTotalMemory(false); - } - - - // Type initializer - - static RuntimeInfo() - { - pointerSize = IntPtr.Size; - minimalObjectSize = pointerSize * 3; - defaultStructLayoutPack = GetDefaultStructLayoutPack(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.04.17 + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace Xtensive.Orm.Tests +{ + /// + /// Provides various runtime related information. + /// + public static class RuntimeInfo + { + private sealed class TwoPointers { + public TwoPointers Pointer1; + public TwoPointers Pointer2; + } + + private static int pointerSize; + private static int defaultStructLayoutPack; + private static int minimalObjectSize; + + /// + /// Gets the size of the pointer (reference field) in bytes. + /// + public static int PointerSize { + [DebuggerStepThrough] + get { + return pointerSize; + } + } + + /// + /// Gets default struct or class field alignment in bytes. + /// See StructLayoutAttribute.Pack for further information. + /// + public static int DefaultStructLayoutPack { + [DebuggerStepThrough] + get { + return defaultStructLayoutPack; + } + } + + /// + /// Gets the minimal size of any object in bytes. + /// + public static int MinimalObjectSize { + [DebuggerStepThrough] + get { + return minimalObjectSize; + } + } + + private static int GetDefaultStructLayoutPack() + { + int measureCount = 128; + int maxPack = 128; + int allocationToPackFactor = 4; + TwoPointers[] objects = new TwoPointers[16384]; + int[] packCounts = new int[maxPack]; + int bestPack = 0; + int bestPackCount = 0; + for (int i = 0; imaxPack) + continue; + packCounts[pack]++; + if (bestPackCountmaxPack) { + CoreLog.Warning("Suspicious RuntimeInfo.DefaultStructLayoutPack value is detected: {0}", bestPack); + bestPack = 4; + } + return bestPack; + } + + private static long GetFreeMemory() + { +// GC.Collect(); +// GC.WaitForPendingFinalizers(); +// GC.Collect(); + return GC.GetTotalMemory(false); + } + + + // Type initializer + + static RuntimeInfo() + { + pointerSize = IntPtr.Size; + minimalObjectSize = pointerSize * 3; + defaultStructLayoutPack = GetDefaultStructLayoutPack(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/SeedVariatorType.cs b/Orm/Xtensive.Orm.Tests.Framework/SeedVariatorType.cs index 12e0e3964a..cc679d9927 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/SeedVariatorType.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/SeedVariatorType.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.09 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// Describes seed variation strategy for random sequence. - /// - [Flags] - public enum SeedVariatorType - { - /// - /// Default strategy. - /// The same as . - /// - Default = 0x0, - /// - /// No seed variation. - /// - None = 0x0, - /// - /// Seed determined by the calling type. - /// - CallingType = 0x1, - /// - /// Seed determined by the calling method. - /// - CallingMethod = 0x2, - /// - /// Seed determined by the calling assembly. - /// - CallingAssembly = 0x4, - /// - /// Seed determined by the current day (ie. truncated part of ). - /// - Day = 0x8, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.09 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// Describes seed variation strategy for random sequence. + /// + [Flags] + public enum SeedVariatorType + { + /// + /// Default strategy. + /// The same as . + /// + Default = 0x0, + /// + /// No seed variation. + /// + None = 0x0, + /// + /// Seed determined by the calling type. + /// + CallingType = 0x1, + /// + /// Seed determined by the calling method. + /// + CallingMethod = 0x2, + /// + /// Seed determined by the calling assembly. + /// + CallingAssembly = 0x4, + /// + /// Seed determined by the current day (ie. truncated part of ). + /// + Day = 0x8, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/StorageProvider.cs b/Orm/Xtensive.Orm.Tests.Framework/StorageProvider.cs index 1af28bf46c..d1e3228b11 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/StorageProvider.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/StorageProvider.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.09 - -using System; - -namespace Xtensive.Orm.Tests -{ - [Flags] - public enum StorageProvider - { - SqlServer = 0x1, - SqlServerCe = 0x2, - PostgreSql = 0x4, - Oracle = 0x8, - MySql = 0x10, - Firebird = 0x20, - Sqlite = 0x40 - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.09 + +using System; + +namespace Xtensive.Orm.Tests +{ + [Flags] + public enum StorageProvider + { + SqlServer = 0x1, + SqlServerCe = 0x2, + PostgreSql = 0x4, + Oracle = 0x8, + MySql = 0x10, + Firebird = 0x20, + Sqlite = 0x40 + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/StorageProviderInfo.cs b/Orm/Xtensive.Orm.Tests.Framework/StorageProviderInfo.cs index 7aedb0bcad..b7910be38c 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/StorageProviderInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/StorageProviderInfo.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.07.23 - -using System; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests -{ - public sealed class StorageProviderInfo - { - private static readonly object InstanceLock = new object(); - private static StorageProviderInfo InstanceValue; - - public static StorageProviderInfo Instance - { - get - { - lock (InstanceLock) { - if (InstanceValue==null) - InstanceValue = new StorageProviderInfo(); - return InstanceValue; - } - } - } - - public StorageProvider Provider { get; private set; } - - public ProviderInfo Info { get; private set; } - - public bool CheckProviderIs(StorageProvider requiredProviders) - { - return (Provider & requiredProviders)!=0; - } - - public bool CheckProviderIsNot(StorageProvider disallowedProviders) - { - return (Provider & disallowedProviders)==0; - } - - public bool CheckProviderVersionIsAtLeast(Version minimalVersion) - { - return Info.StorageVersion >= minimalVersion; - } - - public bool CheckProviderVersionIsAtMost(Version maximalVersion) - { - return Info.StorageVersion <= maximalVersion; - } - - public bool CheckAllFeaturesSupported(ProviderFeatures requiredFeatures) - { - return (Info.ProviderFeatures & requiredFeatures)==requiredFeatures; - } - - public bool CheckAllFeaturesNotSupported(ProviderFeatures disallowedFeatures) - { - return (Info.ProviderFeatures & disallowedFeatures)==0; - } - - public bool CheckAnyFeatureSupported(ProviderFeatures requiredFeatures) - { - return (Info.ProviderFeatures & requiredFeatures)!=0; - } - - public bool CheckAnyFeatureNotSupported(ProviderFeatures disallowedFeatures) - { - return (Info.ProviderFeatures & disallowedFeatures)!=disallowedFeatures; - } - - private StorageProviderInfo() - { - var config = DomainConfigurationFactory.Create(); - var providerName = config.ConnectionInfo.Provider; - - Provider = ParseProvider(providerName); - Info = ProviderInfoBuilder.Build(providerName, TestSqlDriver.Create(config.ConnectionInfo)); - } - - private static StorageProvider ParseProvider(string provider) - { - switch (provider) { - case WellKnown.Provider.SqlServer: - return StorageProvider.SqlServer; - case WellKnown.Provider.SqlServerCe: - return StorageProvider.SqlServerCe; - case WellKnown.Provider.PostgreSql: - return StorageProvider.PostgreSql; - case WellKnown.Provider.Oracle: - return StorageProvider.Oracle; - case WellKnown.Provider.MySql: - return StorageProvider.MySql; - case WellKnown.Provider.Firebird: - return StorageProvider.Firebird; - case WellKnown.Provider.Sqlite: - return StorageProvider.Sqlite; - default: - throw new ArgumentOutOfRangeException("provider"); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.07.23 + +using System; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests +{ + public sealed class StorageProviderInfo + { + private static readonly object InstanceLock = new object(); + private static StorageProviderInfo InstanceValue; + + public static StorageProviderInfo Instance + { + get + { + lock (InstanceLock) { + if (InstanceValue==null) + InstanceValue = new StorageProviderInfo(); + return InstanceValue; + } + } + } + + public StorageProvider Provider { get; private set; } + + public ProviderInfo Info { get; private set; } + + public bool CheckProviderIs(StorageProvider requiredProviders) + { + return (Provider & requiredProviders)!=0; + } + + public bool CheckProviderIsNot(StorageProvider disallowedProviders) + { + return (Provider & disallowedProviders)==0; + } + + public bool CheckProviderVersionIsAtLeast(Version minimalVersion) + { + return Info.StorageVersion >= minimalVersion; + } + + public bool CheckProviderVersionIsAtMost(Version maximalVersion) + { + return Info.StorageVersion <= maximalVersion; + } + + public bool CheckAllFeaturesSupported(ProviderFeatures requiredFeatures) + { + return (Info.ProviderFeatures & requiredFeatures)==requiredFeatures; + } + + public bool CheckAllFeaturesNotSupported(ProviderFeatures disallowedFeatures) + { + return (Info.ProviderFeatures & disallowedFeatures)==0; + } + + public bool CheckAnyFeatureSupported(ProviderFeatures requiredFeatures) + { + return (Info.ProviderFeatures & requiredFeatures)!=0; + } + + public bool CheckAnyFeatureNotSupported(ProviderFeatures disallowedFeatures) + { + return (Info.ProviderFeatures & disallowedFeatures)!=disallowedFeatures; + } + + private StorageProviderInfo() + { + var config = DomainConfigurationFactory.Create(); + var providerName = config.ConnectionInfo.Provider; + + Provider = ParseProvider(providerName); + Info = ProviderInfoBuilder.Build(providerName, TestSqlDriver.Create(config.ConnectionInfo)); + } + + private static StorageProvider ParseProvider(string provider) + { + switch (provider) { + case WellKnown.Provider.SqlServer: + return StorageProvider.SqlServer; + case WellKnown.Provider.SqlServerCe: + return StorageProvider.SqlServerCe; + case WellKnown.Provider.PostgreSql: + return StorageProvider.PostgreSql; + case WellKnown.Provider.Oracle: + return StorageProvider.Oracle; + case WellKnown.Provider.MySql: + return StorageProvider.MySql; + case WellKnown.Provider.Firebird: + return StorageProvider.Firebird; + case WellKnown.Provider.Sqlite: + return StorageProvider.Sqlite; + default: + throw new ArgumentOutOfRangeException("provider"); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/StorageProviderVersion.cs b/Orm/Xtensive.Orm.Tests.Framework/StorageProviderVersion.cs index 15913d5a5d..d04b4445e4 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/StorageProviderVersion.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/StorageProviderVersion.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.11 - -using System; - -namespace Xtensive.Orm.Tests -{ - public static class StorageProviderVersion - { - public static Version SqlServer2005 = new Version(9, 0); - public static Version SqlServer2008 = new Version(10, 0); - public static Version SqlServer2008R2 = new Version(10, 50); - public static Version SqlServer2012 = new Version(11, 0); - - public static Version Oracle09 = new Version(9, 0); - public static Version Oracle10 = new Version(10, 0); - public static Version Oracle11 = new Version(11, 0); - - public static Version PostgreSql80 = new Version(8, 0); - public static Version PostgreSql81 = new Version(8, 1); - public static Version PostgreSql82 = new Version(8, 2); - public static Version PostgreSql83 = new Version(8, 3); - public static Version PostgreSql84 = new Version(8, 4); - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.11 + +using System; + +namespace Xtensive.Orm.Tests +{ + public static class StorageProviderVersion + { + public static Version SqlServer2005 = new Version(9, 0); + public static Version SqlServer2008 = new Version(10, 0); + public static Version SqlServer2008R2 = new Version(10, 50); + public static Version SqlServer2012 = new Version(11, 0); + + public static Version Oracle09 = new Version(9, 0); + public static Version Oracle10 = new Version(10, 0); + public static Version Oracle11 = new Version(11, 0); + + public static Version PostgreSql80 = new Version(8, 0); + public static Version PostgreSql81 = new Version(8, 1); + public static Version PostgreSql82 = new Version(8, 2); + public static Version PostgreSql83 = new Version(8, 3); + public static Version PostgreSql84 = new Version(8, 4); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/StorageTestHelper.cs b/Orm/Xtensive.Orm.Tests.Framework/StorageTestHelper.cs index be31df09dd..24e0aae801 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/StorageTestHelper.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/StorageTestHelper.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.17 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests -{ - public static class StorageTestHelper - { - public static bool IsFetched(Session session, Key key) - { - EntityState dummy; - return session.EntityStateCache.TryGetItem(key, false, out dummy); - } - - public static object GetNativeTransaction() - { - var handler = Session.Demand().Handler; - var sqlHandler = handler as SqlSessionHandler; - if (sqlHandler!=null) - return sqlHandler.Connection.ActiveTransaction; - throw new NotSupportedException(); - } - - public static ModelMapping GetDefaultModelMapping(Domain domain) - { - return domain.Handlers.StorageNodeRegistry.Get(WellKnown.DefaultNodeId).Mapping; - } - - public static Schema GetDefaultSchema(Domain domain) - { - var mapping = GetDefaultModelMapping(domain); - return mapping[domain.Model.Types[typeof (Metadata.Assembly)]].Schema; - } - - public static void DemandSchemas(ConnectionInfo connectionInfo, params string[] schemas) - { - var driver = TestSqlDriver.Create(connectionInfo); - using (var connection = driver.CreateConnection()) { - connection.Open(); - - var extractionTask = new SqlExtractionTask(driver.CoreServerInfo.DatabaseName); - var extractionResult = driver.Extract(connection, new[] {extractionTask}); - var catalog = extractionResult.Catalogs.Single(); - var existingSchemas = catalog.Schemas.Select(s => s.Name); - var schemasToCreate = schemas.Except(existingSchemas, StringComparer.OrdinalIgnoreCase); - - // Oracle does not support creating schemas, user should be created instead. - if (connectionInfo.Provider==WellKnown.Provider.Oracle) - CreateUsers(connection, schemasToCreate); - else - CreateSchemas(connection, catalog, schemasToCreate); - - connection.Close(); - } - } - - private static void CreateUsers(SqlConnection connection, IEnumerable schemasToCreate) - { - var translator = connection.Driver.Translator; - foreach (var schema in schemasToCreate) { - var userName = translator.QuoteIdentifier(schema); - var password = schema; - ExecuteQuery(connection, string.Format("create user {0} identified by {1}", userName, password)); - ExecuteQuery(connection, string.Format("alter user {0} quota unlimited on system", userName)); - } - } - - private static void CreateSchemas(SqlConnection connection, Catalog catalog, IEnumerable schemasToCreate) - { - foreach (var schema in schemasToCreate) { - ExecuteQuery(connection, SqlDdl.Create(catalog.CreateSchema(schema))); - } - } - - private static void ExecuteQuery(SqlConnection connection, ISqlCompileUnit query) - { - using (var command = connection.CreateCommand(query)) - command.ExecuteNonQuery(); - } - - private static void ExecuteQuery(SqlConnection connection, string query) - { - using (var command = connection.CreateCommand(query)) - command.ExecuteNonQuery(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.17 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests +{ + public static class StorageTestHelper + { + public static bool IsFetched(Session session, Key key) + { + EntityState dummy; + return session.EntityStateCache.TryGetItem(key, false, out dummy); + } + + public static object GetNativeTransaction() + { + var handler = Session.Demand().Handler; + var sqlHandler = handler as SqlSessionHandler; + if (sqlHandler!=null) + return sqlHandler.Connection.ActiveTransaction; + throw new NotSupportedException(); + } + + public static ModelMapping GetDefaultModelMapping(Domain domain) + { + return domain.Handlers.StorageNodeRegistry.Get(WellKnown.DefaultNodeId).Mapping; + } + + public static Schema GetDefaultSchema(Domain domain) + { + var mapping = GetDefaultModelMapping(domain); + return mapping[domain.Model.Types[typeof (Metadata.Assembly)]].Schema; + } + + public static void DemandSchemas(ConnectionInfo connectionInfo, params string[] schemas) + { + var driver = TestSqlDriver.Create(connectionInfo); + using (var connection = driver.CreateConnection()) { + connection.Open(); + + var extractionTask = new SqlExtractionTask(driver.CoreServerInfo.DatabaseName); + var extractionResult = driver.Extract(connection, new[] {extractionTask}); + var catalog = extractionResult.Catalogs.Single(); + var existingSchemas = catalog.Schemas.Select(s => s.Name); + var schemasToCreate = schemas.Except(existingSchemas, StringComparer.OrdinalIgnoreCase); + + // Oracle does not support creating schemas, user should be created instead. + if (connectionInfo.Provider==WellKnown.Provider.Oracle) + CreateUsers(connection, schemasToCreate); + else + CreateSchemas(connection, catalog, schemasToCreate); + + connection.Close(); + } + } + + private static void CreateUsers(SqlConnection connection, IEnumerable schemasToCreate) + { + var translator = connection.Driver.Translator; + foreach (var schema in schemasToCreate) { + var userName = translator.QuoteIdentifier(schema); + var password = schema; + ExecuteQuery(connection, string.Format("create user {0} identified by {1}", userName, password)); + ExecuteQuery(connection, string.Format("alter user {0} quota unlimited on system", userName)); + } + } + + private static void CreateSchemas(SqlConnection connection, Catalog catalog, IEnumerable schemasToCreate) + { + foreach (var schema in schemasToCreate) { + ExecuteQuery(connection, SqlDdl.Create(catalog.CreateSchema(schema))); + } + } + + private static void ExecuteQuery(SqlConnection connection, ISqlCompileUnit query) + { + using (var command = connection.CreateCommand(query)) + command.ExecuteNonQuery(); + } + + private static void ExecuteQuery(SqlConnection connection, string query) + { + using (var command = connection.CreateCommand(query)) + command.ExecuteNonQuery(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TestConfiguration.cs b/Orm/Xtensive.Orm.Tests.Framework/TestConfiguration.cs index ca08cb52f4..835f0088d5 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TestConfiguration.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TestConfiguration.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.11 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Xtensive.Orm.Tests -{ - public sealed class TestConfiguration - { - private const string StorageKey = "DO_STORAGE"; - private const string StorageFileKey = "DO_STORAGE_FILE"; - private const string ConfigurationFileKey = "DO_CONFIG_FILE"; - - private const string DefaultStorage = "default"; - - private static readonly object InstanceLock = new object(); - private static TestConfiguration InstanceValue; - - private readonly Dictionary configuration; - - public static TestConfiguration Instance - { - get - { - lock (InstanceLock) { - if (InstanceValue==null) - InstanceValue = new TestConfiguration(); - return InstanceValue; - } - } - } - - public string Storage { get; private set; } - - public ConnectionInfo GetConnectionInfo(string name) - { - var value = GetConfigurationVariable(name); - if (value==null) - return null; - - if (!value.StartsWith("[")) - return new ConnectionInfo(value); - - var items = value.Split(new[] {'[', ']'}, StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToArray(); - if (items.Length!=2) - throw new InvalidOperationException(string.Format("Invalid connection string format: {0}", value)); - return new ConnectionInfo(items[0], items[1]); - } - - private string GetEnvironmentVariable(string key) - { - return new[] {EnvironmentVariableTarget.Process, EnvironmentVariableTarget.User, EnvironmentVariableTarget.Machine} - .Select(target => Environment.GetEnvironmentVariable(key, target)) - .FirstOrDefault(result => !string.IsNullOrEmpty(result)); - } - - private string GetConfigurationVariable(string key) - { - string result; - if (configuration.TryGetValue(key, out result) && !string.IsNullOrEmpty(result)) - return result; - return null; - } - - private static Dictionary ParseConfigurationFile(string file) - { - var entries = - from line in File.ReadAllLines(file) - let items = line.Trim().Split(new[] {'='}, 2) - where items.Length==2 - let key = items[0].Trim() - let value = items[1].Trim() - where key!=string.Empty && value!=string.Empty - select new {key, value}; - return entries.ToDictionary(i => i.key, i => i.value); - } - - private Dictionary LoadConfiguration() - { - var configurationFile = GetEnvironmentVariable(ConfigurationFileKey); - if (configurationFile!=null && File.Exists(configurationFile)) - return ParseConfigurationFile(configurationFile); - return new Dictionary(); - } - - private string GetStorageFromFile() - { - var storageFile = GetEnvironmentVariable(StorageFileKey); - if (storageFile!=null && File.Exists(storageFile)) - return File.ReadAllLines(storageFile).Select(l => l.Trim()).FirstOrDefault(l => !string.IsNullOrEmpty(l)); - return null; - } - - private TestConfiguration() - { - configuration = LoadConfiguration(); - Storage = GetEnvironmentVariable(StorageKey) ?? GetStorageFromFile() ?? DefaultStorage; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.11 + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Xtensive.Orm.Tests +{ + public sealed class TestConfiguration + { + private const string StorageKey = "DO_STORAGE"; + private const string StorageFileKey = "DO_STORAGE_FILE"; + private const string ConfigurationFileKey = "DO_CONFIG_FILE"; + + private const string DefaultStorage = "default"; + + private static readonly object InstanceLock = new object(); + private static TestConfiguration InstanceValue; + + private readonly Dictionary configuration; + + public static TestConfiguration Instance + { + get + { + lock (InstanceLock) { + if (InstanceValue==null) + InstanceValue = new TestConfiguration(); + return InstanceValue; + } + } + } + + public string Storage { get; private set; } + + public ConnectionInfo GetConnectionInfo(string name) + { + var value = GetConfigurationVariable(name); + if (value==null) + return null; + + if (!value.StartsWith("[")) + return new ConnectionInfo(value); + + var items = value.Split(new[] {'[', ']'}, StringSplitOptions.RemoveEmptyEntries).Select(i => i.Trim()).ToArray(); + if (items.Length!=2) + throw new InvalidOperationException(string.Format("Invalid connection string format: {0}", value)); + return new ConnectionInfo(items[0], items[1]); + } + + private string GetEnvironmentVariable(string key) + { + return new[] {EnvironmentVariableTarget.Process, EnvironmentVariableTarget.User, EnvironmentVariableTarget.Machine} + .Select(target => Environment.GetEnvironmentVariable(key, target)) + .FirstOrDefault(result => !string.IsNullOrEmpty(result)); + } + + private string GetConfigurationVariable(string key) + { + string result; + if (configuration.TryGetValue(key, out result) && !string.IsNullOrEmpty(result)) + return result; + return null; + } + + private static Dictionary ParseConfigurationFile(string file) + { + var entries = + from line in File.ReadAllLines(file) + let items = line.Trim().Split(new[] {'='}, 2) + where items.Length==2 + let key = items[0].Trim() + let value = items[1].Trim() + where key!=string.Empty && value!=string.Empty + select new {key, value}; + return entries.ToDictionary(i => i.key, i => i.value); + } + + private Dictionary LoadConfiguration() + { + var configurationFile = GetEnvironmentVariable(ConfigurationFileKey); + if (configurationFile!=null && File.Exists(configurationFile)) + return ParseConfigurationFile(configurationFile); + return new Dictionary(); + } + + private string GetStorageFromFile() + { + var storageFile = GetEnvironmentVariable(StorageFileKey); + if (storageFile!=null && File.Exists(storageFile)) + return File.ReadAllLines(storageFile).Select(l => l.Trim()).FirstOrDefault(l => !string.IsNullOrEmpty(l)); + return null; + } + + private TestConfiguration() + { + configuration = LoadConfiguration(); + Storage = GetEnvironmentVariable(StorageKey) ?? GetStorageFromFile() ?? DefaultStorage; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TestHelper.cs b/Orm/Xtensive.Orm.Tests.Framework/TestHelper.cs index 236e628105..a5a72b6f61 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TestHelper.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TestHelper.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.02.09 - -using System; -using System.Threading; - -namespace Xtensive.Orm.Tests -{ - /// - /// Test helper class. - /// - public static class TestHelper - { - /// - /// Ensures full garbage collection. - /// - public static void CollectGarbage() - { - CollectGarbage(TestInfo.IsPerformanceTestRunning); - } - - /// - /// Ensures full garbage collection. - /// - /// Full rather then fast collection should be performed. - public static void CollectGarbage(bool preferFullRatherThanFast) - { - int baseSleepTime = 1; - if (preferFullRatherThanFast) - baseSleepTime = 100; - - for (int i = 0; i<5; i++) { - Thread.Sleep(baseSleepTime); - GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); - GC.WaitForPendingFinalizers(); - } - } - - public static System.Configuration.Configuration GetConfigurationForAssembly(this Type typeFromAssembly) - { - return typeFromAssembly.Assembly.GetAssemblyConfiguration(); - } - - public static System.Configuration.Configuration GetConfigurationForAssembly(this object instanceOfTypeFromAssembly) - { - return instanceOfTypeFromAssembly.GetType().Assembly.GetAssemblyConfiguration(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.02.09 + +using System; +using System.Threading; + +namespace Xtensive.Orm.Tests +{ + /// + /// Test helper class. + /// + public static class TestHelper + { + /// + /// Ensures full garbage collection. + /// + public static void CollectGarbage() + { + CollectGarbage(TestInfo.IsPerformanceTestRunning); + } + + /// + /// Ensures full garbage collection. + /// + /// Full rather then fast collection should be performed. + public static void CollectGarbage(bool preferFullRatherThanFast) + { + int baseSleepTime = 1; + if (preferFullRatherThanFast) + baseSleepTime = 100; + + for (int i = 0; i<5; i++) { + Thread.Sleep(baseSleepTime); + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + GC.WaitForPendingFinalizers(); + } + } + + public static System.Configuration.Configuration GetConfigurationForAssembly(this Type typeFromAssembly) + { + return typeFromAssembly.Assembly.GetAssemblyConfiguration(); + } + + public static System.Configuration.Configuration GetConfigurationForAssembly(this object instanceOfTypeFromAssembly) + { + return instanceOfTypeFromAssembly.GetType().Assembly.GetAssemblyConfiguration(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TestInfo.cs b/Orm/Xtensive.Orm.Tests.Framework/TestInfo.cs index 6f43b5adba..799b54c27d 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TestInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TestInfo.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.02.09 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Reflection; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests -{ - /// - /// Provides various info related to the current test. - /// - public static class TestInfo - { - /// - /// , if performance test is running (i.e. a test with - /// "Performance" category). - /// - /// - /// Currently only NUnit tests are recognized. - /// - public static bool IsPerformanceTestRunning - { - get - { - foreach (CategoryAttribute attribute in GetMethodAttributes()) - if (attribute.Name=="Performance") - return true; - - return false; - } - } - - /// - /// , if performance test is running (i.e. a test with - /// "Performance" category). - /// - /// - /// Currently only NUnit tests are recognized. - /// - public static bool IsProfileTestRunning - { - get - { - foreach (CategoryAttribute attribute in GetMethodAttributes()) - if (attribute.Name=="Profile") - return true; - - return false; - } - } - - /// - /// Gets a value indicating whether test is running under build server. - /// - public static bool IsBuildServer { - get { - return Environment.GetEnvironmentVariable("TEAMCITY_VERSION")!=null; - } - } - - private static IEnumerable GetMethodAttributes() where T : Attribute - { - StackFrame[] stackFrames = new StackTrace().GetFrames(); - foreach (StackFrame frame in stackFrames) { - MethodBase method = frame.GetMethod(); - // , , CategoryAttribute? - Attribute[] methodAttributes = Attribute.GetCustomAttributes(method, typeof (TestAttribute), false); - if (methodAttributes==null || methodAttributes.Length==0) - continue; - methodAttributes = Attribute.GetCustomAttributes(method, typeof (T), false); - for (int i = 0; i < methodAttributes.Length; i++) - yield return (T) methodAttributes[i]; - } - yield break; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.02.09 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests +{ + /// + /// Provides various info related to the current test. + /// + public static class TestInfo + { + /// + /// , if performance test is running (i.e. a test with + /// "Performance" category). + /// + /// + /// Currently only NUnit tests are recognized. + /// + public static bool IsPerformanceTestRunning + { + get + { + foreach (CategoryAttribute attribute in GetMethodAttributes()) + if (attribute.Name=="Performance") + return true; + + return false; + } + } + + /// + /// , if performance test is running (i.e. a test with + /// "Performance" category). + /// + /// + /// Currently only NUnit tests are recognized. + /// + public static bool IsProfileTestRunning + { + get + { + foreach (CategoryAttribute attribute in GetMethodAttributes()) + if (attribute.Name=="Profile") + return true; + + return false; + } + } + + /// + /// Gets a value indicating whether test is running under build server. + /// + public static bool IsBuildServer { + get { + return Environment.GetEnvironmentVariable("TEAMCITY_VERSION")!=null; + } + } + + private static IEnumerable GetMethodAttributes() where T : Attribute + { + StackFrame[] stackFrames = new StackTrace().GetFrames(); + foreach (StackFrame frame in stackFrames) { + MethodBase method = frame.GetMethod(); + // , , CategoryAttribute? + Attribute[] methodAttributes = Attribute.GetCustomAttributes(method, typeof (TestAttribute), false); + if (methodAttributes==null || methodAttributes.Length==0) + continue; + methodAttributes = Attribute.GetCustomAttributes(method, typeof (T), false); + for (int i = 0; i < methodAttributes.Length; i++) + yield return (T) methodAttributes[i]; + } + yield break; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TestSqlDriver.cs b/Orm/Xtensive.Orm.Tests.Framework/TestSqlDriver.cs index 0d1f428c26..ad793b3d96 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TestSqlDriver.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TestSqlDriver.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.04 - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Orm.Building.Builders; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests -{ - public static class TestSqlDriver - { - private static readonly Dictionary FactoryCache = new Dictionary(); - - public static SqlDriver Create(UrlInfo connectionUrl) - { - ArgumentValidator.EnsureArgumentNotNull(connectionUrl, "connectionUrl"); - return BuildDriver(new ConnectionInfo(connectionUrl)); - } - - public static SqlDriver Create(string connectionUrl) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl, "connectionUrl"); - return BuildDriver(new ConnectionInfo(connectionUrl)); - } - - public static SqlDriver Create(string provider, string connectionString) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(provider, "provider"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionString, "connectionString"); - return BuildDriver(new ConnectionInfo(provider, connectionString)); - } - - public static SqlDriver Create(ConnectionInfo connectionInfo) - { - ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); - return BuildDriver(connectionInfo); - } - - private static SqlDriver BuildDriver(ConnectionInfo connectionInfo) - { - return GetFactory(connectionInfo.Provider).GetDriver(connectionInfo); - } - - private static SqlDriverFactory GetFactory(string provider) - { - lock (FactoryCache) { - SqlDriverFactory factory; - if (!FactoryCache.TryGetValue(provider, out factory)) { - var descriptor = ProviderDescriptor.Get(provider); - factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); - FactoryCache.Add(provider, factory); - } - return factory; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.04 + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Orm.Building.Builders; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests +{ + public static class TestSqlDriver + { + private static readonly Dictionary FactoryCache = new Dictionary(); + + public static SqlDriver Create(UrlInfo connectionUrl) + { + ArgumentValidator.EnsureArgumentNotNull(connectionUrl, "connectionUrl"); + return BuildDriver(new ConnectionInfo(connectionUrl)); + } + + public static SqlDriver Create(string connectionUrl) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionUrl, "connectionUrl"); + return BuildDriver(new ConnectionInfo(connectionUrl)); + } + + public static SqlDriver Create(string provider, string connectionString) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(provider, "provider"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(connectionString, "connectionString"); + return BuildDriver(new ConnectionInfo(provider, connectionString)); + } + + public static SqlDriver Create(ConnectionInfo connectionInfo) + { + ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); + return BuildDriver(connectionInfo); + } + + private static SqlDriver BuildDriver(ConnectionInfo connectionInfo) + { + return GetFactory(connectionInfo.Provider).GetDriver(connectionInfo); + } + + private static SqlDriverFactory GetFactory(string provider) + { + lock (FactoryCache) { + SqlDriverFactory factory; + if (!FactoryCache.TryGetValue(provider, out factory)) { + var descriptor = ProviderDescriptor.Get(provider); + factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); + FactoryCache.Add(provider, factory); + } + return factory; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TypeIdBehavior.cs b/Orm/Xtensive.Orm.Tests.Framework/TypeIdBehavior.cs index 9fd7c7b19c..00576af9cd 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TypeIdBehavior.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TypeIdBehavior.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.05 - -namespace Xtensive.Orm.Tests -{ - public enum TypeIdBehavior - { - Default = AsIs, - AsIs = 0, - Include = 1, - Exclude = 2, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.05 + +namespace Xtensive.Orm.Tests +{ + public enum TypeIdBehavior + { + Default = AsIs, + AsIs = 0, + Include = 1, + Exclude = 2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/TypeIdModifier.cs b/Orm/Xtensive.Orm.Tests.Framework/TypeIdModifier.cs index 5612f284d3..22e5b06fb9 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/TypeIdModifier.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/TypeIdModifier.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.05 - -using System; -using Xtensive.Orm; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests -{ - public class TypeIdModifier : IModule - { - public static bool IsEnabled; - - protected KeyField TypeIdField { get; private set; } - - public virtual void OnBuilt(Domain domain) - {} - - public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - TypeIdField = new KeyField(WellKnown.TypeIdFieldName); - } - - public static void ActivateModifier(TypeIdBehavior typeIdBehavior) - { - IncludeTypeIdModifier.IsEnabled = false; - ExcludeTypeIdModifier.IsEnabled = false; - IsEnabled = false; - - switch (typeIdBehavior) { - case TypeIdBehavior.Include: - IncludeTypeIdModifier.IsEnabled = true; - break; - case TypeIdBehavior.Exclude: - ExcludeTypeIdModifier.IsEnabled = true; - break; - default: - IsEnabled = true; - break; - } - } - } - - public class IncludeTypeIdModifier : TypeIdModifier - { - public new static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - foreach (HierarchyDef hierarchy in model.Hierarchies) - hierarchy.IncludeTypeId = true; - } - } - - public class ExcludeTypeIdModifier : TypeIdModifier - { - public new static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - foreach (HierarchyDef hierarchy in model.Hierarchies) { - hierarchy.IncludeTypeId = false; - if (hierarchy.KeyFields.Contains(TypeIdField)) - hierarchy.KeyFields.Remove(TypeIdField); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.05 + +using System; +using Xtensive.Orm; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests +{ + public class TypeIdModifier : IModule + { + public static bool IsEnabled; + + protected KeyField TypeIdField { get; private set; } + + public virtual void OnBuilt(Domain domain) + {} + + public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + TypeIdField = new KeyField(WellKnown.TypeIdFieldName); + } + + public static void ActivateModifier(TypeIdBehavior typeIdBehavior) + { + IncludeTypeIdModifier.IsEnabled = false; + ExcludeTypeIdModifier.IsEnabled = false; + IsEnabled = false; + + switch (typeIdBehavior) { + case TypeIdBehavior.Include: + IncludeTypeIdModifier.IsEnabled = true; + break; + case TypeIdBehavior.Exclude: + ExcludeTypeIdModifier.IsEnabled = true; + break; + default: + IsEnabled = true; + break; + } + } + } + + public class IncludeTypeIdModifier : TypeIdModifier + { + public new static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + foreach (HierarchyDef hierarchy in model.Hierarchies) + hierarchy.IncludeTypeId = true; + } + } + + public class ExcludeTypeIdModifier : TypeIdModifier + { + public new static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + foreach (HierarchyDef hierarchy in model.Hierarchies) { + hierarchy.IncludeTypeId = false; + if (hierarchy.KeyFields.Contains(TypeIdField)) + hierarchy.KeyFields.Remove(TypeIdField); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2, TBase3}.cs b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2, TBase3}.cs index 5da42f06c9..40747900a8 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2, TBase3}.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2, TBase3}.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.21 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// Base class for any wrapping s. - /// - /// The type to generate random instances for. - /// First base (wrapped) type. - /// Second base (wrapped) type. - /// Third base (wrapped) type. - [Serializable] - public abstract class WrappingInstanceGenerator : InstanceGeneratorBase - { - /// - /// Generator for the first base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator1; - - /// - /// Generator for the second base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator2; - - /// - /// Generator for the third base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator3; - - - // Constructors - - /// - /// - /// - /// Instance generator provider this generator is bound to. - public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - BaseGenerator1 = provider.GetInstanceGenerator(); - BaseGenerator2 = provider.GetInstanceGenerator(); - BaseGenerator3 = provider.GetInstanceGenerator(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.21 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// Base class for any wrapping s. + /// + /// The type to generate random instances for. + /// First base (wrapped) type. + /// Second base (wrapped) type. + /// Third base (wrapped) type. + [Serializable] + public abstract class WrappingInstanceGenerator : InstanceGeneratorBase + { + /// + /// Generator for the first base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator1; + + /// + /// Generator for the second base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator2; + + /// + /// Generator for the third base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator3; + + + // Constructors + + /// + /// + /// + /// Instance generator provider this generator is bound to. + public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + BaseGenerator1 = provider.GetInstanceGenerator(); + BaseGenerator2 = provider.GetInstanceGenerator(); + BaseGenerator3 = provider.GetInstanceGenerator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2}.cs b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2}.cs index b552737d64..2c9fdd6537 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2}.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase1,TBase2}.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.21 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// Base class for any wrapping s. - /// - /// The type to generate random instances for. - /// First base (wrapped) type. - /// Second base (wrapped) type. - [Serializable] - public abstract class WrappingInstanceGenerator : InstanceGeneratorBase - { - /// - /// Generator for the first base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator1; - - /// - /// Generator for the first base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator2; - - - // Constructors - - /// - /// - /// - /// Instance generator provider this generator is bound to. - public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - BaseGenerator1 = provider.GetInstanceGenerator(); - BaseGenerator2 = provider.GetInstanceGenerator(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.21 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// Base class for any wrapping s. + /// + /// The type to generate random instances for. + /// First base (wrapped) type. + /// Second base (wrapped) type. + [Serializable] + public abstract class WrappingInstanceGenerator : InstanceGeneratorBase + { + /// + /// Generator for the first base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator1; + + /// + /// Generator for the first base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator2; + + + // Constructors + + /// + /// + /// + /// Instance generator provider this generator is bound to. + public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + BaseGenerator1 = provider.GetInstanceGenerator(); + BaseGenerator2 = provider.GetInstanceGenerator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase}.cs b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase}.cs index c846e93ac2..40529e185d 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase}.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/WrappingInstanceGenerator{T,TBase}.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.21 - -using System; - -namespace Xtensive.Orm.Tests -{ - /// - /// Base class for any wrapping s. - /// - /// The type to generate random instances for. - /// Base (wrapped) type. - [Serializable] - public abstract class WrappingInstanceGenerator : InstanceGeneratorBase - { - /// - /// Generator for base (wrapped) type. - /// - protected readonly IInstanceGenerator BaseGenerator; - - - // Constructors - - /// - /// - /// - /// Instance generator provider this generator is bound to. - public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) - : base(provider) - { - BaseGenerator = provider.GetInstanceGenerator(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.21 + +using System; + +namespace Xtensive.Orm.Tests +{ + /// + /// Base class for any wrapping s. + /// + /// The type to generate random instances for. + /// Base (wrapped) type. + [Serializable] + public abstract class WrappingInstanceGenerator : InstanceGeneratorBase + { + /// + /// Generator for base (wrapped) type. + /// + protected readonly IInstanceGenerator BaseGenerator; + + + // Constructors + + /// + /// + /// + /// Instance generator provider this generator is bound to. + public WrappingInstanceGenerator(IInstanceGeneratorProvider provider) + : base(provider) + { + BaseGenerator = provider.GetInstanceGenerator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Framework/Xtensive.Orm.Tests.Framework.csproj b/Orm/Xtensive.Orm.Tests.Framework/Xtensive.Orm.Tests.Framework.csproj index aa1ff472c3..2c9000c69f 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Xtensive.Orm.Tests.Framework.csproj +++ b/Orm/Xtensive.Orm.Tests.Framework/Xtensive.Orm.Tests.Framework.csproj @@ -1,47 +1,47 @@ - - - true - false - ..\..\_Build\$(Configuration)\lib\ - TRACE;NETSTANDARD - - - netstandard2.0 - Xtensive - true - ..\Orm.snk - true - 2 - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - - - - PreserveNewest - - + + + true + false + ..\..\_Build\$(Configuration)\lib\ + TRACE;NETSTANDARD + + + netstandard2.0 + Xtensive + true + ..\Orm.snk + true + 2 + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + PreserveNewest + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/App.config b/Orm/Xtensive.Orm.Tests.Sql/App.config index 80ae31eb84..80088e7243 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/App.config +++ b/Orm/Xtensive.Orm.Tests.Sql/App.config @@ -1,7 +1,7 @@ - - - -
- - + + + +
+ + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs b/Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs index 2e1c28c196..13c421b5ac 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs @@ -1,671 +1,671 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using NUnit.Framework; -using System; -using System.Collections.Generic; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - [TestFixture] - public class CloneTests - { - private Table table1; - private Table table2; - - [OneTimeSetUp] - public void SetUp() - { - var catalog = new Catalog("test"); - Schema schema1 = catalog.CreateSchema("dbo"); - - table1 = schema1.CreateTable("table1"); - table1.CreateColumn("ID", new SqlValueType(SqlType.Int32)); - table1.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - - table2 = schema1.CreateTable("table2"); - table2.CreateColumn("ID", new SqlValueType(SqlType.Int32)); - table2.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - } - - [Test] - public void SqlExpressionCloneTest() - { - SqlExpression e = SqlDml.Literal(1); - SqlExpression eClone = (SqlExpression) e.Clone(); - Assert.AreNotEqual(e, eClone); - Assert.AreEqual(e.NodeType, eClone.NodeType); - } - - [Test] - public void SqlLiteralCloneTest() - { - SqlLiteral l = SqlDml.Literal(1); - SqlLiteral lClone = (SqlLiteral) l.Clone(); - Assert.AreNotEqual(l, lClone); - Assert.AreEqual(l.Value, lClone.Value); - Assert.AreEqual(l.NodeType, lClone.NodeType); - } - - [Test] - public void SqlArrayCloneTest() - { - SqlArray a = SqlDml.Array(new int[]{1, 2, 4}); - SqlArray aClone = (SqlArray) a.Clone(); - - Assert.AreNotEqual(a, aClone); - Assert.IsTrue(a.Values!=aClone.Values); - Assert.AreEqual(a.Values.Length, aClone.Values.Length); - for (int i = 0, l = a.Values.Length; i < l; i++) - Assert.AreEqual(a.Values[i], aClone.Values[i]); - Assert.AreEqual(a.NodeType, aClone.NodeType); - } - - [Test] - public void SqlBinaryCloneTest() - { - SqlBinary b = SqlDml.Literal(2) > 1; - SqlBinary bClone = (SqlBinary)b.Clone(); - - Assert.AreNotEqual(b, bClone); - Assert.AreNotEqual(b.Left, bClone.Left); - Assert.AreNotEqual(b.Right, bClone.Right); - Assert.AreEqual(b.NodeType, bClone.NodeType); - Assert.AreEqual(b.Left.NodeType, bClone.Left.NodeType); - Assert.AreEqual(b.Right.NodeType, bClone.Right.NodeType); - } - - [Test] - public void SqlCaseCloneTest() - { - SqlCase c = SqlDml.Case(); - c.Value = SqlDml.Literal(1); - c[SqlDml.Literal(1)] = SqlDml.Literal("A"); - c[SqlDml.Literal(2)] = SqlDml.Literal("B"); - c.Else = SqlDml.Literal("C"); - - SqlCase cClone = (SqlCase) c.Clone(); - - Assert.AreNotEqual(c, cClone); - Assert.AreNotEqual(c.Value, cClone.Value); - Assert.AreNotEqual(c.Else, cClone.Else); - Assert.AreEqual(c.NodeType, cClone.NodeType); - Assert.AreEqual(c.Value.NodeType, cClone.Value.NodeType); - Assert.AreEqual(c.Else.NodeType, cClone.Else.NodeType); - Assert.AreEqual(c.Count, cClone.Count); - } - - [Test] - public void SqlCastCloneTest() - { - SqlCast c = SqlDml.Cast(SqlDml.Literal(1), SqlType.Decimal, 6 ,4); - SqlCast cClone = (SqlCast)c.Clone(); - - Assert.AreNotEqual(c, cClone); - Assert.AreNotEqual(c.Operand, cClone.Operand); - Assert.AreEqual(c.NodeType, cClone.NodeType); - Assert.AreEqual(c.Operand.NodeType, cClone.Operand.NodeType); - Assert.AreEqual(c.Type, cClone.Type); - } - - [Test] - public void SqlColumnCloneTest() - { - { - SqlUserColumn c = SqlDml.Column(1); - SqlUserColumn cClone = (SqlUserColumn)c.Clone(); - - Assert.AreNotEqual(c, cClone); - Assert.AreNotEqual(c.Expression, cClone.Expression); - Assert.AreEqual(c.NodeType, cClone.NodeType); - Assert.AreEqual(c.Expression.NodeType, cClone.Expression.NodeType); - } - Console.WriteLine(); - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlTableColumn c = (SqlTableColumn)t[0]; - SqlTableColumn cClone = (SqlTableColumn)c.Clone(); - - Assert.AreNotEqual(c, cClone); -// Assert.AreNotEqual(c.SqlTable, cClone.SqlTable); - Assert.AreEqual(c.NodeType, cClone.NodeType); - } - } - - [Test] - public void SqlFunctionCallCloneTest() - { - { - SqlFunctionCall fc = SqlDml.FunctionCall("Function", 1, 2, 4); - SqlFunctionCall fcClone = (SqlFunctionCall) fc.Clone(); - - Assert.AreNotEqual(fc, fcClone); - Assert.AreNotEqual(fc.Arguments, fcClone.Arguments); - Assert.AreEqual(fc.NodeType, fcClone.NodeType); - Assert.AreEqual(fc.Arguments.Count, fcClone.Arguments.Count); - for (int i = 0, l = fc.Arguments.Count; i < l; i++) { - Assert.AreNotEqual(fc.Arguments[i], fcClone.Arguments[i]); - Assert.AreEqual(fc.Arguments[i].NodeType, fcClone.Arguments[i].NodeType); - } - Assert.AreEqual(fc.FunctionType, fcClone.FunctionType); - Assert.AreEqual(((SqlUserFunctionCall) fc).Name, ((SqlUserFunctionCall) fcClone).Name); - } - Console.WriteLine(); - { - SqlFunctionCall fc = SqlDml.CharLength("string"); - SqlFunctionCall fcClone = (SqlFunctionCall) fc.Clone(); - - Assert.AreNotEqual(fc, fcClone); - Assert.AreNotEqual(fc.Arguments, fcClone.Arguments); - for (int i = 0, l = fc.Arguments.Count; i < l; i++) { - Assert.AreNotEqual(fc.Arguments[i], fcClone.Arguments[i]); - Assert.AreEqual(fc.Arguments[i].NodeType, fcClone.Arguments[i].NodeType); - } - Assert.AreEqual(fc.NodeType, fcClone.NodeType); - Assert.AreEqual(fc.Arguments.Count, fcClone.Arguments.Count); - Assert.AreEqual(fc.FunctionType, fcClone.FunctionType); - } - } - - [Test] - public void SqlLikeCloneTest() - { - { - SqlLike l = SqlDml.Like("epxression", "e%", "\\"); - SqlLike lClone = (SqlLike) l.Clone(); - - Assert.AreNotEqual(l, lClone); - Assert.AreNotEqual(l.Expression, lClone.Expression); - Assert.AreNotEqual(l.Pattern, lClone.Pattern); - Assert.AreNotEqual(l.Escape, lClone.Escape); - Assert.AreEqual(l.NodeType, lClone.NodeType); - Assert.AreEqual(l.Expression.NodeType, lClone.Expression.NodeType); - Assert.AreEqual(l.Pattern.NodeType, lClone.Pattern.NodeType); - Assert.AreEqual(l.Escape.NodeType, lClone.Escape.NodeType); - } - Console.WriteLine(); - { - SqlLike l = SqlDml.Like("epxression", "e%"); - SqlLike lClone = (SqlLike)l.Clone(); - - Assert.AreNotEqual(l, lClone); - Assert.AreNotEqual(l.Expression, lClone.Expression); - Assert.AreNotEqual(l.Pattern, lClone.Pattern); - Assert.AreEqual(l.NodeType, lClone.NodeType); - Assert.AreEqual(l.Expression.NodeType, lClone.Expression.NodeType); - Assert.AreEqual(l.Pattern.NodeType, lClone.Pattern.NodeType); - Assert.AreEqual(l.Escape, null); - } - } - - [Test] - public void SqlRowCloneTest() - { - SqlRow r = SqlDml.Row(1, 2, 4, SqlDml.Literal(6) + 5); - SqlRow rClone = (SqlRow)r.Clone(); - - Assert.AreNotEqual(r, rClone); - Assert.AreEqual(r.NodeType, rClone.NodeType); - Assert.AreEqual(r.Count, rClone.Count); - - for (int i = 0, l = r.Count; i < l; i++) { - Assert.AreNotEqual(r[i], rClone[i]); - Assert.AreEqual(r[i].NodeType, rClone[i].NodeType); - } - } - - [Test] - public void SqlUnaryCloneTest() - { - SqlUnary u = -SqlDml.Literal(1); - SqlUnary uClone = (SqlUnary)u.Clone(); - - Assert.AreNotEqual(u, uClone); - Assert.AreEqual(u.NodeType, uClone.NodeType); - } - - [Test] - public void SqlVariableCloneTest() - { - SqlVariable v = SqlDml.Variable("v", SqlType.Int32); - SqlVariable vClone = (SqlVariable)v.Clone(); - - Assert.AreNotEqual(v, vClone); - Assert.AreEqual(v.NodeType, vClone.NodeType); - Assert.AreEqual(v.Name, vClone.Name); - } - - [Test] - public void SqlAggregateCloneTest() - { - { - SqlAggregate a = SqlDml.Count(); - SqlAggregate aClone = (SqlAggregate) a.Clone(); - - Assert.AreNotEqual(a, aClone); - Assert.AreEqual(a.NodeType, aClone.NodeType); - Assert.AreEqual(a.Distinct, aClone.Distinct); - Assert.AreEqual(aClone.Expression.NodeType, SqlNodeType.Native); - } - Console.WriteLine(); - { - SqlAggregate a = SqlDml.Sum(1); - SqlAggregate aClone = (SqlAggregate)a.Clone(); - - Assert.AreNotEqual(a, aClone); - Assert.AreNotEqual(a.Expression, aClone.Expression); - Assert.AreEqual(a.NodeType, aClone.NodeType); - Assert.AreEqual(a.Distinct, aClone.Distinct); - Assert.AreEqual(a.Expression.NodeType, aClone.Expression.NodeType); - } - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlTableRefCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlTableRef tClone = (SqlTableRef)t.Clone(); - - Assert.AreNotEqual(t, tClone); - Assert.AreNotEqual(t.Columns, tClone.Columns); - Assert.AreEqual(t.NodeType, tClone.NodeType); - Assert.AreEqual(t.Name, tClone.Name); - Assert.AreEqual(t.DataTable, tClone.DataTable); - Assert.AreEqual(t.Columns.Count, tClone.Columns.Count); - - for (int i = 0, l = t.Columns.Count; i < l; i++) { - Assert.AreNotEqual(t.Columns[i], tClone.Columns[i]); - Assert.AreEqual(t.Columns[i].NodeType, tClone.Columns[i].NodeType); - Assert.AreEqual(t.Columns[i].GetType(), tClone.Columns[i].GetType()); - } - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlQueryRefCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlSelect s = SqlDml.Select(t); - s.Columns.Add(t.Columns[0]); - - SqlQueryRef qr = SqlDml.QueryRef(s); - SqlQueryRef qrClone = (SqlQueryRef)qr.Clone(); - - Assert.AreNotEqual(qr, qrClone); - Assert.AreNotEqual(qr.Columns, qrClone.Columns); - Assert.AreEqual(qr.NodeType, qrClone.NodeType); - Assert.AreEqual(qr.Name, qrClone.Name); - Assert.AreNotEqual(qr.Query, qrClone.Query); - Assert.AreEqual(qr.Columns.Count, qrClone.Columns.Count); - - for (int i = 0, l = qr.Columns.Count; i < l; i++) { - Assert.AreNotEqual(qr.Columns[i], qrClone.Columns[i]); - Assert.AreEqual(qr.Columns[i].NodeType, qrClone.Columns[i].NodeType); - Assert.AreEqual(qr.Columns[i].GetType(), qrClone.Columns[i].GetType()); - } - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlSubSelectCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlSelect s = SqlDml.Select(t); - s.Columns.Add(t.Columns[0]); - - SqlSubQuery ss = SqlDml.SubQuery(s); - SqlSubQuery ssClone = (SqlSubQuery)ss.Clone(); - - Assert.AreNotEqual(ss, ssClone); - Assert.AreNotEqual(ss.Query, ssClone.Query); - Assert.AreEqual(ss.NodeType, ssClone.NodeType); - Assert.AreEqual(ss.Query.NodeType, ssClone.Query.NodeType); - } - - [Test] - public void SqlMatchCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlSelect s = SqlDml.Select(t); - s.Columns.Add(t.Columns[0]); - - SqlMatch m = SqlDml.Match(SqlDml.Row(4), s, true, SqlMatchType.Full); - SqlMatch mClone = (SqlMatch)m.Clone(); - - Assert.AreNotEqual(m, mClone); - Assert.AreNotEqual(m.Value, mClone.Value); - Assert.AreNotEqual(m.SubQuery, mClone.SubQuery); - Assert.AreEqual(m.NodeType, mClone.NodeType); - Assert.AreEqual(m.Value.NodeType, mClone.Value.NodeType); - Assert.AreEqual(m.SubQuery.NodeType, mClone.SubQuery.NodeType); - Assert.AreEqual(m.Unique, mClone.Unique); - Assert.AreEqual(m.MatchType, mClone.MatchType); - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlSelectCloneTest() - { - SqlTableRef tr1 = SqlDml.TableRef(table1); - SqlTableRef tr2 = SqlDml.TableRef(table2); - - SqlSelect s = SqlDml.Select(); - s.Distinct = true; - s.Limit = 3; - s.Columns.Add(tr1["ID"]); - s.Columns.Add(tr1["ID"], "ID2"); - s.Columns.Add(tr1["ID"] + tr1["ID"], "SUM2"); - s.Columns.Add(tr2.Asterisk); - s.From = tr1.InnerJoin(tr2, tr1["ID"]==tr2["ID"]); - s.Where = SqlDml.Like(tr1["Name"], "Marat"); - s.Hints.Add(SqlDml.FastFirstRowsHint(10)); - - SqlSelect sClone = (SqlSelect)s.Clone(); - - Assert.AreNotEqual(s, sClone); - Assert.AreNotEqual(s.Columns, sClone.Columns); - for (int i = 0, l = s.Columns.Count; i < l; i++) { - Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); - } - for (int i = 0, l = s.GroupBy.Count; i < l; i++) { - Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); - } - Assert.AreEqual(s.Distinct, sClone.Distinct); - if (s.From==null) - Assert.AreEqual(s.From, sClone.From); - else { - Assert.AreNotEqual(s.From, sClone.From); - Assert.AreEqual(s.From.NodeType, sClone.From.NodeType); - } - if (!s.Having.IsNullReference()) { - Assert.AreNotEqual(s.Having, sClone.Having); - Assert.AreEqual(s.Having.NodeType, sClone.Having.NodeType); - } - - Assert.AreEqual(s.NodeType, sClone.NodeType); - Assert.IsFalse(s.OrderBy==sClone.OrderBy); - Assert.AreEqual(s.OrderBy.Count, sClone.OrderBy.Count); - for (int i = 0, l = s.OrderBy.Count; i < l; i++) { - Assert.AreNotEqual(s.OrderBy[i], sClone.OrderBy[i]); - Assert.AreEqual(s.OrderBy[i].Ascending, sClone.OrderBy[i].Ascending); - Assert.AreNotEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); - Assert.AreEqual(s.OrderBy[i].Position, sClone.OrderBy[i].Position); - } - - Assert.AreEqual(s.Limit, sClone.Limit); - if (s.Where!=null) { - Assert.AreNotEqual(s.Where, sClone.Where); - Assert.AreEqual(s.Where.NodeType, sClone.Where.NodeType); - } - - s.Where &= tr1[0] > 1200 || tr2[1]!="Marat"; - s.OrderBy.Add(tr1["ID"], false); - s.OrderBy.Add(2); - - sClone = (SqlSelect)s.Clone(); - - Assert.AreNotEqual(s, sClone); - Assert.AreNotEqual(s.Columns, sClone.Columns); - for (int i = 0, l = s.Columns.Count; i < l; i++) { - Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); - } - for (int i = 0, l = s.GroupBy.Count; i < l; i++) { - Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); - } - Assert.AreEqual(s.Distinct, sClone.Distinct); - if (s.From==null) - Assert.AreEqual(s.From, sClone.From); - else { - Assert.AreNotEqual(s.From, sClone.From); - Assert.AreEqual(s.From.NodeType, sClone.From.NodeType); - } - if (s.Having!=null) { - Assert.AreNotEqual(s.Having, sClone.Having); - Assert.AreEqual(s.Having.NodeType, sClone.Having.NodeType); - } - - Assert.AreEqual(s.NodeType, sClone.NodeType); - Assert.AreNotEqual(s.OrderBy, sClone.OrderBy); - Assert.AreEqual(s.OrderBy.Count, sClone.OrderBy.Count); - for (int i = 0, l = s.OrderBy.Count; i < l; i++) { - Assert.AreNotEqual(s.OrderBy[i], sClone.OrderBy[i]); - Assert.AreEqual(s.OrderBy[i].Ascending, sClone.OrderBy[i].Ascending); - if (s.OrderBy[i].Expression.IsNullReference()) - Assert.AreEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); - else - Assert.AreNotEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); - Assert.AreEqual(s.OrderBy[i].Position, sClone.OrderBy[i].Position); - } - - Assert.AreEqual(s.Limit, sClone.Limit); - if (s.Where!=null) { - Assert.AreNotEqual(s.Where, sClone.Where); - Assert.AreEqual(s.Where.NodeType, sClone.Where.NodeType); - } - Assert.AreEqual(s.Hints.Count, sClone.Hints.Count); - - SqlSelect s2 = SqlDml.Select(); - SqlQueryRef t = SqlDml.QueryRef(s, "SUBSELECT"); - s2.From = t; - s2.Columns.Add(t.Asterisk); - SqlSelect s2Clone = (SqlSelect) s2.Clone(); - - Assert.AreNotEqual(s2, s2Clone); - Assert.AreEqual(s2.Columns.Count, s2Clone.Columns.Count); - } - - [Test] - public void SqlOrderCloneTest() - { - { - SqlOrder o = SqlDml.Order(2, true); - SqlOrder oClone = (SqlOrder) o.Clone(); - - Assert.AreNotEqual(o, oClone); - Assert.AreEqual(o.NodeType, oClone.NodeType); - Assert.AreEqual(o.Ascending, oClone.Ascending); - Assert.AreEqual(o.Expression, oClone.Expression); - Assert.AreEqual(o.Position, oClone.Position); - } - - { - SqlOrder o = SqlDml.Order(SqlDml.Column(SqlDml.Literal(2)), false); - SqlOrder oClone = (SqlOrder)o.Clone(); - - Assert.AreNotEqual(o, oClone); - Assert.AreEqual(o.NodeType, oClone.NodeType); - Assert.AreEqual(o.Ascending, oClone.Ascending); - Assert.AreNotEqual(o.Expression, oClone.Expression); - Assert.AreEqual(o.Position, oClone.Position); - } - } - - [Test] - public void SqlAssignCloneTest() - { - SqlParameterRef p = SqlDml.ParameterRef("p"); - SqlAssignment a = SqlDml.Assign(p, 1); - SqlAssignment aClone = (SqlAssignment) a.Clone(); - - Assert.AreNotEqual(a, aClone); - Assert.AreEqual(a.NodeType, aClone.NodeType); - Assert.AreNotEqual(a.Left, aClone.Left); - Assert.AreEqual(a.Left.NodeType, aClone.Left.NodeType); - Assert.AreNotEqual(a.Right, aClone.Right); - Assert.AreEqual(a.Right.NodeType, aClone.Right.NodeType); - } - - [Test] - public void SqlBatchCloneTest() - { - SqlParameterRef p = SqlDml.ParameterRef("p"); - SqlAssignment a = SqlDml.Assign(p, 1); - SqlBatch b = SqlDml.Batch(); - b.Add(a); - b.Add(a); - SqlBatch bClone = (SqlBatch) b.Clone(); - - Assert.AreNotEqual(b, bClone); - Assert.AreEqual(b.NodeType, bClone.NodeType); - Assert.AreEqual(b.Count, bClone.Count); - foreach (SqlStatement s in b) - Assert.IsFalse(bClone.Contains(s)); - } - - [Test] - public void SqlDeclareVariableCloneTest() - { - { - SqlVariable dv = SqlDml.Variable("v", SqlType.Char, 5); - SqlVariable dvClone = (SqlVariable) dv.Clone(); - - Assert.AreNotEqual(dv, dvClone); - Assert.AreEqual(dv.NodeType, dvClone.NodeType); - Assert.IsTrue(dv.Type.Equals(dvClone.Type)); - Assert.AreEqual(dv.Name, dvClone.Name); - } - - { - SqlVariable dv = SqlDml.Variable("v", SqlType.Decimal, 6, 4); - SqlVariable dvClone = (SqlVariable)dv.Clone(); - - Assert.AreNotEqual(dv, dvClone); - Assert.AreEqual(dv.NodeType, dvClone.NodeType); - Assert.IsTrue(dv.Type.Equals(dvClone.Type)); - Assert.AreEqual(dv.Name, dvClone.Name); - } - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlDeleteCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlDelete d = SqlDml.Delete(t); - d.Where = t[0] < 6; - d.Hints.Add(SqlDml.FastFirstRowsHint(10)); - SqlDelete dClone = (SqlDelete) d.Clone(); - - Assert.AreNotEqual(d, dClone); - Assert.AreNotEqual(d.Delete, dClone.Delete); - Assert.AreEqual(d.NodeType, dClone.NodeType); - Assert.AreEqual(d.Hints.Count, dClone.Hints.Count); - if (!d.Where.IsNullReference()) { - Assert.AreNotEqual(d.Where, dClone.Where); - Assert.AreEqual(d.Where.NodeType, dClone.Where.NodeType); - } - else - Assert.AreEqual(dClone.Where, null); - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlIfCloneTest() - { - SqlSelect ifTrue = SqlDml.Select(); - ifTrue.Columns.Add(1, "id"); - SqlSelect ifFalse = SqlDml.Select(); - ifFalse.Columns.Add(2, "id"); - - SqlIf i = SqlDml.If(SqlDml.SubQuery(ifTrue) > 0, ifTrue); - SqlIf iClone = (SqlIf) i.Clone(); - - Assert.AreNotEqual(i, iClone); - Assert.AreEqual(i.NodeType, iClone.NodeType); - Assert.AreNotEqual(i.Condition, iClone.Condition); - Assert.AreEqual(i.Condition.NodeType, iClone.Condition.NodeType); - Assert.AreNotEqual(i.True, iClone.True); - Assert.AreNotEqual(i.True.NodeType, iClone.NodeType); - Assert.AreEqual(iClone.False, null); - - Console.WriteLine(); - - i.False = ifFalse; - iClone = (SqlIf)i.Clone(); - - Assert.AreNotEqual(i, iClone); - Assert.AreEqual(i.NodeType, iClone.NodeType); - Assert.AreNotEqual(i.Condition, iClone.Condition); - Assert.AreEqual(i.Condition.NodeType, iClone.Condition.NodeType); - Assert.AreNotEqual(i.True, iClone.True); - Assert.AreNotEqual(i.True.NodeType, iClone.NodeType); - Assert.AreNotEqual(i.False, iClone.False); - Assert.AreEqual(i.False.NodeType, iClone.False.NodeType); - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlInsertCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlInsert i = SqlDml.Insert(t); - i.Values[t[0]] = 1; - i.Values[t[1]] = "Anonym"; - i.Hints.Add(SqlDml.FastFirstRowsHint(10)); - SqlInsert iClone = (SqlInsert)i.Clone(); - - Assert.AreNotEqual(i, iClone); - Assert.AreNotEqual(i.Into, iClone.Into); - Assert.AreEqual(i.NodeType, iClone.NodeType); - Assert.AreEqual(i.Values.Count, iClone.Values.Count); - foreach (KeyValuePair p in i.Values) { - Assert.IsFalse(iClone.Values.ContainsKey(p.Key)); - Assert.IsFalse(iClone.Values.ContainsValue(p.Value)); - } - Assert.AreEqual(i.Hints.Count, iClone.Hints.Count); - } - - [Test, Ignore("FixGetEnumerator")] - public void SqlUpdateCloneTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlUpdate u = SqlDml.Update(t); - u.Values[t[0]] = 1; - u.Values[t[1]] = "Anonym"; - u.Where = t.Columns["ID"]==1; - u.Hints.Add(SqlDml.FastFirstRowsHint(10)); - SqlUpdate uClone = (SqlUpdate)u.Clone(); - - Assert.AreNotEqual(u, uClone); - Assert.AreNotEqual(u.Update, uClone.Update); - Assert.AreEqual(u.NodeType, uClone.NodeType); - Assert.AreEqual(u.Values.Count, uClone.Values.Count); - foreach (KeyValuePair p in u.Values) { - Assert.IsFalse(uClone.Values.ContainsKey(p.Key)); - Assert.IsFalse(uClone.Values.ContainsValue(p.Value)); - } - if (u.Where!=null) { - Assert.AreNotEqual(u.Where, uClone.Where); - Assert.AreEqual(u.Where.NodeType, uClone.Where.NodeType); - } - else - Assert.AreEqual(uClone.Where, null); - Assert.AreEqual(u.Hints.Count, uClone.Hints.Count); - } - - [Test] - public void SqlWhileCloneTest() - { - SqlVariable i = SqlDml.Variable("i", SqlType.Int32); - SqlWhile w = SqlDml.While(i<=1000); - SqlBatch b = SqlDml.Batch(); - b.Add(SqlDml.Assign(i, i+1)); - SqlTableRef t = SqlDml.TableRef(table1); - SqlSelect s = SqlDml.Select(t); - s.Columns.Add(t["Name"]); - s.Where = t[0]==i; - SqlIf f = SqlDml.If(SqlDml.SubQuery(s)=="Unkown", SqlDml.Break, SqlDml.Continue); - b.Add(f); - w.Statement = b; - - SqlWhile wClone = (SqlWhile) w.Clone(); - - Assert.AreNotEqual(w, wClone); - Assert.AreEqual(w.NodeType, wClone.NodeType); - Assert.AreNotEqual(w.Condition, wClone.Condition); - Assert.AreEqual(w.Condition.NodeType, wClone.Condition.NodeType); - Assert.AreNotEqual(w.Statement, wClone.Statement); - Assert.AreEqual(w.Statement.NodeType, wClone.Statement.NodeType); - } - } -} - - +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + [TestFixture] + public class CloneTests + { + private Table table1; + private Table table2; + + [OneTimeSetUp] + public void SetUp() + { + var catalog = new Catalog("test"); + Schema schema1 = catalog.CreateSchema("dbo"); + + table1 = schema1.CreateTable("table1"); + table1.CreateColumn("ID", new SqlValueType(SqlType.Int32)); + table1.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + + table2 = schema1.CreateTable("table2"); + table2.CreateColumn("ID", new SqlValueType(SqlType.Int32)); + table2.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + } + + [Test] + public void SqlExpressionCloneTest() + { + SqlExpression e = SqlDml.Literal(1); + SqlExpression eClone = (SqlExpression) e.Clone(); + Assert.AreNotEqual(e, eClone); + Assert.AreEqual(e.NodeType, eClone.NodeType); + } + + [Test] + public void SqlLiteralCloneTest() + { + SqlLiteral l = SqlDml.Literal(1); + SqlLiteral lClone = (SqlLiteral) l.Clone(); + Assert.AreNotEqual(l, lClone); + Assert.AreEqual(l.Value, lClone.Value); + Assert.AreEqual(l.NodeType, lClone.NodeType); + } + + [Test] + public void SqlArrayCloneTest() + { + SqlArray a = SqlDml.Array(new int[]{1, 2, 4}); + SqlArray aClone = (SqlArray) a.Clone(); + + Assert.AreNotEqual(a, aClone); + Assert.IsTrue(a.Values!=aClone.Values); + Assert.AreEqual(a.Values.Length, aClone.Values.Length); + for (int i = 0, l = a.Values.Length; i < l; i++) + Assert.AreEqual(a.Values[i], aClone.Values[i]); + Assert.AreEqual(a.NodeType, aClone.NodeType); + } + + [Test] + public void SqlBinaryCloneTest() + { + SqlBinary b = SqlDml.Literal(2) > 1; + SqlBinary bClone = (SqlBinary)b.Clone(); + + Assert.AreNotEqual(b, bClone); + Assert.AreNotEqual(b.Left, bClone.Left); + Assert.AreNotEqual(b.Right, bClone.Right); + Assert.AreEqual(b.NodeType, bClone.NodeType); + Assert.AreEqual(b.Left.NodeType, bClone.Left.NodeType); + Assert.AreEqual(b.Right.NodeType, bClone.Right.NodeType); + } + + [Test] + public void SqlCaseCloneTest() + { + SqlCase c = SqlDml.Case(); + c.Value = SqlDml.Literal(1); + c[SqlDml.Literal(1)] = SqlDml.Literal("A"); + c[SqlDml.Literal(2)] = SqlDml.Literal("B"); + c.Else = SqlDml.Literal("C"); + + SqlCase cClone = (SqlCase) c.Clone(); + + Assert.AreNotEqual(c, cClone); + Assert.AreNotEqual(c.Value, cClone.Value); + Assert.AreNotEqual(c.Else, cClone.Else); + Assert.AreEqual(c.NodeType, cClone.NodeType); + Assert.AreEqual(c.Value.NodeType, cClone.Value.NodeType); + Assert.AreEqual(c.Else.NodeType, cClone.Else.NodeType); + Assert.AreEqual(c.Count, cClone.Count); + } + + [Test] + public void SqlCastCloneTest() + { + SqlCast c = SqlDml.Cast(SqlDml.Literal(1), SqlType.Decimal, 6 ,4); + SqlCast cClone = (SqlCast)c.Clone(); + + Assert.AreNotEqual(c, cClone); + Assert.AreNotEqual(c.Operand, cClone.Operand); + Assert.AreEqual(c.NodeType, cClone.NodeType); + Assert.AreEqual(c.Operand.NodeType, cClone.Operand.NodeType); + Assert.AreEqual(c.Type, cClone.Type); + } + + [Test] + public void SqlColumnCloneTest() + { + { + SqlUserColumn c = SqlDml.Column(1); + SqlUserColumn cClone = (SqlUserColumn)c.Clone(); + + Assert.AreNotEqual(c, cClone); + Assert.AreNotEqual(c.Expression, cClone.Expression); + Assert.AreEqual(c.NodeType, cClone.NodeType); + Assert.AreEqual(c.Expression.NodeType, cClone.Expression.NodeType); + } + Console.WriteLine(); + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlTableColumn c = (SqlTableColumn)t[0]; + SqlTableColumn cClone = (SqlTableColumn)c.Clone(); + + Assert.AreNotEqual(c, cClone); +// Assert.AreNotEqual(c.SqlTable, cClone.SqlTable); + Assert.AreEqual(c.NodeType, cClone.NodeType); + } + } + + [Test] + public void SqlFunctionCallCloneTest() + { + { + SqlFunctionCall fc = SqlDml.FunctionCall("Function", 1, 2, 4); + SqlFunctionCall fcClone = (SqlFunctionCall) fc.Clone(); + + Assert.AreNotEqual(fc, fcClone); + Assert.AreNotEqual(fc.Arguments, fcClone.Arguments); + Assert.AreEqual(fc.NodeType, fcClone.NodeType); + Assert.AreEqual(fc.Arguments.Count, fcClone.Arguments.Count); + for (int i = 0, l = fc.Arguments.Count; i < l; i++) { + Assert.AreNotEqual(fc.Arguments[i], fcClone.Arguments[i]); + Assert.AreEqual(fc.Arguments[i].NodeType, fcClone.Arguments[i].NodeType); + } + Assert.AreEqual(fc.FunctionType, fcClone.FunctionType); + Assert.AreEqual(((SqlUserFunctionCall) fc).Name, ((SqlUserFunctionCall) fcClone).Name); + } + Console.WriteLine(); + { + SqlFunctionCall fc = SqlDml.CharLength("string"); + SqlFunctionCall fcClone = (SqlFunctionCall) fc.Clone(); + + Assert.AreNotEqual(fc, fcClone); + Assert.AreNotEqual(fc.Arguments, fcClone.Arguments); + for (int i = 0, l = fc.Arguments.Count; i < l; i++) { + Assert.AreNotEqual(fc.Arguments[i], fcClone.Arguments[i]); + Assert.AreEqual(fc.Arguments[i].NodeType, fcClone.Arguments[i].NodeType); + } + Assert.AreEqual(fc.NodeType, fcClone.NodeType); + Assert.AreEqual(fc.Arguments.Count, fcClone.Arguments.Count); + Assert.AreEqual(fc.FunctionType, fcClone.FunctionType); + } + } + + [Test] + public void SqlLikeCloneTest() + { + { + SqlLike l = SqlDml.Like("epxression", "e%", "\\"); + SqlLike lClone = (SqlLike) l.Clone(); + + Assert.AreNotEqual(l, lClone); + Assert.AreNotEqual(l.Expression, lClone.Expression); + Assert.AreNotEqual(l.Pattern, lClone.Pattern); + Assert.AreNotEqual(l.Escape, lClone.Escape); + Assert.AreEqual(l.NodeType, lClone.NodeType); + Assert.AreEqual(l.Expression.NodeType, lClone.Expression.NodeType); + Assert.AreEqual(l.Pattern.NodeType, lClone.Pattern.NodeType); + Assert.AreEqual(l.Escape.NodeType, lClone.Escape.NodeType); + } + Console.WriteLine(); + { + SqlLike l = SqlDml.Like("epxression", "e%"); + SqlLike lClone = (SqlLike)l.Clone(); + + Assert.AreNotEqual(l, lClone); + Assert.AreNotEqual(l.Expression, lClone.Expression); + Assert.AreNotEqual(l.Pattern, lClone.Pattern); + Assert.AreEqual(l.NodeType, lClone.NodeType); + Assert.AreEqual(l.Expression.NodeType, lClone.Expression.NodeType); + Assert.AreEqual(l.Pattern.NodeType, lClone.Pattern.NodeType); + Assert.AreEqual(l.Escape, null); + } + } + + [Test] + public void SqlRowCloneTest() + { + SqlRow r = SqlDml.Row(1, 2, 4, SqlDml.Literal(6) + 5); + SqlRow rClone = (SqlRow)r.Clone(); + + Assert.AreNotEqual(r, rClone); + Assert.AreEqual(r.NodeType, rClone.NodeType); + Assert.AreEqual(r.Count, rClone.Count); + + for (int i = 0, l = r.Count; i < l; i++) { + Assert.AreNotEqual(r[i], rClone[i]); + Assert.AreEqual(r[i].NodeType, rClone[i].NodeType); + } + } + + [Test] + public void SqlUnaryCloneTest() + { + SqlUnary u = -SqlDml.Literal(1); + SqlUnary uClone = (SqlUnary)u.Clone(); + + Assert.AreNotEqual(u, uClone); + Assert.AreEqual(u.NodeType, uClone.NodeType); + } + + [Test] + public void SqlVariableCloneTest() + { + SqlVariable v = SqlDml.Variable("v", SqlType.Int32); + SqlVariable vClone = (SqlVariable)v.Clone(); + + Assert.AreNotEqual(v, vClone); + Assert.AreEqual(v.NodeType, vClone.NodeType); + Assert.AreEqual(v.Name, vClone.Name); + } + + [Test] + public void SqlAggregateCloneTest() + { + { + SqlAggregate a = SqlDml.Count(); + SqlAggregate aClone = (SqlAggregate) a.Clone(); + + Assert.AreNotEqual(a, aClone); + Assert.AreEqual(a.NodeType, aClone.NodeType); + Assert.AreEqual(a.Distinct, aClone.Distinct); + Assert.AreEqual(aClone.Expression.NodeType, SqlNodeType.Native); + } + Console.WriteLine(); + { + SqlAggregate a = SqlDml.Sum(1); + SqlAggregate aClone = (SqlAggregate)a.Clone(); + + Assert.AreNotEqual(a, aClone); + Assert.AreNotEqual(a.Expression, aClone.Expression); + Assert.AreEqual(a.NodeType, aClone.NodeType); + Assert.AreEqual(a.Distinct, aClone.Distinct); + Assert.AreEqual(a.Expression.NodeType, aClone.Expression.NodeType); + } + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlTableRefCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlTableRef tClone = (SqlTableRef)t.Clone(); + + Assert.AreNotEqual(t, tClone); + Assert.AreNotEqual(t.Columns, tClone.Columns); + Assert.AreEqual(t.NodeType, tClone.NodeType); + Assert.AreEqual(t.Name, tClone.Name); + Assert.AreEqual(t.DataTable, tClone.DataTable); + Assert.AreEqual(t.Columns.Count, tClone.Columns.Count); + + for (int i = 0, l = t.Columns.Count; i < l; i++) { + Assert.AreNotEqual(t.Columns[i], tClone.Columns[i]); + Assert.AreEqual(t.Columns[i].NodeType, tClone.Columns[i].NodeType); + Assert.AreEqual(t.Columns[i].GetType(), tClone.Columns[i].GetType()); + } + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlQueryRefCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlSelect s = SqlDml.Select(t); + s.Columns.Add(t.Columns[0]); + + SqlQueryRef qr = SqlDml.QueryRef(s); + SqlQueryRef qrClone = (SqlQueryRef)qr.Clone(); + + Assert.AreNotEqual(qr, qrClone); + Assert.AreNotEqual(qr.Columns, qrClone.Columns); + Assert.AreEqual(qr.NodeType, qrClone.NodeType); + Assert.AreEqual(qr.Name, qrClone.Name); + Assert.AreNotEqual(qr.Query, qrClone.Query); + Assert.AreEqual(qr.Columns.Count, qrClone.Columns.Count); + + for (int i = 0, l = qr.Columns.Count; i < l; i++) { + Assert.AreNotEqual(qr.Columns[i], qrClone.Columns[i]); + Assert.AreEqual(qr.Columns[i].NodeType, qrClone.Columns[i].NodeType); + Assert.AreEqual(qr.Columns[i].GetType(), qrClone.Columns[i].GetType()); + } + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlSubSelectCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlSelect s = SqlDml.Select(t); + s.Columns.Add(t.Columns[0]); + + SqlSubQuery ss = SqlDml.SubQuery(s); + SqlSubQuery ssClone = (SqlSubQuery)ss.Clone(); + + Assert.AreNotEqual(ss, ssClone); + Assert.AreNotEqual(ss.Query, ssClone.Query); + Assert.AreEqual(ss.NodeType, ssClone.NodeType); + Assert.AreEqual(ss.Query.NodeType, ssClone.Query.NodeType); + } + + [Test] + public void SqlMatchCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlSelect s = SqlDml.Select(t); + s.Columns.Add(t.Columns[0]); + + SqlMatch m = SqlDml.Match(SqlDml.Row(4), s, true, SqlMatchType.Full); + SqlMatch mClone = (SqlMatch)m.Clone(); + + Assert.AreNotEqual(m, mClone); + Assert.AreNotEqual(m.Value, mClone.Value); + Assert.AreNotEqual(m.SubQuery, mClone.SubQuery); + Assert.AreEqual(m.NodeType, mClone.NodeType); + Assert.AreEqual(m.Value.NodeType, mClone.Value.NodeType); + Assert.AreEqual(m.SubQuery.NodeType, mClone.SubQuery.NodeType); + Assert.AreEqual(m.Unique, mClone.Unique); + Assert.AreEqual(m.MatchType, mClone.MatchType); + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlSelectCloneTest() + { + SqlTableRef tr1 = SqlDml.TableRef(table1); + SqlTableRef tr2 = SqlDml.TableRef(table2); + + SqlSelect s = SqlDml.Select(); + s.Distinct = true; + s.Limit = 3; + s.Columns.Add(tr1["ID"]); + s.Columns.Add(tr1["ID"], "ID2"); + s.Columns.Add(tr1["ID"] + tr1["ID"], "SUM2"); + s.Columns.Add(tr2.Asterisk); + s.From = tr1.InnerJoin(tr2, tr1["ID"]==tr2["ID"]); + s.Where = SqlDml.Like(tr1["Name"], "Marat"); + s.Hints.Add(SqlDml.FastFirstRowsHint(10)); + + SqlSelect sClone = (SqlSelect)s.Clone(); + + Assert.AreNotEqual(s, sClone); + Assert.AreNotEqual(s.Columns, sClone.Columns); + for (int i = 0, l = s.Columns.Count; i < l; i++) { + Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); + } + for (int i = 0, l = s.GroupBy.Count; i < l; i++) { + Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); + } + Assert.AreEqual(s.Distinct, sClone.Distinct); + if (s.From==null) + Assert.AreEqual(s.From, sClone.From); + else { + Assert.AreNotEqual(s.From, sClone.From); + Assert.AreEqual(s.From.NodeType, sClone.From.NodeType); + } + if (!s.Having.IsNullReference()) { + Assert.AreNotEqual(s.Having, sClone.Having); + Assert.AreEqual(s.Having.NodeType, sClone.Having.NodeType); + } + + Assert.AreEqual(s.NodeType, sClone.NodeType); + Assert.IsFalse(s.OrderBy==sClone.OrderBy); + Assert.AreEqual(s.OrderBy.Count, sClone.OrderBy.Count); + for (int i = 0, l = s.OrderBy.Count; i < l; i++) { + Assert.AreNotEqual(s.OrderBy[i], sClone.OrderBy[i]); + Assert.AreEqual(s.OrderBy[i].Ascending, sClone.OrderBy[i].Ascending); + Assert.AreNotEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); + Assert.AreEqual(s.OrderBy[i].Position, sClone.OrderBy[i].Position); + } + + Assert.AreEqual(s.Limit, sClone.Limit); + if (s.Where!=null) { + Assert.AreNotEqual(s.Where, sClone.Where); + Assert.AreEqual(s.Where.NodeType, sClone.Where.NodeType); + } + + s.Where &= tr1[0] > 1200 || tr2[1]!="Marat"; + s.OrderBy.Add(tr1["ID"], false); + s.OrderBy.Add(2); + + sClone = (SqlSelect)s.Clone(); + + Assert.AreNotEqual(s, sClone); + Assert.AreNotEqual(s.Columns, sClone.Columns); + for (int i = 0, l = s.Columns.Count; i < l; i++) { + Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); + } + for (int i = 0, l = s.GroupBy.Count; i < l; i++) { + Assert.AreNotEqual(s.Columns[i], sClone.Columns[i]); + } + Assert.AreEqual(s.Distinct, sClone.Distinct); + if (s.From==null) + Assert.AreEqual(s.From, sClone.From); + else { + Assert.AreNotEqual(s.From, sClone.From); + Assert.AreEqual(s.From.NodeType, sClone.From.NodeType); + } + if (s.Having!=null) { + Assert.AreNotEqual(s.Having, sClone.Having); + Assert.AreEqual(s.Having.NodeType, sClone.Having.NodeType); + } + + Assert.AreEqual(s.NodeType, sClone.NodeType); + Assert.AreNotEqual(s.OrderBy, sClone.OrderBy); + Assert.AreEqual(s.OrderBy.Count, sClone.OrderBy.Count); + for (int i = 0, l = s.OrderBy.Count; i < l; i++) { + Assert.AreNotEqual(s.OrderBy[i], sClone.OrderBy[i]); + Assert.AreEqual(s.OrderBy[i].Ascending, sClone.OrderBy[i].Ascending); + if (s.OrderBy[i].Expression.IsNullReference()) + Assert.AreEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); + else + Assert.AreNotEqual(s.OrderBy[i].Expression, sClone.OrderBy[i].Expression); + Assert.AreEqual(s.OrderBy[i].Position, sClone.OrderBy[i].Position); + } + + Assert.AreEqual(s.Limit, sClone.Limit); + if (s.Where!=null) { + Assert.AreNotEqual(s.Where, sClone.Where); + Assert.AreEqual(s.Where.NodeType, sClone.Where.NodeType); + } + Assert.AreEqual(s.Hints.Count, sClone.Hints.Count); + + SqlSelect s2 = SqlDml.Select(); + SqlQueryRef t = SqlDml.QueryRef(s, "SUBSELECT"); + s2.From = t; + s2.Columns.Add(t.Asterisk); + SqlSelect s2Clone = (SqlSelect) s2.Clone(); + + Assert.AreNotEqual(s2, s2Clone); + Assert.AreEqual(s2.Columns.Count, s2Clone.Columns.Count); + } + + [Test] + public void SqlOrderCloneTest() + { + { + SqlOrder o = SqlDml.Order(2, true); + SqlOrder oClone = (SqlOrder) o.Clone(); + + Assert.AreNotEqual(o, oClone); + Assert.AreEqual(o.NodeType, oClone.NodeType); + Assert.AreEqual(o.Ascending, oClone.Ascending); + Assert.AreEqual(o.Expression, oClone.Expression); + Assert.AreEqual(o.Position, oClone.Position); + } + + { + SqlOrder o = SqlDml.Order(SqlDml.Column(SqlDml.Literal(2)), false); + SqlOrder oClone = (SqlOrder)o.Clone(); + + Assert.AreNotEqual(o, oClone); + Assert.AreEqual(o.NodeType, oClone.NodeType); + Assert.AreEqual(o.Ascending, oClone.Ascending); + Assert.AreNotEqual(o.Expression, oClone.Expression); + Assert.AreEqual(o.Position, oClone.Position); + } + } + + [Test] + public void SqlAssignCloneTest() + { + SqlParameterRef p = SqlDml.ParameterRef("p"); + SqlAssignment a = SqlDml.Assign(p, 1); + SqlAssignment aClone = (SqlAssignment) a.Clone(); + + Assert.AreNotEqual(a, aClone); + Assert.AreEqual(a.NodeType, aClone.NodeType); + Assert.AreNotEqual(a.Left, aClone.Left); + Assert.AreEqual(a.Left.NodeType, aClone.Left.NodeType); + Assert.AreNotEqual(a.Right, aClone.Right); + Assert.AreEqual(a.Right.NodeType, aClone.Right.NodeType); + } + + [Test] + public void SqlBatchCloneTest() + { + SqlParameterRef p = SqlDml.ParameterRef("p"); + SqlAssignment a = SqlDml.Assign(p, 1); + SqlBatch b = SqlDml.Batch(); + b.Add(a); + b.Add(a); + SqlBatch bClone = (SqlBatch) b.Clone(); + + Assert.AreNotEqual(b, bClone); + Assert.AreEqual(b.NodeType, bClone.NodeType); + Assert.AreEqual(b.Count, bClone.Count); + foreach (SqlStatement s in b) + Assert.IsFalse(bClone.Contains(s)); + } + + [Test] + public void SqlDeclareVariableCloneTest() + { + { + SqlVariable dv = SqlDml.Variable("v", SqlType.Char, 5); + SqlVariable dvClone = (SqlVariable) dv.Clone(); + + Assert.AreNotEqual(dv, dvClone); + Assert.AreEqual(dv.NodeType, dvClone.NodeType); + Assert.IsTrue(dv.Type.Equals(dvClone.Type)); + Assert.AreEqual(dv.Name, dvClone.Name); + } + + { + SqlVariable dv = SqlDml.Variable("v", SqlType.Decimal, 6, 4); + SqlVariable dvClone = (SqlVariable)dv.Clone(); + + Assert.AreNotEqual(dv, dvClone); + Assert.AreEqual(dv.NodeType, dvClone.NodeType); + Assert.IsTrue(dv.Type.Equals(dvClone.Type)); + Assert.AreEqual(dv.Name, dvClone.Name); + } + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlDeleteCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlDelete d = SqlDml.Delete(t); + d.Where = t[0] < 6; + d.Hints.Add(SqlDml.FastFirstRowsHint(10)); + SqlDelete dClone = (SqlDelete) d.Clone(); + + Assert.AreNotEqual(d, dClone); + Assert.AreNotEqual(d.Delete, dClone.Delete); + Assert.AreEqual(d.NodeType, dClone.NodeType); + Assert.AreEqual(d.Hints.Count, dClone.Hints.Count); + if (!d.Where.IsNullReference()) { + Assert.AreNotEqual(d.Where, dClone.Where); + Assert.AreEqual(d.Where.NodeType, dClone.Where.NodeType); + } + else + Assert.AreEqual(dClone.Where, null); + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlIfCloneTest() + { + SqlSelect ifTrue = SqlDml.Select(); + ifTrue.Columns.Add(1, "id"); + SqlSelect ifFalse = SqlDml.Select(); + ifFalse.Columns.Add(2, "id"); + + SqlIf i = SqlDml.If(SqlDml.SubQuery(ifTrue) > 0, ifTrue); + SqlIf iClone = (SqlIf) i.Clone(); + + Assert.AreNotEqual(i, iClone); + Assert.AreEqual(i.NodeType, iClone.NodeType); + Assert.AreNotEqual(i.Condition, iClone.Condition); + Assert.AreEqual(i.Condition.NodeType, iClone.Condition.NodeType); + Assert.AreNotEqual(i.True, iClone.True); + Assert.AreNotEqual(i.True.NodeType, iClone.NodeType); + Assert.AreEqual(iClone.False, null); + + Console.WriteLine(); + + i.False = ifFalse; + iClone = (SqlIf)i.Clone(); + + Assert.AreNotEqual(i, iClone); + Assert.AreEqual(i.NodeType, iClone.NodeType); + Assert.AreNotEqual(i.Condition, iClone.Condition); + Assert.AreEqual(i.Condition.NodeType, iClone.Condition.NodeType); + Assert.AreNotEqual(i.True, iClone.True); + Assert.AreNotEqual(i.True.NodeType, iClone.NodeType); + Assert.AreNotEqual(i.False, iClone.False); + Assert.AreEqual(i.False.NodeType, iClone.False.NodeType); + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlInsertCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlInsert i = SqlDml.Insert(t); + i.Values[t[0]] = 1; + i.Values[t[1]] = "Anonym"; + i.Hints.Add(SqlDml.FastFirstRowsHint(10)); + SqlInsert iClone = (SqlInsert)i.Clone(); + + Assert.AreNotEqual(i, iClone); + Assert.AreNotEqual(i.Into, iClone.Into); + Assert.AreEqual(i.NodeType, iClone.NodeType); + Assert.AreEqual(i.Values.Count, iClone.Values.Count); + foreach (KeyValuePair p in i.Values) { + Assert.IsFalse(iClone.Values.ContainsKey(p.Key)); + Assert.IsFalse(iClone.Values.ContainsValue(p.Value)); + } + Assert.AreEqual(i.Hints.Count, iClone.Hints.Count); + } + + [Test, Ignore("FixGetEnumerator")] + public void SqlUpdateCloneTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlUpdate u = SqlDml.Update(t); + u.Values[t[0]] = 1; + u.Values[t[1]] = "Anonym"; + u.Where = t.Columns["ID"]==1; + u.Hints.Add(SqlDml.FastFirstRowsHint(10)); + SqlUpdate uClone = (SqlUpdate)u.Clone(); + + Assert.AreNotEqual(u, uClone); + Assert.AreNotEqual(u.Update, uClone.Update); + Assert.AreEqual(u.NodeType, uClone.NodeType); + Assert.AreEqual(u.Values.Count, uClone.Values.Count); + foreach (KeyValuePair p in u.Values) { + Assert.IsFalse(uClone.Values.ContainsKey(p.Key)); + Assert.IsFalse(uClone.Values.ContainsValue(p.Value)); + } + if (u.Where!=null) { + Assert.AreNotEqual(u.Where, uClone.Where); + Assert.AreEqual(u.Where.NodeType, uClone.Where.NodeType); + } + else + Assert.AreEqual(uClone.Where, null); + Assert.AreEqual(u.Hints.Count, uClone.Hints.Count); + } + + [Test] + public void SqlWhileCloneTest() + { + SqlVariable i = SqlDml.Variable("i", SqlType.Int32); + SqlWhile w = SqlDml.While(i<=1000); + SqlBatch b = SqlDml.Batch(); + b.Add(SqlDml.Assign(i, i+1)); + SqlTableRef t = SqlDml.TableRef(table1); + SqlSelect s = SqlDml.Select(t); + s.Columns.Add(t["Name"]); + s.Where = t[0]==i; + SqlIf f = SqlDml.If(SqlDml.SubQuery(s)=="Unkown", SqlDml.Break, SqlDml.Continue); + b.Add(f); + w.Statement = b; + + SqlWhile wClone = (SqlWhile) w.Clone(); + + Assert.AreNotEqual(w, wClone); + Assert.AreEqual(w.NodeType, wClone.NodeType); + Assert.AreNotEqual(w.Condition, wClone.Condition); + Assert.AreEqual(w.Condition.NodeType, wClone.Condition.NodeType); + Assert.AreNotEqual(w.Statement, wClone.Statement); + Assert.AreEqual(w.Statement.NodeType, wClone.Statement.NodeType); + } + } +} + + diff --git a/Orm/Xtensive.Orm.Tests.Sql/CollectionTest.cs b/Orm/Xtensive.Orm.Tests.Sql/CollectionTest.cs index 8fb157b187..34d004d60e 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/CollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/CollectionTest.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using NUnit.Framework; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - [TestFixture] - public class CollectionTest - { - [Test] - public void CatalogSchemaTest() - { - var c1 = new Catalog("catalog1"); - var c2 = new Catalog("catalog2"); - - var s1 = c1.CreateSchema("schema1"); - var s2 = c2.CreateSchema("schema2"); - - Assert.AreEqual(s1, c1.DefaultSchema); - Assert.AreEqual(s2, c2.DefaultSchema); - - s2.Catalog = c1; - Assert.AreEqual(c1.Schemas.Count, 2); - Assert.AreEqual(s1.Catalog, s2.Catalog); - - s2.Catalog = c2; - Assert.AreNotEqual(s1.Catalog, s2.Catalog); - Assert.AreEqual(c1.Schemas.Count, 1); - Assert.AreEqual(c2.Schemas.Count, 1); - - s2.Catalog = null; - Assert.IsNull(s2.Catalog); - Assert.AreEqual(c2.Schemas.Count, 0); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using NUnit.Framework; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + [TestFixture] + public class CollectionTest + { + [Test] + public void CatalogSchemaTest() + { + var c1 = new Catalog("catalog1"); + var c2 = new Catalog("catalog2"); + + var s1 = c1.CreateSchema("schema1"); + var s2 = c2.CreateSchema("schema2"); + + Assert.AreEqual(s1, c1.DefaultSchema); + Assert.AreEqual(s2, c2.DefaultSchema); + + s2.Catalog = c1; + Assert.AreEqual(c1.Schemas.Count, 2); + Assert.AreEqual(s1.Catalog, s2.Catalog); + + s2.Catalog = c2; + Assert.AreNotEqual(s1.Catalog, s2.Catalog); + Assert.AreEqual(c1.Schemas.Count, 1); + Assert.AreEqual(c2.Schemas.Count, 1); + + s2.Catalog = null; + Assert.IsNull(s2.Catalog); + Assert.AreEqual(c2.Schemas.Count, 0); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/CompilerTest.cs b/Orm/Xtensive.Orm.Tests.Sql/CompilerTest.cs index a0da19e647..c9eee4367c 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/CompilerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/CompilerTest.cs @@ -1,259 +1,259 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.06 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class CompilerTest : SqlTest - { - protected Catalog Catalog { get; private set; } - protected override void CheckRequirements() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.PostgreSql); - } - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - var initialCatalog = ExtractCatalog(); - DropSchema(initialCatalog); - Catalog = ExtractCatalog(); - CreateTables(Catalog); - } - - [Test] - public void UpdateTest01() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Update(tableRef); - update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void UpdateTest02() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Update(tableRef); - update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); - update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void UpdateTest03() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Update(tableRef); - update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); - update.Limit = SqlDml.Native("100"); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void UpdateTest04() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Update(tableRef); - update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now.Date)); - update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); - update.Limit = SqlDml.Native("100"); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void DeleteTest01() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Delete(tableRef); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void DeleteTest02() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Delete(tableRef); - update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void DeleteTest03() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Delete(tableRef); - update.Limit = SqlDml.Native("100"); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - - [Test] - public void DeleteTest04() - { - var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); - var update = SqlDml.Delete(tableRef); - update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); - update.Limit = SqlDml.Native("100"); - Console.WriteLine(Driver.Compile(update).GetCommandText()); - using (var command = Connection.CreateCommand(update)) { - command.ExecuteNonQuery(); - } - } - protected virtual void CreateTables(Catalog catalog) - { - var schema = catalog.DefaultSchema; - Table table; - TableColumn column; - var createBatch = SqlDml.Batch(); - - table = schema.CreateTable("EmployeeAddress"); - table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("AddressID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("EmployeeDepartmentHistory"); - table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int16)); - table.CreateColumn("ShiftID", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("StartDate", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("EndDate", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("EmployeePayHistory"); - table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("RateChangeDate", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("Rate", new SqlValueType(SqlType.Double)); - table.CreateColumn("PayFrequency", new SqlValueType(SqlType.Int16)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("Employee"); - table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("NationalIDNumber", Driver.TypeMappings[typeof(string)].MapType()); - table.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("LoginID", Driver.TypeMappings[typeof (string)].MapType()); - table.CreateColumn("ManagerID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("Title", Driver.TypeMappings[typeof(string)].MapType()); - table.CreateColumn("BirthDate", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("MaritalStatus", Driver.TypeMappings[typeof(string)].MapType()); - table.CreateColumn("Gender", Driver.TypeMappings[typeof(string)].MapType()); - table.CreateColumn("HireDate", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("VacationHours", new SqlValueType(SqlType.Int16)); - table.CreateColumn("SickLeaveHours", new SqlValueType(SqlType.Int16)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("Department"); - table.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("Name", Driver.TypeMappings[typeof (string)].MapType()); - table.CreateColumn("GroupName", Driver.TypeMappings[typeof (string)].MapType()); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("Shift"); - table.CreateColumn("ShiftID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("Name", Driver.TypeMappings[typeof (string)].MapType()); - table.CreateColumn("StartTime", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("EndTime", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("JobCandidate"); - table.CreateColumn("JobCandidateID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - createBatch.Add(SqlDdl.Create(table)); - - ExecuteBatch(createBatch); - } - - private void DropSchema(Catalog catalog) - { - var schema = catalog.DefaultSchema; - var dropBatch = SqlDml.Batch(); - - foreach (var constraint in schema.Tables.Where(t => t.TableConstraints.Count != 0).SelectMany(t => t.TableConstraints.OfType())) { - if (dropBatch.Count > 31) { - ExecuteBatch(dropBatch); - dropBatch = SqlDml.Batch(); - } - dropBatch.Add(SqlDdl.Alter(constraint.Table, SqlDdl.DropConstraint(constraint))); - } - - foreach (var view in schema.Views) { - if (dropBatch.Count > 31) { - ExecuteBatch(dropBatch); - dropBatch = SqlDml.Batch(); - } - dropBatch.Add(SqlDdl.Drop(view)); - schema.Tables.Remove(schema.Tables[view.Name]); - } - - foreach (var schemaTable in schema.Tables) { - if (dropBatch.Count > 31) { - ExecuteBatch(dropBatch); - dropBatch = SqlDml.Batch(); - } - dropBatch.Add(SqlDdl.Drop(schemaTable)); - } - - if (dropBatch.Count!=0) - ExecuteBatch(dropBatch); - } - - private void ExecuteBatch(SqlBatch batch) - { - if (Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.Batches)) { - if (batch.Count > 0) { - using (var command = Connection.CreateCommand(batch)) { - Console.WriteLine(command.CommandText); - command.ExecuteNonQuery(); - } - } - return; - } - if (batch.Count > 0) - foreach (var query in batch) { - using (var command = Connection.CreateCommand((ISqlCompileUnit) query)) { - Console.WriteLine(command.CommandText); - command.ExecuteNonQuery(); - } - } - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.06 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class CompilerTest : SqlTest + { + protected Catalog Catalog { get; private set; } + protected override void CheckRequirements() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.PostgreSql); + } + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + var initialCatalog = ExtractCatalog(); + DropSchema(initialCatalog); + Catalog = ExtractCatalog(); + CreateTables(Catalog); + } + + [Test] + public void UpdateTest01() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Update(tableRef); + update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void UpdateTest02() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Update(tableRef); + update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); + update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void UpdateTest03() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Update(tableRef); + update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now)); + update.Limit = SqlDml.Native("100"); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void UpdateTest04() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Update(tableRef); + update.Values.Add(tableRef.Columns["ModifiedDate"], SqlDml.Literal(DateTime.Now.Date)); + update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); + update.Limit = SqlDml.Native("100"); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void DeleteTest01() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Delete(tableRef); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void DeleteTest02() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Delete(tableRef); + update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void DeleteTest03() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Delete(tableRef); + update.Limit = SqlDml.Native("100"); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + + [Test] + public void DeleteTest04() + { + var tableRef = SqlDml.TableRef(Catalog.DefaultSchema.Tables["Department"]); + var update = SqlDml.Delete(tableRef); + update.Where = SqlDml.Equals(tableRef.Columns["Name"], SqlDml.Literal("Human Resources Department")); + update.Limit = SqlDml.Native("100"); + Console.WriteLine(Driver.Compile(update).GetCommandText()); + using (var command = Connection.CreateCommand(update)) { + command.ExecuteNonQuery(); + } + } + protected virtual void CreateTables(Catalog catalog) + { + var schema = catalog.DefaultSchema; + Table table; + TableColumn column; + var createBatch = SqlDml.Batch(); + + table = schema.CreateTable("EmployeeAddress"); + table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("AddressID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("EmployeeDepartmentHistory"); + table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int16)); + table.CreateColumn("ShiftID", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("StartDate", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("EndDate", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("EmployeePayHistory"); + table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("RateChangeDate", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("Rate", new SqlValueType(SqlType.Double)); + table.CreateColumn("PayFrequency", new SqlValueType(SqlType.Int16)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("Employee"); + table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("NationalIDNumber", Driver.TypeMappings[typeof(string)].MapType()); + table.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("LoginID", Driver.TypeMappings[typeof (string)].MapType()); + table.CreateColumn("ManagerID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("Title", Driver.TypeMappings[typeof(string)].MapType()); + table.CreateColumn("BirthDate", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("MaritalStatus", Driver.TypeMappings[typeof(string)].MapType()); + table.CreateColumn("Gender", Driver.TypeMappings[typeof(string)].MapType()); + table.CreateColumn("HireDate", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("VacationHours", new SqlValueType(SqlType.Int16)); + table.CreateColumn("SickLeaveHours", new SqlValueType(SqlType.Int16)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("Department"); + table.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("Name", Driver.TypeMappings[typeof (string)].MapType()); + table.CreateColumn("GroupName", Driver.TypeMappings[typeof (string)].MapType()); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("Shift"); + table.CreateColumn("ShiftID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("Name", Driver.TypeMappings[typeof (string)].MapType()); + table.CreateColumn("StartTime", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("EndTime", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("JobCandidate"); + table.CreateColumn("JobCandidateID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + table.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + createBatch.Add(SqlDdl.Create(table)); + + ExecuteBatch(createBatch); + } + + private void DropSchema(Catalog catalog) + { + var schema = catalog.DefaultSchema; + var dropBatch = SqlDml.Batch(); + + foreach (var constraint in schema.Tables.Where(t => t.TableConstraints.Count != 0).SelectMany(t => t.TableConstraints.OfType())) { + if (dropBatch.Count > 31) { + ExecuteBatch(dropBatch); + dropBatch = SqlDml.Batch(); + } + dropBatch.Add(SqlDdl.Alter(constraint.Table, SqlDdl.DropConstraint(constraint))); + } + + foreach (var view in schema.Views) { + if (dropBatch.Count > 31) { + ExecuteBatch(dropBatch); + dropBatch = SqlDml.Batch(); + } + dropBatch.Add(SqlDdl.Drop(view)); + schema.Tables.Remove(schema.Tables[view.Name]); + } + + foreach (var schemaTable in schema.Tables) { + if (dropBatch.Count > 31) { + ExecuteBatch(dropBatch); + dropBatch = SqlDml.Batch(); + } + dropBatch.Add(SqlDdl.Drop(schemaTable)); + } + + if (dropBatch.Count!=0) + ExecuteBatch(dropBatch); + } + + private void ExecuteBatch(SqlBatch batch) + { + if (Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.Batches)) { + if (batch.Count > 0) { + using (var command = Connection.CreateCommand(batch)) { + Console.WriteLine(command.CommandText); + command.ExecuteNonQuery(); + } + } + return; + } + if (batch.Count > 0) + foreach (var query in batch) { + using (var command = Connection.CreateCommand((ISqlCompileUnit) query)) { + Console.WriteLine(command.CommandText); + command.ExecuteNonQuery(); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/DateTimeIntervalTest.cs index 562aea15a3..abd968b9e2 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/DateTimeIntervalTest.cs @@ -1,226 +1,226 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.27 - -using NUnit.Framework; -using System; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class DateTimeIntervalTest : SqlTest - { - protected static readonly DateTime DefaultDateTime = new DateTime(2001, 2, 3, 4, 5, 6, 334); - protected static readonly DateTime SecondDateTime = new DateTime(2000, 12, 11, 10, 9, 8, 765); - protected static readonly TimeSpan DefaultTimeSpan = new TimeSpan(10, 9, 8, 7, 652); - protected static readonly int AddYearsConst = 5; - protected static readonly int AddMonthsConst = 15; - - [Test] - public virtual void DateTimeAddIntervalTest() - { - CheckEquality( - SqlDml.DateTimePlusInterval(DefaultDateTime, DefaultTimeSpan), - DefaultDateTime.Add(DefaultTimeSpan)); - } - - [Test] - public virtual void DateTimeAddMonthsTest() - { - CheckEquality( - SqlDml.DateTimeAddMonths(DefaultDateTime, AddMonthsConst), - DefaultDateTime.AddMonths(AddMonthsConst)); - } - - [Test] - public virtual void DateTimeAddYearsTest() - { - CheckEquality( - SqlDml.DateTimeAddYears(DefaultDateTime, AddYearsConst), - DefaultDateTime.AddYears(AddYearsConst)); - } - - [Test] - public virtual void DateTimeConstructTest() - { - CheckEquality( - SqlDml.DateTimeConstruct(DefaultDateTime.Year, DefaultDateTime.Month, DefaultDateTime.Day), - DefaultDateTime.Date); - } - - [Test] - public virtual void DateTimeSubtractDateTimeTest() - { - CheckEquality( - SqlDml.DateTimeMinusDateTime(DefaultDateTime, SecondDateTime), - DefaultDateTime.Subtract(SecondDateTime)); - } - - [Test] - public virtual void DateTimeSubtractIntervalTest() - { - CheckEquality( - SqlDml.DateTimeMinusInterval(DefaultDateTime, DefaultTimeSpan), - DefaultDateTime.Subtract(DefaultTimeSpan)); - } - - [Test] - public virtual void DateTimeTruncateTest() - { - CheckEquality( - SqlDml.DateTimeTruncate(DefaultDateTime), - DefaultDateTime.Date); - } - - [Test] - public virtual void DateTimeExtractYearTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Year, DefaultDateTime), - DefaultDateTime.Year); - } - - [Test] - public virtual void DateTimeExtractMonthTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Month, DefaultDateTime), - DefaultDateTime.Month); - } - - [Test] - public virtual void DateTimeExtractDayTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Day, DefaultDateTime), - DefaultDateTime.Day); - } - - [Test] - public virtual void DateTimeExtractHourTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Hour, DefaultDateTime), - DefaultDateTime.Hour); - } - - [Test] - public virtual void DateTimeExtractMinuteTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Minute, DefaultDateTime), - DefaultDateTime.Minute); - } - - [Test] - public virtual void DateTimeExtractSecondTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Second, DefaultDateTime), - DefaultDateTime.Second); - } - - [Test] - public virtual void DateTimeExtractMillisecondTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.Millisecond, DefaultDateTime), - DefaultDateTime.Millisecond); - } - - [Test] - public virtual void DateTimeExtractDayOfWeekTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.DayOfWeek, DefaultDateTime), - (int) DefaultDateTime.DayOfWeek); - } - - [Test] - public virtual void DateTimeExtractDayOfYearTest() - { - CheckEquality( - SqlDml.Extract(SqlDateTimePart.DayOfYear, DefaultDateTime), - DefaultDateTime.DayOfYear); - } - - [Test] - public virtual void IntervalConstructTest() - { - CheckEquality( - SqlDml.IntervalConstruct((long) DefaultTimeSpan.TotalMilliseconds * 1000000), - DefaultTimeSpan); - } - - [Test] - public virtual void IntervalExtractDayTest() - { - CheckEquality( - SqlDml.Extract(SqlIntervalPart.Day, DefaultTimeSpan), - DefaultTimeSpan.Days); - } - - [Test] - public virtual void IntervalExtractHourTest() - { - CheckEquality( - SqlDml.Extract(SqlIntervalPart.Hour, DefaultTimeSpan), - DefaultTimeSpan.Hours); - } - - [Test] - public virtual void IntervalExtractMinuteTest() - { - CheckEquality( - SqlDml.Extract(SqlIntervalPart.Minute, DefaultTimeSpan), - DefaultTimeSpan.Minutes); - } - - [Test] - public virtual void IntervalExtractSecondTest() - { - CheckEquality( - SqlDml.Extract(SqlIntervalPart.Second, DefaultTimeSpan), - DefaultTimeSpan.Seconds); - } - - [Test] - public virtual void IntervalExtractMillisecondTest() - { - CheckEquality( - SqlDml.Extract(SqlIntervalPart.Millisecond, DefaultTimeSpan), - DefaultTimeSpan.Milliseconds); - } - - [Test] - public virtual void IntervalToMillisecondsTest() - { - CheckEquality( - SqlDml.IntervalToMilliseconds(DefaultTimeSpan), - (int) DefaultTimeSpan.TotalMilliseconds); - } - - [Test] - public virtual void IntervalAbsTest() - { - CheckEquality( - SqlDml.IntervalAbs(DefaultTimeSpan.Negate()), - DefaultTimeSpan); - } - - protected void CheckEquality(SqlExpression left, SqlExpression right) - { - var select = SqlDml.Select("ok"); - select.Where = left==right; - using (var command = Connection.CreateCommand(select)) { - Console.WriteLine(command.CommandText); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - } - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.27 + +using NUnit.Framework; +using System; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class DateTimeIntervalTest : SqlTest + { + protected static readonly DateTime DefaultDateTime = new DateTime(2001, 2, 3, 4, 5, 6, 334); + protected static readonly DateTime SecondDateTime = new DateTime(2000, 12, 11, 10, 9, 8, 765); + protected static readonly TimeSpan DefaultTimeSpan = new TimeSpan(10, 9, 8, 7, 652); + protected static readonly int AddYearsConst = 5; + protected static readonly int AddMonthsConst = 15; + + [Test] + public virtual void DateTimeAddIntervalTest() + { + CheckEquality( + SqlDml.DateTimePlusInterval(DefaultDateTime, DefaultTimeSpan), + DefaultDateTime.Add(DefaultTimeSpan)); + } + + [Test] + public virtual void DateTimeAddMonthsTest() + { + CheckEquality( + SqlDml.DateTimeAddMonths(DefaultDateTime, AddMonthsConst), + DefaultDateTime.AddMonths(AddMonthsConst)); + } + + [Test] + public virtual void DateTimeAddYearsTest() + { + CheckEquality( + SqlDml.DateTimeAddYears(DefaultDateTime, AddYearsConst), + DefaultDateTime.AddYears(AddYearsConst)); + } + + [Test] + public virtual void DateTimeConstructTest() + { + CheckEquality( + SqlDml.DateTimeConstruct(DefaultDateTime.Year, DefaultDateTime.Month, DefaultDateTime.Day), + DefaultDateTime.Date); + } + + [Test] + public virtual void DateTimeSubtractDateTimeTest() + { + CheckEquality( + SqlDml.DateTimeMinusDateTime(DefaultDateTime, SecondDateTime), + DefaultDateTime.Subtract(SecondDateTime)); + } + + [Test] + public virtual void DateTimeSubtractIntervalTest() + { + CheckEquality( + SqlDml.DateTimeMinusInterval(DefaultDateTime, DefaultTimeSpan), + DefaultDateTime.Subtract(DefaultTimeSpan)); + } + + [Test] + public virtual void DateTimeTruncateTest() + { + CheckEquality( + SqlDml.DateTimeTruncate(DefaultDateTime), + DefaultDateTime.Date); + } + + [Test] + public virtual void DateTimeExtractYearTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Year, DefaultDateTime), + DefaultDateTime.Year); + } + + [Test] + public virtual void DateTimeExtractMonthTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Month, DefaultDateTime), + DefaultDateTime.Month); + } + + [Test] + public virtual void DateTimeExtractDayTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Day, DefaultDateTime), + DefaultDateTime.Day); + } + + [Test] + public virtual void DateTimeExtractHourTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Hour, DefaultDateTime), + DefaultDateTime.Hour); + } + + [Test] + public virtual void DateTimeExtractMinuteTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Minute, DefaultDateTime), + DefaultDateTime.Minute); + } + + [Test] + public virtual void DateTimeExtractSecondTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Second, DefaultDateTime), + DefaultDateTime.Second); + } + + [Test] + public virtual void DateTimeExtractMillisecondTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.Millisecond, DefaultDateTime), + DefaultDateTime.Millisecond); + } + + [Test] + public virtual void DateTimeExtractDayOfWeekTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.DayOfWeek, DefaultDateTime), + (int) DefaultDateTime.DayOfWeek); + } + + [Test] + public virtual void DateTimeExtractDayOfYearTest() + { + CheckEquality( + SqlDml.Extract(SqlDateTimePart.DayOfYear, DefaultDateTime), + DefaultDateTime.DayOfYear); + } + + [Test] + public virtual void IntervalConstructTest() + { + CheckEquality( + SqlDml.IntervalConstruct((long) DefaultTimeSpan.TotalMilliseconds * 1000000), + DefaultTimeSpan); + } + + [Test] + public virtual void IntervalExtractDayTest() + { + CheckEquality( + SqlDml.Extract(SqlIntervalPart.Day, DefaultTimeSpan), + DefaultTimeSpan.Days); + } + + [Test] + public virtual void IntervalExtractHourTest() + { + CheckEquality( + SqlDml.Extract(SqlIntervalPart.Hour, DefaultTimeSpan), + DefaultTimeSpan.Hours); + } + + [Test] + public virtual void IntervalExtractMinuteTest() + { + CheckEquality( + SqlDml.Extract(SqlIntervalPart.Minute, DefaultTimeSpan), + DefaultTimeSpan.Minutes); + } + + [Test] + public virtual void IntervalExtractSecondTest() + { + CheckEquality( + SqlDml.Extract(SqlIntervalPart.Second, DefaultTimeSpan), + DefaultTimeSpan.Seconds); + } + + [Test] + public virtual void IntervalExtractMillisecondTest() + { + CheckEquality( + SqlDml.Extract(SqlIntervalPart.Millisecond, DefaultTimeSpan), + DefaultTimeSpan.Milliseconds); + } + + [Test] + public virtual void IntervalToMillisecondsTest() + { + CheckEquality( + SqlDml.IntervalToMilliseconds(DefaultTimeSpan), + (int) DefaultTimeSpan.TotalMilliseconds); + } + + [Test] + public virtual void IntervalAbsTest() + { + CheckEquality( + SqlDml.IntervalAbs(DefaultTimeSpan.Negate()), + DefaultTimeSpan); + } + + protected void CheckEquality(SqlExpression left, SqlExpression right) + { + var select = SqlDml.Select("ok"); + select.Where = left==right; + using (var command = Connection.CreateCommand(select)) { + Console.WriteLine(command.CommandText); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/DateTimeOffsetTest.cs b/Orm/Xtensive.Orm.Tests.Sql/DateTimeOffsetTest.cs index 10d3d33e99..608765bfa2 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/DateTimeOffsetTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/DateTimeOffsetTest.cs @@ -1,206 +1,206 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.01.16 - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class DateTimeOffsetTest : SqlTest - { - protected static readonly TimeSpan DefaultTimeSpan = -new TimeSpan(4, 10, 0); - protected static readonly TimeSpan SecondTimeSpan = new TimeSpan(9, 45, 0); - - // some other values depend on this following value, be careful when change it. - protected static readonly DateTimeOffset DefaultDateTimeOffset = new DateTimeOffset(2001, 2, 3, 14, 15, 16, 334, DefaultTimeSpan); - protected static readonly DateTimeOffset SecondDateTimeOffset = new DateTimeOffset(2000, 12, 11, 10, 9, 8, 765, SecondTimeSpan); - protected static readonly TimeSpan OperationTimeSpanConst = new TimeSpan(10, 9, 8, 7, 542); - protected static readonly int AddYearsConst = 5; - protected static readonly int AddMonthsConst = 15; - - protected virtual bool IsNanosecondSupported - { - get { return true; } - } - - protected virtual bool ShouldTransformToLocalZone - { - get { return false; } - } - - [Test] - public virtual void ExtractDateTimePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DateTime, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).DateTime); - } - - [Test] - public virtual void ExtractDatePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Date, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Date); - } - - [Test] - public virtual void ExtractYearPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Year, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Year); - } - - [Test] - public virtual void ExtractMonthPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Month, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Month); - } - - [Test] - public virtual void ExtractDayPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Day, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Day); - } - - [Test] - public virtual void ExtractDayOfWeekPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DayOfWeek, DefaultDateTimeOffset), (int) TryTranformToLocalZone(DefaultDateTimeOffset).DayOfWeek); - } - - [Test] - public virtual void ExtractDayOfYearPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DayOfYear, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).DayOfYear); - } - - [Test] - public virtual void ExtractHourPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Hour, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Hour); - } - - [Test] - public virtual void ExtractMinutePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Minute, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Minute); - } - - [Test] - public virtual void ExtractSecondPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Second, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Second); - } - - [Test] - public virtual void ExtractMillisecondPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Millisecond, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Millisecond); - } - - [Test] - public virtual void ExtractNanosecondPartTest() - { - if (IsNanosecondSupported) - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Nanosecond, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Millisecond * 1000000); - } - - [Test] - public virtual void ExtractOffsetPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Offset, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset); - } - - [Test] - public virtual void ExtractTimeZoneHourPartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.TimeZoneHour, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset.Hours); - } - - [Test] - public virtual void ExtractTimezoneMinutePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.TimeZoneMinute, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset.Minutes); - } - - [Test] - public virtual void ExtractLocalDateTimePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.LocalDateTime, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).LocalDateTime); - } - - [Test] - public virtual void ExtractUtcDateTimePartTest() - { - CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.UtcDateTime, DefaultDateTimeOffset), DefaultDateTimeOffset.UtcDateTime); - } - - [Test] - public virtual void DateTimeOffsetAddMonthsTest() - { - CheckEquality(SqlDml.DateTimeOffsetAddMonths(DefaultDateTimeOffset, AddMonthsConst), TryTranformToLocalZone(DefaultDateTimeOffset).AddMonths(AddMonthsConst)); - } - - [Test] - public virtual void DateTimeOffsetAddYearsTest() - { - CheckEquality(SqlDml.DateTimeOffsetAddYears(DefaultDateTimeOffset, AddYearsConst), TryTranformToLocalZone(DefaultDateTimeOffset).AddYears(AddYearsConst)); - } - - [Test] - public virtual void DateTimeOffsetConstructTest() - { - CheckEquality(SqlDml.DateTimeOffsetConstruct(DefaultDateTimeOffset.DateTime, DefaultTimeSpan.TotalMinutes), TryTranformToLocalZone(DefaultDateTimeOffset)); - } - - [Test] - public virtual void DateTimeOffsetMinusDateTimeOffsetTest() - { - CheckEquality(SqlDml.DateTimeOffsetMinusDateTimeOffset(DefaultDateTimeOffset, SecondDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Subtract(SecondDateTimeOffset)); - } - - [Test] - public virtual void DateTimeOffsetMinusIntervalTest() - { - CheckEquality(SqlDml.DateTimeOffsetMinusInterval(DefaultDateTimeOffset, OperationTimeSpanConst), TryTranformToLocalZone(DefaultDateTimeOffset) - OperationTimeSpanConst); - } - - [Test] - public virtual void DateTimeOffsetPlusIntervalTest() - { - CheckEquality(SqlDml.DateTimeOffsetPlusInterval(DefaultDateTimeOffset, OperationTimeSpanConst), TryTranformToLocalZone(DefaultDateTimeOffset) + OperationTimeSpanConst); - } - - [Test] - public virtual void DateTimeOffsetTimeOfDayTest() - { - CheckEquality(SqlDml.DateTimeOffsetTimeOfDay(DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).TimeOfDay); - } - - [Test] - public virtual void DateTimeOffsetToUtcTimeTest() - { - CheckEquality(SqlDml.DateTimeOffsetToUtcTime(DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).ToUniversalTime()); - } - - protected void CheckEquality(SqlExpression left, SqlExpression right) - { - var select = SqlDml.Select("ok"); - select.Where = left==right; - using (var command = Connection.CreateCommand(select)) { - Console.WriteLine(command.CommandText); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - } - } - } - - protected DateTimeOffset TryTranformToLocalZone(DateTimeOffset origin) - { - if (!ShouldTransformToLocalZone) - return origin; - return origin.ToLocalTime(); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.01.16 + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class DateTimeOffsetTest : SqlTest + { + protected static readonly TimeSpan DefaultTimeSpan = -new TimeSpan(4, 10, 0); + protected static readonly TimeSpan SecondTimeSpan = new TimeSpan(9, 45, 0); + + // some other values depend on this following value, be careful when change it. + protected static readonly DateTimeOffset DefaultDateTimeOffset = new DateTimeOffset(2001, 2, 3, 14, 15, 16, 334, DefaultTimeSpan); + protected static readonly DateTimeOffset SecondDateTimeOffset = new DateTimeOffset(2000, 12, 11, 10, 9, 8, 765, SecondTimeSpan); + protected static readonly TimeSpan OperationTimeSpanConst = new TimeSpan(10, 9, 8, 7, 542); + protected static readonly int AddYearsConst = 5; + protected static readonly int AddMonthsConst = 15; + + protected virtual bool IsNanosecondSupported + { + get { return true; } + } + + protected virtual bool ShouldTransformToLocalZone + { + get { return false; } + } + + [Test] + public virtual void ExtractDateTimePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DateTime, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).DateTime); + } + + [Test] + public virtual void ExtractDatePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Date, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Date); + } + + [Test] + public virtual void ExtractYearPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Year, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Year); + } + + [Test] + public virtual void ExtractMonthPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Month, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Month); + } + + [Test] + public virtual void ExtractDayPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Day, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Day); + } + + [Test] + public virtual void ExtractDayOfWeekPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DayOfWeek, DefaultDateTimeOffset), (int) TryTranformToLocalZone(DefaultDateTimeOffset).DayOfWeek); + } + + [Test] + public virtual void ExtractDayOfYearPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.DayOfYear, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).DayOfYear); + } + + [Test] + public virtual void ExtractHourPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Hour, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Hour); + } + + [Test] + public virtual void ExtractMinutePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Minute, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Minute); + } + + [Test] + public virtual void ExtractSecondPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Second, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Second); + } + + [Test] + public virtual void ExtractMillisecondPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Millisecond, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Millisecond); + } + + [Test] + public virtual void ExtractNanosecondPartTest() + { + if (IsNanosecondSupported) + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Nanosecond, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Millisecond * 1000000); + } + + [Test] + public virtual void ExtractOffsetPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.Offset, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset); + } + + [Test] + public virtual void ExtractTimeZoneHourPartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.TimeZoneHour, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset.Hours); + } + + [Test] + public virtual void ExtractTimezoneMinutePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.TimeZoneMinute, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Offset.Minutes); + } + + [Test] + public virtual void ExtractLocalDateTimePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.LocalDateTime, DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).LocalDateTime); + } + + [Test] + public virtual void ExtractUtcDateTimePartTest() + { + CheckEquality(SqlDml.Extract(SqlDateTimeOffsetPart.UtcDateTime, DefaultDateTimeOffset), DefaultDateTimeOffset.UtcDateTime); + } + + [Test] + public virtual void DateTimeOffsetAddMonthsTest() + { + CheckEquality(SqlDml.DateTimeOffsetAddMonths(DefaultDateTimeOffset, AddMonthsConst), TryTranformToLocalZone(DefaultDateTimeOffset).AddMonths(AddMonthsConst)); + } + + [Test] + public virtual void DateTimeOffsetAddYearsTest() + { + CheckEquality(SqlDml.DateTimeOffsetAddYears(DefaultDateTimeOffset, AddYearsConst), TryTranformToLocalZone(DefaultDateTimeOffset).AddYears(AddYearsConst)); + } + + [Test] + public virtual void DateTimeOffsetConstructTest() + { + CheckEquality(SqlDml.DateTimeOffsetConstruct(DefaultDateTimeOffset.DateTime, DefaultTimeSpan.TotalMinutes), TryTranformToLocalZone(DefaultDateTimeOffset)); + } + + [Test] + public virtual void DateTimeOffsetMinusDateTimeOffsetTest() + { + CheckEquality(SqlDml.DateTimeOffsetMinusDateTimeOffset(DefaultDateTimeOffset, SecondDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).Subtract(SecondDateTimeOffset)); + } + + [Test] + public virtual void DateTimeOffsetMinusIntervalTest() + { + CheckEquality(SqlDml.DateTimeOffsetMinusInterval(DefaultDateTimeOffset, OperationTimeSpanConst), TryTranformToLocalZone(DefaultDateTimeOffset) - OperationTimeSpanConst); + } + + [Test] + public virtual void DateTimeOffsetPlusIntervalTest() + { + CheckEquality(SqlDml.DateTimeOffsetPlusInterval(DefaultDateTimeOffset, OperationTimeSpanConst), TryTranformToLocalZone(DefaultDateTimeOffset) + OperationTimeSpanConst); + } + + [Test] + public virtual void DateTimeOffsetTimeOfDayTest() + { + CheckEquality(SqlDml.DateTimeOffsetTimeOfDay(DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).TimeOfDay); + } + + [Test] + public virtual void DateTimeOffsetToUtcTimeTest() + { + CheckEquality(SqlDml.DateTimeOffsetToUtcTime(DefaultDateTimeOffset), TryTranformToLocalZone(DefaultDateTimeOffset).ToUniversalTime()); + } + + protected void CheckEquality(SqlExpression left, SqlExpression right) + { + var select = SqlDml.Select("ok"); + select.Where = left==right; + using (var command = Connection.CreateCommand(select)) { + Console.WriteLine(command.CommandText); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + } + } + } + + protected DateTimeOffset TryTranformToLocalZone(DateTimeOffset origin) + { + if (!ShouldTransformToLocalZone) + return origin; + return origin.ToLocalTime(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/DriverFactoryTest.cs b/Orm/Xtensive.Orm.Tests.Sql/DriverFactoryTest.cs index 6fd35ab1ef..12b6b0d64d 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/DriverFactoryTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/DriverFactoryTest.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Building.Builders; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Sql -{ - [TestFixture] - public class DriverFactoryTest - { - private string provider = TestConnectionInfoProvider.GetProvider(); - protected string Url = TestConnectionInfoProvider.GetConnectionUrl(); - protected string ConnectionString = TestConnectionInfoProvider.GetConnectionString(); - - [Test] - public void ConnectionUrlTest() - { - var url = UrlInfo.Parse("sqlserver://appserver/AdventureWorks?Connection Timeout=5"); - Assert.AreEqual(url.Protocol, "sqlserver"); - Assert.AreEqual(url.Host, "appserver"); - Assert.AreEqual(url.Resource, "AdventureWorks"); - - url = UrlInfo.Parse("sqlserver://localhost/database"); - Assert.AreEqual("database", url.GetDatabase()); - Assert.AreEqual("default schema", url.GetSchema("default schema")); - - url = UrlInfo.Parse("sqlserver://localhost/database/"); - Assert.AreEqual("database", url.GetDatabase()); - Assert.AreEqual("default schema", url.GetSchema("default schema")); - - url = UrlInfo.Parse("sqlserver://localhost/database/schema"); - Assert.AreEqual("database", url.GetDatabase()); - Assert.AreEqual("schema", url.GetSchema(string.Empty)); - - url = UrlInfo.Parse("sqlserver://localhost/database/schema/"); - Assert.AreEqual("database", url.GetDatabase()); - Assert.AreEqual("schema", url.GetSchema(string.Empty)); - } - - [Test] - public void ServerInfoTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2005); - var driver = TestSqlDriver.Create(Url); - Assert.Greater(driver.CoreServerInfo.ServerVersion.Major, 8); - } - - [Test] - public void ProviderTest() - { - TestProvider(provider, ConnectionString, Url); - } - - [Test] - [Explicit("Manual debugging needed. No way to make it automated test yet")] - public void SqlServerConnectionCheckTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var descriptor = ProviderDescriptor.Get(provider); - var factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); - - var configuration = new SqlDriverConfiguration {EnsureConnectionIsAlive = false}; - factory.GetDriver(new ConnectionInfo(Url), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - - configuration = configuration.Clone(); - configuration.EnsureConnectionIsAlive = true; - factory.GetDriver(new ConnectionInfo(Url), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.True); - - configuration = configuration.Clone(); - configuration.EnsureConnectionIsAlive = true; - factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";pooling=false"), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - - configuration = configuration.Clone(); - configuration.EnsureConnectionIsAlive = true; - factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";Pooling=False"), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - - configuration = configuration.Clone(); - configuration.EnsureConnectionIsAlive = true; - factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";pooling = false"), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - - configuration = configuration.Clone(); - configuration.EnsureConnectionIsAlive = true; - factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";Pooling = False"), configuration); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - } - - - private static void TestProvider(string providerName, string connectionString, string connectionUrl) - { - Assert.IsNotNull(TestSqlDriver.Create(connectionUrl)); - Assert.IsNotNull(TestSqlDriver.Create(providerName, connectionString)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Building.Builders; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Sql +{ + [TestFixture] + public class DriverFactoryTest + { + private string provider = TestConnectionInfoProvider.GetProvider(); + protected string Url = TestConnectionInfoProvider.GetConnectionUrl(); + protected string ConnectionString = TestConnectionInfoProvider.GetConnectionString(); + + [Test] + public void ConnectionUrlTest() + { + var url = UrlInfo.Parse("sqlserver://appserver/AdventureWorks?Connection Timeout=5"); + Assert.AreEqual(url.Protocol, "sqlserver"); + Assert.AreEqual(url.Host, "appserver"); + Assert.AreEqual(url.Resource, "AdventureWorks"); + + url = UrlInfo.Parse("sqlserver://localhost/database"); + Assert.AreEqual("database", url.GetDatabase()); + Assert.AreEqual("default schema", url.GetSchema("default schema")); + + url = UrlInfo.Parse("sqlserver://localhost/database/"); + Assert.AreEqual("database", url.GetDatabase()); + Assert.AreEqual("default schema", url.GetSchema("default schema")); + + url = UrlInfo.Parse("sqlserver://localhost/database/schema"); + Assert.AreEqual("database", url.GetDatabase()); + Assert.AreEqual("schema", url.GetSchema(string.Empty)); + + url = UrlInfo.Parse("sqlserver://localhost/database/schema/"); + Assert.AreEqual("database", url.GetDatabase()); + Assert.AreEqual("schema", url.GetSchema(string.Empty)); + } + + [Test] + public void ServerInfoTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2005); + var driver = TestSqlDriver.Create(Url); + Assert.Greater(driver.CoreServerInfo.ServerVersion.Major, 8); + } + + [Test] + public void ProviderTest() + { + TestProvider(provider, ConnectionString, Url); + } + + [Test] + [Explicit("Manual debugging needed. No way to make it automated test yet")] + public void SqlServerConnectionCheckTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var descriptor = ProviderDescriptor.Get(provider); + var factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); + + var configuration = new SqlDriverConfiguration {EnsureConnectionIsAlive = false}; + factory.GetDriver(new ConnectionInfo(Url), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + + configuration = configuration.Clone(); + configuration.EnsureConnectionIsAlive = true; + factory.GetDriver(new ConnectionInfo(Url), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.True); + + configuration = configuration.Clone(); + configuration.EnsureConnectionIsAlive = true; + factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";pooling=false"), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + + configuration = configuration.Clone(); + configuration.EnsureConnectionIsAlive = true; + factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";Pooling=False"), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + + configuration = configuration.Clone(); + configuration.EnsureConnectionIsAlive = true; + factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";pooling = false"), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + + configuration = configuration.Clone(); + configuration.EnsureConnectionIsAlive = true; + factory.GetDriver(new ConnectionInfo(provider, ConnectionString + ";Pooling = False"), configuration); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + } + + + private static void TestProvider(string providerName, string connectionString, string connectionUrl) + { + Assert.IsNotNull(TestSqlDriver.Create(connectionUrl)); + Assert.IsNotNull(TestSqlDriver.Create(providerName, connectionString)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/ExceptionTypesTest.cs index 9e78c923e2..8e1088852b 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/ExceptionTypesTest.cs @@ -1,306 +1,306 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.08 - -using System; -using System.Data; -using System.Threading; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class ExceptionTypesTest : SqlTest - { - private class EvilThreadArgument - { - public SqlConnection Connection; - public ISqlCompileUnit Statement; - public WaitHandle StartEvent; - public SqlExceptionType? ExceptionType; - } - - private const string IdColumnName = "id"; - private const string TimeoutTableName = "TheTimeout"; - private const string DeadlockTableName = "TheDeadlock"; - private const string MasterTableName = "TheMaster"; - private const string SlaveTableName = "TheSlave"; - private const string UniqueTableName = "TheUnique"; - private const string CheckedTableName = "TheChecked"; - - private Schema schema; - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - schema = ExtractDefaultSchema(); - EnsureTableNotExists(schema, TimeoutTableName); - EnsureTableNotExists(schema, DeadlockTableName); - EnsureTableNotExists(schema, SlaveTableName); - EnsureTableNotExists(schema, MasterTableName); - EnsureTableNotExists(schema, UniqueTableName); - EnsureTableNotExists(schema, CheckedTableName); - } - - public override void TearDown() - { - if (Connection.ActiveTransaction!=null) - Connection.Rollback(); - } - - [Test] - public virtual void SyntaxErrorTest() - { - AssertExceptionType(Connection, "select lolwut??!", SqlExceptionType.SyntaxError); - } - - [Test] - public virtual void CheckConstraintTest() - { - var table = schema.CreateTable(CheckedTableName); - CreatePrimaryKey(table); - var valueColumn1 = table.CreateColumn("value1", Driver.TypeMappings[typeof (int)].MapType()); - valueColumn1.IsNullable = true; - var valueColumn2 = table.CreateColumn("value2", Driver.TypeMappings[typeof (int)].MapType()); - valueColumn2.IsNullable = false; - - var tableRef = SqlDml.TableRef(table); - table.CreateCheckConstraint("check_me", tableRef[valueColumn1.Name] > 0); - - ExecuteNonQuery(SqlDdl.Create(table)); - - // violation of NOT NULL constraint - var insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef[IdColumnName], 1); - insert.Values.Add(tableRef[valueColumn1.Name], 1); - insert.Values.Add(tableRef[valueColumn2.Name], SqlDml.Null); - AssertExceptionType(insert, SqlExceptionType.CheckConstraintViolation); - - // violation of CHECK constraint - insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef[IdColumnName], 2); - insert.Values.Add(tableRef[valueColumn1.Name], 0); - insert.Values.Add(tableRef[valueColumn2.Name], 0); - AssertExceptionType(insert, SqlExceptionType.CheckConstraintViolation); - } - - [Test] - public virtual void ReferentialConstraintTest() - { - var masterTable = schema.CreateTable(MasterTableName); - var masterId = CreatePrimaryKey(masterTable); - var slaveTable = schema.CreateTable(SlaveTableName); - var slaveId = CreatePrimaryKey(slaveTable); - var fk = slaveTable.CreateForeignKey("foreign_me"); - fk.ReferencedTable = masterTable; - fk.ReferencedColumns.Add(masterId); - fk.Columns.Add(slaveId); - ExecuteNonQuery(SqlDdl.Create(masterTable)); - ExecuteNonQuery(SqlDdl.Create(slaveTable)); - - var slaveTableRef = SqlDml.TableRef(slaveTable); - var slaveInsert = SqlDml.Insert(slaveTableRef); - slaveInsert.Values.Add(slaveTableRef[IdColumnName], 1); - AssertExceptionType(slaveInsert, SqlExceptionType.ReferentialConstraintViolation); - - var masterTableRef = SqlDml.TableRef(masterTable); - var masterInsert = SqlDml.Insert(masterTableRef); - masterInsert.Values.Add(masterTableRef[IdColumnName], 1); - ExecuteNonQuery(masterInsert); - ExecuteNonQuery(slaveInsert); - - var masterDelete = SqlDml.Delete(masterTableRef); - masterDelete.Where = masterTableRef[IdColumnName]==1; - AssertExceptionType(masterDelete, SqlExceptionType.ReferentialConstraintViolation); - } - - [Test] - public virtual void UniqueConstraintTestTest() - { - var table = schema.CreateTable(UniqueTableName); - CreatePrimaryKey(table); - var column = table.CreateColumn("value", Driver.TypeMappings[typeof (int)].MapType()); - column.IsNullable = true; - table.CreateUniqueConstraint("unique_me", column); - ExecuteNonQuery(SqlDdl.Create(table)); - - var tableRef = SqlDml.TableRef(table); - var insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef[IdColumnName], 1); - - // violation of PRIMARY KEY constraint - ExecuteNonQuery(insert); - AssertExceptionType(insert, SqlExceptionType.UniqueConstraintViolation); - - // violation of UNIQUE constraint - insert.Values.Clear(); - insert.Values.Add(tableRef[IdColumnName], 2); - insert.Values.Add(tableRef[column.Name], 0); - ExecuteNonQuery(insert); - - insert.Values.Clear(); - insert.Values.Add(tableRef[IdColumnName], 3); - insert.Values.Add(tableRef[column.Name], 0); - AssertExceptionType(insert, SqlExceptionType.UniqueConstraintViolation); - } - - [Test] - public virtual void DeadlockTest() - { - var table = schema.CreateTable(DeadlockTableName); - CreatePrimaryKey(table); - var column = table.CreateColumn("value", Driver.TypeMappings[typeof (int)].MapType()); - column.IsNullable = true; - ExecuteNonQuery(SqlDdl.Create(table)); - - Connection.BeginTransaction(); - var tableRef = SqlDml.TableRef(table); - var insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef[IdColumnName], 1); - ExecuteNonQuery(insert); - insert.Values.Clear(); - insert.Values.Add(tableRef[IdColumnName], 2); - ExecuteNonQuery(insert); - Connection.Commit(); - - var update1To1 = SqlDml.Update(tableRef); - update1To1.Where = tableRef[IdColumnName]==1; - update1To1.Values.Add(tableRef[column.Name], 1); - - var update1To2 = SqlDml.Update(tableRef); - update1To2.Where = tableRef[IdColumnName]==1; - update1To2.Values.Add(tableRef[column.Name], 2); - - var update2To1 = SqlDml.Update(tableRef); - update2To1.Where = tableRef[IdColumnName]==2; - update2To1.Values.Add(tableRef[column.Name], 1); - - var update2To2 = SqlDml.Update(tableRef); - update2To2.Where = tableRef[IdColumnName]==2; - update2To2.Values.Add(tableRef[column.Name], 2); - using (var connectionOne = this.Driver.CreateConnection()) { - connectionOne.Open(); - connectionOne.BeginTransaction(IsolationLevel.ReadCommitted); - - using (var connectionTwo = Driver.CreateConnection()) { - connectionTwo.Open(); - connectionTwo.BeginTransaction(IsolationLevel.ReadCommitted); - - using (var command = connectionOne.CreateCommand(update1To1)) - command.ExecuteNonQuery(); - using (var command = connectionTwo.CreateCommand(update2To2)) - command.ExecuteNonQuery(); - - var startEvent = new EventWaitHandle(false, EventResetMode.ManualReset); - var arg1 = new EvilThreadArgument - { - Connection = connectionOne, - StartEvent = startEvent, - Statement = update2To1 - }; - var arg2 = new EvilThreadArgument - { - Connection = connectionTwo, - StartEvent = startEvent, - Statement = update1To2 - }; - var thread1 = StartEvilThread(arg1); - var thread2 = StartEvilThread(arg2); - startEvent.Set(); - thread1.Join(); - thread2.Join(); - startEvent.Close(); - var actual = arg1.ExceptionType ?? arg2.ExceptionType ?? SqlExceptionType.Unknown; - AssertExceptionType(SqlExceptionType.Deadlock, actual); - } - } - } - - [Test] - public virtual void TimeoutTest() - { - var table = schema.CreateTable(TimeoutTableName); - CreatePrimaryKey(table); - ExecuteNonQuery(SqlDdl.Create(table)); - - var tableRef = SqlDml.TableRef(table); - var insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef[IdColumnName], 1); - using (var connectionOne = Driver.CreateConnection()) { - connectionOne.Open(); - connectionOne.BeginTransaction(); - using (var connectionTwo = Driver.CreateConnection()) { - connectionTwo.Open(); - connectionTwo.BeginTransaction(IsolationLevel.ReadCommitted); - using (var command = connectionTwo.CreateCommand(insert)) - command.ExecuteNonQuery(); - AssertExceptionType(connectionOne, insert, SqlExceptionType.OperationTimeout); - } - } - } - - [Test, Ignore("Test is not implemented")] - public virtual void SerializationFailureTest() - { - } - - private static Thread StartEvilThread(EvilThreadArgument arg) - { - ThreadStart entry = () => { - arg.ExceptionType = null; - try { - using (var command = arg.Connection.CreateCommand(arg.Statement)) { - arg.StartEvent.WaitOne(); - command.ExecuteNonQuery(); - } - } - catch (Exception exception) { - arg.ExceptionType = arg.Connection.Driver.GetExceptionType(exception); - } - arg.Connection.Rollback(); - }; - - var thread = new Thread(entry); - thread.Start(); - return thread; - } - - protected virtual void AssertExceptionType(SqlExceptionType expected, SqlExceptionType actual) - { - Assert.AreEqual(expected, actual); - } - - private void AssertExceptionType(ISqlCompileUnit statement, SqlExceptionType expectedExceptionType) - { - AssertExceptionType(Connection, statement, expectedExceptionType); - } - - private void AssertExceptionType(SqlConnection connection, ISqlCompileUnit statement, SqlExceptionType expectedExceptionType) - { - var commandText = Driver.Compile(statement).GetCommandText(); - AssertExceptionType(connection, commandText, expectedExceptionType); - } - - private void AssertExceptionType(SqlConnection connection, string commandText, SqlExceptionType expectedExceptionType) - { - try { - ExecuteNonQuery(connection, commandText); - } - catch (Exception exception) { - AssertExceptionType(expectedExceptionType, Driver.GetExceptionType(exception)); - return; - } - Assert.Fail("Exception was not thrown"); - } - - private TableColumn CreatePrimaryKey(Table table) - { - var column = table.CreateColumn(IdColumnName, Driver.TypeMappings[typeof (int)].MapType()); - table.CreatePrimaryKey("pk_" + table.Name, column); - return column; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.08 + +using System; +using System.Data; +using System.Threading; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class ExceptionTypesTest : SqlTest + { + private class EvilThreadArgument + { + public SqlConnection Connection; + public ISqlCompileUnit Statement; + public WaitHandle StartEvent; + public SqlExceptionType? ExceptionType; + } + + private const string IdColumnName = "id"; + private const string TimeoutTableName = "TheTimeout"; + private const string DeadlockTableName = "TheDeadlock"; + private const string MasterTableName = "TheMaster"; + private const string SlaveTableName = "TheSlave"; + private const string UniqueTableName = "TheUnique"; + private const string CheckedTableName = "TheChecked"; + + private Schema schema; + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + schema = ExtractDefaultSchema(); + EnsureTableNotExists(schema, TimeoutTableName); + EnsureTableNotExists(schema, DeadlockTableName); + EnsureTableNotExists(schema, SlaveTableName); + EnsureTableNotExists(schema, MasterTableName); + EnsureTableNotExists(schema, UniqueTableName); + EnsureTableNotExists(schema, CheckedTableName); + } + + public override void TearDown() + { + if (Connection.ActiveTransaction!=null) + Connection.Rollback(); + } + + [Test] + public virtual void SyntaxErrorTest() + { + AssertExceptionType(Connection, "select lolwut??!", SqlExceptionType.SyntaxError); + } + + [Test] + public virtual void CheckConstraintTest() + { + var table = schema.CreateTable(CheckedTableName); + CreatePrimaryKey(table); + var valueColumn1 = table.CreateColumn("value1", Driver.TypeMappings[typeof (int)].MapType()); + valueColumn1.IsNullable = true; + var valueColumn2 = table.CreateColumn("value2", Driver.TypeMappings[typeof (int)].MapType()); + valueColumn2.IsNullable = false; + + var tableRef = SqlDml.TableRef(table); + table.CreateCheckConstraint("check_me", tableRef[valueColumn1.Name] > 0); + + ExecuteNonQuery(SqlDdl.Create(table)); + + // violation of NOT NULL constraint + var insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef[IdColumnName], 1); + insert.Values.Add(tableRef[valueColumn1.Name], 1); + insert.Values.Add(tableRef[valueColumn2.Name], SqlDml.Null); + AssertExceptionType(insert, SqlExceptionType.CheckConstraintViolation); + + // violation of CHECK constraint + insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef[IdColumnName], 2); + insert.Values.Add(tableRef[valueColumn1.Name], 0); + insert.Values.Add(tableRef[valueColumn2.Name], 0); + AssertExceptionType(insert, SqlExceptionType.CheckConstraintViolation); + } + + [Test] + public virtual void ReferentialConstraintTest() + { + var masterTable = schema.CreateTable(MasterTableName); + var masterId = CreatePrimaryKey(masterTable); + var slaveTable = schema.CreateTable(SlaveTableName); + var slaveId = CreatePrimaryKey(slaveTable); + var fk = slaveTable.CreateForeignKey("foreign_me"); + fk.ReferencedTable = masterTable; + fk.ReferencedColumns.Add(masterId); + fk.Columns.Add(slaveId); + ExecuteNonQuery(SqlDdl.Create(masterTable)); + ExecuteNonQuery(SqlDdl.Create(slaveTable)); + + var slaveTableRef = SqlDml.TableRef(slaveTable); + var slaveInsert = SqlDml.Insert(slaveTableRef); + slaveInsert.Values.Add(slaveTableRef[IdColumnName], 1); + AssertExceptionType(slaveInsert, SqlExceptionType.ReferentialConstraintViolation); + + var masterTableRef = SqlDml.TableRef(masterTable); + var masterInsert = SqlDml.Insert(masterTableRef); + masterInsert.Values.Add(masterTableRef[IdColumnName], 1); + ExecuteNonQuery(masterInsert); + ExecuteNonQuery(slaveInsert); + + var masterDelete = SqlDml.Delete(masterTableRef); + masterDelete.Where = masterTableRef[IdColumnName]==1; + AssertExceptionType(masterDelete, SqlExceptionType.ReferentialConstraintViolation); + } + + [Test] + public virtual void UniqueConstraintTestTest() + { + var table = schema.CreateTable(UniqueTableName); + CreatePrimaryKey(table); + var column = table.CreateColumn("value", Driver.TypeMappings[typeof (int)].MapType()); + column.IsNullable = true; + table.CreateUniqueConstraint("unique_me", column); + ExecuteNonQuery(SqlDdl.Create(table)); + + var tableRef = SqlDml.TableRef(table); + var insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef[IdColumnName], 1); + + // violation of PRIMARY KEY constraint + ExecuteNonQuery(insert); + AssertExceptionType(insert, SqlExceptionType.UniqueConstraintViolation); + + // violation of UNIQUE constraint + insert.Values.Clear(); + insert.Values.Add(tableRef[IdColumnName], 2); + insert.Values.Add(tableRef[column.Name], 0); + ExecuteNonQuery(insert); + + insert.Values.Clear(); + insert.Values.Add(tableRef[IdColumnName], 3); + insert.Values.Add(tableRef[column.Name], 0); + AssertExceptionType(insert, SqlExceptionType.UniqueConstraintViolation); + } + + [Test] + public virtual void DeadlockTest() + { + var table = schema.CreateTable(DeadlockTableName); + CreatePrimaryKey(table); + var column = table.CreateColumn("value", Driver.TypeMappings[typeof (int)].MapType()); + column.IsNullable = true; + ExecuteNonQuery(SqlDdl.Create(table)); + + Connection.BeginTransaction(); + var tableRef = SqlDml.TableRef(table); + var insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef[IdColumnName], 1); + ExecuteNonQuery(insert); + insert.Values.Clear(); + insert.Values.Add(tableRef[IdColumnName], 2); + ExecuteNonQuery(insert); + Connection.Commit(); + + var update1To1 = SqlDml.Update(tableRef); + update1To1.Where = tableRef[IdColumnName]==1; + update1To1.Values.Add(tableRef[column.Name], 1); + + var update1To2 = SqlDml.Update(tableRef); + update1To2.Where = tableRef[IdColumnName]==1; + update1To2.Values.Add(tableRef[column.Name], 2); + + var update2To1 = SqlDml.Update(tableRef); + update2To1.Where = tableRef[IdColumnName]==2; + update2To1.Values.Add(tableRef[column.Name], 1); + + var update2To2 = SqlDml.Update(tableRef); + update2To2.Where = tableRef[IdColumnName]==2; + update2To2.Values.Add(tableRef[column.Name], 2); + using (var connectionOne = this.Driver.CreateConnection()) { + connectionOne.Open(); + connectionOne.BeginTransaction(IsolationLevel.ReadCommitted); + + using (var connectionTwo = Driver.CreateConnection()) { + connectionTwo.Open(); + connectionTwo.BeginTransaction(IsolationLevel.ReadCommitted); + + using (var command = connectionOne.CreateCommand(update1To1)) + command.ExecuteNonQuery(); + using (var command = connectionTwo.CreateCommand(update2To2)) + command.ExecuteNonQuery(); + + var startEvent = new EventWaitHandle(false, EventResetMode.ManualReset); + var arg1 = new EvilThreadArgument + { + Connection = connectionOne, + StartEvent = startEvent, + Statement = update2To1 + }; + var arg2 = new EvilThreadArgument + { + Connection = connectionTwo, + StartEvent = startEvent, + Statement = update1To2 + }; + var thread1 = StartEvilThread(arg1); + var thread2 = StartEvilThread(arg2); + startEvent.Set(); + thread1.Join(); + thread2.Join(); + startEvent.Close(); + var actual = arg1.ExceptionType ?? arg2.ExceptionType ?? SqlExceptionType.Unknown; + AssertExceptionType(SqlExceptionType.Deadlock, actual); + } + } + } + + [Test] + public virtual void TimeoutTest() + { + var table = schema.CreateTable(TimeoutTableName); + CreatePrimaryKey(table); + ExecuteNonQuery(SqlDdl.Create(table)); + + var tableRef = SqlDml.TableRef(table); + var insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef[IdColumnName], 1); + using (var connectionOne = Driver.CreateConnection()) { + connectionOne.Open(); + connectionOne.BeginTransaction(); + using (var connectionTwo = Driver.CreateConnection()) { + connectionTwo.Open(); + connectionTwo.BeginTransaction(IsolationLevel.ReadCommitted); + using (var command = connectionTwo.CreateCommand(insert)) + command.ExecuteNonQuery(); + AssertExceptionType(connectionOne, insert, SqlExceptionType.OperationTimeout); + } + } + } + + [Test, Ignore("Test is not implemented")] + public virtual void SerializationFailureTest() + { + } + + private static Thread StartEvilThread(EvilThreadArgument arg) + { + ThreadStart entry = () => { + arg.ExceptionType = null; + try { + using (var command = arg.Connection.CreateCommand(arg.Statement)) { + arg.StartEvent.WaitOne(); + command.ExecuteNonQuery(); + } + } + catch (Exception exception) { + arg.ExceptionType = arg.Connection.Driver.GetExceptionType(exception); + } + arg.Connection.Rollback(); + }; + + var thread = new Thread(entry); + thread.Start(); + return thread; + } + + protected virtual void AssertExceptionType(SqlExceptionType expected, SqlExceptionType actual) + { + Assert.AreEqual(expected, actual); + } + + private void AssertExceptionType(ISqlCompileUnit statement, SqlExceptionType expectedExceptionType) + { + AssertExceptionType(Connection, statement, expectedExceptionType); + } + + private void AssertExceptionType(SqlConnection connection, ISqlCompileUnit statement, SqlExceptionType expectedExceptionType) + { + var commandText = Driver.Compile(statement).GetCommandText(); + AssertExceptionType(connection, commandText, expectedExceptionType); + } + + private void AssertExceptionType(SqlConnection connection, string commandText, SqlExceptionType expectedExceptionType) + { + try { + ExecuteNonQuery(connection, commandText); + } + catch (Exception exception) { + AssertExceptionType(expectedExceptionType, Driver.GetExceptionType(exception)); + return; + } + Assert.Fail("Exception was not thrown"); + } + + private TableColumn CreatePrimaryKey(Table table) + { + var column = table.CreateColumn(IdColumnName, Driver.TypeMappings[typeof (int)].MapType()); + table.CreatePrimaryKey("pk_" + table.Name, column); + return column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/CompilerTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/CompilerTest.cs index 55b8a975de..b030505552 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/CompilerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/CompilerTest.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.06 - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class CompilerTest : Sql.CompilerTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.06 + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class CompilerTest : Sql.CompilerTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/DateTimeIntervalTest.cs index 738833baba..3e3b2ee002 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/DateTimeIntervalTest.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.22 - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - public override void SetUp() - { - TestHelpers.StartTraceToLogFile(this); - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - TestHelpers.StopTraceToLogFile(this); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.22 + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + public override void SetUp() + { + TestHelpers.StartTraceToLogFile(this); + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + TestHelpers.StopTraceToLogFile(this); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExceptionTypesTest.cs index c115ed67ea..a52469db5f 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExceptionTypesTest.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.21 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class ExceptionTypesTest : Sql.ExceptionTypesTest - { - public override void SetUp() - { - TestHelpers.StartTraceToLogFile(this); - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - TestHelpers.StopTraceToLogFile(this); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.21 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class ExceptionTypesTest : Sql.ExceptionTypesTest + { + public override void SetUp() + { + TestHelpers.StartTraceToLogFile(this); + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + TestHelpers.StopTraceToLogFile(this); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExtractorTest.cs index 0dade46a9f..cd15f3e060 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/ExtractorTest.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.13 - -using NUnit.Framework; -using System; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class ExtractorTest : SqlTest - { - [Test] - public void BaseTest() - { - var schema = ExtractDefaultSchema(); - } - - public override void SetUp() - { - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.13 + +using NUnit.Framework; +using System; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class ExtractorTest : SqlTest + { + [Test] + public void BaseTest() + { + var schema = ExtractDefaultSchema(); + } + + public override void SetUp() + { + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/IndexTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/IndexTest.cs index 10298651c0..22908d4cd5 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/IndexTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/IndexTest.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.24 - -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class IndexTest : Sql.IndexTest - { - public override void SetUp() - { - TestHelpers.StartTraceToLogFile(this); - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - TestHelpers.StopTraceToLogFile(this); - } - - protected override void CreateTable() - { - Table t; - t = schema.CreateTable(TableName); - t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); - t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); - ExecuteNonQuery(SqlDdl.Create(t)); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - - [Test] - public override void CreateExpressionIndexTest() - { - // Creating index - var t = schema.Tables[TableName]; - var i = t.CreateIndex(ExpressionIndexName); - var tr = SqlDml.TableRef(t); - i.CreateIndexColumn(SqlDml.Concat(tr["first"], " ", tr["second"])); - ExecuteNonQuery(SqlDdl.Create(i)); - - // Extracting index and checking its properties - var c2 = ExtractCatalog(); - var s2 = c2.DefaultSchema; - var t2 = s2.Tables[TableName]; - var i2 = t2.Indexes[ExpressionIndexName]; - Assert.IsNotNull(i2); - Assert.AreEqual(1, i2.Columns.Count); - - Assert.IsTrue(!i2.Columns[0].Expression.IsNullReference()); - } - - [Test, Ignore("Test is not implemented")] - public override void CreateFilteredIndexTest() - { - } - } -} - +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.24 + +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class IndexTest : Sql.IndexTest + { + public override void SetUp() + { + TestHelpers.StartTraceToLogFile(this); + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + TestHelpers.StopTraceToLogFile(this); + } + + protected override void CreateTable() + { + Table t; + t = schema.CreateTable(TableName); + t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); + t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); + ExecuteNonQuery(SqlDdl.Create(t)); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + + [Test] + public override void CreateExpressionIndexTest() + { + // Creating index + var t = schema.Tables[TableName]; + var i = t.CreateIndex(ExpressionIndexName); + var tr = SqlDml.TableRef(t); + i.CreateIndexColumn(SqlDml.Concat(tr["first"], " ", tr["second"])); + ExecuteNonQuery(SqlDdl.Create(i)); + + // Extracting index and checking its properties + var c2 = ExtractCatalog(); + var s2 = c2.DefaultSchema; + var t2 = s2.Tables[TableName]; + var i2 = t2.Indexes[ExpressionIndexName]; + Assert.IsNotNull(i2); + Assert.AreEqual(1, i2.Columns.Count); + + Assert.IsTrue(!i2.Columns[0].Expression.IsNullReference()); + } + + [Test, Ignore("Test is not implemented")] + public override void CreateFilteredIndexTest() + { + } + } +} + diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/QueryTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/QueryTest.cs index ac4d38ae15..c3e19b4997 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/QueryTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/QueryTest.cs @@ -1,47 +1,47 @@ -using System; -using NUnit.Framework; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - [TestFixture, Explicit] - public class QueryTest : SqlTest - { - public override void SetUp() - { - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - } - - [Test] - public void PagingTest() - { - var schema = ExtractDefaultSchema(); - var table = schema.CreateTable("Some"); - table.CreateColumn("ID", new SqlValueType(SqlType.UInt64)); - table.CreateColumn("Name", new SqlValueType(SqlType.VarChar, 255)); - - var tableRef = SqlDml.TableRef(table); - var select = SqlDml.Select(tableRef); - select.Columns.AddRange(tableRef[0], tableRef[1]); - select.Limit = 5; - select.Offset = 3; - - var result = Connection.Driver.Compile(select); - using (var command = Connection.CreateCommand()) { - command.CommandText = result.GetCommandText(); - Console.Out.WriteLine(command.CommandText); -// int count = Convert.ToInt32(command.ExecuteScalar()); -// Assert.AreEqual(2, count); - } - } - } +using System; +using NUnit.Framework; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + [TestFixture, Explicit] + public class QueryTest : SqlTest + { + public override void SetUp() + { + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + } + + [Test] + public void PagingTest() + { + var schema = ExtractDefaultSchema(); + var table = schema.CreateTable("Some"); + table.CreateColumn("ID", new SqlValueType(SqlType.UInt64)); + table.CreateColumn("Name", new SqlValueType(SqlType.VarChar, 255)); + + var tableRef = SqlDml.TableRef(table); + var select = SqlDml.Select(tableRef); + select.Columns.AddRange(tableRef[0], tableRef[1]); + select.Limit = 5; + select.Offset = 3; + + var result = Connection.Driver.Compile(select); + using (var command = Connection.CreateCommand()) { + command.CommandText = result.GetCommandText(); + Console.Out.WriteLine(command.CommandText); +// int count = Convert.ToInt32(command.ExecuteScalar()); +// Assert.AreEqual(2, count); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/SavepointTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/SavepointTest.cs index 799416711f..d8ffd93553 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/SavepointTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/SavepointTest.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.21 - -using NUnit.Framework; -using System; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class SavepointTest : SavepointsTest - { - public override void SetUp() - { - TestHelpers.StartTraceToLogFile(this); - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - TestHelpers.StopTraceToLogFile(this); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.21 + +using NUnit.Framework; +using System; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class SavepointTest : SavepointsTest + { + public override void SetUp() + { + TestHelpers.StartTraceToLogFile(this); + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + TestHelpers.StopTraceToLogFile(this); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/TestHelpers.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/TestHelpers.cs index cb7fd4df42..8cf1ea0d9a 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/TestHelpers.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/TestHelpers.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.21 - -using System.Data.Common; -using System.Diagnostics; -using System.Collections.Generic; -using System; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public static class TestHelpers - { - private static Dictionary testListeners; - private static Dictionary TestListeners - { - get - { - if (testListeners == null) - testListeners = new Dictionary(); - return testListeners; - } - } - - public static void StartTraceToLogFile(object test, string filename = null) - { - //if (string.IsNullOrWhiteSpace(filename)) - // filename = "c:\\" + test.GetType().FullName + ".Log.txt"; - //System.IO.File.Delete(filename); - //TraceListener tl = new TextWriterTraceListener(filename); - //TestListeners.Add(test, tl); - //Debug.Listeners.Add(tl); - //Debug.WriteLine(test.GetType().FullName + " started at " + DateTime.Now.ToLocalTime()); - //Debug.Flush(); - } - - public static void StopTraceToLogFile(object test) - { - //TraceListener tl = TestListeners[test]; - //Debug.WriteLine(test.GetType().FullName + " finished at " + DateTime.Now.ToLocalTime()); - //tl.Flush(); - //tl.Close(); - //Debug.Listeners.Remove(tl); - //TestListeners.Remove(test); - //tl.Dispose(); - //tl = null; - } - - public static void dump(DbCommand command) - { - //System.Diagnostics.Debug.WriteLine("Command Dump"); - //System.Diagnostics.Debug.WriteLine(command.CommandText); - //System.Diagnostics.Debug.Indent(); - //foreach (DbParameter p in command.Parameters) - // System.Diagnostics.Debug.WriteLine(string.Format("{0}|{1}|{2}|{3}|{4}", p.ParameterName, p.DbType, p.Direction, p.Size, p.Value == null ? "" : p.Value)); - //System.Diagnostics.Debug.Unindent(); - //System.Diagnostics.Debug.Flush(); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.21 + +using System.Data.Common; +using System.Diagnostics; +using System.Collections.Generic; +using System; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public static class TestHelpers + { + private static Dictionary testListeners; + private static Dictionary TestListeners + { + get + { + if (testListeners == null) + testListeners = new Dictionary(); + return testListeners; + } + } + + public static void StartTraceToLogFile(object test, string filename = null) + { + //if (string.IsNullOrWhiteSpace(filename)) + // filename = "c:\\" + test.GetType().FullName + ".Log.txt"; + //System.IO.File.Delete(filename); + //TraceListener tl = new TextWriterTraceListener(filename); + //TestListeners.Add(test, tl); + //Debug.Listeners.Add(tl); + //Debug.WriteLine(test.GetType().FullName + " started at " + DateTime.Now.ToLocalTime()); + //Debug.Flush(); + } + + public static void StopTraceToLogFile(object test) + { + //TraceListener tl = TestListeners[test]; + //Debug.WriteLine(test.GetType().FullName + " finished at " + DateTime.Now.ToLocalTime()); + //tl.Flush(); + //tl.Close(); + //Debug.Listeners.Remove(tl); + //TestListeners.Remove(test); + //tl.Dispose(); + //tl = null; + } + + public static void dump(DbCommand command) + { + //System.Diagnostics.Debug.WriteLine("Command Dump"); + //System.Diagnostics.Debug.WriteLine(command.CommandText); + //System.Diagnostics.Debug.Indent(); + //foreach (DbParameter p in command.Parameters) + // System.Diagnostics.Debug.WriteLine(string.Format("{0}|{1}|{2}|{3}|{4}", p.ParameterName, p.DbType, p.Direction, p.Size, p.Value == null ? "" : p.Value)); + //System.Diagnostics.Debug.Unindent(); + //System.Diagnostics.Debug.Flush(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Firebird/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Firebird/TypeMappingTest.cs index dcc3169d71..5a083c9b14 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Firebird/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Firebird/TypeMappingTest.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Csaba Beer -// Created: 2011.01.19 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Firebird -{ - public class TypeMappingTest : Sql.TypeMappingTest - { - public override void SetUp() - { - base.SetUp(); - // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute - RealTestFixtureSetUp(); - TestHelpers.StartTraceToLogFile(this); - } - - public override void TearDown() - { - base.TearDown(); - // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute - RealTestFixtureTearDown(); - TestHelpers.StopTraceToLogFile(this); - } - - protected override void CheckEquality(object expected, object actual) - { - if (expected is char || actual is char) - base.CheckEquality(expected ?? default(char), actual ?? default(char)); - else - base.CheckEquality(expected, actual); - //var arrayValue = expected as byte[]; - //var stringValue = expected as string; - //var charValue = expected as char?; - - //bool nullExpected = - // arrayValue != null && arrayValue.Length == 0 || - // stringValue != null && stringValue.Length == 0 || - // charValue != null && charValue == default(char); - - //if (nullExpected) - // Assert.IsNull(actual); - //else - // base.CheckEquality(expected, actual); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Firebird); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Csaba Beer +// Created: 2011.01.19 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Firebird +{ + public class TypeMappingTest : Sql.TypeMappingTest + { + public override void SetUp() + { + base.SetUp(); + // hack because Visual Nunit doesn't use TestFixtureSetUp attribute, just SetUp attribute + RealTestFixtureSetUp(); + TestHelpers.StartTraceToLogFile(this); + } + + public override void TearDown() + { + base.TearDown(); + // hack because Visual Nunit doesn't use TestFixtureTearDown attribute, just TearDown attribute + RealTestFixtureTearDown(); + TestHelpers.StopTraceToLogFile(this); + } + + protected override void CheckEquality(object expected, object actual) + { + if (expected is char || actual is char) + base.CheckEquality(expected ?? default(char), actual ?? default(char)); + else + base.CheckEquality(expected, actual); + //var arrayValue = expected as byte[]; + //var stringValue = expected as string; + //var charValue = expected as char?; + + //bool nullExpected = + // arrayValue != null && arrayValue.Length == 0 || + // stringValue != null && stringValue.Length == 0 || + // charValue != null && charValue == default(char); + + //if (nullExpected) + // Assert.IsNull(actual); + //else + // base.CheckEquality(expected, actual); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Firebird); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/IndexTest.cs b/Orm/Xtensive.Orm.Tests.Sql/IndexTest.cs index cde7df4cf7..39017d0ecc 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/IndexTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/IndexTest.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - [Serializable] - [TestFixture] - public abstract class IndexTest : SqlTest - { - protected const string TableName = "index_table"; - protected const string ExpressionIndexName = "IX_EXPRESSION"; - protected const string FilteredIndexName = "IX_FILTERED"; - protected Schema schema; - protected Catalog catalog; - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - catalog = ExtractCatalog(); - schema = catalog.DefaultSchema; - Table t = schema.Tables[TableName]; - if (t!=null) { - ExecuteNonQuery(SqlDdl.Drop(t)); - schema.Tables.Remove(t); - } - - CreateTable(); - } - - protected override void TestFixtureTearDown() - { - if (schema!=null) { - Table t = schema.Tables[TableName]; - if (t!=null) - ExecuteNonQuery(SqlDdl.Drop(t)); - } - base.TestFixtureTearDown(); - } - - protected abstract void CreateTable(); - - [Test] - public abstract void CreateExpressionIndexTest(); - - [Test] - public virtual void CreateFilteredIndexTest() - { - // Creating index - var t = schema.Tables[TableName]; - var i = t.CreateIndex(FilteredIndexName); - i.CreateIndexColumn(t.TableColumns["first"]); - i.CreateIndexColumn(t.TableColumns["second"]); - var tr = SqlDml.TableRef(t); - i.Where = SqlDml.IsNotNull(tr["first"]) && SqlDml.IsNotNull(tr["second"]); - ExecuteNonQuery(SqlDdl.Create(i)); - - // Extracting index and checking its properties - var c2 = ExtractCatalog(); - var s2 = c2.DefaultSchema; - var t2 = s2.Tables[TableName]; - var i2 = t2.Indexes[FilteredIndexName]; - Assert.IsNotNull(i2); - Assert.AreEqual(2, i2.Columns.Count); - Assert.IsTrue(!i2.Where.IsNullReference()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + [Serializable] + [TestFixture] + public abstract class IndexTest : SqlTest + { + protected const string TableName = "index_table"; + protected const string ExpressionIndexName = "IX_EXPRESSION"; + protected const string FilteredIndexName = "IX_FILTERED"; + protected Schema schema; + protected Catalog catalog; + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + catalog = ExtractCatalog(); + schema = catalog.DefaultSchema; + Table t = schema.Tables[TableName]; + if (t!=null) { + ExecuteNonQuery(SqlDdl.Drop(t)); + schema.Tables.Remove(t); + } + + CreateTable(); + } + + protected override void TestFixtureTearDown() + { + if (schema!=null) { + Table t = schema.Tables[TableName]; + if (t!=null) + ExecuteNonQuery(SqlDdl.Drop(t)); + } + base.TestFixtureTearDown(); + } + + protected abstract void CreateTable(); + + [Test] + public abstract void CreateExpressionIndexTest(); + + [Test] + public virtual void CreateFilteredIndexTest() + { + // Creating index + var t = schema.Tables[TableName]; + var i = t.CreateIndex(FilteredIndexName); + i.CreateIndexColumn(t.TableColumns["first"]); + i.CreateIndexColumn(t.TableColumns["second"]); + var tr = SqlDml.TableRef(t); + i.Where = SqlDml.IsNotNull(tr["first"]) && SqlDml.IsNotNull(tr["second"]); + ExecuteNonQuery(SqlDdl.Create(i)); + + // Extracting index and checking its properties + var c2 = ExtractCatalog(); + var s2 = c2.DefaultSchema; + var t2 = s2.Tables[TableName]; + var i2 = t2.Indexes[FilteredIndexName]; + Assert.IsNotNull(i2); + Assert.AreEqual(2, i2.Columns.Count); + Assert.IsTrue(!i2.Where.IsNullReference()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/MakeNamesUnreadableTest.cs b/Orm/Xtensive.Orm.Tests.Sql/MakeNamesUnreadableTest.cs index e589671aa1..c91d172fca 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MakeNamesUnreadableTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MakeNamesUnreadableTest.cs @@ -1,463 +1,463 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2017.03.24 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - public class MakeNamesUnreadableTest : SqlTest - { - private const string TableName = "DenyNamesReadingTest"; - private const string CatalogName = "DO-Tests"; - private const string SchemaName = "dbo"; - private const string DummySchemaName = "DummySchema"; - private const string DummyDatabaseName = "DummyDatabase"; - - [Test] - public void ReadingNamesTest() - { - var defaultSchema = GetSchema(); - Catalog catalog = null; - Assert.DoesNotThrow(() => catalog = defaultSchema.Catalog); - Table table = null; - Assert.DoesNotThrow(() => table = defaultSchema.Tables[TableName]); - - Assert.DoesNotThrow(() => {var catalogName = catalog.Name;}); - Assert.DoesNotThrow(() => {var catalogDbName = catalog.DbName;}); - - Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal();}); - Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal();}); - - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.Name; }); - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.DbName;}); - - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); - - Assert.DoesNotThrow(() => {var schemaName = table.Name;}); - Assert.DoesNotThrow(() => {var schemaName = table.DbName;}); - - catalog.MakeNamesUnreadable(); - - Assert.Throws(() => {var catalogName = catalog.Name;}); - Assert.Throws(() => {var catalogDbName = catalog.DbName;}); - - Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal();}); - Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal();}); - - Assert.Throws(() => {var schemaName = defaultSchema.Name;}); - Assert.Throws(() => {var schemaName = defaultSchema.DbName;}); - - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); - - Assert.DoesNotThrow(() => {var schemaName = table.Name; }); - Assert.DoesNotThrow(() => {var schemaName = table.DbName; }); - } - - [Test] - public void ChangingNamesTest() - { - var defaultSchema = GetSchema(); - Catalog catalog = null; - - Assert.DoesNotThrow(() => catalog = defaultSchema.Catalog); - Table table = null; - Assert.DoesNotThrow(() => table = defaultSchema.Tables[TableName]); - - Assert.DoesNotThrow(() => {var catalogName = catalog.Name; }); - Assert.DoesNotThrow(() => {var catalogDbName = catalog.DbName; }); - - Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal(); }); - Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal(); }); - - var oldCatalogName = catalog.Name; - var oldCatalogDbName = catalog.DbName; - - var newCatalogName = oldCatalogName + "New"; - var newCatalogDbName = oldCatalogDbName + "New"; - - Assert.DoesNotThrow(() => catalog.Name = newCatalogName); - Assert.DoesNotThrow(() => catalog.DbName = newCatalogDbName); - - catalog.Name = oldCatalogName; - catalog.DbName = oldCatalogDbName; - - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.Name;}); - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.DbName;}); - - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); - Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); - - var oldSchemaName = defaultSchema.Name; - var oldSchemaDbName = defaultSchema.DbName; - - var newSchemaName = oldSchemaName + "New"; - var newSchemaDbName = oldSchemaDbName + "New"; - - Assert.DoesNotThrow(() => defaultSchema.Name = newSchemaName); - Assert.DoesNotThrow(() => defaultSchema.DbName = newSchemaDbName); - - defaultSchema.Name = oldSchemaName; - defaultSchema.DbName = oldSchemaDbName; - - Assert.DoesNotThrow(() => {var schemaName = table.Name;}); - Assert.DoesNotThrow(() => {var schemaName = table.DbName;}); - - catalog.MakeNamesUnreadable(); - - Assert.Throws(() => catalog.Name = newCatalogName); - Assert.Throws(() => catalog.DbName = newCatalogDbName); - - Assert.Throws(() => defaultSchema.Name = newSchemaName); - Assert.Throws(() => defaultSchema.DbName = newSchemaDbName); - } - - [Test] - public void TableCreationTest() - { - var defaultSchema = GetSchema(); - - var table = defaultSchema.CreateTable(string.Format("Crt1_{0}", TableName)); - var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); - table.CreatePrimaryKey("PK_Crt_DenyNamesReadingTest", column); - column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); - var createTableQuery = SqlDdl.Create(table); - - TestQueryNamesReadable(createTableQuery, defaultSchema); - } - - [Test] - public void TableCreationUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var table = defaultSchema.CreateTable(string.Format("Crt1_{0}", TableName)); - var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); - table.CreatePrimaryKey("PK_Crt_DenyNamesReadingTest", column); - column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); - var createTableQuery = SqlDdl.Create(table); - - TestQueryNamesUnreadable(createTableQuery, defaultSchema); - } - - [Test] - public void TableAlterTest() - { - var defaultSchema = GetSchema(); - - var table = defaultSchema.Tables[TableName]; - var column = table.CreateColumn("Text", GetServerTypeFor(typeof (string), 255)); - column.IsNullable = true; - var alterTableQuery = SqlDdl.Alter(table, SqlDdl.AddColumn(column)); - - TestQueryNamesReadable(alterTableQuery, defaultSchema); - } - - [Test] - public void TableAlterUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var table = defaultSchema.Tables[TableName]; - var column = table.CreateColumn("Text", GetServerTypeFor(typeof (string), 255)); - column.IsNullable = true; - var alterTableQuery = SqlDdl.Alter(table, SqlDdl.AddColumn(column)); - - TestQueryNamesUnreadable(alterTableQuery, defaultSchema); - } - - [Test] - public void TableDeletionTest() - { - var defaultSchema = GetSchema(); - - var table = defaultSchema.Tables[TableName]; - var dropTableQuery = SqlDdl.Drop(table); - - TestQueryNamesReadable(dropTableQuery, defaultSchema); - } - - [Test] - public void TableDeletionUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var table = defaultSchema.Tables[TableName]; - var dropTableQuery = SqlDdl.Drop(table); - - TestQueryNamesUnreadable(dropTableQuery, defaultSchema); - } - - [Test] - public void RowInsertionTest() - { - var defaultSchema = GetSchema(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var insertQuery = SqlDml.Insert(tableRef); - insertQuery.Values.Add(tableRef["Id"], 1); - insertQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); - - TestQueryNamesReadable(insertQuery, defaultSchema); - } - - [Test] - public void RowInsertionUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var insertQuery = SqlDml.Insert(tableRef); - insertQuery.Values.Add(tableRef["Id"], 1); - insertQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); - - TestQueryNamesUnreadable(insertQuery, defaultSchema); - } - - [Test] - public void RowUpdateTest() - { - var defaultSchema = GetSchema(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var updateQuery = SqlDml.Update(tableRef); - updateQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); - updateQuery.Where = tableRef["Id"]==1; - - TestQueryNamesReadable(updateQuery, defaultSchema); - } - - [Test] - public void RowUpdateUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var updateQuery = SqlDml.Update(tableRef); - updateQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); - updateQuery.Where = tableRef["Id"]==1; - - TestQueryNamesUnreadable(updateQuery, defaultSchema); - } - - [Test] - public void RowDeletionTest() - { - var defaultSchema = GetSchema(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var deleteQuery = SqlDml.Delete(tableRef); - deleteQuery.Where = tableRef["Id"]==1; - - TestQueryNamesReadable(deleteQuery, defaultSchema); - } - - [Test] - public void RowDeletionUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var deleteQuery = SqlDml.Delete(tableRef); - deleteQuery.Where = tableRef["Id"]==1; - - TestQueryNamesUnreadable(deleteQuery, defaultSchema); - } - - [Test] - public void RowSelectionTest() - { - var defaultSchema = GetSchema(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var selectQuery = SqlDml.Select(tableRef); - selectQuery.Where = tableRef["CreationDate"] < DateTime.UtcNow; - - TestQueryNamesReadable(selectQuery, defaultSchema); - } - - [Test] - public void RowSelectionUnreadableNamesTest() - { - var defaultSchema = GetSchema(); - defaultSchema.Catalog.MakeNamesUnreadable(); - - var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); - var selectQuery = SqlDml.Select(tableRef); - selectQuery.Where = tableRef["CreationDate"] < DateTime.UtcNow; - - TestQueryNamesUnreadable(selectQuery, defaultSchema); - } - - private void TestQueryNamesReadable(ISqlCompileUnit query, Schema defaultSchema) - { - string queryText = string.Empty; - - if (MultidatabaseSupported()) { - var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = true}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); - - var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; - var databaseMap =new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = true}; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(DummyDatabaseName), Is.False); - Assert.That(queryText.Contains(DummySchemaName), Is.False); - } - if (MultischemaSupported()) { - var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - - var schemaMap = new Dictionary() { { defaultSchema.GetDbNameInternal(), DummySchemaName } }; - var databaseMap = new Dictionary() { { defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName } }; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) { DatabaseQualifiedObjects = false }; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(DummyDatabaseName), Is.False); - Assert.That(queryText.Contains(DummySchemaName), Is.False); - } - else { - var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - - var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; - var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) { DatabaseQualifiedObjects = false }; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(DummyDatabaseName), Is.False); - Assert.That(queryText.Contains(DummySchemaName), Is.False); - } - } - - private void TestQueryNamesUnreadable(ISqlCompileUnit query, Schema defaultSchema) - { - string queryText = string.Empty; - - if (MultidatabaseSupported()) { - Assert.Throws(() => queryText = Driver.Compile(query).GetCommandText()); - - var compilerConfiguration = - new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = true}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); - - var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; - var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = true}; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(DummyDatabaseName), Is.True); - Assert.That(queryText.Contains(DummySchemaName), Is.True); - } - if (MultischemaSupported()) { - Assert.Throws(() => queryText = Driver.Compile(query).GetCommandText()); - - var compilerConfiguration = - new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - - var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; - var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = false}; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(DummyDatabaseName), Is.False); - Assert.That(queryText.Contains(DummySchemaName), Is.True); - } - else { - Assert.DoesNotThrow(() => queryText = Driver.Compile(query).GetCommandText()); - - var compilerConfiguration = - new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - - var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; - var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; - compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = false}; - - Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); - Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); - Assert.That(queryText.Contains(DummyDatabaseName), Is.False); - Assert.That(queryText.Contains(DummySchemaName), Is.False); - } - } - - private Schema GetSchema() - { - var catalog = new Catalog(CatalogName); - var schema = catalog.CreateSchema(SchemaName); - - var defaultSchema = catalog.DefaultSchema = schema; - var table = defaultSchema.CreateTable(TableName); - var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); - table.CreatePrimaryKey("PK_DenyNamesReadingTest", column); - column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); - return defaultSchema; - } - - private SqlValueType GetServerTypeFor(Type type) - { - return Driver.TypeMappings.Mappings[type].MapType(255, null, null); - } - - private SqlValueType GetServerTypeFor(Type type, int length) - { - return Driver.TypeMappings.Mappings[type].MapType(length, null, null); - } - - private SqlValueType GetServerTypeFor(Type type, int length, int precision, int scale) - { - return Driver.TypeMappings.Mappings[type].MapType(length, precision, scale); - } - - private bool MultidatabaseSupported() - { - return Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.MultidatabaseQueries); - } - - private bool MultischemaSupported() - { - return Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.MultischemaQueries); - } - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2017.03.24 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + public class MakeNamesUnreadableTest : SqlTest + { + private const string TableName = "DenyNamesReadingTest"; + private const string CatalogName = "DO-Tests"; + private const string SchemaName = "dbo"; + private const string DummySchemaName = "DummySchema"; + private const string DummyDatabaseName = "DummyDatabase"; + + [Test] + public void ReadingNamesTest() + { + var defaultSchema = GetSchema(); + Catalog catalog = null; + Assert.DoesNotThrow(() => catalog = defaultSchema.Catalog); + Table table = null; + Assert.DoesNotThrow(() => table = defaultSchema.Tables[TableName]); + + Assert.DoesNotThrow(() => {var catalogName = catalog.Name;}); + Assert.DoesNotThrow(() => {var catalogDbName = catalog.DbName;}); + + Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal();}); + Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal();}); + + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.Name; }); + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.DbName;}); + + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); + + Assert.DoesNotThrow(() => {var schemaName = table.Name;}); + Assert.DoesNotThrow(() => {var schemaName = table.DbName;}); + + catalog.MakeNamesUnreadable(); + + Assert.Throws(() => {var catalogName = catalog.Name;}); + Assert.Throws(() => {var catalogDbName = catalog.DbName;}); + + Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal();}); + Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal();}); + + Assert.Throws(() => {var schemaName = defaultSchema.Name;}); + Assert.Throws(() => {var schemaName = defaultSchema.DbName;}); + + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); + + Assert.DoesNotThrow(() => {var schemaName = table.Name; }); + Assert.DoesNotThrow(() => {var schemaName = table.DbName; }); + } + + [Test] + public void ChangingNamesTest() + { + var defaultSchema = GetSchema(); + Catalog catalog = null; + + Assert.DoesNotThrow(() => catalog = defaultSchema.Catalog); + Table table = null; + Assert.DoesNotThrow(() => table = defaultSchema.Tables[TableName]); + + Assert.DoesNotThrow(() => {var catalogName = catalog.Name; }); + Assert.DoesNotThrow(() => {var catalogDbName = catalog.DbName; }); + + Assert.DoesNotThrow(() => {var catalogName = catalog.GetNameInternal(); }); + Assert.DoesNotThrow(() => {var catalogDbName = catalog.GetDbNameInternal(); }); + + var oldCatalogName = catalog.Name; + var oldCatalogDbName = catalog.DbName; + + var newCatalogName = oldCatalogName + "New"; + var newCatalogDbName = oldCatalogDbName + "New"; + + Assert.DoesNotThrow(() => catalog.Name = newCatalogName); + Assert.DoesNotThrow(() => catalog.DbName = newCatalogDbName); + + catalog.Name = oldCatalogName; + catalog.DbName = oldCatalogDbName; + + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.Name;}); + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.DbName;}); + + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetNameInternal();}); + Assert.DoesNotThrow(() => {var schemaName = defaultSchema.GetDbNameInternal();}); + + var oldSchemaName = defaultSchema.Name; + var oldSchemaDbName = defaultSchema.DbName; + + var newSchemaName = oldSchemaName + "New"; + var newSchemaDbName = oldSchemaDbName + "New"; + + Assert.DoesNotThrow(() => defaultSchema.Name = newSchemaName); + Assert.DoesNotThrow(() => defaultSchema.DbName = newSchemaDbName); + + defaultSchema.Name = oldSchemaName; + defaultSchema.DbName = oldSchemaDbName; + + Assert.DoesNotThrow(() => {var schemaName = table.Name;}); + Assert.DoesNotThrow(() => {var schemaName = table.DbName;}); + + catalog.MakeNamesUnreadable(); + + Assert.Throws(() => catalog.Name = newCatalogName); + Assert.Throws(() => catalog.DbName = newCatalogDbName); + + Assert.Throws(() => defaultSchema.Name = newSchemaName); + Assert.Throws(() => defaultSchema.DbName = newSchemaDbName); + } + + [Test] + public void TableCreationTest() + { + var defaultSchema = GetSchema(); + + var table = defaultSchema.CreateTable(string.Format("Crt1_{0}", TableName)); + var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); + table.CreatePrimaryKey("PK_Crt_DenyNamesReadingTest", column); + column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); + var createTableQuery = SqlDdl.Create(table); + + TestQueryNamesReadable(createTableQuery, defaultSchema); + } + + [Test] + public void TableCreationUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var table = defaultSchema.CreateTable(string.Format("Crt1_{0}", TableName)); + var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); + table.CreatePrimaryKey("PK_Crt_DenyNamesReadingTest", column); + column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); + var createTableQuery = SqlDdl.Create(table); + + TestQueryNamesUnreadable(createTableQuery, defaultSchema); + } + + [Test] + public void TableAlterTest() + { + var defaultSchema = GetSchema(); + + var table = defaultSchema.Tables[TableName]; + var column = table.CreateColumn("Text", GetServerTypeFor(typeof (string), 255)); + column.IsNullable = true; + var alterTableQuery = SqlDdl.Alter(table, SqlDdl.AddColumn(column)); + + TestQueryNamesReadable(alterTableQuery, defaultSchema); + } + + [Test] + public void TableAlterUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var table = defaultSchema.Tables[TableName]; + var column = table.CreateColumn("Text", GetServerTypeFor(typeof (string), 255)); + column.IsNullable = true; + var alterTableQuery = SqlDdl.Alter(table, SqlDdl.AddColumn(column)); + + TestQueryNamesUnreadable(alterTableQuery, defaultSchema); + } + + [Test] + public void TableDeletionTest() + { + var defaultSchema = GetSchema(); + + var table = defaultSchema.Tables[TableName]; + var dropTableQuery = SqlDdl.Drop(table); + + TestQueryNamesReadable(dropTableQuery, defaultSchema); + } + + [Test] + public void TableDeletionUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var table = defaultSchema.Tables[TableName]; + var dropTableQuery = SqlDdl.Drop(table); + + TestQueryNamesUnreadable(dropTableQuery, defaultSchema); + } + + [Test] + public void RowInsertionTest() + { + var defaultSchema = GetSchema(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var insertQuery = SqlDml.Insert(tableRef); + insertQuery.Values.Add(tableRef["Id"], 1); + insertQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); + + TestQueryNamesReadable(insertQuery, defaultSchema); + } + + [Test] + public void RowInsertionUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var insertQuery = SqlDml.Insert(tableRef); + insertQuery.Values.Add(tableRef["Id"], 1); + insertQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); + + TestQueryNamesUnreadable(insertQuery, defaultSchema); + } + + [Test] + public void RowUpdateTest() + { + var defaultSchema = GetSchema(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var updateQuery = SqlDml.Update(tableRef); + updateQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); + updateQuery.Where = tableRef["Id"]==1; + + TestQueryNamesReadable(updateQuery, defaultSchema); + } + + [Test] + public void RowUpdateUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var updateQuery = SqlDml.Update(tableRef); + updateQuery.Values.Add(tableRef["CreationDate"], DateTime.UtcNow); + updateQuery.Where = tableRef["Id"]==1; + + TestQueryNamesUnreadable(updateQuery, defaultSchema); + } + + [Test] + public void RowDeletionTest() + { + var defaultSchema = GetSchema(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var deleteQuery = SqlDml.Delete(tableRef); + deleteQuery.Where = tableRef["Id"]==1; + + TestQueryNamesReadable(deleteQuery, defaultSchema); + } + + [Test] + public void RowDeletionUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var deleteQuery = SqlDml.Delete(tableRef); + deleteQuery.Where = tableRef["Id"]==1; + + TestQueryNamesUnreadable(deleteQuery, defaultSchema); + } + + [Test] + public void RowSelectionTest() + { + var defaultSchema = GetSchema(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var selectQuery = SqlDml.Select(tableRef); + selectQuery.Where = tableRef["CreationDate"] < DateTime.UtcNow; + + TestQueryNamesReadable(selectQuery, defaultSchema); + } + + [Test] + public void RowSelectionUnreadableNamesTest() + { + var defaultSchema = GetSchema(); + defaultSchema.Catalog.MakeNamesUnreadable(); + + var tableRef = SqlDml.TableRef(defaultSchema.Tables[TableName]); + var selectQuery = SqlDml.Select(tableRef); + selectQuery.Where = tableRef["CreationDate"] < DateTime.UtcNow; + + TestQueryNamesUnreadable(selectQuery, defaultSchema); + } + + private void TestQueryNamesReadable(ISqlCompileUnit query, Schema defaultSchema) + { + string queryText = string.Empty; + + if (MultidatabaseSupported()) { + var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = true}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); + + var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; + var databaseMap =new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = true}; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(DummyDatabaseName), Is.False); + Assert.That(queryText.Contains(DummySchemaName), Is.False); + } + if (MultischemaSupported()) { + var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + + var schemaMap = new Dictionary() { { defaultSchema.GetDbNameInternal(), DummySchemaName } }; + var databaseMap = new Dictionary() { { defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName } }; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) { DatabaseQualifiedObjects = false }; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(DummyDatabaseName), Is.False); + Assert.That(queryText.Contains(DummySchemaName), Is.False); + } + else { + var compilerConfiguration = new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + + var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; + var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) { DatabaseQualifiedObjects = false }; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(DummyDatabaseName), Is.False); + Assert.That(queryText.Contains(DummySchemaName), Is.False); + } + } + + private void TestQueryNamesUnreadable(ISqlCompileUnit query, Schema defaultSchema) + { + string queryText = string.Empty; + + if (MultidatabaseSupported()) { + Assert.Throws(() => queryText = Driver.Compile(query).GetCommandText()); + + var compilerConfiguration = + new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = true}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.True); + + var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; + var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = true}; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(DummyDatabaseName), Is.True); + Assert.That(queryText.Contains(DummySchemaName), Is.True); + } + if (MultischemaSupported()) { + Assert.Throws(() => queryText = Driver.Compile(query).GetCommandText()); + + var compilerConfiguration = + new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.True); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + + var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; + var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = false}; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(DummyDatabaseName), Is.False); + Assert.That(queryText.Contains(DummySchemaName), Is.True); + } + else { + Assert.DoesNotThrow(() => queryText = Driver.Compile(query).GetCommandText()); + + var compilerConfiguration = + new SqlCompilerConfiguration(new Dictionary(), new Dictionary()) {DatabaseQualifiedObjects = false}; + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + + var schemaMap = new Dictionary {{defaultSchema.GetDbNameInternal(), DummySchemaName}}; + var databaseMap = new Dictionary {{defaultSchema.Catalog.GetDbNameInternal(), DummyDatabaseName}}; + compilerConfiguration = new SqlCompilerConfiguration(databaseMap, schemaMap) {DatabaseQualifiedObjects = false}; + + Assert.DoesNotThrow(() => queryText = Driver.Compile(query, compilerConfiguration).GetCommandText()); + Assert.That(queryText.Contains(defaultSchema.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(defaultSchema.Catalog.GetDbNameInternal()), Is.False); + Assert.That(queryText.Contains(DummyDatabaseName), Is.False); + Assert.That(queryText.Contains(DummySchemaName), Is.False); + } + } + + private Schema GetSchema() + { + var catalog = new Catalog(CatalogName); + var schema = catalog.CreateSchema(SchemaName); + + var defaultSchema = catalog.DefaultSchema = schema; + var table = defaultSchema.CreateTable(TableName); + var column = table.CreateColumn("Id", GetServerTypeFor(typeof (int))); + table.CreatePrimaryKey("PK_DenyNamesReadingTest", column); + column = table.CreateColumn("CreationDate", GetServerTypeFor(typeof (DateTime))); + return defaultSchema; + } + + private SqlValueType GetServerTypeFor(Type type) + { + return Driver.TypeMappings.Mappings[type].MapType(255, null, null); + } + + private SqlValueType GetServerTypeFor(Type type, int length) + { + return Driver.TypeMappings.Mappings[type].MapType(length, null, null); + } + + private SqlValueType GetServerTypeFor(Type type, int length, int precision, int scale) + { + return Driver.TypeMappings.Mappings[type].MapType(length, precision, scale); + } + + private bool MultidatabaseSupported() + { + return Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.MultidatabaseQueries); + } + + private bool MultischemaSupported() + { + return Driver.ServerInfo.Query.Features.HasFlag(QueryFeatures.MultischemaQueries); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/CompilerTest.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/CompilerTest.cs index 0325f340fe..aa33f03891 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/CompilerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/CompilerTest.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.06 - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - public class CompilerTest : Sql.CompilerTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.06 + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + public class CompilerTest : Sql.CompilerTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/DateTimeIntervalTests.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/DateTimeIntervalTests.cs index 5a8d9e7cf7..bb41093cb2 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/DateTimeIntervalTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/DateTimeIntervalTests.cs @@ -1,273 +1,273 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.22 - -using System; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - [TestFixture, Explicit] - public class DateTimeIntervalTests : Sakila - { - private DbCommand sqlCommand; - - - #region Internals - - private void CompareColumnEquality(ISqlCompileUnit statement) - { - sqlCommand.CommandText = SqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - - using (var command = sqlCommand.Connection.CreateCommand()) - { - Console.WriteLine(sqlCommand.CommandText); - using (var reader = sqlCommand.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - Assert.AreEqual(reader[0], reader[1], "The columns are not equal!"); - } - } - } - - #endregion - - #region Setup and TearDown - - [OneTimeSetUp] - public override void SetUp() - { - CheckRequirements(); - SqlDriver = TestSqlDriver.Create(ConnectionInfo.ConnectionUrl.Url); - SqlConnection = SqlDriver.CreateConnection(); - SqlConnection.Open(); - sqlCommand = SqlConnection.CreateCommand(); - } - - #endregion - - [Test] - public virtual void DateTimeAddIntervalTest() - { - var select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimePlusInterval(new DateTime(2001, 1, 1, 1, 1, 1, 1), new TimeSpan(10, 10, 10, 10, 10))); - select.Columns.Add(new DateTime(2001, 1, 11, 11, 11, 11, 11)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeAddYearsTest() - { - var select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeAddYears(new DateTime(2001, 1, 1), 5)); - select.Columns.Add(new DateTime(2006, 1, 1)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeAddMonthsTest() - { - var select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeAddMonths(new DateTime(2001, 1, 1), 15)); - select.Columns.Add(new DateTime(2002, 4, 1)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeConstructTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.DateTimeConstruct(2005, 5, 5)); - select.Columns.Add(new DateTime(2005, 5, 5)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeSubtractDateTimeTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.DateTimeMinusDateTime(new DateTime(2005, 5, 5, 5, 5, 5), new DateTime(2005, 5, 6, 6, 6, 6))); - select.Columns.Add(new TimeSpan(1, 1, 1, 1).Negate()); - CompareColumnEquality(select); - } - - - [Test] - public virtual void DateTimeSubtractIntervalTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.DateTimeMinusInterval(new DateTime(2005, 5, 5, 5, 5, 5, 5), new TimeSpan(4, 4, 4, 4, 4))); - select.Columns.Add(new DateTime(2005, 5, 1, 1, 1, 1, 1)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeTruncateTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.DateTimeTruncate(new DateTime(2005, 1, 1, 1, 1, 1, 1))); - select.Columns.Add(new DateTime(2005, 1, 1)); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeExtractYearTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Year, new DateTime(2006, 5, 4))); - select.Columns.Add(2006); - CompareColumnEquality(select); - } - - [Test] - public virtual void DateTimeExtractDayTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Day, new DateTime(2006, 5, 4))); - select.Columns.Add(4); - } - - [Test] - public virtual void DateTimeExtractHourTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Hour, new DateTime(2006, 5, 4, 3, 2, 1, 333))); - select.Columns.Add(3); - } - - [Test] - public virtual void DateTimeExtractMinuteTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Minute, new DateTime(2006, 5, 4, 3, 2, 1, 333))); - select.Columns.Add(2); - } - - [Test] - public virtual void DateTimeExtractSecondTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Second, new DateTime(2006, 5, 4, 3, 2, 1, 333))); - select.Columns.Add(1); - } - - [Test] - public virtual void DateTimeExtractMillisecondTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Millisecond, new DateTime(2006, 5, 4, 3, 2, 1, 333))); - select.Columns.Add(333); - } - - [Test] - public virtual void DateTimeExtractDayOfWeekTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.DayOfWeek, new DateTime(2009, 3, 2))); - select.Columns.Add((int)DayOfWeek.Monday); - } - - [Test] - public virtual void DateTimeExtractDayOfYearTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.DayOfYear, new DateTime(2005, 2, 2))); - select.Columns.Add(33); - } - - [Test] - public virtual void IntervalConstructTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.IntervalConstruct(500000000)); - select.Columns.Add(new TimeSpan(0, 0, 0, 0, 500)); - } - - [Test] - public virtual void IntervalExtractDayTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlIntervalPart.Day, new TimeSpan(6, 5, 4, 3, 2))); - select.Columns.Add(6); - } - - [Test] - public virtual void IntervalExtractHourTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlIntervalPart.Hour, new TimeSpan(6, 5, 4, 3, 2))); - select.Columns.Add(5); - } - - [Test] - public virtual void IntervalExtractMinuteTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlIntervalPart.Minute, new TimeSpan(6, 5, 4, 3, 2))); - select.Columns.Add(4); - } - - [Test] - public virtual void IntervalExtractSecondTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlIntervalPart.Second, new TimeSpan(6, 5, 4, 3, 2))); - select.Columns.Add(3); - } - - [Test] - public virtual void IntervalExtractMillisecondTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.Extract(SqlIntervalPart.Millisecond, new TimeSpan(6, 5, 4, 3, 2))); - select.Columns.Add(2); - } - - [Test] - public virtual void IntervalToMillisecondsTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.IntervalToMilliseconds(new TimeSpan(0, 0, 8, 5, 5))); - select.Columns.Add((int)new TimeSpan(0, 0, 8, 5, 5).TotalMilliseconds); - } - - [Test] - public virtual void IntervalAbsTest() - { - var select = SqlDml.Select(); - select.Columns.Add( - SqlDml.IntervalAbs(new TimeSpan(10, 0, 0, 0).Negate())); - select.Columns.Add(new TimeSpan(10, 0, 0, 0)); - } - - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.22 + +using System; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + [TestFixture, Explicit] + public class DateTimeIntervalTests : Sakila + { + private DbCommand sqlCommand; + + + #region Internals + + private void CompareColumnEquality(ISqlCompileUnit statement) + { + sqlCommand.CommandText = SqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + + using (var command = sqlCommand.Connection.CreateCommand()) + { + Console.WriteLine(sqlCommand.CommandText); + using (var reader = sqlCommand.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + Assert.AreEqual(reader[0], reader[1], "The columns are not equal!"); + } + } + } + + #endregion + + #region Setup and TearDown + + [OneTimeSetUp] + public override void SetUp() + { + CheckRequirements(); + SqlDriver = TestSqlDriver.Create(ConnectionInfo.ConnectionUrl.Url); + SqlConnection = SqlDriver.CreateConnection(); + SqlConnection.Open(); + sqlCommand = SqlConnection.CreateCommand(); + } + + #endregion + + [Test] + public virtual void DateTimeAddIntervalTest() + { + var select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimePlusInterval(new DateTime(2001, 1, 1, 1, 1, 1, 1), new TimeSpan(10, 10, 10, 10, 10))); + select.Columns.Add(new DateTime(2001, 1, 11, 11, 11, 11, 11)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeAddYearsTest() + { + var select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeAddYears(new DateTime(2001, 1, 1), 5)); + select.Columns.Add(new DateTime(2006, 1, 1)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeAddMonthsTest() + { + var select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeAddMonths(new DateTime(2001, 1, 1), 15)); + select.Columns.Add(new DateTime(2002, 4, 1)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeConstructTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.DateTimeConstruct(2005, 5, 5)); + select.Columns.Add(new DateTime(2005, 5, 5)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeSubtractDateTimeTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.DateTimeMinusDateTime(new DateTime(2005, 5, 5, 5, 5, 5), new DateTime(2005, 5, 6, 6, 6, 6))); + select.Columns.Add(new TimeSpan(1, 1, 1, 1).Negate()); + CompareColumnEquality(select); + } + + + [Test] + public virtual void DateTimeSubtractIntervalTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.DateTimeMinusInterval(new DateTime(2005, 5, 5, 5, 5, 5, 5), new TimeSpan(4, 4, 4, 4, 4))); + select.Columns.Add(new DateTime(2005, 5, 1, 1, 1, 1, 1)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeTruncateTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.DateTimeTruncate(new DateTime(2005, 1, 1, 1, 1, 1, 1))); + select.Columns.Add(new DateTime(2005, 1, 1)); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeExtractYearTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Year, new DateTime(2006, 5, 4))); + select.Columns.Add(2006); + CompareColumnEquality(select); + } + + [Test] + public virtual void DateTimeExtractDayTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Day, new DateTime(2006, 5, 4))); + select.Columns.Add(4); + } + + [Test] + public virtual void DateTimeExtractHourTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Hour, new DateTime(2006, 5, 4, 3, 2, 1, 333))); + select.Columns.Add(3); + } + + [Test] + public virtual void DateTimeExtractMinuteTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Minute, new DateTime(2006, 5, 4, 3, 2, 1, 333))); + select.Columns.Add(2); + } + + [Test] + public virtual void DateTimeExtractSecondTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Second, new DateTime(2006, 5, 4, 3, 2, 1, 333))); + select.Columns.Add(1); + } + + [Test] + public virtual void DateTimeExtractMillisecondTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Millisecond, new DateTime(2006, 5, 4, 3, 2, 1, 333))); + select.Columns.Add(333); + } + + [Test] + public virtual void DateTimeExtractDayOfWeekTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.DayOfWeek, new DateTime(2009, 3, 2))); + select.Columns.Add((int)DayOfWeek.Monday); + } + + [Test] + public virtual void DateTimeExtractDayOfYearTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.DayOfYear, new DateTime(2005, 2, 2))); + select.Columns.Add(33); + } + + [Test] + public virtual void IntervalConstructTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.IntervalConstruct(500000000)); + select.Columns.Add(new TimeSpan(0, 0, 0, 0, 500)); + } + + [Test] + public virtual void IntervalExtractDayTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlIntervalPart.Day, new TimeSpan(6, 5, 4, 3, 2))); + select.Columns.Add(6); + } + + [Test] + public virtual void IntervalExtractHourTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlIntervalPart.Hour, new TimeSpan(6, 5, 4, 3, 2))); + select.Columns.Add(5); + } + + [Test] + public virtual void IntervalExtractMinuteTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlIntervalPart.Minute, new TimeSpan(6, 5, 4, 3, 2))); + select.Columns.Add(4); + } + + [Test] + public virtual void IntervalExtractSecondTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlIntervalPart.Second, new TimeSpan(6, 5, 4, 3, 2))); + select.Columns.Add(3); + } + + [Test] + public virtual void IntervalExtractMillisecondTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.Extract(SqlIntervalPart.Millisecond, new TimeSpan(6, 5, 4, 3, 2))); + select.Columns.Add(2); + } + + [Test] + public virtual void IntervalToMillisecondsTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.IntervalToMilliseconds(new TimeSpan(0, 0, 8, 5, 5))); + select.Columns.Add((int)new TimeSpan(0, 0, 8, 5, 5).TotalMilliseconds); + } + + [Test] + public virtual void IntervalAbsTest() + { + var select = SqlDml.Select(); + select.Columns.Add( + SqlDml.IntervalAbs(new TimeSpan(10, 0, 0, 0).Negate())); + select.Columns.Add(new TimeSpan(10, 0, 0, 0)); + } + + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/ExtractorTest.cs index ca3ff969b2..c7a850c971 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/ExtractorTest.cs @@ -1,180 +1,180 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Data.Common; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - [TestFixture] - public class ExtractorTest : SqlTest - { - #region Test DDL - - const string DropBadSetTableQuery = @"drop table if exists dataTypesBadSetTable"; - private const string CreateBadSetTableQuery = - @"CREATE TABLE dataTypesBadSetTable ( - set_162 SET('a', 'b', 'c', 'd') - )"; - - const string DropBadEnumTableQuery = @"drop table if exists dataTypesBadEnumTable"; - private const string CreateBadEnumTableQuery = - @"CREATE TABLE dataTypesBadEnumTable ( - num_231 ENUM('small', 'medium', 'large') - )"; - - const string DropBadBitTableQuery = @"drop table if exists dataTypesBadBitTable"; - private const string CreateBadBitTableQuery = - @"CREATE TABLE dataTypesBadBitTable ( - bit_l1 bit NULL - )"; - - const string DropGoodTableQuery = @"drop table if exists dataTypesGoodTable"; - const string CreateGoodTableQuery = - @"CREATE TABLE dataTypesGoodTable ( - int_l4 int NULL , - binary_l50 binary (50) NULL , - char_10 char (10) COLLATE utf8_unicode_ci NULL , - datetime_l8 datetime NULL , - decimal_p18_s0 decimal(18, 0) NULL , - decimal_p12_s11_l9 decimal(12, 11) NULL , - float_p53 float NULL , - image_16 blob NULL , - image_17 tinyblob NULL , - image_18 mediumblob NULL , - image_19 longblob NULL , - money_p19_s4_l8 decimal(18,2) NULL , - nchar_l100 nchar (100) COLLATE utf8_unicode_ci NULL , - tiny_text_01 tinytext COLLATE utf8_unicode_ci NULL , - long_text_01 longtext COLLATE utf8_unicode_ci NULL , - medium_text_01 mediumtext COLLATE utf8_unicode_ci NULL , - numeric_p5_s5 numeric(5, 5) NULL , - nvarchar_l50 nvarchar (50) COLLATE utf8_unicode_ci NULL , - real_p24_s0_l4 real NULL , - smalldatetime_l4 datetime NULL , - tinyint_l2 tinyint NULL , - smallint_l2 smallint NULL , - int_l2 int NULL , - mediumint_148 mediumint null, - big_int_120 bigint null, - small_money_p10_s4_l4 decimal(18,2) NULL , - text_16 varchar (50) COLLATE utf8_unicode_ci NULL , - timestamp_l8 timestamp NULL , - tinyint_1_p3_s0_l1 tinyint NULL , - varbinary_l150 varbinary (150) NULL , - varchar_l50 varchar (50) COLLATE utf8_unicode_ci NULL - )"; - - #endregion - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - - private void DropBadTables() - { - this.ExecuteNonQuery(DropBadSetTableQuery); - this.ExecuteNonQuery(DropBadEnumTableQuery); - this.ExecuteNonQuery(DropBadBitTableQuery); - } - - [Test] - public void DefaultSchemaIsAvailable() - { - this.DropBadTables(); - - var schema = this.ExtractDefaultSchema(); - Assert.IsNotNull(schema); - } - - [Test] - public void TestCatalogExtraction() - { - var catalog = ExtractCatalog(); - Assert.GreaterOrEqual(catalog.Schemas.Count, 1); - } - - [Test] - public void ExtractObjectsFromDefaultSchema() - { - this.DropBadTables(); - - var schema = this.ExtractDefaultSchema(); - var catalog = this.ExtractSchema(schema.Name); - Assert.IsNotNull(catalog); - } - - [Test] - public void TestForSupportedDataTypes() - { - this.DropBadTables(); - - ExecuteNonQuery(DropGoodTableQuery); - ExecuteNonQuery(CreateGoodTableQuery); - - var schema = ExtractDefaultSchema(); - var catalog = schema.Catalog; - - Table table = catalog.DefaultSchema.Tables["dataTypesGoodTable"]; - Assert.IsTrue(table.TableColumns["int_l4"].DataType.Type == SqlType.Int32); - } - - [Test] - //[ExpectedException(typeof(NotSupportedException))] - [Ignore("")] - public void TestForUnsupportedSETDatatypes() - { - this.DropBadTables(); - - ExecuteNonQuery(DropBadSetTableQuery); - ExecuteNonQuery(CreateBadSetTableQuery); - - var schema = ExtractDefaultSchema(); - var catalog = schema.Catalog; - - Table table = catalog.DefaultSchema.Tables["dataTypesBadSetTable"]; - Assert.IsNotNull(table); - } - - [Test] - //[ExpectedException(typeof(NotSupportedException))] - [Ignore("")] - public void TestForUnsupportedENUMDatatypes() - { - this.DropBadTables(); - - ExecuteNonQuery(DropBadEnumTableQuery); - ExecuteNonQuery(CreateBadEnumTableQuery); - - var schema = ExtractDefaultSchema(); - var catalog = schema.Catalog; - - Table table = catalog.DefaultSchema.Tables["dataTypesBadEnumTable"]; - Assert.IsNotNull(table); - } - - [Test] - //[ExpectedException(typeof(NotSupportedException))] - [Ignore("")] - public void TestForUnsupportedBITDatatypes() - { - this.DropBadTables(); - - ExecuteNonQuery(DropBadBitTableQuery); - ExecuteNonQuery(CreateBadBitTableQuery); - - var schema = ExtractDefaultSchema(); - var catalog = schema.Catalog; - - Table table = catalog.DefaultSchema.Tables["dataTypesBadBitTable"]; - Assert.IsNotNull(table); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Data.Common; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + [TestFixture] + public class ExtractorTest : SqlTest + { + #region Test DDL + + const string DropBadSetTableQuery = @"drop table if exists dataTypesBadSetTable"; + private const string CreateBadSetTableQuery = + @"CREATE TABLE dataTypesBadSetTable ( + set_162 SET('a', 'b', 'c', 'd') + )"; + + const string DropBadEnumTableQuery = @"drop table if exists dataTypesBadEnumTable"; + private const string CreateBadEnumTableQuery = + @"CREATE TABLE dataTypesBadEnumTable ( + num_231 ENUM('small', 'medium', 'large') + )"; + + const string DropBadBitTableQuery = @"drop table if exists dataTypesBadBitTable"; + private const string CreateBadBitTableQuery = + @"CREATE TABLE dataTypesBadBitTable ( + bit_l1 bit NULL + )"; + + const string DropGoodTableQuery = @"drop table if exists dataTypesGoodTable"; + const string CreateGoodTableQuery = + @"CREATE TABLE dataTypesGoodTable ( + int_l4 int NULL , + binary_l50 binary (50) NULL , + char_10 char (10) COLLATE utf8_unicode_ci NULL , + datetime_l8 datetime NULL , + decimal_p18_s0 decimal(18, 0) NULL , + decimal_p12_s11_l9 decimal(12, 11) NULL , + float_p53 float NULL , + image_16 blob NULL , + image_17 tinyblob NULL , + image_18 mediumblob NULL , + image_19 longblob NULL , + money_p19_s4_l8 decimal(18,2) NULL , + nchar_l100 nchar (100) COLLATE utf8_unicode_ci NULL , + tiny_text_01 tinytext COLLATE utf8_unicode_ci NULL , + long_text_01 longtext COLLATE utf8_unicode_ci NULL , + medium_text_01 mediumtext COLLATE utf8_unicode_ci NULL , + numeric_p5_s5 numeric(5, 5) NULL , + nvarchar_l50 nvarchar (50) COLLATE utf8_unicode_ci NULL , + real_p24_s0_l4 real NULL , + smalldatetime_l4 datetime NULL , + tinyint_l2 tinyint NULL , + smallint_l2 smallint NULL , + int_l2 int NULL , + mediumint_148 mediumint null, + big_int_120 bigint null, + small_money_p10_s4_l4 decimal(18,2) NULL , + text_16 varchar (50) COLLATE utf8_unicode_ci NULL , + timestamp_l8 timestamp NULL , + tinyint_1_p3_s0_l1 tinyint NULL , + varbinary_l150 varbinary (150) NULL , + varchar_l50 varchar (50) COLLATE utf8_unicode_ci NULL + )"; + + #endregion + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + + private void DropBadTables() + { + this.ExecuteNonQuery(DropBadSetTableQuery); + this.ExecuteNonQuery(DropBadEnumTableQuery); + this.ExecuteNonQuery(DropBadBitTableQuery); + } + + [Test] + public void DefaultSchemaIsAvailable() + { + this.DropBadTables(); + + var schema = this.ExtractDefaultSchema(); + Assert.IsNotNull(schema); + } + + [Test] + public void TestCatalogExtraction() + { + var catalog = ExtractCatalog(); + Assert.GreaterOrEqual(catalog.Schemas.Count, 1); + } + + [Test] + public void ExtractObjectsFromDefaultSchema() + { + this.DropBadTables(); + + var schema = this.ExtractDefaultSchema(); + var catalog = this.ExtractSchema(schema.Name); + Assert.IsNotNull(catalog); + } + + [Test] + public void TestForSupportedDataTypes() + { + this.DropBadTables(); + + ExecuteNonQuery(DropGoodTableQuery); + ExecuteNonQuery(CreateGoodTableQuery); + + var schema = ExtractDefaultSchema(); + var catalog = schema.Catalog; + + Table table = catalog.DefaultSchema.Tables["dataTypesGoodTable"]; + Assert.IsTrue(table.TableColumns["int_l4"].DataType.Type == SqlType.Int32); + } + + [Test] + //[ExpectedException(typeof(NotSupportedException))] + [Ignore("")] + public void TestForUnsupportedSETDatatypes() + { + this.DropBadTables(); + + ExecuteNonQuery(DropBadSetTableQuery); + ExecuteNonQuery(CreateBadSetTableQuery); + + var schema = ExtractDefaultSchema(); + var catalog = schema.Catalog; + + Table table = catalog.DefaultSchema.Tables["dataTypesBadSetTable"]; + Assert.IsNotNull(table); + } + + [Test] + //[ExpectedException(typeof(NotSupportedException))] + [Ignore("")] + public void TestForUnsupportedENUMDatatypes() + { + this.DropBadTables(); + + ExecuteNonQuery(DropBadEnumTableQuery); + ExecuteNonQuery(CreateBadEnumTableQuery); + + var schema = ExtractDefaultSchema(); + var catalog = schema.Catalog; + + Table table = catalog.DefaultSchema.Tables["dataTypesBadEnumTable"]; + Assert.IsNotNull(table); + } + + [Test] + //[ExpectedException(typeof(NotSupportedException))] + [Ignore("")] + public void TestForUnsupportedBITDatatypes() + { + this.DropBadTables(); + + ExecuteNonQuery(DropBadBitTableQuery); + ExecuteNonQuery(CreateBadBitTableQuery); + + var schema = ExtractDefaultSchema(); + var catalog = schema.Catalog; + + Table table = catalog.DefaultSchema.Tables["dataTypesBadBitTable"]; + Assert.IsNotNull(table); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs index c52286a353..51504e39e1 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/MiscTests.cs @@ -1,376 +1,376 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.17 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.Serialization.Formatters.Binary; -using System.Text; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - public class MiscTests : Sakila - { - private DbCommand sqlCommand; - - #region Setup and TearDown - - [OneTimeSetUp] - public override void SetUp() - { - base.SetUp(); - sqlCommand = SqlConnection.CreateCommand(); - } - - #endregion - - [Test] - public void BinaryExpressionTest() - { - SqlLiteral l = SqlDml.Literal(1); - bool passed = false; - if (!l.IsNullReference()) - passed = true; - Assert.IsTrue(passed); - if (l.IsNullReference()) - passed = false; - Assert.IsTrue(passed); - } - - [Test] - public void ImplicitConversionTest() - { - SqlExpression e = new byte[3]; - Assert.AreEqual(e.GetType(), typeof (SqlLiteral)); - } - - [Test] - public void ArrayTest()//TODO: Find reason why this pattern is structured like this.(Malisa) - { - SqlArray i = SqlDml.Array(new int[] { 1, 2 }); - i.Values[0] = 10; - SqlSelect select = SqlDml.Select(); - select.Where = SqlDml.In(1, i); - - MemoryStream ms = new MemoryStream(); - BinaryFormatter bf = new BinaryFormatter(); - bf.Serialize(ms, select); - - ms.Seek(0, SeekOrigin.Begin); - select = (SqlSelect)bf.Deserialize(ms); - - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TypeTest() - { - SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); - SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); - Assert.IsFalse(t1!=t2); - Assert.IsTrue(t1==t2); - Assert.IsTrue(t1.Equals(t2)); - } - - [Test] - public void AddTest() - { - SqlLiteral l1 = SqlDml.Literal(1); - SqlLiteral l2 = SqlDml.Literal(2); - SqlBinary b = l1 + l2; - Assert.AreEqual(b.NodeType, SqlNodeType.Add); - - b = b - ~l1; - Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); - - SqlSelect s = SqlDml.Select(); - s.Columns.Add(1, "id"); - b = b / s; - Assert.AreEqual(b.NodeType, SqlNodeType.Divide); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); - - SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); - Assert.AreEqual(c.NodeType, SqlNodeType.Cast); - - SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); - b = c % l; - Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); - - b = l1 * (-l2); - Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); - - SqlBatch batch = SqlDml.Batch(); - SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); - batch.Add(v1.Declare()); - batch.Add(SqlDml.Assign(v1, 1.0)); - s = SqlDml.Select(); - s.Columns.Add(b, "value"); - batch.Add(s); - } - - [Test] - public void CircularReferencesTest() - { - SqlSelect select = SqlDml.Select(); - SqlBinary b = SqlDml.Literal(1) + 2; - SqlBinary rb = b + 3; - rb.Left.ReplaceWith(rb); - select.Where = rb > 1; - Assert.Throws(() => { Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); }); - } - - [Test] - public void PositionTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void SubstringTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Substring("abc", 1, 1)); - select.Columns.Add(SqlDml.Substring("Xtensive", 2)); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TrimTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Trim(" abc ")); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void ExtractTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void ConcatTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Concat("a", "b")); - //select.Columns.Add("User: " + SqlDml.SessionUser()); //NOTE: Not supported by MySQL. - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void IsBooleanExpressionTest() - { - SqlExpression ex = !SqlDml.Literal(true) || true; - } - - [Test] - public void JoinTest() - { - SqlTableRef tr1 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); - SqlTableRef tr2 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); - SqlTableRef tr3 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); - - SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0]==tr2[0]).InnerJoin(tr3, tr2[0]==tr3[0])); - select.Columns.Add(SqlDml.Asterisk); - sqlCommand.CommandText = SqlDriver.Compile(select).GetCommandText(); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - sqlCommand.Prepare(); - - //int i = 0; - //SqlTableRef[] refs = new[] { tr1, tr2, tr3 }; - //foreach (SqlTable source in select.From) - // Assert.AreEqual(refs[i++], source); - } - - [Test] - public void UniqueTest() - { - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["customer"])); - s2.Columns.Add(SqlDml.Asterisk); - s1.Columns.Add(SqlDml.Unique(s2)==true); - Console.WriteLine(SqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - public void TrueTest() - { - SqlSelect s1 = SqlDml.Select(); - s1.Where = true; - Console.WriteLine(SqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - public void UnionTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s1.Columns.Add(s1.From["address_id"]); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s2.Columns.Add(s2.From["address_id"]); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s3.Columns.Add(s3.From["address_id"]); - - Console.WriteLine(SqlDriver.Compile(s1.Union(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); - s3.Where = SqlDml.In(50.00, s1.Union(s2)); - Console.WriteLine(SqlDriver.Compile(s3).GetCommandText()); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); - Assert.Greater(qr.Columns.Count, 0); - } - - [Test] - public void UnionAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); - } - - [Test] - [Ignore("")] - public void IntersectTest() //TODO: Relook into the keyword for INTERSECT - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); - } - - [Test] - [Ignore("")] - public void IntersectAllTest()//TODO: Relook into the keyword for INTERSECT ALL - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2).IntersectAll(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2.IntersectAll(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1, s1.IntersectAll(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1.IntersectAll(s2))).GetCommandText()); - } - - [Test] - [Ignore("")] - public void ExceptTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(SqlDriver.Compile(s1.Except(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); - } - - [Test] - [Ignore("")] - public void ExceptAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2).ExceptAll(s3)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2.ExceptAll(s3))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1, s2)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1, s1.ExceptAll(s2))).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1)).GetCommandText()); - Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1.ExceptAll(s2))).GetCommandText()); - } - - [Test] - [Ignore("")] - public void FreeTextTest() - { - SqlSelect select = SqlDml.Select(); - var table = Catalog.DefaultSchema.Tables["Address"]; - select.From = SqlDml.QueryRef(SqlDml.FreeTextTable(table, "How can I make my own beers and ales?", EnumerableUtils.One(table.Columns[0].Name).ToList(), EnumerableUtils.One(table.Columns[0].Name).ToList())); - select.Columns.Add(select.From.Asterisk); - Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); - } - - [Test] - [Ignore("")] - public void FreeTextCreateTest() - { - //var table = Catalog.Schemas["Person"].Tables["Address"]; - //var ftindex = table.CreateFullTextIndex(string.Empty); - //var ftColumn = ftindex.CreateIndexColumn(table.Columns[1]); - //ftColumn.Languages.Add(new Language("English")); - //ftindex.UnderlyingUniqueIndex = "PK_Address_AddressID"; - //var createIndex = SqlDdl.Create(ftindex); - //Console.WriteLine(sqlDriver.Compile(createIndex).GetCommandText()); - - //var dropIndex = SqlDdl.Drop(ftindex); - //Console.WriteLine(sqlDriver.Compile(dropIndex).GetCommandText()); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.17 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + public class MiscTests : Sakila + { + private DbCommand sqlCommand; + + #region Setup and TearDown + + [OneTimeSetUp] + public override void SetUp() + { + base.SetUp(); + sqlCommand = SqlConnection.CreateCommand(); + } + + #endregion + + [Test] + public void BinaryExpressionTest() + { + SqlLiteral l = SqlDml.Literal(1); + bool passed = false; + if (!l.IsNullReference()) + passed = true; + Assert.IsTrue(passed); + if (l.IsNullReference()) + passed = false; + Assert.IsTrue(passed); + } + + [Test] + public void ImplicitConversionTest() + { + SqlExpression e = new byte[3]; + Assert.AreEqual(e.GetType(), typeof (SqlLiteral)); + } + + [Test] + public void ArrayTest()//TODO: Find reason why this pattern is structured like this.(Malisa) + { + SqlArray i = SqlDml.Array(new int[] { 1, 2 }); + i.Values[0] = 10; + SqlSelect select = SqlDml.Select(); + select.Where = SqlDml.In(1, i); + + MemoryStream ms = new MemoryStream(); + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(ms, select); + + ms.Seek(0, SeekOrigin.Begin); + select = (SqlSelect)bf.Deserialize(ms); + + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TypeTest() + { + SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); + SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); + Assert.IsFalse(t1!=t2); + Assert.IsTrue(t1==t2); + Assert.IsTrue(t1.Equals(t2)); + } + + [Test] + public void AddTest() + { + SqlLiteral l1 = SqlDml.Literal(1); + SqlLiteral l2 = SqlDml.Literal(2); + SqlBinary b = l1 + l2; + Assert.AreEqual(b.NodeType, SqlNodeType.Add); + + b = b - ~l1; + Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); + + SqlSelect s = SqlDml.Select(); + s.Columns.Add(1, "id"); + b = b / s; + Assert.AreEqual(b.NodeType, SqlNodeType.Divide); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); + + SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); + Assert.AreEqual(c.NodeType, SqlNodeType.Cast); + + SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); + b = c % l; + Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); + + b = l1 * (-l2); + Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); + + SqlBatch batch = SqlDml.Batch(); + SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); + batch.Add(v1.Declare()); + batch.Add(SqlDml.Assign(v1, 1.0)); + s = SqlDml.Select(); + s.Columns.Add(b, "value"); + batch.Add(s); + } + + [Test] + public void CircularReferencesTest() + { + SqlSelect select = SqlDml.Select(); + SqlBinary b = SqlDml.Literal(1) + 2; + SqlBinary rb = b + 3; + rb.Left.ReplaceWith(rb); + select.Where = rb > 1; + Assert.Throws(() => { Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); }); + } + + [Test] + public void PositionTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void SubstringTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Substring("abc", 1, 1)); + select.Columns.Add(SqlDml.Substring("Xtensive", 2)); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TrimTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Trim(" abc ")); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void ExtractTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void ConcatTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Concat("a", "b")); + //select.Columns.Add("User: " + SqlDml.SessionUser()); //NOTE: Not supported by MySQL. + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void IsBooleanExpressionTest() + { + SqlExpression ex = !SqlDml.Literal(true) || true; + } + + [Test] + public void JoinTest() + { + SqlTableRef tr1 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); + SqlTableRef tr2 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); + SqlTableRef tr3 = SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"]); + + SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0]==tr2[0]).InnerJoin(tr3, tr2[0]==tr3[0])); + select.Columns.Add(SqlDml.Asterisk); + sqlCommand.CommandText = SqlDriver.Compile(select).GetCommandText(); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + sqlCommand.Prepare(); + + //int i = 0; + //SqlTableRef[] refs = new[] { tr1, tr2, tr3 }; + //foreach (SqlTable source in select.From) + // Assert.AreEqual(refs[i++], source); + } + + [Test] + public void UniqueTest() + { + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["customer"])); + s2.Columns.Add(SqlDml.Asterisk); + s1.Columns.Add(SqlDml.Unique(s2)==true); + Console.WriteLine(SqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + public void TrueTest() + { + SqlSelect s1 = SqlDml.Select(); + s1.Where = true; + Console.WriteLine(SqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + public void UnionTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s1.Columns.Add(s1.From["address_id"]); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s2.Columns.Add(s2.From["address_id"]); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s3.Columns.Add(s3.From["address_id"]); + + Console.WriteLine(SqlDriver.Compile(s1.Union(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); + s3.Where = SqlDml.In(50.00, s1.Union(s2)); + Console.WriteLine(SqlDriver.Compile(s3).GetCommandText()); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); + Assert.Greater(qr.Columns.Count, 0); + } + + [Test] + public void UnionAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); + } + + [Test] + [Ignore("")] + public void IntersectTest() //TODO: Relook into the keyword for INTERSECT + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); + } + + [Test] + [Ignore("")] + public void IntersectAllTest()//TODO: Relook into the keyword for INTERSECT ALL + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2).IntersectAll(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.IntersectAll(s2.IntersectAll(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1, s1.IntersectAll(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1.IntersectAll(s2))).GetCommandText()); + } + + [Test] + [Ignore("")] + public void ExceptTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(SqlDriver.Compile(s1.Except(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); + } + + [Test] + [Ignore("")] + public void ExceptAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.DefaultSchema.Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2).ExceptAll(s3)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(s1.ExceptAll(s2.ExceptAll(s3))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1, s2)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1, s1.ExceptAll(s2))).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1)).GetCommandText()); + Console.WriteLine(SqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1.ExceptAll(s2))).GetCommandText()); + } + + [Test] + [Ignore("")] + public void FreeTextTest() + { + SqlSelect select = SqlDml.Select(); + var table = Catalog.DefaultSchema.Tables["Address"]; + select.From = SqlDml.QueryRef(SqlDml.FreeTextTable(table, "How can I make my own beers and ales?", EnumerableUtils.One(table.Columns[0].Name).ToList(), EnumerableUtils.One(table.Columns[0].Name).ToList())); + select.Columns.Add(select.From.Asterisk); + Console.WriteLine(SqlDriver.Compile(select).GetCommandText()); + } + + [Test] + [Ignore("")] + public void FreeTextCreateTest() + { + //var table = Catalog.Schemas["Person"].Tables["Address"]; + //var ftindex = table.CreateFullTextIndex(string.Empty); + //var ftColumn = ftindex.CreateIndexColumn(table.Columns[1]); + //ftColumn.Languages.Add(new Language("English")); + //ftindex.UnderlyingUniqueIndex = "PK_Address_AddressID"; + //var createIndex = SqlDdl.Create(ftindex); + //Console.WriteLine(sqlDriver.Compile(createIndex).GetCommandText()); + + //var dropIndex = SqlDdl.Drop(ftindex); + //Console.WriteLine(sqlDriver.Compile(dropIndex).GetCommandText()); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/Sakila.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/Sakila.cs index 5ee3cdb2aa..7647eb482b 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/Sakila.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/Sakila.cs @@ -1,508 +1,508 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.17 - -using System; -using System.Collections.Generic; -using System.Data; -using System.IO; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - [TestFixture] - public abstract class Sakila - { - private readonly string sakilaDataBackupPath = Environment.CurrentDirectory + @"\MySQL\SakilaDb\sakila-data.sql"; - protected ConnectionInfo ConnectionInfo = TestConnectionInfoProvider.GetConnectionInfo(); - protected SqlDriver SqlDriver; - protected SqlConnection SqlConnection; - - public Catalog Catalog { get; protected set; } - - [OneTimeSetUp] - public virtual void SetUp() - { - CheckRequirements(); - SqlDriver = TestSqlDriver.Create(ConnectionInfo.ConnectionUrl.Url); - SqlConnection = SqlDriver.CreateConnection(); - SqlConnection.Open(); - Catalog = SqlDriver.ExtractCatalog(SqlConnection); - DropAllTables(Catalog.DefaultSchema, true); - CreateSchema(); - InsertTestData(); - } - - [OneTimeTearDown] - public virtual void TearDown() - { - if (Catalog!=null) - DropAllTables(Catalog.DefaultSchema, false); - if (SqlConnection!=null && SqlConnection.State!=ConnectionState.Closed) - SqlConnection.Close(); - } - - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - - private void CreateSchema() - { - var schema = Catalog.DefaultSchema; - - var batch = SqlDml.Batch(); - var table = schema.CreateTable("actor"); - table.CreateColumn("actor_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); - table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP");// add default value and on update event - table.CreatePrimaryKey("pk_actor_actor_id", table.TableColumns["actor_id"]); - var index = table.CreateIndex("inx_actor_last_name"); - index.CreateIndexColumn(table.TableColumns["last_name"]); - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - - table = schema.CreateTable("country"); - table.CreateColumn("country_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("country", new SqlValueType(SqlType.VarChar, 50)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; - table.CreatePrimaryKey("pk_country_country_id", table.TableColumns["country_id"]); - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("city"); - table.CreateColumn("city_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("city", new SqlValueType(SqlType.VarChar, 50)); - table.CreateColumn("country_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; - table.CreatePrimaryKey("pk_city_city_id", table.TableColumns["city_id"]); - var foreignKey = table.CreateForeignKey("fk_city_country"); - foreignKey.ReferencedTable = schema.Tables["country"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["country_id"]); - foreignKey.Columns.Add(table.TableColumns["country_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - index = table.CreateIndex("inx_city_country_id"); - index.CreateIndexColumn(table.TableColumns["country_id"]); - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - table = schema.CreateTable("address"); - table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("address", new SqlValueType(SqlType.VarChar, 50)); - var column = table.CreateColumn("address2", new SqlValueType(SqlType.VarChar, 50)); - column.IsNullable = true; - column.DefaultValue = SqlDml.Native("NULL"); - table.CreateColumn("district", new SqlValueType(SqlType.VarChar, 20)); - table.CreateColumn("city_id", new SqlValueType("SMALLINT UNSIGNED")); - column = table.CreateColumn("postal_code", new SqlValueType(SqlType.VarChar, 20)); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("phone", new SqlValueType(SqlType.VarChar, 20)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_address_address_id", table.TableColumns["address_id"]); - foreignKey = table.CreateForeignKey("fk_address_city"); - foreignKey.ReferencedTable = schema.Tables["city"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["city_id"]); - foreignKey.Columns.Add(table.TableColumns["city_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - index = table.CreateIndex("inx_address_city_id"); - index.CreateIndexColumn(table.TableColumns["city_id"]); - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - table = schema.CreateTable("category"); - table.CreateColumn("category_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("name", new SqlValueType(SqlType.VarChar, 25)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; - table.CreatePrimaryKey("pk_category_category_id", table.TableColumns["category_id"]); - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("film_text"); - table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("title", new SqlValueType(SqlType.VarChar, 255)); - table.CreateColumn("text", new SqlValueType(SqlType.VarCharMax)); - table.CreatePrimaryKey("pk_film_text_film_id", table.TableColumns["film_id"]); - var fullTextIndex = table.CreateFullTextIndex("idx_film_text_title_text"); - fullTextIndex.CreateIndexColumn(table.TableColumns["title"]); - fullTextIndex.CreateIndexColumn(table.TableColumns["text"]); - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("language"); - table.CreateColumn("language_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("name", new SqlValueType(SqlType.Char, 20)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_language_language_id", table.TableColumns["language_id"]); - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("film"); - table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("title", new SqlValueType(SqlType.VarChar, 255)); - column = table.CreateColumn("description", new SqlValueType(SqlType.VarCharMax)); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - column = table.CreateColumn("release_year", new SqlValueType("YEAR")); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("language_id", new SqlValueType("TINYINT UNSIGNED")); - column = table.CreateColumn("original_language_id", new SqlValueType("TINYINT UNSIGNED")); - column.IsNullable = true; - column.DefaultValue = SqlDml.Native("NULL"); - column = table.CreateColumn("rental_duration", new SqlValueType("TINYINT UNSIGNED")); - column.DefaultValue = 3; - column = table.CreateColumn("rental_rate", new SqlValueType(SqlType.Decimal, 5, 2)); - column.DefaultValue = 4.99; - column = table.CreateColumn("length", new SqlValueType("SMALLINT UNSIGNED")); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - column = table.CreateColumn("replacement_cost", new SqlValueType(SqlType.Decimal, 5, 2)); - column.DefaultValue = 19.99; - table.CreateColumn("rating", new SqlValueType("ENUM('G', 'PG', 'PG-13', 'R', 'NC-17')")).DefaultValue = 'G'; - table.CreateColumn("special_features", new SqlValueType("SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes')")).DefaultValue = null; - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; - table.CreatePrimaryKey("pk_film", table.TableColumns["film_id"]); - index = table.CreateIndex("idx_film_film_id"); - index.CreateIndexColumn(table.TableColumns["film_id"]); - foreignKey = table.CreateForeignKey("fk_film_language"); - foreignKey.ReferencedTable = schema.Tables["language"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["language_id"]); - foreignKey.Columns.Add(table.TableColumns["language_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_film_language_1"); - foreignKey.ReferencedTable = schema.Tables["language"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["language_id"]); - foreignKey.Columns.Add(table.TableColumns["original_language_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - table = schema.CreateTable("film_actor"); - table.CreateColumn("actor_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_film_actor", table.TableColumns["actor_id"], table.TableColumns["film_id"]); - foreignKey = table.CreateForeignKey("fk_film_actor_actor"); - foreignKey.ReferencedTable = schema.Tables["actor"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["actor_id"]); - foreignKey.Columns.Add(table.TableColumns["actor_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_film_actor_film"); - foreignKey.ReferencedTable = schema.Tables["film"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); - foreignKey.Columns.Add(table.TableColumns["film_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("film_category"); - table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("category_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_film_category", table.TableColumns["film_id"], table.TableColumns["category_id"]); - foreignKey = table.CreateForeignKey("fk_film_category_film"); - foreignKey.ReferencedTable = schema.Tables["film"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); - foreignKey.Columns.Add(table.TableColumns["film_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_film_category_category"); - foreignKey.ReferencedTable = schema.Tables["category"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["category_id"]); - foreignKey.Columns.Add(table.TableColumns["category_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - - table = schema.CreateTable("store"); - table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("manager_staff_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_store", table.TableColumns["store_id"]); - table.CreateUniqueConstraint("idx_unique_manager", table.TableColumns["manager_staff_id"]); - index = table.CreateIndex("idx_store_address_id"); - index.CreateIndexColumn(table.TableColumns["address_id"]); - foreignKey = table.CreateForeignKey("fk_store_address_id"); - foreignKey.ReferencedTable = schema.Tables["address"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); - foreignKey.Columns.Add(table.TableColumns["address_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - table = schema.CreateTable("staff"); - table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); - table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); - table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); - column = table.CreateColumn("picture", new SqlValueType("BLOB")); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("email", new SqlValueType(SqlType.VarChar, 50)); - table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); - column = table.CreateColumn("active", new SqlValueType(SqlType.Boolean)); - column.DefaultValue = SqlDml.Native("TRUE"); - table.CreateColumn("username", new SqlValueType(SqlType.VarChar, 16)); - column = table.CreateColumn("password", new SqlValueType("VARCHAR(40) BINARY")); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_staff", table.TableColumns["staff_id"]); - index = table.CreateIndex("idx_staff_address_id"); - index.CreateIndexColumn(table.TableColumns["address_id"]); - var secondIndex = table.CreateIndex("idx_staff_store_id"); - secondIndex.CreateIndexColumn(table.TableColumns["store_id"]); - foreignKey = table.CreateForeignKey("fk_staff_store"); - foreignKey.ReferencedTable = schema.Tables["store"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["store_id"]); - foreignKey.Columns.Add(table.TableColumns["store_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_staff_address"); - foreignKey.ReferencedTable = schema.Tables["address"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); - foreignKey.Columns.Add(table.TableColumns["address_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - batch.Add(SqlDdl.Create(secondIndex)); - - foreignKey = schema.Tables["store"].CreateForeignKey("fk_store_staff"); - schema.Tables["store"].TableConstraints.Remove(foreignKey); - foreignKey.ReferencedTable = schema.Tables["staff"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); - foreignKey.Columns.Add(schema.Tables["store"].TableColumns["manager_staff_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Alter(schema.Tables["store"], SqlDdl.AddConstraint(foreignKey))); - - table = schema.CreateTable("customer"); - table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); - table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); - column = table.CreateColumn("email", new SqlValueType(SqlType.VarChar, 50)); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); - column = table.CreateColumn("active", new SqlValueType(SqlType.Boolean)); - column.DefaultValue = SqlDml.Native("TRUE"); - table.CreateColumn("create_date", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_customer", table.TableColumns["customer_id"]); - index = table.CreateIndex("idx_store_id"); - index.CreateIndexColumn(table.TableColumns["store_id"]); - secondIndex = table.CreateIndex("idx_address_id"); - secondIndex.CreateIndexColumn(table.TableColumns["address_id"]); - var thirdIndex = table.CreateIndex("idx_last_name"); - thirdIndex.CreateIndexColumn(table.TableColumns["last_name"]); - foreignKey = table.CreateForeignKey("fk_customer_address"); - foreignKey.ReferencedTable = schema.Tables["address"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); - foreignKey.Columns.Add(table.TableColumns["address_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - batch.Add(SqlDdl.Create(secondIndex)); - batch.Add(SqlDdl.Create(thirdIndex)); - - table = schema.CreateTable("inventory"); - table.CreateColumn("inventory_id", new SqlValueType("MEDIUMINT UNSIGNED")); - table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_inventory", table.TableColumns["inventory_id"]); - table.CreateIndex("idx_inventory_film_id").CreateIndexColumn(table.TableColumns["film_id"]); - index = table.CreateIndex("idx_inventory_store_id_film_id"); - index.CreateIndexColumn(table.TableColumns["store_id"]); - index.CreateIndexColumn(table.TableColumns["film_id"]); - foreignKey = table.CreateForeignKey("fk_inventory_store"); - foreignKey.ReferencedTable = schema.Tables["store"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["store_id"]); - foreignKey.Columns.Add(table.TableColumns["store_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_inventory_film"); - foreignKey.ReferencedTable = schema.Tables["film"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); - foreignKey.Columns.Add(table.TableColumns["film_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - - table = schema.CreateTable("rental"); - table.CreateColumn("rental_id", new SqlValueType(SqlType.Int32)); - table.CreateColumn("rental_date", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("inventory_id", new SqlValueType("MEDIUMINT UNSIGNED")); - table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); - column = table.CreateColumn("return_date", new SqlValueType(SqlType.DateTime)); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_rental", table.TableColumns["rental_id"]); - table.CreateUniqueConstraint("unique_rental_date_inventory_id_customer_id", table.TableColumns["rental_date"], table.TableColumns["inventory_id"], table.TableColumns["customer_id"]); - index = table.CreateIndex("idx_rental_inventory_id"); - index.CreateIndexColumn(table.TableColumns["inventory_id"]); - secondIndex = table.CreateIndex("idx_rental_customer_id"); - secondIndex.CreateIndexColumn(table.TableColumns["customer_id"]); - thirdIndex = table.CreateIndex("idx_rental_staff_id"); - thirdIndex.CreateIndexColumn(table.TableColumns["staff_id"]); - foreignKey = table.CreateForeignKey("fk_rental_staff"); - foreignKey.ReferencedTable = schema.Tables["staff"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); - foreignKey.Columns.Add(table.TableColumns["staff_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_rental_inventory"); - foreignKey.ReferencedTable = schema.Tables["inventory"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["inventory_id"]); - foreignKey.Columns.Add(table.TableColumns["inventory_id"]); - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - batch.Add(SqlDdl.Create(secondIndex)); - batch.Add(SqlDdl.Create(thirdIndex)); - - table = schema.CreateTable("payment"); - table.CreateColumn("payment_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); - table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); - column = table.CreateColumn("rental_id", new SqlValueType(SqlType.Int32)); - column.DefaultValue = SqlDml.Native("NULL"); - column.IsNullable = true; - table.CreateColumn("amount", new SqlValueType(SqlType.Decimal, 5, 2)); - table.CreateColumn("payment_date", new SqlValueType(SqlType.DateTime)); - table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); - table.CreatePrimaryKey("pk_payment", table.TableColumns["payment_id"]); - index = table.CreateIndex("idx_payment_staff_id"); - index.CreateIndexColumn(table.TableColumns["staff_id"]); - secondIndex = table.CreateIndex("idx_payment_customer_id"); - secondIndex.CreateIndexColumn(table.TableColumns["customer_id"]); - foreignKey = table.CreateForeignKey("fk_payment_staff"); - foreignKey.ReferencedTable = schema.Tables["staff"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); - foreignKey.Columns.Add(table.TableColumns["staff_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_payment_customer"); - foreignKey.ReferencedTable = schema.Tables["customer"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["customer_id"]); - foreignKey.Columns.Add(table.TableColumns["customer_id"]); - foreignKey.OnUpdate = ReferentialAction.Cascade; - foreignKey.OnDelete = ReferentialAction.Restrict; - foreignKey = table.CreateForeignKey("fk_payment_rental"); - foreignKey.ReferencedTable = schema.Tables["rental"]; - foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["rental_id"]); - foreignKey.Columns.Add(table.TableColumns["rental_id"]); - batch.Add(SqlDdl.Create(table)); - batch.Add(SqlDdl.Create(index)); - batch.Add(SqlDdl.Create(secondIndex)); - - table = schema.CreateTable("table1"); - table.CreateColumn("field1", new SqlValueType(SqlType.Int32)); - table.CreateColumn("field2", new SqlValueType(SqlType.VarChar, 20)).IsNullable = true; - batch.Add(SqlDdl.Create(table)); - - var view = schema.CreateView("customer_list", SqlDml.Native(@"SELECT cu.customer_id AS ID, CONCAT(cu.first_name, _utf8' ', cu.last_name) AS name, a.address AS address, a.postal_code AS `zip code`, - a.phone AS phone, city.city AS city, country.country AS country, IF(cu.active, _utf8'active',_utf8'') AS notes, cu.store_id AS SID - FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id - JOIN country ON city.country_id = country.country_id")); - - batch.Add(SqlDdl.Create(view)); - - using (var cmd = SqlConnection.CreateCommand()) { - cmd.CommandText = SqlDriver.Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - Catalog = SqlDriver.ExtractCatalog(SqlConnection); - } - - private void InsertTestData() - { - DisableConstraintChecks(); - ParseDataDump(); - EnableConstraintChecks(); - } - - private void ParseDataDump() - { - using (var reader = new StreamReader(sakilaDataBackupPath)) { - string line; - while ((line = reader.ReadLine())!=null) { - if (line.StartsWith("--") || string.IsNullOrWhiteSpace(line) || - line.StartsWith("SET @") || line.StartsWith("SET SQL") || - line.StartsWith("SET FOREIGN") || line.StartsWith("SET UNIQUE") || - line.StartsWith("USE")) - continue; - ExecuteCommand(line); - } - } - } - - private void DropAllTables(Schema schema, bool extractCatalogAfterDropping) - { - var batch = SqlDml.Batch(); - var foreignKeys = schema.Tables.SelectMany(el => el.TableConstraints.OfType()); - foreach (var foreignKey in foreignKeys) - batch.Add(SqlDdl.Alter(foreignKey.Table, SqlDdl.DropConstraint(foreignKey))); - foreach (var view in schema.Views) { - batch.Add(SqlDdl.Drop(view)); - schema.Tables.Remove(schema.Tables[view.Name]); - } - foreach (var table in schema.Tables) - batch.Add(SqlDdl.Drop(table)); - if (batch.Count<=0) - return; - var sqlCommand = SqlConnection.CreateCommand(); - sqlCommand.CommandText = SqlDriver.Compile(batch).GetCommandText(); - sqlCommand.ExecuteNonQuery(); - if (extractCatalogAfterDropping) - Catalog = SqlDriver.ExtractCatalog(SqlConnection); - } - - private void DisableConstraintChecks() - { - using (var sqlCommand = SqlConnection.CreateCommand()) { - sqlCommand.CommandText = @"SET @'OLD_UNIQUE_CHECKS'=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; - SET @'OLD_FOREIGN_KEY_CHECKS'=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; - SET @'OLD_SQL_MODE'=@@SQL_MODE, SQL_MODE='TRADITIONAL';"; - sqlCommand.ExecuteNonQuery(); - } - } - - private void EnableConstraintChecks() - { - using (var sqlCommand = SqlConnection.CreateCommand()) { - sqlCommand.CommandText = @"SET SQL_MODE=@'OLD_SQL_MODE'; - SET FOREIGN_KEY_CHECKS=@'OLD_FOREIGN_KEY_CHECKS'; - SET UNIQUE_CHECKS=@'OLD_UNIQUE_CHECKS';"; - sqlCommand.ExecuteNonQuery(); - } - } - - private void ExecuteCommand(string commandText) - { - using (var sqlCommand = SqlConnection.CreateCommand()) { - sqlCommand.CommandText = commandText; - sqlCommand.ExecuteNonQuery(); - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.17 + +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + [TestFixture] + public abstract class Sakila + { + private readonly string sakilaDataBackupPath = Environment.CurrentDirectory + @"\MySQL\SakilaDb\sakila-data.sql"; + protected ConnectionInfo ConnectionInfo = TestConnectionInfoProvider.GetConnectionInfo(); + protected SqlDriver SqlDriver; + protected SqlConnection SqlConnection; + + public Catalog Catalog { get; protected set; } + + [OneTimeSetUp] + public virtual void SetUp() + { + CheckRequirements(); + SqlDriver = TestSqlDriver.Create(ConnectionInfo.ConnectionUrl.Url); + SqlConnection = SqlDriver.CreateConnection(); + SqlConnection.Open(); + Catalog = SqlDriver.ExtractCatalog(SqlConnection); + DropAllTables(Catalog.DefaultSchema, true); + CreateSchema(); + InsertTestData(); + } + + [OneTimeTearDown] + public virtual void TearDown() + { + if (Catalog!=null) + DropAllTables(Catalog.DefaultSchema, false); + if (SqlConnection!=null && SqlConnection.State!=ConnectionState.Closed) + SqlConnection.Close(); + } + + protected virtual void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + + private void CreateSchema() + { + var schema = Catalog.DefaultSchema; + + var batch = SqlDml.Batch(); + var table = schema.CreateTable("actor"); + table.CreateColumn("actor_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); + table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP");// add default value and on update event + table.CreatePrimaryKey("pk_actor_actor_id", table.TableColumns["actor_id"]); + var index = table.CreateIndex("inx_actor_last_name"); + index.CreateIndexColumn(table.TableColumns["last_name"]); + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + + table = schema.CreateTable("country"); + table.CreateColumn("country_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("country", new SqlValueType(SqlType.VarChar, 50)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; + table.CreatePrimaryKey("pk_country_country_id", table.TableColumns["country_id"]); + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("city"); + table.CreateColumn("city_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("city", new SqlValueType(SqlType.VarChar, 50)); + table.CreateColumn("country_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; + table.CreatePrimaryKey("pk_city_city_id", table.TableColumns["city_id"]); + var foreignKey = table.CreateForeignKey("fk_city_country"); + foreignKey.ReferencedTable = schema.Tables["country"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["country_id"]); + foreignKey.Columns.Add(table.TableColumns["country_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + index = table.CreateIndex("inx_city_country_id"); + index.CreateIndexColumn(table.TableColumns["country_id"]); + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + table = schema.CreateTable("address"); + table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("address", new SqlValueType(SqlType.VarChar, 50)); + var column = table.CreateColumn("address2", new SqlValueType(SqlType.VarChar, 50)); + column.IsNullable = true; + column.DefaultValue = SqlDml.Native("NULL"); + table.CreateColumn("district", new SqlValueType(SqlType.VarChar, 20)); + table.CreateColumn("city_id", new SqlValueType("SMALLINT UNSIGNED")); + column = table.CreateColumn("postal_code", new SqlValueType(SqlType.VarChar, 20)); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("phone", new SqlValueType(SqlType.VarChar, 20)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_address_address_id", table.TableColumns["address_id"]); + foreignKey = table.CreateForeignKey("fk_address_city"); + foreignKey.ReferencedTable = schema.Tables["city"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["city_id"]); + foreignKey.Columns.Add(table.TableColumns["city_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + index = table.CreateIndex("inx_address_city_id"); + index.CreateIndexColumn(table.TableColumns["city_id"]); + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + table = schema.CreateTable("category"); + table.CreateColumn("category_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("name", new SqlValueType(SqlType.VarChar, 25)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; + table.CreatePrimaryKey("pk_category_category_id", table.TableColumns["category_id"]); + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("film_text"); + table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("title", new SqlValueType(SqlType.VarChar, 255)); + table.CreateColumn("text", new SqlValueType(SqlType.VarCharMax)); + table.CreatePrimaryKey("pk_film_text_film_id", table.TableColumns["film_id"]); + var fullTextIndex = table.CreateFullTextIndex("idx_film_text_title_text"); + fullTextIndex.CreateIndexColumn(table.TableColumns["title"]); + fullTextIndex.CreateIndexColumn(table.TableColumns["text"]); + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("language"); + table.CreateColumn("language_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("name", new SqlValueType(SqlType.Char, 20)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_language_language_id", table.TableColumns["language_id"]); + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("film"); + table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("title", new SqlValueType(SqlType.VarChar, 255)); + column = table.CreateColumn("description", new SqlValueType(SqlType.VarCharMax)); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + column = table.CreateColumn("release_year", new SqlValueType("YEAR")); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("language_id", new SqlValueType("TINYINT UNSIGNED")); + column = table.CreateColumn("original_language_id", new SqlValueType("TINYINT UNSIGNED")); + column.IsNullable = true; + column.DefaultValue = SqlDml.Native("NULL"); + column = table.CreateColumn("rental_duration", new SqlValueType("TINYINT UNSIGNED")); + column.DefaultValue = 3; + column = table.CreateColumn("rental_rate", new SqlValueType(SqlType.Decimal, 5, 2)); + column.DefaultValue = 4.99; + column = table.CreateColumn("length", new SqlValueType("SMALLINT UNSIGNED")); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + column = table.CreateColumn("replacement_cost", new SqlValueType(SqlType.Decimal, 5, 2)); + column.DefaultValue = 19.99; + table.CreateColumn("rating", new SqlValueType("ENUM('G', 'PG', 'PG-13', 'R', 'NC-17')")).DefaultValue = 'G'; + table.CreateColumn("special_features", new SqlValueType("SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes')")).DefaultValue = null; + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); ; + table.CreatePrimaryKey("pk_film", table.TableColumns["film_id"]); + index = table.CreateIndex("idx_film_film_id"); + index.CreateIndexColumn(table.TableColumns["film_id"]); + foreignKey = table.CreateForeignKey("fk_film_language"); + foreignKey.ReferencedTable = schema.Tables["language"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["language_id"]); + foreignKey.Columns.Add(table.TableColumns["language_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_film_language_1"); + foreignKey.ReferencedTable = schema.Tables["language"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["language_id"]); + foreignKey.Columns.Add(table.TableColumns["original_language_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + table = schema.CreateTable("film_actor"); + table.CreateColumn("actor_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_film_actor", table.TableColumns["actor_id"], table.TableColumns["film_id"]); + foreignKey = table.CreateForeignKey("fk_film_actor_actor"); + foreignKey.ReferencedTable = schema.Tables["actor"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["actor_id"]); + foreignKey.Columns.Add(table.TableColumns["actor_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_film_actor_film"); + foreignKey.ReferencedTable = schema.Tables["film"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); + foreignKey.Columns.Add(table.TableColumns["film_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("film_category"); + table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("category_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_film_category", table.TableColumns["film_id"], table.TableColumns["category_id"]); + foreignKey = table.CreateForeignKey("fk_film_category_film"); + foreignKey.ReferencedTable = schema.Tables["film"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); + foreignKey.Columns.Add(table.TableColumns["film_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_film_category_category"); + foreignKey.ReferencedTable = schema.Tables["category"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["category_id"]); + foreignKey.Columns.Add(table.TableColumns["category_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + + table = schema.CreateTable("store"); + table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("manager_staff_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_store", table.TableColumns["store_id"]); + table.CreateUniqueConstraint("idx_unique_manager", table.TableColumns["manager_staff_id"]); + index = table.CreateIndex("idx_store_address_id"); + index.CreateIndexColumn(table.TableColumns["address_id"]); + foreignKey = table.CreateForeignKey("fk_store_address_id"); + foreignKey.ReferencedTable = schema.Tables["address"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); + foreignKey.Columns.Add(table.TableColumns["address_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + table = schema.CreateTable("staff"); + table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); + table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); + table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); + column = table.CreateColumn("picture", new SqlValueType("BLOB")); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("email", new SqlValueType(SqlType.VarChar, 50)); + table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); + column = table.CreateColumn("active", new SqlValueType(SqlType.Boolean)); + column.DefaultValue = SqlDml.Native("TRUE"); + table.CreateColumn("username", new SqlValueType(SqlType.VarChar, 16)); + column = table.CreateColumn("password", new SqlValueType("VARCHAR(40) BINARY")); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_staff", table.TableColumns["staff_id"]); + index = table.CreateIndex("idx_staff_address_id"); + index.CreateIndexColumn(table.TableColumns["address_id"]); + var secondIndex = table.CreateIndex("idx_staff_store_id"); + secondIndex.CreateIndexColumn(table.TableColumns["store_id"]); + foreignKey = table.CreateForeignKey("fk_staff_store"); + foreignKey.ReferencedTable = schema.Tables["store"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["store_id"]); + foreignKey.Columns.Add(table.TableColumns["store_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_staff_address"); + foreignKey.ReferencedTable = schema.Tables["address"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); + foreignKey.Columns.Add(table.TableColumns["address_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + batch.Add(SqlDdl.Create(secondIndex)); + + foreignKey = schema.Tables["store"].CreateForeignKey("fk_store_staff"); + schema.Tables["store"].TableConstraints.Remove(foreignKey); + foreignKey.ReferencedTable = schema.Tables["staff"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); + foreignKey.Columns.Add(schema.Tables["store"].TableColumns["manager_staff_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Alter(schema.Tables["store"], SqlDdl.AddConstraint(foreignKey))); + + table = schema.CreateTable("customer"); + table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("first_name", new SqlValueType(SqlType.VarChar, 45)); + table.CreateColumn("last_name", new SqlValueType(SqlType.VarChar, 45)); + column = table.CreateColumn("email", new SqlValueType(SqlType.VarChar, 50)); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("address_id", new SqlValueType("SMALLINT UNSIGNED")); + column = table.CreateColumn("active", new SqlValueType(SqlType.Boolean)); + column.DefaultValue = SqlDml.Native("TRUE"); + table.CreateColumn("create_date", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_customer", table.TableColumns["customer_id"]); + index = table.CreateIndex("idx_store_id"); + index.CreateIndexColumn(table.TableColumns["store_id"]); + secondIndex = table.CreateIndex("idx_address_id"); + secondIndex.CreateIndexColumn(table.TableColumns["address_id"]); + var thirdIndex = table.CreateIndex("idx_last_name"); + thirdIndex.CreateIndexColumn(table.TableColumns["last_name"]); + foreignKey = table.CreateForeignKey("fk_customer_address"); + foreignKey.ReferencedTable = schema.Tables["address"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["address_id"]); + foreignKey.Columns.Add(table.TableColumns["address_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + batch.Add(SqlDdl.Create(secondIndex)); + batch.Add(SqlDdl.Create(thirdIndex)); + + table = schema.CreateTable("inventory"); + table.CreateColumn("inventory_id", new SqlValueType("MEDIUMINT UNSIGNED")); + table.CreateColumn("film_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("store_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_inventory", table.TableColumns["inventory_id"]); + table.CreateIndex("idx_inventory_film_id").CreateIndexColumn(table.TableColumns["film_id"]); + index = table.CreateIndex("idx_inventory_store_id_film_id"); + index.CreateIndexColumn(table.TableColumns["store_id"]); + index.CreateIndexColumn(table.TableColumns["film_id"]); + foreignKey = table.CreateForeignKey("fk_inventory_store"); + foreignKey.ReferencedTable = schema.Tables["store"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["store_id"]); + foreignKey.Columns.Add(table.TableColumns["store_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_inventory_film"); + foreignKey.ReferencedTable = schema.Tables["film"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["film_id"]); + foreignKey.Columns.Add(table.TableColumns["film_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + + table = schema.CreateTable("rental"); + table.CreateColumn("rental_id", new SqlValueType(SqlType.Int32)); + table.CreateColumn("rental_date", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("inventory_id", new SqlValueType("MEDIUMINT UNSIGNED")); + table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); + column = table.CreateColumn("return_date", new SqlValueType(SqlType.DateTime)); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_rental", table.TableColumns["rental_id"]); + table.CreateUniqueConstraint("unique_rental_date_inventory_id_customer_id", table.TableColumns["rental_date"], table.TableColumns["inventory_id"], table.TableColumns["customer_id"]); + index = table.CreateIndex("idx_rental_inventory_id"); + index.CreateIndexColumn(table.TableColumns["inventory_id"]); + secondIndex = table.CreateIndex("idx_rental_customer_id"); + secondIndex.CreateIndexColumn(table.TableColumns["customer_id"]); + thirdIndex = table.CreateIndex("idx_rental_staff_id"); + thirdIndex.CreateIndexColumn(table.TableColumns["staff_id"]); + foreignKey = table.CreateForeignKey("fk_rental_staff"); + foreignKey.ReferencedTable = schema.Tables["staff"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); + foreignKey.Columns.Add(table.TableColumns["staff_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_rental_inventory"); + foreignKey.ReferencedTable = schema.Tables["inventory"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["inventory_id"]); + foreignKey.Columns.Add(table.TableColumns["inventory_id"]); + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + batch.Add(SqlDdl.Create(secondIndex)); + batch.Add(SqlDdl.Create(thirdIndex)); + + table = schema.CreateTable("payment"); + table.CreateColumn("payment_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("customer_id", new SqlValueType("SMALLINT UNSIGNED")); + table.CreateColumn("staff_id", new SqlValueType("TINYINT UNSIGNED")); + column = table.CreateColumn("rental_id", new SqlValueType(SqlType.Int32)); + column.DefaultValue = SqlDml.Native("NULL"); + column.IsNullable = true; + table.CreateColumn("amount", new SqlValueType(SqlType.Decimal, 5, 2)); + table.CreateColumn("payment_date", new SqlValueType(SqlType.DateTime)); + table.CreateColumn("last_update", new SqlValueType("TIMESTAMP")).DefaultValue = SqlDml.Native("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"); + table.CreatePrimaryKey("pk_payment", table.TableColumns["payment_id"]); + index = table.CreateIndex("idx_payment_staff_id"); + index.CreateIndexColumn(table.TableColumns["staff_id"]); + secondIndex = table.CreateIndex("idx_payment_customer_id"); + secondIndex.CreateIndexColumn(table.TableColumns["customer_id"]); + foreignKey = table.CreateForeignKey("fk_payment_staff"); + foreignKey.ReferencedTable = schema.Tables["staff"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["staff_id"]); + foreignKey.Columns.Add(table.TableColumns["staff_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_payment_customer"); + foreignKey.ReferencedTable = schema.Tables["customer"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["customer_id"]); + foreignKey.Columns.Add(table.TableColumns["customer_id"]); + foreignKey.OnUpdate = ReferentialAction.Cascade; + foreignKey.OnDelete = ReferentialAction.Restrict; + foreignKey = table.CreateForeignKey("fk_payment_rental"); + foreignKey.ReferencedTable = schema.Tables["rental"]; + foreignKey.ReferencedColumns.Add(foreignKey.ReferencedTable.TableColumns["rental_id"]); + foreignKey.Columns.Add(table.TableColumns["rental_id"]); + batch.Add(SqlDdl.Create(table)); + batch.Add(SqlDdl.Create(index)); + batch.Add(SqlDdl.Create(secondIndex)); + + table = schema.CreateTable("table1"); + table.CreateColumn("field1", new SqlValueType(SqlType.Int32)); + table.CreateColumn("field2", new SqlValueType(SqlType.VarChar, 20)).IsNullable = true; + batch.Add(SqlDdl.Create(table)); + + var view = schema.CreateView("customer_list", SqlDml.Native(@"SELECT cu.customer_id AS ID, CONCAT(cu.first_name, _utf8' ', cu.last_name) AS name, a.address AS address, a.postal_code AS `zip code`, + a.phone AS phone, city.city AS city, country.country AS country, IF(cu.active, _utf8'active',_utf8'') AS notes, cu.store_id AS SID + FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id + JOIN country ON city.country_id = country.country_id")); + + batch.Add(SqlDdl.Create(view)); + + using (var cmd = SqlConnection.CreateCommand()) { + cmd.CommandText = SqlDriver.Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + Catalog = SqlDriver.ExtractCatalog(SqlConnection); + } + + private void InsertTestData() + { + DisableConstraintChecks(); + ParseDataDump(); + EnableConstraintChecks(); + } + + private void ParseDataDump() + { + using (var reader = new StreamReader(sakilaDataBackupPath)) { + string line; + while ((line = reader.ReadLine())!=null) { + if (line.StartsWith("--") || string.IsNullOrWhiteSpace(line) || + line.StartsWith("SET @") || line.StartsWith("SET SQL") || + line.StartsWith("SET FOREIGN") || line.StartsWith("SET UNIQUE") || + line.StartsWith("USE")) + continue; + ExecuteCommand(line); + } + } + } + + private void DropAllTables(Schema schema, bool extractCatalogAfterDropping) + { + var batch = SqlDml.Batch(); + var foreignKeys = schema.Tables.SelectMany(el => el.TableConstraints.OfType()); + foreach (var foreignKey in foreignKeys) + batch.Add(SqlDdl.Alter(foreignKey.Table, SqlDdl.DropConstraint(foreignKey))); + foreach (var view in schema.Views) { + batch.Add(SqlDdl.Drop(view)); + schema.Tables.Remove(schema.Tables[view.Name]); + } + foreach (var table in schema.Tables) + batch.Add(SqlDdl.Drop(table)); + if (batch.Count<=0) + return; + var sqlCommand = SqlConnection.CreateCommand(); + sqlCommand.CommandText = SqlDriver.Compile(batch).GetCommandText(); + sqlCommand.ExecuteNonQuery(); + if (extractCatalogAfterDropping) + Catalog = SqlDriver.ExtractCatalog(SqlConnection); + } + + private void DisableConstraintChecks() + { + using (var sqlCommand = SqlConnection.CreateCommand()) { + sqlCommand.CommandText = @"SET @'OLD_UNIQUE_CHECKS'=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; + SET @'OLD_FOREIGN_KEY_CHECKS'=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; + SET @'OLD_SQL_MODE'=@@SQL_MODE, SQL_MODE='TRADITIONAL';"; + sqlCommand.ExecuteNonQuery(); + } + } + + private void EnableConstraintChecks() + { + using (var sqlCommand = SqlConnection.CreateCommand()) { + sqlCommand.CommandText = @"SET SQL_MODE=@'OLD_SQL_MODE'; + SET FOREIGN_KEY_CHECKS=@'OLD_FOREIGN_KEY_CHECKS'; + SET UNIQUE_CHECKS=@'OLD_UNIQUE_CHECKS';"; + sqlCommand.ExecuteNonQuery(); + } + } + + private void ExecuteCommand(string commandText) + { + using (var sqlCommand = SqlConnection.CreateCommand()) { + sqlCommand.CommandText = commandText; + sqlCommand.ExecuteNonQuery(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/CreateTestUser.sql b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/CreateTestUser.sql index 010c81db2f..ab32887a64 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/CreateTestUser.sql +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/CreateTestUser.sql @@ -1,7 +1,7 @@ --- Create MySQL DO User --- Creates do4test user in mysql to enable the tests to run - -use mysql; -create user 'root'@'localhost' identified by 'admin'; -grant all privileges on *.* to 'root'@'localhost'; +-- Create MySQL DO User +-- Creates do4test user in mysql to enable the tests to run + +use mysql; +create user 'root'@'localhost' identified by 'admin'; +grant all privileges on *.* to 'root'@'localhost'; flush privileges; \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/sakila-data.sql b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/sakila-data.sql index f961b37425..65d52f7f65 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/sakila-data.sql +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaDb/sakila-data.sql @@ -1,163 +1,163 @@ --- Sakila Sample Database Data --- Version 0.8 - --- Copyright (c) 2006, MySQL AB --- All rights reserved. - --- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - --- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. --- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. --- * Neither the name of MySQL AB nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - --- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; -SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; -SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; - -USE sakila; - --- --- Dumping data for table actor --- - -SET AUTOCOMMIT=0; -INSERT INTO actor VALUES (1,'PENELOPE','GUINESS','2006-02-15 04:34:33'),(2,'NICK','WAHLBERG','2006-02-15 04:34:33'),(3,'ED','CHASE','2006-02-15 04:34:33'),(4,'JENNIFER','DAVIS','2006-02-15 04:34:33'),(5,'JOHNNY','LOLLOBRIGIDA','2006-02-15 04:34:33'),(6,'BETTE','NICHOLSON','2006-02-15 04:34:33'),(7,'GRACE','MOSTEL','2006-02-15 04:34:33'),(8,'MATTHEW','JOHANSSON','2006-02-15 04:34:33'),(9,'JOE','SWANK','2006-02-15 04:34:33'),(10,'CHRISTIAN','GABLE','2006-02-15 04:34:33'),(11,'ZERO','CAGE','2006-02-15 04:34:33'),(12,'KARL','BERRY','2006-02-15 04:34:33'),(13,'UMA','WOOD','2006-02-15 04:34:33'),(14,'VIVIEN','BERGEN','2006-02-15 04:34:33'),(15,'CUBA','OLIVIER','2006-02-15 04:34:33'),(16,'FRED','COSTNER','2006-02-15 04:34:33'),(17,'HELEN','VOIGHT','2006-02-15 04:34:33'),(18,'DAN','TORN','2006-02-15 04:34:33'),(19,'BOB','FAWCETT','2006-02-15 04:34:33'),(20,'LUCILLE','TRACY','2006-02-15 04:34:33'),(21,'KIRSTEN','PALTROW','2006-02-15 04:34:33'),(22,'ELVIS','MARX','2006-02-15 04:34:33'),(23,'SANDRA','KILMER','2006-02-15 04:34:33'),(24,'CAMERON','STREEP','2006-02-15 04:34:33'),(25,'KEVIN','BLOOM','2006-02-15 04:34:33'),(26,'RIP','CRAWFORD','2006-02-15 04:34:33'),(27,'JULIA','MCQUEEN','2006-02-15 04:34:33'),(28,'WOODY','HOFFMAN','2006-02-15 04:34:33'),(29,'ALEC','WAYNE','2006-02-15 04:34:33'),(30,'SANDRA','PECK','2006-02-15 04:34:33'),(31,'SISSY','SOBIESKI','2006-02-15 04:34:33'),(32,'TIM','HACKMAN','2006-02-15 04:34:33'),(33,'MILLA','PECK','2006-02-15 04:34:33'),(34,'AUDREY','OLIVIER','2006-02-15 04:34:33'),(35,'JUDY','DEAN','2006-02-15 04:34:33'),(36,'BURT','DUKAKIS','2006-02-15 04:34:33'),(37,'VAL','BOLGER','2006-02-15 04:34:33'),(38,'TOM','MCKELLEN','2006-02-15 04:34:33'),(39,'GOLDIE','BRODY','2006-02-15 04:34:33'),(40,'JOHNNY','CAGE','2006-02-15 04:34:33'),(41,'JODIE','DEGENERES','2006-02-15 04:34:33'),(42,'TOM','MIRANDA','2006-02-15 04:34:33'),(43,'KIRK','JOVOVICH','2006-02-15 04:34:33'),(44,'NICK','STALLONE','2006-02-15 04:34:33'),(45,'REESE','KILMER','2006-02-15 04:34:33'),(46,'PARKER','GOLDBERG','2006-02-15 04:34:33'),(47,'JULIA','BARRYMORE','2006-02-15 04:34:33'),(48,'FRANCES','DAY-LEWIS','2006-02-15 04:34:33'),(49,'ANNE','CRONYN','2006-02-15 04:34:33'),(50,'NATALIE','HOPKINS','2006-02-15 04:34:33'),(51,'GARY','PHOENIX','2006-02-15 04:34:33'),(52,'CARMEN','HUNT','2006-02-15 04:34:33'),(53,'MENA','TEMPLE','2006-02-15 04:34:33'),(54,'PENELOPE','PINKETT','2006-02-15 04:34:33'),(55,'FAY','KILMER','2006-02-15 04:34:33'),(56,'DAN','HARRIS','2006-02-15 04:34:33'),(57,'JUDE','CRUISE','2006-02-15 04:34:33'),(58,'CHRISTIAN','AKROYD','2006-02-15 04:34:33'),(59,'DUSTIN','TAUTOU','2006-02-15 04:34:33'),(60,'HENRY','BERRY','2006-02-15 04:34:33'),(61,'CHRISTIAN','NEESON','2006-02-15 04:34:33'),(62,'JAYNE','NEESON','2006-02-15 04:34:33'),(63,'CAMERON','WRAY','2006-02-15 04:34:33'),(64,'RAY','JOHANSSON','2006-02-15 04:34:33'),(65,'ANGELA','HUDSON','2006-02-15 04:34:33'),(66,'MARY','TANDY','2006-02-15 04:34:33'),(67,'JESSICA','BAILEY','2006-02-15 04:34:33'),(68,'RIP','WINSLET','2006-02-15 04:34:33'),(69,'KENNETH','PALTROW','2006-02-15 04:34:33'),(70,'MICHELLE','MCCONAUGHEY','2006-02-15 04:34:33'),(71,'ADAM','GRANT','2006-02-15 04:34:33'),(72,'SEAN','WILLIAMS','2006-02-15 04:34:33'),(73,'GARY','PENN','2006-02-15 04:34:33'),(74,'MILLA','KEITEL','2006-02-15 04:34:33'),(75,'BURT','POSEY','2006-02-15 04:34:33'),(76,'ANGELINA','ASTAIRE','2006-02-15 04:34:33'),(77,'CARY','MCCONAUGHEY','2006-02-15 04:34:33'),(78,'GROUCHO','SINATRA','2006-02-15 04:34:33'),(79,'MAE','HOFFMAN','2006-02-15 04:34:33'),(80,'RALPH','CRUZ','2006-02-15 04:34:33'),(81,'SCARLETT','DAMON','2006-02-15 04:34:33'),(82,'WOODY','JOLIE','2006-02-15 04:34:33'),(83,'BEN','WILLIS','2006-02-15 04:34:33'),(84,'JAMES','PITT','2006-02-15 04:34:33'),(85,'MINNIE','ZELLWEGER','2006-02-15 04:34:33'),(86,'GREG','CHAPLIN','2006-02-15 04:34:33'),(87,'SPENCER','PECK','2006-02-15 04:34:33'),(88,'KENNETH','PESCI','2006-02-15 04:34:33'),(89,'CHARLIZE','DENCH','2006-02-15 04:34:33'),(90,'SEAN','GUINESS','2006-02-15 04:34:33'),(91,'CHRISTOPHER','BERRY','2006-02-15 04:34:33'),(92,'KIRSTEN','AKROYD','2006-02-15 04:34:33'),(93,'ELLEN','PRESLEY','2006-02-15 04:34:33'),(94,'KENNETH','TORN','2006-02-15 04:34:33'),(95,'DARYL','WAHLBERG','2006-02-15 04:34:33'),(96,'GENE','WILLIS','2006-02-15 04:34:33'),(97,'MEG','HAWKE','2006-02-15 04:34:33'),(98,'CHRIS','BRIDGES','2006-02-15 04:34:33'),(99,'JIM','MOSTEL','2006-02-15 04:34:33'),(100,'SPENCER','DEPP','2006-02-15 04:34:33'),(101,'SUSAN','DAVIS','2006-02-15 04:34:33'),(102,'WALTER','TORN','2006-02-15 04:34:33'),(103,'MATTHEW','LEIGH','2006-02-15 04:34:33'),(104,'PENELOPE','CRONYN','2006-02-15 04:34:33'),(105,'SIDNEY','CROWE','2006-02-15 04:34:33'),(106,'GROUCHO','DUNST','2006-02-15 04:34:33'),(107,'GINA','DEGENERES','2006-02-15 04:34:33'),(108,'WARREN','NOLTE','2006-02-15 04:34:33'),(109,'SYLVESTER','DERN','2006-02-15 04:34:33'),(110,'SUSAN','DAVIS','2006-02-15 04:34:33'),(111,'CAMERON','ZELLWEGER','2006-02-15 04:34:33'),(112,'RUSSELL','BACALL','2006-02-15 04:34:33'),(113,'MORGAN','HOPKINS','2006-02-15 04:34:33'),(114,'MORGAN','MCDORMAND','2006-02-15 04:34:33'),(115,'HARRISON','BALE','2006-02-15 04:34:33'),(116,'DAN','STREEP','2006-02-15 04:34:33'),(117,'RENEE','TRACY','2006-02-15 04:34:33'),(118,'CUBA','ALLEN','2006-02-15 04:34:33'),(119,'WARREN','JACKMAN','2006-02-15 04:34:33'),(120,'PENELOPE','MONROE','2006-02-15 04:34:33'),(121,'LIZA','BERGMAN','2006-02-15 04:34:33'),(122,'SALMA','NOLTE','2006-02-15 04:34:33'),(123,'JULIANNE','DENCH','2006-02-15 04:34:33'),(124,'SCARLETT','BENING','2006-02-15 04:34:33'),(125,'ALBERT','NOLTE','2006-02-15 04:34:33'),(126,'FRANCES','TOMEI','2006-02-15 04:34:33'),(127,'KEVIN','GARLAND','2006-02-15 04:34:33'),(128,'CATE','MCQUEEN','2006-02-15 04:34:33'),(129,'DARYL','CRAWFORD','2006-02-15 04:34:33'),(130,'GRETA','KEITEL','2006-02-15 04:34:33'),(131,'JANE','JACKMAN','2006-02-15 04:34:33'),(132,'ADAM','HOPPER','2006-02-15 04:34:33'),(133,'RICHARD','PENN','2006-02-15 04:34:33'),(134,'GENE','HOPKINS','2006-02-15 04:34:33'),(135,'RITA','REYNOLDS','2006-02-15 04:34:33'),(136,'ED','MANSFIELD','2006-02-15 04:34:33'),(137,'MORGAN','WILLIAMS','2006-02-15 04:34:33'),(138,'LUCILLE','DEE','2006-02-15 04:34:33'),(139,'EWAN','GOODING','2006-02-15 04:34:33'),(140,'WHOOPI','HURT','2006-02-15 04:34:33'),(141,'CATE','HARRIS','2006-02-15 04:34:33'),(142,'JADA','RYDER','2006-02-15 04:34:33'),(143,'RIVER','DEAN','2006-02-15 04:34:33'),(144,'ANGELA','WITHERSPOON','2006-02-15 04:34:33'),(145,'KIM','ALLEN','2006-02-15 04:34:33'),(146,'ALBERT','JOHANSSON','2006-02-15 04:34:33'),(147,'FAY','WINSLET','2006-02-15 04:34:33'),(148,'EMILY','DEE','2006-02-15 04:34:33'),(149,'RUSSELL','TEMPLE','2006-02-15 04:34:33'),(150,'JAYNE','NOLTE','2006-02-15 04:34:33'),(151,'GEOFFREY','HESTON','2006-02-15 04:34:33'),(152,'BEN','HARRIS','2006-02-15 04:34:33'),(153,'MINNIE','KILMER','2006-02-15 04:34:33'),(154,'MERYL','GIBSON','2006-02-15 04:34:33'),(155,'IAN','TANDY','2006-02-15 04:34:33'),(156,'FAY','WOOD','2006-02-15 04:34:33'),(157,'GRETA','MALDEN','2006-02-15 04:34:33'),(158,'VIVIEN','BASINGER','2006-02-15 04:34:33'),(159,'LAURA','BRODY','2006-02-15 04:34:33'),(160,'CHRIS','DEPP','2006-02-15 04:34:33'),(161,'HARVEY','HOPE','2006-02-15 04:34:33'),(162,'OPRAH','KILMER','2006-02-15 04:34:33'),(163,'CHRISTOPHER','WEST','2006-02-15 04:34:33'),(164,'HUMPHREY','WILLIS','2006-02-15 04:34:33'),(165,'AL','GARLAND','2006-02-15 04:34:33'),(166,'NICK','DEGENERES','2006-02-15 04:34:33'),(167,'LAURENCE','BULLOCK','2006-02-15 04:34:33'),(168,'WILL','WILSON','2006-02-15 04:34:33'),(169,'KENNETH','HOFFMAN','2006-02-15 04:34:33'),(170,'MENA','HOPPER','2006-02-15 04:34:33'),(171,'OLYMPIA','PFEIFFER','2006-02-15 04:34:33'),(172,'GROUCHO','WILLIAMS','2006-02-15 04:34:33'),(173,'ALAN','DREYFUSS','2006-02-15 04:34:33'),(174,'MICHAEL','BENING','2006-02-15 04:34:33'),(175,'WILLIAM','HACKMAN','2006-02-15 04:34:33'),(176,'JON','CHASE','2006-02-15 04:34:33'),(177,'GENE','MCKELLEN','2006-02-15 04:34:33'),(178,'LISA','MONROE','2006-02-15 04:34:33'),(179,'ED','GUINESS','2006-02-15 04:34:33'),(180,'JEFF','SILVERSTONE','2006-02-15 04:34:33'),(181,'MATTHEW','CARREY','2006-02-15 04:34:33'),(182,'DEBBIE','AKROYD','2006-02-15 04:34:33'),(183,'RUSSELL','CLOSE','2006-02-15 04:34:33'),(184,'HUMPHREY','GARLAND','2006-02-15 04:34:33'),(185,'MICHAEL','BOLGER','2006-02-15 04:34:33'),(186,'JULIA','ZELLWEGER','2006-02-15 04:34:33'),(187,'RENEE','BALL','2006-02-15 04:34:33'),(188,'ROCK','DUKAKIS','2006-02-15 04:34:33'),(189,'CUBA','BIRCH','2006-02-15 04:34:33'),(190,'AUDREY','BAILEY','2006-02-15 04:34:33'),(191,'GREGORY','GOODING','2006-02-15 04:34:33'),(192,'JOHN','SUVARI','2006-02-15 04:34:33'),(193,'BURT','TEMPLE','2006-02-15 04:34:33'),(194,'MERYL','ALLEN','2006-02-15 04:34:33'),(195,'JAYNE','SILVERSTONE','2006-02-15 04:34:33'),(196,'BELA','WALKEN','2006-02-15 04:34:33'),(197,'REESE','WEST','2006-02-15 04:34:33'),(198,'MARY','KEITEL','2006-02-15 04:34:33'),(199,'JULIA','FAWCETT','2006-02-15 04:34:33'),(200,'THORA','TEMPLE','2006-02-15 04:34:33'); -COMMIT; - --- --- Dumping data for table address --- - -SET AUTOCOMMIT=0; -INSERT INTO address VALUES (1,'47 MySakila Drive',NULL,'Alberta',300,'','','2006-02-15 04:45:30'),(2,'28 MySQL Boulevard',NULL,'QLD',576,'','','2006-02-15 04:45:30'),(3,'23 Workhaven Lane',NULL,'Alberta',300,'','14033335568','2006-02-15 04:45:30'),(4,'1411 Lillydale Drive',NULL,'QLD',576,'','6172235589','2006-02-15 04:45:30'),(5,'1913 Hanoi Way','','Nagasaki',463,'35200','28303384290','2006-02-15 04:45:30'),(6,'1121 Loja Avenue','','California',449,'17886','838635286649','2006-02-15 04:45:30'),(7,'692 Joliet Street','','Attika',38,'83579','448477190408','2006-02-15 04:45:30'),(8,'1566 Inegl Manor','','Mandalay',349,'53561','705814003527','2006-02-15 04:45:30'),(9,'53 Idfu Parkway','','Nantou',361,'42399','10655648674','2006-02-15 04:45:30'),(10,'1795 Santiago de Compostela Way','','Texas',295,'18743','860452626434','2006-02-15 04:45:30'),(11,'900 Santiago de Compostela Parkway','','Central Serbia',280,'93896','716571220373','2006-02-15 04:45:30'),(12,'478 Joliet Way','','Hamilton',200,'77948','657282285970','2006-02-15 04:45:30'),(13,'613 Korolev Drive','','Masqat',329,'45844','380657522649','2006-02-15 04:45:30'),(14,'1531 Sal Drive','','Esfahan',162,'53628','648856936185','2006-02-15 04:45:30'),(15,'1542 Tarlac Parkway','','Kanagawa',440,'1027','635297277345','2006-02-15 04:45:30'),(16,'808 Bhopal Manor','','Haryana',582,'10672','465887807014','2006-02-15 04:45:30'),(17,'270 Amroha Parkway','','Osmaniye',384,'29610','695479687538','2006-02-15 04:45:30'),(18,'770 Bydgoszcz Avenue','','California',120,'16266','517338314235','2006-02-15 04:45:30'),(19,'419 Iligan Lane','','Madhya Pradesh',76,'72878','990911107354','2006-02-15 04:45:30'),(20,'360 Toulouse Parkway','','England',495,'54308','949312333307','2006-02-15 04:45:30'),(21,'270 Toulon Boulevard','','Kalmykia',156,'81766','407752414682','2006-02-15 04:45:30'),(22,'320 Brest Avenue','','Kaduna',252,'43331','747791594069','2006-02-15 04:45:30'),(23,'1417 Lancaster Avenue','','Northern Cape',267,'72192','272572357893','2006-02-15 04:45:30'),(24,'1688 Okara Way','','Nothwest Border Prov',327,'21954','144453869132','2006-02-15 04:45:30'),(25,'262 A Corua (La Corua) Parkway','','Dhaka',525,'34418','892775750063','2006-02-15 04:45:30'),(26,'28 Charlotte Amalie Street','','Rabat-Sal-Zammour-Z',443,'37551','161968374323','2006-02-15 04:45:30'),(27,'1780 Hino Boulevard','','Liepaja',303,'7716','902731229323','2006-02-15 04:45:30'),(28,'96 Tafuna Way','','Crdoba',128,'99865','934730187245','2006-02-15 04:45:30'),(29,'934 San Felipe de Puerto Plata Street','','Sind',472,'99780','196495945706','2006-02-15 04:45:30'),(30,'18 Duisburg Boulevard','','',121,'58327','998009777982','2006-02-15 04:45:30'),(31,'217 Botshabelo Place','','Southern Mindanao',138,'49521','665356572025','2006-02-15 04:45:30'),(32,'1425 Shikarpur Manor','','Bihar',346,'65599','678220867005','2006-02-15 04:45:30'),(33,'786 Aurora Avenue','','Yamaguchi',474,'65750','18461860151','2006-02-15 04:45:30'),(34,'1668 Anpolis Street','','Taipei',316,'50199','525255540978','2006-02-15 04:45:30'),(35,'33 Gorontalo Way','','West Bengali',257,'30348','745994947458','2006-02-15 04:45:30'),(36,'176 Mandaluyong Place','','Uttar Pradesh',239,'65213','627705991774','2006-02-15 04:45:30'),(37,'127 Purnea (Purnia) Manor','','Piemonte',17,'79388','911872220378','2006-02-15 04:45:30'),(38,'61 Tama Street','','Okayama',284,'94065','708403338270','2006-02-15 04:45:30'),(39,'391 Callao Drive','','Midi-Pyrnes',544,'34021','440512153169','2006-02-15 04:45:30'),(40,'334 Munger (Monghyr) Lane','','Markazi',31,'38145','481183273622','2006-02-15 04:45:30'),(41,'1440 Fukuyama Loop','','Henan',362,'47929','912257250465','2006-02-15 04:45:30'),(42,'269 Cam Ranh Parkway','','Chisinau',115,'34689','489783829737','2006-02-15 04:45:30'),(43,'306 Antofagasta Place','','Esprito Santo',569,'3989','378318851631','2006-02-15 04:45:30'),(44,'671 Graz Street','','Oriental',353,'94399','680768868518','2006-02-15 04:45:30'),(45,'42 Brindisi Place','','Yerevan',586,'16744','42384721397','2006-02-15 04:45:30'),(46,'1632 Bislig Avenue','','Nonthaburi',394,'61117','471675840679','2006-02-15 04:45:30'),(47,'1447 Imus Way','','Tahiti',167,'48942','539758313890','2006-02-15 04:45:30'),(48,'1998 Halifax Drive','','Lipetsk',308,'76022','177727722820','2006-02-15 04:45:30'),(49,'1718 Valencia Street','','Antofagasta',27,'37359','675292816413','2006-02-15 04:45:30'),(50,'46 Pjatigorsk Lane','','Moscow (City)',343,'23616','262076994845','2006-02-15 04:45:30'),(51,'686 Garland Manor','','Cear',247,'52535','69493378813','2006-02-15 04:45:30'),(52,'909 Garland Manor','','Tatarstan',367,'69367','705800322606','2006-02-15 04:45:30'),(53,'725 Isesaki Place','','Mekka',237,'74428','876295323994','2006-02-15 04:45:30'),(54,'115 Hidalgo Parkway','','Khartum',379,'80168','307703950263','2006-02-15 04:45:30'),(55,'1135 Izumisano Parkway','','California',171,'48150','171822533480','2006-02-15 04:45:30'),(56,'939 Probolinggo Loop','','Galicia',1,'4166','680428310138','2006-02-15 04:45:30'),(57,'17 Kabul Boulevard','','Chiba',355,'38594','697760867968','2006-02-15 04:45:30'),(58,'1964 Allappuzha (Alleppey) Street','','Yamaguchi',227,'48980','920811325222','2006-02-15 04:45:30'),(59,'1697 Kowloon and New Kowloon Loop','','Moskova',49,'57807','499352017190','2006-02-15 04:45:30'),(60,'1668 Saint Louis Place','','Tahiti',397,'39072','347487831378','2006-02-15 04:45:30'),(61,'943 Tokat Street','','Vaduz',560,'45428','889318963672','2006-02-15 04:45:30'),(62,'1114 Liepaja Street','','Sarawak',282,'69226','212869228936','2006-02-15 04:45:30'),(63,'1213 Ranchi Parkway','','Karnataka',350,'94352','800024380485','2006-02-15 04:45:30'),(64,'81 Hodeida Way','','Rajasthan',231,'55561','250767749542','2006-02-15 04:45:30'),(65,'915 Ponce Place','','Basel-Stadt',56,'83980','1395251317','2006-02-15 04:45:30'),(66,'1717 Guadalajara Lane','','Missouri',441,'85505','914090181665','2006-02-15 04:45:30'),(67,'1214 Hanoi Way','','Nebraska',306,'67055','491001136577','2006-02-15 04:45:30'),(68,'1966 Amroha Avenue','','Sichuan',139,'70385','333489324603','2006-02-15 04:45:30'),(69,'698 Otsu Street','','Cayenne',105,'71110','409983924481','2006-02-15 04:45:30'),(70,'1150 Kimchon Manor','','Skne ln',321,'96109','663449333709','2006-02-15 04:45:30'),(71,'1586 Guaruj Place','','Hunan',579,'5135','947233365992','2006-02-15 04:45:30'),(72,'57 Arlington Manor','','Madhya Pradesh',475,'48960','990214419142','2006-02-15 04:45:30'),(73,'1031 Daugavpils Parkway','','Bchar',63,'59025','107137400143','2006-02-15 04:45:30'),(74,'1124 Buenaventura Drive','','Mekka',13,'6856','407733804223','2006-02-15 04:45:30'),(75,'492 Cam Ranh Street','','Eastern Visayas',61,'50805','565018274456','2006-02-15 04:45:30'),(76,'89 Allappuzha (Alleppey) Manor','','National Capital Reg',517,'75444','255800440636','2006-02-15 04:45:30'),(77,'1947 Poos de Caldas Boulevard','','Chiayi',114,'60951','427454485876','2006-02-15 04:45:30'),(78,'1206 Dos Quebradas Place','','So Paulo',431,'20207','241832790687','2006-02-15 04:45:30'),(79,'1551 Rampur Lane','','Changhwa',108,'72394','251164340471','2006-02-15 04:45:30'),(80,'602 Paarl Street','','Pavlodar',402,'98889','896314772871','2006-02-15 04:45:30'),(81,'1692 Ede Loop','','So Paulo',30,'9223','918711376618','2006-02-15 04:45:30'),(82,'936 Salzburg Lane','','Uttar Pradesh',425,'96709','875756771675','2006-02-15 04:45:30'),(83,'586 Tete Way','','Kanagawa',256,'1079','18581624103','2006-02-15 04:45:30'),(84,'1888 Kabul Drive','','Oyo & Osun',217,'20936','701457319790','2006-02-15 04:45:30'),(85,'320 Baiyin Parkway','','Mahajanga',319,'37307','223664661973','2006-02-15 04:45:30'),(86,'927 Baha Blanca Parkway','','Krim',479,'9495','821972242086','2006-02-15 04:45:30'),(87,'929 Tallahassee Loop','','Gauteng',497,'74671','800716535041','2006-02-15 04:45:30'),(88,'125 Citt del Vaticano Boulevard','','Puebla',40,'67912','48417642933','2006-02-15 04:45:30'),(89,'1557 Ktahya Boulevard','','England',88,'88002','720998247660','2006-02-15 04:45:30'),(90,'870 Ashqelon Loop','','Songkhla',489,'84931','135117278909','2006-02-15 04:45:30'),(91,'1740 Portoviejo Avenue','','Sucre',480,'29932','198123170793','2006-02-15 04:45:30'),(92,'1942 Ciparay Parkway','','Cheju',113,'82624','978987363654','2006-02-15 04:45:30'),(93,'1926 El Alto Avenue','','Buenos Aires',289,'75543','846225459260','2006-02-15 04:45:30'),(94,'1952 Chatsworth Drive','','Guangdong',332,'25958','991562402283','2006-02-15 04:45:30'),(95,'1370 Le Mans Avenue','','Brunei and Muara',53,'52163','345679835036','2006-02-15 04:45:30'),(96,'984 Effon-Alaiye Avenue','','Gois',183,'17119','132986892228','2006-02-15 04:45:30'),(97,'832 Nakhon Sawan Manor','','Inner Mongolia',592,'49021','275595571388','2006-02-15 04:45:30'),(98,'152 Kitwe Parkway','','Caraga',82,'53182','835433605312','2006-02-15 04:45:30'),(99,'1697 Tanauan Lane','','Punjab',399,'22870','4764773857','2006-02-15 04:45:30'),(100,'1308 Arecibo Way','','Georgia',41,'30695','6171054059','2006-02-15 04:45:30'),(101,'1599 Plock Drive','','Tete',534,'71986','817248913162','2006-02-15 04:45:30'),(102,'669 Firozabad Loop','','Abu Dhabi',12,'92265','412903167998','2006-02-15 04:45:30'),(103,'588 Vila Velha Manor','','Kyongsangbuk',268,'51540','333339908719','2006-02-15 04:45:30'),(104,'1913 Kamakura Place','','Lipetsk',238,'97287','942570536750','2006-02-15 04:45:30'),(105,'733 Mandaluyong Place','','Asir',2,'77459','196568435814','2006-02-15 04:45:30'),(106,'659 Vaduz Drive','','Ha Darom',34,'49708','709935135487','2006-02-15 04:45:30'),(107,'1177 Jelets Way','','Kwara & Kogi',220,'3305','484292626944','2006-02-15 04:45:30'),(108,'1386 Yangor Avenue','','Provence-Alpes-Cte',543,'80720','449216226468','2006-02-15 04:45:30'),(109,'454 Nakhon Sawan Boulevard','','Funafuti',173,'76383','963887147572','2006-02-15 04:45:30'),(110,'1867 San Juan Bautista Tuxtepec Avenue','','Ivanovo',225,'78311','547003310357','2006-02-15 04:45:30'),(111,'1532 Dzerzinsk Way','','Buenos Aires',334,'9599','330838016880','2006-02-15 04:45:30'),(112,'1002 Ahmadnagar Manor','','Mxico',213,'93026','371490777743','2006-02-15 04:45:30'),(113,'682 Junan Way','','North West',273,'30418','622255216127','2006-02-15 04:45:30'),(114,'804 Elista Drive','','Hubei',159,'61069','379804592943','2006-02-15 04:45:30'),(115,'1378 Alvorada Avenue','','Distrito Federal',102,'75834','272234298332','2006-02-15 04:45:30'),(116,'793 Cam Ranh Avenue','','California',292,'87057','824370924746','2006-02-15 04:45:30'),(117,'1079 Tel Aviv-Jaffa Boulevard','','Sucre',132,'10885','358178933857','2006-02-15 04:45:30'),(118,'442 Rae Bareli Place','','Nordrhein-Westfalen',148,'24321','886636413768','2006-02-15 04:45:30'),(119,'1107 Nakhon Sawan Avenue','','Mxico',365,'75149','867546627903','2006-02-15 04:45:30'),(120,'544 Malm Parkway','','Central Java',403,'63502','386759646229','2006-02-15 04:45:30'),(121,'1967 Sincelejo Place','','Gujarat',176,'73644','577812616052','2006-02-15 04:45:30'),(122,'333 Goinia Way','','Texas',185,'78625','909029256431','2006-02-15 04:45:30'),(123,'1987 Coacalco de Berriozbal Loop','','al-Qalyubiya',476,'96065','787654415858','2006-02-15 04:45:30'),(124,'241 Mosul Lane','','Risaralda',147,'76157','765345144779','2006-02-15 04:45:30'),(125,'211 Chiayi Drive','','Uttar Pradesh',164,'58186','665993880048','2006-02-15 04:45:30'),(126,'1175 Tanauan Way','','Lima',305,'64615','937222955822','2006-02-15 04:45:30'),(127,'117 Boa Vista Way','','Uttar Pradesh',566,'6804','677976133614','2006-02-15 04:45:30'),(128,'848 Tafuna Manor','','Ktahya',281,'45142','614935229095','2006-02-15 04:45:30'),(129,'569 Baicheng Lane','','Gauteng',85,'60304','490211944645','2006-02-15 04:45:30'),(130,'1666 Qomsheh Drive','','So Paulo',410,'66255','582835362905','2006-02-15 04:45:30'),(131,'801 Hagonoy Drive','','Smolensk',484,'8439','237426099212','2006-02-15 04:45:30'),(132,'1050 Garden Grove Avenue','','Slaskie',236,'4999','973047364353','2006-02-15 04:45:30'),(133,'1854 Tieli Street','','Shandong',302,'15819','509492324775','2006-02-15 04:45:30'),(134,'758 Junan Lane','','Gois',190,'82639','935448624185','2006-02-15 04:45:30'),(135,'1752 So Leopoldo Parkway','','Taka-Karpatia',345,'14014','252265130067','2006-02-15 04:45:30'),(136,'898 Belm Manor','','Free State',87,'49757','707169393853','2006-02-15 04:45:30'),(137,'261 Saint Louis Way','','Coahuila de Zaragoza',541,'83401','321944036800','2006-02-15 04:45:30'),(138,'765 Southampton Drive','','al-Qalyubiya',421,'4285','23712411567','2006-02-15 04:45:30'),(139,'943 Johannesburg Avenue','','Maharashtra',417,'5892','90921003005','2006-02-15 04:45:30'),(140,'788 Atinsk Street','','Karnataka',211,'81691','146497509724','2006-02-15 04:45:30'),(141,'1749 Daxian Place','','Gelderland',29,'11044','963369996279','2006-02-15 04:45:30'),(142,'1587 Sullana Lane','','Inner Mongolia',207,'85769','468060467018','2006-02-15 04:45:30'),(143,'1029 Dzerzinsk Manor','','Ynlin',542,'57519','33173584456','2006-02-15 04:45:30'),(144,'1666 Beni-Mellal Place','','Tennessee',123,'13377','9099941466','2006-02-15 04:45:30'),(145,'928 Jaffna Loop','','Hiroshima',172,'93762','581852137991','2006-02-15 04:45:30'),(146,'483 Ljubertsy Parkway','','Scotland',149,'60562','581174211853','2006-02-15 04:45:30'),(147,'374 Bat Yam Boulevard','','Kilis',266,'97700','923261616249','2006-02-15 04:45:30'),(148,'1027 Songkhla Manor','','Minsk',340,'30861','563660187896','2006-02-15 04:45:30'),(149,'999 Sanaa Loop','','Gauteng',491,'3439','918032330119','2006-02-15 04:45:30'),(150,'879 Newcastle Way','','Michigan',499,'90732','206841104594','2006-02-15 04:45:30'),(151,'1337 Lincoln Parkway','','Saitama',555,'99457','597815221267','2006-02-15 04:45:30'),(152,'1952 Pune Lane','','Saint-Denis',442,'92150','354615066969','2006-02-15 04:45:30'),(153,'782 Mosul Street','','Massachusetts',94,'25545','885899703621','2006-02-15 04:45:30'),(154,'781 Shimonoseki Drive','','Michoacn de Ocampo',202,'95444','632316273199','2006-02-15 04:45:30'),(155,'1560 Jelets Boulevard','','Shandong',291,'77777','189446090264','2006-02-15 04:45:30'),(156,'1963 Moscow Place','','Assam',354,'64863','761379480249','2006-02-15 04:45:30'),(157,'456 Escobar Way','','Jakarta Raya',232,'36061','719202533520','2006-02-15 04:45:30'),(158,'798 Cianjur Avenue','','Shanxi',590,'76990','499408708580','2006-02-15 04:45:30'),(159,'185 Novi Sad Place','','Bern',72,'41778','904253967161','2006-02-15 04:45:30'),(160,'1367 Yantai Manor','','Ondo & Ekiti',381,'21294','889538496300','2006-02-15 04:45:30'),(161,'1386 Nakhon Sawan Boulevard','','Pyongyang-si',420,'53502','368899174225','2006-02-15 04:45:30'),(162,'369 Papeete Way','','North Carolina',187,'66639','170117068815','2006-02-15 04:45:30'),(163,'1440 Compton Place','','North Austria',307,'81037','931059836497','2006-02-15 04:45:30'),(164,'1623 Baha Blanca Manor','','Moskova',310,'81511','149981248346','2006-02-15 04:45:30'),(165,'97 Shimoga Avenue','','Tel Aviv',533,'44660','177167004331','2006-02-15 04:45:30'),(166,'1740 Le Mans Loop','','Pays de la Loire',297,'22853','168476538960','2006-02-15 04:45:30'),(167,'1287 Xiangfan Boulevard','','Gifu',253,'57844','819416131190','2006-02-15 04:45:30'),(168,'842 Salzburg Lane','','Adana',529,'3313','697151428760','2006-02-15 04:45:30'),(169,'154 Tallahassee Loop','','Xinxiang',199,'62250','935508855935','2006-02-15 04:45:30'),(170,'710 San Felipe del Progreso Avenue','','Lilongwe',304,'76901','843801144113','2006-02-15 04:45:30'),(171,'1540 Wroclaw Drive','','Maharashtra',107,'62686','182363341674','2006-02-15 04:45:30'),(172,'475 Atinsk Way','','Gansu',240,'59571','201705577290','2006-02-15 04:45:30'),(173,'1294 Firozabad Drive','','Jiangxi',407,'70618','161801569569','2006-02-15 04:45:30'),(174,'1877 Ezhou Lane','','Rajasthan',550,'63337','264541743403','2006-02-15 04:45:30'),(175,'316 Uruapan Street','','Perak',223,'58194','275788967899','2006-02-15 04:45:30'),(176,'29 Pyongyang Loop','','Batman',58,'47753','734780743462','2006-02-15 04:45:30'),(177,'1010 Klerksdorp Way','','Steiermark',186,'6802','493008546874','2006-02-15 04:45:30'),(178,'1848 Salala Boulevard','','Miranda',373,'25220','48265851133','2006-02-15 04:45:30'),(179,'431 Xiangtan Avenue','','Kerala',18,'4854','230250973122','2006-02-15 04:45:30'),(180,'757 Rustenburg Avenue','','Skikda',483,'89668','506134035434','2006-02-15 04:45:30'),(181,'146 Johannesburg Way','','Tamaulipas',330,'54132','953689007081','2006-02-15 04:45:30'),(182,'1891 Rizhao Boulevard','','So Paulo',456,'47288','391065549876','2006-02-15 04:45:30'),(183,'1089 Iwatsuki Avenue','','Kirov',270,'35109','866092335135','2006-02-15 04:45:30'),(184,'1410 Benin City Parkway','','Risaralda',405,'29747','104150372603','2006-02-15 04:45:30'),(185,'682 Garden Grove Place','','Tennessee',333,'67497','72136330362','2006-02-15 04:45:30'),(186,'533 al-Ayn Boulevard','','California',126,'8862','662227486184','2006-02-15 04:45:30'),(187,'1839 Szkesfehrvr Parkway','','Gois',317,'55709','947468818183','2006-02-15 04:45:30'),(188,'741 Ambattur Manor','','Noord-Brabant',438,'43310','302590383819','2006-02-15 04:45:30'),(189,'927 Barcelona Street','','Chaharmahal va Bakht',467,'65121','951486492670','2006-02-15 04:45:30'),(190,'435 0 Way','','West Bengali',195,'74750','760171523969','2006-02-15 04:45:30'),(191,'140 Chiayi Parkway','','Sumy',506,'38982','855863906434','2006-02-15 04:45:30'),(192,'1166 Changhwa Street','','Caraga',62,'58852','650752094490','2006-02-15 04:45:30'),(193,'891 Novi Sad Manor','','Ontario',383,'5379','247646995453','2006-02-15 04:45:30'),(194,'605 Rio Claro Parkway','','Tabora',513,'49348','352469351088','2006-02-15 04:45:30'),(195,'1077 San Felipe de Puerto Plata Place','','Rostov-na-Donu',369,'65387','812824036424','2006-02-15 04:45:30'),(196,'9 San Miguel de Tucumn Manor','','Uttar Pradesh',169,'90845','956188728558','2006-02-15 04:45:30'),(197,'447 Surakarta Loop','','Nyanza',271,'10428','940830176580','2006-02-15 04:45:30'),(198,'345 Oshawa Boulevard','','Tokyo-to',204,'32114','104491201771','2006-02-15 04:45:30'),(199,'1792 Valle de la Pascua Place','','Nordrhein-Westfalen',477,'15540','419419591240','2006-02-15 04:45:30'),(200,'1074 Binzhou Manor','','Baden-Wrttemberg',325,'36490','331132568928','2006-02-15 04:45:30'),(201,'817 Bradford Loop','','Jiangsu',109,'89459','264286442804','2006-02-15 04:45:30'),(202,'955 Bamenda Way','','Ondo & Ekiti',218,'1545','768481779568','2006-02-15 04:45:30'),(203,'1149 A Corua (La Corua) Boulevard','','Haiphong',194,'95824','470884141195','2006-02-15 04:45:30'),(204,'387 Mwene-Ditu Drive','','Ahal',35,'8073','764477681869','2006-02-15 04:45:30'),(205,'68 Molodetno Manor','','Nordrhein-Westfalen',575,'4662','146640639760','2006-02-15 04:45:30'),(206,'642 Nador Drive','','Maharashtra',77,'3924','369050085652','2006-02-15 04:45:30'),(207,'1688 Nador Lane','','Sulawesi Utara',184,'61613','652218196731','2006-02-15 04:45:30'),(208,'1215 Pyongyang Parkway','','Usak',557,'25238','646237101779','2006-02-15 04:45:30'),(209,'1679 Antofagasta Street','','Alto Paran',122,'86599','905903574913','2006-02-15 04:45:30'),(210,'1304 s-Hertogenbosch Way','','Santa Catarina',83,'10925','90336226227','2006-02-15 04:45:30'),(211,'850 Salala Loop','','Kitaa',371,'10800','403404780639','2006-02-15 04:45:30'),(212,'624 Oshawa Boulevard','','West Bengali',51,'89959','49677664184','2006-02-15 04:45:30'),(213,'43 Dadu Avenue','','Rajasthan',74,'4855','95666951770','2006-02-15 04:45:30'),(214,'751 Lima Loop','','Aden',7,'99405','756460337785','2006-02-15 04:45:30'),(215,'1333 Haldia Street','','Jilin',174,'82161','408304391718','2006-02-15 04:45:30'),(216,'660 Jedda Boulevard','','Washington',65,'25053','168758068397','2006-02-15 04:45:30'),(217,'1001 Miyakonojo Lane','','Taizz',518,'67924','584316724815','2006-02-15 04:45:30'),(218,'226 Brest Manor','','California',508,'2299','785881412500','2006-02-15 04:45:30'),(219,'1229 Valencia Parkway','','Haskovo',498,'99124','352679173732','2006-02-15 04:45:30'),(220,'1201 Qomsheh Manor','','Gois',28,'21464','873492228462','2006-02-15 04:45:30'),(221,'866 Shivapuri Manor','','Uttar Pradesh',448,'22474','778502731092','2006-02-15 04:45:30'),(222,'1168 Najafabad Parkway','','Kabol',251,'40301','886649065861','2006-02-15 04:45:30'),(223,'1244 Allappuzha (Alleppey) Place','','Buenos Aires',567,'20657','991802825778','2006-02-15 04:45:30'),(224,'1842 Luzinia Boulevard','','Zanzibar West',593,'94420','706878974831','2006-02-15 04:45:30'),(225,'1926 Gingoog Street','','Sisilia',511,'22824','469738825391','2006-02-15 04:45:30'),(226,'810 Palghat (Palakkad) Boulevard','','Jaroslavl',235,'73431','516331171356','2006-02-15 04:45:30'),(227,'1820 Maring Parkway','','Punjab',324,'88307','99760893676','2006-02-15 04:45:30'),(228,'60 Poos de Caldas Street','','Rajasthan',243,'82338','963063788669','2006-02-15 04:45:30'),(229,'1014 Loja Manor','','Tamil Nadu',22,'66851','460795526514','2006-02-15 04:45:30'),(230,'201 Effon-Alaiye Way','','Asuncin',37,'64344','684192903087','2006-02-15 04:45:30'),(231,'430 Alessandria Loop','','Saarland',439,'47446','669828224459','2006-02-15 04:45:30'),(232,'754 Valencia Place','','Phnom Penh',406,'87911','594319417514','2006-02-15 04:45:30'),(233,'356 Olomouc Manor','','Gois',26,'93323','22326410776','2006-02-15 04:45:30'),(234,'1256 Bislig Boulevard','','Botosani',86,'50598','479007229460','2006-02-15 04:45:30'),(235,'954 Kimchon Place','','West Bengali',559,'42420','541327526474','2006-02-15 04:45:30'),(236,'885 Yingkou Manor','','Kaduna',596,'31390','588964509072','2006-02-15 04:45:30'),(237,'1736 Cavite Place','','Qina',216,'98775','431770603551','2006-02-15 04:45:30'),(238,'346 Skikda Parkway','','Hawalli',233,'90628','630424482919','2006-02-15 04:45:30'),(239,'98 Stara Zagora Boulevard','','Valle',96,'76448','610173756082','2006-02-15 04:45:30'),(240,'1479 Rustenburg Boulevard','','Southern Tagalog',527,'18727','727785483194','2006-02-15 04:45:30'),(241,'647 A Corua (La Corua) Street','','Chollanam',357,'36971','792557457753','2006-02-15 04:45:30'),(242,'1964 Gijn Manor','','Karnataka',473,'14408','918119601885','2006-02-15 04:45:30'),(243,'47 Syktyvkar Lane','','West Java',118,'22236','63937119031','2006-02-15 04:45:30'),(244,'1148 Saarbrcken Parkway','','Fukushima',226,'1921','137773001988','2006-02-15 04:45:30'),(245,'1103 Bilbays Parkway','','Hubei',578,'87660','279979529227','2006-02-15 04:45:30'),(246,'1246 Boksburg Parkway','','Hebei',422,'28349','890283544295','2006-02-15 04:45:30'),(247,'1483 Pathankot Street','','Tucumn',454,'37288','686015532180','2006-02-15 04:45:30'),(248,'582 Papeete Loop','','Central Visayas',294,'27722','569868543137','2006-02-15 04:45:30'),(249,'300 Junan Street','','Kyonggi',553,'81314','890289150158','2006-02-15 04:45:30'),(250,'829 Grand Prairie Way','','Paran',328,'6461','741070712873','2006-02-15 04:45:30'),(251,'1473 Changhwa Parkway','','Mxico',124,'75933','266798132374','2006-02-15 04:45:30'),(252,'1309 Weifang Street','','Florida',520,'57338','435785045362','2006-02-15 04:45:30'),(253,'1760 Oshawa Manor','','Tianjin',535,'38140','56257502250','2006-02-15 04:45:30'),(254,'786 Stara Zagora Way','','Oyo & Osun',390,'98332','716256596301','2006-02-15 04:45:30'),(255,'1966 Tonghae Street','','Anhalt Sachsen',198,'36481','567359279425','2006-02-15 04:45:30'),(256,'1497 Yuzhou Drive','','England',312,'3433','246810237916','2006-02-15 04:45:30'),(258,'752 Ondo Loop','','Miyazaki',338,'32474','134673576619','2006-02-15 04:45:30'),(259,'1338 Zalantun Lane','','Minas Gerais',413,'45403','840522972766','2006-02-15 04:45:30'),(260,'127 Iwakuni Boulevard','','Central Luzon',192,'20777','987442542471','2006-02-15 04:45:30'),(261,'51 Laredo Avenue','','Sagaing',342,'68146','884536620568','2006-02-15 04:45:30'),(262,'771 Yaound Manor','','Sofala',64,'86768','245477603573','2006-02-15 04:45:30'),(263,'532 Toulon Street','','Santiago',460,'69517','46871694740','2006-02-15 04:45:30'),(264,'1027 Banjul Place','','West Bengali',197,'50390','538241037443','2006-02-15 04:45:30'),(265,'1158 Mandi Bahauddin Parkway','','Shanxi',136,'98484','276555730211','2006-02-15 04:45:30'),(266,'862 Xintai Lane','','Cagayan Valley',548,'30065','265153400632','2006-02-15 04:45:30'),(267,'816 Cayenne Parkway','','Manab',414,'93629','282874611748','2006-02-15 04:45:30'),(268,'1831 Nam Dinh Loop','','National Capital Reg',323,'51990','322888976727','2006-02-15 04:45:30'),(269,'446 Kirovo-Tepetsk Lane','','Osaka',203,'19428','303967439816','2006-02-15 04:45:30'),(270,'682 Halisahar Place','','Severn Morava',378,'20536','475553436330','2006-02-15 04:45:30'),(271,'1587 Loja Manor','','Salzburg',447,'5410','621625204422','2006-02-15 04:45:30'),(272,'1762 Paarl Parkway','','Hunan',298,'53928','192459639410','2006-02-15 04:45:30'),(273,'1519 Ilorin Place','','Kerala',395,'49298','357445645426','2006-02-15 04:45:30'),(274,'920 Kumbakonam Loop','','California',446,'75090','685010736240','2006-02-15 04:45:30'),(275,'906 Goinia Way','','Wielkopolskie',255,'83565','701767622697','2006-02-15 04:45:30'),(276,'1675 Xiangfan Manor','','Tamil Nadu',283,'11763','271149517630','2006-02-15 04:45:30'),(277,'85 San Felipe de Puerto Plata Drive','','Shandong',584,'46063','170739645687','2006-02-15 04:45:30'),(278,'144 South Hill Loop','','Guanajuato',445,'2012','45387294817','2006-02-15 04:45:30'),(279,'1884 Shikarpur Avenue','','Haryana',263,'85548','959949395183','2006-02-15 04:45:30'),(280,'1980 Kamjanets-Podilskyi Street','','Illinois',404,'89502','874337098891','2006-02-15 04:45:30'),(281,'1944 Bamenda Way','','Michigan',573,'24645','75975221996','2006-02-15 04:45:30'),(282,'556 Baybay Manor','','Oyo & Osun',374,'55802','363982224739','2006-02-15 04:45:30'),(283,'457 Tongliao Loop','','Bursa',222,'56254','880756161823','2006-02-15 04:45:30'),(284,'600 Bradford Street','','East Azerbaidzan',514,'96204','117592274996','2006-02-15 04:45:30'),(285,'1006 Santa Brbara dOeste Manor','','Ondo & Ekiti',389,'36229','85059738746','2006-02-15 04:45:30'),(286,'1308 Sumy Loop','','Fujian',175,'30657','583021225407','2006-02-15 04:45:30'),(287,'1405 Chisinau Place','','Ponce',411,'8160','62781725285','2006-02-15 04:45:30'),(288,'226 Halifax Street','','Xinxiang',277,'58492','790651020929','2006-02-15 04:45:30'),(289,'1279 Udine Parkway','','Edo & Delta',69,'75860','195003555232','2006-02-15 04:45:30'),(290,'1336 Benin City Drive','','Shiga',386,'46044','341242939532','2006-02-15 04:45:30'),(291,'1155 Liaocheng Place','','Oyo & Osun',152,'22650','558236142492','2006-02-15 04:45:30'),(292,'1993 Tabuk Lane','','Tamil Nadu',522,'64221','648482415405','2006-02-15 04:45:30'),(293,'86 Higashiosaka Lane','','Guanajuato',563,'33768','957128697225','2006-02-15 04:45:30'),(294,'1912 Allende Manor','','Kowloon and New Kowl',279,'58124','172262454487','2006-02-15 04:45:30'),(295,'544 Tarsus Boulevard','','Gurico',562,'53145','892523334','2006-02-15 04:45:30'),(296,'1936 Cuman Avenue','','Virginia',433,'61195','976798660411','2006-02-15 04:45:30'),(297,'1192 Tongliao Street','','Sharja',470,'19065','350970907017','2006-02-15 04:45:30'),(298,'44 Najafabad Way','','Baskimaa',146,'61391','96604821070','2006-02-15 04:45:30'),(299,'32 Pudukkottai Lane','','Ohio',140,'38834','967274728547','2006-02-15 04:45:30'),(300,'661 Chisinau Lane','','Pietari',274,'8856','816436065431','2006-02-15 04:45:30'),(301,'951 Stara Zagora Manor','','Punjab',400,'98573','429925609431','2006-02-15 04:45:30'),(302,'922 Vila Velha Loop','','Maharashtra',9,'4085','510737228015','2006-02-15 04:45:30'),(303,'898 Jining Lane','','Pohjois-Pohjanmaa',387,'40070','161643343536','2006-02-15 04:45:30'),(304,'1635 Kuwana Boulevard','','Hiroshima',205,'52137','710603868323','2006-02-15 04:45:30'),(305,'41 El Alto Parkway','','Maharashtra',398,'56883','51917807050','2006-02-15 04:45:30'),(306,'1883 Maikop Lane','','Kaliningrad',254,'68469','96110042435','2006-02-15 04:45:30'),(307,'1908 Gaziantep Place','','Liaoning',536,'58979','108053751300','2006-02-15 04:45:30'),(308,'687 Alessandria Parkway','','Sanaa',455,'57587','407218522294','2006-02-15 04:45:30'),(309,'827 Yuncheng Drive','','Callao',99,'79047','504434452842','2006-02-15 04:45:30'),(310,'913 Coacalco de Berriozbal Loop','','Texas',33,'42141','262088367001','2006-02-15 04:45:30'),(311,'715 So Bernardo do Campo Lane','','Kedah',507,'84804','181179321332','2006-02-15 04:45:30'),(312,'1354 Siegen Street','','Rio de Janeiro',25,'80184','573441801529','2006-02-15 04:45:30'),(313,'1191 Sungai Petani Boulevard','','Missouri',262,'9668','983259819766','2006-02-15 04:45:30'),(314,'1224 Huejutla de Reyes Boulevard','','Lombardia',91,'70923','806016930576','2006-02-15 04:45:30'),(315,'543 Bergamo Avenue','','Minas Gerais',215,'59686','103602195112','2006-02-15 04:45:30'),(316,'746 Joliet Lane','','Kursk',286,'94878','688485191923','2006-02-15 04:45:30'),(317,'780 Kimberley Way','','Tabuk',515,'17032','824396883951','2006-02-15 04:45:30'),(318,'1774 Yaound Place','','Hubei',166,'91400','613124286867','2006-02-15 04:45:30'),(319,'1957 Yantai Lane','','So Paulo',490,'59255','704948322302','2006-02-15 04:45:30'),(320,'1542 Lubumbashi Boulevard','','Tel Aviv',57,'62472','508800331065','2006-02-15 04:45:30'),(321,'651 Pathankot Loop','','Maharashtra',336,'59811','139378397418','2006-02-15 04:45:30'),(322,'1359 Zhoushan Parkway','','Streymoyar',545,'29763','46568045367','2006-02-15 04:45:30'),(323,'1769 Iwaki Lane','','Kujawsko-Pomorskie',97,'25787','556100547674','2006-02-15 04:45:30'),(324,'1145 Vilnius Manor','','Mxico',451,'73170','674805712553','2006-02-15 04:45:30'),(325,'1892 Nabereznyje Telny Lane','','Tutuila',516,'28396','478229987054','2006-02-15 04:45:30'),(326,'470 Boksburg Street','','Central',81,'97960','908029859266','2006-02-15 04:45:30'),(327,'1427 A Corua (La Corua) Place','','Buenos Aires',45,'85799','972574862516','2006-02-15 04:45:30'),(328,'479 San Felipe del Progreso Avenue','','Morelos',130,'54949','869051782691','2006-02-15 04:45:30'),(329,'867 Benin City Avenue','','Henan',591,'78543','168884817145','2006-02-15 04:45:30'),(330,'981 Kumbakonam Place','','Distrito Federal',89,'87611','829116184079','2006-02-15 04:45:30'),(331,'1016 Iwakuni Street','','St George',269,'49833','961370847344','2006-02-15 04:45:30'),(332,'663 Baha Blanca Parkway','','Adana',5,'33463','834418779292','2006-02-15 04:45:30'),(333,'1860 Taguig Loop','','West Java',119,'59550','38158430589','2006-02-15 04:45:30'),(334,'1816 Bydgoszcz Loop','','Dhaka',234,'64308','965273813662','2006-02-15 04:45:30'),(335,'587 Benguela Manor','','Illinois',42,'91590','165450987037','2006-02-15 04:45:30'),(336,'430 Kumbakonam Drive','','Santa F',457,'28814','105470691550','2006-02-15 04:45:30'),(337,'1838 Tabriz Lane','','Dhaka',143,'1195','38988715447','2006-02-15 04:45:30'),(338,'431 Szkesfehrvr Avenue','','Baki',48,'57828','119501405123','2006-02-15 04:45:30'),(339,'503 Sogamoso Loop','','Sumqayit',505,'49812','834626715837','2006-02-15 04:45:30'),(340,'507 Smolensk Loop','','Sousse',492,'22971','80303246192','2006-02-15 04:45:30'),(341,'1920 Weifang Avenue','','Uttar Pradesh',427,'15643','869507847714','2006-02-15 04:45:30'),(342,'124 al-Manama Way','','Hiroshima',382,'52368','647899404952','2006-02-15 04:45:30'),(343,'1443 Mardan Street','','Western Cape',392,'31483','231383037471','2006-02-15 04:45:30'),(344,'1909 Benguela Lane','','Henan',581,'19913','624138001031','2006-02-15 04:45:30'),(345,'68 Ponce Parkway','','Hanoi',201,'85926','870635127812','2006-02-15 04:45:30'),(346,'1217 Konotop Avenue','','Gelderland',151,'504','718917251754','2006-02-15 04:45:30'),(347,'1293 Nam Dinh Way','','Roraima',84,'71583','697656479977','2006-02-15 04:45:30'),(348,'785 Vaduz Street','','Baja California',335,'36170','895616862749','2006-02-15 04:45:30'),(349,'1516 Escobar Drive','','Tongatapu',370,'46069','64536069371','2006-02-15 04:45:30'),(350,'1628 Nagareyama Lane','','Central',453,'60079','20064292617','2006-02-15 04:45:30'),(351,'1157 Nyeri Loop','','Adygea',320,'56380','262744791493','2006-02-15 04:45:30'),(352,'1673 Tangail Drive','','Daugavpils',137,'26857','627924259271','2006-02-15 04:45:30'),(353,'381 Kabul Way','','Taipei',209,'87272','55477302294','2006-02-15 04:45:30'),(354,'953 Hodeida Street','','Southern Tagalog',221,'18841','53912826864','2006-02-15 04:45:30'),(355,'469 Nakhon Sawan Street','','Tuvassia',531,'58866','689199636560','2006-02-15 04:45:30'),(356,'1378 Beira Loop','','Krasnojarsk',597,'40792','840957664136','2006-02-15 04:45:30'),(357,'1641 Changhwa Place','','Nord-Ouest',52,'37636','256546485220','2006-02-15 04:45:30'),(358,'1698 Southport Loop','','Hidalgo',393,'49009','754358349853','2006-02-15 04:45:30'),(359,'519 Nyeri Manor','','So Paulo',461,'37650','764680915323','2006-02-15 04:45:30'),(360,'619 Hunuco Avenue','','Shimane',331,'81508','142596392389','2006-02-15 04:45:30'),(361,'45 Aparecida de Goinia Place','','Madhya Pradesh',464,'7431','650496654258','2006-02-15 04:45:30'),(362,'482 Kowloon and New Kowloon Manor','','Bratislava',90,'97056','738968474939','2006-02-15 04:45:30'),(363,'604 Bern Place','','Jharkhand',429,'5373','620719383725','2006-02-15 04:45:30'),(364,'1623 Kingstown Drive','','Buenos Aires',20,'91299','296394569728','2006-02-15 04:45:30'),(365,'1009 Zanzibar Lane','','Arecibo',32,'64875','102396298916','2006-02-15 04:45:30'),(366,'114 Jalib al-Shuyukh Manor','','Centre',585,'60440','845378657301','2006-02-15 04:45:30'),(367,'1163 London Parkway','','Par',66,'6066','675120358494','2006-02-15 04:45:30'),(368,'1658 Jastrzebie-Zdrj Loop','','Central',372,'96584','568367775448','2006-02-15 04:45:30'),(369,'817 Laredo Avenue','','Jalisco',188,'77449','151249681135','2006-02-15 04:45:30'),(370,'1565 Tangail Manor','','Okinawa',377,'45750','634445428822','2006-02-15 04:45:30'),(371,'1912 Emeishan Drive','','Balikesir',50,'33050','99883471275','2006-02-15 04:45:30'),(372,'230 Urawa Drive','','Andhra Pradesh',8,'2738','166898395731','2006-02-15 04:45:30'),(373,'1922 Miraj Way','','Esfahan',356,'13203','320471479776','2006-02-15 04:45:30'),(374,'433 Florencia Street','','Chihuahua',250,'91330','561729882725','2006-02-15 04:45:30'),(375,'1049 Matamoros Parkway','','Karnataka',191,'69640','960505250340','2006-02-15 04:45:30'),(376,'1061 Ede Avenue','','Southern Tagalog',98,'57810','333390595558','2006-02-15 04:45:30'),(377,'154 Oshawa Manor','','East Java',415,'72771','440365973660','2006-02-15 04:45:30'),(378,'1191 Tandil Drive','','Southern Tagalog',523,'6362','45554316010','2006-02-15 04:45:30'),(379,'1133 Rizhao Avenue','','Pernambuco',572,'2800','600264533987','2006-02-15 04:45:30'),(380,'1519 Santiago de los Caballeros Loop','','East Kasai',348,'22025','409315295763','2006-02-15 04:45:30'),(381,'1618 Olomouc Manor','','Kurgan',285,'26385','96846695220','2006-02-15 04:45:30'),(382,'220 Hidalgo Drive','','Kermanshah',265,'45298','342720754566','2006-02-15 04:45:30'),(383,'686 Donostia-San Sebastin Lane','','Guangdong',471,'97390','71857599858','2006-02-15 04:45:30'),(384,'97 Mogiljov Lane','','Gujarat',73,'89294','924815207181','2006-02-15 04:45:30'),(385,'1642 Charlotte Amalie Drive','','Slaskie',549,'75442','821476736117','2006-02-15 04:45:30'),(386,'1368 Maracabo Boulevard','','',493,'32716','934352415130','2006-02-15 04:45:30'),(387,'401 Sucre Boulevard','','New Hampshire',322,'25007','486395999608','2006-02-15 04:45:30'),(388,'368 Hunuco Boulevard','','Namibe',360,'17165','106439158941','2006-02-15 04:45:30'),(389,'500 Lincoln Parkway','','Jiangsu',210,'95509','550306965159','2006-02-15 04:45:30'),(390,'102 Chapra Drive','','Ibaragi',521,'14073','776031833752','2006-02-15 04:45:30'),(391,'1793 Meixian Place','','Hmelnytskyi',258,'33535','619966287415','2006-02-15 04:45:30'),(392,'514 Ife Way','','Shaba',315,'69973','900235712074','2006-02-15 04:45:30'),(393,'717 Changzhou Lane','','Southern Tagalog',104,'21615','426255288071','2006-02-15 04:45:30'),(394,'753 Ilorin Avenue','','Sichuan',157,'3656','464511145118','2006-02-15 04:45:30'),(395,'1337 Mit Ghamr Avenue','','Nakhon Sawan',358,'29810','175283210378','2006-02-15 04:45:30'),(396,'767 Pyongyang Drive','','Osaka',229,'83536','667736124769','2006-02-15 04:45:30'),(397,'614 Pak Kret Street','','Addis Abeba',6,'27796','47808359842','2006-02-15 04:45:30'),(398,'954 Lapu-Lapu Way','','Moskova',278,'8816','737229003916','2006-02-15 04:45:30'),(399,'331 Bydgoszcz Parkway','','Asturia',181,'966','537374465982','2006-02-15 04:45:30'),(400,'1152 Citrus Heights Manor','','al-Qadarif',15,'5239','765957414528','2006-02-15 04:45:30'),(401,'168 Cianjur Manor','','Saitama',228,'73824','679095087143','2006-02-15 04:45:30'),(402,'616 Hagonoy Avenue','','Krasnojarsk',39,'46043','604177838256','2006-02-15 04:45:30'),(403,'1190 0 Place','','Rio Grande do Sul',44,'10417','841876514789','2006-02-15 04:45:30'),(404,'734 Bchar Place','','Punjab',375,'30586','280578750435','2006-02-15 04:45:30'),(405,'530 Lausanne Lane','','Texas',135,'11067','775235029633','2006-02-15 04:45:30'),(406,'454 Patiala Lane','','Fukushima',276,'13496','794553031307','2006-02-15 04:45:30'),(407,'1346 Mysore Drive','','Bretagne',92,'61507','516647474029','2006-02-15 04:45:30'),(408,'990 Etawah Loop','','Tamil Nadu',564,'79940','206169448769','2006-02-15 04:45:30'),(409,'1266 Laredo Parkway','','Saitama',380,'7664','1483365694','2006-02-15 04:45:30'),(410,'88 Nagaon Manor','','Buenos Aires',524,'86868','779461480495','2006-02-15 04:45:30'),(411,'264 Bhimavaram Manor','','St Thomas',111,'54749','302526949177','2006-02-15 04:45:30'),(412,'1639 Saarbrcken Drive','','North West',437,'9827','328494873422','2006-02-15 04:45:30'),(413,'692 Amroha Drive','','Northern',230,'35575','359478883004','2006-02-15 04:45:30'),(414,'1936 Lapu-Lapu Parkway','','Bauchi & Gombe',141,'7122','653436985797','2006-02-15 04:45:30'),(415,'432 Garden Grove Street','','Ontario',430,'65630','615964523510','2006-02-15 04:45:30'),(416,'1445 Carmen Parkway','','West Java',117,'70809','598912394463','2006-02-15 04:45:30'),(417,'791 Salinas Street','','Punjab',208,'40509','129953030512','2006-02-15 04:45:30'),(418,'126 Acua Parkway','','West Bengali',71,'58888','480039662421','2006-02-15 04:45:30'),(419,'397 Sunnyvale Avenue','','Guanajuato',19,'55566','680851640676','2006-02-15 04:45:30'),(420,'992 Klerksdorp Loop','','Utrecht',23,'33711','855290087237','2006-02-15 04:45:30'),(421,'966 Arecibo Loop','','Sind',134,'94018','15273765306','2006-02-15 04:45:30'),(422,'289 Santo Andr Manor','','al-Sharqiya',16,'72410','214976066017','2006-02-15 04:45:30'),(423,'437 Chungho Drive','','Puerto Plata',450,'59489','491271355190','2006-02-15 04:45:30'),(424,'1948 Bayugan Parkway','','Bihar',264,'60622','987306329957','2006-02-15 04:45:30'),(425,'1866 al-Qatif Avenue','','California',155,'89420','546793516940','2006-02-15 04:45:30'),(426,'1661 Abha Drive','','Tamil Nadu',416,'14400','270456873752','2006-02-15 04:45:30'),(427,'1557 Cape Coral Parkway','','Hubei',293,'46875','368284120423','2006-02-15 04:45:30'),(428,'1727 Matamoros Place','','Sawhaj',465,'78813','129673677866','2006-02-15 04:45:30'),(429,'1269 Botosani Manor','','Guangdong',468,'47394','736517327853','2006-02-15 04:45:30'),(430,'355 Vitria de Santo Anto Way','','Oaxaca',452,'81758','548003849552','2006-02-15 04:45:30'),(431,'1596 Acua Parkway','','Jharkhand',418,'70425','157133457169','2006-02-15 04:45:30'),(432,'259 Ipoh Drive','','So Paulo',189,'64964','419009857119','2006-02-15 04:45:30'),(433,'1823 Hoshiarpur Lane','','Komi',510,'33191','307133768620','2006-02-15 04:45:30'),(434,'1404 Taguig Drive','','Okayama',547,'87212','572068624538','2006-02-15 04:45:30'),(435,'740 Udaipur Lane','','Nizni Novgorod',150,'33505','497288595103','2006-02-15 04:45:30'),(436,'287 Cuautla Boulevard','','Chuquisaca',501,'72736','82619513349','2006-02-15 04:45:30'),(437,'1766 Almirante Brown Street','','KwaZulu-Natal',364,'63104','617567598243','2006-02-15 04:45:30'),(438,'596 Huixquilucan Place','','Nampula',351,'65892','342709348083','2006-02-15 04:45:30'),(439,'1351 Aparecida de Goinia Parkway','','Northern Mindanao',391,'41775','959834530529','2006-02-15 04:45:30'),(440,'722 Bradford Lane','','Shandong',249,'90920','746251338300','2006-02-15 04:45:30'),(441,'983 Santa F Way','','British Colombia',565,'47472','145720452260','2006-02-15 04:45:30'),(442,'1245 Ibirit Way','','La Romana',290,'40926','331888642162','2006-02-15 04:45:30'),(443,'1836 Korla Parkway','','Copperbelt',272,'55405','689681677428','2006-02-15 04:45:30'),(444,'231 Kaliningrad Place','','Lombardia',70,'57833','575081026569','2006-02-15 04:45:30'),(445,'495 Bhimavaram Lane','','Maharashtra',144,'3','82088937724','2006-02-15 04:45:30'),(446,'1924 Shimonoseki Drive','','Batna',59,'52625','406784385440','2006-02-15 04:45:30'),(447,'105 Dzerzinsk Manor','','Inner Mongolia',540,'48570','240776414296','2006-02-15 04:45:30'),(448,'614 Denizli Parkway','','Rio Grande do Sul',486,'29444','876491807547','2006-02-15 04:45:30'),(449,'1289 Belm Boulevard','','Tartumaa',530,'88306','237368926031','2006-02-15 04:45:30'),(450,'203 Tambaram Street','','Buenos Aires',161,'73942','411549550611','2006-02-15 04:45:30'),(451,'1704 Tambaram Manor','','West Bengali',554,'2834','39463554936','2006-02-15 04:45:30'),(452,'207 Cuernavaca Loop','','Tatarstan',352,'52671','782900030287','2006-02-15 04:45:30'),(453,'319 Springs Loop','','Baijeri',160,'99552','72524459905','2006-02-15 04:45:30'),(454,'956 Nam Dinh Manor','','Kerman',481,'21872','474047727727','2006-02-15 04:45:30'),(455,'1947 Paarl Way','','Central Java',509,'23636','834061016202','2006-02-15 04:45:30'),(456,'814 Simferopol Loop','','Sinaloa',154,'48745','524567129902','2006-02-15 04:45:30'),(457,'535 Ahmadnagar Manor','','Abu Dhabi',3,'41136','985109775584','2006-02-15 04:45:30'),(458,'138 Caracas Boulevard','','Zulia',326,'16790','974433019532','2006-02-15 04:45:30'),(459,'251 Florencia Drive','','Michoacn de Ocampo',556,'16119','118011831565','2006-02-15 04:45:30'),(460,'659 Gatineau Boulevard','','La Paz',153,'28587','205524798287','2006-02-15 04:45:30'),(461,'1889 Valparai Way','','Ziguinchor',600,'75559','670370974122','2006-02-15 04:45:30'),(462,'1485 Bratislava Place','','Illinois',435,'83183','924663855568','2006-02-15 04:45:30'),(463,'935 Aden Boulevard','','Central Java',532,'64709','335052544020','2006-02-15 04:45:30'),(464,'76 Kermanshah Manor','','Esfahan',423,'23343','762361821578','2006-02-15 04:45:30'),(465,'734 Tanshui Avenue','','Caquet',170,'70664','366776723320','2006-02-15 04:45:30'),(466,'118 Jaffna Loop','','Northern Mindanao',182,'10447','325526730021','2006-02-15 04:45:30'),(467,'1621 Tongliao Avenue','','Irkutsk',558,'22173','209342540247','2006-02-15 04:45:30'),(468,'1844 Usak Avenue','','Nova Scotia',196,'84461','164414772677','2006-02-15 04:45:30'),(469,'1872 Toulon Loop','','OHiggins',428,'7939','928809465153','2006-02-15 04:45:30'),(470,'1088 Ibirit Place','','Jalisco',595,'88502','49084281333','2006-02-15 04:45:30'),(471,'1322 Mosul Parkway','','Shandong',145,'95400','268053970382','2006-02-15 04:45:30'),(472,'1447 Chatsworth Place','','Chihuahua',129,'41545','769370126331','2006-02-15 04:45:30'),(473,'1257 Guadalajara Street','','Karnataka',78,'33599','195337700615','2006-02-15 04:45:30'),(474,'1469 Plock Lane','','Galicia',388,'95835','622884741180','2006-02-15 04:45:30'),(475,'434 Ourense (Orense) Manor','','Hodeida',206,'14122','562370137426','2006-02-15 04:45:30'),(476,'270 Tambaram Parkway','','Gauteng',244,'9668','248446668735','2006-02-15 04:45:30'),(477,'1786 Salinas Place','','Nam Ha',359,'66546','206060652238','2006-02-15 04:45:30'),(478,'1078 Stara Zagora Drive','','Aceh',301,'69221','932992626595','2006-02-15 04:45:30'),(479,'1854 Okara Boulevard','','Drenthe',158,'42123','131912793873','2006-02-15 04:45:30'),(480,'421 Yaound Street','','Sumy',385,'11363','726875628268','2006-02-15 04:45:30'),(481,'1153 Allende Way','','Qubec',179,'20336','856872225376','2006-02-15 04:45:30'),(482,'808 Naala-Porto Parkway','','England',500,'41060','553452430707','2006-02-15 04:45:30'),(483,'632 Usolje-Sibirskoje Parkway','','Ha Darom',36,'73085','667648979883','2006-02-15 04:45:30'),(484,'98 Pyongyang Boulevard','','Ohio',11,'88749','191958435142','2006-02-15 04:45:30'),(485,'984 Novoterkassk Loop','','Gaziantep',180,'28165','435118527255','2006-02-15 04:45:30'),(486,'64 Korla Street','','Mwanza',347,'25145','510383179153','2006-02-15 04:45:30'),(487,'1785 So Bernardo do Campo Street','','Veracruz',125,'71182','684529463244','2006-02-15 04:45:30'),(488,'698 Jelets Boulevard','','Denizli',142,'2596','975185523021','2006-02-15 04:45:30'),(489,'1297 Alvorada Parkway','','Ningxia',587,'11839','508348602835','2006-02-15 04:45:30'),(490,'1909 Dayton Avenue','','Guangdong',469,'88513','702955450528','2006-02-15 04:45:30'),(491,'1789 Saint-Denis Parkway','','Coahuila de Zaragoza',4,'8268','936806643983','2006-02-15 04:45:30'),(492,'185 Mannheim Lane','','Stavropol',408,'23661','589377568313','2006-02-15 04:45:30'),(493,'184 Mandaluyong Street','','Baja California Sur',288,'94239','488425406814','2006-02-15 04:45:30'),(494,'591 Sungai Petani Drive','','Okayama',376,'46400','37247325001','2006-02-15 04:45:30'),(495,'656 Matamoros Drive','','Boyac',487,'19489','17305839123','2006-02-15 04:45:30'),(496,'775 ostka Drive','','al-Daqahliya',337,'22358','171973024401','2006-02-15 04:45:30'),(497,'1013 Tabuk Boulevard','','West Bengali',261,'96203','158399646978','2006-02-15 04:45:30'),(498,'319 Plock Parkway','','Istanbul',504,'26101','854259976812','2006-02-15 04:45:30'),(499,'1954 Kowloon and New Kowloon Way','','Chimborazo',434,'63667','898559280434','2006-02-15 04:45:30'),(500,'362 Rajkot Lane','','Gansu',47,'98030','962020153680','2006-02-15 04:45:30'),(501,'1060 Tandil Lane','','Shandong',432,'72349','211256301880','2006-02-15 04:45:30'),(502,'1515 Korla Way','','England',589,'57197','959467760895','2006-02-15 04:45:30'),(503,'1416 San Juan Bautista Tuxtepec Avenue','','Zufar',444,'50592','144206758053','2006-02-15 04:45:30'),(504,'1 Valle de Santiago Avenue','','Apulia',93,'86208','465897838272','2006-02-15 04:45:30'),(505,'519 Brescia Parkway','','East Java',318,'69504','793996678771','2006-02-15 04:45:30'),(506,'414 Mandaluyong Street','','Lubelskie',314,'16370','52709222667','2006-02-15 04:45:30'),(507,'1197 Sokoto Boulevard','','West Bengali',478,'87687','868602816371','2006-02-15 04:45:30'),(508,'496 Celaya Drive','','Nagano',552,'90797','759586584889','2006-02-15 04:45:30'),(509,'786 Matsue Way','','Illinois',245,'37469','111177206479','2006-02-15 04:45:30'),(510,'48 Maracabo Place','','Central Luzon',519,'1570','82671830126','2006-02-15 04:45:30'),(511,'1152 al-Qatif Lane','','Kalimantan Barat',412,'44816','131370665218','2006-02-15 04:45:30'),(512,'1269 Ipoh Avenue','','Eskisehir',163,'54674','402630109080','2006-02-15 04:45:30'),(513,'758 Korolev Parkway','','Andhra Pradesh',568,'75474','441628280920','2006-02-15 04:45:30'),(514,'1747 Rustenburg Place','','Bihar',110,'51369','442673923363','2006-02-15 04:45:30'),(515,'886 Tonghae Place','','Volgograd',259,'19450','711928348157','2006-02-15 04:45:30'),(516,'1574 Goinia Boulevard','','Heilongjiang',502,'39529','59634255214','2006-02-15 04:45:30'),(517,'548 Uruapan Street','','Ontario',312,'35653','879347453467','2006-02-15 04:45:30'),(519,'962 Tama Loop','','',583,'65952','282667506728','2006-02-15 04:45:30'),(520,'1778 Gijn Manor','','Hubei',594,'35156','288910576761','2006-02-15 04:45:30'),(521,'568 Dhule (Dhulia) Loop','','Coquimbo',127,'92568','602101369463','2006-02-15 04:45:30'),(522,'1768 Udine Loop','','Battambang',60,'32347','448876499197','2006-02-15 04:45:30'),(523,'608 Birgunj Parkway','','Taipei',116,'400','627425618482','2006-02-15 04:45:30'),(524,'680 A Corua (La Corua) Manor','','Sivas',482,'49806','158326114853','2006-02-15 04:45:30'),(525,'1949 Sanya Street','','Gumma',224,'61244','132100972047','2006-02-15 04:45:30'),(526,'617 Klerksdorp Place','','Khanh Hoa',366,'94707','574973479129','2006-02-15 04:45:30'),(527,'1993 0 Loop','','Liaoning',588,'41214','25865528181','2006-02-15 04:45:30'),(528,'1176 Southend-on-Sea Manor','','Southern Tagalog',458,'81651','236679267178','2006-02-15 04:45:30'),(529,'600 Purnea (Purnia) Avenue','','Nghe An',571,'18043','638409958875','2006-02-15 04:45:30'),(530,'1003 Qinhuangdao Street','','West Java',419,'25972','35533115997','2006-02-15 04:45:30'),(531,'1986 Sivas Place','','Friuli-Venezia Giuli',551,'95775','182059202712','2006-02-15 04:45:30'),(532,'1427 Tabuk Place','','Florida',101,'31342','214756839122','2006-02-15 04:45:30'),(533,'556 Asuncin Way','','Mogiljov',339,'35364','338244023543','2006-02-15 04:45:30'),(534,'486 Ondo Parkway','','Benguela',67,'35202','105882218332','2006-02-15 04:45:30'),(535,'635 Brest Manor','','Andhra Pradesh',75,'40899','80593242951','2006-02-15 04:45:30'),(536,'166 Jinchang Street','','Buenos Aires',165,'86760','717566026669','2006-02-15 04:45:30'),(537,'958 Sagamihara Lane','','Mie',287,'88408','427274926505','2006-02-15 04:45:30'),(538,'1817 Livorno Way','','Khanh Hoa',100,'79401','478380208348','2006-02-15 04:45:30'),(539,'1332 Gaziantep Lane','','Shandong',80,'22813','383353187467','2006-02-15 04:45:30'),(540,'949 Allende Lane','','Uttar Pradesh',24,'67521','122981120653','2006-02-15 04:45:30'),(541,'195 Ilorin Street','','Chari-Baguirmi',363,'49250','8912935608','2006-02-15 04:45:30'),(542,'193 Bhusawal Place','','Kang-won',539,'9750','745267607502','2006-02-15 04:45:30'),(543,'43 Vilnius Manor','','Colorado',42,'79814','484500282381','2006-02-15 04:45:30'),(544,'183 Haiphong Street','','Jilin',46,'69953','488600270038','2006-02-15 04:45:30'),(545,'163 Augusta-Richmond County Loop','','Carabobo',561,'33030','754579047924','2006-02-15 04:45:30'),(546,'191 Jos Azueta Parkway','','Ruse',436,'13629','932156667696','2006-02-15 04:45:30'),(547,'379 Lublin Parkway','','Toscana',309,'74568','921960450089','2006-02-15 04:45:30'),(548,'1658 Cuman Loop','','Sumatera Selatan',396,'51309','784907335610','2006-02-15 04:45:30'),(549,'454 Qinhuangdao Drive','','Tadla-Azilal',68,'25866','786270036240','2006-02-15 04:45:30'),(550,'1715 Okayama Street','','So Paulo',485,'55676','169352919175','2006-02-15 04:45:30'),(551,'182 Nukualofa Drive','','Sumy',275,'15414','426346224043','2006-02-15 04:45:30'),(552,'390 Wroclaw Way','','Hainan',462,'5753','357593328658','2006-02-15 04:45:30'),(553,'1421 Quilmes Lane','','Ishikawa',260,'19151','135407755975','2006-02-15 04:45:30'),(554,'947 Trshavn Place','','Central Luzon',528,'841','50898428626','2006-02-15 04:45:30'),(555,'1764 Jalib al-Shuyukh Parkway','','Galicia',459,'77642','84794532510','2006-02-15 04:45:30'),(556,'346 Cam Ranh Avenue','','Zhejiang',599,'39976','978430786151','2006-02-15 04:45:30'),(557,'1407 Pachuca de Soto Place','','Rio Grande do Sul',21,'26284','380077794770','2006-02-15 04:45:30'),(558,'904 Clarksville Drive','','Zhejiang',193,'52234','955349440539','2006-02-15 04:45:30'),(559,'1917 Kumbakonam Parkway','','Vojvodina',368,'11892','698182547686','2006-02-15 04:45:30'),(560,'1447 Imus Place','','Gujarat',426,'12905','62127829280','2006-02-15 04:45:30'),(561,'1497 Fengshan Drive','','KwaZulu-Natal',112,'63022','368738360376','2006-02-15 04:45:30'),(562,'869 Shikarpur Way','','England',496,'57380','590764256785','2006-02-15 04:45:30'),(563,'1059 Yuncheng Avenue','','Vilna',570,'47498','107092893983','2006-02-15 04:45:30'),(564,'505 Madiun Boulevard','','Dolnoslaskie',577,'97271','970638808606','2006-02-15 04:45:30'),(565,'1741 Hoshiarpur Boulevard','','al-Sharqiya',79,'22372','855066328617','2006-02-15 04:45:30'),(566,'1229 Varanasi (Benares) Manor','','Buenos Aires',43,'40195','817740355461','2006-02-15 04:45:30'),(567,'1894 Boa Vista Way','','Texas',178,'77464','239357986667','2006-02-15 04:45:30'),(568,'1342 Sharja Way','','Sokoto & Kebbi & Zam',488,'93655','946114054231','2006-02-15 04:45:30'),(569,'1342 Abha Boulevard','','Bukarest',95,'10714','997453607116','2006-02-15 04:45:30'),(570,'415 Pune Avenue','','Shandong',580,'44274','203202500108','2006-02-15 04:45:30'),(571,'1746 Faaa Way','','Huanuco',214,'32515','863080561151','2006-02-15 04:45:30'),(572,'539 Hami Way','','Tokat',538,'52196','525518075499','2006-02-15 04:45:30'),(573,'1407 Surakarta Manor','','Moskova',466,'33224','324346485054','2006-02-15 04:45:30'),(574,'502 Mandi Bahauddin Parkway','','Anzotegui',55,'15992','618156722572','2006-02-15 04:45:30'),(575,'1052 Pathankot Avenue','','Sichuan',299,'77397','128499386727','2006-02-15 04:45:30'),(576,'1351 Sousse Lane','','Coahuila de Zaragoza',341,'37815','203804046132','2006-02-15 04:45:30'),(577,'1501 Pangkal Pinang Avenue','','Mazowieckie',409,'943','770864062795','2006-02-15 04:45:30'),(578,'1405 Hagonoy Avenue','','Slaskie',133,'86587','867287719310','2006-02-15 04:45:30'),(579,'521 San Juan Bautista Tuxtepec Place','','Qaraghandy',598,'95093','844018348565','2006-02-15 04:45:30'),(580,'923 Tangail Boulevard','','Tokyo-to',10,'33384','315528269898','2006-02-15 04:45:30'),(581,'186 Skikda Lane','','Morelos',131,'89422','14465669789','2006-02-15 04:45:30'),(582,'1568 Celaya Parkway','','Kaohsiung',168,'34750','278669994384','2006-02-15 04:45:30'),(583,'1489 Kakamigahara Lane','','Taipei',526,'98883','29341849811','2006-02-15 04:45:30'),(584,'1819 Alessandria Loop','','Campeche',103,'53829','377633994405','2006-02-15 04:45:30'),(585,'1208 Tama Loop','','Ninawa',344,'73605','954786054144','2006-02-15 04:45:30'),(586,'951 Springs Lane','','Central Mindanao',219,'96115','165164761435','2006-02-15 04:45:30'),(587,'760 Miyakonojo Drive','','Guerrero',246,'64682','294449058179','2006-02-15 04:45:30'),(588,'966 Asuncin Way','','Hidalgo',212,'62703','995527378381','2006-02-15 04:45:30'),(589,'1584 Ljubertsy Lane','','England',494,'22954','285710089439','2006-02-15 04:45:30'),(590,'247 Jining Parkway','','Banjul',54,'53446','170115379190','2006-02-15 04:45:30'),(591,'773 Dallas Manor','','Buenos Aires',424,'12664','914466027044','2006-02-15 04:45:30'),(592,'1923 Stara Zagora Lane','','Nantou',546,'95179','182178609211','2006-02-15 04:45:30'),(593,'1402 Zanzibar Boulevard','','Guanajuato',106,'71102','387448063440','2006-02-15 04:45:30'),(594,'1464 Kursk Parkway','','Shandong',574,'17381','338758048786','2006-02-15 04:45:30'),(595,'1074 Sanaa Parkway','','Loja',311,'22474','154124128457','2006-02-15 04:45:30'),(596,'1759 Niznekamsk Avenue','','al-Manama',14,'39414','864392582257','2006-02-15 04:45:30'),(597,'32 Liaocheng Way','','Minas Gerais',248,'1944','410877354933','2006-02-15 04:45:30'),(598,'42 Fontana Avenue','','Fejr',512,'14684','437829801725','2006-02-15 04:45:30'),(599,'1895 Zhezqazghan Drive','','California',177,'36693','137809746111','2006-02-15 04:45:30'),(600,'1837 Kaduna Parkway','','Inner Mongolia',241,'82580','640843562301','2006-02-15 04:45:30'),(601,'844 Bucuresti Place','','Liaoning',242,'36603','935952366111','2006-02-15 04:45:30'),(602,'1101 Bucuresti Boulevard','','West Greece',401,'97661','199514580428','2006-02-15 04:45:30'),(603,'1103 Quilmes Boulevard','','Piura',503,'52137','644021380889','2006-02-15 04:45:30'),(604,'1331 Usak Boulevard','','Vaud',296,'61960','145308717464','2006-02-15 04:45:30'),(605,'1325 Fukuyama Street','','Heilongjiang',537,'27107','288241215394','2006-02-15 04:45:30'); -COMMIT; - --- --- Dumping data for table category --- - -SET AUTOCOMMIT=0; -INSERT INTO category VALUES (1,'Action','2006-02-15 04:46:27'),(2,'Animation','2006-02-15 04:46:27'),(3,'Children','2006-02-15 04:46:27'),(4,'Classics','2006-02-15 04:46:27'),(5,'Comedy','2006-02-15 04:46:27'),(6,'Documentary','2006-02-15 04:46:27'),(7,'Drama','2006-02-15 04:46:27'),(8,'Family','2006-02-15 04:46:27'),(9,'Foreign','2006-02-15 04:46:27'),(10,'Games','2006-02-15 04:46:27'),(11,'Horror','2006-02-15 04:46:27'),(12,'Music','2006-02-15 04:46:27'),(13,'New','2006-02-15 04:46:27'),(14,'Sci-Fi','2006-02-15 04:46:27'),(15,'Sports','2006-02-15 04:46:27'),(16,'Travel','2006-02-15 04:46:27'); -COMMIT; - --- --- Dumping data for table city --- - -SET AUTOCOMMIT=0; -INSERT INTO city VALUES (1,'A Corua (La Corua)',87,'2006-02-15 04:45:25'),(2,'Abha',82,'2006-02-15 04:45:25'),(3,'Abu Dhabi',101,'2006-02-15 04:45:25'),(4,'Acua',60,'2006-02-15 04:45:25'),(5,'Adana',97,'2006-02-15 04:45:25'),(6,'Addis Abeba',31,'2006-02-15 04:45:25'),(7,'Aden',107,'2006-02-15 04:45:25'),(8,'Adoni',44,'2006-02-15 04:45:25'),(9,'Ahmadnagar',44,'2006-02-15 04:45:25'),(10,'Akishima',50,'2006-02-15 04:45:25'),(11,'Akron',103,'2006-02-15 04:45:25'),(12,'al-Ayn',101,'2006-02-15 04:45:25'),(13,'al-Hawiya',82,'2006-02-15 04:45:25'),(14,'al-Manama',11,'2006-02-15 04:45:25'),(15,'al-Qadarif',89,'2006-02-15 04:45:25'),(16,'al-Qatif',82,'2006-02-15 04:45:25'),(17,'Alessandria',49,'2006-02-15 04:45:25'),(18,'Allappuzha (Alleppey)',44,'2006-02-15 04:45:25'),(19,'Allende',60,'2006-02-15 04:45:25'),(20,'Almirante Brown',6,'2006-02-15 04:45:25'),(21,'Alvorada',15,'2006-02-15 04:45:25'),(22,'Ambattur',44,'2006-02-15 04:45:25'),(23,'Amersfoort',67,'2006-02-15 04:45:25'),(24,'Amroha',44,'2006-02-15 04:45:25'),(25,'Angra dos Reis',15,'2006-02-15 04:45:25'),(26,'Anpolis',15,'2006-02-15 04:45:25'),(27,'Antofagasta',22,'2006-02-15 04:45:25'),(28,'Aparecida de Goinia',15,'2006-02-15 04:45:25'),(29,'Apeldoorn',67,'2006-02-15 04:45:25'),(30,'Araatuba',15,'2006-02-15 04:45:25'),(31,'Arak',46,'2006-02-15 04:45:25'),(32,'Arecibo',77,'2006-02-15 04:45:25'),(33,'Arlington',103,'2006-02-15 04:45:25'),(34,'Ashdod',48,'2006-02-15 04:45:25'),(35,'Ashgabat',98,'2006-02-15 04:45:25'),(36,'Ashqelon',48,'2006-02-15 04:45:25'),(37,'Asuncin',73,'2006-02-15 04:45:25'),(38,'Athenai',39,'2006-02-15 04:45:25'),(39,'Atinsk',80,'2006-02-15 04:45:25'),(40,'Atlixco',60,'2006-02-15 04:45:25'),(41,'Augusta-Richmond County',103,'2006-02-15 04:45:25'),(42,'Aurora',103,'2006-02-15 04:45:25'),(43,'Avellaneda',6,'2006-02-15 04:45:25'),(44,'Bag',15,'2006-02-15 04:45:25'),(45,'Baha Blanca',6,'2006-02-15 04:45:25'),(46,'Baicheng',23,'2006-02-15 04:45:25'),(47,'Baiyin',23,'2006-02-15 04:45:25'),(48,'Baku',10,'2006-02-15 04:45:25'),(49,'Balaiha',80,'2006-02-15 04:45:25'),(50,'Balikesir',97,'2006-02-15 04:45:25'),(51,'Balurghat',44,'2006-02-15 04:45:25'),(52,'Bamenda',19,'2006-02-15 04:45:25'),(53,'Bandar Seri Begawan',16,'2006-02-15 04:45:25'),(54,'Banjul',37,'2006-02-15 04:45:25'),(55,'Barcelona',104,'2006-02-15 04:45:25'),(56,'Basel',91,'2006-02-15 04:45:25'),(57,'Bat Yam',48,'2006-02-15 04:45:25'),(58,'Batman',97,'2006-02-15 04:45:25'),(59,'Batna',2,'2006-02-15 04:45:25'),(60,'Battambang',18,'2006-02-15 04:45:25'),(61,'Baybay',75,'2006-02-15 04:45:25'),(62,'Bayugan',75,'2006-02-15 04:45:25'),(63,'Bchar',2,'2006-02-15 04:45:25'),(64,'Beira',63,'2006-02-15 04:45:25'),(65,'Bellevue',103,'2006-02-15 04:45:25'),(66,'Belm',15,'2006-02-15 04:45:25'),(67,'Benguela',4,'2006-02-15 04:45:25'),(68,'Beni-Mellal',62,'2006-02-15 04:45:25'),(69,'Benin City',69,'2006-02-15 04:45:25'),(70,'Bergamo',49,'2006-02-15 04:45:25'),(71,'Berhampore (Baharampur)',44,'2006-02-15 04:45:25'),(72,'Bern',91,'2006-02-15 04:45:25'),(73,'Bhavnagar',44,'2006-02-15 04:45:25'),(74,'Bhilwara',44,'2006-02-15 04:45:25'),(75,'Bhimavaram',44,'2006-02-15 04:45:25'),(76,'Bhopal',44,'2006-02-15 04:45:25'),(77,'Bhusawal',44,'2006-02-15 04:45:25'),(78,'Bijapur',44,'2006-02-15 04:45:25'),(79,'Bilbays',29,'2006-02-15 04:45:25'),(80,'Binzhou',23,'2006-02-15 04:45:25'),(81,'Birgunj',66,'2006-02-15 04:45:25'),(82,'Bislig',75,'2006-02-15 04:45:25'),(83,'Blumenau',15,'2006-02-15 04:45:25'),(84,'Boa Vista',15,'2006-02-15 04:45:25'),(85,'Boksburg',85,'2006-02-15 04:45:25'),(86,'Botosani',78,'2006-02-15 04:45:25'),(87,'Botshabelo',85,'2006-02-15 04:45:25'),(88,'Bradford',102,'2006-02-15 04:45:25'),(89,'Braslia',15,'2006-02-15 04:45:25'),(90,'Bratislava',84,'2006-02-15 04:45:25'),(91,'Brescia',49,'2006-02-15 04:45:25'),(92,'Brest',34,'2006-02-15 04:45:25'),(93,'Brindisi',49,'2006-02-15 04:45:25'),(94,'Brockton',103,'2006-02-15 04:45:25'),(95,'Bucuresti',78,'2006-02-15 04:45:25'),(96,'Buenaventura',24,'2006-02-15 04:45:25'),(97,'Bydgoszcz',76,'2006-02-15 04:45:25'),(98,'Cabuyao',75,'2006-02-15 04:45:25'),(99,'Callao',74,'2006-02-15 04:45:25'),(100,'Cam Ranh',105,'2006-02-15 04:45:25'),(101,'Cape Coral',103,'2006-02-15 04:45:25'),(102,'Caracas',104,'2006-02-15 04:45:25'),(103,'Carmen',60,'2006-02-15 04:45:25'),(104,'Cavite',75,'2006-02-15 04:45:25'),(105,'Cayenne',35,'2006-02-15 04:45:25'),(106,'Celaya',60,'2006-02-15 04:45:25'),(107,'Chandrapur',44,'2006-02-15 04:45:25'),(108,'Changhwa',92,'2006-02-15 04:45:25'),(109,'Changzhou',23,'2006-02-15 04:45:25'),(110,'Chapra',44,'2006-02-15 04:45:25'),(111,'Charlotte Amalie',106,'2006-02-15 04:45:25'),(112,'Chatsworth',85,'2006-02-15 04:45:25'),(113,'Cheju',86,'2006-02-15 04:45:25'),(114,'Chiayi',92,'2006-02-15 04:45:25'),(115,'Chisinau',61,'2006-02-15 04:45:25'),(116,'Chungho',92,'2006-02-15 04:45:25'),(117,'Cianjur',45,'2006-02-15 04:45:25'),(118,'Ciomas',45,'2006-02-15 04:45:25'),(119,'Ciparay',45,'2006-02-15 04:45:25'),(120,'Citrus Heights',103,'2006-02-15 04:45:25'),(121,'Citt del Vaticano',41,'2006-02-15 04:45:25'),(122,'Ciudad del Este',73,'2006-02-15 04:45:25'),(123,'Clarksville',103,'2006-02-15 04:45:25'),(124,'Coacalco de Berriozbal',60,'2006-02-15 04:45:25'),(125,'Coatzacoalcos',60,'2006-02-15 04:45:25'),(126,'Compton',103,'2006-02-15 04:45:25'),(127,'Coquimbo',22,'2006-02-15 04:45:25'),(128,'Crdoba',6,'2006-02-15 04:45:25'),(129,'Cuauhtmoc',60,'2006-02-15 04:45:25'),(130,'Cuautla',60,'2006-02-15 04:45:25'),(131,'Cuernavaca',60,'2006-02-15 04:45:25'),(132,'Cuman',104,'2006-02-15 04:45:25'),(133,'Czestochowa',76,'2006-02-15 04:45:25'),(134,'Dadu',72,'2006-02-15 04:45:25'),(135,'Dallas',103,'2006-02-15 04:45:25'),(136,'Datong',23,'2006-02-15 04:45:25'),(137,'Daugavpils',54,'2006-02-15 04:45:25'),(138,'Davao',75,'2006-02-15 04:45:25'),(139,'Daxian',23,'2006-02-15 04:45:25'),(140,'Dayton',103,'2006-02-15 04:45:25'),(141,'Deba Habe',69,'2006-02-15 04:45:25'),(142,'Denizli',97,'2006-02-15 04:45:25'),(143,'Dhaka',12,'2006-02-15 04:45:25'),(144,'Dhule (Dhulia)',44,'2006-02-15 04:45:25'),(145,'Dongying',23,'2006-02-15 04:45:25'),(146,'Donostia-San Sebastin',87,'2006-02-15 04:45:25'),(147,'Dos Quebradas',24,'2006-02-15 04:45:25'),(148,'Duisburg',38,'2006-02-15 04:45:25'),(149,'Dundee',102,'2006-02-15 04:45:25'),(150,'Dzerzinsk',80,'2006-02-15 04:45:25'),(151,'Ede',67,'2006-02-15 04:45:25'),(152,'Effon-Alaiye',69,'2006-02-15 04:45:25'),(153,'El Alto',14,'2006-02-15 04:45:25'),(154,'El Fuerte',60,'2006-02-15 04:45:25'),(155,'El Monte',103,'2006-02-15 04:45:25'),(156,'Elista',80,'2006-02-15 04:45:25'),(157,'Emeishan',23,'2006-02-15 04:45:25'),(158,'Emmen',67,'2006-02-15 04:45:25'),(159,'Enshi',23,'2006-02-15 04:45:25'),(160,'Erlangen',38,'2006-02-15 04:45:25'),(161,'Escobar',6,'2006-02-15 04:45:25'),(162,'Esfahan',46,'2006-02-15 04:45:25'),(163,'Eskisehir',97,'2006-02-15 04:45:25'),(164,'Etawah',44,'2006-02-15 04:45:25'),(165,'Ezeiza',6,'2006-02-15 04:45:25'),(166,'Ezhou',23,'2006-02-15 04:45:25'),(167,'Faaa',36,'2006-02-15 04:45:25'),(168,'Fengshan',92,'2006-02-15 04:45:25'),(169,'Firozabad',44,'2006-02-15 04:45:25'),(170,'Florencia',24,'2006-02-15 04:45:25'),(171,'Fontana',103,'2006-02-15 04:45:25'),(172,'Fukuyama',50,'2006-02-15 04:45:25'),(173,'Funafuti',99,'2006-02-15 04:45:25'),(174,'Fuyu',23,'2006-02-15 04:45:25'),(175,'Fuzhou',23,'2006-02-15 04:45:25'),(176,'Gandhinagar',44,'2006-02-15 04:45:25'),(177,'Garden Grove',103,'2006-02-15 04:45:25'),(178,'Garland',103,'2006-02-15 04:45:25'),(179,'Gatineau',20,'2006-02-15 04:45:25'),(180,'Gaziantep',97,'2006-02-15 04:45:25'),(181,'Gijn',87,'2006-02-15 04:45:25'),(182,'Gingoog',75,'2006-02-15 04:45:25'),(183,'Goinia',15,'2006-02-15 04:45:25'),(184,'Gorontalo',45,'2006-02-15 04:45:25'),(185,'Grand Prairie',103,'2006-02-15 04:45:25'),(186,'Graz',9,'2006-02-15 04:45:25'),(187,'Greensboro',103,'2006-02-15 04:45:25'),(188,'Guadalajara',60,'2006-02-15 04:45:25'),(189,'Guaruj',15,'2006-02-15 04:45:25'),(190,'guas Lindas de Gois',15,'2006-02-15 04:45:25'),(191,'Gulbarga',44,'2006-02-15 04:45:25'),(192,'Hagonoy',75,'2006-02-15 04:45:25'),(193,'Haining',23,'2006-02-15 04:45:25'),(194,'Haiphong',105,'2006-02-15 04:45:25'),(195,'Haldia',44,'2006-02-15 04:45:25'),(196,'Halifax',20,'2006-02-15 04:45:25'),(197,'Halisahar',44,'2006-02-15 04:45:25'),(198,'Halle/Saale',38,'2006-02-15 04:45:25'),(199,'Hami',23,'2006-02-15 04:45:25'),(200,'Hamilton',68,'2006-02-15 04:45:25'),(201,'Hanoi',105,'2006-02-15 04:45:25'),(202,'Hidalgo',60,'2006-02-15 04:45:25'),(203,'Higashiosaka',50,'2006-02-15 04:45:25'),(204,'Hino',50,'2006-02-15 04:45:25'),(205,'Hiroshima',50,'2006-02-15 04:45:25'),(206,'Hodeida',107,'2006-02-15 04:45:25'),(207,'Hohhot',23,'2006-02-15 04:45:25'),(208,'Hoshiarpur',44,'2006-02-15 04:45:25'),(209,'Hsichuh',92,'2006-02-15 04:45:25'),(210,'Huaian',23,'2006-02-15 04:45:25'),(211,'Hubli-Dharwad',44,'2006-02-15 04:45:25'),(212,'Huejutla de Reyes',60,'2006-02-15 04:45:25'),(213,'Huixquilucan',60,'2006-02-15 04:45:25'),(214,'Hunuco',74,'2006-02-15 04:45:25'),(215,'Ibirit',15,'2006-02-15 04:45:25'),(216,'Idfu',29,'2006-02-15 04:45:25'),(217,'Ife',69,'2006-02-15 04:45:25'),(218,'Ikerre',69,'2006-02-15 04:45:25'),(219,'Iligan',75,'2006-02-15 04:45:25'),(220,'Ilorin',69,'2006-02-15 04:45:25'),(221,'Imus',75,'2006-02-15 04:45:25'),(222,'Inegl',97,'2006-02-15 04:45:25'),(223,'Ipoh',59,'2006-02-15 04:45:25'),(224,'Isesaki',50,'2006-02-15 04:45:25'),(225,'Ivanovo',80,'2006-02-15 04:45:25'),(226,'Iwaki',50,'2006-02-15 04:45:25'),(227,'Iwakuni',50,'2006-02-15 04:45:25'),(228,'Iwatsuki',50,'2006-02-15 04:45:25'),(229,'Izumisano',50,'2006-02-15 04:45:25'),(230,'Jaffna',88,'2006-02-15 04:45:25'),(231,'Jaipur',44,'2006-02-15 04:45:25'),(232,'Jakarta',45,'2006-02-15 04:45:25'),(233,'Jalib al-Shuyukh',53,'2006-02-15 04:45:25'),(234,'Jamalpur',12,'2006-02-15 04:45:25'),(235,'Jaroslavl',80,'2006-02-15 04:45:25'),(236,'Jastrzebie-Zdrj',76,'2006-02-15 04:45:25'),(237,'Jedda',82,'2006-02-15 04:45:25'),(238,'Jelets',80,'2006-02-15 04:45:25'),(239,'Jhansi',44,'2006-02-15 04:45:25'),(240,'Jinchang',23,'2006-02-15 04:45:25'),(241,'Jining',23,'2006-02-15 04:45:25'),(242,'Jinzhou',23,'2006-02-15 04:45:25'),(243,'Jodhpur',44,'2006-02-15 04:45:25'),(244,'Johannesburg',85,'2006-02-15 04:45:25'),(245,'Joliet',103,'2006-02-15 04:45:25'),(246,'Jos Azueta',60,'2006-02-15 04:45:25'),(247,'Juazeiro do Norte',15,'2006-02-15 04:45:25'),(248,'Juiz de Fora',15,'2006-02-15 04:45:25'),(249,'Junan',23,'2006-02-15 04:45:25'),(250,'Jurez',60,'2006-02-15 04:45:25'),(251,'Kabul',1,'2006-02-15 04:45:25'),(252,'Kaduna',69,'2006-02-15 04:45:25'),(253,'Kakamigahara',50,'2006-02-15 04:45:25'),(254,'Kaliningrad',80,'2006-02-15 04:45:25'),(255,'Kalisz',76,'2006-02-15 04:45:25'),(256,'Kamakura',50,'2006-02-15 04:45:25'),(257,'Kamarhati',44,'2006-02-15 04:45:25'),(258,'Kamjanets-Podilskyi',100,'2006-02-15 04:45:25'),(259,'Kamyin',80,'2006-02-15 04:45:25'),(260,'Kanazawa',50,'2006-02-15 04:45:25'),(261,'Kanchrapara',44,'2006-02-15 04:45:25'),(262,'Kansas City',103,'2006-02-15 04:45:25'),(263,'Karnal',44,'2006-02-15 04:45:25'),(264,'Katihar',44,'2006-02-15 04:45:25'),(265,'Kermanshah',46,'2006-02-15 04:45:25'),(266,'Kilis',97,'2006-02-15 04:45:25'),(267,'Kimberley',85,'2006-02-15 04:45:25'),(268,'Kimchon',86,'2006-02-15 04:45:25'),(269,'Kingstown',81,'2006-02-15 04:45:25'),(270,'Kirovo-Tepetsk',80,'2006-02-15 04:45:25'),(271,'Kisumu',52,'2006-02-15 04:45:25'),(272,'Kitwe',109,'2006-02-15 04:45:25'),(273,'Klerksdorp',85,'2006-02-15 04:45:25'),(274,'Kolpino',80,'2006-02-15 04:45:25'),(275,'Konotop',100,'2006-02-15 04:45:25'),(276,'Koriyama',50,'2006-02-15 04:45:25'),(277,'Korla',23,'2006-02-15 04:45:25'),(278,'Korolev',80,'2006-02-15 04:45:25'),(279,'Kowloon and New Kowloon',42,'2006-02-15 04:45:25'),(280,'Kragujevac',108,'2006-02-15 04:45:25'),(281,'Ktahya',97,'2006-02-15 04:45:25'),(282,'Kuching',59,'2006-02-15 04:45:25'),(283,'Kumbakonam',44,'2006-02-15 04:45:25'),(284,'Kurashiki',50,'2006-02-15 04:45:25'),(285,'Kurgan',80,'2006-02-15 04:45:25'),(286,'Kursk',80,'2006-02-15 04:45:25'),(287,'Kuwana',50,'2006-02-15 04:45:25'),(288,'La Paz',60,'2006-02-15 04:45:25'),(289,'La Plata',6,'2006-02-15 04:45:25'),(290,'La Romana',27,'2006-02-15 04:45:25'),(291,'Laiwu',23,'2006-02-15 04:45:25'),(292,'Lancaster',103,'2006-02-15 04:45:25'),(293,'Laohekou',23,'2006-02-15 04:45:25'),(294,'Lapu-Lapu',75,'2006-02-15 04:45:25'),(295,'Laredo',103,'2006-02-15 04:45:25'),(296,'Lausanne',91,'2006-02-15 04:45:25'),(297,'Le Mans',34,'2006-02-15 04:45:25'),(298,'Lengshuijiang',23,'2006-02-15 04:45:25'),(299,'Leshan',23,'2006-02-15 04:45:25'),(300,'Lethbridge',20,'2006-02-15 04:45:25'),(301,'Lhokseumawe',45,'2006-02-15 04:45:25'),(302,'Liaocheng',23,'2006-02-15 04:45:25'),(303,'Liepaja',54,'2006-02-15 04:45:25'),(304,'Lilongwe',58,'2006-02-15 04:45:25'),(305,'Lima',74,'2006-02-15 04:45:25'),(306,'Lincoln',103,'2006-02-15 04:45:25'),(307,'Linz',9,'2006-02-15 04:45:25'),(308,'Lipetsk',80,'2006-02-15 04:45:25'),(309,'Livorno',49,'2006-02-15 04:45:25'),(310,'Ljubertsy',80,'2006-02-15 04:45:25'),(311,'Loja',28,'2006-02-15 04:45:25'),(312,'London',102,'2006-02-15 04:45:25'),(313,'London',20,'2006-02-15 04:45:25'),(314,'Lublin',76,'2006-02-15 04:45:25'),(315,'Lubumbashi',25,'2006-02-15 04:45:25'),(316,'Lungtan',92,'2006-02-15 04:45:25'),(317,'Luzinia',15,'2006-02-15 04:45:25'),(318,'Madiun',45,'2006-02-15 04:45:25'),(319,'Mahajanga',57,'2006-02-15 04:45:25'),(320,'Maikop',80,'2006-02-15 04:45:25'),(321,'Malm',90,'2006-02-15 04:45:25'),(322,'Manchester',103,'2006-02-15 04:45:25'),(323,'Mandaluyong',75,'2006-02-15 04:45:25'),(324,'Mandi Bahauddin',72,'2006-02-15 04:45:25'),(325,'Mannheim',38,'2006-02-15 04:45:25'),(326,'Maracabo',104,'2006-02-15 04:45:25'),(327,'Mardan',72,'2006-02-15 04:45:25'),(328,'Maring',15,'2006-02-15 04:45:25'),(329,'Masqat',71,'2006-02-15 04:45:25'),(330,'Matamoros',60,'2006-02-15 04:45:25'),(331,'Matsue',50,'2006-02-15 04:45:25'),(332,'Meixian',23,'2006-02-15 04:45:25'),(333,'Memphis',103,'2006-02-15 04:45:25'),(334,'Merlo',6,'2006-02-15 04:45:25'),(335,'Mexicali',60,'2006-02-15 04:45:25'),(336,'Miraj',44,'2006-02-15 04:45:25'),(337,'Mit Ghamr',29,'2006-02-15 04:45:25'),(338,'Miyakonojo',50,'2006-02-15 04:45:25'),(339,'Mogiljov',13,'2006-02-15 04:45:25'),(340,'Molodetno',13,'2006-02-15 04:45:25'),(341,'Monclova',60,'2006-02-15 04:45:25'),(342,'Monywa',64,'2006-02-15 04:45:25'),(343,'Moscow',80,'2006-02-15 04:45:25'),(344,'Mosul',47,'2006-02-15 04:45:25'),(345,'Mukateve',100,'2006-02-15 04:45:25'),(346,'Munger (Monghyr)',44,'2006-02-15 04:45:25'),(347,'Mwanza',93,'2006-02-15 04:45:25'),(348,'Mwene-Ditu',25,'2006-02-15 04:45:25'),(349,'Myingyan',64,'2006-02-15 04:45:25'),(350,'Mysore',44,'2006-02-15 04:45:25'),(351,'Naala-Porto',63,'2006-02-15 04:45:25'),(352,'Nabereznyje Telny',80,'2006-02-15 04:45:25'),(353,'Nador',62,'2006-02-15 04:45:25'),(354,'Nagaon',44,'2006-02-15 04:45:25'),(355,'Nagareyama',50,'2006-02-15 04:45:25'),(356,'Najafabad',46,'2006-02-15 04:45:25'),(357,'Naju',86,'2006-02-15 04:45:25'),(358,'Nakhon Sawan',94,'2006-02-15 04:45:25'),(359,'Nam Dinh',105,'2006-02-15 04:45:25'),(360,'Namibe',4,'2006-02-15 04:45:25'),(361,'Nantou',92,'2006-02-15 04:45:25'),(362,'Nanyang',23,'2006-02-15 04:45:25'),(363,'NDjamna',21,'2006-02-15 04:45:25'),(364,'Newcastle',85,'2006-02-15 04:45:25'),(365,'Nezahualcyotl',60,'2006-02-15 04:45:25'),(366,'Nha Trang',105,'2006-02-15 04:45:25'),(367,'Niznekamsk',80,'2006-02-15 04:45:25'),(368,'Novi Sad',108,'2006-02-15 04:45:25'),(369,'Novoterkassk',80,'2006-02-15 04:45:25'),(370,'Nukualofa',95,'2006-02-15 04:45:25'),(371,'Nuuk',40,'2006-02-15 04:45:25'),(372,'Nyeri',52,'2006-02-15 04:45:25'),(373,'Ocumare del Tuy',104,'2006-02-15 04:45:25'),(374,'Ogbomosho',69,'2006-02-15 04:45:25'),(375,'Okara',72,'2006-02-15 04:45:25'),(376,'Okayama',50,'2006-02-15 04:45:25'),(377,'Okinawa',50,'2006-02-15 04:45:25'),(378,'Olomouc',26,'2006-02-15 04:45:25'),(379,'Omdurman',89,'2006-02-15 04:45:25'),(380,'Omiya',50,'2006-02-15 04:45:25'),(381,'Ondo',69,'2006-02-15 04:45:25'),(382,'Onomichi',50,'2006-02-15 04:45:25'),(383,'Oshawa',20,'2006-02-15 04:45:25'),(384,'Osmaniye',97,'2006-02-15 04:45:25'),(385,'ostka',100,'2006-02-15 04:45:25'),(386,'Otsu',50,'2006-02-15 04:45:25'),(387,'Oulu',33,'2006-02-15 04:45:25'),(388,'Ourense (Orense)',87,'2006-02-15 04:45:25'),(389,'Owo',69,'2006-02-15 04:45:25'),(390,'Oyo',69,'2006-02-15 04:45:25'),(391,'Ozamis',75,'2006-02-15 04:45:25'),(392,'Paarl',85,'2006-02-15 04:45:25'),(393,'Pachuca de Soto',60,'2006-02-15 04:45:25'),(394,'Pak Kret',94,'2006-02-15 04:45:25'),(395,'Palghat (Palakkad)',44,'2006-02-15 04:45:25'),(396,'Pangkal Pinang',45,'2006-02-15 04:45:25'),(397,'Papeete',36,'2006-02-15 04:45:25'),(398,'Parbhani',44,'2006-02-15 04:45:25'),(399,'Pathankot',44,'2006-02-15 04:45:25'),(400,'Patiala',44,'2006-02-15 04:45:25'),(401,'Patras',39,'2006-02-15 04:45:25'),(402,'Pavlodar',51,'2006-02-15 04:45:25'),(403,'Pemalang',45,'2006-02-15 04:45:25'),(404,'Peoria',103,'2006-02-15 04:45:25'),(405,'Pereira',24,'2006-02-15 04:45:25'),(406,'Phnom Penh',18,'2006-02-15 04:45:25'),(407,'Pingxiang',23,'2006-02-15 04:45:25'),(408,'Pjatigorsk',80,'2006-02-15 04:45:25'),(409,'Plock',76,'2006-02-15 04:45:25'),(410,'Po',15,'2006-02-15 04:45:25'),(411,'Ponce',77,'2006-02-15 04:45:25'),(412,'Pontianak',45,'2006-02-15 04:45:25'),(413,'Poos de Caldas',15,'2006-02-15 04:45:25'),(414,'Portoviejo',28,'2006-02-15 04:45:25'),(415,'Probolinggo',45,'2006-02-15 04:45:25'),(416,'Pudukkottai',44,'2006-02-15 04:45:25'),(417,'Pune',44,'2006-02-15 04:45:25'),(418,'Purnea (Purnia)',44,'2006-02-15 04:45:25'),(419,'Purwakarta',45,'2006-02-15 04:45:25'),(420,'Pyongyang',70,'2006-02-15 04:45:25'),(421,'Qalyub',29,'2006-02-15 04:45:25'),(422,'Qinhuangdao',23,'2006-02-15 04:45:25'),(423,'Qomsheh',46,'2006-02-15 04:45:25'),(424,'Quilmes',6,'2006-02-15 04:45:25'),(425,'Rae Bareli',44,'2006-02-15 04:45:25'),(426,'Rajkot',44,'2006-02-15 04:45:25'),(427,'Rampur',44,'2006-02-15 04:45:25'),(428,'Rancagua',22,'2006-02-15 04:45:25'),(429,'Ranchi',44,'2006-02-15 04:45:25'),(430,'Richmond Hill',20,'2006-02-15 04:45:25'),(431,'Rio Claro',15,'2006-02-15 04:45:25'),(432,'Rizhao',23,'2006-02-15 04:45:25'),(433,'Roanoke',103,'2006-02-15 04:45:25'),(434,'Robamba',28,'2006-02-15 04:45:25'),(435,'Rockford',103,'2006-02-15 04:45:25'),(436,'Ruse',17,'2006-02-15 04:45:25'),(437,'Rustenburg',85,'2006-02-15 04:45:25'),(438,'s-Hertogenbosch',67,'2006-02-15 04:45:25'),(439,'Saarbrcken',38,'2006-02-15 04:45:25'),(440,'Sagamihara',50,'2006-02-15 04:45:25'),(441,'Saint Louis',103,'2006-02-15 04:45:25'),(442,'Saint-Denis',79,'2006-02-15 04:45:25'),(443,'Sal',62,'2006-02-15 04:45:25'),(444,'Salala',71,'2006-02-15 04:45:25'),(445,'Salamanca',60,'2006-02-15 04:45:25'),(446,'Salinas',103,'2006-02-15 04:45:25'),(447,'Salzburg',9,'2006-02-15 04:45:25'),(448,'Sambhal',44,'2006-02-15 04:45:25'),(449,'San Bernardino',103,'2006-02-15 04:45:25'),(450,'San Felipe de Puerto Plata',27,'2006-02-15 04:45:25'),(451,'San Felipe del Progreso',60,'2006-02-15 04:45:25'),(452,'San Juan Bautista Tuxtepec',60,'2006-02-15 04:45:25'),(453,'San Lorenzo',73,'2006-02-15 04:45:25'),(454,'San Miguel de Tucumn',6,'2006-02-15 04:45:25'),(455,'Sanaa',107,'2006-02-15 04:45:25'),(456,'Santa Brbara dOeste',15,'2006-02-15 04:45:25'),(457,'Santa F',6,'2006-02-15 04:45:25'),(458,'Santa Rosa',75,'2006-02-15 04:45:25'),(459,'Santiago de Compostela',87,'2006-02-15 04:45:25'),(460,'Santiago de los Caballeros',27,'2006-02-15 04:45:25'),(461,'Santo Andr',15,'2006-02-15 04:45:25'),(462,'Sanya',23,'2006-02-15 04:45:25'),(463,'Sasebo',50,'2006-02-15 04:45:25'),(464,'Satna',44,'2006-02-15 04:45:25'),(465,'Sawhaj',29,'2006-02-15 04:45:25'),(466,'Serpuhov',80,'2006-02-15 04:45:25'),(467,'Shahr-e Kord',46,'2006-02-15 04:45:25'),(468,'Shanwei',23,'2006-02-15 04:45:25'),(469,'Shaoguan',23,'2006-02-15 04:45:25'),(470,'Sharja',101,'2006-02-15 04:45:25'),(471,'Shenzhen',23,'2006-02-15 04:45:25'),(472,'Shikarpur',72,'2006-02-15 04:45:25'),(473,'Shimoga',44,'2006-02-15 04:45:25'),(474,'Shimonoseki',50,'2006-02-15 04:45:25'),(475,'Shivapuri',44,'2006-02-15 04:45:25'),(476,'Shubra al-Khayma',29,'2006-02-15 04:45:25'),(477,'Siegen',38,'2006-02-15 04:45:25'),(478,'Siliguri (Shiliguri)',44,'2006-02-15 04:45:25'),(479,'Simferopol',100,'2006-02-15 04:45:25'),(480,'Sincelejo',24,'2006-02-15 04:45:25'),(481,'Sirjan',46,'2006-02-15 04:45:25'),(482,'Sivas',97,'2006-02-15 04:45:25'),(483,'Skikda',2,'2006-02-15 04:45:25'),(484,'Smolensk',80,'2006-02-15 04:45:25'),(485,'So Bernardo do Campo',15,'2006-02-15 04:45:25'),(486,'So Leopoldo',15,'2006-02-15 04:45:25'),(487,'Sogamoso',24,'2006-02-15 04:45:25'),(488,'Sokoto',69,'2006-02-15 04:45:25'),(489,'Songkhla',94,'2006-02-15 04:45:25'),(490,'Sorocaba',15,'2006-02-15 04:45:25'),(491,'Soshanguve',85,'2006-02-15 04:45:25'),(492,'Sousse',96,'2006-02-15 04:45:25'),(493,'South Hill',5,'2006-02-15 04:45:25'),(494,'Southampton',102,'2006-02-15 04:45:25'),(495,'Southend-on-Sea',102,'2006-02-15 04:45:25'),(496,'Southport',102,'2006-02-15 04:45:25'),(497,'Springs',85,'2006-02-15 04:45:25'),(498,'Stara Zagora',17,'2006-02-15 04:45:25'),(499,'Sterling Heights',103,'2006-02-15 04:45:25'),(500,'Stockport',102,'2006-02-15 04:45:25'),(501,'Sucre',14,'2006-02-15 04:45:25'),(502,'Suihua',23,'2006-02-15 04:45:25'),(503,'Sullana',74,'2006-02-15 04:45:25'),(504,'Sultanbeyli',97,'2006-02-15 04:45:25'),(505,'Sumqayit',10,'2006-02-15 04:45:25'),(506,'Sumy',100,'2006-02-15 04:45:25'),(507,'Sungai Petani',59,'2006-02-15 04:45:25'),(508,'Sunnyvale',103,'2006-02-15 04:45:25'),(509,'Surakarta',45,'2006-02-15 04:45:25'),(510,'Syktyvkar',80,'2006-02-15 04:45:25'),(511,'Syrakusa',49,'2006-02-15 04:45:25'),(512,'Szkesfehrvr',43,'2006-02-15 04:45:25'),(513,'Tabora',93,'2006-02-15 04:45:25'),(514,'Tabriz',46,'2006-02-15 04:45:25'),(515,'Tabuk',82,'2006-02-15 04:45:25'),(516,'Tafuna',3,'2006-02-15 04:45:25'),(517,'Taguig',75,'2006-02-15 04:45:25'),(518,'Taizz',107,'2006-02-15 04:45:25'),(519,'Talavera',75,'2006-02-15 04:45:25'),(520,'Tallahassee',103,'2006-02-15 04:45:25'),(521,'Tama',50,'2006-02-15 04:45:25'),(522,'Tambaram',44,'2006-02-15 04:45:25'),(523,'Tanauan',75,'2006-02-15 04:45:25'),(524,'Tandil',6,'2006-02-15 04:45:25'),(525,'Tangail',12,'2006-02-15 04:45:25'),(526,'Tanshui',92,'2006-02-15 04:45:25'),(527,'Tanza',75,'2006-02-15 04:45:25'),(528,'Tarlac',75,'2006-02-15 04:45:25'),(529,'Tarsus',97,'2006-02-15 04:45:25'),(530,'Tartu',30,'2006-02-15 04:45:25'),(531,'Teboksary',80,'2006-02-15 04:45:25'),(532,'Tegal',45,'2006-02-15 04:45:25'),(533,'Tel Aviv-Jaffa',48,'2006-02-15 04:45:25'),(534,'Tete',63,'2006-02-15 04:45:25'),(535,'Tianjin',23,'2006-02-15 04:45:25'),(536,'Tiefa',23,'2006-02-15 04:45:25'),(537,'Tieli',23,'2006-02-15 04:45:25'),(538,'Tokat',97,'2006-02-15 04:45:25'),(539,'Tonghae',86,'2006-02-15 04:45:25'),(540,'Tongliao',23,'2006-02-15 04:45:25'),(541,'Torren',60,'2006-02-15 04:45:25'),(542,'Touliu',92,'2006-02-15 04:45:25'),(543,'Toulon',34,'2006-02-15 04:45:25'),(544,'Toulouse',34,'2006-02-15 04:45:25'),(545,'Trshavn',32,'2006-02-15 04:45:25'),(546,'Tsaotun',92,'2006-02-15 04:45:25'),(547,'Tsuyama',50,'2006-02-15 04:45:25'),(548,'Tuguegarao',75,'2006-02-15 04:45:25'),(549,'Tychy',76,'2006-02-15 04:45:25'),(550,'Udaipur',44,'2006-02-15 04:45:25'),(551,'Udine',49,'2006-02-15 04:45:25'),(552,'Ueda',50,'2006-02-15 04:45:25'),(553,'Uijongbu',86,'2006-02-15 04:45:25'),(554,'Uluberia',44,'2006-02-15 04:45:25'),(555,'Urawa',50,'2006-02-15 04:45:25'),(556,'Uruapan',60,'2006-02-15 04:45:25'),(557,'Usak',97,'2006-02-15 04:45:25'),(558,'Usolje-Sibirskoje',80,'2006-02-15 04:45:25'),(559,'Uttarpara-Kotrung',44,'2006-02-15 04:45:25'),(560,'Vaduz',55,'2006-02-15 04:45:25'),(561,'Valencia',104,'2006-02-15 04:45:25'),(562,'Valle de la Pascua',104,'2006-02-15 04:45:25'),(563,'Valle de Santiago',60,'2006-02-15 04:45:25'),(564,'Valparai',44,'2006-02-15 04:45:25'),(565,'Vancouver',20,'2006-02-15 04:45:25'),(566,'Varanasi (Benares)',44,'2006-02-15 04:45:25'),(567,'Vicente Lpez',6,'2006-02-15 04:45:25'),(568,'Vijayawada',44,'2006-02-15 04:45:25'),(569,'Vila Velha',15,'2006-02-15 04:45:25'),(570,'Vilnius',56,'2006-02-15 04:45:25'),(571,'Vinh',105,'2006-02-15 04:45:25'),(572,'Vitria de Santo Anto',15,'2006-02-15 04:45:25'),(573,'Warren',103,'2006-02-15 04:45:25'),(574,'Weifang',23,'2006-02-15 04:45:25'),(575,'Witten',38,'2006-02-15 04:45:25'),(576,'Woodridge',8,'2006-02-15 04:45:25'),(577,'Wroclaw',76,'2006-02-15 04:45:25'),(578,'Xiangfan',23,'2006-02-15 04:45:25'),(579,'Xiangtan',23,'2006-02-15 04:45:25'),(580,'Xintai',23,'2006-02-15 04:45:25'),(581,'Xinxiang',23,'2006-02-15 04:45:25'),(582,'Yamuna Nagar',44,'2006-02-15 04:45:25'),(583,'Yangor',65,'2006-02-15 04:45:25'),(584,'Yantai',23,'2006-02-15 04:45:25'),(585,'Yaound',19,'2006-02-15 04:45:25'),(586,'Yerevan',7,'2006-02-15 04:45:25'),(587,'Yinchuan',23,'2006-02-15 04:45:25'),(588,'Yingkou',23,'2006-02-15 04:45:25'),(589,'York',102,'2006-02-15 04:45:25'),(590,'Yuncheng',23,'2006-02-15 04:45:25'),(591,'Yuzhou',23,'2006-02-15 04:45:25'),(592,'Zalantun',23,'2006-02-15 04:45:25'),(593,'Zanzibar',93,'2006-02-15 04:45:25'),(594,'Zaoyang',23,'2006-02-15 04:45:25'),(595,'Zapopan',60,'2006-02-15 04:45:25'),(596,'Zaria',69,'2006-02-15 04:45:25'),(597,'Zeleznogorsk',80,'2006-02-15 04:45:25'),(598,'Zhezqazghan',51,'2006-02-15 04:45:25'),(599,'Zhoushan',23,'2006-02-15 04:45:25'),(600,'Ziguinchor',83,'2006-02-15 04:45:25'); -COMMIT; - --- --- Dumping data for table country --- - -SET AUTOCOMMIT=0; -INSERT INTO country VALUES (1,'Afghanistan','2006-02-15 04:44:00'),(2,'Algeria','2006-02-15 04:44:00'),(3,'American Samoa','2006-02-15 04:44:00'),(4,'Angola','2006-02-15 04:44:00'),(5,'Anguilla','2006-02-15 04:44:00'),(6,'Argentina','2006-02-15 04:44:00'),(7,'Armenia','2006-02-15 04:44:00'),(8,'Australia','2006-02-15 04:44:00'),(9,'Austria','2006-02-15 04:44:00'),(10,'Azerbaijan','2006-02-15 04:44:00'),(11,'Bahrain','2006-02-15 04:44:00'),(12,'Bangladesh','2006-02-15 04:44:00'),(13,'Belarus','2006-02-15 04:44:00'),(14,'Bolivia','2006-02-15 04:44:00'),(15,'Brazil','2006-02-15 04:44:00'),(16,'Brunei','2006-02-15 04:44:00'),(17,'Bulgaria','2006-02-15 04:44:00'),(18,'Cambodia','2006-02-15 04:44:00'),(19,'Cameroon','2006-02-15 04:44:00'),(20,'Canada','2006-02-15 04:44:00'),(21,'Chad','2006-02-15 04:44:00'),(22,'Chile','2006-02-15 04:44:00'),(23,'China','2006-02-15 04:44:00'),(24,'Colombia','2006-02-15 04:44:00'),(25,'Congo, The Democratic Republic of the','2006-02-15 04:44:00'),(26,'Czech Republic','2006-02-15 04:44:00'),(27,'Dominican Republic','2006-02-15 04:44:00'),(28,'Ecuador','2006-02-15 04:44:00'),(29,'Egypt','2006-02-15 04:44:00'),(30,'Estonia','2006-02-15 04:44:00'),(31,'Ethiopia','2006-02-15 04:44:00'),(32,'Faroe Islands','2006-02-15 04:44:00'),(33,'Finland','2006-02-15 04:44:00'),(34,'France','2006-02-15 04:44:00'),(35,'French Guiana','2006-02-15 04:44:00'),(36,'French Polynesia','2006-02-15 04:44:00'),(37,'Gambia','2006-02-15 04:44:00'),(38,'Germany','2006-02-15 04:44:00'),(39,'Greece','2006-02-15 04:44:00'),(40,'Greenland','2006-02-15 04:44:00'),(41,'Holy See (Vatican City State)','2006-02-15 04:44:00'),(42,'Hong Kong','2006-02-15 04:44:00'),(43,'Hungary','2006-02-15 04:44:00'),(44,'India','2006-02-15 04:44:00'),(45,'Indonesia','2006-02-15 04:44:00'),(46,'Iran','2006-02-15 04:44:00'),(47,'Iraq','2006-02-15 04:44:00'),(48,'Israel','2006-02-15 04:44:00'),(49,'Italy','2006-02-15 04:44:00'),(50,'Japan','2006-02-15 04:44:00'),(51,'Kazakstan','2006-02-15 04:44:00'),(52,'Kenya','2006-02-15 04:44:00'),(53,'Kuwait','2006-02-15 04:44:00'),(54,'Latvia','2006-02-15 04:44:00'),(55,'Liechtenstein','2006-02-15 04:44:00'),(56,'Lithuania','2006-02-15 04:44:00'),(57,'Madagascar','2006-02-15 04:44:00'),(58,'Malawi','2006-02-15 04:44:00'),(59,'Malaysia','2006-02-15 04:44:00'),(60,'Mexico','2006-02-15 04:44:00'),(61,'Moldova','2006-02-15 04:44:00'),(62,'Morocco','2006-02-15 04:44:00'),(63,'Mozambique','2006-02-15 04:44:00'),(64,'Myanmar','2006-02-15 04:44:00'),(65,'Nauru','2006-02-15 04:44:00'),(66,'Nepal','2006-02-15 04:44:00'),(67,'Netherlands','2006-02-15 04:44:00'),(68,'New Zealand','2006-02-15 04:44:00'),(69,'Nigeria','2006-02-15 04:44:00'),(70,'North Korea','2006-02-15 04:44:00'),(71,'Oman','2006-02-15 04:44:00'),(72,'Pakistan','2006-02-15 04:44:00'),(73,'Paraguay','2006-02-15 04:44:00'),(74,'Peru','2006-02-15 04:44:00'),(75,'Philippines','2006-02-15 04:44:00'),(76,'Poland','2006-02-15 04:44:00'),(77,'Puerto Rico','2006-02-15 04:44:00'),(78,'Romania','2006-02-15 04:44:00'),(79,'Runion','2006-02-15 04:44:00'),(80,'Russian Federation','2006-02-15 04:44:00'),(81,'Saint Vincent and the Grenadines','2006-02-15 04:44:00'),(82,'Saudi Arabia','2006-02-15 04:44:00'),(83,'Senegal','2006-02-15 04:44:00'),(84,'Slovakia','2006-02-15 04:44:00'),(85,'South Africa','2006-02-15 04:44:00'),(86,'South Korea','2006-02-15 04:44:00'),(87,'Spain','2006-02-15 04:44:00'),(88,'Sri Lanka','2006-02-15 04:44:00'),(89,'Sudan','2006-02-15 04:44:00'),(90,'Sweden','2006-02-15 04:44:00'),(91,'Switzerland','2006-02-15 04:44:00'),(92,'Taiwan','2006-02-15 04:44:00'),(93,'Tanzania','2006-02-15 04:44:00'),(94,'Thailand','2006-02-15 04:44:00'),(95,'Tonga','2006-02-15 04:44:00'),(96,'Tunisia','2006-02-15 04:44:00'),(97,'Turkey','2006-02-15 04:44:00'),(98,'Turkmenistan','2006-02-15 04:44:00'),(99,'Tuvalu','2006-02-15 04:44:00'),(100,'Ukraine','2006-02-15 04:44:00'),(101,'United Arab Emirates','2006-02-15 04:44:00'),(102,'United Kingdom','2006-02-15 04:44:00'),(103,'United States','2006-02-15 04:44:00'),(104,'Venezuela','2006-02-15 04:44:00'),(105,'Vietnam','2006-02-15 04:44:00'),(106,'Virgin Islands, U.S.','2006-02-15 04:44:00'),(107,'Yemen','2006-02-15 04:44:00'),(108,'Yugoslavia','2006-02-15 04:44:00'),(109,'Zambia','2006-02-15 04:44:00'); -COMMIT; - --- --- Dumping data for table customer --- - -SET AUTOCOMMIT=0; -INSERT INTO customer VALUES (1,1,'MARY','SMITH','MARY.SMITH@sakilacustomer.org',5,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(2,1,'PATRICIA','JOHNSON','PATRICIA.JOHNSON@sakilacustomer.org',6,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(3,1,'LINDA','WILLIAMS','LINDA.WILLIAMS@sakilacustomer.org',7,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(4,2,'BARBARA','JONES','BARBARA.JONES@sakilacustomer.org',8,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(5,1,'ELIZABETH','BROWN','ELIZABETH.BROWN@sakilacustomer.org',9,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(6,2,'JENNIFER','DAVIS','JENNIFER.DAVIS@sakilacustomer.org',10,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(7,1,'MARIA','MILLER','MARIA.MILLER@sakilacustomer.org',11,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(8,2,'SUSAN','WILSON','SUSAN.WILSON@sakilacustomer.org',12,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(9,2,'MARGARET','MOORE','MARGARET.MOORE@sakilacustomer.org',13,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(10,1,'DOROTHY','TAYLOR','DOROTHY.TAYLOR@sakilacustomer.org',14,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(11,2,'LISA','ANDERSON','LISA.ANDERSON@sakilacustomer.org',15,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(12,1,'NANCY','THOMAS','NANCY.THOMAS@sakilacustomer.org',16,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(13,2,'KAREN','JACKSON','KAREN.JACKSON@sakilacustomer.org',17,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(14,2,'BETTY','WHITE','BETTY.WHITE@sakilacustomer.org',18,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(15,1,'HELEN','HARRIS','HELEN.HARRIS@sakilacustomer.org',19,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(16,2,'SANDRA','MARTIN','SANDRA.MARTIN@sakilacustomer.org',20,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(17,1,'DONNA','THOMPSON','DONNA.THOMPSON@sakilacustomer.org',21,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(18,2,'CAROL','GARCIA','CAROL.GARCIA@sakilacustomer.org',22,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(19,1,'RUTH','MARTINEZ','RUTH.MARTINEZ@sakilacustomer.org',23,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(20,2,'SHARON','ROBINSON','SHARON.ROBINSON@sakilacustomer.org',24,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(21,1,'MICHELLE','CLARK','MICHELLE.CLARK@sakilacustomer.org',25,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(22,1,'LAURA','RODRIGUEZ','LAURA.RODRIGUEZ@sakilacustomer.org',26,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(23,2,'SARAH','LEWIS','SARAH.LEWIS@sakilacustomer.org',27,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(24,2,'KIMBERLY','LEE','KIMBERLY.LEE@sakilacustomer.org',28,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(25,1,'DEBORAH','WALKER','DEBORAH.WALKER@sakilacustomer.org',29,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(26,2,'JESSICA','HALL','JESSICA.HALL@sakilacustomer.org',30,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(27,2,'SHIRLEY','ALLEN','SHIRLEY.ALLEN@sakilacustomer.org',31,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(28,1,'CYNTHIA','YOUNG','CYNTHIA.YOUNG@sakilacustomer.org',32,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(29,2,'ANGELA','HERNANDEZ','ANGELA.HERNANDEZ@sakilacustomer.org',33,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(30,1,'MELISSA','KING','MELISSA.KING@sakilacustomer.org',34,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(31,2,'BRENDA','WRIGHT','BRENDA.WRIGHT@sakilacustomer.org',35,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(32,1,'AMY','LOPEZ','AMY.LOPEZ@sakilacustomer.org',36,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(33,2,'ANNA','HILL','ANNA.HILL@sakilacustomer.org',37,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(34,2,'REBECCA','SCOTT','REBECCA.SCOTT@sakilacustomer.org',38,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(35,2,'VIRGINIA','GREEN','VIRGINIA.GREEN@sakilacustomer.org',39,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(36,2,'KATHLEEN','ADAMS','KATHLEEN.ADAMS@sakilacustomer.org',40,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(37,1,'PAMELA','BAKER','PAMELA.BAKER@sakilacustomer.org',41,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(38,1,'MARTHA','GONZALEZ','MARTHA.GONZALEZ@sakilacustomer.org',42,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(39,1,'DEBRA','NELSON','DEBRA.NELSON@sakilacustomer.org',43,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(40,2,'AMANDA','CARTER','AMANDA.CARTER@sakilacustomer.org',44,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(41,1,'STEPHANIE','MITCHELL','STEPHANIE.MITCHELL@sakilacustomer.org',45,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(42,2,'CAROLYN','PEREZ','CAROLYN.PEREZ@sakilacustomer.org',46,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(43,2,'CHRISTINE','ROBERTS','CHRISTINE.ROBERTS@sakilacustomer.org',47,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(44,1,'MARIE','TURNER','MARIE.TURNER@sakilacustomer.org',48,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(45,1,'JANET','PHILLIPS','JANET.PHILLIPS@sakilacustomer.org',49,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(46,2,'CATHERINE','CAMPBELL','CATHERINE.CAMPBELL@sakilacustomer.org',50,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(47,1,'FRANCES','PARKER','FRANCES.PARKER@sakilacustomer.org',51,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(48,1,'ANN','EVANS','ANN.EVANS@sakilacustomer.org',52,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(49,2,'JOYCE','EDWARDS','JOYCE.EDWARDS@sakilacustomer.org',53,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(50,1,'DIANE','COLLINS','DIANE.COLLINS@sakilacustomer.org',54,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(51,1,'ALICE','STEWART','ALICE.STEWART@sakilacustomer.org',55,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(52,1,'JULIE','SANCHEZ','JULIE.SANCHEZ@sakilacustomer.org',56,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(53,1,'HEATHER','MORRIS','HEATHER.MORRIS@sakilacustomer.org',57,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(54,1,'TERESA','ROGERS','TERESA.ROGERS@sakilacustomer.org',58,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(55,2,'DORIS','REED','DORIS.REED@sakilacustomer.org',59,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(56,1,'GLORIA','COOK','GLORIA.COOK@sakilacustomer.org',60,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(57,2,'EVELYN','MORGAN','EVELYN.MORGAN@sakilacustomer.org',61,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(58,1,'JEAN','BELL','JEAN.BELL@sakilacustomer.org',62,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(59,1,'CHERYL','MURPHY','CHERYL.MURPHY@sakilacustomer.org',63,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(60,1,'MILDRED','BAILEY','MILDRED.BAILEY@sakilacustomer.org',64,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(61,2,'KATHERINE','RIVERA','KATHERINE.RIVERA@sakilacustomer.org',65,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(62,1,'JOAN','COOPER','JOAN.COOPER@sakilacustomer.org',66,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(63,1,'ASHLEY','RICHARDSON','ASHLEY.RICHARDSON@sakilacustomer.org',67,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(64,2,'JUDITH','COX','JUDITH.COX@sakilacustomer.org',68,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(65,2,'ROSE','HOWARD','ROSE.HOWARD@sakilacustomer.org',69,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(66,2,'JANICE','WARD','JANICE.WARD@sakilacustomer.org',70,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(67,1,'KELLY','TORRES','KELLY.TORRES@sakilacustomer.org',71,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(68,1,'NICOLE','PETERSON','NICOLE.PETERSON@sakilacustomer.org',72,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(69,2,'JUDY','GRAY','JUDY.GRAY@sakilacustomer.org',73,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(70,2,'CHRISTINA','RAMIREZ','CHRISTINA.RAMIREZ@sakilacustomer.org',74,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(71,1,'KATHY','JAMES','KATHY.JAMES@sakilacustomer.org',75,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(72,2,'THERESA','WATSON','THERESA.WATSON@sakilacustomer.org',76,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(73,2,'BEVERLY','BROOKS','BEVERLY.BROOKS@sakilacustomer.org',77,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(74,1,'DENISE','KELLY','DENISE.KELLY@sakilacustomer.org',78,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(75,2,'TAMMY','SANDERS','TAMMY.SANDERS@sakilacustomer.org',79,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(76,2,'IRENE','PRICE','IRENE.PRICE@sakilacustomer.org',80,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(77,2,'JANE','BENNETT','JANE.BENNETT@sakilacustomer.org',81,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(78,1,'LORI','WOOD','LORI.WOOD@sakilacustomer.org',82,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(79,1,'RACHEL','BARNES','RACHEL.BARNES@sakilacustomer.org',83,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(80,1,'MARILYN','ROSS','MARILYN.ROSS@sakilacustomer.org',84,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(81,1,'ANDREA','HENDERSON','ANDREA.HENDERSON@sakilacustomer.org',85,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(82,1,'KATHRYN','COLEMAN','KATHRYN.COLEMAN@sakilacustomer.org',86,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(83,1,'LOUISE','JENKINS','LOUISE.JENKINS@sakilacustomer.org',87,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(84,2,'SARA','PERRY','SARA.PERRY@sakilacustomer.org',88,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(85,2,'ANNE','POWELL','ANNE.POWELL@sakilacustomer.org',89,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(86,2,'JACQUELINE','LONG','JACQUELINE.LONG@sakilacustomer.org',90,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(87,1,'WANDA','PATTERSON','WANDA.PATTERSON@sakilacustomer.org',91,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(88,2,'BONNIE','HUGHES','BONNIE.HUGHES@sakilacustomer.org',92,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(89,1,'JULIA','FLORES','JULIA.FLORES@sakilacustomer.org',93,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(90,2,'RUBY','WASHINGTON','RUBY.WASHINGTON@sakilacustomer.org',94,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(91,2,'LOIS','BUTLER','LOIS.BUTLER@sakilacustomer.org',95,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(92,2,'TINA','SIMMONS','TINA.SIMMONS@sakilacustomer.org',96,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(93,1,'PHYLLIS','FOSTER','PHYLLIS.FOSTER@sakilacustomer.org',97,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(94,1,'NORMA','GONZALES','NORMA.GONZALES@sakilacustomer.org',98,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(95,2,'PAULA','BRYANT','PAULA.BRYANT@sakilacustomer.org',99,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(96,1,'DIANA','ALEXANDER','DIANA.ALEXANDER@sakilacustomer.org',100,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(97,2,'ANNIE','RUSSELL','ANNIE.RUSSELL@sakilacustomer.org',101,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(98,1,'LILLIAN','GRIFFIN','LILLIAN.GRIFFIN@sakilacustomer.org',102,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(99,2,'EMILY','DIAZ','EMILY.DIAZ@sakilacustomer.org',103,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(100,1,'ROBIN','HAYES','ROBIN.HAYES@sakilacustomer.org',104,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(101,1,'PEGGY','MYERS','PEGGY.MYERS@sakilacustomer.org',105,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(102,1,'CRYSTAL','FORD','CRYSTAL.FORD@sakilacustomer.org',106,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(103,1,'GLADYS','HAMILTON','GLADYS.HAMILTON@sakilacustomer.org',107,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(104,1,'RITA','GRAHAM','RITA.GRAHAM@sakilacustomer.org',108,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(105,1,'DAWN','SULLIVAN','DAWN.SULLIVAN@sakilacustomer.org',109,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(106,1,'CONNIE','WALLACE','CONNIE.WALLACE@sakilacustomer.org',110,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(107,1,'FLORENCE','WOODS','FLORENCE.WOODS@sakilacustomer.org',111,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(108,1,'TRACY','COLE','TRACY.COLE@sakilacustomer.org',112,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(109,2,'EDNA','WEST','EDNA.WEST@sakilacustomer.org',113,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(110,2,'TIFFANY','JORDAN','TIFFANY.JORDAN@sakilacustomer.org',114,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(111,1,'CARMEN','OWENS','CARMEN.OWENS@sakilacustomer.org',115,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(112,2,'ROSA','REYNOLDS','ROSA.REYNOLDS@sakilacustomer.org',116,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(113,2,'CINDY','FISHER','CINDY.FISHER@sakilacustomer.org',117,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(114,2,'GRACE','ELLIS','GRACE.ELLIS@sakilacustomer.org',118,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(115,1,'WENDY','HARRISON','WENDY.HARRISON@sakilacustomer.org',119,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(116,1,'VICTORIA','GIBSON','VICTORIA.GIBSON@sakilacustomer.org',120,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(117,1,'EDITH','MCDONALD','EDITH.MCDONALD@sakilacustomer.org',121,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(118,1,'KIM','CRUZ','KIM.CRUZ@sakilacustomer.org',122,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(119,1,'SHERRY','MARSHALL','SHERRY.MARSHALL@sakilacustomer.org',123,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(120,2,'SYLVIA','ORTIZ','SYLVIA.ORTIZ@sakilacustomer.org',124,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(121,1,'JOSEPHINE','GOMEZ','JOSEPHINE.GOMEZ@sakilacustomer.org',125,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(122,1,'THELMA','MURRAY','THELMA.MURRAY@sakilacustomer.org',126,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(123,2,'SHANNON','FREEMAN','SHANNON.FREEMAN@sakilacustomer.org',127,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(124,1,'SHEILA','WELLS','SHEILA.WELLS@sakilacustomer.org',128,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(125,1,'ETHEL','WEBB','ETHEL.WEBB@sakilacustomer.org',129,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(126,1,'ELLEN','SIMPSON','ELLEN.SIMPSON@sakilacustomer.org',130,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(127,2,'ELAINE','STEVENS','ELAINE.STEVENS@sakilacustomer.org',131,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(128,1,'MARJORIE','TUCKER','MARJORIE.TUCKER@sakilacustomer.org',132,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(129,1,'CARRIE','PORTER','CARRIE.PORTER@sakilacustomer.org',133,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(130,1,'CHARLOTTE','HUNTER','CHARLOTTE.HUNTER@sakilacustomer.org',134,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(131,2,'MONICA','HICKS','MONICA.HICKS@sakilacustomer.org',135,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(132,2,'ESTHER','CRAWFORD','ESTHER.CRAWFORD@sakilacustomer.org',136,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(133,1,'PAULINE','HENRY','PAULINE.HENRY@sakilacustomer.org',137,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(134,1,'EMMA','BOYD','EMMA.BOYD@sakilacustomer.org',138,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(135,2,'JUANITA','MASON','JUANITA.MASON@sakilacustomer.org',139,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(136,2,'ANITA','MORALES','ANITA.MORALES@sakilacustomer.org',140,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(137,2,'RHONDA','KENNEDY','RHONDA.KENNEDY@sakilacustomer.org',141,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(138,1,'HAZEL','WARREN','HAZEL.WARREN@sakilacustomer.org',142,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(139,1,'AMBER','DIXON','AMBER.DIXON@sakilacustomer.org',143,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(140,1,'EVA','RAMOS','EVA.RAMOS@sakilacustomer.org',144,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(141,1,'DEBBIE','REYES','DEBBIE.REYES@sakilacustomer.org',145,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(142,1,'APRIL','BURNS','APRIL.BURNS@sakilacustomer.org',146,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(143,1,'LESLIE','GORDON','LESLIE.GORDON@sakilacustomer.org',147,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(144,1,'CLARA','SHAW','CLARA.SHAW@sakilacustomer.org',148,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(145,1,'LUCILLE','HOLMES','LUCILLE.HOLMES@sakilacustomer.org',149,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(146,1,'JAMIE','RICE','JAMIE.RICE@sakilacustomer.org',150,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(147,2,'JOANNE','ROBERTSON','JOANNE.ROBERTSON@sakilacustomer.org',151,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(148,1,'ELEANOR','HUNT','ELEANOR.HUNT@sakilacustomer.org',152,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(149,1,'VALERIE','BLACK','VALERIE.BLACK@sakilacustomer.org',153,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(150,2,'DANIELLE','DANIELS','DANIELLE.DANIELS@sakilacustomer.org',154,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(151,2,'MEGAN','PALMER','MEGAN.PALMER@sakilacustomer.org',155,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(152,1,'ALICIA','MILLS','ALICIA.MILLS@sakilacustomer.org',156,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(153,2,'SUZANNE','NICHOLS','SUZANNE.NICHOLS@sakilacustomer.org',157,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(154,2,'MICHELE','GRANT','MICHELE.GRANT@sakilacustomer.org',158,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(155,1,'GAIL','KNIGHT','GAIL.KNIGHT@sakilacustomer.org',159,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(156,1,'BERTHA','FERGUSON','BERTHA.FERGUSON@sakilacustomer.org',160,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(157,2,'DARLENE','ROSE','DARLENE.ROSE@sakilacustomer.org',161,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(158,1,'VERONICA','STONE','VERONICA.STONE@sakilacustomer.org',162,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(159,1,'JILL','HAWKINS','JILL.HAWKINS@sakilacustomer.org',163,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(160,2,'ERIN','DUNN','ERIN.DUNN@sakilacustomer.org',164,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(161,1,'GERALDINE','PERKINS','GERALDINE.PERKINS@sakilacustomer.org',165,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(162,2,'LAUREN','HUDSON','LAUREN.HUDSON@sakilacustomer.org',166,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(163,1,'CATHY','SPENCER','CATHY.SPENCER@sakilacustomer.org',167,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(164,2,'JOANN','GARDNER','JOANN.GARDNER@sakilacustomer.org',168,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(165,2,'LORRAINE','STEPHENS','LORRAINE.STEPHENS@sakilacustomer.org',169,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(166,1,'LYNN','PAYNE','LYNN.PAYNE@sakilacustomer.org',170,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(167,2,'SALLY','PIERCE','SALLY.PIERCE@sakilacustomer.org',171,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(168,1,'REGINA','BERRY','REGINA.BERRY@sakilacustomer.org',172,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(169,2,'ERICA','MATTHEWS','ERICA.MATTHEWS@sakilacustomer.org',173,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(170,1,'BEATRICE','ARNOLD','BEATRICE.ARNOLD@sakilacustomer.org',174,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(171,2,'DOLORES','WAGNER','DOLORES.WAGNER@sakilacustomer.org',175,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(172,1,'BERNICE','WILLIS','BERNICE.WILLIS@sakilacustomer.org',176,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(173,1,'AUDREY','RAY','AUDREY.RAY@sakilacustomer.org',177,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(174,2,'YVONNE','WATKINS','YVONNE.WATKINS@sakilacustomer.org',178,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(175,1,'ANNETTE','OLSON','ANNETTE.OLSON@sakilacustomer.org',179,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(176,1,'JUNE','CARROLL','JUNE.CARROLL@sakilacustomer.org',180,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(177,2,'SAMANTHA','DUNCAN','SAMANTHA.DUNCAN@sakilacustomer.org',181,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(178,2,'MARION','SNYDER','MARION.SNYDER@sakilacustomer.org',182,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(179,1,'DANA','HART','DANA.HART@sakilacustomer.org',183,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(180,2,'STACY','CUNNINGHAM','STACY.CUNNINGHAM@sakilacustomer.org',184,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(181,2,'ANA','BRADLEY','ANA.BRADLEY@sakilacustomer.org',185,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(182,1,'RENEE','LANE','RENEE.LANE@sakilacustomer.org',186,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(183,2,'IDA','ANDREWS','IDA.ANDREWS@sakilacustomer.org',187,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(184,1,'VIVIAN','RUIZ','VIVIAN.RUIZ@sakilacustomer.org',188,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(185,1,'ROBERTA','HARPER','ROBERTA.HARPER@sakilacustomer.org',189,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(186,2,'HOLLY','FOX','HOLLY.FOX@sakilacustomer.org',190,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(187,2,'BRITTANY','RILEY','BRITTANY.RILEY@sakilacustomer.org',191,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(188,1,'MELANIE','ARMSTRONG','MELANIE.ARMSTRONG@sakilacustomer.org',192,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(189,1,'LORETTA','CARPENTER','LORETTA.CARPENTER@sakilacustomer.org',193,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(190,2,'YOLANDA','WEAVER','YOLANDA.WEAVER@sakilacustomer.org',194,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(191,1,'JEANETTE','GREENE','JEANETTE.GREENE@sakilacustomer.org',195,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(192,1,'LAURIE','LAWRENCE','LAURIE.LAWRENCE@sakilacustomer.org',196,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(193,2,'KATIE','ELLIOTT','KATIE.ELLIOTT@sakilacustomer.org',197,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(194,2,'KRISTEN','CHAVEZ','KRISTEN.CHAVEZ@sakilacustomer.org',198,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(195,1,'VANESSA','SIMS','VANESSA.SIMS@sakilacustomer.org',199,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(196,1,'ALMA','AUSTIN','ALMA.AUSTIN@sakilacustomer.org',200,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(197,2,'SUE','PETERS','SUE.PETERS@sakilacustomer.org',201,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(198,2,'ELSIE','KELLEY','ELSIE.KELLEY@sakilacustomer.org',202,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(199,2,'BETH','FRANKLIN','BETH.FRANKLIN@sakilacustomer.org',203,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(200,2,'JEANNE','LAWSON','JEANNE.LAWSON@sakilacustomer.org',204,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(201,1,'VICKI','FIELDS','VICKI.FIELDS@sakilacustomer.org',205,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(202,2,'CARLA','GUTIERREZ','CARLA.GUTIERREZ@sakilacustomer.org',206,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(203,1,'TARA','RYAN','TARA.RYAN@sakilacustomer.org',207,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(204,1,'ROSEMARY','SCHMIDT','ROSEMARY.SCHMIDT@sakilacustomer.org',208,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(205,2,'EILEEN','CARR','EILEEN.CARR@sakilacustomer.org',209,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(206,1,'TERRI','VASQUEZ','TERRI.VASQUEZ@sakilacustomer.org',210,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(207,1,'GERTRUDE','CASTILLO','GERTRUDE.CASTILLO@sakilacustomer.org',211,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(208,1,'LUCY','WHEELER','LUCY.WHEELER@sakilacustomer.org',212,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(209,2,'TONYA','CHAPMAN','TONYA.CHAPMAN@sakilacustomer.org',213,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(210,2,'ELLA','OLIVER','ELLA.OLIVER@sakilacustomer.org',214,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(211,1,'STACEY','MONTGOMERY','STACEY.MONTGOMERY@sakilacustomer.org',215,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(212,2,'WILMA','RICHARDS','WILMA.RICHARDS@sakilacustomer.org',216,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(213,1,'GINA','WILLIAMSON','GINA.WILLIAMSON@sakilacustomer.org',217,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(214,1,'KRISTIN','JOHNSTON','KRISTIN.JOHNSTON@sakilacustomer.org',218,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(215,2,'JESSIE','BANKS','JESSIE.BANKS@sakilacustomer.org',219,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(216,1,'NATALIE','MEYER','NATALIE.MEYER@sakilacustomer.org',220,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(217,2,'AGNES','BISHOP','AGNES.BISHOP@sakilacustomer.org',221,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(218,1,'VERA','MCCOY','VERA.MCCOY@sakilacustomer.org',222,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(219,2,'WILLIE','HOWELL','WILLIE.HOWELL@sakilacustomer.org',223,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(220,2,'CHARLENE','ALVAREZ','CHARLENE.ALVAREZ@sakilacustomer.org',224,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(221,1,'BESSIE','MORRISON','BESSIE.MORRISON@sakilacustomer.org',225,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(222,2,'DELORES','HANSEN','DELORES.HANSEN@sakilacustomer.org',226,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(223,1,'MELINDA','FERNANDEZ','MELINDA.FERNANDEZ@sakilacustomer.org',227,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(224,2,'PEARL','GARZA','PEARL.GARZA@sakilacustomer.org',228,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(225,1,'ARLENE','HARVEY','ARLENE.HARVEY@sakilacustomer.org',229,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(226,2,'MAUREEN','LITTLE','MAUREEN.LITTLE@sakilacustomer.org',230,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(227,1,'COLLEEN','BURTON','COLLEEN.BURTON@sakilacustomer.org',231,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(228,2,'ALLISON','STANLEY','ALLISON.STANLEY@sakilacustomer.org',232,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(229,1,'TAMARA','NGUYEN','TAMARA.NGUYEN@sakilacustomer.org',233,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(230,2,'JOY','GEORGE','JOY.GEORGE@sakilacustomer.org',234,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(231,1,'GEORGIA','JACOBS','GEORGIA.JACOBS@sakilacustomer.org',235,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(232,2,'CONSTANCE','REID','CONSTANCE.REID@sakilacustomer.org',236,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(233,2,'LILLIE','KIM','LILLIE.KIM@sakilacustomer.org',237,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(234,1,'CLAUDIA','FULLER','CLAUDIA.FULLER@sakilacustomer.org',238,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(235,1,'JACKIE','LYNCH','JACKIE.LYNCH@sakilacustomer.org',239,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(236,1,'MARCIA','DEAN','MARCIA.DEAN@sakilacustomer.org',240,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(237,1,'TANYA','GILBERT','TANYA.GILBERT@sakilacustomer.org',241,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(238,1,'NELLIE','GARRETT','NELLIE.GARRETT@sakilacustomer.org',242,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(239,2,'MINNIE','ROMERO','MINNIE.ROMERO@sakilacustomer.org',243,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(240,1,'MARLENE','WELCH','MARLENE.WELCH@sakilacustomer.org',244,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(241,2,'HEIDI','LARSON','HEIDI.LARSON@sakilacustomer.org',245,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(242,1,'GLENDA','FRAZIER','GLENDA.FRAZIER@sakilacustomer.org',246,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(243,1,'LYDIA','BURKE','LYDIA.BURKE@sakilacustomer.org',247,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(244,2,'VIOLA','HANSON','VIOLA.HANSON@sakilacustomer.org',248,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(245,1,'COURTNEY','DAY','COURTNEY.DAY@sakilacustomer.org',249,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(246,1,'MARIAN','MENDOZA','MARIAN.MENDOZA@sakilacustomer.org',250,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(247,1,'STELLA','MORENO','STELLA.MORENO@sakilacustomer.org',251,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(248,1,'CAROLINE','BOWMAN','CAROLINE.BOWMAN@sakilacustomer.org',252,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(249,2,'DORA','MEDINA','DORA.MEDINA@sakilacustomer.org',253,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(250,2,'JO','FOWLER','JO.FOWLER@sakilacustomer.org',254,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(251,2,'VICKIE','BREWER','VICKIE.BREWER@sakilacustomer.org',255,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(252,2,'MATTIE','HOFFMAN','MATTIE.HOFFMAN@sakilacustomer.org',256,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(253,1,'TERRY','CARLSON','TERRY.CARLSON@sakilacustomer.org',258,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(254,2,'MAXINE','SILVA','MAXINE.SILVA@sakilacustomer.org',259,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(255,2,'IRMA','PEARSON','IRMA.PEARSON@sakilacustomer.org',260,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(256,2,'MABEL','HOLLAND','MABEL.HOLLAND@sakilacustomer.org',261,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(257,2,'MARSHA','DOUGLAS','MARSHA.DOUGLAS@sakilacustomer.org',262,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(258,1,'MYRTLE','FLEMING','MYRTLE.FLEMING@sakilacustomer.org',263,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(259,2,'LENA','JENSEN','LENA.JENSEN@sakilacustomer.org',264,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(260,1,'CHRISTY','VARGAS','CHRISTY.VARGAS@sakilacustomer.org',265,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(261,1,'DEANNA','BYRD','DEANNA.BYRD@sakilacustomer.org',266,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(262,2,'PATSY','DAVIDSON','PATSY.DAVIDSON@sakilacustomer.org',267,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(263,1,'HILDA','HOPKINS','HILDA.HOPKINS@sakilacustomer.org',268,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(264,1,'GWENDOLYN','MAY','GWENDOLYN.MAY@sakilacustomer.org',269,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(265,2,'JENNIE','TERRY','JENNIE.TERRY@sakilacustomer.org',270,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(266,2,'NORA','HERRERA','NORA.HERRERA@sakilacustomer.org',271,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(267,1,'MARGIE','WADE','MARGIE.WADE@sakilacustomer.org',272,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(268,1,'NINA','SOTO','NINA.SOTO@sakilacustomer.org',273,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(269,1,'CASSANDRA','WALTERS','CASSANDRA.WALTERS@sakilacustomer.org',274,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(270,1,'LEAH','CURTIS','LEAH.CURTIS@sakilacustomer.org',275,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(271,1,'PENNY','NEAL','PENNY.NEAL@sakilacustomer.org',276,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(272,1,'KAY','CALDWELL','KAY.CALDWELL@sakilacustomer.org',277,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(273,2,'PRISCILLA','LOWE','PRISCILLA.LOWE@sakilacustomer.org',278,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(274,1,'NAOMI','JENNINGS','NAOMI.JENNINGS@sakilacustomer.org',279,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(275,2,'CAROLE','BARNETT','CAROLE.BARNETT@sakilacustomer.org',280,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(276,1,'BRANDY','GRAVES','BRANDY.GRAVES@sakilacustomer.org',281,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(277,2,'OLGA','JIMENEZ','OLGA.JIMENEZ@sakilacustomer.org',282,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(278,2,'BILLIE','HORTON','BILLIE.HORTON@sakilacustomer.org',283,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(279,2,'DIANNE','SHELTON','DIANNE.SHELTON@sakilacustomer.org',284,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(280,2,'TRACEY','BARRETT','TRACEY.BARRETT@sakilacustomer.org',285,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(281,2,'LEONA','OBRIEN','LEONA.OBRIEN@sakilacustomer.org',286,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(282,2,'JENNY','CASTRO','JENNY.CASTRO@sakilacustomer.org',287,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(283,1,'FELICIA','SUTTON','FELICIA.SUTTON@sakilacustomer.org',288,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(284,1,'SONIA','GREGORY','SONIA.GREGORY@sakilacustomer.org',289,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(285,1,'MIRIAM','MCKINNEY','MIRIAM.MCKINNEY@sakilacustomer.org',290,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(286,1,'VELMA','LUCAS','VELMA.LUCAS@sakilacustomer.org',291,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(287,2,'BECKY','MILES','BECKY.MILES@sakilacustomer.org',292,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(288,1,'BOBBIE','CRAIG','BOBBIE.CRAIG@sakilacustomer.org',293,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(289,1,'VIOLET','RODRIQUEZ','VIOLET.RODRIQUEZ@sakilacustomer.org',294,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(290,1,'KRISTINA','CHAMBERS','KRISTINA.CHAMBERS@sakilacustomer.org',295,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(291,1,'TONI','HOLT','TONI.HOLT@sakilacustomer.org',296,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(292,2,'MISTY','LAMBERT','MISTY.LAMBERT@sakilacustomer.org',297,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(293,2,'MAE','FLETCHER','MAE.FLETCHER@sakilacustomer.org',298,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(294,2,'SHELLY','WATTS','SHELLY.WATTS@sakilacustomer.org',299,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(295,1,'DAISY','BATES','DAISY.BATES@sakilacustomer.org',300,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(296,2,'RAMONA','HALE','RAMONA.HALE@sakilacustomer.org',301,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(297,1,'SHERRI','RHODES','SHERRI.RHODES@sakilacustomer.org',302,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(298,1,'ERIKA','PENA','ERIKA.PENA@sakilacustomer.org',303,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(299,2,'JAMES','GANNON','JAMES.GANNON@sakilacustomer.org',304,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(300,1,'JOHN','FARNSWORTH','JOHN.FARNSWORTH@sakilacustomer.org',305,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(301,2,'ROBERT','BAUGHMAN','ROBERT.BAUGHMAN@sakilacustomer.org',306,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(302,1,'MICHAEL','SILVERMAN','MICHAEL.SILVERMAN@sakilacustomer.org',307,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(303,2,'WILLIAM','SATTERFIELD','WILLIAM.SATTERFIELD@sakilacustomer.org',308,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(304,2,'DAVID','ROYAL','DAVID.ROYAL@sakilacustomer.org',309,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(305,1,'RICHARD','MCCRARY','RICHARD.MCCRARY@sakilacustomer.org',310,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(306,1,'CHARLES','KOWALSKI','CHARLES.KOWALSKI@sakilacustomer.org',311,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(307,2,'JOSEPH','JOY','JOSEPH.JOY@sakilacustomer.org',312,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(308,1,'THOMAS','GRIGSBY','THOMAS.GRIGSBY@sakilacustomer.org',313,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(309,1,'CHRISTOPHER','GRECO','CHRISTOPHER.GRECO@sakilacustomer.org',314,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(310,2,'DANIEL','CABRAL','DANIEL.CABRAL@sakilacustomer.org',315,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(311,2,'PAUL','TROUT','PAUL.TROUT@sakilacustomer.org',316,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(312,2,'MARK','RINEHART','MARK.RINEHART@sakilacustomer.org',317,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(313,2,'DONALD','MAHON','DONALD.MAHON@sakilacustomer.org',318,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(314,1,'GEORGE','LINTON','GEORGE.LINTON@sakilacustomer.org',319,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(315,2,'KENNETH','GOODEN','KENNETH.GOODEN@sakilacustomer.org',320,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(316,1,'STEVEN','CURLEY','STEVEN.CURLEY@sakilacustomer.org',321,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(317,2,'EDWARD','BAUGH','EDWARD.BAUGH@sakilacustomer.org',322,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(318,1,'BRIAN','WYMAN','BRIAN.WYMAN@sakilacustomer.org',323,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(319,2,'RONALD','WEINER','RONALD.WEINER@sakilacustomer.org',324,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(320,2,'ANTHONY','SCHWAB','ANTHONY.SCHWAB@sakilacustomer.org',325,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(321,1,'KEVIN','SCHULER','KEVIN.SCHULER@sakilacustomer.org',326,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(322,1,'JASON','MORRISSEY','JASON.MORRISSEY@sakilacustomer.org',327,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(323,2,'MATTHEW','MAHAN','MATTHEW.MAHAN@sakilacustomer.org',328,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(324,2,'GARY','COY','GARY.COY@sakilacustomer.org',329,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(325,1,'TIMOTHY','BUNN','TIMOTHY.BUNN@sakilacustomer.org',330,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(326,1,'JOSE','ANDREW','JOSE.ANDREW@sakilacustomer.org',331,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(327,2,'LARRY','THRASHER','LARRY.THRASHER@sakilacustomer.org',332,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(328,2,'JEFFREY','SPEAR','JEFFREY.SPEAR@sakilacustomer.org',333,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(329,2,'FRANK','WAGGONER','FRANK.WAGGONER@sakilacustomer.org',334,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(330,1,'SCOTT','SHELLEY','SCOTT.SHELLEY@sakilacustomer.org',335,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(331,1,'ERIC','ROBERT','ERIC.ROBERT@sakilacustomer.org',336,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(332,1,'STEPHEN','QUALLS','STEPHEN.QUALLS@sakilacustomer.org',337,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(333,2,'ANDREW','PURDY','ANDREW.PURDY@sakilacustomer.org',338,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(334,2,'RAYMOND','MCWHORTER','RAYMOND.MCWHORTER@sakilacustomer.org',339,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(335,1,'GREGORY','MAULDIN','GREGORY.MAULDIN@sakilacustomer.org',340,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(336,1,'JOSHUA','MARK','JOSHUA.MARK@sakilacustomer.org',341,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(337,1,'JERRY','JORDON','JERRY.JORDON@sakilacustomer.org',342,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(338,1,'DENNIS','GILMAN','DENNIS.GILMAN@sakilacustomer.org',343,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(339,2,'WALTER','PERRYMAN','WALTER.PERRYMAN@sakilacustomer.org',344,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(340,1,'PATRICK','NEWSOM','PATRICK.NEWSOM@sakilacustomer.org',345,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(341,1,'PETER','MENARD','PETER.MENARD@sakilacustomer.org',346,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(342,1,'HAROLD','MARTINO','HAROLD.MARTINO@sakilacustomer.org',347,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(343,1,'DOUGLAS','GRAF','DOUGLAS.GRAF@sakilacustomer.org',348,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(344,1,'HENRY','BILLINGSLEY','HENRY.BILLINGSLEY@sakilacustomer.org',349,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(345,1,'CARL','ARTIS','CARL.ARTIS@sakilacustomer.org',350,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(346,1,'ARTHUR','SIMPKINS','ARTHUR.SIMPKINS@sakilacustomer.org',351,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(347,2,'RYAN','SALISBURY','RYAN.SALISBURY@sakilacustomer.org',352,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(348,2,'ROGER','QUINTANILLA','ROGER.QUINTANILLA@sakilacustomer.org',353,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(349,2,'JOE','GILLILAND','JOE.GILLILAND@sakilacustomer.org',354,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(350,1,'JUAN','FRALEY','JUAN.FRALEY@sakilacustomer.org',355,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(351,1,'JACK','FOUST','JACK.FOUST@sakilacustomer.org',356,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(352,1,'ALBERT','CROUSE','ALBERT.CROUSE@sakilacustomer.org',357,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(353,1,'JONATHAN','SCARBOROUGH','JONATHAN.SCARBOROUGH@sakilacustomer.org',358,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(354,2,'JUSTIN','NGO','JUSTIN.NGO@sakilacustomer.org',359,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(355,2,'TERRY','GRISSOM','TERRY.GRISSOM@sakilacustomer.org',360,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(356,2,'GERALD','FULTZ','GERALD.FULTZ@sakilacustomer.org',361,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(357,1,'KEITH','RICO','KEITH.RICO@sakilacustomer.org',362,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(358,2,'SAMUEL','MARLOW','SAMUEL.MARLOW@sakilacustomer.org',363,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(359,2,'WILLIE','MARKHAM','WILLIE.MARKHAM@sakilacustomer.org',364,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(360,2,'RALPH','MADRIGAL','RALPH.MADRIGAL@sakilacustomer.org',365,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(361,2,'LAWRENCE','LAWTON','LAWRENCE.LAWTON@sakilacustomer.org',366,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(362,1,'NICHOLAS','BARFIELD','NICHOLAS.BARFIELD@sakilacustomer.org',367,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(363,2,'ROY','WHITING','ROY.WHITING@sakilacustomer.org',368,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(364,1,'BENJAMIN','VARNEY','BENJAMIN.VARNEY@sakilacustomer.org',369,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(365,2,'BRUCE','SCHWARZ','BRUCE.SCHWARZ@sakilacustomer.org',370,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(366,1,'BRANDON','HUEY','BRANDON.HUEY@sakilacustomer.org',371,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(367,1,'ADAM','GOOCH','ADAM.GOOCH@sakilacustomer.org',372,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(368,1,'HARRY','ARCE','HARRY.ARCE@sakilacustomer.org',373,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(369,2,'FRED','WHEAT','FRED.WHEAT@sakilacustomer.org',374,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(370,2,'WAYNE','TRUONG','WAYNE.TRUONG@sakilacustomer.org',375,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(371,1,'BILLY','POULIN','BILLY.POULIN@sakilacustomer.org',376,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(372,2,'STEVE','MACKENZIE','STEVE.MACKENZIE@sakilacustomer.org',377,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(373,1,'LOUIS','LEONE','LOUIS.LEONE@sakilacustomer.org',378,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(374,2,'JEREMY','HURTADO','JEREMY.HURTADO@sakilacustomer.org',379,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(375,2,'AARON','SELBY','AARON.SELBY@sakilacustomer.org',380,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(376,1,'RANDY','GAITHER','RANDY.GAITHER@sakilacustomer.org',381,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(377,1,'HOWARD','FORTNER','HOWARD.FORTNER@sakilacustomer.org',382,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(378,1,'EUGENE','CULPEPPER','EUGENE.CULPEPPER@sakilacustomer.org',383,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(379,1,'CARLOS','COUGHLIN','CARLOS.COUGHLIN@sakilacustomer.org',384,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(380,1,'RUSSELL','BRINSON','RUSSELL.BRINSON@sakilacustomer.org',385,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(381,2,'BOBBY','BOUDREAU','BOBBY.BOUDREAU@sakilacustomer.org',386,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(382,2,'VICTOR','BARKLEY','VICTOR.BARKLEY@sakilacustomer.org',387,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(383,1,'MARTIN','BALES','MARTIN.BALES@sakilacustomer.org',388,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(384,2,'ERNEST','STEPP','ERNEST.STEPP@sakilacustomer.org',389,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(385,1,'PHILLIP','HOLM','PHILLIP.HOLM@sakilacustomer.org',390,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(386,1,'TODD','TAN','TODD.TAN@sakilacustomer.org',391,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(387,2,'JESSE','SCHILLING','JESSE.SCHILLING@sakilacustomer.org',392,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(388,2,'CRAIG','MORRELL','CRAIG.MORRELL@sakilacustomer.org',393,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(389,1,'ALAN','KAHN','ALAN.KAHN@sakilacustomer.org',394,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(390,1,'SHAWN','HEATON','SHAWN.HEATON@sakilacustomer.org',395,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(391,1,'CLARENCE','GAMEZ','CLARENCE.GAMEZ@sakilacustomer.org',396,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(392,2,'SEAN','DOUGLASS','SEAN.DOUGLASS@sakilacustomer.org',397,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(393,1,'PHILIP','CAUSEY','PHILIP.CAUSEY@sakilacustomer.org',398,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(394,2,'CHRIS','BROTHERS','CHRIS.BROTHERS@sakilacustomer.org',399,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(395,2,'JOHNNY','TURPIN','JOHNNY.TURPIN@sakilacustomer.org',400,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(396,1,'EARL','SHANKS','EARL.SHANKS@sakilacustomer.org',401,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(397,1,'JIMMY','SCHRADER','JIMMY.SCHRADER@sakilacustomer.org',402,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(398,1,'ANTONIO','MEEK','ANTONIO.MEEK@sakilacustomer.org',403,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(399,1,'DANNY','ISOM','DANNY.ISOM@sakilacustomer.org',404,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(400,2,'BRYAN','HARDISON','BRYAN.HARDISON@sakilacustomer.org',405,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(401,2,'TONY','CARRANZA','TONY.CARRANZA@sakilacustomer.org',406,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(402,1,'LUIS','YANEZ','LUIS.YANEZ@sakilacustomer.org',407,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(403,1,'MIKE','WAY','MIKE.WAY@sakilacustomer.org',408,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(404,2,'STANLEY','SCROGGINS','STANLEY.SCROGGINS@sakilacustomer.org',409,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(405,1,'LEONARD','SCHOFIELD','LEONARD.SCHOFIELD@sakilacustomer.org',410,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(406,1,'NATHAN','RUNYON','NATHAN.RUNYON@sakilacustomer.org',411,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(407,1,'DALE','RATCLIFF','DALE.RATCLIFF@sakilacustomer.org',412,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(408,1,'MANUEL','MURRELL','MANUEL.MURRELL@sakilacustomer.org',413,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(409,2,'RODNEY','MOELLER','RODNEY.MOELLER@sakilacustomer.org',414,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(410,2,'CURTIS','IRBY','CURTIS.IRBY@sakilacustomer.org',415,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(411,1,'NORMAN','CURRIER','NORMAN.CURRIER@sakilacustomer.org',416,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(412,2,'ALLEN','BUTTERFIELD','ALLEN.BUTTERFIELD@sakilacustomer.org',417,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(413,2,'MARVIN','YEE','MARVIN.YEE@sakilacustomer.org',418,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(414,1,'VINCENT','RALSTON','VINCENT.RALSTON@sakilacustomer.org',419,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(415,1,'GLENN','PULLEN','GLENN.PULLEN@sakilacustomer.org',420,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(416,2,'JEFFERY','PINSON','JEFFERY.PINSON@sakilacustomer.org',421,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(417,1,'TRAVIS','ESTEP','TRAVIS.ESTEP@sakilacustomer.org',422,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(418,2,'JEFF','EAST','JEFF.EAST@sakilacustomer.org',423,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(419,1,'CHAD','CARBONE','CHAD.CARBONE@sakilacustomer.org',424,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(420,1,'JACOB','LANCE','JACOB.LANCE@sakilacustomer.org',425,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(421,1,'LEE','HAWKS','LEE.HAWKS@sakilacustomer.org',426,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(422,1,'MELVIN','ELLINGTON','MELVIN.ELLINGTON@sakilacustomer.org',427,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(423,2,'ALFRED','CASILLAS','ALFRED.CASILLAS@sakilacustomer.org',428,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(424,2,'KYLE','SPURLOCK','KYLE.SPURLOCK@sakilacustomer.org',429,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(425,2,'FRANCIS','SIKES','FRANCIS.SIKES@sakilacustomer.org',430,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(426,1,'BRADLEY','MOTLEY','BRADLEY.MOTLEY@sakilacustomer.org',431,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(427,2,'JESUS','MCCARTNEY','JESUS.MCCARTNEY@sakilacustomer.org',432,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(428,2,'HERBERT','KRUGER','HERBERT.KRUGER@sakilacustomer.org',433,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(429,2,'FREDERICK','ISBELL','FREDERICK.ISBELL@sakilacustomer.org',434,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(430,1,'RAY','HOULE','RAY.HOULE@sakilacustomer.org',435,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(431,2,'JOEL','FRANCISCO','JOEL.FRANCISCO@sakilacustomer.org',436,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(432,1,'EDWIN','BURK','EDWIN.BURK@sakilacustomer.org',437,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(433,1,'DON','BONE','DON.BONE@sakilacustomer.org',438,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(434,1,'EDDIE','TOMLIN','EDDIE.TOMLIN@sakilacustomer.org',439,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(435,2,'RICKY','SHELBY','RICKY.SHELBY@sakilacustomer.org',440,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(436,1,'TROY','QUIGLEY','TROY.QUIGLEY@sakilacustomer.org',441,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(437,2,'RANDALL','NEUMANN','RANDALL.NEUMANN@sakilacustomer.org',442,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(438,1,'BARRY','LOVELACE','BARRY.LOVELACE@sakilacustomer.org',443,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(439,2,'ALEXANDER','FENNELL','ALEXANDER.FENNELL@sakilacustomer.org',444,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(440,1,'BERNARD','COLBY','BERNARD.COLBY@sakilacustomer.org',445,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(441,1,'MARIO','CHEATHAM','MARIO.CHEATHAM@sakilacustomer.org',446,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(442,1,'LEROY','BUSTAMANTE','LEROY.BUSTAMANTE@sakilacustomer.org',447,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(443,2,'FRANCISCO','SKIDMORE','FRANCISCO.SKIDMORE@sakilacustomer.org',448,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(444,2,'MARCUS','HIDALGO','MARCUS.HIDALGO@sakilacustomer.org',449,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(445,1,'MICHEAL','FORMAN','MICHEAL.FORMAN@sakilacustomer.org',450,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(446,2,'THEODORE','CULP','THEODORE.CULP@sakilacustomer.org',451,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(447,1,'CLIFFORD','BOWENS','CLIFFORD.BOWENS@sakilacustomer.org',452,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(448,1,'MIGUEL','BETANCOURT','MIGUEL.BETANCOURT@sakilacustomer.org',453,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(449,2,'OSCAR','AQUINO','OSCAR.AQUINO@sakilacustomer.org',454,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(450,1,'JAY','ROBB','JAY.ROBB@sakilacustomer.org',455,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(451,1,'JIM','REA','JIM.REA@sakilacustomer.org',456,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(452,1,'TOM','MILNER','TOM.MILNER@sakilacustomer.org',457,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(453,1,'CALVIN','MARTEL','CALVIN.MARTEL@sakilacustomer.org',458,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(454,2,'ALEX','GRESHAM','ALEX.GRESHAM@sakilacustomer.org',459,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(455,2,'JON','WILES','JON.WILES@sakilacustomer.org',460,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(456,2,'RONNIE','RICKETTS','RONNIE.RICKETTS@sakilacustomer.org',461,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(457,2,'BILL','GAVIN','BILL.GAVIN@sakilacustomer.org',462,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(458,1,'LLOYD','DOWD','LLOYD.DOWD@sakilacustomer.org',463,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(459,1,'TOMMY','COLLAZO','TOMMY.COLLAZO@sakilacustomer.org',464,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(460,1,'LEON','BOSTIC','LEON.BOSTIC@sakilacustomer.org',465,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(461,1,'DEREK','BLAKELY','DEREK.BLAKELY@sakilacustomer.org',466,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(462,2,'WARREN','SHERROD','WARREN.SHERROD@sakilacustomer.org',467,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(463,2,'DARRELL','POWER','DARRELL.POWER@sakilacustomer.org',468,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(464,1,'JEROME','KENYON','JEROME.KENYON@sakilacustomer.org',469,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(465,1,'FLOYD','GANDY','FLOYD.GANDY@sakilacustomer.org',470,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(466,1,'LEO','EBERT','LEO.EBERT@sakilacustomer.org',471,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(467,2,'ALVIN','DELOACH','ALVIN.DELOACH@sakilacustomer.org',472,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(468,1,'TIM','CARY','TIM.CARY@sakilacustomer.org',473,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(469,2,'WESLEY','BULL','WESLEY.BULL@sakilacustomer.org',474,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(470,1,'GORDON','ALLARD','GORDON.ALLARD@sakilacustomer.org',475,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(471,1,'DEAN','SAUER','DEAN.SAUER@sakilacustomer.org',476,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(472,1,'GREG','ROBINS','GREG.ROBINS@sakilacustomer.org',477,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(473,2,'JORGE','OLIVARES','JORGE.OLIVARES@sakilacustomer.org',478,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(474,2,'DUSTIN','GILLETTE','DUSTIN.GILLETTE@sakilacustomer.org',479,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(475,2,'PEDRO','CHESTNUT','PEDRO.CHESTNUT@sakilacustomer.org',480,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(476,1,'DERRICK','BOURQUE','DERRICK.BOURQUE@sakilacustomer.org',481,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(477,1,'DAN','PAINE','DAN.PAINE@sakilacustomer.org',482,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(478,1,'LEWIS','LYMAN','LEWIS.LYMAN@sakilacustomer.org',483,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(479,1,'ZACHARY','HITE','ZACHARY.HITE@sakilacustomer.org',484,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(480,1,'COREY','HAUSER','COREY.HAUSER@sakilacustomer.org',485,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(481,1,'HERMAN','DEVORE','HERMAN.DEVORE@sakilacustomer.org',486,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(482,1,'MAURICE','CRAWLEY','MAURICE.CRAWLEY@sakilacustomer.org',487,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(483,2,'VERNON','CHAPA','VERNON.CHAPA@sakilacustomer.org',488,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(484,1,'ROBERTO','VU','ROBERTO.VU@sakilacustomer.org',489,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(485,1,'CLYDE','TOBIAS','CLYDE.TOBIAS@sakilacustomer.org',490,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(486,1,'GLEN','TALBERT','GLEN.TALBERT@sakilacustomer.org',491,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(487,2,'HECTOR','POINDEXTER','HECTOR.POINDEXTER@sakilacustomer.org',492,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(488,2,'SHANE','MILLARD','SHANE.MILLARD@sakilacustomer.org',493,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(489,1,'RICARDO','MEADOR','RICARDO.MEADOR@sakilacustomer.org',494,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(490,1,'SAM','MCDUFFIE','SAM.MCDUFFIE@sakilacustomer.org',495,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(491,2,'RICK','MATTOX','RICK.MATTOX@sakilacustomer.org',496,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(492,2,'LESTER','KRAUS','LESTER.KRAUS@sakilacustomer.org',497,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(493,1,'BRENT','HARKINS','BRENT.HARKINS@sakilacustomer.org',498,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(494,2,'RAMON','CHOATE','RAMON.CHOATE@sakilacustomer.org',499,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(495,2,'CHARLIE','BESS','CHARLIE.BESS@sakilacustomer.org',500,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(496,2,'TYLER','WREN','TYLER.WREN@sakilacustomer.org',501,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(497,2,'GILBERT','SLEDGE','GILBERT.SLEDGE@sakilacustomer.org',502,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(498,1,'GENE','SANBORN','GENE.SANBORN@sakilacustomer.org',503,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(499,2,'MARC','OUTLAW','MARC.OUTLAW@sakilacustomer.org',504,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(500,1,'REGINALD','KINDER','REGINALD.KINDER@sakilacustomer.org',505,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(501,1,'RUBEN','GEARY','RUBEN.GEARY@sakilacustomer.org',506,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(502,1,'BRETT','CORNWELL','BRETT.CORNWELL@sakilacustomer.org',507,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(503,1,'ANGEL','BARCLAY','ANGEL.BARCLAY@sakilacustomer.org',508,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(504,1,'NATHANIEL','ADAM','NATHANIEL.ADAM@sakilacustomer.org',509,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(505,1,'RAFAEL','ABNEY','RAFAEL.ABNEY@sakilacustomer.org',510,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(506,2,'LESLIE','SEWARD','LESLIE.SEWARD@sakilacustomer.org',511,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(507,2,'EDGAR','RHOADS','EDGAR.RHOADS@sakilacustomer.org',512,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(508,2,'MILTON','HOWLAND','MILTON.HOWLAND@sakilacustomer.org',513,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(509,1,'RAUL','FORTIER','RAUL.FORTIER@sakilacustomer.org',514,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(510,2,'BEN','EASTER','BEN.EASTER@sakilacustomer.org',515,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(511,1,'CHESTER','BENNER','CHESTER.BENNER@sakilacustomer.org',516,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(512,1,'CECIL','VINES','CECIL.VINES@sakilacustomer.org',517,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(513,2,'DUANE','TUBBS','DUANE.TUBBS@sakilacustomer.org',519,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(514,2,'FRANKLIN','TROUTMAN','FRANKLIN.TROUTMAN@sakilacustomer.org',520,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(515,1,'ANDRE','RAPP','ANDRE.RAPP@sakilacustomer.org',521,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(516,2,'ELMER','NOE','ELMER.NOE@sakilacustomer.org',522,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(517,2,'BRAD','MCCURDY','BRAD.MCCURDY@sakilacustomer.org',523,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(518,1,'GABRIEL','HARDER','GABRIEL.HARDER@sakilacustomer.org',524,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(519,2,'RON','DELUCA','RON.DELUCA@sakilacustomer.org',525,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(520,2,'MITCHELL','WESTMORELAND','MITCHELL.WESTMORELAND@sakilacustomer.org',526,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(521,2,'ROLAND','SOUTH','ROLAND.SOUTH@sakilacustomer.org',527,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(522,2,'ARNOLD','HAVENS','ARNOLD.HAVENS@sakilacustomer.org',528,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(523,1,'HARVEY','GUAJARDO','HARVEY.GUAJARDO@sakilacustomer.org',529,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(524,1,'JARED','ELY','JARED.ELY@sakilacustomer.org',530,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(525,2,'ADRIAN','CLARY','ADRIAN.CLARY@sakilacustomer.org',531,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(526,2,'KARL','SEAL','KARL.SEAL@sakilacustomer.org',532,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(527,1,'CORY','MEEHAN','CORY.MEEHAN@sakilacustomer.org',533,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(528,1,'CLAUDE','HERZOG','CLAUDE.HERZOG@sakilacustomer.org',534,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(529,2,'ERIK','GUILLEN','ERIK.GUILLEN@sakilacustomer.org',535,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(530,2,'DARRYL','ASHCRAFT','DARRYL.ASHCRAFT@sakilacustomer.org',536,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(531,2,'JAMIE','WAUGH','JAMIE.WAUGH@sakilacustomer.org',537,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(532,2,'NEIL','RENNER','NEIL.RENNER@sakilacustomer.org',538,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(533,1,'JESSIE','MILAM','JESSIE.MILAM@sakilacustomer.org',539,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(534,1,'CHRISTIAN','JUNG','CHRISTIAN.JUNG@sakilacustomer.org',540,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(535,1,'JAVIER','ELROD','JAVIER.ELROD@sakilacustomer.org',541,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(536,2,'FERNANDO','CHURCHILL','FERNANDO.CHURCHILL@sakilacustomer.org',542,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(537,2,'CLINTON','BUFORD','CLINTON.BUFORD@sakilacustomer.org',543,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(538,2,'TED','BREAUX','TED.BREAUX@sakilacustomer.org',544,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(539,1,'MATHEW','BOLIN','MATHEW.BOLIN@sakilacustomer.org',545,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(540,1,'TYRONE','ASHER','TYRONE.ASHER@sakilacustomer.org',546,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(541,2,'DARREN','WINDHAM','DARREN.WINDHAM@sakilacustomer.org',547,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(542,2,'LONNIE','TIRADO','LONNIE.TIRADO@sakilacustomer.org',548,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(543,1,'LANCE','PEMBERTON','LANCE.PEMBERTON@sakilacustomer.org',549,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(544,2,'CODY','NOLEN','CODY.NOLEN@sakilacustomer.org',550,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(545,2,'JULIO','NOLAND','JULIO.NOLAND@sakilacustomer.org',551,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(546,1,'KELLY','KNOTT','KELLY.KNOTT@sakilacustomer.org',552,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(547,1,'KURT','EMMONS','KURT.EMMONS@sakilacustomer.org',553,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(548,1,'ALLAN','CORNISH','ALLAN.CORNISH@sakilacustomer.org',554,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(549,1,'NELSON','CHRISTENSON','NELSON.CHRISTENSON@sakilacustomer.org',555,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(550,2,'GUY','BROWNLEE','GUY.BROWNLEE@sakilacustomer.org',556,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(551,2,'CLAYTON','BARBEE','CLAYTON.BARBEE@sakilacustomer.org',557,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(552,2,'HUGH','WALDROP','HUGH.WALDROP@sakilacustomer.org',558,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(553,1,'MAX','PITT','MAX.PITT@sakilacustomer.org',559,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(554,1,'DWAYNE','OLVERA','DWAYNE.OLVERA@sakilacustomer.org',560,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(555,1,'DWIGHT','LOMBARDI','DWIGHT.LOMBARDI@sakilacustomer.org',561,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(556,2,'ARMANDO','GRUBER','ARMANDO.GRUBER@sakilacustomer.org',562,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(557,1,'FELIX','GAFFNEY','FELIX.GAFFNEY@sakilacustomer.org',563,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(558,1,'JIMMIE','EGGLESTON','JIMMIE.EGGLESTON@sakilacustomer.org',564,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(559,2,'EVERETT','BANDA','EVERETT.BANDA@sakilacustomer.org',565,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(560,1,'JORDAN','ARCHULETA','JORDAN.ARCHULETA@sakilacustomer.org',566,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(561,2,'IAN','STILL','IAN.STILL@sakilacustomer.org',567,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(562,1,'WALLACE','SLONE','WALLACE.SLONE@sakilacustomer.org',568,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(563,2,'KEN','PREWITT','KEN.PREWITT@sakilacustomer.org',569,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(564,2,'BOB','PFEIFFER','BOB.PFEIFFER@sakilacustomer.org',570,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(565,2,'JAIME','NETTLES','JAIME.NETTLES@sakilacustomer.org',571,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(566,1,'CASEY','MENA','CASEY.MENA@sakilacustomer.org',572,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(567,2,'ALFREDO','MCADAMS','ALFREDO.MCADAMS@sakilacustomer.org',573,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(568,2,'ALBERTO','HENNING','ALBERTO.HENNING@sakilacustomer.org',574,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(569,2,'DAVE','GARDINER','DAVE.GARDINER@sakilacustomer.org',575,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(570,2,'IVAN','CROMWELL','IVAN.CROMWELL@sakilacustomer.org',576,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(571,2,'JOHNNIE','CHISHOLM','JOHNNIE.CHISHOLM@sakilacustomer.org',577,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(572,1,'SIDNEY','BURLESON','SIDNEY.BURLESON@sakilacustomer.org',578,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(573,1,'BYRON','BOX','BYRON.BOX@sakilacustomer.org',579,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(574,2,'JULIAN','VEST','JULIAN.VEST@sakilacustomer.org',580,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(575,2,'ISAAC','OGLESBY','ISAAC.OGLESBY@sakilacustomer.org',581,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(576,2,'MORRIS','MCCARTER','MORRIS.MCCARTER@sakilacustomer.org',582,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(577,2,'CLIFTON','MALCOLM','CLIFTON.MALCOLM@sakilacustomer.org',583,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(578,2,'WILLARD','LUMPKIN','WILLARD.LUMPKIN@sakilacustomer.org',584,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(579,2,'DARYL','LARUE','DARYL.LARUE@sakilacustomer.org',585,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(580,1,'ROSS','GREY','ROSS.GREY@sakilacustomer.org',586,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(581,1,'VIRGIL','WOFFORD','VIRGIL.WOFFORD@sakilacustomer.org',587,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(582,2,'ANDY','VANHORN','ANDY.VANHORN@sakilacustomer.org',588,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(583,1,'MARSHALL','THORN','MARSHALL.THORN@sakilacustomer.org',589,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(584,2,'SALVADOR','TEEL','SALVADOR.TEEL@sakilacustomer.org',590,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(585,1,'PERRY','SWAFFORD','PERRY.SWAFFORD@sakilacustomer.org',591,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(586,1,'KIRK','STCLAIR','KIRK.STCLAIR@sakilacustomer.org',592,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(587,1,'SERGIO','STANFIELD','SERGIO.STANFIELD@sakilacustomer.org',593,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(588,1,'MARION','OCAMPO','MARION.OCAMPO@sakilacustomer.org',594,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(589,1,'TRACY','HERRMANN','TRACY.HERRMANN@sakilacustomer.org',595,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(590,2,'SETH','HANNON','SETH.HANNON@sakilacustomer.org',596,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(591,1,'KENT','ARSENAULT','KENT.ARSENAULT@sakilacustomer.org',597,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(592,1,'TERRANCE','ROUSH','TERRANCE.ROUSH@sakilacustomer.org',598,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(593,2,'RENE','MCALISTER','RENE.MCALISTER@sakilacustomer.org',599,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(594,1,'EDUARDO','HIATT','EDUARDO.HIATT@sakilacustomer.org',600,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(595,1,'TERRENCE','GUNDERSON','TERRENCE.GUNDERSON@sakilacustomer.org',601,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(596,1,'ENRIQUE','FORSYTHE','ENRIQUE.FORSYTHE@sakilacustomer.org',602,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(597,1,'FREDDIE','DUGGAN','FREDDIE.DUGGAN@sakilacustomer.org',603,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(598,1,'WADE','DELVALLE','WADE.DELVALLE@sakilacustomer.org',604,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(599,2,'AUSTIN','CINTRON','AUSTIN.CINTRON@sakilacustomer.org',605,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'); -COMMIT; - --- --- Trigger to enforce create dates on INSERT --- - -CREATE TRIGGER customer_create_date BEFORE INSERT ON customer FOR EACH ROW SET NEW.create_date = NOW(); - --- --- Dumping data for table film --- - -SET AUTOCOMMIT=0; -INSERT INTO film VALUES (1,'ACADEMY DINOSAUR','A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies',2006,1,NULL,6,'0.99',86,'20.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(2,'ACE GOLDFINGER','A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China',2006,1,NULL,3,'4.99',48,'12.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(3,'ADAPTATION HOLES','A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory',2006,1,NULL,7,'2.99',50,'18.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(4,'AFFAIR PREJUDICE','A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank',2006,1,NULL,5,'2.99',117,'26.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(5,'AFRICAN EGG','A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico',2006,1,NULL,6,'2.99',130,'22.99','G','Deleted Scenes','2006-02-15 05:03:42'),(6,'AGENT TRUMAN','A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China',2006,1,NULL,3,'2.99',169,'17.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(7,'AIRPLANE SIERRA','A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat',2006,1,NULL,6,'4.99',62,'28.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(8,'AIRPORT POLLOCK','A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India',2006,1,NULL,6,'4.99',54,'15.99','R','Trailers','2006-02-15 05:03:42'),(9,'ALABAMA DEVIL','A Thoughtful Panorama of a Database Administrator And a Mad Scientist who must Outgun a Mad Scientist in A Jet Boat',2006,1,NULL,3,'2.99',114,'21.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(10,'ALADDIN CALENDAR','A Action-Packed Tale of a Man And a Lumberjack who must Reach a Feminist in Ancient China',2006,1,NULL,6,'4.99',63,'24.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(11,'ALAMO VIDEOTAPE','A Boring Epistle of a Butler And a Cat who must Fight a Pastry Chef in A MySQL Convention',2006,1,NULL,6,'0.99',126,'16.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(12,'ALASKA PHANTOM','A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia',2006,1,NULL,6,'0.99',136,'22.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(13,'ALI FOREVER','A Action-Packed Drama of a Dentist And a Crocodile who must Battle a Feminist in The Canadian Rockies',2006,1,NULL,4,'4.99',150,'21.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(14,'ALICE FANTASIA','A Emotional Drama of a A Shark And a Database Administrator who must Vanquish a Pioneer in Soviet Georgia',2006,1,NULL,6,'0.99',94,'23.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(15,'ALIEN CENTER','A Brilliant Drama of a Cat And a Mad Scientist who must Battle a Feminist in A MySQL Convention',2006,1,NULL,5,'2.99',46,'10.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(16,'ALLEY EVOLUTION','A Fast-Paced Drama of a Robot And a Composer who must Battle a Astronaut in New Orleans',2006,1,NULL,6,'2.99',180,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(17,'ALONE TRIP','A Fast-Paced Character Study of a Composer And a Dog who must Outgun a Boat in An Abandoned Fun House',2006,1,NULL,3,'0.99',82,'14.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(18,'ALTER VICTORY','A Thoughtful Drama of a Composer And a Feminist who must Meet a Secret Agent in The Canadian Rockies',2006,1,NULL,6,'0.99',57,'27.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(19,'AMADEUS HOLY','A Emotional Display of a Pioneer And a Technical Writer who must Battle a Man in A Baloon',2006,1,NULL,6,'0.99',113,'20.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(20,'AMELIE HELLFIGHTERS','A Boring Drama of a Woman And a Squirrel who must Conquer a Student in A Baloon',2006,1,NULL,4,'4.99',79,'23.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(21,'AMERICAN CIRCUS','A Insightful Drama of a Girl And a Astronaut who must Face a Database Administrator in A Shark Tank',2006,1,NULL,3,'4.99',129,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(22,'AMISTAD MIDSUMMER','A Emotional Character Study of a Dentist And a Crocodile who must Meet a Sumo Wrestler in California',2006,1,NULL,6,'2.99',85,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(23,'ANACONDA CONFESSIONS','A Lacklusture Display of a Dentist And a Dentist who must Fight a Girl in Australia',2006,1,NULL,3,'0.99',92,'9.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(24,'ANALYZE HOOSIERS','A Thoughtful Display of a Explorer And a Pastry Chef who must Overcome a Feminist in The Sahara Desert',2006,1,NULL,6,'2.99',181,'19.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(25,'ANGELS LIFE','A Thoughtful Display of a Woman And a Astronaut who must Battle a Robot in Berlin',2006,1,NULL,3,'2.99',74,'15.99','G','Trailers','2006-02-15 05:03:42'),(26,'ANNIE IDENTITY','A Amazing Panorama of a Pastry Chef And a Boat who must Escape a Woman in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',86,'15.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(27,'ANONYMOUS HUMAN','A Amazing Reflection of a Database Administrator And a Astronaut who must Outrace a Database Administrator in A Shark Tank',2006,1,NULL,7,'0.99',179,'12.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(28,'ANTHEM LUKE','A Touching Panorama of a Waitress And a Woman who must Outrace a Dog in An Abandoned Amusement Park',2006,1,NULL,5,'4.99',91,'16.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(29,'ANTITRUST TOMATOES','A Fateful Yarn of a Womanizer And a Feminist who must Succumb a Database Administrator in Ancient India',2006,1,NULL,5,'2.99',168,'11.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(30,'ANYTHING SAVANNAH','A Epic Story of a Pastry Chef And a Woman who must Chase a Feminist in An Abandoned Fun House',2006,1,NULL,4,'2.99',82,'27.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(31,'APACHE DIVINE','A Awe-Inspiring Reflection of a Pastry Chef And a Teacher who must Overcome a Sumo Wrestler in A U-Boat',2006,1,NULL,5,'4.99',92,'16.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(32,'APOCALYPSE FLAMINGOS','A Astounding Story of a Dog And a Squirrel who must Defeat a Woman in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',119,'11.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(33,'APOLLO TEEN','A Action-Packed Reflection of a Crocodile And a Explorer who must Find a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,5,'2.99',153,'15.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(34,'ARABIA DOGMA','A Touching Epistle of a Madman And a Mad Cow who must Defeat a Student in Nigeria',2006,1,NULL,6,'0.99',62,'29.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(35,'ARACHNOPHOBIA ROLLERCOASTER','A Action-Packed Reflection of a Pastry Chef And a Composer who must Discover a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'2.99',147,'24.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(36,'ARGONAUTS TOWN','A Emotional Epistle of a Forensic Psychologist And a Butler who must Challenge a Waitress in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',127,'12.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(37,'ARIZONA BANG','A Brilliant Panorama of a Mad Scientist And a Mad Cow who must Meet a Pioneer in A Monastery',2006,1,NULL,3,'2.99',121,'28.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(38,'ARK RIDGEMONT','A Beautiful Yarn of a Pioneer And a Monkey who must Pursue a Explorer in The Sahara Desert',2006,1,NULL,6,'0.99',68,'25.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(39,'ARMAGEDDON LOST','A Fast-Paced Tale of a Boat And a Teacher who must Succumb a Composer in An Abandoned Mine Shaft',2006,1,NULL,5,'0.99',99,'10.99','G','Trailers','2006-02-15 05:03:42'),(40,'ARMY FLINTSTONES','A Boring Saga of a Database Administrator And a Womanizer who must Battle a Waitress in Nigeria',2006,1,NULL,4,'0.99',148,'22.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(41,'ARSENIC INDEPENDENCE','A Fanciful Documentary of a Mad Cow And a Womanizer who must Find a Dentist in Berlin',2006,1,NULL,4,'0.99',137,'17.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(42,'ARTIST COLDBLOODED','A Stunning Reflection of a Robot And a Moose who must Challenge a Woman in California',2006,1,NULL,5,'2.99',170,'10.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(43,'ATLANTIS CAUSE','A Thrilling Yarn of a Feminist And a Hunter who must Fight a Technical Writer in A Shark Tank',2006,1,NULL,6,'2.99',170,'15.99','G','Behind the Scenes','2006-02-15 05:03:42'),(44,'ATTACKS HATE','A Fast-Paced Panorama of a Technical Writer And a Mad Scientist who must Find a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',113,'21.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(45,'ATTRACTION NEWTON','A Astounding Panorama of a Composer And a Frisbee who must Reach a Husband in Ancient Japan',2006,1,NULL,5,'4.99',83,'14.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(46,'AUTUMN CROW','A Beautiful Tale of a Dentist And a Mad Cow who must Battle a Moose in The Sahara Desert',2006,1,NULL,3,'4.99',108,'13.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(47,'BABY HALL','A Boring Character Study of a A Shark And a Girl who must Outrace a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',153,'23.99','NC-17','Commentaries','2006-02-15 05:03:42'),(48,'BACKLASH UNDEFEATED','A Stunning Character Study of a Mad Scientist And a Mad Cow who must Kill a Car in A Monastery',2006,1,NULL,3,'4.99',118,'24.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(49,'BADMAN DAWN','A Emotional Panorama of a Pioneer And a Composer who must Escape a Mad Scientist in A Jet Boat',2006,1,NULL,6,'2.99',162,'22.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(50,'BAKED CLEOPATRA','A Stunning Drama of a Forensic Psychologist And a Husband who must Overcome a Waitress in A Monastery',2006,1,NULL,3,'2.99',182,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(51,'BALLOON HOMEWARD','A Insightful Panorama of a Forensic Psychologist And a Mad Cow who must Build a Mad Scientist in The First Manned Space Station',2006,1,NULL,5,'2.99',75,'10.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(52,'BALLROOM MOCKINGBIRD','A Thrilling Documentary of a Composer And a Monkey who must Find a Feminist in California',2006,1,NULL,6,'0.99',173,'29.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(53,'BANG KWAI','A Epic Drama of a Madman And a Cat who must Face a A Shark in An Abandoned Amusement Park',2006,1,NULL,5,'2.99',87,'25.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(54,'BANGER PINOCCHIO','A Awe-Inspiring Drama of a Car And a Pastry Chef who must Chase a Crocodile in The First Manned Space Station',2006,1,NULL,5,'0.99',113,'15.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(55,'BARBARELLA STREETCAR','A Awe-Inspiring Story of a Feminist And a Cat who must Conquer a Dog in A Monastery',2006,1,NULL,6,'2.99',65,'27.99','G','Behind the Scenes','2006-02-15 05:03:42'),(56,'BAREFOOT MANCHURIAN','A Intrepid Story of a Cat And a Student who must Vanquish a Girl in An Abandoned Amusement Park',2006,1,NULL,6,'2.99',129,'15.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(57,'BASIC EASY','A Stunning Epistle of a Man And a Husband who must Reach a Mad Scientist in A Jet Boat',2006,1,NULL,4,'2.99',90,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(58,'BEACH HEARTBREAKERS','A Fateful Display of a Womanizer And a Mad Scientist who must Outgun a A Shark in Soviet Georgia',2006,1,NULL,6,'2.99',122,'16.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(59,'BEAR GRACELAND','A Astounding Saga of a Dog And a Boy who must Kill a Teacher in The First Manned Space Station',2006,1,NULL,4,'2.99',160,'20.99','R','Deleted Scenes','2006-02-15 05:03:42'),(60,'BEAST HUNCHBACK','A Awe-Inspiring Epistle of a Student And a Squirrel who must Defeat a Boy in Ancient China',2006,1,NULL,3,'4.99',89,'22.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(61,'BEAUTY GREASE','A Fast-Paced Display of a Composer And a Moose who must Sink a Robot in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',175,'28.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(62,'BED HIGHBALL','A Astounding Panorama of a Lumberjack And a Dog who must Redeem a Woman in An Abandoned Fun House',2006,1,NULL,5,'2.99',106,'23.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(63,'BEDAZZLED MARRIED','A Astounding Character Study of a Madman And a Robot who must Meet a Mad Scientist in An Abandoned Fun House',2006,1,NULL,6,'0.99',73,'21.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(64,'BEETHOVEN EXORCIST','A Epic Display of a Pioneer And a Student who must Challenge a Butler in The Gulf of Mexico',2006,1,NULL,6,'0.99',151,'26.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(65,'BEHAVIOR RUNAWAY','A Unbelieveable Drama of a Student And a Husband who must Outrace a Sumo Wrestler in Berlin',2006,1,NULL,3,'4.99',100,'20.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(66,'BENEATH RUSH','A Astounding Panorama of a Man And a Monkey who must Discover a Man in The First Manned Space Station',2006,1,NULL,6,'0.99',53,'27.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(67,'BERETS AGENT','A Taut Saga of a Crocodile And a Boy who must Overcome a Technical Writer in Ancient China',2006,1,NULL,5,'2.99',77,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(68,'BETRAYED REAR','A Emotional Character Study of a Boat And a Pioneer who must Find a Explorer in A Shark Tank',2006,1,NULL,5,'4.99',122,'26.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(69,'BEVERLY OUTLAW','A Fanciful Documentary of a Womanizer And a Boat who must Defeat a Madman in The First Manned Space Station',2006,1,NULL,3,'2.99',85,'21.99','R','Trailers','2006-02-15 05:03:42'),(70,'BIKINI BORROWERS','A Astounding Drama of a Astronaut And a Cat who must Discover a Woman in The First Manned Space Station',2006,1,NULL,7,'4.99',142,'26.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(71,'BILKO ANONYMOUS','A Emotional Reflection of a Teacher And a Man who must Meet a Cat in The First Manned Space Station',2006,1,NULL,3,'4.99',100,'25.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(72,'BILL OTHERS','A Stunning Saga of a Mad Scientist And a Forensic Psychologist who must Challenge a Squirrel in A MySQL Convention',2006,1,NULL,6,'2.99',93,'12.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(73,'BINGO TALENTED','A Touching Tale of a Girl And a Crocodile who must Discover a Waitress in Nigeria',2006,1,NULL,5,'2.99',150,'22.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(74,'BIRCH ANTITRUST','A Fanciful Panorama of a Husband And a Pioneer who must Outgun a Dog in A Baloon',2006,1,NULL,4,'4.99',162,'18.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(75,'BIRD INDEPENDENCE','A Thrilling Documentary of a Car And a Student who must Sink a Hunter in The Canadian Rockies',2006,1,NULL,6,'4.99',163,'14.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(76,'BIRDCAGE CASPER','A Fast-Paced Saga of a Frisbee And a Astronaut who must Overcome a Feminist in Ancient India',2006,1,NULL,4,'0.99',103,'23.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(77,'BIRDS PERDITION','A Boring Story of a Womanizer And a Pioneer who must Face a Dog in California',2006,1,NULL,5,'4.99',61,'15.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(78,'BLACKOUT PRIVATE','A Intrepid Yarn of a Pastry Chef And a Mad Scientist who must Challenge a Secret Agent in Ancient Japan',2006,1,NULL,7,'2.99',85,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(79,'BLADE POLISH','A Thoughtful Character Study of a Frisbee And a Pastry Chef who must Fight a Dentist in The First Manned Space Station',2006,1,NULL,5,'0.99',114,'10.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(80,'BLANKET BEVERLY','A Emotional Documentary of a Student And a Girl who must Build a Boat in Nigeria',2006,1,NULL,7,'2.99',148,'21.99','G','Trailers','2006-02-15 05:03:42'),(81,'BLINDNESS GUN','A Touching Drama of a Robot And a Dentist who must Meet a Hunter in A Jet Boat',2006,1,NULL,6,'4.99',103,'29.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(82,'BLOOD ARGONAUTS','A Boring Drama of a Explorer And a Man who must Kill a Lumberjack in A Manhattan Penthouse',2006,1,NULL,3,'0.99',71,'13.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(83,'BLUES INSTINCT','A Insightful Documentary of a Boat And a Composer who must Meet a Forensic Psychologist in An Abandoned Fun House',2006,1,NULL,5,'2.99',50,'18.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(84,'BOILED DARES','A Awe-Inspiring Story of a Waitress And a Dog who must Discover a Dentist in Ancient Japan',2006,1,NULL,7,'4.99',102,'13.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(85,'BONNIE HOLOCAUST','A Fast-Paced Story of a Crocodile And a Robot who must Find a Moose in Ancient Japan',2006,1,NULL,4,'0.99',63,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(86,'BOOGIE AMELIE','A Lacklusture Character Study of a Husband And a Sumo Wrestler who must Succumb a Technical Writer in The Gulf of Mexico',2006,1,NULL,6,'4.99',121,'11.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(87,'BOONDOCK BALLROOM','A Fateful Panorama of a Crocodile And a Boy who must Defeat a Monkey in The Gulf of Mexico',2006,1,NULL,7,'0.99',76,'14.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(88,'BORN SPINAL','A Touching Epistle of a Frisbee And a Husband who must Pursue a Student in Nigeria',2006,1,NULL,7,'4.99',179,'17.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(89,'BORROWERS BEDAZZLED','A Brilliant Epistle of a Teacher And a Sumo Wrestler who must Defeat a Man in An Abandoned Fun House',2006,1,NULL,7,'0.99',63,'22.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(90,'BOULEVARD MOB','A Fateful Epistle of a Moose And a Monkey who must Confront a Lumberjack in Ancient China',2006,1,NULL,3,'0.99',63,'11.99','R','Trailers','2006-02-15 05:03:42'),(91,'BOUND CHEAPER','A Thrilling Panorama of a Database Administrator And a Astronaut who must Challenge a Lumberjack in A Baloon',2006,1,NULL,5,'0.99',98,'17.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(92,'BOWFINGER GABLES','A Fast-Paced Yarn of a Waitress And a Composer who must Outgun a Dentist in California',2006,1,NULL,7,'4.99',72,'19.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(93,'BRANNIGAN SUNRISE','A Amazing Epistle of a Moose And a Crocodile who must Outrace a Dog in Berlin',2006,1,NULL,4,'4.99',121,'27.99','PG','Trailers','2006-02-15 05:03:42'),(94,'BRAVEHEART HUMAN','A Insightful Story of a Dog And a Pastry Chef who must Battle a Girl in Berlin',2006,1,NULL,7,'2.99',176,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(95,'BREAKFAST GOLDFINGER','A Beautiful Reflection of a Student And a Student who must Fight a Moose in Berlin',2006,1,NULL,5,'4.99',123,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(96,'BREAKING HOME','A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',169,'21.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(97,'BRIDE INTRIGUE','A Epic Tale of a Robot And a Monkey who must Vanquish a Man in New Orleans',2006,1,NULL,7,'0.99',56,'24.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(98,'BRIGHT ENCOUNTERS','A Fateful Yarn of a Lumberjack And a Feminist who must Conquer a Student in A Jet Boat',2006,1,NULL,4,'4.99',73,'12.99','PG-13','Trailers','2006-02-15 05:03:42'),(99,'BRINGING HYSTERICAL','A Fateful Saga of a A Shark And a Technical Writer who must Find a Woman in A Jet Boat',2006,1,NULL,7,'2.99',136,'14.99','PG','Trailers','2006-02-15 05:03:42'),(100,'BROOKLYN DESERT','A Beautiful Drama of a Dentist And a Composer who must Battle a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,7,'4.99',161,'21.99','R','Commentaries','2006-02-15 05:03:42'),(101,'BROTHERHOOD BLANKET','A Fateful Character Study of a Butler And a Technical Writer who must Sink a Astronaut in Ancient Japan',2006,1,NULL,3,'0.99',73,'26.99','R','Behind the Scenes','2006-02-15 05:03:42'),(102,'BUBBLE GROSSE','A Awe-Inspiring Panorama of a Crocodile And a Moose who must Confront a Girl in A Baloon',2006,1,NULL,4,'4.99',60,'20.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(103,'BUCKET BROTHERHOOD','A Amazing Display of a Girl And a Womanizer who must Succumb a Lumberjack in A Baloon Factory',2006,1,NULL,7,'4.99',133,'27.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(104,'BUGSY SONG','A Awe-Inspiring Character Study of a Secret Agent And a Boat who must Find a Squirrel in The First Manned Space Station',2006,1,NULL,4,'2.99',119,'17.99','G','Commentaries','2006-02-15 05:03:42'),(105,'BULL SHAWSHANK','A Fanciful Drama of a Moose And a Squirrel who must Conquer a Pioneer in The Canadian Rockies',2006,1,NULL,6,'0.99',125,'21.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(106,'BULWORTH COMMANDMENTS','A Amazing Display of a Mad Cow And a Pioneer who must Redeem a Sumo Wrestler in The Outback',2006,1,NULL,4,'2.99',61,'14.99','G','Trailers','2006-02-15 05:03:42'),(107,'BUNCH MINDS','A Emotional Story of a Feminist And a Feminist who must Escape a Pastry Chef in A MySQL Convention',2006,1,NULL,4,'2.99',63,'13.99','G','Behind the Scenes','2006-02-15 05:03:42'),(108,'BUTCH PANTHER','A Lacklusture Yarn of a Feminist And a Database Administrator who must Face a Hunter in New Orleans',2006,1,NULL,6,'0.99',67,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(109,'BUTTERFLY CHOCOLAT','A Fateful Story of a Girl And a Composer who must Conquer a Husband in A Shark Tank',2006,1,NULL,3,'0.99',89,'17.99','G','Behind the Scenes','2006-02-15 05:03:42'),(110,'CABIN FLASH','A Stunning Epistle of a Boat And a Man who must Challenge a A Shark in A Baloon Factory',2006,1,NULL,4,'0.99',53,'25.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(111,'CADDYSHACK JEDI','A Awe-Inspiring Epistle of a Woman And a Madman who must Fight a Robot in Soviet Georgia',2006,1,NULL,3,'0.99',52,'17.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(112,'CALENDAR GUNFIGHT','A Thrilling Drama of a Frisbee And a Lumberjack who must Sink a Man in Nigeria',2006,1,NULL,4,'4.99',120,'22.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(113,'CALIFORNIA BIRDS','A Thrilling Yarn of a Database Administrator And a Robot who must Battle a Database Administrator in Ancient India',2006,1,NULL,4,'4.99',75,'19.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(114,'CAMELOT VACATION','A Touching Character Study of a Woman And a Waitress who must Battle a Pastry Chef in A MySQL Convention',2006,1,NULL,3,'0.99',61,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(115,'CAMPUS REMEMBER','A Astounding Drama of a Crocodile And a Mad Cow who must Build a Robot in A Jet Boat',2006,1,NULL,5,'2.99',167,'27.99','R','Behind the Scenes','2006-02-15 05:03:42'),(116,'CANDIDATE PERDITION','A Brilliant Epistle of a Composer And a Database Administrator who must Vanquish a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'2.99',70,'10.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(117,'CANDLES GRAPES','A Fanciful Character Study of a Monkey And a Explorer who must Build a Astronaut in An Abandoned Fun House',2006,1,NULL,6,'4.99',135,'15.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(118,'CANYON STOCK','A Thoughtful Reflection of a Waitress And a Feminist who must Escape a Squirrel in A Manhattan Penthouse',2006,1,NULL,7,'0.99',85,'26.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(119,'CAPER MOTIONS','A Fateful Saga of a Moose And a Car who must Pursue a Woman in A MySQL Convention',2006,1,NULL,6,'0.99',176,'22.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(120,'CARIBBEAN LIBERTY','A Fanciful Tale of a Pioneer And a Technical Writer who must Outgun a Pioneer in A Shark Tank',2006,1,NULL,3,'4.99',92,'16.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(121,'CAROL TEXAS','A Astounding Character Study of a Composer And a Student who must Overcome a Composer in A Monastery',2006,1,NULL,4,'2.99',151,'15.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(122,'CARRIE BUNCH','A Amazing Epistle of a Student And a Astronaut who must Discover a Frisbee in The Canadian Rockies',2006,1,NULL,7,'0.99',114,'11.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(123,'CASABLANCA SUPER','A Amazing Panorama of a Crocodile And a Forensic Psychologist who must Pursue a Secret Agent in The First Manned Space Station',2006,1,NULL,6,'4.99',85,'22.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(124,'CASPER DRAGONFLY','A Intrepid Documentary of a Boat And a Crocodile who must Chase a Robot in The Sahara Desert',2006,1,NULL,3,'4.99',163,'16.99','PG-13','Trailers','2006-02-15 05:03:42'),(125,'CASSIDY WYOMING','A Intrepid Drama of a Frisbee And a Hunter who must Kill a Secret Agent in New Orleans',2006,1,NULL,5,'2.99',61,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(126,'CASUALTIES ENCINO','A Insightful Yarn of a A Shark And a Pastry Chef who must Face a Boy in A Monastery',2006,1,NULL,3,'4.99',179,'16.99','G','Trailers','2006-02-15 05:03:42'),(127,'CAT CONEHEADS','A Fast-Paced Panorama of a Girl And a A Shark who must Confront a Boy in Ancient India',2006,1,NULL,5,'4.99',112,'14.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(128,'CATCH AMISTAD','A Boring Reflection of a Lumberjack And a Feminist who must Discover a Woman in Nigeria',2006,1,NULL,7,'0.99',183,'10.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(129,'CAUSE DATE','A Taut Tale of a Explorer And a Pastry Chef who must Conquer a Hunter in A MySQL Convention',2006,1,NULL,3,'2.99',179,'16.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(130,'CELEBRITY HORN','A Amazing Documentary of a Secret Agent And a Astronaut who must Vanquish a Hunter in A Shark Tank',2006,1,NULL,7,'0.99',110,'24.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(131,'CENTER DINOSAUR','A Beautiful Character Study of a Sumo Wrestler And a Dentist who must Find a Dog in California',2006,1,NULL,5,'4.99',152,'12.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(132,'CHAINSAW UPTOWN','A Beautiful Documentary of a Boy And a Robot who must Discover a Squirrel in Australia',2006,1,NULL,6,'0.99',114,'25.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(133,'CHAMBER ITALIAN','A Fateful Reflection of a Moose And a Husband who must Overcome a Monkey in Nigeria',2006,1,NULL,7,'4.99',117,'14.99','NC-17','Trailers','2006-02-15 05:03:42'),(134,'CHAMPION FLATLINERS','A Amazing Story of a Mad Cow And a Dog who must Kill a Husband in A Monastery',2006,1,NULL,4,'4.99',51,'21.99','PG','Trailers','2006-02-15 05:03:42'),(135,'CHANCE RESURRECTION','A Astounding Story of a Forensic Psychologist And a Forensic Psychologist who must Overcome a Moose in Ancient China',2006,1,NULL,3,'2.99',70,'22.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(136,'CHAPLIN LICENSE','A Boring Drama of a Dog And a Forensic Psychologist who must Outrace a Explorer in Ancient India',2006,1,NULL,7,'2.99',146,'26.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(137,'CHARADE DUFFEL','A Action-Packed Display of a Man And a Waitress who must Build a Dog in A MySQL Convention',2006,1,NULL,3,'2.99',66,'21.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(138,'CHARIOTS CONSPIRACY','A Unbelieveable Epistle of a Robot And a Husband who must Chase a Robot in The First Manned Space Station',2006,1,NULL,5,'2.99',71,'29.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(139,'CHASING FIGHT','A Astounding Saga of a Technical Writer And a Butler who must Battle a Butler in A Shark Tank',2006,1,NULL,7,'4.99',114,'21.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(140,'CHEAPER CLYDE','A Emotional Character Study of a Pioneer And a Girl who must Discover a Dog in Ancient Japan',2006,1,NULL,6,'0.99',87,'23.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(141,'CHICAGO NORTH','A Fateful Yarn of a Mad Cow And a Waitress who must Battle a Student in California',2006,1,NULL,6,'4.99',185,'11.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(142,'CHICKEN HELLFIGHTERS','A Emotional Drama of a Dog And a Explorer who must Outrace a Technical Writer in Australia',2006,1,NULL,3,'0.99',122,'24.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(143,'CHILL LUCK','A Lacklusture Epistle of a Boat And a Technical Writer who must Fight a A Shark in The Canadian Rockies',2006,1,NULL,6,'0.99',142,'17.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(144,'CHINATOWN GLADIATOR','A Brilliant Panorama of a Technical Writer And a Lumberjack who must Escape a Butler in Ancient India',2006,1,NULL,7,'4.99',61,'24.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(145,'CHISUM BEHAVIOR','A Epic Documentary of a Sumo Wrestler And a Butler who must Kill a Car in Ancient India',2006,1,NULL,5,'4.99',124,'25.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(146,'CHITTY LOCK','A Boring Epistle of a Boat And a Database Administrator who must Kill a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,6,'2.99',107,'24.99','G','Commentaries','2006-02-15 05:03:42'),(147,'CHOCOLAT HARRY','A Action-Packed Epistle of a Dentist And a Moose who must Meet a Mad Cow in Ancient Japan',2006,1,NULL,5,'0.99',101,'16.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(148,'CHOCOLATE DUCK','A Unbelieveable Story of a Mad Scientist And a Technical Writer who must Discover a Composer in Ancient China',2006,1,NULL,3,'2.99',132,'13.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(149,'CHRISTMAS MOONSHINE','A Action-Packed Epistle of a Feminist And a Astronaut who must Conquer a Boat in A Manhattan Penthouse',2006,1,NULL,7,'0.99',150,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(150,'CIDER DESIRE','A Stunning Character Study of a Composer And a Mad Cow who must Succumb a Cat in Soviet Georgia',2006,1,NULL,7,'2.99',101,'9.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(151,'CINCINATTI WHISPERER','A Brilliant Saga of a Pastry Chef And a Hunter who must Confront a Butler in Berlin',2006,1,NULL,5,'4.99',143,'26.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(152,'CIRCUS YOUTH','A Thoughtful Drama of a Pastry Chef And a Dentist who must Pursue a Girl in A Baloon',2006,1,NULL,5,'2.99',90,'13.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(153,'CITIZEN SHREK','A Fanciful Character Study of a Technical Writer And a Husband who must Redeem a Robot in The Outback',2006,1,NULL,7,'0.99',165,'18.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(154,'CLASH FREDDY','A Amazing Yarn of a Composer And a Squirrel who must Escape a Astronaut in Australia',2006,1,NULL,6,'2.99',81,'12.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(155,'CLEOPATRA DEVIL','A Fanciful Documentary of a Crocodile And a Technical Writer who must Fight a A Shark in A Baloon',2006,1,NULL,6,'0.99',150,'26.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(156,'CLERKS ANGELS','A Thrilling Display of a Sumo Wrestler And a Girl who must Confront a Man in A Baloon',2006,1,NULL,3,'4.99',164,'15.99','G','Commentaries','2006-02-15 05:03:42'),(157,'CLOCKWORK PARADISE','A Insightful Documentary of a Technical Writer And a Feminist who must Challenge a Cat in A Baloon',2006,1,NULL,7,'0.99',143,'29.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(158,'CLONES PINOCCHIO','A Amazing Drama of a Car And a Robot who must Pursue a Dentist in New Orleans',2006,1,NULL,6,'2.99',124,'16.99','R','Behind the Scenes','2006-02-15 05:03:42'),(159,'CLOSER BANG','A Unbelieveable Panorama of a Frisbee And a Hunter who must Vanquish a Monkey in Ancient India',2006,1,NULL,5,'4.99',58,'12.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(160,'CLUB GRAFFITI','A Epic Tale of a Pioneer And a Hunter who must Escape a Girl in A U-Boat',2006,1,NULL,4,'0.99',65,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(161,'CLUE GRAIL','A Taut Tale of a Butler And a Mad Scientist who must Build a Crocodile in Ancient China',2006,1,NULL,6,'4.99',70,'27.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(162,'CLUELESS BUCKET','A Taut Tale of a Car And a Pioneer who must Conquer a Sumo Wrestler in An Abandoned Fun House',2006,1,NULL,4,'2.99',95,'13.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(163,'CLYDE THEORY','A Beautiful Yarn of a Astronaut And a Frisbee who must Overcome a Explorer in A Jet Boat',2006,1,NULL,4,'0.99',139,'29.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(164,'COAST RAINBOW','A Astounding Documentary of a Mad Cow And a Pioneer who must Challenge a Butler in The Sahara Desert',2006,1,NULL,4,'0.99',55,'20.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(165,'COLDBLOODED DARLING','A Brilliant Panorama of a Dentist And a Moose who must Find a Student in The Gulf of Mexico',2006,1,NULL,7,'4.99',70,'27.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(166,'COLOR PHILADELPHIA','A Thoughtful Panorama of a Car And a Crocodile who must Sink a Monkey in The Sahara Desert',2006,1,NULL,6,'2.99',149,'19.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(167,'COMA HEAD','A Awe-Inspiring Drama of a Boy And a Frisbee who must Escape a Pastry Chef in California',2006,1,NULL,6,'4.99',109,'10.99','NC-17','Commentaries','2006-02-15 05:03:42'),(168,'COMANCHEROS ENEMY','A Boring Saga of a Lumberjack And a Monkey who must Find a Monkey in The Gulf of Mexico',2006,1,NULL,5,'0.99',67,'23.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(169,'COMFORTS RUSH','A Unbelieveable Panorama of a Pioneer And a Husband who must Meet a Mad Cow in An Abandoned Mine Shaft',2006,1,NULL,3,'2.99',76,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(170,'COMMAND DARLING','A Awe-Inspiring Tale of a Forensic Psychologist And a Woman who must Challenge a Database Administrator in Ancient Japan',2006,1,NULL,5,'4.99',120,'28.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(171,'COMMANDMENTS EXPRESS','A Fanciful Saga of a Student And a Mad Scientist who must Battle a Hunter in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',59,'13.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(172,'CONEHEADS SMOOCHY','A Touching Story of a Womanizer And a Composer who must Pursue a Husband in Nigeria',2006,1,NULL,7,'4.99',112,'12.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(173,'CONFESSIONS MAGUIRE','A Insightful Story of a Car And a Boy who must Battle a Technical Writer in A Baloon',2006,1,NULL,7,'4.99',65,'25.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(174,'CONFIDENTIAL INTERVIEW','A Stunning Reflection of a Cat And a Woman who must Find a Astronaut in Ancient Japan',2006,1,NULL,6,'4.99',180,'13.99','NC-17','Commentaries','2006-02-15 05:03:42'),(175,'CONFUSED CANDLES','A Stunning Epistle of a Cat And a Forensic Psychologist who must Confront a Pioneer in A Baloon',2006,1,NULL,3,'2.99',122,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(176,'CONGENIALITY QUEST','A Touching Documentary of a Cat And a Pastry Chef who must Find a Lumberjack in A Baloon',2006,1,NULL,6,'0.99',87,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(177,'CONNECTICUT TRAMP','A Unbelieveable Drama of a Crocodile And a Mad Cow who must Reach a Dentist in A Shark Tank',2006,1,NULL,4,'4.99',172,'20.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(178,'CONNECTION MICROCOSMOS','A Fateful Documentary of a Crocodile And a Husband who must Face a Husband in The First Manned Space Station',2006,1,NULL,6,'0.99',115,'25.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(179,'CONQUERER NUTS','A Taut Drama of a Mad Scientist And a Man who must Escape a Pioneer in An Abandoned Mine Shaft',2006,1,NULL,4,'4.99',173,'14.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(180,'CONSPIRACY SPIRIT','A Awe-Inspiring Story of a Student And a Frisbee who must Conquer a Crocodile in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',184,'27.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(181,'CONTACT ANONYMOUS','A Insightful Display of a A Shark And a Monkey who must Face a Database Administrator in Ancient India',2006,1,NULL,7,'2.99',166,'10.99','PG-13','Commentaries','2006-02-15 05:03:42'),(182,'CONTROL ANTHEM','A Fateful Documentary of a Robot And a Student who must Battle a Cat in A Monastery',2006,1,NULL,7,'4.99',185,'9.99','G','Commentaries','2006-02-15 05:03:42'),(183,'CONVERSATION DOWNHILL','A Taut Character Study of a Husband And a Waitress who must Sink a Squirrel in A MySQL Convention',2006,1,NULL,4,'4.99',112,'14.99','R','Commentaries','2006-02-15 05:03:42'),(184,'CORE SUIT','A Unbelieveable Tale of a Car And a Explorer who must Confront a Boat in A Manhattan Penthouse',2006,1,NULL,3,'2.99',92,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(185,'COWBOY DOOM','A Astounding Drama of a Boy And a Lumberjack who must Fight a Butler in A Baloon',2006,1,NULL,3,'2.99',146,'10.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(186,'CRAFT OUTFIELD','A Lacklusture Display of a Explorer And a Hunter who must Succumb a Database Administrator in A Baloon Factory',2006,1,NULL,6,'0.99',64,'17.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(187,'CRANES RESERVOIR','A Fanciful Documentary of a Teacher And a Dog who must Outgun a Forensic Psychologist in A Baloon Factory',2006,1,NULL,5,'2.99',57,'12.99','NC-17','Commentaries','2006-02-15 05:03:42'),(188,'CRAZY HOME','A Fanciful Panorama of a Boy And a Woman who must Vanquish a Database Administrator in The Outback',2006,1,NULL,7,'2.99',136,'24.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(189,'CREATURES SHAKESPEARE','A Emotional Drama of a Womanizer And a Squirrel who must Vanquish a Crocodile in Ancient India',2006,1,NULL,3,'0.99',139,'23.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(190,'CREEPERS KANE','A Awe-Inspiring Reflection of a Squirrel And a Boat who must Outrace a Car in A Jet Boat',2006,1,NULL,5,'4.99',172,'23.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(191,'CROOKED FROGMEN','A Unbelieveable Drama of a Hunter And a Database Administrator who must Battle a Crocodile in An Abandoned Amusement Park',2006,1,NULL,6,'0.99',143,'27.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(192,'CROSSING DIVORCE','A Beautiful Documentary of a Dog And a Robot who must Redeem a Womanizer in Berlin',2006,1,NULL,4,'4.99',50,'19.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(193,'CROSSROADS CASUALTIES','A Intrepid Documentary of a Sumo Wrestler And a Astronaut who must Battle a Composer in The Outback',2006,1,NULL,5,'2.99',153,'20.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(194,'CROW GREASE','A Awe-Inspiring Documentary of a Woman And a Husband who must Sink a Database Administrator in The First Manned Space Station',2006,1,NULL,6,'0.99',104,'22.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(195,'CROWDS TELEMARK','A Intrepid Documentary of a Astronaut And a Forensic Psychologist who must Find a Frisbee in An Abandoned Fun House',2006,1,NULL,3,'4.99',112,'16.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(196,'CRUELTY UNFORGIVEN','A Brilliant Tale of a Car And a Moose who must Battle a Dentist in Nigeria',2006,1,NULL,7,'0.99',69,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(197,'CRUSADE HONEY','A Fast-Paced Reflection of a Explorer And a Butler who must Battle a Madman in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',112,'27.99','R','Commentaries','2006-02-15 05:03:42'),(198,'CRYSTAL BREAKING','A Fast-Paced Character Study of a Feminist And a Explorer who must Face a Pastry Chef in Ancient Japan',2006,1,NULL,6,'2.99',184,'22.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(199,'CUPBOARD SINNERS','A Emotional Reflection of a Frisbee And a Boat who must Reach a Pastry Chef in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',56,'29.99','R','Behind the Scenes','2006-02-15 05:03:42'),(200,'CURTAIN VIDEOTAPE','A Boring Reflection of a Dentist And a Mad Cow who must Chase a Secret Agent in A Shark Tank',2006,1,NULL,7,'0.99',133,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(201,'CYCLONE FAMILY','A Lacklusture Drama of a Student And a Monkey who must Sink a Womanizer in A MySQL Convention',2006,1,NULL,7,'2.99',176,'18.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(202,'DADDY PITTSBURGH','A Epic Story of a A Shark And a Student who must Confront a Explorer in The Gulf of Mexico',2006,1,NULL,5,'4.99',161,'26.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(203,'DAISY MENAGERIE','A Fast-Paced Saga of a Pastry Chef And a Monkey who must Sink a Composer in Ancient India',2006,1,NULL,5,'4.99',84,'9.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(204,'DALMATIONS SWEDEN','A Emotional Epistle of a Moose And a Hunter who must Overcome a Robot in A Manhattan Penthouse',2006,1,NULL,4,'0.99',106,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(205,'DANCES NONE','A Insightful Reflection of a A Shark And a Dog who must Kill a Butler in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',58,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(206,'DANCING FEVER','A Stunning Story of a Explorer And a Forensic Psychologist who must Face a Crocodile in A Shark Tank',2006,1,NULL,6,'0.99',144,'25.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(207,'DANGEROUS UPTOWN','A Unbelieveable Story of a Mad Scientist And a Woman who must Overcome a Dog in California',2006,1,NULL,7,'4.99',121,'26.99','PG','Commentaries','2006-02-15 05:03:42'),(208,'DARES PLUTO','A Fateful Story of a Robot And a Dentist who must Defeat a Astronaut in New Orleans',2006,1,NULL,7,'2.99',89,'16.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(209,'DARKNESS WAR','A Touching Documentary of a Husband And a Hunter who must Escape a Boy in The Sahara Desert',2006,1,NULL,6,'2.99',99,'24.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(210,'DARKO DORADO','A Stunning Reflection of a Frisbee And a Husband who must Redeem a Dog in New Orleans',2006,1,NULL,3,'4.99',130,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(211,'DARLING BREAKING','A Brilliant Documentary of a Astronaut And a Squirrel who must Succumb a Student in The Gulf of Mexico',2006,1,NULL,7,'4.99',165,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(212,'DARN FORRESTER','A Fateful Story of a A Shark And a Explorer who must Succumb a Technical Writer in A Jet Boat',2006,1,NULL,7,'4.99',185,'14.99','G','Deleted Scenes','2006-02-15 05:03:42'),(213,'DATE SPEED','A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention',2006,1,NULL,4,'0.99',104,'19.99','R','Commentaries','2006-02-15 05:03:42'),(214,'DAUGHTER MADIGAN','A Beautiful Tale of a Hunter And a Mad Scientist who must Confront a Squirrel in The First Manned Space Station',2006,1,NULL,3,'4.99',59,'13.99','PG-13','Trailers','2006-02-15 05:03:42'),(215,'DAWN POND','A Thoughtful Documentary of a Dentist And a Forensic Psychologist who must Defeat a Waitress in Berlin',2006,1,NULL,4,'4.99',57,'27.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(216,'DAY UNFAITHFUL','A Stunning Documentary of a Composer And a Mad Scientist who must Find a Technical Writer in A U-Boat',2006,1,NULL,3,'4.99',113,'16.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(217,'DAZED PUNK','A Action-Packed Story of a Pioneer And a Technical Writer who must Discover a Forensic Psychologist in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',120,'20.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(218,'DECEIVER BETRAYED','A Taut Story of a Moose And a Squirrel who must Build a Husband in Ancient India',2006,1,NULL,7,'0.99',122,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(219,'DEEP CRUSADE','A Amazing Tale of a Crocodile And a Squirrel who must Discover a Composer in Australia',2006,1,NULL,6,'4.99',51,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(220,'DEER VIRGINIAN','A Thoughtful Story of a Mad Cow And a Womanizer who must Overcome a Mad Scientist in Soviet Georgia',2006,1,NULL,7,'2.99',106,'13.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(221,'DELIVERANCE MULHOLLAND','A Astounding Saga of a Monkey And a Moose who must Conquer a Butler in A Shark Tank',2006,1,NULL,4,'0.99',100,'9.99','R','Deleted Scenes','2006-02-15 05:03:42'),(222,'DESERT POSEIDON','A Brilliant Documentary of a Butler And a Frisbee who must Build a Astronaut in New Orleans',2006,1,NULL,4,'4.99',64,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(223,'DESIRE ALIEN','A Fast-Paced Tale of a Dog And a Forensic Psychologist who must Meet a Astronaut in The First Manned Space Station',2006,1,NULL,7,'2.99',76,'24.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(224,'DESPERATE TRAINSPOTTING','A Epic Yarn of a Forensic Psychologist And a Teacher who must Face a Lumberjack in California',2006,1,NULL,7,'4.99',81,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(225,'DESTINATION JERK','A Beautiful Yarn of a Teacher And a Cat who must Build a Car in A U-Boat',2006,1,NULL,3,'0.99',76,'19.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(226,'DESTINY SATURDAY','A Touching Drama of a Crocodile And a Crocodile who must Conquer a Explorer in Soviet Georgia',2006,1,NULL,4,'4.99',56,'20.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(227,'DETAILS PACKER','A Epic Saga of a Waitress And a Composer who must Face a Boat in A U-Boat',2006,1,NULL,4,'4.99',88,'17.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(228,'DETECTIVE VISION','A Fanciful Documentary of a Pioneer And a Woman who must Redeem a Hunter in Ancient Japan',2006,1,NULL,4,'0.99',143,'16.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(229,'DEVIL DESIRE','A Beautiful Reflection of a Monkey And a Dentist who must Face a Database Administrator in Ancient Japan',2006,1,NULL,6,'4.99',87,'12.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(230,'DIARY PANIC','A Thoughtful Character Study of a Frisbee And a Mad Cow who must Outgun a Man in Ancient India',2006,1,NULL,7,'2.99',107,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(231,'DINOSAUR SECRETARY','A Action-Packed Drama of a Feminist And a Girl who must Reach a Robot in The Canadian Rockies',2006,1,NULL,7,'2.99',63,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(232,'DIRTY ACE','A Action-Packed Character Study of a Forensic Psychologist And a Girl who must Build a Dentist in The Outback',2006,1,NULL,7,'2.99',147,'29.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(233,'DISCIPLE MOTHER','A Touching Reflection of a Mad Scientist And a Boat who must Face a Moose in A Shark Tank',2006,1,NULL,3,'0.99',141,'17.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(234,'DISTURBING SCARFACE','A Lacklusture Display of a Crocodile And a Butler who must Overcome a Monkey in A U-Boat',2006,1,NULL,6,'2.99',94,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(235,'DIVIDE MONSTER','A Intrepid Saga of a Man And a Forensic Psychologist who must Reach a Squirrel in A Monastery',2006,1,NULL,6,'2.99',68,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(236,'DIVINE RESURRECTION','A Boring Character Study of a Man And a Womanizer who must Succumb a Teacher in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',100,'19.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(237,'DIVORCE SHINING','A Unbelieveable Saga of a Crocodile And a Student who must Discover a Cat in Ancient India',2006,1,NULL,3,'2.99',47,'21.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(238,'DOCTOR GRAIL','A Insightful Drama of a Womanizer And a Waitress who must Reach a Forensic Psychologist in The Outback',2006,1,NULL,4,'2.99',57,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(239,'DOGMA FAMILY','A Brilliant Character Study of a Database Administrator And a Monkey who must Succumb a Astronaut in New Orleans',2006,1,NULL,5,'4.99',122,'16.99','G','Commentaries','2006-02-15 05:03:42'),(240,'DOLLS RAGE','A Thrilling Display of a Pioneer And a Frisbee who must Escape a Teacher in The Outback',2006,1,NULL,7,'2.99',120,'10.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(241,'DONNIE ALLEY','A Awe-Inspiring Tale of a Butler And a Frisbee who must Vanquish a Teacher in Ancient Japan',2006,1,NULL,4,'0.99',125,'20.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(242,'DOOM DANCING','A Astounding Panorama of a Car And a Mad Scientist who must Battle a Lumberjack in A MySQL Convention',2006,1,NULL,4,'0.99',68,'13.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(243,'DOORS PRESIDENT','A Awe-Inspiring Display of a Squirrel And a Woman who must Overcome a Boy in The Gulf of Mexico',2006,1,NULL,3,'4.99',49,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(244,'DORADO NOTTING','A Action-Packed Tale of a Sumo Wrestler And a A Shark who must Meet a Frisbee in California',2006,1,NULL,5,'4.99',139,'26.99','NC-17','Commentaries','2006-02-15 05:03:42'),(245,'DOUBLE WRATH','A Thoughtful Yarn of a Womanizer And a Dog who must Challenge a Madman in The Gulf of Mexico',2006,1,NULL,4,'0.99',177,'28.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(246,'DOUBTFIRE LABYRINTH','A Intrepid Panorama of a Butler And a Composer who must Meet a Mad Cow in The Sahara Desert',2006,1,NULL,5,'4.99',154,'16.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(247,'DOWNHILL ENOUGH','A Emotional Tale of a Pastry Chef And a Forensic Psychologist who must Succumb a Monkey in The Sahara Desert',2006,1,NULL,3,'0.99',47,'19.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(248,'DOZEN LION','A Taut Drama of a Cat And a Girl who must Defeat a Frisbee in The Canadian Rockies',2006,1,NULL,6,'4.99',177,'20.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(249,'DRACULA CRYSTAL','A Thrilling Reflection of a Feminist And a Cat who must Find a Frisbee in An Abandoned Fun House',2006,1,NULL,7,'0.99',176,'26.99','G','Commentaries','2006-02-15 05:03:42'),(250,'DRAGON SQUAD','A Taut Reflection of a Boy And a Waitress who must Outgun a Teacher in Ancient China',2006,1,NULL,4,'0.99',170,'26.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(251,'DRAGONFLY STRANGERS','A Boring Documentary of a Pioneer And a Man who must Vanquish a Man in Nigeria',2006,1,NULL,6,'4.99',133,'19.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(252,'DREAM PICKUP','A Epic Display of a Car And a Composer who must Overcome a Forensic Psychologist in The Gulf of Mexico',2006,1,NULL,6,'2.99',135,'18.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(253,'DRIFTER COMMANDMENTS','A Epic Reflection of a Womanizer And a Squirrel who must Discover a Husband in A Jet Boat',2006,1,NULL,5,'4.99',61,'18.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(254,'DRIVER ANNIE','A Lacklusture Character Study of a Butler And a Car who must Redeem a Boat in An Abandoned Fun House',2006,1,NULL,4,'2.99',159,'11.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(255,'DRIVING POLISH','A Action-Packed Yarn of a Feminist And a Technical Writer who must Sink a Boat in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',175,'21.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(256,'DROP WATERFRONT','A Fanciful Documentary of a Husband And a Explorer who must Reach a Madman in Ancient China',2006,1,NULL,6,'4.99',178,'20.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(257,'DRUMLINE CYCLONE','A Insightful Panorama of a Monkey And a Sumo Wrestler who must Outrace a Mad Scientist in The Canadian Rockies',2006,1,NULL,3,'0.99',110,'14.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(258,'DRUMS DYNAMITE','A Epic Display of a Crocodile And a Crocodile who must Confront a Dog in An Abandoned Amusement Park',2006,1,NULL,6,'0.99',96,'11.99','PG','Trailers','2006-02-15 05:03:42'),(259,'DUCK RACER','A Lacklusture Yarn of a Teacher And a Squirrel who must Overcome a Dog in A Shark Tank',2006,1,NULL,4,'2.99',116,'15.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(260,'DUDE BLINDNESS','A Stunning Reflection of a Husband And a Lumberjack who must Face a Frisbee in An Abandoned Fun House',2006,1,NULL,3,'4.99',132,'9.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(261,'DUFFEL APOCALYPSE','A Emotional Display of a Boat And a Explorer who must Challenge a Madman in A MySQL Convention',2006,1,NULL,5,'0.99',171,'13.99','G','Commentaries','2006-02-15 05:03:42'),(262,'DUMBO LUST','A Touching Display of a Feminist And a Dentist who must Conquer a Husband in The Gulf of Mexico',2006,1,NULL,5,'0.99',119,'17.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(263,'DURHAM PANKY','A Brilliant Panorama of a Girl And a Boy who must Face a Mad Scientist in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',154,'14.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(264,'DWARFS ALTER','A Emotional Yarn of a Girl And a Dog who must Challenge a Composer in Ancient Japan',2006,1,NULL,6,'2.99',101,'13.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(265,'DYING MAKER','A Intrepid Tale of a Boat And a Monkey who must Kill a Cat in California',2006,1,NULL,5,'4.99',168,'28.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(266,'DYNAMITE TARZAN','A Intrepid Documentary of a Forensic Psychologist And a Mad Scientist who must Face a Explorer in A U-Boat',2006,1,NULL,4,'0.99',141,'27.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(267,'EAGLES PANKY','A Thoughtful Story of a Car And a Boy who must Find a A Shark in The Sahara Desert',2006,1,NULL,4,'4.99',140,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(268,'EARLY HOME','A Amazing Panorama of a Mad Scientist And a Husband who must Meet a Woman in The Outback',2006,1,NULL,6,'4.99',96,'27.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(269,'EARRING INSTINCT','A Stunning Character Study of a Dentist And a Mad Cow who must Find a Teacher in Nigeria',2006,1,NULL,3,'0.99',98,'22.99','R','Behind the Scenes','2006-02-15 05:03:42'),(270,'EARTH VISION','A Stunning Drama of a Butler And a Madman who must Outrace a Womanizer in Ancient India',2006,1,NULL,7,'0.99',85,'29.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(271,'EASY GLADIATOR','A Fateful Story of a Monkey And a Girl who must Overcome a Pastry Chef in Ancient India',2006,1,NULL,5,'4.99',148,'12.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(272,'EDGE KISSING','A Beautiful Yarn of a Composer And a Mad Cow who must Redeem a Mad Scientist in A Jet Boat',2006,1,NULL,5,'4.99',153,'9.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(273,'EFFECT GLADIATOR','A Beautiful Display of a Pastry Chef And a Pastry Chef who must Outgun a Forensic Psychologist in A Manhattan Penthouse',2006,1,NULL,6,'0.99',107,'14.99','PG','Commentaries','2006-02-15 05:03:42'),(274,'EGG IGBY','A Beautiful Documentary of a Boat And a Sumo Wrestler who must Succumb a Database Administrator in The First Manned Space Station',2006,1,NULL,4,'2.99',67,'20.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(275,'EGYPT TENENBAUMS','A Intrepid Story of a Madman And a Secret Agent who must Outrace a Astronaut in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',85,'11.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(276,'ELEMENT FREDDY','A Awe-Inspiring Reflection of a Waitress And a Squirrel who must Kill a Mad Cow in A Jet Boat',2006,1,NULL,6,'4.99',115,'28.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(277,'ELEPHANT TROJAN','A Beautiful Panorama of a Lumberjack And a Forensic Psychologist who must Overcome a Frisbee in A Baloon',2006,1,NULL,4,'4.99',126,'24.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(278,'ELF MURDER','A Action-Packed Story of a Frisbee And a Woman who must Reach a Girl in An Abandoned Mine Shaft',2006,1,NULL,4,'4.99',155,'19.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(279,'ELIZABETH SHANE','A Lacklusture Display of a Womanizer And a Dog who must Face a Sumo Wrestler in Ancient Japan',2006,1,NULL,7,'4.99',152,'11.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(280,'EMPIRE MALKOVICH','A Amazing Story of a Feminist And a Cat who must Face a Car in An Abandoned Fun House',2006,1,NULL,7,'0.99',177,'26.99','G','Deleted Scenes','2006-02-15 05:03:42'),(281,'ENCINO ELF','A Astounding Drama of a Feminist And a Teacher who must Confront a Husband in A Baloon',2006,1,NULL,6,'0.99',143,'9.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(282,'ENCOUNTERS CURTAIN','A Insightful Epistle of a Pastry Chef And a Womanizer who must Build a Boat in New Orleans',2006,1,NULL,5,'0.99',92,'20.99','NC-17','Trailers','2006-02-15 05:03:42'),(283,'ENDING CROWDS','A Unbelieveable Display of a Dentist And a Madman who must Vanquish a Squirrel in Berlin',2006,1,NULL,6,'0.99',85,'10.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(284,'ENEMY ODDS','A Fanciful Panorama of a Mad Scientist And a Woman who must Pursue a Astronaut in Ancient India',2006,1,NULL,5,'4.99',77,'23.99','NC-17','Trailers','2006-02-15 05:03:42'),(285,'ENGLISH BULWORTH','A Intrepid Epistle of a Pastry Chef And a Pastry Chef who must Pursue a Crocodile in Ancient China',2006,1,NULL,3,'0.99',51,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(286,'ENOUGH RAGING','A Astounding Character Study of a Boat And a Secret Agent who must Find a Mad Cow in The Sahara Desert',2006,1,NULL,7,'2.99',158,'16.99','NC-17','Commentaries','2006-02-15 05:03:42'),(287,'ENTRAPMENT SATISFACTION','A Thoughtful Panorama of a Hunter And a Teacher who must Reach a Mad Cow in A U-Boat',2006,1,NULL,5,'0.99',176,'19.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(288,'ESCAPE METROPOLIS','A Taut Yarn of a Astronaut And a Technical Writer who must Outgun a Boat in New Orleans',2006,1,NULL,7,'2.99',167,'20.99','R','Trailers','2006-02-15 05:03:42'),(289,'EVE RESURRECTION','A Awe-Inspiring Yarn of a Pastry Chef And a Database Administrator who must Challenge a Teacher in A Baloon',2006,1,NULL,5,'4.99',66,'25.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(290,'EVERYONE CRAFT','A Fateful Display of a Waitress And a Dentist who must Reach a Butler in Nigeria',2006,1,NULL,4,'0.99',163,'29.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(291,'EVOLUTION ALTER','A Fanciful Character Study of a Feminist And a Madman who must Find a Explorer in A Baloon Factory',2006,1,NULL,5,'0.99',174,'10.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(292,'EXCITEMENT EVE','A Brilliant Documentary of a Monkey And a Car who must Conquer a Crocodile in A Shark Tank',2006,1,NULL,3,'0.99',51,'20.99','G','Commentaries','2006-02-15 05:03:42'),(293,'EXORCIST STING','A Touching Drama of a Dog And a Sumo Wrestler who must Conquer a Mad Scientist in Berlin',2006,1,NULL,6,'2.99',167,'17.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(294,'EXPECATIONS NATURAL','A Amazing Drama of a Butler And a Husband who must Reach a A Shark in A U-Boat',2006,1,NULL,5,'4.99',138,'26.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(295,'EXPENDABLE STALLION','A Amazing Character Study of a Mad Cow And a Squirrel who must Discover a Hunter in A U-Boat',2006,1,NULL,3,'0.99',97,'14.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(296,'EXPRESS LONELY','A Boring Drama of a Astronaut And a Boat who must Face a Boat in California',2006,1,NULL,5,'2.99',178,'23.99','R','Trailers','2006-02-15 05:03:42'),(297,'EXTRAORDINARY CONQUERER','A Stunning Story of a Dog And a Feminist who must Face a Forensic Psychologist in Berlin',2006,1,NULL,6,'2.99',122,'29.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(298,'EYES DRIVING','A Thrilling Story of a Cat And a Waitress who must Fight a Explorer in The Outback',2006,1,NULL,4,'2.99',172,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(299,'FACTORY DRAGON','A Action-Packed Saga of a Teacher And a Frisbee who must Escape a Lumberjack in The Sahara Desert',2006,1,NULL,4,'0.99',144,'9.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(300,'FALCON VOLUME','A Fateful Saga of a Sumo Wrestler And a Hunter who must Redeem a A Shark in New Orleans',2006,1,NULL,5,'4.99',102,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(301,'FAMILY SWEET','A Epic Documentary of a Teacher And a Boy who must Escape a Woman in Berlin',2006,1,NULL,4,'0.99',155,'24.99','R','Trailers','2006-02-15 05:03:42'),(302,'FANTASIA PARK','A Thoughtful Documentary of a Mad Scientist And a A Shark who must Outrace a Feminist in Australia',2006,1,NULL,5,'2.99',131,'29.99','G','Commentaries','2006-02-15 05:03:42'),(303,'FANTASY TROOPERS','A Touching Saga of a Teacher And a Monkey who must Overcome a Secret Agent in A MySQL Convention',2006,1,NULL,6,'0.99',58,'27.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(304,'FARGO GANDHI','A Thrilling Reflection of a Pastry Chef And a Crocodile who must Reach a Teacher in The Outback',2006,1,NULL,3,'2.99',130,'28.99','G','Deleted Scenes','2006-02-15 05:03:42'),(305,'FATAL HAUNTED','A Beautiful Drama of a Student And a Secret Agent who must Confront a Dentist in Ancient Japan',2006,1,NULL,6,'2.99',91,'24.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(306,'FEATHERS METAL','A Thoughtful Yarn of a Monkey And a Teacher who must Find a Dog in Australia',2006,1,NULL,3,'0.99',104,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(307,'FELLOWSHIP AUTUMN','A Lacklusture Reflection of a Dentist And a Hunter who must Meet a Teacher in A Baloon',2006,1,NULL,6,'4.99',77,'9.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(308,'FERRIS MOTHER','A Touching Display of a Frisbee And a Frisbee who must Kill a Girl in The Gulf of Mexico',2006,1,NULL,3,'2.99',142,'13.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(309,'FEUD FROGMEN','A Brilliant Reflection of a Database Administrator And a Mad Cow who must Chase a Woman in The Canadian Rockies',2006,1,NULL,6,'0.99',98,'29.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(310,'FEVER EMPIRE','A Insightful Panorama of a Cat And a Boat who must Defeat a Boat in The Gulf of Mexico',2006,1,NULL,5,'4.99',158,'20.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(311,'FICTION CHRISTMAS','A Emotional Yarn of a A Shark And a Student who must Battle a Robot in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',72,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(312,'FIDDLER LOST','A Boring Tale of a Squirrel And a Dog who must Challenge a Madman in The Gulf of Mexico',2006,1,NULL,4,'4.99',75,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(313,'FIDELITY DEVIL','A Awe-Inspiring Drama of a Technical Writer And a Composer who must Reach a Pastry Chef in A U-Boat',2006,1,NULL,5,'4.99',118,'11.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(314,'FIGHT JAWBREAKER','A Intrepid Panorama of a Womanizer And a Girl who must Escape a Girl in A Manhattan Penthouse',2006,1,NULL,3,'0.99',91,'13.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(315,'FINDING ANACONDA','A Fateful Tale of a Database Administrator And a Girl who must Battle a Squirrel in New Orleans',2006,1,NULL,4,'0.99',156,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(316,'FIRE WOLVES','A Intrepid Documentary of a Frisbee And a Dog who must Outrace a Lumberjack in Nigeria',2006,1,NULL,5,'4.99',173,'18.99','R','Trailers','2006-02-15 05:03:42'),(317,'FIREBALL PHILADELPHIA','A Amazing Yarn of a Dentist And a A Shark who must Vanquish a Madman in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',148,'25.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(318,'FIREHOUSE VIETNAM','A Awe-Inspiring Character Study of a Boat And a Boy who must Kill a Pastry Chef in The Sahara Desert',2006,1,NULL,7,'0.99',103,'14.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(319,'FISH OPUS','A Touching Display of a Feminist And a Girl who must Confront a Astronaut in Australia',2006,1,NULL,4,'2.99',125,'22.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(320,'FLAMINGOS CONNECTICUT','A Fast-Paced Reflection of a Composer And a Composer who must Meet a Cat in The Sahara Desert',2006,1,NULL,4,'4.99',80,'28.99','PG-13','Trailers','2006-02-15 05:03:42'),(321,'FLASH WARS','A Astounding Saga of a Moose And a Pastry Chef who must Chase a Student in The Gulf of Mexico',2006,1,NULL,3,'4.99',123,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(322,'FLATLINERS KILLER','A Taut Display of a Secret Agent And a Waitress who must Sink a Robot in An Abandoned Mine Shaft',2006,1,NULL,5,'2.99',100,'29.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(323,'FLIGHT LIES','A Stunning Character Study of a Crocodile And a Pioneer who must Pursue a Teacher in New Orleans',2006,1,NULL,7,'4.99',179,'22.99','R','Trailers','2006-02-15 05:03:42'),(324,'FLINTSTONES HAPPINESS','A Fateful Story of a Husband And a Moose who must Vanquish a Boy in California',2006,1,NULL,3,'4.99',148,'11.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(325,'FLOATS GARDEN','A Action-Packed Epistle of a Robot And a Car who must Chase a Boat in Ancient Japan',2006,1,NULL,6,'2.99',145,'29.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(326,'FLYING HOOK','A Thrilling Display of a Mad Cow And a Dog who must Challenge a Frisbee in Nigeria',2006,1,NULL,6,'2.99',69,'18.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(327,'FOOL MOCKINGBIRD','A Lacklusture Tale of a Crocodile And a Composer who must Defeat a Madman in A U-Boat',2006,1,NULL,3,'4.99',158,'24.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(328,'FOREVER CANDIDATE','A Unbelieveable Panorama of a Technical Writer And a Man who must Pursue a Frisbee in A U-Boat',2006,1,NULL,7,'2.99',131,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(329,'FORREST SONS','A Thrilling Documentary of a Forensic Psychologist And a Butler who must Defeat a Explorer in A Jet Boat',2006,1,NULL,4,'2.99',63,'15.99','R','Commentaries','2006-02-15 05:03:42'),(330,'FORRESTER COMANCHEROS','A Fateful Tale of a Squirrel And a Forensic Psychologist who must Redeem a Man in Nigeria',2006,1,NULL,7,'4.99',112,'22.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(331,'FORWARD TEMPLE','A Astounding Display of a Forensic Psychologist And a Mad Scientist who must Challenge a Girl in New Orleans',2006,1,NULL,6,'2.99',90,'25.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(332,'FRANKENSTEIN STRANGER','A Insightful Character Study of a Feminist And a Pioneer who must Pursue a Pastry Chef in Nigeria',2006,1,NULL,7,'0.99',159,'16.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(333,'FREAKY POCUS','A Fast-Paced Documentary of a Pastry Chef And a Crocodile who must Chase a Squirrel in The Gulf of Mexico',2006,1,NULL,7,'2.99',126,'16.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(334,'FREDDY STORM','A Intrepid Saga of a Man And a Lumberjack who must Vanquish a Husband in The Outback',2006,1,NULL,6,'4.99',65,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(335,'FREEDOM CLEOPATRA','A Emotional Reflection of a Dentist And a Mad Cow who must Face a Squirrel in A Baloon',2006,1,NULL,5,'0.99',133,'23.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(336,'FRENCH HOLIDAY','A Thrilling Epistle of a Dog And a Feminist who must Kill a Madman in Berlin',2006,1,NULL,5,'4.99',99,'22.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(337,'FRIDA SLIPPER','A Fateful Story of a Lumberjack And a Car who must Escape a Boat in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',73,'11.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(338,'FRISCO FORREST','A Beautiful Documentary of a Woman And a Pioneer who must Pursue a Mad Scientist in A Shark Tank',2006,1,NULL,6,'4.99',51,'23.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(339,'FROGMEN BREAKING','A Unbelieveable Yarn of a Mad Scientist And a Cat who must Chase a Lumberjack in Australia',2006,1,NULL,5,'0.99',111,'17.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(340,'FRONTIER CABIN','A Emotional Story of a Madman And a Waitress who must Battle a Teacher in An Abandoned Fun House',2006,1,NULL,6,'4.99',183,'14.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(341,'FROST HEAD','A Amazing Reflection of a Lumberjack And a Cat who must Discover a Husband in A MySQL Convention',2006,1,NULL,5,'0.99',82,'13.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(342,'FUGITIVE MAGUIRE','A Taut Epistle of a Feminist And a Sumo Wrestler who must Battle a Crocodile in Australia',2006,1,NULL,7,'4.99',83,'28.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(343,'FULL FLATLINERS','A Beautiful Documentary of a Astronaut And a Moose who must Pursue a Monkey in A Shark Tank',2006,1,NULL,6,'2.99',94,'14.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(344,'FURY MURDER','A Lacklusture Reflection of a Boat And a Forensic Psychologist who must Fight a Waitress in A Monastery',2006,1,NULL,3,'0.99',178,'28.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(345,'GABLES METROPOLIS','A Fateful Display of a Cat And a Pioneer who must Challenge a Pastry Chef in A Baloon Factory',2006,1,NULL,3,'0.99',161,'17.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(346,'GALAXY SWEETHEARTS','A Emotional Reflection of a Womanizer And a Pioneer who must Face a Squirrel in Berlin',2006,1,NULL,4,'4.99',128,'13.99','R','Deleted Scenes','2006-02-15 05:03:42'),(347,'GAMES BOWFINGER','A Astounding Documentary of a Butler And a Explorer who must Challenge a Butler in A Monastery',2006,1,NULL,7,'4.99',119,'17.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(348,'GANDHI KWAI','A Thoughtful Display of a Mad Scientist And a Secret Agent who must Chase a Boat in Berlin',2006,1,NULL,7,'0.99',86,'9.99','PG-13','Trailers','2006-02-15 05:03:42'),(349,'GANGS PRIDE','A Taut Character Study of a Woman And a A Shark who must Confront a Frisbee in Berlin',2006,1,NULL,4,'2.99',185,'27.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(350,'GARDEN ISLAND','A Unbelieveable Character Study of a Womanizer And a Madman who must Reach a Man in The Outback',2006,1,NULL,3,'4.99',80,'21.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(351,'GASLIGHT CRUSADE','A Amazing Epistle of a Boy And a Astronaut who must Redeem a Man in The Gulf of Mexico',2006,1,NULL,4,'2.99',106,'10.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(352,'GATHERING CALENDAR','A Intrepid Tale of a Pioneer And a Moose who must Conquer a Frisbee in A MySQL Convention',2006,1,NULL,4,'0.99',176,'22.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(353,'GENTLEMEN STAGE','A Awe-Inspiring Reflection of a Monkey And a Student who must Overcome a Dentist in The First Manned Space Station',2006,1,NULL,6,'2.99',125,'22.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(354,'GHOST GROUNDHOG','A Brilliant Panorama of a Madman And a Composer who must Succumb a Car in Ancient India',2006,1,NULL,6,'4.99',85,'18.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(355,'GHOSTBUSTERS ELF','A Thoughtful Epistle of a Dog And a Feminist who must Chase a Composer in Berlin',2006,1,NULL,7,'0.99',101,'18.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(356,'GIANT TROOPERS','A Fateful Display of a Feminist And a Monkey who must Vanquish a Monkey in The Canadian Rockies',2006,1,NULL,5,'2.99',102,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(357,'GILBERT PELICAN','A Fateful Tale of a Man And a Feminist who must Conquer a Crocodile in A Manhattan Penthouse',2006,1,NULL,7,'0.99',114,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(358,'GILMORE BOILED','A Unbelieveable Documentary of a Boat And a Husband who must Succumb a Student in A U-Boat',2006,1,NULL,5,'0.99',163,'29.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(359,'GLADIATOR WESTWARD','A Astounding Reflection of a Squirrel And a Sumo Wrestler who must Sink a Dentist in Ancient Japan',2006,1,NULL,6,'4.99',173,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(360,'GLASS DYING','A Astounding Drama of a Frisbee And a Astronaut who must Fight a Dog in Ancient Japan',2006,1,NULL,4,'0.99',103,'24.99','G','Trailers','2006-02-15 05:03:42'),(361,'GLEAMING JAWBREAKER','A Amazing Display of a Composer And a Forensic Psychologist who must Discover a Car in The Canadian Rockies',2006,1,NULL,5,'2.99',89,'25.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(362,'GLORY TRACY','A Amazing Saga of a Woman And a Womanizer who must Discover a Cat in The First Manned Space Station',2006,1,NULL,7,'2.99',115,'13.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(363,'GO PURPLE','A Fast-Paced Display of a Car And a Database Administrator who must Battle a Woman in A Baloon',2006,1,NULL,3,'0.99',54,'12.99','R','Trailers','2006-02-15 05:03:42'),(364,'GODFATHER DIARY','A Stunning Saga of a Lumberjack And a Squirrel who must Chase a Car in The Outback',2006,1,NULL,3,'2.99',73,'14.99','NC-17','Trailers','2006-02-15 05:03:42'),(365,'GOLD RIVER','A Taut Documentary of a Database Administrator And a Waitress who must Reach a Mad Scientist in A Baloon Factory',2006,1,NULL,4,'4.99',154,'21.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(366,'GOLDFINGER SENSIBILITY','A Insightful Drama of a Mad Scientist And a Hunter who must Defeat a Pastry Chef in New Orleans',2006,1,NULL,3,'0.99',93,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(367,'GOLDMINE TYCOON','A Brilliant Epistle of a Composer And a Frisbee who must Conquer a Husband in The Outback',2006,1,NULL,6,'0.99',153,'20.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(368,'GONE TROUBLE','A Insightful Character Study of a Mad Cow And a Forensic Psychologist who must Conquer a A Shark in A Manhattan Penthouse',2006,1,NULL,7,'2.99',84,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(369,'GOODFELLAS SALUTE','A Unbelieveable Tale of a Dog And a Explorer who must Sink a Mad Cow in A Baloon Factory',2006,1,NULL,4,'4.99',56,'22.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(370,'GORGEOUS BINGO','A Action-Packed Display of a Sumo Wrestler And a Car who must Overcome a Waitress in A Baloon Factory',2006,1,NULL,4,'2.99',108,'26.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(371,'GOSFORD DONNIE','A Epic Panorama of a Mad Scientist And a Monkey who must Redeem a Secret Agent in Berlin',2006,1,NULL,5,'4.99',129,'17.99','G','Commentaries','2006-02-15 05:03:42'),(372,'GRACELAND DYNAMITE','A Taut Display of a Cat And a Girl who must Overcome a Database Administrator in New Orleans',2006,1,NULL,5,'4.99',140,'26.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(373,'GRADUATE LORD','A Lacklusture Epistle of a Girl And a A Shark who must Meet a Mad Scientist in Ancient China',2006,1,NULL,7,'2.99',156,'14.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(374,'GRAFFITI LOVE','A Unbelieveable Epistle of a Sumo Wrestler And a Hunter who must Build a Composer in Berlin',2006,1,NULL,3,'0.99',117,'29.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(375,'GRAIL FRANKENSTEIN','A Unbelieveable Saga of a Teacher And a Monkey who must Fight a Girl in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',85,'17.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(376,'GRAPES FURY','A Boring Yarn of a Mad Cow And a Sumo Wrestler who must Meet a Robot in Australia',2006,1,NULL,4,'0.99',155,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(377,'GREASE YOUTH','A Emotional Panorama of a Secret Agent And a Waitress who must Escape a Composer in Soviet Georgia',2006,1,NULL,7,'0.99',135,'20.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(378,'GREATEST NORTH','A Astounding Character Study of a Secret Agent And a Robot who must Build a A Shark in Berlin',2006,1,NULL,5,'2.99',93,'24.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(379,'GREEDY ROOTS','A Amazing Reflection of a A Shark And a Butler who must Chase a Hunter in The Canadian Rockies',2006,1,NULL,7,'0.99',166,'14.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(380,'GREEK EVERYONE','A Stunning Display of a Butler And a Teacher who must Confront a A Shark in The First Manned Space Station',2006,1,NULL,7,'2.99',176,'11.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(381,'GRINCH MASSAGE','A Intrepid Display of a Madman And a Feminist who must Pursue a Pioneer in The First Manned Space Station',2006,1,NULL,7,'4.99',150,'25.99','R','Trailers','2006-02-15 05:03:42'),(382,'GRIT CLOCKWORK','A Thoughtful Display of a Dentist And a Squirrel who must Confront a Lumberjack in A Shark Tank',2006,1,NULL,3,'0.99',137,'21.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(383,'GROOVE FICTION','A Unbelieveable Reflection of a Moose And a A Shark who must Defeat a Lumberjack in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',111,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(384,'GROSSE WONDERFUL','A Epic Drama of a Cat And a Explorer who must Redeem a Moose in Australia',2006,1,NULL,5,'4.99',49,'19.99','R','Behind the Scenes','2006-02-15 05:03:42'),(385,'GROUNDHOG UNCUT','A Brilliant Panorama of a Astronaut And a Technical Writer who must Discover a Butler in A Manhattan Penthouse',2006,1,NULL,6,'4.99',139,'26.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(386,'GUMP DATE','A Intrepid Yarn of a Explorer And a Student who must Kill a Husband in An Abandoned Mine Shaft',2006,1,NULL,3,'4.99',53,'12.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(387,'GUN BONNIE','A Boring Display of a Sumo Wrestler And a Husband who must Build a Waitress in The Gulf of Mexico',2006,1,NULL,7,'0.99',100,'27.99','G','Behind the Scenes','2006-02-15 05:03:42'),(388,'GUNFIGHT MOON','A Epic Reflection of a Pastry Chef And a Explorer who must Reach a Dentist in The Sahara Desert',2006,1,NULL,5,'0.99',70,'16.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(389,'GUNFIGHTER MUSSOLINI','A Touching Saga of a Robot And a Boy who must Kill a Man in Ancient Japan',2006,1,NULL,3,'2.99',127,'9.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(390,'GUYS FALCON','A Boring Story of a Woman And a Feminist who must Redeem a Squirrel in A U-Boat',2006,1,NULL,4,'4.99',84,'20.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(391,'HALF OUTFIELD','A Epic Epistle of a Database Administrator And a Crocodile who must Face a Madman in A Jet Boat',2006,1,NULL,6,'2.99',146,'25.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(392,'HALL CASSIDY','A Beautiful Panorama of a Pastry Chef And a A Shark who must Battle a Pioneer in Soviet Georgia',2006,1,NULL,5,'4.99',51,'13.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(393,'HALLOWEEN NUTS','A Amazing Panorama of a Forensic Psychologist And a Technical Writer who must Fight a Dentist in A U-Boat',2006,1,NULL,6,'2.99',47,'19.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(394,'HAMLET WISDOM','A Touching Reflection of a Man And a Man who must Sink a Robot in The Outback',2006,1,NULL,7,'2.99',146,'21.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(395,'HANDICAP BOONDOCK','A Beautiful Display of a Pioneer And a Squirrel who must Vanquish a Sumo Wrestler in Soviet Georgia',2006,1,NULL,4,'0.99',108,'28.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(396,'HANGING DEEP','A Action-Packed Yarn of a Boat And a Crocodile who must Build a Monkey in Berlin',2006,1,NULL,5,'4.99',62,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(397,'HANKY OCTOBER','A Boring Epistle of a Database Administrator And a Explorer who must Pursue a Madman in Soviet Georgia',2006,1,NULL,5,'2.99',107,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(398,'HANOVER GALAXY','A Stunning Reflection of a Girl And a Secret Agent who must Succumb a Boy in A MySQL Convention',2006,1,NULL,5,'4.99',47,'21.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(399,'HAPPINESS UNITED','A Action-Packed Panorama of a Husband And a Feminist who must Meet a Forensic Psychologist in Ancient Japan',2006,1,NULL,6,'2.99',100,'23.99','G','Deleted Scenes','2006-02-15 05:03:42'),(400,'HARDLY ROBBERS','A Emotional Character Study of a Hunter And a Car who must Kill a Woman in Berlin',2006,1,NULL,7,'2.99',72,'15.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(401,'HAROLD FRENCH','A Stunning Saga of a Sumo Wrestler And a Student who must Outrace a Moose in The Sahara Desert',2006,1,NULL,6,'0.99',168,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(402,'HARPER DYING','A Awe-Inspiring Reflection of a Woman And a Cat who must Confront a Feminist in The Sahara Desert',2006,1,NULL,3,'0.99',52,'15.99','G','Trailers','2006-02-15 05:03:42'),(403,'HARRY IDAHO','A Taut Yarn of a Technical Writer And a Feminist who must Outrace a Dog in California',2006,1,NULL,5,'4.99',121,'18.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(404,'HATE HANDICAP','A Intrepid Reflection of a Mad Scientist And a Pioneer who must Overcome a Hunter in The First Manned Space Station',2006,1,NULL,4,'0.99',107,'26.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(405,'HAUNTED ANTITRUST','A Amazing Saga of a Man And a Dentist who must Reach a Technical Writer in Ancient India',2006,1,NULL,6,'4.99',76,'13.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(406,'HAUNTING PIANIST','A Fast-Paced Story of a Database Administrator And a Composer who must Defeat a Squirrel in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',181,'22.99','R','Behind the Scenes','2006-02-15 05:03:42'),(407,'HAWK CHILL','A Action-Packed Drama of a Mad Scientist And a Composer who must Outgun a Car in Australia',2006,1,NULL,5,'0.99',47,'12.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(408,'HEAD STRANGER','A Thoughtful Saga of a Hunter And a Crocodile who must Confront a Dog in The Gulf of Mexico',2006,1,NULL,4,'4.99',69,'28.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(409,'HEARTBREAKERS BRIGHT','A Awe-Inspiring Documentary of a A Shark And a Dentist who must Outrace a Pastry Chef in The Canadian Rockies',2006,1,NULL,3,'4.99',59,'9.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(410,'HEAVEN FREEDOM','A Intrepid Story of a Butler And a Car who must Vanquish a Man in New Orleans',2006,1,NULL,7,'2.99',48,'19.99','PG','Commentaries','2006-02-15 05:03:42'),(411,'HEAVENLY GUN','A Beautiful Yarn of a Forensic Psychologist And a Frisbee who must Battle a Moose in A Jet Boat',2006,1,NULL,5,'4.99',49,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(412,'HEAVYWEIGHTS BEAST','A Unbelieveable Story of a Composer And a Dog who must Overcome a Womanizer in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',102,'25.99','G','Deleted Scenes','2006-02-15 05:03:42'),(413,'HEDWIG ALTER','A Action-Packed Yarn of a Womanizer And a Lumberjack who must Chase a Sumo Wrestler in A Monastery',2006,1,NULL,7,'2.99',169,'16.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(414,'HELLFIGHTERS SIERRA','A Taut Reflection of a A Shark And a Dentist who must Battle a Boat in Soviet Georgia',2006,1,NULL,3,'2.99',75,'23.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(415,'HIGH ENCINO','A Fateful Saga of a Waitress And a Hunter who must Outrace a Sumo Wrestler in Australia',2006,1,NULL,3,'2.99',84,'23.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(416,'HIGHBALL POTTER','A Action-Packed Saga of a Husband And a Dog who must Redeem a Database Administrator in The Sahara Desert',2006,1,NULL,6,'0.99',110,'10.99','R','Deleted Scenes','2006-02-15 05:03:42'),(417,'HILLS NEIGHBORS','A Epic Display of a Hunter And a Feminist who must Sink a Car in A U-Boat',2006,1,NULL,5,'0.99',93,'29.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(418,'HOBBIT ALIEN','A Emotional Drama of a Husband And a Girl who must Outgun a Composer in The First Manned Space Station',2006,1,NULL,5,'0.99',157,'27.99','PG-13','Commentaries','2006-02-15 05:03:42'),(419,'HOCUS FRIDA','A Awe-Inspiring Tale of a Girl And a Madman who must Outgun a Student in A Shark Tank',2006,1,NULL,4,'2.99',141,'19.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(420,'HOLES BRANNIGAN','A Fast-Paced Reflection of a Technical Writer And a Student who must Fight a Boy in The Canadian Rockies',2006,1,NULL,7,'4.99',128,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(421,'HOLIDAY GAMES','A Insightful Reflection of a Waitress And a Madman who must Pursue a Boy in Ancient Japan',2006,1,NULL,7,'4.99',78,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(422,'HOLLOW JEOPARDY','A Beautiful Character Study of a Robot And a Astronaut who must Overcome a Boat in A Monastery',2006,1,NULL,7,'4.99',136,'25.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(423,'HOLLYWOOD ANONYMOUS','A Fast-Paced Epistle of a Boy And a Explorer who must Escape a Dog in A U-Boat',2006,1,NULL,7,'0.99',69,'29.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(424,'HOLOCAUST HIGHBALL','A Awe-Inspiring Yarn of a Composer And a Man who must Find a Robot in Soviet Georgia',2006,1,NULL,6,'0.99',149,'12.99','R','Deleted Scenes','2006-02-15 05:03:42'),(425,'HOLY TADPOLE','A Action-Packed Display of a Feminist And a Pioneer who must Pursue a Dog in A Baloon Factory',2006,1,NULL,6,'0.99',88,'20.99','R','Behind the Scenes','2006-02-15 05:03:42'),(426,'HOME PITY','A Touching Panorama of a Man And a Secret Agent who must Challenge a Teacher in A MySQL Convention',2006,1,NULL,7,'4.99',185,'15.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(427,'HOMEWARD CIDER','A Taut Reflection of a Astronaut And a Squirrel who must Fight a Squirrel in A Manhattan Penthouse',2006,1,NULL,5,'0.99',103,'19.99','R','Trailers','2006-02-15 05:03:42'),(428,'HOMICIDE PEACH','A Astounding Documentary of a Hunter And a Boy who must Confront a Boy in A MySQL Convention',2006,1,NULL,6,'2.99',141,'21.99','PG-13','Commentaries','2006-02-15 05:03:42'),(429,'HONEY TIES','A Taut Story of a Waitress And a Crocodile who must Outrace a Lumberjack in A Shark Tank',2006,1,NULL,3,'0.99',84,'29.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(430,'HOOK CHARIOTS','A Insightful Story of a Boy And a Dog who must Redeem a Boy in Australia',2006,1,NULL,7,'0.99',49,'23.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(431,'HOOSIERS BIRDCAGE','A Astounding Display of a Explorer And a Boat who must Vanquish a Car in The First Manned Space Station',2006,1,NULL,3,'2.99',176,'12.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(432,'HOPE TOOTSIE','A Amazing Documentary of a Student And a Sumo Wrestler who must Outgun a A Shark in A Shark Tank',2006,1,NULL,4,'2.99',139,'22.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(433,'HORN WORKING','A Stunning Display of a Mad Scientist And a Technical Writer who must Succumb a Monkey in A Shark Tank',2006,1,NULL,4,'2.99',95,'23.99','PG','Trailers','2006-02-15 05:03:42'),(434,'HORROR REIGN','A Touching Documentary of a A Shark And a Car who must Build a Husband in Nigeria',2006,1,NULL,3,'0.99',139,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(435,'HOTEL HAPPINESS','A Thrilling Yarn of a Pastry Chef And a A Shark who must Challenge a Mad Scientist in The Outback',2006,1,NULL,6,'4.99',181,'28.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(436,'HOURS RAGE','A Fateful Story of a Explorer And a Feminist who must Meet a Technical Writer in Soviet Georgia',2006,1,NULL,4,'0.99',122,'14.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(437,'HOUSE DYNAMITE','A Taut Story of a Pioneer And a Squirrel who must Battle a Student in Soviet Georgia',2006,1,NULL,7,'2.99',109,'13.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(438,'HUMAN GRAFFITI','A Beautiful Reflection of a Womanizer And a Sumo Wrestler who must Chase a Database Administrator in The Gulf of Mexico',2006,1,NULL,3,'2.99',68,'22.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(439,'HUNCHBACK IMPOSSIBLE','A Touching Yarn of a Frisbee And a Dentist who must Fight a Composer in Ancient Japan',2006,1,NULL,4,'4.99',151,'28.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(440,'HUNGER ROOF','A Unbelieveable Yarn of a Student And a Database Administrator who must Outgun a Husband in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',105,'21.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(441,'HUNTER ALTER','A Emotional Drama of a Mad Cow And a Boat who must Redeem a Secret Agent in A Shark Tank',2006,1,NULL,5,'2.99',125,'21.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(442,'HUNTING MUSKETEERS','A Thrilling Reflection of a Pioneer And a Dentist who must Outrace a Womanizer in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',65,'24.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(443,'HURRICANE AFFAIR','A Lacklusture Epistle of a Database Administrator And a Woman who must Meet a Hunter in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',49,'11.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(444,'HUSTLER PARTY','A Emotional Reflection of a Sumo Wrestler And a Monkey who must Conquer a Robot in The Sahara Desert',2006,1,NULL,3,'4.99',83,'22.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(445,'HYDE DOCTOR','A Fanciful Documentary of a Boy And a Woman who must Redeem a Womanizer in A Jet Boat',2006,1,NULL,5,'2.99',100,'11.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(446,'HYSTERICAL GRAIL','A Amazing Saga of a Madman And a Dentist who must Build a Car in A Manhattan Penthouse',2006,1,NULL,5,'4.99',150,'19.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(447,'ICE CROSSING','A Fast-Paced Tale of a Butler And a Moose who must Overcome a Pioneer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',131,'28.99','R','Deleted Scenes','2006-02-15 05:03:42'),(448,'IDAHO LOVE','A Fast-Paced Drama of a Student And a Crocodile who must Meet a Database Administrator in The Outback',2006,1,NULL,3,'2.99',172,'25.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(449,'IDENTITY LOVER','A Boring Tale of a Composer And a Mad Cow who must Defeat a Car in The Outback',2006,1,NULL,4,'2.99',119,'12.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(450,'IDOLS SNATCHERS','A Insightful Drama of a Car And a Composer who must Fight a Man in A Monastery',2006,1,NULL,5,'2.99',84,'29.99','NC-17','Trailers','2006-02-15 05:03:42'),(451,'IGBY MAKER','A Epic Documentary of a Hunter And a Dog who must Outgun a Dog in A Baloon Factory',2006,1,NULL,7,'4.99',160,'12.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(452,'ILLUSION AMELIE','A Emotional Epistle of a Boat And a Mad Scientist who must Outrace a Robot in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',122,'15.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(453,'IMAGE PRINCESS','A Lacklusture Panorama of a Secret Agent And a Crocodile who must Discover a Madman in The Canadian Rockies',2006,1,NULL,3,'2.99',178,'17.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(454,'IMPACT ALADDIN','A Epic Character Study of a Frisbee And a Moose who must Outgun a Technical Writer in A Shark Tank',2006,1,NULL,6,'0.99',180,'20.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(455,'IMPOSSIBLE PREJUDICE','A Awe-Inspiring Yarn of a Monkey And a Hunter who must Chase a Teacher in Ancient China',2006,1,NULL,7,'4.99',103,'11.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(456,'INCH JET','A Fateful Saga of a Womanizer And a Student who must Defeat a Butler in A Monastery',2006,1,NULL,6,'4.99',167,'18.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(457,'INDEPENDENCE HOTEL','A Thrilling Tale of a Technical Writer And a Boy who must Face a Pioneer in A Monastery',2006,1,NULL,5,'0.99',157,'21.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(458,'INDIAN LOVE','A Insightful Saga of a Mad Scientist And a Mad Scientist who must Kill a Astronaut in An Abandoned Fun House',2006,1,NULL,4,'0.99',135,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(459,'INFORMER DOUBLE','A Action-Packed Display of a Woman And a Dentist who must Redeem a Forensic Psychologist in The Canadian Rockies',2006,1,NULL,4,'4.99',74,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(460,'INNOCENT USUAL','A Beautiful Drama of a Pioneer And a Crocodile who must Challenge a Student in The Outback',2006,1,NULL,3,'4.99',178,'26.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(461,'INSECTS STONE','A Epic Display of a Butler And a Dog who must Vanquish a Crocodile in A Manhattan Penthouse',2006,1,NULL,3,'0.99',123,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(462,'INSIDER ARIZONA','A Astounding Saga of a Mad Scientist And a Hunter who must Pursue a Robot in A Baloon Factory',2006,1,NULL,5,'2.99',78,'17.99','NC-17','Commentaries','2006-02-15 05:03:42'),(463,'INSTINCT AIRPORT','A Touching Documentary of a Mad Cow And a Explorer who must Confront a Butler in A Manhattan Penthouse',2006,1,NULL,4,'2.99',116,'21.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(464,'INTENTIONS EMPIRE','A Astounding Epistle of a Cat And a Cat who must Conquer a Mad Cow in A U-Boat',2006,1,NULL,3,'2.99',107,'13.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(465,'INTERVIEW LIAISONS','A Action-Packed Reflection of a Student And a Butler who must Discover a Database Administrator in A Manhattan Penthouse',2006,1,NULL,4,'4.99',59,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(466,'INTOLERABLE INTENTIONS','A Awe-Inspiring Story of a Monkey And a Pastry Chef who must Succumb a Womanizer in A MySQL Convention',2006,1,NULL,6,'4.99',63,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(467,'INTRIGUE WORST','A Fanciful Character Study of a Explorer And a Mad Scientist who must Vanquish a Squirrel in A Jet Boat',2006,1,NULL,6,'0.99',181,'10.99','G','Deleted Scenes','2006-02-15 05:03:42'),(468,'INVASION CYCLONE','A Lacklusture Character Study of a Mad Scientist And a Womanizer who must Outrace a Explorer in A Monastery',2006,1,NULL,5,'2.99',97,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(469,'IRON MOON','A Fast-Paced Documentary of a Mad Cow And a Boy who must Pursue a Dentist in A Baloon',2006,1,NULL,7,'4.99',46,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(470,'ISHTAR ROCKETEER','A Astounding Saga of a Dog And a Squirrel who must Conquer a Dog in An Abandoned Fun House',2006,1,NULL,4,'4.99',79,'24.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(471,'ISLAND EXORCIST','A Fanciful Panorama of a Technical Writer And a Boy who must Find a Dentist in An Abandoned Fun House',2006,1,NULL,7,'2.99',84,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(472,'ITALIAN AFRICAN','A Astounding Character Study of a Monkey And a Moose who must Outgun a Cat in A U-Boat',2006,1,NULL,3,'4.99',174,'24.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(473,'JACKET FRISCO','A Insightful Reflection of a Womanizer And a Husband who must Conquer a Pastry Chef in A Baloon',2006,1,NULL,5,'2.99',181,'16.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(474,'JADE BUNCH','A Insightful Panorama of a Squirrel And a Mad Cow who must Confront a Student in The First Manned Space Station',2006,1,NULL,6,'2.99',174,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(475,'JAPANESE RUN','A Awe-Inspiring Epistle of a Feminist And a Girl who must Sink a Girl in The Outback',2006,1,NULL,6,'0.99',135,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(476,'JASON TRAP','A Thoughtful Tale of a Woman And a A Shark who must Conquer a Dog in A Monastery',2006,1,NULL,5,'2.99',130,'9.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(477,'JAWBREAKER BROOKLYN','A Stunning Reflection of a Boat And a Pastry Chef who must Succumb a A Shark in A Jet Boat',2006,1,NULL,5,'0.99',118,'15.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(478,'JAWS HARRY','A Thrilling Display of a Database Administrator And a Monkey who must Overcome a Dog in An Abandoned Fun House',2006,1,NULL,4,'2.99',112,'10.99','G','Deleted Scenes','2006-02-15 05:03:42'),(479,'JEDI BENEATH','A Astounding Reflection of a Explorer And a Dentist who must Pursue a Student in Nigeria',2006,1,NULL,7,'0.99',128,'12.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(480,'JEEPERS WEDDING','A Astounding Display of a Composer And a Dog who must Kill a Pastry Chef in Soviet Georgia',2006,1,NULL,3,'2.99',84,'29.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(481,'JEKYLL FROGMEN','A Fanciful Epistle of a Student And a Astronaut who must Kill a Waitress in A Shark Tank',2006,1,NULL,4,'2.99',58,'22.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(482,'JEOPARDY ENCINO','A Boring Panorama of a Man And a Mad Cow who must Face a Explorer in Ancient India',2006,1,NULL,3,'0.99',102,'12.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(483,'JERICHO MULAN','A Amazing Yarn of a Hunter And a Butler who must Defeat a Boy in A Jet Boat',2006,1,NULL,3,'2.99',171,'29.99','NC-17','Commentaries','2006-02-15 05:03:42'),(484,'JERK PAYCHECK','A Touching Character Study of a Pastry Chef And a Database Administrator who must Reach a A Shark in Ancient Japan',2006,1,NULL,3,'2.99',172,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(485,'JERSEY SASSY','A Lacklusture Documentary of a Madman And a Mad Cow who must Find a Feminist in Ancient Japan',2006,1,NULL,6,'4.99',60,'16.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(486,'JET NEIGHBORS','A Amazing Display of a Lumberjack And a Teacher who must Outrace a Woman in A U-Boat',2006,1,NULL,7,'4.99',59,'14.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(487,'JINGLE SAGEBRUSH','A Epic Character Study of a Feminist And a Student who must Meet a Woman in A Baloon',2006,1,NULL,6,'4.99',124,'29.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(488,'JOON NORTHWEST','A Thrilling Panorama of a Technical Writer And a Car who must Discover a Forensic Psychologist in A Shark Tank',2006,1,NULL,3,'0.99',105,'23.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(489,'JUGGLER HARDLY','A Epic Story of a Mad Cow And a Astronaut who must Challenge a Car in California',2006,1,NULL,4,'0.99',54,'14.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(490,'JUMANJI BLADE','A Intrepid Yarn of a Husband And a Womanizer who must Pursue a Mad Scientist in New Orleans',2006,1,NULL,4,'2.99',121,'13.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(491,'JUMPING WRATH','A Touching Epistle of a Monkey And a Feminist who must Discover a Boat in Berlin',2006,1,NULL,4,'0.99',74,'18.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(492,'JUNGLE CLOSER','A Boring Character Study of a Boy And a Woman who must Battle a Astronaut in Australia',2006,1,NULL,6,'0.99',134,'11.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(493,'KANE EXORCIST','A Epic Documentary of a Composer And a Robot who must Overcome a Car in Berlin',2006,1,NULL,5,'0.99',92,'18.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(494,'KARATE MOON','A Astounding Yarn of a Womanizer And a Dog who must Reach a Waitress in A MySQL Convention',2006,1,NULL,4,'0.99',120,'21.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(495,'KENTUCKIAN GIANT','A Stunning Yarn of a Woman And a Frisbee who must Escape a Waitress in A U-Boat',2006,1,NULL,5,'2.99',169,'10.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(496,'KICK SAVANNAH','A Emotional Drama of a Monkey And a Robot who must Defeat a Monkey in New Orleans',2006,1,NULL,3,'0.99',179,'10.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(497,'KILL BROTHERHOOD','A Touching Display of a Hunter And a Secret Agent who must Redeem a Husband in The Outback',2006,1,NULL,4,'0.99',54,'15.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(498,'KILLER INNOCENT','A Fanciful Character Study of a Student And a Explorer who must Succumb a Composer in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',161,'11.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(499,'KING EVOLUTION','A Action-Packed Tale of a Boy And a Lumberjack who must Chase a Madman in A Baloon',2006,1,NULL,3,'4.99',184,'24.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(500,'KISS GLORY','A Lacklusture Reflection of a Girl And a Husband who must Find a Robot in The Canadian Rockies',2006,1,NULL,5,'4.99',163,'11.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(501,'KISSING DOLLS','A Insightful Reflection of a Pioneer And a Teacher who must Build a Composer in The First Manned Space Station',2006,1,NULL,3,'4.99',141,'9.99','R','Trailers','2006-02-15 05:03:42'),(502,'KNOCK WARLOCK','A Unbelieveable Story of a Teacher And a Boat who must Confront a Moose in A Baloon',2006,1,NULL,4,'2.99',71,'21.99','PG-13','Trailers','2006-02-15 05:03:42'),(503,'KRAMER CHOCOLATE','A Amazing Yarn of a Robot And a Pastry Chef who must Redeem a Mad Scientist in The Outback',2006,1,NULL,3,'2.99',171,'24.99','R','Trailers','2006-02-15 05:03:42'),(504,'KWAI HOMEWARD','A Amazing Drama of a Car And a Squirrel who must Pursue a Car in Soviet Georgia',2006,1,NULL,5,'0.99',46,'25.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(505,'LABYRINTH LEAGUE','A Awe-Inspiring Saga of a Composer And a Frisbee who must Succumb a Pioneer in The Sahara Desert',2006,1,NULL,6,'2.99',46,'24.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(506,'LADY STAGE','A Beautiful Character Study of a Woman And a Man who must Pursue a Explorer in A U-Boat',2006,1,NULL,4,'4.99',67,'14.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(507,'LADYBUGS ARMAGEDDON','A Fateful Reflection of a Dog And a Mad Scientist who must Meet a Mad Scientist in New Orleans',2006,1,NULL,4,'0.99',113,'13.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(508,'LAMBS CINCINATTI','A Insightful Story of a Man And a Feminist who must Fight a Composer in Australia',2006,1,NULL,6,'4.99',144,'18.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(509,'LANGUAGE COWBOY','A Epic Yarn of a Cat And a Madman who must Vanquish a Dentist in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',78,'26.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(510,'LAWLESS VISION','A Insightful Yarn of a Boy And a Sumo Wrestler who must Outgun a Car in The Outback',2006,1,NULL,6,'4.99',181,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(511,'LAWRENCE LOVE','A Fanciful Yarn of a Database Administrator And a Mad Cow who must Pursue a Womanizer in Berlin',2006,1,NULL,7,'0.99',175,'23.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(512,'LEAGUE HELLFIGHTERS','A Thoughtful Saga of a A Shark And a Monkey who must Outgun a Student in Ancient China',2006,1,NULL,5,'4.99',110,'25.99','PG-13','Trailers','2006-02-15 05:03:42'),(513,'LEATHERNECKS DWARFS','A Fateful Reflection of a Dog And a Mad Cow who must Outrace a Teacher in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',153,'21.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(514,'LEBOWSKI SOLDIERS','A Beautiful Epistle of a Secret Agent And a Pioneer who must Chase a Astronaut in Ancient China',2006,1,NULL,6,'2.99',69,'17.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(515,'LEGALLY SECRETARY','A Astounding Tale of a A Shark And a Moose who must Meet a Womanizer in The Sahara Desert',2006,1,NULL,7,'4.99',113,'14.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(516,'LEGEND JEDI','A Awe-Inspiring Epistle of a Pioneer And a Student who must Outgun a Crocodile in The Outback',2006,1,NULL,7,'0.99',59,'18.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(517,'LESSON CLEOPATRA','A Emotional Display of a Man And a Explorer who must Build a Boy in A Manhattan Penthouse',2006,1,NULL,3,'0.99',167,'28.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(518,'LIAISONS SWEET','A Boring Drama of a A Shark And a Explorer who must Redeem a Waitress in The Canadian Rockies',2006,1,NULL,5,'4.99',140,'15.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(519,'LIBERTY MAGNIFICENT','A Boring Drama of a Student And a Cat who must Sink a Technical Writer in A Baloon',2006,1,NULL,3,'2.99',138,'27.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(520,'LICENSE WEEKEND','A Insightful Story of a Man And a Husband who must Overcome a Madman in A Monastery',2006,1,NULL,7,'2.99',91,'28.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(521,'LIES TREATMENT','A Fast-Paced Character Study of a Dentist And a Moose who must Defeat a Composer in The First Manned Space Station',2006,1,NULL,7,'4.99',147,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(522,'LIFE TWISTED','A Thrilling Reflection of a Teacher And a Composer who must Find a Man in The First Manned Space Station',2006,1,NULL,4,'2.99',137,'9.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(523,'LIGHTS DEER','A Unbelieveable Epistle of a Dog And a Woman who must Confront a Moose in The Gulf of Mexico',2006,1,NULL,7,'0.99',174,'21.99','R','Commentaries','2006-02-15 05:03:42'),(524,'LION UNCUT','A Intrepid Display of a Pastry Chef And a Cat who must Kill a A Shark in Ancient China',2006,1,NULL,6,'0.99',50,'13.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(525,'LOATHING LEGALLY','A Boring Epistle of a Pioneer And a Mad Scientist who must Escape a Frisbee in The Gulf of Mexico',2006,1,NULL,4,'0.99',140,'29.99','R','Deleted Scenes','2006-02-15 05:03:42'),(526,'LOCK REAR','A Thoughtful Character Study of a Squirrel And a Technical Writer who must Outrace a Student in Ancient Japan',2006,1,NULL,7,'2.99',120,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(527,'LOLA AGENT','A Astounding Tale of a Mad Scientist And a Husband who must Redeem a Database Administrator in Ancient Japan',2006,1,NULL,4,'4.99',85,'24.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(528,'LOLITA WORLD','A Thrilling Drama of a Girl And a Robot who must Redeem a Waitress in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',155,'25.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(529,'LONELY ELEPHANT','A Intrepid Story of a Student And a Dog who must Challenge a Explorer in Soviet Georgia',2006,1,NULL,3,'2.99',67,'12.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(530,'LORD ARIZONA','A Action-Packed Display of a Frisbee And a Pastry Chef who must Pursue a Crocodile in A Jet Boat',2006,1,NULL,5,'2.99',108,'27.99','PG-13','Trailers','2006-02-15 05:03:42'),(531,'LOSE INCH','A Stunning Reflection of a Student And a Technical Writer who must Battle a Butler in The First Manned Space Station',2006,1,NULL,3,'0.99',137,'18.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(532,'LOSER HUSTLER','A Stunning Drama of a Robot And a Feminist who must Outgun a Butler in Nigeria',2006,1,NULL,5,'4.99',80,'28.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(533,'LOST BIRD','A Emotional Character Study of a Robot And a A Shark who must Defeat a Technical Writer in A Manhattan Penthouse',2006,1,NULL,4,'2.99',98,'21.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(534,'LOUISIANA HARRY','A Lacklusture Drama of a Girl And a Technical Writer who must Redeem a Monkey in A Shark Tank',2006,1,NULL,5,'0.99',70,'18.99','PG-13','Trailers','2006-02-15 05:03:42'),(535,'LOVE SUICIDES','A Brilliant Panorama of a Hunter And a Explorer who must Pursue a Dentist in An Abandoned Fun House',2006,1,NULL,6,'0.99',181,'21.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(536,'LOVELY JINGLE','A Fanciful Yarn of a Crocodile And a Forensic Psychologist who must Discover a Crocodile in The Outback',2006,1,NULL,3,'2.99',65,'18.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(537,'LOVER TRUMAN','A Emotional Yarn of a Robot And a Boy who must Outgun a Technical Writer in A U-Boat',2006,1,NULL,3,'2.99',75,'29.99','G','Trailers','2006-02-15 05:03:42'),(538,'LOVERBOY ATTACKS','A Boring Story of a Car And a Butler who must Build a Girl in Soviet Georgia',2006,1,NULL,7,'0.99',162,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(539,'LUCK OPUS','A Boring Display of a Moose And a Squirrel who must Outrace a Teacher in A Shark Tank',2006,1,NULL,7,'2.99',152,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(540,'LUCKY FLYING','A Lacklusture Character Study of a A Shark And a Man who must Find a Forensic Psychologist in A U-Boat',2006,1,NULL,7,'2.99',97,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(541,'LUKE MUMMY','A Taut Character Study of a Boy And a Robot who must Redeem a Mad Scientist in Ancient India',2006,1,NULL,5,'2.99',74,'21.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(542,'LUST LOCK','A Fanciful Panorama of a Hunter And a Dentist who must Meet a Secret Agent in The Sahara Desert',2006,1,NULL,3,'2.99',52,'28.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(543,'MADIGAN DORADO','A Astounding Character Study of a A Shark And a A Shark who must Discover a Crocodile in The Outback',2006,1,NULL,5,'4.99',116,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(544,'MADISON TRAP','A Awe-Inspiring Reflection of a Monkey And a Dentist who must Overcome a Pioneer in A U-Boat',2006,1,NULL,4,'2.99',147,'11.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(545,'MADNESS ATTACKS','A Fanciful Tale of a Squirrel And a Boat who must Defeat a Crocodile in The Gulf of Mexico',2006,1,NULL,4,'0.99',178,'14.99','PG-13','Trailers','2006-02-15 05:03:42'),(546,'MADRE GABLES','A Intrepid Panorama of a Sumo Wrestler And a Forensic Psychologist who must Discover a Moose in The First Manned Space Station',2006,1,NULL,7,'2.99',98,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(547,'MAGIC MALLRATS','A Touching Documentary of a Pastry Chef And a Pastry Chef who must Build a Mad Scientist in California',2006,1,NULL,3,'0.99',117,'19.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(548,'MAGNIFICENT CHITTY','A Insightful Story of a Teacher And a Hunter who must Face a Mad Cow in California',2006,1,NULL,3,'2.99',53,'27.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(549,'MAGNOLIA FORRESTER','A Thoughtful Documentary of a Composer And a Explorer who must Conquer a Dentist in New Orleans',2006,1,NULL,4,'0.99',171,'28.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(550,'MAGUIRE APACHE','A Fast-Paced Reflection of a Waitress And a Hunter who must Defeat a Forensic Psychologist in A Baloon',2006,1,NULL,6,'2.99',74,'22.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(551,'MAIDEN HOME','A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention',2006,1,NULL,3,'4.99',138,'9.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(552,'MAJESTIC FLOATS','A Thrilling Character Study of a Moose And a Student who must Escape a Butler in The First Manned Space Station',2006,1,NULL,5,'0.99',130,'15.99','PG','Trailers','2006-02-15 05:03:42'),(553,'MAKER GABLES','A Stunning Display of a Moose And a Database Administrator who must Pursue a Composer in A Jet Boat',2006,1,NULL,4,'0.99',136,'12.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(554,'MALKOVICH PET','A Intrepid Reflection of a Waitress And a A Shark who must Kill a Squirrel in The Outback',2006,1,NULL,6,'2.99',159,'22.99','G','Behind the Scenes','2006-02-15 05:03:42'),(555,'MALLRATS UNITED','A Thrilling Yarn of a Waitress And a Dentist who must Find a Hunter in A Monastery',2006,1,NULL,4,'0.99',133,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(556,'MALTESE HOPE','A Fast-Paced Documentary of a Crocodile And a Sumo Wrestler who must Conquer a Explorer in California',2006,1,NULL,6,'4.99',127,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(557,'MANCHURIAN CURTAIN','A Stunning Tale of a Mad Cow And a Boy who must Battle a Boy in Berlin',2006,1,NULL,5,'2.99',177,'27.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(558,'MANNEQUIN WORST','A Astounding Saga of a Mad Cow And a Pastry Chef who must Discover a Husband in Ancient India',2006,1,NULL,3,'2.99',71,'18.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(559,'MARRIED GO','A Fanciful Story of a Womanizer And a Dog who must Face a Forensic Psychologist in The Sahara Desert',2006,1,NULL,7,'2.99',114,'22.99','G','Behind the Scenes','2006-02-15 05:03:42'),(560,'MARS ROMAN','A Boring Drama of a Car And a Dog who must Succumb a Madman in Soviet Georgia',2006,1,NULL,6,'0.99',62,'21.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(561,'MASK PEACH','A Boring Character Study of a Student And a Robot who must Meet a Woman in California',2006,1,NULL,6,'2.99',123,'26.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(562,'MASKED BUBBLE','A Fanciful Documentary of a Pioneer And a Boat who must Pursue a Pioneer in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',151,'12.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(563,'MASSACRE USUAL','A Fateful Reflection of a Waitress And a Crocodile who must Challenge a Forensic Psychologist in California',2006,1,NULL,6,'4.99',165,'16.99','R','Commentaries','2006-02-15 05:03:42'),(564,'MASSAGE IMAGE','A Fateful Drama of a Frisbee And a Crocodile who must Vanquish a Dog in The First Manned Space Station',2006,1,NULL,4,'2.99',161,'11.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(565,'MATRIX SNOWMAN','A Action-Packed Saga of a Womanizer And a Woman who must Overcome a Student in California',2006,1,NULL,6,'4.99',56,'9.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(566,'MAUDE MOD','A Beautiful Documentary of a Forensic Psychologist And a Cat who must Reach a Astronaut in Nigeria',2006,1,NULL,6,'0.99',72,'20.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(567,'MEET CHOCOLATE','A Boring Documentary of a Dentist And a Butler who must Confront a Monkey in A MySQL Convention',2006,1,NULL,3,'2.99',80,'26.99','G','Trailers','2006-02-15 05:03:42'),(568,'MEMENTO ZOOLANDER','A Touching Epistle of a Squirrel And a Explorer who must Redeem a Pastry Chef in The Sahara Desert',2006,1,NULL,4,'4.99',77,'11.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(569,'MENAGERIE RUSHMORE','A Unbelieveable Panorama of a Composer And a Butler who must Overcome a Database Administrator in The First Manned Space Station',2006,1,NULL,7,'2.99',147,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(570,'MERMAID INSECTS','A Lacklusture Drama of a Waitress And a Husband who must Fight a Husband in California',2006,1,NULL,5,'4.99',104,'20.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(571,'METAL ARMAGEDDON','A Thrilling Display of a Lumberjack And a Crocodile who must Meet a Monkey in A Baloon Factory',2006,1,NULL,6,'2.99',161,'26.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(572,'METROPOLIS COMA','A Emotional Saga of a Database Administrator And a Pastry Chef who must Confront a Teacher in A Baloon Factory',2006,1,NULL,4,'2.99',64,'9.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(573,'MICROCOSMOS PARADISE','A Touching Character Study of a Boat And a Student who must Sink a A Shark in Nigeria',2006,1,NULL,6,'2.99',105,'22.99','PG-13','Commentaries','2006-02-15 05:03:42'),(574,'MIDNIGHT WESTWARD','A Taut Reflection of a Husband And a A Shark who must Redeem a Pastry Chef in A Monastery',2006,1,NULL,3,'0.99',86,'19.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(575,'MIDSUMMER GROUNDHOG','A Fateful Panorama of a Moose And a Dog who must Chase a Crocodile in Ancient Japan',2006,1,NULL,3,'4.99',48,'27.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(576,'MIGHTY LUCK','A Astounding Epistle of a Mad Scientist And a Pioneer who must Escape a Database Administrator in A MySQL Convention',2006,1,NULL,7,'2.99',122,'13.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(577,'MILE MULAN','A Lacklusture Epistle of a Cat And a Husband who must Confront a Boy in A MySQL Convention',2006,1,NULL,4,'0.99',64,'10.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(578,'MILLION ACE','A Brilliant Documentary of a Womanizer And a Squirrel who must Find a Technical Writer in The Sahara Desert',2006,1,NULL,4,'4.99',142,'16.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(579,'MINDS TRUMAN','A Taut Yarn of a Mad Scientist And a Crocodile who must Outgun a Database Administrator in A Monastery',2006,1,NULL,3,'4.99',149,'22.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(580,'MINE TITANS','A Amazing Yarn of a Robot And a Womanizer who must Discover a Forensic Psychologist in Berlin',2006,1,NULL,3,'4.99',166,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(581,'MINORITY KISS','A Insightful Display of a Lumberjack And a Sumo Wrestler who must Meet a Man in The Outback',2006,1,NULL,4,'0.99',59,'16.99','G','Trailers','2006-02-15 05:03:42'),(582,'MIRACLE VIRTUAL','A Touching Epistle of a Butler And a Boy who must Find a Mad Scientist in The Sahara Desert',2006,1,NULL,3,'2.99',162,'19.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(583,'MISSION ZOOLANDER','A Intrepid Story of a Sumo Wrestler And a Teacher who must Meet a A Shark in An Abandoned Fun House',2006,1,NULL,3,'4.99',164,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(584,'MIXED DOORS','A Taut Drama of a Womanizer And a Lumberjack who must Succumb a Pioneer in Ancient India',2006,1,NULL,6,'2.99',180,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(585,'MOB DUFFEL','A Unbelieveable Documentary of a Frisbee And a Boat who must Meet a Boy in The Canadian Rockies',2006,1,NULL,4,'0.99',105,'25.99','G','Trailers','2006-02-15 05:03:42'),(586,'MOCKINGBIRD HOLLYWOOD','A Thoughtful Panorama of a Man And a Car who must Sink a Composer in Berlin',2006,1,NULL,4,'0.99',60,'27.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(587,'MOD SECRETARY','A Boring Documentary of a Mad Cow And a Cat who must Build a Lumberjack in New Orleans',2006,1,NULL,6,'4.99',77,'20.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(588,'MODEL FISH','A Beautiful Panorama of a Boat And a Crocodile who must Outrace a Dog in Australia',2006,1,NULL,4,'4.99',175,'11.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(589,'MODERN DORADO','A Awe-Inspiring Story of a Butler And a Sumo Wrestler who must Redeem a Boy in New Orleans',2006,1,NULL,3,'0.99',74,'20.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(590,'MONEY HAROLD','A Touching Tale of a Explorer And a Boat who must Defeat a Robot in Australia',2006,1,NULL,3,'2.99',135,'17.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(591,'MONSOON CAUSE','A Astounding Tale of a Crocodile And a Car who must Outrace a Squirrel in A U-Boat',2006,1,NULL,6,'4.99',182,'20.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(592,'MONSTER SPARTACUS','A Fast-Paced Story of a Waitress And a Cat who must Fight a Girl in Australia',2006,1,NULL,6,'2.99',107,'28.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(593,'MONTEREY LABYRINTH','A Awe-Inspiring Drama of a Monkey And a Composer who must Escape a Feminist in A U-Boat',2006,1,NULL,6,'0.99',158,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(594,'MONTEZUMA COMMAND','A Thrilling Reflection of a Waitress And a Butler who must Battle a Butler in A Jet Boat',2006,1,NULL,6,'0.99',126,'22.99','NC-17','Trailers','2006-02-15 05:03:42'),(595,'MOON BUNCH','A Beautiful Tale of a Astronaut And a Mad Cow who must Challenge a Cat in A Baloon Factory',2006,1,NULL,7,'0.99',83,'20.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(596,'MOONSHINE CABIN','A Thoughtful Display of a Astronaut And a Feminist who must Chase a Frisbee in A Jet Boat',2006,1,NULL,4,'4.99',171,'25.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(597,'MOONWALKER FOOL','A Epic Drama of a Feminist And a Pioneer who must Sink a Composer in New Orleans',2006,1,NULL,5,'4.99',184,'12.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(598,'MOSQUITO ARMAGEDDON','A Thoughtful Character Study of a Waitress And a Feminist who must Build a Teacher in Ancient Japan',2006,1,NULL,6,'0.99',57,'22.99','G','Trailers','2006-02-15 05:03:42'),(599,'MOTHER OLEANDER','A Boring Tale of a Husband And a Boy who must Fight a Squirrel in Ancient China',2006,1,NULL,3,'0.99',103,'20.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(600,'MOTIONS DETAILS','A Awe-Inspiring Reflection of a Dog And a Student who must Kill a Car in An Abandoned Fun House',2006,1,NULL,5,'0.99',166,'16.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(601,'MOULIN WAKE','A Astounding Story of a Forensic Psychologist And a Cat who must Battle a Teacher in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',79,'20.99','PG-13','Trailers','2006-02-15 05:03:42'),(602,'MOURNING PURPLE','A Lacklusture Display of a Waitress And a Lumberjack who must Chase a Pioneer in New Orleans',2006,1,NULL,5,'0.99',146,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(603,'MOVIE SHAKESPEARE','A Insightful Display of a Database Administrator And a Student who must Build a Hunter in Berlin',2006,1,NULL,6,'4.99',53,'27.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(604,'MULAN MOON','A Emotional Saga of a Womanizer And a Pioneer who must Overcome a Dentist in A Baloon',2006,1,NULL,4,'0.99',160,'10.99','G','Behind the Scenes','2006-02-15 05:03:42'),(605,'MULHOLLAND BEAST','A Awe-Inspiring Display of a Husband And a Squirrel who must Battle a Sumo Wrestler in A Jet Boat',2006,1,NULL,7,'2.99',157,'13.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(606,'MUMMY CREATURES','A Fateful Character Study of a Crocodile And a Monkey who must Meet a Dentist in Australia',2006,1,NULL,3,'0.99',160,'15.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(607,'MUPPET MILE','A Lacklusture Story of a Madman And a Teacher who must Kill a Frisbee in The Gulf of Mexico',2006,1,NULL,5,'4.99',50,'18.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(608,'MURDER ANTITRUST','A Brilliant Yarn of a Car And a Database Administrator who must Escape a Boy in A MySQL Convention',2006,1,NULL,6,'2.99',166,'11.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(609,'MUSCLE BRIGHT','A Stunning Panorama of a Sumo Wrestler And a Husband who must Redeem a Madman in Ancient India',2006,1,NULL,7,'2.99',185,'23.99','G','Deleted Scenes','2006-02-15 05:03:42'),(610,'MUSIC BOONDOCK','A Thrilling Tale of a Butler And a Astronaut who must Battle a Explorer in The First Manned Space Station',2006,1,NULL,7,'0.99',129,'17.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(611,'MUSKETEERS WAIT','A Touching Yarn of a Student And a Moose who must Fight a Mad Cow in Australia',2006,1,NULL,7,'4.99',73,'17.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(612,'MUSSOLINI SPOILERS','A Thrilling Display of a Boat And a Monkey who must Meet a Composer in Ancient China',2006,1,NULL,6,'2.99',180,'10.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(613,'MYSTIC TRUMAN','A Epic Yarn of a Teacher And a Hunter who must Outgun a Explorer in Soviet Georgia',2006,1,NULL,5,'0.99',92,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(614,'NAME DETECTIVE','A Touching Saga of a Sumo Wrestler And a Cat who must Pursue a Mad Scientist in Nigeria',2006,1,NULL,5,'4.99',178,'11.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(615,'NASH CHOCOLAT','A Epic Reflection of a Monkey And a Mad Cow who must Kill a Forensic Psychologist in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',180,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(616,'NATIONAL STORY','A Taut Epistle of a Mad Scientist And a Girl who must Escape a Monkey in California',2006,1,NULL,4,'2.99',92,'19.99','NC-17','Trailers','2006-02-15 05:03:42'),(617,'NATURAL STOCK','A Fast-Paced Story of a Sumo Wrestler And a Girl who must Defeat a Car in A Baloon Factory',2006,1,NULL,4,'0.99',50,'24.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(618,'NECKLACE OUTBREAK','A Astounding Epistle of a Database Administrator And a Mad Scientist who must Pursue a Cat in California',2006,1,NULL,3,'0.99',132,'21.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(619,'NEIGHBORS CHARADE','A Fanciful Reflection of a Crocodile And a Astronaut who must Outrace a Feminist in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',161,'20.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(620,'NEMO CAMPUS','A Lacklusture Reflection of a Monkey And a Squirrel who must Outrace a Womanizer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',131,'23.99','NC-17','Trailers','2006-02-15 05:03:42'),(621,'NETWORK PEAK','A Unbelieveable Reflection of a Butler And a Boat who must Outgun a Mad Scientist in California',2006,1,NULL,5,'2.99',75,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(622,'NEWSIES STORY','A Action-Packed Character Study of a Dog And a Lumberjack who must Outrace a Moose in The Gulf of Mexico',2006,1,NULL,4,'0.99',159,'25.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(623,'NEWTON LABYRINTH','A Intrepid Character Study of a Moose And a Waitress who must Find a A Shark in Ancient India',2006,1,NULL,4,'0.99',75,'9.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(624,'NIGHTMARE CHILL','A Brilliant Display of a Robot And a Butler who must Fight a Waitress in An Abandoned Mine Shaft',2006,1,NULL,3,'4.99',149,'25.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(625,'NONE SPIKING','A Boring Reflection of a Secret Agent And a Astronaut who must Face a Composer in A Manhattan Penthouse',2006,1,NULL,3,'0.99',83,'18.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(626,'NOON PAPI','A Unbelieveable Character Study of a Mad Scientist And a Astronaut who must Find a Pioneer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',57,'12.99','G','Behind the Scenes','2006-02-15 05:03:42'),(627,'NORTH TEQUILA','A Beautiful Character Study of a Mad Cow And a Robot who must Reach a Womanizer in New Orleans',2006,1,NULL,4,'4.99',67,'9.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(628,'NORTHWEST POLISH','A Boring Character Study of a Boy And a A Shark who must Outrace a Womanizer in The Outback',2006,1,NULL,5,'2.99',172,'24.99','PG','Trailers','2006-02-15 05:03:42'),(629,'NOTORIOUS REUNION','A Amazing Epistle of a Woman And a Squirrel who must Fight a Hunter in A Baloon',2006,1,NULL,7,'0.99',128,'9.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(630,'NOTTING SPEAKEASY','A Thoughtful Display of a Butler And a Womanizer who must Find a Waitress in The Canadian Rockies',2006,1,NULL,7,'0.99',48,'19.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(631,'NOVOCAINE FLIGHT','A Fanciful Display of a Student And a Teacher who must Outgun a Crocodile in Nigeria',2006,1,NULL,4,'0.99',64,'11.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(632,'NUTS TIES','A Thoughtful Drama of a Explorer And a Womanizer who must Meet a Teacher in California',2006,1,NULL,5,'4.99',145,'10.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(633,'OCTOBER SUBMARINE','A Taut Epistle of a Monkey And a Boy who must Confront a Husband in A Jet Boat',2006,1,NULL,6,'4.99',54,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(634,'ODDS BOOGIE','A Thrilling Yarn of a Feminist And a Madman who must Battle a Hunter in Berlin',2006,1,NULL,6,'0.99',48,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(635,'OKLAHOMA JUMANJI','A Thoughtful Drama of a Dentist And a Womanizer who must Meet a Husband in The Sahara Desert',2006,1,NULL,7,'0.99',58,'15.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(636,'OLEANDER CLUE','A Boring Story of a Teacher And a Monkey who must Succumb a Forensic Psychologist in A Jet Boat',2006,1,NULL,5,'0.99',161,'12.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(637,'OPEN AFRICAN','A Lacklusture Drama of a Secret Agent And a Explorer who must Discover a Car in A U-Boat',2006,1,NULL,7,'4.99',131,'16.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(638,'OPERATION OPERATION','A Intrepid Character Study of a Man And a Frisbee who must Overcome a Madman in Ancient China',2006,1,NULL,7,'2.99',156,'23.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(639,'OPPOSITE NECKLACE','A Fateful Epistle of a Crocodile And a Moose who must Kill a Explorer in Nigeria',2006,1,NULL,7,'4.99',92,'9.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(640,'OPUS ICE','A Fast-Paced Drama of a Hunter And a Boy who must Discover a Feminist in The Sahara Desert',2006,1,NULL,5,'4.99',102,'21.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(641,'ORANGE GRAPES','A Astounding Documentary of a Butler And a Womanizer who must Face a Dog in A U-Boat',2006,1,NULL,4,'0.99',76,'21.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(642,'ORDER BETRAYED','A Amazing Saga of a Dog And a A Shark who must Challenge a Cat in The Sahara Desert',2006,1,NULL,7,'2.99',120,'13.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(643,'ORIENT CLOSER','A Astounding Epistle of a Technical Writer And a Teacher who must Fight a Squirrel in The Sahara Desert',2006,1,NULL,3,'2.99',118,'22.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(644,'OSCAR GOLD','A Insightful Tale of a Database Administrator And a Dog who must Face a Madman in Soviet Georgia',2006,1,NULL,7,'2.99',115,'29.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(645,'OTHERS SOUP','A Lacklusture Documentary of a Mad Cow And a Madman who must Sink a Moose in The Gulf of Mexico',2006,1,NULL,7,'2.99',118,'18.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(646,'OUTBREAK DIVINE','A Unbelieveable Yarn of a Database Administrator And a Woman who must Succumb a A Shark in A U-Boat',2006,1,NULL,6,'0.99',169,'12.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(647,'OUTFIELD MASSACRE','A Thoughtful Drama of a Husband And a Secret Agent who must Pursue a Database Administrator in Ancient India',2006,1,NULL,4,'0.99',129,'18.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(648,'OUTLAW HANKY','A Thoughtful Story of a Astronaut And a Composer who must Conquer a Dog in The Sahara Desert',2006,1,NULL,7,'4.99',148,'17.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(649,'OZ LIAISONS','A Epic Yarn of a Mad Scientist And a Cat who must Confront a Womanizer in A Baloon Factory',2006,1,NULL,4,'2.99',85,'14.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(650,'PACIFIC AMISTAD','A Thrilling Yarn of a Dog And a Moose who must Kill a Pastry Chef in A Manhattan Penthouse',2006,1,NULL,3,'0.99',144,'27.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(651,'PACKER MADIGAN','A Epic Display of a Sumo Wrestler And a Forensic Psychologist who must Build a Woman in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',84,'20.99','PG-13','Trailers','2006-02-15 05:03:42'),(652,'PAJAMA JAWBREAKER','A Emotional Drama of a Boy And a Technical Writer who must Redeem a Sumo Wrestler in California',2006,1,NULL,3,'0.99',126,'14.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(653,'PANIC CLUB','A Fanciful Display of a Teacher And a Crocodile who must Succumb a Girl in A Baloon',2006,1,NULL,3,'4.99',102,'15.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(654,'PANKY SUBMARINE','A Touching Documentary of a Dentist And a Sumo Wrestler who must Overcome a Boy in The Gulf of Mexico',2006,1,NULL,4,'4.99',93,'19.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(655,'PANTHER REDS','A Brilliant Panorama of a Moose And a Man who must Reach a Teacher in The Gulf of Mexico',2006,1,NULL,5,'4.99',109,'22.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(656,'PAPI NECKLACE','A Fanciful Display of a Car And a Monkey who must Escape a Squirrel in Ancient Japan',2006,1,NULL,3,'0.99',128,'9.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(657,'PARADISE SABRINA','A Intrepid Yarn of a Car And a Moose who must Outrace a Crocodile in A Manhattan Penthouse',2006,1,NULL,5,'2.99',48,'12.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(658,'PARIS WEEKEND','A Intrepid Story of a Squirrel And a Crocodile who must Defeat a Monkey in The Outback',2006,1,NULL,7,'2.99',121,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(659,'PARK CITIZEN','A Taut Epistle of a Sumo Wrestler And a Girl who must Face a Husband in Ancient Japan',2006,1,NULL,3,'4.99',109,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(660,'PARTY KNOCK','A Fateful Display of a Technical Writer And a Butler who must Battle a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',107,'11.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(661,'PAST SUICIDES','A Intrepid Tale of a Madman And a Astronaut who must Challenge a Hunter in A Monastery',2006,1,NULL,5,'4.99',157,'17.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(662,'PATHS CONTROL','A Astounding Documentary of a Butler And a Cat who must Find a Frisbee in Ancient China',2006,1,NULL,3,'4.99',118,'9.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(663,'PATIENT SISTER','A Emotional Epistle of a Squirrel And a Robot who must Confront a Lumberjack in Soviet Georgia',2006,1,NULL,7,'0.99',99,'29.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(664,'PATRIOT ROMAN','A Taut Saga of a Robot And a Database Administrator who must Challenge a Astronaut in California',2006,1,NULL,6,'2.99',65,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(665,'PATTON INTERVIEW','A Thrilling Documentary of a Composer And a Secret Agent who must Succumb a Cat in Berlin',2006,1,NULL,4,'2.99',175,'22.99','PG','Commentaries','2006-02-15 05:03:42'),(666,'PAYCHECK WAIT','A Awe-Inspiring Reflection of a Boy And a Man who must Discover a Moose in The Sahara Desert',2006,1,NULL,4,'4.99',145,'27.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(667,'PEACH INNOCENT','A Action-Packed Drama of a Monkey And a Dentist who must Chase a Butler in Berlin',2006,1,NULL,3,'2.99',160,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(668,'PEAK FOREVER','A Insightful Reflection of a Boat And a Secret Agent who must Vanquish a Astronaut in An Abandoned Mine Shaft',2006,1,NULL,7,'4.99',80,'25.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(669,'PEARL DESTINY','A Lacklusture Yarn of a Astronaut And a Pastry Chef who must Sink a Dog in A U-Boat',2006,1,NULL,3,'2.99',74,'10.99','NC-17','Trailers','2006-02-15 05:03:42'),(670,'PELICAN COMFORTS','A Epic Documentary of a Boy And a Monkey who must Pursue a Astronaut in Berlin',2006,1,NULL,4,'4.99',48,'17.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(671,'PERDITION FARGO','A Fast-Paced Story of a Car And a Cat who must Outgun a Hunter in Berlin',2006,1,NULL,7,'4.99',99,'27.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(672,'PERFECT GROOVE','A Thrilling Yarn of a Dog And a Dog who must Build a Husband in A Baloon',2006,1,NULL,7,'2.99',82,'17.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(673,'PERSONAL LADYBUGS','A Epic Saga of a Hunter And a Technical Writer who must Conquer a Cat in Ancient Japan',2006,1,NULL,3,'0.99',118,'19.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(674,'PET HAUNTING','A Unbelieveable Reflection of a Explorer And a Boat who must Conquer a Woman in California',2006,1,NULL,3,'0.99',99,'11.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(675,'PHANTOM GLORY','A Beautiful Documentary of a Astronaut And a Crocodile who must Discover a Madman in A Monastery',2006,1,NULL,6,'2.99',60,'17.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(676,'PHILADELPHIA WIFE','A Taut Yarn of a Hunter And a Astronaut who must Conquer a Database Administrator in The Sahara Desert',2006,1,NULL,7,'4.99',137,'16.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(677,'PIANIST OUTFIELD','A Intrepid Story of a Boy And a Technical Writer who must Pursue a Lumberjack in A Monastery',2006,1,NULL,6,'0.99',136,'25.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(678,'PICKUP DRIVING','A Touching Documentary of a Husband And a Boat who must Meet a Pastry Chef in A Baloon Factory',2006,1,NULL,3,'2.99',77,'23.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(679,'PILOT HOOSIERS','A Awe-Inspiring Reflection of a Crocodile And a Sumo Wrestler who must Meet a Forensic Psychologist in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',50,'17.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(680,'PINOCCHIO SIMON','A Action-Packed Reflection of a Mad Scientist And a A Shark who must Find a Feminist in California',2006,1,NULL,4,'4.99',103,'21.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(681,'PIRATES ROXANNE','A Stunning Drama of a Woman And a Lumberjack who must Overcome a A Shark in The Canadian Rockies',2006,1,NULL,4,'0.99',100,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(682,'PITTSBURGH HUNCHBACK','A Thrilling Epistle of a Boy And a Boat who must Find a Student in Soviet Georgia',2006,1,NULL,4,'4.99',134,'17.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(683,'PITY BOUND','A Boring Panorama of a Feminist And a Moose who must Defeat a Database Administrator in Nigeria',2006,1,NULL,5,'4.99',60,'19.99','NC-17','Commentaries','2006-02-15 05:03:42'),(684,'PIZZA JUMANJI','A Epic Saga of a Cat And a Squirrel who must Outgun a Robot in A U-Boat',2006,1,NULL,4,'2.99',173,'11.99','NC-17','Commentaries','2006-02-15 05:03:42'),(685,'PLATOON INSTINCT','A Thrilling Panorama of a Man And a Woman who must Reach a Woman in Australia',2006,1,NULL,6,'4.99',132,'10.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(686,'PLUTO OLEANDER','A Action-Packed Reflection of a Car And a Moose who must Outgun a Car in A Shark Tank',2006,1,NULL,5,'4.99',84,'9.99','R','Behind the Scenes','2006-02-15 05:03:42'),(687,'POCUS PULP','A Intrepid Yarn of a Frisbee And a Dog who must Build a Astronaut in A Baloon Factory',2006,1,NULL,6,'0.99',138,'15.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(688,'POLISH BROOKLYN','A Boring Character Study of a Database Administrator And a Lumberjack who must Reach a Madman in The Outback',2006,1,NULL,6,'0.99',61,'12.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(689,'POLLOCK DELIVERANCE','A Intrepid Story of a Madman And a Frisbee who must Outgun a Boat in The Sahara Desert',2006,1,NULL,5,'2.99',137,'14.99','PG','Commentaries','2006-02-15 05:03:42'),(690,'POND SEATTLE','A Stunning Drama of a Teacher And a Boat who must Battle a Feminist in Ancient China',2006,1,NULL,7,'2.99',185,'25.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(691,'POSEIDON FOREVER','A Thoughtful Epistle of a Womanizer And a Monkey who must Vanquish a Dentist in A Monastery',2006,1,NULL,6,'4.99',159,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(692,'POTLUCK MIXED','A Beautiful Story of a Dog And a Technical Writer who must Outgun a Student in A Baloon',2006,1,NULL,3,'2.99',179,'10.99','G','Behind the Scenes','2006-02-15 05:03:42'),(693,'POTTER CONNECTICUT','A Thrilling Epistle of a Frisbee And a Cat who must Fight a Technical Writer in Berlin',2006,1,NULL,5,'2.99',115,'16.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(694,'PREJUDICE OLEANDER','A Epic Saga of a Boy And a Dentist who must Outrace a Madman in A U-Boat',2006,1,NULL,6,'4.99',98,'15.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(695,'PRESIDENT BANG','A Fateful Panorama of a Technical Writer And a Moose who must Battle a Robot in Soviet Georgia',2006,1,NULL,6,'4.99',144,'12.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(696,'PRIDE ALAMO','A Thoughtful Drama of a A Shark And a Forensic Psychologist who must Vanquish a Student in Ancient India',2006,1,NULL,6,'0.99',114,'20.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(697,'PRIMARY GLASS','A Fateful Documentary of a Pastry Chef And a Butler who must Build a Dog in The Canadian Rockies',2006,1,NULL,7,'0.99',53,'16.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(698,'PRINCESS GIANT','A Thrilling Yarn of a Pastry Chef And a Monkey who must Battle a Monkey in A Shark Tank',2006,1,NULL,3,'2.99',71,'29.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(699,'PRIVATE DROP','A Stunning Story of a Technical Writer And a Hunter who must Succumb a Secret Agent in A Baloon',2006,1,NULL,7,'4.99',106,'26.99','PG','Trailers','2006-02-15 05:03:42'),(700,'PRIX UNDEFEATED','A Stunning Saga of a Mad Scientist And a Boat who must Overcome a Dentist in Ancient China',2006,1,NULL,4,'2.99',115,'13.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(701,'PSYCHO SHRUNK','A Amazing Panorama of a Crocodile And a Explorer who must Fight a Husband in Nigeria',2006,1,NULL,5,'2.99',155,'11.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(702,'PULP BEVERLY','A Unbelieveable Display of a Dog And a Crocodile who must Outrace a Man in Nigeria',2006,1,NULL,4,'2.99',89,'12.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(703,'PUNK DIVORCE','A Fast-Paced Tale of a Pastry Chef And a Boat who must Face a Frisbee in The Canadian Rockies',2006,1,NULL,6,'4.99',100,'18.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(704,'PURE RUNNER','A Thoughtful Documentary of a Student And a Madman who must Challenge a Squirrel in A Manhattan Penthouse',2006,1,NULL,3,'2.99',121,'25.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(705,'PURPLE MOVIE','A Boring Display of a Pastry Chef And a Sumo Wrestler who must Discover a Frisbee in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',88,'9.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(706,'QUEEN LUKE','A Astounding Story of a Girl And a Boy who must Challenge a Composer in New Orleans',2006,1,NULL,5,'4.99',163,'22.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(707,'QUEST MUSSOLINI','A Fateful Drama of a Husband And a Sumo Wrestler who must Battle a Pastry Chef in A Baloon Factory',2006,1,NULL,5,'2.99',177,'29.99','R','Behind the Scenes','2006-02-15 05:03:42'),(708,'QUILLS BULL','A Thoughtful Story of a Pioneer And a Woman who must Reach a Moose in Australia',2006,1,NULL,4,'4.99',112,'19.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(709,'RACER EGG','A Emotional Display of a Monkey And a Waitress who must Reach a Secret Agent in California',2006,1,NULL,7,'2.99',147,'19.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(710,'RAGE GAMES','A Fast-Paced Saga of a Astronaut And a Secret Agent who must Escape a Hunter in An Abandoned Amusement Park',2006,1,NULL,4,'4.99',120,'18.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(711,'RAGING AIRPLANE','A Astounding Display of a Secret Agent And a Technical Writer who must Escape a Mad Scientist in A Jet Boat',2006,1,NULL,4,'4.99',154,'18.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(712,'RAIDERS ANTITRUST','A Amazing Drama of a Teacher And a Feminist who must Meet a Woman in The First Manned Space Station',2006,1,NULL,4,'0.99',82,'11.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(713,'RAINBOW SHOCK','A Action-Packed Story of a Hunter And a Boy who must Discover a Lumberjack in Ancient India',2006,1,NULL,3,'4.99',74,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(714,'RANDOM GO','A Fateful Drama of a Frisbee And a Student who must Confront a Cat in A Shark Tank',2006,1,NULL,6,'2.99',73,'29.99','NC-17','Trailers','2006-02-15 05:03:42'),(715,'RANGE MOONWALKER','A Insightful Documentary of a Hunter And a Dentist who must Confront a Crocodile in A Baloon',2006,1,NULL,3,'4.99',147,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(716,'REAP UNFAITHFUL','A Thrilling Epistle of a Composer And a Sumo Wrestler who must Challenge a Mad Cow in A MySQL Convention',2006,1,NULL,6,'2.99',136,'26.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(717,'REAR TRADING','A Awe-Inspiring Reflection of a Forensic Psychologist And a Secret Agent who must Succumb a Pastry Chef in Soviet Georgia',2006,1,NULL,6,'0.99',97,'23.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(718,'REBEL AIRPORT','A Intrepid Yarn of a Database Administrator And a Boat who must Outrace a Husband in Ancient India',2006,1,NULL,7,'0.99',73,'24.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(719,'RECORDS ZORRO','A Amazing Drama of a Mad Scientist And a Composer who must Build a Husband in The Outback',2006,1,NULL,7,'4.99',182,'11.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(720,'REDEMPTION COMFORTS','A Emotional Documentary of a Dentist And a Woman who must Battle a Mad Scientist in Ancient China',2006,1,NULL,3,'2.99',179,'20.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(721,'REDS POCUS','A Lacklusture Yarn of a Sumo Wrestler And a Squirrel who must Redeem a Monkey in Soviet Georgia',2006,1,NULL,7,'4.99',182,'23.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(722,'REEF SALUTE','A Action-Packed Saga of a Teacher And a Lumberjack who must Battle a Dentist in A Baloon',2006,1,NULL,5,'0.99',123,'26.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(723,'REIGN GENTLEMEN','A Emotional Yarn of a Composer And a Man who must Escape a Butler in The Gulf of Mexico',2006,1,NULL,3,'2.99',82,'29.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(724,'REMEMBER DIARY','A Insightful Tale of a Technical Writer And a Waitress who must Conquer a Monkey in Ancient India',2006,1,NULL,5,'2.99',110,'15.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(725,'REQUIEM TYCOON','A Unbelieveable Character Study of a Cat And a Database Administrator who must Pursue a Teacher in A Monastery',2006,1,NULL,6,'4.99',167,'25.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(726,'RESERVOIR ADAPTATION','A Intrepid Drama of a Teacher And a Moose who must Kill a Car in California',2006,1,NULL,7,'2.99',61,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(727,'RESURRECTION SILVERADO','A Epic Yarn of a Robot And a Explorer who must Challenge a Girl in A MySQL Convention',2006,1,NULL,6,'0.99',117,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(728,'REUNION WITCHES','A Unbelieveable Documentary of a Database Administrator And a Frisbee who must Redeem a Mad Scientist in A Baloon Factory',2006,1,NULL,3,'0.99',63,'26.99','R','Commentaries','2006-02-15 05:03:42'),(729,'RIDER CADDYSHACK','A Taut Reflection of a Monkey And a Womanizer who must Chase a Moose in Nigeria',2006,1,NULL,5,'2.99',177,'28.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(730,'RIDGEMONT SUBMARINE','A Unbelieveable Drama of a Waitress And a Composer who must Sink a Mad Cow in Ancient Japan',2006,1,NULL,3,'0.99',46,'28.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(731,'RIGHT CRANES','A Fateful Character Study of a Boat And a Cat who must Find a Database Administrator in A Jet Boat',2006,1,NULL,7,'4.99',153,'29.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(732,'RINGS HEARTBREAKERS','A Amazing Yarn of a Sumo Wrestler And a Boat who must Conquer a Waitress in New Orleans',2006,1,NULL,5,'0.99',58,'17.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(733,'RIVER OUTLAW','A Thrilling Character Study of a Squirrel And a Lumberjack who must Face a Hunter in A MySQL Convention',2006,1,NULL,4,'0.99',149,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(734,'ROAD ROXANNE','A Boring Character Study of a Waitress And a Astronaut who must Fight a Crocodile in Ancient Japan',2006,1,NULL,4,'4.99',158,'12.99','R','Behind the Scenes','2006-02-15 05:03:42'),(735,'ROBBERS JOON','A Thoughtful Story of a Mad Scientist And a Waitress who must Confront a Forensic Psychologist in Soviet Georgia',2006,1,NULL,7,'2.99',102,'26.99','PG-13','Commentaries','2006-02-15 05:03:42'),(736,'ROBBERY BRIGHT','A Taut Reflection of a Robot And a Squirrel who must Fight a Boat in Ancient Japan',2006,1,NULL,4,'0.99',134,'21.99','R','Trailers','2006-02-15 05:03:42'),(737,'ROCK INSTINCT','A Astounding Character Study of a Robot And a Moose who must Overcome a Astronaut in Ancient India',2006,1,NULL,4,'0.99',102,'28.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(738,'ROCKETEER MOTHER','A Awe-Inspiring Character Study of a Robot And a Sumo Wrestler who must Discover a Womanizer in A Shark Tank',2006,1,NULL,3,'0.99',178,'27.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(739,'ROCKY WAR','A Fast-Paced Display of a Squirrel And a Explorer who must Outgun a Mad Scientist in Nigeria',2006,1,NULL,4,'4.99',145,'17.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(740,'ROLLERCOASTER BRINGING','A Beautiful Drama of a Robot And a Lumberjack who must Discover a Technical Writer in A Shark Tank',2006,1,NULL,5,'2.99',153,'13.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(741,'ROMAN PUNK','A Thoughtful Panorama of a Mad Cow And a Student who must Battle a Forensic Psychologist in Berlin',2006,1,NULL,7,'0.99',81,'28.99','NC-17','Trailers','2006-02-15 05:03:42'),(742,'ROOF CHAMPION','A Lacklusture Reflection of a Car And a Explorer who must Find a Monkey in A Baloon',2006,1,NULL,7,'0.99',101,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(743,'ROOM ROMAN','A Awe-Inspiring Panorama of a Composer And a Secret Agent who must Sink a Composer in A Shark Tank',2006,1,NULL,7,'0.99',60,'27.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(744,'ROOTS REMEMBER','A Brilliant Drama of a Mad Cow And a Hunter who must Escape a Hunter in Berlin',2006,1,NULL,4,'0.99',89,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(745,'ROSES TREASURE','A Astounding Panorama of a Monkey And a Secret Agent who must Defeat a Woman in The First Manned Space Station',2006,1,NULL,5,'4.99',162,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(746,'ROUGE SQUAD','A Awe-Inspiring Drama of a Astronaut And a Frisbee who must Conquer a Mad Scientist in Australia',2006,1,NULL,3,'0.99',118,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(747,'ROXANNE REBEL','A Astounding Story of a Pastry Chef And a Database Administrator who must Fight a Man in The Outback',2006,1,NULL,5,'0.99',171,'9.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(748,'RUGRATS SHAKESPEARE','A Touching Saga of a Crocodile And a Crocodile who must Discover a Technical Writer in Nigeria',2006,1,NULL,4,'0.99',109,'16.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(749,'RULES HUMAN','A Beautiful Epistle of a Astronaut And a Student who must Confront a Monkey in An Abandoned Fun House',2006,1,NULL,6,'4.99',153,'19.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(750,'RUN PACIFIC','A Touching Tale of a Cat And a Pastry Chef who must Conquer a Pastry Chef in A MySQL Convention',2006,1,NULL,3,'0.99',145,'25.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(751,'RUNAWAY TENENBAUMS','A Thoughtful Documentary of a Boat And a Man who must Meet a Boat in An Abandoned Fun House',2006,1,NULL,6,'0.99',181,'17.99','NC-17','Commentaries','2006-02-15 05:03:42'),(752,'RUNNER MADIGAN','A Thoughtful Documentary of a Crocodile And a Robot who must Outrace a Womanizer in The Outback',2006,1,NULL,6,'0.99',101,'27.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(753,'RUSH GOODFELLAS','A Emotional Display of a Man And a Dentist who must Challenge a Squirrel in Australia',2006,1,NULL,3,'0.99',48,'20.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(754,'RUSHMORE MERMAID','A Boring Story of a Woman And a Moose who must Reach a Husband in A Shark Tank',2006,1,NULL,6,'2.99',150,'17.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(755,'SABRINA MIDNIGHT','A Emotional Story of a Squirrel And a Crocodile who must Succumb a Husband in The Sahara Desert',2006,1,NULL,5,'4.99',99,'11.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(756,'SADDLE ANTITRUST','A Stunning Epistle of a Feminist And a A Shark who must Battle a Woman in An Abandoned Fun House',2006,1,NULL,7,'2.99',80,'10.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(757,'SAGEBRUSH CLUELESS','A Insightful Story of a Lumberjack And a Hunter who must Kill a Boy in Ancient Japan',2006,1,NULL,4,'2.99',106,'28.99','G','Trailers','2006-02-15 05:03:42'),(758,'SAINTS BRIDE','A Fateful Tale of a Technical Writer And a Composer who must Pursue a Explorer in The Gulf of Mexico',2006,1,NULL,5,'2.99',125,'11.99','G','Deleted Scenes','2006-02-15 05:03:42'),(759,'SALUTE APOLLO','A Awe-Inspiring Character Study of a Boy And a Feminist who must Sink a Crocodile in Ancient China',2006,1,NULL,4,'2.99',73,'29.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(760,'SAMURAI LION','A Fast-Paced Story of a Pioneer And a Astronaut who must Reach a Boat in A Baloon',2006,1,NULL,5,'2.99',110,'21.99','G','Commentaries','2006-02-15 05:03:42'),(761,'SANTA PARIS','A Emotional Documentary of a Moose And a Car who must Redeem a Mad Cow in A Baloon Factory',2006,1,NULL,7,'2.99',154,'23.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(762,'SASSY PACKER','A Fast-Paced Documentary of a Dog And a Teacher who must Find a Moose in A Manhattan Penthouse',2006,1,NULL,6,'0.99',154,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(763,'SATISFACTION CONFIDENTIAL','A Lacklusture Yarn of a Dentist And a Butler who must Meet a Secret Agent in Ancient China',2006,1,NULL,3,'4.99',75,'26.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(764,'SATURDAY LAMBS','A Thoughtful Reflection of a Mad Scientist And a Moose who must Kill a Husband in A Baloon',2006,1,NULL,3,'4.99',150,'28.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(765,'SATURN NAME','A Fateful Epistle of a Butler And a Boy who must Redeem a Teacher in Berlin',2006,1,NULL,7,'4.99',182,'18.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(766,'SAVANNAH TOWN','A Awe-Inspiring Tale of a Astronaut And a Database Administrator who must Chase a Secret Agent in The Gulf of Mexico',2006,1,NULL,5,'0.99',84,'25.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(767,'SCALAWAG DUCK','A Fateful Reflection of a Car And a Teacher who must Confront a Waitress in A Monastery',2006,1,NULL,6,'4.99',183,'13.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(768,'SCARFACE BANG','A Emotional Yarn of a Teacher And a Girl who must Find a Teacher in A Baloon Factory',2006,1,NULL,3,'4.99',102,'11.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(769,'SCHOOL JACKET','A Intrepid Yarn of a Monkey And a Boy who must Fight a Composer in A Manhattan Penthouse',2006,1,NULL,5,'4.99',151,'21.99','PG-13','Trailers','2006-02-15 05:03:42'),(770,'SCISSORHANDS SLUMS','A Awe-Inspiring Drama of a Girl And a Technical Writer who must Meet a Feminist in The Canadian Rockies',2006,1,NULL,5,'2.99',147,'13.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(771,'SCORPION APOLLO','A Awe-Inspiring Documentary of a Technical Writer And a Husband who must Meet a Monkey in An Abandoned Fun House',2006,1,NULL,3,'4.99',137,'23.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(772,'SEA VIRGIN','A Fast-Paced Documentary of a Technical Writer And a Pastry Chef who must Escape a Moose in A U-Boat',2006,1,NULL,4,'2.99',80,'24.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(773,'SEABISCUIT PUNK','A Insightful Saga of a Man And a Forensic Psychologist who must Discover a Mad Cow in A MySQL Convention',2006,1,NULL,6,'2.99',112,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(774,'SEARCHERS WAIT','A Fast-Paced Tale of a Car And a Mad Scientist who must Kill a Womanizer in Ancient Japan',2006,1,NULL,3,'2.99',182,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(775,'SEATTLE EXPECATIONS','A Insightful Reflection of a Crocodile And a Sumo Wrestler who must Meet a Technical Writer in The Sahara Desert',2006,1,NULL,4,'4.99',110,'18.99','PG-13','Trailers','2006-02-15 05:03:42'),(776,'SECRET GROUNDHOG','A Astounding Story of a Cat And a Database Administrator who must Build a Technical Writer in New Orleans',2006,1,NULL,6,'4.99',90,'11.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(777,'SECRETARY ROUGE','A Action-Packed Panorama of a Mad Cow And a Composer who must Discover a Robot in A Baloon Factory',2006,1,NULL,5,'4.99',158,'10.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(778,'SECRETS PARADISE','A Fateful Saga of a Cat And a Frisbee who must Kill a Girl in A Manhattan Penthouse',2006,1,NULL,3,'4.99',109,'24.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(779,'SENSE GREEK','A Taut Saga of a Lumberjack And a Pastry Chef who must Escape a Sumo Wrestler in An Abandoned Fun House',2006,1,NULL,4,'4.99',54,'23.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(780,'SENSIBILITY REAR','A Emotional Tale of a Robot And a Sumo Wrestler who must Redeem a Pastry Chef in A Baloon Factory',2006,1,NULL,7,'4.99',98,'15.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(781,'SEVEN SWARM','A Unbelieveable Character Study of a Dog And a Mad Cow who must Kill a Monkey in Berlin',2006,1,NULL,4,'4.99',127,'15.99','R','Deleted Scenes','2006-02-15 05:03:42'),(782,'SHAKESPEARE SADDLE','A Fast-Paced Panorama of a Lumberjack And a Database Administrator who must Defeat a Madman in A MySQL Convention',2006,1,NULL,6,'2.99',60,'26.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(783,'SHANE DARKNESS','A Action-Packed Saga of a Moose And a Lumberjack who must Find a Woman in Berlin',2006,1,NULL,5,'2.99',93,'22.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(784,'SHANGHAI TYCOON','A Fast-Paced Character Study of a Crocodile And a Lumberjack who must Build a Husband in An Abandoned Fun House',2006,1,NULL,7,'2.99',47,'20.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(785,'SHAWSHANK BUBBLE','A Lacklusture Story of a Moose And a Monkey who must Confront a Butler in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',80,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(786,'SHEPHERD MIDSUMMER','A Thoughtful Drama of a Robot And a Womanizer who must Kill a Lumberjack in A Baloon',2006,1,NULL,7,'0.99',113,'14.99','R','Deleted Scenes','2006-02-15 05:03:42'),(787,'SHINING ROSES','A Awe-Inspiring Character Study of a Astronaut And a Forensic Psychologist who must Challenge a Madman in Ancient India',2006,1,NULL,4,'0.99',125,'12.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(788,'SHIP WONDERLAND','A Thrilling Saga of a Monkey And a Frisbee who must Escape a Explorer in The Outback',2006,1,NULL,5,'2.99',104,'15.99','R','Commentaries','2006-02-15 05:03:42'),(789,'SHOCK CABIN','A Fateful Tale of a Mad Cow And a Crocodile who must Meet a Husband in New Orleans',2006,1,NULL,7,'2.99',79,'15.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(790,'SHOOTIST SUPERFLY','A Fast-Paced Story of a Crocodile And a A Shark who must Sink a Pioneer in Berlin',2006,1,NULL,6,'0.99',67,'22.99','PG-13','Trailers','2006-02-15 05:03:42'),(791,'SHOW LORD','A Fanciful Saga of a Student And a Girl who must Find a Butler in Ancient Japan',2006,1,NULL,3,'4.99',167,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(792,'SHREK LICENSE','A Fateful Yarn of a Secret Agent And a Feminist who must Find a Feminist in A Jet Boat',2006,1,NULL,7,'2.99',154,'15.99','PG-13','Commentaries','2006-02-15 05:03:42'),(793,'SHRUNK DIVINE','A Fateful Character Study of a Waitress And a Technical Writer who must Battle a Hunter in A Baloon',2006,1,NULL,6,'2.99',139,'14.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(794,'SIDE ARK','A Stunning Panorama of a Crocodile And a Womanizer who must Meet a Feminist in The Canadian Rockies',2006,1,NULL,5,'0.99',52,'28.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(795,'SIEGE MADRE','A Boring Tale of a Frisbee And a Crocodile who must Vanquish a Moose in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',111,'23.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(796,'SIERRA DIVIDE','A Emotional Character Study of a Frisbee And a Mad Scientist who must Build a Madman in California',2006,1,NULL,3,'0.99',135,'12.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(797,'SILENCE KANE','A Emotional Drama of a Sumo Wrestler And a Dentist who must Confront a Sumo Wrestler in A Baloon',2006,1,NULL,7,'0.99',67,'23.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(798,'SILVERADO GOLDFINGER','A Stunning Epistle of a Sumo Wrestler And a Man who must Challenge a Waitress in Ancient India',2006,1,NULL,4,'4.99',74,'11.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(799,'SIMON NORTH','A Thrilling Documentary of a Technical Writer And a A Shark who must Face a Pioneer in A Shark Tank',2006,1,NULL,3,'0.99',51,'26.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(800,'SINNERS ATLANTIS','A Epic Display of a Dog And a Boat who must Succumb a Mad Scientist in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',126,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(801,'SISTER FREDDY','A Stunning Saga of a Butler And a Woman who must Pursue a Explorer in Australia',2006,1,NULL,5,'4.99',152,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(802,'SKY MIRACLE','A Epic Drama of a Mad Scientist And a Explorer who must Succumb a Waitress in An Abandoned Fun House',2006,1,NULL,7,'2.99',132,'15.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(803,'SLACKER LIAISONS','A Fast-Paced Tale of a A Shark And a Student who must Meet a Crocodile in Ancient China',2006,1,NULL,7,'4.99',179,'29.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(804,'SLEEPING SUSPECTS','A Stunning Reflection of a Sumo Wrestler And a Explorer who must Sink a Frisbee in A MySQL Convention',2006,1,NULL,7,'4.99',129,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(805,'SLEEPLESS MONSOON','A Amazing Saga of a Moose And a Pastry Chef who must Escape a Butler in Australia',2006,1,NULL,5,'4.99',64,'12.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(806,'SLEEPY JAPANESE','A Emotional Epistle of a Moose And a Composer who must Fight a Technical Writer in The Outback',2006,1,NULL,4,'2.99',137,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(807,'SLEUTH ORIENT','A Fateful Character Study of a Husband And a Dog who must Find a Feminist in Ancient India',2006,1,NULL,4,'0.99',87,'25.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(808,'SLING LUKE','A Intrepid Character Study of a Robot And a Monkey who must Reach a Secret Agent in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',84,'10.99','R','Behind the Scenes','2006-02-15 05:03:42'),(809,'SLIPPER FIDELITY','A Taut Reflection of a Secret Agent And a Man who must Redeem a Explorer in A MySQL Convention',2006,1,NULL,5,'0.99',156,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(810,'SLUMS DUCK','A Amazing Character Study of a Teacher And a Database Administrator who must Defeat a Waitress in A Jet Boat',2006,1,NULL,5,'0.99',147,'21.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(811,'SMILE EARRING','A Intrepid Drama of a Teacher And a Butler who must Build a Pastry Chef in Berlin',2006,1,NULL,4,'2.99',60,'29.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(812,'SMOKING BARBARELLA','A Lacklusture Saga of a Mad Cow And a Mad Scientist who must Sink a Cat in A MySQL Convention',2006,1,NULL,7,'0.99',50,'13.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(813,'SMOOCHY CONTROL','A Thrilling Documentary of a Husband And a Feminist who must Face a Mad Scientist in Ancient China',2006,1,NULL,7,'0.99',184,'18.99','R','Behind the Scenes','2006-02-15 05:03:42'),(814,'SNATCH SLIPPER','A Insightful Panorama of a Woman And a Feminist who must Defeat a Forensic Psychologist in Berlin',2006,1,NULL,6,'4.99',110,'15.99','PG','Commentaries','2006-02-15 05:03:42'),(815,'SNATCHERS MONTEZUMA','A Boring Epistle of a Sumo Wrestler And a Woman who must Escape a Man in The Canadian Rockies',2006,1,NULL,4,'2.99',74,'14.99','PG-13','Commentaries','2006-02-15 05:03:42'),(816,'SNOWMAN ROLLERCOASTER','A Fateful Display of a Lumberjack And a Girl who must Succumb a Mad Cow in A Manhattan Penthouse',2006,1,NULL,3,'0.99',62,'27.99','G','Trailers','2006-02-15 05:03:42'),(817,'SOLDIERS EVOLUTION','A Lacklusture Panorama of a A Shark And a Pioneer who must Confront a Student in The First Manned Space Station',2006,1,NULL,7,'4.99',185,'27.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(818,'SOMETHING DUCK','A Boring Character Study of a Car And a Husband who must Outgun a Frisbee in The First Manned Space Station',2006,1,NULL,4,'4.99',180,'17.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(819,'SONG HEDWIG','A Amazing Documentary of a Man And a Husband who must Confront a Squirrel in A MySQL Convention',2006,1,NULL,3,'0.99',165,'29.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(820,'SONS INTERVIEW','A Taut Character Study of a Explorer And a Mad Cow who must Battle a Hunter in Ancient China',2006,1,NULL,3,'2.99',184,'11.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(821,'SORORITY QUEEN','A Fast-Paced Display of a Squirrel And a Composer who must Fight a Forensic Psychologist in A Jet Boat',2006,1,NULL,6,'0.99',184,'17.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(822,'SOUP WISDOM','A Fast-Paced Display of a Robot And a Butler who must Defeat a Butler in A MySQL Convention',2006,1,NULL,6,'0.99',169,'12.99','R','Behind the Scenes','2006-02-15 05:03:42'),(823,'SOUTH WAIT','A Amazing Documentary of a Car And a Robot who must Escape a Lumberjack in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',143,'21.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(824,'SPARTACUS CHEAPER','A Thrilling Panorama of a Pastry Chef And a Secret Agent who must Overcome a Student in A Manhattan Penthouse',2006,1,NULL,4,'4.99',52,'19.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(825,'SPEAKEASY DATE','A Lacklusture Drama of a Forensic Psychologist And a Car who must Redeem a Man in A Manhattan Penthouse',2006,1,NULL,6,'2.99',165,'22.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(826,'SPEED SUIT','A Brilliant Display of a Frisbee And a Mad Scientist who must Succumb a Robot in Ancient China',2006,1,NULL,7,'4.99',124,'19.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(827,'SPICE SORORITY','A Fateful Display of a Pioneer And a Hunter who must Defeat a Husband in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',141,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(828,'SPIKING ELEMENT','A Lacklusture Epistle of a Dentist And a Technical Writer who must Find a Dog in A Monastery',2006,1,NULL,7,'2.99',79,'12.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(829,'SPINAL ROCKY','A Lacklusture Epistle of a Sumo Wrestler And a Squirrel who must Defeat a Explorer in California',2006,1,NULL,7,'2.99',138,'12.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(830,'SPIRIT FLINTSTONES','A Brilliant Yarn of a Cat And a Car who must Confront a Explorer in Ancient Japan',2006,1,NULL,7,'0.99',149,'23.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(831,'SPIRITED CASUALTIES','A Taut Story of a Waitress And a Man who must Face a Car in A Baloon Factory',2006,1,NULL,5,'0.99',138,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(832,'SPLASH GUMP','A Taut Saga of a Crocodile And a Boat who must Conquer a Hunter in A Shark Tank',2006,1,NULL,5,'0.99',175,'16.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(833,'SPLENDOR PATTON','A Taut Story of a Dog And a Explorer who must Find a Astronaut in Berlin',2006,1,NULL,5,'0.99',134,'20.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(834,'SPOILERS HELLFIGHTERS','A Fanciful Story of a Technical Writer And a Squirrel who must Defeat a Dog in The Gulf of Mexico',2006,1,NULL,4,'0.99',151,'26.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(835,'SPY MILE','A Thrilling Documentary of a Feminist And a Feminist who must Confront a Feminist in A Baloon',2006,1,NULL,6,'2.99',112,'13.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(836,'SQUAD FISH','A Fast-Paced Display of a Pastry Chef And a Dog who must Kill a Teacher in Berlin',2006,1,NULL,3,'2.99',136,'14.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(837,'STAGE WORLD','A Lacklusture Panorama of a Woman And a Frisbee who must Chase a Crocodile in A Jet Boat',2006,1,NULL,4,'2.99',85,'19.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(838,'STAGECOACH ARMAGEDDON','A Touching Display of a Pioneer And a Butler who must Chase a Car in California',2006,1,NULL,5,'4.99',112,'25.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(839,'STALLION SUNDANCE','A Fast-Paced Tale of a Car And a Dog who must Outgun a A Shark in Australia',2006,1,NULL,5,'0.99',130,'23.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(840,'STAMPEDE DISTURBING','A Unbelieveable Tale of a Woman And a Lumberjack who must Fight a Frisbee in A U-Boat',2006,1,NULL,5,'0.99',75,'26.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(841,'STAR OPERATION','A Insightful Character Study of a Girl And a Car who must Pursue a Mad Cow in A Shark Tank',2006,1,NULL,5,'2.99',181,'9.99','PG','Commentaries','2006-02-15 05:03:42'),(842,'STATE WASTELAND','A Beautiful Display of a Cat And a Pastry Chef who must Outrace a Mad Cow in A Jet Boat',2006,1,NULL,4,'2.99',113,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(843,'STEEL SANTA','A Fast-Paced Yarn of a Composer And a Frisbee who must Face a Moose in Nigeria',2006,1,NULL,4,'4.99',143,'15.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(844,'STEERS ARMAGEDDON','A Stunning Character Study of a Car And a Girl who must Succumb a Car in A MySQL Convention',2006,1,NULL,6,'4.99',140,'16.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(845,'STEPMOM DREAM','A Touching Epistle of a Crocodile And a Teacher who must Build a Forensic Psychologist in A MySQL Convention',2006,1,NULL,7,'4.99',48,'9.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(846,'STING PERSONAL','A Fanciful Drama of a Frisbee And a Dog who must Fight a Madman in A Jet Boat',2006,1,NULL,3,'4.99',93,'9.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(847,'STOCK GLASS','A Boring Epistle of a Crocodile And a Lumberjack who must Outgun a Moose in Ancient China',2006,1,NULL,7,'2.99',160,'10.99','PG','Commentaries','2006-02-15 05:03:42'),(848,'STONE FIRE','A Intrepid Drama of a Astronaut And a Crocodile who must Find a Boat in Soviet Georgia',2006,1,NULL,3,'0.99',94,'19.99','G','Trailers','2006-02-15 05:03:42'),(849,'STORM HAPPINESS','A Insightful Drama of a Feminist And a A Shark who must Vanquish a Boat in A Shark Tank',2006,1,NULL,6,'0.99',57,'28.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(850,'STORY SIDE','A Lacklusture Saga of a Boy And a Cat who must Sink a Dentist in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',163,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(851,'STRAIGHT HOURS','A Boring Panorama of a Secret Agent And a Girl who must Sink a Waitress in The Outback',2006,1,NULL,3,'0.99',151,'19.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(852,'STRANGELOVE DESIRE','A Awe-Inspiring Panorama of a Lumberjack And a Waitress who must Defeat a Crocodile in An Abandoned Amusement Park',2006,1,NULL,4,'0.99',103,'27.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(853,'STRANGER STRANGERS','A Awe-Inspiring Yarn of a Womanizer And a Explorer who must Fight a Woman in The First Manned Space Station',2006,1,NULL,3,'4.99',139,'12.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(854,'STRANGERS GRAFFITI','A Brilliant Character Study of a Secret Agent And a Man who must Find a Cat in The Gulf of Mexico',2006,1,NULL,4,'4.99',119,'22.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(855,'STREAK RIDGEMONT','A Astounding Character Study of a Hunter And a Waitress who must Sink a Man in New Orleans',2006,1,NULL,7,'0.99',132,'28.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(856,'STREETCAR INTENTIONS','A Insightful Character Study of a Waitress And a Crocodile who must Sink a Waitress in The Gulf of Mexico',2006,1,NULL,5,'4.99',73,'11.99','R','Commentaries','2006-02-15 05:03:42'),(857,'STRICTLY SCARFACE','A Touching Reflection of a Crocodile And a Dog who must Chase a Hunter in An Abandoned Fun House',2006,1,NULL,3,'2.99',144,'24.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(858,'SUBMARINE BED','A Amazing Display of a Car And a Monkey who must Fight a Teacher in Soviet Georgia',2006,1,NULL,5,'4.99',127,'21.99','R','Trailers','2006-02-15 05:03:42'),(859,'SUGAR WONKA','A Touching Story of a Dentist And a Database Administrator who must Conquer a Astronaut in An Abandoned Amusement Park',2006,1,NULL,3,'4.99',114,'20.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(860,'SUICIDES SILENCE','A Emotional Character Study of a Car And a Girl who must Face a Composer in A U-Boat',2006,1,NULL,4,'4.99',93,'13.99','G','Deleted Scenes','2006-02-15 05:03:42'),(861,'SUIT WALLS','A Touching Panorama of a Lumberjack And a Frisbee who must Build a Dog in Australia',2006,1,NULL,3,'4.99',111,'12.99','R','Commentaries','2006-02-15 05:03:42'),(862,'SUMMER SCARFACE','A Emotional Panorama of a Lumberjack And a Hunter who must Meet a Girl in A Shark Tank',2006,1,NULL,5,'0.99',53,'25.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(863,'SUN CONFESSIONS','A Beautiful Display of a Mad Cow And a Dog who must Redeem a Waitress in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',141,'9.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(864,'SUNDANCE INVASION','A Epic Drama of a Lumberjack And a Explorer who must Confront a Hunter in A Baloon Factory',2006,1,NULL,5,'0.99',92,'21.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(865,'SUNRISE LEAGUE','A Beautiful Epistle of a Madman And a Butler who must Face a Crocodile in A Manhattan Penthouse',2006,1,NULL,3,'4.99',135,'19.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(866,'SUNSET RACER','A Awe-Inspiring Reflection of a Astronaut And a A Shark who must Defeat a Forensic Psychologist in California',2006,1,NULL,6,'0.99',48,'28.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(867,'SUPER WYOMING','A Action-Packed Saga of a Pastry Chef And a Explorer who must Discover a A Shark in The Outback',2006,1,NULL,5,'4.99',58,'10.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(868,'SUPERFLY TRIP','A Beautiful Saga of a Lumberjack And a Teacher who must Build a Technical Writer in An Abandoned Fun House',2006,1,NULL,5,'0.99',114,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(869,'SUSPECTS QUILLS','A Emotional Epistle of a Pioneer And a Crocodile who must Battle a Man in A Manhattan Penthouse',2006,1,NULL,4,'2.99',47,'22.99','PG','Trailers','2006-02-15 05:03:42'),(870,'SWARM GOLD','A Insightful Panorama of a Crocodile And a Boat who must Conquer a Sumo Wrestler in A MySQL Convention',2006,1,NULL,4,'0.99',123,'12.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(871,'SWEDEN SHINING','A Taut Documentary of a Car And a Robot who must Conquer a Boy in The Canadian Rockies',2006,1,NULL,6,'4.99',176,'19.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(872,'SWEET BROTHERHOOD','A Unbelieveable Epistle of a Sumo Wrestler And a Hunter who must Chase a Forensic Psychologist in A Baloon',2006,1,NULL,3,'2.99',185,'27.99','R','Deleted Scenes','2006-02-15 05:03:42'),(873,'SWEETHEARTS SUSPECTS','A Brilliant Character Study of a Frisbee And a Sumo Wrestler who must Confront a Woman in The Gulf of Mexico',2006,1,NULL,3,'0.99',108,'13.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(874,'TADPOLE PARK','A Beautiful Tale of a Frisbee And a Moose who must Vanquish a Dog in An Abandoned Amusement Park',2006,1,NULL,6,'2.99',155,'13.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(875,'TALENTED HOMICIDE','A Lacklusture Panorama of a Dentist And a Forensic Psychologist who must Outrace a Pioneer in A U-Boat',2006,1,NULL,6,'0.99',173,'9.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(876,'TARZAN VIDEOTAPE','A Fast-Paced Display of a Lumberjack And a Mad Scientist who must Succumb a Sumo Wrestler in The Sahara Desert',2006,1,NULL,3,'2.99',91,'11.99','PG-13','Trailers','2006-02-15 05:03:42'),(877,'TAXI KICK','A Amazing Epistle of a Girl And a Woman who must Outrace a Waitress in Soviet Georgia',2006,1,NULL,4,'0.99',64,'23.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(878,'TEEN APOLLO','A Awe-Inspiring Drama of a Dog And a Man who must Escape a Robot in A Shark Tank',2006,1,NULL,3,'4.99',74,'25.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(879,'TELEGRAPH VOYAGE','A Fateful Yarn of a Husband And a Dog who must Battle a Waitress in A Jet Boat',2006,1,NULL,3,'4.99',148,'20.99','PG','Commentaries','2006-02-15 05:03:42'),(880,'TELEMARK HEARTBREAKERS','A Action-Packed Panorama of a Technical Writer And a Man who must Build a Forensic Psychologist in A Manhattan Penthouse',2006,1,NULL,6,'2.99',152,'9.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(881,'TEMPLE ATTRACTION','A Action-Packed Saga of a Forensic Psychologist And a Woman who must Battle a Womanizer in Soviet Georgia',2006,1,NULL,5,'4.99',71,'13.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(882,'TENENBAUMS COMMAND','A Taut Display of a Pioneer And a Man who must Reach a Girl in The Gulf of Mexico',2006,1,NULL,4,'0.99',99,'24.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(883,'TEQUILA PAST','A Action-Packed Panorama of a Mad Scientist And a Robot who must Challenge a Student in Nigeria',2006,1,NULL,6,'4.99',53,'17.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(884,'TERMINATOR CLUB','A Touching Story of a Crocodile And a Girl who must Sink a Man in The Gulf of Mexico',2006,1,NULL,5,'4.99',88,'11.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(885,'TEXAS WATCH','A Awe-Inspiring Yarn of a Student And a Teacher who must Fight a Teacher in An Abandoned Amusement Park',2006,1,NULL,7,'0.99',179,'22.99','NC-17','Trailers','2006-02-15 05:03:42'),(886,'THEORY MERMAID','A Fateful Yarn of a Composer And a Monkey who must Vanquish a Womanizer in The First Manned Space Station',2006,1,NULL,5,'0.99',184,'9.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(887,'THIEF PELICAN','A Touching Documentary of a Madman And a Mad Scientist who must Outrace a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',135,'28.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(888,'THIN SAGEBRUSH','A Emotional Drama of a Husband And a Lumberjack who must Build a Cat in Ancient India',2006,1,NULL,5,'4.99',53,'9.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(889,'TIES HUNGER','A Insightful Saga of a Astronaut And a Explorer who must Pursue a Mad Scientist in A U-Boat',2006,1,NULL,3,'4.99',111,'28.99','R','Deleted Scenes','2006-02-15 05:03:42'),(890,'TIGHTS DAWN','A Thrilling Epistle of a Boat And a Secret Agent who must Face a Boy in A Baloon',2006,1,NULL,5,'0.99',172,'14.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(891,'TIMBERLAND SKY','A Boring Display of a Man And a Dog who must Redeem a Girl in A U-Boat',2006,1,NULL,3,'0.99',69,'13.99','G','Commentaries','2006-02-15 05:03:42'),(892,'TITANIC BOONDOCK','A Brilliant Reflection of a Feminist And a Dog who must Fight a Boy in A Baloon Factory',2006,1,NULL,3,'4.99',104,'18.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(893,'TITANS JERK','A Unbelieveable Panorama of a Feminist And a Sumo Wrestler who must Challenge a Technical Writer in Ancient China',2006,1,NULL,4,'4.99',91,'11.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(894,'TOMATOES HELLFIGHTERS','A Thoughtful Epistle of a Madman And a Astronaut who must Overcome a Monkey in A Shark Tank',2006,1,NULL,6,'0.99',68,'23.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(895,'TOMORROW HUSTLER','A Thoughtful Story of a Moose And a Husband who must Face a Secret Agent in The Sahara Desert',2006,1,NULL,3,'2.99',142,'21.99','R','Commentaries','2006-02-15 05:03:42'),(896,'TOOTSIE PILOT','A Awe-Inspiring Documentary of a Womanizer And a Pastry Chef who must Kill a Lumberjack in Berlin',2006,1,NULL,3,'0.99',157,'10.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(897,'TORQUE BOUND','A Emotional Display of a Crocodile And a Husband who must Reach a Man in Ancient Japan',2006,1,NULL,3,'4.99',179,'27.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(898,'TOURIST PELICAN','A Boring Story of a Butler And a Astronaut who must Outrace a Pioneer in Australia',2006,1,NULL,4,'4.99',152,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(899,'TOWERS HURRICANE','A Fateful Display of a Monkey And a Car who must Sink a Husband in A MySQL Convention',2006,1,NULL,7,'0.99',144,'14.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(900,'TOWN ARK','A Awe-Inspiring Documentary of a Moose And a Madman who must Meet a Dog in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',136,'17.99','R','Behind the Scenes','2006-02-15 05:03:42'),(901,'TRACY CIDER','A Touching Reflection of a Database Administrator And a Madman who must Build a Lumberjack in Nigeria',2006,1,NULL,3,'0.99',142,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(902,'TRADING PINOCCHIO','A Emotional Character Study of a Student And a Explorer who must Discover a Frisbee in The First Manned Space Station',2006,1,NULL,6,'4.99',170,'22.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(903,'TRAFFIC HOBBIT','A Amazing Epistle of a Squirrel And a Lumberjack who must Succumb a Database Administrator in A U-Boat',2006,1,NULL,5,'4.99',139,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(904,'TRAIN BUNCH','A Thrilling Character Study of a Robot And a Squirrel who must Face a Dog in Ancient India',2006,1,NULL,3,'4.99',71,'26.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(905,'TRAINSPOTTING STRANGERS','A Fast-Paced Drama of a Pioneer And a Mad Cow who must Challenge a Madman in Ancient Japan',2006,1,NULL,7,'4.99',132,'10.99','PG-13','Trailers','2006-02-15 05:03:42'),(906,'TRAMP OTHERS','A Brilliant Display of a Composer And a Cat who must Succumb a A Shark in Ancient India',2006,1,NULL,4,'0.99',171,'27.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(907,'TRANSLATION SUMMER','A Touching Reflection of a Man And a Monkey who must Pursue a Womanizer in A MySQL Convention',2006,1,NULL,4,'0.99',168,'10.99','PG-13','Trailers','2006-02-15 05:03:42'),(908,'TRAP GUYS','A Unbelieveable Story of a Boy And a Mad Cow who must Challenge a Database Administrator in The Sahara Desert',2006,1,NULL,3,'4.99',110,'11.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(909,'TREASURE COMMAND','A Emotional Saga of a Car And a Madman who must Discover a Pioneer in California',2006,1,NULL,3,'0.99',102,'28.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(910,'TREATMENT JEKYLL','A Boring Story of a Teacher And a Student who must Outgun a Cat in An Abandoned Mine Shaft',2006,1,NULL,3,'0.99',87,'19.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(911,'TRIP NEWTON','A Fanciful Character Study of a Lumberjack And a Car who must Discover a Cat in An Abandoned Amusement Park',2006,1,NULL,7,'4.99',64,'14.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(912,'TROJAN TOMORROW','A Astounding Panorama of a Husband And a Sumo Wrestler who must Pursue a Boat in Ancient India',2006,1,NULL,3,'2.99',52,'9.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(913,'TROOPERS METAL','A Fanciful Drama of a Monkey And a Feminist who must Sink a Man in Berlin',2006,1,NULL,3,'0.99',115,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(914,'TROUBLE DATE','A Lacklusture Panorama of a Forensic Psychologist And a Woman who must Kill a Explorer in Ancient Japan',2006,1,NULL,6,'2.99',61,'13.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(915,'TRUMAN CRAZY','A Thrilling Epistle of a Moose And a Boy who must Meet a Database Administrator in A Monastery',2006,1,NULL,7,'4.99',92,'9.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(916,'TURN STAR','A Stunning Tale of a Man And a Monkey who must Chase a Student in New Orleans',2006,1,NULL,3,'2.99',80,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(917,'TUXEDO MILE','A Boring Drama of a Man And a Forensic Psychologist who must Face a Frisbee in Ancient India',2006,1,NULL,3,'2.99',152,'24.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(918,'TWISTED PIRATES','A Touching Display of a Frisbee And a Boat who must Kill a Girl in A MySQL Convention',2006,1,NULL,4,'4.99',152,'23.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(919,'TYCOON GATHERING','A Emotional Display of a Husband And a A Shark who must Succumb a Madman in A Manhattan Penthouse',2006,1,NULL,3,'4.99',82,'17.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(920,'UNBREAKABLE KARATE','A Amazing Character Study of a Robot And a Student who must Chase a Robot in Australia',2006,1,NULL,3,'0.99',62,'16.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(921,'UNCUT SUICIDES','A Intrepid Yarn of a Explorer And a Pastry Chef who must Pursue a Mad Cow in A U-Boat',2006,1,NULL,7,'2.99',172,'29.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(922,'UNDEFEATED DALMATIONS','A Unbelieveable Display of a Crocodile And a Feminist who must Overcome a Moose in An Abandoned Amusement Park',2006,1,NULL,7,'4.99',107,'22.99','PG-13','Commentaries','2006-02-15 05:03:42'),(923,'UNFAITHFUL KILL','A Taut Documentary of a Waitress And a Mad Scientist who must Battle a Technical Writer in New Orleans',2006,1,NULL,7,'2.99',78,'12.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(924,'UNFORGIVEN ZOOLANDER','A Taut Epistle of a Monkey And a Sumo Wrestler who must Vanquish a A Shark in A Baloon Factory',2006,1,NULL,7,'0.99',129,'15.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(925,'UNITED PILOT','A Fast-Paced Reflection of a Cat And a Mad Cow who must Fight a Car in The Sahara Desert',2006,1,NULL,3,'0.99',164,'27.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(926,'UNTOUCHABLES SUNRISE','A Amazing Documentary of a Woman And a Astronaut who must Outrace a Teacher in An Abandoned Fun House',2006,1,NULL,5,'2.99',120,'11.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(927,'UPRISING UPTOWN','A Fanciful Reflection of a Boy And a Butler who must Pursue a Woman in Berlin',2006,1,NULL,6,'2.99',174,'16.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(928,'UPTOWN YOUNG','A Fateful Documentary of a Dog And a Hunter who must Pursue a Teacher in An Abandoned Amusement Park',2006,1,NULL,5,'2.99',84,'16.99','PG','Commentaries','2006-02-15 05:03:42'),(929,'USUAL UNTOUCHABLES','A Touching Display of a Explorer And a Lumberjack who must Fight a Forensic Psychologist in A Shark Tank',2006,1,NULL,5,'4.99',128,'21.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(930,'VACATION BOONDOCK','A Fanciful Character Study of a Secret Agent And a Mad Scientist who must Reach a Teacher in Australia',2006,1,NULL,4,'2.99',145,'23.99','R','Commentaries','2006-02-15 05:03:42'),(931,'VALENTINE VANISHING','A Thrilling Display of a Husband And a Butler who must Reach a Pastry Chef in California',2006,1,NULL,7,'0.99',48,'9.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(932,'VALLEY PACKER','A Astounding Documentary of a Astronaut And a Boy who must Outrace a Sumo Wrestler in Berlin',2006,1,NULL,3,'0.99',73,'21.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(933,'VAMPIRE WHALE','A Epic Story of a Lumberjack And a Monkey who must Confront a Pioneer in A MySQL Convention',2006,1,NULL,4,'4.99',126,'11.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(934,'VANILLA DAY','A Fast-Paced Saga of a Girl And a Forensic Psychologist who must Redeem a Girl in Nigeria',2006,1,NULL,7,'4.99',122,'20.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(935,'VANISHED GARDEN','A Intrepid Character Study of a Squirrel And a A Shark who must Kill a Lumberjack in California',2006,1,NULL,5,'0.99',142,'17.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(936,'VANISHING ROCKY','A Brilliant Reflection of a Man And a Woman who must Conquer a Pioneer in A MySQL Convention',2006,1,NULL,3,'2.99',123,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(937,'VARSITY TRIP','A Action-Packed Character Study of a Astronaut And a Explorer who must Reach a Monkey in A MySQL Convention',2006,1,NULL,7,'2.99',85,'14.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(938,'VELVET TERMINATOR','A Lacklusture Tale of a Pastry Chef And a Technical Writer who must Confront a Crocodile in An Abandoned Amusement Park',2006,1,NULL,3,'4.99',173,'14.99','R','Behind the Scenes','2006-02-15 05:03:42'),(939,'VERTIGO NORTHWEST','A Unbelieveable Display of a Mad Scientist And a Mad Scientist who must Outgun a Mad Cow in Ancient Japan',2006,1,NULL,4,'2.99',90,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(940,'VICTORY ACADEMY','A Insightful Epistle of a Mad Scientist And a Explorer who must Challenge a Cat in The Sahara Desert',2006,1,NULL,6,'0.99',64,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(941,'VIDEOTAPE ARSENIC','A Lacklusture Display of a Girl And a Astronaut who must Succumb a Student in Australia',2006,1,NULL,4,'4.99',145,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(942,'VIETNAM SMOOCHY','A Lacklusture Display of a Butler And a Man who must Sink a Explorer in Soviet Georgia',2006,1,NULL,7,'0.99',174,'27.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(943,'VILLAIN DESPERATE','A Boring Yarn of a Pioneer And a Feminist who must Redeem a Cat in An Abandoned Amusement Park',2006,1,NULL,4,'4.99',76,'27.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(944,'VIRGIN DAISY','A Awe-Inspiring Documentary of a Robot And a Mad Scientist who must Reach a Database Administrator in A Shark Tank',2006,1,NULL,6,'4.99',179,'29.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(945,'VIRGINIAN PLUTO','A Emotional Panorama of a Dentist And a Crocodile who must Meet a Boy in Berlin',2006,1,NULL,5,'0.99',164,'22.99','R','Deleted Scenes','2006-02-15 05:03:42'),(946,'VIRTUAL SPOILERS','A Fateful Tale of a Database Administrator And a Squirrel who must Discover a Student in Soviet Georgia',2006,1,NULL,3,'4.99',144,'14.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(947,'VISION TORQUE','A Thoughtful Documentary of a Dog And a Man who must Sink a Man in A Shark Tank',2006,1,NULL,5,'0.99',59,'16.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(948,'VOICE PEACH','A Amazing Panorama of a Pioneer And a Student who must Overcome a Mad Scientist in A Manhattan Penthouse',2006,1,NULL,6,'0.99',139,'22.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(949,'VOLCANO TEXAS','A Awe-Inspiring Yarn of a Hunter And a Feminist who must Challenge a Dentist in The Outback',2006,1,NULL,6,'0.99',157,'27.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(950,'VOLUME HOUSE','A Boring Tale of a Dog And a Woman who must Meet a Dentist in California',2006,1,NULL,7,'4.99',132,'12.99','PG','Commentaries','2006-02-15 05:03:42'),(951,'VOYAGE LEGALLY','A Epic Tale of a Squirrel And a Hunter who must Conquer a Boy in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',78,'28.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(952,'WAGON JAWS','A Intrepid Drama of a Moose And a Boat who must Kill a Explorer in A Manhattan Penthouse',2006,1,NULL,7,'2.99',152,'17.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(953,'WAIT CIDER','A Intrepid Epistle of a Woman And a Forensic Psychologist who must Succumb a Astronaut in A Manhattan Penthouse',2006,1,NULL,3,'0.99',112,'9.99','PG-13','Trailers','2006-02-15 05:03:42'),(954,'WAKE JAWS','A Beautiful Saga of a Feminist And a Composer who must Challenge a Moose in Berlin',2006,1,NULL,7,'4.99',73,'18.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(955,'WALLS ARTIST','A Insightful Panorama of a Teacher And a Teacher who must Overcome a Mad Cow in An Abandoned Fun House',2006,1,NULL,7,'4.99',135,'19.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(956,'WANDA CHAMBER','A Insightful Drama of a A Shark And a Pioneer who must Find a Womanizer in The Outback',2006,1,NULL,7,'4.99',107,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(957,'WAR NOTTING','A Boring Drama of a Teacher And a Sumo Wrestler who must Challenge a Secret Agent in The Canadian Rockies',2006,1,NULL,7,'4.99',80,'26.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(958,'WARDROBE PHANTOM','A Action-Packed Display of a Mad Cow And a Astronaut who must Kill a Car in Ancient India',2006,1,NULL,6,'2.99',178,'19.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(959,'WARLOCK WEREWOLF','A Astounding Yarn of a Pioneer And a Crocodile who must Defeat a A Shark in The Outback',2006,1,NULL,6,'2.99',83,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(960,'WARS PLUTO','A Taut Reflection of a Teacher And a Database Administrator who must Chase a Madman in The Sahara Desert',2006,1,NULL,5,'2.99',128,'15.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(961,'WASH HEAVENLY','A Awe-Inspiring Reflection of a Cat And a Pioneer who must Escape a Hunter in Ancient China',2006,1,NULL,7,'4.99',161,'22.99','R','Commentaries','2006-02-15 05:03:42'),(962,'WASTELAND DIVINE','A Fanciful Story of a Database Administrator And a Womanizer who must Fight a Database Administrator in Ancient China',2006,1,NULL,7,'2.99',85,'18.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(963,'WATCH TRACY','A Fast-Paced Yarn of a Dog And a Frisbee who must Conquer a Hunter in Nigeria',2006,1,NULL,5,'0.99',78,'12.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(964,'WATERFRONT DELIVERANCE','A Unbelieveable Documentary of a Dentist And a Technical Writer who must Build a Womanizer in Nigeria',2006,1,NULL,4,'4.99',61,'17.99','G','Behind the Scenes','2006-02-15 05:03:42'),(965,'WATERSHIP FRONTIER','A Emotional Yarn of a Boat And a Crocodile who must Meet a Moose in Soviet Georgia',2006,1,NULL,6,'0.99',112,'28.99','G','Commentaries','2006-02-15 05:03:42'),(966,'WEDDING APOLLO','A Action-Packed Tale of a Student And a Waitress who must Conquer a Lumberjack in An Abandoned Mine Shaft',2006,1,NULL,3,'0.99',70,'14.99','PG','Trailers','2006-02-15 05:03:42'),(967,'WEEKEND PERSONAL','A Fast-Paced Documentary of a Car And a Butler who must Find a Frisbee in A Jet Boat',2006,1,NULL,5,'2.99',134,'26.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(968,'WEREWOLF LOLA','A Fanciful Story of a Man And a Sumo Wrestler who must Outrace a Student in A Monastery',2006,1,NULL,6,'4.99',79,'19.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(969,'WEST LION','A Intrepid Drama of a Butler And a Lumberjack who must Challenge a Database Administrator in A Manhattan Penthouse',2006,1,NULL,4,'4.99',159,'29.99','G','Trailers','2006-02-15 05:03:42'),(970,'WESTWARD SEABISCUIT','A Lacklusture Tale of a Butler And a Husband who must Face a Boy in Ancient China',2006,1,NULL,7,'0.99',52,'11.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(971,'WHALE BIKINI','A Intrepid Story of a Pastry Chef And a Database Administrator who must Kill a Feminist in A MySQL Convention',2006,1,NULL,4,'4.99',109,'11.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(972,'WHISPERER GIANT','A Intrepid Story of a Dentist And a Hunter who must Confront a Monkey in Ancient Japan',2006,1,NULL,4,'4.99',59,'24.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(973,'WIFE TURN','A Awe-Inspiring Epistle of a Teacher And a Feminist who must Confront a Pioneer in Ancient Japan',2006,1,NULL,3,'4.99',183,'27.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(974,'WILD APOLLO','A Beautiful Story of a Monkey And a Sumo Wrestler who must Conquer a A Shark in A MySQL Convention',2006,1,NULL,4,'0.99',181,'24.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(975,'WILLOW TRACY','A Brilliant Panorama of a Boat And a Astronaut who must Challenge a Teacher in A Manhattan Penthouse',2006,1,NULL,6,'2.99',137,'22.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(976,'WIND PHANTOM','A Touching Saga of a Madman And a Forensic Psychologist who must Build a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',111,'12.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(977,'WINDOW SIDE','A Astounding Character Study of a Womanizer And a Hunter who must Escape a Robot in A Monastery',2006,1,NULL,3,'2.99',85,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(978,'WISDOM WORKER','A Unbelieveable Saga of a Forensic Psychologist And a Student who must Face a Squirrel in The First Manned Space Station',2006,1,NULL,3,'0.99',98,'12.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(979,'WITCHES PANIC','A Awe-Inspiring Drama of a Secret Agent And a Hunter who must Fight a Moose in Nigeria',2006,1,NULL,6,'4.99',100,'10.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(980,'WIZARD COLDBLOODED','A Lacklusture Display of a Robot And a Girl who must Defeat a Sumo Wrestler in A MySQL Convention',2006,1,NULL,4,'4.99',75,'12.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(981,'WOLVES DESIRE','A Fast-Paced Drama of a Squirrel And a Robot who must Succumb a Technical Writer in A Manhattan Penthouse',2006,1,NULL,7,'0.99',55,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(982,'WOMEN DORADO','A Insightful Documentary of a Waitress And a Butler who must Vanquish a Composer in Australia',2006,1,NULL,4,'0.99',126,'23.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(983,'WON DARES','A Unbelieveable Documentary of a Teacher And a Monkey who must Defeat a Explorer in A U-Boat',2006,1,NULL,7,'2.99',105,'18.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(984,'WONDERFUL DROP','A Boring Panorama of a Woman And a Madman who must Overcome a Butler in A U-Boat',2006,1,NULL,3,'2.99',126,'20.99','NC-17','Commentaries','2006-02-15 05:03:42'),(985,'WONDERLAND CHRISTMAS','A Awe-Inspiring Character Study of a Waitress And a Car who must Pursue a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'4.99',111,'19.99','PG','Commentaries','2006-02-15 05:03:42'),(986,'WONKA SEA','A Brilliant Saga of a Boat And a Mad Scientist who must Meet a Moose in Ancient India',2006,1,NULL,6,'2.99',85,'24.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(987,'WORDS HUNTER','A Action-Packed Reflection of a Composer And a Mad Scientist who must Face a Pioneer in A MySQL Convention',2006,1,NULL,3,'2.99',116,'13.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(988,'WORKER TARZAN','A Action-Packed Yarn of a Secret Agent And a Technical Writer who must Battle a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,7,'2.99',139,'26.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(989,'WORKING MICROCOSMOS','A Stunning Epistle of a Dentist And a Dog who must Kill a Madman in Ancient China',2006,1,NULL,4,'4.99',74,'22.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(990,'WORLD LEATHERNECKS','A Unbelieveable Tale of a Pioneer And a Astronaut who must Overcome a Robot in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',171,'13.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(991,'WORST BANGER','A Thrilling Drama of a Madman And a Dentist who must Conquer a Boy in The Outback',2006,1,NULL,4,'2.99',185,'26.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(992,'WRATH MILE','A Intrepid Reflection of a Technical Writer And a Hunter who must Defeat a Sumo Wrestler in A Monastery',2006,1,NULL,5,'0.99',176,'17.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(993,'WRONG BEHAVIOR','A Emotional Saga of a Crocodile And a Sumo Wrestler who must Discover a Mad Cow in New Orleans',2006,1,NULL,6,'2.99',178,'10.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(994,'WYOMING STORM','A Awe-Inspiring Panorama of a Robot And a Boat who must Overcome a Feminist in A U-Boat',2006,1,NULL,6,'4.99',100,'29.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(995,'YENTL IDAHO','A Amazing Display of a Robot And a Astronaut who must Fight a Womanizer in Berlin',2006,1,NULL,5,'4.99',86,'11.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(996,'YOUNG LANGUAGE','A Unbelieveable Yarn of a Boat And a Database Administrator who must Meet a Boy in The First Manned Space Station',2006,1,NULL,6,'0.99',183,'9.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(997,'YOUTH KICK','A Touching Drama of a Teacher And a Cat who must Challenge a Technical Writer in A U-Boat',2006,1,NULL,4,'0.99',179,'14.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(998,'ZHIVAGO CORE','A Fateful Yarn of a Composer And a Man who must Face a Boy in The Canadian Rockies',2006,1,NULL,6,'0.99',105,'10.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(999,'ZOOLANDER FICTION','A Fateful Reflection of a Waitress And a Boat who must Discover a Sumo Wrestler in Ancient China',2006,1,NULL,5,'2.99',101,'28.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(1000,'ZORRO ARK','A Intrepid Panorama of a Mad Scientist And a Boy who must Redeem a Boy in A Monastery',2006,1,NULL,3,'4.99',50,'18.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'); -COMMIT; - --- --- Dumping data for table film_actor --- - -SET AUTOCOMMIT=0; -INSERT INTO film_actor VALUES (1,1,'2006-02-15 05:05:03'),(1,23,'2006-02-15 05:05:03'),(1,25,'2006-02-15 05:05:03'),(1,106,'2006-02-15 05:05:03'),(1,140,'2006-02-15 05:05:03'),(1,166,'2006-02-15 05:05:03'),(1,277,'2006-02-15 05:05:03'),(1,361,'2006-02-15 05:05:03'),(1,438,'2006-02-15 05:05:03'),(1,499,'2006-02-15 05:05:03'),(1,506,'2006-02-15 05:05:03'),(1,509,'2006-02-15 05:05:03'),(1,605,'2006-02-15 05:05:03'),(1,635,'2006-02-15 05:05:03'),(1,749,'2006-02-15 05:05:03'),(1,832,'2006-02-15 05:05:03'),(1,939,'2006-02-15 05:05:03'),(1,970,'2006-02-15 05:05:03'),(1,980,'2006-02-15 05:05:03'),(2,3,'2006-02-15 05:05:03'),(2,31,'2006-02-15 05:05:03'),(2,47,'2006-02-15 05:05:03'),(2,105,'2006-02-15 05:05:03'),(2,132,'2006-02-15 05:05:03'),(2,145,'2006-02-15 05:05:03'),(2,226,'2006-02-15 05:05:03'),(2,249,'2006-02-15 05:05:03'),(2,314,'2006-02-15 05:05:03'),(2,321,'2006-02-15 05:05:03'),(2,357,'2006-02-15 05:05:03'),(2,369,'2006-02-15 05:05:03'),(2,399,'2006-02-15 05:05:03'),(2,458,'2006-02-15 05:05:03'),(2,481,'2006-02-15 05:05:03'),(2,485,'2006-02-15 05:05:03'),(2,518,'2006-02-15 05:05:03'),(2,540,'2006-02-15 05:05:03'),(2,550,'2006-02-15 05:05:03'),(2,555,'2006-02-15 05:05:03'),(2,561,'2006-02-15 05:05:03'),(2,742,'2006-02-15 05:05:03'),(2,754,'2006-02-15 05:05:03'),(2,811,'2006-02-15 05:05:03'),(2,958,'2006-02-15 05:05:03'),(3,17,'2006-02-15 05:05:03'),(3,40,'2006-02-15 05:05:03'),(3,42,'2006-02-15 05:05:03'),(3,87,'2006-02-15 05:05:03'),(3,111,'2006-02-15 05:05:03'),(3,185,'2006-02-15 05:05:03'),(3,289,'2006-02-15 05:05:03'),(3,329,'2006-02-15 05:05:03'),(3,336,'2006-02-15 05:05:03'),(3,341,'2006-02-15 05:05:03'),(3,393,'2006-02-15 05:05:03'),(3,441,'2006-02-15 05:05:03'),(3,453,'2006-02-15 05:05:03'),(3,480,'2006-02-15 05:05:03'),(3,539,'2006-02-15 05:05:03'),(3,618,'2006-02-15 05:05:03'),(3,685,'2006-02-15 05:05:03'),(3,827,'2006-02-15 05:05:03'),(3,966,'2006-02-15 05:05:03'),(3,967,'2006-02-15 05:05:03'),(3,971,'2006-02-15 05:05:03'),(3,996,'2006-02-15 05:05:03'),(4,23,'2006-02-15 05:05:03'),(4,25,'2006-02-15 05:05:03'),(4,56,'2006-02-15 05:05:03'),(4,62,'2006-02-15 05:05:03'),(4,79,'2006-02-15 05:05:03'),(4,87,'2006-02-15 05:05:03'),(4,355,'2006-02-15 05:05:03'),(4,379,'2006-02-15 05:05:03'),(4,398,'2006-02-15 05:05:03'),(4,463,'2006-02-15 05:05:03'),(4,490,'2006-02-15 05:05:03'),(4,616,'2006-02-15 05:05:03'),(4,635,'2006-02-15 05:05:03'),(4,691,'2006-02-15 05:05:03'),(4,712,'2006-02-15 05:05:03'),(4,714,'2006-02-15 05:05:03'),(4,721,'2006-02-15 05:05:03'),(4,798,'2006-02-15 05:05:03'),(4,832,'2006-02-15 05:05:03'),(4,858,'2006-02-15 05:05:03'),(4,909,'2006-02-15 05:05:03'),(4,924,'2006-02-15 05:05:03'),(5,19,'2006-02-15 05:05:03'),(5,54,'2006-02-15 05:05:03'),(5,85,'2006-02-15 05:05:03'),(5,146,'2006-02-15 05:05:03'),(5,171,'2006-02-15 05:05:03'),(5,172,'2006-02-15 05:05:03'),(5,202,'2006-02-15 05:05:03'),(5,203,'2006-02-15 05:05:03'),(5,286,'2006-02-15 05:05:03'),(5,288,'2006-02-15 05:05:03'),(5,316,'2006-02-15 05:05:03'),(5,340,'2006-02-15 05:05:03'),(5,369,'2006-02-15 05:05:03'),(5,375,'2006-02-15 05:05:03'),(5,383,'2006-02-15 05:05:03'),(5,392,'2006-02-15 05:05:03'),(5,411,'2006-02-15 05:05:03'),(5,503,'2006-02-15 05:05:03'),(5,535,'2006-02-15 05:05:03'),(5,571,'2006-02-15 05:05:03'),(5,650,'2006-02-15 05:05:03'),(5,665,'2006-02-15 05:05:03'),(5,687,'2006-02-15 05:05:03'),(5,730,'2006-02-15 05:05:03'),(5,732,'2006-02-15 05:05:03'),(5,811,'2006-02-15 05:05:03'),(5,817,'2006-02-15 05:05:03'),(5,841,'2006-02-15 05:05:03'),(5,865,'2006-02-15 05:05:03'),(6,29,'2006-02-15 05:05:03'),(6,53,'2006-02-15 05:05:03'),(6,60,'2006-02-15 05:05:03'),(6,70,'2006-02-15 05:05:03'),(6,112,'2006-02-15 05:05:03'),(6,164,'2006-02-15 05:05:03'),(6,165,'2006-02-15 05:05:03'),(6,193,'2006-02-15 05:05:03'),(6,256,'2006-02-15 05:05:03'),(6,451,'2006-02-15 05:05:03'),(6,503,'2006-02-15 05:05:03'),(6,509,'2006-02-15 05:05:03'),(6,517,'2006-02-15 05:05:03'),(6,519,'2006-02-15 05:05:03'),(6,605,'2006-02-15 05:05:03'),(6,692,'2006-02-15 05:05:03'),(6,826,'2006-02-15 05:05:03'),(6,892,'2006-02-15 05:05:03'),(6,902,'2006-02-15 05:05:03'),(6,994,'2006-02-15 05:05:03'),(7,25,'2006-02-15 05:05:03'),(7,27,'2006-02-15 05:05:03'),(7,35,'2006-02-15 05:05:03'),(7,67,'2006-02-15 05:05:03'),(7,96,'2006-02-15 05:05:03'),(7,170,'2006-02-15 05:05:03'),(7,173,'2006-02-15 05:05:03'),(7,217,'2006-02-15 05:05:03'),(7,218,'2006-02-15 05:05:03'),(7,225,'2006-02-15 05:05:03'),(7,292,'2006-02-15 05:05:03'),(7,351,'2006-02-15 05:05:03'),(7,414,'2006-02-15 05:05:03'),(7,463,'2006-02-15 05:05:03'),(7,554,'2006-02-15 05:05:03'),(7,618,'2006-02-15 05:05:03'),(7,633,'2006-02-15 05:05:03'),(7,637,'2006-02-15 05:05:03'),(7,691,'2006-02-15 05:05:03'),(7,758,'2006-02-15 05:05:03'),(7,766,'2006-02-15 05:05:03'),(7,770,'2006-02-15 05:05:03'),(7,805,'2006-02-15 05:05:03'),(7,806,'2006-02-15 05:05:03'),(7,846,'2006-02-15 05:05:03'),(7,900,'2006-02-15 05:05:03'),(7,901,'2006-02-15 05:05:03'),(7,910,'2006-02-15 05:05:03'),(7,957,'2006-02-15 05:05:03'),(7,959,'2006-02-15 05:05:03'),(8,47,'2006-02-15 05:05:03'),(8,115,'2006-02-15 05:05:03'),(8,158,'2006-02-15 05:05:03'),(8,179,'2006-02-15 05:05:03'),(8,195,'2006-02-15 05:05:03'),(8,205,'2006-02-15 05:05:03'),(8,255,'2006-02-15 05:05:03'),(8,263,'2006-02-15 05:05:03'),(8,321,'2006-02-15 05:05:03'),(8,396,'2006-02-15 05:05:03'),(8,458,'2006-02-15 05:05:03'),(8,523,'2006-02-15 05:05:03'),(8,532,'2006-02-15 05:05:03'),(8,554,'2006-02-15 05:05:03'),(8,752,'2006-02-15 05:05:03'),(8,769,'2006-02-15 05:05:03'),(8,771,'2006-02-15 05:05:03'),(8,859,'2006-02-15 05:05:03'),(8,895,'2006-02-15 05:05:03'),(8,936,'2006-02-15 05:05:03'),(9,30,'2006-02-15 05:05:03'),(9,74,'2006-02-15 05:05:03'),(9,147,'2006-02-15 05:05:03'),(9,148,'2006-02-15 05:05:03'),(9,191,'2006-02-15 05:05:03'),(9,200,'2006-02-15 05:05:03'),(9,204,'2006-02-15 05:05:03'),(9,434,'2006-02-15 05:05:03'),(9,510,'2006-02-15 05:05:03'),(9,514,'2006-02-15 05:05:03'),(9,552,'2006-02-15 05:05:03'),(9,650,'2006-02-15 05:05:03'),(9,671,'2006-02-15 05:05:03'),(9,697,'2006-02-15 05:05:03'),(9,722,'2006-02-15 05:05:03'),(9,752,'2006-02-15 05:05:03'),(9,811,'2006-02-15 05:05:03'),(9,815,'2006-02-15 05:05:03'),(9,865,'2006-02-15 05:05:03'),(9,873,'2006-02-15 05:05:03'),(9,889,'2006-02-15 05:05:03'),(9,903,'2006-02-15 05:05:03'),(9,926,'2006-02-15 05:05:03'),(9,964,'2006-02-15 05:05:03'),(9,974,'2006-02-15 05:05:03'),(10,1,'2006-02-15 05:05:03'),(10,9,'2006-02-15 05:05:03'),(10,191,'2006-02-15 05:05:03'),(10,236,'2006-02-15 05:05:03'),(10,251,'2006-02-15 05:05:03'),(10,366,'2006-02-15 05:05:03'),(10,477,'2006-02-15 05:05:03'),(10,480,'2006-02-15 05:05:03'),(10,522,'2006-02-15 05:05:03'),(10,530,'2006-02-15 05:05:03'),(10,587,'2006-02-15 05:05:03'),(10,694,'2006-02-15 05:05:03'),(10,703,'2006-02-15 05:05:03'),(10,716,'2006-02-15 05:05:03'),(10,782,'2006-02-15 05:05:03'),(10,914,'2006-02-15 05:05:03'),(10,929,'2006-02-15 05:05:03'),(10,930,'2006-02-15 05:05:03'),(10,964,'2006-02-15 05:05:03'),(10,966,'2006-02-15 05:05:03'),(10,980,'2006-02-15 05:05:03'),(10,983,'2006-02-15 05:05:03'),(11,118,'2006-02-15 05:05:03'),(11,205,'2006-02-15 05:05:03'),(11,281,'2006-02-15 05:05:03'),(11,283,'2006-02-15 05:05:03'),(11,348,'2006-02-15 05:05:03'),(11,364,'2006-02-15 05:05:03'),(11,395,'2006-02-15 05:05:03'),(11,429,'2006-02-15 05:05:03'),(11,433,'2006-02-15 05:05:03'),(11,453,'2006-02-15 05:05:03'),(11,485,'2006-02-15 05:05:03'),(11,532,'2006-02-15 05:05:03'),(11,567,'2006-02-15 05:05:03'),(11,587,'2006-02-15 05:05:03'),(11,597,'2006-02-15 05:05:03'),(11,636,'2006-02-15 05:05:03'),(11,709,'2006-02-15 05:05:03'),(11,850,'2006-02-15 05:05:03'),(11,854,'2006-02-15 05:05:03'),(11,888,'2006-02-15 05:05:03'),(11,896,'2006-02-15 05:05:03'),(11,928,'2006-02-15 05:05:03'),(11,938,'2006-02-15 05:05:03'),(11,969,'2006-02-15 05:05:03'),(11,988,'2006-02-15 05:05:03'),(12,16,'2006-02-15 05:05:03'),(12,17,'2006-02-15 05:05:03'),(12,34,'2006-02-15 05:05:03'),(12,37,'2006-02-15 05:05:03'),(12,91,'2006-02-15 05:05:03'),(12,92,'2006-02-15 05:05:03'),(12,107,'2006-02-15 05:05:03'),(12,155,'2006-02-15 05:05:03'),(12,177,'2006-02-15 05:05:03'),(12,208,'2006-02-15 05:05:03'),(12,213,'2006-02-15 05:05:03'),(12,216,'2006-02-15 05:05:03'),(12,243,'2006-02-15 05:05:03'),(12,344,'2006-02-15 05:05:03'),(12,400,'2006-02-15 05:05:03'),(12,416,'2006-02-15 05:05:03'),(12,420,'2006-02-15 05:05:03'),(12,457,'2006-02-15 05:05:03'),(12,513,'2006-02-15 05:05:03'),(12,540,'2006-02-15 05:05:03'),(12,593,'2006-02-15 05:05:03'),(12,631,'2006-02-15 05:05:03'),(12,635,'2006-02-15 05:05:03'),(12,672,'2006-02-15 05:05:03'),(12,716,'2006-02-15 05:05:03'),(12,728,'2006-02-15 05:05:03'),(12,812,'2006-02-15 05:05:03'),(12,838,'2006-02-15 05:05:03'),(12,871,'2006-02-15 05:05:03'),(12,880,'2006-02-15 05:05:03'),(12,945,'2006-02-15 05:05:03'),(13,17,'2006-02-15 05:05:03'),(13,29,'2006-02-15 05:05:03'),(13,45,'2006-02-15 05:05:03'),(13,87,'2006-02-15 05:05:03'),(13,110,'2006-02-15 05:05:03'),(13,144,'2006-02-15 05:05:03'),(13,154,'2006-02-15 05:05:03'),(13,162,'2006-02-15 05:05:03'),(13,203,'2006-02-15 05:05:03'),(13,254,'2006-02-15 05:05:03'),(13,337,'2006-02-15 05:05:03'),(13,346,'2006-02-15 05:05:03'),(13,381,'2006-02-15 05:05:03'),(13,385,'2006-02-15 05:05:03'),(13,427,'2006-02-15 05:05:03'),(13,456,'2006-02-15 05:05:03'),(13,513,'2006-02-15 05:05:03'),(13,515,'2006-02-15 05:05:03'),(13,522,'2006-02-15 05:05:03'),(13,524,'2006-02-15 05:05:03'),(13,528,'2006-02-15 05:05:03'),(13,571,'2006-02-15 05:05:03'),(13,588,'2006-02-15 05:05:03'),(13,597,'2006-02-15 05:05:03'),(13,600,'2006-02-15 05:05:03'),(13,718,'2006-02-15 05:05:03'),(13,729,'2006-02-15 05:05:03'),(13,816,'2006-02-15 05:05:03'),(13,817,'2006-02-15 05:05:03'),(13,832,'2006-02-15 05:05:03'),(13,833,'2006-02-15 05:05:03'),(13,843,'2006-02-15 05:05:03'),(13,897,'2006-02-15 05:05:03'),(13,966,'2006-02-15 05:05:03'),(13,998,'2006-02-15 05:05:03'),(14,154,'2006-02-15 05:05:03'),(14,187,'2006-02-15 05:05:03'),(14,232,'2006-02-15 05:05:03'),(14,241,'2006-02-15 05:05:03'),(14,253,'2006-02-15 05:05:03'),(14,255,'2006-02-15 05:05:03'),(14,258,'2006-02-15 05:05:03'),(14,284,'2006-02-15 05:05:03'),(14,292,'2006-02-15 05:05:03'),(14,370,'2006-02-15 05:05:03'),(14,415,'2006-02-15 05:05:03'),(14,417,'2006-02-15 05:05:03'),(14,418,'2006-02-15 05:05:03'),(14,454,'2006-02-15 05:05:03'),(14,472,'2006-02-15 05:05:03'),(14,475,'2006-02-15 05:05:03'),(14,495,'2006-02-15 05:05:03'),(14,536,'2006-02-15 05:05:03'),(14,537,'2006-02-15 05:05:03'),(14,612,'2006-02-15 05:05:03'),(14,688,'2006-02-15 05:05:03'),(14,759,'2006-02-15 05:05:03'),(14,764,'2006-02-15 05:05:03'),(14,847,'2006-02-15 05:05:03'),(14,856,'2006-02-15 05:05:03'),(14,890,'2006-02-15 05:05:03'),(14,908,'2006-02-15 05:05:03'),(14,919,'2006-02-15 05:05:03'),(14,948,'2006-02-15 05:05:03'),(14,970,'2006-02-15 05:05:03'),(15,31,'2006-02-15 05:05:03'),(15,89,'2006-02-15 05:05:03'),(15,91,'2006-02-15 05:05:03'),(15,108,'2006-02-15 05:05:03'),(15,125,'2006-02-15 05:05:03'),(15,236,'2006-02-15 05:05:03'),(15,275,'2006-02-15 05:05:03'),(15,280,'2006-02-15 05:05:03'),(15,326,'2006-02-15 05:05:03'),(15,342,'2006-02-15 05:05:03'),(15,414,'2006-02-15 05:05:03'),(15,445,'2006-02-15 05:05:03'),(15,500,'2006-02-15 05:05:03'),(15,502,'2006-02-15 05:05:03'),(15,541,'2006-02-15 05:05:03'),(15,553,'2006-02-15 05:05:03'),(15,594,'2006-02-15 05:05:03'),(15,626,'2006-02-15 05:05:03'),(15,635,'2006-02-15 05:05:03'),(15,745,'2006-02-15 05:05:03'),(15,783,'2006-02-15 05:05:03'),(15,795,'2006-02-15 05:05:03'),(15,817,'2006-02-15 05:05:03'),(15,886,'2006-02-15 05:05:03'),(15,924,'2006-02-15 05:05:03'),(15,949,'2006-02-15 05:05:03'),(15,968,'2006-02-15 05:05:03'),(15,985,'2006-02-15 05:05:03'),(16,80,'2006-02-15 05:05:03'),(16,87,'2006-02-15 05:05:03'),(16,101,'2006-02-15 05:05:03'),(16,121,'2006-02-15 05:05:03'),(16,155,'2006-02-15 05:05:03'),(16,177,'2006-02-15 05:05:03'),(16,218,'2006-02-15 05:05:03'),(16,221,'2006-02-15 05:05:03'),(16,267,'2006-02-15 05:05:03'),(16,269,'2006-02-15 05:05:03'),(16,271,'2006-02-15 05:05:03'),(16,280,'2006-02-15 05:05:03'),(16,287,'2006-02-15 05:05:03'),(16,345,'2006-02-15 05:05:03'),(16,438,'2006-02-15 05:05:03'),(16,453,'2006-02-15 05:05:03'),(16,455,'2006-02-15 05:05:03'),(16,456,'2006-02-15 05:05:03'),(16,503,'2006-02-15 05:05:03'),(16,548,'2006-02-15 05:05:03'),(16,582,'2006-02-15 05:05:03'),(16,583,'2006-02-15 05:05:03'),(16,717,'2006-02-15 05:05:03'),(16,758,'2006-02-15 05:05:03'),(16,779,'2006-02-15 05:05:03'),(16,886,'2006-02-15 05:05:03'),(16,967,'2006-02-15 05:05:03'),(17,96,'2006-02-15 05:05:03'),(17,119,'2006-02-15 05:05:03'),(17,124,'2006-02-15 05:05:03'),(17,127,'2006-02-15 05:05:03'),(17,154,'2006-02-15 05:05:03'),(17,199,'2006-02-15 05:05:03'),(17,201,'2006-02-15 05:05:03'),(17,236,'2006-02-15 05:05:03'),(17,280,'2006-02-15 05:05:03'),(17,310,'2006-02-15 05:05:03'),(17,313,'2006-02-15 05:05:03'),(17,378,'2006-02-15 05:05:03'),(17,457,'2006-02-15 05:05:03'),(17,469,'2006-02-15 05:05:03'),(17,478,'2006-02-15 05:05:03'),(17,500,'2006-02-15 05:05:03'),(17,515,'2006-02-15 05:05:03'),(17,521,'2006-02-15 05:05:03'),(17,573,'2006-02-15 05:05:03'),(17,603,'2006-02-15 05:05:03'),(17,606,'2006-02-15 05:05:03'),(17,734,'2006-02-15 05:05:03'),(17,770,'2006-02-15 05:05:03'),(17,794,'2006-02-15 05:05:03'),(17,800,'2006-02-15 05:05:03'),(17,853,'2006-02-15 05:05:03'),(17,873,'2006-02-15 05:05:03'),(17,874,'2006-02-15 05:05:03'),(17,880,'2006-02-15 05:05:03'),(17,948,'2006-02-15 05:05:03'),(17,957,'2006-02-15 05:05:03'),(17,959,'2006-02-15 05:05:03'),(18,44,'2006-02-15 05:05:03'),(18,84,'2006-02-15 05:05:03'),(18,144,'2006-02-15 05:05:03'),(18,172,'2006-02-15 05:05:03'),(18,268,'2006-02-15 05:05:03'),(18,279,'2006-02-15 05:05:03'),(18,280,'2006-02-15 05:05:03'),(18,321,'2006-02-15 05:05:03'),(18,386,'2006-02-15 05:05:03'),(18,460,'2006-02-15 05:05:03'),(18,462,'2006-02-15 05:05:03'),(18,484,'2006-02-15 05:05:03'),(18,536,'2006-02-15 05:05:03'),(18,561,'2006-02-15 05:05:03'),(18,612,'2006-02-15 05:05:03'),(18,717,'2006-02-15 05:05:03'),(18,808,'2006-02-15 05:05:03'),(18,842,'2006-02-15 05:05:03'),(18,863,'2006-02-15 05:05:03'),(18,883,'2006-02-15 05:05:03'),(18,917,'2006-02-15 05:05:03'),(18,944,'2006-02-15 05:05:03'),(19,2,'2006-02-15 05:05:03'),(19,3,'2006-02-15 05:05:03'),(19,144,'2006-02-15 05:05:03'),(19,152,'2006-02-15 05:05:03'),(19,182,'2006-02-15 05:05:03'),(19,208,'2006-02-15 05:05:03'),(19,212,'2006-02-15 05:05:03'),(19,217,'2006-02-15 05:05:03'),(19,266,'2006-02-15 05:05:03'),(19,404,'2006-02-15 05:05:03'),(19,428,'2006-02-15 05:05:03'),(19,473,'2006-02-15 05:05:03'),(19,490,'2006-02-15 05:05:03'),(19,510,'2006-02-15 05:05:03'),(19,513,'2006-02-15 05:05:03'),(19,644,'2006-02-15 05:05:03'),(19,670,'2006-02-15 05:05:03'),(19,673,'2006-02-15 05:05:03'),(19,711,'2006-02-15 05:05:03'),(19,750,'2006-02-15 05:05:03'),(19,752,'2006-02-15 05:05:03'),(19,756,'2006-02-15 05:05:03'),(19,771,'2006-02-15 05:05:03'),(19,785,'2006-02-15 05:05:03'),(19,877,'2006-02-15 05:05:03'),(20,1,'2006-02-15 05:05:03'),(20,54,'2006-02-15 05:05:03'),(20,63,'2006-02-15 05:05:03'),(20,140,'2006-02-15 05:05:03'),(20,146,'2006-02-15 05:05:03'),(20,165,'2006-02-15 05:05:03'),(20,231,'2006-02-15 05:05:03'),(20,243,'2006-02-15 05:05:03'),(20,269,'2006-02-15 05:05:03'),(20,274,'2006-02-15 05:05:03'),(20,348,'2006-02-15 05:05:03'),(20,366,'2006-02-15 05:05:03'),(20,445,'2006-02-15 05:05:03'),(20,478,'2006-02-15 05:05:03'),(20,492,'2006-02-15 05:05:03'),(20,499,'2006-02-15 05:05:03'),(20,527,'2006-02-15 05:05:03'),(20,531,'2006-02-15 05:05:03'),(20,538,'2006-02-15 05:05:03'),(20,589,'2006-02-15 05:05:03'),(20,643,'2006-02-15 05:05:03'),(20,652,'2006-02-15 05:05:03'),(20,663,'2006-02-15 05:05:03'),(20,714,'2006-02-15 05:05:03'),(20,717,'2006-02-15 05:05:03'),(20,757,'2006-02-15 05:05:03'),(20,784,'2006-02-15 05:05:03'),(20,863,'2006-02-15 05:05:03'),(20,962,'2006-02-15 05:05:03'),(20,977,'2006-02-15 05:05:03'),(21,6,'2006-02-15 05:05:03'),(21,87,'2006-02-15 05:05:03'),(21,88,'2006-02-15 05:05:03'),(21,142,'2006-02-15 05:05:03'),(21,159,'2006-02-15 05:05:03'),(21,179,'2006-02-15 05:05:03'),(21,253,'2006-02-15 05:05:03'),(21,281,'2006-02-15 05:05:03'),(21,321,'2006-02-15 05:05:03'),(21,398,'2006-02-15 05:05:03'),(21,426,'2006-02-15 05:05:03'),(21,429,'2006-02-15 05:05:03'),(21,497,'2006-02-15 05:05:03'),(21,507,'2006-02-15 05:05:03'),(21,530,'2006-02-15 05:05:03'),(21,680,'2006-02-15 05:05:03'),(21,686,'2006-02-15 05:05:03'),(21,700,'2006-02-15 05:05:03'),(21,702,'2006-02-15 05:05:03'),(21,733,'2006-02-15 05:05:03'),(21,734,'2006-02-15 05:05:03'),(21,798,'2006-02-15 05:05:03'),(21,804,'2006-02-15 05:05:03'),(21,887,'2006-02-15 05:05:03'),(21,893,'2006-02-15 05:05:03'),(21,920,'2006-02-15 05:05:03'),(21,983,'2006-02-15 05:05:03'),(22,9,'2006-02-15 05:05:03'),(22,23,'2006-02-15 05:05:03'),(22,56,'2006-02-15 05:05:03'),(22,89,'2006-02-15 05:05:03'),(22,111,'2006-02-15 05:05:03'),(22,146,'2006-02-15 05:05:03'),(22,291,'2006-02-15 05:05:03'),(22,294,'2006-02-15 05:05:03'),(22,349,'2006-02-15 05:05:03'),(22,369,'2006-02-15 05:05:03'),(22,418,'2006-02-15 05:05:03'),(22,430,'2006-02-15 05:05:03'),(22,483,'2006-02-15 05:05:03'),(22,491,'2006-02-15 05:05:03'),(22,495,'2006-02-15 05:05:03'),(22,536,'2006-02-15 05:05:03'),(22,600,'2006-02-15 05:05:03'),(22,634,'2006-02-15 05:05:03'),(22,648,'2006-02-15 05:05:03'),(22,688,'2006-02-15 05:05:03'),(22,731,'2006-02-15 05:05:03'),(22,742,'2006-02-15 05:05:03'),(22,775,'2006-02-15 05:05:03'),(22,802,'2006-02-15 05:05:03'),(22,912,'2006-02-15 05:05:03'),(22,964,'2006-02-15 05:05:03'),(23,6,'2006-02-15 05:05:03'),(23,42,'2006-02-15 05:05:03'),(23,78,'2006-02-15 05:05:03'),(23,105,'2006-02-15 05:05:03'),(23,116,'2006-02-15 05:05:03'),(23,117,'2006-02-15 05:05:03'),(23,125,'2006-02-15 05:05:03'),(23,212,'2006-02-15 05:05:03'),(23,226,'2006-02-15 05:05:03'),(23,235,'2006-02-15 05:05:03'),(23,254,'2006-02-15 05:05:03'),(23,367,'2006-02-15 05:05:03'),(23,370,'2006-02-15 05:05:03'),(23,414,'2006-02-15 05:05:03'),(23,419,'2006-02-15 05:05:03'),(23,435,'2006-02-15 05:05:03'),(23,449,'2006-02-15 05:05:03'),(23,491,'2006-02-15 05:05:03'),(23,536,'2006-02-15 05:05:03'),(23,549,'2006-02-15 05:05:03'),(23,636,'2006-02-15 05:05:03'),(23,649,'2006-02-15 05:05:03'),(23,673,'2006-02-15 05:05:03'),(23,691,'2006-02-15 05:05:03'),(23,766,'2006-02-15 05:05:03'),(23,782,'2006-02-15 05:05:03'),(23,804,'2006-02-15 05:05:03'),(23,820,'2006-02-15 05:05:03'),(23,826,'2006-02-15 05:05:03'),(23,833,'2006-02-15 05:05:03'),(23,842,'2006-02-15 05:05:03'),(23,853,'2006-02-15 05:05:03'),(23,855,'2006-02-15 05:05:03'),(23,856,'2006-02-15 05:05:03'),(23,935,'2006-02-15 05:05:03'),(23,981,'2006-02-15 05:05:03'),(23,997,'2006-02-15 05:05:03'),(24,3,'2006-02-15 05:05:03'),(24,83,'2006-02-15 05:05:03'),(24,112,'2006-02-15 05:05:03'),(24,126,'2006-02-15 05:05:03'),(24,148,'2006-02-15 05:05:03'),(24,164,'2006-02-15 05:05:03'),(24,178,'2006-02-15 05:05:03'),(24,194,'2006-02-15 05:05:03'),(24,199,'2006-02-15 05:05:03'),(24,242,'2006-02-15 05:05:03'),(24,256,'2006-02-15 05:05:03'),(24,277,'2006-02-15 05:05:03'),(24,335,'2006-02-15 05:05:03'),(24,405,'2006-02-15 05:05:03'),(24,463,'2006-02-15 05:05:03'),(24,515,'2006-02-15 05:05:03'),(24,585,'2006-02-15 05:05:03'),(24,603,'2006-02-15 05:05:03'),(24,653,'2006-02-15 05:05:03'),(24,704,'2006-02-15 05:05:03'),(24,781,'2006-02-15 05:05:03'),(24,829,'2006-02-15 05:05:03'),(24,832,'2006-02-15 05:05:03'),(24,969,'2006-02-15 05:05:03'),(25,21,'2006-02-15 05:05:03'),(25,86,'2006-02-15 05:05:03'),(25,153,'2006-02-15 05:05:03'),(25,179,'2006-02-15 05:05:03'),(25,204,'2006-02-15 05:05:03'),(25,213,'2006-02-15 05:05:03'),(25,226,'2006-02-15 05:05:03'),(25,245,'2006-02-15 05:05:03'),(25,311,'2006-02-15 05:05:03'),(25,404,'2006-02-15 05:05:03'),(25,411,'2006-02-15 05:05:03'),(25,420,'2006-02-15 05:05:03'),(25,538,'2006-02-15 05:05:03'),(25,564,'2006-02-15 05:05:03'),(25,583,'2006-02-15 05:05:03'),(25,606,'2006-02-15 05:05:03'),(25,688,'2006-02-15 05:05:03'),(25,697,'2006-02-15 05:05:03'),(25,755,'2006-02-15 05:05:03'),(25,871,'2006-02-15 05:05:03'),(25,914,'2006-02-15 05:05:03'),(26,9,'2006-02-15 05:05:03'),(26,21,'2006-02-15 05:05:03'),(26,34,'2006-02-15 05:05:03'),(26,90,'2006-02-15 05:05:03'),(26,93,'2006-02-15 05:05:03'),(26,103,'2006-02-15 05:05:03'),(26,147,'2006-02-15 05:05:03'),(26,186,'2006-02-15 05:05:03'),(26,201,'2006-02-15 05:05:03'),(26,225,'2006-02-15 05:05:03'),(26,241,'2006-02-15 05:05:03'),(26,327,'2006-02-15 05:05:03'),(26,329,'2006-02-15 05:05:03'),(26,340,'2006-02-15 05:05:03'),(26,345,'2006-02-15 05:05:03'),(26,390,'2006-02-15 05:05:03'),(26,392,'2006-02-15 05:05:03'),(26,529,'2006-02-15 05:05:03'),(26,544,'2006-02-15 05:05:03'),(26,564,'2006-02-15 05:05:03'),(26,635,'2006-02-15 05:05:03'),(26,644,'2006-02-15 05:05:03'),(26,682,'2006-02-15 05:05:03'),(26,688,'2006-02-15 05:05:03'),(26,715,'2006-02-15 05:05:03'),(26,732,'2006-02-15 05:05:03'),(26,758,'2006-02-15 05:05:03'),(26,764,'2006-02-15 05:05:03'),(26,795,'2006-02-15 05:05:03'),(26,821,'2006-02-15 05:05:03'),(26,885,'2006-02-15 05:05:03'),(26,904,'2006-02-15 05:05:03'),(26,906,'2006-02-15 05:05:03'),(27,19,'2006-02-15 05:05:03'),(27,34,'2006-02-15 05:05:03'),(27,85,'2006-02-15 05:05:03'),(27,150,'2006-02-15 05:05:03'),(27,172,'2006-02-15 05:05:03'),(27,273,'2006-02-15 05:05:03'),(27,334,'2006-02-15 05:05:03'),(27,347,'2006-02-15 05:05:03'),(27,359,'2006-02-15 05:05:03'),(27,398,'2006-02-15 05:05:03'),(27,415,'2006-02-15 05:05:03'),(27,462,'2006-02-15 05:05:03'),(27,477,'2006-02-15 05:05:03'),(27,500,'2006-02-15 05:05:03'),(27,503,'2006-02-15 05:05:03'),(27,540,'2006-02-15 05:05:03'),(27,586,'2006-02-15 05:05:03'),(27,593,'2006-02-15 05:05:03'),(27,637,'2006-02-15 05:05:03'),(27,679,'2006-02-15 05:05:03'),(27,682,'2006-02-15 05:05:03'),(27,695,'2006-02-15 05:05:03'),(27,771,'2006-02-15 05:05:03'),(27,805,'2006-02-15 05:05:03'),(27,830,'2006-02-15 05:05:03'),(27,854,'2006-02-15 05:05:03'),(27,873,'2006-02-15 05:05:03'),(27,880,'2006-02-15 05:05:03'),(27,889,'2006-02-15 05:05:03'),(27,904,'2006-02-15 05:05:03'),(27,967,'2006-02-15 05:05:03'),(27,986,'2006-02-15 05:05:03'),(27,996,'2006-02-15 05:05:03'),(28,14,'2006-02-15 05:05:03'),(28,43,'2006-02-15 05:05:03'),(28,58,'2006-02-15 05:05:03'),(28,74,'2006-02-15 05:05:03'),(28,96,'2006-02-15 05:05:03'),(28,107,'2006-02-15 05:05:03'),(28,259,'2006-02-15 05:05:03'),(28,263,'2006-02-15 05:05:03'),(28,287,'2006-02-15 05:05:03'),(28,358,'2006-02-15 05:05:03'),(28,502,'2006-02-15 05:05:03'),(28,508,'2006-02-15 05:05:03'),(28,532,'2006-02-15 05:05:03'),(28,551,'2006-02-15 05:05:03'),(28,574,'2006-02-15 05:05:03'),(28,597,'2006-02-15 05:05:03'),(28,619,'2006-02-15 05:05:03'),(28,625,'2006-02-15 05:05:03'),(28,652,'2006-02-15 05:05:03'),(28,679,'2006-02-15 05:05:03'),(28,743,'2006-02-15 05:05:03'),(28,790,'2006-02-15 05:05:03'),(28,793,'2006-02-15 05:05:03'),(28,816,'2006-02-15 05:05:03'),(28,827,'2006-02-15 05:05:03'),(28,835,'2006-02-15 05:05:03'),(28,879,'2006-02-15 05:05:03'),(28,908,'2006-02-15 05:05:03'),(28,953,'2006-02-15 05:05:03'),(28,973,'2006-02-15 05:05:03'),(28,994,'2006-02-15 05:05:03'),(29,10,'2006-02-15 05:05:03'),(29,79,'2006-02-15 05:05:03'),(29,105,'2006-02-15 05:05:03'),(29,110,'2006-02-15 05:05:03'),(29,131,'2006-02-15 05:05:03'),(29,133,'2006-02-15 05:05:03'),(29,172,'2006-02-15 05:05:03'),(29,226,'2006-02-15 05:05:03'),(29,273,'2006-02-15 05:05:03'),(29,282,'2006-02-15 05:05:03'),(29,296,'2006-02-15 05:05:03'),(29,311,'2006-02-15 05:05:03'),(29,335,'2006-02-15 05:05:03'),(29,342,'2006-02-15 05:05:03'),(29,436,'2006-02-15 05:05:03'),(29,444,'2006-02-15 05:05:03'),(29,449,'2006-02-15 05:05:03'),(29,462,'2006-02-15 05:05:03'),(29,482,'2006-02-15 05:05:03'),(29,488,'2006-02-15 05:05:03'),(29,519,'2006-02-15 05:05:03'),(29,547,'2006-02-15 05:05:03'),(29,590,'2006-02-15 05:05:03'),(29,646,'2006-02-15 05:05:03'),(29,723,'2006-02-15 05:05:03'),(29,812,'2006-02-15 05:05:03'),(29,862,'2006-02-15 05:05:03'),(29,928,'2006-02-15 05:05:03'),(29,944,'2006-02-15 05:05:03'),(30,1,'2006-02-15 05:05:03'),(30,53,'2006-02-15 05:05:03'),(30,64,'2006-02-15 05:05:03'),(30,69,'2006-02-15 05:05:03'),(30,77,'2006-02-15 05:05:03'),(30,87,'2006-02-15 05:05:03'),(30,260,'2006-02-15 05:05:03'),(30,262,'2006-02-15 05:05:03'),(30,286,'2006-02-15 05:05:03'),(30,292,'2006-02-15 05:05:03'),(30,301,'2006-02-15 05:05:03'),(30,318,'2006-02-15 05:05:03'),(30,321,'2006-02-15 05:05:03'),(30,357,'2006-02-15 05:05:03'),(30,565,'2006-02-15 05:05:03'),(30,732,'2006-02-15 05:05:03'),(30,797,'2006-02-15 05:05:03'),(30,838,'2006-02-15 05:05:03'),(30,945,'2006-02-15 05:05:03'),(31,88,'2006-02-15 05:05:03'),(31,146,'2006-02-15 05:05:03'),(31,163,'2006-02-15 05:05:03'),(31,164,'2006-02-15 05:05:03'),(31,188,'2006-02-15 05:05:03'),(31,299,'2006-02-15 05:05:03'),(31,308,'2006-02-15 05:05:03'),(31,368,'2006-02-15 05:05:03'),(31,380,'2006-02-15 05:05:03'),(31,431,'2006-02-15 05:05:03'),(31,585,'2006-02-15 05:05:03'),(31,637,'2006-02-15 05:05:03'),(31,700,'2006-02-15 05:05:03'),(31,739,'2006-02-15 05:05:03'),(31,793,'2006-02-15 05:05:03'),(31,802,'2006-02-15 05:05:03'),(31,880,'2006-02-15 05:05:03'),(31,978,'2006-02-15 05:05:03'),(32,65,'2006-02-15 05:05:03'),(32,84,'2006-02-15 05:05:03'),(32,103,'2006-02-15 05:05:03'),(32,112,'2006-02-15 05:05:03'),(32,136,'2006-02-15 05:05:03'),(32,197,'2006-02-15 05:05:03'),(32,199,'2006-02-15 05:05:03'),(32,219,'2006-02-15 05:05:03'),(32,309,'2006-02-15 05:05:03'),(32,312,'2006-02-15 05:05:03'),(32,401,'2006-02-15 05:05:03'),(32,427,'2006-02-15 05:05:03'),(32,431,'2006-02-15 05:05:03'),(32,523,'2006-02-15 05:05:03'),(32,567,'2006-02-15 05:05:03'),(32,585,'2006-02-15 05:05:03'),(32,606,'2006-02-15 05:05:03'),(32,651,'2006-02-15 05:05:03'),(32,667,'2006-02-15 05:05:03'),(32,669,'2006-02-15 05:05:03'),(32,815,'2006-02-15 05:05:03'),(32,928,'2006-02-15 05:05:03'),(32,980,'2006-02-15 05:05:03'),(33,56,'2006-02-15 05:05:03'),(33,112,'2006-02-15 05:05:03'),(33,135,'2006-02-15 05:05:03'),(33,154,'2006-02-15 05:05:03'),(33,214,'2006-02-15 05:05:03'),(33,252,'2006-02-15 05:05:03'),(33,305,'2006-02-15 05:05:03'),(33,306,'2006-02-15 05:05:03'),(33,473,'2006-02-15 05:05:03'),(33,489,'2006-02-15 05:05:03'),(33,574,'2006-02-15 05:05:03'),(33,618,'2006-02-15 05:05:03'),(33,667,'2006-02-15 05:05:03'),(33,694,'2006-02-15 05:05:03'),(33,712,'2006-02-15 05:05:03'),(33,735,'2006-02-15 05:05:03'),(33,737,'2006-02-15 05:05:03'),(33,754,'2006-02-15 05:05:03'),(33,775,'2006-02-15 05:05:03'),(33,878,'2006-02-15 05:05:03'),(33,881,'2006-02-15 05:05:03'),(33,965,'2006-02-15 05:05:03'),(33,972,'2006-02-15 05:05:03'),(33,993,'2006-02-15 05:05:03'),(34,43,'2006-02-15 05:05:03'),(34,90,'2006-02-15 05:05:03'),(34,119,'2006-02-15 05:05:03'),(34,125,'2006-02-15 05:05:03'),(34,172,'2006-02-15 05:05:03'),(34,182,'2006-02-15 05:05:03'),(34,244,'2006-02-15 05:05:03'),(34,336,'2006-02-15 05:05:03'),(34,389,'2006-02-15 05:05:03'),(34,393,'2006-02-15 05:05:03'),(34,438,'2006-02-15 05:05:03'),(34,493,'2006-02-15 05:05:03'),(34,502,'2006-02-15 05:05:03'),(34,525,'2006-02-15 05:05:03'),(34,668,'2006-02-15 05:05:03'),(34,720,'2006-02-15 05:05:03'),(34,779,'2006-02-15 05:05:03'),(34,788,'2006-02-15 05:05:03'),(34,794,'2006-02-15 05:05:03'),(34,836,'2006-02-15 05:05:03'),(34,846,'2006-02-15 05:05:03'),(34,853,'2006-02-15 05:05:03'),(34,929,'2006-02-15 05:05:03'),(34,950,'2006-02-15 05:05:03'),(34,971,'2006-02-15 05:05:03'),(35,10,'2006-02-15 05:05:03'),(35,35,'2006-02-15 05:05:03'),(35,52,'2006-02-15 05:05:03'),(35,201,'2006-02-15 05:05:03'),(35,256,'2006-02-15 05:05:03'),(35,389,'2006-02-15 05:05:03'),(35,589,'2006-02-15 05:05:03'),(35,612,'2006-02-15 05:05:03'),(35,615,'2006-02-15 05:05:03'),(35,707,'2006-02-15 05:05:03'),(35,732,'2006-02-15 05:05:03'),(35,738,'2006-02-15 05:05:03'),(35,748,'2006-02-15 05:05:03'),(35,817,'2006-02-15 05:05:03'),(35,914,'2006-02-15 05:05:03'),(36,15,'2006-02-15 05:05:03'),(36,81,'2006-02-15 05:05:03'),(36,171,'2006-02-15 05:05:03'),(36,231,'2006-02-15 05:05:03'),(36,245,'2006-02-15 05:05:03'),(36,283,'2006-02-15 05:05:03'),(36,380,'2006-02-15 05:05:03'),(36,381,'2006-02-15 05:05:03'),(36,387,'2006-02-15 05:05:03'),(36,390,'2006-02-15 05:05:03'),(36,410,'2006-02-15 05:05:03'),(36,426,'2006-02-15 05:05:03'),(36,427,'2006-02-15 05:05:03'),(36,453,'2006-02-15 05:05:03'),(36,466,'2006-02-15 05:05:03'),(36,484,'2006-02-15 05:05:03'),(36,493,'2006-02-15 05:05:03'),(36,499,'2006-02-15 05:05:03'),(36,569,'2006-02-15 05:05:03'),(36,590,'2006-02-15 05:05:03'),(36,600,'2006-02-15 05:05:03'),(36,714,'2006-02-15 05:05:03'),(36,715,'2006-02-15 05:05:03'),(36,716,'2006-02-15 05:05:03'),(36,731,'2006-02-15 05:05:03'),(36,875,'2006-02-15 05:05:03'),(36,915,'2006-02-15 05:05:03'),(36,931,'2006-02-15 05:05:03'),(36,956,'2006-02-15 05:05:03'),(37,10,'2006-02-15 05:05:03'),(37,12,'2006-02-15 05:05:03'),(37,19,'2006-02-15 05:05:03'),(37,118,'2006-02-15 05:05:03'),(37,119,'2006-02-15 05:05:03'),(37,122,'2006-02-15 05:05:03'),(37,146,'2006-02-15 05:05:03'),(37,204,'2006-02-15 05:05:03'),(37,253,'2006-02-15 05:05:03'),(37,260,'2006-02-15 05:05:03'),(37,277,'2006-02-15 05:05:03'),(37,317,'2006-02-15 05:05:03'),(37,467,'2006-02-15 05:05:03'),(37,477,'2006-02-15 05:05:03'),(37,485,'2006-02-15 05:05:03'),(37,508,'2006-02-15 05:05:03'),(37,529,'2006-02-15 05:05:03'),(37,553,'2006-02-15 05:05:03'),(37,555,'2006-02-15 05:05:03'),(37,572,'2006-02-15 05:05:03'),(37,588,'2006-02-15 05:05:03'),(37,662,'2006-02-15 05:05:03'),(37,663,'2006-02-15 05:05:03'),(37,694,'2006-02-15 05:05:03'),(37,697,'2006-02-15 05:05:03'),(37,785,'2006-02-15 05:05:03'),(37,839,'2006-02-15 05:05:03'),(37,840,'2006-02-15 05:05:03'),(37,853,'2006-02-15 05:05:03'),(37,900,'2006-02-15 05:05:03'),(37,925,'2006-02-15 05:05:03'),(37,963,'2006-02-15 05:05:03'),(37,966,'2006-02-15 05:05:03'),(37,989,'2006-02-15 05:05:03'),(37,997,'2006-02-15 05:05:03'),(38,24,'2006-02-15 05:05:03'),(38,111,'2006-02-15 05:05:03'),(38,160,'2006-02-15 05:05:03'),(38,176,'2006-02-15 05:05:03'),(38,223,'2006-02-15 05:05:03'),(38,241,'2006-02-15 05:05:03'),(38,274,'2006-02-15 05:05:03'),(38,335,'2006-02-15 05:05:03'),(38,338,'2006-02-15 05:05:03'),(38,353,'2006-02-15 05:05:03'),(38,448,'2006-02-15 05:05:03'),(38,450,'2006-02-15 05:05:03'),(38,458,'2006-02-15 05:05:03'),(38,501,'2006-02-15 05:05:03'),(38,516,'2006-02-15 05:05:03'),(38,547,'2006-02-15 05:05:03'),(38,583,'2006-02-15 05:05:03'),(38,618,'2006-02-15 05:05:03'),(38,619,'2006-02-15 05:05:03'),(38,705,'2006-02-15 05:05:03'),(38,793,'2006-02-15 05:05:03'),(38,827,'2006-02-15 05:05:03'),(38,839,'2006-02-15 05:05:03'),(38,853,'2006-02-15 05:05:03'),(38,876,'2006-02-15 05:05:03'),(39,71,'2006-02-15 05:05:03'),(39,73,'2006-02-15 05:05:03'),(39,168,'2006-02-15 05:05:03'),(39,203,'2006-02-15 05:05:03'),(39,222,'2006-02-15 05:05:03'),(39,290,'2006-02-15 05:05:03'),(39,293,'2006-02-15 05:05:03'),(39,320,'2006-02-15 05:05:03'),(39,415,'2006-02-15 05:05:03'),(39,425,'2006-02-15 05:05:03'),(39,431,'2006-02-15 05:05:03'),(39,456,'2006-02-15 05:05:03'),(39,476,'2006-02-15 05:05:03'),(39,559,'2006-02-15 05:05:03'),(39,587,'2006-02-15 05:05:03'),(39,598,'2006-02-15 05:05:03'),(39,606,'2006-02-15 05:05:03'),(39,648,'2006-02-15 05:05:03'),(39,683,'2006-02-15 05:05:03'),(39,689,'2006-02-15 05:05:03'),(39,696,'2006-02-15 05:05:03'),(39,700,'2006-02-15 05:05:03'),(39,703,'2006-02-15 05:05:03'),(39,736,'2006-02-15 05:05:03'),(39,772,'2006-02-15 05:05:03'),(39,815,'2006-02-15 05:05:03'),(39,831,'2006-02-15 05:05:03'),(39,920,'2006-02-15 05:05:03'),(40,1,'2006-02-15 05:05:03'),(40,11,'2006-02-15 05:05:03'),(40,34,'2006-02-15 05:05:03'),(40,107,'2006-02-15 05:05:03'),(40,128,'2006-02-15 05:05:03'),(40,163,'2006-02-15 05:05:03'),(40,177,'2006-02-15 05:05:03'),(40,223,'2006-02-15 05:05:03'),(40,233,'2006-02-15 05:05:03'),(40,326,'2006-02-15 05:05:03'),(40,374,'2006-02-15 05:05:03'),(40,394,'2006-02-15 05:05:03'),(40,396,'2006-02-15 05:05:03'),(40,463,'2006-02-15 05:05:03'),(40,466,'2006-02-15 05:05:03'),(40,494,'2006-02-15 05:05:03'),(40,521,'2006-02-15 05:05:03'),(40,723,'2006-02-15 05:05:03'),(40,737,'2006-02-15 05:05:03'),(40,744,'2006-02-15 05:05:03'),(40,747,'2006-02-15 05:05:03'),(40,754,'2006-02-15 05:05:03'),(40,799,'2006-02-15 05:05:03'),(40,835,'2006-02-15 05:05:03'),(40,868,'2006-02-15 05:05:03'),(40,869,'2006-02-15 05:05:03'),(40,887,'2006-02-15 05:05:03'),(40,933,'2006-02-15 05:05:03'),(40,938,'2006-02-15 05:05:03'),(41,4,'2006-02-15 05:05:03'),(41,60,'2006-02-15 05:05:03'),(41,69,'2006-02-15 05:05:03'),(41,86,'2006-02-15 05:05:03'),(41,100,'2006-02-15 05:05:03'),(41,150,'2006-02-15 05:05:03'),(41,159,'2006-02-15 05:05:03'),(41,194,'2006-02-15 05:05:03'),(41,203,'2006-02-15 05:05:03'),(41,212,'2006-02-15 05:05:03'),(41,230,'2006-02-15 05:05:03'),(41,249,'2006-02-15 05:05:03'),(41,252,'2006-02-15 05:05:03'),(41,305,'2006-02-15 05:05:03'),(41,336,'2006-02-15 05:05:03'),(41,383,'2006-02-15 05:05:03'),(41,544,'2006-02-15 05:05:03'),(41,596,'2006-02-15 05:05:03'),(41,657,'2006-02-15 05:05:03'),(41,674,'2006-02-15 05:05:03'),(41,678,'2006-02-15 05:05:03'),(41,721,'2006-02-15 05:05:03'),(41,724,'2006-02-15 05:05:03'),(41,779,'2006-02-15 05:05:03'),(41,784,'2006-02-15 05:05:03'),(41,799,'2006-02-15 05:05:03'),(41,894,'2006-02-15 05:05:03'),(41,912,'2006-02-15 05:05:03'),(41,942,'2006-02-15 05:05:03'),(42,24,'2006-02-15 05:05:03'),(42,139,'2006-02-15 05:05:03'),(42,309,'2006-02-15 05:05:03'),(42,320,'2006-02-15 05:05:03'),(42,333,'2006-02-15 05:05:03'),(42,500,'2006-02-15 05:05:03'),(42,502,'2006-02-15 05:05:03'),(42,505,'2006-02-15 05:05:03'),(42,527,'2006-02-15 05:05:03'),(42,535,'2006-02-15 05:05:03'),(42,546,'2006-02-15 05:05:03'),(42,568,'2006-02-15 05:05:03'),(42,648,'2006-02-15 05:05:03'),(42,665,'2006-02-15 05:05:03'),(42,673,'2006-02-15 05:05:03'),(42,687,'2006-02-15 05:05:03'),(42,713,'2006-02-15 05:05:03'),(42,738,'2006-02-15 05:05:03'),(42,798,'2006-02-15 05:05:03'),(42,861,'2006-02-15 05:05:03'),(42,865,'2006-02-15 05:05:03'),(42,867,'2006-02-15 05:05:03'),(42,876,'2006-02-15 05:05:03'),(42,890,'2006-02-15 05:05:03'),(42,907,'2006-02-15 05:05:03'),(42,922,'2006-02-15 05:05:03'),(42,932,'2006-02-15 05:05:03'),(43,19,'2006-02-15 05:05:03'),(43,42,'2006-02-15 05:05:03'),(43,56,'2006-02-15 05:05:03'),(43,89,'2006-02-15 05:05:03'),(43,105,'2006-02-15 05:05:03'),(43,147,'2006-02-15 05:05:03'),(43,161,'2006-02-15 05:05:03'),(43,180,'2006-02-15 05:05:03'),(43,239,'2006-02-15 05:05:03'),(43,276,'2006-02-15 05:05:03'),(43,330,'2006-02-15 05:05:03'),(43,344,'2006-02-15 05:05:03'),(43,359,'2006-02-15 05:05:03'),(43,377,'2006-02-15 05:05:03'),(43,410,'2006-02-15 05:05:03'),(43,462,'2006-02-15 05:05:03'),(43,533,'2006-02-15 05:05:03'),(43,598,'2006-02-15 05:05:03'),(43,605,'2006-02-15 05:05:03'),(43,608,'2006-02-15 05:05:03'),(43,621,'2006-02-15 05:05:03'),(43,753,'2006-02-15 05:05:03'),(43,827,'2006-02-15 05:05:03'),(43,833,'2006-02-15 05:05:03'),(43,917,'2006-02-15 05:05:03'),(43,958,'2006-02-15 05:05:03'),(44,58,'2006-02-15 05:05:03'),(44,84,'2006-02-15 05:05:03'),(44,88,'2006-02-15 05:05:03'),(44,94,'2006-02-15 05:05:03'),(44,109,'2006-02-15 05:05:03'),(44,176,'2006-02-15 05:05:03'),(44,242,'2006-02-15 05:05:03'),(44,273,'2006-02-15 05:05:03'),(44,322,'2006-02-15 05:05:03'),(44,420,'2006-02-15 05:05:03'),(44,434,'2006-02-15 05:05:03'),(44,490,'2006-02-15 05:05:03'),(44,591,'2006-02-15 05:05:03'),(44,598,'2006-02-15 05:05:03'),(44,604,'2006-02-15 05:05:03'),(44,699,'2006-02-15 05:05:03'),(44,751,'2006-02-15 05:05:03'),(44,784,'2006-02-15 05:05:03'),(44,825,'2006-02-15 05:05:03'),(44,854,'2006-02-15 05:05:03'),(44,875,'2006-02-15 05:05:03'),(44,878,'2006-02-15 05:05:03'),(44,883,'2006-02-15 05:05:03'),(44,896,'2006-02-15 05:05:03'),(44,902,'2006-02-15 05:05:03'),(44,937,'2006-02-15 05:05:03'),(44,944,'2006-02-15 05:05:03'),(44,952,'2006-02-15 05:05:03'),(44,982,'2006-02-15 05:05:03'),(44,998,'2006-02-15 05:05:03'),(45,18,'2006-02-15 05:05:03'),(45,65,'2006-02-15 05:05:03'),(45,66,'2006-02-15 05:05:03'),(45,115,'2006-02-15 05:05:03'),(45,117,'2006-02-15 05:05:03'),(45,164,'2006-02-15 05:05:03'),(45,187,'2006-02-15 05:05:03'),(45,198,'2006-02-15 05:05:03'),(45,219,'2006-02-15 05:05:03'),(45,330,'2006-02-15 05:05:03'),(45,407,'2006-02-15 05:05:03'),(45,416,'2006-02-15 05:05:03'),(45,463,'2006-02-15 05:05:03'),(45,467,'2006-02-15 05:05:03'),(45,484,'2006-02-15 05:05:03'),(45,502,'2006-02-15 05:05:03'),(45,503,'2006-02-15 05:05:03'),(45,508,'2006-02-15 05:05:03'),(45,537,'2006-02-15 05:05:03'),(45,680,'2006-02-15 05:05:03'),(45,714,'2006-02-15 05:05:03'),(45,767,'2006-02-15 05:05:03'),(45,778,'2006-02-15 05:05:03'),(45,797,'2006-02-15 05:05:03'),(45,810,'2006-02-15 05:05:03'),(45,895,'2006-02-15 05:05:03'),(45,900,'2006-02-15 05:05:03'),(45,901,'2006-02-15 05:05:03'),(45,920,'2006-02-15 05:05:03'),(45,925,'2006-02-15 05:05:03'),(45,975,'2006-02-15 05:05:03'),(45,978,'2006-02-15 05:05:03'),(46,38,'2006-02-15 05:05:03'),(46,51,'2006-02-15 05:05:03'),(46,174,'2006-02-15 05:05:03'),(46,254,'2006-02-15 05:05:03'),(46,296,'2006-02-15 05:05:03'),(46,319,'2006-02-15 05:05:03'),(46,407,'2006-02-15 05:05:03'),(46,448,'2006-02-15 05:05:03'),(46,456,'2006-02-15 05:05:03'),(46,463,'2006-02-15 05:05:03'),(46,478,'2006-02-15 05:05:03'),(46,538,'2006-02-15 05:05:03'),(46,540,'2006-02-15 05:05:03'),(46,567,'2006-02-15 05:05:03'),(46,731,'2006-02-15 05:05:03'),(46,766,'2006-02-15 05:05:03'),(46,768,'2006-02-15 05:05:03'),(46,820,'2006-02-15 05:05:03'),(46,829,'2006-02-15 05:05:03'),(46,830,'2006-02-15 05:05:03'),(46,836,'2006-02-15 05:05:03'),(46,889,'2006-02-15 05:05:03'),(46,980,'2006-02-15 05:05:03'),(46,991,'2006-02-15 05:05:03'),(47,25,'2006-02-15 05:05:03'),(47,36,'2006-02-15 05:05:03'),(47,53,'2006-02-15 05:05:03'),(47,67,'2006-02-15 05:05:03'),(47,172,'2006-02-15 05:05:03'),(47,233,'2006-02-15 05:05:03'),(47,273,'2006-02-15 05:05:03'),(47,351,'2006-02-15 05:05:03'),(47,385,'2006-02-15 05:05:03'),(47,484,'2006-02-15 05:05:03'),(47,508,'2006-02-15 05:05:03'),(47,576,'2006-02-15 05:05:03'),(47,670,'2006-02-15 05:05:03'),(47,734,'2006-02-15 05:05:03'),(47,737,'2006-02-15 05:05:03'),(47,770,'2006-02-15 05:05:03'),(47,777,'2006-02-15 05:05:03'),(47,787,'2006-02-15 05:05:03'),(47,790,'2006-02-15 05:05:03'),(47,913,'2006-02-15 05:05:03'),(47,923,'2006-02-15 05:05:03'),(47,924,'2006-02-15 05:05:03'),(47,944,'2006-02-15 05:05:03'),(47,973,'2006-02-15 05:05:03'),(48,99,'2006-02-15 05:05:03'),(48,101,'2006-02-15 05:05:03'),(48,134,'2006-02-15 05:05:03'),(48,150,'2006-02-15 05:05:03'),(48,164,'2006-02-15 05:05:03'),(48,211,'2006-02-15 05:05:03'),(48,245,'2006-02-15 05:05:03'),(48,267,'2006-02-15 05:05:03'),(48,287,'2006-02-15 05:05:03'),(48,295,'2006-02-15 05:05:03'),(48,312,'2006-02-15 05:05:03'),(48,315,'2006-02-15 05:05:03'),(48,345,'2006-02-15 05:05:03'),(48,349,'2006-02-15 05:05:03'),(48,428,'2006-02-15 05:05:03'),(48,506,'2006-02-15 05:05:03'),(48,545,'2006-02-15 05:05:03'),(48,559,'2006-02-15 05:05:03'),(48,570,'2006-02-15 05:05:03'),(48,599,'2006-02-15 05:05:03'),(48,645,'2006-02-15 05:05:03'),(48,705,'2006-02-15 05:05:03'),(48,757,'2006-02-15 05:05:03'),(48,792,'2006-02-15 05:05:03'),(48,922,'2006-02-15 05:05:03'),(48,926,'2006-02-15 05:05:03'),(49,31,'2006-02-15 05:05:03'),(49,151,'2006-02-15 05:05:03'),(49,195,'2006-02-15 05:05:03'),(49,207,'2006-02-15 05:05:03'),(49,250,'2006-02-15 05:05:03'),(49,282,'2006-02-15 05:05:03'),(49,348,'2006-02-15 05:05:03'),(49,391,'2006-02-15 05:05:03'),(49,400,'2006-02-15 05:05:03'),(49,407,'2006-02-15 05:05:03'),(49,423,'2006-02-15 05:05:03'),(49,433,'2006-02-15 05:05:03'),(49,469,'2006-02-15 05:05:03'),(49,506,'2006-02-15 05:05:03'),(49,542,'2006-02-15 05:05:03'),(49,558,'2006-02-15 05:05:03'),(49,579,'2006-02-15 05:05:03'),(49,595,'2006-02-15 05:05:03'),(49,662,'2006-02-15 05:05:03'),(49,709,'2006-02-15 05:05:03'),(49,716,'2006-02-15 05:05:03'),(49,725,'2006-02-15 05:05:03'),(49,729,'2006-02-15 05:05:03'),(49,811,'2006-02-15 05:05:03'),(49,927,'2006-02-15 05:05:03'),(49,977,'2006-02-15 05:05:03'),(49,980,'2006-02-15 05:05:03'),(50,111,'2006-02-15 05:05:03'),(50,178,'2006-02-15 05:05:03'),(50,243,'2006-02-15 05:05:03'),(50,248,'2006-02-15 05:05:03'),(50,274,'2006-02-15 05:05:03'),(50,288,'2006-02-15 05:05:03'),(50,303,'2006-02-15 05:05:03'),(50,306,'2006-02-15 05:05:03'),(50,327,'2006-02-15 05:05:03'),(50,372,'2006-02-15 05:05:03'),(50,401,'2006-02-15 05:05:03'),(50,417,'2006-02-15 05:05:03'),(50,420,'2006-02-15 05:05:03'),(50,437,'2006-02-15 05:05:03'),(50,476,'2006-02-15 05:05:03'),(50,504,'2006-02-15 05:05:03'),(50,520,'2006-02-15 05:05:03'),(50,552,'2006-02-15 05:05:03'),(50,591,'2006-02-15 05:05:03'),(50,621,'2006-02-15 05:05:03'),(50,632,'2006-02-15 05:05:03'),(50,645,'2006-02-15 05:05:03'),(50,672,'2006-02-15 05:05:03'),(50,717,'2006-02-15 05:05:03'),(50,732,'2006-02-15 05:05:03'),(50,795,'2006-02-15 05:05:03'),(50,829,'2006-02-15 05:05:03'),(50,840,'2006-02-15 05:05:03'),(50,897,'2006-02-15 05:05:03'),(50,918,'2006-02-15 05:05:03'),(50,924,'2006-02-15 05:05:03'),(50,957,'2006-02-15 05:05:03'),(51,5,'2006-02-15 05:05:03'),(51,63,'2006-02-15 05:05:03'),(51,103,'2006-02-15 05:05:03'),(51,112,'2006-02-15 05:05:03'),(51,121,'2006-02-15 05:05:03'),(51,153,'2006-02-15 05:05:03'),(51,395,'2006-02-15 05:05:03'),(51,408,'2006-02-15 05:05:03'),(51,420,'2006-02-15 05:05:03'),(51,461,'2006-02-15 05:05:03'),(51,490,'2006-02-15 05:05:03'),(51,525,'2006-02-15 05:05:03'),(51,627,'2006-02-15 05:05:03'),(51,678,'2006-02-15 05:05:03'),(51,733,'2006-02-15 05:05:03'),(51,734,'2006-02-15 05:05:03'),(51,737,'2006-02-15 05:05:03'),(51,750,'2006-02-15 05:05:03'),(51,847,'2006-02-15 05:05:03'),(51,891,'2006-02-15 05:05:03'),(51,895,'2006-02-15 05:05:03'),(51,940,'2006-02-15 05:05:03'),(51,974,'2006-02-15 05:05:03'),(51,990,'2006-02-15 05:05:03'),(51,993,'2006-02-15 05:05:03'),(52,20,'2006-02-15 05:05:03'),(52,92,'2006-02-15 05:05:03'),(52,96,'2006-02-15 05:05:03'),(52,108,'2006-02-15 05:05:03'),(52,203,'2006-02-15 05:05:03'),(52,249,'2006-02-15 05:05:03'),(52,341,'2006-02-15 05:05:03'),(52,376,'2006-02-15 05:05:03'),(52,388,'2006-02-15 05:05:03'),(52,407,'2006-02-15 05:05:03'),(52,424,'2006-02-15 05:05:03'),(52,474,'2006-02-15 05:05:03'),(52,515,'2006-02-15 05:05:03'),(52,517,'2006-02-15 05:05:03'),(52,584,'2006-02-15 05:05:03'),(52,596,'2006-02-15 05:05:03'),(52,664,'2006-02-15 05:05:03'),(52,675,'2006-02-15 05:05:03'),(52,689,'2006-02-15 05:05:03'),(52,714,'2006-02-15 05:05:03'),(52,812,'2006-02-15 05:05:03'),(52,878,'2006-02-15 05:05:03'),(52,879,'2006-02-15 05:05:03'),(52,915,'2006-02-15 05:05:03'),(52,951,'2006-02-15 05:05:03'),(52,999,'2006-02-15 05:05:03'),(53,1,'2006-02-15 05:05:03'),(53,9,'2006-02-15 05:05:03'),(53,51,'2006-02-15 05:05:03'),(53,58,'2006-02-15 05:05:03'),(53,109,'2006-02-15 05:05:03'),(53,122,'2006-02-15 05:05:03'),(53,126,'2006-02-15 05:05:03'),(53,181,'2006-02-15 05:05:03'),(53,256,'2006-02-15 05:05:03'),(53,268,'2006-02-15 05:05:03'),(53,285,'2006-02-15 05:05:03'),(53,307,'2006-02-15 05:05:03'),(53,358,'2006-02-15 05:05:03'),(53,386,'2006-02-15 05:05:03'),(53,447,'2006-02-15 05:05:03'),(53,465,'2006-02-15 05:05:03'),(53,490,'2006-02-15 05:05:03'),(53,492,'2006-02-15 05:05:03'),(53,508,'2006-02-15 05:05:03'),(53,518,'2006-02-15 05:05:03'),(53,573,'2006-02-15 05:05:03'),(53,576,'2006-02-15 05:05:03'),(53,577,'2006-02-15 05:05:03'),(53,697,'2006-02-15 05:05:03'),(53,725,'2006-02-15 05:05:03'),(53,727,'2006-02-15 05:05:03'),(53,937,'2006-02-15 05:05:03'),(53,947,'2006-02-15 05:05:03'),(53,961,'2006-02-15 05:05:03'),(53,980,'2006-02-15 05:05:03'),(54,84,'2006-02-15 05:05:03'),(54,129,'2006-02-15 05:05:03'),(54,150,'2006-02-15 05:05:03'),(54,184,'2006-02-15 05:05:03'),(54,285,'2006-02-15 05:05:03'),(54,292,'2006-02-15 05:05:03'),(54,301,'2006-02-15 05:05:03'),(54,348,'2006-02-15 05:05:03'),(54,489,'2006-02-15 05:05:03'),(54,510,'2006-02-15 05:05:03'),(54,524,'2006-02-15 05:05:03'),(54,546,'2006-02-15 05:05:03'),(54,600,'2006-02-15 05:05:03'),(54,636,'2006-02-15 05:05:03'),(54,649,'2006-02-15 05:05:03'),(54,658,'2006-02-15 05:05:03'),(54,754,'2006-02-15 05:05:03'),(54,764,'2006-02-15 05:05:03'),(54,842,'2006-02-15 05:05:03'),(54,858,'2006-02-15 05:05:03'),(54,861,'2006-02-15 05:05:03'),(54,913,'2006-02-15 05:05:03'),(54,970,'2006-02-15 05:05:03'),(54,988,'2006-02-15 05:05:03'),(54,990,'2006-02-15 05:05:03'),(55,8,'2006-02-15 05:05:03'),(55,27,'2006-02-15 05:05:03'),(55,75,'2006-02-15 05:05:03'),(55,197,'2006-02-15 05:05:03'),(55,307,'2006-02-15 05:05:03'),(55,320,'2006-02-15 05:05:03'),(55,340,'2006-02-15 05:05:03'),(55,403,'2006-02-15 05:05:03'),(55,485,'2006-02-15 05:05:03'),(55,486,'2006-02-15 05:05:03'),(55,603,'2006-02-15 05:05:03'),(55,612,'2006-02-15 05:05:03'),(55,620,'2006-02-15 05:05:03'),(55,709,'2006-02-15 05:05:03'),(55,776,'2006-02-15 05:05:03'),(55,790,'2006-02-15 05:05:03'),(55,815,'2006-02-15 05:05:03'),(55,827,'2006-02-15 05:05:03'),(55,930,'2006-02-15 05:05:03'),(55,963,'2006-02-15 05:05:03'),(56,63,'2006-02-15 05:05:03'),(56,87,'2006-02-15 05:05:03'),(56,226,'2006-02-15 05:05:03'),(56,236,'2006-02-15 05:05:03'),(56,298,'2006-02-15 05:05:03'),(56,307,'2006-02-15 05:05:03'),(56,354,'2006-02-15 05:05:03'),(56,383,'2006-02-15 05:05:03'),(56,417,'2006-02-15 05:05:03'),(56,421,'2006-02-15 05:05:03'),(56,457,'2006-02-15 05:05:03'),(56,462,'2006-02-15 05:05:03'),(56,474,'2006-02-15 05:05:03'),(56,521,'2006-02-15 05:05:03'),(56,593,'2006-02-15 05:05:03'),(56,728,'2006-02-15 05:05:03'),(56,750,'2006-02-15 05:05:03'),(56,769,'2006-02-15 05:05:03'),(56,781,'2006-02-15 05:05:03'),(56,795,'2006-02-15 05:05:03'),(56,844,'2006-02-15 05:05:03'),(56,851,'2006-02-15 05:05:03'),(56,862,'2006-02-15 05:05:03'),(56,868,'2006-02-15 05:05:03'),(56,892,'2006-02-15 05:05:03'),(56,893,'2006-02-15 05:05:03'),(56,936,'2006-02-15 05:05:03'),(56,965,'2006-02-15 05:05:03'),(57,16,'2006-02-15 05:05:03'),(57,34,'2006-02-15 05:05:03'),(57,101,'2006-02-15 05:05:03'),(57,114,'2006-02-15 05:05:03'),(57,122,'2006-02-15 05:05:03'),(57,134,'2006-02-15 05:05:03'),(57,144,'2006-02-15 05:05:03'),(57,153,'2006-02-15 05:05:03'),(57,192,'2006-02-15 05:05:03'),(57,213,'2006-02-15 05:05:03'),(57,258,'2006-02-15 05:05:03'),(57,267,'2006-02-15 05:05:03'),(57,317,'2006-02-15 05:05:03'),(57,340,'2006-02-15 05:05:03'),(57,393,'2006-02-15 05:05:03'),(57,437,'2006-02-15 05:05:03'),(57,447,'2006-02-15 05:05:03'),(57,502,'2006-02-15 05:05:03'),(57,592,'2006-02-15 05:05:03'),(57,605,'2006-02-15 05:05:03'),(57,637,'2006-02-15 05:05:03'),(57,685,'2006-02-15 05:05:03'),(57,707,'2006-02-15 05:05:03'),(57,714,'2006-02-15 05:05:03'),(57,717,'2006-02-15 05:05:03'),(57,737,'2006-02-15 05:05:03'),(57,767,'2006-02-15 05:05:03'),(57,852,'2006-02-15 05:05:03'),(57,891,'2006-02-15 05:05:03'),(57,918,'2006-02-15 05:05:03'),(58,48,'2006-02-15 05:05:03'),(58,68,'2006-02-15 05:05:03'),(58,119,'2006-02-15 05:05:03'),(58,128,'2006-02-15 05:05:03'),(58,135,'2006-02-15 05:05:03'),(58,175,'2006-02-15 05:05:03'),(58,199,'2006-02-15 05:05:03'),(58,235,'2006-02-15 05:05:03'),(58,242,'2006-02-15 05:05:03'),(58,243,'2006-02-15 05:05:03'),(58,254,'2006-02-15 05:05:03'),(58,306,'2006-02-15 05:05:03'),(58,316,'2006-02-15 05:05:03'),(58,417,'2006-02-15 05:05:03'),(58,426,'2006-02-15 05:05:03'),(58,460,'2006-02-15 05:05:03'),(58,477,'2006-02-15 05:05:03'),(58,541,'2006-02-15 05:05:03'),(58,549,'2006-02-15 05:05:03'),(58,551,'2006-02-15 05:05:03'),(58,553,'2006-02-15 05:05:03'),(58,578,'2006-02-15 05:05:03'),(58,602,'2006-02-15 05:05:03'),(58,632,'2006-02-15 05:05:03'),(58,635,'2006-02-15 05:05:03'),(58,638,'2006-02-15 05:05:03'),(58,698,'2006-02-15 05:05:03'),(58,726,'2006-02-15 05:05:03'),(58,755,'2006-02-15 05:05:03'),(58,800,'2006-02-15 05:05:03'),(58,856,'2006-02-15 05:05:03'),(58,858,'2006-02-15 05:05:03'),(59,5,'2006-02-15 05:05:03'),(59,46,'2006-02-15 05:05:03'),(59,54,'2006-02-15 05:05:03'),(59,72,'2006-02-15 05:05:03'),(59,88,'2006-02-15 05:05:03'),(59,121,'2006-02-15 05:05:03'),(59,129,'2006-02-15 05:05:03'),(59,130,'2006-02-15 05:05:03'),(59,183,'2006-02-15 05:05:03'),(59,210,'2006-02-15 05:05:03'),(59,241,'2006-02-15 05:05:03'),(59,295,'2006-02-15 05:05:03'),(59,418,'2006-02-15 05:05:03'),(59,572,'2006-02-15 05:05:03'),(59,644,'2006-02-15 05:05:03'),(59,650,'2006-02-15 05:05:03'),(59,689,'2006-02-15 05:05:03'),(59,694,'2006-02-15 05:05:03'),(59,702,'2006-02-15 05:05:03'),(59,713,'2006-02-15 05:05:03'),(59,749,'2006-02-15 05:05:03'),(59,772,'2006-02-15 05:05:03'),(59,853,'2006-02-15 05:05:03'),(59,862,'2006-02-15 05:05:03'),(59,943,'2006-02-15 05:05:03'),(59,946,'2006-02-15 05:05:03'),(59,984,'2006-02-15 05:05:03'),(60,31,'2006-02-15 05:05:03'),(60,85,'2006-02-15 05:05:03'),(60,133,'2006-02-15 05:05:03'),(60,142,'2006-02-15 05:05:03'),(60,177,'2006-02-15 05:05:03'),(60,179,'2006-02-15 05:05:03'),(60,186,'2006-02-15 05:05:03'),(60,222,'2006-02-15 05:05:03'),(60,235,'2006-02-15 05:05:03'),(60,239,'2006-02-15 05:05:03'),(60,253,'2006-02-15 05:05:03'),(60,262,'2006-02-15 05:05:03'),(60,297,'2006-02-15 05:05:03'),(60,299,'2006-02-15 05:05:03'),(60,334,'2006-02-15 05:05:03'),(60,376,'2006-02-15 05:05:03'),(60,423,'2006-02-15 05:05:03'),(60,436,'2006-02-15 05:05:03'),(60,493,'2006-02-15 05:05:03'),(60,534,'2006-02-15 05:05:03'),(60,551,'2006-02-15 05:05:03'),(60,658,'2006-02-15 05:05:03'),(60,665,'2006-02-15 05:05:03'),(60,679,'2006-02-15 05:05:03'),(60,754,'2006-02-15 05:05:03'),(60,771,'2006-02-15 05:05:03'),(60,783,'2006-02-15 05:05:03'),(60,784,'2006-02-15 05:05:03'),(60,805,'2006-02-15 05:05:03'),(60,830,'2006-02-15 05:05:03'),(60,835,'2006-02-15 05:05:03'),(60,928,'2006-02-15 05:05:03'),(60,952,'2006-02-15 05:05:03'),(60,971,'2006-02-15 05:05:03'),(60,986,'2006-02-15 05:05:03'),(61,235,'2006-02-15 05:05:03'),(61,237,'2006-02-15 05:05:03'),(61,307,'2006-02-15 05:05:03'),(61,362,'2006-02-15 05:05:03'),(61,372,'2006-02-15 05:05:03'),(61,374,'2006-02-15 05:05:03'),(61,423,'2006-02-15 05:05:03'),(61,433,'2006-02-15 05:05:03'),(61,508,'2006-02-15 05:05:03'),(61,518,'2006-02-15 05:05:03'),(61,519,'2006-02-15 05:05:03'),(61,535,'2006-02-15 05:05:03'),(61,537,'2006-02-15 05:05:03'),(61,585,'2006-02-15 05:05:03'),(61,639,'2006-02-15 05:05:03'),(61,648,'2006-02-15 05:05:03'),(61,649,'2006-02-15 05:05:03'),(61,703,'2006-02-15 05:05:03'),(61,752,'2006-02-15 05:05:03'),(61,766,'2006-02-15 05:05:03'),(61,767,'2006-02-15 05:05:03'),(61,780,'2006-02-15 05:05:03'),(61,831,'2006-02-15 05:05:03'),(61,832,'2006-02-15 05:05:03'),(61,990,'2006-02-15 05:05:03'),(62,6,'2006-02-15 05:05:03'),(62,42,'2006-02-15 05:05:03'),(62,54,'2006-02-15 05:05:03'),(62,100,'2006-02-15 05:05:03'),(62,101,'2006-02-15 05:05:03'),(62,129,'2006-02-15 05:05:03'),(62,198,'2006-02-15 05:05:03'),(62,211,'2006-02-15 05:05:03'),(62,231,'2006-02-15 05:05:03'),(62,272,'2006-02-15 05:05:03'),(62,295,'2006-02-15 05:05:03'),(62,337,'2006-02-15 05:05:03'),(62,375,'2006-02-15 05:05:03'),(62,385,'2006-02-15 05:05:03'),(62,393,'2006-02-15 05:05:03'),(62,398,'2006-02-15 05:05:03'),(62,406,'2006-02-15 05:05:03'),(62,413,'2006-02-15 05:05:03'),(62,428,'2006-02-15 05:05:03'),(62,445,'2006-02-15 05:05:03'),(62,457,'2006-02-15 05:05:03'),(62,465,'2006-02-15 05:05:03'),(62,688,'2006-02-15 05:05:03'),(62,707,'2006-02-15 05:05:03'),(62,719,'2006-02-15 05:05:03'),(62,951,'2006-02-15 05:05:03'),(62,981,'2006-02-15 05:05:03'),(62,988,'2006-02-15 05:05:03'),(62,990,'2006-02-15 05:05:03'),(63,73,'2006-02-15 05:05:03'),(63,134,'2006-02-15 05:05:03'),(63,167,'2006-02-15 05:05:03'),(63,208,'2006-02-15 05:05:03'),(63,225,'2006-02-15 05:05:03'),(63,248,'2006-02-15 05:05:03'),(63,249,'2006-02-15 05:05:03'),(63,278,'2006-02-15 05:05:03'),(63,392,'2006-02-15 05:05:03'),(63,517,'2006-02-15 05:05:03'),(63,633,'2006-02-15 05:05:03'),(63,763,'2006-02-15 05:05:03'),(63,781,'2006-02-15 05:05:03'),(63,809,'2006-02-15 05:05:03'),(63,893,'2006-02-15 05:05:03'),(63,932,'2006-02-15 05:05:03'),(63,944,'2006-02-15 05:05:03'),(63,945,'2006-02-15 05:05:03'),(63,981,'2006-02-15 05:05:03'),(64,3,'2006-02-15 05:05:03'),(64,10,'2006-02-15 05:05:03'),(64,37,'2006-02-15 05:05:03'),(64,87,'2006-02-15 05:05:03'),(64,88,'2006-02-15 05:05:03'),(64,124,'2006-02-15 05:05:03'),(64,197,'2006-02-15 05:05:03'),(64,280,'2006-02-15 05:05:03'),(64,291,'2006-02-15 05:05:03'),(64,307,'2006-02-15 05:05:03'),(64,335,'2006-02-15 05:05:03'),(64,345,'2006-02-15 05:05:03'),(64,448,'2006-02-15 05:05:03'),(64,469,'2006-02-15 05:05:03'),(64,471,'2006-02-15 05:05:03'),(64,506,'2006-02-15 05:05:03'),(64,543,'2006-02-15 05:05:03'),(64,557,'2006-02-15 05:05:03'),(64,569,'2006-02-15 05:05:03'),(64,572,'2006-02-15 05:05:03'),(64,597,'2006-02-15 05:05:03'),(64,616,'2006-02-15 05:05:03'),(64,646,'2006-02-15 05:05:03'),(64,694,'2006-02-15 05:05:03'),(64,832,'2006-02-15 05:05:03'),(64,852,'2006-02-15 05:05:03'),(64,860,'2006-02-15 05:05:03'),(64,921,'2006-02-15 05:05:03'),(64,925,'2006-02-15 05:05:03'),(64,980,'2006-02-15 05:05:03'),(65,39,'2006-02-15 05:05:03'),(65,46,'2006-02-15 05:05:03'),(65,97,'2006-02-15 05:05:03'),(65,106,'2006-02-15 05:05:03'),(65,117,'2006-02-15 05:05:03'),(65,125,'2006-02-15 05:05:03'),(65,158,'2006-02-15 05:05:03'),(65,276,'2006-02-15 05:05:03'),(65,305,'2006-02-15 05:05:03'),(65,338,'2006-02-15 05:05:03'),(65,347,'2006-02-15 05:05:03'),(65,371,'2006-02-15 05:05:03'),(65,398,'2006-02-15 05:05:03'),(65,471,'2006-02-15 05:05:03'),(65,475,'2006-02-15 05:05:03'),(65,476,'2006-02-15 05:05:03'),(65,491,'2006-02-15 05:05:03'),(65,496,'2006-02-15 05:05:03'),(65,516,'2006-02-15 05:05:03'),(65,517,'2006-02-15 05:05:03'),(65,541,'2006-02-15 05:05:03'),(65,556,'2006-02-15 05:05:03'),(65,571,'2006-02-15 05:05:03'),(65,577,'2006-02-15 05:05:03'),(65,615,'2006-02-15 05:05:03'),(65,658,'2006-02-15 05:05:03'),(65,683,'2006-02-15 05:05:03'),(65,694,'2006-02-15 05:05:03'),(65,714,'2006-02-15 05:05:03'),(65,735,'2006-02-15 05:05:03'),(65,852,'2006-02-15 05:05:03'),(65,938,'2006-02-15 05:05:03'),(65,951,'2006-02-15 05:05:03'),(65,965,'2006-02-15 05:05:03'),(66,55,'2006-02-15 05:05:03'),(66,143,'2006-02-15 05:05:03'),(66,207,'2006-02-15 05:05:03'),(66,226,'2006-02-15 05:05:03'),(66,229,'2006-02-15 05:05:03'),(66,230,'2006-02-15 05:05:03'),(66,283,'2006-02-15 05:05:03'),(66,300,'2006-02-15 05:05:03'),(66,342,'2006-02-15 05:05:03'),(66,350,'2006-02-15 05:05:03'),(66,361,'2006-02-15 05:05:03'),(66,376,'2006-02-15 05:05:03'),(66,424,'2006-02-15 05:05:03'),(66,434,'2006-02-15 05:05:03'),(66,553,'2006-02-15 05:05:03'),(66,608,'2006-02-15 05:05:03'),(66,676,'2006-02-15 05:05:03'),(66,697,'2006-02-15 05:05:03'),(66,706,'2006-02-15 05:05:03'),(66,725,'2006-02-15 05:05:03'),(66,769,'2006-02-15 05:05:03'),(66,793,'2006-02-15 05:05:03'),(66,829,'2006-02-15 05:05:03'),(66,871,'2006-02-15 05:05:03'),(66,909,'2006-02-15 05:05:03'),(66,915,'2006-02-15 05:05:03'),(66,928,'2006-02-15 05:05:03'),(66,951,'2006-02-15 05:05:03'),(66,957,'2006-02-15 05:05:03'),(66,960,'2006-02-15 05:05:03'),(66,999,'2006-02-15 05:05:03'),(67,24,'2006-02-15 05:05:03'),(67,57,'2006-02-15 05:05:03'),(67,67,'2006-02-15 05:05:03'),(67,144,'2006-02-15 05:05:03'),(67,242,'2006-02-15 05:05:03'),(67,244,'2006-02-15 05:05:03'),(67,256,'2006-02-15 05:05:03'),(67,408,'2006-02-15 05:05:03'),(67,477,'2006-02-15 05:05:03'),(67,496,'2006-02-15 05:05:03'),(67,512,'2006-02-15 05:05:03'),(67,576,'2006-02-15 05:05:03'),(67,601,'2006-02-15 05:05:03'),(67,725,'2006-02-15 05:05:03'),(67,726,'2006-02-15 05:05:03'),(67,731,'2006-02-15 05:05:03'),(67,766,'2006-02-15 05:05:03'),(67,861,'2006-02-15 05:05:03'),(67,870,'2006-02-15 05:05:03'),(67,915,'2006-02-15 05:05:03'),(67,945,'2006-02-15 05:05:03'),(67,972,'2006-02-15 05:05:03'),(67,981,'2006-02-15 05:05:03'),(68,9,'2006-02-15 05:05:03'),(68,45,'2006-02-15 05:05:03'),(68,133,'2006-02-15 05:05:03'),(68,161,'2006-02-15 05:05:03'),(68,205,'2006-02-15 05:05:03'),(68,213,'2006-02-15 05:05:03'),(68,215,'2006-02-15 05:05:03'),(68,255,'2006-02-15 05:05:03'),(68,296,'2006-02-15 05:05:03'),(68,315,'2006-02-15 05:05:03'),(68,325,'2006-02-15 05:05:03'),(68,331,'2006-02-15 05:05:03'),(68,347,'2006-02-15 05:05:03'),(68,357,'2006-02-15 05:05:03'),(68,378,'2006-02-15 05:05:03'),(68,380,'2006-02-15 05:05:03'),(68,386,'2006-02-15 05:05:03'),(68,396,'2006-02-15 05:05:03'),(68,435,'2006-02-15 05:05:03'),(68,497,'2006-02-15 05:05:03'),(68,607,'2006-02-15 05:05:03'),(68,654,'2006-02-15 05:05:03'),(68,665,'2006-02-15 05:05:03'),(68,671,'2006-02-15 05:05:03'),(68,706,'2006-02-15 05:05:03'),(68,747,'2006-02-15 05:05:03'),(68,834,'2006-02-15 05:05:03'),(68,839,'2006-02-15 05:05:03'),(68,840,'2006-02-15 05:05:03'),(68,971,'2006-02-15 05:05:03'),(69,15,'2006-02-15 05:05:03'),(69,88,'2006-02-15 05:05:03'),(69,111,'2006-02-15 05:05:03'),(69,202,'2006-02-15 05:05:03'),(69,236,'2006-02-15 05:05:03'),(69,292,'2006-02-15 05:05:03'),(69,300,'2006-02-15 05:05:03'),(69,306,'2006-02-15 05:05:03'),(69,374,'2006-02-15 05:05:03'),(69,396,'2006-02-15 05:05:03'),(69,452,'2006-02-15 05:05:03'),(69,466,'2006-02-15 05:05:03'),(69,529,'2006-02-15 05:05:03'),(69,612,'2006-02-15 05:05:03'),(69,720,'2006-02-15 05:05:03'),(69,722,'2006-02-15 05:05:03'),(69,761,'2006-02-15 05:05:03'),(69,791,'2006-02-15 05:05:03'),(69,864,'2006-02-15 05:05:03'),(69,877,'2006-02-15 05:05:03'),(69,914,'2006-02-15 05:05:03'),(70,50,'2006-02-15 05:05:03'),(70,53,'2006-02-15 05:05:03'),(70,92,'2006-02-15 05:05:03'),(70,202,'2006-02-15 05:05:03'),(70,227,'2006-02-15 05:05:03'),(70,249,'2006-02-15 05:05:03'),(70,290,'2006-02-15 05:05:03'),(70,304,'2006-02-15 05:05:03'),(70,343,'2006-02-15 05:05:03'),(70,414,'2006-02-15 05:05:03'),(70,453,'2006-02-15 05:05:03'),(70,466,'2006-02-15 05:05:03'),(70,504,'2006-02-15 05:05:03'),(70,584,'2006-02-15 05:05:03'),(70,628,'2006-02-15 05:05:03'),(70,654,'2006-02-15 05:05:03'),(70,725,'2006-02-15 05:05:03'),(70,823,'2006-02-15 05:05:03'),(70,834,'2006-02-15 05:05:03'),(70,856,'2006-02-15 05:05:03'),(70,869,'2006-02-15 05:05:03'),(70,953,'2006-02-15 05:05:03'),(70,964,'2006-02-15 05:05:03'),(71,26,'2006-02-15 05:05:03'),(71,52,'2006-02-15 05:05:03'),(71,233,'2006-02-15 05:05:03'),(71,317,'2006-02-15 05:05:03'),(71,359,'2006-02-15 05:05:03'),(71,362,'2006-02-15 05:05:03'),(71,385,'2006-02-15 05:05:03'),(71,399,'2006-02-15 05:05:03'),(71,450,'2006-02-15 05:05:03'),(71,532,'2006-02-15 05:05:03'),(71,560,'2006-02-15 05:05:03'),(71,574,'2006-02-15 05:05:03'),(71,638,'2006-02-15 05:05:03'),(71,773,'2006-02-15 05:05:03'),(71,833,'2006-02-15 05:05:03'),(71,874,'2006-02-15 05:05:03'),(71,918,'2006-02-15 05:05:03'),(71,956,'2006-02-15 05:05:03'),(72,34,'2006-02-15 05:05:03'),(72,144,'2006-02-15 05:05:03'),(72,237,'2006-02-15 05:05:03'),(72,249,'2006-02-15 05:05:03'),(72,286,'2006-02-15 05:05:03'),(72,296,'2006-02-15 05:05:03'),(72,325,'2006-02-15 05:05:03'),(72,331,'2006-02-15 05:05:03'),(72,405,'2006-02-15 05:05:03'),(72,450,'2006-02-15 05:05:03'),(72,550,'2006-02-15 05:05:03'),(72,609,'2006-02-15 05:05:03'),(72,623,'2006-02-15 05:05:03'),(72,636,'2006-02-15 05:05:03'),(72,640,'2006-02-15 05:05:03'),(72,665,'2006-02-15 05:05:03'),(72,718,'2006-02-15 05:05:03'),(72,743,'2006-02-15 05:05:03'),(72,757,'2006-02-15 05:05:03'),(72,773,'2006-02-15 05:05:03'),(72,854,'2006-02-15 05:05:03'),(72,865,'2006-02-15 05:05:03'),(72,938,'2006-02-15 05:05:03'),(72,956,'2006-02-15 05:05:03'),(72,964,'2006-02-15 05:05:03'),(72,969,'2006-02-15 05:05:03'),(73,36,'2006-02-15 05:05:03'),(73,45,'2006-02-15 05:05:03'),(73,51,'2006-02-15 05:05:03'),(73,77,'2006-02-15 05:05:03'),(73,148,'2006-02-15 05:05:03'),(73,245,'2006-02-15 05:05:03'),(73,275,'2006-02-15 05:05:03'),(73,322,'2006-02-15 05:05:03'),(73,374,'2006-02-15 05:05:03'),(73,379,'2006-02-15 05:05:03'),(73,467,'2006-02-15 05:05:03'),(73,548,'2006-02-15 05:05:03'),(73,561,'2006-02-15 05:05:03'),(73,562,'2006-02-15 05:05:03'),(73,565,'2006-02-15 05:05:03'),(73,627,'2006-02-15 05:05:03'),(73,666,'2006-02-15 05:05:03'),(73,667,'2006-02-15 05:05:03'),(73,707,'2006-02-15 05:05:03'),(73,748,'2006-02-15 05:05:03'),(73,772,'2006-02-15 05:05:03'),(73,823,'2006-02-15 05:05:03'),(73,936,'2006-02-15 05:05:03'),(73,946,'2006-02-15 05:05:03'),(73,950,'2006-02-15 05:05:03'),(73,998,'2006-02-15 05:05:03'),(74,28,'2006-02-15 05:05:03'),(74,44,'2006-02-15 05:05:03'),(74,117,'2006-02-15 05:05:03'),(74,185,'2006-02-15 05:05:03'),(74,192,'2006-02-15 05:05:03'),(74,203,'2006-02-15 05:05:03'),(74,263,'2006-02-15 05:05:03'),(74,321,'2006-02-15 05:05:03'),(74,415,'2006-02-15 05:05:03'),(74,484,'2006-02-15 05:05:03'),(74,503,'2006-02-15 05:05:03'),(74,537,'2006-02-15 05:05:03'),(74,543,'2006-02-15 05:05:03'),(74,617,'2006-02-15 05:05:03'),(74,626,'2006-02-15 05:05:03'),(74,637,'2006-02-15 05:05:03'),(74,663,'2006-02-15 05:05:03'),(74,704,'2006-02-15 05:05:03'),(74,720,'2006-02-15 05:05:03'),(74,747,'2006-02-15 05:05:03'),(74,780,'2006-02-15 05:05:03'),(74,804,'2006-02-15 05:05:03'),(74,834,'2006-02-15 05:05:03'),(74,836,'2006-02-15 05:05:03'),(74,848,'2006-02-15 05:05:03'),(74,872,'2006-02-15 05:05:03'),(74,902,'2006-02-15 05:05:03'),(74,956,'2006-02-15 05:05:03'),(75,12,'2006-02-15 05:05:03'),(75,34,'2006-02-15 05:05:03'),(75,143,'2006-02-15 05:05:03'),(75,170,'2006-02-15 05:05:03'),(75,222,'2006-02-15 05:05:03'),(75,301,'2006-02-15 05:05:03'),(75,347,'2006-02-15 05:05:03'),(75,372,'2006-02-15 05:05:03'),(75,436,'2006-02-15 05:05:03'),(75,445,'2006-02-15 05:05:03'),(75,446,'2006-02-15 05:05:03'),(75,492,'2006-02-15 05:05:03'),(75,498,'2006-02-15 05:05:03'),(75,508,'2006-02-15 05:05:03'),(75,541,'2006-02-15 05:05:03'),(75,547,'2006-02-15 05:05:03'),(75,579,'2006-02-15 05:05:03'),(75,645,'2006-02-15 05:05:03'),(75,667,'2006-02-15 05:05:03'),(75,744,'2006-02-15 05:05:03'),(75,764,'2006-02-15 05:05:03'),(75,780,'2006-02-15 05:05:03'),(75,870,'2006-02-15 05:05:03'),(75,920,'2006-02-15 05:05:03'),(76,60,'2006-02-15 05:05:03'),(76,66,'2006-02-15 05:05:03'),(76,68,'2006-02-15 05:05:03'),(76,95,'2006-02-15 05:05:03'),(76,122,'2006-02-15 05:05:03'),(76,187,'2006-02-15 05:05:03'),(76,223,'2006-02-15 05:05:03'),(76,234,'2006-02-15 05:05:03'),(76,251,'2006-02-15 05:05:03'),(76,348,'2006-02-15 05:05:03'),(76,444,'2006-02-15 05:05:03'),(76,464,'2006-02-15 05:05:03'),(76,474,'2006-02-15 05:05:03'),(76,498,'2006-02-15 05:05:03'),(76,568,'2006-02-15 05:05:03'),(76,604,'2006-02-15 05:05:03'),(76,606,'2006-02-15 05:05:03'),(76,642,'2006-02-15 05:05:03'),(76,648,'2006-02-15 05:05:03'),(76,650,'2006-02-15 05:05:03'),(76,709,'2006-02-15 05:05:03'),(76,760,'2006-02-15 05:05:03'),(76,765,'2006-02-15 05:05:03'),(76,781,'2006-02-15 05:05:03'),(76,850,'2006-02-15 05:05:03'),(76,862,'2006-02-15 05:05:03'),(76,866,'2006-02-15 05:05:03'),(76,870,'2006-02-15 05:05:03'),(76,912,'2006-02-15 05:05:03'),(76,935,'2006-02-15 05:05:03'),(76,958,'2006-02-15 05:05:03'),(77,13,'2006-02-15 05:05:03'),(77,22,'2006-02-15 05:05:03'),(77,40,'2006-02-15 05:05:03'),(77,73,'2006-02-15 05:05:03'),(77,78,'2006-02-15 05:05:03'),(77,153,'2006-02-15 05:05:03'),(77,224,'2006-02-15 05:05:03'),(77,240,'2006-02-15 05:05:03'),(77,245,'2006-02-15 05:05:03'),(77,261,'2006-02-15 05:05:03'),(77,343,'2006-02-15 05:05:03'),(77,442,'2006-02-15 05:05:03'),(77,458,'2006-02-15 05:05:03'),(77,538,'2006-02-15 05:05:03'),(77,566,'2006-02-15 05:05:03'),(77,612,'2006-02-15 05:05:03'),(77,635,'2006-02-15 05:05:03'),(77,694,'2006-02-15 05:05:03'),(77,749,'2006-02-15 05:05:03'),(77,938,'2006-02-15 05:05:03'),(77,943,'2006-02-15 05:05:03'),(77,963,'2006-02-15 05:05:03'),(77,969,'2006-02-15 05:05:03'),(77,993,'2006-02-15 05:05:03'),(78,86,'2006-02-15 05:05:03'),(78,239,'2006-02-15 05:05:03'),(78,260,'2006-02-15 05:05:03'),(78,261,'2006-02-15 05:05:03'),(78,265,'2006-02-15 05:05:03'),(78,301,'2006-02-15 05:05:03'),(78,387,'2006-02-15 05:05:03'),(78,393,'2006-02-15 05:05:03'),(78,428,'2006-02-15 05:05:03'),(78,457,'2006-02-15 05:05:03'),(78,505,'2006-02-15 05:05:03'),(78,520,'2006-02-15 05:05:03'),(78,530,'2006-02-15 05:05:03'),(78,549,'2006-02-15 05:05:03'),(78,552,'2006-02-15 05:05:03'),(78,599,'2006-02-15 05:05:03'),(78,670,'2006-02-15 05:05:03'),(78,674,'2006-02-15 05:05:03'),(78,689,'2006-02-15 05:05:03'),(78,762,'2006-02-15 05:05:03'),(78,767,'2006-02-15 05:05:03'),(78,811,'2006-02-15 05:05:03'),(78,852,'2006-02-15 05:05:03'),(78,880,'2006-02-15 05:05:03'),(78,963,'2006-02-15 05:05:03'),(78,968,'2006-02-15 05:05:03'),(79,32,'2006-02-15 05:05:03'),(79,33,'2006-02-15 05:05:03'),(79,40,'2006-02-15 05:05:03'),(79,141,'2006-02-15 05:05:03'),(79,205,'2006-02-15 05:05:03'),(79,230,'2006-02-15 05:05:03'),(79,242,'2006-02-15 05:05:03'),(79,262,'2006-02-15 05:05:03'),(79,267,'2006-02-15 05:05:03'),(79,269,'2006-02-15 05:05:03'),(79,299,'2006-02-15 05:05:03'),(79,367,'2006-02-15 05:05:03'),(79,428,'2006-02-15 05:05:03'),(79,430,'2006-02-15 05:05:03'),(79,473,'2006-02-15 05:05:03'),(79,607,'2006-02-15 05:05:03'),(79,628,'2006-02-15 05:05:03'),(79,634,'2006-02-15 05:05:03'),(79,646,'2006-02-15 05:05:03'),(79,727,'2006-02-15 05:05:03'),(79,750,'2006-02-15 05:05:03'),(79,753,'2006-02-15 05:05:03'),(79,769,'2006-02-15 05:05:03'),(79,776,'2006-02-15 05:05:03'),(79,788,'2006-02-15 05:05:03'),(79,840,'2006-02-15 05:05:03'),(79,853,'2006-02-15 05:05:03'),(79,916,'2006-02-15 05:05:03'),(80,69,'2006-02-15 05:05:03'),(80,118,'2006-02-15 05:05:03'),(80,124,'2006-02-15 05:05:03'),(80,175,'2006-02-15 05:05:03'),(80,207,'2006-02-15 05:05:03'),(80,212,'2006-02-15 05:05:03'),(80,260,'2006-02-15 05:05:03'),(80,262,'2006-02-15 05:05:03'),(80,280,'2006-02-15 05:05:03'),(80,341,'2006-02-15 05:05:03'),(80,342,'2006-02-15 05:05:03'),(80,343,'2006-02-15 05:05:03'),(80,362,'2006-02-15 05:05:03'),(80,436,'2006-02-15 05:05:03'),(80,475,'2006-02-15 05:05:03'),(80,553,'2006-02-15 05:05:03'),(80,619,'2006-02-15 05:05:03'),(80,622,'2006-02-15 05:05:03'),(80,680,'2006-02-15 05:05:03'),(80,687,'2006-02-15 05:05:03'),(80,688,'2006-02-15 05:05:03'),(80,709,'2006-02-15 05:05:03'),(80,788,'2006-02-15 05:05:03'),(80,807,'2006-02-15 05:05:03'),(80,858,'2006-02-15 05:05:03'),(80,888,'2006-02-15 05:05:03'),(80,941,'2006-02-15 05:05:03'),(80,979,'2006-02-15 05:05:03'),(81,4,'2006-02-15 05:05:03'),(81,11,'2006-02-15 05:05:03'),(81,59,'2006-02-15 05:05:03'),(81,89,'2006-02-15 05:05:03'),(81,178,'2006-02-15 05:05:03'),(81,186,'2006-02-15 05:05:03'),(81,194,'2006-02-15 05:05:03'),(81,215,'2006-02-15 05:05:03'),(81,219,'2006-02-15 05:05:03'),(81,232,'2006-02-15 05:05:03'),(81,260,'2006-02-15 05:05:03'),(81,267,'2006-02-15 05:05:03'),(81,268,'2006-02-15 05:05:03'),(81,304,'2006-02-15 05:05:03'),(81,332,'2006-02-15 05:05:03'),(81,389,'2006-02-15 05:05:03'),(81,398,'2006-02-15 05:05:03'),(81,453,'2006-02-15 05:05:03'),(81,458,'2006-02-15 05:05:03'),(81,465,'2006-02-15 05:05:03'),(81,505,'2006-02-15 05:05:03'),(81,508,'2006-02-15 05:05:03'),(81,527,'2006-02-15 05:05:03'),(81,545,'2006-02-15 05:05:03'),(81,564,'2006-02-15 05:05:03'),(81,578,'2006-02-15 05:05:03'),(81,579,'2006-02-15 05:05:03'),(81,613,'2006-02-15 05:05:03'),(81,619,'2006-02-15 05:05:03'),(81,643,'2006-02-15 05:05:03'),(81,692,'2006-02-15 05:05:03'),(81,710,'2006-02-15 05:05:03'),(81,729,'2006-02-15 05:05:03'),(81,761,'2006-02-15 05:05:03'),(81,827,'2006-02-15 05:05:03'),(81,910,'2006-02-15 05:05:03'),(82,17,'2006-02-15 05:05:03'),(82,33,'2006-02-15 05:05:03'),(82,104,'2006-02-15 05:05:03'),(82,143,'2006-02-15 05:05:03'),(82,188,'2006-02-15 05:05:03'),(82,242,'2006-02-15 05:05:03'),(82,247,'2006-02-15 05:05:03'),(82,290,'2006-02-15 05:05:03'),(82,306,'2006-02-15 05:05:03'),(82,316,'2006-02-15 05:05:03'),(82,344,'2006-02-15 05:05:03'),(82,453,'2006-02-15 05:05:03'),(82,468,'2006-02-15 05:05:03'),(82,480,'2006-02-15 05:05:03'),(82,497,'2006-02-15 05:05:03'),(82,503,'2006-02-15 05:05:03'),(82,527,'2006-02-15 05:05:03'),(82,551,'2006-02-15 05:05:03'),(82,561,'2006-02-15 05:05:03'),(82,750,'2006-02-15 05:05:03'),(82,787,'2006-02-15 05:05:03'),(82,802,'2006-02-15 05:05:03'),(82,838,'2006-02-15 05:05:03'),(82,839,'2006-02-15 05:05:03'),(82,870,'2006-02-15 05:05:03'),(82,877,'2006-02-15 05:05:03'),(82,893,'2006-02-15 05:05:03'),(82,911,'2006-02-15 05:05:03'),(82,954,'2006-02-15 05:05:03'),(82,978,'2006-02-15 05:05:03'),(82,985,'2006-02-15 05:05:03'),(83,49,'2006-02-15 05:05:03'),(83,52,'2006-02-15 05:05:03'),(83,58,'2006-02-15 05:05:03'),(83,110,'2006-02-15 05:05:03'),(83,120,'2006-02-15 05:05:03'),(83,121,'2006-02-15 05:05:03'),(83,135,'2006-02-15 05:05:03'),(83,165,'2006-02-15 05:05:03'),(83,217,'2006-02-15 05:05:03'),(83,247,'2006-02-15 05:05:03'),(83,249,'2006-02-15 05:05:03'),(83,263,'2006-02-15 05:05:03'),(83,268,'2006-02-15 05:05:03'),(83,279,'2006-02-15 05:05:03'),(83,281,'2006-02-15 05:05:03'),(83,339,'2006-02-15 05:05:03'),(83,340,'2006-02-15 05:05:03'),(83,369,'2006-02-15 05:05:03'),(83,412,'2006-02-15 05:05:03'),(83,519,'2006-02-15 05:05:03'),(83,529,'2006-02-15 05:05:03'),(83,615,'2006-02-15 05:05:03'),(83,631,'2006-02-15 05:05:03'),(83,655,'2006-02-15 05:05:03'),(83,672,'2006-02-15 05:05:03'),(83,686,'2006-02-15 05:05:03'),(83,719,'2006-02-15 05:05:03'),(83,764,'2006-02-15 05:05:03'),(83,777,'2006-02-15 05:05:03'),(83,784,'2006-02-15 05:05:03'),(83,833,'2006-02-15 05:05:03'),(83,873,'2006-02-15 05:05:03'),(83,932,'2006-02-15 05:05:03'),(84,19,'2006-02-15 05:05:03'),(84,39,'2006-02-15 05:05:03'),(84,46,'2006-02-15 05:05:03'),(84,175,'2006-02-15 05:05:03'),(84,238,'2006-02-15 05:05:03'),(84,281,'2006-02-15 05:05:03'),(84,290,'2006-02-15 05:05:03'),(84,312,'2006-02-15 05:05:03'),(84,317,'2006-02-15 05:05:03'),(84,413,'2006-02-15 05:05:03'),(84,414,'2006-02-15 05:05:03'),(84,460,'2006-02-15 05:05:03'),(84,479,'2006-02-15 05:05:03'),(84,491,'2006-02-15 05:05:03'),(84,529,'2006-02-15 05:05:03'),(84,540,'2006-02-15 05:05:03'),(84,566,'2006-02-15 05:05:03'),(84,574,'2006-02-15 05:05:03'),(84,589,'2006-02-15 05:05:03'),(84,616,'2006-02-15 05:05:03'),(84,646,'2006-02-15 05:05:03'),(84,703,'2006-02-15 05:05:03'),(84,729,'2006-02-15 05:05:03'),(84,764,'2006-02-15 05:05:03'),(84,782,'2006-02-15 05:05:03'),(84,809,'2006-02-15 05:05:03'),(84,830,'2006-02-15 05:05:03'),(84,843,'2006-02-15 05:05:03'),(84,887,'2006-02-15 05:05:03'),(84,975,'2006-02-15 05:05:03'),(84,996,'2006-02-15 05:05:03'),(85,2,'2006-02-15 05:05:03'),(85,14,'2006-02-15 05:05:03'),(85,72,'2006-02-15 05:05:03'),(85,85,'2006-02-15 05:05:03'),(85,92,'2006-02-15 05:05:03'),(85,148,'2006-02-15 05:05:03'),(85,216,'2006-02-15 05:05:03'),(85,290,'2006-02-15 05:05:03'),(85,296,'2006-02-15 05:05:03'),(85,297,'2006-02-15 05:05:03'),(85,337,'2006-02-15 05:05:03'),(85,383,'2006-02-15 05:05:03'),(85,421,'2006-02-15 05:05:03'),(85,446,'2006-02-15 05:05:03'),(85,461,'2006-02-15 05:05:03'),(85,475,'2006-02-15 05:05:03'),(85,478,'2006-02-15 05:05:03'),(85,522,'2006-02-15 05:05:03'),(85,543,'2006-02-15 05:05:03'),(85,558,'2006-02-15 05:05:03'),(85,591,'2006-02-15 05:05:03'),(85,630,'2006-02-15 05:05:03'),(85,678,'2006-02-15 05:05:03'),(85,711,'2006-02-15 05:05:03'),(85,761,'2006-02-15 05:05:03'),(85,812,'2006-02-15 05:05:03'),(85,869,'2006-02-15 05:05:03'),(85,875,'2006-02-15 05:05:03'),(85,895,'2006-02-15 05:05:03'),(85,957,'2006-02-15 05:05:03'),(85,960,'2006-02-15 05:05:03'),(86,137,'2006-02-15 05:05:03'),(86,163,'2006-02-15 05:05:03'),(86,196,'2006-02-15 05:05:03'),(86,216,'2006-02-15 05:05:03'),(86,249,'2006-02-15 05:05:03'),(86,303,'2006-02-15 05:05:03'),(86,331,'2006-02-15 05:05:03'),(86,364,'2006-02-15 05:05:03'),(86,391,'2006-02-15 05:05:03'),(86,432,'2006-02-15 05:05:03'),(86,482,'2006-02-15 05:05:03'),(86,486,'2006-02-15 05:05:03'),(86,519,'2006-02-15 05:05:03'),(86,520,'2006-02-15 05:05:03'),(86,548,'2006-02-15 05:05:03'),(86,623,'2006-02-15 05:05:03'),(86,631,'2006-02-15 05:05:03'),(86,636,'2006-02-15 05:05:03'),(86,752,'2006-02-15 05:05:03'),(86,760,'2006-02-15 05:05:03'),(86,808,'2006-02-15 05:05:03'),(86,857,'2006-02-15 05:05:03'),(86,878,'2006-02-15 05:05:03'),(86,893,'2006-02-15 05:05:03'),(86,905,'2006-02-15 05:05:03'),(86,923,'2006-02-15 05:05:03'),(86,929,'2006-02-15 05:05:03'),(87,48,'2006-02-15 05:05:03'),(87,157,'2006-02-15 05:05:03'),(87,161,'2006-02-15 05:05:03'),(87,199,'2006-02-15 05:05:03'),(87,207,'2006-02-15 05:05:03'),(87,250,'2006-02-15 05:05:03'),(87,253,'2006-02-15 05:05:03'),(87,312,'2006-02-15 05:05:03'),(87,421,'2006-02-15 05:05:03'),(87,570,'2006-02-15 05:05:03'),(87,599,'2006-02-15 05:05:03'),(87,606,'2006-02-15 05:05:03'),(87,654,'2006-02-15 05:05:03'),(87,679,'2006-02-15 05:05:03'),(87,706,'2006-02-15 05:05:03'),(87,718,'2006-02-15 05:05:03'),(87,721,'2006-02-15 05:05:03'),(87,830,'2006-02-15 05:05:03'),(87,870,'2006-02-15 05:05:03'),(87,952,'2006-02-15 05:05:03'),(87,961,'2006-02-15 05:05:03'),(88,4,'2006-02-15 05:05:03'),(88,76,'2006-02-15 05:05:03'),(88,87,'2006-02-15 05:05:03'),(88,128,'2006-02-15 05:05:03'),(88,170,'2006-02-15 05:05:03'),(88,193,'2006-02-15 05:05:03'),(88,234,'2006-02-15 05:05:03'),(88,304,'2006-02-15 05:05:03'),(88,602,'2006-02-15 05:05:03'),(88,620,'2006-02-15 05:05:03'),(88,668,'2006-02-15 05:05:03'),(88,717,'2006-02-15 05:05:03'),(88,785,'2006-02-15 05:05:03'),(88,819,'2006-02-15 05:05:03'),(88,839,'2006-02-15 05:05:03'),(88,881,'2006-02-15 05:05:03'),(88,908,'2006-02-15 05:05:03'),(88,929,'2006-02-15 05:05:03'),(88,940,'2006-02-15 05:05:03'),(88,968,'2006-02-15 05:05:03'),(89,47,'2006-02-15 05:05:03'),(89,103,'2006-02-15 05:05:03'),(89,117,'2006-02-15 05:05:03'),(89,162,'2006-02-15 05:05:03'),(89,182,'2006-02-15 05:05:03'),(89,187,'2006-02-15 05:05:03'),(89,212,'2006-02-15 05:05:03'),(89,254,'2006-02-15 05:05:03'),(89,266,'2006-02-15 05:05:03'),(89,306,'2006-02-15 05:05:03'),(89,342,'2006-02-15 05:05:03'),(89,406,'2006-02-15 05:05:03'),(89,410,'2006-02-15 05:05:03'),(89,446,'2006-02-15 05:05:03'),(89,473,'2006-02-15 05:05:03'),(89,488,'2006-02-15 05:05:03'),(89,529,'2006-02-15 05:05:03'),(89,542,'2006-02-15 05:05:03'),(89,564,'2006-02-15 05:05:03'),(89,697,'2006-02-15 05:05:03'),(89,833,'2006-02-15 05:05:03'),(89,864,'2006-02-15 05:05:03'),(89,970,'2006-02-15 05:05:03'),(89,976,'2006-02-15 05:05:03'),(90,2,'2006-02-15 05:05:03'),(90,11,'2006-02-15 05:05:03'),(90,100,'2006-02-15 05:05:03'),(90,197,'2006-02-15 05:05:03'),(90,212,'2006-02-15 05:05:03'),(90,262,'2006-02-15 05:05:03'),(90,303,'2006-02-15 05:05:03'),(90,330,'2006-02-15 05:05:03'),(90,363,'2006-02-15 05:05:03'),(90,374,'2006-02-15 05:05:03'),(90,384,'2006-02-15 05:05:03'),(90,385,'2006-02-15 05:05:03'),(90,391,'2006-02-15 05:05:03'),(90,406,'2006-02-15 05:05:03'),(90,433,'2006-02-15 05:05:03'),(90,442,'2006-02-15 05:05:03'),(90,451,'2006-02-15 05:05:03'),(90,520,'2006-02-15 05:05:03'),(90,529,'2006-02-15 05:05:03'),(90,542,'2006-02-15 05:05:03'),(90,586,'2006-02-15 05:05:03'),(90,633,'2006-02-15 05:05:03'),(90,663,'2006-02-15 05:05:03'),(90,676,'2006-02-15 05:05:03'),(90,771,'2006-02-15 05:05:03'),(90,817,'2006-02-15 05:05:03'),(90,838,'2006-02-15 05:05:03'),(90,855,'2006-02-15 05:05:03'),(90,858,'2006-02-15 05:05:03'),(90,868,'2006-02-15 05:05:03'),(90,880,'2006-02-15 05:05:03'),(90,901,'2006-02-15 05:05:03'),(90,925,'2006-02-15 05:05:03'),(91,13,'2006-02-15 05:05:03'),(91,25,'2006-02-15 05:05:03'),(91,48,'2006-02-15 05:05:03'),(91,176,'2006-02-15 05:05:03'),(91,181,'2006-02-15 05:05:03'),(91,190,'2006-02-15 05:05:03'),(91,335,'2006-02-15 05:05:03'),(91,416,'2006-02-15 05:05:03'),(91,447,'2006-02-15 05:05:03'),(91,480,'2006-02-15 05:05:03'),(91,493,'2006-02-15 05:05:03'),(91,509,'2006-02-15 05:05:03'),(91,511,'2006-02-15 05:05:03'),(91,608,'2006-02-15 05:05:03'),(91,807,'2006-02-15 05:05:03'),(91,829,'2006-02-15 05:05:03'),(91,849,'2006-02-15 05:05:03'),(91,859,'2006-02-15 05:05:03'),(91,941,'2006-02-15 05:05:03'),(91,982,'2006-02-15 05:05:03'),(92,90,'2006-02-15 05:05:03'),(92,94,'2006-02-15 05:05:03'),(92,103,'2006-02-15 05:05:03'),(92,104,'2006-02-15 05:05:03'),(92,123,'2006-02-15 05:05:03'),(92,137,'2006-02-15 05:05:03'),(92,207,'2006-02-15 05:05:03'),(92,229,'2006-02-15 05:05:03'),(92,338,'2006-02-15 05:05:03'),(92,381,'2006-02-15 05:05:03'),(92,436,'2006-02-15 05:05:03'),(92,443,'2006-02-15 05:05:03'),(92,453,'2006-02-15 05:05:03'),(92,470,'2006-02-15 05:05:03'),(92,505,'2006-02-15 05:05:03'),(92,512,'2006-02-15 05:05:03'),(92,543,'2006-02-15 05:05:03'),(92,545,'2006-02-15 05:05:03'),(92,547,'2006-02-15 05:05:03'),(92,553,'2006-02-15 05:05:03'),(92,564,'2006-02-15 05:05:03'),(92,568,'2006-02-15 05:05:03'),(92,618,'2006-02-15 05:05:03'),(92,662,'2006-02-15 05:05:03'),(92,686,'2006-02-15 05:05:03'),(92,699,'2006-02-15 05:05:03'),(92,712,'2006-02-15 05:05:03'),(92,728,'2006-02-15 05:05:03'),(92,802,'2006-02-15 05:05:03'),(92,825,'2006-02-15 05:05:03'),(92,838,'2006-02-15 05:05:03'),(92,889,'2006-02-15 05:05:03'),(92,929,'2006-02-15 05:05:03'),(92,991,'2006-02-15 05:05:03'),(93,71,'2006-02-15 05:05:03'),(93,120,'2006-02-15 05:05:03'),(93,124,'2006-02-15 05:05:03'),(93,280,'2006-02-15 05:05:03'),(93,325,'2006-02-15 05:05:03'),(93,339,'2006-02-15 05:05:03'),(93,427,'2006-02-15 05:05:03'),(93,445,'2006-02-15 05:05:03'),(93,453,'2006-02-15 05:05:03'),(93,473,'2006-02-15 05:05:03'),(93,573,'2006-02-15 05:05:03'),(93,621,'2006-02-15 05:05:03'),(93,644,'2006-02-15 05:05:03'),(93,678,'2006-02-15 05:05:03'),(93,680,'2006-02-15 05:05:03'),(93,699,'2006-02-15 05:05:03'),(93,744,'2006-02-15 05:05:03'),(93,768,'2006-02-15 05:05:03'),(93,777,'2006-02-15 05:05:03'),(93,835,'2006-02-15 05:05:03'),(93,856,'2006-02-15 05:05:03'),(93,874,'2006-02-15 05:05:03'),(93,909,'2006-02-15 05:05:03'),(93,916,'2006-02-15 05:05:03'),(93,982,'2006-02-15 05:05:03'),(94,13,'2006-02-15 05:05:03'),(94,60,'2006-02-15 05:05:03'),(94,76,'2006-02-15 05:05:03'),(94,122,'2006-02-15 05:05:03'),(94,153,'2006-02-15 05:05:03'),(94,193,'2006-02-15 05:05:03'),(94,206,'2006-02-15 05:05:03'),(94,228,'2006-02-15 05:05:03'),(94,270,'2006-02-15 05:05:03'),(94,275,'2006-02-15 05:05:03'),(94,320,'2006-02-15 05:05:03'),(94,322,'2006-02-15 05:05:03'),(94,337,'2006-02-15 05:05:03'),(94,354,'2006-02-15 05:05:03'),(94,402,'2006-02-15 05:05:03'),(94,428,'2006-02-15 05:05:03'),(94,457,'2006-02-15 05:05:03'),(94,473,'2006-02-15 05:05:03'),(94,475,'2006-02-15 05:05:03'),(94,512,'2006-02-15 05:05:03'),(94,517,'2006-02-15 05:05:03'),(94,521,'2006-02-15 05:05:03'),(94,533,'2006-02-15 05:05:03'),(94,540,'2006-02-15 05:05:03'),(94,548,'2006-02-15 05:05:03'),(94,551,'2006-02-15 05:05:03'),(94,712,'2006-02-15 05:05:03'),(94,713,'2006-02-15 05:05:03'),(94,724,'2006-02-15 05:05:03'),(94,775,'2006-02-15 05:05:03'),(94,788,'2006-02-15 05:05:03'),(94,950,'2006-02-15 05:05:03'),(94,989,'2006-02-15 05:05:03'),(95,22,'2006-02-15 05:05:03'),(95,35,'2006-02-15 05:05:03'),(95,47,'2006-02-15 05:05:03'),(95,52,'2006-02-15 05:05:03'),(95,65,'2006-02-15 05:05:03'),(95,74,'2006-02-15 05:05:03'),(95,126,'2006-02-15 05:05:03'),(95,207,'2006-02-15 05:05:03'),(95,245,'2006-02-15 05:05:03'),(95,294,'2006-02-15 05:05:03'),(95,301,'2006-02-15 05:05:03'),(95,312,'2006-02-15 05:05:03'),(95,329,'2006-02-15 05:05:03'),(95,353,'2006-02-15 05:05:03'),(95,375,'2006-02-15 05:05:03'),(95,420,'2006-02-15 05:05:03'),(95,424,'2006-02-15 05:05:03'),(95,431,'2006-02-15 05:05:03'),(95,498,'2006-02-15 05:05:03'),(95,522,'2006-02-15 05:05:03'),(95,546,'2006-02-15 05:05:03'),(95,551,'2006-02-15 05:05:03'),(95,619,'2006-02-15 05:05:03'),(95,627,'2006-02-15 05:05:03'),(95,690,'2006-02-15 05:05:03'),(95,748,'2006-02-15 05:05:03'),(95,813,'2006-02-15 05:05:03'),(95,828,'2006-02-15 05:05:03'),(95,855,'2006-02-15 05:05:03'),(95,903,'2006-02-15 05:05:03'),(95,923,'2006-02-15 05:05:03'),(96,8,'2006-02-15 05:05:03'),(96,36,'2006-02-15 05:05:03'),(96,40,'2006-02-15 05:05:03'),(96,54,'2006-02-15 05:05:03'),(96,58,'2006-02-15 05:05:03'),(96,66,'2006-02-15 05:05:03'),(96,134,'2006-02-15 05:05:03'),(96,209,'2006-02-15 05:05:03'),(96,244,'2006-02-15 05:05:03'),(96,320,'2006-02-15 05:05:03'),(96,430,'2006-02-15 05:05:03'),(96,452,'2006-02-15 05:05:03'),(96,486,'2006-02-15 05:05:03'),(96,572,'2006-02-15 05:05:03'),(96,590,'2006-02-15 05:05:03'),(96,661,'2006-02-15 05:05:03'),(96,778,'2006-02-15 05:05:03'),(96,832,'2006-02-15 05:05:03'),(96,846,'2006-02-15 05:05:03'),(96,874,'2006-02-15 05:05:03'),(96,945,'2006-02-15 05:05:03'),(96,968,'2006-02-15 05:05:03'),(96,987,'2006-02-15 05:05:03'),(97,143,'2006-02-15 05:05:03'),(97,177,'2006-02-15 05:05:03'),(97,188,'2006-02-15 05:05:03'),(97,197,'2006-02-15 05:05:03'),(97,256,'2006-02-15 05:05:03'),(97,312,'2006-02-15 05:05:03'),(97,342,'2006-02-15 05:05:03'),(97,348,'2006-02-15 05:05:03'),(97,358,'2006-02-15 05:05:03'),(97,370,'2006-02-15 05:05:03'),(97,437,'2006-02-15 05:05:03'),(97,446,'2006-02-15 05:05:03'),(97,466,'2006-02-15 05:05:03'),(97,518,'2006-02-15 05:05:03'),(97,553,'2006-02-15 05:05:03'),(97,561,'2006-02-15 05:05:03'),(97,641,'2006-02-15 05:05:03'),(97,656,'2006-02-15 05:05:03'),(97,728,'2006-02-15 05:05:03'),(97,755,'2006-02-15 05:05:03'),(97,757,'2006-02-15 05:05:03'),(97,826,'2006-02-15 05:05:03'),(97,862,'2006-02-15 05:05:03'),(97,930,'2006-02-15 05:05:03'),(97,933,'2006-02-15 05:05:03'),(97,947,'2006-02-15 05:05:03'),(97,951,'2006-02-15 05:05:03'),(98,66,'2006-02-15 05:05:03'),(98,72,'2006-02-15 05:05:03'),(98,81,'2006-02-15 05:05:03'),(98,87,'2006-02-15 05:05:03'),(98,107,'2006-02-15 05:05:03'),(98,120,'2006-02-15 05:05:03'),(98,183,'2006-02-15 05:05:03'),(98,194,'2006-02-15 05:05:03'),(98,212,'2006-02-15 05:05:03'),(98,297,'2006-02-15 05:05:03'),(98,607,'2006-02-15 05:05:03'),(98,634,'2006-02-15 05:05:03'),(98,686,'2006-02-15 05:05:03'),(98,705,'2006-02-15 05:05:03'),(98,710,'2006-02-15 05:05:03'),(98,721,'2006-02-15 05:05:03'),(98,725,'2006-02-15 05:05:03'),(98,734,'2006-02-15 05:05:03'),(98,738,'2006-02-15 05:05:03'),(98,765,'2006-02-15 05:05:03'),(98,782,'2006-02-15 05:05:03'),(98,824,'2006-02-15 05:05:03'),(98,829,'2006-02-15 05:05:03'),(98,912,'2006-02-15 05:05:03'),(98,955,'2006-02-15 05:05:03'),(98,985,'2006-02-15 05:05:03'),(98,990,'2006-02-15 05:05:03'),(99,7,'2006-02-15 05:05:03'),(99,27,'2006-02-15 05:05:03'),(99,84,'2006-02-15 05:05:03'),(99,250,'2006-02-15 05:05:03'),(99,322,'2006-02-15 05:05:03'),(99,325,'2006-02-15 05:05:03'),(99,381,'2006-02-15 05:05:03'),(99,414,'2006-02-15 05:05:03'),(99,475,'2006-02-15 05:05:03'),(99,490,'2006-02-15 05:05:03'),(99,512,'2006-02-15 05:05:03'),(99,540,'2006-02-15 05:05:03'),(99,572,'2006-02-15 05:05:03'),(99,600,'2006-02-15 05:05:03'),(99,618,'2006-02-15 05:05:03'),(99,620,'2006-02-15 05:05:03'),(99,622,'2006-02-15 05:05:03'),(99,636,'2006-02-15 05:05:03'),(99,672,'2006-02-15 05:05:03'),(99,726,'2006-02-15 05:05:03'),(99,741,'2006-02-15 05:05:03'),(99,796,'2006-02-15 05:05:03'),(99,835,'2006-02-15 05:05:03'),(99,967,'2006-02-15 05:05:03'),(99,978,'2006-02-15 05:05:03'),(99,982,'2006-02-15 05:05:03'),(100,17,'2006-02-15 05:05:03'),(100,118,'2006-02-15 05:05:03'),(100,250,'2006-02-15 05:05:03'),(100,411,'2006-02-15 05:05:03'),(100,414,'2006-02-15 05:05:03'),(100,513,'2006-02-15 05:05:03'),(100,563,'2006-02-15 05:05:03'),(100,642,'2006-02-15 05:05:03'),(100,714,'2006-02-15 05:05:03'),(100,718,'2006-02-15 05:05:03'),(100,759,'2006-02-15 05:05:03'),(100,779,'2006-02-15 05:05:03'),(100,815,'2006-02-15 05:05:03'),(100,846,'2006-02-15 05:05:03'),(100,850,'2006-02-15 05:05:03'),(100,872,'2006-02-15 05:05:03'),(100,877,'2006-02-15 05:05:03'),(100,909,'2006-02-15 05:05:03'),(100,919,'2006-02-15 05:05:03'),(100,944,'2006-02-15 05:05:03'),(100,967,'2006-02-15 05:05:03'),(100,979,'2006-02-15 05:05:03'),(100,991,'2006-02-15 05:05:03'),(100,992,'2006-02-15 05:05:03'),(101,60,'2006-02-15 05:05:03'),(101,66,'2006-02-15 05:05:03'),(101,85,'2006-02-15 05:05:03'),(101,146,'2006-02-15 05:05:03'),(101,189,'2006-02-15 05:05:03'),(101,250,'2006-02-15 05:05:03'),(101,255,'2006-02-15 05:05:03'),(101,263,'2006-02-15 05:05:03'),(101,275,'2006-02-15 05:05:03'),(101,289,'2006-02-15 05:05:03'),(101,491,'2006-02-15 05:05:03'),(101,494,'2006-02-15 05:05:03'),(101,511,'2006-02-15 05:05:03'),(101,568,'2006-02-15 05:05:03'),(101,608,'2006-02-15 05:05:03'),(101,617,'2006-02-15 05:05:03'),(101,655,'2006-02-15 05:05:03'),(101,662,'2006-02-15 05:05:03'),(101,700,'2006-02-15 05:05:03'),(101,702,'2006-02-15 05:05:03'),(101,758,'2006-02-15 05:05:03'),(101,774,'2006-02-15 05:05:03'),(101,787,'2006-02-15 05:05:03'),(101,828,'2006-02-15 05:05:03'),(101,841,'2006-02-15 05:05:03'),(101,928,'2006-02-15 05:05:03'),(101,932,'2006-02-15 05:05:03'),(101,936,'2006-02-15 05:05:03'),(101,941,'2006-02-15 05:05:03'),(101,978,'2006-02-15 05:05:03'),(101,980,'2006-02-15 05:05:03'),(101,984,'2006-02-15 05:05:03'),(101,988,'2006-02-15 05:05:03'),(102,20,'2006-02-15 05:05:03'),(102,34,'2006-02-15 05:05:03'),(102,53,'2006-02-15 05:05:03'),(102,123,'2006-02-15 05:05:03'),(102,124,'2006-02-15 05:05:03'),(102,194,'2006-02-15 05:05:03'),(102,200,'2006-02-15 05:05:03'),(102,205,'2006-02-15 05:05:03'),(102,268,'2006-02-15 05:05:03'),(102,326,'2006-02-15 05:05:03'),(102,329,'2006-02-15 05:05:03'),(102,334,'2006-02-15 05:05:03'),(102,351,'2006-02-15 05:05:03'),(102,418,'2006-02-15 05:05:03'),(102,431,'2006-02-15 05:05:03'),(102,446,'2006-02-15 05:05:03'),(102,485,'2006-02-15 05:05:03'),(102,508,'2006-02-15 05:05:03'),(102,517,'2006-02-15 05:05:03'),(102,521,'2006-02-15 05:05:03'),(102,526,'2006-02-15 05:05:03'),(102,529,'2006-02-15 05:05:03'),(102,544,'2006-02-15 05:05:03'),(102,600,'2006-02-15 05:05:03'),(102,605,'2006-02-15 05:05:03'),(102,606,'2006-02-15 05:05:03'),(102,624,'2006-02-15 05:05:03'),(102,631,'2006-02-15 05:05:03'),(102,712,'2006-02-15 05:05:03'),(102,728,'2006-02-15 05:05:03'),(102,744,'2006-02-15 05:05:03'),(102,796,'2006-02-15 05:05:03'),(102,802,'2006-02-15 05:05:03'),(102,810,'2006-02-15 05:05:03'),(102,828,'2006-02-15 05:05:03'),(102,837,'2006-02-15 05:05:03'),(102,845,'2006-02-15 05:05:03'),(102,852,'2006-02-15 05:05:03'),(102,958,'2006-02-15 05:05:03'),(102,979,'2006-02-15 05:05:03'),(102,980,'2006-02-15 05:05:03'),(103,5,'2006-02-15 05:05:03'),(103,118,'2006-02-15 05:05:03'),(103,130,'2006-02-15 05:05:03'),(103,197,'2006-02-15 05:05:03'),(103,199,'2006-02-15 05:05:03'),(103,206,'2006-02-15 05:05:03'),(103,215,'2006-02-15 05:05:03'),(103,221,'2006-02-15 05:05:03'),(103,271,'2006-02-15 05:05:03'),(103,285,'2006-02-15 05:05:03'),(103,315,'2006-02-15 05:05:03'),(103,318,'2006-02-15 05:05:03'),(103,333,'2006-02-15 05:05:03'),(103,347,'2006-02-15 05:05:03'),(103,356,'2006-02-15 05:05:03'),(103,360,'2006-02-15 05:05:03'),(103,378,'2006-02-15 05:05:03'),(103,437,'2006-02-15 05:05:03'),(103,585,'2006-02-15 05:05:03'),(103,609,'2006-02-15 05:05:03'),(103,639,'2006-02-15 05:05:03'),(103,643,'2006-02-15 05:05:03'),(103,692,'2006-02-15 05:05:03'),(103,735,'2006-02-15 05:05:03'),(103,822,'2006-02-15 05:05:03'),(103,895,'2006-02-15 05:05:03'),(103,903,'2006-02-15 05:05:03'),(103,912,'2006-02-15 05:05:03'),(103,942,'2006-02-15 05:05:03'),(103,956,'2006-02-15 05:05:03'),(104,19,'2006-02-15 05:05:03'),(104,39,'2006-02-15 05:05:03'),(104,40,'2006-02-15 05:05:03'),(104,59,'2006-02-15 05:05:03'),(104,70,'2006-02-15 05:05:03'),(104,136,'2006-02-15 05:05:03'),(104,156,'2006-02-15 05:05:03'),(104,184,'2006-02-15 05:05:03'),(104,198,'2006-02-15 05:05:03'),(104,233,'2006-02-15 05:05:03'),(104,259,'2006-02-15 05:05:03'),(104,287,'2006-02-15 05:05:03'),(104,309,'2006-02-15 05:05:03'),(104,313,'2006-02-15 05:05:03'),(104,394,'2006-02-15 05:05:03'),(104,401,'2006-02-15 05:05:03'),(104,463,'2006-02-15 05:05:03'),(104,506,'2006-02-15 05:05:03'),(104,516,'2006-02-15 05:05:03'),(104,583,'2006-02-15 05:05:03'),(104,600,'2006-02-15 05:05:03'),(104,607,'2006-02-15 05:05:03'),(104,657,'2006-02-15 05:05:03'),(104,677,'2006-02-15 05:05:03'),(104,739,'2006-02-15 05:05:03'),(104,892,'2006-02-15 05:05:03'),(104,904,'2006-02-15 05:05:03'),(104,926,'2006-02-15 05:05:03'),(104,945,'2006-02-15 05:05:03'),(104,984,'2006-02-15 05:05:03'),(104,999,'2006-02-15 05:05:03'),(105,12,'2006-02-15 05:05:03'),(105,15,'2006-02-15 05:05:03'),(105,21,'2006-02-15 05:05:03'),(105,29,'2006-02-15 05:05:03'),(105,42,'2006-02-15 05:05:03'),(105,116,'2006-02-15 05:05:03'),(105,158,'2006-02-15 05:05:03'),(105,239,'2006-02-15 05:05:03'),(105,280,'2006-02-15 05:05:03'),(105,283,'2006-02-15 05:05:03'),(105,315,'2006-02-15 05:05:03'),(105,333,'2006-02-15 05:05:03'),(105,372,'2006-02-15 05:05:03'),(105,377,'2006-02-15 05:05:03'),(105,530,'2006-02-15 05:05:03'),(105,558,'2006-02-15 05:05:03'),(105,561,'2006-02-15 05:05:03'),(105,606,'2006-02-15 05:05:03'),(105,649,'2006-02-15 05:05:03'),(105,686,'2006-02-15 05:05:03'),(105,750,'2006-02-15 05:05:03'),(105,795,'2006-02-15 05:05:03'),(105,831,'2006-02-15 05:05:03'),(105,835,'2006-02-15 05:05:03'),(105,858,'2006-02-15 05:05:03'),(105,864,'2006-02-15 05:05:03'),(105,893,'2006-02-15 05:05:03'),(105,906,'2006-02-15 05:05:03'),(105,910,'2006-02-15 05:05:03'),(105,915,'2006-02-15 05:05:03'),(105,954,'2006-02-15 05:05:03'),(105,990,'2006-02-15 05:05:03'),(105,993,'2006-02-15 05:05:03'),(105,994,'2006-02-15 05:05:03'),(106,44,'2006-02-15 05:05:03'),(106,83,'2006-02-15 05:05:03'),(106,108,'2006-02-15 05:05:03'),(106,126,'2006-02-15 05:05:03'),(106,136,'2006-02-15 05:05:03'),(106,166,'2006-02-15 05:05:03'),(106,189,'2006-02-15 05:05:03'),(106,194,'2006-02-15 05:05:03'),(106,204,'2006-02-15 05:05:03'),(106,229,'2006-02-15 05:05:03'),(106,241,'2006-02-15 05:05:03'),(106,345,'2006-02-15 05:05:03'),(106,365,'2006-02-15 05:05:03'),(106,399,'2006-02-15 05:05:03'),(106,439,'2006-02-15 05:05:03'),(106,457,'2006-02-15 05:05:03'),(106,469,'2006-02-15 05:05:03'),(106,500,'2006-02-15 05:05:03'),(106,505,'2006-02-15 05:05:03'),(106,559,'2006-02-15 05:05:03'),(106,566,'2006-02-15 05:05:03'),(106,585,'2006-02-15 05:05:03'),(106,639,'2006-02-15 05:05:03'),(106,654,'2006-02-15 05:05:03'),(106,659,'2006-02-15 05:05:03'),(106,675,'2006-02-15 05:05:03'),(106,687,'2006-02-15 05:05:03'),(106,752,'2006-02-15 05:05:03'),(106,763,'2006-02-15 05:05:03'),(106,780,'2006-02-15 05:05:03'),(106,858,'2006-02-15 05:05:03'),(106,866,'2006-02-15 05:05:03'),(106,881,'2006-02-15 05:05:03'),(106,894,'2006-02-15 05:05:03'),(106,934,'2006-02-15 05:05:03'),(107,62,'2006-02-15 05:05:03'),(107,112,'2006-02-15 05:05:03'),(107,133,'2006-02-15 05:05:03'),(107,136,'2006-02-15 05:05:03'),(107,138,'2006-02-15 05:05:03'),(107,162,'2006-02-15 05:05:03'),(107,165,'2006-02-15 05:05:03'),(107,172,'2006-02-15 05:05:03'),(107,209,'2006-02-15 05:05:03'),(107,220,'2006-02-15 05:05:03'),(107,239,'2006-02-15 05:05:03'),(107,277,'2006-02-15 05:05:03'),(107,292,'2006-02-15 05:05:03'),(107,338,'2006-02-15 05:05:03'),(107,348,'2006-02-15 05:05:03'),(107,369,'2006-02-15 05:05:03'),(107,388,'2006-02-15 05:05:03'),(107,392,'2006-02-15 05:05:03'),(107,409,'2006-02-15 05:05:03'),(107,430,'2006-02-15 05:05:03'),(107,445,'2006-02-15 05:05:03'),(107,454,'2006-02-15 05:05:03'),(107,458,'2006-02-15 05:05:03'),(107,467,'2006-02-15 05:05:03'),(107,520,'2006-02-15 05:05:03'),(107,534,'2006-02-15 05:05:03'),(107,548,'2006-02-15 05:05:03'),(107,571,'2006-02-15 05:05:03'),(107,574,'2006-02-15 05:05:03'),(107,603,'2006-02-15 05:05:03'),(107,606,'2006-02-15 05:05:03'),(107,637,'2006-02-15 05:05:03'),(107,774,'2006-02-15 05:05:03'),(107,781,'2006-02-15 05:05:03'),(107,796,'2006-02-15 05:05:03'),(107,831,'2006-02-15 05:05:03'),(107,849,'2006-02-15 05:05:03'),(107,859,'2006-02-15 05:05:03'),(107,879,'2006-02-15 05:05:03'),(107,905,'2006-02-15 05:05:03'),(107,973,'2006-02-15 05:05:03'),(107,977,'2006-02-15 05:05:03'),(108,1,'2006-02-15 05:05:03'),(108,6,'2006-02-15 05:05:03'),(108,9,'2006-02-15 05:05:03'),(108,137,'2006-02-15 05:05:03'),(108,208,'2006-02-15 05:05:03'),(108,219,'2006-02-15 05:05:03'),(108,242,'2006-02-15 05:05:03'),(108,278,'2006-02-15 05:05:03'),(108,302,'2006-02-15 05:05:03'),(108,350,'2006-02-15 05:05:03'),(108,378,'2006-02-15 05:05:03'),(108,379,'2006-02-15 05:05:03'),(108,495,'2006-02-15 05:05:03'),(108,507,'2006-02-15 05:05:03'),(108,517,'2006-02-15 05:05:03'),(108,561,'2006-02-15 05:05:03'),(108,567,'2006-02-15 05:05:03'),(108,648,'2006-02-15 05:05:03'),(108,652,'2006-02-15 05:05:03'),(108,655,'2006-02-15 05:05:03'),(108,673,'2006-02-15 05:05:03'),(108,693,'2006-02-15 05:05:03'),(108,696,'2006-02-15 05:05:03'),(108,702,'2006-02-15 05:05:03'),(108,721,'2006-02-15 05:05:03'),(108,733,'2006-02-15 05:05:03'),(108,741,'2006-02-15 05:05:03'),(108,744,'2006-02-15 05:05:03'),(108,887,'2006-02-15 05:05:03'),(108,892,'2006-02-15 05:05:03'),(108,894,'2006-02-15 05:05:03'),(108,920,'2006-02-15 05:05:03'),(108,958,'2006-02-15 05:05:03'),(108,966,'2006-02-15 05:05:03'),(109,12,'2006-02-15 05:05:03'),(109,48,'2006-02-15 05:05:03'),(109,77,'2006-02-15 05:05:03'),(109,157,'2006-02-15 05:05:03'),(109,174,'2006-02-15 05:05:03'),(109,190,'2006-02-15 05:05:03'),(109,243,'2006-02-15 05:05:03'),(109,281,'2006-02-15 05:05:03'),(109,393,'2006-02-15 05:05:03'),(109,463,'2006-02-15 05:05:03'),(109,622,'2006-02-15 05:05:03'),(109,657,'2006-02-15 05:05:03'),(109,694,'2006-02-15 05:05:03'),(109,700,'2006-02-15 05:05:03'),(109,732,'2006-02-15 05:05:03'),(109,753,'2006-02-15 05:05:03'),(109,785,'2006-02-15 05:05:03'),(109,786,'2006-02-15 05:05:03'),(109,863,'2006-02-15 05:05:03'),(109,885,'2006-02-15 05:05:03'),(109,955,'2006-02-15 05:05:03'),(109,967,'2006-02-15 05:05:03'),(110,8,'2006-02-15 05:05:03'),(110,27,'2006-02-15 05:05:03'),(110,62,'2006-02-15 05:05:03'),(110,120,'2006-02-15 05:05:03'),(110,126,'2006-02-15 05:05:03'),(110,156,'2006-02-15 05:05:03'),(110,292,'2006-02-15 05:05:03'),(110,343,'2006-02-15 05:05:03'),(110,360,'2006-02-15 05:05:03'),(110,369,'2006-02-15 05:05:03'),(110,435,'2006-02-15 05:05:03'),(110,513,'2006-02-15 05:05:03'),(110,525,'2006-02-15 05:05:03'),(110,539,'2006-02-15 05:05:03'),(110,545,'2006-02-15 05:05:03'),(110,625,'2006-02-15 05:05:03'),(110,650,'2006-02-15 05:05:03'),(110,801,'2006-02-15 05:05:03'),(110,912,'2006-02-15 05:05:03'),(110,961,'2006-02-15 05:05:03'),(110,987,'2006-02-15 05:05:03'),(111,61,'2006-02-15 05:05:03'),(111,78,'2006-02-15 05:05:03'),(111,98,'2006-02-15 05:05:03'),(111,162,'2006-02-15 05:05:03'),(111,179,'2006-02-15 05:05:03'),(111,194,'2006-02-15 05:05:03'),(111,325,'2006-02-15 05:05:03'),(111,359,'2006-02-15 05:05:03'),(111,382,'2006-02-15 05:05:03'),(111,403,'2006-02-15 05:05:03'),(111,407,'2006-02-15 05:05:03'),(111,414,'2006-02-15 05:05:03'),(111,474,'2006-02-15 05:05:03'),(111,489,'2006-02-15 05:05:03'),(111,508,'2006-02-15 05:05:03'),(111,555,'2006-02-15 05:05:03'),(111,603,'2006-02-15 05:05:03'),(111,608,'2006-02-15 05:05:03'),(111,643,'2006-02-15 05:05:03'),(111,669,'2006-02-15 05:05:03'),(111,679,'2006-02-15 05:05:03'),(111,680,'2006-02-15 05:05:03'),(111,699,'2006-02-15 05:05:03'),(111,731,'2006-02-15 05:05:03'),(111,732,'2006-02-15 05:05:03'),(111,737,'2006-02-15 05:05:03'),(111,744,'2006-02-15 05:05:03'),(111,777,'2006-02-15 05:05:03'),(111,847,'2006-02-15 05:05:03'),(111,894,'2006-02-15 05:05:03'),(111,919,'2006-02-15 05:05:03'),(111,962,'2006-02-15 05:05:03'),(111,973,'2006-02-15 05:05:03'),(112,34,'2006-02-15 05:05:03'),(112,37,'2006-02-15 05:05:03'),(112,151,'2006-02-15 05:05:03'),(112,173,'2006-02-15 05:05:03'),(112,188,'2006-02-15 05:05:03'),(112,231,'2006-02-15 05:05:03'),(112,312,'2006-02-15 05:05:03'),(112,322,'2006-02-15 05:05:03'),(112,443,'2006-02-15 05:05:03'),(112,450,'2006-02-15 05:05:03'),(112,565,'2006-02-15 05:05:03'),(112,603,'2006-02-15 05:05:03'),(112,606,'2006-02-15 05:05:03'),(112,654,'2006-02-15 05:05:03'),(112,666,'2006-02-15 05:05:03'),(112,700,'2006-02-15 05:05:03'),(112,728,'2006-02-15 05:05:03'),(112,772,'2006-02-15 05:05:03'),(112,796,'2006-02-15 05:05:03'),(112,817,'2006-02-15 05:05:03'),(112,829,'2006-02-15 05:05:03'),(112,856,'2006-02-15 05:05:03'),(112,865,'2006-02-15 05:05:03'),(112,869,'2006-02-15 05:05:03'),(112,988,'2006-02-15 05:05:03'),(113,35,'2006-02-15 05:05:03'),(113,84,'2006-02-15 05:05:03'),(113,116,'2006-02-15 05:05:03'),(113,181,'2006-02-15 05:05:03'),(113,218,'2006-02-15 05:05:03'),(113,249,'2006-02-15 05:05:03'),(113,258,'2006-02-15 05:05:03'),(113,292,'2006-02-15 05:05:03'),(113,322,'2006-02-15 05:05:03'),(113,353,'2006-02-15 05:05:03'),(113,403,'2006-02-15 05:05:03'),(113,525,'2006-02-15 05:05:03'),(113,642,'2006-02-15 05:05:03'),(113,656,'2006-02-15 05:05:03'),(113,674,'2006-02-15 05:05:03'),(113,680,'2006-02-15 05:05:03'),(113,700,'2006-02-15 05:05:03'),(113,719,'2006-02-15 05:05:03'),(113,723,'2006-02-15 05:05:03'),(113,726,'2006-02-15 05:05:03'),(113,732,'2006-02-15 05:05:03'),(113,748,'2006-02-15 05:05:03'),(113,838,'2006-02-15 05:05:03'),(113,890,'2006-02-15 05:05:03'),(113,921,'2006-02-15 05:05:03'),(113,969,'2006-02-15 05:05:03'),(113,981,'2006-02-15 05:05:03'),(114,13,'2006-02-15 05:05:03'),(114,68,'2006-02-15 05:05:03'),(114,90,'2006-02-15 05:05:03'),(114,162,'2006-02-15 05:05:03'),(114,188,'2006-02-15 05:05:03'),(114,194,'2006-02-15 05:05:03'),(114,210,'2006-02-15 05:05:03'),(114,237,'2006-02-15 05:05:03'),(114,254,'2006-02-15 05:05:03'),(114,305,'2006-02-15 05:05:03'),(114,339,'2006-02-15 05:05:03'),(114,420,'2006-02-15 05:05:03'),(114,425,'2006-02-15 05:05:03'),(114,452,'2006-02-15 05:05:03'),(114,538,'2006-02-15 05:05:03'),(114,619,'2006-02-15 05:05:03'),(114,757,'2006-02-15 05:05:03'),(114,807,'2006-02-15 05:05:03'),(114,827,'2006-02-15 05:05:03'),(114,841,'2006-02-15 05:05:03'),(114,861,'2006-02-15 05:05:03'),(114,866,'2006-02-15 05:05:03'),(114,913,'2006-02-15 05:05:03'),(114,961,'2006-02-15 05:05:03'),(114,993,'2006-02-15 05:05:03'),(115,49,'2006-02-15 05:05:03'),(115,52,'2006-02-15 05:05:03'),(115,245,'2006-02-15 05:05:03'),(115,246,'2006-02-15 05:05:03'),(115,277,'2006-02-15 05:05:03'),(115,302,'2006-02-15 05:05:03'),(115,379,'2006-02-15 05:05:03'),(115,383,'2006-02-15 05:05:03'),(115,391,'2006-02-15 05:05:03'),(115,428,'2006-02-15 05:05:03'),(115,506,'2006-02-15 05:05:03'),(115,531,'2006-02-15 05:05:03'),(115,607,'2006-02-15 05:05:03'),(115,615,'2006-02-15 05:05:03'),(115,661,'2006-02-15 05:05:03'),(115,671,'2006-02-15 05:05:03'),(115,686,'2006-02-15 05:05:03'),(115,703,'2006-02-15 05:05:03'),(115,714,'2006-02-15 05:05:03'),(115,740,'2006-02-15 05:05:03'),(115,754,'2006-02-15 05:05:03'),(115,846,'2006-02-15 05:05:03'),(115,887,'2006-02-15 05:05:03'),(115,952,'2006-02-15 05:05:03'),(115,955,'2006-02-15 05:05:03'),(115,966,'2006-02-15 05:05:03'),(115,985,'2006-02-15 05:05:03'),(115,994,'2006-02-15 05:05:03'),(116,36,'2006-02-15 05:05:03'),(116,48,'2006-02-15 05:05:03'),(116,88,'2006-02-15 05:05:03'),(116,90,'2006-02-15 05:05:03'),(116,105,'2006-02-15 05:05:03'),(116,128,'2006-02-15 05:05:03'),(116,336,'2006-02-15 05:05:03'),(116,338,'2006-02-15 05:05:03'),(116,384,'2006-02-15 05:05:03'),(116,412,'2006-02-15 05:05:03'),(116,420,'2006-02-15 05:05:03'),(116,451,'2006-02-15 05:05:03'),(116,481,'2006-02-15 05:05:03'),(116,492,'2006-02-15 05:05:03'),(116,584,'2006-02-15 05:05:03'),(116,606,'2006-02-15 05:05:03'),(116,622,'2006-02-15 05:05:03'),(116,647,'2006-02-15 05:05:03'),(116,653,'2006-02-15 05:05:03'),(116,742,'2006-02-15 05:05:03'),(116,784,'2006-02-15 05:05:03'),(116,844,'2006-02-15 05:05:03'),(116,939,'2006-02-15 05:05:03'),(116,956,'2006-02-15 05:05:03'),(117,10,'2006-02-15 05:05:03'),(117,15,'2006-02-15 05:05:03'),(117,42,'2006-02-15 05:05:03'),(117,167,'2006-02-15 05:05:03'),(117,178,'2006-02-15 05:05:03'),(117,190,'2006-02-15 05:05:03'),(117,197,'2006-02-15 05:05:03'),(117,224,'2006-02-15 05:05:03'),(117,246,'2006-02-15 05:05:03'),(117,273,'2006-02-15 05:05:03'),(117,298,'2006-02-15 05:05:03'),(117,316,'2006-02-15 05:05:03'),(117,337,'2006-02-15 05:05:03'),(117,395,'2006-02-15 05:05:03'),(117,423,'2006-02-15 05:05:03'),(117,432,'2006-02-15 05:05:03'),(117,459,'2006-02-15 05:05:03'),(117,468,'2006-02-15 05:05:03'),(117,550,'2006-02-15 05:05:03'),(117,578,'2006-02-15 05:05:03'),(117,707,'2006-02-15 05:05:03'),(117,710,'2006-02-15 05:05:03'),(117,738,'2006-02-15 05:05:03'),(117,739,'2006-02-15 05:05:03'),(117,778,'2006-02-15 05:05:03'),(117,783,'2006-02-15 05:05:03'),(117,785,'2006-02-15 05:05:03'),(117,797,'2006-02-15 05:05:03'),(117,812,'2006-02-15 05:05:03'),(117,831,'2006-02-15 05:05:03'),(117,864,'2006-02-15 05:05:03'),(117,887,'2006-02-15 05:05:03'),(117,926,'2006-02-15 05:05:03'),(118,35,'2006-02-15 05:05:03'),(118,39,'2006-02-15 05:05:03'),(118,41,'2006-02-15 05:05:03'),(118,49,'2006-02-15 05:05:03'),(118,55,'2006-02-15 05:05:03'),(118,136,'2006-02-15 05:05:03'),(118,141,'2006-02-15 05:05:03'),(118,151,'2006-02-15 05:05:03'),(118,311,'2006-02-15 05:05:03'),(118,384,'2006-02-15 05:05:03'),(118,399,'2006-02-15 05:05:03'),(118,499,'2006-02-15 05:05:03'),(118,517,'2006-02-15 05:05:03'),(118,553,'2006-02-15 05:05:03'),(118,558,'2006-02-15 05:05:03'),(118,572,'2006-02-15 05:05:03'),(118,641,'2006-02-15 05:05:03'),(118,656,'2006-02-15 05:05:03'),(118,695,'2006-02-15 05:05:03'),(118,735,'2006-02-15 05:05:03'),(118,788,'2006-02-15 05:05:03'),(118,852,'2006-02-15 05:05:03'),(118,938,'2006-02-15 05:05:03'),(118,957,'2006-02-15 05:05:03'),(118,969,'2006-02-15 05:05:03'),(119,21,'2006-02-15 05:05:03'),(119,49,'2006-02-15 05:05:03'),(119,64,'2006-02-15 05:05:03'),(119,87,'2006-02-15 05:05:03'),(119,143,'2006-02-15 05:05:03'),(119,171,'2006-02-15 05:05:03'),(119,172,'2006-02-15 05:05:03'),(119,173,'2006-02-15 05:05:03'),(119,381,'2006-02-15 05:05:03'),(119,394,'2006-02-15 05:05:03'),(119,412,'2006-02-15 05:05:03'),(119,418,'2006-02-15 05:05:03'),(119,454,'2006-02-15 05:05:03'),(119,509,'2006-02-15 05:05:03'),(119,521,'2006-02-15 05:05:03'),(119,567,'2006-02-15 05:05:03'),(119,570,'2006-02-15 05:05:03'),(119,592,'2006-02-15 05:05:03'),(119,614,'2006-02-15 05:05:03'),(119,636,'2006-02-15 05:05:03'),(119,649,'2006-02-15 05:05:03'),(119,693,'2006-02-15 05:05:03'),(119,738,'2006-02-15 05:05:03'),(119,751,'2006-02-15 05:05:03'),(119,782,'2006-02-15 05:05:03'),(119,786,'2006-02-15 05:05:03'),(119,788,'2006-02-15 05:05:03'),(119,802,'2006-02-15 05:05:03'),(119,858,'2006-02-15 05:05:03'),(119,868,'2006-02-15 05:05:03'),(119,900,'2006-02-15 05:05:03'),(119,939,'2006-02-15 05:05:03'),(120,57,'2006-02-15 05:05:03'),(120,63,'2006-02-15 05:05:03'),(120,144,'2006-02-15 05:05:03'),(120,149,'2006-02-15 05:05:03'),(120,208,'2006-02-15 05:05:03'),(120,231,'2006-02-15 05:05:03'),(120,238,'2006-02-15 05:05:03'),(120,255,'2006-02-15 05:05:03'),(120,414,'2006-02-15 05:05:03'),(120,424,'2006-02-15 05:05:03'),(120,489,'2006-02-15 05:05:03'),(120,513,'2006-02-15 05:05:03'),(120,590,'2006-02-15 05:05:03'),(120,641,'2006-02-15 05:05:03'),(120,642,'2006-02-15 05:05:03'),(120,659,'2006-02-15 05:05:03'),(120,682,'2006-02-15 05:05:03'),(120,691,'2006-02-15 05:05:03'),(120,715,'2006-02-15 05:05:03'),(120,717,'2006-02-15 05:05:03'),(120,722,'2006-02-15 05:05:03'),(120,746,'2006-02-15 05:05:03'),(120,830,'2006-02-15 05:05:03'),(120,894,'2006-02-15 05:05:03'),(120,898,'2006-02-15 05:05:03'),(120,911,'2006-02-15 05:05:03'),(120,994,'2006-02-15 05:05:03'),(121,141,'2006-02-15 05:05:03'),(121,154,'2006-02-15 05:05:03'),(121,161,'2006-02-15 05:05:03'),(121,170,'2006-02-15 05:05:03'),(121,186,'2006-02-15 05:05:03'),(121,198,'2006-02-15 05:05:03'),(121,220,'2006-02-15 05:05:03'),(121,222,'2006-02-15 05:05:03'),(121,284,'2006-02-15 05:05:03'),(121,297,'2006-02-15 05:05:03'),(121,338,'2006-02-15 05:05:03'),(121,353,'2006-02-15 05:05:03'),(121,449,'2006-02-15 05:05:03'),(121,479,'2006-02-15 05:05:03'),(121,517,'2006-02-15 05:05:03'),(121,633,'2006-02-15 05:05:03'),(121,654,'2006-02-15 05:05:03'),(121,658,'2006-02-15 05:05:03'),(121,666,'2006-02-15 05:05:03'),(121,771,'2006-02-15 05:05:03'),(121,780,'2006-02-15 05:05:03'),(121,847,'2006-02-15 05:05:03'),(121,884,'2006-02-15 05:05:03'),(121,885,'2006-02-15 05:05:03'),(121,966,'2006-02-15 05:05:03'),(122,22,'2006-02-15 05:05:03'),(122,29,'2006-02-15 05:05:03'),(122,76,'2006-02-15 05:05:03'),(122,83,'2006-02-15 05:05:03'),(122,157,'2006-02-15 05:05:03'),(122,158,'2006-02-15 05:05:03'),(122,166,'2006-02-15 05:05:03'),(122,227,'2006-02-15 05:05:03'),(122,238,'2006-02-15 05:05:03'),(122,300,'2006-02-15 05:05:03'),(122,307,'2006-02-15 05:05:03'),(122,363,'2006-02-15 05:05:03'),(122,470,'2006-02-15 05:05:03'),(122,489,'2006-02-15 05:05:03'),(122,491,'2006-02-15 05:05:03'),(122,542,'2006-02-15 05:05:03'),(122,620,'2006-02-15 05:05:03'),(122,649,'2006-02-15 05:05:03'),(122,654,'2006-02-15 05:05:03'),(122,673,'2006-02-15 05:05:03'),(122,718,'2006-02-15 05:05:03'),(122,795,'2006-02-15 05:05:03'),(122,957,'2006-02-15 05:05:03'),(122,961,'2006-02-15 05:05:03'),(122,998,'2006-02-15 05:05:03'),(123,3,'2006-02-15 05:05:03'),(123,43,'2006-02-15 05:05:03'),(123,67,'2006-02-15 05:05:03'),(123,105,'2006-02-15 05:05:03'),(123,148,'2006-02-15 05:05:03'),(123,151,'2006-02-15 05:05:03'),(123,185,'2006-02-15 05:05:03'),(123,223,'2006-02-15 05:05:03'),(123,234,'2006-02-15 05:05:03'),(123,245,'2006-02-15 05:05:03'),(123,246,'2006-02-15 05:05:03'),(123,266,'2006-02-15 05:05:03'),(123,286,'2006-02-15 05:05:03'),(123,429,'2006-02-15 05:05:03'),(123,442,'2006-02-15 05:05:03'),(123,446,'2006-02-15 05:05:03'),(123,479,'2006-02-15 05:05:03'),(123,480,'2006-02-15 05:05:03'),(123,494,'2006-02-15 05:05:03'),(123,503,'2006-02-15 05:05:03'),(123,530,'2006-02-15 05:05:03'),(123,576,'2006-02-15 05:05:03'),(123,577,'2006-02-15 05:05:03'),(123,589,'2006-02-15 05:05:03'),(123,593,'2006-02-15 05:05:03'),(123,725,'2006-02-15 05:05:03'),(123,730,'2006-02-15 05:05:03'),(123,786,'2006-02-15 05:05:03'),(123,860,'2006-02-15 05:05:03'),(123,892,'2006-02-15 05:05:03'),(123,926,'2006-02-15 05:05:03'),(123,988,'2006-02-15 05:05:03'),(124,22,'2006-02-15 05:05:03'),(124,64,'2006-02-15 05:05:03'),(124,106,'2006-02-15 05:05:03'),(124,113,'2006-02-15 05:05:03'),(124,190,'2006-02-15 05:05:03'),(124,246,'2006-02-15 05:05:03'),(124,260,'2006-02-15 05:05:03'),(124,263,'2006-02-15 05:05:03'),(124,289,'2006-02-15 05:05:03'),(124,306,'2006-02-15 05:05:03'),(124,312,'2006-02-15 05:05:03'),(124,322,'2006-02-15 05:05:03'),(124,343,'2006-02-15 05:05:03'),(124,449,'2006-02-15 05:05:03'),(124,468,'2006-02-15 05:05:03'),(124,539,'2006-02-15 05:05:03'),(124,601,'2006-02-15 05:05:03'),(124,726,'2006-02-15 05:05:03'),(124,742,'2006-02-15 05:05:03'),(124,775,'2006-02-15 05:05:03'),(124,785,'2006-02-15 05:05:03'),(124,814,'2006-02-15 05:05:03'),(124,858,'2006-02-15 05:05:03'),(124,882,'2006-02-15 05:05:03'),(124,987,'2006-02-15 05:05:03'),(124,997,'2006-02-15 05:05:03'),(125,62,'2006-02-15 05:05:03'),(125,98,'2006-02-15 05:05:03'),(125,100,'2006-02-15 05:05:03'),(125,114,'2006-02-15 05:05:03'),(125,175,'2006-02-15 05:05:03'),(125,188,'2006-02-15 05:05:03'),(125,204,'2006-02-15 05:05:03'),(125,238,'2006-02-15 05:05:03'),(125,250,'2006-02-15 05:05:03'),(125,324,'2006-02-15 05:05:03'),(125,338,'2006-02-15 05:05:03'),(125,361,'2006-02-15 05:05:03'),(125,367,'2006-02-15 05:05:03'),(125,395,'2006-02-15 05:05:03'),(125,414,'2006-02-15 05:05:03'),(125,428,'2006-02-15 05:05:03'),(125,429,'2006-02-15 05:05:03'),(125,450,'2006-02-15 05:05:03'),(125,497,'2006-02-15 05:05:03'),(125,557,'2006-02-15 05:05:03'),(125,568,'2006-02-15 05:05:03'),(125,584,'2006-02-15 05:05:03'),(125,602,'2006-02-15 05:05:03'),(125,623,'2006-02-15 05:05:03'),(125,664,'2006-02-15 05:05:03'),(125,683,'2006-02-15 05:05:03'),(125,710,'2006-02-15 05:05:03'),(125,877,'2006-02-15 05:05:03'),(125,908,'2006-02-15 05:05:03'),(125,949,'2006-02-15 05:05:03'),(125,965,'2006-02-15 05:05:03'),(126,21,'2006-02-15 05:05:03'),(126,34,'2006-02-15 05:05:03'),(126,43,'2006-02-15 05:05:03'),(126,58,'2006-02-15 05:05:03'),(126,85,'2006-02-15 05:05:03'),(126,96,'2006-02-15 05:05:03'),(126,193,'2006-02-15 05:05:03'),(126,194,'2006-02-15 05:05:03'),(126,199,'2006-02-15 05:05:03'),(126,256,'2006-02-15 05:05:03'),(126,263,'2006-02-15 05:05:03'),(126,288,'2006-02-15 05:05:03'),(126,317,'2006-02-15 05:05:03'),(126,347,'2006-02-15 05:05:03'),(126,369,'2006-02-15 05:05:03'),(126,370,'2006-02-15 05:05:03'),(126,419,'2006-02-15 05:05:03'),(126,468,'2006-02-15 05:05:03'),(126,469,'2006-02-15 05:05:03'),(126,545,'2006-02-15 05:05:03'),(126,685,'2006-02-15 05:05:03'),(126,836,'2006-02-15 05:05:03'),(126,860,'2006-02-15 05:05:03'),(127,36,'2006-02-15 05:05:03'),(127,47,'2006-02-15 05:05:03'),(127,48,'2006-02-15 05:05:03'),(127,79,'2006-02-15 05:05:03'),(127,119,'2006-02-15 05:05:03'),(127,141,'2006-02-15 05:05:03'),(127,157,'2006-02-15 05:05:03'),(127,202,'2006-02-15 05:05:03'),(127,286,'2006-02-15 05:05:03'),(127,333,'2006-02-15 05:05:03'),(127,354,'2006-02-15 05:05:03'),(127,366,'2006-02-15 05:05:03'),(127,382,'2006-02-15 05:05:03'),(127,388,'2006-02-15 05:05:03'),(127,411,'2006-02-15 05:05:03'),(127,459,'2006-02-15 05:05:03'),(127,553,'2006-02-15 05:05:03'),(127,573,'2006-02-15 05:05:03'),(127,613,'2006-02-15 05:05:03'),(127,617,'2006-02-15 05:05:03'),(127,641,'2006-02-15 05:05:03'),(127,710,'2006-02-15 05:05:03'),(127,727,'2006-02-15 05:05:03'),(127,749,'2006-02-15 05:05:03'),(127,763,'2006-02-15 05:05:03'),(127,771,'2006-02-15 05:05:03'),(127,791,'2006-02-15 05:05:03'),(127,819,'2006-02-15 05:05:03'),(127,839,'2006-02-15 05:05:03'),(127,846,'2006-02-15 05:05:03'),(127,911,'2006-02-15 05:05:03'),(127,953,'2006-02-15 05:05:03'),(127,970,'2006-02-15 05:05:03'),(128,26,'2006-02-15 05:05:03'),(128,82,'2006-02-15 05:05:03'),(128,119,'2006-02-15 05:05:03'),(128,168,'2006-02-15 05:05:03'),(128,212,'2006-02-15 05:05:03'),(128,238,'2006-02-15 05:05:03'),(128,299,'2006-02-15 05:05:03'),(128,312,'2006-02-15 05:05:03'),(128,326,'2006-02-15 05:05:03'),(128,336,'2006-02-15 05:05:03'),(128,345,'2006-02-15 05:05:03'),(128,407,'2006-02-15 05:05:03'),(128,462,'2006-02-15 05:05:03'),(128,485,'2006-02-15 05:05:03'),(128,516,'2006-02-15 05:05:03'),(128,564,'2006-02-15 05:05:03'),(128,614,'2006-02-15 05:05:03'),(128,650,'2006-02-15 05:05:03'),(128,665,'2006-02-15 05:05:03'),(128,671,'2006-02-15 05:05:03'),(128,693,'2006-02-15 05:05:03'),(128,696,'2006-02-15 05:05:03'),(128,759,'2006-02-15 05:05:03'),(128,774,'2006-02-15 05:05:03'),(128,814,'2006-02-15 05:05:03'),(128,899,'2006-02-15 05:05:03'),(128,912,'2006-02-15 05:05:03'),(128,944,'2006-02-15 05:05:03'),(128,949,'2006-02-15 05:05:03'),(128,965,'2006-02-15 05:05:03'),(129,56,'2006-02-15 05:05:03'),(129,89,'2006-02-15 05:05:03'),(129,101,'2006-02-15 05:05:03'),(129,166,'2006-02-15 05:05:03'),(129,202,'2006-02-15 05:05:03'),(129,230,'2006-02-15 05:05:03'),(129,247,'2006-02-15 05:05:03'),(129,249,'2006-02-15 05:05:03'),(129,348,'2006-02-15 05:05:03'),(129,367,'2006-02-15 05:05:03'),(129,391,'2006-02-15 05:05:03'),(129,418,'2006-02-15 05:05:03'),(129,431,'2006-02-15 05:05:03'),(129,452,'2006-02-15 05:05:03'),(129,471,'2006-02-15 05:05:03'),(129,520,'2006-02-15 05:05:03'),(129,597,'2006-02-15 05:05:03'),(129,602,'2006-02-15 05:05:03'),(129,640,'2006-02-15 05:05:03'),(129,669,'2006-02-15 05:05:03'),(129,684,'2006-02-15 05:05:03'),(129,705,'2006-02-15 05:05:03'),(129,805,'2006-02-15 05:05:03'),(129,826,'2006-02-15 05:05:03'),(129,834,'2006-02-15 05:05:03'),(129,857,'2006-02-15 05:05:03'),(129,910,'2006-02-15 05:05:03'),(129,920,'2006-02-15 05:05:03'),(129,938,'2006-02-15 05:05:03'),(129,962,'2006-02-15 05:05:03'),(130,9,'2006-02-15 05:05:03'),(130,26,'2006-02-15 05:05:03'),(130,37,'2006-02-15 05:05:03'),(130,43,'2006-02-15 05:05:03'),(130,49,'2006-02-15 05:05:03'),(130,57,'2006-02-15 05:05:03'),(130,107,'2006-02-15 05:05:03'),(130,112,'2006-02-15 05:05:03'),(130,208,'2006-02-15 05:05:03'),(130,326,'2006-02-15 05:05:03'),(130,375,'2006-02-15 05:05:03'),(130,416,'2006-02-15 05:05:03'),(130,431,'2006-02-15 05:05:03'),(130,452,'2006-02-15 05:05:03'),(130,453,'2006-02-15 05:05:03'),(130,478,'2006-02-15 05:05:03'),(130,507,'2006-02-15 05:05:03'),(130,525,'2006-02-15 05:05:03'),(130,549,'2006-02-15 05:05:03'),(130,592,'2006-02-15 05:05:03'),(130,702,'2006-02-15 05:05:03'),(130,725,'2006-02-15 05:05:03'),(130,764,'2006-02-15 05:05:03'),(130,809,'2006-02-15 05:05:03'),(130,869,'2006-02-15 05:05:03'),(130,930,'2006-02-15 05:05:03'),(130,981,'2006-02-15 05:05:03'),(131,48,'2006-02-15 05:05:03'),(131,66,'2006-02-15 05:05:03'),(131,94,'2006-02-15 05:05:03'),(131,120,'2006-02-15 05:05:03'),(131,147,'2006-02-15 05:05:03'),(131,206,'2006-02-15 05:05:03'),(131,320,'2006-02-15 05:05:03'),(131,383,'2006-02-15 05:05:03'),(131,432,'2006-02-15 05:05:03'),(131,436,'2006-02-15 05:05:03'),(131,450,'2006-02-15 05:05:03'),(131,479,'2006-02-15 05:05:03'),(131,494,'2006-02-15 05:05:03'),(131,515,'2006-02-15 05:05:03'),(131,539,'2006-02-15 05:05:03'),(131,590,'2006-02-15 05:05:03'),(131,647,'2006-02-15 05:05:03'),(131,693,'2006-02-15 05:05:03'),(131,713,'2006-02-15 05:05:03'),(131,770,'2006-02-15 05:05:03'),(131,798,'2006-02-15 05:05:03'),(131,809,'2006-02-15 05:05:03'),(131,875,'2006-02-15 05:05:03'),(131,881,'2006-02-15 05:05:03'),(131,921,'2006-02-15 05:05:03'),(132,81,'2006-02-15 05:05:03'),(132,82,'2006-02-15 05:05:03'),(132,133,'2006-02-15 05:05:03'),(132,156,'2006-02-15 05:05:03'),(132,162,'2006-02-15 05:05:03'),(132,311,'2006-02-15 05:05:03'),(132,345,'2006-02-15 05:05:03'),(132,377,'2006-02-15 05:05:03'),(132,410,'2006-02-15 05:05:03'),(132,538,'2006-02-15 05:05:03'),(132,562,'2006-02-15 05:05:03'),(132,586,'2006-02-15 05:05:03'),(132,626,'2006-02-15 05:05:03'),(132,637,'2006-02-15 05:05:03'),(132,698,'2006-02-15 05:05:03'),(132,756,'2006-02-15 05:05:03'),(132,806,'2006-02-15 05:05:03'),(132,897,'2006-02-15 05:05:03'),(132,899,'2006-02-15 05:05:03'),(132,904,'2006-02-15 05:05:03'),(132,930,'2006-02-15 05:05:03'),(132,987,'2006-02-15 05:05:03'),(133,7,'2006-02-15 05:05:03'),(133,51,'2006-02-15 05:05:03'),(133,133,'2006-02-15 05:05:03'),(133,172,'2006-02-15 05:05:03'),(133,210,'2006-02-15 05:05:03'),(133,270,'2006-02-15 05:05:03'),(133,280,'2006-02-15 05:05:03'),(133,286,'2006-02-15 05:05:03'),(133,338,'2006-02-15 05:05:03'),(133,342,'2006-02-15 05:05:03'),(133,351,'2006-02-15 05:05:03'),(133,368,'2006-02-15 05:05:03'),(133,385,'2006-02-15 05:05:03'),(133,390,'2006-02-15 05:05:03'),(133,397,'2006-02-15 05:05:03'),(133,410,'2006-02-15 05:05:03'),(133,452,'2006-02-15 05:05:03'),(133,463,'2006-02-15 05:05:03'),(133,514,'2006-02-15 05:05:03'),(133,588,'2006-02-15 05:05:03'),(133,594,'2006-02-15 05:05:03'),(133,635,'2006-02-15 05:05:03'),(133,652,'2006-02-15 05:05:03'),(133,727,'2006-02-15 05:05:03'),(133,806,'2006-02-15 05:05:03'),(133,868,'2006-02-15 05:05:03'),(133,882,'2006-02-15 05:05:03'),(133,894,'2006-02-15 05:05:03'),(133,933,'2006-02-15 05:05:03'),(133,952,'2006-02-15 05:05:03'),(134,132,'2006-02-15 05:05:03'),(134,145,'2006-02-15 05:05:03'),(134,161,'2006-02-15 05:05:03'),(134,219,'2006-02-15 05:05:03'),(134,243,'2006-02-15 05:05:03'),(134,250,'2006-02-15 05:05:03'),(134,278,'2006-02-15 05:05:03'),(134,341,'2006-02-15 05:05:03'),(134,386,'2006-02-15 05:05:03'),(134,413,'2006-02-15 05:05:03'),(134,558,'2006-02-15 05:05:03'),(134,588,'2006-02-15 05:05:03'),(134,624,'2006-02-15 05:05:03'),(134,655,'2006-02-15 05:05:03'),(134,683,'2006-02-15 05:05:03'),(134,690,'2006-02-15 05:05:03'),(134,861,'2006-02-15 05:05:03'),(134,896,'2006-02-15 05:05:03'),(134,897,'2006-02-15 05:05:03'),(134,915,'2006-02-15 05:05:03'),(134,927,'2006-02-15 05:05:03'),(134,936,'2006-02-15 05:05:03'),(135,35,'2006-02-15 05:05:03'),(135,41,'2006-02-15 05:05:03'),(135,65,'2006-02-15 05:05:03'),(135,88,'2006-02-15 05:05:03'),(135,170,'2006-02-15 05:05:03'),(135,269,'2006-02-15 05:05:03'),(135,320,'2006-02-15 05:05:03'),(135,353,'2006-02-15 05:05:03'),(135,357,'2006-02-15 05:05:03'),(135,364,'2006-02-15 05:05:03'),(135,455,'2006-02-15 05:05:03'),(135,458,'2006-02-15 05:05:03'),(135,484,'2006-02-15 05:05:03'),(135,541,'2006-02-15 05:05:03'),(135,553,'2006-02-15 05:05:03'),(135,616,'2006-02-15 05:05:03'),(135,628,'2006-02-15 05:05:03'),(135,719,'2006-02-15 05:05:03'),(135,814,'2006-02-15 05:05:03'),(135,905,'2006-02-15 05:05:03'),(136,20,'2006-02-15 05:05:03'),(136,25,'2006-02-15 05:05:03'),(136,33,'2006-02-15 05:05:03'),(136,56,'2006-02-15 05:05:03'),(136,61,'2006-02-15 05:05:03'),(136,193,'2006-02-15 05:05:03'),(136,214,'2006-02-15 05:05:03'),(136,229,'2006-02-15 05:05:03'),(136,243,'2006-02-15 05:05:03'),(136,256,'2006-02-15 05:05:03'),(136,262,'2006-02-15 05:05:03'),(136,271,'2006-02-15 05:05:03'),(136,288,'2006-02-15 05:05:03'),(136,300,'2006-02-15 05:05:03'),(136,364,'2006-02-15 05:05:03'),(136,401,'2006-02-15 05:05:03'),(136,414,'2006-02-15 05:05:03'),(136,420,'2006-02-15 05:05:03'),(136,474,'2006-02-15 05:05:03'),(136,485,'2006-02-15 05:05:03'),(136,542,'2006-02-15 05:05:03'),(136,552,'2006-02-15 05:05:03'),(136,620,'2006-02-15 05:05:03'),(136,649,'2006-02-15 05:05:03'),(136,686,'2006-02-15 05:05:03'),(136,781,'2006-02-15 05:05:03'),(136,806,'2006-02-15 05:05:03'),(136,808,'2006-02-15 05:05:03'),(136,818,'2006-02-15 05:05:03'),(136,842,'2006-02-15 05:05:03'),(136,933,'2006-02-15 05:05:03'),(136,993,'2006-02-15 05:05:03'),(137,6,'2006-02-15 05:05:03'),(137,14,'2006-02-15 05:05:03'),(137,56,'2006-02-15 05:05:03'),(137,96,'2006-02-15 05:05:03'),(137,160,'2006-02-15 05:05:03'),(137,224,'2006-02-15 05:05:03'),(137,249,'2006-02-15 05:05:03'),(137,254,'2006-02-15 05:05:03'),(137,263,'2006-02-15 05:05:03'),(137,268,'2006-02-15 05:05:03'),(137,304,'2006-02-15 05:05:03'),(137,390,'2006-02-15 05:05:03'),(137,410,'2006-02-15 05:05:03'),(137,433,'2006-02-15 05:05:03'),(137,446,'2006-02-15 05:05:03'),(137,489,'2006-02-15 05:05:03'),(137,530,'2006-02-15 05:05:03'),(137,564,'2006-02-15 05:05:03'),(137,603,'2006-02-15 05:05:03'),(137,610,'2006-02-15 05:05:03'),(137,688,'2006-02-15 05:05:03'),(137,703,'2006-02-15 05:05:03'),(137,745,'2006-02-15 05:05:03'),(137,758,'2006-02-15 05:05:03'),(137,832,'2006-02-15 05:05:03'),(137,841,'2006-02-15 05:05:03'),(137,917,'2006-02-15 05:05:03'),(138,8,'2006-02-15 05:05:03'),(138,52,'2006-02-15 05:05:03'),(138,61,'2006-02-15 05:05:03'),(138,125,'2006-02-15 05:05:03'),(138,157,'2006-02-15 05:05:03'),(138,214,'2006-02-15 05:05:03'),(138,258,'2006-02-15 05:05:03'),(138,376,'2006-02-15 05:05:03'),(138,403,'2006-02-15 05:05:03'),(138,446,'2006-02-15 05:05:03'),(138,453,'2006-02-15 05:05:03'),(138,508,'2006-02-15 05:05:03'),(138,553,'2006-02-15 05:05:03'),(138,561,'2006-02-15 05:05:03'),(138,583,'2006-02-15 05:05:03'),(138,627,'2006-02-15 05:05:03'),(138,639,'2006-02-15 05:05:03'),(138,695,'2006-02-15 05:05:03'),(138,747,'2006-02-15 05:05:03'),(138,879,'2006-02-15 05:05:03'),(138,885,'2006-02-15 05:05:03'),(138,923,'2006-02-15 05:05:03'),(138,970,'2006-02-15 05:05:03'),(138,989,'2006-02-15 05:05:03'),(139,20,'2006-02-15 05:05:03'),(139,35,'2006-02-15 05:05:03'),(139,57,'2006-02-15 05:05:03'),(139,74,'2006-02-15 05:05:03'),(139,90,'2006-02-15 05:05:03'),(139,107,'2006-02-15 05:05:03'),(139,155,'2006-02-15 05:05:03'),(139,170,'2006-02-15 05:05:03'),(139,181,'2006-02-15 05:05:03'),(139,200,'2006-02-15 05:05:03'),(139,229,'2006-02-15 05:05:03'),(139,233,'2006-02-15 05:05:03'),(139,261,'2006-02-15 05:05:03'),(139,262,'2006-02-15 05:05:03'),(139,266,'2006-02-15 05:05:03'),(139,282,'2006-02-15 05:05:03'),(139,284,'2006-02-15 05:05:03'),(139,373,'2006-02-15 05:05:03'),(139,447,'2006-02-15 05:05:03'),(139,489,'2006-02-15 05:05:03'),(139,529,'2006-02-15 05:05:03'),(139,540,'2006-02-15 05:05:03'),(139,570,'2006-02-15 05:05:03'),(139,602,'2006-02-15 05:05:03'),(139,605,'2006-02-15 05:05:03'),(139,636,'2006-02-15 05:05:03'),(139,691,'2006-02-15 05:05:03'),(139,706,'2006-02-15 05:05:03'),(139,719,'2006-02-15 05:05:03'),(139,744,'2006-02-15 05:05:03'),(139,746,'2006-02-15 05:05:03'),(139,862,'2006-02-15 05:05:03'),(139,892,'2006-02-15 05:05:03'),(140,27,'2006-02-15 05:05:03'),(140,77,'2006-02-15 05:05:03'),(140,112,'2006-02-15 05:05:03'),(140,135,'2006-02-15 05:05:03'),(140,185,'2006-02-15 05:05:03'),(140,258,'2006-02-15 05:05:03'),(140,370,'2006-02-15 05:05:03'),(140,373,'2006-02-15 05:05:03'),(140,498,'2006-02-15 05:05:03'),(140,509,'2006-02-15 05:05:03'),(140,576,'2006-02-15 05:05:03'),(140,587,'2006-02-15 05:05:03'),(140,599,'2006-02-15 05:05:03'),(140,608,'2006-02-15 05:05:03'),(140,647,'2006-02-15 05:05:03'),(140,665,'2006-02-15 05:05:03'),(140,670,'2006-02-15 05:05:03'),(140,693,'2006-02-15 05:05:03'),(140,702,'2006-02-15 05:05:03'),(140,729,'2006-02-15 05:05:03'),(140,730,'2006-02-15 05:05:03'),(140,731,'2006-02-15 05:05:03'),(140,736,'2006-02-15 05:05:03'),(140,742,'2006-02-15 05:05:03'),(140,778,'2006-02-15 05:05:03'),(140,820,'2006-02-15 05:05:03'),(140,830,'2006-02-15 05:05:03'),(140,835,'2006-02-15 05:05:03'),(140,857,'2006-02-15 05:05:03'),(140,923,'2006-02-15 05:05:03'),(140,934,'2006-02-15 05:05:03'),(140,999,'2006-02-15 05:05:03'),(141,43,'2006-02-15 05:05:03'),(141,67,'2006-02-15 05:05:03'),(141,188,'2006-02-15 05:05:03'),(141,191,'2006-02-15 05:05:03'),(141,207,'2006-02-15 05:05:03'),(141,223,'2006-02-15 05:05:03'),(141,341,'2006-02-15 05:05:03'),(141,358,'2006-02-15 05:05:03'),(141,380,'2006-02-15 05:05:03'),(141,395,'2006-02-15 05:05:03'),(141,467,'2006-02-15 05:05:03'),(141,491,'2006-02-15 05:05:03'),(141,589,'2006-02-15 05:05:03'),(141,607,'2006-02-15 05:05:03'),(141,673,'2006-02-15 05:05:03'),(141,740,'2006-02-15 05:05:03'),(141,752,'2006-02-15 05:05:03'),(141,768,'2006-02-15 05:05:03'),(141,772,'2006-02-15 05:05:03'),(141,787,'2006-02-15 05:05:03'),(141,821,'2006-02-15 05:05:03'),(141,829,'2006-02-15 05:05:03'),(141,840,'2006-02-15 05:05:03'),(141,849,'2006-02-15 05:05:03'),(141,862,'2006-02-15 05:05:03'),(141,863,'2006-02-15 05:05:03'),(141,909,'2006-02-15 05:05:03'),(141,992,'2006-02-15 05:05:03'),(142,10,'2006-02-15 05:05:03'),(142,18,'2006-02-15 05:05:03'),(142,107,'2006-02-15 05:05:03'),(142,139,'2006-02-15 05:05:03'),(142,186,'2006-02-15 05:05:03'),(142,199,'2006-02-15 05:05:03'),(142,248,'2006-02-15 05:05:03'),(142,328,'2006-02-15 05:05:03'),(142,350,'2006-02-15 05:05:03'),(142,371,'2006-02-15 05:05:03'),(142,470,'2006-02-15 05:05:03'),(142,481,'2006-02-15 05:05:03'),(142,494,'2006-02-15 05:05:03'),(142,501,'2006-02-15 05:05:03'),(142,504,'2006-02-15 05:05:03'),(142,540,'2006-02-15 05:05:03'),(142,554,'2006-02-15 05:05:03'),(142,575,'2006-02-15 05:05:03'),(142,608,'2006-02-15 05:05:03'),(142,710,'2006-02-15 05:05:03'),(142,712,'2006-02-15 05:05:03'),(142,735,'2006-02-15 05:05:03'),(142,759,'2006-02-15 05:05:03'),(142,794,'2006-02-15 05:05:03'),(142,842,'2006-02-15 05:05:03'),(142,859,'2006-02-15 05:05:03'),(142,863,'2006-02-15 05:05:03'),(142,875,'2006-02-15 05:05:03'),(142,906,'2006-02-15 05:05:03'),(142,914,'2006-02-15 05:05:03'),(142,999,'2006-02-15 05:05:03'),(143,47,'2006-02-15 05:05:03'),(143,79,'2006-02-15 05:05:03'),(143,141,'2006-02-15 05:05:03'),(143,175,'2006-02-15 05:05:03'),(143,232,'2006-02-15 05:05:03'),(143,239,'2006-02-15 05:05:03'),(143,316,'2006-02-15 05:05:03'),(143,339,'2006-02-15 05:05:03'),(143,361,'2006-02-15 05:05:03'),(143,386,'2006-02-15 05:05:03'),(143,404,'2006-02-15 05:05:03'),(143,457,'2006-02-15 05:05:03'),(143,485,'2006-02-15 05:05:03'),(143,497,'2006-02-15 05:05:03'),(143,560,'2006-02-15 05:05:03'),(143,576,'2006-02-15 05:05:03'),(143,603,'2006-02-15 05:05:03'),(143,613,'2006-02-15 05:05:03'),(143,659,'2006-02-15 05:05:03'),(143,660,'2006-02-15 05:05:03'),(143,680,'2006-02-15 05:05:03'),(143,687,'2006-02-15 05:05:03'),(143,690,'2006-02-15 05:05:03'),(143,706,'2006-02-15 05:05:03'),(143,792,'2006-02-15 05:05:03'),(143,821,'2006-02-15 05:05:03'),(143,830,'2006-02-15 05:05:03'),(143,872,'2006-02-15 05:05:03'),(143,878,'2006-02-15 05:05:03'),(143,906,'2006-02-15 05:05:03'),(143,958,'2006-02-15 05:05:03'),(144,18,'2006-02-15 05:05:03'),(144,67,'2006-02-15 05:05:03'),(144,79,'2006-02-15 05:05:03'),(144,90,'2006-02-15 05:05:03'),(144,99,'2006-02-15 05:05:03'),(144,105,'2006-02-15 05:05:03'),(144,123,'2006-02-15 05:05:03'),(144,125,'2006-02-15 05:05:03'),(144,127,'2006-02-15 05:05:03'),(144,130,'2006-02-15 05:05:03'),(144,135,'2006-02-15 05:05:03'),(144,164,'2006-02-15 05:05:03'),(144,184,'2006-02-15 05:05:03'),(144,216,'2006-02-15 05:05:03'),(144,228,'2006-02-15 05:05:03'),(144,260,'2006-02-15 05:05:03'),(144,272,'2006-02-15 05:05:03'),(144,291,'2006-02-15 05:05:03'),(144,293,'2006-02-15 05:05:03'),(144,312,'2006-02-15 05:05:03'),(144,393,'2006-02-15 05:05:03'),(144,396,'2006-02-15 05:05:03'),(144,473,'2006-02-15 05:05:03'),(144,504,'2006-02-15 05:05:03'),(144,540,'2006-02-15 05:05:03'),(144,599,'2006-02-15 05:05:03'),(144,668,'2006-02-15 05:05:03'),(144,702,'2006-02-15 05:05:03'),(144,753,'2006-02-15 05:05:03'),(144,762,'2006-02-15 05:05:03'),(144,776,'2006-02-15 05:05:03'),(144,785,'2006-02-15 05:05:03'),(144,845,'2006-02-15 05:05:03'),(144,894,'2006-02-15 05:05:03'),(144,953,'2006-02-15 05:05:03'),(145,39,'2006-02-15 05:05:03'),(145,109,'2006-02-15 05:05:03'),(145,120,'2006-02-15 05:05:03'),(145,154,'2006-02-15 05:05:03'),(145,155,'2006-02-15 05:05:03'),(145,243,'2006-02-15 05:05:03'),(145,293,'2006-02-15 05:05:03'),(145,402,'2006-02-15 05:05:03'),(145,409,'2006-02-15 05:05:03'),(145,457,'2006-02-15 05:05:03'),(145,475,'2006-02-15 05:05:03'),(145,487,'2006-02-15 05:05:03'),(145,494,'2006-02-15 05:05:03'),(145,527,'2006-02-15 05:05:03'),(145,592,'2006-02-15 05:05:03'),(145,625,'2006-02-15 05:05:03'),(145,629,'2006-02-15 05:05:03'),(145,641,'2006-02-15 05:05:03'),(145,661,'2006-02-15 05:05:03'),(145,664,'2006-02-15 05:05:03'),(145,692,'2006-02-15 05:05:03'),(145,713,'2006-02-15 05:05:03'),(145,726,'2006-02-15 05:05:03'),(145,748,'2006-02-15 05:05:03'),(145,822,'2006-02-15 05:05:03'),(145,893,'2006-02-15 05:05:03'),(145,923,'2006-02-15 05:05:03'),(145,953,'2006-02-15 05:05:03'),(146,12,'2006-02-15 05:05:03'),(146,16,'2006-02-15 05:05:03'),(146,33,'2006-02-15 05:05:03'),(146,117,'2006-02-15 05:05:03'),(146,177,'2006-02-15 05:05:03'),(146,191,'2006-02-15 05:05:03'),(146,197,'2006-02-15 05:05:03'),(146,207,'2006-02-15 05:05:03'),(146,218,'2006-02-15 05:05:03'),(146,278,'2006-02-15 05:05:03'),(146,296,'2006-02-15 05:05:03'),(146,314,'2006-02-15 05:05:03'),(146,320,'2006-02-15 05:05:03'),(146,372,'2006-02-15 05:05:03'),(146,384,'2006-02-15 05:05:03'),(146,402,'2006-02-15 05:05:03'),(146,410,'2006-02-15 05:05:03'),(146,427,'2006-02-15 05:05:03'),(146,429,'2006-02-15 05:05:03'),(146,512,'2006-02-15 05:05:03'),(146,514,'2006-02-15 05:05:03'),(146,571,'2006-02-15 05:05:03'),(146,591,'2006-02-15 05:05:03'),(146,720,'2006-02-15 05:05:03'),(146,731,'2006-02-15 05:05:03'),(146,734,'2006-02-15 05:05:03'),(146,871,'2006-02-15 05:05:03'),(146,909,'2006-02-15 05:05:03'),(146,922,'2006-02-15 05:05:03'),(146,945,'2006-02-15 05:05:03'),(146,955,'2006-02-15 05:05:03'),(146,966,'2006-02-15 05:05:03'),(146,969,'2006-02-15 05:05:03'),(147,4,'2006-02-15 05:05:03'),(147,85,'2006-02-15 05:05:03'),(147,131,'2006-02-15 05:05:03'),(147,139,'2006-02-15 05:05:03'),(147,145,'2006-02-15 05:05:03'),(147,178,'2006-02-15 05:05:03'),(147,251,'2006-02-15 05:05:03'),(147,254,'2006-02-15 05:05:03'),(147,295,'2006-02-15 05:05:03'),(147,298,'2006-02-15 05:05:03'),(147,305,'2006-02-15 05:05:03'),(147,310,'2006-02-15 05:05:03'),(147,318,'2006-02-15 05:05:03'),(147,333,'2006-02-15 05:05:03'),(147,341,'2006-02-15 05:05:03'),(147,351,'2006-02-15 05:05:03'),(147,394,'2006-02-15 05:05:03'),(147,402,'2006-02-15 05:05:03'),(147,405,'2006-02-15 05:05:03'),(147,410,'2006-02-15 05:05:03'),(147,431,'2006-02-15 05:05:03'),(147,443,'2006-02-15 05:05:03'),(147,508,'2006-02-15 05:05:03'),(147,554,'2006-02-15 05:05:03'),(147,563,'2006-02-15 05:05:03'),(147,649,'2006-02-15 05:05:03'),(147,688,'2006-02-15 05:05:03'),(147,708,'2006-02-15 05:05:03'),(147,864,'2006-02-15 05:05:03'),(147,957,'2006-02-15 05:05:03'),(147,987,'2006-02-15 05:05:03'),(148,27,'2006-02-15 05:05:03'),(148,57,'2006-02-15 05:05:03'),(148,133,'2006-02-15 05:05:03'),(148,149,'2006-02-15 05:05:03'),(148,226,'2006-02-15 05:05:03'),(148,342,'2006-02-15 05:05:03'),(148,368,'2006-02-15 05:05:03'),(148,422,'2006-02-15 05:05:03'),(148,468,'2006-02-15 05:05:03'),(148,633,'2006-02-15 05:05:03'),(148,718,'2006-02-15 05:05:03'),(148,768,'2006-02-15 05:05:03'),(148,772,'2006-02-15 05:05:03'),(148,792,'2006-02-15 05:05:03'),(149,53,'2006-02-15 05:05:03'),(149,72,'2006-02-15 05:05:03'),(149,95,'2006-02-15 05:05:03'),(149,118,'2006-02-15 05:05:03'),(149,139,'2006-02-15 05:05:03'),(149,146,'2006-02-15 05:05:03'),(149,153,'2006-02-15 05:05:03'),(149,159,'2006-02-15 05:05:03'),(149,169,'2006-02-15 05:05:03'),(149,178,'2006-02-15 05:05:03'),(149,188,'2006-02-15 05:05:03'),(149,193,'2006-02-15 05:05:03'),(149,339,'2006-02-15 05:05:03'),(149,354,'2006-02-15 05:05:03'),(149,362,'2006-02-15 05:05:03'),(149,365,'2006-02-15 05:05:03'),(149,458,'2006-02-15 05:05:03'),(149,631,'2006-02-15 05:05:03'),(149,670,'2006-02-15 05:05:03'),(149,685,'2006-02-15 05:05:03'),(149,761,'2006-02-15 05:05:03'),(149,782,'2006-02-15 05:05:03'),(149,810,'2006-02-15 05:05:03'),(149,811,'2006-02-15 05:05:03'),(149,899,'2006-02-15 05:05:03'),(149,905,'2006-02-15 05:05:03'),(149,913,'2006-02-15 05:05:03'),(149,921,'2006-02-15 05:05:03'),(149,947,'2006-02-15 05:05:03'),(149,949,'2006-02-15 05:05:03'),(149,992,'2006-02-15 05:05:03'),(150,23,'2006-02-15 05:05:03'),(150,63,'2006-02-15 05:05:03'),(150,75,'2006-02-15 05:05:03'),(150,94,'2006-02-15 05:05:03'),(150,105,'2006-02-15 05:05:03'),(150,168,'2006-02-15 05:05:03'),(150,190,'2006-02-15 05:05:03'),(150,206,'2006-02-15 05:05:03'),(150,233,'2006-02-15 05:05:03'),(150,270,'2006-02-15 05:05:03'),(150,285,'2006-02-15 05:05:03'),(150,306,'2006-02-15 05:05:03'),(150,386,'2006-02-15 05:05:03'),(150,433,'2006-02-15 05:05:03'),(150,446,'2006-02-15 05:05:03'),(150,447,'2006-02-15 05:05:03'),(150,468,'2006-02-15 05:05:03'),(150,508,'2006-02-15 05:05:03'),(150,542,'2006-02-15 05:05:03'),(150,551,'2006-02-15 05:05:03'),(150,629,'2006-02-15 05:05:03'),(150,647,'2006-02-15 05:05:03'),(150,672,'2006-02-15 05:05:03'),(150,697,'2006-02-15 05:05:03'),(150,728,'2006-02-15 05:05:03'),(150,777,'2006-02-15 05:05:03'),(150,854,'2006-02-15 05:05:03'),(150,873,'2006-02-15 05:05:03'),(150,880,'2006-02-15 05:05:03'),(150,887,'2006-02-15 05:05:03'),(150,889,'2006-02-15 05:05:03'),(150,892,'2006-02-15 05:05:03'),(150,953,'2006-02-15 05:05:03'),(150,962,'2006-02-15 05:05:03'),(151,131,'2006-02-15 05:05:03'),(151,144,'2006-02-15 05:05:03'),(151,167,'2006-02-15 05:05:03'),(151,170,'2006-02-15 05:05:03'),(151,217,'2006-02-15 05:05:03'),(151,232,'2006-02-15 05:05:03'),(151,342,'2006-02-15 05:05:03'),(151,367,'2006-02-15 05:05:03'),(151,370,'2006-02-15 05:05:03'),(151,382,'2006-02-15 05:05:03'),(151,451,'2006-02-15 05:05:03'),(151,463,'2006-02-15 05:05:03'),(151,482,'2006-02-15 05:05:03'),(151,501,'2006-02-15 05:05:03'),(151,527,'2006-02-15 05:05:03'),(151,539,'2006-02-15 05:05:03'),(151,570,'2006-02-15 05:05:03'),(151,574,'2006-02-15 05:05:03'),(151,634,'2006-02-15 05:05:03'),(151,658,'2006-02-15 05:05:03'),(151,665,'2006-02-15 05:05:03'),(151,703,'2006-02-15 05:05:03'),(151,880,'2006-02-15 05:05:03'),(151,892,'2006-02-15 05:05:03'),(151,895,'2006-02-15 05:05:03'),(151,989,'2006-02-15 05:05:03'),(152,59,'2006-02-15 05:05:03'),(152,153,'2006-02-15 05:05:03'),(152,217,'2006-02-15 05:05:03'),(152,248,'2006-02-15 05:05:03'),(152,318,'2006-02-15 05:05:03'),(152,332,'2006-02-15 05:05:03'),(152,475,'2006-02-15 05:05:03'),(152,476,'2006-02-15 05:05:03'),(152,578,'2006-02-15 05:05:03'),(152,607,'2006-02-15 05:05:03'),(152,611,'2006-02-15 05:05:03'),(152,615,'2006-02-15 05:05:03'),(152,674,'2006-02-15 05:05:03'),(152,680,'2006-02-15 05:05:03'),(152,729,'2006-02-15 05:05:03'),(152,768,'2006-02-15 05:05:03'),(152,821,'2006-02-15 05:05:03'),(152,846,'2006-02-15 05:05:03'),(152,891,'2006-02-15 05:05:03'),(152,898,'2006-02-15 05:05:03'),(152,927,'2006-02-15 05:05:03'),(152,964,'2006-02-15 05:05:03'),(152,968,'2006-02-15 05:05:03'),(153,47,'2006-02-15 05:05:03'),(153,64,'2006-02-15 05:05:03'),(153,136,'2006-02-15 05:05:03'),(153,180,'2006-02-15 05:05:03'),(153,203,'2006-02-15 05:05:03'),(153,231,'2006-02-15 05:05:03'),(153,444,'2006-02-15 05:05:03'),(153,476,'2006-02-15 05:05:03'),(153,480,'2006-02-15 05:05:03'),(153,486,'2006-02-15 05:05:03'),(153,536,'2006-02-15 05:05:03'),(153,627,'2006-02-15 05:05:03'),(153,732,'2006-02-15 05:05:03'),(153,756,'2006-02-15 05:05:03'),(153,766,'2006-02-15 05:05:03'),(153,817,'2006-02-15 05:05:03'),(153,847,'2006-02-15 05:05:03'),(153,919,'2006-02-15 05:05:03'),(153,938,'2006-02-15 05:05:03'),(153,988,'2006-02-15 05:05:03'),(154,27,'2006-02-15 05:05:03'),(154,111,'2006-02-15 05:05:03'),(154,141,'2006-02-15 05:05:03'),(154,158,'2006-02-15 05:05:03'),(154,169,'2006-02-15 05:05:03'),(154,170,'2006-02-15 05:05:03'),(154,193,'2006-02-15 05:05:03'),(154,208,'2006-02-15 05:05:03'),(154,274,'2006-02-15 05:05:03'),(154,276,'2006-02-15 05:05:03'),(154,282,'2006-02-15 05:05:03'),(154,299,'2006-02-15 05:05:03'),(154,314,'2006-02-15 05:05:03'),(154,396,'2006-02-15 05:05:03'),(154,399,'2006-02-15 05:05:03'),(154,421,'2006-02-15 05:05:03'),(154,440,'2006-02-15 05:05:03'),(154,467,'2006-02-15 05:05:03'),(154,474,'2006-02-15 05:05:03'),(154,489,'2006-02-15 05:05:03'),(154,588,'2006-02-15 05:05:03'),(154,602,'2006-02-15 05:05:03'),(154,680,'2006-02-15 05:05:03'),(154,698,'2006-02-15 05:05:03'),(154,802,'2006-02-15 05:05:03'),(154,842,'2006-02-15 05:05:03'),(154,954,'2006-02-15 05:05:03'),(154,988,'2006-02-15 05:05:03'),(155,20,'2006-02-15 05:05:03'),(155,67,'2006-02-15 05:05:03'),(155,128,'2006-02-15 05:05:03'),(155,153,'2006-02-15 05:05:03'),(155,220,'2006-02-15 05:05:03'),(155,249,'2006-02-15 05:05:03'),(155,303,'2006-02-15 05:05:03'),(155,312,'2006-02-15 05:05:03'),(155,359,'2006-02-15 05:05:03'),(155,361,'2006-02-15 05:05:03'),(155,383,'2006-02-15 05:05:03'),(155,387,'2006-02-15 05:05:03'),(155,407,'2006-02-15 05:05:03'),(155,427,'2006-02-15 05:05:03'),(155,459,'2006-02-15 05:05:03'),(155,513,'2006-02-15 05:05:03'),(155,584,'2006-02-15 05:05:03'),(155,590,'2006-02-15 05:05:03'),(155,630,'2006-02-15 05:05:03'),(155,688,'2006-02-15 05:05:03'),(155,757,'2006-02-15 05:05:03'),(155,768,'2006-02-15 05:05:03'),(155,785,'2006-02-15 05:05:03'),(155,849,'2006-02-15 05:05:03'),(155,885,'2006-02-15 05:05:03'),(155,890,'2006-02-15 05:05:03'),(155,941,'2006-02-15 05:05:03'),(155,966,'2006-02-15 05:05:03'),(155,987,'2006-02-15 05:05:03'),(155,997,'2006-02-15 05:05:03'),(155,1000,'2006-02-15 05:05:03'),(156,53,'2006-02-15 05:05:03'),(156,155,'2006-02-15 05:05:03'),(156,198,'2006-02-15 05:05:03'),(156,244,'2006-02-15 05:05:03'),(156,262,'2006-02-15 05:05:03'),(156,263,'2006-02-15 05:05:03'),(156,285,'2006-02-15 05:05:03'),(156,297,'2006-02-15 05:05:03'),(156,301,'2006-02-15 05:05:03'),(156,349,'2006-02-15 05:05:03'),(156,379,'2006-02-15 05:05:03'),(156,448,'2006-02-15 05:05:03'),(156,462,'2006-02-15 05:05:03'),(156,467,'2006-02-15 05:05:03'),(156,504,'2006-02-15 05:05:03'),(156,518,'2006-02-15 05:05:03'),(156,593,'2006-02-15 05:05:03'),(156,646,'2006-02-15 05:05:03'),(156,705,'2006-02-15 05:05:03'),(156,754,'2006-02-15 05:05:03'),(156,775,'2006-02-15 05:05:03'),(156,844,'2006-02-15 05:05:03'),(157,10,'2006-02-15 05:05:03'),(157,24,'2006-02-15 05:05:03'),(157,34,'2006-02-15 05:05:03'),(157,122,'2006-02-15 05:05:03'),(157,159,'2006-02-15 05:05:03'),(157,183,'2006-02-15 05:05:03'),(157,210,'2006-02-15 05:05:03'),(157,217,'2006-02-15 05:05:03'),(157,291,'2006-02-15 05:05:03'),(157,303,'2006-02-15 05:05:03'),(157,321,'2006-02-15 05:05:03'),(157,326,'2006-02-15 05:05:03'),(157,353,'2006-02-15 05:05:03'),(157,400,'2006-02-15 05:05:03'),(157,406,'2006-02-15 05:05:03'),(157,431,'2006-02-15 05:05:03'),(157,496,'2006-02-15 05:05:03'),(157,535,'2006-02-15 05:05:03'),(157,573,'2006-02-15 05:05:03'),(157,574,'2006-02-15 05:05:03'),(157,604,'2006-02-15 05:05:03'),(157,616,'2006-02-15 05:05:03'),(157,642,'2006-02-15 05:05:03'),(157,661,'2006-02-15 05:05:03'),(157,696,'2006-02-15 05:05:03'),(157,713,'2006-02-15 05:05:03'),(157,802,'2006-02-15 05:05:03'),(157,835,'2006-02-15 05:05:03'),(157,874,'2006-02-15 05:05:03'),(157,913,'2006-02-15 05:05:03'),(157,967,'2006-02-15 05:05:03'),(157,973,'2006-02-15 05:05:03'),(158,32,'2006-02-15 05:05:03'),(158,47,'2006-02-15 05:05:03'),(158,64,'2006-02-15 05:05:03'),(158,66,'2006-02-15 05:05:03'),(158,102,'2006-02-15 05:05:03'),(158,121,'2006-02-15 05:05:03'),(158,177,'2006-02-15 05:05:03'),(158,178,'2006-02-15 05:05:03'),(158,188,'2006-02-15 05:05:03'),(158,215,'2006-02-15 05:05:03'),(158,241,'2006-02-15 05:05:03'),(158,293,'2006-02-15 05:05:03'),(158,437,'2006-02-15 05:05:03'),(158,473,'2006-02-15 05:05:03'),(158,483,'2006-02-15 05:05:03'),(158,532,'2006-02-15 05:05:03'),(158,555,'2006-02-15 05:05:03'),(158,581,'2006-02-15 05:05:03'),(158,601,'2006-02-15 05:05:03'),(158,616,'2006-02-15 05:05:03'),(158,626,'2006-02-15 05:05:03'),(158,637,'2006-02-15 05:05:03'),(158,799,'2006-02-15 05:05:03'),(158,812,'2006-02-15 05:05:03'),(158,824,'2006-02-15 05:05:03'),(158,830,'2006-02-15 05:05:03'),(158,840,'2006-02-15 05:05:03'),(158,869,'2006-02-15 05:05:03'),(158,879,'2006-02-15 05:05:03'),(158,880,'2006-02-15 05:05:03'),(158,894,'2006-02-15 05:05:03'),(158,896,'2006-02-15 05:05:03'),(158,967,'2006-02-15 05:05:03'),(158,968,'2006-02-15 05:05:03'),(158,990,'2006-02-15 05:05:03'),(159,20,'2006-02-15 05:05:03'),(159,82,'2006-02-15 05:05:03'),(159,127,'2006-02-15 05:05:03'),(159,187,'2006-02-15 05:05:03'),(159,206,'2006-02-15 05:05:03'),(159,208,'2006-02-15 05:05:03'),(159,223,'2006-02-15 05:05:03'),(159,248,'2006-02-15 05:05:03'),(159,342,'2006-02-15 05:05:03'),(159,343,'2006-02-15 05:05:03'),(159,344,'2006-02-15 05:05:03'),(159,364,'2006-02-15 05:05:03'),(159,418,'2006-02-15 05:05:03'),(159,549,'2006-02-15 05:05:03'),(159,561,'2006-02-15 05:05:03'),(159,600,'2006-02-15 05:05:03'),(159,674,'2006-02-15 05:05:03'),(159,680,'2006-02-15 05:05:03'),(159,784,'2006-02-15 05:05:03'),(159,789,'2006-02-15 05:05:03'),(159,800,'2006-02-15 05:05:03'),(159,802,'2006-02-15 05:05:03'),(159,818,'2006-02-15 05:05:03'),(159,876,'2006-02-15 05:05:03'),(159,907,'2006-02-15 05:05:03'),(159,978,'2006-02-15 05:05:03'),(160,2,'2006-02-15 05:05:03'),(160,17,'2006-02-15 05:05:03'),(160,43,'2006-02-15 05:05:03'),(160,242,'2006-02-15 05:05:03'),(160,267,'2006-02-15 05:05:03'),(160,275,'2006-02-15 05:05:03'),(160,368,'2006-02-15 05:05:03'),(160,455,'2006-02-15 05:05:03'),(160,469,'2006-02-15 05:05:03'),(160,484,'2006-02-15 05:05:03'),(160,579,'2006-02-15 05:05:03'),(160,660,'2006-02-15 05:05:03'),(160,755,'2006-02-15 05:05:03'),(160,767,'2006-02-15 05:05:03'),(160,769,'2006-02-15 05:05:03'),(160,794,'2006-02-15 05:05:03'),(160,826,'2006-02-15 05:05:03'),(160,883,'2006-02-15 05:05:03'),(160,950,'2006-02-15 05:05:03'),(160,954,'2006-02-15 05:05:03'),(161,43,'2006-02-15 05:05:03'),(161,58,'2006-02-15 05:05:03'),(161,89,'2006-02-15 05:05:03'),(161,90,'2006-02-15 05:05:03'),(161,120,'2006-02-15 05:05:03'),(161,188,'2006-02-15 05:05:03'),(161,247,'2006-02-15 05:05:03'),(161,269,'2006-02-15 05:05:03'),(161,281,'2006-02-15 05:05:03'),(161,340,'2006-02-15 05:05:03'),(161,353,'2006-02-15 05:05:03'),(161,401,'2006-02-15 05:05:03'),(161,414,'2006-02-15 05:05:03'),(161,425,'2006-02-15 05:05:03'),(161,469,'2006-02-15 05:05:03'),(161,526,'2006-02-15 05:05:03'),(161,588,'2006-02-15 05:05:03'),(161,644,'2006-02-15 05:05:03'),(161,653,'2006-02-15 05:05:03'),(161,655,'2006-02-15 05:05:03'),(161,669,'2006-02-15 05:05:03'),(161,684,'2006-02-15 05:05:03'),(161,714,'2006-02-15 05:05:03'),(161,749,'2006-02-15 05:05:03'),(161,807,'2006-02-15 05:05:03'),(161,825,'2006-02-15 05:05:03'),(161,850,'2006-02-15 05:05:03'),(161,880,'2006-02-15 05:05:03'),(161,920,'2006-02-15 05:05:03'),(161,921,'2006-02-15 05:05:03'),(161,924,'2006-02-15 05:05:03'),(161,927,'2006-02-15 05:05:03'),(162,1,'2006-02-15 05:05:03'),(162,4,'2006-02-15 05:05:03'),(162,7,'2006-02-15 05:05:03'),(162,18,'2006-02-15 05:05:03'),(162,28,'2006-02-15 05:05:03'),(162,32,'2006-02-15 05:05:03'),(162,33,'2006-02-15 05:05:03'),(162,41,'2006-02-15 05:05:03'),(162,85,'2006-02-15 05:05:03'),(162,121,'2006-02-15 05:05:03'),(162,164,'2006-02-15 05:05:03'),(162,274,'2006-02-15 05:05:03'),(162,279,'2006-02-15 05:05:03'),(162,409,'2006-02-15 05:05:03'),(162,410,'2006-02-15 05:05:03'),(162,415,'2006-02-15 05:05:03'),(162,500,'2006-02-15 05:05:03'),(162,574,'2006-02-15 05:05:03'),(162,612,'2006-02-15 05:05:03'),(162,636,'2006-02-15 05:05:03'),(162,659,'2006-02-15 05:05:03'),(162,786,'2006-02-15 05:05:03'),(162,844,'2006-02-15 05:05:03'),(162,909,'2006-02-15 05:05:03'),(162,968,'2006-02-15 05:05:03'),(163,30,'2006-02-15 05:05:03'),(163,45,'2006-02-15 05:05:03'),(163,166,'2006-02-15 05:05:03'),(163,180,'2006-02-15 05:05:03'),(163,239,'2006-02-15 05:05:03'),(163,283,'2006-02-15 05:05:03'),(163,303,'2006-02-15 05:05:03'),(163,304,'2006-02-15 05:05:03'),(163,307,'2006-02-15 05:05:03'),(163,394,'2006-02-15 05:05:03'),(163,409,'2006-02-15 05:05:03'),(163,434,'2006-02-15 05:05:03'),(163,444,'2006-02-15 05:05:03'),(163,522,'2006-02-15 05:05:03'),(163,719,'2006-02-15 05:05:03'),(163,785,'2006-02-15 05:05:03'),(163,833,'2006-02-15 05:05:03'),(163,881,'2006-02-15 05:05:03'),(163,891,'2006-02-15 05:05:03'),(163,947,'2006-02-15 05:05:03'),(163,996,'2006-02-15 05:05:03'),(164,15,'2006-02-15 05:05:03'),(164,23,'2006-02-15 05:05:03'),(164,148,'2006-02-15 05:05:03'),(164,169,'2006-02-15 05:05:03'),(164,252,'2006-02-15 05:05:03'),(164,324,'2006-02-15 05:05:03'),(164,347,'2006-02-15 05:05:03'),(164,367,'2006-02-15 05:05:03'),(164,431,'2006-02-15 05:05:03'),(164,448,'2006-02-15 05:05:03'),(164,469,'2006-02-15 05:05:03'),(164,545,'2006-02-15 05:05:03'),(164,610,'2006-02-15 05:05:03'),(164,613,'2006-02-15 05:05:03'),(164,673,'2006-02-15 05:05:03'),(164,681,'2006-02-15 05:05:03'),(164,698,'2006-02-15 05:05:03'),(164,801,'2006-02-15 05:05:03'),(164,820,'2006-02-15 05:05:03'),(164,832,'2006-02-15 05:05:03'),(164,834,'2006-02-15 05:05:03'),(164,851,'2006-02-15 05:05:03'),(164,884,'2006-02-15 05:05:03'),(164,908,'2006-02-15 05:05:03'),(164,957,'2006-02-15 05:05:03'),(164,984,'2006-02-15 05:05:03'),(165,72,'2006-02-15 05:05:03'),(165,95,'2006-02-15 05:05:03'),(165,146,'2006-02-15 05:05:03'),(165,204,'2006-02-15 05:05:03'),(165,253,'2006-02-15 05:05:03'),(165,286,'2006-02-15 05:05:03'),(165,360,'2006-02-15 05:05:03'),(165,375,'2006-02-15 05:05:03'),(165,395,'2006-02-15 05:05:03'),(165,421,'2006-02-15 05:05:03'),(165,437,'2006-02-15 05:05:03'),(165,473,'2006-02-15 05:05:03'),(165,607,'2006-02-15 05:05:03'),(165,644,'2006-02-15 05:05:03'),(165,659,'2006-02-15 05:05:03'),(165,693,'2006-02-15 05:05:03'),(165,737,'2006-02-15 05:05:03'),(165,779,'2006-02-15 05:05:03'),(165,798,'2006-02-15 05:05:03'),(165,807,'2006-02-15 05:05:03'),(165,809,'2006-02-15 05:05:03'),(165,832,'2006-02-15 05:05:03'),(165,833,'2006-02-15 05:05:03'),(165,947,'2006-02-15 05:05:03'),(165,948,'2006-02-15 05:05:03'),(165,962,'2006-02-15 05:05:03'),(166,25,'2006-02-15 05:05:03'),(166,38,'2006-02-15 05:05:03'),(166,55,'2006-02-15 05:05:03'),(166,61,'2006-02-15 05:05:03'),(166,68,'2006-02-15 05:05:03'),(166,86,'2006-02-15 05:05:03'),(166,146,'2006-02-15 05:05:03'),(166,255,'2006-02-15 05:05:03'),(166,297,'2006-02-15 05:05:03'),(166,306,'2006-02-15 05:05:03'),(166,326,'2006-02-15 05:05:03'),(166,361,'2006-02-15 05:05:03'),(166,366,'2006-02-15 05:05:03'),(166,426,'2006-02-15 05:05:03'),(166,580,'2006-02-15 05:05:03'),(166,622,'2006-02-15 05:05:03'),(166,674,'2006-02-15 05:05:03'),(166,714,'2006-02-15 05:05:03'),(166,788,'2006-02-15 05:05:03'),(166,867,'2006-02-15 05:05:03'),(166,944,'2006-02-15 05:05:03'),(166,1000,'2006-02-15 05:05:03'),(167,17,'2006-02-15 05:05:03'),(167,25,'2006-02-15 05:05:03'),(167,63,'2006-02-15 05:05:03'),(167,72,'2006-02-15 05:05:03'),(167,107,'2006-02-15 05:05:03'),(167,120,'2006-02-15 05:05:03'),(167,191,'2006-02-15 05:05:03'),(167,294,'2006-02-15 05:05:03'),(167,319,'2006-02-15 05:05:03'),(167,339,'2006-02-15 05:05:03'),(167,341,'2006-02-15 05:05:03'),(167,496,'2006-02-15 05:05:03'),(167,554,'2006-02-15 05:05:03'),(167,626,'2006-02-15 05:05:03'),(167,628,'2006-02-15 05:05:03'),(167,672,'2006-02-15 05:05:03'),(167,692,'2006-02-15 05:05:03'),(167,717,'2006-02-15 05:05:03'),(167,734,'2006-02-15 05:05:03'),(167,794,'2006-02-15 05:05:03'),(167,800,'2006-02-15 05:05:03'),(167,802,'2006-02-15 05:05:03'),(167,856,'2006-02-15 05:05:03'),(167,864,'2006-02-15 05:05:03'),(167,882,'2006-02-15 05:05:03'),(167,923,'2006-02-15 05:05:03'),(168,32,'2006-02-15 05:05:03'),(168,56,'2006-02-15 05:05:03'),(168,92,'2006-02-15 05:05:03'),(168,115,'2006-02-15 05:05:03'),(168,188,'2006-02-15 05:05:03'),(168,196,'2006-02-15 05:05:03'),(168,208,'2006-02-15 05:05:03'),(168,237,'2006-02-15 05:05:03'),(168,241,'2006-02-15 05:05:03'),(168,255,'2006-02-15 05:05:03'),(168,305,'2006-02-15 05:05:03'),(168,336,'2006-02-15 05:05:03'),(168,387,'2006-02-15 05:05:03'),(168,433,'2006-02-15 05:05:03'),(168,438,'2006-02-15 05:05:03'),(168,519,'2006-02-15 05:05:03'),(168,602,'2006-02-15 05:05:03'),(168,619,'2006-02-15 05:05:03'),(168,626,'2006-02-15 05:05:03'),(168,652,'2006-02-15 05:05:03'),(168,678,'2006-02-15 05:05:03'),(168,685,'2006-02-15 05:05:03'),(168,804,'2006-02-15 05:05:03'),(168,807,'2006-02-15 05:05:03'),(168,826,'2006-02-15 05:05:03'),(168,841,'2006-02-15 05:05:03'),(168,886,'2006-02-15 05:05:03'),(168,889,'2006-02-15 05:05:03'),(168,892,'2006-02-15 05:05:03'),(168,927,'2006-02-15 05:05:03'),(168,959,'2006-02-15 05:05:03'),(169,6,'2006-02-15 05:05:03'),(169,78,'2006-02-15 05:05:03'),(169,93,'2006-02-15 05:05:03'),(169,246,'2006-02-15 05:05:03'),(169,248,'2006-02-15 05:05:03'),(169,289,'2006-02-15 05:05:03'),(169,301,'2006-02-15 05:05:03'),(169,326,'2006-02-15 05:05:03'),(169,349,'2006-02-15 05:05:03'),(169,372,'2006-02-15 05:05:03'),(169,398,'2006-02-15 05:05:03'),(169,434,'2006-02-15 05:05:03'),(169,505,'2006-02-15 05:05:03'),(169,564,'2006-02-15 05:05:03'),(169,571,'2006-02-15 05:05:03'),(169,634,'2006-02-15 05:05:03'),(169,642,'2006-02-15 05:05:03'),(169,673,'2006-02-15 05:05:03'),(169,694,'2006-02-15 05:05:03'),(169,727,'2006-02-15 05:05:03'),(169,778,'2006-02-15 05:05:03'),(169,815,'2006-02-15 05:05:03'),(169,847,'2006-02-15 05:05:03'),(169,849,'2006-02-15 05:05:03'),(169,894,'2006-02-15 05:05:03'),(169,897,'2006-02-15 05:05:03'),(169,954,'2006-02-15 05:05:03'),(169,992,'2006-02-15 05:05:03'),(169,998,'2006-02-15 05:05:03'),(170,7,'2006-02-15 05:05:03'),(170,15,'2006-02-15 05:05:03'),(170,27,'2006-02-15 05:05:03'),(170,33,'2006-02-15 05:05:03'),(170,102,'2006-02-15 05:05:03'),(170,139,'2006-02-15 05:05:03'),(170,180,'2006-02-15 05:05:03'),(170,184,'2006-02-15 05:05:03'),(170,212,'2006-02-15 05:05:03'),(170,299,'2006-02-15 05:05:03'),(170,322,'2006-02-15 05:05:03'),(170,358,'2006-02-15 05:05:03'),(170,416,'2006-02-15 05:05:03'),(170,508,'2006-02-15 05:05:03'),(170,537,'2006-02-15 05:05:03'),(170,705,'2006-02-15 05:05:03'),(170,758,'2006-02-15 05:05:03'),(170,764,'2006-02-15 05:05:03'),(170,868,'2006-02-15 05:05:03'),(170,877,'2006-02-15 05:05:03'),(170,886,'2006-02-15 05:05:03'),(170,925,'2006-02-15 05:05:03'),(170,993,'2006-02-15 05:05:03'),(170,996,'2006-02-15 05:05:03'),(171,49,'2006-02-15 05:05:03'),(171,146,'2006-02-15 05:05:03'),(171,166,'2006-02-15 05:05:03'),(171,181,'2006-02-15 05:05:03'),(171,219,'2006-02-15 05:05:03'),(171,273,'2006-02-15 05:05:03'),(171,296,'2006-02-15 05:05:03'),(171,318,'2006-02-15 05:05:03'),(171,342,'2006-02-15 05:05:03'),(171,397,'2006-02-15 05:05:03'),(171,447,'2006-02-15 05:05:03'),(171,450,'2006-02-15 05:05:03'),(171,466,'2006-02-15 05:05:03'),(171,549,'2006-02-15 05:05:03'),(171,560,'2006-02-15 05:05:03'),(171,566,'2006-02-15 05:05:03'),(171,608,'2006-02-15 05:05:03'),(171,625,'2006-02-15 05:05:03'),(171,645,'2006-02-15 05:05:03'),(171,701,'2006-02-15 05:05:03'),(171,761,'2006-02-15 05:05:03'),(171,779,'2006-02-15 05:05:03'),(171,849,'2006-02-15 05:05:03'),(171,872,'2006-02-15 05:05:03'),(171,892,'2006-02-15 05:05:03'),(171,898,'2006-02-15 05:05:03'),(171,903,'2006-02-15 05:05:03'),(171,953,'2006-02-15 05:05:03'),(172,57,'2006-02-15 05:05:03'),(172,100,'2006-02-15 05:05:03'),(172,148,'2006-02-15 05:05:03'),(172,215,'2006-02-15 05:05:03'),(172,302,'2006-02-15 05:05:03'),(172,345,'2006-02-15 05:05:03'),(172,368,'2006-02-15 05:05:03'),(172,385,'2006-02-15 05:05:03'),(172,423,'2006-02-15 05:05:03'),(172,487,'2006-02-15 05:05:03'),(172,493,'2006-02-15 05:05:03'),(172,529,'2006-02-15 05:05:03'),(172,538,'2006-02-15 05:05:03'),(172,567,'2006-02-15 05:05:03'),(172,609,'2006-02-15 05:05:03'),(172,639,'2006-02-15 05:05:03'),(172,649,'2006-02-15 05:05:03'),(172,661,'2006-02-15 05:05:03'),(172,667,'2006-02-15 05:05:03'),(172,710,'2006-02-15 05:05:03'),(172,744,'2006-02-15 05:05:03'),(172,758,'2006-02-15 05:05:03'),(172,771,'2006-02-15 05:05:03'),(172,833,'2006-02-15 05:05:03'),(172,959,'2006-02-15 05:05:03'),(173,49,'2006-02-15 05:05:03'),(173,55,'2006-02-15 05:05:03'),(173,74,'2006-02-15 05:05:03'),(173,80,'2006-02-15 05:05:03'),(173,106,'2006-02-15 05:05:03'),(173,154,'2006-02-15 05:05:03'),(173,162,'2006-02-15 05:05:03'),(173,188,'2006-02-15 05:05:03'),(173,235,'2006-02-15 05:05:03'),(173,313,'2006-02-15 05:05:03'),(173,379,'2006-02-15 05:05:03'),(173,405,'2006-02-15 05:05:03'),(173,491,'2006-02-15 05:05:03'),(173,496,'2006-02-15 05:05:03'),(173,529,'2006-02-15 05:05:03'),(173,550,'2006-02-15 05:05:03'),(173,564,'2006-02-15 05:05:03'),(173,571,'2006-02-15 05:05:03'),(173,592,'2006-02-15 05:05:03'),(173,688,'2006-02-15 05:05:03'),(173,753,'2006-02-15 05:05:03'),(173,757,'2006-02-15 05:05:03'),(173,852,'2006-02-15 05:05:03'),(173,857,'2006-02-15 05:05:03'),(173,921,'2006-02-15 05:05:03'),(173,928,'2006-02-15 05:05:03'),(173,933,'2006-02-15 05:05:03'),(174,11,'2006-02-15 05:05:03'),(174,61,'2006-02-15 05:05:03'),(174,168,'2006-02-15 05:05:03'),(174,298,'2006-02-15 05:05:03'),(174,352,'2006-02-15 05:05:03'),(174,442,'2006-02-15 05:05:03'),(174,451,'2006-02-15 05:05:03'),(174,496,'2006-02-15 05:05:03'),(174,610,'2006-02-15 05:05:03'),(174,618,'2006-02-15 05:05:03'),(174,622,'2006-02-15 05:05:03'),(174,659,'2006-02-15 05:05:03'),(174,677,'2006-02-15 05:05:03'),(174,705,'2006-02-15 05:05:03'),(174,722,'2006-02-15 05:05:03'),(174,780,'2006-02-15 05:05:03'),(174,797,'2006-02-15 05:05:03'),(174,809,'2006-02-15 05:05:03'),(174,827,'2006-02-15 05:05:03'),(174,830,'2006-02-15 05:05:03'),(174,852,'2006-02-15 05:05:03'),(174,853,'2006-02-15 05:05:03'),(174,879,'2006-02-15 05:05:03'),(174,982,'2006-02-15 05:05:03'),(175,9,'2006-02-15 05:05:03'),(175,29,'2006-02-15 05:05:03'),(175,67,'2006-02-15 05:05:03'),(175,129,'2006-02-15 05:05:03'),(175,155,'2006-02-15 05:05:03'),(175,190,'2006-02-15 05:05:03'),(175,191,'2006-02-15 05:05:03'),(175,362,'2006-02-15 05:05:03'),(175,405,'2006-02-15 05:05:03'),(175,424,'2006-02-15 05:05:03'),(175,439,'2006-02-15 05:05:03'),(175,442,'2006-02-15 05:05:03'),(175,483,'2006-02-15 05:05:03'),(175,591,'2006-02-15 05:05:03'),(175,596,'2006-02-15 05:05:03'),(175,616,'2006-02-15 05:05:03'),(175,719,'2006-02-15 05:05:03'),(175,729,'2006-02-15 05:05:03'),(175,772,'2006-02-15 05:05:03'),(175,778,'2006-02-15 05:05:03'),(175,828,'2006-02-15 05:05:03'),(175,842,'2006-02-15 05:05:03'),(175,890,'2006-02-15 05:05:03'),(175,908,'2006-02-15 05:05:03'),(175,977,'2006-02-15 05:05:03'),(175,978,'2006-02-15 05:05:03'),(175,998,'2006-02-15 05:05:03'),(176,13,'2006-02-15 05:05:03'),(176,73,'2006-02-15 05:05:03'),(176,89,'2006-02-15 05:05:03'),(176,150,'2006-02-15 05:05:03'),(176,162,'2006-02-15 05:05:03'),(176,238,'2006-02-15 05:05:03'),(176,252,'2006-02-15 05:05:03'),(176,303,'2006-02-15 05:05:03'),(176,320,'2006-02-15 05:05:03'),(176,401,'2006-02-15 05:05:03'),(176,417,'2006-02-15 05:05:03'),(176,441,'2006-02-15 05:05:03'),(176,458,'2006-02-15 05:05:03'),(176,461,'2006-02-15 05:05:03'),(176,517,'2006-02-15 05:05:03'),(176,521,'2006-02-15 05:05:03'),(176,543,'2006-02-15 05:05:03'),(176,573,'2006-02-15 05:05:03'),(176,699,'2006-02-15 05:05:03'),(176,726,'2006-02-15 05:05:03'),(176,740,'2006-02-15 05:05:03'),(176,746,'2006-02-15 05:05:03'),(176,758,'2006-02-15 05:05:03'),(176,802,'2006-02-15 05:05:03'),(176,827,'2006-02-15 05:05:03'),(176,839,'2006-02-15 05:05:03'),(176,859,'2006-02-15 05:05:03'),(176,872,'2006-02-15 05:05:03'),(176,946,'2006-02-15 05:05:03'),(177,12,'2006-02-15 05:05:03'),(177,39,'2006-02-15 05:05:03'),(177,52,'2006-02-15 05:05:03'),(177,55,'2006-02-15 05:05:03'),(177,86,'2006-02-15 05:05:03'),(177,175,'2006-02-15 05:05:03'),(177,188,'2006-02-15 05:05:03'),(177,235,'2006-02-15 05:05:03'),(177,237,'2006-02-15 05:05:03'),(177,289,'2006-02-15 05:05:03'),(177,363,'2006-02-15 05:05:03'),(177,401,'2006-02-15 05:05:03'),(177,433,'2006-02-15 05:05:03'),(177,458,'2006-02-15 05:05:03'),(177,522,'2006-02-15 05:05:03'),(177,543,'2006-02-15 05:05:03'),(177,563,'2006-02-15 05:05:03'),(177,649,'2006-02-15 05:05:03'),(177,683,'2006-02-15 05:05:03'),(177,684,'2006-02-15 05:05:03'),(177,726,'2006-02-15 05:05:03'),(177,751,'2006-02-15 05:05:03'),(177,763,'2006-02-15 05:05:03'),(177,764,'2006-02-15 05:05:03'),(177,827,'2006-02-15 05:05:03'),(177,910,'2006-02-15 05:05:03'),(177,956,'2006-02-15 05:05:03'),(178,30,'2006-02-15 05:05:03'),(178,34,'2006-02-15 05:05:03'),(178,109,'2006-02-15 05:05:03'),(178,146,'2006-02-15 05:05:03'),(178,160,'2006-02-15 05:05:03'),(178,164,'2006-02-15 05:05:03'),(178,194,'2006-02-15 05:05:03'),(178,197,'2006-02-15 05:05:03'),(178,273,'2006-02-15 05:05:03'),(178,311,'2006-02-15 05:05:03'),(178,397,'2006-02-15 05:05:03'),(178,483,'2006-02-15 05:05:03'),(178,517,'2006-02-15 05:05:03'),(178,537,'2006-02-15 05:05:03'),(178,587,'2006-02-15 05:05:03'),(178,708,'2006-02-15 05:05:03'),(178,733,'2006-02-15 05:05:03'),(178,744,'2006-02-15 05:05:03'),(178,762,'2006-02-15 05:05:03'),(178,930,'2006-02-15 05:05:03'),(178,974,'2006-02-15 05:05:03'),(178,983,'2006-02-15 05:05:03'),(178,1000,'2006-02-15 05:05:03'),(179,24,'2006-02-15 05:05:03'),(179,27,'2006-02-15 05:05:03'),(179,65,'2006-02-15 05:05:03'),(179,85,'2006-02-15 05:05:03'),(179,109,'2006-02-15 05:05:03'),(179,131,'2006-02-15 05:05:03'),(179,159,'2006-02-15 05:05:03'),(179,193,'2006-02-15 05:05:03'),(179,250,'2006-02-15 05:05:03'),(179,291,'2006-02-15 05:05:03'),(179,353,'2006-02-15 05:05:03'),(179,415,'2006-02-15 05:05:03'),(179,463,'2006-02-15 05:05:03'),(179,468,'2006-02-15 05:05:03'),(179,489,'2006-02-15 05:05:03'),(179,566,'2006-02-15 05:05:03'),(179,588,'2006-02-15 05:05:03'),(179,650,'2006-02-15 05:05:03'),(179,698,'2006-02-15 05:05:03'),(179,732,'2006-02-15 05:05:03'),(179,737,'2006-02-15 05:05:03'),(179,769,'2006-02-15 05:05:03'),(179,811,'2006-02-15 05:05:03'),(179,817,'2006-02-15 05:05:03'),(179,852,'2006-02-15 05:05:03'),(179,924,'2006-02-15 05:05:03'),(179,931,'2006-02-15 05:05:03'),(179,960,'2006-02-15 05:05:03'),(179,976,'2006-02-15 05:05:03'),(180,12,'2006-02-15 05:05:03'),(180,33,'2006-02-15 05:05:03'),(180,144,'2006-02-15 05:05:03'),(180,195,'2006-02-15 05:05:03'),(180,258,'2006-02-15 05:05:03'),(180,441,'2006-02-15 05:05:03'),(180,506,'2006-02-15 05:05:03'),(180,561,'2006-02-15 05:05:03'),(180,609,'2006-02-15 05:05:03'),(180,622,'2006-02-15 05:05:03'),(180,628,'2006-02-15 05:05:03'),(180,657,'2006-02-15 05:05:03'),(180,724,'2006-02-15 05:05:03'),(180,729,'2006-02-15 05:05:03'),(180,732,'2006-02-15 05:05:03'),(180,777,'2006-02-15 05:05:03'),(180,809,'2006-02-15 05:05:03'),(180,811,'2006-02-15 05:05:03'),(180,820,'2006-02-15 05:05:03'),(180,824,'2006-02-15 05:05:03'),(180,847,'2006-02-15 05:05:03'),(180,869,'2006-02-15 05:05:03'),(180,874,'2006-02-15 05:05:03'),(180,955,'2006-02-15 05:05:03'),(180,963,'2006-02-15 05:05:03'),(181,5,'2006-02-15 05:05:03'),(181,40,'2006-02-15 05:05:03'),(181,74,'2006-02-15 05:05:03'),(181,78,'2006-02-15 05:05:03'),(181,83,'2006-02-15 05:05:03'),(181,152,'2006-02-15 05:05:03'),(181,195,'2006-02-15 05:05:03'),(181,233,'2006-02-15 05:05:03'),(181,286,'2006-02-15 05:05:03'),(181,301,'2006-02-15 05:05:03'),(181,311,'2006-02-15 05:05:03'),(181,381,'2006-02-15 05:05:03'),(181,387,'2006-02-15 05:05:03'),(181,403,'2006-02-15 05:05:03'),(181,409,'2006-02-15 05:05:03'),(181,420,'2006-02-15 05:05:03'),(181,437,'2006-02-15 05:05:03'),(181,456,'2006-02-15 05:05:03'),(181,507,'2006-02-15 05:05:03'),(181,522,'2006-02-15 05:05:03'),(181,539,'2006-02-15 05:05:03'),(181,542,'2006-02-15 05:05:03'),(181,546,'2006-02-15 05:05:03'),(181,579,'2006-02-15 05:05:03'),(181,596,'2006-02-15 05:05:03'),(181,604,'2006-02-15 05:05:03'),(181,609,'2006-02-15 05:05:03'),(181,625,'2006-02-15 05:05:03'),(181,744,'2006-02-15 05:05:03'),(181,816,'2006-02-15 05:05:03'),(181,836,'2006-02-15 05:05:03'),(181,868,'2006-02-15 05:05:03'),(181,870,'2006-02-15 05:05:03'),(181,874,'2006-02-15 05:05:03'),(181,892,'2006-02-15 05:05:03'),(181,907,'2006-02-15 05:05:03'),(181,911,'2006-02-15 05:05:03'),(181,921,'2006-02-15 05:05:03'),(181,991,'2006-02-15 05:05:03'),(182,33,'2006-02-15 05:05:03'),(182,160,'2006-02-15 05:05:03'),(182,301,'2006-02-15 05:05:03'),(182,324,'2006-02-15 05:05:03'),(182,346,'2006-02-15 05:05:03'),(182,362,'2006-02-15 05:05:03'),(182,391,'2006-02-15 05:05:03'),(182,413,'2006-02-15 05:05:03'),(182,421,'2006-02-15 05:05:03'),(182,437,'2006-02-15 05:05:03'),(182,590,'2006-02-15 05:05:03'),(182,639,'2006-02-15 05:05:03'),(182,668,'2006-02-15 05:05:03'),(182,677,'2006-02-15 05:05:03'),(182,679,'2006-02-15 05:05:03'),(182,695,'2006-02-15 05:05:03'),(182,714,'2006-02-15 05:05:03'),(182,720,'2006-02-15 05:05:03'),(182,819,'2006-02-15 05:05:03'),(182,828,'2006-02-15 05:05:03'),(182,845,'2006-02-15 05:05:03'),(182,864,'2006-02-15 05:05:03'),(182,940,'2006-02-15 05:05:03'),(182,990,'2006-02-15 05:05:03'),(183,32,'2006-02-15 05:05:03'),(183,40,'2006-02-15 05:05:03'),(183,71,'2006-02-15 05:05:03'),(183,113,'2006-02-15 05:05:03'),(183,313,'2006-02-15 05:05:03'),(183,388,'2006-02-15 05:05:03'),(183,389,'2006-02-15 05:05:03'),(183,390,'2006-02-15 05:05:03'),(183,495,'2006-02-15 05:05:03'),(183,520,'2006-02-15 05:05:03'),(183,576,'2006-02-15 05:05:03'),(183,636,'2006-02-15 05:05:03'),(183,715,'2006-02-15 05:05:03'),(183,850,'2006-02-15 05:05:03'),(183,862,'2006-02-15 05:05:03'),(183,914,'2006-02-15 05:05:03'),(183,941,'2006-02-15 05:05:03'),(183,949,'2006-02-15 05:05:03'),(183,983,'2006-02-15 05:05:03'),(184,35,'2006-02-15 05:05:03'),(184,87,'2006-02-15 05:05:03'),(184,146,'2006-02-15 05:05:03'),(184,169,'2006-02-15 05:05:03'),(184,221,'2006-02-15 05:05:03'),(184,336,'2006-02-15 05:05:03'),(184,371,'2006-02-15 05:05:03'),(184,452,'2006-02-15 05:05:03'),(184,486,'2006-02-15 05:05:03'),(184,492,'2006-02-15 05:05:03'),(184,500,'2006-02-15 05:05:03'),(184,574,'2006-02-15 05:05:03'),(184,580,'2006-02-15 05:05:03'),(184,597,'2006-02-15 05:05:03'),(184,615,'2006-02-15 05:05:03'),(184,640,'2006-02-15 05:05:03'),(184,642,'2006-02-15 05:05:03'),(184,650,'2006-02-15 05:05:03'),(184,661,'2006-02-15 05:05:03'),(184,684,'2006-02-15 05:05:03'),(184,745,'2006-02-15 05:05:03'),(184,772,'2006-02-15 05:05:03'),(184,787,'2006-02-15 05:05:03'),(184,867,'2006-02-15 05:05:03'),(184,959,'2006-02-15 05:05:03'),(184,966,'2006-02-15 05:05:03'),(184,967,'2006-02-15 05:05:03'),(184,969,'2006-02-15 05:05:03'),(184,985,'2006-02-15 05:05:03'),(185,7,'2006-02-15 05:05:03'),(185,95,'2006-02-15 05:05:03'),(185,138,'2006-02-15 05:05:03'),(185,265,'2006-02-15 05:05:03'),(185,286,'2006-02-15 05:05:03'),(185,360,'2006-02-15 05:05:03'),(185,411,'2006-02-15 05:05:03'),(185,427,'2006-02-15 05:05:03'),(185,437,'2006-02-15 05:05:03'),(185,448,'2006-02-15 05:05:03'),(185,494,'2006-02-15 05:05:03'),(185,510,'2006-02-15 05:05:03'),(185,518,'2006-02-15 05:05:03'),(185,554,'2006-02-15 05:05:03'),(185,560,'2006-02-15 05:05:03'),(185,571,'2006-02-15 05:05:03'),(185,584,'2006-02-15 05:05:03'),(185,631,'2006-02-15 05:05:03'),(185,665,'2006-02-15 05:05:03'),(185,694,'2006-02-15 05:05:03'),(185,730,'2006-02-15 05:05:03'),(185,761,'2006-02-15 05:05:03'),(185,818,'2006-02-15 05:05:03'),(185,845,'2006-02-15 05:05:03'),(185,880,'2006-02-15 05:05:03'),(185,882,'2006-02-15 05:05:03'),(185,919,'2006-02-15 05:05:03'),(185,920,'2006-02-15 05:05:03'),(185,965,'2006-02-15 05:05:03'),(185,973,'2006-02-15 05:05:03'),(186,95,'2006-02-15 05:05:03'),(186,187,'2006-02-15 05:05:03'),(186,208,'2006-02-15 05:05:03'),(186,228,'2006-02-15 05:05:03'),(186,237,'2006-02-15 05:05:03'),(186,422,'2006-02-15 05:05:03'),(186,482,'2006-02-15 05:05:03'),(186,508,'2006-02-15 05:05:03'),(186,552,'2006-02-15 05:05:03'),(186,579,'2006-02-15 05:05:03'),(186,637,'2006-02-15 05:05:03'),(186,648,'2006-02-15 05:05:03'),(186,654,'2006-02-15 05:05:03'),(186,729,'2006-02-15 05:05:03'),(186,983,'2006-02-15 05:05:03'),(186,994,'2006-02-15 05:05:03'),(187,17,'2006-02-15 05:05:03'),(187,25,'2006-02-15 05:05:03'),(187,29,'2006-02-15 05:05:03'),(187,51,'2006-02-15 05:05:03'),(187,73,'2006-02-15 05:05:03'),(187,76,'2006-02-15 05:05:03'),(187,98,'2006-02-15 05:05:03'),(187,110,'2006-02-15 05:05:03'),(187,127,'2006-02-15 05:05:03'),(187,168,'2006-02-15 05:05:03'),(187,222,'2006-02-15 05:05:03'),(187,224,'2006-02-15 05:05:03'),(187,297,'2006-02-15 05:05:03'),(187,354,'2006-02-15 05:05:03'),(187,379,'2006-02-15 05:05:03'),(187,417,'2006-02-15 05:05:03'),(187,435,'2006-02-15 05:05:03'),(187,441,'2006-02-15 05:05:03'),(187,474,'2006-02-15 05:05:03'),(187,499,'2006-02-15 05:05:03'),(187,538,'2006-02-15 05:05:03'),(187,548,'2006-02-15 05:05:03'),(187,561,'2006-02-15 05:05:03'),(187,617,'2006-02-15 05:05:03'),(187,625,'2006-02-15 05:05:03'),(187,664,'2006-02-15 05:05:03'),(187,671,'2006-02-15 05:05:03'),(187,768,'2006-02-15 05:05:03'),(187,779,'2006-02-15 05:05:03'),(187,906,'2006-02-15 05:05:03'),(187,914,'2006-02-15 05:05:03'),(187,923,'2006-02-15 05:05:03'),(187,976,'2006-02-15 05:05:03'),(188,1,'2006-02-15 05:05:03'),(188,10,'2006-02-15 05:05:03'),(188,14,'2006-02-15 05:05:03'),(188,51,'2006-02-15 05:05:03'),(188,102,'2006-02-15 05:05:03'),(188,111,'2006-02-15 05:05:03'),(188,146,'2006-02-15 05:05:03'),(188,206,'2006-02-15 05:05:03'),(188,223,'2006-02-15 05:05:03'),(188,289,'2006-02-15 05:05:03'),(188,311,'2006-02-15 05:05:03'),(188,322,'2006-02-15 05:05:03'),(188,338,'2006-02-15 05:05:03'),(188,396,'2006-02-15 05:05:03'),(188,412,'2006-02-15 05:05:03'),(188,506,'2006-02-15 05:05:03'),(188,517,'2006-02-15 05:05:03'),(188,529,'2006-02-15 05:05:03'),(188,566,'2006-02-15 05:05:03'),(188,593,'2006-02-15 05:05:03'),(188,606,'2006-02-15 05:05:03'),(188,662,'2006-02-15 05:05:03'),(188,770,'2006-02-15 05:05:03'),(188,773,'2006-02-15 05:05:03'),(188,774,'2006-02-15 05:05:03'),(188,815,'2006-02-15 05:05:03'),(188,849,'2006-02-15 05:05:03'),(188,925,'2006-02-15 05:05:03'),(188,988,'2006-02-15 05:05:03'),(188,989,'2006-02-15 05:05:03'),(189,43,'2006-02-15 05:05:03'),(189,82,'2006-02-15 05:05:03'),(189,171,'2006-02-15 05:05:03'),(189,266,'2006-02-15 05:05:03'),(189,272,'2006-02-15 05:05:03'),(189,315,'2006-02-15 05:05:03'),(189,378,'2006-02-15 05:05:03'),(189,492,'2006-02-15 05:05:03'),(189,509,'2006-02-15 05:05:03'),(189,512,'2006-02-15 05:05:03'),(189,519,'2006-02-15 05:05:03'),(189,533,'2006-02-15 05:05:03'),(189,548,'2006-02-15 05:05:03'),(189,560,'2006-02-15 05:05:03'),(189,628,'2006-02-15 05:05:03'),(189,734,'2006-02-15 05:05:03'),(189,748,'2006-02-15 05:05:03'),(189,788,'2006-02-15 05:05:03'),(189,820,'2006-02-15 05:05:03'),(189,853,'2006-02-15 05:05:03'),(189,882,'2006-02-15 05:05:03'),(189,896,'2006-02-15 05:05:03'),(189,899,'2006-02-15 05:05:03'),(189,940,'2006-02-15 05:05:03'),(190,38,'2006-02-15 05:05:03'),(190,54,'2006-02-15 05:05:03'),(190,62,'2006-02-15 05:05:03'),(190,87,'2006-02-15 05:05:03'),(190,173,'2006-02-15 05:05:03'),(190,234,'2006-02-15 05:05:03'),(190,253,'2006-02-15 05:05:03'),(190,278,'2006-02-15 05:05:03'),(190,310,'2006-02-15 05:05:03'),(190,374,'2006-02-15 05:05:03'),(190,411,'2006-02-15 05:05:03'),(190,426,'2006-02-15 05:05:03'),(190,472,'2006-02-15 05:05:03'),(190,549,'2006-02-15 05:05:03'),(190,562,'2006-02-15 05:05:03'),(190,606,'2006-02-15 05:05:03'),(190,623,'2006-02-15 05:05:03'),(190,679,'2006-02-15 05:05:03'),(190,682,'2006-02-15 05:05:03'),(190,693,'2006-02-15 05:05:03'),(190,695,'2006-02-15 05:05:03'),(190,705,'2006-02-15 05:05:03'),(190,708,'2006-02-15 05:05:03'),(190,802,'2006-02-15 05:05:03'),(190,806,'2006-02-15 05:05:03'),(190,874,'2006-02-15 05:05:03'),(190,959,'2006-02-15 05:05:03'),(191,16,'2006-02-15 05:05:03'),(191,39,'2006-02-15 05:05:03'),(191,84,'2006-02-15 05:05:03'),(191,185,'2006-02-15 05:05:03'),(191,219,'2006-02-15 05:05:03'),(191,293,'2006-02-15 05:05:03'),(191,296,'2006-02-15 05:05:03'),(191,378,'2006-02-15 05:05:03'),(191,410,'2006-02-15 05:05:03'),(191,420,'2006-02-15 05:05:03'),(191,461,'2006-02-15 05:05:03'),(191,544,'2006-02-15 05:05:03'),(191,551,'2006-02-15 05:05:03'),(191,596,'2006-02-15 05:05:03'),(191,638,'2006-02-15 05:05:03'),(191,668,'2006-02-15 05:05:03'),(191,692,'2006-02-15 05:05:03'),(191,775,'2006-02-15 05:05:03'),(191,801,'2006-02-15 05:05:03'),(191,819,'2006-02-15 05:05:03'),(191,827,'2006-02-15 05:05:03'),(191,830,'2006-02-15 05:05:03'),(191,834,'2006-02-15 05:05:03'),(191,849,'2006-02-15 05:05:03'),(191,858,'2006-02-15 05:05:03'),(191,914,'2006-02-15 05:05:03'),(191,958,'2006-02-15 05:05:03'),(191,969,'2006-02-15 05:05:03'),(191,971,'2006-02-15 05:05:03'),(191,993,'2006-02-15 05:05:03'),(192,16,'2006-02-15 05:05:03'),(192,69,'2006-02-15 05:05:03'),(192,117,'2006-02-15 05:05:03'),(192,155,'2006-02-15 05:05:03'),(192,166,'2006-02-15 05:05:03'),(192,179,'2006-02-15 05:05:03'),(192,214,'2006-02-15 05:05:03'),(192,361,'2006-02-15 05:05:03'),(192,367,'2006-02-15 05:05:03'),(192,426,'2006-02-15 05:05:03'),(192,465,'2006-02-15 05:05:03'),(192,470,'2006-02-15 05:05:03'),(192,475,'2006-02-15 05:05:03'),(192,485,'2006-02-15 05:05:03'),(192,541,'2006-02-15 05:05:03'),(192,578,'2006-02-15 05:05:03'),(192,592,'2006-02-15 05:05:03'),(192,614,'2006-02-15 05:05:03'),(192,618,'2006-02-15 05:05:03'),(192,622,'2006-02-15 05:05:03'),(192,674,'2006-02-15 05:05:03'),(192,677,'2006-02-15 05:05:03'),(192,680,'2006-02-15 05:05:03'),(192,682,'2006-02-15 05:05:03'),(192,708,'2006-02-15 05:05:03'),(192,711,'2006-02-15 05:05:03'),(192,747,'2006-02-15 05:05:03'),(192,763,'2006-02-15 05:05:03'),(192,819,'2006-02-15 05:05:03'),(193,44,'2006-02-15 05:05:03'),(193,80,'2006-02-15 05:05:03'),(193,103,'2006-02-15 05:05:03'),(193,109,'2006-02-15 05:05:03'),(193,119,'2006-02-15 05:05:03'),(193,141,'2006-02-15 05:05:03'),(193,164,'2006-02-15 05:05:03'),(193,291,'2006-02-15 05:05:03'),(193,352,'2006-02-15 05:05:03'),(193,358,'2006-02-15 05:05:03'),(193,376,'2006-02-15 05:05:03'),(193,412,'2006-02-15 05:05:03'),(193,462,'2006-02-15 05:05:03'),(193,689,'2006-02-15 05:05:03'),(193,709,'2006-02-15 05:05:03'),(193,745,'2006-02-15 05:05:03'),(193,807,'2006-02-15 05:05:03'),(193,828,'2006-02-15 05:05:03'),(193,834,'2006-02-15 05:05:03'),(193,851,'2006-02-15 05:05:03'),(193,937,'2006-02-15 05:05:03'),(193,953,'2006-02-15 05:05:03'),(193,960,'2006-02-15 05:05:03'),(194,9,'2006-02-15 05:05:03'),(194,42,'2006-02-15 05:05:03'),(194,67,'2006-02-15 05:05:03'),(194,86,'2006-02-15 05:05:03'),(194,88,'2006-02-15 05:05:03'),(194,98,'2006-02-15 05:05:03'),(194,135,'2006-02-15 05:05:03'),(194,161,'2006-02-15 05:05:03'),(194,163,'2006-02-15 05:05:03'),(194,215,'2006-02-15 05:05:03'),(194,232,'2006-02-15 05:05:03'),(194,352,'2006-02-15 05:05:03'),(194,415,'2006-02-15 05:05:03'),(194,486,'2006-02-15 05:05:03'),(194,498,'2006-02-15 05:05:03'),(194,531,'2006-02-15 05:05:03'),(194,719,'2006-02-15 05:05:03'),(194,738,'2006-02-15 05:05:03'),(194,786,'2006-02-15 05:05:03'),(194,872,'2006-02-15 05:05:03'),(194,938,'2006-02-15 05:05:03'),(194,940,'2006-02-15 05:05:03'),(195,129,'2006-02-15 05:05:03'),(195,130,'2006-02-15 05:05:03'),(195,141,'2006-02-15 05:05:03'),(195,144,'2006-02-15 05:05:03'),(195,298,'2006-02-15 05:05:03'),(195,359,'2006-02-15 05:05:03'),(195,361,'2006-02-15 05:05:03'),(195,392,'2006-02-15 05:05:03'),(195,403,'2006-02-15 05:05:03'),(195,494,'2006-02-15 05:05:03'),(195,520,'2006-02-15 05:05:03'),(195,534,'2006-02-15 05:05:03'),(195,560,'2006-02-15 05:05:03'),(195,592,'2006-02-15 05:05:03'),(195,649,'2006-02-15 05:05:03'),(195,658,'2006-02-15 05:05:03'),(195,673,'2006-02-15 05:05:03'),(195,677,'2006-02-15 05:05:03'),(195,706,'2006-02-15 05:05:03'),(195,738,'2006-02-15 05:05:03'),(195,769,'2006-02-15 05:05:03'),(195,781,'2006-02-15 05:05:03'),(195,794,'2006-02-15 05:05:03'),(195,813,'2006-02-15 05:05:03'),(195,869,'2006-02-15 05:05:03'),(195,885,'2006-02-15 05:05:03'),(195,962,'2006-02-15 05:05:03'),(196,64,'2006-02-15 05:05:03'),(196,122,'2006-02-15 05:05:03'),(196,156,'2006-02-15 05:05:03'),(196,169,'2006-02-15 05:05:03'),(196,276,'2006-02-15 05:05:03'),(196,284,'2006-02-15 05:05:03'),(196,303,'2006-02-15 05:05:03'),(196,324,'2006-02-15 05:05:03'),(196,423,'2006-02-15 05:05:03'),(196,473,'2006-02-15 05:05:03'),(196,484,'2006-02-15 05:05:03'),(196,515,'2006-02-15 05:05:03'),(196,524,'2006-02-15 05:05:03'),(196,541,'2006-02-15 05:05:03'),(196,560,'2006-02-15 05:05:03'),(196,575,'2006-02-15 05:05:03'),(196,576,'2006-02-15 05:05:03'),(196,587,'2006-02-15 05:05:03'),(196,615,'2006-02-15 05:05:03'),(196,635,'2006-02-15 05:05:03'),(196,684,'2006-02-15 05:05:03'),(196,795,'2006-02-15 05:05:03'),(196,815,'2006-02-15 05:05:03'),(196,833,'2006-02-15 05:05:03'),(196,837,'2006-02-15 05:05:03'),(196,906,'2006-02-15 05:05:03'),(196,908,'2006-02-15 05:05:03'),(196,919,'2006-02-15 05:05:03'),(196,939,'2006-02-15 05:05:03'),(196,972,'2006-02-15 05:05:03'),(197,6,'2006-02-15 05:05:03'),(197,29,'2006-02-15 05:05:03'),(197,63,'2006-02-15 05:05:03'),(197,123,'2006-02-15 05:05:03'),(197,129,'2006-02-15 05:05:03'),(197,147,'2006-02-15 05:05:03'),(197,164,'2006-02-15 05:05:03'),(197,189,'2006-02-15 05:05:03'),(197,243,'2006-02-15 05:05:03'),(197,249,'2006-02-15 05:05:03'),(197,258,'2006-02-15 05:05:03'),(197,364,'2006-02-15 05:05:03'),(197,369,'2006-02-15 05:05:03'),(197,370,'2006-02-15 05:05:03'),(197,418,'2006-02-15 05:05:03'),(197,522,'2006-02-15 05:05:03'),(197,531,'2006-02-15 05:05:03'),(197,554,'2006-02-15 05:05:03'),(197,598,'2006-02-15 05:05:03'),(197,628,'2006-02-15 05:05:03'),(197,691,'2006-02-15 05:05:03'),(197,724,'2006-02-15 05:05:03'),(197,746,'2006-02-15 05:05:03'),(197,752,'2006-02-15 05:05:03'),(197,758,'2006-02-15 05:05:03'),(197,769,'2006-02-15 05:05:03'),(197,815,'2006-02-15 05:05:03'),(197,916,'2006-02-15 05:05:03'),(197,950,'2006-02-15 05:05:03'),(197,967,'2006-02-15 05:05:03'),(197,974,'2006-02-15 05:05:03'),(197,979,'2006-02-15 05:05:03'),(197,995,'2006-02-15 05:05:03'),(198,1,'2006-02-15 05:05:03'),(198,109,'2006-02-15 05:05:03'),(198,125,'2006-02-15 05:05:03'),(198,186,'2006-02-15 05:05:03'),(198,262,'2006-02-15 05:05:03'),(198,264,'2006-02-15 05:05:03'),(198,303,'2006-02-15 05:05:03'),(198,309,'2006-02-15 05:05:03'),(198,311,'2006-02-15 05:05:03'),(198,329,'2006-02-15 05:05:03'),(198,347,'2006-02-15 05:05:03'),(198,379,'2006-02-15 05:05:03'),(198,395,'2006-02-15 05:05:03'),(198,406,'2006-02-15 05:05:03'),(198,450,'2006-02-15 05:05:03'),(198,464,'2006-02-15 05:05:03'),(198,482,'2006-02-15 05:05:03'),(198,499,'2006-02-15 05:05:03'),(198,536,'2006-02-15 05:05:03'),(198,541,'2006-02-15 05:05:03'),(198,545,'2006-02-15 05:05:03'),(198,555,'2006-02-15 05:05:03'),(198,568,'2006-02-15 05:05:03'),(198,570,'2006-02-15 05:05:03'),(198,588,'2006-02-15 05:05:03'),(198,597,'2006-02-15 05:05:03'),(198,628,'2006-02-15 05:05:03'),(198,745,'2006-02-15 05:05:03'),(198,758,'2006-02-15 05:05:03'),(198,796,'2006-02-15 05:05:03'),(198,806,'2006-02-15 05:05:03'),(198,817,'2006-02-15 05:05:03'),(198,843,'2006-02-15 05:05:03'),(198,858,'2006-02-15 05:05:03'),(198,871,'2006-02-15 05:05:03'),(198,886,'2006-02-15 05:05:03'),(198,892,'2006-02-15 05:05:03'),(198,924,'2006-02-15 05:05:03'),(198,952,'2006-02-15 05:05:03'),(198,997,'2006-02-15 05:05:03'),(199,67,'2006-02-15 05:05:03'),(199,84,'2006-02-15 05:05:03'),(199,145,'2006-02-15 05:05:03'),(199,159,'2006-02-15 05:05:03'),(199,216,'2006-02-15 05:05:03'),(199,432,'2006-02-15 05:05:03'),(199,541,'2006-02-15 05:05:03'),(199,604,'2006-02-15 05:05:03'),(199,640,'2006-02-15 05:05:03'),(199,689,'2006-02-15 05:05:03'),(199,730,'2006-02-15 05:05:03'),(199,784,'2006-02-15 05:05:03'),(199,785,'2006-02-15 05:05:03'),(199,886,'2006-02-15 05:05:03'),(199,953,'2006-02-15 05:05:03'),(200,5,'2006-02-15 05:05:03'),(200,49,'2006-02-15 05:05:03'),(200,80,'2006-02-15 05:05:03'),(200,116,'2006-02-15 05:05:03'),(200,121,'2006-02-15 05:05:03'),(200,149,'2006-02-15 05:05:03'),(200,346,'2006-02-15 05:05:03'),(200,419,'2006-02-15 05:05:03'),(200,462,'2006-02-15 05:05:03'),(200,465,'2006-02-15 05:05:03'),(200,474,'2006-02-15 05:05:03'),(200,537,'2006-02-15 05:05:03'),(200,538,'2006-02-15 05:05:03'),(200,544,'2006-02-15 05:05:03'),(200,714,'2006-02-15 05:05:03'),(200,879,'2006-02-15 05:05:03'),(200,912,'2006-02-15 05:05:03'),(200,945,'2006-02-15 05:05:03'),(200,958,'2006-02-15 05:05:03'),(200,993,'2006-02-15 05:05:03'); -COMMIT; - --- --- Dumping data for table film_category --- - -SET AUTOCOMMIT=0; -INSERT INTO film_category VALUES (1,6,'2006-02-15 05:07:09'),(2,11,'2006-02-15 05:07:09'),(3,6,'2006-02-15 05:07:09'),(4,11,'2006-02-15 05:07:09'),(5,8,'2006-02-15 05:07:09'),(6,9,'2006-02-15 05:07:09'),(7,5,'2006-02-15 05:07:09'),(8,11,'2006-02-15 05:07:09'),(9,11,'2006-02-15 05:07:09'),(10,15,'2006-02-15 05:07:09'),(11,9,'2006-02-15 05:07:09'),(12,12,'2006-02-15 05:07:09'),(13,11,'2006-02-15 05:07:09'),(14,4,'2006-02-15 05:07:09'),(15,9,'2006-02-15 05:07:09'),(16,9,'2006-02-15 05:07:09'),(17,12,'2006-02-15 05:07:09'),(18,2,'2006-02-15 05:07:09'),(19,1,'2006-02-15 05:07:09'),(20,12,'2006-02-15 05:07:09'),(21,1,'2006-02-15 05:07:09'),(22,13,'2006-02-15 05:07:09'),(23,2,'2006-02-15 05:07:09'),(24,11,'2006-02-15 05:07:09'),(25,13,'2006-02-15 05:07:09'),(26,14,'2006-02-15 05:07:09'),(27,15,'2006-02-15 05:07:09'),(28,5,'2006-02-15 05:07:09'),(29,1,'2006-02-15 05:07:09'),(30,11,'2006-02-15 05:07:09'),(31,8,'2006-02-15 05:07:09'),(32,13,'2006-02-15 05:07:09'),(33,7,'2006-02-15 05:07:09'),(34,11,'2006-02-15 05:07:09'),(35,11,'2006-02-15 05:07:09'),(36,2,'2006-02-15 05:07:09'),(37,4,'2006-02-15 05:07:09'),(38,1,'2006-02-15 05:07:09'),(39,14,'2006-02-15 05:07:09'),(40,6,'2006-02-15 05:07:09'),(41,16,'2006-02-15 05:07:09'),(42,15,'2006-02-15 05:07:09'),(43,8,'2006-02-15 05:07:09'),(44,14,'2006-02-15 05:07:09'),(45,13,'2006-02-15 05:07:09'),(46,10,'2006-02-15 05:07:09'),(47,9,'2006-02-15 05:07:09'),(48,3,'2006-02-15 05:07:09'),(49,14,'2006-02-15 05:07:09'),(50,8,'2006-02-15 05:07:09'),(51,12,'2006-02-15 05:07:09'),(52,9,'2006-02-15 05:07:09'),(53,8,'2006-02-15 05:07:09'),(54,12,'2006-02-15 05:07:09'),(55,14,'2006-02-15 05:07:09'),(56,1,'2006-02-15 05:07:09'),(57,16,'2006-02-15 05:07:09'),(58,6,'2006-02-15 05:07:09'),(59,3,'2006-02-15 05:07:09'),(60,4,'2006-02-15 05:07:09'),(61,7,'2006-02-15 05:07:09'),(62,6,'2006-02-15 05:07:09'),(63,8,'2006-02-15 05:07:09'),(64,7,'2006-02-15 05:07:09'),(65,11,'2006-02-15 05:07:09'),(66,3,'2006-02-15 05:07:09'),(67,1,'2006-02-15 05:07:09'),(68,3,'2006-02-15 05:07:09'),(69,14,'2006-02-15 05:07:09'),(70,2,'2006-02-15 05:07:09'),(71,8,'2006-02-15 05:07:09'),(72,6,'2006-02-15 05:07:09'),(73,14,'2006-02-15 05:07:09'),(74,12,'2006-02-15 05:07:09'),(75,16,'2006-02-15 05:07:09'),(76,12,'2006-02-15 05:07:09'),(77,13,'2006-02-15 05:07:09'),(78,2,'2006-02-15 05:07:09'),(79,7,'2006-02-15 05:07:09'),(80,8,'2006-02-15 05:07:09'),(81,14,'2006-02-15 05:07:09'),(82,8,'2006-02-15 05:07:09'),(83,8,'2006-02-15 05:07:09'),(84,16,'2006-02-15 05:07:09'),(85,6,'2006-02-15 05:07:09'),(86,12,'2006-02-15 05:07:09'),(87,16,'2006-02-15 05:07:09'),(88,16,'2006-02-15 05:07:09'),(89,2,'2006-02-15 05:07:09'),(90,13,'2006-02-15 05:07:09'),(91,4,'2006-02-15 05:07:09'),(92,11,'2006-02-15 05:07:09'),(93,13,'2006-02-15 05:07:09'),(94,8,'2006-02-15 05:07:09'),(95,13,'2006-02-15 05:07:09'),(96,13,'2006-02-15 05:07:09'),(97,1,'2006-02-15 05:07:09'),(98,7,'2006-02-15 05:07:09'),(99,5,'2006-02-15 05:07:09'),(100,9,'2006-02-15 05:07:09'),(101,6,'2006-02-15 05:07:09'),(102,15,'2006-02-15 05:07:09'),(103,16,'2006-02-15 05:07:09'),(104,9,'2006-02-15 05:07:09'),(105,1,'2006-02-15 05:07:09'),(106,10,'2006-02-15 05:07:09'),(107,7,'2006-02-15 05:07:09'),(108,13,'2006-02-15 05:07:09'),(109,13,'2006-02-15 05:07:09'),(110,3,'2006-02-15 05:07:09'),(111,1,'2006-02-15 05:07:09'),(112,9,'2006-02-15 05:07:09'),(113,15,'2006-02-15 05:07:09'),(114,14,'2006-02-15 05:07:09'),(115,1,'2006-02-15 05:07:09'),(116,4,'2006-02-15 05:07:09'),(117,10,'2006-02-15 05:07:09'),(118,2,'2006-02-15 05:07:09'),(119,5,'2006-02-15 05:07:09'),(120,15,'2006-02-15 05:07:09'),(121,2,'2006-02-15 05:07:09'),(122,11,'2006-02-15 05:07:09'),(123,16,'2006-02-15 05:07:09'),(124,3,'2006-02-15 05:07:09'),(125,16,'2006-02-15 05:07:09'),(126,1,'2006-02-15 05:07:09'),(127,5,'2006-02-15 05:07:09'),(128,9,'2006-02-15 05:07:09'),(129,6,'2006-02-15 05:07:09'),(130,1,'2006-02-15 05:07:09'),(131,4,'2006-02-15 05:07:09'),(132,14,'2006-02-15 05:07:09'),(133,12,'2006-02-15 05:07:09'),(134,2,'2006-02-15 05:07:09'),(135,15,'2006-02-15 05:07:09'),(136,13,'2006-02-15 05:07:09'),(137,14,'2006-02-15 05:07:09'),(138,14,'2006-02-15 05:07:09'),(139,8,'2006-02-15 05:07:09'),(140,14,'2006-02-15 05:07:09'),(141,10,'2006-02-15 05:07:09'),(142,6,'2006-02-15 05:07:09'),(143,7,'2006-02-15 05:07:09'),(144,13,'2006-02-15 05:07:09'),(145,8,'2006-02-15 05:07:09'),(146,7,'2006-02-15 05:07:09'),(147,8,'2006-02-15 05:07:09'),(148,9,'2006-02-15 05:07:09'),(149,3,'2006-02-15 05:07:09'),(150,6,'2006-02-15 05:07:09'),(151,14,'2006-02-15 05:07:09'),(152,3,'2006-02-15 05:07:09'),(153,14,'2006-02-15 05:07:09'),(154,2,'2006-02-15 05:07:09'),(155,13,'2006-02-15 05:07:09'),(156,6,'2006-02-15 05:07:09'),(157,3,'2006-02-15 05:07:09'),(158,12,'2006-02-15 05:07:09'),(159,5,'2006-02-15 05:07:09'),(160,2,'2006-02-15 05:07:09'),(161,12,'2006-02-15 05:07:09'),(162,1,'2006-02-15 05:07:09'),(163,13,'2006-02-15 05:07:09'),(164,6,'2006-02-15 05:07:09'),(165,14,'2006-02-15 05:07:09'),(166,4,'2006-02-15 05:07:09'),(167,16,'2006-02-15 05:07:09'),(168,3,'2006-02-15 05:07:09'),(169,16,'2006-02-15 05:07:09'),(170,9,'2006-02-15 05:07:09'),(171,11,'2006-02-15 05:07:09'),(172,7,'2006-02-15 05:07:09'),(173,7,'2006-02-15 05:07:09'),(174,12,'2006-02-15 05:07:09'),(175,8,'2006-02-15 05:07:09'),(176,15,'2006-02-15 05:07:09'),(177,14,'2006-02-15 05:07:09'),(178,5,'2006-02-15 05:07:09'),(179,7,'2006-02-15 05:07:09'),(180,4,'2006-02-15 05:07:09'),(181,16,'2006-02-15 05:07:09'),(182,5,'2006-02-15 05:07:09'),(183,8,'2006-02-15 05:07:09'),(184,4,'2006-02-15 05:07:09'),(185,9,'2006-02-15 05:07:09'),(186,7,'2006-02-15 05:07:09'),(187,15,'2006-02-15 05:07:09'),(188,5,'2006-02-15 05:07:09'),(189,10,'2006-02-15 05:07:09'),(190,4,'2006-02-15 05:07:09'),(191,3,'2006-02-15 05:07:09'),(192,9,'2006-02-15 05:07:09'),(193,2,'2006-02-15 05:07:09'),(194,1,'2006-02-15 05:07:09'),(195,14,'2006-02-15 05:07:09'),(196,4,'2006-02-15 05:07:09'),(197,15,'2006-02-15 05:07:09'),(198,9,'2006-02-15 05:07:09'),(199,6,'2006-02-15 05:07:09'),(200,10,'2006-02-15 05:07:09'),(201,9,'2006-02-15 05:07:09'),(202,5,'2006-02-15 05:07:09'),(203,14,'2006-02-15 05:07:09'),(204,7,'2006-02-15 05:07:09'),(205,1,'2006-02-15 05:07:09'),(206,6,'2006-02-15 05:07:09'),(207,9,'2006-02-15 05:07:09'),(208,2,'2006-02-15 05:07:09'),(209,7,'2006-02-15 05:07:09'),(210,1,'2006-02-15 05:07:09'),(211,10,'2006-02-15 05:07:09'),(212,1,'2006-02-15 05:07:09'),(213,8,'2006-02-15 05:07:09'),(214,3,'2006-02-15 05:07:09'),(215,10,'2006-02-15 05:07:09'),(216,13,'2006-02-15 05:07:09'),(217,10,'2006-02-15 05:07:09'),(218,7,'2006-02-15 05:07:09'),(219,6,'2006-02-15 05:07:09'),(220,12,'2006-02-15 05:07:09'),(221,6,'2006-02-15 05:07:09'),(222,11,'2006-02-15 05:07:09'),(223,2,'2006-02-15 05:07:09'),(224,16,'2006-02-15 05:07:09'),(225,7,'2006-02-15 05:07:09'),(226,13,'2006-02-15 05:07:09'),(227,10,'2006-02-15 05:07:09'),(228,4,'2006-02-15 05:07:09'),(229,1,'2006-02-15 05:07:09'),(230,7,'2006-02-15 05:07:09'),(231,8,'2006-02-15 05:07:09'),(232,10,'2006-02-15 05:07:09'),(233,16,'2006-02-15 05:07:09'),(234,14,'2006-02-15 05:07:09'),(235,14,'2006-02-15 05:07:09'),(236,10,'2006-02-15 05:07:09'),(237,15,'2006-02-15 05:07:09'),(238,3,'2006-02-15 05:07:09'),(239,2,'2006-02-15 05:07:09'),(240,14,'2006-02-15 05:07:09'),(241,2,'2006-02-15 05:07:09'),(242,5,'2006-02-15 05:07:09'),(243,2,'2006-02-15 05:07:09'),(244,12,'2006-02-15 05:07:09'),(245,2,'2006-02-15 05:07:09'),(246,9,'2006-02-15 05:07:09'),(247,5,'2006-02-15 05:07:09'),(248,6,'2006-02-15 05:07:09'),(249,4,'2006-02-15 05:07:09'),(250,1,'2006-02-15 05:07:09'),(251,13,'2006-02-15 05:07:09'),(252,1,'2006-02-15 05:07:09'),(253,1,'2006-02-15 05:07:09'),(254,15,'2006-02-15 05:07:09'),(255,12,'2006-02-15 05:07:09'),(256,15,'2006-02-15 05:07:09'),(257,16,'2006-02-15 05:07:09'),(258,11,'2006-02-15 05:07:09'),(259,2,'2006-02-15 05:07:09'),(260,15,'2006-02-15 05:07:09'),(261,6,'2006-02-15 05:07:09'),(262,8,'2006-02-15 05:07:09'),(263,15,'2006-02-15 05:07:09'),(264,10,'2006-02-15 05:07:09'),(265,5,'2006-02-15 05:07:09'),(266,4,'2006-02-15 05:07:09'),(267,13,'2006-02-15 05:07:09'),(268,2,'2006-02-15 05:07:09'),(269,8,'2006-02-15 05:07:09'),(270,13,'2006-02-15 05:07:09'),(271,1,'2006-02-15 05:07:09'),(272,7,'2006-02-15 05:07:09'),(273,8,'2006-02-15 05:07:09'),(274,6,'2006-02-15 05:07:09'),(275,11,'2006-02-15 05:07:09'),(276,5,'2006-02-15 05:07:09'),(277,11,'2006-02-15 05:07:09'),(278,12,'2006-02-15 05:07:09'),(279,15,'2006-02-15 05:07:09'),(280,3,'2006-02-15 05:07:09'),(281,10,'2006-02-15 05:07:09'),(282,7,'2006-02-15 05:07:09'),(283,13,'2006-02-15 05:07:09'),(284,12,'2006-02-15 05:07:09'),(285,14,'2006-02-15 05:07:09'),(286,16,'2006-02-15 05:07:09'),(287,1,'2006-02-15 05:07:09'),(288,16,'2006-02-15 05:07:09'),(289,13,'2006-02-15 05:07:09'),(290,9,'2006-02-15 05:07:09'),(291,15,'2006-02-15 05:07:09'),(292,1,'2006-02-15 05:07:09'),(293,15,'2006-02-15 05:07:09'),(294,16,'2006-02-15 05:07:09'),(295,6,'2006-02-15 05:07:09'),(296,14,'2006-02-15 05:07:09'),(297,4,'2006-02-15 05:07:09'),(298,14,'2006-02-15 05:07:09'),(299,16,'2006-02-15 05:07:09'),(300,2,'2006-02-15 05:07:09'),(301,11,'2006-02-15 05:07:09'),(302,10,'2006-02-15 05:07:09'),(303,1,'2006-02-15 05:07:09'),(304,3,'2006-02-15 05:07:09'),(305,13,'2006-02-15 05:07:09'),(306,10,'2006-02-15 05:07:09'),(307,16,'2006-02-15 05:07:09'),(308,5,'2006-02-15 05:07:09'),(309,8,'2006-02-15 05:07:09'),(310,10,'2006-02-15 05:07:09'),(311,9,'2006-02-15 05:07:09'),(312,14,'2006-02-15 05:07:09'),(313,11,'2006-02-15 05:07:09'),(314,2,'2006-02-15 05:07:09'),(315,8,'2006-02-15 05:07:09'),(316,10,'2006-02-15 05:07:09'),(317,5,'2006-02-15 05:07:09'),(318,1,'2006-02-15 05:07:09'),(319,14,'2006-02-15 05:07:09'),(320,13,'2006-02-15 05:07:09'),(321,13,'2006-02-15 05:07:09'),(322,15,'2006-02-15 05:07:09'),(323,15,'2006-02-15 05:07:09'),(324,5,'2006-02-15 05:07:09'),(325,2,'2006-02-15 05:07:09'),(326,2,'2006-02-15 05:07:09'),(327,1,'2006-02-15 05:07:09'),(328,3,'2006-02-15 05:07:09'),(329,1,'2006-02-15 05:07:09'),(330,2,'2006-02-15 05:07:09'),(331,10,'2006-02-15 05:07:09'),(332,5,'2006-02-15 05:07:09'),(333,12,'2006-02-15 05:07:09'),(334,11,'2006-02-15 05:07:09'),(335,5,'2006-02-15 05:07:09'),(336,6,'2006-02-15 05:07:09'),(337,9,'2006-02-15 05:07:09'),(338,14,'2006-02-15 05:07:09'),(339,16,'2006-02-15 05:07:09'),(340,13,'2006-02-15 05:07:09'),(341,4,'2006-02-15 05:07:09'),(342,16,'2006-02-15 05:07:09'),(343,3,'2006-02-15 05:07:09'),(344,3,'2006-02-15 05:07:09'),(345,8,'2006-02-15 05:07:09'),(346,4,'2006-02-15 05:07:09'),(347,16,'2006-02-15 05:07:09'),(348,8,'2006-02-15 05:07:09'),(349,2,'2006-02-15 05:07:09'),(350,14,'2006-02-15 05:07:09'),(351,11,'2006-02-15 05:07:09'),(352,10,'2006-02-15 05:07:09'),(353,9,'2006-02-15 05:07:09'),(354,3,'2006-02-15 05:07:09'),(355,2,'2006-02-15 05:07:09'),(356,3,'2006-02-15 05:07:09'),(357,4,'2006-02-15 05:07:09'),(358,4,'2006-02-15 05:07:09'),(359,8,'2006-02-15 05:07:09'),(360,1,'2006-02-15 05:07:09'),(361,15,'2006-02-15 05:07:09'),(362,10,'2006-02-15 05:07:09'),(363,12,'2006-02-15 05:07:09'),(364,13,'2006-02-15 05:07:09'),(365,5,'2006-02-15 05:07:09'),(366,7,'2006-02-15 05:07:09'),(367,14,'2006-02-15 05:07:09'),(368,7,'2006-02-15 05:07:09'),(369,14,'2006-02-15 05:07:09'),(370,3,'2006-02-15 05:07:09'),(371,1,'2006-02-15 05:07:09'),(372,15,'2006-02-15 05:07:09'),(373,3,'2006-02-15 05:07:09'),(374,14,'2006-02-15 05:07:09'),(375,1,'2006-02-15 05:07:09'),(376,9,'2006-02-15 05:07:09'),(377,8,'2006-02-15 05:07:09'),(378,12,'2006-02-15 05:07:09'),(379,7,'2006-02-15 05:07:09'),(380,9,'2006-02-15 05:07:09'),(381,10,'2006-02-15 05:07:09'),(382,10,'2006-02-15 05:07:09'),(383,15,'2006-02-15 05:07:09'),(384,12,'2006-02-15 05:07:09'),(385,5,'2006-02-15 05:07:09'),(386,16,'2006-02-15 05:07:09'),(387,10,'2006-02-15 05:07:09'),(388,5,'2006-02-15 05:07:09'),(389,15,'2006-02-15 05:07:09'),(390,14,'2006-02-15 05:07:09'),(391,8,'2006-02-15 05:07:09'),(392,3,'2006-02-15 05:07:09'),(393,6,'2006-02-15 05:07:09'),(394,14,'2006-02-15 05:07:09'),(395,1,'2006-02-15 05:07:09'),(396,7,'2006-02-15 05:07:09'),(397,14,'2006-02-15 05:07:09'),(398,12,'2006-02-15 05:07:09'),(399,9,'2006-02-15 05:07:09'),(400,6,'2006-02-15 05:07:09'),(401,7,'2006-02-15 05:07:09'),(402,2,'2006-02-15 05:07:09'),(403,7,'2006-02-15 05:07:09'),(404,5,'2006-02-15 05:07:09'),(405,16,'2006-02-15 05:07:09'),(406,10,'2006-02-15 05:07:09'),(407,6,'2006-02-15 05:07:09'),(408,10,'2006-02-15 05:07:09'),(409,3,'2006-02-15 05:07:09'),(410,5,'2006-02-15 05:07:09'),(411,12,'2006-02-15 05:07:09'),(412,6,'2006-02-15 05:07:09'),(413,5,'2006-02-15 05:07:09'),(414,9,'2006-02-15 05:07:09'),(415,11,'2006-02-15 05:07:09'),(416,9,'2006-02-15 05:07:09'),(417,1,'2006-02-15 05:07:09'),(418,7,'2006-02-15 05:07:09'),(419,8,'2006-02-15 05:07:09'),(420,15,'2006-02-15 05:07:09'),(421,9,'2006-02-15 05:07:09'),(422,14,'2006-02-15 05:07:09'),(423,3,'2006-02-15 05:07:09'),(424,3,'2006-02-15 05:07:09'),(425,4,'2006-02-15 05:07:09'),(426,12,'2006-02-15 05:07:09'),(427,6,'2006-02-15 05:07:09'),(428,8,'2006-02-15 05:07:09'),(429,15,'2006-02-15 05:07:09'),(430,2,'2006-02-15 05:07:09'),(431,9,'2006-02-15 05:07:09'),(432,4,'2006-02-15 05:07:09'),(433,2,'2006-02-15 05:07:09'),(434,16,'2006-02-15 05:07:09'),(435,9,'2006-02-15 05:07:09'),(436,13,'2006-02-15 05:07:09'),(437,8,'2006-02-15 05:07:09'),(438,10,'2006-02-15 05:07:09'),(439,7,'2006-02-15 05:07:09'),(440,9,'2006-02-15 05:07:09'),(441,6,'2006-02-15 05:07:09'),(442,8,'2006-02-15 05:07:09'),(443,5,'2006-02-15 05:07:09'),(444,5,'2006-02-15 05:07:09'),(445,4,'2006-02-15 05:07:09'),(446,15,'2006-02-15 05:07:09'),(447,10,'2006-02-15 05:07:09'),(448,13,'2006-02-15 05:07:09'),(449,14,'2006-02-15 05:07:09'),(450,3,'2006-02-15 05:07:09'),(451,16,'2006-02-15 05:07:09'),(452,9,'2006-02-15 05:07:09'),(453,15,'2006-02-15 05:07:09'),(454,12,'2006-02-15 05:07:09'),(455,9,'2006-02-15 05:07:09'),(456,2,'2006-02-15 05:07:09'),(457,6,'2006-02-15 05:07:09'),(458,8,'2006-02-15 05:07:09'),(459,9,'2006-02-15 05:07:09'),(460,9,'2006-02-15 05:07:09'),(461,2,'2006-02-15 05:07:09'),(462,12,'2006-02-15 05:07:09'),(463,15,'2006-02-15 05:07:09'),(464,2,'2006-02-15 05:07:09'),(465,13,'2006-02-15 05:07:09'),(466,6,'2006-02-15 05:07:09'),(467,9,'2006-02-15 05:07:09'),(468,3,'2006-02-15 05:07:09'),(469,4,'2006-02-15 05:07:09'),(470,2,'2006-02-15 05:07:09'),(471,4,'2006-02-15 05:07:09'),(472,16,'2006-02-15 05:07:09'),(473,7,'2006-02-15 05:07:09'),(474,15,'2006-02-15 05:07:09'),(475,11,'2006-02-15 05:07:09'),(476,8,'2006-02-15 05:07:09'),(477,12,'2006-02-15 05:07:09'),(478,5,'2006-02-15 05:07:09'),(479,8,'2006-02-15 05:07:09'),(480,4,'2006-02-15 05:07:09'),(481,13,'2006-02-15 05:07:09'),(482,4,'2006-02-15 05:07:09'),(483,10,'2006-02-15 05:07:09'),(484,4,'2006-02-15 05:07:09'),(485,3,'2006-02-15 05:07:09'),(486,9,'2006-02-15 05:07:09'),(487,4,'2006-02-15 05:07:09'),(488,15,'2006-02-15 05:07:09'),(489,2,'2006-02-15 05:07:09'),(490,13,'2006-02-15 05:07:09'),(491,3,'2006-02-15 05:07:09'),(492,13,'2006-02-15 05:07:09'),(493,9,'2006-02-15 05:07:09'),(494,11,'2006-02-15 05:07:09'),(495,11,'2006-02-15 05:07:09'),(496,16,'2006-02-15 05:07:09'),(497,6,'2006-02-15 05:07:09'),(498,8,'2006-02-15 05:07:09'),(499,8,'2006-02-15 05:07:09'),(500,9,'2006-02-15 05:07:09'),(501,1,'2006-02-15 05:07:09'),(502,5,'2006-02-15 05:07:09'),(503,15,'2006-02-15 05:07:09'),(504,7,'2006-02-15 05:07:09'),(505,3,'2006-02-15 05:07:09'),(506,11,'2006-02-15 05:07:09'),(507,10,'2006-02-15 05:07:09'),(508,10,'2006-02-15 05:07:09'),(509,3,'2006-02-15 05:07:09'),(510,2,'2006-02-15 05:07:09'),(511,1,'2006-02-15 05:07:09'),(512,4,'2006-02-15 05:07:09'),(513,16,'2006-02-15 05:07:09'),(514,7,'2006-02-15 05:07:09'),(515,3,'2006-02-15 05:07:09'),(516,12,'2006-02-15 05:07:09'),(517,15,'2006-02-15 05:07:09'),(518,16,'2006-02-15 05:07:09'),(519,15,'2006-02-15 05:07:09'),(520,14,'2006-02-15 05:07:09'),(521,7,'2006-02-15 05:07:09'),(522,5,'2006-02-15 05:07:09'),(523,4,'2006-02-15 05:07:09'),(524,5,'2006-02-15 05:07:09'),(525,4,'2006-02-15 05:07:09'),(526,16,'2006-02-15 05:07:09'),(527,11,'2006-02-15 05:07:09'),(528,8,'2006-02-15 05:07:09'),(529,5,'2006-02-15 05:07:09'),(530,1,'2006-02-15 05:07:09'),(531,9,'2006-02-15 05:07:09'),(532,15,'2006-02-15 05:07:09'),(533,9,'2006-02-15 05:07:09'),(534,8,'2006-02-15 05:07:09'),(535,11,'2006-02-15 05:07:09'),(536,4,'2006-02-15 05:07:09'),(537,4,'2006-02-15 05:07:09'),(538,13,'2006-02-15 05:07:09'),(539,7,'2006-02-15 05:07:09'),(540,12,'2006-02-15 05:07:09'),(541,2,'2006-02-15 05:07:09'),(542,1,'2006-02-15 05:07:09'),(543,16,'2006-02-15 05:07:09'),(544,6,'2006-02-15 05:07:09'),(545,9,'2006-02-15 05:07:09'),(546,10,'2006-02-15 05:07:09'),(547,3,'2006-02-15 05:07:09'),(548,4,'2006-02-15 05:07:09'),(549,1,'2006-02-15 05:07:09'),(550,8,'2006-02-15 05:07:09'),(551,13,'2006-02-15 05:07:09'),(552,6,'2006-02-15 05:07:09'),(553,3,'2006-02-15 05:07:09'),(554,4,'2006-02-15 05:07:09'),(555,5,'2006-02-15 05:07:09'),(556,10,'2006-02-15 05:07:09'),(557,8,'2006-02-15 05:07:09'),(558,13,'2006-02-15 05:07:09'),(559,14,'2006-02-15 05:07:09'),(560,10,'2006-02-15 05:07:09'),(561,13,'2006-02-15 05:07:09'),(562,12,'2006-02-15 05:07:09'),(563,10,'2006-02-15 05:07:09'),(564,2,'2006-02-15 05:07:09'),(565,9,'2006-02-15 05:07:09'),(566,9,'2006-02-15 05:07:09'),(567,9,'2006-02-15 05:07:09'),(568,5,'2006-02-15 05:07:09'),(569,2,'2006-02-15 05:07:09'),(570,15,'2006-02-15 05:07:09'),(571,6,'2006-02-15 05:07:09'),(572,14,'2006-02-15 05:07:09'),(573,3,'2006-02-15 05:07:09'),(574,1,'2006-02-15 05:07:09'),(575,6,'2006-02-15 05:07:09'),(576,6,'2006-02-15 05:07:09'),(577,15,'2006-02-15 05:07:09'),(578,4,'2006-02-15 05:07:09'),(579,1,'2006-02-15 05:07:09'),(580,13,'2006-02-15 05:07:09'),(581,12,'2006-02-15 05:07:09'),(582,2,'2006-02-15 05:07:09'),(583,2,'2006-02-15 05:07:09'),(584,9,'2006-02-15 05:07:09'),(585,7,'2006-02-15 05:07:09'),(586,1,'2006-02-15 05:07:09'),(587,6,'2006-02-15 05:07:09'),(588,3,'2006-02-15 05:07:09'),(589,6,'2006-02-15 05:07:09'),(590,13,'2006-02-15 05:07:09'),(591,10,'2006-02-15 05:07:09'),(592,12,'2006-02-15 05:07:09'),(593,11,'2006-02-15 05:07:09'),(594,1,'2006-02-15 05:07:09'),(595,9,'2006-02-15 05:07:09'),(596,10,'2006-02-15 05:07:09'),(597,10,'2006-02-15 05:07:09'),(598,15,'2006-02-15 05:07:09'),(599,15,'2006-02-15 05:07:09'),(600,11,'2006-02-15 05:07:09'),(601,16,'2006-02-15 05:07:09'),(602,14,'2006-02-15 05:07:09'),(603,8,'2006-02-15 05:07:09'),(604,5,'2006-02-15 05:07:09'),(605,9,'2006-02-15 05:07:09'),(606,15,'2006-02-15 05:07:09'),(607,9,'2006-02-15 05:07:09'),(608,3,'2006-02-15 05:07:09'),(609,16,'2006-02-15 05:07:09'),(610,8,'2006-02-15 05:07:09'),(611,4,'2006-02-15 05:07:09'),(612,15,'2006-02-15 05:07:09'),(613,5,'2006-02-15 05:07:09'),(614,10,'2006-02-15 05:07:09'),(615,2,'2006-02-15 05:07:09'),(616,6,'2006-02-15 05:07:09'),(617,8,'2006-02-15 05:07:09'),(618,7,'2006-02-15 05:07:09'),(619,15,'2006-02-15 05:07:09'),(620,14,'2006-02-15 05:07:09'),(621,8,'2006-02-15 05:07:09'),(622,6,'2006-02-15 05:07:09'),(623,9,'2006-02-15 05:07:09'),(624,10,'2006-02-15 05:07:09'),(625,14,'2006-02-15 05:07:09'),(626,3,'2006-02-15 05:07:09'),(627,6,'2006-02-15 05:07:09'),(628,15,'2006-02-15 05:07:09'),(629,6,'2006-02-15 05:07:09'),(630,7,'2006-02-15 05:07:09'),(631,15,'2006-02-15 05:07:09'),(632,13,'2006-02-15 05:07:09'),(633,4,'2006-02-15 05:07:09'),(634,8,'2006-02-15 05:07:09'),(635,13,'2006-02-15 05:07:09'),(636,12,'2006-02-15 05:07:09'),(637,14,'2006-02-15 05:07:09'),(638,5,'2006-02-15 05:07:09'),(639,8,'2006-02-15 05:07:09'),(640,9,'2006-02-15 05:07:09'),(641,9,'2006-02-15 05:07:09'),(642,16,'2006-02-15 05:07:09'),(643,7,'2006-02-15 05:07:09'),(644,2,'2006-02-15 05:07:09'),(645,16,'2006-02-15 05:07:09'),(646,10,'2006-02-15 05:07:09'),(647,12,'2006-02-15 05:07:09'),(648,16,'2006-02-15 05:07:09'),(649,2,'2006-02-15 05:07:09'),(650,6,'2006-02-15 05:07:09'),(651,2,'2006-02-15 05:07:09'),(652,4,'2006-02-15 05:07:09'),(653,11,'2006-02-15 05:07:09'),(654,10,'2006-02-15 05:07:09'),(655,14,'2006-02-15 05:07:09'),(656,16,'2006-02-15 05:07:09'),(657,5,'2006-02-15 05:07:09'),(658,11,'2006-02-15 05:07:09'),(659,1,'2006-02-15 05:07:09'),(660,5,'2006-02-15 05:07:09'),(661,9,'2006-02-15 05:07:09'),(662,7,'2006-02-15 05:07:09'),(663,4,'2006-02-15 05:07:09'),(664,1,'2006-02-15 05:07:09'),(665,11,'2006-02-15 05:07:09'),(666,7,'2006-02-15 05:07:09'),(667,15,'2006-02-15 05:07:09'),(668,15,'2006-02-15 05:07:09'),(669,9,'2006-02-15 05:07:09'),(670,6,'2006-02-15 05:07:09'),(671,15,'2006-02-15 05:07:09'),(672,5,'2006-02-15 05:07:09'),(673,12,'2006-02-15 05:07:09'),(674,9,'2006-02-15 05:07:09'),(675,13,'2006-02-15 05:07:09'),(676,15,'2006-02-15 05:07:09'),(677,13,'2006-02-15 05:07:09'),(678,15,'2006-02-15 05:07:09'),(679,8,'2006-02-15 05:07:09'),(680,5,'2006-02-15 05:07:09'),(681,15,'2006-02-15 05:07:09'),(682,8,'2006-02-15 05:07:09'),(683,7,'2006-02-15 05:07:09'),(684,10,'2006-02-15 05:07:09'),(685,13,'2006-02-15 05:07:09'),(686,13,'2006-02-15 05:07:09'),(687,6,'2006-02-15 05:07:09'),(688,3,'2006-02-15 05:07:09'),(689,9,'2006-02-15 05:07:09'),(690,2,'2006-02-15 05:07:09'),(691,15,'2006-02-15 05:07:09'),(692,2,'2006-02-15 05:07:09'),(693,2,'2006-02-15 05:07:09'),(694,4,'2006-02-15 05:07:09'),(695,8,'2006-02-15 05:07:09'),(696,2,'2006-02-15 05:07:09'),(697,1,'2006-02-15 05:07:09'),(698,6,'2006-02-15 05:07:09'),(699,10,'2006-02-15 05:07:09'),(700,8,'2006-02-15 05:07:09'),(701,10,'2006-02-15 05:07:09'),(702,11,'2006-02-15 05:07:09'),(703,2,'2006-02-15 05:07:09'),(704,5,'2006-02-15 05:07:09'),(705,9,'2006-02-15 05:07:09'),(706,7,'2006-02-15 05:07:09'),(707,1,'2006-02-15 05:07:09'),(708,6,'2006-02-15 05:07:09'),(709,7,'2006-02-15 05:07:09'),(710,8,'2006-02-15 05:07:09'),(711,14,'2006-02-15 05:07:09'),(712,6,'2006-02-15 05:07:09'),(713,6,'2006-02-15 05:07:09'),(714,14,'2006-02-15 05:07:09'),(715,8,'2006-02-15 05:07:09'),(716,11,'2006-02-15 05:07:09'),(717,1,'2006-02-15 05:07:09'),(718,12,'2006-02-15 05:07:09'),(719,15,'2006-02-15 05:07:09'),(720,13,'2006-02-15 05:07:09'),(721,12,'2006-02-15 05:07:09'),(722,11,'2006-02-15 05:07:09'),(723,14,'2006-02-15 05:07:09'),(724,8,'2006-02-15 05:07:09'),(725,4,'2006-02-15 05:07:09'),(726,9,'2006-02-15 05:07:09'),(727,8,'2006-02-15 05:07:09'),(728,7,'2006-02-15 05:07:09'),(729,15,'2006-02-15 05:07:09'),(730,13,'2006-02-15 05:07:09'),(731,4,'2006-02-15 05:07:09'),(732,1,'2006-02-15 05:07:09'),(733,15,'2006-02-15 05:07:09'),(734,6,'2006-02-15 05:07:09'),(735,3,'2006-02-15 05:07:09'),(736,8,'2006-02-15 05:07:09'),(737,11,'2006-02-15 05:07:09'),(738,9,'2006-02-15 05:07:09'),(739,7,'2006-02-15 05:07:09'),(740,11,'2006-02-15 05:07:09'),(741,12,'2006-02-15 05:07:09'),(742,10,'2006-02-15 05:07:09'),(743,2,'2006-02-15 05:07:09'),(744,4,'2006-02-15 05:07:09'),(745,15,'2006-02-15 05:07:09'),(746,10,'2006-02-15 05:07:09'),(747,10,'2006-02-15 05:07:09'),(748,1,'2006-02-15 05:07:09'),(749,11,'2006-02-15 05:07:09'),(750,13,'2006-02-15 05:07:09'),(751,13,'2006-02-15 05:07:09'),(752,12,'2006-02-15 05:07:09'),(753,8,'2006-02-15 05:07:09'),(754,5,'2006-02-15 05:07:09'),(755,3,'2006-02-15 05:07:09'),(756,5,'2006-02-15 05:07:09'),(757,6,'2006-02-15 05:07:09'),(758,7,'2006-02-15 05:07:09'),(759,13,'2006-02-15 05:07:09'),(760,13,'2006-02-15 05:07:09'),(761,3,'2006-02-15 05:07:09'),(762,10,'2006-02-15 05:07:09'),(763,15,'2006-02-15 05:07:09'),(764,15,'2006-02-15 05:07:09'),(765,5,'2006-02-15 05:07:09'),(766,7,'2006-02-15 05:07:09'),(767,12,'2006-02-15 05:07:09'),(768,3,'2006-02-15 05:07:09'),(769,9,'2006-02-15 05:07:09'),(770,9,'2006-02-15 05:07:09'),(771,7,'2006-02-15 05:07:09'),(772,7,'2006-02-15 05:07:09'),(773,15,'2006-02-15 05:07:09'),(774,5,'2006-02-15 05:07:09'),(775,7,'2006-02-15 05:07:09'),(776,6,'2006-02-15 05:07:09'),(777,15,'2006-02-15 05:07:09'),(778,8,'2006-02-15 05:07:09'),(779,15,'2006-02-15 05:07:09'),(780,8,'2006-02-15 05:07:09'),(781,10,'2006-02-15 05:07:09'),(782,15,'2006-02-15 05:07:09'),(783,16,'2006-02-15 05:07:09'),(784,16,'2006-02-15 05:07:09'),(785,16,'2006-02-15 05:07:09'),(786,3,'2006-02-15 05:07:09'),(787,16,'2006-02-15 05:07:09'),(788,6,'2006-02-15 05:07:09'),(789,9,'2006-02-15 05:07:09'),(790,7,'2006-02-15 05:07:09'),(791,6,'2006-02-15 05:07:09'),(792,9,'2006-02-15 05:07:09'),(793,1,'2006-02-15 05:07:09'),(794,1,'2006-02-15 05:07:09'),(795,8,'2006-02-15 05:07:09'),(796,15,'2006-02-15 05:07:09'),(797,12,'2006-02-15 05:07:09'),(798,14,'2006-02-15 05:07:09'),(799,11,'2006-02-15 05:07:09'),(800,11,'2006-02-15 05:07:09'),(801,3,'2006-02-15 05:07:09'),(802,1,'2006-02-15 05:07:09'),(803,7,'2006-02-15 05:07:09'),(804,11,'2006-02-15 05:07:09'),(805,2,'2006-02-15 05:07:09'),(806,13,'2006-02-15 05:07:09'),(807,10,'2006-02-15 05:07:09'),(808,4,'2006-02-15 05:07:09'),(809,15,'2006-02-15 05:07:09'),(810,8,'2006-02-15 05:07:09'),(811,16,'2006-02-15 05:07:09'),(812,6,'2006-02-15 05:07:09'),(813,15,'2006-02-15 05:07:09'),(814,5,'2006-02-15 05:07:09'),(815,4,'2006-02-15 05:07:09'),(816,2,'2006-02-15 05:07:09'),(817,14,'2006-02-15 05:07:09'),(818,7,'2006-02-15 05:07:09'),(819,12,'2006-02-15 05:07:09'),(820,2,'2006-02-15 05:07:09'),(821,9,'2006-02-15 05:07:09'),(822,8,'2006-02-15 05:07:09'),(823,1,'2006-02-15 05:07:09'),(824,8,'2006-02-15 05:07:09'),(825,1,'2006-02-15 05:07:09'),(826,16,'2006-02-15 05:07:09'),(827,7,'2006-02-15 05:07:09'),(828,4,'2006-02-15 05:07:09'),(829,8,'2006-02-15 05:07:09'),(830,11,'2006-02-15 05:07:09'),(831,14,'2006-02-15 05:07:09'),(832,8,'2006-02-15 05:07:09'),(833,3,'2006-02-15 05:07:09'),(834,6,'2006-02-15 05:07:09'),(835,10,'2006-02-15 05:07:09'),(836,15,'2006-02-15 05:07:09'),(837,5,'2006-02-15 05:07:09'),(838,1,'2006-02-15 05:07:09'),(839,14,'2006-02-15 05:07:09'),(840,10,'2006-02-15 05:07:09'),(841,15,'2006-02-15 05:07:09'),(842,10,'2006-02-15 05:07:09'),(843,4,'2006-02-15 05:07:09'),(844,15,'2006-02-15 05:07:09'),(845,9,'2006-02-15 05:07:09'),(846,13,'2006-02-15 05:07:09'),(847,13,'2006-02-15 05:07:09'),(848,16,'2006-02-15 05:07:09'),(849,2,'2006-02-15 05:07:09'),(850,1,'2006-02-15 05:07:09'),(851,15,'2006-02-15 05:07:09'),(852,3,'2006-02-15 05:07:09'),(853,3,'2006-02-15 05:07:09'),(854,11,'2006-02-15 05:07:09'),(855,6,'2006-02-15 05:07:09'),(856,11,'2006-02-15 05:07:09'),(857,5,'2006-02-15 05:07:09'),(858,5,'2006-02-15 05:07:09'),(859,2,'2006-02-15 05:07:09'),(860,14,'2006-02-15 05:07:09'),(861,10,'2006-02-15 05:07:09'),(862,4,'2006-02-15 05:07:09'),(863,14,'2006-02-15 05:07:09'),(864,3,'2006-02-15 05:07:09'),(865,2,'2006-02-15 05:07:09'),(866,8,'2006-02-15 05:07:09'),(867,8,'2006-02-15 05:07:09'),(868,16,'2006-02-15 05:07:09'),(869,1,'2006-02-15 05:07:09'),(870,11,'2006-02-15 05:07:09'),(871,5,'2006-02-15 05:07:09'),(872,16,'2006-02-15 05:07:09'),(873,3,'2006-02-15 05:07:09'),(874,4,'2006-02-15 05:07:09'),(875,15,'2006-02-15 05:07:09'),(876,11,'2006-02-15 05:07:09'),(877,12,'2006-02-15 05:07:09'),(878,16,'2006-02-15 05:07:09'),(879,12,'2006-02-15 05:07:09'),(880,2,'2006-02-15 05:07:09'),(881,11,'2006-02-15 05:07:09'),(882,7,'2006-02-15 05:07:09'),(883,3,'2006-02-15 05:07:09'),(884,12,'2006-02-15 05:07:09'),(885,11,'2006-02-15 05:07:09'),(886,2,'2006-02-15 05:07:09'),(887,2,'2006-02-15 05:07:09'),(888,6,'2006-02-15 05:07:09'),(889,3,'2006-02-15 05:07:09'),(890,15,'2006-02-15 05:07:09'),(891,4,'2006-02-15 05:07:09'),(892,2,'2006-02-15 05:07:09'),(893,14,'2006-02-15 05:07:09'),(894,16,'2006-02-15 05:07:09'),(895,4,'2006-02-15 05:07:09'),(896,3,'2006-02-15 05:07:09'),(897,7,'2006-02-15 05:07:09'),(898,15,'2006-02-15 05:07:09'),(899,4,'2006-02-15 05:07:09'),(900,9,'2006-02-15 05:07:09'),(901,2,'2006-02-15 05:07:09'),(902,15,'2006-02-15 05:07:09'),(903,16,'2006-02-15 05:07:09'),(904,11,'2006-02-15 05:07:09'),(905,5,'2006-02-15 05:07:09'),(906,5,'2006-02-15 05:07:09'),(907,7,'2006-02-15 05:07:09'),(908,9,'2006-02-15 05:07:09'),(909,11,'2006-02-15 05:07:09'),(910,7,'2006-02-15 05:07:09'),(911,1,'2006-02-15 05:07:09'),(912,14,'2006-02-15 05:07:09'),(913,13,'2006-02-15 05:07:09'),(914,16,'2006-02-15 05:07:09'),(915,1,'2006-02-15 05:07:09'),(916,2,'2006-02-15 05:07:09'),(917,15,'2006-02-15 05:07:09'),(918,3,'2006-02-15 05:07:09'),(919,10,'2006-02-15 05:07:09'),(920,13,'2006-02-15 05:07:09'),(921,12,'2006-02-15 05:07:09'),(922,11,'2006-02-15 05:07:09'),(923,7,'2006-02-15 05:07:09'),(924,14,'2006-02-15 05:07:09'),(925,6,'2006-02-15 05:07:09'),(926,6,'2006-02-15 05:07:09'),(927,1,'2006-02-15 05:07:09'),(928,3,'2006-02-15 05:07:09'),(929,9,'2006-02-15 05:07:09'),(930,14,'2006-02-15 05:07:09'),(931,16,'2006-02-15 05:07:09'),(932,5,'2006-02-15 05:07:09'),(933,13,'2006-02-15 05:07:09'),(934,10,'2006-02-15 05:07:09'),(935,13,'2006-02-15 05:07:09'),(936,12,'2006-02-15 05:07:09'),(937,13,'2006-02-15 05:07:09'),(938,5,'2006-02-15 05:07:09'),(939,5,'2006-02-15 05:07:09'),(940,15,'2006-02-15 05:07:09'),(941,10,'2006-02-15 05:07:09'),(942,7,'2006-02-15 05:07:09'),(943,6,'2006-02-15 05:07:09'),(944,7,'2006-02-15 05:07:09'),(945,6,'2006-02-15 05:07:09'),(946,8,'2006-02-15 05:07:09'),(947,9,'2006-02-15 05:07:09'),(948,13,'2006-02-15 05:07:09'),(949,10,'2006-02-15 05:07:09'),(950,4,'2006-02-15 05:07:09'),(951,4,'2006-02-15 05:07:09'),(952,6,'2006-02-15 05:07:09'),(953,2,'2006-02-15 05:07:09'),(954,13,'2006-02-15 05:07:09'),(955,3,'2006-02-15 05:07:09'),(956,10,'2006-02-15 05:07:09'),(957,9,'2006-02-15 05:07:09'),(958,7,'2006-02-15 05:07:09'),(959,3,'2006-02-15 05:07:09'),(960,6,'2006-02-15 05:07:09'),(961,9,'2006-02-15 05:07:09'),(962,4,'2006-02-15 05:07:09'),(963,2,'2006-02-15 05:07:09'),(964,1,'2006-02-15 05:07:09'),(965,11,'2006-02-15 05:07:09'),(966,6,'2006-02-15 05:07:09'),(967,14,'2006-02-15 05:07:09'),(968,1,'2006-02-15 05:07:09'),(969,7,'2006-02-15 05:07:09'),(970,4,'2006-02-15 05:07:09'),(971,9,'2006-02-15 05:07:09'),(972,14,'2006-02-15 05:07:09'),(973,6,'2006-02-15 05:07:09'),(974,13,'2006-02-15 05:07:09'),(975,8,'2006-02-15 05:07:09'),(976,10,'2006-02-15 05:07:09'),(977,16,'2006-02-15 05:07:09'),(978,5,'2006-02-15 05:07:09'),(979,7,'2006-02-15 05:07:09'),(980,12,'2006-02-15 05:07:09'),(981,16,'2006-02-15 05:07:09'),(982,1,'2006-02-15 05:07:09'),(983,12,'2006-02-15 05:07:09'),(984,9,'2006-02-15 05:07:09'),(985,14,'2006-02-15 05:07:09'),(986,2,'2006-02-15 05:07:09'),(987,12,'2006-02-15 05:07:09'),(988,16,'2006-02-15 05:07:09'),(989,16,'2006-02-15 05:07:09'),(990,11,'2006-02-15 05:07:09'),(991,1,'2006-02-15 05:07:09'),(992,6,'2006-02-15 05:07:09'),(993,3,'2006-02-15 05:07:09'),(994,13,'2006-02-15 05:07:09'),(995,11,'2006-02-15 05:07:09'),(996,6,'2006-02-15 05:07:09'),(997,12,'2006-02-15 05:07:09'),(998,11,'2006-02-15 05:07:09'),(999,3,'2006-02-15 05:07:09'),(1000,5,'2006-02-15 05:07:09'); -COMMIT; - --- --- Dumping data for table inventory --- - -SET AUTOCOMMIT=0; -INSERT INTO inventory VALUES (1,1,1,'2006-02-15 05:09:17'),(2,1,1,'2006-02-15 05:09:17'),(3,1,1,'2006-02-15 05:09:17'),(4,1,1,'2006-02-15 05:09:17'),(5,1,2,'2006-02-15 05:09:17'),(6,1,2,'2006-02-15 05:09:17'),(7,1,2,'2006-02-15 05:09:17'),(8,1,2,'2006-02-15 05:09:17'),(9,2,2,'2006-02-15 05:09:17'),(10,2,2,'2006-02-15 05:09:17'),(11,2,2,'2006-02-15 05:09:17'),(12,3,2,'2006-02-15 05:09:17'),(13,3,2,'2006-02-15 05:09:17'),(14,3,2,'2006-02-15 05:09:17'),(15,3,2,'2006-02-15 05:09:17'),(16,4,1,'2006-02-15 05:09:17'),(17,4,1,'2006-02-15 05:09:17'),(18,4,1,'2006-02-15 05:09:17'),(19,4,1,'2006-02-15 05:09:17'),(20,4,2,'2006-02-15 05:09:17'),(21,4,2,'2006-02-15 05:09:17'),(22,4,2,'2006-02-15 05:09:17'),(23,5,2,'2006-02-15 05:09:17'),(24,5,2,'2006-02-15 05:09:17'),(25,5,2,'2006-02-15 05:09:17'),(26,6,1,'2006-02-15 05:09:17'),(27,6,1,'2006-02-15 05:09:17'),(28,6,1,'2006-02-15 05:09:17'),(29,6,2,'2006-02-15 05:09:17'),(30,6,2,'2006-02-15 05:09:17'),(31,6,2,'2006-02-15 05:09:17'),(32,7,1,'2006-02-15 05:09:17'),(33,7,1,'2006-02-15 05:09:17'),(34,7,2,'2006-02-15 05:09:17'),(35,7,2,'2006-02-15 05:09:17'),(36,7,2,'2006-02-15 05:09:17'),(37,8,2,'2006-02-15 05:09:17'),(38,8,2,'2006-02-15 05:09:17'),(39,8,2,'2006-02-15 05:09:17'),(40,8,2,'2006-02-15 05:09:17'),(41,9,1,'2006-02-15 05:09:17'),(42,9,1,'2006-02-15 05:09:17'),(43,9,1,'2006-02-15 05:09:17'),(44,9,2,'2006-02-15 05:09:17'),(45,9,2,'2006-02-15 05:09:17'),(46,10,1,'2006-02-15 05:09:17'),(47,10,1,'2006-02-15 05:09:17'),(48,10,1,'2006-02-15 05:09:17'),(49,10,1,'2006-02-15 05:09:17'),(50,10,2,'2006-02-15 05:09:17'),(51,10,2,'2006-02-15 05:09:17'),(52,10,2,'2006-02-15 05:09:17'),(53,11,1,'2006-02-15 05:09:17'),(54,11,1,'2006-02-15 05:09:17'),(55,11,1,'2006-02-15 05:09:17'),(56,11,1,'2006-02-15 05:09:17'),(57,11,2,'2006-02-15 05:09:17'),(58,11,2,'2006-02-15 05:09:17'),(59,11,2,'2006-02-15 05:09:17'),(60,12,1,'2006-02-15 05:09:17'),(61,12,1,'2006-02-15 05:09:17'),(62,12,1,'2006-02-15 05:09:17'),(63,12,2,'2006-02-15 05:09:17'),(64,12,2,'2006-02-15 05:09:17'),(65,12,2,'2006-02-15 05:09:17'),(66,12,2,'2006-02-15 05:09:17'),(67,13,2,'2006-02-15 05:09:17'),(68,13,2,'2006-02-15 05:09:17'),(69,13,2,'2006-02-15 05:09:17'),(70,13,2,'2006-02-15 05:09:17'),(71,15,1,'2006-02-15 05:09:17'),(72,15,1,'2006-02-15 05:09:17'),(73,15,2,'2006-02-15 05:09:17'),(74,15,2,'2006-02-15 05:09:17'),(75,15,2,'2006-02-15 05:09:17'),(76,15,2,'2006-02-15 05:09:17'),(77,16,1,'2006-02-15 05:09:17'),(78,16,1,'2006-02-15 05:09:17'),(79,16,2,'2006-02-15 05:09:17'),(80,16,2,'2006-02-15 05:09:17'),(81,17,1,'2006-02-15 05:09:17'),(82,17,1,'2006-02-15 05:09:17'),(83,17,1,'2006-02-15 05:09:17'),(84,17,2,'2006-02-15 05:09:17'),(85,17,2,'2006-02-15 05:09:17'),(86,17,2,'2006-02-15 05:09:17'),(87,18,1,'2006-02-15 05:09:17'),(88,18,1,'2006-02-15 05:09:17'),(89,18,1,'2006-02-15 05:09:17'),(90,18,2,'2006-02-15 05:09:17'),(91,18,2,'2006-02-15 05:09:17'),(92,18,2,'2006-02-15 05:09:17'),(93,19,1,'2006-02-15 05:09:17'),(94,19,1,'2006-02-15 05:09:17'),(95,19,1,'2006-02-15 05:09:17'),(96,19,1,'2006-02-15 05:09:17'),(97,19,2,'2006-02-15 05:09:17'),(98,19,2,'2006-02-15 05:09:17'),(99,20,1,'2006-02-15 05:09:17'),(100,20,1,'2006-02-15 05:09:17'),(101,20,1,'2006-02-15 05:09:17'),(102,21,1,'2006-02-15 05:09:17'),(103,21,1,'2006-02-15 05:09:17'),(104,21,2,'2006-02-15 05:09:17'),(105,21,2,'2006-02-15 05:09:17'),(106,21,2,'2006-02-15 05:09:17'),(107,21,2,'2006-02-15 05:09:17'),(108,22,1,'2006-02-15 05:09:17'),(109,22,1,'2006-02-15 05:09:17'),(110,22,1,'2006-02-15 05:09:17'),(111,22,1,'2006-02-15 05:09:17'),(112,22,2,'2006-02-15 05:09:17'),(113,22,2,'2006-02-15 05:09:17'),(114,22,2,'2006-02-15 05:09:17'),(115,23,1,'2006-02-15 05:09:17'),(116,23,1,'2006-02-15 05:09:17'),(117,23,1,'2006-02-15 05:09:17'),(118,23,2,'2006-02-15 05:09:17'),(119,23,2,'2006-02-15 05:09:17'),(120,24,1,'2006-02-15 05:09:17'),(121,24,1,'2006-02-15 05:09:17'),(122,24,1,'2006-02-15 05:09:17'),(123,24,1,'2006-02-15 05:09:17'),(124,25,1,'2006-02-15 05:09:17'),(125,25,1,'2006-02-15 05:09:17'),(126,25,1,'2006-02-15 05:09:17'),(127,25,1,'2006-02-15 05:09:17'),(128,25,2,'2006-02-15 05:09:17'),(129,25,2,'2006-02-15 05:09:17'),(130,26,1,'2006-02-15 05:09:17'),(131,26,1,'2006-02-15 05:09:17'),(132,26,2,'2006-02-15 05:09:17'),(133,26,2,'2006-02-15 05:09:17'),(134,26,2,'2006-02-15 05:09:17'),(135,27,1,'2006-02-15 05:09:17'),(136,27,1,'2006-02-15 05:09:17'),(137,27,1,'2006-02-15 05:09:17'),(138,27,1,'2006-02-15 05:09:17'),(139,28,1,'2006-02-15 05:09:17'),(140,28,1,'2006-02-15 05:09:17'),(141,28,1,'2006-02-15 05:09:17'),(142,29,1,'2006-02-15 05:09:17'),(143,29,1,'2006-02-15 05:09:17'),(144,30,1,'2006-02-15 05:09:17'),(145,30,1,'2006-02-15 05:09:17'),(146,31,1,'2006-02-15 05:09:17'),(147,31,1,'2006-02-15 05:09:17'),(148,31,1,'2006-02-15 05:09:17'),(149,31,1,'2006-02-15 05:09:17'),(150,31,2,'2006-02-15 05:09:17'),(151,31,2,'2006-02-15 05:09:17'),(152,31,2,'2006-02-15 05:09:17'),(153,31,2,'2006-02-15 05:09:17'),(154,32,2,'2006-02-15 05:09:17'),(155,32,2,'2006-02-15 05:09:17'),(156,34,2,'2006-02-15 05:09:17'),(157,34,2,'2006-02-15 05:09:17'),(158,34,2,'2006-02-15 05:09:17'),(159,34,2,'2006-02-15 05:09:17'),(160,35,1,'2006-02-15 05:09:17'),(161,35,1,'2006-02-15 05:09:17'),(162,35,1,'2006-02-15 05:09:17'),(163,35,1,'2006-02-15 05:09:17'),(164,35,2,'2006-02-15 05:09:17'),(165,35,2,'2006-02-15 05:09:17'),(166,35,2,'2006-02-15 05:09:17'),(167,37,1,'2006-02-15 05:09:17'),(168,37,1,'2006-02-15 05:09:17'),(169,37,1,'2006-02-15 05:09:17'),(170,37,1,'2006-02-15 05:09:17'),(171,37,2,'2006-02-15 05:09:17'),(172,37,2,'2006-02-15 05:09:17'),(173,37,2,'2006-02-15 05:09:17'),(174,39,1,'2006-02-15 05:09:17'),(175,39,1,'2006-02-15 05:09:17'),(176,39,1,'2006-02-15 05:09:17'),(177,39,2,'2006-02-15 05:09:17'),(178,39,2,'2006-02-15 05:09:17'),(179,39,2,'2006-02-15 05:09:17'),(180,39,2,'2006-02-15 05:09:17'),(181,40,2,'2006-02-15 05:09:17'),(182,40,2,'2006-02-15 05:09:17'),(183,40,2,'2006-02-15 05:09:17'),(184,40,2,'2006-02-15 05:09:17'),(185,42,2,'2006-02-15 05:09:17'),(186,42,2,'2006-02-15 05:09:17'),(187,42,2,'2006-02-15 05:09:17'),(188,42,2,'2006-02-15 05:09:17'),(189,43,1,'2006-02-15 05:09:17'),(190,43,1,'2006-02-15 05:09:17'),(191,43,1,'2006-02-15 05:09:17'),(192,43,2,'2006-02-15 05:09:17'),(193,43,2,'2006-02-15 05:09:17'),(194,43,2,'2006-02-15 05:09:17'),(195,43,2,'2006-02-15 05:09:17'),(196,44,1,'2006-02-15 05:09:17'),(197,44,1,'2006-02-15 05:09:17'),(198,44,2,'2006-02-15 05:09:17'),(199,44,2,'2006-02-15 05:09:17'),(200,44,2,'2006-02-15 05:09:17'),(201,45,1,'2006-02-15 05:09:17'),(202,45,1,'2006-02-15 05:09:17'),(203,45,1,'2006-02-15 05:09:17'),(204,45,1,'2006-02-15 05:09:17'),(205,45,2,'2006-02-15 05:09:17'),(206,45,2,'2006-02-15 05:09:17'),(207,46,2,'2006-02-15 05:09:17'),(208,46,2,'2006-02-15 05:09:17'),(209,46,2,'2006-02-15 05:09:17'),(210,47,2,'2006-02-15 05:09:17'),(211,47,2,'2006-02-15 05:09:17'),(212,48,1,'2006-02-15 05:09:17'),(213,48,1,'2006-02-15 05:09:17'),(214,48,2,'2006-02-15 05:09:17'),(215,48,2,'2006-02-15 05:09:17'),(216,49,1,'2006-02-15 05:09:17'),(217,49,1,'2006-02-15 05:09:17'),(218,49,1,'2006-02-15 05:09:17'),(219,49,2,'2006-02-15 05:09:17'),(220,49,2,'2006-02-15 05:09:17'),(221,49,2,'2006-02-15 05:09:17'),(222,50,1,'2006-02-15 05:09:17'),(223,50,1,'2006-02-15 05:09:17'),(224,50,1,'2006-02-15 05:09:17'),(225,50,2,'2006-02-15 05:09:17'),(226,50,2,'2006-02-15 05:09:17'),(227,51,1,'2006-02-15 05:09:17'),(228,51,1,'2006-02-15 05:09:17'),(229,51,2,'2006-02-15 05:09:17'),(230,51,2,'2006-02-15 05:09:17'),(231,51,2,'2006-02-15 05:09:17'),(232,51,2,'2006-02-15 05:09:17'),(233,52,2,'2006-02-15 05:09:17'),(234,52,2,'2006-02-15 05:09:17'),(235,53,1,'2006-02-15 05:09:17'),(236,53,1,'2006-02-15 05:09:17'),(237,54,1,'2006-02-15 05:09:17'),(238,54,1,'2006-02-15 05:09:17'),(239,54,1,'2006-02-15 05:09:17'),(240,54,2,'2006-02-15 05:09:17'),(241,54,2,'2006-02-15 05:09:17'),(242,55,1,'2006-02-15 05:09:17'),(243,55,1,'2006-02-15 05:09:17'),(244,55,1,'2006-02-15 05:09:17'),(245,55,1,'2006-02-15 05:09:17'),(246,55,2,'2006-02-15 05:09:17'),(247,55,2,'2006-02-15 05:09:17'),(248,56,1,'2006-02-15 05:09:17'),(249,56,1,'2006-02-15 05:09:17'),(250,56,1,'2006-02-15 05:09:17'),(251,56,2,'2006-02-15 05:09:17'),(252,56,2,'2006-02-15 05:09:17'),(253,57,1,'2006-02-15 05:09:17'),(254,57,1,'2006-02-15 05:09:17'),(255,57,1,'2006-02-15 05:09:17'),(256,57,1,'2006-02-15 05:09:17'),(257,57,2,'2006-02-15 05:09:17'),(258,57,2,'2006-02-15 05:09:17'),(259,57,2,'2006-02-15 05:09:17'),(260,58,2,'2006-02-15 05:09:17'),(261,58,2,'2006-02-15 05:09:17'),(262,58,2,'2006-02-15 05:09:17'),(263,58,2,'2006-02-15 05:09:17'),(264,59,1,'2006-02-15 05:09:17'),(265,59,1,'2006-02-15 05:09:17'),(266,59,1,'2006-02-15 05:09:17'),(267,59,2,'2006-02-15 05:09:17'),(268,59,2,'2006-02-15 05:09:17'),(269,60,1,'2006-02-15 05:09:17'),(270,60,1,'2006-02-15 05:09:17'),(271,60,1,'2006-02-15 05:09:17'),(272,61,1,'2006-02-15 05:09:17'),(273,61,1,'2006-02-15 05:09:17'),(274,61,1,'2006-02-15 05:09:17'),(275,61,1,'2006-02-15 05:09:17'),(276,61,2,'2006-02-15 05:09:17'),(277,61,2,'2006-02-15 05:09:17'),(278,62,2,'2006-02-15 05:09:17'),(279,62,2,'2006-02-15 05:09:17'),(280,63,1,'2006-02-15 05:09:17'),(281,63,1,'2006-02-15 05:09:17'),(282,63,2,'2006-02-15 05:09:17'),(283,63,2,'2006-02-15 05:09:17'),(284,64,2,'2006-02-15 05:09:17'),(285,64,2,'2006-02-15 05:09:17'),(286,64,2,'2006-02-15 05:09:17'),(287,65,2,'2006-02-15 05:09:17'),(288,65,2,'2006-02-15 05:09:17'),(289,65,2,'2006-02-15 05:09:17'),(290,65,2,'2006-02-15 05:09:17'),(291,66,1,'2006-02-15 05:09:17'),(292,66,1,'2006-02-15 05:09:17'),(293,66,1,'2006-02-15 05:09:17'),(294,67,1,'2006-02-15 05:09:17'),(295,67,1,'2006-02-15 05:09:17'),(296,67,2,'2006-02-15 05:09:17'),(297,67,2,'2006-02-15 05:09:17'),(298,67,2,'2006-02-15 05:09:17'),(299,67,2,'2006-02-15 05:09:17'),(300,68,1,'2006-02-15 05:09:17'),(301,68,1,'2006-02-15 05:09:17'),(302,68,2,'2006-02-15 05:09:17'),(303,68,2,'2006-02-15 05:09:17'),(304,69,1,'2006-02-15 05:09:17'),(305,69,1,'2006-02-15 05:09:17'),(306,69,1,'2006-02-15 05:09:17'),(307,69,1,'2006-02-15 05:09:17'),(308,69,2,'2006-02-15 05:09:17'),(309,69,2,'2006-02-15 05:09:17'),(310,69,2,'2006-02-15 05:09:17'),(311,69,2,'2006-02-15 05:09:17'),(312,70,1,'2006-02-15 05:09:17'),(313,70,1,'2006-02-15 05:09:17'),(314,70,2,'2006-02-15 05:09:17'),(315,70,2,'2006-02-15 05:09:17'),(316,71,2,'2006-02-15 05:09:17'),(317,71,2,'2006-02-15 05:09:17'),(318,71,2,'2006-02-15 05:09:17'),(319,71,2,'2006-02-15 05:09:17'),(320,72,1,'2006-02-15 05:09:17'),(321,72,1,'2006-02-15 05:09:17'),(322,72,1,'2006-02-15 05:09:17'),(323,72,1,'2006-02-15 05:09:17'),(324,72,2,'2006-02-15 05:09:17'),(325,72,2,'2006-02-15 05:09:17'),(326,73,1,'2006-02-15 05:09:17'),(327,73,1,'2006-02-15 05:09:17'),(328,73,1,'2006-02-15 05:09:17'),(329,73,1,'2006-02-15 05:09:17'),(330,73,2,'2006-02-15 05:09:17'),(331,73,2,'2006-02-15 05:09:17'),(332,73,2,'2006-02-15 05:09:17'),(333,73,2,'2006-02-15 05:09:17'),(334,74,1,'2006-02-15 05:09:17'),(335,74,1,'2006-02-15 05:09:17'),(336,74,1,'2006-02-15 05:09:17'),(337,74,2,'2006-02-15 05:09:17'),(338,74,2,'2006-02-15 05:09:17'),(339,75,2,'2006-02-15 05:09:17'),(340,75,2,'2006-02-15 05:09:17'),(341,75,2,'2006-02-15 05:09:17'),(342,76,1,'2006-02-15 05:09:17'),(343,76,1,'2006-02-15 05:09:17'),(344,76,1,'2006-02-15 05:09:17'),(345,77,1,'2006-02-15 05:09:17'),(346,77,1,'2006-02-15 05:09:17'),(347,77,1,'2006-02-15 05:09:17'),(348,77,1,'2006-02-15 05:09:17'),(349,77,2,'2006-02-15 05:09:17'),(350,77,2,'2006-02-15 05:09:17'),(351,78,1,'2006-02-15 05:09:17'),(352,78,1,'2006-02-15 05:09:17'),(353,78,1,'2006-02-15 05:09:17'),(354,78,2,'2006-02-15 05:09:17'),(355,78,2,'2006-02-15 05:09:17'),(356,78,2,'2006-02-15 05:09:17'),(357,78,2,'2006-02-15 05:09:17'),(358,79,1,'2006-02-15 05:09:17'),(359,79,1,'2006-02-15 05:09:17'),(360,79,1,'2006-02-15 05:09:17'),(361,79,2,'2006-02-15 05:09:17'),(362,79,2,'2006-02-15 05:09:17'),(363,79,2,'2006-02-15 05:09:17'),(364,80,1,'2006-02-15 05:09:17'),(365,80,1,'2006-02-15 05:09:17'),(366,80,1,'2006-02-15 05:09:17'),(367,80,1,'2006-02-15 05:09:17'),(368,81,1,'2006-02-15 05:09:17'),(369,81,1,'2006-02-15 05:09:17'),(370,81,1,'2006-02-15 05:09:17'),(371,81,1,'2006-02-15 05:09:17'),(372,82,1,'2006-02-15 05:09:17'),(373,82,1,'2006-02-15 05:09:17'),(374,83,1,'2006-02-15 05:09:17'),(375,83,1,'2006-02-15 05:09:17'),(376,83,1,'2006-02-15 05:09:17'),(377,83,2,'2006-02-15 05:09:17'),(378,83,2,'2006-02-15 05:09:17'),(379,84,1,'2006-02-15 05:09:17'),(380,84,1,'2006-02-15 05:09:17'),(381,84,1,'2006-02-15 05:09:17'),(382,84,1,'2006-02-15 05:09:17'),(383,85,2,'2006-02-15 05:09:17'),(384,85,2,'2006-02-15 05:09:17'),(385,85,2,'2006-02-15 05:09:17'),(386,85,2,'2006-02-15 05:09:17'),(387,86,1,'2006-02-15 05:09:17'),(388,86,1,'2006-02-15 05:09:17'),(389,86,1,'2006-02-15 05:09:17'),(390,86,1,'2006-02-15 05:09:17'),(391,86,2,'2006-02-15 05:09:17'),(392,86,2,'2006-02-15 05:09:17'),(393,86,2,'2006-02-15 05:09:17'),(394,86,2,'2006-02-15 05:09:17'),(395,88,2,'2006-02-15 05:09:17'),(396,88,2,'2006-02-15 05:09:17'),(397,88,2,'2006-02-15 05:09:17'),(398,88,2,'2006-02-15 05:09:17'),(399,89,1,'2006-02-15 05:09:17'),(400,89,1,'2006-02-15 05:09:17'),(401,89,1,'2006-02-15 05:09:17'),(402,89,2,'2006-02-15 05:09:17'),(403,89,2,'2006-02-15 05:09:17'),(404,89,2,'2006-02-15 05:09:17'),(405,90,1,'2006-02-15 05:09:17'),(406,90,1,'2006-02-15 05:09:17'),(407,90,1,'2006-02-15 05:09:17'),(408,90,2,'2006-02-15 05:09:17'),(409,90,2,'2006-02-15 05:09:17'),(410,90,2,'2006-02-15 05:09:17'),(411,91,1,'2006-02-15 05:09:17'),(412,91,1,'2006-02-15 05:09:17'),(413,91,1,'2006-02-15 05:09:17'),(414,91,1,'2006-02-15 05:09:17'),(415,91,2,'2006-02-15 05:09:17'),(416,91,2,'2006-02-15 05:09:17'),(417,91,2,'2006-02-15 05:09:17'),(418,91,2,'2006-02-15 05:09:17'),(419,92,1,'2006-02-15 05:09:17'),(420,92,1,'2006-02-15 05:09:17'),(421,92,2,'2006-02-15 05:09:17'),(422,92,2,'2006-02-15 05:09:17'),(423,93,2,'2006-02-15 05:09:17'),(424,93,2,'2006-02-15 05:09:17'),(425,93,2,'2006-02-15 05:09:17'),(426,94,1,'2006-02-15 05:09:17'),(427,94,1,'2006-02-15 05:09:17'),(428,95,1,'2006-02-15 05:09:17'),(429,95,1,'2006-02-15 05:09:17'),(430,95,2,'2006-02-15 05:09:17'),(431,95,2,'2006-02-15 05:09:17'),(432,95,2,'2006-02-15 05:09:17'),(433,96,1,'2006-02-15 05:09:17'),(434,96,1,'2006-02-15 05:09:17'),(435,96,1,'2006-02-15 05:09:17'),(436,97,1,'2006-02-15 05:09:17'),(437,97,1,'2006-02-15 05:09:17'),(438,97,1,'2006-02-15 05:09:17'),(439,97,1,'2006-02-15 05:09:17'),(440,97,2,'2006-02-15 05:09:17'),(441,97,2,'2006-02-15 05:09:17'),(442,98,1,'2006-02-15 05:09:17'),(443,98,1,'2006-02-15 05:09:17'),(444,98,1,'2006-02-15 05:09:17'),(445,99,1,'2006-02-15 05:09:17'),(446,99,1,'2006-02-15 05:09:17'),(447,99,1,'2006-02-15 05:09:17'),(448,99,2,'2006-02-15 05:09:17'),(449,99,2,'2006-02-15 05:09:17'),(450,99,2,'2006-02-15 05:09:17'),(451,100,1,'2006-02-15 05:09:17'),(452,100,1,'2006-02-15 05:09:17'),(453,100,1,'2006-02-15 05:09:17'),(454,100,1,'2006-02-15 05:09:17'),(455,100,2,'2006-02-15 05:09:17'),(456,100,2,'2006-02-15 05:09:17'),(457,101,1,'2006-02-15 05:09:17'),(458,101,1,'2006-02-15 05:09:17'),(459,101,1,'2006-02-15 05:09:17'),(460,101,1,'2006-02-15 05:09:17'),(461,101,2,'2006-02-15 05:09:17'),(462,101,2,'2006-02-15 05:09:17'),(463,102,2,'2006-02-15 05:09:17'),(464,102,2,'2006-02-15 05:09:17'),(465,103,1,'2006-02-15 05:09:17'),(466,103,1,'2006-02-15 05:09:17'),(467,103,1,'2006-02-15 05:09:17'),(468,103,1,'2006-02-15 05:09:17'),(469,103,2,'2006-02-15 05:09:17'),(470,103,2,'2006-02-15 05:09:17'),(471,103,2,'2006-02-15 05:09:17'),(472,103,2,'2006-02-15 05:09:17'),(473,104,2,'2006-02-15 05:09:17'),(474,104,2,'2006-02-15 05:09:17'),(475,104,2,'2006-02-15 05:09:17'),(476,105,1,'2006-02-15 05:09:17'),(477,105,1,'2006-02-15 05:09:17'),(478,105,2,'2006-02-15 05:09:17'),(479,105,2,'2006-02-15 05:09:17'),(480,105,2,'2006-02-15 05:09:17'),(481,106,1,'2006-02-15 05:09:17'),(482,106,1,'2006-02-15 05:09:17'),(483,107,2,'2006-02-15 05:09:17'),(484,107,2,'2006-02-15 05:09:17'),(485,109,1,'2006-02-15 05:09:17'),(486,109,1,'2006-02-15 05:09:17'),(487,109,1,'2006-02-15 05:09:17'),(488,109,1,'2006-02-15 05:09:17'),(489,109,2,'2006-02-15 05:09:17'),(490,109,2,'2006-02-15 05:09:17'),(491,109,2,'2006-02-15 05:09:17'),(492,109,2,'2006-02-15 05:09:17'),(493,110,1,'2006-02-15 05:09:17'),(494,110,1,'2006-02-15 05:09:17'),(495,110,1,'2006-02-15 05:09:17'),(496,110,1,'2006-02-15 05:09:17'),(497,111,2,'2006-02-15 05:09:17'),(498,111,2,'2006-02-15 05:09:17'),(499,111,2,'2006-02-15 05:09:17'),(500,111,2,'2006-02-15 05:09:17'),(501,112,1,'2006-02-15 05:09:17'),(502,112,1,'2006-02-15 05:09:17'),(503,112,1,'2006-02-15 05:09:17'),(504,112,1,'2006-02-15 05:09:17'),(505,112,2,'2006-02-15 05:09:17'),(506,112,2,'2006-02-15 05:09:17'),(507,112,2,'2006-02-15 05:09:17'),(508,113,2,'2006-02-15 05:09:17'),(509,113,2,'2006-02-15 05:09:17'),(510,113,2,'2006-02-15 05:09:17'),(511,113,2,'2006-02-15 05:09:17'),(512,114,1,'2006-02-15 05:09:17'),(513,114,1,'2006-02-15 05:09:17'),(514,114,1,'2006-02-15 05:09:17'),(515,114,1,'2006-02-15 05:09:17'),(516,114,2,'2006-02-15 05:09:17'),(517,114,2,'2006-02-15 05:09:17'),(518,114,2,'2006-02-15 05:09:17'),(519,115,1,'2006-02-15 05:09:17'),(520,115,1,'2006-02-15 05:09:17'),(521,115,1,'2006-02-15 05:09:17'),(522,115,2,'2006-02-15 05:09:17'),(523,115,2,'2006-02-15 05:09:17'),(524,115,2,'2006-02-15 05:09:17'),(525,115,2,'2006-02-15 05:09:17'),(526,116,1,'2006-02-15 05:09:17'),(527,116,1,'2006-02-15 05:09:17'),(528,116,2,'2006-02-15 05:09:17'),(529,116,2,'2006-02-15 05:09:17'),(530,116,2,'2006-02-15 05:09:17'),(531,116,2,'2006-02-15 05:09:17'),(532,117,1,'2006-02-15 05:09:17'),(533,117,1,'2006-02-15 05:09:17'),(534,117,1,'2006-02-15 05:09:17'),(535,117,1,'2006-02-15 05:09:17'),(536,117,2,'2006-02-15 05:09:17'),(537,117,2,'2006-02-15 05:09:17'),(538,118,1,'2006-02-15 05:09:17'),(539,118,1,'2006-02-15 05:09:17'),(540,118,1,'2006-02-15 05:09:17'),(541,118,1,'2006-02-15 05:09:17'),(542,118,2,'2006-02-15 05:09:17'),(543,118,2,'2006-02-15 05:09:17'),(544,119,1,'2006-02-15 05:09:17'),(545,119,1,'2006-02-15 05:09:17'),(546,119,1,'2006-02-15 05:09:17'),(547,119,2,'2006-02-15 05:09:17'),(548,119,2,'2006-02-15 05:09:17'),(549,119,2,'2006-02-15 05:09:17'),(550,119,2,'2006-02-15 05:09:17'),(551,120,1,'2006-02-15 05:09:17'),(552,120,1,'2006-02-15 05:09:17'),(553,120,1,'2006-02-15 05:09:17'),(554,121,1,'2006-02-15 05:09:17'),(555,121,1,'2006-02-15 05:09:17'),(556,121,1,'2006-02-15 05:09:17'),(557,121,2,'2006-02-15 05:09:17'),(558,121,2,'2006-02-15 05:09:17'),(559,121,2,'2006-02-15 05:09:17'),(560,122,1,'2006-02-15 05:09:17'),(561,122,1,'2006-02-15 05:09:17'),(562,122,1,'2006-02-15 05:09:17'),(563,122,1,'2006-02-15 05:09:17'),(564,122,2,'2006-02-15 05:09:17'),(565,122,2,'2006-02-15 05:09:17'),(566,122,2,'2006-02-15 05:09:17'),(567,123,1,'2006-02-15 05:09:17'),(568,123,1,'2006-02-15 05:09:17'),(569,123,2,'2006-02-15 05:09:17'),(570,123,2,'2006-02-15 05:09:17'),(571,123,2,'2006-02-15 05:09:17'),(572,124,2,'2006-02-15 05:09:17'),(573,124,2,'2006-02-15 05:09:17'),(574,124,2,'2006-02-15 05:09:17'),(575,125,2,'2006-02-15 05:09:17'),(576,125,2,'2006-02-15 05:09:17'),(577,126,2,'2006-02-15 05:09:17'),(578,126,2,'2006-02-15 05:09:17'),(579,126,2,'2006-02-15 05:09:17'),(580,127,1,'2006-02-15 05:09:17'),(581,127,1,'2006-02-15 05:09:17'),(582,127,1,'2006-02-15 05:09:17'),(583,127,1,'2006-02-15 05:09:17'),(584,127,2,'2006-02-15 05:09:17'),(585,127,2,'2006-02-15 05:09:17'),(586,127,2,'2006-02-15 05:09:17'),(587,127,2,'2006-02-15 05:09:17'),(588,129,1,'2006-02-15 05:09:17'),(589,129,1,'2006-02-15 05:09:17'),(590,129,1,'2006-02-15 05:09:17'),(591,129,2,'2006-02-15 05:09:17'),(592,129,2,'2006-02-15 05:09:17'),(593,129,2,'2006-02-15 05:09:17'),(594,130,1,'2006-02-15 05:09:17'),(595,130,1,'2006-02-15 05:09:17'),(596,130,2,'2006-02-15 05:09:17'),(597,130,2,'2006-02-15 05:09:17'),(598,130,2,'2006-02-15 05:09:17'),(599,130,2,'2006-02-15 05:09:17'),(600,131,1,'2006-02-15 05:09:17'),(601,131,1,'2006-02-15 05:09:17'),(602,131,1,'2006-02-15 05:09:17'),(603,131,1,'2006-02-15 05:09:17'),(604,131,2,'2006-02-15 05:09:17'),(605,131,2,'2006-02-15 05:09:17'),(606,132,1,'2006-02-15 05:09:17'),(607,132,1,'2006-02-15 05:09:17'),(608,132,1,'2006-02-15 05:09:17'),(609,132,1,'2006-02-15 05:09:17'),(610,132,2,'2006-02-15 05:09:17'),(611,132,2,'2006-02-15 05:09:17'),(612,133,1,'2006-02-15 05:09:17'),(613,133,1,'2006-02-15 05:09:17'),(614,133,2,'2006-02-15 05:09:17'),(615,133,2,'2006-02-15 05:09:17'),(616,134,2,'2006-02-15 05:09:17'),(617,134,2,'2006-02-15 05:09:17'),(618,134,2,'2006-02-15 05:09:17'),(619,135,1,'2006-02-15 05:09:17'),(620,135,1,'2006-02-15 05:09:17'),(621,135,1,'2006-02-15 05:09:17'),(622,135,2,'2006-02-15 05:09:17'),(623,135,2,'2006-02-15 05:09:17'),(624,135,2,'2006-02-15 05:09:17'),(625,135,2,'2006-02-15 05:09:17'),(626,136,1,'2006-02-15 05:09:17'),(627,136,1,'2006-02-15 05:09:17'),(628,136,1,'2006-02-15 05:09:17'),(629,137,2,'2006-02-15 05:09:17'),(630,137,2,'2006-02-15 05:09:17'),(631,137,2,'2006-02-15 05:09:17'),(632,137,2,'2006-02-15 05:09:17'),(633,138,1,'2006-02-15 05:09:17'),(634,138,1,'2006-02-15 05:09:17'),(635,138,2,'2006-02-15 05:09:17'),(636,138,2,'2006-02-15 05:09:17'),(637,138,2,'2006-02-15 05:09:17'),(638,139,1,'2006-02-15 05:09:17'),(639,139,1,'2006-02-15 05:09:17'),(640,139,1,'2006-02-15 05:09:17'),(641,139,1,'2006-02-15 05:09:17'),(642,139,2,'2006-02-15 05:09:17'),(643,139,2,'2006-02-15 05:09:17'),(644,140,1,'2006-02-15 05:09:17'),(645,140,1,'2006-02-15 05:09:17'),(646,140,2,'2006-02-15 05:09:17'),(647,140,2,'2006-02-15 05:09:17'),(648,140,2,'2006-02-15 05:09:17'),(649,141,1,'2006-02-15 05:09:17'),(650,141,1,'2006-02-15 05:09:17'),(651,141,1,'2006-02-15 05:09:17'),(652,141,2,'2006-02-15 05:09:17'),(653,141,2,'2006-02-15 05:09:17'),(654,142,1,'2006-02-15 05:09:17'),(655,142,1,'2006-02-15 05:09:17'),(656,142,1,'2006-02-15 05:09:17'),(657,142,2,'2006-02-15 05:09:17'),(658,142,2,'2006-02-15 05:09:17'),(659,143,1,'2006-02-15 05:09:17'),(660,143,1,'2006-02-15 05:09:17'),(661,143,1,'2006-02-15 05:09:17'),(662,143,1,'2006-02-15 05:09:17'),(663,143,2,'2006-02-15 05:09:17'),(664,143,2,'2006-02-15 05:09:17'),(665,143,2,'2006-02-15 05:09:17'),(666,145,2,'2006-02-15 05:09:17'),(667,145,2,'2006-02-15 05:09:17'),(668,145,2,'2006-02-15 05:09:17'),(669,146,1,'2006-02-15 05:09:17'),(670,146,1,'2006-02-15 05:09:17'),(671,146,1,'2006-02-15 05:09:17'),(672,147,1,'2006-02-15 05:09:17'),(673,147,1,'2006-02-15 05:09:17'),(674,147,1,'2006-02-15 05:09:17'),(675,147,2,'2006-02-15 05:09:17'),(676,147,2,'2006-02-15 05:09:17'),(677,147,2,'2006-02-15 05:09:17'),(678,149,1,'2006-02-15 05:09:17'),(679,149,1,'2006-02-15 05:09:17'),(680,149,1,'2006-02-15 05:09:17'),(681,149,2,'2006-02-15 05:09:17'),(682,149,2,'2006-02-15 05:09:17'),(683,149,2,'2006-02-15 05:09:17'),(684,150,1,'2006-02-15 05:09:17'),(685,150,1,'2006-02-15 05:09:17'),(686,150,2,'2006-02-15 05:09:17'),(687,150,2,'2006-02-15 05:09:17'),(688,150,2,'2006-02-15 05:09:17'),(689,150,2,'2006-02-15 05:09:17'),(690,151,1,'2006-02-15 05:09:17'),(691,151,1,'2006-02-15 05:09:17'),(692,151,2,'2006-02-15 05:09:17'),(693,151,2,'2006-02-15 05:09:17'),(694,152,1,'2006-02-15 05:09:17'),(695,152,1,'2006-02-15 05:09:17'),(696,152,1,'2006-02-15 05:09:17'),(697,152,1,'2006-02-15 05:09:17'),(698,153,1,'2006-02-15 05:09:17'),(699,153,1,'2006-02-15 05:09:17'),(700,153,1,'2006-02-15 05:09:17'),(701,153,1,'2006-02-15 05:09:17'),(702,154,1,'2006-02-15 05:09:17'),(703,154,1,'2006-02-15 05:09:17'),(704,154,1,'2006-02-15 05:09:17'),(705,154,2,'2006-02-15 05:09:17'),(706,154,2,'2006-02-15 05:09:17'),(707,154,2,'2006-02-15 05:09:17'),(708,154,2,'2006-02-15 05:09:17'),(709,155,1,'2006-02-15 05:09:17'),(710,155,1,'2006-02-15 05:09:17'),(711,155,2,'2006-02-15 05:09:17'),(712,155,2,'2006-02-15 05:09:17'),(713,155,2,'2006-02-15 05:09:17'),(714,156,2,'2006-02-15 05:09:17'),(715,156,2,'2006-02-15 05:09:17'),(716,157,2,'2006-02-15 05:09:17'),(717,157,2,'2006-02-15 05:09:17'),(718,157,2,'2006-02-15 05:09:17'),(719,158,1,'2006-02-15 05:09:17'),(720,158,1,'2006-02-15 05:09:17'),(721,158,2,'2006-02-15 05:09:17'),(722,158,2,'2006-02-15 05:09:17'),(723,158,2,'2006-02-15 05:09:17'),(724,159,1,'2006-02-15 05:09:17'),(725,159,1,'2006-02-15 05:09:17'),(726,159,1,'2006-02-15 05:09:17'),(727,159,1,'2006-02-15 05:09:17'),(728,159,2,'2006-02-15 05:09:17'),(729,159,2,'2006-02-15 05:09:17'),(730,159,2,'2006-02-15 05:09:17'),(731,160,1,'2006-02-15 05:09:17'),(732,160,1,'2006-02-15 05:09:17'),(733,160,2,'2006-02-15 05:09:17'),(734,160,2,'2006-02-15 05:09:17'),(735,160,2,'2006-02-15 05:09:17'),(736,161,1,'2006-02-15 05:09:17'),(737,161,1,'2006-02-15 05:09:17'),(738,162,1,'2006-02-15 05:09:17'),(739,162,1,'2006-02-15 05:09:17'),(740,162,1,'2006-02-15 05:09:17'),(741,162,2,'2006-02-15 05:09:17'),(742,162,2,'2006-02-15 05:09:17'),(743,162,2,'2006-02-15 05:09:17'),(744,162,2,'2006-02-15 05:09:17'),(745,163,2,'2006-02-15 05:09:17'),(746,163,2,'2006-02-15 05:09:17'),(747,163,2,'2006-02-15 05:09:17'),(748,164,1,'2006-02-15 05:09:17'),(749,164,1,'2006-02-15 05:09:17'),(750,164,2,'2006-02-15 05:09:17'),(751,164,2,'2006-02-15 05:09:17'),(752,164,2,'2006-02-15 05:09:17'),(753,165,1,'2006-02-15 05:09:17'),(754,165,1,'2006-02-15 05:09:17'),(755,165,1,'2006-02-15 05:09:17'),(756,165,2,'2006-02-15 05:09:17'),(757,165,2,'2006-02-15 05:09:17'),(758,166,1,'2006-02-15 05:09:17'),(759,166,1,'2006-02-15 05:09:17'),(760,166,1,'2006-02-15 05:09:17'),(761,166,1,'2006-02-15 05:09:17'),(762,166,2,'2006-02-15 05:09:17'),(763,166,2,'2006-02-15 05:09:17'),(764,167,1,'2006-02-15 05:09:17'),(765,167,1,'2006-02-15 05:09:17'),(766,167,1,'2006-02-15 05:09:17'),(767,167,1,'2006-02-15 05:09:17'),(768,167,2,'2006-02-15 05:09:17'),(769,167,2,'2006-02-15 05:09:17'),(770,167,2,'2006-02-15 05:09:17'),(771,168,1,'2006-02-15 05:09:17'),(772,168,1,'2006-02-15 05:09:17'),(773,169,1,'2006-02-15 05:09:17'),(774,169,1,'2006-02-15 05:09:17'),(775,169,2,'2006-02-15 05:09:17'),(776,169,2,'2006-02-15 05:09:17'),(777,170,1,'2006-02-15 05:09:17'),(778,170,1,'2006-02-15 05:09:17'),(779,170,2,'2006-02-15 05:09:17'),(780,170,2,'2006-02-15 05:09:17'),(781,170,2,'2006-02-15 05:09:17'),(782,170,2,'2006-02-15 05:09:17'),(783,172,1,'2006-02-15 05:09:17'),(784,172,1,'2006-02-15 05:09:17'),(785,172,1,'2006-02-15 05:09:17'),(786,172,1,'2006-02-15 05:09:17'),(787,172,2,'2006-02-15 05:09:17'),(788,172,2,'2006-02-15 05:09:17'),(789,172,2,'2006-02-15 05:09:17'),(790,173,1,'2006-02-15 05:09:17'),(791,173,1,'2006-02-15 05:09:17'),(792,173,1,'2006-02-15 05:09:17'),(793,173,2,'2006-02-15 05:09:17'),(794,173,2,'2006-02-15 05:09:17'),(795,174,1,'2006-02-15 05:09:17'),(796,174,1,'2006-02-15 05:09:17'),(797,174,1,'2006-02-15 05:09:17'),(798,174,1,'2006-02-15 05:09:17'),(799,174,2,'2006-02-15 05:09:17'),(800,174,2,'2006-02-15 05:09:17'),(801,174,2,'2006-02-15 05:09:17'),(802,174,2,'2006-02-15 05:09:17'),(803,175,1,'2006-02-15 05:09:17'),(804,175,1,'2006-02-15 05:09:17'),(805,175,2,'2006-02-15 05:09:17'),(806,175,2,'2006-02-15 05:09:17'),(807,175,2,'2006-02-15 05:09:17'),(808,176,1,'2006-02-15 05:09:17'),(809,176,1,'2006-02-15 05:09:17'),(810,176,2,'2006-02-15 05:09:17'),(811,176,2,'2006-02-15 05:09:17'),(812,176,2,'2006-02-15 05:09:17'),(813,176,2,'2006-02-15 05:09:17'),(814,177,2,'2006-02-15 05:09:17'),(815,177,2,'2006-02-15 05:09:17'),(816,177,2,'2006-02-15 05:09:17'),(817,178,1,'2006-02-15 05:09:17'),(818,178,1,'2006-02-15 05:09:17'),(819,179,1,'2006-02-15 05:09:17'),(820,179,1,'2006-02-15 05:09:17'),(821,179,1,'2006-02-15 05:09:17'),(822,179,1,'2006-02-15 05:09:17'),(823,180,2,'2006-02-15 05:09:17'),(824,180,2,'2006-02-15 05:09:17'),(825,181,1,'2006-02-15 05:09:17'),(826,181,1,'2006-02-15 05:09:17'),(827,181,1,'2006-02-15 05:09:17'),(828,181,2,'2006-02-15 05:09:17'),(829,181,2,'2006-02-15 05:09:17'),(830,181,2,'2006-02-15 05:09:17'),(831,181,2,'2006-02-15 05:09:17'),(832,182,1,'2006-02-15 05:09:17'),(833,182,1,'2006-02-15 05:09:17'),(834,183,1,'2006-02-15 05:09:17'),(835,183,1,'2006-02-15 05:09:17'),(836,183,1,'2006-02-15 05:09:17'),(837,183,2,'2006-02-15 05:09:17'),(838,183,2,'2006-02-15 05:09:17'),(839,183,2,'2006-02-15 05:09:17'),(840,184,1,'2006-02-15 05:09:17'),(841,184,1,'2006-02-15 05:09:17'),(842,184,2,'2006-02-15 05:09:17'),(843,184,2,'2006-02-15 05:09:17'),(844,184,2,'2006-02-15 05:09:17'),(845,185,1,'2006-02-15 05:09:17'),(846,185,1,'2006-02-15 05:09:17'),(847,186,1,'2006-02-15 05:09:17'),(848,186,1,'2006-02-15 05:09:17'),(849,186,2,'2006-02-15 05:09:17'),(850,186,2,'2006-02-15 05:09:17'),(851,187,2,'2006-02-15 05:09:17'),(852,187,2,'2006-02-15 05:09:17'),(853,187,2,'2006-02-15 05:09:17'),(854,188,1,'2006-02-15 05:09:17'),(855,188,1,'2006-02-15 05:09:17'),(856,188,1,'2006-02-15 05:09:17'),(857,189,1,'2006-02-15 05:09:17'),(858,189,1,'2006-02-15 05:09:17'),(859,189,2,'2006-02-15 05:09:17'),(860,189,2,'2006-02-15 05:09:17'),(861,189,2,'2006-02-15 05:09:17'),(862,189,2,'2006-02-15 05:09:17'),(863,190,2,'2006-02-15 05:09:17'),(864,190,2,'2006-02-15 05:09:17'),(865,190,2,'2006-02-15 05:09:17'),(866,190,2,'2006-02-15 05:09:17'),(867,191,1,'2006-02-15 05:09:17'),(868,191,1,'2006-02-15 05:09:17'),(869,191,1,'2006-02-15 05:09:17'),(870,191,2,'2006-02-15 05:09:17'),(871,191,2,'2006-02-15 05:09:17'),(872,191,2,'2006-02-15 05:09:17'),(873,193,1,'2006-02-15 05:09:17'),(874,193,1,'2006-02-15 05:09:17'),(875,193,1,'2006-02-15 05:09:17'),(876,193,1,'2006-02-15 05:09:17'),(877,193,2,'2006-02-15 05:09:17'),(878,193,2,'2006-02-15 05:09:17'),(879,193,2,'2006-02-15 05:09:17'),(880,193,2,'2006-02-15 05:09:17'),(881,194,1,'2006-02-15 05:09:17'),(882,194,1,'2006-02-15 05:09:17'),(883,194,2,'2006-02-15 05:09:17'),(884,194,2,'2006-02-15 05:09:17'),(885,196,1,'2006-02-15 05:09:17'),(886,196,1,'2006-02-15 05:09:17'),(887,197,1,'2006-02-15 05:09:17'),(888,197,1,'2006-02-15 05:09:17'),(889,199,1,'2006-02-15 05:09:17'),(890,199,1,'2006-02-15 05:09:17'),(891,199,1,'2006-02-15 05:09:17'),(892,199,1,'2006-02-15 05:09:17'),(893,199,2,'2006-02-15 05:09:17'),(894,199,2,'2006-02-15 05:09:17'),(895,199,2,'2006-02-15 05:09:17'),(896,199,2,'2006-02-15 05:09:17'),(897,200,1,'2006-02-15 05:09:17'),(898,200,1,'2006-02-15 05:09:17'),(899,200,1,'2006-02-15 05:09:17'),(900,200,1,'2006-02-15 05:09:17'),(901,200,2,'2006-02-15 05:09:17'),(902,200,2,'2006-02-15 05:09:17'),(903,200,2,'2006-02-15 05:09:17'),(904,200,2,'2006-02-15 05:09:17'),(905,201,1,'2006-02-15 05:09:17'),(906,201,1,'2006-02-15 05:09:17'),(907,201,1,'2006-02-15 05:09:17'),(908,201,1,'2006-02-15 05:09:17'),(909,202,1,'2006-02-15 05:09:17'),(910,202,1,'2006-02-15 05:09:17'),(911,202,1,'2006-02-15 05:09:17'),(912,203,2,'2006-02-15 05:09:17'),(913,203,2,'2006-02-15 05:09:17'),(914,203,2,'2006-02-15 05:09:17'),(915,203,2,'2006-02-15 05:09:17'),(916,204,1,'2006-02-15 05:09:17'),(917,204,1,'2006-02-15 05:09:17'),(918,204,1,'2006-02-15 05:09:17'),(919,204,1,'2006-02-15 05:09:17'),(920,204,2,'2006-02-15 05:09:17'),(921,204,2,'2006-02-15 05:09:17'),(922,205,1,'2006-02-15 05:09:17'),(923,205,1,'2006-02-15 05:09:17'),(924,205,1,'2006-02-15 05:09:17'),(925,205,1,'2006-02-15 05:09:17'),(926,206,1,'2006-02-15 05:09:17'),(927,206,1,'2006-02-15 05:09:17'),(928,206,1,'2006-02-15 05:09:17'),(929,206,1,'2006-02-15 05:09:17'),(930,206,2,'2006-02-15 05:09:17'),(931,206,2,'2006-02-15 05:09:17'),(932,206,2,'2006-02-15 05:09:17'),(933,206,2,'2006-02-15 05:09:17'),(934,207,1,'2006-02-15 05:09:17'),(935,207,1,'2006-02-15 05:09:17'),(936,207,1,'2006-02-15 05:09:17'),(937,207,1,'2006-02-15 05:09:17'),(938,208,1,'2006-02-15 05:09:17'),(939,208,1,'2006-02-15 05:09:17'),(940,208,1,'2006-02-15 05:09:17'),(941,209,1,'2006-02-15 05:09:17'),(942,209,1,'2006-02-15 05:09:17'),(943,209,1,'2006-02-15 05:09:17'),(944,209,1,'2006-02-15 05:09:17'),(945,210,2,'2006-02-15 05:09:17'),(946,210,2,'2006-02-15 05:09:17'),(947,210,2,'2006-02-15 05:09:17'),(948,211,1,'2006-02-15 05:09:17'),(949,211,1,'2006-02-15 05:09:17'),(950,212,1,'2006-02-15 05:09:17'),(951,212,1,'2006-02-15 05:09:17'),(952,212,1,'2006-02-15 05:09:17'),(953,212,2,'2006-02-15 05:09:17'),(954,212,2,'2006-02-15 05:09:17'),(955,213,1,'2006-02-15 05:09:17'),(956,213,1,'2006-02-15 05:09:17'),(957,213,1,'2006-02-15 05:09:17'),(958,213,1,'2006-02-15 05:09:17'),(959,214,2,'2006-02-15 05:09:17'),(960,214,2,'2006-02-15 05:09:17'),(961,214,2,'2006-02-15 05:09:17'),(962,214,2,'2006-02-15 05:09:17'),(963,215,1,'2006-02-15 05:09:17'),(964,215,1,'2006-02-15 05:09:17'),(965,215,1,'2006-02-15 05:09:17'),(966,215,2,'2006-02-15 05:09:17'),(967,215,2,'2006-02-15 05:09:17'),(968,215,2,'2006-02-15 05:09:17'),(969,216,1,'2006-02-15 05:09:17'),(970,216,1,'2006-02-15 05:09:17'),(971,216,2,'2006-02-15 05:09:17'),(972,216,2,'2006-02-15 05:09:17'),(973,216,2,'2006-02-15 05:09:17'),(974,218,1,'2006-02-15 05:09:17'),(975,218,1,'2006-02-15 05:09:17'),(976,218,1,'2006-02-15 05:09:17'),(977,218,1,'2006-02-15 05:09:17'),(978,218,2,'2006-02-15 05:09:17'),(979,218,2,'2006-02-15 05:09:17'),(980,218,2,'2006-02-15 05:09:17'),(981,219,1,'2006-02-15 05:09:17'),(982,219,1,'2006-02-15 05:09:17'),(983,219,1,'2006-02-15 05:09:17'),(984,219,1,'2006-02-15 05:09:17'),(985,220,1,'2006-02-15 05:09:17'),(986,220,1,'2006-02-15 05:09:17'),(987,220,1,'2006-02-15 05:09:17'),(988,220,1,'2006-02-15 05:09:17'),(989,220,2,'2006-02-15 05:09:17'),(990,220,2,'2006-02-15 05:09:17'),(991,220,2,'2006-02-15 05:09:17'),(992,220,2,'2006-02-15 05:09:17'),(993,222,1,'2006-02-15 05:09:17'),(994,222,1,'2006-02-15 05:09:17'),(995,222,2,'2006-02-15 05:09:17'),(996,222,2,'2006-02-15 05:09:17'),(997,222,2,'2006-02-15 05:09:17'),(998,222,2,'2006-02-15 05:09:17'),(999,223,2,'2006-02-15 05:09:17'),(1000,223,2,'2006-02-15 05:09:17'),(1001,224,1,'2006-02-15 05:09:17'),(1002,224,1,'2006-02-15 05:09:17'),(1003,225,1,'2006-02-15 05:09:17'),(1004,225,1,'2006-02-15 05:09:17'),(1005,225,1,'2006-02-15 05:09:17'),(1006,226,1,'2006-02-15 05:09:17'),(1007,226,1,'2006-02-15 05:09:17'),(1008,226,2,'2006-02-15 05:09:17'),(1009,226,2,'2006-02-15 05:09:17'),(1010,226,2,'2006-02-15 05:09:17'),(1011,227,1,'2006-02-15 05:09:17'),(1012,227,1,'2006-02-15 05:09:17'),(1013,227,1,'2006-02-15 05:09:17'),(1014,227,2,'2006-02-15 05:09:17'),(1015,227,2,'2006-02-15 05:09:17'),(1016,228,1,'2006-02-15 05:09:17'),(1017,228,1,'2006-02-15 05:09:17'),(1018,228,1,'2006-02-15 05:09:17'),(1019,228,2,'2006-02-15 05:09:17'),(1020,228,2,'2006-02-15 05:09:17'),(1021,228,2,'2006-02-15 05:09:17'),(1022,228,2,'2006-02-15 05:09:17'),(1023,229,1,'2006-02-15 05:09:17'),(1024,229,1,'2006-02-15 05:09:17'),(1025,229,2,'2006-02-15 05:09:17'),(1026,229,2,'2006-02-15 05:09:17'),(1027,230,1,'2006-02-15 05:09:17'),(1028,230,1,'2006-02-15 05:09:17'),(1029,231,1,'2006-02-15 05:09:17'),(1030,231,1,'2006-02-15 05:09:17'),(1031,231,1,'2006-02-15 05:09:17'),(1032,231,1,'2006-02-15 05:09:17'),(1033,231,2,'2006-02-15 05:09:17'),(1034,231,2,'2006-02-15 05:09:17'),(1035,231,2,'2006-02-15 05:09:17'),(1036,231,2,'2006-02-15 05:09:17'),(1037,232,1,'2006-02-15 05:09:17'),(1038,232,1,'2006-02-15 05:09:17'),(1039,232,1,'2006-02-15 05:09:17'),(1040,232,2,'2006-02-15 05:09:17'),(1041,232,2,'2006-02-15 05:09:17'),(1042,233,1,'2006-02-15 05:09:17'),(1043,233,1,'2006-02-15 05:09:17'),(1044,233,1,'2006-02-15 05:09:17'),(1045,233,1,'2006-02-15 05:09:17'),(1046,233,2,'2006-02-15 05:09:17'),(1047,233,2,'2006-02-15 05:09:17'),(1048,234,1,'2006-02-15 05:09:17'),(1049,234,1,'2006-02-15 05:09:17'),(1050,234,1,'2006-02-15 05:09:17'),(1051,234,1,'2006-02-15 05:09:17'),(1052,234,2,'2006-02-15 05:09:17'),(1053,234,2,'2006-02-15 05:09:17'),(1054,234,2,'2006-02-15 05:09:17'),(1055,235,1,'2006-02-15 05:09:17'),(1056,235,1,'2006-02-15 05:09:17'),(1057,235,2,'2006-02-15 05:09:17'),(1058,235,2,'2006-02-15 05:09:17'),(1059,235,2,'2006-02-15 05:09:17'),(1060,235,2,'2006-02-15 05:09:17'),(1061,236,2,'2006-02-15 05:09:17'),(1062,236,2,'2006-02-15 05:09:17'),(1063,236,2,'2006-02-15 05:09:17'),(1064,236,2,'2006-02-15 05:09:17'),(1065,237,1,'2006-02-15 05:09:17'),(1066,237,1,'2006-02-15 05:09:17'),(1067,238,1,'2006-02-15 05:09:17'),(1068,238,1,'2006-02-15 05:09:17'),(1069,239,1,'2006-02-15 05:09:17'),(1070,239,1,'2006-02-15 05:09:17'),(1071,239,1,'2006-02-15 05:09:17'),(1072,239,1,'2006-02-15 05:09:17'),(1073,239,2,'2006-02-15 05:09:17'),(1074,239,2,'2006-02-15 05:09:17'),(1075,239,2,'2006-02-15 05:09:17'),(1076,239,2,'2006-02-15 05:09:17'),(1077,240,2,'2006-02-15 05:09:17'),(1078,240,2,'2006-02-15 05:09:17'),(1079,240,2,'2006-02-15 05:09:17'),(1080,241,1,'2006-02-15 05:09:17'),(1081,241,1,'2006-02-15 05:09:17'),(1082,241,1,'2006-02-15 05:09:17'),(1083,241,1,'2006-02-15 05:09:17'),(1084,242,1,'2006-02-15 05:09:17'),(1085,242,1,'2006-02-15 05:09:17'),(1086,242,2,'2006-02-15 05:09:17'),(1087,242,2,'2006-02-15 05:09:17'),(1088,242,2,'2006-02-15 05:09:17'),(1089,243,1,'2006-02-15 05:09:17'),(1090,243,1,'2006-02-15 05:09:17'),(1091,243,2,'2006-02-15 05:09:17'),(1092,243,2,'2006-02-15 05:09:17'),(1093,243,2,'2006-02-15 05:09:17'),(1094,243,2,'2006-02-15 05:09:17'),(1095,244,1,'2006-02-15 05:09:17'),(1096,244,1,'2006-02-15 05:09:17'),(1097,244,1,'2006-02-15 05:09:17'),(1098,244,1,'2006-02-15 05:09:17'),(1099,244,2,'2006-02-15 05:09:17'),(1100,244,2,'2006-02-15 05:09:17'),(1101,244,2,'2006-02-15 05:09:17'),(1102,245,1,'2006-02-15 05:09:17'),(1103,245,1,'2006-02-15 05:09:17'),(1104,245,1,'2006-02-15 05:09:17'),(1105,245,2,'2006-02-15 05:09:17'),(1106,245,2,'2006-02-15 05:09:17'),(1107,245,2,'2006-02-15 05:09:17'),(1108,245,2,'2006-02-15 05:09:17'),(1109,246,2,'2006-02-15 05:09:17'),(1110,246,2,'2006-02-15 05:09:17'),(1111,246,2,'2006-02-15 05:09:17'),(1112,247,1,'2006-02-15 05:09:17'),(1113,247,1,'2006-02-15 05:09:17'),(1114,247,1,'2006-02-15 05:09:17'),(1115,247,2,'2006-02-15 05:09:17'),(1116,247,2,'2006-02-15 05:09:17'),(1117,247,2,'2006-02-15 05:09:17'),(1118,247,2,'2006-02-15 05:09:17'),(1119,248,2,'2006-02-15 05:09:17'),(1120,248,2,'2006-02-15 05:09:17'),(1121,249,1,'2006-02-15 05:09:17'),(1122,249,1,'2006-02-15 05:09:17'),(1123,249,2,'2006-02-15 05:09:17'),(1124,249,2,'2006-02-15 05:09:17'),(1125,249,2,'2006-02-15 05:09:17'),(1126,249,2,'2006-02-15 05:09:17'),(1127,250,2,'2006-02-15 05:09:17'),(1128,250,2,'2006-02-15 05:09:17'),(1129,250,2,'2006-02-15 05:09:17'),(1130,250,2,'2006-02-15 05:09:17'),(1131,251,1,'2006-02-15 05:09:17'),(1132,251,1,'2006-02-15 05:09:17'),(1133,251,2,'2006-02-15 05:09:17'),(1134,251,2,'2006-02-15 05:09:17'),(1135,251,2,'2006-02-15 05:09:17'),(1136,252,1,'2006-02-15 05:09:17'),(1137,252,1,'2006-02-15 05:09:17'),(1138,252,1,'2006-02-15 05:09:17'),(1139,252,2,'2006-02-15 05:09:17'),(1140,252,2,'2006-02-15 05:09:17'),(1141,252,2,'2006-02-15 05:09:17'),(1142,253,1,'2006-02-15 05:09:17'),(1143,253,1,'2006-02-15 05:09:17'),(1144,253,1,'2006-02-15 05:09:17'),(1145,253,1,'2006-02-15 05:09:17'),(1146,253,2,'2006-02-15 05:09:17'),(1147,253,2,'2006-02-15 05:09:17'),(1148,254,1,'2006-02-15 05:09:17'),(1149,254,1,'2006-02-15 05:09:17'),(1150,254,2,'2006-02-15 05:09:17'),(1151,254,2,'2006-02-15 05:09:17'),(1152,254,2,'2006-02-15 05:09:17'),(1153,255,1,'2006-02-15 05:09:17'),(1154,255,1,'2006-02-15 05:09:17'),(1155,255,1,'2006-02-15 05:09:17'),(1156,255,1,'2006-02-15 05:09:17'),(1157,255,2,'2006-02-15 05:09:17'),(1158,255,2,'2006-02-15 05:09:17'),(1159,256,2,'2006-02-15 05:09:17'),(1160,256,2,'2006-02-15 05:09:17'),(1161,256,2,'2006-02-15 05:09:17'),(1162,257,2,'2006-02-15 05:09:17'),(1163,257,2,'2006-02-15 05:09:17'),(1164,257,2,'2006-02-15 05:09:17'),(1165,258,2,'2006-02-15 05:09:17'),(1166,258,2,'2006-02-15 05:09:17'),(1167,258,2,'2006-02-15 05:09:17'),(1168,258,2,'2006-02-15 05:09:17'),(1169,259,1,'2006-02-15 05:09:17'),(1170,259,1,'2006-02-15 05:09:17'),(1171,260,2,'2006-02-15 05:09:17'),(1172,260,2,'2006-02-15 05:09:17'),(1173,260,2,'2006-02-15 05:09:17'),(1174,260,2,'2006-02-15 05:09:17'),(1175,261,1,'2006-02-15 05:09:17'),(1176,261,1,'2006-02-15 05:09:17'),(1177,262,2,'2006-02-15 05:09:17'),(1178,262,2,'2006-02-15 05:09:17'),(1179,263,1,'2006-02-15 05:09:17'),(1180,263,1,'2006-02-15 05:09:17'),(1181,263,1,'2006-02-15 05:09:17'),(1182,263,1,'2006-02-15 05:09:17'),(1183,263,2,'2006-02-15 05:09:17'),(1184,263,2,'2006-02-15 05:09:17'),(1185,263,2,'2006-02-15 05:09:17'),(1186,264,2,'2006-02-15 05:09:17'),(1187,264,2,'2006-02-15 05:09:17'),(1188,265,1,'2006-02-15 05:09:17'),(1189,265,1,'2006-02-15 05:09:17'),(1190,265,1,'2006-02-15 05:09:17'),(1191,265,1,'2006-02-15 05:09:17'),(1192,266,1,'2006-02-15 05:09:17'),(1193,266,1,'2006-02-15 05:09:17'),(1194,266,1,'2006-02-15 05:09:17'),(1195,266,1,'2006-02-15 05:09:17'),(1196,266,2,'2006-02-15 05:09:17'),(1197,266,2,'2006-02-15 05:09:17'),(1198,266,2,'2006-02-15 05:09:17'),(1199,266,2,'2006-02-15 05:09:17'),(1200,267,1,'2006-02-15 05:09:17'),(1201,267,1,'2006-02-15 05:09:17'),(1202,267,1,'2006-02-15 05:09:17'),(1203,267,1,'2006-02-15 05:09:17'),(1204,267,2,'2006-02-15 05:09:17'),(1205,267,2,'2006-02-15 05:09:17'),(1206,268,2,'2006-02-15 05:09:17'),(1207,268,2,'2006-02-15 05:09:17'),(1208,269,1,'2006-02-15 05:09:17'),(1209,269,1,'2006-02-15 05:09:17'),(1210,269,2,'2006-02-15 05:09:17'),(1211,269,2,'2006-02-15 05:09:17'),(1212,269,2,'2006-02-15 05:09:17'),(1213,269,2,'2006-02-15 05:09:17'),(1214,270,1,'2006-02-15 05:09:17'),(1215,270,1,'2006-02-15 05:09:17'),(1216,270,1,'2006-02-15 05:09:17'),(1217,270,2,'2006-02-15 05:09:17'),(1218,270,2,'2006-02-15 05:09:17'),(1219,270,2,'2006-02-15 05:09:17'),(1220,270,2,'2006-02-15 05:09:17'),(1221,271,1,'2006-02-15 05:09:17'),(1222,271,1,'2006-02-15 05:09:17'),(1223,271,1,'2006-02-15 05:09:17'),(1224,271,2,'2006-02-15 05:09:17'),(1225,271,2,'2006-02-15 05:09:17'),(1226,272,1,'2006-02-15 05:09:17'),(1227,272,1,'2006-02-15 05:09:17'),(1228,272,1,'2006-02-15 05:09:17'),(1229,272,1,'2006-02-15 05:09:17'),(1230,273,1,'2006-02-15 05:09:17'),(1231,273,1,'2006-02-15 05:09:17'),(1232,273,1,'2006-02-15 05:09:17'),(1233,273,1,'2006-02-15 05:09:17'),(1234,273,2,'2006-02-15 05:09:17'),(1235,273,2,'2006-02-15 05:09:17'),(1236,273,2,'2006-02-15 05:09:17'),(1237,274,1,'2006-02-15 05:09:17'),(1238,274,1,'2006-02-15 05:09:17'),(1239,274,1,'2006-02-15 05:09:17'),(1240,274,2,'2006-02-15 05:09:17'),(1241,274,2,'2006-02-15 05:09:17'),(1242,274,2,'2006-02-15 05:09:17'),(1243,274,2,'2006-02-15 05:09:17'),(1244,275,1,'2006-02-15 05:09:17'),(1245,275,1,'2006-02-15 05:09:17'),(1246,275,1,'2006-02-15 05:09:17'),(1247,275,2,'2006-02-15 05:09:17'),(1248,275,2,'2006-02-15 05:09:17'),(1249,276,1,'2006-02-15 05:09:17'),(1250,276,1,'2006-02-15 05:09:17'),(1251,276,1,'2006-02-15 05:09:17'),(1252,276,1,'2006-02-15 05:09:17'),(1253,277,1,'2006-02-15 05:09:17'),(1254,277,1,'2006-02-15 05:09:17'),(1255,277,1,'2006-02-15 05:09:17'),(1256,278,1,'2006-02-15 05:09:17'),(1257,278,1,'2006-02-15 05:09:17'),(1258,279,1,'2006-02-15 05:09:17'),(1259,279,1,'2006-02-15 05:09:17'),(1260,280,1,'2006-02-15 05:09:17'),(1261,280,1,'2006-02-15 05:09:17'),(1262,280,1,'2006-02-15 05:09:17'),(1263,280,1,'2006-02-15 05:09:17'),(1264,280,2,'2006-02-15 05:09:17'),(1265,280,2,'2006-02-15 05:09:17'),(1266,281,1,'2006-02-15 05:09:17'),(1267,281,1,'2006-02-15 05:09:17'),(1268,281,2,'2006-02-15 05:09:17'),(1269,281,2,'2006-02-15 05:09:17'),(1270,281,2,'2006-02-15 05:09:17'),(1271,281,2,'2006-02-15 05:09:17'),(1272,282,1,'2006-02-15 05:09:17'),(1273,282,1,'2006-02-15 05:09:17'),(1274,282,1,'2006-02-15 05:09:17'),(1275,282,2,'2006-02-15 05:09:17'),(1276,282,2,'2006-02-15 05:09:17'),(1277,282,2,'2006-02-15 05:09:17'),(1278,283,1,'2006-02-15 05:09:17'),(1279,283,1,'2006-02-15 05:09:17'),(1280,283,1,'2006-02-15 05:09:17'),(1281,284,1,'2006-02-15 05:09:17'),(1282,284,1,'2006-02-15 05:09:17'),(1283,284,1,'2006-02-15 05:09:17'),(1284,284,2,'2006-02-15 05:09:17'),(1285,284,2,'2006-02-15 05:09:17'),(1286,284,2,'2006-02-15 05:09:17'),(1287,284,2,'2006-02-15 05:09:17'),(1288,285,1,'2006-02-15 05:09:17'),(1289,285,1,'2006-02-15 05:09:17'),(1290,285,1,'2006-02-15 05:09:17'),(1291,285,2,'2006-02-15 05:09:17'),(1292,285,2,'2006-02-15 05:09:17'),(1293,285,2,'2006-02-15 05:09:17'),(1294,285,2,'2006-02-15 05:09:17'),(1295,286,1,'2006-02-15 05:09:17'),(1296,286,1,'2006-02-15 05:09:17'),(1297,286,2,'2006-02-15 05:09:17'),(1298,286,2,'2006-02-15 05:09:17'),(1299,286,2,'2006-02-15 05:09:17'),(1300,287,1,'2006-02-15 05:09:17'),(1301,287,1,'2006-02-15 05:09:17'),(1302,287,2,'2006-02-15 05:09:17'),(1303,287,2,'2006-02-15 05:09:17'),(1304,288,1,'2006-02-15 05:09:17'),(1305,288,1,'2006-02-15 05:09:17'),(1306,288,2,'2006-02-15 05:09:17'),(1307,288,2,'2006-02-15 05:09:17'),(1308,288,2,'2006-02-15 05:09:17'),(1309,288,2,'2006-02-15 05:09:17'),(1310,289,1,'2006-02-15 05:09:17'),(1311,289,1,'2006-02-15 05:09:17'),(1312,290,1,'2006-02-15 05:09:17'),(1313,290,1,'2006-02-15 05:09:17'),(1314,290,1,'2006-02-15 05:09:17'),(1315,291,1,'2006-02-15 05:09:17'),(1316,291,1,'2006-02-15 05:09:17'),(1317,291,1,'2006-02-15 05:09:17'),(1318,291,1,'2006-02-15 05:09:17'),(1319,292,1,'2006-02-15 05:09:17'),(1320,292,1,'2006-02-15 05:09:17'),(1321,292,1,'2006-02-15 05:09:17'),(1322,292,2,'2006-02-15 05:09:17'),(1323,292,2,'2006-02-15 05:09:17'),(1324,292,2,'2006-02-15 05:09:17'),(1325,293,1,'2006-02-15 05:09:17'),(1326,293,1,'2006-02-15 05:09:17'),(1327,293,2,'2006-02-15 05:09:17'),(1328,293,2,'2006-02-15 05:09:17'),(1329,293,2,'2006-02-15 05:09:17'),(1330,294,1,'2006-02-15 05:09:17'),(1331,294,1,'2006-02-15 05:09:17'),(1332,294,2,'2006-02-15 05:09:17'),(1333,294,2,'2006-02-15 05:09:17'),(1334,294,2,'2006-02-15 05:09:17'),(1335,295,1,'2006-02-15 05:09:17'),(1336,295,1,'2006-02-15 05:09:17'),(1337,295,1,'2006-02-15 05:09:17'),(1338,295,1,'2006-02-15 05:09:17'),(1339,295,2,'2006-02-15 05:09:17'),(1340,295,2,'2006-02-15 05:09:17'),(1341,295,2,'2006-02-15 05:09:17'),(1342,295,2,'2006-02-15 05:09:17'),(1343,296,1,'2006-02-15 05:09:17'),(1344,296,1,'2006-02-15 05:09:17'),(1345,296,1,'2006-02-15 05:09:17'),(1346,296,1,'2006-02-15 05:09:17'),(1347,297,2,'2006-02-15 05:09:17'),(1348,297,2,'2006-02-15 05:09:17'),(1349,298,1,'2006-02-15 05:09:17'),(1350,298,1,'2006-02-15 05:09:17'),(1351,298,2,'2006-02-15 05:09:17'),(1352,298,2,'2006-02-15 05:09:17'),(1353,298,2,'2006-02-15 05:09:17'),(1354,299,1,'2006-02-15 05:09:17'),(1355,299,1,'2006-02-15 05:09:17'),(1356,299,1,'2006-02-15 05:09:17'),(1357,299,1,'2006-02-15 05:09:17'),(1358,300,1,'2006-02-15 05:09:17'),(1359,300,1,'2006-02-15 05:09:17'),(1360,300,2,'2006-02-15 05:09:17'),(1361,300,2,'2006-02-15 05:09:17'),(1362,300,2,'2006-02-15 05:09:17'),(1363,300,2,'2006-02-15 05:09:17'),(1364,301,1,'2006-02-15 05:09:17'),(1365,301,1,'2006-02-15 05:09:17'),(1366,301,1,'2006-02-15 05:09:17'),(1367,301,1,'2006-02-15 05:09:17'),(1368,301,2,'2006-02-15 05:09:17'),(1369,301,2,'2006-02-15 05:09:17'),(1370,301,2,'2006-02-15 05:09:17'),(1371,301,2,'2006-02-15 05:09:17'),(1372,302,1,'2006-02-15 05:09:17'),(1373,302,1,'2006-02-15 05:09:17'),(1374,302,2,'2006-02-15 05:09:17'),(1375,302,2,'2006-02-15 05:09:17'),(1376,302,2,'2006-02-15 05:09:17'),(1377,302,2,'2006-02-15 05:09:17'),(1378,303,1,'2006-02-15 05:09:17'),(1379,303,1,'2006-02-15 05:09:17'),(1380,303,1,'2006-02-15 05:09:17'),(1381,303,1,'2006-02-15 05:09:17'),(1382,303,2,'2006-02-15 05:09:17'),(1383,303,2,'2006-02-15 05:09:17'),(1384,304,1,'2006-02-15 05:09:17'),(1385,304,1,'2006-02-15 05:09:17'),(1386,304,1,'2006-02-15 05:09:17'),(1387,304,1,'2006-02-15 05:09:17'),(1388,304,2,'2006-02-15 05:09:17'),(1389,304,2,'2006-02-15 05:09:17'),(1390,305,1,'2006-02-15 05:09:17'),(1391,305,1,'2006-02-15 05:09:17'),(1392,305,1,'2006-02-15 05:09:17'),(1393,305,1,'2006-02-15 05:09:17'),(1394,305,2,'2006-02-15 05:09:17'),(1395,305,2,'2006-02-15 05:09:17'),(1396,305,2,'2006-02-15 05:09:17'),(1397,306,1,'2006-02-15 05:09:17'),(1398,306,1,'2006-02-15 05:09:17'),(1399,306,1,'2006-02-15 05:09:17'),(1400,307,1,'2006-02-15 05:09:17'),(1401,307,1,'2006-02-15 05:09:17'),(1402,307,1,'2006-02-15 05:09:17'),(1403,307,2,'2006-02-15 05:09:17'),(1404,307,2,'2006-02-15 05:09:17'),(1405,307,2,'2006-02-15 05:09:17'),(1406,308,1,'2006-02-15 05:09:17'),(1407,308,1,'2006-02-15 05:09:17'),(1408,308,2,'2006-02-15 05:09:17'),(1409,308,2,'2006-02-15 05:09:17'),(1410,309,1,'2006-02-15 05:09:17'),(1411,309,1,'2006-02-15 05:09:17'),(1412,309,2,'2006-02-15 05:09:17'),(1413,309,2,'2006-02-15 05:09:17'),(1414,309,2,'2006-02-15 05:09:17'),(1415,309,2,'2006-02-15 05:09:17'),(1416,310,1,'2006-02-15 05:09:17'),(1417,310,1,'2006-02-15 05:09:17'),(1418,311,1,'2006-02-15 05:09:17'),(1419,311,1,'2006-02-15 05:09:17'),(1420,311,1,'2006-02-15 05:09:17'),(1421,311,2,'2006-02-15 05:09:17'),(1422,311,2,'2006-02-15 05:09:17'),(1423,311,2,'2006-02-15 05:09:17'),(1424,311,2,'2006-02-15 05:09:17'),(1425,312,2,'2006-02-15 05:09:17'),(1426,312,2,'2006-02-15 05:09:17'),(1427,312,2,'2006-02-15 05:09:17'),(1428,313,1,'2006-02-15 05:09:17'),(1429,313,1,'2006-02-15 05:09:17'),(1430,313,1,'2006-02-15 05:09:17'),(1431,313,1,'2006-02-15 05:09:17'),(1432,313,2,'2006-02-15 05:09:17'),(1433,313,2,'2006-02-15 05:09:17'),(1434,314,1,'2006-02-15 05:09:17'),(1435,314,1,'2006-02-15 05:09:17'),(1436,314,2,'2006-02-15 05:09:17'),(1437,314,2,'2006-02-15 05:09:17'),(1438,314,2,'2006-02-15 05:09:17'),(1439,314,2,'2006-02-15 05:09:17'),(1440,315,2,'2006-02-15 05:09:17'),(1441,315,2,'2006-02-15 05:09:17'),(1442,315,2,'2006-02-15 05:09:17'),(1443,316,2,'2006-02-15 05:09:17'),(1444,316,2,'2006-02-15 05:09:17'),(1445,317,1,'2006-02-15 05:09:17'),(1446,317,1,'2006-02-15 05:09:17'),(1447,317,1,'2006-02-15 05:09:17'),(1448,317,1,'2006-02-15 05:09:17'),(1449,317,2,'2006-02-15 05:09:17'),(1450,317,2,'2006-02-15 05:09:17'),(1451,317,2,'2006-02-15 05:09:17'),(1452,319,1,'2006-02-15 05:09:17'),(1453,319,1,'2006-02-15 05:09:17'),(1454,319,1,'2006-02-15 05:09:17'),(1455,319,2,'2006-02-15 05:09:17'),(1456,319,2,'2006-02-15 05:09:17'),(1457,319,2,'2006-02-15 05:09:17'),(1458,319,2,'2006-02-15 05:09:17'),(1459,320,1,'2006-02-15 05:09:17'),(1460,320,1,'2006-02-15 05:09:17'),(1461,320,1,'2006-02-15 05:09:17'),(1462,320,2,'2006-02-15 05:09:17'),(1463,320,2,'2006-02-15 05:09:17'),(1464,320,2,'2006-02-15 05:09:17'),(1465,320,2,'2006-02-15 05:09:17'),(1466,321,1,'2006-02-15 05:09:17'),(1467,321,1,'2006-02-15 05:09:17'),(1468,321,1,'2006-02-15 05:09:17'),(1469,321,1,'2006-02-15 05:09:17'),(1470,322,1,'2006-02-15 05:09:17'),(1471,322,1,'2006-02-15 05:09:17'),(1472,322,1,'2006-02-15 05:09:17'),(1473,322,1,'2006-02-15 05:09:17'),(1474,322,2,'2006-02-15 05:09:17'),(1475,322,2,'2006-02-15 05:09:17'),(1476,323,2,'2006-02-15 05:09:17'),(1477,323,2,'2006-02-15 05:09:17'),(1478,323,2,'2006-02-15 05:09:17'),(1479,323,2,'2006-02-15 05:09:17'),(1480,324,1,'2006-02-15 05:09:17'),(1481,324,1,'2006-02-15 05:09:17'),(1482,324,1,'2006-02-15 05:09:17'),(1483,324,2,'2006-02-15 05:09:17'),(1484,324,2,'2006-02-15 05:09:17'),(1485,326,1,'2006-02-15 05:09:17'),(1486,326,1,'2006-02-15 05:09:17'),(1487,326,2,'2006-02-15 05:09:17'),(1488,326,2,'2006-02-15 05:09:17'),(1489,326,2,'2006-02-15 05:09:17'),(1490,326,2,'2006-02-15 05:09:17'),(1491,327,1,'2006-02-15 05:09:17'),(1492,327,1,'2006-02-15 05:09:17'),(1493,327,1,'2006-02-15 05:09:17'),(1494,327,1,'2006-02-15 05:09:17'),(1495,327,2,'2006-02-15 05:09:17'),(1496,327,2,'2006-02-15 05:09:17'),(1497,328,2,'2006-02-15 05:09:17'),(1498,328,2,'2006-02-15 05:09:17'),(1499,328,2,'2006-02-15 05:09:17'),(1500,328,2,'2006-02-15 05:09:17'),(1501,329,1,'2006-02-15 05:09:17'),(1502,329,1,'2006-02-15 05:09:17'),(1503,329,1,'2006-02-15 05:09:17'),(1504,329,2,'2006-02-15 05:09:17'),(1505,329,2,'2006-02-15 05:09:17'),(1506,329,2,'2006-02-15 05:09:17'),(1507,330,1,'2006-02-15 05:09:17'),(1508,330,1,'2006-02-15 05:09:17'),(1509,330,1,'2006-02-15 05:09:17'),(1510,330,1,'2006-02-15 05:09:17'),(1511,330,2,'2006-02-15 05:09:17'),(1512,330,2,'2006-02-15 05:09:17'),(1513,330,2,'2006-02-15 05:09:17'),(1514,331,1,'2006-02-15 05:09:17'),(1515,331,1,'2006-02-15 05:09:17'),(1516,331,1,'2006-02-15 05:09:17'),(1517,331,1,'2006-02-15 05:09:17'),(1518,331,2,'2006-02-15 05:09:17'),(1519,331,2,'2006-02-15 05:09:17'),(1520,331,2,'2006-02-15 05:09:17'),(1521,331,2,'2006-02-15 05:09:17'),(1522,333,1,'2006-02-15 05:09:17'),(1523,333,1,'2006-02-15 05:09:17'),(1524,333,2,'2006-02-15 05:09:17'),(1525,333,2,'2006-02-15 05:09:17'),(1526,334,1,'2006-02-15 05:09:17'),(1527,334,1,'2006-02-15 05:09:17'),(1528,334,2,'2006-02-15 05:09:17'),(1529,334,2,'2006-02-15 05:09:17'),(1530,334,2,'2006-02-15 05:09:17'),(1531,334,2,'2006-02-15 05:09:17'),(1532,335,1,'2006-02-15 05:09:17'),(1533,335,1,'2006-02-15 05:09:17'),(1534,336,1,'2006-02-15 05:09:17'),(1535,336,1,'2006-02-15 05:09:17'),(1536,336,1,'2006-02-15 05:09:17'),(1537,336,2,'2006-02-15 05:09:17'),(1538,336,2,'2006-02-15 05:09:17'),(1539,337,1,'2006-02-15 05:09:17'),(1540,337,1,'2006-02-15 05:09:17'),(1541,337,2,'2006-02-15 05:09:17'),(1542,337,2,'2006-02-15 05:09:17'),(1543,338,2,'2006-02-15 05:09:17'),(1544,338,2,'2006-02-15 05:09:17'),(1545,338,2,'2006-02-15 05:09:17'),(1546,339,2,'2006-02-15 05:09:17'),(1547,339,2,'2006-02-15 05:09:17'),(1548,339,2,'2006-02-15 05:09:17'),(1549,340,1,'2006-02-15 05:09:17'),(1550,340,1,'2006-02-15 05:09:17'),(1551,341,1,'2006-02-15 05:09:17'),(1552,341,1,'2006-02-15 05:09:17'),(1553,341,1,'2006-02-15 05:09:17'),(1554,341,1,'2006-02-15 05:09:17'),(1555,341,2,'2006-02-15 05:09:17'),(1556,341,2,'2006-02-15 05:09:17'),(1557,341,2,'2006-02-15 05:09:17'),(1558,341,2,'2006-02-15 05:09:17'),(1559,342,1,'2006-02-15 05:09:17'),(1560,342,1,'2006-02-15 05:09:17'),(1561,342,1,'2006-02-15 05:09:17'),(1562,342,1,'2006-02-15 05:09:17'),(1563,343,1,'2006-02-15 05:09:17'),(1564,343,1,'2006-02-15 05:09:17'),(1565,344,1,'2006-02-15 05:09:17'),(1566,344,1,'2006-02-15 05:09:17'),(1567,344,1,'2006-02-15 05:09:17'),(1568,344,2,'2006-02-15 05:09:17'),(1569,344,2,'2006-02-15 05:09:17'),(1570,345,1,'2006-02-15 05:09:17'),(1571,345,1,'2006-02-15 05:09:17'),(1572,345,1,'2006-02-15 05:09:17'),(1573,345,2,'2006-02-15 05:09:17'),(1574,345,2,'2006-02-15 05:09:17'),(1575,346,1,'2006-02-15 05:09:17'),(1576,346,1,'2006-02-15 05:09:17'),(1577,346,2,'2006-02-15 05:09:17'),(1578,346,2,'2006-02-15 05:09:17'),(1579,346,2,'2006-02-15 05:09:17'),(1580,346,2,'2006-02-15 05:09:17'),(1581,347,1,'2006-02-15 05:09:17'),(1582,347,1,'2006-02-15 05:09:17'),(1583,347,1,'2006-02-15 05:09:17'),(1584,347,1,'2006-02-15 05:09:17'),(1585,348,2,'2006-02-15 05:09:17'),(1586,348,2,'2006-02-15 05:09:17'),(1587,348,2,'2006-02-15 05:09:17'),(1588,348,2,'2006-02-15 05:09:17'),(1589,349,1,'2006-02-15 05:09:17'),(1590,349,1,'2006-02-15 05:09:17'),(1591,349,1,'2006-02-15 05:09:17'),(1592,349,1,'2006-02-15 05:09:17'),(1593,349,2,'2006-02-15 05:09:17'),(1594,349,2,'2006-02-15 05:09:17'),(1595,349,2,'2006-02-15 05:09:17'),(1596,350,1,'2006-02-15 05:09:17'),(1597,350,1,'2006-02-15 05:09:17'),(1598,350,1,'2006-02-15 05:09:17'),(1599,350,1,'2006-02-15 05:09:17'),(1600,350,2,'2006-02-15 05:09:17'),(1601,350,2,'2006-02-15 05:09:17'),(1602,350,2,'2006-02-15 05:09:17'),(1603,350,2,'2006-02-15 05:09:17'),(1604,351,1,'2006-02-15 05:09:17'),(1605,351,1,'2006-02-15 05:09:17'),(1606,351,1,'2006-02-15 05:09:17'),(1607,351,2,'2006-02-15 05:09:17'),(1608,351,2,'2006-02-15 05:09:17'),(1609,351,2,'2006-02-15 05:09:17'),(1610,352,2,'2006-02-15 05:09:17'),(1611,352,2,'2006-02-15 05:09:17'),(1612,352,2,'2006-02-15 05:09:17'),(1613,352,2,'2006-02-15 05:09:17'),(1614,353,1,'2006-02-15 05:09:17'),(1615,353,1,'2006-02-15 05:09:17'),(1616,353,2,'2006-02-15 05:09:17'),(1617,353,2,'2006-02-15 05:09:17'),(1618,353,2,'2006-02-15 05:09:17'),(1619,353,2,'2006-02-15 05:09:17'),(1620,354,1,'2006-02-15 05:09:17'),(1621,354,1,'2006-02-15 05:09:17'),(1622,354,1,'2006-02-15 05:09:17'),(1623,354,2,'2006-02-15 05:09:17'),(1624,354,2,'2006-02-15 05:09:17'),(1625,355,2,'2006-02-15 05:09:17'),(1626,355,2,'2006-02-15 05:09:17'),(1627,356,1,'2006-02-15 05:09:17'),(1628,356,1,'2006-02-15 05:09:17'),(1629,356,1,'2006-02-15 05:09:17'),(1630,356,1,'2006-02-15 05:09:17'),(1631,356,2,'2006-02-15 05:09:17'),(1632,356,2,'2006-02-15 05:09:17'),(1633,356,2,'2006-02-15 05:09:17'),(1634,356,2,'2006-02-15 05:09:17'),(1635,357,2,'2006-02-15 05:09:17'),(1636,357,2,'2006-02-15 05:09:17'),(1637,357,2,'2006-02-15 05:09:17'),(1638,357,2,'2006-02-15 05:09:17'),(1639,358,1,'2006-02-15 05:09:17'),(1640,358,1,'2006-02-15 05:09:17'),(1641,358,1,'2006-02-15 05:09:17'),(1642,358,1,'2006-02-15 05:09:17'),(1643,358,2,'2006-02-15 05:09:17'),(1644,358,2,'2006-02-15 05:09:17'),(1645,358,2,'2006-02-15 05:09:17'),(1646,358,2,'2006-02-15 05:09:17'),(1647,360,1,'2006-02-15 05:09:17'),(1648,360,1,'2006-02-15 05:09:17'),(1649,360,1,'2006-02-15 05:09:17'),(1650,360,1,'2006-02-15 05:09:17'),(1651,361,1,'2006-02-15 05:09:17'),(1652,361,1,'2006-02-15 05:09:17'),(1653,361,1,'2006-02-15 05:09:17'),(1654,361,1,'2006-02-15 05:09:17'),(1655,361,2,'2006-02-15 05:09:17'),(1656,361,2,'2006-02-15 05:09:17'),(1657,361,2,'2006-02-15 05:09:17'),(1658,361,2,'2006-02-15 05:09:17'),(1659,362,1,'2006-02-15 05:09:17'),(1660,362,1,'2006-02-15 05:09:17'),(1661,363,1,'2006-02-15 05:09:17'),(1662,363,1,'2006-02-15 05:09:17'),(1663,363,1,'2006-02-15 05:09:17'),(1664,363,2,'2006-02-15 05:09:17'),(1665,363,2,'2006-02-15 05:09:17'),(1666,363,2,'2006-02-15 05:09:17'),(1667,364,1,'2006-02-15 05:09:17'),(1668,364,1,'2006-02-15 05:09:17'),(1669,364,1,'2006-02-15 05:09:17'),(1670,365,1,'2006-02-15 05:09:17'),(1671,365,1,'2006-02-15 05:09:17'),(1672,365,2,'2006-02-15 05:09:17'),(1673,365,2,'2006-02-15 05:09:17'),(1674,366,1,'2006-02-15 05:09:17'),(1675,366,1,'2006-02-15 05:09:17'),(1676,366,1,'2006-02-15 05:09:17'),(1677,366,1,'2006-02-15 05:09:17'),(1678,366,2,'2006-02-15 05:09:17'),(1679,366,2,'2006-02-15 05:09:17'),(1680,366,2,'2006-02-15 05:09:17'),(1681,367,1,'2006-02-15 05:09:17'),(1682,367,1,'2006-02-15 05:09:17'),(1683,367,1,'2006-02-15 05:09:17'),(1684,367,1,'2006-02-15 05:09:17'),(1685,367,2,'2006-02-15 05:09:17'),(1686,367,2,'2006-02-15 05:09:17'),(1687,367,2,'2006-02-15 05:09:17'),(1688,368,1,'2006-02-15 05:09:17'),(1689,368,1,'2006-02-15 05:09:17'),(1690,369,1,'2006-02-15 05:09:17'),(1691,369,1,'2006-02-15 05:09:17'),(1692,369,1,'2006-02-15 05:09:17'),(1693,369,1,'2006-02-15 05:09:17'),(1694,369,2,'2006-02-15 05:09:17'),(1695,369,2,'2006-02-15 05:09:17'),(1696,369,2,'2006-02-15 05:09:17'),(1697,369,2,'2006-02-15 05:09:17'),(1698,370,1,'2006-02-15 05:09:17'),(1699,370,1,'2006-02-15 05:09:17'),(1700,370,1,'2006-02-15 05:09:17'),(1701,370,2,'2006-02-15 05:09:17'),(1702,370,2,'2006-02-15 05:09:17'),(1703,371,1,'2006-02-15 05:09:17'),(1704,371,1,'2006-02-15 05:09:17'),(1705,371,1,'2006-02-15 05:09:17'),(1706,372,1,'2006-02-15 05:09:17'),(1707,372,1,'2006-02-15 05:09:17'),(1708,373,1,'2006-02-15 05:09:17'),(1709,373,1,'2006-02-15 05:09:17'),(1710,373,1,'2006-02-15 05:09:17'),(1711,373,2,'2006-02-15 05:09:17'),(1712,373,2,'2006-02-15 05:09:17'),(1713,374,1,'2006-02-15 05:09:17'),(1714,374,1,'2006-02-15 05:09:17'),(1715,374,1,'2006-02-15 05:09:17'),(1716,374,2,'2006-02-15 05:09:17'),(1717,374,2,'2006-02-15 05:09:17'),(1718,374,2,'2006-02-15 05:09:17'),(1719,374,2,'2006-02-15 05:09:17'),(1720,375,1,'2006-02-15 05:09:17'),(1721,375,1,'2006-02-15 05:09:17'),(1722,376,1,'2006-02-15 05:09:17'),(1723,376,1,'2006-02-15 05:09:17'),(1724,376,1,'2006-02-15 05:09:17'),(1725,376,1,'2006-02-15 05:09:17'),(1726,376,2,'2006-02-15 05:09:17'),(1727,376,2,'2006-02-15 05:09:17'),(1728,376,2,'2006-02-15 05:09:17'),(1729,377,1,'2006-02-15 05:09:17'),(1730,377,1,'2006-02-15 05:09:17'),(1731,377,1,'2006-02-15 05:09:17'),(1732,377,2,'2006-02-15 05:09:17'),(1733,377,2,'2006-02-15 05:09:17'),(1734,377,2,'2006-02-15 05:09:17'),(1735,378,1,'2006-02-15 05:09:17'),(1736,378,1,'2006-02-15 05:09:17'),(1737,378,1,'2006-02-15 05:09:17'),(1738,378,1,'2006-02-15 05:09:17'),(1739,378,2,'2006-02-15 05:09:17'),(1740,378,2,'2006-02-15 05:09:17'),(1741,378,2,'2006-02-15 05:09:17'),(1742,378,2,'2006-02-15 05:09:17'),(1743,379,2,'2006-02-15 05:09:17'),(1744,379,2,'2006-02-15 05:09:17'),(1745,379,2,'2006-02-15 05:09:17'),(1746,379,2,'2006-02-15 05:09:17'),(1747,380,1,'2006-02-15 05:09:17'),(1748,380,1,'2006-02-15 05:09:17'),(1749,380,2,'2006-02-15 05:09:17'),(1750,380,2,'2006-02-15 05:09:17'),(1751,380,2,'2006-02-15 05:09:17'),(1752,381,1,'2006-02-15 05:09:17'),(1753,381,1,'2006-02-15 05:09:17'),(1754,381,2,'2006-02-15 05:09:17'),(1755,381,2,'2006-02-15 05:09:17'),(1756,381,2,'2006-02-15 05:09:17'),(1757,382,1,'2006-02-15 05:09:17'),(1758,382,1,'2006-02-15 05:09:17'),(1759,382,1,'2006-02-15 05:09:17'),(1760,382,1,'2006-02-15 05:09:17'),(1761,382,2,'2006-02-15 05:09:17'),(1762,382,2,'2006-02-15 05:09:17'),(1763,382,2,'2006-02-15 05:09:17'),(1764,382,2,'2006-02-15 05:09:17'),(1765,383,1,'2006-02-15 05:09:17'),(1766,383,1,'2006-02-15 05:09:17'),(1767,383,1,'2006-02-15 05:09:17'),(1768,383,2,'2006-02-15 05:09:17'),(1769,383,2,'2006-02-15 05:09:17'),(1770,384,2,'2006-02-15 05:09:17'),(1771,384,2,'2006-02-15 05:09:17'),(1772,384,2,'2006-02-15 05:09:17'),(1773,385,1,'2006-02-15 05:09:17'),(1774,385,1,'2006-02-15 05:09:17'),(1775,385,2,'2006-02-15 05:09:17'),(1776,385,2,'2006-02-15 05:09:17'),(1777,385,2,'2006-02-15 05:09:17'),(1778,387,1,'2006-02-15 05:09:17'),(1779,387,1,'2006-02-15 05:09:17'),(1780,387,1,'2006-02-15 05:09:17'),(1781,387,2,'2006-02-15 05:09:17'),(1782,387,2,'2006-02-15 05:09:17'),(1783,387,2,'2006-02-15 05:09:17'),(1784,388,1,'2006-02-15 05:09:17'),(1785,388,1,'2006-02-15 05:09:17'),(1786,388,1,'2006-02-15 05:09:17'),(1787,388,2,'2006-02-15 05:09:17'),(1788,388,2,'2006-02-15 05:09:17'),(1789,388,2,'2006-02-15 05:09:17'),(1790,389,1,'2006-02-15 05:09:17'),(1791,389,1,'2006-02-15 05:09:17'),(1792,389,2,'2006-02-15 05:09:17'),(1793,389,2,'2006-02-15 05:09:17'),(1794,390,1,'2006-02-15 05:09:17'),(1795,390,1,'2006-02-15 05:09:17'),(1796,390,1,'2006-02-15 05:09:17'),(1797,391,1,'2006-02-15 05:09:17'),(1798,391,1,'2006-02-15 05:09:17'),(1799,391,1,'2006-02-15 05:09:17'),(1800,391,1,'2006-02-15 05:09:17'),(1801,391,2,'2006-02-15 05:09:17'),(1802,391,2,'2006-02-15 05:09:17'),(1803,391,2,'2006-02-15 05:09:17'),(1804,392,1,'2006-02-15 05:09:17'),(1805,392,1,'2006-02-15 05:09:17'),(1806,392,1,'2006-02-15 05:09:17'),(1807,392,1,'2006-02-15 05:09:17'),(1808,392,2,'2006-02-15 05:09:17'),(1809,392,2,'2006-02-15 05:09:17'),(1810,393,1,'2006-02-15 05:09:17'),(1811,393,1,'2006-02-15 05:09:17'),(1812,394,1,'2006-02-15 05:09:17'),(1813,394,1,'2006-02-15 05:09:17'),(1814,394,1,'2006-02-15 05:09:17'),(1815,394,1,'2006-02-15 05:09:17'),(1816,395,1,'2006-02-15 05:09:17'),(1817,395,1,'2006-02-15 05:09:17'),(1818,395,1,'2006-02-15 05:09:17'),(1819,395,2,'2006-02-15 05:09:17'),(1820,395,2,'2006-02-15 05:09:17'),(1821,395,2,'2006-02-15 05:09:17'),(1822,396,2,'2006-02-15 05:09:17'),(1823,396,2,'2006-02-15 05:09:17'),(1824,396,2,'2006-02-15 05:09:17'),(1825,396,2,'2006-02-15 05:09:17'),(1826,397,1,'2006-02-15 05:09:17'),(1827,397,1,'2006-02-15 05:09:17'),(1828,397,1,'2006-02-15 05:09:17'),(1829,397,2,'2006-02-15 05:09:17'),(1830,397,2,'2006-02-15 05:09:17'),(1831,397,2,'2006-02-15 05:09:17'),(1832,397,2,'2006-02-15 05:09:17'),(1833,398,2,'2006-02-15 05:09:17'),(1834,398,2,'2006-02-15 05:09:17'),(1835,398,2,'2006-02-15 05:09:17'),(1836,398,2,'2006-02-15 05:09:17'),(1837,399,2,'2006-02-15 05:09:17'),(1838,399,2,'2006-02-15 05:09:17'),(1839,400,1,'2006-02-15 05:09:17'),(1840,400,1,'2006-02-15 05:09:17'),(1841,401,1,'2006-02-15 05:09:17'),(1842,401,1,'2006-02-15 05:09:17'),(1843,402,1,'2006-02-15 05:09:17'),(1844,402,1,'2006-02-15 05:09:17'),(1845,402,1,'2006-02-15 05:09:17'),(1846,402,2,'2006-02-15 05:09:17'),(1847,402,2,'2006-02-15 05:09:17'),(1848,402,2,'2006-02-15 05:09:17'),(1849,403,1,'2006-02-15 05:09:17'),(1850,403,1,'2006-02-15 05:09:17'),(1851,403,1,'2006-02-15 05:09:17'),(1852,403,1,'2006-02-15 05:09:17'),(1853,403,2,'2006-02-15 05:09:17'),(1854,403,2,'2006-02-15 05:09:17'),(1855,403,2,'2006-02-15 05:09:17'),(1856,403,2,'2006-02-15 05:09:17'),(1857,405,2,'2006-02-15 05:09:17'),(1858,405,2,'2006-02-15 05:09:17'),(1859,406,1,'2006-02-15 05:09:17'),(1860,406,1,'2006-02-15 05:09:17'),(1861,406,2,'2006-02-15 05:09:17'),(1862,406,2,'2006-02-15 05:09:17'),(1863,406,2,'2006-02-15 05:09:17'),(1864,406,2,'2006-02-15 05:09:17'),(1865,407,1,'2006-02-15 05:09:17'),(1866,407,1,'2006-02-15 05:09:17'),(1867,408,1,'2006-02-15 05:09:17'),(1868,408,1,'2006-02-15 05:09:17'),(1869,408,1,'2006-02-15 05:09:17'),(1870,408,1,'2006-02-15 05:09:17'),(1871,408,2,'2006-02-15 05:09:17'),(1872,408,2,'2006-02-15 05:09:17'),(1873,408,2,'2006-02-15 05:09:17'),(1874,409,1,'2006-02-15 05:09:17'),(1875,409,1,'2006-02-15 05:09:17'),(1876,409,1,'2006-02-15 05:09:17'),(1877,409,1,'2006-02-15 05:09:17'),(1878,409,2,'2006-02-15 05:09:17'),(1879,409,2,'2006-02-15 05:09:17'),(1880,409,2,'2006-02-15 05:09:17'),(1881,410,1,'2006-02-15 05:09:17'),(1882,410,1,'2006-02-15 05:09:17'),(1883,410,1,'2006-02-15 05:09:17'),(1884,410,2,'2006-02-15 05:09:17'),(1885,410,2,'2006-02-15 05:09:17'),(1886,411,1,'2006-02-15 05:09:17'),(1887,411,1,'2006-02-15 05:09:17'),(1888,412,1,'2006-02-15 05:09:17'),(1889,412,1,'2006-02-15 05:09:17'),(1890,412,1,'2006-02-15 05:09:17'),(1891,412,1,'2006-02-15 05:09:17'),(1892,412,2,'2006-02-15 05:09:17'),(1893,412,2,'2006-02-15 05:09:17'),(1894,412,2,'2006-02-15 05:09:17'),(1895,412,2,'2006-02-15 05:09:17'),(1896,413,1,'2006-02-15 05:09:17'),(1897,413,1,'2006-02-15 05:09:17'),(1898,413,1,'2006-02-15 05:09:17'),(1899,414,1,'2006-02-15 05:09:17'),(1900,414,1,'2006-02-15 05:09:17'),(1901,414,1,'2006-02-15 05:09:17'),(1902,414,2,'2006-02-15 05:09:17'),(1903,414,2,'2006-02-15 05:09:17'),(1904,414,2,'2006-02-15 05:09:17'),(1905,415,1,'2006-02-15 05:09:17'),(1906,415,1,'2006-02-15 05:09:17'),(1907,415,1,'2006-02-15 05:09:17'),(1908,415,2,'2006-02-15 05:09:17'),(1909,415,2,'2006-02-15 05:09:17'),(1910,415,2,'2006-02-15 05:09:17'),(1911,416,1,'2006-02-15 05:09:17'),(1912,416,1,'2006-02-15 05:09:17'),(1913,416,2,'2006-02-15 05:09:17'),(1914,416,2,'2006-02-15 05:09:17'),(1915,416,2,'2006-02-15 05:09:17'),(1916,416,2,'2006-02-15 05:09:17'),(1917,417,1,'2006-02-15 05:09:17'),(1918,417,1,'2006-02-15 05:09:17'),(1919,417,1,'2006-02-15 05:09:17'),(1920,417,1,'2006-02-15 05:09:17'),(1921,417,2,'2006-02-15 05:09:17'),(1922,417,2,'2006-02-15 05:09:17'),(1923,418,1,'2006-02-15 05:09:17'),(1924,418,1,'2006-02-15 05:09:17'),(1925,418,1,'2006-02-15 05:09:17'),(1926,418,1,'2006-02-15 05:09:17'),(1927,418,2,'2006-02-15 05:09:17'),(1928,418,2,'2006-02-15 05:09:17'),(1929,418,2,'2006-02-15 05:09:17'),(1930,418,2,'2006-02-15 05:09:17'),(1931,420,1,'2006-02-15 05:09:17'),(1932,420,1,'2006-02-15 05:09:17'),(1933,420,2,'2006-02-15 05:09:17'),(1934,420,2,'2006-02-15 05:09:17'),(1935,420,2,'2006-02-15 05:09:17'),(1936,421,2,'2006-02-15 05:09:17'),(1937,421,2,'2006-02-15 05:09:17'),(1938,421,2,'2006-02-15 05:09:17'),(1939,421,2,'2006-02-15 05:09:17'),(1940,422,2,'2006-02-15 05:09:17'),(1941,422,2,'2006-02-15 05:09:17'),(1942,423,1,'2006-02-15 05:09:17'),(1943,423,1,'2006-02-15 05:09:17'),(1944,423,2,'2006-02-15 05:09:17'),(1945,423,2,'2006-02-15 05:09:17'),(1946,424,1,'2006-02-15 05:09:17'),(1947,424,1,'2006-02-15 05:09:17'),(1948,424,1,'2006-02-15 05:09:17'),(1949,424,2,'2006-02-15 05:09:17'),(1950,424,2,'2006-02-15 05:09:17'),(1951,425,2,'2006-02-15 05:09:17'),(1952,425,2,'2006-02-15 05:09:17'),(1953,426,2,'2006-02-15 05:09:17'),(1954,426,2,'2006-02-15 05:09:17'),(1955,426,2,'2006-02-15 05:09:17'),(1956,427,1,'2006-02-15 05:09:17'),(1957,427,1,'2006-02-15 05:09:17'),(1958,427,1,'2006-02-15 05:09:17'),(1959,427,1,'2006-02-15 05:09:17'),(1960,428,1,'2006-02-15 05:09:17'),(1961,428,1,'2006-02-15 05:09:17'),(1962,428,1,'2006-02-15 05:09:17'),(1963,428,1,'2006-02-15 05:09:17'),(1964,428,2,'2006-02-15 05:09:17'),(1965,428,2,'2006-02-15 05:09:17'),(1966,429,1,'2006-02-15 05:09:17'),(1967,429,1,'2006-02-15 05:09:17'),(1968,429,2,'2006-02-15 05:09:17'),(1969,429,2,'2006-02-15 05:09:17'),(1970,429,2,'2006-02-15 05:09:17'),(1971,429,2,'2006-02-15 05:09:17'),(1972,430,2,'2006-02-15 05:09:17'),(1973,430,2,'2006-02-15 05:09:17'),(1974,430,2,'2006-02-15 05:09:17'),(1975,430,2,'2006-02-15 05:09:17'),(1976,431,2,'2006-02-15 05:09:17'),(1977,431,2,'2006-02-15 05:09:17'),(1978,431,2,'2006-02-15 05:09:17'),(1979,432,1,'2006-02-15 05:09:17'),(1980,432,1,'2006-02-15 05:09:17'),(1981,432,1,'2006-02-15 05:09:17'),(1982,432,2,'2006-02-15 05:09:17'),(1983,432,2,'2006-02-15 05:09:17'),(1984,433,1,'2006-02-15 05:09:17'),(1985,433,1,'2006-02-15 05:09:17'),(1986,433,1,'2006-02-15 05:09:17'),(1987,433,1,'2006-02-15 05:09:17'),(1988,433,2,'2006-02-15 05:09:17'),(1989,433,2,'2006-02-15 05:09:17'),(1990,434,1,'2006-02-15 05:09:17'),(1991,434,1,'2006-02-15 05:09:17'),(1992,434,1,'2006-02-15 05:09:17'),(1993,434,1,'2006-02-15 05:09:17'),(1994,434,2,'2006-02-15 05:09:17'),(1995,434,2,'2006-02-15 05:09:17'),(1996,434,2,'2006-02-15 05:09:17'),(1997,434,2,'2006-02-15 05:09:17'),(1998,435,1,'2006-02-15 05:09:17'),(1999,435,1,'2006-02-15 05:09:17'),(2000,436,1,'2006-02-15 05:09:17'),(2001,436,1,'2006-02-15 05:09:17'),(2002,436,1,'2006-02-15 05:09:17'),(2003,436,2,'2006-02-15 05:09:17'),(2004,436,2,'2006-02-15 05:09:17'),(2005,436,2,'2006-02-15 05:09:17'),(2006,437,1,'2006-02-15 05:09:17'),(2007,437,1,'2006-02-15 05:09:17'),(2008,437,2,'2006-02-15 05:09:17'),(2009,437,2,'2006-02-15 05:09:17'),(2010,437,2,'2006-02-15 05:09:17'),(2011,437,2,'2006-02-15 05:09:17'),(2012,438,1,'2006-02-15 05:09:17'),(2013,438,1,'2006-02-15 05:09:17'),(2014,438,2,'2006-02-15 05:09:17'),(2015,438,2,'2006-02-15 05:09:17'),(2016,438,2,'2006-02-15 05:09:17'),(2017,439,1,'2006-02-15 05:09:17'),(2018,439,1,'2006-02-15 05:09:17'),(2019,439,1,'2006-02-15 05:09:17'),(2020,439,1,'2006-02-15 05:09:17'),(2021,439,2,'2006-02-15 05:09:17'),(2022,439,2,'2006-02-15 05:09:17'),(2023,440,1,'2006-02-15 05:09:17'),(2024,440,1,'2006-02-15 05:09:17'),(2025,440,2,'2006-02-15 05:09:17'),(2026,440,2,'2006-02-15 05:09:17'),(2027,441,1,'2006-02-15 05:09:17'),(2028,441,1,'2006-02-15 05:09:17'),(2029,442,1,'2006-02-15 05:09:17'),(2030,442,1,'2006-02-15 05:09:17'),(2031,442,1,'2006-02-15 05:09:17'),(2032,443,1,'2006-02-15 05:09:17'),(2033,443,1,'2006-02-15 05:09:17'),(2034,443,1,'2006-02-15 05:09:17'),(2035,443,2,'2006-02-15 05:09:17'),(2036,443,2,'2006-02-15 05:09:17'),(2037,443,2,'2006-02-15 05:09:17'),(2038,443,2,'2006-02-15 05:09:17'),(2039,444,1,'2006-02-15 05:09:17'),(2040,444,1,'2006-02-15 05:09:17'),(2041,444,1,'2006-02-15 05:09:17'),(2042,444,1,'2006-02-15 05:09:17'),(2043,444,2,'2006-02-15 05:09:17'),(2044,444,2,'2006-02-15 05:09:17'),(2045,444,2,'2006-02-15 05:09:17'),(2046,444,2,'2006-02-15 05:09:17'),(2047,445,1,'2006-02-15 05:09:17'),(2048,445,1,'2006-02-15 05:09:17'),(2049,445,1,'2006-02-15 05:09:17'),(2050,445,2,'2006-02-15 05:09:17'),(2051,445,2,'2006-02-15 05:09:17'),(2052,445,2,'2006-02-15 05:09:17'),(2053,446,1,'2006-02-15 05:09:17'),(2054,446,1,'2006-02-15 05:09:17'),(2055,446,2,'2006-02-15 05:09:17'),(2056,446,2,'2006-02-15 05:09:17'),(2057,447,1,'2006-02-15 05:09:17'),(2058,447,1,'2006-02-15 05:09:17'),(2059,447,1,'2006-02-15 05:09:17'),(2060,447,1,'2006-02-15 05:09:17'),(2061,447,2,'2006-02-15 05:09:17'),(2062,447,2,'2006-02-15 05:09:17'),(2063,447,2,'2006-02-15 05:09:17'),(2064,448,1,'2006-02-15 05:09:17'),(2065,448,1,'2006-02-15 05:09:17'),(2066,448,2,'2006-02-15 05:09:17'),(2067,448,2,'2006-02-15 05:09:17'),(2068,448,2,'2006-02-15 05:09:17'),(2069,449,2,'2006-02-15 05:09:17'),(2070,449,2,'2006-02-15 05:09:17'),(2071,449,2,'2006-02-15 05:09:17'),(2072,449,2,'2006-02-15 05:09:17'),(2073,450,1,'2006-02-15 05:09:17'),(2074,450,1,'2006-02-15 05:09:17'),(2075,450,1,'2006-02-15 05:09:17'),(2076,450,2,'2006-02-15 05:09:17'),(2077,450,2,'2006-02-15 05:09:17'),(2078,450,2,'2006-02-15 05:09:17'),(2079,450,2,'2006-02-15 05:09:17'),(2080,451,1,'2006-02-15 05:09:17'),(2081,451,1,'2006-02-15 05:09:17'),(2082,451,2,'2006-02-15 05:09:17'),(2083,451,2,'2006-02-15 05:09:17'),(2084,451,2,'2006-02-15 05:09:17'),(2085,452,2,'2006-02-15 05:09:17'),(2086,452,2,'2006-02-15 05:09:17'),(2087,452,2,'2006-02-15 05:09:17'),(2088,452,2,'2006-02-15 05:09:17'),(2089,453,1,'2006-02-15 05:09:17'),(2090,453,1,'2006-02-15 05:09:17'),(2091,453,1,'2006-02-15 05:09:17'),(2092,453,2,'2006-02-15 05:09:17'),(2093,453,2,'2006-02-15 05:09:17'),(2094,454,1,'2006-02-15 05:09:17'),(2095,454,1,'2006-02-15 05:09:17'),(2096,455,1,'2006-02-15 05:09:17'),(2097,455,1,'2006-02-15 05:09:17'),(2098,455,1,'2006-02-15 05:09:17'),(2099,455,1,'2006-02-15 05:09:17'),(2100,456,1,'2006-02-15 05:09:17'),(2101,456,1,'2006-02-15 05:09:17'),(2102,456,2,'2006-02-15 05:09:17'),(2103,456,2,'2006-02-15 05:09:17'),(2104,456,2,'2006-02-15 05:09:17'),(2105,456,2,'2006-02-15 05:09:17'),(2106,457,1,'2006-02-15 05:09:17'),(2107,457,1,'2006-02-15 05:09:17'),(2108,457,2,'2006-02-15 05:09:17'),(2109,457,2,'2006-02-15 05:09:17'),(2110,457,2,'2006-02-15 05:09:17'),(2111,457,2,'2006-02-15 05:09:17'),(2112,458,1,'2006-02-15 05:09:17'),(2113,458,1,'2006-02-15 05:09:17'),(2114,458,2,'2006-02-15 05:09:17'),(2115,458,2,'2006-02-15 05:09:17'),(2116,458,2,'2006-02-15 05:09:17'),(2117,458,2,'2006-02-15 05:09:17'),(2118,459,2,'2006-02-15 05:09:17'),(2119,459,2,'2006-02-15 05:09:17'),(2120,460,1,'2006-02-15 05:09:17'),(2121,460,1,'2006-02-15 05:09:17'),(2122,460,1,'2006-02-15 05:09:17'),(2123,460,1,'2006-02-15 05:09:17'),(2124,460,2,'2006-02-15 05:09:17'),(2125,460,2,'2006-02-15 05:09:17'),(2126,460,2,'2006-02-15 05:09:17'),(2127,460,2,'2006-02-15 05:09:17'),(2128,461,1,'2006-02-15 05:09:17'),(2129,461,1,'2006-02-15 05:09:17'),(2130,461,2,'2006-02-15 05:09:17'),(2131,461,2,'2006-02-15 05:09:17'),(2132,461,2,'2006-02-15 05:09:17'),(2133,461,2,'2006-02-15 05:09:17'),(2134,462,1,'2006-02-15 05:09:17'),(2135,462,1,'2006-02-15 05:09:17'),(2136,462,2,'2006-02-15 05:09:17'),(2137,462,2,'2006-02-15 05:09:17'),(2138,462,2,'2006-02-15 05:09:17'),(2139,463,1,'2006-02-15 05:09:17'),(2140,463,1,'2006-02-15 05:09:17'),(2141,463,1,'2006-02-15 05:09:17'),(2142,463,2,'2006-02-15 05:09:17'),(2143,463,2,'2006-02-15 05:09:17'),(2144,464,1,'2006-02-15 05:09:17'),(2145,464,1,'2006-02-15 05:09:17'),(2146,464,1,'2006-02-15 05:09:17'),(2147,464,1,'2006-02-15 05:09:17'),(2148,464,2,'2006-02-15 05:09:17'),(2149,464,2,'2006-02-15 05:09:17'),(2150,464,2,'2006-02-15 05:09:17'),(2151,465,1,'2006-02-15 05:09:17'),(2152,465,1,'2006-02-15 05:09:17'),(2153,465,2,'2006-02-15 05:09:17'),(2154,465,2,'2006-02-15 05:09:17'),(2155,465,2,'2006-02-15 05:09:17'),(2156,466,1,'2006-02-15 05:09:17'),(2157,466,1,'2006-02-15 05:09:17'),(2158,467,1,'2006-02-15 05:09:17'),(2159,467,1,'2006-02-15 05:09:17'),(2160,467,1,'2006-02-15 05:09:17'),(2161,467,1,'2006-02-15 05:09:17'),(2162,467,2,'2006-02-15 05:09:17'),(2163,467,2,'2006-02-15 05:09:17'),(2164,467,2,'2006-02-15 05:09:17'),(2165,468,1,'2006-02-15 05:09:17'),(2166,468,1,'2006-02-15 05:09:17'),(2167,468,1,'2006-02-15 05:09:17'),(2168,468,1,'2006-02-15 05:09:17'),(2169,468,2,'2006-02-15 05:09:17'),(2170,468,2,'2006-02-15 05:09:17'),(2171,468,2,'2006-02-15 05:09:17'),(2172,468,2,'2006-02-15 05:09:17'),(2173,469,2,'2006-02-15 05:09:17'),(2174,469,2,'2006-02-15 05:09:17'),(2175,469,2,'2006-02-15 05:09:17'),(2176,470,1,'2006-02-15 05:09:17'),(2177,470,1,'2006-02-15 05:09:17'),(2178,471,1,'2006-02-15 05:09:17'),(2179,471,1,'2006-02-15 05:09:17'),(2180,471,1,'2006-02-15 05:09:17'),(2181,471,2,'2006-02-15 05:09:17'),(2182,471,2,'2006-02-15 05:09:17'),(2183,471,2,'2006-02-15 05:09:17'),(2184,471,2,'2006-02-15 05:09:17'),(2185,472,2,'2006-02-15 05:09:17'),(2186,472,2,'2006-02-15 05:09:17'),(2187,473,1,'2006-02-15 05:09:17'),(2188,473,1,'2006-02-15 05:09:17'),(2189,473,2,'2006-02-15 05:09:17'),(2190,473,2,'2006-02-15 05:09:17'),(2191,473,2,'2006-02-15 05:09:17'),(2192,474,2,'2006-02-15 05:09:17'),(2193,474,2,'2006-02-15 05:09:17'),(2194,474,2,'2006-02-15 05:09:17'),(2195,474,2,'2006-02-15 05:09:17'),(2196,475,2,'2006-02-15 05:09:17'),(2197,475,2,'2006-02-15 05:09:17'),(2198,476,1,'2006-02-15 05:09:17'),(2199,476,1,'2006-02-15 05:09:17'),(2200,476,1,'2006-02-15 05:09:17'),(2201,476,2,'2006-02-15 05:09:17'),(2202,476,2,'2006-02-15 05:09:17'),(2203,476,2,'2006-02-15 05:09:17'),(2204,476,2,'2006-02-15 05:09:17'),(2205,477,2,'2006-02-15 05:09:17'),(2206,477,2,'2006-02-15 05:09:17'),(2207,477,2,'2006-02-15 05:09:17'),(2208,478,1,'2006-02-15 05:09:17'),(2209,478,1,'2006-02-15 05:09:17'),(2210,478,2,'2006-02-15 05:09:17'),(2211,478,2,'2006-02-15 05:09:17'),(2212,478,2,'2006-02-15 05:09:17'),(2213,479,1,'2006-02-15 05:09:17'),(2214,479,1,'2006-02-15 05:09:17'),(2215,479,2,'2006-02-15 05:09:17'),(2216,479,2,'2006-02-15 05:09:17'),(2217,479,2,'2006-02-15 05:09:17'),(2218,480,1,'2006-02-15 05:09:17'),(2219,480,1,'2006-02-15 05:09:17'),(2220,480,2,'2006-02-15 05:09:17'),(2221,480,2,'2006-02-15 05:09:17'),(2222,481,1,'2006-02-15 05:09:17'),(2223,481,1,'2006-02-15 05:09:17'),(2224,481,1,'2006-02-15 05:09:17'),(2225,481,2,'2006-02-15 05:09:17'),(2226,481,2,'2006-02-15 05:09:17'),(2227,481,2,'2006-02-15 05:09:17'),(2228,482,1,'2006-02-15 05:09:17'),(2229,482,1,'2006-02-15 05:09:17'),(2230,482,1,'2006-02-15 05:09:17'),(2231,483,1,'2006-02-15 05:09:17'),(2232,483,1,'2006-02-15 05:09:17'),(2233,483,1,'2006-02-15 05:09:17'),(2234,483,2,'2006-02-15 05:09:17'),(2235,483,2,'2006-02-15 05:09:17'),(2236,484,1,'2006-02-15 05:09:17'),(2237,484,1,'2006-02-15 05:09:17'),(2238,484,1,'2006-02-15 05:09:17'),(2239,484,1,'2006-02-15 05:09:17'),(2240,484,2,'2006-02-15 05:09:17'),(2241,484,2,'2006-02-15 05:09:17'),(2242,484,2,'2006-02-15 05:09:17'),(2243,485,2,'2006-02-15 05:09:17'),(2244,485,2,'2006-02-15 05:09:17'),(2245,485,2,'2006-02-15 05:09:17'),(2246,486,1,'2006-02-15 05:09:17'),(2247,486,1,'2006-02-15 05:09:17'),(2248,486,1,'2006-02-15 05:09:17'),(2249,486,1,'2006-02-15 05:09:17'),(2250,486,2,'2006-02-15 05:09:17'),(2251,486,2,'2006-02-15 05:09:17'),(2252,487,2,'2006-02-15 05:09:17'),(2253,487,2,'2006-02-15 05:09:17'),(2254,487,2,'2006-02-15 05:09:17'),(2255,488,1,'2006-02-15 05:09:17'),(2256,488,1,'2006-02-15 05:09:17'),(2257,488,2,'2006-02-15 05:09:17'),(2258,488,2,'2006-02-15 05:09:17'),(2259,488,2,'2006-02-15 05:09:17'),(2260,489,1,'2006-02-15 05:09:17'),(2261,489,1,'2006-02-15 05:09:17'),(2262,489,1,'2006-02-15 05:09:17'),(2263,489,1,'2006-02-15 05:09:17'),(2264,489,2,'2006-02-15 05:09:17'),(2265,489,2,'2006-02-15 05:09:17'),(2266,489,2,'2006-02-15 05:09:17'),(2267,489,2,'2006-02-15 05:09:17'),(2268,490,1,'2006-02-15 05:09:17'),(2269,490,1,'2006-02-15 05:09:17'),(2270,491,1,'2006-02-15 05:09:17'),(2271,491,1,'2006-02-15 05:09:17'),(2272,491,2,'2006-02-15 05:09:17'),(2273,491,2,'2006-02-15 05:09:17'),(2274,491,2,'2006-02-15 05:09:17'),(2275,491,2,'2006-02-15 05:09:17'),(2276,492,1,'2006-02-15 05:09:17'),(2277,492,1,'2006-02-15 05:09:17'),(2278,493,2,'2006-02-15 05:09:17'),(2279,493,2,'2006-02-15 05:09:17'),(2280,493,2,'2006-02-15 05:09:17'),(2281,494,1,'2006-02-15 05:09:17'),(2282,494,1,'2006-02-15 05:09:17'),(2283,494,1,'2006-02-15 05:09:17'),(2284,494,1,'2006-02-15 05:09:17'),(2285,494,2,'2006-02-15 05:09:17'),(2286,494,2,'2006-02-15 05:09:17'),(2287,496,1,'2006-02-15 05:09:17'),(2288,496,1,'2006-02-15 05:09:17'),(2289,496,2,'2006-02-15 05:09:17'),(2290,496,2,'2006-02-15 05:09:17'),(2291,496,2,'2006-02-15 05:09:17'),(2292,498,1,'2006-02-15 05:09:17'),(2293,498,1,'2006-02-15 05:09:17'),(2294,499,1,'2006-02-15 05:09:17'),(2295,499,1,'2006-02-15 05:09:17'),(2296,500,1,'2006-02-15 05:09:17'),(2297,500,1,'2006-02-15 05:09:17'),(2298,500,1,'2006-02-15 05:09:17'),(2299,500,1,'2006-02-15 05:09:17'),(2300,500,2,'2006-02-15 05:09:17'),(2301,500,2,'2006-02-15 05:09:17'),(2302,500,2,'2006-02-15 05:09:17'),(2303,500,2,'2006-02-15 05:09:17'),(2304,501,1,'2006-02-15 05:09:17'),(2305,501,1,'2006-02-15 05:09:17'),(2306,501,1,'2006-02-15 05:09:17'),(2307,501,2,'2006-02-15 05:09:17'),(2308,501,2,'2006-02-15 05:09:17'),(2309,502,1,'2006-02-15 05:09:17'),(2310,502,1,'2006-02-15 05:09:17'),(2311,502,1,'2006-02-15 05:09:17'),(2312,502,1,'2006-02-15 05:09:17'),(2313,502,2,'2006-02-15 05:09:17'),(2314,502,2,'2006-02-15 05:09:17'),(2315,502,2,'2006-02-15 05:09:17'),(2316,503,1,'2006-02-15 05:09:17'),(2317,503,1,'2006-02-15 05:09:17'),(2318,503,1,'2006-02-15 05:09:17'),(2319,504,1,'2006-02-15 05:09:17'),(2320,504,1,'2006-02-15 05:09:17'),(2321,504,1,'2006-02-15 05:09:17'),(2322,504,1,'2006-02-15 05:09:17'),(2323,504,2,'2006-02-15 05:09:17'),(2324,504,2,'2006-02-15 05:09:17'),(2325,505,2,'2006-02-15 05:09:17'),(2326,505,2,'2006-02-15 05:09:17'),(2327,505,2,'2006-02-15 05:09:17'),(2328,505,2,'2006-02-15 05:09:17'),(2329,506,1,'2006-02-15 05:09:17'),(2330,506,1,'2006-02-15 05:09:17'),(2331,506,1,'2006-02-15 05:09:17'),(2332,506,1,'2006-02-15 05:09:17'),(2333,506,2,'2006-02-15 05:09:17'),(2334,506,2,'2006-02-15 05:09:17'),(2335,507,2,'2006-02-15 05:09:17'),(2336,507,2,'2006-02-15 05:09:17'),(2337,508,2,'2006-02-15 05:09:17'),(2338,508,2,'2006-02-15 05:09:17'),(2339,508,2,'2006-02-15 05:09:17'),(2340,509,2,'2006-02-15 05:09:17'),(2341,509,2,'2006-02-15 05:09:17'),(2342,509,2,'2006-02-15 05:09:17'),(2343,510,1,'2006-02-15 05:09:17'),(2344,510,1,'2006-02-15 05:09:17'),(2345,510,1,'2006-02-15 05:09:17'),(2346,510,1,'2006-02-15 05:09:17'),(2347,511,1,'2006-02-15 05:09:17'),(2348,511,1,'2006-02-15 05:09:17'),(2349,511,2,'2006-02-15 05:09:17'),(2350,511,2,'2006-02-15 05:09:17'),(2351,511,2,'2006-02-15 05:09:17'),(2352,512,1,'2006-02-15 05:09:17'),(2353,512,1,'2006-02-15 05:09:17'),(2354,512,2,'2006-02-15 05:09:17'),(2355,512,2,'2006-02-15 05:09:17'),(2356,512,2,'2006-02-15 05:09:17'),(2357,512,2,'2006-02-15 05:09:17'),(2358,513,2,'2006-02-15 05:09:17'),(2359,513,2,'2006-02-15 05:09:17'),(2360,514,1,'2006-02-15 05:09:17'),(2361,514,1,'2006-02-15 05:09:17'),(2362,514,2,'2006-02-15 05:09:17'),(2363,514,2,'2006-02-15 05:09:17'),(2364,514,2,'2006-02-15 05:09:17'),(2365,514,2,'2006-02-15 05:09:17'),(2366,515,2,'2006-02-15 05:09:17'),(2367,515,2,'2006-02-15 05:09:17'),(2368,516,2,'2006-02-15 05:09:17'),(2369,516,2,'2006-02-15 05:09:17'),(2370,516,2,'2006-02-15 05:09:17'),(2371,517,2,'2006-02-15 05:09:17'),(2372,517,2,'2006-02-15 05:09:17'),(2373,518,1,'2006-02-15 05:09:17'),(2374,518,1,'2006-02-15 05:09:17'),(2375,518,2,'2006-02-15 05:09:17'),(2376,518,2,'2006-02-15 05:09:17'),(2377,518,2,'2006-02-15 05:09:17'),(2378,518,2,'2006-02-15 05:09:17'),(2379,519,2,'2006-02-15 05:09:17'),(2380,519,2,'2006-02-15 05:09:17'),(2381,519,2,'2006-02-15 05:09:17'),(2382,519,2,'2006-02-15 05:09:17'),(2383,520,1,'2006-02-15 05:09:17'),(2384,520,1,'2006-02-15 05:09:17'),(2385,521,1,'2006-02-15 05:09:17'),(2386,521,1,'2006-02-15 05:09:17'),(2387,521,1,'2006-02-15 05:09:17'),(2388,521,1,'2006-02-15 05:09:17'),(2389,521,2,'2006-02-15 05:09:17'),(2390,521,2,'2006-02-15 05:09:17'),(2391,521,2,'2006-02-15 05:09:17'),(2392,522,2,'2006-02-15 05:09:17'),(2393,522,2,'2006-02-15 05:09:17'),(2394,523,1,'2006-02-15 05:09:17'),(2395,523,1,'2006-02-15 05:09:17'),(2396,524,1,'2006-02-15 05:09:17'),(2397,524,1,'2006-02-15 05:09:17'),(2398,524,2,'2006-02-15 05:09:17'),(2399,524,2,'2006-02-15 05:09:17'),(2400,524,2,'2006-02-15 05:09:17'),(2401,524,2,'2006-02-15 05:09:17'),(2402,525,1,'2006-02-15 05:09:17'),(2403,525,1,'2006-02-15 05:09:17'),(2404,525,1,'2006-02-15 05:09:17'),(2405,525,1,'2006-02-15 05:09:17'),(2406,525,2,'2006-02-15 05:09:17'),(2407,525,2,'2006-02-15 05:09:17'),(2408,525,2,'2006-02-15 05:09:17'),(2409,525,2,'2006-02-15 05:09:17'),(2410,526,2,'2006-02-15 05:09:17'),(2411,526,2,'2006-02-15 05:09:17'),(2412,526,2,'2006-02-15 05:09:17'),(2413,526,2,'2006-02-15 05:09:17'),(2414,527,1,'2006-02-15 05:09:17'),(2415,527,1,'2006-02-15 05:09:17'),(2416,527,2,'2006-02-15 05:09:17'),(2417,527,2,'2006-02-15 05:09:17'),(2418,527,2,'2006-02-15 05:09:17'),(2419,527,2,'2006-02-15 05:09:17'),(2420,528,1,'2006-02-15 05:09:17'),(2421,528,1,'2006-02-15 05:09:17'),(2422,528,1,'2006-02-15 05:09:17'),(2423,529,1,'2006-02-15 05:09:17'),(2424,529,1,'2006-02-15 05:09:17'),(2425,529,1,'2006-02-15 05:09:17'),(2426,529,1,'2006-02-15 05:09:17'),(2427,530,1,'2006-02-15 05:09:17'),(2428,530,1,'2006-02-15 05:09:17'),(2429,530,1,'2006-02-15 05:09:17'),(2430,531,1,'2006-02-15 05:09:17'),(2431,531,1,'2006-02-15 05:09:17'),(2432,531,1,'2006-02-15 05:09:17'),(2433,531,1,'2006-02-15 05:09:17'),(2434,531,2,'2006-02-15 05:09:17'),(2435,531,2,'2006-02-15 05:09:17'),(2436,531,2,'2006-02-15 05:09:17'),(2437,531,2,'2006-02-15 05:09:17'),(2438,532,2,'2006-02-15 05:09:17'),(2439,532,2,'2006-02-15 05:09:17'),(2440,532,2,'2006-02-15 05:09:17'),(2441,532,2,'2006-02-15 05:09:17'),(2442,533,1,'2006-02-15 05:09:17'),(2443,533,1,'2006-02-15 05:09:17'),(2444,533,1,'2006-02-15 05:09:17'),(2445,534,1,'2006-02-15 05:09:17'),(2446,534,1,'2006-02-15 05:09:17'),(2447,534,2,'2006-02-15 05:09:17'),(2448,534,2,'2006-02-15 05:09:17'),(2449,534,2,'2006-02-15 05:09:17'),(2450,535,1,'2006-02-15 05:09:17'),(2451,535,1,'2006-02-15 05:09:17'),(2452,535,1,'2006-02-15 05:09:17'),(2453,535,1,'2006-02-15 05:09:17'),(2454,536,1,'2006-02-15 05:09:17'),(2455,536,1,'2006-02-15 05:09:17'),(2456,536,1,'2006-02-15 05:09:17'),(2457,536,2,'2006-02-15 05:09:17'),(2458,536,2,'2006-02-15 05:09:17'),(2459,537,2,'2006-02-15 05:09:17'),(2460,537,2,'2006-02-15 05:09:17'),(2461,537,2,'2006-02-15 05:09:17'),(2462,538,2,'2006-02-15 05:09:17'),(2463,538,2,'2006-02-15 05:09:17'),(2464,538,2,'2006-02-15 05:09:17'),(2465,539,1,'2006-02-15 05:09:17'),(2466,539,1,'2006-02-15 05:09:17'),(2467,540,1,'2006-02-15 05:09:17'),(2468,540,1,'2006-02-15 05:09:17'),(2469,540,1,'2006-02-15 05:09:17'),(2470,541,2,'2006-02-15 05:09:17'),(2471,541,2,'2006-02-15 05:09:17'),(2472,542,1,'2006-02-15 05:09:17'),(2473,542,1,'2006-02-15 05:09:17'),(2474,542,1,'2006-02-15 05:09:17'),(2475,542,1,'2006-02-15 05:09:17'),(2476,542,2,'2006-02-15 05:09:17'),(2477,542,2,'2006-02-15 05:09:17'),(2478,543,1,'2006-02-15 05:09:17'),(2479,543,1,'2006-02-15 05:09:17'),(2480,544,1,'2006-02-15 05:09:17'),(2481,544,1,'2006-02-15 05:09:17'),(2482,544,2,'2006-02-15 05:09:17'),(2483,544,2,'2006-02-15 05:09:17'),(2484,545,1,'2006-02-15 05:09:17'),(2485,545,1,'2006-02-15 05:09:17'),(2486,545,1,'2006-02-15 05:09:17'),(2487,545,1,'2006-02-15 05:09:17'),(2488,545,2,'2006-02-15 05:09:17'),(2489,545,2,'2006-02-15 05:09:17'),(2490,546,2,'2006-02-15 05:09:17'),(2491,546,2,'2006-02-15 05:09:17'),(2492,546,2,'2006-02-15 05:09:17'),(2493,546,2,'2006-02-15 05:09:17'),(2494,547,2,'2006-02-15 05:09:17'),(2495,547,2,'2006-02-15 05:09:17'),(2496,548,1,'2006-02-15 05:09:17'),(2497,548,1,'2006-02-15 05:09:17'),(2498,549,1,'2006-02-15 05:09:17'),(2499,549,1,'2006-02-15 05:09:17'),(2500,549,2,'2006-02-15 05:09:17'),(2501,549,2,'2006-02-15 05:09:17'),(2502,550,1,'2006-02-15 05:09:17'),(2503,550,1,'2006-02-15 05:09:17'),(2504,550,1,'2006-02-15 05:09:17'),(2505,551,1,'2006-02-15 05:09:17'),(2506,551,1,'2006-02-15 05:09:17'),(2507,551,1,'2006-02-15 05:09:17'),(2508,551,2,'2006-02-15 05:09:17'),(2509,551,2,'2006-02-15 05:09:17'),(2510,551,2,'2006-02-15 05:09:17'),(2511,552,2,'2006-02-15 05:09:17'),(2512,552,2,'2006-02-15 05:09:17'),(2513,552,2,'2006-02-15 05:09:17'),(2514,552,2,'2006-02-15 05:09:17'),(2515,553,2,'2006-02-15 05:09:17'),(2516,553,2,'2006-02-15 05:09:17'),(2517,553,2,'2006-02-15 05:09:17'),(2518,554,1,'2006-02-15 05:09:17'),(2519,554,1,'2006-02-15 05:09:17'),(2520,554,1,'2006-02-15 05:09:17'),(2521,554,1,'2006-02-15 05:09:17'),(2522,554,2,'2006-02-15 05:09:17'),(2523,554,2,'2006-02-15 05:09:17'),(2524,554,2,'2006-02-15 05:09:17'),(2525,555,1,'2006-02-15 05:09:17'),(2526,555,1,'2006-02-15 05:09:17'),(2527,555,1,'2006-02-15 05:09:17'),(2528,555,2,'2006-02-15 05:09:17'),(2529,555,2,'2006-02-15 05:09:17'),(2530,555,2,'2006-02-15 05:09:17'),(2531,555,2,'2006-02-15 05:09:17'),(2532,556,1,'2006-02-15 05:09:17'),(2533,556,1,'2006-02-15 05:09:17'),(2534,556,1,'2006-02-15 05:09:17'),(2535,556,2,'2006-02-15 05:09:17'),(2536,556,2,'2006-02-15 05:09:17'),(2537,556,2,'2006-02-15 05:09:17'),(2538,556,2,'2006-02-15 05:09:17'),(2539,557,1,'2006-02-15 05:09:17'),(2540,557,1,'2006-02-15 05:09:17'),(2541,557,2,'2006-02-15 05:09:17'),(2542,557,2,'2006-02-15 05:09:17'),(2543,557,2,'2006-02-15 05:09:17'),(2544,558,2,'2006-02-15 05:09:17'),(2545,558,2,'2006-02-15 05:09:17'),(2546,559,1,'2006-02-15 05:09:17'),(2547,559,1,'2006-02-15 05:09:17'),(2548,559,1,'2006-02-15 05:09:17'),(2549,559,1,'2006-02-15 05:09:17'),(2550,559,2,'2006-02-15 05:09:17'),(2551,559,2,'2006-02-15 05:09:17'),(2552,559,2,'2006-02-15 05:09:17'),(2553,559,2,'2006-02-15 05:09:17'),(2554,560,1,'2006-02-15 05:09:17'),(2555,560,1,'2006-02-15 05:09:17'),(2556,560,1,'2006-02-15 05:09:17'),(2557,560,2,'2006-02-15 05:09:17'),(2558,560,2,'2006-02-15 05:09:17'),(2559,561,1,'2006-02-15 05:09:17'),(2560,561,1,'2006-02-15 05:09:17'),(2561,561,1,'2006-02-15 05:09:17'),(2562,561,1,'2006-02-15 05:09:17'),(2563,562,1,'2006-02-15 05:09:17'),(2564,562,1,'2006-02-15 05:09:17'),(2565,562,1,'2006-02-15 05:09:17'),(2566,562,1,'2006-02-15 05:09:17'),(2567,562,2,'2006-02-15 05:09:17'),(2568,562,2,'2006-02-15 05:09:17'),(2569,563,1,'2006-02-15 05:09:17'),(2570,563,1,'2006-02-15 05:09:17'),(2571,563,1,'2006-02-15 05:09:17'),(2572,563,1,'2006-02-15 05:09:17'),(2573,563,2,'2006-02-15 05:09:17'),(2574,563,2,'2006-02-15 05:09:17'),(2575,563,2,'2006-02-15 05:09:17'),(2576,564,2,'2006-02-15 05:09:17'),(2577,564,2,'2006-02-15 05:09:17'),(2578,564,2,'2006-02-15 05:09:17'),(2579,565,1,'2006-02-15 05:09:17'),(2580,565,1,'2006-02-15 05:09:17'),(2581,566,1,'2006-02-15 05:09:17'),(2582,566,1,'2006-02-15 05:09:17'),(2583,567,1,'2006-02-15 05:09:17'),(2584,567,1,'2006-02-15 05:09:17'),(2585,567,2,'2006-02-15 05:09:17'),(2586,567,2,'2006-02-15 05:09:17'),(2587,568,1,'2006-02-15 05:09:17'),(2588,568,1,'2006-02-15 05:09:17'),(2589,568,2,'2006-02-15 05:09:17'),(2590,568,2,'2006-02-15 05:09:17'),(2591,569,1,'2006-02-15 05:09:17'),(2592,569,1,'2006-02-15 05:09:17'),(2593,570,1,'2006-02-15 05:09:17'),(2594,570,1,'2006-02-15 05:09:17'),(2595,570,2,'2006-02-15 05:09:17'),(2596,570,2,'2006-02-15 05:09:17'),(2597,570,2,'2006-02-15 05:09:17'),(2598,571,1,'2006-02-15 05:09:17'),(2599,571,1,'2006-02-15 05:09:17'),(2600,571,2,'2006-02-15 05:09:17'),(2601,571,2,'2006-02-15 05:09:17'),(2602,571,2,'2006-02-15 05:09:17'),(2603,571,2,'2006-02-15 05:09:17'),(2604,572,1,'2006-02-15 05:09:17'),(2605,572,1,'2006-02-15 05:09:17'),(2606,572,1,'2006-02-15 05:09:17'),(2607,572,1,'2006-02-15 05:09:17'),(2608,572,2,'2006-02-15 05:09:17'),(2609,572,2,'2006-02-15 05:09:17'),(2610,572,2,'2006-02-15 05:09:17'),(2611,572,2,'2006-02-15 05:09:17'),(2612,573,1,'2006-02-15 05:09:17'),(2613,573,1,'2006-02-15 05:09:17'),(2614,573,1,'2006-02-15 05:09:17'),(2615,573,1,'2006-02-15 05:09:17'),(2616,574,1,'2006-02-15 05:09:17'),(2617,574,1,'2006-02-15 05:09:17'),(2618,574,2,'2006-02-15 05:09:17'),(2619,574,2,'2006-02-15 05:09:17'),(2620,574,2,'2006-02-15 05:09:17'),(2621,575,1,'2006-02-15 05:09:17'),(2622,575,1,'2006-02-15 05:09:17'),(2623,575,2,'2006-02-15 05:09:17'),(2624,575,2,'2006-02-15 05:09:17'),(2625,575,2,'2006-02-15 05:09:17'),(2626,575,2,'2006-02-15 05:09:17'),(2627,576,2,'2006-02-15 05:09:17'),(2628,576,2,'2006-02-15 05:09:17'),(2629,576,2,'2006-02-15 05:09:17'),(2630,577,1,'2006-02-15 05:09:17'),(2631,577,1,'2006-02-15 05:09:17'),(2632,577,1,'2006-02-15 05:09:17'),(2633,578,1,'2006-02-15 05:09:17'),(2634,578,1,'2006-02-15 05:09:17'),(2635,578,2,'2006-02-15 05:09:17'),(2636,578,2,'2006-02-15 05:09:17'),(2637,578,2,'2006-02-15 05:09:17'),(2638,579,1,'2006-02-15 05:09:17'),(2639,579,1,'2006-02-15 05:09:17'),(2640,579,1,'2006-02-15 05:09:17'),(2641,579,1,'2006-02-15 05:09:17'),(2642,579,2,'2006-02-15 05:09:17'),(2643,579,2,'2006-02-15 05:09:17'),(2644,579,2,'2006-02-15 05:09:17'),(2645,580,1,'2006-02-15 05:09:17'),(2646,580,1,'2006-02-15 05:09:17'),(2647,580,1,'2006-02-15 05:09:17'),(2648,580,1,'2006-02-15 05:09:17'),(2649,580,2,'2006-02-15 05:09:17'),(2650,580,2,'2006-02-15 05:09:17'),(2651,581,1,'2006-02-15 05:09:17'),(2652,581,1,'2006-02-15 05:09:17'),(2653,581,1,'2006-02-15 05:09:17'),(2654,582,2,'2006-02-15 05:09:17'),(2655,582,2,'2006-02-15 05:09:17'),(2656,583,1,'2006-02-15 05:09:17'),(2657,583,1,'2006-02-15 05:09:17'),(2658,583,1,'2006-02-15 05:09:17'),(2659,583,2,'2006-02-15 05:09:17'),(2660,583,2,'2006-02-15 05:09:17'),(2661,584,1,'2006-02-15 05:09:17'),(2662,584,1,'2006-02-15 05:09:17'),(2663,585,2,'2006-02-15 05:09:17'),(2664,585,2,'2006-02-15 05:09:17'),(2665,585,2,'2006-02-15 05:09:17'),(2666,585,2,'2006-02-15 05:09:17'),(2667,586,1,'2006-02-15 05:09:17'),(2668,586,1,'2006-02-15 05:09:17'),(2669,586,1,'2006-02-15 05:09:17'),(2670,586,1,'2006-02-15 05:09:17'),(2671,586,2,'2006-02-15 05:09:17'),(2672,586,2,'2006-02-15 05:09:17'),(2673,586,2,'2006-02-15 05:09:17'),(2674,586,2,'2006-02-15 05:09:17'),(2675,587,1,'2006-02-15 05:09:17'),(2676,587,1,'2006-02-15 05:09:17'),(2677,587,1,'2006-02-15 05:09:17'),(2678,588,2,'2006-02-15 05:09:17'),(2679,588,2,'2006-02-15 05:09:17'),(2680,588,2,'2006-02-15 05:09:17'),(2681,588,2,'2006-02-15 05:09:17'),(2682,589,2,'2006-02-15 05:09:17'),(2683,589,2,'2006-02-15 05:09:17'),(2684,589,2,'2006-02-15 05:09:17'),(2685,589,2,'2006-02-15 05:09:17'),(2686,590,1,'2006-02-15 05:09:17'),(2687,590,1,'2006-02-15 05:09:17'),(2688,590,1,'2006-02-15 05:09:17'),(2689,590,2,'2006-02-15 05:09:17'),(2690,590,2,'2006-02-15 05:09:17'),(2691,590,2,'2006-02-15 05:09:17'),(2692,590,2,'2006-02-15 05:09:17'),(2693,591,2,'2006-02-15 05:09:17'),(2694,591,2,'2006-02-15 05:09:17'),(2695,591,2,'2006-02-15 05:09:17'),(2696,592,1,'2006-02-15 05:09:17'),(2697,592,1,'2006-02-15 05:09:17'),(2698,592,2,'2006-02-15 05:09:17'),(2699,592,2,'2006-02-15 05:09:17'),(2700,593,2,'2006-02-15 05:09:17'),(2701,593,2,'2006-02-15 05:09:17'),(2702,593,2,'2006-02-15 05:09:17'),(2703,593,2,'2006-02-15 05:09:17'),(2704,594,1,'2006-02-15 05:09:17'),(2705,594,1,'2006-02-15 05:09:17'),(2706,594,1,'2006-02-15 05:09:17'),(2707,595,1,'2006-02-15 05:09:17'),(2708,595,1,'2006-02-15 05:09:17'),(2709,595,1,'2006-02-15 05:09:17'),(2710,595,1,'2006-02-15 05:09:17'),(2711,595,2,'2006-02-15 05:09:17'),(2712,595,2,'2006-02-15 05:09:17'),(2713,595,2,'2006-02-15 05:09:17'),(2714,595,2,'2006-02-15 05:09:17'),(2715,596,1,'2006-02-15 05:09:17'),(2716,596,1,'2006-02-15 05:09:17'),(2717,596,2,'2006-02-15 05:09:17'),(2718,596,2,'2006-02-15 05:09:17'),(2719,596,2,'2006-02-15 05:09:17'),(2720,596,2,'2006-02-15 05:09:17'),(2721,597,2,'2006-02-15 05:09:17'),(2722,597,2,'2006-02-15 05:09:17'),(2723,597,2,'2006-02-15 05:09:17'),(2724,597,2,'2006-02-15 05:09:17'),(2725,598,1,'2006-02-15 05:09:17'),(2726,598,1,'2006-02-15 05:09:17'),(2727,598,1,'2006-02-15 05:09:17'),(2728,598,1,'2006-02-15 05:09:17'),(2729,599,1,'2006-02-15 05:09:17'),(2730,599,1,'2006-02-15 05:09:17'),(2731,599,1,'2006-02-15 05:09:17'),(2732,599,2,'2006-02-15 05:09:17'),(2733,599,2,'2006-02-15 05:09:17'),(2734,600,1,'2006-02-15 05:09:17'),(2735,600,1,'2006-02-15 05:09:17'),(2736,600,2,'2006-02-15 05:09:17'),(2737,600,2,'2006-02-15 05:09:17'),(2738,601,1,'2006-02-15 05:09:17'),(2739,601,1,'2006-02-15 05:09:17'),(2740,601,1,'2006-02-15 05:09:17'),(2741,601,2,'2006-02-15 05:09:17'),(2742,601,2,'2006-02-15 05:09:17'),(2743,602,1,'2006-02-15 05:09:17'),(2744,602,1,'2006-02-15 05:09:17'),(2745,602,2,'2006-02-15 05:09:17'),(2746,602,2,'2006-02-15 05:09:17'),(2747,602,2,'2006-02-15 05:09:17'),(2748,603,1,'2006-02-15 05:09:17'),(2749,603,1,'2006-02-15 05:09:17'),(2750,603,1,'2006-02-15 05:09:17'),(2751,603,1,'2006-02-15 05:09:17'),(2752,603,2,'2006-02-15 05:09:17'),(2753,603,2,'2006-02-15 05:09:17'),(2754,604,2,'2006-02-15 05:09:17'),(2755,604,2,'2006-02-15 05:09:17'),(2756,604,2,'2006-02-15 05:09:17'),(2757,605,2,'2006-02-15 05:09:17'),(2758,605,2,'2006-02-15 05:09:17'),(2759,606,1,'2006-02-15 05:09:17'),(2760,606,1,'2006-02-15 05:09:17'),(2761,606,2,'2006-02-15 05:09:17'),(2762,606,2,'2006-02-15 05:09:17'),(2763,606,2,'2006-02-15 05:09:17'),(2764,606,2,'2006-02-15 05:09:17'),(2765,608,1,'2006-02-15 05:09:17'),(2766,608,1,'2006-02-15 05:09:17'),(2767,608,2,'2006-02-15 05:09:17'),(2768,608,2,'2006-02-15 05:09:17'),(2769,608,2,'2006-02-15 05:09:17'),(2770,608,2,'2006-02-15 05:09:17'),(2771,609,1,'2006-02-15 05:09:17'),(2772,609,1,'2006-02-15 05:09:17'),(2773,609,1,'2006-02-15 05:09:17'),(2774,609,1,'2006-02-15 05:09:17'),(2775,609,2,'2006-02-15 05:09:17'),(2776,609,2,'2006-02-15 05:09:17'),(2777,609,2,'2006-02-15 05:09:17'),(2778,609,2,'2006-02-15 05:09:17'),(2779,610,1,'2006-02-15 05:09:17'),(2780,610,1,'2006-02-15 05:09:17'),(2781,610,2,'2006-02-15 05:09:17'),(2782,610,2,'2006-02-15 05:09:17'),(2783,610,2,'2006-02-15 05:09:17'),(2784,611,1,'2006-02-15 05:09:17'),(2785,611,1,'2006-02-15 05:09:17'),(2786,611,1,'2006-02-15 05:09:17'),(2787,611,1,'2006-02-15 05:09:17'),(2788,611,2,'2006-02-15 05:09:17'),(2789,611,2,'2006-02-15 05:09:17'),(2790,612,2,'2006-02-15 05:09:17'),(2791,612,2,'2006-02-15 05:09:17'),(2792,613,1,'2006-02-15 05:09:17'),(2793,613,1,'2006-02-15 05:09:17'),(2794,614,1,'2006-02-15 05:09:17'),(2795,614,1,'2006-02-15 05:09:17'),(2796,614,1,'2006-02-15 05:09:17'),(2797,614,2,'2006-02-15 05:09:17'),(2798,614,2,'2006-02-15 05:09:17'),(2799,614,2,'2006-02-15 05:09:17'),(2800,615,2,'2006-02-15 05:09:17'),(2801,615,2,'2006-02-15 05:09:17'),(2802,615,2,'2006-02-15 05:09:17'),(2803,615,2,'2006-02-15 05:09:17'),(2804,616,1,'2006-02-15 05:09:17'),(2805,616,1,'2006-02-15 05:09:17'),(2806,616,2,'2006-02-15 05:09:17'),(2807,616,2,'2006-02-15 05:09:17'),(2808,616,2,'2006-02-15 05:09:17'),(2809,616,2,'2006-02-15 05:09:17'),(2810,617,1,'2006-02-15 05:09:17'),(2811,617,1,'2006-02-15 05:09:17'),(2812,617,1,'2006-02-15 05:09:17'),(2813,618,2,'2006-02-15 05:09:17'),(2814,618,2,'2006-02-15 05:09:17'),(2815,618,2,'2006-02-15 05:09:17'),(2816,618,2,'2006-02-15 05:09:17'),(2817,619,1,'2006-02-15 05:09:17'),(2818,619,1,'2006-02-15 05:09:17'),(2819,619,2,'2006-02-15 05:09:17'),(2820,619,2,'2006-02-15 05:09:17'),(2821,619,2,'2006-02-15 05:09:17'),(2822,619,2,'2006-02-15 05:09:17'),(2823,620,1,'2006-02-15 05:09:17'),(2824,620,1,'2006-02-15 05:09:17'),(2825,620,2,'2006-02-15 05:09:17'),(2826,620,2,'2006-02-15 05:09:17'),(2827,620,2,'2006-02-15 05:09:17'),(2828,621,1,'2006-02-15 05:09:17'),(2829,621,1,'2006-02-15 05:09:17'),(2830,621,1,'2006-02-15 05:09:17'),(2831,621,1,'2006-02-15 05:09:17'),(2832,621,2,'2006-02-15 05:09:17'),(2833,621,2,'2006-02-15 05:09:17'),(2834,621,2,'2006-02-15 05:09:17'),(2835,621,2,'2006-02-15 05:09:17'),(2836,622,2,'2006-02-15 05:09:17'),(2837,622,2,'2006-02-15 05:09:17'),(2838,623,1,'2006-02-15 05:09:17'),(2839,623,1,'2006-02-15 05:09:17'),(2840,623,2,'2006-02-15 05:09:17'),(2841,623,2,'2006-02-15 05:09:17'),(2842,623,2,'2006-02-15 05:09:17'),(2843,624,1,'2006-02-15 05:09:17'),(2844,624,1,'2006-02-15 05:09:17'),(2845,624,1,'2006-02-15 05:09:17'),(2846,624,2,'2006-02-15 05:09:17'),(2847,624,2,'2006-02-15 05:09:17'),(2848,624,2,'2006-02-15 05:09:17'),(2849,624,2,'2006-02-15 05:09:17'),(2850,625,1,'2006-02-15 05:09:17'),(2851,625,1,'2006-02-15 05:09:17'),(2852,625,1,'2006-02-15 05:09:17'),(2853,625,2,'2006-02-15 05:09:17'),(2854,625,2,'2006-02-15 05:09:17'),(2855,625,2,'2006-02-15 05:09:17'),(2856,625,2,'2006-02-15 05:09:17'),(2857,626,2,'2006-02-15 05:09:17'),(2858,626,2,'2006-02-15 05:09:17'),(2859,626,2,'2006-02-15 05:09:17'),(2860,626,2,'2006-02-15 05:09:17'),(2861,627,2,'2006-02-15 05:09:17'),(2862,627,2,'2006-02-15 05:09:17'),(2863,627,2,'2006-02-15 05:09:17'),(2864,628,1,'2006-02-15 05:09:17'),(2865,628,1,'2006-02-15 05:09:17'),(2866,628,1,'2006-02-15 05:09:17'),(2867,628,2,'2006-02-15 05:09:17'),(2868,628,2,'2006-02-15 05:09:17'),(2869,629,2,'2006-02-15 05:09:17'),(2870,629,2,'2006-02-15 05:09:17'),(2871,629,2,'2006-02-15 05:09:17'),(2872,629,2,'2006-02-15 05:09:17'),(2873,630,2,'2006-02-15 05:09:17'),(2874,630,2,'2006-02-15 05:09:17'),(2875,630,2,'2006-02-15 05:09:17'),(2876,631,1,'2006-02-15 05:09:17'),(2877,631,1,'2006-02-15 05:09:17'),(2878,631,1,'2006-02-15 05:09:17'),(2879,631,2,'2006-02-15 05:09:17'),(2880,631,2,'2006-02-15 05:09:17'),(2881,632,1,'2006-02-15 05:09:17'),(2882,632,1,'2006-02-15 05:09:17'),(2883,632,1,'2006-02-15 05:09:17'),(2884,633,2,'2006-02-15 05:09:17'),(2885,633,2,'2006-02-15 05:09:17'),(2886,633,2,'2006-02-15 05:09:17'),(2887,634,2,'2006-02-15 05:09:17'),(2888,634,2,'2006-02-15 05:09:17'),(2889,634,2,'2006-02-15 05:09:17'),(2890,634,2,'2006-02-15 05:09:17'),(2891,635,2,'2006-02-15 05:09:17'),(2892,635,2,'2006-02-15 05:09:17'),(2893,636,1,'2006-02-15 05:09:17'),(2894,636,1,'2006-02-15 05:09:17'),(2895,636,1,'2006-02-15 05:09:17'),(2896,637,1,'2006-02-15 05:09:17'),(2897,637,1,'2006-02-15 05:09:17'),(2898,637,2,'2006-02-15 05:09:17'),(2899,637,2,'2006-02-15 05:09:17'),(2900,637,2,'2006-02-15 05:09:17'),(2901,638,1,'2006-02-15 05:09:17'),(2902,638,1,'2006-02-15 05:09:17'),(2903,638,1,'2006-02-15 05:09:17'),(2904,638,1,'2006-02-15 05:09:17'),(2905,638,2,'2006-02-15 05:09:17'),(2906,638,2,'2006-02-15 05:09:17'),(2907,638,2,'2006-02-15 05:09:17'),(2908,638,2,'2006-02-15 05:09:17'),(2909,639,2,'2006-02-15 05:09:17'),(2910,639,2,'2006-02-15 05:09:17'),(2911,639,2,'2006-02-15 05:09:17'),(2912,640,2,'2006-02-15 05:09:17'),(2913,640,2,'2006-02-15 05:09:17'),(2914,640,2,'2006-02-15 05:09:17'),(2915,641,1,'2006-02-15 05:09:17'),(2916,641,1,'2006-02-15 05:09:17'),(2917,641,1,'2006-02-15 05:09:17'),(2918,641,2,'2006-02-15 05:09:17'),(2919,641,2,'2006-02-15 05:09:17'),(2920,641,2,'2006-02-15 05:09:17'),(2921,641,2,'2006-02-15 05:09:17'),(2922,643,1,'2006-02-15 05:09:17'),(2923,643,1,'2006-02-15 05:09:17'),(2924,643,1,'2006-02-15 05:09:17'),(2925,643,2,'2006-02-15 05:09:17'),(2926,643,2,'2006-02-15 05:09:17'),(2927,643,2,'2006-02-15 05:09:17'),(2928,644,1,'2006-02-15 05:09:17'),(2929,644,1,'2006-02-15 05:09:17'),(2930,644,1,'2006-02-15 05:09:17'),(2931,644,2,'2006-02-15 05:09:17'),(2932,644,2,'2006-02-15 05:09:17'),(2933,644,2,'2006-02-15 05:09:17'),(2934,644,2,'2006-02-15 05:09:17'),(2935,645,1,'2006-02-15 05:09:17'),(2936,645,1,'2006-02-15 05:09:17'),(2937,645,1,'2006-02-15 05:09:17'),(2938,645,2,'2006-02-15 05:09:17'),(2939,645,2,'2006-02-15 05:09:17'),(2940,645,2,'2006-02-15 05:09:17'),(2941,646,1,'2006-02-15 05:09:17'),(2942,646,1,'2006-02-15 05:09:17'),(2943,646,1,'2006-02-15 05:09:17'),(2944,646,2,'2006-02-15 05:09:17'),(2945,646,2,'2006-02-15 05:09:17'),(2946,647,1,'2006-02-15 05:09:17'),(2947,647,1,'2006-02-15 05:09:17'),(2948,647,1,'2006-02-15 05:09:17'),(2949,647,2,'2006-02-15 05:09:17'),(2950,647,2,'2006-02-15 05:09:17'),(2951,647,2,'2006-02-15 05:09:17'),(2952,648,1,'2006-02-15 05:09:17'),(2953,648,1,'2006-02-15 05:09:17'),(2954,648,1,'2006-02-15 05:09:17'),(2955,648,1,'2006-02-15 05:09:17'),(2956,648,2,'2006-02-15 05:09:17'),(2957,648,2,'2006-02-15 05:09:17'),(2958,649,1,'2006-02-15 05:09:17'),(2959,649,1,'2006-02-15 05:09:17'),(2960,649,2,'2006-02-15 05:09:17'),(2961,649,2,'2006-02-15 05:09:17'),(2962,649,2,'2006-02-15 05:09:17'),(2963,649,2,'2006-02-15 05:09:17'),(2964,650,1,'2006-02-15 05:09:17'),(2965,650,1,'2006-02-15 05:09:17'),(2966,650,2,'2006-02-15 05:09:17'),(2967,650,2,'2006-02-15 05:09:17'),(2968,650,2,'2006-02-15 05:09:17'),(2969,650,2,'2006-02-15 05:09:17'),(2970,651,1,'2006-02-15 05:09:17'),(2971,651,1,'2006-02-15 05:09:17'),(2972,651,2,'2006-02-15 05:09:17'),(2973,651,2,'2006-02-15 05:09:17'),(2974,651,2,'2006-02-15 05:09:17'),(2975,651,2,'2006-02-15 05:09:17'),(2976,652,1,'2006-02-15 05:09:17'),(2977,652,1,'2006-02-15 05:09:17'),(2978,652,1,'2006-02-15 05:09:17'),(2979,652,1,'2006-02-15 05:09:17'),(2980,653,1,'2006-02-15 05:09:17'),(2981,653,1,'2006-02-15 05:09:17'),(2982,654,1,'2006-02-15 05:09:17'),(2983,654,1,'2006-02-15 05:09:17'),(2984,654,2,'2006-02-15 05:09:17'),(2985,654,2,'2006-02-15 05:09:17'),(2986,655,1,'2006-02-15 05:09:17'),(2987,655,1,'2006-02-15 05:09:17'),(2988,655,1,'2006-02-15 05:09:17'),(2989,655,2,'2006-02-15 05:09:17'),(2990,655,2,'2006-02-15 05:09:17'),(2991,655,2,'2006-02-15 05:09:17'),(2992,656,2,'2006-02-15 05:09:17'),(2993,656,2,'2006-02-15 05:09:17'),(2994,657,1,'2006-02-15 05:09:17'),(2995,657,1,'2006-02-15 05:09:17'),(2996,657,1,'2006-02-15 05:09:17'),(2997,657,1,'2006-02-15 05:09:17'),(2998,657,2,'2006-02-15 05:09:17'),(2999,657,2,'2006-02-15 05:09:17'),(3000,658,2,'2006-02-15 05:09:17'),(3001,658,2,'2006-02-15 05:09:17'),(3002,658,2,'2006-02-15 05:09:17'),(3003,658,2,'2006-02-15 05:09:17'),(3004,659,2,'2006-02-15 05:09:17'),(3005,659,2,'2006-02-15 05:09:17'),(3006,660,1,'2006-02-15 05:09:17'),(3007,660,1,'2006-02-15 05:09:17'),(3008,660,2,'2006-02-15 05:09:17'),(3009,660,2,'2006-02-15 05:09:17'),(3010,661,1,'2006-02-15 05:09:17'),(3011,661,1,'2006-02-15 05:09:17'),(3012,661,1,'2006-02-15 05:09:17'),(3013,661,1,'2006-02-15 05:09:17'),(3014,662,1,'2006-02-15 05:09:17'),(3015,662,1,'2006-02-15 05:09:17'),(3016,662,2,'2006-02-15 05:09:17'),(3017,662,2,'2006-02-15 05:09:17'),(3018,663,1,'2006-02-15 05:09:17'),(3019,663,1,'2006-02-15 05:09:17'),(3020,663,1,'2006-02-15 05:09:17'),(3021,663,2,'2006-02-15 05:09:17'),(3022,663,2,'2006-02-15 05:09:17'),(3023,664,1,'2006-02-15 05:09:17'),(3024,664,1,'2006-02-15 05:09:17'),(3025,664,2,'2006-02-15 05:09:17'),(3026,664,2,'2006-02-15 05:09:17'),(3027,664,2,'2006-02-15 05:09:17'),(3028,665,1,'2006-02-15 05:09:17'),(3029,665,1,'2006-02-15 05:09:17'),(3030,665,1,'2006-02-15 05:09:17'),(3031,665,1,'2006-02-15 05:09:17'),(3032,665,2,'2006-02-15 05:09:17'),(3033,665,2,'2006-02-15 05:09:17'),(3034,665,2,'2006-02-15 05:09:17'),(3035,666,1,'2006-02-15 05:09:17'),(3036,666,1,'2006-02-15 05:09:17'),(3037,666,1,'2006-02-15 05:09:17'),(3038,666,2,'2006-02-15 05:09:17'),(3039,666,2,'2006-02-15 05:09:17'),(3040,667,1,'2006-02-15 05:09:17'),(3041,667,1,'2006-02-15 05:09:17'),(3042,667,2,'2006-02-15 05:09:17'),(3043,667,2,'2006-02-15 05:09:17'),(3044,668,1,'2006-02-15 05:09:17'),(3045,668,1,'2006-02-15 05:09:17'),(3046,668,2,'2006-02-15 05:09:17'),(3047,668,2,'2006-02-15 05:09:17'),(3048,668,2,'2006-02-15 05:09:17'),(3049,670,1,'2006-02-15 05:09:17'),(3050,670,1,'2006-02-15 05:09:17'),(3051,670,1,'2006-02-15 05:09:17'),(3052,670,1,'2006-02-15 05:09:17'),(3053,670,2,'2006-02-15 05:09:17'),(3054,670,2,'2006-02-15 05:09:17'),(3055,670,2,'2006-02-15 05:09:17'),(3056,672,1,'2006-02-15 05:09:17'),(3057,672,1,'2006-02-15 05:09:17'),(3058,672,2,'2006-02-15 05:09:17'),(3059,672,2,'2006-02-15 05:09:17'),(3060,672,2,'2006-02-15 05:09:17'),(3061,672,2,'2006-02-15 05:09:17'),(3062,673,1,'2006-02-15 05:09:17'),(3063,673,1,'2006-02-15 05:09:17'),(3064,673,2,'2006-02-15 05:09:17'),(3065,673,2,'2006-02-15 05:09:17'),(3066,674,1,'2006-02-15 05:09:17'),(3067,674,1,'2006-02-15 05:09:17'),(3068,674,1,'2006-02-15 05:09:17'),(3069,675,1,'2006-02-15 05:09:17'),(3070,675,1,'2006-02-15 05:09:17'),(3071,676,1,'2006-02-15 05:09:17'),(3072,676,1,'2006-02-15 05:09:17'),(3073,676,2,'2006-02-15 05:09:17'),(3074,676,2,'2006-02-15 05:09:17'),(3075,676,2,'2006-02-15 05:09:17'),(3076,676,2,'2006-02-15 05:09:17'),(3077,677,1,'2006-02-15 05:09:17'),(3078,677,1,'2006-02-15 05:09:17'),(3079,677,1,'2006-02-15 05:09:17'),(3080,677,2,'2006-02-15 05:09:17'),(3081,677,2,'2006-02-15 05:09:17'),(3082,677,2,'2006-02-15 05:09:17'),(3083,677,2,'2006-02-15 05:09:17'),(3084,678,1,'2006-02-15 05:09:17'),(3085,678,1,'2006-02-15 05:09:17'),(3086,678,1,'2006-02-15 05:09:17'),(3087,678,1,'2006-02-15 05:09:17'),(3088,679,1,'2006-02-15 05:09:17'),(3089,679,1,'2006-02-15 05:09:17'),(3090,679,2,'2006-02-15 05:09:17'),(3091,679,2,'2006-02-15 05:09:17'),(3092,680,1,'2006-02-15 05:09:17'),(3093,680,1,'2006-02-15 05:09:17'),(3094,680,2,'2006-02-15 05:09:17'),(3095,680,2,'2006-02-15 05:09:17'),(3096,680,2,'2006-02-15 05:09:17'),(3097,680,2,'2006-02-15 05:09:17'),(3098,681,1,'2006-02-15 05:09:17'),(3099,681,1,'2006-02-15 05:09:17'),(3100,681,1,'2006-02-15 05:09:17'),(3101,681,2,'2006-02-15 05:09:17'),(3102,681,2,'2006-02-15 05:09:17'),(3103,681,2,'2006-02-15 05:09:17'),(3104,682,1,'2006-02-15 05:09:17'),(3105,682,1,'2006-02-15 05:09:17'),(3106,682,1,'2006-02-15 05:09:17'),(3107,683,1,'2006-02-15 05:09:17'),(3108,683,1,'2006-02-15 05:09:17'),(3109,683,1,'2006-02-15 05:09:17'),(3110,683,1,'2006-02-15 05:09:17'),(3111,683,2,'2006-02-15 05:09:17'),(3112,683,2,'2006-02-15 05:09:17'),(3113,683,2,'2006-02-15 05:09:17'),(3114,683,2,'2006-02-15 05:09:17'),(3115,684,2,'2006-02-15 05:09:17'),(3116,684,2,'2006-02-15 05:09:17'),(3117,685,2,'2006-02-15 05:09:17'),(3118,685,2,'2006-02-15 05:09:17'),(3119,686,1,'2006-02-15 05:09:17'),(3120,686,1,'2006-02-15 05:09:17'),(3121,686,1,'2006-02-15 05:09:17'),(3122,686,1,'2006-02-15 05:09:17'),(3123,687,1,'2006-02-15 05:09:17'),(3124,687,1,'2006-02-15 05:09:17'),(3125,687,1,'2006-02-15 05:09:17'),(3126,687,2,'2006-02-15 05:09:17'),(3127,687,2,'2006-02-15 05:09:17'),(3128,687,2,'2006-02-15 05:09:17'),(3129,687,2,'2006-02-15 05:09:17'),(3130,688,2,'2006-02-15 05:09:17'),(3131,688,2,'2006-02-15 05:09:17'),(3132,688,2,'2006-02-15 05:09:17'),(3133,688,2,'2006-02-15 05:09:17'),(3134,689,1,'2006-02-15 05:09:17'),(3135,689,1,'2006-02-15 05:09:17'),(3136,689,1,'2006-02-15 05:09:17'),(3137,689,1,'2006-02-15 05:09:17'),(3138,689,2,'2006-02-15 05:09:17'),(3139,689,2,'2006-02-15 05:09:17'),(3140,690,1,'2006-02-15 05:09:17'),(3141,690,1,'2006-02-15 05:09:17'),(3142,690,1,'2006-02-15 05:09:17'),(3143,690,1,'2006-02-15 05:09:17'),(3144,690,2,'2006-02-15 05:09:17'),(3145,690,2,'2006-02-15 05:09:17'),(3146,691,1,'2006-02-15 05:09:17'),(3147,691,1,'2006-02-15 05:09:17'),(3148,691,1,'2006-02-15 05:09:17'),(3149,691,2,'2006-02-15 05:09:17'),(3150,691,2,'2006-02-15 05:09:17'),(3151,692,2,'2006-02-15 05:09:17'),(3152,692,2,'2006-02-15 05:09:17'),(3153,692,2,'2006-02-15 05:09:17'),(3154,693,1,'2006-02-15 05:09:17'),(3155,693,1,'2006-02-15 05:09:17'),(3156,693,2,'2006-02-15 05:09:17'),(3157,693,2,'2006-02-15 05:09:17'),(3158,693,2,'2006-02-15 05:09:17'),(3159,694,1,'2006-02-15 05:09:17'),(3160,694,1,'2006-02-15 05:09:17'),(3161,694,1,'2006-02-15 05:09:17'),(3162,694,1,'2006-02-15 05:09:17'),(3163,694,2,'2006-02-15 05:09:17'),(3164,694,2,'2006-02-15 05:09:17'),(3165,695,1,'2006-02-15 05:09:17'),(3166,695,1,'2006-02-15 05:09:17'),(3167,696,1,'2006-02-15 05:09:17'),(3168,696,1,'2006-02-15 05:09:17'),(3169,696,2,'2006-02-15 05:09:17'),(3170,696,2,'2006-02-15 05:09:17'),(3171,696,2,'2006-02-15 05:09:17'),(3172,697,1,'2006-02-15 05:09:17'),(3173,697,1,'2006-02-15 05:09:17'),(3174,697,1,'2006-02-15 05:09:17'),(3175,697,1,'2006-02-15 05:09:17'),(3176,697,2,'2006-02-15 05:09:17'),(3177,697,2,'2006-02-15 05:09:17'),(3178,697,2,'2006-02-15 05:09:17'),(3179,697,2,'2006-02-15 05:09:17'),(3180,698,1,'2006-02-15 05:09:17'),(3181,698,1,'2006-02-15 05:09:17'),(3182,698,1,'2006-02-15 05:09:17'),(3183,698,1,'2006-02-15 05:09:17'),(3184,698,2,'2006-02-15 05:09:17'),(3185,698,2,'2006-02-15 05:09:17'),(3186,698,2,'2006-02-15 05:09:17'),(3187,699,1,'2006-02-15 05:09:17'),(3188,699,1,'2006-02-15 05:09:17'),(3189,700,2,'2006-02-15 05:09:17'),(3190,700,2,'2006-02-15 05:09:17'),(3191,700,2,'2006-02-15 05:09:17'),(3192,702,1,'2006-02-15 05:09:17'),(3193,702,1,'2006-02-15 05:09:17'),(3194,702,1,'2006-02-15 05:09:17'),(3195,702,1,'2006-02-15 05:09:17'),(3196,702,2,'2006-02-15 05:09:17'),(3197,702,2,'2006-02-15 05:09:17'),(3198,702,2,'2006-02-15 05:09:17'),(3199,702,2,'2006-02-15 05:09:17'),(3200,703,2,'2006-02-15 05:09:17'),(3201,703,2,'2006-02-15 05:09:17'),(3202,704,1,'2006-02-15 05:09:17'),(3203,704,1,'2006-02-15 05:09:17'),(3204,704,2,'2006-02-15 05:09:17'),(3205,704,2,'2006-02-15 05:09:17'),(3206,704,2,'2006-02-15 05:09:17'),(3207,705,1,'2006-02-15 05:09:17'),(3208,705,1,'2006-02-15 05:09:17'),(3209,705,1,'2006-02-15 05:09:17'),(3210,705,1,'2006-02-15 05:09:17'),(3211,706,1,'2006-02-15 05:09:17'),(3212,706,1,'2006-02-15 05:09:17'),(3213,706,2,'2006-02-15 05:09:17'),(3214,706,2,'2006-02-15 05:09:17'),(3215,706,2,'2006-02-15 05:09:17'),(3216,706,2,'2006-02-15 05:09:17'),(3217,707,1,'2006-02-15 05:09:17'),(3218,707,1,'2006-02-15 05:09:17'),(3219,707,2,'2006-02-15 05:09:17'),(3220,707,2,'2006-02-15 05:09:17'),(3221,707,2,'2006-02-15 05:09:17'),(3222,707,2,'2006-02-15 05:09:17'),(3223,708,1,'2006-02-15 05:09:17'),(3224,708,1,'2006-02-15 05:09:17'),(3225,708,2,'2006-02-15 05:09:17'),(3226,708,2,'2006-02-15 05:09:17'),(3227,709,1,'2006-02-15 05:09:17'),(3228,709,1,'2006-02-15 05:09:17'),(3229,709,2,'2006-02-15 05:09:17'),(3230,709,2,'2006-02-15 05:09:17'),(3231,709,2,'2006-02-15 05:09:17'),(3232,709,2,'2006-02-15 05:09:17'),(3233,710,1,'2006-02-15 05:09:17'),(3234,710,1,'2006-02-15 05:09:17'),(3235,710,1,'2006-02-15 05:09:17'),(3236,710,1,'2006-02-15 05:09:17'),(3237,710,2,'2006-02-15 05:09:17'),(3238,710,2,'2006-02-15 05:09:17'),(3239,711,2,'2006-02-15 05:09:17'),(3240,711,2,'2006-02-15 05:09:17'),(3241,711,2,'2006-02-15 05:09:17'),(3242,711,2,'2006-02-15 05:09:17'),(3243,714,2,'2006-02-15 05:09:17'),(3244,714,2,'2006-02-15 05:09:17'),(3245,714,2,'2006-02-15 05:09:17'),(3246,715,1,'2006-02-15 05:09:17'),(3247,715,1,'2006-02-15 05:09:17'),(3248,715,1,'2006-02-15 05:09:17'),(3249,715,1,'2006-02-15 05:09:17'),(3250,715,2,'2006-02-15 05:09:17'),(3251,715,2,'2006-02-15 05:09:17'),(3252,715,2,'2006-02-15 05:09:17'),(3253,716,1,'2006-02-15 05:09:17'),(3254,716,1,'2006-02-15 05:09:17'),(3255,716,2,'2006-02-15 05:09:17'),(3256,716,2,'2006-02-15 05:09:17'),(3257,716,2,'2006-02-15 05:09:17'),(3258,717,1,'2006-02-15 05:09:17'),(3259,717,1,'2006-02-15 05:09:17'),(3260,717,2,'2006-02-15 05:09:17'),(3261,717,2,'2006-02-15 05:09:17'),(3262,718,2,'2006-02-15 05:09:17'),(3263,718,2,'2006-02-15 05:09:17'),(3264,719,1,'2006-02-15 05:09:17'),(3265,719,1,'2006-02-15 05:09:17'),(3266,720,1,'2006-02-15 05:09:17'),(3267,720,1,'2006-02-15 05:09:17'),(3268,720,1,'2006-02-15 05:09:17'),(3269,720,2,'2006-02-15 05:09:17'),(3270,720,2,'2006-02-15 05:09:17'),(3271,720,2,'2006-02-15 05:09:17'),(3272,720,2,'2006-02-15 05:09:17'),(3273,721,1,'2006-02-15 05:09:17'),(3274,721,1,'2006-02-15 05:09:17'),(3275,722,1,'2006-02-15 05:09:17'),(3276,722,1,'2006-02-15 05:09:17'),(3277,722,2,'2006-02-15 05:09:17'),(3278,722,2,'2006-02-15 05:09:17'),(3279,723,1,'2006-02-15 05:09:17'),(3280,723,1,'2006-02-15 05:09:17'),(3281,723,1,'2006-02-15 05:09:17'),(3282,723,1,'2006-02-15 05:09:17'),(3283,723,2,'2006-02-15 05:09:17'),(3284,723,2,'2006-02-15 05:09:17'),(3285,723,2,'2006-02-15 05:09:17'),(3286,724,1,'2006-02-15 05:09:17'),(3287,724,1,'2006-02-15 05:09:17'),(3288,724,2,'2006-02-15 05:09:17'),(3289,724,2,'2006-02-15 05:09:17'),(3290,724,2,'2006-02-15 05:09:17'),(3291,724,2,'2006-02-15 05:09:17'),(3292,725,1,'2006-02-15 05:09:17'),(3293,725,1,'2006-02-15 05:09:17'),(3294,725,1,'2006-02-15 05:09:17'),(3295,725,2,'2006-02-15 05:09:17'),(3296,725,2,'2006-02-15 05:09:17'),(3297,725,2,'2006-02-15 05:09:17'),(3298,726,2,'2006-02-15 05:09:17'),(3299,726,2,'2006-02-15 05:09:17'),(3300,726,2,'2006-02-15 05:09:17'),(3301,727,1,'2006-02-15 05:09:17'),(3302,727,1,'2006-02-15 05:09:17'),(3303,727,2,'2006-02-15 05:09:17'),(3304,727,2,'2006-02-15 05:09:17'),(3305,727,2,'2006-02-15 05:09:17'),(3306,728,1,'2006-02-15 05:09:17'),(3307,728,1,'2006-02-15 05:09:17'),(3308,728,1,'2006-02-15 05:09:17'),(3309,728,2,'2006-02-15 05:09:17'),(3310,728,2,'2006-02-15 05:09:17'),(3311,729,2,'2006-02-15 05:09:17'),(3312,729,2,'2006-02-15 05:09:17'),(3313,729,2,'2006-02-15 05:09:17'),(3314,729,2,'2006-02-15 05:09:17'),(3315,730,1,'2006-02-15 05:09:17'),(3316,730,1,'2006-02-15 05:09:17'),(3317,730,1,'2006-02-15 05:09:17'),(3318,730,1,'2006-02-15 05:09:17'),(3319,730,2,'2006-02-15 05:09:17'),(3320,730,2,'2006-02-15 05:09:17'),(3321,730,2,'2006-02-15 05:09:17'),(3322,730,2,'2006-02-15 05:09:17'),(3323,731,2,'2006-02-15 05:09:17'),(3324,731,2,'2006-02-15 05:09:17'),(3325,731,2,'2006-02-15 05:09:17'),(3326,732,1,'2006-02-15 05:09:17'),(3327,732,1,'2006-02-15 05:09:17'),(3328,732,1,'2006-02-15 05:09:17'),(3329,732,1,'2006-02-15 05:09:17'),(3330,733,1,'2006-02-15 05:09:17'),(3331,733,1,'2006-02-15 05:09:17'),(3332,733,1,'2006-02-15 05:09:17'),(3333,733,1,'2006-02-15 05:09:17'),(3334,733,2,'2006-02-15 05:09:17'),(3335,733,2,'2006-02-15 05:09:17'),(3336,733,2,'2006-02-15 05:09:17'),(3337,734,1,'2006-02-15 05:09:17'),(3338,734,1,'2006-02-15 05:09:17'),(3339,734,2,'2006-02-15 05:09:17'),(3340,734,2,'2006-02-15 05:09:17'),(3341,734,2,'2006-02-15 05:09:17'),(3342,734,2,'2006-02-15 05:09:17'),(3343,735,1,'2006-02-15 05:09:17'),(3344,735,1,'2006-02-15 05:09:17'),(3345,735,1,'2006-02-15 05:09:17'),(3346,735,2,'2006-02-15 05:09:17'),(3347,735,2,'2006-02-15 05:09:17'),(3348,735,2,'2006-02-15 05:09:17'),(3349,735,2,'2006-02-15 05:09:17'),(3350,736,1,'2006-02-15 05:09:17'),(3351,736,1,'2006-02-15 05:09:17'),(3352,736,1,'2006-02-15 05:09:17'),(3353,736,1,'2006-02-15 05:09:17'),(3354,737,1,'2006-02-15 05:09:17'),(3355,737,1,'2006-02-15 05:09:17'),(3356,737,2,'2006-02-15 05:09:17'),(3357,737,2,'2006-02-15 05:09:17'),(3358,737,2,'2006-02-15 05:09:17'),(3359,737,2,'2006-02-15 05:09:17'),(3360,738,1,'2006-02-15 05:09:17'),(3361,738,1,'2006-02-15 05:09:17'),(3362,738,1,'2006-02-15 05:09:17'),(3363,738,1,'2006-02-15 05:09:17'),(3364,738,2,'2006-02-15 05:09:17'),(3365,738,2,'2006-02-15 05:09:17'),(3366,738,2,'2006-02-15 05:09:17'),(3367,738,2,'2006-02-15 05:09:17'),(3368,739,1,'2006-02-15 05:09:17'),(3369,739,1,'2006-02-15 05:09:17'),(3370,739,2,'2006-02-15 05:09:17'),(3371,739,2,'2006-02-15 05:09:17'),(3372,739,2,'2006-02-15 05:09:17'),(3373,740,2,'2006-02-15 05:09:17'),(3374,740,2,'2006-02-15 05:09:17'),(3375,740,2,'2006-02-15 05:09:17'),(3376,741,1,'2006-02-15 05:09:17'),(3377,741,1,'2006-02-15 05:09:17'),(3378,741,1,'2006-02-15 05:09:17'),(3379,741,1,'2006-02-15 05:09:17'),(3380,741,2,'2006-02-15 05:09:17'),(3381,741,2,'2006-02-15 05:09:17'),(3382,743,1,'2006-02-15 05:09:17'),(3383,743,1,'2006-02-15 05:09:17'),(3384,743,2,'2006-02-15 05:09:17'),(3385,743,2,'2006-02-15 05:09:17'),(3386,743,2,'2006-02-15 05:09:17'),(3387,743,2,'2006-02-15 05:09:17'),(3388,744,1,'2006-02-15 05:09:17'),(3389,744,1,'2006-02-15 05:09:17'),(3390,744,2,'2006-02-15 05:09:17'),(3391,744,2,'2006-02-15 05:09:17'),(3392,744,2,'2006-02-15 05:09:17'),(3393,745,1,'2006-02-15 05:09:17'),(3394,745,1,'2006-02-15 05:09:17'),(3395,745,1,'2006-02-15 05:09:17'),(3396,745,1,'2006-02-15 05:09:17'),(3397,745,2,'2006-02-15 05:09:17'),(3398,745,2,'2006-02-15 05:09:17'),(3399,745,2,'2006-02-15 05:09:17'),(3400,745,2,'2006-02-15 05:09:17'),(3401,746,1,'2006-02-15 05:09:17'),(3402,746,1,'2006-02-15 05:09:17'),(3403,746,2,'2006-02-15 05:09:17'),(3404,746,2,'2006-02-15 05:09:17'),(3405,746,2,'2006-02-15 05:09:17'),(3406,747,1,'2006-02-15 05:09:17'),(3407,747,1,'2006-02-15 05:09:17'),(3408,747,2,'2006-02-15 05:09:17'),(3409,747,2,'2006-02-15 05:09:17'),(3410,747,2,'2006-02-15 05:09:17'),(3411,748,1,'2006-02-15 05:09:17'),(3412,748,1,'2006-02-15 05:09:17'),(3413,748,1,'2006-02-15 05:09:17'),(3414,748,1,'2006-02-15 05:09:17'),(3415,748,2,'2006-02-15 05:09:17'),(3416,748,2,'2006-02-15 05:09:17'),(3417,748,2,'2006-02-15 05:09:17'),(3418,748,2,'2006-02-15 05:09:17'),(3419,749,1,'2006-02-15 05:09:17'),(3420,749,1,'2006-02-15 05:09:17'),(3421,749,2,'2006-02-15 05:09:17'),(3422,749,2,'2006-02-15 05:09:17'),(3423,750,1,'2006-02-15 05:09:17'),(3424,750,1,'2006-02-15 05:09:17'),(3425,750,1,'2006-02-15 05:09:17'),(3426,751,2,'2006-02-15 05:09:17'),(3427,751,2,'2006-02-15 05:09:17'),(3428,752,2,'2006-02-15 05:09:17'),(3429,752,2,'2006-02-15 05:09:17'),(3430,752,2,'2006-02-15 05:09:17'),(3431,753,1,'2006-02-15 05:09:17'),(3432,753,1,'2006-02-15 05:09:17'),(3433,753,1,'2006-02-15 05:09:17'),(3434,753,1,'2006-02-15 05:09:17'),(3435,753,2,'2006-02-15 05:09:17'),(3436,753,2,'2006-02-15 05:09:17'),(3437,753,2,'2006-02-15 05:09:17'),(3438,753,2,'2006-02-15 05:09:17'),(3439,754,2,'2006-02-15 05:09:17'),(3440,754,2,'2006-02-15 05:09:17'),(3441,755,1,'2006-02-15 05:09:17'),(3442,755,1,'2006-02-15 05:09:17'),(3443,755,1,'2006-02-15 05:09:17'),(3444,755,1,'2006-02-15 05:09:17'),(3445,755,2,'2006-02-15 05:09:17'),(3446,755,2,'2006-02-15 05:09:17'),(3447,755,2,'2006-02-15 05:09:17'),(3448,756,2,'2006-02-15 05:09:17'),(3449,756,2,'2006-02-15 05:09:17'),(3450,756,2,'2006-02-15 05:09:17'),(3451,757,1,'2006-02-15 05:09:17'),(3452,757,1,'2006-02-15 05:09:17'),(3453,757,1,'2006-02-15 05:09:17'),(3454,757,2,'2006-02-15 05:09:17'),(3455,757,2,'2006-02-15 05:09:17'),(3456,758,2,'2006-02-15 05:09:17'),(3457,758,2,'2006-02-15 05:09:17'),(3458,758,2,'2006-02-15 05:09:17'),(3459,759,1,'2006-02-15 05:09:17'),(3460,759,1,'2006-02-15 05:09:17'),(3461,759,2,'2006-02-15 05:09:17'),(3462,759,2,'2006-02-15 05:09:17'),(3463,759,2,'2006-02-15 05:09:17'),(3464,759,2,'2006-02-15 05:09:17'),(3465,760,1,'2006-02-15 05:09:17'),(3466,760,1,'2006-02-15 05:09:17'),(3467,760,1,'2006-02-15 05:09:17'),(3468,760,2,'2006-02-15 05:09:17'),(3469,760,2,'2006-02-15 05:09:17'),(3470,760,2,'2006-02-15 05:09:17'),(3471,760,2,'2006-02-15 05:09:17'),(3472,761,2,'2006-02-15 05:09:17'),(3473,761,2,'2006-02-15 05:09:17'),(3474,761,2,'2006-02-15 05:09:17'),(3475,762,2,'2006-02-15 05:09:17'),(3476,762,2,'2006-02-15 05:09:17'),(3477,762,2,'2006-02-15 05:09:17'),(3478,762,2,'2006-02-15 05:09:17'),(3479,763,1,'2006-02-15 05:09:17'),(3480,763,1,'2006-02-15 05:09:17'),(3481,763,1,'2006-02-15 05:09:17'),(3482,763,2,'2006-02-15 05:09:17'),(3483,763,2,'2006-02-15 05:09:17'),(3484,764,1,'2006-02-15 05:09:17'),(3485,764,1,'2006-02-15 05:09:17'),(3486,764,1,'2006-02-15 05:09:17'),(3487,764,1,'2006-02-15 05:09:17'),(3488,764,2,'2006-02-15 05:09:17'),(3489,764,2,'2006-02-15 05:09:17'),(3490,764,2,'2006-02-15 05:09:17'),(3491,764,2,'2006-02-15 05:09:17'),(3492,765,1,'2006-02-15 05:09:17'),(3493,765,1,'2006-02-15 05:09:17'),(3494,765,1,'2006-02-15 05:09:17'),(3495,765,1,'2006-02-15 05:09:17'),(3496,766,1,'2006-02-15 05:09:17'),(3497,766,1,'2006-02-15 05:09:17'),(3498,766,1,'2006-02-15 05:09:17'),(3499,767,1,'2006-02-15 05:09:17'),(3500,767,1,'2006-02-15 05:09:17'),(3501,767,1,'2006-02-15 05:09:17'),(3502,767,1,'2006-02-15 05:09:17'),(3503,767,2,'2006-02-15 05:09:17'),(3504,767,2,'2006-02-15 05:09:17'),(3505,767,2,'2006-02-15 05:09:17'),(3506,767,2,'2006-02-15 05:09:17'),(3507,768,1,'2006-02-15 05:09:17'),(3508,768,1,'2006-02-15 05:09:17'),(3509,768,1,'2006-02-15 05:09:17'),(3510,768,2,'2006-02-15 05:09:17'),(3511,768,2,'2006-02-15 05:09:17'),(3512,768,2,'2006-02-15 05:09:17'),(3513,769,2,'2006-02-15 05:09:17'),(3514,769,2,'2006-02-15 05:09:17'),(3515,770,2,'2006-02-15 05:09:17'),(3516,770,2,'2006-02-15 05:09:17'),(3517,770,2,'2006-02-15 05:09:17'),(3518,771,1,'2006-02-15 05:09:17'),(3519,771,1,'2006-02-15 05:09:17'),(3520,771,1,'2006-02-15 05:09:17'),(3521,771,2,'2006-02-15 05:09:17'),(3522,771,2,'2006-02-15 05:09:17'),(3523,771,2,'2006-02-15 05:09:17'),(3524,771,2,'2006-02-15 05:09:17'),(3525,772,1,'2006-02-15 05:09:17'),(3526,772,1,'2006-02-15 05:09:17'),(3527,772,1,'2006-02-15 05:09:17'),(3528,772,1,'2006-02-15 05:09:17'),(3529,772,2,'2006-02-15 05:09:17'),(3530,772,2,'2006-02-15 05:09:17'),(3531,773,1,'2006-02-15 05:09:17'),(3532,773,1,'2006-02-15 05:09:17'),(3533,773,1,'2006-02-15 05:09:17'),(3534,773,1,'2006-02-15 05:09:17'),(3535,773,2,'2006-02-15 05:09:17'),(3536,773,2,'2006-02-15 05:09:17'),(3537,773,2,'2006-02-15 05:09:17'),(3538,773,2,'2006-02-15 05:09:17'),(3539,774,1,'2006-02-15 05:09:17'),(3540,774,1,'2006-02-15 05:09:17'),(3541,774,1,'2006-02-15 05:09:17'),(3542,774,1,'2006-02-15 05:09:17'),(3543,775,1,'2006-02-15 05:09:17'),(3544,775,1,'2006-02-15 05:09:17'),(3545,775,1,'2006-02-15 05:09:17'),(3546,775,2,'2006-02-15 05:09:17'),(3547,775,2,'2006-02-15 05:09:17'),(3548,776,1,'2006-02-15 05:09:17'),(3549,776,1,'2006-02-15 05:09:17'),(3550,776,2,'2006-02-15 05:09:17'),(3551,776,2,'2006-02-15 05:09:17'),(3552,776,2,'2006-02-15 05:09:17'),(3553,777,1,'2006-02-15 05:09:17'),(3554,777,1,'2006-02-15 05:09:17'),(3555,777,1,'2006-02-15 05:09:17'),(3556,777,2,'2006-02-15 05:09:17'),(3557,777,2,'2006-02-15 05:09:17'),(3558,777,2,'2006-02-15 05:09:17'),(3559,778,1,'2006-02-15 05:09:17'),(3560,778,1,'2006-02-15 05:09:17'),(3561,778,1,'2006-02-15 05:09:17'),(3562,778,1,'2006-02-15 05:09:17'),(3563,778,2,'2006-02-15 05:09:17'),(3564,778,2,'2006-02-15 05:09:17'),(3565,779,2,'2006-02-15 05:09:17'),(3566,779,2,'2006-02-15 05:09:17'),(3567,780,2,'2006-02-15 05:09:17'),(3568,780,2,'2006-02-15 05:09:17'),(3569,780,2,'2006-02-15 05:09:17'),(3570,781,2,'2006-02-15 05:09:17'),(3571,781,2,'2006-02-15 05:09:17'),(3572,782,1,'2006-02-15 05:09:17'),(3573,782,1,'2006-02-15 05:09:17'),(3574,782,1,'2006-02-15 05:09:17'),(3575,782,2,'2006-02-15 05:09:17'),(3576,782,2,'2006-02-15 05:09:17'),(3577,782,2,'2006-02-15 05:09:17'),(3578,783,1,'2006-02-15 05:09:17'),(3579,783,1,'2006-02-15 05:09:17'),(3580,783,1,'2006-02-15 05:09:17'),(3581,783,1,'2006-02-15 05:09:17'),(3582,784,1,'2006-02-15 05:09:17'),(3583,784,1,'2006-02-15 05:09:17'),(3584,784,1,'2006-02-15 05:09:17'),(3585,784,2,'2006-02-15 05:09:17'),(3586,784,2,'2006-02-15 05:09:17'),(3587,784,2,'2006-02-15 05:09:17'),(3588,785,1,'2006-02-15 05:09:17'),(3589,785,1,'2006-02-15 05:09:17'),(3590,785,1,'2006-02-15 05:09:17'),(3591,785,1,'2006-02-15 05:09:17'),(3592,785,2,'2006-02-15 05:09:17'),(3593,785,2,'2006-02-15 05:09:17'),(3594,786,1,'2006-02-15 05:09:17'),(3595,786,1,'2006-02-15 05:09:17'),(3596,786,1,'2006-02-15 05:09:17'),(3597,786,2,'2006-02-15 05:09:17'),(3598,786,2,'2006-02-15 05:09:17'),(3599,786,2,'2006-02-15 05:09:17'),(3600,786,2,'2006-02-15 05:09:17'),(3601,787,1,'2006-02-15 05:09:17'),(3602,787,1,'2006-02-15 05:09:17'),(3603,787,1,'2006-02-15 05:09:17'),(3604,788,1,'2006-02-15 05:09:17'),(3605,788,1,'2006-02-15 05:09:17'),(3606,788,2,'2006-02-15 05:09:17'),(3607,788,2,'2006-02-15 05:09:17'),(3608,789,1,'2006-02-15 05:09:17'),(3609,789,1,'2006-02-15 05:09:17'),(3610,789,1,'2006-02-15 05:09:17'),(3611,789,1,'2006-02-15 05:09:17'),(3612,789,2,'2006-02-15 05:09:17'),(3613,789,2,'2006-02-15 05:09:17'),(3614,789,2,'2006-02-15 05:09:17'),(3615,789,2,'2006-02-15 05:09:17'),(3616,790,1,'2006-02-15 05:09:17'),(3617,790,1,'2006-02-15 05:09:17'),(3618,790,1,'2006-02-15 05:09:17'),(3619,790,1,'2006-02-15 05:09:17'),(3620,790,2,'2006-02-15 05:09:17'),(3621,790,2,'2006-02-15 05:09:17'),(3622,790,2,'2006-02-15 05:09:17'),(3623,791,1,'2006-02-15 05:09:17'),(3624,791,1,'2006-02-15 05:09:17'),(3625,791,2,'2006-02-15 05:09:17'),(3626,791,2,'2006-02-15 05:09:17'),(3627,791,2,'2006-02-15 05:09:17'),(3628,791,2,'2006-02-15 05:09:17'),(3629,792,2,'2006-02-15 05:09:17'),(3630,792,2,'2006-02-15 05:09:17'),(3631,792,2,'2006-02-15 05:09:17'),(3632,793,1,'2006-02-15 05:09:17'),(3633,793,1,'2006-02-15 05:09:17'),(3634,793,1,'2006-02-15 05:09:17'),(3635,793,1,'2006-02-15 05:09:17'),(3636,794,1,'2006-02-15 05:09:17'),(3637,794,1,'2006-02-15 05:09:17'),(3638,794,2,'2006-02-15 05:09:17'),(3639,794,2,'2006-02-15 05:09:17'),(3640,795,1,'2006-02-15 05:09:17'),(3641,795,1,'2006-02-15 05:09:17'),(3642,795,1,'2006-02-15 05:09:17'),(3643,795,1,'2006-02-15 05:09:17'),(3644,796,1,'2006-02-15 05:09:17'),(3645,796,1,'2006-02-15 05:09:17'),(3646,796,2,'2006-02-15 05:09:17'),(3647,796,2,'2006-02-15 05:09:17'),(3648,796,2,'2006-02-15 05:09:17'),(3649,797,1,'2006-02-15 05:09:17'),(3650,797,1,'2006-02-15 05:09:17'),(3651,797,2,'2006-02-15 05:09:17'),(3652,797,2,'2006-02-15 05:09:17'),(3653,797,2,'2006-02-15 05:09:17'),(3654,798,1,'2006-02-15 05:09:17'),(3655,798,1,'2006-02-15 05:09:17'),(3656,798,2,'2006-02-15 05:09:17'),(3657,798,2,'2006-02-15 05:09:17'),(3658,799,1,'2006-02-15 05:09:17'),(3659,799,1,'2006-02-15 05:09:17'),(3660,800,1,'2006-02-15 05:09:17'),(3661,800,1,'2006-02-15 05:09:17'),(3662,800,2,'2006-02-15 05:09:17'),(3663,800,2,'2006-02-15 05:09:17'),(3664,800,2,'2006-02-15 05:09:17'),(3665,800,2,'2006-02-15 05:09:17'),(3666,803,1,'2006-02-15 05:09:17'),(3667,803,1,'2006-02-15 05:09:17'),(3668,803,1,'2006-02-15 05:09:17'),(3669,803,1,'2006-02-15 05:09:17'),(3670,803,2,'2006-02-15 05:09:17'),(3671,803,2,'2006-02-15 05:09:17'),(3672,804,1,'2006-02-15 05:09:17'),(3673,804,1,'2006-02-15 05:09:17'),(3674,804,1,'2006-02-15 05:09:17'),(3675,804,1,'2006-02-15 05:09:17'),(3676,804,2,'2006-02-15 05:09:17'),(3677,804,2,'2006-02-15 05:09:17'),(3678,804,2,'2006-02-15 05:09:17'),(3679,805,1,'2006-02-15 05:09:17'),(3680,805,1,'2006-02-15 05:09:17'),(3681,805,2,'2006-02-15 05:09:17'),(3682,805,2,'2006-02-15 05:09:17'),(3683,805,2,'2006-02-15 05:09:17'),(3684,806,1,'2006-02-15 05:09:17'),(3685,806,1,'2006-02-15 05:09:17'),(3686,806,1,'2006-02-15 05:09:17'),(3687,806,2,'2006-02-15 05:09:17'),(3688,806,2,'2006-02-15 05:09:17'),(3689,807,1,'2006-02-15 05:09:17'),(3690,807,1,'2006-02-15 05:09:17'),(3691,807,1,'2006-02-15 05:09:17'),(3692,807,2,'2006-02-15 05:09:17'),(3693,807,2,'2006-02-15 05:09:17'),(3694,808,2,'2006-02-15 05:09:17'),(3695,808,2,'2006-02-15 05:09:17'),(3696,809,2,'2006-02-15 05:09:17'),(3697,809,2,'2006-02-15 05:09:17'),(3698,809,2,'2006-02-15 05:09:17'),(3699,809,2,'2006-02-15 05:09:17'),(3700,810,1,'2006-02-15 05:09:17'),(3701,810,1,'2006-02-15 05:09:17'),(3702,810,1,'2006-02-15 05:09:17'),(3703,810,1,'2006-02-15 05:09:17'),(3704,810,2,'2006-02-15 05:09:17'),(3705,810,2,'2006-02-15 05:09:17'),(3706,810,2,'2006-02-15 05:09:17'),(3707,811,1,'2006-02-15 05:09:17'),(3708,811,1,'2006-02-15 05:09:17'),(3709,811,1,'2006-02-15 05:09:17'),(3710,812,1,'2006-02-15 05:09:17'),(3711,812,1,'2006-02-15 05:09:17'),(3712,812,1,'2006-02-15 05:09:17'),(3713,812,2,'2006-02-15 05:09:17'),(3714,812,2,'2006-02-15 05:09:17'),(3715,812,2,'2006-02-15 05:09:17'),(3716,813,2,'2006-02-15 05:09:17'),(3717,813,2,'2006-02-15 05:09:17'),(3718,813,2,'2006-02-15 05:09:17'),(3719,813,2,'2006-02-15 05:09:17'),(3720,814,1,'2006-02-15 05:09:17'),(3721,814,1,'2006-02-15 05:09:17'),(3722,814,1,'2006-02-15 05:09:17'),(3723,814,2,'2006-02-15 05:09:17'),(3724,814,2,'2006-02-15 05:09:17'),(3725,814,2,'2006-02-15 05:09:17'),(3726,814,2,'2006-02-15 05:09:17'),(3727,815,1,'2006-02-15 05:09:17'),(3728,815,1,'2006-02-15 05:09:17'),(3729,815,1,'2006-02-15 05:09:17'),(3730,816,1,'2006-02-15 05:09:17'),(3731,816,1,'2006-02-15 05:09:17'),(3732,816,1,'2006-02-15 05:09:17'),(3733,816,1,'2006-02-15 05:09:17'),(3734,816,2,'2006-02-15 05:09:17'),(3735,816,2,'2006-02-15 05:09:17'),(3736,816,2,'2006-02-15 05:09:17'),(3737,817,1,'2006-02-15 05:09:17'),(3738,817,1,'2006-02-15 05:09:17'),(3739,818,1,'2006-02-15 05:09:17'),(3740,818,1,'2006-02-15 05:09:17'),(3741,818,1,'2006-02-15 05:09:17'),(3742,818,2,'2006-02-15 05:09:17'),(3743,818,2,'2006-02-15 05:09:17'),(3744,819,1,'2006-02-15 05:09:17'),(3745,819,1,'2006-02-15 05:09:17'),(3746,819,1,'2006-02-15 05:09:17'),(3747,820,1,'2006-02-15 05:09:17'),(3748,820,1,'2006-02-15 05:09:17'),(3749,820,1,'2006-02-15 05:09:17'),(3750,820,1,'2006-02-15 05:09:17'),(3751,820,2,'2006-02-15 05:09:17'),(3752,820,2,'2006-02-15 05:09:17'),(3753,821,2,'2006-02-15 05:09:17'),(3754,821,2,'2006-02-15 05:09:17'),(3755,821,2,'2006-02-15 05:09:17'),(3756,821,2,'2006-02-15 05:09:17'),(3757,822,2,'2006-02-15 05:09:17'),(3758,822,2,'2006-02-15 05:09:17'),(3759,823,1,'2006-02-15 05:09:17'),(3760,823,1,'2006-02-15 05:09:17'),(3761,823,1,'2006-02-15 05:09:17'),(3762,823,2,'2006-02-15 05:09:17'),(3763,823,2,'2006-02-15 05:09:17'),(3764,823,2,'2006-02-15 05:09:17'),(3765,823,2,'2006-02-15 05:09:17'),(3766,824,2,'2006-02-15 05:09:17'),(3767,824,2,'2006-02-15 05:09:17'),(3768,824,2,'2006-02-15 05:09:17'),(3769,824,2,'2006-02-15 05:09:17'),(3770,825,1,'2006-02-15 05:09:17'),(3771,825,1,'2006-02-15 05:09:17'),(3772,825,1,'2006-02-15 05:09:17'),(3773,826,2,'2006-02-15 05:09:17'),(3774,826,2,'2006-02-15 05:09:17'),(3775,827,1,'2006-02-15 05:09:17'),(3776,827,1,'2006-02-15 05:09:17'),(3777,827,2,'2006-02-15 05:09:17'),(3778,827,2,'2006-02-15 05:09:17'),(3779,827,2,'2006-02-15 05:09:17'),(3780,827,2,'2006-02-15 05:09:17'),(3781,828,2,'2006-02-15 05:09:17'),(3782,828,2,'2006-02-15 05:09:17'),(3783,828,2,'2006-02-15 05:09:17'),(3784,828,2,'2006-02-15 05:09:17'),(3785,829,1,'2006-02-15 05:09:17'),(3786,829,1,'2006-02-15 05:09:17'),(3787,829,2,'2006-02-15 05:09:17'),(3788,829,2,'2006-02-15 05:09:17'),(3789,829,2,'2006-02-15 05:09:17'),(3790,830,2,'2006-02-15 05:09:17'),(3791,830,2,'2006-02-15 05:09:17'),(3792,830,2,'2006-02-15 05:09:17'),(3793,830,2,'2006-02-15 05:09:17'),(3794,831,1,'2006-02-15 05:09:17'),(3795,831,1,'2006-02-15 05:09:17'),(3796,831,1,'2006-02-15 05:09:17'),(3797,832,1,'2006-02-15 05:09:17'),(3798,832,1,'2006-02-15 05:09:17'),(3799,832,1,'2006-02-15 05:09:17'),(3800,832,1,'2006-02-15 05:09:17'),(3801,833,1,'2006-02-15 05:09:17'),(3802,833,1,'2006-02-15 05:09:17'),(3803,833,1,'2006-02-15 05:09:17'),(3804,833,2,'2006-02-15 05:09:17'),(3805,833,2,'2006-02-15 05:09:17'),(3806,833,2,'2006-02-15 05:09:17'),(3807,833,2,'2006-02-15 05:09:17'),(3808,834,2,'2006-02-15 05:09:17'),(3809,834,2,'2006-02-15 05:09:17'),(3810,834,2,'2006-02-15 05:09:17'),(3811,835,1,'2006-02-15 05:09:17'),(3812,835,1,'2006-02-15 05:09:17'),(3813,835,1,'2006-02-15 05:09:17'),(3814,835,1,'2006-02-15 05:09:17'),(3815,835,2,'2006-02-15 05:09:17'),(3816,835,2,'2006-02-15 05:09:17'),(3817,835,2,'2006-02-15 05:09:17'),(3818,835,2,'2006-02-15 05:09:17'),(3819,836,1,'2006-02-15 05:09:17'),(3820,836,1,'2006-02-15 05:09:17'),(3821,836,1,'2006-02-15 05:09:17'),(3822,837,2,'2006-02-15 05:09:17'),(3823,837,2,'2006-02-15 05:09:17'),(3824,837,2,'2006-02-15 05:09:17'),(3825,838,1,'2006-02-15 05:09:17'),(3826,838,1,'2006-02-15 05:09:17'),(3827,838,2,'2006-02-15 05:09:17'),(3828,838,2,'2006-02-15 05:09:17'),(3829,838,2,'2006-02-15 05:09:17'),(3830,838,2,'2006-02-15 05:09:17'),(3831,839,2,'2006-02-15 05:09:17'),(3832,839,2,'2006-02-15 05:09:17'),(3833,840,1,'2006-02-15 05:09:17'),(3834,840,1,'2006-02-15 05:09:17'),(3835,840,1,'2006-02-15 05:09:17'),(3836,840,1,'2006-02-15 05:09:17'),(3837,841,1,'2006-02-15 05:09:17'),(3838,841,1,'2006-02-15 05:09:17'),(3839,841,1,'2006-02-15 05:09:17'),(3840,841,2,'2006-02-15 05:09:17'),(3841,841,2,'2006-02-15 05:09:17'),(3842,841,2,'2006-02-15 05:09:17'),(3843,841,2,'2006-02-15 05:09:17'),(3844,842,1,'2006-02-15 05:09:17'),(3845,842,1,'2006-02-15 05:09:17'),(3846,842,2,'2006-02-15 05:09:17'),(3847,842,2,'2006-02-15 05:09:17'),(3848,843,1,'2006-02-15 05:09:17'),(3849,843,1,'2006-02-15 05:09:17'),(3850,843,1,'2006-02-15 05:09:17'),(3851,843,1,'2006-02-15 05:09:17'),(3852,843,2,'2006-02-15 05:09:17'),(3853,843,2,'2006-02-15 05:09:17'),(3854,843,2,'2006-02-15 05:09:17'),(3855,844,1,'2006-02-15 05:09:17'),(3856,844,1,'2006-02-15 05:09:17'),(3857,844,2,'2006-02-15 05:09:17'),(3858,844,2,'2006-02-15 05:09:17'),(3859,845,1,'2006-02-15 05:09:17'),(3860,845,1,'2006-02-15 05:09:17'),(3861,845,1,'2006-02-15 05:09:17'),(3862,845,1,'2006-02-15 05:09:17'),(3863,845,2,'2006-02-15 05:09:17'),(3864,845,2,'2006-02-15 05:09:17'),(3865,845,2,'2006-02-15 05:09:17'),(3866,846,1,'2006-02-15 05:09:17'),(3867,846,1,'2006-02-15 05:09:17'),(3868,846,1,'2006-02-15 05:09:17'),(3869,846,1,'2006-02-15 05:09:17'),(3870,846,2,'2006-02-15 05:09:17'),(3871,846,2,'2006-02-15 05:09:17'),(3872,846,2,'2006-02-15 05:09:17'),(3873,846,2,'2006-02-15 05:09:17'),(3874,847,2,'2006-02-15 05:09:17'),(3875,847,2,'2006-02-15 05:09:17'),(3876,847,2,'2006-02-15 05:09:17'),(3877,847,2,'2006-02-15 05:09:17'),(3878,848,1,'2006-02-15 05:09:17'),(3879,848,1,'2006-02-15 05:09:17'),(3880,848,1,'2006-02-15 05:09:17'),(3881,849,1,'2006-02-15 05:09:17'),(3882,849,1,'2006-02-15 05:09:17'),(3883,849,1,'2006-02-15 05:09:17'),(3884,849,1,'2006-02-15 05:09:17'),(3885,849,2,'2006-02-15 05:09:17'),(3886,849,2,'2006-02-15 05:09:17'),(3887,849,2,'2006-02-15 05:09:17'),(3888,849,2,'2006-02-15 05:09:17'),(3889,850,1,'2006-02-15 05:09:17'),(3890,850,1,'2006-02-15 05:09:17'),(3891,850,1,'2006-02-15 05:09:17'),(3892,850,2,'2006-02-15 05:09:17'),(3893,850,2,'2006-02-15 05:09:17'),(3894,850,2,'2006-02-15 05:09:17'),(3895,850,2,'2006-02-15 05:09:17'),(3896,851,1,'2006-02-15 05:09:17'),(3897,851,1,'2006-02-15 05:09:17'),(3898,851,1,'2006-02-15 05:09:17'),(3899,851,2,'2006-02-15 05:09:17'),(3900,851,2,'2006-02-15 05:09:17'),(3901,851,2,'2006-02-15 05:09:17'),(3902,852,1,'2006-02-15 05:09:17'),(3903,852,1,'2006-02-15 05:09:17'),(3904,852,1,'2006-02-15 05:09:17'),(3905,852,1,'2006-02-15 05:09:17'),(3906,852,2,'2006-02-15 05:09:17'),(3907,852,2,'2006-02-15 05:09:17'),(3908,852,2,'2006-02-15 05:09:17'),(3909,853,1,'2006-02-15 05:09:17'),(3910,853,1,'2006-02-15 05:09:17'),(3911,853,1,'2006-02-15 05:09:17'),(3912,854,2,'2006-02-15 05:09:17'),(3913,854,2,'2006-02-15 05:09:17'),(3914,854,2,'2006-02-15 05:09:17'),(3915,854,2,'2006-02-15 05:09:17'),(3916,855,1,'2006-02-15 05:09:17'),(3917,855,1,'2006-02-15 05:09:17'),(3918,855,2,'2006-02-15 05:09:17'),(3919,855,2,'2006-02-15 05:09:17'),(3920,856,1,'2006-02-15 05:09:17'),(3921,856,1,'2006-02-15 05:09:17'),(3922,856,1,'2006-02-15 05:09:17'),(3923,856,1,'2006-02-15 05:09:17'),(3924,856,2,'2006-02-15 05:09:17'),(3925,856,2,'2006-02-15 05:09:17'),(3926,856,2,'2006-02-15 05:09:17'),(3927,856,2,'2006-02-15 05:09:17'),(3928,857,1,'2006-02-15 05:09:17'),(3929,857,1,'2006-02-15 05:09:17'),(3930,857,1,'2006-02-15 05:09:17'),(3931,857,2,'2006-02-15 05:09:17'),(3932,857,2,'2006-02-15 05:09:17'),(3933,857,2,'2006-02-15 05:09:17'),(3934,857,2,'2006-02-15 05:09:17'),(3935,858,2,'2006-02-15 05:09:17'),(3936,858,2,'2006-02-15 05:09:17'),(3937,858,2,'2006-02-15 05:09:17'),(3938,858,2,'2006-02-15 05:09:17'),(3939,859,1,'2006-02-15 05:09:17'),(3940,859,1,'2006-02-15 05:09:17'),(3941,859,1,'2006-02-15 05:09:17'),(3942,859,2,'2006-02-15 05:09:17'),(3943,859,2,'2006-02-15 05:09:17'),(3944,859,2,'2006-02-15 05:09:17'),(3945,861,1,'2006-02-15 05:09:17'),(3946,861,1,'2006-02-15 05:09:17'),(3947,861,1,'2006-02-15 05:09:17'),(3948,861,2,'2006-02-15 05:09:17'),(3949,861,2,'2006-02-15 05:09:17'),(3950,861,2,'2006-02-15 05:09:17'),(3951,862,1,'2006-02-15 05:09:17'),(3952,862,1,'2006-02-15 05:09:17'),(3953,862,1,'2006-02-15 05:09:17'),(3954,862,2,'2006-02-15 05:09:17'),(3955,862,2,'2006-02-15 05:09:17'),(3956,863,1,'2006-02-15 05:09:17'),(3957,863,1,'2006-02-15 05:09:17'),(3958,863,1,'2006-02-15 05:09:17'),(3959,863,1,'2006-02-15 05:09:17'),(3960,863,2,'2006-02-15 05:09:17'),(3961,863,2,'2006-02-15 05:09:17'),(3962,863,2,'2006-02-15 05:09:17'),(3963,864,1,'2006-02-15 05:09:17'),(3964,864,1,'2006-02-15 05:09:17'),(3965,864,1,'2006-02-15 05:09:17'),(3966,864,1,'2006-02-15 05:09:17'),(3967,864,2,'2006-02-15 05:09:17'),(3968,864,2,'2006-02-15 05:09:17'),(3969,865,1,'2006-02-15 05:09:17'),(3970,865,1,'2006-02-15 05:09:17'),(3971,865,1,'2006-02-15 05:09:17'),(3972,865,1,'2006-02-15 05:09:17'),(3973,865,2,'2006-02-15 05:09:17'),(3974,865,2,'2006-02-15 05:09:17'),(3975,866,2,'2006-02-15 05:09:17'),(3976,866,2,'2006-02-15 05:09:17'),(3977,867,1,'2006-02-15 05:09:17'),(3978,867,1,'2006-02-15 05:09:17'),(3979,867,1,'2006-02-15 05:09:17'),(3980,867,1,'2006-02-15 05:09:17'),(3981,868,1,'2006-02-15 05:09:17'),(3982,868,1,'2006-02-15 05:09:17'),(3983,868,1,'2006-02-15 05:09:17'),(3984,869,1,'2006-02-15 05:09:17'),(3985,869,1,'2006-02-15 05:09:17'),(3986,869,1,'2006-02-15 05:09:17'),(3987,869,1,'2006-02-15 05:09:17'),(3988,869,2,'2006-02-15 05:09:17'),(3989,869,2,'2006-02-15 05:09:17'),(3990,869,2,'2006-02-15 05:09:17'),(3991,870,1,'2006-02-15 05:09:17'),(3992,870,1,'2006-02-15 05:09:17'),(3993,870,1,'2006-02-15 05:09:17'),(3994,870,1,'2006-02-15 05:09:17'),(3995,870,2,'2006-02-15 05:09:17'),(3996,870,2,'2006-02-15 05:09:17'),(3997,870,2,'2006-02-15 05:09:17'),(3998,870,2,'2006-02-15 05:09:17'),(3999,871,1,'2006-02-15 05:09:17'),(4000,871,1,'2006-02-15 05:09:17'),(4001,871,2,'2006-02-15 05:09:17'),(4002,871,2,'2006-02-15 05:09:17'),(4003,871,2,'2006-02-15 05:09:17'),(4004,872,2,'2006-02-15 05:09:17'),(4005,872,2,'2006-02-15 05:09:17'),(4006,872,2,'2006-02-15 05:09:17'),(4007,873,1,'2006-02-15 05:09:17'),(4008,873,1,'2006-02-15 05:09:17'),(4009,873,1,'2006-02-15 05:09:17'),(4010,873,1,'2006-02-15 05:09:17'),(4011,873,2,'2006-02-15 05:09:17'),(4012,873,2,'2006-02-15 05:09:17'),(4013,873,2,'2006-02-15 05:09:17'),(4014,873,2,'2006-02-15 05:09:17'),(4015,875,1,'2006-02-15 05:09:17'),(4016,875,1,'2006-02-15 05:09:17'),(4017,875,1,'2006-02-15 05:09:17'),(4018,875,2,'2006-02-15 05:09:17'),(4019,875,2,'2006-02-15 05:09:17'),(4020,875,2,'2006-02-15 05:09:17'),(4021,875,2,'2006-02-15 05:09:17'),(4022,876,1,'2006-02-15 05:09:17'),(4023,876,1,'2006-02-15 05:09:17'),(4024,877,1,'2006-02-15 05:09:17'),(4025,877,1,'2006-02-15 05:09:17'),(4026,877,1,'2006-02-15 05:09:17'),(4027,877,2,'2006-02-15 05:09:17'),(4028,877,2,'2006-02-15 05:09:17'),(4029,878,2,'2006-02-15 05:09:17'),(4030,878,2,'2006-02-15 05:09:17'),(4031,878,2,'2006-02-15 05:09:17'),(4032,878,2,'2006-02-15 05:09:17'),(4033,879,1,'2006-02-15 05:09:17'),(4034,879,1,'2006-02-15 05:09:17'),(4035,879,1,'2006-02-15 05:09:17'),(4036,879,1,'2006-02-15 05:09:17'),(4037,879,2,'2006-02-15 05:09:17'),(4038,879,2,'2006-02-15 05:09:17'),(4039,879,2,'2006-02-15 05:09:17'),(4040,880,1,'2006-02-15 05:09:17'),(4041,880,1,'2006-02-15 05:09:17'),(4042,880,1,'2006-02-15 05:09:17'),(4043,880,1,'2006-02-15 05:09:17'),(4044,880,2,'2006-02-15 05:09:17'),(4045,880,2,'2006-02-15 05:09:17'),(4046,880,2,'2006-02-15 05:09:17'),(4047,880,2,'2006-02-15 05:09:17'),(4048,881,2,'2006-02-15 05:09:17'),(4049,881,2,'2006-02-15 05:09:17'),(4050,881,2,'2006-02-15 05:09:17'),(4051,881,2,'2006-02-15 05:09:17'),(4052,882,1,'2006-02-15 05:09:17'),(4053,882,1,'2006-02-15 05:09:17'),(4054,882,1,'2006-02-15 05:09:17'),(4055,882,1,'2006-02-15 05:09:17'),(4056,883,2,'2006-02-15 05:09:17'),(4057,883,2,'2006-02-15 05:09:17'),(4058,884,2,'2006-02-15 05:09:17'),(4059,884,2,'2006-02-15 05:09:17'),(4060,884,2,'2006-02-15 05:09:17'),(4061,885,1,'2006-02-15 05:09:17'),(4062,885,1,'2006-02-15 05:09:17'),(4063,886,1,'2006-02-15 05:09:17'),(4064,886,1,'2006-02-15 05:09:17'),(4065,886,1,'2006-02-15 05:09:17'),(4066,886,1,'2006-02-15 05:09:17'),(4067,887,1,'2006-02-15 05:09:17'),(4068,887,1,'2006-02-15 05:09:17'),(4069,887,1,'2006-02-15 05:09:17'),(4070,887,1,'2006-02-15 05:09:17'),(4071,887,2,'2006-02-15 05:09:17'),(4072,887,2,'2006-02-15 05:09:17'),(4073,888,1,'2006-02-15 05:09:17'),(4074,888,1,'2006-02-15 05:09:17'),(4075,888,1,'2006-02-15 05:09:17'),(4076,888,1,'2006-02-15 05:09:17'),(4077,889,1,'2006-02-15 05:09:17'),(4078,889,1,'2006-02-15 05:09:17'),(4079,889,1,'2006-02-15 05:09:17'),(4080,890,1,'2006-02-15 05:09:17'),(4081,890,1,'2006-02-15 05:09:17'),(4082,890,1,'2006-02-15 05:09:17'),(4083,890,2,'2006-02-15 05:09:17'),(4084,890,2,'2006-02-15 05:09:17'),(4085,890,2,'2006-02-15 05:09:17'),(4086,890,2,'2006-02-15 05:09:17'),(4087,891,1,'2006-02-15 05:09:17'),(4088,891,1,'2006-02-15 05:09:17'),(4089,891,1,'2006-02-15 05:09:17'),(4090,891,2,'2006-02-15 05:09:17'),(4091,891,2,'2006-02-15 05:09:17'),(4092,891,2,'2006-02-15 05:09:17'),(4093,891,2,'2006-02-15 05:09:17'),(4094,892,1,'2006-02-15 05:09:17'),(4095,892,1,'2006-02-15 05:09:17'),(4096,892,1,'2006-02-15 05:09:17'),(4097,892,2,'2006-02-15 05:09:17'),(4098,892,2,'2006-02-15 05:09:17'),(4099,892,2,'2006-02-15 05:09:17'),(4100,892,2,'2006-02-15 05:09:17'),(4101,893,1,'2006-02-15 05:09:17'),(4102,893,1,'2006-02-15 05:09:17'),(4103,893,1,'2006-02-15 05:09:17'),(4104,893,1,'2006-02-15 05:09:17'),(4105,893,2,'2006-02-15 05:09:17'),(4106,893,2,'2006-02-15 05:09:17'),(4107,893,2,'2006-02-15 05:09:17'),(4108,893,2,'2006-02-15 05:09:17'),(4109,894,1,'2006-02-15 05:09:17'),(4110,894,1,'2006-02-15 05:09:17'),(4111,894,1,'2006-02-15 05:09:17'),(4112,894,2,'2006-02-15 05:09:17'),(4113,894,2,'2006-02-15 05:09:17'),(4114,895,1,'2006-02-15 05:09:17'),(4115,895,1,'2006-02-15 05:09:17'),(4116,895,1,'2006-02-15 05:09:17'),(4117,895,1,'2006-02-15 05:09:17'),(4118,895,2,'2006-02-15 05:09:17'),(4119,895,2,'2006-02-15 05:09:17'),(4120,895,2,'2006-02-15 05:09:17'),(4121,896,1,'2006-02-15 05:09:17'),(4122,896,1,'2006-02-15 05:09:17'),(4123,896,2,'2006-02-15 05:09:17'),(4124,896,2,'2006-02-15 05:09:17'),(4125,897,1,'2006-02-15 05:09:17'),(4126,897,1,'2006-02-15 05:09:17'),(4127,897,1,'2006-02-15 05:09:17'),(4128,897,1,'2006-02-15 05:09:17'),(4129,897,2,'2006-02-15 05:09:17'),(4130,897,2,'2006-02-15 05:09:17'),(4131,897,2,'2006-02-15 05:09:17'),(4132,897,2,'2006-02-15 05:09:17'),(4133,898,1,'2006-02-15 05:09:17'),(4134,898,1,'2006-02-15 05:09:17'),(4135,898,1,'2006-02-15 05:09:17'),(4136,898,2,'2006-02-15 05:09:17'),(4137,898,2,'2006-02-15 05:09:17'),(4138,899,1,'2006-02-15 05:09:17'),(4139,899,1,'2006-02-15 05:09:17'),(4140,899,1,'2006-02-15 05:09:17'),(4141,900,1,'2006-02-15 05:09:17'),(4142,900,1,'2006-02-15 05:09:17'),(4143,900,2,'2006-02-15 05:09:17'),(4144,900,2,'2006-02-15 05:09:17'),(4145,901,1,'2006-02-15 05:09:17'),(4146,901,1,'2006-02-15 05:09:17'),(4147,901,1,'2006-02-15 05:09:17'),(4148,901,1,'2006-02-15 05:09:17'),(4149,901,2,'2006-02-15 05:09:17'),(4150,901,2,'2006-02-15 05:09:17'),(4151,901,2,'2006-02-15 05:09:17'),(4152,902,1,'2006-02-15 05:09:17'),(4153,902,1,'2006-02-15 05:09:17'),(4154,902,1,'2006-02-15 05:09:17'),(4155,902,1,'2006-02-15 05:09:17'),(4156,902,2,'2006-02-15 05:09:17'),(4157,902,2,'2006-02-15 05:09:17'),(4158,902,2,'2006-02-15 05:09:17'),(4159,903,2,'2006-02-15 05:09:17'),(4160,903,2,'2006-02-15 05:09:17'),(4161,904,1,'2006-02-15 05:09:17'),(4162,904,1,'2006-02-15 05:09:17'),(4163,905,1,'2006-02-15 05:09:17'),(4164,905,1,'2006-02-15 05:09:17'),(4165,905,1,'2006-02-15 05:09:17'),(4166,906,1,'2006-02-15 05:09:17'),(4167,906,1,'2006-02-15 05:09:17'),(4168,906,2,'2006-02-15 05:09:17'),(4169,906,2,'2006-02-15 05:09:17'),(4170,906,2,'2006-02-15 05:09:17'),(4171,907,1,'2006-02-15 05:09:17'),(4172,907,1,'2006-02-15 05:09:17'),(4173,907,1,'2006-02-15 05:09:17'),(4174,907,1,'2006-02-15 05:09:17'),(4175,908,1,'2006-02-15 05:09:17'),(4176,908,1,'2006-02-15 05:09:17'),(4177,908,2,'2006-02-15 05:09:17'),(4178,908,2,'2006-02-15 05:09:17'),(4179,910,2,'2006-02-15 05:09:17'),(4180,910,2,'2006-02-15 05:09:17'),(4181,911,1,'2006-02-15 05:09:17'),(4182,911,1,'2006-02-15 05:09:17'),(4183,911,1,'2006-02-15 05:09:17'),(4184,911,1,'2006-02-15 05:09:17'),(4185,911,2,'2006-02-15 05:09:17'),(4186,911,2,'2006-02-15 05:09:17'),(4187,911,2,'2006-02-15 05:09:17'),(4188,911,2,'2006-02-15 05:09:17'),(4189,912,1,'2006-02-15 05:09:17'),(4190,912,1,'2006-02-15 05:09:17'),(4191,912,1,'2006-02-15 05:09:17'),(4192,912,2,'2006-02-15 05:09:17'),(4193,912,2,'2006-02-15 05:09:17'),(4194,912,2,'2006-02-15 05:09:17'),(4195,913,1,'2006-02-15 05:09:17'),(4196,913,1,'2006-02-15 05:09:17'),(4197,913,1,'2006-02-15 05:09:17'),(4198,913,1,'2006-02-15 05:09:17'),(4199,913,2,'2006-02-15 05:09:17'),(4200,913,2,'2006-02-15 05:09:17'),(4201,914,1,'2006-02-15 05:09:17'),(4202,914,1,'2006-02-15 05:09:17'),(4203,914,2,'2006-02-15 05:09:17'),(4204,914,2,'2006-02-15 05:09:17'),(4205,914,2,'2006-02-15 05:09:17'),(4206,914,2,'2006-02-15 05:09:17'),(4207,915,1,'2006-02-15 05:09:17'),(4208,915,1,'2006-02-15 05:09:17'),(4209,915,1,'2006-02-15 05:09:17'),(4210,915,1,'2006-02-15 05:09:17'),(4211,915,2,'2006-02-15 05:09:17'),(4212,915,2,'2006-02-15 05:09:17'),(4213,916,1,'2006-02-15 05:09:17'),(4214,916,1,'2006-02-15 05:09:17'),(4215,916,2,'2006-02-15 05:09:17'),(4216,916,2,'2006-02-15 05:09:17'),(4217,917,1,'2006-02-15 05:09:17'),(4218,917,1,'2006-02-15 05:09:17'),(4219,917,1,'2006-02-15 05:09:17'),(4220,917,2,'2006-02-15 05:09:17'),(4221,917,2,'2006-02-15 05:09:17'),(4222,918,2,'2006-02-15 05:09:17'),(4223,918,2,'2006-02-15 05:09:17'),(4224,918,2,'2006-02-15 05:09:17'),(4225,918,2,'2006-02-15 05:09:17'),(4226,919,1,'2006-02-15 05:09:17'),(4227,919,1,'2006-02-15 05:09:17'),(4228,919,1,'2006-02-15 05:09:17'),(4229,919,1,'2006-02-15 05:09:17'),(4230,920,1,'2006-02-15 05:09:17'),(4231,920,1,'2006-02-15 05:09:17'),(4232,920,1,'2006-02-15 05:09:17'),(4233,920,2,'2006-02-15 05:09:17'),(4234,920,2,'2006-02-15 05:09:17'),(4235,921,1,'2006-02-15 05:09:17'),(4236,921,1,'2006-02-15 05:09:17'),(4237,921,2,'2006-02-15 05:09:17'),(4238,921,2,'2006-02-15 05:09:17'),(4239,922,1,'2006-02-15 05:09:17'),(4240,922,1,'2006-02-15 05:09:17'),(4241,922,1,'2006-02-15 05:09:17'),(4242,922,2,'2006-02-15 05:09:17'),(4243,922,2,'2006-02-15 05:09:17'),(4244,922,2,'2006-02-15 05:09:17'),(4245,922,2,'2006-02-15 05:09:17'),(4246,923,2,'2006-02-15 05:09:17'),(4247,923,2,'2006-02-15 05:09:17'),(4248,923,2,'2006-02-15 05:09:17'),(4249,924,1,'2006-02-15 05:09:17'),(4250,924,1,'2006-02-15 05:09:17'),(4251,924,2,'2006-02-15 05:09:17'),(4252,924,2,'2006-02-15 05:09:17'),(4253,924,2,'2006-02-15 05:09:17'),(4254,925,1,'2006-02-15 05:09:17'),(4255,925,1,'2006-02-15 05:09:17'),(4256,925,1,'2006-02-15 05:09:17'),(4257,925,2,'2006-02-15 05:09:17'),(4258,925,2,'2006-02-15 05:09:17'),(4259,926,2,'2006-02-15 05:09:17'),(4260,926,2,'2006-02-15 05:09:17'),(4261,927,1,'2006-02-15 05:09:17'),(4262,927,1,'2006-02-15 05:09:17'),(4263,927,1,'2006-02-15 05:09:17'),(4264,927,1,'2006-02-15 05:09:17'),(4265,928,1,'2006-02-15 05:09:17'),(4266,928,1,'2006-02-15 05:09:17'),(4267,928,1,'2006-02-15 05:09:17'),(4268,929,1,'2006-02-15 05:09:17'),(4269,929,1,'2006-02-15 05:09:17'),(4270,929,1,'2006-02-15 05:09:17'),(4271,929,1,'2006-02-15 05:09:17'),(4272,930,1,'2006-02-15 05:09:17'),(4273,930,1,'2006-02-15 05:09:17'),(4274,930,1,'2006-02-15 05:09:17'),(4275,930,2,'2006-02-15 05:09:17'),(4276,930,2,'2006-02-15 05:09:17'),(4277,930,2,'2006-02-15 05:09:17'),(4278,931,2,'2006-02-15 05:09:17'),(4279,931,2,'2006-02-15 05:09:17'),(4280,931,2,'2006-02-15 05:09:17'),(4281,932,1,'2006-02-15 05:09:17'),(4282,932,1,'2006-02-15 05:09:17'),(4283,932,2,'2006-02-15 05:09:17'),(4284,932,2,'2006-02-15 05:09:17'),(4285,933,1,'2006-02-15 05:09:17'),(4286,933,1,'2006-02-15 05:09:17'),(4287,933,1,'2006-02-15 05:09:17'),(4288,934,2,'2006-02-15 05:09:17'),(4289,934,2,'2006-02-15 05:09:17'),(4290,934,2,'2006-02-15 05:09:17'),(4291,935,2,'2006-02-15 05:09:17'),(4292,935,2,'2006-02-15 05:09:17'),(4293,936,1,'2006-02-15 05:09:17'),(4294,936,1,'2006-02-15 05:09:17'),(4295,936,2,'2006-02-15 05:09:17'),(4296,936,2,'2006-02-15 05:09:17'),(4297,936,2,'2006-02-15 05:09:17'),(4298,936,2,'2006-02-15 05:09:17'),(4299,937,1,'2006-02-15 05:09:17'),(4300,937,1,'2006-02-15 05:09:17'),(4301,937,2,'2006-02-15 05:09:17'),(4302,937,2,'2006-02-15 05:09:17'),(4303,937,2,'2006-02-15 05:09:17'),(4304,938,1,'2006-02-15 05:09:17'),(4305,938,1,'2006-02-15 05:09:17'),(4306,938,1,'2006-02-15 05:09:17'),(4307,938,1,'2006-02-15 05:09:17'),(4308,938,2,'2006-02-15 05:09:17'),(4309,938,2,'2006-02-15 05:09:17'),(4310,939,2,'2006-02-15 05:09:17'),(4311,939,2,'2006-02-15 05:09:17'),(4312,939,2,'2006-02-15 05:09:17'),(4313,939,2,'2006-02-15 05:09:17'),(4314,940,1,'2006-02-15 05:09:17'),(4315,940,1,'2006-02-15 05:09:17'),(4316,940,1,'2006-02-15 05:09:17'),(4317,941,1,'2006-02-15 05:09:17'),(4318,941,1,'2006-02-15 05:09:17'),(4319,941,1,'2006-02-15 05:09:17'),(4320,941,1,'2006-02-15 05:09:17'),(4321,941,2,'2006-02-15 05:09:17'),(4322,941,2,'2006-02-15 05:09:17'),(4323,941,2,'2006-02-15 05:09:17'),(4324,942,1,'2006-02-15 05:09:17'),(4325,942,1,'2006-02-15 05:09:17'),(4326,942,2,'2006-02-15 05:09:17'),(4327,942,2,'2006-02-15 05:09:17'),(4328,944,1,'2006-02-15 05:09:17'),(4329,944,1,'2006-02-15 05:09:17'),(4330,944,2,'2006-02-15 05:09:17'),(4331,944,2,'2006-02-15 05:09:17'),(4332,944,2,'2006-02-15 05:09:17'),(4333,945,1,'2006-02-15 05:09:17'),(4334,945,1,'2006-02-15 05:09:17'),(4335,945,1,'2006-02-15 05:09:17'),(4336,945,1,'2006-02-15 05:09:17'),(4337,945,2,'2006-02-15 05:09:17'),(4338,945,2,'2006-02-15 05:09:17'),(4339,945,2,'2006-02-15 05:09:17'),(4340,945,2,'2006-02-15 05:09:17'),(4341,946,2,'2006-02-15 05:09:17'),(4342,946,2,'2006-02-15 05:09:17'),(4343,946,2,'2006-02-15 05:09:17'),(4344,946,2,'2006-02-15 05:09:17'),(4345,947,1,'2006-02-15 05:09:17'),(4346,947,1,'2006-02-15 05:09:17'),(4347,948,1,'2006-02-15 05:09:17'),(4348,948,1,'2006-02-15 05:09:17'),(4349,948,2,'2006-02-15 05:09:17'),(4350,948,2,'2006-02-15 05:09:17'),(4351,948,2,'2006-02-15 05:09:17'),(4352,948,2,'2006-02-15 05:09:17'),(4353,949,1,'2006-02-15 05:09:17'),(4354,949,1,'2006-02-15 05:09:17'),(4355,949,1,'2006-02-15 05:09:17'),(4356,949,1,'2006-02-15 05:09:17'),(4357,949,2,'2006-02-15 05:09:17'),(4358,949,2,'2006-02-15 05:09:17'),(4359,951,1,'2006-02-15 05:09:17'),(4360,951,1,'2006-02-15 05:09:17'),(4361,951,1,'2006-02-15 05:09:17'),(4362,951,2,'2006-02-15 05:09:17'),(4363,951,2,'2006-02-15 05:09:17'),(4364,951,2,'2006-02-15 05:09:17'),(4365,951,2,'2006-02-15 05:09:17'),(4366,952,1,'2006-02-15 05:09:17'),(4367,952,1,'2006-02-15 05:09:17'),(4368,952,1,'2006-02-15 05:09:17'),(4369,953,1,'2006-02-15 05:09:17'),(4370,953,1,'2006-02-15 05:09:17'),(4371,953,1,'2006-02-15 05:09:17'),(4372,953,1,'2006-02-15 05:09:17'),(4373,953,2,'2006-02-15 05:09:17'),(4374,953,2,'2006-02-15 05:09:17'),(4375,956,1,'2006-02-15 05:09:17'),(4376,956,1,'2006-02-15 05:09:17'),(4377,956,1,'2006-02-15 05:09:17'),(4378,956,1,'2006-02-15 05:09:17'),(4379,957,1,'2006-02-15 05:09:17'),(4380,957,1,'2006-02-15 05:09:17'),(4381,957,1,'2006-02-15 05:09:17'),(4382,957,2,'2006-02-15 05:09:17'),(4383,957,2,'2006-02-15 05:09:17'),(4384,958,1,'2006-02-15 05:09:17'),(4385,958,1,'2006-02-15 05:09:17'),(4386,958,1,'2006-02-15 05:09:17'),(4387,958,2,'2006-02-15 05:09:17'),(4388,958,2,'2006-02-15 05:09:17'),(4389,958,2,'2006-02-15 05:09:17'),(4390,959,1,'2006-02-15 05:09:17'),(4391,959,1,'2006-02-15 05:09:17'),(4392,960,2,'2006-02-15 05:09:17'),(4393,960,2,'2006-02-15 05:09:17'),(4394,960,2,'2006-02-15 05:09:17'),(4395,961,1,'2006-02-15 05:09:17'),(4396,961,1,'2006-02-15 05:09:17'),(4397,961,1,'2006-02-15 05:09:17'),(4398,961,2,'2006-02-15 05:09:17'),(4399,961,2,'2006-02-15 05:09:17'),(4400,962,1,'2006-02-15 05:09:17'),(4401,962,1,'2006-02-15 05:09:17'),(4402,962,1,'2006-02-15 05:09:17'),(4403,962,1,'2006-02-15 05:09:17'),(4404,963,1,'2006-02-15 05:09:17'),(4405,963,1,'2006-02-15 05:09:17'),(4406,963,2,'2006-02-15 05:09:17'),(4407,963,2,'2006-02-15 05:09:17'),(4408,963,2,'2006-02-15 05:09:17'),(4409,964,1,'2006-02-15 05:09:17'),(4410,964,1,'2006-02-15 05:09:17'),(4411,964,1,'2006-02-15 05:09:17'),(4412,964,2,'2006-02-15 05:09:17'),(4413,964,2,'2006-02-15 05:09:17'),(4414,965,1,'2006-02-15 05:09:17'),(4415,965,1,'2006-02-15 05:09:17'),(4416,966,1,'2006-02-15 05:09:17'),(4417,966,1,'2006-02-15 05:09:17'),(4418,966,2,'2006-02-15 05:09:17'),(4419,966,2,'2006-02-15 05:09:17'),(4420,966,2,'2006-02-15 05:09:17'),(4421,966,2,'2006-02-15 05:09:17'),(4422,967,1,'2006-02-15 05:09:17'),(4423,967,1,'2006-02-15 05:09:17'),(4424,967,1,'2006-02-15 05:09:17'),(4425,967,2,'2006-02-15 05:09:17'),(4426,967,2,'2006-02-15 05:09:17'),(4427,968,1,'2006-02-15 05:09:17'),(4428,968,1,'2006-02-15 05:09:17'),(4429,968,1,'2006-02-15 05:09:17'),(4430,969,1,'2006-02-15 05:09:17'),(4431,969,1,'2006-02-15 05:09:17'),(4432,969,1,'2006-02-15 05:09:17'),(4433,969,1,'2006-02-15 05:09:17'),(4434,970,1,'2006-02-15 05:09:17'),(4435,970,1,'2006-02-15 05:09:17'),(4436,970,1,'2006-02-15 05:09:17'),(4437,970,2,'2006-02-15 05:09:17'),(4438,970,2,'2006-02-15 05:09:17'),(4439,970,2,'2006-02-15 05:09:17'),(4440,970,2,'2006-02-15 05:09:17'),(4441,971,1,'2006-02-15 05:09:17'),(4442,971,1,'2006-02-15 05:09:17'),(4443,971,1,'2006-02-15 05:09:17'),(4444,971,1,'2006-02-15 05:09:17'),(4445,972,1,'2006-02-15 05:09:17'),(4446,972,1,'2006-02-15 05:09:17'),(4447,972,1,'2006-02-15 05:09:17'),(4448,972,2,'2006-02-15 05:09:17'),(4449,972,2,'2006-02-15 05:09:17'),(4450,972,2,'2006-02-15 05:09:17'),(4451,973,1,'2006-02-15 05:09:17'),(4452,973,1,'2006-02-15 05:09:17'),(4453,973,1,'2006-02-15 05:09:17'),(4454,973,1,'2006-02-15 05:09:17'),(4455,973,2,'2006-02-15 05:09:17'),(4456,973,2,'2006-02-15 05:09:17'),(4457,973,2,'2006-02-15 05:09:17'),(4458,973,2,'2006-02-15 05:09:17'),(4459,974,1,'2006-02-15 05:09:17'),(4460,974,1,'2006-02-15 05:09:17'),(4461,975,1,'2006-02-15 05:09:17'),(4462,975,1,'2006-02-15 05:09:17'),(4463,975,2,'2006-02-15 05:09:17'),(4464,975,2,'2006-02-15 05:09:17'),(4465,975,2,'2006-02-15 05:09:17'),(4466,976,1,'2006-02-15 05:09:17'),(4467,976,1,'2006-02-15 05:09:17'),(4468,976,2,'2006-02-15 05:09:17'),(4469,976,2,'2006-02-15 05:09:17'),(4470,976,2,'2006-02-15 05:09:17'),(4471,976,2,'2006-02-15 05:09:17'),(4472,977,2,'2006-02-15 05:09:17'),(4473,977,2,'2006-02-15 05:09:17'),(4474,977,2,'2006-02-15 05:09:17'),(4475,978,1,'2006-02-15 05:09:17'),(4476,978,1,'2006-02-15 05:09:17'),(4477,978,1,'2006-02-15 05:09:17'),(4478,979,1,'2006-02-15 05:09:17'),(4479,979,1,'2006-02-15 05:09:17'),(4480,979,1,'2006-02-15 05:09:17'),(4481,979,1,'2006-02-15 05:09:17'),(4482,979,2,'2006-02-15 05:09:17'),(4483,979,2,'2006-02-15 05:09:17'),(4484,979,2,'2006-02-15 05:09:17'),(4485,980,1,'2006-02-15 05:09:17'),(4486,980,1,'2006-02-15 05:09:17'),(4487,980,1,'2006-02-15 05:09:17'),(4488,980,2,'2006-02-15 05:09:17'),(4489,980,2,'2006-02-15 05:09:17'),(4490,981,1,'2006-02-15 05:09:17'),(4491,981,1,'2006-02-15 05:09:17'),(4492,981,1,'2006-02-15 05:09:17'),(4493,981,2,'2006-02-15 05:09:17'),(4494,981,2,'2006-02-15 05:09:17'),(4495,981,2,'2006-02-15 05:09:17'),(4496,982,1,'2006-02-15 05:09:17'),(4497,982,1,'2006-02-15 05:09:17'),(4498,982,1,'2006-02-15 05:09:17'),(4499,982,2,'2006-02-15 05:09:17'),(4500,982,2,'2006-02-15 05:09:17'),(4501,982,2,'2006-02-15 05:09:17'),(4502,982,2,'2006-02-15 05:09:17'),(4503,983,1,'2006-02-15 05:09:17'),(4504,983,1,'2006-02-15 05:09:17'),(4505,983,1,'2006-02-15 05:09:17'),(4506,984,1,'2006-02-15 05:09:17'),(4507,984,1,'2006-02-15 05:09:17'),(4508,985,1,'2006-02-15 05:09:17'),(4509,985,1,'2006-02-15 05:09:17'),(4510,985,1,'2006-02-15 05:09:17'),(4511,985,1,'2006-02-15 05:09:17'),(4512,985,2,'2006-02-15 05:09:17'),(4513,985,2,'2006-02-15 05:09:17'),(4514,985,2,'2006-02-15 05:09:17'),(4515,986,1,'2006-02-15 05:09:17'),(4516,986,1,'2006-02-15 05:09:17'),(4517,986,1,'2006-02-15 05:09:17'),(4518,986,1,'2006-02-15 05:09:17'),(4519,986,2,'2006-02-15 05:09:17'),(4520,986,2,'2006-02-15 05:09:17'),(4521,987,1,'2006-02-15 05:09:17'),(4522,987,1,'2006-02-15 05:09:17'),(4523,987,2,'2006-02-15 05:09:17'),(4524,987,2,'2006-02-15 05:09:17'),(4525,988,1,'2006-02-15 05:09:17'),(4526,988,1,'2006-02-15 05:09:17'),(4527,988,1,'2006-02-15 05:09:17'),(4528,988,2,'2006-02-15 05:09:17'),(4529,988,2,'2006-02-15 05:09:17'),(4530,989,1,'2006-02-15 05:09:17'),(4531,989,1,'2006-02-15 05:09:17'),(4532,989,1,'2006-02-15 05:09:17'),(4533,989,1,'2006-02-15 05:09:17'),(4534,989,2,'2006-02-15 05:09:17'),(4535,989,2,'2006-02-15 05:09:17'),(4536,990,2,'2006-02-15 05:09:17'),(4537,990,2,'2006-02-15 05:09:17'),(4538,991,1,'2006-02-15 05:09:17'),(4539,991,1,'2006-02-15 05:09:17'),(4540,991,2,'2006-02-15 05:09:17'),(4541,991,2,'2006-02-15 05:09:17'),(4542,991,2,'2006-02-15 05:09:17'),(4543,992,2,'2006-02-15 05:09:17'),(4544,992,2,'2006-02-15 05:09:17'),(4545,992,2,'2006-02-15 05:09:17'),(4546,992,2,'2006-02-15 05:09:17'),(4547,993,1,'2006-02-15 05:09:17'),(4548,993,1,'2006-02-15 05:09:17'),(4549,993,1,'2006-02-15 05:09:17'),(4550,993,1,'2006-02-15 05:09:17'),(4551,993,2,'2006-02-15 05:09:17'),(4552,993,2,'2006-02-15 05:09:17'),(4553,993,2,'2006-02-15 05:09:17'),(4554,994,1,'2006-02-15 05:09:17'),(4555,994,1,'2006-02-15 05:09:17'),(4556,994,1,'2006-02-15 05:09:17'),(4557,995,1,'2006-02-15 05:09:17'),(4558,995,1,'2006-02-15 05:09:17'),(4559,995,1,'2006-02-15 05:09:17'),(4560,995,1,'2006-02-15 05:09:17'),(4561,995,2,'2006-02-15 05:09:17'),(4562,995,2,'2006-02-15 05:09:17'),(4563,996,1,'2006-02-15 05:09:17'),(4564,996,1,'2006-02-15 05:09:17'),(4565,997,1,'2006-02-15 05:09:17'),(4566,997,1,'2006-02-15 05:09:17'),(4567,998,2,'2006-02-15 05:09:17'),(4568,998,2,'2006-02-15 05:09:17'),(4569,999,1,'2006-02-15 05:09:17'),(4570,999,1,'2006-02-15 05:09:17'),(4571,999,2,'2006-02-15 05:09:17'),(4572,999,2,'2006-02-15 05:09:17'),(4573,999,2,'2006-02-15 05:09:17'),(4574,1000,1,'2006-02-15 05:09:17'),(4575,1000,1,'2006-02-15 05:09:17'),(4576,1000,1,'2006-02-15 05:09:17'),(4577,1000,1,'2006-02-15 05:09:17'),(4578,1000,2,'2006-02-15 05:09:17'),(4579,1000,2,'2006-02-15 05:09:17'),(4580,1000,2,'2006-02-15 05:09:17'),(4581,1000,2,'2006-02-15 05:09:17'); -COMMIT; - --- --- Dumping data for table language --- - -SET AUTOCOMMIT=0; -INSERT INTO language VALUES (1,'English','2006-02-15 05:02:19'),(2,'Italian','2006-02-15 05:02:19'),(3,'Japanese','2006-02-15 05:02:19'),(4,'Mandarin','2006-02-15 05:02:19'),(5,'French','2006-02-15 05:02:19'),(6,'German','2006-02-15 05:02:19'); -COMMIT; - --- --- Dumping data for table payment --- - -SET AUTOCOMMIT=0; -INSERT INTO payment VALUES (1,1,1,76,'2.99','2005-05-25 11:30:37','2006-02-15 22:12:30'),(2,1,1,573,'0.99','2005-05-28 10:35:23','2006-02-15 22:12:30'),(3,1,1,1185,'5.99','2005-06-15 00:54:12','2006-02-15 22:12:30'),(4,1,2,1422,'0.99','2005-06-15 18:02:53','2006-02-15 22:12:30'),(5,1,2,1476,'9.99','2005-06-15 21:08:46','2006-02-15 22:12:30'),(6,1,1,1725,'4.99','2005-06-16 15:18:57','2006-02-15 22:12:30'),(7,1,1,2308,'4.99','2005-06-18 08:41:48','2006-02-15 22:12:30'),(8,1,2,2363,'0.99','2005-06-18 13:33:59','2006-02-15 22:12:30'),(9,1,1,3284,'3.99','2005-06-21 06:24:45','2006-02-15 22:12:30'),(10,1,2,4526,'5.99','2005-07-08 03:17:05','2006-02-15 22:12:30'),(11,1,1,4611,'5.99','2005-07-08 07:33:56','2006-02-15 22:12:30'),(12,1,1,5244,'4.99','2005-07-09 13:24:07','2006-02-15 22:12:30'),(13,1,1,5326,'4.99','2005-07-09 16:38:01','2006-02-15 22:12:30'),(14,1,1,6163,'7.99','2005-07-11 10:13:46','2006-02-15 22:12:30'),(15,1,2,7273,'2.99','2005-07-27 11:31:22','2006-02-15 22:12:30'),(16,1,1,7841,'4.99','2005-07-28 09:04:45','2006-02-15 22:12:30'),(17,1,2,8033,'4.99','2005-07-28 16:18:23','2006-02-15 22:12:30'),(18,1,1,8074,'0.99','2005-07-28 17:33:39','2006-02-15 22:12:30'),(19,1,2,8116,'0.99','2005-07-28 19:20:07','2006-02-15 22:12:30'),(20,1,2,8326,'2.99','2005-07-29 03:58:49','2006-02-15 22:12:30'),(21,1,2,9571,'2.99','2005-07-31 02:42:18','2006-02-15 22:12:30'),(22,1,2,10437,'4.99','2005-08-01 08:51:04','2006-02-15 22:12:30'),(23,1,2,11299,'3.99','2005-08-02 15:36:52','2006-02-15 22:12:30'),(24,1,1,11367,'0.99','2005-08-02 18:01:38','2006-02-15 22:12:30'),(25,1,2,11824,'4.99','2005-08-17 12:37:54','2006-02-15 22:12:30'),(26,1,1,12250,'0.99','2005-08-18 03:57:29','2006-02-15 22:12:30'),(27,1,2,13068,'0.99','2005-08-19 09:55:16','2006-02-15 22:12:30'),(28,1,2,13176,'2.99','2005-08-19 13:56:54','2006-02-15 22:12:30'),(29,1,1,14762,'0.99','2005-08-21 23:33:57','2006-02-15 22:12:30'),(30,1,1,14825,'1.99','2005-08-22 01:27:57','2006-02-15 22:12:30'),(31,1,2,15298,'2.99','2005-08-22 19:41:37','2006-02-15 22:12:30'),(32,1,1,15315,'5.99','2005-08-22 20:03:46','2006-02-15 22:12:30'),(33,2,1,320,'4.99','2005-05-27 00:09:24','2006-02-15 22:12:30'),(34,2,1,2128,'2.99','2005-06-17 20:54:58','2006-02-15 22:12:30'),(35,2,1,5636,'2.99','2005-07-10 06:31:24','2006-02-15 22:12:30'),(36,2,1,5755,'6.99','2005-07-10 12:38:56','2006-02-15 22:12:30'),(37,2,2,7346,'4.99','2005-07-27 14:30:42','2006-02-15 22:12:30'),(38,2,1,7376,'5.99','2005-07-27 15:23:02','2006-02-15 22:12:30'),(39,2,2,7459,'5.99','2005-07-27 18:40:20','2006-02-15 22:12:30'),(40,2,2,8230,'5.99','2005-07-29 00:12:59','2006-02-15 22:12:30'),(41,2,1,8598,'2.99','2005-07-29 12:56:59','2006-02-15 22:12:30'),(42,2,2,8705,'5.99','2005-07-29 17:14:29','2006-02-15 22:12:30'),(43,2,1,9031,'4.99','2005-07-30 06:06:10','2006-02-15 22:12:30'),(44,2,2,9236,'10.99','2005-07-30 13:47:43','2006-02-15 22:12:30'),(45,2,2,9248,'0.99','2005-07-30 14:14:11','2006-02-15 22:12:30'),(46,2,2,9296,'6.99','2005-07-30 16:21:13','2006-02-15 22:12:30'),(47,2,2,9465,'6.99','2005-07-30 22:39:53','2006-02-15 22:12:30'),(48,2,1,10136,'2.99','2005-07-31 21:58:56','2006-02-15 22:12:30'),(49,2,1,10466,'0.99','2005-08-01 09:45:26','2006-02-15 22:12:30'),(50,2,1,10918,'0.99','2005-08-02 02:10:56','2006-02-15 22:12:30'),(51,2,1,11087,'5.99','2005-08-02 07:41:41','2006-02-15 22:12:30'),(52,2,1,11177,'6.99','2005-08-02 10:43:48','2006-02-15 22:12:30'),(53,2,2,11256,'2.99','2005-08-02 13:44:53','2006-02-15 22:12:30'),(54,2,1,11614,'2.99','2005-08-17 03:52:18','2006-02-15 22:12:30'),(55,2,1,12963,'2.99','2005-08-19 06:26:04','2006-02-15 22:12:30'),(56,2,1,14475,'4.99','2005-08-21 13:24:32','2006-02-15 22:12:30'),(57,2,2,14743,'5.99','2005-08-21 22:41:56','2006-02-15 22:12:30'),(58,2,2,15145,'4.99','2005-08-22 13:53:04','2006-02-15 22:12:30'),(59,2,2,15907,'4.99','2005-08-23 17:39:35','2006-02-15 22:12:30'),(60,3,1,435,'1.99','2005-05-27 17:17:09','2006-02-15 22:12:30'),(61,3,1,830,'2.99','2005-05-29 22:43:55','2006-02-15 22:12:30'),(62,3,1,1546,'8.99','2005-06-16 01:34:05','2006-02-15 22:12:30'),(63,3,1,1726,'6.99','2005-06-16 15:19:10','2006-02-15 22:12:30'),(64,3,2,1911,'6.99','2005-06-17 05:15:15','2006-02-15 22:12:30'),(65,3,1,2628,'2.99','2005-06-19 08:34:53','2006-02-15 22:12:30'),(66,3,1,4180,'4.99','2005-07-07 10:23:25','2006-02-15 22:12:30'),(67,3,1,4725,'4.99','2005-07-08 12:47:11','2006-02-15 22:12:30'),(68,3,1,7096,'5.99','2005-07-27 04:54:42','2006-02-15 22:12:30'),(69,3,2,7503,'10.99','2005-07-27 20:23:12','2006-02-15 22:12:30'),(70,3,2,7703,'7.99','2005-07-28 03:59:21','2006-02-15 22:12:30'),(71,3,2,7724,'6.99','2005-07-28 04:46:30','2006-02-15 22:12:30'),(72,3,1,7911,'4.99','2005-07-28 11:46:45','2006-02-15 22:12:30'),(73,3,2,8086,'4.99','2005-07-28 18:17:14','2006-02-15 22:12:30'),(74,3,1,8545,'2.99','2005-07-29 11:07:04','2006-02-15 22:12:30'),(75,3,1,9226,'1.99','2005-07-30 13:31:20','2006-02-15 22:12:30'),(76,3,2,9443,'3.99','2005-07-30 21:45:46','2006-02-15 22:12:30'),(77,3,1,9595,'2.99','2005-07-31 03:27:58','2006-02-15 22:12:30'),(78,3,2,9816,'4.99','2005-07-31 11:32:58','2006-02-15 22:12:30'),(79,3,2,10597,'5.99','2005-08-01 14:19:48','2006-02-15 22:12:30'),(80,3,2,12556,'4.99','2005-08-18 14:49:55','2006-02-15 22:12:30'),(81,3,1,13403,'8.99','2005-08-19 22:18:07','2006-02-15 22:12:30'),(82,3,2,13610,'2.99','2005-08-20 06:14:12','2006-02-15 22:12:30'),(83,3,2,14699,'8.99','2005-08-21 20:50:48','2006-02-15 22:12:30'),(84,3,2,15038,'0.99','2005-08-22 09:37:27','2006-02-15 22:12:30'),(85,3,1,15619,'2.99','2005-08-23 07:10:14','2006-02-15 22:12:30'),(86,4,1,1297,'4.99','2005-06-15 09:31:28','2006-02-15 22:12:30'),(87,4,1,1633,'0.99','2005-06-16 08:08:40','2006-02-15 22:12:30'),(88,4,2,1707,'2.99','2005-06-16 14:01:27','2006-02-15 22:12:30'),(89,4,2,1735,'0.99','2005-06-16 15:51:52','2006-02-15 22:12:30'),(90,4,2,2043,'0.99','2005-06-17 14:31:12','2006-02-15 22:12:30'),(91,4,1,2642,'5.99','2005-06-19 09:39:01','2006-02-15 22:12:30'),(92,4,1,7660,'2.99','2005-07-28 02:10:10','2006-02-15 22:12:30'),(93,4,2,7718,'2.99','2005-07-28 04:37:59','2006-02-15 22:12:30'),(94,4,1,8741,'3.99','2005-07-29 18:44:57','2006-02-15 22:12:30'),(95,4,1,9100,'5.99','2005-07-30 08:46:09','2006-02-15 22:12:30'),(96,4,1,9371,'5.99','2005-07-30 18:58:00','2006-02-15 22:12:30'),(97,4,2,11069,'0.99','2005-08-02 07:09:34','2006-02-15 22:12:30'),(98,4,1,11110,'2.99','2005-08-02 08:20:31','2006-02-15 22:12:30'),(99,4,2,11529,'4.99','2005-08-17 00:28:01','2006-02-15 22:12:30'),(100,4,1,12151,'2.99','2005-08-18 00:14:03','2006-02-15 22:12:30'),(101,4,2,12294,'8.99','2005-08-18 05:14:44','2006-02-15 22:12:30'),(102,4,2,12856,'1.99','2005-08-19 02:19:13','2006-02-15 22:12:30'),(103,4,1,13704,'2.99','2005-08-20 09:32:04','2006-02-15 22:12:30'),(104,4,1,13807,'6.99','2005-08-20 12:55:40','2006-02-15 22:12:30'),(105,4,2,14225,'4.99','2005-08-21 04:53:37','2006-02-15 22:12:30'),(106,4,1,15147,'2.99','2005-08-22 13:58:23','2006-02-15 22:12:30'),(107,4,2,15635,'1.99','2005-08-23 07:43:00','2006-02-15 22:12:30'),(108,5,1,731,'0.99','2005-05-29 07:25:16','2006-02-15 22:12:30'),(109,5,1,1085,'6.99','2005-05-31 11:15:43','2006-02-15 22:12:30'),(110,5,1,1142,'1.99','2005-05-31 19:46:38','2006-02-15 22:12:30'),(111,5,1,1502,'3.99','2005-06-15 22:03:14','2006-02-15 22:12:30'),(112,5,2,1631,'2.99','2005-06-16 08:01:02','2006-02-15 22:12:30'),(113,5,2,2063,'4.99','2005-06-17 15:56:53','2006-02-15 22:12:30'),(114,5,2,2570,'2.99','2005-06-19 04:20:13','2006-02-15 22:12:30'),(115,5,2,3126,'4.99','2005-06-20 18:38:22','2006-02-15 22:12:30'),(116,5,2,3677,'4.99','2005-07-06 09:11:58','2006-02-15 22:12:30'),(117,5,2,4889,'2.99','2005-07-08 20:04:43','2006-02-15 22:12:30'),(118,5,1,5016,'4.99','2005-07-09 01:57:57','2006-02-15 22:12:30'),(119,5,2,5118,'5.99','2005-07-09 07:13:52','2006-02-15 22:12:30'),(120,5,2,5156,'1.99','2005-07-09 08:51:42','2006-02-15 22:12:30'),(121,5,2,5721,'0.99','2005-07-10 11:09:35','2006-02-15 22:12:30'),(122,5,1,6042,'8.99','2005-07-11 03:17:04','2006-02-15 22:12:30'),(123,5,1,6663,'3.99','2005-07-12 11:27:35','2006-02-15 22:12:30'),(124,5,2,6685,'4.99','2005-07-12 12:16:28','2006-02-15 22:12:30'),(125,5,2,7293,'0.99','2005-07-27 12:37:28','2006-02-15 22:12:30'),(126,5,2,7652,'0.99','2005-07-28 01:50:29','2006-02-15 22:12:30'),(127,5,2,7829,'3.99','2005-07-28 08:43:39','2006-02-15 22:12:30'),(128,5,1,8263,'2.99','2005-07-29 01:11:23','2006-02-15 22:12:30'),(129,5,1,8978,'1.99','2005-07-30 04:14:28','2006-02-15 22:12:30'),(130,5,1,9493,'4.99','2005-07-30 23:52:30','2006-02-15 22:12:30'),(131,5,1,9888,'3.99','2005-07-31 14:00:53','2006-02-15 22:12:30'),(132,5,2,10609,'4.99','2005-08-01 14:48:45','2006-02-15 22:12:30'),(133,5,1,10625,'0.99','2005-08-01 15:27:10','2006-02-15 22:12:30'),(134,5,2,11001,'4.99','2005-08-02 04:56:45','2006-02-15 22:12:30'),(135,5,1,11179,'4.99','2005-08-02 10:50:06','2006-02-15 22:12:30'),(136,5,2,11930,'3.99','2005-08-17 16:28:53','2006-02-15 22:12:30'),(137,5,1,12145,'9.99','2005-08-18 00:10:04','2006-02-15 22:12:30'),(138,5,1,12797,'2.99','2005-08-19 00:24:08','2006-02-15 22:12:30'),(139,5,1,13063,'1.99','2005-08-19 09:45:41','2006-02-15 22:12:30'),(140,5,2,13877,'0.99','2005-08-20 15:16:18','2006-02-15 22:12:30'),(141,5,2,14053,'6.99','2005-08-20 22:13:59','2006-02-15 22:12:30'),(142,5,1,14430,'6.99','2005-08-21 11:31:11','2006-02-15 22:12:30'),(143,5,2,14494,'2.99','2005-08-21 14:02:50','2006-02-15 22:12:30'),(144,5,2,15232,'0.99','2005-08-22 17:37:02','2006-02-15 22:12:30'),(145,5,2,13209,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:30'),(146,6,2,57,'4.99','2005-05-25 08:43:32','2006-02-15 22:12:30'),(147,6,1,577,'2.99','2005-05-28 11:09:14','2006-02-15 22:12:30'),(148,6,2,916,'0.99','2005-05-30 11:25:01','2006-02-15 22:12:30'),(149,6,1,1575,'3.99','2005-06-16 03:41:38','2006-02-15 22:12:30'),(150,6,2,1841,'2.99','2005-06-16 23:44:13','2006-02-15 22:12:30'),(151,6,1,1966,'0.99','2005-06-17 09:19:45','2006-02-15 22:12:30'),(152,6,1,2345,'0.99','2005-06-18 12:03:23','2006-02-15 22:12:30'),(153,6,2,3983,'0.99','2005-07-06 23:14:21','2006-02-15 22:12:30'),(154,6,2,4278,'2.99','2005-07-07 14:53:24','2006-02-15 22:12:30'),(155,6,1,5553,'0.99','2005-07-10 03:03:35','2006-02-15 22:12:30'),(156,6,2,6211,'5.99','2005-07-11 12:39:01','2006-02-15 22:12:30'),(157,6,1,6248,'7.99','2005-07-11 15:01:54','2006-02-15 22:12:30'),(158,6,2,6686,'0.99','2005-07-12 12:18:38','2006-02-15 22:12:30'),(159,6,2,7099,'2.99','2005-07-27 05:03:44','2006-02-15 22:12:30'),(160,6,2,7136,'2.99','2005-07-27 06:38:25','2006-02-15 22:12:30'),(161,6,1,8101,'0.99','2005-07-28 18:47:23','2006-02-15 22:12:30'),(162,6,1,10271,'2.99','2005-08-01 03:13:39','2006-02-15 22:12:30'),(163,6,1,11023,'2.99','2005-08-02 05:36:38','2006-02-15 22:12:30'),(164,6,1,11398,'3.99','2005-08-02 18:55:15','2006-02-15 22:12:30'),(165,6,1,11591,'6.99','2005-08-17 02:29:41','2006-02-15 22:12:30'),(166,6,1,11727,'0.99','2005-08-17 08:12:20','2006-02-15 22:12:30'),(167,6,1,11853,'0.99','2005-08-17 13:39:32','2006-02-15 22:12:30'),(168,6,2,12254,'2.99','2005-08-18 04:05:29','2006-02-15 22:12:30'),(169,6,2,13451,'6.99','2005-08-20 00:18:25','2006-02-15 22:12:30'),(170,6,1,14329,'7.99','2005-08-21 08:22:56','2006-02-15 22:12:30'),(171,6,1,14377,'4.99','2005-08-21 09:49:28','2006-02-15 22:12:30'),(172,6,1,15509,'5.99','2005-08-23 02:51:24','2006-02-15 22:12:30'),(173,6,2,15603,'0.99','2005-08-23 06:41:32','2006-02-15 22:12:30'),(174,7,2,46,'5.99','2005-05-25 06:04:08','2006-02-15 22:12:30'),(175,7,2,117,'0.99','2005-05-25 19:30:46','2006-02-15 22:12:30'),(176,7,2,748,'2.99','2005-05-29 09:27:00','2006-02-15 22:12:30'),(177,7,1,975,'4.99','2005-05-30 21:07:15','2006-02-15 22:12:30'),(178,7,1,1063,'5.99','2005-05-31 08:44:29','2006-02-15 22:12:30'),(179,7,2,1810,'0.99','2005-06-16 21:06:00','2006-02-15 22:12:30'),(180,7,1,2250,'2.99','2005-06-18 05:03:36','2006-02-15 22:12:31'),(181,7,1,2709,'0.99','2005-06-19 14:00:26','2006-02-15 22:12:31'),(182,7,1,2888,'4.99','2005-06-20 01:50:56','2006-02-15 22:12:31'),(183,7,1,3007,'0.99','2005-06-20 10:11:53','2006-02-15 22:12:31'),(184,7,2,3639,'5.99','2005-07-06 07:09:17','2006-02-15 22:12:31'),(185,7,2,4238,'2.99','2005-07-07 13:22:20','2006-02-15 22:12:31'),(186,7,2,4787,'5.99','2005-07-08 16:16:04','2006-02-15 22:12:31'),(187,7,1,4856,'4.99','2005-07-08 18:47:38','2006-02-15 22:12:31'),(188,7,1,5441,'8.99','2005-07-09 21:52:05','2006-02-15 22:12:31'),(189,7,1,5921,'7.99','2005-07-10 21:35:12','2006-02-15 22:12:31'),(190,7,1,6174,'1.99','2005-07-11 10:36:28','2006-02-15 22:12:31'),(191,7,1,6295,'2.99','2005-07-11 17:30:58','2006-02-15 22:12:31'),(192,7,2,6761,'3.99','2005-07-12 15:17:42','2006-02-15 22:12:31'),(193,7,2,8422,'5.99','2005-07-29 07:02:55','2006-02-15 22:12:31'),(194,7,2,9624,'7.99','2005-07-31 04:30:03','2006-02-15 22:12:31'),(195,7,2,10330,'6.99','2005-08-01 04:57:04','2006-02-15 22:12:31'),(196,7,1,10423,'5.99','2005-08-01 08:19:53','2006-02-15 22:12:31'),(197,7,1,10514,'4.99','2005-08-01 11:39:26','2006-02-15 22:12:31'),(198,7,2,10644,'4.99','2005-08-01 15:52:00','2006-02-15 22:12:31'),(199,7,2,10989,'3.99','2005-08-02 04:40:54','2006-02-15 22:12:31'),(200,7,2,11542,'7.99','2005-08-17 00:51:32','2006-02-15 22:12:31'),(201,7,1,12367,'8.99','2005-08-18 07:57:14','2006-02-15 22:12:31'),(202,7,1,12730,'2.99','2005-08-18 21:55:01','2006-02-15 22:12:31'),(203,7,2,13373,'2.99','2005-08-19 21:23:31','2006-02-15 22:12:31'),(204,7,1,13476,'2.99','2005-08-20 01:06:04','2006-02-15 22:12:31'),(205,7,1,13594,'0.99','2005-08-20 05:53:31','2006-02-15 22:12:31'),(206,7,1,14222,'5.99','2005-08-21 04:49:48','2006-02-15 22:12:31'),(207,8,2,866,'6.99','2005-05-30 03:43:54','2006-02-15 22:12:31'),(208,8,2,1305,'2.99','2005-06-15 09:59:16','2006-02-15 22:12:31'),(209,8,1,2095,'5.99','2005-06-17 18:21:35','2006-02-15 22:12:31'),(210,8,2,3114,'4.99','2005-06-20 17:57:47','2006-02-15 22:12:31'),(211,8,1,3475,'5.99','2005-07-05 23:01:21','2006-02-15 22:12:31'),(212,8,1,4003,'0.99','2005-07-07 00:09:02','2006-02-15 22:12:31'),(213,8,2,4175,'2.99','2005-07-07 10:02:03','2006-02-15 22:12:31'),(214,8,2,4409,'3.99','2005-07-07 21:47:29','2006-02-15 22:12:31'),(215,8,1,4503,'3.99','2005-07-08 02:17:12','2006-02-15 22:12:31'),(216,8,1,5300,'2.99','2005-07-09 15:40:46','2006-02-15 22:12:31'),(217,8,2,5341,'2.99','2005-07-09 17:13:23','2006-02-15 22:12:31'),(218,8,1,6375,'4.99','2005-07-11 21:39:46','2006-02-15 22:12:31'),(219,8,1,6647,'0.99','2005-07-12 10:43:53','2006-02-15 22:12:31'),(220,8,1,8809,'1.99','2005-07-29 21:42:49','2006-02-15 22:12:31'),(221,8,2,9629,'2.99','2005-07-31 04:54:43','2006-02-15 22:12:31'),(222,8,2,10141,'0.99','2005-07-31 22:08:29','2006-02-15 22:12:31'),(223,8,2,10561,'2.99','2005-08-01 13:05:35','2006-02-15 22:12:31'),(224,8,1,11232,'9.99','2005-08-02 13:04:12','2006-02-15 22:12:31'),(225,8,2,11284,'2.99','2005-08-02 14:42:45','2006-02-15 22:12:31'),(226,8,1,12613,'2.99','2005-08-18 17:16:01','2006-02-15 22:12:31'),(227,8,1,14114,'0.99','2005-08-21 01:07:11','2006-02-15 22:12:31'),(228,8,1,15374,'7.99','2005-08-22 22:09:09','2006-02-15 22:12:31'),(229,8,1,15764,'2.99','2005-08-23 13:05:10','2006-02-15 22:12:31'),(230,8,1,15805,'4.99','2005-08-23 14:31:19','2006-02-15 22:12:31'),(231,9,2,350,'4.99','2005-05-27 05:01:28','2006-02-15 22:12:31'),(232,9,2,877,'0.99','2005-05-30 05:48:59','2006-02-15 22:12:31'),(233,9,2,1075,'4.99','2005-05-31 10:13:34','2006-02-15 22:12:31'),(234,9,2,3142,'7.99','2005-06-20 19:59:28','2006-02-15 22:12:31'),(235,9,2,3262,'4.99','2005-06-21 04:08:43','2006-02-15 22:12:31'),(236,9,1,4454,'2.99','2005-07-07 23:37:00','2006-02-15 22:12:31'),(237,9,2,4748,'0.99','2005-07-08 13:59:38','2006-02-15 22:12:31'),(238,9,1,4796,'1.99','2005-07-08 16:35:44','2006-02-15 22:12:31'),(239,9,1,5659,'2.99','2005-07-10 07:45:40','2006-02-15 22:12:31'),(240,9,2,6019,'4.99','2005-07-11 02:08:29','2006-02-15 22:12:31'),(241,9,1,6165,'5.99','2005-07-11 10:17:29','2006-02-15 22:12:31'),(242,9,2,7616,'0.99','2005-07-28 00:15:26','2006-02-15 22:12:31'),(243,9,1,7801,'2.99','2005-07-28 07:51:56','2006-02-15 22:12:31'),(244,9,1,9043,'4.99','2005-07-30 06:34:07','2006-02-15 22:12:31'),(245,9,1,10451,'0.99','2005-08-01 09:11:25','2006-02-15 22:12:31'),(246,9,1,10454,'4.99','2005-08-01 09:14:00','2006-02-15 22:12:31'),(247,9,2,11400,'5.99','2005-08-02 19:00:52','2006-02-15 22:12:31'),(248,9,1,11556,'0.99','2005-08-17 01:11:53','2006-02-15 22:12:31'),(249,9,1,12228,'2.99','2005-08-18 03:08:10','2006-02-15 22:12:31'),(250,9,1,12309,'2.99','2005-08-18 05:58:40','2006-02-15 22:12:31'),(251,9,2,12652,'4.99','2005-08-18 18:48:58','2006-02-15 22:12:31'),(252,9,2,14489,'7.99','2005-08-21 13:53:59','2006-02-15 22:12:31'),(253,9,1,15813,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:31'),(254,10,2,1140,'4.99','2005-05-31 19:36:30','2006-02-15 22:12:31'),(255,10,1,1801,'4.99','2005-06-16 20:21:53','2006-02-15 22:12:31'),(256,10,1,1995,'4.99','2005-06-17 11:11:14','2006-02-15 22:12:31'),(257,10,2,2222,'3.99','2005-06-18 03:26:23','2006-02-15 22:12:31'),(258,10,1,2814,'0.99','2005-06-19 20:01:59','2006-02-15 22:12:31'),(259,10,1,2865,'0.99','2005-06-20 00:00:55','2006-02-15 22:12:31'),(260,10,2,3790,'3.99','2005-07-06 14:13:45','2006-02-15 22:12:31'),(261,10,2,4042,'4.99','2005-07-07 03:06:40','2006-02-15 22:12:31'),(262,10,1,4255,'1.99','2005-07-07 14:14:13','2006-02-15 22:12:31'),(263,10,1,5038,'7.99','2005-07-09 03:12:52','2006-02-15 22:12:31'),(264,10,2,5068,'2.99','2005-07-09 04:53:18','2006-02-15 22:12:31'),(265,10,1,5444,'0.99','2005-07-09 21:58:57','2006-02-15 22:12:31'),(266,10,1,5905,'2.99','2005-07-10 20:41:09','2006-02-15 22:12:31'),(267,10,1,7738,'2.99','2005-07-28 05:21:42','2006-02-15 22:12:31'),(268,10,2,8001,'6.99','2005-07-28 15:10:55','2006-02-15 22:12:31'),(269,10,2,8188,'4.99','2005-07-28 22:34:12','2006-02-15 22:12:31'),(270,10,1,9935,'4.99','2005-07-31 15:27:07','2006-02-15 22:12:31'),(271,10,2,10671,'8.99','2005-08-01 17:09:59','2006-02-15 22:12:31'),(272,10,2,11289,'2.99','2005-08-02 14:55:00','2006-02-15 22:12:31'),(273,10,1,11405,'0.99','2005-08-02 19:13:39','2006-02-15 22:12:31'),(274,10,2,12031,'2.99','2005-08-17 20:11:35','2006-02-15 22:12:31'),(275,10,2,12400,'2.99','2005-08-18 09:19:12','2006-02-15 22:12:31'),(276,10,2,13316,'4.99','2005-08-19 19:23:30','2006-02-15 22:12:31'),(277,10,2,13917,'2.99','2005-08-20 16:43:28','2006-02-15 22:12:31'),(278,10,1,15370,'5.99','2005-08-22 21:59:29','2006-02-15 22:12:31'),(279,11,1,987,'6.99','2005-05-30 22:59:12','2006-02-15 22:12:31'),(280,11,1,1470,'6.99','2005-06-15 20:53:07','2006-02-15 22:12:31'),(281,11,1,1939,'7.99','2005-06-17 07:26:45','2006-02-15 22:12:31'),(282,11,1,3192,'0.99','2005-06-20 23:49:12','2006-02-15 22:12:31'),(283,11,2,4608,'2.99','2005-07-08 07:19:11','2006-02-15 22:12:31'),(284,11,1,4943,'4.99','2005-07-08 22:43:05','2006-02-15 22:12:31'),(285,11,2,5835,'5.99','2005-07-10 16:44:58','2006-02-15 22:12:31'),(286,11,2,6146,'6.99','2005-07-11 09:09:59','2006-02-15 22:12:31'),(287,11,1,7314,'4.99','2005-07-27 13:13:32','2006-02-15 22:12:31'),(288,11,1,8014,'4.99','2005-07-28 15:32:07','2006-02-15 22:12:31'),(289,11,2,8100,'2.99','2005-07-28 18:43:11','2006-02-15 22:12:31'),(290,11,2,8447,'1.99','2005-07-29 07:38:14','2006-02-15 22:12:31'),(291,11,1,8715,'0.99','2005-07-29 17:33:45','2006-02-15 22:12:31'),(292,11,1,8950,'9.99','2005-07-30 03:17:13','2006-02-15 22:12:31'),(293,11,2,9292,'6.99','2005-07-30 16:08:21','2006-02-15 22:12:31'),(294,11,1,10812,'4.99','2005-08-01 22:41:16','2006-02-15 22:12:31'),(295,11,2,11166,'6.99','2005-08-02 10:14:58','2006-02-15 22:12:31'),(296,11,2,11502,'0.99','2005-08-16 23:06:30','2006-02-15 22:12:31'),(297,11,2,12015,'5.99','2005-08-17 19:32:44','2006-02-15 22:12:31'),(298,11,2,13572,'0.99','2005-08-20 05:07:27','2006-02-15 22:12:31'),(299,11,1,13790,'4.99','2005-08-20 12:17:27','2006-02-15 22:12:31'),(300,11,1,15120,'0.99','2005-08-22 12:42:47','2006-02-15 22:12:31'),(301,11,2,15240,'2.99','2005-08-22 17:46:41','2006-02-15 22:12:31'),(302,11,1,11646,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:31'),(303,12,1,988,'4.99','2005-05-30 23:08:03','2006-02-15 22:12:31'),(304,12,1,1084,'4.99','2005-05-31 11:10:17','2006-02-15 22:12:31'),(305,12,2,1752,'5.99','2005-06-16 17:02:55','2006-02-15 22:12:31'),(306,12,2,2434,'5.99','2005-06-18 18:11:51','2006-02-15 22:12:31'),(307,12,2,2500,'5.99','2005-06-18 23:07:12','2006-02-15 22:12:31'),(308,12,2,2623,'4.99','2005-06-19 08:11:51','2006-02-15 22:12:31'),(309,12,2,3135,'2.99','2005-06-20 19:33:52','2006-02-15 22:12:31'),(310,12,1,3411,'0.99','2005-06-21 16:31:27','2006-02-15 22:12:31'),(311,12,1,3870,'3.99','2005-07-06 17:57:54','2006-02-15 22:12:31'),(312,12,1,5071,'0.99','2005-07-09 05:00:39','2006-02-15 22:12:31'),(313,12,1,5074,'0.99','2005-07-09 05:06:24','2006-02-15 22:12:31'),(314,12,2,5111,'0.99','2005-07-09 07:02:19','2006-02-15 22:12:31'),(315,12,2,5242,'3.99','2005-07-09 13:20:25','2006-02-15 22:12:31'),(316,12,1,6773,'2.99','2005-07-12 15:55:39','2006-02-15 22:12:31'),(317,12,2,7008,'0.99','2005-07-27 01:44:03','2006-02-15 22:12:31'),(318,12,2,7279,'0.99','2005-07-27 11:50:47','2006-02-15 22:12:31'),(319,12,2,8985,'0.99','2005-07-30 04:34:51','2006-02-15 22:12:31'),(320,12,2,9166,'4.99','2005-07-30 11:26:28','2006-02-15 22:12:31'),(321,12,2,9238,'5.99','2005-07-30 13:49:43','2006-02-15 22:12:31'),(322,12,1,9627,'5.99','2005-07-31 04:42:46','2006-02-15 22:12:31'),(323,12,2,9708,'5.99','2005-07-31 07:45:33','2006-02-15 22:12:31'),(324,12,2,10392,'10.99','2005-08-01 06:50:26','2006-02-15 22:12:31'),(325,12,2,11497,'0.99','2005-08-16 22:52:30','2006-02-15 22:12:31'),(326,12,1,12604,'4.99','2005-08-18 16:58:48','2006-02-15 22:12:31'),(327,12,2,13519,'0.99','2005-08-20 02:37:07','2006-02-15 22:12:31'),(328,12,2,13895,'2.99','2005-08-20 15:58:28','2006-02-15 22:12:31'),(329,12,2,14240,'4.99','2005-08-21 05:19:39','2006-02-15 22:12:31'),(330,12,1,15993,'0.99','2005-08-23 20:28:44','2006-02-15 22:12:31'),(331,13,1,1933,'2.99','2005-06-17 06:54:42','2006-02-15 22:12:31'),(332,13,1,2209,'4.99','2005-06-18 02:24:01','2006-02-15 22:12:31'),(333,13,1,2952,'2.99','2005-06-20 06:26:57','2006-02-15 22:12:31'),(334,13,1,3047,'8.99','2005-06-20 12:45:33','2006-02-15 22:12:31'),(335,13,2,3946,'2.99','2005-07-06 21:39:24','2006-02-15 22:12:31'),(336,13,1,6118,'8.99','2005-07-11 07:43:08','2006-02-15 22:12:31'),(337,13,1,6568,'2.99','2005-07-12 05:45:47','2006-02-15 22:12:31'),(338,13,1,6870,'0.99','2005-07-12 20:13:45','2006-02-15 22:12:31'),(339,13,1,6897,'2.99','2005-07-12 21:30:41','2006-02-15 22:12:31'),(340,13,1,7916,'2.99','2005-07-28 11:49:53','2006-02-15 22:12:31'),(341,13,1,8277,'2.99','2005-07-29 01:38:53','2006-02-15 22:12:31'),(342,13,2,8831,'11.99','2005-07-29 22:37:41','2006-02-15 22:12:31'),(343,13,2,9260,'9.99','2005-07-30 14:38:22','2006-02-15 22:12:31'),(344,13,2,9434,'0.99','2005-07-30 21:29:41','2006-02-15 22:12:32'),(345,13,1,9664,'0.99','2005-07-31 06:12:08','2006-02-15 22:12:32'),(346,13,1,9736,'7.99','2005-07-31 08:58:40','2006-02-15 22:12:32'),(347,13,1,10003,'4.99','2005-07-31 17:48:51','2006-02-15 22:12:32'),(348,13,1,11292,'4.99','2005-08-02 14:58:41','2006-02-15 22:12:32'),(349,13,2,11315,'0.99','2005-08-02 16:05:17','2006-02-15 22:12:32'),(350,13,2,11761,'5.99','2005-08-17 09:44:59','2006-02-15 22:12:32'),(351,13,2,12918,'7.99','2005-08-19 04:31:36','2006-02-15 22:12:32'),(352,13,2,13096,'4.99','2005-08-19 10:49:03','2006-02-15 22:12:32'),(353,13,2,13213,'0.99','2005-08-19 15:25:48','2006-02-15 22:12:32'),(354,13,1,13456,'0.99','2005-08-20 00:33:19','2006-02-15 22:12:32'),(355,13,1,14252,'9.99','2005-08-21 05:44:07','2006-02-15 22:12:32'),(356,13,2,14545,'7.99','2005-08-21 15:44:23','2006-02-15 22:12:32'),(357,13,1,15338,'4.99','2005-08-22 20:51:24','2006-02-15 22:12:32'),(358,14,1,151,'0.99','2005-05-26 00:37:28','2006-02-15 22:12:32'),(359,14,1,346,'9.99','2005-05-27 04:34:41','2006-02-15 22:12:32'),(360,14,1,525,'5.99','2005-05-28 04:25:33','2006-02-15 22:12:32'),(361,14,1,671,'2.99','2005-05-28 22:04:30','2006-02-15 22:12:32'),(362,14,2,815,'0.99','2005-05-29 20:24:28','2006-02-15 22:12:32'),(363,14,2,1360,'4.99','2005-06-15 13:32:15','2006-02-15 22:12:32'),(364,14,1,3707,'2.99','2005-07-06 10:21:49','2006-02-15 22:12:32'),(365,14,1,4952,'0.99','2005-07-08 23:00:07','2006-02-15 22:12:32'),(366,14,1,5104,'0.99','2005-07-09 06:37:07','2006-02-15 22:12:32'),(367,14,2,5317,'7.99','2005-07-09 16:10:25','2006-02-15 22:12:32'),(368,14,1,5383,'4.99','2005-07-09 19:14:32','2006-02-15 22:12:32'),(369,14,1,5565,'7.99','2005-07-10 03:29:48','2006-02-15 22:12:32'),(370,14,1,8035,'6.99','2005-07-28 16:23:01','2006-02-15 22:12:32'),(371,14,1,8042,'0.99','2005-07-28 16:45:11','2006-02-15 22:12:32'),(372,14,1,8548,'3.99','2005-07-29 11:11:33','2006-02-15 22:12:32'),(373,14,2,8836,'4.99','2005-07-29 22:46:08','2006-02-15 22:12:32'),(374,14,2,9438,'4.99','2005-07-30 21:36:15','2006-02-15 22:12:32'),(375,14,1,9592,'2.99','2005-07-31 03:21:16','2006-02-15 22:12:32'),(376,14,1,10348,'2.99','2005-08-01 05:23:00','2006-02-15 22:12:32'),(377,14,2,10526,'6.99','2005-08-01 11:55:33','2006-02-15 22:12:32'),(378,14,1,11480,'4.99','2005-08-02 22:18:24','2006-02-15 22:12:32'),(379,14,2,11528,'3.99','2005-08-17 00:27:23','2006-02-15 22:12:32'),(380,14,1,12668,'2.99','2005-08-18 19:16:47','2006-02-15 22:12:32'),(381,14,1,13757,'4.99','2005-08-20 11:20:12','2006-02-15 22:12:32'),(382,14,2,15015,'6.99','2005-08-22 08:43:50','2006-02-15 22:12:32'),(383,14,1,15373,'0.99','2005-08-22 22:08:11','2006-02-15 22:12:32'),(384,14,1,16045,'0.99','2005-08-23 22:25:26','2006-02-15 22:12:32'),(385,14,1,13780,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:32'),(386,15,1,2486,'2.99','2005-06-18 21:26:56','2006-02-15 22:12:32'),(387,15,1,2937,'5.99','2005-06-20 05:15:37','2006-02-15 22:12:32'),(388,15,2,3182,'0.99','2005-06-20 22:52:18','2006-02-15 22:12:32'),(389,15,1,3550,'7.99','2005-07-06 02:29:21','2006-02-15 22:12:32'),(390,15,1,4127,'5.99','2005-07-07 07:26:19','2006-02-15 22:12:32'),(391,15,1,5717,'2.99','2005-07-10 11:02:03','2006-02-15 22:12:32'),(392,15,2,5975,'2.99','2005-07-11 00:14:19','2006-02-15 22:12:32'),(393,15,1,7105,'4.99','2005-07-27 05:15:37','2006-02-15 22:12:32'),(394,15,1,8193,'0.99','2005-07-28 22:50:50','2006-02-15 22:12:32'),(395,15,2,8615,'6.99','2005-07-29 13:36:01','2006-02-15 22:12:32'),(396,15,2,8927,'4.99','2005-07-30 02:13:31','2006-02-15 22:12:32'),(397,15,1,9987,'2.99','2005-07-31 17:22:35','2006-02-15 22:12:32'),(398,15,1,11118,'2.99','2005-08-02 08:44:18','2006-02-15 22:12:32'),(399,15,1,11141,'2.99','2005-08-02 09:29:11','2006-02-15 22:12:32'),(400,15,2,11307,'2.99','2005-08-02 15:48:08','2006-02-15 22:12:32'),(401,15,2,11341,'2.99','2005-08-02 17:09:24','2006-02-15 22:12:32'),(402,15,1,11922,'7.99','2005-08-17 16:20:37','2006-02-15 22:12:32'),(403,15,2,12272,'2.99','2005-08-18 04:39:10','2006-02-15 22:12:32'),(404,15,2,12551,'2.99','2005-08-18 14:46:26','2006-02-15 22:12:32'),(405,15,1,12635,'2.99','2005-08-18 18:00:23','2006-02-15 22:12:32'),(406,15,2,13339,'8.99','2005-08-19 20:18:36','2006-02-15 22:12:32'),(407,15,1,13393,'5.99','2005-08-19 22:03:46','2006-02-15 22:12:32'),(408,15,2,13503,'5.99','2005-08-20 02:00:33','2006-02-15 22:12:32'),(409,15,1,13541,'4.99','2005-08-20 03:41:41','2006-02-15 22:12:32'),(410,15,2,13677,'3.99','2005-08-20 08:34:41','2006-02-15 22:12:32'),(411,15,2,14569,'0.99','2005-08-21 16:31:22','2006-02-15 22:12:32'),(412,15,2,14776,'4.99','2005-08-21 23:53:35','2006-02-15 22:12:32'),(413,15,2,14872,'8.99','2005-08-22 03:23:41','2006-02-15 22:12:32'),(414,15,1,15178,'0.99','2005-08-22 15:36:04','2006-02-15 22:12:32'),(415,15,1,15897,'4.99','2005-08-23 17:12:31','2006-02-15 22:12:32'),(416,15,1,13798,'3.98','2006-02-14 15:16:03','2006-02-15 22:12:32'),(417,15,2,13968,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:32'),(418,16,1,335,'3.99','2005-05-27 03:07:10','2006-02-15 22:12:32'),(419,16,1,593,'2.99','2005-05-28 13:33:23','2006-02-15 22:12:32'),(420,16,2,887,'0.99','2005-05-30 07:10:00','2006-02-15 22:12:32'),(421,16,1,1017,'2.99','2005-05-31 02:53:36','2006-02-15 22:12:32'),(422,16,2,1934,'6.99','2005-06-17 07:04:57','2006-02-15 22:12:32'),(423,16,1,1944,'7.99','2005-06-17 07:50:53','2006-02-15 22:12:32'),(424,16,1,NULL,'1.99','2005-06-18 04:56:12','2006-02-15 22:12:32'),(425,16,1,2960,'7.99','2005-06-20 07:10:09','2006-02-15 22:12:32'),(426,16,2,3348,'0.99','2005-06-21 11:16:42','2006-02-15 22:12:32'),(427,16,1,3548,'0.99','2005-07-06 02:23:39','2006-02-15 22:12:32'),(428,16,2,4219,'2.99','2005-07-07 12:11:22','2006-02-15 22:12:32'),(429,16,2,4263,'3.99','2005-07-07 14:24:44','2006-02-15 22:12:32'),(430,16,2,4517,'4.99','2005-07-08 02:45:19','2006-02-15 22:12:32'),(431,16,1,6100,'4.99','2005-07-11 06:40:31','2006-02-15 22:12:32'),(432,16,2,7489,'0.99','2005-07-27 19:39:38','2006-02-15 22:12:32'),(433,16,2,7552,'2.99','2005-07-27 22:03:41','2006-02-15 22:12:32'),(434,16,2,8452,'5.99','2005-07-29 07:45:00','2006-02-15 22:12:32'),(435,16,2,9158,'0.99','2005-07-30 11:12:03','2006-02-15 22:12:32'),(436,16,2,9610,'5.99','2005-07-31 03:54:05','2006-02-15 22:12:32'),(437,16,2,10687,'2.99','2005-08-01 17:53:02','2006-02-15 22:12:32'),(438,16,2,10727,'2.99','2005-08-01 19:15:08','2006-02-15 22:12:32'),(439,16,2,11308,'0.99','2005-08-02 15:50:44','2006-02-15 22:12:32'),(440,16,2,12104,'2.99','2005-08-17 22:53:00','2006-02-15 22:12:32'),(441,16,1,12358,'4.99','2005-08-18 07:41:43','2006-02-15 22:12:32'),(442,16,1,12577,'7.99','2005-08-18 15:39:46','2006-02-15 22:12:32'),(443,16,2,13151,'4.99','2005-08-19 13:08:23','2006-02-15 22:12:32'),(444,16,1,13391,'4.99','2005-08-19 22:01:42','2006-02-15 22:12:32'),(445,16,1,13480,'6.99','2005-08-20 01:10:27','2006-02-15 22:12:32'),(446,16,1,14511,'8.99','2005-08-21 14:45:34','2006-02-15 22:12:32'),(447,17,2,287,'2.99','2005-05-26 19:44:54','2006-02-15 22:12:32'),(448,17,1,580,'2.99','2005-05-28 11:19:53','2006-02-15 22:12:32'),(449,17,2,884,'4.99','2005-05-30 06:41:32','2006-02-15 22:12:32'),(450,17,2,2175,'5.99','2005-06-18 00:17:58','2006-02-15 22:12:32'),(451,17,1,2684,'8.99','2005-06-19 12:29:08','2006-02-15 22:12:32'),(452,17,2,3269,'5.99','2005-06-21 05:06:30','2006-02-15 22:12:32'),(453,17,1,5714,'3.99','2005-07-10 10:46:57','2006-02-15 22:12:32'),(454,17,1,5883,'3.99','2005-07-10 19:25:21','2006-02-15 22:12:32'),(455,17,2,6884,'1.99','2005-07-12 20:52:41','2006-02-15 22:12:32'),(456,17,2,8076,'8.99','2005-07-28 17:45:58','2006-02-15 22:12:32'),(457,17,1,8213,'2.99','2005-07-28 23:37:33','2006-02-15 22:12:32'),(458,17,2,9092,'8.99','2005-07-30 08:30:56','2006-02-15 22:12:32'),(459,17,1,9138,'2.99','2005-07-30 10:11:52','2006-02-15 22:12:32'),(460,17,2,9382,'8.99','2005-07-30 19:23:44','2006-02-15 22:12:32'),(461,17,1,9489,'0.99','2005-07-30 23:43:32','2006-02-15 22:12:32'),(462,17,2,11990,'4.99','2005-08-17 18:26:22','2006-02-15 22:12:32'),(463,17,1,13732,'2.99','2005-08-20 10:24:41','2006-02-15 22:12:32'),(464,17,1,14040,'2.99','2005-08-20 21:43:44','2006-02-15 22:12:32'),(465,17,2,14326,'2.99','2005-08-21 08:15:41','2006-02-15 22:12:32'),(466,17,1,14346,'2.99','2005-08-21 08:42:26','2006-02-15 22:12:32'),(467,17,2,15752,'5.99','2005-08-23 12:41:38','2006-02-15 22:12:32'),(468,18,1,50,'2.99','2005-05-25 06:44:53','2006-02-15 22:12:32'),(469,18,1,116,'4.99','2005-05-25 19:27:51','2006-02-15 22:12:32'),(470,18,1,692,'4.99','2005-05-29 01:32:10','2006-02-15 22:12:32'),(471,18,2,1451,'5.99','2005-06-15 19:30:18','2006-02-15 22:12:32'),(472,18,2,1783,'4.99','2005-06-16 19:23:23','2006-02-15 22:12:32'),(473,18,2,2112,'5.99','2005-06-17 19:52:42','2006-02-15 22:12:32'),(474,18,1,2990,'8.99','2005-06-20 09:02:51','2006-02-15 22:12:32'),(475,18,2,4672,'3.99','2005-07-08 10:15:38','2006-02-15 22:12:32'),(476,18,2,4724,'3.99','2005-07-08 12:46:30','2006-02-15 22:12:32'),(477,18,2,4923,'3.99','2005-07-08 21:44:39','2006-02-15 22:12:32'),(478,18,2,6128,'2.99','2005-07-11 08:15:08','2006-02-15 22:12:32'),(479,18,1,6846,'0.99','2005-07-12 19:20:45','2006-02-15 22:12:32'),(480,18,2,8122,'2.99','2005-07-28 19:27:37','2006-02-15 22:12:32'),(481,18,1,8555,'4.99','2005-07-29 11:18:01','2006-02-15 22:12:32'),(482,18,1,9036,'4.99','2005-07-30 06:18:38','2006-02-15 22:12:32'),(483,18,2,9114,'4.99','2005-07-30 09:13:21','2006-02-15 22:12:32'),(484,18,1,10682,'4.99','2005-08-01 17:32:53','2006-02-15 22:12:32'),(485,18,2,10721,'1.99','2005-08-01 19:05:18','2006-02-15 22:12:32'),(486,18,2,11094,'4.99','2005-08-02 08:03:02','2006-02-15 22:12:33'),(487,18,2,11439,'4.99','2005-08-02 20:22:45','2006-02-15 22:12:33'),(488,18,2,12333,'0.99','2005-08-18 06:51:39','2006-02-15 22:12:33'),(489,18,2,13490,'0.99','2005-08-20 01:29:29','2006-02-15 22:12:33'),(490,19,2,18,'0.99','2005-05-25 01:10:47','2006-02-15 22:12:33'),(491,19,2,110,'9.99','2005-05-25 18:43:49','2006-02-15 22:12:33'),(492,19,1,179,'6.99','2005-05-26 04:26:06','2006-02-15 22:12:33'),(493,19,1,337,'2.99','2005-05-27 03:22:30','2006-02-15 22:12:33'),(494,19,2,591,'2.99','2005-05-28 13:11:04','2006-02-15 22:12:33'),(495,19,2,696,'2.99','2005-05-29 01:59:10','2006-02-15 22:12:33'),(496,19,1,2657,'2.99','2005-06-19 10:42:59','2006-02-15 22:12:33'),(497,19,1,2848,'2.99','2005-06-19 22:55:37','2006-02-15 22:12:33'),(498,19,2,3423,'2.99','2005-06-21 17:38:02','2006-02-15 22:12:33'),(499,19,2,3549,'4.99','2005-07-06 02:24:55','2006-02-15 22:12:33'),(500,19,2,6495,'4.99','2005-07-12 02:57:02','2006-02-15 22:12:33'),(501,19,1,9157,'5.99','2005-07-30 11:06:23','2006-02-15 22:12:33'),(502,19,1,9256,'0.99','2005-07-30 14:29:29','2006-02-15 22:12:33'),(503,19,2,10077,'9.99','2005-07-31 20:01:06','2006-02-15 22:12:33'),(504,19,1,10176,'7.99','2005-07-31 23:40:35','2006-02-15 22:12:33'),(505,19,2,11508,'8.99','2005-08-16 23:27:36','2006-02-15 22:12:33'),(506,19,1,11869,'5.99','2005-08-17 14:10:22','2006-02-15 22:12:33'),(507,19,1,12211,'9.99','2005-08-18 02:31:18','2006-02-15 22:12:33'),(508,19,2,12357,'2.99','2005-08-18 07:40:52','2006-02-15 22:12:33'),(509,19,1,13718,'8.99','2005-08-20 09:53:44','2006-02-15 22:12:33'),(510,19,2,13804,'8.99','2005-08-20 12:46:32','2006-02-15 22:12:33'),(511,19,1,14101,'4.99','2005-08-21 00:33:03','2006-02-15 22:12:33'),(512,19,1,15047,'2.99','2005-08-22 09:57:16','2006-02-15 22:12:33'),(513,19,2,15529,'0.99','2005-08-23 03:46:47','2006-02-15 22:12:33'),(514,20,2,202,'2.99','2005-05-26 07:27:36','2006-02-15 22:12:33'),(515,20,2,497,'6.99','2005-05-28 00:54:39','2006-02-15 22:12:33'),(516,20,2,546,'1.99','2005-05-28 07:16:25','2006-02-15 22:12:33'),(517,20,2,1558,'0.99','2005-06-16 02:33:53','2006-02-15 22:12:33'),(518,20,2,2136,'3.99','2005-06-17 21:16:41','2006-02-15 22:12:33'),(519,20,2,2343,'4.99','2005-06-18 11:46:26','2006-02-15 22:12:33'),(520,20,1,3350,'4.99','2005-06-21 11:21:38','2006-02-15 22:12:33'),(521,20,2,4011,'3.99','2005-07-07 00:48:25','2006-02-15 22:12:33'),(522,20,1,4407,'2.99','2005-07-07 21:39:45','2006-02-15 22:12:33'),(523,20,1,5718,'2.99','2005-07-10 11:03:20','2006-02-15 22:12:33'),(524,20,1,6254,'2.99','2005-07-11 15:10:18','2006-02-15 22:12:33'),(525,20,2,6267,'6.99','2005-07-11 15:53:00','2006-02-15 22:12:33'),(526,20,2,7217,'4.99','2005-07-27 09:31:44','2006-02-15 22:12:33'),(527,20,2,7864,'5.99','2005-07-28 10:06:10','2006-02-15 22:12:33'),(528,20,2,8127,'2.99','2005-07-28 19:45:19','2006-02-15 22:12:33'),(529,20,2,9075,'4.99','2005-07-30 07:55:14','2006-02-15 22:12:33'),(530,20,2,9468,'3.99','2005-07-30 22:53:52','2006-02-15 22:12:33'),(531,20,2,10284,'4.99','2005-08-01 03:33:19','2006-02-15 22:12:33'),(532,20,1,10616,'7.99','2005-08-01 14:59:50','2006-02-15 22:12:33'),(533,20,1,10954,'1.99','2005-08-02 03:30:24','2006-02-15 22:12:33'),(534,20,1,11821,'0.99','2005-08-17 12:27:55','2006-02-15 22:12:33'),(535,20,1,12180,'0.99','2005-08-18 01:28:15','2006-02-15 22:12:33'),(536,20,2,13036,'4.99','2005-08-19 08:48:37','2006-02-15 22:12:33'),(537,20,1,13137,'4.99','2005-08-19 12:26:32','2006-02-15 22:12:33'),(538,20,2,13317,'2.99','2005-08-19 19:25:42','2006-02-15 22:12:33'),(539,20,2,14613,'2.99','2005-08-21 18:03:20','2006-02-15 22:12:33'),(540,20,2,15057,'6.99','2005-08-22 10:19:58','2006-02-15 22:12:33'),(541,20,1,15161,'1.99','2005-08-22 14:37:22','2006-02-15 22:12:33'),(542,20,2,15248,'0.99','2005-08-22 17:53:06','2006-02-15 22:12:33'),(543,20,1,15460,'2.99','2005-08-23 01:10:42','2006-02-15 22:12:33'),(544,21,1,260,'3.99','2005-05-26 15:42:20','2006-02-15 22:12:33'),(545,21,2,463,'3.99','2005-05-27 20:11:47','2006-02-15 22:12:33'),(546,21,1,570,'0.99','2005-05-28 10:15:04','2006-02-15 22:12:33'),(547,21,2,2235,'7.99','2005-06-18 04:08:50','2006-02-15 22:12:33'),(548,21,1,2268,'4.99','2005-06-18 06:13:41','2006-02-15 22:12:33'),(549,21,1,2393,'2.99','2005-06-18 15:37:55','2006-02-15 22:12:33'),(550,21,2,2830,'4.99','2005-06-19 21:14:33','2006-02-15 22:12:33'),(551,21,1,3212,'10.99','2005-06-21 01:04:35','2006-02-15 22:12:33'),(552,21,2,5107,'4.99','2005-07-09 06:42:32','2006-02-15 22:12:33'),(553,21,1,5772,'3.99','2005-07-10 13:27:40','2006-02-15 22:12:33'),(554,21,1,5961,'2.99','2005-07-10 23:43:23','2006-02-15 22:12:33'),(555,21,2,6943,'1.99','2005-07-26 23:28:13','2006-02-15 22:12:33'),(556,21,1,7994,'0.99','2005-07-28 14:56:54','2006-02-15 22:12:33'),(557,21,2,8196,'6.99','2005-07-28 22:56:11','2006-02-15 22:12:33'),(558,21,2,8862,'2.99','2005-07-29 23:49:23','2006-02-15 22:12:33'),(559,21,2,9149,'0.99','2005-07-30 10:45:12','2006-02-15 22:12:33'),(560,21,1,9699,'5.99','2005-07-31 07:29:25','2006-02-15 22:12:33'),(561,21,2,10570,'4.99','2005-08-01 13:23:06','2006-02-15 22:12:33'),(562,21,1,10734,'0.99','2005-08-01 19:28:47','2006-02-15 22:12:33'),(563,21,2,11072,'0.99','2005-08-02 07:10:57','2006-02-15 22:12:33'),(564,21,2,11970,'0.99','2005-08-17 17:53:09','2006-02-15 22:12:33'),(565,21,2,12131,'2.99','2005-08-17 23:34:16','2006-02-15 22:12:33'),(566,21,2,12660,'4.99','2005-08-18 19:07:23','2006-02-15 22:12:33'),(567,21,1,12774,'6.99','2005-08-18 23:34:22','2006-02-15 22:12:33'),(568,21,1,13381,'2.99','2005-08-19 21:37:57','2006-02-15 22:12:33'),(569,21,2,13399,'4.99','2005-08-19 22:09:28','2006-02-15 22:12:33'),(570,21,1,13411,'4.99','2005-08-19 22:43:38','2006-02-15 22:12:33'),(571,21,1,13463,'8.99','2005-08-20 00:50:54','2006-02-15 22:12:33'),(572,21,1,13699,'9.99','2005-08-20 09:26:14','2006-02-15 22:12:33'),(573,21,1,13740,'4.99','2005-08-20 10:48:43','2006-02-15 22:12:33'),(574,21,2,14077,'8.99','2005-08-20 23:24:07','2006-02-15 22:12:33'),(575,21,2,14161,'2.99','2005-08-21 02:51:59','2006-02-15 22:12:33'),(576,21,2,14446,'2.99','2005-08-21 12:10:41','2006-02-15 22:12:33'),(577,21,1,14869,'4.99','2005-08-22 03:20:26','2006-02-15 22:12:33'),(578,21,1,14933,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:33'),(579,22,1,370,'4.99','2005-05-27 07:49:43','2006-02-15 22:12:33'),(580,22,1,556,'4.99','2005-05-28 08:31:36','2006-02-15 22:12:33'),(581,22,2,820,'8.99','2005-05-29 21:07:22','2006-02-15 22:12:33'),(582,22,1,3419,'2.99','2005-06-21 17:18:01','2006-02-15 22:12:33'),(583,22,2,4215,'2.99','2005-07-07 12:00:52','2006-02-15 22:12:33'),(584,22,1,5294,'6.99','2005-07-09 15:23:42','2006-02-15 22:12:33'),(585,22,1,5815,'2.99','2005-07-10 15:48:19','2006-02-15 22:12:33'),(586,22,1,7087,'4.99','2005-07-27 04:42:08','2006-02-15 22:12:33'),(587,22,1,7705,'7.99','2005-07-28 04:02:58','2006-02-15 22:12:33'),(588,22,2,9410,'0.99','2005-07-30 20:38:05','2006-02-15 22:12:33'),(589,22,1,9580,'4.99','2005-07-31 03:01:11','2006-02-15 22:12:33'),(590,22,1,12023,'5.99','2005-08-17 19:54:54','2006-02-15 22:12:33'),(591,22,1,12124,'2.99','2005-08-17 23:22:46','2006-02-15 22:12:33'),(592,22,2,12809,'0.99','2005-08-19 00:42:24','2006-02-15 22:12:33'),(593,22,2,13060,'9.99','2005-08-19 09:43:25','2006-02-15 22:12:33'),(594,22,1,14056,'2.99','2005-08-20 22:18:53','2006-02-15 22:12:33'),(595,22,1,14564,'6.99','2005-08-21 16:24:43','2006-02-15 22:12:33'),(596,22,1,15134,'7.99','2005-08-22 13:18:25','2006-02-15 22:12:33'),(597,22,1,15589,'6.99','2005-08-23 06:03:31','2006-02-15 22:12:33'),(598,22,1,15658,'4.99','2005-08-23 08:48:43','2006-02-15 22:12:33'),(599,22,1,15793,'4.99','2005-08-23 14:06:19','2006-02-15 22:12:33'),(600,22,1,12222,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:33'),(601,23,1,129,'8.99','2005-05-25 21:20:03','2006-02-15 22:12:33'),(602,23,1,654,'2.99','2005-05-28 20:15:30','2006-02-15 22:12:33'),(603,23,2,1090,'0.99','2005-05-31 12:03:44','2006-02-15 22:12:33'),(604,23,1,2753,'1.99','2005-06-19 16:44:35','2006-02-15 22:12:33'),(605,23,1,2827,'0.99','2005-06-19 20:50:01','2006-02-15 22:12:33'),(606,23,1,3015,'5.99','2005-06-20 10:48:56','2006-02-15 22:12:33'),(607,23,1,3055,'4.99','2005-06-20 13:19:58','2006-02-15 22:12:33'),(608,23,1,3461,'2.99','2005-06-21 21:49:18','2006-02-15 22:12:34'),(609,23,2,3736,'3.99','2005-07-06 11:43:44','2006-02-15 22:12:34'),(610,23,2,3781,'2.99','2005-07-06 13:53:41','2006-02-15 22:12:34'),(611,23,2,4853,'2.99','2005-07-08 18:43:18','2006-02-15 22:12:34'),(612,23,1,6213,'2.99','2005-07-11 12:43:07','2006-02-15 22:12:34'),(613,23,1,6238,'2.99','2005-07-11 14:20:18','2006-02-15 22:12:34'),(614,23,2,6917,'5.99','2005-07-12 22:30:15','2006-02-15 22:12:34'),(615,23,1,7155,'7.99','2005-07-27 07:18:46','2006-02-15 22:12:34'),(616,23,1,8015,'2.99','2005-07-28 15:33:03','2006-02-15 22:12:34'),(617,23,2,8718,'0.99','2005-07-29 17:41:14','2006-02-15 22:12:34'),(618,23,2,9209,'5.99','2005-07-30 12:55:36','2006-02-15 22:12:34'),(619,23,2,9255,'9.99','2005-07-30 14:26:46','2006-02-15 22:12:34'),(620,23,2,9718,'3.99','2005-07-31 08:25:03','2006-02-15 22:12:34'),(621,23,1,10132,'6.99','2005-07-31 21:50:24','2006-02-15 22:12:34'),(622,23,1,10898,'2.99','2005-08-02 01:29:57','2006-02-15 22:12:34'),(623,23,2,11501,'2.99','2005-08-16 23:04:53','2006-02-15 22:12:34'),(624,23,2,13290,'2.99','2005-08-19 18:31:50','2006-02-15 22:12:34'),(625,23,2,13331,'4.99','2005-08-19 20:00:25','2006-02-15 22:12:34'),(626,23,2,13429,'6.99','2005-08-19 23:25:37','2006-02-15 22:12:34'),(627,23,2,13511,'0.99','2005-08-20 02:21:40','2006-02-15 22:12:34'),(628,23,2,13557,'0.99','2005-08-20 04:12:41','2006-02-15 22:12:34'),(629,23,2,14482,'2.99','2005-08-21 13:42:45','2006-02-15 22:12:34'),(630,23,2,15532,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:34'),(631,24,2,1007,'6.99','2005-05-31 01:02:28','2006-02-15 22:12:34'),(632,24,2,1077,'2.99','2005-05-31 10:22:54','2006-02-15 22:12:34'),(633,24,1,1716,'2.99','2005-06-16 14:39:31','2006-02-15 22:12:34'),(634,24,1,2070,'2.99','2005-06-17 16:27:51','2006-02-15 22:12:34'),(635,24,2,2116,'4.99','2005-06-17 20:16:12','2006-02-15 22:12:34'),(636,24,1,2451,'5.99','2005-06-18 19:28:02','2006-02-15 22:12:34'),(637,24,2,2963,'7.99','2005-06-20 07:33:09','2006-02-15 22:12:34'),(638,24,2,3649,'7.99','2005-07-06 07:32:42','2006-02-15 22:12:34'),(639,24,2,4378,'2.99','2005-07-07 20:29:08','2006-02-15 22:12:34'),(640,24,1,5310,'0.99','2005-07-09 16:00:34','2006-02-15 22:12:34'),(641,24,2,5648,'0.99','2005-07-10 07:09:21','2006-02-15 22:12:34'),(642,24,1,6855,'4.99','2005-07-12 19:46:29','2006-02-15 22:12:34'),(643,24,1,7266,'1.99','2005-07-27 11:22:17','2006-02-15 22:12:34'),(644,24,1,8947,'4.99','2005-07-30 03:15:37','2006-02-15 22:12:34'),(645,24,1,9723,'0.99','2005-07-31 08:31:18','2006-02-15 22:12:34'),(646,24,2,9925,'0.99','2005-07-31 15:08:47','2006-02-15 22:12:34'),(647,24,2,10491,'2.99','2005-08-01 10:38:27','2006-02-15 22:12:34'),(648,24,1,11209,'2.99','2005-08-02 12:09:45','2006-02-15 22:12:34'),(649,24,2,11546,'2.99','2005-08-17 00:57:36','2006-02-15 22:12:34'),(650,24,2,12165,'8.99','2005-08-18 00:53:37','2006-02-15 22:12:34'),(651,24,1,12745,'2.99','2005-08-18 22:22:45','2006-02-15 22:12:34'),(652,24,1,12999,'1.99','2005-08-19 07:34:53','2006-02-15 22:12:34'),(653,24,2,13058,'4.99','2005-08-19 09:40:53','2006-02-15 22:12:34'),(654,24,1,13247,'0.99','2005-08-19 16:45:59','2006-02-15 22:12:34'),(655,24,2,15357,'4.99','2005-08-22 21:28:59','2006-02-15 22:12:34'),(656,25,1,90,'7.99','2005-05-25 14:31:25','2006-02-15 22:12:34'),(657,25,2,1033,'2.99','2005-05-31 04:50:07','2006-02-15 22:12:34'),(658,25,1,1338,'4.99','2005-06-15 12:17:34','2006-02-15 22:12:34'),(659,25,1,1365,'2.99','2005-06-15 14:09:55','2006-02-15 22:12:34'),(660,25,2,1754,'6.99','2005-06-16 17:13:23','2006-02-15 22:12:34'),(661,25,2,2625,'8.99','2005-06-19 08:23:11','2006-02-15 22:12:34'),(662,25,1,2901,'4.99','2005-06-20 02:41:28','2006-02-15 22:12:34'),(663,25,1,3447,'4.99','2005-06-21 20:53:31','2006-02-15 22:12:34'),(664,25,1,4282,'2.99','2005-07-07 15:26:31','2006-02-15 22:12:34'),(665,25,1,4319,'0.99','2005-07-07 17:50:27','2006-02-15 22:12:34'),(666,25,2,4404,'2.99','2005-07-07 21:31:53','2006-02-15 22:12:34'),(667,25,1,5881,'2.99','2005-07-10 19:19:43','2006-02-15 22:12:34'),(668,25,1,6653,'4.99','2005-07-12 11:06:17','2006-02-15 22:12:34'),(669,25,2,6905,'2.99','2005-07-12 22:02:18','2006-02-15 22:12:34'),(670,25,2,8667,'2.99','2005-07-29 15:40:57','2006-02-15 22:12:34'),(671,25,2,8878,'0.99','2005-07-30 00:15:57','2006-02-15 22:12:34'),(672,25,1,9140,'8.99','2005-07-30 10:12:01','2006-02-15 22:12:34'),(673,25,2,9334,'2.99','2005-07-30 17:56:38','2006-02-15 22:12:34'),(674,25,2,9922,'2.99','2005-07-31 14:59:37','2006-02-15 22:12:34'),(675,25,2,10103,'2.99','2005-07-31 20:49:13','2006-02-15 22:12:34'),(676,25,1,10324,'5.99','2005-08-01 04:49:06','2006-02-15 22:12:34'),(677,25,2,10860,'2.99','2005-08-02 00:12:32','2006-02-15 22:12:34'),(678,25,1,10916,'2.99','2005-08-02 02:05:59','2006-02-15 22:12:34'),(679,25,1,11642,'0.99','2005-08-17 04:48:05','2006-02-15 22:12:34'),(680,25,1,12922,'0.99','2005-08-19 04:48:48','2006-02-15 22:12:34'),(681,25,1,14193,'4.99','2005-08-21 03:38:27','2006-02-15 22:12:34'),(682,25,1,14236,'4.99','2005-08-21 05:13:16','2006-02-15 22:12:34'),(683,25,1,15512,'0.99','2005-08-23 02:57:30','2006-02-15 22:12:34'),(684,25,1,15972,'5.99','2005-08-23 20:00:30','2006-02-15 22:12:34'),(685,26,1,796,'2.99','2005-05-29 16:59:44','2006-02-15 22:12:34'),(686,26,2,1105,'2.99','2005-05-31 14:33:56','2006-02-15 22:12:34'),(687,26,1,1440,'5.99','2005-06-15 18:53:14','2006-02-15 22:12:34'),(688,26,2,1706,'4.99','2005-06-16 14:01:02','2006-02-15 22:12:34'),(689,26,1,2093,'9.99','2005-06-17 18:14:08','2006-02-15 22:12:34'),(690,26,2,2416,'3.99','2005-06-18 17:07:34','2006-02-15 22:12:34'),(691,26,2,2421,'6.99','2005-06-18 17:25:05','2006-02-15 22:12:34'),(692,26,1,2532,'4.99','2005-06-19 01:27:46','2006-02-15 22:12:34'),(693,26,1,2745,'4.99','2005-06-19 16:21:19','2006-02-15 22:12:34'),(694,26,1,4065,'2.99','2005-07-07 04:32:28','2006-02-15 22:12:34'),(695,26,1,4274,'4.99','2005-07-07 14:42:04','2006-02-15 22:12:34'),(696,26,1,4382,'4.99','2005-07-07 20:41:03','2006-02-15 22:12:34'),(697,26,2,4402,'0.99','2005-07-07 21:28:46','2006-02-15 22:12:34'),(698,26,1,4431,'6.99','2005-07-07 22:39:02','2006-02-15 22:12:34'),(699,26,1,4536,'3.99','2005-07-08 03:43:22','2006-02-15 22:12:34'),(700,26,1,4641,'6.99','2005-07-08 09:09:46','2006-02-15 22:12:34'),(701,26,1,5437,'2.99','2005-07-09 21:32:29','2006-02-15 22:12:34'),(702,26,1,6149,'1.99','2005-07-11 09:19:31','2006-02-15 22:12:34'),(703,26,2,6243,'2.99','2005-07-11 14:53:25','2006-02-15 22:12:34'),(704,26,2,7328,'0.99','2005-07-27 13:55:18','2006-02-15 22:12:34'),(705,26,1,8241,'4.99','2005-07-29 00:33:36','2006-02-15 22:12:34'),(706,26,1,9484,'0.99','2005-07-30 23:31:40','2006-02-15 22:12:34'),(707,26,1,10386,'3.99','2005-08-01 06:42:20','2006-02-15 22:12:34'),(708,26,1,10996,'3.99','2005-08-02 04:48:11','2006-02-15 22:12:34'),(709,26,2,11314,'2.99','2005-08-02 16:04:08','2006-02-15 22:12:34'),(710,26,1,11338,'0.99','2005-08-02 17:00:12','2006-02-15 22:12:34'),(711,26,1,11744,'5.99','2005-08-17 08:54:30','2006-02-15 22:12:34'),(712,26,2,13111,'4.99','2005-08-19 11:25:10','2006-02-15 22:12:34'),(713,26,2,14183,'4.99','2005-08-21 03:24:29','2006-02-15 22:12:34'),(714,26,2,14192,'8.99','2005-08-21 03:37:42','2006-02-15 22:12:34'),(715,26,2,14603,'1.99','2005-08-21 17:51:06','2006-02-15 22:12:34'),(716,26,1,14677,'7.99','2005-08-21 20:12:30','2006-02-15 22:12:34'),(717,26,1,15384,'2.99','2005-08-22 22:34:44','2006-02-15 22:12:34'),(718,26,1,15722,'7.99','2005-08-23 11:16:29','2006-02-15 22:12:34'),(719,27,2,787,'2.99','2005-05-29 16:03:03','2006-02-15 22:12:34'),(720,27,1,1310,'4.99','2005-06-15 10:11:42','2006-02-15 22:12:35'),(721,27,2,1480,'4.99','2005-06-15 21:17:17','2006-02-15 22:12:35'),(722,27,2,1699,'2.99','2005-06-16 13:05:09','2006-02-15 22:12:35'),(723,27,2,1960,'3.99','2005-06-17 08:59:57','2006-02-15 22:12:35'),(724,27,2,2512,'2.99','2005-06-18 23:48:47','2006-02-15 22:12:35'),(725,27,1,2815,'4.99','2005-06-19 20:03:29','2006-02-15 22:12:35'),(726,27,1,3038,'1.99','2005-06-20 12:28:59','2006-02-15 22:12:35'),(727,27,2,3420,'3.99','2005-06-21 17:22:36','2006-02-15 22:12:35'),(728,27,2,4038,'0.99','2005-07-07 02:52:53','2006-02-15 22:12:35'),(729,27,1,4510,'5.99','2005-07-08 02:34:51','2006-02-15 22:12:35'),(730,27,1,5552,'0.99','2005-07-10 03:01:19','2006-02-15 22:12:35'),(731,27,1,5736,'4.99','2005-07-10 11:45:48','2006-02-15 22:12:35'),(732,27,2,6115,'0.99','2005-07-11 07:36:50','2006-02-15 22:12:35'),(733,27,2,6562,'5.99','2005-07-12 05:26:26','2006-02-15 22:12:35'),(734,27,2,6658,'4.99','2005-07-12 11:13:21','2006-02-15 22:12:35'),(735,27,1,7927,'1.99','2005-07-28 12:13:42','2006-02-15 22:12:35'),(736,27,2,9244,'0.99','2005-07-30 14:06:53','2006-02-15 22:12:35'),(737,27,2,9636,'5.99','2005-07-31 05:12:59','2006-02-15 22:12:35'),(738,27,1,9673,'7.99','2005-07-31 06:34:55','2006-02-15 22:12:35'),(739,27,1,9908,'4.99','2005-07-31 14:39:52','2006-02-15 22:12:35'),(740,27,1,10794,'7.99','2005-08-01 21:51:15','2006-02-15 22:12:35'),(741,27,1,10852,'4.99','2005-08-02 00:00:33','2006-02-15 22:12:35'),(742,27,1,11234,'0.99','2005-08-02 13:12:17','2006-02-15 22:12:35'),(743,27,1,11661,'8.99','2005-08-17 05:25:57','2006-02-15 22:12:35'),(744,27,2,11740,'6.99','2005-08-17 08:48:31','2006-02-15 22:12:35'),(745,27,2,12021,'5.99','2005-08-17 19:52:43','2006-02-15 22:12:35'),(746,27,2,12461,'0.99','2005-08-18 11:28:14','2006-02-15 22:12:35'),(747,27,1,12531,'2.99','2005-08-18 13:57:50','2006-02-15 22:12:35'),(748,27,2,13816,'4.99','2005-08-20 13:13:56','2006-02-15 22:12:35'),(749,27,1,15048,'0.99','2005-08-22 10:00:04','2006-02-15 22:12:35'),(750,28,2,388,'2.99','2005-05-27 10:37:27','2006-02-15 22:12:35'),(751,28,1,868,'2.99','2005-05-30 04:19:55','2006-02-15 22:12:35'),(752,28,2,1240,'2.99','2005-06-15 04:58:07','2006-02-15 22:12:35'),(753,28,1,1543,'4.99','2005-06-16 01:24:08','2006-02-15 22:12:35'),(754,28,2,2299,'3.99','2005-06-18 08:18:52','2006-02-15 22:12:35'),(755,28,2,2604,'0.99','2005-06-19 06:30:10','2006-02-15 22:12:35'),(756,28,1,3231,'0.99','2005-06-21 02:25:00','2006-02-15 22:12:35'),(757,28,1,3845,'0.99','2005-07-06 16:38:14','2006-02-15 22:12:35'),(758,28,2,4704,'0.99','2005-07-08 11:45:35','2006-02-15 22:12:35'),(759,28,2,4951,'4.99','2005-07-08 22:58:21','2006-02-15 22:12:35'),(760,28,2,5653,'2.99','2005-07-10 07:21:27','2006-02-15 22:12:35'),(761,28,1,5817,'5.99','2005-07-10 15:49:12','2006-02-15 22:12:35'),(762,28,2,6032,'0.99','2005-07-11 02:49:01','2006-02-15 22:12:35'),(763,28,2,6476,'0.99','2005-07-12 01:37:48','2006-02-15 22:12:35'),(764,28,1,7580,'9.99','2005-07-27 23:07:40','2006-02-15 22:12:35'),(765,28,1,8464,'4.99','2005-07-29 08:18:20','2006-02-15 22:12:35'),(766,28,1,8901,'2.99','2005-07-30 01:07:12','2006-02-15 22:12:35'),(767,28,2,9544,'2.99','2005-07-31 01:44:51','2006-02-15 22:12:35'),(768,28,2,9593,'4.99','2005-07-31 03:22:30','2006-02-15 22:12:35'),(769,28,2,9705,'4.99','2005-07-31 07:40:33','2006-02-15 22:12:35'),(770,28,2,10116,'2.99','2005-07-31 21:14:02','2006-02-15 22:12:35'),(771,28,2,10294,'6.99','2005-08-01 03:48:12','2006-02-15 22:12:35'),(772,28,1,11444,'2.99','2005-08-02 20:32:55','2006-02-15 22:12:35'),(773,28,1,11856,'3.99','2005-08-17 13:44:49','2006-02-15 22:12:35'),(774,28,2,12190,'2.99','2005-08-18 01:54:44','2006-02-15 22:12:35'),(775,28,1,12359,'0.99','2005-08-18 07:44:05','2006-02-15 22:12:35'),(776,28,1,12708,'2.99','2005-08-18 20:59:17','2006-02-15 22:12:35'),(777,28,2,13783,'4.99','2005-08-20 12:11:03','2006-02-15 22:12:35'),(778,28,2,14540,'2.99','2005-08-21 15:34:23','2006-02-15 22:12:35'),(779,28,1,15445,'4.99','2005-08-23 00:48:29','2006-02-15 22:12:35'),(780,28,1,15491,'2.99','2005-08-23 02:08:40','2006-02-15 22:12:35'),(781,28,2,12938,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:35'),(782,29,2,194,'1.99','2005-05-26 06:52:33','2006-02-15 22:12:35'),(783,29,1,2655,'0.99','2005-06-19 10:38:42','2006-02-15 22:12:35'),(784,29,1,2673,'0.99','2005-06-19 11:42:20','2006-02-15 22:12:35'),(785,29,1,2701,'7.99','2005-06-19 13:33:06','2006-02-15 22:12:35'),(786,29,1,2735,'2.99','2005-06-19 15:42:07','2006-02-15 22:12:35'),(787,29,2,2801,'2.99','2005-06-19 19:18:09','2006-02-15 22:12:35'),(788,29,2,2923,'2.99','2005-06-20 04:16:07','2006-02-15 22:12:35'),(789,29,1,3324,'2.99','2005-06-21 08:49:16','2006-02-15 22:12:35'),(790,29,2,4262,'6.99','2005-07-07 14:24:30','2006-02-15 22:12:35'),(791,29,1,4313,'0.99','2005-07-07 17:36:56','2006-02-15 22:12:35'),(792,29,2,4535,'0.99','2005-07-08 03:40:46','2006-02-15 22:12:35'),(793,29,2,5442,'10.99','2005-07-09 21:55:19','2006-02-15 22:12:35'),(794,29,1,5857,'1.99','2005-07-10 17:59:29','2006-02-15 22:12:35'),(795,29,2,7237,'3.99','2005-07-27 10:12:36','2006-02-15 22:12:35'),(796,29,1,7451,'6.99','2005-07-27 18:18:41','2006-02-15 22:12:35'),(797,29,1,7453,'0.99','2005-07-27 18:27:13','2006-02-15 22:12:35'),(798,29,2,8673,'2.99','2005-07-29 15:50:14','2006-02-15 22:12:35'),(799,29,2,9392,'4.99','2005-07-30 19:50:13','2006-02-15 22:12:35'),(800,29,1,9946,'4.99','2005-07-31 15:48:54','2006-02-15 22:12:35'),(801,29,1,10543,'5.99','2005-08-01 12:36:09','2006-02-15 22:12:35'),(802,29,2,10899,'1.99','2005-08-02 01:30:21','2006-02-15 22:12:35'),(803,29,1,11079,'4.99','2005-08-02 07:29:10','2006-02-15 22:12:35'),(804,29,2,11962,'2.99','2005-08-17 17:34:38','2006-02-15 22:12:35'),(805,29,1,12488,'4.99','2005-08-18 12:48:22','2006-02-15 22:12:35'),(806,29,1,12508,'2.99','2005-08-18 13:20:13','2006-02-15 22:12:35'),(807,29,2,12569,'6.99','2005-08-18 15:20:46','2006-02-15 22:12:35'),(808,29,2,12615,'6.99','2005-08-18 17:16:07','2006-02-15 22:12:35'),(809,29,2,13173,'2.99','2005-08-19 13:50:36','2006-02-15 22:12:35'),(810,29,1,13436,'0.99','2005-08-19 23:36:25','2006-02-15 22:12:35'),(811,29,2,13777,'2.99','2005-08-20 12:03:35','2006-02-15 22:12:35'),(812,29,1,13832,'3.99','2005-08-20 14:00:25','2006-02-15 22:12:35'),(813,29,1,14174,'0.99','2005-08-21 03:01:45','2006-02-15 22:12:35'),(814,29,1,14703,'4.99','2005-08-21 21:01:19','2006-02-15 22:12:35'),(815,29,1,14985,'7.99','2005-08-22 07:35:56','2006-02-15 22:12:35'),(816,29,1,14997,'5.99','2005-08-22 07:53:00','2006-02-15 22:12:35'),(817,29,2,15577,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:35'),(818,30,2,1874,'1.99','2005-06-17 02:39:20','2006-02-15 22:12:35'),(819,30,2,1895,'2.99','2005-06-17 04:25:12','2006-02-15 22:12:35'),(820,30,2,2154,'4.99','2005-06-17 22:59:42','2006-02-15 22:12:35'),(821,30,2,2730,'2.99','2005-06-19 15:10:09','2006-02-15 22:12:35'),(822,30,1,3964,'4.99','2005-07-06 22:23:02','2006-02-15 22:12:35'),(823,30,2,4471,'2.99','2005-07-08 00:21:29','2006-02-15 22:12:35'),(824,30,2,4642,'2.99','2005-07-08 09:13:28','2006-02-15 22:12:35'),(825,30,2,5028,'5.99','2005-07-09 02:34:45','2006-02-15 22:12:36'),(826,30,1,5108,'9.99','2005-07-09 06:44:30','2006-02-15 22:12:36'),(827,30,1,5289,'0.99','2005-07-09 15:14:08','2006-02-15 22:12:36'),(828,30,2,5972,'7.99','2005-07-11 00:08:54','2006-02-15 22:12:36'),(829,30,1,6249,'0.99','2005-07-11 15:02:02','2006-02-15 22:12:36'),(830,30,2,6359,'2.99','2005-07-11 21:06:17','2006-02-15 22:12:36'),(831,30,2,7394,'2.99','2005-07-27 16:03:08','2006-02-15 22:12:36'),(832,30,2,7769,'4.99','2005-07-28 06:45:23','2006-02-15 22:12:36'),(833,30,1,8030,'4.99','2005-07-28 16:12:53','2006-02-15 22:12:36'),(834,30,2,8038,'4.99','2005-07-28 16:32:55','2006-02-15 22:12:36'),(835,30,1,8083,'4.99','2005-07-28 18:09:48','2006-02-15 22:12:36'),(836,30,1,8641,'2.99','2005-07-29 14:37:30','2006-02-15 22:12:36'),(837,30,2,9309,'2.99','2005-07-30 16:55:53','2006-02-15 22:12:36'),(838,30,2,9551,'0.99','2005-07-31 02:04:58','2006-02-15 22:12:36'),(839,30,1,9641,'0.99','2005-07-31 05:33:48','2006-02-15 22:12:36'),(840,30,1,9998,'2.99','2005-07-31 17:40:35','2006-02-15 22:12:36'),(841,30,1,10235,'6.99','2005-08-01 01:57:48','2006-02-15 22:12:36'),(842,30,1,12240,'2.99','2005-08-18 03:27:11','2006-02-15 22:12:36'),(843,30,1,12546,'2.99','2005-08-18 14:29:37','2006-02-15 22:12:36'),(844,30,2,12758,'0.99','2005-08-18 22:58:34','2006-02-15 22:12:36'),(845,30,1,13435,'0.99','2005-08-19 23:35:44','2006-02-15 22:12:36'),(846,30,1,13682,'4.99','2005-08-20 08:50:39','2006-02-15 22:12:36'),(847,30,1,14339,'0.99','2005-08-21 08:37:15','2006-02-15 22:12:36'),(848,30,1,14585,'2.99','2005-08-21 17:18:33','2006-02-15 22:12:36'),(849,30,1,15063,'4.99','2005-08-22 10:39:51','2006-02-15 22:12:36'),(850,30,1,15544,'4.99','2005-08-23 04:17:56','2006-02-15 22:12:36'),(851,30,2,15829,'2.99','2005-08-23 15:17:14','2006-02-15 22:12:36'),(852,31,2,1656,'4.99','2005-06-16 10:05:40','2006-02-15 22:12:36'),(853,31,1,1838,'1.99','2005-06-16 23:20:16','2006-02-15 22:12:36'),(854,31,1,2233,'0.99','2005-06-18 03:57:36','2006-02-15 22:12:36'),(855,31,2,2341,'6.99','2005-06-18 11:35:30','2006-02-15 22:12:36'),(856,31,1,2396,'7.99','2005-06-18 15:49:48','2006-02-15 22:12:36'),(857,31,2,2438,'0.99','2005-06-18 18:34:21','2006-02-15 22:12:36'),(858,31,1,2530,'0.99','2005-06-19 01:20:00','2006-02-15 22:12:36'),(859,31,2,2648,'4.99','2005-06-19 10:06:20','2006-02-15 22:12:36'),(860,31,2,3117,'2.99','2005-06-20 18:05:15','2006-02-15 22:12:36'),(861,31,2,3172,'1.99','2005-06-20 22:19:25','2006-02-15 22:12:36'),(862,31,1,3205,'0.99','2005-06-21 00:38:47','2006-02-15 22:12:36'),(863,31,1,3701,'4.99','2005-07-06 10:12:45','2006-02-15 22:12:36'),(864,31,2,3967,'4.99','2005-07-06 22:45:10','2006-02-15 22:12:36'),(865,31,1,4122,'6.99','2005-07-07 07:15:35','2006-02-15 22:12:36'),(866,31,2,4738,'9.99','2005-07-08 13:24:58','2006-02-15 22:12:36'),(867,31,1,6208,'3.99','2005-07-11 12:34:56','2006-02-15 22:12:36'),(868,31,2,6580,'4.99','2005-07-12 06:26:10','2006-02-15 22:12:36'),(869,31,1,7000,'1.99','2005-07-27 01:23:24','2006-02-15 22:12:36'),(870,31,2,7138,'3.99','2005-07-27 06:47:13','2006-02-15 22:12:36'),(871,31,2,7178,'2.99','2005-07-27 08:09:25','2006-02-15 22:12:36'),(872,31,2,7464,'2.99','2005-07-27 18:49:42','2006-02-15 22:12:36'),(873,31,2,8997,'0.99','2005-07-30 04:53:56','2006-02-15 22:12:36'),(874,31,2,12085,'4.99','2005-08-17 22:17:09','2006-02-15 22:12:36'),(875,31,1,12377,'0.99','2005-08-18 08:26:05','2006-02-15 22:12:36'),(876,31,2,15682,'6.99','2005-08-23 09:37:34','2006-02-15 22:12:36'),(877,31,2,15816,'6.99','2005-08-23 14:58:06','2006-02-15 22:12:36'),(878,32,2,483,'4.99','2005-05-27 23:00:25','2006-02-15 22:12:36'),(879,32,2,803,'4.99','2005-05-29 17:52:30','2006-02-15 22:12:36'),(880,32,2,1067,'4.99','2005-05-31 09:12:13','2006-02-15 22:12:36'),(881,32,2,1887,'6.99','2005-06-17 03:53:18','2006-02-15 22:12:36'),(882,32,2,2160,'0.99','2005-06-17 23:39:11','2006-02-15 22:12:36'),(883,32,2,2624,'5.99','2005-06-19 08:22:09','2006-02-15 22:12:36'),(884,32,2,2891,'1.99','2005-06-20 02:02:05','2006-02-15 22:12:36'),(885,32,1,3500,'2.99','2005-07-06 00:11:13','2006-02-15 22:12:36'),(886,32,1,4434,'2.99','2005-07-07 22:48:34','2006-02-15 22:12:36'),(887,32,2,4771,'2.99','2005-07-08 15:33:32','2006-02-15 22:12:36'),(888,32,2,4899,'0.99','2005-07-08 20:37:11','2006-02-15 22:12:36'),(889,32,1,5307,'9.99','2005-07-09 15:57:15','2006-02-15 22:12:36'),(890,32,1,5767,'0.99','2005-07-10 13:13:18','2006-02-15 22:12:36'),(891,32,1,5954,'2.99','2005-07-10 23:22:01','2006-02-15 22:12:36'),(892,32,1,6122,'3.99','2005-07-11 07:58:07','2006-02-15 22:12:36'),(893,32,2,6450,'2.99','2005-07-12 00:49:05','2006-02-15 22:12:36'),(894,32,1,7084,'6.99','2005-07-27 04:34:07','2006-02-15 22:12:36'),(895,32,1,7589,'5.99','2005-07-27 23:23:36','2006-02-15 22:12:36'),(896,32,1,7793,'2.99','2005-07-28 07:26:14','2006-02-15 22:12:36'),(897,32,2,8390,'5.99','2005-07-29 05:52:26','2006-02-15 22:12:36'),(898,32,2,8453,'2.99','2005-07-29 07:46:29','2006-02-15 22:12:36'),(899,32,2,8914,'2.99','2005-07-30 01:42:03','2006-02-15 22:12:36'),(900,32,1,11135,'4.99','2005-08-02 09:22:25','2006-02-15 22:12:36'),(901,32,2,11831,'4.99','2005-08-17 12:54:47','2006-02-15 22:12:36'),(902,32,2,12414,'9.99','2005-08-18 09:50:40','2006-02-15 22:12:36'),(903,32,1,13736,'8.99','2005-08-20 10:31:23','2006-02-15 22:12:36'),(904,32,1,13931,'1.99','2005-08-20 17:16:10','2006-02-15 22:12:36'),(905,32,1,14075,'0.99','2005-08-20 23:18:54','2006-02-15 22:12:36'),(906,32,2,14570,'5.99','2005-08-21 16:32:32','2006-02-15 22:12:36'),(907,33,1,165,'2.99','2005-05-26 02:28:36','2006-02-15 22:12:36'),(908,33,1,1301,'10.99','2005-06-15 09:46:33','2006-02-15 22:12:36'),(909,33,2,3173,'8.99','2005-06-20 22:21:10','2006-02-15 22:12:36'),(910,33,1,4095,'5.99','2005-07-07 06:01:48','2006-02-15 22:12:36'),(911,33,1,5421,'0.99','2005-07-09 20:49:12','2006-02-15 22:12:36'),(912,33,1,5723,'4.99','2005-07-10 11:14:48','2006-02-15 22:12:36'),(913,33,2,6280,'0.99','2005-07-11 16:36:17','2006-02-15 22:12:36'),(914,33,1,7992,'4.99','2005-07-28 14:53:06','2006-02-15 22:12:36'),(915,33,1,9040,'4.99','2005-07-30 06:31:45','2006-02-15 22:12:36'),(916,33,2,9085,'4.99','2005-07-30 08:17:24','2006-02-15 22:12:36'),(917,33,1,9254,'1.99','2005-07-30 14:26:11','2006-02-15 22:12:36'),(918,33,2,10335,'2.99','2005-08-01 04:59:30','2006-02-15 22:12:36'),(919,33,1,10870,'4.99','2005-08-02 00:27:12','2006-02-15 22:12:36'),(920,33,1,13241,'7.99','2005-08-19 16:25:00','2006-02-15 22:12:36'),(921,33,1,13858,'2.99','2005-08-20 14:50:57','2006-02-15 22:12:36'),(922,33,1,13958,'7.99','2005-08-20 18:11:44','2006-02-15 22:12:36'),(923,33,1,14002,'0.99','2005-08-20 20:12:19','2006-02-15 22:12:36'),(924,33,1,14623,'0.99','2005-08-21 18:29:13','2006-02-15 22:12:36'),(925,33,1,15096,'5.99','2005-08-22 11:43:04','2006-02-15 22:12:36'),(926,33,2,15115,'2.99','2005-08-22 12:28:01','2006-02-15 22:12:36'),(927,33,1,12277,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:36'),(928,34,1,1900,'4.99','2005-06-17 04:29:58','2006-02-15 22:12:36'),(929,34,2,2257,'5.99','2005-06-18 05:29:52','2006-02-15 22:12:36'),(930,34,1,3150,'0.99','2005-06-20 20:35:28','2006-02-15 22:12:36'),(931,34,2,3508,'3.99','2005-07-06 00:24:25','2006-02-15 22:12:36'),(932,34,1,3911,'2.99','2005-07-06 20:09:11','2006-02-15 22:12:36'),(933,34,1,5188,'4.99','2005-07-09 10:22:31','2006-02-15 22:12:36'),(934,34,2,5643,'4.99','2005-07-10 06:49:00','2006-02-15 22:12:36'),(935,34,2,5918,'5.99','2005-07-10 21:32:06','2006-02-15 22:12:36'),(936,34,2,7015,'2.99','2005-07-27 02:15:01','2006-02-15 22:12:36'),(937,34,2,7124,'2.99','2005-07-27 06:09:30','2006-02-15 22:12:36'),(938,34,1,7532,'0.99','2005-07-27 21:20:52','2006-02-15 22:12:36'),(939,34,1,9160,'3.99','2005-07-30 11:17:33','2006-02-15 22:12:37'),(940,34,1,10523,'0.99','2005-08-01 11:52:32','2006-02-15 22:12:37'),(941,34,1,10615,'4.99','2005-08-01 14:58:14','2006-02-15 22:12:37'),(942,34,2,11096,'0.99','2005-08-02 08:05:19','2006-02-15 22:12:37'),(943,34,1,11505,'2.99','2005-08-16 23:18:47','2006-02-15 22:12:37'),(944,34,2,11701,'4.99','2005-08-17 07:15:47','2006-02-15 22:12:37'),(945,34,2,12286,'2.99','2005-08-18 04:57:59','2006-02-15 22:12:37'),(946,34,1,12599,'2.99','2005-08-18 16:42:45','2006-02-15 22:12:37'),(947,34,1,12651,'0.99','2005-08-18 18:36:16','2006-02-15 22:12:37'),(948,34,1,13371,'4.99','2005-08-19 21:21:47','2006-02-15 22:12:37'),(949,34,2,13949,'2.99','2005-08-20 17:55:13','2006-02-15 22:12:37'),(950,34,1,14686,'5.99','2005-08-21 20:32:08','2006-02-15 22:12:37'),(951,34,2,14701,'7.99','2005-08-21 20:54:32','2006-02-15 22:12:37'),(952,35,2,47,'3.99','2005-05-25 06:05:20','2006-02-15 22:12:37'),(953,35,1,424,'6.99','2005-05-27 15:34:01','2006-02-15 22:12:37'),(954,35,1,1579,'0.99','2005-06-16 04:09:08','2006-02-15 22:12:37'),(955,35,1,1989,'2.99','2005-06-17 10:47:24','2006-02-15 22:12:37'),(956,35,1,2229,'4.99','2005-06-18 03:50:18','2006-02-15 22:12:37'),(957,35,1,2231,'0.99','2005-06-18 03:52:14','2006-02-15 22:12:37'),(958,35,1,2743,'2.99','2005-06-19 16:15:56','2006-02-15 22:12:37'),(959,35,2,3112,'4.99','2005-06-20 17:53:30','2006-02-15 22:12:37'),(960,35,2,3597,'2.99','2005-07-06 05:03:59','2006-02-15 22:12:37'),(961,35,2,4098,'4.99','2005-07-07 06:14:51','2006-02-15 22:12:37'),(962,35,2,4990,'0.99','2005-07-09 00:48:49','2006-02-15 22:12:37'),(963,35,1,5013,'2.99','2005-07-09 01:46:45','2006-02-15 22:12:37'),(964,35,2,5323,'0.99','2005-07-09 16:34:07','2006-02-15 22:12:37'),(965,35,1,5916,'5.99','2005-07-10 21:26:31','2006-02-15 22:12:37'),(966,35,1,5963,'0.99','2005-07-10 23:47:08','2006-02-15 22:12:37'),(967,35,1,6147,'5.99','2005-07-11 09:13:08','2006-02-15 22:12:37'),(968,35,1,6401,'4.99','2005-07-11 22:44:34','2006-02-15 22:12:37'),(969,35,1,6565,'4.99','2005-07-12 05:39:50','2006-02-15 22:12:37'),(970,35,1,6572,'4.99','2005-07-12 05:56:38','2006-02-15 22:12:37'),(971,35,1,7140,'4.99','2005-07-27 06:54:12','2006-02-15 22:12:37'),(972,35,1,8822,'6.99','2005-07-29 22:20:21','2006-02-15 22:12:37'),(973,35,1,8971,'5.99','2005-07-30 04:03:58','2006-02-15 22:12:37'),(974,35,2,9033,'2.99','2005-07-30 06:07:42','2006-02-15 22:12:37'),(975,35,1,9579,'6.99','2005-07-31 02:59:20','2006-02-15 22:12:37'),(976,35,1,11298,'1.99','2005-08-02 15:32:32','2006-02-15 22:12:37'),(977,35,1,11452,'7.99','2005-08-02 20:59:52','2006-02-15 22:12:37'),(978,35,1,11645,'4.99','2005-08-17 04:50:56','2006-02-15 22:12:37'),(979,35,1,12055,'4.99','2005-08-17 21:02:19','2006-02-15 22:12:37'),(980,35,1,13735,'2.99','2005-08-20 10:31:01','2006-02-15 22:12:37'),(981,35,1,14110,'0.99','2005-08-21 00:53:09','2006-02-15 22:12:37'),(982,35,2,14124,'2.99','2005-08-21 01:31:51','2006-02-15 22:12:37'),(983,35,2,14735,'4.99','2005-08-21 22:25:09','2006-02-15 22:12:37'),(984,36,1,349,'0.99','2005-05-27 04:53:11','2006-02-15 22:12:37'),(985,36,1,716,'0.99','2005-05-29 04:35:29','2006-02-15 22:12:37'),(986,36,2,2741,'0.99','2005-06-19 16:05:41','2006-02-15 22:12:37'),(987,36,2,4135,'0.99','2005-07-07 08:15:03','2006-02-15 22:12:37'),(988,36,2,4560,'4.99','2005-07-08 04:58:48','2006-02-15 22:12:37'),(989,36,2,4762,'4.99','2005-07-08 14:54:42','2006-02-15 22:12:37'),(990,36,1,5403,'0.99','2005-07-09 20:07:09','2006-02-15 22:12:37'),(991,36,2,6030,'0.99','2005-07-11 02:37:51','2006-02-15 22:12:37'),(992,36,1,7205,'6.99','2005-07-27 09:06:13','2006-02-15 22:12:37'),(993,36,1,7647,'0.99','2005-07-28 01:35:17','2006-02-15 22:12:37'),(994,36,2,7919,'6.99','2005-07-28 11:59:45','2006-02-15 22:12:37'),(995,36,2,8099,'0.99','2005-07-28 18:35:12','2006-02-15 22:12:37'),(996,36,1,8391,'2.99','2005-07-29 05:52:50','2006-02-15 22:12:37'),(997,36,1,8952,'4.99','2005-07-30 03:20:38','2006-02-15 22:12:37'),(998,36,1,9369,'2.99','2005-07-30 18:52:19','2006-02-15 22:12:37'),(999,36,2,9805,'0.99','2005-07-31 11:11:10','2006-02-15 22:12:37'),(1000,36,2,10525,'2.99','2005-08-01 11:53:17','2006-02-15 22:12:37'),(1001,36,2,10761,'2.99','2005-08-01 20:25:35','2006-02-15 22:12:37'),(1002,36,1,10963,'0.99','2005-08-02 03:48:17','2006-02-15 22:12:37'),(1003,36,2,10964,'6.99','2005-08-02 03:56:23','2006-02-15 22:12:37'),(1004,36,2,11616,'4.99','2005-08-17 04:00:01','2006-02-15 22:12:37'),(1005,36,1,11813,'4.99','2005-08-17 12:06:54','2006-02-15 22:12:37'),(1006,36,2,13562,'2.99','2005-08-20 04:31:45','2006-02-15 22:12:37'),(1007,36,2,13564,'1.99','2005-08-20 04:34:46','2006-02-15 22:12:37'),(1008,36,1,13674,'4.99','2005-08-20 08:30:54','2006-02-15 22:12:37'),(1009,36,1,14647,'9.99','2005-08-21 19:15:33','2006-02-15 22:12:37'),(1010,36,2,15657,'4.99','2005-08-23 08:42:40','2006-02-15 22:12:37'),(1011,37,1,25,'0.99','2005-05-25 03:21:20','2006-02-15 22:12:37'),(1012,37,1,923,'2.99','2005-05-30 11:58:50','2006-02-15 22:12:37'),(1013,37,1,1583,'4.99','2005-06-16 04:44:23','2006-02-15 22:12:37'),(1014,37,2,1812,'1.99','2005-06-16 21:08:46','2006-02-15 22:12:37'),(1015,37,2,1854,'3.99','2005-06-17 00:43:57','2006-02-15 22:12:37'),(1016,37,2,3472,'7.99','2005-07-05 22:56:33','2006-02-15 22:12:37'),(1017,37,1,3734,'5.99','2005-07-06 11:40:27','2006-02-15 22:12:37'),(1018,37,1,5425,'5.99','2005-07-09 21:02:26','2006-02-15 22:12:37'),(1019,37,2,7939,'0.99','2005-07-28 12:45:47','2006-02-15 22:12:37'),(1020,37,1,8419,'9.99','2005-07-29 06:54:48','2006-02-15 22:12:37'),(1021,37,1,9567,'5.99','2005-07-31 02:36:11','2006-02-15 22:12:37'),(1022,37,1,10538,'2.99','2005-08-01 12:22:41','2006-02-15 22:12:37'),(1023,37,1,11176,'3.99','2005-08-02 10:39:43','2006-02-15 22:12:37'),(1024,37,1,13046,'7.99','2005-08-19 09:21:10','2006-02-15 22:12:37'),(1025,37,2,13147,'4.99','2005-08-19 12:55:09','2006-02-15 22:12:37'),(1026,37,2,13444,'0.99','2005-08-20 00:00:24','2006-02-15 22:12:37'),(1027,37,2,13493,'3.99','2005-08-20 01:33:36','2006-02-15 22:12:37'),(1028,37,2,14025,'8.99','2005-08-20 21:19:36','2006-02-15 22:12:37'),(1029,37,1,14084,'0.99','2005-08-20 23:42:46','2006-02-15 22:12:37'),(1030,37,2,14532,'2.99','2005-08-21 15:15:03','2006-02-15 22:12:37'),(1031,37,1,15028,'3.99','2005-08-22 09:03:44','2006-02-15 22:12:37'),(1032,37,1,15904,'0.99','2005-08-23 17:32:19','2006-02-15 22:12:37'),(1033,37,2,16035,'0.99','2005-08-23 22:08:04','2006-02-15 22:12:37'),(1034,38,2,1250,'2.99','2005-06-15 05:55:40','2006-02-15 22:12:37'),(1035,38,1,2550,'1.99','2005-06-19 02:49:55','2006-02-15 22:12:37'),(1036,38,2,2605,'1.99','2005-06-19 06:48:01','2006-02-15 22:12:37'),(1037,38,2,3003,'4.99','2005-06-20 10:00:51','2006-02-15 22:12:37'),(1038,38,2,3392,'3.99','2005-06-21 15:12:44','2006-02-15 22:12:37'),(1039,38,1,4202,'5.99','2005-07-07 11:23:48','2006-02-15 22:12:37'),(1040,38,2,4228,'1.99','2005-07-07 12:42:02','2006-02-15 22:12:37'),(1041,38,1,4300,'4.99','2005-07-07 16:36:16','2006-02-15 22:12:37'),(1042,38,2,4644,'4.99','2005-07-08 09:14:29','2006-02-15 22:12:37'),(1043,38,1,5273,'2.99','2005-07-09 14:31:24','2006-02-15 22:12:37'),(1044,38,2,5460,'2.99','2005-07-09 22:46:14','2006-02-15 22:12:37'),(1045,38,1,5822,'2.99','2005-07-10 16:10:39','2006-02-15 22:12:37'),(1046,38,1,6864,'5.99','2005-07-12 19:59:25','2006-02-15 22:12:38'),(1047,38,1,6961,'0.99','2005-07-27 00:10:49','2006-02-15 22:12:38'),(1048,38,2,7158,'4.99','2005-07-27 07:23:58','2006-02-15 22:12:38'),(1049,38,2,7163,'5.99','2005-07-27 07:36:11','2006-02-15 22:12:38'),(1050,38,2,7321,'5.99','2005-07-27 13:33:38','2006-02-15 22:12:38'),(1051,38,1,7795,'0.99','2005-07-28 07:28:16','2006-02-15 22:12:38'),(1052,38,2,8924,'3.99','2005-07-30 02:08:58','2006-02-15 22:12:38'),(1053,38,2,9216,'0.99','2005-07-30 13:11:19','2006-02-15 22:12:38'),(1054,38,1,9284,'0.99','2005-07-30 15:25:19','2006-02-15 22:12:38'),(1055,38,1,9621,'4.99','2005-07-31 04:21:08','2006-02-15 22:12:38'),(1056,38,2,10111,'2.99','2005-07-31 21:08:33','2006-02-15 22:12:38'),(1057,38,2,10524,'6.99','2005-08-01 11:53:12','2006-02-15 22:12:38'),(1058,38,2,11049,'3.99','2005-08-02 06:15:40','2006-02-15 22:12:38'),(1059,38,1,11344,'2.99','2005-08-02 17:13:26','2006-02-15 22:12:38'),(1060,38,1,11817,'4.99','2005-08-17 12:20:01','2006-02-15 22:12:38'),(1061,38,2,12092,'0.99','2005-08-17 22:28:15','2006-02-15 22:12:38'),(1062,38,2,12187,'1.99','2005-08-18 01:45:50','2006-02-15 22:12:38'),(1063,38,1,14554,'4.99','2005-08-21 16:03:01','2006-02-15 22:12:38'),(1064,38,2,14632,'2.99','2005-08-21 18:48:06','2006-02-15 22:12:38'),(1065,38,1,14787,'6.99','2005-08-22 00:25:59','2006-02-15 22:12:38'),(1066,38,1,15668,'2.99','2005-08-23 09:02:04','2006-02-15 22:12:38'),(1067,38,1,15738,'5.99','2005-08-23 11:55:50','2006-02-15 22:12:38'),(1068,39,1,1625,'5.99','2005-06-16 07:49:08','2006-02-15 22:12:38'),(1069,39,1,1905,'4.99','2005-06-17 04:51:43','2006-02-15 22:12:38'),(1070,39,2,2135,'0.99','2005-06-17 21:14:02','2006-02-15 22:12:38'),(1071,39,2,2439,'4.99','2005-06-18 18:35:04','2006-02-15 22:12:38'),(1072,39,1,2631,'4.99','2005-06-19 08:49:53','2006-02-15 22:12:38'),(1073,39,1,2876,'4.99','2005-06-20 01:06:34','2006-02-15 22:12:38'),(1074,39,1,4419,'5.99','2005-07-07 22:06:24','2006-02-15 22:12:38'),(1075,39,2,4695,'8.99','2005-07-08 11:07:59','2006-02-15 22:12:38'),(1076,39,2,4712,'6.99','2005-07-08 12:10:50','2006-02-15 22:12:38'),(1077,39,2,4727,'7.99','2005-07-08 12:54:15','2006-02-15 22:12:38'),(1078,39,1,5451,'4.99','2005-07-09 22:22:10','2006-02-15 22:12:38'),(1079,39,2,5515,'2.99','2005-07-10 01:12:44','2006-02-15 22:12:38'),(1080,39,1,6045,'2.99','2005-07-11 03:21:05','2006-02-15 22:12:38'),(1081,39,2,8307,'6.99','2005-07-29 03:18:34','2006-02-15 22:12:38'),(1082,39,2,8366,'1.99','2005-07-29 05:11:14','2006-02-15 22:12:38'),(1083,39,2,8723,'7.99','2005-07-29 18:03:47','2006-02-15 22:12:38'),(1084,39,1,8805,'2.99','2005-07-29 21:29:58','2006-02-15 22:12:38'),(1085,39,1,9431,'1.99','2005-07-30 21:24:22','2006-02-15 22:12:38'),(1086,39,1,9656,'4.99','2005-07-31 06:00:21','2006-02-15 22:12:38'),(1087,39,2,10052,'4.99','2005-07-31 19:15:13','2006-02-15 22:12:38'),(1088,39,1,10126,'0.99','2005-07-31 21:36:07','2006-02-15 22:12:38'),(1089,39,1,10251,'4.99','2005-08-01 02:39:12','2006-02-15 22:12:38'),(1090,39,2,10269,'4.99','2005-08-01 03:09:26','2006-02-15 22:12:38'),(1091,39,2,10630,'0.99','2005-08-01 15:34:46','2006-02-15 22:12:38'),(1092,39,1,10639,'9.99','2005-08-01 15:44:43','2006-02-15 22:12:38'),(1093,39,2,12268,'0.99','2005-08-18 04:26:54','2006-02-15 22:12:38'),(1094,39,2,12459,'4.99','2005-08-18 11:25:11','2006-02-15 22:12:38'),(1095,39,2,13101,'7.99','2005-08-19 11:01:54','2006-02-15 22:12:38'),(1096,39,2,15124,'5.99','2005-08-22 12:51:38','2006-02-15 22:12:38'),(1097,40,1,128,'4.99','2005-05-25 21:19:53','2006-02-15 22:12:38'),(1098,40,2,2470,'7.99','2005-06-18 20:28:31','2006-02-15 22:12:38'),(1099,40,2,2896,'2.99','2005-06-20 02:33:42','2006-02-15 22:12:38'),(1100,40,1,2993,'4.99','2005-06-20 09:12:12','2006-02-15 22:12:38'),(1101,40,1,3428,'0.99','2005-06-21 18:39:34','2006-02-15 22:12:38'),(1102,40,2,5001,'1.99','2005-07-09 01:17:04','2006-02-15 22:12:38'),(1103,40,2,5777,'2.99','2005-07-10 13:38:41','2006-02-15 22:12:38'),(1104,40,1,5869,'5.99','2005-07-10 18:40:09','2006-02-15 22:12:38'),(1105,40,1,6502,'0.99','2005-07-12 03:15:45','2006-02-15 22:12:38'),(1106,40,2,7684,'0.99','2005-07-28 03:11:54','2006-02-15 22:12:38'),(1107,40,2,8031,'0.99','2005-07-28 16:15:49','2006-02-15 22:12:38'),(1108,40,2,8170,'3.99','2005-07-28 21:32:29','2006-02-15 22:12:38'),(1109,40,1,9050,'8.99','2005-07-30 06:59:55','2006-02-15 22:12:38'),(1110,40,2,9700,'4.99','2005-07-31 07:29:59','2006-02-15 22:12:38'),(1111,40,2,9961,'6.99','2005-07-31 16:07:50','2006-02-15 22:12:38'),(1112,40,1,9975,'1.99','2005-07-31 16:53:43','2006-02-15 22:12:38'),(1113,40,1,10442,'2.99','2005-08-01 08:58:08','2006-02-15 22:12:38'),(1114,40,2,11919,'0.99','2005-08-17 16:08:49','2006-02-15 22:12:38'),(1115,40,2,11948,'3.99','2005-08-17 17:11:05','2006-02-15 22:12:38'),(1116,40,2,12396,'9.99','2005-08-18 09:11:23','2006-02-15 22:12:38'),(1117,40,2,12877,'2.99','2005-08-19 03:16:58','2006-02-15 22:12:38'),(1118,40,1,13149,'6.99','2005-08-19 13:07:12','2006-02-15 22:12:38'),(1119,40,1,13376,'0.99','2005-08-19 21:31:45','2006-02-15 22:12:38'),(1120,40,1,13840,'5.99','2005-08-20 14:23:20','2006-02-15 22:12:38'),(1121,40,1,13951,'2.99','2005-08-20 17:58:11','2006-02-15 22:12:38'),(1122,40,1,14260,'6.99','2005-08-21 06:01:08','2006-02-15 22:12:38'),(1123,40,1,15193,'2.99','2005-08-22 16:06:49','2006-02-15 22:12:38'),(1124,41,1,2563,'4.99','2005-06-19 03:24:17','2006-02-15 22:12:38'),(1125,41,2,3246,'7.99','2005-06-21 03:10:01','2006-02-15 22:12:38'),(1126,41,2,3827,'2.99','2005-07-06 15:52:03','2006-02-15 22:12:38'),(1127,41,2,4294,'9.99','2005-07-07 15:56:23','2006-02-15 22:12:38'),(1128,41,1,4543,'4.99','2005-07-08 04:06:55','2006-02-15 22:12:38'),(1129,41,1,4575,'2.99','2005-07-08 05:49:14','2006-02-15 22:12:38'),(1130,41,1,6976,'4.99','2005-07-27 00:40:01','2006-02-15 22:12:38'),(1131,41,2,7153,'4.99','2005-07-27 07:15:38','2006-02-15 22:12:38'),(1132,41,1,7517,'1.99','2005-07-27 20:57:07','2006-02-15 22:12:38'),(1133,41,2,8008,'6.99','2005-07-28 15:25:55','2006-02-15 22:12:38'),(1134,41,1,8098,'0.99','2005-07-28 18:34:20','2006-02-15 22:12:38'),(1135,41,1,8134,'6.99','2005-07-28 20:01:23','2006-02-15 22:12:38'),(1136,41,2,8225,'2.99','2005-07-28 23:59:29','2006-02-15 22:12:38'),(1137,41,1,8712,'2.99','2005-07-29 17:30:06','2006-02-15 22:12:38'),(1138,41,2,9313,'5.99','2005-07-30 16:59:43','2006-02-15 22:12:38'),(1139,41,1,10064,'2.99','2005-07-31 19:27:02','2006-02-15 22:12:38'),(1140,41,1,10170,'7.99','2005-07-31 23:27:31','2006-02-15 22:12:38'),(1141,41,2,10495,'4.99','2005-08-01 10:45:51','2006-02-15 22:12:38'),(1142,41,1,10853,'5.99','2005-08-02 00:00:54','2006-02-15 22:12:38'),(1143,41,2,12147,'2.99','2005-08-18 00:10:20','2006-02-15 22:12:38'),(1144,41,2,12173,'3.99','2005-08-18 01:08:34','2006-02-15 22:12:38'),(1145,41,2,12821,'0.99','2005-08-19 01:07:02','2006-02-15 22:12:38'),(1146,41,2,14539,'7.99','2005-08-21 15:29:47','2006-02-15 22:12:38'),(1147,41,2,15860,'4.99','2005-08-23 16:08:40','2006-02-15 22:12:38'),(1148,41,1,15875,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1149,42,1,635,'5.99','2005-05-28 17:46:57','2006-02-15 22:12:39'),(1150,42,2,1534,'0.99','2005-06-16 00:49:32','2006-02-15 22:12:39'),(1151,42,2,2056,'2.99','2005-06-17 15:27:33','2006-02-15 22:12:39'),(1152,42,1,2170,'3.99','2005-06-17 23:57:34','2006-02-15 22:12:39'),(1153,42,1,2302,'4.99','2005-06-18 08:27:33','2006-02-15 22:12:39'),(1154,42,2,4391,'2.99','2005-07-07 21:09:38','2006-02-15 22:12:39'),(1155,42,2,5199,'4.99','2005-07-09 10:50:56','2006-02-15 22:12:39'),(1156,42,2,5517,'5.99','2005-07-10 01:15:00','2006-02-15 22:12:39'),(1157,42,2,5652,'3.99','2005-07-10 07:18:58','2006-02-15 22:12:39'),(1158,42,1,6179,'2.99','2005-07-11 10:59:59','2006-02-15 22:12:39'),(1159,42,1,6799,'2.99','2005-07-12 16:52:13','2006-02-15 22:12:39'),(1160,42,1,6925,'0.99','2005-07-26 22:52:32','2006-02-15 22:12:39'),(1161,42,1,7405,'3.99','2005-07-27 16:25:11','2006-02-15 22:12:39'),(1162,42,1,8049,'0.99','2005-07-28 16:51:58','2006-02-15 22:12:39'),(1163,42,1,8095,'6.99','2005-07-28 18:32:40','2006-02-15 22:12:39'),(1164,42,1,8166,'2.99','2005-07-28 21:23:33','2006-02-15 22:12:39'),(1165,42,1,8499,'3.99','2005-07-29 09:10:41','2006-02-15 22:12:39'),(1166,42,2,8785,'2.99','2005-07-29 20:36:26','2006-02-15 22:12:39'),(1167,42,2,8852,'3.99','2005-07-29 23:30:03','2006-02-15 22:12:39'),(1168,42,2,8915,'3.99','2005-07-30 01:42:09','2006-02-15 22:12:39'),(1169,42,2,10060,'6.99','2005-07-31 19:23:00','2006-02-15 22:12:39'),(1170,42,2,10345,'2.99','2005-08-01 05:18:56','2006-02-15 22:12:39'),(1171,42,2,10845,'2.99','2005-08-01 23:47:03','2006-02-15 22:12:39'),(1172,42,1,10935,'5.99','2005-08-02 02:54:53','2006-02-15 22:12:39'),(1173,42,1,12478,'4.99','2005-08-18 12:25:16','2006-02-15 22:12:39'),(1174,42,2,12499,'2.99','2005-08-18 13:05:37','2006-02-15 22:12:39'),(1175,42,1,14461,'7.99','2005-08-21 12:50:33','2006-02-15 22:12:39'),(1176,42,1,15442,'2.99','2005-08-23 00:42:49','2006-02-15 22:12:39'),(1177,42,1,13351,'5.98','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1178,42,1,15407,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1179,43,2,123,'4.99','2005-05-25 20:26:42','2006-02-15 22:12:39'),(1180,43,1,652,'4.99','2005-05-28 20:08:47','2006-02-15 22:12:39'),(1181,43,2,1544,'4.99','2005-06-16 01:28:22','2006-02-15 22:12:39'),(1182,43,2,3683,'1.99','2005-07-06 09:25:56','2006-02-15 22:12:39'),(1183,43,1,4498,'2.99','2005-07-08 02:07:50','2006-02-15 22:12:39'),(1184,43,1,5162,'4.99','2005-07-09 09:00:11','2006-02-15 22:12:39'),(1185,43,1,5401,'4.99','2005-07-09 19:59:10','2006-02-15 22:12:39'),(1186,43,1,5831,'2.99','2005-07-10 16:34:02','2006-02-15 22:12:39'),(1187,43,2,5941,'4.99','2005-07-10 22:40:47','2006-02-15 22:12:39'),(1188,43,1,6474,'3.99','2005-07-12 01:36:46','2006-02-15 22:12:39'),(1189,43,2,6680,'0.99','2005-07-12 12:01:56','2006-02-15 22:12:39'),(1190,43,1,7348,'4.99','2005-07-27 14:32:32','2006-02-15 22:12:39'),(1191,43,2,7868,'4.99','2005-07-28 10:08:55','2006-02-15 22:12:39'),(1192,43,2,8376,'4.99','2005-07-29 05:25:32','2006-02-15 22:12:39'),(1193,43,1,9204,'4.99','2005-07-30 12:43:58','2006-02-15 22:12:39'),(1194,43,1,11753,'4.99','2005-08-17 09:11:52','2006-02-15 22:12:39'),(1195,43,1,14244,'2.99','2005-08-21 05:29:55','2006-02-15 22:12:39'),(1196,43,1,14649,'4.99','2005-08-21 19:19:21','2006-02-15 22:12:39'),(1197,43,2,14837,'4.99','2005-08-22 01:54:52','2006-02-15 22:12:39'),(1198,43,2,15155,'4.99','2005-08-22 14:27:46','2006-02-15 22:12:39'),(1199,43,2,15800,'6.99','2005-08-23 14:23:44','2006-02-15 22:12:39'),(1200,43,2,15945,'2.99','2005-08-23 18:51:41','2006-02-15 22:12:39'),(1201,43,2,15644,'3.98','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1202,43,1,15745,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1203,44,1,29,'0.99','2005-05-25 03:47:12','2006-02-15 22:12:39'),(1204,44,1,99,'4.99','2005-05-25 16:50:20','2006-02-15 22:12:39'),(1205,44,1,407,'2.99','2005-05-27 13:57:38','2006-02-15 22:12:39'),(1206,44,2,721,'0.99','2005-05-29 05:28:47','2006-02-15 22:12:39'),(1207,44,1,904,'2.99','2005-05-30 10:19:42','2006-02-15 22:12:39'),(1208,44,1,1497,'3.99','2005-06-15 21:56:39','2006-02-15 22:12:39'),(1209,44,1,2369,'2.99','2005-06-18 14:25:29','2006-02-15 22:12:39'),(1210,44,1,2809,'3.99','2005-06-19 19:40:27','2006-02-15 22:12:39'),(1211,44,2,2866,'4.99','2005-06-20 00:01:36','2006-02-15 22:12:39'),(1212,44,2,4390,'0.99','2005-07-07 20:59:06','2006-02-15 22:12:39'),(1213,44,2,4723,'9.99','2005-07-08 12:44:59','2006-02-15 22:12:39'),(1214,44,1,5551,'3.99','2005-07-10 03:01:09','2006-02-15 22:12:39'),(1215,44,1,5787,'8.99','2005-07-10 14:08:49','2006-02-15 22:12:39'),(1216,44,2,5849,'6.99','2005-07-10 17:32:33','2006-02-15 22:12:39'),(1217,44,2,5909,'4.99','2005-07-10 20:46:13','2006-02-15 22:12:39'),(1218,44,1,7514,'0.99','2005-07-27 20:51:49','2006-02-15 22:12:39'),(1219,44,2,7526,'6.99','2005-07-27 21:13:47','2006-02-15 22:12:39'),(1220,44,2,8775,'4.99','2005-07-29 20:05:38','2006-02-15 22:12:39'),(1221,44,1,8866,'4.99','2005-07-29 23:58:19','2006-02-15 22:12:39'),(1222,44,1,11364,'2.99','2005-08-02 17:53:36','2006-02-15 22:12:39'),(1223,44,2,12345,'3.99','2005-08-18 07:16:58','2006-02-15 22:12:39'),(1224,44,1,12504,'4.99','2005-08-18 13:17:07','2006-02-15 22:12:39'),(1225,44,1,12790,'6.99','2005-08-19 00:16:54','2006-02-15 22:12:39'),(1226,44,2,12982,'4.99','2005-08-19 07:06:34','2006-02-15 22:12:39'),(1227,44,2,15054,'2.99','2005-08-22 10:14:33','2006-02-15 22:12:39'),(1228,44,2,13428,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1229,45,2,277,'2.99','2005-05-26 17:32:11','2006-02-15 22:12:39'),(1230,45,1,1806,'4.99','2005-06-16 20:41:57','2006-02-15 22:12:39'),(1231,45,2,1979,'2.99','2005-06-17 09:45:30','2006-02-15 22:12:39'),(1232,45,2,2722,'4.99','2005-06-19 14:55:17','2006-02-15 22:12:39'),(1233,45,1,3391,'3.99','2005-06-21 15:11:02','2006-02-15 22:12:39'),(1234,45,2,3444,'0.99','2005-06-21 20:39:39','2006-02-15 22:12:39'),(1235,45,1,4843,'0.99','2005-07-08 18:27:28','2006-02-15 22:12:39'),(1236,45,1,5181,'6.99','2005-07-09 10:07:27','2006-02-15 22:12:39'),(1237,45,1,5405,'7.99','2005-07-09 20:11:49','2006-02-15 22:12:39'),(1238,45,1,5637,'0.99','2005-07-10 06:31:37','2006-02-15 22:12:39'),(1239,45,2,6001,'0.99','2005-07-11 01:24:44','2006-02-15 22:12:39'),(1240,45,2,6002,'2.99','2005-07-11 01:27:49','2006-02-15 22:12:39'),(1241,45,1,6966,'9.99','2005-07-27 00:15:35','2006-02-15 22:12:39'),(1242,45,1,7436,'2.99','2005-07-27 17:39:12','2006-02-15 22:12:39'),(1243,45,1,7961,'3.99','2005-07-28 13:47:21','2006-02-15 22:12:39'),(1244,45,1,10507,'2.99','2005-08-01 11:22:20','2006-02-15 22:12:39'),(1245,45,2,10878,'6.99','2005-08-02 00:33:12','2006-02-15 22:12:39'),(1246,45,1,11004,'8.99','2005-08-02 05:04:18','2006-02-15 22:12:39'),(1247,45,1,11029,'4.99','2005-08-02 05:51:10','2006-02-15 22:12:40'),(1248,45,2,11483,'2.99','2005-08-02 22:28:22','2006-02-15 22:12:40'),(1249,45,2,11488,'3.99','2005-08-02 22:35:15','2006-02-15 22:12:40'),(1250,45,1,11725,'2.99','2005-08-17 08:09:00','2006-02-15 22:12:40'),(1251,45,1,13340,'3.99','2005-08-19 20:18:39','2006-02-15 22:12:40'),(1252,45,2,13394,'4.99','2005-08-19 22:05:19','2006-02-15 22:12:40'),(1253,45,1,14576,'6.99','2005-08-21 16:52:03','2006-02-15 22:12:40'),(1254,45,1,15812,'10.99','2005-08-23 14:47:26','2006-02-15 22:12:40'),(1255,45,2,16037,'7.99','2005-08-23 22:13:04','2006-02-15 22:12:40'),(1256,46,2,401,'2.99','2005-05-27 12:57:55','2006-02-15 22:12:40'),(1257,46,2,432,'4.99','2005-05-27 16:40:29','2006-02-15 22:12:40'),(1258,46,1,938,'2.99','2005-05-30 14:47:31','2006-02-15 22:12:40'),(1259,46,1,1166,'4.99','2005-06-14 23:17:03','2006-02-15 22:12:40'),(1260,46,2,1214,'4.99','2005-06-15 03:18:40','2006-02-15 22:12:40'),(1261,46,2,2144,'0.99','2005-06-17 22:05:40','2006-02-15 22:12:40'),(1262,46,1,2203,'2.99','2005-06-18 02:10:42','2006-02-15 22:12:40'),(1263,46,2,2965,'8.99','2005-06-20 07:33:38','2006-02-15 22:12:40'),(1264,46,2,2975,'4.99','2005-06-20 08:06:18','2006-02-15 22:12:40'),(1265,46,2,3439,'4.99','2005-06-21 19:36:15','2006-02-15 22:12:40'),(1266,46,2,3855,'2.99','2005-07-06 17:03:48','2006-02-15 22:12:40'),(1267,46,1,3916,'4.99','2005-07-06 20:18:50','2006-02-15 22:12:40'),(1268,46,2,5698,'4.99','2005-07-10 09:47:00','2006-02-15 22:12:40'),(1269,46,1,7336,'0.99','2005-07-27 14:11:45','2006-02-15 22:12:40'),(1270,46,2,8152,'3.99','2005-07-28 20:53:05','2006-02-15 22:12:40'),(1271,46,2,9045,'8.99','2005-07-30 06:36:57','2006-02-15 22:12:40'),(1272,46,2,9806,'2.99','2005-07-31 11:13:49','2006-02-15 22:12:40'),(1273,46,1,10088,'2.99','2005-07-31 20:16:21','2006-02-15 22:12:40'),(1274,46,2,10428,'4.99','2005-08-01 08:30:11','2006-02-15 22:12:40'),(1275,46,1,10803,'4.99','2005-08-01 22:22:07','2006-02-15 22:12:40'),(1276,46,1,10827,'5.99','2005-08-01 23:13:00','2006-02-15 22:12:40'),(1277,46,1,11721,'0.99','2005-08-17 07:49:17','2006-02-15 22:12:40'),(1278,46,2,12095,'4.99','2005-08-17 22:32:37','2006-02-15 22:12:40'),(1279,46,2,12238,'2.99','2005-08-18 03:25:08','2006-02-15 22:12:40'),(1280,46,2,12280,'4.99','2005-08-18 04:49:27','2006-02-15 22:12:40'),(1281,46,1,12298,'2.99','2005-08-18 05:30:31','2006-02-15 22:12:40'),(1282,46,2,12455,'4.99','2005-08-18 11:19:47','2006-02-15 22:12:40'),(1283,46,1,13226,'0.99','2005-08-19 16:05:36','2006-02-15 22:12:40'),(1284,46,2,14144,'4.99','2005-08-21 02:10:57','2006-02-15 22:12:40'),(1285,46,2,14528,'6.99','2005-08-21 15:08:05','2006-02-15 22:12:40'),(1286,46,1,14940,'4.99','2005-08-22 05:54:03','2006-02-15 22:12:40'),(1287,46,1,15438,'2.99','2005-08-23 00:31:57','2006-02-15 22:12:40'),(1288,46,1,15708,'0.99','2005-08-23 10:35:51','2006-02-15 22:12:40'),(1289,46,1,15758,'5.99','2005-08-23 12:47:26','2006-02-15 22:12:40'),(1290,47,2,175,'3.99','2005-05-26 03:46:26','2006-02-15 22:12:40'),(1291,47,2,207,'4.99','2005-05-26 08:04:38','2006-02-15 22:12:40'),(1292,47,1,300,'6.99','2005-05-26 20:57:00','2006-02-15 22:12:40'),(1293,47,1,1882,'4.99','2005-06-17 03:17:21','2006-02-15 22:12:40'),(1294,47,1,2307,'6.99','2005-06-18 08:34:59','2006-02-15 22:12:40'),(1295,47,2,3320,'5.99','2005-06-21 08:29:41','2006-02-15 22:12:40'),(1296,47,1,3631,'4.99','2005-07-06 06:36:53','2006-02-15 22:12:40'),(1297,47,2,4064,'5.99','2005-07-07 04:29:20','2006-02-15 22:12:40'),(1298,47,1,5174,'0.99','2005-07-09 09:31:59','2006-02-15 22:12:40'),(1299,47,2,6153,'9.99','2005-07-11 09:31:04','2006-02-15 22:12:40'),(1300,47,2,6164,'0.99','2005-07-11 10:16:23','2006-02-15 22:12:40'),(1301,47,1,6337,'3.99','2005-07-11 19:30:47','2006-02-15 22:12:40'),(1302,47,2,8159,'4.99','2005-07-28 21:09:28','2006-02-15 22:12:40'),(1303,47,2,8402,'6.99','2005-07-29 06:25:45','2006-02-15 22:12:40'),(1304,47,1,8863,'3.99','2005-07-29 23:52:01','2006-02-15 22:12:40'),(1305,47,2,9274,'4.99','2005-07-30 15:07:04','2006-02-15 22:12:40'),(1306,47,1,11126,'0.99','2005-08-02 08:59:04','2006-02-15 22:12:40'),(1307,47,2,11477,'5.99','2005-08-02 22:09:01','2006-02-15 22:12:40'),(1308,47,1,12215,'7.99','2005-08-18 02:35:39','2006-02-15 22:12:40'),(1309,47,2,12274,'7.99','2005-08-18 04:41:47','2006-02-15 22:12:40'),(1310,47,1,14397,'0.99','2005-08-21 10:25:56','2006-02-15 22:12:40'),(1311,47,2,15846,'2.99','2005-08-23 15:39:18','2006-02-15 22:12:40'),(1312,48,2,72,'0.99','2005-05-25 10:52:13','2006-02-15 22:12:40'),(1313,48,1,297,'2.99','2005-05-26 20:48:48','2006-02-15 22:12:40'),(1314,48,1,390,'4.99','2005-05-27 11:02:26','2006-02-15 22:12:40'),(1315,48,2,1689,'9.99','2005-06-16 12:18:41','2006-02-15 22:12:40'),(1316,48,2,2822,'0.99','2005-06-19 20:29:24','2006-02-15 22:12:40'),(1317,48,2,3758,'4.99','2005-07-06 12:43:11','2006-02-15 22:12:40'),(1318,48,1,4367,'2.99','2005-07-07 19:52:01','2006-02-15 22:12:40'),(1319,48,2,5148,'6.99','2005-07-09 08:22:46','2006-02-15 22:12:40'),(1320,48,2,6498,'3.99','2005-07-12 03:05:38','2006-02-15 22:12:40'),(1321,48,1,7920,'2.99','2005-07-28 12:01:19','2006-02-15 22:12:40'),(1322,48,1,8716,'6.99','2005-07-29 17:39:09','2006-02-15 22:12:40'),(1323,48,1,9402,'7.99','2005-07-30 20:18:27','2006-02-15 22:12:40'),(1324,48,2,9742,'7.99','2005-07-31 09:10:20','2006-02-15 22:12:40'),(1325,48,2,10276,'2.99','2005-08-01 03:22:23','2006-02-15 22:12:40'),(1326,48,2,14450,'1.99','2005-08-21 12:21:25','2006-02-15 22:12:40'),(1327,48,2,14536,'2.99','2005-08-21 15:22:50','2006-02-15 22:12:40'),(1328,48,1,15228,'3.99','2005-08-22 17:27:23','2006-02-15 22:12:40'),(1329,49,2,96,'1.99','2005-05-25 16:32:19','2006-02-15 22:12:40'),(1330,49,1,239,'3.99','2005-05-26 12:30:26','2006-02-15 22:12:40'),(1331,49,2,846,'2.99','2005-05-30 01:17:45','2006-02-15 22:12:40'),(1332,49,2,1010,'4.99','2005-05-31 01:57:32','2006-02-15 22:12:40'),(1333,49,1,1164,'0.99','2005-06-14 23:16:26','2006-02-15 22:12:40'),(1334,49,2,1237,'9.99','2005-06-15 04:44:10','2006-02-15 22:12:40'),(1335,49,2,1688,'0.99','2005-06-16 12:11:20','2006-02-15 22:12:40'),(1336,49,2,1777,'6.99','2005-06-16 18:52:12','2006-02-15 22:12:40'),(1337,49,2,3235,'4.99','2005-06-21 02:46:17','2006-02-15 22:12:40'),(1338,49,2,3575,'4.99','2005-07-06 03:36:19','2006-02-15 22:12:40'),(1339,49,2,3615,'0.99','2005-07-06 05:47:47','2006-02-15 22:12:40'),(1340,49,1,5491,'2.99','2005-07-10 00:09:45','2006-02-15 22:12:41'),(1341,49,1,6214,'4.99','2005-07-11 12:49:48','2006-02-15 22:12:41'),(1342,49,1,6279,'6.99','2005-07-11 16:26:07','2006-02-15 22:12:41'),(1343,49,1,6521,'7.99','2005-07-12 04:06:11','2006-02-15 22:12:41'),(1344,49,2,6759,'4.99','2005-07-12 15:14:48','2006-02-15 22:12:41'),(1345,49,2,7209,'4.99','2005-07-27 09:16:53','2006-02-15 22:12:41'),(1346,49,2,7742,'8.99','2005-07-28 05:33:16','2006-02-15 22:12:41'),(1347,49,2,8553,'10.99','2005-07-29 11:15:36','2006-02-15 22:12:41'),(1348,49,2,9006,'0.99','2005-07-30 05:06:32','2006-02-15 22:12:41'),(1349,49,1,9851,'4.99','2005-07-31 12:50:24','2006-02-15 22:12:41'),(1350,49,1,10144,'4.99','2005-07-31 22:13:52','2006-02-15 22:12:41'),(1351,49,1,10266,'0.99','2005-08-01 03:05:59','2006-02-15 22:12:41'),(1352,49,1,10588,'2.99','2005-08-01 14:10:21','2006-02-15 22:12:41'),(1353,49,1,10814,'2.99','2005-08-01 22:43:12','2006-02-15 22:12:41'),(1354,49,2,14168,'5.99','2005-08-21 03:00:03','2006-02-15 22:12:41'),(1355,49,1,14627,'6.99','2005-08-21 18:35:54','2006-02-15 22:12:41'),(1356,49,1,14676,'2.99','2005-08-21 20:02:18','2006-02-15 22:12:41'),(1357,50,1,763,'4.99','2005-05-29 11:32:15','2006-02-15 22:12:41'),(1358,50,1,794,'4.99','2005-05-29 16:44:11','2006-02-15 22:12:41'),(1359,50,1,905,'4.99','2005-05-30 10:25:00','2006-02-15 22:12:41'),(1360,50,1,1029,'4.99','2005-05-31 03:52:02','2006-02-15 22:12:41'),(1361,50,2,1136,'4.99','2005-05-31 19:19:36','2006-02-15 22:12:41'),(1362,50,1,1223,'2.99','2005-06-15 03:38:53','2006-02-15 22:12:41'),(1363,50,1,1785,'4.99','2005-06-16 19:27:12','2006-02-15 22:12:41'),(1364,50,2,3000,'0.99','2005-06-20 09:32:33','2006-02-15 22:12:41'),(1365,50,2,3169,'2.99','2005-06-20 21:55:54','2006-02-15 22:12:41'),(1366,50,2,4149,'2.99','2005-07-07 08:40:17','2006-02-15 22:12:41'),(1367,50,2,5290,'4.99','2005-07-09 15:14:47','2006-02-15 22:12:41'),(1368,50,2,5641,'4.99','2005-07-10 06:43:43','2006-02-15 22:12:41'),(1369,50,2,5681,'9.99','2005-07-10 08:48:39','2006-02-15 22:12:41'),(1370,50,1,5928,'6.99','2005-07-10 21:58:30','2006-02-15 22:12:41'),(1371,50,2,6634,'0.99','2005-07-12 09:37:18','2006-02-15 22:12:41'),(1372,50,1,6667,'8.99','2005-07-12 11:36:22','2006-02-15 22:12:41'),(1373,50,1,7383,'4.99','2005-07-27 15:46:53','2006-02-15 22:12:41'),(1374,50,1,8089,'0.99','2005-07-28 18:26:47','2006-02-15 22:12:41'),(1375,50,1,8261,'0.99','2005-07-29 01:11:05','2006-02-15 22:12:41'),(1376,50,1,8619,'5.99','2005-07-29 13:50:08','2006-02-15 22:12:41'),(1377,50,2,9179,'0.99','2005-07-30 12:02:41','2006-02-15 22:12:41'),(1378,50,1,9615,'4.99','2005-07-31 03:59:56','2006-02-15 22:12:41'),(1379,50,2,9691,'10.99','2005-07-31 07:09:55','2006-02-15 22:12:41'),(1380,50,2,10046,'2.99','2005-07-31 19:07:11','2006-02-15 22:12:41'),(1381,50,2,10165,'0.99','2005-07-31 23:21:23','2006-02-15 22:12:41'),(1382,50,2,10180,'6.99','2005-07-31 23:57:43','2006-02-15 22:12:41'),(1383,50,2,10261,'4.99','2005-08-01 02:58:27','2006-02-15 22:12:41'),(1384,50,2,10485,'7.99','2005-08-01 10:20:34','2006-02-15 22:12:41'),(1385,50,2,11053,'3.99','2005-08-02 06:27:13','2006-02-15 22:12:41'),(1386,50,1,12766,'6.99','2005-08-18 23:25:20','2006-02-15 22:12:41'),(1387,50,2,13136,'7.99','2005-08-19 12:24:23','2006-02-15 22:12:41'),(1388,50,1,14054,'4.99','2005-08-20 22:17:01','2006-02-15 22:12:41'),(1389,50,2,15138,'2.99','2005-08-22 13:36:30','2006-02-15 22:12:41'),(1390,50,2,15388,'6.99','2005-08-22 22:49:23','2006-02-15 22:12:41'),(1391,50,1,16015,'4.99','2005-08-23 21:25:03','2006-02-15 22:12:41'),(1392,51,2,119,'4.99','2005-05-25 19:37:02','2006-02-15 22:12:41'),(1393,51,1,661,'4.99','2005-05-28 21:01:25','2006-02-15 22:12:41'),(1394,51,2,1028,'4.99','2005-05-31 03:48:05','2006-02-15 22:12:41'),(1395,51,2,1373,'1.99','2005-06-15 14:48:04','2006-02-15 22:12:41'),(1396,51,1,1477,'0.99','2005-06-15 21:11:18','2006-02-15 22:12:41'),(1397,51,1,3525,'9.99','2005-07-06 01:02:39','2006-02-15 22:12:41'),(1398,51,1,5230,'2.99','2005-07-09 12:30:23','2006-02-15 22:12:41'),(1399,51,2,5304,'5.99','2005-07-09 15:48:06','2006-02-15 22:12:41'),(1400,51,1,5473,'7.99','2005-07-09 23:19:11','2006-02-15 22:12:41'),(1401,51,1,5606,'4.99','2005-07-10 05:07:55','2006-02-15 22:12:41'),(1402,51,1,7207,'5.99','2005-07-27 09:13:26','2006-02-15 22:12:41'),(1403,51,1,7398,'6.99','2005-07-27 16:07:22','2006-02-15 22:12:41'),(1404,51,1,7636,'5.99','2005-07-28 01:08:36','2006-02-15 22:12:41'),(1405,51,1,8495,'4.99','2005-07-29 09:05:06','2006-02-15 22:12:41'),(1406,51,1,8693,'0.99','2005-07-29 16:44:13','2006-02-15 22:12:41'),(1407,51,1,8880,'0.99','2005-07-30 00:16:55','2006-02-15 22:12:41'),(1408,51,2,9649,'0.99','2005-07-31 05:46:54','2006-02-15 22:12:41'),(1409,51,2,10244,'4.99','2005-08-01 02:20:01','2006-02-15 22:12:41'),(1410,51,1,10780,'2.99','2005-08-01 21:14:24','2006-02-15 22:12:41'),(1411,51,1,10894,'0.99','2005-08-02 01:12:35','2006-02-15 22:12:41'),(1412,51,1,11302,'2.99','2005-08-02 15:38:03','2006-02-15 22:12:41'),(1413,51,2,11685,'4.99','2005-08-17 06:39:16','2006-02-15 22:12:41'),(1414,51,2,11751,'6.99','2005-08-17 09:07:56','2006-02-15 22:12:41'),(1415,51,1,12184,'0.99','2005-08-18 01:36:00','2006-02-15 22:12:41'),(1416,51,1,12725,'4.99','2005-08-18 21:43:09','2006-02-15 22:12:41'),(1417,51,2,13098,'2.99','2005-08-19 10:51:59','2006-02-15 22:12:41'),(1418,51,1,13302,'2.99','2005-08-19 18:54:26','2006-02-15 22:12:41'),(1419,51,1,13868,'0.99','2005-08-20 15:06:26','2006-02-15 22:12:41'),(1420,51,2,13882,'2.99','2005-08-20 15:23:26','2006-02-15 22:12:41'),(1421,51,2,14221,'6.99','2005-08-21 04:49:41','2006-02-15 22:12:41'),(1422,51,2,14512,'4.99','2005-08-21 14:47:09','2006-02-15 22:12:41'),(1423,51,1,14617,'4.99','2005-08-21 18:07:40','2006-02-15 22:12:41'),(1424,51,1,14903,'4.99','2005-08-22 04:31:50','2006-02-15 22:12:41'),(1425,52,1,874,'0.99','2005-05-30 05:36:21','2006-02-15 22:12:41'),(1426,52,1,1196,'4.99','2005-06-15 01:38:31','2006-02-15 22:12:41'),(1427,52,2,2232,'0.99','2005-06-18 03:54:31','2006-02-15 22:12:41'),(1428,52,1,2862,'2.99','2005-06-19 23:47:24','2006-02-15 22:12:41'),(1429,52,2,3196,'4.99','2005-06-21 00:02:28','2006-02-15 22:12:42'),(1430,52,1,3997,'1.99','2005-07-06 23:46:52','2006-02-15 22:12:42'),(1431,52,1,5308,'0.99','2005-07-09 15:58:38','2006-02-15 22:12:42'),(1432,52,2,5313,'3.99','2005-07-09 16:04:45','2006-02-15 22:12:42'),(1433,52,1,5607,'2.99','2005-07-10 05:08:10','2006-02-15 22:12:42'),(1434,52,1,6394,'7.99','2005-07-11 22:29:15','2006-02-15 22:12:42'),(1435,52,2,7284,'0.99','2005-07-27 12:12:04','2006-02-15 22:12:42'),(1436,52,2,7438,'5.99','2005-07-27 17:40:40','2006-02-15 22:12:42'),(1437,52,2,7627,'4.99','2005-07-28 00:56:47','2006-02-15 22:12:42'),(1438,52,1,8686,'4.99','2005-07-29 16:17:49','2006-02-15 22:12:42'),(1439,52,1,9029,'4.99','2005-07-30 06:03:11','2006-02-15 22:12:42'),(1440,52,2,9749,'3.99','2005-07-31 09:18:33','2006-02-15 22:12:42'),(1441,52,2,9797,'4.99','2005-07-31 10:53:44','2006-02-15 22:12:42'),(1442,52,2,10591,'0.99','2005-08-01 14:12:29','2006-02-15 22:12:42'),(1443,52,1,10635,'0.99','2005-08-01 15:37:58','2006-02-15 22:12:42'),(1444,52,1,11068,'0.99','2005-08-02 07:08:07','2006-02-15 22:12:42'),(1445,52,1,11731,'3.99','2005-08-17 08:24:35','2006-02-15 22:12:42'),(1446,52,2,12200,'2.99','2005-08-18 02:12:33','2006-02-15 22:12:42'),(1447,52,2,12520,'0.99','2005-08-18 13:42:45','2006-02-15 22:12:42'),(1448,52,2,13090,'5.99','2005-08-19 10:39:54','2006-02-15 22:12:42'),(1449,52,2,14820,'2.99','2005-08-22 01:18:37','2006-02-15 22:12:42'),(1450,52,1,14822,'5.99','2005-08-22 01:21:14','2006-02-15 22:12:42'),(1451,52,2,14961,'6.99','2005-08-22 06:35:50','2006-02-15 22:12:42'),(1452,52,2,15891,'5.99','2005-08-23 17:00:12','2006-02-15 22:12:42'),(1453,52,1,12001,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1454,53,1,88,'3.99','2005-05-25 14:13:54','2006-02-15 22:12:42'),(1455,53,1,378,'2.99','2005-05-27 09:23:22','2006-02-15 22:12:42'),(1456,53,1,751,'0.99','2005-05-29 09:55:43','2006-02-15 22:12:42'),(1457,53,2,783,'5.99','2005-05-29 14:41:18','2006-02-15 22:12:42'),(1458,53,2,856,'9.99','2005-05-30 02:01:21','2006-02-15 22:12:42'),(1459,53,1,1107,'2.99','2005-05-31 15:04:05','2006-02-15 22:12:42'),(1460,53,1,1964,'0.99','2005-06-17 09:10:09','2006-02-15 22:12:42'),(1461,53,1,2388,'2.99','2005-06-18 15:26:30','2006-02-15 22:12:42'),(1462,53,1,2903,'2.99','2005-06-20 02:49:01','2006-02-15 22:12:42'),(1463,53,2,3140,'2.99','2005-06-20 19:47:12','2006-02-15 22:12:42'),(1464,53,2,3244,'0.99','2005-06-21 03:01:10','2006-02-15 22:12:42'),(1465,53,2,3591,'2.99','2005-07-06 04:37:10','2006-02-15 22:12:42'),(1466,53,2,3898,'4.99','2005-07-06 19:12:37','2006-02-15 22:12:42'),(1467,53,2,5185,'2.99','2005-07-09 10:14:39','2006-02-15 22:12:42'),(1468,53,2,7466,'2.99','2005-07-27 18:51:17','2006-02-15 22:12:42'),(1469,53,1,7699,'4.99','2005-07-28 03:52:21','2006-02-15 22:12:42'),(1470,53,1,9343,'4.99','2005-07-30 18:13:13','2006-02-15 22:12:42'),(1471,53,1,9928,'7.99','2005-07-31 15:13:57','2006-02-15 22:12:42'),(1472,53,1,10594,'3.99','2005-08-01 14:14:59','2006-02-15 22:12:42'),(1473,53,1,12054,'5.99','2005-08-17 20:59:56','2006-02-15 22:12:42'),(1474,53,1,12580,'2.99','2005-08-18 15:49:08','2006-02-15 22:12:42'),(1475,53,1,13049,'5.99','2005-08-19 09:25:40','2006-02-15 22:12:42'),(1476,53,2,13789,'2.99','2005-08-20 12:16:38','2006-02-15 22:12:42'),(1477,53,1,14061,'2.99','2005-08-20 22:32:11','2006-02-15 22:12:42'),(1478,53,2,14091,'0.99','2005-08-21 00:11:17','2006-02-15 22:12:42'),(1479,53,2,14119,'5.99','2005-08-21 01:15:59','2006-02-15 22:12:42'),(1480,53,1,14671,'4.99','2005-08-21 19:59:30','2006-02-15 22:12:42'),(1481,53,2,14811,'0.99','2005-08-22 01:09:04','2006-02-15 22:12:42'),(1482,53,2,11657,'7.98','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1483,53,1,14137,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1484,54,2,198,'4.99','2005-05-26 07:03:49','2006-02-15 22:12:42'),(1485,54,2,441,'4.99','2005-05-27 18:11:05','2006-02-15 22:12:42'),(1486,54,2,545,'3.99','2005-05-28 07:10:20','2006-02-15 22:12:42'),(1487,54,1,1556,'4.99','2005-06-16 02:19:02','2006-02-15 22:12:42'),(1488,54,1,1571,'2.99','2005-06-16 03:22:00','2006-02-15 22:12:42'),(1489,54,2,2323,'6.99','2005-06-18 09:55:02','2006-02-15 22:12:42'),(1490,54,1,2647,'4.99','2005-06-19 09:57:56','2006-02-15 22:12:42'),(1491,54,2,4657,'4.99','2005-07-08 09:51:02','2006-02-15 22:12:42'),(1492,54,2,5055,'1.99','2005-07-09 04:05:28','2006-02-15 22:12:42'),(1493,54,1,5929,'2.99','2005-07-10 21:59:29','2006-02-15 22:12:42'),(1494,54,1,5992,'2.99','2005-07-11 01:06:21','2006-02-15 22:12:42'),(1495,54,1,6338,'7.99','2005-07-11 19:39:41','2006-02-15 22:12:42'),(1496,54,2,6560,'2.99','2005-07-12 05:22:06','2006-02-15 22:12:42'),(1497,54,1,6813,'0.99','2005-07-12 18:03:50','2006-02-15 22:12:42'),(1498,54,2,8992,'4.99','2005-07-30 04:44:18','2006-02-15 22:12:42'),(1499,54,2,10489,'5.99','2005-08-01 10:27:42','2006-02-15 22:12:42'),(1500,54,2,10882,'5.99','2005-08-02 00:47:16','2006-02-15 22:12:42'),(1501,54,1,10956,'4.99','2005-08-02 03:33:14','2006-02-15 22:12:42'),(1502,54,1,11182,'4.99','2005-08-02 10:55:14','2006-02-15 22:12:42'),(1503,54,2,11887,'2.99','2005-08-17 15:03:13','2006-02-15 22:12:42'),(1504,54,1,12526,'2.99','2005-08-18 13:48:43','2006-02-15 22:12:42'),(1505,54,2,12775,'5.99','2005-08-18 23:35:56','2006-02-15 22:12:43'),(1506,54,1,12811,'4.99','2005-08-19 00:51:28','2006-02-15 22:12:43'),(1507,54,2,12872,'0.99','2005-08-19 02:57:37','2006-02-15 22:12:43'),(1508,54,2,13315,'2.99','2005-08-19 19:16:18','2006-02-15 22:12:43'),(1509,54,1,13890,'0.99','2005-08-20 15:41:00','2006-02-15 22:12:43'),(1510,54,1,14215,'4.99','2005-08-21 04:34:11','2006-02-15 22:12:43'),(1511,54,1,15226,'10.99','2005-08-22 17:20:17','2006-02-15 22:12:43'),(1512,54,1,15567,'4.99','2005-08-23 05:20:36','2006-02-15 22:12:43'),(1513,55,1,555,'4.99','2005-05-28 08:31:14','2006-02-15 22:12:43'),(1514,55,1,1027,'9.99','2005-05-31 03:46:19','2006-02-15 22:12:43'),(1515,55,1,1048,'0.99','2005-05-31 06:49:53','2006-02-15 22:12:43'),(1516,55,2,1825,'2.99','2005-06-16 21:53:05','2006-02-15 22:12:43'),(1517,55,2,2062,'2.99','2005-06-17 15:56:43','2006-02-15 22:12:43'),(1518,55,1,2904,'2.99','2005-06-20 02:54:06','2006-02-15 22:12:43'),(1519,55,1,2976,'4.99','2005-06-20 08:09:11','2006-02-15 22:12:43'),(1520,55,1,3149,'4.99','2005-06-20 20:34:55','2006-02-15 22:12:43'),(1521,55,1,4671,'4.99','2005-07-08 10:15:32','2006-02-15 22:12:43'),(1522,55,2,6314,'7.99','2005-07-11 18:32:44','2006-02-15 22:12:43'),(1523,55,2,7050,'4.99','2005-07-27 03:33:17','2006-02-15 22:12:43'),(1524,55,2,8288,'6.99','2005-07-29 02:04:22','2006-02-15 22:12:43'),(1525,55,1,9302,'2.99','2005-07-30 16:34:57','2006-02-15 22:12:43'),(1526,55,2,9596,'5.99','2005-07-31 03:28:47','2006-02-15 22:12:43'),(1527,55,2,9798,'2.99','2005-07-31 10:55:18','2006-02-15 22:12:43'),(1528,55,2,11287,'1.99','2005-08-02 14:49:51','2006-02-15 22:12:43'),(1529,55,1,12776,'4.99','2005-08-18 23:37:33','2006-02-15 22:12:43'),(1530,55,1,12808,'4.99','2005-08-19 00:40:41','2006-02-15 22:12:43'),(1531,55,2,12972,'1.99','2005-08-19 06:43:28','2006-02-15 22:12:43'),(1532,55,1,13345,'6.99','2005-08-19 20:25:24','2006-02-15 22:12:43'),(1533,55,1,14667,'2.99','2005-08-21 19:51:11','2006-02-15 22:12:43'),(1534,55,1,15296,'4.99','2005-08-22 19:37:20','2006-02-15 22:12:43'),(1535,56,1,130,'3.99','2005-05-25 21:21:56','2006-02-15 22:12:43'),(1536,56,1,341,'5.99','2005-05-27 04:01:42','2006-02-15 22:12:43'),(1537,56,1,496,'2.99','2005-05-28 00:43:41','2006-02-15 22:12:43'),(1538,56,1,569,'6.99','2005-05-28 10:12:41','2006-02-15 22:12:43'),(1539,56,2,1795,'6.99','2005-06-16 20:09:01','2006-02-15 22:12:43'),(1540,56,1,2140,'0.99','2005-06-17 21:40:29','2006-02-15 22:12:43'),(1541,56,1,2485,'4.99','2005-06-18 21:26:03','2006-02-15 22:12:43'),(1542,56,1,2989,'0.99','2005-06-20 08:59:37','2006-02-15 22:12:43'),(1543,56,1,3718,'7.99','2005-07-06 10:57:56','2006-02-15 22:12:43'),(1544,56,2,3771,'2.99','2005-07-06 13:19:34','2006-02-15 22:12:43'),(1545,56,1,4097,'3.99','2005-07-07 06:10:55','2006-02-15 22:12:43'),(1546,56,2,4702,'4.99','2005-07-08 11:41:36','2006-02-15 22:12:43'),(1547,56,1,5142,'4.99','2005-07-09 08:05:23','2006-02-15 22:12:43'),(1548,56,1,7385,'2.99','2005-07-27 15:49:46','2006-02-15 22:12:43'),(1549,56,1,7696,'7.99','2005-07-28 03:41:35','2006-02-15 22:12:43'),(1550,56,2,7942,'0.99','2005-07-28 12:49:44','2006-02-15 22:12:43'),(1551,56,1,8285,'0.99','2005-07-29 02:00:18','2006-02-15 22:12:43'),(1552,56,2,10356,'6.99','2005-08-01 05:49:17','2006-02-15 22:12:43'),(1553,56,2,10678,'0.99','2005-08-01 17:26:24','2006-02-15 22:12:43'),(1554,56,1,10946,'4.99','2005-08-02 03:20:39','2006-02-15 22:12:43'),(1555,56,1,11358,'5.99','2005-08-02 17:45:02','2006-02-15 22:12:43'),(1556,56,1,11656,'4.99','2005-08-17 05:11:09','2006-02-15 22:12:43'),(1557,56,2,12537,'1.99','2005-08-18 14:06:39','2006-02-15 22:12:43'),(1558,56,2,12713,'4.99','2005-08-18 21:07:28','2006-02-15 22:12:43'),(1559,56,2,13560,'8.99','2005-08-20 04:17:16','2006-02-15 22:12:43'),(1560,56,1,13769,'5.99','2005-08-20 11:43:52','2006-02-15 22:12:43'),(1561,56,2,14291,'3.99','2005-08-21 07:03:05','2006-02-15 22:12:43'),(1562,56,2,14534,'0.99','2005-08-21 15:16:29','2006-02-15 22:12:43'),(1563,56,2,15702,'7.99','2005-08-23 10:23:28','2006-02-15 22:12:43'),(1564,56,2,15714,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:43'),(1565,57,2,152,'9.99','2005-05-26 00:41:10','2006-02-15 22:12:43'),(1566,57,2,943,'4.99','2005-05-30 15:20:19','2006-02-15 22:12:43'),(1567,57,1,2058,'5.99','2005-06-17 15:34:41','2006-02-15 22:12:43'),(1568,57,1,2105,'0.99','2005-06-17 19:15:45','2006-02-15 22:12:43'),(1569,57,1,2360,'4.99','2005-06-18 13:11:13','2006-02-15 22:12:43'),(1570,57,2,2910,'7.99','2005-06-20 03:31:18','2006-02-15 22:12:43'),(1571,57,1,3357,'0.99','2005-06-21 11:55:42','2006-02-15 22:12:43'),(1572,57,1,3727,'4.99','2005-07-06 11:16:43','2006-02-15 22:12:43'),(1573,57,2,4226,'4.99','2005-07-07 12:37:56','2006-02-15 22:12:43'),(1574,57,1,5060,'4.99','2005-07-09 04:28:03','2006-02-15 22:12:43'),(1575,57,1,5694,'0.99','2005-07-10 09:40:38','2006-02-15 22:12:43'),(1576,57,2,5948,'2.99','2005-07-10 23:12:08','2006-02-15 22:12:43'),(1577,57,2,6482,'4.99','2005-07-12 01:50:21','2006-02-15 22:12:43'),(1578,57,1,6494,'1.99','2005-07-12 02:42:51','2006-02-15 22:12:43'),(1579,57,2,6649,'4.99','2005-07-12 10:51:09','2006-02-15 22:12:43'),(1580,57,2,8249,'5.99','2005-07-29 00:48:44','2006-02-15 22:12:43'),(1581,57,1,9086,'0.99','2005-07-30 08:18:46','2006-02-15 22:12:43'),(1582,57,2,9136,'0.99','2005-07-30 10:07:20','2006-02-15 22:12:43'),(1583,57,1,9211,'1.99','2005-07-30 12:59:45','2006-02-15 22:12:43'),(1584,57,1,9703,'0.99','2005-07-31 07:34:52','2006-02-15 22:12:43'),(1585,57,2,9812,'2.99','2005-07-31 11:28:07','2006-02-15 22:12:43'),(1586,57,2,10169,'4.99','2005-07-31 23:27:13','2006-02-15 22:12:43'),(1587,57,2,12925,'5.99','2005-08-19 04:59:01','2006-02-15 22:12:43'),(1588,57,2,13163,'0.99','2005-08-19 13:29:46','2006-02-15 22:12:43'),(1589,57,2,13743,'0.99','2005-08-20 10:51:27','2006-02-15 22:12:44'),(1590,57,2,13929,'9.99','2005-08-20 17:13:48','2006-02-15 22:12:44'),(1591,57,2,15571,'0.99','2005-08-23 05:26:30','2006-02-15 22:12:44'),(1592,57,2,15871,'9.99','2005-08-23 16:24:24','2006-02-15 22:12:44'),(1593,58,1,230,'0.99','2005-05-26 11:31:50','2006-02-15 22:12:44'),(1594,58,2,276,'7.99','2005-05-26 17:16:07','2006-02-15 22:12:44'),(1595,58,2,761,'0.99','2005-05-29 11:09:01','2006-02-15 22:12:44'),(1596,58,1,2191,'4.99','2005-06-18 01:33:09','2006-02-15 22:12:44'),(1597,58,2,2543,'0.99','2005-06-19 02:14:11','2006-02-15 22:12:44'),(1598,58,1,2906,'0.99','2005-06-20 03:04:56','2006-02-15 22:12:44'),(1599,58,1,3685,'4.99','2005-07-06 09:30:45','2006-02-15 22:12:44'),(1600,58,2,4131,'4.99','2005-07-07 07:53:18','2006-02-15 22:12:44'),(1601,58,2,5439,'1.99','2005-07-09 21:39:35','2006-02-15 22:12:44'),(1602,58,1,7063,'9.99','2005-07-27 03:52:27','2006-02-15 22:12:44'),(1603,58,2,7487,'4.99','2005-07-27 19:32:45','2006-02-15 22:12:44'),(1604,58,1,8853,'0.99','2005-07-29 23:34:21','2006-02-15 22:12:44'),(1605,58,2,9561,'2.99','2005-07-31 02:22:13','2006-02-15 22:12:44'),(1606,58,2,10037,'2.99','2005-07-31 18:48:08','2006-02-15 22:12:44'),(1607,58,1,10068,'4.99','2005-07-31 19:39:38','2006-02-15 22:12:44'),(1608,58,2,10256,'4.99','2005-08-01 02:47:11','2006-02-15 22:12:44'),(1609,58,1,10668,'0.99','2005-08-01 17:00:27','2006-02-15 22:12:44'),(1610,58,1,11416,'6.99','2005-08-02 19:44:04','2006-02-15 22:12:44'),(1611,58,2,12292,'8.99','2005-08-18 05:08:54','2006-02-15 22:12:44'),(1612,58,1,13194,'6.99','2005-08-19 14:34:12','2006-02-15 22:12:44'),(1613,58,1,13207,'3.99','2005-08-19 15:14:38','2006-02-15 22:12:44'),(1614,58,1,13930,'2.99','2005-08-20 17:15:06','2006-02-15 22:12:44'),(1615,58,2,13973,'4.99','2005-08-20 18:52:43','2006-02-15 22:12:44'),(1616,58,2,14305,'5.99','2005-08-21 07:29:05','2006-02-15 22:12:44'),(1617,58,1,14665,'6.99','2005-08-21 19:49:46','2006-02-15 22:12:44'),(1618,58,1,14989,'4.99','2005-08-22 07:47:07','2006-02-15 22:12:44'),(1619,58,2,15326,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:44'),(1620,59,2,212,'4.99','2005-05-26 08:34:41','2006-02-15 22:12:44'),(1621,59,2,951,'2.99','2005-05-30 16:10:35','2006-02-15 22:12:44'),(1622,59,1,1154,'5.99','2005-05-31 21:42:09','2006-02-15 22:12:44'),(1623,59,1,1269,'2.99','2005-06-15 07:29:59','2006-02-15 22:12:44'),(1624,59,1,1728,'3.99','2005-06-16 15:29:29','2006-02-15 22:12:44'),(1625,59,1,2921,'3.99','2005-06-20 04:13:04','2006-02-15 22:12:44'),(1626,59,2,4148,'2.99','2005-07-07 08:36:58','2006-02-15 22:12:44'),(1627,59,1,4384,'4.99','2005-07-07 20:46:45','2006-02-15 22:12:44'),(1628,59,1,4631,'4.99','2005-07-08 08:38:22','2006-02-15 22:12:44'),(1629,59,1,4891,'3.99','2005-07-08 20:06:19','2006-02-15 22:12:44'),(1630,59,2,5195,'8.99','2005-07-09 10:39:31','2006-02-15 22:12:44'),(1631,59,1,5207,'3.99','2005-07-09 11:15:44','2006-02-15 22:12:44'),(1632,59,1,5830,'4.99','2005-07-10 16:34:00','2006-02-15 22:12:44'),(1633,59,1,7991,'4.99','2005-07-28 14:45:45','2006-02-15 22:12:44'),(1634,59,2,8643,'4.99','2005-07-29 14:45:23','2006-02-15 22:12:44'),(1635,59,1,9469,'8.99','2005-07-30 22:56:34','2006-02-15 22:12:44'),(1636,59,2,9573,'6.99','2005-07-31 02:45:38','2006-02-15 22:12:44'),(1637,59,2,11396,'4.99','2005-08-02 18:48:29','2006-02-15 22:12:44'),(1638,59,1,12833,'5.99','2005-08-19 01:42:28','2006-02-15 22:12:44'),(1639,59,2,13282,'2.99','2005-08-19 18:08:18','2006-02-15 22:12:44'),(1640,59,1,13573,'2.99','2005-08-20 05:10:14','2006-02-15 22:12:44'),(1641,59,2,13921,'4.99','2005-08-20 16:57:11','2006-02-15 22:12:44'),(1642,59,1,14135,'5.99','2005-08-21 01:53:54','2006-02-15 22:12:44'),(1643,59,1,14977,'5.99','2005-08-22 07:12:53','2006-02-15 22:12:44'),(1644,59,2,15271,'5.99','2005-08-22 18:48:48','2006-02-15 22:12:44'),(1645,59,2,15744,'4.99','2005-08-23 12:15:51','2006-02-15 22:12:44'),(1646,59,2,15905,'2.99','2005-08-23 17:33:04','2006-02-15 22:12:44'),(1647,60,1,318,'4.99','2005-05-26 23:37:39','2006-02-15 22:12:44'),(1648,60,2,706,'1.99','2005-05-29 03:05:49','2006-02-15 22:12:44'),(1649,60,2,934,'2.99','2005-05-30 13:24:46','2006-02-15 22:12:44'),(1650,60,2,1482,'4.99','2005-06-15 21:18:16','2006-02-15 22:12:44'),(1651,60,2,2394,'4.99','2005-06-18 15:42:30','2006-02-15 22:12:44'),(1652,60,2,3473,'2.99','2005-07-05 22:57:34','2006-02-15 22:12:44'),(1653,60,1,3849,'2.99','2005-07-06 16:49:43','2006-02-15 22:12:44'),(1654,60,1,6282,'5.99','2005-07-11 16:46:22','2006-02-15 22:12:44'),(1655,60,2,7067,'0.99','2005-07-27 03:55:10','2006-02-15 22:12:44'),(1656,60,1,7331,'3.99','2005-07-27 13:57:50','2006-02-15 22:12:44'),(1657,60,1,7494,'0.99','2005-07-27 19:56:31','2006-02-15 22:12:44'),(1658,60,1,9356,'4.99','2005-07-30 18:36:24','2006-02-15 22:12:44'),(1659,60,1,9761,'4.99','2005-07-31 09:31:54','2006-02-15 22:12:44'),(1660,60,2,10680,'0.99','2005-08-01 17:28:05','2006-02-15 22:12:44'),(1661,60,1,11092,'4.99','2005-08-02 07:58:50','2006-02-15 22:12:44'),(1662,60,1,11404,'8.99','2005-08-02 19:12:40','2006-02-15 22:12:44'),(1663,60,1,12084,'1.99','2005-08-17 22:16:49','2006-02-15 22:12:44'),(1664,60,2,12614,'7.99','2005-08-18 17:16:03','2006-02-15 22:12:45'),(1665,60,1,15093,'2.99','2005-08-22 11:39:03','2006-02-15 22:12:45'),(1666,60,1,15318,'2.99','2005-08-22 20:15:16','2006-02-15 22:12:45'),(1667,60,1,15618,'5.99','2005-08-23 07:07:58','2006-02-15 22:12:45'),(1668,60,1,15632,'0.99','2005-08-23 07:30:26','2006-02-15 22:12:45'),(1669,60,1,15649,'2.99','2005-08-23 08:28:03','2006-02-15 22:12:45'),(1670,60,2,12489,'9.98','2006-02-14 15:16:03','2006-02-15 22:12:45'),(1671,60,2,14741,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:45'),(1672,61,1,1157,'0.99','2005-05-31 22:47:45','2006-02-15 22:12:45'),(1673,61,1,7027,'7.99','2005-07-27 02:50:15','2006-02-15 22:12:45'),(1674,61,2,7071,'1.99','2005-07-27 04:01:15','2006-02-15 22:12:45'),(1675,61,2,8029,'6.99','2005-07-28 16:11:21','2006-02-15 22:12:45'),(1676,61,2,8075,'4.99','2005-07-28 17:37:28','2006-02-15 22:12:45'),(1677,61,1,8651,'3.99','2005-07-29 15:02:18','2006-02-15 22:12:45'),(1678,61,2,9597,'6.99','2005-07-31 03:29:07','2006-02-15 22:12:45'),(1679,61,2,10549,'0.99','2005-08-01 12:46:39','2006-02-15 22:12:45'),(1680,61,2,11379,'2.99','2005-08-02 18:16:55','2006-02-15 22:12:45'),(1681,61,1,12072,'9.99','2005-08-17 21:50:25','2006-02-15 22:12:45'),(1682,61,1,13450,'0.99','2005-08-20 00:18:15','2006-02-15 22:12:45'),(1683,61,1,13830,'0.99','2005-08-20 13:57:59','2006-02-15 22:12:45'),(1684,61,2,15089,'6.99','2005-08-22 11:34:06','2006-02-15 22:12:45'),(1685,61,1,15681,'1.99','2005-08-23 09:35:34','2006-02-15 22:12:45'),(1686,62,2,885,'0.99','2005-05-30 06:54:28','2006-02-15 22:12:45'),(1687,62,1,947,'4.99','2005-05-30 15:36:57','2006-02-15 22:12:45'),(1688,62,2,1241,'6.99','2005-06-15 04:59:43','2006-02-15 22:12:45'),(1689,62,1,1486,'0.99','2005-06-15 21:25:30','2006-02-15 22:12:45'),(1690,62,1,1587,'0.99','2005-06-16 04:52:28','2006-02-15 22:12:45'),(1691,62,2,3021,'4.99','2005-06-20 11:13:01','2006-02-15 22:12:45'),(1692,62,1,3035,'5.99','2005-06-20 12:17:03','2006-02-15 22:12:45'),(1693,62,1,3287,'0.99','2005-06-21 06:32:39','2006-02-15 22:12:45'),(1694,62,1,3327,'3.99','2005-06-21 09:04:50','2006-02-15 22:12:45'),(1695,62,2,3843,'2.99','2005-07-06 16:35:40','2006-02-15 22:12:45'),(1696,62,2,4159,'4.99','2005-07-07 09:10:57','2006-02-15 22:12:45'),(1697,62,2,5292,'2.99','2005-07-09 15:16:54','2006-02-15 22:12:45'),(1698,62,2,8360,'4.99','2005-07-29 05:08:00','2006-02-15 22:12:45'),(1699,62,2,10080,'0.99','2005-07-31 20:07:10','2006-02-15 22:12:45'),(1700,62,1,10815,'2.99','2005-08-01 22:46:21','2006-02-15 22:12:45'),(1701,62,1,11297,'5.99','2005-08-02 15:22:47','2006-02-15 22:12:45'),(1702,62,1,11988,'0.99','2005-08-17 18:23:50','2006-02-15 22:12:45'),(1703,62,2,13512,'8.99','2005-08-20 02:27:13','2006-02-15 22:12:45'),(1704,62,2,14574,'1.99','2005-08-21 16:50:34','2006-02-15 22:12:45'),(1705,62,2,14594,'2.99','2005-08-21 17:34:24','2006-02-15 22:12:45'),(1706,62,2,14821,'4.99','2005-08-22 01:20:19','2006-02-15 22:12:45'),(1707,62,1,15464,'6.99','2005-08-23 01:15:18','2006-02-15 22:12:45'),(1708,62,1,15591,'0.99','2005-08-23 06:11:52','2006-02-15 22:12:45'),(1709,63,2,1818,'0.99','2005-06-16 21:30:34','2006-02-15 22:12:45'),(1710,63,2,3923,'8.99','2005-07-06 20:34:10','2006-02-15 22:12:45'),(1711,63,1,4587,'4.99','2005-07-08 06:16:26','2006-02-15 22:12:45'),(1712,63,1,5585,'6.99','2005-07-10 04:15:43','2006-02-15 22:12:45'),(1713,63,2,5788,'4.99','2005-07-10 14:10:22','2006-02-15 22:12:45'),(1714,63,2,5832,'4.99','2005-07-10 16:34:48','2006-02-15 22:12:45'),(1715,63,2,6769,'3.99','2005-07-12 15:48:54','2006-02-15 22:12:45'),(1716,63,2,6847,'8.99','2005-07-12 19:22:37','2006-02-15 22:12:45'),(1717,63,2,8311,'5.99','2005-07-29 03:26:07','2006-02-15 22:12:45'),(1718,63,2,9007,'0.99','2005-07-30 05:09:32','2006-02-15 22:12:45'),(1719,63,1,9546,'4.99','2005-07-31 01:47:40','2006-02-15 22:12:45'),(1720,63,2,9549,'3.99','2005-07-31 01:57:04','2006-02-15 22:12:45'),(1721,63,1,9795,'0.99','2005-07-31 10:47:19','2006-02-15 22:12:45'),(1722,63,2,9938,'2.99','2005-07-31 15:28:47','2006-02-15 22:12:45'),(1723,63,2,10148,'0.99','2005-07-31 22:19:16','2006-02-15 22:12:45'),(1724,63,1,10288,'6.99','2005-08-01 03:38:42','2006-02-15 22:12:45'),(1725,63,1,11902,'4.99','2005-08-17 15:37:34','2006-02-15 22:12:45'),(1726,63,2,12342,'2.99','2005-08-18 07:12:46','2006-02-15 22:12:45'),(1727,63,2,12515,'0.99','2005-08-18 13:39:26','2006-02-15 22:12:45'),(1728,63,1,12954,'7.99','2005-08-19 06:04:34','2006-02-15 22:12:45'),(1729,63,1,13089,'0.99','2005-08-19 10:38:56','2006-02-15 22:12:45'),(1730,63,1,13624,'8.99','2005-08-20 06:51:02','2006-02-15 22:12:45'),(1731,63,1,14931,'3.99','2005-08-22 05:38:55','2006-02-15 22:12:45'),(1732,63,1,15060,'5.99','2005-08-22 10:24:32','2006-02-15 22:12:45'),(1733,63,1,15229,'2.99','2005-08-22 17:30:25','2006-02-15 22:12:45'),(1734,64,1,494,'4.99','2005-05-28 00:39:31','2006-02-15 22:12:45'),(1735,64,1,587,'0.99','2005-05-28 12:05:33','2006-02-15 22:12:45'),(1736,64,1,1001,'2.99','2005-05-31 00:46:31','2006-02-15 22:12:45'),(1737,64,2,1335,'0.99','2005-06-15 11:51:30','2006-02-15 22:12:45'),(1738,64,1,2060,'2.99','2005-06-17 15:42:42','2006-02-15 22:12:45'),(1739,64,2,3982,'0.99','2005-07-06 23:14:16','2006-02-15 22:12:45'),(1740,64,1,4288,'4.99','2005-07-07 15:38:25','2006-02-15 22:12:45'),(1741,64,1,4690,'1.99','2005-07-08 11:04:02','2006-02-15 22:12:45'),(1742,64,2,4819,'5.99','2005-07-08 17:19:15','2006-02-15 22:12:45'),(1743,64,2,4971,'5.99','2005-07-08 23:54:49','2006-02-15 22:12:45'),(1744,64,1,5114,'3.99','2005-07-09 07:07:05','2006-02-15 22:12:46'),(1745,64,2,5279,'2.99','2005-07-09 14:46:36','2006-02-15 22:12:46'),(1746,64,1,5432,'0.99','2005-07-09 21:21:25','2006-02-15 22:12:46'),(1747,64,2,6372,'2.99','2005-07-11 21:35:06','2006-02-15 22:12:46'),(1748,64,2,6457,'0.99','2005-07-12 01:06:35','2006-02-15 22:12:46'),(1749,64,2,6698,'1.99','2005-07-12 12:45:00','2006-02-15 22:12:46'),(1750,64,2,6744,'0.99','2005-07-12 14:30:28','2006-02-15 22:12:46'),(1751,64,2,7045,'0.99','2005-07-27 03:27:35','2006-02-15 22:12:46'),(1752,64,1,7082,'2.99','2005-07-27 04:27:32','2006-02-15 22:12:46'),(1753,64,1,7476,'1.99','2005-07-27 19:08:56','2006-02-15 22:12:46'),(1754,64,2,8602,'4.99','2005-07-29 13:04:27','2006-02-15 22:12:46'),(1755,64,1,9832,'2.99','2005-07-31 12:01:49','2006-02-15 22:12:46'),(1756,64,1,9880,'6.99','2005-07-31 13:49:02','2006-02-15 22:12:46'),(1757,64,1,9924,'3.99','2005-07-31 15:04:57','2006-02-15 22:12:46'),(1758,64,2,10185,'0.99','2005-08-01 00:12:11','2006-02-15 22:12:46'),(1759,64,2,10714,'4.99','2005-08-01 18:51:29','2006-02-15 22:12:46'),(1760,64,1,10889,'4.99','2005-08-02 00:54:33','2006-02-15 22:12:46'),(1761,64,1,12409,'0.99','2005-08-18 09:43:58','2006-02-15 22:12:46'),(1762,64,1,13773,'2.99','2005-08-20 11:50:14','2006-02-15 22:12:46'),(1763,64,1,13971,'0.99','2005-08-20 18:44:53','2006-02-15 22:12:46'),(1764,64,1,14167,'5.99','2005-08-21 02:59:48','2006-02-15 22:12:46'),(1765,64,2,14316,'0.99','2005-08-21 07:59:47','2006-02-15 22:12:46'),(1766,64,2,13333,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:46'),(1767,65,1,295,'4.99','2005-05-26 20:33:20','2006-02-15 22:12:46'),(1768,65,2,657,'0.99','2005-05-28 20:23:09','2006-02-15 22:12:46'),(1769,65,1,2173,'7.99','2005-06-18 00:08:20','2006-02-15 22:12:46'),(1770,65,1,3051,'4.99','2005-06-20 13:06:52','2006-02-15 22:12:46'),(1771,65,1,3535,'4.99','2005-07-06 01:32:46','2006-02-15 22:12:46'),(1772,65,1,4240,'4.99','2005-07-07 13:33:12','2006-02-15 22:12:46'),(1773,65,2,4635,'3.99','2005-07-08 08:42:40','2006-02-15 22:12:46'),(1774,65,1,5735,'3.99','2005-07-10 11:39:15','2006-02-15 22:12:46'),(1775,65,2,6527,'0.99','2005-07-12 04:23:06','2006-02-15 22:12:46'),(1776,65,1,7877,'6.99','2005-07-28 10:25:36','2006-02-15 22:12:46'),(1777,65,2,8392,'1.99','2005-07-29 06:00:27','2006-02-15 22:12:46'),(1778,65,2,8404,'5.99','2005-07-29 06:27:01','2006-02-15 22:12:46'),(1779,65,1,9293,'3.99','2005-07-30 16:12:28','2006-02-15 22:12:46'),(1780,65,2,11100,'5.99','2005-08-02 08:08:00','2006-02-15 22:12:46'),(1781,65,1,11227,'8.99','2005-08-02 12:48:05','2006-02-15 22:12:46'),(1782,65,2,11461,'4.99','2005-08-02 21:35:00','2006-02-15 22:12:46'),(1783,65,2,11845,'2.99','2005-08-17 13:16:38','2006-02-15 22:12:46'),(1784,65,1,12114,'7.99','2005-08-17 23:02:00','2006-02-15 22:12:46'),(1785,65,1,12688,'6.99','2005-08-18 19:59:54','2006-02-15 22:12:46'),(1786,65,2,13692,'0.99','2005-08-20 09:07:52','2006-02-15 22:12:46'),(1787,65,2,14140,'6.99','2005-08-21 02:04:57','2006-02-15 22:12:46'),(1788,65,1,14356,'0.99','2005-08-21 09:08:51','2006-02-15 22:12:46'),(1789,66,2,933,'4.99','2005-05-30 13:08:45','2006-02-15 22:12:46'),(1790,66,1,1236,'2.99','2005-06-15 04:34:27','2006-02-15 22:12:46'),(1791,66,1,1907,'2.99','2005-06-17 05:08:27','2006-02-15 22:12:46'),(1792,66,1,2106,'4.99','2005-06-17 19:29:03','2006-02-15 22:12:46'),(1793,66,2,2571,'2.99','2005-06-19 04:20:14','2006-02-15 22:12:46'),(1794,66,1,2577,'4.99','2005-06-19 04:36:03','2006-02-15 22:12:46'),(1795,66,1,3334,'3.99','2005-06-21 10:04:33','2006-02-15 22:12:46'),(1796,66,2,3395,'6.99','2005-06-21 15:19:19','2006-02-15 22:12:46'),(1797,66,1,3573,'4.99','2005-07-06 03:33:48','2006-02-15 22:12:46'),(1798,66,2,3757,'2.99','2005-07-06 12:42:26','2006-02-15 22:12:46'),(1799,66,2,4088,'2.99','2005-07-07 05:31:55','2006-02-15 22:12:46'),(1800,66,1,4108,'4.99','2005-07-07 06:38:31','2006-02-15 22:12:46'),(1801,66,2,4165,'6.99','2005-07-07 09:23:27','2006-02-15 22:12:46'),(1802,66,2,4911,'5.99','2005-07-08 21:20:26','2006-02-15 22:12:46'),(1803,66,2,5915,'0.99','2005-07-10 21:12:16','2006-02-15 22:12:46'),(1804,66,1,6290,'8.99','2005-07-11 17:12:42','2006-02-15 22:12:46'),(1805,66,2,6348,'5.99','2005-07-11 20:21:18','2006-02-15 22:12:46'),(1806,66,1,6402,'3.99','2005-07-11 22:46:10','2006-02-15 22:12:46'),(1807,66,1,6995,'2.99','2005-07-27 01:12:13','2006-02-15 22:12:46'),(1808,66,1,7872,'2.99','2005-07-28 10:18:16','2006-02-15 22:12:46'),(1809,66,1,9091,'5.99','2005-07-30 08:30:45','2006-02-15 22:12:46'),(1810,66,1,10419,'0.99','2005-08-01 08:13:22','2006-02-15 22:12:46'),(1811,66,2,11028,'5.99','2005-08-02 05:48:20','2006-02-15 22:12:46'),(1812,66,2,11360,'2.99','2005-08-02 17:46:04','2006-02-15 22:12:46'),(1813,66,1,11683,'5.99','2005-08-17 06:15:17','2006-02-15 22:12:46'),(1814,66,1,11935,'0.99','2005-08-17 16:42:13','2006-02-15 22:12:46'),(1815,66,1,12699,'0.99','2005-08-18 20:20:59','2006-02-15 22:12:46'),(1816,66,1,13900,'2.99','2005-08-20 16:05:41','2006-02-15 22:12:46'),(1817,66,2,14123,'2.99','2005-08-21 01:31:25','2006-02-15 22:12:46'),(1818,66,1,14217,'6.99','2005-08-21 04:37:56','2006-02-15 22:12:46'),(1819,66,2,14351,'2.99','2005-08-21 09:04:20','2006-02-15 22:12:46'),(1820,66,2,14429,'0.99','2005-08-21 11:29:43','2006-02-15 22:12:46'),(1821,66,2,15026,'4.99','2005-08-22 09:01:52','2006-02-15 22:12:47'),(1822,66,1,15598,'8.99','2005-08-23 06:23:26','2006-02-15 22:12:47'),(1823,67,2,331,'9.99','2005-05-27 02:22:26','2006-02-15 22:12:47'),(1824,67,1,767,'2.99','2005-05-29 12:20:19','2006-02-15 22:12:47'),(1825,67,1,2064,'3.99','2005-06-17 15:57:56','2006-02-15 22:12:47'),(1826,67,1,2542,'3.99','2005-06-19 02:08:39','2006-02-15 22:12:47'),(1827,67,2,2810,'0.99','2005-06-19 19:44:12','2006-02-15 22:12:47'),(1828,67,1,3359,'4.99','2005-06-21 12:08:18','2006-02-15 22:12:47'),(1829,67,2,4090,'4.99','2005-07-07 05:47:33','2006-02-15 22:12:47'),(1830,67,2,5399,'2.99','2005-07-09 19:52:44','2006-02-15 22:12:47'),(1831,67,2,5510,'2.99','2005-07-10 00:58:37','2006-02-15 22:12:47'),(1832,67,1,6137,'2.99','2005-07-11 08:34:20','2006-02-15 22:12:47'),(1833,67,2,7277,'5.99','2005-07-27 11:48:37','2006-02-15 22:12:47'),(1834,67,2,7895,'0.99','2005-07-28 10:57:15','2006-02-15 22:12:47'),(1835,67,2,8563,'1.99','2005-07-29 11:32:58','2006-02-15 22:12:47'),(1836,67,1,9640,'7.99','2005-07-31 05:33:25','2006-02-15 22:12:47'),(1837,67,1,11295,'8.99','2005-08-02 15:10:06','2006-02-15 22:12:47'),(1838,67,1,11894,'8.99','2005-08-17 15:15:01','2006-02-15 22:12:47'),(1839,67,2,13437,'4.99','2005-08-19 23:37:52','2006-02-15 22:12:47'),(1840,67,1,13652,'2.99','2005-08-20 07:52:34','2006-02-15 22:12:47'),(1841,67,2,13791,'4.99','2005-08-20 12:21:05','2006-02-15 22:12:47'),(1842,67,2,13837,'2.99','2005-08-20 14:19:03','2006-02-15 22:12:47'),(1843,67,2,14967,'4.99','2005-08-22 06:46:03','2006-02-15 22:12:47'),(1844,67,2,15085,'2.99','2005-08-22 11:19:22','2006-02-15 22:12:47'),(1845,68,2,1828,'5.99','2005-06-16 22:04:34','2006-02-15 22:12:47'),(1846,68,2,1957,'8.99','2005-06-17 08:50:58','2006-02-15 22:12:47'),(1847,68,2,2633,'2.99','2005-06-19 08:53:10','2006-02-15 22:12:47'),(1848,68,2,2662,'4.99','2005-06-19 10:53:42','2006-02-15 22:12:47'),(1849,68,1,2686,'2.99','2005-06-19 12:44:20','2006-02-15 22:12:47'),(1850,68,1,3598,'0.99','2005-07-06 05:11:04','2006-02-15 22:12:47'),(1851,68,2,3801,'4.99','2005-07-06 15:05:50','2006-02-15 22:12:47'),(1852,68,1,3864,'0.99','2005-07-06 17:41:42','2006-02-15 22:12:47'),(1853,68,2,4555,'6.99','2005-07-08 04:48:36','2006-02-15 22:12:47'),(1854,68,1,4925,'3.99','2005-07-08 21:56:00','2006-02-15 22:12:47'),(1855,68,1,6512,'4.99','2005-07-12 03:42:49','2006-02-15 22:12:47'),(1856,68,2,9339,'3.99','2005-07-30 18:03:28','2006-02-15 22:12:47'),(1857,68,1,9538,'3.99','2005-07-31 01:25:22','2006-02-15 22:12:47'),(1858,68,2,9642,'4.99','2005-07-31 05:33:57','2006-02-15 22:12:47'),(1859,68,1,10115,'7.99','2005-07-31 21:13:47','2006-02-15 22:12:47'),(1860,68,1,11277,'2.99','2005-08-02 14:28:50','2006-02-15 22:12:47'),(1861,68,2,12742,'2.99','2005-08-18 22:22:03','2006-02-15 22:12:47'),(1862,68,2,13475,'4.99','2005-08-20 01:05:05','2006-02-15 22:12:47'),(1863,68,2,14242,'0.99','2005-08-21 05:25:59','2006-02-15 22:12:47'),(1864,68,2,14455,'5.99','2005-08-21 12:36:11','2006-02-15 22:12:47'),(1865,68,1,14947,'1.99','2005-08-22 06:07:52','2006-02-15 22:12:47'),(1866,68,1,15524,'4.99','2005-08-23 03:36:26','2006-02-15 22:12:47'),(1867,69,2,584,'4.99','2005-05-28 11:49:00','2006-02-15 22:12:47'),(1868,69,2,765,'1.99','2005-05-29 11:38:34','2006-02-15 22:12:47'),(1869,69,1,1549,'2.99','2005-06-16 01:57:15','2006-02-15 22:12:47'),(1870,69,1,3358,'4.99','2005-06-21 11:56:40','2006-02-15 22:12:47'),(1871,69,1,3883,'8.99','2005-07-06 18:39:38','2006-02-15 22:12:47'),(1872,69,1,4265,'0.99','2005-07-07 14:27:51','2006-02-15 22:12:47'),(1873,69,1,4427,'0.99','2005-07-07 22:28:51','2006-02-15 22:12:47'),(1874,69,2,5569,'3.99','2005-07-10 03:38:32','2006-02-15 22:12:47'),(1875,69,2,6297,'4.99','2005-07-11 17:37:22','2006-02-15 22:12:47'),(1876,69,1,6385,'6.99','2005-07-11 22:07:32','2006-02-15 22:12:47'),(1877,69,2,6785,'6.99','2005-07-12 16:30:57','2006-02-15 22:12:47'),(1878,69,2,8649,'6.99','2005-07-29 14:57:33','2006-02-15 22:12:47'),(1879,69,2,9193,'2.99','2005-07-30 12:28:42','2006-02-15 22:12:47'),(1880,69,1,9612,'2.99','2005-07-31 03:58:31','2006-02-15 22:12:47'),(1881,69,2,10074,'0.99','2005-07-31 19:57:16','2006-02-15 22:12:47'),(1882,69,1,11943,'3.99','2005-08-17 17:00:42','2006-02-15 22:12:47'),(1883,69,1,12012,'2.99','2005-08-17 19:20:48','2006-02-15 22:12:47'),(1884,69,1,12121,'2.99','2005-08-17 23:20:40','2006-02-15 22:12:47'),(1885,69,1,12966,'5.99','2005-08-19 06:37:48','2006-02-15 22:12:47'),(1886,69,1,13023,'5.99','2005-08-19 08:13:54','2006-02-15 22:12:47'),(1887,69,2,14311,'3.99','2005-08-21 07:45:47','2006-02-15 22:12:47'),(1888,69,2,14685,'0.99','2005-08-21 20:31:25','2006-02-15 22:12:47'),(1889,69,2,14767,'2.99','2005-08-21 23:43:00','2006-02-15 22:12:47'),(1890,69,1,15547,'2.99','2005-08-23 04:25:50','2006-02-15 22:12:47'),(1891,69,2,11995,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:47'),(1892,70,2,1044,'4.99','2005-05-31 06:24:44','2006-02-15 22:12:47'),(1893,70,1,2472,'4.99','2005-06-18 20:32:40','2006-02-15 22:12:47'),(1894,70,1,4061,'0.99','2005-07-07 04:13:35','2006-02-15 22:12:47'),(1895,70,1,5927,'5.99','2005-07-10 21:57:14','2006-02-15 22:12:47'),(1896,70,2,7036,'4.99','2005-07-27 03:06:12','2006-02-15 22:12:47'),(1897,70,2,7421,'7.99','2005-07-27 17:10:05','2006-02-15 22:12:47'),(1898,70,1,7714,'2.99','2005-07-28 04:32:30','2006-02-15 22:12:47'),(1899,70,2,8550,'0.99','2005-07-29 11:12:37','2006-02-15 22:12:48'),(1900,70,1,8747,'2.99','2005-07-29 19:07:57','2006-02-15 22:12:48'),(1901,70,1,11274,'9.99','2005-08-02 14:24:08','2006-02-15 22:12:48'),(1902,70,1,11901,'2.99','2005-08-17 15:35:47','2006-02-15 22:12:48'),(1903,70,1,12003,'4.99','2005-08-17 18:56:05','2006-02-15 22:12:48'),(1904,70,2,12218,'4.99','2005-08-18 02:48:14','2006-02-15 22:12:48'),(1905,70,1,12581,'6.99','2005-08-18 15:49:15','2006-02-15 22:12:48'),(1906,70,1,12951,'3.99','2005-08-19 05:56:44','2006-02-15 22:12:48'),(1907,70,2,13680,'4.99','2005-08-20 08:44:06','2006-02-15 22:12:48'),(1908,70,2,15238,'0.99','2005-08-22 17:46:12','2006-02-15 22:12:48'),(1909,70,1,15616,'3.99','2005-08-23 07:06:38','2006-02-15 22:12:48'),(1910,71,1,199,'2.99','2005-05-26 07:11:58','2006-02-15 22:12:48'),(1911,71,1,272,'9.99','2005-05-26 16:27:11','2006-02-15 22:12:48'),(1912,71,2,1873,'2.99','2005-06-17 02:38:28','2006-02-15 22:12:48'),(1913,71,1,2374,'4.99','2005-06-18 14:44:06','2006-02-15 22:12:48'),(1914,71,2,3345,'5.99','2005-06-21 11:05:07','2006-02-15 22:12:48'),(1915,71,2,4614,'4.99','2005-07-08 07:45:17','2006-02-15 22:12:48'),(1916,71,2,5281,'1.99','2005-07-09 14:55:07','2006-02-15 22:12:48'),(1917,71,2,5358,'3.99','2005-07-09 18:09:21','2006-02-15 22:12:48'),(1918,71,1,5543,'8.99','2005-07-10 02:48:03','2006-02-15 22:12:48'),(1919,71,1,5770,'4.99','2005-07-10 13:21:28','2006-02-15 22:12:48'),(1920,71,2,5814,'4.99','2005-07-10 15:46:50','2006-02-15 22:12:48'),(1921,71,2,6020,'0.99','2005-07-11 02:08:55','2006-02-15 22:12:48'),(1922,71,1,6739,'5.99','2005-07-12 14:22:08','2006-02-15 22:12:48'),(1923,71,2,7160,'0.99','2005-07-27 07:26:06','2006-02-15 22:12:48'),(1924,71,1,7550,'4.99','2005-07-27 21:55:07','2006-02-15 22:12:48'),(1925,71,2,7982,'4.99','2005-07-28 14:19:59','2006-02-15 22:12:48'),(1926,71,2,8128,'2.99','2005-07-28 19:46:06','2006-02-15 22:12:48'),(1927,71,1,8293,'2.99','2005-07-29 02:30:50','2006-02-15 22:12:48'),(1928,71,1,8574,'1.99','2005-07-29 11:51:53','2006-02-15 22:12:48'),(1929,71,1,8668,'4.99','2005-07-29 15:41:31','2006-02-15 22:12:48'),(1930,71,1,8783,'3.99','2005-07-29 20:31:28','2006-02-15 22:12:48'),(1931,71,1,8789,'4.99','2005-07-29 20:47:27','2006-02-15 22:12:48'),(1932,71,1,8956,'0.99','2005-07-30 03:32:29','2006-02-15 22:12:48'),(1933,71,1,12417,'4.99','2005-08-18 09:57:00','2006-02-15 22:12:48'),(1934,71,1,14105,'7.99','2005-08-21 00:44:34','2006-02-15 22:12:48'),(1935,71,1,14228,'3.99','2005-08-21 04:57:08','2006-02-15 22:12:48'),(1936,71,2,14781,'4.99','2005-08-22 00:15:12','2006-02-15 22:12:48'),(1937,71,2,14904,'3.99','2005-08-22 04:32:01','2006-02-15 22:12:48'),(1938,71,1,15704,'4.99','2005-08-23 10:25:45','2006-02-15 22:12:48'),(1939,71,1,16000,'0.99','2005-08-23 20:44:36','2006-02-15 22:12:48'),(1940,72,2,785,'4.99','2005-05-29 15:08:41','2006-02-15 22:12:48'),(1941,72,2,845,'4.99','2005-05-30 01:17:25','2006-02-15 22:12:48'),(1942,72,2,1047,'0.99','2005-05-31 06:45:57','2006-02-15 22:12:48'),(1943,72,2,2294,'4.99','2005-06-18 07:46:34','2006-02-15 22:12:48'),(1944,72,1,3700,'0.99','2005-07-06 10:12:19','2006-02-15 22:12:48'),(1945,72,2,5223,'4.99','2005-07-09 12:06:03','2006-02-15 22:12:48'),(1946,72,1,5302,'4.99','2005-07-09 15:42:36','2006-02-15 22:12:48'),(1947,72,1,5424,'0.99','2005-07-09 20:59:09','2006-02-15 22:12:48'),(1948,72,1,5840,'4.99','2005-07-10 17:09:09','2006-02-15 22:12:48'),(1949,72,2,6081,'0.99','2005-07-11 05:11:09','2006-02-15 22:12:48'),(1950,72,2,8228,'4.99','2005-07-29 00:08:58','2006-02-15 22:12:48'),(1951,72,1,9027,'2.99','2005-07-30 05:58:27','2006-02-15 22:12:48'),(1952,72,2,9420,'5.99','2005-07-30 21:05:18','2006-02-15 22:12:48'),(1953,72,2,9648,'4.99','2005-07-31 05:46:03','2006-02-15 22:12:48'),(1954,72,2,10267,'0.99','2005-08-01 03:07:26','2006-02-15 22:12:48'),(1955,72,2,11206,'6.99','2005-08-02 11:58:03','2006-02-15 22:12:48'),(1956,72,2,11422,'5.99','2005-08-02 19:52:08','2006-02-15 22:12:48'),(1957,72,1,11630,'2.99','2005-08-17 04:27:46','2006-02-15 22:12:48'),(1958,72,1,11679,'4.99','2005-08-17 06:08:54','2006-02-15 22:12:48'),(1959,72,1,11923,'2.99','2005-08-17 16:21:47','2006-02-15 22:12:48'),(1960,72,2,12020,'2.99','2005-08-17 19:50:33','2006-02-15 22:12:48'),(1961,72,1,12448,'0.99','2005-08-18 10:59:04','2006-02-15 22:12:48'),(1962,72,2,12593,'0.99','2005-08-18 16:17:54','2006-02-15 22:12:48'),(1963,72,1,13145,'0.99','2005-08-19 12:53:53','2006-02-15 22:12:48'),(1964,72,2,13327,'4.99','2005-08-19 19:55:45','2006-02-15 22:12:48'),(1965,72,2,13597,'0.99','2005-08-20 05:59:05','2006-02-15 22:12:48'),(1966,72,2,13660,'4.99','2005-08-20 08:05:56','2006-02-15 22:12:48'),(1967,72,1,14020,'0.99','2005-08-20 20:59:43','2006-02-15 22:12:48'),(1968,72,2,15110,'0.99','2005-08-22 12:16:46','2006-02-15 22:12:48'),(1969,72,2,15146,'2.99','2005-08-22 13:57:55','2006-02-15 22:12:48'),(1970,73,1,70,'2.99','2005-05-25 10:15:23','2006-02-15 22:12:48'),(1971,73,2,1133,'4.99','2005-05-31 19:12:21','2006-02-15 22:12:48'),(1972,73,1,1669,'0.99','2005-06-16 10:20:20','2006-02-15 22:12:48'),(1973,73,2,2940,'4.99','2005-06-20 05:20:01','2006-02-15 22:12:48'),(1974,73,2,4327,'2.99','2005-07-07 18:01:39','2006-02-15 22:12:48'),(1975,73,1,4789,'4.99','2005-07-08 16:22:01','2006-02-15 22:12:49'),(1976,73,2,5021,'4.99','2005-07-09 02:09:41','2006-02-15 22:12:49'),(1977,73,1,6514,'9.99','2005-07-12 03:47:44','2006-02-15 22:12:49'),(1978,73,1,6645,'2.99','2005-07-12 10:39:55','2006-02-15 22:12:49'),(1979,73,1,7590,'4.99','2005-07-27 23:24:24','2006-02-15 22:12:49'),(1980,73,1,7683,'4.99','2005-07-28 03:11:29','2006-02-15 22:12:49'),(1981,73,1,8377,'4.99','2005-07-29 05:27:40','2006-02-15 22:12:49'),(1982,73,1,9212,'2.99','2005-07-30 13:03:13','2006-02-15 22:12:49'),(1983,73,1,9776,'2.99','2005-07-31 10:01:03','2006-02-15 22:12:49'),(1984,73,2,10434,'4.99','2005-08-01 08:47:00','2006-02-15 22:12:49'),(1985,73,1,11102,'4.99','2005-08-02 08:08:30','2006-02-15 22:12:49'),(1986,73,2,11155,'0.99','2005-08-02 09:55:28','2006-02-15 22:12:49'),(1987,73,2,11349,'4.99','2005-08-02 17:21:49','2006-02-15 22:12:49'),(1988,73,2,11609,'3.99','2005-08-17 03:41:11','2006-02-15 22:12:49'),(1989,73,2,12291,'4.99','2005-08-18 05:08:37','2006-02-15 22:12:49'),(1990,73,1,13886,'4.99','2005-08-20 15:34:43','2006-02-15 22:12:49'),(1991,73,1,15667,'0.99','2005-08-23 09:02:03','2006-02-15 22:12:49'),(1992,73,2,16002,'2.99','2005-08-23 20:47:12','2006-02-15 22:12:49'),(1993,73,2,13108,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:49'),(1994,74,2,1121,'6.99','2005-05-31 16:37:36','2006-02-15 22:12:49'),(1995,74,1,2498,'1.99','2005-06-18 22:56:26','2006-02-15 22:12:49'),(1996,74,2,2517,'0.99','2005-06-19 00:11:26','2006-02-15 22:12:49'),(1997,74,1,3020,'1.99','2005-06-20 11:12:04','2006-02-15 22:12:49'),(1998,74,2,3445,'7.99','2005-06-21 20:40:28','2006-02-15 22:12:49'),(1999,74,2,3819,'3.99','2005-07-06 15:35:06','2006-02-15 22:12:49'),(2000,74,1,5530,'2.99','2005-07-10 02:13:49','2006-02-15 22:12:49'),(2001,74,2,5603,'2.99','2005-07-10 05:04:54','2006-02-15 22:12:49'),(2002,74,2,5917,'4.99','2005-07-10 21:30:22','2006-02-15 22:12:49'),(2003,74,1,6241,'7.99','2005-07-11 14:40:48','2006-02-15 22:12:49'),(2004,74,1,6475,'2.99','2005-07-12 01:36:57','2006-02-15 22:12:49'),(2005,74,1,7304,'6.99','2005-07-27 12:56:56','2006-02-15 22:12:49'),(2006,74,2,8796,'5.99','2005-07-29 21:09:11','2006-02-15 22:12:49'),(2007,74,2,9112,'4.99','2005-07-30 09:06:31','2006-02-15 22:12:49'),(2008,74,2,10051,'3.99','2005-07-31 19:14:20','2006-02-15 22:12:49'),(2009,74,1,10624,'0.99','2005-08-01 15:27:05','2006-02-15 22:12:49'),(2010,74,2,12374,'3.99','2005-08-18 08:07:45','2006-02-15 22:12:49'),(2011,74,2,12477,'3.99','2005-08-18 12:25:01','2006-02-15 22:12:49'),(2012,74,2,13335,'0.99','2005-08-19 20:03:18','2006-02-15 22:12:49'),(2013,74,2,13520,'0.99','2005-08-20 02:41:46','2006-02-15 22:12:49'),(2014,74,1,13583,'1.99','2005-08-20 05:29:45','2006-02-15 22:12:49'),(2015,74,2,13747,'5.99','2005-08-20 10:56:06','2006-02-15 22:12:49'),(2016,74,1,15286,'4.99','2005-08-22 19:17:56','2006-02-15 22:12:49'),(2017,74,2,15325,'4.99','2005-08-22 20:27:38','2006-02-15 22:12:49'),(2018,74,2,15500,'0.99','2005-08-23 02:39:37','2006-02-15 22:12:49'),(2019,74,2,15739,'4.99','2005-08-23 11:56:22','2006-02-15 22:12:49'),(2020,74,1,16046,'0.99','2005-08-23 22:26:47','2006-02-15 22:12:49'),(2021,75,1,180,'4.99','2005-05-26 04:46:23','2006-02-15 22:12:49'),(2022,75,2,268,'0.99','2005-05-26 16:19:08','2006-02-15 22:12:49'),(2023,75,1,1920,'4.99','2005-06-17 06:00:23','2006-02-15 22:12:49'),(2024,75,1,2161,'7.99','2005-06-17 23:39:50','2006-02-15 22:12:49'),(2025,75,2,2738,'4.99','2005-06-19 15:56:30','2006-02-15 22:12:49'),(2026,75,2,3062,'6.99','2005-06-20 13:50:00','2006-02-15 22:12:49'),(2027,75,1,3210,'4.99','2005-06-21 01:00:25','2006-02-15 22:12:49'),(2028,75,1,3711,'0.99','2005-07-06 10:46:15','2006-02-15 22:12:49'),(2029,75,2,4179,'2.99','2005-07-07 10:17:15','2006-02-15 22:12:49'),(2030,75,2,4511,'0.99','2005-07-08 02:36:21','2006-02-15 22:12:49'),(2031,75,1,4639,'5.99','2005-07-08 08:57:21','2006-02-15 22:12:49'),(2032,75,2,5260,'2.99','2005-07-09 14:05:45','2006-02-15 22:12:49'),(2033,75,2,6052,'0.99','2005-07-11 03:51:27','2006-02-15 22:12:49'),(2034,75,1,6092,'3.99','2005-07-11 05:51:31','2006-02-15 22:12:49'),(2035,75,1,6486,'0.99','2005-07-12 02:09:36','2006-02-15 22:12:49'),(2036,75,2,6530,'0.99','2005-07-12 04:33:19','2006-02-15 22:12:49'),(2037,75,2,6852,'2.99','2005-07-12 19:33:49','2006-02-15 22:12:49'),(2038,75,1,7052,'2.99','2005-07-27 03:36:38','2006-02-15 22:12:49'),(2039,75,1,7454,'4.99','2005-07-27 18:27:26','2006-02-15 22:12:49'),(2040,75,1,7843,'0.99','2005-07-28 09:10:22','2006-02-15 22:12:49'),(2041,75,2,7897,'2.99','2005-07-28 11:01:51','2006-02-15 22:12:49'),(2042,75,2,8202,'1.99','2005-07-28 23:11:45','2006-02-15 22:12:49'),(2043,75,1,8823,'6.99','2005-07-29 22:22:12','2006-02-15 22:12:49'),(2044,75,2,9168,'5.99','2005-07-30 11:31:17','2006-02-15 22:12:49'),(2045,75,2,9442,'4.99','2005-07-30 21:44:31','2006-02-15 22:12:49'),(2046,75,2,9501,'4.99','2005-07-30 23:59:21','2006-02-15 22:12:49'),(2047,75,1,9783,'9.99','2005-07-31 10:15:46','2006-02-15 22:12:49'),(2048,75,2,10653,'5.99','2005-08-01 16:28:07','2006-02-15 22:12:49'),(2049,75,1,10726,'3.99','2005-08-01 19:14:53','2006-02-15 22:12:50'),(2050,75,1,10871,'4.99','2005-08-02 00:27:24','2006-02-15 22:12:50'),(2051,75,1,11330,'0.99','2005-08-02 16:45:33','2006-02-15 22:12:50'),(2052,75,1,12002,'2.99','2005-08-17 18:56:02','2006-02-15 22:12:50'),(2053,75,2,12239,'0.99','2005-08-18 03:26:42','2006-02-15 22:12:50'),(2054,75,1,12336,'1.99','2005-08-18 06:59:41','2006-02-15 22:12:50'),(2055,75,1,12412,'5.99','2005-08-18 09:49:52','2006-02-15 22:12:50'),(2056,75,1,12426,'4.99','2005-08-18 10:24:11','2006-02-15 22:12:50'),(2057,75,1,12662,'0.99','2005-08-18 19:10:41','2006-02-15 22:12:50'),(2058,75,2,15928,'5.99','2005-08-23 18:23:24','2006-02-15 22:12:50'),(2059,75,2,13534,'8.97','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2060,75,1,14488,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2061,75,2,15191,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2062,76,2,574,'1.99','2005-05-28 10:44:28','2006-02-15 22:12:50'),(2063,76,1,926,'0.99','2005-05-30 12:15:54','2006-02-15 22:12:50'),(2064,76,2,1487,'0.99','2005-06-15 21:27:42','2006-02-15 22:12:50'),(2065,76,1,1791,'6.99','2005-06-16 20:04:28','2006-02-15 22:12:50'),(2066,76,2,2111,'0.99','2005-06-17 19:47:21','2006-02-15 22:12:50'),(2067,76,2,2397,'1.99','2005-06-18 15:51:25','2006-02-15 22:12:50'),(2068,76,1,2894,'0.99','2005-06-20 02:22:42','2006-02-15 22:12:50'),(2069,76,2,3416,'0.99','2005-06-21 17:05:29','2006-02-15 22:12:50'),(2070,76,2,4099,'4.99','2005-07-07 06:20:33','2006-02-15 22:12:50'),(2071,76,2,5571,'0.99','2005-07-10 03:48:20','2006-02-15 22:12:50'),(2072,76,2,6789,'0.99','2005-07-12 16:34:40','2006-02-15 22:12:50'),(2073,76,2,8253,'6.99','2005-07-29 00:57:06','2006-02-15 22:12:50'),(2074,76,2,8357,'2.99','2005-07-29 04:59:44','2006-02-15 22:12:50'),(2075,76,2,8405,'3.99','2005-07-29 06:28:19','2006-02-15 22:12:50'),(2076,76,1,8935,'0.99','2005-07-30 02:38:45','2006-02-15 22:12:50'),(2077,76,2,9312,'2.99','2005-07-30 16:59:17','2006-02-15 22:12:50'),(2078,76,2,10082,'0.99','2005-07-31 20:09:32','2006-02-15 22:12:50'),(2079,76,2,10795,'4.99','2005-08-01 21:56:37','2006-02-15 22:12:50'),(2080,76,2,11172,'7.99','2005-08-02 10:27:52','2006-02-15 22:12:50'),(2081,76,2,13697,'3.99','2005-08-20 09:21:08','2006-02-15 22:12:50'),(2082,76,1,14637,'2.99','2005-08-21 19:01:00','2006-02-15 22:12:50'),(2083,76,2,15169,'4.99','2005-08-22 15:21:56','2006-02-15 22:12:50'),(2084,76,1,15566,'10.99','2005-08-23 05:17:23','2006-02-15 22:12:50'),(2085,77,2,319,'2.99','2005-05-26 23:52:13','2006-02-15 22:12:50'),(2086,77,1,419,'1.99','2005-05-27 15:15:11','2006-02-15 22:12:50'),(2087,77,2,561,'2.99','2005-05-28 08:54:06','2006-02-15 22:12:50'),(2088,77,1,586,'0.99','2005-05-28 12:03:00','2006-02-15 22:12:50'),(2089,77,1,760,'5.99','2005-05-29 11:07:25','2006-02-15 22:12:50'),(2090,77,1,1710,'4.99','2005-06-16 14:11:24','2006-02-15 22:12:50'),(2091,77,1,2354,'3.99','2005-06-18 12:54:18','2006-02-15 22:12:50'),(2092,77,2,2452,'8.99','2005-06-18 19:29:21','2006-02-15 22:12:50'),(2093,77,1,3151,'2.99','2005-06-20 20:36:53','2006-02-15 22:12:50'),(2094,77,2,3238,'0.99','2005-06-21 02:48:21','2006-02-15 22:12:50'),(2095,77,2,4928,'0.99','2005-07-08 22:05:41','2006-02-15 22:12:50'),(2096,77,2,6168,'0.99','2005-07-11 10:21:38','2006-02-15 22:12:50'),(2097,77,2,6390,'2.99','2005-07-11 22:19:23','2006-02-15 22:12:50'),(2098,77,1,7406,'3.99','2005-07-27 16:25:45','2006-02-15 22:12:50'),(2099,77,1,7710,'0.99','2005-07-28 04:24:07','2006-02-15 22:12:50'),(2100,77,2,8942,'4.99','2005-07-30 03:01:07','2006-02-15 22:12:50'),(2101,77,1,9811,'0.99','2005-07-31 11:23:45','2006-02-15 22:12:50'),(2102,77,2,10184,'4.99','2005-08-01 00:09:33','2006-02-15 22:12:50'),(2103,77,1,10886,'2.99','2005-08-02 00:52:34','2006-02-15 22:12:50'),(2104,77,1,10895,'0.99','2005-08-02 01:16:59','2006-02-15 22:12:50'),(2105,77,2,10991,'0.99','2005-08-02 04:41:12','2006-02-15 22:12:50'),(2106,77,1,11469,'2.99','2005-08-02 21:48:09','2006-02-15 22:12:50'),(2107,77,2,11767,'7.99','2005-08-17 10:00:40','2006-02-15 22:12:50'),(2108,77,1,12065,'6.99','2005-08-17 21:31:46','2006-02-15 22:12:50'),(2109,77,2,12328,'1.99','2005-08-18 06:43:56','2006-02-15 22:12:50'),(2110,77,2,13752,'9.99','2005-08-20 11:17:45','2006-02-15 22:12:50'),(2111,77,2,14530,'4.99','2005-08-21 15:10:50','2006-02-15 22:12:50'),(2112,77,2,15359,'2.99','2005-08-22 21:34:00','2006-02-15 22:12:50'),(2113,78,1,2207,'2.99','2005-06-18 02:19:21','2006-02-15 22:12:50'),(2114,78,2,2949,'6.99','2005-06-20 06:05:53','2006-02-15 22:12:50'),(2115,78,2,3248,'7.99','2005-06-21 03:12:21','2006-02-15 22:12:50'),(2116,78,1,3593,'4.99','2005-07-06 04:39:52','2006-02-15 22:12:50'),(2117,78,2,4227,'5.99','2005-07-07 12:41:36','2006-02-15 22:12:50'),(2118,78,2,4627,'2.99','2005-07-08 08:24:39','2006-02-15 22:12:50'),(2119,78,2,4778,'0.99','2005-07-08 15:51:51','2006-02-15 22:12:50'),(2120,78,1,5078,'1.99','2005-07-09 05:20:24','2006-02-15 22:12:50'),(2121,78,2,5604,'0.99','2005-07-10 05:05:00','2006-02-15 22:12:51'),(2122,78,1,6005,'0.99','2005-07-11 01:36:42','2006-02-15 22:12:51'),(2123,78,1,6344,'4.99','2005-07-11 20:04:43','2006-02-15 22:12:51'),(2124,78,2,7200,'1.99','2005-07-27 08:57:38','2006-02-15 22:12:51'),(2125,78,2,7747,'4.99','2005-07-28 05:50:11','2006-02-15 22:12:51'),(2126,78,2,7926,'3.99','2005-07-28 12:13:02','2006-02-15 22:12:51'),(2127,78,1,7957,'6.99','2005-07-28 13:34:08','2006-02-15 22:12:51'),(2128,78,2,8920,'4.99','2005-07-30 01:59:24','2006-02-15 22:12:51'),(2129,78,1,9068,'5.99','2005-07-30 07:31:45','2006-02-15 22:12:51'),(2130,78,2,10350,'3.99','2005-08-01 05:30:05','2006-02-15 22:12:51'),(2131,78,1,10590,'2.99','2005-08-01 14:11:53','2006-02-15 22:12:51'),(2132,78,1,10831,'7.99','2005-08-01 23:22:45','2006-02-15 22:12:51'),(2133,78,1,10942,'10.99','2005-08-02 03:16:31','2006-02-15 22:12:51'),(2134,78,2,12474,'8.99','2005-08-18 12:10:03','2006-02-15 22:12:51'),(2135,78,2,12653,'4.99','2005-08-18 18:53:17','2006-02-15 22:12:51'),(2136,78,2,13124,'5.99','2005-08-19 11:55:59','2006-02-15 22:12:51'),(2137,78,1,13432,'0.99','2005-08-19 23:29:06','2006-02-15 22:12:51'),(2138,78,2,13792,'5.99','2005-08-20 12:21:37','2006-02-15 22:12:51'),(2139,78,2,14620,'2.99','2005-08-21 18:10:43','2006-02-15 22:12:51'),(2140,78,1,14716,'0.99','2005-08-21 21:29:55','2006-02-15 22:12:51'),(2141,78,1,14810,'2.99','2005-08-22 01:08:34','2006-02-15 22:12:51'),(2142,78,2,14862,'7.99','2005-08-22 02:51:41','2006-02-15 22:12:51'),(2143,78,2,16039,'2.99','2005-08-23 22:18:51','2006-02-15 22:12:51'),(2144,79,1,840,'4.99','2005-05-30 00:28:41','2006-02-15 22:12:51'),(2145,79,1,859,'2.99','2005-05-30 02:36:20','2006-02-15 22:12:51'),(2146,79,1,928,'2.99','2005-05-30 12:27:14','2006-02-15 22:12:51'),(2147,79,2,3096,'4.99','2005-06-20 16:17:56','2006-02-15 22:12:51'),(2148,79,2,3178,'2.99','2005-06-20 22:35:12','2006-02-15 22:12:51'),(2149,79,1,3641,'0.99','2005-07-06 07:17:09','2006-02-15 22:12:51'),(2150,79,1,3748,'2.99','2005-07-06 12:11:22','2006-02-15 22:12:51'),(2151,79,2,4049,'4.99','2005-07-07 03:34:53','2006-02-15 22:12:51'),(2152,79,1,4530,'4.99','2005-07-08 03:27:05','2006-02-15 22:12:51'),(2153,79,2,4736,'4.99','2005-07-08 13:22:55','2006-02-15 22:12:51'),(2154,79,2,5205,'2.99','2005-07-09 10:56:37','2006-02-15 22:12:51'),(2155,79,1,5555,'2.99','2005-07-10 03:08:55','2006-02-15 22:12:51'),(2156,79,2,6162,'5.99','2005-07-11 10:12:30','2006-02-15 22:12:51'),(2157,79,1,7220,'9.99','2005-07-27 09:35:54','2006-02-15 22:12:51'),(2158,79,1,8849,'2.99','2005-07-29 23:21:01','2006-02-15 22:12:51'),(2159,79,1,9814,'1.99','2005-07-31 11:29:46','2006-02-15 22:12:51'),(2160,79,2,9845,'6.99','2005-07-31 12:28:05','2006-02-15 22:12:51'),(2161,79,1,9989,'0.99','2005-07-31 17:22:39','2006-02-15 22:12:51'),(2162,79,1,10676,'2.99','2005-08-01 17:14:15','2006-02-15 22:12:51'),(2163,79,2,11641,'4.99','2005-08-17 04:45:39','2006-02-15 22:12:51'),(2164,79,2,13026,'2.99','2005-08-19 08:22:45','2006-02-15 22:12:51'),(2165,79,1,14179,'0.99','2005-08-21 03:14:27','2006-02-15 22:12:51'),(2166,80,1,2596,'2.99','2005-06-19 05:48:26','2006-02-15 22:12:51'),(2167,80,2,2805,'8.99','2005-06-19 19:29:17','2006-02-15 22:12:51'),(2168,80,1,3367,'3.99','2005-06-21 13:08:21','2006-02-15 22:12:51'),(2169,80,2,3623,'4.99','2005-07-06 06:05:23','2006-02-15 22:12:51'),(2170,80,2,4268,'8.99','2005-07-07 14:36:05','2006-02-15 22:12:51'),(2171,80,2,4299,'3.99','2005-07-07 16:33:48','2006-02-15 22:12:51'),(2172,80,1,4688,'5.99','2005-07-08 11:03:29','2006-02-15 22:12:51'),(2173,80,2,5420,'3.99','2005-07-09 20:48:42','2006-02-15 22:12:51'),(2174,80,2,5452,'4.99','2005-07-09 22:23:21','2006-02-15 22:12:51'),(2175,80,1,6199,'5.99','2005-07-11 12:16:03','2006-02-15 22:12:51'),(2176,80,2,6417,'6.99','2005-07-11 23:35:11','2006-02-15 22:12:51'),(2177,80,2,6707,'1.99','2005-07-12 13:07:55','2006-02-15 22:12:51'),(2178,80,2,7558,'0.99','2005-07-27 22:19:08','2006-02-15 22:12:51'),(2179,80,1,8509,'5.99','2005-07-29 09:38:19','2006-02-15 22:12:51'),(2180,80,1,8884,'6.99','2005-07-30 00:26:22','2006-02-15 22:12:51'),(2181,80,1,10313,'0.99','2005-08-01 04:29:29','2006-02-15 22:12:51'),(2182,80,1,10656,'6.99','2005-08-01 16:38:04','2006-02-15 22:12:51'),(2183,80,1,10690,'8.99','2005-08-01 18:05:54','2006-02-15 22:12:51'),(2184,80,2,11101,'5.99','2005-08-02 08:08:24','2006-02-15 22:12:51'),(2185,80,2,11839,'0.99','2005-08-17 13:08:45','2006-02-15 22:12:51'),(2186,80,1,11850,'1.99','2005-08-17 13:30:15','2006-02-15 22:12:51'),(2187,80,2,12468,'2.99','2005-08-18 11:41:47','2006-02-15 22:12:51'),(2188,80,1,13352,'4.99','2005-08-19 20:51:40','2006-02-15 22:12:51'),(2189,80,2,13395,'0.99','2005-08-19 22:05:40','2006-02-15 22:12:51'),(2190,80,1,13724,'4.99','2005-08-20 10:07:28','2006-02-15 22:12:51'),(2191,80,2,13851,'0.99','2005-08-20 14:44:22','2006-02-15 22:12:51'),(2192,80,1,14916,'0.99','2005-08-22 04:56:57','2006-02-15 22:12:52'),(2193,80,1,15648,'8.99','2005-08-23 08:27:57','2006-02-15 22:12:52'),(2194,80,1,16012,'5.99','2005-08-23 21:13:39','2006-02-15 22:12:52'),(2195,80,2,12457,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:52'),(2196,81,1,289,'0.99','2005-05-26 20:01:09','2006-02-15 22:12:52'),(2197,81,1,2714,'1.99','2005-06-19 14:26:09','2006-02-15 22:12:52'),(2198,81,1,2854,'5.99','2005-06-19 23:11:48','2006-02-15 22:12:52'),(2199,81,1,3229,'4.99','2005-06-21 02:20:41','2006-02-15 22:12:52'),(2200,81,1,3879,'2.99','2005-07-06 18:31:20','2006-02-15 22:12:52'),(2201,81,2,4983,'9.99','2005-07-09 00:34:16','2006-02-15 22:12:52'),(2202,81,1,5468,'0.99','2005-07-09 23:06:09','2006-02-15 22:12:52'),(2203,81,2,7130,'4.99','2005-07-27 06:23:36','2006-02-15 22:12:52'),(2204,81,1,7709,'0.99','2005-07-28 04:22:14','2006-02-15 22:12:52'),(2205,81,2,9454,'3.99','2005-07-30 22:20:09','2006-02-15 22:12:52'),(2206,81,2,10456,'0.99','2005-08-01 09:17:21','2006-02-15 22:12:52'),(2207,81,1,11837,'5.99','2005-08-17 13:04:41','2006-02-15 22:12:52'),(2208,81,2,12181,'4.99','2005-08-18 01:28:18','2006-02-15 22:12:52'),(2209,81,2,13820,'5.99','2005-08-20 13:26:37','2006-02-15 22:12:52'),(2210,81,1,14128,'4.99','2005-08-21 01:35:58','2006-02-15 22:12:52'),(2211,81,1,14642,'3.99','2005-08-21 19:09:40','2006-02-15 22:12:52'),(2212,81,2,14748,'7.99','2005-08-21 23:02:02','2006-02-15 22:12:52'),(2213,81,1,15224,'5.99','2005-08-22 17:18:05','2006-02-15 22:12:52'),(2214,81,1,15602,'4.99','2005-08-23 06:41:07','2006-02-15 22:12:52'),(2215,81,1,15823,'4.99','2005-08-23 15:08:00','2006-02-15 22:12:52'),(2216,81,1,15858,'2.99','2005-08-23 16:07:15','2006-02-15 22:12:52'),(2217,81,2,15884,'1.99','2005-08-23 16:45:28','2006-02-15 22:12:52'),(2218,82,2,145,'2.99','2005-05-25 23:59:03','2006-02-15 22:12:52'),(2219,82,2,288,'8.99','2005-05-26 19:47:49','2006-02-15 22:12:52'),(2220,82,1,1438,'0.99','2005-06-15 18:38:51','2006-02-15 22:12:52'),(2221,82,2,1570,'0.99','2005-06-16 03:21:33','2006-02-15 22:12:52'),(2222,82,1,2506,'8.99','2005-06-18 23:29:53','2006-02-15 22:12:52'),(2223,82,1,2819,'8.99','2005-06-19 20:13:33','2006-02-15 22:12:52'),(2224,82,2,3332,'0.99','2005-06-21 09:55:12','2006-02-15 22:12:52'),(2225,82,1,3680,'2.99','2005-07-06 09:16:10','2006-02-15 22:12:52'),(2226,82,1,4598,'6.99','2005-07-08 06:46:26','2006-02-15 22:12:52'),(2227,82,2,5746,'4.99','2005-07-10 12:15:12','2006-02-15 22:12:52'),(2228,82,2,6082,'6.99','2005-07-11 05:12:41','2006-02-15 22:12:52'),(2229,82,2,6708,'6.99','2005-07-12 13:10:55','2006-02-15 22:12:52'),(2230,82,2,7733,'9.99','2005-07-28 05:04:47','2006-02-15 22:12:52'),(2231,82,2,7873,'0.99','2005-07-28 10:19:46','2006-02-15 22:12:52'),(2232,82,1,8487,'4.99','2005-07-29 08:53:49','2006-02-15 22:12:52'),(2233,82,2,9277,'3.99','2005-07-30 15:13:45','2006-02-15 22:12:52'),(2234,82,1,9305,'8.99','2005-07-30 16:45:56','2006-02-15 22:12:52'),(2235,82,1,9447,'6.99','2005-07-30 21:54:22','2006-02-15 22:12:52'),(2236,82,1,11093,'4.99','2005-08-02 07:59:49','2006-02-15 22:12:52'),(2237,82,2,11688,'5.99','2005-08-17 06:41:58','2006-02-15 22:12:52'),(2238,82,1,12470,'3.99','2005-08-18 11:55:42','2006-02-15 22:12:52'),(2239,82,1,13032,'0.99','2005-08-19 08:31:50','2006-02-15 22:12:52'),(2240,82,2,13847,'6.99','2005-08-20 14:33:59','2006-02-15 22:12:52'),(2241,82,2,14518,'0.99','2005-08-21 14:58:58','2006-02-15 22:12:52'),(2242,82,2,14892,'4.99','2005-08-22 04:15:05','2006-02-15 22:12:52'),(2243,82,2,15516,'3.99','2005-08-23 03:12:54','2006-02-15 22:12:52'),(2244,83,2,222,'0.99','2005-05-26 10:14:38','2006-02-15 22:12:52'),(2245,83,2,950,'0.99','2005-05-30 16:06:08','2006-02-15 22:12:52'),(2246,83,2,989,'2.99','2005-05-30 23:11:51','2006-02-15 22:12:52'),(2247,83,1,1354,'5.99','2005-06-15 13:13:49','2006-02-15 22:12:52'),(2248,83,1,1591,'5.99','2005-06-16 05:12:37','2006-02-15 22:12:52'),(2249,83,2,1617,'3.99','2005-06-16 07:06:06','2006-02-15 22:12:52'),(2250,83,2,3230,'4.99','2005-06-21 02:23:16','2006-02-15 22:12:52'),(2251,83,2,3722,'6.99','2005-07-06 11:10:27','2006-02-15 22:12:52'),(2252,83,1,3754,'2.99','2005-07-06 12:35:44','2006-02-15 22:12:52'),(2253,83,1,5218,'0.99','2005-07-09 11:57:12','2006-02-15 22:12:52'),(2254,83,2,5394,'6.99','2005-07-09 19:36:15','2006-02-15 22:12:52'),(2255,83,2,6194,'2.99','2005-07-11 11:51:00','2006-02-15 22:12:52'),(2256,83,2,6861,'2.99','2005-07-12 19:56:52','2006-02-15 22:12:52'),(2257,83,2,7721,'0.99','2005-07-28 04:42:58','2006-02-15 22:12:52'),(2258,83,2,8729,'4.99','2005-07-29 18:23:02','2006-02-15 22:12:52'),(2259,83,1,9867,'1.99','2005-07-31 13:17:04','2006-02-15 22:12:53'),(2260,83,1,11408,'0.99','2005-08-02 19:25:13','2006-02-15 22:12:53'),(2261,83,1,11565,'5.99','2005-08-17 01:28:05','2006-02-15 22:12:53'),(2262,83,2,11777,'4.99','2005-08-17 10:27:19','2006-02-15 22:12:53'),(2263,83,1,12258,'4.99','2005-08-18 04:11:13','2006-02-15 22:12:53'),(2264,83,2,12985,'5.99','2005-08-19 07:08:05','2006-02-15 22:12:53'),(2265,83,1,13875,'4.99','2005-08-20 15:13:11','2006-02-15 22:12:53'),(2266,83,2,15498,'4.99','2005-08-23 02:33:27','2006-02-15 22:12:53'),(2267,83,2,15737,'5.99','2005-08-23 11:52:18','2006-02-15 22:12:53'),(2268,83,2,11563,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:53'),(2269,84,2,408,'0.99','2005-05-27 13:57:39','2006-02-15 22:12:53'),(2270,84,1,739,'6.99','2005-05-29 08:28:18','2006-02-15 22:12:53'),(2271,84,1,834,'4.99','2005-05-29 23:24:30','2006-02-15 22:12:53'),(2272,84,2,1195,'0.99','2005-06-15 01:37:38','2006-02-15 22:12:53'),(2273,84,2,1320,'4.99','2005-06-15 10:42:13','2006-02-15 22:12:53'),(2274,84,2,1815,'0.99','2005-06-16 21:16:07','2006-02-15 22:12:53'),(2275,84,1,2012,'5.99','2005-06-17 11:57:15','2006-02-15 22:12:53'),(2276,84,2,2042,'0.99','2005-06-17 14:31:02','2006-02-15 22:12:53'),(2277,84,2,2409,'0.99','2005-06-18 16:53:33','2006-02-15 22:12:53'),(2278,84,2,4079,'6.99','2005-07-07 05:06:27','2006-02-15 22:12:53'),(2279,84,2,4838,'6.99','2005-07-08 18:11:00','2006-02-15 22:12:53'),(2280,84,1,5221,'5.99','2005-07-09 12:02:23','2006-02-15 22:12:53'),(2281,84,1,5237,'0.99','2005-07-09 12:56:58','2006-02-15 22:12:53'),(2282,84,1,5971,'5.99','2005-07-11 00:05:58','2006-02-15 22:12:53'),(2283,84,2,6259,'2.99','2005-07-11 15:25:52','2006-02-15 22:12:53'),(2284,84,2,6415,'9.99','2005-07-11 23:27:52','2006-02-15 22:12:53'),(2285,84,1,7854,'2.99','2005-07-28 09:42:31','2006-02-15 22:12:53'),(2286,84,2,8019,'4.99','2005-07-28 15:37:43','2006-02-15 22:12:53'),(2287,84,1,8654,'8.99','2005-07-29 15:04:27','2006-02-15 22:12:53'),(2288,84,2,9074,'2.99','2005-07-30 07:50:10','2006-02-15 22:12:53'),(2289,84,2,9680,'4.99','2005-07-31 06:41:46','2006-02-15 22:12:53'),(2290,84,2,10540,'0.99','2005-08-01 12:24:42','2006-02-15 22:12:53'),(2291,84,1,10872,'2.99','2005-08-02 00:27:50','2006-02-15 22:12:53'),(2292,84,2,11220,'4.99','2005-08-02 12:31:41','2006-02-15 22:12:53'),(2293,84,2,11424,'3.99','2005-08-02 19:57:42','2006-02-15 22:12:53'),(2294,84,2,11453,'7.99','2005-08-02 21:00:05','2006-02-15 22:12:53'),(2295,84,2,11899,'0.99','2005-08-17 15:29:12','2006-02-15 22:12:53'),(2296,84,2,11960,'4.99','2005-08-17 17:24:30','2006-02-15 22:12:53'),(2297,84,2,12364,'4.99','2005-08-18 07:55:09','2006-02-15 22:12:53'),(2298,84,2,13115,'2.99','2005-08-19 11:27:43','2006-02-15 22:12:53'),(2299,84,1,14330,'5.99','2005-08-21 08:29:20','2006-02-15 22:12:53'),(2300,84,1,15190,'4.99','2005-08-22 15:57:38','2006-02-15 22:12:53'),(2301,84,1,15255,'2.99','2005-08-22 18:16:50','2006-02-15 22:12:53'),(2302,85,1,690,'9.99','2005-05-29 00:54:53','2006-02-15 22:12:53'),(2303,85,2,908,'4.99','2005-05-30 10:38:37','2006-02-15 22:12:53'),(2304,85,1,1685,'1.99','2005-06-16 12:06:57','2006-02-15 22:12:53'),(2305,85,1,2131,'5.99','2005-06-17 21:02:25','2006-02-15 22:12:53'),(2306,85,2,2794,'0.99','2005-06-19 18:53:05','2006-02-15 22:12:53'),(2307,85,1,3165,'4.99','2005-06-20 21:29:17','2006-02-15 22:12:53'),(2308,85,1,3307,'1.99','2005-06-21 07:52:30','2006-02-15 22:12:53'),(2309,85,2,3418,'3.99','2005-06-21 17:06:38','2006-02-15 22:12:53'),(2310,85,2,4451,'0.99','2005-07-07 23:29:54','2006-02-15 22:12:53'),(2311,85,1,4705,'2.99','2005-07-08 11:50:38','2006-02-15 22:12:53'),(2312,85,1,5051,'4.99','2005-07-09 03:57:53','2006-02-15 22:12:53'),(2313,85,1,5519,'0.99','2005-07-10 01:18:32','2006-02-15 22:12:53'),(2314,85,2,7906,'0.99','2005-07-28 11:31:42','2006-02-15 22:12:53'),(2315,85,2,9427,'7.99','2005-07-30 21:16:33','2006-02-15 22:12:53'),(2316,85,2,9957,'4.99','2005-07-31 16:03:55','2006-02-15 22:12:53'),(2317,85,1,9985,'2.99','2005-07-31 17:14:47','2006-02-15 22:12:53'),(2318,85,1,10328,'4.99','2005-08-01 04:56:10','2006-02-15 22:12:53'),(2319,85,1,10548,'0.99','2005-08-01 12:44:32','2006-02-15 22:12:53'),(2320,85,2,11067,'8.99','2005-08-02 07:03:24','2006-02-15 22:12:53'),(2321,85,2,12036,'0.99','2005-08-17 20:19:06','2006-02-15 22:12:53'),(2322,85,1,12456,'4.99','2005-08-18 11:21:51','2006-02-15 22:12:53'),(2323,85,1,13727,'3.99','2005-08-20 10:08:53','2006-02-15 22:12:53'),(2324,85,2,13733,'0.99','2005-08-20 10:25:12','2006-02-15 22:12:53'),(2325,86,1,66,'1.99','2005-05-25 09:35:12','2006-02-15 22:12:53'),(2326,86,2,1640,'4.99','2005-06-16 08:35:39','2006-02-15 22:12:54'),(2327,86,2,1822,'0.99','2005-06-16 21:43:45','2006-02-15 22:12:54'),(2328,86,2,1924,'2.99','2005-06-17 06:13:34','2006-02-15 22:12:54'),(2329,86,1,2141,'4.99','2005-06-17 21:41:34','2006-02-15 22:12:54'),(2330,86,1,2518,'4.99','2005-06-19 00:16:23','2006-02-15 22:12:54'),(2331,86,1,3207,'0.99','2005-06-21 00:43:16','2006-02-15 22:12:54'),(2332,86,2,3270,'4.99','2005-06-21 05:07:31','2006-02-15 22:12:54'),(2333,86,1,3611,'0.99','2005-07-06 05:37:18','2006-02-15 22:12:54'),(2334,86,2,3945,'4.99','2005-07-06 21:35:00','2006-02-15 22:12:54'),(2335,86,1,4235,'2.99','2005-07-07 13:05:52','2006-02-15 22:12:54'),(2336,86,1,4571,'9.99','2005-07-08 05:34:41','2006-02-15 22:12:54'),(2337,86,2,5295,'0.99','2005-07-09 15:25:06','2006-02-15 22:12:54'),(2338,86,1,5752,'8.99','2005-07-10 12:27:38','2006-02-15 22:12:54'),(2339,86,2,6872,'7.99','2005-07-12 20:15:04','2006-02-15 22:12:54'),(2340,86,1,7231,'2.99','2005-07-27 10:01:51','2006-02-15 22:12:54'),(2341,86,1,7874,'10.99','2005-07-28 10:21:52','2006-02-15 22:12:54'),(2342,86,2,8803,'5.99','2005-07-29 21:26:24','2006-02-15 22:12:54'),(2343,86,1,8850,'2.99','2005-07-29 23:24:20','2006-02-15 22:12:54'),(2344,86,2,9376,'4.99','2005-07-30 19:11:49','2006-02-15 22:12:54'),(2345,86,2,10252,'8.99','2005-08-01 02:39:39','2006-02-15 22:12:54'),(2346,86,2,10536,'4.99','2005-08-01 12:21:53','2006-02-15 22:12:54'),(2347,86,2,10584,'6.99','2005-08-01 13:58:47','2006-02-15 22:12:54'),(2348,86,2,11916,'0.99','2005-08-17 16:05:51','2006-02-15 22:12:54'),(2349,86,1,12198,'2.99','2005-08-18 02:09:20','2006-02-15 22:12:54'),(2350,86,2,12870,'3.99','2005-08-19 02:54:38','2006-02-15 22:12:54'),(2351,86,2,13338,'4.99','2005-08-19 20:09:59','2006-02-15 22:12:54'),(2352,86,1,13535,'4.99','2005-08-20 03:30:25','2006-02-15 22:12:54'),(2353,86,1,13874,'2.99','2005-08-20 15:11:48','2006-02-15 22:12:54'),(2354,86,2,14122,'1.99','2005-08-21 01:29:01','2006-02-15 22:12:54'),(2355,86,2,15099,'4.99','2005-08-22 11:49:16','2006-02-15 22:12:54'),(2356,86,1,15715,'1.99','2005-08-23 10:57:40','2006-02-15 22:12:54'),(2357,86,2,15940,'5.99','2005-08-23 18:45:06','2006-02-15 22:12:54'),(2358,87,2,451,'4.99','2005-05-27 19:27:54','2006-02-15 22:12:54'),(2359,87,1,674,'2.99','2005-05-28 22:11:35','2006-02-15 22:12:54'),(2360,87,2,1580,'4.99','2005-06-16 04:12:25','2006-02-15 22:12:54'),(2361,87,1,1904,'2.99','2005-06-17 04:45:41','2006-02-15 22:12:54'),(2362,87,2,2408,'2.99','2005-06-18 16:50:44','2006-02-15 22:12:54'),(2363,87,1,2516,'4.99','2005-06-19 00:03:28','2006-02-15 22:12:54'),(2364,87,2,3122,'9.99','2005-06-20 18:25:57','2006-02-15 22:12:54'),(2365,87,1,5084,'7.99','2005-07-09 05:33:27','2006-02-15 22:12:54'),(2366,87,1,5628,'3.99','2005-07-10 05:56:40','2006-02-15 22:12:54'),(2367,87,2,5700,'4.99','2005-07-10 09:49:42','2006-02-15 22:12:54'),(2368,87,1,6638,'4.99','2005-07-12 09:58:02','2006-02-15 22:12:54'),(2369,87,2,7599,'2.99','2005-07-27 23:38:46','2006-02-15 22:12:54'),(2370,87,2,8187,'7.99','2005-07-28 22:33:53','2006-02-15 22:12:54'),(2371,87,1,8286,'5.99','2005-07-29 02:02:46','2006-02-15 22:12:54'),(2372,87,2,8323,'4.99','2005-07-29 03:52:59','2006-02-15 22:12:54'),(2373,87,2,9060,'0.99','2005-07-30 07:20:36','2006-02-15 22:12:54'),(2374,87,1,9348,'2.99','2005-07-30 18:17:09','2006-02-15 22:12:54'),(2375,87,2,9364,'8.99','2005-07-30 18:44:44','2006-02-15 22:12:54'),(2376,87,2,10205,'4.99','2005-08-01 00:48:24','2006-02-15 22:12:54'),(2377,87,1,10387,'4.99','2005-08-01 06:42:31','2006-02-15 22:12:54'),(2378,87,1,12232,'0.99','2005-08-18 03:14:14','2006-02-15 22:12:54'),(2379,87,1,12257,'8.99','2005-08-18 04:11:03','2006-02-15 22:12:54'),(2380,87,1,12264,'5.99','2005-08-18 04:17:33','2006-02-15 22:12:54'),(2381,87,1,13479,'0.99','2005-08-20 01:09:11','2006-02-15 22:12:54'),(2382,87,1,13906,'0.99','2005-08-20 16:16:03','2006-02-15 22:12:54'),(2383,87,2,14024,'10.99','2005-08-20 21:13:58','2006-02-15 22:12:54'),(2384,87,1,14566,'2.99','2005-08-21 16:25:05','2006-02-15 22:12:54'),(2385,87,1,15876,'2.99','2005-08-23 16:32:10','2006-02-15 22:12:54'),(2386,87,2,15890,'4.99','2005-08-23 16:58:12','2006-02-15 22:12:54'),(2387,87,2,12719,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:54'),(2388,88,2,36,'2.99','2005-05-25 04:36:26','2006-02-15 22:12:54'),(2389,88,1,1433,'2.99','2005-06-15 18:30:00','2006-02-15 22:12:54'),(2390,88,1,2483,'7.99','2005-06-18 21:22:23','2006-02-15 22:12:54'),(2391,88,1,2878,'2.99','2005-06-20 01:09:14','2006-02-15 22:12:55'),(2392,88,2,3524,'0.99','2005-07-06 01:01:51','2006-02-15 22:12:55'),(2393,88,2,3620,'0.99','2005-07-06 06:01:50','2006-02-15 22:12:55'),(2394,88,2,3673,'5.99','2005-07-06 09:02:09','2006-02-15 22:12:55'),(2395,88,1,3846,'5.99','2005-07-06 16:43:10','2006-02-15 22:12:55'),(2396,88,1,6643,'1.99','2005-07-12 10:39:22','2006-02-15 22:12:55'),(2397,88,1,6916,'4.99','2005-07-12 22:29:18','2006-02-15 22:12:55'),(2398,88,1,7088,'5.99','2005-07-27 04:42:28','2006-02-15 22:12:55'),(2399,88,1,7621,'8.99','2005-07-28 00:34:06','2006-02-15 22:12:55'),(2400,88,1,8296,'2.99','2005-07-29 02:43:25','2006-02-15 22:12:55'),(2401,88,2,8526,'2.99','2005-07-29 10:20:48','2006-02-15 22:12:55'),(2402,88,1,8692,'2.99','2005-07-29 16:43:39','2006-02-15 22:12:55'),(2403,88,1,10424,'0.99','2005-08-01 08:22:54','2006-02-15 22:12:55'),(2404,88,1,11056,'6.99','2005-08-02 06:36:27','2006-02-15 22:12:55'),(2405,88,2,14097,'2.99','2005-08-21 00:28:48','2006-02-15 22:12:55'),(2406,88,2,14827,'5.99','2005-08-22 01:32:32','2006-02-15 22:12:55'),(2407,88,2,15098,'3.99','2005-08-22 11:48:19','2006-02-15 22:12:55'),(2408,88,1,15898,'4.99','2005-08-23 17:13:01','2006-02-15 22:12:55'),(2409,89,2,141,'2.99','2005-05-25 23:34:53','2006-02-15 22:12:55'),(2410,89,2,588,'0.99','2005-05-28 12:08:37','2006-02-15 22:12:55'),(2411,89,1,740,'5.99','2005-05-29 08:30:36','2006-02-15 22:12:55'),(2412,89,1,1252,'8.99','2005-06-15 06:05:18','2006-02-15 22:12:55'),(2413,89,2,1407,'7.99','2005-06-15 16:45:07','2006-02-15 22:12:55'),(2414,89,1,1948,'4.99','2005-06-17 08:06:53','2006-02-15 22:12:55'),(2415,89,1,2523,'0.99','2005-06-19 00:45:56','2006-02-15 22:12:55'),(2416,89,1,2835,'7.99','2005-06-19 21:44:11','2006-02-15 22:12:55'),(2417,89,2,4152,'4.99','2005-07-07 08:50:33','2006-02-15 22:12:55'),(2418,89,1,4488,'0.99','2005-07-08 01:22:23','2006-02-15 22:12:55'),(2419,89,1,4764,'8.99','2005-07-08 15:01:25','2006-02-15 22:12:55'),(2420,89,2,5144,'7.99','2005-07-09 08:09:53','2006-02-15 22:12:55'),(2421,89,2,5436,'2.99','2005-07-09 21:31:11','2006-02-15 22:12:55'),(2422,89,1,5483,'2.99','2005-07-09 23:54:09','2006-02-15 22:12:55'),(2423,89,1,6772,'2.99','2005-07-12 15:55:35','2006-02-15 22:12:55'),(2424,89,2,7370,'7.99','2005-07-27 15:15:53','2006-02-15 22:12:55'),(2425,89,2,7729,'4.99','2005-07-28 04:57:57','2006-02-15 22:12:55'),(2426,89,2,7995,'4.99','2005-07-28 15:00:09','2006-02-15 22:12:55'),(2427,89,1,8003,'2.99','2005-07-28 15:11:27','2006-02-15 22:12:55'),(2428,89,2,8070,'2.99','2005-07-28 17:26:56','2006-02-15 22:12:55'),(2429,89,2,8972,'0.99','2005-07-30 04:06:25','2006-02-15 22:12:55'),(2430,89,1,9328,'2.99','2005-07-30 17:32:11','2006-02-15 22:12:55'),(2431,89,2,9646,'2.99','2005-07-31 05:43:28','2006-02-15 22:12:55'),(2432,89,2,9767,'0.99','2005-07-31 09:46:49','2006-02-15 22:12:55'),(2433,89,2,10164,'4.99','2005-07-31 23:17:57','2006-02-15 22:12:55'),(2434,89,2,10806,'4.99','2005-08-01 22:25:29','2006-02-15 22:12:55'),(2435,89,1,11090,'3.99','2005-08-02 07:56:40','2006-02-15 22:12:55'),(2436,89,1,12118,'3.99','2005-08-17 23:14:25','2006-02-15 22:12:55'),(2437,89,2,12431,'2.99','2005-08-18 10:34:59','2006-02-15 22:12:55'),(2438,89,1,12756,'2.99','2005-08-18 22:52:13','2006-02-15 22:12:55'),(2439,89,1,13823,'2.99','2005-08-20 13:42:10','2006-02-15 22:12:55'),(2440,89,1,15845,'2.99','2005-08-23 15:38:34','2006-02-15 22:12:55'),(2441,90,2,2033,'0.99','2005-06-17 13:24:43','2006-02-15 22:12:55'),(2442,90,2,2584,'6.99','2005-06-19 05:02:36','2006-02-15 22:12:55'),(2443,90,2,3132,'0.99','2005-06-20 19:09:46','2006-02-15 22:12:55'),(2444,90,2,3729,'3.99','2005-07-06 11:30:29','2006-02-15 22:12:55'),(2445,90,2,4371,'4.99','2005-07-07 20:06:45','2006-02-15 22:12:55'),(2446,90,2,5272,'0.99','2005-07-09 14:26:01','2006-02-15 22:12:55'),(2447,90,2,5539,'3.99','2005-07-10 02:42:58','2006-02-15 22:12:55'),(2448,90,2,7035,'5.99','2005-07-27 03:06:09','2006-02-15 22:12:55'),(2449,90,2,7058,'1.99','2005-07-27 03:50:46','2006-02-15 22:12:55'),(2450,90,1,7428,'5.99','2005-07-27 17:21:52','2006-02-15 22:12:55'),(2451,90,1,7946,'6.99','2005-07-28 13:01:22','2006-02-15 22:12:55'),(2452,90,1,8024,'2.99','2005-07-28 15:55:40','2006-02-15 22:12:55'),(2453,90,1,8408,'0.99','2005-07-29 06:40:40','2006-02-15 22:12:56'),(2454,90,2,8870,'9.99','2005-07-30 00:08:08','2006-02-15 22:12:56'),(2455,90,2,9337,'2.99','2005-07-30 18:02:25','2006-02-15 22:12:56'),(2456,90,2,10206,'7.99','2005-08-01 00:52:40','2006-02-15 22:12:56'),(2457,90,1,10722,'4.99','2005-08-01 19:07:08','2006-02-15 22:12:56'),(2458,90,1,10835,'4.99','2005-08-01 23:28:49','2006-02-15 22:12:56'),(2459,90,2,11231,'4.99','2005-08-02 13:02:11','2006-02-15 22:12:56'),(2460,90,1,11516,'0.99','2005-08-16 23:54:47','2006-02-15 22:12:56'),(2461,90,2,12019,'0.99','2005-08-17 19:48:55','2006-02-15 22:12:56'),(2462,90,1,12788,'2.99','2005-08-19 00:15:09','2006-02-15 22:12:56'),(2463,90,1,13051,'4.99','2005-08-19 09:31:33','2006-02-15 22:12:56'),(2464,90,1,14608,'1.99','2005-08-21 17:57:22','2006-02-15 22:12:56'),(2465,90,1,14807,'4.99','2005-08-22 00:57:43','2006-02-15 22:12:56'),(2466,90,2,15061,'0.99','2005-08-22 10:29:44','2006-02-15 22:12:56'),(2467,90,2,15217,'0.99','2005-08-22 16:58:31','2006-02-15 22:12:56'),(2468,90,1,15674,'7.99','2005-08-23 09:16:39','2006-02-15 22:12:56'),(2469,91,2,216,'5.99','2005-05-26 09:17:43','2006-02-15 22:12:56'),(2470,91,1,1299,'4.99','2005-06-15 09:34:50','2006-02-15 22:12:56'),(2471,91,1,2457,'3.99','2005-06-18 19:38:20','2006-02-15 22:12:56'),(2472,91,1,2908,'0.99','2005-06-20 03:16:52','2006-02-15 22:12:56'),(2473,91,2,3384,'2.99','2005-06-21 14:07:35','2006-02-15 22:12:56'),(2474,91,2,3802,'0.99','2005-07-06 15:06:09','2006-02-15 22:12:56'),(2475,91,2,4103,'2.99','2005-07-07 06:25:28','2006-02-15 22:12:56'),(2476,91,1,4245,'4.99','2005-07-07 13:48:33','2006-02-15 22:12:56'),(2477,91,1,4321,'4.99','2005-07-07 17:52:38','2006-02-15 22:12:56'),(2478,91,1,4673,'4.99','2005-07-08 10:16:00','2006-02-15 22:12:56'),(2479,91,2,5025,'4.99','2005-07-09 02:28:24','2006-02-15 22:12:56'),(2480,91,2,5187,'1.99','2005-07-09 10:19:51','2006-02-15 22:12:56'),(2481,91,2,5701,'0.99','2005-07-10 09:56:24','2006-02-15 22:12:56'),(2482,91,1,6078,'4.99','2005-07-11 05:06:52','2006-02-15 22:12:56'),(2483,91,1,6178,'2.99','2005-07-11 10:59:09','2006-02-15 22:12:56'),(2484,91,2,6860,'2.99','2005-07-12 19:54:17','2006-02-15 22:12:56'),(2485,91,2,7143,'0.99','2005-07-27 06:56:31','2006-02-15 22:12:56'),(2486,91,2,7637,'0.99','2005-07-28 01:12:25','2006-02-15 22:12:56'),(2487,91,1,7966,'4.99','2005-07-28 13:53:54','2006-02-15 22:12:56'),(2488,91,1,8313,'0.99','2005-07-29 03:34:21','2006-02-15 22:12:56'),(2489,91,2,8873,'0.99','2005-07-30 00:14:32','2006-02-15 22:12:56'),(2490,91,2,9228,'2.99','2005-07-30 13:36:57','2006-02-15 22:12:56'),(2491,91,2,9396,'4.99','2005-07-30 20:07:24','2006-02-15 22:12:56'),(2492,91,2,10008,'4.99','2005-07-31 17:59:36','2006-02-15 22:12:56'),(2493,91,2,11418,'0.99','2005-08-02 19:45:33','2006-02-15 22:12:56'),(2494,91,1,12847,'0.99','2005-08-19 02:04:07','2006-02-15 22:12:56'),(2495,91,2,13222,'4.99','2005-08-19 15:47:58','2006-02-15 22:12:56'),(2496,91,2,13309,'4.99','2005-08-19 19:04:00','2006-02-15 22:12:56'),(2497,91,1,14132,'0.99','2005-08-21 01:43:58','2006-02-15 22:12:56'),(2498,91,2,14888,'2.99','2005-08-22 04:09:18','2006-02-15 22:12:56'),(2499,91,1,15122,'1.99','2005-08-22 12:47:45','2006-02-15 22:12:56'),(2500,91,1,15341,'4.99','2005-08-22 20:56:31','2006-02-15 22:12:56'),(2501,91,1,15707,'1.99','2005-08-23 10:35:45','2006-02-15 22:12:56'),(2502,91,2,15886,'4.99','2005-08-23 16:50:53','2006-02-15 22:12:56'),(2503,91,1,12902,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:56'),(2504,92,1,271,'5.99','2005-05-26 16:22:01','2006-02-15 22:12:56'),(2505,92,1,456,'4.99','2005-05-27 19:50:06','2006-02-15 22:12:56'),(2506,92,2,2084,'4.99','2005-06-17 17:17:19','2006-02-15 22:12:56'),(2507,92,1,2521,'0.99','2005-06-19 00:41:08','2006-02-15 22:12:56'),(2508,92,1,2740,'8.99','2005-06-19 15:59:04','2006-02-15 22:12:56'),(2509,92,2,3595,'8.99','2005-07-06 04:59:49','2006-02-15 22:12:56'),(2510,92,2,3716,'7.99','2005-07-06 10:52:32','2006-02-15 22:12:56'),(2511,92,1,4360,'2.99','2005-07-07 19:31:12','2006-02-15 22:12:56'),(2512,92,2,4828,'4.99','2005-07-08 17:52:29','2006-02-15 22:12:56'),(2513,92,2,5497,'5.99','2005-07-10 00:23:23','2006-02-15 22:12:56'),(2514,92,2,5620,'7.99','2005-07-10 05:30:52','2006-02-15 22:12:56'),(2515,92,1,5792,'6.99','2005-07-10 14:22:19','2006-02-15 22:12:57'),(2516,92,2,5919,'2.99','2005-07-10 21:32:14','2006-02-15 22:12:57'),(2517,92,1,6158,'0.99','2005-07-11 09:50:24','2006-02-15 22:12:57'),(2518,92,2,6277,'6.99','2005-07-11 16:19:01','2006-02-15 22:12:57'),(2519,92,1,7073,'4.99','2005-07-27 04:03:26','2006-02-15 22:12:57'),(2520,92,1,7832,'1.99','2005-07-28 08:46:11','2006-02-15 22:12:57'),(2521,92,1,8494,'4.99','2005-07-29 09:04:32','2006-02-15 22:12:57'),(2522,92,1,8938,'4.99','2005-07-30 02:56:08','2006-02-15 22:12:57'),(2523,92,1,9240,'4.99','2005-07-30 13:57:54','2006-02-15 22:12:57'),(2524,92,2,11203,'4.99','2005-08-02 11:52:41','2006-02-15 22:12:57'),(2525,92,2,11245,'2.99','2005-08-02 13:33:50','2006-02-15 22:12:57'),(2526,92,1,11849,'4.99','2005-08-17 13:24:55','2006-02-15 22:12:57'),(2527,92,2,13020,'5.99','2005-08-19 08:07:50','2006-02-15 22:12:57'),(2528,92,1,13495,'0.99','2005-08-20 01:40:25','2006-02-15 22:12:57'),(2529,92,1,13620,'2.99','2005-08-20 06:41:27','2006-02-15 22:12:57'),(2530,92,1,14798,'0.99','2005-08-22 00:44:08','2006-02-15 22:12:57'),(2531,92,2,14998,'4.99','2005-08-22 07:53:14','2006-02-15 22:12:57'),(2532,93,2,113,'2.99','2005-05-25 19:07:40','2006-02-15 22:12:57'),(2533,93,2,420,'6.99','2005-05-27 15:19:38','2006-02-15 22:12:57'),(2534,93,1,1025,'4.99','2005-05-31 03:41:37','2006-02-15 22:12:57'),(2535,93,2,2256,'4.99','2005-06-18 05:21:56','2006-02-15 22:12:57'),(2536,93,1,3109,'0.99','2005-06-20 17:33:55','2006-02-15 22:12:57'),(2537,93,1,4733,'2.99','2005-07-08 13:12:07','2006-02-15 22:12:57'),(2538,93,2,5130,'4.99','2005-07-09 07:29:45','2006-02-15 22:12:57'),(2539,93,2,6287,'4.99','2005-07-11 17:00:04','2006-02-15 22:12:57'),(2540,93,1,6586,'4.99','2005-07-12 06:56:24','2006-02-15 22:12:57'),(2541,93,1,7301,'2.99','2005-07-27 12:50:23','2006-02-15 22:12:57'),(2542,93,1,8233,'0.99','2005-07-29 00:16:23','2006-02-15 22:12:57'),(2543,93,2,11271,'5.99','2005-08-02 14:18:22','2006-02-15 22:12:57'),(2544,93,1,12704,'4.99','2005-08-18 20:43:00','2006-02-15 22:12:57'),(2545,93,1,13555,'2.99','2005-08-20 04:09:50','2006-02-15 22:12:57'),(2546,93,2,13904,'2.99','2005-08-20 16:11:34','2006-02-15 22:12:57'),(2547,93,1,13950,'8.99','2005-08-20 17:58:00','2006-02-15 22:12:57'),(2548,93,1,13993,'4.99','2005-08-20 19:32:29','2006-02-15 22:12:57'),(2549,93,1,14195,'0.99','2005-08-21 03:40:35','2006-02-15 22:12:57'),(2550,93,2,14333,'4.99','2005-08-21 08:31:03','2006-02-15 22:12:57'),(2551,93,2,15324,'5.99','2005-08-22 20:23:13','2006-02-15 22:12:57'),(2552,93,2,15631,'2.99','2005-08-23 07:30:23','2006-02-15 22:12:57'),(2553,93,1,15696,'0.99','2005-08-23 10:04:17','2006-02-15 22:12:57'),(2554,93,2,15913,'1.99','2005-08-23 17:48:30','2006-02-15 22:12:57'),(2555,94,1,127,'2.99','2005-05-25 21:10:40','2006-02-15 22:12:57'),(2556,94,2,629,'4.99','2005-05-28 17:19:15','2006-02-15 22:12:57'),(2557,94,2,1213,'2.99','2005-06-15 03:14:05','2006-02-15 22:12:57'),(2558,94,1,1367,'4.99','2005-06-15 14:25:17','2006-02-15 22:12:57'),(2559,94,2,1734,'3.99','2005-06-16 15:49:30','2006-02-15 22:12:57'),(2560,94,2,2620,'4.99','2005-06-19 08:06:29','2006-02-15 22:12:57'),(2561,94,1,2816,'2.99','2005-06-19 20:04:23','2006-02-15 22:12:57'),(2562,94,2,4044,'0.99','2005-07-07 03:22:23','2006-02-15 22:12:57'),(2563,94,1,4287,'8.99','2005-07-07 15:37:31','2006-02-15 22:12:57'),(2564,94,2,5719,'4.99','2005-07-10 11:07:40','2006-02-15 22:12:57'),(2565,94,2,5970,'4.99','2005-07-11 00:04:50','2006-02-15 22:12:57'),(2566,94,2,7809,'2.99','2005-07-28 07:59:46','2006-02-15 22:12:57'),(2567,94,2,7979,'0.99','2005-07-28 14:16:30','2006-02-15 22:12:57'),(2568,94,1,9605,'4.99','2005-07-31 03:50:07','2006-02-15 22:12:57'),(2569,94,1,12316,'2.99','2005-08-18 06:16:09','2006-02-15 22:12:57'),(2570,94,1,13786,'5.99','2005-08-20 12:13:24','2006-02-15 22:12:57'),(2571,94,2,14804,'1.99','2005-08-22 00:51:25','2006-02-15 22:12:57'),(2572,94,1,14865,'4.99','2005-08-22 03:06:38','2006-02-15 22:12:57'),(2573,94,1,14978,'0.99','2005-08-22 07:13:15','2006-02-15 22:12:57'),(2574,94,1,15693,'0.99','2005-08-23 10:00:24','2006-02-15 22:12:58'),(2575,94,1,15371,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:58'),(2576,95,1,490,'4.99','2005-05-28 00:09:56','2006-02-15 22:12:58'),(2577,95,2,1174,'2.99','2005-06-15 00:12:51','2006-02-15 22:12:58'),(2578,95,2,1261,'1.99','2005-06-15 06:52:57','2006-02-15 22:12:58'),(2579,95,2,3056,'2.99','2005-06-20 13:20:58','2006-02-15 22:12:58'),(2580,95,2,3426,'0.99','2005-06-21 18:12:10','2006-02-15 22:12:58'),(2581,95,1,3633,'1.99','2005-07-06 06:43:26','2006-02-15 22:12:58'),(2582,95,2,4000,'4.99','2005-07-06 23:58:37','2006-02-15 22:12:58'),(2583,95,1,4835,'5.99','2005-07-08 18:08:13','2006-02-15 22:12:58'),(2584,95,2,7245,'5.99','2005-07-27 10:29:06','2006-02-15 22:12:58'),(2585,95,1,7471,'4.99','2005-07-27 19:02:19','2006-02-15 22:12:58'),(2586,95,1,9222,'6.99','2005-07-30 13:21:08','2006-02-15 22:12:58'),(2587,95,1,9695,'6.99','2005-07-31 07:13:30','2006-02-15 22:12:58'),(2588,95,1,9951,'4.99','2005-07-31 15:51:16','2006-02-15 22:12:58'),(2589,95,1,10130,'0.99','2005-07-31 21:44:30','2006-02-15 22:12:58'),(2590,95,2,10446,'0.99','2005-08-01 09:02:17','2006-02-15 22:12:58'),(2591,95,2,12351,'5.99','2005-08-18 07:32:12','2006-02-15 22:12:58'),(2592,95,2,13516,'7.99','2005-08-20 02:32:45','2006-02-15 22:12:58'),(2593,95,2,14203,'4.99','2005-08-21 03:51:52','2006-02-15 22:12:58'),(2594,96,1,1266,'3.99','2005-06-15 07:11:39','2006-02-15 22:12:58'),(2595,96,2,1413,'7.99','2005-06-15 17:25:07','2006-02-15 22:12:58'),(2596,96,2,1437,'0.99','2005-06-15 18:37:04','2006-02-15 22:12:58'),(2597,96,1,2372,'0.99','2005-06-18 14:37:37','2006-02-15 22:12:58'),(2598,96,2,2973,'5.99','2005-06-20 07:59:27','2006-02-15 22:12:58'),(2599,96,1,3308,'0.99','2005-06-21 07:58:36','2006-02-15 22:12:58'),(2600,96,2,3463,'0.99','2005-06-21 22:00:00','2006-02-15 22:12:58'),(2601,96,1,3720,'2.99','2005-07-06 11:06:57','2006-02-15 22:12:58'),(2602,96,2,3742,'2.99','2005-07-06 12:01:38','2006-02-15 22:12:58'),(2603,96,1,4961,'4.99','2005-07-08 23:35:53','2006-02-15 22:12:58'),(2604,96,1,5558,'0.99','2005-07-10 03:12:08','2006-02-15 22:12:58'),(2605,96,1,5678,'4.99','2005-07-10 08:42:42','2006-02-15 22:12:58'),(2606,96,1,5696,'2.99','2005-07-10 09:44:32','2006-02-15 22:12:58'),(2607,96,2,8125,'4.99','2005-07-28 19:31:48','2006-02-15 22:12:58'),(2608,96,1,8437,'6.99','2005-07-29 07:23:43','2006-02-15 22:12:58'),(2609,96,2,9093,'3.99','2005-07-30 08:33:24','2006-02-15 22:12:58'),(2610,96,1,9315,'4.99','2005-07-30 17:05:29','2006-02-15 22:12:58'),(2611,96,1,9662,'3.99','2005-07-31 06:09:53','2006-02-15 22:12:58'),(2612,96,2,10031,'4.99','2005-07-31 18:40:15','2006-02-15 22:12:58'),(2613,96,2,11864,'4.99','2005-08-17 14:02:01','2006-02-15 22:12:58'),(2614,96,1,11984,'3.99','2005-08-17 18:16:30','2006-02-15 22:12:58'),(2615,96,1,12199,'4.99','2005-08-18 02:09:23','2006-02-15 22:12:58'),(2616,96,2,12525,'4.99','2005-08-18 13:48:31','2006-02-15 22:12:58'),(2617,96,1,13514,'0.99','2005-08-20 02:28:09','2006-02-15 22:12:58'),(2618,96,1,13855,'4.99','2005-08-20 14:48:55','2006-02-15 22:12:58'),(2619,96,1,14462,'3.99','2005-08-21 12:50:57','2006-02-15 22:12:58'),(2620,96,2,15989,'4.99','2005-08-23 20:24:36','2006-02-15 22:12:58'),(2621,97,2,2083,'2.99','2005-06-17 17:14:00','2006-02-15 22:12:58'),(2622,97,2,2790,'4.99','2005-06-19 18:49:45','2006-02-15 22:12:58'),(2623,97,1,3459,'0.99','2005-06-21 21:45:47','2006-02-15 22:12:59'),(2624,97,1,3540,'2.99','2005-07-06 01:47:20','2006-02-15 22:12:59'),(2625,97,2,3565,'0.99','2005-07-06 03:02:58','2006-02-15 22:12:59'),(2626,97,2,3818,'4.99','2005-07-06 15:33:31','2006-02-15 22:12:59'),(2627,97,2,4312,'4.99','2005-07-07 17:34:59','2006-02-15 22:12:59'),(2628,97,1,4508,'4.99','2005-07-08 02:28:41','2006-02-15 22:12:59'),(2629,97,2,5454,'4.99','2005-07-09 22:24:25','2006-02-15 22:12:59'),(2630,97,1,6544,'0.99','2005-07-12 04:56:15','2006-02-15 22:12:59'),(2631,97,1,6726,'0.99','2005-07-12 13:48:14','2006-02-15 22:12:59'),(2632,97,2,7182,'5.99','2005-07-27 08:15:38','2006-02-15 22:12:59'),(2633,97,2,7924,'0.99','2005-07-28 12:08:53','2006-02-15 22:12:59'),(2634,97,2,8438,'2.99','2005-07-29 07:25:42','2006-02-15 22:12:59'),(2635,97,1,9591,'4.99','2005-07-31 03:19:28','2006-02-15 22:12:59'),(2636,97,1,10820,'2.99','2005-08-01 22:53:40','2006-02-15 22:12:59'),(2637,97,2,14323,'4.99','2005-08-21 08:08:43','2006-02-15 22:12:59'),(2638,97,1,15006,'0.99','2005-08-22 08:20:15','2006-02-15 22:12:59'),(2639,98,2,214,'3.99','2005-05-26 08:48:49','2006-02-15 22:12:59'),(2640,98,1,1362,'3.99','2005-06-15 13:53:32','2006-02-15 22:12:59'),(2641,98,2,1590,'5.99','2005-06-16 05:11:41','2006-02-15 22:12:59'),(2642,98,1,2213,'4.99','2005-06-18 02:36:47','2006-02-15 22:12:59'),(2643,98,1,2445,'0.99','2005-06-18 19:02:11','2006-02-15 22:12:59'),(2644,98,2,2601,'4.99','2005-06-19 06:09:44','2006-02-15 22:12:59'),(2645,98,2,3399,'4.99','2005-06-21 15:47:48','2006-02-15 22:12:59'),(2646,98,2,3682,'7.99','2005-07-06 09:22:48','2006-02-15 22:12:59'),(2647,98,1,4549,'4.99','2005-07-08 04:25:03','2006-02-15 22:12:59'),(2648,98,2,6951,'2.99','2005-07-26 23:47:31','2006-02-15 22:12:59'),(2649,98,2,7120,'3.99','2005-07-27 05:56:39','2006-02-15 22:12:59'),(2650,98,1,7530,'0.99','2005-07-27 21:18:58','2006-02-15 22:12:59'),(2651,98,1,8324,'5.99','2005-07-29 03:56:05','2006-02-15 22:12:59'),(2652,98,2,8622,'4.99','2005-07-29 13:53:28','2006-02-15 22:12:59'),(2653,98,2,8818,'5.99','2005-07-29 22:14:04','2006-02-15 22:12:59'),(2654,98,1,9753,'2.99','2005-07-31 09:22:38','2006-02-15 22:12:59'),(2655,98,2,10694,'3.99','2005-08-01 18:15:07','2006-02-15 22:12:59'),(2656,98,1,10925,'2.99','2005-08-02 02:24:38','2006-02-15 22:12:59'),(2657,98,2,11007,'0.99','2005-08-02 05:05:53','2006-02-15 22:12:59'),(2658,98,2,11200,'2.99','2005-08-02 11:48:36','2006-02-15 22:12:59'),(2659,98,1,11635,'5.99','2005-08-17 04:33:17','2006-02-15 22:12:59'),(2660,98,1,11730,'2.99','2005-08-17 08:22:00','2006-02-15 22:12:59'),(2661,98,2,12221,'5.99','2005-08-18 02:50:51','2006-02-15 22:12:59'),(2662,98,2,14459,'1.99','2005-08-21 12:48:08','2006-02-15 22:12:59'),(2663,98,1,15536,'7.99','2005-08-23 03:58:28','2006-02-15 22:12:59'),(2664,99,2,867,'0.99','2005-05-30 03:54:43','2006-02-15 22:12:59'),(2665,99,1,1858,'4.99','2005-06-17 01:13:11','2006-02-15 22:12:59'),(2666,99,1,2368,'2.99','2005-06-18 14:10:27','2006-02-15 22:12:59'),(2667,99,2,3780,'6.99','2005-07-06 13:52:02','2006-02-15 22:12:59'),(2668,99,2,4170,'2.99','2005-07-07 09:44:36','2006-02-15 22:12:59'),(2669,99,2,4344,'4.99','2005-07-07 18:50:47','2006-02-15 22:12:59'),(2670,99,1,4589,'0.99','2005-07-08 06:26:04','2006-02-15 22:12:59'),(2671,99,2,4800,'4.99','2005-07-08 16:51:08','2006-02-15 22:12:59'),(2672,99,2,4954,'2.99','2005-07-08 23:14:16','2006-02-15 22:12:59'),(2673,99,2,5035,'2.99','2005-07-09 02:51:34','2006-02-15 22:12:59'),(2674,99,1,5748,'2.99','2005-07-10 12:19:59','2006-02-15 22:12:59'),(2675,99,1,6289,'2.99','2005-07-11 17:06:39','2006-02-15 22:12:59'),(2676,99,1,6370,'3.99','2005-07-11 21:28:32','2006-02-15 22:12:59'),(2677,99,2,6662,'4.99','2005-07-12 11:21:06','2006-02-15 22:12:59'),(2678,99,1,7039,'4.99','2005-07-27 03:11:48','2006-02-15 22:12:59'),(2679,99,1,8072,'0.99','2005-07-28 17:27:59','2006-02-15 22:12:59'),(2680,99,2,8242,'7.99','2005-07-29 00:34:27','2006-02-15 22:12:59'),(2681,99,2,8514,'0.99','2005-07-29 09:53:33','2006-02-15 22:12:59'),(2682,99,2,10388,'7.99','2005-08-01 06:42:44','2006-02-15 22:12:59'),(2683,99,1,10455,'1.99','2005-08-01 09:15:00','2006-02-15 22:13:00'),(2684,99,2,11266,'4.99','2005-08-02 14:07:35','2006-02-15 22:13:00'),(2685,99,2,12379,'0.99','2005-08-18 08:26:48','2006-02-15 22:13:00'),(2686,99,2,12869,'8.99','2005-08-19 02:50:36','2006-02-15 22:13:00'),(2687,99,1,11593,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2688,100,1,71,'0.99','2005-05-25 10:26:39','2006-02-15 22:13:00'),(2689,100,2,1216,'4.99','2005-06-15 03:23:48','2006-02-15 22:13:00'),(2690,100,1,1340,'3.99','2005-06-15 12:24:15','2006-02-15 22:13:00'),(2691,100,1,1427,'2.99','2005-06-15 18:17:28','2006-02-15 22:13:00'),(2692,100,2,3468,'6.99','2005-06-21 22:43:45','2006-02-15 22:13:00'),(2693,100,2,3602,'5.99','2005-07-06 05:23:10','2006-02-15 22:13:00'),(2694,100,1,3800,'8.99','2005-07-06 15:01:27','2006-02-15 22:13:00'),(2695,100,1,4209,'2.99','2005-07-07 11:35:08','2006-02-15 22:13:00'),(2696,100,1,4970,'8.99','2005-07-08 23:54:29','2006-02-15 22:13:00'),(2697,100,2,4980,'6.99','2005-07-09 00:26:59','2006-02-15 22:13:00'),(2698,100,2,5238,'4.99','2005-07-09 13:11:14','2006-02-15 22:13:00'),(2699,100,2,5355,'6.99','2005-07-09 18:07:17','2006-02-15 22:13:00'),(2700,100,1,6655,'4.99','2005-07-12 11:08:32','2006-02-15 22:13:00'),(2701,100,2,7819,'4.99','2005-07-28 08:27:14','2006-02-15 22:13:00'),(2702,100,1,7921,'1.99','2005-07-28 12:02:46','2006-02-15 22:13:00'),(2703,100,2,8203,'0.99','2005-07-28 23:14:56','2006-02-15 22:13:00'),(2704,100,2,9048,'5.99','2005-07-30 06:57:07','2006-02-15 22:13:00'),(2705,100,1,9271,'4.99','2005-07-30 15:04:31','2006-02-15 22:13:00'),(2706,100,1,11143,'0.99','2005-08-02 09:32:54','2006-02-15 22:13:00'),(2707,100,2,11346,'4.99','2005-08-02 17:15:38','2006-02-15 22:13:00'),(2708,100,1,12657,'0.99','2005-08-18 19:02:16','2006-02-15 22:13:00'),(2709,100,1,15163,'0.99','2005-08-22 14:43:13','2006-02-15 22:13:00'),(2710,100,2,15246,'3.99','2005-08-22 17:50:49','2006-02-15 22:13:00'),(2711,100,2,15021,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2712,101,1,468,'9.99','2005-05-27 21:13:10','2006-02-15 22:13:00'),(2713,101,1,4975,'2.99','2005-07-09 00:02:46','2006-02-15 22:13:00'),(2714,101,2,5100,'2.99','2005-07-09 06:16:03','2006-02-15 22:13:00'),(2715,101,1,5132,'5.99','2005-07-09 07:40:32','2006-02-15 22:13:00'),(2716,101,2,5198,'2.99','2005-07-09 10:49:10','2006-02-15 22:13:00'),(2717,101,1,5757,'2.99','2005-07-10 12:40:17','2006-02-15 22:13:00'),(2718,101,2,6433,'5.99','2005-07-12 00:12:02','2006-02-15 22:13:00'),(2719,101,2,7112,'5.99','2005-07-27 05:38:42','2006-02-15 22:13:00'),(2720,101,2,7866,'8.99','2005-07-28 10:08:01','2006-02-15 22:13:00'),(2721,101,1,8301,'0.99','2005-07-29 03:00:08','2006-02-15 22:13:00'),(2722,101,2,8825,'1.99','2005-07-29 22:24:16','2006-02-15 22:13:00'),(2723,101,2,8833,'4.99','2005-07-29 22:39:36','2006-02-15 22:13:00'),(2724,101,2,9965,'6.99','2005-07-31 16:19:32','2006-02-15 22:13:00'),(2725,101,2,10218,'0.99','2005-08-01 01:09:44','2006-02-15 22:13:00'),(2726,101,1,10253,'6.99','2005-08-01 02:39:49','2006-02-15 22:13:00'),(2727,101,1,10407,'0.99','2005-08-01 07:38:07','2006-02-15 22:13:00'),(2728,101,2,11959,'4.99','2005-08-17 17:23:35','2006-02-15 22:13:00'),(2729,101,2,12174,'2.99','2005-08-18 01:08:53','2006-02-15 22:13:00'),(2730,101,1,12471,'4.99','2005-08-18 11:57:00','2006-02-15 22:13:00'),(2731,101,2,13370,'1.99','2005-08-19 21:20:11','2006-02-15 22:13:00'),(2732,101,1,14476,'0.99','2005-08-21 13:31:07','2006-02-15 22:13:00'),(2733,101,2,14542,'3.99','2005-08-21 15:36:34','2006-02-15 22:13:00'),(2734,101,2,15103,'2.99','2005-08-22 12:01:06','2006-02-15 22:13:00'),(2735,101,2,12141,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2736,102,1,247,'4.99','2005-05-26 14:01:05','2006-02-15 22:13:00'),(2737,102,1,358,'0.99','2005-05-27 06:43:59','2006-02-15 22:13:00'),(2738,102,2,562,'1.99','2005-05-28 09:01:21','2006-02-15 22:13:00'),(2739,102,2,1215,'2.99','2005-06-15 03:21:00','2006-02-15 22:13:00'),(2740,102,2,2419,'8.99','2005-06-18 17:21:24','2006-02-15 22:13:00'),(2741,102,2,3520,'1.99','2005-07-06 00:58:27','2006-02-15 22:13:00'),(2742,102,2,3630,'1.99','2005-07-06 06:27:15','2006-02-15 22:13:01'),(2743,102,2,3665,'4.99','2005-07-06 08:23:08','2006-02-15 22:13:01'),(2744,102,1,4089,'6.99','2005-07-07 05:45:59','2006-02-15 22:13:01'),(2745,102,2,4777,'3.99','2005-07-08 15:48:34','2006-02-15 22:13:01'),(2746,102,1,4997,'6.99','2005-07-09 01:06:03','2006-02-15 22:13:01'),(2747,102,1,5009,'5.99','2005-07-09 01:32:17','2006-02-15 22:13:01'),(2748,102,1,5109,'4.99','2005-07-09 06:48:49','2006-02-15 22:13:01'),(2749,102,2,5509,'5.99','2005-07-10 00:54:46','2006-02-15 22:13:01'),(2750,102,1,5716,'2.99','2005-07-10 10:59:23','2006-02-15 22:13:01'),(2751,102,2,6434,'5.99','2005-07-12 00:14:25','2006-02-15 22:13:01'),(2752,102,2,7119,'0.99','2005-07-27 05:55:32','2006-02-15 22:13:01'),(2753,102,2,7247,'0.99','2005-07-27 10:32:58','2006-02-15 22:13:01'),(2754,102,2,7439,'6.99','2005-07-27 17:42:31','2006-02-15 22:13:01'),(2755,102,1,8186,'0.99','2005-07-28 22:30:27','2006-02-15 22:13:01'),(2756,102,1,8664,'5.99','2005-07-29 15:36:27','2006-02-15 22:13:01'),(2757,102,2,9151,'3.99','2005-07-30 10:50:53','2006-02-15 22:13:01'),(2758,102,1,9192,'2.99','2005-07-30 12:26:26','2006-02-15 22:13:01'),(2759,102,2,9295,'0.99','2005-07-30 16:18:39','2006-02-15 22:13:01'),(2760,102,2,9617,'2.99','2005-07-31 04:15:38','2006-02-15 22:13:01'),(2761,102,1,9780,'4.99','2005-07-31 10:10:22','2006-02-15 22:13:01'),(2762,102,2,10841,'1.99','2005-08-01 23:39:21','2006-02-15 22:13:01'),(2763,102,2,11099,'4.99','2005-08-02 08:07:12','2006-02-15 22:13:01'),(2764,102,1,11183,'4.99','2005-08-02 11:00:32','2006-02-15 22:13:01'),(2765,102,2,12495,'4.99','2005-08-18 12:56:37','2006-02-15 22:13:01'),(2766,102,1,13420,'9.99','2005-08-19 22:57:25','2006-02-15 22:13:01'),(2767,102,1,15049,'1.99','2005-08-22 10:06:28','2006-02-15 22:13:01'),(2768,102,2,16031,'3.99','2005-08-23 21:59:26','2006-02-15 22:13:01'),(2769,103,1,240,'7.99','2005-05-26 12:40:23','2006-02-15 22:13:01'),(2770,103,1,658,'9.99','2005-05-28 20:23:23','2006-02-15 22:13:01'),(2771,103,2,1396,'4.99','2005-06-15 16:22:38','2006-02-15 22:13:01'),(2772,103,1,2118,'0.99','2005-06-17 20:28:29','2006-02-15 22:13:01'),(2773,103,1,2197,'0.99','2005-06-18 01:50:27','2006-02-15 22:13:01'),(2774,103,1,2724,'0.99','2005-06-19 14:57:54','2006-02-15 22:13:01'),(2775,103,2,3750,'6.99','2005-07-06 12:19:28','2006-02-15 22:13:01'),(2776,103,1,3850,'4.99','2005-07-06 16:51:21','2006-02-15 22:13:01'),(2777,103,2,4040,'6.99','2005-07-07 03:02:40','2006-02-15 22:13:01'),(2778,103,1,4213,'2.99','2005-07-07 11:53:49','2006-02-15 22:13:01'),(2779,103,1,4357,'1.99','2005-07-07 19:24:39','2006-02-15 22:13:01'),(2780,103,2,4872,'4.99','2005-07-08 19:23:16','2006-02-15 22:13:01'),(2781,103,2,5163,'4.99','2005-07-09 09:00:28','2006-02-15 22:13:01'),(2782,103,1,6525,'5.99','2005-07-12 04:17:15','2006-02-15 22:13:01'),(2783,103,2,6697,'6.99','2005-07-12 12:44:57','2006-02-15 22:13:01'),(2784,103,2,6949,'2.99','2005-07-26 23:44:12','2006-02-15 22:13:01'),(2785,103,1,7310,'0.99','2005-07-27 13:00:55','2006-02-15 22:13:01'),(2786,103,2,7472,'6.99','2005-07-27 19:04:19','2006-02-15 22:13:01'),(2787,103,1,8302,'0.99','2005-07-29 03:01:24','2006-02-15 22:13:01'),(2788,103,1,8520,'4.99','2005-07-29 10:10:02','2006-02-15 22:13:01'),(2789,103,2,9390,'4.99','2005-07-30 19:42:07','2006-02-15 22:13:01'),(2790,103,2,12942,'7.99','2005-08-19 05:40:36','2006-02-15 22:13:01'),(2791,103,1,13676,'0.99','2005-08-20 08:33:21','2006-02-15 22:13:01'),(2792,103,2,14064,'2.99','2005-08-20 22:39:16','2006-02-15 22:13:01'),(2793,103,2,14289,'4.99','2005-08-21 06:58:49','2006-02-15 22:13:01'),(2794,103,2,15401,'8.99','2005-08-22 23:13:10','2006-02-15 22:13:01'),(2795,103,1,15461,'5.99','2005-08-23 01:13:52','2006-02-15 22:13:01'),(2796,103,1,15467,'3.99','2005-08-23 01:22:12','2006-02-15 22:13:01'),(2797,103,1,15599,'5.99','2005-08-23 06:25:07','2006-02-15 22:13:01'),(2798,103,2,15679,'0.99','2005-08-23 09:27:29','2006-02-15 22:13:02'),(2799,103,2,16048,'8.99','2005-08-23 22:43:07','2006-02-15 22:13:02'),(2800,104,1,163,'10.99','2005-05-26 02:26:23','2006-02-15 22:13:02'),(2801,104,2,808,'3.99','2005-05-29 19:08:20','2006-02-15 22:13:02'),(2802,104,2,1287,'3.99','2005-06-15 08:41:38','2006-02-15 22:13:02'),(2803,104,1,2107,'0.99','2005-06-17 19:31:16','2006-02-15 22:13:02'),(2804,104,2,2928,'0.99','2005-06-20 04:43:45','2006-02-15 22:13:02'),(2805,104,2,3273,'2.99','2005-06-21 05:24:17','2006-02-15 22:13:02'),(2806,104,2,4012,'4.99','2005-07-07 00:56:09','2006-02-15 22:13:02'),(2807,104,2,4438,'6.99','2005-07-07 22:56:17','2006-02-15 22:13:02'),(2808,104,2,4520,'4.99','2005-07-08 02:53:46','2006-02-15 22:13:02'),(2809,104,1,4529,'7.99','2005-07-08 03:26:20','2006-02-15 22:13:02'),(2810,104,1,4917,'2.99','2005-07-08 21:32:30','2006-02-15 22:13:02'),(2811,104,1,5376,'1.99','2005-07-09 18:54:08','2006-02-15 22:13:02'),(2812,104,2,7107,'2.99','2005-07-27 05:22:04','2006-02-15 22:13:02'),(2813,104,1,8413,'1.99','2005-07-29 06:47:39','2006-02-15 22:13:02'),(2814,104,1,9090,'3.99','2005-07-30 08:24:42','2006-02-15 22:13:02'),(2815,104,2,9996,'5.99','2005-07-31 17:32:03','2006-02-15 22:13:02'),(2816,104,1,11700,'2.99','2005-08-17 07:12:31','2006-02-15 22:13:02'),(2817,104,1,12453,'3.99','2005-08-18 11:17:07','2006-02-15 22:13:02'),(2818,104,1,13005,'0.99','2005-08-19 07:45:42','2006-02-15 22:13:02'),(2819,104,1,13017,'1.99','2005-08-19 08:02:24','2006-02-15 22:13:02'),(2820,104,1,13179,'4.99','2005-08-19 13:59:53','2006-02-15 22:13:02'),(2821,104,1,13410,'3.99','2005-08-19 22:41:44','2006-02-15 22:13:02'),(2822,104,1,14218,'3.99','2005-08-21 04:43:59','2006-02-15 22:13:02'),(2823,104,2,15186,'0.99','2005-08-22 15:52:57','2006-02-15 22:13:02'),(2824,105,1,327,'8.99','2005-05-27 01:18:57','2006-02-15 22:13:02'),(2825,105,2,473,'7.99','2005-05-27 21:36:34','2006-02-15 22:13:02'),(2826,105,1,485,'2.99','2005-05-27 23:40:52','2006-02-15 22:13:02'),(2827,105,1,779,'6.99','2005-05-29 14:17:17','2006-02-15 22:13:02'),(2828,105,2,1789,'3.99','2005-06-16 19:49:18','2006-02-15 22:13:02'),(2829,105,2,1991,'3.99','2005-06-17 10:49:23','2006-02-15 22:13:02'),(2830,105,2,2635,'3.99','2005-06-19 09:08:45','2006-02-15 22:13:02'),(2831,105,2,5261,'4.99','2005-07-09 14:06:56','2006-02-15 22:13:02'),(2832,105,1,5429,'4.99','2005-07-09 21:14:03','2006-02-15 22:13:02'),(2833,105,2,5542,'2.99','2005-07-10 02:45:53','2006-02-15 22:13:02'),(2834,105,2,5677,'4.99','2005-07-10 08:41:28','2006-02-15 22:13:02'),(2835,105,2,6546,'4.99','2005-07-12 04:57:17','2006-02-15 22:13:02'),(2836,105,1,7442,'2.99','2005-07-27 17:47:00','2006-02-15 22:13:02'),(2837,105,2,8980,'2.99','2005-07-30 04:22:15','2006-02-15 22:13:02'),(2838,105,2,9124,'3.99','2005-07-30 09:43:12','2006-02-15 22:13:02'),(2839,105,2,9198,'5.99','2005-07-30 12:37:08','2006-02-15 22:13:02'),(2840,105,2,9210,'9.99','2005-07-30 12:56:44','2006-02-15 22:13:02'),(2841,105,1,10513,'4.99','2005-08-01 11:37:34','2006-02-15 22:13:02'),(2842,105,1,12217,'0.99','2005-08-18 02:44:44','2006-02-15 22:13:02'),(2843,105,2,12899,'2.99','2005-08-19 04:03:34','2006-02-15 22:13:02'),(2844,105,1,13057,'6.99','2005-08-19 09:40:05','2006-02-15 22:13:02'),(2845,105,1,13751,'2.99','2005-08-20 11:17:03','2006-02-15 22:13:02'),(2846,105,2,14048,'0.99','2005-08-20 22:03:18','2006-02-15 22:13:02'),(2847,105,2,15624,'4.99','2005-08-23 07:24:27','2006-02-15 22:13:02'),(2848,105,2,15688,'4.99','2005-08-23 09:48:45','2006-02-15 22:13:02'),(2849,105,2,15803,'2.99','2005-08-23 14:27:07','2006-02-15 22:13:02'),(2850,106,2,552,'3.99','2005-05-28 07:53:38','2006-02-15 22:13:03'),(2851,106,2,1156,'0.99','2005-05-31 22:37:34','2006-02-15 22:13:03'),(2852,106,1,2295,'4.99','2005-06-18 07:56:18','2006-02-15 22:13:03'),(2853,106,1,3023,'4.99','2005-06-20 11:18:11','2006-02-15 22:13:03'),(2854,106,1,4229,'4.99','2005-07-07 12:43:23','2006-02-15 22:13:03'),(2855,106,2,4277,'2.99','2005-07-07 14:52:12','2006-02-15 22:13:03'),(2856,106,1,4665,'3.99','2005-07-08 10:04:24','2006-02-15 22:13:03'),(2857,106,2,5453,'3.99','2005-07-09 22:24:11','2006-02-15 22:13:03'),(2858,106,2,6992,'0.99','2005-07-27 01:04:45','2006-02-15 22:13:03'),(2859,106,1,7224,'3.99','2005-07-27 09:44:26','2006-02-15 22:13:03'),(2860,106,1,7483,'4.99','2005-07-27 19:25:00','2006-02-15 22:13:03'),(2861,106,1,8115,'4.99','2005-07-28 19:14:17','2006-02-15 22:13:03'),(2862,106,2,9072,'2.99','2005-07-30 07:45:49','2006-02-15 22:13:03'),(2863,106,2,9747,'7.99','2005-07-31 09:16:57','2006-02-15 22:13:03'),(2864,106,2,10213,'8.99','2005-08-01 01:03:18','2006-02-15 22:13:03'),(2865,106,1,10228,'2.99','2005-08-01 01:43:18','2006-02-15 22:13:03'),(2866,106,1,10444,'8.99','2005-08-01 09:01:40','2006-02-15 22:13:03'),(2867,106,2,11436,'0.99','2005-08-02 20:16:06','2006-02-15 22:13:03'),(2868,106,1,12159,'7.99','2005-08-18 00:36:09','2006-02-15 22:13:03'),(2869,106,1,12845,'2.99','2005-08-19 02:02:37','2006-02-15 22:13:03'),(2870,106,2,14431,'2.99','2005-08-21 11:31:15','2006-02-15 22:13:03'),(2871,106,1,14920,'0.99','2005-08-22 05:08:58','2006-02-15 22:13:03'),(2872,106,1,15154,'6.99','2005-08-22 14:27:37','2006-02-15 22:13:03'),(2873,107,1,170,'5.99','2005-05-26 03:11:12','2006-02-15 22:13:03'),(2874,107,1,1026,'5.99','2005-05-31 03:45:26','2006-02-15 22:13:03'),(2875,107,2,1243,'2.99','2005-06-15 05:07:32','2006-02-15 22:13:03'),(2876,107,2,2693,'6.99','2005-06-19 13:11:47','2006-02-15 22:13:03'),(2877,107,2,2860,'4.99','2005-06-19 23:20:40','2006-02-15 22:13:03'),(2878,107,2,2897,'3.99','2005-06-20 02:34:23','2006-02-15 22:13:03'),(2879,107,1,3033,'3.99','2005-06-20 12:02:05','2006-02-15 22:13:03'),(2880,107,2,3120,'0.99','2005-06-20 18:19:29','2006-02-15 22:13:03'),(2881,107,2,3174,'0.99','2005-06-20 22:24:00','2006-02-15 22:13:03'),(2882,107,2,3824,'6.99','2005-07-06 15:43:15','2006-02-15 22:13:03'),(2883,107,2,5311,'4.99','2005-07-09 16:02:54','2006-02-15 22:13:03'),(2884,107,2,5575,'2.99','2005-07-10 03:55:50','2006-02-15 22:13:03'),(2885,107,2,5798,'3.99','2005-07-10 14:45:09','2006-02-15 22:13:03'),(2886,107,2,6131,'2.99','2005-07-11 08:22:05','2006-02-15 22:13:03'),(2887,107,2,6133,'0.99','2005-07-11 08:25:22','2006-02-15 22:13:03'),(2888,107,1,6811,'5.99','2005-07-12 17:54:33','2006-02-15 22:13:03'),(2889,107,2,6934,'6.99','2005-07-26 23:11:03','2006-02-15 22:13:03'),(2890,107,2,7447,'4.99','2005-07-27 18:02:08','2006-02-15 22:13:03'),(2891,107,1,7600,'7.99','2005-07-27 23:41:18','2006-02-15 22:13:03'),(2892,107,1,8162,'4.99','2005-07-28 21:11:46','2006-02-15 22:13:03'),(2893,107,2,8704,'1.99','2005-07-29 17:13:45','2006-02-15 22:13:03'),(2894,107,1,9155,'2.99','2005-07-30 11:00:00','2006-02-15 22:13:03'),(2895,107,2,9351,'2.99','2005-07-30 18:28:30','2006-02-15 22:13:03'),(2896,107,1,10226,'4.99','2005-08-01 01:40:04','2006-02-15 22:13:03'),(2897,107,2,13361,'4.99','2005-08-19 21:07:22','2006-02-15 22:13:03'),(2898,107,1,13510,'6.99','2005-08-20 02:18:30','2006-02-15 22:13:03'),(2899,107,1,14562,'4.99','2005-08-21 16:22:59','2006-02-15 22:13:03'),(2900,107,1,15560,'3.99','2005-08-23 05:01:13','2006-02-15 22:13:03'),(2901,107,1,13079,'1.98','2006-02-14 15:16:03','2006-02-15 22:13:03'),(2902,107,1,15497,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:03'),(2903,108,1,105,'4.99','2005-05-25 17:54:12','2006-02-15 22:13:03'),(2904,108,2,1055,'0.99','2005-05-31 07:47:18','2006-02-15 22:13:03'),(2905,108,2,1372,'4.99','2005-06-15 14:45:48','2006-02-15 22:13:03'),(2906,108,1,1425,'2.99','2005-06-15 18:13:46','2006-02-15 22:13:03'),(2907,108,1,2061,'8.99','2005-06-17 15:47:00','2006-02-15 22:13:03'),(2908,108,1,2210,'2.99','2005-06-18 02:27:01','2006-02-15 22:13:04'),(2909,108,2,3116,'4.99','2005-06-20 18:04:55','2006-02-15 22:13:04'),(2910,108,1,3875,'0.99','2005-07-06 18:15:39','2006-02-15 22:13:04'),(2911,108,2,4082,'2.99','2005-07-07 05:11:53','2006-02-15 22:13:04'),(2912,108,1,4303,'1.99','2005-07-07 16:57:32','2006-02-15 22:13:04'),(2913,108,1,4650,'4.99','2005-07-08 09:32:08','2006-02-15 22:13:04'),(2914,108,1,4754,'0.99','2005-07-08 14:20:01','2006-02-15 22:13:04'),(2915,108,2,5274,'6.99','2005-07-09 14:34:09','2006-02-15 22:13:04'),(2916,108,1,5661,'5.99','2005-07-10 07:53:51','2006-02-15 22:13:04'),(2917,108,2,5806,'4.99','2005-07-10 15:11:54','2006-02-15 22:13:04'),(2918,108,1,6841,'0.99','2005-07-12 19:04:24','2006-02-15 22:13:04'),(2919,108,2,8329,'5.99','2005-07-29 04:06:33','2006-02-15 22:13:04'),(2920,108,2,8587,'4.99','2005-07-29 12:18:40','2006-02-15 22:13:04'),(2921,108,1,8846,'4.99','2005-07-29 23:10:28','2006-02-15 22:13:04'),(2922,108,2,9755,'4.99','2005-07-31 09:24:55','2006-02-15 22:13:04'),(2923,108,1,11316,'5.99','2005-08-02 16:07:49','2006-02-15 22:13:04'),(2924,108,2,11445,'6.99','2005-08-02 20:33:35','2006-02-15 22:13:04'),(2925,108,2,11759,'2.99','2005-08-17 09:41:23','2006-02-15 22:13:04'),(2926,108,1,12583,'2.99','2005-08-18 15:51:36','2006-02-15 22:13:04'),(2927,108,2,12625,'6.99','2005-08-18 17:36:19','2006-02-15 22:13:04'),(2928,108,2,13754,'2.99','2005-08-20 11:18:08','2006-02-15 22:13:04'),(2929,108,2,14635,'3.99','2005-08-21 18:51:43','2006-02-15 22:13:04'),(2930,108,2,15556,'8.99','2005-08-23 04:52:16','2006-02-15 22:13:04'),(2931,108,1,16001,'2.99','2005-08-23 20:45:53','2006-02-15 22:13:04'),(2932,108,1,15294,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:04'),(2933,109,1,203,'5.99','2005-05-26 07:27:57','2006-02-15 22:13:04'),(2934,109,1,386,'0.99','2005-05-27 10:26:31','2006-02-15 22:13:04'),(2935,109,2,622,'3.99','2005-05-28 15:58:22','2006-02-15 22:13:04'),(2936,109,1,698,'0.99','2005-05-29 02:10:52','2006-02-15 22:13:04'),(2937,109,1,1061,'7.99','2005-05-31 08:27:58','2006-02-15 22:13:04'),(2938,109,1,1106,'4.99','2005-05-31 14:36:52','2006-02-15 22:13:04'),(2939,109,1,1115,'2.99','2005-05-31 16:07:09','2006-02-15 22:13:04'),(2940,109,2,1581,'2.99','2005-06-16 04:28:45','2006-02-15 22:13:04'),(2941,109,2,1891,'3.99','2005-06-17 04:16:44','2006-02-15 22:13:04'),(2942,109,2,2198,'6.99','2005-06-18 01:51:22','2006-02-15 22:13:04'),(2943,109,2,2679,'5.99','2005-06-19 12:12:30','2006-02-15 22:13:04'),(2944,109,2,3076,'5.99','2005-06-20 15:01:19','2006-02-15 22:13:04'),(2945,109,1,4921,'4.99','2005-07-08 21:43:21','2006-02-15 22:13:04'),(2946,109,1,5027,'2.99','2005-07-09 02:32:37','2006-02-15 22:13:04'),(2947,109,2,5296,'2.99','2005-07-09 15:26:27','2006-02-15 22:13:04'),(2948,109,2,6920,'6.99','2005-07-12 22:32:58','2006-02-15 22:13:04'),(2949,109,2,7145,'0.99','2005-07-27 07:01:00','2006-02-15 22:13:04'),(2950,109,1,8006,'3.99','2005-07-28 15:15:41','2006-02-15 22:13:04'),(2951,109,1,9230,'0.99','2005-07-30 13:39:42','2006-02-15 22:13:04'),(2952,109,1,9871,'2.99','2005-07-31 13:25:46','2006-02-15 22:13:04'),(2953,109,2,10240,'0.99','2005-08-01 02:09:33','2006-02-15 22:13:04'),(2954,109,2,10892,'3.99','2005-08-02 01:12:06','2006-02-15 22:13:04'),(2955,109,2,12137,'6.99','2005-08-17 23:52:26','2006-02-15 22:13:04'),(2956,109,1,13264,'3.99','2005-08-19 17:27:10','2006-02-15 22:13:04'),(2957,109,2,15398,'7.99','2005-08-22 23:10:49','2006-02-15 22:13:04'),(2958,109,2,15677,'2.99','2005-08-23 09:23:36','2006-02-15 22:13:04'),(2959,110,1,515,'7.99','2005-05-28 03:10:10','2006-02-15 22:13:04'),(2960,110,2,538,'1.99','2005-05-28 06:21:05','2006-02-15 22:13:04'),(2961,110,2,1528,'8.99','2005-06-16 00:32:52','2006-02-15 22:13:04'),(2962,110,1,3587,'4.99','2005-07-06 04:27:52','2006-02-15 22:13:04'),(2963,110,1,4317,'2.99','2005-07-07 17:44:49','2006-02-15 22:13:05'),(2964,110,2,4827,'4.99','2005-07-08 17:46:30','2006-02-15 22:13:05'),(2965,110,1,6160,'4.99','2005-07-11 10:08:13','2006-02-15 22:13:05'),(2966,110,1,7474,'0.99','2005-07-27 19:07:17','2006-02-15 22:13:05'),(2967,110,2,7542,'0.99','2005-07-27 21:43:04','2006-02-15 22:13:05'),(2968,110,1,7570,'2.99','2005-07-27 22:40:06','2006-02-15 22:13:05'),(2969,110,1,11647,'7.99','2005-08-17 04:54:14','2006-02-15 22:13:05'),(2970,110,2,12585,'3.99','2005-08-18 15:52:12','2006-02-15 22:13:05'),(2971,110,1,13723,'2.99','2005-08-20 10:05:30','2006-02-15 22:13:05'),(2972,110,2,15381,'2.99','2005-08-22 22:28:36','2006-02-15 22:13:05'),(2973,111,2,505,'2.99','2005-05-28 02:06:37','2006-02-15 22:13:05'),(2974,111,1,1593,'6.99','2005-06-16 05:14:52','2006-02-15 22:13:05'),(2975,111,2,1974,'2.99','2005-06-17 09:30:05','2006-02-15 22:13:05'),(2976,111,2,1999,'1.99','2005-06-17 11:30:08','2006-02-15 22:13:05'),(2977,111,2,2297,'4.99','2005-06-18 08:17:41','2006-02-15 22:13:05'),(2978,111,2,3087,'2.99','2005-06-20 15:53:59','2006-02-15 22:13:05'),(2979,111,2,3333,'2.99','2005-06-21 10:01:36','2006-02-15 22:13:05'),(2980,111,2,3485,'1.99','2005-07-05 23:25:54','2006-02-15 22:13:05'),(2981,111,1,3551,'3.99','2005-07-06 02:33:48','2006-02-15 22:13:05'),(2982,111,2,3963,'9.99','2005-07-06 22:19:17','2006-02-15 22:13:05'),(2983,111,1,4249,'4.99','2005-07-07 14:05:17','2006-02-15 22:13:05'),(2984,111,2,4286,'0.99','2005-07-07 15:36:44','2006-02-15 22:13:05'),(2985,111,1,6896,'2.99','2005-07-12 21:25:37','2006-02-15 22:13:05'),(2986,111,2,8525,'0.99','2005-07-29 10:20:19','2006-02-15 22:13:05'),(2987,111,2,9933,'0.99','2005-07-31 15:24:46','2006-02-15 22:13:05'),(2988,111,2,10039,'2.99','2005-07-31 18:50:40','2006-02-15 22:13:05'),(2989,111,2,10602,'4.99','2005-08-01 14:30:23','2006-02-15 22:13:05'),(2990,111,1,10952,'4.99','2005-08-02 03:28:21','2006-02-15 22:13:05'),(2991,111,2,10990,'4.99','2005-08-02 04:41:06','2006-02-15 22:13:05'),(2992,111,2,11239,'2.99','2005-08-02 13:27:11','2006-02-15 22:13:05'),(2993,111,2,12196,'3.99','2005-08-18 02:08:48','2006-02-15 22:13:05'),(2994,111,2,13251,'2.99','2005-08-19 16:48:37','2006-02-15 22:13:05'),(2995,111,2,13525,'5.99','2005-08-20 02:50:44','2006-02-15 22:13:05'),(2996,111,1,14949,'0.99','2005-08-22 06:12:16','2006-02-15 22:13:05'),(2997,111,2,15174,'6.99','2005-08-22 15:26:36','2006-02-15 22:13:05'),(2998,111,2,15542,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:05'),(2999,112,1,396,'0.99','2005-05-27 11:47:04','2006-02-15 22:13:05'),(3000,112,2,701,'2.99','2005-05-29 02:26:27','2006-02-15 22:13:05'),(3001,112,1,1835,'4.99','2005-06-16 23:05:36','2006-02-15 22:13:05'),(3002,112,2,1930,'2.99','2005-06-17 06:50:46','2006-02-15 22:13:05'),(3003,112,1,2193,'4.99','2005-06-18 01:38:45','2006-02-15 22:13:05'),(3004,112,2,3018,'2.99','2005-06-20 11:10:35','2006-02-15 22:13:05'),(3005,112,1,5351,'4.99','2005-07-09 17:40:52','2006-02-15 22:13:05'),(3006,112,1,5385,'2.99','2005-07-09 19:18:11','2006-02-15 22:13:05'),(3007,112,2,6550,'2.99','2005-07-12 05:03:14','2006-02-15 22:13:05'),(3008,112,2,7691,'4.99','2005-07-28 03:30:09','2006-02-15 22:13:05'),(3009,112,2,7761,'4.99','2005-07-28 06:31:45','2006-02-15 22:13:05'),(3010,112,1,9217,'4.99','2005-07-30 13:13:55','2006-02-15 22:13:05'),(3011,112,2,9321,'6.99','2005-07-30 17:19:44','2006-02-15 22:13:05'),(3012,112,2,9609,'4.99','2005-07-31 03:53:24','2006-02-15 22:13:05'),(3013,112,1,9830,'5.99','2005-07-31 11:59:05','2006-02-15 22:13:05'),(3014,112,2,9911,'3.99','2005-07-31 14:48:01','2006-02-15 22:13:05'),(3015,112,1,10038,'2.99','2005-07-31 18:49:12','2006-02-15 22:13:05'),(3016,112,2,10596,'5.99','2005-08-01 14:18:57','2006-02-15 22:13:06'),(3017,112,1,11019,'2.99','2005-08-02 05:29:31','2006-02-15 22:13:06'),(3018,112,1,11599,'7.99','2005-08-17 03:08:10','2006-02-15 22:13:06'),(3019,112,2,11659,'4.99','2005-08-17 05:20:45','2006-02-15 22:13:06'),(3020,112,2,11863,'3.99','2005-08-17 13:56:01','2006-02-15 22:13:06'),(3021,112,2,13611,'8.99','2005-08-20 06:20:42','2006-02-15 22:13:06'),(3022,112,2,13879,'2.99','2005-08-20 15:18:10','2006-02-15 22:13:06'),(3023,112,2,14049,'5.99','2005-08-20 22:08:55','2006-02-15 22:13:06'),(3024,112,1,14358,'0.99','2005-08-21 09:14:28','2006-02-15 22:13:06'),(3025,112,2,15304,'4.99','2005-08-22 19:45:57','2006-02-15 22:13:06'),(3026,112,1,15671,'0.99','2005-08-23 09:08:16','2006-02-15 22:13:06'),(3027,112,1,15687,'8.99','2005-08-23 09:46:33','2006-02-15 22:13:06'),(3028,112,1,15756,'2.99','2005-08-23 12:47:05','2006-02-15 22:13:06'),(3029,113,1,510,'0.99','2005-05-28 02:52:14','2006-02-15 22:13:06'),(3030,113,2,776,'0.99','2005-05-29 13:35:35','2006-02-15 22:13:06'),(3031,113,2,2077,'4.99','2005-06-17 16:46:11','2006-02-15 22:13:06'),(3032,113,1,2282,'2.99','2005-06-18 06:48:23','2006-02-15 22:13:06'),(3033,113,1,2783,'2.99','2005-06-19 18:29:10','2006-02-15 22:13:06'),(3034,113,2,3004,'0.99','2005-06-20 10:04:36','2006-02-15 22:13:06'),(3035,113,1,3124,'8.99','2005-06-20 18:28:19','2006-02-15 22:13:06'),(3036,113,1,3162,'6.99','2005-06-20 21:21:15','2006-02-15 22:13:06'),(3037,113,2,3657,'5.99','2005-07-06 07:55:30','2006-02-15 22:13:06'),(3038,113,1,4333,'2.99','2005-07-07 18:31:50','2006-02-15 22:13:06'),(3039,113,2,5189,'2.99','2005-07-09 10:23:21','2006-02-15 22:13:06'),(3040,113,2,5324,'2.99','2005-07-09 16:34:18','2006-02-15 22:13:06'),(3041,113,2,5655,'4.99','2005-07-10 07:31:06','2006-02-15 22:13:06'),(3042,113,1,5774,'5.99','2005-07-10 13:31:56','2006-02-15 22:13:06'),(3043,113,1,6025,'0.99','2005-07-11 02:18:13','2006-02-15 22:13:06'),(3044,113,1,6836,'0.99','2005-07-12 18:58:05','2006-02-15 22:13:06'),(3045,113,2,7468,'5.99','2005-07-27 18:52:27','2006-02-15 22:13:06'),(3046,113,2,7587,'2.99','2005-07-27 23:23:03','2006-02-15 22:13:06'),(3047,113,2,9221,'6.99','2005-07-30 13:20:06','2006-02-15 22:13:06'),(3048,113,2,10181,'4.99','2005-08-01 00:00:44','2006-02-15 22:13:06'),(3049,113,1,10378,'0.99','2005-08-01 06:30:04','2006-02-15 22:13:06'),(3050,113,2,10578,'1.99','2005-08-01 13:48:02','2006-02-15 22:13:06'),(3051,113,2,11655,'7.99','2005-08-17 05:11:07','2006-02-15 22:13:06'),(3052,113,1,11872,'5.99','2005-08-17 14:11:45','2006-02-15 22:13:06'),(3053,113,1,12392,'5.99','2005-08-18 08:57:58','2006-02-15 22:13:06'),(3054,113,2,12817,'3.99','2005-08-19 01:04:35','2006-02-15 22:13:06'),(3055,113,2,13406,'2.99','2005-08-19 22:22:01','2006-02-15 22:13:06'),(3056,113,1,15600,'1.99','2005-08-23 06:31:24','2006-02-15 22:13:06'),(3057,113,1,15770,'2.99','2005-08-23 13:18:16','2006-02-15 22:13:06'),(3058,114,1,205,'4.99','2005-05-26 07:59:37','2006-02-15 22:13:06'),(3059,114,1,255,'4.99','2005-05-26 14:52:15','2006-02-15 22:13:06'),(3060,114,2,889,'2.99','2005-05-30 07:14:53','2006-02-15 22:13:06'),(3061,114,1,2059,'2.99','2005-06-17 15:36:12','2006-02-15 22:13:06'),(3062,114,2,2680,'7.99','2005-06-19 12:13:37','2006-02-15 22:13:07'),(3063,114,1,3094,'2.99','2005-06-20 16:06:51','2006-02-15 22:13:07'),(3064,114,2,3144,'5.99','2005-06-20 20:14:20','2006-02-15 22:13:07'),(3065,114,1,3484,'4.99','2005-07-05 23:23:11','2006-02-15 22:13:07'),(3066,114,1,3924,'2.99','2005-07-06 20:38:02','2006-02-15 22:13:07'),(3067,114,1,4025,'0.99','2005-07-07 02:13:24','2006-02-15 22:13:07'),(3068,114,1,5418,'0.99','2005-07-09 20:41:35','2006-02-15 22:13:07'),(3069,114,2,5624,'4.99','2005-07-10 05:43:16','2006-02-15 22:13:07'),(3070,114,1,5625,'2.99','2005-07-10 05:44:02','2006-02-15 22:13:07'),(3071,114,1,6188,'2.99','2005-07-11 11:31:47','2006-02-15 22:13:07'),(3072,114,1,6754,'4.99','2005-07-12 14:59:24','2006-02-15 22:13:07'),(3073,114,2,7316,'2.99','2005-07-27 13:19:03','2006-02-15 22:13:07'),(3074,114,2,7462,'2.99','2005-07-27 18:47:47','2006-02-15 22:13:07'),(3075,114,2,7565,'2.99','2005-07-27 22:33:59','2006-02-15 22:13:07'),(3076,114,2,7938,'5.99','2005-07-28 12:39:11','2006-02-15 22:13:07'),(3077,114,2,8496,'4.99','2005-07-29 09:05:33','2006-02-15 22:13:07'),(3078,114,1,8590,'10.99','2005-07-29 12:32:20','2006-02-15 22:13:07'),(3079,114,1,9717,'4.99','2005-07-31 08:24:41','2006-02-15 22:13:07'),(3080,114,1,11547,'4.99','2005-08-17 00:59:24','2006-02-15 22:13:07'),(3081,114,2,12326,'0.99','2005-08-18 06:41:59','2006-02-15 22:13:07'),(3082,114,1,12685,'6.99','2005-08-18 19:51:29','2006-02-15 22:13:07'),(3083,114,2,13459,'6.99','2005-08-20 00:45:40','2006-02-15 22:13:07'),(3084,114,2,14158,'5.99','2005-08-21 02:43:20','2006-02-15 22:13:07'),(3085,114,1,14867,'4.99','2005-08-22 03:14:46','2006-02-15 22:13:07'),(3086,114,1,15485,'0.99','2005-08-23 02:04:57','2006-02-15 22:13:07'),(3087,114,1,15528,'2.99','2005-08-23 03:45:40','2006-02-15 22:13:07'),(3088,114,2,15646,'3.99','2005-08-23 08:19:55','2006-02-15 22:13:07'),(3089,114,1,16047,'0.99','2005-08-23 22:42:48','2006-02-15 22:13:07'),(3090,114,2,12506,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:07'),(3091,115,1,915,'0.99','2005-05-30 11:20:27','2006-02-15 22:13:07'),(3092,115,1,983,'0.99','2005-05-30 22:15:51','2006-02-15 22:13:07'),(3093,115,1,1102,'2.99','2005-05-31 14:20:29','2006-02-15 22:13:07'),(3094,115,2,1361,'0.99','2005-06-15 13:37:38','2006-02-15 22:13:07'),(3095,115,2,1515,'2.99','2005-06-15 23:07:50','2006-02-15 22:13:07'),(3096,115,1,3289,'6.99','2005-06-21 06:41:48','2006-02-15 22:13:07'),(3097,115,2,3544,'0.99','2005-07-06 02:06:32','2006-02-15 22:13:07'),(3098,115,1,3624,'0.99','2005-07-06 06:06:27','2006-02-15 22:13:07'),(3099,115,1,4780,'1.99','2005-07-08 16:06:51','2006-02-15 22:13:07'),(3100,115,1,5245,'4.99','2005-07-09 13:24:14','2006-02-15 22:13:07'),(3101,115,1,6080,'2.99','2005-07-11 05:08:11','2006-02-15 22:13:07'),(3102,115,2,6113,'2.99','2005-07-11 07:31:08','2006-02-15 22:13:07'),(3103,115,1,6373,'0.99','2005-07-11 21:35:20','2006-02-15 22:13:07'),(3104,115,1,6574,'5.99','2005-07-12 06:04:22','2006-02-15 22:13:07'),(3105,115,1,6798,'6.99','2005-07-12 16:49:11','2006-02-15 22:13:07'),(3106,115,2,7355,'1.99','2005-07-27 14:45:59','2006-02-15 22:13:07'),(3107,115,2,7465,'4.99','2005-07-27 18:50:30','2006-02-15 22:13:07'),(3108,115,1,7983,'4.99','2005-07-28 14:23:01','2006-02-15 22:13:07'),(3109,115,1,8594,'4.99','2005-07-29 12:42:13','2006-02-15 22:13:07'),(3110,115,2,9578,'0.99','2005-07-31 02:54:31','2006-02-15 22:13:07'),(3111,115,2,10022,'3.99','2005-07-31 18:25:30','2006-02-15 22:13:07'),(3112,115,2,10475,'4.99','2005-08-01 10:03:17','2006-02-15 22:13:07'),(3113,115,2,10647,'2.99','2005-08-01 16:08:46','2006-02-15 22:13:07'),(3114,115,2,10919,'0.99','2005-08-02 02:11:03','2006-02-15 22:13:07'),(3115,115,1,11891,'2.99','2005-08-17 15:11:55','2006-02-15 22:13:07'),(3116,115,2,12366,'0.99','2005-08-18 07:55:14','2006-02-15 22:13:07'),(3117,115,2,13977,'0.99','2005-08-20 19:02:34','2006-02-15 22:13:08'),(3118,115,1,15176,'6.99','2005-08-22 15:30:25','2006-02-15 22:13:08'),(3119,115,2,15452,'0.99','2005-08-23 00:57:12','2006-02-15 22:13:08'),(3120,115,2,13056,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:08'),(3121,116,1,1058,'4.99','2005-05-31 08:04:17','2006-02-15 22:13:08'),(3122,116,2,1332,'0.99','2005-06-15 11:36:01','2006-02-15 22:13:08'),(3123,116,2,1533,'0.99','2005-06-16 00:46:02','2006-02-15 22:13:08'),(3124,116,2,1762,'4.99','2005-06-16 17:50:19','2006-02-15 22:13:08'),(3125,116,2,1913,'4.99','2005-06-17 05:19:47','2006-02-15 22:13:08'),(3126,116,1,2639,'4.99','2005-06-19 09:24:02','2006-02-15 22:13:08'),(3127,116,1,2861,'3.99','2005-06-19 23:21:34','2006-02-15 22:13:08'),(3128,116,2,3908,'6.99','2005-07-06 19:47:26','2006-02-15 22:13:08'),(3129,116,2,3940,'2.99','2005-07-06 21:16:59','2006-02-15 22:13:08'),(3130,116,1,4027,'0.99','2005-07-07 02:19:01','2006-02-15 22:13:08'),(3131,116,2,4737,'4.99','2005-07-08 13:23:53','2006-02-15 22:13:08'),(3132,116,2,5169,'2.99','2005-07-09 09:22:25','2006-02-15 22:13:08'),(3133,116,1,6557,'4.99','2005-07-12 05:12:03','2006-02-15 22:13:08'),(3134,116,1,7238,'0.99','2005-07-27 10:13:41','2006-02-15 22:13:08'),(3135,116,2,7763,'5.99','2005-07-28 06:35:16','2006-02-15 22:13:08'),(3136,116,2,9245,'6.99','2005-07-30 14:07:50','2006-02-15 22:13:08'),(3137,116,1,9562,'3.99','2005-07-31 02:23:20','2006-02-15 22:13:08'),(3138,116,2,10250,'1.99','2005-08-01 02:38:42','2006-02-15 22:13:08'),(3139,116,1,10801,'1.99','2005-08-01 22:09:35','2006-02-15 22:13:08'),(3140,116,2,11016,'4.99','2005-08-02 05:19:13','2006-02-15 22:13:08'),(3141,116,2,12376,'2.99','2005-08-18 08:20:29','2006-02-15 22:13:08'),(3142,116,2,13146,'7.99','2005-08-19 12:54:42','2006-02-15 22:13:08'),(3143,116,1,13369,'0.99','2005-08-19 21:19:47','2006-02-15 22:13:08'),(3144,116,1,13474,'0.99','2005-08-20 01:04:32','2006-02-15 22:13:08'),(3145,116,1,13775,'6.99','2005-08-20 11:56:30','2006-02-15 22:13:08'),(3146,116,2,14763,'11.99','2005-08-21 23:34:00','2006-02-15 22:13:08'),(3147,116,1,14907,'2.99','2005-08-22 04:44:09','2006-02-15 22:13:08'),(3148,117,1,700,'0.99','2005-05-29 02:18:54','2006-02-15 22:13:08'),(3149,117,2,1114,'0.99','2005-05-31 16:00:33','2006-02-15 22:13:08'),(3150,117,1,1755,'2.99','2005-06-16 17:18:44','2006-02-15 22:13:08'),(3151,117,2,3218,'2.99','2005-06-21 01:38:09','2006-02-15 22:13:08'),(3152,117,2,5506,'5.99','2005-07-10 00:45:48','2006-02-15 22:13:08'),(3153,117,1,5673,'0.99','2005-07-10 08:21:54','2006-02-15 22:13:08'),(3154,117,1,6093,'9.99','2005-07-11 05:52:50','2006-02-15 22:13:08'),(3155,117,1,6449,'6.99','2005-07-12 00:48:58','2006-02-15 22:13:08'),(3156,117,1,8687,'2.99','2005-07-29 16:19:17','2006-02-15 22:13:08'),(3157,117,2,10556,'2.99','2005-08-01 12:58:42','2006-02-15 22:13:08'),(3158,117,1,10558,'4.99','2005-08-01 13:00:20','2006-02-15 22:13:08'),(3159,117,2,11467,'3.99','2005-08-02 21:47:07','2006-02-15 22:13:08'),(3160,117,1,12143,'2.99','2005-08-18 00:06:26','2006-02-15 22:13:08'),(3161,117,1,12337,'2.99','2005-08-18 07:02:24','2006-02-15 22:13:08'),(3162,117,1,12575,'6.99','2005-08-18 15:37:42','2006-02-15 22:13:08'),(3163,117,1,12618,'4.99','2005-08-18 17:24:02','2006-02-15 22:13:08'),(3164,117,1,14784,'0.99','2005-08-22 00:23:13','2006-02-15 22:13:08'),(3165,117,2,14854,'2.99','2005-08-22 02:26:47','2006-02-15 22:13:08'),(3166,117,1,15432,'2.99','2005-08-23 00:26:52','2006-02-15 22:13:09'),(3167,118,2,351,'5.99','2005-05-27 05:39:03','2006-02-15 22:13:09'),(3168,118,2,1766,'4.99','2005-06-16 17:59:37','2006-02-15 22:13:09'),(3169,118,2,2217,'0.99','2005-06-18 03:12:29','2006-02-15 22:13:09'),(3170,118,1,3263,'4.99','2005-06-21 04:15:52','2006-02-15 22:13:09'),(3171,118,1,4966,'0.99','2005-07-08 23:47:25','2006-02-15 22:13:09'),(3172,118,1,5829,'1.99','2005-07-10 16:29:41','2006-02-15 22:13:09'),(3173,118,1,6377,'0.99','2005-07-11 21:41:16','2006-02-15 22:13:09'),(3174,118,1,6507,'1.99','2005-07-12 03:33:12','2006-02-15 22:13:09'),(3175,118,1,7196,'2.99','2005-07-27 08:49:08','2006-02-15 22:13:09'),(3176,118,1,7850,'4.99','2005-07-28 09:31:13','2006-02-15 22:13:09'),(3177,118,2,7956,'4.99','2005-07-28 13:32:17','2006-02-15 22:13:09'),(3178,118,1,8314,'3.99','2005-07-29 03:35:04','2006-02-15 22:13:09'),(3179,118,2,8760,'7.99','2005-07-29 19:22:40','2006-02-15 22:13:09'),(3180,118,1,8881,'4.99','2005-07-30 00:22:31','2006-02-15 22:13:09'),(3181,118,2,10045,'1.99','2005-07-31 19:04:35','2006-02-15 22:13:09'),(3182,118,2,12538,'2.99','2005-08-18 14:09:09','2006-02-15 22:13:09'),(3183,118,2,13193,'6.99','2005-08-19 14:33:45','2006-02-15 22:13:09'),(3184,118,2,14394,'5.99','2005-08-21 10:23:10','2006-02-15 22:13:09'),(3185,118,2,14595,'7.99','2005-08-21 17:35:17','2006-02-15 22:13:09'),(3186,118,1,14924,'2.99','2005-08-22 05:15:17','2006-02-15 22:13:09'),(3187,118,1,15731,'0.99','2005-08-23 11:33:25','2006-02-15 22:13:09'),(3188,119,2,67,'0.99','2005-05-25 09:41:01','2006-02-15 22:13:09'),(3189,119,1,235,'5.99','2005-05-26 11:51:09','2006-02-15 22:13:09'),(3190,119,2,540,'6.99','2005-05-28 06:40:25','2006-02-15 22:13:09'),(3191,119,1,1179,'7.99','2005-06-15 00:36:50','2006-02-15 22:13:09'),(3192,119,2,2009,'2.99','2005-06-17 11:48:31','2006-02-15 22:13:09'),(3193,119,2,3388,'5.99','2005-06-21 14:34:51','2006-02-15 22:13:09'),(3194,119,2,4840,'8.99','2005-07-08 18:18:16','2006-02-15 22:13:09'),(3195,119,1,5176,'5.99','2005-07-09 09:39:31','2006-02-15 22:13:09'),(3196,119,1,5268,'0.99','2005-07-09 14:22:43','2006-02-15 22:13:09'),(3197,119,1,6079,'7.99','2005-07-11 05:07:14','2006-02-15 22:13:09'),(3198,119,2,6330,'0.99','2005-07-11 19:15:42','2006-02-15 22:13:09'),(3199,119,2,8140,'4.99','2005-07-28 20:17:50','2006-02-15 22:13:09'),(3200,119,1,8183,'5.99','2005-07-28 22:21:07','2006-02-15 22:13:09'),(3201,119,1,8304,'4.99','2005-07-29 03:08:30','2006-02-15 22:13:09'),(3202,119,2,9028,'2.99','2005-07-30 06:00:35','2006-02-15 22:13:09'),(3203,119,1,10101,'0.99','2005-07-31 20:47:29','2006-02-15 22:13:09'),(3204,119,1,10366,'3.99','2005-08-01 06:09:37','2006-02-15 22:13:09'),(3205,119,2,10552,'2.99','2005-08-01 12:49:44','2006-02-15 22:13:09'),(3206,119,1,10681,'4.99','2005-08-01 17:30:35','2006-02-15 22:13:09'),(3207,119,2,11377,'2.99','2005-08-02 18:16:47','2006-02-15 22:13:09'),(3208,119,1,11520,'5.99','2005-08-17 00:04:28','2006-02-15 22:13:09'),(3209,119,2,12576,'2.99','2005-08-18 15:38:31','2006-02-15 22:13:10'),(3210,119,2,12603,'3.99','2005-08-18 16:56:20','2006-02-15 22:13:10'),(3211,119,2,12842,'6.99','2005-08-19 01:57:21','2006-02-15 22:13:10'),(3212,119,1,13581,'4.99','2005-08-20 05:26:15','2006-02-15 22:13:10'),(3213,119,2,14349,'3.99','2005-08-21 08:54:53','2006-02-15 22:13:10'),(3214,119,2,14382,'2.99','2005-08-21 10:01:03','2006-02-15 22:13:10'),(3215,119,2,14643,'6.99','2005-08-21 19:11:58','2006-02-15 22:13:10'),(3216,119,2,14659,'0.99','2005-08-21 19:42:36','2006-02-15 22:13:10'),(3217,119,1,15111,'4.99','2005-08-22 12:21:43','2006-02-15 22:13:10'),(3218,119,2,15131,'3.99','2005-08-22 13:06:26','2006-02-15 22:13:10'),(3219,119,2,15171,'6.99','2005-08-22 15:23:59','2006-02-15 22:13:10'),(3220,119,1,15844,'2.99','2005-08-23 15:38:12','2006-02-15 22:13:10'),(3221,119,2,16028,'3.99','2005-08-23 21:52:56','2006-02-15 22:13:10'),(3222,120,2,68,'7.99','2005-05-25 09:47:31','2006-02-15 22:13:10'),(3223,120,2,532,'0.99','2005-05-28 05:36:58','2006-02-15 22:13:10'),(3224,120,1,1374,'3.99','2005-06-15 14:49:54','2006-02-15 22:13:10'),(3225,120,1,1820,'4.99','2005-06-16 21:34:50','2006-02-15 22:13:10'),(3226,120,2,1932,'2.99','2005-06-17 06:54:41','2006-02-15 22:13:10'),(3227,120,1,2169,'4.99','2005-06-17 23:57:23','2006-02-15 22:13:10'),(3228,120,1,2803,'9.99','2005-06-19 19:18:27','2006-02-15 22:13:10'),(3229,120,1,3133,'2.99','2005-06-20 19:18:32','2006-02-15 22:13:10'),(3230,120,1,4001,'5.99','2005-07-07 00:07:00','2006-02-15 22:13:10'),(3231,120,2,4272,'3.99','2005-07-07 14:39:20','2006-02-15 22:13:10'),(3232,120,2,4342,'0.99','2005-07-07 18:47:03','2006-02-15 22:13:10'),(3233,120,2,4666,'9.99','2005-07-08 10:05:02','2006-02-15 22:13:10'),(3234,120,1,4942,'1.99','2005-07-08 22:42:47','2006-02-15 22:13:10'),(3235,120,2,5288,'1.99','2005-07-09 15:13:07','2006-02-15 22:13:10'),(3236,120,2,6503,'0.99','2005-07-12 03:18:07','2006-02-15 22:13:10'),(3237,120,1,6989,'4.99','2005-07-27 01:00:34','2006-02-15 22:13:10'),(3238,120,2,8046,'0.99','2005-07-28 16:49:41','2006-02-15 22:13:10'),(3239,120,2,8756,'1.99','2005-07-29 19:18:57','2006-02-15 22:13:10'),(3240,120,1,8998,'6.99','2005-07-30 04:54:14','2006-02-15 22:13:10'),(3241,120,2,9907,'6.99','2005-07-31 14:39:50','2006-02-15 22:13:10'),(3242,120,2,10161,'0.99','2005-07-31 23:09:41','2006-02-15 22:13:10'),(3243,120,2,10696,'4.99','2005-08-01 18:18:13','2006-02-15 22:13:10'),(3244,120,1,10940,'3.99','2005-08-02 03:08:29','2006-02-15 22:13:10'),(3245,120,2,11133,'0.99','2005-08-02 09:15:45','2006-02-15 22:13:10'),(3246,120,2,13167,'2.99','2005-08-19 13:36:41','2006-02-15 22:13:10'),(3247,120,2,13375,'7.99','2005-08-19 21:31:31','2006-02-15 22:13:10'),(3248,120,1,14001,'2.99','2005-08-20 20:07:15','2006-02-15 22:13:10'),(3249,120,1,14153,'4.99','2005-08-21 02:24:33','2006-02-15 22:13:10'),(3250,120,1,14246,'4.99','2005-08-21 05:34:09','2006-02-15 22:13:10'),(3251,120,2,14460,'9.99','2005-08-21 12:48:48','2006-02-15 22:13:10'),(3252,120,2,14969,'6.99','2005-08-22 06:49:15','2006-02-15 22:13:10'),(3253,120,1,15780,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:10'),(3254,121,1,217,'4.99','2005-05-26 09:24:26','2006-02-15 22:13:10'),(3255,121,1,1634,'2.99','2005-06-16 08:16:05','2006-02-15 22:13:10'),(3256,121,1,1833,'1.99','2005-06-16 22:45:03','2006-02-15 22:13:10'),(3257,121,2,5670,'0.99','2005-07-10 08:14:52','2006-02-15 22:13:10'),(3258,121,2,6780,'4.99','2005-07-12 16:18:12','2006-02-15 22:13:11'),(3259,121,2,7114,'0.99','2005-07-27 05:42:13','2006-02-15 22:13:11'),(3260,121,1,7185,'0.99','2005-07-27 08:23:54','2006-02-15 22:13:11'),(3261,121,2,7298,'2.99','2005-07-27 12:45:14','2006-02-15 22:13:11'),(3262,121,1,8370,'6.99','2005-07-29 05:16:21','2006-02-15 22:13:11'),(3263,121,2,8788,'1.99','2005-07-29 20:46:44','2006-02-15 22:13:11'),(3264,121,2,8875,'2.99','2005-07-30 00:15:09','2006-02-15 22:13:11'),(3265,121,2,8969,'8.99','2005-07-30 04:00:19','2006-02-15 22:13:11'),(3266,121,2,10457,'5.99','2005-08-01 09:17:34','2006-02-15 22:13:11'),(3267,121,2,11720,'8.99','2005-08-17 07:46:54','2006-02-15 22:13:11'),(3268,121,2,12242,'1.99','2005-08-18 03:37:31','2006-02-15 22:13:11'),(3269,121,2,12428,'3.99','2005-08-18 10:24:21','2006-02-15 22:13:11'),(3270,121,2,12734,'1.99','2005-08-18 22:04:52','2006-02-15 22:13:11'),(3271,121,1,12881,'5.99','2005-08-19 03:28:13','2006-02-15 22:13:11'),(3272,121,2,12892,'0.99','2005-08-19 03:46:34','2006-02-15 22:13:11'),(3273,121,1,14138,'7.99','2005-08-21 01:59:37','2006-02-15 22:13:11'),(3274,121,1,14177,'4.99','2005-08-21 03:11:33','2006-02-15 22:13:11'),(3275,121,2,14412,'9.99','2005-08-21 11:02:09','2006-02-15 22:13:11'),(3276,121,1,14464,'2.99','2005-08-21 12:52:54','2006-02-15 22:13:11'),(3277,121,2,15114,'7.99','2005-08-22 12:24:55','2006-02-15 22:13:11'),(3278,121,1,15369,'0.99','2005-08-22 21:58:06','2006-02-15 22:13:11'),(3279,121,1,16041,'2.99','2005-08-23 22:20:26','2006-02-15 22:13:11'),(3280,122,2,853,'0.99','2005-05-30 01:43:31','2006-02-15 22:13:11'),(3281,122,2,1135,'4.99','2005-05-31 19:15:11','2006-02-15 22:13:11'),(3282,122,1,1211,'0.99','2005-06-15 03:01:20','2006-02-15 22:13:11'),(3283,122,2,1442,'7.99','2005-06-15 18:55:34','2006-02-15 22:13:11'),(3284,122,2,2240,'3.99','2005-06-18 04:28:27','2006-02-15 22:13:11'),(3285,122,1,2253,'0.99','2005-06-18 05:11:43','2006-02-15 22:13:11'),(3286,122,1,2482,'4.99','2005-06-18 21:10:44','2006-02-15 22:13:11'),(3287,122,2,2595,'4.99','2005-06-19 05:43:55','2006-02-15 22:13:11'),(3288,122,2,2834,'1.99','2005-06-19 21:41:46','2006-02-15 22:13:11'),(3289,122,1,3778,'2.99','2005-07-06 13:44:48','2006-02-15 22:13:11'),(3290,122,2,3986,'4.99','2005-07-06 23:25:13','2006-02-15 22:13:11'),(3291,122,1,4239,'7.99','2005-07-07 13:23:17','2006-02-15 22:13:11'),(3292,122,1,4568,'4.99','2005-07-08 05:23:59','2006-02-15 22:13:11'),(3293,122,2,5235,'6.99','2005-07-09 12:54:25','2006-02-15 22:13:11'),(3294,122,2,6231,'0.99','2005-07-11 14:02:36','2006-02-15 22:13:11'),(3295,122,1,6427,'0.99','2005-07-11 23:57:34','2006-02-15 22:13:11'),(3296,122,1,6436,'0.99','2005-07-12 00:18:42','2006-02-15 22:13:11'),(3297,122,2,6974,'7.99','2005-07-27 00:39:16','2006-02-15 22:13:11'),(3298,122,1,7267,'2.99','2005-07-27 11:22:55','2006-02-15 22:13:11'),(3299,122,2,7950,'4.99','2005-07-28 13:21:00','2006-02-15 22:13:11'),(3300,122,1,8077,'2.99','2005-07-28 17:54:35','2006-02-15 22:13:11'),(3301,122,2,8177,'0.99','2005-07-28 21:43:54','2006-02-15 22:13:11'),(3302,122,1,8772,'5.99','2005-07-29 19:55:25','2006-02-15 22:13:11'),(3303,122,2,9910,'4.99','2005-07-31 14:47:57','2006-02-15 22:13:11'),(3304,122,1,10626,'1.99','2005-08-01 15:32:41','2006-02-15 22:13:11'),(3305,122,2,11044,'3.99','2005-08-02 06:05:27','2006-02-15 22:13:12'),(3306,122,2,11197,'2.99','2005-08-02 11:45:07','2006-02-15 22:13:12'),(3307,122,2,12476,'4.99','2005-08-18 12:22:40','2006-02-15 22:13:12'),(3308,122,2,12711,'4.99','2005-08-18 21:03:32','2006-02-15 22:13:12'),(3309,122,1,13171,'2.99','2005-08-19 13:48:54','2006-02-15 22:13:12'),(3310,122,1,13812,'4.99','2005-08-20 13:01:43','2006-02-15 22:13:12'),(3311,122,2,14666,'5.99','2005-08-21 19:51:09','2006-02-15 22:13:12'),(3312,123,1,992,'2.99','2005-05-30 23:47:56','2006-02-15 22:13:12'),(3313,123,2,1490,'4.99','2005-06-15 21:42:17','2006-02-15 22:13:12'),(3314,123,1,1751,'0.99','2005-06-16 17:00:14','2006-02-15 22:13:12'),(3315,123,2,1775,'4.99','2005-06-16 18:28:19','2006-02-15 22:13:12'),(3316,123,2,1951,'0.99','2005-06-17 08:30:35','2006-02-15 22:13:12'),(3317,123,1,2594,'2.99','2005-06-19 05:43:43','2006-02-15 22:13:12'),(3318,123,1,4442,'3.99','2005-07-07 23:05:30','2006-02-15 22:13:12'),(3319,123,1,4860,'8.99','2005-07-08 18:54:07','2006-02-15 22:13:12'),(3320,123,2,7535,'4.99','2005-07-27 21:32:39','2006-02-15 22:13:12'),(3321,123,1,7727,'2.99','2005-07-28 04:52:43','2006-02-15 22:13:12'),(3322,123,2,7768,'0.99','2005-07-28 06:44:03','2006-02-15 22:13:12'),(3323,123,1,7852,'2.99','2005-07-28 09:34:29','2006-02-15 22:13:12'),(3324,123,1,7969,'5.99','2005-07-28 13:57:37','2006-02-15 22:13:12'),(3325,123,2,8699,'4.99','2005-07-29 16:53:00','2006-02-15 22:13:12'),(3326,123,2,9529,'4.99','2005-07-31 01:05:26','2006-02-15 22:13:12'),(3327,123,1,10066,'4.99','2005-07-31 19:30:01','2006-02-15 22:13:12'),(3328,123,2,10295,'8.99','2005-08-01 03:53:49','2006-02-15 22:13:12'),(3329,123,1,12360,'2.99','2005-08-18 07:46:35','2006-02-15 22:13:12'),(3330,123,1,12402,'3.99','2005-08-18 09:27:34','2006-02-15 22:13:12'),(3331,123,1,13668,'2.99','2005-08-20 08:26:06','2006-02-15 22:13:12'),(3332,123,2,15152,'7.99','2005-08-22 14:25:21','2006-02-15 22:13:12'),(3333,123,2,15525,'4.99','2005-08-23 03:43:32','2006-02-15 22:13:12'),(3334,123,1,15621,'1.99','2005-08-23 07:13:43','2006-02-15 22:13:12'),(3335,123,2,15787,'2.99','2005-08-23 13:51:57','2006-02-15 22:13:12'),(3336,124,1,775,'0.99','2005-05-29 13:23:26','2006-02-15 22:13:12'),(3337,124,2,1039,'4.99','2005-05-31 05:32:29','2006-02-15 22:13:12'),(3338,124,2,1057,'3.99','2005-05-31 07:58:06','2006-02-15 22:13:12'),(3339,124,2,1130,'5.99','2005-05-31 18:13:57','2006-02-15 22:13:12'),(3340,124,2,2336,'1.99','2005-06-18 11:00:05','2006-02-15 22:13:12'),(3341,124,1,4341,'7.99','2005-07-07 18:44:23','2006-02-15 22:13:12'),(3342,124,2,4709,'2.99','2005-07-08 12:04:34','2006-02-15 22:13:12'),(3343,124,1,5566,'2.99','2005-07-10 03:30:17','2006-02-15 22:13:12'),(3344,124,1,6411,'2.99','2005-07-11 23:10:50','2006-02-15 22:13:12'),(3345,124,1,7519,'6.99','2005-07-27 21:01:41','2006-02-15 22:13:12'),(3346,124,2,7700,'8.99','2005-07-28 03:54:14','2006-02-15 22:13:12'),(3347,124,2,8524,'0.99','2005-07-29 10:20:07','2006-02-15 22:13:12'),(3348,124,1,9986,'3.99','2005-07-31 17:16:50','2006-02-15 22:13:12'),(3349,124,2,11493,'5.99','2005-08-02 22:47:00','2006-02-15 22:13:12'),(3350,124,1,12835,'4.99','2005-08-19 01:47:45','2006-02-15 22:13:12'),(3351,124,2,14737,'0.99','2005-08-21 22:27:11','2006-02-15 22:13:13'),(3352,124,2,15266,'4.99','2005-08-22 18:37:24','2006-02-15 22:13:13'),(3353,124,2,16023,'0.99','2005-08-23 21:45:02','2006-02-15 22:13:13'),(3354,125,2,185,'3.99','2005-05-26 05:30:03','2006-02-15 22:13:13'),(3355,125,1,1481,'2.99','2005-06-15 21:17:58','2006-02-15 22:13:13'),(3356,125,1,2355,'3.99','2005-06-18 12:57:06','2006-02-15 22:13:13'),(3357,125,1,2826,'7.99','2005-06-19 20:41:35','2006-02-15 22:13:13'),(3358,125,1,3118,'4.99','2005-06-20 18:05:57','2006-02-15 22:13:13'),(3359,125,1,3617,'4.99','2005-07-06 05:58:06','2006-02-15 22:13:13'),(3360,125,1,5200,'2.99','2005-07-09 10:52:09','2006-02-15 22:13:13'),(3361,125,2,5523,'7.99','2005-07-10 01:47:55','2006-02-15 22:13:13'),(3362,125,1,6055,'0.99','2005-07-11 03:59:08','2006-02-15 22:13:13'),(3363,125,2,6268,'6.99','2005-07-11 15:55:34','2006-02-15 22:13:13'),(3364,125,1,7323,'4.99','2005-07-27 13:39:40','2006-02-15 22:13:13'),(3365,125,2,7879,'0.99','2005-07-28 10:27:46','2006-02-15 22:13:13'),(3366,125,2,7922,'0.99','2005-07-28 12:05:25','2006-02-15 22:13:13'),(3367,125,2,8375,'2.99','2005-07-29 05:25:30','2006-02-15 22:13:13'),(3368,125,1,8433,'2.99','2005-07-29 07:19:16','2006-02-15 22:13:13'),(3369,125,1,8832,'4.99','2005-07-29 22:37:49','2006-02-15 22:13:13'),(3370,125,1,9129,'9.99','2005-07-30 09:51:21','2006-02-15 22:13:13'),(3371,125,1,9496,'4.99','2005-07-30 23:55:20','2006-02-15 22:13:13'),(3372,125,2,9504,'0.99','2005-07-31 00:09:07','2006-02-15 22:13:13'),(3373,125,1,9722,'4.99','2005-07-31 08:29:48','2006-02-15 22:13:13'),(3374,125,2,9734,'2.99','2005-07-31 08:57:45','2006-02-15 22:13:13'),(3375,125,1,10583,'2.99','2005-08-01 13:54:35','2006-02-15 22:13:13'),(3376,125,1,10699,'2.99','2005-08-01 18:24:51','2006-02-15 22:13:13'),(3377,125,2,11279,'7.99','2005-08-02 14:30:03','2006-02-15 22:13:13'),(3378,125,1,11806,'4.99','2005-08-17 11:49:28','2006-02-15 22:13:13'),(3379,125,1,11832,'4.99','2005-08-17 12:55:31','2006-02-15 22:13:13'),(3380,125,1,11999,'0.99','2005-08-17 18:47:07','2006-02-15 22:13:13'),(3381,125,1,12075,'4.99','2005-08-17 21:54:55','2006-02-15 22:13:13'),(3382,125,2,12262,'2.99','2005-08-18 04:16:15','2006-02-15 22:13:13'),(3383,125,2,13441,'6.99','2005-08-19 23:48:23','2006-02-15 22:13:13'),(3384,125,2,14456,'2.99','2005-08-21 12:38:09','2006-02-15 22:13:13'),(3385,125,1,15055,'2.99','2005-08-22 10:14:39','2006-02-15 22:13:13'),(3386,126,1,9,'4.99','2005-05-25 00:00:40','2006-02-15 22:13:13'),(3387,126,1,752,'4.99','2005-05-29 10:14:15','2006-02-15 22:13:13'),(3388,126,2,1054,'4.99','2005-05-31 07:33:25','2006-02-15 22:13:13'),(3389,126,1,3450,'2.99','2005-06-21 21:01:57','2006-02-15 22:13:13'),(3390,126,2,3502,'5.99','2005-07-06 00:15:06','2006-02-15 22:13:13'),(3391,126,1,3725,'4.99','2005-07-06 11:15:04','2006-02-15 22:13:13'),(3392,126,1,3804,'7.99','2005-07-06 15:08:08','2006-02-15 22:13:13'),(3393,126,1,4691,'0.99','2005-07-08 11:04:53','2006-02-15 22:13:13'),(3394,126,2,4730,'2.99','2005-07-08 12:59:49','2006-02-15 22:13:13'),(3395,126,2,5137,'0.99','2005-07-09 08:00:34','2006-02-15 22:13:13'),(3396,126,1,5865,'0.99','2005-07-10 18:31:05','2006-02-15 22:13:13'),(3397,126,1,6747,'0.99','2005-07-12 14:33:21','2006-02-15 22:13:14'),(3398,126,2,6755,'6.99','2005-07-12 15:07:49','2006-02-15 22:13:14'),(3399,126,1,7962,'0.99','2005-07-28 13:48:09','2006-02-15 22:13:14'),(3400,126,1,8091,'2.99','2005-07-28 18:27:29','2006-02-15 22:13:14'),(3401,126,1,9492,'6.99','2005-07-30 23:52:21','2006-02-15 22:13:14'),(3402,126,2,10032,'4.99','2005-07-31 18:41:55','2006-02-15 22:13:14'),(3403,126,1,11196,'9.99','2005-08-02 11:42:40','2006-02-15 22:13:14'),(3404,126,2,11613,'4.99','2005-08-17 03:50:33','2006-02-15 22:13:14'),(3405,126,1,11779,'3.99','2005-08-17 10:31:58','2006-02-15 22:13:14'),(3406,126,1,11801,'0.99','2005-08-17 11:30:11','2006-02-15 22:13:14'),(3407,126,2,12991,'2.99','2005-08-19 07:21:24','2006-02-15 22:13:14'),(3408,126,2,13015,'7.99','2005-08-19 07:56:51','2006-02-15 22:13:14'),(3409,126,2,13177,'0.99','2005-08-19 13:56:58','2006-02-15 22:13:14'),(3410,126,2,14477,'2.99','2005-08-21 13:32:38','2006-02-15 22:13:14'),(3411,126,2,14577,'2.99','2005-08-21 16:52:29','2006-02-15 22:13:14'),(3412,126,2,15741,'4.99','2005-08-23 12:10:54','2006-02-15 22:13:14'),(3413,126,1,16007,'7.99','2005-08-23 21:02:43','2006-02-15 22:13:14'),(3414,127,1,452,'0.99','2005-05-27 19:30:33','2006-02-15 22:13:14'),(3415,127,1,708,'0.99','2005-05-29 03:23:47','2006-02-15 22:13:14'),(3416,127,1,1293,'4.99','2005-06-15 09:06:24','2006-02-15 22:13:14'),(3417,127,2,1803,'2.99','2005-06-16 20:32:47','2006-02-15 22:13:14'),(3418,127,2,2412,'3.99','2005-06-18 16:58:58','2006-02-15 22:13:14'),(3419,127,1,4652,'5.99','2005-07-08 09:47:51','2006-02-15 22:13:14'),(3420,127,2,4811,'5.99','2005-07-08 17:04:24','2006-02-15 22:13:14'),(3421,127,2,5499,'2.99','2005-07-10 00:27:45','2006-02-15 22:13:14'),(3422,127,2,5983,'2.99','2005-07-11 00:34:11','2006-02-15 22:13:14'),(3423,127,1,7912,'4.99','2005-07-28 11:46:58','2006-02-15 22:13:14'),(3424,127,2,8209,'6.99','2005-07-28 23:29:28','2006-02-15 22:13:14'),(3425,127,1,9859,'6.99','2005-07-31 13:02:55','2006-02-15 22:13:14'),(3426,127,1,10197,'2.99','2005-08-01 00:35:25','2006-02-15 22:13:14'),(3427,127,1,10787,'10.99','2005-08-01 21:35:01','2006-02-15 22:13:14'),(3428,127,1,10973,'7.99','2005-08-02 04:09:42','2006-02-15 22:13:14'),(3429,127,1,11235,'0.99','2005-08-02 13:13:21','2006-02-15 22:13:14'),(3430,127,2,12060,'4.99','2005-08-17 21:11:57','2006-02-15 22:13:14'),(3431,127,2,12820,'2.99','2005-08-19 01:05:08','2006-02-15 22:13:14'),(3432,127,2,13043,'4.99','2005-08-19 09:07:13','2006-02-15 22:13:14'),(3433,127,1,13091,'2.99','2005-08-19 10:40:10','2006-02-15 22:13:14'),(3434,127,2,14030,'2.99','2005-08-20 21:23:54','2006-02-15 22:13:14'),(3435,127,1,14189,'2.99','2005-08-21 03:32:17','2006-02-15 22:13:14'),(3436,127,1,15463,'5.99','2005-08-23 01:15:07','2006-02-15 22:13:14'),(3437,127,2,15736,'5.99','2005-08-23 11:40:30','2006-02-15 22:13:14'),(3438,128,2,888,'5.99','2005-05-30 07:13:14','2006-02-15 22:13:14'),(3439,128,2,1131,'2.99','2005-05-31 18:44:19','2006-02-15 22:13:14'),(3440,128,2,2519,'7.99','2005-06-19 00:19:21','2006-02-15 22:13:14'),(3441,128,1,2565,'0.99','2005-06-19 03:44:03','2006-02-15 22:13:14'),(3442,128,1,3751,'0.99','2005-07-06 12:23:41','2006-02-15 22:13:14'),(3443,128,2,3995,'5.99','2005-07-06 23:43:03','2006-02-15 22:13:14'),(3444,128,1,5270,'2.99','2005-07-09 14:23:46','2006-02-15 22:13:14'),(3445,128,1,5647,'4.99','2005-07-10 07:08:40','2006-02-15 22:13:15'),(3446,128,2,5997,'4.99','2005-07-11 01:19:50','2006-02-15 22:13:15'),(3447,128,2,6186,'2.99','2005-07-11 11:26:41','2006-02-15 22:13:15'),(3448,128,2,6481,'6.99','2005-07-12 01:50:15','2006-02-15 22:13:15'),(3449,128,2,6687,'2.99','2005-07-12 12:19:23','2006-02-15 22:13:15'),(3450,128,2,7582,'4.99','2005-07-27 23:15:14','2006-02-15 22:13:15'),(3451,128,2,8415,'2.99','2005-07-29 06:52:27','2006-02-15 22:13:15'),(3452,128,2,9215,'5.99','2005-07-30 13:11:11','2006-02-15 22:13:15'),(3453,128,2,9234,'2.99','2005-07-30 13:45:54','2006-02-15 22:13:15'),(3454,128,1,9433,'5.99','2005-07-30 21:28:17','2006-02-15 22:13:15'),(3455,128,2,9858,'2.99','2005-07-31 13:02:07','2006-02-15 22:13:15'),(3456,128,1,9952,'3.99','2005-07-31 15:52:37','2006-02-15 22:13:15'),(3457,128,1,10011,'2.99','2005-07-31 18:02:41','2006-02-15 22:13:15'),(3458,128,1,10394,'2.99','2005-08-01 06:58:17','2006-02-15 22:13:15'),(3459,128,2,12731,'2.99','2005-08-18 21:55:38','2006-02-15 22:13:15'),(3460,128,2,12843,'2.99','2005-08-19 01:58:54','2006-02-15 22:13:15'),(3461,128,2,12910,'0.99','2005-08-19 04:23:13','2006-02-15 22:13:15'),(3462,128,2,13027,'0.99','2005-08-19 08:25:16','2006-02-15 22:13:15'),(3463,128,2,13181,'5.99','2005-08-19 14:00:56','2006-02-15 22:13:15'),(3464,128,1,13509,'0.99','2005-08-20 02:14:16','2006-02-15 22:13:15'),(3465,128,2,13964,'2.99','2005-08-20 18:24:26','2006-02-15 22:13:15'),(3466,128,2,14157,'0.99','2005-08-21 02:43:15','2006-02-15 22:13:15'),(3467,128,1,14925,'8.99','2005-08-22 05:16:16','2006-02-15 22:13:15'),(3468,128,1,15220,'3.99','2005-08-22 17:02:23','2006-02-15 22:13:15'),(3469,128,1,15835,'8.99','2005-08-23 15:25:27','2006-02-15 22:13:15'),(3470,129,2,1732,'0.99','2005-06-16 15:34:41','2006-02-15 22:13:15'),(3471,129,1,2727,'3.99','2005-06-19 15:02:39','2006-02-15 22:13:15'),(3472,129,2,2768,'0.99','2005-06-19 17:46:52','2006-02-15 22:13:15'),(3473,129,2,2795,'4.99','2005-06-19 18:58:53','2006-02-15 22:13:15'),(3474,129,1,3183,'4.99','2005-06-20 22:55:55','2006-02-15 22:13:15'),(3475,129,1,3219,'3.99','2005-06-21 01:43:26','2006-02-15 22:13:15'),(3476,129,1,3689,'0.99','2005-07-06 09:43:01','2006-02-15 22:13:15'),(3477,129,2,3900,'4.99','2005-07-06 19:21:28','2006-02-15 22:13:15'),(3478,129,2,3936,'0.99','2005-07-06 21:15:03','2006-02-15 22:13:15'),(3479,129,2,4256,'2.99','2005-07-07 14:14:36','2006-02-15 22:13:15'),(3480,129,1,4602,'0.99','2005-07-08 06:52:40','2006-02-15 22:13:15'),(3481,129,1,4896,'2.99','2005-07-08 20:23:15','2006-02-15 22:13:15'),(3482,129,1,4996,'0.99','2005-07-09 00:59:46','2006-02-15 22:13:15'),(3483,129,1,5127,'0.99','2005-07-09 07:25:47','2006-02-15 22:13:15'),(3484,129,2,5350,'4.99','2005-07-09 17:39:30','2006-02-15 22:13:15'),(3485,129,1,8339,'4.99','2005-07-29 04:41:13','2006-02-15 22:13:15'),(3486,129,1,8345,'2.99','2005-07-29 04:47:37','2006-02-15 22:13:15'),(3487,129,2,9823,'4.99','2005-07-31 11:49:00','2006-02-15 22:13:15'),(3488,129,1,9983,'7.99','2005-07-31 17:09:36','2006-02-15 22:13:15'),(3489,129,1,10024,'7.99','2005-07-31 18:26:36','2006-02-15 22:13:15'),(3490,129,2,10167,'5.99','2005-07-31 23:24:31','2006-02-15 22:13:15'),(3491,129,2,10395,'2.99','2005-08-01 07:08:22','2006-02-15 22:13:15'),(3492,129,1,10468,'0.99','2005-08-01 09:48:29','2006-02-15 22:13:15'),(3493,129,1,10483,'2.99','2005-08-01 10:19:45','2006-02-15 22:13:16'),(3494,129,2,10550,'2.99','2005-08-01 12:46:52','2006-02-15 22:13:16'),(3495,129,2,10816,'4.99','2005-08-01 22:48:57','2006-02-15 22:13:16'),(3496,129,2,12612,'3.99','2005-08-18 17:10:05','2006-02-15 22:13:16'),(3497,129,2,12728,'4.99','2005-08-18 21:47:48','2006-02-15 22:13:16'),(3498,129,2,13653,'10.99','2005-08-20 07:54:54','2006-02-15 22:13:16'),(3499,129,1,13915,'4.99','2005-08-20 16:42:53','2006-02-15 22:13:16'),(3500,129,1,13919,'4.99','2005-08-20 16:47:34','2006-02-15 22:13:16'),(3501,129,1,13961,'0.99','2005-08-20 18:16:34','2006-02-15 22:13:16'),(3502,129,1,14353,'0.99','2005-08-21 09:07:50','2006-02-15 22:13:16'),(3503,129,2,14968,'1.99','2005-08-22 06:46:59','2006-02-15 22:13:16'),(3504,130,1,1,'2.99','2005-05-24 22:53:30','2006-02-15 22:13:16'),(3505,130,1,746,'2.99','2005-05-29 09:25:10','2006-02-15 22:13:16'),(3506,130,1,1630,'2.99','2005-06-16 07:55:01','2006-02-15 22:13:16'),(3507,130,2,1864,'2.99','2005-06-17 01:39:47','2006-02-15 22:13:16'),(3508,130,2,2163,'2.99','2005-06-17 23:46:16','2006-02-15 22:13:16'),(3509,130,2,2292,'2.99','2005-06-18 07:37:48','2006-02-15 22:13:16'),(3510,130,1,2535,'2.99','2005-06-19 01:39:04','2006-02-15 22:13:16'),(3511,130,1,2982,'6.99','2005-06-20 08:38:29','2006-02-15 22:13:16'),(3512,130,2,4339,'4.99','2005-07-07 18:41:42','2006-02-15 22:13:16'),(3513,130,2,4485,'4.99','2005-07-08 01:07:54','2006-02-15 22:13:16'),(3514,130,1,6353,'3.99','2005-07-11 20:48:56','2006-02-15 22:13:16'),(3515,130,1,7181,'4.99','2005-07-27 08:14:34','2006-02-15 22:13:16'),(3516,130,1,7728,'0.99','2005-07-28 04:56:33','2006-02-15 22:13:16'),(3517,130,1,9452,'0.99','2005-07-30 22:19:16','2006-02-15 22:13:16'),(3518,130,2,9637,'4.99','2005-07-31 05:18:54','2006-02-15 22:13:16'),(3519,130,2,9724,'5.99','2005-07-31 08:33:08','2006-02-15 22:13:16'),(3520,130,2,10568,'2.99','2005-08-01 13:17:28','2006-02-15 22:13:16'),(3521,130,2,10645,'5.99','2005-08-01 15:52:01','2006-02-15 22:13:16'),(3522,130,1,11811,'2.99','2005-08-17 11:59:18','2006-02-15 22:13:16'),(3523,130,1,12094,'2.99','2005-08-17 22:31:04','2006-02-15 22:13:16'),(3524,130,1,12777,'6.99','2005-08-18 23:39:22','2006-02-15 22:13:16'),(3525,130,2,14111,'0.99','2005-08-21 00:59:01','2006-02-15 22:13:16'),(3526,130,2,15574,'5.99','2005-08-23 05:29:32','2006-02-15 22:13:16'),(3527,130,1,15777,'4.99','2005-08-23 13:29:08','2006-02-15 22:13:16'),(3528,131,2,55,'2.99','2005-05-25 08:26:13','2006-02-15 22:13:16'),(3529,131,1,83,'4.99','2005-05-25 12:30:15','2006-02-15 22:13:16'),(3530,131,2,944,'7.99','2005-05-30 15:26:24','2006-02-15 22:13:16'),(3531,131,1,1646,'9.99','2005-06-16 09:12:53','2006-02-15 22:13:16'),(3532,131,2,1768,'4.99','2005-06-16 18:02:06','2006-02-15 22:13:16'),(3533,131,1,3515,'2.99','2005-07-06 00:48:55','2006-02-15 22:13:16'),(3534,131,1,5233,'4.99','2005-07-09 12:44:26','2006-02-15 22:13:16'),(3535,131,1,5395,'4.99','2005-07-09 19:42:37','2006-02-15 22:13:16'),(3536,131,1,5610,'2.99','2005-07-10 05:09:52','2006-02-15 22:13:16'),(3537,131,2,5726,'2.99','2005-07-10 11:22:08','2006-02-15 22:13:16'),(3538,131,1,5874,'3.99','2005-07-10 19:02:51','2006-02-15 22:13:16'),(3539,131,1,7557,'2.99','2005-07-27 22:18:19','2006-02-15 22:13:16'),(3540,131,2,8071,'0.99','2005-07-28 17:27:48','2006-02-15 22:13:16'),(3541,131,1,8267,'6.99','2005-07-29 01:21:02','2006-02-15 22:13:17'),(3542,131,1,8570,'8.99','2005-07-29 11:40:08','2006-02-15 22:13:17'),(3543,131,1,9323,'3.99','2005-07-30 17:21:44','2006-02-15 22:13:17'),(3544,131,1,10179,'2.99','2005-07-31 23:49:54','2006-02-15 22:13:17'),(3545,131,1,10459,'4.99','2005-08-01 09:20:09','2006-02-15 22:13:17'),(3546,131,1,10861,'1.99','2005-08-02 00:12:46','2006-02-15 22:13:17'),(3547,131,2,11971,'0.99','2005-08-17 17:53:42','2006-02-15 22:13:17'),(3548,131,1,11973,'2.99','2005-08-17 17:55:58','2006-02-15 22:13:17'),(3549,131,1,12216,'0.99','2005-08-18 02:37:07','2006-02-15 22:13:17'),(3550,131,2,12263,'0.99','2005-08-18 04:16:18','2006-02-15 22:13:17'),(3551,131,1,12372,'9.99','2005-08-18 08:04:35','2006-02-15 22:13:17'),(3552,131,2,13050,'6.99','2005-08-19 09:31:23','2006-02-15 22:13:17'),(3553,131,2,13346,'7.99','2005-08-19 20:28:21','2006-02-15 22:13:17'),(3554,131,2,13353,'2.99','2005-08-19 20:53:43','2006-02-15 22:13:17'),(3555,131,1,13407,'0.99','2005-08-19 22:26:26','2006-02-15 22:13:17'),(3556,131,2,15659,'2.99','2005-08-23 08:48:43','2006-02-15 22:13:17'),(3557,131,1,16042,'2.99','2005-08-23 22:20:40','2006-02-15 22:13:17'),(3558,132,1,1843,'0.99','2005-06-16 23:53:42','2006-02-15 22:13:17'),(3559,132,1,2208,'4.99','2005-06-18 02:22:07','2006-02-15 22:13:17'),(3560,132,1,2384,'0.99','2005-06-18 15:18:49','2006-02-15 22:13:17'),(3561,132,2,2608,'2.99','2005-06-19 07:10:36','2006-02-15 22:13:17'),(3562,132,2,2924,'4.99','2005-06-20 04:20:14','2006-02-15 22:13:17'),(3563,132,1,3121,'4.99','2005-06-20 18:23:30','2006-02-15 22:13:17'),(3564,132,1,3706,'0.99','2005-07-06 10:18:01','2006-02-15 22:13:17'),(3565,132,2,3825,'2.99','2005-07-06 15:50:03','2006-02-15 22:13:17'),(3566,132,1,4168,'4.99','2005-07-07 09:37:24','2006-02-15 22:13:17'),(3567,132,1,4534,'4.99','2005-07-08 03:36:55','2006-02-15 22:13:17'),(3568,132,1,4557,'5.99','2005-07-08 04:49:15','2006-02-15 22:13:17'),(3569,132,2,4903,'0.99','2005-07-08 20:50:05','2006-02-15 22:13:17'),(3570,132,1,5391,'2.99','2005-07-09 19:28:34','2006-02-15 22:13:17'),(3571,132,2,5684,'5.99','2005-07-10 08:59:03','2006-02-15 22:13:17'),(3572,132,1,5703,'0.99','2005-07-10 10:04:15','2006-02-15 22:13:17'),(3573,132,2,5715,'1.99','2005-07-10 10:48:03','2006-02-15 22:13:17'),(3574,132,1,6239,'6.99','2005-07-11 14:20:48','2006-02-15 22:13:17'),(3575,132,1,6978,'1.99','2005-07-27 00:47:40','2006-02-15 22:13:17'),(3576,132,2,7432,'0.99','2005-07-27 17:31:40','2006-02-15 22:13:17'),(3577,132,1,7631,'1.99','2005-07-28 01:01:15','2006-02-15 22:13:17'),(3578,132,2,10243,'4.99','2005-08-01 02:18:46','2006-02-15 22:13:17'),(3579,132,1,10400,'6.99','2005-08-01 07:18:24','2006-02-15 22:13:17'),(3580,132,2,10619,'3.99','2005-08-01 15:07:04','2006-02-15 22:13:17'),(3581,132,1,10638,'6.99','2005-08-01 15:44:20','2006-02-15 22:13:17'),(3582,132,2,11140,'0.99','2005-08-02 09:27:45','2006-02-15 22:13:17'),(3583,132,2,11812,'0.99','2005-08-17 12:00:54','2006-02-15 22:13:17'),(3584,132,2,12133,'0.99','2005-08-17 23:47:16','2006-02-15 22:13:17'),(3585,132,1,15874,'4.99','2005-08-23 16:30:55','2006-02-15 22:13:17'),(3586,133,1,275,'6.99','2005-05-26 17:09:53','2006-02-15 22:13:17'),(3587,133,2,447,'2.99','2005-05-27 18:57:02','2006-02-15 22:13:17'),(3588,133,2,1522,'3.99','2005-06-16 00:17:39','2006-02-15 22:13:17'),(3589,133,2,2665,'7.99','2005-06-19 11:12:35','2006-02-15 22:13:18'),(3590,133,1,3006,'0.99','2005-06-20 10:10:29','2006-02-15 22:13:18'),(3591,133,2,3365,'0.99','2005-06-21 12:55:48','2006-02-15 22:13:18'),(3592,133,2,4506,'6.99','2005-07-08 02:22:18','2006-02-15 22:13:18'),(3593,133,2,4566,'2.99','2005-07-08 05:18:50','2006-02-15 22:13:18'),(3594,133,1,4681,'6.99','2005-07-08 10:36:03','2006-02-15 22:13:18'),(3595,133,2,4829,'2.99','2005-07-08 17:54:18','2006-02-15 22:13:18'),(3596,133,2,5063,'2.99','2005-07-09 04:37:31','2006-02-15 22:13:18'),(3597,133,1,6157,'4.99','2005-07-11 09:48:16','2006-02-15 22:13:18'),(3598,133,1,6609,'3.99','2005-07-12 08:19:41','2006-02-15 22:13:18'),(3599,133,1,7177,'2.99','2005-07-27 08:07:39','2006-02-15 22:13:18'),(3600,133,1,7400,'0.99','2005-07-27 16:16:37','2006-02-15 22:13:18'),(3601,133,2,8389,'6.99','2005-07-29 05:50:09','2006-02-15 22:13:18'),(3602,133,2,9139,'2.99','2005-07-30 10:11:52','2006-02-15 22:13:18'),(3603,133,1,9175,'0.99','2005-07-30 11:47:48','2006-02-15 22:13:18'),(3604,133,2,9671,'0.99','2005-07-31 06:33:41','2006-02-15 22:13:18'),(3605,133,1,10665,'0.99','2005-08-01 16:56:17','2006-02-15 22:13:18'),(3606,133,1,12419,'4.99','2005-08-18 10:01:48','2006-02-15 22:13:18'),(3607,133,1,12834,'4.99','2005-08-19 01:47:30','2006-02-15 22:13:18'),(3608,133,2,13323,'2.99','2005-08-19 19:48:07','2006-02-15 22:13:18'),(3609,133,1,13455,'1.99','2005-08-20 00:32:17','2006-02-15 22:13:18'),(3610,133,2,13910,'2.99','2005-08-20 16:30:49','2006-02-15 22:13:18'),(3611,133,2,15080,'0.99','2005-08-22 11:11:51','2006-02-15 22:13:18'),(3612,133,1,16009,'6.99','2005-08-23 21:07:59','2006-02-15 22:13:18'),(3613,134,1,366,'3.99','2005-05-27 07:33:54','2006-02-15 22:13:18'),(3614,134,2,798,'0.99','2005-05-29 17:23:43','2006-02-15 22:13:18'),(3615,134,1,814,'6.99','2005-05-29 20:16:12','2006-02-15 22:13:18'),(3616,134,2,1124,'4.99','2005-05-31 16:49:34','2006-02-15 22:13:18'),(3617,134,1,1618,'9.99','2005-06-16 07:08:38','2006-02-15 22:13:18'),(3618,134,2,1784,'0.99','2005-06-16 19:25:32','2006-02-15 22:13:18'),(3619,134,2,1881,'0.99','2005-06-17 03:09:56','2006-02-15 22:13:18'),(3620,134,1,3267,'5.99','2005-06-21 04:55:21','2006-02-15 22:13:18'),(3621,134,1,5315,'4.99','2005-07-09 16:09:19','2006-02-15 22:13:18'),(3622,134,2,6226,'2.99','2005-07-11 13:48:11','2006-02-15 22:13:18'),(3623,134,1,6659,'0.99','2005-07-12 11:18:05','2006-02-15 22:13:18'),(3624,134,2,7516,'2.99','2005-07-27 20:55:28','2006-02-15 22:13:18'),(3625,134,2,7965,'4.99','2005-07-28 13:52:57','2006-02-15 22:13:18'),(3626,134,2,8650,'1.99','2005-07-29 14:59:04','2006-02-15 22:13:18'),(3627,134,1,10864,'6.99','2005-08-02 00:18:59','2006-02-15 22:13:18'),(3628,134,1,11280,'3.99','2005-08-02 14:34:33','2006-02-15 22:13:18'),(3629,134,1,11283,'4.99','2005-08-02 14:39:46','2006-02-15 22:13:18'),(3630,134,2,11482,'4.99','2005-08-02 22:24:31','2006-02-15 22:13:18'),(3631,134,1,12754,'7.99','2005-08-18 22:37:41','2006-02-15 22:13:18'),(3632,134,2,12987,'2.99','2005-08-19 07:11:44','2006-02-15 22:13:19'),(3633,134,2,13006,'2.99','2005-08-19 07:47:16','2006-02-15 22:13:19'),(3634,134,2,14265,'2.99','2005-08-21 06:20:14','2006-02-15 22:13:19'),(3635,134,2,15963,'2.99','2005-08-23 19:42:46','2006-02-15 22:13:19'),(3636,135,1,78,'5.99','2005-05-25 11:35:18','2006-02-15 22:13:19'),(3637,135,2,753,'3.99','2005-05-29 10:16:42','2006-02-15 22:13:19'),(3638,135,2,1272,'0.99','2005-06-15 07:42:58','2006-02-15 22:13:19'),(3639,135,2,1671,'1.99','2005-06-16 10:30:22','2006-02-15 22:13:19'),(3640,135,2,2941,'2.99','2005-06-20 05:22:18','2006-02-15 22:13:19'),(3641,135,1,4102,'0.99','2005-07-07 06:25:19','2006-02-15 22:13:19'),(3642,135,2,5054,'7.99','2005-07-09 04:01:02','2006-02-15 22:13:19'),(3643,135,1,5541,'0.99','2005-07-10 02:44:27','2006-02-15 22:13:19'),(3644,135,1,6117,'3.99','2005-07-11 07:39:38','2006-02-15 22:13:19'),(3645,135,1,6461,'3.99','2005-07-12 01:14:03','2006-02-15 22:13:19'),(3646,135,1,6817,'3.99','2005-07-12 18:19:57','2006-02-15 22:13:19'),(3647,135,2,7297,'4.99','2005-07-27 12:39:48','2006-02-15 22:13:19'),(3648,135,1,7437,'0.99','2005-07-27 17:39:18','2006-02-15 22:13:19'),(3649,135,1,7554,'7.99','2005-07-27 22:12:41','2006-02-15 22:13:19'),(3650,135,1,7734,'0.99','2005-07-28 05:08:44','2006-02-15 22:13:19'),(3651,135,1,8315,'0.99','2005-07-29 03:37:07','2006-02-15 22:13:19'),(3652,135,2,8885,'7.99','2005-07-30 00:36:26','2006-02-15 22:13:19'),(3653,135,1,8987,'6.99','2005-07-30 04:37:36','2006-02-15 22:13:19'),(3654,135,2,10091,'4.99','2005-07-31 20:23:13','2006-02-15 22:13:19'),(3655,135,2,10471,'0.99','2005-08-01 09:52:37','2006-02-15 22:13:19'),(3656,135,1,10611,'2.99','2005-08-01 14:53:52','2006-02-15 22:13:19'),(3657,135,1,10698,'3.99','2005-08-01 18:24:41','2006-02-15 22:13:19'),(3658,135,2,11194,'5.99','2005-08-02 11:35:53','2006-02-15 22:13:19'),(3659,135,1,11704,'7.99','2005-08-17 07:21:22','2006-02-15 22:13:19'),(3660,135,1,12249,'2.99','2005-08-18 03:53:34','2006-02-15 22:13:19'),(3661,135,1,13035,'0.99','2005-08-19 08:46:45','2006-02-15 22:13:19'),(3662,135,1,14005,'0.99','2005-08-20 20:19:05','2006-02-15 22:13:19'),(3663,135,2,14136,'5.99','2005-08-21 01:57:26','2006-02-15 22:13:19'),(3664,135,2,15908,'2.99','2005-08-23 17:42:00','2006-02-15 22:13:19'),(3665,135,1,13390,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:19'),(3666,136,2,1150,'2.99','2005-05-31 21:20:09','2006-02-15 22:13:19'),(3667,136,2,2104,'2.99','2005-06-17 19:14:30','2006-02-15 22:13:19'),(3668,136,1,4927,'0.99','2005-07-08 22:05:35','2006-02-15 22:13:19'),(3669,136,1,5627,'3.99','2005-07-10 05:51:12','2006-02-15 22:13:19'),(3670,136,2,6142,'3.99','2005-07-11 08:54:09','2006-02-15 22:13:19'),(3671,136,1,6585,'8.99','2005-07-12 06:50:52','2006-02-15 22:13:19'),(3672,136,2,9319,'0.99','2005-07-30 17:15:27','2006-02-15 22:13:19'),(3673,136,2,9764,'5.99','2005-07-31 09:42:58','2006-02-15 22:13:19'),(3674,136,2,11992,'10.99','2005-08-17 18:27:22','2006-02-15 22:13:19'),(3675,136,1,12287,'5.99','2005-08-18 04:58:06','2006-02-15 22:13:19'),(3676,136,2,12539,'0.99','2005-08-18 14:10:09','2006-02-15 22:13:19'),(3677,136,2,13992,'4.99','2005-08-20 19:30:35','2006-02-15 22:13:19'),(3678,136,2,14379,'0.99','2005-08-21 09:53:03','2006-02-15 22:13:19'),(3679,136,1,14437,'2.99','2005-08-21 11:48:32','2006-02-15 22:13:19'),(3680,136,1,15439,'4.99','2005-08-23 00:34:28','2006-02-15 22:13:20'),(3681,137,1,925,'2.99','2005-05-30 12:13:52','2006-02-15 22:13:20'),(3682,137,1,2469,'6.99','2005-06-18 20:24:23','2006-02-15 22:13:20'),(3683,137,1,2785,'2.99','2005-06-19 18:43:57','2006-02-15 22:13:20'),(3684,137,2,3058,'3.99','2005-06-20 13:28:35','2006-02-15 22:13:20'),(3685,137,1,3436,'5.99','2005-06-21 19:16:09','2006-02-15 22:13:20'),(3686,137,2,3589,'4.99','2005-07-06 04:30:18','2006-02-15 22:13:20'),(3687,137,2,3676,'5.99','2005-07-06 09:10:37','2006-02-15 22:13:20'),(3688,137,2,3874,'6.99','2005-07-06 18:06:12','2006-02-15 22:13:20'),(3689,137,1,4332,'6.99','2005-07-07 18:25:26','2006-02-15 22:13:20'),(3690,137,2,4474,'3.99','2005-07-08 00:26:56','2006-02-15 22:13:20'),(3691,137,1,5106,'2.99','2005-07-09 06:40:24','2006-02-15 22:13:20'),(3692,137,1,5443,'3.99','2005-07-09 21:56:09','2006-02-15 22:13:20'),(3693,137,1,5804,'2.99','2005-07-10 15:06:31','2006-02-15 22:13:20'),(3694,137,1,6039,'6.99','2005-07-11 03:12:19','2006-02-15 22:13:20'),(3695,137,2,6200,'0.99','2005-07-11 12:16:42','2006-02-15 22:13:20'),(3696,137,1,8028,'8.99','2005-07-28 16:11:15','2006-02-15 22:13:20'),(3697,137,1,8106,'4.99','2005-07-28 19:02:46','2006-02-15 22:13:20'),(3698,137,2,8954,'2.99','2005-07-30 03:25:51','2006-02-15 22:13:20'),(3699,137,1,9002,'4.99','2005-07-30 05:02:21','2006-02-15 22:13:20'),(3700,137,2,9200,'4.99','2005-07-30 12:39:52','2006-02-15 22:13:20'),(3701,137,2,9466,'7.99','2005-07-30 22:44:36','2006-02-15 22:13:20'),(3702,137,1,9709,'4.99','2005-07-31 08:04:55','2006-02-15 22:13:20'),(3703,137,1,9789,'2.99','2005-07-31 10:30:25','2006-02-15 22:13:20'),(3704,137,1,10175,'6.99','2005-07-31 23:40:11','2006-02-15 22:13:20'),(3705,137,2,10595,'4.99','2005-08-01 14:16:28','2006-02-15 22:13:20'),(3706,137,2,10842,'5.99','2005-08-01 23:41:24','2006-02-15 22:13:20'),(3707,137,2,11057,'4.99','2005-08-02 06:38:19','2006-02-15 22:13:20'),(3708,137,1,11281,'3.99','2005-08-02 14:35:01','2006-02-15 22:13:20'),(3709,137,2,11732,'3.99','2005-08-17 08:29:46','2006-02-15 22:13:20'),(3710,137,1,12078,'2.99','2005-08-17 22:00:22','2006-02-15 22:13:20'),(3711,137,1,13148,'0.99','2005-08-19 12:55:30','2006-02-15 22:13:20'),(3712,137,1,13472,'5.99','2005-08-20 01:03:31','2006-02-15 22:13:20'),(3713,137,1,13776,'5.99','2005-08-20 11:57:06','2006-02-15 22:13:20'),(3714,137,1,14754,'7.99','2005-08-21 23:17:26','2006-02-15 22:13:20'),(3715,137,2,15082,'7.99','2005-08-22 11:17:06','2006-02-15 22:13:20'),(3716,137,1,15133,'0.99','2005-08-22 13:17:43','2006-02-15 22:13:20'),(3717,137,2,15537,'2.99','2005-08-23 04:00:30','2006-02-15 22:13:20'),(3718,137,2,15889,'4.99','2005-08-23 16:57:43','2006-02-15 22:13:20'),(3719,137,1,16030,'9.99','2005-08-23 21:56:04','2006-02-15 22:13:20'),(3720,138,1,523,'2.99','2005-05-28 03:53:26','2006-02-15 22:13:20'),(3721,138,1,1020,'0.99','2005-05-31 03:06:08','2006-02-15 22:13:20'),(3722,138,2,1316,'0.99','2005-06-15 10:26:23','2006-02-15 22:13:20'),(3723,138,2,2038,'0.99','2005-06-17 14:00:51','2006-02-15 22:13:20'),(3724,138,1,2731,'7.99','2005-06-19 15:14:55','2006-02-15 22:13:20'),(3725,138,2,3481,'2.99','2005-07-05 23:13:07','2006-02-15 22:13:20'),(3726,138,1,5378,'0.99','2005-07-09 19:05:56','2006-02-15 22:13:20'),(3727,138,1,5600,'1.99','2005-07-10 04:55:45','2006-02-15 22:13:20'),(3728,138,1,5679,'4.99','2005-07-10 08:44:02','2006-02-15 22:13:21'),(3729,138,1,6458,'2.99','2005-07-12 01:08:52','2006-02-15 22:13:21'),(3730,138,1,6892,'0.99','2005-07-12 21:10:04','2006-02-15 22:13:21'),(3731,138,1,7208,'2.99','2005-07-27 09:16:28','2006-02-15 22:13:21'),(3732,138,1,7754,'2.99','2005-07-28 06:10:55','2006-02-15 22:13:21'),(3733,138,2,8123,'4.99','2005-07-28 19:28:23','2006-02-15 22:13:21'),(3734,138,2,8160,'3.99','2005-07-28 21:10:30','2006-02-15 22:13:21'),(3735,138,1,8424,'3.99','2005-07-29 07:06:03','2006-02-15 22:13:21'),(3736,138,2,9259,'1.99','2005-07-30 14:37:44','2006-02-15 22:13:21'),(3737,138,1,9619,'0.99','2005-07-31 04:17:02','2006-02-15 22:13:21'),(3738,138,1,9947,'9.99','2005-07-31 15:49:40','2006-02-15 22:13:21'),(3739,138,1,10110,'0.99','2005-07-31 21:06:12','2006-02-15 22:13:21'),(3740,138,2,10190,'4.99','2005-08-01 00:27:53','2006-02-15 22:13:21'),(3741,138,1,10268,'3.99','2005-08-01 03:08:56','2006-02-15 22:13:21'),(3742,138,1,10431,'5.99','2005-08-01 08:41:54','2006-02-15 22:13:21'),(3743,138,1,11015,'4.99','2005-08-02 05:13:00','2006-02-15 22:13:21'),(3744,138,1,11088,'0.99','2005-08-02 07:48:31','2006-02-15 22:13:21'),(3745,138,1,11463,'0.99','2005-08-02 21:37:36','2006-02-15 22:13:21'),(3746,138,2,12550,'2.99','2005-08-18 14:40:38','2006-02-15 22:13:21'),(3747,138,2,12873,'2.99','2005-08-19 03:05:41','2006-02-15 22:13:21'),(3748,138,1,14194,'1.99','2005-08-21 03:40:11','2006-02-15 22:13:21'),(3749,138,2,14432,'4.99','2005-08-21 11:36:15','2006-02-15 22:13:21'),(3750,138,2,14486,'4.99','2005-08-21 13:52:54','2006-02-15 22:13:21'),(3751,138,1,14987,'4.99','2005-08-22 07:41:08','2006-02-15 22:13:21'),(3752,138,1,15424,'2.99','2005-08-23 00:03:01','2006-02-15 22:13:21'),(3753,138,1,15501,'0.99','2005-08-23 02:39:56','2006-02-15 22:13:21'),(3754,139,2,1169,'2.99','2005-06-14 23:42:56','2006-02-15 22:13:21'),(3755,139,1,1736,'2.99','2005-06-16 15:52:32','2006-02-15 22:13:21'),(3756,139,1,2659,'0.99','2005-06-19 10:47:42','2006-02-15 22:13:21'),(3757,139,2,2718,'7.99','2005-06-19 14:49:42','2006-02-15 22:13:21'),(3758,139,2,4660,'0.99','2005-07-08 09:54:47','2006-02-15 22:13:21'),(3759,139,2,4663,'2.99','2005-07-08 09:59:18','2006-02-15 22:13:21'),(3760,139,2,5092,'2.99','2005-07-09 05:57:39','2006-02-15 22:13:21'),(3761,139,2,5265,'7.99','2005-07-09 14:15:01','2006-02-15 22:13:21'),(3762,139,1,5390,'6.99','2005-07-09 19:26:22','2006-02-15 22:13:21'),(3763,139,1,5494,'6.99','2005-07-10 00:15:00','2006-02-15 22:13:21'),(3764,139,1,6496,'6.99','2005-07-12 02:57:39','2006-02-15 22:13:21'),(3765,139,2,6740,'0.99','2005-07-12 14:22:08','2006-02-15 22:13:21'),(3766,139,1,7369,'0.99','2005-07-27 15:07:58','2006-02-15 22:13:21'),(3767,139,2,7767,'5.99','2005-07-28 06:42:02','2006-02-15 22:13:21'),(3768,139,2,9415,'2.99','2005-07-30 20:48:31','2006-02-15 22:13:21'),(3769,139,2,9920,'4.99','2005-07-31 14:57:13','2006-02-15 22:13:21'),(3770,139,1,10900,'2.99','2005-08-02 01:34:26','2006-02-15 22:13:21'),(3771,139,1,12859,'6.99','2005-08-19 02:23:23','2006-02-15 22:13:21'),(3772,139,2,13401,'3.99','2005-08-19 22:16:16','2006-02-15 22:13:21'),(3773,139,2,14736,'5.99','2005-08-21 22:25:53','2006-02-15 22:13:21'),(3774,139,1,14788,'2.99','2005-08-22 00:27:59','2006-02-15 22:13:21'),(3775,139,1,15024,'2.99','2005-08-22 08:57:10','2006-02-15 22:13:22'),(3776,139,2,15029,'2.99','2005-08-22 09:04:53','2006-02-15 22:13:22'),(3777,139,1,15062,'2.99','2005-08-22 10:34:39','2006-02-15 22:13:22'),(3778,139,1,15218,'9.99','2005-08-22 16:59:05','2006-02-15 22:13:22'),(3779,139,1,15471,'3.99','2005-08-23 01:38:48','2006-02-15 22:13:22'),(3780,139,1,15743,'0.99','2005-08-23 12:12:05','2006-02-15 22:13:22'),(3781,140,1,1586,'4.99','2005-06-16 04:51:18','2006-02-15 22:13:22'),(3782,140,1,1687,'2.99','2005-06-16 12:09:20','2006-02-15 22:13:22'),(3783,140,2,2332,'6.99','2005-06-18 10:53:51','2006-02-15 22:13:22'),(3784,140,2,3171,'0.99','2005-06-20 22:15:47','2006-02-15 22:13:22'),(3785,140,1,6286,'4.99','2005-07-11 16:55:35','2006-02-15 22:13:22'),(3786,140,1,6407,'9.99','2005-07-11 23:02:19','2006-02-15 22:13:22'),(3787,140,2,6571,'0.99','2005-07-12 05:51:47','2006-02-15 22:13:22'),(3788,140,1,6918,'2.99','2005-07-12 22:30:29','2006-02-15 22:13:22'),(3789,140,1,7170,'4.99','2005-07-27 07:58:26','2006-02-15 22:13:22'),(3790,140,1,9094,'4.99','2005-07-30 08:35:10','2006-02-15 22:13:22'),(3791,140,1,9404,'0.99','2005-07-30 20:21:35','2006-02-15 22:13:22'),(3792,140,1,10342,'6.99','2005-08-01 05:11:11','2006-02-15 22:13:22'),(3793,140,2,11430,'3.99','2005-08-02 20:04:36','2006-02-15 22:13:22'),(3794,140,1,12086,'4.99','2005-08-17 22:20:01','2006-02-15 22:13:22'),(3795,140,1,12675,'4.99','2005-08-18 19:34:02','2006-02-15 22:13:22'),(3796,140,2,13053,'10.99','2005-08-19 09:31:48','2006-02-15 22:13:22'),(3797,140,1,15261,'2.99','2005-08-22 18:24:34','2006-02-15 22:13:22'),(3798,140,1,15852,'2.99','2005-08-23 15:47:02','2006-02-15 22:13:22'),(3799,141,2,930,'2.99','2005-05-30 12:44:57','2006-02-15 22:13:22'),(3800,141,2,1242,'7.99','2005-06-15 05:05:07','2006-02-15 22:13:22'),(3801,141,2,2895,'7.99','2005-06-20 02:26:31','2006-02-15 22:13:22'),(3802,141,1,3434,'4.99','2005-06-21 19:08:28','2006-02-15 22:13:22'),(3803,141,1,4057,'1.99','2005-07-07 04:00:20','2006-02-15 22:13:22'),(3804,141,2,4297,'0.99','2005-07-07 16:24:09','2006-02-15 22:13:22'),(3805,141,1,4656,'5.99','2005-07-08 09:50:10','2006-02-15 22:13:22'),(3806,141,2,5062,'2.99','2005-07-09 04:36:49','2006-02-15 22:13:22'),(3807,141,1,5769,'0.99','2005-07-10 13:17:58','2006-02-15 22:13:22'),(3808,141,2,6979,'4.99','2005-07-27 00:49:53','2006-02-15 22:13:22'),(3809,141,2,7878,'2.99','2005-07-28 10:27:10','2006-02-15 22:13:22'),(3810,141,1,8434,'4.99','2005-07-29 07:20:14','2006-02-15 22:13:22'),(3811,141,2,9073,'7.99','2005-07-30 07:49:56','2006-02-15 22:13:22'),(3812,141,1,9584,'4.99','2005-07-31 03:05:48','2006-02-15 22:13:22'),(3813,141,2,9683,'2.99','2005-07-31 06:47:13','2006-02-15 22:13:22'),(3814,141,1,10287,'3.99','2005-08-01 03:37:01','2006-02-15 22:13:22'),(3815,141,1,10379,'1.99','2005-08-01 06:34:29','2006-02-15 22:13:22'),(3816,141,1,10798,'4.99','2005-08-01 22:03:10','2006-02-15 22:13:22'),(3817,141,1,11411,'2.99','2005-08-02 19:29:47','2006-02-15 22:13:22'),(3818,141,1,11412,'5.99','2005-08-02 19:32:51','2006-02-15 22:13:22'),(3819,141,1,12032,'5.99','2005-08-17 20:14:26','2006-02-15 22:13:23'),(3820,141,1,12093,'2.99','2005-08-17 22:28:40','2006-02-15 22:13:23'),(3821,141,2,12107,'3.99','2005-08-17 22:56:24','2006-02-15 22:13:23'),(3822,141,2,12353,'2.99','2005-08-18 07:33:08','2006-02-15 22:13:23'),(3823,141,1,13000,'0.99','2005-08-19 07:36:42','2006-02-15 22:13:23'),(3824,141,2,13169,'2.99','2005-08-19 13:43:35','2006-02-15 22:13:23'),(3825,141,2,13470,'4.99','2005-08-20 01:01:16','2006-02-15 22:13:23'),(3826,141,2,14059,'7.99','2005-08-20 22:24:44','2006-02-15 22:13:23'),(3827,141,1,14112,'2.99','2005-08-21 01:00:46','2006-02-15 22:13:23'),(3828,141,1,15013,'4.99','2005-08-22 08:42:45','2006-02-15 22:13:23'),(3829,141,1,15309,'0.99','2005-08-22 19:54:52','2006-02-15 22:13:23'),(3830,141,1,15964,'2.99','2005-08-23 19:45:25','2006-02-15 22:13:23'),(3831,142,2,11,'8.99','2005-05-25 00:09:02','2006-02-15 22:13:23'),(3832,142,1,148,'0.99','2005-05-26 00:25:23','2006-02-15 22:13:23'),(3833,142,1,575,'9.99','2005-05-28 10:56:09','2006-02-15 22:13:23'),(3834,142,1,1268,'1.99','2005-06-15 07:29:30','2006-02-15 22:13:23'),(3835,142,1,3214,'2.99','2005-06-21 01:08:26','2006-02-15 22:13:23'),(3836,142,2,3492,'2.99','2005-07-05 23:44:37','2006-02-15 22:13:23'),(3837,142,2,4497,'4.99','2005-07-08 01:51:32','2006-02-15 22:13:23'),(3838,142,1,4531,'4.99','2005-07-08 03:27:59','2006-02-15 22:13:23'),(3839,142,1,6522,'0.99','2005-07-12 04:11:58','2006-02-15 22:13:23'),(3840,142,1,7764,'2.99','2005-07-28 06:40:05','2006-02-15 22:13:23'),(3841,142,2,8513,'2.99','2005-07-29 09:52:59','2006-02-15 22:13:23'),(3842,142,2,8623,'4.99','2005-07-29 13:55:11','2006-02-15 22:13:23'),(3843,142,1,9020,'7.99','2005-07-30 05:31:27','2006-02-15 22:13:23'),(3844,142,1,9131,'2.99','2005-07-30 09:55:57','2006-02-15 22:13:23'),(3845,142,1,9419,'5.99','2005-07-30 21:04:59','2006-02-15 22:13:23'),(3846,142,2,10934,'5.99','2005-08-02 02:52:18','2006-02-15 22:13:23'),(3847,142,2,11244,'5.99','2005-08-02 13:33:24','2006-02-15 22:13:23'),(3848,142,1,12964,'0.99','2005-08-19 06:29:13','2006-02-15 22:13:23'),(3849,142,1,13044,'0.99','2005-08-19 09:14:31','2006-02-15 22:13:23'),(3850,142,2,13745,'0.99','2005-08-20 10:53:49','2006-02-15 22:13:23'),(3851,142,1,13959,'0.99','2005-08-20 18:16:21','2006-02-15 22:13:23'),(3852,142,2,14116,'4.99','2005-08-21 01:11:17','2006-02-15 22:13:23'),(3853,142,2,14813,'0.99','2005-08-22 01:11:37','2006-02-15 22:13:23'),(3854,142,2,15333,'2.99','2005-08-22 20:44:06','2006-02-15 22:13:23'),(3855,142,1,15477,'1.99','2005-08-23 01:46:35','2006-02-15 22:13:23'),(3856,142,1,15454,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:23'),(3857,143,1,221,'2.99','2005-05-26 10:14:09','2006-02-15 22:13:23'),(3858,143,1,312,'2.99','2005-05-26 22:52:19','2006-02-15 22:13:23'),(3859,143,2,1898,'1.99','2005-06-17 04:28:11','2006-02-15 22:13:23'),(3860,143,1,1942,'4.99','2005-06-17 07:43:39','2006-02-15 22:13:23'),(3861,143,2,2251,'3.99','2005-06-18 05:05:08','2006-02-15 22:13:24'),(3862,143,1,2574,'0.99','2005-06-19 04:23:52','2006-02-15 22:13:24'),(3863,143,1,2588,'4.99','2005-06-19 05:20:31','2006-02-15 22:13:24'),(3864,143,1,4031,'7.99','2005-07-07 02:32:07','2006-02-15 22:13:24'),(3865,143,2,4221,'0.99','2005-07-07 12:18:57','2006-02-15 22:13:24'),(3866,143,1,4585,'7.99','2005-07-08 06:11:58','2006-02-15 22:13:24'),(3867,143,2,6076,'6.99','2005-07-11 05:05:30','2006-02-15 22:13:24'),(3868,143,2,6207,'4.99','2005-07-11 12:34:24','2006-02-15 22:13:24'),(3869,143,1,8312,'0.99','2005-07-29 03:32:38','2006-02-15 22:13:24'),(3870,143,1,8335,'0.99','2005-07-29 04:18:25','2006-02-15 22:13:24'),(3871,143,2,9889,'1.99','2005-07-31 14:02:50','2006-02-15 22:13:24'),(3872,143,1,10118,'0.99','2005-07-31 21:16:31','2006-02-15 22:13:24'),(3873,143,1,11278,'6.99','2005-08-02 14:29:43','2006-02-15 22:13:24'),(3874,143,2,11651,'6.99','2005-08-17 05:02:25','2006-02-15 22:13:24'),(3875,143,1,12408,'2.99','2005-08-18 09:40:38','2006-02-15 22:13:24'),(3876,143,2,13835,'4.99','2005-08-20 14:06:33','2006-02-15 22:13:24'),(3877,143,1,15250,'5.99','2005-08-22 18:03:11','2006-02-15 22:13:24'),(3878,143,1,16029,'4.99','2005-08-23 21:54:02','2006-02-15 22:13:24'),(3879,144,1,323,'2.99','2005-05-27 00:49:27','2006-02-15 22:13:24'),(3880,144,2,345,'2.99','2005-05-27 04:32:25','2006-02-15 22:13:24'),(3881,144,1,1814,'5.99','2005-06-16 21:15:22','2006-02-15 22:13:24'),(3882,144,1,1943,'0.99','2005-06-17 07:49:17','2006-02-15 22:13:24'),(3883,144,1,2756,'4.99','2005-06-19 16:57:42','2006-02-15 22:13:24'),(3884,144,2,3019,'4.99','2005-06-20 11:11:52','2006-02-15 22:13:24'),(3885,144,1,3145,'2.99','2005-06-20 20:21:17','2006-02-15 22:13:24'),(3886,144,1,3321,'2.99','2005-06-21 08:33:26','2006-02-15 22:13:24'),(3887,144,1,4726,'6.99','2005-07-08 12:50:54','2006-02-15 22:13:24'),(3888,144,2,4818,'3.99','2005-07-08 17:18:22','2006-02-15 22:13:24'),(3889,144,2,5049,'0.99','2005-07-09 03:54:12','2006-02-15 22:13:24'),(3890,144,2,5374,'8.99','2005-07-09 18:52:08','2006-02-15 22:13:24'),(3891,144,2,5408,'7.99','2005-07-09 20:16:51','2006-02-15 22:13:24'),(3892,144,2,5526,'7.99','2005-07-10 02:04:03','2006-02-15 22:13:24'),(3893,144,2,6614,'7.99','2005-07-12 08:33:49','2006-02-15 22:13:24'),(3894,144,2,6791,'9.99','2005-07-12 16:35:07','2006-02-15 22:13:24'),(3895,144,2,7378,'5.99','2005-07-27 15:31:33','2006-02-15 22:13:24'),(3896,144,2,7566,'2.99','2005-07-27 22:34:45','2006-02-15 22:13:24'),(3897,144,1,7830,'0.99','2005-07-28 08:43:49','2006-02-15 22:13:24'),(3898,144,1,7858,'3.99','2005-07-28 09:50:18','2006-02-15 22:13:24'),(3899,144,2,8459,'5.99','2005-07-29 08:05:40','2006-02-15 22:13:24'),(3900,144,1,8983,'0.99','2005-07-30 04:31:08','2006-02-15 22:13:24'),(3901,144,1,9034,'7.99','2005-07-30 06:10:58','2006-02-15 22:13:24'),(3902,144,1,9098,'3.99','2005-07-30 08:44:21','2006-02-15 22:13:25'),(3903,144,2,9174,'4.99','2005-07-30 11:42:10','2006-02-15 22:13:25'),(3904,144,2,9714,'0.99','2005-07-31 08:15:32','2006-02-15 22:13:25'),(3905,144,1,10302,'0.99','2005-08-01 04:12:08','2006-02-15 22:13:25'),(3906,144,1,10593,'4.99','2005-08-01 14:13:19','2006-02-15 22:13:25'),(3907,144,1,10740,'5.99','2005-08-01 19:50:32','2006-02-15 22:13:25'),(3908,144,1,10951,'4.99','2005-08-02 03:26:35','2006-02-15 22:13:25'),(3909,144,1,11228,'2.99','2005-08-02 12:55:23','2006-02-15 22:13:25'),(3910,144,2,11476,'6.99','2005-08-02 22:03:47','2006-02-15 22:13:25'),(3911,144,1,11534,'7.99','2005-08-17 00:35:27','2006-02-15 22:13:25'),(3912,144,1,11859,'4.99','2005-08-17 13:51:20','2006-02-15 22:13:25'),(3913,144,2,12087,'2.99','2005-08-17 22:20:12','2006-02-15 22:13:25'),(3914,144,2,12733,'2.99','2005-08-18 21:59:00','2006-02-15 22:13:25'),(3915,144,1,12858,'3.99','2005-08-19 02:22:16','2006-02-15 22:13:25'),(3916,144,2,12980,'6.99','2005-08-19 07:03:14','2006-02-15 22:13:25'),(3917,144,2,13881,'2.99','2005-08-20 15:18:55','2006-02-15 22:13:25'),(3918,144,2,14159,'2.99','2005-08-21 02:45:58','2006-02-15 22:13:25'),(3919,144,1,15017,'1.99','2005-08-22 08:47:44','2006-02-15 22:13:25'),(3920,144,1,15753,'7.99','2005-08-23 12:43:30','2006-02-15 22:13:25'),(3921,145,1,500,'0.99','2005-05-28 01:05:25','2006-02-15 22:13:25'),(3922,145,2,2271,'4.99','2005-06-18 06:29:52','2006-02-15 22:13:25'),(3923,145,2,2614,'0.99','2005-06-19 07:28:11','2006-02-15 22:13:25'),(3924,145,1,3647,'5.99','2005-07-06 07:29:17','2006-02-15 22:13:25'),(3925,145,2,4201,'8.99','2005-07-07 11:19:51','2006-02-15 22:13:25'),(3926,145,1,4364,'4.99','2005-07-07 19:46:51','2006-02-15 22:13:25'),(3927,145,2,4405,'6.99','2005-07-07 21:33:16','2006-02-15 22:13:26'),(3928,145,1,4470,'2.99','2005-07-08 00:20:57','2006-02-15 22:13:26'),(3929,145,2,4817,'2.99','2005-07-08 17:17:31','2006-02-15 22:13:26'),(3930,145,2,6056,'2.99','2005-07-11 04:01:27','2006-02-15 22:13:26'),(3931,145,1,6339,'1.99','2005-07-11 19:45:32','2006-02-15 22:13:26'),(3932,145,2,6378,'0.99','2005-07-11 21:45:23','2006-02-15 22:13:26'),(3933,145,2,7061,'2.99','2005-07-27 03:51:10','2006-02-15 22:13:26'),(3934,145,1,7529,'7.99','2005-07-27 21:18:08','2006-02-15 22:13:26'),(3935,145,2,7954,'0.99','2005-07-28 13:25:05','2006-02-15 22:13:26'),(3936,145,1,8380,'0.99','2005-07-29 05:31:29','2006-02-15 22:13:26'),(3937,145,1,9156,'2.99','2005-07-30 11:04:55','2006-02-15 22:13:26'),(3938,145,2,9576,'0.99','2005-07-31 02:52:59','2006-02-15 22:13:26'),(3939,145,2,10799,'4.99','2005-08-01 22:03:31','2006-02-15 22:13:26'),(3940,145,2,11904,'5.99','2005-08-17 15:39:26','2006-02-15 22:13:26'),(3941,145,2,11954,'2.99','2005-08-17 17:18:36','2006-02-15 22:13:26'),(3942,145,1,12637,'2.99','2005-08-18 18:06:53','2006-02-15 22:13:26'),(3943,145,2,12785,'2.99','2005-08-19 00:05:49','2006-02-15 22:13:26'),(3944,145,2,13012,'7.99','2005-08-19 07:54:59','2006-02-15 22:13:26'),(3945,145,1,13164,'3.99','2005-08-19 13:30:55','2006-02-15 22:13:26'),(3946,145,2,13272,'0.99','2005-08-19 17:49:13','2006-02-15 22:13:26'),(3947,145,2,14044,'5.99','2005-08-20 21:48:38','2006-02-15 22:13:26'),(3948,145,2,14389,'6.99','2005-08-21 10:15:20','2006-02-15 22:13:26'),(3949,146,2,762,'7.99','2005-05-29 11:15:51','2006-02-15 22:13:26'),(3950,146,1,1073,'4.99','2005-05-31 09:55:04','2006-02-15 22:13:26'),(3951,146,2,1209,'7.99','2005-06-15 02:31:12','2006-02-15 22:13:26'),(3952,146,2,1724,'1.99','2005-06-16 15:15:43','2006-02-15 22:13:26'),(3953,146,2,2099,'2.99','2005-06-17 18:47:26','2006-02-15 22:13:26'),(3954,146,1,2242,'3.99','2005-06-18 04:32:28','2006-02-15 22:13:26'),(3955,146,1,2342,'2.99','2005-06-18 11:42:40','2006-02-15 22:13:26'),(3956,146,1,2800,'0.99','2005-06-19 19:15:56','2006-02-15 22:13:26'),(3957,146,1,3131,'4.99','2005-06-20 19:08:00','2006-02-15 22:13:26'),(3958,146,1,4849,'6.99','2005-07-08 18:34:34','2006-02-15 22:13:26'),(3959,146,2,5000,'4.99','2005-07-09 01:16:13','2006-02-15 22:13:26'),(3960,146,1,6102,'7.99','2005-07-11 06:53:09','2006-02-15 22:13:26'),(3961,146,2,6184,'6.99','2005-07-11 11:19:21','2006-02-15 22:13:26'),(3962,146,1,6327,'4.99','2005-07-11 19:07:29','2006-02-15 22:13:26'),(3963,146,1,6990,'0.99','2005-07-27 01:02:46','2006-02-15 22:13:26'),(3964,146,2,8246,'3.99','2005-07-29 00:38:41','2006-02-15 22:13:26'),(3965,146,2,11173,'7.99','2005-08-02 10:28:00','2006-02-15 22:13:26'),(3966,146,1,11221,'2.99','2005-08-02 12:32:12','2006-02-15 22:13:26'),(3967,146,2,11370,'0.99','2005-08-02 18:06:01','2006-02-15 22:13:26'),(3968,146,2,11392,'5.99','2005-08-02 18:41:11','2006-02-15 22:13:26'),(3969,146,1,11573,'4.99','2005-08-17 01:38:18','2006-02-15 22:13:27'),(3970,146,1,11857,'4.99','2005-08-17 13:48:30','2006-02-15 22:13:27'),(3971,146,1,12129,'7.99','2005-08-17 23:31:25','2006-02-15 22:13:27'),(3972,146,1,12385,'2.99','2005-08-18 08:39:33','2006-02-15 22:13:27'),(3973,146,1,12888,'4.99','2005-08-19 03:41:09','2006-02-15 22:13:27'),(3974,146,1,13606,'4.99','2005-08-20 06:07:01','2006-02-15 22:13:27'),(3975,146,2,13829,'4.99','2005-08-20 13:50:17','2006-02-15 22:13:27'),(3976,146,2,14143,'2.99','2005-08-21 02:10:32','2006-02-15 22:13:27'),(3977,146,1,15842,'6.99','2005-08-23 15:36:05','2006-02-15 22:13:27'),(3978,147,1,362,'0.99','2005-05-27 07:10:25','2006-02-15 22:13:27'),(3979,147,1,509,'0.99','2005-05-28 02:51:12','2006-02-15 22:13:27'),(3980,147,1,2171,'0.99','2005-06-18 00:06:04','2006-02-15 22:13:27'),(3981,147,1,2456,'6.99','2005-06-18 19:36:50','2006-02-15 22:13:27'),(3982,147,2,2859,'2.99','2005-06-19 23:18:42','2006-02-15 22:13:27'),(3983,147,2,3011,'5.99','2005-06-20 10:39:10','2006-02-15 22:13:27'),(3984,147,2,3919,'7.99','2005-07-06 20:26:21','2006-02-15 22:13:27'),(3985,147,2,3956,'2.99','2005-07-06 22:01:51','2006-02-15 22:13:27'),(3986,147,2,4792,'0.99','2005-07-08 16:29:38','2006-02-15 22:13:27'),(3987,147,2,5044,'0.99','2005-07-09 03:30:25','2006-02-15 22:13:27'),(3988,147,1,5567,'2.99','2005-07-10 03:36:46','2006-02-15 22:13:27'),(3989,147,1,5844,'0.99','2005-07-10 17:14:43','2006-02-15 22:13:27'),(3990,147,2,6343,'0.99','2005-07-11 19:51:35','2006-02-15 22:13:27'),(3991,147,2,6469,'4.99','2005-07-12 01:29:27','2006-02-15 22:13:27'),(3992,147,2,6753,'2.99','2005-07-12 14:55:42','2006-02-15 22:13:27'),(3993,147,2,7044,'0.99','2005-07-27 03:27:29','2006-02-15 22:13:27'),(3994,147,1,7723,'0.99','2005-07-28 04:45:37','2006-02-15 22:13:27'),(3995,147,1,8893,'2.99','2005-07-30 00:48:19','2006-02-15 22:13:27'),(3996,147,2,9772,'0.99','2005-07-31 09:56:07','2006-02-15 22:13:27'),(3997,147,1,10706,'7.99','2005-08-01 18:41:28','2006-02-15 22:13:27'),(3998,147,2,10752,'8.99','2005-08-01 20:08:49','2006-02-15 22:13:27'),(3999,147,1,12284,'4.99','2005-08-18 04:55:49','2006-02-15 22:13:27'),(4000,147,1,12757,'4.99','2005-08-18 22:57:45','2006-02-15 22:13:27'),(4001,147,2,13542,'4.99','2005-08-20 03:41:57','2006-02-15 22:13:27'),(4002,147,2,13670,'3.99','2005-08-20 08:27:01','2006-02-15 22:13:27'),(4003,147,2,14021,'4.99','2005-08-20 21:02:12','2006-02-15 22:13:27'),(4004,147,1,14156,'0.99','2005-08-21 02:35:16','2006-02-15 22:13:27'),(4005,147,2,14641,'0.99','2005-08-21 19:05:23','2006-02-15 22:13:27'),(4006,147,2,14960,'4.99','2005-08-22 06:31:36','2006-02-15 22:13:27'),(4007,147,1,15052,'2.99','2005-08-22 10:09:19','2006-02-15 22:13:27'),(4008,147,2,15331,'4.99','2005-08-22 20:37:57','2006-02-15 22:13:28'),(4009,147,2,15513,'4.99','2005-08-23 03:01:56','2006-02-15 22:13:28'),(4010,147,1,15730,'8.99','2005-08-23 11:32:35','2006-02-15 22:13:28'),(4011,147,2,16004,'6.99','2005-08-23 20:53:20','2006-02-15 22:13:28'),(4012,148,1,682,'4.99','2005-05-28 23:53:18','2006-02-15 22:13:28'),(4013,148,1,1501,'1.99','2005-06-15 22:02:35','2006-02-15 22:13:28'),(4014,148,2,1517,'6.99','2005-06-15 23:20:26','2006-02-15 22:13:28'),(4015,148,2,2751,'3.99','2005-06-19 16:39:23','2006-02-15 22:13:28'),(4016,148,2,2843,'3.99','2005-06-19 22:36:39','2006-02-15 22:13:28'),(4017,148,2,2847,'5.99','2005-06-19 22:54:01','2006-02-15 22:13:28'),(4018,148,1,3653,'0.99','2005-07-06 07:45:13','2006-02-15 22:13:28'),(4019,148,1,4080,'0.99','2005-07-07 05:09:54','2006-02-15 22:13:28'),(4020,148,1,4746,'2.99','2005-07-08 13:47:55','2006-02-15 22:13:28'),(4021,148,1,4950,'2.99','2005-07-08 22:58:07','2006-02-15 22:13:28'),(4022,148,1,5034,'4.99','2005-07-09 02:48:15','2006-02-15 22:13:28'),(4023,148,1,5372,'4.99','2005-07-09 18:48:39','2006-02-15 22:13:28'),(4024,148,1,6169,'1.99','2005-07-11 10:25:56','2006-02-15 22:13:28'),(4025,148,1,6640,'8.99','2005-07-12 10:27:19','2006-02-15 22:13:28'),(4026,148,2,6793,'10.99','2005-07-12 16:37:55','2006-02-15 22:13:28'),(4027,148,1,7656,'0.99','2005-07-28 02:07:19','2006-02-15 22:13:28'),(4028,148,2,7693,'4.99','2005-07-28 03:31:22','2006-02-15 22:13:28'),(4029,148,1,7865,'9.99','2005-07-28 10:07:04','2006-02-15 22:13:28'),(4030,148,2,8111,'4.99','2005-07-28 19:10:03','2006-02-15 22:13:28'),(4031,148,2,8331,'3.99','2005-07-29 04:13:29','2006-02-15 22:13:28'),(4032,148,1,8394,'4.99','2005-07-29 06:02:14','2006-02-15 22:13:28'),(4033,148,2,8578,'4.99','2005-07-29 11:58:14','2006-02-15 22:13:28'),(4034,148,2,8626,'4.99','2005-07-29 14:03:20','2006-02-15 22:13:28'),(4035,148,1,9023,'5.99','2005-07-30 05:36:40','2006-02-15 22:13:28'),(4036,148,1,9106,'2.99','2005-07-30 08:52:34','2006-02-15 22:13:28'),(4037,148,1,9530,'1.99','2005-07-31 01:09:06','2006-02-15 22:13:28'),(4038,148,1,9594,'4.99','2005-07-31 03:23:52','2006-02-15 22:13:28'),(4039,148,2,10067,'4.99','2005-07-31 19:37:58','2006-02-15 22:13:28'),(4040,148,2,10830,'6.99','2005-08-01 23:18:06','2006-02-15 22:13:28'),(4041,148,1,11357,'10.99','2005-08-02 17:42:49','2006-02-15 22:13:28'),(4042,148,1,12029,'2.99','2005-08-17 20:07:01','2006-02-15 22:13:28'),(4043,148,2,12038,'0.99','2005-08-17 20:28:26','2006-02-15 22:13:28'),(4044,148,2,12512,'3.99','2005-08-18 13:28:27','2006-02-15 22:13:28'),(4045,148,1,12944,'6.99','2005-08-19 05:48:12','2006-02-15 22:13:28'),(4046,148,1,12983,'6.99','2005-08-19 07:06:51','2006-02-15 22:13:29'),(4047,148,1,14055,'0.99','2005-08-20 22:18:00','2006-02-15 22:13:29'),(4048,148,1,14155,'4.99','2005-08-21 02:31:35','2006-02-15 22:13:29'),(4049,148,2,14184,'6.99','2005-08-21 03:24:50','2006-02-15 22:13:29'),(4050,148,2,14629,'2.99','2005-08-21 18:39:52','2006-02-15 22:13:29'),(4051,148,2,14713,'0.99','2005-08-21 21:27:24','2006-02-15 22:13:29'),(4052,148,2,14879,'5.99','2005-08-22 03:42:12','2006-02-15 22:13:29'),(4053,148,2,14965,'2.99','2005-08-22 06:45:53','2006-02-15 22:13:29'),(4054,148,2,15237,'4.99','2005-08-22 17:44:30','2006-02-15 22:13:29'),(4055,148,2,15379,'8.99','2005-08-22 22:26:13','2006-02-15 22:13:29'),(4056,148,1,15541,'3.99','2005-08-23 04:13:53','2006-02-15 22:13:29'),(4057,148,2,15586,'3.99','2005-08-23 05:57:04','2006-02-15 22:13:29'),(4058,149,1,764,'4.99','2005-05-29 11:37:35','2006-02-15 22:13:29'),(4059,149,2,1521,'2.99','2005-06-15 23:58:53','2006-02-15 22:13:29'),(4060,149,1,1800,'2.99','2005-06-16 20:18:46','2006-02-15 22:13:29'),(4061,149,2,1996,'6.99','2005-06-17 11:17:45','2006-02-15 22:13:29'),(4062,149,2,2194,'4.99','2005-06-18 01:41:37','2006-02-15 22:13:29'),(4063,149,1,2305,'5.99','2005-06-18 08:31:18','2006-02-15 22:13:29'),(4064,149,2,2383,'7.99','2005-06-18 15:17:59','2006-02-15 22:13:29'),(4065,149,1,2752,'0.99','2005-06-19 16:44:18','2006-02-15 22:13:29'),(4066,149,1,3894,'2.99','2005-07-06 19:01:39','2006-02-15 22:13:29'),(4067,149,1,3939,'6.99','2005-07-06 21:16:32','2006-02-15 22:13:29'),(4068,149,1,4766,'3.99','2005-07-08 15:16:04','2006-02-15 22:13:29'),(4069,149,1,4837,'0.99','2005-07-08 18:09:12','2006-02-15 22:13:29'),(4070,149,1,5091,'2.99','2005-07-09 05:52:54','2006-02-15 22:13:29'),(4071,149,1,5298,'10.99','2005-07-09 15:36:17','2006-02-15 22:13:29'),(4072,149,1,6356,'4.99','2005-07-11 20:57:48','2006-02-15 22:13:29'),(4073,149,2,6940,'5.99','2005-07-26 23:18:35','2006-02-15 22:13:29'),(4074,149,2,7559,'4.99','2005-07-27 22:20:03','2006-02-15 22:13:29'),(4075,149,1,7989,'6.99','2005-07-28 14:39:05','2006-02-15 22:13:29'),(4076,149,2,10154,'2.99','2005-07-31 22:30:49','2006-02-15 22:13:29'),(4077,149,2,10737,'7.99','2005-08-01 19:31:24','2006-02-15 22:13:29'),(4078,149,2,10967,'0.99','2005-08-02 04:02:16','2006-02-15 22:13:29'),(4079,149,1,11561,'2.99','2005-08-17 01:23:09','2006-02-15 22:13:29'),(4080,149,1,12000,'4.99','2005-08-17 18:49:44','2006-02-15 22:13:29'),(4081,149,1,14771,'3.99','2005-08-21 23:50:15','2006-02-15 22:13:29'),(4082,149,2,15479,'4.99','2005-08-23 01:50:53','2006-02-15 22:13:29'),(4083,149,2,15562,'2.99','2005-08-23 05:04:33','2006-02-15 22:13:29'),(4084,150,1,422,'3.99','2005-05-27 15:31:55','2006-02-15 22:13:29'),(4085,150,1,609,'2.99','2005-05-28 15:04:02','2006-02-15 22:13:29'),(4086,150,1,995,'3.99','2005-05-31 00:06:02','2006-02-15 22:13:29'),(4087,150,2,3187,'1.99','2005-06-20 23:06:07','2006-02-15 22:13:29'),(4088,150,1,3456,'5.99','2005-06-21 21:19:47','2006-02-15 22:13:29'),(4089,150,1,4271,'6.99','2005-07-07 14:38:52','2006-02-15 22:13:29'),(4090,150,1,6633,'2.99','2005-07-12 09:35:42','2006-02-15 22:13:29'),(4091,150,2,7690,'4.99','2005-07-28 03:26:21','2006-02-15 22:13:30'),(4092,150,1,9121,'2.99','2005-07-30 09:36:26','2006-02-15 22:13:30'),(4093,150,1,10686,'2.99','2005-08-01 17:51:21','2006-02-15 22:13:30'),(4094,150,2,11123,'2.99','2005-08-02 08:54:17','2006-02-15 22:13:30'),(4095,150,2,11789,'6.99','2005-08-17 10:59:24','2006-02-15 22:13:30'),(4096,150,2,12260,'6.99','2005-08-18 04:15:43','2006-02-15 22:13:30'),(4097,150,2,12335,'2.99','2005-08-18 06:59:15','2006-02-15 22:13:30'),(4098,150,2,12627,'2.99','2005-08-18 17:37:11','2006-02-15 22:13:30'),(4099,150,1,12887,'1.99','2005-08-19 03:38:54','2006-02-15 22:13:30'),(4100,150,2,12890,'0.99','2005-08-19 03:42:08','2006-02-15 22:13:30'),(4101,150,1,13116,'6.99','2005-08-19 11:31:41','2006-02-15 22:13:30'),(4102,150,2,13255,'8.99','2005-08-19 16:54:12','2006-02-15 22:13:30'),(4103,150,1,13372,'2.99','2005-08-19 21:23:19','2006-02-15 22:13:30'),(4104,150,2,13599,'5.99','2005-08-20 06:00:03','2006-02-15 22:13:30'),(4105,150,2,14165,'0.99','2005-08-21 02:59:17','2006-02-15 22:13:30'),(4106,150,2,14454,'2.99','2005-08-21 12:35:49','2006-02-15 22:13:30'),(4107,150,2,14520,'9.99','2005-08-21 15:00:49','2006-02-15 22:13:30'),(4108,150,1,14663,'0.99','2005-08-21 19:47:55','2006-02-15 22:13:30'),(4109,151,2,164,'4.99','2005-05-26 02:26:49','2006-02-15 22:13:30'),(4110,151,2,418,'5.99','2005-05-27 15:13:17','2006-02-15 22:13:30'),(4111,151,2,2474,'2.99','2005-06-18 20:51:34','2006-02-15 22:13:30'),(4112,151,2,2947,'2.99','2005-06-20 06:00:21','2006-02-15 22:13:30'),(4113,151,1,3017,'3.99','2005-06-20 11:08:56','2006-02-15 22:13:30'),(4114,151,2,3089,'0.99','2005-06-20 15:57:01','2006-02-15 22:13:30'),(4115,151,2,3390,'2.99','2005-06-21 15:10:50','2006-02-15 22:13:30'),(4116,151,1,4376,'2.99','2005-07-07 20:24:33','2006-02-15 22:13:30'),(4117,151,2,6720,'0.99','2005-07-12 13:41:16','2006-02-15 22:13:30'),(4118,151,2,6768,'3.99','2005-07-12 15:47:51','2006-02-15 22:13:30'),(4119,151,2,6854,'0.99','2005-07-12 19:38:57','2006-02-15 22:13:30'),(4120,151,1,7189,'0.99','2005-07-27 08:35:02','2006-02-15 22:13:30'),(4121,151,2,7332,'3.99','2005-07-27 13:58:57','2006-02-15 22:13:30'),(4122,151,1,9253,'4.99','2005-07-30 14:20:12','2006-02-15 22:13:30'),(4123,151,1,9890,'4.99','2005-07-31 14:04:44','2006-02-15 22:13:30'),(4124,151,1,9969,'2.99','2005-07-31 16:38:12','2006-02-15 22:13:30'),(4125,151,1,10078,'2.99','2005-07-31 20:02:02','2006-02-15 22:13:30'),(4126,151,1,10311,'4.99','2005-08-01 04:27:59','2006-02-15 22:13:30'),(4127,151,1,10662,'2.99','2005-08-01 16:50:57','2006-02-15 22:13:30'),(4128,151,2,11714,'2.99','2005-08-17 07:34:55','2006-02-15 22:13:30'),(4129,151,2,13230,'0.99','2005-08-19 16:12:07','2006-02-15 22:13:30'),(4130,151,1,13568,'5.99','2005-08-20 05:02:46','2006-02-15 22:13:30'),(4131,151,1,14856,'4.99','2005-08-22 02:31:51','2006-02-15 22:13:30'),(4132,151,2,14922,'3.99','2005-08-22 05:13:05','2006-02-15 22:13:30'),(4133,151,1,15227,'4.99','2005-08-22 17:22:41','2006-02-15 22:13:30'),(4134,151,1,15926,'2.99','2005-08-23 18:20:56','2006-02-15 22:13:31'),(4135,151,2,15996,'2.99','2005-08-23 20:31:38','2006-02-15 22:13:31'),(4136,152,2,359,'4.99','2005-05-27 06:48:33','2006-02-15 22:13:31'),(4137,152,1,745,'4.99','2005-05-29 09:22:57','2006-02-15 22:13:31'),(4138,152,1,2882,'4.99','2005-06-20 01:26:26','2006-02-15 22:13:31'),(4139,152,2,3577,'2.99','2005-07-06 03:40:36','2006-02-15 22:13:31'),(4140,152,1,3786,'7.99','2005-07-06 14:00:41','2006-02-15 22:13:31'),(4141,152,1,4974,'4.99','2005-07-09 00:00:36','2006-02-15 22:13:31'),(4142,152,1,6273,'0.99','2005-07-11 16:08:41','2006-02-15 22:13:31'),(4143,152,1,6612,'2.99','2005-07-12 08:28:33','2006-02-15 22:13:31'),(4144,152,1,9010,'5.99','2005-07-30 05:12:04','2006-02-15 22:13:31'),(4145,152,1,10320,'6.99','2005-08-01 04:39:26','2006-02-15 22:13:31'),(4146,152,2,11638,'6.99','2005-08-17 04:39:09','2006-02-15 22:13:31'),(4147,152,2,11783,'0.99','2005-08-17 10:39:24','2006-02-15 22:13:31'),(4148,152,1,12697,'2.99','2005-08-18 20:14:56','2006-02-15 22:13:31'),(4149,152,1,12917,'4.99','2005-08-19 04:27:11','2006-02-15 22:13:31'),(4150,152,2,12960,'1.99','2005-08-19 06:21:52','2006-02-15 22:13:31'),(4151,152,1,13204,'4.99','2005-08-19 15:02:48','2006-02-15 22:13:31'),(4152,152,2,13484,'0.99','2005-08-20 01:16:52','2006-02-15 22:13:31'),(4153,152,1,13986,'0.99','2005-08-20 19:13:23','2006-02-15 22:13:31'),(4154,152,1,14173,'0.99','2005-08-21 03:01:01','2006-02-15 22:13:31'),(4155,152,2,14668,'4.99','2005-08-21 19:51:30','2006-02-15 22:13:31'),(4156,152,2,11848,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:31'),(4157,153,1,2224,'0.99','2005-06-18 03:33:58','2006-02-15 22:13:31'),(4158,153,1,2649,'0.99','2005-06-19 10:20:09','2006-02-15 22:13:31'),(4159,153,1,2893,'4.99','2005-06-20 02:22:08','2006-02-15 22:13:31'),(4160,153,1,2945,'5.99','2005-06-20 05:49:27','2006-02-15 22:13:31'),(4161,153,1,3795,'0.99','2005-07-06 14:37:41','2006-02-15 22:13:31'),(4162,153,1,3949,'0.99','2005-07-06 21:46:36','2006-02-15 22:13:31'),(4163,153,1,4194,'5.99','2005-07-07 10:59:39','2006-02-15 22:13:31'),(4164,153,2,4670,'5.99','2005-07-08 10:14:18','2006-02-15 22:13:31'),(4165,153,2,5676,'0.99','2005-07-10 08:38:32','2006-02-15 22:13:31'),(4166,153,2,5771,'0.99','2005-07-10 13:26:45','2006-02-15 22:13:31'),(4167,153,2,6818,'9.99','2005-07-12 18:20:54','2006-02-15 22:13:31'),(4168,153,2,7824,'7.99','2005-07-28 08:34:47','2006-02-15 22:13:31'),(4169,153,2,9936,'0.99','2005-07-31 15:27:41','2006-02-15 22:13:31'),(4170,153,2,10015,'4.99','2005-07-31 18:11:17','2006-02-15 22:13:31'),(4171,153,2,11368,'4.99','2005-08-02 18:03:05','2006-02-15 22:13:31'),(4172,153,1,12103,'1.99','2005-08-17 22:49:09','2006-02-15 22:13:31'),(4173,153,1,12439,'3.99','2005-08-18 10:44:57','2006-02-15 22:13:31'),(4174,153,1,12882,'4.99','2005-08-19 03:33:46','2006-02-15 22:13:31'),(4175,153,1,14664,'4.99','2005-08-21 19:48:47','2006-02-15 22:13:31'),(4176,153,1,14747,'4.99','2005-08-21 23:00:02','2006-02-15 22:13:31'),(4177,153,1,14944,'4.99','2005-08-22 06:01:26','2006-02-15 22:13:31'),(4178,153,2,15267,'0.99','2005-08-22 18:37:48','2006-02-15 22:13:31'),(4179,153,2,15444,'7.99','2005-08-23 00:46:52','2006-02-15 22:13:32'),(4180,153,1,15593,'1.99','2005-08-23 06:15:09','2006-02-15 22:13:32'),(4181,154,1,469,'5.99','2005-05-27 21:14:26','2006-02-15 22:13:32'),(4182,154,2,865,'7.99','2005-05-30 03:39:44','2006-02-15 22:13:32'),(4183,154,2,978,'5.99','2005-05-30 21:30:52','2006-02-15 22:13:32'),(4184,154,1,1963,'0.99','2005-06-17 09:09:31','2006-02-15 22:13:32'),(4185,154,1,2886,'4.99','2005-06-20 01:38:39','2006-02-15 22:13:32'),(4186,154,1,2985,'2.99','2005-06-20 08:45:08','2006-02-15 22:13:32'),(4187,154,2,3806,'7.99','2005-07-06 15:09:41','2006-02-15 22:13:32'),(4188,154,2,3912,'0.99','2005-07-06 20:10:03','2006-02-15 22:13:32'),(4189,154,2,4132,'4.99','2005-07-07 08:06:07','2006-02-15 22:13:32'),(4190,154,1,4252,'2.99','2005-07-07 14:13:05','2006-02-15 22:13:32'),(4191,154,1,4850,'5.99','2005-07-08 18:39:31','2006-02-15 22:13:32'),(4192,154,1,5101,'0.99','2005-07-09 06:21:29','2006-02-15 22:13:32'),(4193,154,2,5760,'2.99','2005-07-10 12:44:48','2006-02-15 22:13:32'),(4194,154,1,6048,'0.99','2005-07-11 03:32:23','2006-02-15 22:13:32'),(4195,154,2,6993,'4.99','2005-07-27 01:05:24','2006-02-15 22:13:32'),(4196,154,1,7055,'4.99','2005-07-27 03:45:42','2006-02-15 22:13:32'),(4197,154,1,7156,'4.99','2005-07-27 07:19:34','2006-02-15 22:13:32'),(4198,154,2,7900,'1.99','2005-07-28 11:11:33','2006-02-15 22:13:32'),(4199,154,2,8334,'7.99','2005-07-29 04:18:25','2006-02-15 22:13:32'),(4200,154,2,9286,'2.99','2005-07-30 15:32:28','2006-02-15 22:13:32'),(4201,154,1,10278,'6.99','2005-08-01 03:25:27','2006-02-15 22:13:32'),(4202,154,1,10851,'4.99','2005-08-01 23:58:45','2006-02-15 22:13:32'),(4203,154,1,11296,'5.99','2005-08-02 15:15:27','2006-02-15 22:13:32'),(4204,154,1,12341,'0.99','2005-08-18 07:09:27','2006-02-15 22:13:32'),(4205,154,2,13861,'4.99','2005-08-20 14:56:53','2006-02-15 22:13:32'),(4206,154,2,14731,'2.99','2005-08-21 22:21:49','2006-02-15 22:13:32'),(4207,154,2,14793,'7.99','2005-08-22 00:37:57','2006-02-15 22:13:32'),(4208,154,1,14918,'6.99','2005-08-22 05:06:38','2006-02-15 22:13:32'),(4209,154,1,15351,'0.99','2005-08-22 21:15:46','2006-02-15 22:13:32'),(4210,154,1,15721,'2.99','2005-08-23 11:16:16','2006-02-15 22:13:32'),(4211,155,1,568,'2.99','2005-05-28 09:57:36','2006-02-15 22:13:32'),(4212,155,2,1519,'1.99','2005-06-15 23:55:27','2006-02-15 22:13:32'),(4213,155,1,1554,'7.99','2005-06-16 02:16:47','2006-02-15 22:13:32'),(4214,155,1,2028,'7.99','2005-06-17 13:08:08','2006-02-15 22:13:32'),(4215,155,1,2869,'4.99','2005-06-20 00:09:25','2006-02-15 22:13:32'),(4216,155,2,3405,'4.99','2005-06-21 15:58:25','2006-02-15 22:13:32'),(4217,155,1,5128,'1.99','2005-07-09 07:25:54','2006-02-15 22:13:32'),(4218,155,1,6066,'5.99','2005-07-11 04:32:42','2006-02-15 22:13:32'),(4219,155,1,6085,'4.99','2005-07-11 05:24:36','2006-02-15 22:13:32'),(4220,155,2,6087,'4.99','2005-07-11 05:29:22','2006-02-15 22:13:32'),(4221,155,1,6443,'2.99','2005-07-12 00:35:51','2006-02-15 22:13:32'),(4222,155,1,7077,'3.99','2005-07-27 04:13:02','2006-02-15 22:13:33'),(4223,155,1,7492,'2.99','2005-07-27 19:54:18','2006-02-15 22:13:33'),(4224,155,2,7730,'5.99','2005-07-28 04:59:48','2006-02-15 22:13:33'),(4225,155,2,9781,'7.99','2005-07-31 10:13:02','2006-02-15 22:13:33'),(4226,155,1,10098,'0.99','2005-07-31 20:41:17','2006-02-15 22:13:33'),(4227,155,1,11033,'4.99','2005-08-02 05:54:17','2006-02-15 22:13:33'),(4228,155,2,11951,'5.99','2005-08-17 17:14:02','2006-02-15 22:13:33'),(4229,155,1,14324,'8.99','2005-08-21 08:10:56','2006-02-15 22:13:33'),(4230,155,2,14549,'2.99','2005-08-21 15:54:21','2006-02-15 22:13:33'),(4231,155,1,14753,'2.99','2005-08-21 23:11:43','2006-02-15 22:13:33'),(4232,155,2,14909,'0.99','2005-08-22 04:48:44','2006-02-15 22:13:33'),(4233,155,1,15106,'0.99','2005-08-22 12:01:48','2006-02-15 22:13:33'),(4234,155,2,11496,'7.98','2006-02-14 15:16:03','2006-02-15 22:13:33'),(4235,155,1,12352,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:33'),(4236,156,2,899,'6.99','2005-05-30 09:29:30','2006-02-15 22:13:33'),(4237,156,1,1052,'4.99','2005-05-31 07:07:03','2006-02-15 22:13:33'),(4238,156,2,2089,'9.99','2005-06-17 17:45:09','2006-02-15 22:13:33'),(4239,156,2,2221,'0.99','2005-06-18 03:24:56','2006-02-15 22:13:33'),(4240,156,1,2658,'4.99','2005-06-19 10:43:42','2006-02-15 22:13:33'),(4241,156,1,2782,'0.99','2005-06-19 18:25:07','2006-02-15 22:13:33'),(4242,156,2,4394,'2.99','2005-07-07 21:12:45','2006-02-15 22:13:33'),(4243,156,2,5534,'4.99','2005-07-10 02:26:49','2006-02-15 22:13:33'),(4244,156,1,5828,'2.99','2005-07-10 16:27:25','2006-02-15 22:13:33'),(4245,156,2,5908,'0.99','2005-07-10 20:44:14','2006-02-15 22:13:33'),(4246,156,2,6540,'6.99','2005-07-12 04:51:13','2006-02-15 22:13:33'),(4247,156,2,7389,'2.99','2005-07-27 15:56:15','2006-02-15 22:13:33'),(4248,156,2,7822,'4.99','2005-07-28 08:31:45','2006-02-15 22:13:33'),(4249,156,1,9409,'6.99','2005-07-30 20:33:53','2006-02-15 22:13:33'),(4250,156,1,9696,'0.99','2005-07-31 07:13:46','2006-02-15 22:13:33'),(4251,156,2,10309,'6.99','2005-08-01 04:24:18','2006-02-15 22:13:33'),(4252,156,2,11490,'2.99','2005-08-02 22:36:00','2006-02-15 22:13:33'),(4253,156,1,11587,'5.99','2005-08-17 02:21:03','2006-02-15 22:13:33'),(4254,156,2,13530,'0.99','2005-08-20 03:12:43','2006-02-15 22:13:33'),(4255,156,2,13531,'2.99','2005-08-20 03:26:10','2006-02-15 22:13:33'),(4256,156,2,13802,'2.99','2005-08-20 12:44:53','2006-02-15 22:13:33'),(4257,156,1,14794,'1.99','2005-08-22 00:39:31','2006-02-15 22:13:33'),(4258,156,2,14831,'4.99','2005-08-22 01:40:49','2006-02-15 22:13:33'),(4259,156,1,14914,'0.99','2005-08-22 04:53:35','2006-02-15 22:13:33'),(4260,156,1,15408,'6.99','2005-08-22 23:26:32','2006-02-15 22:13:33'),(4261,157,2,352,'0.99','2005-05-27 05:48:19','2006-02-15 22:13:33'),(4262,157,1,642,'4.99','2005-05-28 18:49:12','2006-02-15 22:13:33'),(4263,157,2,2340,'0.99','2005-06-18 11:30:56','2006-02-15 22:13:33'),(4264,157,1,3739,'0.99','2005-07-06 11:54:18','2006-02-15 22:13:33'),(4265,157,1,4253,'5.99','2005-07-07 14:13:13','2006-02-15 22:13:33'),(4266,157,2,4435,'3.99','2005-07-07 22:51:04','2006-02-15 22:13:34'),(4267,157,1,4919,'0.99','2005-07-08 21:41:54','2006-02-15 22:13:34'),(4268,157,1,5862,'4.99','2005-07-10 18:20:48','2006-02-15 22:13:34'),(4269,157,1,7110,'2.99','2005-07-27 05:30:48','2006-02-15 22:13:34'),(4270,157,2,7195,'2.99','2005-07-27 08:47:01','2006-02-15 22:13:34'),(4271,157,2,7499,'4.99','2005-07-27 20:10:28','2006-02-15 22:13:34'),(4272,157,2,8163,'0.99','2005-07-28 21:11:48','2006-02-15 22:13:34'),(4273,157,2,8337,'0.99','2005-07-29 04:31:55','2006-02-15 22:13:34'),(4274,157,2,8347,'0.99','2005-07-29 04:49:25','2006-02-15 22:13:34'),(4275,157,2,8576,'4.99','2005-07-29 11:55:01','2006-02-15 22:13:34'),(4276,157,1,8707,'0.99','2005-07-29 17:21:58','2006-02-15 22:13:34'),(4277,157,1,8827,'4.99','2005-07-29 22:31:24','2006-02-15 22:13:34'),(4278,157,2,9237,'2.99','2005-07-30 13:48:17','2006-02-15 22:13:34'),(4279,157,2,9264,'4.99','2005-07-30 14:51:36','2006-02-15 22:13:34'),(4280,157,1,9958,'2.99','2005-07-31 16:03:56','2006-02-15 22:13:34'),(4281,157,1,10203,'4.99','2005-08-01 00:45:27','2006-02-15 22:13:34'),(4282,157,2,11249,'4.99','2005-08-02 13:35:40','2006-02-15 22:13:34'),(4283,157,2,11335,'4.99','2005-08-02 16:57:37','2006-02-15 22:13:34'),(4284,157,1,12213,'5.99','2005-08-18 02:33:55','2006-02-15 22:13:34'),(4285,157,1,12464,'6.99','2005-08-18 11:33:34','2006-02-15 22:13:34'),(4286,157,1,12916,'0.99','2005-08-19 04:27:05','2006-02-15 22:13:34'),(4287,157,1,13097,'4.99','2005-08-19 10:50:43','2006-02-15 22:13:34'),(4288,157,1,13214,'4.99','2005-08-19 15:31:06','2006-02-15 22:13:34'),(4289,157,1,13481,'6.99','2005-08-20 01:11:12','2006-02-15 22:13:34'),(4290,157,1,13728,'2.99','2005-08-20 10:11:07','2006-02-15 22:13:34'),(4291,157,2,14974,'4.99','2005-08-22 07:04:25','2006-02-15 22:13:34'),(4292,158,2,245,'4.99','2005-05-26 13:46:59','2006-02-15 22:13:34'),(4293,158,1,293,'5.99','2005-05-26 20:27:02','2006-02-15 22:13:34'),(4294,158,1,1380,'0.99','2005-06-15 15:13:10','2006-02-15 22:13:34'),(4295,158,2,1790,'4.99','2005-06-16 19:58:40','2006-02-15 22:13:34'),(4296,158,2,2035,'6.99','2005-06-17 13:45:09','2006-02-15 22:13:34'),(4297,158,2,3203,'8.99','2005-06-21 00:34:56','2006-02-15 22:13:34'),(4298,158,1,4117,'8.99','2005-07-07 06:58:14','2006-02-15 22:13:34'),(4299,158,1,5672,'2.99','2005-07-10 08:19:38','2006-02-15 22:13:34'),(4300,158,1,5988,'4.99','2005-07-11 00:55:38','2006-02-15 22:13:34'),(4301,158,1,6416,'2.99','2005-07-11 23:29:14','2006-02-15 22:13:34'),(4302,158,2,6901,'5.99','2005-07-12 21:46:33','2006-02-15 22:13:34'),(4303,158,2,7159,'2.99','2005-07-27 07:24:00','2006-02-15 22:13:34'),(4304,158,1,7732,'0.99','2005-07-28 05:03:32','2006-02-15 22:13:34'),(4305,158,2,7952,'2.99','2005-07-28 13:23:49','2006-02-15 22:13:34'),(4306,158,1,8750,'2.99','2005-07-29 19:14:21','2006-02-15 22:13:34'),(4307,158,1,8957,'1.99','2005-07-30 03:34:10','2006-02-15 22:13:34'),(4308,158,1,9393,'2.99','2005-07-30 20:04:48','2006-02-15 22:13:34'),(4309,158,1,9713,'1.99','2005-07-31 08:13:28','2006-02-15 22:13:35'),(4310,158,1,9801,'2.99','2005-07-31 11:03:13','2006-02-15 22:13:35'),(4311,158,2,11077,'4.99','2005-08-02 07:26:43','2006-02-15 22:13:35'),(4312,158,1,11103,'6.99','2005-08-02 08:09:54','2006-02-15 22:13:35'),(4313,158,1,11272,'0.99','2005-08-02 14:20:27','2006-02-15 22:13:35'),(4314,158,1,11420,'2.99','2005-08-02 19:47:56','2006-02-15 22:13:35'),(4315,158,2,12070,'1.99','2005-08-17 21:46:47','2006-02-15 22:13:35'),(4316,158,2,12421,'5.99','2005-08-18 10:04:06','2006-02-15 22:13:35'),(4317,158,2,13212,'1.99','2005-08-19 15:24:07','2006-02-15 22:13:35'),(4318,158,2,13854,'2.99','2005-08-20 14:48:42','2006-02-15 22:13:35'),(4319,158,1,13926,'2.99','2005-08-20 17:09:27','2006-02-15 22:13:35'),(4320,158,2,14028,'0.99','2005-08-20 21:23:03','2006-02-15 22:13:35'),(4321,158,1,15763,'2.99','2005-08-23 13:02:59','2006-02-15 22:13:35'),(4322,158,1,15796,'5.99','2005-08-23 14:12:22','2006-02-15 22:13:35'),(4323,158,1,15802,'5.99','2005-08-23 14:26:51','2006-02-15 22:13:35'),(4324,159,2,475,'2.99','2005-05-27 22:16:26','2006-02-15 22:13:35'),(4325,159,2,549,'1.99','2005-05-28 07:35:37','2006-02-15 22:13:35'),(4326,159,1,598,'0.99','2005-05-28 14:04:50','2006-02-15 22:13:35'),(4327,159,1,832,'3.99','2005-05-29 22:51:20','2006-02-15 22:13:35'),(4328,159,1,1695,'0.99','2005-06-16 12:40:28','2006-02-15 22:13:35'),(4329,159,1,2572,'0.99','2005-06-19 04:21:26','2006-02-15 22:13:35'),(4330,159,2,3914,'5.99','2005-07-06 20:11:10','2006-02-15 22:13:35'),(4331,159,2,4273,'4.99','2005-07-07 14:40:22','2006-02-15 22:13:35'),(4332,159,2,5656,'0.99','2005-07-10 07:31:07','2006-02-15 22:13:35'),(4333,159,2,6885,'4.99','2005-07-12 20:56:04','2006-02-15 22:13:35'),(4334,159,2,8212,'2.99','2005-07-28 23:37:23','2006-02-15 22:13:35'),(4335,159,1,8470,'0.99','2005-07-29 08:28:50','2006-02-15 22:13:35'),(4336,159,2,9022,'3.99','2005-07-30 05:34:45','2006-02-15 22:13:35'),(4337,159,2,9132,'0.99','2005-07-30 09:56:00','2006-02-15 22:13:35'),(4338,159,1,9559,'7.99','2005-07-31 02:15:53','2006-02-15 22:13:35'),(4339,159,1,9917,'4.99','2005-07-31 14:55:11','2006-02-15 22:13:35'),(4340,159,2,11225,'4.99','2005-08-02 12:43:27','2006-02-15 22:13:35'),(4341,159,2,13270,'1.99','2005-08-19 17:41:16','2006-02-15 22:13:35'),(4342,159,1,13933,'0.99','2005-08-20 17:17:07','2006-02-15 22:13:35'),(4343,159,2,14575,'8.99','2005-08-21 16:51:34','2006-02-15 22:13:35'),(4344,159,1,15197,'0.99','2005-08-22 16:14:25','2006-02-15 22:13:35'),(4345,160,2,2314,'4.99','2005-06-18 09:03:19','2006-02-15 22:13:35'),(4346,160,1,2465,'2.99','2005-06-18 20:07:02','2006-02-15 22:13:35'),(4347,160,2,2873,'2.99','2005-06-20 00:41:25','2006-02-15 22:13:35'),(4348,160,1,4842,'0.99','2005-07-08 18:21:30','2006-02-15 22:13:35'),(4349,160,1,4908,'5.99','2005-07-08 21:05:44','2006-02-15 22:13:35'),(4350,160,2,6364,'6.99','2005-07-11 21:14:48','2006-02-15 22:13:35'),(4351,160,2,6448,'1.99','2005-07-12 00:45:59','2006-02-15 22:13:36'),(4352,160,2,7500,'0.99','2005-07-27 20:16:03','2006-02-15 22:13:36'),(4353,160,1,8184,'4.99','2005-07-28 22:22:35','2006-02-15 22:13:36'),(4354,160,1,9681,'0.99','2005-07-31 06:42:09','2006-02-15 22:13:36'),(4355,160,2,9758,'2.99','2005-07-31 09:25:38','2006-02-15 22:13:36'),(4356,160,2,10089,'2.99','2005-07-31 20:17:09','2006-02-15 22:13:36'),(4357,160,1,10305,'2.99','2005-08-01 04:16:16','2006-02-15 22:13:36'),(4358,160,2,10788,'0.99','2005-08-01 21:37:10','2006-02-15 22:13:36'),(4359,160,2,10958,'4.99','2005-08-02 03:37:13','2006-02-15 22:13:36'),(4360,160,2,10979,'5.99','2005-08-02 04:16:37','2006-02-15 22:13:36'),(4361,160,2,11154,'2.99','2005-08-02 09:54:50','2006-02-15 22:13:36'),(4362,160,1,11803,'2.99','2005-08-17 11:42:08','2006-02-15 22:13:36'),(4363,160,1,11888,'7.99','2005-08-17 15:04:05','2006-02-15 22:13:36'),(4364,160,2,12334,'2.99','2005-08-18 06:52:36','2006-02-15 22:13:36'),(4365,160,1,12435,'7.99','2005-08-18 10:38:31','2006-02-15 22:13:36'),(4366,160,2,13093,'6.99','2005-08-19 10:46:16','2006-02-15 22:13:36'),(4367,160,1,14868,'4.99','2005-08-22 03:15:01','2006-02-15 22:13:36'),(4368,160,1,15112,'2.99','2005-08-22 12:21:49','2006-02-15 22:13:36'),(4369,160,2,15642,'2.99','2005-08-23 08:09:11','2006-02-15 22:13:36'),(4370,160,1,15962,'4.99','2005-08-23 19:42:04','2006-02-15 22:13:36'),(4371,160,1,16027,'3.99','2005-08-23 21:49:33','2006-02-15 22:13:36'),(4372,161,2,428,'2.99','2005-05-27 16:10:58','2006-02-15 22:13:36'),(4373,161,2,477,'3.99','2005-05-27 22:33:33','2006-02-15 22:13:36'),(4374,161,1,520,'5.99','2005-05-28 03:27:37','2006-02-15 22:13:36'),(4375,161,2,539,'0.99','2005-05-28 06:26:16','2006-02-15 22:13:36'),(4376,161,1,612,'2.99','2005-05-28 15:24:54','2006-02-15 22:13:36'),(4377,161,1,1003,'0.99','2005-05-31 00:48:20','2006-02-15 22:13:36'),(4378,161,1,1856,'2.99','2005-06-17 01:02:00','2006-02-15 22:13:36'),(4379,161,1,3075,'3.99','2005-06-20 14:52:19','2006-02-15 22:13:36'),(4380,161,1,3948,'4.99','2005-07-06 21:45:53','2006-02-15 22:13:36'),(4381,161,2,4187,'0.99','2005-07-07 10:41:31','2006-02-15 22:13:36'),(4382,161,2,4248,'6.99','2005-07-07 13:59:20','2006-02-15 22:13:36'),(4383,161,1,4490,'2.99','2005-07-08 01:26:32','2006-02-15 22:13:36'),(4384,161,2,5349,'6.99','2005-07-09 17:35:35','2006-02-15 22:13:36'),(4385,161,2,6873,'4.99','2005-07-12 20:20:50','2006-02-15 22:13:36'),(4386,161,1,7003,'2.99','2005-07-27 01:32:06','2006-02-15 22:13:36'),(4387,161,2,8774,'4.99','2005-07-29 20:05:04','2006-02-15 22:13:36'),(4388,161,1,9135,'4.99','2005-07-30 10:06:53','2006-02-15 22:13:36'),(4389,161,2,9421,'0.99','2005-07-30 21:08:32','2006-02-15 22:13:36'),(4390,161,1,10241,'5.99','2005-08-01 02:12:25','2006-02-15 22:13:36'),(4391,161,1,10355,'0.99','2005-08-01 05:47:37','2006-02-15 22:13:37'),(4392,161,1,10637,'2.99','2005-08-01 15:44:09','2006-02-15 22:13:37'),(4393,161,1,10863,'6.99','2005-08-02 00:18:07','2006-02-15 22:13:37'),(4394,161,2,10939,'0.99','2005-08-02 03:06:20','2006-02-15 22:13:37'),(4395,161,1,11838,'2.99','2005-08-17 13:06:00','2006-02-15 22:13:37'),(4396,161,2,14150,'0.99','2005-08-21 02:23:03','2006-02-15 22:13:37'),(4397,161,1,14370,'7.99','2005-08-21 09:35:14','2006-02-15 22:13:37'),(4398,161,1,15000,'0.99','2005-08-22 07:54:58','2006-02-15 22:13:37'),(4399,161,2,15045,'5.99','2005-08-22 09:53:23','2006-02-15 22:13:37'),(4400,161,2,15150,'2.99','2005-08-22 14:12:05','2006-02-15 22:13:37'),(4401,161,1,15420,'5.99','2005-08-22 23:55:51','2006-02-15 22:13:37'),(4402,162,1,285,'1.99','2005-05-26 19:41:40','2006-02-15 22:13:37'),(4403,162,1,501,'4.99','2005-05-28 01:09:36','2006-02-15 22:13:37'),(4404,162,1,688,'4.99','2005-05-29 00:45:24','2006-02-15 22:13:37'),(4405,162,2,1339,'4.99','2005-06-15 12:21:56','2006-02-15 22:13:37'),(4406,162,1,2366,'0.99','2005-06-18 13:46:39','2006-02-15 22:13:37'),(4407,162,1,2547,'4.99','2005-06-19 02:44:17','2006-02-15 22:13:37'),(4408,162,1,3040,'0.99','2005-06-20 12:34:13','2006-02-15 22:13:37'),(4409,162,2,3180,'0.99','2005-06-20 22:48:44','2006-02-15 22:13:37'),(4410,162,2,4982,'2.99','2005-07-09 00:30:52','2006-02-15 22:13:37'),(4411,162,2,8478,'4.99','2005-07-29 08:40:36','2006-02-15 22:13:37'),(4412,162,1,8582,'4.99','2005-07-29 12:03:27','2006-02-15 22:13:37'),(4413,162,2,9167,'4.99','2005-07-30 11:30:37','2006-02-15 22:13:37'),(4414,162,1,9726,'7.99','2005-07-31 08:37:07','2006-02-15 22:13:37'),(4415,162,1,9775,'0.99','2005-07-31 10:00:00','2006-02-15 22:13:37'),(4416,162,2,10093,'5.99','2005-07-31 20:30:32','2006-02-15 22:13:37'),(4417,162,2,11012,'0.99','2005-08-02 05:09:42','2006-02-15 22:13:37'),(4418,162,1,13288,'4.99','2005-08-19 18:30:10','2006-02-15 22:13:37'),(4419,162,2,14301,'1.99','2005-08-21 07:19:48','2006-02-15 22:13:37'),(4420,162,1,15332,'4.99','2005-08-22 20:41:53','2006-02-15 22:13:37'),(4421,162,1,14220,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:37'),(4422,163,2,1265,'4.99','2005-06-15 07:00:50','2006-02-15 22:13:37'),(4423,163,2,2000,'2.99','2005-06-17 11:32:30','2006-02-15 22:13:37'),(4424,163,2,2110,'7.99','2005-06-17 19:45:49','2006-02-15 22:13:37'),(4425,163,2,2536,'5.99','2005-06-19 01:41:34','2006-02-15 22:13:37'),(4426,163,1,2994,'6.99','2005-06-20 09:17:05','2006-02-15 22:13:37'),(4427,163,1,3179,'0.99','2005-06-20 22:37:59','2006-02-15 22:13:37'),(4428,163,2,3915,'3.99','2005-07-06 20:16:46','2006-02-15 22:13:37'),(4429,163,1,4126,'1.99','2005-07-07 07:24:11','2006-02-15 22:13:37'),(4430,163,2,5549,'4.99','2005-07-10 02:58:29','2006-02-15 22:13:37'),(4431,163,1,5574,'10.99','2005-07-10 03:54:38','2006-02-15 22:13:37'),(4432,163,1,6109,'0.99','2005-07-11 07:20:57','2006-02-15 22:13:37'),(4433,163,1,6831,'1.99','2005-07-12 18:44:04','2006-02-15 22:13:38'),(4434,163,1,7303,'1.99','2005-07-27 12:54:39','2006-02-15 22:13:38'),(4435,163,1,7403,'2.99','2005-07-27 16:22:09','2006-02-15 22:13:38'),(4436,163,2,8040,'0.99','2005-07-28 16:39:43','2006-02-15 22:13:38'),(4437,163,2,8063,'4.99','2005-07-28 17:15:11','2006-02-15 22:13:38'),(4438,163,2,8403,'4.99','2005-07-29 06:26:39','2006-02-15 22:13:38'),(4439,163,2,10245,'0.99','2005-08-01 02:24:09','2006-02-15 22:13:38'),(4440,163,2,11623,'2.99','2005-08-17 04:15:47','2006-02-15 22:13:38'),(4441,163,2,11940,'4.99','2005-08-17 16:56:28','2006-02-15 22:13:38'),(4442,163,1,12154,'2.99','2005-08-18 00:23:56','2006-02-15 22:13:38'),(4443,163,2,12973,'2.99','2005-08-19 06:48:11','2006-02-15 22:13:38'),(4444,163,2,13543,'7.99','2005-08-20 03:43:13','2006-02-15 22:13:38'),(4445,163,2,14275,'4.99','2005-08-21 06:30:30','2006-02-15 22:13:38'),(4446,163,2,14427,'5.99','2005-08-21 11:26:06','2006-02-15 22:13:38'),(4447,163,1,15520,'8.99','2005-08-23 03:30:45','2006-02-15 22:13:38'),(4448,163,1,15847,'0.99','2005-08-23 15:39:38','2006-02-15 22:13:38'),(4449,163,2,11754,'7.98','2006-02-14 15:16:03','2006-02-15 22:13:38'),(4450,163,1,15282,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:38'),(4451,164,2,1011,'1.99','2005-05-31 02:05:39','2006-02-15 22:13:38'),(4452,164,2,1713,'4.99','2005-06-16 14:28:33','2006-02-15 22:13:38'),(4453,164,2,2589,'2.99','2005-06-19 05:21:27','2006-02-15 22:13:38'),(4454,164,1,3082,'8.99','2005-06-20 15:32:11','2006-02-15 22:13:38'),(4455,164,2,4548,'4.99','2005-07-08 04:21:54','2006-02-15 22:13:38'),(4456,164,1,5895,'3.99','2005-07-10 20:13:19','2006-02-15 22:13:38'),(4457,164,1,6393,'0.99','2005-07-11 22:28:12','2006-02-15 22:13:38'),(4458,164,2,6558,'2.99','2005-07-12 05:16:07','2006-02-15 22:13:38'),(4459,164,1,6637,'4.99','2005-07-12 09:57:39','2006-02-15 22:13:38'),(4460,164,2,6702,'0.99','2005-07-12 12:48:03','2006-02-15 22:13:38'),(4461,164,1,6980,'3.99','2005-07-27 00:50:30','2006-02-15 22:13:38'),(4462,164,1,7227,'6.99','2005-07-27 09:53:43','2006-02-15 22:13:38'),(4463,164,2,8135,'3.99','2005-07-28 20:03:25','2006-02-15 22:13:38'),(4464,164,2,8824,'4.99','2005-07-29 22:22:58','2006-02-15 22:13:38'),(4465,164,2,11175,'2.99','2005-08-02 10:38:47','2006-02-15 22:13:38'),(4466,164,2,13453,'5.99','2005-08-20 00:30:51','2006-02-15 22:13:38'),(4467,165,2,338,'4.99','2005-05-27 03:42:52','2006-02-15 22:13:38'),(4468,165,1,2013,'3.99','2005-06-17 12:03:01','2006-02-15 22:13:38'),(4469,165,2,3195,'2.99','2005-06-21 00:02:10','2006-02-15 22:13:38'),(4470,165,2,3531,'4.99','2005-07-06 01:24:08','2006-02-15 22:13:38'),(4471,165,1,3784,'5.99','2005-07-06 13:57:56','2006-02-15 22:13:38'),(4472,165,2,4304,'0.99','2005-07-07 17:01:19','2006-02-15 22:13:38'),(4473,165,2,4945,'2.99','2005-07-08 22:45:02','2006-02-15 22:13:38'),(4474,165,1,5472,'4.99','2005-07-09 23:16:40','2006-02-15 22:13:38'),(4475,165,2,5658,'4.99','2005-07-10 07:34:08','2006-02-15 22:13:38'),(4476,165,2,5901,'6.99','2005-07-10 20:22:12','2006-02-15 22:13:39'),(4477,165,1,5973,'0.99','2005-07-11 00:09:17','2006-02-15 22:13:39'),(4478,165,1,7074,'2.99','2005-07-27 04:06:24','2006-02-15 22:13:39'),(4479,165,1,8608,'0.99','2005-07-29 13:18:52','2006-02-15 22:13:39'),(4480,165,2,9182,'7.99','2005-07-30 12:06:58','2006-02-15 22:13:39'),(4481,165,2,9685,'4.99','2005-07-31 06:49:18','2006-02-15 22:13:39'),(4482,165,1,10565,'4.99','2005-08-01 13:08:27','2006-02-15 22:13:39'),(4483,165,1,11484,'2.99','2005-08-02 22:28:23','2006-02-15 22:13:39'),(4484,165,2,12643,'4.99','2005-08-18 18:21:06','2006-02-15 22:13:39'),(4485,165,2,15007,'1.99','2005-08-22 08:21:21','2006-02-15 22:13:39'),(4486,165,1,15801,'3.99','2005-08-23 14:26:04','2006-02-15 22:13:39'),(4487,165,2,15834,'5.99','2005-08-23 15:23:50','2006-02-15 22:13:39'),(4488,166,1,662,'1.99','2005-05-28 21:09:31','2006-02-15 22:13:39'),(4489,166,2,1412,'2.99','2005-06-15 17:09:48','2006-02-15 22:13:39'),(4490,166,1,2211,'3.99','2005-06-18 02:29:10','2006-02-15 22:13:39'),(4491,166,1,2874,'5.99','2005-06-20 00:42:26','2006-02-15 22:13:39'),(4492,166,1,3085,'0.99','2005-06-20 15:42:33','2006-02-15 22:13:39'),(4493,166,2,3606,'2.99','2005-07-06 05:28:02','2006-02-15 22:13:39'),(4494,166,1,3642,'2.99','2005-07-06 07:18:20','2006-02-15 22:13:39'),(4495,166,2,4389,'6.99','2005-07-07 20:58:58','2006-02-15 22:13:39'),(4496,166,1,4658,'0.99','2005-07-08 09:51:11','2006-02-15 22:13:39'),(4497,166,1,5184,'4.99','2005-07-09 10:14:34','2006-02-15 22:13:39'),(4498,166,2,5380,'4.99','2005-07-09 19:08:44','2006-02-15 22:13:39'),(4499,166,1,5646,'2.99','2005-07-10 07:08:09','2006-02-15 22:13:39'),(4500,166,1,5855,'7.99','2005-07-10 17:54:06','2006-02-15 22:13:39'),(4501,166,2,6237,'0.99','2005-07-11 14:19:12','2006-02-15 22:13:39'),(4502,166,2,6882,'2.99','2005-07-12 20:50:39','2006-02-15 22:13:39'),(4503,166,1,7581,'2.99','2005-07-27 23:14:35','2006-02-15 22:13:39'),(4504,166,1,8052,'5.99','2005-07-28 16:57:31','2006-02-15 22:13:39'),(4505,166,1,9009,'8.99','2005-07-30 05:12:01','2006-02-15 22:13:39'),(4506,166,2,10422,'7.99','2005-08-01 08:17:11','2006-02-15 22:13:39'),(4507,166,2,12683,'4.99','2005-08-18 19:50:43','2006-02-15 22:13:39'),(4508,166,1,12968,'4.99','2005-08-19 06:38:18','2006-02-15 22:13:39'),(4509,166,2,13582,'4.99','2005-08-20 05:28:11','2006-02-15 22:13:39'),(4510,166,2,13901,'7.99','2005-08-20 16:06:53','2006-02-15 22:13:39'),(4511,166,2,14261,'5.99','2005-08-21 06:07:24','2006-02-15 22:13:39'),(4512,166,2,14281,'2.99','2005-08-21 06:40:48','2006-02-15 22:13:39'),(4513,166,1,15213,'5.99','2005-08-22 16:49:02','2006-02-15 22:13:39'),(4514,166,2,15216,'2.99','2005-08-22 16:57:02','2006-02-15 22:13:39'),(4515,166,2,15806,'1.99','2005-08-23 14:31:50','2006-02-15 22:13:39'),(4516,167,1,280,'2.99','2005-05-26 18:36:58','2006-02-15 22:13:39'),(4517,167,1,365,'2.99','2005-05-27 07:31:20','2006-02-15 22:13:39'),(4518,167,1,927,'4.99','2005-05-30 12:16:40','2006-02-15 22:13:40'),(4519,167,1,1416,'3.99','2005-06-15 17:44:57','2006-02-15 22:13:40'),(4520,167,1,1509,'5.99','2005-06-15 22:35:53','2006-02-15 22:13:40'),(4521,167,2,2381,'5.99','2005-06-18 15:00:30','2006-02-15 22:13:40'),(4522,167,2,3518,'4.99','2005-07-06 00:56:03','2006-02-15 22:13:40'),(4523,167,2,4493,'0.99','2005-07-08 01:40:24','2006-02-15 22:13:40'),(4524,167,2,5131,'0.99','2005-07-09 07:35:03','2006-02-15 22:13:40'),(4525,167,1,5178,'4.99','2005-07-09 09:59:52','2006-02-15 22:13:40'),(4526,167,1,5191,'0.99','2005-07-09 10:26:48','2006-02-15 22:13:40'),(4527,167,1,5413,'4.99','2005-07-09 20:28:42','2006-02-15 22:13:40'),(4528,167,1,5781,'2.99','2005-07-10 13:49:30','2006-02-15 22:13:40'),(4529,167,2,6269,'4.99','2005-07-11 15:58:43','2006-02-15 22:13:40'),(4530,167,1,7608,'4.99','2005-07-28 00:08:36','2006-02-15 22:13:40'),(4531,167,1,8092,'2.99','2005-07-28 18:28:07','2006-02-15 22:13:40'),(4532,167,2,8227,'4.99','2005-07-29 00:02:22','2006-02-15 22:13:40'),(4533,167,1,8318,'2.99','2005-07-29 03:44:30','2006-02-15 22:13:40'),(4534,167,1,8793,'0.99','2005-07-29 20:57:22','2006-02-15 22:13:40'),(4535,167,2,8864,'0.99','2005-07-29 23:52:12','2006-02-15 22:13:40'),(4536,167,2,9563,'4.99','2005-07-31 02:28:39','2006-02-15 22:13:40'),(4537,167,2,10285,'3.99','2005-08-01 03:35:11','2006-02-15 22:13:40'),(4538,167,1,12642,'4.99','2005-08-18 18:19:16','2006-02-15 22:13:40'),(4539,167,2,12717,'4.99','2005-08-18 21:15:40','2006-02-15 22:13:40'),(4540,167,1,12978,'4.99','2005-08-19 06:57:27','2006-02-15 22:13:40'),(4541,167,1,13825,'6.99','2005-08-20 13:43:22','2006-02-15 22:13:40'),(4542,167,1,13870,'1.99','2005-08-20 15:09:16','2006-02-15 22:13:40'),(4543,167,1,15003,'3.99','2005-08-22 08:11:24','2006-02-15 22:13:40'),(4544,167,1,15050,'0.99','2005-08-22 10:07:52','2006-02-15 22:13:40'),(4545,167,2,15478,'0.99','2005-08-23 01:50:31','2006-02-15 22:13:40'),(4546,167,2,15530,'4.99','2005-08-23 03:50:48','2006-02-15 22:13:40'),(4547,167,2,15915,'4.99','2005-08-23 17:52:01','2006-02-15 22:13:40'),(4548,168,2,404,'0.99','2005-05-27 13:31:51','2006-02-15 22:13:40'),(4549,168,1,488,'4.99','2005-05-28 00:07:50','2006-02-15 22:13:40'),(4550,168,2,1222,'4.99','2005-06-15 03:38:49','2006-02-15 22:13:40'),(4551,168,1,3530,'2.99','2005-07-06 01:22:45','2006-02-15 22:13:40'),(4552,168,1,4308,'5.99','2005-07-07 17:29:16','2006-02-15 22:13:40'),(4553,168,2,4363,'5.99','2005-07-07 19:43:28','2006-02-15 22:13:40'),(4554,168,2,4953,'2.99','2005-07-08 23:09:48','2006-02-15 22:13:40'),(4555,168,1,5459,'0.99','2005-07-09 22:43:56','2006-02-15 22:13:40'),(4556,168,1,5907,'5.99','2005-07-10 20:41:41','2006-02-15 22:13:40'),(4557,168,1,6334,'5.99','2005-07-11 19:20:44','2006-02-15 22:13:40'),(4558,168,2,6444,'0.99','2005-07-12 00:36:02','2006-02-15 22:13:40'),(4559,168,2,6809,'3.99','2005-07-12 17:51:54','2006-02-15 22:13:41'),(4560,168,2,8352,'1.99','2005-07-29 04:52:01','2006-02-15 22:13:41'),(4561,168,1,8527,'1.99','2005-07-29 10:21:00','2006-02-15 22:13:41'),(4562,168,2,8659,'6.99','2005-07-29 15:26:31','2006-02-15 22:13:41'),(4563,168,2,8883,'1.99','2005-07-30 00:24:48','2006-02-15 22:13:41'),(4564,168,2,9197,'4.99','2005-07-30 12:31:36','2006-02-15 22:13:41'),(4565,168,1,9418,'4.99','2005-07-30 21:00:52','2006-02-15 22:13:41'),(4566,168,2,9857,'6.99','2005-07-31 13:00:53','2006-02-15 22:13:41'),(4567,168,2,9899,'4.99','2005-07-31 14:12:36','2006-02-15 22:13:41'),(4568,168,2,10270,'0.99','2005-08-01 03:10:24','2006-02-15 22:13:41'),(4569,168,1,11551,'0.99','2005-08-17 01:03:49','2006-02-15 22:13:41'),(4570,168,1,11627,'10.99','2005-08-17 04:25:47','2006-02-15 22:13:41'),(4571,168,1,11631,'1.99','2005-08-17 04:28:56','2006-02-15 22:13:41'),(4572,168,1,12545,'6.99','2005-08-18 14:28:00','2006-02-15 22:13:41'),(4573,168,1,12781,'2.99','2005-08-18 23:50:24','2006-02-15 22:13:41'),(4574,168,1,13018,'8.99','2005-08-19 08:04:50','2006-02-15 22:13:41'),(4575,168,2,13532,'4.99','2005-08-20 03:29:28','2006-02-15 22:13:41'),(4576,168,2,13811,'0.99','2005-08-20 13:00:30','2006-02-15 22:13:41'),(4577,168,1,14090,'2.99','2005-08-21 00:11:16','2006-02-15 22:13:41'),(4578,168,1,15033,'3.99','2005-08-22 09:25:24','2006-02-15 22:13:41'),(4579,168,1,15165,'2.99','2005-08-22 14:59:30','2006-02-15 22:13:41'),(4580,168,2,15683,'2.99','2005-08-23 09:38:17','2006-02-15 22:13:41'),(4581,168,1,15894,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:41'),(4582,169,2,527,'3.99','2005-05-28 04:28:38','2006-02-15 22:13:41'),(4583,169,1,1087,'4.99','2005-05-31 11:18:08','2006-02-15 22:13:41'),(4584,169,1,2023,'4.99','2005-06-17 12:52:58','2006-02-15 22:13:41'),(4585,169,1,3261,'2.99','2005-06-21 04:07:41','2006-02-15 22:13:41'),(4586,169,1,3493,'8.99','2005-07-05 23:46:19','2006-02-15 22:13:41'),(4587,169,1,4687,'4.99','2005-07-08 10:54:19','2006-02-15 22:13:41'),(4588,169,1,5066,'2.99','2005-07-09 04:48:50','2006-02-15 22:13:41'),(4589,169,1,6143,'3.99','2005-07-11 09:02:37','2006-02-15 22:13:41'),(4590,169,2,6453,'4.99','2005-07-12 00:59:53','2006-02-15 22:13:41'),(4591,169,2,6488,'9.99','2005-07-12 02:20:09','2006-02-15 22:13:41'),(4592,169,2,7187,'6.99','2005-07-27 08:27:58','2006-02-15 22:13:41'),(4593,169,1,7597,'0.99','2005-07-27 23:35:49','2006-02-15 22:13:41'),(4594,169,2,8558,'4.99','2005-07-29 11:24:49','2006-02-15 22:13:41'),(4595,169,2,9203,'0.99','2005-07-30 12:43:40','2006-02-15 22:13:41'),(4596,169,2,11687,'5.99','2005-08-17 06:39:59','2006-02-15 22:13:41'),(4597,169,1,11898,'5.99','2005-08-17 15:24:12','2006-02-15 22:13:41'),(4598,169,2,13198,'2.99','2005-08-19 14:47:18','2006-02-15 22:13:41'),(4599,169,2,13237,'1.99','2005-08-19 16:18:36','2006-02-15 22:13:41'),(4600,169,2,14435,'0.99','2005-08-21 11:44:37','2006-02-15 22:13:42'),(4601,169,2,14805,'4.99','2005-08-22 00:52:01','2006-02-15 22:13:42'),(4602,169,2,15534,'0.99','2005-08-23 03:55:54','2006-02-15 22:13:42'),(4603,169,2,15680,'4.99','2005-08-23 09:33:22','2006-02-15 22:13:42'),(4604,170,1,211,'2.99','2005-05-26 08:33:10','2006-02-15 22:13:42'),(4605,170,1,377,'5.99','2005-05-27 09:04:05','2006-02-15 22:13:42'),(4606,170,2,504,'0.99','2005-05-28 02:05:34','2006-02-15 22:13:42'),(4607,170,2,2117,'0.99','2005-06-17 20:24:00','2006-02-15 22:13:42'),(4608,170,2,2413,'8.99','2005-06-18 16:59:34','2006-02-15 22:13:42'),(4609,170,2,3651,'4.99','2005-07-06 07:40:31','2006-02-15 22:13:42'),(4610,170,1,3749,'4.99','2005-07-06 12:18:03','2006-02-15 22:13:42'),(4611,170,2,4113,'4.99','2005-07-07 06:49:52','2006-02-15 22:13:42'),(4612,170,2,4468,'0.99','2005-07-08 00:17:59','2006-02-15 22:13:42'),(4613,170,2,5075,'0.99','2005-07-09 05:12:07','2006-02-15 22:13:42'),(4614,170,1,5573,'4.99','2005-07-10 03:50:47','2006-02-15 22:13:42'),(4615,170,2,5685,'7.99','2005-07-10 09:01:38','2006-02-15 22:13:42'),(4616,170,2,5808,'2.99','2005-07-10 15:17:33','2006-02-15 22:13:42'),(4617,170,1,7999,'7.99','2005-07-28 15:10:14','2006-02-15 22:13:42'),(4618,170,2,9517,'2.99','2005-07-31 00:41:23','2006-02-15 22:13:42'),(4619,170,1,9817,'2.99','2005-07-31 11:33:31','2006-02-15 22:13:42'),(4620,170,1,10102,'9.99','2005-07-31 20:49:10','2006-02-15 22:13:42'),(4621,170,2,10481,'5.99','2005-08-01 10:17:26','2006-02-15 22:13:42'),(4622,170,1,11039,'0.99','2005-08-02 06:00:53','2006-02-15 22:13:42'),(4623,170,2,12706,'3.99','2005-08-18 20:44:34','2006-02-15 22:13:42'),(4624,170,1,12967,'3.99','2005-08-19 06:37:51','2006-02-15 22:13:42'),(4625,170,1,13081,'0.99','2005-08-19 10:19:06','2006-02-15 22:13:42'),(4626,170,2,13862,'6.99','2005-08-20 14:57:01','2006-02-15 22:13:42'),(4627,170,2,14022,'8.99','2005-08-20 21:08:49','2006-02-15 22:13:42'),(4628,170,2,14675,'2.99','2005-08-21 20:01:51','2006-02-15 22:13:42'),(4629,170,1,15549,'7.99','2005-08-23 04:27:06','2006-02-15 22:13:42'),(4630,171,2,804,'9.99','2005-05-29 18:10:24','2006-02-15 22:13:42'),(4631,171,2,1676,'0.99','2005-06-16 11:06:09','2006-02-15 22:13:42'),(4632,171,2,2004,'4.99','2005-06-17 11:43:38','2006-02-15 22:13:42'),(4633,171,2,2199,'5.99','2005-06-18 01:57:56','2006-02-15 22:13:42'),(4634,171,1,2497,'4.99','2005-06-18 22:50:40','2006-02-15 22:13:42'),(4635,171,2,2599,'5.99','2005-06-19 06:06:07','2006-02-15 22:13:42'),(4636,171,2,2788,'2.99','2005-06-19 18:48:11','2006-02-15 22:13:42'),(4637,171,2,3338,'6.99','2005-06-21 10:27:31','2006-02-15 22:13:42'),(4638,171,1,3621,'0.99','2005-07-06 06:03:55','2006-02-15 22:13:42'),(4639,171,2,3745,'2.99','2005-07-06 12:10:32','2006-02-15 22:13:42'),(4640,171,1,5660,'5.99','2005-07-10 07:46:12','2006-02-15 22:13:42'),(4641,171,1,5986,'4.99','2005-07-11 00:54:56','2006-02-15 22:13:43'),(4642,171,1,6766,'2.99','2005-07-12 15:32:01','2006-02-15 22:13:43'),(4643,171,2,6774,'0.99','2005-07-12 15:56:08','2006-02-15 22:13:43'),(4644,171,1,7037,'3.99','2005-07-27 03:06:44','2006-02-15 22:13:43'),(4645,171,2,9066,'4.99','2005-07-30 07:28:54','2006-02-15 22:13:43'),(4646,171,2,9084,'5.99','2005-07-30 08:14:29','2006-02-15 22:13:43'),(4647,171,2,10622,'4.99','2005-08-01 15:12:00','2006-02-15 22:13:43'),(4648,171,1,12600,'4.99','2005-08-18 16:44:24','2006-02-15 22:13:43'),(4649,171,1,12962,'5.99','2005-08-19 06:22:48','2006-02-15 22:13:43'),(4650,171,2,13087,'6.99','2005-08-19 10:33:52','2006-02-15 22:13:43'),(4651,171,2,13292,'0.99','2005-08-19 18:35:32','2006-02-15 22:13:43'),(4652,171,2,13433,'0.99','2005-08-19 23:30:53','2006-02-15 22:13:43'),(4653,171,1,14270,'1.99','2005-08-21 06:22:18','2006-02-15 22:13:43'),(4654,171,2,14615,'9.99','2005-08-21 18:06:32','2006-02-15 22:13:43'),(4655,171,2,15810,'0.99','2005-08-23 14:43:15','2006-02-15 22:13:43'),(4656,172,2,449,'3.99','2005-05-27 19:13:15','2006-02-15 22:13:43'),(4657,172,1,685,'6.99','2005-05-29 00:17:51','2006-02-15 22:13:43'),(4658,172,1,837,'0.99','2005-05-30 00:02:08','2006-02-15 22:13:43'),(4659,172,2,1507,'0.99','2005-06-15 22:25:26','2006-02-15 22:13:43'),(4660,172,1,2052,'0.99','2005-06-17 15:14:43','2006-02-15 22:13:43'),(4661,172,2,3032,'1.99','2005-06-20 11:58:30','2006-02-15 22:13:43'),(4662,172,1,4820,'5.99','2005-07-08 17:25:23','2006-02-15 22:13:43'),(4663,172,1,4821,'4.99','2005-07-08 17:28:08','2006-02-15 22:13:43'),(4664,172,2,4878,'6.99','2005-07-08 19:33:49','2006-02-15 22:13:43'),(4665,172,2,6246,'7.99','2005-07-11 14:57:51','2006-02-15 22:13:43'),(4666,172,1,6380,'0.99','2005-07-11 21:55:40','2006-02-15 22:13:43'),(4667,172,1,6875,'5.99','2005-07-12 20:23:05','2006-02-15 22:13:43'),(4668,172,1,7122,'6.99','2005-07-27 06:03:18','2006-02-15 22:13:43'),(4669,172,1,7135,'2.99','2005-07-27 06:34:32','2006-02-15 22:13:43'),(4670,172,1,7194,'3.99','2005-07-27 08:39:58','2006-02-15 22:13:43'),(4671,172,2,7261,'2.99','2005-07-27 11:15:01','2006-02-15 22:13:43'),(4672,172,1,7638,'4.99','2005-07-28 01:13:26','2006-02-15 22:13:43'),(4673,172,2,8944,'6.99','2005-07-30 03:11:44','2006-02-15 22:13:43'),(4674,172,1,9118,'2.99','2005-07-30 09:24:18','2006-02-15 22:13:43'),(4675,172,2,9218,'5.99','2005-07-30 13:14:35','2006-02-15 22:13:43'),(4676,172,1,10312,'3.99','2005-08-01 04:29:06','2006-02-15 22:13:43'),(4677,172,2,10621,'0.99','2005-08-01 15:10:26','2006-02-15 22:13:43'),(4678,172,2,11499,'6.99','2005-08-16 22:54:12','2006-02-15 22:13:43'),(4679,172,2,12350,'4.99','2005-08-18 07:29:46','2006-02-15 22:13:43'),(4680,172,2,12638,'8.99','2005-08-18 18:11:39','2006-02-15 22:13:43'),(4681,172,2,13067,'5.99','2005-08-19 09:51:17','2006-02-15 22:13:43'),(4682,172,2,13320,'4.99','2005-08-19 19:35:33','2006-02-15 22:13:44'),(4683,172,1,13342,'0.99','2005-08-19 20:21:36','2006-02-15 22:13:44'),(4684,172,2,13937,'4.99','2005-08-20 17:22:51','2006-02-15 22:13:44'),(4685,172,1,14991,'4.99','2005-08-22 07:50:44','2006-02-15 22:13:44'),(4686,172,2,15637,'2.99','2005-08-23 07:53:38','2006-02-15 22:13:44'),(4687,172,1,15902,'3.99','2005-08-23 17:28:03','2006-02-15 22:13:44'),(4688,172,2,16038,'3.99','2005-08-23 22:14:31','2006-02-15 22:13:44'),(4689,173,2,578,'2.99','2005-05-28 11:15:48','2006-02-15 22:13:44'),(4690,173,1,628,'4.99','2005-05-28 17:05:46','2006-02-15 22:13:44'),(4691,173,2,1188,'2.99','2005-06-15 01:04:07','2006-02-15 22:13:44'),(4692,173,2,2435,'4.99','2005-06-18 18:12:26','2006-02-15 22:13:44'),(4693,173,1,2602,'2.99','2005-06-19 06:10:08','2006-02-15 22:13:44'),(4694,173,2,3224,'0.99','2005-06-21 02:11:36','2006-02-15 22:13:44'),(4695,173,1,3336,'4.99','2005-06-21 10:14:27','2006-02-15 22:13:44'),(4696,173,2,3717,'0.99','2005-07-06 10:53:34','2006-02-15 22:13:44'),(4697,173,1,4904,'7.99','2005-07-08 20:53:27','2006-02-15 22:13:44'),(4698,173,2,5430,'2.99','2005-07-09 21:19:54','2006-02-15 22:13:44'),(4699,173,2,5485,'4.99','2005-07-09 23:55:25','2006-02-15 22:13:44'),(4700,173,1,5488,'2.99','2005-07-10 00:02:06','2006-02-15 22:13:44'),(4701,173,2,5531,'2.99','2005-07-10 02:13:59','2006-02-15 22:13:44'),(4702,173,1,5615,'3.99','2005-07-10 05:18:51','2006-02-15 22:13:44'),(4703,173,2,6021,'4.99','2005-07-11 02:10:18','2006-02-15 22:13:44'),(4704,173,1,7644,'0.99','2005-07-28 01:27:33','2006-02-15 22:13:44'),(4705,173,2,8299,'2.99','2005-07-29 02:56:00','2006-02-15 22:13:44'),(4706,173,2,8808,'4.99','2005-07-29 21:39:07','2006-02-15 22:13:44'),(4707,173,2,8829,'8.99','2005-07-29 22:33:34','2006-02-15 22:13:44'),(4708,173,1,9097,'4.99','2005-07-30 08:40:35','2006-02-15 22:13:44'),(4709,173,2,9512,'2.99','2005-07-31 00:26:30','2006-02-15 22:13:44'),(4710,173,1,10351,'5.99','2005-08-01 05:32:13','2006-02-15 22:13:44'),(4711,173,2,12073,'2.99','2005-08-17 21:50:39','2006-02-15 22:13:44'),(4712,173,1,12282,'6.99','2005-08-18 04:54:20','2006-02-15 22:13:44'),(4713,173,2,12501,'4.99','2005-08-18 13:13:13','2006-02-15 22:13:44'),(4714,173,1,14654,'2.99','2005-08-21 19:36:59','2006-02-15 22:13:44'),(4715,173,2,15483,'0.99','2005-08-23 02:02:53','2006-02-15 22:13:44'),(4716,173,1,15775,'8.99','2005-08-23 13:25:44','2006-02-15 22:13:44'),(4717,173,1,16010,'2.99','2005-08-23 21:10:24','2006-02-15 22:13:44'),(4718,174,1,41,'5.99','2005-05-25 05:12:29','2006-02-15 22:13:44'),(4719,174,2,1071,'4.99','2005-05-31 09:48:56','2006-02-15 22:13:44'),(4720,174,2,1566,'7.99','2005-06-16 03:13:20','2006-02-15 22:13:44'),(4721,174,1,1609,'0.99','2005-06-16 06:34:59','2006-02-15 22:13:44'),(4722,174,1,2326,'5.99','2005-06-18 10:14:22','2006-02-15 22:13:44'),(4723,174,2,3446,'1.99','2005-06-21 20:45:51','2006-02-15 22:13:45'),(4724,174,2,4803,'1.99','2005-07-08 16:56:34','2006-02-15 22:13:45'),(4725,174,2,5414,'4.99','2005-07-09 20:29:36','2006-02-15 22:13:45'),(4726,174,1,6909,'4.99','2005-07-12 22:09:30','2006-02-15 22:13:45'),(4727,174,2,8348,'7.99','2005-07-29 04:49:26','2006-02-15 22:13:45'),(4728,174,1,8754,'4.99','2005-07-29 19:18:30','2006-02-15 22:13:45'),(4729,174,1,9301,'4.99','2005-07-30 16:34:29','2006-02-15 22:13:45'),(4730,174,1,9847,'2.99','2005-07-31 12:33:43','2006-02-15 22:13:45'),(4731,174,1,10363,'2.99','2005-08-01 06:01:52','2006-02-15 22:13:45'),(4732,174,2,10398,'4.99','2005-08-01 07:11:49','2006-02-15 22:13:45'),(4733,174,1,10559,'8.99','2005-08-01 13:02:58','2006-02-15 22:13:45'),(4734,174,1,11525,'0.99','2005-08-17 00:15:31','2006-02-15 22:13:45'),(4735,174,2,12886,'5.99','2005-08-19 03:38:32','2006-02-15 22:13:45'),(4736,174,1,13185,'0.99','2005-08-19 14:22:30','2006-02-15 22:13:45'),(4737,174,1,15892,'1.99','2005-08-23 17:01:00','2006-02-15 22:13:45'),(4738,174,1,15975,'4.99','2005-08-23 20:06:23','2006-02-15 22:13:45'),(4739,175,2,1495,'0.99','2005-06-15 21:54:31','2006-02-15 22:13:45'),(4740,175,2,3266,'4.99','2005-06-21 04:49:07','2006-02-15 22:13:45'),(4741,175,1,3625,'4.99','2005-07-06 06:12:52','2006-02-15 22:13:45'),(4742,175,2,4167,'5.99','2005-07-07 09:37:08','2006-02-15 22:13:45'),(4743,175,1,5232,'1.99','2005-07-09 12:35:08','2006-02-15 22:13:45'),(4744,175,2,6865,'7.99','2005-07-12 20:02:40','2006-02-15 22:13:45'),(4745,175,1,7448,'2.99','2005-07-27 18:06:30','2006-02-15 22:13:45'),(4746,175,1,7771,'0.99','2005-07-28 06:52:12','2006-02-15 22:13:45'),(4747,175,1,8244,'2.99','2005-07-29 00:35:34','2006-02-15 22:13:45'),(4748,175,1,8264,'4.99','2005-07-29 01:18:50','2006-02-15 22:13:45'),(4749,175,1,8440,'3.99','2005-07-29 07:31:26','2006-02-15 22:13:45'),(4750,175,1,8817,'4.99','2005-07-29 22:09:08','2006-02-15 22:13:45'),(4751,175,2,9941,'4.99','2005-07-31 15:31:25','2006-02-15 22:13:45'),(4752,175,2,10229,'7.99','2005-08-01 01:45:26','2006-02-15 22:13:45'),(4753,175,1,10875,'0.99','2005-08-02 00:31:44','2006-02-15 22:13:45'),(4754,175,2,11618,'4.99','2005-08-17 04:01:36','2006-02-15 22:13:45'),(4755,175,1,12509,'0.99','2005-08-18 13:21:52','2006-02-15 22:13:45'),(4756,175,1,13016,'4.99','2005-08-19 07:57:14','2006-02-15 22:13:45'),(4757,175,2,13833,'6.99','2005-08-20 14:00:29','2006-02-15 22:13:45'),(4758,175,2,13997,'6.99','2005-08-20 19:51:28','2006-02-15 22:13:45'),(4759,175,2,14507,'4.99','2005-08-21 14:32:45','2006-02-15 22:13:45'),(4760,175,2,14897,'2.99','2005-08-22 04:22:31','2006-02-15 22:13:45'),(4761,175,2,14060,'3.98','2006-02-14 15:16:03','2006-02-15 22:13:45'),(4762,175,2,13161,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:46'),(4763,176,1,172,'0.99','2005-05-26 03:17:42','2006-02-15 22:13:46'),(4764,176,2,380,'6.99','2005-05-27 09:34:39','2006-02-15 22:13:46'),(4765,176,1,553,'3.99','2005-05-28 08:14:44','2006-02-15 22:13:46'),(4766,176,1,663,'1.99','2005-05-28 21:23:02','2006-02-15 22:13:46'),(4767,176,1,1062,'7.99','2005-05-31 08:38:20','2006-02-15 22:13:46'),(4768,176,1,1291,'5.99','2005-06-15 08:55:01','2006-02-15 22:13:46'),(4769,176,1,1741,'7.99','2005-06-16 16:31:37','2006-02-15 22:13:46'),(4770,176,1,1836,'6.99','2005-06-16 23:13:05','2006-02-15 22:13:46'),(4771,176,1,2181,'8.99','2005-06-18 00:48:31','2006-02-15 22:13:46'),(4772,176,1,2218,'2.99','2005-06-18 03:13:13','2006-02-15 22:13:46'),(4773,176,2,2427,'2.99','2005-06-18 17:45:00','2006-02-15 22:13:46'),(4774,176,2,2503,'1.99','2005-06-18 23:17:19','2006-02-15 22:13:46'),(4775,176,1,2922,'4.99','2005-06-20 04:13:47','2006-02-15 22:13:46'),(4776,176,1,3643,'4.99','2005-07-06 07:20:08','2006-02-15 22:13:46'),(4777,176,2,3931,'6.99','2005-07-06 21:03:46','2006-02-15 22:13:46'),(4778,176,2,4121,'3.99','2005-07-07 07:13:50','2006-02-15 22:13:46'),(4779,176,1,6035,'2.99','2005-07-11 03:01:45','2006-02-15 22:13:46'),(4780,176,1,6354,'6.99','2005-07-11 20:54:27','2006-02-15 22:13:46'),(4781,176,1,7017,'4.99','2005-07-27 02:16:03','2006-02-15 22:13:46'),(4782,176,1,7025,'2.99','2005-07-27 02:40:29','2006-02-15 22:13:46'),(4783,176,1,7210,'2.99','2005-07-27 09:19:05','2006-02-15 22:13:46'),(4784,176,2,7521,'2.99','2005-07-27 21:04:42','2006-02-15 22:13:46'),(4785,176,1,7751,'5.99','2005-07-28 05:56:13','2006-02-15 22:13:46'),(4786,176,1,8279,'2.99','2005-07-29 01:43:37','2006-02-15 22:13:46'),(4787,176,2,9145,'6.99','2005-07-30 10:27:55','2006-02-15 22:13:46'),(4788,176,1,10277,'2.99','2005-08-01 03:22:41','2006-02-15 22:13:46'),(4789,176,2,10441,'0.99','2005-08-01 08:55:56','2006-02-15 22:13:46'),(4790,176,1,10862,'2.99','2005-08-02 00:17:34','2006-02-15 22:13:46'),(4791,176,1,11678,'5.99','2005-08-17 06:07:39','2006-02-15 22:13:46'),(4792,176,1,12299,'2.99','2005-08-18 05:32:32','2006-02-15 22:13:46'),(4793,176,1,12718,'2.99','2005-08-18 21:21:44','2006-02-15 22:13:46'),(4794,176,1,13170,'7.99','2005-08-19 13:45:48','2006-02-15 22:13:46'),(4795,176,2,13186,'5.99','2005-08-19 14:23:19','2006-02-15 22:13:46'),(4796,176,1,14083,'7.99','2005-08-20 23:42:31','2006-02-15 22:13:46'),(4797,176,2,14232,'1.99','2005-08-21 05:07:02','2006-02-15 22:13:46'),(4798,176,2,15311,'4.99','2005-08-22 19:56:52','2006-02-15 22:13:46'),(4799,176,1,15933,'4.99','2005-08-23 18:36:44','2006-02-15 22:13:46'),(4800,177,1,1393,'2.99','2005-06-15 16:12:50','2006-02-15 22:13:46'),(4801,177,1,1524,'2.99','2005-06-16 00:25:52','2006-02-15 22:13:46'),(4802,177,2,1621,'4.99','2005-06-16 07:24:12','2006-02-15 22:13:47'),(4803,177,1,1738,'0.99','2005-06-16 16:07:27','2006-02-15 22:13:47'),(4804,177,2,2467,'2.99','2005-06-18 20:20:05','2006-02-15 22:13:47'),(4805,177,1,4760,'0.99','2005-07-08 14:48:07','2006-02-15 22:13:47'),(4806,177,2,6217,'9.99','2005-07-11 13:13:45','2006-02-15 22:13:47'),(4807,177,1,6284,'2.99','2005-07-11 16:51:39','2006-02-15 22:13:47'),(4808,177,1,7493,'3.99','2005-07-27 19:55:46','2006-02-15 22:13:47'),(4809,177,2,7674,'1.99','2005-07-28 02:54:30','2006-02-15 22:13:47'),(4810,177,1,8139,'0.99','2005-07-28 20:16:30','2006-02-15 22:13:47'),(4811,177,2,9190,'1.99','2005-07-30 12:24:17','2006-02-15 22:13:47'),(4812,177,2,10321,'4.99','2005-08-01 04:40:02','2006-02-15 22:13:47'),(4813,177,1,10661,'2.99','2005-08-01 16:48:31','2006-02-15 22:13:47'),(4814,177,1,10710,'0.99','2005-08-01 18:44:36','2006-02-15 22:13:47'),(4815,177,1,11195,'0.99','2005-08-02 11:42:23','2006-02-15 22:13:47'),(4816,177,1,11376,'5.99','2005-08-02 18:16:00','2006-02-15 22:13:47'),(4817,177,2,11662,'6.99','2005-08-17 05:27:37','2006-02-15 22:13:47'),(4818,177,1,12623,'4.99','2005-08-18 17:34:19','2006-02-15 22:13:47'),(4819,177,2,14093,'0.99','2005-08-21 00:21:29','2006-02-15 22:13:47'),(4820,177,2,14310,'0.99','2005-08-21 07:44:32','2006-02-15 22:13:47'),(4821,177,2,14849,'2.99','2005-08-22 02:15:26','2006-02-15 22:13:47'),(4822,177,2,14883,'0.99','2005-08-22 03:55:02','2006-02-15 22:13:47'),(4823,178,1,1292,'6.99','2005-06-15 09:03:52','2006-02-15 22:13:47'),(4824,178,2,1458,'6.99','2005-06-15 20:24:05','2006-02-15 22:13:47'),(4825,178,2,1568,'2.99','2005-06-16 03:14:01','2006-02-15 22:13:47'),(4826,178,2,1745,'3.99','2005-06-16 16:41:16','2006-02-15 22:13:47'),(4827,178,2,2124,'1.99','2005-06-17 20:49:14','2006-02-15 22:13:47'),(4828,178,1,2293,'4.99','2005-06-18 07:45:03','2006-02-15 22:13:47'),(4829,178,2,2844,'6.99','2005-06-19 22:40:12','2006-02-15 22:13:47'),(4830,178,1,2898,'9.99','2005-06-20 02:38:06','2006-02-15 22:13:47'),(4831,178,1,4915,'2.99','2005-07-08 21:31:22','2006-02-15 22:13:47'),(4832,178,1,5015,'2.99','2005-07-09 01:54:24','2006-02-15 22:13:47'),(4833,178,1,5057,'4.99','2005-07-09 04:20:29','2006-02-15 22:13:47'),(4834,178,1,5094,'10.99','2005-07-09 05:59:47','2006-02-15 22:13:47'),(4835,178,1,5984,'2.99','2005-07-11 00:44:36','2006-02-15 22:13:47'),(4836,178,2,6347,'4.99','2005-07-11 20:18:53','2006-02-15 22:13:48'),(4837,178,1,6554,'5.99','2005-07-12 05:07:26','2006-02-15 22:13:48'),(4838,178,1,6566,'6.99','2005-07-12 05:42:53','2006-02-15 22:13:48'),(4839,178,2,6606,'2.99','2005-07-12 08:03:40','2006-02-15 22:13:48'),(4840,178,1,7959,'4.99','2005-07-28 13:43:20','2006-02-15 22:13:48'),(4841,178,2,8069,'0.99','2005-07-28 17:23:46','2006-02-15 22:13:48'),(4842,178,1,8287,'3.99','2005-07-29 02:03:58','2006-02-15 22:13:48'),(4843,178,2,8388,'5.99','2005-07-29 05:48:15','2006-02-15 22:13:48'),(4844,178,2,8696,'4.99','2005-07-29 16:45:18','2006-02-15 22:13:48'),(4845,178,2,9004,'4.99','2005-07-30 05:04:27','2006-02-15 22:13:48'),(4846,178,1,9311,'7.99','2005-07-30 16:58:31','2006-02-15 22:13:48'),(4847,178,2,9879,'4.99','2005-07-31 13:45:32','2006-02-15 22:13:48'),(4848,178,2,10125,'0.99','2005-07-31 21:33:03','2006-02-15 22:13:48'),(4849,178,2,10562,'0.99','2005-08-01 13:05:52','2006-02-15 22:13:48'),(4850,178,1,10802,'5.99','2005-08-01 22:18:32','2006-02-15 22:13:48'),(4851,178,2,11319,'6.99','2005-08-02 16:10:09','2006-02-15 22:13:48'),(4852,178,2,11884,'6.99','2005-08-17 14:43:23','2006-02-15 22:13:48'),(4853,178,2,11927,'3.99','2005-08-17 16:25:03','2006-02-15 22:13:48'),(4854,178,2,12049,'6.99','2005-08-17 20:53:27','2006-02-15 22:13:48'),(4855,178,2,12727,'2.99','2005-08-18 21:45:15','2006-02-15 22:13:48'),(4856,178,1,13127,'2.99','2005-08-19 12:04:03','2006-02-15 22:13:48'),(4857,178,1,14104,'4.99','2005-08-21 00:37:44','2006-02-15 22:13:48'),(4858,178,1,14257,'7.99','2005-08-21 05:52:57','2006-02-15 22:13:48'),(4859,178,2,14314,'2.99','2005-08-21 07:50:14','2006-02-15 22:13:48'),(4860,178,1,15323,'4.99','2005-08-22 20:22:40','2006-02-15 22:13:48'),(4861,178,1,12897,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:48'),(4862,179,1,502,'0.99','2005-05-28 01:34:43','2006-02-15 22:13:48'),(4863,179,1,759,'6.99','2005-05-29 10:57:57','2006-02-15 22:13:48'),(4864,179,1,1046,'4.99','2005-05-31 06:42:30','2006-02-15 22:13:48'),(4865,179,2,1286,'7.99','2005-06-15 08:41:13','2006-02-15 22:13:48'),(4866,179,1,2613,'4.99','2005-06-19 07:25:50','2006-02-15 22:13:48'),(4867,179,1,3671,'6.99','2005-07-06 09:01:29','2006-02-15 22:13:48'),(4868,179,1,3844,'0.99','2005-07-06 16:37:58','2006-02-15 22:13:48'),(4869,179,1,4618,'2.99','2005-07-08 08:00:20','2006-02-15 22:13:48'),(4870,179,2,6071,'6.99','2005-07-11 04:50:03','2006-02-15 22:13:48'),(4871,179,1,6616,'7.99','2005-07-12 08:37:30','2006-02-15 22:13:48'),(4872,179,1,6806,'2.99','2005-07-12 17:31:43','2006-02-15 22:13:48'),(4873,179,1,7028,'6.99','2005-07-27 02:54:25','2006-02-15 22:13:48'),(4874,179,1,7054,'4.99','2005-07-27 03:43:28','2006-02-15 22:13:48'),(4875,179,1,7609,'4.99','2005-07-28 00:11:00','2006-02-15 22:13:48'),(4876,179,1,8573,'2.99','2005-07-29 11:51:25','2006-02-15 22:13:49'),(4877,179,1,8731,'8.99','2005-07-29 18:23:57','2006-02-15 22:13:49'),(4878,179,2,9491,'4.99','2005-07-30 23:45:23','2006-02-15 22:13:49'),(4879,179,2,9893,'0.99','2005-07-31 14:07:21','2006-02-15 22:13:49'),(4880,179,1,10156,'4.99','2005-07-31 22:36:00','2006-02-15 22:13:49'),(4881,179,1,10385,'4.99','2005-08-01 06:39:55','2006-02-15 22:13:49'),(4882,179,2,10569,'3.99','2005-08-01 13:18:23','2006-02-15 22:13:49'),(4883,179,1,11342,'0.99','2005-08-02 17:11:35','2006-02-15 22:13:49'),(4884,179,2,13240,'0.99','2005-08-19 16:22:14','2006-02-15 22:13:49'),(4885,179,1,13400,'4.99','2005-08-19 22:11:44','2006-02-15 22:13:49'),(4886,179,2,13844,'7.99','2005-08-20 14:30:26','2006-02-15 22:13:49'),(4887,179,2,13957,'0.99','2005-08-20 18:09:04','2006-02-15 22:13:49'),(4888,179,2,14082,'7.99','2005-08-20 23:42:00','2006-02-15 22:13:49'),(4889,179,1,14589,'0.99','2005-08-21 17:28:55','2006-02-15 22:13:49'),(4890,179,1,15985,'4.99','2005-08-23 20:20:23','2006-02-15 22:13:49'),(4891,180,1,1122,'2.99','2005-05-31 16:39:33','2006-02-15 22:13:49'),(4892,180,2,2700,'2.99','2005-06-19 13:31:52','2006-02-15 22:13:49'),(4893,180,1,2798,'2.99','2005-06-19 19:07:48','2006-02-15 22:13:49'),(4894,180,2,4826,'7.99','2005-07-08 17:44:25','2006-02-15 22:13:49'),(4895,180,1,4924,'9.99','2005-07-08 21:55:25','2006-02-15 22:13:49'),(4896,180,2,5384,'0.99','2005-07-09 19:17:46','2006-02-15 22:13:49'),(4897,180,2,5773,'0.99','2005-07-10 13:31:09','2006-02-15 22:13:49'),(4898,180,1,5860,'3.99','2005-07-10 18:08:49','2006-02-15 22:13:49'),(4899,180,1,7274,'2.99','2005-07-27 11:35:34','2006-02-15 22:13:49'),(4900,180,2,8540,'2.99','2005-07-29 10:52:51','2006-02-15 22:13:49'),(4901,180,2,8720,'5.99','2005-07-29 17:48:32','2006-02-15 22:13:49'),(4902,180,1,9373,'0.99','2005-07-30 19:05:36','2006-02-15 22:13:49'),(4903,180,2,9995,'3.99','2005-07-31 17:30:47','2006-02-15 22:13:49'),(4904,180,1,10576,'5.99','2005-08-01 13:46:02','2006-02-15 22:13:49'),(4905,180,1,10992,'8.99','2005-08-02 04:41:17','2006-02-15 22:13:49'),(4906,180,1,12313,'8.99','2005-08-18 06:07:31','2006-02-15 22:13:49'),(4907,180,1,13283,'2.99','2005-08-19 18:10:19','2006-02-15 22:13:49'),(4908,180,2,13842,'4.99','2005-08-20 14:29:37','2006-02-15 22:13:49'),(4909,180,1,13994,'2.99','2005-08-20 19:33:21','2006-02-15 22:13:49'),(4910,180,1,14109,'0.99','2005-08-21 00:52:58','2006-02-15 22:13:49'),(4911,180,1,14851,'2.99','2005-08-22 02:20:44','2006-02-15 22:13:49'),(4912,180,1,15039,'4.99','2005-08-22 09:37:54','2006-02-15 22:13:49'),(4913,180,1,12901,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:49'),(4914,181,2,579,'6.99','2005-05-28 11:19:23','2006-02-15 22:13:49'),(4915,181,1,1638,'2.99','2005-06-16 08:32:36','2006-02-15 22:13:50'),(4916,181,1,2645,'5.99','2005-06-19 09:50:35','2006-02-15 22:13:50'),(4917,181,2,3449,'5.99','2005-06-21 21:01:27','2006-02-15 22:13:50'),(4918,181,2,3469,'4.99','2005-06-21 22:48:59','2006-02-15 22:13:50'),(4919,181,1,3862,'6.99','2005-07-06 17:35:22','2006-02-15 22:13:50'),(4920,181,2,4428,'4.99','2005-07-07 22:29:40','2006-02-15 22:13:50'),(4921,181,2,6477,'4.99','2005-07-12 01:38:42','2006-02-15 22:13:50'),(4922,181,1,6946,'8.99','2005-07-26 23:40:07','2006-02-15 22:13:50'),(4923,181,1,7393,'0.99','2005-07-27 16:02:52','2006-02-15 22:13:50'),(4924,181,1,7632,'4.99','2005-07-28 01:02:40','2006-02-15 22:13:50'),(4925,181,1,8593,'5.99','2005-07-29 12:38:14','2006-02-15 22:13:50'),(4926,181,1,8601,'9.99','2005-07-29 13:03:31','2006-02-15 22:13:50'),(4927,181,2,9214,'4.99','2005-07-30 13:10:14','2006-02-15 22:13:50'),(4928,181,2,9235,'5.99','2005-07-30 13:47:17','2006-02-15 22:13:50'),(4929,181,1,9357,'8.99','2005-07-30 18:37:00','2006-02-15 22:13:50'),(4930,181,1,9844,'4.99','2005-07-31 12:26:31','2006-02-15 22:13:50'),(4931,181,2,10262,'4.99','2005-08-01 03:01:26','2006-02-15 22:13:50'),(4932,181,2,10362,'6.99','2005-08-01 05:55:13','2006-02-15 22:13:50'),(4933,181,2,10703,'2.99','2005-08-01 18:37:39','2006-02-15 22:13:50'),(4934,181,1,10748,'4.99','2005-08-01 20:01:24','2006-02-15 22:13:50'),(4935,181,1,10773,'6.99','2005-08-01 20:53:45','2006-02-15 22:13:50'),(4936,181,2,11224,'4.99','2005-08-02 12:40:38','2006-02-15 22:13:50'),(4937,181,1,12363,'7.99','2005-08-18 07:52:49','2006-02-15 22:13:50'),(4938,181,1,12411,'0.99','2005-08-18 09:47:57','2006-02-15 22:13:50'),(4939,181,1,12678,'2.99','2005-08-18 19:41:27','2006-02-15 22:13:50'),(4940,181,2,12939,'2.99','2005-08-19 05:38:25','2006-02-15 22:13:50'),(4941,181,2,13118,'4.99','2005-08-19 11:39:58','2006-02-15 22:13:50'),(4942,181,2,13405,'4.99','2005-08-19 22:20:49','2006-02-15 22:13:50'),(4943,181,2,13415,'2.99','2005-08-19 22:48:09','2006-02-15 22:13:50'),(4944,181,2,14406,'3.99','2005-08-21 10:46:35','2006-02-15 22:13:50'),(4945,181,2,15196,'2.99','2005-08-22 16:11:32','2006-02-15 22:13:50'),(4946,181,2,15482,'4.99','2005-08-23 02:01:20','2006-02-15 22:13:50'),(4947,181,2,13008,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:50'),(4948,182,2,161,'0.99','2005-05-26 01:51:48','2006-02-15 22:13:50'),(4949,182,2,425,'3.99','2005-05-27 15:51:30','2006-02-15 22:13:50'),(4950,182,2,1542,'3.99','2005-06-16 01:20:05','2006-02-15 22:13:50'),(4951,182,1,2049,'2.99','2005-06-17 14:58:36','2006-02-15 22:13:50'),(4952,182,2,2120,'5.99','2005-06-17 20:36:50','2006-02-15 22:13:51'),(4953,182,1,2234,'0.99','2005-06-18 04:01:28','2006-02-15 22:13:51'),(4954,182,1,3509,'2.99','2005-07-06 00:24:57','2006-02-15 22:13:51'),(4955,182,1,3697,'6.99','2005-07-06 10:07:22','2006-02-15 22:13:51'),(4956,182,1,4174,'2.99','2005-07-07 09:59:49','2006-02-15 22:13:51'),(4957,182,1,4349,'0.99','2005-07-07 19:02:37','2006-02-15 22:13:51'),(4958,182,2,4513,'1.99','2005-07-08 02:39:59','2006-02-15 22:13:51'),(4959,182,2,4591,'3.99','2005-07-08 06:29:43','2006-02-15 22:13:51'),(4960,182,2,4784,'0.99','2005-07-08 16:09:56','2006-02-15 22:13:51'),(4961,182,1,5521,'2.99','2005-07-10 01:31:22','2006-02-15 22:13:51'),(4962,182,2,7229,'0.99','2005-07-27 10:00:54','2006-02-15 22:13:51'),(4963,182,2,7863,'0.99','2005-07-28 10:05:46','2006-02-15 22:13:51'),(4964,182,2,7880,'4.99','2005-07-28 10:30:37','2006-02-15 22:13:51'),(4965,182,2,8048,'8.99','2005-07-28 16:50:26','2006-02-15 22:13:51'),(4966,182,1,11055,'4.99','2005-08-02 06:36:05','2006-02-15 22:13:51'),(4967,182,2,11785,'3.99','2005-08-17 10:54:46','2006-02-15 22:13:51'),(4968,182,1,12573,'4.99','2005-08-18 15:32:57','2006-02-15 22:13:51'),(4969,182,1,12840,'6.99','2005-08-19 01:54:11','2006-02-15 22:13:51'),(4970,182,1,13285,'2.99','2005-08-19 18:18:44','2006-02-15 22:13:51'),(4971,182,1,14586,'5.99','2005-08-21 17:19:09','2006-02-15 22:13:51'),(4972,182,1,14953,'6.99','2005-08-22 06:23:54','2006-02-15 22:13:51'),(4973,182,1,15043,'1.99','2005-08-22 09:49:32','2006-02-15 22:13:51'),(4974,183,1,382,'0.99','2005-05-27 10:12:00','2006-02-15 22:13:51'),(4975,183,1,1279,'0.99','2005-06-15 08:13:57','2006-02-15 22:13:51'),(4976,183,2,2188,'1.99','2005-06-18 01:19:04','2006-02-15 22:13:51'),(4977,183,2,2471,'5.99','2005-06-18 20:31:00','2006-02-15 22:13:51'),(4978,183,1,3381,'5.99','2005-06-21 14:02:59','2006-02-15 22:13:51'),(4979,183,1,3869,'2.99','2005-07-06 17:56:46','2006-02-15 22:13:51'),(4980,183,2,4134,'0.99','2005-07-07 08:14:24','2006-02-15 22:13:51'),(4981,183,2,4157,'2.99','2005-07-07 09:04:26','2006-02-15 22:13:51'),(4982,183,1,5069,'1.99','2005-07-09 04:56:30','2006-02-15 22:13:51'),(4983,183,2,5756,'0.99','2005-07-10 12:39:28','2006-02-15 22:13:51'),(4984,183,1,6472,'4.99','2005-07-12 01:33:25','2006-02-15 22:13:51'),(4985,183,1,6569,'4.99','2005-07-12 05:47:40','2006-02-15 22:13:51'),(4986,183,2,7359,'0.99','2005-07-27 14:51:04','2006-02-15 22:13:51'),(4987,183,2,9672,'5.99','2005-07-31 06:34:06','2006-02-15 22:13:51'),(4988,183,1,9818,'4.99','2005-07-31 11:34:32','2006-02-15 22:13:51'),(4989,183,2,9931,'2.99','2005-07-31 15:18:19','2006-02-15 22:13:52'),(4990,183,2,10620,'5.99','2005-08-01 15:09:17','2006-02-15 22:13:52'),(4991,183,2,11386,'2.99','2005-08-02 18:24:03','2006-02-15 22:13:52'),(4992,183,2,12451,'0.99','2005-08-18 11:04:42','2006-02-15 22:13:52'),(4993,183,2,12764,'3.99','2005-08-18 23:14:15','2006-02-15 22:13:52'),(4994,183,2,12831,'3.99','2005-08-19 01:40:43','2006-02-15 22:13:52'),(4995,183,1,13482,'2.99','2005-08-20 01:14:30','2006-02-15 22:13:52'),(4996,183,1,13536,'4.99','2005-08-20 03:35:16','2006-02-15 22:13:52'),(4997,184,1,196,'2.99','2005-05-26 06:55:58','2006-02-15 22:13:52'),(4998,184,2,534,'4.99','2005-05-28 06:15:25','2006-02-15 22:13:52'),(4999,184,1,567,'1.99','2005-05-28 09:56:20','2006-02-15 22:13:52'),(5000,184,2,1976,'2.99','2005-06-17 09:38:08','2006-02-15 22:13:52'),(5001,184,1,2312,'0.99','2005-06-18 08:55:46','2006-02-15 22:13:52'),(5002,184,1,4314,'0.99','2005-07-07 17:38:31','2006-02-15 22:13:52'),(5003,184,2,4882,'6.99','2005-07-08 19:42:03','2006-02-15 22:13:52'),(5004,184,1,5891,'0.99','2005-07-10 20:01:17','2006-02-15 22:13:52'),(5005,184,2,6493,'2.99','2005-07-12 02:40:41','2006-02-15 22:13:52'),(5006,184,2,6700,'6.99','2005-07-12 12:47:22','2006-02-15 22:13:52'),(5007,184,2,7051,'4.99','2005-07-27 03:34:37','2006-02-15 22:13:52'),(5008,184,2,7686,'6.99','2005-07-28 03:19:23','2006-02-15 22:13:52'),(5009,184,1,8892,'4.99','2005-07-30 00:47:03','2006-02-15 22:13:52'),(5010,184,1,9162,'0.99','2005-07-30 11:21:56','2006-02-15 22:13:52'),(5011,184,2,12166,'9.99','2005-08-18 00:57:06','2006-02-15 22:13:52'),(5012,184,2,12454,'2.99','2005-08-18 11:19:02','2006-02-15 22:13:52'),(5013,184,1,12532,'2.99','2005-08-18 13:57:58','2006-02-15 22:13:52'),(5014,184,1,13134,'0.99','2005-08-19 12:14:14','2006-02-15 22:13:52'),(5015,184,1,13262,'5.99','2005-08-19 17:20:15','2006-02-15 22:13:52'),(5016,184,1,13303,'4.99','2005-08-19 18:55:21','2006-02-15 22:13:52'),(5017,184,2,14472,'4.99','2005-08-21 13:13:57','2006-02-15 22:13:52'),(5018,184,1,14801,'5.99','2005-08-22 00:46:54','2006-02-15 22:13:53'),(5019,184,2,15611,'0.99','2005-08-23 06:56:18','2006-02-15 22:13:53'),(5020,185,2,20,'2.99','2005-05-25 01:48:41','2006-02-15 22:13:53'),(5021,185,2,154,'0.99','2005-05-26 00:55:56','2006-02-15 22:13:53'),(5022,185,1,646,'0.99','2005-05-28 19:16:14','2006-02-15 22:13:53'),(5023,185,1,2459,'4.99','2005-06-18 19:44:08','2006-02-15 22:13:53'),(5024,185,1,3314,'4.99','2005-06-21 08:17:00','2006-02-15 22:13:53'),(5025,185,1,3325,'4.99','2005-06-21 08:51:44','2006-02-15 22:13:53'),(5026,185,1,4186,'9.99','2005-07-07 10:32:25','2006-02-15 22:13:53'),(5027,185,1,4524,'2.99','2005-07-08 03:10:48','2006-02-15 22:13:53'),(5028,185,2,4822,'7.99','2005-07-08 17:28:47','2006-02-15 22:13:53'),(5029,185,2,6106,'2.99','2005-07-11 07:05:06','2006-02-15 22:13:53'),(5030,185,1,6418,'1.99','2005-07-11 23:36:27','2006-02-15 22:13:53'),(5031,185,1,6965,'2.99','2005-07-27 00:15:18','2006-02-15 22:13:53'),(5032,185,1,7066,'4.99','2005-07-27 03:53:52','2006-02-15 22:13:53'),(5033,185,1,8200,'2.99','2005-07-28 23:10:46','2006-02-15 22:13:53'),(5034,185,2,8442,'0.99','2005-07-29 07:33:07','2006-02-15 22:13:53'),(5035,185,1,8684,'8.99','2005-07-29 16:16:33','2006-02-15 22:13:53'),(5036,185,2,9246,'0.99','2005-07-30 14:12:31','2006-02-15 22:13:53'),(5037,185,2,9473,'2.99','2005-07-30 23:04:13','2006-02-15 22:13:53'),(5038,185,2,11355,'0.99','2005-08-02 17:37:43','2006-02-15 22:13:53'),(5039,185,1,12312,'2.99','2005-08-18 06:07:26','2006-02-15 22:13:53'),(5040,185,1,12674,'5.99','2005-08-18 19:24:56','2006-02-15 22:13:53'),(5041,185,1,12885,'0.99','2005-08-19 03:37:25','2006-02-15 22:13:53'),(5042,185,2,14513,'2.99','2005-08-21 14:51:35','2006-02-15 22:13:53'),(5043,186,1,581,'1.99','2005-05-28 11:20:29','2006-02-15 22:13:53'),(5044,186,2,958,'0.99','2005-05-30 17:58:03','2006-02-15 22:13:53'),(5045,186,1,1192,'4.99','2005-06-15 01:18:39','2006-02-15 22:13:53'),(5046,186,1,1300,'2.99','2005-06-15 09:36:19','2006-02-15 22:13:53'),(5047,186,1,1663,'2.99','2005-06-16 10:14:15','2006-02-15 22:13:53'),(5048,186,2,2132,'4.99','2005-06-17 21:05:06','2006-02-15 22:13:53'),(5049,186,2,2875,'4.99','2005-06-20 00:47:18','2006-02-15 22:13:53'),(5050,186,1,3039,'4.99','2005-06-20 12:32:30','2006-02-15 22:13:53'),(5051,186,2,6067,'4.99','2005-07-11 04:34:49','2006-02-15 22:13:53'),(5052,186,2,7739,'0.99','2005-07-28 05:21:51','2006-02-15 22:13:54'),(5053,186,1,7915,'3.99','2005-07-28 11:49:46','2006-02-15 22:13:54'),(5054,186,1,8483,'4.99','2005-07-29 08:50:18','2006-02-15 22:13:54'),(5055,186,2,8872,'0.99','2005-07-30 00:13:54','2006-02-15 22:13:54'),(5056,186,2,9303,'2.99','2005-07-30 16:35:59','2006-02-15 22:13:54'),(5057,186,2,9360,'5.99','2005-07-30 18:39:43','2006-02-15 22:13:54'),(5058,186,1,10104,'1.99','2005-07-31 20:49:14','2006-02-15 22:13:54'),(5059,186,1,10985,'0.99','2005-08-02 04:30:19','2006-02-15 22:13:54'),(5060,186,1,11982,'0.99','2005-08-17 18:13:07','2006-02-15 22:13:54'),(5061,186,1,12348,'5.99','2005-08-18 07:21:47','2006-02-15 22:13:54'),(5062,186,1,12438,'8.99','2005-08-18 10:42:52','2006-02-15 22:13:54'),(5063,186,1,13168,'6.99','2005-08-19 13:37:28','2006-02-15 22:13:54'),(5064,186,2,13517,'4.99','2005-08-20 02:33:17','2006-02-15 22:13:54'),(5065,186,1,13853,'3.99','2005-08-20 14:47:02','2006-02-15 22:13:54'),(5066,186,1,14006,'2.99','2005-08-20 20:21:36','2006-02-15 22:13:54'),(5067,186,2,14229,'4.99','2005-08-21 04:57:15','2006-02-15 22:13:54'),(5068,186,2,14646,'4.99','2005-08-21 19:14:48','2006-02-15 22:13:54'),(5069,186,2,14988,'3.99','2005-08-22 07:46:05','2006-02-15 22:13:54'),(5070,186,2,15001,'0.99','2005-08-22 08:00:49','2006-02-15 22:13:54'),(5071,186,2,15295,'3.99','2005-08-22 19:36:21','2006-02-15 22:13:54'),(5072,186,1,15596,'0.99','2005-08-23 06:19:51','2006-02-15 22:13:54'),(5073,186,1,14216,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:54'),(5074,187,1,252,'7.99','2005-05-26 14:39:53','2006-02-15 22:13:54'),(5075,187,2,1323,'6.99','2005-06-15 10:55:17','2006-02-15 22:13:54'),(5076,187,2,1462,'4.99','2005-06-15 20:37:40','2006-02-15 22:13:54'),(5077,187,2,1592,'0.99','2005-06-16 05:14:37','2006-02-15 22:13:54'),(5078,187,2,2127,'0.99','2005-06-17 20:54:48','2006-02-15 22:13:54'),(5079,187,2,2533,'0.99','2005-06-19 01:34:26','2006-02-15 22:13:54'),(5080,187,1,2742,'5.99','2005-06-19 16:05:47','2006-02-15 22:13:54'),(5081,187,1,3402,'2.99','2005-06-21 15:54:37','2006-02-15 22:13:54'),(5082,187,2,3709,'10.99','2005-07-06 10:26:56','2006-02-15 22:13:54'),(5083,187,1,4429,'4.99','2005-07-07 22:32:47','2006-02-15 22:13:54'),(5084,187,2,5366,'0.99','2005-07-09 18:28:37','2006-02-15 22:13:54'),(5085,187,1,5738,'8.99','2005-07-10 11:50:51','2006-02-15 22:13:54'),(5086,187,2,5833,'6.99','2005-07-10 16:39:24','2006-02-15 22:13:54'),(5087,187,1,6057,'3.99','2005-07-11 04:03:40','2006-02-15 22:13:54'),(5088,187,2,6428,'2.99','2005-07-12 00:01:51','2006-02-15 22:13:54'),(5089,187,2,7289,'4.99','2005-07-27 12:26:51','2006-02-15 22:13:55'),(5090,187,2,7844,'7.99','2005-07-28 09:16:19','2006-02-15 22:13:55'),(5091,187,2,7967,'7.99','2005-07-28 13:56:51','2006-02-15 22:13:55'),(5092,187,1,9241,'2.99','2005-07-30 13:58:41','2006-02-15 22:13:55'),(5093,187,1,11843,'2.99','2005-08-17 13:14:50','2006-02-15 22:13:55'),(5094,187,2,12307,'8.99','2005-08-18 05:48:23','2006-02-15 22:13:55'),(5095,187,2,12490,'9.99','2005-08-18 12:48:45','2006-02-15 22:13:55'),(5096,187,1,12534,'7.99','2005-08-18 14:04:41','2006-02-15 22:13:55'),(5097,187,2,13940,'8.99','2005-08-20 17:28:57','2006-02-15 22:13:55'),(5098,187,2,14855,'8.99','2005-08-22 02:27:32','2006-02-15 22:13:55'),(5099,187,2,15231,'4.99','2005-08-22 17:32:57','2006-02-15 22:13:55'),(5100,187,2,15517,'2.99','2005-08-23 03:13:01','2006-02-15 22:13:55'),(5101,187,2,15971,'7.99','2005-08-23 19:59:33','2006-02-15 22:13:55'),(5102,188,2,1527,'2.99','2005-06-16 00:31:40','2006-02-15 22:13:55'),(5103,188,2,1927,'0.99','2005-06-17 06:48:19','2006-02-15 22:13:55'),(5104,188,1,2515,'4.99','2005-06-18 23:57:31','2006-02-15 22:13:55'),(5105,188,2,2733,'4.99','2005-06-19 15:21:53','2006-02-15 22:13:55'),(5106,188,2,3848,'3.99','2005-07-06 16:47:32','2006-02-15 22:13:55'),(5107,188,2,4150,'2.99','2005-07-07 08:43:22','2006-02-15 22:13:55'),(5108,188,2,5356,'2.99','2005-07-09 18:08:28','2006-02-15 22:13:55'),(5109,188,2,5729,'5.99','2005-07-10 11:27:25','2006-02-15 22:13:55'),(5110,188,2,6555,'4.99','2005-07-12 05:08:16','2006-02-15 22:13:55'),(5111,188,2,7042,'0.99','2005-07-27 03:20:18','2006-02-15 22:13:55'),(5112,188,1,7556,'4.99','2005-07-27 22:17:17','2006-02-15 22:13:55'),(5113,188,2,9613,'4.99','2005-07-31 03:58:53','2006-02-15 22:13:55'),(5114,188,2,10453,'5.99','2005-08-01 09:13:27','2006-02-15 22:13:55'),(5115,188,1,10494,'0.99','2005-08-01 10:45:21','2006-02-15 22:13:55'),(5116,188,2,10719,'4.99','2005-08-01 19:00:28','2006-02-15 22:13:55'),(5117,188,2,10757,'4.99','2005-08-01 20:22:44','2006-02-15 22:13:55'),(5118,188,2,11378,'2.99','2005-08-02 18:16:52','2006-02-15 22:13:55'),(5119,188,1,13570,'2.99','2005-08-20 05:04:57','2006-02-15 22:13:55'),(5120,188,1,13787,'5.99','2005-08-20 12:15:23','2006-02-15 22:13:55'),(5121,188,1,14399,'2.99','2005-08-21 10:33:23','2006-02-15 22:13:55'),(5122,188,2,14809,'2.99','2005-08-22 01:00:42','2006-02-15 22:13:55'),(5123,188,2,15319,'2.99','2005-08-22 20:17:17','2006-02-15 22:13:55'),(5124,188,2,15409,'0.99','2005-08-22 23:26:32','2006-02-15 22:13:55'),(5125,188,2,15474,'4.99','2005-08-23 01:39:10','2006-02-15 22:13:55'),(5126,188,1,14503,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:56'),(5127,189,2,1117,'5.99','2005-05-31 16:15:31','2006-02-15 22:13:56'),(5128,189,1,1541,'0.99','2005-06-16 01:15:59','2006-02-15 22:13:56'),(5129,189,1,1834,'0.99','2005-06-16 22:49:08','2006-02-15 22:13:56'),(5130,189,2,2905,'1.99','2005-06-20 02:56:16','2006-02-15 22:13:56'),(5131,189,1,3108,'6.99','2005-06-20 17:28:43','2006-02-15 22:13:56'),(5132,189,1,3346,'2.99','2005-06-21 11:06:53','2006-02-15 22:13:56'),(5133,189,1,3763,'0.99','2005-07-06 12:56:31','2006-02-15 22:13:56'),(5134,189,2,3813,'4.99','2005-07-06 15:23:34','2006-02-15 22:13:56'),(5135,189,2,4203,'0.99','2005-07-07 11:24:14','2006-02-15 22:13:56'),(5136,189,1,6193,'5.99','2005-07-11 11:46:57','2006-02-15 22:13:56'),(5137,189,1,7469,'4.99','2005-07-27 18:57:40','2006-02-15 22:13:56'),(5138,189,1,7675,'4.99','2005-07-28 02:55:20','2006-02-15 22:13:56'),(5139,189,2,7790,'2.99','2005-07-28 07:22:35','2006-02-15 22:13:56'),(5140,189,2,9171,'5.99','2005-07-30 11:36:24','2006-02-15 22:13:56'),(5141,189,2,9386,'0.99','2005-07-30 19:26:21','2006-02-15 22:13:56'),(5142,189,1,9506,'4.99','2005-07-31 00:19:01','2006-02-15 22:13:56'),(5143,189,1,10247,'9.99','2005-08-01 02:34:06','2006-02-15 22:13:56'),(5144,189,2,11059,'6.99','2005-08-02 06:41:38','2006-02-15 22:13:56'),(5145,189,2,13601,'6.99','2005-08-20 06:01:15','2006-02-15 22:13:56'),(5146,189,1,13766,'3.99','2005-08-20 11:42:01','2006-02-15 22:13:56'),(5147,189,1,15773,'1.99','2005-08-23 13:24:57','2006-02-15 22:13:56'),(5148,189,1,16008,'5.99','2005-08-23 21:04:51','2006-02-15 22:13:56'),(5149,190,2,430,'4.99','2005-05-27 16:22:10','2006-02-15 22:13:56'),(5150,190,1,693,'2.99','2005-05-29 01:42:31','2006-02-15 22:13:56'),(5151,190,1,1319,'2.99','2005-06-15 10:39:05','2006-02-15 22:13:56'),(5152,190,1,1347,'2.99','2005-06-15 12:43:43','2006-02-15 22:13:56'),(5153,190,1,2057,'4.99','2005-06-17 15:31:58','2006-02-15 22:13:56'),(5154,190,1,2568,'3.99','2005-06-19 04:09:03','2006-02-15 22:13:56'),(5155,190,1,3386,'4.99','2005-06-21 14:21:06','2006-02-15 22:13:56'),(5156,190,2,4005,'5.99','2005-07-07 00:22:26','2006-02-15 22:13:56'),(5157,190,1,4140,'2.99','2005-07-07 08:19:10','2006-02-15 22:13:56'),(5158,190,2,6867,'3.99','2005-07-12 20:06:47','2006-02-15 22:13:56'),(5159,190,1,7175,'4.99','2005-07-27 08:03:22','2006-02-15 22:13:56'),(5160,190,1,7386,'5.99','2005-07-27 15:52:10','2006-02-15 22:13:56'),(5161,190,2,7404,'2.99','2005-07-27 16:24:43','2006-02-15 22:13:56'),(5162,190,1,8498,'0.99','2005-07-29 09:07:38','2006-02-15 22:13:57'),(5163,190,1,11082,'5.99','2005-08-02 07:30:19','2006-02-15 22:13:57'),(5164,190,2,11158,'6.99','2005-08-02 09:58:28','2006-02-15 22:13:57'),(5165,190,2,11276,'4.99','2005-08-02 14:28:46','2006-02-15 22:13:57'),(5166,190,2,11312,'6.99','2005-08-02 15:56:51','2006-02-15 22:13:57'),(5167,190,2,11750,'0.99','2005-08-17 09:07:00','2006-02-15 22:13:57'),(5168,190,2,11950,'9.99','2005-08-17 17:13:16','2006-02-15 22:13:57'),(5169,190,1,12270,'2.99','2005-08-18 04:32:05','2006-02-15 22:13:57'),(5170,190,2,12381,'0.99','2005-08-18 08:31:43','2006-02-15 22:13:57'),(5171,190,2,14065,'0.99','2005-08-20 22:40:47','2006-02-15 22:13:57'),(5172,190,2,14141,'4.99','2005-08-21 02:07:22','2006-02-15 22:13:57'),(5173,190,2,14166,'2.99','2005-08-21 02:59:31','2006-02-15 22:13:57'),(5174,190,2,14650,'0.99','2005-08-21 19:24:51','2006-02-15 22:13:57'),(5175,190,2,15167,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:57'),(5176,191,1,1134,'2.99','2005-05-31 19:14:15','2006-02-15 22:13:57'),(5177,191,2,1152,'4.99','2005-05-31 21:32:17','2006-02-15 22:13:57'),(5178,191,2,1173,'2.99','2005-06-14 23:54:46','2006-02-15 22:13:57'),(5179,191,1,1278,'0.99','2005-06-15 08:09:12','2006-02-15 22:13:57'),(5180,191,1,1677,'2.99','2005-06-16 11:07:11','2006-02-15 22:13:57'),(5181,191,2,1870,'2.99','2005-06-17 02:24:36','2006-02-15 22:13:57'),(5182,191,1,2051,'4.99','2005-06-17 15:10:16','2006-02-15 22:13:57'),(5183,191,2,2555,'2.99','2005-06-19 03:07:02','2006-02-15 22:13:57'),(5184,191,1,5338,'2.99','2005-07-09 17:07:07','2006-02-15 22:13:57'),(5185,191,2,5397,'5.99','2005-07-09 19:43:51','2006-02-15 22:13:57'),(5186,191,1,5924,'5.99','2005-07-10 21:41:23','2006-02-15 22:13:57'),(5187,191,1,7150,'6.99','2005-07-27 07:11:14','2006-02-15 22:13:57'),(5188,191,1,7450,'3.99','2005-07-27 18:18:35','2006-02-15 22:13:57'),(5189,191,1,7520,'2.99','2005-07-27 21:02:02','2006-02-15 22:13:57'),(5190,191,2,8583,'0.99','2005-07-29 12:04:50','2006-02-15 22:13:57'),(5191,191,1,9297,'4.99','2005-07-30 16:26:29','2006-02-15 22:13:57'),(5192,191,1,9964,'4.99','2005-07-31 16:17:39','2006-02-15 22:13:57'),(5193,191,2,10532,'2.99','2005-08-01 12:06:35','2006-02-15 22:13:57'),(5194,191,2,15375,'4.99','2005-08-22 22:12:02','2006-02-15 22:13:57'),(5195,191,1,14361,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:57'),(5196,192,1,895,'1.99','2005-05-30 08:50:43','2006-02-15 22:13:57'),(5197,192,1,2760,'3.99','2005-06-19 17:16:33','2006-02-15 22:13:57'),(5198,192,1,3902,'2.99','2005-07-06 19:25:18','2006-02-15 22:13:57'),(5199,192,1,4469,'4.99','2005-07-08 00:18:32','2006-02-15 22:13:57'),(5200,192,1,5400,'2.99','2005-07-09 19:56:40','2006-02-15 22:13:58'),(5201,192,2,6223,'0.99','2005-07-11 13:27:09','2006-02-15 22:13:58'),(5202,192,2,6691,'0.99','2005-07-12 12:26:38','2006-02-15 22:13:58'),(5203,192,2,7147,'2.99','2005-07-27 07:02:34','2006-02-15 22:13:58'),(5204,192,2,8051,'0.99','2005-07-28 16:56:16','2006-02-15 22:13:58'),(5205,192,2,8292,'7.99','2005-07-29 02:29:36','2006-02-15 22:13:58'),(5206,192,1,9462,'7.99','2005-07-30 22:30:44','2006-02-15 22:13:58'),(5207,192,1,9831,'2.99','2005-07-31 11:59:32','2006-02-15 22:13:58'),(5208,192,2,10238,'0.99','2005-08-01 02:08:05','2006-02-15 22:13:58'),(5209,192,1,10843,'7.99','2005-08-01 23:43:03','2006-02-15 22:13:58'),(5210,192,1,11385,'4.99','2005-08-02 18:23:11','2006-02-15 22:13:58'),(5211,192,1,11815,'4.99','2005-08-17 12:13:26','2006-02-15 22:13:58'),(5212,192,1,13125,'5.99','2005-08-19 11:57:49','2006-02-15 22:13:58'),(5213,192,2,14146,'4.99','2005-08-21 02:13:31','2006-02-15 22:13:58'),(5214,192,2,14238,'7.99','2005-08-21 05:16:40','2006-02-15 22:13:58'),(5215,192,1,14404,'4.99','2005-08-21 10:43:04','2006-02-15 22:13:58'),(5216,192,2,14692,'6.99','2005-08-21 20:43:21','2006-02-15 22:13:58'),(5217,192,2,15855,'2.99','2005-08-23 15:59:01','2006-02-15 22:13:58'),(5218,192,1,11611,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:58'),(5219,193,2,273,'2.99','2005-05-26 16:29:36','2006-02-15 22:13:58'),(5220,193,2,464,'0.99','2005-05-27 20:42:44','2006-02-15 22:13:58'),(5221,193,1,1325,'4.99','2005-06-15 11:03:24','2006-02-15 22:13:58'),(5222,193,2,2377,'6.99','2005-06-18 14:56:23','2006-02-15 22:13:58'),(5223,193,2,2841,'6.99','2005-06-19 22:21:06','2006-02-15 22:13:58'),(5224,193,2,2846,'4.99','2005-06-19 22:52:14','2006-02-15 22:13:58'),(5225,193,2,2880,'2.99','2005-06-20 01:24:54','2006-02-15 22:13:58'),(5226,193,1,3297,'8.99','2005-06-21 07:08:19','2006-02-15 22:13:58'),(5227,193,1,4892,'6.99','2005-07-08 20:06:25','2006-02-15 22:13:58'),(5228,193,1,8211,'2.99','2005-07-28 23:34:22','2006-02-15 22:13:58'),(5229,193,1,8379,'4.99','2005-07-29 05:29:40','2006-02-15 22:13:58'),(5230,193,1,8431,'4.99','2005-07-29 07:12:48','2006-02-15 22:13:58'),(5231,193,1,9079,'2.99','2005-07-30 08:02:00','2006-02-15 22:13:58'),(5232,193,1,9575,'4.99','2005-07-31 02:51:53','2006-02-15 22:13:58'),(5233,193,2,10462,'2.99','2005-08-01 09:38:28','2006-02-15 22:13:58'),(5234,193,2,12384,'0.99','2005-08-18 08:36:58','2006-02-15 22:13:58'),(5235,193,2,12658,'4.99','2005-08-18 19:05:42','2006-02-15 22:13:58'),(5236,193,1,13529,'2.99','2005-08-20 03:07:47','2006-02-15 22:13:58'),(5237,193,1,13608,'0.99','2005-08-20 06:10:44','2006-02-15 22:13:59'),(5238,193,1,14679,'2.99','2005-08-21 20:14:58','2006-02-15 22:13:59'),(5239,193,1,14927,'4.99','2005-08-22 05:31:53','2006-02-15 22:13:59'),(5240,193,2,15164,'4.99','2005-08-22 14:47:53','2006-02-15 22:13:59'),(5241,193,2,15344,'6.99','2005-08-22 21:01:48','2006-02-15 22:13:59'),(5242,193,2,15495,'5.99','2005-08-23 02:26:10','2006-02-15 22:13:59'),(5243,193,2,15729,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:59'),(5244,194,2,334,'4.99','2005-05-27 03:03:07','2006-02-15 22:13:59'),(5245,194,2,677,'7.99','2005-05-28 23:00:08','2006-02-15 22:13:59'),(5246,194,1,1430,'0.99','2005-06-15 18:24:55','2006-02-15 22:13:59'),(5247,194,1,2245,'7.99','2005-06-18 04:52:59','2006-02-15 22:13:59'),(5248,194,1,2347,'2.99','2005-06-18 12:12:29','2006-02-15 22:13:59'),(5249,194,1,2463,'3.99','2005-06-18 20:01:43','2006-02-15 22:13:59'),(5250,194,1,2807,'3.99','2005-06-19 19:32:53','2006-02-15 22:13:59'),(5251,194,2,4231,'7.99','2005-07-07 12:48:19','2006-02-15 22:13:59'),(5252,194,2,5146,'2.99','2005-07-09 08:14:58','2006-02-15 22:13:59'),(5253,194,1,5291,'2.99','2005-07-09 15:15:02','2006-02-15 22:13:59'),(5254,194,2,5894,'3.99','2005-07-10 20:09:34','2006-02-15 22:13:59'),(5255,194,1,9064,'7.99','2005-07-30 07:24:55','2006-02-15 22:13:59'),(5256,194,2,11475,'5.99','2005-08-02 21:55:09','2006-02-15 22:13:59'),(5257,194,2,12851,'3.99','2005-08-19 02:12:12','2006-02-15 22:13:59'),(5258,194,1,13515,'0.99','2005-08-20 02:29:47','2006-02-15 22:13:59'),(5259,194,2,13616,'7.99','2005-08-20 06:30:33','2006-02-15 22:13:59'),(5260,194,1,14440,'4.99','2005-08-21 11:59:04','2006-02-15 22:13:59'),(5261,194,2,15937,'4.99','2005-08-23 18:43:22','2006-02-15 22:13:59'),(5262,195,1,4234,'6.99','2005-07-07 13:01:35','2006-02-15 22:13:59'),(5263,195,1,4315,'2.99','2005-07-07 17:40:26','2006-02-15 22:13:59'),(5264,195,1,5228,'4.99','2005-07-09 12:26:01','2006-02-15 22:13:59'),(5265,195,1,5536,'0.99','2005-07-10 02:29:42','2006-02-15 22:13:59'),(5266,195,2,6175,'4.99','2005-07-11 10:44:37','2006-02-15 22:13:59'),(5267,195,1,7349,'2.99','2005-07-27 14:33:00','2006-02-15 22:13:59'),(5268,195,2,8280,'4.99','2005-07-29 01:45:51','2006-02-15 22:13:59'),(5269,195,2,8479,'0.99','2005-07-29 08:42:04','2006-02-15 22:13:59'),(5270,195,2,9188,'6.99','2005-07-30 12:19:54','2006-02-15 22:13:59'),(5271,195,1,9870,'5.99','2005-07-31 13:22:51','2006-02-15 22:13:59'),(5272,195,1,9994,'4.99','2005-07-31 17:30:31','2006-02-15 22:13:59'),(5273,195,2,10911,'4.99','2005-08-02 01:58:36','2006-02-15 22:14:00'),(5274,195,1,11201,'7.99','2005-08-02 11:49:16','2006-02-15 22:14:00'),(5275,195,2,11787,'2.99','2005-08-17 10:59:00','2006-02-15 22:14:00'),(5276,195,2,12099,'0.99','2005-08-17 22:38:54','2006-02-15 22:14:00'),(5277,195,2,12941,'0.99','2005-08-19 05:39:26','2006-02-15 22:14:00'),(5278,195,2,13741,'0.99','2005-08-20 10:48:47','2006-02-15 22:14:00'),(5279,195,2,14751,'7.99','2005-08-21 23:11:23','2006-02-15 22:14:00'),(5280,195,2,16040,'11.99','2005-08-23 22:19:33','2006-02-15 22:14:00'),(5281,196,2,106,'11.99','2005-05-25 18:18:19','2006-02-15 22:14:00'),(5282,196,2,178,'5.99','2005-05-26 04:21:46','2006-02-15 22:14:00'),(5283,196,2,491,'2.99','2005-05-28 00:13:35','2006-02-15 22:14:00'),(5284,196,1,1053,'1.99','2005-05-31 07:12:44','2006-02-15 22:14:00'),(5285,196,1,1182,'5.99','2005-06-15 00:45:21','2006-02-15 22:14:00'),(5286,196,1,1348,'2.99','2005-06-15 12:45:30','2006-02-15 22:14:00'),(5287,196,2,1600,'0.99','2005-06-16 06:04:12','2006-02-15 22:14:00'),(5288,196,1,2681,'0.99','2005-06-19 12:15:27','2006-02-15 22:14:00'),(5289,196,2,2912,'4.99','2005-06-20 03:32:45','2006-02-15 22:14:00'),(5290,196,1,3104,'4.99','2005-06-20 17:06:46','2006-02-15 22:14:00'),(5291,196,2,3271,'5.99','2005-06-21 05:16:10','2006-02-15 22:14:00'),(5292,196,2,3342,'4.99','2005-06-21 10:46:36','2006-02-15 22:14:00'),(5293,196,1,4879,'2.99','2005-07-08 19:34:55','2006-02-15 22:14:00'),(5294,196,2,4999,'4.99','2005-07-09 01:12:57','2006-02-15 22:14:00'),(5295,196,2,5143,'4.99','2005-07-09 08:07:07','2006-02-15 22:14:00'),(5296,196,2,5353,'3.99','2005-07-09 18:04:29','2006-02-15 22:14:00'),(5297,196,2,5768,'4.99','2005-07-10 13:15:26','2006-02-15 22:14:00'),(5298,196,2,6857,'4.99','2005-07-12 19:53:30','2006-02-15 22:14:00'),(5299,196,2,7666,'3.99','2005-07-28 02:35:12','2006-02-15 22:14:00'),(5300,196,2,8266,'0.99','2005-07-29 01:20:16','2006-02-15 22:14:00'),(5301,196,2,8472,'1.99','2005-07-29 08:36:22','2006-02-15 22:14:00'),(5302,196,2,8700,'0.99','2005-07-29 16:56:01','2006-02-15 22:14:00'),(5303,196,1,9346,'5.99','2005-07-30 18:13:52','2006-02-15 22:14:00'),(5304,196,1,9721,'6.99','2005-07-31 08:28:46','2006-02-15 22:14:00'),(5305,196,1,9804,'4.99','2005-07-31 11:07:39','2006-02-15 22:14:00'),(5306,196,2,10122,'10.99','2005-07-31 21:29:28','2006-02-15 22:14:00'),(5307,196,1,10191,'4.99','2005-08-01 00:28:38','2006-02-15 22:14:00'),(5308,196,1,11104,'2.99','2005-08-02 08:09:58','2006-02-15 22:14:01'),(5309,196,2,12430,'0.99','2005-08-18 10:32:41','2006-02-15 22:14:01'),(5310,196,2,12684,'0.99','2005-08-18 19:51:27','2006-02-15 22:14:01'),(5311,196,2,12836,'0.99','2005-08-19 01:48:33','2006-02-15 22:14:01'),(5312,196,1,13799,'8.99','2005-08-20 12:36:42','2006-02-15 22:14:01'),(5313,196,2,14410,'5.99','2005-08-21 10:54:49','2006-02-15 22:14:01'),(5314,196,1,14698,'5.99','2005-08-21 20:49:58','2006-02-15 22:14:01'),(5315,196,2,15980,'0.99','2005-08-23 20:10:13','2006-02-15 22:14:01'),(5316,197,2,94,'2.99','2005-05-25 16:03:42','2006-02-15 22:14:01'),(5317,197,1,215,'0.99','2005-05-26 09:02:47','2006-02-15 22:14:01'),(5318,197,1,391,'2.99','2005-05-27 11:03:55','2006-02-15 22:14:01'),(5319,197,2,649,'1.99','2005-05-28 19:35:45','2006-02-15 22:14:01'),(5320,197,1,683,'2.99','2005-05-29 00:09:48','2006-02-15 22:14:01'),(5321,197,2,730,'3.99','2005-05-29 07:00:59','2006-02-15 22:14:01'),(5322,197,1,903,'3.99','2005-05-30 10:11:29','2006-02-15 22:14:01'),(5323,197,1,918,'0.99','2005-05-30 11:32:24','2006-02-15 22:14:01'),(5324,197,2,1175,'2.99','2005-06-15 00:15:15','2006-02-15 22:14:01'),(5325,197,1,1363,'0.99','2005-06-15 14:05:11','2006-02-15 22:14:01'),(5326,197,1,1503,'2.99','2005-06-15 22:07:09','2006-02-15 22:14:01'),(5327,197,2,1605,'8.99','2005-06-16 06:17:55','2006-02-15 22:14:01'),(5328,197,2,1919,'4.99','2005-06-17 05:40:52','2006-02-15 22:14:01'),(5329,197,1,2090,'2.99','2005-06-17 18:06:14','2006-02-15 22:14:01'),(5330,197,1,2750,'4.99','2005-06-19 16:37:24','2006-02-15 22:14:01'),(5331,197,2,2781,'2.99','2005-06-19 18:24:42','2006-02-15 22:14:01'),(5332,197,1,4486,'8.99','2005-07-08 01:09:09','2006-02-15 22:14:01'),(5333,197,2,4739,'4.99','2005-07-08 13:25:57','2006-02-15 22:14:01'),(5334,197,2,5182,'6.99','2005-07-09 10:08:10','2006-02-15 22:14:01'),(5335,197,2,5344,'0.99','2005-07-09 17:27:05','2006-02-15 22:14:01'),(5336,197,1,8165,'2.99','2005-07-28 21:23:06','2006-02-15 22:14:01'),(5337,197,2,9378,'4.99','2005-07-30 19:12:54','2006-02-15 22:14:01'),(5338,197,1,9476,'0.99','2005-07-30 23:06:40','2006-02-15 22:14:01'),(5339,197,2,9585,'4.99','2005-07-31 03:05:55','2006-02-15 22:14:01'),(5340,197,2,10460,'3.99','2005-08-01 09:31:00','2006-02-15 22:14:01'),(5341,197,2,10666,'0.99','2005-08-01 16:56:36','2006-02-15 22:14:01'),(5342,197,2,10739,'4.99','2005-08-01 19:46:11','2006-02-15 22:14:01'),(5343,197,1,10743,'2.99','2005-08-01 19:55:09','2006-02-15 22:14:01'),(5344,197,1,11018,'4.99','2005-08-02 05:27:53','2006-02-15 22:14:02'),(5345,197,1,11215,'4.99','2005-08-02 12:20:42','2006-02-15 22:14:02'),(5346,197,1,11311,'4.99','2005-08-02 15:53:48','2006-02-15 22:14:02'),(5347,197,1,11478,'2.99','2005-08-02 22:09:05','2006-02-15 22:14:02'),(5348,197,1,11643,'1.99','2005-08-17 04:49:35','2006-02-15 22:14:02'),(5349,197,1,12799,'0.99','2005-08-19 00:27:01','2006-02-15 22:14:02'),(5350,197,2,13913,'3.99','2005-08-20 16:37:35','2006-02-15 22:14:02'),(5351,197,1,14069,'9.99','2005-08-20 22:51:25','2006-02-15 22:14:02'),(5352,197,2,14951,'4.99','2005-08-22 06:19:37','2006-02-15 22:14:02'),(5353,197,1,15078,'2.99','2005-08-22 11:09:31','2006-02-15 22:14:02'),(5354,197,2,15233,'0.99','2005-08-22 17:41:53','2006-02-15 22:14:02'),(5355,197,1,15540,'8.99','2005-08-23 04:12:52','2006-02-15 22:14:02'),(5356,198,1,357,'0.99','2005-05-27 06:37:15','2006-02-15 22:14:02'),(5357,198,1,582,'4.99','2005-05-28 11:33:46','2006-02-15 22:14:02'),(5358,198,2,639,'2.99','2005-05-28 18:25:02','2006-02-15 22:14:02'),(5359,198,1,932,'2.99','2005-05-30 12:55:36','2006-02-15 22:14:02'),(5360,198,2,1132,'4.99','2005-05-31 18:44:53','2006-02-15 22:14:02'),(5361,198,2,2185,'0.99','2005-06-18 01:12:22','2006-02-15 22:14:02'),(5362,198,2,3770,'2.99','2005-07-06 13:14:28','2006-02-15 22:14:02'),(5363,198,2,4588,'2.99','2005-07-08 06:18:01','2006-02-15 22:14:02'),(5364,198,2,4750,'0.99','2005-07-08 14:07:03','2006-02-15 22:14:02'),(5365,198,2,5794,'4.99','2005-07-10 14:34:53','2006-02-15 22:14:02'),(5366,198,2,6567,'4.99','2005-07-12 05:43:09','2006-02-15 22:14:02'),(5367,198,1,6819,'4.99','2005-07-12 18:21:01','2006-02-15 22:14:02'),(5368,198,2,6889,'4.99','2005-07-12 21:01:22','2006-02-15 22:14:02'),(5369,198,1,7287,'0.99','2005-07-27 12:24:12','2006-02-15 22:14:02'),(5370,198,1,7441,'5.99','2005-07-27 17:46:53','2006-02-15 22:14:02'),(5371,198,1,7583,'2.99','2005-07-27 23:15:22','2006-02-15 22:14:02'),(5372,198,2,7622,'0.99','2005-07-28 00:37:34','2006-02-15 22:14:02'),(5373,198,1,8145,'5.99','2005-07-28 20:34:41','2006-02-15 22:14:02'),(5374,198,2,9389,'0.99','2005-07-30 19:27:59','2006-02-15 22:14:02'),(5375,198,1,10112,'4.99','2005-07-31 21:08:56','2006-02-15 22:14:02'),(5376,198,1,10147,'2.99','2005-07-31 22:18:43','2006-02-15 22:14:02'),(5377,198,1,10679,'0.99','2005-08-01 17:27:58','2006-02-15 22:14:02'),(5378,198,1,11351,'3.99','2005-08-02 17:28:07','2006-02-15 22:14:02'),(5379,198,1,11594,'6.99','2005-08-17 02:47:02','2006-02-15 22:14:02'),(5380,198,1,11756,'2.99','2005-08-17 09:29:22','2006-02-15 22:14:03'),(5381,198,1,11836,'4.99','2005-08-17 13:03:36','2006-02-15 22:14:03'),(5382,198,2,11949,'2.99','2005-08-17 17:12:26','2006-02-15 22:14:03'),(5383,198,1,11957,'1.99','2005-08-17 17:22:29','2006-02-15 22:14:03'),(5384,198,2,11985,'2.99','2005-08-17 18:19:44','2006-02-15 22:14:03'),(5385,198,2,12594,'4.99','2005-08-18 16:24:24','2006-02-15 22:14:03'),(5386,198,1,12862,'5.99','2005-08-19 02:31:59','2006-02-15 22:14:03'),(5387,198,1,13768,'5.99','2005-08-20 11:43:43','2006-02-15 22:14:03'),(5388,198,1,14214,'5.99','2005-08-21 04:30:49','2006-02-15 22:14:03'),(5389,198,2,14380,'2.99','2005-08-21 09:53:52','2006-02-15 22:14:03'),(5390,198,2,14990,'4.99','2005-08-22 07:48:01','2006-02-15 22:14:03'),(5391,198,1,15256,'6.99','2005-08-22 18:20:07','2006-02-15 22:14:03'),(5392,198,1,15433,'4.99','2005-08-23 00:27:18','2006-02-15 22:14:03'),(5393,199,1,499,'7.99','2005-05-28 01:05:07','2006-02-15 22:14:03'),(5394,199,1,1406,'4.99','2005-06-15 16:44:00','2006-02-15 22:14:03'),(5395,199,1,1910,'2.99','2005-06-17 05:11:27','2006-02-15 22:14:03'),(5396,199,1,3299,'0.99','2005-06-21 07:23:34','2006-02-15 22:14:03'),(5397,199,1,4499,'2.99','2005-07-08 02:08:48','2006-02-15 22:14:03'),(5398,199,2,4580,'8.99','2005-07-08 06:04:23','2006-02-15 22:14:03'),(5399,199,1,4976,'4.99','2005-07-09 00:03:30','2006-02-15 22:14:03'),(5400,199,2,5398,'2.99','2005-07-09 19:44:58','2006-02-15 22:14:03'),(5401,199,2,5680,'5.99','2005-07-10 08:47:36','2006-02-15 22:14:03'),(5402,199,2,6668,'2.99','2005-07-12 11:37:45','2006-02-15 22:14:03'),(5403,199,2,6782,'4.99','2005-07-12 16:23:25','2006-02-15 22:14:03'),(5404,199,1,7782,'4.99','2005-07-28 07:13:40','2006-02-15 22:14:03'),(5405,199,1,8709,'0.99','2005-07-29 17:25:54','2006-02-15 22:14:03'),(5406,199,1,9752,'2.99','2005-07-31 09:22:02','2006-02-15 22:14:03'),(5407,199,2,9894,'4.99','2005-07-31 14:07:44','2006-02-15 22:14:03'),(5408,199,1,9959,'4.99','2005-07-31 16:04:22','2006-02-15 22:14:03'),(5409,199,1,10196,'2.99','2005-08-01 00:34:51','2006-02-15 22:14:03'),(5410,199,2,10517,'4.99','2005-08-01 11:41:57','2006-02-15 22:14:03'),(5411,199,1,10850,'8.99','2005-08-01 23:53:45','2006-02-15 22:14:03'),(5412,199,1,11454,'2.99','2005-08-02 21:04:39','2006-02-15 22:14:03'),(5413,199,1,12386,'0.99','2005-08-18 08:45:57','2006-02-15 22:14:03'),(5414,199,2,14320,'4.99','2005-08-21 08:04:40','2006-02-15 22:14:03'),(5415,199,2,15412,'0.99','2005-08-22 23:37:11','2006-02-15 22:14:03'),(5416,199,2,15751,'3.99','2005-08-23 12:41:07','2006-02-15 22:14:04'),(5417,199,2,13952,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:04'),(5418,200,2,270,'9.99','2005-05-26 16:20:56','2006-02-15 22:14:04'),(5419,200,2,1296,'1.99','2005-06-15 09:23:59','2006-02-15 22:14:04'),(5420,200,2,1309,'4.99','2005-06-15 10:10:49','2006-02-15 22:14:04'),(5421,200,2,1899,'6.99','2005-06-17 04:29:15','2006-02-15 22:14:04'),(5422,200,1,2227,'4.99','2005-06-18 03:43:23','2006-02-15 22:14:04'),(5423,200,2,2667,'3.99','2005-06-19 11:28:46','2006-02-15 22:14:04'),(5424,200,2,2717,'4.99','2005-06-19 14:46:10','2006-02-15 22:14:04'),(5425,200,1,3190,'3.99','2005-06-20 23:27:15','2006-02-15 22:14:04'),(5426,200,1,3580,'4.99','2005-07-06 03:48:44','2006-02-15 22:14:04'),(5427,200,1,5110,'2.99','2005-07-09 06:57:25','2006-02-15 22:14:04'),(5428,200,1,6123,'0.99','2005-07-11 08:02:27','2006-02-15 22:14:04'),(5429,200,2,6167,'2.99','2005-07-11 10:21:21','2006-02-15 22:14:04'),(5430,200,1,6181,'4.99','2005-07-11 11:10:11','2006-02-15 22:14:04'),(5431,200,1,6947,'3.99','2005-07-26 23:42:03','2006-02-15 22:14:04'),(5432,200,1,7574,'2.99','2005-07-27 22:53:00','2006-02-15 22:14:04'),(5433,200,2,8368,'3.99','2005-07-29 05:15:41','2006-02-15 22:14:04'),(5434,200,2,8462,'2.99','2005-07-29 08:15:42','2006-02-15 22:14:04'),(5435,200,1,9527,'6.99','2005-07-31 01:02:24','2006-02-15 22:14:04'),(5436,200,1,10685,'2.99','2005-08-01 17:49:38','2006-02-15 22:14:04'),(5437,200,1,11356,'8.99','2005-08-02 17:42:40','2006-02-15 22:14:04'),(5438,200,1,13737,'5.99','2005-08-20 10:41:50','2006-02-15 22:14:04'),(5439,200,1,14034,'10.99','2005-08-20 21:31:52','2006-02-15 22:14:04'),(5440,200,2,14521,'6.99','2005-08-21 15:01:32','2006-02-15 22:14:04'),(5441,200,2,15691,'4.99','2005-08-23 09:53:54','2006-02-15 22:14:04'),(5442,200,2,15742,'5.99','2005-08-23 12:11:37','2006-02-15 22:14:04'),(5443,200,1,15961,'6.99','2005-08-23 19:35:42','2006-02-15 22:14:04'),(5444,200,2,11866,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:04'),(5445,201,1,311,'3.99','2005-05-26 22:51:37','2006-02-15 22:14:04'),(5446,201,1,670,'6.99','2005-05-28 22:04:03','2006-02-15 22:14:04'),(5447,201,2,756,'5.99','2005-05-29 10:28:45','2006-02-15 22:14:04'),(5448,201,1,2047,'1.99','2005-06-17 14:40:58','2006-02-15 22:14:04'),(5449,201,1,2157,'3.99','2005-06-17 23:30:52','2006-02-15 22:14:04'),(5450,201,2,2359,'6.99','2005-06-18 13:04:42','2006-02-15 22:14:04'),(5451,201,1,3106,'4.99','2005-06-20 17:18:06','2006-02-15 22:14:04'),(5452,201,1,3364,'7.99','2005-06-21 12:37:46','2006-02-15 22:14:05'),(5453,201,2,3528,'4.99','2005-07-06 01:13:27','2006-02-15 22:14:05'),(5454,201,2,3708,'6.99','2005-07-06 10:23:27','2006-02-15 22:14:05'),(5455,201,1,7106,'0.99','2005-07-27 05:21:24','2006-02-15 22:14:05'),(5456,201,2,7606,'2.99','2005-07-28 00:02:15','2006-02-15 22:14:05'),(5457,201,2,9355,'0.99','2005-07-30 18:35:25','2006-02-15 22:14:05'),(5458,201,2,10750,'5.99','2005-08-01 20:06:00','2006-02-15 22:14:05'),(5459,201,2,10865,'3.99','2005-08-02 00:22:46','2006-02-15 22:14:05'),(5460,201,1,10891,'0.99','2005-08-02 01:09:55','2006-02-15 22:14:05'),(5461,201,2,11807,'0.99','2005-08-17 11:51:15','2006-02-15 22:14:05'),(5462,201,2,13076,'4.99','2005-08-19 10:10:26','2006-02-15 22:14:05'),(5463,201,2,13613,'9.99','2005-08-20 06:23:53','2006-02-15 22:14:05'),(5464,201,2,13671,'3.99','2005-08-20 08:27:03','2006-02-15 22:14:05'),(5465,201,2,13672,'2.99','2005-08-20 08:27:27','2006-02-15 22:14:05'),(5466,201,2,14656,'2.99','2005-08-21 19:39:28','2006-02-15 22:14:05'),(5467,201,1,14973,'2.99','2005-08-22 06:59:28','2006-02-15 22:14:05'),(5468,201,1,15887,'2.99','2005-08-23 16:54:09','2006-02-15 22:14:05'),(5469,201,2,15974,'5.99','2005-08-23 20:06:04','2006-02-15 22:14:05'),(5470,202,1,1474,'2.99','2005-06-15 20:55:42','2006-02-15 22:14:05'),(5471,202,1,1535,'4.99','2005-06-16 00:52:04','2006-02-15 22:14:05'),(5472,202,1,3008,'0.99','2005-06-20 10:23:25','2006-02-15 22:14:05'),(5473,202,2,3148,'0.99','2005-06-20 20:27:18','2006-02-15 22:14:05'),(5474,202,1,3861,'8.99','2005-07-06 17:24:49','2006-02-15 22:14:05'),(5475,202,2,4567,'4.99','2005-07-08 05:20:04','2006-02-15 22:14:05'),(5476,202,2,5194,'2.99','2005-07-09 10:31:34','2006-02-15 22:14:05'),(5477,202,1,5297,'2.99','2005-07-09 15:32:29','2006-02-15 22:14:05'),(5478,202,2,5838,'2.99','2005-07-10 17:04:56','2006-02-15 22:14:05'),(5479,202,1,7613,'2.99','2005-07-28 00:13:58','2006-02-15 22:14:05'),(5480,202,1,8351,'2.99','2005-07-29 04:50:53','2006-02-15 22:14:05'),(5481,202,1,8779,'2.99','2005-07-29 20:15:00','2006-02-15 22:14:05'),(5482,202,1,8830,'2.99','2005-07-29 22:34:35','2006-02-15 22:14:05'),(5483,202,2,8930,'0.99','2005-07-30 02:28:38','2006-02-15 22:14:05'),(5484,202,2,9057,'2.99','2005-07-30 07:14:18','2006-02-15 22:14:05'),(5485,202,2,9467,'8.99','2005-07-30 22:45:34','2006-02-15 22:14:05'),(5486,202,2,9751,'4.99','2005-07-31 09:20:50','2006-02-15 22:14:05'),(5487,202,1,10375,'2.99','2005-08-01 06:26:22','2006-02-15 22:14:05'),(5488,202,1,11210,'4.99','2005-08-02 12:15:54','2006-02-15 22:14:06'),(5489,202,2,11924,'4.99','2005-08-17 16:22:05','2006-02-15 22:14:06'),(5490,202,2,12801,'8.99','2005-08-19 00:27:19','2006-02-15 22:14:06'),(5491,202,1,13196,'4.99','2005-08-19 14:40:32','2006-02-15 22:14:06'),(5492,202,1,13528,'3.99','2005-08-20 03:03:31','2006-02-15 22:14:06'),(5493,202,1,14019,'3.99','2005-08-20 20:59:15','2006-02-15 22:14:06'),(5494,202,1,15095,'0.99','2005-08-22 11:41:35','2006-02-15 22:14:06'),(5495,202,2,15772,'4.99','2005-08-23 13:22:56','2006-02-15 22:14:06'),(5496,203,1,314,'0.99','2005-05-26 23:09:41','2006-02-15 22:14:06'),(5497,203,1,1217,'4.99','2005-06-15 03:24:14','2006-02-15 22:14:06'),(5498,203,1,1715,'2.99','2005-06-16 14:37:12','2006-02-15 22:14:06'),(5499,203,2,2939,'7.99','2005-06-20 05:18:16','2006-02-15 22:14:06'),(5500,203,2,3406,'2.99','2005-06-21 16:00:18','2006-02-15 22:14:06'),(5501,203,2,4136,'2.99','2005-07-07 08:15:52','2006-02-15 22:14:06'),(5502,203,2,5579,'5.99','2005-07-10 04:04:29','2006-02-15 22:14:06'),(5503,203,2,7787,'6.99','2005-07-28 07:19:02','2006-02-15 22:14:06'),(5504,203,1,8039,'0.99','2005-07-28 16:35:16','2006-02-15 22:14:06'),(5505,203,1,8463,'4.99','2005-07-29 08:17:51','2006-02-15 22:14:06'),(5506,203,1,8792,'7.99','2005-07-29 20:56:14','2006-02-15 22:14:06'),(5507,203,2,9015,'10.99','2005-07-30 05:21:32','2006-02-15 22:14:06'),(5508,203,2,10700,'3.99','2005-08-01 18:26:31','2006-02-15 22:14:06'),(5509,203,2,10805,'2.99','2005-08-01 22:23:37','2006-02-15 22:14:06'),(5510,203,1,11712,'2.99','2005-08-17 07:32:51','2006-02-15 22:14:06'),(5511,203,1,12519,'0.99','2005-08-18 13:42:14','2006-02-15 22:14:06'),(5512,203,2,13841,'4.99','2005-08-20 14:25:18','2006-02-15 22:14:06'),(5513,203,2,14505,'5.99','2005-08-21 14:26:28','2006-02-15 22:14:06'),(5514,203,2,15798,'2.99','2005-08-23 14:23:03','2006-02-15 22:14:06'),(5515,203,2,15991,'2.99','2005-08-23 20:27:34','2006-02-15 22:14:06'),(5516,204,2,251,'0.99','2005-05-26 14:35:40','2006-02-15 22:14:06'),(5517,204,2,399,'4.99','2005-05-27 12:48:38','2006-02-15 22:14:06'),(5518,204,2,857,'4.99','2005-05-30 02:01:23','2006-02-15 22:14:06'),(5519,204,1,1016,'1.99','2005-05-31 02:49:43','2006-02-15 22:14:06'),(5520,204,1,1321,'2.99','2005-06-15 10:49:17','2006-02-15 22:14:06'),(5521,204,1,1616,'7.99','2005-06-16 07:04:52','2006-02-15 22:14:06'),(5522,204,1,1871,'4.99','2005-06-17 02:25:12','2006-02-15 22:14:06'),(5523,204,2,1894,'7.99','2005-06-17 04:18:48','2006-02-15 22:14:06'),(5524,204,2,2186,'2.99','2005-06-18 01:15:27','2006-02-15 22:14:07'),(5525,204,2,2734,'4.99','2005-06-19 15:36:27','2006-02-15 22:14:07'),(5526,204,1,4043,'0.99','2005-07-07 03:09:50','2006-02-15 22:14:07'),(5527,204,1,4979,'4.99','2005-07-09 00:24:34','2006-02-15 22:14:07'),(5528,204,2,5145,'0.99','2005-07-09 08:13:25','2006-02-15 22:14:07'),(5529,204,1,5619,'2.99','2005-07-10 05:29:33','2006-02-15 22:14:07'),(5530,204,2,6004,'4.99','2005-07-11 01:34:25','2006-02-15 22:14:07'),(5531,204,2,6225,'2.99','2005-07-11 13:45:14','2006-02-15 22:14:07'),(5532,204,2,6631,'0.99','2005-07-12 09:31:43','2006-02-15 22:14:07'),(5533,204,1,6694,'6.99','2005-07-12 12:39:23','2006-02-15 22:14:07'),(5534,204,2,6871,'2.99','2005-07-12 20:13:49','2006-02-15 22:14:07'),(5535,204,1,7392,'4.99','2005-07-27 16:01:05','2006-02-15 22:14:07'),(5536,204,2,9005,'0.99','2005-07-30 05:04:58','2006-02-15 22:14:07'),(5537,204,1,9394,'5.99','2005-07-30 20:06:24','2006-02-15 22:14:07'),(5538,204,2,9906,'4.99','2005-07-31 14:38:12','2006-02-15 22:14:07'),(5539,204,2,10042,'2.99','2005-07-31 19:01:25','2006-02-15 22:14:07'),(5540,204,2,10399,'5.99','2005-08-01 07:13:39','2006-02-15 22:14:07'),(5541,204,1,11261,'7.99','2005-08-02 13:54:26','2006-02-15 22:14:07'),(5542,204,2,11886,'0.99','2005-08-17 14:58:51','2006-02-15 22:14:07'),(5543,204,1,12737,'6.99','2005-08-18 22:11:37','2006-02-15 22:14:07'),(5544,204,1,13084,'0.99','2005-08-19 10:27:25','2006-02-15 22:14:07'),(5545,204,1,13416,'4.99','2005-08-19 22:48:48','2006-02-15 22:14:07'),(5546,204,2,13899,'2.99','2005-08-20 16:05:11','2006-02-15 22:14:07'),(5547,204,2,14163,'4.99','2005-08-21 02:56:52','2006-02-15 22:14:07'),(5548,204,1,14871,'0.99','2005-08-22 03:23:24','2006-02-15 22:14:07'),(5549,204,1,15364,'4.99','2005-08-22 21:41:41','2006-02-15 22:14:07'),(5550,204,2,15415,'11.99','2005-08-22 23:48:56','2006-02-15 22:14:07'),(5551,205,1,1238,'2.99','2005-06-15 04:49:08','2006-02-15 22:14:07'),(5552,205,1,1357,'4.99','2005-06-15 13:26:23','2006-02-15 22:14:07'),(5553,205,1,1767,'0.99','2005-06-16 18:01:36','2006-02-15 22:14:07'),(5554,205,2,2237,'5.99','2005-06-18 04:17:44','2006-02-15 22:14:07'),(5555,205,1,3601,'7.99','2005-07-06 05:20:25','2006-02-15 22:14:07'),(5556,205,2,4230,'3.99','2005-07-07 12:46:47','2006-02-15 22:14:07'),(5557,205,2,4377,'7.99','2005-07-07 20:28:57','2006-02-15 22:14:07'),(5558,205,1,4729,'4.99','2005-07-08 12:59:40','2006-02-15 22:14:07'),(5559,205,1,7736,'2.99','2005-07-28 05:12:04','2006-02-15 22:14:08'),(5560,205,2,7976,'7.99','2005-07-28 14:13:24','2006-02-15 22:14:08'),(5561,205,2,8896,'4.99','2005-07-30 00:51:21','2006-02-15 22:14:08'),(5562,205,2,10086,'4.99','2005-07-31 20:14:08','2006-02-15 22:14:08'),(5563,205,1,13935,'2.99','2005-08-20 17:20:49','2006-02-15 22:14:08'),(5564,205,1,14338,'0.99','2005-08-21 08:36:03','2006-02-15 22:14:08'),(5565,205,2,14391,'4.99','2005-08-21 10:16:27','2006-02-15 22:14:08'),(5566,205,1,14442,'2.99','2005-08-21 12:00:21','2006-02-15 22:14:08'),(5567,205,2,14490,'6.99','2005-08-21 13:54:15','2006-02-15 22:14:08'),(5568,205,2,15418,'0.99','2005-08-22 23:54:14','2006-02-15 22:14:08'),(5569,206,2,1872,'0.99','2005-06-17 02:27:03','2006-02-15 22:14:08'),(5570,206,2,2477,'5.99','2005-06-18 20:58:46','2006-02-15 22:14:08'),(5571,206,2,3012,'4.99','2005-06-20 10:43:13','2006-02-15 22:14:08'),(5572,206,1,3533,'5.99','2005-07-06 01:26:44','2006-02-15 22:14:08'),(5573,206,2,3831,'0.99','2005-07-06 16:06:35','2006-02-15 22:14:08'),(5574,206,1,3847,'4.99','2005-07-06 16:44:41','2006-02-15 22:14:08'),(5575,206,2,4068,'4.99','2005-07-07 04:34:38','2006-02-15 22:14:08'),(5576,206,2,4107,'4.99','2005-07-07 06:36:32','2006-02-15 22:14:08'),(5577,206,2,4823,'4.99','2005-07-08 17:28:54','2006-02-15 22:14:08'),(5578,206,1,6139,'3.99','2005-07-11 08:39:33','2006-02-15 22:14:08'),(5579,206,1,6420,'6.99','2005-07-11 23:38:49','2006-02-15 22:14:08'),(5580,206,1,7222,'4.99','2005-07-27 09:38:43','2006-02-15 22:14:08'),(5581,206,2,7541,'4.99','2005-07-27 21:40:05','2006-02-15 22:14:08'),(5582,206,1,8217,'5.99','2005-07-28 23:44:13','2006-02-15 22:14:08'),(5583,206,1,8549,'3.99','2005-07-29 11:12:13','2006-02-15 22:14:08'),(5584,206,2,9474,'2.99','2005-07-30 23:05:44','2006-02-15 22:14:08'),(5585,206,2,10930,'3.99','2005-08-02 02:38:07','2006-02-15 22:14:08'),(5586,206,1,11022,'2.99','2005-08-02 05:35:03','2006-02-15 22:14:08'),(5587,206,2,11634,'2.99','2005-08-17 04:31:49','2006-02-15 22:14:08'),(5588,206,1,13128,'4.99','2005-08-19 12:04:16','2006-02-15 22:14:08'),(5589,206,2,13232,'2.99','2005-08-19 16:13:32','2006-02-15 22:14:08'),(5590,206,2,13263,'10.99','2005-08-19 17:26:55','2006-02-15 22:14:08'),(5591,206,2,13550,'9.99','2005-08-20 03:58:51','2006-02-15 22:14:08'),(5592,206,2,13696,'0.99','2005-08-20 09:16:15','2006-02-15 22:14:08'),(5593,206,2,14695,'0.99','2005-08-21 20:46:47','2006-02-15 22:14:08'),(5594,206,2,15686,'7.99','2005-08-23 09:42:21','2006-02-15 22:14:09'),(5595,206,1,15709,'4.99','2005-08-23 10:36:00','2006-02-15 22:14:09'),(5596,207,1,39,'0.99','2005-05-25 04:51:46','2006-02-15 22:14:09'),(5597,207,1,44,'0.99','2005-05-25 05:53:23','2006-02-15 22:14:09'),(5598,207,1,659,'0.99','2005-05-28 20:27:53','2006-02-15 22:14:09'),(5599,207,2,826,'6.99','2005-05-29 21:56:15','2006-02-15 22:14:09'),(5600,207,2,896,'3.99','2005-05-30 09:03:52','2006-02-15 22:14:09'),(5601,207,2,1144,'3.99','2005-05-31 20:04:10','2006-02-15 22:14:09'),(5602,207,2,1945,'3.99','2005-06-17 07:51:26','2006-02-15 22:14:09'),(5603,207,2,3584,'2.99','2005-07-06 04:16:43','2006-02-15 22:14:09'),(5604,207,2,3687,'9.99','2005-07-06 09:38:33','2006-02-15 22:14:09'),(5605,207,1,4018,'2.99','2005-07-07 01:10:33','2006-02-15 22:14:09'),(5606,207,2,4713,'5.99','2005-07-08 12:12:33','2006-02-15 22:14:09'),(5607,207,1,4816,'0.99','2005-07-08 17:14:14','2006-02-15 22:14:09'),(5608,207,2,5007,'0.99','2005-07-09 01:26:22','2006-02-15 22:14:09'),(5609,207,1,5258,'0.99','2005-07-09 13:56:56','2006-02-15 22:14:09'),(5610,207,1,5259,'4.99','2005-07-09 14:02:50','2006-02-15 22:14:09'),(5611,207,2,5939,'0.99','2005-07-10 22:30:05','2006-02-15 22:14:09'),(5612,207,2,6465,'5.99','2005-07-12 01:17:11','2006-02-15 22:14:09'),(5613,207,1,6537,'0.99','2005-07-12 04:46:30','2006-02-15 22:14:09'),(5614,207,2,7306,'5.99','2005-07-27 12:57:26','2006-02-15 22:14:09'),(5615,207,1,7540,'5.99','2005-07-27 21:39:55','2006-02-15 22:14:09'),(5616,207,1,8800,'5.99','2005-07-29 21:18:59','2006-02-15 22:14:09'),(5617,207,2,9652,'2.99','2005-07-31 05:49:53','2006-02-15 22:14:09'),(5618,207,2,10234,'3.99','2005-08-01 01:56:20','2006-02-15 22:14:09'),(5619,207,2,10300,'0.99','2005-08-01 04:08:11','2006-02-15 22:14:09'),(5620,207,1,11112,'2.99','2005-08-02 08:25:14','2006-02-15 22:14:09'),(5621,207,2,11260,'0.99','2005-08-02 13:52:19','2006-02-15 22:14:09'),(5622,207,2,11286,'5.99','2005-08-02 14:44:22','2006-02-15 22:14:09'),(5623,207,1,11724,'6.99','2005-08-17 08:04:44','2006-02-15 22:14:09'),(5624,207,2,12108,'6.99','2005-08-17 22:56:39','2006-02-15 22:14:09'),(5625,207,2,13655,'2.99','2005-08-20 07:59:13','2006-02-15 22:14:09'),(5626,207,2,13809,'8.99','2005-08-20 12:56:03','2006-02-15 22:14:09'),(5627,207,2,13912,'9.99','2005-08-20 16:32:10','2006-02-15 22:14:09'),(5628,207,2,13954,'3.99','2005-08-20 18:02:41','2006-02-15 22:14:09'),(5629,207,1,15625,'1.99','2005-08-23 07:25:29','2006-02-15 22:14:10'),(5630,208,1,100,'4.99','2005-05-25 16:50:28','2006-02-15 22:14:10'),(5631,208,1,1805,'0.99','2005-06-16 20:36:00','2006-02-15 22:14:10'),(5632,208,1,1949,'5.99','2005-06-17 08:19:22','2006-02-15 22:14:10'),(5633,208,2,2592,'0.99','2005-06-19 05:36:54','2006-02-15 22:14:10'),(5634,208,1,2695,'2.99','2005-06-19 13:25:53','2006-02-15 22:14:10'),(5635,208,2,2907,'0.99','2005-06-20 03:15:09','2006-02-15 22:14:10'),(5636,208,2,3811,'2.99','2005-07-06 15:20:37','2006-02-15 22:14:10'),(5637,208,1,4354,'5.99','2005-07-07 19:21:02','2006-02-15 22:14:10'),(5638,208,2,4985,'4.99','2005-07-09 00:36:02','2006-02-15 22:14:10'),(5639,208,1,5117,'2.99','2005-07-09 07:11:22','2006-02-15 22:14:10'),(5640,208,2,5693,'2.99','2005-07-10 09:35:43','2006-02-15 22:14:10'),(5641,208,2,6306,'6.99','2005-07-11 18:04:26','2006-02-15 22:14:10'),(5642,208,1,6767,'1.99','2005-07-12 15:46:55','2006-02-15 22:14:10'),(5643,208,1,7315,'0.99','2005-07-27 13:14:56','2006-02-15 22:14:10'),(5644,208,1,7861,'2.99','2005-07-28 10:02:01','2006-02-15 22:14:10'),(5645,208,2,7984,'2.99','2005-07-28 14:27:51','2006-02-15 22:14:10'),(5646,208,1,8742,'1.99','2005-07-29 18:56:12','2006-02-15 22:14:10'),(5647,208,2,9298,'3.99','2005-07-30 16:27:53','2006-02-15 22:14:10'),(5648,208,1,9838,'4.99','2005-07-31 12:18:49','2006-02-15 22:14:10'),(5649,208,2,10762,'4.99','2005-08-01 20:28:39','2006-02-15 22:14:10'),(5650,208,2,10784,'5.99','2005-08-01 21:24:28','2006-02-15 22:14:10'),(5651,208,2,11442,'2.99','2005-08-02 20:26:19','2006-02-15 22:14:10'),(5652,208,2,11805,'6.99','2005-08-17 11:48:47','2006-02-15 22:14:10'),(5653,208,2,11819,'0.99','2005-08-17 12:25:17','2006-02-15 22:14:10'),(5654,208,1,13719,'5.98','2006-02-14 15:16:03','2006-02-15 22:14:10'),(5655,208,1,15717,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:10'),(5656,209,2,340,'9.99','2005-05-27 03:55:25','2006-02-15 22:14:10'),(5657,209,1,471,'0.99','2005-05-27 21:32:42','2006-02-15 22:14:10'),(5658,209,2,1143,'2.99','2005-05-31 19:53:03','2006-02-15 22:14:10'),(5659,209,2,1201,'4.99','2005-06-15 02:06:28','2006-02-15 22:14:10'),(5660,209,1,1657,'4.99','2005-06-16 10:06:49','2006-02-15 22:14:10'),(5661,209,1,2650,'4.99','2005-06-19 10:21:45','2006-02-15 22:14:10'),(5662,209,1,2796,'4.99','2005-06-19 19:00:37','2006-02-15 22:14:10'),(5663,209,2,3504,'2.99','2005-07-06 00:18:29','2006-02-15 22:14:10'),(5664,209,2,4071,'5.99','2005-07-07 04:37:26','2006-02-15 22:14:11'),(5665,209,1,4309,'5.99','2005-07-07 17:29:41','2006-02-15 22:14:11'),(5666,209,2,4810,'4.99','2005-07-08 17:04:06','2006-02-15 22:14:11'),(5667,209,1,4907,'4.99','2005-07-08 21:01:41','2006-02-15 22:14:11'),(5668,209,2,5170,'3.99','2005-07-09 09:24:19','2006-02-15 22:14:11'),(5669,209,2,5219,'5.99','2005-07-09 11:57:55','2006-02-15 22:14:11'),(5670,209,1,6210,'0.99','2005-07-11 12:36:43','2006-02-15 22:14:11'),(5671,209,1,7116,'6.99','2005-07-27 05:46:43','2006-02-15 22:14:11'),(5672,209,1,7269,'3.99','2005-07-27 11:23:47','2006-02-15 22:14:11'),(5673,209,1,7505,'4.99','2005-07-27 20:28:03','2006-02-15 22:14:11'),(5674,209,2,7752,'5.99','2005-07-28 06:01:00','2006-02-15 22:14:11'),(5675,209,1,8067,'4.99','2005-07-28 17:20:17','2006-02-15 22:14:11'),(5676,209,2,8759,'8.99','2005-07-29 19:22:37','2006-02-15 22:14:11'),(5677,209,2,8816,'2.99','2005-07-29 21:53:00','2006-02-15 22:14:11'),(5678,209,2,9054,'6.99','2005-07-30 07:11:44','2006-02-15 22:14:11'),(5679,209,1,9923,'0.99','2005-07-31 15:00:15','2006-02-15 22:14:11'),(5680,209,2,10554,'2.99','2005-08-01 12:56:19','2006-02-15 22:14:11'),(5681,209,1,10646,'4.99','2005-08-01 15:57:55','2006-02-15 22:14:11'),(5682,209,2,10811,'6.99','2005-08-01 22:41:15','2006-02-15 22:14:11'),(5683,209,1,12025,'0.99','2005-08-17 19:59:06','2006-02-15 22:14:11'),(5684,209,1,13796,'8.99','2005-08-20 12:32:32','2006-02-15 22:14:11'),(5685,209,2,14631,'6.99','2005-08-21 18:47:49','2006-02-15 22:14:11'),(5686,209,1,15254,'2.99','2005-08-22 18:13:07','2006-02-15 22:14:11'),(5687,209,2,15510,'9.99','2005-08-23 02:51:27','2006-02-15 22:14:11'),(5688,210,1,953,'2.99','2005-05-30 16:34:02','2006-02-15 22:14:11'),(5689,210,2,1177,'2.99','2005-06-15 00:33:04','2006-02-15 22:14:11'),(5690,210,2,2856,'0.99','2005-06-19 23:13:04','2006-02-15 22:14:11'),(5691,210,2,3563,'4.99','2005-07-06 02:57:01','2006-02-15 22:14:11'),(5692,210,2,3884,'4.99','2005-07-06 18:41:33','2006-02-15 22:14:11'),(5693,210,2,4270,'0.99','2005-07-07 14:38:41','2006-02-15 22:14:11'),(5694,210,1,4306,'2.99','2005-07-07 17:12:32','2006-02-15 22:14:11'),(5695,210,1,4334,'0.99','2005-07-07 18:32:04','2006-02-15 22:14:11'),(5696,210,2,4388,'7.99','2005-07-07 20:58:03','2006-02-15 22:14:11'),(5697,210,1,4620,'5.99','2005-07-08 08:01:44','2006-02-15 22:14:11'),(5698,210,1,4871,'6.99','2005-07-08 19:19:52','2006-02-15 22:14:12'),(5699,210,1,4893,'4.99','2005-07-08 20:19:55','2006-02-15 22:14:12'),(5700,210,1,4989,'3.99','2005-07-09 00:46:56','2006-02-15 22:14:12'),(5701,210,2,5957,'0.99','2005-07-10 23:24:02','2006-02-15 22:14:12'),(5702,210,2,6227,'4.99','2005-07-11 13:56:46','2006-02-15 22:14:12'),(5703,210,1,6564,'1.99','2005-07-12 05:34:44','2006-02-15 22:14:12'),(5704,210,1,7743,'5.99','2005-07-28 05:36:13','2006-02-15 22:14:12'),(5705,210,2,7909,'0.99','2005-07-28 11:38:08','2006-02-15 22:14:12'),(5706,210,2,8336,'8.99','2005-07-29 04:20:42','2006-02-15 22:14:12'),(5707,210,2,8678,'3.99','2005-07-29 16:04:00','2006-02-15 22:14:12'),(5708,210,2,8738,'0.99','2005-07-29 18:32:47','2006-02-15 22:14:12'),(5709,210,2,10890,'4.99','2005-08-02 00:58:46','2006-02-15 22:14:12'),(5710,210,2,12410,'8.99','2005-08-18 09:45:33','2006-02-15 22:14:12'),(5711,210,1,12879,'4.99','2005-08-19 03:22:55','2006-02-15 22:14:12'),(5712,210,2,12909,'2.99','2005-08-19 04:20:25','2006-02-15 22:14:12'),(5713,210,2,12986,'4.99','2005-08-19 07:09:36','2006-02-15 22:14:12'),(5714,210,1,14181,'7.99','2005-08-21 03:16:30','2006-02-15 22:14:12'),(5715,210,2,14639,'6.99','2005-08-21 19:01:39','2006-02-15 22:14:12'),(5716,210,2,14876,'4.99','2005-08-22 03:39:29','2006-02-15 22:14:12'),(5717,210,2,15672,'0.99','2005-08-23 09:09:18','2006-02-15 22:14:12'),(5718,210,2,15942,'8.99','2005-08-23 18:48:40','2006-02-15 22:14:12'),(5719,211,1,238,'4.99','2005-05-26 12:30:22','2006-02-15 22:14:12'),(5720,211,2,2812,'8.99','2005-06-19 19:58:16','2006-02-15 22:14:12'),(5721,211,2,3437,'6.99','2005-06-21 19:20:17','2006-02-15 22:14:12'),(5722,211,2,3937,'8.99','2005-07-06 21:15:38','2006-02-15 22:14:12'),(5723,211,2,4060,'2.99','2005-07-07 04:10:13','2006-02-15 22:14:12'),(5724,211,2,4441,'5.99','2005-07-07 23:04:23','2006-02-15 22:14:12'),(5725,211,2,4479,'2.99','2005-07-08 00:52:35','2006-02-15 22:14:12'),(5726,211,1,4857,'2.99','2005-07-08 18:52:07','2006-02-15 22:14:12'),(5727,211,1,5668,'5.99','2005-07-10 08:11:05','2006-02-15 22:14:12'),(5728,211,2,5699,'3.99','2005-07-10 09:48:04','2006-02-15 22:14:12'),(5729,211,2,5785,'4.99','2005-07-10 14:06:03','2006-02-15 22:14:12'),(5730,211,2,6438,'0.99','2005-07-12 00:23:01','2006-02-15 22:14:12'),(5731,211,1,6628,'4.99','2005-07-12 09:18:08','2006-02-15 22:14:13'),(5732,211,1,6722,'1.99','2005-07-12 13:44:03','2006-02-15 22:14:13'),(5733,211,2,7484,'0.99','2005-07-27 19:28:17','2006-02-15 22:14:13'),(5734,211,1,7975,'2.99','2005-07-28 14:12:47','2006-02-15 22:14:13'),(5735,211,2,8961,'6.99','2005-07-30 03:43:35','2006-02-15 22:14:13'),(5736,211,1,9111,'3.99','2005-07-30 09:05:44','2006-02-15 22:14:13'),(5737,211,1,9953,'0.99','2005-07-31 15:56:35','2006-02-15 22:14:13'),(5738,211,1,10445,'2.99','2005-08-01 09:02:15','2006-02-15 22:14:13'),(5739,211,2,10928,'4.99','2005-08-02 02:34:12','2006-02-15 22:14:13'),(5740,211,2,11076,'8.99','2005-08-02 07:24:47','2006-02-15 22:14:13'),(5741,211,2,11963,'3.99','2005-08-17 17:35:47','2006-02-15 22:14:13'),(5742,211,2,12311,'0.99','2005-08-18 06:07:00','2006-02-15 22:14:13'),(5743,211,2,12565,'4.99','2005-08-18 15:12:17','2006-02-15 22:14:13'),(5744,211,2,12570,'5.99','2005-08-18 15:23:31','2006-02-15 22:14:13'),(5745,211,2,13942,'2.99','2005-08-20 17:30:52','2006-02-15 22:14:13'),(5746,211,1,13979,'2.99','2005-08-20 19:03:49','2006-02-15 22:14:13'),(5747,211,2,14782,'0.99','2005-08-22 00:17:20','2006-02-15 22:14:13'),(5748,211,2,14812,'1.99','2005-08-22 01:10:32','2006-02-15 22:14:13'),(5749,211,1,15404,'7.99','2005-08-22 23:19:44','2006-02-15 22:14:13'),(5750,211,2,15538,'6.99','2005-08-23 04:07:37','2006-02-15 22:14:13'),(5751,211,2,15670,'5.99','2005-08-23 09:07:11','2006-02-15 22:14:13'),(5752,211,2,12746,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:13'),(5753,212,1,1356,'0.99','2005-06-15 13:17:01','2006-02-15 22:14:13'),(5754,212,2,1379,'0.99','2005-06-15 15:05:10','2006-02-15 22:14:13'),(5755,212,1,1637,'2.99','2005-06-16 08:29:58','2006-02-15 22:14:13'),(5756,212,2,2739,'9.99','2005-06-19 15:58:38','2006-02-15 22:14:13'),(5757,212,2,4708,'10.99','2005-07-08 11:59:19','2006-02-15 22:14:13'),(5758,212,2,4798,'3.99','2005-07-08 16:45:16','2006-02-15 22:14:13'),(5759,212,2,4916,'6.99','2005-07-08 21:32:17','2006-02-15 22:14:13'),(5760,212,1,5115,'6.99','2005-07-09 07:07:18','2006-02-15 22:14:13'),(5761,212,2,7828,'2.99','2005-07-28 08:40:46','2006-02-15 22:14:13'),(5762,212,2,8000,'4.99','2005-07-28 15:10:25','2006-02-15 22:14:13'),(5763,212,1,8940,'3.99','2005-07-30 02:57:26','2006-02-15 22:14:13'),(5764,212,2,10273,'4.99','2005-08-01 03:14:47','2006-02-15 22:14:13'),(5765,212,2,10567,'0.99','2005-08-01 13:16:01','2006-02-15 22:14:14'),(5766,212,1,12156,'7.99','2005-08-18 00:27:33','2006-02-15 22:14:14'),(5767,212,2,12467,'0.99','2005-08-18 11:40:09','2006-02-15 22:14:14'),(5768,212,2,12562,'3.99','2005-08-18 15:00:03','2006-02-15 22:14:14'),(5769,212,1,14563,'2.99','2005-08-21 16:23:53','2006-02-15 22:14:14'),(5770,212,2,14681,'5.99','2005-08-21 20:25:13','2006-02-15 22:14:14'),(5771,212,1,15872,'4.99','2005-08-23 16:27:24','2006-02-15 22:14:14'),(5772,212,2,15920,'2.99','2005-08-23 18:05:10','2006-02-15 22:14:14'),(5773,213,2,385,'0.99','2005-05-27 10:23:25','2006-02-15 22:14:14'),(5774,213,1,1489,'0.99','2005-06-15 21:41:38','2006-02-15 22:14:14'),(5775,213,2,1936,'4.99','2005-06-17 07:15:41','2006-02-15 22:14:14'),(5776,213,1,2322,'5.99','2005-06-18 09:44:21','2006-02-15 22:14:14'),(5777,213,1,2509,'0.99','2005-06-18 23:44:08','2006-02-15 22:14:14'),(5778,213,2,2569,'6.99','2005-06-19 04:19:04','2006-02-15 22:14:14'),(5779,213,1,2889,'4.99','2005-06-20 01:54:08','2006-02-15 22:14:14'),(5780,213,2,2946,'4.99','2005-06-20 05:50:40','2006-02-15 22:14:14'),(5781,213,1,3252,'2.99','2005-06-21 03:25:26','2006-02-15 22:14:14'),(5782,213,1,3313,'2.99','2005-06-21 08:11:18','2006-02-15 22:14:14'),(5783,213,2,3989,'4.99','2005-07-06 23:30:54','2006-02-15 22:14:14'),(5784,213,2,4236,'4.99','2005-07-07 13:12:07','2006-02-15 22:14:14'),(5785,213,1,4655,'8.99','2005-07-08 09:49:22','2006-02-15 22:14:14'),(5786,213,2,5159,'4.99','2005-07-09 08:55:52','2006-02-15 22:14:14'),(5787,213,1,5431,'0.99','2005-07-09 21:21:11','2006-02-15 22:14:14'),(5788,213,2,6725,'2.99','2005-07-12 13:47:17','2006-02-15 22:14:14'),(5789,213,2,7528,'0.99','2005-07-27 21:15:25','2006-02-15 22:14:14'),(5790,213,2,8444,'2.99','2005-07-29 07:36:13','2006-02-15 22:14:14'),(5791,213,2,8542,'4.99','2005-07-29 11:01:50','2006-02-15 22:14:14'),(5792,213,2,9150,'6.99','2005-07-30 10:49:32','2006-02-15 22:14:14'),(5793,213,2,9340,'2.99','2005-07-30 18:07:16','2006-02-15 22:14:14'),(5794,213,1,9477,'4.99','2005-07-30 23:07:22','2006-02-15 22:14:14'),(5795,213,1,10449,'2.99','2005-08-01 09:09:59','2006-02-15 22:14:14'),(5796,213,2,11778,'3.99','2005-08-17 10:31:40','2006-02-15 22:14:14'),(5797,213,1,13354,'4.99','2005-08-19 20:55:23','2006-02-15 22:14:14'),(5798,213,2,13426,'0.99','2005-08-19 23:15:00','2006-02-15 22:14:14'),(5799,213,1,14744,'6.99','2005-08-21 22:45:21','2006-02-15 22:14:15'),(5800,213,2,14374,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:15'),(5801,214,1,242,'1.99','2005-05-26 13:05:08','2006-02-15 22:14:15'),(5802,214,1,278,'3.99','2005-05-26 17:40:58','2006-02-15 22:14:15'),(5803,214,1,1076,'2.99','2005-05-31 10:14:31','2006-02-15 22:14:15'),(5804,214,2,1093,'2.99','2005-05-31 12:32:26','2006-02-15 22:14:15'),(5805,214,2,1112,'0.99','2005-05-31 15:51:39','2006-02-15 22:14:15'),(5806,214,2,1275,'4.99','2005-06-15 07:55:43','2006-02-15 22:14:15'),(5807,214,2,2085,'2.99','2005-06-17 17:30:56','2006-02-15 22:14:15'),(5808,214,2,2868,'2.99','2005-06-20 00:08:58','2006-02-15 22:14:15'),(5809,214,2,4211,'0.99','2005-07-07 11:50:41','2006-02-15 22:14:15'),(5810,214,1,4783,'3.99','2005-07-08 16:09:24','2006-02-15 22:14:15'),(5811,214,2,4984,'3.99','2005-07-09 00:35:31','2006-02-15 22:14:15'),(5812,214,2,5172,'2.99','2005-07-09 09:31:27','2006-02-15 22:14:15'),(5813,214,1,6602,'7.99','2005-07-12 07:50:24','2006-02-15 22:14:15'),(5814,214,2,7417,'4.99','2005-07-27 16:58:33','2006-02-15 22:14:15'),(5815,214,2,7826,'5.99','2005-07-28 08:35:51','2006-02-15 22:14:15'),(5816,214,1,8663,'4.99','2005-07-29 15:33:18','2006-02-15 22:14:15'),(5817,214,1,10563,'3.99','2005-08-01 13:06:03','2006-02-15 22:14:15'),(5818,214,2,10749,'4.99','2005-08-01 20:02:01','2006-02-15 22:14:15'),(5819,214,2,11450,'2.99','2005-08-02 20:45:54','2006-02-15 22:14:15'),(5820,214,2,11474,'4.99','2005-08-02 21:53:08','2006-02-15 22:14:15'),(5821,214,2,12463,'4.99','2005-08-18 11:31:34','2006-02-15 22:14:15'),(5822,214,2,13138,'2.99','2005-08-19 12:30:01','2006-02-15 22:14:15'),(5823,214,2,13350,'9.99','2005-08-19 20:44:00','2006-02-15 22:14:15'),(5824,214,1,13409,'2.99','2005-08-19 22:36:26','2006-02-15 22:14:15'),(5825,214,1,13565,'0.99','2005-08-20 04:38:52','2006-02-15 22:14:15'),(5826,214,1,13726,'0.99','2005-08-20 10:08:40','2006-02-15 22:14:15'),(5827,214,1,13864,'4.99','2005-08-20 14:59:55','2006-02-15 22:14:15'),(5828,214,2,14347,'4.99','2005-08-21 08:42:31','2006-02-15 22:14:15'),(5829,214,1,14567,'0.99','2005-08-21 16:27:25','2006-02-15 22:14:15'),(5830,214,2,15639,'2.99','2005-08-23 08:03:25','2006-02-15 22:14:15'),(5831,214,2,15645,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:15'),(5832,215,1,711,'4.99','2005-05-29 03:49:03','2006-02-15 22:14:16'),(5833,215,2,1080,'4.99','2005-05-31 10:55:26','2006-02-15 22:14:16'),(5834,215,2,1376,'4.99','2005-06-15 14:59:06','2006-02-15 22:14:16'),(5835,215,2,1599,'4.99','2005-06-16 06:03:33','2006-02-15 22:14:16'),(5836,215,2,1845,'4.99','2005-06-16 23:56:11','2006-02-15 22:14:16'),(5837,215,2,2006,'2.99','2005-06-17 11:47:03','2006-02-15 22:14:16'),(5838,215,2,2918,'2.99','2005-06-20 04:09:04','2006-02-15 22:14:16'),(5839,215,1,3143,'2.99','2005-06-20 20:01:52','2006-02-15 22:14:16'),(5840,215,2,4940,'8.99','2005-07-08 22:36:06','2006-02-15 22:14:16'),(5841,215,1,5886,'2.99','2005-07-10 19:36:25','2006-02-15 22:14:16'),(5842,215,2,5967,'8.99','2005-07-11 00:02:19','2006-02-15 22:14:16'),(5843,215,1,7180,'1.99','2005-07-27 08:14:34','2006-02-15 22:14:16'),(5844,215,2,9046,'2.99','2005-07-30 06:46:55','2006-02-15 22:14:16'),(5845,215,1,9518,'0.99','2005-07-31 00:43:26','2006-02-15 22:14:16'),(5846,215,2,9611,'4.99','2005-07-31 03:54:43','2006-02-15 22:14:16'),(5847,215,1,11729,'2.99','2005-08-17 08:14:41','2006-02-15 22:14:16'),(5848,215,2,12285,'2.99','2005-08-18 04:56:43','2006-02-15 22:14:16'),(5849,215,1,12380,'1.99','2005-08-18 08:27:28','2006-02-15 22:14:16'),(5850,215,2,13085,'0.99','2005-08-19 10:28:22','2006-02-15 22:14:16'),(5851,215,2,14126,'0.99','2005-08-21 01:32:17','2006-02-15 22:14:16'),(5852,215,2,14817,'4.99','2005-08-22 01:17:16','2006-02-15 22:14:16'),(5853,215,1,15583,'2.99','2005-08-23 05:47:55','2006-02-15 22:14:16'),(5854,215,2,15610,'2.99','2005-08-23 06:56:15','2006-02-15 22:14:16'),(5855,215,2,15799,'2.99','2005-08-23 14:23:23','2006-02-15 22:14:16'),(5856,215,1,15843,'0.99','2005-08-23 15:37:31','2006-02-15 22:14:16'),(5857,215,2,15862,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:16'),(5858,216,1,997,'4.99','2005-05-31 00:08:25','2006-02-15 22:14:16'),(5859,216,2,1461,'6.99','2005-06-15 20:32:08','2006-02-15 22:14:16'),(5860,216,1,1664,'0.99','2005-06-16 10:15:20','2006-02-15 22:14:16'),(5861,216,1,1672,'3.99','2005-06-16 10:37:34','2006-02-15 22:14:16'),(5862,216,2,2351,'0.99','2005-06-18 12:27:57','2006-02-15 22:14:16'),(5863,216,1,3432,'2.99','2005-06-21 19:02:03','2006-02-15 22:14:16'),(5864,216,2,4161,'2.99','2005-07-07 09:15:11','2006-02-15 22:14:16'),(5865,216,1,6008,'6.99','2005-07-11 01:51:29','2006-02-15 22:14:16'),(5866,216,2,6349,'7.99','2005-07-11 20:25:05','2006-02-15 22:14:17'),(5867,216,1,8068,'4.99','2005-07-28 17:22:28','2006-02-15 22:14:17'),(5868,216,2,8859,'8.99','2005-07-29 23:44:43','2006-02-15 22:14:17'),(5869,216,1,9096,'0.99','2005-07-30 08:39:23','2006-02-15 22:14:17'),(5870,216,1,10506,'4.99','2005-08-01 11:16:05','2006-02-15 22:14:17'),(5871,216,1,11005,'0.99','2005-08-02 05:05:23','2006-02-15 22:14:17'),(5872,216,2,11621,'7.99','2005-08-17 04:13:45','2006-02-15 22:14:17'),(5873,216,2,13424,'0.99','2005-08-19 23:10:09','2006-02-15 22:14:17'),(5874,216,2,14638,'2.99','2005-08-21 19:01:36','2006-02-15 22:14:17'),(5875,216,2,14726,'4.99','2005-08-21 22:08:52','2006-02-15 22:14:17'),(5876,216,1,15192,'4.99','2005-08-22 16:06:23','2006-02-15 22:14:17'),(5877,216,2,15199,'2.99','2005-08-22 16:17:49','2006-02-15 22:14:17'),(5878,216,2,15934,'4.99','2005-08-23 18:40:41','2006-02-15 22:14:17'),(5879,216,1,12970,'5.98','2006-02-14 15:16:03','2006-02-15 22:14:17'),(5880,216,1,11676,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:17'),(5881,217,2,828,'2.99','2005-05-29 22:14:55','2006-02-15 22:14:17'),(5882,217,2,1141,'8.99','2005-05-31 19:42:02','2006-02-15 22:14:17'),(5883,217,1,1322,'2.99','2005-06-15 10:55:09','2006-02-15 22:14:17'),(5884,217,1,2076,'6.99','2005-06-17 16:43:47','2006-02-15 22:14:17'),(5885,217,1,2842,'4.99','2005-06-19 22:34:20','2006-02-15 22:14:17'),(5886,217,2,5576,'2.99','2005-07-10 03:57:05','2006-02-15 22:14:17'),(5887,217,2,5762,'3.99','2005-07-10 12:48:01','2006-02-15 22:14:17'),(5888,217,2,6570,'4.99','2005-07-12 05:50:31','2006-02-15 22:14:17'),(5889,217,2,7104,'2.99','2005-07-27 05:15:25','2006-02-15 22:14:17'),(5890,217,2,8332,'4.99','2005-07-29 04:16:00','2006-02-15 22:14:17'),(5891,217,1,9159,'0.99','2005-07-30 11:16:37','2006-02-15 22:14:17'),(5892,217,2,9317,'2.99','2005-07-30 17:13:37','2006-02-15 22:14:17'),(5893,217,2,9632,'6.99','2005-07-31 05:02:23','2006-02-15 22:14:17'),(5894,217,2,9745,'2.99','2005-07-31 09:16:14','2006-02-15 22:14:17'),(5895,217,1,10581,'5.99','2005-08-01 13:52:30','2006-02-15 22:14:17'),(5896,217,1,10836,'6.99','2005-08-01 23:29:58','2006-02-15 22:14:17'),(5897,217,1,11347,'2.99','2005-08-02 17:18:07','2006-02-15 22:14:17'),(5898,217,1,11649,'2.99','2005-08-17 04:59:26','2006-02-15 22:14:17'),(5899,217,1,11958,'4.99','2005-08-17 17:23:20','2006-02-15 22:14:17'),(5900,217,2,12210,'4.99','2005-08-18 02:27:29','2006-02-15 22:14:18'),(5901,217,1,12871,'4.99','2005-08-19 02:55:36','2006-02-15 22:14:18'),(5902,217,2,15116,'0.99','2005-08-22 12:35:40','2006-02-15 22:14:18'),(5903,217,2,15277,'2.99','2005-08-22 19:02:48','2006-02-15 22:14:18'),(5904,218,1,1459,'2.99','2005-06-15 20:25:53','2006-02-15 22:14:18'),(5905,218,1,2262,'0.99','2005-06-18 05:49:46','2006-02-15 22:14:18'),(5906,218,1,2267,'0.99','2005-06-18 06:10:23','2006-02-15 22:14:18'),(5907,218,1,4898,'6.99','2005-07-08 20:31:43','2006-02-15 22:14:18'),(5908,218,1,5226,'0.99','2005-07-09 12:10:44','2006-02-15 22:14:18'),(5909,218,2,5737,'0.99','2005-07-10 11:50:04','2006-02-15 22:14:18'),(5910,218,2,7090,'4.99','2005-07-27 04:43:53','2006-02-15 22:14:18'),(5911,218,1,7236,'8.99','2005-07-27 10:09:39','2006-02-15 22:14:18'),(5912,218,2,9018,'6.99','2005-07-30 05:28:40','2006-02-15 22:14:18'),(5913,218,2,9902,'6.99','2005-07-31 14:24:33','2006-02-15 22:14:18'),(5914,218,1,10114,'0.99','2005-07-31 21:12:58','2006-02-15 22:14:18'),(5915,218,1,11654,'2.99','2005-08-17 05:06:19','2006-02-15 22:14:18'),(5916,218,2,12481,'2.99','2005-08-18 12:31:34','2006-02-15 22:14:18'),(5917,218,1,12974,'0.99','2005-08-19 06:51:02','2006-02-15 22:14:18'),(5918,218,2,13708,'5.99','2005-08-20 09:34:07','2006-02-15 22:14:18'),(5919,218,2,13947,'5.99','2005-08-20 17:46:06','2006-02-15 22:14:18'),(5920,218,2,14848,'4.99','2005-08-22 02:14:19','2006-02-15 22:14:18'),(5921,218,2,15575,'0.99','2005-08-23 05:30:19','2006-02-15 22:14:18'),(5922,219,1,414,'0.99','2005-05-27 14:48:20','2006-02-15 22:14:18'),(5923,219,2,2417,'3.99','2005-06-18 17:12:01','2006-02-15 22:14:18'),(5924,219,2,2580,'0.99','2005-06-19 04:44:30','2006-02-15 22:14:18'),(5925,219,2,4678,'0.99','2005-07-08 10:30:40','2006-02-15 22:14:18'),(5926,219,2,4910,'7.99','2005-07-08 21:13:56','2006-02-15 22:14:18'),(5927,219,2,5123,'0.99','2005-07-09 07:20:30','2006-02-15 22:14:18'),(5928,219,2,5416,'4.99','2005-07-09 20:33:50','2006-02-15 22:14:18'),(5929,219,2,5475,'4.99','2005-07-09 23:31:38','2006-02-15 22:14:18'),(5930,219,2,5739,'7.99','2005-07-10 11:51:50','2006-02-15 22:14:18'),(5931,219,2,6172,'4.99','2005-07-11 10:32:09','2006-02-15 22:14:18'),(5932,219,1,6209,'2.99','2005-07-11 12:36:05','2006-02-15 22:14:18'),(5933,219,2,6501,'1.99','2005-07-12 03:11:55','2006-02-15 22:14:19'),(5934,219,2,7335,'2.99','2005-07-27 14:06:50','2006-02-15 22:14:19'),(5935,219,1,7726,'5.99','2005-07-28 04:52:19','2006-02-15 22:14:19'),(5936,219,1,8430,'0.99','2005-07-29 07:12:17','2006-02-15 22:14:19'),(5937,219,2,8536,'4.99','2005-07-29 10:37:23','2006-02-15 22:14:19'),(5938,219,1,8652,'6.99','2005-07-29 15:02:54','2006-02-15 22:14:19'),(5939,219,1,9712,'4.99','2005-07-31 08:13:11','2006-02-15 22:14:19'),(5940,219,1,11328,'2.99','2005-08-02 16:42:38','2006-02-15 22:14:19'),(5941,219,2,11791,'0.99','2005-08-17 11:01:11','2006-02-15 22:14:19'),(5942,219,1,13765,'4.99','2005-08-20 11:39:00','2006-02-15 22:14:19'),(5943,219,2,14029,'0.99','2005-08-20 21:23:11','2006-02-15 22:14:19'),(5944,219,1,14588,'5.99','2005-08-21 17:25:53','2006-02-15 22:14:19'),(5945,219,1,14688,'4.99','2005-08-21 20:32:37','2006-02-15 22:14:19'),(5946,219,1,15283,'4.99','2005-08-22 19:16:04','2006-02-15 22:14:19'),(5947,219,1,11577,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:19'),(5948,220,2,409,'0.99','2005-05-27 14:10:58','2006-02-15 22:14:19'),(5949,220,1,480,'3.99','2005-05-27 22:47:39','2006-02-15 22:14:19'),(5950,220,1,1832,'0.99','2005-06-16 22:35:20','2006-02-15 22:14:19'),(5951,220,2,4918,'2.99','2005-07-08 21:37:31','2006-02-15 22:14:19'),(5952,220,2,5613,'2.99','2005-07-10 05:15:43','2006-02-15 22:14:19'),(5953,220,2,5847,'2.99','2005-07-10 17:27:42','2006-02-15 22:14:19'),(5954,220,2,5859,'0.99','2005-07-10 18:02:02','2006-02-15 22:14:19'),(5955,220,2,6412,'0.99','2005-07-11 23:19:21','2006-02-15 22:14:19'),(5956,220,2,6832,'8.99','2005-07-12 18:51:41','2006-02-15 22:14:19'),(5957,220,2,7750,'9.99','2005-07-28 05:55:30','2006-02-15 22:14:19'),(5958,220,1,8065,'2.99','2005-07-28 17:15:48','2006-02-15 22:14:19'),(5959,220,1,8398,'4.99','2005-07-29 06:12:40','2006-02-15 22:14:19'),(5960,220,2,9384,'7.99','2005-07-30 19:25:35','2006-02-15 22:14:19'),(5961,220,2,9455,'10.99','2005-07-30 22:20:29','2006-02-15 22:14:19'),(5962,220,1,10099,'2.99','2005-07-31 20:47:14','2006-02-15 22:14:19'),(5963,220,2,10778,'4.99','2005-08-01 21:11:39','2006-02-15 22:14:19'),(5964,220,1,10948,'4.99','2005-08-02 03:23:23','2006-02-15 22:14:19'),(5965,220,1,11037,'0.99','2005-08-02 05:58:12','2006-02-15 22:14:19'),(5966,220,1,11153,'3.99','2005-08-02 09:54:19','2006-02-15 22:14:20'),(5967,220,1,11622,'4.99','2005-08-17 04:15:46','2006-02-15 22:14:20'),(5968,220,2,11947,'2.99','2005-08-17 17:08:13','2006-02-15 22:14:20'),(5969,220,1,12407,'4.99','2005-08-18 09:39:26','2006-02-15 22:14:20'),(5970,220,1,12896,'4.99','2005-08-19 03:52:44','2006-02-15 22:14:20'),(5971,220,2,13123,'2.99','2005-08-19 11:55:13','2006-02-15 22:14:20'),(5972,220,1,13281,'2.99','2005-08-19 18:07:47','2006-02-15 22:14:20'),(5973,220,2,14016,'4.99','2005-08-20 20:52:03','2006-02-15 22:14:20'),(5974,220,2,15706,'4.99','2005-08-23 10:32:52','2006-02-15 22:14:20'),(5975,221,2,226,'4.99','2005-05-26 10:44:04','2006-02-15 22:14:20'),(5976,221,1,1369,'0.99','2005-06-15 14:29:14','2006-02-15 22:14:20'),(5977,221,1,2331,'2.99','2005-06-18 10:50:09','2006-02-15 22:14:20'),(5978,221,2,2473,'2.99','2005-06-18 20:42:45','2006-02-15 22:14:20'),(5979,221,1,2660,'10.99','2005-06-19 10:50:02','2006-02-15 22:14:20'),(5980,221,1,3200,'5.99','2005-06-21 00:22:47','2006-02-15 22:14:20'),(5981,221,1,4293,'4.99','2005-07-07 15:53:47','2006-02-15 22:14:20'),(5982,221,2,4649,'4.99','2005-07-08 09:32:05','2006-02-15 22:14:20'),(5983,221,1,4693,'6.99','2005-07-08 11:07:36','2006-02-15 22:14:20'),(5984,221,1,5058,'5.99','2005-07-09 04:20:35','2006-02-15 22:14:20'),(5985,221,2,5920,'5.99','2005-07-10 21:33:58','2006-02-15 22:14:20'),(5986,221,1,7101,'2.99','2005-07-27 05:06:34','2006-02-15 22:14:20'),(5987,221,1,7129,'0.99','2005-07-27 06:18:01','2006-02-15 22:14:20'),(5988,221,2,7531,'8.99','2005-07-27 21:19:34','2006-02-15 22:14:20'),(5989,221,2,8486,'0.99','2005-07-29 08:53:38','2006-02-15 22:14:20'),(5990,221,1,9320,'6.99','2005-07-30 17:16:39','2006-02-15 22:14:20'),(5991,221,1,9453,'7.99','2005-07-30 22:20:04','2006-02-15 22:14:20'),(5992,221,2,9853,'0.99','2005-07-31 12:58:20','2006-02-15 22:14:20'),(5993,221,2,11680,'4.99','2005-08-17 06:12:27','2006-02-15 22:14:20'),(5994,221,1,11693,'4.99','2005-08-17 06:56:56','2006-02-15 22:14:20'),(5995,221,1,11802,'2.99','2005-08-17 11:32:51','2006-02-15 22:14:20'),(5996,221,1,12324,'0.99','2005-08-18 06:38:20','2006-02-15 22:14:20'),(5997,221,2,12620,'3.99','2005-08-18 17:26:38','2006-02-15 22:14:20'),(5998,221,2,13434,'2.99','2005-08-19 23:34:26','2006-02-15 22:14:20'),(5999,221,2,14322,'5.99','2005-08-21 08:06:30','2006-02-15 22:14:21'),(6000,221,2,14371,'0.99','2005-08-21 09:37:16','2006-02-15 22:14:21'),(6001,221,1,14419,'7.99','2005-08-21 11:15:46','2006-02-15 22:14:21'),(6002,221,1,15125,'8.99','2005-08-22 12:53:22','2006-02-15 22:14:21'),(6003,222,1,5,'6.99','2005-05-24 23:05:21','2006-02-15 22:14:21'),(6004,222,1,134,'4.99','2005-05-25 21:48:41','2006-02-15 22:14:21'),(6005,222,2,416,'0.99','2005-05-27 15:02:10','2006-02-15 22:14:21'),(6006,222,2,809,'3.99','2005-05-29 19:10:20','2006-02-15 22:14:21'),(6007,222,2,1006,'2.99','2005-05-31 00:57:08','2006-02-15 22:14:21'),(6008,222,1,1368,'8.99','2005-06-15 14:27:47','2006-02-15 22:14:21'),(6009,222,2,2603,'6.99','2005-06-19 06:21:25','2006-02-15 22:14:21'),(6010,222,2,5209,'8.99','2005-07-09 11:22:39','2006-02-15 22:14:21'),(6011,222,1,5266,'3.99','2005-07-09 14:17:40','2006-02-15 22:14:21'),(6012,222,2,5592,'6.99','2005-07-10 04:26:13','2006-02-15 22:14:21'),(6013,222,2,5635,'5.99','2005-07-10 06:28:39','2006-02-15 22:14:21'),(6014,222,2,6129,'2.99','2005-07-11 08:15:09','2006-02-15 22:14:21'),(6015,222,1,6497,'0.99','2005-07-12 03:04:29','2006-02-15 22:14:21'),(6016,222,2,7786,'0.99','2005-07-28 07:18:26','2006-02-15 22:14:21'),(6017,222,1,8300,'1.99','2005-07-29 02:57:59','2006-02-15 22:14:21'),(6018,222,2,8597,'6.99','2005-07-29 12:55:55','2006-02-15 22:14:21'),(6019,222,1,8787,'4.99','2005-07-29 20:43:49','2006-02-15 22:14:21'),(6020,222,2,10043,'1.99','2005-07-31 19:02:07','2006-02-15 22:14:21'),(6021,222,2,12179,'2.99','2005-08-18 01:21:21','2006-02-15 22:14:21'),(6022,222,1,13477,'2.99','2005-08-20 01:07:00','2006-02-15 22:14:21'),(6023,222,2,14350,'2.99','2005-08-21 08:58:38','2006-02-15 22:14:21'),(6024,223,2,524,'2.99','2005-05-28 03:57:28','2006-02-15 22:14:21'),(6025,223,2,1839,'5.99','2005-06-16 23:22:22','2006-02-15 22:14:21'),(6026,223,1,2334,'4.99','2005-06-18 10:56:24','2006-02-15 22:14:21'),(6027,223,1,3513,'5.99','2005-07-06 00:45:57','2006-02-15 22:14:21'),(6028,223,1,3705,'0.99','2005-07-06 10:17:59','2006-02-15 22:14:21'),(6029,223,1,4874,'4.99','2005-07-08 19:23:38','2006-02-15 22:14:21'),(6030,223,2,5996,'2.99','2005-07-11 01:18:33','2006-02-15 22:14:21'),(6031,223,2,7085,'5.99','2005-07-27 04:35:44','2006-02-15 22:14:22'),(6032,223,2,8362,'3.99','2005-07-29 05:09:11','2006-02-15 22:14:22'),(6033,223,2,10053,'7.99','2005-07-31 19:15:39','2006-02-15 22:14:22'),(6034,223,2,11040,'4.99','2005-08-02 06:03:22','2006-02-15 22:14:22'),(6035,223,1,12927,'5.99','2005-08-19 05:02:46','2006-02-15 22:14:22'),(6036,223,1,13576,'0.99','2005-08-20 05:19:56','2006-02-15 22:14:22'),(6037,223,2,14496,'4.99','2005-08-21 14:07:35','2006-02-15 22:14:22'),(6038,223,1,15257,'7.99','2005-08-22 18:21:04','2006-02-15 22:14:22'),(6039,223,2,15546,'5.99','2005-08-23 04:20:38','2006-02-15 22:14:22'),(6040,223,1,15662,'2.99','2005-08-23 08:52:50','2006-02-15 22:14:22'),(6041,224,1,1424,'7.99','2005-06-15 18:08:14','2006-02-15 22:14:22'),(6042,224,1,2277,'2.99','2005-06-18 06:35:03','2006-02-15 22:14:22'),(6043,224,2,3282,'4.99','2005-06-21 06:18:42','2006-02-15 22:14:22'),(6044,224,1,4118,'2.99','2005-07-07 07:03:30','2006-02-15 22:14:22'),(6045,224,2,4411,'3.99','2005-07-07 21:54:58','2006-02-15 22:14:22'),(6046,224,1,4697,'2.99','2005-07-08 11:19:14','2006-02-15 22:14:22'),(6047,224,1,6031,'4.99','2005-07-11 02:42:14','2006-02-15 22:14:22'),(6048,224,2,6999,'2.99','2005-07-27 01:21:19','2006-02-15 22:14:22'),(6049,224,2,8255,'0.99','2005-07-29 01:02:30','2006-02-15 22:14:22'),(6050,224,2,8439,'2.99','2005-07-29 07:28:43','2006-02-15 22:14:23'),(6051,224,1,8605,'4.99','2005-07-29 13:13:34','2006-02-15 22:14:23'),(6052,224,1,9181,'0.99','2005-07-30 12:05:58','2006-02-15 22:14:23'),(6053,224,1,11816,'0.99','2005-08-17 12:14:16','2006-02-15 22:14:23'),(6054,224,1,12492,'4.99','2005-08-18 12:49:04','2006-02-15 22:14:23'),(6055,224,1,12969,'2.99','2005-08-19 06:38:59','2006-02-15 22:14:23'),(6056,224,2,13075,'4.99','2005-08-19 10:10:10','2006-02-15 22:14:23'),(6057,224,2,14099,'0.99','2005-08-21 00:31:03','2006-02-15 22:14:23'),(6058,224,2,14271,'5.99','2005-08-21 06:23:29','2006-02-15 22:14:23'),(6059,224,2,14468,'5.99','2005-08-21 13:07:10','2006-02-15 22:14:23'),(6060,224,2,14880,'2.99','2005-08-22 03:44:36','2006-02-15 22:14:23'),(6061,224,1,15225,'0.99','2005-08-22 17:18:32','2006-02-15 22:14:23'),(6062,224,1,15952,'1.99','2005-08-23 19:11:29','2006-02-15 22:14:23'),(6063,225,1,812,'4.99','2005-05-29 20:00:30','2006-02-15 22:14:23'),(6064,225,1,963,'3.99','2005-05-30 18:52:53','2006-02-15 22:14:23'),(6065,225,2,2226,'7.99','2005-06-18 03:39:56','2006-02-15 22:14:23'),(6066,225,2,3574,'4.99','2005-07-06 03:36:01','2006-02-15 22:14:23'),(6067,225,1,4345,'7.99','2005-07-07 18:52:57','2006-02-15 22:14:23'),(6068,225,1,4824,'7.99','2005-07-08 17:37:39','2006-02-15 22:14:23'),(6069,225,2,4955,'2.99','2005-07-08 23:16:21','2006-02-15 22:14:24'),(6070,225,1,5067,'4.99','2005-07-09 04:52:35','2006-02-15 22:14:24'),(6071,225,1,6159,'2.99','2005-07-11 09:55:34','2006-02-15 22:14:24'),(6072,225,1,6317,'2.99','2005-07-11 18:47:41','2006-02-15 22:14:24'),(6073,225,2,6350,'2.99','2005-07-11 20:30:15','2006-02-15 22:14:24'),(6074,225,1,6526,'3.99','2005-07-12 04:21:20','2006-02-15 22:14:24'),(6075,225,2,6532,'2.99','2005-07-12 04:38:32','2006-02-15 22:14:24'),(6076,225,2,7347,'4.99','2005-07-27 14:31:24','2006-02-15 22:14:24'),(6077,225,1,7524,'6.99','2005-07-27 21:11:44','2006-02-15 22:14:24'),(6078,225,1,8054,'7.99','2005-07-28 17:02:18','2006-02-15 22:14:25'),(6079,225,2,8110,'4.99','2005-07-28 19:07:45','2006-02-15 22:14:25'),(6080,225,1,9980,'4.99','2005-07-31 17:02:00','2006-02-15 22:14:25'),(6081,225,2,9993,'2.99','2005-07-31 17:30:20','2006-02-15 22:14:25'),(6082,225,2,10138,'2.99','2005-07-31 22:02:09','2006-02-15 22:14:25'),(6083,225,1,10793,'2.99','2005-08-01 21:48:03','2006-02-15 22:14:25'),(6084,225,2,11333,'1.99','2005-08-02 16:53:00','2006-02-15 22:14:25'),(6085,225,2,11384,'0.99','2005-08-02 18:23:01','2006-02-15 22:14:25'),(6086,225,2,11395,'5.99','2005-08-02 18:47:44','2006-02-15 22:14:25'),(6087,225,2,11437,'4.99','2005-08-02 20:20:06','2006-02-15 22:14:25'),(6088,225,2,14444,'5.99','2005-08-21 12:07:25','2006-02-15 22:14:25'),(6089,226,2,3414,'2.99','2005-06-21 16:58:50','2006-02-15 22:14:25'),(6090,226,1,3466,'4.99','2005-06-21 22:13:33','2006-02-15 22:14:25'),(6091,226,1,3721,'4.99','2005-07-06 11:10:09','2006-02-15 22:14:25'),(6092,226,1,4324,'4.99','2005-07-07 17:57:56','2006-02-15 22:14:25'),(6093,226,1,5282,'2.99','2005-07-09 15:01:23','2006-02-15 22:14:25'),(6094,226,1,5419,'2.99','2005-07-09 20:47:36','2006-02-15 22:14:25'),(6095,226,1,6712,'9.99','2005-07-12 13:24:47','2006-02-15 22:14:25'),(6096,226,2,7288,'5.99','2005-07-27 12:24:59','2006-02-15 22:14:25'),(6097,226,1,7329,'3.99','2005-07-27 13:55:34','2006-02-15 22:14:25'),(6098,226,2,8600,'2.99','2005-07-29 13:01:19','2006-02-15 22:14:25'),(6099,226,1,8627,'2.99','2005-07-29 14:05:12','2006-02-15 22:14:25'),(6100,226,1,12172,'1.99','2005-08-18 01:07:00','2006-02-15 22:14:25'),(6101,226,1,14491,'6.99','2005-08-21 13:55:39','2006-02-15 22:14:25'),(6102,226,1,14708,'4.99','2005-08-21 21:07:23','2006-02-15 22:14:26'),(6103,226,1,14712,'0.99','2005-08-21 21:22:56','2006-02-15 22:14:26'),(6104,226,2,14739,'0.99','2005-08-21 22:33:22','2006-02-15 22:14:26'),(6105,226,2,14934,'4.99','2005-08-22 05:47:15','2006-02-15 22:14:26'),(6106,226,2,15472,'2.99','2005-08-23 01:39:05','2006-02-15 22:14:26'),(6107,226,1,15901,'4.99','2005-08-23 17:19:17','2006-02-15 22:14:26'),(6108,226,1,15986,'2.99','2005-08-23 20:20:37','2006-02-15 22:14:26'),(6109,226,1,16033,'5.99','2005-08-23 22:06:15','2006-02-15 22:14:26'),(6110,227,1,111,'4.99','2005-05-25 18:45:19','2006-02-15 22:14:26'),(6111,227,1,1023,'3.99','2005-05-31 03:26:50','2006-02-15 22:14:26'),(6112,227,1,1679,'2.99','2005-06-16 11:11:01','2006-02-15 22:14:26'),(6113,227,2,2155,'1.99','2005-06-17 23:07:29','2006-02-15 22:14:26'),(6114,227,1,2164,'6.99','2005-06-17 23:46:21','2006-02-15 22:14:26'),(6115,227,2,3065,'0.99','2005-06-20 13:53:53','2006-02-15 22:14:26'),(6116,227,1,3576,'5.99','2005-07-06 03:40:01','2006-02-15 22:14:26'),(6117,227,2,4340,'2.99','2005-07-07 18:41:46','2006-02-15 22:14:26'),(6118,227,2,4459,'4.99','2005-07-07 23:48:52','2006-02-15 22:14:26'),(6119,227,1,4680,'2.99','2005-07-08 10:35:28','2006-02-15 22:14:26'),(6120,227,1,5046,'3.99','2005-07-09 03:34:57','2006-02-15 22:14:26'),(6121,227,1,7132,'7.99','2005-07-27 06:28:34','2006-02-15 22:14:26'),(6122,227,1,8219,'2.99','2005-07-28 23:46:31','2006-02-15 22:14:26'),(6123,227,1,8234,'0.99','2005-07-29 00:19:20','2006-02-15 22:14:26'),(6124,227,1,8384,'0.99','2005-07-29 05:38:43','2006-02-15 22:14:26'),(6125,227,2,8417,'4.99','2005-07-29 06:53:36','2006-02-15 22:14:26'),(6126,227,1,8936,'2.99','2005-07-30 02:47:13','2006-02-15 22:14:26'),(6127,227,2,9521,'2.99','2005-07-31 00:52:24','2006-02-15 22:14:26'),(6128,227,2,10999,'3.99','2005-08-02 04:53:13','2006-02-15 22:14:26'),(6129,227,2,11892,'0.99','2005-08-17 15:13:21','2006-02-15 22:14:26'),(6130,227,2,13379,'4.99','2005-08-19 21:33:39','2006-02-15 22:14:26'),(6131,227,2,15406,'0.99','2005-08-22 23:21:22','2006-02-15 22:14:26'),(6132,227,2,15976,'4.99','2005-08-23 20:07:08','2006-02-15 22:14:27'),(6133,227,2,13374,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:27'),(6134,228,2,492,'4.99','2005-05-28 00:24:58','2006-02-15 22:14:27'),(6135,228,2,1070,'0.99','2005-05-31 09:39:56','2006-02-15 22:14:27'),(6136,228,2,2284,'3.99','2005-06-18 06:59:51','2006-02-15 22:14:27'),(6137,228,2,2863,'2.99','2005-06-19 23:58:38','2006-02-15 22:14:27'),(6138,228,2,2934,'2.99','2005-06-20 05:05:53','2006-02-15 22:14:27'),(6139,228,2,3433,'3.99','2005-06-21 19:07:19','2006-02-15 22:14:27'),(6140,228,2,3538,'0.99','2005-07-06 01:37:07','2006-02-15 22:14:27'),(6141,228,2,3710,'8.99','2005-07-06 10:28:53','2006-02-15 22:14:27'),(6142,228,1,3715,'6.99','2005-07-06 10:51:48','2006-02-15 22:14:27'),(6143,228,2,3796,'0.99','2005-07-06 14:45:22','2006-02-15 22:14:27'),(6144,228,1,4217,'3.99','2005-07-07 12:08:59','2006-02-15 22:14:27'),(6145,228,1,4636,'4.99','2005-07-08 08:44:32','2006-02-15 22:14:27'),(6146,228,1,4909,'0.99','2005-07-08 21:07:24','2006-02-15 22:14:27'),(6147,228,1,5151,'2.99','2005-07-09 08:31:03','2006-02-15 22:14:28'),(6148,228,1,5320,'4.99','2005-07-09 16:23:32','2006-02-15 22:14:28'),(6149,228,2,5902,'0.99','2005-07-10 20:31:24','2006-02-15 22:14:28'),(6150,228,2,6141,'1.99','2005-07-11 08:52:16','2006-02-15 22:14:28'),(6151,228,1,6948,'2.99','2005-07-26 23:43:49','2006-02-15 22:14:28'),(6152,228,2,7509,'8.99','2005-07-27 20:37:19','2006-02-15 22:14:28'),(6153,228,1,7601,'0.99','2005-07-27 23:48:15','2006-02-15 22:14:28'),(6154,228,1,8147,'2.99','2005-07-28 20:37:56','2006-02-15 22:14:28'),(6155,228,1,10585,'4.99','2005-08-01 14:00:42','2006-02-15 22:14:28'),(6156,228,1,12304,'0.99','2005-08-18 05:44:29','2006-02-15 22:14:28'),(6157,228,2,12952,'2.99','2005-08-19 06:00:52','2006-02-15 22:14:28'),(6158,228,2,13458,'4.99','2005-08-20 00:35:30','2006-02-15 22:14:28'),(6159,228,2,12672,'3.98','2006-02-14 15:16:03','2006-02-15 22:14:28'),(6160,228,1,15234,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:28'),(6161,229,1,2200,'4.99','2005-06-18 01:59:16','2006-02-15 22:14:28'),(6162,229,1,3208,'0.99','2005-06-21 00:50:03','2006-02-15 22:14:28'),(6163,229,1,3277,'7.99','2005-06-21 05:36:37','2006-02-15 22:14:28'),(6164,229,2,3280,'0.99','2005-06-21 06:08:12','2006-02-15 22:14:28'),(6165,229,2,3933,'4.99','2005-07-06 21:06:37','2006-02-15 22:14:28'),(6166,229,2,4458,'2.99','2005-07-07 23:47:47','2006-02-15 22:14:28'),(6167,229,1,4515,'4.99','2005-07-08 02:42:03','2006-02-15 22:14:28'),(6168,229,2,4694,'0.99','2005-07-08 11:07:37','2006-02-15 22:14:28'),(6169,229,1,5623,'2.99','2005-07-10 05:41:38','2006-02-15 22:14:29'),(6170,229,2,6155,'4.99','2005-07-11 09:45:31','2006-02-15 22:14:29'),(6171,229,2,6578,'4.99','2005-07-12 06:15:41','2006-02-15 22:14:29'),(6172,229,1,6880,'2.99','2005-07-12 20:41:35','2006-02-15 22:14:29'),(6173,229,2,7305,'0.99','2005-07-27 12:57:06','2006-02-15 22:14:29'),(6174,229,2,7308,'5.99','2005-07-27 13:00:25','2006-02-15 22:14:29'),(6175,229,2,7629,'0.99','2005-07-28 01:00:09','2006-02-15 22:14:29'),(6176,229,2,7640,'7.99','2005-07-28 01:14:49','2006-02-15 22:14:29'),(6177,229,2,9913,'3.99','2005-07-31 14:51:04','2006-02-15 22:14:29'),(6178,229,1,11521,'4.99','2005-08-17 00:04:54','2006-02-15 22:14:29'),(6179,229,1,12866,'2.99','2005-08-19 02:39:47','2006-02-15 22:14:29'),(6180,229,2,13306,'0.99','2005-08-19 18:57:29','2006-02-15 22:14:29'),(6181,229,2,13431,'4.99','2005-08-19 23:28:15','2006-02-15 22:14:29'),(6182,229,1,13679,'5.99','2005-08-20 08:39:34','2006-02-15 22:14:29'),(6183,229,1,15740,'4.99','2005-08-23 12:07:51','2006-02-15 22:14:29'),(6184,229,2,15912,'2.99','2005-08-23 17:47:40','2006-02-15 22:14:29'),(6185,229,2,13295,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:29'),(6186,230,1,32,'0.99','2005-05-25 04:06:21','2006-02-15 22:14:29'),(6187,230,1,1078,'4.99','2005-05-31 10:28:33','2006-02-15 22:14:29'),(6188,230,2,1468,'3.99','2005-06-15 20:48:22','2006-02-15 22:14:30'),(6189,230,1,1744,'4.99','2005-06-16 16:39:58','2006-02-15 22:14:30'),(6190,230,2,1793,'0.99','2005-06-16 20:07:27','2006-02-15 22:14:30'),(6191,230,2,2450,'8.99','2005-06-18 19:25:47','2006-02-15 22:14:30'),(6192,230,2,2675,'0.99','2005-06-19 11:52:15','2006-02-15 22:14:30'),(6193,230,1,2777,'0.99','2005-06-19 18:16:26','2006-02-15 22:14:30'),(6194,230,1,4509,'3.99','2005-07-08 02:32:38','2006-02-15 22:14:30'),(6195,230,1,4935,'0.99','2005-07-08 22:20:56','2006-02-15 22:14:30'),(6196,230,1,5045,'4.99','2005-07-09 03:33:32','2006-02-15 22:14:30'),(6197,230,1,5061,'0.99','2005-07-09 04:30:50','2006-02-15 22:14:30'),(6198,230,2,5269,'2.99','2005-07-09 14:23:05','2006-02-15 22:14:30'),(6199,230,2,6126,'4.99','2005-07-11 08:06:56','2006-02-15 22:14:30'),(6200,230,1,6251,'2.99','2005-07-11 15:06:20','2006-02-15 22:14:30'),(6201,230,2,7333,'4.99','2005-07-27 13:59:11','2006-02-15 22:14:30'),(6202,230,2,7390,'4.99','2005-07-27 15:59:19','2006-02-15 22:14:30'),(6203,230,2,8032,'4.99','2005-07-28 16:17:00','2006-02-15 22:14:30'),(6204,230,2,8653,'0.99','2005-07-29 15:04:23','2006-02-15 22:14:30'),(6205,230,1,8815,'2.99','2005-07-29 21:51:26','2006-02-15 22:14:30'),(6206,230,2,9778,'3.99','2005-07-31 10:02:04','2006-02-15 22:14:30'),(6207,230,2,10050,'3.99','2005-07-31 19:13:29','2006-02-15 22:14:30'),(6208,230,1,10057,'9.99','2005-07-31 19:20:18','2006-02-15 22:14:30'),(6209,230,2,10874,'2.99','2005-08-02 00:31:00','2006-02-15 22:14:30'),(6210,230,2,11148,'5.99','2005-08-02 09:47:08','2006-02-15 22:14:30'),(6211,230,1,11552,'5.99','2005-08-17 01:04:29','2006-02-15 22:14:30'),(6212,230,2,11914,'2.99','2005-08-17 16:04:42','2006-02-15 22:14:30'),(6213,230,1,12079,'1.99','2005-08-17 22:04:17','2006-02-15 22:14:30'),(6214,230,2,12523,'7.99','2005-08-18 13:45:41','2006-02-15 22:14:30'),(6215,230,2,12542,'0.99','2005-08-18 14:21:11','2006-02-15 22:14:31'),(6216,230,2,14017,'0.99','2005-08-20 20:55:32','2006-02-15 22:14:31'),(6217,230,1,14073,'5.99','2005-08-20 23:12:57','2006-02-15 22:14:31'),(6218,230,1,14340,'2.99','2005-08-21 08:38:21','2006-02-15 22:14:31'),(6219,231,1,329,'5.99','2005-05-27 01:57:14','2006-02-15 22:14:31'),(6220,231,1,479,'6.99','2005-05-27 22:39:10','2006-02-15 22:14:31'),(6221,231,1,512,'8.99','2005-05-28 03:07:50','2006-02-15 22:14:31'),(6222,231,2,2423,'0.99','2005-06-18 17:32:08','2006-02-15 22:14:31'),(6223,231,2,3561,'9.99','2005-07-06 02:54:33','2006-02-15 22:14:31'),(6224,231,1,3839,'2.99','2005-07-06 16:30:30','2006-02-15 22:14:31'),(6225,231,2,4289,'0.99','2005-07-07 15:45:58','2006-02-15 22:14:31'),(6226,231,2,4969,'0.99','2005-07-08 23:51:26','2006-02-15 22:14:31'),(6227,231,1,5096,'2.99','2005-07-09 06:08:23','2006-02-15 22:14:31'),(6228,231,1,5560,'5.99','2005-07-10 03:13:24','2006-02-15 22:14:31'),(6229,231,1,6862,'0.99','2005-07-12 19:58:09','2006-02-15 22:14:31'),(6230,231,1,6877,'1.99','2005-07-12 20:32:58','2006-02-15 22:14:31'),(6231,231,1,8556,'0.99','2005-07-29 11:18:27','2006-02-15 22:14:31'),(6232,231,2,8949,'5.99','2005-07-30 03:17:02','2006-02-15 22:14:31'),(6233,231,2,9711,'2.99','2005-07-31 08:06:41','2006-02-15 22:14:31'),(6234,231,2,11113,'2.99','2005-08-02 08:26:24','2006-02-15 22:14:31'),(6235,231,1,11202,'7.99','2005-08-02 11:51:57','2006-02-15 22:14:31'),(6236,231,1,11581,'5.99','2005-08-17 02:03:02','2006-02-15 22:14:32'),(6237,231,1,12214,'0.99','2005-08-18 02:34:22','2006-02-15 22:14:32'),(6238,231,2,12230,'8.99','2005-08-18 03:11:04','2006-02-15 22:14:32'),(6239,231,1,12231,'3.99','2005-08-18 03:11:44','2006-02-15 22:14:32'),(6240,231,2,13983,'6.99','2005-08-20 19:08:32','2006-02-15 22:14:32'),(6241,231,1,14026,'0.99','2005-08-20 21:21:08','2006-02-15 22:14:32'),(6242,231,1,14478,'4.99','2005-08-21 13:33:28','2006-02-15 22:14:32'),(6243,231,2,14806,'2.99','2005-08-22 00:53:08','2006-02-15 22:14:32'),(6244,231,1,15389,'3.99','2005-08-22 22:51:13','2006-02-15 22:14:33'),(6245,232,1,28,'4.99','2005-05-25 03:42:37','2006-02-15 22:14:33'),(6246,232,1,805,'3.99','2005-05-29 18:18:18','2006-02-15 22:14:33'),(6247,232,2,1619,'0.99','2005-06-16 07:14:13','2006-02-15 22:14:33'),(6248,232,1,2833,'8.99','2005-06-19 21:34:54','2006-02-15 22:14:33'),(6249,232,2,6234,'5.99','2005-07-11 14:16:10','2006-02-15 22:14:33'),(6250,232,1,6309,'2.99','2005-07-11 18:13:24','2006-02-15 22:14:33'),(6251,232,1,7123,'5.99','2005-07-27 06:08:48','2006-02-15 22:14:33'),(6252,232,2,7653,'4.99','2005-07-28 01:58:30','2006-02-15 22:14:33'),(6253,232,2,7707,'0.99','2005-07-28 04:07:47','2006-02-15 22:14:33'),(6254,232,1,7749,'2.99','2005-07-28 05:53:36','2006-02-15 22:14:33'),(6255,232,1,7990,'2.99','2005-07-28 14:43:08','2006-02-15 22:14:33'),(6256,232,1,8306,'2.99','2005-07-29 03:12:26','2006-02-15 22:14:33'),(6257,232,2,8401,'4.99','2005-07-29 06:25:08','2006-02-15 22:14:33'),(6258,232,2,8655,'4.99','2005-07-29 15:04:42','2006-02-15 22:14:33'),(6259,232,2,9270,'0.99','2005-07-30 15:03:16','2006-02-15 22:14:33'),(6260,232,2,9330,'10.99','2005-07-30 17:44:24','2006-02-15 22:14:33'),(6261,232,2,9365,'2.99','2005-07-30 18:46:02','2006-02-15 22:14:33'),(6262,232,2,10157,'2.99','2005-07-31 22:38:48','2006-02-15 22:14:33'),(6263,232,1,10539,'6.99','2005-08-01 12:23:00','2006-02-15 22:14:33'),(6264,232,2,11861,'0.99','2005-08-17 13:53:47','2006-02-15 22:14:33'),(6265,232,2,12853,'2.99','2005-08-19 02:15:32','2006-02-15 22:14:33'),(6266,232,2,13707,'2.99','2005-08-20 09:33:58','2006-02-15 22:14:33'),(6267,232,2,14527,'0.99','2005-08-21 15:07:42','2006-02-15 22:14:33'),(6268,232,2,14857,'0.99','2005-08-22 02:42:39','2006-02-15 22:14:33'),(6269,232,2,15553,'2.99','2005-08-23 04:33:39','2006-02-15 22:14:33'),(6270,233,2,1992,'2.99','2005-06-17 10:58:53','2006-02-15 22:14:33'),(6271,233,2,2244,'2.99','2005-06-18 04:46:33','2006-02-15 22:14:33'),(6272,233,1,2424,'2.99','2005-06-18 17:35:08','2006-02-15 22:14:33'),(6273,233,2,2443,'4.99','2005-06-18 18:52:30','2006-02-15 22:14:33'),(6274,233,1,3832,'2.99','2005-07-06 16:12:23','2006-02-15 22:14:34'),(6275,233,1,4015,'5.99','2005-07-07 00:59:46','2006-02-15 22:14:34'),(6276,233,1,4885,'4.99','2005-07-08 19:51:17','2006-02-15 22:14:34'),(6277,233,2,5267,'5.99','2005-07-09 14:21:10','2006-02-15 22:14:34'),(6278,233,1,5846,'2.99','2005-07-10 17:25:24','2006-02-15 22:14:34'),(6279,233,1,6319,'4.99','2005-07-11 18:50:45','2006-02-15 22:14:34'),(6280,233,1,6794,'2.99','2005-07-12 16:38:23','2006-02-15 22:14:34'),(6281,233,1,7056,'8.99','2005-07-27 03:46:27','2006-02-15 22:14:34'),(6282,233,2,7387,'4.99','2005-07-27 15:54:19','2006-02-15 22:14:34'),(6283,233,2,8385,'5.99','2005-07-29 05:39:16','2006-02-15 22:14:34'),(6284,233,2,8530,'2.99','2005-07-29 10:26:14','2006-02-15 22:14:34'),(6285,233,2,8596,'0.99','2005-07-29 12:48:54','2006-02-15 22:14:34'),(6286,233,1,9574,'0.99','2005-07-31 02:49:20','2006-02-15 22:14:34'),(6287,233,1,10582,'4.99','2005-08-01 13:54:22','2006-02-15 22:14:34'),(6288,233,1,12443,'5.99','2005-08-18 10:50:59','2006-02-15 22:14:34'),(6289,233,2,14357,'2.99','2005-08-21 09:13:09','2006-02-15 22:14:34'),(6290,233,2,15285,'2.99','2005-08-22 19:17:24','2006-02-15 22:14:34'),(6291,233,1,15790,'1.99','2005-08-23 14:01:07','2006-02-15 22:14:34'),(6292,233,2,15821,'0.99','2005-08-23 15:03:58','2006-02-15 22:14:34'),(6293,234,2,1125,'4.99','2005-05-31 17:23:44','2006-02-15 22:14:34'),(6294,234,2,1245,'3.99','2005-06-15 05:09:01','2006-02-15 22:14:34'),(6295,234,2,1645,'0.99','2005-06-16 09:10:06','2006-02-15 22:14:34'),(6296,234,1,1674,'2.99','2005-06-16 10:57:00','2006-02-15 22:14:34'),(6297,234,2,1993,'5.99','2005-06-17 10:59:24','2006-02-15 22:14:34'),(6298,234,1,2005,'4.99','2005-06-17 11:44:54','2006-02-15 22:14:34'),(6299,234,2,2511,'5.99','2005-06-18 23:45:30','2006-02-15 22:14:34'),(6300,234,2,3185,'6.99','2005-06-20 22:58:01','2006-02-15 22:14:34'),(6301,234,2,3199,'4.99','2005-06-21 00:12:40','2006-02-15 22:14:34'),(6302,234,2,4686,'0.99','2005-07-08 10:53:39','2006-02-15 22:14:34'),(6303,234,1,4721,'7.99','2005-07-08 12:39:31','2006-02-15 22:14:34'),(6304,234,2,10133,'5.99','2005-07-31 21:55:07','2006-02-15 22:14:34'),(6305,234,2,10541,'0.99','2005-08-01 12:24:54','2006-02-15 22:14:35'),(6306,234,2,10580,'6.99','2005-08-01 13:51:14','2006-02-15 22:14:35'),(6307,234,2,10968,'7.99','2005-08-02 04:03:13','2006-02-15 22:14:35'),(6308,234,1,11050,'4.99','2005-08-02 06:17:16','2006-02-15 22:14:35'),(6309,234,1,11073,'0.99','2005-08-02 07:13:03','2006-02-15 22:14:35'),(6310,234,1,11481,'3.99','2005-08-02 22:18:41','2006-02-15 22:14:35'),(6311,234,1,11882,'3.99','2005-08-17 14:33:41','2006-02-15 22:14:35'),(6312,234,1,12226,'0.99','2005-08-18 03:00:48','2006-02-15 22:14:35'),(6313,234,2,12863,'4.99','2005-08-19 02:35:59','2006-02-15 22:14:35'),(6314,234,1,12921,'5.99','2005-08-19 04:47:48','2006-02-15 22:14:35'),(6315,234,2,13349,'2.99','2005-08-19 20:43:16','2006-02-15 22:14:35'),(6316,234,2,15037,'5.99','2005-08-22 09:36:33','2006-02-15 22:14:35'),(6317,234,1,15129,'2.99','2005-08-22 13:03:52','2006-02-15 22:14:35'),(6318,234,1,15778,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:35'),(6319,235,2,807,'2.99','2005-05-29 18:50:50','2006-02-15 22:14:35'),(6320,235,1,1148,'0.99','2005-05-31 20:38:40','2006-02-15 22:14:35'),(6321,235,1,1493,'4.99','2005-06-15 21:50:32','2006-02-15 22:14:35'),(6322,235,2,1811,'0.99','2005-06-16 21:06:20','2006-02-15 22:14:35'),(6323,235,2,3581,'2.99','2005-07-06 03:57:35','2006-02-15 22:14:35'),(6324,235,1,3752,'6.99','2005-07-06 12:30:12','2006-02-15 22:14:35'),(6325,235,1,3968,'4.99','2005-07-06 22:47:09','2006-02-15 22:14:35'),(6326,235,2,4592,'2.99','2005-07-08 06:31:28','2006-02-15 22:14:35'),(6327,235,1,5790,'4.99','2005-07-10 14:15:21','2006-02-15 22:14:35'),(6328,235,1,6047,'2.99','2005-07-11 03:27:01','2006-02-15 22:14:35'),(6329,235,2,6352,'4.99','2005-07-11 20:34:13','2006-02-15 22:14:35'),(6330,235,2,6466,'4.99','2005-07-12 01:21:03','2006-02-15 22:14:35'),(6331,235,1,8120,'0.99','2005-07-28 19:24:24','2006-02-15 22:14:35'),(6332,235,2,8446,'6.99','2005-07-29 07:38:10','2006-02-15 22:14:35'),(6333,235,2,8781,'0.99','2005-07-29 20:20:16','2006-02-15 22:14:35'),(6334,235,1,9019,'5.99','2005-07-30 05:28:53','2006-02-15 22:14:35'),(6335,235,2,9519,'6.99','2005-07-31 00:45:57','2006-02-15 22:14:35'),(6336,235,1,9587,'3.99','2005-07-31 03:10:30','2006-02-15 22:14:36'),(6337,235,2,10155,'0.99','2005-07-31 22:31:43','2006-02-15 22:14:36'),(6338,235,2,12332,'2.99','2005-08-18 06:51:05','2006-02-15 22:14:36'),(6339,235,1,12502,'4.99','2005-08-18 13:16:31','2006-02-15 22:14:36'),(6340,235,2,13070,'0.99','2005-08-19 09:56:23','2006-02-15 22:14:36'),(6341,235,1,13469,'0.99','2005-08-20 00:59:36','2006-02-15 22:14:36'),(6342,235,2,14749,'3.99','2005-08-21 23:08:33','2006-02-15 22:14:36'),(6343,235,1,15034,'6.99','2005-08-22 09:33:08','2006-02-15 22:14:36'),(6344,236,2,262,'2.99','2005-05-26 15:46:56','2006-02-15 22:14:36'),(6345,236,2,344,'2.99','2005-05-27 04:30:22','2006-02-15 22:14:36'),(6346,236,1,1032,'2.99','2005-05-31 04:28:43','2006-02-15 22:14:36'),(6347,236,1,1262,'0.99','2005-06-15 06:54:53','2006-02-15 22:14:36'),(6348,236,2,1308,'5.99','2005-06-15 10:07:48','2006-02-15 22:14:36'),(6349,236,2,2139,'8.99','2005-06-17 21:29:34','2006-02-15 22:14:36'),(6350,236,2,2311,'6.99','2005-06-18 08:51:29','2006-02-15 22:14:36'),(6351,236,1,2630,'2.99','2005-06-19 08:47:21','2006-02-15 22:14:36'),(6352,236,2,2840,'3.99','2005-06-19 22:17:44','2006-02-15 22:14:36'),(6353,236,1,3353,'4.99','2005-06-21 11:29:23','2006-02-15 22:14:36'),(6354,236,2,3460,'2.99','2005-06-21 21:46:56','2006-02-15 22:14:36'),(6355,236,1,3645,'0.99','2005-07-06 07:22:09','2006-02-15 22:14:36'),(6356,236,2,3857,'4.99','2005-07-06 17:07:54','2006-02-15 22:14:36'),(6357,236,2,4749,'4.99','2005-07-08 14:05:58','2006-02-15 22:14:36'),(6358,236,1,4959,'0.99','2005-07-08 23:22:23','2006-02-15 22:14:36'),(6359,236,1,5404,'2.99','2005-07-09 20:10:43','2006-02-15 22:14:36'),(6360,236,1,5545,'3.99','2005-07-10 02:50:29','2006-02-15 22:14:36'),(6361,236,2,5938,'3.99','2005-07-10 22:17:42','2006-02-15 22:14:36'),(6362,236,2,6049,'0.99','2005-07-11 03:32:32','2006-02-15 22:14:36'),(6363,236,2,6281,'4.99','2005-07-11 16:38:16','2006-02-15 22:14:36'),(6364,236,1,6303,'2.99','2005-07-11 17:55:43','2006-02-15 22:14:36'),(6365,236,2,6996,'4.99','2005-07-27 01:13:45','2006-02-15 22:14:36'),(6366,236,2,7047,'4.99','2005-07-27 03:31:11','2006-02-15 22:14:36'),(6367,236,2,7253,'0.99','2005-07-27 10:46:37','2006-02-15 22:14:37'),(6368,236,1,7780,'5.99','2005-07-28 07:11:55','2006-02-15 22:14:37'),(6369,236,1,7792,'4.99','2005-07-28 07:24:02','2006-02-15 22:14:37'),(6370,236,2,7798,'2.99','2005-07-28 07:41:59','2006-02-15 22:14:37'),(6371,236,1,8657,'2.99','2005-07-29 15:09:25','2006-02-15 22:14:37'),(6372,236,1,9011,'5.99','2005-07-30 05:16:29','2006-02-15 22:14:37'),(6373,236,1,9934,'2.99','2005-07-31 15:25:26','2006-02-15 22:14:37'),(6374,236,2,10137,'4.99','2005-07-31 22:01:41','2006-02-15 22:14:37'),(6375,236,2,11139,'6.99','2005-08-02 09:27:36','2006-02-15 22:14:37'),(6376,236,2,11486,'3.99','2005-08-02 22:34:06','2006-02-15 22:14:37'),(6377,236,2,11507,'5.99','2005-08-16 23:26:43','2006-02-15 22:14:37'),(6378,236,1,11895,'4.99','2005-08-17 15:15:07','2006-02-15 22:14:37'),(6379,236,1,12975,'2.99','2005-08-19 06:51:19','2006-02-15 22:14:37'),(6380,236,1,13364,'2.99','2005-08-19 21:09:30','2006-02-15 22:14:37'),(6381,236,1,13443,'7.99','2005-08-19 23:53:42','2006-02-15 22:14:37'),(6382,236,2,14321,'4.99','2005-08-21 08:05:12','2006-02-15 22:14:37'),(6383,236,1,14364,'7.99','2005-08-21 09:25:11','2006-02-15 22:14:37'),(6384,236,2,14722,'4.99','2005-08-21 21:50:53','2006-02-15 22:14:37'),(6385,236,1,12988,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:37'),(6386,237,2,133,'0.99','2005-05-25 21:48:30','2006-02-15 22:14:37'),(6387,237,1,182,'4.99','2005-05-26 04:49:17','2006-02-15 22:14:37'),(6388,237,1,1500,'0.99','2005-06-15 22:00:45','2006-02-15 22:14:37'),(6389,237,2,1518,'0.99','2005-06-15 23:36:37','2006-02-15 22:14:37'),(6390,237,1,2156,'4.99','2005-06-17 23:08:12','2006-02-15 22:14:37'),(6391,237,1,2492,'2.99','2005-06-18 22:04:15','2006-02-15 22:14:37'),(6392,237,2,3069,'2.99','2005-06-20 14:13:00','2006-02-15 22:14:37'),(6393,237,1,4844,'4.99','2005-07-08 18:28:13','2006-02-15 22:14:37'),(6394,237,2,6053,'4.99','2005-07-11 03:51:59','2006-02-15 22:14:37'),(6395,237,1,7193,'2.99','2005-07-27 08:37:00','2006-02-15 22:14:37'),(6396,237,2,7330,'3.99','2005-07-27 13:56:46','2006-02-15 22:14:37'),(6397,237,1,7812,'4.99','2005-07-28 08:06:52','2006-02-15 22:14:37'),(6398,237,2,7951,'8.99','2005-07-28 13:21:16','2006-02-15 22:14:38'),(6399,237,2,8102,'2.99','2005-07-28 18:49:43','2006-02-15 22:14:38'),(6400,237,2,8748,'2.99','2005-07-29 19:08:37','2006-02-15 22:14:38'),(6401,237,2,8799,'6.99','2005-07-29 21:16:47','2006-02-15 22:14:38'),(6402,237,1,8835,'3.99','2005-07-29 22:44:35','2006-02-15 22:14:38'),(6403,237,1,9276,'5.99','2005-07-30 15:09:28','2006-02-15 22:14:38'),(6404,237,1,9661,'4.99','2005-07-31 06:06:37','2006-02-15 22:14:38'),(6405,237,2,9715,'1.99','2005-07-31 08:16:58','2006-02-15 22:14:38'),(6406,237,2,10056,'0.99','2005-07-31 19:19:13','2006-02-15 22:14:38'),(6407,237,2,10058,'2.99','2005-07-31 19:20:21','2006-02-15 22:14:38'),(6408,237,2,11125,'4.99','2005-08-02 08:55:35','2006-02-15 22:14:38'),(6409,237,2,11479,'11.99','2005-08-02 22:18:13','2006-02-15 22:14:38'),(6410,237,2,11772,'5.99','2005-08-17 10:18:57','2006-02-15 22:14:38'),(6411,237,1,12469,'0.99','2005-08-18 11:53:07','2006-02-15 22:14:38'),(6412,237,2,13914,'6.99','2005-08-20 16:38:57','2006-02-15 22:14:38'),(6413,237,2,13922,'6.99','2005-08-20 17:02:37','2006-02-15 22:14:38'),(6414,237,2,13969,'6.99','2005-08-20 18:42:40','2006-02-15 22:14:38'),(6415,237,2,14453,'3.99','2005-08-21 12:33:34','2006-02-15 22:14:38'),(6416,237,2,15139,'8.99','2005-08-22 13:38:11','2006-02-15 22:14:38'),(6417,237,1,15337,'0.99','2005-08-22 20:49:51','2006-02-15 22:14:38'),(6418,237,2,15931,'1.99','2005-08-23 18:28:09','2006-02-15 22:14:38'),(6419,238,2,315,'4.99','2005-05-26 23:12:55','2006-02-15 22:14:38'),(6420,238,1,842,'2.99','2005-05-30 00:32:04','2006-02-15 22:14:38'),(6421,238,1,1199,'2.99','2005-06-15 01:58:50','2006-02-15 22:14:38'),(6422,238,1,1660,'4.99','2005-06-16 10:12:55','2006-02-15 22:14:38'),(6423,238,1,3181,'2.99','2005-06-20 22:51:02','2006-02-15 22:14:38'),(6424,238,1,4143,'0.99','2005-07-07 08:22:07','2006-02-15 22:14:38'),(6425,238,1,5616,'5.99','2005-07-10 05:21:11','2006-02-15 22:14:38'),(6426,238,2,6403,'0.99','2005-07-11 22:46:25','2006-02-15 22:14:38'),(6427,238,2,7243,'4.99','2005-07-27 10:26:11','2006-02-15 22:14:38'),(6428,238,1,8310,'8.99','2005-07-29 03:25:56','2006-02-15 22:14:38'),(6429,238,1,8382,'6.99','2005-07-29 05:33:21','2006-02-15 22:14:39'),(6430,238,1,8465,'0.99','2005-07-29 08:20:49','2006-02-15 22:14:39'),(6431,238,1,9065,'4.99','2005-07-30 07:25:09','2006-02-15 22:14:39'),(6432,238,2,9841,'7.99','2005-07-31 12:24:19','2006-02-15 22:14:39'),(6433,238,1,10659,'5.99','2005-08-01 16:40:34','2006-02-15 22:14:39'),(6434,238,2,11543,'5.99','2005-08-17 00:54:28','2006-02-15 22:14:39'),(6435,238,2,11632,'2.99','2005-08-17 04:29:32','2006-02-15 22:14:39'),(6436,238,1,11897,'2.99','2005-08-17 15:24:06','2006-02-15 22:14:39'),(6437,238,1,14312,'4.99','2005-08-21 07:48:34','2006-02-15 22:14:39'),(6438,238,1,14343,'8.99','2005-08-21 08:40:21','2006-02-15 22:14:39'),(6439,238,1,15455,'0.99','2005-08-23 01:05:00','2006-02-15 22:14:39'),(6440,239,2,8,'4.99','2005-05-24 23:31:46','2006-02-15 22:14:39'),(6441,239,1,444,'2.99','2005-05-27 18:39:15','2006-02-15 22:14:39'),(6442,239,1,621,'4.99','2005-05-28 15:58:12','2006-02-15 22:14:39'),(6443,239,1,636,'6.99','2005-05-28 17:47:58','2006-02-15 22:14:39'),(6444,239,1,1022,'7.99','2005-05-31 03:16:45','2006-02-15 22:14:39'),(6445,239,2,1082,'5.99','2005-05-31 11:02:01','2006-02-15 22:14:39'),(6446,239,1,1160,'4.99','2005-06-14 23:00:34','2006-02-15 22:14:39'),(6447,239,2,1560,'4.99','2005-06-16 02:36:43','2006-02-15 22:14:39'),(6448,239,2,2215,'2.99','2005-06-18 02:48:21','2006-02-15 22:14:39'),(6449,239,1,2390,'4.99','2005-06-18 15:29:26','2006-02-15 22:14:39'),(6450,239,1,3383,'5.99','2005-06-21 14:07:19','2006-02-15 22:14:39'),(6451,239,2,3547,'0.99','2005-07-06 02:18:06','2006-02-15 22:14:39'),(6452,239,1,3552,'5.99','2005-07-06 02:34:09','2006-02-15 22:14:39'),(6453,239,2,4920,'7.99','2005-07-08 21:42:10','2006-02-15 22:14:39'),(6454,239,2,5651,'4.99','2005-07-10 07:17:13','2006-02-15 22:14:39'),(6455,239,1,5960,'0.99','2005-07-10 23:38:34','2006-02-15 22:14:39'),(6456,239,1,6573,'0.99','2005-07-12 06:03:40','2006-02-15 22:14:39'),(6457,239,2,7012,'8.99','2005-07-27 02:01:03','2006-02-15 22:14:39'),(6458,239,1,7426,'0.99','2005-07-27 17:19:46','2006-02-15 22:14:39'),(6459,239,2,7491,'2.99','2005-07-27 19:53:23','2006-02-15 22:14:39'),(6460,239,1,8457,'6.99','2005-07-29 07:59:03','2006-02-15 22:14:40'),(6461,239,2,9676,'0.99','2005-07-31 06:39:13','2006-02-15 22:14:40'),(6462,239,1,9863,'5.99','2005-07-31 13:05:29','2006-02-15 22:14:40'),(6463,239,1,10755,'0.99','2005-08-01 20:14:14','2006-02-15 22:14:40'),(6464,239,2,10923,'2.99','2005-08-02 02:15:01','2006-02-15 22:14:40'),(6465,239,1,11487,'2.99','2005-08-02 22:35:05','2006-02-15 22:14:40'),(6466,239,2,11900,'4.99','2005-08-17 15:30:44','2006-02-15 22:14:40'),(6467,239,1,11968,'0.99','2005-08-17 17:47:34','2006-02-15 22:14:40'),(6468,239,1,12340,'4.99','2005-08-18 07:07:01','2006-02-15 22:14:40'),(6469,239,1,12721,'1.99','2005-08-18 21:30:12','2006-02-15 22:14:40'),(6470,239,1,13175,'4.99','2005-08-19 13:54:53','2006-02-15 22:14:40'),(6471,239,2,13427,'4.99','2005-08-19 23:19:02','2006-02-15 22:14:40'),(6472,239,2,13999,'3.99','2005-08-20 19:53:32','2006-02-15 22:14:40'),(6473,239,2,14062,'1.99','2005-08-20 22:34:34','2006-02-15 22:14:40'),(6474,240,1,246,'2.99','2005-05-26 13:57:07','2006-02-15 22:14:40'),(6475,240,1,460,'2.99','2005-05-27 20:02:03','2006-02-15 22:14:40'),(6476,240,1,643,'4.99','2005-05-28 18:52:11','2006-02-15 22:14:40'),(6477,240,2,2196,'3.99','2005-06-18 01:47:07','2006-02-15 22:14:40'),(6478,240,1,2264,'4.99','2005-06-18 05:58:45','2006-02-15 22:14:40'),(6479,240,2,2872,'5.99','2005-06-20 00:38:21','2006-02-15 22:14:40'),(6480,240,2,4305,'4.99','2005-07-07 17:07:11','2006-02-15 22:14:40'),(6481,240,2,5262,'4.99','2005-07-09 14:08:01','2006-02-15 22:14:40'),(6482,240,1,5596,'0.99','2005-07-10 04:43:14','2006-02-15 22:14:40'),(6483,240,1,6272,'0.99','2005-07-11 16:03:49','2006-02-15 22:14:40'),(6484,240,2,6470,'0.99','2005-07-12 01:29:41','2006-02-15 22:14:40'),(6485,240,1,6956,'4.99','2005-07-26 23:55:57','2006-02-15 22:14:40'),(6486,240,1,7001,'4.99','2005-07-27 01:25:34','2006-02-15 22:14:40'),(6487,240,1,7467,'8.99','2005-07-27 18:51:54','2006-02-15 22:14:40'),(6488,240,2,7481,'4.99','2005-07-27 19:20:25','2006-02-15 22:14:40'),(6489,240,1,7870,'4.99','2005-07-28 10:16:03','2006-02-15 22:14:40'),(6490,240,2,8503,'3.99','2005-07-29 09:16:50','2006-02-15 22:14:41'),(6491,240,2,8905,'5.99','2005-07-30 01:11:11','2006-02-15 22:14:41'),(6492,240,1,10308,'7.99','2005-08-01 04:22:49','2006-02-15 22:14:41'),(6493,240,1,11745,'3.99','2005-08-17 09:00:01','2006-02-15 22:14:41'),(6494,240,2,12283,'6.99','2005-08-18 04:54:25','2006-02-15 22:14:41'),(6495,240,2,13030,'2.99','2005-08-19 08:28:11','2006-02-15 22:14:41'),(6496,240,2,13119,'4.99','2005-08-19 11:44:59','2006-02-15 22:14:41'),(6497,240,1,13663,'8.99','2005-08-20 08:12:33','2006-02-15 22:14:41'),(6498,240,2,14573,'2.99','2005-08-21 16:44:32','2006-02-15 22:14:41'),(6499,240,2,15641,'0.99','2005-08-23 08:06:49','2006-02-15 22:14:41'),(6500,241,1,627,'7.99','2005-05-28 17:04:43','2006-02-15 22:14:41'),(6501,241,1,1059,'3.99','2005-05-31 08:20:43','2006-02-15 22:14:41'),(6502,241,2,2428,'0.99','2005-06-18 17:47:34','2006-02-15 22:14:41'),(6503,241,1,2455,'0.99','2005-06-18 19:33:06','2006-02-15 22:14:41'),(6504,241,2,2478,'5.99','2005-06-18 21:01:21','2006-02-15 22:14:41'),(6505,241,2,2683,'2.99','2005-06-19 12:27:19','2006-02-15 22:14:41'),(6506,241,2,3258,'0.99','2005-06-21 03:53:58','2006-02-15 22:14:41'),(6507,241,2,3822,'0.99','2005-07-06 15:41:15','2006-02-15 22:14:41'),(6508,241,1,4731,'0.99','2005-07-08 13:08:18','2006-02-15 22:14:41'),(6509,241,2,5017,'2.99','2005-07-09 02:00:16','2006-02-15 22:14:41'),(6510,241,1,5211,'0.99','2005-07-09 11:26:50','2006-02-15 22:14:41'),(6511,241,1,5438,'4.99','2005-07-09 21:34:32','2006-02-15 22:14:41'),(6512,241,2,5525,'3.99','2005-07-10 02:03:08','2006-02-15 22:14:41'),(6513,241,1,5981,'4.99','2005-07-11 00:19:04','2006-02-15 22:14:41'),(6514,241,2,6090,'6.99','2005-07-11 05:47:08','2006-02-15 22:14:41'),(6515,241,2,6245,'2.99','2005-07-11 14:56:57','2006-02-15 22:14:41'),(6516,241,1,7320,'0.99','2005-07-27 13:33:35','2006-02-15 22:14:41'),(6517,241,1,7434,'2.99','2005-07-27 17:34:40','2006-02-15 22:14:41'),(6518,241,1,7860,'2.99','2005-07-28 09:58:02','2006-02-15 22:14:41'),(6519,241,1,9500,'6.99','2005-07-30 23:58:36','2006-02-15 22:14:41'),(6520,241,1,9528,'3.99','2005-07-31 01:05:04','2006-02-15 22:14:42'),(6521,241,1,9944,'5.99','2005-07-31 15:44:43','2006-02-15 22:14:42'),(6522,241,2,10447,'3.99','2005-08-01 09:04:58','2006-02-15 22:14:42'),(6523,241,1,10652,'2.99','2005-08-01 16:24:08','2006-02-15 22:14:42'),(6524,241,1,11423,'1.99','2005-08-02 19:57:13','2006-02-15 22:14:42'),(6525,241,2,12418,'4.99','2005-08-18 09:59:36','2006-02-15 22:14:42'),(6526,241,1,12956,'4.99','2005-08-19 06:06:26','2006-02-15 22:14:42'),(6527,241,2,13077,'2.99','2005-08-19 10:15:19','2006-02-15 22:14:42'),(6528,241,2,14269,'7.99','2005-08-21 06:22:07','2006-02-15 22:14:42'),(6529,241,2,14485,'2.99','2005-08-21 13:52:07','2006-02-15 22:14:42'),(6530,241,1,14936,'0.99','2005-08-22 05:51:26','2006-02-15 22:14:42'),(6531,241,2,15137,'2.99','2005-08-22 13:20:28','2006-02-15 22:14:42'),(6532,241,1,15429,'2.99','2005-08-23 00:20:31','2006-02-15 22:14:42'),(6533,241,1,15767,'4.99','2005-08-23 13:14:15','2006-02-15 22:14:42'),(6534,242,1,108,'2.99','2005-05-25 18:30:05','2006-02-15 22:14:42'),(6535,242,2,283,'3.99','2005-05-26 19:05:05','2006-02-15 22:14:42'),(6536,242,2,881,'4.99','2005-05-30 06:15:36','2006-02-15 22:14:42'),(6537,242,2,1304,'4.99','2005-06-15 09:56:02','2006-02-15 22:14:42'),(6538,242,1,1384,'4.99','2005-06-15 15:22:03','2006-02-15 22:14:42'),(6539,242,1,1483,'4.99','2005-06-15 21:21:58','2006-02-15 22:14:42'),(6540,242,2,1702,'4.99','2005-06-16 13:21:05','2006-02-15 22:14:42'),(6541,242,1,2691,'4.99','2005-06-19 13:06:50','2006-02-15 22:14:42'),(6542,242,2,2942,'4.99','2005-06-20 05:27:31','2006-02-15 22:14:42'),(6543,242,1,3471,'4.99','2005-07-05 22:51:44','2006-02-15 22:14:42'),(6544,242,2,3604,'0.99','2005-07-06 05:25:22','2006-02-15 22:14:42'),(6545,242,1,4426,'4.99','2005-07-07 22:28:32','2006-02-15 22:14:42'),(6546,242,2,4895,'1.99','2005-07-08 20:22:05','2006-02-15 22:14:42'),(6547,242,2,5666,'5.99','2005-07-10 08:10:29','2006-02-15 22:14:42'),(6548,242,2,7149,'3.99','2005-07-27 07:10:40','2006-02-15 22:14:42'),(6549,242,1,8491,'4.99','2005-07-29 09:02:13','2006-02-15 22:14:42'),(6550,242,1,9423,'3.99','2005-07-30 21:10:14','2006-02-15 22:14:42'),(6551,242,1,9730,'6.99','2005-07-31 08:50:08','2006-02-15 22:14:43'),(6552,242,2,10367,'0.99','2005-08-01 06:12:19','2006-02-15 22:14:43'),(6553,242,2,10382,'4.99','2005-08-01 06:36:45','2006-02-15 22:14:43'),(6554,242,2,10650,'9.99','2005-08-01 16:18:45','2006-02-15 22:14:43'),(6555,242,2,11020,'0.99','2005-08-02 05:29:48','2006-02-15 22:14:43'),(6556,242,1,11258,'4.99','2005-08-02 13:45:39','2006-02-15 22:14:43'),(6557,242,2,11607,'0.99','2005-08-17 03:36:06','2006-02-15 22:14:43'),(6558,242,1,11931,'4.99','2005-08-17 16:35:14','2006-02-15 22:14:43'),(6559,242,2,12724,'7.99','2005-08-18 21:37:20','2006-02-15 22:14:43'),(6560,242,1,12855,'4.99','2005-08-19 02:18:58','2006-02-15 22:14:43'),(6561,242,1,13271,'9.99','2005-08-19 17:42:06','2006-02-15 22:14:43'),(6562,242,2,13567,'0.99','2005-08-20 04:49:21','2006-02-15 22:14:43'),(6563,242,2,13646,'5.99','2005-08-20 07:47:08','2006-02-15 22:14:43'),(6564,242,1,14515,'0.99','2005-08-21 14:52:14','2006-02-15 22:14:43'),(6565,242,1,15002,'0.99','2005-08-22 08:06:00','2006-02-15 22:14:43'),(6566,243,1,188,'4.99','2005-05-26 05:47:12','2006-02-15 22:14:43'),(6567,243,1,1405,'5.99','2005-06-15 16:41:26','2006-02-15 22:14:43'),(6568,243,1,1452,'0.99','2005-06-15 19:32:52','2006-02-15 22:14:43'),(6569,243,2,2757,'5.99','2005-06-19 17:01:14','2006-02-15 22:14:43'),(6570,243,2,3854,'5.99','2005-07-06 17:02:33','2006-02-15 22:14:43'),(6571,243,1,3965,'4.99','2005-07-06 22:36:20','2006-02-15 22:14:43'),(6572,243,1,4831,'0.99','2005-07-08 18:00:14','2006-02-15 22:14:43'),(6573,243,1,5502,'0.99','2005-07-10 00:34:15','2006-02-15 22:14:43'),(6574,243,2,6038,'3.99','2005-07-11 03:10:37','2006-02-15 22:14:43'),(6575,243,2,6820,'2.99','2005-07-12 18:21:30','2006-02-15 22:14:43'),(6576,243,2,7022,'2.99','2005-07-27 02:31:15','2006-02-15 22:14:43'),(6577,243,2,7165,'0.99','2005-07-27 07:36:46','2006-02-15 22:14:43'),(6578,243,1,8834,'4.99','2005-07-29 22:41:48','2006-02-15 22:14:43'),(6579,243,2,9035,'2.99','2005-07-30 06:16:07','2006-02-15 22:14:43'),(6580,243,2,9514,'4.99','2005-07-31 00:29:44','2006-02-15 22:14:43'),(6581,243,2,9675,'2.99','2005-07-31 06:37:07','2006-02-15 22:14:44'),(6582,243,2,9988,'5.99','2005-07-31 17:22:36','2006-02-15 22:14:44'),(6583,243,1,12209,'2.99','2005-08-18 02:27:20','2006-02-15 22:14:44'),(6584,243,1,13291,'2.99','2005-08-19 18:32:11','2006-02-15 22:14:44'),(6585,243,1,14033,'2.99','2005-08-20 21:30:53','2006-02-15 22:14:44'),(6586,243,1,14108,'0.99','2005-08-21 00:52:45','2006-02-15 22:14:44'),(6587,243,1,14272,'3.99','2005-08-21 06:24:55','2006-02-15 22:14:44'),(6588,243,2,14581,'1.99','2005-08-21 17:07:08','2006-02-15 22:14:44'),(6589,243,2,14705,'2.99','2005-08-21 21:02:55','2006-02-15 22:14:44'),(6590,244,2,592,'4.99','2005-05-28 13:21:08','2006-02-15 22:14:44'),(6591,244,1,797,'1.99','2005-05-29 17:12:17','2006-02-15 22:14:44'),(6592,244,2,1189,'6.99','2005-06-15 01:04:22','2006-02-15 22:14:44'),(6593,244,1,1595,'5.99','2005-06-16 05:23:46','2006-02-15 22:14:44'),(6594,244,2,2955,'3.99','2005-06-20 06:46:35','2006-02-15 22:14:44'),(6595,244,1,4814,'4.99','2005-07-08 17:11:09','2006-02-15 22:14:44'),(6596,244,2,5387,'4.99','2005-07-09 19:25:14','2006-02-15 22:14:44'),(6597,244,2,5461,'0.99','2005-07-09 22:48:04','2006-02-15 22:14:44'),(6598,244,2,5692,'0.99','2005-07-10 09:32:22','2006-02-15 22:14:44'),(6599,244,1,5779,'4.99','2005-07-10 13:45:54','2006-02-15 22:14:44'),(6600,244,1,5803,'3.99','2005-07-10 15:05:42','2006-02-15 22:14:44'),(6601,244,2,6374,'4.99','2005-07-11 21:36:10','2006-02-15 22:14:44'),(6602,244,2,6608,'2.99','2005-07-12 08:16:50','2006-02-15 22:14:44'),(6603,244,2,6683,'2.99','2005-07-12 12:14:05','2006-02-15 22:14:44'),(6604,244,2,8454,'0.99','2005-07-29 07:49:04','2006-02-15 22:14:44'),(6605,244,2,8844,'5.99','2005-07-29 23:05:08','2006-02-15 22:14:44'),(6606,244,1,10001,'4.99','2005-07-31 17:46:18','2006-02-15 22:14:44'),(6607,244,2,10047,'4.99','2005-07-31 19:07:43','2006-02-15 22:14:44'),(6608,244,1,10152,'5.99','2005-07-31 22:28:05','2006-02-15 22:14:44'),(6609,244,2,10684,'6.99','2005-08-01 17:47:00','2006-02-15 22:14:44'),(6610,244,2,10969,'2.99','2005-08-02 04:04:32','2006-02-15 22:14:44'),(6611,244,2,11157,'0.99','2005-08-02 09:58:15','2006-02-15 22:14:45'),(6612,244,1,11267,'9.99','2005-08-02 14:09:08','2006-02-15 22:14:45'),(6613,244,1,11762,'9.99','2005-08-17 09:48:06','2006-02-15 22:14:45'),(6614,244,1,13630,'4.99','2005-08-20 07:05:56','2006-02-15 22:14:45'),(6615,244,2,13774,'0.99','2005-08-20 11:54:01','2006-02-15 22:14:45'),(6616,244,1,13928,'0.99','2005-08-20 17:12:28','2006-02-15 22:14:45'),(6617,244,1,14367,'0.99','2005-08-21 09:31:44','2006-02-15 22:14:45'),(6618,244,2,14657,'0.99','2005-08-21 19:39:43','2006-02-15 22:14:45'),(6619,244,1,14919,'1.99','2005-08-22 05:07:17','2006-02-15 22:14:45'),(6620,244,1,14975,'3.99','2005-08-22 07:07:50','2006-02-15 22:14:45'),(6621,244,2,12736,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:45'),(6622,245,2,79,'4.99','2005-05-25 12:11:07','2006-02-15 22:14:45'),(6623,245,1,241,'0.99','2005-05-26 12:49:01','2006-02-15 22:14:45'),(6624,245,1,519,'7.99','2005-05-28 03:22:33','2006-02-15 22:14:45'),(6625,245,1,719,'2.99','2005-05-29 05:16:05','2006-02-15 22:14:45'),(6626,245,2,725,'2.99','2005-05-29 06:03:41','2006-02-15 22:14:45'),(6627,245,2,948,'8.99','2005-05-30 15:44:27','2006-02-15 22:14:45'),(6628,245,1,1377,'2.99','2005-06-15 15:02:03','2006-02-15 22:14:45'),(6629,245,1,2122,'2.99','2005-06-17 20:48:27','2006-02-15 22:14:45'),(6630,245,1,3157,'2.99','2005-06-20 21:07:54','2006-02-15 22:14:45'),(6631,245,1,3634,'2.99','2005-07-06 06:51:14','2006-02-15 22:14:45'),(6632,245,2,5321,'2.99','2005-07-09 16:26:33','2006-02-15 22:14:45'),(6633,245,1,5764,'4.99','2005-07-10 12:58:16','2006-02-15 22:14:45'),(6634,245,2,6242,'2.99','2005-07-11 14:45:04','2006-02-15 22:14:45'),(6635,245,1,6795,'5.99','2005-07-12 16:41:00','2006-02-15 22:14:45'),(6636,245,2,6962,'0.99','2005-07-27 00:10:58','2006-02-15 22:14:45'),(6637,245,1,7230,'4.99','2005-07-27 10:01:41','2006-02-15 22:14:45'),(6638,245,2,7233,'5.99','2005-07-27 10:08:36','2006-02-15 22:14:45'),(6639,245,1,7358,'0.99','2005-07-27 14:49:44','2006-02-15 22:14:45'),(6640,245,2,7397,'4.99','2005-07-27 16:05:00','2006-02-15 22:14:45'),(6641,245,2,8701,'6.99','2005-07-29 17:02:35','2006-02-15 22:14:46'),(6642,245,1,8811,'10.99','2005-07-29 21:46:21','2006-02-15 22:14:46'),(6643,245,2,9088,'0.99','2005-07-30 08:21:02','2006-02-15 22:14:46'),(6644,245,2,9169,'4.99','2005-07-30 11:35:00','2006-02-15 22:14:46'),(6645,245,1,9813,'6.99','2005-07-31 11:29:23','2006-02-15 22:14:46'),(6646,245,1,10087,'3.99','2005-07-31 20:15:22','2006-02-15 22:14:46'),(6647,245,2,11061,'0.99','2005-08-02 06:50:18','2006-02-15 22:14:46'),(6648,245,1,11105,'0.99','2005-08-02 08:13:31','2006-02-15 22:14:46'),(6649,245,1,11211,'0.99','2005-08-02 12:16:48','2006-02-15 22:14:46'),(6650,245,1,12303,'7.99','2005-08-18 05:43:22','2006-02-15 22:14:46'),(6651,245,1,13286,'0.99','2005-08-19 18:28:07','2006-02-15 22:14:46'),(6652,245,1,15782,'6.99','2005-08-23 13:43:26','2006-02-15 22:14:46'),(6653,245,2,12682,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:46'),(6654,246,1,124,'6.99','2005-05-25 20:46:11','2006-02-15 22:14:46'),(6655,246,2,421,'8.99','2005-05-27 15:30:13','2006-02-15 22:14:46'),(6656,246,2,434,'5.99','2005-05-27 16:54:27','2006-02-15 22:14:46'),(6657,246,1,699,'3.99','2005-05-29 02:11:44','2006-02-15 22:14:46'),(6658,246,1,1051,'4.99','2005-05-31 07:02:09','2006-02-15 22:14:46'),(6659,246,2,1448,'1.99','2005-06-15 19:17:16','2006-02-15 22:14:46'),(6660,246,1,1968,'2.99','2005-06-17 09:20:36','2006-02-15 22:14:46'),(6661,246,2,2704,'1.99','2005-06-19 13:50:10','2006-02-15 22:14:46'),(6662,246,1,2725,'0.99','2005-06-19 15:01:23','2006-02-15 22:14:46'),(6663,246,1,3152,'4.99','2005-06-20 20:42:41','2006-02-15 22:14:46'),(6664,246,1,4092,'7.99','2005-07-07 05:54:18','2006-02-15 22:14:46'),(6665,246,2,4905,'4.99','2005-07-08 20:56:00','2006-02-15 22:14:46'),(6666,246,2,4994,'2.99','2005-07-09 00:54:13','2006-02-15 22:14:46'),(6667,246,2,5347,'0.99','2005-07-09 17:31:32','2006-02-15 22:14:46'),(6668,246,1,6688,'4.99','2005-07-12 12:22:12','2006-02-15 22:14:46'),(6669,246,2,9525,'5.99','2005-07-31 01:02:18','2006-02-15 22:14:46'),(6670,246,2,10208,'4.99','2005-08-01 00:54:51','2006-02-15 22:14:46'),(6671,246,2,10683,'2.99','2005-08-01 17:33:03','2006-02-15 22:14:47'),(6672,246,2,13418,'5.99','2005-08-19 22:53:56','2006-02-15 22:14:47'),(6673,246,1,13750,'6.99','2005-08-20 11:11:42','2006-02-15 22:14:47'),(6674,246,1,13987,'4.99','2005-08-20 19:19:30','2006-02-15 22:14:47'),(6675,246,1,14360,'6.99','2005-08-21 09:16:40','2006-02-15 22:14:47'),(6676,246,1,15746,'2.99','2005-08-23 12:26:19','2006-02-15 22:14:47'),(6677,247,1,189,'4.99','2005-05-26 06:01:41','2006-02-15 22:14:47'),(6678,247,2,448,'3.99','2005-05-27 19:03:08','2006-02-15 22:14:47'),(6679,247,1,450,'6.99','2005-05-27 19:18:54','2006-02-15 22:14:47'),(6680,247,1,2288,'5.99','2005-06-18 07:23:17','2006-02-15 22:14:47'),(6681,247,2,3955,'2.99','2005-07-06 21:58:08','2006-02-15 22:14:47'),(6682,247,2,4198,'6.99','2005-07-07 11:08:11','2006-02-15 22:14:47'),(6683,247,1,4492,'2.99','2005-07-08 01:32:04','2006-02-15 22:14:47'),(6684,247,2,4995,'2.99','2005-07-09 00:57:46','2006-02-15 22:14:47'),(6685,247,1,5328,'6.99','2005-07-09 16:48:29','2006-02-15 22:14:47'),(6686,247,1,5842,'4.99','2005-07-10 17:11:37','2006-02-15 22:14:47'),(6687,247,1,7963,'5.99','2005-07-28 13:48:38','2006-02-15 22:14:47'),(6688,247,1,10279,'1.99','2005-08-01 03:26:44','2006-02-15 22:14:47'),(6689,247,1,10410,'6.99','2005-08-01 07:53:29','2006-02-15 22:14:47'),(6690,247,2,11204,'2.99','2005-08-02 11:56:31','2006-02-15 22:14:47'),(6691,247,2,11306,'2.99','2005-08-02 15:45:10','2006-02-15 22:14:47'),(6692,247,1,11495,'0.99','2005-08-16 22:51:20','2006-02-15 22:14:47'),(6693,247,2,12265,'4.99','2005-08-18 04:22:01','2006-02-15 22:14:47'),(6694,247,1,12482,'7.99','2005-08-18 12:37:36','2006-02-15 22:14:47'),(6695,247,1,12491,'4.99','2005-08-18 12:48:45','2006-02-15 22:14:47'),(6696,247,1,12824,'4.99','2005-08-19 01:18:00','2006-02-15 22:14:47'),(6697,247,1,14041,'4.99','2005-08-20 21:45:23','2006-02-15 22:14:47'),(6698,247,1,15783,'4.99','2005-08-23 13:45:44','2006-02-15 22:14:47'),(6699,248,2,330,'7.99','2005-05-27 02:15:30','2006-02-15 22:14:47'),(6700,248,1,618,'4.99','2005-05-28 15:50:07','2006-02-15 22:14:47'),(6701,248,1,2066,'3.99','2005-06-17 16:07:08','2006-02-15 22:14:48'),(6702,248,2,2371,'0.99','2005-06-18 14:35:29','2006-02-15 22:14:48'),(6703,248,1,3910,'0.99','2005-07-06 20:05:18','2006-02-15 22:14:48'),(6704,248,2,4541,'4.99','2005-07-08 04:04:19','2006-02-15 22:14:48'),(6705,248,1,4841,'0.99','2005-07-08 18:18:23','2006-02-15 22:14:48'),(6706,248,1,5370,'2.99','2005-07-09 18:43:19','2006-02-15 22:14:48'),(6707,248,2,6617,'2.99','2005-07-12 08:39:56','2006-02-15 22:14:48'),(6708,248,2,7778,'5.99','2005-07-28 07:10:11','2006-02-15 22:14:48'),(6709,248,2,10418,'4.99','2005-08-01 08:11:07','2006-02-15 22:14:48'),(6710,248,1,12241,'0.99','2005-08-18 03:33:17','2006-02-15 22:14:48'),(6711,248,1,13918,'0.99','2005-08-20 16:47:32','2006-02-15 22:14:48'),(6712,248,2,14704,'0.99','2005-08-21 21:02:22','2006-02-15 22:14:48'),(6713,248,2,14885,'5.99','2005-08-22 03:58:29','2006-02-15 22:14:48'),(6714,249,2,316,'4.99','2005-05-26 23:22:55','2006-02-15 22:14:48'),(6715,249,2,400,'2.99','2005-05-27 12:51:44','2006-02-15 22:14:48'),(6716,249,1,438,'6.99','2005-05-27 17:52:34','2006-02-15 22:14:48'),(6717,249,1,597,'3.99','2005-05-28 14:01:02','2006-02-15 22:14:48'),(6718,249,1,1204,'0.99','2005-06-15 02:21:46','2006-02-15 22:14:48'),(6719,249,1,1473,'5.99','2005-06-15 20:55:20','2006-02-15 22:14:48'),(6720,249,2,1753,'2.99','2005-06-16 17:08:17','2006-02-15 22:14:48'),(6721,249,2,2129,'1.99','2005-06-17 20:58:32','2006-02-15 22:14:48'),(6722,249,2,3175,'7.99','2005-06-20 22:30:23','2006-02-15 22:14:48'),(6723,249,1,4352,'9.99','2005-07-07 19:15:58','2006-02-15 22:14:48'),(6724,249,1,5011,'4.99','2005-07-09 01:44:40','2006-02-15 22:14:48'),(6725,249,1,5275,'4.99','2005-07-09 14:34:18','2006-02-15 22:14:48'),(6726,249,2,5639,'3.99','2005-07-10 06:33:39','2006-02-15 22:14:48'),(6727,249,2,6670,'7.99','2005-07-12 11:44:33','2006-02-15 22:14:48'),(6728,249,1,7544,'7.99','2005-07-27 21:47:37','2006-02-15 22:14:48'),(6729,249,1,7804,'2.99','2005-07-28 07:56:00','2006-02-15 22:14:48'),(6730,249,2,7881,'4.99','2005-07-28 10:33:22','2006-02-15 22:14:48'),(6731,249,1,11124,'1.99','2005-08-02 08:55:25','2006-02-15 22:14:49'),(6732,249,1,11159,'4.99','2005-08-02 10:00:55','2006-02-15 22:14:49'),(6733,249,2,11668,'0.99','2005-08-17 05:47:32','2006-02-15 22:14:49'),(6734,249,2,13981,'4.99','2005-08-20 19:07:20','2006-02-15 22:14:49'),(6735,249,2,14285,'0.99','2005-08-21 06:50:48','2006-02-15 22:14:49'),(6736,249,1,15160,'6.99','2005-08-22 14:33:50','2006-02-15 22:14:49'),(6737,250,1,61,'5.99','2005-05-25 09:01:57','2006-02-15 22:14:49'),(6738,250,1,176,'3.99','2005-05-26 03:47:39','2006-02-15 22:14:49'),(6739,250,1,637,'4.99','2005-05-28 18:14:29','2006-02-15 22:14:49'),(6740,250,2,687,'0.99','2005-05-29 00:32:09','2006-02-15 22:14:49'),(6741,250,1,1146,'2.99','2005-05-31 20:34:45','2006-02-15 22:14:49'),(6742,250,1,2432,'4.99','2005-06-18 17:59:18','2006-02-15 22:14:49'),(6743,250,1,3635,'4.99','2005-07-06 06:55:36','2006-02-15 22:14:49'),(6744,250,1,3951,'3.99','2005-07-06 21:50:41','2006-02-15 22:14:49'),(6745,250,1,5479,'2.99','2005-07-09 23:47:33','2006-02-15 22:14:49'),(6746,250,1,5540,'0.99','2005-07-10 02:44:21','2006-02-15 22:14:49'),(6747,250,1,5998,'2.99','2005-07-11 01:20:46','2006-02-15 22:14:49'),(6748,250,1,8579,'2.99','2005-07-29 11:59:22','2006-02-15 22:14:49'),(6749,250,2,9099,'0.99','2005-07-30 08:45:48','2006-02-15 22:14:49'),(6750,250,2,10604,'4.99','2005-08-01 14:35:08','2006-02-15 22:14:49'),(6751,250,1,12361,'0.99','2005-08-18 07:47:31','2006-02-15 22:14:49'),(6752,250,1,12810,'0.99','2005-08-19 00:44:10','2006-02-15 22:14:49'),(6753,250,2,14565,'4.99','2005-08-21 16:24:45','2006-02-15 22:14:49'),(6754,250,1,14587,'5.99','2005-08-21 17:20:55','2006-02-15 22:14:49'),(6755,250,2,14814,'4.99','2005-08-22 01:12:14','2006-02-15 22:14:49'),(6756,250,2,15247,'6.99','2005-08-22 17:52:05','2006-02-15 22:14:49'),(6757,251,1,264,'2.99','2005-05-26 16:00:49','2006-02-15 22:14:49'),(6758,251,1,309,'1.99','2005-05-26 22:38:10','2006-02-15 22:14:49'),(6759,251,2,393,'2.99','2005-05-27 11:18:25','2006-02-15 22:14:49'),(6760,251,2,1069,'3.99','2005-05-31 09:32:31','2006-02-15 22:14:49'),(6761,251,1,1091,'4.99','2005-05-31 12:11:04','2006-02-15 22:14:50'),(6762,251,2,1155,'2.99','2005-05-31 22:17:11','2006-02-15 22:14:50'),(6763,251,1,2238,'6.99','2005-06-18 04:22:06','2006-02-15 22:14:50'),(6764,251,2,3422,'7.99','2005-06-21 17:24:40','2006-02-15 22:14:50'),(6765,251,1,3464,'2.99','2005-06-21 22:08:58','2006-02-15 22:14:50'),(6766,251,1,3799,'4.99','2005-07-06 15:00:14','2006-02-15 22:14:50'),(6767,251,2,4026,'3.99','2005-07-07 02:15:48','2006-02-15 22:14:50'),(6768,251,2,4848,'2.99','2005-07-08 18:30:16','2006-02-15 22:14:50'),(6769,251,2,5012,'2.99','2005-07-09 01:45:04','2006-02-15 22:14:50'),(6770,251,2,5979,'2.99','2005-07-11 00:17:09','2006-02-15 22:14:50'),(6771,251,2,6413,'6.99','2005-07-11 23:26:11','2006-02-15 22:14:50'),(6772,251,2,7338,'8.99','2005-07-27 14:13:34','2006-02-15 22:14:50'),(6773,251,2,8443,'2.99','2005-07-29 07:33:12','2006-02-15 22:14:50'),(6774,251,2,8982,'0.99','2005-07-30 04:31:02','2006-02-15 22:14:50'),(6775,251,1,9196,'2.99','2005-07-30 12:30:19','2006-02-15 22:14:50'),(6776,251,1,9892,'0.99','2005-07-31 14:06:25','2006-02-15 22:14:50'),(6777,251,1,10575,'7.99','2005-08-01 13:41:41','2006-02-15 22:14:50'),(6778,251,1,11733,'0.99','2005-08-17 08:31:03','2006-02-15 22:14:50'),(6779,251,2,12047,'3.99','2005-08-17 20:48:32','2006-02-15 22:14:50'),(6780,251,2,12666,'4.99','2005-08-18 19:11:41','2006-02-15 22:14:50'),(6781,251,2,13121,'2.99','2005-08-19 11:51:39','2006-02-15 22:14:50'),(6782,251,1,13243,'2.99','2005-08-19 16:33:16','2006-02-15 22:14:50'),(6783,251,2,13260,'6.99','2005-08-19 17:09:22','2006-02-15 22:14:50'),(6784,251,1,14292,'0.99','2005-08-21 07:06:20','2006-02-15 22:14:50'),(6785,251,2,15647,'2.99','2005-08-23 08:23:56','2006-02-15 22:14:50'),(6786,251,2,15870,'4.99','2005-08-23 16:23:08','2006-02-15 22:14:50'),(6787,251,1,14107,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:50'),(6788,252,1,707,'4.99','2005-05-29 03:18:19','2006-02-15 22:14:50'),(6789,252,1,1095,'0.99','2005-05-31 13:15:41','2006-02-15 22:14:50'),(6790,252,1,1395,'5.99','2005-06-15 16:21:04','2006-02-15 22:14:51'),(6791,252,2,2716,'4.99','2005-06-19 14:40:17','2006-02-15 22:14:51'),(6792,252,1,2968,'0.99','2005-06-20 07:41:47','2006-02-15 22:14:51'),(6793,252,2,4372,'0.99','2005-07-07 20:09:01','2006-02-15 22:14:51'),(6794,252,2,5554,'2.99','2005-07-10 03:03:38','2006-02-15 22:14:51'),(6795,252,1,6357,'0.99','2005-07-11 20:58:51','2006-02-15 22:14:51'),(6796,252,2,6369,'0.99','2005-07-11 21:23:36','2006-02-15 22:14:51'),(6797,252,1,7024,'4.99','2005-07-27 02:36:40','2006-02-15 22:14:51'),(6798,252,2,7121,'0.99','2005-07-27 05:58:32','2006-02-15 22:14:51'),(6799,252,2,7168,'0.99','2005-07-27 07:51:11','2006-02-15 22:14:51'),(6800,252,1,7670,'0.99','2005-07-28 02:44:25','2006-02-15 22:14:51'),(6801,252,1,8636,'5.99','2005-07-29 14:24:13','2006-02-15 22:14:51'),(6802,252,1,8899,'0.99','2005-07-30 01:05:30','2006-02-15 22:14:51'),(6803,252,2,10314,'0.99','2005-08-01 04:31:18','2006-02-15 22:14:51'),(6804,252,2,10834,'2.99','2005-08-01 23:28:00','2006-02-15 22:14:51'),(6805,252,2,11764,'0.99','2005-08-17 09:51:54','2006-02-15 22:14:51'),(6806,252,1,13385,'4.99','2005-08-19 21:39:35','2006-02-15 22:14:51'),(6807,252,2,13989,'5.99','2005-08-20 19:27:50','2006-02-15 22:14:51'),(6808,252,1,14774,'4.99','2005-08-21 23:52:32','2006-02-15 22:14:51'),(6809,252,2,13756,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:51'),(6810,253,1,566,'6.99','2005-05-28 09:51:39','2006-02-15 22:14:51'),(6811,253,1,648,'0.99','2005-05-28 19:25:54','2006-02-15 22:14:51'),(6812,253,1,986,'2.99','2005-05-30 22:22:52','2006-02-15 22:14:51'),(6813,253,2,1378,'1.99','2005-06-15 15:03:15','2006-02-15 22:14:51'),(6814,253,2,1606,'6.99','2005-06-16 06:18:31','2006-02-15 22:14:51'),(6815,253,2,2081,'5.99','2005-06-17 17:05:02','2006-02-15 22:14:51'),(6816,253,1,2142,'4.99','2005-06-17 21:55:43','2006-02-15 22:14:51'),(6817,253,1,2454,'4.99','2005-06-18 19:32:51','2006-02-15 22:14:51'),(6818,253,2,2636,'4.99','2005-06-19 09:13:06','2006-02-15 22:14:51'),(6819,253,1,3658,'7.99','2005-07-06 08:01:08','2006-02-15 22:14:52'),(6820,253,1,5505,'2.99','2005-07-10 00:38:48','2006-02-15 22:14:52'),(6821,253,1,5602,'4.99','2005-07-10 05:02:22','2006-02-15 22:14:52'),(6822,253,2,7689,'2.99','2005-07-28 03:21:24','2006-02-15 22:14:52'),(6823,253,2,7851,'0.99','2005-07-28 09:31:58','2006-02-15 22:14:52'),(6824,253,2,7887,'2.99','2005-07-28 10:40:12','2006-02-15 22:14:52'),(6825,253,2,8752,'2.99','2005-07-29 19:15:07','2006-02-15 22:14:52'),(6826,253,2,9606,'0.99','2005-07-31 03:50:46','2006-02-15 22:14:52'),(6827,253,2,9618,'6.99','2005-07-31 04:16:14','2006-02-15 22:14:52'),(6828,253,2,10404,'4.99','2005-08-01 07:31:25','2006-02-15 22:14:52'),(6829,253,1,10660,'2.99','2005-08-01 16:48:01','2006-02-15 22:14:52'),(6830,253,2,10881,'6.99','2005-08-02 00:38:14','2006-02-15 22:14:52'),(6831,253,1,12572,'0.99','2005-08-18 15:32:54','2006-02-15 22:14:52'),(6832,253,2,12827,'5.99','2005-08-19 01:27:23','2006-02-15 22:14:52'),(6833,253,1,13126,'5.99','2005-08-19 12:00:28','2006-02-15 22:14:52'),(6834,253,2,14086,'3.99','2005-08-20 23:47:54','2006-02-15 22:14:52'),(6835,253,2,14283,'4.99','2005-08-21 06:44:14','2006-02-15 22:14:52'),(6836,253,1,14640,'7.99','2005-08-21 19:03:19','2006-02-15 22:14:52'),(6837,253,2,14655,'4.99','2005-08-21 19:37:10','2006-02-15 22:14:52'),(6838,253,2,15221,'2.99','2005-08-22 17:12:29','2006-02-15 22:14:52'),(6839,254,1,183,'2.99','2005-05-26 05:01:18','2006-02-15 22:14:52'),(6840,254,1,1108,'5.99','2005-05-31 15:05:12','2006-02-15 22:14:52'),(6841,254,1,1285,'2.99','2005-06-15 08:33:06','2006-02-15 22:14:52'),(6842,254,2,1390,'0.99','2005-06-15 16:06:29','2006-02-15 22:14:52'),(6843,254,1,2082,'2.99','2005-06-17 17:13:32','2006-02-15 22:14:52'),(6844,254,1,2138,'2.99','2005-06-17 21:28:14','2006-02-15 22:14:52'),(6845,254,2,2687,'3.99','2005-06-19 12:46:52','2006-02-15 22:14:52'),(6846,254,1,3882,'4.99','2005-07-06 18:38:21','2006-02-15 22:14:52'),(6847,254,2,5042,'2.99','2005-07-09 03:20:30','2006-02-15 22:14:52'),(6848,254,1,5072,'3.99','2005-07-09 05:01:58','2006-02-15 22:14:52'),(6849,254,2,5080,'2.99','2005-07-09 05:23:55','2006-02-15 22:14:53'),(6850,254,1,5537,'0.99','2005-07-10 02:35:41','2006-02-15 22:14:53'),(6851,254,1,5550,'5.99','2005-07-10 02:58:35','2006-02-15 22:14:53'),(6852,254,1,5826,'7.99','2005-07-10 16:21:02','2006-02-15 22:14:53'),(6853,254,2,5930,'4.99','2005-07-10 21:59:32','2006-02-15 22:14:53'),(6854,254,2,7011,'0.99','2005-07-27 01:58:34','2006-02-15 22:14:53'),(6855,254,1,7413,'4.99','2005-07-27 16:45:40','2006-02-15 22:14:53'),(6856,254,2,8216,'7.99','2005-07-28 23:43:59','2006-02-15 22:14:53'),(6857,254,2,8581,'4.99','2005-07-29 12:02:06','2006-02-15 22:14:53'),(6858,254,2,9494,'1.99','2005-07-30 23:52:46','2006-02-15 22:14:53'),(6859,254,1,10522,'4.99','2005-08-01 11:48:51','2006-02-15 22:14:53'),(6860,254,1,11190,'0.99','2005-08-02 11:21:34','2006-02-15 22:14:53'),(6861,254,1,11665,'6.99','2005-08-17 05:36:57','2006-02-15 22:14:53'),(6862,254,2,12148,'0.99','2005-08-18 00:13:15','2006-02-15 22:14:53'),(6863,254,1,12206,'0.99','2005-08-18 02:22:20','2006-02-15 22:14:53'),(6864,254,1,12247,'2.99','2005-08-18 03:51:51','2006-02-15 22:14:53'),(6865,254,1,12874,'0.99','2005-08-19 03:07:57','2006-02-15 22:14:53'),(6866,254,2,13001,'4.99','2005-08-19 07:36:44','2006-02-15 22:14:53'),(6867,254,1,13045,'4.99','2005-08-19 09:17:35','2006-02-15 22:14:53'),(6868,254,2,13130,'2.99','2005-08-19 12:06:42','2006-02-15 22:14:53'),(6869,254,2,14497,'4.99','2005-08-21 14:09:47','2006-02-15 22:14:53'),(6870,254,1,15774,'0.99','2005-08-23 13:25:08','2006-02-15 22:14:53'),(6871,255,1,1235,'2.99','2005-06-15 04:31:28','2006-02-15 22:14:53'),(6872,255,1,1420,'6.99','2005-06-15 17:56:14','2006-02-15 22:14:53'),(6873,255,2,1681,'2.99','2005-06-16 11:38:17','2006-02-15 22:14:53'),(6874,255,2,3442,'2.99','2005-06-21 20:06:51','2006-02-15 22:14:53'),(6875,255,1,4547,'0.99','2005-07-08 04:20:19','2006-02-15 22:14:53'),(6876,255,1,5706,'1.99','2005-07-10 10:21:46','2006-02-15 22:14:53'),(6877,255,1,5943,'0.99','2005-07-10 22:48:13','2006-02-15 22:14:53'),(6878,255,2,7475,'8.99','2005-07-27 19:07:43','2006-02-15 22:14:54'),(6879,255,1,7646,'2.99','2005-07-28 01:31:45','2006-02-15 22:14:54'),(6880,255,1,8562,'0.99','2005-07-29 11:32:13','2006-02-15 22:14:54'),(6881,255,1,9061,'6.99','2005-07-30 07:21:52','2006-02-15 22:14:54'),(6882,255,2,11979,'4.99','2005-08-17 18:07:13','2006-02-15 22:14:54'),(6883,255,2,12176,'7.99','2005-08-18 01:10:33','2006-02-15 22:14:54'),(6884,255,2,13154,'2.99','2005-08-19 13:09:54','2006-02-15 22:14:54'),(6885,255,1,13268,'0.99','2005-08-19 17:33:50','2006-02-15 22:14:54'),(6886,255,2,13683,'0.99','2005-08-20 08:54:55','2006-02-15 22:14:54'),(6887,255,1,13758,'8.99','2005-08-20 11:21:26','2006-02-15 22:14:54'),(6888,255,2,14600,'3.99','2005-08-21 17:45:21','2006-02-15 22:14:54'),(6889,256,1,51,'4.99','2005-05-25 06:49:10','2006-02-15 22:14:54'),(6890,256,1,232,'0.99','2005-05-26 11:38:05','2006-02-15 22:14:54'),(6891,256,2,738,'4.99','2005-05-29 08:20:08','2006-02-15 22:14:54'),(6892,256,1,935,'2.99','2005-05-30 13:29:36','2006-02-15 22:14:54'),(6893,256,1,1116,'0.99','2005-05-31 16:10:46','2006-02-15 22:14:54'),(6894,256,1,1555,'2.99','2005-06-16 02:17:07','2006-02-15 22:14:54'),(6895,256,2,1965,'0.99','2005-06-17 09:17:39','2006-02-15 22:14:54'),(6896,256,2,1973,'4.99','2005-06-17 09:26:15','2006-02-15 22:14:54'),(6897,256,2,2230,'4.99','2005-06-18 03:50:49','2006-02-15 22:14:54'),(6898,256,1,2380,'6.99','2005-06-18 15:00:04','2006-02-15 22:14:54'),(6899,256,2,2561,'4.99','2005-06-19 03:14:52','2006-02-15 22:14:54'),(6900,256,1,2839,'4.99','2005-06-19 22:07:24','2006-02-15 22:14:54'),(6901,256,1,4130,'0.99','2005-07-07 07:51:53','2006-02-15 22:14:54'),(6902,256,2,4182,'0.99','2005-07-07 10:28:00','2006-02-15 22:14:54'),(6903,256,1,5179,'2.99','2005-07-09 10:00:44','2006-02-15 22:14:54'),(6904,256,1,6298,'0.99','2005-07-11 17:42:33','2006-02-15 22:14:54'),(6905,256,1,7661,'3.99','2005-07-28 02:10:27','2006-02-15 22:14:54'),(6906,256,2,9424,'2.99','2005-07-30 21:10:56','2006-02-15 22:14:54'),(6907,256,2,10759,'4.99','2005-08-01 20:22:51','2006-02-15 22:14:55'),(6908,256,2,11011,'2.99','2005-08-02 05:07:07','2006-02-15 22:14:55'),(6909,256,2,11628,'8.99','2005-08-17 04:27:18','2006-02-15 22:14:55'),(6910,256,2,13457,'0.99','2005-08-20 00:33:22','2006-02-15 22:14:55'),(6911,256,1,13651,'0.99','2005-08-20 07:50:08','2006-02-15 22:14:55'),(6912,256,1,14003,'6.99','2005-08-20 20:16:06','2006-02-15 22:14:55'),(6913,256,2,14036,'4.99','2005-08-20 21:35:27','2006-02-15 22:14:55'),(6914,256,2,14445,'2.99','2005-08-21 12:07:42','2006-02-15 22:14:55'),(6915,256,2,14458,'3.99','2005-08-21 12:47:53','2006-02-15 22:14:55'),(6916,256,2,15609,'2.99','2005-08-23 06:56:04','2006-02-15 22:14:55'),(6917,256,2,15861,'4.99','2005-08-23 16:15:45','2006-02-15 22:14:55'),(6918,256,1,15864,'7.99','2005-08-23 16:18:12','2006-02-15 22:14:55'),(6919,257,2,139,'2.99','2005-05-25 23:00:21','2006-02-15 22:14:55'),(6920,257,2,244,'2.99','2005-05-26 13:40:40','2006-02-15 22:14:55'),(6921,257,2,705,'2.99','2005-05-29 02:48:52','2006-02-15 22:14:55'),(6922,257,1,2557,'0.99','2005-06-19 03:08:51','2006-02-15 22:14:55'),(6923,257,2,3083,'4.99','2005-06-20 15:33:47','2006-02-15 22:14:55'),(6924,257,2,4462,'6.99','2005-07-08 00:02:49','2006-02-15 22:14:55'),(6925,257,2,4574,'4.99','2005-07-08 05:39:42','2006-02-15 22:14:55'),(6926,257,1,5495,'6.99','2005-07-10 00:16:54','2006-02-15 22:14:55'),(6927,257,1,5858,'4.99','2005-07-10 18:00:07','2006-02-15 22:14:55'),(6928,257,1,6422,'5.99','2005-07-11 23:46:19','2006-02-15 22:14:55'),(6929,257,2,6711,'5.99','2005-07-12 13:23:40','2006-02-15 22:14:55'),(6930,257,2,7007,'4.99','2005-07-27 01:43:39','2006-02-15 22:14:55'),(6931,257,1,7176,'2.99','2005-07-27 08:04:28','2006-02-15 22:14:55'),(6932,257,1,7496,'1.99','2005-07-27 20:04:05','2006-02-15 22:14:55'),(6933,257,2,7510,'2.99','2005-07-27 20:37:57','2006-02-15 22:14:55'),(6934,257,2,7518,'5.99','2005-07-27 21:01:16','2006-02-15 22:14:55'),(6935,257,2,8156,'3.99','2005-07-28 20:59:04','2006-02-15 22:14:56'),(6936,257,2,8252,'2.99','2005-07-29 00:54:17','2006-02-15 22:14:56'),(6937,257,1,8344,'4.99','2005-07-29 04:45:25','2006-02-15 22:14:56'),(6938,257,1,8640,'4.99','2005-07-29 14:34:17','2006-02-15 22:14:56'),(6939,257,2,8946,'6.99','2005-07-30 03:14:53','2006-02-15 22:14:56'),(6940,257,1,9800,'4.99','2005-07-31 11:00:58','2006-02-15 22:14:56'),(6941,257,2,10142,'4.99','2005-07-31 22:10:54','2006-02-15 22:14:56'),(6942,257,1,11230,'4.99','2005-08-02 12:59:08','2006-02-15 22:14:56'),(6943,257,1,11394,'0.99','2005-08-02 18:44:45','2006-02-15 22:14:56'),(6944,257,2,11545,'6.99','2005-08-17 00:56:06','2006-02-15 22:14:56'),(6945,257,2,11860,'1.99','2005-08-17 13:52:26','2006-02-15 22:14:56'),(6946,257,2,12841,'2.99','2005-08-19 01:55:55','2006-02-15 22:14:56'),(6947,257,1,12904,'5.99','2005-08-19 04:10:50','2006-02-15 22:14:56'),(6948,257,2,13203,'7.99','2005-08-19 15:00:58','2006-02-15 22:14:56'),(6949,257,2,13218,'0.99','2005-08-19 15:39:39','2006-02-15 22:14:56'),(6950,257,1,13389,'2.99','2005-08-19 21:52:51','2006-02-15 22:14:56'),(6951,257,2,13846,'5.99','2005-08-20 14:32:31','2006-02-15 22:14:56'),(6952,257,2,14115,'0.99','2005-08-21 01:10:29','2006-02-15 22:14:56'),(6953,257,1,15025,'0.99','2005-08-22 08:57:24','2006-02-15 22:14:56'),(6954,257,1,15967,'2.99','2005-08-23 19:50:06','2006-02-15 22:14:56'),(6955,257,2,15968,'0.99','2005-08-23 19:51:29','2006-02-15 22:14:56'),(6956,258,1,1743,'2.99','2005-06-16 16:38:10','2006-02-15 22:14:56'),(6957,258,2,2678,'0.99','2005-06-19 12:12:23','2006-02-15 22:14:56'),(6958,258,2,2931,'8.99','2005-06-20 04:50:45','2006-02-15 22:14:56'),(6959,258,2,4408,'2.99','2005-07-07 21:41:06','2006-02-15 22:14:56'),(6960,258,1,4677,'5.99','2005-07-08 10:30:36','2006-02-15 22:14:56'),(6961,258,2,4897,'0.99','2005-07-08 20:25:11','2006-02-15 22:14:56'),(6962,258,2,5312,'5.99','2005-07-09 16:03:09','2006-02-15 22:14:56'),(6963,258,1,5674,'0.99','2005-07-10 08:26:26','2006-02-15 22:14:57'),(6964,258,1,5935,'9.99','2005-07-10 22:11:04','2006-02-15 22:14:57'),(6965,258,2,6012,'4.99','2005-07-11 02:00:12','2006-02-15 22:14:57'),(6966,258,1,7814,'2.99','2005-07-28 08:09:48','2006-02-15 22:14:57'),(6967,258,1,8675,'4.99','2005-07-29 15:56:18','2006-02-15 22:14:57'),(6968,258,2,9069,'4.99','2005-07-30 07:39:59','2006-02-15 22:14:57'),(6969,258,2,10293,'1.99','2005-08-01 03:44:26','2006-02-15 22:14:57'),(6970,258,2,10315,'4.99','2005-08-01 04:34:45','2006-02-15 22:14:57'),(6971,258,1,10325,'5.99','2005-08-01 04:52:12','2006-02-15 22:14:57'),(6972,258,2,10332,'6.99','2005-08-01 04:57:32','2006-02-15 22:14:57'),(6973,258,1,10393,'0.99','2005-08-01 06:52:50','2006-02-15 22:14:57'),(6974,258,1,12246,'5.99','2005-08-18 03:48:41','2006-02-15 22:14:57'),(6975,258,2,12296,'3.99','2005-08-18 05:16:28','2006-02-15 22:14:57'),(6976,258,1,13491,'4.99','2005-08-20 01:30:56','2006-02-15 22:14:57'),(6977,258,1,13695,'6.99','2005-08-20 09:13:25','2006-02-15 22:14:57'),(6978,258,2,13897,'2.99','2005-08-20 16:02:28','2006-02-15 22:14:57'),(6979,258,2,14901,'6.99','2005-08-22 04:31:37','2006-02-15 22:14:57'),(6980,259,2,722,'6.99','2005-05-29 05:30:31','2006-02-15 22:14:57'),(6981,259,2,901,'2.99','2005-05-30 09:40:40','2006-02-15 22:14:57'),(6982,259,1,1147,'5.99','2005-05-31 20:37:52','2006-02-15 22:14:57'),(6983,259,1,1641,'7.99','2005-06-16 08:46:26','2006-02-15 22:14:57'),(6984,259,2,1723,'7.99','2005-06-16 15:14:18','2006-02-15 22:14:57'),(6985,259,2,1813,'2.99','2005-06-16 21:11:00','2006-02-15 22:14:57'),(6986,259,2,2375,'5.99','2005-06-18 14:47:29','2006-02-15 22:14:57'),(6987,259,2,4199,'5.99','2005-07-07 11:13:07','2006-02-15 22:14:57'),(6988,259,2,4489,'4.99','2005-07-08 01:23:58','2006-02-15 22:14:57'),(6989,259,1,6074,'0.99','2005-07-11 04:59:56','2006-02-15 22:14:57'),(6990,259,2,6539,'3.99','2005-07-12 04:50:49','2006-02-15 22:14:57'),(6991,259,2,7188,'2.99','2005-07-27 08:32:08','2006-02-15 22:14:57'),(6992,259,2,7774,'7.99','2005-07-28 07:03:25','2006-02-15 22:14:58'),(6993,259,1,7817,'4.99','2005-07-28 08:20:55','2006-02-15 22:14:58'),(6994,259,2,9205,'6.99','2005-07-30 12:46:40','2006-02-15 22:14:58'),(6995,259,1,9282,'6.99','2005-07-30 15:17:31','2006-02-15 22:14:58'),(6996,259,1,9444,'7.99','2005-07-30 21:48:44','2006-02-15 22:14:58'),(6997,259,1,10510,'3.99','2005-08-01 11:28:30','2006-02-15 22:14:58'),(6998,259,1,10781,'2.99','2005-08-01 21:22:41','2006-02-15 22:14:58'),(6999,259,1,11184,'3.99','2005-08-02 11:01:26','2006-02-15 22:14:58'),(7000,259,2,12680,'6.99','2005-08-18 19:43:46','2006-02-15 22:14:58'),(7001,259,1,13109,'4.99','2005-08-19 11:23:20','2006-02-15 22:14:58'),(7002,259,2,13112,'2.99','2005-08-19 11:27:10','2006-02-15 22:14:58'),(7003,259,2,13366,'4.99','2005-08-19 21:14:45','2006-02-15 22:14:58'),(7004,259,1,13598,'5.99','2005-08-20 05:59:17','2006-02-15 22:14:58'),(7005,259,2,13649,'4.99','2005-08-20 07:48:38','2006-02-15 22:14:58'),(7006,259,2,14067,'6.99','2005-08-20 22:49:23','2006-02-15 22:14:58'),(7007,259,2,14170,'4.99','2005-08-21 03:00:39','2006-02-15 22:14:58'),(7008,259,2,14966,'2.99','2005-08-22 06:45:57','2006-02-15 22:14:58'),(7009,259,1,15425,'10.99','2005-08-23 00:05:57','2006-02-15 22:14:58'),(7010,259,1,15473,'2.99','2005-08-23 01:39:10','2006-02-15 22:14:58'),(7011,259,2,NULL,'1.99','2005-08-23 06:13:16','2006-02-15 22:14:58'),(7012,259,1,15689,'2.99','2005-08-23 09:52:55','2006-02-15 22:14:58'),(7013,260,1,1101,'8.99','2005-05-31 14:13:59','2006-02-15 22:14:58'),(7014,260,1,1626,'3.99','2005-06-16 07:49:47','2006-02-15 22:14:58'),(7015,260,2,2001,'2.99','2005-06-17 11:35:09','2006-02-15 22:14:58'),(7016,260,2,2040,'2.99','2005-06-17 14:18:37','2006-02-15 22:14:58'),(7017,260,1,2091,'10.99','2005-06-17 18:09:04','2006-02-15 22:14:58'),(7018,260,1,2178,'0.99','2005-06-18 00:38:35','2006-02-15 22:14:58'),(7019,260,1,2823,'7.99','2005-06-19 20:30:21','2006-02-15 22:14:58'),(7020,260,2,2958,'3.99','2005-06-20 06:56:20','2006-02-15 22:14:58'),(7021,260,1,3193,'0.99','2005-06-20 23:52:30','2006-02-15 22:14:59'),(7022,260,2,4054,'0.99','2005-07-07 03:42:07','2006-02-15 22:14:59'),(7023,260,2,4741,'6.99','2005-07-08 13:31:23','2006-02-15 22:14:59'),(7024,260,1,4870,'2.99','2005-07-08 19:14:45','2006-02-15 22:14:59'),(7025,260,2,6328,'2.99','2005-07-11 19:09:33','2006-02-15 22:14:59'),(7026,260,2,7072,'0.99','2005-07-27 04:02:33','2006-02-15 22:14:59'),(7027,260,1,7268,'1.99','2005-07-27 11:23:09','2006-02-15 22:14:59'),(7028,260,1,7885,'7.99','2005-07-28 10:37:41','2006-02-15 22:14:59'),(7029,260,1,8475,'1.99','2005-07-29 08:37:41','2006-02-15 22:14:59'),(7030,260,1,8484,'2.99','2005-07-29 08:51:59','2006-02-15 22:14:59'),(7031,260,1,8717,'0.99','2005-07-29 17:40:45','2006-02-15 22:14:59'),(7032,260,1,8933,'0.99','2005-07-30 02:36:06','2006-02-15 22:14:59'),(7033,260,2,9176,'4.99','2005-07-30 11:50:54','2006-02-15 22:14:59'),(7034,260,2,10970,'8.99','2005-08-02 04:06:46','2006-02-15 22:14:59'),(7035,260,1,12852,'0.99','2005-08-19 02:12:40','2006-02-15 22:14:59'),(7036,260,2,13440,'2.99','2005-08-19 23:42:52','2006-02-15 22:14:59'),(7037,260,1,13685,'3.99','2005-08-20 08:57:11','2006-02-15 22:14:59'),(7038,260,1,13966,'2.99','2005-08-20 18:28:28','2006-02-15 22:14:59'),(7039,260,2,13978,'0.99','2005-08-20 19:03:25','2006-02-15 22:14:59'),(7040,260,2,14035,'2.99','2005-08-20 21:31:58','2006-02-15 22:14:59'),(7041,260,2,14441,'2.99','2005-08-21 11:59:38','2006-02-15 22:14:59'),(7042,260,1,14579,'7.99','2005-08-21 16:54:47','2006-02-15 22:14:59'),(7043,260,1,14610,'6.99','2005-08-21 17:59:09','2006-02-15 22:14:59'),(7044,261,1,12,'4.99','2005-05-25 00:19:27','2006-02-15 22:14:59'),(7045,261,2,465,'3.99','2005-05-27 20:44:36','2006-02-15 22:14:59'),(7046,261,2,542,'6.99','2005-05-28 06:42:13','2006-02-15 22:14:59'),(7047,261,1,792,'0.99','2005-05-29 16:32:10','2006-02-15 22:14:59'),(7048,261,1,1760,'2.99','2005-06-16 17:48:37','2006-02-15 22:14:59'),(7049,261,1,1877,'5.99','2005-06-17 02:54:16','2006-02-15 22:15:00'),(7050,261,2,1988,'8.99','2005-06-17 10:42:34','2006-02-15 22:15:00'),(7051,261,2,2072,'3.99','2005-06-17 16:33:32','2006-02-15 22:15:00'),(7052,261,2,2392,'0.99','2005-06-18 15:34:18','2006-02-15 22:15:00'),(7053,261,1,3363,'0.99','2005-06-21 12:25:07','2006-02-15 22:15:00'),(7054,261,1,5122,'3.99','2005-07-09 07:19:35','2006-02-15 22:15:00'),(7055,261,1,5449,'5.99','2005-07-09 22:12:01','2006-02-15 22:15:00'),(7056,261,2,6515,'2.99','2005-07-12 03:50:32','2006-02-15 22:15:00'),(7057,261,1,6743,'0.99','2005-07-12 14:29:25','2006-02-15 22:15:00'),(7058,261,2,9552,'4.99','2005-07-31 02:05:32','2006-02-15 22:15:00'),(7059,261,1,9842,'4.99','2005-07-31 12:24:58','2006-02-15 22:15:00'),(7060,261,1,9869,'4.99','2005-07-31 13:21:54','2006-02-15 22:15:00'),(7061,261,2,10246,'1.99','2005-08-01 02:29:50','2006-02-15 22:15:00'),(7062,261,1,11834,'1.99','2005-08-17 13:00:40','2006-02-15 22:15:00'),(7063,261,2,11928,'2.99','2005-08-17 16:28:24','2006-02-15 22:15:00'),(7064,261,1,12327,'6.99','2005-08-18 06:43:22','2006-02-15 22:15:00'),(7065,261,2,13245,'4.99','2005-08-19 16:43:41','2006-02-15 22:15:00'),(7066,261,2,13506,'5.99','2005-08-20 02:07:06','2006-02-15 22:15:00'),(7067,261,1,13669,'2.99','2005-08-20 08:26:32','2006-02-15 22:15:00'),(7068,261,1,13849,'4.99','2005-08-20 14:42:34','2006-02-15 22:15:00'),(7069,261,2,15397,'4.99','2005-08-22 23:08:46','2006-02-15 22:15:00'),(7070,262,2,984,'4.99','2005-05-30 22:17:17','2006-02-15 22:15:00'),(7071,262,1,1563,'2.99','2005-06-16 02:46:28','2006-02-15 22:15:00'),(7072,262,1,2771,'6.99','2005-06-19 17:54:48','2006-02-15 22:15:00'),(7073,262,2,2850,'8.99','2005-06-19 23:06:28','2006-02-15 22:15:00'),(7074,262,1,2915,'1.99','2005-06-20 03:57:17','2006-02-15 22:15:00'),(7075,262,1,3521,'1.99','2005-07-06 01:00:11','2006-02-15 22:15:00'),(7076,262,1,3699,'3.99','2005-07-06 10:11:25','2006-02-15 22:15:01'),(7077,262,1,4501,'0.99','2005-07-08 02:12:00','2006-02-15 22:15:01'),(7078,262,2,5503,'0.99','2005-07-10 00:35:37','2006-02-15 22:15:01'),(7079,262,1,6291,'0.99','2005-07-11 17:16:40','2006-02-15 22:15:01'),(7080,262,2,6547,'7.99','2005-07-12 04:57:46','2006-02-15 22:15:01'),(7081,262,1,6724,'3.99','2005-07-12 13:45:15','2006-02-15 22:15:01'),(7082,262,2,6762,'7.99','2005-07-12 15:25:33','2006-02-15 22:15:01'),(7083,262,1,6805,'6.99','2005-07-12 17:23:01','2006-02-15 22:15:01'),(7084,262,1,6986,'4.99','2005-07-27 00:59:05','2006-02-15 22:15:01'),(7085,262,1,9105,'6.99','2005-07-30 08:50:25','2006-02-15 22:15:01'),(7086,262,2,10421,'0.99','2005-08-01 08:14:10','2006-02-15 22:15:01'),(7087,262,2,10770,'0.99','2005-08-01 20:45:39','2006-02-15 22:15:01'),(7088,262,2,13466,'2.99','2005-08-20 00:55:16','2006-02-15 22:15:01'),(7089,262,1,13808,'5.99','2005-08-20 12:55:43','2006-02-15 22:15:01'),(7090,262,1,14180,'4.99','2005-08-21 03:16:15','2006-02-15 22:15:01'),(7091,262,2,14465,'3.99','2005-08-21 12:54:22','2006-02-15 22:15:01'),(7092,262,2,14834,'6.99','2005-08-22 01:45:58','2006-02-15 22:15:01'),(7093,262,2,15270,'3.99','2005-08-22 18:48:42','2006-02-15 22:15:01'),(7094,262,1,15456,'0.99','2005-08-23 01:07:01','2006-02-15 22:15:01'),(7095,262,1,15640,'4.99','2005-08-23 08:04:40','2006-02-15 22:15:01'),(7096,262,2,15771,'4.99','2005-08-23 13:18:46','2006-02-15 22:15:01'),(7097,262,1,15918,'3.99','2005-08-23 17:57:35','2006-02-15 22:15:01'),(7098,263,1,97,'4.99','2005-05-25 16:34:24','2006-02-15 22:15:01'),(7099,263,1,266,'0.99','2005-05-26 16:08:05','2006-02-15 22:15:01'),(7100,263,2,2126,'8.99','2005-06-17 20:54:36','2006-02-15 22:15:01'),(7101,263,2,3257,'1.99','2005-06-21 03:47:19','2006-02-15 22:15:01'),(7102,263,1,3578,'4.99','2005-07-06 03:47:05','2006-02-15 22:15:01'),(7103,263,2,3773,'2.99','2005-07-06 13:23:34','2006-02-15 22:15:02'),(7104,263,2,4637,'0.99','2005-07-08 08:49:54','2006-02-15 22:15:02'),(7105,263,2,4682,'2.99','2005-07-08 10:38:27','2006-02-15 22:15:02'),(7106,263,2,5125,'2.99','2005-07-09 07:25:28','2006-02-15 22:15:02'),(7107,263,2,5254,'1.99','2005-07-09 13:50:11','2006-02-15 22:15:02'),(7108,263,2,6376,'4.99','2005-07-11 21:40:23','2006-02-15 22:15:02'),(7109,263,1,6483,'2.99','2005-07-12 01:59:20','2006-02-15 22:15:02'),(7110,263,1,6808,'1.99','2005-07-12 17:36:42','2006-02-15 22:15:02'),(7111,263,2,7291,'4.99','2005-07-27 12:30:47','2006-02-15 22:15:02'),(7112,263,1,7425,'4.99','2005-07-27 17:18:35','2006-02-15 22:15:02'),(7113,263,1,7706,'4.99','2005-07-28 04:03:17','2006-02-15 22:15:02'),(7114,263,2,7833,'1.99','2005-07-28 08:46:14','2006-02-15 22:15:02'),(7115,263,1,10476,'6.99','2005-08-01 10:03:20','2006-02-15 22:15:02'),(7116,263,1,10775,'2.99','2005-08-01 20:59:52','2006-02-15 22:15:02'),(7117,263,1,11339,'2.99','2005-08-02 17:02:06','2006-02-15 22:15:02'),(7118,263,1,11822,'0.99','2005-08-17 12:32:39','2006-02-15 22:15:02'),(7119,263,2,12057,'9.99','2005-08-17 21:04:35','2006-02-15 22:15:02'),(7120,263,2,12432,'5.99','2005-08-18 10:35:13','2006-02-15 22:15:02'),(7121,263,2,12919,'6.99','2005-08-19 04:32:15','2006-02-15 22:15:02'),(7122,263,1,14335,'3.99','2005-08-21 08:33:07','2006-02-15 22:15:02'),(7123,263,2,14448,'6.99','2005-08-21 12:13:10','2006-02-15 22:15:02'),(7124,263,1,15322,'4.99','2005-08-22 20:20:30','2006-02-15 22:15:02'),(7125,263,2,15922,'7.99','2005-08-23 18:07:31','2006-02-15 22:15:02'),(7126,263,1,15293,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:02'),(7127,264,2,1165,'3.99','2005-06-14 23:16:27','2006-02-15 22:15:02'),(7128,264,1,1206,'4.99','2005-06-15 02:27:07','2006-02-15 22:15:02'),(7129,264,1,3028,'0.99','2005-06-20 11:50:52','2006-02-15 22:15:02'),(7130,264,1,3403,'3.99','2005-06-21 15:55:06','2006-02-15 22:15:02'),(7131,264,1,3618,'6.99','2005-07-06 05:58:45','2006-02-15 22:15:03'),(7132,264,1,4328,'4.99','2005-07-07 18:03:17','2006-02-15 22:15:03'),(7133,264,1,4539,'0.99','2005-07-08 04:01:02','2006-02-15 22:15:03'),(7134,264,1,6340,'8.99','2005-07-11 19:46:05','2006-02-15 22:15:03'),(7135,264,2,6391,'0.99','2005-07-11 22:23:09','2006-02-15 22:15:03'),(7136,264,1,6395,'2.99','2005-07-11 22:29:29','2006-02-15 22:15:03'),(7137,264,1,6543,'0.99','2005-07-12 04:54:32','2006-02-15 22:15:03'),(7138,264,1,7006,'8.99','2005-07-27 01:42:20','2006-02-15 22:15:03'),(7139,264,2,9380,'2.99','2005-07-30 19:17:31','2006-02-15 22:15:03'),(7140,264,2,9515,'0.99','2005-07-31 00:35:05','2006-02-15 22:15:03'),(7141,264,1,9861,'5.99','2005-07-31 13:04:14','2006-02-15 22:15:03'),(7142,264,1,9932,'5.99','2005-07-31 15:19:48','2006-02-15 22:15:03'),(7143,264,2,10792,'2.99','2005-08-01 21:44:24','2006-02-15 22:15:03'),(7144,264,1,11527,'3.99','2005-08-17 00:25:06','2006-02-15 22:15:03'),(7145,264,2,11533,'0.99','2005-08-17 00:34:53','2006-02-15 22:15:03'),(7146,264,1,11539,'2.99','2005-08-17 00:45:41','2006-02-15 22:15:03'),(7147,264,1,12518,'4.99','2005-08-18 13:41:32','2006-02-15 22:15:03'),(7148,264,2,13590,'2.99','2005-08-20 05:48:59','2006-02-15 22:15:03'),(7149,264,1,13664,'5.99','2005-08-20 08:18:36','2006-02-15 22:15:03'),(7150,264,1,15595,'4.99','2005-08-23 06:19:12','2006-02-15 22:15:03'),(7151,264,2,14243,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:03'),(7152,265,2,74,'0.99','2005-05-25 11:09:48','2006-02-15 22:15:03'),(7153,265,2,2027,'7.99','2005-06-17 13:06:56','2006-02-15 22:15:03'),(7154,265,2,2562,'4.99','2005-06-19 03:15:05','2006-02-15 22:15:03'),(7155,265,1,2598,'2.99','2005-06-19 05:59:57','2006-02-15 22:15:03'),(7156,265,1,3823,'2.99','2005-07-06 15:41:27','2006-02-15 22:15:03'),(7157,265,1,4610,'0.99','2005-07-08 07:28:05','2006-02-15 22:15:03'),(7158,265,1,4797,'2.99','2005-07-08 16:39:05','2006-02-15 22:15:03'),(7159,265,2,5029,'7.99','2005-07-09 02:35:32','2006-02-15 22:15:03'),(7160,265,1,5417,'4.99','2005-07-09 20:34:09','2006-02-15 22:15:04'),(7161,265,1,5710,'9.99','2005-07-10 10:32:52','2006-02-15 22:15:04'),(7162,265,1,6068,'4.99','2005-07-11 04:41:09','2006-02-15 22:15:04'),(7163,265,2,6371,'4.99','2005-07-11 21:31:51','2006-02-15 22:15:04'),(7164,265,2,6553,'5.99','2005-07-12 05:06:39','2006-02-15 22:15:04'),(7165,265,2,6921,'6.99','2005-07-12 22:39:03','2006-02-15 22:15:04'),(7166,265,2,7414,'1.99','2005-07-27 16:46:07','2006-02-15 22:15:04'),(7167,265,1,7704,'2.99','2005-07-28 04:02:13','2006-02-15 22:15:04'),(7168,265,1,8278,'5.99','2005-07-29 01:42:55','2006-02-15 22:15:04'),(7169,265,2,8489,'2.99','2005-07-29 08:58:03','2006-02-15 22:15:04'),(7170,265,2,8665,'0.99','2005-07-29 15:39:29','2006-02-15 22:15:04'),(7171,265,1,9416,'2.99','2005-07-30 20:52:45','2006-02-15 22:15:04'),(7172,265,2,10592,'3.99','2005-08-01 14:13:00','2006-02-15 22:15:04'),(7173,265,2,11000,'3.99','2005-08-02 04:56:14','2006-02-15 22:15:04'),(7174,265,1,12207,'1.99','2005-08-18 02:24:07','2006-02-15 22:15:04'),(7175,265,2,12346,'4.99','2005-08-18 07:17:55','2006-02-15 22:15:04'),(7176,265,2,13700,'8.99','2005-08-20 09:26:17','2006-02-15 22:15:04'),(7177,265,2,14125,'4.99','2005-08-21 01:32:16','2006-02-15 22:15:04'),(7178,265,1,14547,'6.99','2005-08-21 15:51:38','2006-02-15 22:15:04'),(7179,265,2,14556,'6.99','2005-08-21 16:03:27','2006-02-15 22:15:04'),(7180,265,1,14943,'2.99','2005-08-22 05:59:59','2006-02-15 22:15:04'),(7181,266,1,86,'1.99','2005-05-25 13:36:12','2006-02-15 22:15:04'),(7182,266,2,651,'2.99','2005-05-28 19:46:50','2006-02-15 22:15:04'),(7183,266,2,1280,'5.99','2005-06-15 08:16:06','2006-02-15 22:15:04'),(7184,266,2,2065,'4.99','2005-06-17 16:03:46','2006-02-15 22:15:04'),(7185,266,2,3002,'4.99','2005-06-20 09:56:12','2006-02-15 22:15:04'),(7186,266,1,3059,'4.99','2005-06-20 13:38:41','2006-02-15 22:15:04'),(7187,266,2,3585,'0.99','2005-07-06 04:22:36','2006-02-15 22:15:04'),(7188,266,2,5362,'5.99','2005-07-09 18:16:08','2006-02-15 22:15:05'),(7189,266,1,5577,'4.99','2005-07-10 03:58:40','2006-02-15 22:15:05'),(7190,266,1,8492,'2.99','2005-07-29 09:04:17','2006-02-15 22:15:05'),(7191,266,2,9109,'5.99','2005-07-30 08:58:24','2006-02-15 22:15:05'),(7192,266,2,10747,'4.99','2005-08-01 19:59:41','2006-02-15 22:15:05'),(7193,266,2,10910,'5.99','2005-08-02 01:54:34','2006-02-15 22:15:05'),(7194,266,2,11233,'5.99','2005-08-02 13:06:11','2006-02-15 22:15:05'),(7195,266,1,11321,'4.99','2005-08-02 16:15:07','2006-02-15 22:15:05'),(7196,266,2,11626,'0.99','2005-08-17 04:25:42','2006-02-15 22:15:05'),(7197,266,1,11726,'0.99','2005-08-17 08:11:10','2006-02-15 22:15:05'),(7198,266,1,12255,'4.99','2005-08-18 04:07:20','2006-02-15 22:15:05'),(7199,266,2,12378,'0.99','2005-08-18 08:26:13','2006-02-15 22:15:05'),(7200,266,1,12405,'6.99','2005-08-18 09:37:30','2006-02-15 22:15:05'),(7201,266,1,12715,'4.99','2005-08-18 21:09:38','2006-02-15 22:15:05'),(7202,266,1,13468,'8.99','2005-08-20 00:56:44','2006-02-15 22:15:05'),(7203,266,1,13556,'6.99','2005-08-20 04:10:26','2006-02-15 22:15:05'),(7204,266,1,14080,'1.99','2005-08-20 23:29:50','2006-02-15 22:15:05'),(7205,266,1,14492,'2.99','2005-08-21 13:59:08','2006-02-15 22:15:05'),(7206,266,1,14877,'0.99','2005-08-22 03:39:56','2006-02-15 22:15:05'),(7207,266,1,15181,'2.99','2005-08-22 15:46:20','2006-02-15 22:15:05'),(7208,266,1,15346,'4.99','2005-08-22 21:06:00','2006-02-15 22:15:05'),(7209,267,2,91,'6.99','2005-05-25 14:57:22','2006-02-15 22:15:05'),(7210,267,1,436,'4.99','2005-05-27 17:21:04','2006-02-15 22:15:05'),(7211,267,2,1030,'4.99','2005-05-31 04:06:47','2006-02-15 22:15:05'),(7212,267,2,1257,'4.99','2005-06-15 06:15:36','2006-02-15 22:15:05'),(7213,267,2,1349,'4.99','2005-06-15 12:49:02','2006-02-15 22:15:05'),(7214,267,2,2265,'2.99','2005-06-18 06:03:27','2006-02-15 22:15:05'),(7215,267,2,2578,'7.99','2005-06-19 04:40:06','2006-02-15 22:15:05'),(7216,267,1,2582,'6.99','2005-06-19 04:56:27','2006-02-15 22:15:05'),(7217,267,2,2699,'2.99','2005-06-19 13:29:28','2006-02-15 22:15:06'),(7218,267,2,2754,'4.99','2005-06-19 16:55:59','2006-02-15 22:15:06'),(7219,267,1,2877,'1.99','2005-06-20 01:07:16','2006-02-15 22:15:06'),(7220,267,2,3090,'0.99','2005-06-20 16:00:19','2006-02-15 22:15:06'),(7221,267,1,3817,'2.99','2005-07-06 15:31:45','2006-02-15 22:15:06'),(7222,267,1,5340,'6.99','2005-07-09 17:11:35','2006-02-15 22:15:06'),(7223,267,1,6070,'0.99','2005-07-11 04:47:42','2006-02-15 22:15:06'),(7224,267,1,6706,'3.99','2005-07-12 12:59:16','2006-02-15 22:15:06'),(7225,267,1,8190,'4.99','2005-07-28 22:47:06','2006-02-15 22:15:06'),(7226,267,1,8572,'1.99','2005-07-29 11:51:24','2006-02-15 22:15:06'),(7227,267,2,9059,'3.99','2005-07-30 07:18:44','2006-02-15 22:15:06'),(7228,267,1,9308,'6.99','2005-07-30 16:53:21','2006-02-15 22:15:06'),(7229,267,2,9403,'4.99','2005-07-30 20:18:53','2006-02-15 22:15:06'),(7230,267,2,9807,'2.99','2005-07-31 11:13:52','2006-02-15 22:15:06'),(7231,267,2,10048,'4.99','2005-07-31 19:08:56','2006-02-15 22:15:06'),(7232,267,1,10343,'2.99','2005-08-01 05:15:47','2006-02-15 22:15:06'),(7233,267,2,11373,'0.99','2005-08-02 18:14:12','2006-02-15 22:15:06'),(7234,267,1,11690,'6.99','2005-08-17 06:44:22','2006-02-15 22:15:06'),(7235,267,1,12320,'4.99','2005-08-18 06:26:51','2006-02-15 22:15:06'),(7236,267,1,12979,'4.99','2005-08-19 07:00:35','2006-02-15 22:15:06'),(7237,267,2,13236,'9.99','2005-08-19 16:18:24','2006-02-15 22:15:06'),(7238,267,1,14131,'5.99','2005-08-21 01:43:40','2006-02-15 22:15:06'),(7239,267,2,15020,'3.99','2005-08-22 08:54:12','2006-02-15 22:15:06'),(7240,267,1,15208,'3.99','2005-08-22 16:35:47','2006-02-15 22:15:06'),(7241,267,1,15768,'0.99','2005-08-23 13:14:47','2006-02-15 22:15:06'),(7242,267,1,15903,'3.99','2005-08-23 17:30:40','2006-02-15 22:15:06'),(7243,267,2,12066,'7.98','2006-02-14 15:16:03','2006-02-15 22:15:06'),(7244,267,2,13713,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:07'),(7245,268,1,1394,'2.99','2005-06-15 16:17:21','2006-02-15 22:15:07'),(7246,268,2,1450,'4.99','2005-06-15 19:22:08','2006-02-15 22:15:07'),(7247,268,2,1551,'3.99','2005-06-16 02:01:15','2006-02-15 22:15:07'),(7248,268,1,2133,'0.99','2005-06-17 21:10:05','2006-02-15 22:15:07'),(7249,268,2,2324,'4.99','2005-06-18 10:00:33','2006-02-15 22:15:07'),(7250,268,2,2858,'2.99','2005-06-19 23:17:11','2006-02-15 22:15:07'),(7251,268,1,3066,'3.99','2005-06-20 13:55:41','2006-02-15 22:15:07'),(7252,268,1,3361,'1.99','2005-06-21 12:14:23','2006-02-15 22:15:07'),(7253,268,2,3670,'4.99','2005-07-06 08:56:43','2006-02-15 22:15:07'),(7254,268,2,4626,'4.99','2005-07-08 08:18:21','2006-02-15 22:15:07'),(7255,268,1,5039,'7.99','2005-07-09 03:14:45','2006-02-15 22:15:07'),(7256,268,2,5671,'2.99','2005-07-10 08:18:22','2006-02-15 22:15:07'),(7257,268,2,5793,'2.99','2005-07-10 14:33:00','2006-02-15 22:15:07'),(7258,268,2,5888,'6.99','2005-07-10 19:52:17','2006-02-15 22:15:07'),(7259,268,1,6120,'3.99','2005-07-11 07:49:53','2006-02-15 22:15:07'),(7260,268,2,6489,'1.99','2005-07-12 02:22:46','2006-02-15 22:15:07'),(7261,268,1,8931,'2.99','2005-07-30 02:30:07','2006-02-15 22:15:07'),(7262,268,2,9436,'7.99','2005-07-30 21:33:01','2006-02-15 22:15:07'),(7263,268,2,9531,'3.99','2005-07-31 01:11:53','2006-02-15 22:15:07'),(7264,268,1,10040,'1.99','2005-07-31 18:54:15','2006-02-15 22:15:07'),(7265,268,2,11462,'7.99','2005-08-02 21:36:46','2006-02-15 22:15:07'),(7266,268,2,11828,'6.99','2005-08-17 12:48:28','2006-02-15 22:15:07'),(7267,268,2,12007,'2.99','2005-08-17 19:10:34','2006-02-15 22:15:07'),(7268,268,2,12694,'4.99','2005-08-18 20:10:39','2006-02-15 22:15:07'),(7269,268,2,13880,'5.99','2005-08-20 15:18:20','2006-02-15 22:15:07'),(7270,268,2,14249,'4.99','2005-08-21 05:38:05','2006-02-15 22:15:07'),(7271,268,2,14373,'4.99','2005-08-21 09:44:53','2006-02-15 22:15:08'),(7272,268,1,14874,'0.99','2005-08-22 03:32:05','2006-02-15 22:15:08'),(7273,268,2,15183,'2.99','2005-08-22 15:49:54','2006-02-15 22:15:08'),(7274,269,2,7,'1.99','2005-05-24 23:11:53','2006-02-15 22:15:08'),(7275,269,1,98,'0.99','2005-05-25 16:48:24','2006-02-15 22:15:08'),(7276,269,2,678,'6.99','2005-05-28 23:15:48','2006-02-15 22:15:08'),(7277,269,2,703,'0.99','2005-05-29 02:29:36','2006-02-15 22:15:08'),(7278,269,1,750,'4.99','2005-05-29 09:41:40','2006-02-15 22:15:08'),(7279,269,2,1099,'2.99','2005-05-31 13:54:48','2006-02-15 22:15:08'),(7280,269,1,1334,'3.99','2005-06-15 11:43:09','2006-02-15 22:15:08'),(7281,269,2,1909,'2.99','2005-06-17 05:11:04','2006-02-15 22:15:08'),(7282,269,2,2493,'6.99','2005-06-18 22:12:09','2006-02-15 22:15:08'),(7283,269,1,4125,'9.99','2005-07-07 07:20:29','2006-02-15 22:15:08'),(7284,269,2,4804,'0.99','2005-07-08 16:57:30','2006-02-15 22:15:08'),(7285,269,2,4880,'6.99','2005-07-08 19:36:17','2006-02-15 22:15:08'),(7286,269,1,6440,'2.99','2005-07-12 00:25:04','2006-02-15 22:15:08'),(7287,269,1,6626,'5.99','2005-07-12 09:16:24','2006-02-15 22:15:08'),(7288,269,2,6804,'4.99','2005-07-12 17:22:06','2006-02-15 22:15:08'),(7289,269,1,7032,'4.99','2005-07-27 03:03:09','2006-02-15 22:15:08'),(7290,269,1,7537,'6.99','2005-07-27 21:36:09','2006-02-15 22:15:08'),(7291,269,1,7972,'2.99','2005-07-28 14:07:46','2006-02-15 22:15:08'),(7292,269,2,10566,'2.99','2005-08-01 13:12:11','2006-02-15 22:15:08'),(7293,269,1,10908,'4.99','2005-08-02 01:53:06','2006-02-15 22:15:08'),(7294,269,1,11014,'4.99','2005-08-02 05:12:22','2006-02-15 22:15:08'),(7295,269,1,11915,'3.99','2005-08-17 16:05:28','2006-02-15 22:15:08'),(7296,269,1,12344,'4.99','2005-08-18 07:15:19','2006-02-15 22:15:09'),(7297,269,2,13142,'5.99','2005-08-19 12:42:28','2006-02-15 22:15:09'),(7298,269,2,13759,'2.99','2005-08-20 11:24:48','2006-02-15 22:15:09'),(7299,269,1,14266,'4.99','2005-08-21 06:20:51','2006-02-15 22:15:09'),(7300,269,2,14693,'6.99','2005-08-21 20:44:19','2006-02-15 22:15:09'),(7301,269,2,15788,'2.99','2005-08-23 13:54:39','2006-02-15 22:15:09'),(7302,269,1,13025,'3.98','2006-02-14 15:16:03','2006-02-15 22:15:09'),(7303,269,2,12610,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:09'),(7304,270,1,193,'1.99','2005-05-26 06:41:48','2006-02-15 22:15:09'),(7305,270,1,1040,'4.99','2005-05-31 05:35:16','2006-02-15 22:15:09'),(7306,270,1,1345,'4.99','2005-06-15 12:32:13','2006-02-15 22:15:09'),(7307,270,1,1896,'6.99','2005-06-17 04:25:46','2006-02-15 22:15:09'),(7308,270,1,2115,'3.99','2005-06-17 20:02:16','2006-02-15 22:15:09'),(7309,270,2,3164,'5.99','2005-06-20 21:29:00','2006-02-15 22:15:09'),(7310,270,1,3501,'3.99','2005-07-06 00:11:28','2006-02-15 22:15:09'),(7311,270,1,3987,'9.99','2005-07-06 23:28:24','2006-02-15 22:15:09'),(7312,270,2,5533,'0.99','2005-07-10 02:19:28','2006-02-15 22:15:09'),(7313,270,2,6520,'4.99','2005-07-12 04:05:16','2006-02-15 22:15:09'),(7314,270,1,8355,'2.99','2005-07-29 04:57:43','2006-02-15 22:15:09'),(7315,270,2,8618,'3.99','2005-07-29 13:48:20','2006-02-15 22:15:09'),(7316,270,1,10069,'3.99','2005-07-31 19:43:18','2006-02-15 22:15:09'),(7317,270,1,10461,'7.99','2005-08-01 09:32:53','2006-02-15 22:15:09'),(7318,270,2,10579,'5.99','2005-08-01 13:48:22','2006-02-15 22:15:09'),(7319,270,2,10648,'4.99','2005-08-01 16:08:52','2006-02-15 22:15:09'),(7320,270,1,11389,'2.99','2005-08-02 18:39:12','2006-02-15 22:15:09'),(7321,270,1,11810,'0.99','2005-08-17 11:56:48','2006-02-15 22:15:09'),(7322,270,2,11841,'2.99','2005-08-17 13:12:20','2006-02-15 22:15:09'),(7323,270,1,11917,'2.99','2005-08-17 16:08:17','2006-02-15 22:15:09'),(7324,270,1,12192,'2.99','2005-08-18 02:01:40','2006-02-15 22:15:10'),(7325,270,1,12442,'2.99','2005-08-18 10:50:07','2006-02-15 22:15:10'),(7326,270,2,13945,'1.99','2005-08-20 17:43:56','2006-02-15 22:15:10'),(7327,270,1,14618,'0.99','2005-08-21 18:09:51','2006-02-15 22:15:10'),(7328,270,2,15620,'6.99','2005-08-23 07:10:22','2006-02-15 22:15:10'),(7329,271,1,1096,'8.99','2005-05-31 13:30:49','2006-02-15 22:15:10'),(7330,271,2,1852,'2.99','2005-06-17 00:38:20','2006-02-15 22:15:10'),(7331,271,1,3640,'1.99','2005-07-06 07:12:26','2006-02-15 22:15:10'),(7332,271,2,4545,'2.99','2005-07-08 04:17:47','2006-02-15 22:15:10'),(7333,271,2,5878,'1.99','2005-07-10 19:09:57','2006-02-15 22:15:10'),(7334,271,1,5922,'2.99','2005-07-10 21:36:53','2006-02-15 22:15:10'),(7335,271,1,6024,'2.99','2005-07-11 02:16:47','2006-02-15 22:15:10'),(7336,271,1,7618,'3.99','2005-07-28 00:24:14','2006-02-15 22:15:10'),(7337,271,1,8592,'0.99','2005-07-29 12:33:58','2006-02-15 22:15:10'),(7338,271,1,9821,'4.99','2005-07-31 11:47:54','2006-02-15 22:15:10'),(7339,271,2,10143,'7.99','2005-07-31 22:11:43','2006-02-15 22:15:10'),(7340,271,2,10310,'4.99','2005-08-01 04:24:47','2006-02-15 22:15:10'),(7341,271,1,10599,'3.99','2005-08-01 14:23:58','2006-02-15 22:15:10'),(7342,271,1,11431,'2.99','2005-08-02 20:05:16','2006-02-15 22:15:10'),(7343,271,1,12219,'4.99','2005-08-18 02:49:54','2006-02-15 22:15:10'),(7344,271,2,14234,'0.99','2005-08-21 05:07:12','2006-02-15 22:15:10'),(7345,271,2,14355,'4.99','2005-08-21 09:08:29','2006-02-15 22:15:10'),(7346,271,1,15244,'2.99','2005-08-22 17:48:42','2006-02-15 22:15:10'),(7347,272,1,33,'0.99','2005-05-25 04:18:51','2006-02-15 22:15:10'),(7348,272,1,405,'6.99','2005-05-27 13:32:39','2006-02-15 22:15:10'),(7349,272,1,1041,'6.99','2005-05-31 05:46:23','2006-02-15 22:15:10'),(7350,272,1,1072,'0.99','2005-05-31 09:52:50','2006-02-15 22:15:10'),(7351,272,2,1604,'4.99','2005-06-16 06:14:25','2006-02-15 22:15:10'),(7352,272,2,2546,'5.99','2005-06-19 02:39:39','2006-02-15 22:15:11'),(7353,272,1,3323,'5.99','2005-06-21 08:45:33','2006-02-15 22:15:11'),(7354,272,2,5047,'3.99','2005-07-09 03:44:15','2006-02-15 22:15:11'),(7355,272,2,5158,'2.99','2005-07-09 08:53:09','2006-02-15 22:15:11'),(7356,272,2,7300,'7.99','2005-07-27 12:50:17','2006-02-15 22:15:11'),(7357,272,2,7658,'2.99','2005-07-28 02:09:12','2006-02-15 22:15:11'),(7358,272,1,8248,'7.99','2005-07-29 00:41:56','2006-02-15 22:15:11'),(7359,272,2,9787,'10.99','2005-07-31 10:26:19','2006-02-15 22:15:11'),(7360,272,1,10736,'2.99','2005-08-01 19:30:21','2006-02-15 22:15:11'),(7361,272,2,11003,'2.99','2005-08-02 05:03:05','2006-02-15 22:15:11'),(7362,272,2,11597,'8.99','2005-08-17 03:02:56','2006-02-15 22:15:11'),(7363,272,1,11881,'0.99','2005-08-17 14:31:56','2006-02-15 22:15:11'),(7364,272,2,12006,'6.99','2005-08-17 19:09:12','2006-02-15 22:15:11'),(7365,272,2,13274,'2.99','2005-08-19 17:50:03','2006-02-15 22:15:11'),(7366,272,1,13903,'2.99','2005-08-20 16:07:55','2006-02-15 22:15:11'),(7367,273,2,122,'3.99','2005-05-25 19:46:21','2006-02-15 22:15:11'),(7368,273,2,980,'0.99','2005-05-30 21:45:19','2006-02-15 22:15:11'),(7369,273,2,1391,'6.99','2005-06-15 16:11:21','2006-02-15 22:15:11'),(7370,273,2,1747,'6.99','2005-06-16 16:53:33','2006-02-15 22:15:11'),(7371,273,2,1765,'4.99','2005-06-16 17:56:10','2006-02-15 22:15:11'),(7372,273,1,2301,'1.99','2005-06-18 08:24:03','2006-02-15 22:15:11'),(7373,273,1,3202,'0.99','2005-06-21 00:33:47','2006-02-15 22:15:11'),(7374,273,2,3556,'2.99','2005-07-06 02:46:13','2006-02-15 22:15:11'),(7375,273,1,4937,'5.99','2005-07-08 22:29:59','2006-02-15 22:15:11'),(7376,273,1,5256,'7.99','2005-07-09 13:55:45','2006-02-15 22:15:12'),(7377,273,2,5435,'7.99','2005-07-09 21:28:07','2006-02-15 22:15:12'),(7378,273,1,5605,'2.99','2005-07-10 05:06:45','2006-02-15 22:15:12'),(7379,273,1,6592,'8.99','2005-07-12 07:19:35','2006-02-15 22:15:12'),(7380,273,1,6635,'1.99','2005-07-12 09:47:58','2006-02-15 22:15:12'),(7381,273,2,6696,'2.99','2005-07-12 12:44:04','2006-02-15 22:15:12'),(7382,273,1,6717,'5.99','2005-07-12 13:35:02','2006-02-15 22:15:12'),(7383,273,1,8449,'2.99','2005-07-29 07:42:25','2006-02-15 22:15:12'),(7384,273,1,9186,'4.99','2005-07-30 12:13:48','2006-02-15 22:15:12'),(7385,273,2,9285,'5.99','2005-07-30 15:26:08','2006-02-15 22:15:12'),(7386,273,2,9391,'0.99','2005-07-30 19:48:41','2006-02-15 22:15:12'),(7387,273,2,9693,'3.99','2005-07-31 07:11:50','2006-02-15 22:15:12'),(7388,273,2,9729,'0.99','2005-07-31 08:43:43','2006-02-15 22:15:12'),(7389,273,1,10272,'8.99','2005-08-01 03:14:34','2006-02-15 22:15:12'),(7390,273,1,10753,'3.99','2005-08-01 20:09:24','2006-02-15 22:15:12'),(7391,273,1,10768,'6.99','2005-08-01 20:39:32','2006-02-15 22:15:12'),(7392,273,1,11282,'4.99','2005-08-02 14:35:03','2006-02-15 22:15:12'),(7393,273,2,11509,'4.99','2005-08-16 23:29:53','2006-02-15 22:15:12'),(7394,273,1,12692,'0.99','2005-08-18 20:09:19','2006-02-15 22:15:12'),(7395,273,2,13738,'4.99','2005-08-20 10:42:42','2006-02-15 22:15:12'),(7396,273,1,13955,'5.99','2005-08-20 18:05:12','2006-02-15 22:15:12'),(7397,273,2,14092,'4.99','2005-08-21 00:14:32','2006-02-15 22:15:12'),(7398,273,2,14558,'2.99','2005-08-21 16:10:50','2006-02-15 22:15:12'),(7399,273,2,14911,'2.99','2005-08-22 04:51:42','2006-02-15 22:15:12'),(7400,273,2,15372,'2.99','2005-08-22 21:59:51','2006-02-15 22:15:12'),(7401,273,1,15760,'6.99','2005-08-23 12:50:00','2006-02-15 22:15:12'),(7402,274,1,147,'2.99','2005-05-26 00:17:50','2006-02-15 22:15:12'),(7403,274,1,208,'4.99','2005-05-26 08:10:22','2006-02-15 22:15:13'),(7404,274,2,301,'2.99','2005-05-26 21:06:14','2006-02-15 22:15:13'),(7405,274,1,394,'5.99','2005-05-27 11:26:11','2006-02-15 22:15:13'),(7406,274,2,474,'2.99','2005-05-27 22:11:56','2006-02-15 22:15:13'),(7407,274,1,892,'4.99','2005-05-30 08:02:56','2006-02-15 22:15:13'),(7408,274,1,2098,'0.99','2005-06-17 18:42:09','2006-02-15 22:15:13'),(7409,274,2,3291,'9.99','2005-06-21 06:55:36','2006-02-15 22:15:13'),(7410,274,2,3532,'5.99','2005-07-06 01:24:38','2006-02-15 22:15:13'),(7411,274,1,4147,'2.99','2005-07-07 08:32:12','2006-02-15 22:15:13'),(7412,274,2,4582,'2.99','2005-07-08 06:09:09','2006-02-15 22:15:13'),(7413,274,2,6389,'3.99','2005-07-11 22:18:20','2006-02-15 22:15:13'),(7414,274,2,8259,'0.99','2005-07-29 01:05:16','2006-02-15 22:15:13'),(7415,274,2,8406,'5.99','2005-07-29 06:34:45','2006-02-15 22:15:13'),(7416,274,2,8517,'7.99','2005-07-29 10:00:48','2006-02-15 22:15:13'),(7417,274,1,9331,'4.99','2005-07-30 17:46:50','2006-02-15 22:15:13'),(7418,274,1,9677,'4.99','2005-07-31 06:39:45','2006-02-15 22:15:13'),(7419,274,2,10059,'4.99','2005-07-31 19:20:49','2006-02-15 22:15:13'),(7420,274,1,10790,'1.99','2005-08-01 21:38:37','2006-02-15 22:15:13'),(7421,274,2,10855,'0.99','2005-08-02 00:06:37','2006-02-15 22:15:13'),(7422,274,1,11058,'3.99','2005-08-02 06:38:44','2006-02-15 22:15:13'),(7423,274,2,11363,'2.99','2005-08-02 17:48:39','2006-02-15 22:15:13'),(7424,274,1,12321,'3.99','2005-08-18 06:27:05','2006-02-15 22:15:13'),(7425,274,1,13103,'2.99','2005-08-19 11:05:51','2006-02-15 22:15:13'),(7426,274,2,13129,'8.99','2005-08-19 12:05:04','2006-02-15 22:15:13'),(7427,274,1,13549,'8.99','2005-08-20 03:58:41','2006-02-15 22:15:13'),(7428,274,1,14012,'0.99','2005-08-20 20:42:12','2006-02-15 22:15:13'),(7429,274,1,14066,'7.99','2005-08-20 22:45:58','2006-02-15 22:15:13'),(7430,274,2,14164,'7.99','2005-08-21 02:58:02','2006-02-15 22:15:14'),(7431,274,1,14388,'4.99','2005-08-21 10:15:13','2006-02-15 22:15:14'),(7432,274,2,15143,'2.99','2005-08-22 13:46:24','2006-02-15 22:15:14'),(7433,274,1,15260,'2.99','2005-08-22 18:24:16','2006-02-15 22:15:14'),(7434,274,2,15328,'2.99','2005-08-22 20:31:38','2006-02-15 22:15:14'),(7435,274,2,15819,'3.99','2005-08-23 15:01:54','2006-02-15 22:15:14'),(7436,274,1,13486,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:14'),(7437,275,2,336,'2.99','2005-05-27 03:15:23','2006-02-15 22:15:14'),(7438,275,2,1797,'3.99','2005-06-16 20:13:03','2006-02-15 22:15:14'),(7439,275,2,2414,'0.99','2005-06-18 17:01:55','2006-02-15 22:15:14'),(7440,275,1,2646,'4.99','2005-06-19 09:56:01','2006-02-15 22:15:14'),(7441,275,1,3355,'2.99','2005-06-21 11:30:47','2006-02-15 22:15:14'),(7442,275,2,4396,'0.99','2005-07-07 21:14:19','2006-02-15 22:15:14'),(7443,275,1,4634,'0.99','2005-07-08 08:40:02','2006-02-15 22:15:14'),(7444,275,2,4912,'9.99','2005-07-08 21:26:11','2006-02-15 22:15:14'),(7445,275,2,6301,'5.99','2005-07-11 17:54:09','2006-02-15 22:15:14'),(7446,275,2,6856,'0.99','2005-07-12 19:50:16','2006-02-15 22:15:14'),(7447,275,1,7553,'2.99','2005-07-27 22:11:36','2006-02-15 22:15:14'),(7448,275,2,7596,'4.99','2005-07-27 23:33:57','2006-02-15 22:15:14'),(7449,275,1,8746,'2.99','2005-07-29 19:03:15','2006-02-15 22:15:15'),(7450,275,2,9258,'2.99','2005-07-30 14:31:31','2006-02-15 22:15:15'),(7451,275,1,10479,'6.99','2005-08-01 10:11:25','2006-02-15 22:15:15'),(7452,275,2,11309,'1.99','2005-08-02 15:50:55','2006-02-15 22:15:15'),(7453,275,1,11610,'4.99','2005-08-17 03:43:37','2006-02-15 22:15:15'),(7454,275,2,12589,'5.99','2005-08-18 16:06:31','2006-02-15 22:15:15'),(7455,275,1,12606,'1.99','2005-08-18 17:02:21','2006-02-15 22:15:15'),(7456,275,1,13037,'3.99','2005-08-19 08:53:57','2006-02-15 22:15:15'),(7457,275,2,13860,'2.99','2005-08-20 14:55:09','2006-02-15 22:15:15'),(7458,275,2,13865,'1.99','2005-08-20 15:04:09','2006-02-15 22:15:15'),(7459,275,2,13902,'0.99','2005-08-20 16:07:08','2006-02-15 22:15:15'),(7460,275,2,14063,'0.99','2005-08-20 22:36:40','2006-02-15 22:15:15'),(7461,275,1,14187,'5.99','2005-08-21 03:32:03','2006-02-15 22:15:15'),(7462,275,1,14296,'2.99','2005-08-21 07:13:23','2006-02-15 22:15:15'),(7463,275,2,14483,'5.99','2005-08-21 13:43:59','2006-02-15 22:15:15'),(7464,275,2,14727,'4.99','2005-08-21 22:12:45','2006-02-15 22:15:15'),(7465,275,2,15269,'2.99','2005-08-22 18:39:44','2006-02-15 22:15:15'),(7466,275,2,15496,'3.99','2005-08-23 02:30:23','2006-02-15 22:15:15'),(7467,276,1,736,'3.99','2005-05-29 08:10:07','2006-02-15 22:15:15'),(7468,276,1,860,'10.99','2005-05-30 02:45:16','2006-02-15 22:15:15'),(7469,276,1,1352,'0.99','2005-06-15 12:58:27','2006-02-15 22:15:15'),(7470,276,2,2763,'4.99','2005-06-19 17:23:34','2006-02-15 22:15:16'),(7471,276,2,3064,'6.99','2005-06-20 13:53:13','2006-02-15 22:15:16'),(7472,276,2,3714,'2.99','2005-07-06 10:51:28','2006-02-15 22:15:16'),(7473,276,1,4715,'0.99','2005-07-08 12:15:37','2006-02-15 22:15:16'),(7474,276,2,5186,'4.99','2005-07-09 10:18:40','2006-02-15 22:15:16'),(7475,276,2,5246,'4.99','2005-07-09 13:25:18','2006-02-15 22:15:16'),(7476,276,2,7282,'5.99','2005-07-27 12:00:19','2006-02-15 22:15:16'),(7477,276,2,7842,'2.99','2005-07-28 09:10:06','2006-02-15 22:15:16'),(7478,276,1,9070,'0.99','2005-07-30 07:40:39','2006-02-15 22:15:16'),(7479,276,1,9080,'1.99','2005-07-30 08:02:39','2006-02-15 22:15:16'),(7480,276,1,9102,'4.99','2005-07-30 08:48:20','2006-02-15 22:15:16'),(7481,276,1,9229,'8.99','2005-07-30 13:38:17','2006-02-15 22:15:16'),(7482,276,2,10149,'5.99','2005-07-31 22:20:46','2006-02-15 22:15:16'),(7483,276,2,10691,'0.99','2005-08-01 18:09:53','2006-02-15 22:15:16'),(7484,276,1,10763,'2.99','2005-08-01 20:32:27','2006-02-15 22:15:16'),(7485,276,2,11085,'2.99','2005-08-02 07:36:44','2006-02-15 22:15:16'),(7486,276,1,11636,'4.99','2005-08-17 04:36:31','2006-02-15 22:15:16'),(7487,276,2,11961,'3.99','2005-08-17 17:28:01','2006-02-15 22:15:16'),(7488,276,2,12178,'5.99','2005-08-18 01:17:32','2006-02-15 22:15:16'),(7489,276,2,12251,'4.99','2005-08-18 03:59:02','2006-02-15 22:15:16'),(7490,276,1,12650,'4.99','2005-08-18 18:33:20','2006-02-15 22:15:16'),(7491,276,1,14000,'4.99','2005-08-20 20:06:05','2006-02-15 22:15:16'),(7492,276,2,15718,'2.99','2005-08-23 11:05:17','2006-02-15 22:15:16'),(7493,276,1,15769,'3.99','2005-08-23 13:16:15','2006-02-15 22:15:16'),(7494,276,2,15923,'4.99','2005-08-23 18:08:19','2006-02-15 22:15:17'),(7495,277,2,308,'6.99','2005-05-26 22:01:39','2006-02-15 22:15:17'),(7496,277,1,1331,'2.99','2005-06-15 11:34:33','2006-02-15 22:15:17'),(7497,277,2,1717,'2.99','2005-06-16 14:47:16','2006-02-15 22:15:17'),(7498,277,2,2162,'3.99','2005-06-17 23:45:47','2006-02-15 22:15:17'),(7499,277,2,2723,'4.99','2005-06-19 14:55:23','2006-02-15 22:15:17'),(7500,277,1,3247,'5.99','2005-06-21 03:12:15','2006-02-15 22:15:17'),(7501,277,2,3274,'4.99','2005-06-21 05:30:36','2006-02-15 22:15:17'),(7502,277,1,3344,'2.99','2005-06-21 10:57:27','2006-02-15 22:15:17'),(7503,277,2,3740,'5.99','2005-07-06 11:55:35','2006-02-15 22:15:17'),(7504,277,2,3897,'2.99','2005-07-06 19:11:43','2006-02-15 22:15:17'),(7505,277,1,4290,'4.99','2005-07-07 15:47:10','2006-02-15 22:15:17'),(7506,277,2,4987,'5.99','2005-07-09 00:45:41','2006-02-15 22:15:17'),(7507,277,1,5861,'0.99','2005-07-10 18:14:22','2006-02-15 22:15:17'),(7508,277,1,5913,'2.99','2005-07-10 20:58:55','2006-02-15 22:15:17'),(7509,277,2,6455,'2.99','2005-07-12 01:01:58','2006-02-15 22:15:17'),(7510,277,1,6487,'5.99','2005-07-12 02:17:00','2006-02-15 22:15:17'),(7511,277,2,7423,'4.99','2005-07-27 17:11:47','2006-02-15 22:15:17'),(7512,277,2,8410,'2.99','2005-07-29 06:41:36','2006-02-15 22:15:17'),(7513,277,2,9669,'4.99','2005-07-31 06:31:36','2006-02-15 22:15:17'),(7514,277,1,9901,'0.99','2005-07-31 14:20:59','2006-02-15 22:15:17'),(7515,277,2,11074,'3.99','2005-08-02 07:21:43','2006-02-15 22:15:17'),(7516,277,2,11162,'4.99','2005-08-02 10:07:54','2006-02-15 22:15:17'),(7517,277,2,11574,'0.99','2005-08-17 01:38:19','2006-02-15 22:15:17'),(7518,277,2,12149,'3.99','2005-08-18 00:13:51','2006-02-15 22:15:17'),(7519,277,1,12458,'5.99','2005-08-18 11:22:53','2006-02-15 22:15:17'),(7520,277,1,13122,'4.99','2005-08-19 11:53:49','2006-02-15 22:15:17'),(7521,277,2,13526,'4.99','2005-08-20 02:58:42','2006-02-15 22:15:18'),(7522,277,1,13714,'4.99','2005-08-20 09:41:09','2006-02-15 22:15:18'),(7523,277,2,14227,'4.99','2005-08-21 04:56:31','2006-02-15 22:15:18'),(7524,277,2,14745,'4.99','2005-08-21 22:53:01','2006-02-15 22:15:18'),(7525,277,1,15008,'10.99','2005-08-22 08:24:32','2006-02-15 22:15:18'),(7526,277,1,15345,'5.99','2005-08-22 21:05:50','2006-02-15 22:15:18'),(7527,278,1,1092,'4.99','2005-05-31 12:15:57','2006-02-15 22:15:18'),(7528,278,2,1387,'0.99','2005-06-15 15:40:56','2006-02-15 22:15:18'),(7529,278,1,1978,'2.99','2005-06-17 09:42:34','2006-02-15 22:15:18'),(7530,278,2,2078,'4.99','2005-06-17 16:48:55','2006-02-15 22:15:18'),(7531,278,1,3453,'2.99','2005-06-21 21:12:11','2006-02-15 22:15:18'),(7532,278,1,3776,'2.99','2005-07-06 13:31:37','2006-02-15 22:15:18'),(7533,278,1,4430,'4.99','2005-07-07 22:35:24','2006-02-15 22:15:18'),(7534,278,2,4866,'8.99','2005-07-08 19:09:59','2006-02-15 22:15:18'),(7535,278,2,6869,'4.99','2005-07-12 20:12:06','2006-02-15 22:15:18'),(7536,278,1,7239,'0.99','2005-07-27 10:20:27','2006-02-15 22:15:18'),(7537,278,2,7834,'0.99','2005-07-28 08:46:43','2006-02-15 22:15:18'),(7538,278,2,8222,'5.99','2005-07-28 23:51:53','2006-02-15 22:15:18'),(7539,278,1,8953,'4.99','2005-07-30 03:21:05','2006-02-15 22:15:18'),(7540,278,2,9448,'2.99','2005-07-30 21:56:13','2006-02-15 22:15:18'),(7541,278,1,10649,'2.99','2005-08-01 16:11:40','2006-02-15 22:15:18'),(7542,278,1,10731,'2.99','2005-08-01 19:21:48','2006-02-15 22:15:18'),(7543,278,2,10849,'3.99','2005-08-01 23:51:00','2006-02-15 22:15:18'),(7544,278,1,11095,'5.99','2005-08-02 08:03:20','2006-02-15 22:15:18'),(7545,278,2,11531,'0.99','2005-08-17 00:30:04','2006-02-15 22:15:18'),(7546,278,1,12787,'0.99','2005-08-19 00:07:58','2006-02-15 22:15:18'),(7547,278,1,13896,'0.99','2005-08-20 15:59:56','2006-02-15 22:15:18'),(7548,278,2,13976,'0.99','2005-08-20 19:02:16','2006-02-15 22:15:19'),(7549,278,1,14268,'2.99','2005-08-21 06:21:24','2006-02-15 22:15:19'),(7550,278,2,14803,'0.99','2005-08-22 00:49:10','2006-02-15 22:15:19'),(7551,278,1,14986,'4.99','2005-08-22 07:37:24','2006-02-15 22:15:19'),(7552,278,1,16019,'4.99','2005-08-23 21:30:45','2006-02-15 22:15:19'),(7553,279,1,979,'2.99','2005-05-30 21:37:11','2006-02-15 22:15:19'),(7554,279,2,1019,'0.99','2005-05-31 03:05:07','2006-02-15 22:15:19'),(7555,279,1,1178,'2.99','2005-06-15 00:36:40','2006-02-15 22:15:19'),(7556,279,1,2147,'4.99','2005-06-17 22:28:13','2006-02-15 22:15:19'),(7557,279,1,3215,'0.99','2005-06-21 01:11:32','2006-02-15 22:15:19'),(7558,279,1,3374,'2.99','2005-06-21 13:36:30','2006-02-15 22:15:19'),(7559,279,1,3375,'4.99','2005-06-21 13:37:18','2006-02-15 22:15:19'),(7560,279,1,4476,'4.99','2005-07-08 00:34:25','2006-02-15 22:15:19'),(7561,279,1,4978,'7.99','2005-07-09 00:22:02','2006-02-15 22:15:19'),(7562,279,2,5248,'2.99','2005-07-09 13:29:44','2006-02-15 22:15:19'),(7563,279,1,5361,'9.99','2005-07-09 18:15:32','2006-02-15 22:15:19'),(7564,279,1,6176,'0.99','2005-07-11 10:48:21','2006-02-15 22:15:19'),(7565,279,1,7947,'2.99','2005-07-28 13:05:50','2006-02-15 22:15:19'),(7566,279,2,8559,'3.99','2005-07-29 11:25:54','2006-02-15 22:15:19'),(7567,279,2,9820,'5.99','2005-07-31 11:46:57','2006-02-15 22:15:19'),(7568,279,2,10177,'2.99','2005-07-31 23:42:33','2006-02-15 22:15:19'),(7569,279,2,11250,'6.99','2005-08-02 13:35:42','2006-02-15 22:15:19'),(7570,279,1,11515,'2.99','2005-08-16 23:54:34','2006-02-15 22:15:19'),(7571,279,1,11703,'4.99','2005-08-17 07:19:29','2006-02-15 22:15:19'),(7572,279,2,12935,'2.99','2005-08-19 05:20:25','2006-02-15 22:15:19'),(7573,279,1,12949,'4.99','2005-08-19 05:55:52','2006-02-15 22:15:19'),(7574,279,1,13105,'7.99','2005-08-19 11:06:16','2006-02-15 22:15:20'),(7575,279,1,13233,'2.99','2005-08-19 16:14:41','2006-02-15 22:15:20'),(7576,279,2,13588,'4.99','2005-08-20 05:47:11','2006-02-15 22:15:20'),(7577,279,2,14206,'2.99','2005-08-21 03:59:26','2006-02-15 22:15:20'),(7578,279,1,14714,'3.99','2005-08-21 21:27:43','2006-02-15 22:15:20'),(7579,279,1,14779,'5.99','2005-08-22 00:00:56','2006-02-15 22:15:20'),(7580,279,1,14789,'4.99','2005-08-22 00:29:39','2006-02-15 22:15:20'),(7581,279,2,15580,'6.99','2005-08-23 05:39:06','2006-02-15 22:15:20'),(7582,279,1,15606,'2.99','2005-08-23 06:50:27','2006-02-15 22:15:20'),(7583,279,2,13538,'4.99','2006-02-14 15:16:03','2006-02-15 22:15:20'),(7584,280,1,1014,'4.99','2005-05-31 02:39:16','2006-02-15 22:15:20'),(7585,280,1,2656,'3.99','2005-06-19 10:42:33','2006-02-15 22:15:20'),(7586,280,2,3009,'4.99','2005-06-20 10:24:44','2006-02-15 22:15:20'),(7587,280,2,3097,'0.99','2005-06-20 16:26:14','2006-02-15 22:15:20'),(7588,280,1,4616,'4.99','2005-07-08 07:48:12','2006-02-15 22:15:20'),(7589,280,2,6851,'0.99','2005-07-12 19:32:14','2006-02-15 22:15:20'),(7590,280,1,7070,'4.99','2005-07-27 04:01:08','2006-02-15 22:15:20'),(7591,280,2,7901,'0.99','2005-07-28 11:12:12','2006-02-15 22:15:20'),(7592,280,2,8319,'0.99','2005-07-29 03:44:52','2006-02-15 22:15:20'),(7593,280,1,8365,'0.99','2005-07-29 05:11:00','2006-02-15 22:15:20'),(7594,280,1,8565,'7.99','2005-07-29 11:35:23','2006-02-15 22:15:20'),(7595,280,2,8695,'6.99','2005-07-29 16:44:55','2006-02-15 22:15:21'),(7596,280,2,8744,'3.99','2005-07-29 18:58:24','2006-02-15 22:15:21'),(7597,280,1,8912,'0.99','2005-07-30 01:31:25','2006-02-15 22:15:21'),(7598,280,2,9103,'0.99','2005-07-30 08:49:26','2006-02-15 22:15:21'),(7599,280,1,10847,'9.99','2005-08-01 23:49:33','2006-02-15 22:15:21'),(7600,280,1,11366,'4.99','2005-08-02 18:01:25','2006-02-15 22:15:21'),(7601,280,1,11517,'2.99','2005-08-16 23:56:28','2006-02-15 22:15:21'),(7602,280,1,12053,'4.99','2005-08-17 20:57:27','2006-02-15 22:15:21'),(7603,280,1,12849,'5.99','2005-08-19 02:05:37','2006-02-15 22:15:21'),(7604,280,2,13231,'9.99','2005-08-19 16:12:49','2006-02-15 22:15:21'),(7605,280,1,13321,'4.99','2005-08-19 19:40:37','2006-02-15 22:15:21'),(7606,280,1,13667,'4.99','2005-08-20 08:25:34','2006-02-15 22:15:21'),(7607,280,2,15036,'2.99','2005-08-22 09:36:00','2006-02-15 22:15:21'),(7608,280,1,15312,'4.99','2005-08-22 19:58:15','2006-02-15 22:15:21'),(7609,280,2,15554,'5.99','2005-08-23 04:48:12','2006-02-15 22:15:21'),(7610,280,2,15950,'5.99','2005-08-23 19:09:39','2006-02-15 22:15:22'),(7611,281,2,650,'2.99','2005-05-28 19:45:40','2006-02-15 22:15:22'),(7612,281,2,754,'2.99','2005-05-29 10:18:59','2006-02-15 22:15:22'),(7613,281,2,1485,'5.99','2005-06-15 21:24:10','2006-02-15 22:15:22'),(7614,281,1,2254,'5.99','2005-06-18 05:15:14','2006-02-15 22:15:22'),(7615,281,1,4607,'0.99','2005-07-08 07:15:14','2006-02-15 22:15:22'),(7616,281,2,4864,'6.99','2005-07-08 19:05:34','2006-02-15 22:15:22'),(7617,281,2,5410,'5.99','2005-07-09 20:21:10','2006-02-15 22:15:22'),(7618,281,2,6825,'0.99','2005-07-12 18:28:12','2006-02-15 22:15:22'),(7619,281,2,7034,'2.99','2005-07-27 03:03:37','2006-02-15 22:15:22'),(7620,281,1,7525,'3.99','2005-07-27 21:13:28','2006-02-15 22:15:22'),(7621,281,2,8131,'0.99','2005-07-28 19:55:21','2006-02-15 22:15:22'),(7622,281,2,8180,'4.99','2005-07-28 22:05:24','2006-02-15 22:15:22'),(7623,281,1,13641,'2.99','2005-08-20 07:34:42','2006-02-15 22:15:22'),(7624,281,1,14196,'1.99','2005-08-21 03:40:40','2006-02-15 22:15:22'),(7625,282,2,48,'1.99','2005-05-25 06:20:46','2006-02-15 22:15:22'),(7626,282,2,282,'6.99','2005-05-26 18:56:26','2006-02-15 22:15:22'),(7627,282,2,564,'0.99','2005-05-28 09:12:09','2006-02-15 22:15:22'),(7628,282,1,2016,'2.99','2005-06-17 12:18:36','2006-02-15 22:15:22'),(7629,282,2,2176,'2.99','2005-06-18 00:29:51','2006-02-15 22:15:22'),(7630,282,2,3408,'4.99','2005-06-21 16:15:11','2006-02-15 22:15:22'),(7631,282,1,3417,'2.99','2005-06-21 17:06:20','2006-02-15 22:15:22'),(7632,282,2,3675,'2.99','2005-07-06 09:09:19','2006-02-15 22:15:22'),(7633,282,1,3885,'2.99','2005-07-06 18:43:43','2006-02-15 22:15:22'),(7634,282,1,4359,'2.99','2005-07-07 19:30:20','2006-02-15 22:15:22'),(7635,282,2,4412,'4.99','2005-07-07 21:56:53','2006-02-15 22:15:22'),(7636,282,1,5113,'0.99','2005-07-09 07:06:18','2006-02-15 22:15:23'),(7637,282,2,5319,'8.99','2005-07-09 16:17:44','2006-02-15 22:15:23'),(7638,282,1,5926,'6.99','2005-07-10 21:53:42','2006-02-15 22:15:23'),(7639,282,1,7433,'2.99','2005-07-27 17:32:20','2006-02-15 22:15:23'),(7640,282,2,7534,'3.99','2005-07-27 21:26:17','2006-02-15 22:15:23'),(7641,282,1,8223,'6.99','2005-07-28 23:56:01','2006-02-15 22:15:23'),(7642,282,2,8270,'4.99','2005-07-29 01:27:22','2006-02-15 22:15:23'),(7643,282,2,8468,'1.99','2005-07-29 08:26:04','2006-02-15 22:15:23'),(7644,282,2,8743,'0.99','2005-07-29 18:57:01','2006-02-15 22:15:23'),(7645,282,2,8973,'1.99','2005-07-30 04:09:13','2006-02-15 22:15:23'),(7646,282,2,9658,'9.99','2005-07-31 06:00:52','2006-02-15 22:15:23'),(7647,282,2,11226,'2.99','2005-08-02 12:47:30','2006-02-15 22:15:23'),(7648,282,1,13278,'2.99','2005-08-19 17:57:53','2006-02-15 22:15:23'),(7649,282,2,13749,'2.99','2005-08-20 11:00:37','2006-02-15 22:15:23'),(7650,282,2,15543,'4.99','2005-08-23 04:15:41','2006-02-15 22:15:23'),(7651,282,2,15430,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:23'),(7652,283,1,1749,'0.99','2005-06-16 16:56:00','2006-02-15 22:15:23'),(7653,283,2,1796,'2.99','2005-06-16 20:10:43','2006-02-15 22:15:23'),(7654,283,2,2333,'2.99','2005-06-18 10:55:54','2006-02-15 22:15:23'),(7655,283,1,2685,'2.99','2005-06-19 12:35:21','2006-02-15 22:15:23'),(7656,283,2,2849,'7.99','2005-06-19 23:06:00','2006-02-15 22:15:23'),(7657,283,1,3534,'4.99','2005-07-06 01:32:27','2006-02-15 22:15:23'),(7658,283,1,3568,'6.99','2005-07-06 03:11:57','2006-02-15 22:15:23'),(7659,283,2,3590,'4.99','2005-07-06 04:35:12','2006-02-15 22:15:23'),(7660,283,2,3672,'0.99','2005-07-06 09:01:56','2006-02-15 22:15:23'),(7661,283,2,4683,'2.99','2005-07-08 10:38:28','2006-02-15 22:15:23'),(7662,283,2,4876,'1.99','2005-07-08 19:27:50','2006-02-15 22:15:24'),(7663,283,2,5989,'2.99','2005-07-11 00:57:53','2006-02-15 22:15:24'),(7664,283,1,6075,'0.99','2005-07-11 05:03:03','2006-02-15 22:15:24'),(7665,283,1,6300,'1.99','2005-07-11 17:50:09','2006-02-15 22:15:24'),(7666,283,2,6313,'0.99','2005-07-11 18:29:52','2006-02-15 22:15:24'),(7667,283,1,6827,'4.99','2005-07-12 18:33:45','2006-02-15 22:15:24'),(7668,283,1,7504,'0.99','2005-07-27 20:24:31','2006-02-15 22:15:24'),(7669,283,1,7816,'0.99','2005-07-28 08:14:12','2006-02-15 22:15:24'),(7670,283,2,9353,'4.99','2005-07-30 18:30:37','2006-02-15 22:15:24'),(7671,283,2,9478,'2.99','2005-07-30 23:12:53','2006-02-15 22:15:24'),(7672,283,2,9572,'2.99','2005-07-31 02:44:10','2006-02-15 22:15:24'),(7673,283,2,9918,'2.99','2005-07-31 14:55:22','2006-02-15 22:15:24'),(7674,283,1,11637,'0.99','2005-08-17 04:36:39','2006-02-15 22:15:24'),(7675,283,2,11846,'2.99','2005-08-17 13:18:29','2006-02-15 22:15:24'),(7676,283,2,11966,'0.99','2005-08-17 17:40:04','2006-02-15 22:15:24'),(7677,283,1,12290,'6.99','2005-08-18 05:08:03','2006-02-15 22:15:24'),(7678,283,1,13229,'2.99','2005-08-19 16:08:33','2006-02-15 22:15:24'),(7679,283,1,15837,'2.99','2005-08-23 15:29:41','2006-02-15 22:15:24'),(7680,284,2,423,'0.99','2005-05-27 15:32:57','2006-02-15 22:15:24'),(7681,284,2,791,'0.99','2005-05-29 16:30:42','2006-02-15 22:15:24'),(7682,284,1,1145,'6.99','2005-05-31 20:13:45','2006-02-15 22:15:24'),(7683,284,1,1171,'0.99','2005-06-14 23:50:11','2006-02-15 22:15:24'),(7684,284,2,2813,'6.99','2005-06-19 20:01:47','2006-02-15 22:15:24'),(7685,284,2,3296,'0.99','2005-06-21 07:04:53','2006-02-15 22:15:24'),(7686,284,1,3572,'0.99','2005-07-06 03:33:23','2006-02-15 22:15:24'),(7687,284,2,4081,'2.99','2005-07-07 05:10:08','2006-02-15 22:15:24'),(7688,284,1,4759,'7.99','2005-07-08 14:39:22','2006-02-15 22:15:24'),(7689,284,2,4931,'7.99','2005-07-08 22:16:18','2006-02-15 22:15:25'),(7690,284,1,5161,'6.99','2005-07-09 08:57:56','2006-02-15 22:15:25'),(7691,284,1,6276,'5.99','2005-07-11 16:15:50','2006-02-15 22:15:25'),(7692,284,2,6982,'2.99','2005-07-27 00:53:41','2006-02-15 22:15:25'),(7693,284,1,7164,'6.99','2005-07-27 07:36:34','2006-02-15 22:15:25'),(7694,284,1,7463,'4.99','2005-07-27 18:48:32','2006-02-15 22:15:25'),(7695,284,2,7716,'8.99','2005-07-28 04:33:15','2006-02-15 22:15:25'),(7696,284,1,8888,'2.99','2005-07-30 00:39:36','2006-02-15 22:15:25'),(7697,284,1,9790,'0.99','2005-07-31 10:34:08','2006-02-15 22:15:25'),(7698,284,1,10396,'7.99','2005-08-01 07:08:46','2006-02-15 22:15:25'),(7699,284,1,10535,'4.99','2005-08-01 12:21:13','2006-02-15 22:15:25'),(7700,284,2,12162,'3.99','2005-08-18 00:44:30','2006-02-15 22:15:25'),(7701,284,1,14007,'5.99','2005-08-20 20:22:47','2006-02-15 22:15:25'),(7702,284,1,14648,'4.99','2005-08-21 19:18:01','2006-02-15 22:15:25'),(7703,284,2,14746,'4.99','2005-08-21 22:54:02','2006-02-15 22:15:25'),(7704,284,1,14921,'4.99','2005-08-22 05:12:24','2006-02-15 22:15:25'),(7705,284,2,15135,'3.99','2005-08-22 13:19:19','2006-02-15 22:15:25'),(7706,284,1,12064,'5.98','2006-02-14 15:16:03','2006-02-15 22:15:25'),(7707,284,2,12959,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:25'),(7708,285,2,1161,'7.99','2005-06-14 23:07:08','2006-02-15 22:15:25'),(7709,285,2,1302,'3.99','2005-06-15 09:48:37','2006-02-15 22:15:25'),(7710,285,1,2249,'5.99','2005-06-18 05:03:08','2006-02-15 22:15:25'),(7711,285,2,4007,'6.99','2005-07-07 00:26:05','2006-02-15 22:15:25'),(7712,285,2,5112,'2.99','2005-07-09 07:04:04','2006-02-15 22:15:25'),(7713,285,1,5683,'9.99','2005-07-10 08:52:13','2006-02-15 22:15:25'),(7714,285,1,6010,'0.99','2005-07-11 01:52:28','2006-02-15 22:15:25'),(7715,285,2,6083,'3.99','2005-07-11 05:12:49','2006-02-15 22:15:26'),(7716,285,1,6094,'4.99','2005-07-11 05:54:42','2006-02-15 22:15:26'),(7717,285,2,6333,'4.99','2005-07-11 19:20:16','2006-02-15 22:15:26'),(7718,285,2,6644,'0.99','2005-07-12 10:39:39','2006-02-15 22:15:26'),(7719,285,1,7211,'6.99','2005-07-27 09:20:00','2006-02-15 22:15:26'),(7720,285,1,7452,'9.99','2005-07-27 18:26:39','2006-02-15 22:15:26'),(7721,285,1,7745,'9.99','2005-07-28 05:46:28','2006-02-15 22:15:26'),(7722,285,1,8154,'4.99','2005-07-28 20:56:18','2006-02-15 22:15:26'),(7723,285,2,8466,'0.99','2005-07-29 08:24:47','2006-02-15 22:15:26'),(7724,285,1,10493,'5.99','2005-08-01 10:43:12','2006-02-15 22:15:26'),(7725,285,2,10628,'2.99','2005-08-01 15:33:19','2006-02-15 22:15:26'),(7726,285,1,10641,'4.99','2005-08-01 15:44:57','2006-02-15 22:15:26'),(7727,285,1,12027,'8.99','2005-08-17 20:01:12','2006-02-15 22:15:26'),(7728,285,1,12444,'0.99','2005-08-18 10:53:12','2006-02-15 22:15:26'),(7729,285,1,12449,'0.99','2005-08-18 11:03:04','2006-02-15 22:15:26'),(7730,285,2,12687,'9.99','2005-08-18 19:57:39','2006-02-15 22:15:26'),(7731,285,2,13102,'7.99','2005-08-19 11:02:03','2006-02-15 22:15:26'),(7732,285,2,15251,'0.99','2005-08-22 18:03:57','2006-02-15 22:15:26'),(7733,285,1,15489,'4.99','2005-08-23 02:06:41','2006-02-15 22:15:26'),(7734,286,2,81,'6.99','2005-05-25 12:15:19','2006-02-15 22:15:26'),(7735,286,1,1690,'8.99','2005-06-16 12:24:18','2006-02-15 22:15:26'),(7736,286,1,2195,'4.99','2005-06-18 01:44:46','2006-02-15 22:15:26'),(7737,286,2,3592,'4.99','2005-07-06 04:38:50','2006-02-15 22:15:26'),(7738,286,2,3692,'3.99','2005-07-06 09:54:12','2006-02-15 22:15:26'),(7739,286,2,4242,'6.99','2005-07-07 13:39:01','2006-02-15 22:15:26'),(7740,286,2,4461,'9.99','2005-07-07 23:59:43','2006-02-15 22:15:26'),(7741,286,1,4707,'4.99','2005-07-08 11:57:28','2006-02-15 22:15:26'),(7742,286,1,4894,'2.99','2005-07-08 20:21:31','2006-02-15 22:15:27'),(7743,286,1,5796,'4.99','2005-07-10 14:42:54','2006-02-15 22:15:27'),(7744,286,2,6611,'2.99','2005-07-12 08:20:23','2006-02-15 22:15:27'),(7745,286,1,7254,'2.99','2005-07-27 10:48:50','2006-02-15 22:15:27'),(7746,286,1,7299,'2.99','2005-07-27 12:49:56','2006-02-15 22:15:27'),(7747,286,1,7368,'0.99','2005-07-27 15:06:05','2006-02-15 22:15:27'),(7748,286,1,7422,'2.99','2005-07-27 17:10:42','2006-02-15 22:15:27'),(7749,286,1,7719,'6.99','2005-07-28 04:39:09','2006-02-15 22:15:27'),(7750,286,2,8399,'0.99','2005-07-29 06:20:18','2006-02-15 22:15:27'),(7751,286,2,9280,'6.99','2005-07-30 15:15:38','2006-02-15 22:15:27'),(7752,286,1,9809,'3.99','2005-07-31 11:19:21','2006-02-15 22:15:27'),(7753,286,2,10105,'5.99','2005-07-31 20:54:20','2006-02-15 22:15:27'),(7754,286,2,11670,'0.99','2005-08-17 05:48:59','2006-02-15 22:15:27'),(7755,286,2,12595,'0.99','2005-08-18 16:27:08','2006-02-15 22:15:27'),(7756,286,1,12656,'0.99','2005-08-18 18:58:35','2006-02-15 22:15:27'),(7757,286,2,13635,'5.99','2005-08-20 07:17:35','2006-02-15 22:15:27'),(7758,286,1,13975,'4.99','2005-08-20 18:58:23','2006-02-15 22:15:27'),(7759,286,1,14905,'0.99','2005-08-22 04:34:22','2006-02-15 22:15:27'),(7760,286,2,15629,'4.99','2005-08-23 07:28:22','2006-02-15 22:15:27'),(7761,287,2,498,'0.99','2005-05-28 01:01:21','2006-02-15 22:15:27'),(7762,287,1,655,'2.99','2005-05-28 20:16:20','2006-02-15 22:15:27'),(7763,287,2,964,'2.99','2005-05-30 18:53:21','2006-02-15 22:15:27'),(7764,287,1,1247,'7.99','2005-06-15 05:16:40','2006-02-15 22:15:27'),(7765,287,2,1642,'2.99','2005-06-16 08:54:15','2006-02-15 22:15:27'),(7766,287,2,2286,'9.99','2005-06-18 07:02:32','2006-02-15 22:15:27'),(7767,287,2,2612,'6.99','2005-06-19 07:19:41','2006-02-15 22:15:27'),(7768,287,2,4877,'4.99','2005-07-08 19:31:02','2006-02-15 22:15:28'),(7769,287,2,5346,'1.99','2005-07-09 17:29:01','2006-02-15 22:15:28'),(7770,287,1,5593,'3.99','2005-07-10 04:33:13','2006-02-15 22:15:28'),(7771,287,2,5761,'0.99','2005-07-10 12:45:36','2006-02-15 22:15:28'),(7772,287,2,6379,'3.99','2005-07-11 21:51:25','2006-02-15 22:15:28'),(7773,287,1,6397,'2.99','2005-07-11 22:34:02','2006-02-15 22:15:28'),(7774,287,2,7402,'2.99','2005-07-27 16:19:40','2006-02-15 22:15:28'),(7775,287,2,7777,'2.99','2005-07-28 07:04:42','2006-02-15 22:15:28'),(7776,287,2,8994,'6.99','2005-07-30 04:51:32','2006-02-15 22:15:28'),(7777,287,2,9716,'1.99','2005-07-31 08:23:53','2006-02-15 22:15:28'),(7778,287,1,10027,'6.99','2005-07-31 18:33:51','2006-02-15 22:15:28'),(7779,287,2,10574,'2.99','2005-08-01 13:36:51','2006-02-15 22:15:28'),(7780,287,2,10807,'4.99','2005-08-01 22:26:10','2006-02-15 22:15:28'),(7781,287,2,11106,'4.99','2005-08-02 08:17:38','2006-02-15 22:15:28'),(7782,287,1,11716,'4.99','2005-08-17 07:40:55','2006-02-15 22:15:28'),(7783,287,2,12861,'2.99','2005-08-19 02:30:24','2006-02-15 22:15:28'),(7784,287,2,14715,'6.99','2005-08-21 21:28:18','2006-02-15 22:15:28'),(7785,287,2,15076,'1.99','2005-08-22 11:05:34','2006-02-15 22:15:28'),(7786,287,1,15084,'4.99','2005-08-22 11:17:59','2006-02-15 22:15:28'),(7787,287,2,15127,'0.99','2005-08-22 12:56:29','2006-02-15 22:15:28'),(7788,287,1,15614,'2.99','2005-08-23 07:05:15','2006-02-15 22:15:28'),(7789,287,2,14204,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:28'),(7790,288,2,93,'3.99','2005-05-25 15:54:16','2006-02-15 22:15:28'),(7791,288,2,427,'6.99','2005-05-27 16:10:04','2006-02-15 22:15:28'),(7792,288,1,503,'4.99','2005-05-28 01:35:25','2006-02-15 22:15:28'),(7793,288,2,565,'5.99','2005-05-28 09:26:31','2006-02-15 22:15:28'),(7794,288,1,1466,'5.99','2005-06-15 20:46:04','2006-02-15 22:15:29'),(7795,288,1,3958,'3.99','2005-07-06 22:07:33','2006-02-15 22:15:29'),(7796,288,1,4692,'2.99','2005-07-08 11:07:06','2006-02-15 22:15:29'),(7797,288,2,4758,'0.99','2005-07-08 14:38:02','2006-02-15 22:15:29'),(7798,288,1,6399,'2.99','2005-07-11 22:39:05','2006-02-15 22:15:29'),(7799,288,2,6518,'3.99','2005-07-12 03:59:42','2006-02-15 22:15:29'),(7800,288,2,7744,'0.99','2005-07-28 05:38:20','2006-02-15 22:15:29'),(7801,288,2,7855,'2.99','2005-07-28 09:43:02','2006-02-15 22:15:29'),(7802,288,2,9429,'2.99','2005-07-30 21:19:26','2006-02-15 22:15:29'),(7803,288,1,9732,'0.99','2005-07-31 08:56:08','2006-02-15 22:15:29'),(7804,288,1,10927,'9.99','2005-08-02 02:31:15','2006-02-15 22:15:29'),(7805,288,2,11952,'2.99','2005-08-17 17:14:57','2006-02-15 22:15:29'),(7806,288,1,12134,'1.99','2005-08-17 23:49:43','2006-02-15 22:15:29'),(7807,288,1,13219,'2.99','2005-08-19 15:40:28','2006-02-15 22:15:29'),(7808,288,1,13227,'0.99','2005-08-19 16:05:38','2006-02-15 22:15:29'),(7809,288,2,13363,'2.99','2005-08-19 21:07:59','2006-02-15 22:15:29'),(7810,288,2,14113,'0.99','2005-08-21 01:03:30','2006-02-15 22:15:29'),(7811,288,2,14756,'0.99','2005-08-21 23:21:23','2006-02-15 22:15:29'),(7812,288,2,15058,'2.99','2005-08-22 10:20:55','2006-02-15 22:15:29'),(7813,288,1,15119,'2.99','2005-08-22 12:41:33','2006-02-15 22:15:29'),(7814,289,2,1880,'4.99','2005-06-17 03:08:59','2006-02-15 22:15:29'),(7815,289,2,2316,'0.99','2005-06-18 09:04:59','2006-02-15 22:15:29'),(7816,289,1,2387,'6.99','2005-06-18 15:24:19','2006-02-15 22:15:29'),(7817,289,1,2784,'10.99','2005-06-19 18:40:29','2006-02-15 22:15:29'),(7818,289,2,2948,'6.99','2005-06-20 06:02:35','2006-02-15 22:15:29'),(7819,289,2,3123,'6.99','2005-06-20 18:26:14','2006-02-15 22:15:29'),(7820,289,1,3588,'2.99','2005-07-06 04:29:13','2006-02-15 22:15:30'),(7821,289,2,4622,'0.99','2005-07-08 08:02:42','2006-02-15 22:15:30'),(7822,289,1,5089,'4.99','2005-07-09 05:45:40','2006-02-15 22:15:30'),(7823,289,2,5342,'8.99','2005-07-09 17:20:03','2006-02-15 22:15:30'),(7824,289,2,5584,'4.99','2005-07-10 04:15:25','2006-02-15 22:15:30'),(7825,289,2,5724,'0.99','2005-07-10 11:18:12','2006-02-15 22:15:30'),(7826,289,2,6007,'3.99','2005-07-11 01:43:06','2006-02-15 22:15:30'),(7827,289,2,6536,'7.99','2005-07-12 04:44:25','2006-02-15 22:15:30'),(7828,289,1,7151,'4.99','2005-07-27 07:14:31','2006-02-15 22:15:30'),(7829,289,1,7162,'4.99','2005-07-27 07:32:45','2006-02-15 22:15:30'),(7830,289,2,7325,'0.99','2005-07-27 13:46:55','2006-02-15 22:15:30'),(7831,289,1,9498,'2.99','2005-07-30 23:56:55','2006-02-15 22:15:30'),(7832,289,2,10297,'7.99','2005-08-01 04:05:04','2006-02-15 22:15:30'),(7833,289,1,12158,'1.99','2005-08-18 00:34:20','2006-02-15 22:15:30'),(7834,289,1,12170,'0.99','2005-08-18 01:06:10','2006-02-15 22:15:30'),(7835,289,2,12558,'7.99','2005-08-18 14:52:35','2006-02-15 22:15:30'),(7836,289,2,13165,'0.99','2005-08-19 13:34:10','2006-02-15 22:15:30'),(7837,289,2,13211,'0.99','2005-08-19 15:23:41','2006-02-15 22:15:30'),(7838,289,2,13256,'9.99','2005-08-19 16:54:12','2006-02-15 22:15:30'),(7839,289,2,13336,'5.99','2005-08-19 20:03:22','2006-02-15 22:15:30'),(7840,289,2,13891,'6.99','2005-08-20 15:42:05','2006-02-15 22:15:30'),(7841,289,1,14087,'0.99','2005-08-20 23:53:40','2006-02-15 22:15:30'),(7842,289,2,14729,'4.99','2005-08-21 22:16:57','2006-02-15 22:15:30'),(7843,289,2,14917,'4.99','2005-08-22 05:03:59','2006-02-15 22:15:30'),(7844,290,1,160,'2.99','2005-05-26 01:46:20','2006-02-15 22:15:30'),(7845,290,1,1220,'6.99','2005-06-15 03:26:15','2006-02-15 22:15:30'),(7846,290,2,1336,'8.99','2005-06-15 12:01:34','2006-02-15 22:15:31'),(7847,290,2,1496,'4.99','2005-06-15 21:55:58','2006-02-15 22:15:31'),(7848,290,2,1532,'0.99','2005-06-16 00:41:31','2006-02-15 22:15:31'),(7849,290,1,3013,'3.99','2005-06-20 10:45:09','2006-02-15 22:15:31'),(7850,290,2,4039,'4.99','2005-07-07 02:57:59','2006-02-15 22:15:31'),(7851,290,1,4073,'0.99','2005-07-07 04:49:13','2006-02-15 22:15:31'),(7852,290,2,4416,'0.99','2005-07-07 22:04:36','2006-02-15 22:15:31'),(7853,290,1,5105,'2.99','2005-07-09 06:38:59','2006-02-15 22:15:31'),(7854,290,2,5214,'5.99','2005-07-09 11:43:08','2006-02-15 22:15:31'),(7855,290,2,5827,'2.99','2005-07-10 16:22:20','2006-02-15 22:15:31'),(7856,290,2,6816,'4.99','2005-07-12 18:18:50','2006-02-15 22:15:31'),(7857,290,1,6952,'4.99','2005-07-26 23:51:27','2006-02-15 22:15:31'),(7858,290,2,7265,'2.99','2005-07-27 11:19:01','2006-02-15 22:15:31'),(7859,290,1,7650,'1.99','2005-07-28 01:47:20','2006-02-15 22:15:31'),(7860,290,1,8639,'4.99','2005-07-29 14:30:31','2006-02-15 22:15:31'),(7861,290,1,9000,'7.99','2005-07-30 04:58:55','2006-02-15 22:15:31'),(7862,290,1,9413,'0.99','2005-07-30 20:44:39','2006-02-15 22:15:31'),(7863,290,2,10096,'3.99','2005-07-31 20:38:58','2006-02-15 22:15:31'),(7864,290,1,10194,'1.99','2005-08-01 00:33:52','2006-02-15 22:15:31'),(7865,290,1,10901,'2.99','2005-08-02 01:35:44','2006-02-15 22:15:31'),(7866,290,1,11596,'6.99','2005-08-17 02:53:55','2006-02-15 22:15:31'),(7867,290,2,12193,'3.99','2005-08-18 02:03:59','2006-02-15 22:15:31'),(7868,290,2,12778,'4.99','2005-08-18 23:40:23','2006-02-15 22:15:31'),(7869,290,2,13190,'1.99','2005-08-19 14:27:59','2006-02-15 22:15:31'),(7870,290,1,13367,'2.99','2005-08-19 21:19:27','2006-02-15 22:15:31'),(7871,290,2,13687,'2.99','2005-08-20 08:57:51','2006-02-15 22:15:31'),(7872,291,1,54,'4.99','2005-05-25 07:23:25','2006-02-15 22:15:32'),(7873,291,2,747,'4.99','2005-05-29 09:26:34','2006-02-15 22:15:32'),(7874,291,1,1012,'2.99','2005-05-31 02:18:05','2006-02-15 22:15:32'),(7875,291,1,1191,'2.99','2005-06-15 01:10:35','2006-02-15 22:15:32'),(7876,291,1,2300,'2.99','2005-06-18 08:22:34','2006-02-15 22:15:32'),(7877,291,2,3042,'2.99','2005-06-20 12:38:27','2006-02-15 22:15:32'),(7878,291,2,3512,'4.99','2005-07-06 00:43:06','2006-02-15 22:15:32'),(7879,291,2,4862,'3.99','2005-07-08 19:02:46','2006-02-15 22:15:32'),(7880,291,2,5754,'2.99','2005-07-10 12:32:43','2006-02-15 22:15:32'),(7881,291,2,6516,'4.99','2005-07-12 03:51:54','2006-02-15 22:15:32'),(7882,291,1,6796,'2.99','2005-07-12 16:44:16','2006-02-15 22:15:32'),(7883,291,1,7561,'5.99','2005-07-27 22:21:05','2006-02-15 22:15:32'),(7884,291,2,7564,'0.99','2005-07-27 22:31:17','2006-02-15 22:15:32'),(7885,291,1,8690,'0.99','2005-07-29 16:39:28','2006-02-15 22:15:32'),(7886,291,2,8697,'4.99','2005-07-29 16:46:07','2006-02-15 22:15:32'),(7887,291,1,9165,'5.99','2005-07-30 11:24:28','2006-02-15 22:15:32'),(7888,291,2,9201,'5.99','2005-07-30 12:42:21','2006-02-15 22:15:32'),(7889,291,2,9919,'7.99','2005-07-31 14:55:46','2006-02-15 22:15:32'),(7890,291,1,10463,'4.99','2005-08-01 09:39:43','2006-02-15 22:15:32'),(7891,291,2,11145,'0.99','2005-08-02 09:43:24','2006-02-15 22:15:32'),(7892,291,1,13665,'5.99','2005-08-20 08:19:20','2006-02-15 22:15:32'),(7893,291,2,14241,'4.99','2005-08-21 05:24:55','2006-02-15 22:15:32'),(7894,291,2,15663,'3.99','2005-08-23 08:54:26','2006-02-15 22:15:32'),(7895,292,1,324,'0.99','2005-05-27 01:00:04','2006-02-15 22:15:32'),(7896,292,1,1901,'3.99','2005-06-17 04:35:19','2006-02-15 22:15:32'),(7897,292,2,2258,'3.99','2005-06-18 05:30:36','2006-02-15 22:15:32'),(7898,292,1,2838,'3.99','2005-06-19 22:06:06','2006-02-15 22:15:33'),(7899,292,2,3328,'2.99','2005-06-21 09:08:44','2006-02-15 22:15:33'),(7900,292,2,3557,'0.99','2005-07-06 02:48:39','2006-02-15 22:15:33'),(7901,292,1,4200,'4.99','2005-07-07 11:15:11','2006-02-15 22:15:33'),(7902,292,2,5095,'4.99','2005-07-09 06:08:22','2006-02-15 22:15:33'),(7903,292,2,5257,'0.99','2005-07-09 13:56:43','2006-02-15 22:15:33'),(7904,292,1,5940,'4.99','2005-07-10 22:31:01','2006-02-15 22:15:33'),(7905,292,1,6270,'8.99','2005-07-11 15:59:10','2006-02-15 22:15:33'),(7906,292,1,6900,'6.99','2005-07-12 21:45:25','2006-02-15 22:15:33'),(7907,292,2,7199,'5.99','2005-07-27 08:53:23','2006-02-15 22:15:33'),(7908,292,1,7216,'2.99','2005-07-27 09:27:45','2006-02-15 22:15:33'),(7909,292,1,7545,'2.99','2005-07-27 21:48:03','2006-02-15 22:15:33'),(7910,292,1,7766,'4.99','2005-07-28 06:41:57','2006-02-15 22:15:33'),(7911,292,1,8047,'2.99','2005-07-28 16:49:43','2006-02-15 22:15:33'),(7912,292,2,8842,'4.99','2005-07-29 23:03:40','2006-02-15 22:15:33'),(7913,292,1,8990,'8.99','2005-07-30 04:41:42','2006-02-15 22:15:33'),(7914,292,1,9792,'5.99','2005-07-31 10:43:41','2006-02-15 22:15:33'),(7915,292,2,9819,'1.99','2005-07-31 11:39:13','2006-02-15 22:15:33'),(7916,292,1,11193,'4.99','2005-08-02 11:31:33','2006-02-15 22:15:33'),(7917,292,1,12739,'10.99','2005-08-18 22:15:18','2006-02-15 22:15:33'),(7918,292,1,13715,'2.99','2005-08-20 09:43:06','2006-02-15 22:15:33'),(7919,292,1,14499,'0.99','2005-08-21 14:11:19','2006-02-15 22:15:33'),(7920,292,2,14845,'4.99','2005-08-22 02:12:44','2006-02-15 22:15:33'),(7921,292,1,15117,'2.99','2005-08-22 12:38:20','2006-02-15 22:15:33'),(7922,293,2,445,'0.99','2005-05-27 18:42:57','2006-02-15 22:15:33'),(7923,293,1,924,'4.99','2005-05-30 12:10:59','2006-02-15 22:15:33'),(7924,293,2,1034,'8.99','2005-05-31 04:53:40','2006-02-15 22:15:34'),(7925,293,1,1589,'9.99','2005-06-16 04:58:03','2006-02-15 22:15:34'),(7926,293,1,1829,'5.99','2005-06-16 22:14:21','2006-02-15 22:15:34'),(7927,293,2,1860,'4.99','2005-06-17 01:17:12','2006-02-15 22:15:34'),(7928,293,1,2386,'4.99','2005-06-18 15:22:51','2006-02-15 22:15:34'),(7929,293,2,3025,'2.99','2005-06-20 11:46:48','2006-02-15 22:15:34'),(7930,293,1,3290,'1.99','2005-06-21 06:45:34','2006-02-15 22:15:34'),(7931,293,2,3452,'4.99','2005-06-21 21:11:27','2006-02-15 22:15:34'),(7932,293,1,3906,'3.99','2005-07-06 19:35:55','2006-02-15 22:15:34'),(7933,293,2,4343,'0.99','2005-07-07 18:48:54','2006-02-15 22:15:34'),(7934,293,2,4542,'4.99','2005-07-08 04:06:30','2006-02-15 22:15:34'),(7935,293,2,4944,'6.99','2005-07-08 22:44:28','2006-02-15 22:15:34'),(7936,293,2,5765,'3.99','2005-07-10 13:03:02','2006-02-15 22:15:34'),(7937,293,1,6432,'9.99','2005-07-12 00:09:41','2006-02-15 22:15:34'),(7938,293,2,7607,'4.99','2005-07-28 00:05:53','2006-02-15 22:15:34'),(7939,293,1,8589,'4.99','2005-07-29 12:28:17','2006-02-15 22:15:34'),(7940,293,1,8745,'2.99','2005-07-29 19:03:05','2006-02-15 22:15:34'),(7941,293,2,9123,'2.99','2005-07-30 09:39:15','2006-02-15 22:15:34'),(7942,293,2,11131,'1.99','2005-08-02 09:10:04','2006-02-15 22:15:34'),(7943,293,1,11576,'2.99','2005-08-17 01:53:20','2006-02-15 22:15:34'),(7944,293,2,13013,'6.99','2005-08-19 07:55:51','2006-02-15 22:15:34'),(7945,293,1,13029,'2.99','2005-08-19 08:28:04','2006-02-15 22:15:34'),(7946,293,2,13504,'5.99','2005-08-20 02:01:48','2006-02-15 22:15:34'),(7947,293,1,13817,'4.99','2005-08-20 13:15:30','2006-02-15 22:15:34'),(7948,293,1,14248,'6.99','2005-08-21 05:35:57','2006-02-15 22:15:34'),(7949,293,1,15258,'4.99','2005-08-22 18:22:44','2006-02-15 22:15:35'),(7950,293,1,15402,'8.99','2005-08-22 23:17:41','2006-02-15 22:15:35'),(7951,293,1,15508,'7.99','2005-08-23 02:49:04','2006-02-15 22:15:35'),(7952,293,2,15675,'5.99','2005-08-23 09:18:52','2006-02-15 22:15:35'),(7953,294,1,595,'1.99','2005-05-28 13:59:54','2006-02-15 22:15:35'),(7954,294,1,2900,'2.99','2005-06-20 02:40:04','2006-02-15 22:15:35'),(7955,294,2,3330,'2.99','2005-06-21 09:22:37','2006-02-15 22:15:35'),(7956,294,1,3681,'4.99','2005-07-06 09:19:30','2006-02-15 22:15:35'),(7957,294,2,4019,'4.99','2005-07-07 01:27:44','2006-02-15 22:15:35'),(7958,294,1,4786,'7.99','2005-07-08 16:13:05','2006-02-15 22:15:35'),(7959,294,2,6185,'5.99','2005-07-11 11:25:09','2006-02-15 22:15:35'),(7960,294,2,7415,'6.99','2005-07-27 16:50:59','2006-02-15 22:15:35'),(7961,294,1,7765,'4.99','2005-07-28 06:40:33','2006-02-15 22:15:35'),(7962,294,2,8843,'4.99','2005-07-29 23:04:25','2006-02-15 22:15:35'),(7963,294,2,9194,'2.99','2005-07-30 12:28:45','2006-02-15 22:15:35'),(7964,294,1,9522,'2.99','2005-07-31 00:55:11','2006-02-15 22:15:35'),(7965,294,2,9607,'0.99','2005-07-31 03:51:06','2006-02-15 22:15:35'),(7966,294,2,10186,'0.99','2005-08-01 00:12:36','2006-02-15 22:15:35'),(7967,294,2,10220,'4.99','2005-08-01 01:13:22','2006-02-15 22:15:35'),(7968,294,1,10551,'6.99','2005-08-01 12:48:55','2006-02-15 22:15:35'),(7969,294,2,10600,'2.99','2005-08-01 14:25:21','2006-02-15 22:15:35'),(7970,294,2,10642,'4.99','2005-08-01 15:45:11','2006-02-15 22:15:35'),(7971,294,2,11071,'2.99','2005-08-02 07:10:53','2006-02-15 22:15:35'),(7972,294,1,11390,'2.99','2005-08-02 18:39:16','2006-02-15 22:15:35'),(7973,294,2,11875,'4.99','2005-08-17 14:16:48','2006-02-15 22:15:35'),(7974,294,2,11981,'2.99','2005-08-17 18:10:40','2006-02-15 22:15:35'),(7975,294,1,12278,'5.99','2005-08-18 04:46:45','2006-02-15 22:15:36'),(7976,294,1,14474,'2.99','2005-08-21 13:22:48','2006-02-15 22:15:36'),(7977,294,2,14630,'7.99','2005-08-21 18:43:44','2006-02-15 22:15:36'),(7978,294,1,15839,'5.99','2005-08-23 15:34:46','2006-02-15 22:15:36'),(7979,295,2,371,'3.99','2005-05-27 08:08:18','2006-02-15 22:15:36'),(7980,295,1,1184,'5.99','2005-06-15 00:49:36','2006-02-15 22:15:36'),(7981,295,1,1328,'2.99','2005-06-15 11:23:27','2006-02-15 22:15:36'),(7982,295,2,1935,'2.99','2005-06-17 07:14:15','2006-02-15 22:15:36'),(7983,295,1,2054,'2.99','2005-06-17 15:26:37','2006-02-15 22:15:36'),(7984,295,1,2431,'1.99','2005-06-18 17:53:03','2006-02-15 22:15:36'),(7985,295,1,2638,'1.99','2005-06-19 09:23:30','2006-02-15 22:15:36'),(7986,295,1,2999,'2.99','2005-06-20 09:30:34','2006-02-15 22:15:36'),(7987,295,1,3198,'1.99','2005-06-21 00:08:54','2006-02-15 22:15:36'),(7988,295,2,3394,'8.99','2005-06-21 15:17:39','2006-02-15 22:15:36'),(7989,295,2,3496,'1.99','2005-07-05 23:59:15','2006-02-15 22:15:36'),(7990,295,1,3876,'9.99','2005-07-06 18:21:13','2006-02-15 22:15:36'),(7991,295,1,4164,'1.99','2005-07-07 09:20:11','2006-02-15 22:15:36'),(7992,295,1,4432,'1.99','2005-07-07 22:40:02','2006-02-15 22:15:36'),(7993,295,1,5019,'2.99','2005-07-09 02:04:32','2006-02-15 22:15:36'),(7994,295,2,5053,'4.99','2005-07-09 03:59:46','2006-02-15 22:15:36'),(7995,295,2,5283,'2.99','2005-07-09 15:07:17','2006-02-15 22:15:36'),(7996,295,2,5994,'4.99','2005-07-11 01:14:10','2006-02-15 22:15:36'),(7997,295,1,6252,'2.99','2005-07-11 15:06:29','2006-02-15 22:15:36'),(7998,295,2,6331,'3.99','2005-07-11 19:17:21','2006-02-15 22:15:36'),(7999,295,2,8087,'0.99','2005-07-28 18:21:16','2006-02-15 22:15:36'),(8000,295,1,8108,'7.99','2005-07-28 19:07:38','2006-02-15 22:15:36'),(8001,295,1,8840,'9.99','2005-07-29 22:55:38','2006-02-15 22:15:37'),(8002,295,2,8932,'2.99','2005-07-30 02:31:26','2006-02-15 22:15:37'),(8003,295,1,9425,'7.99','2005-07-30 21:11:21','2006-02-15 22:15:37'),(8004,295,2,9692,'8.99','2005-07-31 07:11:04','2006-02-15 22:15:37'),(8005,295,2,9793,'4.99','2005-07-31 10:45:11','2006-02-15 22:15:37'),(8006,295,2,10160,'4.99','2005-07-31 23:07:40','2006-02-15 22:15:37'),(8007,295,2,10222,'0.99','2005-08-01 01:17:42','2006-02-15 22:15:37'),(8008,295,1,10349,'3.99','2005-08-01 05:27:13','2006-02-15 22:15:37'),(8009,295,2,11083,'4.99','2005-08-02 07:32:01','2006-02-15 22:15:37'),(8010,295,2,11913,'5.99','2005-08-17 15:53:17','2006-02-15 22:15:37'),(8011,295,2,12041,'4.99','2005-08-17 20:34:33','2006-02-15 22:15:37'),(8012,295,1,12383,'0.99','2005-08-18 08:36:03','2006-02-15 22:15:37'),(8013,295,1,14264,'0.99','2005-08-21 06:18:22','2006-02-15 22:15:37'),(8014,295,1,14387,'6.99','2005-08-21 10:10:01','2006-02-15 22:15:37'),(8015,295,1,14514,'6.99','2005-08-21 14:51:52','2006-02-15 22:15:37'),(8016,295,2,15735,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:37'),(8017,296,2,162,'4.99','2005-05-26 02:02:05','2006-02-15 22:15:37'),(8018,296,1,511,'5.99','2005-05-28 03:04:04','2006-02-15 22:15:37'),(8019,296,1,869,'4.99','2005-05-30 04:22:06','2006-02-15 22:15:37'),(8020,296,2,956,'2.99','2005-05-30 17:30:28','2006-02-15 22:15:37'),(8021,296,2,1659,'4.99','2005-06-16 10:11:46','2006-02-15 22:15:37'),(8022,296,1,3034,'0.99','2005-06-20 12:15:50','2006-02-15 22:15:37'),(8023,296,2,3119,'0.99','2005-06-20 18:11:44','2006-02-15 22:15:37'),(8024,296,2,3486,'7.99','2005-07-05 23:29:55','2006-02-15 22:15:37'),(8025,296,1,3810,'2.99','2005-07-06 15:18:44','2006-02-15 22:15:37'),(8026,296,1,4480,'4.99','2005-07-08 00:56:30','2006-02-15 22:15:38'),(8027,296,2,5090,'0.99','2005-07-09 05:48:22','2006-02-15 22:15:38'),(8028,296,1,5589,'4.99','2005-07-10 04:22:58','2006-02-15 22:15:38'),(8029,296,2,6016,'4.99','2005-07-11 02:04:45','2006-02-15 22:15:38'),(8030,296,1,6398,'5.99','2005-07-11 22:34:49','2006-02-15 22:15:38'),(8031,296,1,6967,'6.99','2005-07-27 00:16:31','2006-02-15 22:15:38'),(8032,296,2,7568,'4.99','2005-07-27 22:38:53','2006-02-15 22:15:38'),(8033,296,2,8171,'0.99','2005-07-28 21:32:57','2006-02-15 22:15:38'),(8034,296,1,9249,'5.99','2005-07-30 14:15:02','2006-02-15 22:15:38'),(8035,296,1,9304,'2.99','2005-07-30 16:41:34','2006-02-15 22:15:38'),(8036,296,2,11571,'4.99','2005-08-17 01:37:51','2006-02-15 22:15:38'),(8037,296,2,11825,'4.99','2005-08-17 12:43:30','2006-02-15 22:15:38'),(8038,296,2,12689,'3.99','2005-08-18 20:06:34','2006-02-15 22:15:38'),(8039,296,2,13471,'2.99','2005-08-20 01:02:26','2006-02-15 22:15:38'),(8040,296,1,13702,'2.99','2005-08-20 09:27:20','2006-02-15 22:15:38'),(8041,296,1,13819,'4.99','2005-08-20 13:23:15','2006-02-15 22:15:38'),(8042,296,1,13991,'1.99','2005-08-20 19:29:44','2006-02-15 22:15:38'),(8043,296,2,14571,'7.99','2005-08-21 16:40:26','2006-02-15 22:15:38'),(8044,296,2,15023,'2.99','2005-08-22 08:56:48','2006-02-15 22:15:38'),(8045,296,2,15866,'7.99','2005-08-23 16:19:02','2006-02-15 22:15:38'),(8046,296,1,12009,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:38'),(8047,297,2,143,'0.99','2005-05-25 23:45:52','2006-02-15 22:15:38'),(8048,297,1,954,'3.99','2005-05-30 16:57:29','2006-02-15 22:15:38'),(8049,297,1,1409,'3.99','2005-06-15 16:58:12','2006-02-15 22:15:38'),(8050,297,1,2067,'2.99','2005-06-17 16:11:08','2006-02-15 22:15:38'),(8051,297,1,2202,'8.99','2005-06-18 02:09:24','2006-02-15 22:15:38'),(8052,297,1,2260,'2.99','2005-06-18 05:38:36','2006-02-15 22:15:39'),(8053,297,2,2339,'4.99','2005-06-18 11:29:22','2006-02-15 22:15:39'),(8054,297,1,3582,'0.99','2005-07-06 04:10:35','2006-02-15 22:15:39'),(8055,297,2,4621,'2.99','2005-07-08 08:02:18','2006-02-15 22:15:39'),(8056,297,1,4929,'5.99','2005-07-08 22:06:18','2006-02-15 22:15:39'),(8057,297,1,5743,'8.99','2005-07-10 11:57:38','2006-02-15 22:15:39'),(8058,297,2,6036,'2.99','2005-07-11 03:02:28','2006-02-15 22:15:39'),(8059,297,1,6064,'6.99','2005-07-11 04:23:18','2006-02-15 22:15:39'),(8060,297,1,6156,'4.99','2005-07-11 09:45:48','2006-02-15 22:15:39'),(8061,297,1,6984,'2.99','2005-07-27 00:56:30','2006-02-15 22:15:39'),(8062,297,2,7867,'0.99','2005-07-28 10:08:54','2006-02-15 22:15:39'),(8063,297,1,7933,'0.99','2005-07-28 12:27:27','2006-02-15 22:15:39'),(8064,297,2,9014,'2.99','2005-07-30 05:19:27','2006-02-15 22:15:39'),(8065,297,2,9674,'5.99','2005-07-31 06:36:53','2006-02-15 22:15:39'),(8066,297,1,10153,'0.99','2005-07-31 22:30:10','2006-02-15 22:15:39'),(8067,297,2,10264,'4.99','2005-08-01 03:03:12','2006-02-15 22:15:39'),(8068,297,2,11269,'0.99','2005-08-02 14:11:41','2006-02-15 22:15:39'),(8069,297,2,11413,'0.99','2005-08-02 19:35:19','2006-02-15 22:15:39'),(8070,297,2,11585,'4.99','2005-08-17 02:14:36','2006-02-15 22:15:39'),(8071,297,1,11780,'2.99','2005-08-17 10:34:24','2006-02-15 22:15:39'),(8072,297,1,11784,'0.99','2005-08-17 10:48:05','2006-02-15 22:15:39'),(8073,297,1,12472,'10.99','2005-08-18 11:58:48','2006-02-15 22:15:39'),(8074,297,1,13330,'2.99','2005-08-19 19:59:21','2006-02-15 22:15:39'),(8075,297,2,13721,'4.99','2005-08-20 10:02:59','2006-02-15 22:15:39'),(8076,297,1,13888,'1.99','2005-08-20 15:39:42','2006-02-15 22:15:39'),(8077,297,1,14403,'5.99','2005-08-21 10:40:34','2006-02-15 22:15:40'),(8078,297,2,15582,'2.99','2005-08-23 05:45:44','2006-02-15 22:15:40'),(8079,297,1,15711,'4.99','2005-08-23 10:43:00','2006-02-15 22:15:40'),(8080,298,1,383,'3.99','2005-05-27 10:12:20','2006-02-15 22:15:40'),(8081,298,2,1454,'4.99','2005-06-15 19:49:41','2006-02-15 22:15:40'),(8082,298,2,2385,'3.99','2005-06-18 15:22:40','2006-02-15 22:15:40'),(8083,298,2,3095,'4.99','2005-06-20 16:16:53','2006-02-15 22:15:40'),(8084,298,2,3400,'4.99','2005-06-21 15:50:30','2006-02-15 22:15:40'),(8085,298,2,3479,'0.99','2005-07-05 23:08:53','2006-02-15 22:15:40'),(8086,298,1,3728,'2.99','2005-07-06 11:29:00','2006-02-15 22:15:40'),(8087,298,2,4291,'2.99','2005-07-07 15:47:47','2006-02-15 22:15:40'),(8088,298,1,4936,'3.99','2005-07-08 22:24:50','2006-02-15 22:15:40'),(8089,298,2,5166,'2.99','2005-07-09 09:15:48','2006-02-15 22:15:40'),(8090,298,1,5247,'2.99','2005-07-09 13:26:28','2006-02-15 22:15:40'),(8091,298,2,6802,'0.99','2005-07-12 17:14:17','2006-02-15 22:15:40'),(8092,298,2,7802,'0.99','2005-07-28 07:51:57','2006-02-15 22:15:40'),(8093,298,1,7869,'7.99','2005-07-28 10:13:15','2006-02-15 22:15:40'),(8094,298,2,8737,'5.99','2005-07-29 18:32:13','2006-02-15 22:15:40'),(8095,298,2,10248,'6.99','2005-08-01 02:35:28','2006-02-15 22:15:40'),(8096,298,1,11070,'0.99','2005-08-02 07:10:39','2006-02-15 22:15:40'),(8097,298,2,11288,'6.99','2005-08-02 14:54:08','2006-02-15 22:15:40'),(8098,298,2,12076,'0.99','2005-08-17 21:58:19','2006-02-15 22:15:40'),(8099,298,1,12765,'8.99','2005-08-18 23:21:50','2006-02-15 22:15:40'),(8100,298,1,13172,'0.99','2005-08-19 13:49:07','2006-02-15 22:15:40'),(8101,298,1,13244,'4.99','2005-08-19 16:43:04','2006-02-15 22:15:40'),(8102,298,2,14473,'0.99','2005-08-21 13:19:03','2006-02-15 22:15:41'),(8103,298,1,15245,'3.99','2005-08-22 17:49:35','2006-02-15 22:15:41'),(8104,298,2,15262,'4.99','2005-08-22 18:25:21','2006-02-15 22:15:41'),(8105,298,1,15643,'4.99','2005-08-23 08:13:26','2006-02-15 22:15:41'),(8106,299,1,332,'5.99','2005-05-27 02:27:10','2006-02-15 22:15:41'),(8107,299,2,606,'8.99','2005-05-28 14:48:39','2006-02-15 22:15:41'),(8108,299,1,1650,'8.99','2005-06-16 09:23:20','2006-02-15 22:15:41'),(8109,299,2,2664,'4.99','2005-06-19 11:11:23','2006-02-15 22:15:41'),(8110,299,1,2774,'2.99','2005-06-19 18:05:11','2006-02-15 22:15:41'),(8111,299,2,2791,'4.99','2005-06-19 18:51:27','2006-02-15 22:15:41'),(8112,299,1,3074,'0.99','2005-06-20 14:41:41','2006-02-15 22:15:41'),(8113,299,2,3223,'2.99','2005-06-21 02:06:45','2006-02-15 22:15:41'),(8114,299,1,3288,'5.99','2005-06-21 06:36:59','2006-02-15 22:15:41'),(8115,299,2,3497,'0.99','2005-07-06 00:00:03','2006-02-15 22:15:41'),(8116,299,2,4153,'5.99','2005-07-07 08:53:08','2006-02-15 22:15:41'),(8117,299,1,4350,'2.99','2005-07-07 19:02:41','2006-02-15 22:15:41'),(8118,299,2,5033,'1.99','2005-07-09 02:42:01','2006-02-15 22:15:41'),(8119,299,1,5642,'2.99','2005-07-10 06:46:08','2006-02-15 22:15:41'),(8120,299,2,6732,'0.99','2005-07-12 13:58:51','2006-02-15 22:15:41'),(8121,299,1,6853,'7.99','2005-07-12 19:38:11','2006-02-15 22:15:41'),(8122,299,1,7264,'4.99','2005-07-27 11:18:58','2006-02-15 22:15:41'),(8123,299,1,7746,'2.99','2005-07-28 05:48:56','2006-02-15 22:15:41'),(8124,299,2,7862,'9.99','2005-07-28 10:02:25','2006-02-15 22:15:41'),(8125,299,1,9520,'2.99','2005-07-31 00:50:54','2006-02-15 22:15:41'),(8126,299,1,10201,'0.99','2005-08-01 00:42:18','2006-02-15 22:15:41'),(8127,299,2,10440,'2.99','2005-08-01 08:54:32','2006-02-15 22:15:41'),(8128,299,1,11629,'6.99','2005-08-17 04:27:24','2006-02-15 22:15:42'),(8129,299,1,11746,'5.99','2005-08-17 09:03:24','2006-02-15 22:15:42'),(8130,299,1,11998,'0.99','2005-08-17 18:46:21','2006-02-15 22:15:42'),(8131,299,1,13069,'4.99','2005-08-19 09:55:20','2006-02-15 22:15:42'),(8132,299,2,14208,'0.99','2005-08-21 04:09:18','2006-02-15 22:15:42'),(8133,299,1,14548,'3.99','2005-08-21 15:53:52','2006-02-15 22:15:42'),(8134,299,2,14889,'4.99','2005-08-22 04:10:10','2006-02-15 22:15:42'),(8135,299,2,14898,'6.99','2005-08-22 04:26:34','2006-02-15 22:15:42'),(8136,300,2,457,'0.99','2005-05-27 19:52:29','2006-02-15 22:15:42'),(8137,300,1,780,'3.99','2005-05-29 14:18:32','2006-02-15 22:15:42'),(8138,300,1,1111,'4.99','2005-05-31 15:24:19','2006-02-15 22:15:42'),(8139,300,2,1381,'0.99','2005-06-15 15:17:21','2006-02-15 22:15:42'),(8140,300,1,3177,'2.99','2005-06-20 22:32:44','2006-02-15 22:15:42'),(8141,300,1,3775,'0.99','2005-07-06 13:27:33','2006-02-15 22:15:42'),(8142,300,1,4030,'0.99','2005-07-07 02:25:42','2006-02-15 22:15:42'),(8143,300,2,5562,'2.99','2005-07-10 03:17:42','2006-02-15 22:15:42'),(8144,300,1,5705,'10.99','2005-07-10 10:09:17','2006-02-15 22:15:42'),(8145,300,2,6111,'4.99','2005-07-11 07:26:57','2006-02-15 22:15:42'),(8146,300,1,6822,'5.99','2005-07-12 18:23:39','2006-02-15 22:15:42'),(8147,300,1,6998,'4.99','2005-07-27 01:16:29','2006-02-15 22:15:42'),(8148,300,1,7815,'4.99','2005-07-28 08:14:11','2006-02-15 22:15:42'),(8149,300,1,8117,'6.99','2005-07-28 19:20:16','2006-02-15 22:15:42'),(8150,300,1,8210,'6.99','2005-07-28 23:31:05','2006-02-15 22:15:42'),(8151,300,1,8283,'3.99','2005-07-29 01:52:22','2006-02-15 22:15:42'),(8152,300,1,9078,'0.99','2005-07-30 08:01:00','2006-02-15 22:15:42'),(8153,300,2,9127,'2.99','2005-07-30 09:46:36','2006-02-15 22:15:43'),(8154,300,2,9791,'0.99','2005-07-31 10:35:22','2006-02-15 22:15:43'),(8155,300,1,10977,'4.99','2005-08-02 04:12:17','2006-02-15 22:15:43'),(8156,300,2,12484,'2.99','2005-08-18 12:39:37','2006-02-15 22:15:43'),(8157,300,2,12644,'5.99','2005-08-18 18:22:27','2006-02-15 22:15:43'),(8158,300,2,13257,'3.99','2005-08-19 17:01:20','2006-02-15 22:15:43'),(8159,300,1,13296,'0.99','2005-08-19 18:43:53','2006-02-15 22:15:43'),(8160,300,2,13499,'6.99','2005-08-20 01:52:30','2006-02-15 22:15:43'),(8161,300,1,13717,'5.99','2005-08-20 09:50:52','2006-02-15 22:15:43'),(8162,300,1,14674,'7.99','2005-08-21 20:01:34','2006-02-15 22:15:43'),(8163,300,1,14709,'9.99','2005-08-21 21:07:59','2006-02-15 22:15:43'),(8164,300,2,15051,'2.99','2005-08-22 10:08:50','2006-02-15 22:15:43'),(8165,300,2,15811,'5.99','2005-08-23 14:43:46','2006-02-15 22:15:43'),(8166,300,1,15695,'4.99','2006-02-14 15:16:03','2006-02-15 22:15:43'),(8167,301,2,27,'4.99','2005-05-25 03:41:50','2006-02-15 22:15:43'),(8168,301,2,227,'5.99','2005-05-26 10:51:46','2006-02-15 22:15:43'),(8169,301,1,955,'0.99','2005-05-30 16:59:03','2006-02-15 22:15:43'),(8170,301,1,1853,'0.99','2005-06-17 00:39:54','2006-02-15 22:15:43'),(8171,301,1,2611,'4.99','2005-06-19 07:18:17','2006-02-15 22:15:43'),(8172,301,2,2925,'2.99','2005-06-20 04:23:49','2006-02-15 22:15:43'),(8173,301,2,4316,'4.99','2005-07-07 17:44:22','2006-02-15 22:15:43'),(8174,301,2,4834,'3.99','2005-07-08 18:07:45','2006-02-15 22:15:43'),(8175,301,1,5119,'6.99','2005-07-09 07:14:18','2006-02-15 22:15:43'),(8176,301,2,5511,'4.99','2005-07-10 01:00:00','2006-02-15 22:15:43'),(8177,301,2,5730,'2.99','2005-07-10 11:28:32','2006-02-15 22:15:43'),(8178,301,2,5807,'2.99','2005-07-10 15:16:30','2006-02-15 22:15:43'),(8179,301,2,6833,'6.99','2005-07-12 18:53:34','2006-02-15 22:15:44'),(8180,301,2,7318,'4.99','2005-07-27 13:25:31','2006-02-15 22:15:44'),(8181,301,2,7818,'4.99','2005-07-28 08:25:00','2006-02-15 22:15:44'),(8182,301,2,9435,'4.99','2005-07-30 21:31:02','2006-02-15 22:15:44'),(8183,301,1,10883,'0.99','2005-08-02 00:47:19','2006-02-15 22:15:44'),(8184,301,2,13183,'5.99','2005-08-19 14:09:26','2006-02-15 22:15:44'),(8185,301,2,13633,'2.99','2005-08-20 07:13:47','2006-02-15 22:15:44'),(8186,301,1,15201,'10.99','2005-08-22 16:24:42','2006-02-15 22:15:44'),(8187,301,1,15268,'1.99','2005-08-22 18:39:11','2006-02-15 22:15:44'),(8188,302,2,38,'4.99','2005-05-25 04:47:44','2006-02-15 22:15:44'),(8189,302,2,92,'5.99','2005-05-25 15:38:46','2006-02-15 22:15:44'),(8190,302,1,1231,'2.99','2005-06-15 04:04:41','2006-02-15 22:15:44'),(8191,302,2,4676,'4.99','2005-07-08 10:26:02','2006-02-15 22:15:44'),(8192,302,2,5498,'0.99','2005-07-10 00:27:21','2006-02-15 22:15:44'),(8193,302,2,5682,'2.99','2005-07-10 08:51:39','2006-02-15 22:15:44'),(8194,302,2,5709,'0.99','2005-07-10 10:31:52','2006-02-15 22:15:44'),(8195,302,2,5821,'4.99','2005-07-10 16:07:16','2006-02-15 22:15:44'),(8196,302,2,6623,'7.99','2005-07-12 09:05:34','2006-02-15 22:15:44'),(8197,302,1,7183,'0.99','2005-07-27 08:18:38','2006-02-15 22:15:44'),(8198,302,1,7411,'6.99','2005-07-27 16:42:30','2006-02-15 22:15:44'),(8199,302,1,8363,'6.99','2005-07-29 05:10:08','2006-02-15 22:15:44'),(8200,302,2,8646,'0.99','2005-07-29 14:48:48','2006-02-15 22:15:44'),(8201,302,1,8795,'2.99','2005-07-29 21:04:14','2006-02-15 22:15:44'),(8202,302,1,9146,'7.99','2005-07-30 10:32:08','2006-02-15 22:15:44'),(8203,302,2,9358,'2.99','2005-07-30 18:37:24','2006-02-15 22:15:44'),(8204,302,1,9374,'8.99','2005-07-30 19:10:03','2006-02-15 22:15:45'),(8205,302,2,9581,'5.99','2005-07-31 03:03:07','2006-02-15 22:15:45'),(8206,302,2,10329,'0.99','2005-08-01 04:56:13','2006-02-15 22:15:45'),(8207,302,1,12126,'7.99','2005-08-17 23:25:21','2006-02-15 22:15:45'),(8208,302,2,12516,'4.99','2005-08-18 13:39:53','2006-02-15 22:15:45'),(8209,302,1,12903,'2.99','2005-08-19 04:09:38','2006-02-15 22:15:45'),(8210,302,1,13916,'2.99','2005-08-20 16:43:02','2006-02-15 22:15:45'),(8211,302,1,14120,'4.99','2005-08-21 01:25:00','2006-02-15 22:15:45'),(8212,302,2,14247,'3.99','2005-08-21 05:35:17','2006-02-15 22:15:45'),(8213,302,2,15578,'2.99','2005-08-23 05:37:13','2006-02-15 22:15:45'),(8214,302,1,15622,'5.99','2005-08-23 07:22:02','2006-02-15 22:15:45'),(8215,302,2,15734,'0.99','2005-08-23 11:40:08','2006-02-15 22:15:45'),(8216,302,2,15987,'6.99','2005-08-23 20:22:17','2006-02-15 22:15:45'),(8217,303,1,265,'0.99','2005-05-26 16:07:38','2006-02-15 22:15:45'),(8218,303,1,871,'2.99','2005-05-30 05:01:30','2006-02-15 22:15:45'),(8219,303,2,1050,'4.99','2005-05-31 07:01:27','2006-02-15 22:15:45'),(8220,303,2,1970,'4.99','2005-06-17 09:23:16','2006-02-15 22:15:45'),(8221,303,1,2223,'8.99','2005-06-18 03:27:03','2006-02-15 22:15:45'),(8222,303,1,3077,'3.99','2005-06-20 15:05:18','2006-02-15 22:15:45'),(8223,303,1,3107,'2.99','2005-06-20 17:26:05','2006-02-15 22:15:45'),(8224,303,1,5140,'4.99','2005-07-09 08:04:59','2006-02-15 22:15:45'),(8225,303,1,6205,'4.99','2005-07-11 12:31:24','2006-02-15 22:15:45'),(8226,303,2,6219,'4.99','2005-07-11 13:18:37','2006-02-15 22:15:45'),(8227,303,1,6464,'4.99','2005-07-12 01:16:40','2006-02-15 22:15:45'),(8228,303,1,7023,'4.99','2005-07-27 02:32:44','2006-02-15 22:15:45'),(8229,303,2,7502,'2.99','2005-07-27 20:19:08','2006-02-15 22:15:46'),(8230,303,1,8409,'0.99','2005-07-29 06:41:22','2006-02-15 22:15:46'),(8231,303,2,8734,'6.99','2005-07-29 18:28:15','2006-02-15 22:15:46'),(8232,303,2,8764,'0.99','2005-07-29 19:39:04','2006-02-15 22:15:46'),(8233,303,2,10209,'2.99','2005-08-01 00:56:47','2006-02-15 22:15:46'),(8234,303,1,11253,'4.99','2005-08-02 13:42:44','2006-02-15 22:15:46'),(8235,303,2,11673,'2.99','2005-08-17 05:54:15','2006-02-15 22:15:46'),(8236,303,2,11993,'2.99','2005-08-17 18:27:49','2006-02-15 22:15:46'),(8237,303,2,12117,'0.99','2005-08-17 23:11:12','2006-02-15 22:15:46'),(8238,303,1,12365,'0.99','2005-08-18 07:55:09','2006-02-15 22:15:46'),(8239,303,2,12473,'2.99','2005-08-18 11:59:44','2006-02-15 22:15:46'),(8240,303,1,14750,'5.99','2005-08-21 23:09:32','2006-02-15 22:15:46'),(8241,303,2,14795,'4.99','2005-08-22 00:40:22','2006-02-15 22:15:46'),(8242,303,1,15511,'3.99','2005-08-23 02:55:42','2006-02-15 22:15:46'),(8243,304,1,135,'10.99','2005-05-25 21:58:58','2006-02-15 22:15:46'),(8244,304,1,415,'0.99','2005-05-27 14:51:45','2006-02-15 22:15:46'),(8245,304,2,937,'2.99','2005-05-30 14:47:31','2006-02-15 22:15:46'),(8246,304,1,1414,'6.99','2005-06-15 17:26:32','2006-02-15 22:15:46'),(8247,304,2,1525,'4.99','2005-06-16 00:26:07','2006-02-15 22:15:46'),(8248,304,1,2039,'3.99','2005-06-17 14:03:43','2006-02-15 22:15:46'),(8249,304,2,2902,'4.99','2005-06-20 02:45:35','2006-02-15 22:15:46'),(8250,304,1,4466,'6.99','2005-07-08 00:12:53','2006-02-15 22:15:46'),(8251,304,2,4812,'8.99','2005-07-08 17:07:11','2006-02-15 22:15:46'),(8252,304,1,5411,'2.99','2005-07-09 20:23:38','2006-02-15 22:15:46'),(8253,304,1,5712,'4.99','2005-07-10 10:40:32','2006-02-15 22:15:46'),(8254,304,2,5749,'3.99','2005-07-10 12:20:36','2006-02-15 22:15:47'),(8255,304,2,5795,'0.99','2005-07-10 14:36:29','2006-02-15 22:15:47'),(8256,304,2,6107,'0.99','2005-07-11 07:07:09','2006-02-15 22:15:47'),(8257,304,1,6737,'4.99','2005-07-12 14:16:52','2006-02-15 22:15:47'),(8258,304,2,7551,'4.99','2005-07-27 21:59:15','2006-02-15 22:15:47'),(8259,304,2,8055,'4.99','2005-07-28 17:02:32','2006-02-15 22:15:47'),(8260,304,1,9930,'0.99','2005-07-31 15:18:03','2006-02-15 22:15:47'),(8261,304,1,9992,'6.99','2005-07-31 17:29:48','2006-02-15 22:15:47'),(8262,304,1,10631,'0.99','2005-08-01 15:35:14','2006-02-15 22:15:47'),(8263,304,2,11983,'4.99','2005-08-17 18:13:55','2006-02-15 22:15:47'),(8264,304,1,12540,'5.99','2005-08-18 14:17:30','2006-02-15 22:15:47'),(8265,304,2,13911,'3.99','2005-08-20 16:31:33','2006-02-15 22:15:47'),(8266,304,1,14023,'0.99','2005-08-20 21:10:32','2006-02-15 22:15:47'),(8267,304,1,14899,'4.99','2005-08-22 04:26:38','2006-02-15 22:15:47'),(8268,304,1,14945,'4.99','2005-08-22 06:05:38','2006-02-15 22:15:47'),(8269,305,2,69,'2.99','2005-05-25 10:10:14','2006-02-15 22:15:47'),(8270,305,1,1574,'4.99','2005-06-16 03:39:56','2006-02-15 22:15:47'),(8271,305,2,1884,'0.99','2005-06-17 03:19:20','2006-02-15 22:15:47'),(8272,305,1,2166,'11.99','2005-06-17 23:51:21','2006-02-15 22:15:47'),(8273,305,1,3387,'0.99','2005-06-21 14:21:49','2006-02-15 22:15:47'),(8274,305,2,4260,'4.99','2005-07-07 14:22:45','2006-02-15 22:15:47'),(8275,305,1,4638,'2.99','2005-07-08 08:57:20','2006-02-15 22:15:47'),(8276,305,2,5041,'0.99','2005-07-09 03:18:51','2006-02-15 22:15:47'),(8277,305,1,5052,'2.99','2005-07-09 03:59:43','2006-02-15 22:15:47'),(8278,305,2,5582,'4.99','2005-07-10 04:08:25','2006-02-15 22:15:47'),(8279,305,1,5745,'8.99','2005-07-10 12:10:11','2006-02-15 22:15:47'),(8280,305,1,6134,'7.99','2005-07-11 08:28:19','2006-02-15 22:15:48'),(8281,305,2,6619,'0.99','2005-07-12 08:50:48','2006-02-15 22:15:48'),(8282,305,2,8865,'4.99','2005-07-29 23:54:54','2006-02-15 22:15:48'),(8283,305,2,9119,'4.99','2005-07-30 09:25:56','2006-02-15 22:15:48'),(8284,305,2,10426,'4.99','2005-08-01 08:26:08','2006-02-15 22:15:48'),(8285,305,2,10929,'4.99','2005-08-02 02:35:44','2006-02-15 22:15:48'),(8286,305,1,10981,'2.99','2005-08-02 04:17:53','2006-02-15 22:15:48'),(8287,305,2,11035,'5.99','2005-08-02 05:55:39','2006-02-15 22:15:48'),(8288,305,2,11809,'3.99','2005-08-17 11:51:39','2006-02-15 22:15:48'),(8289,305,2,12592,'3.99','2005-08-18 16:17:50','2006-02-15 22:15:48'),(8290,305,2,12846,'0.99','2005-08-19 02:03:26','2006-02-15 22:15:48'),(8291,305,1,13782,'4.99','2005-08-20 12:09:26','2006-02-15 22:15:48'),(8292,305,2,15417,'2.99','2005-08-22 23:54:04','2006-02-15 22:15:48'),(8293,305,1,15612,'6.99','2005-08-23 06:59:07','2006-02-15 22:15:48'),(8294,306,2,375,'3.99','2005-05-27 08:49:21','2006-02-15 22:15:48'),(8295,306,2,672,'6.99','2005-05-28 22:05:29','2006-02-15 22:15:48'),(8296,306,2,1172,'0.99','2005-06-14 23:54:34','2006-02-15 22:15:48'),(8297,306,2,2836,'6.99','2005-06-19 21:58:21','2006-02-15 22:15:48'),(8298,306,1,3814,'6.99','2005-07-06 15:23:56','2006-02-15 22:15:48'),(8299,306,2,4484,'5.99','2005-07-08 01:05:57','2006-02-15 22:15:48'),(8300,306,2,4596,'1.99','2005-07-08 06:41:25','2006-02-15 22:15:48'),(8301,306,2,5581,'2.99','2005-07-10 04:06:06','2006-02-15 22:15:48'),(8302,306,2,6868,'2.99','2005-07-12 20:10:17','2006-02-15 22:15:48'),(8303,306,1,6953,'4.99','2005-07-26 23:52:47','2006-02-15 22:15:48'),(8304,306,1,7225,'6.99','2005-07-27 09:47:12','2006-02-15 22:15:49'),(8305,306,1,7232,'4.99','2005-07-27 10:04:19','2006-02-15 22:15:49'),(8306,306,2,7701,'2.99','2005-07-28 03:54:28','2006-02-15 22:15:49'),(8307,306,2,8620,'0.99','2005-07-29 13:51:20','2006-02-15 22:15:49'),(8308,306,1,8702,'0.99','2005-07-29 17:04:37','2006-02-15 22:15:49'),(8309,306,2,9242,'4.99','2005-07-30 14:03:58','2006-02-15 22:15:49'),(8310,306,2,9395,'4.99','2005-07-30 20:07:06','2006-02-15 22:15:49'),(8311,306,1,9774,'0.99','2005-07-31 09:57:51','2006-02-15 22:15:49'),(8312,306,1,10202,'6.99','2005-08-01 00:43:18','2006-02-15 22:15:49'),(8313,306,2,10893,'5.99','2005-08-02 01:12:13','2006-02-15 22:15:49'),(8314,306,2,11142,'4.99','2005-08-02 09:30:11','2006-02-15 22:15:49'),(8315,306,1,11440,'0.99','2005-08-02 20:24:02','2006-02-15 22:15:49'),(8316,306,2,11674,'6.99','2005-08-17 05:56:27','2006-02-15 22:15:49'),(8317,306,2,11776,'0.99','2005-08-17 10:27:19','2006-02-15 22:15:49'),(8318,306,1,12225,'7.99','2005-08-18 03:00:11','2006-02-15 22:15:49'),(8319,306,1,12989,'2.99','2005-08-19 07:19:04','2006-02-15 22:15:49'),(8320,306,1,13686,'4.99','2005-08-20 08:57:28','2006-02-15 22:15:49'),(8321,306,2,13725,'5.99','2005-08-20 10:08:27','2006-02-15 22:15:49'),(8322,306,1,13873,'0.99','2005-08-20 15:11:11','2006-02-15 22:15:49'),(8323,306,1,13996,'4.99','2005-08-20 19:45:43','2006-02-15 22:15:49'),(8324,306,1,15457,'2.99','2005-08-23 01:07:37','2006-02-15 22:15:49'),(8325,306,2,15868,'7.99','2005-08-23 16:19:14','2006-02-15 22:15:49'),(8326,307,2,413,'4.99','2005-05-27 14:45:37','2006-02-15 22:15:49'),(8327,307,1,535,'4.99','2005-05-28 06:16:32','2006-02-15 22:15:49'),(8328,307,1,614,'1.99','2005-05-28 15:33:28','2006-02-15 22:15:49'),(8329,307,1,970,'6.99','2005-05-30 19:50:28','2006-02-15 22:15:50'),(8330,307,2,2152,'2.99','2005-06-17 22:53:27','2006-02-15 22:15:50'),(8331,307,1,2167,'0.99','2005-06-17 23:51:28','2006-02-15 22:15:50'),(8332,307,1,2787,'4.99','2005-06-19 18:47:00','2006-02-15 22:15:50'),(8333,307,1,2881,'2.99','2005-06-20 01:26:18','2006-02-15 22:15:50'),(8334,307,2,3057,'5.99','2005-06-20 13:22:48','2006-02-15 22:15:50'),(8335,307,1,3209,'4.99','2005-06-21 00:51:06','2006-02-15 22:15:50'),(8336,307,1,3962,'6.99','2005-07-06 22:13:45','2006-02-15 22:15:50'),(8337,307,1,3985,'4.99','2005-07-06 23:24:03','2006-02-15 22:15:50'),(8338,307,1,4522,'2.99','2005-07-08 03:03:12','2006-02-15 22:15:50'),(8339,307,1,4868,'4.99','2005-07-08 19:13:50','2006-02-15 22:15:50'),(8340,307,1,5871,'3.99','2005-07-10 18:46:08','2006-02-15 22:15:50'),(8341,307,2,6125,'6.99','2005-07-11 08:03:35','2006-02-15 22:15:50'),(8342,307,1,6256,'0.99','2005-07-11 15:19:22','2006-02-15 22:15:50'),(8343,307,1,6991,'10.99','2005-07-27 01:03:06','2006-02-15 22:15:50'),(8344,307,1,7536,'2.99','2005-07-27 21:34:09','2006-02-15 22:15:50'),(8345,307,1,7760,'3.99','2005-07-28 06:29:45','2006-02-15 22:15:50'),(8346,307,1,7929,'0.99','2005-07-28 12:16:40','2006-02-15 22:15:50'),(8347,307,1,8647,'6.99','2005-07-29 14:52:59','2006-02-15 22:15:50'),(8348,307,1,10135,'4.99','2005-07-31 21:57:32','2006-02-15 22:15:50'),(8349,307,1,10374,'0.99','2005-08-01 06:25:27','2006-02-15 22:15:50'),(8350,307,1,10745,'2.99','2005-08-01 19:57:06','2006-02-15 22:15:50'),(8351,307,1,11491,'7.99','2005-08-02 22:44:50','2006-02-15 22:15:50'),(8352,307,2,12391,'4.99','2005-08-18 08:52:53','2006-02-15 22:15:50'),(8353,307,2,13365,'6.99','2005-08-19 21:12:37','2006-02-15 22:15:51'),(8354,307,1,14231,'0.99','2005-08-21 05:04:34','2006-02-15 22:15:51'),(8355,307,2,15515,'4.99','2005-08-23 03:03:53','2006-02-15 22:15:51'),(8356,308,2,589,'3.99','2005-05-28 12:27:50','2006-02-15 22:15:51'),(8357,308,1,2037,'0.99','2005-06-17 13:54:20','2006-02-15 22:15:51'),(8358,308,1,2094,'0.99','2005-06-17 18:18:56','2006-02-15 22:15:51'),(8359,308,2,2168,'4.99','2005-06-17 23:53:24','2006-02-15 22:15:51'),(8360,308,1,2346,'7.99','2005-06-18 12:08:16','2006-02-15 22:15:51'),(8361,308,2,2448,'4.99','2005-06-18 19:13:45','2006-02-15 22:15:51'),(8362,308,1,4002,'3.99','2005-07-07 00:08:18','2006-02-15 22:15:51'),(8363,308,1,4285,'8.99','2005-07-07 15:34:35','2006-02-15 22:15:51'),(8364,308,1,5946,'2.99','2005-07-10 22:57:29','2006-02-15 22:15:51'),(8365,308,2,8869,'0.99','2005-07-30 00:06:32','2006-02-15 22:15:51'),(8366,308,1,9479,'2.99','2005-07-30 23:22:09','2006-02-15 22:15:51'),(8367,308,1,9746,'7.99','2005-07-31 09:16:48','2006-02-15 22:15:51'),(8368,308,1,10571,'2.99','2005-08-01 13:25:30','2006-02-15 22:15:51'),(8369,308,2,10797,'0.99','2005-08-01 22:02:51','2006-02-15 22:15:51'),(8370,308,1,10819,'4.99','2005-08-01 22:52:57','2006-02-15 22:15:51'),(8371,308,1,11765,'2.99','2005-08-17 09:55:28','2006-02-15 22:15:51'),(8372,308,1,11972,'4.99','2005-08-17 17:55:46','2006-02-15 22:15:51'),(8373,308,2,12567,'3.99','2005-08-18 15:14:36','2006-02-15 22:15:51'),(8374,308,1,12590,'6.99','2005-08-18 16:11:35','2006-02-15 22:15:51'),(8375,308,2,12838,'6.99','2005-08-19 01:51:50','2006-02-15 22:15:51'),(8376,308,1,13843,'2.99','2005-08-20 14:30:01','2006-02-15 22:15:51'),(8377,308,2,14946,'2.99','2005-08-22 06:07:10','2006-02-15 22:15:51'),(8378,308,1,15243,'4.99','2005-08-22 17:48:28','2006-02-15 22:15:52'),(8379,308,2,15493,'4.99','2005-08-23 02:20:53','2006-02-15 22:15:52'),(8380,308,2,15820,'2.99','2005-08-23 15:03:13','2006-02-15 22:15:52'),(8381,309,2,218,'6.99','2005-05-26 09:27:09','2006-02-15 22:15:52'),(8382,309,2,723,'0.99','2005-05-29 05:34:44','2006-02-15 22:15:52'),(8383,309,1,1837,'4.99','2005-06-16 23:16:15','2006-02-15 22:15:52'),(8384,309,2,2560,'9.99','2005-06-19 03:12:42','2006-02-15 22:15:52'),(8385,309,2,2644,'3.99','2005-06-19 09:42:30','2006-02-15 22:15:52'),(8386,309,2,2688,'6.99','2005-06-19 12:50:56','2006-02-15 22:15:52'),(8387,309,2,3837,'4.99','2005-07-06 16:27:43','2006-02-15 22:15:52'),(8388,309,2,3896,'7.99','2005-07-06 19:09:15','2006-02-15 22:15:52'),(8389,309,2,4172,'4.99','2005-07-07 09:49:09','2006-02-15 22:15:52'),(8390,309,1,4540,'4.99','2005-07-08 04:03:28','2006-02-15 22:15:52'),(8391,309,2,5305,'8.99','2005-07-09 15:55:36','2006-02-15 22:15:52'),(8392,309,1,5980,'4.99','2005-07-11 00:18:21','2006-02-15 22:15:52'),(8393,309,2,6480,'4.99','2005-07-12 01:49:29','2006-02-15 22:15:52'),(8394,309,2,7214,'5.99','2005-07-27 09:23:33','2006-02-15 22:15:52'),(8395,309,2,7722,'4.99','2005-07-28 04:44:58','2006-02-15 22:15:52'),(8396,309,1,7846,'5.99','2005-07-28 09:21:18','2006-02-15 22:15:52'),(8397,309,1,8341,'4.99','2005-07-29 04:42:01','2006-02-15 22:15:52'),(8398,309,1,8501,'2.99','2005-07-29 09:12:51','2006-02-15 22:15:52'),(8399,309,1,8681,'2.99','2005-07-29 16:12:01','2006-02-15 22:15:52'),(8400,309,1,8917,'2.99','2005-07-30 01:47:02','2006-02-15 22:15:52'),(8401,309,2,9945,'2.99','2005-07-31 15:47:51','2006-02-15 22:15:52'),(8402,309,1,9949,'0.99','2005-07-31 15:50:10','2006-02-15 22:15:53'),(8403,309,1,10458,'2.99','2005-08-01 09:19:48','2006-02-15 22:15:53'),(8404,309,1,10728,'0.99','2005-08-01 19:15:09','2006-02-15 22:15:53'),(8405,309,1,10818,'2.99','2005-08-01 22:52:45','2006-02-15 22:15:53'),(8406,309,2,11964,'6.99','2005-08-17 17:37:03','2006-02-15 22:15:53'),(8407,309,2,13021,'5.99','2005-08-19 08:08:04','2006-02-15 22:15:53'),(8408,309,2,13502,'0.99','2005-08-20 01:58:15','2006-02-15 22:15:53'),(8409,309,2,13909,'4.99','2005-08-20 16:26:36','2006-02-15 22:15:53'),(8410,309,2,14846,'5.99','2005-08-22 02:13:48','2006-02-15 22:15:53'),(8411,309,2,15422,'4.99','2005-08-22 23:58:09','2006-02-15 22:15:53'),(8412,310,2,104,'0.99','2005-05-25 17:46:33','2006-02-15 22:15:53'),(8413,310,2,1162,'4.99','2005-06-14 23:09:38','2006-02-15 22:15:53'),(8414,310,2,1333,'2.99','2005-06-15 11:37:08','2006-02-15 22:15:53'),(8415,310,2,1918,'3.99','2005-06-17 05:40:14','2006-02-15 22:15:53'),(8416,310,2,2088,'6.99','2005-06-17 17:35:30','2006-02-15 22:15:53'),(8417,310,1,2480,'5.99','2005-06-18 21:04:09','2006-02-15 22:15:53'),(8418,310,1,2618,'2.99','2005-06-19 08:03:01','2006-02-15 22:15:53'),(8419,310,2,3830,'10.99','2005-07-06 16:01:16','2006-02-15 22:15:53'),(8420,310,1,4072,'0.99','2005-07-07 04:48:02','2006-02-15 22:15:53'),(8421,310,1,5621,'5.99','2005-07-10 05:34:10','2006-02-15 22:15:53'),(8422,310,2,5836,'0.99','2005-07-10 16:49:02','2006-02-15 22:15:53'),(8423,310,1,7648,'5.99','2005-07-28 01:35:33','2006-02-15 22:15:53'),(8424,310,2,8637,'5.99','2005-07-29 14:30:11','2006-02-15 22:15:53'),(8425,310,1,8981,'7.99','2005-07-30 04:25:30','2006-02-15 22:15:53'),(8426,310,1,9536,'2.99','2005-07-31 01:19:02','2006-02-15 22:15:53'),(8427,310,2,11137,'2.99','2005-08-02 09:25:31','2006-02-15 22:15:54'),(8428,310,2,12500,'4.99','2005-08-18 13:05:51','2006-02-15 22:15:54'),(8429,310,2,12710,'7.99','2005-08-18 21:02:50','2006-02-15 22:15:54'),(8430,310,1,12929,'4.99','2005-08-19 05:05:23','2006-02-15 22:15:54'),(8431,310,1,14972,'5.99','2005-08-22 06:53:21','2006-02-15 22:15:54'),(8432,311,2,274,'5.99','2005-05-26 16:48:51','2006-02-15 22:15:54'),(8433,311,2,544,'6.99','2005-05-28 07:03:00','2006-02-15 22:15:54'),(8434,311,1,952,'2.99','2005-05-30 16:28:07','2006-02-15 22:15:54'),(8435,311,2,990,'3.99','2005-05-30 23:25:14','2006-02-15 22:15:54'),(8436,311,2,1128,'6.99','2005-05-31 17:49:26','2006-02-15 22:15:54'),(8437,311,1,1622,'4.99','2005-06-16 07:33:18','2006-02-15 22:15:54'),(8438,311,2,1955,'0.99','2005-06-17 08:40:22','2006-02-15 22:15:54'),(8439,311,2,2967,'6.99','2005-06-20 07:40:35','2006-02-15 22:15:54'),(8440,311,2,4836,'3.99','2005-07-08 18:09:08','2006-02-15 22:15:54'),(8441,311,2,5224,'5.99','2005-07-09 12:07:27','2006-02-15 22:15:54'),(8442,311,2,6419,'4.99','2005-07-11 23:36:38','2006-02-15 22:15:54'),(8443,311,2,8167,'6.99','2005-07-28 21:25:45','2006-02-15 22:15:54'),(8444,311,1,8473,'2.99','2005-07-29 08:36:53','2006-02-15 22:15:54'),(8445,311,1,9503,'6.99','2005-07-31 00:02:38','2006-02-15 22:15:54'),(8446,311,2,9882,'8.99','2005-07-31 13:53:33','2006-02-15 22:15:54'),(8447,311,1,10134,'4.99','2005-07-31 21:56:10','2006-02-15 22:15:54'),(8448,311,2,10448,'4.99','2005-08-01 09:09:31','2006-02-15 22:15:54'),(8449,311,1,12997,'2.99','2005-08-19 07:31:46','2006-02-15 22:15:54'),(8450,311,2,13310,'0.99','2005-08-19 19:05:16','2006-02-15 22:15:54'),(8451,311,2,13423,'1.99','2005-08-19 23:07:42','2006-02-15 22:15:55'),(8452,311,2,14517,'4.99','2005-08-21 14:57:03','2006-02-15 22:15:55'),(8453,311,2,15826,'9.99','2005-08-23 15:15:02','2006-02-15 22:15:55'),(8454,311,1,16020,'8.99','2005-08-23 21:34:33','2006-02-15 22:15:55'),(8455,312,2,229,'4.99','2005-05-26 11:19:20','2006-02-15 22:15:55'),(8456,312,1,530,'0.99','2005-05-28 05:13:01','2006-02-15 22:15:55'),(8457,312,2,1049,'4.99','2005-05-31 06:57:04','2006-02-15 22:15:55'),(8458,312,2,1079,'6.99','2005-05-31 10:48:17','2006-02-15 22:15:55'),(8459,312,2,1419,'0.99','2005-06-15 17:54:50','2006-02-15 22:15:55'),(8460,312,2,3457,'3.99','2005-06-21 21:42:33','2006-02-15 22:15:55'),(8461,312,1,3766,'2.99','2005-07-06 13:04:35','2006-02-15 22:15:55'),(8462,312,1,3792,'1.99','2005-07-06 14:26:38','2006-02-15 22:15:55'),(8463,312,1,4647,'3.99','2005-07-08 09:27:36','2006-02-15 22:15:55'),(8464,312,1,5031,'5.99','2005-07-09 02:36:37','2006-02-15 22:15:55'),(8465,312,2,6751,'2.99','2005-07-12 14:50:34','2006-02-15 22:15:55'),(8466,312,1,6866,'2.99','2005-07-12 20:03:44','2006-02-15 22:15:55'),(8467,312,1,8137,'4.99','2005-07-28 20:07:18','2006-02-15 22:15:55'),(8468,312,1,8412,'6.99','2005-07-29 06:44:50','2006-02-15 22:15:55'),(8469,312,1,8721,'4.99','2005-07-29 17:56:21','2006-02-15 22:15:55'),(8470,312,1,9016,'6.99','2005-07-30 05:26:13','2006-02-15 22:15:55'),(8471,312,1,9154,'3.99','2005-07-30 10:59:54','2006-02-15 22:15:55'),(8472,312,2,10858,'2.99','2005-08-02 00:08:39','2006-02-15 22:15:55'),(8473,312,2,11248,'0.99','2005-08-02 13:35:34','2006-02-15 22:15:55'),(8474,312,2,11879,'5.99','2005-08-17 14:25:09','2006-02-15 22:15:55'),(8475,312,1,12186,'2.99','2005-08-18 01:43:36','2006-02-15 22:15:56'),(8476,312,1,12945,'0.99','2005-08-19 05:51:46','2006-02-15 22:15:56'),(8477,312,2,14362,'2.99','2005-08-21 09:19:49','2006-02-15 22:15:56'),(8478,312,1,14504,'3.99','2005-08-21 14:23:01','2006-02-15 22:15:56'),(8479,312,1,15100,'4.99','2005-08-22 11:55:03','2006-02-15 22:15:56'),(8480,312,1,15882,'6.99','2005-08-23 16:44:31','2006-02-15 22:15:56'),(8481,313,2,669,'4.99','2005-05-28 22:03:25','2006-02-15 22:15:56'),(8482,313,2,712,'2.99','2005-05-29 04:02:24','2006-02-15 22:15:56'),(8483,313,2,781,'0.99','2005-05-29 14:23:58','2006-02-15 22:15:56'),(8484,313,2,843,'0.99','2005-05-30 00:44:24','2006-02-15 22:15:56'),(8485,313,2,1312,'2.99','2005-06-15 10:16:27','2006-02-15 22:15:56'),(8486,313,1,2617,'7.99','2005-06-19 07:48:31','2006-02-15 22:15:56'),(8487,313,2,2711,'4.99','2005-06-19 14:12:22','2006-02-15 22:15:56'),(8488,313,2,4552,'2.99','2005-07-08 04:36:35','2006-02-15 22:15:56'),(8489,313,1,5255,'5.99','2005-07-09 13:51:08','2006-02-15 22:15:56'),(8490,313,1,6384,'2.99','2005-07-11 22:07:26','2006-02-15 22:15:56'),(8491,313,2,7294,'0.99','2005-07-27 12:38:14','2006-02-15 22:15:56'),(8492,313,2,8381,'4.99','2005-07-29 05:31:44','2006-02-15 22:15:56'),(8493,313,1,8970,'3.99','2005-07-30 04:02:05','2006-02-15 22:15:56'),(8494,313,2,9836,'2.99','2005-07-31 12:12:00','2006-02-15 22:15:56'),(8495,313,2,10237,'5.99','2005-08-01 02:07:32','2006-02-15 22:15:56'),(8496,313,2,10933,'7.99','2005-08-02 02:50:49','2006-02-15 22:15:56'),(8497,313,2,11854,'2.99','2005-08-17 13:42:52','2006-02-15 22:15:56'),(8498,313,2,12011,'2.99','2005-08-17 19:19:44','2006-02-15 22:15:56'),(8499,313,2,14250,'2.99','2005-08-21 05:39:35','2006-02-15 22:15:56'),(8500,313,1,14325,'4.99','2005-08-21 08:15:38','2006-02-15 22:15:57'),(8501,313,2,15081,'2.99','2005-08-22 11:14:31','2006-02-15 22:15:57'),(8502,313,1,15340,'0.99','2005-08-22 20:55:56','2006-02-15 22:15:57'),(8503,313,2,15569,'6.99','2005-08-23 05:24:29','2006-02-15 22:15:57'),(8504,314,1,80,'5.99','2005-05-25 12:12:07','2006-02-15 22:15:57'),(8505,314,1,440,'4.99','2005-05-27 18:00:35','2006-02-15 22:15:57'),(8506,314,1,1598,'3.99','2005-06-16 06:02:39','2006-02-15 22:15:57'),(8507,314,1,1624,'2.99','2005-06-16 07:48:57','2006-02-15 22:15:57'),(8508,314,1,3517,'0.99','2005-07-06 00:52:35','2006-02-15 22:15:57'),(8509,314,1,3656,'2.99','2005-07-06 07:55:22','2006-02-15 22:15:57'),(8510,314,1,3808,'0.99','2005-07-06 15:15:35','2006-02-15 22:15:57'),(8511,314,2,4386,'0.99','2005-07-07 20:55:19','2006-02-15 22:15:57'),(8512,314,2,5241,'4.99','2005-07-09 13:19:14','2006-02-15 22:15:57'),(8513,314,2,5856,'0.99','2005-07-10 17:57:32','2006-02-15 22:15:57'),(8514,314,1,6192,'5.99','2005-07-11 11:44:41','2006-02-15 22:15:57'),(8515,314,1,6666,'2.99','2005-07-12 11:32:15','2006-02-15 22:15:57'),(8516,314,1,6763,'3.99','2005-07-12 15:26:34','2006-02-15 22:15:57'),(8517,314,2,7004,'4.99','2005-07-27 01:36:05','2006-02-15 22:15:57'),(8518,314,1,7276,'2.99','2005-07-27 11:41:57','2006-02-15 22:15:57'),(8519,314,2,8022,'6.99','2005-07-28 15:48:56','2006-02-15 22:15:57'),(8520,314,1,8073,'3.99','2005-07-28 17:29:02','2006-02-15 22:15:57'),(8521,314,2,8105,'0.99','2005-07-28 18:59:46','2006-02-15 22:15:57'),(8522,314,2,8328,'6.99','2005-07-29 04:06:24','2006-02-15 22:15:57'),(8523,314,2,8644,'4.99','2005-07-29 14:45:45','2006-02-15 22:15:57'),(8524,314,2,9191,'3.99','2005-07-30 12:25:51','2006-02-15 22:15:58'),(8525,314,2,9318,'6.99','2005-07-30 17:14:30','2006-02-15 22:15:58'),(8526,314,2,11908,'3.99','2005-08-17 15:43:09','2006-02-15 22:15:58'),(8527,314,1,12434,'0.99','2005-08-18 10:38:08','2006-02-15 22:15:58'),(8528,314,2,13120,'3.99','2005-08-19 11:47:38','2006-02-15 22:15:58'),(8529,314,1,13265,'2.99','2005-08-19 17:29:00','2006-02-15 22:15:58'),(8530,314,2,13553,'3.99','2005-08-20 04:07:21','2006-02-15 22:15:58'),(8531,314,2,14145,'4.99','2005-08-21 02:11:38','2006-02-15 22:15:58'),(8532,314,1,14409,'4.99','2005-08-21 10:53:35','2006-02-15 22:15:58'),(8533,314,2,14682,'4.99','2005-08-21 20:25:57','2006-02-15 22:15:58'),(8534,314,2,14815,'4.99','2005-08-22 01:12:44','2006-02-15 22:15:58'),(8535,314,2,14873,'5.99','2005-08-22 03:31:06','2006-02-15 22:15:58'),(8536,314,2,16021,'3.99','2005-08-23 21:37:59','2006-02-15 22:15:58'),(8537,315,1,537,'8.99','2005-05-28 06:20:55','2006-02-15 22:15:58'),(8538,315,1,551,'4.99','2005-05-28 07:44:18','2006-02-15 22:15:58'),(8539,315,1,1701,'2.99','2005-06-16 13:18:48','2006-02-15 22:15:58'),(8540,315,1,4021,'2.99','2005-07-07 01:46:44','2006-02-15 22:15:58'),(8541,315,1,4992,'4.99','2005-07-09 00:49:37','2006-02-15 22:15:58'),(8542,315,2,5126,'6.99','2005-07-09 07:25:35','2006-02-15 22:15:58'),(8543,315,1,6661,'4.99','2005-07-12 11:20:39','2006-02-15 22:15:58'),(8544,315,1,6894,'4.99','2005-07-12 21:20:50','2006-02-15 22:15:58'),(8545,315,1,8416,'5.99','2005-07-29 06:52:54','2006-02-15 22:15:58'),(8546,315,2,8677,'6.99','2005-07-29 16:01:13','2006-02-15 22:15:58'),(8547,315,2,9735,'9.99','2005-07-31 08:57:49','2006-02-15 22:15:58'),(8548,315,2,11254,'0.99','2005-08-02 13:43:49','2006-02-15 22:15:59'),(8549,315,2,12155,'2.99','2005-08-18 00:24:30','2006-02-15 22:15:59'),(8550,315,1,14106,'2.99','2005-08-21 00:46:01','2006-02-15 22:15:59'),(8551,315,2,14162,'2.99','2005-08-21 02:55:34','2006-02-15 22:15:59'),(8552,315,1,15504,'6.99','2005-08-23 02:45:21','2006-02-15 22:15:59'),(8553,315,2,14426,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:59'),(8554,316,1,16,'4.99','2005-05-25 00:43:11','2006-02-15 22:15:59'),(8555,316,1,644,'8.99','2005-05-28 18:59:12','2006-02-15 22:15:59'),(8556,316,1,1065,'1.99','2005-05-31 08:54:56','2006-02-15 22:15:59'),(8557,316,1,1317,'4.99','2005-06-15 10:30:19','2006-02-15 22:15:59'),(8558,316,2,1350,'4.99','2005-06-15 12:50:25','2006-02-15 22:15:59'),(8559,316,1,2032,'4.99','2005-06-17 13:24:07','2006-02-15 22:15:59'),(8560,316,2,2338,'4.99','2005-06-18 11:24:54','2006-02-15 22:15:59'),(8561,316,2,2491,'1.99','2005-06-18 22:01:31','2006-02-15 22:15:59'),(8562,316,1,2820,'4.99','2005-06-19 20:20:33','2006-02-15 22:15:59'),(8563,316,2,3373,'8.99','2005-06-21 13:35:32','2006-02-15 22:15:59'),(8564,316,1,4379,'2.99','2005-07-07 20:32:30','2006-02-15 22:15:59'),(8565,316,2,5102,'3.99','2005-07-09 06:25:48','2006-02-15 22:15:59'),(8566,316,2,5544,'7.99','2005-07-10 02:48:07','2006-02-15 22:15:59'),(8567,316,1,5618,'5.99','2005-07-10 05:28:58','2006-02-15 22:15:59'),(8568,316,2,6988,'4.99','2005-07-27 01:00:08','2006-02-15 22:15:59'),(8569,316,2,7339,'2.99','2005-07-27 14:17:48','2006-02-15 22:15:59'),(8570,316,2,7586,'2.99','2005-07-27 23:19:29','2006-02-15 22:15:59'),(8571,316,1,7592,'4.99','2005-07-27 23:26:04','2006-02-15 22:15:59'),(8572,316,1,7945,'1.99','2005-07-28 12:53:58','2006-02-15 22:15:59'),(8573,316,1,8564,'4.99','2005-07-29 11:33:00','2006-02-15 22:16:00'),(8574,316,1,9508,'4.99','2005-07-31 00:22:39','2006-02-15 22:16:00'),(8575,316,2,9903,'6.99','2005-07-31 14:31:44','2006-02-15 22:16:00'),(8576,316,1,10438,'7.99','2005-08-01 08:53:04','2006-02-15 22:16:00'),(8577,316,1,12028,'0.99','2005-08-17 20:03:47','2006-02-15 22:16:00'),(8578,316,2,12191,'0.99','2005-08-18 01:57:11','2006-02-15 22:16:00'),(8579,316,2,12823,'2.99','2005-08-19 01:15:47','2006-02-15 22:16:00'),(8580,316,2,13277,'5.99','2005-08-19 17:57:35','2006-02-15 22:16:00'),(8581,316,1,14226,'2.99','2005-08-21 04:55:37','2006-02-15 22:16:00'),(8582,316,2,15840,'2.99','2005-08-23 15:34:49','2006-02-15 22:16:00'),(8583,317,1,107,'6.99','2005-05-25 18:28:09','2006-02-15 22:16:00'),(8584,317,2,2287,'6.99','2005-06-18 07:04:36','2006-02-15 22:16:00'),(8585,317,2,3029,'2.99','2005-06-20 11:51:30','2006-02-15 22:16:00'),(8586,317,1,3251,'0.99','2005-06-21 03:20:37','2006-02-15 22:16:00'),(8587,317,1,4138,'0.99','2005-07-07 08:17:13','2006-02-15 22:16:00'),(8588,317,1,4177,'8.99','2005-07-07 10:12:36','2006-02-15 22:16:00'),(8589,317,2,4700,'0.99','2005-07-08 11:37:21','2006-02-15 22:16:00'),(8590,317,1,5548,'0.99','2005-07-10 02:56:45','2006-02-15 22:16:00'),(8591,317,2,5942,'7.99','2005-07-10 22:47:17','2006-02-15 22:16:00'),(8592,317,1,7309,'2.99','2005-07-27 13:00:29','2006-02-15 22:16:00'),(8593,317,2,8062,'2.99','2005-07-28 17:15:06','2006-02-15 22:16:00'),(8594,317,1,8327,'2.99','2005-07-29 04:00:52','2006-02-15 22:16:00'),(8595,317,1,8458,'4.99','2005-07-29 08:05:09','2006-02-15 22:16:00'),(8596,317,1,9110,'2.99','2005-07-30 09:05:42','2006-02-15 22:16:01'),(8597,317,2,9513,'4.99','2005-07-31 00:28:30','2006-02-15 22:16:01'),(8598,317,1,9770,'8.99','2005-07-31 09:52:40','2006-02-15 22:16:01'),(8599,317,1,10364,'2.99','2005-08-01 06:06:49','2006-02-15 22:16:01'),(8600,317,2,12111,'2.99','2005-08-17 22:59:55','2006-02-15 22:16:01'),(8601,317,2,12138,'7.99','2005-08-17 23:55:54','2006-02-15 22:16:01'),(8602,317,2,12301,'2.99','2005-08-18 05:36:20','2006-02-15 22:16:01'),(8603,317,1,13388,'4.99','2005-08-19 21:46:49','2006-02-15 22:16:01'),(8604,317,1,14032,'5.99','2005-08-20 21:26:55','2006-02-15 22:16:01'),(8605,317,2,14385,'0.99','2005-08-21 10:02:55','2006-02-15 22:16:01'),(8606,317,2,14669,'2.99','2005-08-21 19:54:06','2006-02-15 22:16:01'),(8607,317,1,14791,'4.99','2005-08-22 00:35:55','2006-02-15 22:16:01'),(8608,317,1,15204,'2.99','2005-08-22 16:30:43','2006-02-15 22:16:01'),(8609,317,1,15280,'4.99','2005-08-22 19:09:52','2006-02-15 22:16:01'),(8610,317,1,12574,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:01'),(8611,318,1,224,'9.99','2005-05-26 10:18:27','2006-02-15 22:16:01'),(8612,318,1,2634,'2.99','2005-06-19 08:55:17','2006-02-15 22:16:01'),(8613,318,1,2643,'2.99','2005-06-19 09:39:27','2006-02-15 22:16:01'),(8614,318,2,3337,'0.99','2005-06-21 10:24:35','2006-02-15 22:16:01'),(8615,318,2,3376,'7.99','2005-06-21 13:43:02','2006-02-15 22:16:01'),(8616,318,1,3732,'4.99','2005-07-06 11:33:37','2006-02-15 22:16:01'),(8617,318,2,3974,'2.99','2005-07-06 22:59:16','2006-02-15 22:16:01'),(8618,318,1,4356,'8.99','2005-07-07 19:21:22','2006-02-15 22:16:01'),(8619,318,1,7649,'0.99','2005-07-28 01:37:26','2006-02-15 22:16:01'),(8620,318,2,7853,'0.99','2005-07-28 09:36:38','2006-02-15 22:16:02'),(8621,318,2,10023,'5.99','2005-07-31 18:25:51','2006-02-15 22:16:02'),(8622,318,1,14276,'2.99','2005-08-21 06:34:05','2006-02-15 22:16:02'),(8623,319,1,15,'9.99','2005-05-25 00:39:22','2006-02-15 22:16:02'),(8624,319,1,149,'3.99','2005-05-26 00:28:05','2006-02-15 22:16:02'),(8625,319,1,439,'2.99','2005-05-27 17:54:48','2006-02-15 22:16:02'),(8626,319,1,1632,'2.99','2005-06-16 08:03:42','2006-02-15 22:16:02'),(8627,319,1,1892,'4.99','2005-06-17 04:17:33','2006-02-15 22:16:02'),(8628,319,2,2021,'3.99','2005-06-17 12:41:18','2006-02-15 22:16:02'),(8629,319,2,2703,'4.99','2005-06-19 13:36:06','2006-02-15 22:16:02'),(8630,319,2,2884,'0.99','2005-06-20 01:31:16','2006-02-15 22:16:02'),(8631,319,2,3256,'3.99','2005-06-21 03:45:42','2006-02-15 22:16:02'),(8632,319,2,4119,'3.99','2005-07-07 07:06:03','2006-02-15 22:16:02'),(8633,319,2,4295,'2.99','2005-07-07 16:08:51','2006-02-15 22:16:02'),(8634,319,1,4630,'4.99','2005-07-08 08:33:38','2006-02-15 22:16:02'),(8635,319,1,5791,'8.99','2005-07-10 14:16:22','2006-02-15 22:16:02'),(8636,319,1,5882,'2.99','2005-07-10 19:20:34','2006-02-15 22:16:02'),(8637,319,2,6132,'2.99','2005-07-11 08:24:44','2006-02-15 22:16:02'),(8638,319,1,6195,'4.99','2005-07-11 12:00:32','2006-02-15 22:16:02'),(8639,319,1,6255,'4.99','2005-07-11 15:11:33','2006-02-15 22:16:02'),(8640,319,1,6485,'6.99','2005-07-12 02:07:59','2006-02-15 22:16:02'),(8641,319,2,7953,'2.99','2005-07-28 13:24:32','2006-02-15 22:16:02'),(8642,319,2,9017,'4.99','2005-07-30 05:26:20','2006-02-15 22:16:02'),(8643,319,2,9044,'0.99','2005-07-30 06:35:21','2006-02-15 22:16:02'),(8644,319,1,11575,'0.99','2005-08-17 01:50:26','2006-02-15 22:16:03'),(8645,319,2,11598,'0.99','2005-08-17 03:03:07','2006-02-15 22:16:03'),(8646,319,1,11955,'6.99','2005-08-17 17:21:35','2006-02-15 22:16:03'),(8647,319,2,11994,'2.99','2005-08-17 18:29:35','2006-02-15 22:16:03'),(8648,319,1,12018,'4.99','2005-08-17 19:44:46','2006-02-15 22:16:03'),(8649,319,2,12424,'8.99','2005-08-18 10:16:57','2006-02-15 22:16:03'),(8650,319,1,13548,'3.99','2005-08-20 03:53:20','2006-02-15 22:16:03'),(8651,319,2,14828,'4.99','2005-08-22 01:34:05','2006-02-15 22:16:03'),(8652,319,2,15396,'5.99','2005-08-22 23:07:57','2006-02-15 22:16:03'),(8653,320,2,1258,'4.99','2005-06-15 06:21:30','2006-02-15 22:16:03'),(8654,320,2,1484,'3.99','2005-06-15 21:22:35','2006-02-15 22:16:03'),(8655,320,2,1567,'1.99','2005-06-16 03:13:30','2006-02-15 22:16:03'),(8656,320,1,2216,'4.99','2005-06-18 03:08:17','2006-02-15 22:16:03'),(8657,320,2,2883,'7.99','2005-06-20 01:29:10','2006-02-15 22:16:03'),(8658,320,2,3519,'0.99','2005-07-06 00:57:29','2006-02-15 22:16:03'),(8659,320,2,3756,'4.99','2005-07-06 12:40:38','2006-02-15 22:16:03'),(8660,320,2,4173,'2.99','2005-07-07 09:57:26','2006-02-15 22:16:03'),(8661,320,2,7057,'4.99','2005-07-27 03:50:03','2006-02-15 22:16:03'),(8662,320,2,7064,'3.99','2005-07-27 03:53:29','2006-02-15 22:16:03'),(8663,320,2,7930,'4.99','2005-07-28 12:21:08','2006-02-15 22:16:03'),(8664,320,2,8144,'4.99','2005-07-28 20:30:55','2006-02-15 22:16:03'),(8665,320,2,8235,'4.99','2005-07-29 00:22:56','2006-02-15 22:16:03'),(8666,320,1,8238,'0.99','2005-07-29 00:30:06','2006-02-15 22:16:03'),(8667,320,2,8794,'4.99','2005-07-29 20:59:38','2006-02-15 22:16:03'),(8668,320,1,9509,'0.99','2005-07-31 00:22:42','2006-02-15 22:16:04'),(8669,320,1,11208,'0.99','2005-08-02 12:02:37','2006-02-15 22:16:04'),(8670,320,2,11560,'2.99','2005-08-17 01:20:30','2006-02-15 22:16:04'),(8671,320,2,14171,'0.99','2005-08-21 03:00:42','2006-02-15 22:16:04'),(8672,320,1,15302,'2.99','2005-08-22 19:44:53','2006-02-15 22:16:04'),(8673,321,2,200,'4.99','2005-05-26 07:12:21','2006-02-15 22:16:04'),(8674,321,1,620,'5.99','2005-05-28 15:54:45','2006-02-15 22:16:04'),(8675,321,2,818,'4.99','2005-05-29 20:47:53','2006-02-15 22:16:04'),(8676,321,2,1750,'5.99','2005-06-16 16:57:36','2006-02-15 22:16:04'),(8677,321,1,3410,'0.99','2005-06-21 16:20:47','2006-02-15 22:16:04'),(8678,321,2,3901,'5.99','2005-07-06 19:24:55','2006-02-15 22:16:04'),(8679,321,1,3920,'4.99','2005-07-06 20:26:40','2006-02-15 22:16:04'),(8680,321,2,4281,'4.99','2005-07-07 15:17:50','2006-02-15 22:16:04'),(8681,321,1,4318,'5.99','2005-07-07 17:47:50','2006-02-15 22:16:04'),(8682,321,2,5202,'2.99','2005-07-09 10:53:48','2006-02-15 22:16:04'),(8683,321,2,5867,'8.99','2005-07-10 18:39:01','2006-02-15 22:16:04'),(8684,321,2,6190,'2.99','2005-07-11 11:36:18','2006-02-15 22:16:04'),(8685,321,1,6859,'5.99','2005-07-12 19:53:57','2006-02-15 22:16:04'),(8686,321,2,8685,'6.99','2005-07-29 16:17:05','2006-02-15 22:16:04'),(8687,321,1,9981,'0.99','2005-07-31 17:08:31','2006-02-15 22:16:04'),(8688,321,1,11722,'2.99','2005-08-17 07:53:03','2006-02-15 22:16:04'),(8689,321,1,12033,'6.99','2005-08-17 20:14:34','2006-02-15 22:16:04'),(8690,321,2,12034,'7.99','2005-08-17 20:15:31','2006-02-15 22:16:04'),(8691,321,1,12398,'4.99','2005-08-18 09:13:24','2006-02-15 22:16:04'),(8692,321,2,13623,'6.99','2005-08-20 06:49:46','2006-02-15 22:16:05'),(8693,321,1,15673,'6.99','2005-08-23 09:12:50','2006-02-15 22:16:05'),(8694,321,2,15888,'5.99','2005-08-23 16:56:14','2006-02-15 22:16:05'),(8695,322,2,166,'0.99','2005-05-26 02:49:11','2006-02-15 22:16:05'),(8696,322,1,269,'4.99','2005-05-26 16:19:46','2006-02-15 22:16:05'),(8697,322,1,1386,'2.99','2005-06-15 15:38:58','2006-02-15 22:16:05'),(8698,322,1,1588,'8.99','2005-06-16 04:53:21','2006-02-15 22:16:05'),(8699,322,2,2481,'4.99','2005-06-18 21:08:30','2006-02-15 22:16:05'),(8700,322,1,2554,'0.99','2005-06-19 03:05:38','2006-02-15 22:16:05'),(8701,322,1,2983,'7.99','2005-06-20 08:41:42','2006-02-15 22:16:05'),(8702,322,2,3054,'5.99','2005-06-20 13:16:41','2006-02-15 22:16:05'),(8703,322,2,3413,'8.99','2005-06-21 16:57:07','2006-02-15 22:16:05'),(8704,322,1,3478,'0.99','2005-07-05 23:05:44','2006-02-15 22:16:05'),(8705,322,2,3627,'1.99','2005-07-06 06:19:25','2006-02-15 22:16:05'),(8706,322,1,3646,'4.99','2005-07-06 07:28:59','2006-02-15 22:16:05'),(8707,322,2,6033,'2.99','2005-07-11 02:59:34','2006-02-15 22:16:05'),(8708,322,1,6511,'3.99','2005-07-12 03:39:29','2006-02-15 22:16:05'),(8709,322,2,6673,'0.99','2005-07-12 11:50:56','2006-02-15 22:16:05'),(8710,322,2,6709,'4.99','2005-07-12 13:20:41','2006-02-15 22:16:05'),(8711,322,1,7091,'4.99','2005-07-27 04:44:10','2006-02-15 22:16:05'),(8712,322,2,8142,'4.99','2005-07-28 20:21:54','2006-02-15 22:16:05'),(8713,322,1,9104,'7.99','2005-07-30 08:49:55','2006-02-15 22:16:05'),(8714,322,1,9115,'4.99','2005-07-30 09:13:55','2006-02-15 22:16:05'),(8715,322,1,9252,'1.99','2005-07-30 14:19:59','2006-02-15 22:16:05'),(8716,322,2,11120,'4.99','2005-08-02 08:47:04','2006-02-15 22:16:06'),(8717,322,2,11456,'0.99','2005-08-02 21:14:04','2006-02-15 22:16:06'),(8718,322,2,13180,'4.99','2005-08-19 14:00:38','2006-02-15 22:16:06'),(8719,322,1,13650,'9.99','2005-08-20 07:49:06','2006-02-15 22:16:06'),(8720,322,2,14042,'4.99','2005-08-20 21:45:51','2006-02-15 22:16:06'),(8721,322,1,15450,'0.99','2005-08-23 00:56:01','2006-02-15 22:16:06'),(8722,322,2,15703,'8.99','2005-08-23 10:23:48','2006-02-15 22:16:06'),(8723,323,1,58,'4.99','2005-05-25 08:53:14','2006-02-15 22:16:06'),(8724,323,2,729,'2.99','2005-05-29 06:35:13','2006-02-15 22:16:06'),(8725,323,1,878,'5.99','2005-05-30 05:49:13','2006-02-15 22:16:06'),(8726,323,2,1167,'0.99','2005-06-14 23:25:58','2006-02-15 22:16:06'),(8727,323,2,1786,'2.99','2005-06-16 19:30:54','2006-02-15 22:16:06'),(8728,323,1,2933,'4.99','2005-06-20 04:52:23','2006-02-15 22:16:06'),(8729,323,2,3704,'6.99','2005-07-06 10:16:45','2006-02-15 22:16:06'),(8730,323,2,4572,'1.99','2005-07-08 05:36:59','2006-02-15 22:16:06'),(8731,323,2,5669,'4.99','2005-07-10 08:12:53','2006-02-15 22:16:06'),(8732,323,2,5906,'1.99','2005-07-10 20:41:41','2006-02-15 22:16:06'),(8733,323,1,6840,'3.99','2005-07-12 19:03:22','2006-02-15 22:16:06'),(8734,323,2,7146,'7.99','2005-07-27 07:02:30','2006-02-15 22:16:06'),(8735,323,2,7275,'2.99','2005-07-27 11:39:08','2006-02-15 22:16:06'),(8736,323,2,7695,'5.99','2005-07-28 03:41:13','2006-02-15 22:16:06'),(8737,323,1,7847,'1.99','2005-07-28 09:23:14','2006-02-15 22:16:06'),(8738,323,2,7937,'4.99','2005-07-28 12:38:22','2006-02-15 22:16:06'),(8739,323,2,8474,'0.99','2005-07-29 08:36:56','2006-02-15 22:16:07'),(8740,323,1,8790,'0.99','2005-07-29 20:51:41','2006-02-15 22:16:07'),(8741,323,1,9363,'2.99','2005-07-30 18:44:23','2006-02-15 22:16:07'),(8742,323,2,10002,'4.99','2005-07-31 17:48:16','2006-02-15 22:16:07'),(8743,323,1,10028,'4.99','2005-07-31 18:35:54','2006-02-15 22:16:07'),(8744,323,1,10298,'0.99','2005-08-01 04:06:03','2006-02-15 22:16:07'),(8745,323,1,10994,'3.99','2005-08-02 04:46:53','2006-02-15 22:16:07'),(8746,323,2,11548,'0.99','2005-08-17 00:59:47','2006-02-15 22:16:07'),(8747,323,1,12120,'4.99','2005-08-17 23:16:46','2006-02-15 22:16:07'),(8748,323,1,12169,'2.99','2005-08-18 01:05:54','2006-02-15 22:16:07'),(8749,323,1,13140,'5.99','2005-08-19 12:35:56','2006-02-15 22:16:07'),(8750,323,1,14224,'2.99','2005-08-21 04:53:08','2006-02-15 22:16:07'),(8751,323,1,14957,'3.99','2005-08-22 06:29:34','2006-02-15 22:16:07'),(8752,323,1,15387,'4.99','2005-08-22 22:49:13','2006-02-15 22:16:07'),(8753,323,1,15728,'0.99','2005-08-23 11:30:32','2006-02-15 22:16:07'),(8754,324,2,563,'3.99','2005-05-28 09:10:49','2006-02-15 22:16:07'),(8755,324,1,1740,'0.99','2005-06-16 16:29:00','2006-02-15 22:16:07'),(8756,324,2,2590,'2.99','2005-06-19 05:31:40','2006-02-15 22:16:07'),(8757,324,1,3947,'4.99','2005-07-06 21:42:21','2006-02-15 22:16:07'),(8758,324,1,4197,'0.99','2005-07-07 11:07:52','2006-02-15 22:16:07'),(8759,324,2,4368,'4.99','2005-07-07 19:55:19','2006-02-15 22:16:07'),(8760,324,2,5702,'2.99','2005-07-10 10:00:01','2006-02-15 22:16:07'),(8761,324,1,5778,'0.99','2005-07-10 13:41:37','2006-02-15 22:16:07'),(8762,324,1,6034,'2.99','2005-07-11 03:00:50','2006-02-15 22:16:07'),(8763,324,2,6299,'4.99','2005-07-11 17:45:08','2006-02-15 22:16:08'),(8764,324,2,7240,'3.99','2005-07-27 10:21:15','2006-02-15 22:16:08'),(8765,324,1,7263,'7.99','2005-07-27 11:17:22','2006-02-15 22:16:08'),(8766,324,2,7960,'6.99','2005-07-28 13:47:08','2006-02-15 22:16:08'),(8767,324,1,8698,'3.99','2005-07-29 16:52:17','2006-02-15 22:16:08'),(8768,324,1,9651,'4.99','2005-07-31 05:48:49','2006-02-15 22:16:08'),(8769,324,2,10212,'2.99','2005-08-01 01:01:35','2006-02-15 22:16:08'),(8770,324,1,11617,'2.99','2005-08-17 04:00:40','2006-02-15 22:16:08'),(8771,324,1,11771,'6.99','2005-08-17 10:17:09','2006-02-15 22:16:08'),(8772,324,2,12543,'2.99','2005-08-18 14:23:55','2006-02-15 22:16:08'),(8773,324,2,13356,'0.99','2005-08-19 21:02:21','2006-02-15 22:16:08'),(8774,324,1,13386,'2.99','2005-08-19 21:43:58','2006-02-15 22:16:08'),(8775,324,1,14262,'8.99','2005-08-21 06:08:13','2006-02-15 22:16:08'),(8776,324,2,14479,'7.99','2005-08-21 13:35:54','2006-02-15 22:16:08'),(8777,324,1,15263,'4.99','2005-08-22 18:27:33','2006-02-15 22:16:08'),(8778,324,2,13965,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:08'),(8779,325,1,131,'5.99','2005-05-25 21:42:46','2006-02-15 22:16:08'),(8780,325,2,2502,'4.99','2005-06-18 23:12:13','2006-02-15 22:16:08'),(8781,325,2,2507,'4.99','2005-06-18 23:39:22','2006-02-15 22:16:08'),(8782,325,2,2808,'2.99','2005-06-19 19:34:45','2006-02-15 22:16:08'),(8783,325,1,5470,'5.99','2005-07-09 23:10:49','2006-02-15 22:16:08'),(8784,325,2,5740,'2.99','2005-07-10 11:51:58','2006-02-15 22:16:08'),(8785,325,1,5775,'4.99','2005-07-10 13:34:26','2006-02-15 22:16:08'),(8786,325,2,6135,'4.99','2005-07-11 08:32:23','2006-02-15 22:16:08'),(8787,325,2,6622,'0.99','2005-07-12 09:04:11','2006-02-15 22:16:09'),(8788,325,2,7223,'9.99','2005-07-27 09:42:27','2006-02-15 22:16:09'),(8789,325,2,7687,'2.99','2005-07-28 03:20:26','2006-02-15 22:16:09'),(8790,325,2,8539,'0.99','2005-07-29 10:48:24','2006-02-15 22:16:09'),(8791,325,2,10030,'2.99','2005-07-31 18:39:36','2006-02-15 22:16:09'),(8792,325,1,10070,'4.99','2005-07-31 19:46:29','2006-02-15 22:16:09'),(8793,325,2,10326,'4.99','2005-08-01 04:55:34','2006-02-15 22:16:09'),(8794,325,1,10412,'0.99','2005-08-01 07:57:16','2006-02-15 22:16:09'),(8795,325,2,12097,'4.99','2005-08-17 22:35:24','2006-02-15 22:16:09'),(8796,325,1,12779,'3.99','2005-08-18 23:44:00','2006-02-15 22:16:09'),(8797,325,2,13054,'4.99','2005-08-19 09:34:02','2006-02-15 22:16:09'),(8798,325,2,14452,'3.99','2005-08-21 12:23:20','2006-02-15 22:16:09'),(8799,325,1,14672,'5.99','2005-08-21 19:59:33','2006-02-15 22:16:09'),(8800,325,2,15009,'0.99','2005-08-22 08:27:27','2006-02-15 22:16:09'),(8801,326,1,875,'6.99','2005-05-30 05:38:24','2006-02-15 22:16:09'),(8802,326,2,981,'4.99','2005-05-30 21:52:42','2006-02-15 22:16:09'),(8803,326,2,1149,'3.99','2005-05-31 21:03:17','2006-02-15 22:16:09'),(8804,326,1,1311,'4.99','2005-06-15 10:11:59','2006-02-15 22:16:09'),(8805,326,2,2086,'0.99','2005-06-17 17:32:07','2006-02-15 22:16:09'),(8806,326,2,2317,'4.99','2005-06-18 09:12:18','2006-02-15 22:16:09'),(8807,326,1,3441,'4.99','2005-06-21 20:00:12','2006-02-15 22:16:09'),(8808,326,2,3886,'0.99','2005-07-06 18:44:24','2006-02-15 22:16:09'),(8809,326,1,4160,'7.99','2005-07-07 09:13:17','2006-02-15 22:16:09'),(8810,326,1,5147,'5.99','2005-07-09 08:17:41','2006-02-15 22:16:09'),(8811,326,1,7117,'2.99','2005-07-27 05:48:36','2006-02-15 22:16:10'),(8812,326,2,7725,'2.99','2005-07-28 04:47:14','2006-02-15 22:16:10'),(8813,326,2,7931,'4.99','2005-07-28 12:23:41','2006-02-15 22:16:10'),(8814,326,1,8467,'5.99','2005-07-29 08:25:35','2006-02-15 22:16:10'),(8815,326,1,8604,'4.99','2005-07-29 13:07:13','2006-02-15 22:16:10'),(8816,326,2,8739,'2.99','2005-07-29 18:34:33','2006-02-15 22:16:10'),(8817,326,2,9855,'0.99','2005-07-31 13:00:33','2006-02-15 22:16:10'),(8818,326,1,10108,'0.99','2005-07-31 21:02:14','2006-02-15 22:16:10'),(8819,326,2,10173,'4.99','2005-07-31 23:36:59','2006-02-15 22:16:10'),(8820,326,2,10720,'0.99','2005-08-01 19:04:33','2006-02-15 22:16:10'),(8821,326,2,10976,'4.99','2005-08-02 04:11:48','2006-02-15 22:16:10'),(8822,326,2,11010,'0.99','2005-08-02 05:06:27','2006-02-15 22:16:10'),(8823,326,2,11428,'2.99','2005-08-02 20:03:10','2006-02-15 22:16:10'),(8824,326,2,11485,'4.99','2005-08-02 22:33:25','2006-02-15 22:16:10'),(8825,326,2,12829,'2.99','2005-08-19 01:38:18','2006-02-15 22:16:10'),(8826,327,1,653,'6.99','2005-05-28 20:12:20','2006-02-15 22:16:10'),(8827,327,1,1294,'4.99','2005-06-15 09:09:27','2006-02-15 22:16:10'),(8828,327,2,1577,'3.99','2005-06-16 04:03:28','2006-02-15 22:16:10'),(8829,327,2,1929,'6.99','2005-06-17 06:49:30','2006-02-15 22:16:10'),(8830,327,1,2273,'4.99','2005-06-18 06:30:02','2006-02-15 22:16:10'),(8831,327,2,2304,'5.99','2005-06-18 08:30:15','2006-02-15 22:16:10'),(8832,327,2,2637,'3.99','2005-06-19 09:20:56','2006-02-15 22:16:10'),(8833,327,1,4445,'4.99','2005-07-07 23:08:22','2006-02-15 22:16:10'),(8834,327,1,4521,'0.99','2005-07-08 02:57:56','2006-02-15 22:16:11'),(8835,327,1,6618,'2.99','2005-07-12 08:41:42','2006-02-15 22:16:11'),(8836,327,2,7458,'1.99','2005-07-27 18:36:17','2006-02-15 22:16:11'),(8837,327,2,7808,'1.99','2005-07-28 07:58:56','2006-02-15 22:16:11'),(8838,327,1,10371,'0.99','2005-08-01 06:20:29','2006-02-15 22:16:11'),(8839,327,1,11372,'4.99','2005-08-02 18:10:50','2006-02-15 22:16:11'),(8840,327,2,11929,'6.99','2005-08-17 16:28:51','2006-02-15 22:16:11'),(8841,327,1,12016,'0.99','2005-08-17 19:33:24','2006-02-15 22:16:11'),(8842,327,2,13158,'2.99','2005-08-19 13:18:10','2006-02-15 22:16:11'),(8843,327,1,13360,'4.99','2005-08-19 21:05:11','2006-02-15 22:16:11'),(8844,327,1,13448,'0.99','2005-08-20 00:12:43','2006-02-15 22:16:11'),(8845,327,1,14847,'4.99','2005-08-22 02:13:51','2006-02-15 22:16:11'),(8846,327,2,15365,'3.99','2005-08-22 21:42:17','2006-02-15 22:16:11'),(8847,327,1,15386,'2.99','2005-08-22 22:41:14','2006-02-15 22:16:11'),(8848,327,1,15828,'5.99','2005-08-23 15:16:32','2006-02-15 22:16:11'),(8849,327,1,15916,'9.99','2005-08-23 17:56:01','2006-02-15 22:16:11'),(8850,327,2,15969,'7.99','2005-08-23 19:51:30','2006-02-15 22:16:11'),(8851,327,1,15297,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:11'),(8852,328,2,862,'2.99','2005-05-30 03:09:11','2006-02-15 22:16:11'),(8853,328,2,1670,'2.99','2005-06-16 10:26:33','2006-02-15 22:16:11'),(8854,328,2,1980,'6.99','2005-06-17 09:48:05','2006-02-15 22:16:11'),(8855,328,2,2243,'5.99','2005-06-18 04:33:03','2006-02-15 22:16:11'),(8856,328,1,3024,'4.99','2005-06-20 11:29:17','2006-02-15 22:16:11'),(8857,328,1,3239,'0.99','2005-06-21 02:48:40','2006-02-15 22:16:11'),(8858,328,1,5450,'4.99','2005-07-09 22:13:25','2006-02-15 22:16:12'),(8859,328,1,8017,'1.99','2005-07-28 15:35:41','2006-02-15 22:16:12'),(8860,328,1,8577,'6.99','2005-07-29 11:56:30','2006-02-15 22:16:12'),(8861,328,2,8780,'4.99','2005-07-29 20:19:45','2006-02-15 22:16:12'),(8862,328,2,9557,'2.99','2005-07-31 02:14:01','2006-02-15 22:16:12'),(8863,328,1,9835,'2.99','2005-07-31 12:07:35','2006-02-15 22:16:12'),(8864,328,1,11174,'2.99','2005-08-02 10:32:11','2006-02-15 22:16:12'),(8865,328,1,12175,'4.99','2005-08-18 01:10:17','2006-02-15 22:16:12'),(8866,328,2,12825,'0.99','2005-08-19 01:23:58','2006-02-15 22:16:12'),(8867,328,1,13609,'2.99','2005-08-20 06:11:51','2006-02-15 22:16:12'),(8868,328,2,13681,'7.99','2005-08-20 08:47:37','2006-02-15 22:16:12'),(8869,328,1,13907,'3.99','2005-08-20 16:17:27','2006-02-15 22:16:12'),(8870,328,2,14307,'3.99','2005-08-21 07:34:52','2006-02-15 22:16:12'),(8871,328,1,14755,'3.99','2005-08-21 23:18:08','2006-02-15 22:16:12'),(8872,328,2,14939,'2.99','2005-08-22 05:53:52','2006-02-15 22:16:12'),(8873,328,1,15179,'4.99','2005-08-22 15:36:22','2006-02-15 22:16:12'),(8874,328,1,15863,'0.99','2005-08-23 16:17:09','2006-02-15 22:16:12'),(8875,329,1,1183,'2.99','2005-06-15 00:49:19','2006-02-15 22:16:12'),(8876,329,1,2010,'5.99','2005-06-17 11:54:15','2006-02-15 22:16:12'),(8877,329,2,2024,'0.99','2005-06-17 13:00:51','2006-02-15 22:16:12'),(8878,329,1,2151,'0.99','2005-06-17 22:52:37','2006-02-15 22:16:12'),(8879,329,1,2303,'2.99','2005-06-18 08:27:59','2006-02-15 22:16:12'),(8880,329,2,2702,'2.99','2005-06-19 13:35:56','2006-02-15 22:16:12'),(8881,329,1,3052,'5.99','2005-06-20 13:09:19','2006-02-15 22:16:13'),(8882,329,2,3053,'0.99','2005-06-20 13:10:30','2006-02-15 22:16:13'),(8883,329,2,3268,'4.99','2005-06-21 04:55:49','2006-02-15 22:16:13'),(8884,329,2,3976,'2.99','2005-07-06 23:00:20','2006-02-15 22:16:13'),(8885,329,2,4076,'4.99','2005-07-07 04:52:15','2006-02-15 22:16:13'),(8886,329,1,4415,'4.99','2005-07-07 22:01:43','2006-02-15 22:16:13'),(8887,329,1,4465,'1.99','2005-07-08 00:07:45','2006-02-15 22:16:13'),(8888,329,2,4674,'2.99','2005-07-08 10:19:28','2006-02-15 22:16:13'),(8889,329,1,7980,'4.99','2005-07-28 14:16:49','2006-02-15 22:16:13'),(8890,329,2,8172,'7.99','2005-07-28 21:34:36','2006-02-15 22:16:13'),(8891,329,1,8460,'6.99','2005-07-29 08:08:03','2006-02-15 22:16:13'),(8892,329,2,8941,'0.99','2005-07-30 02:59:21','2006-02-15 22:16:13'),(8893,329,2,9024,'4.99','2005-07-30 05:44:42','2006-02-15 22:16:13'),(8894,329,2,9219,'0.99','2005-07-30 13:15:21','2006-02-15 22:16:13'),(8895,329,1,9381,'0.99','2005-07-30 19:23:04','2006-02-15 22:16:13'),(8896,329,1,9827,'6.99','2005-07-31 11:56:55','2006-02-15 22:16:13'),(8897,329,1,10473,'7.99','2005-08-01 09:56:24','2006-02-15 22:16:13'),(8898,329,2,10490,'0.99','2005-08-01 10:37:11','2006-02-15 22:16:13'),(8899,329,1,11130,'2.99','2005-08-02 09:08:59','2006-02-15 22:16:13'),(8900,329,2,11169,'3.99','2005-08-02 10:19:42','2006-02-15 22:16:13'),(8901,329,2,11697,'0.99','2005-08-17 07:09:19','2006-02-15 22:16:13'),(8902,329,1,12659,'6.99','2005-08-18 19:05:49','2006-02-15 22:16:13'),(8903,329,1,13627,'8.99','2005-08-20 06:59:00','2006-02-15 22:16:13'),(8904,329,1,14900,'4.99','2005-08-22 04:27:48','2006-02-15 22:16:13'),(8905,329,2,15011,'4.99','2005-08-22 08:31:07','2006-02-15 22:16:14'),(8906,329,1,15308,'2.99','2005-08-22 19:54:31','2006-02-15 22:16:14'),(8907,330,1,704,'3.99','2005-05-29 02:44:43','2006-02-15 22:16:14'),(8908,330,2,967,'7.99','2005-05-30 19:12:06','2006-02-15 22:16:14'),(8909,330,1,1219,'6.99','2005-06-15 03:25:59','2006-02-15 22:16:14'),(8910,330,2,1511,'5.99','2005-06-15 22:45:06','2006-02-15 22:16:14'),(8911,330,2,2885,'0.99','2005-06-20 01:33:42','2006-02-15 22:16:14'),(8912,330,1,2936,'4.99','2005-06-20 05:09:27','2006-02-15 22:16:14'),(8913,330,2,3061,'2.99','2005-06-20 13:48:21','2006-02-15 22:16:14'),(8914,330,2,3603,'4.99','2005-07-06 05:25:03','2006-02-15 22:16:14'),(8915,330,2,3659,'2.99','2005-07-06 08:03:14','2006-02-15 22:16:14'),(8916,330,2,3760,'2.99','2005-07-06 12:49:28','2006-02-15 22:16:14'),(8917,330,1,4124,'1.99','2005-07-07 07:19:54','2006-02-15 22:16:14'),(8918,330,2,5149,'2.99','2005-07-09 08:28:23','2006-02-15 22:16:14'),(8919,330,1,5750,'5.99','2005-07-10 12:20:41','2006-02-15 22:16:14'),(8920,330,1,6656,'0.99','2005-07-12 11:09:47','2006-02-15 22:16:14'),(8921,330,2,6678,'2.99','2005-07-12 11:58:36','2006-02-15 22:16:14'),(8922,330,1,6719,'2.99','2005-07-12 13:40:37','2006-02-15 22:16:14'),(8923,330,2,7894,'2.99','2005-07-28 10:53:58','2006-02-15 22:16:14'),(8924,330,1,8680,'4.99','2005-07-29 16:08:03','2006-02-15 22:16:14'),(8925,330,2,10100,'4.99','2005-07-31 20:47:18','2006-02-15 22:16:14'),(8926,330,2,11259,'3.99','2005-08-02 13:46:30','2006-02-15 22:16:14'),(8927,330,1,12062,'2.99','2005-08-17 21:24:47','2006-02-15 22:16:14'),(8928,330,1,12394,'2.99','2005-08-18 09:05:15','2006-02-15 22:16:15'),(8929,330,1,12740,'4.99','2005-08-18 22:17:04','2006-02-15 22:16:15'),(8930,330,1,12867,'0.99','2005-08-19 02:40:11','2006-02-15 22:16:15'),(8931,330,2,11709,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:15'),(8932,331,2,87,'0.99','2005-05-25 13:52:43','2006-02-15 22:16:15'),(8933,331,1,996,'2.99','2005-05-31 00:06:20','2006-02-15 22:16:15'),(8934,331,1,1415,'2.99','2005-06-15 17:31:57','2006-02-15 22:16:15'),(8935,331,2,2528,'6.99','2005-06-19 01:14:12','2006-02-15 22:16:15'),(8936,331,1,2587,'2.99','2005-06-19 05:06:14','2006-02-15 22:16:15'),(8937,331,1,3505,'4.99','2005-07-06 00:19:32','2006-02-15 22:16:15'),(8938,331,1,3613,'4.99','2005-07-06 05:45:53','2006-02-15 22:16:15'),(8939,331,2,3871,'8.99','2005-07-06 17:58:51','2006-02-15 22:16:15'),(8940,331,1,4051,'4.99','2005-07-07 03:37:28','2006-02-15 22:16:15'),(8941,331,2,4063,'5.99','2005-07-07 04:23:57','2006-02-15 22:16:15'),(8942,331,1,4326,'10.99','2005-07-07 18:01:22','2006-02-15 22:16:15'),(8943,331,1,5152,'2.99','2005-07-09 08:34:44','2006-02-15 22:16:15'),(8944,331,1,5885,'1.99','2005-07-10 19:33:50','2006-02-15 22:16:15'),(8945,331,1,5947,'5.99','2005-07-10 23:07:42','2006-02-15 22:16:15'),(8946,331,1,8231,'0.99','2005-07-29 00:14:37','2006-02-15 22:16:15'),(8947,331,2,8995,'4.99','2005-07-30 04:53:11','2006-02-15 22:16:15'),(8948,331,1,9401,'5.99','2005-07-30 20:18:19','2006-02-15 22:16:15'),(8949,331,2,10188,'6.99','2005-08-01 00:19:41','2006-02-15 22:16:16'),(8950,331,1,11052,'5.99','2005-08-02 06:26:19','2006-02-15 22:16:16'),(8951,331,1,11362,'2.99','2005-08-02 17:47:25','2006-02-15 22:16:16'),(8952,331,2,12533,'4.99','2005-08-18 14:01:40','2006-02-15 22:16:16'),(8953,331,1,13795,'0.99','2005-08-20 12:32:09','2006-02-15 22:16:16'),(8954,331,1,14256,'7.99','2005-08-21 05:52:27','2006-02-15 22:16:16'),(8955,331,1,14628,'1.99','2005-08-21 18:37:24','2006-02-15 22:16:16'),(8956,331,1,15339,'2.99','2005-08-22 20:52:12','2006-02-15 22:16:16'),(8957,331,2,15447,'3.99','2005-08-23 00:53:57','2006-02-15 22:16:16'),(8958,331,1,15521,'2.99','2005-08-23 03:30:51','2006-02-15 22:16:16'),(8959,332,2,600,'3.99','2005-05-28 14:08:19','2006-02-15 22:16:16'),(8960,332,1,1000,'6.99','2005-05-31 00:25:56','2006-02-15 22:16:16'),(8961,332,1,4100,'6.99','2005-07-07 06:20:52','2006-02-15 22:16:16'),(8962,332,1,4302,'6.99','2005-07-07 16:47:53','2006-02-15 22:16:16'),(8963,332,2,5116,'2.99','2005-07-09 07:10:12','2006-02-15 22:16:16'),(8964,332,1,5277,'1.99','2005-07-09 14:40:42','2006-02-15 22:16:16'),(8965,332,2,5381,'2.99','2005-07-09 19:11:11','2006-02-15 22:16:16'),(8966,332,2,5388,'0.99','2005-07-09 19:25:25','2006-02-15 22:16:16'),(8967,332,1,5440,'0.99','2005-07-09 21:45:17','2006-02-15 22:16:16'),(8968,332,2,7049,'7.99','2005-07-27 03:32:41','2006-02-15 22:16:16'),(8969,332,2,7418,'2.99','2005-07-27 16:59:09','2006-02-15 22:16:16'),(8970,332,2,7577,'8.99','2005-07-27 22:56:07','2006-02-15 22:16:16'),(8971,332,2,7578,'4.99','2005-07-27 22:58:17','2006-02-15 22:16:17'),(8972,332,2,7934,'8.99','2005-07-28 12:33:10','2006-02-15 22:16:17'),(8973,332,2,8173,'6.99','2005-07-28 21:35:44','2006-02-15 22:16:17'),(8974,332,1,9324,'1.99','2005-07-30 17:28:52','2006-02-15 22:16:17'),(8975,332,1,9388,'5.99','2005-07-30 19:27:22','2006-02-15 22:16:17'),(8976,332,1,9921,'0.99','2005-07-31 14:59:21','2006-02-15 22:16:17'),(8977,332,1,10026,'4.99','2005-07-31 18:31:51','2006-02-15 22:16:17'),(8978,332,1,10307,'0.99','2005-08-01 04:21:54','2006-02-15 22:16:17'),(8979,332,2,10439,'0.99','2005-08-01 08:54:26','2006-02-15 22:16:17'),(8980,332,1,11229,'5.99','2005-08-02 12:56:37','2006-02-15 22:16:17'),(8981,332,2,11564,'2.99','2005-08-17 01:27:49','2006-02-15 22:16:17'),(8982,332,2,12318,'4.99','2005-08-18 06:21:56','2006-02-15 22:16:17'),(8983,332,2,13673,'2.99','2005-08-20 08:27:30','2006-02-15 22:16:17'),(8984,332,2,14783,'4.99','2005-08-22 00:21:57','2006-02-15 22:16:17'),(8985,332,2,15194,'0.99','2005-08-22 16:07:34','2006-02-15 22:16:17'),(8986,332,1,15210,'3.99','2005-08-22 16:37:36','2006-02-15 22:16:17'),(8987,333,1,4,'4.99','2005-05-24 23:04:41','2006-02-15 22:16:17'),(8988,333,1,1667,'2.99','2005-06-16 10:18:59','2006-02-15 22:16:17'),(8989,333,1,2149,'6.99','2005-06-17 22:50:00','2006-02-15 22:16:17'),(8990,333,1,2929,'1.99','2005-06-20 04:47:39','2006-02-15 22:16:17'),(8991,333,1,3110,'2.99','2005-06-20 17:40:12','2006-02-15 22:16:17'),(8992,333,2,5032,'0.99','2005-07-09 02:39:47','2006-02-15 22:16:17'),(8993,333,1,5645,'1.99','2005-07-10 06:58:21','2006-02-15 22:16:17'),(8994,333,2,5892,'4.99','2005-07-10 20:02:42','2006-02-15 22:16:17'),(8995,333,2,6275,'0.99','2005-07-11 16:12:11','2006-02-15 22:16:18'),(8996,333,2,6931,'4.99','2005-07-26 23:02:57','2006-02-15 22:16:18'),(8997,333,2,6958,'0.99','2005-07-27 00:02:41','2006-02-15 22:16:18'),(8998,333,2,7076,'6.99','2005-07-27 04:12:14','2006-02-15 22:16:18'),(8999,333,2,7246,'0.99','2005-07-27 10:30:41','2006-02-15 22:16:18'),(9000,333,1,8719,'4.99','2005-07-29 17:45:45','2006-02-15 22:16:18'),(9001,333,2,9148,'4.99','2005-07-30 10:39:10','2006-02-15 22:16:18'),(9002,333,2,9338,'10.99','2005-07-30 18:03:13','2006-02-15 22:16:18'),(9003,333,2,10035,'4.99','2005-07-31 18:46:46','2006-02-15 22:16:18'),(9004,333,1,10062,'2.99','2005-07-31 19:24:55','2006-02-15 22:16:18'),(9005,333,2,10844,'4.99','2005-08-01 23:46:58','2006-02-15 22:16:18'),(9006,333,1,12427,'6.99','2005-08-18 10:24:17','2006-02-15 22:16:18'),(9007,333,2,12661,'0.99','2005-08-18 19:10:10','2006-02-15 22:16:18'),(9008,333,1,13579,'3.99','2005-08-20 05:22:06','2006-02-15 22:16:18'),(9009,333,2,13710,'4.99','2005-08-20 09:35:20','2006-02-15 22:16:18'),(9010,333,1,14057,'4.99','2005-08-20 22:22:59','2006-02-15 22:16:18'),(9011,333,1,14740,'2.99','2005-08-21 22:35:33','2006-02-15 22:16:18'),(9012,333,2,15253,'2.99','2005-08-22 18:05:21','2006-02-15 22:16:18'),(9013,333,1,15313,'4.99','2005-08-22 19:59:42','2006-02-15 22:16:18'),(9014,334,1,13,'6.99','2005-05-25 00:22:55','2006-02-15 22:16:18'),(9015,334,1,431,'8.99','2005-05-27 16:31:05','2006-02-15 22:16:18'),(9016,334,2,1187,'4.99','2005-06-15 00:58:50','2006-02-15 22:16:18'),(9017,334,1,1298,'4.99','2005-06-15 09:32:53','2006-02-15 22:16:19'),(9018,334,2,2476,'0.99','2005-06-18 20:57:12','2006-02-15 22:16:19'),(9019,334,1,3662,'4.99','2005-07-06 08:11:48','2006-02-15 22:16:19'),(9020,334,1,4603,'6.99','2005-07-08 06:57:07','2006-02-15 22:16:19'),(9021,334,2,5014,'4.99','2005-07-09 01:51:49','2006-02-15 22:16:19'),(9022,334,2,5434,'0.99','2005-07-09 21:25:20','2006-02-15 22:16:19'),(9023,334,2,5818,'5.99','2005-07-10 15:51:12','2006-02-15 22:16:19'),(9024,334,1,5845,'4.99','2005-07-10 17:23:14','2006-02-15 22:16:19'),(9025,334,2,6641,'5.99','2005-07-12 10:33:14','2006-02-15 22:16:19'),(9026,334,2,6749,'4.99','2005-07-12 14:43:05','2006-02-15 22:16:19'),(9027,334,1,6987,'2.99','2005-07-27 00:59:50','2006-02-15 22:16:19'),(9028,334,1,8977,'7.99','2005-07-30 04:14:07','2006-02-15 22:16:19'),(9029,334,1,9633,'2.99','2005-07-31 05:04:08','2006-02-15 22:16:19'),(9030,334,1,10207,'3.99','2005-08-01 00:53:01','2006-02-15 22:16:19'),(9031,334,1,10408,'4.99','2005-08-01 07:42:10','2006-02-15 22:16:19'),(9032,334,1,10492,'2.99','2005-08-01 10:42:28','2006-02-15 22:16:19'),(9033,334,1,10879,'1.99','2005-08-02 00:33:20','2006-02-15 22:16:19'),(9034,334,2,10997,'7.99','2005-08-02 04:49:02','2006-02-15 22:16:19'),(9035,334,2,12677,'4.99','2005-08-18 19:36:05','2006-02-15 22:16:19'),(9036,334,2,13325,'4.99','2005-08-19 19:52:02','2006-02-15 22:16:19'),(9037,334,1,13876,'2.99','2005-08-20 15:15:28','2006-02-15 22:16:19'),(9038,334,1,14645,'0.99','2005-08-21 19:12:47','2006-02-15 22:16:19'),(9039,334,1,14984,'7.99','2005-08-22 07:35:31','2006-02-15 22:16:19'),(9040,334,2,15548,'0.99','2005-08-23 04:26:20','2006-02-15 22:16:20'),(9041,334,2,15656,'4.99','2005-08-23 08:38:58','2006-02-15 22:16:20'),(9042,334,1,15669,'3.99','2005-08-23 09:06:17','2006-02-15 22:16:20'),(9043,334,1,14219,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:20'),(9044,335,1,3329,'4.99','2005-06-21 09:20:31','2006-02-15 22:16:20'),(9045,335,1,3607,'0.99','2005-07-06 05:30:09','2006-02-15 22:16:20'),(9046,335,2,4016,'0.99','2005-07-07 01:05:50','2006-02-15 22:16:20'),(9047,335,2,4032,'2.99','2005-07-07 02:34:13','2006-02-15 22:16:20'),(9048,335,1,4279,'4.99','2005-07-07 15:01:53','2006-02-15 22:16:20'),(9049,335,1,4387,'8.99','2005-07-07 20:56:47','2006-02-15 22:16:20'),(9050,335,1,5024,'4.99','2005-07-09 02:25:12','2006-02-15 22:16:20'),(9051,335,1,5252,'0.99','2005-07-09 13:40:44','2006-02-15 22:16:20'),(9052,335,2,5728,'2.99','2005-07-10 11:26:14','2006-02-15 22:16:20'),(9053,335,1,6624,'7.99','2005-07-12 09:05:50','2006-02-15 22:16:20'),(9054,335,1,6906,'0.99','2005-07-12 22:03:02','2006-02-15 22:16:20'),(9055,335,2,8634,'3.99','2005-07-29 14:19:57','2006-02-15 22:16:20'),(9056,335,1,8855,'2.99','2005-07-29 23:40:10','2006-02-15 22:16:20'),(9057,335,1,9125,'5.99','2005-07-30 09:43:39','2006-02-15 22:16:20'),(9058,335,2,9361,'4.99','2005-07-30 18:43:49','2006-02-15 22:16:20'),(9059,335,1,9428,'0.99','2005-07-30 21:18:37','2006-02-15 22:16:20'),(9060,335,2,10606,'4.99','2005-08-01 14:39:15','2006-02-15 22:16:21'),(9061,335,2,13267,'0.99','2005-08-19 17:31:36','2006-02-15 22:16:21'),(9062,335,1,13622,'1.99','2005-08-20 06:45:32','2006-02-15 22:16:21'),(9063,335,1,14014,'2.99','2005-08-20 20:47:09','2006-02-15 22:16:21'),(9064,335,2,15005,'4.99','2005-08-22 08:15:44','2006-02-15 22:16:21'),(9065,335,2,15101,'0.99','2005-08-22 11:56:02','2006-02-15 22:16:21'),(9066,335,2,11541,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:21'),(9067,336,1,1478,'2.99','2005-06-15 21:12:13','2006-02-15 22:16:21'),(9068,336,2,2212,'2.99','2005-06-18 02:36:10','2006-02-15 22:16:21'),(9069,336,2,2475,'2.99','2005-06-18 20:52:46','2006-02-15 22:16:21'),(9070,336,1,2575,'2.99','2005-06-19 04:32:52','2006-02-15 22:16:21'),(9071,336,2,2719,'4.99','2005-06-19 14:50:19','2006-02-15 22:16:21'),(9072,336,1,2954,'2.99','2005-06-20 06:45:00','2006-02-15 22:16:21'),(9073,336,2,3204,'4.99','2005-06-21 00:37:50','2006-02-15 22:16:21'),(9074,336,2,3349,'0.99','2005-06-21 11:17:35','2006-02-15 22:16:21'),(9075,336,2,4323,'5.99','2005-07-07 17:55:53','2006-02-15 22:16:21'),(9076,336,1,4595,'2.99','2005-07-08 06:40:25','2006-02-15 22:16:21'),(9077,336,2,5649,'2.99','2005-07-10 07:15:07','2006-02-15 22:16:21'),(9078,336,2,5667,'0.99','2005-07-10 08:11:03','2006-02-15 22:16:21'),(9079,336,2,6263,'4.99','2005-07-11 15:33:50','2006-02-15 22:16:22'),(9080,336,2,6382,'6.99','2005-07-11 21:58:53','2006-02-15 22:16:22'),(9081,336,2,8275,'4.99','2005-07-29 01:35:47','2006-02-15 22:16:22'),(9082,336,1,8407,'6.99','2005-07-29 06:37:02','2006-02-15 22:16:22'),(9083,336,2,8607,'4.99','2005-07-29 13:18:00','2006-02-15 22:16:22'),(9084,336,2,8951,'8.99','2005-07-30 03:18:24','2006-02-15 22:16:22'),(9085,336,2,9306,'0.99','2005-07-30 16:47:17','2006-02-15 22:16:22'),(9086,336,1,10055,'0.99','2005-07-31 19:15:58','2006-02-15 22:16:22'),(9087,336,2,11743,'2.99','2005-08-17 08:49:05','2006-02-15 22:16:22'),(9088,336,1,12323,'8.99','2005-08-18 06:36:22','2006-02-15 22:16:22'),(9089,336,2,12794,'0.99','2005-08-19 00:20:37','2006-02-15 22:16:22'),(9090,336,2,12926,'3.99','2005-08-19 05:00:16','2006-02-15 22:16:22'),(9091,336,2,13066,'0.99','2005-08-19 09:50:39','2006-02-15 22:16:22'),(9092,336,2,13689,'4.99','2005-08-20 09:04:30','2006-02-15 22:16:22'),(9093,336,1,14295,'2.99','2005-08-21 07:09:27','2006-02-15 22:16:22'),(9094,336,1,15073,'10.99','2005-08-22 11:01:15','2006-02-15 22:16:22'),(9095,336,2,15848,'2.99','2005-08-23 15:41:12','2006-02-15 22:16:22'),(9096,336,1,13022,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:22'),(9097,337,1,374,'6.99','2005-05-27 08:26:30','2006-02-15 22:16:23'),(9098,337,1,572,'4.99','2005-05-28 10:30:13','2006-02-15 22:16:23'),(9099,337,1,839,'8.99','2005-05-30 00:28:12','2006-02-15 22:16:23'),(9100,337,2,1969,'4.99','2005-06-17 09:22:22','2006-02-15 22:16:23'),(9101,337,1,2014,'5.99','2005-06-17 12:03:28','2006-02-15 22:16:23'),(9102,337,1,3626,'5.99','2005-07-06 06:15:35','2006-02-15 22:16:23'),(9103,337,1,4091,'6.99','2005-07-07 05:53:38','2006-02-15 22:16:23'),(9104,337,2,4093,'4.99','2005-07-07 05:54:50','2006-02-15 22:16:23'),(9105,337,2,4855,'4.99','2005-07-08 18:45:50','2006-02-15 22:16:23'),(9106,337,1,5050,'2.99','2005-07-09 03:54:38','2006-02-15 22:16:23'),(9107,337,1,6212,'0.99','2005-07-11 12:40:48','2006-02-15 22:16:23'),(9108,337,2,6305,'7.99','2005-07-11 18:02:25','2006-02-15 22:16:23'),(9109,337,1,6620,'2.99','2005-07-12 08:51:03','2006-02-15 22:16:23'),(9110,337,1,7410,'4.99','2005-07-27 16:41:59','2006-02-15 22:16:23'),(9111,337,1,8516,'4.99','2005-07-29 10:00:03','2006-02-15 22:16:23'),(9112,337,2,8919,'8.99','2005-07-30 01:57:03','2006-02-15 22:16:24'),(9113,337,2,9051,'5.99','2005-07-30 07:05:54','2006-02-15 22:16:24'),(9114,337,1,10664,'0.99','2005-08-01 16:51:15','2006-02-15 22:16:24'),(9115,337,2,10765,'0.99','2005-08-01 20:34:51','2006-02-15 22:16:24'),(9116,337,2,11252,'2.99','2005-08-02 13:42:13','2006-02-15 22:16:24'),(9117,337,1,11734,'3.99','2005-08-17 08:34:22','2006-02-15 22:16:24'),(9118,337,1,12369,'6.99','2005-08-18 07:57:43','2006-02-15 22:16:24'),(9119,337,2,13305,'6.99','2005-08-19 18:57:05','2006-02-15 22:16:24'),(9120,337,1,13678,'4.99','2005-08-20 08:38:24','2006-02-15 22:16:24'),(9121,337,2,13892,'3.99','2005-08-20 15:50:17','2006-02-15 22:16:24'),(9122,337,2,14118,'5.99','2005-08-21 01:13:37','2006-02-15 22:16:24'),(9123,337,2,15241,'4.99','2005-08-22 17:47:40','2006-02-15 22:16:24'),(9124,337,1,15292,'4.99','2005-08-22 19:28:56','2006-02-15 22:16:24'),(9125,337,2,11847,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:24'),(9126,338,1,675,'0.99','2005-05-28 22:22:44','2006-02-15 22:16:24'),(9127,338,2,1510,'4.99','2005-06-15 22:39:34','2006-02-15 22:16:24'),(9128,338,1,1807,'5.99','2005-06-16 20:58:59','2006-02-15 22:16:24'),(9129,338,2,1952,'4.99','2005-06-17 08:33:02','2006-02-15 22:16:24'),(9130,338,1,2148,'6.99','2005-06-17 22:44:35','2006-02-15 22:16:24'),(9131,338,1,2179,'0.99','2005-06-18 00:41:36','2006-02-15 22:16:24'),(9132,338,1,2495,'4.99','2005-06-18 22:15:42','2006-02-15 22:16:24'),(9133,338,1,3458,'5.99','2005-06-21 21:42:49','2006-02-15 22:16:25'),(9134,338,1,3516,'0.99','2005-07-06 00:50:30','2006-02-15 22:16:25'),(9135,338,2,3772,'2.99','2005-07-06 13:22:53','2006-02-15 22:16:25'),(9136,338,2,4104,'5.99','2005-07-07 06:25:41','2006-02-15 22:16:25'),(9137,338,2,4779,'4.99','2005-07-08 15:53:41','2006-02-15 22:16:25'),(9138,338,1,5309,'4.99','2005-07-09 16:00:16','2006-02-15 22:16:25'),(9139,338,1,6236,'2.99','2005-07-11 14:18:17','2006-02-15 22:16:25'),(9140,338,1,6360,'4.99','2005-07-11 21:07:40','2006-02-15 22:16:25'),(9141,338,2,7584,'3.99','2005-07-27 23:15:46','2006-02-15 22:16:25'),(9142,338,1,8766,'0.99','2005-07-29 19:41:04','2006-02-15 22:16:25'),(9143,338,1,9485,'7.99','2005-07-30 23:32:40','2006-02-15 22:16:25'),(9144,338,2,10791,'2.99','2005-08-01 21:41:52','2006-02-15 22:16:25'),(9145,338,1,10897,'0.99','2005-08-02 01:23:42','2006-02-15 22:16:25'),(9146,338,2,11064,'4.99','2005-08-02 06:55:17','2006-02-15 22:16:25'),(9147,338,2,11671,'4.99','2005-08-17 05:50:21','2006-02-15 22:16:25'),(9148,338,2,11719,'5.99','2005-08-17 07:46:05','2006-02-15 22:16:25'),(9149,338,1,12167,'2.99','2005-08-18 01:00:02','2006-02-15 22:16:25'),(9150,338,1,13284,'3.99','2005-08-19 18:12:31','2006-02-15 22:16:25'),(9151,338,1,14619,'2.99','2005-08-21 18:10:03','2006-02-15 22:16:26'),(9152,338,2,15105,'0.99','2005-08-22 12:01:33','2006-02-15 22:16:26'),(9153,338,2,15173,'6.99','2005-08-22 15:26:29','2006-02-15 22:16:26'),(9154,339,1,876,'5.99','2005-05-30 05:41:22','2006-02-15 22:16:26'),(9155,339,2,1432,'3.99','2005-06-15 18:27:24','2006-02-15 22:16:26'),(9156,339,1,1536,'4.99','2005-06-16 00:52:22','2006-02-15 22:16:26'),(9157,339,2,1629,'4.99','2005-06-16 07:53:47','2006-02-15 22:16:26'),(9158,339,1,3146,'6.99','2005-06-20 20:21:48','2006-02-15 22:16:26'),(9159,339,1,3335,'4.99','2005-06-21 10:09:08','2006-02-15 22:16:26'),(9160,339,2,3536,'2.99','2005-07-06 01:36:11','2006-02-15 22:16:26'),(9161,339,1,4243,'4.99','2005-07-07 13:39:58','2006-02-15 22:16:26'),(9162,339,1,4467,'0.99','2005-07-08 00:13:52','2006-02-15 22:16:26'),(9163,339,2,4967,'3.99','2005-07-08 23:48:03','2006-02-15 22:16:26'),(9164,339,1,5720,'3.99','2005-07-10 11:09:12','2006-02-15 22:16:26'),(9165,339,1,6072,'6.99','2005-07-11 04:52:40','2006-02-15 22:16:26'),(9166,339,1,6425,'0.99','2005-07-11 23:54:52','2006-02-15 22:16:26'),(9167,339,2,6682,'7.99','2005-07-12 12:12:43','2006-02-15 22:16:26'),(9168,339,2,7244,'2.99','2005-07-27 10:27:33','2006-02-15 22:16:26'),(9169,339,2,7973,'4.99','2005-07-28 14:10:06','2006-02-15 22:16:27'),(9170,339,1,8968,'0.99','2005-07-30 03:57:32','2006-02-15 22:16:27'),(9171,339,2,9208,'5.99','2005-07-30 12:54:03','2006-02-15 22:16:27'),(9172,339,1,9663,'4.99','2005-07-31 06:10:48','2006-02-15 22:16:27'),(9173,339,2,10338,'3.99','2005-08-01 05:03:03','2006-02-15 22:16:27'),(9174,339,2,11171,'4.99','2005-08-02 10:23:41','2006-02-15 22:16:27'),(9175,339,1,11550,'2.99','2005-08-17 01:02:06','2006-02-15 22:16:27'),(9176,339,2,11582,'3.99','2005-08-17 02:03:49','2006-02-15 22:16:27'),(9177,339,2,11699,'5.99','2005-08-17 07:11:58','2006-02-15 22:16:27'),(9178,339,1,12631,'0.99','2005-08-18 17:52:51','2006-02-15 22:16:27'),(9179,339,1,13199,'3.99','2005-08-19 14:53:22','2006-02-15 22:16:27'),(9180,339,1,13575,'5.99','2005-08-20 05:15:20','2006-02-15 22:16:27'),(9181,339,1,13985,'0.99','2005-08-20 19:13:06','2006-02-15 22:16:27'),(9182,339,1,14636,'4.99','2005-08-21 18:59:17','2006-02-15 22:16:27'),(9183,339,2,14758,'3.99','2005-08-21 23:24:52','2006-02-15 22:16:27'),(9184,340,2,1205,'4.99','2005-06-15 02:25:56','2006-02-15 22:16:27'),(9185,340,1,1697,'3.99','2005-06-16 12:55:20','2006-02-15 22:16:27'),(9186,340,1,2177,'5.99','2005-06-18 00:34:45','2006-02-15 22:16:27'),(9187,340,2,2183,'4.99','2005-06-18 01:06:01','2006-02-15 22:16:28'),(9188,340,2,2607,'5.99','2005-06-19 06:55:01','2006-02-15 22:16:28'),(9189,340,1,2653,'5.99','2005-06-19 10:36:53','2006-02-15 22:16:28'),(9190,340,1,3264,'0.99','2005-06-21 04:19:03','2006-02-15 22:16:28'),(9191,340,1,3455,'2.99','2005-06-21 21:17:51','2006-02-15 22:16:28'),(9192,340,2,4475,'2.99','2005-07-08 00:27:30','2006-02-15 22:16:28'),(9193,340,1,4742,'0.99','2005-07-08 13:35:23','2006-02-15 22:16:28'),(9194,340,2,6381,'4.99','2005-07-11 21:58:48','2006-02-15 22:16:28'),(9195,340,2,7617,'2.99','2005-07-28 00:18:40','2006-02-15 22:16:28'),(9196,340,2,8274,'4.99','2005-07-29 01:34:32','2006-02-15 22:16:28'),(9197,340,1,8541,'0.99','2005-07-29 10:55:01','2006-02-15 22:16:28'),(9198,340,2,8551,'4.99','2005-07-29 11:13:11','2006-02-15 22:16:28'),(9199,340,1,8606,'4.99','2005-07-29 13:14:24','2006-02-15 22:16:28'),(9200,340,1,9834,'2.99','2005-07-31 12:05:42','2006-02-15 22:16:28'),(9201,340,1,10292,'2.99','2005-08-01 03:42:40','2006-02-15 22:16:28'),(9202,340,1,10667,'8.99','2005-08-01 16:58:22','2006-02-15 22:16:28'),(9203,340,2,10674,'3.99','2005-08-01 17:11:52','2006-02-15 22:16:28'),(9204,340,1,10809,'0.99','2005-08-01 22:39:27','2006-02-15 22:16:28'),(9205,340,1,10995,'0.99','2005-08-02 04:48:00','2006-02-15 22:16:28'),(9206,340,2,12598,'4.99','2005-08-18 16:34:03','2006-02-15 22:16:29'),(9207,340,2,12908,'1.99','2005-08-19 04:19:05','2006-02-15 22:16:29'),(9208,340,2,12940,'2.99','2005-08-19 05:38:29','2006-02-15 22:16:29'),(9209,340,1,13425,'2.99','2005-08-19 23:11:44','2006-02-15 22:16:29'),(9210,340,1,14457,'4.99','2005-08-21 12:47:38','2006-02-15 22:16:29'),(9211,340,2,14718,'0.99','2005-08-21 21:39:25','2006-02-15 22:16:29'),(9212,340,1,14895,'2.99','2005-08-22 04:19:23','2006-02-15 22:16:29'),(9213,340,2,15306,'2.99','2005-08-22 19:46:36','2006-02-15 22:16:29'),(9214,340,1,15378,'9.99','2005-08-22 22:25:17','2006-02-15 22:16:29'),(9215,341,1,1318,'2.99','2005-06-15 10:34:26','2006-02-15 22:16:29'),(9216,341,2,1520,'7.99','2005-06-15 23:57:20','2006-02-15 22:16:29'),(9217,341,1,1778,'1.99','2005-06-16 18:54:48','2006-02-15 22:16:29'),(9218,341,1,1849,'7.99','2005-06-17 00:13:19','2006-02-15 22:16:29'),(9219,341,2,2829,'2.99','2005-06-19 21:11:30','2006-02-15 22:16:29'),(9220,341,2,3130,'7.99','2005-06-20 19:03:22','2006-02-15 22:16:29'),(9221,341,1,3382,'5.99','2005-06-21 14:05:23','2006-02-15 22:16:29'),(9222,341,2,3938,'4.99','2005-07-06 21:15:45','2006-02-15 22:16:29'),(9223,341,1,4624,'2.99','2005-07-08 08:12:17','2006-02-15 22:16:29'),(9224,341,2,5487,'4.99','2005-07-10 00:01:50','2006-02-15 22:16:30'),(9225,341,2,5931,'0.99','2005-07-10 22:04:19','2006-02-15 22:16:30'),(9226,341,2,7473,'2.99','2005-07-27 19:05:40','2006-02-15 22:16:30'),(9227,341,1,8661,'2.99','2005-07-29 15:28:24','2006-02-15 22:16:30'),(9228,341,1,8728,'9.99','2005-07-29 18:12:49','2006-02-15 22:16:30'),(9229,341,2,10605,'0.99','2005-08-01 14:36:26','2006-02-15 22:16:30'),(9230,341,1,11305,'6.99','2005-08-02 15:44:55','2006-02-15 22:16:30'),(9231,341,1,11723,'2.99','2005-08-17 07:56:22','2006-02-15 22:16:30'),(9232,341,2,13059,'0.99','2005-08-19 09:42:01','2006-02-15 22:16:30'),(9233,341,2,13074,'8.99','2005-08-19 10:06:53','2006-02-15 22:16:30'),(9234,341,2,13806,'4.99','2005-08-20 12:53:46','2006-02-15 22:16:30'),(9235,341,2,14344,'4.99','2005-08-21 08:40:56','2006-02-15 22:16:30'),(9236,341,2,15030,'0.99','2005-08-22 09:10:21','2006-02-15 22:16:30'),(9237,341,2,15938,'6.99','2005-08-23 18:43:31','2006-02-15 22:16:30'),(9238,342,2,2190,'5.99','2005-06-18 01:29:51','2006-02-15 22:16:30'),(9239,342,1,2914,'5.99','2005-06-20 03:43:18','2006-02-15 22:16:30'),(9240,342,1,3081,'2.99','2005-06-20 15:29:13','2006-02-15 22:16:30'),(9241,342,1,5617,'0.99','2005-07-10 05:28:50','2006-02-15 22:16:30'),(9242,342,2,6060,'4.99','2005-07-11 04:06:17','2006-02-15 22:16:31'),(9243,342,2,6429,'8.99','2005-07-12 00:02:50','2006-02-15 22:16:31'),(9244,342,1,6736,'2.99','2005-07-12 14:16:50','2006-02-15 22:16:31'),(9245,342,2,6787,'7.99','2005-07-12 16:33:28','2006-02-15 22:16:31'),(9246,342,2,6997,'0.99','2005-07-27 01:14:02','2006-02-15 22:16:31'),(9247,342,2,7280,'2.99','2005-07-27 11:50:52','2006-02-15 22:16:31'),(9248,342,1,9164,'2.99','2005-07-30 11:24:14','2006-02-15 22:16:31'),(9249,342,1,9526,'0.99','2005-07-31 01:02:22','2006-02-15 22:16:31'),(9250,342,2,9948,'5.99','2005-07-31 15:49:41','2006-02-15 22:16:31'),(9251,342,1,9955,'0.99','2005-07-31 16:01:26','2006-02-15 22:16:32'),(9252,342,2,9956,'4.99','2005-07-31 16:03:47','2006-02-15 22:16:32'),(9253,342,1,10242,'4.99','2005-08-01 02:18:12','2006-02-15 22:16:32'),(9254,342,2,11178,'2.99','2005-08-02 10:48:10','2006-02-15 22:16:32'),(9255,342,2,11446,'0.99','2005-08-02 20:33:37','2006-02-15 22:16:32'),(9256,342,1,11568,'0.99','2005-08-17 01:30:01','2006-02-15 22:16:32'),(9257,342,1,12139,'6.99','2005-08-17 23:57:13','2006-02-15 22:16:32'),(9258,342,1,12404,'4.99','2005-08-18 09:36:34','2006-02-15 22:16:32'),(9259,342,1,12522,'2.99','2005-08-18 13:45:40','2006-02-15 22:16:32'),(9260,342,2,12816,'4.99','2005-08-19 01:04:05','2006-02-15 22:16:32'),(9261,342,2,13368,'4.99','2005-08-19 21:19:35','2006-02-15 22:16:32'),(9262,342,2,13637,'4.99','2005-08-20 07:21:15','2006-02-15 22:16:32'),(9263,342,1,13755,'2.99','2005-08-20 11:18:53','2006-02-15 22:16:32'),(9264,342,2,13827,'4.99','2005-08-20 13:47:19','2006-02-15 22:16:32'),(9265,342,2,14096,'2.99','2005-08-21 00:27:46','2006-02-15 22:16:32'),(9266,342,2,14299,'0.99','2005-08-21 07:18:57','2006-02-15 22:16:32'),(9267,342,2,14683,'8.99','2005-08-21 20:27:44','2006-02-15 22:16:32'),(9268,342,1,15484,'4.99','2005-08-23 02:04:49','2006-02-15 22:16:32'),(9269,342,1,15895,'3.99','2005-08-23 17:09:31','2006-02-15 22:16:32'),(9270,343,2,102,'3.99','2005-05-25 17:22:10','2006-02-15 22:16:32'),(9271,343,1,455,'3.99','2005-05-27 19:43:29','2006-02-15 22:16:32'),(9272,343,2,1547,'4.99','2005-06-16 01:42:24','2006-02-15 22:16:33'),(9273,343,1,1564,'6.99','2005-06-16 02:47:07','2006-02-15 22:16:33'),(9274,343,2,1879,'0.99','2005-06-17 02:57:34','2006-02-15 22:16:33'),(9275,343,2,1922,'0.99','2005-06-17 06:04:25','2006-02-15 22:16:33'),(9276,343,2,2461,'6.99','2005-06-18 19:58:12','2006-02-15 22:16:33'),(9277,343,1,2980,'8.99','2005-06-20 08:35:03','2006-02-15 22:16:33'),(9278,343,1,3407,'0.99','2005-06-21 16:14:02','2006-02-15 22:16:33'),(9279,343,1,3978,'5.99','2005-07-06 23:04:33','2006-02-15 22:16:33'),(9280,343,1,4472,'7.99','2005-07-08 00:22:06','2006-02-15 22:16:33'),(9281,343,2,5097,'4.99','2005-07-09 06:09:51','2006-02-15 22:16:33'),(9282,343,1,5337,'3.99','2005-07-09 17:03:50','2006-02-15 22:16:33'),(9283,343,1,7069,'6.99','2005-07-27 03:59:35','2006-02-15 22:16:33'),(9284,343,2,8012,'5.99','2005-07-28 15:29:00','2006-02-15 22:16:33'),(9285,343,2,8088,'9.99','2005-07-28 18:23:49','2006-02-15 22:16:33'),(9286,343,2,9458,'5.99','2005-07-30 22:24:34','2006-02-15 22:16:33'),(9287,343,2,9739,'2.99','2005-07-31 09:08:03','2006-02-15 22:16:33'),(9288,343,1,10822,'0.99','2005-08-01 22:54:28','2006-02-15 22:16:33'),(9289,343,1,11212,'0.99','2005-08-02 12:18:29','2006-02-15 22:16:33'),(9290,343,2,11570,'2.99','2005-08-17 01:34:32','2006-02-15 22:16:33'),(9291,343,2,13279,'4.99','2005-08-19 18:02:18','2006-02-15 22:16:33'),(9292,343,2,13522,'3.99','2005-08-20 02:44:06','2006-02-15 22:16:33'),(9293,343,2,13866,'0.99','2005-08-20 15:05:29','2006-02-15 22:16:33'),(9294,343,2,15973,'5.99','2005-08-23 20:04:41','2006-02-15 22:16:34'),(9295,344,2,157,'2.99','2005-05-26 01:25:21','2006-02-15 22:16:34'),(9296,344,2,813,'5.99','2005-05-29 20:14:34','2006-02-15 22:16:34'),(9297,344,1,1341,'3.99','2005-06-15 12:26:18','2006-02-15 22:16:34'),(9298,344,2,1475,'4.99','2005-06-15 21:08:01','2006-02-15 22:16:34'),(9299,344,1,1731,'0.99','2005-06-16 15:32:12','2006-02-15 22:16:34'),(9300,344,2,4028,'5.99','2005-07-07 02:19:14','2006-02-15 22:16:34'),(9301,344,2,4347,'3.99','2005-07-07 18:58:57','2006-02-15 22:16:34'),(9302,344,2,6363,'5.99','2005-07-11 21:13:19','2006-02-15 22:16:34'),(9303,344,2,7480,'4.99','2005-07-27 19:19:53','2006-02-15 22:16:34'),(9304,344,2,8561,'2.99','2005-07-29 11:29:12','2006-02-15 22:16:34'),(9305,344,2,9788,'4.99','2005-07-31 10:28:21','2006-02-15 22:16:34'),(9306,344,2,11116,'5.99','2005-08-02 08:34:40','2006-02-15 22:16:34'),(9307,344,2,12183,'5.99','2005-08-18 01:34:13','2006-02-15 22:16:34'),(9308,344,2,13014,'4.99','2005-08-19 07:56:08','2006-02-15 22:16:34'),(9309,344,1,13033,'3.99','2005-08-19 08:34:39','2006-02-15 22:16:34'),(9310,344,1,14621,'0.99','2005-08-21 18:17:59','2006-02-15 22:16:34'),(9311,344,2,14624,'0.99','2005-08-21 18:32:42','2006-02-15 22:16:34'),(9312,344,1,15215,'2.99','2005-08-22 16:55:26','2006-02-15 22:16:34'),(9313,345,1,206,'0.99','2005-05-26 08:01:54','2006-02-15 22:16:34'),(9314,345,1,363,'0.99','2005-05-27 07:14:00','2006-02-15 22:16:34'),(9315,345,2,1210,'0.99','2005-06-15 02:57:51','2006-02-15 22:16:34'),(9316,345,1,1457,'4.99','2005-06-15 20:05:49','2006-02-15 22:16:34'),(9317,345,2,1550,'0.99','2005-06-16 01:58:35','2006-02-15 22:16:35'),(9318,345,2,2766,'4.99','2005-06-19 17:45:15','2006-02-15 22:16:35'),(9319,345,2,4422,'2.99','2005-07-07 22:09:45','2006-02-15 22:16:35'),(9320,345,1,4425,'2.99','2005-07-07 22:22:44','2006-02-15 22:16:35'),(9321,345,2,4450,'4.99','2005-07-07 23:20:05','2006-02-15 22:16:35'),(9322,345,2,5508,'3.99','2005-07-10 00:50:01','2006-02-15 22:16:35'),(9323,345,1,6307,'7.99','2005-07-11 18:04:29','2006-02-15 22:16:35'),(9324,345,1,7092,'6.99','2005-07-27 04:46:00','2006-02-15 22:16:35'),(9325,345,2,8129,'2.99','2005-07-28 19:47:02','2006-02-15 22:16:35'),(9326,345,2,8694,'8.99','2005-07-29 16:44:48','2006-02-15 22:16:35'),(9327,345,1,9163,'4.99','2005-07-30 11:23:22','2006-02-15 22:16:35'),(9328,345,2,9207,'2.99','2005-07-30 12:49:57','2006-02-15 22:16:35'),(9329,345,2,10215,'8.99','2005-08-01 01:04:28','2006-02-15 22:16:35'),(9330,345,2,10982,'4.99','2005-08-02 04:19:11','2006-02-15 22:16:35'),(9331,345,1,11865,'2.99','2005-08-17 14:03:46','2006-02-15 22:16:35'),(9332,345,1,12485,'4.99','2005-08-18 12:41:41','2006-02-15 22:16:35'),(9333,345,2,12805,'4.99','2005-08-19 00:36:34','2006-02-15 22:16:35'),(9334,345,1,14702,'10.99','2005-08-21 21:00:03','2006-02-15 22:16:35'),(9335,345,1,15551,'4.99','2005-08-23 04:28:25','2006-02-15 22:16:35'),(9336,346,1,65,'4.99','2005-05-25 09:32:03','2006-02-15 22:16:35'),(9337,346,1,810,'4.99','2005-05-29 19:12:04','2006-02-15 22:16:35'),(9338,346,1,1994,'5.99','2005-06-17 11:07:06','2006-02-15 22:16:35'),(9339,346,2,3372,'2.99','2005-06-21 13:34:19','2006-02-15 22:16:36'),(9340,346,1,3421,'2.99','2005-06-21 17:22:58','2006-02-15 22:16:36'),(9341,346,2,4420,'4.99','2005-07-07 22:07:31','2006-02-15 22:16:36'),(9342,346,1,4958,'8.99','2005-07-08 23:19:52','2006-02-15 22:16:36'),(9343,346,1,5428,'4.99','2005-07-09 21:12:50','2006-02-15 22:16:36'),(9344,346,2,5557,'4.99','2005-07-10 03:10:21','2006-02-15 22:16:36'),(9345,346,2,6136,'4.99','2005-07-11 08:34:09','2006-02-15 22:16:36'),(9346,346,2,6323,'2.99','2005-07-11 19:02:19','2006-02-15 22:16:36'),(9347,346,2,6881,'8.99','2005-07-12 20:46:35','2006-02-15 22:16:36'),(9348,346,2,7943,'6.99','2005-07-28 12:50:55','2006-02-15 22:16:36'),(9349,346,2,8272,'5.99','2005-07-29 01:29:51','2006-02-15 22:16:36'),(9350,346,1,8505,'6.99','2005-07-29 09:22:52','2006-02-15 22:16:36'),(9351,346,2,8543,'0.99','2005-07-29 11:01:57','2006-02-15 22:16:36'),(9352,346,2,8732,'8.99','2005-07-29 18:25:03','2006-02-15 22:16:36'),(9353,346,2,9566,'4.99','2005-07-31 02:32:10','2006-02-15 22:16:36'),(9354,346,1,9848,'4.99','2005-07-31 12:44:33','2006-02-15 22:16:36'),(9355,346,1,9927,'2.99','2005-07-31 15:12:13','2006-02-15 22:16:36'),(9356,346,1,10304,'5.99','2005-08-01 04:14:12','2006-02-15 22:16:36'),(9357,346,2,10389,'3.99','2005-08-01 06:46:43','2006-02-15 22:16:36'),(9358,346,2,10521,'0.99','2005-08-01 11:46:17','2006-02-15 22:16:36'),(9359,346,2,11062,'4.99','2005-08-02 06:52:54','2006-02-15 22:16:36'),(9360,346,1,11375,'4.99','2005-08-02 18:14:56','2006-02-15 22:16:36'),(9361,346,2,11470,'2.99','2005-08-02 21:48:28','2006-02-15 22:16:37'),(9362,346,1,14890,'5.99','2005-08-22 04:10:49','2006-02-15 22:16:37'),(9363,346,2,15459,'2.99','2005-08-23 01:09:48','2006-02-15 22:16:37'),(9364,346,1,15535,'0.99','2005-08-23 03:58:02','2006-02-15 22:16:37'),(9365,346,1,15661,'8.99','2005-08-23 08:52:03','2006-02-15 22:16:37'),(9366,346,2,15825,'5.99','2005-08-23 15:10:42','2006-02-15 22:16:37'),(9367,346,1,15827,'0.99','2005-08-23 15:15:19','2006-02-15 22:16:37'),(9368,347,2,1711,'8.99','2005-06-16 14:11:52','2006-02-15 22:16:37'),(9369,347,2,2274,'0.99','2005-06-18 06:31:15','2006-02-15 22:16:37'),(9370,347,1,3026,'4.99','2005-06-20 11:48:00','2006-02-15 22:16:37'),(9371,347,1,3092,'8.99','2005-06-20 16:04:42','2006-02-15 22:16:37'),(9372,347,1,3326,'7.99','2005-06-21 09:04:50','2006-02-15 22:16:37'),(9373,347,2,3605,'0.99','2005-07-06 05:27:15','2006-02-15 22:16:37'),(9374,347,2,3666,'4.99','2005-07-06 08:27:43','2006-02-15 22:16:37'),(9375,347,1,4232,'5.99','2005-07-07 12:49:12','2006-02-15 22:16:37'),(9376,347,1,4523,'6.99','2005-07-08 03:06:59','2006-02-15 22:16:37'),(9377,347,2,5471,'0.99','2005-07-09 23:11:52','2006-02-15 22:16:37'),(9378,347,1,5819,'2.99','2005-07-10 15:56:20','2006-02-15 22:16:37'),(9379,347,2,6121,'1.99','2005-07-11 07:55:27','2006-02-15 22:16:37'),(9380,347,1,7811,'0.99','2005-07-28 08:06:01','2006-02-15 22:16:37'),(9381,347,2,8148,'4.99','2005-07-28 20:39:47','2006-02-15 22:16:37'),(9382,347,2,8153,'4.99','2005-07-28 20:55:49','2006-02-15 22:16:37'),(9383,347,2,8176,'4.99','2005-07-28 21:42:08','2006-02-15 22:16:37'),(9384,347,2,8378,'4.99','2005-07-29 05:28:35','2006-02-15 22:16:38'),(9385,347,2,8771,'2.99','2005-07-29 19:54:41','2006-02-15 22:16:38'),(9386,347,1,9013,'4.99','2005-07-30 05:19:20','2006-02-15 22:16:38'),(9387,347,1,9582,'4.99','2005-07-31 03:05:19','2006-02-15 22:16:38'),(9388,347,1,9856,'3.99','2005-07-31 13:00:35','2006-02-15 22:16:38'),(9389,347,1,9876,'2.99','2005-07-31 13:37:51','2006-02-15 22:16:38'),(9390,347,2,11738,'8.99','2005-08-17 08:45:55','2006-02-15 22:16:38'),(9391,347,1,12195,'2.99','2005-08-18 02:07:49','2006-02-15 22:16:38'),(9392,347,2,12399,'10.99','2005-08-18 09:13:42','2006-02-15 22:16:38'),(9393,347,2,13314,'5.99','2005-08-19 19:12:43','2006-02-15 22:16:38'),(9394,347,2,14894,'4.99','2005-08-22 04:16:56','2006-02-15 22:16:38'),(9395,347,2,14958,'2.99','2005-08-22 06:30:10','2006-02-15 22:16:38'),(9396,347,2,15426,'2.99','2005-08-23 00:07:19','2006-02-15 22:16:38'),(9397,347,2,15555,'4.99','2005-08-23 04:51:52','2006-02-15 22:16:38'),(9398,348,2,153,'0.99','2005-05-26 00:47:47','2006-02-15 22:16:38'),(9399,348,2,821,'0.99','2005-05-29 21:31:12','2006-02-15 22:16:38'),(9400,348,1,1654,'2.99','2005-06-16 09:42:48','2006-02-15 22:16:38'),(9401,348,1,2041,'8.99','2005-06-17 14:19:00','2006-02-15 22:16:38'),(9402,348,2,2499,'0.99','2005-06-18 23:01:36','2006-02-15 22:16:38'),(9403,348,2,3494,'4.99','2005-07-05 23:47:30','2006-02-15 22:16:38'),(9404,348,2,3610,'4.99','2005-07-06 05:36:59','2006-02-15 22:16:38'),(9405,348,2,4556,'9.99','2005-07-08 04:48:41','2006-02-15 22:16:38'),(9406,348,2,4633,'0.99','2005-07-08 08:39:39','2006-02-15 22:16:39'),(9407,348,1,4699,'0.99','2005-07-08 11:36:56','2006-02-15 22:16:39'),(9408,348,1,4807,'8.99','2005-07-08 17:01:48','2006-02-15 22:16:39'),(9409,348,1,5345,'4.99','2005-07-09 17:28:18','2006-02-15 22:16:39'),(9410,348,2,5965,'0.99','2005-07-10 23:51:52','2006-02-15 22:16:39'),(9411,348,2,6776,'2.99','2005-07-12 16:02:09','2006-02-15 22:16:39'),(9412,348,2,7380,'2.99','2005-07-27 15:37:01','2006-02-15 22:16:39'),(9413,348,1,7482,'6.99','2005-07-27 19:24:16','2006-02-15 22:16:39'),(9414,348,2,7825,'4.99','2005-07-28 08:34:57','2006-02-15 22:16:39'),(9415,348,1,8500,'2.99','2005-07-29 09:12:01','2006-02-15 22:16:39'),(9416,348,1,8569,'4.99','2005-07-29 11:39:17','2006-02-15 22:16:39'),(9417,348,2,8682,'4.99','2005-07-29 16:15:26','2006-02-15 22:16:39'),(9418,348,2,9482,'2.99','2005-07-30 23:29:16','2006-02-15 22:16:39'),(9419,348,1,10769,'2.99','2005-08-01 20:43:02','2006-02-15 22:16:39'),(9420,348,2,10972,'2.99','2005-08-02 04:08:25','2006-02-15 22:16:39'),(9421,348,1,11262,'2.99','2005-08-02 13:58:55','2006-02-15 22:16:39'),(9422,348,1,11429,'7.99','2005-08-02 20:03:52','2006-02-15 22:16:39'),(9423,348,2,12564,'2.99','2005-08-18 15:11:35','2006-02-15 22:16:39'),(9424,348,2,12884,'5.99','2005-08-19 03:34:04','2006-02-15 22:16:39'),(9425,348,2,12937,'4.99','2005-08-19 05:25:30','2006-02-15 22:16:39'),(9426,348,2,13238,'2.99','2005-08-19 16:20:56','2006-02-15 22:16:39'),(9427,348,2,13602,'5.99','2005-08-20 06:02:02','2006-02-15 22:16:39'),(9428,348,2,13684,'0.99','2005-08-20 08:55:53','2006-02-15 22:16:40'),(9429,348,1,13962,'1.99','2005-08-20 18:18:06','2006-02-15 22:16:40'),(9430,348,2,14079,'3.99','2005-08-20 23:29:25','2006-02-15 22:16:40'),(9431,348,2,14937,'7.99','2005-08-22 05:51:59','2006-02-15 22:16:40'),(9432,348,2,15817,'0.99','2005-08-23 14:59:51','2006-02-15 22:16:40'),(9433,348,1,15944,'4.99','2005-08-23 18:50:54','2006-02-15 22:16:40'),(9434,349,1,890,'4.99','2005-05-30 07:43:04','2006-02-15 22:16:40'),(9435,349,1,1197,'2.99','2005-06-15 01:42:46','2006-02-15 22:16:40'),(9436,349,1,1523,'0.99','2005-06-16 00:18:40','2006-02-15 22:16:40'),(9437,349,2,2987,'6.99','2005-06-20 08:55:50','2006-02-15 22:16:40'),(9438,349,1,3067,'8.99','2005-06-20 13:59:21','2006-02-15 22:16:40'),(9439,349,2,3488,'3.99','2005-07-05 23:32:49','2006-02-15 22:16:40'),(9440,349,1,4190,'2.99','2005-07-07 10:52:39','2006-02-15 22:16:40'),(9441,349,2,4494,'5.99','2005-07-08 01:42:45','2006-02-15 22:16:40'),(9442,349,1,4881,'0.99','2005-07-08 19:40:34','2006-02-15 22:16:40'),(9443,349,1,5433,'4.99','2005-07-09 21:22:00','2006-02-15 22:16:40'),(9444,349,1,7002,'4.99','2005-07-27 01:26:14','2006-02-15 22:16:40'),(9445,349,1,7046,'4.99','2005-07-27 03:27:56','2006-02-15 22:16:40'),(9446,349,2,7702,'2.99','2005-07-28 03:56:05','2006-02-15 22:16:40'),(9447,349,2,8297,'4.99','2005-07-29 02:45:46','2006-02-15 22:16:40'),(9448,349,1,9262,'1.99','2005-07-30 14:45:02','2006-02-15 22:16:40'),(9449,349,1,9670,'5.99','2005-07-31 06:33:33','2006-02-15 22:16:40'),(9450,349,1,9731,'0.99','2005-07-31 08:54:47','2006-02-15 22:16:41'),(9451,349,1,10987,'4.99','2005-08-02 04:36:52','2006-02-15 22:16:41'),(9452,349,2,11192,'4.99','2005-08-02 11:29:41','2006-02-15 22:16:41'),(9453,349,2,11492,'8.99','2005-08-02 22:46:47','2006-02-15 22:16:41'),(9454,349,1,11905,'3.99','2005-08-17 15:40:18','2006-02-15 22:16:41'),(9455,349,1,13258,'4.99','2005-08-19 17:05:37','2006-02-15 22:16:41'),(9456,349,2,13636,'4.99','2005-08-20 07:20:09','2006-02-15 22:16:41'),(9457,349,2,14200,'6.99','2005-08-21 03:51:27','2006-02-15 22:16:41'),(9458,349,2,14721,'6.99','2005-08-21 21:50:51','2006-02-15 22:16:41'),(9459,349,2,14908,'4.99','2005-08-22 04:44:10','2006-02-15 22:16:41'),(9460,349,1,15833,'6.99','2005-08-23 15:22:15','2006-02-15 22:16:41'),(9461,349,1,15955,'5.99','2005-08-23 19:19:06','2006-02-15 22:16:41'),(9462,349,1,14915,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:41'),(9463,350,1,24,'4.99','2005-05-25 02:53:02','2006-02-15 22:16:41'),(9464,350,1,802,'4.99','2005-05-29 17:38:59','2006-02-15 22:16:41'),(9465,350,2,2011,'3.99','2005-06-17 11:56:09','2006-02-15 22:16:41'),(9466,350,1,2619,'0.99','2005-06-19 08:03:12','2006-02-15 22:16:41'),(9467,350,1,3079,'2.99','2005-06-20 15:13:40','2006-02-15 22:16:41'),(9468,350,2,3206,'0.99','2005-06-21 00:39:39','2006-02-15 22:16:41'),(9469,350,1,3529,'0.99','2005-07-06 01:15:26','2006-02-15 22:16:41'),(9470,350,1,3893,'5.99','2005-07-06 18:59:31','2006-02-15 22:16:41'),(9471,350,1,4767,'2.99','2005-07-08 15:18:53','2006-02-15 22:16:41'),(9472,350,1,5240,'0.99','2005-07-09 13:14:48','2006-02-15 22:16:42'),(9473,350,1,5303,'2.99','2005-07-09 15:44:09','2006-02-15 22:16:42'),(9474,350,1,5786,'1.99','2005-07-10 14:06:44','2006-02-15 22:16:42'),(9475,350,2,6408,'3.99','2005-07-11 23:03:02','2006-02-15 22:16:42'),(9476,350,2,7416,'4.99','2005-07-27 16:55:25','2006-02-15 22:16:42'),(9477,350,2,11504,'0.99','2005-08-16 23:16:46','2006-02-15 22:16:42'),(9478,350,2,11595,'6.99','2005-08-17 02:53:14','2006-02-15 22:16:42'),(9479,350,2,11692,'6.99','2005-08-17 06:52:41','2006-02-15 22:16:42'),(9480,350,1,11800,'0.99','2005-08-17 11:29:52','2006-02-15 22:16:42'),(9481,350,2,12252,'6.99','2005-08-18 03:59:51','2006-02-15 22:16:42'),(9482,350,2,12445,'2.99','2005-08-18 10:56:20','2006-02-15 22:16:42'),(9483,350,2,13086,'0.99','2005-08-19 10:32:28','2006-02-15 22:16:42'),(9484,350,2,15789,'1.99','2005-08-23 13:56:40','2006-02-15 22:16:42'),(9485,350,1,15807,'0.99','2005-08-23 14:35:10','2006-02-15 22:16:42'),(9486,351,1,1137,'1.99','2005-05-31 19:20:14','2006-02-15 22:16:42'),(9487,351,2,1792,'5.99','2005-06-16 20:04:50','2006-02-15 22:16:42'),(9488,351,1,1869,'0.99','2005-06-17 02:08:00','2006-02-15 22:16:42'),(9489,351,1,2759,'2.99','2005-06-19 17:10:24','2006-02-15 22:16:42'),(9490,351,1,3836,'2.99','2005-07-06 16:26:04','2006-02-15 22:16:42'),(9491,351,1,4544,'0.99','2005-07-08 04:11:04','2006-02-15 22:16:42'),(9492,351,1,4756,'1.99','2005-07-08 14:24:00','2006-02-15 22:16:42'),(9493,351,2,4761,'5.99','2005-07-08 14:51:45','2006-02-15 22:16:42'),(9494,351,1,5280,'0.99','2005-07-09 14:55:07','2006-02-15 22:16:43'),(9495,351,1,5912,'3.99','2005-07-10 20:58:22','2006-02-15 22:16:43'),(9496,351,2,6180,'3.99','2005-07-11 11:06:50','2006-02-15 22:16:43'),(9497,351,1,6664,'4.99','2005-07-12 11:28:22','2006-02-15 22:16:43'),(9498,351,2,6777,'5.99','2005-07-12 16:04:40','2006-02-15 22:16:43'),(9499,351,2,7630,'4.99','2005-07-28 01:01:03','2006-02-15 22:16:43'),(9500,351,2,8512,'4.99','2005-07-29 09:48:03','2006-02-15 22:16:43'),(9501,351,1,9707,'7.99','2005-07-31 07:44:18','2006-02-15 22:16:43'),(9502,351,2,10119,'0.99','2005-07-31 21:20:59','2006-02-15 22:16:43'),(9503,351,2,10501,'2.99','2005-08-01 11:04:46','2006-02-15 22:16:43'),(9504,351,2,11127,'0.99','2005-08-02 09:00:59','2006-02-15 22:16:43'),(9505,351,1,14368,'6.99','2005-08-21 09:31:47','2006-02-15 22:16:43'),(9506,351,2,15142,'4.99','2005-08-22 13:44:32','2006-02-15 22:16:43'),(9507,351,1,15664,'4.99','2005-08-23 08:57:11','2006-02-15 22:16:43'),(9508,351,2,15712,'2.99','2005-08-23 10:43:56','2006-02-15 22:16:43'),(9509,351,1,15762,'2.99','2005-08-23 13:01:43','2006-02-15 22:16:43'),(9510,352,1,784,'2.99','2005-05-29 14:44:22','2006-02-15 22:16:43'),(9511,352,1,1498,'0.99','2005-06-15 21:58:00','2006-02-15 22:16:43'),(9512,352,1,1649,'4.99','2005-06-16 09:20:33','2006-02-15 22:16:43'),(9513,352,1,1678,'4.99','2005-06-16 11:08:28','2006-02-15 22:16:43'),(9514,352,1,1780,'4.99','2005-06-16 19:11:45','2006-02-15 22:16:43'),(9515,352,2,3331,'4.99','2005-06-21 09:37:53','2006-02-15 22:16:43'),(9516,352,2,4116,'4.99','2005-07-07 06:56:13','2006-02-15 22:16:44'),(9517,352,2,6329,'5.99','2005-07-11 19:10:38','2006-02-15 22:16:44'),(9518,352,1,7033,'2.99','2005-07-27 03:03:25','2006-02-15 22:16:44'),(9519,352,1,7419,'7.99','2005-07-27 17:04:15','2006-02-15 22:16:44'),(9520,352,2,7512,'6.99','2005-07-27 20:40:40','2006-02-15 22:16:44'),(9521,352,1,7579,'4.99','2005-07-27 23:06:41','2006-02-15 22:16:44'),(9522,352,1,7845,'5.99','2005-07-28 09:18:07','2006-02-15 22:16:44'),(9523,352,1,7886,'2.99','2005-07-28 10:37:55','2006-02-15 22:16:44'),(9524,352,1,9463,'0.99','2005-07-30 22:30:57','2006-02-15 22:16:44'),(9525,352,1,11793,'5.99','2005-08-17 11:05:53','2006-02-15 22:16:44'),(9526,352,1,11823,'6.99','2005-08-17 12:36:37','2006-02-15 22:16:44'),(9527,352,2,11986,'0.99','2005-08-17 18:21:58','2006-02-15 22:16:44'),(9528,352,2,12234,'5.99','2005-08-18 03:17:33','2006-02-15 22:16:44'),(9529,352,1,12751,'2.99','2005-08-18 22:33:22','2006-02-15 22:16:44'),(9530,352,1,14130,'4.99','2005-08-21 01:43:11','2006-02-15 22:16:44'),(9531,352,2,14852,'0.99','2005-08-22 02:25:53','2006-02-15 22:16:44'),(9532,352,2,13578,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:44'),(9533,353,2,1103,'6.99','2005-05-31 14:24:18','2006-02-15 22:16:44'),(9534,353,2,1359,'2.99','2005-06-15 13:30:30','2006-02-15 22:16:44'),(9535,353,2,1928,'7.99','2005-06-17 06:48:31','2006-02-15 22:16:44'),(9536,353,2,3233,'6.99','2005-06-21 02:39:31','2006-02-15 22:16:44'),(9537,353,2,4380,'5.99','2005-07-07 20:35:00','2006-02-15 22:16:44'),(9538,353,2,6559,'1.99','2005-07-12 05:20:35','2006-02-15 22:16:45'),(9539,353,1,6610,'3.99','2005-07-12 08:20:02','2006-02-15 22:16:45'),(9540,353,2,7993,'3.99','2005-07-28 14:56:41','2006-02-15 22:16:45'),(9541,353,2,10071,'2.99','2005-07-31 19:49:35','2006-02-15 22:16:45'),(9542,353,1,11186,'0.99','2005-08-02 11:12:08','2006-02-15 22:16:45'),(9543,353,2,11414,'4.99','2005-08-02 19:43:07','2006-02-15 22:16:45'),(9544,353,2,11698,'4.99','2005-08-17 07:09:59','2006-02-15 22:16:45'),(9545,353,1,12928,'5.99','2005-08-19 05:04:09','2006-02-15 22:16:45'),(9546,353,2,13604,'0.99','2005-08-20 06:03:33','2006-02-15 22:16:45'),(9547,353,1,14396,'4.99','2005-08-21 10:24:54','2006-02-15 22:16:45'),(9548,353,1,15564,'1.99','2005-08-23 05:10:42','2006-02-15 22:16:45'),(9549,353,2,15650,'0.99','2005-08-23 08:29:53','2006-02-15 22:16:45'),(9550,353,2,15676,'2.99','2005-08-23 09:23:08','2006-02-15 22:16:45'),(9551,354,1,140,'0.99','2005-05-25 23:34:22','2006-02-15 22:16:45'),(9552,354,2,158,'1.99','2005-05-26 01:27:11','2006-02-15 22:16:45'),(9553,354,2,402,'0.99','2005-05-27 13:17:18','2006-02-15 22:16:45'),(9554,354,1,1491,'0.99','2005-06-15 21:48:18','2006-02-15 22:16:45'),(9555,354,1,2275,'4.99','2005-06-18 06:31:29','2006-02-15 22:16:45'),(9556,354,1,2769,'6.99','2005-06-19 17:52:14','2006-02-15 22:16:45'),(9557,354,1,3139,'2.99','2005-06-20 19:44:45','2006-02-15 22:16:45'),(9558,354,2,3821,'2.99','2005-07-06 15:36:20','2006-02-15 22:16:45'),(9559,354,2,4034,'0.99','2005-07-07 02:36:33','2006-02-15 22:16:45'),(9560,354,1,4449,'5.99','2005-07-07 23:18:58','2006-02-15 22:16:46'),(9561,354,2,4745,'2.99','2005-07-08 13:45:09','2006-02-15 22:16:46'),(9562,354,1,5354,'4.99','2005-07-09 18:04:33','2006-02-15 22:16:46'),(9563,354,2,5556,'4.99','2005-07-10 03:10:17','2006-02-15 22:16:46'),(9564,354,1,5873,'3.99','2005-07-10 19:02:10','2006-02-15 22:16:46'),(9565,354,1,6054,'0.99','2005-07-11 03:58:39','2006-02-15 22:16:46'),(9566,354,1,6838,'4.99','2005-07-12 19:01:30','2006-02-15 22:16:46'),(9567,354,1,6926,'0.99','2005-07-26 22:52:45','2006-02-15 22:16:46'),(9568,354,1,6939,'5.99','2005-07-26 23:17:51','2006-02-15 22:16:46'),(9569,354,2,7148,'0.99','2005-07-27 07:04:09','2006-02-15 22:16:46'),(9570,354,2,7235,'2.99','2005-07-27 10:09:30','2006-02-15 22:16:46'),(9571,354,2,7241,'0.99','2005-07-27 10:25:49','2006-02-15 22:16:46'),(9572,354,2,8321,'4.99','2005-07-29 03:50:54','2006-02-15 22:16:46'),(9573,354,2,8477,'8.99','2005-07-29 08:40:36','2006-02-15 22:16:46'),(9574,354,1,8609,'4.99','2005-07-29 13:19:25','2006-02-15 22:16:46'),(9575,354,2,8921,'0.99','2005-07-30 02:04:02','2006-02-15 22:16:46'),(9576,354,1,9130,'2.99','2005-07-30 09:55:10','2006-02-15 22:16:46'),(9577,354,1,10420,'6.99','2005-08-01 08:13:53','2006-02-15 22:16:46'),(9578,354,2,12243,'6.99','2005-08-18 03:38:54','2006-02-15 22:16:46'),(9579,354,1,12544,'3.99','2005-08-18 14:25:51','2006-02-15 22:16:46'),(9580,354,1,12998,'4.99','2005-08-19 07:32:16','2006-02-15 22:16:46'),(9581,354,2,14212,'2.99','2005-08-21 04:29:26','2006-02-15 22:16:47'),(9582,354,2,14245,'0.99','2005-08-21 05:30:54','2006-02-15 22:16:47'),(9583,354,1,14840,'5.99','2005-08-22 01:58:42','2006-02-15 22:16:47'),(9584,354,2,15956,'0.99','2005-08-23 19:19:21','2006-02-15 22:16:47'),(9585,354,1,12759,'7.98','2006-02-14 15:16:03','2006-02-15 22:16:47'),(9586,354,1,11782,'0.00','2006-02-14 15:16:03','2006-02-15 22:16:47'),(9587,355,1,1110,'3.99','2005-05-31 15:22:51','2006-02-15 22:16:47'),(9588,355,2,1488,'0.99','2005-06-15 21:39:54','2006-02-15 22:16:47'),(9589,355,1,1612,'2.99','2005-06-16 06:52:05','2006-02-15 22:16:47'),(9590,355,1,3567,'5.99','2005-07-06 03:09:36','2006-02-15 22:16:47'),(9591,355,1,3730,'6.99','2005-07-06 11:31:24','2006-02-15 22:16:47'),(9592,355,1,5210,'4.99','2005-07-09 11:24:19','2006-02-15 22:16:47'),(9593,355,1,5564,'5.99','2005-07-10 03:23:05','2006-02-15 22:16:47'),(9594,355,1,6127,'0.99','2005-07-11 08:06:59','2006-02-15 22:16:47'),(9595,355,2,6262,'6.99','2005-07-11 15:33:24','2006-02-15 22:16:47'),(9596,355,1,6437,'2.99','2005-07-12 00:20:29','2006-02-15 22:16:47'),(9597,355,2,6669,'4.99','2005-07-12 11:39:55','2006-02-15 22:16:47'),(9598,355,2,7108,'4.99','2005-07-27 05:28:32','2006-02-15 22:16:47'),(9599,355,2,7477,'5.99','2005-07-27 19:11:03','2006-02-15 22:16:47'),(9600,355,2,8418,'1.99','2005-07-29 06:54:21','2006-02-15 22:16:47'),(9601,355,1,10498,'0.99','2005-08-01 10:56:48','2006-02-15 22:16:47'),(9602,355,2,11471,'0.99','2005-08-02 21:49:03','2006-02-15 22:16:47'),(9603,355,2,13821,'1.99','2005-08-20 13:33:47','2006-02-15 22:16:48'),(9604,355,1,15367,'3.99','2005-08-22 21:47:53','2006-02-15 22:16:48'),(9605,355,2,15531,'2.99','2005-08-23 03:52:36','2006-02-15 22:16:48'),(9606,355,1,14760,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:48'),(9607,356,2,1088,'4.99','2005-05-31 11:35:13','2006-02-15 22:16:48'),(9608,356,1,1410,'0.99','2005-06-15 16:59:46','2006-02-15 22:16:48'),(9609,356,1,2405,'2.99','2005-06-18 16:36:38','2006-02-15 22:16:48'),(9610,356,1,2433,'4.99','2005-06-18 18:10:17','2006-02-15 22:16:48'),(9611,356,2,3829,'6.99','2005-07-06 15:59:40','2006-02-15 22:16:48'),(9612,356,2,4599,'4.99','2005-07-08 06:48:26','2006-02-15 22:16:48'),(9613,356,1,5513,'0.99','2005-07-10 01:05:41','2006-02-15 22:16:48'),(9614,356,1,6593,'4.99','2005-07-12 07:21:17','2006-02-15 22:16:48'),(9615,356,1,6648,'0.99','2005-07-12 10:46:30','2006-02-15 22:16:48'),(9616,356,1,7079,'2.99','2005-07-27 04:21:58','2006-02-15 22:16:48'),(9617,356,1,7758,'1.99','2005-07-28 06:23:41','2006-02-15 22:16:48'),(9618,356,1,7902,'0.99','2005-07-28 11:14:19','2006-02-15 22:16:48'),(9619,356,1,8198,'3.99','2005-07-28 23:08:05','2006-02-15 22:16:48'),(9620,356,1,8975,'5.99','2005-07-30 04:10:18','2006-02-15 22:16:48'),(9621,356,2,9037,'4.99','2005-07-30 06:23:14','2006-02-15 22:16:48'),(9622,356,2,9523,'3.99','2005-07-31 00:56:09','2006-02-15 22:16:48'),(9623,356,2,9883,'6.99','2005-07-31 13:53:37','2006-02-15 22:16:48'),(9624,356,1,10427,'3.99','2005-08-01 08:30:11','2006-02-15 22:16:48'),(9625,356,1,10854,'4.99','2005-08-02 00:02:06','2006-02-15 22:16:49'),(9626,356,1,11535,'3.99','2005-08-17 00:39:54','2006-02-15 22:16:49'),(9627,356,2,11579,'2.99','2005-08-17 01:57:49','2006-02-15 22:16:49'),(9628,356,2,12037,'4.99','2005-08-17 20:21:35','2006-02-15 22:16:49'),(9629,356,2,12876,'2.99','2005-08-19 03:12:19','2006-02-15 22:16:49'),(9630,356,1,12913,'0.99','2005-08-19 04:25:39','2006-02-15 22:16:49'),(9631,356,2,13107,'4.99','2005-08-19 11:13:58','2006-02-15 22:16:49'),(9632,356,2,13442,'5.99','2005-08-19 23:50:45','2006-02-15 22:16:49'),(9633,356,2,13703,'6.99','2005-08-20 09:29:35','2006-02-15 22:16:49'),(9634,356,1,15705,'4.99','2005-08-23 10:32:52','2006-02-15 22:16:49'),(9635,356,2,15754,'5.99','2005-08-23 12:43:42','2006-02-15 22:16:49'),(9636,356,1,15757,'2.99','2005-08-23 12:47:16','2006-02-15 22:16:49'),(9637,357,1,144,'2.99','2005-05-25 23:49:56','2006-02-15 22:16:49'),(9638,357,1,824,'4.99','2005-05-29 21:45:32','2006-02-15 22:16:49'),(9639,357,2,945,'0.99','2005-05-30 15:33:17','2006-02-15 22:16:49'),(9640,357,2,1246,'5.99','2005-06-15 05:11:19','2006-02-15 22:16:49'),(9641,357,1,1788,'1.99','2005-06-16 19:47:18','2006-02-15 22:16:49'),(9642,357,2,1971,'1.99','2005-06-17 09:23:59','2006-02-15 22:16:49'),(9643,357,2,2153,'6.99','2005-06-17 22:58:04','2006-02-15 22:16:49'),(9644,357,1,3865,'3.99','2005-07-06 17:46:57','2006-02-15 22:16:49'),(9645,357,1,4478,'0.99','2005-07-08 00:39:08','2006-02-15 22:16:49'),(9646,357,1,5896,'0.99','2005-07-10 20:15:56','2006-02-15 22:16:49'),(9647,357,1,6288,'8.99','2005-07-11 17:01:52','2006-02-15 22:16:50'),(9648,357,2,6367,'4.99','2005-07-11 21:18:29','2006-02-15 22:16:50'),(9649,357,2,6405,'2.99','2005-07-11 22:53:12','2006-02-15 22:16:50'),(9650,357,1,6839,'0.99','2005-07-12 19:03:19','2006-02-15 22:16:50'),(9651,357,1,7353,'2.99','2005-07-27 14:38:39','2006-02-15 22:16:50'),(9652,357,1,7366,'5.99','2005-07-27 15:01:17','2006-02-15 22:16:50'),(9653,357,2,8041,'2.99','2005-07-28 16:39:56','2006-02-15 22:16:50'),(9654,357,1,8124,'2.99','2005-07-28 19:28:58','2006-02-15 22:16:50'),(9655,357,2,9233,'3.99','2005-07-30 13:44:15','2006-02-15 22:16:50'),(9656,357,2,10391,'2.99','2005-08-01 06:49:05','2006-02-15 22:16:50'),(9657,357,1,10502,'2.99','2005-08-01 11:06:39','2006-02-15 22:16:50'),(9658,357,1,10503,'6.99','2005-08-01 11:07:44','2006-02-15 22:16:50'),(9659,357,2,10764,'0.99','2005-08-01 20:32:42','2006-02-15 22:16:50'),(9660,357,2,11065,'2.99','2005-08-02 06:57:55','2006-02-15 22:16:50'),(9661,357,1,14926,'0.99','2005-08-22 05:18:44','2006-02-15 22:16:50'),(9662,357,2,15869,'2.99','2005-08-23 16:22:20','2006-02-15 22:16:50'),(9663,358,2,858,'4.99','2005-05-30 02:10:32','2006-02-15 22:16:50'),(9664,358,1,1455,'2.99','2005-06-15 19:51:06','2006-02-15 22:16:50'),(9665,358,2,1908,'0.99','2005-06-17 05:10:36','2006-02-15 22:16:50'),(9666,358,1,2114,'5.99','2005-06-17 20:00:25','2006-02-15 22:16:50'),(9667,358,1,2721,'2.99','2005-06-19 14:53:24','2006-02-15 22:16:50'),(9668,358,1,2749,'2.99','2005-06-19 16:27:35','2006-02-15 22:16:51'),(9669,358,1,3245,'2.99','2005-06-21 03:06:11','2006-02-15 22:16:51'),(9670,358,1,3753,'2.99','2005-07-06 12:34:06','2006-02-15 22:16:51'),(9671,358,1,3809,'2.99','2005-07-06 15:16:37','2006-02-15 22:16:51'),(9672,358,2,5023,'5.99','2005-07-09 02:23:16','2006-02-15 22:16:51'),(9673,358,1,6362,'2.99','2005-07-11 21:09:31','2006-02-15 22:16:51'),(9674,358,1,8621,'2.99','2005-07-29 13:52:42','2006-02-15 22:16:51'),(9675,358,2,9062,'0.99','2005-07-30 07:23:17','2006-02-15 22:16:51'),(9676,358,1,9568,'0.99','2005-07-31 02:37:44','2006-02-15 22:16:51'),(9677,358,1,10193,'2.99','2005-08-01 00:33:27','2006-02-15 22:16:51'),(9678,358,1,10482,'4.99','2005-08-01 10:17:47','2006-02-15 22:16:51'),(9679,358,2,11149,'5.99','2005-08-02 09:51:43','2006-02-15 22:16:51'),(9680,358,2,11653,'4.99','2005-08-17 05:06:10','2006-02-15 22:16:51'),(9681,358,1,12452,'6.99','2005-08-18 11:14:35','2006-02-15 22:16:51'),(9682,358,1,13197,'2.99','2005-08-19 14:44:03','2006-02-15 22:16:51'),(9683,358,1,14004,'7.99','2005-08-20 20:16:35','2006-02-15 22:16:51'),(9684,359,1,284,'8.99','2005-05-26 19:21:44','2006-02-15 22:16:51'),(9685,359,2,392,'2.99','2005-05-27 11:14:42','2006-02-15 22:16:51'),(9686,359,1,528,'3.99','2005-05-28 04:30:05','2006-02-15 22:16:51'),(9687,359,2,1329,'4.99','2005-06-15 11:25:06','2006-02-15 22:16:51'),(9688,359,2,1770,'1.99','2005-06-16 18:07:55','2006-02-15 22:16:51'),(9689,359,1,2401,'0.99','2005-06-18 16:22:03','2006-02-15 22:16:51'),(9690,359,1,2736,'4.99','2005-06-19 15:43:20','2006-02-15 22:16:52'),(9691,359,2,4830,'7.99','2005-07-08 17:56:23','2006-02-15 22:16:52'),(9692,359,2,6424,'9.99','2005-07-11 23:49:37','2006-02-15 22:16:52'),(9693,359,1,6542,'2.99','2005-07-12 04:53:49','2006-02-15 22:16:52'),(9694,359,2,6741,'0.99','2005-07-12 14:24:16','2006-02-15 22:16:52'),(9695,359,2,7098,'0.99','2005-07-27 05:01:08','2006-02-15 22:16:52'),(9696,359,1,7115,'0.99','2005-07-27 05:42:58','2006-02-15 22:16:52'),(9697,359,1,8174,'4.99','2005-07-28 21:36:52','2006-02-15 22:16:52'),(9698,359,1,9898,'4.99','2005-07-31 14:12:03','2006-02-15 22:16:52'),(9699,359,2,10174,'5.99','2005-07-31 23:40:08','2006-02-15 22:16:52'),(9700,359,1,11032,'4.99','2005-08-02 05:53:35','2006-02-15 22:16:52'),(9701,359,1,12611,'1.99','2005-08-18 17:09:42','2006-02-15 22:16:52'),(9702,359,2,13297,'2.99','2005-08-19 18:45:49','2006-02-15 22:16:52'),(9703,359,1,14258,'1.99','2005-08-21 05:56:36','2006-02-15 22:16:52'),(9704,359,2,14598,'5.99','2005-08-21 17:40:05','2006-02-15 22:16:52'),(9705,359,1,15104,'2.99','2005-08-22 12:01:16','2006-02-15 22:16:52'),(9706,359,1,15148,'4.99','2005-08-22 13:59:19','2006-02-15 22:16:52'),(9707,359,1,15453,'1.99','2005-08-23 01:01:01','2006-02-15 22:16:52'),(9708,359,2,15655,'4.99','2006-02-14 15:16:03','2006-02-15 22:16:52'),(9709,360,1,633,'0.99','2005-05-28 17:37:59','2006-02-15 22:16:52'),(9710,360,2,777,'4.99','2005-05-29 14:07:58','2006-02-15 22:16:52'),(9711,360,2,1492,'0.99','2005-06-15 21:48:35','2006-02-15 22:16:53'),(9712,360,2,2402,'6.99','2005-06-18 16:24:45','2006-02-15 22:16:53'),(9713,360,2,2541,'3.99','2005-06-19 02:08:10','2006-02-15 22:16:53'),(9714,360,2,2780,'6.99','2005-06-19 18:19:33','2006-02-15 22:16:53'),(9715,360,1,4056,'4.99','2005-07-07 03:57:36','2006-02-15 22:16:53'),(9716,360,1,4487,'7.99','2005-07-08 01:20:22','2006-02-15 22:16:53'),(9717,360,2,5456,'2.99','2005-07-09 22:31:45','2006-02-15 22:16:53'),(9718,360,1,5834,'1.99','2005-07-10 16:44:12','2006-02-15 22:16:53'),(9719,360,1,5995,'3.99','2005-07-11 01:15:39','2006-02-15 22:16:53'),(9720,360,1,6442,'0.99','2005-07-12 00:29:45','2006-02-15 22:16:53'),(9721,360,2,6770,'5.99','2005-07-12 15:49:40','2006-02-15 22:16:53'),(9722,360,1,7251,'2.99','2005-07-27 10:44:55','2006-02-15 22:16:53'),(9723,360,2,7588,'9.99','2005-07-27 23:23:31','2006-02-15 22:16:53'),(9724,360,1,7654,'4.99','2005-07-28 02:00:14','2006-02-15 22:16:53'),(9725,360,2,7908,'3.99','2005-07-28 11:32:57','2006-02-15 22:16:53'),(9726,360,1,8220,'2.99','2005-07-28 23:46:41','2006-02-15 22:16:53'),(9727,360,2,8361,'2.99','2005-07-29 05:08:57','2006-02-15 22:16:53'),(9728,360,1,9283,'4.99','2005-07-30 15:25:19','2006-02-15 22:16:53'),(9729,360,2,9352,'0.99','2005-07-30 18:29:26','2006-02-15 22:16:53'),(9730,360,1,9623,'2.99','2005-07-31 04:30:02','2006-02-15 22:16:53'),(9731,360,2,9659,'3.99','2005-07-31 06:02:14','2006-02-15 22:16:53'),(9732,360,2,10857,'2.99','2005-08-02 00:07:20','2006-02-15 22:16:54'),(9733,360,2,11264,'6.99','2005-08-02 14:05:18','2006-02-15 22:16:54'),(9734,360,2,11553,'4.99','2005-08-17 01:04:31','2006-02-15 22:16:54'),(9735,360,2,12088,'5.99','2005-08-17 22:20:16','2006-02-15 22:16:54'),(9736,360,1,12773,'5.99','2005-08-18 23:32:19','2006-02-15 22:16:54'),(9737,360,2,12795,'0.99','2005-08-19 00:21:52','2006-02-15 22:16:54'),(9738,360,1,12839,'6.99','2005-08-19 01:53:43','2006-02-15 22:16:54'),(9739,360,1,12990,'4.99','2005-08-19 07:20:39','2006-02-15 22:16:54'),(9740,360,2,13894,'7.99','2005-08-20 15:55:20','2006-02-15 22:16:54'),(9741,360,1,14700,'4.99','2005-08-21 20:53:40','2006-02-15 22:16:54'),(9742,360,1,15310,'2.99','2005-08-22 19:56:41','2006-02-15 22:16:54'),(9743,361,1,368,'5.99','2005-05-27 07:42:29','2006-02-15 22:16:54'),(9744,361,2,1120,'4.99','2005-05-31 16:37:14','2006-02-15 22:16:54'),(9745,361,2,2353,'4.99','2005-06-18 12:53:25','2006-02-15 22:16:54'),(9746,361,2,2558,'1.99','2005-06-19 03:09:16','2006-02-15 22:16:54'),(9747,361,1,2851,'2.99','2005-06-19 23:07:03','2006-02-15 22:16:54'),(9748,361,2,3303,'2.99','2005-06-21 07:34:14','2006-02-15 22:16:54'),(9749,361,2,5154,'2.99','2005-07-09 08:46:18','2006-02-15 22:16:54'),(9750,361,1,6152,'0.99','2005-07-11 09:25:52','2006-02-15 22:16:54'),(9751,361,2,6829,'4.99','2005-07-12 18:38:59','2006-02-15 22:16:54'),(9752,361,2,6911,'0.99','2005-07-12 22:14:34','2006-02-15 22:16:54'),(9753,361,1,6914,'1.99','2005-07-12 22:26:56','2006-02-15 22:16:55'),(9754,361,1,7538,'2.99','2005-07-27 21:38:04','2006-02-15 22:16:55'),(9755,361,2,7712,'2.99','2005-07-28 04:29:53','2006-02-15 22:16:55'),(9756,361,2,8189,'4.99','2005-07-28 22:36:26','2006-02-15 22:16:55'),(9757,361,1,10145,'1.99','2005-07-31 22:15:13','2006-02-15 22:16:55'),(9758,361,1,10151,'4.99','2005-07-31 22:22:37','2006-02-15 22:16:55'),(9759,361,1,10414,'0.99','2005-08-01 08:03:55','2006-02-15 22:16:55'),(9760,361,2,10975,'0.99','2005-08-02 04:11:25','2006-02-15 22:16:55'),(9761,361,2,11031,'5.99','2005-08-02 05:52:58','2006-02-15 22:16:55'),(9762,361,2,11243,'5.99','2005-08-02 13:32:48','2006-02-15 22:16:55'),(9763,361,1,11327,'2.99','2005-08-02 16:40:47','2006-02-15 22:16:55'),(9764,361,1,11991,'3.99','2005-08-17 18:27:08','2006-02-15 22:16:55'),(9765,361,2,12626,'5.99','2005-08-18 17:36:45','2006-02-15 22:16:55'),(9766,361,2,12690,'2.99','2005-08-18 20:06:57','2006-02-15 22:16:55'),(9767,361,1,13135,'0.99','2005-08-19 12:22:52','2006-02-15 22:16:55'),(9768,361,2,14031,'0.99','2005-08-20 21:24:24','2006-02-15 22:16:55'),(9769,361,1,14422,'0.99','2005-08-21 11:21:46','2006-02-15 22:16:55'),(9770,361,1,15759,'6.99','2005-08-23 12:47:37','2006-02-15 22:16:55'),(9771,361,2,15935,'2.99','2005-08-23 18:41:11','2006-02-15 22:16:55'),(9772,361,1,13298,'3.98','2006-02-14 15:16:03','2006-02-15 22:16:55'),(9773,361,1,14769,'0.00','2006-02-14 15:16:03','2006-02-15 22:16:55'),(9774,362,2,1035,'4.99','2005-05-31 05:01:09','2006-02-15 22:16:56'),(9775,362,1,1429,'2.99','2005-06-15 18:24:10','2006-02-15 22:16:56'),(9776,362,1,1529,'2.99','2005-06-16 00:37:35','2006-02-15 22:16:56'),(9777,362,1,1615,'2.99','2005-06-16 07:00:28','2006-02-15 22:16:56'),(9778,362,2,3197,'2.99','2005-06-21 00:07:23','2006-02-15 22:16:56'),(9779,362,2,3393,'2.99','2005-06-21 15:14:27','2006-02-15 22:16:56'),(9780,362,2,4646,'8.99','2005-07-08 09:23:26','2006-02-15 22:16:56'),(9781,362,1,5227,'4.99','2005-07-09 12:16:39','2006-02-15 22:16:56'),(9782,362,2,5563,'1.99','2005-07-10 03:21:02','2006-02-15 22:16:56'),(9783,362,2,5690,'5.99','2005-07-10 09:26:49','2006-02-15 22:16:56'),(9784,362,1,6204,'4.99','2005-07-11 12:29:22','2006-02-15 22:16:56'),(9785,362,2,6576,'4.99','2005-07-12 06:13:41','2006-02-15 22:16:56'),(9786,362,1,6981,'4.99','2005-07-27 00:51:38','2006-02-15 22:16:56'),(9787,362,1,7172,'1.99','2005-07-27 07:59:16','2006-02-15 22:16:56'),(9788,362,1,7485,'2.99','2005-07-27 19:29:09','2006-02-15 22:16:56'),(9789,362,1,8081,'2.99','2005-07-28 18:06:46','2006-02-15 22:16:56'),(9790,362,2,8325,'2.99','2005-07-29 03:57:27','2006-02-15 22:16:56'),(9791,362,2,8364,'4.99','2005-07-29 05:10:31','2006-02-15 22:16:56'),(9792,362,1,8662,'0.99','2005-07-29 15:31:33','2006-02-15 22:16:56'),(9793,362,1,8714,'2.99','2005-07-29 17:31:40','2006-02-15 22:16:56'),(9794,362,1,9784,'4.99','2005-07-31 10:21:32','2006-02-15 22:16:56'),(9795,362,2,10546,'3.99','2005-08-01 12:44:17','2006-02-15 22:16:56'),(9796,362,2,12244,'4.99','2005-08-18 03:39:11','2006-02-15 22:16:57'),(9797,362,1,12854,'6.99','2005-08-19 02:18:51','2006-02-15 22:16:57'),(9798,362,1,13603,'6.99','2005-08-20 06:02:48','2006-02-15 22:16:57'),(9799,362,2,14051,'6.99','2005-08-20 22:09:51','2006-02-15 22:16:57'),(9800,362,2,14129,'2.99','2005-08-21 01:42:15','2006-02-15 22:16:57'),(9801,362,2,14336,'4.99','2005-08-21 08:33:42','2006-02-15 22:16:57'),(9802,362,1,14752,'5.99','2005-08-21 23:11:42','2006-02-15 22:16:57'),(9803,362,1,14759,'11.99','2005-08-21 23:28:58','2006-02-15 22:16:57'),(9804,362,1,14808,'4.99','2005-08-22 00:58:35','2006-02-15 22:16:57'),(9805,362,1,14950,'2.99','2005-08-22 06:17:12','2006-02-15 22:16:57'),(9806,363,1,733,'3.99','2005-05-29 07:35:21','2006-02-15 22:16:57'),(9807,363,2,1426,'4.99','2005-06-15 18:16:24','2006-02-15 22:16:57'),(9808,363,2,1569,'4.99','2005-06-16 03:19:09','2006-02-15 22:16:57'),(9809,363,1,1847,'4.99','2005-06-17 00:05:22','2006-02-15 22:16:57'),(9810,363,1,2540,'4.99','2005-06-19 02:04:48','2006-02-15 22:16:57'),(9811,363,2,3281,'2.99','2005-06-21 06:08:47','2006-02-15 22:16:57'),(9812,363,1,3726,'3.99','2005-07-06 11:15:49','2006-02-15 22:16:57'),(9813,363,2,5687,'3.99','2005-07-10 09:07:19','2006-02-15 22:16:57'),(9814,363,1,5758,'6.99','2005-07-10 12:42:43','2006-02-15 22:16:57'),(9815,363,2,6140,'4.99','2005-07-11 08:40:47','2006-02-15 22:16:57'),(9816,363,2,6705,'4.99','2005-07-12 12:53:11','2006-02-15 22:16:58'),(9817,363,2,6821,'2.99','2005-07-12 18:22:10','2006-02-15 22:16:58'),(9818,363,2,6878,'4.99','2005-07-12 20:37:13','2006-02-15 22:16:58'),(9819,363,1,7256,'2.99','2005-07-27 10:58:32','2006-02-15 22:16:58'),(9820,363,2,7708,'4.99','2005-07-28 04:19:15','2006-02-15 22:16:58'),(9821,363,2,8121,'2.99','2005-07-28 19:25:45','2006-02-15 22:16:58'),(9822,363,2,8522,'3.99','2005-07-29 10:16:19','2006-02-15 22:16:58'),(9823,363,2,8804,'2.99','2005-07-29 21:28:19','2006-02-15 22:16:58'),(9824,363,2,8841,'4.99','2005-07-29 22:56:07','2006-02-15 22:16:58'),(9825,363,1,9968,'4.99','2005-07-31 16:32:16','2006-02-15 22:16:58'),(9826,363,1,9977,'8.99','2005-07-31 16:58:42','2006-02-15 22:16:58'),(9827,363,1,10339,'6.99','2005-08-01 05:05:50','2006-02-15 22:16:58'),(9828,363,2,12189,'5.99','2005-08-18 01:51:44','2006-02-15 22:16:58'),(9829,363,2,12760,'4.99','2005-08-18 23:03:19','2006-02-15 22:16:58'),(9830,363,1,13706,'9.99','2005-08-20 09:32:56','2006-02-15 22:16:58'),(9831,363,1,14694,'2.99','2005-08-21 20:46:42','2006-02-15 22:16:58'),(9832,363,1,14983,'5.99','2005-08-22 07:32:23','2006-02-15 22:16:58'),(9833,363,2,15279,'4.99','2005-08-22 19:08:49','2006-02-15 22:16:58'),(9834,363,1,15335,'4.99','2005-08-22 20:44:55','2006-02-15 22:16:58'),(9835,364,1,462,'5.99','2005-05-27 20:10:36','2006-02-15 22:16:58'),(9836,364,1,1722,'2.99','2005-06-16 15:12:52','2006-02-15 22:16:59'),(9837,364,2,2442,'2.99','2005-06-18 18:49:18','2006-02-15 22:16:59'),(9838,364,2,2606,'4.99','2005-06-19 06:51:32','2006-02-15 22:16:59'),(9839,364,2,2857,'4.99','2005-06-19 23:15:15','2006-02-15 22:16:59'),(9840,364,2,2962,'3.99','2005-06-20 07:31:55','2006-02-15 22:16:59'),(9841,364,1,3678,'4.99','2005-07-06 09:15:15','2006-02-15 22:16:59'),(9842,364,2,3961,'4.99','2005-07-06 22:11:43','2006-02-15 22:16:59'),(9843,364,1,4047,'0.99','2005-07-07 03:28:49','2006-02-15 22:16:59'),(9844,364,2,4689,'4.99','2005-07-08 11:03:47','2006-02-15 22:16:59'),(9845,364,1,5872,'10.99','2005-07-10 18:54:05','2006-02-15 22:16:59'),(9846,364,1,7272,'2.99','2005-07-27 11:30:20','2006-02-15 22:16:59'),(9847,364,2,9266,'4.99','2005-07-30 14:59:01','2006-02-15 22:16:59'),(9848,364,1,10092,'0.99','2005-07-31 20:28:09','2006-02-15 22:16:59'),(9849,364,2,10290,'5.99','2005-08-01 03:39:50','2006-02-15 22:16:59'),(9850,364,2,11932,'4.99','2005-08-17 16:36:12','2006-02-15 22:16:59'),(9851,364,1,12557,'4.99','2005-08-18 14:51:03','2006-02-15 22:16:59'),(9852,364,1,12761,'1.99','2005-08-18 23:05:22','2006-02-15 22:16:59'),(9853,364,2,12912,'3.99','2005-08-19 04:24:35','2006-02-15 22:16:59'),(9854,364,1,13698,'4.99','2005-08-20 09:24:26','2006-02-15 22:16:59'),(9855,364,2,13936,'0.99','2005-08-20 17:22:35','2006-02-15 22:17:00'),(9856,364,2,14293,'4.99','2005-08-21 07:06:47','2006-02-15 22:17:00'),(9857,364,1,15242,'0.99','2005-08-22 17:48:10','2006-02-15 22:17:00'),(9858,365,2,120,'5.99','2005-05-25 19:37:47','2006-02-15 22:17:00'),(9859,365,1,231,'4.99','2005-05-26 11:31:59','2006-02-15 22:17:00'),(9860,365,1,1303,'1.99','2005-06-15 09:55:57','2006-02-15 22:17:00'),(9861,365,1,1578,'6.99','2005-06-16 04:08:16','2006-02-15 22:17:00'),(9862,365,1,1983,'4.99','2005-06-17 10:22:13','2006-02-15 22:17:00'),(9863,365,1,2525,'2.99','2005-06-19 00:48:22','2006-02-15 22:17:00'),(9864,365,2,3156,'0.99','2005-06-20 21:03:46','2006-02-15 22:17:00'),(9865,365,1,4583,'1.99','2005-07-08 06:09:44','2006-02-15 22:17:00'),(9866,365,1,6604,'4.99','2005-07-12 07:57:45','2006-02-15 22:17:00'),(9867,365,1,7488,'7.99','2005-07-27 19:36:15','2006-02-15 22:17:00'),(9868,365,2,7634,'4.99','2005-07-28 01:07:01','2006-02-15 22:17:00'),(9869,365,1,8168,'4.99','2005-07-28 21:28:32','2006-02-15 22:17:00'),(9870,365,2,8782,'4.99','2005-07-29 20:29:34','2006-02-15 22:17:00'),(9871,365,1,8856,'3.99','2005-07-29 23:42:00','2006-02-15 22:17:00'),(9872,365,1,9122,'2.99','2005-07-30 09:36:52','2006-02-15 22:17:00'),(9873,365,2,9184,'4.99','2005-07-30 12:10:19','2006-02-15 22:17:00'),(9874,365,2,9540,'2.99','2005-07-31 01:40:06','2006-02-15 22:17:01'),(9875,365,2,10717,'2.99','2005-08-01 18:53:53','2006-02-15 22:17:01'),(9876,365,2,12322,'2.99','2005-08-18 06:35:28','2006-02-15 22:17:01'),(9877,365,2,12375,'4.99','2005-08-18 08:20:08','2006-02-15 22:17:01'),(9878,365,1,12804,'8.99','2005-08-19 00:33:15','2006-02-15 22:17:01'),(9879,365,1,13619,'2.99','2005-08-20 06:39:26','2006-02-15 22:17:01'),(9880,365,2,14463,'6.99','2005-08-21 12:51:49','2006-02-15 22:17:01'),(9881,366,2,911,'6.99','2005-05-30 10:50:22','2006-02-15 22:17:01'),(9882,366,2,1401,'1.99','2005-06-15 16:30:22','2006-02-15 22:17:01'),(9883,366,2,2214,'0.99','2005-06-18 02:44:37','2006-02-15 22:17:01'),(9884,366,2,3632,'4.99','2005-07-06 06:38:21','2006-02-15 22:17:01'),(9885,366,1,3834,'2.99','2005-07-06 16:19:56','2006-02-15 22:17:01'),(9886,366,2,4276,'2.99','2005-07-07 14:50:59','2006-02-15 22:17:01'),(9887,366,1,4569,'5.99','2005-07-08 05:30:51','2006-02-15 22:17:01'),(9888,366,2,5364,'0.99','2005-07-09 18:24:48','2006-02-15 22:17:01'),(9889,366,1,6112,'6.99','2005-07-11 07:28:05','2006-02-15 22:17:01'),(9890,366,1,6366,'4.99','2005-07-11 21:18:16','2006-02-15 22:17:01'),(9891,366,2,6533,'6.99','2005-07-12 04:39:38','2006-02-15 22:17:01'),(9892,366,2,6738,'5.99','2005-07-12 14:17:55','2006-02-15 22:17:01'),(9893,366,1,6842,'0.99','2005-07-12 19:07:55','2006-02-15 22:17:02'),(9894,366,2,6971,'4.99','2005-07-27 00:26:17','2006-02-15 22:17:02'),(9895,366,1,7344,'1.99','2005-07-27 14:29:28','2006-02-15 22:17:02'),(9896,366,1,7562,'2.99','2005-07-27 22:25:15','2006-02-15 22:17:02'),(9897,366,2,7602,'4.99','2005-07-27 23:48:35','2006-02-15 22:17:02'),(9898,366,1,7805,'6.99','2005-07-28 07:56:41','2006-02-15 22:17:02'),(9899,366,2,8169,'4.99','2005-07-28 21:29:46','2006-02-15 22:17:02'),(9900,366,2,8260,'1.99','2005-07-29 01:11:00','2006-02-15 22:17:02'),(9901,366,2,8928,'2.99','2005-07-30 02:18:19','2006-02-15 22:17:02'),(9902,366,1,9316,'6.99','2005-07-30 17:11:58','2006-02-15 22:17:02'),(9903,366,1,10198,'2.99','2005-08-01 00:36:15','2006-02-15 22:17:02'),(9904,366,1,10384,'4.99','2005-08-01 06:39:14','2006-02-15 22:17:02'),(9905,366,2,11337,'2.99','2005-08-02 16:59:09','2006-02-15 22:17:02'),(9906,366,2,11340,'5.99','2005-08-02 17:05:43','2006-02-15 22:17:02'),(9907,366,2,12413,'2.99','2005-08-18 09:50:34','2006-02-15 22:17:02'),(9908,366,1,12608,'4.99','2005-08-18 17:05:15','2006-02-15 22:17:02'),(9909,366,2,13563,'0.99','2005-08-20 04:33:31','2006-02-15 22:17:02'),(9910,366,1,13857,'2.99','2005-08-20 14:50:06','2006-02-15 22:17:02'),(9911,366,1,14147,'4.99','2005-08-21 02:14:03','2006-02-15 22:17:02'),(9912,366,1,14290,'4.99','2005-08-21 07:02:59','2006-02-15 22:17:02'),(9913,366,1,14390,'2.99','2005-08-21 10:15:38','2006-02-15 22:17:02'),(9914,366,1,14717,'2.99','2005-08-21 21:30:39','2006-02-15 22:17:03'),(9915,366,1,14906,'6.99','2005-08-22 04:38:18','2006-02-15 22:17:03'),(9916,366,1,15514,'2.99','2005-08-23 03:03:40','2006-02-15 22:17:03'),(9917,366,1,13421,'4.99','2006-02-14 15:16:03','2006-02-15 22:17:03'),(9918,367,1,939,'0.99','2005-05-30 14:49:34','2006-02-15 22:17:03'),(9919,367,1,1089,'2.99','2005-05-31 11:38:29','2006-02-15 22:17:03'),(9920,367,1,3078,'0.99','2005-06-20 15:09:48','2006-02-15 22:17:03'),(9921,367,1,4251,'8.99','2005-07-07 14:11:55','2006-02-15 22:17:03'),(9922,367,2,5490,'4.99','2005-07-10 00:09:11','2006-02-15 22:17:03'),(9923,367,2,5538,'4.99','2005-07-10 02:39:40','2006-02-15 22:17:03'),(9924,367,2,5839,'2.99','2005-07-10 17:08:30','2006-02-15 22:17:03'),(9925,367,2,6228,'2.99','2005-07-11 13:58:36','2006-02-15 22:17:03'),(9926,367,1,6716,'0.99','2005-07-12 13:34:58','2006-02-15 22:17:03'),(9927,367,2,6835,'5.99','2005-07-12 18:58:03','2006-02-15 22:17:03'),(9928,367,2,8490,'0.99','2005-07-29 08:59:25','2006-02-15 22:17:03'),(9929,367,1,9030,'3.99','2005-07-30 06:05:38','2006-02-15 22:17:03'),(9930,367,1,9430,'4.99','2005-07-30 21:20:13','2006-02-15 22:17:03'),(9931,367,1,9912,'4.99','2005-07-31 14:49:04','2006-02-15 22:17:03'),(9932,367,2,10344,'4.99','2005-08-01 05:18:23','2006-02-15 22:17:03'),(9933,367,1,12152,'4.99','2005-08-18 00:21:35','2006-02-15 22:17:03'),(9934,367,2,12362,'0.99','2005-08-18 07:48:05','2006-02-15 22:17:03'),(9935,367,2,12373,'8.99','2005-08-18 08:07:25','2006-02-15 22:17:04'),(9936,367,2,12911,'6.99','2005-08-19 04:24:10','2006-02-15 22:17:04'),(9937,367,2,13235,'4.99','2005-08-19 16:17:53','2006-02-15 22:17:04'),(9938,367,1,14413,'6.99','2005-08-21 11:06:33','2006-02-15 22:17:04'),(9939,367,1,14481,'10.99','2005-08-21 13:41:14','2006-02-15 22:17:04'),(9940,368,1,64,'5.99','2005-05-25 09:21:29','2006-02-15 22:17:04'),(9941,368,1,125,'5.99','2005-05-25 20:48:50','2006-02-15 22:17:04'),(9942,368,1,836,'2.99','2005-05-29 23:56:42','2006-02-15 22:17:04'),(9943,368,1,949,'2.99','2005-05-30 15:50:39','2006-02-15 22:17:04'),(9944,368,1,1186,'0.99','2005-06-15 00:56:45','2006-02-15 22:17:04'),(9945,368,1,1513,'9.99','2005-06-15 22:53:30','2006-02-15 22:17:04'),(9946,368,1,2531,'4.99','2005-06-19 01:20:49','2006-02-15 22:17:04'),(9947,368,1,2694,'4.99','2005-06-19 13:17:21','2006-02-15 22:17:04'),(9948,368,1,2744,'4.99','2005-06-19 16:20:40','2006-02-15 22:17:04'),(9949,368,2,3275,'4.99','2005-06-21 05:33:04','2006-02-15 22:17:04'),(9950,368,2,3608,'4.99','2005-07-06 05:35:39','2006-02-15 22:17:04'),(9951,368,2,4066,'0.99','2005-07-07 04:34:09','2006-02-15 22:17:04'),(9952,368,1,4584,'0.99','2005-07-08 06:11:02','2006-02-15 22:17:04'),(9953,368,2,4913,'8.99','2005-07-08 21:27:48','2006-02-15 22:17:04'),(9954,368,1,6124,'4.99','2005-07-11 08:02:32','2006-02-15 22:17:04'),(9955,368,1,6154,'5.99','2005-07-11 09:32:19','2006-02-15 22:17:04'),(9956,368,1,6681,'2.99','2005-07-12 12:04:12','2006-02-15 22:17:04'),(9957,368,2,7571,'4.99','2005-07-27 22:43:42','2006-02-15 22:17:05'),(9958,368,1,8045,'0.99','2005-07-28 16:49:38','2006-02-15 22:17:05'),(9959,368,2,8226,'2.99','2005-07-29 00:01:04','2006-02-15 22:17:05'),(9960,368,1,9400,'5.99','2005-07-30 20:15:58','2006-02-15 22:17:05'),(9961,368,1,9833,'6.99','2005-07-31 12:05:01','2006-02-15 22:17:05'),(9962,368,2,10730,'8.99','2005-08-01 19:21:42','2006-02-15 22:17:05'),(9963,368,2,10848,'1.99','2005-08-01 23:50:22','2006-02-15 22:17:05'),(9964,368,1,11844,'0.99','2005-08-17 13:16:04','2006-02-15 22:17:05'),(9965,368,2,12319,'2.99','2005-08-18 06:26:45','2006-02-15 22:17:05'),(9966,368,1,12796,'4.99','2005-08-19 00:22:24','2006-02-15 22:17:05'),(9967,368,2,13189,'8.99','2005-08-19 14:27:16','2006-02-15 22:17:05'),(9968,368,2,13280,'2.99','2005-08-19 18:02:51','2006-02-15 22:17:05'),(9969,368,2,13378,'0.99','2005-08-19 21:33:35','2006-02-15 22:17:05'),(9970,368,2,13781,'7.99','2005-08-20 12:06:45','2006-02-15 22:17:05'),(9971,368,2,13963,'1.99','2005-08-20 18:20:18','2006-02-15 22:17:05'),(9972,368,1,14393,'7.99','2005-08-21 10:22:51','2006-02-15 22:17:05'),(9973,368,1,15353,'2.99','2005-08-22 21:18:08','2006-02-15 22:17:05'),(9974,368,1,15437,'2.99','2005-08-23 00:31:09','2006-02-15 22:17:05'),(9975,369,1,31,'4.99','2005-05-25 04:05:17','2006-02-15 22:17:05'),(9976,369,1,294,'4.99','2005-05-26 20:29:57','2006-02-15 22:17:05'),(9977,369,2,854,'0.99','2005-05-30 01:56:11','2006-02-15 22:17:05'),(9978,369,2,913,'7.99','2005-05-30 11:04:58','2006-02-15 22:17:06'),(9979,369,1,1224,'0.99','2005-06-15 03:44:25','2006-02-15 22:17:06'),(9980,369,1,3490,'6.99','2005-07-05 23:37:13','2006-02-15 22:17:06'),(9981,369,2,3903,'2.99','2005-07-06 19:27:32','2006-02-15 22:17:06'),(9982,369,2,4859,'4.99','2005-07-08 18:54:04','2006-02-15 22:17:06'),(9983,369,1,5043,'1.99','2005-07-09 03:25:18','2006-02-15 22:17:06'),(9984,369,2,5496,'7.99','2005-07-10 00:20:23','2006-02-15 22:17:06'),(9985,369,2,5561,'2.99','2005-07-10 03:15:24','2006-02-15 22:17:06'),(9986,369,1,8236,'2.99','2005-07-29 00:27:04','2006-02-15 22:17:06'),(9987,369,2,8826,'2.99','2005-07-29 22:30:16','2006-02-15 22:17:06'),(9988,369,2,9032,'4.99','2005-07-30 06:06:54','2006-02-15 22:17:06'),(9989,369,1,9089,'0.99','2005-07-30 08:23:39','2006-02-15 22:17:06'),(9990,369,2,9543,'0.99','2005-07-31 01:43:34','2006-02-15 22:17:06'),(9991,369,1,9973,'4.99','2005-07-31 16:49:31','2006-02-15 22:17:06'),(9992,369,1,10299,'0.99','2005-08-01 04:08:04','2006-02-15 22:17:06'),(9993,369,2,10359,'3.99','2005-08-01 05:52:21','2006-02-15 22:17:06'),(9994,369,2,10713,'2.99','2005-08-01 18:50:05','2006-02-15 22:17:06'),(9995,369,1,11084,'4.99','2005-08-02 07:34:19','2006-02-15 22:17:06'),(9996,369,2,11388,'1.99','2005-08-02 18:35:55','2006-02-15 22:17:06'),(9997,369,1,12521,'0.99','2005-08-18 13:43:07','2006-02-15 22:17:06'),(9998,369,2,14684,'5.99','2005-08-21 20:28:26','2006-02-15 22:17:06'),(9999,369,1,13898,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:07'),(10000,370,2,1190,'6.99','2005-06-15 01:05:32','2006-02-15 22:17:07'),(10001,370,2,4400,'7.99','2005-07-07 21:22:26','2006-02-15 22:17:07'),(10002,370,2,6714,'0.99','2005-07-12 13:29:06','2006-02-15 22:17:07'),(10003,370,1,6968,'0.99','2005-07-27 00:16:45','2006-02-15 22:17:07'),(10004,370,2,7152,'7.99','2005-07-27 07:15:01','2006-02-15 22:17:07'),(10005,370,1,7226,'6.99','2005-07-27 09:47:53','2006-02-15 22:17:07'),(10006,370,2,7797,'0.99','2005-07-28 07:41:07','2006-02-15 22:17:07'),(10007,370,2,8258,'0.99','2005-07-29 01:03:42','2006-02-15 22:17:07'),(10008,370,2,10095,'0.99','2005-07-31 20:38:35','2006-02-15 22:17:07'),(10009,370,1,10336,'4.99','2005-08-01 04:59:53','2006-02-15 22:17:07'),(10010,370,1,11540,'1.99','2005-08-17 00:48:03','2006-02-15 22:17:07'),(10011,370,2,11925,'0.99','2005-08-17 16:23:04','2006-02-15 22:17:07'),(10012,370,1,12339,'4.99','2005-08-18 07:05:06','2006-02-15 22:17:07'),(10013,370,1,13039,'0.99','2005-08-19 08:55:19','2006-02-15 22:17:07'),(10014,370,1,14602,'3.99','2005-08-21 17:48:49','2006-02-15 22:17:07'),(10015,370,2,14786,'2.99','2005-08-22 00:24:42','2006-02-15 22:17:07'),(10016,370,2,15368,'3.99','2005-08-22 21:57:15','2006-02-15 22:17:07'),(10017,370,1,15626,'4.99','2005-08-23 07:25:34','2006-02-15 22:17:07'),(10018,370,1,15982,'5.99','2005-08-23 20:13:31','2006-02-15 22:17:08'),(10019,371,1,26,'3.99','2005-05-25 03:36:50','2006-02-15 22:17:08'),(10020,371,2,286,'6.99','2005-05-26 19:44:51','2006-02-15 22:17:08'),(10021,371,2,381,'4.99','2005-05-27 09:43:25','2006-02-15 22:17:08'),(10022,371,1,384,'5.99','2005-05-27 10:18:20','2006-02-15 22:17:08'),(10023,371,1,825,'0.99','2005-05-29 21:49:41','2006-02-15 22:17:08'),(10024,371,1,829,'2.99','2005-05-29 22:16:42','2006-02-15 22:17:08'),(10025,371,2,1212,'2.99','2005-06-15 03:03:33','2006-02-15 22:17:08'),(10026,371,1,1218,'1.99','2005-06-15 03:24:44','2006-02-15 22:17:08'),(10027,371,1,1573,'6.99','2005-06-16 03:31:39','2006-02-15 22:17:08'),(10028,371,2,1675,'5.99','2005-06-16 11:04:47','2006-02-15 22:17:08'),(10029,371,2,2837,'0.99','2005-06-19 22:03:50','2006-02-15 22:17:08'),(10030,371,1,3176,'3.99','2005-06-20 22:31:54','2006-02-15 22:17:08'),(10031,371,2,3396,'0.99','2005-06-21 15:23:08','2006-02-15 22:17:08'),(10032,371,2,4115,'8.99','2005-07-07 06:52:23','2006-02-15 22:17:08'),(10033,371,1,4612,'1.99','2005-07-08 07:40:44','2006-02-15 22:17:08'),(10034,371,1,5171,'4.99','2005-07-09 09:26:55','2006-02-15 22:17:08'),(10035,371,2,5614,'0.99','2005-07-10 05:16:56','2006-02-15 22:17:08'),(10036,371,1,6000,'2.99','2005-07-11 01:23:06','2006-02-15 22:17:08'),(10037,371,1,6460,'1.99','2005-07-12 01:13:44','2006-02-15 22:17:08'),(10038,371,1,6922,'0.99','2005-07-12 22:39:48','2006-02-15 22:17:08'),(10039,371,1,7408,'3.99','2005-07-27 16:31:40','2006-02-15 22:17:09'),(10040,371,1,8138,'4.99','2005-07-28 20:12:17','2006-02-15 22:17:09'),(10041,371,1,9008,'4.99','2005-07-30 05:10:26','2006-02-15 22:17:09'),(10042,371,1,9117,'8.99','2005-07-30 09:20:59','2006-02-15 22:17:09'),(10043,371,1,9635,'0.99','2005-07-31 05:12:27','2006-02-15 22:17:09'),(10044,371,1,11086,'10.99','2005-08-02 07:38:44','2006-02-15 22:17:09'),(10045,371,2,12397,'9.99','2005-08-18 09:12:52','2006-02-15 22:17:09'),(10046,371,2,12584,'7.99','2005-08-18 15:51:36','2006-02-15 22:17:09'),(10047,371,1,13028,'2.99','2005-08-19 08:27:23','2006-02-15 22:17:09'),(10048,371,2,13143,'3.99','2005-08-19 12:44:38','2006-02-15 22:17:09'),(10049,371,1,13191,'4.99','2005-08-19 14:28:48','2006-02-15 22:17:09'),(10050,371,2,13953,'4.99','2005-08-20 18:00:37','2006-02-15 22:17:09'),(10051,371,1,14384,'2.99','2005-08-21 10:02:37','2006-02-15 22:17:09'),(10052,371,1,15786,'0.99','2005-08-23 13:48:34','2006-02-15 22:17:09'),(10053,371,1,15824,'2.99','2005-08-23 15:09:17','2006-02-15 22:17:09'),(10054,372,1,617,'2.99','2005-05-28 15:49:14','2006-02-15 22:17:09'),(10055,372,1,638,'2.99','2005-05-28 18:24:43','2006-02-15 22:17:09'),(10056,372,1,2315,'2.99','2005-06-18 09:03:39','2006-02-15 22:17:09'),(10057,372,1,2959,'4.99','2005-06-20 07:07:54','2006-02-15 22:17:09'),(10058,372,1,3283,'3.99','2005-06-21 06:19:07','2006-02-15 22:17:09'),(10059,372,1,5229,'4.99','2005-07-09 12:30:18','2006-02-15 22:17:09'),(10060,372,1,5314,'2.99','2005-07-09 16:05:28','2006-02-15 22:17:10'),(10061,372,1,5352,'2.99','2005-07-09 17:54:58','2006-02-15 22:17:10'),(10062,372,1,5501,'6.99','2005-07-10 00:33:48','2006-02-15 22:17:10'),(10063,372,2,5914,'7.99','2005-07-10 21:01:12','2006-02-15 22:17:10'),(10064,372,2,6692,'4.99','2005-07-12 12:35:39','2006-02-15 22:17:10'),(10065,372,1,7190,'4.99','2005-07-27 08:36:01','2006-02-15 22:17:10'),(10066,372,2,7234,'5.99','2005-07-27 10:08:45','2006-02-15 22:17:10'),(10067,372,2,7735,'4.99','2005-07-28 05:09:56','2006-02-15 22:17:10'),(10068,372,2,8009,'7.99','2005-07-28 15:25:58','2006-02-15 22:17:10'),(10069,372,1,8059,'2.99','2005-07-28 17:09:59','2006-02-15 22:17:10'),(10070,372,1,8358,'0.99','2005-07-29 05:00:58','2006-02-15 22:17:10'),(10071,372,1,8724,'0.99','2005-07-29 18:05:21','2006-02-15 22:17:10'),(10072,372,1,8755,'2.99','2005-07-29 19:18:31','2006-02-15 22:17:10'),(10073,372,2,8837,'8.99','2005-07-29 22:49:00','2006-02-15 22:17:10'),(10074,372,1,9128,'5.99','2005-07-30 09:51:14','2006-02-15 22:17:10'),(10075,372,2,11134,'10.99','2005-08-02 09:19:22','2006-02-15 22:17:10'),(10076,372,2,11438,'3.99','2005-08-02 20:21:08','2006-02-15 22:17:10'),(10077,372,2,11555,'4.99','2005-08-17 01:08:59','2006-02-15 22:17:10'),(10078,372,1,12224,'0.99','2005-08-18 02:59:09','2006-02-15 22:17:10'),(10079,372,1,12714,'3.99','2005-08-18 21:08:01','2006-02-15 22:17:10'),(10080,372,2,13402,'4.99','2005-08-19 22:16:53','2006-02-15 22:17:11'),(10081,372,2,13871,'8.99','2005-08-20 15:10:13','2006-02-15 22:17:11'),(10082,372,2,14037,'9.99','2005-08-20 21:35:58','2006-02-15 22:17:11'),(10083,372,1,14211,'4.99','2005-08-21 04:29:11','2006-02-15 22:17:11'),(10084,372,1,14331,'2.99','2005-08-21 08:29:38','2006-02-15 22:17:11'),(10085,372,1,14770,'1.99','2005-08-21 23:47:16','2006-02-15 22:17:11'),(10086,372,2,15041,'0.99','2005-08-22 09:43:18','2006-02-15 22:17:11'),(10087,372,1,15563,'2.99','2005-08-23 05:08:58','2006-02-15 22:17:11'),(10088,373,2,257,'4.99','2005-05-26 15:27:05','2006-02-15 22:17:11'),(10089,373,1,1472,'6.99','2005-06-15 20:54:55','2006-02-15 22:17:11'),(10090,373,1,3161,'2.99','2005-06-20 21:21:01','2006-02-15 22:17:11'),(10091,373,2,3609,'2.99','2005-07-06 05:36:22','2006-02-15 22:17:11'),(10092,373,2,3667,'4.99','2005-07-06 08:36:34','2006-02-15 22:17:11'),(10093,373,1,4325,'7.99','2005-07-07 17:59:24','2006-02-15 22:17:11'),(10094,373,1,5120,'5.99','2005-07-09 07:14:23','2006-02-15 22:17:11'),(10095,373,1,6202,'3.99','2005-07-11 12:24:25','2006-02-15 22:17:11'),(10096,373,2,6311,'0.99','2005-07-11 18:18:52','2006-02-15 22:17:11'),(10097,373,1,6944,'4.99','2005-07-26 23:34:02','2006-02-15 22:17:11'),(10098,373,1,7094,'0.99','2005-07-27 04:47:33','2006-02-15 22:17:11'),(10099,373,2,7206,'3.99','2005-07-27 09:07:05','2006-02-15 22:17:11'),(10100,373,1,7615,'0.99','2005-07-28 00:15:24','2006-02-15 22:17:11'),(10101,373,1,8611,'3.99','2005-07-29 13:26:21','2006-02-15 22:17:12'),(10102,373,2,9327,'8.99','2005-07-30 17:31:03','2006-02-15 22:17:12'),(10103,373,1,9397,'4.99','2005-07-30 20:07:29','2006-02-15 22:17:12'),(10104,373,2,9480,'0.99','2005-07-30 23:26:03','2006-02-15 22:17:12'),(10105,373,1,9966,'4.99','2005-07-31 16:26:46','2006-02-15 22:17:12'),(10106,373,1,10010,'6.99','2005-07-31 18:01:36','2006-02-15 22:17:12'),(10107,373,1,10221,'4.99','2005-08-01 01:16:50','2006-02-15 22:17:12'),(10108,373,1,10758,'5.99','2005-08-01 20:22:51','2006-02-15 22:17:12'),(10109,373,2,11066,'7.99','2005-08-02 06:58:32','2006-02-15 22:17:12'),(10110,373,2,11512,'7.99','2005-08-16 23:51:06','2006-02-15 22:17:12'),(10111,373,2,11663,'3.99','2005-08-17 05:30:19','2006-02-15 22:17:12'),(10112,373,2,11976,'3.99','2005-08-17 17:59:19','2006-02-15 22:17:12'),(10113,373,1,12142,'5.99','2005-08-18 00:04:12','2006-02-15 22:17:12'),(10114,373,2,12536,'5.99','2005-08-18 14:06:06','2006-02-15 22:17:12'),(10115,373,1,12748,'7.99','2005-08-18 22:29:05','2006-02-15 22:17:12'),(10116,373,2,12780,'0.99','2005-08-18 23:48:16','2006-02-15 22:17:12'),(10117,373,2,13299,'2.99','2005-08-19 18:46:33','2006-02-15 22:17:12'),(10118,373,1,13329,'3.99','2005-08-19 19:56:55','2006-02-15 22:17:12'),(10119,373,2,13467,'2.99','2005-08-20 00:56:44','2006-02-15 22:17:12'),(10120,373,2,15014,'6.99','2005-08-22 08:43:11','2006-02-15 22:17:12'),(10121,373,1,15068,'3.99','2005-08-22 10:50:13','2006-02-15 22:17:13'),(10122,373,1,11739,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:13'),(10123,374,1,521,'0.99','2005-05-28 03:32:22','2006-02-15 22:17:13'),(10124,374,2,910,'2.99','2005-05-30 10:46:16','2006-02-15 22:17:13'),(10125,374,2,919,'0.99','2005-05-30 11:35:06','2006-02-15 22:17:13'),(10126,374,1,1548,'1.99','2005-06-16 01:43:33','2006-02-15 22:17:13'),(10127,374,2,2046,'1.99','2005-06-17 14:39:50','2006-02-15 22:17:13'),(10128,374,2,2487,'4.99','2005-06-18 21:32:54','2006-02-15 22:17:13'),(10129,374,2,2641,'2.99','2005-06-19 09:38:33','2006-02-15 22:17:13'),(10130,374,1,3797,'1.99','2005-07-06 14:54:52','2006-02-15 22:17:13'),(10131,374,1,5463,'4.99','2005-07-09 22:57:02','2006-02-15 22:17:13'),(10132,374,1,5570,'6.99','2005-07-10 03:46:47','2006-02-15 22:17:13'),(10133,374,2,5591,'3.99','2005-07-10 04:25:03','2006-02-15 22:17:13'),(10134,374,2,5945,'2.99','2005-07-10 22:52:42','2006-02-15 22:17:13'),(10135,374,2,6315,'0.99','2005-07-11 18:42:49','2006-02-15 22:17:13'),(10136,374,2,7837,'0.99','2005-07-28 08:58:32','2006-02-15 22:17:13'),(10137,374,2,8586,'7.99','2005-07-29 12:16:34','2006-02-15 22:17:13'),(10138,374,2,9113,'0.99','2005-07-30 09:09:03','2006-02-15 22:17:13'),(10139,374,1,9866,'6.99','2005-07-31 13:13:50','2006-02-15 22:17:13'),(10140,374,1,10695,'2.99','2005-08-01 18:16:20','2006-02-15 22:17:13'),(10141,374,1,11619,'0.99','2005-08-17 04:03:26','2006-02-15 22:17:13'),(10142,374,2,12696,'2.99','2005-08-18 20:13:08','2006-02-15 22:17:14'),(10143,374,1,13337,'2.99','2005-08-19 20:06:57','2006-02-15 22:17:14'),(10144,374,2,13734,'4.99','2005-08-20 10:29:57','2006-02-15 22:17:14'),(10145,374,2,14524,'8.99','2005-08-21 15:05:27','2006-02-15 22:17:14'),(10146,374,2,15053,'5.99','2005-08-22 10:13:09','2006-02-15 22:17:14'),(10147,374,1,15200,'2.99','2005-08-22 16:22:53','2006-02-15 22:17:14'),(10148,374,2,15202,'4.99','2005-08-22 16:26:53','2006-02-15 22:17:14'),(10149,374,2,15366,'6.99','2005-08-22 21:45:57','2006-02-15 22:17:14'),(10150,374,2,15966,'2.99','2006-02-14 15:16:03','2006-02-15 22:17:14'),(10151,375,2,307,'8.99','2005-05-26 21:48:13','2006-02-15 22:17:14'),(10152,375,1,412,'4.99','2005-05-27 14:17:23','2006-02-15 22:17:14'),(10153,375,2,749,'4.99','2005-05-29 09:33:33','2006-02-15 22:17:14'),(10154,375,1,873,'2.99','2005-05-30 05:15:20','2006-02-15 22:17:14'),(10155,375,2,1404,'2.99','2005-06-15 16:38:53','2006-02-15 22:17:14'),(10156,375,1,1499,'5.99','2005-06-15 21:58:07','2006-02-15 22:17:14'),(10157,375,1,2236,'4.99','2005-06-18 04:12:33','2006-02-15 22:17:14'),(10158,375,1,3981,'6.99','2005-07-06 23:12:12','2006-02-15 22:17:14'),(10159,375,2,4335,'4.99','2005-07-07 18:33:57','2006-02-15 22:17:14'),(10160,375,2,5474,'2.99','2005-07-09 23:23:57','2006-02-15 22:17:14'),(10161,375,1,7856,'4.99','2005-07-28 09:48:24','2006-02-15 22:17:14'),(10162,375,2,8900,'2.99','2005-07-30 01:07:03','2006-02-15 22:17:14'),(10163,375,1,10274,'0.99','2005-08-01 03:16:51','2006-02-15 22:17:15'),(10164,375,2,10589,'1.99','2005-08-01 14:11:09','2006-02-15 22:17:15'),(10165,375,1,10640,'0.99','2005-08-01 15:44:51','2006-02-15 22:17:15'),(10166,375,1,10672,'4.99','2005-08-01 17:10:54','2006-02-15 22:17:15'),(10167,375,1,10859,'5.99','2005-08-02 00:11:39','2006-02-15 22:17:15'),(10168,375,1,10961,'6.99','2005-08-02 03:47:55','2006-02-15 22:17:15'),(10169,375,2,11008,'5.99','2005-08-02 05:06:17','2006-02-15 22:17:15'),(10170,375,2,12122,'9.99','2005-08-17 23:20:45','2006-02-15 22:17:15'),(10171,375,2,12663,'0.99','2005-08-18 19:10:52','2006-02-15 22:17:15'),(10172,375,1,13836,'4.99','2005-08-20 14:18:16','2006-02-15 22:17:15'),(10173,375,1,15004,'2.99','2005-08-22 08:15:21','2006-02-15 22:17:15'),(10174,375,1,15505,'4.99','2005-08-23 02:46:13','2006-02-15 22:17:15'),(10175,376,1,554,'0.99','2005-05-28 08:23:16','2006-02-15 22:17:15'),(10176,376,2,1208,'0.99','2005-06-15 02:30:03','2006-02-15 22:17:15'),(10177,376,1,2779,'0.99','2005-06-19 18:19:07','2006-02-15 22:17:15'),(10178,376,2,3719,'2.99','2005-07-06 11:05:55','2006-02-15 22:17:15'),(10179,376,1,4163,'0.99','2005-07-07 09:19:28','2006-02-15 22:17:15'),(10180,376,2,4166,'8.99','2005-07-07 09:33:30','2006-02-15 22:17:15'),(10181,376,1,4320,'3.99','2005-07-07 17:51:59','2006-02-15 22:17:15'),(10182,376,1,4554,'5.99','2005-07-08 04:48:03','2006-02-15 22:17:15'),(10183,376,1,4869,'4.99','2005-07-08 19:14:05','2006-02-15 22:17:16'),(10184,376,1,5675,'4.99','2005-07-10 08:31:06','2006-02-15 22:17:16'),(10185,376,1,6524,'6.99','2005-07-12 04:14:35','2006-02-15 22:17:16'),(10186,376,1,6545,'8.99','2005-07-12 04:56:30','2006-02-15 22:17:16'),(10187,376,2,6807,'2.99','2005-07-12 17:33:53','2006-02-15 22:17:16'),(10188,376,1,8269,'2.99','2005-07-29 01:26:54','2006-02-15 22:17:16'),(10189,376,1,8420,'5.99','2005-07-29 07:00:45','2006-02-15 22:17:16'),(10190,376,1,9773,'4.99','2005-07-31 09:56:56','2006-02-15 22:17:16'),(10191,376,1,9828,'2.99','2005-07-31 11:56:57','2006-02-15 22:17:16'),(10192,376,1,9872,'0.99','2005-07-31 13:27:55','2006-02-15 22:17:16'),(10193,376,2,10413,'3.99','2005-08-01 07:59:39','2006-02-15 22:17:16'),(10194,376,1,10810,'3.99','2005-08-01 22:40:39','2006-02-15 22:17:16'),(10195,376,1,11144,'4.99','2005-08-02 09:39:17','2006-02-15 22:17:16'),(10196,376,2,11792,'4.99','2005-08-17 11:03:53','2006-02-15 22:17:16'),(10197,376,1,11851,'4.99','2005-08-17 13:30:27','2006-02-15 22:17:16'),(10198,376,1,13009,'0.99','2005-08-19 07:50:35','2006-02-15 22:17:16'),(10199,376,1,13141,'0.99','2005-08-19 12:41:41','2006-02-15 22:17:16'),(10200,376,2,13761,'4.99','2005-08-20 11:28:50','2006-02-15 22:17:16'),(10201,376,1,15107,'4.99','2005-08-22 12:05:02','2006-02-15 22:17:16'),(10202,376,1,15382,'2.99','2005-08-22 22:30:50','2006-02-15 22:17:16'),(10203,377,2,2556,'3.99','2005-06-19 03:07:32','2006-02-15 22:17:16'),(10204,377,1,3080,'1.99','2005-06-20 15:22:32','2006-02-15 22:17:17'),(10205,377,2,3086,'0.99','2005-06-20 15:42:40','2006-02-15 22:17:17'),(10206,377,2,3136,'2.99','2005-06-20 19:39:08','2006-02-15 22:17:17'),(10207,377,2,3443,'4.99','2005-06-21 20:19:00','2006-02-15 22:17:17'),(10208,377,1,3858,'2.99','2005-07-06 17:17:57','2006-02-15 22:17:17'),(10209,377,2,4053,'0.99','2005-07-07 03:39:22','2006-02-15 22:17:17'),(10210,377,1,4077,'0.99','2005-07-07 04:53:40','2006-02-15 22:17:17'),(10211,377,1,4225,'0.99','2005-07-07 12:24:37','2006-02-15 22:17:17'),(10212,377,2,6893,'7.99','2005-07-12 21:20:11','2006-02-15 22:17:17'),(10213,377,1,7697,'1.99','2005-07-28 03:43:45','2006-02-15 22:17:17'),(10214,377,2,8018,'10.99','2005-07-28 15:36:48','2006-02-15 22:17:17'),(10215,377,2,8916,'4.99','2005-07-30 01:42:21','2006-02-15 22:17:17'),(10216,377,2,9461,'3.99','2005-07-30 22:29:13','2006-02-15 22:17:17'),(10217,377,1,9564,'0.99','2005-07-31 02:31:37','2006-02-15 22:17:17'),(10218,377,1,10013,'4.99','2005-07-31 18:08:21','2006-02-15 22:17:17'),(10219,377,1,10183,'8.99','2005-08-01 00:08:01','2006-02-15 22:17:17'),(10220,377,1,10738,'3.99','2005-08-01 19:39:08','2006-02-15 22:17:17'),(10221,377,1,10943,'2.99','2005-08-02 03:17:29','2006-02-15 22:17:17'),(10222,377,1,12390,'1.99','2005-08-18 08:51:42','2006-02-15 22:17:17'),(10223,377,1,12549,'4.99','2005-08-18 14:38:07','2006-02-15 22:17:17'),(10224,377,1,13249,'2.99','2005-08-19 16:47:41','2006-02-15 22:17:17'),(10225,377,1,13275,'0.99','2005-08-19 17:53:38','2006-02-15 22:17:18'),(10226,377,2,15088,'0.99','2005-08-22 11:28:26','2006-02-15 22:17:18'),(10227,377,1,15995,'0.99','2005-08-23 20:29:56','2006-02-15 22:17:18'),(10228,377,1,15999,'7.99','2005-08-23 20:44:10','2006-02-15 22:17:18'),(10229,378,1,347,'0.99','2005-05-27 04:40:33','2006-02-15 22:17:18'),(10230,378,2,1623,'4.99','2005-06-16 07:48:50','2006-02-15 22:17:18'),(10231,378,1,1662,'5.99','2005-06-16 10:13:35','2006-02-15 22:17:18'),(10232,378,2,2134,'7.99','2005-06-17 21:13:44','2006-02-15 22:17:18'),(10233,378,2,2713,'4.99','2005-06-19 14:23:09','2006-02-15 22:17:18'),(10234,378,1,3759,'4.99','2005-07-06 12:46:38','2006-02-15 22:17:18'),(10235,378,2,4755,'0.99','2005-07-08 14:23:41','2006-02-15 22:17:18'),(10236,378,1,5578,'1.99','2005-07-10 04:00:31','2006-02-15 22:17:18'),(10237,378,2,6233,'1.99','2005-07-11 14:10:47','2006-02-15 22:17:18'),(10238,378,1,7888,'0.99','2005-07-28 10:40:24','2006-02-15 22:17:18'),(10239,378,2,8740,'2.99','2005-07-29 18:41:31','2006-02-15 22:17:18'),(10240,378,2,9668,'3.99','2005-07-31 06:31:03','2006-02-15 22:17:18'),(10241,378,1,9868,'2.99','2005-07-31 13:20:08','2006-02-15 22:17:18'),(10242,378,1,10917,'4.99','2005-08-02 02:06:18','2006-02-15 22:17:18'),(10243,378,1,11111,'4.99','2005-08-02 08:21:27','2006-02-15 22:17:18'),(10244,378,1,12596,'2.99','2005-08-18 16:29:35','2006-02-15 22:17:18'),(10245,378,1,12828,'4.99','2005-08-19 01:37:47','2006-02-15 22:17:19'),(10246,378,2,14502,'4.99','2005-08-21 14:22:28','2006-02-15 22:17:19'),(10247,378,1,14971,'2.99','2005-08-22 06:52:49','2006-02-15 22:17:19'),(10248,379,2,209,'4.99','2005-05-26 08:14:01','2006-02-15 22:17:19'),(10249,379,1,863,'4.99','2005-05-30 03:14:59','2006-02-15 22:17:19'),(10250,379,1,1383,'8.99','2005-06-15 15:20:06','2006-02-15 22:17:19'),(10251,379,1,2313,'5.99','2005-06-18 08:56:45','2006-02-15 22:17:19'),(10252,379,1,2926,'2.99','2005-06-20 04:37:45','2006-02-15 22:17:19'),(10253,379,1,3788,'4.99','2005-07-06 14:02:02','2006-02-15 22:17:19'),(10254,379,2,4740,'2.99','2005-07-08 13:30:35','2006-02-15 22:17:19'),(10255,379,1,5402,'4.99','2005-07-09 20:01:58','2006-02-15 22:17:19'),(10256,379,1,6235,'7.99','2005-07-11 14:17:51','2006-02-15 22:17:19'),(10257,379,2,7041,'4.99','2005-07-27 03:18:32','2006-02-15 22:17:19'),(10258,379,1,10041,'4.99','2005-07-31 19:01:02','2006-02-15 22:17:19'),(10259,379,2,11457,'3.99','2005-08-02 21:14:16','2006-02-15 22:17:19'),(10260,379,1,12503,'4.99','2005-08-18 13:16:46','2006-02-15 22:17:19'),(10261,379,1,13334,'0.99','2005-08-19 20:02:33','2006-02-15 22:17:19'),(10262,379,2,13397,'7.99','2005-08-19 22:06:35','2006-02-15 22:17:19'),(10263,379,1,13485,'0.99','2005-08-20 01:20:14','2006-02-15 22:17:19'),(10264,379,1,14011,'5.99','2005-08-20 20:32:56','2006-02-15 22:17:19'),(10265,379,2,14152,'2.99','2005-08-21 02:23:50','2006-02-15 22:17:19'),(10266,379,1,14470,'0.99','2005-08-21 13:09:41','2006-02-15 22:17:20'),(10267,379,1,14886,'4.99','2005-08-22 03:59:01','2006-02-15 22:17:20'),(10268,379,2,15399,'4.99','2005-08-22 23:11:59','2006-02-15 22:17:20'),(10269,379,1,15446,'4.99','2005-08-23 00:49:24','2006-02-15 22:17:20'),(10270,379,2,15930,'3.99','2005-08-23 18:26:51','2006-02-15 22:17:20'),(10271,380,1,847,'3.99','2005-05-30 01:18:15','2006-02-15 22:17:20'),(10272,380,1,1868,'3.99','2005-06-17 02:03:22','2006-02-15 22:17:20'),(10273,380,1,1984,'2.99','2005-06-17 10:25:28','2006-02-15 22:17:20'),(10274,380,1,2018,'3.99','2005-06-17 12:35:58','2006-02-15 22:17:20'),(10275,380,1,2440,'2.99','2005-06-18 18:41:09','2006-02-15 22:17:20'),(10276,380,1,2464,'4.99','2005-06-18 20:06:05','2006-02-15 22:17:20'),(10277,380,2,2998,'1.99','2005-06-20 09:30:22','2006-02-15 22:17:20'),(10278,380,2,3099,'1.99','2005-06-20 16:44:33','2006-02-15 22:17:20'),(10279,380,1,3260,'4.99','2005-06-21 03:59:13','2006-02-15 22:17:20'),(10280,380,1,3637,'2.99','2005-07-06 07:06:31','2006-02-15 22:17:20'),(10281,380,1,3688,'4.99','2005-07-06 09:41:53','2006-02-15 22:17:20'),(10282,380,1,4675,'2.99','2005-07-08 10:24:22','2006-02-15 22:17:20'),(10283,380,2,4706,'4.99','2005-07-08 11:51:41','2006-02-15 22:17:20'),(10284,380,2,5339,'0.99','2005-07-09 17:09:17','2006-02-15 22:17:20'),(10285,380,2,7021,'8.99','2005-07-27 02:26:38','2006-02-15 22:17:20'),(10286,380,2,7167,'2.99','2005-07-27 07:37:26','2006-02-15 22:17:20'),(10287,380,2,7435,'0.99','2005-07-27 17:38:44','2006-02-15 22:17:21'),(10288,380,2,7443,'2.99','2005-07-27 17:47:43','2006-02-15 22:17:21'),(10289,380,1,7773,'2.99','2005-07-28 07:02:17','2006-02-15 22:17:21'),(10290,380,1,7974,'3.99','2005-07-28 14:11:57','2006-02-15 22:17:21'),(10291,380,1,9056,'0.99','2005-07-30 07:13:20','2006-02-15 22:17:21'),(10292,380,1,9261,'6.99','2005-07-30 14:39:35','2006-02-15 22:17:21'),(10293,380,1,9710,'10.99','2005-07-31 08:05:31','2006-02-15 22:17:21'),(10294,380,2,10450,'1.99','2005-08-01 09:10:03','2006-02-15 22:17:21'),(10295,380,1,10983,'3.99','2005-08-02 04:24:23','2006-02-15 22:17:21'),(10296,380,1,11936,'0.99','2005-08-17 16:45:34','2006-02-15 22:17:21'),(10297,380,2,11945,'0.99','2005-08-17 17:05:33','2006-02-15 22:17:21'),(10298,380,1,12636,'3.99','2005-08-18 18:00:29','2006-02-15 22:17:21'),(10299,380,1,12996,'6.99','2005-08-19 07:31:32','2006-02-15 22:17:21'),(10300,380,1,14529,'6.99','2005-08-21 15:08:31','2006-02-15 22:17:21'),(10301,380,1,14935,'1.99','2005-08-22 05:47:31','2006-02-15 22:17:21'),(10302,380,2,15175,'5.99','2005-08-22 15:29:15','2006-02-15 22:17:21'),(10303,380,1,15361,'2.99','2005-08-22 21:39:45','2006-02-15 22:17:21'),(10304,380,2,15636,'2.99','2005-08-23 07:50:46','2006-02-15 22:17:21'),(10305,380,1,15697,'2.99','2005-08-23 10:04:36','2006-02-15 22:17:21'),(10306,380,2,15748,'2.99','2005-08-23 12:33:00','2006-02-15 22:17:21'),(10307,381,2,169,'0.99','2005-05-26 03:09:30','2006-02-15 22:17:22'),(10308,381,2,406,'2.99','2005-05-27 13:46:46','2006-02-15 22:17:22'),(10309,381,1,835,'2.99','2005-05-29 23:37:00','2006-02-15 22:17:22'),(10310,381,1,1402,'3.99','2005-06-15 16:31:08','2006-02-15 22:17:22'),(10311,381,1,1878,'1.99','2005-06-17 02:55:32','2006-02-15 22:17:22'),(10312,381,2,2410,'2.99','2005-06-18 16:55:08','2006-02-15 22:17:22'),(10313,381,1,2418,'4.99','2005-06-18 17:14:42','2006-02-15 22:17:22'),(10314,381,2,3425,'2.99','2005-06-21 18:07:07','2006-02-15 22:17:22'),(10315,381,2,3812,'0.99','2005-07-06 15:22:19','2006-02-15 22:17:22'),(10316,381,2,3970,'2.99','2005-07-06 22:48:17','2006-02-15 22:17:22'),(10317,381,1,4735,'0.99','2005-07-08 13:12:27','2006-02-15 22:17:22'),(10318,381,2,5689,'0.99','2005-07-10 09:24:17','2006-02-15 22:17:22'),(10319,381,2,6116,'2.99','2005-07-11 07:37:38','2006-02-15 22:17:22'),(10320,381,2,6451,'4.99','2005-07-12 00:52:19','2006-02-15 22:17:22'),(10321,381,2,6778,'2.99','2005-07-12 16:06:00','2006-02-15 22:17:22'),(10322,381,1,7375,'2.99','2005-07-27 15:22:33','2006-02-15 22:17:22'),(10323,381,1,7645,'2.99','2005-07-28 01:27:42','2006-02-15 22:17:22'),(10324,381,2,8688,'0.99','2005-07-29 16:31:32','2006-02-15 22:17:22'),(10325,381,2,9144,'0.99','2005-07-30 10:22:15','2006-02-15 22:17:22'),(10326,381,2,9173,'4.99','2005-07-30 11:40:10','2006-02-15 22:17:22'),(10327,381,1,9822,'2.99','2005-07-31 11:48:25','2006-02-15 22:17:22'),(10328,381,2,10033,'4.99','2005-07-31 18:44:29','2006-02-15 22:17:23'),(10329,381,1,10608,'0.99','2005-08-01 14:48:41','2006-02-15 22:17:23'),(10330,381,2,10705,'0.99','2005-08-01 18:38:54','2006-02-15 22:17:23'),(10331,381,1,11519,'2.99','2005-08-17 00:01:27','2006-02-15 22:17:23'),(10332,381,2,12135,'2.99','2005-08-17 23:50:24','2006-02-15 22:17:23'),(10333,381,2,12237,'4.99','2005-08-18 03:24:38','2006-02-15 22:17:23'),(10334,381,2,12632,'2.99','2005-08-18 17:54:21','2006-02-15 22:17:23'),(10335,381,2,13202,'8.99','2005-08-19 14:58:30','2006-02-15 22:17:23'),(10336,381,2,13430,'0.99','2005-08-19 23:25:43','2006-02-15 22:17:23'),(10337,381,1,13614,'0.99','2005-08-20 06:28:37','2006-02-15 22:17:23'),(10338,381,2,13995,'2.99','2005-08-20 19:34:43','2006-02-15 22:17:23'),(10339,381,1,14198,'4.99','2005-08-21 03:48:31','2006-02-15 22:17:23'),(10340,381,2,15299,'4.99','2005-08-22 19:42:57','2006-02-15 22:17:23'),(10341,381,1,15747,'4.99','2005-08-23 12:29:24','2006-02-15 22:17:23'),(10342,382,2,356,'2.99','2005-05-27 06:32:30','2006-02-15 22:17:23'),(10343,382,1,522,'2.99','2005-05-28 03:33:20','2006-02-15 22:17:23'),(10344,382,1,2389,'0.99','2005-06-18 15:27:47','2006-02-15 22:17:23'),(10345,382,1,2468,'4.99','2005-06-18 20:23:52','2006-02-15 22:17:23'),(10346,382,1,2489,'1.99','2005-06-18 22:00:44','2006-02-15 22:17:23'),(10347,382,1,2514,'2.99','2005-06-18 23:56:44','2006-02-15 22:17:23'),(10348,382,2,3125,'4.99','2005-06-20 18:31:58','2006-02-15 22:17:24'),(10349,382,2,3480,'3.99','2005-07-05 23:11:43','2006-02-15 22:17:24'),(10350,382,2,4351,'4.99','2005-07-07 19:04:24','2006-02-15 22:17:24'),(10351,382,1,5004,'4.99','2005-07-09 01:20:50','2006-02-15 22:17:24'),(10352,382,1,5816,'0.99','2005-07-10 15:48:47','2006-02-15 22:17:24'),(10353,382,2,7625,'0.99','2005-07-28 00:47:56','2006-02-15 22:17:24'),(10354,382,2,8777,'0.99','2005-07-29 20:10:21','2006-02-15 22:17:24'),(10355,382,1,8871,'9.99','2005-07-30 00:12:41','2006-02-15 22:17:24'),(10356,382,1,8993,'4.99','2005-07-30 04:51:25','2006-02-15 22:17:24'),(10357,382,1,9067,'6.99','2005-07-30 07:31:01','2006-02-15 22:17:24'),(10358,382,2,9555,'0.99','2005-07-31 02:11:16','2006-02-15 22:17:24'),(10359,382,2,10327,'3.99','2005-08-01 04:55:35','2006-02-15 22:17:24'),(10360,382,2,12229,'0.99','2005-08-18 03:08:23','2006-02-15 22:17:24'),(10361,382,2,12529,'0.99','2005-08-18 13:53:36','2006-02-15 22:17:24'),(10362,382,1,14009,'4.99','2005-08-20 20:26:53','2006-02-15 22:17:24'),(10363,382,2,14300,'4.99','2005-08-21 07:19:37','2006-02-15 22:17:24'),(10364,382,2,14354,'5.99','2005-08-21 09:08:14','2006-02-15 22:17:24'),(10365,382,2,15939,'7.99','2005-08-23 18:44:21','2006-02-15 22:17:24'),(10366,383,2,63,'0.99','2005-05-25 09:19:16','2006-02-15 22:17:24'),(10367,383,1,766,'8.99','2005-05-29 11:47:02','2006-02-15 22:17:24'),(10368,383,1,1831,'7.99','2005-06-16 22:22:17','2006-02-15 22:17:25'),(10369,383,2,2228,'2.99','2005-06-18 03:44:50','2006-02-15 22:17:25'),(10370,383,1,2252,'2.99','2005-06-18 05:05:18','2006-02-15 22:17:25'),(10371,383,2,2318,'2.99','2005-06-18 09:13:54','2006-02-15 22:17:25'),(10372,383,1,2609,'7.99','2005-06-19 07:13:12','2006-02-15 22:17:25'),(10373,383,1,3091,'2.99','2005-06-20 16:02:59','2006-02-15 22:17:25'),(10374,383,2,4747,'5.99','2005-07-08 13:53:01','2006-02-15 22:17:25'),(10375,383,2,6091,'4.99','2005-07-11 05:49:18','2006-02-15 22:17:25'),(10376,383,2,6244,'0.99','2005-07-11 14:53:38','2006-02-15 22:17:25'),(10377,383,1,6775,'4.99','2005-07-12 16:01:44','2006-02-15 22:17:25'),(10378,383,1,7367,'3.99','2005-07-27 15:05:45','2006-02-15 22:17:25'),(10379,383,2,8367,'2.99','2005-07-29 05:11:19','2006-02-15 22:17:25'),(10380,383,1,8635,'0.99','2005-07-29 14:22:48','2006-02-15 22:17:25'),(10381,383,1,9653,'0.99','2005-07-31 05:55:38','2006-02-15 22:17:25'),(10382,383,1,9678,'0.99','2005-07-31 06:40:47','2006-02-15 22:17:25'),(10383,383,2,10515,'4.99','2005-08-01 11:41:33','2006-02-15 22:17:25'),(10384,383,1,10971,'4.99','2005-08-02 04:08:17','2006-02-15 22:17:25'),(10385,383,2,10993,'0.99','2005-08-02 04:45:01','2006-02-15 22:17:25'),(10386,383,2,11122,'0.99','2005-08-02 08:49:09','2006-02-15 22:17:25'),(10387,383,1,11592,'2.99','2005-08-17 02:36:04','2006-02-15 22:17:25'),(10388,383,1,12735,'4.99','2005-08-18 22:04:54','2006-02-15 22:17:25'),(10389,383,2,14039,'4.99','2005-08-20 21:39:43','2006-02-15 22:17:26'),(10390,383,2,14678,'4.99','2005-08-21 20:12:43','2006-02-15 22:17:26'),(10391,383,1,15416,'1.99','2005-08-22 23:51:23','2006-02-15 22:17:26'),(10392,383,1,15881,'6.99','2005-08-23 16:44:25','2006-02-15 22:17:26'),(10393,384,2,103,'4.99','2005-05-25 17:30:42','2006-02-15 22:17:26'),(10394,384,2,279,'2.99','2005-05-26 18:02:50','2006-02-15 22:17:26'),(10395,384,1,898,'0.99','2005-05-30 09:26:19','2006-02-15 22:17:26'),(10396,384,2,1013,'2.99','2005-05-31 02:37:00','2006-02-15 22:17:26'),(10397,384,1,1961,'0.99','2005-06-17 09:02:58','2006-02-15 22:17:26'),(10398,384,2,2020,'0.99','2005-06-17 12:39:50','2006-02-15 22:17:26'),(10399,384,1,2378,'7.99','2005-06-18 14:57:49','2006-02-15 22:17:26'),(10400,384,2,2510,'5.99','2005-06-18 23:44:21','2006-02-15 22:17:26'),(10401,384,2,2935,'3.99','2005-06-20 05:07:24','2006-02-15 22:17:26'),(10402,384,1,3088,'9.99','2005-06-20 15:56:05','2006-02-15 22:17:26'),(10403,384,2,3101,'4.99','2005-06-20 16:48:58','2006-02-15 22:17:26'),(10404,384,2,4424,'0.99','2005-07-07 22:14:43','2006-02-15 22:17:26'),(10405,384,2,5250,'0.99','2005-07-09 13:35:32','2006-02-15 22:17:26'),(10406,384,1,5608,'4.99','2005-07-10 05:08:26','2006-02-15 22:17:26'),(10407,384,2,5797,'4.99','2005-07-10 14:43:52','2006-02-15 22:17:26'),(10408,384,2,5966,'2.99','2005-07-10 23:59:27','2006-02-15 22:17:26'),(10409,384,2,6387,'0.99','2005-07-11 22:15:56','2006-02-15 22:17:27'),(10410,384,2,7799,'0.99','2005-07-28 07:42:09','2006-02-15 22:17:27'),(10411,384,1,8445,'1.99','2005-07-29 07:37:48','2006-02-15 22:17:27'),(10412,384,2,11773,'5.99','2005-08-17 10:19:51','2006-02-15 22:17:27'),(10413,384,2,13521,'2.99','2005-08-20 02:42:28','2006-02-15 22:17:27'),(10414,384,2,14416,'2.99','2005-08-21 11:11:46','2006-02-15 22:17:27'),(10415,384,1,14841,'0.99','2005-08-22 02:03:30','2006-02-15 22:17:27'),(10416,384,1,14963,'5.99','2005-08-22 06:38:10','2006-02-15 22:17:27'),(10417,384,2,15321,'4.99','2005-08-22 20:20:04','2006-02-15 22:17:27'),(10418,385,1,917,'2.99','2005-05-30 11:27:06','2006-02-15 22:17:27'),(10419,385,2,1038,'4.99','2005-05-31 05:23:47','2006-02-15 22:17:27'),(10420,385,1,1746,'2.99','2005-06-16 16:41:19','2006-02-15 22:17:27'),(10421,385,1,1937,'0.99','2005-06-17 07:16:46','2006-02-15 22:17:27'),(10422,385,1,3105,'0.99','2005-06-20 17:11:46','2006-02-15 22:17:27'),(10423,385,2,3878,'8.99','2005-07-06 18:27:09','2006-02-15 22:17:27'),(10424,385,2,3953,'0.99','2005-07-06 21:54:55','2006-02-15 22:17:27'),(10425,385,1,4714,'6.99','2005-07-08 12:12:48','2006-02-15 22:17:27'),(10426,385,1,5783,'2.99','2005-07-10 13:55:33','2006-02-15 22:17:27'),(10427,385,1,6445,'4.99','2005-07-12 00:37:02','2006-02-15 22:17:27'),(10428,385,2,6933,'4.99','2005-07-26 23:09:23','2006-02-15 22:17:27'),(10429,385,2,7776,'0.99','2005-07-28 07:04:36','2006-02-15 22:17:28'),(10430,385,1,8346,'2.99','2005-07-29 04:48:22','2006-02-15 22:17:28'),(10431,385,1,8518,'2.99','2005-07-29 10:05:27','2006-02-15 22:17:28'),(10432,385,1,9570,'2.99','2005-07-31 02:40:37','2006-02-15 22:17:28'),(10433,385,1,9704,'4.99','2005-07-31 07:39:32','2006-02-15 22:17:28'),(10434,385,1,10557,'0.99','2005-08-01 12:59:24','2006-02-15 22:17:28'),(10435,385,1,10636,'3.99','2005-08-01 15:40:35','2006-02-15 22:17:28'),(10436,385,1,10655,'4.99','2005-08-01 16:33:27','2006-02-15 22:17:28'),(10437,385,1,11021,'2.99','2005-08-02 05:30:11','2006-02-15 22:17:28'),(10438,385,1,11559,'2.99','2005-08-17 01:20:26','2006-02-15 22:17:28'),(10439,385,2,12310,'2.99','2005-08-18 06:02:34','2006-02-15 22:17:28'),(10440,385,2,12686,'8.99','2005-08-18 19:55:09','2006-02-15 22:17:28'),(10441,385,2,13062,'7.99','2005-08-19 09:44:17','2006-02-15 22:17:28'),(10442,385,1,13117,'0.99','2005-08-19 11:33:20','2006-02-15 22:17:28'),(10443,385,1,15488,'6.99','2005-08-23 02:06:01','2006-02-15 22:17:28'),(10444,386,1,583,'7.99','2005-05-28 11:48:55','2006-02-15 22:17:28'),(10445,386,2,1585,'3.99','2005-06-16 04:51:13','2006-02-15 22:17:28'),(10446,386,1,1608,'2.99','2005-06-16 06:28:57','2006-02-15 22:17:28'),(10447,386,2,1819,'5.99','2005-06-16 21:32:50','2006-02-15 22:17:28'),(10448,386,1,2732,'0.99','2005-06-19 15:19:39','2006-02-15 22:17:28'),(10449,386,1,3351,'2.99','2005-06-21 11:21:39','2006-02-15 22:17:29'),(10450,386,2,3783,'6.99','2005-07-06 13:57:31','2006-02-15 22:17:29'),(10451,386,1,4189,'8.99','2005-07-07 10:51:07','2006-02-15 22:17:29'),(10452,386,1,5524,'0.99','2005-07-10 01:49:24','2006-02-15 22:17:29'),(10453,386,1,5953,'2.99','2005-07-10 23:21:35','2006-02-15 22:17:29'),(10454,386,1,6037,'4.99','2005-07-11 03:06:54','2006-02-15 22:17:29'),(10455,386,1,6222,'2.99','2005-07-11 13:25:49','2006-02-15 22:17:29'),(10456,386,2,6261,'2.99','2005-07-11 15:28:34','2006-02-15 22:17:29'),(10457,386,1,6324,'3.99','2005-07-11 19:02:34','2006-02-15 22:17:29'),(10458,386,2,6715,'4.99','2005-07-12 13:32:28','2006-02-15 22:17:29'),(10459,386,2,8340,'4.99','2005-07-29 04:41:44','2006-02-15 22:17:29'),(10460,386,1,8751,'2.99','2005-07-29 19:14:39','2006-02-15 22:17:29'),(10461,386,2,9602,'0.99','2005-07-31 03:42:51','2006-02-15 22:17:29'),(10462,386,1,9686,'5.99','2005-07-31 06:50:06','2006-02-15 22:17:29'),(10463,386,1,10572,'4.99','2005-08-01 13:26:53','2006-02-15 22:17:29'),(10464,386,2,10618,'3.99','2005-08-01 15:06:38','2006-02-15 22:17:29'),(10465,386,1,10715,'2.99','2005-08-01 18:51:48','2006-02-15 22:17:29'),(10466,386,2,11128,'2.99','2005-08-02 09:03:25','2006-02-15 22:17:30'),(10467,386,2,11695,'4.99','2005-08-17 07:01:08','2006-02-15 22:17:30'),(10468,386,2,12961,'2.99','2005-08-19 06:22:37','2006-02-15 22:17:30'),(10469,386,1,13716,'3.99','2005-08-20 09:48:32','2006-02-15 22:17:30'),(10470,386,1,13764,'2.99','2005-08-20 11:38:16','2006-02-15 22:17:30'),(10471,386,2,13869,'6.99','2005-08-20 15:08:57','2006-02-15 22:17:30'),(10472,386,1,15949,'0.99','2005-08-23 19:06:04','2006-02-15 22:17:30'),(10473,387,2,302,'4.99','2005-05-26 21:13:46','2006-02-15 22:17:30'),(10474,387,1,697,'7.99','2005-05-29 02:04:04','2006-02-15 22:17:30'),(10475,387,1,841,'4.99','2005-05-30 00:31:17','2006-02-15 22:17:30'),(10476,387,1,1127,'3.99','2005-05-31 17:45:49','2006-02-15 22:17:30'),(10477,387,1,1464,'0.99','2005-06-15 20:38:14','2006-02-15 22:17:30'),(10478,387,2,1465,'0.99','2005-06-15 20:43:08','2006-02-15 22:17:30'),(10479,387,1,2068,'0.99','2005-06-17 16:11:46','2006-02-15 22:17:30'),(10480,387,2,2100,'0.99','2005-06-17 18:53:21','2006-02-15 22:17:30'),(10481,387,2,2981,'5.99','2005-06-20 08:35:17','2006-02-15 22:17:30'),(10482,387,2,3378,'4.99','2005-06-21 13:51:28','2006-02-15 22:17:30'),(10483,387,2,6216,'4.99','2005-07-11 12:57:05','2006-02-15 22:17:30'),(10484,387,2,6456,'6.99','2005-07-12 01:05:11','2006-02-15 22:17:31'),(10485,387,1,6517,'5.99','2005-07-12 03:52:39','2006-02-15 22:17:31'),(10486,387,1,7497,'0.99','2005-07-27 20:05:27','2006-02-15 22:17:31'),(10487,387,1,8090,'2.99','2005-07-28 18:27:29','2006-02-15 22:17:31'),(10488,387,1,10564,'0.99','2005-08-01 13:07:34','2006-02-15 22:17:31'),(10489,387,1,10838,'4.99','2005-08-01 23:36:10','2006-02-15 22:17:31'),(10490,387,2,11682,'2.99','2005-08-17 06:13:40','2006-02-15 22:17:31'),(10491,387,2,12153,'4.99','2005-08-18 00:22:30','2006-02-15 22:17:31'),(10492,387,1,12936,'6.99','2005-08-19 05:25:06','2006-02-15 22:17:31'),(10493,387,2,13034,'2.99','2005-08-19 08:41:29','2006-02-15 22:17:31'),(10494,387,1,13082,'5.99','2005-08-19 10:19:19','2006-02-15 22:17:31'),(10495,387,2,13645,'0.99','2005-08-20 07:47:05','2006-02-15 22:17:31'),(10496,387,2,13772,'4.99','2005-08-20 11:47:52','2006-02-15 22:17:31'),(10497,387,2,14279,'5.99','2005-08-21 06:39:08','2006-02-15 22:17:31'),(10498,387,2,14979,'0.99','2005-08-22 07:16:36','2006-02-15 22:17:31'),(10499,388,2,21,'4.99','2005-05-25 01:59:46','2006-02-15 22:17:31'),(10500,388,2,411,'4.99','2005-05-27 14:14:14','2006-02-15 22:17:31'),(10501,388,2,1276,'6.99','2005-06-15 08:00:13','2006-02-15 22:17:31'),(10502,388,1,2145,'0.99','2005-06-17 22:10:36','2006-02-15 22:17:31'),(10503,388,1,2537,'5.99','2005-06-19 01:52:21','2006-02-15 22:17:32'),(10504,388,1,2692,'4.99','2005-06-19 13:08:19','2006-02-15 22:17:32'),(10505,388,2,3159,'7.99','2005-06-20 21:11:50','2006-02-15 22:17:32'),(10506,388,2,4947,'5.99','2005-07-08 22:49:37','2006-02-15 22:17:32'),(10507,388,2,5899,'2.99','2005-07-10 20:21:52','2006-02-15 22:17:32'),(10508,388,2,6321,'2.99','2005-07-11 18:51:02','2006-02-15 22:17:32'),(10509,388,1,6452,'2.99','2005-07-12 00:57:31','2006-02-15 22:17:32'),(10510,388,2,7985,'5.99','2005-07-28 14:29:01','2006-02-15 22:17:32'),(10511,388,2,8456,'3.99','2005-07-29 07:58:31','2006-02-15 22:17:32'),(10512,388,2,9213,'0.99','2005-07-30 13:07:11','2006-02-15 22:17:32'),(10513,388,2,9368,'2.99','2005-07-30 18:50:53','2006-02-15 22:17:32'),(10514,388,2,9840,'2.99','2005-07-31 12:23:18','2006-02-15 22:17:32'),(10515,388,2,9940,'0.99','2005-07-31 15:29:06','2006-02-15 22:17:32'),(10516,388,2,10044,'2.99','2005-07-31 19:02:33','2006-02-15 22:17:32'),(10517,388,2,11604,'0.99','2005-08-17 03:28:27','2006-02-15 22:17:32'),(10518,388,2,12044,'0.99','2005-08-17 20:39:37','2006-02-15 22:17:32'),(10519,388,1,12068,'2.99','2005-08-17 21:37:08','2006-02-15 22:17:32'),(10520,388,2,12267,'6.99','2005-08-18 04:24:30','2006-02-15 22:17:32'),(10521,388,2,12497,'4.99','2005-08-18 12:58:40','2006-02-15 22:17:32'),(10522,388,2,12646,'2.99','2005-08-18 18:25:06','2006-02-15 22:17:32'),(10523,388,1,12749,'2.99','2005-08-18 22:31:21','2006-02-15 22:17:33'),(10524,388,1,12977,'4.99','2005-08-19 06:55:33','2006-02-15 22:17:33'),(10525,388,1,14273,'10.99','2005-08-21 06:26:48','2006-02-15 22:17:33'),(10526,388,2,14853,'5.99','2005-08-22 02:26:33','2006-02-15 22:17:33'),(10527,388,2,15660,'5.99','2005-08-23 08:51:21','2006-02-15 22:17:33'),(10528,388,1,12891,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:33'),(10529,389,1,998,'4.99','2005-05-31 00:16:57','2006-02-15 22:17:33'),(10530,389,1,1763,'4.99','2005-06-16 17:51:01','2006-02-15 22:17:33'),(10531,389,1,1946,'4.99','2005-06-17 07:58:39','2006-02-15 22:17:33'),(10532,389,1,2552,'3.99','2005-06-19 03:01:29','2006-02-15 22:17:33'),(10533,389,2,3527,'0.99','2005-07-06 01:11:08','2006-02-15 22:17:33'),(10534,389,1,4443,'6.99','2005-07-07 23:05:53','2006-02-15 22:17:33'),(10535,389,1,5249,'0.99','2005-07-09 13:33:53','2006-02-15 22:17:33'),(10536,389,2,5626,'3.99','2005-07-10 05:49:35','2006-02-15 22:17:33'),(10537,389,2,6104,'2.99','2005-07-11 07:01:35','2006-02-15 22:17:33'),(10538,389,1,6600,'3.99','2005-07-12 07:41:48','2006-02-15 22:17:33'),(10539,389,1,7029,'4.99','2005-07-27 02:57:43','2006-02-15 22:17:33'),(10540,389,1,7896,'8.99','2005-07-28 11:00:58','2006-02-15 22:17:33'),(10541,389,2,7977,'4.99','2005-07-28 14:15:54','2006-02-15 22:17:33'),(10542,389,1,8338,'6.99','2005-07-29 04:40:39','2006-02-15 22:17:34'),(10543,389,1,8887,'4.99','2005-07-30 00:36:54','2006-02-15 22:17:34'),(10544,389,1,10217,'4.99','2005-08-01 01:07:27','2006-02-15 22:17:34'),(10545,389,1,10949,'2.99','2005-08-02 03:24:04','2006-02-15 22:17:34'),(10546,389,2,11348,'4.99','2005-08-02 17:18:38','2006-02-15 22:17:34'),(10547,389,2,11441,'2.99','2005-08-02 20:25:41','2006-02-15 22:17:34'),(10548,389,2,11944,'3.99','2005-08-17 17:02:42','2006-02-15 22:17:34'),(10549,389,2,12069,'4.99','2005-08-17 21:39:40','2006-02-15 22:17:34'),(10550,389,2,14493,'7.99','2005-08-21 14:01:44','2006-02-15 22:17:34'),(10551,389,1,14578,'2.99','2005-08-21 16:53:38','2006-02-15 22:17:34'),(10552,389,1,14777,'2.99','2005-08-21 23:55:50','2006-02-15 22:17:34'),(10553,389,1,15462,'5.99','2005-08-23 01:14:01','2006-02-15 22:17:34'),(10554,389,2,16011,'9.99','2005-08-23 21:11:33','2006-02-15 22:17:34'),(10555,390,1,254,'4.99','2005-05-26 14:43:48','2006-02-15 22:17:34'),(10556,390,2,912,'4.99','2005-05-30 10:58:33','2006-02-15 22:17:34'),(10557,390,2,1539,'5.99','2005-06-16 01:11:25','2006-02-15 22:17:34'),(10558,390,2,1730,'2.99','2005-06-16 15:30:01','2006-02-15 22:17:34'),(10559,390,2,1893,'2.99','2005-06-17 04:18:37','2006-02-15 22:17:34'),(10560,390,1,2330,'7.99','2005-06-18 10:41:19','2006-02-15 22:17:34'),(10561,390,1,3147,'5.99','2005-06-20 20:25:17','2006-02-15 22:17:34'),(10562,390,1,3999,'2.99','2005-07-06 23:50:54','2006-02-15 22:17:35'),(10563,390,1,4022,'4.99','2005-07-07 01:50:06','2006-02-15 22:17:35'),(10564,390,2,4191,'3.99','2005-07-07 10:56:14','2006-02-15 22:17:35'),(10565,390,2,4310,'2.99','2005-07-07 17:30:56','2006-02-15 22:17:35'),(10566,390,1,4968,'5.99','2005-07-08 23:49:19','2006-02-15 22:17:35'),(10567,390,1,6215,'4.99','2005-07-11 12:52:36','2006-02-15 22:17:35'),(10568,390,1,6430,'0.99','2005-07-12 00:03:34','2006-02-15 22:17:35'),(10569,390,2,7515,'3.99','2005-07-27 20:52:37','2006-02-15 22:17:35'),(10570,390,1,7595,'5.99','2005-07-27 23:32:23','2006-02-15 22:17:35'),(10571,390,1,8493,'0.99','2005-07-29 09:04:31','2006-02-15 22:17:35'),(10572,390,1,9251,'5.99','2005-07-30 14:19:25','2006-02-15 22:17:35'),(10573,390,2,9314,'2.99','2005-07-30 17:05:19','2006-02-15 22:17:35'),(10574,390,1,9825,'4.99','2005-07-31 11:50:51','2006-02-15 22:17:35'),(10575,390,1,10061,'4.99','2005-07-31 19:23:25','2006-02-15 22:17:35'),(10576,390,1,12105,'5.99','2005-08-17 22:54:45','2006-02-15 22:17:35'),(10577,390,2,12803,'2.99','2005-08-19 00:28:21','2006-02-15 22:17:35'),(10578,390,1,13413,'3.99','2005-08-19 22:46:46','2006-02-15 22:17:35'),(10579,390,1,13473,'4.99','2005-08-20 01:03:50','2006-02-15 22:17:35'),(10580,390,1,13501,'0.99','2005-08-20 01:56:20','2006-02-15 22:17:35'),(10581,390,2,13546,'3.99','2005-08-20 03:50:24','2006-02-15 22:17:36'),(10582,390,2,13591,'3.99','2005-08-20 05:50:05','2006-02-15 22:17:36'),(10583,390,2,13618,'7.99','2005-08-20 06:36:46','2006-02-15 22:17:36'),(10584,390,2,13893,'5.99','2005-08-20 15:52:52','2006-02-15 22:17:36'),(10585,390,2,15222,'4.99','2005-08-22 17:12:30','2006-02-15 22:17:36'),(10586,390,2,15303,'8.99','2005-08-22 19:44:59','2006-02-15 22:17:36'),(10587,390,2,15376,'4.99','2005-08-22 22:21:35','2006-02-15 22:17:36'),(10588,391,2,73,'4.99','2005-05-25 11:00:07','2006-02-15 22:17:36'),(10589,391,1,210,'2.99','2005-05-26 08:14:15','2006-02-15 22:17:36'),(10590,391,1,317,'5.99','2005-05-26 23:23:56','2006-02-15 22:17:36'),(10591,391,2,870,'2.99','2005-05-30 04:25:47','2006-02-15 22:17:36'),(10592,391,1,891,'7.99','2005-05-30 07:43:12','2006-02-15 22:17:36'),(10593,391,2,1232,'0.99','2005-06-15 04:18:10','2006-02-15 22:17:36'),(10594,391,2,1931,'0.99','2005-06-17 06:51:56','2006-02-15 22:17:36'),(10595,391,1,2045,'2.99','2005-06-17 14:38:11','2006-02-15 22:17:36'),(10596,391,1,2690,'2.99','2005-06-19 13:00:02','2006-02-15 22:17:36'),(10597,391,2,3163,'2.99','2005-06-20 21:22:13','2006-02-15 22:17:36'),(10598,391,1,4188,'5.99','2005-07-07 10:45:29','2006-02-15 22:17:36'),(10599,391,1,4716,'0.99','2005-07-08 12:18:51','2006-02-15 22:17:36'),(10600,391,2,4753,'0.99','2005-07-08 14:18:41','2006-02-15 22:17:37'),(10601,391,2,5583,'7.99','2005-07-10 04:08:48','2006-02-15 22:17:37'),(10602,391,1,5599,'4.99','2005-07-10 04:52:04','2006-02-15 22:17:37'),(10603,391,1,6302,'3.99','2005-07-11 17:55:38','2006-02-15 22:17:37'),(10604,391,1,6463,'2.99','2005-07-12 01:16:11','2006-02-15 22:17:37'),(10605,391,2,8016,'0.99','2005-07-28 15:35:41','2006-02-15 22:17:37'),(10606,391,1,8908,'0.99','2005-07-30 01:26:05','2006-02-15 22:17:37'),(10607,391,2,8913,'6.99','2005-07-30 01:35:01','2006-02-15 22:17:37'),(10608,391,1,9225,'0.99','2005-07-30 13:29:47','2006-02-15 22:17:37'),(10609,391,1,10210,'7.99','2005-08-01 00:58:52','2006-02-15 22:17:37'),(10610,391,2,10406,'2.99','2005-08-01 07:37:05','2006-02-15 22:17:37'),(10611,391,1,11151,'4.99','2005-08-02 09:52:44','2006-02-15 22:17:37'),(10612,391,2,11434,'2.99','2005-08-02 20:13:14','2006-02-15 22:17:37'),(10613,391,1,11602,'4.99','2005-08-17 03:21:19','2006-02-15 22:17:37'),(10614,391,1,12090,'0.99','2005-08-17 22:21:43','2006-02-15 22:17:37'),(10615,391,1,12100,'1.99','2005-08-17 22:41:10','2006-02-15 22:17:37'),(10616,391,1,13980,'2.99','2005-08-20 19:04:40','2006-02-15 22:17:37'),(10617,391,1,14381,'0.99','2005-08-21 09:55:47','2006-02-15 22:17:37'),(10618,392,2,1530,'6.99','2005-06-16 00:38:07','2006-02-15 22:17:37'),(10619,392,2,1764,'2.99','2005-06-16 17:51:54','2006-02-15 22:17:38'),(10620,392,2,2289,'2.99','2005-06-18 07:29:43','2006-02-15 22:17:38'),(10621,392,2,2890,'4.99','2005-06-20 02:00:45','2006-02-15 22:17:38'),(10622,392,1,3566,'2.99','2005-07-06 03:08:51','2006-02-15 22:17:38'),(10623,392,2,6061,'0.99','2005-07-11 04:06:25','2006-02-15 22:17:38'),(10624,392,2,6406,'2.99','2005-07-11 22:55:27','2006-02-15 22:17:38'),(10625,392,1,7692,'2.99','2005-07-28 03:30:21','2006-02-15 22:17:38'),(10626,392,1,7981,'1.99','2005-07-28 14:18:25','2006-02-15 22:17:38'),(10627,392,1,8254,'0.99','2005-07-29 00:59:31','2006-02-15 22:17:38'),(10628,392,2,8612,'9.99','2005-07-29 13:28:20','2006-02-15 22:17:38'),(10629,392,2,10085,'0.99','2005-07-31 20:12:02','2006-02-15 22:17:38'),(10630,392,1,10435,'4.99','2005-08-01 08:50:51','2006-02-15 22:17:38'),(10631,392,1,11459,'0.99','2005-08-02 21:25:25','2006-02-15 22:17:38'),(10632,392,1,11686,'2.99','2005-08-17 06:39:30','2006-02-15 22:17:38'),(10633,392,2,12102,'6.99','2005-08-17 22:45:26','2006-02-15 22:17:38'),(10634,392,1,12368,'6.99','2005-08-18 07:57:38','2006-02-15 22:17:38'),(10635,392,2,12561,'0.99','2005-08-18 14:58:51','2006-02-15 22:17:38'),(10636,392,1,13629,'4.99','2005-08-20 07:04:07','2006-02-15 22:17:38'),(10637,392,2,14081,'7.99','2005-08-20 23:35:13','2006-02-15 22:17:38'),(10638,392,1,14223,'5.99','2005-08-21 04:51:51','2006-02-15 22:17:39'),(10639,392,2,14369,'0.99','2005-08-21 09:33:44','2006-02-15 22:17:39'),(10640,392,2,14438,'5.99','2005-08-21 11:51:10','2006-02-15 22:17:39'),(10641,393,1,599,'4.99','2005-05-28 14:05:57','2006-02-15 22:17:39'),(10642,393,2,886,'0.99','2005-05-30 06:54:51','2006-02-15 22:17:39'),(10643,393,1,1611,'6.99','2005-06-16 06:41:35','2006-02-15 22:17:39'),(10644,393,2,1915,'1.99','2005-06-17 05:28:28','2006-02-15 22:17:39'),(10645,393,2,2219,'2.99','2005-06-18 03:16:54','2006-02-15 22:17:39'),(10646,393,1,2319,'4.99','2005-06-18 09:24:22','2006-02-15 22:17:39'),(10647,393,2,3001,'2.99','2005-06-20 09:50:16','2006-02-15 22:17:39'),(10648,393,2,4275,'2.99','2005-07-07 14:43:51','2006-02-15 22:17:39'),(10649,393,2,4546,'8.99','2005-07-08 04:18:36','2006-02-15 22:17:39'),(10650,393,2,4632,'5.99','2005-07-08 08:38:57','2006-02-15 22:17:39'),(10651,393,2,4791,'7.99','2005-07-08 16:27:24','2006-02-15 22:17:39'),(10652,393,1,5099,'4.99','2005-07-09 06:14:30','2006-02-15 22:17:39'),(10653,393,1,6221,'2.99','2005-07-11 13:24:27','2006-02-15 22:17:39'),(10654,393,2,6513,'0.99','2005-07-12 03:44:43','2006-02-15 22:17:39'),(10655,393,1,6930,'8.99','2005-07-26 23:00:01','2006-02-15 22:17:39'),(10656,393,2,7486,'0.99','2005-07-27 19:29:24','2006-02-15 22:17:39'),(10657,393,2,8004,'4.99','2005-07-28 15:14:07','2006-02-15 22:17:39'),(10658,393,2,8448,'0.99','2005-07-29 07:41:54','2006-02-15 22:17:40'),(10659,393,2,9763,'7.99','2005-07-31 09:34:03','2006-02-15 22:17:40'),(10660,393,1,10158,'1.99','2005-07-31 22:40:31','2006-02-15 22:17:40'),(10661,393,2,12059,'2.99','2005-08-17 21:09:23','2006-02-15 22:17:40'),(10662,393,1,12113,'1.99','2005-08-17 23:01:00','2006-02-15 22:17:40'),(10663,393,1,12563,'4.99','2005-08-18 15:08:29','2006-02-15 22:17:40'),(10664,393,1,12676,'0.99','2005-08-18 19:34:40','2006-02-15 22:17:40'),(10665,393,1,13184,'4.99','2005-08-19 14:16:18','2006-02-15 22:17:40'),(10666,393,2,13357,'4.99','2005-08-19 21:02:59','2006-02-15 22:17:40'),(10667,393,2,13788,'1.99','2005-08-20 12:15:41','2006-02-15 22:17:40'),(10668,393,1,15132,'2.99','2005-08-22 13:11:25','2006-02-15 22:17:40'),(10669,393,2,15284,'3.99','2005-08-22 19:17:08','2006-02-15 22:17:40'),(10670,393,2,15527,'0.99','2005-08-23 03:44:51','2006-02-15 22:17:40'),(10671,393,2,16049,'3.99','2005-08-23 22:50:12','2006-02-15 22:17:40'),(10672,394,1,213,'3.99','2005-05-26 08:44:08','2006-02-15 22:17:40'),(10673,394,1,977,'2.99','2005-05-30 21:22:26','2006-02-15 22:17:40'),(10674,394,2,1324,'4.99','2005-06-15 11:02:45','2006-02-15 22:17:40'),(10675,394,2,3543,'0.99','2005-07-06 02:01:08','2006-02-15 22:17:40'),(10676,394,1,3873,'6.99','2005-07-06 18:03:16','2006-02-15 22:17:40'),(10677,394,2,4009,'2.99','2005-07-07 00:28:55','2006-02-15 22:17:41'),(10678,394,1,4307,'6.99','2005-07-07 17:20:39','2006-02-15 22:17:41'),(10679,394,2,5183,'4.99','2005-07-09 10:13:45','2006-02-15 22:17:41'),(10680,394,1,5535,'4.99','2005-07-10 02:27:42','2006-02-15 22:17:41'),(10681,394,2,6059,'4.99','2005-07-11 04:03:54','2006-02-15 22:17:41'),(10682,394,2,7445,'3.99','2005-07-27 17:57:15','2006-02-15 22:17:41'),(10683,394,1,9147,'0.99','2005-07-30 10:38:59','2006-02-15 22:17:41'),(10684,394,2,9864,'0.99','2005-07-31 13:06:54','2006-02-15 22:17:41'),(10685,394,1,10319,'4.99','2005-08-01 04:37:19','2006-02-15 22:17:41'),(10686,394,1,10603,'0.99','2005-08-01 14:30:35','2006-02-15 22:17:41'),(10687,394,1,10718,'0.99','2005-08-01 18:55:38','2006-02-15 22:17:41'),(10688,394,1,12080,'4.99','2005-08-17 22:08:04','2006-02-15 22:17:41'),(10689,394,1,12389,'4.99','2005-08-18 08:48:36','2006-02-15 22:17:41'),(10690,394,2,12510,'9.99','2005-08-18 13:22:25','2006-02-15 22:17:41'),(10691,394,2,13047,'0.99','2005-08-19 09:24:49','2006-02-15 22:17:41'),(10692,394,1,14605,'0.99','2005-08-21 17:56:06','2006-02-15 22:17:41'),(10693,394,2,13178,'4.99','2006-02-14 15:16:03','2006-02-15 22:17:41'),(10694,395,1,1270,'0.99','2005-06-15 07:30:22','2006-02-15 22:17:41'),(10695,395,1,1562,'0.99','2005-06-16 02:46:27','2006-02-15 22:17:41'),(10696,395,2,1603,'0.99','2005-06-16 06:14:03','2006-02-15 22:17:42'),(10697,395,1,3030,'4.99','2005-06-20 11:51:59','2006-02-15 22:17:42'),(10698,395,1,3310,'0.99','2005-06-21 08:04:51','2006-02-15 22:17:42'),(10699,395,1,3389,'6.99','2005-06-21 14:37:55','2006-02-15 22:17:42'),(10700,395,2,3684,'0.99','2005-07-06 09:29:22','2006-02-15 22:17:42'),(10701,395,1,4185,'5.99','2005-07-07 10:31:05','2006-02-15 22:17:42'),(10702,395,1,4393,'4.99','2005-07-07 21:12:36','2006-02-15 22:17:42'),(10703,395,1,5087,'0.99','2005-07-09 05:44:28','2006-02-15 22:17:42'),(10704,395,2,5136,'0.99','2005-07-09 07:55:01','2006-02-15 22:17:42'),(10705,395,1,7740,'2.99','2005-07-28 05:23:36','2006-02-15 22:17:42'),(10706,395,2,7986,'7.99','2005-07-28 14:30:13','2006-02-15 22:17:42'),(10707,395,1,11889,'0.99','2005-08-17 15:08:27','2006-02-15 22:17:42'),(10708,395,1,14471,'5.99','2005-08-21 13:10:40','2006-02-15 22:17:42'),(10709,395,2,14720,'0.99','2005-08-21 21:43:53','2006-02-15 22:17:42'),(10710,395,1,15698,'2.99','2005-08-23 10:11:40','2006-02-15 22:17:42'),(10711,395,1,15856,'0.99','2005-08-23 15:59:12','2006-02-15 22:17:42'),(10712,395,1,15970,'4.99','2005-08-23 19:54:24','2006-02-15 22:17:42'),(10713,396,2,641,'5.99','2005-05-28 18:45:47','2006-02-15 22:17:42'),(10714,396,2,1370,'1.99','2005-06-15 14:31:05','2006-02-15 22:17:42'),(10715,396,2,1385,'4.99','2005-06-15 15:28:23','2006-02-15 22:17:43'),(10716,396,2,1408,'6.99','2005-06-15 16:57:58','2006-02-15 22:17:43'),(10717,396,2,3909,'6.99','2005-07-06 19:54:41','2006-02-15 22:17:43'),(10718,396,1,5059,'1.99','2005-07-09 04:28:01','2006-02-15 22:17:43'),(10719,396,2,6335,'2.99','2005-07-11 19:25:15','2006-02-15 22:17:43'),(10720,396,2,6764,'4.99','2005-07-12 15:29:27','2006-02-15 22:17:43'),(10721,396,2,6771,'2.99','2005-07-12 15:54:40','2006-02-15 22:17:43'),(10722,396,2,7142,'0.99','2005-07-27 06:55:39','2006-02-15 22:17:43'),(10723,396,2,7313,'2.99','2005-07-27 13:11:57','2006-02-15 22:17:43'),(10724,396,2,8371,'2.99','2005-07-29 05:16:35','2006-02-15 22:17:43'),(10725,396,2,8807,'2.99','2005-07-29 21:36:59','2006-02-15 22:17:43'),(10726,396,1,9344,'5.99','2005-07-30 18:13:45','2006-02-15 22:17:43'),(10727,396,2,10120,'2.99','2005-07-31 21:24:24','2006-02-15 22:17:43'),(10728,396,2,10124,'0.99','2005-07-31 21:31:49','2006-02-15 22:17:43'),(10729,396,2,10195,'6.99','2005-08-01 00:34:42','2006-02-15 22:17:43'),(10730,396,2,10610,'0.99','2005-08-01 14:49:41','2006-02-15 22:17:43'),(10731,396,2,12393,'5.99','2005-08-18 09:02:41','2006-02-15 22:17:43'),(10732,396,1,12895,'4.99','2005-08-19 03:50:48','2006-02-15 22:17:43'),(10733,396,2,13355,'4.99','2005-08-19 20:59:19','2006-02-15 22:17:43'),(10734,396,1,14078,'3.99','2005-08-20 23:26:40','2006-02-15 22:17:44'),(10735,396,1,14169,'4.99','2005-08-21 03:00:31','2006-02-15 22:17:44'),(10736,396,1,14508,'2.99','2005-08-21 14:33:58','2006-02-15 22:17:44'),(10737,396,2,14778,'5.99','2005-08-21 23:56:30','2006-02-15 22:17:44'),(10738,396,1,14792,'1.99','2005-08-22 00:36:41','2006-02-15 22:17:44'),(10739,396,2,15198,'7.99','2005-08-22 16:15:33','2006-02-15 22:17:44'),(10740,397,2,1002,'0.99','2005-05-31 00:47:56','2006-02-15 22:17:44'),(10741,397,1,1769,'5.99','2005-06-16 18:07:48','2006-02-15 22:17:44'),(10742,397,2,3027,'1.99','2005-06-20 11:50:30','2006-02-15 22:17:44'),(10743,397,1,3489,'5.99','2005-07-05 23:33:40','2006-02-15 22:17:44'),(10744,397,1,4036,'0.99','2005-07-07 02:48:00','2006-02-15 22:17:44'),(10745,397,2,5103,'4.99','2005-07-09 06:34:40','2006-02-15 22:17:44'),(10746,397,2,5598,'4.99','2005-07-10 04:48:29','2006-02-15 22:17:44'),(10747,397,2,5763,'4.99','2005-07-10 12:58:12','2006-02-15 22:17:44'),(10748,397,2,6014,'2.99','2005-07-11 02:02:55','2006-02-15 22:17:44'),(10749,397,2,6266,'2.99','2005-07-11 15:45:39','2006-02-15 22:17:44'),(10750,397,1,6471,'4.99','2005-07-12 01:31:06','2006-02-15 22:17:44'),(10751,397,2,7356,'2.99','2005-07-27 14:47:35','2006-02-15 22:17:44'),(10752,397,2,7892,'4.99','2005-07-28 10:46:58','2006-02-15 22:17:44'),(10753,397,1,8103,'6.99','2005-07-28 18:50:14','2006-02-15 22:17:44'),(10754,397,1,9495,'0.99','2005-07-30 23:54:26','2006-02-15 22:17:45'),(10755,397,2,9608,'1.99','2005-07-31 03:51:52','2006-02-15 22:17:45'),(10756,397,1,10534,'0.99','2005-08-01 12:15:11','2006-02-15 22:17:45'),(10757,397,2,10598,'4.99','2005-08-01 14:23:36','2006-02-15 22:17:45'),(10758,397,1,10785,'1.99','2005-08-01 21:24:55','2006-02-15 22:17:45'),(10759,397,2,11511,'4.99','2005-08-16 23:39:59','2006-02-15 22:17:45'),(10760,397,2,12223,'2.99','2005-08-18 02:58:40','2006-02-15 22:17:45'),(10761,397,1,12276,'0.99','2005-08-18 04:43:22','2006-02-15 22:17:45'),(10762,397,2,12329,'1.99','2005-08-18 06:44:30','2006-02-15 22:17:45'),(10763,397,2,12700,'0.99','2005-08-18 20:24:46','2006-02-15 22:17:45'),(10764,397,2,12726,'2.99','2005-08-18 21:44:46','2006-02-15 22:17:45'),(10765,397,1,12772,'4.99','2005-08-18 23:29:25','2006-02-15 22:17:45'),(10766,397,2,14100,'3.99','2005-08-21 00:31:07','2006-02-15 22:17:45'),(10767,397,1,14790,'6.99','2005-08-22 00:34:17','2006-02-15 22:17:45'),(10768,397,1,15083,'6.99','2005-08-22 11:17:37','2006-02-15 22:17:45'),(10769,398,1,486,'4.99','2005-05-27 23:51:12','2006-02-15 22:17:45'),(10770,398,2,1228,'2.99','2005-06-15 03:50:36','2006-02-15 22:17:45'),(10771,398,1,2087,'6.99','2005-06-17 17:35:10','2006-02-15 22:17:45'),(10772,398,2,3141,'9.99','2005-06-20 19:55:47','2006-02-15 22:17:45'),(10773,398,2,5234,'5.99','2005-07-09 12:44:47','2006-02-15 22:17:46'),(10774,398,2,8119,'3.99','2005-07-28 19:23:15','2006-02-15 22:17:46'),(10775,398,2,8204,'4.99','2005-07-28 23:18:29','2006-02-15 22:17:46'),(10776,398,1,8428,'7.99','2005-07-29 07:10:14','2006-02-15 22:17:46'),(10777,398,1,9042,'2.99','2005-07-30 06:33:55','2006-02-15 22:17:46'),(10778,398,2,9281,'5.99','2005-07-30 15:15:51','2006-02-15 22:17:46'),(10779,398,1,9771,'1.99','2005-07-31 09:55:36','2006-02-15 22:17:46'),(10780,398,1,10230,'2.99','2005-08-01 01:49:36','2006-02-15 22:17:46'),(10781,398,2,11132,'4.99','2005-08-02 09:14:09','2006-02-15 22:17:46'),(10782,398,2,12528,'2.99','2005-08-18 13:52:41','2006-02-15 22:17:46'),(10783,398,2,13643,'4.99','2005-08-20 07:42:24','2006-02-15 22:17:46'),(10784,398,1,15189,'3.99','2005-08-22 15:56:42','2006-02-15 22:17:46'),(10785,399,2,10,'5.99','2005-05-25 00:02:21','2006-02-15 22:17:46'),(10786,399,2,694,'6.99','2005-05-29 01:49:43','2006-02-15 22:17:46'),(10787,399,2,883,'4.99','2005-05-30 06:21:05','2006-02-15 22:17:46'),(10788,399,2,2961,'2.99','2005-06-20 07:29:15','2006-02-15 22:17:46'),(10789,399,1,3036,'5.99','2005-06-20 12:18:31','2006-02-15 22:17:46'),(10790,399,2,4957,'0.99','2005-07-08 23:18:48','2006-02-15 22:17:46'),(10791,399,2,4981,'4.99','2005-07-09 00:29:29','2006-02-15 22:17:46'),(10792,399,1,5507,'0.99','2005-07-10 00:49:04','2006-02-15 22:17:47'),(10793,399,2,6006,'2.99','2005-07-11 01:38:42','2006-02-15 22:17:47'),(10794,399,2,6229,'6.99','2005-07-11 13:59:50','2006-02-15 22:17:47'),(10795,399,2,6674,'4.99','2005-07-12 11:51:54','2006-02-15 22:17:47'),(10796,399,2,8461,'5.99','2005-07-29 08:11:31','2006-02-15 22:17:47'),(10797,399,2,9728,'2.99','2005-07-31 08:40:54','2006-02-15 22:17:47'),(10798,399,2,10654,'2.99','2005-08-01 16:31:35','2006-02-15 22:17:47'),(10799,399,2,10960,'5.99','2005-08-02 03:46:18','2006-02-15 22:17:47'),(10800,399,1,11329,'4.99','2005-08-02 16:42:52','2006-02-15 22:17:47'),(10801,399,1,11953,'3.99','2005-08-17 17:16:42','2006-02-15 22:17:47'),(10802,399,1,13253,'4.99','2005-08-19 16:53:56','2006-02-15 22:17:47'),(10803,399,2,13293,'4.99','2005-08-19 18:35:52','2006-02-15 22:17:47'),(10804,399,1,15300,'0.99','2005-08-22 19:44:00','2006-02-15 22:17:47'),(10805,399,1,15468,'4.99','2005-08-23 01:25:30','2006-02-15 22:17:47'),(10806,400,1,95,'3.99','2005-05-25 16:12:52','2006-02-15 22:17:47'),(10807,400,2,171,'6.99','2005-05-26 03:14:15','2006-02-15 22:17:47'),(10808,400,2,516,'1.99','2005-05-28 03:11:47','2006-02-15 22:17:47'),(10809,400,2,894,'5.99','2005-05-30 08:31:31','2006-02-15 22:17:48'),(10810,400,2,1364,'0.99','2005-06-15 14:05:32','2006-02-15 22:17:48'),(10811,400,1,1917,'3.99','2005-06-17 05:36:07','2006-02-15 22:17:48'),(10812,400,2,1923,'6.99','2005-06-17 06:06:10','2006-02-15 22:17:48'),(10813,400,1,4573,'6.99','2005-07-08 05:38:46','2006-02-15 22:17:48'),(10814,400,1,4645,'2.99','2005-07-08 09:20:09','2006-02-15 22:17:48'),(10815,400,2,5212,'6.99','2005-07-09 11:37:47','2006-02-15 22:17:48'),(10816,400,2,5222,'5.99','2005-07-09 12:05:45','2006-02-15 22:17:48'),(10817,400,2,6790,'5.99','2005-07-12 16:34:59','2006-02-15 22:17:48'),(10818,400,2,6994,'2.99','2005-07-27 01:08:26','2006-02-15 22:17:48'),(10819,400,2,7296,'2.99','2005-07-27 12:39:48','2006-02-15 22:17:48'),(10820,400,1,7682,'5.99','2005-07-28 03:07:29','2006-02-15 22:17:48'),(10821,400,2,9177,'5.99','2005-07-30 11:52:40','2006-02-15 22:17:48'),(10822,400,2,9756,'4.99','2005-07-31 09:25:00','2006-02-15 22:17:48'),(10823,400,1,10187,'2.99','2005-08-01 00:15:49','2006-02-15 22:17:48'),(10824,400,2,10484,'2.99','2005-08-01 10:19:53','2006-02-15 22:17:48'),(10825,400,1,10711,'0.99','2005-08-01 18:45:09','2006-02-15 22:17:48'),(10826,400,2,11510,'6.99','2005-08-16 23:30:07','2006-02-15 22:17:49'),(10827,400,2,11530,'2.99','2005-08-17 00:29:00','2006-02-15 22:17:49'),(10828,400,1,11600,'5.99','2005-08-17 03:12:04','2006-02-15 22:17:49'),(10829,400,1,12514,'2.99','2005-08-18 13:33:55','2006-02-15 22:17:49'),(10830,400,2,13449,'2.99','2005-08-20 00:17:01','2006-02-15 22:17:49'),(10831,400,1,14775,'2.99','2005-08-21 23:53:07','2006-02-15 22:17:49'),(10832,400,2,15533,'4.99','2005-08-23 03:54:39','2006-02-15 22:17:49'),(10833,400,2,15988,'4.99','2005-08-23 20:23:08','2006-02-15 22:17:49'),(10834,401,2,167,'4.99','2005-05-26 02:50:31','2006-02-15 22:17:49'),(10835,401,2,446,'4.99','2005-05-27 18:48:41','2006-02-15 22:17:49'),(10836,401,2,811,'1.99','2005-05-29 19:30:42','2006-02-15 22:17:49'),(10837,401,1,4059,'0.99','2005-07-07 04:04:26','2006-02-15 22:17:49'),(10838,401,2,4292,'7.99','2005-07-07 15:48:38','2006-02-15 22:17:49'),(10839,401,2,5923,'0.99','2005-07-10 21:40:06','2006-02-15 22:17:49'),(10840,401,1,NULL,'0.99','2005-07-12 06:26:10','2006-02-15 22:17:49'),(10841,401,2,7651,'4.99','2005-07-28 01:48:32','2006-02-15 22:17:49'),(10842,401,1,8450,'2.99','2005-07-29 07:44:05','2006-02-15 22:17:49'),(10843,401,2,8669,'2.99','2005-07-29 15:44:55','2006-02-15 22:17:49'),(10844,401,1,8722,'8.99','2005-07-29 17:58:58','2006-02-15 22:17:50'),(10845,401,2,9701,'4.99','2005-07-31 07:32:21','2006-02-15 22:17:50'),(10846,401,2,10171,'0.99','2005-07-31 23:29:05','2006-02-15 22:17:50'),(10847,401,1,11820,'2.99','2005-08-17 12:25:33','2006-02-15 22:17:50'),(10848,401,1,12475,'4.99','2005-08-18 12:14:21','2006-02-15 22:17:50'),(10849,401,2,12479,'4.99','2005-08-18 12:26:37','2006-02-15 22:17:50'),(10850,401,1,12906,'2.99','2005-08-19 04:13:43','2006-02-15 22:17:50'),(10851,401,1,13024,'4.99','2005-08-19 08:19:21','2006-02-15 22:17:50'),(10852,401,1,14359,'0.99','2005-08-21 09:16:19','2006-02-15 22:17:50'),(10853,401,2,14433,'1.99','2005-08-21 11:36:34','2006-02-15 22:17:50'),(10854,401,1,15831,'0.99','2005-08-23 15:21:19','2006-02-15 22:17:50'),(10855,401,1,15927,'0.99','2005-08-23 18:23:11','2006-02-15 22:17:50'),(10856,402,2,801,'1.99','2005-05-29 17:35:50','2006-02-15 22:17:50'),(10857,402,2,1194,'4.99','2005-06-15 01:25:08','2006-02-15 22:17:50'),(10858,402,2,2490,'4.99','2005-06-18 22:00:50','2006-02-15 22:17:50'),(10859,402,2,2913,'2.99','2005-06-20 03:42:27','2006-02-15 22:17:50'),(10860,402,2,3564,'6.99','2005-07-06 03:02:13','2006-02-15 22:17:50'),(10861,402,2,3612,'3.99','2005-07-06 05:37:26','2006-02-15 22:17:50'),(10862,402,2,3755,'5.99','2005-07-06 12:37:16','2006-02-15 22:17:51'),(10863,402,1,4399,'2.99','2005-07-07 21:20:28','2006-02-15 22:17:51'),(10864,402,2,4604,'3.99','2005-07-08 06:58:43','2006-02-15 22:17:51'),(10865,402,2,5329,'4.99','2005-07-09 16:49:46','2006-02-15 22:17:51'),(10866,402,2,6183,'2.99','2005-07-11 11:14:35','2006-02-15 22:17:51'),(10867,402,1,6283,'3.99','2005-07-11 16:47:32','2006-02-15 22:17:51'),(10868,402,1,7633,'0.99','2005-07-28 01:03:41','2006-02-15 22:17:51'),(10869,402,2,8521,'7.99','2005-07-29 10:12:45','2006-02-15 22:17:51'),(10870,402,1,9657,'6.99','2005-07-31 06:00:41','2006-02-15 22:17:51'),(10871,402,2,9779,'0.99','2005-07-31 10:08:33','2006-02-15 22:17:51'),(10872,402,2,11045,'0.99','2005-08-02 06:07:54','2006-02-15 22:17:51'),(10873,402,2,11549,'4.99','2005-08-17 01:01:48','2006-02-15 22:17:51'),(10874,402,2,11920,'0.99','2005-08-17 16:10:19','2006-02-15 22:17:51'),(10875,402,1,15428,'4.99','2005-08-23 00:11:52','2006-02-15 22:17:52'),(10876,403,1,442,'2.99','2005-05-27 18:12:13','2006-02-15 22:17:52'),(10877,403,1,517,'0.99','2005-05-28 03:17:57','2006-02-15 22:17:52'),(10878,403,2,1221,'4.99','2005-06-15 03:35:16','2006-02-15 22:17:52'),(10879,403,1,1249,'8.99','2005-06-15 05:38:09','2006-02-15 22:17:52'),(10880,403,2,2488,'3.99','2005-06-18 21:38:26','2006-02-15 22:17:52'),(10881,403,1,2927,'4.99','2005-06-20 04:41:41','2006-02-15 22:17:52'),(10882,403,2,3049,'6.99','2005-06-20 12:51:01','2006-02-15 22:17:52'),(10883,403,1,3356,'5.99','2005-06-21 11:38:45','2006-02-15 22:17:52'),(10884,403,1,3644,'6.99','2005-07-06 07:20:11','2006-02-15 22:17:52'),(10885,403,2,3737,'3.99','2005-07-06 11:45:53','2006-02-15 22:17:52'),(10886,403,2,4096,'4.99','2005-07-07 06:09:11','2006-02-15 22:17:52'),(10887,403,1,5982,'4.99','2005-07-11 00:24:44','2006-02-15 22:17:52'),(10888,403,2,6322,'2.99','2005-07-11 18:58:20','2006-02-15 22:17:52'),(10889,403,1,6342,'4.99','2005-07-11 19:48:24','2006-02-15 22:17:52'),(10890,403,1,7103,'4.99','2005-07-27 05:08:59','2006-02-15 22:17:52'),(10891,403,2,8013,'5.99','2005-07-28 15:30:26','2006-02-15 22:17:52'),(10892,403,1,9058,'2.99','2005-07-30 07:15:45','2006-02-15 22:17:52'),(10893,403,2,9486,'7.99','2005-07-30 23:35:42','2006-02-15 22:17:52'),(10894,403,2,9794,'4.99','2005-07-31 10:47:01','2006-02-15 22:17:53'),(10895,403,2,10109,'5.99','2005-07-31 21:04:49','2006-02-15 22:17:53'),(10896,403,1,10443,'2.99','2005-08-01 09:01:04','2006-02-15 22:17:53'),(10897,403,1,10547,'6.99','2005-08-01 12:44:17','2006-02-15 22:17:53'),(10898,403,2,10789,'2.99','2005-08-01 21:37:55','2006-02-15 22:17:53'),(10899,403,1,11038,'7.99','2005-08-02 05:59:42','2006-02-15 22:17:53'),(10900,403,2,11391,'9.99','2005-08-02 18:40:12','2006-02-15 22:17:53'),(10901,403,2,11427,'2.99','2005-08-02 20:02:39','2006-02-15 22:17:53'),(10902,403,2,11460,'0.99','2005-08-02 21:28:03','2006-02-15 22:17:53'),(10903,403,2,11558,'0.99','2005-08-17 01:19:52','2006-02-15 22:17:53'),(10904,403,2,12005,'5.99','2005-08-17 18:56:55','2006-02-15 22:17:53'),(10905,403,1,12132,'2.99','2005-08-17 23:37:03','2006-02-15 22:17:53'),(10906,403,1,12793,'5.99','2005-08-19 00:20:36','2006-02-15 22:17:53'),(10907,403,1,14519,'2.99','2005-08-21 14:59:29','2006-02-15 22:17:53'),(10908,403,1,14662,'0.99','2005-08-21 19:45:27','2006-02-15 22:17:53'),(10909,403,2,14725,'4.99','2005-08-21 22:02:08','2006-02-15 22:17:53'),(10910,403,1,15410,'4.99','2005-08-22 23:27:43','2006-02-15 22:17:53'),(10911,404,2,1081,'5.99','2005-05-31 10:56:32','2006-02-15 22:17:53'),(10912,404,2,1506,'2.99','2005-06-15 22:19:37','2006-02-15 22:17:53'),(10913,404,2,1840,'4.99','2005-06-16 23:39:34','2006-02-15 22:17:54'),(10914,404,1,2715,'4.99','2005-06-19 14:29:35','2006-02-15 22:17:54'),(10915,404,1,2951,'2.99','2005-06-20 06:23:01','2006-02-15 22:17:54'),(10916,404,1,3927,'2.99','2005-07-06 20:48:14','2006-02-15 22:17:54'),(10917,404,1,4495,'2.99','2005-07-08 01:43:46','2006-02-15 22:17:54'),(10918,404,2,4615,'8.99','2005-07-08 07:46:53','2006-02-15 22:17:54'),(10919,404,1,4653,'4.99','2005-07-08 09:48:01','2006-02-15 22:17:54'),(10920,404,1,4963,'4.99','2005-07-08 23:38:40','2006-02-15 22:17:54'),(10921,404,1,5632,'3.99','2005-07-10 06:17:06','2006-02-15 22:17:54'),(10922,404,1,6114,'1.99','2005-07-11 07:33:48','2006-02-15 22:17:54'),(10923,404,2,6779,'0.99','2005-07-12 16:10:50','2006-02-15 22:17:54'),(10924,404,1,6964,'4.99','2005-07-27 00:15:04','2006-02-15 22:17:54'),(10925,404,1,8058,'5.99','2005-07-28 17:07:49','2006-02-15 22:17:54'),(10926,404,1,8455,'3.99','2005-07-29 07:53:06','2006-02-15 22:17:54'),(10927,404,1,9206,'4.99','2005-07-30 12:46:59','2006-02-15 22:17:54'),(10928,404,1,9472,'4.99','2005-07-30 23:03:32','2006-02-15 22:17:54'),(10929,404,2,9824,'2.99','2005-07-31 11:49:55','2006-02-15 22:17:54'),(10930,404,1,10651,'2.99','2005-08-01 16:20:22','2006-02-15 22:17:54'),(10931,404,1,12325,'5.99','2005-08-18 06:41:30','2006-02-15 22:17:54'),(10932,404,1,12554,'8.99','2005-08-18 14:47:28','2006-02-15 22:17:54'),(10933,404,2,13412,'5.99','2005-08-19 22:46:35','2006-02-15 22:17:55'),(10934,404,1,13422,'4.99','2005-08-19 23:07:24','2006-02-15 22:17:55'),(10935,404,1,14691,'0.99','2005-08-21 20:42:29','2006-02-15 22:17:55'),(10936,404,2,14835,'5.99','2005-08-22 01:49:07','2006-02-15 22:17:55'),(10937,404,2,14838,'4.99','2005-08-22 01:57:34','2006-02-15 22:17:55'),(10938,404,2,14912,'4.99','2005-08-22 04:51:42','2006-02-15 22:17:55'),(10939,404,2,15087,'0.99','2005-08-22 11:24:09','2006-02-15 22:17:55'),(10940,404,2,15290,'10.99','2005-08-22 19:28:02','2006-02-15 22:17:55'),(10941,405,1,121,'2.99','2005-05-25 19:41:29','2006-02-15 22:17:55'),(10942,405,2,770,'4.99','2005-05-29 12:56:50','2006-02-15 22:17:55'),(10943,405,2,1315,'4.99','2005-06-15 10:23:08','2006-02-15 22:17:55'),(10944,405,1,1888,'0.99','2005-06-17 03:58:36','2006-02-15 22:17:55'),(10945,405,2,1953,'5.99','2005-06-17 08:34:57','2006-02-15 22:17:55'),(10946,405,2,2654,'3.99','2005-06-19 10:37:54','2006-02-15 22:17:55'),(10947,405,1,3240,'4.99','2005-06-21 02:53:17','2006-02-15 22:17:55'),(10948,405,1,3253,'5.99','2005-06-21 03:25:37','2006-02-15 22:17:55'),(10949,405,2,4223,'0.99','2005-07-07 12:23:54','2006-02-15 22:17:55'),(10950,405,2,4401,'0.99','2005-07-07 21:26:27','2006-02-15 22:17:55'),(10951,405,2,5040,'7.99','2005-07-09 03:16:34','2006-02-15 22:17:55'),(10952,405,1,5231,'0.99','2005-07-09 12:35:02','2006-02-15 22:17:56'),(10953,405,2,5512,'1.99','2005-07-10 01:05:38','2006-02-15 22:17:56'),(10954,405,1,6110,'2.99','2005-07-11 07:23:47','2006-02-15 22:17:56'),(10955,405,1,7455,'2.99','2005-07-27 18:34:41','2006-02-15 22:17:56'),(10956,405,1,7759,'0.99','2005-07-28 06:28:45','2006-02-15 22:17:56'),(10957,405,2,8482,'2.99','2005-07-29 08:46:33','2006-02-15 22:17:56'),(10958,405,1,8955,'5.99','2005-07-30 03:28:27','2006-02-15 22:17:56'),(10959,405,1,9569,'0.99','2005-07-31 02:39:38','2006-02-15 22:17:56'),(10960,405,1,10472,'4.99','2005-08-01 09:54:41','2006-02-15 22:17:56'),(10961,405,2,10823,'4.99','2005-08-01 22:59:10','2006-02-15 22:17:56'),(10962,405,1,11345,'7.99','2005-08-02 17:14:19','2006-02-15 22:17:56'),(10963,405,1,12050,'0.99','2005-08-17 20:55:25','2006-02-15 22:17:56'),(10964,405,2,12425,'5.99','2005-08-18 10:18:06','2006-02-15 22:17:56'),(10965,405,1,13304,'1.99','2005-08-19 18:56:32','2006-02-15 22:17:56'),(10966,405,1,13398,'0.99','2005-08-19 22:08:48','2006-02-15 22:17:56'),(10967,405,1,14274,'4.99','2005-08-21 06:29:20','2006-02-15 22:17:56'),(10968,405,2,14537,'0.99','2005-08-21 15:24:24','2006-02-15 22:17:56'),(10969,405,1,15072,'1.99','2005-08-22 10:58:45','2006-02-15 22:17:56'),(10970,405,2,15383,'2.99','2005-08-22 22:31:20','2006-02-15 22:17:57'),(10971,405,1,15932,'4.99','2005-08-23 18:31:40','2006-02-15 22:17:57'),(10972,405,1,12792,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:57'),(10973,406,1,855,'0.99','2005-05-30 02:00:28','2006-02-15 22:17:57'),(10974,406,1,2113,'4.99','2005-06-17 19:57:46','2006-02-15 22:17:57'),(10975,406,2,2150,'3.99','2005-06-17 22:50:36','2006-02-15 22:17:57'),(10976,406,1,2241,'2.99','2005-06-18 04:31:41','2006-02-15 22:17:57'),(10977,406,2,2325,'0.99','2005-06-18 10:08:07','2006-02-15 22:17:57'),(10978,406,2,2585,'0.99','2005-06-19 05:05:03','2006-02-15 22:17:57'),(10979,406,1,3186,'7.99','2005-06-20 23:04:20','2006-02-15 22:17:57'),(10980,406,1,3306,'4.99','2005-06-21 07:46:58','2006-02-15 22:17:57'),(10981,406,2,4264,'4.99','2005-07-07 14:25:28','2006-02-15 22:17:57'),(10982,406,2,5098,'4.99','2005-07-09 06:13:54','2006-02-15 22:17:57'),(10983,406,2,5263,'0.99','2005-07-09 14:10:36','2006-02-15 22:17:57'),(10984,406,1,5766,'0.99','2005-07-10 13:07:31','2006-02-15 22:17:57'),(10985,406,2,6439,'2.99','2005-07-12 00:23:48','2006-02-15 22:17:57'),(10986,406,2,7109,'5.99','2005-07-27 05:28:57','2006-02-15 22:17:57'),(10987,406,1,7171,'4.99','2005-07-27 07:58:35','2006-02-15 22:17:57'),(10988,406,1,7259,'4.99','2005-07-27 11:06:00','2006-02-15 22:17:58'),(10989,406,2,7604,'7.99','2005-07-27 23:54:52','2006-02-15 22:17:58'),(10990,406,2,8080,'4.99','2005-07-28 18:05:06','2006-02-15 22:17:58'),(10991,406,2,8295,'2.99','2005-07-29 02:42:14','2006-02-15 22:17:58'),(10992,406,2,8630,'0.99','2005-07-29 14:07:59','2006-02-15 22:17:58'),(10993,406,1,8903,'0.99','2005-07-30 01:08:06','2006-02-15 22:17:58'),(10994,406,2,8962,'1.99','2005-07-30 03:43:45','2006-02-15 22:17:58'),(10995,406,2,9224,'0.99','2005-07-30 13:25:37','2006-02-15 22:17:58'),(10996,406,1,9291,'4.99','2005-07-30 16:03:39','2006-02-15 22:17:58'),(10997,406,2,9487,'2.99','2005-07-30 23:40:22','2006-02-15 22:17:58'),(10998,406,1,9660,'8.99','2005-07-31 06:03:17','2006-02-15 22:17:58'),(10999,406,1,10632,'1.99','2005-08-01 15:36:56','2006-02-15 22:17:58'),(11000,406,1,11603,'4.99','2005-08-17 03:22:10','2006-02-15 22:17:58'),(11001,406,2,12505,'5.99','2005-08-18 13:17:30','2006-02-15 22:17:58'),(11002,406,2,14205,'6.99','2005-08-21 03:57:15','2006-02-15 22:17:58'),(11003,406,2,14421,'2.99','2005-08-21 11:20:21','2006-02-15 22:17:58'),(11004,406,2,14601,'2.99','2005-08-21 17:45:52','2006-02-15 22:17:58'),(11005,407,1,619,'7.99','2005-05-28 15:52:26','2006-02-15 22:17:58'),(11006,407,1,1698,'2.99','2005-06-16 13:04:42','2006-02-15 22:17:59'),(11007,407,2,2597,'0.99','2005-06-19 05:53:46','2006-02-15 22:17:59'),(11008,407,1,4296,'0.99','2005-07-07 16:16:03','2006-02-15 22:17:59'),(11009,407,1,5070,'4.99','2005-07-09 04:58:26','2006-02-15 22:17:59'),(11010,407,2,5590,'9.99','2005-07-10 04:23:11','2006-02-15 22:17:59'),(11011,407,1,6727,'0.99','2005-07-12 13:54:25','2006-02-15 22:17:59'),(11012,407,1,7363,'5.99','2005-07-27 14:58:29','2006-02-15 22:17:59'),(11013,407,2,7643,'4.99','2005-07-28 01:19:44','2006-02-15 22:17:59'),(11014,407,1,8078,'2.99','2005-07-28 17:54:42','2006-02-15 22:17:59'),(11015,407,1,8109,'4.99','2005-07-28 19:07:44','2006-02-15 22:17:59'),(11016,407,1,8197,'9.99','2005-07-28 23:04:10','2006-02-15 22:17:59'),(11017,407,2,8571,'0.99','2005-07-29 11:48:39','2006-02-15 22:17:59'),(11018,407,1,8802,'2.99','2005-07-29 21:25:51','2006-02-15 22:17:59'),(11019,407,2,10774,'4.99','2005-08-01 20:54:33','2006-02-15 22:17:59'),(11020,407,1,11214,'8.99','2005-08-02 12:19:50','2006-02-15 22:17:59'),(11021,407,1,11222,'2.99','2005-08-02 12:32:28','2006-02-15 22:18:00'),(11022,407,2,11382,'5.99','2005-08-02 18:20:52','2006-02-15 22:18:00'),(11023,407,2,11518,'4.99','2005-08-16 23:59:49','2006-02-15 22:18:00'),(11024,407,1,11677,'0.99','2005-08-17 06:06:26','2006-02-15 22:18:00'),(11025,407,2,12566,'0.99','2005-08-18 15:13:04','2006-02-15 22:18:00'),(11026,407,2,12931,'2.99','2005-08-19 05:11:47','2006-02-15 22:18:00'),(11027,407,1,13800,'0.99','2005-08-20 12:40:48','2006-02-15 22:18:00'),(11028,407,2,13856,'6.99','2005-08-20 14:49:32','2006-02-15 22:18:00'),(11029,407,2,14401,'6.99','2005-08-21 10:36:20','2006-02-15 22:18:00'),(11030,407,2,15320,'0.99','2005-08-22 20:17:49','2006-02-15 22:18:00'),(11031,407,2,15334,'1.99','2005-08-22 20:44:35','2006-02-15 22:18:00'),(11032,408,2,3,'3.99','2005-05-24 23:03:39','2006-02-15 22:18:00'),(11033,408,2,59,'5.99','2005-05-25 08:56:42','2006-02-15 22:18:00'),(11034,408,1,526,'2.99','2005-05-28 04:27:37','2006-02-15 22:18:01'),(11035,408,2,2479,'4.99','2005-06-18 21:03:08','2006-02-15 22:18:01'),(11036,408,1,2564,'2.99','2005-06-19 03:41:10','2006-02-15 22:18:01'),(11037,408,2,2728,'2.99','2005-06-19 15:04:04','2006-02-15 22:18:01'),(11038,408,2,4330,'3.99','2005-07-07 18:09:41','2006-02-15 22:18:01'),(11039,408,2,5073,'0.99','2005-07-09 05:02:35','2006-02-15 22:18:01'),(11040,408,1,6062,'0.99','2005-07-11 04:11:58','2006-02-15 22:18:01'),(11041,408,2,6203,'4.99','2005-07-11 12:28:57','2006-02-15 22:18:01'),(11042,408,2,6826,'2.99','2005-07-12 18:32:02','2006-02-15 22:18:01'),(11043,408,1,7053,'4.99','2005-07-27 03:38:54','2006-02-15 22:18:01'),(11044,408,2,7996,'4.99','2005-07-28 15:00:49','2006-02-15 22:18:01'),(11045,408,2,8251,'4.99','2005-07-29 00:50:14','2006-02-15 22:18:01'),(11046,408,2,8469,'3.99','2005-07-29 08:26:27','2006-02-15 22:18:01'),(11047,408,2,8902,'6.99','2005-07-30 01:08:06','2006-02-15 22:18:01'),(11048,408,1,9052,'0.99','2005-07-30 07:06:08','2006-02-15 22:18:01'),(11049,408,2,9757,'4.99','2005-07-31 09:25:14','2006-02-15 22:18:01'),(11050,408,2,11115,'2.99','2005-08-02 08:31:06','2006-02-15 22:18:01'),(11051,408,1,12140,'2.99','2005-08-17 23:57:55','2006-02-15 22:18:01'),(11052,408,1,12338,'4.99','2005-08-18 07:04:24','2006-02-15 22:18:01'),(11053,408,1,12498,'2.99','2005-08-18 13:01:08','2006-02-15 22:18:02'),(11054,408,2,12900,'0.99','2005-08-19 04:03:49','2006-02-15 22:18:02'),(11055,408,1,13508,'7.99','2005-08-20 02:12:54','2006-02-15 22:18:02'),(11056,408,2,13744,'3.99','2005-08-20 10:51:45','2006-02-15 22:18:02'),(11057,408,1,13944,'2.99','2005-08-20 17:41:16','2006-02-15 22:18:02'),(11058,408,2,14733,'4.99','2005-08-21 22:22:33','2006-02-15 22:18:02'),(11059,408,1,15628,'2.99','2005-08-23 07:28:04','2006-02-15 22:18:02'),(11060,408,2,15716,'1.99','2005-08-23 11:02:00','2006-02-15 22:18:02'),(11061,408,1,15765,'6.99','2005-08-23 13:06:19','2006-02-15 22:18:03'),(11062,409,1,310,'6.99','2005-05-26 22:41:07','2006-02-15 22:18:03'),(11063,409,2,1226,'5.99','2005-06-15 03:46:10','2006-02-15 22:18:03'),(11064,409,2,2310,'8.99','2005-06-18 08:45:59','2006-02-15 22:18:03'),(11065,409,1,3866,'5.99','2005-07-06 17:47:20','2006-02-15 22:18:03'),(11066,409,2,4550,'4.99','2005-07-08 04:34:00','2006-02-15 22:18:03'),(11067,409,1,5175,'3.99','2005-07-09 09:34:28','2006-02-15 22:18:03'),(11068,409,2,5306,'5.99','2005-07-09 15:56:45','2006-02-15 22:18:03'),(11069,409,1,5422,'0.99','2005-07-09 20:55:47','2006-02-15 22:18:03'),(11070,409,1,5848,'2.99','2005-07-10 17:28:14','2006-02-15 22:18:04'),(11071,409,1,5955,'7.99','2005-07-10 23:22:10','2006-02-15 22:18:04'),(11072,409,2,6026,'4.99','2005-07-11 02:21:43','2006-02-15 22:18:04'),(11073,409,1,6596,'2.99','2005-07-12 07:32:59','2006-02-15 22:18:04'),(11074,409,2,7673,'2.99','2005-07-28 02:53:53','2006-02-15 22:18:04'),(11075,409,2,7940,'0.99','2005-07-28 12:46:47','2006-02-15 22:18:04'),(11076,409,1,8037,'4.99','2005-07-28 16:31:20','2006-02-15 22:18:04'),(11077,409,2,8265,'5.99','2005-07-29 01:20:15','2006-02-15 22:18:04'),(11078,409,1,8726,'1.99','2005-07-29 18:09:22','2006-02-15 22:18:04'),(11079,409,2,9267,'0.99','2005-07-30 14:59:05','2006-02-15 22:18:04'),(11080,409,2,12830,'0.99','2005-08-19 01:40:25','2006-02-15 22:18:04'),(11081,409,1,13392,'8.99','2005-08-19 22:03:22','2006-02-15 22:18:04'),(11082,409,2,13632,'6.99','2005-08-20 07:10:52','2006-02-15 22:18:04'),(11083,409,1,14103,'1.99','2005-08-21 00:37:00','2006-02-15 22:18:04'),(11084,409,1,14697,'4.99','2005-08-21 20:49:21','2006-02-15 22:18:05'),(11085,410,1,1514,'2.99','2005-06-15 22:57:34','2006-02-15 22:18:05'),(11086,410,1,2073,'2.99','2005-06-17 16:33:59','2006-02-15 22:18:05'),(11087,410,1,2255,'4.99','2005-06-18 05:21:12','2006-02-15 22:18:05'),(11088,410,2,2400,'5.99','2005-06-18 16:10:46','2006-02-15 22:18:05'),(11089,410,2,2971,'0.99','2005-06-20 07:56:00','2006-02-15 22:18:05'),(11090,410,1,3249,'4.99','2005-06-21 03:13:19','2006-02-15 22:18:05'),(11091,410,2,4062,'0.99','2005-07-07 04:22:27','2006-02-15 22:18:05'),(11092,410,1,4267,'0.99','2005-07-07 14:35:30','2006-02-15 22:18:05'),(11093,410,1,5150,'3.99','2005-07-09 08:28:40','2006-02-15 22:18:05'),(11094,410,1,5192,'4.99','2005-07-09 10:27:09','2006-02-15 22:18:05'),(11095,410,2,5330,'5.99','2005-07-09 16:53:57','2006-02-15 22:18:05'),(11096,410,1,5336,'2.99','2005-07-09 17:01:08','2006-02-15 22:18:05'),(11097,410,1,6148,'4.99','2005-07-11 09:14:22','2006-02-15 22:18:05'),(11098,410,2,6218,'5.99','2005-07-11 13:14:58','2006-02-15 22:18:05'),(11099,410,2,7350,'4.99','2005-07-27 14:34:14','2006-02-15 22:18:05'),(11100,410,2,7407,'5.99','2005-07-27 16:29:04','2006-02-15 22:18:05'),(11101,410,1,7523,'4.99','2005-07-27 21:11:23','2006-02-15 22:18:06'),(11102,410,2,8625,'3.99','2005-07-29 13:59:13','2006-02-15 22:18:06'),(11103,410,1,8882,'0.99','2005-07-30 00:24:05','2006-02-15 22:18:06'),(11104,410,1,9263,'2.99','2005-07-30 14:48:24','2006-02-15 22:18:06'),(11105,410,1,10402,'4.99','2005-08-01 07:27:19','2006-02-15 22:18:06'),(11106,410,1,10837,'2.99','2005-08-01 23:30:22','2006-02-15 22:18:06'),(11107,410,1,11107,'0.99','2005-08-02 08:19:38','2006-02-15 22:18:06'),(11108,410,1,11187,'10.99','2005-08-02 11:16:19','2006-02-15 22:18:06'),(11109,410,1,11472,'6.99','2005-08-02 21:49:06','2006-02-15 22:18:06'),(11110,410,1,11694,'6.99','2005-08-17 06:57:30','2006-02-15 22:18:06'),(11111,410,2,12955,'8.99','2005-08-19 06:05:58','2006-02-15 22:18:06'),(11112,410,1,13460,'4.99','2005-08-20 00:48:24','2006-02-15 22:18:06'),(11113,410,2,13748,'2.99','2005-08-20 10:59:54','2006-02-15 22:18:06'),(11114,410,2,13948,'6.99','2005-08-20 17:50:48','2006-02-15 22:18:06'),(11115,410,1,14237,'3.99','2005-08-21 05:15:00','2006-02-15 22:18:07'),(11116,410,2,14298,'4.99','2005-08-21 07:17:10','2006-02-15 22:18:07'),(11117,410,1,14319,'4.99','2005-08-21 08:00:55','2006-02-15 22:18:07'),(11118,410,2,14819,'2.99','2005-08-22 01:17:19','2006-02-15 22:18:07'),(11119,410,1,15211,'2.99','2005-08-22 16:40:21','2006-02-15 22:18:07'),(11120,410,2,15392,'3.99','2005-08-22 23:02:15','2006-02-15 22:18:07'),(11121,410,1,15518,'4.99','2005-08-23 03:19:34','2006-02-15 22:18:07'),(11122,410,1,12665,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:08'),(11123,411,2,686,'4.99','2005-05-29 00:27:10','2006-02-15 22:18:08'),(11124,411,2,972,'1.99','2005-05-30 20:21:07','2006-02-15 22:18:08'),(11125,411,1,1985,'0.99','2005-06-17 10:31:37','2006-02-15 22:18:08'),(11126,411,2,1997,'2.99','2005-06-17 11:19:43','2006-02-15 22:18:08'),(11127,411,2,2712,'0.99','2005-06-19 14:20:13','2006-02-15 22:18:08'),(11128,411,1,3928,'2.99','2005-07-06 20:52:09','2006-02-15 22:18:08'),(11129,411,2,4146,'0.99','2005-07-07 08:30:16','2006-02-15 22:18:08'),(11130,411,1,4246,'2.99','2005-07-07 13:49:03','2006-02-15 22:18:08'),(11131,411,2,5357,'5.99','2005-07-09 18:08:59','2006-02-15 22:18:08'),(11132,411,1,5800,'2.99','2005-07-10 14:58:36','2006-02-15 22:18:08'),(11133,411,1,7102,'1.99','2005-07-27 05:07:21','2006-02-15 22:18:08'),(11134,411,2,7395,'0.99','2005-07-27 16:03:11','2006-02-15 22:18:08'),(11135,411,1,7513,'2.99','2005-07-27 20:51:04','2006-02-15 22:18:08'),(11136,411,1,7813,'2.99','2005-07-28 08:08:27','2006-02-15 22:18:08'),(11137,411,1,8023,'0.99','2005-07-28 15:53:29','2006-02-15 22:18:08'),(11138,411,2,8613,'5.99','2005-07-29 13:30:58','2006-02-15 22:18:09'),(11139,411,2,9622,'0.99','2005-07-31 04:21:45','2006-02-15 22:18:09'),(11140,411,2,11294,'2.99','2005-08-02 15:08:27','2006-02-15 22:18:09'),(11141,411,1,11997,'5.99','2005-08-17 18:34:38','2006-02-15 22:18:09'),(11142,411,2,13634,'0.99','2005-08-20 07:16:45','2006-02-15 22:18:09'),(11143,411,2,13656,'7.99','2005-08-20 08:01:07','2006-02-15 22:18:09'),(11144,411,2,14480,'2.99','2005-08-21 13:36:40','2006-02-15 22:18:09'),(11145,411,1,14772,'5.99','2005-08-21 23:50:39','2006-02-15 22:18:09'),(11146,411,2,14996,'2.99','2005-08-22 07:52:41','2006-02-15 22:18:09'),(11147,411,1,15936,'0.99','2005-08-23 18:43:11','2006-02-15 22:18:09'),(11148,411,2,13246,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:09'),(11149,412,2,191,'0.99','2005-05-26 06:14:06','2006-02-15 22:18:09'),(11150,412,1,333,'4.99','2005-05-27 02:52:21','2006-02-15 22:18:09'),(11151,412,1,717,'0.99','2005-05-29 04:37:44','2006-02-15 22:18:09'),(11152,412,2,1043,'3.99','2005-05-31 06:11:40','2006-02-15 22:18:09'),(11153,412,1,3292,'2.99','2005-06-21 06:59:11','2006-02-15 22:18:09'),(11154,412,2,3888,'0.99','2005-07-06 18:54:20','2006-02-15 22:18:09'),(11155,412,2,4074,'0.99','2005-07-07 04:49:49','2006-02-15 22:18:09'),(11156,412,1,8036,'0.99','2005-07-28 16:27:43','2006-02-15 22:18:09'),(11157,412,2,8330,'8.99','2005-07-29 04:09:07','2006-02-15 22:18:10'),(11158,412,1,8411,'8.99','2005-07-29 06:44:23','2006-02-15 22:18:10'),(11159,412,1,8674,'0.99','2005-07-29 15:54:22','2006-02-15 22:18:10'),(11160,412,1,9881,'4.99','2005-07-31 13:50:38','2006-02-15 22:18:10'),(11161,412,2,10381,'2.99','2005-08-01 06:36:37','2006-02-15 22:18:10'),(11162,412,1,10467,'5.99','2005-08-01 09:45:58','2006-02-15 22:18:10'),(11163,412,2,11027,'4.99','2005-08-02 05:47:10','2006-02-15 22:18:10'),(11164,412,1,14068,'3.99','2005-08-20 22:50:59','2006-02-15 22:18:10'),(11165,412,1,14535,'6.99','2005-08-21 15:22:37','2006-02-15 22:18:10'),(11166,412,2,15354,'4.99','2005-08-22 21:18:59','2006-02-15 22:18:10'),(11167,412,2,15732,'4.99','2005-08-23 11:35:12','2006-02-15 22:18:10'),(11168,412,1,15781,'8.99','2005-08-23 13:41:05','2006-02-15 22:18:10'),(11169,412,1,15314,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:10'),(11170,413,1,40,'4.99','2005-05-25 05:09:04','2006-02-15 22:18:10'),(11171,413,1,999,'4.99','2005-05-31 00:25:10','2006-02-15 22:18:10'),(11172,413,2,2130,'5.99','2005-06-17 21:00:44','2006-02-15 22:18:10'),(11173,413,2,2545,'4.99','2005-06-19 02:23:36','2006-02-15 22:18:10'),(11174,413,1,3762,'4.99','2005-07-06 12:52:49','2006-02-15 22:18:10'),(11175,413,2,4491,'0.99','2005-07-08 01:30:46','2006-02-15 22:18:10'),(11176,413,1,5897,'7.99','2005-07-10 20:16:14','2006-02-15 22:18:11'),(11177,413,2,7100,'4.99','2005-07-27 05:05:01','2006-02-15 22:18:11'),(11178,413,1,7635,'0.99','2005-07-28 01:08:11','2006-02-15 22:18:11'),(11179,413,2,7731,'0.99','2005-07-28 05:01:18','2006-02-15 22:18:11'),(11180,413,1,10909,'2.99','2005-08-02 01:53:59','2006-02-15 22:18:11'),(11181,413,2,11304,'2.99','2005-08-02 15:40:10','2006-02-15 22:18:11'),(11182,413,1,11468,'0.99','2005-08-02 21:47:26','2006-02-15 22:18:11'),(11183,413,1,11532,'0.99','2005-08-17 00:34:14','2006-02-15 22:18:11'),(11184,413,2,12552,'2.99','2005-08-18 14:46:34','2006-02-15 22:18:11'),(11185,413,1,13010,'3.99','2005-08-19 07:52:21','2006-02-15 22:18:11'),(11186,413,1,13318,'2.99','2005-08-19 19:33:57','2006-02-15 22:18:11'),(11187,413,2,13824,'4.99','2005-08-20 13:43:12','2006-02-15 22:18:11'),(11188,413,2,13887,'4.99','2005-08-20 15:39:00','2006-02-15 22:18:11'),(11189,413,1,14773,'2.99','2005-08-21 23:50:57','2006-02-15 22:18:11'),(11190,413,1,15678,'2.99','2005-08-23 09:23:45','2006-02-15 22:18:11'),(11191,414,1,85,'4.99','2005-05-25 13:05:34','2006-02-15 22:18:11'),(11192,414,1,261,'3.99','2005-05-26 15:44:23','2006-02-15 22:18:11'),(11193,414,1,2246,'4.99','2005-06-18 04:54:29','2006-02-15 22:18:11'),(11194,414,1,2559,'9.99','2005-06-19 03:09:46','2006-02-15 22:18:12'),(11195,414,1,3318,'5.99','2005-06-21 08:23:05','2006-02-15 22:18:12'),(11196,414,1,3957,'10.99','2005-07-06 22:05:47','2006-02-15 22:18:12'),(11197,414,1,4437,'3.99','2005-07-07 22:55:41','2006-02-15 22:18:12'),(11198,414,2,6462,'7.99','2005-07-12 01:15:24','2006-02-15 22:18:12'),(11199,414,2,6728,'0.99','2005-07-12 13:56:48','2006-02-15 22:18:12'),(11200,414,2,6845,'0.99','2005-07-12 19:20:41','2006-02-15 22:18:12'),(11201,414,1,7009,'0.99','2005-07-27 01:45:44','2006-02-15 22:18:12'),(11202,414,1,7779,'2.99','2005-07-28 07:11:11','2006-02-15 22:18:12'),(11203,414,1,9650,'2.99','2005-07-31 05:47:32','2006-02-15 22:18:12'),(11204,414,2,9991,'2.99','2005-07-31 17:26:27','2006-02-15 22:18:12'),(11205,414,2,10107,'5.99','2005-07-31 21:01:46','2006-02-15 22:18:12'),(11206,414,1,11706,'0.99','2005-08-17 07:23:46','2006-02-15 22:18:12'),(11207,414,2,12930,'4.99','2005-08-19 05:11:32','2006-02-15 22:18:12'),(11208,414,1,13042,'0.99','2005-08-19 09:06:08','2006-02-15 22:18:12'),(11209,414,1,13242,'2.99','2005-08-19 16:28:47','2006-02-15 22:18:12'),(11210,414,1,13308,'7.99','2005-08-19 18:59:42','2006-02-15 22:18:12'),(11211,414,1,13404,'0.99','2005-08-19 22:18:42','2006-02-15 22:18:12'),(11212,414,2,13494,'2.99','2005-08-20 01:36:34','2006-02-15 22:18:12'),(11213,414,2,13657,'4.99','2005-08-20 08:01:39','2006-02-15 22:18:12'),(11214,414,1,15140,'6.99','2005-08-22 13:39:20','2006-02-15 22:18:13'),(11215,414,2,15481,'0.99','2005-08-23 01:59:14','2006-02-15 22:18:13'),(11216,415,2,665,'4.99','2005-05-28 21:38:39','2006-02-15 22:18:13'),(11217,415,2,1867,'4.99','2005-06-17 02:01:37','2006-02-15 22:18:13'),(11218,415,1,3211,'2.99','2005-06-21 01:01:29','2006-02-15 22:18:13'),(11219,415,2,4926,'8.99','2005-07-08 22:01:48','2006-02-15 22:18:13'),(11220,415,2,5665,'0.99','2005-07-10 08:10:08','2006-02-15 22:18:13'),(11221,415,2,5733,'0.99','2005-07-10 11:37:24','2006-02-15 22:18:13'),(11222,415,2,6491,'5.99','2005-07-12 02:28:31','2006-02-15 22:18:13'),(11223,415,1,6505,'3.99','2005-07-12 03:27:37','2006-02-15 22:18:13'),(11224,415,1,7379,'4.99','2005-07-27 15:36:43','2006-02-15 22:18:13'),(11225,415,2,7624,'0.99','2005-07-28 00:37:44','2006-02-15 22:18:13'),(11226,415,1,7748,'4.99','2005-07-28 05:52:23','2006-02-15 22:18:13'),(11227,415,2,8317,'2.99','2005-07-29 03:39:07','2006-02-15 22:18:13'),(11228,415,2,9586,'2.99','2005-07-31 03:07:16','2006-02-15 22:18:13'),(11229,415,1,9852,'2.99','2005-07-31 12:52:17','2006-02-15 22:18:13'),(11230,415,1,10263,'5.99','2005-08-01 03:02:48','2006-02-15 22:18:13'),(11231,415,1,10553,'2.99','2005-08-01 12:54:06','2006-02-15 22:18:13'),(11232,415,2,11310,'1.99','2005-08-02 15:51:58','2006-02-15 22:18:13'),(11233,415,2,12128,'5.99','2005-08-17 23:31:09','2006-02-15 22:18:14'),(11234,415,2,12588,'2.99','2005-08-18 16:04:45','2006-02-15 22:18:14'),(11235,415,2,13729,'8.99','2005-08-20 10:17:08','2006-02-15 22:18:14'),(11236,415,1,14992,'4.99','2005-08-22 07:51:47','2006-02-15 22:18:14'),(11237,415,2,15121,'4.99','2005-08-22 12:46:37','2006-02-15 22:18:14'),(11238,415,1,15959,'0.99','2005-08-23 19:27:04','2006-02-15 22:18:14'),(11239,416,2,253,'0.99','2005-05-26 14:43:14','2006-02-15 22:18:14'),(11240,416,2,724,'3.99','2005-05-29 05:53:23','2006-02-15 22:18:14'),(11241,416,2,1031,'2.99','2005-05-31 04:23:01','2006-02-15 22:18:14'),(11242,416,2,1158,'2.99','2005-06-14 22:53:33','2006-02-15 22:18:14'),(11243,416,1,1343,'4.99','2005-06-15 12:27:19','2006-02-15 22:18:14'),(11244,416,2,1553,'0.99','2005-06-16 02:02:44','2006-02-15 22:18:14'),(11245,416,2,1596,'2.99','2005-06-16 05:30:58','2006-02-15 22:18:14'),(11246,416,2,1771,'0.99','2005-06-16 18:12:17','2006-02-15 22:18:14'),(11247,416,1,3833,'3.99','2005-07-06 16:18:28','2006-02-15 22:18:14'),(11248,416,1,3868,'2.99','2005-07-06 17:54:13','2006-02-15 22:18:14'),(11249,416,1,6097,'2.99','2005-07-11 06:21:43','2006-02-15 22:18:14'),(11250,416,1,6879,'7.99','2005-07-12 20:37:37','2006-02-15 22:18:14'),(11251,416,1,7889,'0.99','2005-07-28 10:43:21','2006-02-15 22:18:14'),(11252,416,1,7917,'2.99','2005-07-28 11:56:57','2006-02-15 22:18:15'),(11253,416,2,8349,'5.99','2005-07-29 04:50:22','2006-02-15 22:18:15'),(11254,416,2,8588,'2.99','2005-07-29 12:22:20','2006-02-15 22:18:15'),(11255,416,2,8648,'2.99','2005-07-29 14:56:21','2006-02-15 22:18:15'),(11256,416,2,9383,'2.99','2005-07-30 19:24:50','2006-02-15 22:18:15'),(11257,416,1,10254,'3.99','2005-08-01 02:42:03','2006-02-15 22:18:15'),(11258,416,1,10354,'2.99','2005-08-01 05:47:10','2006-02-15 22:18:15'),(11259,416,1,10742,'6.99','2005-08-01 19:53:13','2006-02-15 22:18:15'),(11260,416,1,10937,'6.99','2005-08-02 03:00:18','2006-02-15 22:18:15'),(11261,416,2,11047,'5.99','2005-08-02 06:09:20','2006-02-15 22:18:15'),(11262,416,1,11557,'6.99','2005-08-17 01:19:20','2006-02-15 22:18:15'),(11263,416,1,12722,'8.99','2005-08-18 21:33:53','2006-02-15 22:18:15'),(11264,416,1,12932,'4.99','2005-08-19 05:17:30','2006-02-15 22:18:15'),(11265,416,1,14239,'4.99','2005-08-21 05:18:57','2006-02-15 22:18:15'),(11266,416,1,15235,'1.99','2005-08-22 17:43:12','2006-02-15 22:18:15'),(11267,416,2,15470,'4.99','2005-08-23 01:35:12','2006-02-15 22:18:15'),(11268,416,1,15727,'2.99','2005-08-23 11:28:49','2006-02-15 22:18:15'),(11269,416,2,15761,'0.99','2005-08-23 12:55:51','2006-02-15 22:18:15'),(11270,417,1,267,'4.99','2005-05-26 16:16:21','2006-02-15 22:18:15'),(11271,417,2,630,'8.99','2005-05-28 17:24:51','2006-02-15 22:18:16'),(11272,417,2,833,'4.99','2005-05-29 23:21:56','2006-02-15 22:18:16'),(11273,417,1,1921,'3.99','2005-06-17 06:04:16','2006-02-15 22:18:16'),(11274,417,1,3952,'4.99','2005-07-06 21:51:31','2006-02-15 22:18:16'),(11275,417,1,4418,'2.99','2005-07-07 22:05:30','2006-02-15 22:18:16'),(11276,417,1,4421,'9.99','2005-07-07 22:07:55','2006-02-15 22:18:16'),(11277,417,2,6258,'6.99','2005-07-11 15:24:32','2006-02-15 22:18:16'),(11278,417,1,6312,'4.99','2005-07-11 18:19:02','2006-02-15 22:18:16'),(11279,417,1,8877,'2.99','2005-07-30 00:15:22','2006-02-15 22:18:16'),(11280,417,2,9049,'2.99','2005-07-30 06:57:28','2006-02-15 22:18:16'),(11281,417,1,10478,'0.99','2005-08-01 10:09:06','2006-02-15 22:18:16'),(11282,417,1,11217,'7.99','2005-08-02 12:26:31','2006-02-15 22:18:16'),(11283,417,1,11291,'6.99','2005-08-02 14:57:58','2006-02-15 22:18:16'),(11284,417,2,11303,'0.99','2005-08-02 15:39:18','2006-02-15 22:18:16'),(11285,417,2,12074,'0.99','2005-08-17 21:50:57','2006-02-15 22:18:16'),(11286,417,2,12281,'4.99','2005-08-18 04:50:32','2006-02-15 22:18:16'),(11287,417,1,13545,'4.99','2005-08-20 03:50:15','2006-02-15 22:18:16'),(11288,417,1,13927,'1.99','2005-08-20 17:11:58','2006-02-15 22:18:16'),(11289,417,2,14121,'4.99','2005-08-21 01:26:33','2006-02-15 22:18:16'),(11290,417,1,14304,'6.99','2005-08-21 07:23:10','2006-02-15 22:18:17'),(11291,417,1,14607,'2.99','2005-08-21 17:56:50','2006-02-15 22:18:17'),(11292,417,2,14882,'2.99','2005-08-22 03:52:21','2006-02-15 22:18:17'),(11293,417,1,15795,'0.99','2005-08-23 14:07:56','2006-02-15 22:18:17'),(11294,417,2,13261,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:17'),(11295,418,1,2825,'2.99','2005-06-19 20:32:19','2006-02-15 22:18:17'),(11296,418,2,2943,'2.99','2005-06-20 05:43:05','2006-02-15 22:18:17'),(11297,418,2,2969,'2.99','2005-06-20 07:44:27','2006-02-15 22:18:17'),(11298,418,1,3805,'0.99','2005-07-06 15:08:42','2006-02-15 22:18:17'),(11299,418,2,4852,'7.99','2005-07-08 18:43:15','2006-02-15 22:18:17'),(11300,418,1,4865,'2.99','2005-07-08 19:09:04','2006-02-15 22:18:17'),(11301,418,1,4938,'0.99','2005-07-08 22:32:53','2006-02-15 22:18:17'),(11302,418,1,6150,'4.99','2005-07-11 09:23:56','2006-02-15 22:18:17'),(11303,418,1,6970,'4.99','2005-07-27 00:26:14','2006-02-15 22:18:17'),(11304,418,2,8546,'5.99','2005-07-29 11:08:48','2006-02-15 22:18:17'),(11305,418,2,8591,'0.99','2005-07-29 12:32:33','2006-02-15 22:18:17'),(11306,418,2,8886,'10.99','2005-07-30 00:36:31','2006-02-15 22:18:17'),(11307,418,1,9558,'4.99','2005-07-31 02:14:35','2006-02-15 22:18:17'),(11308,418,2,10537,'5.99','2005-08-01 12:22:28','2006-02-15 22:18:17'),(11309,418,1,10709,'0.99','2005-08-01 18:43:57','2006-02-15 22:18:18'),(11310,418,2,10915,'2.99','2005-08-02 02:05:04','2006-02-15 22:18:18'),(11311,418,1,11270,'2.99','2005-08-02 14:18:07','2006-02-15 22:18:18'),(11312,418,2,11322,'3.99','2005-08-02 16:23:17','2006-02-15 22:18:18'),(11313,418,2,11409,'1.99','2005-08-02 19:26:51','2006-02-15 22:18:18'),(11314,418,1,11650,'4.99','2005-08-17 05:00:03','2006-02-15 22:18:18'),(11315,418,1,11769,'2.99','2005-08-17 10:04:49','2006-02-15 22:18:18'),(11316,418,1,11910,'0.99','2005-08-17 15:44:37','2006-02-15 22:18:18'),(11317,418,2,13312,'0.99','2005-08-19 19:09:14','2006-02-15 22:18:18'),(11318,418,1,13537,'2.99','2005-08-20 03:39:15','2006-02-15 22:18:18'),(11319,418,1,13970,'0.99','2005-08-20 18:43:34','2006-02-15 22:18:18'),(11320,418,1,14484,'0.99','2005-08-21 13:47:29','2006-02-15 22:18:18'),(11321,418,1,14836,'4.99','2005-08-22 01:52:26','2006-02-15 22:18:18'),(11322,418,2,14860,'2.99','2005-08-22 02:47:07','2006-02-15 22:18:18'),(11323,418,1,15466,'4.99','2005-08-23 01:16:55','2006-02-15 22:18:18'),(11324,418,2,15957,'5.99','2005-08-23 19:21:22','2006-02-15 22:18:18'),(11325,419,1,62,'2.99','2005-05-25 09:18:52','2006-02-15 22:18:18'),(11326,419,2,2793,'2.99','2005-06-19 18:52:37','2006-02-15 22:18:18'),(11327,419,1,3596,'0.99','2005-07-06 05:03:11','2006-02-15 22:18:18'),(11328,419,1,3694,'4.99','2005-07-06 10:01:23','2006-02-15 22:18:19'),(11329,419,1,4224,'0.99','2005-07-07 12:24:21','2006-02-15 22:18:19'),(11330,419,2,5333,'5.99','2005-07-09 16:59:38','2006-02-15 22:18:19'),(11331,419,2,5863,'0.99','2005-07-10 18:25:23','2006-02-15 22:18:19'),(11332,419,1,5900,'3.99','2005-07-10 20:21:54','2006-02-15 22:18:19'),(11333,419,2,5933,'0.99','2005-07-10 22:06:48','2006-02-15 22:18:19'),(11334,419,2,6173,'0.99','2005-07-11 10:33:11','2006-02-15 22:18:19'),(11335,419,2,6587,'3.99','2005-07-12 06:56:26','2006-02-15 22:18:19'),(11336,419,1,7362,'4.99','2005-07-27 14:58:27','2006-02-15 22:18:19'),(11337,419,1,7619,'2.99','2005-07-28 00:25:41','2006-02-15 22:18:19'),(11338,419,1,7796,'4.99','2005-07-28 07:39:39','2006-02-15 22:18:19'),(11339,419,1,10150,'2.99','2005-07-31 22:22:00','2006-02-15 22:18:19'),(11340,419,1,10372,'2.99','2005-08-01 06:23:48','2006-02-15 22:18:19'),(11341,419,2,11025,'4.99','2005-08-02 05:39:12','2006-02-15 22:18:19'),(11342,419,1,11313,'2.99','2005-08-02 16:02:51','2006-02-15 22:18:19'),(11343,419,2,11323,'2.99','2005-08-02 16:29:57','2006-02-15 22:18:19'),(11344,419,1,11425,'2.99','2005-08-02 19:58:48','2006-02-15 22:18:19'),(11345,419,2,11689,'6.99','2005-08-17 06:42:08','2006-02-15 22:18:19'),(11346,419,1,12460,'7.99','2005-08-18 11:25:13','2006-02-15 22:18:19'),(11347,419,1,12720,'5.99','2005-08-18 21:28:42','2006-02-15 22:18:20'),(11348,419,2,14308,'0.99','2005-08-21 07:43:21','2006-02-15 22:18:20'),(11349,419,2,15779,'4.99','2005-08-23 13:33:46','2006-02-15 22:18:20'),(11350,420,2,744,'4.99','2005-05-29 09:13:08','2006-02-15 22:18:20'),(11351,420,2,2672,'3.99','2005-06-19 11:42:04','2006-02-15 22:18:20'),(11352,420,1,2698,'0.99','2005-06-19 13:29:11','2006-02-15 22:18:20'),(11353,420,1,2726,'0.99','2005-06-19 15:02:20','2006-02-15 22:18:20'),(11354,420,1,4176,'4.99','2005-07-07 10:03:34','2006-02-15 22:18:20'),(11355,420,2,5081,'4.99','2005-07-09 05:25:20','2006-02-15 22:18:20'),(11356,420,1,5168,'4.99','2005-07-09 09:20:01','2006-02-15 22:18:20'),(11357,420,2,5911,'0.99','2005-07-10 20:51:42','2006-02-15 22:18:20'),(11358,420,2,6086,'3.99','2005-07-11 05:29:03','2006-02-15 22:18:20'),(11359,420,2,6096,'4.99','2005-07-11 06:18:04','2006-02-15 22:18:20'),(11360,420,2,6582,'4.99','2005-07-12 06:28:12','2006-02-15 22:18:20'),(11361,420,1,6588,'4.99','2005-07-12 06:57:40','2006-02-15 22:18:20'),(11362,420,2,7081,'2.99','2005-07-27 04:25:59','2006-02-15 22:18:20'),(11363,420,2,8485,'0.99','2005-07-29 08:53:09','2006-02-15 22:18:20'),(11364,420,1,9362,'0.99','2005-07-30 18:44:16','2006-02-15 22:18:20'),(11365,420,2,10291,'4.99','2005-08-01 03:39:57','2006-02-15 22:18:20'),(11366,420,2,10601,'10.99','2005-08-01 14:25:40','2006-02-15 22:18:21'),(11367,420,1,10766,'4.99','2005-08-01 20:36:29','2006-02-15 22:18:21'),(11368,420,2,11236,'5.99','2005-08-02 13:17:21','2006-02-15 22:18:21'),(11369,420,2,14525,'0.99','2005-08-21 15:06:49','2006-02-15 22:18:21'),(11370,420,2,15597,'0.99','2005-08-23 06:21:20','2006-02-15 22:18:21'),(11371,421,1,507,'0.99','2005-05-28 02:31:19','2006-02-15 22:18:21'),(11372,421,1,931,'0.99','2005-05-30 12:53:01','2006-02-15 22:18:21'),(11373,421,1,1693,'4.99','2005-06-16 12:39:51','2006-02-15 22:18:21'),(11374,421,2,2407,'2.99','2005-06-18 16:50:41','2006-02-15 22:18:21'),(11375,421,1,3170,'4.99','2005-06-20 22:02:54','2006-02-15 22:18:21'),(11376,421,1,3491,'7.99','2005-07-05 23:41:08','2006-02-15 22:18:21'),(11377,421,2,3703,'5.99','2005-07-06 10:15:26','2006-02-15 22:18:21'),(11378,421,1,3988,'8.99','2005-07-06 23:30:42','2006-02-15 22:18:21'),(11379,421,2,4456,'5.99','2005-07-07 23:45:21','2006-02-15 22:18:21'),(11380,421,1,6220,'0.99','2005-07-11 13:22:06','2006-02-15 22:18:21'),(11381,421,2,6960,'3.99','2005-07-27 00:08:33','2006-02-15 22:18:21'),(11382,421,2,7449,'4.99','2005-07-27 18:17:41','2006-02-15 22:18:21'),(11383,421,2,8025,'2.99','2005-07-28 16:03:27','2006-02-15 22:18:21'),(11384,421,1,8268,'4.99','2005-07-29 01:23:23','2006-02-15 22:18:21'),(11385,421,1,8725,'4.99','2005-07-29 18:08:42','2006-02-15 22:18:22'),(11386,421,2,9377,'4.99','2005-07-30 19:12:18','2006-02-15 22:18:22'),(11387,421,2,9875,'0.99','2005-07-31 13:37:41','2006-02-15 22:18:22'),(11388,421,1,10200,'4.99','2005-08-01 00:39:05','2006-02-15 22:18:22'),(11389,421,2,11089,'2.99','2005-08-02 07:52:20','2006-02-15 22:18:22'),(11390,421,1,11263,'4.99','2005-08-02 14:02:19','2006-02-15 22:18:22'),(11391,421,1,11523,'3.99','2005-08-17 00:10:10','2006-02-15 22:18:22'),(11392,421,1,12279,'4.99','2005-08-18 04:47:30','2006-02-15 22:18:22'),(11393,421,2,13461,'9.99','2005-08-20 00:49:04','2006-02-15 22:18:22'),(11394,421,1,13872,'4.99','2005-08-20 15:10:30','2006-02-15 22:18:22'),(11395,421,1,14742,'4.99','2005-08-21 22:39:01','2006-02-15 22:18:22'),(11396,421,1,14887,'3.99','2005-08-22 04:04:31','2006-02-15 22:18:22'),(11397,421,2,15710,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:22'),(11398,422,1,398,'0.99','2005-05-27 12:44:03','2006-02-15 22:18:22'),(11399,422,1,1846,'0.99','2005-06-17 00:02:44','2006-02-15 22:18:22'),(11400,422,1,1897,'4.99','2005-06-17 04:26:23','2006-02-15 22:18:22'),(11401,422,2,2747,'2.99','2005-06-19 16:22:07','2006-02-15 22:18:22'),(11402,422,1,2778,'5.99','2005-06-19 18:18:12','2006-02-15 22:18:22'),(11403,422,1,3553,'4.99','2005-07-06 02:35:41','2006-02-15 22:18:22'),(11404,422,2,4463,'2.99','2005-07-08 00:04:59','2006-02-15 22:18:23'),(11405,422,2,4504,'0.99','2005-07-08 02:19:27','2006-02-15 22:18:23'),(11406,422,1,5784,'1.99','2005-07-10 14:03:28','2006-02-15 22:18:23'),(11407,422,2,7827,'0.99','2005-07-28 08:37:22','2006-02-15 22:18:23'),(11408,422,2,8206,'4.99','2005-07-28 23:20:31','2006-02-15 22:18:23'),(11409,422,2,9541,'4.99','2005-07-31 01:40:14','2006-02-15 22:18:23'),(11410,422,2,10833,'6.99','2005-08-01 23:25:55','2006-02-15 22:18:23'),(11411,422,2,11325,'6.99','2005-08-02 16:33:11','2006-02-15 22:18:23'),(11412,422,1,11658,'2.99','2005-08-17 05:19:17','2006-02-15 22:18:23'),(11413,422,1,11842,'4.99','2005-08-17 13:13:37','2006-02-15 22:18:23'),(11414,422,1,12907,'9.99','2005-08-19 04:16:13','2006-02-15 22:18:23'),(11415,422,2,13216,'1.99','2005-08-19 15:36:05','2006-02-15 22:18:23'),(11416,422,2,13625,'1.99','2005-08-20 06:52:03','2006-02-15 22:18:23'),(11417,422,2,13709,'0.99','2005-08-20 09:34:51','2006-02-15 22:18:23'),(11418,422,2,13722,'4.99','2005-08-20 10:03:45','2006-02-15 22:18:23'),(11419,422,1,14861,'4.99','2005-08-22 02:48:05','2006-02-15 22:18:23'),(11420,422,1,15272,'3.99','2005-08-22 18:49:40','2006-02-15 22:18:23'),(11421,422,1,15273,'2.99','2005-08-22 18:53:28','2006-02-15 22:18:23'),(11422,422,2,15316,'2.99','2005-08-22 20:07:03','2006-02-15 22:18:23'),(11423,422,2,15441,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:24'),(11424,423,1,1504,'3.99','2005-06-15 22:08:06','2006-02-15 22:18:24'),(11425,423,2,1827,'0.99','2005-06-16 21:54:40','2006-02-15 22:18:24'),(11426,423,1,2600,'6.99','2005-06-19 06:07:25','2006-02-15 22:18:24'),(11427,423,2,2758,'6.99','2005-06-19 17:04:35','2006-02-15 22:18:24'),(11428,423,1,3072,'8.99','2005-06-20 14:21:31','2006-02-15 22:18:24'),(11429,423,2,4105,'0.99','2005-07-07 06:31:00','2006-02-15 22:18:24'),(11430,423,1,4250,'0.99','2005-07-07 14:08:11','2006-02-15 22:18:24'),(11431,423,1,4679,'2.99','2005-07-08 10:33:14','2006-02-15 22:18:24'),(11432,423,1,6506,'1.99','2005-07-12 03:28:22','2006-02-15 22:18:24'),(11433,423,1,7016,'5.99','2005-07-27 02:15:16','2006-02-15 22:18:24'),(11434,423,2,7141,'2.99','2005-07-27 06:55:27','2006-02-15 22:18:24'),(11435,423,1,7157,'4.99','2005-07-27 07:20:28','2006-02-15 22:18:24'),(11436,423,1,7290,'0.99','2005-07-27 12:28:45','2006-02-15 22:18:24'),(11437,423,2,7539,'9.99','2005-07-27 21:39:42','2006-02-15 22:18:24'),(11438,423,1,7849,'9.99','2005-07-28 09:30:02','2006-02-15 22:18:24'),(11439,423,2,8082,'3.99','2005-07-28 18:08:02','2006-02-15 22:18:24'),(11440,423,2,8595,'9.99','2005-07-29 12:47:43','2006-02-15 22:18:24'),(11441,423,2,9026,'2.99','2005-07-30 05:55:31','2006-02-15 22:18:24'),(11442,423,1,10488,'2.99','2005-08-01 10:27:27','2006-02-15 22:18:25'),(11443,423,1,11091,'2.99','2005-08-02 07:56:41','2006-02-15 22:18:25'),(11444,423,2,11514,'4.99','2005-08-16 23:53:10','2006-02-15 22:18:25'),(11445,423,2,12806,'4.99','2005-08-19 00:37:26','2006-02-15 22:18:25'),(11446,423,2,14191,'6.99','2005-08-21 03:35:58','2006-02-15 22:18:25'),(11447,423,2,14902,'4.99','2005-08-22 04:31:50','2006-02-15 22:18:25'),(11448,423,1,15380,'0.99','2005-08-22 22:28:15','2006-02-15 22:18:25'),(11449,423,1,15755,'4.99','2005-08-23 12:46:38','2006-02-15 22:18:25'),(11450,424,2,403,'0.99','2005-05-27 13:28:52','2006-02-15 22:18:25'),(11451,424,2,3044,'4.99','2005-06-20 12:38:49','2006-02-15 22:18:25'),(11452,424,1,3166,'6.99','2005-06-20 21:32:32','2006-02-15 22:18:25'),(11453,424,2,3404,'0.99','2005-06-21 15:57:52','2006-02-15 22:18:25'),(11454,424,2,3746,'0.99','2005-07-06 12:10:51','2006-02-15 22:18:25'),(11455,424,2,4512,'0.99','2005-07-08 02:38:56','2006-02-15 22:18:25'),(11456,424,2,4559,'0.99','2005-07-08 04:56:49','2006-02-15 22:18:25'),(11457,424,2,4696,'5.99','2005-07-08 11:12:27','2006-02-15 22:18:25'),(11458,424,1,5568,'0.99','2005-07-10 03:36:56','2006-02-15 22:18:25'),(11459,424,1,5611,'3.99','2005-07-10 05:13:43','2006-02-15 22:18:25'),(11460,424,1,6589,'2.99','2005-07-12 07:06:29','2006-02-15 22:18:25'),(11461,424,1,7594,'2.99','2005-07-27 23:30:41','2006-02-15 22:18:26'),(11462,424,2,8194,'2.99','2005-07-28 22:51:44','2006-02-15 22:18:26'),(11463,424,1,8918,'4.99','2005-07-30 01:56:22','2006-02-15 22:18:26'),(11464,424,2,8964,'1.99','2005-07-30 03:49:35','2006-02-15 22:18:26'),(11465,424,2,8999,'2.99','2005-07-30 04:55:46','2006-02-15 22:18:26'),(11466,424,1,9471,'4.99','2005-07-30 23:02:36','2006-02-15 22:18:26'),(11467,424,1,9516,'8.99','2005-07-31 00:40:58','2006-02-15 22:18:26'),(11468,424,2,9878,'4.99','2005-07-31 13:42:02','2006-02-15 22:18:26'),(11469,424,1,10017,'6.99','2005-07-31 18:13:22','2006-02-15 22:18:26'),(11470,424,2,10369,'4.99','2005-08-01 06:13:44','2006-02-15 22:18:26'),(11471,424,1,10866,'2.99','2005-08-02 00:22:49','2006-02-15 22:18:26'),(11472,424,2,11374,'2.99','2005-08-02 18:14:54','2006-02-15 22:18:26'),(11473,424,2,11562,'6.99','2005-08-17 01:23:39','2006-02-15 22:18:26'),(11474,424,2,11833,'2.99','2005-08-17 13:00:33','2006-02-15 22:18:26'),(11475,424,2,12729,'0.99','2005-08-18 21:52:59','2006-02-15 22:18:26'),(11476,424,2,13793,'3.99','2005-08-20 12:22:04','2006-02-15 22:18:26'),(11477,424,2,15113,'0.99','2005-08-22 12:23:59','2006-02-15 22:18:26'),(11478,424,2,15941,'9.99','2005-08-23 18:46:44','2006-02-15 22:18:26'),(11479,424,1,15094,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:27'),(11480,425,2,1098,'5.99','2005-05-31 13:51:48','2006-02-15 22:18:27'),(11481,425,1,3276,'6.99','2005-06-21 05:35:52','2006-02-15 22:18:27'),(11482,425,1,3807,'4.99','2005-07-06 15:11:44','2006-02-15 22:18:27'),(11483,425,2,4361,'2.99','2005-07-07 19:33:23','2006-02-15 22:18:27'),(11484,425,2,4362,'5.99','2005-07-07 19:35:30','2006-02-15 22:18:27'),(11485,425,2,4483,'8.99','2005-07-08 01:03:12','2006-02-15 22:18:27'),(11486,425,1,4659,'2.99','2005-07-08 09:53:28','2006-02-15 22:18:27'),(11487,425,1,4884,'7.99','2005-07-08 19:49:17','2006-02-15 22:18:27'),(11488,425,1,4939,'7.99','2005-07-08 22:35:30','2006-02-15 22:18:27'),(11489,425,2,5363,'2.99','2005-07-09 18:18:49','2006-02-15 22:18:27'),(11490,425,1,5371,'4.99','2005-07-09 18:47:48','2006-02-15 22:18:27'),(11491,425,2,6318,'2.99','2005-07-11 18:48:22','2006-02-15 22:18:27'),(11492,425,1,6603,'2.99','2005-07-12 07:52:55','2006-02-15 22:18:27'),(11493,425,1,7249,'4.99','2005-07-27 10:39:53','2006-02-15 22:18:27'),(11494,425,1,8974,'0.99','2005-07-30 04:09:16','2006-02-15 22:18:27'),(11495,425,1,9170,'0.99','2005-07-30 11:35:24','2006-02-15 22:18:27'),(11496,425,2,9682,'2.99','2005-07-31 06:47:10','2006-02-15 22:18:27'),(11497,425,1,10121,'0.99','2005-07-31 21:24:53','2006-02-15 22:18:27'),(11498,425,2,10163,'0.99','2005-07-31 23:12:34','2006-02-15 22:18:28'),(11499,425,1,10545,'0.99','2005-08-01 12:37:46','2006-02-15 22:18:28'),(11500,425,2,13040,'0.99','2005-08-19 09:04:24','2006-02-15 22:18:28'),(11501,425,2,14089,'5.99','2005-08-20 23:59:02','2006-02-15 22:18:28'),(11502,425,2,14881,'4.99','2005-08-22 03:47:39','2006-02-15 22:18:28'),(11503,425,1,15064,'0.99','2005-08-22 10:41:58','2006-02-15 22:18:28'),(11504,425,2,15784,'6.99','2005-08-23 13:46:00','2006-02-15 22:18:28'),(11505,425,2,16036,'2.99','2005-08-23 22:12:44','2006-02-15 22:18:28'),(11506,426,2,604,'0.99','2005-05-28 14:37:07','2006-02-15 22:18:28'),(11507,426,1,1709,'6.99','2005-06-16 14:10:15','2006-02-15 22:18:28'),(11508,426,1,1842,'7.99','2005-06-16 23:45:59','2006-02-15 22:18:28'),(11509,426,1,2204,'2.99','2005-06-18 02:11:38','2006-02-15 22:18:28'),(11510,426,1,2804,'0.99','2005-06-19 19:24:54','2006-02-15 22:18:28'),(11511,426,1,3243,'0.99','2005-06-21 03:00:11','2006-02-15 22:18:28'),(11512,426,2,4114,'2.99','2005-07-07 06:51:12','2006-02-15 22:18:28'),(11513,426,2,4398,'4.99','2005-07-07 21:18:44','2006-02-15 22:18:28'),(11514,426,1,4900,'4.99','2005-07-08 20:38:06','2006-02-15 22:18:28'),(11515,426,1,5725,'3.99','2005-07-10 11:21:21','2006-02-15 22:18:28'),(11516,426,1,7495,'4.99','2005-07-27 20:01:20','2006-02-15 22:18:28'),(11517,426,1,7527,'10.99','2005-07-27 21:14:28','2006-02-15 22:18:29'),(11518,426,1,7711,'4.99','2005-07-28 04:26:42','2006-02-15 22:18:29'),(11519,426,1,7789,'5.99','2005-07-28 07:22:07','2006-02-15 22:18:29'),(11520,426,1,9185,'5.99','2005-07-30 12:10:40','2006-02-15 22:18:29'),(11521,426,2,9247,'4.99','2005-07-30 14:13:56','2006-02-15 22:18:29'),(11522,426,2,10172,'10.99','2005-07-31 23:29:51','2006-02-15 22:18:29'),(11523,426,1,10505,'1.99','2005-08-01 11:13:59','2006-02-15 22:18:29'),(11524,426,2,11237,'0.99','2005-08-02 13:24:01','2006-02-15 22:18:29'),(11525,426,2,11876,'0.99','2005-08-17 14:18:21','2006-02-15 22:18:29'),(11526,426,2,11938,'6.99','2005-08-17 16:54:54','2006-02-15 22:18:29'),(11527,426,2,12548,'5.99','2005-08-18 14:35:26','2006-02-15 22:18:29'),(11528,426,2,12707,'4.99','2005-08-18 20:52:02','2006-02-15 22:18:29'),(11529,426,1,12822,'4.99','2005-08-19 01:15:24','2006-02-15 22:18:29'),(11530,426,2,13834,'2.99','2005-08-20 14:03:08','2006-02-15 22:18:29'),(11531,426,2,14151,'6.99','2005-08-21 02:23:25','2006-02-15 22:18:29'),(11532,426,2,14826,'2.99','2005-08-22 01:32:14','2006-02-15 22:18:29'),(11533,427,2,82,'6.99','2005-05-25 12:17:46','2006-02-15 22:18:29'),(11534,427,1,1342,'5.99','2005-06-15 12:26:21','2006-02-15 22:18:29'),(11535,427,2,1628,'3.99','2005-06-16 07:52:55','2006-02-15 22:18:30'),(11536,427,1,1648,'5.99','2005-06-16 09:17:07','2006-02-15 22:18:30'),(11537,427,1,1857,'1.99','2005-06-17 01:12:58','2006-02-15 22:18:30'),(11538,427,2,2466,'0.99','2005-06-18 20:18:42','2006-02-15 22:18:30'),(11539,427,1,4793,'3.99','2005-07-08 16:30:01','2006-02-15 22:18:30'),(11540,427,2,5476,'2.99','2005-07-09 23:37:09','2006-02-15 22:18:30'),(11541,427,2,5586,'5.99','2005-07-10 04:17:06','2006-02-15 22:18:30'),(11542,427,1,6423,'6.99','2005-07-11 23:47:31','2006-02-15 22:18:30'),(11543,427,1,6509,'2.99','2005-07-12 03:35:01','2006-02-15 22:18:30'),(11544,427,2,6938,'7.99','2005-07-26 23:16:04','2006-02-15 22:18:30'),(11545,427,2,8182,'3.99','2005-07-28 22:19:12','2006-02-15 22:18:30'),(11546,427,1,8531,'5.99','2005-07-29 10:26:15','2006-02-15 22:18:30'),(11547,427,2,8658,'5.99','2005-07-29 15:16:37','2006-02-15 22:18:30'),(11548,427,2,9978,'2.99','2005-07-31 16:59:51','2006-02-15 22:18:30'),(11549,427,1,10417,'4.99','2005-08-01 08:10:36','2006-02-15 22:18:30'),(11550,427,1,10464,'5.99','2005-08-01 09:43:14','2006-02-15 22:18:30'),(11551,427,2,10560,'4.99','2005-08-01 13:04:57','2006-02-15 22:18:30'),(11552,427,1,11024,'5.99','2005-08-02 05:38:31','2006-02-15 22:18:30'),(11553,427,1,13720,'1.99','2005-08-20 10:01:39','2006-02-15 22:18:30'),(11554,427,2,14201,'6.99','2005-08-21 03:51:34','2006-02-15 22:18:31'),(11555,427,1,14287,'3.99','2005-08-21 06:53:59','2006-02-15 22:18:31'),(11556,427,1,15330,'3.99','2005-08-22 20:35:30','2006-02-15 22:18:31'),(11557,428,2,634,'4.99','2005-05-28 17:40:35','2006-02-15 22:18:31'),(11558,428,1,1227,'3.99','2005-06-15 03:50:03','2006-02-15 22:18:31'),(11559,428,2,1471,'2.99','2005-06-15 20:53:26','2006-02-15 22:18:31'),(11560,428,1,1601,'3.99','2005-06-16 06:11:13','2006-02-15 22:18:31'),(11561,428,1,2677,'2.99','2005-06-19 12:01:59','2006-02-15 22:18:31'),(11562,428,2,3377,'0.99','2005-06-21 13:51:12','2006-02-15 22:18:31'),(11563,428,1,3702,'2.99','2005-07-06 10:13:56','2006-02-15 22:18:31'),(11564,428,1,3925,'5.99','2005-07-06 20:41:44','2006-02-15 22:18:31'),(11565,428,1,4151,'0.99','2005-07-07 08:49:02','2006-02-15 22:18:31'),(11566,428,1,5373,'4.99','2005-07-09 18:48:57','2006-02-15 22:18:31'),(11567,428,1,6735,'5.99','2005-07-12 14:08:20','2006-02-15 22:18:31'),(11568,428,1,7823,'6.99','2005-07-28 08:32:53','2006-02-15 22:18:31'),(11569,428,1,8155,'2.99','2005-07-28 20:57:06','2006-02-15 22:18:31'),(11570,428,2,8387,'4.99','2005-07-29 05:47:27','2006-02-15 22:18:31'),(11571,428,2,8528,'4.99','2005-07-29 10:24:22','2006-02-15 22:18:31'),(11572,428,1,9904,'5.99','2005-07-31 14:34:17','2006-02-15 22:18:31'),(11573,428,2,9982,'2.99','2005-07-31 17:09:02','2006-02-15 22:18:32'),(11574,428,2,10577,'4.99','2005-08-01 13:46:38','2006-02-15 22:18:32'),(11575,428,2,10888,'2.99','2005-08-02 00:52:45','2006-02-15 22:18:32'),(11576,428,2,11536,'0.99','2005-08-17 00:40:03','2006-02-15 22:18:32'),(11577,429,2,150,'5.99','2005-05-26 00:28:39','2006-02-15 22:18:32'),(11578,429,2,290,'2.99','2005-05-26 20:08:33','2006-02-15 22:18:32'),(11579,429,2,601,'7.99','2005-05-28 14:08:22','2006-02-15 22:18:32'),(11580,429,2,799,'4.99','2005-05-29 17:24:48','2006-02-15 22:18:32'),(11581,429,2,844,'4.99','2005-05-30 00:58:20','2006-02-15 22:18:32'),(11582,429,2,1781,'5.99','2005-06-16 19:20:24','2006-02-15 22:18:32'),(11583,429,2,1798,'2.99','2005-06-16 20:16:15','2006-02-15 22:18:32'),(11584,429,2,1916,'7.99','2005-06-17 05:29:59','2006-02-15 22:18:32'),(11585,429,1,3409,'2.99','2005-06-21 16:17:38','2006-02-15 22:18:32'),(11586,429,2,5868,'4.99','2005-07-10 18:39:16','2006-02-15 22:18:32'),(11587,429,2,6196,'7.99','2005-07-11 12:05:46','2006-02-15 22:18:32'),(11588,429,2,6886,'6.99','2005-07-12 20:58:04','2006-02-15 22:18:32'),(11589,429,1,6977,'6.99','2005-07-27 00:40:50','2006-02-15 22:18:32'),(11590,429,2,7352,'4.99','2005-07-27 14:38:29','2006-02-15 22:18:32'),(11591,429,2,8136,'1.99','2005-07-28 20:05:48','2006-02-15 22:18:33'),(11592,429,2,8143,'2.99','2005-07-28 20:23:11','2006-02-15 22:18:33'),(11593,429,2,8175,'7.99','2005-07-28 21:38:16','2006-02-15 22:18:33'),(11594,429,1,9849,'0.99','2005-07-31 12:44:34','2006-02-15 22:18:33'),(11595,429,1,12259,'2.99','2005-08-18 04:14:35','2006-02-15 22:18:33'),(11596,429,1,12953,'4.99','2005-08-19 06:04:07','2006-02-15 22:18:33'),(11597,429,2,14495,'4.99','2005-08-21 14:04:39','2006-02-15 22:18:33'),(11598,430,2,30,'2.99','2005-05-25 04:01:32','2006-02-15 22:18:33'),(11599,430,1,364,'4.99','2005-05-27 07:20:12','2006-02-15 22:18:33'),(11600,430,2,1207,'0.99','2005-06-15 02:27:08','2006-02-15 22:18:33'),(11601,430,1,1274,'2.99','2005-06-15 07:52:52','2006-02-15 22:18:33'),(11602,430,1,1538,'2.99','2005-06-16 01:05:50','2006-02-15 22:18:33'),(11603,430,1,1759,'6.99','2005-06-16 17:46:37','2006-02-15 22:18:33'),(11604,430,2,2892,'0.99','2005-06-20 02:06:39','2006-02-15 22:18:33'),(11605,430,2,3153,'0.99','2005-06-20 20:44:15','2006-02-15 22:18:33'),(11606,430,1,5002,'4.99','2005-07-09 01:17:08','2006-02-15 22:18:33'),(11607,430,1,5217,'5.99','2005-07-09 11:56:50','2006-02-15 22:18:33'),(11608,430,2,5879,'6.99','2005-07-10 19:12:47','2006-02-15 22:18:33'),(11609,430,1,5958,'6.99','2005-07-10 23:31:51','2006-02-15 22:18:33'),(11610,430,2,6043,'0.99','2005-07-11 03:18:10','2006-02-15 22:18:34'),(11611,430,1,8560,'4.99','2005-07-29 11:27:27','2006-02-15 22:18:34'),(11612,430,2,9450,'2.99','2005-07-30 22:04:04','2006-02-15 22:18:34'),(11613,430,1,12723,'0.99','2005-08-18 21:34:16','2006-02-15 22:18:34'),(11614,430,1,12965,'4.99','2005-08-19 06:33:00','2006-02-15 22:18:34'),(11615,430,1,13007,'0.99','2005-08-19 07:47:43','2006-02-15 22:18:34'),(11616,430,2,13452,'0.99','2005-08-20 00:20:07','2006-02-15 22:18:34'),(11617,430,2,13454,'2.99','2005-08-20 00:30:52','2006-02-15 22:18:34'),(11618,430,1,14058,'5.99','2005-08-20 22:24:35','2006-02-15 22:18:34'),(11619,430,1,15031,'4.99','2005-08-22 09:11:48','2006-02-15 22:18:34'),(11620,431,2,1126,'2.99','2005-05-31 17:27:45','2006-02-15 22:18:34'),(11621,431,2,1561,'2.99','2005-06-16 02:41:30','2006-02-15 22:18:34'),(11622,431,1,2096,'4.99','2005-06-17 18:33:04','2006-02-15 22:18:34'),(11623,431,1,2269,'3.99','2005-06-18 06:20:54','2006-02-15 22:18:34'),(11624,431,2,2281,'4.99','2005-06-18 06:47:29','2006-02-15 22:18:34'),(11625,431,2,2761,'2.99','2005-06-19 17:22:17','2006-02-15 22:18:34'),(11626,431,2,3304,'6.99','2005-06-21 07:43:40','2006-02-15 22:18:34'),(11627,431,2,3369,'8.99','2005-06-21 13:20:31','2006-02-15 22:18:34'),(11628,431,1,4144,'3.99','2005-07-07 08:25:44','2006-02-15 22:18:35'),(11629,431,1,4801,'2.99','2005-07-08 16:51:36','2006-02-15 22:18:35'),(11630,431,1,4863,'0.99','2005-07-08 19:03:15','2006-02-15 22:18:35'),(11631,431,2,7978,'4.99','2005-07-28 14:16:14','2006-02-15 22:18:35'),(11632,431,2,8810,'4.99','2005-07-29 21:45:19','2006-02-15 22:18:35'),(11633,431,2,10508,'0.99','2005-08-01 11:23:27','2006-02-15 22:18:35'),(11634,431,1,10527,'4.99','2005-08-01 11:55:54','2006-02-15 22:18:35'),(11635,431,2,10959,'6.99','2005-08-02 03:39:39','2006-02-15 22:18:35'),(11636,431,2,11538,'2.99','2005-08-17 00:44:04','2006-02-15 22:18:35'),(11637,431,1,12273,'6.99','2005-08-18 04:40:50','2006-02-15 22:18:35'),(11638,431,2,13153,'1.99','2005-08-19 13:09:47','2006-02-15 22:18:35'),(11639,431,1,13784,'4.99','2005-08-20 12:11:28','2006-02-15 22:18:35'),(11640,431,1,15809,'2.99','2005-08-23 14:42:07','2006-02-15 22:18:35'),(11641,431,1,15960,'2.99','2005-08-23 19:35:42','2006-02-15 22:18:35'),(11642,431,2,13587,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:35'),(11643,432,2,326,'7.99','2005-05-27 01:10:11','2006-02-15 22:18:35'),(11644,432,1,550,'5.99','2005-05-28 07:39:16','2006-02-15 22:18:35'),(11645,432,1,897,'8.99','2005-05-30 09:10:01','2006-02-15 22:18:35'),(11646,432,2,1180,'5.99','2005-06-15 00:39:01','2006-02-15 22:18:35'),(11647,432,2,1597,'2.99','2005-06-16 05:47:03','2006-02-15 22:18:36'),(11648,432,2,3194,'4.99','2005-06-20 23:59:57','2006-02-15 22:18:36'),(11649,432,1,4965,'5.99','2005-07-08 23:46:57','2006-02-15 22:18:36'),(11650,432,1,4973,'4.99','2005-07-08 23:58:18','2006-02-15 22:18:36'),(11651,432,1,5204,'2.99','2005-07-09 10:54:14','2006-02-15 22:18:36'),(11652,432,1,5322,'6.99','2005-07-09 16:28:13','2006-02-15 22:18:36'),(11653,432,1,5944,'4.99','2005-07-10 22:51:44','2006-02-15 22:18:36'),(11654,432,1,5990,'4.99','2005-07-11 01:03:14','2006-02-15 22:18:36'),(11655,432,2,7326,'4.99','2005-07-27 13:50:40','2006-02-15 22:18:36'),(11656,432,2,7681,'0.99','2005-07-28 03:07:09','2006-02-15 22:18:36'),(11657,432,2,8079,'4.99','2005-07-28 17:58:36','2006-02-15 22:18:36'),(11658,432,2,8094,'6.99','2005-07-28 18:30:28','2006-02-15 22:18:36'),(11659,432,2,9916,'4.99','2005-07-31 14:54:52','2006-02-15 22:18:36'),(11660,432,2,9984,'2.99','2005-07-31 17:12:23','2006-02-15 22:18:36'),(11661,432,2,11870,'0.99','2005-08-17 14:11:28','2006-02-15 22:18:36'),(11662,432,1,12767,'6.99','2005-08-18 23:25:49','2006-02-15 22:18:36'),(11663,432,1,14027,'2.99','2005-08-20 21:21:34','2006-02-15 22:18:36'),(11664,432,1,15523,'4.99','2005-08-23 03:32:36','2006-02-15 22:18:36'),(11665,432,1,15713,'6.99','2005-08-23 10:56:15','2006-02-15 22:18:36'),(11666,433,2,146,'8.99','2005-05-26 00:07:11','2006-02-15 22:18:37'),(11667,433,1,691,'10.99','2005-05-29 01:01:26','2006-02-15 22:18:37'),(11668,433,2,4087,'6.99','2005-07-07 05:30:56','2006-02-15 22:18:37'),(11669,433,2,4158,'0.99','2005-07-07 09:05:42','2006-02-15 22:18:37'),(11670,433,2,4988,'7.99','2005-07-09 00:46:14','2006-02-15 22:18:37'),(11671,433,2,5457,'0.99','2005-07-09 22:33:14','2006-02-15 22:18:37'),(11672,433,1,5969,'8.99','2005-07-11 00:03:22','2006-02-15 22:18:37'),(11673,433,1,6765,'5.99','2005-07-12 15:30:47','2006-02-15 22:18:37'),(11674,433,1,6848,'0.99','2005-07-12 19:24:07','2006-02-15 22:18:37'),(11675,433,1,6850,'4.99','2005-07-12 19:30:42','2006-02-15 22:18:37'),(11676,433,1,7821,'4.99','2005-07-28 08:31:23','2006-02-15 22:18:37'),(11677,433,2,7907,'4.99','2005-07-28 11:32:00','2006-02-15 22:18:37'),(11678,433,1,8414,'5.99','2005-07-29 06:48:35','2006-02-15 22:18:37'),(11679,433,1,8713,'2.99','2005-07-29 17:31:19','2006-02-15 22:18:37'),(11680,433,2,9161,'4.99','2005-07-30 11:19:18','2006-02-15 22:18:37'),(11681,433,1,9294,'3.99','2005-07-30 16:14:37','2006-02-15 22:18:37'),(11682,433,1,10663,'4.99','2005-08-01 16:51:08','2006-02-15 22:18:37'),(11683,433,1,11664,'2.99','2005-08-17 05:35:52','2006-02-15 22:18:37'),(11684,433,2,12669,'6.99','2005-08-18 19:17:47','2006-02-15 22:18:38'),(11685,433,2,13273,'4.99','2005-08-19 17:49:13','2006-02-15 22:18:38'),(11686,433,1,13801,'4.99','2005-08-20 12:40:53','2006-02-15 22:18:38'),(11687,433,2,14523,'4.99','2005-08-21 15:03:45','2006-02-15 22:18:38'),(11688,433,1,14559,'6.99','2005-08-21 16:11:35','2006-02-15 22:18:38'),(11689,433,2,15476,'4.99','2005-08-23 01:45:07','2006-02-15 22:18:38'),(11690,433,1,15502,'5.99','2005-08-23 02:40:04','2006-02-15 22:18:38'),(11691,434,2,508,'5.99','2005-05-28 02:40:50','2006-02-15 22:18:38'),(11692,434,1,1225,'0.99','2005-06-15 03:45:35','2006-02-15 22:18:38'),(11693,434,2,1584,'5.99','2005-06-16 04:50:50','2006-02-15 22:18:38'),(11694,434,2,2415,'7.99','2005-06-18 17:02:42','2006-02-15 22:18:38'),(11695,434,1,2430,'3.99','2005-06-18 17:51:46','2006-02-15 22:18:38'),(11696,434,1,2494,'3.99','2005-06-18 22:15:09','2006-02-15 22:18:38'),(11697,434,1,3014,'2.99','2005-06-20 10:45:20','2006-02-15 22:18:38'),(11698,434,2,3037,'2.99','2005-06-20 12:28:03','2006-02-15 22:18:38'),(11699,434,1,4414,'2.99','2005-07-07 22:00:21','2006-02-15 22:18:38'),(11700,434,2,4654,'6.99','2005-07-08 09:48:03','2006-02-15 22:18:38'),(11701,434,2,4960,'10.99','2005-07-08 23:27:16','2006-02-15 22:18:38'),(11702,434,2,5464,'2.99','2005-07-09 22:58:14','2006-02-15 22:18:39'),(11703,434,2,6972,'0.99','2005-07-27 00:31:25','2006-02-15 22:18:39'),(11704,434,1,7260,'6.99','2005-07-27 11:09:28','2006-02-15 22:18:39'),(11705,434,2,7479,'2.99','2005-07-27 19:18:17','2006-02-15 22:18:39'),(11706,434,1,8205,'0.99','2005-07-28 23:18:48','2006-02-15 22:18:39'),(11707,434,1,9350,'4.99','2005-07-30 18:24:30','2006-02-15 22:18:39'),(11708,434,1,11242,'3.99','2005-08-02 13:32:00','2006-02-15 22:18:39'),(11709,434,1,11867,'2.99','2005-08-17 14:04:28','2006-02-15 22:18:39'),(11710,434,2,12030,'2.99','2005-08-17 20:10:48','2006-02-15 22:18:39'),(11711,434,2,12146,'2.99','2005-08-18 00:10:04','2006-02-15 22:18:39'),(11712,434,2,12624,'7.99','2005-08-18 17:35:00','2006-02-15 22:18:39'),(11713,434,2,13359,'9.99','2005-08-19 21:04:49','2006-02-15 22:18:39'),(11714,434,1,13383,'7.99','2005-08-19 21:38:44','2006-02-15 22:18:39'),(11715,434,2,14553,'4.99','2005-08-21 15:59:40','2006-02-15 22:18:39'),(11716,434,2,15016,'3.99','2005-08-22 08:47:35','2006-02-15 22:18:39'),(11717,434,2,15385,'4.99','2005-08-22 22:37:34','2006-02-15 22:18:39'),(11718,435,1,757,'7.99','2005-05-29 10:29:47','2006-02-15 22:18:39'),(11719,435,1,806,'4.99','2005-05-29 18:31:30','2006-02-15 22:18:39'),(11720,435,2,1443,'0.99','2005-06-15 18:57:51','2006-02-15 22:18:39'),(11721,435,1,2984,'0.99','2005-06-20 08:43:44','2006-02-15 22:18:40'),(11722,435,1,3690,'0.99','2005-07-06 09:46:03','2006-02-15 22:18:40'),(11723,435,1,3918,'8.99','2005-07-06 20:26:15','2006-02-15 22:18:40'),(11724,435,2,5220,'4.99','2005-07-09 11:59:04','2006-02-15 22:18:40'),(11725,435,2,6051,'4.99','2005-07-11 03:46:41','2006-02-15 22:18:40'),(11726,435,1,6935,'2.99','2005-07-26 23:13:10','2006-02-15 22:18:40'),(11727,435,1,8386,'5.99','2005-07-29 05:45:30','2006-02-15 22:18:40'),(11728,435,2,8891,'4.99','2005-07-30 00:46:55','2006-02-15 22:18:40'),(11729,435,2,9269,'0.99','2005-07-30 15:02:33','2006-02-15 22:18:40'),(11730,435,1,9655,'3.99','2005-07-31 05:57:54','2006-02-15 22:18:40'),(11731,435,2,9829,'4.99','2005-07-31 11:58:38','2006-02-15 22:18:40'),(11732,435,1,10998,'6.99','2005-08-02 04:50:55','2006-02-15 22:18:40'),(11733,435,1,11041,'2.99','2005-08-02 06:03:53','2006-02-15 22:18:40'),(11734,435,1,11786,'3.99','2005-08-17 10:57:40','2006-02-15 22:18:40'),(11735,435,1,11796,'0.99','2005-08-17 11:16:47','2006-02-15 22:18:40'),(11736,435,2,12046,'0.99','2005-08-17 20:47:46','2006-02-15 22:18:40'),(11737,435,1,12741,'4.99','2005-08-18 22:17:05','2006-02-15 22:18:40'),(11738,435,2,13208,'0.99','2005-08-19 15:18:55','2006-02-15 22:18:40'),(11739,435,1,14696,'4.99','2005-08-21 20:48:05','2006-02-15 22:18:41'),(11740,435,1,14765,'1.99','2005-08-21 23:40:28','2006-02-15 22:18:41'),(11741,435,1,14850,'0.99','2005-08-22 02:16:55','2006-02-15 22:18:41'),(11742,435,1,15136,'2.99','2005-08-22 13:19:25','2006-02-15 22:18:41'),(11743,436,1,45,'7.99','2005-05-25 05:59:39','2006-02-15 22:18:41'),(11744,436,1,256,'3.99','2005-05-26 15:20:58','2006-02-15 22:18:41'),(11745,436,1,848,'5.99','2005-05-30 01:19:53','2006-02-15 22:18:41'),(11746,436,1,2291,'9.99','2005-06-18 07:36:46','2006-02-15 22:18:41'),(11747,436,2,3851,'1.99','2005-07-06 16:54:12','2006-02-15 22:18:41'),(11748,436,2,3944,'2.99','2005-07-06 21:34:11','2006-02-15 22:18:41'),(11749,436,2,4643,'0.99','2005-07-08 09:13:56','2006-02-15 22:18:41'),(11750,436,2,4751,'2.99','2005-07-08 14:07:52','2006-02-15 22:18:41'),(11751,436,1,4782,'4.99','2005-07-08 16:08:51','2006-02-15 22:18:41'),(11752,436,1,5959,'0.99','2005-07-10 23:35:36','2006-02-15 22:18:41'),(11753,436,1,7593,'4.99','2005-07-27 23:28:47','2006-02-15 22:18:41'),(11754,436,2,8027,'5.99','2005-07-28 16:09:57','2006-02-15 22:18:41'),(11755,436,2,8097,'9.99','2005-07-28 18:32:49','2006-02-15 22:18:41'),(11756,436,1,9345,'9.99','2005-07-30 18:13:51','2006-02-15 22:18:41'),(11757,436,1,9539,'0.99','2005-07-31 01:36:19','2006-02-15 22:18:42'),(11758,436,1,9638,'5.99','2005-07-31 05:30:27','2006-02-15 22:18:42'),(11759,436,2,10216,'3.99','2005-08-01 01:06:27','2006-02-15 22:18:42'),(11760,436,2,11160,'0.99','2005-08-02 10:05:30','2006-02-15 22:18:42'),(11761,436,1,11580,'2.99','2005-08-17 01:59:07','2006-02-15 22:18:42'),(11762,436,2,11615,'4.99','2005-08-17 03:54:35','2006-02-15 22:18:42'),(11763,436,2,11896,'5.99','2005-08-17 15:19:54','2006-02-15 22:18:42'),(11764,436,2,12297,'0.99','2005-08-18 05:19:57','2006-02-15 22:18:42'),(11765,436,2,12429,'6.99','2005-08-18 10:26:46','2006-02-15 22:18:42'),(11766,436,2,13099,'9.99','2005-08-19 10:55:19','2006-02-15 22:18:42'),(11767,436,2,13382,'7.99','2005-08-19 21:38:41','2006-02-15 22:18:42'),(11768,436,1,13533,'3.99','2005-08-20 03:30:00','2006-02-15 22:18:42'),(11769,436,1,13760,'5.99','2005-08-20 11:26:33','2006-02-15 22:18:42'),(11770,436,1,13814,'0.99','2005-08-20 13:07:23','2006-02-15 22:18:42'),(11771,436,2,13826,'2.99','2005-08-20 13:46:38','2006-02-15 22:18:42'),(11772,436,2,15766,'4.99','2005-08-23 13:10:16','2006-02-15 22:18:42'),(11773,437,1,192,'2.99','2005-05-26 06:20:37','2006-02-15 22:18:42'),(11774,437,2,656,'4.99','2005-05-28 20:18:24','2006-02-15 22:18:42'),(11775,437,1,666,'5.99','2005-05-28 21:48:51','2006-02-15 22:18:42'),(11776,437,2,2239,'5.99','2005-06-18 04:23:54','2006-02-15 22:18:43'),(11777,437,1,2792,'2.99','2005-06-19 18:52:25','2006-02-15 22:18:43'),(11778,437,2,3265,'2.99','2005-06-21 04:23:13','2006-02-15 22:18:43'),(11779,437,1,3747,'4.99','2005-07-06 12:11:14','2006-02-15 22:18:43'),(11780,437,2,4765,'4.99','2005-07-08 15:08:45','2006-02-15 22:18:43'),(11781,437,2,5085,'4.99','2005-07-09 05:36:49','2006-02-15 22:18:43'),(11782,437,1,5167,'1.99','2005-07-09 09:18:43','2006-02-15 22:18:43'),(11783,437,2,5744,'2.99','2005-07-10 12:08:33','2006-02-15 22:18:43'),(11784,437,2,5864,'6.99','2005-07-10 18:29:57','2006-02-15 22:18:43'),(11785,437,2,8215,'2.99','2005-07-28 23:43:56','2006-02-15 22:18:43'),(11786,437,2,9172,'2.99','2005-07-30 11:36:38','2006-02-15 22:18:43'),(11787,437,2,9333,'2.99','2005-07-30 17:53:45','2006-02-15 22:18:43'),(11788,437,2,10009,'8.99','2005-07-31 18:00:28','2006-02-15 22:18:43'),(11789,437,2,10249,'0.99','2005-08-01 02:35:39','2006-02-15 22:18:43'),(11790,437,2,11417,'3.99','2005-08-02 19:44:46','2006-02-15 22:18:43'),(11791,437,1,12205,'8.99','2005-08-18 02:21:08','2006-02-15 22:18:43'),(11792,437,2,13838,'7.99','2005-08-20 14:22:46','2006-02-15 22:18:43'),(11793,437,1,13839,'2.99','2005-08-20 14:23:16','2006-02-15 22:18:43'),(11794,437,1,13905,'1.99','2005-08-20 16:12:48','2006-02-15 22:18:44'),(11795,437,1,14993,'1.99','2005-08-22 07:52:18','2006-02-15 22:18:44'),(11796,438,2,23,'4.99','2005-05-25 02:40:21','2006-02-15 22:18:44'),(11797,438,2,1036,'0.99','2005-05-31 05:21:10','2006-02-15 22:18:44'),(11798,438,1,1138,'6.99','2005-05-31 19:30:27','2006-02-15 22:18:44'),(11799,438,1,1431,'4.99','2005-06-15 18:26:29','2006-02-15 22:18:44'),(11800,438,2,1779,'0.99','2005-06-16 18:55:11','2006-02-15 22:18:44'),(11801,438,2,2206,'0.99','2005-06-18 02:14:45','2006-02-15 22:18:44'),(11802,438,1,2591,'4.99','2005-06-19 05:32:22','2006-02-15 22:18:44'),(11803,438,1,3315,'4.99','2005-06-21 08:17:04','2006-02-15 22:18:44'),(11804,438,2,3368,'0.99','2005-06-21 13:18:38','2006-02-15 22:18:44'),(11805,438,1,4355,'4.99','2005-07-07 19:21:19','2006-02-15 22:18:44'),(11806,438,2,4446,'2.99','2005-07-07 23:12:16','2006-02-15 22:18:44'),(11807,438,2,5316,'4.99','2005-07-09 16:09:42','2006-02-15 22:18:44'),(11808,438,2,5426,'4.99','2005-07-09 21:04:47','2006-02-15 22:18:44'),(11809,438,1,5870,'2.99','2005-07-10 18:40:25','2006-02-15 22:18:44'),(11810,438,2,6138,'4.99','2005-07-11 08:36:04','2006-02-15 22:18:44'),(11811,438,1,6563,'3.99','2005-07-12 05:34:09','2006-02-15 22:18:44'),(11812,438,2,6615,'4.99','2005-07-12 08:36:22','2006-02-15 22:18:45'),(11813,438,2,7357,'1.99','2005-07-27 14:48:31','2006-02-15 22:18:45'),(11814,438,2,7374,'8.99','2005-07-27 15:20:57','2006-02-15 22:18:45'),(11815,438,1,7598,'0.99','2005-07-27 23:36:01','2006-02-15 22:18:45'),(11816,438,2,8547,'2.99','2005-07-29 11:10:15','2006-02-15 22:18:45'),(11817,438,1,9082,'3.99','2005-07-30 08:11:22','2006-02-15 22:18:45'),(11818,438,2,9782,'0.99','2005-07-31 10:14:26','2006-02-15 22:18:45'),(11819,438,1,10512,'6.99','2005-08-01 11:36:19','2006-02-15 22:18:45'),(11820,438,1,10607,'4.99','2005-08-01 14:44:43','2006-02-15 22:18:45'),(11821,438,2,11644,'4.99','2005-08-17 04:49:46','2006-02-15 22:18:45'),(11822,438,2,11933,'4.99','2005-08-17 16:38:20','2006-02-15 22:18:45'),(11823,438,2,12654,'0.99','2005-08-18 18:56:40','2006-02-15 22:18:45'),(11824,438,2,13319,'7.99','2005-08-19 19:35:13','2006-02-15 22:18:45'),(11825,438,1,13414,'4.99','2005-08-19 22:47:34','2006-02-15 22:18:45'),(11826,438,2,14582,'5.99','2005-08-21 17:08:33','2006-02-15 22:18:45'),(11827,438,2,15893,'5.99','2005-08-23 17:02:00','2006-02-15 22:18:45'),(11828,438,2,12524,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:45'),(11829,439,1,126,'2.99','2005-05-25 21:07:59','2006-02-15 22:18:45'),(11830,439,2,367,'0.99','2005-05-27 07:37:02','2006-02-15 22:18:46'),(11831,439,1,786,'9.99','2005-05-29 15:17:28','2006-02-15 22:18:46'),(11832,439,1,1264,'4.99','2005-06-15 06:59:39','2006-02-15 22:18:46'),(11833,439,2,1557,'0.99','2005-06-16 02:28:35','2006-02-15 22:18:46'),(11834,439,2,2097,'4.99','2005-06-17 18:40:04','2006-02-15 22:18:46'),(11835,439,1,2621,'2.99','2005-06-19 08:07:31','2006-02-15 22:18:46'),(11836,439,1,2992,'2.99','2005-06-20 09:11:51','2006-02-15 22:18:46'),(11837,439,1,3294,'6.99','2005-06-21 07:03:23','2006-02-15 22:18:46'),(11838,439,2,3774,'5.99','2005-07-06 13:25:07','2006-02-15 22:18:46'),(11839,439,1,4528,'2.99','2005-07-08 03:24:54','2006-02-15 22:18:46'),(11840,439,1,4813,'4.99','2005-07-08 17:09:56','2006-02-15 22:18:46'),(11841,439,2,5801,'5.99','2005-07-10 14:59:05','2006-02-15 22:18:46'),(11842,439,1,5893,'2.99','2005-07-10 20:05:30','2006-02-15 22:18:46'),(11843,439,1,6577,'2.99','2005-07-12 06:15:05','2006-02-15 22:18:46'),(11844,439,2,6672,'2.99','2005-07-12 11:49:16','2006-02-15 22:18:46'),(11845,439,1,8343,'2.99','2005-07-29 04:45:16','2006-02-15 22:18:46'),(11846,439,1,8624,'2.99','2005-07-29 13:55:36','2006-02-15 22:18:46'),(11847,439,2,8703,'2.99','2005-07-29 17:12:44','2006-02-15 22:18:46'),(11848,439,1,9275,'0.99','2005-07-30 15:09:15','2006-02-15 22:18:46'),(11849,439,1,9322,'6.99','2005-07-30 17:21:39','2006-02-15 22:18:47'),(11850,439,2,10744,'1.99','2005-08-01 19:56:49','2006-02-15 22:18:47'),(11851,439,1,10905,'2.99','2005-08-02 01:45:59','2006-02-15 22:18:47'),(11852,439,2,11042,'6.99','2005-08-02 06:04:33','2006-02-15 22:18:47'),(11853,439,2,11544,'5.99','2005-08-17 00:55:07','2006-02-15 22:18:47'),(11854,439,1,11989,'2.99','2005-08-17 18:23:58','2006-02-15 22:18:47'),(11855,439,1,12621,'2.99','2005-08-18 17:31:36','2006-02-15 22:18:47'),(11856,439,2,12755,'5.99','2005-08-18 22:38:47','2006-02-15 22:18:47'),(11857,439,2,12826,'3.99','2005-08-19 01:25:11','2006-02-15 22:18:47'),(11858,439,2,13358,'4.99','2005-08-19 21:04:20','2006-02-15 22:18:47'),(11859,439,2,14730,'5.99','2005-08-21 22:21:11','2006-02-15 22:18:47'),(11860,439,2,15044,'9.99','2005-08-22 09:51:54','2006-02-15 22:18:47'),(11861,439,2,15162,'4.99','2005-08-22 14:41:05','2006-02-15 22:18:47'),(11862,439,2,15653,'4.99','2005-08-23 08:34:42','2006-02-15 22:18:47'),(11863,439,1,15818,'1.99','2005-08-23 14:59:58','2006-02-15 22:18:47'),(11864,439,1,16018,'0.99','2005-08-23 21:27:35','2006-02-15 22:18:47'),(11865,440,2,957,'4.99','2005-05-30 17:53:29','2006-02-15 22:18:47'),(11866,440,1,4301,'2.99','2005-07-07 16:37:23','2006-02-15 22:18:47'),(11867,440,1,4946,'7.99','2005-07-08 22:46:23','2006-02-15 22:18:48'),(11868,440,2,5423,'2.99','2005-07-09 20:56:48','2006-02-15 22:18:48'),(11869,440,2,5594,'0.99','2005-07-10 04:33:36','2006-02-15 22:18:48'),(11870,440,2,5731,'2.99','2005-07-10 11:31:52','2006-02-15 22:18:48'),(11871,440,2,5782,'0.99','2005-07-10 13:52:56','2006-02-15 22:18:48'),(11872,440,2,7585,'4.99','2005-07-27 23:18:22','2006-02-15 22:18:48'),(11873,440,1,7614,'0.99','2005-07-28 00:14:38','2006-02-15 22:18:48'),(11874,440,1,7806,'9.99','2005-07-28 07:58:17','2006-02-15 22:18:48'),(11875,440,1,9001,'4.99','2005-07-30 04:59:41','2006-02-15 22:18:48'),(11876,440,1,9195,'2.99','2005-07-30 12:29:43','2006-02-15 22:18:48'),(11877,440,1,9547,'4.99','2005-07-31 01:52:34','2006-02-15 22:18:48'),(11878,440,2,12403,'6.99','2005-08-18 09:31:05','2006-02-15 22:18:48'),(11879,440,1,12850,'0.99','2005-08-19 02:08:06','2006-02-15 22:18:48'),(11880,440,2,13384,'4.99','2005-08-19 21:38:51','2006-02-15 22:18:48'),(11881,440,2,13779,'2.99','2005-08-20 12:03:54','2006-02-15 22:18:48'),(11882,440,1,14555,'0.99','2005-08-21 16:03:02','2006-02-15 22:18:48'),(11883,440,2,14863,'7.99','2005-08-22 02:57:04','2006-02-15 22:18:48'),(11884,440,2,15264,'0.99','2005-08-22 18:27:38','2006-02-15 22:18:48'),(11885,440,1,15925,'4.99','2005-08-23 18:15:06','2006-02-15 22:18:49'),(11886,440,1,13106,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:49'),(11887,441,1,823,'4.99','2005-05-29 21:39:37','2006-02-15 22:18:49'),(11888,441,1,1602,'4.99','2005-06-16 06:12:40','2006-02-15 22:18:49'),(11889,441,2,2328,'4.99','2005-06-18 10:17:21','2006-02-15 22:18:49'),(11890,441,2,3629,'0.99','2005-07-06 06:23:22','2006-02-15 22:18:49'),(11891,441,2,3695,'2.99','2005-07-06 10:02:08','2006-02-15 22:18:49'),(11892,441,1,4084,'8.99','2005-07-07 05:16:00','2006-02-15 22:18:49'),(11893,441,2,4208,'0.99','2005-07-07 11:34:22','2006-02-15 22:18:49'),(11894,441,2,5129,'2.99','2005-07-09 07:28:33','2006-02-15 22:18:49'),(11895,441,1,5811,'0.99','2005-07-10 15:27:04','2006-02-15 22:18:49'),(11896,441,2,6636,'2.99','2005-07-12 09:49:46','2006-02-15 22:18:49'),(11897,441,1,6642,'4.99','2005-07-12 10:37:52','2006-02-15 22:18:49'),(11898,441,1,6941,'5.99','2005-07-26 23:18:49','2006-02-15 22:18:49'),(11899,441,2,8237,'2.99','2005-07-29 00:29:56','2006-02-15 22:18:49'),(11900,441,1,8281,'0.99','2005-07-29 01:46:00','2006-02-15 22:18:49'),(11901,441,1,8427,'4.99','2005-07-29 07:08:36','2006-02-15 22:18:49'),(11902,441,1,8575,'4.99','2005-07-29 11:52:47','2006-02-15 22:18:49'),(11903,441,2,8617,'4.99','2005-07-29 13:46:14','2006-02-15 22:18:49'),(11904,441,2,9644,'10.99','2005-07-31 05:40:35','2006-02-15 22:18:50'),(11905,441,2,9854,'2.99','2005-07-31 12:59:34','2006-02-15 22:18:50'),(11906,441,2,10139,'1.99','2005-07-31 22:02:20','2006-02-15 22:18:50'),(11907,441,1,10846,'1.99','2005-08-01 23:47:54','2006-02-15 22:18:50'),(11908,441,2,11247,'1.99','2005-08-02 13:34:08','2006-02-15 22:18:50'),(11909,441,2,13483,'2.99','2005-08-20 01:16:38','2006-02-15 22:18:50'),(11910,441,2,13739,'4.99','2005-08-20 10:45:10','2006-02-15 22:18:50'),(11911,441,1,13932,'4.99','2005-08-20 17:17:00','2006-02-15 22:18:50'),(11912,441,2,14796,'4.99','2005-08-22 00:40:49','2006-02-15 22:18:50'),(11913,441,2,15070,'3.99','2005-08-22 10:55:45','2006-02-15 22:18:50'),(11914,441,1,14878,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:50'),(11915,442,2,466,'0.99','2005-05-27 20:57:07','2006-02-15 22:18:50'),(11916,442,2,558,'6.99','2005-05-28 08:38:43','2006-02-15 22:18:50'),(11917,442,1,632,'5.99','2005-05-28 17:37:50','2006-02-15 22:18:50'),(11918,442,1,1251,'5.99','2005-06-15 05:58:55','2006-02-15 22:18:50'),(11919,442,2,1358,'0.99','2005-06-15 13:28:48','2006-02-15 22:18:50'),(11920,442,2,1576,'8.99','2005-06-16 03:54:39','2006-02-15 22:18:50'),(11921,442,1,1774,'2.99','2005-06-16 18:27:52','2006-02-15 22:18:51'),(11922,442,2,3545,'4.99','2005-07-06 02:16:17','2006-02-15 22:18:51'),(11923,442,1,3661,'2.99','2005-07-06 08:10:02','2006-02-15 22:18:51'),(11924,442,1,4052,'5.99','2005-07-07 03:38:22','2006-02-15 22:18:51'),(11925,442,1,4058,'2.99','2005-07-07 04:02:50','2006-02-15 22:18:51'),(11926,442,2,4365,'2.99','2005-07-07 19:47:46','2006-02-15 22:18:51'),(11927,442,2,4577,'3.99','2005-07-08 05:59:00','2006-02-15 22:18:51'),(11928,442,2,6590,'4.99','2005-07-12 07:08:21','2006-02-15 22:18:51'),(11929,442,2,6632,'2.99','2005-07-12 09:33:10','2006-02-15 22:18:51'),(11930,442,2,7427,'2.99','2005-07-27 17:20:16','2006-02-15 22:18:51'),(11931,442,1,7460,'0.99','2005-07-27 18:41:35','2006-02-15 22:18:51'),(11932,442,1,7671,'2.99','2005-07-28 02:48:31','2006-02-15 22:18:51'),(11933,442,1,8044,'2.99','2005-07-28 16:49:12','2006-02-15 22:18:51'),(11934,442,1,8758,'4.99','2005-07-29 19:20:49','2006-02-15 22:18:51'),(11935,442,1,9180,'4.99','2005-07-30 12:03:15','2006-02-15 22:18:51'),(11936,442,2,9873,'5.99','2005-07-31 13:32:18','2006-02-15 22:18:51'),(11937,442,1,10034,'2.99','2005-07-31 18:45:30','2006-02-15 22:18:51'),(11938,442,2,10365,'6.99','2005-08-01 06:08:44','2006-02-15 22:18:51'),(11939,442,2,10452,'0.99','2005-08-01 09:11:36','2006-02-15 22:18:51'),(11940,442,1,12948,'0.99','2005-08-19 05:55:14','2006-02-15 22:18:52'),(11941,442,2,13004,'0.99','2005-08-19 07:40:08','2006-02-15 22:18:52'),(11942,442,1,13155,'7.99','2005-08-19 13:10:23','2006-02-15 22:18:52'),(11943,442,2,14199,'0.99','2005-08-21 03:48:43','2006-02-15 22:18:52'),(11944,442,1,14418,'1.99','2005-08-21 11:14:26','2006-02-15 22:18:52'),(11945,442,1,14466,'0.99','2005-08-21 13:03:13','2006-02-15 22:18:52'),(11946,442,2,15207,'2.99','2005-08-22 16:35:25','2006-02-15 22:18:52'),(11947,443,2,1068,'4.99','2005-05-31 09:32:15','2006-02-15 22:18:52'),(11948,443,1,2871,'2.99','2005-06-20 00:27:49','2006-02-15 22:18:52'),(11949,443,2,3510,'5.99','2005-07-06 00:27:41','2006-02-15 22:18:52'),(11950,443,2,6625,'5.99','2005-07-12 09:06:40','2006-02-15 22:18:52'),(11951,443,1,6913,'4.99','2005-07-12 22:18:12','2006-02-15 22:18:52'),(11952,443,2,6983,'2.99','2005-07-27 00:55:03','2006-02-15 22:18:52'),(11953,443,1,7317,'2.99','2005-07-27 13:19:41','2006-02-15 22:18:52'),(11954,443,1,7667,'8.99','2005-07-28 02:37:22','2006-02-15 22:18:52'),(11955,443,1,7987,'9.99','2005-07-28 14:36:52','2006-02-15 22:18:52'),(11956,443,2,9740,'1.99','2005-07-31 09:08:03','2006-02-15 22:18:52'),(11957,443,1,10014,'4.99','2005-07-31 18:10:56','2006-02-15 22:18:52'),(11958,443,2,10081,'5.99','2005-07-31 20:07:44','2006-02-15 22:18:53'),(11959,443,2,10360,'0.99','2005-08-01 05:52:53','2006-02-15 22:18:53'),(11960,443,1,11449,'4.99','2005-08-02 20:44:43','2006-02-15 22:18:53'),(11961,443,1,12415,'4.99','2005-08-18 09:54:01','2006-02-15 22:18:53'),(11962,443,2,12857,'4.99','2005-08-19 02:20:13','2006-02-15 22:18:53'),(11963,443,1,13489,'2.99','2005-08-20 01:29:06','2006-02-15 22:18:53'),(11964,443,1,14561,'2.99','2005-08-21 16:20:43','2006-02-15 22:18:53'),(11965,443,2,14611,'6.99','2005-08-21 18:01:41','2006-02-15 22:18:53'),(11966,443,1,15182,'0.99','2005-08-22 15:47:05','2006-02-15 22:18:53'),(11967,443,2,15393,'4.99','2005-08-22 23:04:09','2006-02-15 22:18:53'),(11968,443,1,15519,'0.99','2005-08-23 03:23:32','2006-02-15 22:18:53'),(11969,444,1,201,'8.99','2005-05-26 07:13:45','2006-02-15 22:18:53'),(11970,444,1,557,'0.99','2005-05-28 08:36:22','2006-02-15 22:18:53'),(11971,444,1,1239,'0.99','2005-06-15 04:53:01','2006-02-15 22:18:53'),(11972,444,2,1397,'3.99','2005-06-15 16:25:26','2006-02-15 22:18:53'),(11973,444,2,1441,'1.99','2005-06-15 18:54:21','2006-02-15 22:18:53'),(11974,444,1,2551,'4.99','2005-06-19 02:51:04','2006-02-15 22:18:53'),(11975,444,2,3301,'7.99','2005-06-21 07:32:25','2006-02-15 22:18:53'),(11976,444,2,3415,'5.99','2005-06-21 16:59:49','2006-02-15 22:18:54'),(11977,444,2,3498,'4.99','2005-07-06 00:02:08','2006-02-15 22:18:54'),(11978,444,1,3539,'0.99','2005-07-06 01:39:08','2006-02-15 22:18:54'),(11979,444,2,4648,'6.99','2005-07-08 09:31:27','2006-02-15 22:18:54'),(11980,444,1,5753,'2.99','2005-07-10 12:29:43','2006-02-15 22:18:54'),(11981,444,2,5825,'2.99','2005-07-10 16:20:30','2006-02-15 22:18:54'),(11982,444,2,6285,'2.99','2005-07-11 16:52:07','2006-02-15 22:18:54'),(11983,444,2,7679,'3.99','2005-07-28 02:58:39','2006-02-15 22:18:54'),(11984,444,2,9634,'1.99','2005-07-31 05:06:02','2006-02-15 22:18:54'),(11985,444,1,10529,'4.99','2005-08-01 12:00:02','2006-02-15 22:18:54'),(11986,444,1,10693,'4.99','2005-08-01 18:14:14','2006-02-15 22:18:54'),(11987,444,2,11353,'0.99','2005-08-02 17:34:45','2006-02-15 22:18:54'),(11988,444,2,11419,'6.99','2005-08-02 19:46:38','2006-02-15 22:18:54'),(11989,444,1,11728,'4.99','2005-08-17 08:12:26','2006-02-15 22:18:54'),(11990,444,1,12161,'6.99','2005-08-18 00:41:46','2006-02-15 22:18:54'),(11991,444,2,12712,'2.99','2005-08-18 21:04:13','2006-02-15 22:18:54'),(11992,444,2,12946,'2.99','2005-08-19 05:53:34','2006-02-15 22:18:54'),(11993,444,1,13488,'0.99','2005-08-20 01:28:42','2006-02-15 22:18:54'),(11994,444,2,13559,'2.99','2005-08-20 04:16:07','2006-02-15 22:18:55'),(11995,444,1,13924,'0.99','2005-08-20 17:05:18','2006-02-15 22:18:55'),(11996,444,1,15249,'4.99','2005-08-22 17:58:27','2006-02-15 22:18:55'),(11997,444,1,15557,'0.99','2005-08-23 04:52:17','2006-02-15 22:18:55'),(11998,444,2,15815,'4.99','2005-08-23 14:55:47','2006-02-15 22:18:55'),(11999,445,1,481,'2.99','2005-05-27 22:49:27','2006-02-15 22:18:55'),(12000,445,1,960,'2.99','2005-05-30 18:13:23','2006-02-15 22:18:55'),(12001,445,1,4041,'0.99','2005-07-07 03:03:33','2006-02-15 22:18:55'),(12002,445,1,4193,'0.99','2005-07-07 10:57:21','2006-02-15 22:18:55'),(12003,445,2,5225,'2.99','2005-07-09 12:10:16','2006-02-15 22:18:55'),(12004,445,1,6346,'0.99','2005-07-11 20:08:34','2006-02-15 22:18:55'),(12005,445,2,7351,'2.99','2005-07-27 14:37:36','2006-02-15 22:18:55'),(12006,445,2,7971,'4.99','2005-07-28 14:00:47','2006-02-15 22:18:55'),(12007,445,1,8851,'8.99','2005-07-29 23:26:19','2006-02-15 22:18:55'),(12008,445,2,8911,'0.99','2005-07-30 01:30:57','2006-02-15 22:18:55'),(12009,445,2,9625,'4.99','2005-07-31 04:30:48','2006-02-15 22:18:55'),(12010,445,1,10007,'0.99','2005-07-31 17:54:58','2006-02-15 22:18:55'),(12011,445,2,10334,'1.99','2005-08-01 04:58:42','2006-02-15 22:18:56'),(12012,445,2,10341,'0.99','2005-08-01 05:10:02','2006-02-15 22:18:56'),(12013,445,2,10936,'9.99','2005-08-02 02:55:04','2006-02-15 22:18:56'),(12014,445,1,11383,'7.99','2005-08-02 18:22:05','2006-02-15 22:18:56'),(12015,445,1,11868,'4.99','2005-08-17 14:05:34','2006-02-15 22:18:56'),(12016,445,1,11877,'3.99','2005-08-17 14:21:11','2006-02-15 22:18:56'),(12017,445,2,13586,'0.99','2005-08-20 05:40:33','2006-02-15 22:18:56'),(12018,445,1,14612,'6.99','2005-08-21 18:03:15','2006-02-15 22:18:56'),(12019,445,2,14673,'2.99','2005-08-21 20:01:18','2006-02-15 22:18:56'),(12020,445,1,14866,'6.99','2005-08-22 03:11:35','2006-02-15 22:18:56'),(12021,445,1,14955,'4.99','2005-08-22 06:25:52','2006-02-15 22:18:56'),(12022,445,1,15123,'3.99','2005-08-22 12:48:44','2006-02-15 22:18:56'),(12023,445,1,15791,'6.99','2005-08-23 14:02:13','2006-02-15 22:18:56'),(12024,445,2,15906,'2.99','2005-08-23 17:36:00','2006-02-15 22:18:56'),(12025,446,2,14,'0.99','2005-05-25 00:31:15','2006-02-15 22:18:56'),(12026,446,1,236,'0.99','2005-05-26 11:53:49','2006-02-15 22:18:56'),(12027,446,1,355,'4.99','2005-05-27 06:15:33','2006-02-15 22:18:56'),(12028,446,1,2248,'4.99','2005-06-18 04:59:48','2006-02-15 22:18:56'),(12029,446,2,2335,'3.99','2005-06-18 10:59:36','2006-02-15 22:18:57'),(12030,446,2,2520,'6.99','2005-06-19 00:29:00','2006-02-15 22:18:57'),(12031,446,2,2710,'0.99','2005-06-19 14:03:56','2006-02-15 22:18:57'),(12032,446,1,3060,'2.99','2005-06-20 13:47:20','2006-02-15 22:18:57'),(12033,446,2,3168,'0.99','2005-06-20 21:46:01','2006-02-15 22:18:57'),(12034,446,2,4358,'4.99','2005-07-07 19:27:04','2006-02-15 22:18:57'),(12035,446,2,5393,'4.99','2005-07-09 19:35:12','2006-02-15 22:18:57'),(12036,446,2,5409,'2.99','2005-07-09 20:17:19','2006-02-15 22:18:57'),(12037,446,2,6454,'0.99','2005-07-12 01:00:12','2006-02-15 22:18:57'),(12038,446,1,6510,'4.99','2005-07-12 03:35:39','2006-02-15 22:18:57'),(12039,446,1,6535,'0.99','2005-07-12 04:43:43','2006-02-15 22:18:57'),(12040,446,1,6734,'6.99','2005-07-12 14:04:24','2006-02-15 22:18:57'),(12041,446,1,7005,'5.99','2005-07-27 01:38:36','2006-02-15 22:18:57'),(12042,446,2,7089,'0.99','2005-07-27 04:43:42','2006-02-15 22:18:57'),(12043,446,1,7576,'4.99','2005-07-27 22:54:35','2006-02-15 22:18:57'),(12044,446,2,8284,'6.99','2005-07-29 01:56:40','2006-02-15 22:18:57'),(12045,446,1,8309,'4.99','2005-07-29 03:22:20','2006-02-15 22:18:57'),(12046,446,2,8670,'4.99','2005-07-29 15:49:03','2006-02-15 22:18:57'),(12047,446,2,8691,'0.99','2005-07-29 16:41:23','2006-02-15 22:18:58'),(12048,446,2,8922,'9.99','2005-07-30 02:08:25','2006-02-15 22:18:58'),(12049,446,1,8923,'3.99','2005-07-30 02:08:49','2006-02-15 22:18:58'),(12050,446,1,9116,'0.99','2005-07-30 09:19:41','2006-02-15 22:18:58'),(12051,446,1,11051,'3.99','2005-08-02 06:23:39','2006-02-15 22:18:58'),(12052,446,2,12253,'0.99','2005-08-18 04:00:50','2006-02-15 22:18:58'),(12053,446,2,12480,'8.99','2005-08-18 12:26:43','2006-02-15 22:18:58'),(12054,446,1,15808,'1.99','2005-08-23 14:38:37','2006-02-15 22:18:58'),(12055,446,2,15951,'0.99','2005-08-23 19:10:32','2006-02-15 22:18:58'),(12056,447,1,461,'2.99','2005-05-27 20:08:55','2006-02-15 22:18:58'),(12057,447,2,732,'0.99','2005-05-29 07:32:51','2006-02-15 22:18:58'),(12058,447,2,1230,'0.99','2005-06-15 04:04:09','2006-02-15 22:18:58'),(12059,447,2,1890,'2.99','2005-06-17 04:06:13','2006-02-15 22:18:58'),(12060,447,1,2025,'4.99','2005-06-17 13:04:00','2006-02-15 22:18:58'),(12061,447,2,2285,'4.99','2005-06-18 07:00:54','2006-02-15 22:18:58'),(12062,447,2,4403,'4.99','2005-07-07 21:29:40','2006-02-15 22:18:58'),(12063,447,1,4858,'6.99','2005-07-08 18:53:24','2006-02-15 22:18:58'),(12064,447,1,5331,'4.99','2005-07-09 16:54:06','2006-02-15 22:18:58'),(12065,447,1,5734,'0.99','2005-07-10 11:37:28','2006-02-15 22:18:59'),(12066,447,2,5987,'2.99','2005-07-11 00:55:31','2006-02-15 22:18:59'),(12067,447,1,6651,'0.99','2005-07-12 10:57:28','2006-02-15 22:18:59'),(12068,447,1,6690,'1.99','2005-07-12 12:23:02','2006-02-15 22:18:59'),(12069,447,1,8537,'8.99','2005-07-29 10:44:54','2006-02-15 22:18:59'),(12070,447,2,8945,'4.99','2005-07-30 03:11:48','2006-02-15 22:18:59'),(12071,447,2,9076,'5.99','2005-07-30 07:58:12','2006-02-15 22:18:59'),(12072,447,1,9288,'6.99','2005-07-30 15:56:39','2006-02-15 22:18:59'),(12073,447,1,10425,'2.99','2005-08-01 08:23:25','2006-02-15 22:18:59'),(12074,447,2,10957,'5.99','2005-08-02 03:33:30','2006-02-15 22:18:59'),(12075,447,2,11108,'0.99','2005-08-02 08:20:01','2006-02-15 22:18:59'),(12076,447,1,11465,'5.99','2005-08-02 21:43:52','2006-02-15 22:18:59'),(12077,447,2,12511,'0.99','2005-08-18 13:23:19','2006-02-15 22:18:59'),(12078,447,1,13072,'2.99','2005-08-19 10:03:30','2006-02-15 22:18:59'),(12079,447,2,13110,'0.99','2005-08-19 11:24:37','2006-02-15 22:18:59'),(12080,447,1,13848,'4.99','2005-08-20 14:37:49','2006-02-15 22:18:59'),(12081,447,2,14443,'5.99','2005-08-21 12:06:32','2006-02-15 22:18:59'),(12082,447,1,15108,'2.99','2005-08-22 12:10:07','2006-02-15 22:18:59'),(12083,447,1,15997,'4.99','2005-08-23 20:40:31','2006-02-15 22:19:00'),(12084,447,2,16032,'4.99','2005-08-23 21:59:57','2006-02-15 22:19:00'),(12085,448,1,299,'4.99','2005-05-26 20:55:36','2006-02-15 22:19:00'),(12086,448,2,1123,'2.99','2005-05-31 16:48:43','2006-02-15 22:19:00'),(12087,448,1,1313,'5.99','2005-06-15 10:18:34','2006-02-15 22:19:00'),(12088,448,2,1823,'7.99','2005-06-16 21:48:16','2006-02-15 22:19:00'),(12089,448,2,2697,'0.99','2005-06-19 13:29:08','2006-02-15 22:19:00'),(12090,448,2,3225,'3.99','2005-06-21 02:16:55','2006-02-15 22:19:00'),(12091,448,2,3347,'5.99','2005-06-21 11:08:32','2006-02-15 22:19:00'),(12092,448,2,3959,'5.99','2005-07-06 22:07:58','2006-02-15 22:19:00'),(12093,448,2,3992,'6.99','2005-07-06 23:36:56','2006-02-15 22:19:00'),(12094,448,2,4024,'0.99','2005-07-07 02:11:23','2006-02-15 22:19:00'),(12095,448,2,4206,'2.99','2005-07-07 11:32:16','2006-02-15 22:19:00'),(12096,448,1,4406,'1.99','2005-07-07 21:35:16','2006-02-15 22:19:00'),(12097,448,2,4537,'2.99','2005-07-08 03:48:40','2006-02-15 22:19:00'),(12098,448,2,4558,'2.99','2005-07-08 04:55:26','2006-02-15 22:19:00'),(12099,448,2,6341,'2.99','2005-07-11 19:48:02','2006-02-15 22:19:00'),(12100,448,2,6985,'4.99','2005-07-27 00:57:42','2006-02-15 22:19:00'),(12101,448,1,9178,'10.99','2005-07-30 11:58:50','2006-02-15 22:19:01'),(12102,448,2,11608,'8.99','2005-08-17 03:36:52','2006-02-15 22:19:01'),(12103,448,1,11798,'9.99','2005-08-17 11:21:43','2006-02-15 22:19:01'),(12104,448,1,12446,'2.99','2005-08-18 10:56:29','2006-02-15 22:19:01'),(12105,448,1,13220,'2.99','2005-08-19 15:42:32','2006-02-15 22:19:01'),(12106,448,2,13250,'3.99','2005-08-19 16:47:55','2006-02-15 22:19:01'),(12107,448,1,13982,'3.99','2005-08-20 19:08:25','2006-02-15 22:19:01'),(12108,448,1,14580,'3.99','2005-08-21 16:56:39','2006-02-15 22:19:01'),(12109,448,1,14711,'2.99','2005-08-21 21:22:07','2006-02-15 22:19:01'),(12110,448,2,15358,'9.99','2005-08-22 21:29:14','2006-02-15 22:19:01'),(12111,448,1,15427,'4.99','2005-08-23 00:07:53','2006-02-15 22:19:01'),(12112,448,2,14734,'3.98','2006-02-14 15:16:03','2006-02-15 22:19:01'),(12113,448,1,13577,'0.00','2006-02-14 15:16:03','2006-02-15 22:19:01'),(12114,449,2,263,'4.99','2005-05-26 15:47:40','2006-02-15 22:19:01'),(12115,449,2,325,'5.99','2005-05-27 01:09:55','2006-02-15 22:19:01'),(12116,449,1,849,'7.99','2005-05-30 01:23:07','2006-02-15 22:19:01'),(12117,449,2,1295,'4.99','2005-06-15 09:17:20','2006-02-15 22:19:01'),(12118,449,1,2348,'0.99','2005-06-18 12:15:43','2006-02-15 22:19:01'),(12119,449,2,2970,'2.99','2005-06-20 07:51:51','2006-02-15 22:19:02'),(12120,449,1,3503,'0.99','2005-07-06 00:17:24','2006-02-15 22:19:02'),(12121,449,1,3977,'8.99','2005-07-06 23:00:49','2006-02-15 22:19:02'),(12122,449,2,4433,'3.99','2005-07-07 22:45:41','2006-02-15 22:19:02'),(12123,449,1,5824,'2.99','2005-07-10 16:19:53','2006-02-15 22:19:02'),(12124,449,2,7755,'6.99','2005-07-28 06:22:18','2006-02-15 22:19:02'),(12125,449,2,7803,'3.99','2005-07-28 07:52:13','2006-02-15 22:19:02'),(12126,449,2,8002,'2.99','2005-07-28 15:11:00','2006-02-15 22:19:02'),(12127,449,2,10083,'5.99','2005-07-31 20:10:19','2006-02-15 22:19:02'),(12128,449,2,10409,'2.99','2005-08-01 07:49:15','2006-02-15 22:19:02'),(12129,449,1,10416,'4.99','2005-08-01 08:08:39','2006-02-15 22:19:02'),(12130,449,1,10516,'6.99','2005-08-01 11:41:55','2006-02-15 22:19:02'),(12131,449,2,10688,'6.99','2005-08-01 17:53:43','2006-02-15 22:19:02'),(12132,449,1,12212,'4.99','2005-08-18 02:33:29','2006-02-15 22:19:02'),(12133,449,2,14962,'7.99','2005-08-22 06:37:43','2006-02-15 22:19:02'),(12134,450,2,548,'3.99','2005-05-28 07:34:56','2006-02-15 22:19:02'),(12135,450,2,1639,'4.99','2005-06-16 08:33:39','2006-02-15 22:19:02'),(12136,450,1,1739,'0.99','2005-06-16 16:09:38','2006-02-15 22:19:02'),(12137,450,2,1914,'2.99','2005-06-17 05:25:54','2006-02-15 22:19:03'),(12138,450,2,2278,'0.99','2005-06-18 06:37:57','2006-02-15 22:19:03'),(12139,450,1,2501,'4.99','2005-06-18 23:10:11','2006-02-15 22:19:03'),(12140,450,1,2626,'2.99','2005-06-19 08:28:44','2006-02-15 22:19:03'),(12141,450,1,3155,'4.99','2005-06-20 21:02:38','2006-02-15 22:19:03'),(12142,450,1,3570,'3.99','2005-07-06 03:23:43','2006-02-15 22:19:03'),(12143,450,1,5999,'7.99','2005-07-11 01:21:22','2006-02-15 22:19:03'),(12144,450,1,6028,'4.99','2005-07-11 02:31:44','2006-02-15 22:19:03'),(12145,450,2,7365,'2.99','2005-07-27 15:00:20','2006-02-15 22:19:03'),(12146,450,1,7610,'0.99','2005-07-28 00:11:35','2006-02-15 22:19:03'),(12147,450,1,7626,'0.99','2005-07-28 00:49:01','2006-02-15 22:19:03'),(12148,450,2,8733,'4.99','2005-07-29 18:26:34','2006-02-15 22:19:03'),(12149,450,2,10432,'2.99','2005-08-01 08:43:21','2006-02-15 22:19:03'),(12150,450,1,10984,'3.99','2005-08-02 04:30:02','2006-02-15 22:19:03'),(12151,450,2,12812,'0.99','2005-08-19 00:54:02','2006-02-15 22:19:03'),(12152,450,2,13731,'4.99','2005-08-20 10:22:08','2006-02-15 22:19:03'),(12153,450,1,13810,'0.99','2005-08-20 12:59:38','2006-02-15 22:19:03'),(12154,450,1,13828,'4.99','2005-08-20 13:49:52','2006-02-15 22:19:03'),(12155,450,1,14282,'4.99','2005-08-21 06:41:29','2006-02-15 22:19:04'),(12156,450,2,15019,'0.99','2005-08-22 08:52:53','2006-02-15 22:19:04'),(12157,450,1,15327,'4.99','2005-08-22 20:31:24','2006-02-15 22:19:04'),(12158,450,2,15419,'4.99','2005-08-22 23:54:36','2006-02-15 22:19:04'),(12159,450,1,14172,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:04'),(12160,451,2,77,'0.99','2005-05-25 11:31:59','2006-02-15 22:19:04'),(12161,451,2,328,'2.99','2005-05-27 01:29:31','2006-02-15 22:19:04'),(12162,451,2,1113,'2.99','2005-05-31 15:58:44','2006-02-15 22:19:04'),(12163,451,1,1202,'0.99','2005-06-15 02:08:04','2006-02-15 22:19:04'),(12164,451,1,1851,'0.99','2005-06-17 00:32:26','2006-02-15 22:19:04'),(12165,451,1,1940,'6.99','2005-06-17 07:42:22','2006-02-15 22:19:04'),(12166,451,1,2671,'1.99','2005-06-19 11:33:11','2006-02-15 22:19:04'),(12167,451,1,2909,'3.99','2005-06-20 03:19:10','2006-02-15 22:19:04'),(12168,451,2,2917,'0.99','2005-06-20 04:08:35','2006-02-15 22:19:04'),(12169,451,1,3316,'6.99','2005-06-21 08:20:18','2006-02-15 22:19:04'),(12170,451,2,3826,'4.99','2005-07-06 15:51:58','2006-02-15 22:19:04'),(12171,451,1,4538,'2.99','2005-07-08 03:56:29','2006-02-15 22:19:04'),(12172,451,1,4794,'8.99','2005-07-08 16:30:11','2006-02-15 22:19:04'),(12173,451,2,4930,'4.99','2005-07-08 22:15:48','2006-02-15 22:19:05'),(12174,451,1,5005,'3.99','2005-07-09 01:21:44','2006-02-15 22:19:05'),(12175,451,2,5518,'8.99','2005-07-10 01:15:11','2006-02-15 22:19:05'),(12176,451,1,7018,'2.99','2005-07-27 02:20:22','2006-02-15 22:19:05'),(12177,451,2,10337,'8.99','2005-08-01 05:01:46','2006-02-15 22:19:05'),(12178,451,1,10856,'2.99','2005-08-02 00:07:14','2006-02-15 22:19:05'),(12179,451,2,10950,'2.99','2005-08-02 03:25:08','2006-02-15 22:19:05'),(12180,451,2,11167,'6.99','2005-08-02 10:15:51','2006-02-15 22:19:05'),(12181,451,2,11381,'6.99','2005-08-02 18:19:29','2006-02-15 22:19:05'),(12182,451,1,11790,'2.99','2005-08-17 11:00:08','2006-02-15 22:19:05'),(12183,451,2,12371,'2.99','2005-08-18 08:02:46','2006-02-15 22:19:05'),(12184,451,1,12422,'4.99','2005-08-18 10:13:12','2006-02-15 22:19:05'),(12185,451,2,13003,'1.99','2005-08-19 07:39:29','2006-02-15 22:19:05'),(12186,451,2,13100,'2.99','2005-08-19 10:55:45','2006-02-15 22:19:05'),(12187,451,2,13252,'2.99','2005-08-19 16:50:50','2006-02-15 22:19:05'),(12188,451,2,13380,'0.99','2005-08-19 21:36:58','2006-02-15 22:19:05'),(12189,451,1,13666,'2.99','2005-08-20 08:20:19','2006-02-15 22:19:05'),(12190,451,1,13705,'2.99','2005-08-20 09:32:23','2006-02-15 22:19:06'),(12191,451,2,14500,'0.99','2005-08-21 14:11:30','2006-02-15 22:19:06'),(12192,451,1,15651,'4.99','2005-08-23 08:31:49','2006-02-15 22:19:06'),(12193,452,1,354,'2.99','2005-05-27 06:12:26','2006-02-15 22:19:06'),(12194,452,2,714,'2.99','2005-05-29 04:15:21','2006-02-15 22:19:06'),(12195,452,1,726,'1.99','2005-05-29 06:05:29','2006-02-15 22:19:06'),(12196,452,2,1203,'4.99','2005-06-15 02:09:02','2006-02-15 22:19:06'),(12197,452,1,1512,'5.99','2005-06-15 22:53:03','2006-02-15 22:19:06'),(12198,452,1,1794,'3.99','2005-06-16 20:08:37','2006-02-15 22:19:06'),(12199,452,1,2263,'0.99','2005-06-18 05:57:47','2006-02-15 22:19:06'),(12200,452,2,2266,'4.99','2005-06-18 06:05:02','2006-02-15 22:19:06'),(12201,452,1,2504,'0.99','2005-06-18 23:19:53','2006-02-15 22:19:06'),(12202,452,2,2661,'0.99','2005-06-19 10:50:52','2006-02-15 22:19:06'),(12203,452,2,3638,'3.99','2005-07-06 07:08:17','2006-02-15 22:19:06'),(12204,452,1,3791,'2.99','2005-07-06 14:24:56','2006-02-15 22:19:06'),(12205,452,2,3907,'6.99','2005-07-06 19:39:14','2006-02-15 22:19:06'),(12206,452,1,4348,'0.99','2005-07-07 19:02:05','2006-02-15 22:19:06'),(12207,452,2,4353,'4.99','2005-07-07 19:19:05','2006-02-15 22:19:06'),(12208,452,2,4417,'2.99','2005-07-07 22:05:05','2006-02-15 22:19:07'),(12209,452,1,4720,'0.99','2005-07-08 12:34:34','2006-02-15 22:19:07'),(12210,452,1,5177,'1.99','2005-07-09 09:43:21','2006-02-15 22:19:07'),(12211,452,2,5480,'0.99','2005-07-09 23:49:07','2006-02-15 22:19:07'),(12212,452,2,6959,'2.99','2005-07-27 00:07:51','2006-02-15 22:19:07'),(12213,452,2,7899,'6.99','2005-07-28 11:10:12','2006-02-15 22:19:07'),(12214,452,1,8898,'1.99','2005-07-30 01:02:20','2006-02-15 22:19:07'),(12215,452,2,9379,'6.99','2005-07-30 19:13:01','2006-02-15 22:19:07'),(12216,452,2,11715,'4.99','2005-08-17 07:40:55','2006-02-15 22:19:07'),(12217,452,1,11735,'3.99','2005-08-17 08:35:42','2006-02-15 22:19:07'),(12218,452,1,12355,'0.99','2005-08-18 07:36:23','2006-02-15 22:19:07'),(12219,452,1,12630,'4.99','2005-08-18 17:49:28','2006-02-15 22:19:07'),(12220,452,1,13080,'4.99','2005-08-19 10:18:00','2006-02-15 22:19:07'),(12221,452,1,13642,'3.99','2005-08-20 07:42:17','2006-02-15 22:19:07'),(12222,452,1,14660,'0.99','2005-08-21 19:43:21','2006-02-15 22:19:07'),(12223,452,1,15909,'0.99','2005-08-23 17:42:42','2006-02-15 22:19:07'),(12224,452,1,14175,'4.99','2006-02-14 15:16:03','2006-02-15 22:19:07'),(12225,453,2,2852,'5.99','2005-06-19 23:08:50','2006-02-15 22:19:07'),(12226,453,1,2853,'7.99','2005-06-19 23:09:41','2006-02-15 22:19:08'),(12227,453,2,2887,'4.99','2005-06-20 01:39:43','2006-02-15 22:19:08'),(12228,453,2,3929,'0.99','2005-07-06 20:52:39','2006-02-15 22:19:08'),(12229,453,2,4033,'8.99','2005-07-07 02:35:46','2006-02-15 22:19:08'),(12230,453,1,4717,'4.99','2005-07-08 12:22:43','2006-02-15 22:19:08'),(12231,453,2,4805,'2.99','2005-07-08 16:59:12','2006-02-15 22:19:08'),(12232,453,2,5359,'6.99','2005-07-09 18:10:52','2006-02-15 22:19:08'),(12233,453,1,6752,'4.99','2005-07-12 14:53:15','2006-02-15 22:19:08'),(12234,453,1,7563,'0.99','2005-07-27 22:25:36','2006-02-15 22:19:08'),(12235,453,2,9289,'6.99','2005-07-30 15:57:04','2006-02-15 22:19:08'),(12236,453,2,9406,'6.99','2005-07-30 20:24:00','2006-02-15 22:19:08'),(12237,453,2,9900,'1.99','2005-07-31 14:15:05','2006-02-15 22:19:08'),(12238,453,1,11794,'4.99','2005-08-17 11:08:48','2006-02-15 22:19:08'),(12239,453,1,12703,'2.99','2005-08-18 20:37:13','2006-02-15 22:19:08'),(12240,453,1,13711,'7.99','2005-08-20 09:35:20','2006-02-15 22:19:08'),(12241,453,1,13785,'4.99','2005-08-20 12:11:46','2006-02-15 22:19:08'),(12242,453,1,14133,'2.99','2005-08-21 01:44:14','2006-02-15 22:19:08'),(12243,453,2,14306,'5.99','2005-08-21 07:32:35','2006-02-15 22:19:09'),(12244,453,2,14644,'4.99','2005-08-21 19:12:12','2006-02-15 22:19:09'),(12245,453,1,14652,'4.99','2005-08-21 19:32:05','2006-02-15 22:19:09'),(12246,453,1,15252,'0.99','2005-08-22 18:04:22','2006-02-15 22:19:09'),(12247,453,2,15627,'4.99','2005-08-23 07:25:38','2006-02-15 22:19:09'),(12248,454,1,735,'7.99','2005-05-29 08:08:13','2006-02-15 22:19:09'),(12249,454,2,1647,'4.99','2005-06-16 09:14:58','2006-02-15 22:19:09'),(12250,454,2,1844,'7.99','2005-06-16 23:53:53','2006-02-15 22:19:09'),(12251,454,1,1861,'1.99','2005-06-17 01:17:31','2006-02-15 22:19:09'),(12252,454,1,1938,'4.99','2005-06-17 07:18:36','2006-02-15 22:19:09'),(12253,454,2,2048,'5.99','2005-06-17 14:55:29','2006-02-15 22:19:09'),(12254,454,2,2182,'5.99','2005-06-18 00:56:18','2006-02-15 22:19:09'),(12255,454,1,2437,'2.99','2005-06-18 18:30:26','2006-02-15 22:19:09'),(12256,454,2,2666,'9.99','2005-06-19 11:17:12','2006-02-15 22:19:09'),(12257,454,1,3221,'2.99','2005-06-21 01:49:47','2006-02-15 22:19:09'),(12258,454,1,3362,'4.99','2005-06-21 12:19:54','2006-02-15 22:19:09'),(12259,454,1,3622,'7.99','2005-07-06 06:05:04','2006-02-15 22:19:09'),(12260,454,2,4562,'4.99','2005-07-08 05:08:32','2006-02-15 22:19:09'),(12261,454,2,5088,'4.99','2005-07-09 05:45:16','2006-02-15 22:19:10'),(12262,454,2,5446,'2.99','2005-07-09 21:59:55','2006-02-15 22:19:10'),(12263,454,2,6260,'4.99','2005-07-11 15:26:29','2006-02-15 22:19:10'),(12264,454,2,6701,'0.99','2005-07-12 12:47:59','2006-02-15 22:19:10'),(12265,454,2,8481,'2.99','2005-07-29 08:45:57','2006-02-15 22:19:10'),(12266,454,1,8806,'0.99','2005-07-29 21:36:34','2006-02-15 22:19:10'),(12267,454,2,9041,'0.99','2005-07-30 06:32:36','2006-02-15 22:19:10'),(12268,454,1,9372,'9.99','2005-07-30 19:04:30','2006-02-15 22:19:10'),(12269,454,1,10005,'3.99','2005-07-31 17:53:51','2006-02-15 22:19:10'),(12270,454,2,12347,'0.99','2005-08-18 07:18:10','2006-02-15 22:19:10'),(12271,454,1,12553,'0.99','2005-08-18 14:46:54','2006-02-15 22:19:10'),(12272,454,2,13496,'8.99','2005-08-20 01:42:29','2006-02-15 22:19:10'),(12273,454,2,13513,'2.99','2005-08-20 02:27:53','2006-02-15 22:19:10'),(12274,454,2,13694,'8.99','2005-08-20 09:13:23','2006-02-15 22:19:10'),(12275,454,1,13805,'6.99','2005-08-20 12:53:12','2006-02-15 22:19:10'),(12276,454,1,14799,'0.99','2005-08-22 00:44:57','2006-02-15 22:19:10'),(12277,454,2,14843,'2.99','2005-08-22 02:05:25','2006-02-15 22:19:10'),(12278,454,2,15012,'4.99','2005-08-22 08:42:32','2006-02-15 22:19:10'),(12279,454,1,15301,'3.99','2005-08-22 19:44:16','2006-02-15 22:19:11'),(12280,454,2,15608,'1.99','2005-08-23 06:55:26','2006-02-15 22:19:11'),(12281,455,2,115,'0.99','2005-05-25 19:13:25','2006-02-15 22:19:11'),(12282,455,2,343,'0.99','2005-05-27 04:13:41','2006-02-15 22:19:11'),(12283,455,2,1382,'1.99','2005-06-15 15:18:08','2006-02-15 22:19:11'),(12284,455,1,1802,'1.99','2005-06-16 20:23:30','2006-02-15 22:19:11'),(12285,455,1,1906,'2.99','2005-06-17 04:53:35','2006-02-15 22:19:11'),(12286,455,2,2356,'0.99','2005-06-18 12:59:23','2006-02-15 22:19:11'),(12287,455,2,4195,'2.99','2005-07-07 11:00:02','2006-02-15 22:19:11'),(12288,455,1,4861,'8.99','2005-07-08 18:57:30','2006-02-15 22:19:11'),(12289,455,1,4964,'2.99','2005-07-08 23:46:38','2006-02-15 22:19:11'),(12290,455,1,5504,'6.99','2005-07-10 00:36:38','2006-02-15 22:19:11'),(12291,455,2,6729,'4.99','2005-07-12 13:58:23','2006-02-15 22:19:11'),(12292,455,1,7388,'4.99','2005-07-27 15:54:19','2006-02-15 22:19:11'),(12293,455,2,7498,'4.99','2005-07-27 20:09:31','2006-02-15 22:19:11'),(12294,455,2,7905,'5.99','2005-07-28 11:26:57','2006-02-15 22:19:11'),(12295,455,2,8291,'2.99','2005-07-29 02:28:25','2006-02-15 22:19:11'),(12296,455,1,10436,'0.99','2005-08-01 08:50:59','2006-02-15 22:19:11'),(12297,455,1,11605,'4.99','2005-08-17 03:30:57','2006-02-15 22:19:12'),(12298,455,1,12163,'2.99','2005-08-18 00:46:01','2006-02-15 22:19:12'),(12299,455,1,12314,'4.99','2005-08-18 06:10:02','2006-02-15 22:19:12'),(12300,455,2,13083,'2.99','2005-08-19 10:26:45','2006-02-15 22:19:12'),(12301,455,2,13813,'4.99','2005-08-20 13:03:26','2006-02-15 22:19:12'),(12302,455,1,14294,'2.99','2005-08-21 07:07:26','2006-02-15 22:19:12'),(12303,455,2,14583,'4.99','2005-08-21 17:11:47','2006-02-15 22:19:12'),(12304,455,1,15494,'1.99','2005-08-23 02:25:09','2006-02-15 22:19:12'),(12305,456,2,19,'4.99','2005-05-25 01:17:24','2006-02-15 22:19:12'),(12306,456,1,1288,'2.99','2005-06-15 08:41:52','2006-02-15 22:19:12'),(12307,456,1,1700,'0.99','2005-06-16 13:18:23','2006-02-15 22:19:12'),(12308,456,2,2103,'5.99','2005-06-17 19:13:10','2006-02-15 22:19:12'),(12309,456,2,2146,'6.99','2005-06-17 22:26:23','2006-02-15 22:19:12'),(12310,456,1,2192,'4.99','2005-06-18 01:35:47','2006-02-15 22:19:12'),(12311,456,1,2404,'0.99','2005-06-18 16:33:48','2006-02-15 22:19:12'),(12312,456,1,2581,'2.99','2005-06-19 04:54:13','2006-02-15 22:19:12'),(12313,456,1,3743,'7.99','2005-07-06 12:03:54','2006-02-15 22:19:12'),(12314,456,2,3881,'2.99','2005-07-06 18:35:37','2006-02-15 22:19:13'),(12315,456,1,4141,'3.99','2005-07-07 08:19:20','2006-02-15 22:19:13'),(12316,456,2,5964,'0.99','2005-07-10 23:47:18','2006-02-15 22:19:13'),(12317,456,2,6023,'0.99','2005-07-11 02:15:57','2006-02-15 22:19:13'),(12318,456,2,7248,'2.99','2005-07-27 10:37:45','2006-02-15 22:19:13'),(12319,456,1,8749,'4.99','2005-07-29 19:13:15','2006-02-15 22:19:13'),(12320,456,2,10519,'5.99','2005-08-01 11:44:13','2006-02-15 22:19:13'),(12321,456,1,10813,'2.99','2005-08-01 22:43:00','2006-02-15 22:19:13'),(12322,456,1,12188,'4.99','2005-08-18 01:51:43','2006-02-15 22:19:13'),(12323,456,1,13144,'8.99','2005-08-19 12:45:55','2006-02-15 22:19:13'),(12324,456,1,13348,'4.99','2005-08-19 20:31:48','2006-02-15 22:19:13'),(12325,456,1,13547,'4.99','2005-08-20 03:53:16','2006-02-15 22:19:13'),(12326,456,2,14253,'2.99','2005-08-21 05:47:52','2006-02-15 22:19:13'),(12327,456,2,14690,'1.99','2005-08-21 20:42:25','2006-02-15 22:19:13'),(12328,456,1,15720,'3.99','2005-08-23 11:15:20','2006-02-15 22:19:13'),(12329,456,1,15910,'2.99','2005-08-23 17:43:16','2006-02-15 22:19:13'),(12330,457,2,1024,'7.99','2005-05-31 03:30:19','2006-02-15 22:19:13'),(12331,457,2,1453,'4.99','2005-06-15 19:36:39','2006-02-15 22:19:13'),(12332,457,2,1727,'0.99','2005-06-16 15:21:47','2006-02-15 22:19:14'),(12333,457,1,2030,'0.99','2005-06-17 13:13:27','2006-02-15 22:19:14'),(12334,457,1,2172,'7.99','2005-06-18 00:06:16','2006-02-15 22:19:14'),(12335,457,1,2670,'4.99','2005-06-19 11:30:16','2006-02-15 22:19:14'),(12336,457,1,2762,'3.99','2005-06-19 17:22:31','2006-02-15 22:19:14'),(12337,457,1,2811,'0.99','2005-06-19 19:53:30','2006-02-15 22:19:14'),(12338,457,2,3115,'2.99','2005-06-20 17:59:05','2006-02-15 22:19:14'),(12339,457,2,3184,'2.99','2005-06-20 22:57:44','2006-02-15 22:19:14'),(12340,457,2,4600,'5.99','2005-07-08 06:48:37','2006-02-15 22:19:14'),(12341,457,1,5500,'0.99','2005-07-10 00:28:17','2006-02-15 22:19:14'),(12342,457,1,6467,'7.99','2005-07-12 01:22:03','2006-02-15 22:19:14'),(12343,457,1,7184,'1.99','2005-07-27 08:22:26','2006-02-15 22:19:14'),(12344,457,2,8373,'4.99','2005-07-29 05:19:53','2006-02-15 22:19:14'),(12345,457,1,8502,'2.99','2005-07-29 09:15:41','2006-02-15 22:19:14'),(12346,457,1,10049,'2.99','2005-07-31 19:11:11','2006-02-15 22:19:14'),(12347,457,2,11956,'6.99','2005-08-17 17:22:05','2006-02-15 22:19:14'),(12348,457,1,12115,'4.99','2005-08-17 23:04:15','2006-02-15 22:19:14'),(12349,457,1,12171,'4.99','2005-08-18 01:06:13','2006-02-15 22:19:15'),(12350,457,1,13088,'0.99','2005-08-19 10:36:11','2006-02-15 22:19:15'),(12351,457,1,13150,'2.99','2005-08-19 13:08:19','2006-02-15 22:19:15'),(12352,457,2,13934,'0.99','2005-08-20 17:18:48','2006-02-15 22:19:15'),(12353,457,2,14327,'10.99','2005-08-21 08:18:18','2006-02-15 22:19:15'),(12354,457,1,14365,'6.99','2005-08-21 09:25:13','2006-02-15 22:19:15'),(12355,457,1,15128,'3.99','2005-08-22 12:57:26','2006-02-15 22:19:15'),(12356,457,1,12645,'3.98','2006-02-14 15:16:03','2006-02-15 22:19:15'),(12357,457,2,14516,'0.00','2006-02-14 15:16:03','2006-02-15 22:19:15'),(12358,458,2,2629,'5.99','2005-06-19 08:42:12','2006-02-15 22:19:15'),(12359,458,2,3322,'0.99','2005-06-21 08:42:37','2006-02-15 22:19:15'),(12360,458,2,4525,'2.99','2005-07-08 03:15:00','2006-02-15 22:19:15'),(12361,458,1,5412,'2.99','2005-07-09 20:23:52','2006-02-15 22:19:15'),(12362,458,1,5572,'0.99','2005-07-10 03:49:00','2006-02-15 22:19:15'),(12363,458,2,6250,'3.99','2005-07-11 15:02:04','2006-02-15 22:19:15'),(12364,458,1,6431,'5.99','2005-07-12 00:03:57','2006-02-15 22:19:15'),(12365,458,2,6595,'7.99','2005-07-12 07:25:48','2006-02-15 22:19:15'),(12366,458,1,6654,'1.99','2005-07-12 11:06:28','2006-02-15 22:19:15'),(12367,458,2,7923,'3.99','2005-07-28 12:08:29','2006-02-15 22:19:16'),(12368,458,1,8158,'0.99','2005-07-28 21:08:46','2006-02-15 22:19:16'),(12369,458,2,11138,'2.99','2005-08-02 09:26:16','2006-02-15 22:19:16'),(12370,458,2,11975,'2.99','2005-08-17 17:58:39','2006-02-15 22:19:16'),(12371,458,2,12768,'0.99','2005-08-18 23:26:11','2006-02-15 22:19:16'),(12372,458,2,13259,'2.99','2005-08-19 17:08:53','2006-02-15 22:19:16'),(12373,458,2,13487,'2.99','2005-08-20 01:27:05','2006-02-15 22:19:16'),(12374,458,2,13571,'4.99','2005-08-20 05:05:14','2006-02-15 22:19:16'),(12375,458,2,14428,'4.99','2005-08-21 11:27:07','2006-02-15 22:19:16'),(12376,458,1,15604,'4.99','2005-08-23 06:44:19','2006-02-15 22:19:16'),(12377,459,2,2,'2.99','2005-05-24 22:54:33','2006-02-15 22:19:16'),(12378,459,2,1876,'0.99','2005-06-17 02:50:51','2006-02-15 22:19:16'),(12379,459,2,1977,'2.99','2005-06-17 09:38:22','2006-02-15 22:19:16'),(12380,459,2,2075,'4.99','2005-06-17 16:40:33','2006-02-15 22:19:16'),(12381,459,1,2899,'0.99','2005-06-20 02:39:21','2006-02-15 22:19:16'),(12382,459,2,3041,'4.99','2005-06-20 12:35:44','2006-02-15 22:19:16'),(12383,459,2,3045,'0.99','2005-06-20 12:42:00','2006-02-15 22:19:16'),(12384,459,2,3234,'9.99','2005-06-21 02:39:44','2006-02-15 22:19:16'),(12385,459,1,3506,'2.99','2005-07-06 00:22:29','2006-02-15 22:19:17'),(12386,459,2,4519,'2.99','2005-07-08 02:51:23','2006-02-15 22:19:17'),(12387,459,1,5301,'3.99','2005-07-09 15:42:10','2006-02-15 22:19:17'),(12388,459,1,5695,'0.99','2005-07-10 09:43:40','2006-02-15 22:19:17'),(12389,459,1,6206,'0.99','2005-07-11 12:32:14','2006-02-15 22:19:17'),(12390,459,2,6750,'3.99','2005-07-12 14:49:39','2006-02-15 22:19:17'),(12391,459,1,7623,'6.99','2005-07-28 00:37:41','2006-02-15 22:19:17'),(12392,459,2,7639,'4.99','2005-07-28 01:14:36','2006-02-15 22:19:17'),(12393,459,1,7717,'4.99','2005-07-28 04:33:54','2006-02-15 22:19:17'),(12394,459,1,7820,'5.99','2005-07-28 08:28:51','2006-02-15 22:19:17'),(12395,459,1,7913,'6.99','2005-07-28 11:47:23','2006-02-15 22:19:17'),(12396,459,1,8289,'9.99','2005-07-29 02:23:24','2006-02-15 22:19:17'),(12397,459,2,8557,'10.99','2005-07-29 11:19:59','2006-02-15 22:19:17'),(12398,459,1,8897,'2.99','2005-07-30 01:00:17','2006-02-15 22:19:17'),(12399,459,1,9137,'6.99','2005-07-30 10:09:24','2006-02-15 22:19:17'),(12400,459,2,9639,'2.99','2005-07-31 05:32:10','2006-02-15 22:19:17'),(12401,459,1,9744,'4.99','2005-07-31 09:15:38','2006-02-15 22:19:17'),(12402,459,2,10117,'4.99','2005-07-31 21:14:31','2006-02-15 22:19:18'),(12403,459,1,10233,'6.99','2005-08-01 01:54:23','2006-02-15 22:19:18'),(12404,459,2,10255,'4.99','2005-08-01 02:46:13','2006-02-15 22:19:18'),(12405,459,1,10499,'7.99','2005-08-01 11:00:20','2006-02-15 22:19:18'),(12406,459,1,10531,'2.99','2005-08-01 12:06:30','2006-02-15 22:19:18'),(12407,459,1,12527,'6.99','2005-08-18 13:48:46','2006-02-15 22:19:18'),(12408,459,1,12629,'7.99','2005-08-18 17:40:33','2006-02-15 22:19:18'),(12409,459,2,13960,'10.99','2005-08-20 18:16:26','2006-02-15 22:19:18'),(12410,459,1,13967,'4.99','2005-08-20 18:28:46','2006-02-15 22:19:18'),(12411,459,1,14315,'3.99','2005-08-21 07:56:39','2006-02-15 22:19:18'),(12412,459,1,15126,'5.99','2005-08-22 12:53:58','2006-02-15 22:19:18'),(12413,459,2,15342,'2.99','2005-08-22 20:56:41','2006-02-15 22:19:18'),(12414,459,1,15814,'0.99','2005-08-23 14:52:50','2006-02-15 22:19:18'),(12415,460,1,223,'4.99','2005-05-26 10:15:23','2006-02-15 22:19:18'),(12416,460,2,298,'0.99','2005-05-26 20:52:26','2006-02-15 22:19:18'),(12417,460,1,880,'0.99','2005-05-30 06:12:33','2006-02-15 22:19:18'),(12418,460,2,1064,'4.99','2005-05-31 08:50:07','2006-02-15 22:19:18'),(12419,460,2,1392,'0.99','2005-06-15 16:12:27','2006-02-15 22:19:19'),(12420,460,2,3820,'4.99','2005-07-06 15:35:26','2006-02-15 22:19:19'),(12421,460,1,4452,'7.99','2005-07-07 23:31:54','2006-02-15 22:19:19'),(12422,460,2,5482,'3.99','2005-07-09 23:53:04','2006-02-15 22:19:19'),(12423,460,1,6613,'4.99','2005-07-12 08:30:07','2006-02-15 22:19:19'),(12424,460,1,6788,'5.99','2005-07-12 16:33:44','2006-02-15 22:19:19'),(12425,460,1,7125,'6.99','2005-07-27 06:11:00','2006-02-15 22:19:19'),(12426,460,1,7785,'3.99','2005-07-28 07:16:11','2006-02-15 22:19:19'),(12427,460,2,8656,'2.99','2005-07-29 15:05:52','2006-02-15 22:19:19'),(12428,460,2,10754,'10.99','2005-08-01 20:12:33','2006-02-15 22:19:19'),(12429,460,1,10926,'1.99','2005-08-02 02:26:37','2006-02-15 22:19:19'),(12430,460,2,11554,'2.99','2005-08-17 01:05:17','2006-02-15 22:19:19'),(12431,460,1,12056,'5.99','2005-08-17 21:03:48','2006-02-15 22:19:19'),(12432,460,2,12586,'4.99','2005-08-18 15:54:39','2006-02-15 22:19:19'),(12433,460,1,12865,'0.99','2005-08-19 02:38:50','2006-02-15 22:19:19'),(12434,460,2,13215,'8.99','2005-08-19 15:35:38','2006-02-15 22:19:19'),(12435,460,1,13341,'3.99','2005-08-19 20:18:53','2006-02-15 22:19:19'),(12436,460,2,13920,'5.99','2005-08-20 16:51:18','2006-02-15 22:19:19'),(12437,460,2,14864,'0.99','2005-08-22 02:57:06','2006-02-15 22:19:20'),(12438,460,1,14923,'3.99','2005-08-22 05:13:33','2006-02-15 22:19:20'),(12439,460,2,15954,'2.99','2005-08-23 19:14:07','2006-02-15 22:19:20'),(12440,461,1,684,'6.99','2005-05-29 00:13:15','2006-02-15 22:19:20'),(12441,461,2,3127,'5.99','2005-06-20 18:39:43','2006-02-15 22:19:20'),(12442,461,2,3319,'4.99','2005-06-21 08:25:46','2006-02-15 22:19:20'),(12443,461,2,3698,'0.99','2005-07-06 10:09:20','2006-02-15 22:19:20'),(12444,461,2,4586,'2.99','2005-07-08 06:12:33','2006-02-15 22:19:20'),(12445,461,1,5650,'0.99','2005-07-10 07:17:01','2006-02-15 22:19:20'),(12446,461,1,5809,'2.99','2005-07-10 15:19:30','2006-02-15 22:19:20'),(12447,461,2,7334,'2.99','2005-07-27 13:59:58','2006-02-15 22:19:20'),(12448,461,2,7664,'2.99','2005-07-28 02:24:23','2006-02-15 22:19:20'),(12449,461,2,8133,'0.99','2005-07-28 20:01:06','2006-02-15 22:19:20'),(12450,461,2,8164,'0.99','2005-07-28 21:17:19','2006-02-15 22:19:20'),(12451,461,2,9499,'4.99','2005-07-30 23:58:30','2006-02-15 22:19:20'),(12452,461,1,9885,'0.99','2005-07-31 13:59:32','2006-02-15 22:19:20'),(12453,461,2,10113,'4.99','2005-07-31 21:10:03','2006-02-15 22:19:20'),(12454,461,1,10260,'2.99','2005-08-01 02:58:07','2006-02-15 22:19:21'),(12455,461,2,11063,'0.99','2005-08-02 06:53:48','2006-02-15 22:19:21'),(12456,461,2,11219,'0.99','2005-08-02 12:30:20','2006-02-15 22:19:21'),(12457,461,2,12022,'2.99','2005-08-17 19:52:45','2006-02-15 22:19:21'),(12458,461,1,13223,'2.99','2005-08-19 15:52:04','2006-02-15 22:19:21'),(12459,461,1,13269,'2.99','2005-08-19 17:34:00','2006-02-15 22:19:21'),(12460,461,1,14186,'4.99','2005-08-21 03:31:07','2006-02-15 22:19:21'),(12461,461,1,14893,'4.99','2005-08-22 04:15:48','2006-02-15 22:19:21'),(12462,461,1,15067,'2.99','2005-08-22 10:49:21','2006-02-15 22:19:21'),(12463,461,2,15187,'4.99','2005-08-22 15:53:32','2006-02-15 22:19:21'),(12464,461,1,15336,'6.99','2005-08-22 20:47:48','2006-02-15 22:19:21'),(12465,461,2,15411,'2.99','2005-08-22 23:35:41','2006-02-15 22:19:21'),(12466,461,2,15449,'2.99','2005-08-23 00:55:43','2006-02-15 22:19:21'),(12467,461,2,15613,'7.99','2005-08-23 07:03:19','2006-02-15 22:19:21'),(12468,462,2,156,'2.99','2005-05-26 01:19:05','2006-02-15 22:19:21'),(12469,462,2,590,'3.99','2005-05-28 13:06:50','2006-02-15 22:19:21'),(12470,462,2,1773,'5.99','2005-06-16 18:13:43','2006-02-15 22:19:21'),(12471,462,2,1926,'9.99','2005-06-17 06:24:30','2006-02-15 22:19:21'),(12472,462,1,3279,'4.99','2005-06-21 06:05:53','2006-02-15 22:19:22'),(12473,462,1,4500,'4.99','2005-07-08 02:10:01','2006-02-15 22:19:22'),(12474,462,2,4728,'3.99','2005-07-08 12:59:01','2006-02-15 22:19:22'),(12475,462,1,6583,'4.99','2005-07-12 06:42:31','2006-02-15 22:19:22'),(12476,462,1,6630,'0.99','2005-07-12 09:30:05','2006-02-15 22:19:22'),(12477,462,1,6710,'7.99','2005-07-12 13:23:09','2006-02-15 22:19:22'),(12478,462,1,6721,'6.99','2005-07-12 13:42:58','2006-02-15 22:19:22'),(12479,462,2,7295,'8.99','2005-07-27 12:38:47','2006-02-15 22:19:22'),(12480,462,1,7324,'6.99','2005-07-27 13:42:39','2006-02-15 22:19:22'),(12481,462,1,7762,'8.99','2005-07-28 06:34:23','2006-02-15 22:19:22'),(12482,462,1,7932,'4.99','2005-07-28 12:24:54','2006-02-15 22:19:22'),(12483,462,2,7935,'2.99','2005-07-28 12:33:17','2006-02-15 22:19:22'),(12484,462,1,8066,'2.99','2005-07-28 17:20:09','2006-02-15 22:19:22'),(12485,462,1,8282,'0.99','2005-07-29 01:49:04','2006-02-15 22:19:22'),(12486,462,1,8290,'3.99','2005-07-29 02:24:08','2006-02-15 22:19:22'),(12487,462,2,8757,'2.99','2005-07-29 19:19:10','2006-02-15 22:19:22'),(12488,462,1,9891,'0.99','2005-07-31 14:05:44','2006-02-15 22:19:22'),(12489,462,1,10283,'2.99','2005-08-01 03:29:45','2006-02-15 22:19:23'),(12490,462,2,11639,'6.99','2005-08-17 04:43:29','2006-02-15 22:19:23'),(12491,462,1,11808,'2.99','2005-08-17 11:51:16','2006-02-15 22:19:23'),(12492,462,1,12466,'4.99','2005-08-18 11:36:55','2006-02-15 22:19:23'),(12493,462,2,12582,'0.99','2005-08-18 15:51:12','2006-02-15 22:19:23'),(12494,462,1,12802,'8.99','2005-08-19 00:27:41','2006-02-15 22:19:23'),(12495,462,2,13041,'8.99','2005-08-19 09:05:38','2006-02-15 22:19:23'),(12496,462,1,13328,'4.99','2005-08-19 19:56:01','2006-02-15 22:19:23'),(12497,462,1,13492,'7.99','2005-08-20 01:32:04','2006-02-15 22:19:23'),(12498,462,2,15581,'2.99','2005-08-23 05:42:13','2006-02-15 22:19:23'),(12499,462,1,15943,'2.99','2005-08-23 18:49:32','2006-02-15 22:19:23'),(12500,462,1,16013,'0.99','2005-08-23 21:17:17','2006-02-15 22:19:23'),(12501,463,1,560,'1.99','2005-05-28 08:53:02','2006-02-15 22:19:23'),(12502,463,1,1284,'2.99','2005-06-15 08:27:33','2006-02-15 22:19:23'),(12503,463,2,2527,'4.99','2005-06-19 01:10:31','2006-02-15 22:19:23'),(12504,463,1,3217,'2.99','2005-06-21 01:28:12','2006-02-15 22:19:23'),(12505,463,1,3309,'4.99','2005-06-21 08:00:49','2006-02-15 22:19:23'),(12506,463,1,5026,'2.99','2005-07-09 02:32:34','2006-02-15 22:19:24'),(12507,463,1,5157,'2.99','2005-07-09 08:52:12','2006-02-15 22:19:24'),(12508,463,1,5448,'0.99','2005-07-09 22:11:14','2006-02-15 22:19:24'),(12509,463,2,6294,'0.99','2005-07-11 17:25:55','2006-02-15 22:19:24'),(12510,463,1,6932,'6.99','2005-07-26 23:08:04','2006-02-15 22:19:24'),(12511,463,1,7013,'0.99','2005-07-27 02:03:21','2006-02-15 22:19:24'),(12512,463,1,7361,'0.99','2005-07-27 14:53:55','2006-02-15 22:19:24'),(12513,463,1,8762,'2.99','2005-07-29 19:30:02','2006-02-15 22:19:24'),(12514,463,2,9405,'7.99','2005-07-30 20:22:17','2006-02-15 22:19:24'),(12515,463,1,9954,'2.99','2005-07-31 15:57:07','2006-02-15 22:19:24'),(12516,463,1,10275,'3.99','2005-08-01 03:20:08','2006-02-15 22:19:24'),(12517,463,2,10405,'0.99','2005-08-01 07:35:25','2006-02-15 22:19:24'),(12518,463,2,10906,'2.99','2005-08-02 01:47:04','2006-02-15 22:19:24'),(12519,463,2,12096,'7.99','2005-08-17 22:32:50','2006-02-15 22:19:24'),(12520,463,2,12679,'6.99','2005-08-18 19:42:11','2006-02-15 22:19:24'),(12521,463,1,12950,'2.99','2005-08-19 05:55:58','2006-02-15 22:19:24'),(12522,463,2,13938,'4.99','2005-08-20 17:24:45','2006-02-15 22:19:24'),(12523,463,1,14689,'0.99','2005-08-21 20:33:00','2006-02-15 22:19:24'),(12524,463,1,14859,'2.99','2005-08-22 02:46:35','2006-02-15 22:19:25'),(12525,463,2,15151,'7.99','2005-08-22 14:23:11','2006-02-15 22:19:25'),(12526,464,1,305,'3.99','2005-05-26 21:22:07','2006-02-15 22:19:25'),(12527,464,2,373,'1.99','2005-05-27 08:16:25','2006-02-15 22:19:25'),(12528,464,2,1277,'4.99','2005-06-15 08:01:29','2006-02-15 22:19:25'),(12529,464,1,3167,'2.99','2005-06-20 21:42:29','2006-02-15 22:19:25'),(12530,464,1,3761,'4.99','2005-07-06 12:52:44','2006-02-15 22:19:25'),(12531,464,1,4337,'5.99','2005-07-07 18:36:37','2006-02-15 22:19:25'),(12532,464,2,5455,'6.99','2005-07-09 22:28:45','2006-02-15 22:19:25'),(12533,464,1,5910,'4.99','2005-07-10 20:51:34','2006-02-15 22:19:25'),(12534,464,2,6601,'3.99','2005-07-12 07:44:49','2006-02-15 22:19:25'),(12535,464,1,9600,'5.99','2005-07-31 03:35:34','2006-02-15 22:19:25'),(12536,464,2,11275,'1.99','2005-08-02 14:25:58','2006-02-15 22:19:25'),(12537,464,1,13644,'8.99','2005-08-20 07:46:30','2006-02-15 22:19:25'),(12538,464,2,13943,'2.99','2005-08-20 17:31:18','2006-02-15 22:19:25'),(12539,464,1,15092,'6.99','2005-08-22 11:36:16','2006-02-15 22:19:25'),(12540,464,2,15854,'0.99','2005-08-23 15:58:05','2006-02-15 22:19:25'),(12541,464,1,15983,'4.99','2005-08-23 20:13:38','2006-02-15 22:19:26'),(12542,465,2,640,'0.99','2005-05-28 18:43:26','2006-02-15 22:19:26'),(12543,465,1,1337,'2.99','2005-06-15 12:12:42','2006-02-15 22:19:26'),(12544,465,1,2079,'4.99','2005-06-17 16:49:45','2006-02-15 22:19:26'),(12545,465,1,2159,'8.99','2005-06-17 23:37:29','2006-02-15 22:19:26'),(12546,465,2,2524,'0.99','2005-06-19 00:48:11','2006-02-15 22:19:26'),(12547,465,1,4763,'0.99','2005-07-08 14:57:32','2006-02-15 22:19:26'),(12548,465,2,6904,'3.99','2005-07-12 22:02:09','2006-02-15 22:19:26'),(12549,465,2,7508,'2.99','2005-07-27 20:33:08','2006-02-15 22:19:26'),(12550,465,1,10542,'3.99','2005-08-01 12:32:23','2006-02-15 22:19:26'),(12551,465,1,11156,'2.99','2005-08-02 09:56:06','2006-02-15 22:19:26'),(12552,465,1,11586,'4.99','2005-08-17 02:20:42','2006-02-15 22:19:26'),(12553,465,2,11648,'6.99','2005-08-17 04:56:16','2006-02-15 22:19:26'),(12554,465,2,12106,'4.99','2005-08-17 22:55:32','2006-02-15 22:19:26'),(12555,465,1,12814,'4.99','2005-08-19 00:58:24','2006-02-15 22:19:26'),(12556,465,1,12864,'4.99','2005-08-19 02:38:26','2006-02-15 22:19:26'),(12557,465,1,15550,'3.99','2005-08-23 04:27:54','2006-02-15 22:19:26'),(12558,465,2,15859,'4.99','2005-08-23 16:08:15','2006-02-15 22:19:27'),(12559,466,2,1104,'2.99','2005-05-31 14:30:01','2006-02-15 22:19:27'),(12560,466,2,1808,'7.99','2005-06-16 20:59:35','2006-02-15 22:19:27'),(12561,466,2,2446,'8.99','2005-06-18 19:04:41','2006-02-15 22:19:27'),(12562,466,1,3022,'3.99','2005-06-20 11:17:20','2006-02-15 22:19:27'),(12563,466,2,3237,'4.99','2005-06-21 02:47:56','2006-02-15 22:19:27'),(12564,466,2,3343,'2.99','2005-06-21 10:56:59','2006-02-15 22:19:27'),(12565,466,2,5048,'0.99','2005-07-09 03:46:33','2006-02-15 22:19:27'),(12566,466,1,5691,'4.99','2005-07-10 09:29:49','2006-02-15 22:19:27'),(12567,466,1,6073,'6.99','2005-07-11 04:54:31','2006-02-15 22:19:27'),(12568,466,2,7080,'2.99','2005-07-27 04:25:25','2006-02-15 22:19:27'),(12569,466,2,8276,'0.99','2005-07-29 01:38:43','2006-02-15 22:19:27'),(12570,466,1,9202,'3.99','2005-07-30 12:43:24','2006-02-15 22:19:27'),(12571,466,1,9257,'2.99','2005-07-30 14:30:38','2006-02-15 22:19:27'),(12572,466,1,10469,'4.99','2005-08-01 09:51:11','2006-02-15 22:19:27'),(12573,466,2,11343,'0.99','2005-08-02 17:12:30','2006-02-15 22:19:27'),(12574,466,1,11359,'4.99','2005-08-02 17:45:55','2006-02-15 22:19:27'),(12575,466,1,12048,'7.99','2005-08-17 20:49:24','2006-02-15 22:19:27'),(12576,466,1,13478,'2.99','2005-08-20 01:07:14','2006-02-15 22:19:28'),(12577,466,1,13884,'5.99','2005-08-20 15:30:51','2006-02-15 22:19:28'),(12578,466,1,13988,'4.99','2005-08-20 19:21:28','2006-02-15 22:19:28'),(12579,466,2,14546,'2.99','2005-08-21 15:50:50','2006-02-15 22:19:28'),(12580,466,2,15230,'4.99','2005-08-22 17:31:41','2006-02-15 22:19:28'),(12581,466,1,16005,'7.99','2005-08-23 21:00:22','2006-02-15 22:19:28'),(12582,467,2,225,'4.99','2005-05-26 10:27:50','2006-02-15 22:19:28'),(12583,467,1,1737,'8.99','2005-06-16 15:59:44','2006-02-15 22:19:28'),(12584,467,2,2121,'4.99','2005-06-17 20:38:54','2006-02-15 22:19:28'),(12585,467,2,2870,'9.99','2005-06-20 00:17:46','2006-02-15 22:19:28'),(12586,467,1,3250,'6.99','2005-06-21 03:16:36','2006-02-15 22:19:28'),(12587,467,1,4216,'0.99','2005-07-07 12:01:34','2006-02-15 22:19:28'),(12588,467,2,4222,'4.99','2005-07-07 12:20:21','2006-02-15 22:19:28'),(12589,467,1,4259,'4.99','2005-07-07 14:22:18','2006-02-15 22:19:28'),(12590,467,2,5160,'4.99','2005-07-09 08:57:07','2006-02-15 22:19:28'),(12591,467,2,6271,'6.99','2005-07-11 16:01:35','2006-02-15 22:19:28'),(12592,467,2,7360,'2.99','2005-07-27 14:52:06','2006-02-15 22:19:28'),(12593,467,2,7573,'5.99','2005-07-27 22:46:20','2006-02-15 22:19:29'),(12594,467,1,7611,'2.99','2005-07-28 00:11:47','2006-02-15 22:19:29'),(12595,467,1,8010,'7.99','2005-07-28 15:26:20','2006-02-15 22:19:29'),(12596,467,2,8061,'6.99','2005-07-28 17:12:53','2006-02-15 22:19:29'),(12597,467,2,8224,'2.99','2005-07-28 23:59:02','2006-02-15 22:19:29'),(12598,467,2,8480,'8.99','2005-07-29 08:44:46','2006-02-15 22:19:29'),(12599,467,1,8767,'4.99','2005-07-29 19:42:33','2006-02-15 22:19:29'),(12600,467,2,10239,'0.99','2005-08-01 02:09:22','2006-02-15 22:19:29'),(12601,467,2,11332,'2.99','2005-08-02 16:52:57','2006-02-15 22:19:29'),(12602,467,1,11874,'4.99','2005-08-17 14:16:40','2006-02-15 22:19:29'),(12603,467,1,12266,'2.99','2005-08-18 04:22:31','2006-02-15 22:19:29'),(12604,467,1,12437,'9.99','2005-08-18 10:42:43','2006-02-15 22:19:29'),(12605,467,1,12641,'2.99','2005-08-18 18:18:08','2006-02-15 22:19:29'),(12606,467,1,14402,'2.99','2005-08-21 10:38:17','2006-02-15 22:19:29'),(12607,467,1,14451,'0.99','2005-08-21 12:21:44','2006-02-15 22:19:29'),(12608,467,1,14842,'3.99','2005-08-22 02:04:38','2006-02-15 22:19:29'),(12609,467,1,15032,'0.99','2005-08-22 09:14:09','2006-02-15 22:19:29'),(12610,467,2,15830,'2.99','2005-08-23 15:19:15','2006-02-15 22:19:30'),(12611,468,2,101,'6.99','2005-05-25 17:17:04','2006-02-15 22:19:30'),(12612,468,1,186,'4.99','2005-05-26 05:32:52','2006-02-15 22:19:30'),(12613,468,2,296,'6.99','2005-05-26 20:35:19','2006-02-15 22:19:30'),(12614,468,2,459,'0.99','2005-05-27 20:00:04','2006-02-15 22:19:30'),(12615,468,1,673,'0.99','2005-05-28 22:07:30','2006-02-15 22:19:30'),(12616,468,2,1229,'2.99','2005-06-15 03:53:13','2006-02-15 22:19:30'),(12617,468,1,1627,'8.99','2005-06-16 07:51:09','2006-02-15 22:19:30'),(12618,468,1,1821,'2.99','2005-06-16 21:42:49','2006-02-15 22:19:30'),(12619,468,1,1975,'2.99','2005-06-17 09:32:10','2006-02-15 22:19:30'),(12620,468,2,2462,'4.99','2005-06-18 20:00:15','2006-02-15 22:19:30'),(12621,468,1,2831,'0.99','2005-06-19 21:17:06','2006-02-15 22:19:30'),(12622,468,2,3724,'2.99','2005-07-06 11:12:48','2006-02-15 22:19:30'),(12623,468,1,3840,'5.99','2005-07-06 16:30:59','2006-02-15 22:19:30'),(12624,468,2,4184,'3.99','2005-07-07 10:30:08','2006-02-15 22:19:30'),(12625,468,2,4527,'3.99','2005-07-08 03:20:10','2006-02-15 22:19:30'),(12626,468,1,5285,'2.99','2005-07-09 15:10:44','2006-02-15 22:19:30'),(12627,468,1,6392,'0.99','2005-07-11 22:25:19','2006-02-15 22:19:31'),(12628,468,1,6581,'4.99','2005-07-12 06:26:49','2006-02-15 22:19:31'),(12629,468,2,6815,'5.99','2005-07-12 18:14:10','2006-02-15 22:19:31'),(12630,468,2,7292,'4.99','2005-07-27 12:34:14','2006-02-15 22:19:31'),(12631,468,1,7685,'0.99','2005-07-28 03:13:00','2006-02-15 22:19:31'),(12632,468,2,8423,'5.99','2005-07-29 07:02:57','2006-02-15 22:19:31'),(12633,468,2,8768,'6.99','2005-07-29 19:43:02','2006-02-15 22:19:31'),(12634,468,1,9598,'0.99','2005-07-31 03:30:41','2006-02-15 22:19:31'),(12635,468,1,9690,'6.99','2005-07-31 07:06:29','2006-02-15 22:19:31'),(12636,468,2,11257,'10.99','2005-08-02 13:45:05','2006-02-15 22:19:31'),(12637,468,2,11633,'4.99','2005-08-17 04:30:09','2006-02-15 22:19:31'),(12638,468,2,12026,'6.99','2005-08-17 20:00:10','2006-02-15 22:19:31'),(12639,468,2,13221,'3.99','2005-08-19 15:45:47','2006-02-15 22:19:31'),(12640,468,1,13417,'0.99','2005-08-19 22:51:39','2006-02-15 22:19:31'),(12641,468,2,14154,'4.99','2005-08-21 02:30:00','2006-02-15 22:19:31'),(12642,468,2,14210,'4.99','2005-08-21 04:28:02','2006-02-15 22:19:31'),(12643,468,1,14309,'9.99','2005-08-21 07:44:17','2006-02-15 22:19:31'),(12644,468,1,14313,'2.99','2005-08-21 07:49:53','2006-02-15 22:19:32'),(12645,468,1,14614,'9.99','2005-08-21 18:03:51','2006-02-15 22:19:32'),(12646,468,2,15435,'4.99','2005-08-23 00:28:19','2006-02-15 22:19:32'),(12647,468,1,15522,'1.99','2005-08-23 03:32:31','2006-02-15 22:19:32'),(12648,468,1,15836,'2.99','2005-08-23 15:29:17','2006-02-15 22:19:32'),(12649,468,2,16044,'0.99','2005-08-23 22:24:39','2006-02-15 22:19:32'),(12650,469,1,168,'0.99','2005-05-26 03:07:43','2006-02-15 22:19:32'),(12651,469,2,506,'7.99','2005-05-28 02:09:19','2006-02-15 22:19:32'),(12652,469,2,529,'4.99','2005-05-28 04:34:17','2006-02-15 22:19:32'),(12653,469,2,936,'1.99','2005-05-30 13:52:49','2006-02-15 22:19:32'),(12654,469,1,1119,'2.99','2005-05-31 16:34:27','2006-02-15 22:19:32'),(12655,469,2,1399,'0.99','2005-06-15 16:29:51','2006-02-15 22:19:32'),(12656,469,1,1680,'9.99','2005-06-16 11:17:22','2006-02-15 22:19:32'),(12657,469,2,3522,'4.99','2005-07-06 01:00:21','2006-02-15 22:19:32'),(12658,469,1,3526,'10.99','2005-07-06 01:03:29','2006-02-15 22:19:32'),(12659,469,2,4067,'3.99','2005-07-07 04:34:23','2006-02-15 22:19:32'),(12660,469,2,4123,'0.99','2005-07-07 07:16:19','2006-02-15 22:19:32'),(12661,469,1,5133,'0.99','2005-07-09 07:43:22','2006-02-15 22:19:33'),(12662,469,1,5299,'3.99','2005-07-09 15:38:09','2006-02-15 22:19:33'),(12663,469,2,5664,'6.99','2005-07-10 08:04:41','2006-02-15 22:19:33'),(12664,469,2,6022,'0.99','2005-07-11 02:15:53','2006-02-15 22:19:33'),(12665,469,2,6099,'4.99','2005-07-11 06:24:44','2006-02-15 22:19:33'),(12666,469,1,6797,'4.99','2005-07-12 16:47:06','2006-02-15 22:19:33'),(12667,469,1,6955,'3.99','2005-07-26 23:55:48','2006-02-15 22:19:33'),(12668,469,2,7062,'6.99','2005-07-27 03:52:01','2006-02-15 22:19:33'),(12669,469,2,7271,'6.99','2005-07-27 11:29:11','2006-02-15 22:19:33'),(12670,469,2,7756,'4.99','2005-07-28 06:22:52','2006-02-15 22:19:33'),(12671,469,1,7914,'4.99','2005-07-28 11:48:08','2006-02-15 22:19:33'),(12672,469,2,8791,'0.99','2005-07-29 20:53:23','2006-02-15 22:19:33'),(12673,469,1,9187,'2.99','2005-07-30 12:14:03','2006-02-15 22:19:33'),(12674,469,2,10075,'4.99','2005-07-31 19:58:42','2006-02-15 22:19:33'),(12675,469,1,10258,'4.99','2005-08-01 02:51:09','2006-02-15 22:19:33'),(12676,469,1,10316,'4.99','2005-08-01 04:34:57','2006-02-15 22:19:33'),(12677,469,1,10658,'2.99','2005-08-01 16:39:18','2006-02-15 22:19:33'),(12678,469,1,10741,'2.99','2005-08-01 19:52:52','2006-02-15 22:19:34'),(12679,469,2,11185,'0.99','2005-08-02 11:04:35','2006-02-15 22:19:34'),(12680,469,2,12035,'0.99','2005-08-17 20:18:06','2006-02-15 22:19:34'),(12681,469,1,12447,'4.99','2005-08-18 10:57:01','2006-02-15 22:19:34'),(12682,469,1,12633,'6.99','2005-08-18 17:55:38','2006-02-15 22:19:34'),(12683,469,1,13654,'4.99','2005-08-20 07:58:21','2006-02-15 22:19:34'),(12684,469,1,13763,'2.99','2005-08-20 11:37:56','2006-02-15 22:19:34'),(12685,469,2,14197,'7.99','2005-08-21 03:47:25','2006-02-15 22:19:34'),(12686,469,2,14661,'2.99','2005-08-21 19:44:21','2006-02-15 22:19:34'),(12687,469,1,15487,'4.99','2005-08-23 02:05:51','2006-02-15 22:19:34'),(12688,469,1,15561,'9.99','2005-08-23 05:02:31','2006-02-15 22:19:34'),(12689,469,1,15851,'2.99','2005-08-23 15:46:33','2006-02-15 22:19:34'),(12690,470,2,60,'2.99','2005-05-25 08:58:25','2006-02-15 22:19:34'),(12691,470,2,1256,'0.99','2005-06-15 06:13:57','2006-02-15 22:19:34'),(12692,470,1,1283,'0.99','2005-06-15 08:27:30','2006-02-15 22:19:34'),(12693,470,2,1594,'7.99','2005-06-16 05:15:12','2006-02-15 22:19:34'),(12694,470,1,3764,'5.99','2005-07-06 13:01:03','2006-02-15 22:19:34'),(12695,470,1,3841,'4.99','2005-07-06 16:34:00','2006-02-15 22:19:35'),(12696,470,1,3922,'4.99','2005-07-06 20:32:27','2006-02-15 22:19:35'),(12697,470,1,4373,'4.99','2005-07-07 20:10:59','2006-02-15 22:19:35'),(12698,470,2,4502,'6.99','2005-07-08 02:12:04','2006-02-15 22:19:35'),(12699,470,2,5082,'4.99','2005-07-09 05:28:38','2006-02-15 22:19:35'),(12700,470,1,6009,'3.99','2005-07-11 01:51:58','2006-02-15 22:19:35'),(12701,470,1,6198,'2.99','2005-07-11 12:12:17','2006-02-15 22:19:35'),(12702,470,2,6703,'4.99','2005-07-12 12:50:19','2006-02-15 22:19:35'),(12703,470,1,6927,'10.99','2005-07-26 22:56:00','2006-02-15 22:19:35'),(12704,470,1,6942,'5.99','2005-07-26 23:27:40','2006-02-15 22:19:35'),(12705,470,1,7663,'4.99','2005-07-28 02:19:48','2006-02-15 22:19:35'),(12706,470,2,8476,'8.99','2005-07-29 08:39:12','2006-02-15 22:19:35'),(12707,470,1,8890,'6.99','2005-07-30 00:42:06','2006-02-15 22:19:35'),(12708,470,1,9422,'5.99','2005-07-30 21:08:41','2006-02-15 22:19:35'),(12709,470,1,9687,'2.99','2005-07-31 06:52:54','2006-02-15 22:19:35'),(12710,470,1,10006,'4.99','2005-07-31 17:54:35','2006-02-15 22:19:35'),(12711,470,1,10236,'0.99','2005-08-01 02:05:34','2006-02-15 22:19:35'),(12712,470,2,10944,'4.99','2005-08-02 03:20:03','2006-02-15 22:19:36'),(12713,470,2,11397,'1.99','2005-08-02 18:53:14','2006-02-15 22:19:36'),(12714,470,2,11711,'2.99','2005-08-17 07:30:55','2006-02-15 22:19:36'),(12715,470,1,11742,'0.99','2005-08-17 08:48:43','2006-02-15 22:19:36'),(12716,470,2,12177,'3.99','2005-08-18 01:15:47','2006-02-15 22:19:36'),(12717,470,2,12423,'8.99','2005-08-18 10:14:52','2006-02-15 22:19:36'),(12718,470,1,12753,'10.99','2005-08-18 22:37:39','2006-02-15 22:19:36'),(12719,470,2,13585,'4.99','2005-08-20 05:32:23','2006-02-15 22:19:36'),(12720,470,1,13592,'4.99','2005-08-20 05:50:35','2006-02-15 22:19:36'),(12721,470,2,14405,'4.99','2005-08-21 10:45:01','2006-02-15 22:19:36'),(12722,471,1,616,'2.99','2005-05-28 15:45:39','2006-02-15 22:19:36'),(12723,471,1,1447,'4.99','2005-06-15 19:13:51','2006-02-15 22:19:36'),(12724,471,2,1449,'2.99','2005-06-15 19:19:16','2006-02-15 22:19:36'),(12725,471,2,2165,'2.99','2005-06-17 23:51:10','2006-02-15 22:19:36'),(12726,471,2,2350,'4.99','2005-06-18 12:25:29','2006-02-15 22:19:36'),(12727,471,2,3073,'4.99','2005-06-20 14:33:26','2006-02-15 22:19:36'),(12728,471,1,3917,'0.99','2005-07-06 20:19:29','2006-02-15 22:19:36'),(12729,471,1,4020,'2.99','2005-07-07 01:42:22','2006-02-15 22:19:37'),(12730,471,2,6293,'2.99','2005-07-11 17:24:57','2006-02-15 22:19:37'),(12731,471,1,6336,'8.99','2005-07-11 19:30:13','2006-02-15 22:19:37'),(12732,471,1,6912,'5.99','2005-07-12 22:17:16','2006-02-15 22:19:37'),(12733,471,1,8199,'0.99','2005-07-28 23:10:25','2006-02-15 22:19:37'),(12734,471,1,9077,'2.99','2005-07-30 08:00:19','2006-02-15 22:19:37'),(12735,471,1,9502,'0.99','2005-07-31 00:02:10','2006-02-15 22:19:37'),(12736,471,2,9560,'2.99','2005-07-31 02:17:27','2006-02-15 22:19:37'),(12737,471,1,10430,'2.99','2005-08-01 08:37:06','2006-02-15 22:19:37'),(12738,471,2,10828,'3.99','2005-08-01 23:16:10','2006-02-15 22:19:37'),(12739,471,2,11601,'4.99','2005-08-17 03:14:47','2006-02-15 22:19:37'),(12740,471,1,12271,'4.99','2005-08-18 04:33:11','2006-02-15 22:19:37'),(12741,471,1,13661,'5.99','2005-08-20 08:05:59','2006-02-15 22:19:37'),(12742,471,1,14085,'7.99','2005-08-20 23:46:24','2006-02-15 22:19:37'),(12743,471,1,14094,'4.99','2005-08-21 00:21:35','2006-02-15 22:19:37'),(12744,471,1,14317,'5.99','2005-08-21 08:00:40','2006-02-15 22:19:37'),(12745,471,2,14538,'2.99','2005-08-21 15:28:15','2006-02-15 22:19:37'),(12746,471,2,14942,'7.99','2005-08-22 05:58:27','2006-02-15 22:19:38'),(12747,471,2,15184,'0.99','2005-08-22 15:51:12','2006-02-15 22:19:38'),(12748,471,1,15654,'1.99','2005-08-23 08:34:53','2006-02-15 22:19:38'),(12749,472,2,142,'0.99','2005-05-25 23:43:47','2006-02-15 22:19:38'),(12750,472,2,249,'2.99','2005-05-26 14:19:09','2006-02-15 22:19:38'),(12751,472,2,800,'0.99','2005-05-29 17:28:12','2006-02-15 22:19:38'),(12752,472,2,994,'4.99','2005-05-30 23:55:36','2006-02-15 22:19:38'),(12753,472,1,1389,'4.99','2005-06-15 15:49:01','2006-02-15 22:19:38'),(12754,472,2,1776,'6.99','2005-06-16 18:46:58','2006-02-15 22:19:38'),(12755,472,1,2538,'5.99','2005-06-19 01:56:59','2006-02-15 22:19:38'),(12756,472,1,2974,'0.99','2005-06-20 08:00:24','2006-02-15 22:19:38'),(12757,472,1,2991,'4.99','2005-06-20 09:10:43','2006-02-15 22:19:38'),(12758,472,1,3254,'0.99','2005-06-21 03:27:10','2006-02-15 22:19:38'),(12759,472,2,3815,'6.99','2005-07-06 15:26:36','2006-02-15 22:19:38'),(12760,472,2,5318,'2.99','2005-07-09 16:11:33','2006-02-15 22:19:38'),(12761,472,1,5612,'3.99','2005-07-10 05:15:12','2006-02-15 22:19:38'),(12762,472,1,6119,'6.99','2005-07-11 07:44:46','2006-02-15 22:19:38'),(12763,472,2,6274,'5.99','2005-07-11 16:09:42','2006-02-15 22:19:38'),(12764,472,1,6308,'5.99','2005-07-11 18:08:41','2006-02-15 22:19:39'),(12765,472,1,6584,'2.99','2005-07-12 06:43:36','2006-02-15 22:19:39'),(12766,472,2,8929,'5.99','2005-07-30 02:28:22','2006-02-15 22:19:39'),(12767,472,2,9926,'6.99','2005-07-31 15:11:51','2006-02-15 22:19:39'),(12768,472,1,10282,'6.99','2005-08-01 03:29:10','2006-02-15 22:19:39'),(12769,472,1,10627,'0.99','2005-08-01 15:33:03','2006-02-15 22:19:39'),(12770,472,1,11911,'6.99','2005-08-17 15:51:35','2006-02-15 22:19:39'),(12771,472,2,12763,'4.99','2005-08-18 23:07:01','2006-02-15 22:19:39'),(12772,472,2,13188,'8.99','2005-08-19 14:27:03','2006-02-15 22:19:39'),(12773,472,1,14209,'4.99','2005-08-21 04:17:56','2006-02-15 22:19:39'),(12774,472,2,14596,'4.99','2005-08-21 17:38:37','2006-02-15 22:19:39'),(12775,472,1,14597,'4.99','2005-08-21 17:39:41','2006-02-15 22:19:39'),(12776,472,2,15185,'5.99','2005-08-22 15:52:50','2006-02-15 22:19:39'),(12777,472,2,15278,'2.99','2005-08-22 19:06:47','2006-02-15 22:19:39'),(12778,472,2,14928,'4.99','2006-02-14 15:16:03','2006-02-15 22:19:39'),(12779,473,1,348,'4.99','2005-05-27 04:50:56','2006-02-15 22:19:39'),(12780,473,2,942,'2.99','2005-05-30 15:05:47','2006-02-15 22:19:39'),(12781,473,2,973,'3.99','2005-05-30 20:27:45','2006-02-15 22:19:40'),(12782,473,2,1748,'0.99','2005-06-16 16:54:03','2006-02-15 22:19:40'),(12783,473,1,2125,'2.99','2005-06-17 20:53:42','2006-02-15 22:19:40'),(12784,473,2,2553,'4.99','2005-06-19 03:04:59','2006-02-15 22:19:40'),(12785,473,2,2748,'4.99','2005-06-19 16:22:26','2006-02-15 22:19:40'),(12786,473,1,3971,'0.99','2005-07-06 22:50:40','2006-02-15 22:19:40'),(12787,473,2,4006,'4.99','2005-07-07 00:25:29','2006-02-15 22:19:40'),(12788,473,2,4625,'4.99','2005-07-08 08:14:26','2006-02-15 22:19:40'),(12789,473,1,4873,'0.99','2005-07-08 19:23:32','2006-02-15 22:19:40'),(12790,473,2,5447,'5.99','2005-07-09 22:09:28','2006-02-15 22:19:40'),(12791,473,1,6446,'2.99','2005-07-12 00:44:08','2006-02-15 22:19:40'),(12792,473,2,6890,'4.99','2005-07-12 21:03:03','2006-02-15 22:19:40'),(12793,473,1,7111,'4.99','2005-07-27 05:38:16','2006-02-15 22:19:40'),(12794,473,1,7215,'2.99','2005-07-27 09:24:00','2006-02-15 22:19:40'),(12795,473,2,7918,'1.99','2005-07-28 11:58:53','2006-02-15 22:19:40'),(12796,473,2,7928,'7.99','2005-07-28 12:15:51','2006-02-15 22:19:40'),(12797,473,1,9025,'4.99','2005-07-30 05:50:08','2006-02-15 22:19:40'),(12798,473,2,9120,'8.99','2005-07-30 09:26:08','2006-02-15 22:19:41'),(12799,473,1,10867,'2.99','2005-08-02 00:24:15','2006-02-15 22:19:41'),(12800,473,2,11006,'2.99','2005-08-02 05:05:52','2006-02-15 22:19:41'),(12801,473,1,11216,'4.99','2005-08-02 12:23:43','2006-02-15 22:19:41'),(12802,473,1,11336,'0.99','2005-08-02 16:58:56','2006-02-15 22:19:41'),(12803,473,2,11421,'7.99','2005-08-02 19:51:53','2006-02-15 22:19:41'),(12804,473,1,11741,'0.99','2005-08-17 08:48:39','2006-02-15 22:19:41'),(12805,473,2,13984,'4.99','2005-08-20 19:12:30','2006-02-15 22:19:41'),(12806,473,2,14202,'0.99','2005-08-21 03:51:52','2006-02-15 22:19:41'),(12807,473,2,14550,'0.99','2005-08-21 15:56:39','2006-02-15 22:19:41'),(12808,473,2,14658,'4.99','2005-08-21 19:41:50','2006-02-15 22:19:41'),(12809,473,2,14757,'4.99','2005-08-21 23:23:37','2006-02-15 22:19:41'),(12810,473,1,15118,'4.99','2005-08-22 12:38:37','2006-02-15 22:19:41'),(12811,473,2,15400,'2.99','2005-08-22 23:13:03','2006-02-15 22:19:41'),(12812,473,2,16024,'4.99','2005-08-23 21:46:47','2006-02-15 22:19:41'),(12813,474,1,816,'7.99','2005-05-29 20:26:39','2006-02-15 22:19:41'),(12814,474,1,1758,'8.99','2005-06-16 17:39:39','2006-02-15 22:19:41'),(12815,474,2,2944,'7.99','2005-06-20 05:43:42','2006-02-15 22:19:42'),(12816,474,2,3787,'4.99','2005-07-06 14:02:01','2006-02-15 22:19:42'),(12817,474,2,4048,'1.99','2005-07-07 03:30:52','2006-02-15 22:19:42'),(12818,474,1,4481,'2.99','2005-07-08 00:58:15','2006-02-15 22:19:42'),(12819,474,1,4533,'0.99','2005-07-08 03:32:01','2006-02-15 22:19:42'),(12820,474,2,4785,'0.99','2005-07-08 16:10:19','2006-02-15 22:19:42'),(12821,474,1,4809,'2.99','2005-07-08 17:03:22','2006-02-15 22:19:42'),(12822,474,2,4886,'4.99','2005-07-08 19:53:22','2006-02-15 22:19:42'),(12823,474,1,5251,'0.99','2005-07-09 13:36:10','2006-02-15 22:19:42'),(12824,474,1,6499,'7.99','2005-07-12 03:11:18','2006-02-15 22:19:42'),(12825,474,1,8991,'2.99','2005-07-30 04:42:54','2006-02-15 22:19:42'),(12826,474,2,10376,'5.99','2005-08-01 06:27:13','2006-02-15 22:19:42'),(12827,474,2,11117,'0.99','2005-08-02 08:36:03','2006-02-15 22:19:42'),(12828,474,1,11489,'2.99','2005-08-02 22:35:28','2006-02-15 22:19:42'),(12829,474,2,11537,'2.99','2005-08-17 00:41:08','2006-02-15 22:19:42'),(12830,474,1,12083,'2.99','2005-08-17 22:13:37','2006-02-15 22:19:42'),(12831,474,1,12236,'4.99','2005-08-18 03:19:29','2006-02-15 22:19:43'),(12832,474,1,12440,'0.99','2005-08-18 10:47:35','2006-02-15 22:19:43'),(12833,474,2,12597,'2.99','2005-08-18 16:34:02','2006-02-15 22:19:43'),(12834,474,1,12702,'4.99','2005-08-18 20:30:33','2006-02-15 22:19:43'),(12835,474,1,14728,'0.99','2005-08-21 22:15:36','2006-02-15 22:19:43'),(12836,474,2,15046,'4.99','2005-08-22 09:54:54','2006-02-15 22:19:43'),(12837,474,1,15558,'6.99','2005-08-23 04:52:22','2006-02-15 22:19:43'),(12838,474,1,11909,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:43'),(12839,475,2,417,'4.99','2005-05-27 15:07:27','2006-02-15 22:19:43'),(12840,475,1,702,'0.99','2005-05-29 02:27:30','2006-02-15 22:19:43'),(12841,475,2,3980,'5.99','2005-07-06 23:11:11','2006-02-15 22:19:43'),(12842,475,1,4013,'6.99','2005-07-07 00:58:00','2006-02-15 22:19:43'),(12843,475,1,4617,'4.99','2005-07-08 07:55:08','2006-02-15 22:19:43'),(12844,475,2,5379,'0.99','2005-07-09 19:08:03','2006-02-15 22:19:43'),(12845,475,1,5407,'0.99','2005-07-09 20:16:07','2006-02-15 22:19:43'),(12846,475,2,5415,'9.99','2005-07-09 20:30:03','2006-02-15 22:19:43'),(12847,475,2,5469,'2.99','2005-07-09 23:08:07','2006-02-15 22:19:43'),(12848,475,1,6224,'4.99','2005-07-11 13:42:18','2006-02-15 22:19:44'),(12849,475,1,7641,'7.99','2005-07-28 01:15:45','2006-02-15 22:19:44'),(12850,475,1,7775,'1.99','2005-07-28 07:04:36','2006-02-15 22:19:44'),(12851,475,2,8207,'5.99','2005-07-28 23:26:31','2006-02-15 22:19:44'),(12852,475,1,9183,'7.99','2005-07-30 12:09:56','2006-02-15 22:19:44'),(12853,475,1,9647,'2.99','2005-07-31 05:45:15','2006-02-15 22:19:44'),(12854,475,1,9737,'2.99','2005-07-31 08:59:18','2006-02-15 22:19:44'),(12855,475,2,10162,'3.99','2005-07-31 23:11:01','2006-02-15 22:19:44'),(12856,475,1,10357,'0.99','2005-08-01 05:49:49','2006-02-15 22:19:44'),(12857,475,1,10633,'3.99','2005-08-01 15:37:17','2006-02-15 22:19:44'),(12858,475,1,11293,'5.99','2005-08-02 15:00:43','2006-02-15 22:19:44'),(12859,475,1,11770,'4.99','2005-08-17 10:05:05','2006-02-15 22:19:44'),(12860,475,2,14303,'2.99','2005-08-21 07:22:43','2006-02-15 22:19:44'),(12861,475,1,15097,'1.99','2005-08-22 11:43:42','2006-02-15 22:19:44'),(12862,475,1,15288,'4.99','2005-08-22 19:23:58','2006-02-15 22:19:44'),(12863,476,1,489,'4.99','2005-05-28 00:09:12','2006-02-15 22:19:44'),(12864,476,1,771,'2.99','2005-05-29 12:59:14','2006-02-15 22:19:44'),(12865,476,1,1682,'3.99','2005-06-16 11:54:25','2006-02-15 22:19:44'),(12866,476,1,2080,'0.99','2005-06-17 16:59:40','2006-02-15 22:19:45'),(12867,476,2,2508,'4.99','2005-06-18 23:43:58','2006-02-15 22:19:45'),(12868,476,2,3448,'2.99','2005-06-21 20:59:20','2006-02-15 22:19:45'),(12869,476,2,3477,'7.99','2005-07-05 23:05:17','2006-02-15 22:19:45'),(12870,476,1,4010,'5.99','2005-07-07 00:47:00','2006-02-15 22:19:45'),(12871,476,2,4171,'4.99','2005-07-07 09:49:04','2006-02-15 22:19:45'),(12872,476,2,5644,'4.99','2005-07-10 06:57:44','2006-02-15 22:19:45'),(12873,476,1,6151,'2.99','2005-07-11 09:25:17','2006-02-15 22:19:45'),(12874,476,1,7461,'0.99','2005-07-27 18:45:15','2006-02-15 22:19:45'),(12875,476,1,8146,'0.99','2005-07-28 20:37:36','2006-02-15 22:19:45'),(12876,476,2,9325,'6.99','2005-07-30 17:29:19','2006-02-15 22:19:45'),(12877,476,2,9743,'3.99','2005-07-31 09:12:42','2006-02-15 22:19:45'),(12878,476,1,10346,'4.99','2005-08-01 05:19:23','2006-02-15 22:19:45'),(12879,476,1,10617,'9.99','2005-08-01 15:05:52','2006-02-15 22:19:45'),(12880,476,1,10826,'6.99','2005-08-01 23:07:56','2006-02-15 22:19:45'),(12881,476,1,12616,'4.99','2005-08-18 17:22:41','2006-02-15 22:19:45'),(12882,476,2,12709,'5.99','2005-08-18 20:59:51','2006-02-15 22:19:46'),(12883,476,1,15413,'0.99','2005-08-22 23:38:01','2006-02-15 22:19:46'),(12884,476,1,13941,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:46'),(12885,477,1,882,'2.99','2005-05-30 06:16:06','2006-02-15 22:19:46'),(12886,477,1,1714,'6.99','2005-06-16 14:29:59','2006-02-15 22:19:46'),(12887,477,1,2187,'2.99','2005-06-18 01:17:27','2006-02-15 22:19:46'),(12888,477,1,2306,'10.99','2005-06-18 08:33:23','2006-02-15 22:19:46'),(12889,477,2,2676,'4.99','2005-06-19 11:54:57','2006-02-15 22:19:46'),(12890,477,2,4237,'5.99','2005-07-07 13:16:55','2006-02-15 22:19:46'),(12891,477,1,4283,'2.99','2005-07-07 15:29:35','2006-02-15 22:19:46'),(12892,477,2,4956,'7.99','2005-07-08 23:17:10','2006-02-15 22:19:46'),(12893,477,2,6265,'2.99','2005-07-11 15:43:51','2006-02-15 22:19:46'),(12894,477,2,7302,'2.99','2005-07-27 12:52:13','2006-02-15 22:19:46'),(12895,477,2,7904,'10.99','2005-07-28 11:25:39','2006-02-15 22:19:46'),(12896,477,1,8515,'6.99','2005-07-29 09:55:20','2006-02-15 22:19:46'),(12897,477,1,8821,'5.99','2005-07-29 22:18:12','2006-02-15 22:19:46'),(12898,477,2,8857,'2.99','2005-07-29 23:44:22','2006-02-15 22:19:46'),(12899,477,2,9446,'8.99','2005-07-30 21:53:01','2006-02-15 22:19:46'),(12900,477,1,10500,'4.99','2005-08-01 11:01:01','2006-02-15 22:19:47'),(12901,477,2,10912,'0.99','2005-08-02 02:00:03','2006-02-15 22:19:47'),(12902,477,2,12420,'4.99','2005-08-18 10:01:50','2006-02-15 22:19:47'),(12903,477,1,13002,'0.99','2005-08-19 07:37:58','2006-02-15 22:19:47'),(12904,477,2,14552,'3.99','2005-08-21 15:59:27','2006-02-15 22:19:47'),(12905,477,2,15091,'2.99','2005-08-22 11:34:43','2006-02-15 22:19:47'),(12906,477,1,15929,'2.99','2005-08-23 18:23:30','2006-02-15 22:19:47'),(12907,478,1,1708,'0.99','2005-06-16 14:08:44','2006-02-15 22:19:47'),(12908,478,2,2358,'4.99','2005-06-18 13:00:51','2006-02-15 22:19:47'),(12909,478,1,2529,'6.99','2005-06-19 01:18:27','2006-02-15 22:19:47'),(12910,478,2,2616,'8.99','2005-06-19 07:33:00','2006-02-15 22:19:47'),(12911,478,2,2765,'4.99','2005-06-19 17:34:39','2006-02-15 22:19:47'),(12912,478,2,3259,'4.99','2005-06-21 03:57:15','2006-02-15 22:19:47'),(12913,478,1,3691,'4.99','2005-07-06 09:46:12','2006-02-15 22:19:47'),(12914,478,1,5837,'4.99','2005-07-10 16:57:50','2006-02-15 22:19:47'),(12915,478,1,7522,'2.99','2005-07-27 21:11:03','2006-02-15 22:19:47'),(12916,478,2,8488,'4.99','2005-07-29 08:57:38','2006-02-15 22:19:48'),(12917,478,1,9665,'4.99','2005-07-31 06:17:33','2006-02-15 22:19:48'),(12918,478,2,10016,'4.99','2005-07-31 18:13:06','2006-02-15 22:19:48'),(12919,478,2,10127,'0.99','2005-07-31 21:39:48','2006-02-15 22:19:48'),(12920,478,1,11906,'2.99','2005-08-17 15:40:46','2006-02-15 22:19:48'),(12921,478,2,13162,'2.99','2005-08-19 13:28:26','2006-02-15 22:19:48'),(12922,478,2,13507,'4.99','2005-08-20 02:10:27','2006-02-15 22:19:48'),(12923,478,1,15027,'4.99','2005-08-22 09:03:04','2006-02-15 22:19:48'),(12924,478,2,15188,'4.99','2005-08-22 15:55:48','2006-02-15 22:19:48'),(12925,478,1,15724,'4.99','2005-08-23 11:22:09','2006-02-15 22:19:48'),(12926,479,2,132,'3.99','2005-05-25 21:46:54','2006-02-15 22:19:48'),(12927,479,1,709,'7.99','2005-05-29 03:48:01','2006-02-15 22:19:48'),(12928,479,1,1902,'2.99','2005-06-17 04:35:52','2006-02-15 22:19:48'),(12929,479,2,1947,'3.99','2005-06-17 08:02:20','2006-02-15 22:19:48'),(12930,479,2,1987,'2.99','2005-06-17 10:40:36','2006-02-15 22:19:48'),(12931,479,2,2071,'3.99','2005-06-17 16:33:17','2006-02-15 22:19:48'),(12932,479,2,2376,'2.99','2005-06-18 14:55:30','2006-02-15 22:19:48'),(12933,479,2,2764,'6.99','2005-06-19 17:27:25','2006-02-15 22:19:49'),(12934,479,2,3537,'6.99','2005-07-06 01:36:53','2006-02-15 22:19:49'),(12935,479,1,3798,'0.99','2005-07-06 14:57:53','2006-02-15 22:19:49'),(12936,479,2,4183,'8.99','2005-07-07 10:28:33','2006-02-15 22:19:49'),(12937,479,1,5481,'0.99','2005-07-09 23:51:57','2006-02-15 22:19:49'),(12938,479,1,5751,'4.99','2005-07-10 12:25:11','2006-02-15 22:19:49'),(12939,479,2,6084,'7.99','2005-07-11 05:16:20','2006-02-15 22:19:49'),(12940,479,1,6421,'1.99','2005-07-11 23:45:25','2006-02-15 22:19:49'),(12941,479,1,6597,'0.99','2005-07-12 07:37:02','2006-02-15 22:19:49'),(12942,479,2,6849,'8.99','2005-07-12 19:29:19','2006-02-15 22:19:49'),(12943,479,1,7060,'7.99','2005-07-27 03:51:04','2006-02-15 22:19:49'),(12944,479,2,7893,'2.99','2005-07-28 10:49:27','2006-02-15 22:19:49'),(12945,479,1,9347,'5.99','2005-07-30 18:16:03','2006-02-15 22:19:49'),(12946,479,1,9439,'8.99','2005-07-30 21:38:12','2006-02-15 22:19:49'),(12947,479,2,9697,'2.99','2005-07-31 07:23:11','2006-02-15 22:19:49'),(12948,479,2,9754,'7.99','2005-07-31 09:23:43','2006-02-15 22:19:49'),(12949,479,2,10303,'4.99','2005-08-01 04:13:33','2006-02-15 22:19:49'),(12950,479,2,11109,'4.99','2005-08-02 08:20:29','2006-02-15 22:19:50'),(12951,479,2,11584,'1.99','2005-08-17 02:13:26','2006-02-15 22:19:50'),(12952,479,2,11835,'4.99','2005-08-17 13:03:13','2006-02-15 22:19:50'),(12953,479,2,12401,'0.99','2005-08-18 09:20:51','2006-02-15 22:19:50'),(12954,479,2,13078,'8.99','2005-08-19 10:16:43','2006-02-15 22:19:50'),(12955,479,1,13974,'2.99','2005-08-20 18:54:59','2006-02-15 22:19:50'),(12956,479,1,12101,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:50'),(12957,480,1,518,'0.99','2005-05-28 03:18:02','2006-02-15 22:19:50'),(12958,480,1,720,'6.99','2005-05-29 05:17:30','2006-02-15 22:19:50'),(12959,480,2,822,'9.99','2005-05-29 21:36:00','2006-02-15 22:19:50'),(12960,480,1,1353,'0.99','2005-06-15 13:13:36','2006-02-15 22:19:50'),(12961,480,1,1733,'0.99','2005-06-16 15:37:07','2006-02-15 22:19:50'),(12962,480,2,3507,'7.99','2005-07-06 00:23:43','2006-02-15 22:19:50'),(12963,480,2,5633,'2.99','2005-07-10 06:22:24','2006-02-15 22:19:50'),(12964,480,1,6191,'2.99','2005-07-11 11:37:52','2006-02-15 22:19:50'),(12965,480,1,7257,'2.99','2005-07-27 11:04:17','2006-02-15 22:19:50'),(12966,480,2,7910,'9.99','2005-07-28 11:44:56','2006-02-15 22:19:50'),(12967,480,2,8847,'4.99','2005-07-29 23:13:41','2006-02-15 22:19:51'),(12968,480,1,8967,'6.99','2005-07-30 03:56:55','2006-02-15 22:19:51'),(12969,480,2,9332,'4.99','2005-07-30 17:53:39','2006-02-15 22:19:51'),(12970,480,2,10808,'1.99','2005-08-01 22:37:11','2006-02-15 22:19:51'),(12971,480,2,11017,'0.99','2005-08-02 05:19:51','2006-02-15 22:19:51'),(12972,480,1,11369,'5.99','2005-08-02 18:04:41','2006-02-15 22:19:51'),(12973,480,2,12905,'4.99','2005-08-19 04:13:37','2006-02-15 22:19:51'),(12974,480,2,13092,'0.99','2005-08-19 10:41:09','2006-02-15 22:19:51'),(12975,480,2,13131,'9.99','2005-08-19 12:08:13','2006-02-15 22:19:51'),(12976,480,1,13831,'4.99','2005-08-20 13:59:35','2006-02-15 22:19:51'),(12977,480,2,15363,'2.99','2005-08-22 21:41:40','2006-02-15 22:19:51'),(12978,480,2,15579,'4.99','2005-08-23 05:38:41','2006-02-15 22:19:51'),(12979,481,2,1109,'5.99','2005-05-31 15:12:15','2006-02-15 22:19:51'),(12980,481,2,1168,'2.99','2005-06-14 23:35:09','2006-02-15 22:19:51'),(12981,481,2,2296,'4.99','2005-06-18 08:10:42','2006-02-15 22:19:51'),(12982,481,2,3285,'4.99','2005-06-21 06:30:13','2006-02-15 22:19:51'),(12983,481,2,3293,'0.99','2005-06-21 06:59:33','2006-02-15 22:19:51'),(12984,481,1,3863,'0.99','2005-07-06 17:40:18','2006-02-15 22:19:52'),(12985,481,1,4473,'2.99','2005-07-08 00:22:10','2006-02-15 22:19:52'),(12986,481,1,4505,'1.99','2005-07-08 02:20:04','2006-02-15 22:19:52'),(12987,481,1,4532,'0.99','2005-07-08 03:30:39','2006-02-15 22:19:52'),(12988,481,1,4668,'10.99','2005-07-08 10:11:45','2006-02-15 22:19:52'),(12989,481,2,5711,'2.99','2005-07-10 10:37:20','2006-02-15 22:19:52'),(12990,481,1,6044,'0.99','2005-07-11 03:18:39','2006-02-15 22:19:52'),(12991,481,1,7228,'4.99','2005-07-27 09:55:33','2006-02-15 22:19:52'),(12992,481,2,7836,'7.99','2005-07-28 08:55:27','2006-02-15 22:19:52'),(12993,481,1,8243,'6.99','2005-07-29 00:35:33','2006-02-15 22:19:52'),(12994,481,2,8271,'6.99','2005-07-29 01:27:44','2006-02-15 22:19:52'),(12995,481,1,9481,'4.99','2005-07-30 23:26:05','2006-02-15 22:19:52'),(12996,481,1,10018,'3.99','2005-07-31 18:15:14','2006-02-15 22:19:52'),(12997,481,2,11207,'0.99','2005-08-02 12:01:30','2006-02-15 22:19:52'),(12998,481,2,11387,'2.99','2005-08-02 18:32:38','2006-02-15 22:19:52'),(12999,481,1,11752,'4.99','2005-08-17 09:10:55','2006-02-15 22:19:52'),(13000,481,1,11885,'4.99','2005-08-17 14:53:53','2006-02-15 22:19:53'),(13001,481,2,12160,'2.99','2005-08-18 00:37:59','2006-02-15 22:19:53'),(13002,481,1,12981,'4.99','2005-08-19 07:04:00','2006-02-15 22:19:53'),(13003,481,2,13497,'2.99','2005-08-20 01:46:38','2006-02-15 22:19:53'),(13004,481,2,13878,'4.99','2005-08-20 15:17:38','2006-02-15 22:19:53'),(13005,481,1,13990,'1.99','2005-08-20 19:29:23','2006-02-15 22:19:53'),(13006,481,2,14280,'4.99','2005-08-21 06:39:58','2006-02-15 22:19:53'),(13007,481,2,14584,'0.99','2005-08-21 17:15:33','2006-02-15 22:19:53'),(13008,482,1,259,'8.99','2005-05-26 15:32:46','2006-02-15 22:19:53'),(13009,482,2,680,'2.99','2005-05-28 23:27:26','2006-02-15 22:19:53'),(13010,482,2,879,'0.99','2005-05-30 05:49:42','2006-02-15 22:19:53'),(13011,482,2,3048,'2.99','2005-06-20 12:49:55','2006-02-15 22:19:53'),(13012,482,2,3255,'0.99','2005-06-21 03:39:52','2006-02-15 22:19:53'),(13013,482,2,3650,'2.99','2005-07-06 07:34:15','2006-02-15 22:19:53'),(13014,482,1,4768,'4.99','2005-07-08 15:28:20','2006-02-15 22:19:53'),(13015,482,1,5334,'4.99','2005-07-09 17:00:13','2006-02-15 22:19:53'),(13016,482,1,5466,'4.99','2005-07-09 23:03:21','2006-02-15 22:19:53'),(13017,482,2,5810,'8.99','2005-07-10 15:22:04','2006-02-15 22:19:54'),(13018,482,2,5880,'2.99','2005-07-10 19:14:58','2006-02-15 22:19:54'),(13019,482,1,6355,'8.99','2005-07-11 20:56:29','2006-02-15 22:19:54'),(13020,482,2,6447,'7.99','2005-07-12 00:45:17','2006-02-15 22:19:54'),(13021,482,2,6844,'5.99','2005-07-12 19:14:53','2006-02-15 22:19:54'),(13022,482,2,7840,'6.99','2005-07-28 09:03:02','2006-02-15 22:19:54'),(13023,482,2,8584,'2.99','2005-07-29 12:07:53','2006-02-15 22:19:54'),(13024,482,2,9874,'6.99','2005-07-31 13:32:31','2006-02-15 22:19:54'),(13025,482,2,10824,'4.99','2005-08-01 23:00:22','2006-02-15 22:19:54'),(13026,482,2,10839,'2.99','2005-08-01 23:37:39','2006-02-15 22:19:54'),(13027,482,2,11498,'6.99','2005-08-16 22:52:54','2006-02-15 22:19:54'),(13028,482,1,13174,'4.99','2005-08-19 13:52:50','2006-02-15 22:19:54'),(13029,482,2,14383,'4.99','2005-08-21 10:02:05','2006-02-15 22:19:54'),(13030,482,2,14732,'0.99','2005-08-21 22:22:29','2006-02-15 22:19:54'),(13031,482,2,14891,'6.99','2005-08-22 04:11:02','2006-02-15 22:19:54'),(13032,482,2,14995,'4.99','2005-08-22 07:52:31','2006-02-15 22:19:54'),(13033,482,1,15391,'0.99','2005-08-22 23:01:45','2006-02-15 22:19:54'),(13034,482,1,15849,'5.99','2005-08-23 15:41:20','2006-02-15 22:19:55'),(13035,482,2,15865,'2.99','2005-08-23 16:18:25','2006-02-15 22:19:55'),(13036,482,1,15879,'3.99','2005-08-23 16:42:53','2006-02-15 22:19:55'),(13037,483,2,742,'6.99','2005-05-29 08:36:30','2006-02-15 22:19:55'),(13038,483,1,2855,'4.99','2005-06-19 23:11:49','2006-02-15 22:19:55'),(13039,483,2,2867,'0.99','2005-06-20 00:08:38','2006-02-15 22:19:55'),(13040,483,1,3380,'8.99','2005-06-21 13:58:46','2006-02-15 22:19:55'),(13041,483,2,3559,'4.99','2005-07-06 02:49:42','2006-02-15 22:19:55'),(13042,483,1,5823,'4.99','2005-07-10 16:19:52','2006-02-15 22:19:55'),(13043,483,2,6478,'4.99','2005-07-12 01:41:44','2006-02-15 22:19:55'),(13044,483,2,6899,'9.99','2005-07-12 21:44:16','2006-02-15 22:19:55'),(13045,483,2,7137,'0.99','2005-07-27 06:40:41','2006-02-15 22:19:55'),(13046,483,1,7381,'4.99','2005-07-27 15:40:26','2006-02-15 22:19:55'),(13047,483,1,7669,'4.99','2005-07-28 02:44:07','2006-02-15 22:19:55'),(13048,483,1,8057,'7.99','2005-07-28 17:07:13','2006-02-15 22:19:55'),(13049,483,1,8356,'4.99','2005-07-29 04:58:56','2006-02-15 22:19:55'),(13050,483,2,10677,'0.99','2005-08-01 17:24:35','2006-02-15 22:19:55'),(13051,483,1,10953,'6.99','2005-08-02 03:28:38','2006-02-15 22:19:56'),(13052,483,2,12331,'3.99','2005-08-18 06:47:19','2006-02-15 22:19:56'),(13053,483,2,12695,'2.99','2005-08-18 20:11:35','2006-02-15 22:19:56'),(13054,483,2,12875,'2.99','2005-08-19 03:10:21','2006-02-15 22:19:56'),(13055,484,2,35,'4.99','2005-05-25 04:24:36','2006-02-15 22:19:56'),(13056,484,2,668,'2.99','2005-05-28 21:54:45','2006-02-15 22:19:56'),(13057,484,2,727,'2.99','2005-05-29 06:08:15','2006-02-15 22:19:56'),(13058,484,1,1351,'3.99','2005-06-15 12:51:03','2006-02-15 22:19:56'),(13059,484,2,1643,'3.99','2005-06-16 08:55:35','2006-02-15 22:19:56'),(13060,484,1,2015,'4.99','2005-06-17 12:16:29','2006-02-15 22:19:56'),(13061,484,1,2044,'5.99','2005-06-17 14:37:57','2006-02-15 22:19:56'),(13062,484,1,4214,'4.99','2005-07-07 11:54:33','2006-02-15 22:19:56'),(13063,484,1,5389,'2.99','2005-07-09 19:25:45','2006-02-15 22:19:56'),(13064,484,2,5708,'6.99','2005-07-10 10:29:19','2006-02-15 22:19:56'),(13065,484,1,5852,'0.99','2005-07-10 17:43:30','2006-02-15 22:19:56'),(13066,484,2,5866,'6.99','2005-07-10 18:35:14','2006-02-15 22:19:56'),(13067,484,2,5977,'5.99','2005-07-11 00:16:38','2006-02-15 22:19:56'),(13068,484,2,6296,'2.99','2005-07-11 17:34:04','2006-02-15 22:19:57'),(13069,484,1,6863,'6.99','2005-07-12 19:58:34','2006-02-15 22:19:57'),(13070,484,2,7440,'4.99','2005-07-27 17:43:27','2006-02-15 22:19:57'),(13071,484,2,7548,'2.99','2005-07-27 21:53:18','2006-02-15 22:19:57'),(13072,484,2,8508,'0.99','2005-07-29 09:34:38','2006-02-15 22:19:57'),(13073,484,2,9141,'5.99','2005-07-30 10:16:04','2006-02-15 22:19:57'),(13074,484,2,9414,'9.99','2005-07-30 20:46:02','2006-02-15 22:19:57'),(13075,484,1,9769,'4.99','2005-07-31 09:52:16','2006-02-15 22:19:57'),(13076,484,2,10166,'8.99','2005-07-31 23:22:20','2006-02-15 22:19:57'),(13077,484,2,11871,'4.99','2005-08-17 14:11:44','2006-02-15 22:19:57'),(13078,484,1,12024,'0.99','2005-08-17 19:57:34','2006-02-15 22:19:57'),(13079,484,1,12771,'4.99','2005-08-18 23:29:23','2006-02-15 22:19:57'),(13080,484,1,12993,'7.99','2005-08-19 07:24:03','2006-02-15 22:19:57'),(13081,484,2,13160,'0.99','2005-08-19 13:21:04','2006-02-15 22:19:57'),(13082,484,2,13956,'3.99','2005-08-20 18:08:19','2006-02-15 22:19:57'),(13083,484,1,15607,'2.99','2005-08-23 06:54:06','2006-02-15 22:19:57'),(13084,484,1,16026,'4.99','2005-08-23 21:49:22','2006-02-15 22:19:58'),(13085,485,1,1009,'2.99','2005-05-31 01:47:35','2006-02-15 22:19:58'),(13086,485,2,1684,'2.99','2005-06-16 11:57:34','2006-02-15 22:19:58'),(13087,485,1,1721,'8.99','2005-06-16 15:01:36','2006-02-15 22:19:58'),(13088,485,2,3579,'0.99','2005-07-06 03:47:47','2006-02-15 22:19:58'),(13089,485,1,3899,'1.99','2005-07-06 19:12:40','2006-02-15 22:19:58'),(13090,485,1,3904,'0.99','2005-07-06 19:30:57','2006-02-15 22:19:58'),(13091,485,2,4137,'3.99','2005-07-07 08:17:06','2006-02-15 22:19:58'),(13092,485,2,4667,'2.99','2005-07-08 10:06:26','2006-02-15 22:19:58'),(13093,485,1,5193,'2.99','2005-07-09 10:28:18','2006-02-15 22:19:58'),(13094,485,1,5343,'3.99','2005-07-09 17:23:43','2006-02-15 22:19:58'),(13095,485,1,5367,'3.99','2005-07-09 18:39:15','2006-02-15 22:19:58'),(13096,485,1,5820,'4.99','2005-07-10 16:04:59','2006-02-15 22:19:58'),(13097,485,2,6810,'4.99','2005-07-12 17:54:19','2006-02-15 22:19:58'),(13098,485,2,6902,'4.99','2005-07-12 21:57:16','2006-02-15 22:19:58'),(13099,485,1,7144,'4.99','2005-07-27 07:00:37','2006-02-15 22:19:58'),(13100,485,2,8984,'6.99','2005-07-30 04:31:50','2006-02-15 22:19:58'),(13101,485,2,9039,'2.99','2005-07-30 06:24:28','2006-02-15 22:19:59'),(13102,485,1,9053,'4.99','2005-07-30 07:07:39','2006-02-15 22:19:59'),(13103,485,2,9189,'2.99','2005-07-30 12:20:59','2006-02-15 22:19:59'),(13104,485,1,9535,'2.99','2005-07-31 01:18:53','2006-02-15 22:19:59'),(13105,485,1,9565,'0.99','2005-07-31 02:32:00','2006-02-15 22:19:59'),(13106,485,1,10771,'4.99','2005-08-01 20:49:35','2006-02-15 22:19:59'),(13107,485,2,10772,'6.99','2005-08-01 20:51:10','2006-02-15 22:19:59'),(13108,485,2,11188,'3.99','2005-08-02 11:17:11','2006-02-15 22:19:59'),(13109,485,1,11921,'4.99','2005-08-17 16:12:27','2006-02-15 22:19:59'),(13110,485,1,11974,'2.99','2005-08-17 17:56:48','2006-02-15 22:19:59'),(13111,485,2,12261,'8.99','2005-08-18 04:16:06','2006-02-15 22:19:59'),(13112,485,2,12487,'0.99','2005-08-18 12:45:24','2006-02-15 22:19:59'),(13113,485,2,13055,'2.99','2005-08-19 09:36:28','2006-02-15 22:19:59'),(13114,486,1,909,'8.99','2005-05-30 10:43:38','2006-02-15 22:19:59'),(13115,486,2,946,'2.99','2005-05-30 15:35:08','2006-02-15 22:19:59'),(13116,486,2,1129,'0.99','2005-05-31 18:00:48','2006-02-15 22:19:59'),(13117,486,1,2036,'4.99','2005-06-17 13:46:52','2006-02-15 22:20:00'),(13118,486,1,2102,'5.99','2005-06-17 19:05:22','2006-02-15 22:20:00'),(13119,486,2,2566,'2.99','2005-06-19 03:45:39','2006-02-15 22:20:00'),(13120,486,2,2797,'2.99','2005-06-19 19:04:32','2006-02-15 22:20:00'),(13121,486,1,3835,'4.99','2005-07-06 16:22:45','2006-02-15 22:20:00'),(13122,486,2,4110,'4.99','2005-07-07 06:44:27','2006-02-15 22:20:00'),(13123,486,1,4205,'4.99','2005-07-07 11:25:39','2006-02-15 22:20:00'),(13124,486,1,4381,'2.99','2005-07-07 20:37:53','2006-02-15 22:20:00'),(13125,486,1,4772,'7.99','2005-07-08 15:41:11','2006-02-15 22:20:00'),(13126,486,2,5006,'4.99','2005-07-09 01:24:07','2006-02-15 22:20:00'),(13127,486,2,6383,'4.99','2005-07-11 22:06:53','2006-02-15 22:20:00'),(13128,486,2,7127,'4.99','2005-07-27 06:13:48','2006-02-15 22:20:00'),(13129,486,2,7446,'4.99','2005-07-27 18:00:24','2006-02-15 22:20:00'),(13130,486,2,8425,'8.99','2005-07-29 07:06:21','2006-02-15 22:20:00'),(13131,486,2,9142,'0.99','2005-07-30 10:21:03','2006-02-15 22:20:00'),(13132,486,1,10079,'2.99','2005-07-31 20:05:45','2006-02-15 22:20:00'),(13133,486,2,10902,'4.99','2005-08-02 01:35:46','2006-02-15 22:20:00'),(13134,486,1,12465,'0.99','2005-08-18 11:35:02','2006-02-15 22:20:01'),(13135,486,2,12609,'2.99','2005-08-18 17:06:22','2006-02-15 22:20:01'),(13136,486,1,13048,'4.99','2005-08-19 09:25:06','2006-02-15 22:20:01'),(13137,486,2,13803,'0.99','2005-08-20 12:46:17','2006-02-15 22:20:01'),(13138,486,2,14251,'4.99','2005-08-21 05:42:20','2006-02-15 22:20:01'),(13139,486,2,14284,'4.99','2005-08-21 06:44:37','2006-02-15 22:20:01'),(13140,487,2,3100,'3.99','2005-06-20 16:47:57','2006-02-15 22:20:01'),(13141,487,2,3994,'1.99','2005-07-06 23:39:01','2006-02-15 22:20:01'),(13142,487,2,4854,'2.99','2005-07-08 18:44:44','2006-02-15 22:20:01'),(13143,487,1,5634,'3.99','2005-07-10 06:25:48','2006-02-15 22:20:01'),(13144,487,1,6928,'2.99','2005-07-26 22:56:21','2006-02-15 22:20:01'),(13145,487,1,7097,'2.99','2005-07-27 04:56:09','2006-02-15 22:20:01'),(13146,487,1,7788,'0.99','2005-07-28 07:21:55','2006-02-15 22:20:01'),(13147,487,2,7949,'4.99','2005-07-28 13:07:24','2006-02-15 22:20:01'),(13148,487,2,8510,'1.99','2005-07-29 09:41:38','2006-02-15 22:20:01'),(13149,487,2,8689,'2.99','2005-07-29 16:38:58','2006-02-15 22:20:01'),(13150,487,1,8814,'4.99','2005-07-29 21:49:43','2006-02-15 22:20:01'),(13151,487,1,8988,'7.99','2005-07-30 04:38:49','2006-02-15 22:20:02'),(13152,487,2,9457,'2.99','2005-07-30 22:23:05','2006-02-15 22:20:02'),(13153,487,1,9490,'3.99','2005-07-30 23:45:09','2006-02-15 22:20:02'),(13154,487,2,10123,'0.99','2005-07-31 21:30:46','2006-02-15 22:20:02'),(13155,487,2,10511,'2.99','2005-08-01 11:32:16','2006-02-15 22:20:02'),(13156,487,2,10555,'6.99','2005-08-01 12:56:38','2006-02-15 22:20:02'),(13157,487,1,10832,'6.99','2005-08-01 23:24:53','2006-02-15 22:20:02'),(13158,487,2,10877,'5.99','2005-08-02 00:32:04','2006-02-15 22:20:02'),(13159,487,1,10978,'9.99','2005-08-02 04:12:27','2006-02-15 22:20:02'),(13160,487,1,11669,'5.99','2005-08-17 05:48:51','2006-02-15 22:20:02'),(13161,487,2,11890,'5.99','2005-08-17 15:08:43','2006-02-15 22:20:02'),(13162,487,1,12493,'7.99','2005-08-18 12:53:38','2006-02-15 22:20:02'),(13163,487,2,13210,'4.99','2005-08-19 15:23:38','2006-02-15 22:20:02'),(13164,487,1,13658,'7.99','2005-08-20 08:02:22','2006-02-15 22:20:02'),(13165,487,2,15665,'2.99','2005-08-23 08:59:12','2006-02-15 22:20:02'),(13166,488,2,1655,'3.99','2005-06-16 09:51:39','2006-02-15 22:20:02'),(13167,488,2,1704,'5.99','2005-06-16 13:45:56','2006-02-15 22:20:02'),(13168,488,2,4133,'6.99','2005-07-07 08:12:26','2006-02-15 22:20:03'),(13169,488,2,4233,'5.99','2005-07-07 13:00:20','2006-02-15 22:20:03'),(13170,488,1,5141,'8.99','2005-07-09 08:05:14','2006-02-15 22:20:03'),(13171,488,2,6548,'5.99','2005-07-12 05:00:46','2006-02-15 22:20:03'),(13172,488,1,7373,'5.99','2005-07-27 15:19:33','2006-02-15 22:20:03'),(13173,488,1,8005,'2.99','2005-07-28 15:15:11','2006-02-15 22:20:03'),(13174,488,2,8050,'0.99','2005-07-28 16:55:47','2006-02-15 22:20:03'),(13175,488,2,8064,'2.99','2005-07-28 17:15:38','2006-02-15 22:20:03'),(13176,488,2,9083,'5.99','2005-07-30 08:14:27','2006-02-15 22:20:03'),(13177,488,1,9532,'2.99','2005-07-31 01:16:51','2006-02-15 22:20:03'),(13178,488,1,9537,'0.99','2005-07-31 01:23:00','2006-02-15 22:20:03'),(13179,488,2,10474,'5.99','2005-08-01 10:01:42','2006-02-15 22:20:03'),(13180,488,1,10767,'0.99','2005-08-01 20:37:23','2006-02-15 22:20:03'),(13181,488,1,11774,'3.99','2005-08-17 10:20:39','2006-02-15 22:20:03'),(13182,488,2,12483,'5.99','2005-08-18 12:38:37','2006-02-15 22:20:03'),(13183,488,2,13446,'4.99','2005-08-20 00:06:13','2006-02-15 22:20:03'),(13184,488,2,14948,'5.99','2005-08-22 06:10:53','2006-02-15 22:20:04'),(13185,488,2,15259,'0.99','2005-08-22 18:23:23','2006-02-15 22:20:04'),(13186,488,1,15350,'2.99','2005-08-22 21:15:29','2006-02-15 22:20:04'),(13187,488,2,15499,'2.99','2005-08-23 02:37:19','2006-02-15 22:20:04'),(13188,489,1,219,'4.99','2005-05-26 09:41:45','2006-02-15 22:20:04'),(13189,489,2,513,'2.99','2005-05-28 03:08:10','2006-02-15 22:20:04'),(13190,489,2,1614,'3.99','2005-06-16 06:58:02','2006-02-15 22:20:04'),(13191,489,1,2201,'0.99','2005-06-18 02:08:27','2006-02-15 22:20:04'),(13192,489,1,2370,'7.99','2005-06-18 14:29:54','2006-02-15 22:20:04'),(13193,489,1,2802,'4.99','2005-06-19 19:18:17','2006-02-15 22:20:04'),(13194,489,2,3816,'2.99','2005-07-06 15:27:04','2006-02-15 22:20:04'),(13195,489,1,4774,'3.99','2005-07-08 15:42:28','2006-02-15 22:20:04'),(13196,489,1,6963,'4.99','2005-07-27 00:13:02','2006-02-15 22:20:04'),(13197,489,2,9231,'0.99','2005-07-30 13:42:15','2006-02-15 22:20:04'),(13198,489,1,9459,'4.99','2005-07-30 22:24:46','2006-02-15 22:20:04'),(13199,489,2,11119,'9.99','2005-08-02 08:44:44','2006-02-15 22:20:04'),(13200,489,1,11705,'4.99','2005-08-17 07:22:25','2006-02-15 22:20:04'),(13201,489,1,12496,'6.99','2005-08-18 12:58:25','2006-02-15 22:20:05'),(13202,489,2,12701,'6.99','2005-08-18 20:26:47','2006-02-15 22:20:05'),(13203,489,1,13462,'4.99','2005-08-20 00:49:19','2006-02-15 22:20:05'),(13204,489,2,14095,'5.99','2005-08-21 00:25:45','2006-02-15 22:20:05'),(13205,489,2,14328,'2.99','2005-08-21 08:18:20','2006-02-15 22:20:05'),(13206,489,2,14424,'6.99','2005-08-21 11:24:11','2006-02-15 22:20:05'),(13207,489,1,15205,'0.99','2005-08-22 16:32:23','2006-02-15 22:20:05'),(13208,489,1,15981,'4.99','2005-08-23 20:12:17','2006-02-15 22:20:05'),(13209,490,2,585,'6.99','2005-05-28 11:50:45','2006-02-15 22:20:05'),(13210,490,2,676,'4.99','2005-05-28 22:27:51','2006-02-15 22:20:05'),(13211,490,1,1665,'3.99','2005-06-16 10:16:02','2006-02-15 22:20:05'),(13212,490,1,3476,'4.99','2005-07-05 23:02:37','2006-02-15 22:20:05'),(13213,490,2,3932,'4.99','2005-07-06 21:06:17','2006-02-15 22:20:05'),(13214,490,1,4083,'2.99','2005-07-07 05:13:15','2006-02-15 22:20:05'),(13215,490,1,4906,'5.99','2005-07-08 20:59:13','2006-02-15 22:20:05'),(13216,490,2,5173,'7.99','2005-07-09 09:31:44','2006-02-15 22:20:05'),(13217,490,2,5489,'0.99','2005-07-10 00:07:03','2006-02-15 22:20:06'),(13218,490,1,5654,'4.99','2005-07-10 07:24:46','2006-02-15 22:20:06'),(13219,490,2,6230,'2.99','2005-07-11 14:02:19','2006-02-15 22:20:06'),(13220,490,1,6803,'4.99','2005-07-12 17:21:49','2006-02-15 22:20:06'),(13221,490,2,6888,'2.99','2005-07-12 21:01:11','2006-02-15 22:20:06'),(13222,490,2,6923,'8.99','2005-07-12 22:40:48','2006-02-15 22:20:06'),(13223,490,1,8552,'5.99','2005-07-29 11:14:02','2006-02-15 22:20:06'),(13224,490,2,9108,'4.99','2005-07-30 08:56:36','2006-02-15 22:20:06'),(13225,490,1,9554,'0.99','2005-07-31 02:06:49','2006-02-15 22:20:06'),(13226,490,1,10786,'7.99','2005-08-01 21:29:34','2006-02-15 22:20:06'),(13227,490,1,10955,'7.99','2005-08-02 03:32:34','2006-02-15 22:20:06'),(13228,490,2,11965,'2.99','2005-08-17 17:39:45','2006-02-15 22:20:06'),(13229,490,2,14557,'4.99','2005-08-21 16:05:11','2006-02-15 22:20:06'),(13230,490,2,14761,'6.99','2005-08-21 23:30:28','2006-02-15 22:20:06'),(13231,490,2,15276,'2.99','2005-08-22 18:59:01','2006-02-15 22:20:06'),(13232,490,1,15448,'2.99','2005-08-23 00:55:24','2006-02-15 22:20:06'),(13233,491,1,484,'2.99','2005-05-27 23:26:45','2006-02-15 22:20:06'),(13234,491,2,1097,'0.99','2005-05-31 13:38:42','2006-02-15 22:20:07'),(13235,491,2,1198,'2.99','2005-06-15 01:48:58','2006-02-15 22:20:07'),(13236,491,1,1371,'4.99','2005-06-15 14:38:15','2006-02-15 22:20:07'),(13237,491,2,2026,'4.99','2005-06-17 13:05:38','2006-02-15 22:20:07'),(13238,491,1,2259,'4.99','2005-06-18 05:37:45','2006-02-15 22:20:07'),(13239,491,2,2391,'4.99','2005-06-18 15:33:30','2006-02-15 22:20:07'),(13240,491,2,3031,'4.99','2005-06-20 11:52:49','2006-02-15 22:20:07'),(13241,491,1,3440,'3.99','2005-06-21 19:58:18','2006-02-15 22:20:07'),(13242,491,1,4046,'8.99','2005-07-07 03:27:59','2006-02-15 22:20:07'),(13243,491,1,4392,'2.99','2005-07-07 21:11:02','2006-02-15 22:20:07'),(13244,491,2,5134,'6.99','2005-07-09 07:53:12','2006-02-15 22:20:07'),(13245,491,1,5889,'4.99','2005-07-10 19:54:41','2006-02-15 22:20:07'),(13246,491,2,6171,'2.99','2005-07-11 10:29:35','2006-02-15 22:20:07'),(13247,491,2,7019,'3.99','2005-07-27 02:20:26','2006-02-15 22:20:07'),(13248,491,2,7281,'6.99','2005-07-27 11:59:20','2006-02-15 22:20:07'),(13249,491,2,7688,'7.99','2005-07-28 03:20:47','2006-02-15 22:20:07'),(13250,491,1,7871,'6.99','2005-07-28 10:16:37','2006-02-15 22:20:08'),(13251,491,2,10036,'2.99','2005-07-31 18:47:20','2006-02-15 22:20:08'),(13252,491,2,10178,'4.99','2005-07-31 23:43:04','2006-02-15 22:20:08'),(13253,491,2,10974,'6.99','2005-08-02 04:10:52','2006-02-15 22:20:08'),(13254,491,1,11048,'4.99','2005-08-02 06:15:07','2006-02-15 22:20:08'),(13255,491,1,11590,'0.99','2005-08-17 02:28:33','2006-02-15 22:20:08'),(13256,491,1,11840,'4.99','2005-08-17 13:09:01','2006-02-15 22:20:08'),(13257,491,2,13607,'2.99','2005-08-20 06:08:42','2006-02-15 22:20:08'),(13258,491,1,14780,'0.99','2005-08-22 00:06:33','2006-02-15 22:20:08'),(13259,491,2,15685,'5.99','2005-08-23 09:41:28','2006-02-15 22:20:08'),(13260,492,1,84,'2.99','2005-05-25 12:36:30','2006-02-15 22:20:08'),(13261,492,2,1691,'1.99','2005-06-16 12:24:28','2006-02-15 22:20:08'),(13262,492,2,1855,'4.99','2005-06-17 00:54:58','2006-02-15 22:20:08'),(13263,492,2,1956,'4.99','2005-06-17 08:43:32','2006-02-15 22:20:08'),(13264,492,1,3298,'9.99','2005-06-21 07:09:44','2006-02-15 22:20:08'),(13265,492,2,4128,'8.99','2005-07-07 07:35:25','2006-02-15 22:20:08'),(13266,492,1,4142,'2.99','2005-07-07 08:19:45','2006-02-15 22:20:08'),(13267,492,2,4258,'6.99','2005-07-07 14:20:59','2006-02-15 22:20:09'),(13268,492,2,5325,'0.99','2005-07-09 16:35:47','2006-02-15 22:20:09'),(13269,492,1,5609,'0.99','2005-07-10 05:09:46','2006-02-15 22:20:09'),(13270,492,1,6257,'2.99','2005-07-11 15:23:46','2006-02-15 22:20:09'),(13271,492,2,7203,'2.99','2005-07-27 09:01:23','2006-02-15 22:20:09'),(13272,492,2,12971,'4.99','2005-08-19 06:42:43','2006-02-15 22:20:09'),(13273,492,1,14255,'2.99','2005-08-21 05:51:37','2006-02-15 22:20:09'),(13274,492,2,15822,'0.99','2005-08-23 15:05:59','2006-02-15 22:20:09'),(13275,492,1,15958,'4.99','2005-08-23 19:22:36','2006-02-15 22:20:09'),(13276,493,1,543,'7.99','2005-05-28 06:43:34','2006-02-15 22:20:09'),(13277,493,2,2109,'3.99','2005-06-17 19:41:42','2006-02-15 22:20:09'),(13278,493,1,2365,'4.99','2005-06-18 13:45:34','2006-02-15 22:20:09'),(13279,493,1,2579,'0.99','2005-06-19 04:40:44','2006-02-15 22:20:09'),(13280,493,1,2864,'2.99','2005-06-20 00:00:52','2006-02-15 22:20:09'),(13281,493,2,3586,'4.99','2005-07-06 04:24:42','2006-02-15 22:20:09'),(13282,493,1,3655,'5.99','2005-07-06 07:52:54','2006-02-15 22:20:09'),(13283,493,1,6549,'7.99','2005-07-12 05:02:01','2006-02-15 22:20:10'),(13284,493,1,6552,'4.99','2005-07-12 05:05:06','2006-02-15 22:20:10'),(13285,493,1,7026,'2.99','2005-07-27 02:48:58','2006-02-15 22:20:10'),(13286,493,2,7043,'7.99','2005-07-27 03:24:23','2006-02-15 22:20:10'),(13287,493,1,8298,'4.99','2005-07-29 02:47:36','2006-02-15 22:20:10'),(13288,493,1,8616,'2.99','2005-07-29 13:39:09','2006-02-15 22:20:10'),(13289,493,1,10777,'6.99','2005-08-01 21:03:50','2006-02-15 22:20:10'),(13290,493,2,10885,'7.99','2005-08-02 00:51:37','2006-02-15 22:20:10'),(13291,493,1,13638,'2.99','2005-08-20 07:21:15','2006-02-15 22:20:10'),(13292,493,2,13675,'6.99','2005-08-20 08:32:51','2006-02-15 22:20:10'),(13293,493,1,14117,'4.99','2005-08-21 01:11:59','2006-02-15 22:20:10'),(13294,493,2,15177,'4.99','2005-08-22 15:34:49','2006-02-15 22:20:10'),(13295,493,1,15355,'0.99','2005-08-22 21:19:24','2006-02-15 22:20:10'),(13296,493,1,15490,'6.99','2005-08-23 02:08:18','2006-02-15 22:20:10'),(13297,493,2,15878,'2.99','2005-08-23 16:34:31','2006-02-15 22:20:10'),(13298,493,2,14160,'2.99','2006-02-14 15:16:03','2006-02-15 22:20:10'),(13299,494,1,608,'4.99','2005-05-28 15:03:44','2006-02-15 22:20:10'),(13300,494,1,1683,'2.99','2005-06-16 11:54:55','2006-02-15 22:20:11'),(13301,494,1,3511,'0.99','2005-07-06 00:42:01','2006-02-15 22:20:11'),(13302,494,2,3803,'2.99','2005-07-06 15:06:55','2006-02-15 22:20:11'),(13303,494,2,3913,'0.99','2005-07-06 20:11:00','2006-02-15 22:20:11'),(13304,494,1,4086,'3.99','2005-07-07 05:26:06','2006-02-15 22:20:11'),(13305,494,2,4397,'5.99','2005-07-07 21:14:54','2006-02-15 22:20:11'),(13306,494,2,4551,'7.99','2005-07-08 04:36:21','2006-02-15 22:20:11'),(13307,494,2,5083,'4.99','2005-07-09 05:30:32','2006-02-15 22:20:11'),(13308,494,1,5180,'2.99','2005-07-09 10:06:53','2006-02-15 22:20:11'),(13309,494,2,7258,'3.99','2005-07-27 11:05:54','2006-02-15 22:20:11'),(13310,494,2,7546,'8.99','2005-07-27 21:50:09','2006-02-15 22:20:11'),(13311,494,2,7737,'1.99','2005-07-28 05:15:03','2006-02-15 22:20:11'),(13312,494,2,8333,'2.99','2005-07-29 04:16:40','2006-02-15 22:20:11'),(13313,494,2,8895,'2.99','2005-07-30 00:49:17','2006-02-15 22:20:11'),(13314,494,1,8934,'4.99','2005-07-30 02:37:05','2006-02-15 22:20:11'),(13315,494,2,9012,'4.99','2005-07-30 05:18:57','2006-02-15 22:20:11'),(13316,494,2,9510,'7.99','2005-07-31 00:24:17','2006-02-15 22:20:12'),(13317,494,1,9799,'2.99','2005-07-31 10:58:32','2006-02-15 22:20:12'),(13318,494,2,9943,'7.99','2005-07-31 15:37:29','2006-02-15 22:20:12'),(13319,494,1,10403,'0.99','2005-08-01 07:30:45','2006-02-15 22:20:12'),(13320,494,1,10623,'2.99','2005-08-01 15:22:38','2006-02-15 22:20:12'),(13321,494,2,11152,'3.99','2005-08-02 09:53:36','2006-02-15 22:20:12'),(13322,494,1,11987,'5.99','2005-08-17 18:21:59','2006-02-15 22:20:12'),(13323,494,2,13094,'0.99','2005-08-19 10:47:58','2006-02-15 22:20:12'),(13324,494,2,13301,'3.99','2005-08-19 18:53:15','2006-02-15 22:20:12'),(13325,494,2,14634,'5.99','2005-08-21 18:51:28','2006-02-15 22:20:12'),(13326,494,1,14832,'4.99','2005-08-22 01:43:29','2006-02-15 22:20:12'),(13327,494,1,15086,'6.99','2005-08-22 11:21:08','2006-02-15 22:20:12'),(13328,494,2,15156,'9.99','2005-08-22 14:29:11','2006-02-15 22:20:12'),(13329,494,2,15291,'4.99','2005-08-22 19:28:04','2006-02-15 22:20:12'),(13330,495,2,623,'4.99','2005-05-28 16:01:28','2006-02-15 22:20:12'),(13331,495,2,741,'4.99','2005-05-29 08:35:49','2006-02-15 22:20:12'),(13332,495,2,2074,'2.99','2005-06-17 16:40:03','2006-02-15 22:20:13'),(13333,495,1,2349,'4.99','2005-06-18 12:25:14','2006-02-15 22:20:13'),(13334,495,1,2549,'7.99','2005-06-19 02:46:39','2006-02-15 22:20:13'),(13335,495,1,3129,'3.99','2005-06-20 18:57:48','2006-02-15 22:20:13'),(13336,495,2,3966,'2.99','2005-07-06 22:38:49','2006-02-15 22:20:13'),(13337,495,2,5484,'7.99','2005-07-09 23:54:37','2006-02-15 22:20:13'),(13338,495,2,6426,'7.99','2005-07-11 23:56:38','2006-02-15 22:20:13'),(13339,495,2,7191,'2.99','2005-07-27 08:36:15','2006-02-15 22:20:13'),(13340,495,1,8151,'0.99','2005-07-28 20:50:52','2006-02-15 22:20:13'),(13341,495,1,8383,'1.99','2005-07-29 05:36:47','2006-02-15 22:20:13'),(13342,495,1,8451,'5.99','2005-07-29 07:44:56','2006-02-15 22:20:13'),(13343,495,1,8672,'5.99','2005-07-29 15:49:48','2006-02-15 22:20:13'),(13344,495,1,9387,'9.99','2005-07-30 19:27:05','2006-02-15 22:20:13'),(13345,495,1,9741,'4.99','2005-07-31 09:09:22','2006-02-15 22:20:13'),(13346,495,2,10065,'4.99','2005-07-31 19:27:34','2006-02-15 22:20:13'),(13347,495,2,10643,'5.99','2005-08-01 15:48:33','2006-02-15 22:20:13'),(13348,495,1,10783,'4.99','2005-08-01 21:23:37','2006-02-15 22:20:13'),(13349,495,1,12782,'5.99','2005-08-18 23:56:23','2006-02-15 22:20:14'),(13350,495,2,12837,'0.99','2005-08-19 01:51:09','2006-02-15 22:20:14'),(13351,495,2,13205,'3.99','2005-08-19 15:05:26','2006-02-15 22:20:14'),(13352,495,2,13445,'2.99','2005-08-20 00:05:33','2006-02-15 22:20:14'),(13353,495,2,13818,'4.99','2005-08-20 13:20:09','2006-02-15 22:20:14'),(13354,495,1,15984,'2.99','2005-08-23 20:16:27','2006-02-15 22:20:14'),(13355,495,2,13753,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:14'),(13356,496,2,322,'4.99','2005-05-27 00:47:35','2006-02-15 22:20:14'),(13357,496,2,966,'0.99','2005-05-30 19:00:37','2006-02-15 22:20:14'),(13358,496,1,2567,'2.99','2005-06-19 04:04:46','2006-02-15 22:20:14'),(13359,496,2,3569,'3.99','2005-07-06 03:17:23','2006-02-15 22:20:14'),(13360,496,1,4070,'2.99','2005-07-07 04:37:09','2006-02-15 22:20:14'),(13361,496,1,4261,'4.99','2005-07-07 14:23:56','2006-02-15 22:20:14'),(13362,496,1,4269,'0.99','2005-07-07 14:38:33','2006-02-15 22:20:14'),(13363,496,1,5559,'5.99','2005-07-10 03:13:07','2006-02-15 22:20:14'),(13364,496,2,5949,'4.99','2005-07-10 23:13:00','2006-02-15 22:20:14'),(13365,496,1,7133,'2.99','2005-07-27 06:29:23','2006-02-15 22:20:15'),(13366,496,2,8221,'2.99','2005-07-28 23:47:19','2006-02-15 22:20:15'),(13367,496,1,11060,'7.99','2005-08-02 06:48:18','2006-02-15 22:20:15'),(13368,496,2,11448,'4.99','2005-08-02 20:44:33','2006-02-15 22:20:15'),(13369,496,1,11893,'3.99','2005-08-17 15:13:29','2006-02-15 22:20:15'),(13370,496,2,12605,'4.99','2005-08-18 16:59:37','2006-02-15 22:20:15'),(13371,496,1,13569,'5.99','2005-08-20 05:02:59','2006-02-15 22:20:15'),(13372,496,2,14013,'6.99','2005-08-20 20:42:50','2006-02-15 22:20:15'),(13373,496,1,14332,'7.99','2005-08-21 08:30:43','2006-02-15 22:20:15'),(13374,496,1,14348,'0.99','2005-08-21 08:54:26','2006-02-15 22:20:15'),(13375,496,2,15750,'2.99','2005-08-23 12:36:05','2006-02-15 22:20:15'),(13376,496,1,13182,'2.99','2006-02-14 15:16:03','2006-02-15 22:20:15'),(13377,497,1,1100,'7.99','2005-05-31 14:03:21','2006-02-15 22:20:15'),(13378,497,2,2180,'8.99','2005-06-18 00:47:43','2006-02-15 22:20:15'),(13379,497,1,2298,'5.99','2005-06-18 08:18:29','2006-02-15 22:20:15'),(13380,497,1,2406,'2.99','2005-06-18 16:39:37','2006-02-15 22:20:15'),(13381,497,2,2818,'4.99','2005-06-19 20:05:52','2006-02-15 22:20:16'),(13382,497,1,3696,'2.99','2005-07-06 10:04:55','2006-02-15 22:20:16'),(13383,497,2,4218,'7.99','2005-07-07 12:10:24','2006-02-15 22:20:16'),(13384,497,1,4516,'4.99','2005-07-08 02:43:41','2006-02-15 22:20:16'),(13385,497,1,4578,'0.99','2005-07-08 06:00:17','2006-02-15 22:20:16'),(13386,497,2,4795,'0.99','2005-07-08 16:32:54','2006-02-15 22:20:16'),(13387,497,1,5030,'4.99','2005-07-09 02:35:43','2006-02-15 22:20:16'),(13388,497,1,5239,'4.99','2005-07-09 13:12:35','2006-02-15 22:20:16'),(13389,497,2,7603,'2.99','2005-07-27 23:54:44','2006-02-15 22:20:16'),(13390,497,2,8011,'2.99','2005-07-28 15:26:39','2006-02-15 22:20:16'),(13391,497,1,8150,'6.99','2005-07-28 20:50:41','2006-02-15 22:20:16'),(13392,497,2,8813,'6.99','2005-07-29 21:47:55','2006-02-15 22:20:16'),(13393,497,2,8867,'4.99','2005-07-30 00:02:18','2006-02-15 22:20:16'),(13394,497,1,9273,'9.99','2005-07-30 15:05:36','2006-02-15 22:20:16'),(13395,497,2,9850,'4.99','2005-07-31 12:46:52','2006-02-15 22:20:16'),(13396,497,2,10760,'7.99','2005-08-01 20:25:20','2006-02-15 22:20:16'),(13397,497,1,12123,'0.99','2005-08-17 23:22:18','2006-02-15 22:20:16'),(13398,497,1,13159,'4.99','2005-08-19 13:19:59','2006-02-15 22:20:17'),(13399,497,1,13289,'2.99','2005-08-19 18:31:30','2006-02-15 22:20:17'),(13400,497,2,14134,'0.99','2005-08-21 01:45:54','2006-02-15 22:20:17'),(13401,497,1,15362,'5.99','2005-08-22 21:40:20','2006-02-15 22:20:17'),(13402,497,2,15633,'0.99','2005-08-23 07:31:10','2006-02-15 22:20:17'),(13403,497,1,15919,'0.99','2005-08-23 18:01:31','2006-02-15 22:20:17'),(13404,497,1,12698,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:17'),(13405,498,2,49,'2.99','2005-05-25 06:39:35','2006-02-15 22:20:17'),(13406,498,1,429,'8.99','2005-05-27 16:21:26','2006-02-15 22:20:17'),(13407,498,2,718,'2.99','2005-05-29 04:52:23','2006-02-15 22:20:17'),(13408,498,1,1253,'6.99','2005-06-15 06:06:33','2006-02-15 22:20:17'),(13409,498,1,1782,'2.99','2005-06-16 19:21:12','2006-02-15 22:20:17'),(13410,498,1,2344,'2.99','2005-06-18 12:01:47','2006-02-15 22:20:17'),(13411,498,1,2449,'4.99','2005-06-18 19:18:36','2006-02-15 22:20:17'),(13412,498,1,3098,'0.99','2005-06-20 16:37:01','2006-02-15 22:20:17'),(13413,498,2,3360,'0.99','2005-06-21 12:12:41','2006-02-15 22:20:17'),(13414,498,2,3828,'0.99','2005-07-06 15:57:30','2006-02-15 22:20:18'),(13415,498,2,3856,'2.99','2005-07-06 17:04:46','2006-02-15 22:20:18'),(13416,498,1,4311,'4.99','2005-07-07 17:31:14','2006-02-15 22:20:18'),(13417,498,2,4972,'2.99','2005-07-08 23:56:09','2006-02-15 22:20:18'),(13418,498,1,5286,'2.99','2005-07-09 15:11:41','2006-02-15 22:20:18'),(13419,498,2,5884,'0.99','2005-07-10 19:31:38','2006-02-15 22:20:18'),(13420,498,1,6058,'2.99','2005-07-11 04:03:51','2006-02-15 22:20:18'),(13421,498,1,6088,'1.99','2005-07-11 05:40:35','2006-02-15 22:20:18'),(13422,498,1,7285,'4.99','2005-07-27 12:14:06','2006-02-15 22:20:18'),(13423,498,1,7286,'6.99','2005-07-27 12:23:49','2006-02-15 22:20:18'),(13424,498,1,7341,'4.99','2005-07-27 14:23:55','2006-02-15 22:20:18'),(13425,498,2,8020,'4.99','2005-07-28 15:43:32','2006-02-15 22:20:18'),(13426,498,1,8229,'2.99','2005-07-29 00:09:08','2006-02-15 22:20:18'),(13427,498,2,9021,'0.99','2005-07-30 05:34:24','2006-02-15 22:20:18'),(13428,498,2,9689,'4.99','2005-07-31 07:00:08','2006-02-15 22:20:18'),(13429,498,1,10225,'0.99','2005-08-01 01:38:40','2006-02-15 22:20:18'),(13430,498,1,11455,'6.99','2005-08-02 21:07:06','2006-02-15 22:20:18'),(13431,498,1,12893,'2.99','2005-08-19 03:46:43','2006-02-15 22:20:19'),(13432,499,2,89,'2.99','2005-05-25 14:28:29','2006-02-15 22:20:19'),(13433,499,1,1355,'2.99','2005-06-15 13:13:59','2006-02-15 22:20:19'),(13434,499,2,1526,'4.99','2005-06-16 00:27:51','2006-02-15 22:20:19'),(13435,499,2,1830,'4.99','2005-06-16 22:18:43','2006-02-15 22:20:19'),(13436,499,2,3241,'1.99','2005-06-21 02:54:32','2006-02-15 22:20:19'),(13437,499,1,3794,'4.99','2005-07-06 14:35:26','2006-02-15 22:20:19'),(13438,499,1,5022,'2.99','2005-07-09 02:10:54','2006-02-15 22:20:19'),(13439,499,2,5392,'2.99','2005-07-09 19:32:30','2006-02-15 22:20:19'),(13440,499,2,5427,'3.99','2005-07-09 21:12:26','2006-02-15 22:20:19'),(13441,499,1,5956,'4.99','2005-07-10 23:23:08','2006-02-15 22:20:19'),(13442,499,2,6723,'4.99','2005-07-12 13:44:57','2006-02-15 22:20:19'),(13443,499,1,7800,'0.99','2005-07-28 07:50:59','2006-02-15 22:20:19'),(13444,499,1,7831,'0.99','2005-07-28 08:44:21','2006-02-15 22:20:19'),(13445,499,1,7898,'6.99','2005-07-28 11:08:22','2006-02-15 22:20:19'),(13446,499,2,8130,'4.99','2005-07-28 19:48:15','2006-02-15 22:20:19'),(13447,499,1,8770,'3.99','2005-07-29 19:53:50','2006-02-15 22:20:20'),(13448,499,1,9588,'0.99','2005-07-31 03:13:13','2006-02-15 22:20:20'),(13449,499,2,10333,'0.99','2005-08-01 04:58:32','2006-02-15 22:20:20'),(13450,499,2,10497,'2.99','2005-08-01 10:55:59','2006-02-15 22:20:20'),(13451,499,1,11513,'7.99','2005-08-16 23:51:33','2006-02-15 22:20:20'),(13452,499,2,11606,'0.99','2005-08-17 03:32:43','2006-02-15 22:20:20'),(13453,499,2,11978,'4.99','2005-08-17 18:02:10','2006-02-15 22:20:20'),(13454,499,1,12004,'8.99','2005-08-17 18:56:53','2006-02-15 22:20:20'),(13455,499,1,12354,'7.99','2005-08-18 07:34:07','2006-02-15 22:20:20'),(13456,499,1,12436,'3.99','2005-08-18 10:41:05','2006-02-15 22:20:20'),(13457,499,1,12587,'1.99','2005-08-18 16:03:13','2006-02-15 22:20:20'),(13458,499,2,12947,'4.99','2005-08-19 05:54:21','2006-02-15 22:20:20'),(13459,499,2,13822,'3.99','2005-08-20 13:39:28','2006-02-15 22:20:20'),(13460,499,1,14858,'3.99','2005-08-22 02:46:18','2006-02-15 22:20:20'),(13461,499,1,15587,'7.99','2005-08-23 06:00:28','2006-02-15 22:20:20'),(13462,500,1,112,'8.99','2005-05-25 18:57:24','2006-02-15 22:20:20'),(13463,500,1,389,'8.99','2005-05-27 10:45:41','2006-02-15 22:20:21'),(13464,500,1,610,'0.99','2005-05-28 15:15:25','2006-02-15 22:20:21'),(13465,500,1,1375,'5.99','2005-06-15 14:54:56','2006-02-15 22:20:21'),(13466,500,2,1388,'5.99','2005-06-15 15:48:41','2006-02-15 22:20:21'),(13467,500,2,2189,'3.99','2005-06-18 01:20:26','2006-02-15 22:20:21'),(13468,500,2,2526,'6.99','2005-06-19 01:03:07','2006-02-15 22:20:21'),(13469,500,1,2996,'2.99','2005-06-20 09:20:29','2006-02-15 22:20:21'),(13470,500,2,3926,'4.99','2005-07-06 20:42:35','2006-02-15 22:20:21'),(13471,500,1,4561,'0.99','2005-07-08 05:02:43','2006-02-15 22:20:21'),(13472,500,2,4790,'4.99','2005-07-08 16:25:27','2006-02-15 22:20:21'),(13473,500,2,6018,'4.99','2005-07-11 02:06:36','2006-02-15 22:20:21'),(13474,500,2,6187,'2.99','2005-07-11 11:28:51','2006-02-15 22:20:21'),(13475,500,2,6801,'3.99','2005-07-12 17:09:08','2006-02-15 22:20:21'),(13476,500,1,7857,'0.99','2005-07-28 09:49:40','2006-02-15 22:20:21'),(13477,500,1,7925,'2.99','2005-07-28 12:10:02','2006-02-15 22:20:21'),(13478,500,1,8538,'6.99','2005-07-29 10:45:17','2006-02-15 22:20:21'),(13479,500,1,8925,'0.99','2005-07-30 02:09:14','2006-02-15 22:20:22'),(13480,500,2,9290,'3.99','2005-07-30 15:59:08','2006-02-15 22:20:22'),(13481,500,1,10947,'6.99','2005-08-02 03:23:17','2006-02-15 22:20:22'),(13482,500,2,11218,'1.99','2005-08-02 12:29:12','2006-02-15 22:20:22'),(13483,500,1,12639,'2.99','2005-08-18 18:13:05','2006-02-15 22:20:22'),(13484,500,2,12813,'2.99','2005-08-19 00:54:22','2006-02-15 22:20:22'),(13485,500,2,13628,'4.99','2005-08-20 07:03:53','2006-02-15 22:20:22'),(13486,500,1,14407,'0.99','2005-08-21 10:46:51','2006-02-15 22:20:22'),(13487,500,1,14964,'4.99','2005-08-22 06:39:24','2006-02-15 22:20:22'),(13488,500,1,15584,'2.99','2005-08-23 05:49:21','2006-02-15 22:20:22'),(13489,500,1,15853,'2.99','2005-08-23 15:54:20','2006-02-15 22:20:22'),(13490,501,1,493,'0.99','2005-05-28 00:34:11','2006-02-15 22:20:22'),(13491,501,1,605,'1.99','2005-05-28 14:39:10','2006-02-15 22:20:22'),(13492,501,2,3222,'5.99','2005-06-21 01:50:29','2006-02-15 22:20:22'),(13493,501,1,3412,'7.99','2005-06-21 16:44:31','2006-02-15 22:20:22'),(13494,501,2,3541,'6.99','2005-07-06 01:50:11','2006-02-15 22:20:22'),(13495,501,2,3723,'6.99','2005-07-06 11:12:02','2006-02-15 22:20:22'),(13496,501,2,4769,'2.99','2005-07-08 15:29:16','2006-02-15 22:20:23'),(13497,501,2,5520,'1.99','2005-07-10 01:30:41','2006-02-15 22:20:23'),(13498,501,2,6095,'7.99','2005-07-11 06:06:41','2006-02-15 22:20:23'),(13499,501,1,7456,'0.99','2005-07-27 18:34:53','2006-02-15 22:20:23'),(13500,501,1,8021,'2.99','2005-07-28 15:45:24','2006-02-15 22:20:23'),(13501,501,2,8529,'2.99','2005-07-29 10:24:31','2006-02-15 22:20:23'),(13502,501,1,9359,'2.99','2005-07-30 18:39:28','2006-02-15 22:20:23'),(13503,501,1,10817,'4.99','2005-08-01 22:51:08','2006-02-15 22:20:23'),(13504,501,2,11393,'4.99','2005-08-02 18:44:29','2006-02-15 22:20:23'),(13505,501,1,11640,'1.99','2005-08-17 04:44:33','2006-02-15 22:20:23'),(13506,501,2,11799,'6.99','2005-08-17 11:25:25','2006-02-15 22:20:23'),(13507,501,1,12914,'4.99','2005-08-19 04:25:59','2006-02-15 22:20:23'),(13508,501,2,13889,'0.99','2005-08-20 15:40:06','2006-02-15 22:20:23'),(13509,501,1,15239,'4.99','2005-08-22 17:46:17','2006-02-15 22:20:23'),(13510,501,1,15699,'5.99','2005-08-23 10:20:35','2006-02-15 22:20:23'),(13511,502,2,258,'2.99','2005-05-26 15:28:14','2006-02-15 22:20:23'),(13512,502,1,861,'0.99','2005-05-30 02:48:32','2006-02-15 22:20:24'),(13513,502,1,893,'2.99','2005-05-30 08:06:59','2006-02-15 22:20:24'),(13514,502,2,965,'0.99','2005-05-30 19:00:14','2006-02-15 22:20:24'),(13515,502,2,1696,'7.99','2005-06-16 12:50:01','2006-02-15 22:20:24'),(13516,502,2,2420,'0.99','2005-06-18 17:22:28','2006-02-15 22:20:24'),(13517,502,1,2911,'0.99','2005-06-20 03:32:37','2006-02-15 22:20:24'),(13518,502,2,3614,'2.99','2005-07-06 05:46:05','2006-02-15 22:20:24'),(13519,502,1,4606,'2.99','2005-07-08 07:05:50','2006-02-15 22:20:24'),(13520,502,2,5368,'5.99','2005-07-09 18:41:59','2006-02-15 22:20:24'),(13521,502,2,5662,'2.99','2005-07-10 07:59:24','2006-02-15 22:20:24'),(13522,502,2,6414,'7.99','2005-07-11 23:26:13','2006-02-15 22:20:24'),(13523,502,1,6760,'8.99','2005-07-12 15:16:00','2006-02-15 22:20:24'),(13524,502,2,6828,'2.99','2005-07-12 18:38:51','2006-02-15 22:20:24'),(13525,502,2,6924,'8.99','2005-07-26 22:51:53','2006-02-15 22:20:24'),(13526,502,2,7213,'3.99','2005-07-27 09:22:29','2006-02-15 22:20:24'),(13527,502,1,7255,'4.99','2005-07-27 10:49:54','2006-02-15 22:20:24'),(13528,502,1,7757,'4.99','2005-07-28 06:23:00','2006-02-15 22:20:25'),(13529,502,1,7884,'4.99','2005-07-28 10:37:24','2006-02-15 22:20:25'),(13530,502,2,8034,'4.99','2005-07-28 16:20:26','2006-02-15 22:20:25'),(13531,502,2,9232,'0.99','2005-07-30 13:43:00','2006-02-15 22:20:25'),(13532,502,1,9599,'4.99','2005-07-31 03:32:06','2006-02-15 22:20:25'),(13533,502,2,10390,'4.99','2005-08-01 06:46:48','2006-02-15 22:20:25'),(13534,502,1,10938,'0.99','2005-08-02 03:05:22','2006-02-15 22:20:25'),(13535,502,2,11036,'4.99','2005-08-02 05:56:29','2006-02-15 22:20:25'),(13536,502,1,11301,'0.99','2005-08-02 15:37:59','2006-02-15 22:20:25'),(13537,502,1,11317,'4.99','2005-08-02 16:08:52','2006-02-15 22:20:25'),(13538,502,1,11435,'0.99','2005-08-02 20:14:23','2006-02-15 22:20:25'),(13539,502,1,11620,'0.99','2005-08-17 04:06:22','2006-02-15 22:20:25'),(13540,502,1,12762,'4.99','2005-08-18 23:06:54','2006-02-15 22:20:25'),(13541,502,1,13052,'9.99','2005-08-19 09:31:42','2006-02-15 22:20:25'),(13542,502,1,14411,'4.99','2005-08-21 10:54:57','2006-02-15 22:20:25'),(13543,502,1,15486,'3.99','2005-08-23 02:05:20','2006-02-15 22:20:25'),(13544,502,1,16034,'3.99','2005-08-23 22:06:34','2006-02-15 22:20:26'),(13545,503,2,109,'1.99','2005-05-25 18:40:20','2006-02-15 22:20:26'),(13546,503,1,353,'5.99','2005-05-27 06:03:39','2006-02-15 22:20:26'),(13547,503,1,631,'2.99','2005-05-28 17:36:32','2006-02-15 22:20:26'),(13548,503,1,1074,'4.99','2005-05-31 10:04:42','2006-02-15 22:20:26'),(13549,503,2,2108,'4.99','2005-06-17 19:35:26','2006-02-15 22:20:26'),(13550,503,1,2225,'2.99','2005-06-18 03:35:40','2006-02-15 22:20:26'),(13551,503,2,3430,'0.99','2005-06-21 18:46:08','2006-02-15 22:20:26'),(13552,503,2,3935,'6.99','2005-07-06 21:08:29','2006-02-15 22:20:26'),(13553,503,2,4570,'2.99','2005-07-08 05:33:59','2006-02-15 22:20:26'),(13554,503,2,5465,'2.99','2005-07-09 23:01:13','2006-02-15 22:20:26'),(13555,503,1,5925,'6.99','2005-07-10 21:41:27','2006-02-15 22:20:26'),(13556,503,1,6166,'4.99','2005-07-11 10:19:05','2006-02-15 22:20:26'),(13557,503,1,6529,'2.99','2005-07-12 04:31:04','2006-02-15 22:20:26'),(13558,503,2,6950,'4.99','2005-07-26 23:45:33','2006-02-15 22:20:26'),(13559,503,1,8178,'2.99','2005-07-28 21:54:31','2006-02-15 22:20:26'),(13560,503,2,9725,'0.99','2005-07-31 08:35:18','2006-02-15 22:20:27'),(13561,503,1,9974,'4.99','2005-07-31 16:51:11','2006-02-15 22:20:27'),(13562,503,2,11075,'2.99','2005-08-02 07:24:23','2006-02-15 22:20:27'),(13563,503,1,11161,'1.99','2005-08-02 10:05:57','2006-02-15 22:20:27'),(13564,503,1,11858,'4.99','2005-08-17 13:50:31','2006-02-15 22:20:27'),(13565,503,2,12370,'2.99','2005-08-18 07:57:47','2006-02-15 22:20:27'),(13566,503,2,12783,'4.99','2005-08-19 00:01:14','2006-02-15 22:20:27'),(13567,503,1,13332,'2.99','2005-08-19 20:00:51','2006-02-15 22:20:27'),(13568,503,1,13551,'2.99','2005-08-20 04:00:30','2006-02-15 22:20:27'),(13569,503,1,14823,'0.99','2005-08-22 01:24:42','2006-02-15 22:20:27'),(13570,503,1,14913,'2.99','2005-08-22 04:52:13','2006-02-15 22:20:27'),(13571,503,2,15056,'4.99','2005-08-22 10:15:54','2006-02-15 22:20:27'),(13572,503,2,15077,'2.99','2005-08-22 11:09:18','2006-02-15 22:20:27'),(13573,503,1,15588,'3.99','2005-08-23 06:02:35','2006-02-15 22:20:27'),(13574,503,1,15692,'4.99','2005-08-23 10:00:02','2006-02-15 22:20:27'),(13575,503,1,15726,'2.99','2005-08-23 11:28:26','2006-02-15 22:20:27'),(13576,503,1,15797,'0.99','2005-08-23 14:13:47','2006-02-15 22:20:28'),(13577,504,2,136,'5.99','2005-05-25 22:02:30','2006-02-15 22:20:28'),(13578,504,2,470,'4.99','2005-05-27 21:17:08','2006-02-15 22:20:28'),(13579,504,1,838,'4.99','2005-05-30 00:27:57','2006-02-15 22:20:28'),(13580,504,1,2720,'1.99','2005-06-19 14:51:55','2006-02-15 22:20:28'),(13581,504,1,2938,'6.99','2005-06-20 05:17:22','2006-02-15 22:20:28'),(13582,504,2,3712,'9.99','2005-07-06 10:47:35','2006-02-15 22:20:28'),(13583,504,1,3713,'6.99','2005-07-06 10:49:30','2006-02-15 22:20:28'),(13584,504,1,4329,'5.99','2005-07-07 18:04:16','2006-02-15 22:20:28'),(13585,504,1,4757,'0.99','2005-07-08 14:36:51','2006-02-15 22:20:28'),(13586,504,2,5153,'6.99','2005-07-09 08:35:05','2006-02-15 22:20:28'),(13587,504,2,7342,'3.99','2005-07-27 14:25:17','2006-02-15 22:20:28'),(13588,504,1,7567,'2.99','2005-07-27 22:38:05','2006-02-15 22:20:28'),(13589,504,2,7807,'2.99','2005-07-28 07:58:27','2006-02-15 22:20:28'),(13590,504,2,7875,'1.99','2005-07-28 10:23:48','2006-02-15 22:20:28'),(13591,504,2,7944,'4.99','2005-07-28 12:51:22','2006-02-15 22:20:28'),(13592,504,1,8393,'9.99','2005-07-29 06:02:11','2006-02-15 22:20:28'),(13593,504,2,10397,'0.99','2005-08-01 07:11:27','2006-02-15 22:20:29'),(13594,504,2,10509,'3.99','2005-08-01 11:25:28','2006-02-15 22:20:29'),(13595,504,2,11569,'2.99','2005-08-17 01:31:04','2006-02-15 22:20:29'),(13596,504,1,12769,'1.99','2005-08-18 23:26:40','2006-02-15 22:20:29'),(13597,504,1,13166,'2.99','2005-08-19 13:36:28','2006-02-15 22:20:29'),(13598,504,2,13206,'2.99','2005-08-19 15:05:34','2006-02-15 22:20:29'),(13599,504,2,13387,'2.99','2005-08-19 21:46:10','2006-02-15 22:20:29'),(13600,504,2,13859,'5.99','2005-08-20 14:53:43','2006-02-15 22:20:29'),(13601,504,2,15018,'4.99','2005-08-22 08:52:38','2006-02-15 22:20:29'),(13602,504,1,15166,'6.99','2005-08-22 15:05:37','2006-02-15 22:20:29'),(13603,504,1,15723,'8.99','2005-08-23 11:17:26','2006-02-15 22:20:29'),(13604,504,2,16022,'4.99','2005-08-23 21:44:27','2006-02-15 22:20:29'),(13605,505,1,159,'2.99','2005-05-26 01:34:28','2006-02-15 22:20:29'),(13606,505,1,645,'2.99','2005-05-28 19:14:09','2006-02-15 22:20:29'),(13607,505,2,1799,'5.99','2005-06-16 20:17:20','2006-02-15 22:20:29'),(13608,505,2,1886,'4.99','2005-06-17 03:36:02','2006-02-15 22:20:29'),(13609,505,1,2773,'7.99','2005-06-19 18:04:18','2006-02-15 22:20:30'),(13610,505,1,3137,'5.99','2005-06-20 19:41:28','2006-02-15 22:20:30'),(13611,505,2,4008,'5.99','2005-07-07 00:26:43','2006-02-15 22:20:30'),(13612,505,1,4507,'6.99','2005-07-08 02:22:45','2006-02-15 22:20:30'),(13613,505,2,5976,'9.99','2005-07-11 00:16:35','2006-02-15 22:20:30'),(13614,505,2,6292,'4.99','2005-07-11 17:23:33','2006-02-15 22:20:30'),(13615,505,1,6441,'0.99','2005-07-12 00:27:08','2006-02-15 22:20:30'),(13616,505,1,7784,'4.99','2005-07-28 07:15:32','2006-02-15 22:20:30'),(13617,505,2,10219,'5.99','2005-08-01 01:10:33','2006-02-15 22:20:30'),(13618,505,1,10896,'2.99','2005-08-02 01:19:33','2006-02-15 22:20:30'),(13619,505,1,11163,'0.99','2005-08-02 10:08:40','2006-02-15 22:20:30'),(13620,505,1,11907,'2.99','2005-08-17 15:40:47','2006-02-15 22:20:30'),(13621,505,2,13612,'3.99','2005-08-20 06:22:08','2006-02-15 22:20:30'),(13622,505,1,14398,'2.99','2005-08-21 10:27:21','2006-02-15 22:20:30'),(13623,505,1,14802,'2.99','2005-08-22 00:48:23','2006-02-15 22:20:30'),(13624,505,1,15436,'4.99','2005-08-23 00:30:26','2006-02-15 22:20:30'),(13625,505,2,15867,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:31'),(13626,506,1,114,'3.99','2005-05-25 19:12:42','2006-02-15 22:20:31'),(13627,506,2,387,'2.99','2005-05-27 10:35:27','2006-02-15 22:20:31'),(13628,506,2,410,'3.99','2005-05-27 14:11:22','2006-02-15 22:20:31'),(13629,506,1,547,'8.99','2005-05-28 07:24:28','2006-02-15 22:20:31'),(13630,506,2,907,'0.99','2005-05-30 10:37:27','2006-02-15 22:20:31'),(13631,506,1,1042,'2.99','2005-05-31 05:53:00','2006-02-15 22:20:31'),(13632,506,2,1153,'4.99','2005-05-31 21:36:44','2006-02-15 22:20:31'),(13633,506,1,1446,'6.99','2005-06-15 19:13:45','2006-02-15 22:20:31'),(13634,506,1,1467,'2.99','2005-06-15 20:47:10','2006-02-15 22:20:31'),(13635,506,2,1565,'0.99','2005-06-16 03:13:09','2006-02-15 22:20:31'),(13636,506,1,2755,'9.99','2005-06-19 16:56:31','2006-02-15 22:20:31'),(13637,506,2,2824,'6.99','2005-06-19 20:31:45','2006-02-15 22:20:31'),(13638,506,2,4594,'7.99','2005-07-08 06:40:06','2006-02-15 22:20:31'),(13639,506,2,4640,'6.99','2005-07-08 08:59:34','2006-02-15 22:20:31'),(13640,506,2,4806,'8.99','2005-07-08 17:01:02','2006-02-15 22:20:31'),(13641,506,2,5985,'0.99','2005-07-11 00:51:58','2006-02-15 22:20:32'),(13642,506,1,6783,'2.99','2005-07-12 16:27:56','2006-02-15 22:20:32'),(13643,506,1,7020,'0.99','2005-07-27 02:24:27','2006-02-15 22:20:32'),(13644,506,2,8096,'9.99','2005-07-28 18:32:46','2006-02-15 22:20:32'),(13645,506,2,8506,'0.99','2005-07-29 09:23:52','2006-02-15 22:20:32'),(13646,506,2,9654,'3.99','2005-07-31 05:57:42','2006-02-15 22:20:32'),(13647,506,2,9972,'2.99','2005-07-31 16:42:43','2006-02-15 22:20:32'),(13648,506,1,10477,'2.99','2005-08-01 10:04:17','2006-02-15 22:20:32'),(13649,506,1,10873,'4.99','2005-08-02 00:30:34','2006-02-15 22:20:32'),(13650,506,2,11238,'0.99','2005-08-02 13:25:50','2006-02-15 22:20:32'),(13651,506,2,11781,'4.99','2005-08-17 10:37:00','2006-02-15 22:20:32'),(13652,506,1,12994,'0.99','2005-08-19 07:26:10','2006-02-15 22:20:32'),(13653,506,2,13073,'2.99','2005-08-19 10:05:38','2006-02-15 22:20:32'),(13654,506,2,13767,'0.99','2005-08-20 11:43:36','2006-02-15 22:20:32'),(13655,506,1,14074,'1.99','2005-08-20 23:16:07','2006-02-15 22:20:32'),(13656,506,1,14337,'2.99','2005-08-21 08:34:26','2006-02-15 22:20:32'),(13657,506,2,14395,'6.99','2005-08-21 10:24:00','2006-02-15 22:20:33'),(13658,506,2,15022,'5.99','2005-08-22 08:55:43','2006-02-15 22:20:33'),(13659,506,2,15572,'1.99','2005-08-23 05:28:01','2006-02-15 22:20:33'),(13660,506,1,15694,'9.99','2005-08-23 10:02:46','2006-02-15 22:20:33'),(13661,507,1,52,'0.99','2005-05-25 06:51:29','2006-02-15 22:20:33'),(13662,507,2,713,'4.99','2005-05-29 04:10:17','2006-02-15 22:20:33'),(13663,507,2,1307,'4.99','2005-06-15 10:06:15','2006-02-15 22:20:33'),(13664,507,1,2143,'4.99','2005-06-17 21:58:13','2006-02-15 22:20:33'),(13665,507,2,2283,'4.99','2005-06-18 06:56:06','2006-02-15 22:20:33'),(13666,507,1,3660,'4.99','2005-07-06 08:07:29','2006-02-15 22:20:33'),(13667,507,1,3880,'2.99','2005-07-06 18:32:49','2006-02-15 22:20:33'),(13668,507,2,4440,'0.99','2005-07-07 23:00:58','2006-02-15 22:20:33'),(13669,507,2,4455,'2.99','2005-07-07 23:43:46','2006-02-15 22:20:33'),(13670,507,2,4744,'0.99','2005-07-08 13:43:57','2006-02-15 22:20:33'),(13671,507,2,4901,'2.99','2005-07-08 20:44:51','2006-02-15 22:20:33'),(13672,507,1,5962,'0.99','2005-07-10 23:45:22','2006-02-15 22:20:33'),(13673,507,1,6351,'6.99','2005-07-11 20:31:44','2006-02-15 22:20:34'),(13674,507,1,6396,'1.99','2005-07-11 22:31:08','2006-02-15 22:20:34'),(13675,507,1,6891,'2.99','2005-07-12 21:07:35','2006-02-15 22:20:34'),(13676,507,2,7770,'5.99','2005-07-28 06:49:35','2006-02-15 22:20:34'),(13677,507,1,7970,'5.99','2005-07-28 13:58:38','2006-02-15 22:20:34'),(13678,507,2,8369,'2.99','2005-07-29 05:15:42','2006-02-15 22:20:34'),(13679,507,2,8976,'2.99','2005-07-30 04:12:32','2006-02-15 22:20:34'),(13680,507,1,9003,'2.99','2005-07-30 05:02:52','2006-02-15 22:20:34'),(13681,507,2,12071,'6.99','2005-08-17 21:49:14','2006-02-15 22:20:34'),(13682,507,2,12275,'4.99','2005-08-18 04:42:02','2006-02-15 22:20:34'),(13683,507,1,12343,'4.99','2005-08-18 07:15:13','2006-02-15 22:20:34'),(13684,507,2,14625,'4.99','2005-08-21 18:34:21','2006-02-15 22:20:34'),(13685,507,1,15394,'2.99','2005-08-22 23:04:21','2006-02-15 22:20:34'),(13686,508,1,369,'2.99','2005-05-27 07:46:49','2006-02-15 22:20:34'),(13687,508,2,921,'2.99','2005-05-30 11:53:09','2006-02-15 22:20:34'),(13688,508,2,1661,'4.99','2005-06-16 10:12:57','2006-02-15 22:20:34'),(13689,508,2,5657,'9.99','2005-07-10 07:33:43','2006-02-15 22:20:35'),(13690,508,2,5978,'6.99','2005-07-11 00:16:54','2006-02-15 22:20:35'),(13691,508,1,6101,'4.99','2005-07-11 06:50:33','2006-02-15 22:20:35'),(13692,508,2,6646,'0.99','2005-07-12 10:41:34','2006-02-15 22:20:35'),(13693,508,2,6929,'8.99','2005-07-26 22:59:19','2006-02-15 22:20:35'),(13694,508,1,7283,'5.99','2005-07-27 12:02:41','2006-02-15 22:20:35'),(13695,508,2,7322,'3.99','2005-07-27 13:37:26','2006-02-15 22:20:35'),(13696,508,2,7327,'7.99','2005-07-27 13:53:26','2006-02-15 22:20:35'),(13697,508,2,7668,'2.99','2005-07-28 02:41:31','2006-02-15 22:20:35'),(13698,508,2,7676,'4.99','2005-07-28 02:55:27','2006-02-15 22:20:35'),(13699,508,2,8191,'4.99','2005-07-28 22:47:14','2006-02-15 22:20:35'),(13700,508,2,9694,'5.99','2005-07-31 07:13:16','2006-02-15 22:20:35'),(13701,508,1,9706,'2.99','2005-07-31 07:43:19','2006-02-15 22:20:35'),(13702,508,2,10128,'2.99','2005-07-31 21:40:04','2006-02-15 22:20:35'),(13703,508,1,10746,'8.99','2005-08-01 19:58:49','2006-02-15 22:20:35'),(13704,508,1,11365,'2.99','2005-08-02 18:00:09','2006-02-15 22:20:35'),(13705,508,2,11447,'6.99','2005-08-02 20:36:25','2006-02-15 22:20:36'),(13706,508,1,13095,'6.99','2005-08-19 10:48:10','2006-02-15 22:20:36'),(13707,508,2,13201,'2.99','2005-08-19 14:56:05','2006-02-15 22:20:36'),(13708,508,1,15010,'6.99','2005-08-22 08:30:17','2006-02-15 22:20:36'),(13709,508,1,15195,'4.99','2005-08-22 16:08:23','2006-02-15 22:20:36'),(13710,508,1,14318,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:36'),(13711,509,1,22,'4.99','2005-05-25 02:19:23','2006-02-15 22:20:36'),(13712,509,1,831,'8.99','2005-05-29 22:50:25','2006-02-15 22:20:36'),(13713,509,1,1267,'2.99','2005-06-15 07:21:21','2006-02-15 22:20:36'),(13714,509,2,2919,'4.99','2005-06-20 04:10:16','2006-02-15 22:20:36'),(13715,509,2,4139,'1.99','2005-07-07 08:17:35','2006-02-15 22:20:36'),(13716,509,2,4266,'4.99','2005-07-07 14:34:50','2006-02-15 22:20:36'),(13717,509,2,4832,'2.99','2005-07-08 18:07:05','2006-02-15 22:20:36'),(13718,509,2,5008,'2.99','2005-07-09 01:31:42','2006-02-15 22:20:36'),(13719,509,1,6591,'5.99','2005-07-12 07:13:46','2006-02-15 22:20:36'),(13720,509,1,7848,'6.99','2005-07-28 09:24:31','2006-02-15 22:20:36'),(13721,509,1,8114,'8.99','2005-07-28 19:14:06','2006-02-15 22:20:37'),(13722,509,1,8214,'5.99','2005-07-28 23:37:57','2006-02-15 22:20:37'),(13723,509,2,8240,'0.99','2005-07-29 00:33:32','2006-02-15 22:20:37'),(13724,509,1,10189,'4.99','2005-08-01 00:25:00','2006-02-15 22:20:37'),(13725,509,2,10988,'5.99','2005-08-02 04:38:17','2006-02-15 22:20:37'),(13726,509,1,11814,'6.99','2005-08-17 12:09:20','2006-02-15 22:20:37'),(13727,509,2,12109,'4.99','2005-08-17 22:58:35','2006-02-15 22:20:37'),(13728,509,2,14045,'4.99','2005-08-20 21:50:11','2006-02-15 22:20:37'),(13729,509,2,14994,'5.99','2005-08-22 07:52:24','2006-02-15 22:20:37'),(13730,509,1,15965,'2.99','2005-08-23 19:46:39','2006-02-15 22:20:37'),(13731,510,1,75,'8.99','2005-05-25 11:13:34','2006-02-15 22:20:37'),(13732,510,1,372,'5.99','2005-05-27 08:13:58','2006-02-15 22:20:37'),(13733,510,2,1118,'4.99','2005-05-31 16:23:02','2006-02-15 22:20:37'),(13734,510,2,1435,'5.99','2005-06-15 18:32:30','2006-02-15 22:20:37'),(13735,510,2,1757,'0.99','2005-06-16 17:32:24','2006-02-15 22:20:37'),(13736,510,2,1925,'0.99','2005-06-17 06:16:47','2006-02-15 22:20:37'),(13737,510,1,2729,'8.99','2005-06-19 15:06:15','2006-02-15 22:20:38'),(13738,510,2,2806,'0.99','2005-06-19 19:30:48','2006-02-15 22:20:38'),(13739,510,2,2817,'0.99','2005-06-19 20:05:22','2006-02-15 22:20:38'),(13740,510,2,3352,'8.99','2005-06-21 11:26:29','2006-02-15 22:20:38'),(13741,510,2,3465,'5.99','2005-06-21 22:10:01','2006-02-15 22:20:38'),(13742,510,2,3744,'2.99','2005-07-06 12:10:02','2006-02-15 22:20:38'),(13743,510,1,4014,'4.99','2005-07-07 00:58:54','2006-02-15 22:20:38'),(13744,510,2,5851,'4.99','2005-07-10 17:40:47','2006-02-15 22:20:38'),(13745,510,1,6531,'1.99','2005-07-12 04:35:24','2006-02-15 22:20:38'),(13746,510,1,7457,'2.99','2005-07-27 18:35:17','2006-02-15 22:20:38'),(13747,510,1,7678,'8.99','2005-07-28 02:58:16','2006-02-15 22:20:38'),(13748,510,2,7794,'9.99','2005-07-28 07:28:03','2006-02-15 22:20:38'),(13749,510,2,8763,'3.99','2005-07-29 19:38:24','2006-02-15 22:20:38'),(13750,510,1,8926,'4.99','2005-07-30 02:10:31','2006-02-15 22:20:38'),(13751,510,1,10131,'0.99','2005-07-31 21:45:28','2006-02-15 22:20:38'),(13752,510,2,10265,'7.99','2005-08-01 03:05:04','2006-02-15 22:20:38'),(13753,510,2,11996,'4.99','2005-08-17 18:34:37','2006-02-15 22:20:39'),(13754,510,1,12317,'0.99','2005-08-18 06:17:06','2006-02-15 22:20:39'),(13755,510,2,12406,'2.99','2005-08-18 09:38:02','2006-02-15 22:20:39'),(13756,510,1,15065,'4.99','2005-08-22 10:46:44','2006-02-15 22:20:39'),(13757,511,1,56,'2.99','2005-05-25 08:28:11','2006-02-15 22:20:39'),(13758,511,1,819,'3.99','2005-05-29 21:00:32','2006-02-15 22:20:39'),(13759,511,2,1281,'2.99','2005-06-15 08:21:39','2006-02-15 22:20:39'),(13760,511,1,1508,'2.99','2005-06-15 22:33:24','2006-02-15 22:20:39'),(13761,511,2,2966,'10.99','2005-06-20 07:39:33','2006-02-15 22:20:39'),(13762,511,2,3366,'4.99','2005-06-21 13:03:37','2006-02-15 22:20:39'),(13763,511,2,3600,'4.99','2005-07-06 05:19:42','2006-02-15 22:20:39'),(13764,511,1,3852,'0.99','2005-07-06 16:57:49','2006-02-15 22:20:39'),(13765,511,1,4482,'4.99','2005-07-08 01:01:18','2006-02-15 22:20:39'),(13766,511,2,5164,'3.99','2005-07-09 09:03:14','2006-02-15 22:20:39'),(13767,511,1,5601,'0.99','2005-07-10 04:56:55','2006-02-15 22:20:39'),(13768,511,2,6040,'0.99','2005-07-11 03:14:26','2006-02-15 22:20:39'),(13769,511,1,6320,'0.99','2005-07-11 18:50:55','2006-02-15 22:20:40'),(13770,511,1,8026,'4.99','2005-07-28 16:05:38','2006-02-15 22:20:40'),(13771,511,1,9095,'0.99','2005-07-30 08:38:36','2006-02-15 22:20:40'),(13772,511,1,9143,'6.99','2005-07-30 10:22:11','2006-02-15 22:20:40'),(13773,511,1,9760,'4.99','2005-07-31 09:29:33','2006-02-15 22:20:40'),(13774,511,1,10231,'2.99','2005-08-01 01:50:49','2006-02-15 22:20:40'),(13775,511,2,10429,'2.99','2005-08-01 08:34:18','2006-02-15 22:20:40'),(13776,511,2,12110,'6.99','2005-08-17 22:59:46','2006-02-15 22:20:40'),(13777,511,1,12920,'4.99','2005-08-19 04:32:32','2006-02-15 22:20:40'),(13778,511,1,14213,'4.99','2005-08-21 04:30:47','2006-02-15 22:20:40'),(13779,511,1,14302,'6.99','2005-08-21 07:19:57','2006-02-15 22:20:40'),(13780,511,1,15172,'4.99','2005-08-22 15:25:33','2006-02-15 22:20:40'),(13781,512,1,1176,'6.99','2005-06-15 00:28:37','2006-02-15 22:20:40'),(13782,512,2,2029,'4.99','2005-06-17 13:10:59','2006-02-15 22:20:40'),(13783,512,1,2364,'2.99','2005-06-18 13:37:32','2006-02-15 22:20:40'),(13784,512,1,4752,'5.99','2005-07-08 14:15:20','2006-02-15 22:20:40'),(13785,512,1,4799,'0.99','2005-07-08 16:49:27','2006-02-15 22:20:41'),(13786,512,1,5064,'6.99','2005-07-09 04:38:51','2006-02-15 22:20:41'),(13787,512,2,5813,'3.99','2005-07-10 15:34:37','2006-02-15 22:20:41'),(13788,512,1,7219,'2.99','2005-07-27 09:35:36','2006-02-15 22:20:41'),(13789,512,1,7507,'0.99','2005-07-27 20:31:48','2006-02-15 22:20:41'),(13790,512,1,7715,'6.99','2005-07-28 04:32:38','2006-02-15 22:20:41'),(13791,512,2,8868,'4.99','2005-07-30 00:02:26','2006-02-15 22:20:41'),(13792,512,1,9055,'2.99','2005-07-30 07:13:07','2006-02-15 22:20:41'),(13793,512,2,10232,'4.99','2005-08-01 01:50:55','2006-02-15 22:20:41'),(13794,512,2,10670,'3.99','2005-08-01 17:07:16','2006-02-15 22:20:41'),(13795,512,2,11818,'9.99','2005-08-17 12:22:04','2006-02-15 22:20:41'),(13796,512,2,12957,'8.99','2005-08-19 06:12:44','2006-02-15 22:20:41'),(13797,512,2,13156,'4.99','2005-08-19 13:10:42','2006-02-15 22:20:41'),(13798,512,2,13771,'0.99','2005-08-20 11:47:21','2006-02-15 22:20:41'),(13799,512,1,14288,'4.99','2005-08-21 06:57:34','2006-02-15 22:20:41'),(13800,512,1,14870,'2.99','2005-08-22 03:23:20','2006-02-15 22:20:41'),(13801,512,1,15153,'2.99','2005-08-22 14:26:01','2006-02-15 22:20:42'),(13802,512,2,15265,'3.99','2005-08-22 18:35:59','2006-02-15 22:20:42'),(13803,512,1,15317,'3.99','2005-08-22 20:14:13','2006-02-15 22:20:42'),(13804,512,2,15733,'4.99','2005-08-23 11:37:32','2006-02-15 22:20:42'),(13805,512,2,15990,'4.99','2005-08-23 20:25:11','2006-02-15 22:20:42'),(13806,512,1,12786,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:42'),(13807,513,2,993,'4.99','2005-05-30 23:54:19','2006-02-15 22:20:42'),(13808,513,1,1607,'2.99','2005-06-16 06:25:35','2006-02-15 22:20:42'),(13809,513,2,2290,'7.99','2005-06-18 07:34:37','2006-02-15 22:20:42'),(13810,513,2,2737,'1.99','2005-06-19 15:48:33','2006-02-15 22:20:42'),(13811,513,2,3872,'0.99','2005-07-06 18:00:19','2006-02-15 22:20:42'),(13812,513,2,4055,'2.99','2005-07-07 03:49:13','2006-02-15 22:20:42'),(13813,513,2,4178,'4.99','2005-07-07 10:14:31','2006-02-15 22:20:42'),(13814,513,2,4220,'4.99','2005-07-07 12:12:36','2006-02-15 22:20:42'),(13815,513,1,5741,'7.99','2005-07-10 11:55:40','2006-02-15 22:20:42'),(13816,513,1,6027,'4.99','2005-07-11 02:26:29','2006-02-15 22:20:42'),(13817,513,1,7655,'0.99','2005-07-28 02:01:11','2006-02-15 22:20:43'),(13818,513,2,8320,'4.99','2005-07-29 03:49:58','2006-02-15 22:20:43'),(13819,513,1,8350,'4.99','2005-07-29 04:50:39','2006-02-15 22:20:43'),(13820,513,2,8683,'9.99','2005-07-29 16:15:43','2006-02-15 22:20:43'),(13821,513,1,8798,'5.99','2005-07-29 21:15:38','2006-02-15 22:20:43'),(13822,513,2,9862,'2.99','2005-07-31 13:05:03','2006-02-15 22:20:43'),(13823,513,1,10012,'3.99','2005-07-31 18:06:06','2006-02-15 22:20:43'),(13824,513,2,11081,'2.99','2005-08-02 07:30:14','2006-02-15 22:20:43'),(13825,513,1,11165,'2.99','2005-08-02 10:12:17','2006-02-15 22:20:43'),(13826,513,1,11407,'3.99','2005-08-02 19:18:43','2006-02-15 22:20:43'),(13827,513,1,11755,'3.99','2005-08-17 09:15:35','2006-02-15 22:20:43'),(13828,513,1,12559,'5.99','2005-08-18 14:53:58','2006-02-15 22:20:43'),(13829,513,2,12784,'2.99','2005-08-19 00:02:46','2006-02-15 22:20:43'),(13830,513,2,12807,'4.99','2005-08-19 00:38:46','2006-02-15 22:20:43'),(13831,513,1,13596,'5.99','2005-08-20 05:58:58','2006-02-15 22:20:43'),(13832,513,1,13690,'4.99','2005-08-20 09:07:27','2006-02-15 22:20:43'),(13833,513,2,14844,'7.99','2005-08-22 02:09:12','2006-02-15 22:20:44'),(13834,513,1,14875,'4.99','2005-08-22 03:34:39','2006-02-15 22:20:44'),(13835,513,1,15035,'4.99','2005-08-22 09:34:32','2006-02-15 22:20:44'),(13836,513,2,15289,'6.99','2005-08-22 19:27:24','2006-02-15 22:20:44'),(13837,513,2,15545,'5.99','2005-08-23 04:20:16','2006-02-15 22:20:44'),(13838,514,2,536,'4.99','2005-05-28 06:17:33','2006-02-15 22:20:44'),(13839,514,2,1692,'4.99','2005-06-16 12:30:19','2006-02-15 22:20:44'),(13840,514,1,2002,'3.99','2005-06-17 11:39:58','2006-02-15 22:20:44'),(13841,514,2,2362,'0.99','2005-06-18 13:31:15','2006-02-15 22:20:44'),(13842,514,1,2789,'0.99','2005-06-19 18:48:21','2006-02-15 22:20:44'),(13843,514,2,3084,'2.99','2005-06-20 15:35:24','2006-02-15 22:20:44'),(13844,514,1,3385,'0.99','2005-06-21 14:16:48','2006-02-15 22:20:44'),(13845,514,2,3668,'5.99','2005-07-06 08:36:48','2006-02-15 22:20:44'),(13846,514,2,3860,'2.99','2005-07-06 17:20:24','2006-02-15 22:20:44'),(13847,514,1,7791,'4.99','2005-07-28 07:22:51','2006-02-15 22:20:44'),(13848,514,1,9038,'3.99','2005-07-30 06:23:35','2006-02-15 22:20:45'),(13849,514,1,11675,'1.99','2005-08-17 05:57:54','2006-02-15 22:20:45'),(13850,514,2,12067,'4.99','2005-08-17 21:36:47','2006-02-15 22:20:45'),(13851,514,1,12293,'4.99','2005-08-18 05:13:36','2006-02-15 22:20:45'),(13852,514,1,12302,'4.99','2005-08-18 05:41:39','2006-02-15 22:20:45'),(13853,514,2,12578,'0.99','2005-08-18 15:47:11','2006-02-15 22:20:45'),(13854,514,1,12752,'2.99','2005-08-18 22:33:36','2006-02-15 22:20:45'),(13855,514,2,13344,'3.99','2005-08-19 20:22:44','2006-02-15 22:20:45'),(13856,514,1,14052,'0.99','2005-08-20 22:11:46','2006-02-15 22:20:45'),(13857,514,1,14386,'1.99','2005-08-21 10:06:34','2006-02-15 22:20:45'),(13858,514,1,15451,'2.99','2005-08-23 00:56:27','2006-02-15 22:20:45'),(13859,514,1,15776,'5.99','2005-08-23 13:26:01','2006-02-15 22:20:45'),(13860,515,2,187,'8.99','2005-05-26 05:42:37','2006-02-15 22:20:45'),(13861,515,2,292,'6.99','2005-05-26 20:22:12','2006-02-15 22:20:45'),(13862,515,1,1244,'4.99','2005-06-15 05:08:40','2006-02-15 22:20:45'),(13863,515,2,1531,'5.99','2005-06-16 00:40:34','2006-02-15 22:20:45'),(13864,515,2,2003,'4.99','2005-06-17 11:40:35','2006-02-15 22:20:46'),(13865,515,2,2484,'4.99','2005-06-18 21:25:23','2006-02-15 22:20:46'),(13866,515,2,2513,'0.99','2005-06-18 23:53:15','2006-02-15 22:20:46'),(13867,515,2,3063,'3.99','2005-06-20 13:52:03','2006-02-15 22:20:46'),(13868,515,2,3782,'0.99','2005-07-06 13:57:03','2006-02-15 22:20:46'),(13869,515,2,4111,'6.99','2005-07-07 06:47:56','2006-02-15 22:20:46'),(13870,515,2,5216,'0.99','2005-07-09 11:54:58','2006-02-15 22:20:46'),(13871,515,2,5546,'2.99','2005-07-10 02:50:37','2006-02-15 22:20:46'),(13872,515,2,5697,'4.99','2005-07-10 09:44:44','2006-02-15 22:20:46'),(13873,515,2,7429,'3.99','2005-07-27 17:24:50','2006-02-15 22:20:46'),(13874,515,1,8706,'4.99','2005-07-29 17:19:15','2006-02-15 22:20:46'),(13875,515,1,10159,'4.99','2005-07-31 22:54:30','2006-02-15 22:20:46'),(13876,515,2,10716,'0.99','2005-08-01 18:53:48','2006-02-15 22:20:46'),(13877,515,1,11451,'3.99','2005-08-02 20:45:56','2006-02-15 22:20:46'),(13878,515,2,11572,'4.99','2005-08-17 01:37:55','2006-02-15 22:20:46'),(13879,515,1,11691,'3.99','2005-08-17 06:51:05','2006-02-15 22:20:47'),(13880,515,2,11937,'6.99','2005-08-17 16:48:36','2006-02-15 22:20:47'),(13881,515,2,12416,'2.99','2005-08-18 09:56:48','2006-02-15 22:20:47'),(13882,515,1,12486,'8.99','2005-08-18 12:42:50','2006-02-15 22:20:47'),(13883,515,1,12889,'5.99','2005-08-19 03:41:31','2006-02-15 22:20:47'),(13884,515,2,14072,'4.99','2005-08-20 23:07:10','2006-02-15 22:20:47'),(13885,515,2,14378,'3.99','2005-08-21 09:50:02','2006-02-15 22:20:47'),(13886,515,2,14414,'0.99','2005-08-21 11:08:17','2006-02-15 22:20:47'),(13887,515,2,15274,'4.99','2005-08-22 18:55:52','2006-02-15 22:20:47'),(13888,516,2,339,'3.99','2005-05-27 03:47:18','2006-02-15 22:20:47'),(13889,516,1,571,'1.99','2005-05-28 10:17:41','2006-02-15 22:20:47'),(13890,516,2,1159,'4.99','2005-06-14 22:55:13','2006-02-15 22:20:47'),(13891,516,1,1200,'1.99','2005-06-15 01:59:51','2006-02-15 22:20:47'),(13892,516,1,1718,'10.99','2005-06-16 14:52:02','2006-02-15 22:20:47'),(13893,516,1,2017,'0.99','2005-06-17 12:33:30','2006-02-15 22:20:47'),(13894,516,2,3068,'0.99','2005-06-20 14:02:22','2006-02-15 22:20:47'),(13895,516,1,3431,'2.99','2005-06-21 18:46:48','2006-02-15 22:20:48'),(13896,516,2,5780,'3.99','2005-07-10 13:46:23','2006-02-15 22:20:48'),(13897,516,2,6677,'6.99','2005-07-12 11:58:14','2006-02-15 22:20:48'),(13898,516,1,6858,'6.99','2005-07-12 19:53:51','2006-02-15 22:20:48'),(13899,516,1,7628,'4.99','2005-07-28 00:58:04','2006-02-15 22:20:48'),(13900,516,1,7882,'4.99','2005-07-28 10:33:42','2006-02-15 22:20:48'),(13901,516,2,8396,'4.99','2005-07-29 06:07:00','2006-02-15 22:20:48'),(13902,516,2,8534,'5.99','2005-07-29 10:30:13','2006-02-15 22:20:48'),(13903,516,2,8585,'2.99','2005-07-29 12:14:18','2006-02-15 22:20:48'),(13904,516,2,9243,'4.99','2005-07-30 14:06:27','2006-02-15 22:20:48'),(13905,516,2,11926,'0.99','2005-08-17 16:25:02','2006-02-15 22:20:48'),(13906,516,2,11939,'1.99','2005-08-17 16:55:57','2006-02-15 22:20:48'),(13907,516,1,12535,'1.99','2005-08-18 14:05:22','2006-02-15 22:20:48'),(13908,516,1,13276,'8.99','2005-08-19 17:53:42','2006-02-15 22:20:48'),(13909,516,1,14932,'0.99','2005-08-22 05:40:39','2006-02-15 22:20:48'),(13910,516,1,15526,'0.99','2005-08-23 03:44:30','2006-02-15 22:20:48'),(13911,516,1,15701,'0.99','2005-08-23 10:22:21','2006-02-15 22:20:49'),(13912,516,1,12130,'5.98','2006-02-14 15:16:03','2006-02-15 22:20:49'),(13913,516,1,12915,'0.00','2006-02-14 15:16:03','2006-02-15 22:20:49'),(13914,517,2,850,'4.99','2005-05-30 01:35:12','2006-02-15 22:20:49'),(13915,517,2,1653,'4.99','2005-06-16 09:34:45','2006-02-15 22:20:49'),(13916,517,1,1809,'8.99','2005-06-16 21:00:20','2006-02-15 22:20:49'),(13917,517,1,1850,'4.99','2005-06-17 00:31:35','2006-02-15 22:20:49'),(13918,517,2,2534,'2.99','2005-06-19 01:38:39','2006-02-15 22:20:49'),(13919,517,1,3113,'0.99','2005-06-20 17:56:40','2006-02-15 22:20:49'),(13920,517,2,4094,'2.99','2005-07-07 06:00:21','2006-02-15 22:20:49'),(13921,517,1,4109,'4.99','2005-07-07 06:39:43','2006-02-15 22:20:49'),(13922,517,1,4369,'4.99','2005-07-07 20:01:38','2006-02-15 22:20:49'),(13923,517,2,4374,'4.99','2005-07-07 20:13:58','2006-02-15 22:20:49'),(13924,517,2,4934,'0.99','2005-07-08 22:18:42','2006-02-15 22:20:49'),(13925,517,1,4993,'2.99','2005-07-09 00:49:47','2006-02-15 22:20:49'),(13926,517,1,5206,'7.99','2005-07-09 11:11:01','2006-02-15 22:20:49'),(13927,517,2,5974,'5.99','2005-07-11 00:10:37','2006-02-15 22:20:50'),(13928,517,2,6594,'4.99','2005-07-12 07:25:43','2006-02-15 22:20:50'),(13929,517,2,6903,'0.99','2005-07-12 21:58:15','2006-02-15 22:20:50'),(13930,517,2,7988,'3.99','2005-07-28 14:37:18','2006-02-15 22:20:50'),(13931,517,1,10063,'4.99','2005-07-31 19:25:13','2006-02-15 22:20:50'),(13932,517,2,10358,'4.99','2005-08-01 05:50:07','2006-02-15 22:20:50'),(13933,517,2,10433,'4.99','2005-08-01 08:45:56','2006-02-15 22:20:50'),(13934,517,1,11684,'3.99','2005-08-17 06:27:15','2006-02-15 22:20:50'),(13935,517,2,12705,'0.99','2005-08-18 20:44:14','2006-02-15 22:20:50'),(13936,517,1,13396,'0.99','2005-08-19 22:06:09','2006-02-15 22:20:50'),(13937,517,2,14190,'4.99','2005-08-21 03:35:21','2006-02-15 22:20:50'),(13938,517,1,15559,'5.99','2005-08-23 04:55:05','2006-02-15 22:20:50'),(13939,518,1,710,'2.99','2005-05-29 03:48:36','2006-02-15 22:20:50'),(13940,518,2,1552,'5.99','2005-06-16 02:01:37','2006-02-15 22:20:50'),(13941,518,2,3311,'0.99','2005-06-21 08:05:27','2006-02-15 22:20:50'),(13942,518,1,3652,'0.99','2005-07-06 07:44:30','2006-02-15 22:20:51'),(13943,518,2,4029,'7.99','2005-07-07 02:19:44','2006-02-15 22:20:51'),(13944,518,2,4661,'4.99','2005-07-08 09:55:06','2006-02-15 22:20:51'),(13945,518,2,4948,'6.99','2005-07-08 22:54:21','2006-02-15 22:20:51'),(13946,518,1,6652,'2.99','2005-07-12 10:59:38','2006-02-15 22:20:51'),(13947,518,1,6957,'2.99','2005-07-27 00:00:00','2006-02-15 22:20:51'),(13948,518,2,7038,'3.99','2005-07-27 03:07:29','2006-02-15 22:20:51'),(13949,518,2,7154,'4.99','2005-07-27 07:16:17','2006-02-15 22:20:51'),(13950,518,2,7382,'2.99','2005-07-27 15:43:15','2006-02-15 22:20:51'),(13951,518,1,7657,'2.99','2005-07-28 02:09:00','2006-02-15 22:20:51'),(13952,518,2,7839,'6.99','2005-07-28 09:01:13','2006-02-15 22:20:51'),(13953,518,1,8107,'3.99','2005-07-28 19:03:16','2006-02-15 22:20:51'),(13954,518,1,8397,'2.99','2005-07-29 06:09:35','2006-02-15 22:20:51'),(13955,518,1,10751,'5.99','2005-08-01 20:06:10','2006-02-15 22:20:51'),(13956,518,2,11433,'3.99','2005-08-02 20:13:10','2006-02-15 22:20:51'),(13957,518,2,12450,'2.99','2005-08-18 11:04:04','2006-02-15 22:20:51'),(13958,518,2,12681,'2.99','2005-08-18 19:48:06','2006-02-15 22:20:52'),(13959,518,1,13065,'4.99','2005-08-19 09:48:52','2006-02-15 22:20:52'),(13960,518,1,13539,'6.99','2005-08-20 03:40:27','2006-02-15 22:20:52'),(13961,518,1,14088,'6.99','2005-08-20 23:57:24','2006-02-15 22:20:52'),(13962,518,1,14149,'4.99','2005-08-21 02:22:47','2006-02-15 22:20:52'),(13963,518,2,14980,'0.99','2005-08-22 07:16:45','2006-02-15 22:20:52'),(13964,518,2,15434,'4.99','2005-08-23 00:28:16','2006-02-15 22:20:52'),(13965,519,1,1056,'3.99','2005-05-31 07:48:07','2006-02-15 22:20:52'),(13966,519,1,1941,'2.99','2005-06-17 07:42:45','2006-02-15 22:20:52'),(13967,519,2,2505,'8.99','2005-06-18 23:28:27','2006-02-15 22:20:52'),(13968,519,2,2997,'5.99','2005-06-20 09:23:45','2006-02-15 22:20:52'),(13969,519,2,4564,'0.99','2005-07-08 05:09:38','2006-02-15 22:20:52'),(13970,519,2,4773,'2.99','2005-07-08 15:41:39','2006-02-15 22:20:52'),(13971,519,2,5236,'0.99','2005-07-09 12:56:29','2006-02-15 22:20:52'),(13972,519,2,5547,'5.99','2005-07-10 02:52:47','2006-02-15 22:20:52'),(13973,519,2,6063,'0.99','2005-07-11 04:16:51','2006-02-15 22:20:52'),(13974,519,1,6599,'3.99','2005-07-12 07:41:14','2006-02-15 22:20:53'),(13975,519,1,9417,'6.99','2005-07-30 20:54:55','2006-02-15 22:20:53'),(13976,519,2,9441,'4.99','2005-07-30 21:43:28','2006-02-15 22:20:53'),(13977,519,2,9534,'7.99','2005-07-31 01:18:27','2006-02-15 22:20:53'),(13978,519,2,9645,'0.99','2005-07-31 05:42:49','2006-02-15 22:20:53'),(13979,519,2,9886,'7.99','2005-07-31 14:00:13','2006-02-15 22:20:53'),(13980,519,1,9905,'0.99','2005-07-31 14:37:03','2006-02-15 22:20:53'),(13981,519,1,10097,'5.99','2005-07-31 20:39:38','2006-02-15 22:20:53'),(13982,519,2,10697,'4.99','2005-08-01 18:20:23','2006-02-15 22:20:53'),(13983,519,2,12648,'7.99','2005-08-18 18:30:21','2006-02-15 22:20:53'),(13984,519,2,12924,'2.99','2005-08-19 04:51:47','2006-02-15 22:20:53'),(13985,519,1,13647,'7.99','2005-08-20 07:48:07','2006-02-15 22:20:53'),(13986,519,1,14182,'2.99','2005-08-21 03:17:10','2006-02-15 22:20:53'),(13987,519,2,15347,'2.99','2005-08-22 21:12:19','2006-02-15 22:20:53'),(13988,520,1,962,'6.99','2005-05-30 18:45:17','2006-02-15 22:20:53'),(13989,520,1,1411,'0.99','2005-06-15 17:05:36','2006-02-15 22:20:54'),(13990,520,2,2174,'6.99','2005-06-18 00:09:01','2006-02-15 22:20:54'),(13991,520,1,2772,'4.99','2005-06-19 17:59:27','2006-02-15 22:20:54'),(13992,520,2,3482,'4.99','2005-07-05 23:13:22','2006-02-15 22:20:54'),(13993,520,1,3499,'7.99','2005-07-06 00:04:20','2006-02-15 22:20:54'),(13994,520,2,4346,'2.99','2005-07-07 18:58:45','2006-02-15 22:20:54'),(13995,520,2,5799,'4.99','2005-07-10 14:53:35','2006-02-15 22:20:54'),(13996,520,1,5802,'10.99','2005-07-10 15:02:17','2006-02-15 22:20:54'),(13997,520,1,5853,'3.99','2005-07-10 17:45:13','2006-02-15 22:20:54'),(13998,520,1,6029,'2.99','2005-07-11 02:36:46','2006-02-15 22:20:54'),(13999,520,2,7198,'5.99','2005-07-27 08:50:07','2006-02-15 22:20:54'),(14000,520,1,7720,'4.99','2005-07-28 04:41:44','2006-02-15 22:20:54'),(14001,520,1,7936,'0.99','2005-07-28 12:33:21','2006-02-15 22:20:54'),(14002,520,1,8294,'2.99','2005-07-29 02:32:41','2006-02-15 22:20:54'),(14003,520,2,8435,'2.99','2005-07-29 07:20:16','2006-02-15 22:20:54'),(14004,520,1,9803,'2.99','2005-07-31 11:06:02','2006-02-15 22:20:54'),(14005,520,1,10072,'0.99','2005-07-31 19:50:37','2006-02-15 22:20:55'),(14006,520,2,10530,'4.99','2005-08-01 12:01:17','2006-02-15 22:20:55'),(14007,520,1,11566,'0.99','2005-08-17 01:28:35','2006-02-15 22:20:55'),(14008,520,1,12517,'4.99','2005-08-18 13:40:20','2006-02-15 22:20:55'),(14009,520,1,12628,'5.99','2005-08-18 17:40:25','2006-02-15 22:20:55'),(14010,520,1,12647,'5.99','2005-08-18 18:29:51','2006-02-15 22:20:55'),(14011,520,1,13311,'0.99','2005-08-19 19:07:09','2006-02-15 22:20:55'),(14012,520,2,13438,'2.99','2005-08-19 23:38:02','2006-02-15 22:20:55'),(14013,520,2,13659,'2.99','2005-08-20 08:05:52','2006-02-15 22:20:55'),(14014,520,2,13746,'5.99','2005-08-20 10:55:28','2006-02-15 22:20:55'),(14015,520,1,14372,'4.99','2005-08-21 09:39:50','2006-02-15 22:20:55'),(14016,520,1,14509,'0.99','2005-08-21 14:39:58','2006-02-15 22:20:55'),(14017,520,1,15465,'0.99','2005-08-23 01:16:33','2006-02-15 22:20:55'),(14018,520,2,15492,'2.99','2005-08-23 02:13:46','2006-02-15 22:20:55'),(14019,520,1,15948,'7.99','2005-08-23 18:59:33','2006-02-15 22:20:55'),(14020,521,1,1761,'0.99','2005-06-16 17:49:57','2006-02-15 22:20:55'),(14021,521,2,2053,'0.99','2005-06-17 15:19:34','2006-02-15 22:20:56'),(14022,521,2,4284,'0.99','2005-07-07 15:31:57','2006-02-15 22:20:56'),(14023,521,2,4439,'2.99','2005-07-07 22:57:30','2006-02-15 22:20:56'),(14024,521,1,5276,'2.99','2005-07-09 14:35:13','2006-02-15 22:20:56'),(14025,521,2,5458,'4.99','2005-07-09 22:35:49','2006-02-15 22:20:56'),(14026,521,2,5580,'6.99','2005-07-10 04:05:49','2006-02-15 22:20:56'),(14027,521,2,5686,'0.99','2005-07-10 09:06:03','2006-02-15 22:20:56'),(14028,521,1,7478,'1.99','2005-07-27 19:16:02','2006-02-15 22:20:56'),(14029,521,1,9556,'7.99','2005-07-31 02:13:30','2006-02-15 22:20:56'),(14030,521,2,9937,'1.99','2005-07-31 15:28:10','2006-02-15 22:20:56'),(14031,521,1,10587,'2.99','2005-08-01 14:03:38','2006-02-15 22:20:56'),(14032,521,2,11625,'2.99','2005-08-17 04:18:52','2006-02-15 22:20:56'),(14033,521,1,11967,'3.99','2005-08-17 17:45:00','2006-02-15 22:20:56'),(14034,521,2,12082,'4.99','2005-08-17 22:13:15','2006-02-15 22:20:56'),(14035,521,1,12530,'4.99','2005-08-18 13:54:48','2006-02-15 22:20:56'),(14036,521,1,13527,'2.99','2005-08-20 03:00:47','2006-02-15 22:20:57'),(14037,521,1,14423,'0.99','2005-08-21 11:23:59','2006-02-15 22:20:57'),(14038,521,2,14551,'3.99','2005-08-21 15:57:25','2006-02-15 22:20:57'),(14039,521,2,14738,'5.99','2005-08-21 22:29:13','2006-02-15 22:20:57'),(14040,521,2,15170,'4.99','2005-08-22 15:22:15','2006-02-15 22:20:57'),(14041,521,2,15329,'2.99','2005-08-22 20:32:39','2006-02-15 22:20:57'),(14042,521,2,11672,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:57'),(14043,522,2,426,'5.99','2005-05-27 15:56:57','2006-02-15 22:20:57'),(14044,522,1,1289,'3.99','2005-06-15 08:44:09','2006-02-15 22:20:57'),(14045,522,2,3102,'8.99','2005-06-20 16:55:55','2006-02-15 22:20:57'),(14046,522,1,3188,'2.99','2005-06-20 23:10:27','2006-02-15 22:20:57'),(14047,522,2,3191,'0.99','2005-06-20 23:46:39','2006-02-15 22:20:57'),(14048,522,1,3594,'0.99','2005-07-06 04:42:47','2006-02-15 22:20:57'),(14049,522,2,4078,'4.99','2005-07-07 05:05:05','2006-02-15 22:20:57'),(14050,522,2,4563,'9.99','2005-07-08 05:08:55','2006-02-15 22:20:57'),(14051,522,2,4701,'4.99','2005-07-08 11:38:48','2006-02-15 22:20:57'),(14052,522,2,5271,'6.99','2005-07-09 14:25:01','2006-02-15 22:20:58'),(14053,522,2,5514,'6.99','2005-07-10 01:09:42','2006-02-15 22:20:58'),(14054,522,2,5532,'4.99','2005-07-10 02:17:31','2006-02-15 22:20:58'),(14055,522,2,5936,'0.99','2005-07-10 22:14:30','2006-02-15 22:20:58'),(14056,522,2,7262,'4.99','2005-07-27 11:15:36','2006-02-15 22:20:58'),(14057,522,1,7955,'2.99','2005-07-28 13:31:36','2006-02-15 22:20:58'),(14058,522,2,8181,'4.99','2005-07-28 22:18:38','2006-02-15 22:20:58'),(14059,522,1,8642,'6.99','2005-07-29 14:38:17','2006-02-15 22:20:58'),(14060,522,1,8966,'2.99','2005-07-30 03:54:12','2006-02-15 22:20:58'),(14061,522,1,9047,'7.99','2005-07-30 06:56:33','2006-02-15 22:20:58'),(14062,522,2,9227,'7.99','2005-07-30 13:36:13','2006-02-15 22:20:58'),(14063,522,1,9335,'4.99','2005-07-30 18:00:53','2006-02-15 22:20:58'),(14064,522,1,9412,'5.99','2005-07-30 20:44:10','2006-02-15 22:20:58'),(14065,522,2,9533,'5.99','2005-07-31 01:18:10','2006-02-15 22:20:58'),(14066,522,2,10223,'0.99','2005-08-01 01:23:15','2006-02-15 22:20:58'),(14067,522,1,10411,'3.99','2005-08-01 07:56:32','2006-02-15 22:20:59'),(14068,522,1,10675,'7.99','2005-08-01 17:11:57','2006-02-15 22:20:59'),(14069,522,2,10821,'5.99','2005-08-01 22:54:27','2006-02-15 22:20:59'),(14070,522,2,11696,'2.99','2005-08-17 07:01:09','2006-02-15 22:20:59'),(14071,522,2,11830,'1.99','2005-08-17 12:53:15','2006-02-15 22:20:59'),(14072,522,2,12494,'6.99','2005-08-18 12:53:49','2006-02-15 22:20:59'),(14073,522,2,13605,'6.99','2005-08-20 06:06:17','2006-02-15 22:20:59'),(14074,522,2,14467,'2.99','2005-08-21 13:03:33','2006-02-15 22:20:59'),(14075,522,1,15921,'6.99','2005-08-23 18:06:54','2006-02-15 22:20:59'),(14076,523,1,42,'4.99','2005-05-25 05:24:58','2006-02-15 22:20:59'),(14077,523,2,664,'0.99','2005-05-28 21:31:08','2006-02-15 22:20:59'),(14078,523,2,1729,'6.99','2005-06-16 15:29:47','2006-02-15 22:20:59'),(14079,523,1,2447,'8.99','2005-06-18 19:10:55','2006-02-15 22:20:59'),(14080,523,1,2583,'7.99','2005-06-19 05:01:40','2006-02-15 22:20:59'),(14081,523,2,2669,'0.99','2005-06-19 11:28:52','2006-02-15 22:20:59'),(14082,523,1,4605,'4.99','2005-07-08 07:00:14','2006-02-15 22:20:59'),(14083,523,2,5155,'2.99','2005-07-09 08:46:54','2006-02-15 22:21:00'),(14084,523,1,5287,'6.99','2005-07-09 15:11:54','2006-02-15 22:21:00'),(14085,523,2,5932,'2.99','2005-07-10 22:05:15','2006-02-15 22:21:00'),(14086,523,2,6675,'4.99','2005-07-12 11:53:06','2006-02-15 22:21:00'),(14087,523,2,7642,'1.99','2005-07-28 01:16:51','2006-02-15 22:21:00'),(14088,523,2,8141,'0.99','2005-07-28 20:21:19','2006-02-15 22:21:00'),(14089,523,1,8372,'5.99','2005-07-29 05:18:08','2006-02-15 22:21:00'),(14090,523,1,9071,'2.99','2005-07-30 07:40:58','2006-02-15 22:21:00'),(14091,523,2,9667,'6.99','2005-07-31 06:23:52','2006-02-15 22:21:00'),(14092,523,2,10470,'1.99','2005-08-01 09:52:26','2006-02-15 22:21:00'),(14093,523,1,11827,'4.99','2005-08-17 12:44:27','2006-02-15 22:21:00'),(14094,523,1,12288,'2.99','2005-08-18 05:01:20','2006-02-15 22:21:00'),(14095,523,1,13133,'2.99','2005-08-19 12:11:03','2006-02-15 22:21:00'),(14096,523,1,14766,'4.99','2005-08-21 23:42:20','2006-02-15 22:21:00'),(14097,523,1,15040,'2.99','2005-08-22 09:41:09','2006-02-15 22:21:00'),(14098,524,2,118,'0.99','2005-05-25 19:31:18','2006-02-15 22:21:00'),(14099,524,1,982,'4.99','2005-05-30 22:15:24','2006-02-15 22:21:01'),(14100,524,1,1306,'1.99','2005-06-15 09:59:24','2006-02-15 22:21:01'),(14101,524,2,1651,'4.99','2005-06-16 09:24:38','2006-02-15 22:21:01'),(14102,524,2,3454,'2.99','2005-06-21 21:12:13','2006-02-15 22:21:01'),(14103,524,1,4366,'5.99','2005-07-07 19:48:36','2006-02-15 22:21:01'),(14104,524,2,5037,'4.99','2005-07-09 02:59:10','2006-02-15 22:21:01'),(14105,524,2,6161,'4.99','2005-07-11 10:11:54','2006-02-15 22:21:01'),(14106,524,1,6240,'6.99','2005-07-11 14:32:41','2006-02-15 22:21:01'),(14107,524,2,6745,'4.99','2005-07-12 14:30:51','2006-02-15 22:21:01'),(14108,524,2,7014,'8.99','2005-07-27 02:14:40','2006-02-15 22:21:01'),(14109,524,1,7040,'4.99','2005-07-27 03:17:19','2006-02-15 22:21:01'),(14110,524,1,8507,'6.99','2005-07-29 09:29:44','2006-02-15 22:21:01'),(14111,524,2,13626,'2.99','2005-08-20 06:55:24','2006-02-15 22:21:01'),(14112,524,2,14046,'4.99','2005-08-20 21:53:21','2006-02-15 22:21:01'),(14113,524,1,14178,'2.99','2005-08-21 03:13:45','2006-02-15 22:21:01'),(14114,524,1,14366,'2.99','2005-08-21 09:31:39','2006-02-15 22:21:02'),(14115,524,2,14680,'1.99','2005-08-21 20:19:52','2006-02-15 22:21:02'),(14116,524,2,15206,'6.99','2005-08-22 16:33:39','2006-02-15 22:21:02'),(14117,525,1,437,'5.99','2005-05-27 17:47:22','2006-02-15 22:21:02'),(14118,525,2,1772,'2.99','2005-06-16 18:12:54','2006-02-15 22:21:02'),(14119,525,1,3993,'6.99','2005-07-06 23:37:06','2006-02-15 22:21:02'),(14120,525,1,5841,'2.99','2005-07-10 17:11:31','2006-02-15 22:21:02'),(14121,525,2,6098,'7.99','2005-07-11 06:23:28','2006-02-15 22:21:02'),(14122,525,2,6388,'6.99','2005-07-11 22:17:16','2006-02-15 22:21:02'),(14123,525,1,6689,'1.99','2005-07-12 12:22:13','2006-02-15 22:21:02'),(14124,525,2,7337,'4.99','2005-07-27 14:12:04','2006-02-15 22:21:02'),(14125,525,2,7591,'4.99','2005-07-27 23:25:54','2006-02-15 22:21:02'),(14126,525,1,8007,'0.99','2005-07-28 15:22:27','2006-02-15 22:21:02'),(14127,525,1,8960,'4.99','2005-07-30 03:36:31','2006-02-15 22:21:02'),(14128,525,2,9507,'5.99','2005-07-31 00:22:29','2006-02-15 22:21:02'),(14129,525,1,9702,'0.99','2005-07-31 07:34:07','2006-02-15 22:21:02'),(14130,525,1,10496,'2.99','2005-08-01 10:53:16','2006-02-15 22:21:03'),(14131,525,2,11406,'2.99','2005-08-02 19:16:10','2006-02-15 22:21:03'),(14132,525,1,11660,'1.99','2005-08-17 05:22:42','2006-02-15 22:21:03'),(14133,525,1,15159,'0.99','2005-08-22 14:32:25','2006-02-15 22:21:03'),(14134,525,2,15623,'3.99','2005-08-23 07:23:29','2006-02-15 22:21:03'),(14135,525,1,14954,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:03'),(14136,526,1,495,'4.99','2005-05-28 00:40:48','2006-02-15 22:21:03'),(14137,526,2,679,'4.99','2005-05-28 23:24:57','2006-02-15 22:21:03'),(14138,526,2,1015,'2.99','2005-05-31 02:44:57','2006-02-15 22:21:03'),(14139,526,1,1255,'4.99','2005-06-15 06:13:45','2006-02-15 22:21:03'),(14140,526,2,1848,'0.99','2005-06-17 00:07:07','2006-02-15 22:21:03'),(14141,526,2,1865,'7.99','2005-06-17 01:49:36','2006-02-15 22:21:03'),(14142,526,2,1972,'2.99','2005-06-17 09:25:49','2006-02-15 22:21:03'),(14143,526,1,1981,'2.99','2005-06-17 10:03:34','2006-02-15 22:21:03'),(14144,526,2,2398,'4.99','2005-06-18 15:56:53','2006-02-15 22:21:03'),(14145,526,1,2828,'2.99','2005-06-19 20:51:33','2006-02-15 22:21:04'),(14146,526,2,2932,'6.99','2005-06-20 04:51:19','2006-02-15 22:21:04'),(14147,526,1,3339,'6.99','2005-06-21 10:37:11','2006-02-15 22:21:04'),(14148,526,1,3619,'1.99','2005-07-06 05:59:44','2006-02-15 22:21:04'),(14149,526,2,3905,'5.99','2005-07-06 19:33:34','2006-02-15 22:21:04'),(14150,526,1,4423,'6.99','2005-07-07 22:11:28','2006-02-15 22:21:04'),(14151,526,2,5056,'2.99','2005-07-09 04:13:45','2006-02-15 22:21:04'),(14152,526,2,5121,'3.99','2005-07-09 07:18:31','2006-02-15 22:21:04'),(14153,526,1,6316,'7.99','2005-07-11 18:44:52','2006-02-15 22:21:04'),(14154,526,1,6404,'4.99','2005-07-11 22:49:50','2006-02-15 22:21:04'),(14155,526,2,6650,'2.99','2005-07-12 10:57:10','2006-02-15 22:21:04'),(14156,526,1,6671,'3.99','2005-07-12 11:48:48','2006-02-15 22:21:04'),(14157,526,2,7270,'7.99','2005-07-27 11:29:02','2006-02-15 22:21:04'),(14158,526,2,7343,'0.99','2005-07-27 14:27:13','2006-02-15 22:21:04'),(14159,526,2,7399,'1.99','2005-07-27 16:16:02','2006-02-15 22:21:04'),(14160,526,2,7543,'5.99','2005-07-27 21:44:28','2006-02-15 22:21:04'),(14161,526,2,7883,'2.99','2005-07-28 10:37:20','2006-02-15 22:21:05'),(14162,526,1,8053,'4.99','2005-07-28 16:59:41','2006-02-15 22:21:05'),(14163,526,1,8232,'4.99','2005-07-29 00:14:37','2006-02-15 22:21:05'),(14164,526,1,8441,'2.99','2005-07-29 07:33:05','2006-02-15 22:21:05'),(14165,526,2,9577,'6.99','2005-07-31 02:53:33','2006-02-15 22:21:05'),(14166,526,2,10020,'4.99','2005-07-31 18:21:08','2006-02-15 22:21:05'),(14167,526,2,10199,'2.99','2005-08-01 00:38:55','2006-02-15 22:21:05'),(14168,526,2,11046,'4.99','2005-08-02 06:08:34','2006-02-15 22:21:05'),(14169,526,1,11503,'10.99','2005-08-16 23:10:34','2006-02-15 22:21:05'),(14170,526,1,11612,'2.99','2005-08-17 03:48:51','2006-02-15 22:21:05'),(14171,526,2,11702,'4.99','2005-08-17 07:18:56','2006-02-15 22:21:05'),(14172,526,1,12607,'0.99','2005-08-18 17:03:49','2006-02-15 22:21:05'),(14173,526,2,13224,'8.99','2005-08-19 15:52:13','2006-02-15 22:21:05'),(14174,526,2,13580,'0.99','2005-08-20 05:23:34','2006-02-15 22:21:05'),(14175,526,1,13617,'8.99','2005-08-20 06:35:30','2006-02-15 22:21:05'),(14176,526,2,14487,'6.99','2005-08-21 13:53:33','2006-02-15 22:21:06'),(14177,526,1,14590,'7.99','2005-08-21 17:29:10','2006-02-15 22:21:06'),(14178,526,1,15168,'2.99','2005-08-22 15:14:20','2006-02-15 22:21:06'),(14179,526,1,15395,'4.99','2005-08-22 23:06:25','2006-02-15 22:21:06'),(14180,526,1,16043,'9.99','2005-08-23 22:21:03','2006-02-15 22:21:06'),(14181,527,1,1398,'2.99','2005-06-15 16:28:42','2006-02-15 22:21:06'),(14182,527,1,2422,'0.99','2005-06-18 17:28:57','2006-02-15 22:21:06'),(14183,527,2,2496,'0.99','2005-06-18 22:20:11','2006-02-15 22:21:06'),(14184,527,1,2539,'2.99','2005-06-19 01:58:39','2006-02-15 22:21:06'),(14185,527,1,4888,'0.99','2005-07-08 20:04:27','2006-02-15 22:21:06'),(14186,527,1,5365,'0.99','2005-07-09 18:27:00','2006-02-15 22:21:06'),(14187,527,2,6003,'3.99','2005-07-11 01:28:33','2006-02-15 22:21:06'),(14188,527,2,6011,'4.99','2005-07-11 01:54:48','2006-02-15 22:21:06'),(14189,527,1,6050,'2.99','2005-07-11 03:34:29','2006-02-15 22:21:06'),(14190,527,2,6975,'1.99','2005-07-27 00:39:54','2006-02-15 22:21:06'),(14191,527,1,7506,'8.99','2005-07-27 20:28:34','2006-02-15 22:21:06'),(14192,527,1,8854,'0.99','2005-07-29 23:40:07','2006-02-15 22:21:07'),(14193,527,2,9750,'0.99','2005-07-31 09:19:46','2006-02-15 22:21:07'),(14194,527,2,10486,'3.99','2005-08-01 10:23:43','2006-02-15 22:21:07'),(14195,527,2,10613,'0.99','2005-08-01 14:56:14','2006-02-15 22:21:07'),(14196,527,1,11013,'5.99','2005-08-02 05:10:54','2006-02-15 22:21:07'),(14197,527,1,11150,'2.99','2005-08-02 09:51:46','2006-02-15 22:21:07'),(14198,527,1,11624,'0.99','2005-08-17 04:17:42','2006-02-15 22:21:07'),(14199,527,1,12136,'7.99','2005-08-17 23:51:30','2006-02-15 22:21:07'),(14200,527,1,12513,'6.99','2005-08-18 13:31:45','2006-02-15 22:21:07'),(14201,527,1,14352,'6.99','2005-08-21 09:06:29','2006-02-15 22:21:07'),(14202,527,1,15144,'2.99','2005-08-22 13:49:18','2006-02-15 22:21:07'),(14203,527,1,15552,'3.99','2005-08-23 04:33:23','2006-02-15 22:21:07'),(14204,527,1,14267,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:07'),(14205,528,1,204,'0.99','2005-05-26 07:30:37','2006-02-15 22:21:07'),(14206,528,2,472,'0.99','2005-05-27 21:36:15','2006-02-15 22:21:07'),(14207,528,1,533,'5.99','2005-05-28 06:14:46','2006-02-15 22:21:08'),(14208,528,2,695,'3.99','2005-05-29 01:50:53','2006-02-15 22:21:08'),(14209,528,2,793,'5.99','2005-05-29 16:44:08','2006-02-15 22:21:08'),(14210,528,2,1875,'2.99','2005-06-17 02:45:10','2006-02-15 22:21:08'),(14211,528,1,2019,'4.99','2005-06-17 12:38:44','2006-02-15 22:21:08'),(14212,528,2,3654,'4.99','2005-07-06 07:45:31','2006-02-15 22:21:08'),(14213,528,1,3664,'0.99','2005-07-06 08:15:57','2006-02-15 22:21:08'),(14214,528,2,4050,'9.99','2005-07-07 03:35:33','2006-02-15 22:21:08'),(14215,528,1,4593,'5.99','2005-07-08 06:38:12','2006-02-15 22:21:08'),(14216,528,2,5215,'3.99','2005-07-09 11:47:58','2006-02-15 22:21:08'),(14217,528,2,6561,'0.99','2005-07-12 05:24:02','2006-02-15 22:21:08'),(14218,528,1,7569,'7.99','2005-07-27 22:38:53','2006-02-15 22:21:08'),(14219,528,2,8112,'4.99','2005-07-28 19:11:07','2006-02-15 22:21:08'),(14220,528,1,8727,'3.99','2005-07-29 18:09:57','2006-02-15 22:21:08'),(14221,528,2,9488,'8.99','2005-07-30 23:42:42','2006-02-15 22:21:08'),(14222,528,1,10084,'3.99','2005-07-31 20:11:29','2006-02-15 22:21:08'),(14223,528,1,10673,'0.99','2005-08-01 17:11:51','2006-02-15 22:21:09'),(14224,528,1,10880,'2.99','2005-08-02 00:34:12','2006-02-15 22:21:09'),(14225,528,1,12818,'3.99','2005-08-19 01:04:59','2006-02-15 22:21:09'),(14226,528,2,13518,'2.99','2005-08-20 02:36:17','2006-02-15 22:21:09'),(14227,528,1,13600,'7.99','2005-08-20 06:00:25','2006-02-15 22:21:09'),(14228,528,2,14148,'2.99','2005-08-21 02:17:49','2006-02-15 22:21:09'),(14229,528,2,15880,'6.99','2005-08-23 16:43:54','2006-02-15 22:21:09'),(14230,529,1,453,'2.99','2005-05-27 19:31:16','2006-02-15 22:21:09'),(14231,529,1,1234,'1.99','2005-06-15 04:21:52','2006-02-15 22:21:09'),(14232,529,2,1686,'0.99','2005-06-16 12:08:20','2006-02-15 22:21:09'),(14233,529,2,3354,'0.99','2005-06-21 11:29:49','2006-02-15 22:21:09'),(14234,529,2,4045,'0.99','2005-07-07 03:26:14','2006-02-15 22:21:09'),(14235,529,2,4254,'0.99','2005-07-07 14:13:52','2006-02-15 22:21:09'),(14236,529,2,4444,'5.99','2005-07-07 23:07:44','2006-02-15 22:21:09'),(14237,529,1,4553,'0.99','2005-07-08 04:43:41','2006-02-15 22:21:09'),(14238,529,1,5993,'4.99','2005-07-11 01:06:41','2006-02-15 22:21:10'),(14239,529,2,6538,'6.99','2005-07-12 04:50:26','2006-02-15 22:21:10'),(14240,529,2,6541,'5.99','2005-07-12 04:53:41','2006-02-15 22:21:10'),(14241,529,1,6908,'7.99','2005-07-12 22:08:46','2006-02-15 22:21:10'),(14242,529,1,7128,'3.99','2005-07-27 06:14:36','2006-02-15 22:21:10'),(14243,529,2,8708,'2.99','2005-07-29 17:24:13','2006-02-15 22:21:10'),(14244,529,1,8979,'5.99','2005-07-30 04:20:25','2006-02-15 22:21:10'),(14245,529,2,9310,'4.99','2005-07-30 16:57:09','2006-02-15 22:21:10'),(14246,529,2,9375,'0.99','2005-07-30 19:10:17','2006-02-15 22:21:10'),(14247,529,2,10361,'10.99','2005-08-01 05:53:49','2006-02-15 22:21:10'),(14248,529,1,11862,'2.99','2005-08-17 13:54:53','2006-02-15 22:21:10'),(14249,529,2,12356,'2.99','2005-08-18 07:37:05','2006-02-15 22:21:10'),(14250,529,1,12622,'3.99','2005-08-18 17:34:11','2006-02-15 22:21:10'),(14251,529,1,13011,'4.99','2005-08-19 07:53:58','2006-02-15 22:21:10'),(14252,529,2,13132,'3.99','2005-08-19 12:10:57','2006-02-15 22:21:10'),(14253,529,1,13797,'2.99','2005-08-20 12:33:36','2006-02-15 22:21:11'),(14254,529,2,13946,'9.99','2005-08-20 17:44:32','2006-02-15 22:21:11'),(14255,529,2,14449,'4.99','2005-08-21 12:13:18','2006-02-15 22:21:11'),(14256,529,2,14764,'0.99','2005-08-21 23:37:47','2006-02-15 22:21:11'),(14257,529,1,14970,'5.99','2005-08-22 06:49:29','2006-02-15 22:21:11'),(14258,529,2,15305,'2.99','2005-08-22 19:46:05','2006-02-15 22:21:11'),(14259,530,1,851,'0.99','2005-05-30 01:35:15','2006-02-15 22:21:11'),(14260,530,2,1273,'1.99','2005-06-15 07:52:35','2006-02-15 22:21:11'),(14261,530,1,1516,'0.99','2005-06-15 23:11:10','2006-02-15 22:21:11'),(14262,530,1,2158,'2.99','2005-06-17 23:36:27','2006-02-15 22:21:11'),(14263,530,2,3669,'2.99','2005-07-06 08:38:29','2006-02-15 22:21:11'),(14264,530,2,3887,'4.99','2005-07-06 18:46:34','2006-02-15 22:21:11'),(14265,530,2,5663,'0.99','2005-07-10 08:01:33','2006-02-15 22:21:11'),(14266,530,1,7031,'3.99','2005-07-27 03:02:07','2006-02-15 22:21:11'),(14267,530,2,7075,'1.99','2005-07-27 04:11:40','2006-02-15 22:21:11'),(14268,530,1,7218,'4.99','2005-07-27 09:34:24','2006-02-15 22:21:11'),(14269,530,2,8208,'4.99','2005-07-28 23:26:35','2006-02-15 22:21:12'),(14270,530,1,8736,'0.99','2005-07-29 18:31:15','2006-02-15 22:21:12'),(14271,530,1,9914,'4.99','2005-07-31 14:51:19','2006-02-15 22:21:12'),(14272,530,2,10211,'3.99','2005-08-01 01:01:16','2006-02-15 22:21:12'),(14273,530,2,10504,'4.99','2005-08-01 11:10:55','2006-02-15 22:21:12'),(14274,530,1,11326,'0.99','2005-08-02 16:34:29','2006-02-15 22:21:12'),(14275,530,1,12220,'4.99','2005-08-18 02:50:02','2006-02-15 22:21:12'),(14276,530,1,12387,'2.99','2005-08-18 08:46:24','2006-02-15 22:21:12'),(14277,530,1,12649,'4.99','2005-08-18 18:31:47','2006-02-15 22:21:12'),(14278,530,1,13998,'5.99','2005-08-20 19:52:38','2006-02-15 22:21:12'),(14279,530,2,14707,'5.99','2005-08-21 21:06:29','2006-02-15 22:21:12'),(14280,530,2,15066,'0.99','2005-08-22 10:49:06','2006-02-15 22:21:12'),(14281,530,1,13561,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:12'),(14282,531,1,233,'4.99','2005-05-26 11:43:44','2006-02-15 22:21:12'),(14283,531,1,681,'2.99','2005-05-28 23:39:44','2006-02-15 22:21:12'),(14284,531,2,2972,'2.99','2005-06-20 07:57:54','2006-02-15 22:21:13'),(14285,531,2,3921,'5.99','2005-07-06 20:29:48','2006-02-15 22:21:13'),(14286,531,1,5587,'5.99','2005-07-10 04:17:25','2006-02-15 22:21:13'),(14287,531,2,5850,'0.99','2005-07-10 17:36:27','2006-02-15 22:21:13'),(14288,531,2,5904,'4.99','2005-07-10 20:39:44','2006-02-15 22:21:13'),(14289,531,1,6756,'4.99','2005-07-12 15:08:28','2006-02-15 22:21:13'),(14290,531,1,6876,'4.99','2005-07-12 20:32:50','2006-02-15 22:21:13'),(14291,531,2,7204,'2.99','2005-07-27 09:02:31','2006-02-15 22:21:13'),(14292,531,1,7391,'6.99','2005-07-27 16:00:00','2006-02-15 22:21:13'),(14293,531,2,7444,'2.99','2005-07-27 17:49:16','2006-02-15 22:21:13'),(14294,531,2,7753,'6.99','2005-07-28 06:09:19','2006-02-15 22:21:13'),(14295,531,2,8359,'5.99','2005-07-29 05:02:12','2006-02-15 22:21:13'),(14296,531,2,8860,'4.99','2005-07-29 23:45:57','2006-02-15 22:21:13'),(14297,531,2,8943,'0.99','2005-07-30 03:06:48','2006-02-15 22:21:13'),(14298,531,2,9107,'4.99','2005-07-30 08:52:45','2006-02-15 22:21:13'),(14299,531,2,10920,'4.99','2005-08-02 02:14:10','2006-02-15 22:21:14'),(14300,531,1,10941,'5.99','2005-08-02 03:11:33','2006-02-15 22:21:14'),(14301,531,2,11026,'4.99','2005-08-02 05:46:05','2006-02-15 22:21:14'),(14302,531,1,11265,'10.99','2005-08-02 14:05:42','2006-02-15 22:21:14'),(14303,531,1,11666,'2.99','2005-08-17 05:45:10','2006-02-15 22:21:14'),(14304,531,1,12923,'2.99','2005-08-19 04:50:20','2006-02-15 22:21:14'),(14305,531,2,13300,'8.99','2005-08-19 18:46:56','2006-02-15 22:21:14'),(14306,531,2,15360,'0.99','2005-08-22 21:36:51','2006-02-15 22:21:14'),(14307,532,1,43,'2.99','2005-05-25 05:39:25','2006-02-15 22:21:14'),(14308,532,1,1694,'4.99','2005-06-16 12:40:23','2006-02-15 22:21:14'),(14309,532,2,2821,'3.99','2005-06-19 20:26:52','2006-02-15 22:21:14'),(14310,532,1,4336,'2.99','2005-07-07 18:34:36','2006-02-15 22:21:14'),(14311,532,2,4962,'4.99','2005-07-08 23:36:13','2006-02-15 22:21:14'),(14312,532,2,5190,'2.99','2005-07-09 10:25:24','2006-02-15 22:21:14'),(14313,532,1,5253,'7.99','2005-07-09 13:41:17','2006-02-15 22:21:14'),(14314,532,2,5278,'4.99','2005-07-09 14:44:23','2006-02-15 22:21:14'),(14315,532,2,5805,'8.99','2005-07-10 15:08:41','2006-02-15 22:21:15'),(14316,532,1,5887,'2.99','2005-07-10 19:45:47','2006-02-15 22:21:15'),(14317,532,2,6345,'7.99','2005-07-11 20:05:18','2006-02-15 22:21:15'),(14318,532,2,6598,'4.99','2005-07-12 07:38:25','2006-02-15 22:21:15'),(14319,532,1,6730,'3.99','2005-07-12 13:58:25','2006-02-15 22:21:15'),(14320,532,1,7192,'4.99','2005-07-27 08:36:55','2006-02-15 22:21:15'),(14321,532,2,7572,'2.99','2005-07-27 22:44:29','2006-02-15 22:21:15'),(14322,532,1,8273,'5.99','2005-07-29 01:33:16','2006-02-15 22:21:15'),(14323,532,1,9843,'2.99','2005-07-31 12:25:28','2006-02-15 22:21:15'),(14324,532,2,10286,'6.99','2005-08-01 03:35:58','2006-02-15 22:21:15'),(14325,532,2,10712,'5.99','2005-08-01 18:47:56','2006-02-15 22:21:15'),(14326,532,1,10945,'5.99','2005-08-02 03:20:23','2006-02-15 22:21:15'),(14327,532,2,11251,'2.99','2005-08-02 13:40:49','2006-02-15 22:21:15'),(14328,532,2,11318,'4.99','2005-08-02 16:09:11','2006-02-15 22:21:15'),(14329,532,2,12061,'3.99','2005-08-17 21:13:35','2006-02-15 22:21:15'),(14330,532,2,12295,'5.99','2005-08-18 05:15:46','2006-02-15 22:21:16'),(14331,532,2,13038,'4.99','2005-08-19 08:55:16','2006-02-15 22:21:16'),(14332,532,1,13192,'8.99','2005-08-19 14:30:06','2006-02-15 22:21:16'),(14333,532,1,13254,'4.99','2005-08-19 16:54:01','2006-02-15 22:21:16'),(14334,532,1,13908,'4.99','2005-08-20 16:21:40','2006-02-15 22:21:16'),(14335,532,2,15180,'0.99','2005-08-22 15:42:57','2006-02-15 22:21:16'),(14336,532,2,15414,'1.99','2005-08-22 23:43:54','2006-02-15 22:21:16'),(14337,532,1,16014,'5.99','2005-08-23 21:18:31','2006-02-15 22:21:16'),(14338,532,1,14616,'0.99','2006-02-14 15:16:03','2006-02-15 22:21:16'),(14339,533,1,173,'0.99','2005-05-26 03:42:10','2006-02-15 22:21:16'),(14340,533,2,190,'1.99','2005-05-26 06:11:28','2006-02-15 22:21:16'),(14341,533,1,615,'5.99','2005-05-28 15:35:52','2006-02-15 22:21:16'),(14342,533,1,1421,'5.99','2005-06-15 17:57:04','2006-02-15 22:21:16'),(14343,533,1,1652,'0.99','2005-06-16 09:31:37','2006-02-15 22:21:16'),(14344,533,1,1859,'0.99','2005-06-17 01:13:38','2006-02-15 22:21:16'),(14345,533,1,1954,'2.99','2005-06-17 08:37:55','2006-02-15 22:21:17'),(14346,533,2,2770,'6.99','2005-06-19 17:54:22','2006-02-15 22:21:17'),(14347,533,1,2956,'0.99','2005-06-20 06:47:23','2006-02-15 22:21:17'),(14348,533,1,4112,'8.99','2005-07-07 06:49:09','2006-02-15 22:21:17'),(14349,533,1,4788,'4.99','2005-07-08 16:17:35','2006-02-15 22:21:17'),(14350,533,2,6781,'2.99','2005-07-12 16:21:47','2006-02-15 22:21:17'),(14351,533,2,6834,'0.99','2005-07-12 18:53:37','2006-02-15 22:21:17'),(14352,533,2,6837,'9.99','2005-07-12 18:59:45','2006-02-15 22:21:17'),(14353,533,2,7555,'4.99','2005-07-27 22:17:05','2006-02-15 22:21:17'),(14354,533,1,8093,'8.99','2005-07-28 18:29:16','2006-02-15 22:21:17'),(14355,533,2,8104,'2.99','2005-07-28 18:59:36','2006-02-15 22:21:17'),(14356,533,2,8250,'2.99','2005-07-29 00:49:15','2006-02-15 22:21:17'),(14357,533,1,8471,'2.99','2005-07-29 08:32:11','2006-02-15 22:21:17'),(14358,533,1,8676,'1.99','2005-07-29 15:59:06','2006-02-15 22:21:17'),(14359,533,2,8786,'1.99','2005-07-29 20:39:49','2006-02-15 22:21:17'),(14360,533,2,10090,'3.99','2005-07-31 20:22:01','2006-02-15 22:21:17'),(14361,533,1,10380,'2.99','2005-08-01 06:34:36','2006-02-15 22:21:18'),(14362,533,1,10614,'6.99','2005-08-01 14:57:00','2006-02-15 22:21:18'),(14363,533,2,11524,'7.99','2005-08-17 00:10:55','2006-02-15 22:21:18'),(14364,533,1,11758,'8.99','2005-08-17 09:33:02','2006-02-15 22:21:18'),(14365,533,1,11918,'2.99','2005-08-17 16:08:42','2006-02-15 22:21:18'),(14366,533,1,12602,'0.99','2005-08-18 16:49:50','2006-02-15 22:21:18'),(14367,533,1,12655,'6.99','2005-08-18 18:57:44','2006-02-15 22:21:18'),(14368,533,1,14263,'7.99','2005-08-21 06:08:15','2006-02-15 22:21:18'),(14369,533,1,14800,'4.99','2005-08-22 00:46:18','2006-02-15 22:21:18'),(14370,533,2,16006,'0.99','2005-08-23 21:01:09','2006-02-15 22:21:18'),(14371,533,2,14018,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:18'),(14372,534,2,304,'5.99','2005-05-26 21:21:28','2006-02-15 22:21:18'),(14373,534,2,940,'0.99','2005-05-30 15:01:02','2006-02-15 22:21:18'),(14374,534,1,1610,'4.99','2005-06-16 06:36:33','2006-02-15 22:21:18'),(14375,534,1,1673,'2.99','2005-06-16 10:40:17','2006-02-15 22:21:18'),(14376,534,1,2436,'0.99','2005-06-18 18:13:32','2006-02-15 22:21:19'),(14377,534,2,3213,'1.99','2005-06-21 01:05:19','2006-02-15 22:21:19'),(14378,534,1,3216,'4.99','2005-06-21 01:19:37','2006-02-15 22:21:19'),(14379,534,1,3735,'2.99','2005-07-06 11:42:04','2006-02-15 22:21:19'),(14380,534,2,4998,'4.99','2005-07-09 01:07:21','2006-02-15 22:21:19'),(14381,534,2,7113,'2.99','2005-07-27 05:41:20','2006-02-15 22:21:19'),(14382,534,1,7662,'2.99','2005-07-28 02:16:08','2006-02-15 22:21:19'),(14383,534,2,8633,'0.99','2005-07-29 14:19:53','2006-02-15 22:21:19'),(14384,534,1,9456,'5.99','2005-07-30 22:22:16','2006-02-15 22:21:19'),(14385,534,2,9464,'4.99','2005-07-30 22:31:31','2006-02-15 22:21:19'),(14386,534,2,10465,'5.99','2005-08-01 09:45:25','2006-02-15 22:21:19'),(14387,534,2,10725,'6.99','2005-08-01 19:11:04','2006-02-15 22:21:19'),(14388,534,1,10796,'0.99','2005-08-01 21:56:41','2006-02-15 22:21:19'),(14389,534,2,11180,'5.99','2005-08-02 10:54:30','2006-02-15 22:21:19'),(14390,534,2,12305,'2.99','2005-08-18 05:46:29','2006-02-15 22:21:19'),(14391,534,1,12691,'5.99','2005-08-18 20:07:46','2006-02-15 22:21:20'),(14392,534,2,12798,'4.99','2005-08-19 00:24:33','2006-02-15 22:21:20'),(14393,534,2,13294,'0.99','2005-08-19 18:36:35','2006-02-15 22:21:20'),(14394,534,2,14816,'1.99','2005-08-22 01:15:51','2006-02-15 22:21:20'),(14395,534,1,14526,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:20'),(14396,535,1,37,'0.99','2005-05-25 04:44:31','2006-02-15 22:21:20'),(14397,535,2,541,'2.99','2005-05-28 06:41:58','2006-02-15 22:21:20'),(14398,535,1,778,'3.99','2005-05-29 14:09:53','2006-02-15 22:21:20'),(14399,535,2,959,'4.99','2005-05-30 18:07:00','2006-02-15 22:21:20'),(14400,535,1,1712,'4.99','2005-06-16 14:25:09','2006-02-15 22:21:20'),(14401,535,1,3228,'4.99','2005-06-21 02:20:24','2006-02-15 22:21:20'),(14402,535,1,4331,'4.99','2005-07-07 18:22:30','2006-02-15 22:21:20'),(14403,535,1,4718,'6.99','2005-07-08 12:32:08','2006-02-15 22:21:20'),(14404,535,1,4743,'2.99','2005-07-08 13:42:36','2006-02-15 22:21:20'),(14405,535,2,4914,'6.99','2005-07-08 21:30:53','2006-02-15 22:21:20'),(14406,535,1,5588,'0.99','2005-07-10 04:21:10','2006-02-15 22:21:21'),(14407,535,2,5890,'8.99','2005-07-10 20:00:25','2006-02-15 22:21:21'),(14408,535,1,6504,'2.99','2005-07-12 03:19:14','2006-02-15 22:21:21'),(14409,535,1,8395,'2.99','2005-07-29 06:03:30','2006-02-15 22:21:21'),(14410,535,1,8645,'4.99','2005-07-29 14:47:45','2006-02-15 22:21:21'),(14411,535,2,9440,'0.99','2005-07-30 21:40:15','2006-02-15 22:21:21'),(14412,535,1,9524,'4.99','2005-07-31 01:01:06','2006-02-15 22:21:21'),(14413,535,2,10322,'5.99','2005-08-01 04:44:13','2006-02-15 22:21:21'),(14414,535,2,10353,'3.99','2005-08-01 05:46:33','2006-02-15 22:21:21'),(14415,535,2,11736,'8.99','2005-08-17 08:40:55','2006-02-15 22:21:21'),(14416,535,1,11855,'7.99','2005-08-17 13:43:07','2006-02-15 22:21:21'),(14417,535,2,12168,'2.99','2005-08-18 01:03:52','2006-02-15 22:21:21'),(14418,535,1,12233,'0.99','2005-08-18 03:16:54','2006-02-15 22:21:21'),(14419,535,2,12673,'4.99','2005-08-18 19:21:56','2006-02-15 22:21:21'),(14420,535,1,12732,'0.99','2005-08-18 21:57:50','2006-02-15 22:21:21'),(14421,535,2,12750,'1.99','2005-08-18 22:32:39','2006-02-15 22:21:21'),(14422,535,1,13631,'4.99','2005-08-20 07:07:37','2006-02-15 22:21:22'),(14423,535,1,13852,'0.99','2005-08-20 14:45:23','2006-02-15 22:21:22'),(14424,535,1,14522,'4.99','2005-08-21 15:01:34','2006-02-15 22:21:22'),(14425,535,2,15075,'5.99','2005-08-22 11:04:52','2006-02-15 22:21:22'),(14426,535,1,15287,'6.99','2005-08-22 19:19:37','2006-02-15 22:21:22'),(14427,535,1,16017,'0.99','2005-08-23 21:27:11','2006-02-15 22:21:22'),(14428,536,1,237,'0.99','2005-05-26 12:15:13','2006-02-15 22:21:22'),(14429,536,1,929,'6.99','2005-05-30 12:32:39','2006-02-15 22:21:22'),(14430,536,1,1582,'4.99','2005-06-16 04:31:57','2006-02-15 22:21:22'),(14431,536,2,1962,'2.99','2005-06-17 09:08:58','2006-02-15 22:21:22'),(14432,536,2,2403,'2.99','2005-06-18 16:33:22','2006-02-15 22:21:22'),(14433,536,1,3483,'4.99','2005-07-05 23:13:51','2006-02-15 22:21:22'),(14434,536,1,3514,'0.99','2005-07-06 00:46:54','2006-02-15 22:21:22'),(14435,536,1,4448,'2.99','2005-07-07 23:17:12','2006-02-15 22:21:22'),(14436,536,2,5196,'0.99','2005-07-09 10:43:34','2006-02-15 22:21:22'),(14437,536,1,6400,'5.99','2005-07-11 22:43:44','2006-02-15 22:21:23'),(14438,536,1,7065,'4.99','2005-07-27 03:53:43','2006-02-15 22:21:23'),(14439,536,2,8535,'4.99','2005-07-29 10:32:33','2006-02-15 22:21:23'),(14440,536,1,8679,'4.99','2005-07-29 16:07:47','2006-02-15 22:21:23'),(14441,536,1,8958,'2.99','2005-07-30 03:34:26','2006-02-15 22:21:23'),(14442,536,1,9411,'8.99','2005-07-30 20:38:22','2006-02-15 22:21:23'),(14443,536,1,9727,'4.99','2005-07-31 08:39:13','2006-02-15 22:21:23'),(14444,536,2,10019,'3.99','2005-07-31 18:20:56','2006-02-15 22:21:23'),(14445,536,1,11473,'6.99','2005-08-02 21:52:03','2006-02-15 22:21:23'),(14446,536,1,11826,'2.99','2005-08-17 12:43:46','2006-02-15 22:21:23'),(14447,536,2,11977,'4.99','2005-08-17 18:01:15','2006-02-15 22:21:23'),(14448,536,2,12052,'8.99','2005-08-17 20:57:02','2006-02-15 22:21:23'),(14449,536,2,13505,'4.99','2005-08-20 02:05:57','2006-02-15 22:21:23'),(14450,536,1,15130,'7.99','2005-08-22 13:04:32','2006-02-15 22:21:23'),(14451,536,1,15978,'8.99','2005-08-23 20:08:18','2006-02-15 22:21:23'),(14452,536,1,15979,'0.99','2005-08-23 20:08:26','2006-02-15 22:21:24'),(14453,537,2,603,'4.99','2005-05-28 14:27:51','2006-02-15 22:21:24'),(14454,537,1,1445,'2.99','2005-06-15 19:10:07','2006-02-15 22:21:24'),(14455,537,2,2184,'2.99','2005-06-18 01:10:36','2006-02-15 22:21:24'),(14456,537,1,2586,'8.99','2005-06-19 05:05:11','2006-02-15 22:21:24'),(14457,537,2,3134,'8.99','2005-06-20 19:29:09','2006-02-15 22:21:24'),(14458,537,1,3555,'0.99','2005-07-06 02:45:35','2006-02-15 22:21:24'),(14459,537,2,3853,'0.99','2005-07-06 16:59:20','2006-02-15 22:21:24'),(14460,537,1,5630,'2.99','2005-07-10 06:08:14','2006-02-15 22:21:24'),(14461,537,2,5877,'5.99','2005-07-10 19:08:51','2006-02-15 22:21:24'),(14462,537,2,6310,'2.99','2005-07-11 18:14:05','2006-02-15 22:21:24'),(14463,537,1,6409,'4.99','2005-07-11 23:05:49','2006-02-15 22:21:24'),(14464,537,1,6746,'0.99','2005-07-12 14:33:01','2006-02-15 22:21:24'),(14465,537,1,7179,'2.99','2005-07-27 08:10:29','2006-02-15 22:21:24'),(14466,537,2,7810,'4.99','2005-07-28 08:00:38','2006-02-15 22:21:24'),(14467,537,2,8126,'4.99','2005-07-28 19:32:41','2006-02-15 22:21:25'),(14468,537,2,8256,'4.99','2005-07-29 01:02:42','2006-02-15 22:21:25'),(14469,537,1,9967,'2.99','2005-07-31 16:31:17','2006-02-15 22:21:25'),(14470,537,2,12984,'4.99','2005-08-19 07:06:51','2006-02-15 22:21:25'),(14471,537,2,13885,'4.99','2005-08-20 15:32:09','2006-02-15 22:21:25'),(14472,537,1,14010,'4.99','2005-08-20 20:29:46','2006-02-15 22:21:25'),(14473,537,2,14506,'0.99','2005-08-21 14:32:27','2006-02-15 22:21:25'),(14474,537,1,14670,'0.99','2005-08-21 19:54:11','2006-02-15 22:21:25'),(14475,537,1,15149,'2.99','2005-08-22 14:08:06','2006-02-15 22:21:25'),(14476,537,1,15832,'8.99','2005-08-23 15:21:35','2006-02-15 22:21:25'),(14477,537,1,13419,'4.99','2006-02-14 15:16:03','2006-02-15 22:21:25'),(14478,538,2,594,'2.99','2005-05-28 13:41:56','2006-02-15 22:21:25'),(14479,538,2,734,'4.99','2005-05-29 07:38:52','2006-02-15 22:21:25'),(14480,538,1,1314,'5.99','2005-06-15 10:21:45','2006-02-15 22:21:25'),(14481,538,1,1912,'4.99','2005-06-17 05:18:32','2006-02-15 22:21:25'),(14482,538,1,2682,'4.99','2005-06-19 12:18:17','2006-02-15 22:21:26'),(14483,538,2,3189,'2.99','2005-06-20 23:19:33','2006-02-15 22:21:26'),(14484,538,2,3554,'4.99','2005-07-06 02:37:10','2006-02-15 22:21:26'),(14485,538,2,5135,'8.99','2005-07-09 07:53:22','2006-02-15 22:21:26'),(14486,538,1,5369,'4.99','2005-07-09 18:42:16','2006-02-15 22:21:26'),(14487,538,1,5486,'2.99','2005-07-09 23:57:44','2006-02-15 22:21:26'),(14488,538,1,5898,'2.99','2005-07-10 20:18:09','2006-02-15 22:21:26'),(14489,538,2,6130,'2.99','2005-07-11 08:19:56','2006-02-15 22:21:26'),(14490,538,1,6332,'0.99','2005-07-11 19:19:06','2006-02-15 22:21:26'),(14491,538,2,6936,'0.99','2005-07-26 23:13:34','2006-02-15 22:21:26'),(14492,538,1,7694,'0.99','2005-07-28 03:39:25','2006-02-15 22:21:26'),(14493,538,1,8765,'0.99','2005-07-29 19:40:08','2006-02-15 22:21:26'),(14494,538,1,9307,'0.99','2005-07-30 16:52:43','2006-02-15 22:21:26'),(14495,538,1,9643,'4.99','2005-07-31 05:35:48','2006-02-15 22:21:26'),(14496,538,2,9897,'4.99','2005-07-31 14:11:57','2006-02-15 22:21:26'),(14497,538,2,9939,'8.99','2005-07-31 15:29:00','2006-02-15 22:21:27'),(14498,538,2,10701,'3.99','2005-08-01 18:28:17','2006-02-15 22:21:27'),(14499,538,1,10732,'5.99','2005-08-01 19:25:18','2006-02-15 22:21:27'),(14500,538,1,10962,'4.99','2005-08-02 03:48:13','2006-02-15 22:21:27'),(14501,538,2,12089,'5.99','2005-08-17 22:20:29','2006-02-15 22:21:27'),(14502,538,1,13544,'1.99','2005-08-20 03:44:26','2006-02-15 22:21:27'),(14503,538,2,13770,'4.99','2005-08-20 11:45:54','2006-02-15 22:21:27'),(14504,538,2,14572,'2.99','2005-08-21 16:44:31','2006-02-15 22:21:27'),(14505,538,1,14591,'0.99','2005-08-21 17:30:09','2006-02-15 22:21:27'),(14506,538,1,15343,'6.99','2005-08-22 21:01:25','2006-02-15 22:21:27'),(14507,539,2,250,'4.99','2005-05-26 14:30:24','2006-02-15 22:21:27'),(14508,539,1,342,'0.99','2005-05-27 04:11:04','2006-02-15 22:21:27'),(14509,539,2,1282,'3.99','2005-06-15 08:25:33','2006-02-15 22:21:27'),(14510,539,1,1327,'0.99','2005-06-15 11:11:39','2006-02-15 22:21:27'),(14511,539,2,1444,'4.99','2005-06-15 19:08:16','2006-02-15 22:21:27'),(14512,539,1,4035,'2.99','2005-07-07 02:45:02','2006-02-15 22:21:27'),(14513,539,1,4247,'0.99','2005-07-07 13:51:54','2006-02-15 22:21:28'),(14514,539,2,5086,'4.99','2005-07-09 05:40:04','2006-02-15 22:21:28'),(14515,539,2,5139,'7.99','2005-07-09 08:01:51','2006-02-15 22:21:28'),(14516,539,2,5493,'2.99','2005-07-10 00:11:44','2006-02-15 22:21:28'),(14517,539,2,6874,'5.99','2005-07-12 20:20:53','2006-02-15 22:21:28'),(14518,539,1,7781,'2.99','2005-07-28 07:13:20','2006-02-15 22:21:28'),(14519,539,2,8247,'6.99','2005-07-29 00:41:38','2006-02-15 22:21:28'),(14520,539,2,8761,'5.99','2005-07-29 19:26:47','2006-02-15 22:21:28'),(14521,539,2,9250,'0.99','2005-07-30 14:18:16','2006-02-15 22:21:28'),(14522,539,1,9777,'7.99','2005-07-31 10:01:06','2006-02-15 22:21:28'),(14523,539,1,9796,'4.99','2005-07-31 10:52:43','2006-02-15 22:21:28'),(14524,539,2,10922,'3.99','2005-08-02 02:14:40','2006-02-15 22:21:28'),(14525,539,1,12848,'2.99','2005-08-19 02:05:11','2006-02-15 22:21:28'),(14526,539,2,13615,'2.99','2005-08-20 06:28:53','2006-02-15 22:21:28'),(14527,539,2,13778,'5.99','2005-08-20 12:03:44','2006-02-15 22:21:28'),(14528,539,1,15356,'2.99','2005-08-22 21:24:19','2006-02-15 22:21:29'),(14529,540,2,1263,'2.99','2005-06-15 06:56:39','2006-02-15 22:21:29'),(14530,540,2,1290,'4.99','2005-06-15 08:52:44','2006-02-15 22:21:29'),(14531,540,2,2640,'2.99','2005-06-19 09:26:13','2006-02-15 22:21:29'),(14532,540,1,2953,'3.99','2005-06-20 06:39:11','2006-02-15 22:21:29'),(14533,540,1,3340,'3.99','2005-06-21 10:37:23','2006-02-15 22:21:29'),(14534,540,2,4628,'4.99','2005-07-08 08:25:52','2006-02-15 22:21:29'),(14535,540,2,4991,'4.99','2005-07-09 00:49:03','2006-02-15 22:21:29'),(14536,540,1,6103,'2.99','2005-07-11 06:59:55','2006-02-15 22:21:29'),(14537,540,2,6145,'7.99','2005-07-11 09:07:01','2006-02-15 22:21:29'),(14538,540,2,6182,'2.99','2005-07-11 11:11:38','2006-02-15 22:21:29'),(14539,540,1,6748,'6.99','2005-07-12 14:39:27','2006-02-15 22:21:29'),(14540,540,1,6919,'0.99','2005-07-12 22:32:17','2006-02-15 22:21:29'),(14541,540,2,9762,'4.99','2005-07-31 09:32:54','2006-02-15 22:21:29'),(14542,540,2,9815,'2.99','2005-07-31 11:30:51','2006-02-15 22:21:29'),(14543,540,1,10924,'8.99','2005-08-02 02:20:19','2006-02-15 22:21:30'),(14544,540,1,11198,'3.99','2005-08-02 11:45:15','2006-02-15 22:21:30'),(14545,540,2,11324,'4.99','2005-08-02 16:31:17','2006-02-15 22:21:30'),(14546,540,2,11432,'6.99','2005-08-02 20:10:01','2006-02-15 22:21:30'),(14547,540,2,12058,'8.99','2005-08-17 21:07:41','2006-02-15 22:21:30'),(14548,540,2,12201,'4.99','2005-08-18 02:14:06','2006-02-15 22:21:30'),(14549,540,1,12300,'6.99','2005-08-18 05:36:14','2006-02-15 22:21:30'),(14550,540,2,14910,'0.99','2005-08-22 04:50:52','2006-02-15 22:21:30'),(14551,540,2,15079,'2.99','2005-08-22 11:09:56','2006-02-15 22:21:30'),(14552,540,2,15953,'3.99','2005-08-23 19:13:46','2006-02-15 22:21:30'),(14553,541,1,1021,'7.99','2005-05-31 03:16:15','2006-02-15 22:21:30'),(14554,541,1,1066,'4.99','2005-05-31 09:07:33','2006-02-15 22:21:30'),(14555,541,2,1986,'2.99','2005-06-17 10:34:59','2006-02-15 22:21:30'),(14556,541,1,2708,'6.99','2005-06-19 13:59:05','2006-02-15 22:21:30'),(14557,541,1,5018,'2.99','2005-07-09 02:01:05','2006-02-15 22:21:30'),(14558,541,2,5197,'4.99','2005-07-09 10:43:54','2006-02-15 22:21:31'),(14559,541,2,6468,'7.99','2005-07-12 01:27:09','2006-02-15 22:21:31'),(14560,541,2,6718,'2.99','2005-07-12 13:38:06','2006-02-15 22:21:31'),(14561,541,1,8113,'8.99','2005-07-28 19:14:00','2006-02-15 22:21:31'),(14562,541,1,8322,'4.99','2005-07-29 03:52:49','2006-02-15 22:21:31'),(14563,541,2,9603,'0.99','2005-07-31 03:43:43','2006-02-15 22:21:31'),(14564,541,1,10306,'5.99','2005-08-01 04:19:18','2006-02-15 22:21:31'),(14565,541,2,11273,'0.99','2005-08-02 14:20:55','2006-02-15 22:21:31'),(14566,541,1,12306,'4.99','2005-08-18 05:47:55','2006-02-15 22:21:31'),(14567,541,2,12395,'4.99','2005-08-18 09:06:30','2006-02-15 22:21:31'),(14568,541,1,12894,'7.99','2005-08-19 03:49:28','2006-02-15 22:21:31'),(14569,541,2,13239,'4.99','2005-08-19 16:22:13','2006-02-15 22:21:31'),(14570,541,2,13640,'0.99','2005-08-20 07:22:53','2006-02-15 22:21:31'),(14571,541,2,14938,'6.99','2005-08-22 05:52:39','2006-02-15 22:21:31'),(14572,541,1,15071,'4.99','2005-08-22 10:58:43','2006-02-15 22:21:31'),(14573,541,2,15141,'3.99','2005-08-22 13:41:49','2006-02-15 22:21:32'),(14574,541,1,15223,'1.99','2005-08-22 17:13:39','2006-02-15 22:21:32'),(14575,541,1,15421,'0.99','2005-08-22 23:56:37','2006-02-15 22:21:32'),(14576,541,2,15924,'1.99','2005-08-23 18:08:59','2006-02-15 22:21:32'),(14577,542,1,220,'4.99','2005-05-26 10:06:49','2006-02-15 22:21:32'),(14578,542,2,376,'4.99','2005-05-27 08:58:15','2006-02-15 22:21:32'),(14579,542,1,2610,'4.99','2005-06-19 07:16:20','2006-02-15 22:21:32'),(14580,542,2,2957,'10.99','2005-06-20 06:53:47','2006-02-15 22:21:32'),(14581,542,2,5293,'0.99','2005-07-09 15:17:23','2006-02-15 22:21:32'),(14582,542,1,5477,'6.99','2005-07-09 23:43:49','2006-02-15 22:21:32'),(14583,542,2,6077,'5.99','2005-07-11 05:06:08','2006-02-15 22:21:32'),(14584,542,2,6325,'5.99','2005-07-11 19:06:01','2006-02-15 22:21:32'),(14585,542,1,6887,'9.99','2005-07-12 21:00:23','2006-02-15 22:21:32'),(14586,542,2,7672,'8.99','2005-07-28 02:49:41','2006-02-15 22:21:32'),(14587,542,1,8533,'4.99','2005-07-29 10:29:16','2006-02-15 22:21:32'),(14588,542,2,8544,'3.99','2005-07-29 11:02:08','2006-02-15 22:21:33'),(14589,542,1,10280,'4.99','2005-08-01 03:27:15','2006-02-15 22:21:33'),(14590,542,2,11583,'0.99','2005-08-17 02:08:13','2006-02-15 22:21:33'),(14591,542,2,11903,'2.99','2005-08-17 15:37:45','2006-02-15 22:21:33'),(14592,542,1,12819,'0.99','2005-08-19 01:05:05','2006-02-15 22:21:33'),(14593,542,1,13447,'0.99','2005-08-20 00:09:36','2006-02-15 22:21:33'),(14594,542,2,14982,'9.99','2005-08-22 07:20:55','2006-02-15 22:21:33'),(14595,543,1,243,'6.99','2005-05-26 13:06:05','2006-02-15 22:21:33'),(14596,543,2,476,'1.99','2005-05-27 22:31:36','2006-02-15 22:21:33'),(14597,543,2,1720,'4.99','2005-06-16 15:00:14','2006-02-15 22:21:33'),(14598,543,1,2426,'2.99','2005-06-18 17:40:44','2006-02-15 22:21:33'),(14599,543,2,3070,'4.99','2005-06-20 14:15:39','2006-02-15 22:21:33'),(14600,543,1,3128,'2.99','2005-06-20 18:41:47','2006-02-15 22:21:33'),(14601,543,2,3467,'5.99','2005-06-21 22:19:25','2006-02-15 22:21:33'),(14602,543,1,4887,'2.99','2005-07-08 19:59:14','2006-02-15 22:21:33'),(14603,543,2,5467,'4.99','2005-07-09 23:05:47','2006-02-15 22:21:34'),(14604,543,2,6013,'4.99','2005-07-11 02:02:03','2006-02-15 22:21:34'),(14605,543,2,7312,'2.99','2005-07-27 13:03:14','2006-02-15 22:21:34'),(14606,543,1,8580,'2.99','2005-07-29 12:00:27','2006-02-15 22:21:34'),(14607,543,2,8845,'4.99','2005-07-29 23:06:13','2006-02-15 22:21:34'),(14608,543,1,9505,'2.99','2005-07-31 00:11:19','2006-02-15 22:21:34'),(14609,543,1,9999,'0.99','2005-07-31 17:40:53','2006-02-15 22:21:34'),(14610,543,2,10257,'0.99','2005-08-01 02:49:43','2006-02-15 22:21:34'),(14611,543,1,10520,'4.99','2005-08-01 11:45:58','2006-02-15 22:21:34'),(14612,543,2,11241,'9.99','2005-08-02 13:29:24','2006-02-15 22:21:34'),(14613,543,1,11681,'2.99','2005-08-17 06:13:30','2006-02-15 22:21:34'),(14614,543,1,13187,'0.99','2005-08-19 14:24:48','2006-02-15 22:21:34'),(14615,543,2,15281,'1.99','2005-08-22 19:10:26','2006-02-15 22:21:34'),(14616,543,1,15785,'1.99','2005-08-23 13:46:27','2006-02-15 22:21:34'),(14617,544,1,397,'2.99','2005-05-27 12:29:02','2006-02-15 22:21:34'),(14618,544,1,864,'2.99','2005-05-30 03:27:17','2006-02-15 22:21:35'),(14619,544,1,1248,'1.99','2005-06-15 05:33:52','2006-02-15 22:21:35'),(14620,544,2,1434,'10.99','2005-06-15 18:30:46','2006-02-15 22:21:35'),(14621,544,1,2373,'0.99','2005-06-18 14:37:57','2006-02-15 22:21:35'),(14622,544,1,2395,'2.99','2005-06-18 15:45:15','2006-02-15 22:21:35'),(14623,544,1,4395,'0.99','2005-07-07 21:13:22','2006-02-15 22:21:35'),(14624,544,1,4703,'2.99','2005-07-08 11:44:56','2006-02-15 22:21:35'),(14625,544,2,4847,'6.99','2005-07-08 18:29:13','2006-02-15 22:21:35'),(14626,544,2,8566,'2.99','2005-07-29 11:35:46','2006-02-15 22:21:35'),(14627,544,1,8937,'5.99','2005-07-30 02:53:21','2006-02-15 22:21:35'),(14628,544,1,8963,'9.99','2005-07-30 03:46:26','2006-02-15 22:21:35'),(14629,544,1,10735,'0.99','2005-08-01 19:29:45','2006-02-15 22:21:35'),(14630,544,1,11401,'3.99','2005-08-02 19:05:06','2006-02-15 22:21:35'),(14631,544,2,11766,'2.99','2005-08-17 09:58:40','2006-02-15 22:21:35'),(14632,544,2,12640,'3.99','2005-08-18 18:14:49','2006-02-15 22:21:36'),(14633,544,2,14142,'4.99','2005-08-21 02:07:43','2006-02-15 22:21:36'),(14634,544,1,14498,'4.99','2005-08-21 14:10:44','2006-02-15 22:21:36'),(14635,544,2,14651,'8.99','2005-08-21 19:31:09','2006-02-15 22:21:36'),(14636,544,1,14981,'2.99','2005-08-22 07:19:05','2006-02-15 22:21:36'),(14637,544,1,15219,'6.99','2005-08-22 17:00:31','2006-02-15 22:21:36'),(14638,544,1,15605,'4.99','2005-08-23 06:48:47','2006-02-15 22:21:36'),(14639,545,2,248,'0.99','2005-05-26 14:07:58','2006-02-15 22:21:36'),(14640,545,2,715,'3.99','2005-05-29 04:22:41','2006-02-15 22:21:36'),(14641,545,1,2123,'2.99','2005-06-17 20:48:30','2006-02-15 22:21:36'),(14642,545,2,3693,'8.99','2005-07-06 09:56:09','2006-02-15 22:21:36'),(14643,545,1,3975,'5.99','2005-07-06 23:00:09','2006-02-15 22:21:36'),(14644,545,1,4597,'5.99','2005-07-08 06:43:42','2006-02-15 22:21:36'),(14645,545,1,5264,'0.99','2005-07-09 14:11:28','2006-02-15 22:21:36'),(14646,545,1,7078,'5.99','2005-07-27 04:16:37','2006-02-15 22:21:36'),(14647,545,2,8599,'3.99','2005-07-29 12:58:52','2006-02-15 22:21:37'),(14648,545,2,8848,'2.99','2005-07-29 23:20:58','2006-02-15 22:21:37'),(14649,545,2,9810,'2.99','2005-07-31 11:22:41','2006-02-15 22:21:37'),(14650,545,2,9942,'4.99','2005-07-31 15:35:43','2006-02-15 22:21:37'),(14651,545,2,10931,'2.99','2005-08-02 02:44:59','2006-02-15 22:21:37'),(14652,545,2,11760,'2.99','2005-08-17 09:44:22','2006-02-15 22:21:37'),(14653,545,1,12098,'4.99','2005-08-17 22:38:31','2006-02-15 22:21:37'),(14654,545,1,12349,'2.99','2005-08-18 07:23:42','2006-02-15 22:21:37'),(14655,545,2,12667,'10.99','2005-08-18 19:11:45','2006-02-15 22:21:37'),(14656,545,1,12800,'2.99','2005-08-19 00:27:11','2006-02-15 22:21:37'),(14657,545,1,13595,'4.99','2005-08-20 05:54:27','2006-02-15 22:21:37'),(14658,545,1,15585,'0.99','2005-08-23 05:55:22','2006-02-15 22:21:37'),(14659,545,2,15998,'4.99','2005-08-23 20:41:09','2006-02-15 22:21:37'),(14660,546,1,197,'5.99','2005-05-26 06:59:21','2006-02-15 22:21:37'),(14661,546,1,482,'6.99','2005-05-27 22:53:02','2006-02-15 22:21:37'),(14662,546,1,1181,'1.99','2005-06-15 00:42:17','2006-02-15 22:21:38'),(14663,546,2,1403,'0.99','2005-06-15 16:31:59','2006-02-15 22:21:38'),(14664,546,1,1787,'3.99','2005-06-16 19:30:59','2006-02-15 22:21:38'),(14665,546,1,2361,'5.99','2005-06-18 13:19:05','2006-02-15 22:21:38'),(14666,546,1,3738,'4.99','2005-07-06 11:50:57','2006-02-15 22:21:38'),(14667,546,2,4664,'0.99','2005-07-08 10:01:28','2006-02-15 22:21:38'),(14668,546,1,4734,'0.99','2005-07-08 13:12:12','2006-02-15 22:21:38'),(14669,546,1,5629,'0.99','2005-07-10 06:02:25','2006-02-15 22:21:38'),(14670,546,2,6758,'9.99','2005-07-12 15:13:49','2006-02-15 22:21:38'),(14671,546,1,6786,'2.99','2005-07-12 16:32:33','2006-02-15 22:21:38'),(14672,546,2,6910,'6.99','2005-07-12 22:11:21','2006-02-15 22:21:38'),(14673,546,1,8532,'4.99','2005-07-29 10:26:56','2006-02-15 22:21:38'),(14674,546,1,9087,'4.99','2005-07-30 08:19:47','2006-02-15 22:21:38'),(14675,546,1,NULL,'3.99','2005-07-30 21:16:20','2006-02-15 22:21:38'),(14676,546,2,9626,'1.99','2005-07-31 04:37:41','2006-02-15 22:21:38'),(14677,546,2,10370,'0.99','2005-08-01 06:18:04','2006-02-15 22:21:39'),(14678,546,2,11352,'5.99','2005-08-02 17:29:39','2006-02-15 22:21:39'),(14679,546,1,11797,'4.99','2005-08-17 11:17:21','2006-02-15 22:21:39'),(14680,546,2,12591,'2.99','2005-08-18 16:16:41','2006-02-15 22:21:39'),(14681,546,2,13850,'5.99','2005-08-20 14:43:03','2006-02-15 22:21:39'),(14682,546,1,14797,'4.99','2005-08-22 00:41:24','2006-02-15 22:21:39'),(14683,546,1,14829,'2.99','2005-08-22 01:35:37','2006-02-15 22:21:39'),(14684,546,1,14929,'3.99','2005-08-22 05:32:38','2006-02-15 22:21:39'),(14685,546,2,15565,'4.99','2005-08-23 05:13:09','2006-02-15 22:21:39'),(14686,547,1,306,'0.99','2005-05-26 21:31:57','2006-02-15 22:21:39'),(14687,547,2,443,'8.99','2005-05-27 18:35:20','2006-02-15 22:21:39'),(14688,547,2,1094,'1.99','2005-05-31 13:03:49','2006-02-15 22:21:39'),(14689,547,2,2022,'8.99','2005-06-17 12:44:39','2006-02-15 22:21:39'),(14690,547,2,3679,'4.99','2005-07-06 09:15:57','2006-02-15 22:21:39'),(14691,547,1,3765,'4.99','2005-07-06 13:01:47','2006-02-15 22:21:40'),(14692,547,2,5327,'4.99','2005-07-09 16:39:49','2006-02-15 22:21:40'),(14693,547,2,5854,'4.99','2005-07-10 17:47:34','2006-02-15 22:21:40'),(14694,547,1,6605,'0.99','2005-07-12 08:01:07','2006-02-15 22:21:40'),(14695,547,2,7420,'4.99','2005-07-27 17:09:39','2006-02-15 22:21:40'),(14696,547,2,7547,'3.99','2005-07-27 21:51:48','2006-02-15 22:21:40'),(14697,547,1,7835,'4.99','2005-07-28 08:49:39','2006-02-15 22:21:40'),(14698,547,1,7859,'3.99','2005-07-28 09:57:17','2006-02-15 22:21:40'),(14699,547,1,8828,'2.99','2005-07-29 22:32:54','2006-02-15 22:21:40'),(14700,547,1,10903,'2.99','2005-08-02 01:41:59','2006-02-15 22:21:40'),(14701,547,1,10980,'4.99','2005-08-02 04:17:32','2006-02-15 22:21:40'),(14702,547,2,11170,'5.99','2005-08-02 10:21:53','2006-02-15 22:21:40'),(14703,547,2,11361,'0.99','2005-08-02 17:46:34','2006-02-15 22:21:40'),(14704,547,1,12579,'0.99','2005-08-18 15:47:49','2006-02-15 22:21:40'),(14705,547,2,12943,'2.99','2005-08-19 05:46:26','2006-02-15 22:21:40'),(14706,547,2,13307,'2.99','2005-08-19 18:58:44','2006-02-15 22:21:41'),(14707,547,1,14510,'9.99','2005-08-21 14:44:41','2006-02-15 22:21:41'),(14708,547,2,14884,'4.99','2005-08-22 03:57:08','2006-02-15 22:21:41'),(14709,548,2,177,'6.99','2005-05-26 04:14:29','2006-02-15 22:21:41'),(14710,548,1,743,'4.99','2005-05-29 08:39:02','2006-02-15 22:21:41'),(14711,548,2,872,'3.99','2005-05-30 05:03:04','2006-02-15 22:21:41'),(14712,548,1,1326,'1.99','2005-06-15 11:07:39','2006-02-15 22:21:41'),(14713,548,1,2280,'2.99','2005-06-18 06:46:54','2006-02-15 22:21:41'),(14714,548,2,2978,'0.99','2005-06-20 08:25:16','2006-02-15 22:21:41'),(14715,548,1,3686,'2.99','2005-07-06 09:37:50','2006-02-15 22:21:41'),(14716,548,2,3777,'2.99','2005-07-06 13:36:48','2006-02-15 22:21:41'),(14717,548,1,4155,'7.99','2005-07-07 09:00:49','2006-02-15 22:21:41'),(14718,548,2,5138,'4.99','2005-07-09 08:00:46','2006-02-15 22:21:41'),(14719,548,2,6490,'4.99','2005-07-12 02:28:03','2006-02-15 22:21:41'),(14720,548,1,9614,'5.99','2005-07-31 03:59:31','2006-02-15 22:21:41'),(14721,548,2,10318,'0.99','2005-08-01 04:36:53','2006-02-15 22:21:42'),(14722,548,1,12860,'5.99','2005-08-19 02:24:41','2006-02-15 22:21:42'),(14723,548,1,13691,'3.99','2005-08-20 09:07:39','2006-02-15 22:21:42'),(14724,548,2,13730,'7.99','2005-08-20 10:17:09','2006-02-15 22:21:42'),(14725,548,2,14188,'0.99','2005-08-21 03:32:04','2006-02-15 22:21:42'),(14726,548,2,14723,'6.99','2005-08-21 21:52:32','2006-02-15 22:21:42'),(14727,548,1,13584,'0.99','2006-02-14 15:16:03','2006-02-15 22:21:42'),(14728,549,1,6,'0.99','2005-05-24 23:08:07','2006-02-15 22:21:42'),(14729,549,2,852,'4.99','2005-05-30 01:36:57','2006-02-15 22:21:42'),(14730,549,1,906,'3.99','2005-05-30 10:30:38','2006-02-15 22:21:42'),(14731,549,2,1086,'4.99','2005-05-31 11:17:37','2006-02-15 22:21:42'),(14732,549,1,2050,'2.99','2005-06-17 15:07:30','2006-02-15 22:21:42'),(14733,549,2,3523,'2.99','2005-07-06 01:01:38','2006-02-15 22:21:42'),(14734,549,2,3892,'4.99','2005-07-06 18:58:58','2006-02-15 22:21:42'),(14735,549,1,4447,'0.99','2005-07-07 23:15:28','2006-02-15 22:21:42'),(14736,549,1,7252,'7.99','2005-07-27 10:45:28','2006-02-15 22:21:43'),(14737,549,2,8239,'0.99','2005-07-29 00:31:39','2006-02-15 22:21:43'),(14738,549,1,8316,'4.99','2005-07-29 03:38:49','2006-02-15 22:21:43'),(14739,549,2,9445,'7.99','2005-07-30 21:50:42','2006-02-15 22:21:43'),(14740,549,2,9511,'9.99','2005-07-31 00:25:05','2006-02-15 22:21:43'),(14741,549,2,9887,'0.99','2005-07-31 14:00:32','2006-02-15 22:21:43'),(14742,549,2,10281,'0.99','2005-08-01 03:28:33','2006-02-15 22:21:43'),(14743,549,2,11737,'4.99','2005-08-17 08:42:08','2006-02-15 22:21:43'),(14744,549,2,11878,'2.99','2005-08-17 14:23:52','2006-02-15 22:21:43'),(14745,549,2,12634,'2.99','2005-08-18 17:58:14','2006-02-15 22:21:43'),(14746,549,2,12747,'4.99','2005-08-18 22:28:22','2006-02-15 22:21:43'),(14747,549,1,14434,'0.99','2005-08-21 11:40:46','2006-02-15 22:21:43'),(14748,550,2,922,'7.99','2005-05-30 11:55:55','2006-02-15 22:21:43'),(14749,550,1,1233,'6.99','2005-06-15 04:18:37','2006-02-15 22:21:43'),(14750,550,1,1863,'3.99','2005-06-17 01:31:46','2006-02-15 22:21:43'),(14751,550,2,1883,'4.99','2005-06-17 03:18:51','2006-02-15 22:21:44'),(14752,550,1,3154,'2.99','2005-06-20 20:44:40','2006-02-15 22:21:44'),(14753,550,2,3236,'9.99','2005-06-21 02:47:43','2006-02-15 22:21:44'),(14754,550,1,3272,'10.99','2005-06-21 05:18:27','2006-02-15 22:21:44'),(14755,550,1,3979,'4.99','2005-07-06 23:04:35','2006-02-15 22:21:44'),(14756,550,1,5727,'4.99','2005-07-10 11:25:28','2006-02-15 22:21:44'),(14757,550,1,6695,'2.99','2005-07-12 12:39:39','2006-02-15 22:21:44'),(14758,550,1,7030,'0.99','2005-07-27 03:01:40','2006-02-15 22:21:44'),(14759,550,2,7838,'2.99','2005-07-28 09:00:21','2006-02-15 22:21:44'),(14760,550,1,8628,'6.99','2005-07-29 14:06:24','2006-02-15 22:21:44'),(14761,550,2,8838,'2.99','2005-07-29 22:52:23','2006-02-15 22:21:44'),(14762,550,1,8959,'8.99','2005-07-30 03:35:49','2006-02-15 22:21:44'),(14763,550,1,9616,'2.99','2005-07-31 04:05:01','2006-02-15 22:21:44'),(14764,550,1,9748,'0.99','2005-07-31 09:17:56','2006-02-15 22:21:44'),(14765,550,2,10140,'4.99','2005-07-31 22:03:20','2006-02-15 22:21:44'),(14766,550,1,11246,'2.99','2005-08-02 13:33:56','2006-02-15 22:21:45'),(14767,550,2,11320,'0.99','2005-08-02 16:13:28','2006-02-15 22:21:45'),(14768,550,1,11969,'4.99','2005-08-17 17:49:37','2006-02-15 22:21:45'),(14769,550,1,12063,'2.99','2005-08-17 21:24:48','2006-02-15 22:21:45'),(14770,550,2,12077,'4.99','2005-08-17 21:59:14','2006-02-15 22:21:45'),(14771,550,1,13114,'10.99','2005-08-19 11:27:32','2006-02-15 22:21:45'),(14772,550,2,14071,'2.99','2005-08-20 23:01:56','2006-02-15 22:21:45'),(14773,550,2,14127,'4.99','2005-08-21 01:33:32','2006-02-15 22:21:45'),(14774,550,2,14375,'6.99','2005-08-21 09:46:35','2006-02-15 22:21:45'),(14775,550,1,14687,'4.99','2005-08-21 20:32:16','2006-02-15 22:21:45'),(14776,550,2,15431,'9.99','2005-08-23 00:26:47','2006-02-15 22:21:45'),(14777,550,1,15883,'0.99','2005-08-23 16:44:56','2006-02-15 22:21:45'),(14778,550,2,15977,'4.99','2005-08-23 20:07:10','2006-02-15 22:21:45'),(14779,550,2,11757,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:45'),(14780,551,2,155,'7.99','2005-05-26 01:15:05','2006-02-15 22:21:45'),(14781,551,1,728,'2.99','2005-05-29 06:12:38','2006-02-15 22:21:46'),(14782,551,1,795,'0.99','2005-05-29 16:57:39','2006-02-15 22:21:46'),(14783,551,2,969,'4.99','2005-05-30 19:23:48','2006-02-15 22:21:46'),(14784,551,2,1005,'3.99','2005-05-31 00:53:25','2006-02-15 22:21:46'),(14785,551,2,2069,'4.99','2005-06-17 16:19:39','2006-02-15 22:21:46'),(14786,551,1,2776,'3.99','2005-06-19 18:16:24','2006-02-15 22:21:46'),(14787,551,2,3996,'5.99','2005-07-06 23:46:43','2006-02-15 22:21:46'),(14788,551,1,5201,'1.99','2005-07-09 10:52:53','2006-02-15 22:21:46'),(14789,551,2,5528,'0.99','2005-07-10 02:09:21','2006-02-15 22:21:46'),(14790,551,1,6041,'0.99','2005-07-11 03:14:58','2006-02-15 22:21:46'),(14791,551,2,7095,'9.99','2005-07-27 04:51:15','2006-02-15 22:21:46'),(14792,551,1,8986,'0.99','2005-07-30 04:37:20','2006-02-15 22:21:46'),(14793,551,1,9287,'2.99','2005-07-30 15:35:39','2006-02-15 22:21:46'),(14794,551,2,9765,'4.99','2005-07-31 09:44:40','2006-02-15 22:21:46'),(14795,551,2,11380,'0.99','2005-08-02 18:17:32','2006-02-15 22:21:46'),(14796,551,2,11883,'2.99','2005-08-17 14:41:28','2006-02-15 22:21:47'),(14797,551,2,12208,'4.99','2005-08-18 02:25:25','2006-02-15 22:21:47'),(14798,551,2,12868,'0.99','2005-08-19 02:47:19','2006-02-15 22:21:47'),(14799,551,1,13439,'3.99','2005-08-19 23:42:16','2006-02-15 22:21:47'),(14800,551,1,14420,'0.99','2005-08-21 11:16:15','2006-02-15 22:21:47'),(14801,551,2,14609,'4.99','2005-08-21 17:57:26','2006-02-15 22:21:47'),(14802,551,2,14633,'2.99','2005-08-21 18:51:10','2006-02-15 22:21:47'),(14803,551,1,14833,'2.99','2005-08-22 01:45:18','2006-02-15 22:21:47'),(14804,551,1,15377,'4.99','2005-08-22 22:22:33','2006-02-15 22:21:47'),(14805,551,2,15390,'6.99','2005-08-22 22:57:25','2006-02-15 22:21:47'),(14806,552,2,174,'0.99','2005-05-26 03:44:10','2006-02-15 22:21:47'),(14807,552,2,2320,'0.99','2005-06-18 09:24:50','2006-02-15 22:21:47'),(14808,552,2,3397,'4.99','2005-06-21 15:30:11','2006-02-15 22:21:47'),(14809,552,1,4477,'6.99','2005-07-08 00:38:24','2006-02-15 22:21:47'),(14810,552,1,5213,'7.99','2005-07-09 11:39:43','2006-02-15 22:21:48'),(14811,552,2,6189,'4.99','2005-07-11 11:36:03','2006-02-15 22:21:48'),(14812,552,1,7772,'2.99','2005-07-28 06:59:09','2006-02-15 22:21:48'),(14813,552,1,8085,'2.99','2005-07-28 18:13:15','2006-02-15 22:21:48'),(14814,552,2,8192,'2.99','2005-07-28 22:49:11','2006-02-15 22:21:48'),(14815,552,2,8614,'5.99','2005-07-29 13:32:05','2006-02-15 22:21:48'),(14816,552,2,8894,'4.99','2005-07-30 00:48:31','2006-02-15 22:21:48'),(14817,552,1,9342,'8.99','2005-07-30 18:09:56','2006-02-15 22:21:48'),(14818,552,1,11146,'1.99','2005-08-02 09:45:32','2006-02-15 22:21:48'),(14819,552,2,11205,'4.99','2005-08-02 11:56:54','2006-02-15 22:21:48'),(14820,552,2,11300,'7.99','2005-08-02 15:37:42','2006-02-15 22:21:48'),(14821,552,2,12433,'4.99','2005-08-18 10:37:49','2006-02-15 22:21:48'),(14822,552,2,12880,'2.99','2005-08-19 03:27:17','2006-02-15 22:21:48'),(14823,552,2,13574,'2.99','2005-08-20 05:10:39','2006-02-15 22:21:48'),(14824,552,1,13693,'0.99','2005-08-20 09:11:42','2006-02-15 22:21:48'),(14825,552,2,14724,'4.99','2005-08-21 21:53:47','2006-02-15 22:21:49'),(14826,552,2,15700,'2.99','2005-08-23 10:21:21','2006-02-15 22:21:49'),(14827,553,2,789,'4.99','2005-05-29 16:17:07','2006-02-15 22:21:49'),(14828,553,2,1862,'3.99','2005-06-17 01:29:30','2006-02-15 22:21:49'),(14829,553,1,2460,'8.99','2005-06-18 19:54:13','2006-02-15 22:21:49'),(14830,553,2,3103,'6.99','2005-06-20 16:58:19','2006-02-15 22:21:49'),(14831,553,1,3495,'6.99','2005-07-05 23:50:04','2006-02-15 22:21:49'),(14832,553,2,3793,'4.99','2005-07-06 14:32:44','2006-02-15 22:21:49'),(14833,553,2,3859,'2.99','2005-07-06 17:18:15','2006-02-15 22:21:49'),(14834,553,1,3890,'4.99','2005-07-06 18:58:15','2006-02-15 22:21:49'),(14835,553,2,3891,'4.99','2005-07-06 18:58:25','2006-02-15 22:21:49'),(14836,553,2,3942,'4.99','2005-07-06 21:21:34','2006-02-15 22:21:49'),(14837,553,1,4257,'4.99','2005-07-07 14:18:41','2006-02-15 22:21:49'),(14838,553,2,4662,'0.99','2005-07-08 09:58:54','2006-02-15 22:21:49'),(14839,553,2,4845,'4.99','2005-07-08 18:28:20','2006-02-15 22:21:49'),(14840,553,2,4941,'3.99','2005-07-08 22:39:10','2006-02-15 22:21:50'),(14841,553,1,6069,'2.99','2005-07-11 04:44:59','2006-02-15 22:21:50'),(14842,553,2,6657,'0.99','2005-07-12 11:11:36','2006-02-15 22:21:50'),(14843,553,1,6812,'6.99','2005-07-12 18:03:25','2006-02-15 22:21:50'),(14844,553,1,7890,'4.99','2005-07-28 10:43:40','2006-02-15 22:21:50'),(14845,553,2,9272,'4.99','2005-07-30 15:05:22','2006-02-15 22:21:50'),(14846,553,2,9601,'2.99','2005-07-31 03:42:17','2006-02-15 22:21:50'),(14847,553,2,11710,'4.99','2005-08-17 07:29:44','2006-02-15 22:21:50'),(14848,553,1,13972,'2.99','2005-08-20 18:52:17','2006-02-15 22:21:50'),(14849,553,1,15042,'4.99','2005-08-22 09:47:37','2006-02-15 22:21:50'),(14850,553,1,15506,'0.99','2005-08-23 02:48:24','2006-02-15 22:21:50'),(14851,554,1,607,'2.99','2005-05-28 15:02:41','2006-02-15 22:21:50'),(14852,554,1,817,'2.99','2005-05-29 20:39:14','2006-02-15 22:21:50'),(14853,554,1,1959,'4.99','2005-06-17 08:54:10','2006-02-15 22:21:50'),(14854,554,1,2279,'6.99','2005-06-18 06:38:22','2006-02-15 22:21:50'),(14855,554,2,3278,'2.99','2005-06-21 05:41:30','2006-02-15 22:21:51'),(14856,554,1,3312,'6.99','2005-06-21 08:05:32','2006-02-15 22:21:51'),(14857,554,2,4902,'4.99','2005-07-08 20:49:30','2006-02-15 22:21:51'),(14858,554,1,5527,'2.99','2005-07-10 02:06:01','2006-02-15 22:21:51'),(14859,554,1,5968,'5.99','2005-07-11 00:03:11','2006-02-15 22:21:51'),(14860,554,1,6144,'2.99','2005-07-11 09:02:53','2006-02-15 22:21:51'),(14861,554,1,10612,'6.99','2005-08-01 14:55:31','2006-02-15 22:21:51'),(14862,554,2,10829,'7.99','2005-08-01 23:17:06','2006-02-15 22:21:51'),(14863,554,2,11589,'9.99','2005-08-17 02:28:22','2006-02-15 22:21:51'),(14864,554,1,11873,'0.99','2005-08-17 14:14:39','2006-02-15 22:21:51'),(14865,554,1,12010,'8.99','2005-08-17 19:17:54','2006-02-15 22:21:51'),(14866,554,1,12014,'0.99','2005-08-17 19:29:44','2006-02-15 22:21:51'),(14867,554,2,13139,'4.99','2005-08-19 12:32:10','2006-02-15 22:21:51'),(14868,554,2,14015,'2.99','2005-08-20 20:47:43','2006-02-15 22:21:51'),(14869,554,1,14098,'3.99','2005-08-21 00:30:32','2006-02-15 22:21:51'),(14870,554,1,14469,'0.99','2005-08-21 13:07:24','2006-02-15 22:21:52'),(14871,554,1,14626,'2.99','2005-08-21 18:35:44','2006-02-15 22:21:52'),(14872,554,2,15690,'4.99','2005-08-23 09:53:30','2006-02-15 22:21:52'),(14873,555,2,3232,'1.99','2005-06-21 02:30:37','2006-02-15 22:21:52'),(14874,555,2,4875,'2.99','2005-07-08 19:24:17','2006-02-15 22:21:52'),(14875,555,1,8161,'0.99','2005-07-28 21:11:00','2006-02-15 22:21:52'),(14876,555,1,8245,'3.99','2005-07-29 00:37:09','2006-02-15 22:21:52'),(14877,555,1,9299,'5.99','2005-07-30 16:32:51','2006-02-15 22:21:52'),(14878,555,2,9990,'7.99','2005-07-31 17:24:21','2006-02-15 22:21:52'),(14879,555,2,10076,'7.99','2005-07-31 20:00:34','2006-02-15 22:21:52'),(14880,555,1,10921,'3.99','2005-08-02 02:14:33','2006-02-15 22:21:52'),(14881,555,1,11168,'4.99','2005-08-02 10:19:42','2006-02-15 22:21:52'),(14882,555,1,11718,'4.99','2005-08-17 07:44:42','2006-02-15 22:21:52'),(14883,555,2,11747,'2.99','2005-08-17 09:03:31','2006-02-15 22:21:52'),(14884,555,2,12091,'4.99','2005-08-17 22:22:50','2006-02-15 22:21:52'),(14885,555,2,12150,'2.99','2005-08-18 00:13:55','2006-02-15 22:21:53'); -INSERT INTO payment VALUES (14886,555,2,12182,'2.99','2005-08-18 01:30:19','2006-02-15 22:21:53'),(14887,555,1,12388,'2.99','2005-08-18 08:48:09','2006-02-15 22:21:53'),(14888,555,1,12883,'4.99','2005-08-19 03:33:47','2006-02-15 22:21:53'),(14889,555,2,15102,'6.99','2005-08-22 11:58:58','2006-02-15 22:21:53'),(14890,556,1,184,'0.99','2005-05-26 05:29:49','2006-02-15 22:21:53'),(14891,556,2,772,'5.99','2005-05-29 13:08:06','2006-02-15 22:21:53'),(14892,556,1,1083,'3.99','2005-05-31 11:04:48','2006-02-15 22:21:53'),(14893,556,1,2092,'6.99','2005-06-17 18:12:16','2006-02-15 22:21:53'),(14894,556,2,2593,'5.99','2005-06-19 05:40:11','2006-02-15 22:21:53'),(14895,556,2,2986,'0.99','2005-06-20 08:50:28','2006-02-15 22:21:53'),(14896,556,1,3093,'4.99','2005-06-20 16:06:14','2006-02-15 22:21:53'),(14897,556,2,3438,'6.99','2005-06-21 19:31:40','2006-02-15 22:21:53'),(14898,556,2,4719,'2.99','2005-07-08 12:33:00','2006-02-15 22:21:53'),(14899,556,2,4839,'3.99','2005-07-08 18:13:10','2006-02-15 22:21:54'),(14900,556,1,4846,'0.99','2005-07-08 18:29:05','2006-02-15 22:21:54'),(14901,556,2,5722,'0.99','2005-07-10 11:10:04','2006-02-15 22:21:54'),(14902,556,2,6484,'2.99','2005-07-12 02:04:10','2006-02-15 22:21:54'),(14903,556,1,8909,'5.99','2005-07-30 01:28:03','2006-02-15 22:21:54'),(14904,556,2,10106,'4.99','2005-07-31 21:00:47','2006-02-15 22:21:54'),(14905,556,2,10518,'6.99','2005-08-01 11:44:08','2006-02-15 22:21:54'),(14906,556,1,11466,'1.99','2005-08-02 21:46:46','2006-02-15 22:21:54'),(14907,556,2,11804,'3.99','2005-08-17 11:42:45','2006-02-15 22:21:54'),(14908,556,1,12045,'4.99','2005-08-17 20:40:46','2006-02-15 22:21:54'),(14909,556,1,14176,'2.99','2005-08-21 03:09:23','2006-02-15 22:21:54'),(14910,556,1,15568,'2.99','2005-08-23 05:24:09','2006-02-15 22:21:54'),(14911,557,2,467,'4.99','2005-05-27 21:10:03','2006-02-15 22:21:54'),(14912,557,1,478,'4.99','2005-05-27 22:38:20','2006-02-15 22:21:54'),(14913,557,1,1666,'0.99','2005-06-16 10:17:19','2006-02-15 22:21:54'),(14914,557,2,2988,'6.99','2005-06-20 08:59:08','2006-02-15 22:21:55'),(14915,557,1,3050,'3.99','2005-06-20 13:03:03','2006-02-15 22:21:55'),(14916,557,1,4651,'0.99','2005-07-08 09:39:39','2006-02-15 22:21:55'),(14917,557,1,4851,'1.99','2005-07-08 18:40:05','2006-02-15 22:21:55'),(14918,557,1,6459,'0.99','2005-07-12 01:12:03','2006-02-15 22:21:55'),(14919,557,2,6713,'3.99','2005-07-12 13:27:36','2006-02-15 22:21:55'),(14920,557,2,6823,'4.99','2005-07-12 18:24:31','2006-02-15 22:21:55'),(14921,557,2,6898,'0.99','2005-07-12 21:39:04','2006-02-15 22:21:55'),(14922,557,1,9336,'0.99','2005-07-30 18:01:15','2006-02-15 22:21:55'),(14923,557,1,9341,'2.99','2005-07-30 18:07:58','2006-02-15 22:21:55'),(14924,557,2,9366,'1.99','2005-07-30 18:48:57','2006-02-15 22:21:55'),(14925,557,2,9367,'6.99','2005-07-30 18:49:58','2006-02-15 22:21:55'),(14926,557,1,11181,'0.99','2005-08-02 10:55:03','2006-02-15 22:21:55'),(14927,557,1,12555,'1.99','2005-08-18 14:49:22','2006-02-15 22:21:55'),(14928,557,1,12789,'2.99','2005-08-19 00:16:19','2006-02-15 22:21:55'),(14929,557,1,13540,'2.99','2005-08-20 03:41:23','2006-02-15 22:21:56'),(14930,557,2,13794,'2.99','2005-08-20 12:25:32','2006-02-15 22:21:56'),(14931,557,2,15236,'0.99','2005-08-22 17:44:27','2006-02-15 22:21:56'),(14932,557,2,15570,'5.99','2005-08-23 05:24:55','2006-02-15 22:21:56'),(14933,557,2,15914,'0.99','2005-08-23 17:49:26','2006-02-15 22:21:56'),(14934,557,1,14278,'4.99','2006-02-14 15:16:03','2006-02-15 22:21:56'),(14935,558,2,1967,'4.99','2005-06-17 09:19:52','2006-02-15 22:21:56'),(14936,558,1,2411,'1.99','2005-06-18 16:55:54','2006-02-15 22:21:56'),(14937,558,2,2544,'4.99','2005-06-19 02:16:17','2006-02-15 22:21:56'),(14938,558,2,3016,'4.99','2005-06-20 10:55:08','2006-02-15 22:21:56'),(14939,558,2,3451,'10.99','2005-06-21 21:10:39','2006-02-15 22:21:56'),(14940,558,1,3731,'9.99','2005-07-06 11:33:36','2006-02-15 22:21:56'),(14941,558,1,3954,'0.99','2005-07-06 21:57:44','2006-02-15 22:21:56'),(14942,558,1,3990,'3.99','2005-07-06 23:32:44','2006-02-15 22:21:56'),(14943,558,1,4192,'5.99','2005-07-07 10:57:06','2006-02-15 22:21:57'),(14944,558,1,4932,'2.99','2005-07-08 22:17:40','2006-02-15 22:21:57'),(14945,558,2,5375,'6.99','2005-07-09 18:52:55','2006-02-15 22:21:57'),(14946,558,1,5492,'3.99','2005-07-10 00:11:09','2006-02-15 22:21:57'),(14947,558,2,6278,'7.99','2005-07-11 16:20:02','2006-02-15 22:21:57'),(14948,558,2,6479,'9.99','2005-07-12 01:49:00','2006-02-15 22:21:57'),(14949,558,2,6742,'4.99','2005-07-12 14:25:31','2006-02-15 22:21:57'),(14950,558,1,6757,'0.99','2005-07-12 15:09:48','2006-02-15 22:21:57'),(14951,558,1,7424,'0.99','2005-07-27 17:14:19','2006-02-15 22:21:57'),(14952,558,1,8523,'2.99','2005-07-29 10:18:27','2006-02-15 22:21:57'),(14953,558,1,8858,'4.99','2005-07-29 23:44:35','2006-02-15 22:21:57'),(14954,558,1,8889,'2.99','2005-07-30 00:39:43','2006-02-15 22:21:57'),(14955,558,2,10707,'0.99','2005-08-01 18:41:34','2006-02-15 22:21:57'),(14956,558,1,11268,'0.99','2005-08-02 14:10:39','2006-02-15 22:21:57'),(14957,558,2,11567,'5.99','2005-08-17 01:28:43','2006-02-15 22:21:57'),(14958,558,2,12040,'6.99','2005-08-17 20:29:56','2006-02-15 22:21:58'),(14959,558,1,12194,'1.99','2005-08-18 02:04:47','2006-02-15 22:21:58'),(14960,558,2,13566,'5.99','2005-08-20 04:45:32','2006-02-15 22:21:58'),(14961,558,2,14235,'7.99','2005-08-21 05:08:42','2006-02-15 22:21:58'),(14962,558,1,14286,'5.99','2005-08-21 06:53:53','2006-02-15 22:21:58'),(14963,559,2,2576,'4.99','2005-06-19 04:34:15','2006-02-15 22:21:58'),(14964,559,1,2706,'0.99','2005-06-19 13:56:51','2006-02-15 22:21:58'),(14965,559,2,3046,'4.99','2005-06-20 12:42:59','2006-02-15 22:21:58'),(14966,559,1,3370,'1.99','2005-06-21 13:27:01','2006-02-15 22:21:58'),(14967,559,1,3674,'5.99','2005-07-06 09:03:13','2006-02-15 22:21:58'),(14968,559,1,4120,'4.99','2005-07-07 07:07:03','2006-02-15 22:21:58'),(14969,559,1,4370,'7.99','2005-07-07 20:05:36','2006-02-15 22:21:58'),(14970,559,2,5396,'1.99','2005-07-09 19:42:52','2006-02-15 22:21:58'),(14971,559,1,6201,'4.99','2005-07-11 12:18:07','2006-02-15 22:21:58'),(14972,559,1,6915,'2.99','2005-07-12 22:28:09','2006-02-15 22:21:58'),(14973,559,1,7169,'1.99','2005-07-27 07:51:39','2006-02-15 22:21:59'),(14974,559,1,7680,'1.99','2005-07-28 02:59:08','2006-02-15 22:21:59'),(14975,559,1,8631,'1.99','2005-07-29 14:08:06','2006-02-15 22:21:59'),(14976,559,2,9134,'0.99','2005-07-30 10:00:21','2006-02-15 22:21:59'),(14977,559,1,9877,'2.99','2005-07-31 13:41:57','2006-02-15 22:21:59'),(14978,559,2,10146,'2.99','2005-07-31 22:17:56','2006-02-15 22:21:59'),(14979,559,1,10377,'3.99','2005-08-01 06:28:28','2006-02-15 22:21:59'),(14980,559,1,10669,'8.99','2005-08-01 17:03:28','2006-02-15 22:21:59'),(14981,559,2,10876,'0.99','2005-08-02 00:31:58','2006-02-15 22:21:59'),(14982,559,2,11136,'1.99','2005-08-02 09:22:57','2006-02-15 22:21:59'),(14983,559,1,13234,'1.99','2005-08-19 16:17:15','2006-02-15 22:21:59'),(14984,559,2,13248,'6.99','2005-08-19 16:47:41','2006-02-15 22:21:59'),(14985,559,2,13322,'4.99','2005-08-19 19:43:08','2006-02-15 22:21:59'),(14986,559,1,13845,'5.99','2005-08-20 14:31:21','2006-02-15 22:21:59'),(14987,559,1,14342,'4.99','2005-08-21 08:39:26','2006-02-15 22:22:00'),(14988,559,2,14622,'4.99','2005-08-21 18:25:59','2006-02-15 22:22:00'),(14989,559,2,15440,'4.99','2005-08-23 00:37:21','2006-02-15 22:22:00'),(14990,559,1,15877,'4.99','2005-08-23 16:33:33','2006-02-15 22:22:00'),(14991,560,1,137,'2.99','2005-05-25 22:25:18','2006-02-15 22:22:00'),(14992,560,1,1271,'4.99','2005-06-15 07:32:24','2006-02-15 22:22:00'),(14993,560,2,1572,'1.99','2005-06-16 03:23:22','2006-02-15 22:22:00'),(14994,560,1,3941,'4.99','2005-07-06 21:20:37','2006-02-15 22:22:00'),(14995,560,1,4298,'2.99','2005-07-07 16:27:25','2006-02-15 22:22:00'),(14996,560,2,4375,'9.99','2005-07-07 20:20:29','2006-02-15 22:22:00'),(14997,560,1,4453,'0.99','2005-07-07 23:32:39','2006-02-15 22:22:00'),(14998,560,2,5208,'2.99','2005-07-09 11:16:56','2006-02-15 22:22:00'),(14999,560,1,6410,'4.99','2005-07-11 23:08:06','2006-02-15 22:22:00'),(15000,560,1,6945,'2.99','2005-07-26 23:35:29','2006-02-15 22:22:00'),(15001,560,2,7202,'4.99','2005-07-27 09:00:20','2006-02-15 22:22:00'),(15002,560,1,7891,'3.99','2005-07-28 10:43:56','2006-02-15 22:22:01'),(15003,560,1,8753,'2.99','2005-07-29 19:15:50','2006-02-15 22:22:01'),(15004,560,2,8861,'5.99','2005-07-29 23:47:29','2006-02-15 22:22:01'),(15005,560,2,8906,'4.99','2005-07-30 01:21:39','2006-02-15 22:22:01'),(15006,560,1,9265,'0.99','2005-07-30 14:55:25','2006-02-15 22:22:01'),(15007,560,2,9895,'5.99','2005-07-31 14:07:56','2006-02-15 22:22:01'),(15008,560,2,10480,'4.99','2005-08-01 10:13:41','2006-02-15 22:22:01'),(15009,560,1,10702,'4.99','2005-08-01 18:34:59','2006-02-15 22:22:01'),(15010,560,1,10733,'7.99','2005-08-01 19:28:01','2006-02-15 22:22:01'),(15011,560,1,11334,'7.99','2005-08-02 16:53:20','2006-02-15 22:22:01'),(15012,560,1,11788,'4.99','2005-08-17 10:59:18','2006-02-15 22:22:01'),(15013,560,2,14008,'5.99','2005-08-20 20:26:00','2006-02-15 22:22:01'),(15014,560,1,14341,'1.99','2005-08-21 08:38:24','2006-02-15 22:22:01'),(15015,560,2,14363,'4.99','2005-08-21 09:20:03','2006-02-15 22:22:01'),(15016,560,1,14436,'2.99','2005-08-21 11:48:27','2006-02-15 22:22:01'),(15017,560,2,14785,'2.99','2005-08-22 00:24:37','2006-02-15 22:22:02'),(15018,560,1,15352,'6.99','2005-08-22 21:16:54','2006-02-15 22:22:02'),(15019,560,2,12116,'5.98','2006-02-14 15:16:03','2006-02-15 22:22:02'),(15020,560,2,14425,'0.00','2006-02-14 15:16:03','2006-02-15 22:22:02'),(15021,561,1,902,'4.99','2005-05-30 09:53:36','2006-02-15 22:22:02'),(15022,561,2,971,'4.99','2005-05-30 20:10:52','2006-02-15 22:22:02'),(15023,561,2,1193,'2.99','2005-06-15 01:24:20','2006-02-15 22:22:02'),(15024,561,2,1505,'2.99','2005-06-15 22:12:50','2006-02-15 22:22:02'),(15025,561,2,1620,'4.99','2005-06-16 07:21:30','2006-02-15 22:22:02'),(15026,561,1,2119,'4.99','2005-06-17 20:34:42','2006-02-15 22:22:02'),(15027,561,1,2357,'5.99','2005-06-18 12:59:41','2006-02-15 22:22:02'),(15028,561,1,2548,'0.99','2005-06-19 02:45:35','2006-02-15 22:22:02'),(15029,561,1,2950,'4.99','2005-06-20 06:08:36','2006-02-15 22:22:02'),(15030,561,1,3160,'4.99','2005-06-20 21:20:51','2006-02-15 22:22:02'),(15031,561,1,3427,'0.99','2005-06-21 18:31:09','2006-02-15 22:22:03'),(15032,561,2,6361,'2.99','2005-07-11 21:09:14','2006-02-15 22:22:03'),(15033,561,1,6435,'0.99','2005-07-12 00:16:19','2006-02-15 22:22:03'),(15034,561,1,6621,'0.99','2005-07-12 08:57:30','2006-02-15 22:22:03'),(15035,561,1,6843,'4.99','2005-07-12 19:14:05','2006-02-15 22:22:03'),(15036,561,1,7698,'0.99','2005-07-28 03:44:14','2006-02-15 22:22:03'),(15037,561,1,8504,'10.99','2005-07-29 09:20:16','2006-02-15 22:22:03'),(15038,561,2,9839,'7.99','2005-07-31 12:21:16','2006-02-15 22:22:03'),(15039,561,2,10317,'2.99','2005-08-01 04:35:34','2006-02-15 22:22:03'),(15040,561,1,10907,'4.99','2005-08-02 01:51:48','2006-02-15 22:22:03'),(15041,561,1,11371,'2.99','2005-08-02 18:07:36','2006-02-15 22:22:03'),(15042,561,2,11402,'2.99','2005-08-02 19:07:21','2006-02-15 22:22:03'),(15043,561,2,12441,'2.99','2005-08-18 10:47:57','2006-02-15 22:22:03'),(15044,561,2,14139,'0.99','2005-08-21 02:04:33','2006-02-15 22:22:03'),(15045,561,1,15573,'0.99','2005-08-23 05:28:36','2006-02-15 22:22:03'),(15046,561,1,15946,'2.99','2005-08-23 18:54:07','2006-02-15 22:22:04'),(15047,561,1,14415,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:04'),(15048,562,2,788,'2.99','2005-05-29 16:13:55','2006-02-15 22:22:04'),(15049,562,1,941,'2.99','2005-05-30 15:02:25','2006-02-15 22:22:04'),(15050,562,1,1139,'5.99','2005-05-31 19:34:52','2006-02-15 22:22:04'),(15051,562,1,1998,'3.99','2005-06-17 11:24:57','2006-02-15 22:22:04'),(15052,562,1,2705,'4.99','2005-06-19 13:54:30','2006-02-15 22:22:04'),(15053,562,1,2746,'3.99','2005-06-19 16:21:40','2006-02-15 22:22:04'),(15054,562,2,3242,'4.99','2005-06-21 02:56:24','2006-02-15 22:22:04'),(15055,562,2,4732,'5.99','2005-07-08 13:09:45','2006-02-15 22:22:04'),(15056,562,1,4802,'4.99','2005-07-08 16:55:17','2006-02-15 22:22:04'),(15057,562,2,5360,'0.99','2005-07-09 18:14:03','2006-02-15 22:22:04'),(15058,562,2,6065,'6.99','2005-07-11 04:25:51','2006-02-15 22:22:04'),(15059,562,1,6607,'8.99','2005-07-12 08:08:50','2006-02-15 22:22:04'),(15060,562,2,7166,'3.99','2005-07-27 07:36:56','2006-02-15 22:22:04'),(15061,562,1,7430,'2.99','2005-07-27 17:26:14','2006-02-15 22:22:05'),(15062,562,2,7560,'2.99','2005-07-27 22:20:17','2006-02-15 22:22:05'),(15063,562,2,8132,'0.99','2005-07-28 19:57:31','2006-02-15 22:22:05'),(15064,562,2,10868,'6.99','2005-08-02 00:25:15','2006-02-15 22:22:05'),(15065,562,2,12008,'4.99','2005-08-17 19:16:18','2006-02-15 22:22:05'),(15066,562,1,12248,'5.99','2005-08-18 03:53:18','2006-02-15 22:22:05'),(15067,562,2,13225,'2.99','2005-08-19 15:54:33','2006-02-15 22:22:05'),(15068,562,2,13347,'10.99','2005-08-19 20:28:48','2006-02-15 22:22:05'),(15069,562,2,13639,'0.99','2005-08-20 07:22:07','2006-02-15 22:22:05'),(15070,562,1,15212,'2.99','2005-08-22 16:44:26','2006-02-15 22:22:05'),(15071,562,2,15475,'2.99','2005-08-23 01:44:43','2006-02-15 22:22:05'),(15072,562,1,15900,'1.99','2005-08-23 17:16:30','2006-02-15 22:22:05'),(15073,563,1,758,'4.99','2005-05-29 10:31:56','2006-02-15 22:22:05'),(15074,563,2,773,'5.99','2005-05-29 13:18:05','2006-02-15 22:22:05'),(15075,563,2,1545,'4.99','2005-06-16 01:31:23','2006-02-15 22:22:06'),(15076,563,2,2573,'0.99','2005-06-19 04:23:18','2006-02-15 22:22:06'),(15077,563,1,4106,'1.99','2005-07-07 06:33:35','2006-02-15 22:22:06'),(15078,563,2,4436,'0.99','2005-07-07 22:52:04','2006-02-15 22:22:06'),(15079,563,1,4565,'3.99','2005-07-08 05:12:28','2006-02-15 22:22:06'),(15080,563,2,4629,'6.99','2005-07-08 08:31:26','2006-02-15 22:22:06'),(15081,563,2,4711,'2.99','2005-07-08 12:06:58','2006-02-15 22:22:06'),(15082,563,2,4776,'5.99','2005-07-08 15:44:20','2006-02-15 22:22:06'),(15083,563,2,4808,'3.99','2005-07-08 17:02:49','2006-02-15 22:22:06'),(15084,563,2,4825,'4.99','2005-07-08 17:43:01','2006-02-15 22:22:06'),(15085,563,1,4883,'0.99','2005-07-08 19:46:58','2006-02-15 22:22:06'),(15086,563,1,5406,'0.99','2005-07-09 20:13:23','2006-02-15 22:22:06'),(15087,563,2,6326,'2.99','2005-07-11 19:06:55','2006-02-15 22:22:06'),(15088,563,2,7612,'0.99','2005-07-28 00:11:55','2006-02-15 22:22:06'),(15089,563,1,8262,'1.99','2005-07-29 01:11:18','2006-02-15 22:22:06'),(15090,563,1,8610,'5.99','2005-07-29 13:25:02','2006-02-15 22:22:07'),(15091,563,2,8632,'6.99','2005-07-29 14:11:25','2006-02-15 22:22:07'),(15092,563,2,8812,'7.99','2005-07-29 21:47:40','2006-02-15 22:22:07'),(15093,563,2,11829,'0.99','2005-08-17 12:52:04','2006-02-15 22:22:07'),(15094,563,1,12039,'1.99','2005-08-17 20:29:08','2006-02-15 22:22:07'),(15095,563,1,12202,'1.99','2005-08-18 02:14:08','2006-02-15 22:22:07'),(15096,563,1,12832,'2.99','2005-08-19 01:41:44','2006-02-15 22:22:07'),(15097,563,2,13863,'9.99','2005-08-20 14:57:50','2006-02-15 22:22:07'),(15098,563,2,14592,'4.99','2005-08-21 17:30:17','2006-02-15 22:22:07'),(15099,563,2,15507,'0.99','2005-08-23 02:48:26','2006-02-15 22:22:07'),(15100,563,2,15638,'3.99','2005-08-23 07:54:54','2006-02-15 22:22:07'),(15101,563,1,15850,'4.99','2005-08-23 15:45:42','2006-02-15 22:22:07'),(15102,564,2,195,'5.99','2005-05-26 06:52:36','2006-02-15 22:22:07'),(15103,564,1,985,'2.99','2005-05-30 22:18:35','2006-02-15 22:22:07'),(15104,564,2,1705,'2.99','2005-06-16 13:59:42','2006-02-15 22:22:07'),(15105,564,1,4196,'2.99','2005-07-07 11:06:33','2006-02-15 22:22:08'),(15106,564,2,4385,'0.99','2005-07-07 20:48:38','2006-02-15 22:22:08'),(15107,564,1,6973,'2.99','2005-07-27 00:32:04','2006-02-15 22:22:08'),(15108,564,2,7470,'10.99','2005-07-27 19:01:03','2006-02-15 22:22:08'),(15109,564,2,8426,'4.99','2005-07-29 07:07:48','2006-02-15 22:22:08'),(15110,564,1,8874,'0.99','2005-07-30 00:14:45','2006-02-15 22:22:08'),(15111,564,2,9063,'3.99','2005-07-30 07:24:34','2006-02-15 22:22:08'),(15112,564,2,9929,'2.99','2005-07-31 15:17:24','2006-02-15 22:22:08'),(15113,564,1,10129,'6.99','2005-07-31 21:41:35','2006-02-15 22:22:08'),(15114,564,2,10352,'1.99','2005-08-01 05:44:36','2006-02-15 22:22:08'),(15115,564,2,10401,'4.99','2005-08-01 07:27:09','2006-02-15 22:22:08'),(15116,564,1,10528,'2.99','2005-08-01 11:56:22','2006-02-15 22:22:08'),(15117,564,2,11768,'2.99','2005-08-17 10:02:29','2006-02-15 22:22:08'),(15118,564,2,12197,'6.99','2005-08-18 02:08:58','2006-02-15 22:22:08'),(15119,564,2,12617,'2.99','2005-08-18 17:22:48','2006-02-15 22:22:09'),(15120,564,2,13324,'0.99','2005-08-19 19:51:00','2006-02-15 22:22:09'),(15121,564,2,13558,'0.99','2005-08-20 04:13:17','2006-02-15 22:22:09'),(15122,564,1,13701,'0.99','2005-08-20 09:27:05','2006-02-15 22:22:09'),(15123,564,2,14439,'5.99','2005-08-21 11:52:41','2006-02-15 22:22:09'),(15124,564,1,14593,'0.99','2005-08-21 17:33:18','2006-02-15 22:22:09'),(15125,564,2,15059,'8.99','2005-08-22 10:22:00','2006-02-15 22:22:09'),(15126,565,1,458,'6.99','2005-05-27 19:58:36','2006-02-15 22:22:09'),(15127,565,1,1004,'0.99','2005-05-31 00:48:36','2006-02-15 22:22:09'),(15128,565,2,1460,'4.99','2005-06-15 20:27:02','2006-02-15 22:22:09'),(15129,565,1,2321,'5.99','2005-06-18 09:42:42','2006-02-15 22:22:09'),(15130,565,1,3300,'5.99','2005-06-21 07:25:01','2006-02-15 22:22:09'),(15131,565,2,3470,'0.99','2005-07-05 22:49:24','2006-02-15 22:22:09'),(15132,565,1,3838,'2.99','2005-07-06 16:29:43','2006-02-15 22:22:09'),(15133,565,1,4413,'2.99','2005-07-07 22:00:04','2006-02-15 22:22:09'),(15134,565,2,5020,'0.99','2005-07-09 02:07:56','2006-02-15 22:22:10'),(15135,565,1,5124,'4.99','2005-07-09 07:25:19','2006-02-15 22:22:10'),(15136,565,1,6264,'2.99','2005-07-11 15:42:35','2006-02-15 22:22:10'),(15137,565,1,6627,'2.99','2005-07-12 09:16:46','2006-02-15 22:22:10'),(15138,565,1,6699,'0.99','2005-07-12 12:45:21','2006-02-15 22:22:10'),(15139,565,2,7242,'5.99','2005-07-27 10:25:51','2006-02-15 22:22:10'),(15140,565,1,9628,'2.99','2005-07-31 04:51:11','2006-02-15 22:22:10'),(15141,565,1,10025,'5.99','2005-07-31 18:29:09','2006-02-15 22:22:10'),(15142,565,2,10776,'10.99','2005-08-01 20:59:58','2006-02-15 22:22:10'),(15143,565,2,10913,'3.99','2005-08-02 02:04:03','2006-02-15 22:22:10'),(15144,565,2,11189,'6.99','2005-08-02 11:17:23','2006-02-15 22:22:10'),(15145,565,1,11399,'3.99','2005-08-02 18:56:28','2006-02-15 22:22:10'),(15146,565,2,11506,'4.99','2005-08-16 23:25:48','2006-02-15 22:22:10'),(15147,565,1,11588,'3.99','2005-08-17 02:26:23','2006-02-15 22:22:10'),(15148,565,1,11795,'2.99','2005-08-17 11:13:38','2006-02-15 22:22:10'),(15149,565,2,12743,'5.99','2005-08-18 22:22:31','2006-02-15 22:22:11'),(15150,565,2,13195,'4.99','2005-08-19 14:39:14','2006-02-15 22:22:11'),(15151,565,2,13217,'4.99','2005-08-19 15:38:39','2006-02-15 22:22:11'),(15152,565,1,13362,'0.99','2005-08-19 21:07:54','2006-02-15 22:22:11'),(15153,565,1,13925,'8.99','2005-08-20 17:05:34','2006-02-15 22:22:11'),(15154,565,1,15885,'2.99','2005-08-23 16:50:43','2006-02-15 22:22:11'),(15155,566,2,234,'5.99','2005-05-26 11:47:20','2006-02-15 22:22:11'),(15156,566,2,768,'4.99','2005-05-29 12:30:46','2006-02-15 22:22:11'),(15157,566,1,1635,'5.99','2005-06-16 08:26:56','2006-02-15 22:22:11'),(15158,566,2,1982,'4.99','2005-06-17 10:12:15','2006-02-15 22:22:11'),(15159,566,1,2367,'0.99','2005-06-18 14:00:31','2006-02-15 22:22:11'),(15160,566,1,3379,'4.99','2005-06-21 13:54:58','2006-02-15 22:22:11'),(15161,566,2,3663,'4.99','2005-07-06 08:15:47','2006-02-15 22:22:11'),(15162,566,1,3943,'0.99','2005-07-06 21:22:17','2006-02-15 22:22:11'),(15163,566,1,3998,'3.99','2005-07-06 23:49:20','2006-02-15 22:22:12'),(15164,566,1,5079,'9.99','2005-07-09 05:20:40','2006-02-15 22:22:12'),(15165,566,2,6365,'2.99','2005-07-11 21:17:40','2006-02-15 22:22:12'),(15166,566,1,7677,'2.99','2005-07-28 02:56:37','2006-02-15 22:22:12'),(15167,566,2,7941,'0.99','2005-07-28 12:47:20','2006-02-15 22:22:12'),(15168,566,2,8118,'2.99','2005-07-28 19:22:22','2006-02-15 22:22:12'),(15169,566,1,8157,'6.99','2005-07-28 21:06:45','2006-02-15 22:22:12'),(15170,566,1,8257,'2.99','2005-07-29 01:03:20','2006-02-15 22:22:12'),(15171,566,2,8305,'1.99','2005-07-29 03:08:47','2006-02-15 22:22:12'),(15172,566,2,8660,'6.99','2005-07-29 15:26:59','2006-02-15 22:22:12'),(15173,566,1,8710,'0.99','2005-07-29 17:26:03','2006-02-15 22:22:12'),(15174,566,1,8797,'4.99','2005-07-29 21:10:37','2006-02-15 22:22:12'),(15175,566,2,9101,'4.99','2005-07-30 08:47:13','2006-02-15 22:22:12'),(15176,566,2,9470,'4.99','2005-07-30 23:01:31','2006-02-15 22:22:12'),(15177,566,1,9688,'3.99','2005-07-31 06:56:08','2006-02-15 22:22:12'),(15178,566,2,9915,'2.99','2005-07-31 14:52:26','2006-02-15 22:22:13'),(15179,566,2,10259,'2.99','2005-08-01 02:52:05','2006-02-15 22:22:13'),(15180,566,2,10289,'6.99','2005-08-01 03:39:48','2006-02-15 22:22:13'),(15181,566,2,11129,'2.99','2005-08-02 09:08:44','2006-02-15 22:22:13'),(15182,566,1,11717,'0.99','2005-08-17 07:44:09','2006-02-15 22:22:13'),(15183,566,1,11941,'1.99','2005-08-17 16:56:57','2006-02-15 22:22:13'),(15184,566,2,12382,'8.99','2005-08-18 08:32:33','2006-02-15 22:22:13'),(15185,566,2,12995,'4.99','2005-08-19 07:26:30','2006-02-15 22:22:13'),(15186,566,2,13762,'4.99','2005-08-20 11:29:32','2006-02-15 22:22:13'),(15187,566,1,14277,'3.99','2005-08-21 06:34:41','2006-02-15 22:22:13'),(15188,566,1,14297,'2.99','2005-08-21 07:13:46','2006-02-15 22:22:13'),(15189,567,2,2689,'4.99','2005-06-19 12:58:53','2006-02-15 22:22:13'),(15190,567,1,3010,'2.99','2005-06-20 10:29:59','2006-02-15 22:22:13'),(15191,567,1,3769,'5.99','2005-07-06 13:11:33','2006-02-15 22:22:13'),(15192,567,2,4457,'0.99','2005-07-07 23:45:38','2006-02-15 22:22:14'),(15193,567,2,4576,'0.99','2005-07-08 05:51:19','2006-02-15 22:22:14'),(15194,567,1,4949,'4.99','2005-07-08 22:57:10','2006-02-15 22:22:14'),(15195,567,2,6358,'2.99','2005-07-11 21:03:12','2006-02-15 22:22:14'),(15196,567,2,6551,'0.99','2005-07-12 05:03:43','2006-02-15 22:22:14'),(15197,567,2,7340,'2.99','2005-07-27 14:18:10','2006-02-15 22:22:14'),(15198,567,1,8201,'2.99','2005-07-28 23:10:48','2006-02-15 22:22:14'),(15199,567,1,8629,'2.99','2005-07-29 14:06:35','2006-02-15 22:22:14'),(15200,567,1,9279,'7.99','2005-07-30 15:15:21','2006-02-15 22:22:14'),(15201,567,1,9475,'6.99','2005-07-30 23:06:33','2006-02-15 22:22:14'),(15202,567,2,10708,'7.99','2005-08-01 18:43:28','2006-02-15 22:22:14'),(15203,567,2,11749,'2.99','2005-08-17 09:04:03','2006-02-15 22:22:14'),(15204,567,1,12119,'2.99','2005-08-17 23:16:44','2006-02-15 22:22:14'),(15205,567,2,13031,'2.99','2005-08-19 08:30:04','2006-02-15 22:22:14'),(15206,567,2,14839,'2.99','2005-08-22 01:58:15','2006-02-15 22:22:14'),(15207,567,2,15074,'5.99','2005-08-22 11:02:52','2006-02-15 22:22:15'),(15208,567,2,15594,'10.99','2005-08-23 06:18:43','2006-02-15 22:22:15'),(15209,568,2,1658,'4.99','2005-06-16 10:07:10','2006-02-15 22:22:15'),(15210,568,2,2382,'4.99','2005-06-18 15:03:52','2006-02-15 22:22:15'),(15211,568,2,2668,'0.99','2005-06-19 11:28:47','2006-02-15 22:22:15'),(15212,568,1,3227,'4.99','2005-06-21 02:18:25','2006-02-15 22:22:15'),(15213,568,2,3462,'1.99','2005-06-21 21:52:52','2006-02-15 22:22:15'),(15214,568,1,4322,'2.99','2005-07-07 17:54:37','2006-02-15 22:22:15'),(15215,568,2,5332,'2.99','2005-07-09 16:59:23','2006-02-15 22:22:15'),(15216,568,1,5622,'0.99','2005-07-10 05:39:37','2006-02-15 22:22:15'),(15217,568,1,5776,'4.99','2005-07-10 13:35:22','2006-02-15 22:22:15'),(15218,568,2,7068,'2.99','2005-07-27 03:57:50','2006-02-15 22:22:15'),(15219,568,2,8185,'0.99','2005-07-28 22:23:49','2006-02-15 22:22:15'),(15220,568,2,9583,'6.99','2005-07-31 03:05:21','2006-02-15 22:22:15'),(15221,568,1,9738,'0.99','2005-07-31 09:04:14','2006-02-15 22:22:16'),(15222,568,1,10340,'2.99','2005-08-01 05:07:03','2006-02-15 22:22:16'),(15223,568,2,10689,'0.99','2005-08-01 18:04:18','2006-02-15 22:22:16'),(15224,568,2,10869,'0.99','2005-08-02 00:26:54','2006-02-15 22:22:16'),(15225,568,1,11331,'2.99','2005-08-02 16:49:01','2006-02-15 22:22:16'),(15226,568,1,13883,'4.99','2005-08-20 15:28:53','2006-02-15 22:22:16'),(15227,568,2,15069,'5.99','2005-08-22 10:55:42','2006-02-15 22:22:16'),(15228,568,1,15203,'2.99','2005-08-22 16:28:00','2006-02-15 22:22:16'),(15229,568,2,14531,'2.99','2006-02-14 15:16:03','2006-02-15 22:22:16'),(15230,569,2,53,'4.99','2005-05-25 07:19:16','2006-02-15 22:22:16'),(15231,569,1,487,'4.99','2005-05-28 00:00:30','2006-02-15 22:22:16'),(15232,569,1,624,'4.99','2005-05-28 16:13:22','2006-02-15 22:22:16'),(15233,569,1,647,'1.99','2005-05-28 19:22:52','2006-02-15 22:22:16'),(15234,569,2,1037,'3.99','2005-05-31 05:22:25','2006-02-15 22:22:16'),(15235,569,1,1463,'6.99','2005-06-15 20:37:51','2006-02-15 22:22:16'),(15236,569,2,1668,'5.99','2005-06-16 10:19:52','2006-02-15 22:22:17'),(15237,569,1,4204,'5.99','2005-07-07 11:24:18','2006-02-15 22:22:17'),(15238,569,2,5003,'0.99','2005-07-09 01:19:03','2006-02-15 22:22:17'),(15239,569,2,6046,'5.99','2005-07-11 03:21:49','2006-02-15 22:22:17'),(15240,569,1,8910,'2.99','2005-07-30 01:29:48','2006-02-15 22:22:17'),(15241,569,2,9220,'1.99','2005-07-30 13:17:27','2006-02-15 22:22:17'),(15242,569,1,9399,'4.99','2005-07-30 20:14:50','2006-02-15 22:22:17'),(15243,569,2,9960,'1.99','2005-07-31 16:05:52','2006-02-15 22:22:17'),(15244,569,2,10192,'2.99','2005-08-01 00:33:00','2006-02-15 22:22:17'),(15245,569,2,10884,'0.99','2005-08-02 00:47:33','2006-02-15 22:22:17'),(15246,569,1,11030,'1.99','2005-08-02 05:51:20','2006-02-15 22:22:17'),(15247,569,2,11255,'4.99','2005-08-02 13:44:30','2006-02-15 22:22:17'),(15248,569,1,11354,'6.99','2005-08-02 17:35:10','2006-02-15 22:22:17'),(15249,569,1,11946,'4.99','2005-08-17 17:05:53','2006-02-15 22:22:17'),(15250,569,1,12157,'2.99','2005-08-18 00:33:45','2006-02-15 22:22:18'),(15251,569,2,12308,'0.99','2005-08-18 05:48:53','2006-02-15 22:22:18'),(15252,569,1,12568,'3.99','2005-08-18 15:15:44','2006-02-15 22:22:18'),(15253,569,2,12958,'2.99','2005-08-19 06:19:21','2006-02-15 22:22:18'),(15254,569,1,13287,'7.99','2005-08-19 18:28:24','2006-02-15 22:22:18'),(15255,569,2,13554,'9.99','2005-08-20 04:08:39','2006-02-15 22:22:18'),(15256,569,2,14207,'4.99','2005-08-21 04:08:19','2006-02-15 22:22:18'),(15257,569,2,14400,'0.99','2005-08-21 10:33:45','2006-02-15 22:22:18'),(15258,569,1,14896,'8.99','2005-08-22 04:20:55','2006-02-15 22:22:18'),(15259,569,1,14959,'2.99','2005-08-22 06:30:28','2006-02-15 22:22:18'),(15260,569,2,15617,'0.99','2005-08-23 07:07:22','2006-02-15 22:22:18'),(15261,569,2,16025,'4.99','2005-08-23 21:48:54','2006-02-15 22:22:18'),(15262,570,2,1060,'7.99','2005-05-31 08:21:43','2006-02-15 22:22:18'),(15263,570,1,1259,'4.99','2005-06-15 06:37:55','2006-02-15 22:22:18'),(15264,570,2,1417,'4.99','2005-06-15 17:45:51','2006-02-15 22:22:18'),(15265,570,2,1804,'2.99','2005-06-16 20:33:15','2006-02-15 22:22:19'),(15266,570,2,2008,'5.99','2005-06-17 11:48:05','2006-02-15 22:22:19'),(15267,570,2,2031,'6.99','2005-06-17 13:14:03','2006-02-15 22:22:19'),(15268,570,2,2261,'3.99','2005-06-18 05:46:15','2006-02-15 22:22:19'),(15269,570,2,3138,'2.99','2005-06-20 19:43:45','2006-02-15 22:22:19'),(15270,570,2,3984,'0.99','2005-07-06 23:22:36','2006-02-15 22:22:19'),(15271,570,1,4069,'0.99','2005-07-07 04:35:06','2006-02-15 22:22:19'),(15272,570,1,4698,'0.99','2005-07-08 11:19:31','2006-02-15 22:22:19'),(15273,570,2,5638,'4.99','2005-07-10 06:32:49','2006-02-15 22:22:19'),(15274,570,1,6253,'4.99','2005-07-11 15:07:19','2006-02-15 22:22:19'),(15275,570,1,6556,'0.99','2005-07-12 05:10:16','2006-02-15 22:22:19'),(15276,570,2,7174,'4.99','2005-07-27 08:00:36','2006-02-15 22:22:19'),(15277,570,2,8735,'4.99','2005-07-29 18:28:54','2006-02-15 22:22:19'),(15278,570,1,9385,'7.99','2005-07-30 19:25:49','2006-02-15 22:22:19'),(15279,570,1,9398,'0.99','2005-07-30 20:09:00','2006-02-15 22:22:20'),(15280,570,2,9432,'2.99','2005-07-30 21:26:18','2006-02-15 22:22:20'),(15281,570,1,9766,'4.99','2005-07-31 09:46:29','2006-02-15 22:22:20'),(15282,570,1,10004,'0.99','2005-07-31 17:51:23','2006-02-15 22:22:20'),(15283,570,2,10168,'2.99','2005-07-31 23:25:24','2006-02-15 22:22:20'),(15284,570,1,11098,'3.99','2005-08-02 08:06:18','2006-02-15 22:22:20'),(15285,570,2,12042,'4.99','2005-08-17 20:36:37','2006-02-15 22:22:20'),(15286,570,2,14768,'3.99','2005-08-21 23:44:53','2006-02-15 22:22:20'),(15287,570,1,12716,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:20'),(15288,571,1,228,'9.99','2005-05-26 10:54:28','2006-02-15 22:22:20'),(15289,571,2,689,'3.99','2005-05-29 00:46:53','2006-02-15 22:22:20'),(15290,571,1,1254,'4.99','2005-06-15 06:11:16','2006-02-15 22:22:20'),(15291,571,2,1400,'3.99','2005-06-15 16:29:56','2006-02-15 22:22:20'),(15292,571,1,1756,'4.99','2005-06-16 17:22:33','2006-02-15 22:22:20'),(15293,571,2,1990,'4.99','2005-06-17 10:48:44','2006-02-15 22:22:20'),(15294,571,1,2327,'2.99','2005-06-18 10:16:40','2006-02-15 22:22:21'),(15295,571,1,2977,'10.99','2005-06-20 08:15:27','2006-02-15 22:22:21'),(15296,571,2,3616,'2.99','2005-07-06 05:52:13','2006-02-15 22:22:21'),(15297,571,1,4162,'4.99','2005-07-07 09:17:26','2006-02-15 22:22:21'),(15298,571,2,5789,'4.99','2005-07-10 14:11:26','2006-02-15 22:22:21'),(15299,571,2,6676,'8.99','2005-07-12 11:53:40','2006-02-15 22:22:21'),(15300,571,1,6792,'8.99','2005-07-12 16:37:28','2006-02-15 22:22:21'),(15301,571,1,8084,'5.99','2005-07-28 18:11:58','2006-02-15 22:22:21'),(15302,571,1,8638,'4.99','2005-07-29 14:30:23','2006-02-15 22:22:21'),(15303,571,2,9300,'1.99','2005-07-30 16:33:12','2006-02-15 22:22:21'),(15304,571,1,9408,'4.99','2005-07-30 20:32:09','2006-02-15 22:22:21'),(15305,571,1,10227,'2.99','2005-08-01 01:42:22','2006-02-15 22:22:21'),(15306,571,2,11080,'2.99','2005-08-02 07:29:56','2006-02-15 22:22:21'),(15307,571,2,11191,'7.99','2005-08-02 11:24:07','2006-02-15 22:22:21'),(15308,571,1,13228,'2.99','2005-08-19 16:08:16','2006-02-15 22:22:22'),(15309,571,2,13266,'2.99','2005-08-19 17:31:20','2006-02-15 22:22:22'),(15310,571,1,14956,'0.99','2005-08-22 06:26:16','2006-02-15 22:22:22'),(15311,571,1,15841,'4.99','2005-08-23 15:35:59','2006-02-15 22:22:22'),(15312,572,2,559,'7.99','2005-05-28 08:39:02','2006-02-15 22:22:22'),(15313,572,2,1889,'10.99','2005-06-17 04:05:12','2006-02-15 22:22:22'),(15314,572,1,2007,'0.99','2005-06-17 11:47:17','2006-02-15 22:22:22'),(15315,572,1,2458,'0.99','2005-06-18 19:39:05','2006-02-15 22:22:22'),(15316,572,1,4601,'2.99','2005-07-08 06:49:10','2006-02-15 22:22:22'),(15317,572,1,5595,'4.99','2005-07-10 04:33:45','2006-02-15 22:22:22'),(15318,572,1,5713,'6.99','2005-07-10 10:46:15','2006-02-15 22:22:22'),(15319,572,2,6108,'2.99','2005-07-11 07:19:24','2006-02-15 22:22:22'),(15320,572,1,7161,'4.99','2005-07-27 07:26:32','2006-02-15 22:22:22'),(15321,572,1,7345,'4.99','2005-07-27 14:29:53','2006-02-15 22:22:22'),(15322,572,2,7713,'6.99','2005-07-28 04:32:14','2006-02-15 22:22:23'),(15323,572,2,8342,'0.99','2005-07-29 04:45:05','2006-02-15 22:22:23'),(15324,572,1,8432,'0.99','2005-07-29 07:13:33','2006-02-15 22:22:23'),(15325,572,1,9081,'3.99','2005-07-30 08:09:58','2006-02-15 22:22:23'),(15326,572,2,9950,'5.99','2005-07-31 15:50:22','2006-02-15 22:22:23'),(15327,572,2,10204,'4.99','2005-08-01 00:47:39','2006-02-15 22:22:23'),(15328,572,1,11114,'0.99','2005-08-02 08:26:45','2006-02-15 22:22:23'),(15329,572,1,11121,'4.99','2005-08-02 08:48:31','2006-02-15 22:22:23'),(15330,572,2,11415,'2.99','2005-08-02 19:43:38','2006-02-15 22:22:23'),(15331,572,1,11426,'4.99','2005-08-02 20:00:09','2006-02-15 22:22:23'),(15332,572,1,11526,'4.99','2005-08-17 00:17:38','2006-02-15 22:22:23'),(15333,572,1,12256,'1.99','2005-08-18 04:09:39','2006-02-15 22:22:23'),(15334,572,2,13377,'1.99','2005-08-19 21:32:23','2006-02-15 22:22:23'),(15335,572,2,13523,'6.99','2005-08-20 02:47:03','2006-02-15 22:22:23'),(15336,572,1,13688,'5.99','2005-08-20 08:59:38','2006-02-15 22:22:23'),(15337,573,2,827,'2.99','2005-05-29 21:58:43','2006-02-15 22:22:24'),(15338,573,1,1613,'4.99','2005-06-16 06:55:10','2006-02-15 22:22:24'),(15339,573,2,2622,'5.99','2005-06-19 08:10:41','2006-02-15 22:22:24'),(15340,573,1,2995,'1.99','2005-06-20 09:18:22','2006-02-15 22:22:24'),(15341,573,1,3295,'7.99','2005-06-21 07:04:17','2006-02-15 22:22:24'),(15342,573,2,3768,'0.99','2005-07-06 13:07:30','2006-02-15 22:22:24'),(15343,573,1,3930,'2.99','2005-07-06 20:54:07','2006-02-15 22:22:24'),(15344,573,2,4023,'4.99','2005-07-07 01:55:25','2006-02-15 22:22:24'),(15345,573,1,4085,'0.99','2005-07-07 05:25:39','2006-02-15 22:22:24'),(15346,573,1,4609,'0.99','2005-07-08 07:22:29','2006-02-15 22:22:24'),(15347,573,1,4770,'2.99','2005-07-08 15:29:46','2006-02-15 22:22:24'),(15348,573,1,5036,'5.99','2005-07-09 02:58:41','2006-02-15 22:22:24'),(15349,573,2,5522,'9.99','2005-07-10 01:46:29','2006-02-15 22:22:24'),(15350,573,2,5903,'2.99','2005-07-10 20:39:04','2006-02-15 22:22:24'),(15351,573,1,6693,'7.99','2005-07-12 12:37:00','2006-02-15 22:22:25'),(15352,573,1,8400,'4.99','2005-07-29 06:23:56','2006-02-15 22:22:25'),(15353,573,2,9837,'10.99','2005-07-31 12:14:19','2006-02-15 22:22:25'),(15354,573,2,9846,'4.99','2005-07-31 12:30:12','2006-02-15 22:22:25'),(15355,573,2,9963,'2.99','2005-07-31 16:16:46','2006-02-15 22:22:25'),(15356,573,2,9971,'5.99','2005-07-31 16:42:16','2006-02-15 22:22:25'),(15357,573,1,10296,'0.99','2005-08-01 04:04:37','2006-02-15 22:22:25'),(15358,573,1,10887,'2.99','2005-08-02 00:52:35','2006-02-15 22:22:25'),(15359,573,1,11043,'0.99','2005-08-02 06:04:44','2006-02-15 22:22:25'),(15360,573,2,11912,'5.99','2005-08-17 15:51:49','2006-02-15 22:22:25'),(15361,573,1,12017,'1.99','2005-08-17 19:33:49','2006-02-15 22:22:25'),(15362,573,1,12125,'1.99','2005-08-17 23:24:25','2006-02-15 22:22:25'),(15363,573,1,12269,'6.99','2005-08-18 04:27:54','2006-02-15 22:22:25'),(15364,573,1,12791,'0.99','2005-08-19 00:17:09','2006-02-15 22:22:25'),(15365,573,2,13113,'2.99','2005-08-19 11:27:20','2006-02-15 22:22:25'),(15366,574,2,433,'0.99','2005-05-27 16:40:40','2006-02-15 22:22:26'),(15367,574,1,1559,'0.99','2005-06-16 02:35:03','2006-02-15 22:22:26'),(15368,574,2,1636,'5.99','2005-06-16 08:28:54','2006-02-15 22:22:26'),(15369,574,1,1817,'0.99','2005-06-16 21:20:52','2006-02-15 22:22:26'),(15370,574,1,2632,'0.99','2005-06-19 08:51:47','2006-02-15 22:22:26'),(15371,574,1,3220,'6.99','2005-06-21 01:46:25','2006-02-15 22:22:26'),(15372,574,1,3583,'7.99','2005-07-06 04:10:43','2006-02-15 22:22:26'),(15373,574,1,4004,'4.99','2005-07-07 00:20:51','2006-02-15 22:22:26'),(15374,574,1,4212,'4.99','2005-07-07 11:53:14','2006-02-15 22:22:26'),(15375,574,2,4890,'2.99','2005-07-08 20:05:38','2006-02-15 22:22:26'),(15376,574,2,5010,'4.99','2005-07-09 01:33:23','2006-02-15 22:22:26'),(15377,574,1,5076,'3.99','2005-07-09 05:13:22','2006-02-15 22:22:26'),(15378,574,1,5077,'3.99','2005-07-09 05:18:01','2006-02-15 22:22:26'),(15379,574,1,5640,'2.99','2005-07-10 06:38:00','2006-02-15 22:22:26'),(15380,574,1,6523,'2.99','2005-07-12 04:14:19','2006-02-15 22:22:27'),(15381,574,1,7093,'1.99','2005-07-27 04:47:00','2006-02-15 22:22:27'),(15382,574,1,7134,'2.99','2005-07-27 06:33:06','2006-02-15 22:22:27'),(15383,574,1,7964,'2.99','2005-07-28 13:49:58','2006-02-15 22:22:27'),(15384,574,1,8303,'4.99','2005-07-29 03:05:56','2006-02-15 22:22:27'),(15385,574,1,9589,'7.99','2005-07-31 03:13:29','2006-02-15 22:22:27'),(15386,574,1,9759,'3.99','2005-07-31 09:25:57','2006-02-15 22:22:27'),(15387,574,1,10347,'4.99','2005-08-01 05:20:03','2006-02-15 22:22:27'),(15388,574,2,11775,'3.99','2005-08-17 10:25:53','2006-02-15 22:22:27'),(15389,574,1,12462,'2.99','2005-08-18 11:28:55','2006-02-15 22:22:27'),(15390,574,1,13589,'4.99','2005-08-20 05:47:25','2006-02-15 22:22:27'),(15391,574,1,14076,'4.99','2005-08-20 23:20:10','2006-02-15 22:22:27'),(15392,574,2,14941,'2.99','2005-08-22 05:58:23','2006-02-15 22:22:27'),(15393,574,2,15214,'2.99','2005-08-22 16:53:29','2006-02-15 22:22:27'),(15394,575,1,17,'2.99','2005-05-25 01:06:36','2006-02-15 22:22:27'),(15395,575,1,395,'0.99','2005-05-27 11:45:49','2006-02-15 22:22:28'),(15396,575,2,454,'4.99','2005-05-27 19:31:36','2006-02-15 22:22:28'),(15397,575,2,769,'2.99','2005-05-29 12:51:44','2006-02-15 22:22:28'),(15398,575,1,774,'4.99','2005-05-29 13:19:43','2006-02-15 22:22:28'),(15399,575,2,1494,'2.99','2005-06-15 21:54:20','2006-02-15 22:22:28'),(15400,575,1,1824,'2.99','2005-06-16 21:51:04','2006-02-15 22:22:28'),(15401,575,2,1866,'4.99','2005-06-17 01:53:19','2006-02-15 22:22:28'),(15402,575,1,3558,'6.99','2005-07-06 02:49:06','2006-02-15 22:22:28'),(15403,575,2,5875,'8.99','2005-07-10 19:06:47','2006-02-15 22:22:28'),(15404,575,2,6907,'2.99','2005-07-12 22:03:49','2006-02-15 22:22:28'),(15405,575,1,7083,'0.99','2005-07-27 04:28:39','2006-02-15 22:22:28'),(15406,575,1,7139,'2.99','2005-07-27 06:52:21','2006-02-15 22:22:28'),(15407,575,2,8711,'2.99','2005-07-29 17:27:15','2006-02-15 22:22:28'),(15408,575,2,8904,'0.99','2005-07-30 01:08:33','2006-02-15 22:22:28'),(15409,575,2,8989,'4.99','2005-07-30 04:39:19','2006-02-15 22:22:29'),(15410,575,1,9733,'4.99','2005-07-31 08:57:35','2006-02-15 22:22:29'),(15411,575,1,10331,'4.99','2005-08-01 04:57:14','2006-02-15 22:22:29'),(15412,575,2,10629,'7.99','2005-08-01 15:33:32','2006-02-15 22:22:29'),(15413,575,1,11097,'3.99','2005-08-02 08:05:46','2006-02-15 22:22:29'),(15414,575,1,11458,'4.99','2005-08-02 21:24:02','2006-02-15 22:22:29'),(15415,575,1,12204,'7.99','2005-08-18 02:20:35','2006-02-15 22:22:29'),(15416,575,2,12289,'8.99','2005-08-18 05:05:28','2006-02-15 22:22:29'),(15417,575,2,12770,'5.99','2005-08-18 23:29:00','2006-02-15 22:22:29'),(15418,575,2,13408,'4.99','2005-08-19 22:34:51','2006-02-15 22:22:29'),(15419,575,2,13465,'2.99','2005-08-20 00:54:14','2006-02-15 22:22:29'),(15420,575,2,14952,'2.99','2005-08-22 06:20:07','2006-02-15 22:22:29'),(15421,575,2,15749,'4.99','2005-08-23 12:33:41','2006-02-15 22:22:29'),(15422,575,2,15857,'0.99','2005-08-23 15:59:51','2006-02-15 22:22:29'),(15423,576,2,755,'2.99','2005-05-29 10:26:29','2006-02-15 22:22:30'),(15424,576,1,968,'0.99','2005-05-30 19:20:03','2006-02-15 22:22:30'),(15425,576,1,1366,'4.99','2005-06-15 14:21:00','2006-02-15 22:22:30'),(15426,576,2,1742,'2.99','2005-06-16 16:37:48','2006-02-15 22:22:30'),(15427,576,1,2309,'0.99','2005-06-18 08:43:24','2006-02-15 22:22:30'),(15428,576,2,2444,'8.99','2005-06-18 18:58:12','2006-02-15 22:22:30'),(15429,576,1,2651,'3.99','2005-06-19 10:22:56','2006-02-15 22:22:30'),(15430,576,2,2799,'4.99','2005-06-19 19:15:21','2006-02-15 22:22:30'),(15431,576,2,3226,'6.99','2005-06-21 02:18:14','2006-02-15 22:22:30'),(15432,576,1,3877,'4.99','2005-07-06 18:22:10','2006-02-15 22:22:30'),(15433,576,2,3889,'0.99','2005-07-06 18:56:25','2006-02-15 22:22:30'),(15434,576,2,3934,'4.99','2005-07-06 21:07:23','2006-02-15 22:22:30'),(15435,576,1,4514,'4.99','2005-07-08 02:41:25','2006-02-15 22:22:30'),(15436,576,2,5597,'3.99','2005-07-10 04:47:57','2006-02-15 22:22:30'),(15437,576,1,5934,'4.99','2005-07-10 22:07:59','2006-02-15 22:22:30'),(15438,576,2,7319,'1.99','2005-07-27 13:31:25','2006-02-15 22:22:31'),(15439,576,1,7605,'3.99','2005-07-27 23:57:01','2006-02-15 22:22:31'),(15440,576,1,8907,'4.99','2005-07-30 01:25:03','2006-02-15 22:22:31'),(15441,576,1,9133,'5.99','2005-07-30 09:59:00','2006-02-15 22:22:31'),(15442,576,2,9548,'5.99','2005-07-31 01:54:19','2006-02-15 22:22:31'),(15443,576,2,9620,'8.99','2005-07-31 04:19:18','2006-02-15 22:22:31'),(15444,576,2,9962,'0.99','2005-07-31 16:10:36','2006-02-15 22:22:31'),(15445,576,1,9979,'2.99','2005-07-31 17:00:07','2006-02-15 22:22:31'),(15446,576,1,10000,'2.99','2005-07-31 17:41:05','2006-02-15 22:22:31'),(15447,576,2,10724,'3.99','2005-08-01 19:10:59','2006-02-15 22:22:31'),(15448,576,2,12112,'5.99','2005-08-17 23:00:31','2006-02-15 22:22:31'),(15449,576,1,12245,'4.99','2005-08-18 03:46:40','2006-02-15 22:22:31'),(15450,576,1,13061,'4.99','2005-08-19 09:43:39','2006-02-15 22:22:31'),(15451,576,1,13326,'4.99','2005-08-19 19:52:52','2006-02-15 22:22:31'),(15452,576,1,14501,'4.99','2005-08-21 14:14:38','2006-02-15 22:22:32'),(15453,576,1,14541,'0.99','2005-08-21 15:34:32','2006-02-15 22:22:32'),(15454,576,1,15634,'0.99','2005-08-23 07:34:18','2006-02-15 22:22:32'),(15455,576,2,11942,'5.98','2006-02-14 15:16:03','2006-02-15 22:22:32'),(15456,576,1,13464,'0.00','2006-02-14 15:16:03','2006-02-15 22:22:32'),(15457,577,2,291,'5.99','2005-05-26 20:20:47','2006-02-15 22:22:32'),(15458,577,2,NULL,'0.99','2005-05-27 00:46:39','2006-02-15 22:22:32'),(15459,577,2,2399,'3.99','2005-06-18 16:06:14','2006-02-15 22:22:32'),(15460,577,2,3286,'2.99','2005-06-21 06:31:29','2006-02-15 22:22:32'),(15461,577,2,3401,'6.99','2005-06-21 15:52:43','2006-02-15 22:22:32'),(15462,577,2,3599,'0.99','2005-07-06 05:16:36','2006-02-15 22:22:32'),(15463,577,1,3785,'7.99','2005-07-06 14:00:13','2006-02-15 22:22:32'),(15464,577,1,4922,'2.99','2005-07-08 21:44:00','2006-02-15 22:22:32'),(15465,577,1,6500,'2.99','2005-07-12 03:11:23','2006-02-15 22:22:32'),(15466,577,2,6534,'2.99','2005-07-12 04:39:43','2006-02-15 22:22:33'),(15467,577,2,7197,'0.99','2005-07-27 08:49:32','2006-02-15 22:22:33'),(15468,577,1,7371,'4.99','2005-07-27 15:18:42','2006-02-15 22:22:33'),(15469,577,2,7876,'8.99','2005-07-28 10:24:22','2006-02-15 22:22:33'),(15470,577,1,8043,'5.99','2005-07-28 16:45:44','2006-02-15 22:22:33'),(15471,577,1,8060,'6.99','2005-07-28 17:10:02','2006-02-15 22:22:33'),(15472,577,2,8671,'6.99','2005-07-29 15:49:37','2006-02-15 22:22:33'),(15473,577,2,10323,'4.99','2005-08-01 04:44:58','2006-02-15 22:22:33'),(15474,577,1,10487,'0.99','2005-08-01 10:26:34','2006-02-15 22:22:33'),(15475,577,1,10782,'4.99','2005-08-01 21:23:25','2006-02-15 22:22:33'),(15476,577,1,11054,'7.99','2005-08-02 06:33:07','2006-02-15 22:22:33'),(15477,577,2,11464,'0.99','2005-08-02 21:42:07','2006-02-15 22:22:33'),(15478,577,1,12664,'4.99','2005-08-18 19:10:54','2006-02-15 22:22:33'),(15479,577,2,12671,'0.99','2005-08-18 19:19:59','2006-02-15 22:22:33'),(15480,577,2,13200,'3.99','2005-08-19 14:55:58','2006-02-15 22:22:33'),(15481,577,2,13500,'3.99','2005-08-20 01:54:39','2006-02-15 22:22:34'),(15482,577,2,15480,'2.99','2005-08-23 01:57:20','2006-02-15 22:22:34'),(15483,577,2,15873,'2.99','2005-08-23 16:27:59','2006-02-15 22:22:34'),(15484,577,2,16003,'4.99','2005-08-23 20:47:28','2006-02-15 22:22:34'),(15485,578,2,660,'0.99','2005-05-28 20:53:31','2006-02-15 22:22:34'),(15486,578,2,1826,'6.99','2005-06-16 21:53:52','2006-02-15 22:22:34'),(15487,578,2,2615,'4.99','2005-06-19 07:29:13','2006-02-15 22:22:34'),(15488,578,1,3305,'2.99','2005-06-21 07:46:57','2006-02-15 22:22:34'),(15489,578,2,4496,'4.99','2005-07-08 01:44:19','2006-02-15 22:22:34'),(15490,578,1,5377,'4.99','2005-07-09 19:04:30','2006-02-15 22:22:34'),(15491,578,1,5445,'0.99','2005-07-09 21:59:41','2006-02-15 22:22:34'),(15492,578,2,5876,'4.99','2005-07-10 19:07:15','2006-02-15 22:22:34'),(15493,578,1,6784,'4.99','2005-07-12 16:28:49','2006-02-15 22:22:34'),(15494,578,1,6830,'0.99','2005-07-12 18:42:55','2006-02-15 22:22:34'),(15495,578,2,7059,'5.99','2005-07-27 03:51:02','2006-02-15 22:22:35'),(15496,578,1,8179,'2.99','2005-07-28 22:05:13','2006-02-15 22:22:35'),(15497,578,1,8218,'2.99','2005-07-28 23:45:41','2006-02-15 22:22:35'),(15498,578,2,9970,'4.99','2005-07-31 16:38:24','2006-02-15 22:22:35'),(15499,578,1,10029,'6.99','2005-07-31 18:37:47','2006-02-15 22:22:35'),(15500,578,2,10182,'2.99','2005-08-01 00:08:01','2006-02-15 22:22:35'),(15501,578,1,10779,'7.99','2005-08-01 21:11:54','2006-02-15 22:22:35'),(15502,578,1,11199,'7.99','2005-08-02 11:47:40','2006-02-15 22:22:35'),(15503,578,2,13071,'5.99','2005-08-19 10:01:07','2006-02-15 22:22:35'),(15504,578,2,13498,'5.99','2005-08-20 01:51:23','2006-02-15 22:22:35'),(15505,578,2,13552,'2.99','2005-08-20 04:03:51','2006-02-15 22:22:35'),(15506,578,1,15652,'0.99','2005-08-23 08:34:10','2006-02-15 22:22:35'),(15507,579,2,2425,'5.99','2005-06-18 17:37:45','2006-02-15 22:22:35'),(15508,579,1,2522,'3.99','2005-06-19 00:43:42','2006-02-15 22:22:35'),(15509,579,1,3111,'2.99','2005-06-20 17:46:47','2006-02-15 22:22:36'),(15510,579,1,4619,'9.99','2005-07-08 08:01:09','2006-02-15 22:22:36'),(15511,579,1,4933,'2.99','2005-07-08 22:18:29','2006-02-15 22:22:36'),(15512,579,1,6304,'4.99','2005-07-11 18:02:16','2006-02-15 22:22:36'),(15513,579,2,6814,'1.99','2005-07-12 18:11:58','2006-02-15 22:22:36'),(15514,579,2,6824,'6.99','2005-07-12 18:26:46','2006-02-15 22:22:36'),(15515,579,2,6969,'8.99','2005-07-27 00:23:54','2006-02-15 22:22:36'),(15516,579,2,7221,'2.99','2005-07-27 09:37:35','2006-02-15 22:22:36'),(15517,579,1,8354,'0.99','2005-07-29 04:56:26','2006-02-15 22:22:36'),(15518,579,1,8876,'0.99','2005-07-30 00:15:09','2006-02-15 22:22:36'),(15519,579,1,8996,'0.99','2005-07-30 04:53:23','2006-02-15 22:22:36'),(15520,579,2,9349,'9.99','2005-07-30 18:20:08','2006-02-15 22:22:36'),(15521,579,2,9553,'5.99','2005-07-31 02:06:34','2006-02-15 22:22:36'),(15522,579,2,9976,'2.99','2005-07-31 16:57:49','2006-02-15 22:22:36'),(15523,579,2,9997,'4.99','2005-07-31 17:37:30','2006-02-15 22:22:37'),(15524,579,1,11494,'3.99','2005-08-02 22:51:23','2006-02-15 22:22:37'),(15525,579,2,12051,'6.99','2005-08-17 20:56:15','2006-02-15 22:22:37'),(15526,579,2,12315,'5.99','2005-08-18 06:15:06','2006-02-15 22:22:37'),(15527,579,2,14047,'2.99','2005-08-20 22:00:43','2006-02-15 22:22:37'),(15528,579,1,14185,'0.99','2005-08-21 03:28:37','2006-02-15 22:22:37'),(15529,579,1,14543,'1.99','2005-08-21 15:39:01','2006-02-15 22:22:37'),(15530,579,2,14560,'2.99','2005-08-21 16:13:47','2006-02-15 22:22:37'),(15531,579,2,15601,'0.99','2005-08-23 06:33:26','2006-02-15 22:22:37'),(15532,579,1,15838,'4.99','2005-08-23 15:30:48','2006-02-15 22:22:37'),(15533,579,2,15794,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:37'),(15534,580,1,611,'0.99','2005-05-28 15:18:18','2006-02-15 22:22:37'),(15535,580,1,1469,'0.99','2005-06-15 20:52:36','2006-02-15 22:22:37'),(15536,580,2,3571,'1.99','2005-07-06 03:32:31','2006-02-15 22:22:37'),(15537,580,2,3867,'1.99','2005-07-06 17:52:19','2006-02-15 22:22:38'),(15538,580,2,4169,'1.99','2005-07-07 09:39:18','2006-02-15 22:22:38'),(15539,580,2,4590,'3.99','2005-07-08 06:27:48','2006-02-15 22:22:38'),(15540,580,1,5937,'6.99','2005-07-10 22:16:08','2006-02-15 22:22:38'),(15541,580,1,6089,'2.99','2005-07-11 05:45:59','2006-02-15 22:22:38'),(15542,580,2,6170,'2.99','2005-07-11 10:29:21','2006-02-15 22:22:38'),(15543,580,1,7620,'0.99','2005-07-28 00:27:17','2006-02-15 22:22:38'),(15544,580,2,8784,'4.99','2005-07-29 20:35:37','2006-02-15 22:22:38'),(15545,580,1,8839,'3.99','2005-07-29 22:52:34','2006-02-15 22:22:38'),(15546,580,1,9199,'0.99','2005-07-30 12:38:00','2006-02-15 22:22:38'),(15547,580,1,9239,'3.99','2005-07-30 13:50:52','2006-02-15 22:22:38'),(15548,580,1,9460,'5.99','2005-07-30 22:25:39','2006-02-15 22:22:38'),(15549,580,2,9604,'4.99','2005-07-31 03:47:12','2006-02-15 22:22:38'),(15550,580,2,9865,'0.99','2005-07-31 13:10:45','2006-02-15 22:22:38'),(15551,580,1,10723,'3.99','2005-08-01 19:10:49','2006-02-15 22:22:38'),(15552,580,2,10965,'3.99','2005-08-02 04:00:19','2006-02-15 22:22:39'),(15553,580,1,11164,'8.99','2005-08-02 10:10:56','2006-02-15 22:22:39'),(15554,580,2,12670,'2.99','2005-08-18 19:17:58','2006-02-15 22:22:39'),(15555,580,2,13313,'2.99','2005-08-19 19:11:41','2006-02-15 22:22:39'),(15556,580,2,13742,'2.99','2005-08-20 10:49:15','2006-02-15 22:22:39'),(15557,580,2,14818,'2.99','2005-08-22 01:17:18','2006-02-15 22:22:39'),(15558,580,1,15157,'6.99','2005-08-22 14:30:09','2006-02-15 22:22:39'),(15559,580,1,15630,'6.99','2005-08-23 07:29:13','2006-02-15 22:22:39'),(15560,580,1,15947,'4.99','2005-08-23 18:54:32','2006-02-15 22:22:39'),(15561,581,1,976,'4.99','2005-05-30 21:11:19','2006-02-15 22:22:39'),(15562,581,1,1151,'4.99','2005-05-31 21:29:00','2006-02-15 22:22:39'),(15563,581,2,1958,'3.99','2005-06-17 08:52:01','2006-02-15 22:22:39'),(15564,581,2,2101,'2.99','2005-06-17 18:57:02','2006-02-15 22:22:39'),(15565,581,1,2137,'4.99','2005-06-17 21:18:28','2006-02-15 22:22:39'),(15566,581,2,4210,'2.99','2005-07-07 11:36:20','2006-02-15 22:22:40'),(15567,581,2,4244,'2.99','2005-07-07 13:41:58','2006-02-15 22:22:40'),(15568,581,1,4338,'4.99','2005-07-07 18:39:56','2006-02-15 22:22:40'),(15569,581,2,4613,'0.99','2005-07-08 07:44:49','2006-02-15 22:22:40'),(15570,581,1,4669,'5.99','2005-07-08 10:13:08','2006-02-15 22:22:40'),(15571,581,1,4815,'8.99','2005-07-08 17:12:51','2006-02-15 22:22:40'),(15572,581,1,4833,'1.99','2005-07-08 18:07:35','2006-02-15 22:22:40'),(15573,581,1,5516,'4.99','2005-07-10 01:13:52','2006-02-15 22:22:40'),(15574,581,1,5707,'4.99','2005-07-10 10:26:14','2006-02-15 22:22:40'),(15575,581,2,5812,'2.99','2005-07-10 15:27:56','2006-02-15 22:22:40'),(15576,581,2,7048,'7.99','2005-07-27 03:31:48','2006-02-15 22:22:40'),(15577,581,1,7783,'2.99','2005-07-28 07:14:43','2006-02-15 22:22:40'),(15578,581,1,9278,'2.99','2005-07-30 15:15:19','2006-02-15 22:22:40'),(15579,581,1,9449,'1.99','2005-07-30 22:02:34','2006-02-15 22:22:40'),(15580,581,2,11443,'2.99','2005-08-02 20:29:30','2006-02-15 22:22:41'),(15581,581,2,11707,'2.99','2005-08-17 07:24:59','2006-02-15 22:22:41'),(15582,581,2,13621,'0.99','2005-08-20 06:43:44','2006-02-15 22:22:41'),(15583,581,2,13712,'2.99','2005-08-20 09:38:04','2006-02-15 22:22:41'),(15584,581,2,14070,'8.99','2005-08-20 22:56:34','2006-02-15 22:22:41'),(15585,581,1,14976,'2.99','2005-08-22 07:10:26','2006-02-15 22:22:41'),(15586,581,1,15403,'0.99','2005-08-22 23:18:10','2006-02-15 22:22:41'),(15587,581,2,15792,'4.99','2005-08-23 14:05:37','2006-02-15 22:22:41'),(15588,582,1,281,'0.99','2005-05-26 18:49:35','2006-02-15 22:22:41'),(15589,582,1,1719,'2.99','2005-06-16 14:55:53','2006-02-15 22:22:41'),(15590,582,1,2337,'7.99','2005-06-18 11:15:27','2006-02-15 22:22:41'),(15591,582,2,3071,'0.99','2005-06-20 14:20:42','2006-02-15 22:22:41'),(15592,582,1,3767,'0.99','2005-07-06 13:07:27','2006-02-15 22:22:41'),(15593,582,2,6629,'5.99','2005-07-12 09:18:35','2006-02-15 22:22:41'),(15594,582,2,7126,'4.99','2005-07-27 06:13:13','2006-02-15 22:22:42'),(15595,582,2,7311,'6.99','2005-07-27 13:02:54','2006-02-15 22:22:42'),(15596,582,2,7412,'5.99','2005-07-27 16:44:34','2006-02-15 22:22:42'),(15597,582,1,7575,'2.99','2005-07-27 22:53:52','2006-02-15 22:22:42'),(15598,582,2,8308,'5.99','2005-07-29 03:22:15','2006-02-15 22:22:42'),(15599,582,1,8554,'2.99','2005-07-29 11:16:29','2006-02-15 22:22:42'),(15600,582,1,8778,'6.99','2005-07-29 20:14:25','2006-02-15 22:22:42'),(15601,582,1,9768,'9.99','2005-07-31 09:48:41','2006-02-15 22:22:42'),(15602,582,2,11290,'7.99','2005-08-02 14:57:44','2006-02-15 22:22:42'),(15603,582,1,11667,'5.99','2005-08-17 05:46:55','2006-02-15 22:22:42'),(15604,582,1,11708,'2.99','2005-08-17 07:26:47','2006-02-15 22:22:42'),(15605,582,2,13815,'5.99','2005-08-20 13:08:53','2006-02-15 22:22:42'),(15606,582,1,14376,'4.99','2005-08-21 09:48:56','2006-02-15 22:22:42'),(15607,582,1,14568,'0.99','2005-08-21 16:30:48','2006-02-15 22:22:42'),(15608,582,1,15090,'5.99','2005-08-22 11:34:33','2006-02-15 22:22:43'),(15609,582,1,15503,'2.99','2005-08-23 02:44:49','2006-02-15 22:22:43'),(15610,582,1,15539,'0.99','2005-08-23 04:09:03','2006-02-15 22:22:43'),(15611,582,2,15911,'4.99','2005-08-23 17:44:53','2006-02-15 22:22:43'),(15612,582,2,12127,'2.99','2006-02-14 15:16:03','2006-02-15 22:22:43'),(15613,583,1,1428,'3.99','2005-06-15 18:19:30','2006-02-15 22:22:43'),(15614,583,1,2429,'9.99','2005-06-18 17:48:28','2006-02-15 22:22:43'),(15615,583,2,2663,'4.99','2005-06-19 10:54:00','2006-02-15 22:22:43'),(15616,583,2,2845,'5.99','2005-06-19 22:46:37','2006-02-15 22:22:43'),(15617,583,2,2879,'3.99','2005-06-20 01:24:10','2006-02-15 22:22:43'),(15618,583,1,3424,'0.99','2005-06-21 17:42:51','2006-02-15 22:22:43'),(15619,583,1,3779,'2.99','2005-07-06 13:46:36','2006-02-15 22:22:43'),(15620,583,1,3842,'4.99','2005-07-06 16:34:32','2006-02-15 22:22:43'),(15621,583,2,3991,'9.99','2005-07-06 23:33:41','2006-02-15 22:22:43'),(15622,583,1,4464,'4.99','2005-07-08 00:07:18','2006-02-15 22:22:43'),(15623,583,1,5462,'0.99','2005-07-09 22:56:53','2006-02-15 22:22:44'),(15624,583,1,5478,'5.99','2005-07-09 23:45:15','2006-02-15 22:22:44'),(15625,583,2,5747,'7.99','2005-07-10 12:15:33','2006-02-15 22:22:44'),(15626,583,2,6684,'6.99','2005-07-12 12:14:42','2006-02-15 22:22:44'),(15627,583,1,7401,'5.99','2005-07-27 16:17:55','2006-02-15 22:22:44'),(15628,583,2,8568,'7.99','2005-07-29 11:38:22','2006-02-15 22:22:44'),(15629,583,1,9550,'7.99','2005-07-31 01:57:34','2006-02-15 22:22:44'),(15630,583,2,9808,'1.99','2005-07-31 11:17:22','2006-02-15 22:22:44'),(15631,583,2,10301,'4.99','2005-08-01 04:09:37','2006-02-15 22:22:44'),(15632,583,2,10586,'2.99','2005-08-01 14:00:59','2006-02-15 22:22:44'),(15633,583,2,10800,'4.99','2005-08-01 22:07:44','2006-02-15 22:22:44'),(15634,583,2,11002,'4.99','2005-08-02 05:02:56','2006-02-15 22:22:44'),(15635,583,1,14259,'0.99','2005-08-21 06:00:22','2006-02-15 22:22:44'),(15636,584,2,379,'4.99','2005-05-27 09:25:32','2006-02-15 22:22:44'),(15637,584,1,626,'4.99','2005-05-28 16:58:09','2006-02-15 22:22:45'),(15638,584,1,920,'4.99','2005-05-30 11:44:01','2006-02-15 22:22:45'),(15639,584,2,1436,'3.99','2005-06-15 18:35:40','2006-02-15 22:22:45'),(15640,584,2,3317,'6.99','2005-06-21 08:22:32','2006-02-15 22:22:45'),(15641,584,2,3741,'2.99','2005-07-06 12:00:18','2006-02-15 22:22:45'),(15642,584,2,3895,'7.99','2005-07-06 19:04:24','2006-02-15 22:22:45'),(15643,584,1,4410,'0.99','2005-07-07 21:48:16','2006-02-15 22:22:45'),(15644,584,1,4977,'0.99','2005-07-09 00:15:50','2006-02-15 22:22:45'),(15645,584,2,6954,'0.99','2005-07-26 23:55:13','2006-02-15 22:22:45'),(15646,584,1,7186,'2.99','2005-07-27 08:26:12','2006-02-15 22:22:45'),(15647,584,1,7372,'4.99','2005-07-27 15:18:42','2006-02-15 22:22:45'),(15648,584,1,7659,'4.99','2005-07-28 02:09:45','2006-02-15 22:22:45'),(15649,584,2,8879,'4.99','2005-07-30 00:16:02','2006-02-15 22:22:45'),(15650,584,2,9451,'3.99','2005-07-30 22:10:17','2006-02-15 22:22:45'),(15651,584,1,9719,'5.99','2005-07-31 08:25:13','2006-02-15 22:22:46'),(15652,584,2,10073,'2.99','2005-07-31 19:53:15','2006-02-15 22:22:46'),(15653,584,1,10914,'4.99','2005-08-02 02:04:43','2006-02-15 22:22:46'),(15654,584,2,10966,'0.99','2005-08-02 04:00:47','2006-02-15 22:22:46'),(15655,584,1,11213,'4.99','2005-08-02 12:18:35','2006-02-15 22:22:46'),(15656,584,2,11500,'6.99','2005-08-16 23:01:22','2006-02-15 22:22:46'),(15657,584,2,12507,'8.99','2005-08-18 13:19:13','2006-02-15 22:22:46'),(15658,584,2,12541,'2.99','2005-08-18 14:18:30','2006-02-15 22:22:46'),(15659,584,2,12693,'5.99','2005-08-18 20:10:19','2006-02-15 22:22:46'),(15660,584,1,12844,'2.99','2005-08-19 01:59:08','2006-02-15 22:22:46'),(15661,584,2,14102,'5.99','2005-08-21 00:35:21','2006-02-15 22:22:46'),(15662,584,2,14230,'5.99','2005-08-21 04:57:29','2006-02-15 22:22:46'),(15663,584,2,14447,'4.99','2005-08-21 12:12:05','2006-02-15 22:22:46'),(15664,584,1,14930,'1.99','2005-08-22 05:38:32','2006-02-15 22:22:46'),(15665,584,1,15615,'0.99','2005-08-23 07:06:00','2006-02-15 22:22:47'),(15666,585,1,1344,'0.99','2005-06-15 12:29:41','2006-02-15 22:22:47'),(15667,585,2,1346,'7.99','2005-06-15 12:39:52','2006-02-15 22:22:47'),(15668,585,1,2674,'0.99','2005-06-19 11:47:59','2006-02-15 22:22:47'),(15669,585,1,2930,'3.99','2005-06-20 04:50:29','2006-02-15 22:22:47'),(15670,585,2,4156,'4.99','2005-07-07 09:03:51','2006-02-15 22:22:47'),(15671,585,2,4579,'4.99','2005-07-08 06:01:56','2006-02-15 22:22:47'),(15672,585,1,4684,'9.99','2005-07-08 10:41:06','2006-02-15 22:22:47'),(15673,585,2,5284,'2.99','2005-07-09 15:08:21','2006-02-15 22:22:47'),(15674,585,2,5950,'4.99','2005-07-10 23:13:45','2006-02-15 22:22:47'),(15675,585,2,6733,'6.99','2005-07-12 14:04:01','2006-02-15 22:22:47'),(15676,585,1,7131,'2.99','2005-07-27 06:25:06','2006-02-15 22:22:47'),(15677,585,1,7384,'4.99','2005-07-27 15:49:45','2006-02-15 22:22:47'),(15678,585,2,7409,'4.99','2005-07-27 16:38:24','2006-02-15 22:22:47'),(15679,585,2,8353,'2.99','2005-07-29 04:52:10','2006-02-15 22:22:48'),(15680,585,2,9407,'8.99','2005-07-30 20:25:24','2006-02-15 22:22:48'),(15681,585,1,9590,'3.99','2005-07-31 03:17:16','2006-02-15 22:22:48'),(15682,585,1,9860,'6.99','2005-07-31 13:03:24','2006-02-15 22:22:48'),(15683,585,2,10573,'0.99','2005-08-01 13:27:24','2006-02-15 22:22:48'),(15684,585,1,11285,'9.99','2005-08-02 14:44:02','2006-02-15 22:22:48'),(15685,585,2,13593,'3.99','2005-08-20 05:50:52','2006-02-15 22:22:48'),(15686,585,2,13939,'0.99','2005-08-20 17:28:01','2006-02-15 22:22:48'),(15687,585,1,15804,'4.99','2005-08-23 14:29:16','2006-02-15 22:22:48'),(15688,585,1,15896,'6.99','2005-08-23 17:09:56','2006-02-15 22:22:48'),(15689,585,2,14604,'4.99','2006-02-14 15:16:03','2006-02-15 22:22:48'),(15690,586,1,138,'4.99','2005-05-25 22:48:22','2006-02-15 22:22:48'),(15691,586,1,900,'8.99','2005-05-30 09:38:41','2006-02-15 22:22:48'),(15692,586,1,1260,'2.99','2005-06-15 06:42:25','2006-02-15 22:22:48'),(15693,586,2,1540,'0.99','2005-06-16 01:14:56','2006-02-15 22:22:49'),(15694,586,2,3487,'6.99','2005-07-05 23:30:36','2006-02-15 22:22:49'),(15695,586,2,3733,'4.99','2005-07-06 11:33:55','2006-02-15 22:22:49'),(15696,586,2,5382,'2.99','2005-07-09 19:12:57','2006-02-15 22:22:49'),(15697,586,1,6679,'2.99','2005-07-12 12:01:07','2006-02-15 22:22:49'),(15698,586,2,9786,'2.99','2005-07-31 10:25:21','2006-02-15 22:22:49'),(15699,586,2,9896,'2.99','2005-07-31 14:09:48','2006-02-15 22:22:49'),(15700,586,1,11034,'2.99','2005-08-02 05:54:53','2006-02-15 22:22:49'),(15701,586,1,11763,'0.99','2005-08-17 09:51:39','2006-02-15 22:22:49'),(15702,586,1,12013,'4.99','2005-08-17 19:23:02','2006-02-15 22:22:49'),(15703,586,1,12898,'0.99','2005-08-19 03:54:34','2006-02-15 22:22:50'),(15704,586,2,14043,'2.99','2005-08-20 21:46:43','2006-02-15 22:22:50'),(15705,586,1,14392,'1.99','2005-08-21 10:19:25','2006-02-15 22:22:50'),(15706,586,2,14533,'2.99','2005-08-21 15:15:19','2006-02-15 22:22:50'),(15707,586,1,15666,'3.99','2005-08-23 09:01:10','2006-02-15 22:22:51'),(15708,586,2,15684,'0.99','2005-08-23 09:40:04','2006-02-15 22:22:51'),(15709,587,1,181,'4.99','2005-05-26 04:47:06','2006-02-15 22:22:51'),(15710,587,1,361,'0.99','2005-05-27 07:03:28','2006-02-15 22:22:51'),(15711,587,2,1330,'2.99','2005-06-15 11:29:17','2006-02-15 22:22:52'),(15712,587,2,2034,'4.99','2005-06-17 13:27:16','2006-02-15 22:22:52'),(15713,587,1,2220,'2.99','2005-06-18 03:21:36','2006-02-15 22:22:52'),(15714,587,1,2329,'4.99','2005-06-18 10:22:52','2006-02-15 22:22:52'),(15715,587,2,3562,'2.99','2005-07-06 02:54:36','2006-02-15 22:22:53'),(15716,587,2,3969,'0.99','2005-07-06 22:47:59','2006-02-15 22:22:53'),(15717,587,2,5243,'3.99','2005-07-09 13:22:08','2006-02-15 22:22:53'),(15718,587,1,6639,'0.99','2005-07-12 10:00:44','2006-02-15 22:22:53'),(15719,587,2,6665,'6.99','2005-07-12 11:29:14','2006-02-15 22:22:53'),(15720,587,1,7501,'8.99','2005-07-27 20:16:59','2006-02-15 22:22:54'),(15721,587,2,8776,'5.99','2005-07-29 20:07:06','2006-02-15 22:22:54'),(15722,587,2,9720,'6.99','2005-07-31 08:25:21','2006-02-15 22:22:54'),(15723,587,2,9785,'4.99','2005-07-31 10:22:15','2006-02-15 22:22:54'),(15724,587,2,9909,'5.99','2005-07-31 14:43:34','2006-02-15 22:22:55'),(15725,587,2,10224,'4.99','2005-08-01 01:31:56','2006-02-15 22:22:55'),(15726,587,1,10825,'2.99','2005-08-01 23:05:33','2006-02-15 22:22:55'),(15727,587,1,11078,'2.99','2005-08-02 07:26:58','2006-02-15 22:22:55'),(15728,587,2,11403,'4.99','2005-08-02 19:10:21','2006-02-15 22:22:56'),(15729,587,2,12164,'4.99','2005-08-18 00:46:38','2006-02-15 22:22:56'),(15730,587,2,12330,'6.99','2005-08-18 06:46:33','2006-02-15 22:22:56'),(15731,587,2,14710,'4.99','2005-08-21 21:15:23','2006-02-15 22:22:56'),(15732,587,2,15348,'2.99','2005-08-22 21:13:46','2006-02-15 22:22:57'),(15733,587,2,15349,'0.99','2005-08-22 21:13:51','2006-02-15 22:22:57'),(15734,587,1,12144,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:57'),(15735,588,1,576,'2.99','2005-05-28 10:56:10','2006-02-15 22:22:57'),(15736,588,1,961,'4.99','2005-05-30 18:16:44','2006-02-15 22:22:58'),(15737,588,2,1885,'2.99','2005-06-17 03:35:59','2006-02-15 22:22:58'),(15738,588,2,1903,'6.99','2005-06-17 04:37:20','2006-02-15 22:22:58'),(15739,588,2,2270,'7.99','2005-06-18 06:29:01','2006-02-15 22:22:58'),(15740,588,1,2453,'2.99','2005-06-18 19:30:53','2006-02-15 22:22:59'),(15741,588,2,2920,'3.99','2005-06-20 04:12:46','2006-02-15 22:22:59'),(15742,588,1,3628,'4.99','2005-07-06 06:19:43','2006-02-15 22:22:59'),(15743,588,1,4101,'0.99','2005-07-07 06:25:11','2006-02-15 22:22:59'),(15744,588,2,4207,'5.99','2005-07-07 11:32:45','2006-02-15 22:23:00'),(15745,588,2,5203,'2.99','2005-07-09 10:53:59','2006-02-15 22:23:00'),(15746,588,1,5335,'4.99','2005-07-09 17:00:49','2006-02-15 22:23:00'),(15747,588,1,6368,'4.99','2005-07-11 21:19:01','2006-02-15 22:23:00'),(15748,588,2,7377,'2.99','2005-07-27 15:31:28','2006-02-15 22:23:01'),(15749,588,2,7903,'2.99','2005-07-28 11:20:36','2006-02-15 22:23:01'),(15750,588,1,8421,'4.99','2005-07-29 07:00:47','2006-02-15 22:23:01'),(15751,588,1,8429,'2.99','2005-07-29 07:11:49','2006-02-15 22:23:01'),(15752,588,2,8519,'2.99','2005-07-29 10:09:43','2006-02-15 22:23:02'),(15753,588,1,8769,'2.99','2005-07-29 19:45:33','2006-02-15 22:23:02'),(15754,588,2,9326,'2.99','2005-07-30 17:30:03','2006-02-15 22:23:02'),(15755,588,2,9370,'4.99','2005-07-30 18:57:29','2006-02-15 22:23:02'),(15756,588,2,10373,'4.99','2005-08-01 06:24:26','2006-02-15 22:23:02'),(15757,588,1,12185,'2.99','2005-08-18 01:40:14','2006-02-15 22:23:03'),(15758,588,2,12815,'4.99','2005-08-19 00:59:42','2006-02-15 22:23:03'),(15759,588,1,13064,'4.99','2005-08-19 09:46:53','2006-02-15 22:23:03'),(15760,588,1,13923,'1.99','2005-08-20 17:05:02','2006-02-15 22:23:03'),(15761,588,1,15109,'1.99','2005-08-22 12:12:58','2006-02-15 22:23:04'),(15762,588,1,15158,'2.99','2005-08-22 14:30:39','2006-02-15 22:23:04'),(15763,588,1,15209,'4.99','2005-08-22 16:37:32','2006-02-15 22:23:04'),(15764,589,1,531,'0.99','2005-05-28 05:23:38','2006-02-15 22:23:04'),(15765,589,1,596,'4.99','2005-05-28 14:00:03','2006-02-15 22:23:05'),(15766,589,1,737,'4.99','2005-05-29 08:11:31','2006-02-15 22:23:05'),(15767,589,1,1439,'4.99','2005-06-15 18:45:32','2006-02-15 22:23:05'),(15768,589,2,1703,'4.99','2005-06-16 13:28:44','2006-02-15 22:23:05'),(15769,589,2,2652,'8.99','2005-06-19 10:35:26','2006-02-15 22:23:06'),(15770,589,1,2707,'8.99','2005-06-19 13:57:08','2006-02-15 22:23:06'),(15771,589,1,2979,'2.99','2005-06-20 08:31:05','2006-02-15 22:23:06'),(15772,589,2,4986,'2.99','2005-07-09 00:44:33','2006-02-15 22:23:06'),(15773,589,1,5951,'0.99','2005-07-10 23:14:29','2006-02-15 22:23:07'),(15774,589,2,6177,'4.99','2005-07-11 10:53:49','2006-02-15 22:23:07'),(15775,589,2,6247,'3.99','2005-07-11 15:00:05','2006-02-15 22:23:07'),(15776,589,2,7250,'0.99','2005-07-27 10:44:09','2006-02-15 22:23:07'),(15777,589,2,7431,'3.99','2005-07-27 17:27:27','2006-02-15 22:23:08'),(15778,589,2,7948,'9.99','2005-07-28 13:06:16','2006-02-15 22:23:08'),(15779,589,2,8056,'0.99','2005-07-28 17:04:15','2006-02-15 22:23:08'),(15780,589,1,8374,'3.99','2005-07-29 05:24:02','2006-02-15 22:23:08'),(15781,589,1,9153,'4.99','2005-07-30 10:58:16','2006-02-15 22:23:09'),(15782,589,2,10544,'4.99','2005-08-01 12:36:21','2006-02-15 22:23:09'),(15783,589,1,11980,'4.99','2005-08-17 18:10:18','2006-02-15 22:23:09'),(15784,589,1,12738,'7.99','2005-08-18 22:11:47','2006-02-15 22:23:09'),(15785,589,2,12933,'8.99','2005-08-19 05:18:20','2006-02-15 22:23:10'),(15786,589,1,14038,'6.99','2005-08-20 21:39:23','2006-02-15 22:23:10'),(15787,589,1,14254,'6.99','2005-08-21 05:51:28','2006-02-15 22:23:10'),(15788,589,1,14544,'0.99','2005-08-21 15:41:01','2006-02-15 22:23:10'),(15789,589,2,14706,'0.99','2005-08-21 21:04:42','2006-02-15 22:23:10'),(15790,589,2,15917,'5.99','2005-08-23 17:57:28','2006-02-15 22:23:11'),(15791,589,2,15992,'0.99','2005-08-23 20:28:32','2006-02-15 22:23:11'),(15792,590,1,602,'3.99','2005-05-28 14:15:54','2006-02-15 22:23:11'),(15793,590,2,1456,'7.99','2005-06-15 20:00:11','2006-02-15 22:23:11'),(15794,590,2,2352,'2.99','2005-06-18 12:40:15','2006-02-15 22:23:12'),(15795,590,2,2775,'2.99','2005-06-19 18:14:20','2006-02-15 22:23:12'),(15796,590,1,2916,'6.99','2005-06-20 04:01:04','2006-02-15 22:23:12'),(15797,590,1,2964,'9.99','2005-06-20 07:33:29','2006-02-15 22:23:12'),(15798,590,2,4685,'4.99','2005-07-08 10:45:13','2006-02-15 22:23:13'),(15799,590,1,4710,'2.99','2005-07-08 12:04:53','2006-02-15 22:23:13'),(15800,590,2,4722,'4.99','2005-07-08 12:42:27','2006-02-15 22:23:13'),(15801,590,1,5165,'0.99','2005-07-09 09:08:53','2006-02-15 22:23:13'),(15802,590,1,5529,'2.99','2005-07-10 02:11:13','2006-02-15 22:23:14'),(15803,590,1,5991,'4.99','2005-07-11 01:03:38','2006-02-15 22:23:14'),(15804,590,2,6232,'4.99','2005-07-11 14:08:27','2006-02-15 22:23:14'),(15805,590,2,6492,'4.99','2005-07-12 02:28:40','2006-02-15 22:23:14'),(15806,590,1,7010,'4.99','2005-07-27 01:56:01','2006-02-15 22:23:15'),(15807,590,2,7665,'2.99','2005-07-28 02:28:30','2006-02-15 22:23:15'),(15808,590,1,8195,'5.99','2005-07-28 22:52:58','2006-02-15 22:23:15'),(15809,590,1,8801,'4.99','2005-07-29 21:25:22','2006-02-15 22:23:15'),(15810,590,2,9126,'0.99','2005-07-30 09:44:15','2006-02-15 22:23:16'),(15811,590,1,9884,'4.99','2005-07-31 13:56:24','2006-02-15 22:23:16'),(15812,590,1,10657,'4.99','2005-08-01 16:38:44','2006-02-15 22:23:16'),(15813,590,2,11578,'5.99','2005-08-17 01:54:13','2006-02-15 22:23:16'),(15814,590,2,11713,'3.99','2005-08-17 07:34:05','2006-02-15 22:23:17'),(15815,590,1,14830,'2.99','2005-08-22 01:37:19','2006-02-15 22:23:17'),(15816,590,2,15458,'2.99','2006-02-14 15:16:03','2006-02-15 22:23:17'),(15817,591,1,1418,'0.99','2005-06-15 17:51:27','2006-02-15 22:23:17'),(15818,591,2,3341,'2.99','2005-06-21 10:37:25','2006-02-15 22:23:17'),(15819,591,2,3435,'4.99','2005-06-21 19:14:58','2006-02-15 22:23:18'),(15820,591,1,3636,'0.99','2005-07-06 07:03:52','2006-02-15 22:23:18'),(15821,591,2,4383,'11.99','2005-07-07 20:45:51','2006-02-15 22:23:18'),(15822,591,1,4581,'6.99','2005-07-08 06:05:06','2006-02-15 22:23:18'),(15823,591,1,5704,'5.99','2005-07-10 10:06:29','2006-02-15 22:23:19'),(15824,591,1,5759,'6.99','2005-07-10 12:43:22','2006-02-15 22:23:19'),(15825,591,1,7118,'8.99','2005-07-27 05:53:50','2006-02-15 22:23:19'),(15826,591,1,7212,'2.99','2005-07-27 09:21:22','2006-02-15 22:23:19'),(15827,591,2,7511,'4.99','2005-07-27 20:38:40','2006-02-15 22:23:20'),(15828,591,1,7549,'3.99','2005-07-27 21:53:21','2006-02-15 22:23:20'),(15829,591,2,7741,'0.99','2005-07-28 05:25:55','2006-02-15 22:23:20'),(15830,591,1,7997,'4.99','2005-07-28 15:02:25','2006-02-15 22:23:20'),(15831,591,1,8149,'3.99','2005-07-28 20:48:12','2006-02-15 22:23:21'),(15832,591,2,8666,'5.99','2005-07-29 15:39:38','2006-02-15 22:23:21'),(15833,591,2,8819,'4.99','2005-07-29 22:14:26','2006-02-15 22:23:21'),(15834,591,1,9684,'0.99','2005-07-31 06:48:33','2006-02-15 22:23:21'),(15835,591,1,10415,'4.99','2005-08-01 08:05:59','2006-02-15 22:23:22'),(15836,591,2,12203,'5.99','2005-08-18 02:18:52','2006-02-15 22:23:22'),(15837,591,2,12227,'4.99','2005-08-18 03:04:28','2006-02-15 22:23:22'),(15838,591,1,12547,'4.99','2005-08-18 14:29:39','2006-02-15 22:23:22'),(15839,591,1,12571,'5.99','2005-08-18 15:31:18','2006-02-15 22:23:23'),(15840,591,1,12934,'5.99','2005-08-19 05:18:42','2006-02-15 22:23:23'),(15841,591,2,13104,'2.99','2005-08-19 11:06:06','2006-02-15 22:23:23'),(15842,591,2,13343,'3.99','2005-08-19 20:22:08','2006-02-15 22:23:23'),(15843,591,1,13867,'9.99','2005-08-20 15:05:42','2006-02-15 22:23:23'),(15844,592,2,1163,'6.99','2005-06-14 23:12:46','2006-02-15 22:23:24'),(15845,592,2,1423,'5.99','2005-06-15 18:08:12','2006-02-15 22:23:24'),(15846,592,1,1479,'2.99','2005-06-15 21:13:38','2006-02-15 22:23:24'),(15847,592,1,2627,'0.99','2005-06-19 08:32:00','2006-02-15 22:23:24'),(15848,592,1,3158,'7.99','2005-06-20 21:08:19','2006-02-15 22:23:25'),(15849,592,2,3560,'2.99','2005-07-06 02:51:37','2006-02-15 22:23:25'),(15850,592,1,3973,'11.99','2005-07-06 22:58:31','2006-02-15 22:23:25'),(15851,592,1,4129,'1.99','2005-07-07 07:37:03','2006-02-15 22:23:25'),(15852,592,1,4145,'9.99','2005-07-07 08:26:39','2006-02-15 22:23:26'),(15853,592,1,4460,'0.99','2005-07-07 23:50:14','2006-02-15 22:23:26'),(15854,592,1,4518,'2.99','2005-07-08 02:48:36','2006-02-15 22:23:26'),(15855,592,1,6937,'0.99','2005-07-26 23:15:50','2006-02-15 22:23:26'),(15856,592,2,7173,'0.99','2005-07-27 07:59:24','2006-02-15 22:23:27'),(15857,592,1,7278,'3.99','2005-07-27 11:50:34','2006-02-15 22:23:27'),(15858,592,2,7364,'4.99','2005-07-27 14:58:40','2006-02-15 22:23:27'),(15859,592,1,8730,'2.99','2005-07-29 18:23:34','2006-02-15 22:23:27'),(15860,592,2,8773,'0.99','2005-07-29 19:55:34','2006-02-15 22:23:28'),(15861,592,1,9268,'4.99','2005-07-30 15:02:30','2006-02-15 22:23:28'),(15862,592,1,9437,'3.99','2005-07-30 21:36:04','2006-02-15 22:23:28'),(15863,592,2,9666,'6.99','2005-07-31 06:20:58','2006-02-15 22:23:28'),(15864,592,2,10383,'0.99','2005-08-01 06:37:16','2006-02-15 22:23:29'),(15865,592,2,10634,'2.99','2005-08-01 15:37:48','2006-02-15 22:23:29'),(15866,592,1,11410,'8.99','2005-08-02 19:29:01','2006-02-15 22:23:29'),(15867,592,2,12043,'0.99','2005-08-17 20:38:21','2006-02-15 22:23:29'),(15868,592,2,12619,'0.99','2005-08-18 17:24:15','2006-02-15 22:23:30'),(15869,592,1,12976,'1.99','2005-08-19 06:52:58','2006-02-15 22:23:30'),(15870,592,1,13157,'2.99','2005-08-19 13:12:28','2006-02-15 22:23:30'),(15871,592,2,13662,'3.99','2005-08-20 08:11:58','2006-02-15 22:23:30'),(15872,592,2,14606,'0.99','2006-02-14 15:16:03','2006-02-15 22:23:30'),(15873,593,1,790,'2.99','2005-05-29 16:19:29','2006-02-15 22:23:31'),(15874,593,1,991,'8.99','2005-05-30 23:29:22','2006-02-15 22:23:31'),(15875,593,2,2055,'5.99','2005-06-17 15:27:03','2006-02-15 22:23:31'),(15876,593,2,2205,'4.99','2005-06-18 02:14:34','2006-02-15 22:23:31'),(15877,593,1,2441,'4.99','2005-06-18 18:45:11','2006-02-15 22:23:32'),(15878,593,1,2832,'4.99','2005-06-19 21:21:53','2006-02-15 22:23:32'),(15879,593,2,3542,'2.99','2005-07-06 01:51:42','2006-02-15 22:23:32'),(15880,593,2,4075,'2.99','2005-07-07 04:51:44','2006-02-15 22:23:32'),(15881,593,2,4280,'3.99','2005-07-07 15:09:31','2006-02-15 22:23:33'),(15882,593,2,4623,'0.99','2005-07-08 08:03:22','2006-02-15 22:23:33'),(15883,593,2,4781,'4.99','2005-07-08 16:06:55','2006-02-15 22:23:33'),(15884,593,2,4867,'0.99','2005-07-08 19:10:52','2006-02-15 22:23:33'),(15885,593,1,6386,'2.99','2005-07-11 22:14:57','2006-02-15 22:23:34'),(15886,593,1,6731,'2.99','2005-07-12 13:58:27','2006-02-15 22:23:34'),(15887,593,2,7958,'4.99','2005-07-28 13:34:34','2006-02-15 22:23:34'),(15888,593,1,8497,'2.99','2005-07-29 09:07:03','2006-02-15 22:23:34'),(15889,593,2,9329,'6.99','2005-07-30 17:42:38','2006-02-15 22:23:35'),(15890,593,1,9483,'6.99','2005-07-30 23:31:31','2006-02-15 22:23:35'),(15891,593,1,10368,'3.99','2005-08-01 06:13:38','2006-02-15 22:23:35'),(15892,593,2,10533,'3.99','2005-08-01 12:14:16','2006-02-15 22:23:35'),(15893,593,1,10840,'5.99','2005-08-01 23:38:34','2006-02-15 22:23:36'),(15894,593,2,10904,'4.99','2005-08-02 01:43:02','2006-02-15 22:23:36'),(15895,593,2,12744,'2.99','2005-08-18 22:22:36','2006-02-15 22:23:36'),(15896,593,1,13524,'6.99','2005-08-20 02:48:43','2006-02-15 22:23:36'),(15897,593,1,14408,'5.99','2005-08-21 10:47:24','2006-02-15 22:23:36'),(15898,593,1,14653,'0.99','2005-08-21 19:35:59','2006-02-15 22:23:37'),(15899,594,1,313,'4.99','2005-05-26 22:56:19','2006-02-15 22:23:37'),(15900,594,1,360,'8.99','2005-05-27 06:51:14','2006-02-15 22:23:37'),(15901,594,2,1018,'0.99','2005-05-31 02:53:42','2006-02-15 22:23:37'),(15902,594,1,1045,'6.99','2005-05-31 06:29:01','2006-02-15 22:23:38'),(15903,594,2,1537,'5.99','2005-06-16 00:52:51','2006-02-15 22:23:38'),(15904,594,1,1816,'4.99','2005-06-16 21:20:41','2006-02-15 22:23:38'),(15905,594,1,1950,'2.99','2005-06-17 08:26:52','2006-02-15 22:23:38'),(15906,594,1,2276,'6.99','2005-06-18 06:33:48','2006-02-15 22:23:39'),(15907,594,2,2786,'0.99','2005-06-19 18:46:43','2006-02-15 22:23:39'),(15908,594,2,3302,'1.99','2005-06-21 07:33:40','2006-02-15 22:23:39'),(15909,594,2,3474,'0.99','2005-07-05 22:59:53','2006-02-15 22:23:39'),(15910,594,1,3546,'4.99','2005-07-06 02:17:54','2006-02-15 22:23:40'),(15911,594,2,3960,'2.99','2005-07-06 22:08:53','2006-02-15 22:23:40'),(15912,594,1,4037,'5.99','2005-07-07 02:52:52','2006-02-15 22:23:40'),(15913,594,1,4154,'3.99','2005-07-07 08:58:23','2006-02-15 22:23:40'),(15914,594,2,5386,'2.99','2005-07-09 19:19:09','2006-02-15 22:23:41'),(15915,594,1,6473,'6.99','2005-07-12 01:35:40','2006-02-15 22:23:41'),(15916,594,1,7533,'8.99','2005-07-27 21:24:33','2006-02-15 22:23:41'),(15917,594,1,8567,'1.99','2005-07-29 11:37:30','2006-02-15 22:23:41'),(15918,594,1,8603,'2.99','2005-07-29 13:07:07','2006-02-15 22:23:42'),(15919,594,2,8820,'5.99','2005-07-29 22:14:56','2006-02-15 22:23:42'),(15920,594,1,9545,'7.99','2005-07-31 01:46:24','2006-02-15 22:23:42'),(15921,594,1,9698,'3.99','2005-07-31 07:24:35','2006-02-15 22:23:42'),(15922,594,2,9802,'4.99','2005-07-31 11:04:20','2006-02-15 22:23:42'),(15923,594,2,10704,'8.99','2005-08-01 18:38:02','2006-02-15 22:23:43'),(15924,594,2,14824,'4.99','2005-08-22 01:27:51','2006-02-15 22:23:43'),(15925,594,1,14999,'4.99','2005-08-22 07:54:47','2006-02-15 22:23:43'),(15926,595,1,613,'6.99','2005-05-28 15:27:22','2006-02-15 22:23:43'),(15927,595,2,1170,'2.99','2005-06-14 23:47:35','2006-02-15 22:23:44'),(15928,595,2,3371,'4.99','2005-06-21 13:27:22','2006-02-15 22:23:44'),(15929,595,1,3789,'9.99','2005-07-06 14:02:26','2006-02-15 22:23:44'),(15930,595,1,4017,'4.99','2005-07-07 01:08:18','2006-02-15 22:23:44'),(15931,595,1,4241,'4.99','2005-07-07 13:39:00','2006-02-15 22:23:45'),(15932,595,2,4775,'2.99','2005-07-08 15:44:05','2006-02-15 22:23:45'),(15933,595,1,5631,'1.99','2005-07-10 06:15:45','2006-02-15 22:23:45'),(15934,595,1,5952,'1.99','2005-07-10 23:18:20','2006-02-15 22:23:45'),(15935,595,1,6105,'6.99','2005-07-11 07:03:19','2006-02-15 22:23:46'),(15936,595,1,6704,'6.99','2005-07-12 12:50:24','2006-02-15 22:23:46'),(15937,595,1,7086,'4.99','2005-07-27 04:39:46','2006-02-15 22:23:46'),(15938,595,2,7307,'0.99','2005-07-27 12:59:10','2006-02-15 22:23:46'),(15939,595,1,7396,'4.99','2005-07-27 16:03:53','2006-02-15 22:23:47'),(15940,595,2,7490,'3.99','2005-07-27 19:48:12','2006-02-15 22:23:47'),(15941,595,1,9152,'2.99','2005-07-30 10:51:27','2006-02-15 22:23:47'),(15942,595,2,9223,'2.99','2005-07-30 13:23:20','2006-02-15 22:23:47'),(15943,595,1,9354,'4.99','2005-07-30 18:32:51','2006-02-15 22:23:48'),(15944,595,2,9497,'0.99','2005-07-30 23:56:54','2006-02-15 22:23:48'),(15945,595,2,9542,'4.99','2005-07-31 01:41:48','2006-02-15 22:23:48'),(15946,595,1,9631,'2.99','2005-07-31 05:02:00','2006-02-15 22:23:48'),(15947,595,2,9826,'10.99','2005-07-31 11:51:46','2006-02-15 22:23:48'),(15948,595,1,10729,'2.99','2005-08-01 19:21:11','2006-02-15 22:23:49'),(15949,595,1,10932,'2.99','2005-08-02 02:46:22','2006-02-15 22:23:49'),(15950,595,2,11748,'0.99','2005-08-17 09:04:02','2006-02-15 22:23:49'),(15951,595,1,12235,'0.99','2005-08-18 03:17:50','2006-02-15 22:23:49'),(15952,595,1,14334,'0.99','2005-08-21 08:32:32','2006-02-15 22:23:50'),(15953,595,2,15576,'2.99','2005-08-23 05:32:03','2006-02-15 22:23:50'),(15954,595,2,15994,'0.99','2005-08-23 20:29:10','2006-02-15 22:23:50'),(15955,595,2,16016,'2.99','2005-08-23 21:26:35','2006-02-15 22:23:50'),(15956,596,2,303,'4.99','2005-05-26 21:16:52','2006-02-15 22:23:51'),(15957,596,2,625,'0.99','2005-05-28 16:35:46','2006-02-15 22:23:51'),(15958,596,2,667,'4.99','2005-05-28 21:49:02','2006-02-15 22:23:51'),(15959,596,2,782,'1.99','2005-05-29 14:38:57','2006-02-15 22:23:51'),(15960,596,1,914,'2.99','2005-05-30 11:06:00','2006-02-15 22:23:52'),(15961,596,1,974,'6.99','2005-05-30 20:28:42','2006-02-15 22:23:52'),(15962,596,1,1644,'1.99','2005-06-16 08:58:18','2006-02-15 22:23:52'),(15963,596,1,2767,'1.99','2005-06-19 17:46:35','2006-02-15 22:23:52'),(15964,596,2,5742,'3.99','2005-07-10 11:56:18','2006-02-15 22:23:53'),(15965,596,1,6015,'2.99','2005-07-11 02:04:12','2006-02-15 22:23:53'),(15966,596,1,6017,'0.99','2005-07-11 02:05:32','2006-02-15 22:23:53'),(15967,596,1,6197,'4.99','2005-07-11 12:09:51','2006-02-15 22:23:53'),(15968,596,2,6883,'4.99','2005-07-12 20:50:48','2006-02-15 22:23:53'),(15969,596,1,10094,'3.99','2005-07-31 20:31:18','2006-02-15 22:23:54'),(15970,596,2,10692,'4.99','2005-08-01 18:12:35','2006-02-15 22:23:54'),(15971,596,1,10756,'2.99','2005-08-01 20:17:03','2006-02-15 22:23:54'),(15972,596,2,10804,'0.99','2005-08-01 22:22:11','2006-02-15 22:23:54'),(15973,596,2,11009,'4.99','2005-08-02 05:06:23','2006-02-15 22:23:55'),(15974,596,2,11852,'3.99','2005-08-17 13:38:27','2006-02-15 22:23:55'),(15975,596,1,11934,'0.99','2005-08-17 16:40:00','2006-02-15 22:23:55'),(15976,596,2,12560,'4.99','2005-08-18 14:54:19','2006-02-15 22:23:55'),(15977,596,1,12878,'4.99','2005-08-19 03:17:08','2006-02-15 22:23:56'),(15978,596,1,13648,'4.99','2005-08-20 07:48:10','2006-02-15 22:23:56'),(15979,596,1,14050,'3.99','2005-08-20 22:09:04','2006-02-15 22:23:56'),(15980,596,1,14417,'0.99','2005-08-21 11:13:35','2006-02-15 22:23:56'),(15981,596,1,15405,'0.99','2005-08-22 23:20:41','2006-02-15 22:23:57'),(15982,596,1,15899,'6.99','2005-08-23 17:16:28','2006-02-15 22:23:57'),(15983,596,1,15423,'0.99','2006-02-14 15:16:03','2006-02-15 22:23:57'),(15984,597,2,34,'2.99','2005-05-25 04:19:28','2006-02-15 22:23:57'),(15985,597,2,514,'8.99','2005-05-28 03:09:28','2006-02-15 22:23:58'),(15986,597,1,2379,'0.99','2005-06-18 14:59:39','2006-02-15 22:23:58'),(15987,597,1,2696,'4.99','2005-06-19 13:28:42','2006-02-15 22:23:58'),(15988,597,1,3201,'1.99','2005-06-21 00:30:26','2006-02-15 22:23:58'),(15989,597,1,5093,'0.99','2005-07-09 05:59:12','2006-02-15 22:23:59'),(15990,597,1,5348,'4.99','2005-07-09 17:34:11','2006-02-15 22:23:59'),(15991,597,2,5732,'2.99','2005-07-10 11:36:32','2006-02-15 22:23:59'),(15992,597,1,6508,'2.99','2005-07-12 03:34:50','2006-02-15 22:23:59'),(15993,597,2,7968,'4.99','2005-07-28 13:57:35','2006-02-15 22:23:59'),(15994,597,2,8948,'4.99','2005-07-30 03:16:18','2006-02-15 22:24:00'),(15995,597,2,10021,'4.99','2005-07-31 18:24:39','2006-02-15 22:24:00'),(15996,597,1,10214,'0.99','2005-08-01 01:04:15','2006-02-15 22:24:00'),(15997,597,2,10986,'5.99','2005-08-02 04:35:24','2006-02-15 22:24:00'),(15998,597,2,11147,'4.99','2005-08-02 09:45:54','2006-02-15 22:24:01'),(15999,597,2,11223,'2.99','2005-08-02 12:34:27','2006-02-15 22:24:01'),(16000,597,1,11240,'2.99','2005-08-02 13:28:30','2006-02-15 22:24:01'),(16001,597,1,11880,'5.99','2005-08-17 14:28:28','2006-02-15 22:24:01'),(16002,597,1,12081,'4.99','2005-08-17 22:10:46','2006-02-15 22:24:02'),(16003,597,1,12992,'0.99','2005-08-19 07:23:06','2006-02-15 22:24:02'),(16004,597,2,13019,'2.99','2005-08-19 08:07:43','2006-02-15 22:24:02'),(16005,597,1,13152,'6.99','2005-08-19 13:09:32','2006-02-15 22:24:02'),(16006,597,2,15275,'2.99','2005-08-22 18:57:39','2006-02-15 22:24:03'),(16007,597,1,15469,'4.99','2005-08-23 01:29:59','2006-02-15 22:24:03'),(16008,597,1,11652,'4.99','2006-02-14 15:16:03','2006-02-15 22:24:03'),(16009,598,1,3005,'2.99','2005-06-20 10:10:29','2006-02-15 22:24:03'),(16010,598,1,3648,'0.99','2005-07-06 07:30:41','2006-02-15 22:24:04'),(16011,598,2,3950,'6.99','2005-07-06 21:48:44','2006-02-15 22:24:04'),(16012,598,1,3972,'4.99','2005-07-06 22:53:57','2006-02-15 22:24:04'),(16013,598,1,4181,'4.99','2005-07-07 10:27:54','2006-02-15 22:24:04'),(16014,598,2,5688,'5.99','2005-07-10 09:16:08','2006-02-15 22:24:04'),(16015,598,1,6519,'4.99','2005-07-12 04:00:36','2006-02-15 22:24:05'),(16016,598,2,6528,'4.99','2005-07-12 04:29:44','2006-02-15 22:24:05'),(16017,598,2,6575,'0.99','2005-07-12 06:12:53','2006-02-15 22:24:05'),(16018,598,2,6660,'3.99','2005-07-12 11:20:12','2006-02-15 22:24:05'),(16019,598,2,7201,'6.99','2005-07-27 08:57:40','2006-02-15 22:24:06'),(16020,598,2,7354,'0.99','2005-07-27 14:42:11','2006-02-15 22:24:06'),(16021,598,1,7998,'0.99','2005-07-28 15:08:48','2006-02-15 22:24:06'),(16022,598,2,8436,'0.99','2005-07-29 07:21:20','2006-02-15 22:24:06'),(16023,598,1,8511,'5.99','2005-07-29 09:42:42','2006-02-15 22:24:07'),(16024,598,1,8939,'4.99','2005-07-30 02:56:53','2006-02-15 22:24:07'),(16025,598,1,10054,'4.99','2005-07-31 19:15:52','2006-02-15 22:24:07'),(16026,598,2,11350,'0.99','2005-08-02 17:22:59','2006-02-15 22:24:07'),(16027,598,2,12601,'2.99','2005-08-18 16:47:52','2006-02-15 22:24:08'),(16028,598,2,14345,'0.99','2005-08-21 08:41:15','2006-02-15 22:24:08'),(16029,598,2,15307,'2.99','2005-08-22 19:54:26','2006-02-15 22:24:08'),(16030,598,1,15443,'7.99','2005-08-23 00:44:15','2006-02-15 22:24:08'),(16031,599,2,1008,'4.99','2005-05-31 01:18:56','2006-02-15 22:24:09'),(16032,599,1,2272,'1.99','2005-06-18 06:29:53','2006-02-15 22:24:09'),(16033,599,2,3043,'6.99','2005-06-20 12:38:35','2006-02-15 22:24:09'),(16034,599,2,3398,'4.99','2005-06-21 15:34:38','2006-02-15 22:24:09'),(16035,599,1,3429,'6.99','2005-06-21 18:46:05','2006-02-15 22:24:09'),(16036,599,1,5065,'0.99','2005-07-09 04:42:00','2006-02-15 22:24:10'),(16037,599,1,5843,'2.99','2005-07-10 17:14:27','2006-02-15 22:24:10'),(16038,599,2,6800,'9.99','2005-07-12 17:03:56','2006-02-15 22:24:10'),(16039,599,2,6895,'2.99','2005-07-12 21:23:59','2006-02-15 22:24:10'),(16040,599,1,8965,'6.99','2005-07-30 03:52:37','2006-02-15 22:24:11'),(16041,599,2,9630,'2.99','2005-07-31 04:57:07','2006-02-15 22:24:11'),(16042,599,2,9679,'2.99','2005-07-31 06:41:19','2006-02-15 22:24:11'),(16043,599,2,11522,'3.99','2005-08-17 00:05:05','2006-02-15 22:24:11'),(16044,599,1,14233,'1.99','2005-08-21 05:07:08','2006-02-15 22:24:12'),(16045,599,1,14599,'4.99','2005-08-21 17:43:42','2006-02-15 22:24:12'),(16046,599,1,14719,'1.99','2005-08-21 21:41:57','2006-02-15 22:24:12'),(16047,599,2,15590,'8.99','2005-08-23 06:09:44','2006-02-15 22:24:12'),(16048,599,2,15719,'2.99','2005-08-23 11:08:46','2006-02-15 22:24:13'),(16049,599,2,15725,'2.99','2005-08-23 11:25:00','2006-02-15 22:24:13'); -COMMIT; - --- --- Trigger to enforce payment_date during INSERT --- - -CREATE TRIGGER payment_date BEFORE INSERT ON payment FOR EACH ROW SET NEW.payment_date = NOW(); - --- --- Dumping data for table rental --- - -SET AUTOCOMMIT=0; -INSERT INTO rental VALUES (1,'2005-05-24 22:53:30',367,130,'2005-05-26 22:04:30',1,'2006-02-15 21:30:53'),(2,'2005-05-24 22:54:33',1525,459,'2005-05-28 19:40:33',1,'2006-02-15 21:30:53'),(3,'2005-05-24 23:03:39',1711,408,'2005-06-01 22:12:39',1,'2006-02-15 21:30:53'),(4,'2005-05-24 23:04:41',2452,333,'2005-06-03 01:43:41',2,'2006-02-15 21:30:53'),(5,'2005-05-24 23:05:21',2079,222,'2005-06-02 04:33:21',1,'2006-02-15 21:30:53'),(6,'2005-05-24 23:08:07',2792,549,'2005-05-27 01:32:07',1,'2006-02-15 21:30:53'),(7,'2005-05-24 23:11:53',3995,269,'2005-05-29 20:34:53',2,'2006-02-15 21:30:53'),(8,'2005-05-24 23:31:46',2346,239,'2005-05-27 23:33:46',2,'2006-02-15 21:30:53'),(9,'2005-05-25 00:00:40',2580,126,'2005-05-28 00:22:40',1,'2006-02-15 21:30:53'),(10,'2005-05-25 00:02:21',1824,399,'2005-05-31 22:44:21',2,'2006-02-15 21:30:53'),(11,'2005-05-25 00:09:02',4443,142,'2005-06-02 20:56:02',2,'2006-02-15 21:30:53'),(12,'2005-05-25 00:19:27',1584,261,'2005-05-30 05:44:27',2,'2006-02-15 21:30:53'),(13,'2005-05-25 00:22:55',2294,334,'2005-05-30 04:28:55',1,'2006-02-15 21:30:53'),(14,'2005-05-25 00:31:15',2701,446,'2005-05-26 02:56:15',1,'2006-02-15 21:30:53'),(15,'2005-05-25 00:39:22',3049,319,'2005-06-03 03:30:22',1,'2006-02-15 21:30:53'),(16,'2005-05-25 00:43:11',389,316,'2005-05-26 04:42:11',2,'2006-02-15 21:30:53'),(17,'2005-05-25 01:06:36',830,575,'2005-05-27 00:43:36',1,'2006-02-15 21:30:53'),(18,'2005-05-25 01:10:47',3376,19,'2005-05-31 06:35:47',2,'2006-02-15 21:30:53'),(19,'2005-05-25 01:17:24',1941,456,'2005-05-31 06:00:24',1,'2006-02-15 21:30:53'),(20,'2005-05-25 01:48:41',3517,185,'2005-05-27 02:20:41',2,'2006-02-15 21:30:53'),(21,'2005-05-25 01:59:46',146,388,'2005-05-26 01:01:46',2,'2006-02-15 21:30:53'),(22,'2005-05-25 02:19:23',727,509,'2005-05-26 04:52:23',2,'2006-02-15 21:30:53'),(23,'2005-05-25 02:40:21',4441,438,'2005-05-29 06:34:21',1,'2006-02-15 21:30:53'),(24,'2005-05-25 02:53:02',3273,350,'2005-05-27 01:15:02',1,'2006-02-15 21:30:53'),(25,'2005-05-25 03:21:20',3961,37,'2005-05-27 21:25:20',2,'2006-02-15 21:30:53'),(26,'2005-05-25 03:36:50',4371,371,'2005-05-31 00:34:50',1,'2006-02-15 21:30:53'),(27,'2005-05-25 03:41:50',1225,301,'2005-05-30 01:13:50',2,'2006-02-15 21:30:53'),(28,'2005-05-25 03:42:37',4068,232,'2005-05-26 09:26:37',2,'2006-02-15 21:30:53'),(29,'2005-05-25 03:47:12',611,44,'2005-05-30 00:31:12',2,'2006-02-15 21:30:53'),(30,'2005-05-25 04:01:32',3744,430,'2005-05-30 03:12:32',1,'2006-02-15 21:30:53'),(31,'2005-05-25 04:05:17',4482,369,'2005-05-30 07:15:17',1,'2006-02-15 21:30:53'),(32,'2005-05-25 04:06:21',3832,230,'2005-05-25 23:55:21',1,'2006-02-15 21:30:53'),(33,'2005-05-25 04:18:51',1681,272,'2005-05-27 03:58:51',1,'2006-02-15 21:30:53'),(34,'2005-05-25 04:19:28',2613,597,'2005-05-29 00:10:28',2,'2006-02-15 21:30:53'),(35,'2005-05-25 04:24:36',1286,484,'2005-05-27 07:02:36',2,'2006-02-15 21:30:53'),(36,'2005-05-25 04:36:26',1308,88,'2005-05-29 00:31:26',1,'2006-02-15 21:30:53'),(37,'2005-05-25 04:44:31',403,535,'2005-05-29 01:03:31',1,'2006-02-15 21:30:53'),(38,'2005-05-25 04:47:44',2540,302,'2005-06-01 00:58:44',1,'2006-02-15 21:30:53'),(39,'2005-05-25 04:51:46',4466,207,'2005-05-31 03:14:46',2,'2006-02-15 21:30:53'),(40,'2005-05-25 05:09:04',2638,413,'2005-05-27 23:12:04',1,'2006-02-15 21:30:53'),(41,'2005-05-25 05:12:29',1761,174,'2005-06-02 00:28:29',1,'2006-02-15 21:30:53'),(42,'2005-05-25 05:24:58',380,523,'2005-05-31 02:47:58',2,'2006-02-15 21:30:53'),(43,'2005-05-25 05:39:25',2578,532,'2005-05-26 06:54:25',2,'2006-02-15 21:30:53'),(44,'2005-05-25 05:53:23',3098,207,'2005-05-29 10:56:23',2,'2006-02-15 21:30:53'),(45,'2005-05-25 05:59:39',1853,436,'2005-06-02 09:56:39',2,'2006-02-15 21:30:53'),(46,'2005-05-25 06:04:08',3318,7,'2005-06-02 08:18:08',2,'2006-02-15 21:30:53'),(47,'2005-05-25 06:05:20',2211,35,'2005-05-30 03:04:20',1,'2006-02-15 21:30:53'),(48,'2005-05-25 06:20:46',1780,282,'2005-06-02 05:42:46',1,'2006-02-15 21:30:53'),(49,'2005-05-25 06:39:35',2965,498,'2005-05-30 10:12:35',2,'2006-02-15 21:30:53'),(50,'2005-05-25 06:44:53',1983,18,'2005-05-28 11:28:53',2,'2006-02-15 21:30:53'),(51,'2005-05-25 06:49:10',1257,256,'2005-05-26 06:42:10',1,'2006-02-15 21:30:53'),(52,'2005-05-25 06:51:29',4017,507,'2005-05-31 01:27:29',2,'2006-02-15 21:30:53'),(53,'2005-05-25 07:19:16',1255,569,'2005-05-27 05:19:16',2,'2006-02-15 21:30:53'),(54,'2005-05-25 07:23:25',2787,291,'2005-06-01 05:05:25',2,'2006-02-15 21:30:53'),(55,'2005-05-25 08:26:13',1139,131,'2005-05-30 10:57:13',1,'2006-02-15 21:30:53'),(56,'2005-05-25 08:28:11',1352,511,'2005-05-26 14:21:11',1,'2006-02-15 21:30:53'),(57,'2005-05-25 08:43:32',3938,6,'2005-05-29 06:42:32',2,'2006-02-15 21:30:53'),(58,'2005-05-25 08:53:14',3050,323,'2005-05-28 14:40:14',1,'2006-02-15 21:30:53'),(59,'2005-05-25 08:56:42',2884,408,'2005-06-01 09:52:42',1,'2006-02-15 21:30:53'),(60,'2005-05-25 08:58:25',330,470,'2005-05-30 14:14:25',1,'2006-02-15 21:30:53'),(61,'2005-05-25 09:01:57',4210,250,'2005-06-02 07:22:57',2,'2006-02-15 21:30:53'),(62,'2005-05-25 09:18:52',261,419,'2005-05-30 10:55:52',1,'2006-02-15 21:30:53'),(63,'2005-05-25 09:19:16',4008,383,'2005-05-27 04:24:16',1,'2006-02-15 21:30:53'),(64,'2005-05-25 09:21:29',79,368,'2005-06-03 11:31:29',1,'2006-02-15 21:30:53'),(65,'2005-05-25 09:32:03',3552,346,'2005-05-29 14:21:03',1,'2006-02-15 21:30:53'),(66,'2005-05-25 09:35:12',1162,86,'2005-05-29 04:16:12',2,'2006-02-15 21:30:53'),(67,'2005-05-25 09:41:01',239,119,'2005-05-27 13:46:01',2,'2006-02-15 21:30:53'),(68,'2005-05-25 09:47:31',4029,120,'2005-05-31 10:20:31',2,'2006-02-15 21:30:53'),(69,'2005-05-25 10:10:14',3207,305,'2005-05-27 14:02:14',2,'2006-02-15 21:30:53'),(70,'2005-05-25 10:15:23',2168,73,'2005-05-27 05:56:23',2,'2006-02-15 21:30:53'),(71,'2005-05-25 10:26:39',2408,100,'2005-05-28 04:59:39',1,'2006-02-15 21:30:53'),(72,'2005-05-25 10:52:13',2260,48,'2005-05-28 05:52:13',2,'2006-02-15 21:30:53'),(73,'2005-05-25 11:00:07',517,391,'2005-06-01 13:56:07',2,'2006-02-15 21:30:53'),(74,'2005-05-25 11:09:48',1744,265,'2005-05-26 12:23:48',2,'2006-02-15 21:30:53'),(75,'2005-05-25 11:13:34',3393,510,'2005-06-03 12:58:34',1,'2006-02-15 21:30:53'),(76,'2005-05-25 11:30:37',3021,1,'2005-06-03 12:00:37',2,'2006-02-15 21:30:53'),(77,'2005-05-25 11:31:59',1303,451,'2005-05-26 16:53:59',2,'2006-02-15 21:30:53'),(78,'2005-05-25 11:35:18',4067,135,'2005-05-31 12:48:18',2,'2006-02-15 21:30:53'),(79,'2005-05-25 12:11:07',3299,245,'2005-06-03 10:54:07',2,'2006-02-15 21:30:53'),(80,'2005-05-25 12:12:07',2478,314,'2005-05-31 17:46:07',2,'2006-02-15 21:30:53'),(81,'2005-05-25 12:15:19',2610,286,'2005-06-02 14:08:19',2,'2006-02-15 21:30:53'),(82,'2005-05-25 12:17:46',1388,427,'2005-06-01 10:48:46',1,'2006-02-15 21:30:53'),(83,'2005-05-25 12:30:15',466,131,'2005-05-27 15:40:15',1,'2006-02-15 21:30:53'),(84,'2005-05-25 12:36:30',1829,492,'2005-05-29 18:33:30',1,'2006-02-15 21:30:53'),(85,'2005-05-25 13:05:34',470,414,'2005-05-29 16:53:34',1,'2006-02-15 21:30:53'),(86,'2005-05-25 13:36:12',2275,266,'2005-05-30 14:53:12',1,'2006-02-15 21:30:53'),(87,'2005-05-25 13:52:43',1586,331,'2005-05-29 11:12:43',2,'2006-02-15 21:30:53'),(88,'2005-05-25 14:13:54',2221,53,'2005-05-29 09:32:54',2,'2006-02-15 21:30:53'),(89,'2005-05-25 14:28:29',2181,499,'2005-05-29 14:33:29',1,'2006-02-15 21:30:53'),(90,'2005-05-25 14:31:25',2984,25,'2005-06-01 10:07:25',1,'2006-02-15 21:30:53'),(91,'2005-05-25 14:57:22',139,267,'2005-06-01 18:32:22',1,'2006-02-15 21:30:53'),(92,'2005-05-25 15:38:46',775,302,'2005-05-31 13:40:46',2,'2006-02-15 21:30:53'),(93,'2005-05-25 15:54:16',4360,288,'2005-06-03 20:18:16',1,'2006-02-15 21:30:53'),(94,'2005-05-25 16:03:42',1675,197,'2005-05-30 14:23:42',1,'2006-02-15 21:30:53'),(95,'2005-05-25 16:12:52',178,400,'2005-06-02 18:55:52',2,'2006-02-15 21:30:53'),(96,'2005-05-25 16:32:19',3418,49,'2005-05-30 10:47:19',2,'2006-02-15 21:30:53'),(97,'2005-05-25 16:34:24',1283,263,'2005-05-28 12:13:24',2,'2006-02-15 21:30:53'),(98,'2005-05-25 16:48:24',2970,269,'2005-05-27 11:29:24',2,'2006-02-15 21:30:53'),(99,'2005-05-25 16:50:20',535,44,'2005-05-28 18:52:20',1,'2006-02-15 21:30:53'),(100,'2005-05-25 16:50:28',2599,208,'2005-06-02 22:11:28',1,'2006-02-15 21:30:53'),(101,'2005-05-25 17:17:04',617,468,'2005-05-31 19:47:04',1,'2006-02-15 21:30:53'),(102,'2005-05-25 17:22:10',373,343,'2005-05-31 19:47:10',1,'2006-02-15 21:30:53'),(103,'2005-05-25 17:30:42',3343,384,'2005-06-03 22:36:42',1,'2006-02-15 21:30:53'),(104,'2005-05-25 17:46:33',4281,310,'2005-05-27 15:20:33',1,'2006-02-15 21:30:53'),(105,'2005-05-25 17:54:12',794,108,'2005-05-30 12:03:12',2,'2006-02-15 21:30:53'),(106,'2005-05-25 18:18:19',3627,196,'2005-06-04 00:01:19',2,'2006-02-15 21:30:53'),(107,'2005-05-25 18:28:09',2833,317,'2005-06-03 22:46:09',2,'2006-02-15 21:30:53'),(108,'2005-05-25 18:30:05',3289,242,'2005-05-30 19:40:05',1,'2006-02-15 21:30:53'),(109,'2005-05-25 18:40:20',1044,503,'2005-05-29 20:39:20',2,'2006-02-15 21:30:53'),(110,'2005-05-25 18:43:49',4108,19,'2005-06-03 18:13:49',2,'2006-02-15 21:30:53'),(111,'2005-05-25 18:45:19',3725,227,'2005-05-28 17:18:19',1,'2006-02-15 21:30:53'),(112,'2005-05-25 18:57:24',2153,500,'2005-06-02 20:44:24',1,'2006-02-15 21:30:53'),(113,'2005-05-25 19:07:40',2963,93,'2005-05-27 22:16:40',2,'2006-02-15 21:30:53'),(114,'2005-05-25 19:12:42',4502,506,'2005-06-01 23:10:42',1,'2006-02-15 21:30:53'),(115,'2005-05-25 19:13:25',749,455,'2005-05-29 20:17:25',1,'2006-02-15 21:30:53'),(116,'2005-05-25 19:27:51',4453,18,'2005-05-26 16:23:51',1,'2006-02-15 21:30:53'),(117,'2005-05-25 19:30:46',4278,7,'2005-05-31 23:59:46',2,'2006-02-15 21:30:53'),(118,'2005-05-25 19:31:18',872,524,'2005-05-31 15:00:18',1,'2006-02-15 21:30:53'),(119,'2005-05-25 19:37:02',1359,51,'2005-05-29 23:51:02',2,'2006-02-15 21:30:53'),(120,'2005-05-25 19:37:47',37,365,'2005-06-01 23:29:47',2,'2006-02-15 21:30:53'),(121,'2005-05-25 19:41:29',1053,405,'2005-05-29 21:31:29',1,'2006-02-15 21:30:53'),(122,'2005-05-25 19:46:21',2908,273,'2005-06-02 19:07:21',1,'2006-02-15 21:30:53'),(123,'2005-05-25 20:26:42',1795,43,'2005-05-26 19:41:42',1,'2006-02-15 21:30:53'),(124,'2005-05-25 20:46:11',212,246,'2005-05-30 00:47:11',2,'2006-02-15 21:30:53'),(125,'2005-05-25 20:48:50',952,368,'2005-06-02 21:39:50',1,'2006-02-15 21:30:53'),(126,'2005-05-25 21:07:59',2047,439,'2005-05-28 18:51:59',1,'2006-02-15 21:30:53'),(127,'2005-05-25 21:10:40',2026,94,'2005-06-02 21:38:40',1,'2006-02-15 21:30:53'),(128,'2005-05-25 21:19:53',4322,40,'2005-05-29 23:34:53',1,'2006-02-15 21:30:53'),(129,'2005-05-25 21:20:03',4154,23,'2005-06-04 01:25:03',2,'2006-02-15 21:30:53'),(130,'2005-05-25 21:21:56',3990,56,'2005-05-30 22:41:56',2,'2006-02-15 21:30:53'),(131,'2005-05-25 21:42:46',815,325,'2005-05-30 23:25:46',2,'2006-02-15 21:30:53'),(132,'2005-05-25 21:46:54',3367,479,'2005-05-31 21:02:54',1,'2006-02-15 21:30:53'),(133,'2005-05-25 21:48:30',399,237,'2005-05-30 00:26:30',2,'2006-02-15 21:30:53'),(134,'2005-05-25 21:48:41',2272,222,'2005-06-02 18:28:41',1,'2006-02-15 21:30:53'),(135,'2005-05-25 21:58:58',103,304,'2005-06-03 17:50:58',1,'2006-02-15 21:30:53'),(136,'2005-05-25 22:02:30',2296,504,'2005-05-31 18:06:30',1,'2006-02-15 21:30:53'),(137,'2005-05-25 22:25:18',2591,560,'2005-06-01 02:30:18',2,'2006-02-15 21:30:53'),(138,'2005-05-25 22:48:22',4134,586,'2005-05-29 20:21:22',2,'2006-02-15 21:30:53'),(139,'2005-05-25 23:00:21',327,257,'2005-05-29 17:12:21',1,'2006-02-15 21:30:53'),(140,'2005-05-25 23:34:22',655,354,'2005-05-27 01:10:22',1,'2006-02-15 21:30:53'),(141,'2005-05-25 23:34:53',811,89,'2005-06-02 01:57:53',1,'2006-02-15 21:30:53'),(142,'2005-05-25 23:43:47',4407,472,'2005-05-29 00:46:47',2,'2006-02-15 21:30:53'),(143,'2005-05-25 23:45:52',847,297,'2005-05-27 21:41:52',2,'2006-02-15 21:30:53'),(144,'2005-05-25 23:49:56',1689,357,'2005-06-01 21:41:56',2,'2006-02-15 21:30:53'),(145,'2005-05-25 23:59:03',3905,82,'2005-05-31 02:56:03',1,'2006-02-15 21:30:53'),(146,'2005-05-26 00:07:11',1431,433,'2005-06-04 00:20:11',2,'2006-02-15 21:30:53'),(147,'2005-05-26 00:17:50',633,274,'2005-05-29 23:21:50',2,'2006-02-15 21:30:53'),(148,'2005-05-26 00:25:23',4252,142,'2005-06-01 19:29:23',2,'2006-02-15 21:30:53'),(149,'2005-05-26 00:28:05',1084,319,'2005-06-02 21:30:05',2,'2006-02-15 21:30:53'),(150,'2005-05-26 00:28:39',909,429,'2005-06-01 02:10:39',2,'2006-02-15 21:30:53'),(151,'2005-05-26 00:37:28',2942,14,'2005-05-30 06:28:28',1,'2006-02-15 21:30:53'),(152,'2005-05-26 00:41:10',2622,57,'2005-06-03 06:05:10',1,'2006-02-15 21:30:53'),(153,'2005-05-26 00:47:47',3888,348,'2005-05-27 21:28:47',1,'2006-02-15 21:30:53'),(154,'2005-05-26 00:55:56',1354,185,'2005-05-29 23:18:56',2,'2006-02-15 21:30:53'),(155,'2005-05-26 01:15:05',288,551,'2005-06-01 00:03:05',1,'2006-02-15 21:30:53'),(156,'2005-05-26 01:19:05',3193,462,'2005-05-27 23:43:05',1,'2006-02-15 21:30:53'),(157,'2005-05-26 01:25:21',887,344,'2005-05-26 21:17:21',2,'2006-02-15 21:30:53'),(158,'2005-05-26 01:27:11',2395,354,'2005-06-03 00:30:11',2,'2006-02-15 21:30:53'),(159,'2005-05-26 01:34:28',3453,505,'2005-05-29 04:00:28',1,'2006-02-15 21:30:53'),(160,'2005-05-26 01:46:20',1885,290,'2005-06-01 05:45:20',1,'2006-02-15 21:30:53'),(161,'2005-05-26 01:51:48',2941,182,'2005-05-27 05:42:48',1,'2006-02-15 21:30:53'),(162,'2005-05-26 02:02:05',1229,296,'2005-05-27 03:38:05',2,'2006-02-15 21:30:53'),(163,'2005-05-26 02:26:23',2306,104,'2005-06-04 06:36:23',1,'2006-02-15 21:30:53'),(164,'2005-05-26 02:26:49',1070,151,'2005-05-28 00:32:49',1,'2006-02-15 21:30:53'),(165,'2005-05-26 02:28:36',2735,33,'2005-06-02 03:21:36',1,'2006-02-15 21:30:53'),(166,'2005-05-26 02:49:11',3894,322,'2005-05-31 01:28:11',1,'2006-02-15 21:30:53'),(167,'2005-05-26 02:50:31',865,401,'2005-05-27 03:07:31',1,'2006-02-15 21:30:53'),(168,'2005-05-26 03:07:43',2714,469,'2005-06-02 02:09:43',2,'2006-02-15 21:30:53'),(169,'2005-05-26 03:09:30',1758,381,'2005-05-27 01:37:30',2,'2006-02-15 21:30:53'),(170,'2005-05-26 03:11:12',3688,107,'2005-06-02 03:53:12',1,'2006-02-15 21:30:53'),(171,'2005-05-26 03:14:15',4483,400,'2005-06-03 00:24:15',2,'2006-02-15 21:30:53'),(172,'2005-05-26 03:17:42',2873,176,'2005-05-29 04:11:42',2,'2006-02-15 21:30:53'),(173,'2005-05-26 03:42:10',3596,533,'2005-05-28 01:37:10',2,'2006-02-15 21:30:53'),(174,'2005-05-26 03:44:10',3954,552,'2005-05-28 07:13:10',2,'2006-02-15 21:30:53'),(175,'2005-05-26 03:46:26',4346,47,'2005-06-03 06:01:26',2,'2006-02-15 21:30:53'),(176,'2005-05-26 03:47:39',851,250,'2005-06-01 02:36:39',2,'2006-02-15 21:30:53'),(177,'2005-05-26 04:14:29',3545,548,'2005-06-01 08:16:29',2,'2006-02-15 21:30:53'),(178,'2005-05-26 04:21:46',1489,196,'2005-06-04 07:09:46',2,'2006-02-15 21:30:53'),(179,'2005-05-26 04:26:06',2575,19,'2005-06-03 10:06:06',1,'2006-02-15 21:30:53'),(180,'2005-05-26 04:46:23',2752,75,'2005-06-01 09:58:23',1,'2006-02-15 21:30:53'),(181,'2005-05-26 04:47:06',2417,587,'2005-05-29 06:34:06',2,'2006-02-15 21:30:53'),(182,'2005-05-26 04:49:17',4396,237,'2005-06-01 05:43:17',2,'2006-02-15 21:30:53'),(183,'2005-05-26 05:01:18',2877,254,'2005-06-01 09:04:18',1,'2006-02-15 21:30:53'),(184,'2005-05-26 05:29:49',1970,556,'2005-05-28 10:10:49',1,'2006-02-15 21:30:53'),(185,'2005-05-26 05:30:03',2598,125,'2005-06-02 09:48:03',2,'2006-02-15 21:30:53'),(186,'2005-05-26 05:32:52',1799,468,'2005-06-03 07:19:52',2,'2006-02-15 21:30:53'),(187,'2005-05-26 05:42:37',4004,515,'2005-06-04 00:38:37',1,'2006-02-15 21:30:53'),(188,'2005-05-26 05:47:12',3342,243,'2005-05-26 23:48:12',1,'2006-02-15 21:30:53'),(189,'2005-05-26 06:01:41',984,247,'2005-05-27 06:11:41',1,'2006-02-15 21:30:53'),(190,'2005-05-26 06:11:28',3962,533,'2005-06-01 09:44:28',1,'2006-02-15 21:30:53'),(191,'2005-05-26 06:14:06',4365,412,'2005-05-28 05:33:06',1,'2006-02-15 21:30:53'),(192,'2005-05-26 06:20:37',1897,437,'2005-06-02 10:57:37',1,'2006-02-15 21:30:53'),(193,'2005-05-26 06:41:48',3900,270,'2005-05-30 06:21:48',2,'2006-02-15 21:30:53'),(194,'2005-05-26 06:52:33',1337,29,'2005-05-30 04:08:33',2,'2006-02-15 21:30:53'),(195,'2005-05-26 06:52:36',506,564,'2005-05-31 02:47:36',2,'2006-02-15 21:30:53'),(196,'2005-05-26 06:55:58',190,184,'2005-05-27 10:54:58',1,'2006-02-15 21:30:53'),(197,'2005-05-26 06:59:21',4212,546,'2005-06-03 05:04:21',2,'2006-02-15 21:30:53'),(198,'2005-05-26 07:03:49',1789,54,'2005-06-04 11:45:49',1,'2006-02-15 21:30:53'),(199,'2005-05-26 07:11:58',2135,71,'2005-05-28 09:06:58',1,'2006-02-15 21:30:53'),(200,'2005-05-26 07:12:21',3926,321,'2005-05-31 12:07:21',1,'2006-02-15 21:30:53'),(201,'2005-05-26 07:13:45',776,444,'2005-06-04 02:02:45',2,'2006-02-15 21:30:53'),(202,'2005-05-26 07:27:36',674,20,'2005-06-02 03:52:36',1,'2006-02-15 21:30:53'),(203,'2005-05-26 07:27:57',3374,109,'2005-06-03 12:52:57',1,'2006-02-15 21:30:53'),(204,'2005-05-26 07:30:37',1842,528,'2005-05-30 08:11:37',1,'2006-02-15 21:30:53'),(205,'2005-05-26 07:59:37',303,114,'2005-05-29 09:43:37',2,'2006-02-15 21:30:53'),(206,'2005-05-26 08:01:54',1717,345,'2005-05-27 06:26:54',1,'2006-02-15 21:30:53'),(207,'2005-05-26 08:04:38',102,47,'2005-05-27 09:32:38',2,'2006-02-15 21:30:53'),(208,'2005-05-26 08:10:22',3669,274,'2005-05-27 03:55:22',1,'2006-02-15 21:30:53'),(209,'2005-05-26 08:14:01',729,379,'2005-05-27 09:00:01',1,'2006-02-15 21:30:53'),(210,'2005-05-26 08:14:15',1801,391,'2005-05-27 12:12:15',2,'2006-02-15 21:30:53'),(211,'2005-05-26 08:33:10',4005,170,'2005-05-28 14:09:10',1,'2006-02-15 21:30:53'),(212,'2005-05-26 08:34:41',764,59,'2005-05-30 12:46:41',2,'2006-02-15 21:30:53'),(213,'2005-05-26 08:44:08',1505,394,'2005-05-31 12:33:08',2,'2006-02-15 21:30:53'),(214,'2005-05-26 08:48:49',1453,98,'2005-05-31 04:06:49',2,'2006-02-15 21:30:53'),(215,'2005-05-26 09:02:47',679,197,'2005-05-28 09:45:47',2,'2006-02-15 21:30:53'),(216,'2005-05-26 09:17:43',1398,91,'2005-06-03 08:21:43',1,'2006-02-15 21:30:53'),(217,'2005-05-26 09:24:26',4395,121,'2005-05-31 03:24:26',2,'2006-02-15 21:30:53'),(218,'2005-05-26 09:27:09',2291,309,'2005-06-04 11:53:09',2,'2006-02-15 21:30:53'),(219,'2005-05-26 09:41:45',3074,489,'2005-05-28 04:40:45',1,'2006-02-15 21:30:53'),(220,'2005-05-26 10:06:49',1259,542,'2005-06-01 07:43:49',1,'2006-02-15 21:30:53'),(221,'2005-05-26 10:14:09',3578,143,'2005-05-29 05:57:09',1,'2006-02-15 21:30:53'),(222,'2005-05-26 10:14:38',2745,83,'2005-05-31 08:36:38',2,'2006-02-15 21:30:53'),(223,'2005-05-26 10:15:23',3121,460,'2005-05-30 11:43:23',1,'2006-02-15 21:30:53'),(224,'2005-05-26 10:18:27',4285,318,'2005-06-04 06:59:27',1,'2006-02-15 21:30:53'),(225,'2005-05-26 10:27:50',651,467,'2005-06-01 07:01:50',2,'2006-02-15 21:30:53'),(226,'2005-05-26 10:44:04',4181,221,'2005-05-31 13:26:04',2,'2006-02-15 21:30:53'),(227,'2005-05-26 10:51:46',214,301,'2005-05-30 07:24:46',1,'2006-02-15 21:30:53'),(228,'2005-05-26 10:54:28',511,571,'2005-06-04 09:39:28',1,'2006-02-15 21:30:53'),(229,'2005-05-26 11:19:20',1131,312,'2005-05-31 11:56:20',2,'2006-02-15 21:30:53'),(230,'2005-05-26 11:31:50',1085,58,'2005-05-30 15:22:50',1,'2006-02-15 21:30:53'),(231,'2005-05-26 11:31:59',4032,365,'2005-05-27 07:27:59',1,'2006-02-15 21:30:53'),(232,'2005-05-26 11:38:05',2945,256,'2005-05-27 08:42:05',2,'2006-02-15 21:30:53'),(233,'2005-05-26 11:43:44',715,531,'2005-05-28 17:28:44',2,'2006-02-15 21:30:53'),(234,'2005-05-26 11:47:20',1321,566,'2005-06-03 10:39:20',2,'2006-02-15 21:30:53'),(235,'2005-05-26 11:51:09',3537,119,'2005-06-04 09:36:09',1,'2006-02-15 21:30:53'),(236,'2005-05-26 11:53:49',1265,446,'2005-05-28 13:55:49',1,'2006-02-15 21:30:53'),(237,'2005-05-26 12:15:13',241,536,'2005-05-29 18:10:13',1,'2006-02-15 21:30:53'),(238,'2005-05-26 12:30:22',503,211,'2005-05-27 06:49:22',1,'2006-02-15 21:30:53'),(239,'2005-05-26 12:30:26',131,49,'2005-06-01 13:26:26',2,'2006-02-15 21:30:53'),(240,'2005-05-26 12:40:23',3420,103,'2005-06-04 07:22:23',1,'2006-02-15 21:30:53'),(241,'2005-05-26 12:49:01',4438,245,'2005-05-28 11:43:01',2,'2006-02-15 21:30:53'),(242,'2005-05-26 13:05:08',2095,214,'2005-06-02 15:26:08',1,'2006-02-15 21:30:53'),(243,'2005-05-26 13:06:05',1721,543,'2005-06-03 17:28:05',2,'2006-02-15 21:30:53'),(244,'2005-05-26 13:40:40',1041,257,'2005-05-31 11:58:40',1,'2006-02-15 21:30:53'),(245,'2005-05-26 13:46:59',3045,158,'2005-05-27 09:58:59',2,'2006-02-15 21:30:53'),(246,'2005-05-26 13:57:07',2829,240,'2005-05-29 10:12:07',2,'2006-02-15 21:30:53'),(247,'2005-05-26 14:01:05',4095,102,'2005-05-28 13:38:05',2,'2006-02-15 21:30:53'),(248,'2005-05-26 14:07:58',1913,545,'2005-05-31 14:03:58',2,'2006-02-15 21:30:53'),(249,'2005-05-26 14:19:09',2428,472,'2005-05-28 17:47:09',2,'2006-02-15 21:30:53'),(250,'2005-05-26 14:30:24',368,539,'2005-05-27 08:50:24',1,'2006-02-15 21:30:53'),(251,'2005-05-26 14:35:40',4352,204,'2005-05-29 17:17:40',1,'2006-02-15 21:30:53'),(252,'2005-05-26 14:39:53',1203,187,'2005-06-02 14:48:53',1,'2006-02-15 21:30:53'),(253,'2005-05-26 14:43:14',2969,416,'2005-05-27 12:21:14',1,'2006-02-15 21:30:53'),(254,'2005-05-26 14:43:48',1835,390,'2005-05-31 09:19:48',2,'2006-02-15 21:30:53'),(255,'2005-05-26 14:52:15',3264,114,'2005-05-27 12:45:15',1,'2006-02-15 21:30:53'),(256,'2005-05-26 15:20:58',3194,436,'2005-05-31 15:58:58',1,'2006-02-15 21:30:53'),(257,'2005-05-26 15:27:05',2570,373,'2005-05-29 16:25:05',2,'2006-02-15 21:30:53'),(258,'2005-05-26 15:28:14',3534,502,'2005-05-30 18:38:14',2,'2006-02-15 21:30:53'),(259,'2005-05-26 15:32:46',30,482,'2005-06-04 15:27:46',2,'2006-02-15 21:30:53'),(260,'2005-05-26 15:42:20',435,21,'2005-05-31 13:21:20',2,'2006-02-15 21:30:53'),(261,'2005-05-26 15:44:23',1369,414,'2005-06-02 09:47:23',2,'2006-02-15 21:30:53'),(262,'2005-05-26 15:46:56',4261,236,'2005-05-28 15:49:56',2,'2006-02-15 21:30:53'),(263,'2005-05-26 15:47:40',1160,449,'2005-05-30 10:07:40',2,'2006-02-15 21:30:53'),(264,'2005-05-26 16:00:49',2069,251,'2005-05-27 10:12:49',2,'2006-02-15 21:30:53'),(265,'2005-05-26 16:07:38',2276,303,'2005-06-01 14:20:38',1,'2006-02-15 21:30:53'),(266,'2005-05-26 16:08:05',3303,263,'2005-05-27 10:55:05',2,'2006-02-15 21:30:53'),(267,'2005-05-26 16:16:21',1206,417,'2005-05-30 16:53:21',2,'2006-02-15 21:30:53'),(268,'2005-05-26 16:19:08',1714,75,'2005-05-27 14:35:08',1,'2006-02-15 21:30:53'),(269,'2005-05-26 16:19:46',3501,322,'2005-05-27 15:59:46',2,'2006-02-15 21:30:53'),(270,'2005-05-26 16:20:56',207,200,'2005-06-03 12:40:56',2,'2006-02-15 21:30:53'),(271,'2005-05-26 16:22:01',2388,92,'2005-06-03 17:30:01',2,'2006-02-15 21:30:53'),(272,'2005-05-26 16:27:11',971,71,'2005-06-03 13:10:11',2,'2006-02-15 21:30:53'),(273,'2005-05-26 16:29:36',1590,193,'2005-05-29 18:49:36',2,'2006-02-15 21:30:53'),(274,'2005-05-26 16:48:51',656,311,'2005-06-03 18:17:51',1,'2006-02-15 21:30:53'),(275,'2005-05-26 17:09:53',1718,133,'2005-06-04 22:35:53',1,'2006-02-15 21:30:53'),(276,'2005-05-26 17:16:07',1221,58,'2005-06-03 12:59:07',1,'2006-02-15 21:30:53'),(277,'2005-05-26 17:32:11',1409,45,'2005-05-28 22:54:11',1,'2006-02-15 21:30:53'),(278,'2005-05-26 17:40:58',182,214,'2005-06-02 16:43:58',2,'2006-02-15 21:30:53'),(279,'2005-05-26 18:02:50',661,384,'2005-06-03 18:48:50',2,'2006-02-15 21:30:53'),(280,'2005-05-26 18:36:58',1896,167,'2005-05-27 23:42:58',1,'2006-02-15 21:30:53'),(281,'2005-05-26 18:49:35',1208,582,'2005-05-27 18:11:35',2,'2006-02-15 21:30:53'),(282,'2005-05-26 18:56:26',4486,282,'2005-06-01 16:32:26',2,'2006-02-15 21:30:53'),(283,'2005-05-26 19:05:05',3530,242,'2005-05-31 19:19:05',1,'2006-02-15 21:30:53'),(284,'2005-05-26 19:21:44',350,359,'2005-06-04 14:18:44',2,'2006-02-15 21:30:53'),(285,'2005-05-26 19:41:40',2486,162,'2005-05-31 16:58:40',2,'2006-02-15 21:30:53'),(286,'2005-05-26 19:44:51',314,371,'2005-06-04 18:00:51',2,'2006-02-15 21:30:53'),(287,'2005-05-26 19:44:54',3631,17,'2005-06-02 01:10:54',1,'2006-02-15 21:30:53'),(288,'2005-05-26 19:47:49',3546,82,'2005-06-03 20:53:49',2,'2006-02-15 21:30:53'),(289,'2005-05-26 20:01:09',2449,81,'2005-05-28 15:09:09',1,'2006-02-15 21:30:53'),(290,'2005-05-26 20:08:33',2776,429,'2005-05-30 00:32:33',1,'2006-02-15 21:30:53'),(291,'2005-05-26 20:20:47',485,577,'2005-06-03 02:06:47',2,'2006-02-15 21:30:53'),(292,'2005-05-26 20:22:12',4264,515,'2005-06-05 00:58:12',1,'2006-02-15 21:30:53'),(293,'2005-05-26 20:27:02',1828,158,'2005-06-03 16:45:02',2,'2006-02-15 21:30:53'),(294,'2005-05-26 20:29:57',2751,369,'2005-05-28 17:20:57',1,'2006-02-15 21:30:53'),(295,'2005-05-26 20:33:20',4030,65,'2005-05-27 18:23:20',2,'2006-02-15 21:30:53'),(296,'2005-05-26 20:35:19',3878,468,'2005-06-04 02:31:19',2,'2006-02-15 21:30:53'),(297,'2005-05-26 20:48:48',1594,48,'2005-05-27 19:52:48',2,'2006-02-15 21:30:53'),(298,'2005-05-26 20:52:26',1083,460,'2005-05-29 22:08:26',2,'2006-02-15 21:30:53'),(299,'2005-05-26 20:55:36',4376,448,'2005-05-28 00:25:36',2,'2006-02-15 21:30:53'),(300,'2005-05-26 20:57:00',249,47,'2005-06-05 01:34:00',2,'2006-02-15 21:30:53'),(301,'2005-05-26 21:06:14',3448,274,'2005-06-01 01:54:14',2,'2006-02-15 21:30:53'),(302,'2005-05-26 21:13:46',2921,387,'2005-06-03 15:49:46',2,'2006-02-15 21:30:53'),(303,'2005-05-26 21:16:52',1111,596,'2005-05-27 23:41:52',2,'2006-02-15 21:30:53'),(304,'2005-05-26 21:21:28',1701,534,'2005-06-02 00:05:28',1,'2006-02-15 21:30:53'),(305,'2005-05-26 21:22:07',2665,464,'2005-06-02 22:33:07',2,'2006-02-15 21:30:53'),(306,'2005-05-26 21:31:57',2781,547,'2005-05-28 19:37:57',1,'2006-02-15 21:30:53'),(307,'2005-05-26 21:48:13',1097,375,'2005-06-04 22:24:13',1,'2006-02-15 21:30:53'),(308,'2005-05-26 22:01:39',187,277,'2005-06-04 20:24:39',2,'2006-02-15 21:30:53'),(309,'2005-05-26 22:38:10',1946,251,'2005-06-02 03:10:10',2,'2006-02-15 21:30:53'),(310,'2005-05-26 22:41:07',593,409,'2005-06-02 04:09:07',1,'2006-02-15 21:30:53'),(311,'2005-05-26 22:51:37',2830,201,'2005-06-01 00:02:37',1,'2006-02-15 21:30:53'),(312,'2005-05-26 22:52:19',2008,143,'2005-06-02 18:14:19',2,'2006-02-15 21:30:53'),(313,'2005-05-26 22:56:19',4156,594,'2005-05-29 01:29:19',2,'2006-02-15 21:30:53'),(314,'2005-05-26 23:09:41',2851,203,'2005-05-28 22:49:41',2,'2006-02-15 21:30:53'),(315,'2005-05-26 23:12:55',2847,238,'2005-05-29 23:33:55',1,'2006-02-15 21:30:53'),(316,'2005-05-26 23:22:55',3828,249,'2005-05-29 23:25:55',2,'2006-02-15 21:30:53'),(317,'2005-05-26 23:23:56',26,391,'2005-06-01 19:56:56',2,'2006-02-15 21:30:53'),(318,'2005-05-26 23:37:39',2559,60,'2005-06-03 04:31:39',2,'2006-02-15 21:30:53'),(319,'2005-05-26 23:52:13',3024,77,'2005-05-30 18:55:13',1,'2006-02-15 21:30:53'),(320,'2005-05-27 00:09:24',1090,2,'2005-05-28 04:30:24',2,'2006-02-15 21:30:53'),(322,'2005-05-27 00:47:35',4556,496,'2005-06-02 00:32:35',1,'2006-02-15 21:30:53'),(323,'2005-05-27 00:49:27',2362,144,'2005-05-30 03:12:27',1,'2006-02-15 21:30:53'),(324,'2005-05-27 01:00:04',3364,292,'2005-05-30 04:27:04',1,'2006-02-15 21:30:53'),(325,'2005-05-27 01:09:55',2510,449,'2005-05-31 07:01:55',2,'2006-02-15 21:30:53'),(326,'2005-05-27 01:10:11',3979,432,'2005-06-04 20:25:11',2,'2006-02-15 21:30:53'),(327,'2005-05-27 01:18:57',2678,105,'2005-06-04 04:06:57',1,'2006-02-15 21:30:53'),(328,'2005-05-27 01:29:31',2524,451,'2005-06-01 02:27:31',1,'2006-02-15 21:30:53'),(329,'2005-05-27 01:57:14',2659,231,'2005-05-31 04:19:14',2,'2006-02-15 21:30:53'),(330,'2005-05-27 02:15:30',1536,248,'2005-06-04 05:09:30',2,'2006-02-15 21:30:53'),(331,'2005-05-27 02:22:26',1872,67,'2005-06-05 00:25:26',1,'2006-02-15 21:30:53'),(332,'2005-05-27 02:27:10',1529,299,'2005-06-03 01:26:10',2,'2006-02-15 21:30:53'),(333,'2005-05-27 02:52:21',4001,412,'2005-06-01 00:55:21',2,'2006-02-15 21:30:53'),(334,'2005-05-27 03:03:07',3973,194,'2005-05-29 03:54:07',1,'2006-02-15 21:30:53'),(335,'2005-05-27 03:07:10',1411,16,'2005-06-05 00:15:10',2,'2006-02-15 21:30:53'),(336,'2005-05-27 03:15:23',1811,275,'2005-05-29 22:43:23',1,'2006-02-15 21:30:53'),(337,'2005-05-27 03:22:30',751,19,'2005-06-02 03:27:30',1,'2006-02-15 21:30:53'),(338,'2005-05-27 03:42:52',2596,165,'2005-06-01 05:23:52',2,'2006-02-15 21:30:53'),(339,'2005-05-27 03:47:18',2410,516,'2005-06-04 05:46:18',2,'2006-02-15 21:30:53'),(340,'2005-05-27 03:55:25',946,209,'2005-06-04 07:57:25',2,'2006-02-15 21:30:53'),(341,'2005-05-27 04:01:42',4168,56,'2005-06-05 08:51:42',1,'2006-02-15 21:30:53'),(342,'2005-05-27 04:11:04',4019,539,'2005-05-29 01:28:04',2,'2006-02-15 21:30:53'),(343,'2005-05-27 04:13:41',3301,455,'2005-05-28 08:34:41',1,'2006-02-15 21:30:53'),(344,'2005-05-27 04:30:22',2327,236,'2005-05-29 10:13:22',2,'2006-02-15 21:30:53'),(345,'2005-05-27 04:32:25',1396,144,'2005-05-31 09:50:25',1,'2006-02-15 21:30:53'),(346,'2005-05-27 04:34:41',4319,14,'2005-06-05 04:24:41',2,'2006-02-15 21:30:53'),(347,'2005-05-27 04:40:33',1625,378,'2005-05-28 09:56:33',2,'2006-02-15 21:30:53'),(348,'2005-05-27 04:50:56',1825,473,'2005-06-01 04:43:56',1,'2006-02-15 21:30:53'),(349,'2005-05-27 04:53:11',2920,36,'2005-05-28 06:33:11',2,'2006-02-15 21:30:53'),(350,'2005-05-27 05:01:28',2756,9,'2005-06-04 05:01:28',2,'2006-02-15 21:30:53'),(351,'2005-05-27 05:39:03',3371,118,'2005-06-01 11:10:03',1,'2006-02-15 21:30:53'),(352,'2005-05-27 05:48:19',4369,157,'2005-05-29 09:05:19',1,'2006-02-15 21:30:53'),(353,'2005-05-27 06:03:39',3989,503,'2005-06-03 04:39:39',2,'2006-02-15 21:30:53'),(354,'2005-05-27 06:12:26',2058,452,'2005-06-01 06:48:26',1,'2006-02-15 21:30:53'),(355,'2005-05-27 06:15:33',141,446,'2005-06-01 02:50:33',2,'2006-02-15 21:30:53'),(356,'2005-05-27 06:32:30',2868,382,'2005-05-30 06:24:30',2,'2006-02-15 21:30:53'),(357,'2005-05-27 06:37:15',4417,198,'2005-05-30 07:04:15',2,'2006-02-15 21:30:53'),(358,'2005-05-27 06:43:59',1925,102,'2005-05-29 11:28:59',2,'2006-02-15 21:30:53'),(359,'2005-05-27 06:48:33',1156,152,'2005-05-29 03:55:33',1,'2006-02-15 21:30:53'),(360,'2005-05-27 06:51:14',3489,594,'2005-06-03 01:58:14',1,'2006-02-15 21:30:53'),(361,'2005-05-27 07:03:28',6,587,'2005-05-31 08:01:28',1,'2006-02-15 21:30:53'),(362,'2005-05-27 07:10:25',2324,147,'2005-06-01 08:34:25',1,'2006-02-15 21:30:53'),(363,'2005-05-27 07:14:00',4282,345,'2005-05-28 12:22:00',2,'2006-02-15 21:30:53'),(364,'2005-05-27 07:20:12',833,430,'2005-05-31 10:44:12',2,'2006-02-15 21:30:53'),(365,'2005-05-27 07:31:20',2887,167,'2005-06-04 04:46:20',1,'2006-02-15 21:30:53'),(366,'2005-05-27 07:33:54',360,134,'2005-06-04 01:55:54',2,'2006-02-15 21:30:53'),(367,'2005-05-27 07:37:02',3437,439,'2005-05-30 05:43:02',2,'2006-02-15 21:30:53'),(368,'2005-05-27 07:42:29',1247,361,'2005-06-04 11:20:29',2,'2006-02-15 21:30:53'),(369,'2005-05-27 07:46:49',944,508,'2005-06-01 06:20:49',2,'2006-02-15 21:30:53'),(370,'2005-05-27 07:49:43',3347,22,'2005-06-05 06:39:43',2,'2006-02-15 21:30:53'),(371,'2005-05-27 08:08:18',1235,295,'2005-06-05 03:05:18',2,'2006-02-15 21:30:53'),(372,'2005-05-27 08:13:58',4089,510,'2005-06-04 03:50:58',2,'2006-02-15 21:30:53'),(373,'2005-05-27 08:16:25',1649,464,'2005-06-01 11:41:25',1,'2006-02-15 21:30:53'),(374,'2005-05-27 08:26:30',4420,337,'2005-06-05 07:13:30',1,'2006-02-15 21:30:53'),(375,'2005-05-27 08:49:21',1815,306,'2005-06-04 14:11:21',1,'2006-02-15 21:30:53'),(376,'2005-05-27 08:58:15',3197,542,'2005-06-02 04:48:15',1,'2006-02-15 21:30:53'),(377,'2005-05-27 09:04:05',3012,170,'2005-06-02 03:36:05',2,'2006-02-15 21:30:53'),(378,'2005-05-27 09:23:22',2242,53,'2005-05-29 15:20:22',1,'2006-02-15 21:30:53'),(379,'2005-05-27 09:25:32',3462,584,'2005-06-02 06:19:32',1,'2006-02-15 21:30:53'),(380,'2005-05-27 09:34:39',1777,176,'2005-06-04 11:45:39',1,'2006-02-15 21:30:53'),(381,'2005-05-27 09:43:25',2748,371,'2005-05-31 12:00:25',1,'2006-02-15 21:30:53'),(382,'2005-05-27 10:12:00',4358,183,'2005-05-31 15:03:00',1,'2006-02-15 21:30:53'),(383,'2005-05-27 10:12:20',955,298,'2005-06-03 10:37:20',1,'2006-02-15 21:30:53'),(384,'2005-05-27 10:18:20',910,371,'2005-06-02 09:21:20',2,'2006-02-15 21:30:53'),(385,'2005-05-27 10:23:25',1565,213,'2005-05-30 15:27:25',2,'2006-02-15 21:30:53'),(386,'2005-05-27 10:26:31',1288,109,'2005-05-30 08:32:31',1,'2006-02-15 21:30:53'),(387,'2005-05-27 10:35:27',2684,506,'2005-06-01 13:37:27',2,'2006-02-15 21:30:53'),(388,'2005-05-27 10:37:27',434,28,'2005-05-30 05:45:27',1,'2006-02-15 21:30:53'),(389,'2005-05-27 10:45:41',691,500,'2005-06-05 06:22:41',2,'2006-02-15 21:30:53'),(390,'2005-05-27 11:02:26',3759,48,'2005-06-02 16:09:26',2,'2006-02-15 21:30:53'),(391,'2005-05-27 11:03:55',2193,197,'2005-06-01 11:59:55',2,'2006-02-15 21:30:53'),(392,'2005-05-27 11:14:42',263,359,'2005-06-01 14:28:42',2,'2006-02-15 21:30:53'),(393,'2005-05-27 11:18:25',145,251,'2005-05-28 07:10:25',2,'2006-02-15 21:30:53'),(394,'2005-05-27 11:26:11',1890,274,'2005-06-03 16:44:11',2,'2006-02-15 21:30:53'),(395,'2005-05-27 11:45:49',752,575,'2005-05-31 13:42:49',1,'2006-02-15 21:30:53'),(396,'2005-05-27 11:47:04',1020,112,'2005-05-29 10:14:04',1,'2006-02-15 21:30:53'),(397,'2005-05-27 12:29:02',4193,544,'2005-05-28 17:36:02',2,'2006-02-15 21:30:53'),(398,'2005-05-27 12:44:03',1686,422,'2005-06-02 08:19:03',1,'2006-02-15 21:30:53'),(399,'2005-05-27 12:48:38',553,204,'2005-05-29 15:27:38',1,'2006-02-15 21:30:53'),(400,'2005-05-27 12:51:44',258,249,'2005-05-31 08:34:44',2,'2006-02-15 21:30:53'),(401,'2005-05-27 12:57:55',2179,46,'2005-05-29 17:55:55',2,'2006-02-15 21:30:53'),(402,'2005-05-27 13:17:18',461,354,'2005-05-30 08:53:18',2,'2006-02-15 21:30:53'),(403,'2005-05-27 13:28:52',3983,424,'2005-05-29 11:47:52',2,'2006-02-15 21:30:53'),(404,'2005-05-27 13:31:51',1293,168,'2005-05-30 16:58:51',1,'2006-02-15 21:30:53'),(405,'2005-05-27 13:32:39',4090,272,'2005-06-05 18:53:39',2,'2006-02-15 21:30:53'),(406,'2005-05-27 13:46:46',2136,381,'2005-05-30 12:43:46',1,'2006-02-15 21:30:53'),(407,'2005-05-27 13:57:38',1077,44,'2005-05-31 18:23:38',1,'2006-02-15 21:30:53'),(408,'2005-05-27 13:57:39',1438,84,'2005-05-28 11:57:39',1,'2006-02-15 21:30:53'),(409,'2005-05-27 14:10:58',3652,220,'2005-06-02 10:40:58',2,'2006-02-15 21:30:53'),(410,'2005-05-27 14:11:22',4010,506,'2005-06-02 20:06:22',2,'2006-02-15 21:30:53'),(411,'2005-05-27 14:14:14',1434,388,'2005-06-03 17:39:14',1,'2006-02-15 21:30:53'),(412,'2005-05-27 14:17:23',1400,375,'2005-05-29 15:07:23',2,'2006-02-15 21:30:53'),(413,'2005-05-27 14:45:37',3516,307,'2005-06-03 11:11:37',1,'2006-02-15 21:30:53'),(414,'2005-05-27 14:48:20',1019,219,'2005-05-31 14:39:20',2,'2006-02-15 21:30:53'),(415,'2005-05-27 14:51:45',3698,304,'2005-05-28 19:07:45',2,'2006-02-15 21:30:53'),(416,'2005-05-27 15:02:10',2371,222,'2005-05-29 10:34:10',2,'2006-02-15 21:30:53'),(417,'2005-05-27 15:07:27',2253,475,'2005-05-29 20:01:27',2,'2006-02-15 21:30:53'),(418,'2005-05-27 15:13:17',3063,151,'2005-06-04 12:05:17',2,'2006-02-15 21:30:53'),(419,'2005-05-27 15:15:11',2514,77,'2005-06-02 11:53:11',1,'2006-02-15 21:30:53'),(420,'2005-05-27 15:19:38',619,93,'2005-06-03 15:07:38',2,'2006-02-15 21:30:53'),(421,'2005-05-27 15:30:13',2985,246,'2005-06-04 13:19:13',2,'2006-02-15 21:30:53'),(422,'2005-05-27 15:31:55',1152,150,'2005-06-01 11:47:55',2,'2006-02-15 21:30:53'),(423,'2005-05-27 15:32:57',1783,284,'2005-06-02 19:03:57',1,'2006-02-15 21:30:53'),(424,'2005-05-27 15:34:01',2815,35,'2005-06-05 09:44:01',1,'2006-02-15 21:30:53'),(425,'2005-05-27 15:51:30',1518,182,'2005-06-03 16:52:30',2,'2006-02-15 21:30:53'),(426,'2005-05-27 15:56:57',1103,522,'2005-06-05 11:45:57',1,'2006-02-15 21:30:53'),(427,'2005-05-27 16:10:04',1677,288,'2005-06-05 13:22:04',2,'2006-02-15 21:30:53'),(428,'2005-05-27 16:10:58',3349,161,'2005-05-31 17:24:58',2,'2006-02-15 21:30:53'),(429,'2005-05-27 16:21:26',129,498,'2005-06-05 20:23:26',2,'2006-02-15 21:30:53'),(430,'2005-05-27 16:22:10',1920,190,'2005-06-05 13:10:10',1,'2006-02-15 21:30:53'),(431,'2005-05-27 16:31:05',4507,334,'2005-06-05 11:29:05',1,'2006-02-15 21:30:53'),(432,'2005-05-27 16:40:29',1119,46,'2005-05-29 16:20:29',1,'2006-02-15 21:30:53'),(433,'2005-05-27 16:40:40',4364,574,'2005-05-30 19:55:40',2,'2006-02-15 21:30:53'),(434,'2005-05-27 16:54:27',3360,246,'2005-06-04 22:26:27',1,'2006-02-15 21:30:53'),(435,'2005-05-27 17:17:09',3328,3,'2005-06-02 11:20:09',2,'2006-02-15 21:30:53'),(436,'2005-05-27 17:21:04',4317,267,'2005-05-30 21:26:04',2,'2006-02-15 21:30:53'),(437,'2005-05-27 17:47:22',1800,525,'2005-06-05 14:22:22',2,'2006-02-15 21:30:53'),(438,'2005-05-27 17:52:34',4260,249,'2005-06-05 22:23:34',2,'2006-02-15 21:30:53'),(439,'2005-05-27 17:54:48',354,319,'2005-06-02 23:01:48',2,'2006-02-15 21:30:53'),(440,'2005-05-27 18:00:35',4452,314,'2005-05-29 16:15:35',1,'2006-02-15 21:30:53'),(441,'2005-05-27 18:11:05',1578,54,'2005-05-30 22:45:05',1,'2006-02-15 21:30:53'),(442,'2005-05-27 18:12:13',1457,403,'2005-05-30 12:30:13',2,'2006-02-15 21:30:53'),(443,'2005-05-27 18:35:20',2021,547,'2005-06-04 18:58:20',1,'2006-02-15 21:30:53'),(444,'2005-05-27 18:39:15',723,239,'2005-06-01 15:56:15',1,'2006-02-15 21:30:53'),(445,'2005-05-27 18:42:57',1757,293,'2005-05-30 22:35:57',2,'2006-02-15 21:30:53'),(446,'2005-05-27 18:48:41',1955,401,'2005-06-03 16:42:41',2,'2006-02-15 21:30:53'),(447,'2005-05-27 18:57:02',3890,133,'2005-06-05 18:38:02',1,'2006-02-15 21:30:53'),(448,'2005-05-27 19:03:08',2671,247,'2005-06-03 20:28:08',2,'2006-02-15 21:30:53'),(449,'2005-05-27 19:13:15',2469,172,'2005-06-04 01:08:15',2,'2006-02-15 21:30:53'),(450,'2005-05-27 19:18:54',1343,247,'2005-06-05 23:52:54',1,'2006-02-15 21:30:53'),(451,'2005-05-27 19:27:54',205,87,'2005-05-29 01:07:54',2,'2006-02-15 21:30:53'),(452,'2005-05-27 19:30:33',2993,127,'2005-05-30 20:53:33',2,'2006-02-15 21:30:53'),(453,'2005-05-27 19:31:16',4425,529,'2005-05-29 23:06:16',1,'2006-02-15 21:30:53'),(454,'2005-05-27 19:31:36',3499,575,'2005-05-30 15:46:36',1,'2006-02-15 21:30:53'),(455,'2005-05-27 19:43:29',3344,343,'2005-06-04 23:40:29',2,'2006-02-15 21:30:53'),(456,'2005-05-27 19:50:06',1699,92,'2005-06-02 22:14:06',1,'2006-02-15 21:30:53'),(457,'2005-05-27 19:52:29',2368,300,'2005-06-02 17:17:29',2,'2006-02-15 21:30:53'),(458,'2005-05-27 19:58:36',3350,565,'2005-06-06 00:51:36',1,'2006-02-15 21:30:53'),(459,'2005-05-27 20:00:04',597,468,'2005-05-29 22:47:04',1,'2006-02-15 21:30:53'),(460,'2005-05-27 20:02:03',4238,240,'2005-05-28 16:14:03',1,'2006-02-15 21:30:53'),(461,'2005-05-27 20:08:55',2077,447,'2005-06-01 14:32:55',1,'2006-02-15 21:30:53'),(462,'2005-05-27 20:10:36',2314,364,'2005-06-03 21:12:36',2,'2006-02-15 21:30:53'),(463,'2005-05-27 20:11:47',826,21,'2005-06-04 21:18:47',1,'2006-02-15 21:30:53'),(464,'2005-05-27 20:42:44',1313,193,'2005-05-30 00:49:44',2,'2006-02-15 21:30:53'),(465,'2005-05-27 20:44:36',20,261,'2005-06-02 02:43:36',1,'2006-02-15 21:30:53'),(466,'2005-05-27 20:57:07',1786,442,'2005-05-29 15:52:07',1,'2006-02-15 21:30:53'),(467,'2005-05-27 21:10:03',339,557,'2005-06-01 16:08:03',1,'2006-02-15 21:30:53'),(468,'2005-05-27 21:13:10',2656,101,'2005-06-04 15:26:10',2,'2006-02-15 21:30:53'),(469,'2005-05-27 21:14:26',4463,154,'2005-06-05 21:51:26',1,'2006-02-15 21:30:53'),(470,'2005-05-27 21:17:08',1613,504,'2005-06-04 17:47:08',1,'2006-02-15 21:30:53'),(471,'2005-05-27 21:32:42',2872,209,'2005-05-31 00:39:42',2,'2006-02-15 21:30:53'),(472,'2005-05-27 21:36:15',1338,528,'2005-05-29 21:07:15',1,'2006-02-15 21:30:53'),(473,'2005-05-27 21:36:34',802,105,'2005-06-05 17:02:34',1,'2006-02-15 21:30:53'),(474,'2005-05-27 22:11:56',1474,274,'2005-05-31 19:07:56',1,'2006-02-15 21:30:53'),(475,'2005-05-27 22:16:26',2520,159,'2005-05-28 19:58:26',1,'2006-02-15 21:30:53'),(476,'2005-05-27 22:31:36',2451,543,'2005-06-03 19:12:36',1,'2006-02-15 21:30:53'),(477,'2005-05-27 22:33:33',2437,161,'2005-06-02 18:35:33',2,'2006-02-15 21:30:53'),(478,'2005-05-27 22:38:20',424,557,'2005-05-31 18:39:20',2,'2006-02-15 21:30:53'),(479,'2005-05-27 22:39:10',2060,231,'2005-06-05 22:46:10',2,'2006-02-15 21:30:53'),(480,'2005-05-27 22:47:39',2108,220,'2005-06-04 21:17:39',2,'2006-02-15 21:30:53'),(481,'2005-05-27 22:49:27',72,445,'2005-05-30 17:46:27',2,'2006-02-15 21:30:53'),(482,'2005-05-27 22:53:02',4178,546,'2005-06-01 22:53:02',2,'2006-02-15 21:30:53'),(483,'2005-05-27 23:00:25',1510,32,'2005-05-28 21:30:25',1,'2006-02-15 21:30:53'),(484,'2005-05-27 23:26:45',3115,491,'2005-05-29 21:16:45',2,'2006-02-15 21:30:53'),(485,'2005-05-27 23:40:52',2392,105,'2005-05-28 22:40:52',2,'2006-02-15 21:30:53'),(486,'2005-05-27 23:51:12',1822,398,'2005-05-28 20:26:12',1,'2006-02-15 21:30:53'),(487,'2005-05-28 00:00:30',3774,569,'2005-05-28 19:18:30',2,'2006-02-15 21:30:53'),(488,'2005-05-28 00:07:50',393,168,'2005-06-03 22:30:50',2,'2006-02-15 21:30:53'),(489,'2005-05-28 00:09:12',1940,476,'2005-05-31 04:44:12',2,'2006-02-15 21:30:53'),(490,'2005-05-28 00:09:56',3524,95,'2005-05-30 22:32:56',2,'2006-02-15 21:30:53'),(491,'2005-05-28 00:13:35',1326,196,'2005-05-29 00:11:35',2,'2006-02-15 21:30:53'),(492,'2005-05-28 00:24:58',1999,228,'2005-05-28 22:34:58',1,'2006-02-15 21:30:53'),(493,'2005-05-28 00:34:11',184,501,'2005-05-30 18:40:11',1,'2006-02-15 21:30:53'),(494,'2005-05-28 00:39:31',1850,64,'2005-06-02 19:35:31',1,'2006-02-15 21:30:53'),(495,'2005-05-28 00:40:48',1007,526,'2005-05-29 06:07:48',1,'2006-02-15 21:30:53'),(496,'2005-05-28 00:43:41',1785,56,'2005-06-04 03:56:41',1,'2006-02-15 21:30:53'),(497,'2005-05-28 00:54:39',2636,20,'2005-06-03 20:47:39',2,'2006-02-15 21:30:53'),(498,'2005-05-28 01:01:21',458,287,'2005-05-30 21:20:21',2,'2006-02-15 21:30:53'),(499,'2005-05-28 01:05:07',2381,199,'2005-06-05 19:54:07',2,'2006-02-15 21:30:53'),(500,'2005-05-28 01:05:25',4500,145,'2005-05-31 20:04:25',1,'2006-02-15 21:30:53'),(501,'2005-05-28 01:09:36',601,162,'2005-05-30 06:14:36',2,'2006-02-15 21:30:53'),(502,'2005-05-28 01:34:43',3131,179,'2005-05-31 01:02:43',2,'2006-02-15 21:30:53'),(503,'2005-05-28 01:35:25',3005,288,'2005-05-28 22:12:25',2,'2006-02-15 21:30:53'),(504,'2005-05-28 02:05:34',2086,170,'2005-05-30 23:03:34',1,'2006-02-15 21:30:53'),(505,'2005-05-28 02:06:37',71,111,'2005-05-29 06:57:37',1,'2006-02-15 21:30:53'),(506,'2005-05-28 02:09:19',667,469,'2005-06-05 20:34:19',1,'2006-02-15 21:30:53'),(507,'2005-05-28 02:31:19',3621,421,'2005-06-02 05:07:19',2,'2006-02-15 21:30:53'),(508,'2005-05-28 02:40:50',4179,434,'2005-06-05 03:05:50',1,'2006-02-15 21:30:53'),(509,'2005-05-28 02:51:12',3416,147,'2005-05-31 06:27:12',1,'2006-02-15 21:30:53'),(510,'2005-05-28 02:52:14',4338,113,'2005-05-30 21:20:14',2,'2006-02-15 21:30:53'),(511,'2005-05-28 03:04:04',3827,296,'2005-06-03 04:58:04',1,'2006-02-15 21:30:53'),(512,'2005-05-28 03:07:50',2176,231,'2005-06-05 02:12:50',2,'2006-02-15 21:30:53'),(513,'2005-05-28 03:08:10',225,489,'2005-05-29 07:22:10',1,'2006-02-15 21:30:53'),(514,'2005-05-28 03:09:28',1697,597,'2005-06-05 00:49:28',2,'2006-02-15 21:30:53'),(515,'2005-05-28 03:10:10',3369,110,'2005-06-04 02:18:10',2,'2006-02-15 21:30:53'),(516,'2005-05-28 03:11:47',4357,400,'2005-06-04 02:19:47',1,'2006-02-15 21:30:53'),(517,'2005-05-28 03:17:57',234,403,'2005-05-29 06:33:57',1,'2006-02-15 21:30:53'),(518,'2005-05-28 03:18:02',4087,480,'2005-05-30 05:32:02',1,'2006-02-15 21:30:53'),(519,'2005-05-28 03:22:33',3564,245,'2005-06-03 05:06:33',1,'2006-02-15 21:30:53'),(520,'2005-05-28 03:27:37',3845,161,'2005-06-04 05:47:37',1,'2006-02-15 21:30:53'),(521,'2005-05-28 03:32:22',2397,374,'2005-05-28 22:37:22',1,'2006-02-15 21:30:53'),(522,'2005-05-28 03:33:20',3195,382,'2005-05-31 04:23:20',1,'2006-02-15 21:30:53'),(523,'2005-05-28 03:53:26',1905,138,'2005-05-31 05:58:26',2,'2006-02-15 21:30:53'),(524,'2005-05-28 03:57:28',1962,223,'2005-05-31 05:20:28',1,'2006-02-15 21:30:53'),(525,'2005-05-28 04:25:33',1817,14,'2005-06-06 04:18:33',1,'2006-02-15 21:30:53'),(526,'2005-05-28 04:27:37',1387,408,'2005-05-30 07:52:37',1,'2006-02-15 21:30:53'),(527,'2005-05-28 04:28:38',266,169,'2005-06-02 08:19:38',1,'2006-02-15 21:30:53'),(528,'2005-05-28 04:30:05',1655,359,'2005-06-03 10:01:05',2,'2006-02-15 21:30:53'),(529,'2005-05-28 04:34:17',2624,469,'2005-05-30 00:35:17',1,'2006-02-15 21:30:53'),(530,'2005-05-28 05:13:01',3332,312,'2005-06-01 10:21:01',2,'2006-02-15 21:30:53'),(531,'2005-05-28 05:23:38',1113,589,'2005-05-29 08:00:38',2,'2006-02-15 21:30:53'),(532,'2005-05-28 05:36:58',2793,120,'2005-06-02 01:50:58',1,'2006-02-15 21:30:53'),(533,'2005-05-28 06:14:46',4306,528,'2005-06-01 06:26:46',2,'2006-02-15 21:30:53'),(534,'2005-05-28 06:15:25',992,184,'2005-06-06 07:51:25',1,'2006-02-15 21:30:53'),(535,'2005-05-28 06:16:32',4209,307,'2005-05-31 02:48:32',1,'2006-02-15 21:30:53'),(536,'2005-05-28 06:17:33',2962,514,'2005-06-03 10:02:33',2,'2006-02-15 21:30:53'),(537,'2005-05-28 06:20:55',3095,315,'2005-06-05 11:48:55',2,'2006-02-15 21:30:53'),(538,'2005-05-28 06:21:05',2262,110,'2005-06-02 01:22:05',2,'2006-02-15 21:30:53'),(539,'2005-05-28 06:26:16',3427,161,'2005-05-30 02:02:16',1,'2006-02-15 21:30:53'),(540,'2005-05-28 06:40:25',3321,119,'2005-06-06 00:47:25',1,'2006-02-15 21:30:53'),(541,'2005-05-28 06:41:58',1662,535,'2005-06-02 09:12:58',2,'2006-02-15 21:30:53'),(542,'2005-05-28 06:42:13',4444,261,'2005-06-03 09:05:13',1,'2006-02-15 21:30:53'),(543,'2005-05-28 06:43:34',530,493,'2005-06-06 07:16:34',2,'2006-02-15 21:30:53'),(544,'2005-05-28 07:03:00',2964,311,'2005-06-06 06:23:00',1,'2006-02-15 21:30:53'),(545,'2005-05-28 07:10:20',1086,54,'2005-06-04 01:47:20',2,'2006-02-15 21:30:53'),(546,'2005-05-28 07:16:25',487,20,'2005-06-01 08:36:25',1,'2006-02-15 21:30:53'),(547,'2005-05-28 07:24:28',2065,506,'2005-06-06 01:31:28',2,'2006-02-15 21:30:53'),(548,'2005-05-28 07:34:56',3704,450,'2005-06-05 03:14:56',2,'2006-02-15 21:30:53'),(549,'2005-05-28 07:35:37',1818,159,'2005-06-02 09:08:37',1,'2006-02-15 21:30:53'),(550,'2005-05-28 07:39:16',3632,432,'2005-06-06 12:20:16',2,'2006-02-15 21:30:53'),(551,'2005-05-28 07:44:18',3119,315,'2005-06-02 12:55:18',2,'2006-02-15 21:30:53'),(552,'2005-05-28 07:53:38',23,106,'2005-06-04 12:45:38',2,'2006-02-15 21:30:53'),(553,'2005-05-28 08:14:44',1349,176,'2005-06-02 03:01:44',2,'2006-02-15 21:30:53'),(554,'2005-05-28 08:23:16',1951,376,'2005-05-31 03:29:16',2,'2006-02-15 21:30:53'),(555,'2005-05-28 08:31:14',4397,55,'2005-05-30 07:34:14',2,'2006-02-15 21:30:53'),(556,'2005-05-28 08:31:36',1814,22,'2005-06-06 07:29:36',2,'2006-02-15 21:30:53'),(557,'2005-05-28 08:36:22',158,444,'2005-06-03 10:42:22',2,'2006-02-15 21:30:53'),(558,'2005-05-28 08:38:43',4163,442,'2005-06-06 13:52:43',1,'2006-02-15 21:30:53'),(559,'2005-05-28 08:39:02',1227,572,'2005-06-05 08:38:02',2,'2006-02-15 21:30:53'),(560,'2005-05-28 08:53:02',644,463,'2005-06-04 12:27:02',2,'2006-02-15 21:30:53'),(561,'2005-05-28 08:54:06',928,77,'2005-06-05 05:54:06',1,'2006-02-15 21:30:53'),(562,'2005-05-28 09:01:21',3390,102,'2005-06-02 05:26:21',2,'2006-02-15 21:30:53'),(563,'2005-05-28 09:10:49',53,324,'2005-06-06 11:32:49',1,'2006-02-15 21:30:53'),(564,'2005-05-28 09:12:09',2973,282,'2005-05-29 05:07:09',1,'2006-02-15 21:30:53'),(565,'2005-05-28 09:26:31',1494,288,'2005-06-01 07:28:31',1,'2006-02-15 21:30:53'),(566,'2005-05-28 09:51:39',4330,253,'2005-06-05 09:35:39',1,'2006-02-15 21:30:53'),(567,'2005-05-28 09:56:20',3308,184,'2005-06-01 06:41:20',2,'2006-02-15 21:30:53'),(568,'2005-05-28 09:57:36',2232,155,'2005-05-31 15:44:36',1,'2006-02-15 21:30:53'),(569,'2005-05-28 10:12:41',4534,56,'2005-06-03 10:08:41',2,'2006-02-15 21:30:53'),(570,'2005-05-28 10:15:04',1122,21,'2005-05-30 08:32:04',1,'2006-02-15 21:30:53'),(571,'2005-05-28 10:17:41',4250,516,'2005-06-05 07:56:41',1,'2006-02-15 21:30:53'),(572,'2005-05-28 10:30:13',1899,337,'2005-06-02 05:04:13',2,'2006-02-15 21:30:53'),(573,'2005-05-28 10:35:23',4020,1,'2005-06-03 06:32:23',1,'2006-02-15 21:30:53'),(574,'2005-05-28 10:44:28',3883,76,'2005-06-04 11:42:28',1,'2006-02-15 21:30:53'),(575,'2005-05-28 10:56:09',4451,142,'2005-06-05 15:39:09',1,'2006-02-15 21:30:53'),(576,'2005-05-28 10:56:10',1866,588,'2005-06-04 13:15:10',2,'2006-02-15 21:30:53'),(577,'2005-05-28 11:09:14',375,6,'2005-06-01 13:27:14',2,'2006-02-15 21:30:53'),(578,'2005-05-28 11:15:48',2938,173,'2005-06-02 09:59:48',1,'2006-02-15 21:30:53'),(579,'2005-05-28 11:19:23',3481,181,'2005-06-02 13:51:23',1,'2006-02-15 21:30:53'),(580,'2005-05-28 11:19:53',3515,17,'2005-06-01 10:44:53',2,'2006-02-15 21:30:53'),(581,'2005-05-28 11:20:29',1380,186,'2005-06-04 12:37:29',2,'2006-02-15 21:30:53'),(582,'2005-05-28 11:33:46',4579,198,'2005-05-29 08:33:46',1,'2006-02-15 21:30:53'),(583,'2005-05-28 11:48:55',2679,386,'2005-06-04 07:09:55',2,'2006-02-15 21:30:53'),(584,'2005-05-28 11:49:00',1833,69,'2005-06-01 11:54:00',1,'2006-02-15 21:30:53'),(585,'2005-05-28 11:50:45',3544,490,'2005-06-03 15:35:45',2,'2006-02-15 21:30:53'),(586,'2005-05-28 12:03:00',898,77,'2005-05-29 13:16:00',1,'2006-02-15 21:30:53'),(587,'2005-05-28 12:05:33',1413,64,'2005-05-30 13:45:33',2,'2006-02-15 21:30:53'),(588,'2005-05-28 12:08:37',95,89,'2005-05-29 16:25:37',2,'2006-02-15 21:30:53'),(589,'2005-05-28 12:27:50',4231,308,'2005-06-03 07:15:50',2,'2006-02-15 21:30:53'),(590,'2005-05-28 13:06:50',473,462,'2005-06-02 09:18:50',1,'2006-02-15 21:30:53'),(591,'2005-05-28 13:11:04',377,19,'2005-05-29 17:20:04',2,'2006-02-15 21:30:53'),(592,'2005-05-28 13:21:08',638,244,'2005-05-29 16:55:08',1,'2006-02-15 21:30:53'),(593,'2005-05-28 13:33:23',1810,16,'2005-05-30 17:10:23',2,'2006-02-15 21:30:53'),(594,'2005-05-28 13:41:56',2766,538,'2005-05-30 12:00:56',1,'2006-02-15 21:30:53'),(595,'2005-05-28 13:59:54',595,294,'2005-06-05 15:16:54',1,'2006-02-15 21:30:53'),(596,'2005-05-28 14:00:03',821,589,'2005-05-29 17:10:03',1,'2006-02-15 21:30:53'),(597,'2005-05-28 14:01:02',4469,249,'2005-06-06 19:06:02',2,'2006-02-15 21:30:53'),(598,'2005-05-28 14:04:50',599,159,'2005-06-03 18:00:50',2,'2006-02-15 21:30:53'),(599,'2005-05-28 14:05:57',4136,393,'2005-06-01 16:41:57',2,'2006-02-15 21:30:53'),(600,'2005-05-28 14:08:19',1567,332,'2005-06-03 11:57:19',2,'2006-02-15 21:30:53'),(601,'2005-05-28 14:08:22',3225,429,'2005-06-04 10:50:22',1,'2006-02-15 21:30:53'),(602,'2005-05-28 14:15:54',1300,590,'2005-06-05 15:16:54',2,'2006-02-15 21:30:53'),(603,'2005-05-28 14:27:51',3248,537,'2005-05-29 13:13:51',1,'2006-02-15 21:30:53'),(604,'2005-05-28 14:37:07',1585,426,'2005-06-03 11:03:07',2,'2006-02-15 21:30:53'),(605,'2005-05-28 14:39:10',4232,501,'2005-06-01 09:28:10',2,'2006-02-15 21:30:53'),(606,'2005-05-28 14:48:39',3509,299,'2005-06-04 09:44:39',2,'2006-02-15 21:30:53'),(607,'2005-05-28 15:02:41',2561,554,'2005-05-30 12:54:41',2,'2006-02-15 21:30:53'),(608,'2005-05-28 15:03:44',4254,494,'2005-06-04 17:14:44',2,'2006-02-15 21:30:53'),(609,'2005-05-28 15:04:02',2944,150,'2005-06-05 14:47:02',2,'2006-02-15 21:30:53'),(610,'2005-05-28 15:15:25',3642,500,'2005-06-02 12:30:25',2,'2006-02-15 21:30:53'),(611,'2005-05-28 15:18:18',1230,580,'2005-05-31 20:15:18',2,'2006-02-15 21:30:53'),(612,'2005-05-28 15:24:54',2180,161,'2005-05-30 14:22:54',2,'2006-02-15 21:30:53'),(613,'2005-05-28 15:27:22',270,595,'2005-06-02 20:01:22',1,'2006-02-15 21:30:53'),(614,'2005-05-28 15:33:28',280,307,'2005-06-04 12:27:28',2,'2006-02-15 21:30:53'),(615,'2005-05-28 15:35:52',3397,533,'2005-06-03 17:35:52',2,'2006-02-15 21:30:53'),(616,'2005-05-28 15:45:39',989,471,'2005-06-02 09:55:39',1,'2006-02-15 21:30:53'),(617,'2005-05-28 15:49:14',4142,372,'2005-05-31 14:29:14',2,'2006-02-15 21:30:53'),(618,'2005-05-28 15:50:07',4445,248,'2005-06-01 19:45:07',1,'2006-02-15 21:30:53'),(619,'2005-05-28 15:52:26',2482,407,'2005-06-06 17:55:26',2,'2006-02-15 21:30:53'),(620,'2005-05-28 15:54:45',2444,321,'2005-06-04 20:26:45',1,'2006-02-15 21:30:53'),(621,'2005-05-28 15:58:12',1144,239,'2005-05-30 21:54:12',1,'2006-02-15 21:30:53'),(622,'2005-05-28 15:58:22',2363,109,'2005-06-04 10:13:22',1,'2006-02-15 21:30:53'),(623,'2005-05-28 16:01:28',1222,495,'2005-05-30 11:19:28',1,'2006-02-15 21:30:53'),(624,'2005-05-28 16:13:22',3660,569,'2005-06-06 20:35:22',1,'2006-02-15 21:30:53'),(625,'2005-05-28 16:35:46',2889,596,'2005-06-01 14:19:46',1,'2006-02-15 21:30:53'),(626,'2005-05-28 16:58:09',452,584,'2005-06-01 14:02:09',2,'2006-02-15 21:30:53'),(627,'2005-05-28 17:04:43',425,241,'2005-06-04 19:58:43',2,'2006-02-15 21:30:53'),(628,'2005-05-28 17:05:46',2513,173,'2005-06-06 16:29:46',2,'2006-02-15 21:30:53'),(629,'2005-05-28 17:19:15',1527,94,'2005-06-02 20:01:15',2,'2006-02-15 21:30:53'),(630,'2005-05-28 17:24:51',1254,417,'2005-06-05 20:05:51',2,'2006-02-15 21:30:53'),(631,'2005-05-28 17:36:32',2465,503,'2005-06-03 14:56:32',2,'2006-02-15 21:30:53'),(632,'2005-05-28 17:37:50',1287,442,'2005-06-03 16:04:50',1,'2006-02-15 21:30:53'),(633,'2005-05-28 17:37:59',58,360,'2005-06-03 22:49:59',2,'2006-02-15 21:30:53'),(634,'2005-05-28 17:40:35',2630,428,'2005-06-05 16:18:35',2,'2006-02-15 21:30:53'),(635,'2005-05-28 17:46:57',1648,42,'2005-06-06 18:24:57',1,'2006-02-15 21:30:53'),(636,'2005-05-28 17:47:58',4213,239,'2005-06-04 16:32:58',1,'2006-02-15 21:30:53'),(637,'2005-05-28 18:14:29',1581,250,'2005-05-29 23:48:29',2,'2006-02-15 21:30:53'),(638,'2005-05-28 18:24:43',2685,372,'2005-06-02 19:03:43',2,'2006-02-15 21:30:53'),(639,'2005-05-28 18:25:02',4204,198,'2005-05-29 18:22:02',1,'2006-02-15 21:30:53'),(640,'2005-05-28 18:43:26',495,465,'2005-05-30 13:39:26',1,'2006-02-15 21:30:53'),(641,'2005-05-28 18:45:47',3548,396,'2005-06-04 15:24:47',1,'2006-02-15 21:30:53'),(642,'2005-05-28 18:49:12',140,157,'2005-06-01 20:50:12',2,'2006-02-15 21:30:53'),(643,'2005-05-28 18:52:11',3105,240,'2005-05-31 15:15:11',2,'2006-02-15 21:30:53'),(644,'2005-05-28 18:59:12',4304,316,'2005-06-04 18:06:12',1,'2006-02-15 21:30:53'),(645,'2005-05-28 19:14:09',3128,505,'2005-06-05 14:01:09',1,'2006-02-15 21:30:53'),(646,'2005-05-28 19:16:14',1922,185,'2005-05-31 16:50:14',2,'2006-02-15 21:30:53'),(647,'2005-05-28 19:22:52',3435,569,'2005-06-01 00:10:52',1,'2006-02-15 21:30:53'),(648,'2005-05-28 19:25:54',3476,253,'2005-06-03 15:57:54',2,'2006-02-15 21:30:53'),(649,'2005-05-28 19:35:45',1781,197,'2005-06-05 16:00:45',1,'2006-02-15 21:30:53'),(650,'2005-05-28 19:45:40',4384,281,'2005-05-29 21:02:40',1,'2006-02-15 21:30:53'),(651,'2005-05-28 19:46:50',739,266,'2005-05-30 16:29:50',1,'2006-02-15 21:30:53'),(652,'2005-05-28 20:08:47',1201,43,'2005-05-29 14:57:47',2,'2006-02-15 21:30:53'),(653,'2005-05-28 20:12:20',126,327,'2005-06-04 14:44:20',2,'2006-02-15 21:30:53'),(654,'2005-05-28 20:15:30',2312,23,'2005-05-30 22:02:30',2,'2006-02-15 21:30:53'),(655,'2005-05-28 20:16:20',331,287,'2005-05-31 16:46:20',2,'2006-02-15 21:30:53'),(656,'2005-05-28 20:18:24',2846,437,'2005-05-30 16:19:24',1,'2006-02-15 21:30:53'),(657,'2005-05-28 20:23:09',848,65,'2005-06-01 02:11:09',1,'2006-02-15 21:30:53'),(658,'2005-05-28 20:23:23',3226,103,'2005-06-06 19:31:23',2,'2006-02-15 21:30:53'),(659,'2005-05-28 20:27:53',1382,207,'2005-05-31 01:36:53',2,'2006-02-15 21:30:53'),(660,'2005-05-28 20:53:31',1414,578,'2005-05-30 15:26:31',1,'2006-02-15 21:30:53'),(661,'2005-05-28 21:01:25',2247,51,'2005-06-02 01:22:25',2,'2006-02-15 21:30:53'),(662,'2005-05-28 21:09:31',2968,166,'2005-06-01 19:00:31',2,'2006-02-15 21:30:53'),(663,'2005-05-28 21:23:02',3997,176,'2005-06-02 17:39:02',2,'2006-02-15 21:30:53'),(664,'2005-05-28 21:31:08',87,523,'2005-06-02 20:56:08',2,'2006-02-15 21:30:53'),(665,'2005-05-28 21:38:39',1012,415,'2005-05-29 21:37:39',1,'2006-02-15 21:30:53'),(666,'2005-05-28 21:48:51',3075,437,'2005-06-05 16:45:51',2,'2006-02-15 21:30:53'),(667,'2005-05-28 21:49:02',797,596,'2005-05-31 03:07:02',1,'2006-02-15 21:30:53'),(668,'2005-05-28 21:54:45',3528,484,'2005-05-29 22:32:45',1,'2006-02-15 21:30:53'),(669,'2005-05-28 22:03:25',3677,313,'2005-06-03 03:39:25',1,'2006-02-15 21:30:53'),(670,'2005-05-28 22:04:03',227,201,'2005-06-06 22:43:03',2,'2006-02-15 21:30:53'),(671,'2005-05-28 22:04:30',1027,14,'2005-06-03 01:21:30',2,'2006-02-15 21:30:53'),(672,'2005-05-28 22:05:29',697,306,'2005-06-06 02:10:29',2,'2006-02-15 21:30:53'),(673,'2005-05-28 22:07:30',1769,468,'2005-06-01 23:42:30',1,'2006-02-15 21:30:53'),(674,'2005-05-28 22:11:35',1150,87,'2005-06-01 23:58:35',2,'2006-02-15 21:30:53'),(675,'2005-05-28 22:22:44',1273,338,'2005-06-01 02:57:44',2,'2006-02-15 21:30:53'),(676,'2005-05-28 22:27:51',2329,490,'2005-05-29 20:36:51',2,'2006-02-15 21:30:53'),(677,'2005-05-28 23:00:08',4558,194,'2005-06-05 19:11:08',2,'2006-02-15 21:30:53'),(678,'2005-05-28 23:15:48',3741,269,'2005-06-03 04:43:48',2,'2006-02-15 21:30:53'),(679,'2005-05-28 23:24:57',907,526,'2005-06-06 21:59:57',2,'2006-02-15 21:30:53'),(680,'2005-05-28 23:27:26',4147,482,'2005-06-02 02:28:26',2,'2006-02-15 21:30:53'),(681,'2005-05-28 23:39:44',3346,531,'2005-06-01 01:42:44',1,'2006-02-15 21:30:53'),(682,'2005-05-28 23:53:18',3160,148,'2005-05-29 19:14:18',2,'2006-02-15 21:30:53'),(683,'2005-05-29 00:09:48',2038,197,'2005-06-02 04:27:48',1,'2006-02-15 21:30:53'),(684,'2005-05-29 00:13:15',3242,461,'2005-06-04 21:26:15',2,'2006-02-15 21:30:53'),(685,'2005-05-29 00:17:51',1385,172,'2005-06-05 05:32:51',2,'2006-02-15 21:30:53'),(686,'2005-05-29 00:27:10',2441,411,'2005-05-30 02:29:10',1,'2006-02-15 21:30:53'),(687,'2005-05-29 00:32:09',1731,250,'2005-05-31 23:53:09',1,'2006-02-15 21:30:53'),(688,'2005-05-29 00:45:24',4135,162,'2005-06-02 01:30:24',1,'2006-02-15 21:30:53'),(689,'2005-05-29 00:46:53',742,571,'2005-06-03 23:48:53',2,'2006-02-15 21:30:53'),(690,'2005-05-29 00:54:53',2646,85,'2005-06-06 00:45:53',1,'2006-02-15 21:30:53'),(691,'2005-05-29 01:01:26',4034,433,'2005-06-07 06:21:26',1,'2006-02-15 21:30:53'),(692,'2005-05-29 01:32:10',800,18,'2005-06-02 03:54:10',2,'2006-02-15 21:30:53'),(693,'2005-05-29 01:42:31',635,190,'2005-06-03 02:29:31',2,'2006-02-15 21:30:53'),(694,'2005-05-29 01:49:43',592,399,'2005-06-05 06:52:43',1,'2006-02-15 21:30:53'),(695,'2005-05-29 01:50:53',4276,528,'2005-06-03 02:28:53',1,'2006-02-15 21:30:53'),(696,'2005-05-29 01:59:10',2076,19,'2005-06-01 02:45:10',1,'2006-02-15 21:30:53'),(697,'2005-05-29 02:04:04',3949,387,'2005-06-04 00:47:04',2,'2006-02-15 21:30:53'),(698,'2005-05-29 02:10:52',1412,109,'2005-06-01 21:52:52',1,'2006-02-15 21:30:53'),(699,'2005-05-29 02:11:44',130,246,'2005-06-04 20:23:44',2,'2006-02-15 21:30:53'),(700,'2005-05-29 02:18:54',500,117,'2005-05-30 05:54:54',1,'2006-02-15 21:30:53'),(701,'2005-05-29 02:26:27',372,112,'2005-06-03 04:59:27',1,'2006-02-15 21:30:53'),(702,'2005-05-29 02:27:30',2556,475,'2005-05-30 01:52:30',2,'2006-02-15 21:30:53'),(703,'2005-05-29 02:29:36',1123,269,'2005-06-03 04:54:36',2,'2006-02-15 21:30:53'),(704,'2005-05-29 02:44:43',2628,330,'2005-06-06 01:51:43',2,'2006-02-15 21:30:53'),(705,'2005-05-29 02:48:52',2809,257,'2005-05-30 06:21:52',1,'2006-02-15 21:30:53'),(706,'2005-05-29 03:05:49',2278,60,'2005-06-04 22:48:49',1,'2006-02-15 21:30:53'),(707,'2005-05-29 03:18:19',819,252,'2005-05-30 02:45:19',1,'2006-02-15 21:30:53'),(708,'2005-05-29 03:23:47',3133,127,'2005-05-31 21:27:47',2,'2006-02-15 21:30:53'),(709,'2005-05-29 03:48:01',2459,479,'2005-06-06 05:21:01',1,'2006-02-15 21:30:53'),(710,'2005-05-29 03:48:36',194,518,'2005-06-03 05:03:36',1,'2006-02-15 21:30:53'),(711,'2005-05-29 03:49:03',4581,215,'2005-05-31 08:29:03',2,'2006-02-15 21:30:53'),(712,'2005-05-29 04:02:24',4191,313,'2005-05-30 03:09:24',2,'2006-02-15 21:30:53'),(713,'2005-05-29 04:10:17',3664,507,'2005-06-07 07:13:17',1,'2006-02-15 21:30:53'),(714,'2005-05-29 04:15:21',2010,452,'2005-06-01 23:05:21',2,'2006-02-15 21:30:53'),(715,'2005-05-29 04:22:41',2030,545,'2005-06-05 09:28:41',1,'2006-02-15 21:30:53'),(716,'2005-05-29 04:35:29',85,36,'2005-06-01 07:42:29',2,'2006-02-15 21:30:53'),(717,'2005-05-29 04:37:44',1383,412,'2005-05-30 05:48:44',2,'2006-02-15 21:30:53'),(718,'2005-05-29 04:52:23',1736,498,'2005-06-02 02:27:23',1,'2006-02-15 21:30:53'),(719,'2005-05-29 05:16:05',267,245,'2005-06-01 07:53:05',2,'2006-02-15 21:30:53'),(720,'2005-05-29 05:17:30',3687,480,'2005-06-06 02:47:30',2,'2006-02-15 21:30:53'),(721,'2005-05-29 05:28:47',1116,44,'2005-05-31 11:24:47',1,'2006-02-15 21:30:53'),(722,'2005-05-29 05:30:31',4540,259,'2005-06-06 04:51:31',1,'2006-02-15 21:30:53'),(723,'2005-05-29 05:34:44',3407,309,'2005-05-30 05:50:44',1,'2006-02-15 21:30:53'),(724,'2005-05-29 05:53:23',3770,416,'2005-06-05 04:01:23',2,'2006-02-15 21:30:53'),(725,'2005-05-29 06:03:41',4088,245,'2005-06-03 08:52:41',2,'2006-02-15 21:30:53'),(726,'2005-05-29 06:05:29',933,452,'2005-06-05 04:40:29',2,'2006-02-15 21:30:53'),(727,'2005-05-29 06:08:15',1629,484,'2005-05-30 07:16:15',1,'2006-02-15 21:30:53'),(728,'2005-05-29 06:12:38',242,551,'2005-06-03 07:41:38',1,'2006-02-15 21:30:53'),(729,'2005-05-29 06:35:13',1688,323,'2005-06-04 03:23:13',2,'2006-02-15 21:30:53'),(730,'2005-05-29 07:00:59',3473,197,'2005-06-06 01:17:59',1,'2006-02-15 21:30:53'),(731,'2005-05-29 07:25:16',4124,5,'2005-05-30 05:21:16',1,'2006-02-15 21:30:53'),(732,'2005-05-29 07:32:51',2530,447,'2005-05-30 10:08:51',2,'2006-02-15 21:30:53'),(733,'2005-05-29 07:35:21',2951,363,'2005-06-05 09:14:21',1,'2006-02-15 21:30:53'),(734,'2005-05-29 07:38:52',3084,538,'2005-06-03 10:17:52',2,'2006-02-15 21:30:53'),(735,'2005-05-29 08:08:13',3421,454,'2005-06-07 13:35:13',1,'2006-02-15 21:30:53'),(736,'2005-05-29 08:10:07',3689,276,'2005-06-05 10:21:07',2,'2006-02-15 21:30:53'),(737,'2005-05-29 08:11:31',769,589,'2005-06-04 11:18:31',2,'2006-02-15 21:30:53'),(738,'2005-05-29 08:20:08',2284,256,'2005-06-06 08:59:08',2,'2006-02-15 21:30:53'),(739,'2005-05-29 08:28:18',1183,84,'2005-06-06 09:21:18',2,'2006-02-15 21:30:53'),(740,'2005-05-29 08:30:36',600,89,'2005-06-04 12:47:36',2,'2006-02-15 21:30:53'),(741,'2005-05-29 08:35:49',3189,495,'2005-06-04 11:55:49',1,'2006-02-15 21:30:53'),(742,'2005-05-29 08:36:30',273,483,'2005-06-05 11:30:30',1,'2006-02-15 21:30:53'),(743,'2005-05-29 08:39:02',2528,548,'2005-06-06 08:42:02',2,'2006-02-15 21:30:53'),(744,'2005-05-29 09:13:08',3722,420,'2005-06-01 07:05:08',2,'2006-02-15 21:30:53'),(745,'2005-05-29 09:22:57',581,152,'2005-06-01 09:10:57',1,'2006-02-15 21:30:53'),(746,'2005-05-29 09:25:10',4272,130,'2005-06-02 04:20:10',2,'2006-02-15 21:30:53'),(747,'2005-05-29 09:26:34',1993,291,'2005-06-05 07:28:34',1,'2006-02-15 21:30:53'),(748,'2005-05-29 09:27:00',2803,7,'2005-06-03 04:25:00',1,'2006-02-15 21:30:53'),(749,'2005-05-29 09:33:33',1146,375,'2005-05-31 11:45:33',2,'2006-02-15 21:30:53'),(750,'2005-05-29 09:41:40',730,269,'2005-05-30 13:31:40',1,'2006-02-15 21:30:53'),(751,'2005-05-29 09:55:43',2711,53,'2005-06-02 04:54:43',1,'2006-02-15 21:30:53'),(752,'2005-05-29 10:14:15',1720,126,'2005-06-04 06:30:15',1,'2006-02-15 21:30:53'),(753,'2005-05-29 10:16:42',1021,135,'2005-06-05 08:52:42',2,'2006-02-15 21:30:53'),(754,'2005-05-29 10:18:59',734,281,'2005-06-04 05:03:59',2,'2006-02-15 21:30:53'),(755,'2005-05-29 10:26:29',3090,576,'2005-06-01 10:25:29',2,'2006-02-15 21:30:53'),(756,'2005-05-29 10:28:45',3152,201,'2005-06-04 12:50:45',1,'2006-02-15 21:30:53'),(757,'2005-05-29 10:29:47',1067,435,'2005-06-07 15:27:47',1,'2006-02-15 21:30:53'),(758,'2005-05-29 10:31:56',1191,563,'2005-06-01 14:53:56',2,'2006-02-15 21:30:53'),(759,'2005-05-29 10:57:57',2367,179,'2005-06-07 16:23:57',2,'2006-02-15 21:30:53'),(760,'2005-05-29 11:07:25',3250,77,'2005-06-02 14:16:25',1,'2006-02-15 21:30:53'),(761,'2005-05-29 11:09:01',2342,58,'2005-06-03 16:18:01',2,'2006-02-15 21:30:53'),(762,'2005-05-29 11:15:51',3683,146,'2005-06-06 07:48:51',1,'2006-02-15 21:30:53'),(763,'2005-05-29 11:32:15',2022,50,'2005-05-31 17:31:15',1,'2006-02-15 21:30:53'),(764,'2005-05-29 11:37:35',1069,149,'2005-05-31 16:47:35',1,'2006-02-15 21:30:53'),(765,'2005-05-29 11:38:34',515,69,'2005-06-02 17:04:34',1,'2006-02-15 21:30:53'),(766,'2005-05-29 11:47:02',2154,383,'2005-06-06 07:14:02',1,'2006-02-15 21:30:53'),(767,'2005-05-29 12:20:19',687,67,'2005-06-02 14:15:19',2,'2006-02-15 21:30:53'),(768,'2005-05-29 12:30:46',2895,566,'2005-06-07 09:00:46',2,'2006-02-15 21:30:53'),(769,'2005-05-29 12:51:44',1523,575,'2005-06-01 17:43:44',1,'2006-02-15 21:30:53'),(770,'2005-05-29 12:56:50',2491,405,'2005-06-07 15:54:50',2,'2006-02-15 21:30:53'),(771,'2005-05-29 12:59:14',353,476,'2005-06-01 16:05:14',2,'2006-02-15 21:30:53'),(772,'2005-05-29 13:08:06',3319,556,'2005-06-06 08:19:06',1,'2006-02-15 21:30:53'),(773,'2005-05-29 13:18:05',245,563,'2005-06-07 17:22:05',1,'2006-02-15 21:30:53'),(774,'2005-05-29 13:19:43',1188,575,'2005-06-01 18:51:43',1,'2006-02-15 21:30:53'),(775,'2005-05-29 13:23:26',1197,124,'2005-05-30 07:53:26',2,'2006-02-15 21:30:53'),(776,'2005-05-29 13:35:35',4339,113,'2005-06-03 17:33:35',1,'2006-02-15 21:30:53'),(777,'2005-05-29 14:07:58',451,360,'2005-06-03 08:41:58',2,'2006-02-15 21:30:53'),(778,'2005-05-29 14:09:53',1816,535,'2005-06-05 20:05:53',1,'2006-02-15 21:30:53'),(779,'2005-05-29 14:17:17',533,105,'2005-06-06 16:46:17',1,'2006-02-15 21:30:53'),(780,'2005-05-29 14:18:32',1919,300,'2005-06-06 20:14:32',1,'2006-02-15 21:30:53'),(781,'2005-05-29 14:23:58',88,313,'2005-05-30 17:44:58',1,'2006-02-15 21:30:53'),(782,'2005-05-29 14:38:57',2255,596,'2005-06-02 13:18:57',2,'2006-02-15 21:30:53'),(783,'2005-05-29 14:41:18',3046,53,'2005-06-06 10:39:18',2,'2006-02-15 21:30:53'),(784,'2005-05-29 14:44:22',2936,352,'2005-06-01 17:28:22',2,'2006-02-15 21:30:53'),(785,'2005-05-29 15:08:41',39,72,'2005-05-30 15:51:41',1,'2006-02-15 21:30:53'),(786,'2005-05-29 15:17:28',2637,439,'2005-06-07 10:07:28',2,'2006-02-15 21:30:53'),(787,'2005-05-29 16:03:03',3919,27,'2005-06-07 11:07:03',2,'2006-02-15 21:30:53'),(788,'2005-05-29 16:13:55',763,562,'2005-05-31 16:40:55',1,'2006-02-15 21:30:53'),(789,'2005-05-29 16:17:07',708,553,'2005-06-06 18:15:07',1,'2006-02-15 21:30:53'),(790,'2005-05-29 16:19:29',2858,593,'2005-06-02 17:22:29',2,'2006-02-15 21:30:53'),(791,'2005-05-29 16:30:42',1554,284,'2005-06-01 19:11:42',1,'2006-02-15 21:30:53'),(792,'2005-05-29 16:32:10',2841,261,'2005-05-31 18:01:10',1,'2006-02-15 21:30:53'),(793,'2005-05-29 16:44:08',379,528,'2005-06-06 19:21:08',2,'2006-02-15 21:30:53'),(794,'2005-05-29 16:44:11',1995,50,'2005-06-05 16:11:11',1,'2006-02-15 21:30:53'),(795,'2005-05-29 16:57:39',609,551,'2005-06-01 11:33:39',2,'2006-02-15 21:30:53'),(796,'2005-05-29 16:59:44',2697,26,'2005-06-03 16:22:44',2,'2006-02-15 21:30:53'),(797,'2005-05-29 17:12:17',1446,244,'2005-06-03 16:06:17',1,'2006-02-15 21:30:53'),(798,'2005-05-29 17:23:43',1102,134,'2005-06-01 13:06:43',2,'2006-02-15 21:30:53'),(799,'2005-05-29 17:24:48',1713,429,'2005-06-05 12:25:48',1,'2006-02-15 21:30:53'),(800,'2005-05-29 17:28:12',441,472,'2005-05-30 14:59:12',1,'2006-02-15 21:30:53'),(801,'2005-05-29 17:35:50',1642,402,'2005-06-04 17:05:50',2,'2006-02-15 21:30:53'),(802,'2005-05-29 17:38:59',785,350,'2005-05-31 22:42:59',2,'2006-02-15 21:30:53'),(803,'2005-05-29 17:52:30',1602,32,'2005-05-30 14:35:30',2,'2006-02-15 21:30:53'),(804,'2005-05-29 18:10:24',3909,171,'2005-06-06 22:53:24',1,'2006-02-15 21:30:53'),(805,'2005-05-29 18:18:18',3132,232,'2005-06-07 15:11:18',2,'2006-02-15 21:30:53'),(806,'2005-05-29 18:31:30',2386,435,'2005-05-31 00:18:30',2,'2006-02-15 21:30:53'),(807,'2005-05-29 18:50:50',2195,235,'2005-06-03 18:36:50',2,'2006-02-15 21:30:53'),(808,'2005-05-29 19:08:20',1928,104,'2005-06-06 20:32:20',2,'2006-02-15 21:30:53'),(809,'2005-05-29 19:10:20',2114,222,'2005-06-05 19:05:20',2,'2006-02-15 21:30:53'),(810,'2005-05-29 19:12:04',2533,346,'2005-06-04 21:12:04',2,'2006-02-15 21:30:53'),(811,'2005-05-29 19:30:42',4419,401,'2005-06-02 16:19:42',2,'2006-02-15 21:30:53'),(812,'2005-05-29 20:00:30',1099,225,'2005-05-30 19:43:30',2,'2006-02-15 21:30:53'),(813,'2005-05-29 20:14:34',4554,344,'2005-06-05 20:56:34',1,'2006-02-15 21:30:53'),(814,'2005-05-29 20:16:12',1572,134,'2005-06-07 17:47:12',1,'2006-02-15 21:30:53'),(815,'2005-05-29 20:24:28',3757,14,'2005-06-03 15:32:28',1,'2006-02-15 21:30:53'),(816,'2005-05-29 20:26:39',630,474,'2005-06-06 22:31:39',2,'2006-02-15 21:30:53'),(817,'2005-05-29 20:39:14',186,554,'2005-05-31 18:24:14',1,'2006-02-15 21:30:53'),(818,'2005-05-29 20:47:53',4106,321,'2005-06-02 23:18:53',2,'2006-02-15 21:30:53'),(819,'2005-05-29 21:00:32',623,511,'2005-06-02 15:15:32',2,'2006-02-15 21:30:53'),(820,'2005-05-29 21:07:22',2584,22,'2005-06-07 00:22:22',2,'2006-02-15 21:30:53'),(821,'2005-05-29 21:31:12',3380,348,'2005-06-04 22:49:12',1,'2006-02-15 21:30:53'),(822,'2005-05-29 21:36:00',2634,480,'2005-06-07 17:24:00',1,'2006-02-15 21:30:53'),(823,'2005-05-29 21:39:37',3249,441,'2005-05-30 22:06:37',1,'2006-02-15 21:30:53'),(824,'2005-05-29 21:45:32',3518,357,'2005-05-31 19:01:32',1,'2006-02-15 21:30:53'),(825,'2005-05-29 21:49:41',712,371,'2005-06-04 20:27:41',2,'2006-02-15 21:30:53'),(826,'2005-05-29 21:56:15',2263,207,'2005-06-08 03:18:15',1,'2006-02-15 21:30:53'),(827,'2005-05-29 21:58:43',62,573,'2005-06-06 00:54:43',1,'2006-02-15 21:30:53'),(828,'2005-05-29 22:14:55',2468,217,'2005-05-30 17:22:55',1,'2006-02-15 21:30:53'),(829,'2005-05-29 22:16:42',1684,371,'2005-06-06 01:38:42',1,'2006-02-15 21:30:53'),(830,'2005-05-29 22:43:55',3464,3,'2005-06-01 17:43:55',1,'2006-02-15 21:30:53'),(831,'2005-05-29 22:50:25',3912,509,'2005-06-06 02:27:25',1,'2006-02-15 21:30:53'),(832,'2005-05-29 22:51:20',1381,159,'2005-06-07 17:37:20',2,'2006-02-15 21:30:53'),(833,'2005-05-29 23:21:56',2898,417,'2005-06-02 18:40:56',1,'2006-02-15 21:30:53'),(834,'2005-05-29 23:24:30',3628,84,'2005-05-30 22:00:30',2,'2006-02-15 21:30:53'),(835,'2005-05-29 23:37:00',299,381,'2005-06-02 23:38:00',1,'2006-02-15 21:30:53'),(836,'2005-05-29 23:56:42',3140,368,'2005-05-31 04:11:42',2,'2006-02-15 21:30:53'),(837,'2005-05-30 00:02:08',977,172,'2005-06-02 05:31:08',2,'2006-02-15 21:30:53'),(838,'2005-05-30 00:27:57',2859,504,'2005-06-06 22:19:57',2,'2006-02-15 21:30:53'),(839,'2005-05-30 00:28:12',1886,337,'2005-06-08 02:43:12',1,'2006-02-15 21:30:53'),(840,'2005-05-30 00:28:41',4049,79,'2005-05-31 20:39:41',2,'2006-02-15 21:30:53'),(841,'2005-05-30 00:31:17',4318,387,'2005-06-02 19:14:17',1,'2006-02-15 21:30:53'),(842,'2005-05-30 00:32:04',2328,238,'2005-06-01 02:21:04',1,'2006-02-15 21:30:53'),(843,'2005-05-30 00:44:24',2214,313,'2005-05-31 00:58:24',2,'2006-02-15 21:30:53'),(844,'2005-05-30 00:58:20',536,429,'2005-06-01 00:38:20',1,'2006-02-15 21:30:53'),(845,'2005-05-30 01:17:25',2001,72,'2005-06-07 02:00:25',1,'2006-02-15 21:30:53'),(846,'2005-05-30 01:17:45',938,49,'2005-06-01 00:56:45',2,'2006-02-15 21:30:53'),(847,'2005-05-30 01:18:15',4387,380,'2005-06-06 20:20:15',2,'2006-02-15 21:30:53'),(848,'2005-05-30 01:19:53',1363,436,'2005-06-05 23:40:53',1,'2006-02-15 21:30:53'),(849,'2005-05-30 01:23:07',2424,449,'2005-06-07 01:50:07',1,'2006-02-15 21:30:53'),(850,'2005-05-30 01:35:12',2390,517,'2005-05-31 01:51:12',1,'2006-02-15 21:30:53'),(851,'2005-05-30 01:35:15',2780,530,'2005-06-06 07:27:15',1,'2006-02-15 21:30:53'),(852,'2005-05-30 01:36:57',1622,549,'2005-06-01 22:44:57',1,'2006-02-15 21:30:53'),(853,'2005-05-30 01:43:31',3693,122,'2005-06-01 02:05:31',1,'2006-02-15 21:30:53'),(854,'2005-05-30 01:56:11',921,369,'2005-06-01 06:34:11',2,'2006-02-15 21:30:53'),(855,'2005-05-30 02:00:28',2527,406,'2005-06-03 20:16:28',2,'2006-02-15 21:30:53'),(856,'2005-05-30 02:01:21',3969,53,'2005-06-07 03:25:21',1,'2006-02-15 21:30:53'),(857,'2005-05-30 02:01:23',2569,204,'2005-06-02 06:07:23',2,'2006-02-15 21:30:53'),(858,'2005-05-30 02:10:32',1258,358,'2005-06-01 04:42:32',1,'2006-02-15 21:30:53'),(859,'2005-05-30 02:36:20',3032,79,'2005-06-02 07:49:20',2,'2006-02-15 21:30:53'),(860,'2005-05-30 02:45:16',578,276,'2005-06-08 07:28:16',1,'2006-02-15 21:30:53'),(861,'2005-05-30 02:48:32',3711,502,'2005-06-06 05:43:32',1,'2006-02-15 21:30:53'),(862,'2005-05-30 03:09:11',1186,328,'2005-06-03 21:27:11',1,'2006-02-15 21:30:53'),(863,'2005-05-30 03:14:59',3999,379,'2005-06-05 04:34:59',2,'2006-02-15 21:30:53'),(864,'2005-05-30 03:27:17',2777,544,'2005-06-06 08:28:17',1,'2006-02-15 21:30:53'),(865,'2005-05-30 03:39:44',3183,154,'2005-06-07 08:10:44',2,'2006-02-15 21:30:53'),(866,'2005-05-30 03:43:54',2867,8,'2005-06-08 04:28:54',1,'2006-02-15 21:30:53'),(867,'2005-05-30 03:54:43',3389,99,'2005-06-01 22:59:43',1,'2006-02-15 21:30:53'),(868,'2005-05-30 04:19:55',3604,28,'2005-05-31 02:28:55',1,'2006-02-15 21:30:53'),(869,'2005-05-30 04:22:06',3399,296,'2005-06-03 09:18:06',2,'2006-02-15 21:30:53'),(870,'2005-05-30 04:25:47',2903,391,'2005-06-06 04:32:47',1,'2006-02-15 21:30:53'),(871,'2005-05-30 05:01:30',4573,303,'2005-06-04 06:22:30',2,'2006-02-15 21:30:53'),(872,'2005-05-30 05:03:04',3904,548,'2005-06-06 10:35:04',1,'2006-02-15 21:30:53'),(873,'2005-05-30 05:15:20',4568,375,'2005-06-07 00:49:20',2,'2006-02-15 21:30:53'),(874,'2005-05-30 05:36:21',363,52,'2005-06-01 09:32:21',1,'2006-02-15 21:30:53'),(875,'2005-05-30 05:38:24',1428,326,'2005-06-06 00:34:24',2,'2006-02-15 21:30:53'),(876,'2005-05-30 05:41:22',1471,339,'2005-06-07 09:06:22',2,'2006-02-15 21:30:53'),(877,'2005-05-30 05:48:59',886,9,'2005-06-02 09:30:59',1,'2006-02-15 21:30:53'),(878,'2005-05-30 05:49:13',4265,323,'2005-06-07 04:35:13',1,'2006-02-15 21:30:53'),(879,'2005-05-30 05:49:42',4021,482,'2005-06-05 01:45:42',2,'2006-02-15 21:30:53'),(880,'2005-05-30 06:12:33',1819,460,'2005-06-02 04:35:33',2,'2006-02-15 21:30:53'),(881,'2005-05-30 06:15:36',602,242,'2005-06-02 10:21:36',1,'2006-02-15 21:30:53'),(882,'2005-05-30 06:16:06',3841,477,'2005-06-02 11:57:06',1,'2006-02-15 21:30:53'),(883,'2005-05-30 06:21:05',2271,399,'2005-06-07 04:50:05',2,'2006-02-15 21:30:53'),(884,'2005-05-30 06:41:32',4079,17,'2005-05-31 07:39:32',1,'2006-02-15 21:30:53'),(885,'2005-05-30 06:54:28',646,62,'2005-06-03 07:03:28',2,'2006-02-15 21:30:53'),(886,'2005-05-30 06:54:51',4356,393,'2005-06-01 06:04:51',2,'2006-02-15 21:30:53'),(887,'2005-05-30 07:10:00',2727,16,'2005-06-01 06:48:00',2,'2006-02-15 21:30:53'),(888,'2005-05-30 07:13:14',387,128,'2005-06-06 09:50:14',1,'2006-02-15 21:30:53'),(889,'2005-05-30 07:14:53',1299,114,'2005-05-31 07:56:53',2,'2006-02-15 21:30:53'),(890,'2005-05-30 07:43:04',1464,349,'2005-06-01 11:26:04',1,'2006-02-15 21:30:53'),(891,'2005-05-30 07:43:12',2611,391,'2005-06-08 09:21:12',1,'2006-02-15 21:30:53'),(892,'2005-05-30 08:02:56',471,274,'2005-06-05 12:51:56',1,'2006-02-15 21:30:53'),(893,'2005-05-30 08:06:59',3260,502,'2005-06-07 08:23:59',2,'2006-02-15 21:30:53'),(894,'2005-05-30 08:31:31',1118,400,'2005-06-07 12:39:31',1,'2006-02-15 21:30:53'),(895,'2005-05-30 08:50:43',2744,192,'2005-06-05 10:58:43',1,'2006-02-15 21:30:53'),(896,'2005-05-30 09:03:52',2817,207,'2005-06-05 07:37:52',2,'2006-02-15 21:30:53'),(897,'2005-05-30 09:10:01',1334,432,'2005-06-08 03:43:01',1,'2006-02-15 21:30:53'),(898,'2005-05-30 09:26:19',3497,384,'2005-06-01 10:45:19',2,'2006-02-15 21:30:53'),(899,'2005-05-30 09:29:30',1096,156,'2005-06-06 12:39:30',2,'2006-02-15 21:30:53'),(900,'2005-05-30 09:38:41',3543,586,'2005-06-07 11:54:41',1,'2006-02-15 21:30:53'),(901,'2005-05-30 09:40:40',760,259,'2005-06-02 10:32:40',1,'2006-02-15 21:30:53'),(902,'2005-05-30 09:53:36',1514,561,'2005-06-07 12:10:36',1,'2006-02-15 21:30:53'),(903,'2005-05-30 10:11:29',2423,197,'2005-06-03 09:33:29',1,'2006-02-15 21:30:53'),(904,'2005-05-30 10:19:42',2466,44,'2005-06-05 04:58:42',2,'2006-02-15 21:30:53'),(905,'2005-05-30 10:25:00',4372,50,'2005-06-06 06:23:00',1,'2006-02-15 21:30:53'),(906,'2005-05-30 10:30:38',1862,549,'2005-06-07 06:44:38',2,'2006-02-15 21:30:53'),(907,'2005-05-30 10:37:27',3320,506,'2005-06-02 09:51:27',1,'2006-02-15 21:30:53'),(908,'2005-05-30 10:38:37',4427,85,'2005-06-03 09:56:37',1,'2006-02-15 21:30:53'),(909,'2005-05-30 10:43:38',3775,486,'2005-06-08 12:07:38',1,'2006-02-15 21:30:53'),(910,'2005-05-30 10:46:16',2601,374,'2005-06-04 13:32:16',1,'2006-02-15 21:30:53'),(911,'2005-05-30 10:50:22',1404,366,'2005-06-07 12:26:22',2,'2006-02-15 21:30:53'),(912,'2005-05-30 10:58:33',3200,390,'2005-05-31 09:31:33',2,'2006-02-15 21:30:53'),(913,'2005-05-30 11:04:58',3213,369,'2005-06-07 13:22:58',2,'2006-02-15 21:30:53'),(914,'2005-05-30 11:06:00',1393,596,'2005-06-04 06:07:00',2,'2006-02-15 21:30:53'),(915,'2005-05-30 11:20:27',1859,115,'2005-06-02 11:55:27',1,'2006-02-15 21:30:53'),(916,'2005-05-30 11:25:01',1290,6,'2005-05-31 09:06:01',1,'2006-02-15 21:30:53'),(917,'2005-05-30 11:27:06',3629,385,'2005-06-02 08:31:06',1,'2006-02-15 21:30:53'),(918,'2005-05-30 11:32:24',818,197,'2005-05-31 07:55:24',2,'2006-02-15 21:30:53'),(919,'2005-05-30 11:35:06',4052,374,'2005-06-02 13:16:06',2,'2006-02-15 21:30:53'),(920,'2005-05-30 11:44:01',3860,584,'2005-06-02 08:19:01',2,'2006-02-15 21:30:53'),(921,'2005-05-30 11:53:09',1827,508,'2005-06-03 10:00:09',2,'2006-02-15 21:30:53'),(922,'2005-05-30 11:55:55',2442,550,'2005-06-08 10:12:55',2,'2006-02-15 21:30:53'),(923,'2005-05-30 11:58:50',1884,37,'2005-06-05 09:57:50',1,'2006-02-15 21:30:53'),(924,'2005-05-30 12:10:59',3279,293,'2005-06-04 17:28:59',1,'2006-02-15 21:30:53'),(925,'2005-05-30 12:13:52',3203,137,'2005-06-02 14:41:52',2,'2006-02-15 21:30:53'),(926,'2005-05-30 12:15:54',4327,76,'2005-06-01 08:53:54',2,'2006-02-15 21:30:53'),(927,'2005-05-30 12:16:40',1158,167,'2005-05-31 16:20:40',2,'2006-02-15 21:30:53'),(928,'2005-05-30 12:27:14',246,79,'2005-06-05 13:56:14',2,'2006-02-15 21:30:53'),(929,'2005-05-30 12:32:39',4296,536,'2005-06-06 12:17:39',1,'2006-02-15 21:30:53'),(930,'2005-05-30 12:44:57',2835,141,'2005-06-04 10:53:57',2,'2006-02-15 21:30:53'),(931,'2005-05-30 12:53:01',3384,421,'2005-05-31 14:28:01',1,'2006-02-15 21:30:53'),(932,'2005-05-30 12:55:36',719,198,'2005-05-31 10:30:36',2,'2006-02-15 21:30:53'),(933,'2005-05-30 13:08:45',3672,66,'2005-06-01 18:56:45',1,'2006-02-15 21:30:53'),(934,'2005-05-30 13:24:46',3595,60,'2005-06-08 16:44:46',2,'2006-02-15 21:30:53'),(935,'2005-05-30 13:29:36',2421,256,'2005-06-02 11:08:36',1,'2006-02-15 21:30:53'),(936,'2005-05-30 13:52:49',901,469,'2005-06-07 16:56:49',1,'2006-02-15 21:30:53'),(937,'2005-05-30 14:47:31',1054,304,'2005-06-05 09:53:31',2,'2006-02-15 21:30:53'),(938,'2005-05-30 14:47:31',1521,46,'2005-06-04 10:10:31',2,'2006-02-15 21:30:53'),(939,'2005-05-30 14:49:34',1314,367,'2005-06-01 19:00:34',1,'2006-02-15 21:30:53'),(940,'2005-05-30 15:01:02',1278,534,'2005-06-01 18:26:02',1,'2006-02-15 21:30:53'),(941,'2005-05-30 15:02:25',3630,562,'2005-06-01 17:19:25',1,'2006-02-15 21:30:53'),(942,'2005-05-30 15:05:47',4279,473,'2005-06-08 15:59:47',2,'2006-02-15 21:30:53'),(943,'2005-05-30 15:20:19',3737,57,'2005-06-06 18:53:19',1,'2006-02-15 21:30:53'),(944,'2005-05-30 15:26:24',151,131,'2005-06-07 18:09:24',2,'2006-02-15 21:30:53'),(945,'2005-05-30 15:33:17',1441,357,'2005-06-02 15:02:17',2,'2006-02-15 21:30:53'),(946,'2005-05-30 15:35:08',1264,486,'2005-06-08 11:38:08',1,'2006-02-15 21:30:53'),(947,'2005-05-30 15:36:57',4478,62,'2005-06-04 18:48:57',1,'2006-02-15 21:30:53'),(948,'2005-05-30 15:44:27',585,245,'2005-06-08 17:30:27',2,'2006-02-15 21:30:53'),(949,'2005-05-30 15:50:39',2202,368,'2005-06-03 14:25:39',1,'2006-02-15 21:30:53'),(950,'2005-05-30 16:06:08',491,83,'2005-06-01 11:43:08',1,'2006-02-15 21:30:53'),(951,'2005-05-30 16:10:35',1395,59,'2005-05-31 19:01:35',2,'2006-02-15 21:30:53'),(952,'2005-05-30 16:28:07',4389,311,'2005-06-02 16:12:07',2,'2006-02-15 21:30:53'),(953,'2005-05-30 16:34:02',2194,210,'2005-05-31 20:34:02',1,'2006-02-15 21:30:53'),(954,'2005-05-30 16:57:29',1231,297,'2005-06-08 13:30:29',2,'2006-02-15 21:30:53'),(955,'2005-05-30 16:59:03',4140,301,'2005-05-31 11:58:03',2,'2006-02-15 21:30:53'),(956,'2005-05-30 17:30:28',647,296,'2005-06-07 13:54:28',2,'2006-02-15 21:30:53'),(957,'2005-05-30 17:53:29',4428,440,'2005-06-03 15:31:29',2,'2006-02-15 21:30:53'),(958,'2005-05-30 17:58:03',548,186,'2005-06-01 19:17:03',2,'2006-02-15 21:30:53'),(959,'2005-05-30 18:07:00',3108,535,'2005-06-02 14:37:00',2,'2006-02-15 21:30:53'),(960,'2005-05-30 18:13:23',1966,445,'2005-06-04 00:12:23',2,'2006-02-15 21:30:53'),(961,'2005-05-30 18:16:44',3293,588,'2005-06-04 23:40:44',2,'2006-02-15 21:30:53'),(962,'2005-05-30 18:45:17',4535,520,'2005-06-05 22:47:17',1,'2006-02-15 21:30:53'),(963,'2005-05-30 18:52:53',1921,225,'2005-06-07 16:19:53',2,'2006-02-15 21:30:53'),(964,'2005-05-30 18:53:21',657,287,'2005-06-04 22:32:21',2,'2006-02-15 21:30:53'),(965,'2005-05-30 19:00:14',3363,502,'2005-05-31 17:10:14',2,'2006-02-15 21:30:53'),(966,'2005-05-30 19:00:37',1294,496,'2005-05-31 23:51:37',1,'2006-02-15 21:30:53'),(967,'2005-05-30 19:12:06',1954,330,'2005-06-09 00:02:06',2,'2006-02-15 21:30:53'),(968,'2005-05-30 19:20:03',119,576,'2005-05-31 18:17:03',2,'2006-02-15 21:30:53'),(969,'2005-05-30 19:23:48',443,551,'2005-05-31 21:14:48',1,'2006-02-15 21:30:53'),(970,'2005-05-30 19:50:28',1520,307,'2005-06-09 01:19:28',1,'2006-02-15 21:30:53'),(971,'2005-05-30 20:10:52',2911,561,'2005-06-06 20:47:52',1,'2006-02-15 21:30:53'),(972,'2005-05-30 20:21:07',2,411,'2005-06-06 00:36:07',1,'2006-02-15 21:30:53'),(973,'2005-05-30 20:27:45',1914,473,'2005-06-08 22:47:45',2,'2006-02-15 21:30:53'),(974,'2005-05-30 20:28:42',2617,596,'2005-06-08 23:45:42',2,'2006-02-15 21:30:53'),(975,'2005-05-30 21:07:15',3109,7,'2005-06-03 01:48:15',2,'2006-02-15 21:30:53'),(976,'2005-05-30 21:11:19',2290,581,'2005-06-06 02:16:19',2,'2006-02-15 21:30:53'),(977,'2005-05-30 21:22:26',2029,394,'2005-06-04 22:32:26',2,'2006-02-15 21:30:53'),(978,'2005-05-30 21:30:52',407,154,'2005-06-07 16:22:52',1,'2006-02-15 21:30:53'),(979,'2005-05-30 21:37:11',3917,279,'2005-06-08 00:24:11',2,'2006-02-15 21:30:53'),(980,'2005-05-30 21:45:19',4169,273,'2005-06-01 20:32:19',1,'2006-02-15 21:30:53'),(981,'2005-05-30 21:52:42',2913,326,'2005-06-01 03:15:42',2,'2006-02-15 21:30:53'),(982,'2005-05-30 22:15:24',3560,524,'2005-06-02 16:18:24',1,'2006-02-15 21:30:53'),(983,'2005-05-30 22:15:51',63,115,'2005-06-02 22:56:51',1,'2006-02-15 21:30:53'),(984,'2005-05-30 22:17:17',2305,262,'2005-06-01 20:15:17',2,'2006-02-15 21:30:53'),(985,'2005-05-30 22:18:35',1573,564,'2005-06-04 23:36:35',1,'2006-02-15 21:30:53'),(986,'2005-05-30 22:22:52',4045,253,'2005-06-01 02:24:52',1,'2006-02-15 21:30:53'),(987,'2005-05-30 22:59:12',390,11,'2005-06-07 20:56:12',1,'2006-02-15 21:30:53'),(988,'2005-05-30 23:08:03',1364,12,'2005-06-07 00:22:03',1,'2006-02-15 21:30:53'),(989,'2005-05-30 23:11:51',4388,83,'2005-06-03 20:36:51',2,'2006-02-15 21:30:53'),(990,'2005-05-30 23:25:14',4171,311,'2005-06-06 18:41:14',2,'2006-02-15 21:30:53'),(991,'2005-05-30 23:29:22',2863,593,'2005-06-07 23:16:22',1,'2006-02-15 21:30:53'),(992,'2005-05-30 23:47:56',3572,123,'2005-06-05 19:01:56',1,'2006-02-15 21:30:53'),(993,'2005-05-30 23:54:19',2080,513,'2005-06-04 21:27:19',1,'2006-02-15 21:30:53'),(994,'2005-05-30 23:55:36',2798,472,'2005-06-04 01:00:36',2,'2006-02-15 21:30:53'),(995,'2005-05-31 00:06:02',17,150,'2005-06-06 02:30:02',2,'2006-02-15 21:30:53'),(996,'2005-05-31 00:06:20',2075,331,'2005-05-31 21:29:20',2,'2006-02-15 21:30:53'),(997,'2005-05-31 00:08:25',4243,216,'2005-06-02 00:17:25',2,'2006-02-15 21:30:53'),(998,'2005-05-31 00:16:57',3395,389,'2005-06-01 22:41:57',1,'2006-02-15 21:30:53'),(999,'2005-05-31 00:25:10',4433,413,'2005-06-03 06:05:10',2,'2006-02-15 21:30:53'),(1000,'2005-05-31 00:25:56',1774,332,'2005-06-08 19:42:56',2,'2006-02-15 21:30:53'),(1001,'2005-05-31 00:46:31',1498,64,'2005-06-06 06:14:31',2,'2006-02-15 21:30:53'),(1002,'2005-05-31 00:47:56',709,397,'2005-06-06 19:51:56',1,'2006-02-15 21:30:53'),(1003,'2005-05-31 00:48:20',133,161,'2005-06-02 04:53:20',2,'2006-02-15 21:30:53'),(1004,'2005-05-31 00:48:36',1588,565,'2005-06-01 20:56:36',1,'2006-02-15 21:30:53'),(1005,'2005-05-31 00:53:25',4006,551,'2005-06-04 01:21:25',2,'2006-02-15 21:30:53'),(1006,'2005-05-31 00:57:08',3461,222,'2005-06-02 22:35:08',1,'2006-02-15 21:30:53'),(1007,'2005-05-31 01:02:28',3185,24,'2005-06-07 01:36:28',2,'2006-02-15 21:30:53'),(1008,'2005-05-31 01:18:56',914,599,'2005-06-01 01:24:56',2,'2006-02-15 21:30:53'),(1009,'2005-05-31 01:47:35',2523,485,'2005-06-03 20:26:35',1,'2006-02-15 21:30:53'),(1010,'2005-05-31 01:57:32',4038,49,'2005-06-01 06:50:32',2,'2006-02-15 21:30:53'),(1011,'2005-05-31 02:05:39',118,164,'2005-06-04 21:27:39',2,'2006-02-15 21:30:53'),(1012,'2005-05-31 02:18:05',688,291,'2005-06-03 06:47:05',1,'2006-02-15 21:30:53'),(1013,'2005-05-31 02:37:00',4522,384,'2005-06-02 06:39:00',2,'2006-02-15 21:30:53'),(1014,'2005-05-31 02:39:16',766,280,'2005-06-01 06:03:16',2,'2006-02-15 21:30:53'),(1015,'2005-05-31 02:44:57',3702,526,'2005-06-07 23:01:57',2,'2006-02-15 21:30:53'),(1016,'2005-05-31 02:49:43',3423,204,'2005-06-04 03:48:43',1,'2006-02-15 21:30:53'),(1017,'2005-05-31 02:53:36',1242,16,'2005-06-03 05:04:36',1,'2006-02-15 21:30:53'),(1018,'2005-05-31 02:53:42',1930,594,'2005-06-03 00:47:42',2,'2006-02-15 21:30:53'),(1019,'2005-05-31 03:05:07',3975,279,'2005-06-03 08:34:07',1,'2006-02-15 21:30:53'),(1020,'2005-05-31 03:06:08',3402,138,'2005-06-02 08:57:08',2,'2006-02-15 21:30:53'),(1021,'2005-05-31 03:16:15',2724,541,'2005-06-08 06:43:15',2,'2006-02-15 21:30:53'),(1022,'2005-05-31 03:16:45',842,239,'2005-06-08 09:04:45',1,'2006-02-15 21:30:53'),(1023,'2005-05-31 03:26:50',2483,227,'2005-06-05 08:19:50',2,'2006-02-15 21:30:53'),(1024,'2005-05-31 03:30:19',2310,457,'2005-06-09 05:52:19',2,'2006-02-15 21:30:53'),(1025,'2005-05-31 03:41:37',1618,93,'2005-06-08 07:05:37',2,'2006-02-15 21:30:53'),(1026,'2005-05-31 03:45:26',632,107,'2005-06-06 22:30:26',2,'2006-02-15 21:30:53'),(1027,'2005-05-31 03:46:19',2718,55,'2005-06-09 03:50:19',1,'2006-02-15 21:30:53'),(1028,'2005-05-31 03:48:05',4479,51,'2005-06-01 03:51:05',1,'2006-02-15 21:30:53'),(1029,'2005-05-31 03:52:02',2082,50,'2005-06-06 08:10:02',1,'2006-02-15 21:30:53'),(1030,'2005-05-31 04:06:47',3948,267,'2005-06-02 02:59:47',1,'2006-02-15 21:30:53'),(1031,'2005-05-31 04:23:01',917,416,'2005-06-06 08:35:01',1,'2006-02-15 21:30:53'),(1032,'2005-05-31 04:28:43',2937,236,'2005-06-02 02:00:43',2,'2006-02-15 21:30:53'),(1033,'2005-05-31 04:50:07',14,25,'2005-06-02 01:53:07',1,'2006-02-15 21:30:53'),(1034,'2005-05-31 04:53:40',4117,293,'2005-06-09 08:25:40',2,'2006-02-15 21:30:53'),(1035,'2005-05-31 05:01:09',949,362,'2005-06-02 03:59:09',1,'2006-02-15 21:30:53'),(1036,'2005-05-31 05:21:10',2164,438,'2005-06-04 04:19:10',1,'2006-02-15 21:30:53'),(1037,'2005-05-31 05:22:25',810,569,'2005-06-09 04:52:25',1,'2006-02-15 21:30:53'),(1038,'2005-05-31 05:23:47',1253,385,'2005-06-02 03:57:47',2,'2006-02-15 21:30:53'),(1039,'2005-05-31 05:32:29',2479,124,'2005-06-01 06:04:29',2,'2006-02-15 21:30:53'),(1040,'2005-05-31 05:35:16',2546,270,'2005-06-09 04:14:16',1,'2006-02-15 21:30:53'),(1041,'2005-05-31 05:46:23',4432,272,'2005-06-06 09:50:23',2,'2006-02-15 21:30:53'),(1042,'2005-05-31 05:53:00',3155,506,'2005-06-01 05:24:00',1,'2006-02-15 21:30:53'),(1043,'2005-05-31 06:11:40',2322,412,'2005-06-08 09:15:40',2,'2006-02-15 21:30:53'),(1044,'2005-05-31 06:24:44',2574,70,'2005-06-03 04:51:44',1,'2006-02-15 21:30:53'),(1045,'2005-05-31 06:29:01',3470,594,'2005-06-09 04:31:01',1,'2006-02-15 21:30:53'),(1046,'2005-05-31 06:42:30',468,179,'2005-06-03 04:33:30',2,'2006-02-15 21:30:53'),(1047,'2005-05-31 06:45:57',1366,72,'2005-06-04 09:49:57',2,'2006-02-15 21:30:53'),(1048,'2005-05-31 06:49:53',2811,55,'2005-06-02 11:33:53',1,'2006-02-15 21:30:53'),(1049,'2005-05-31 06:57:04',3913,312,'2005-06-02 11:32:04',2,'2006-02-15 21:30:53'),(1050,'2005-05-31 07:01:27',726,303,'2005-06-03 07:50:27',2,'2006-02-15 21:30:53'),(1051,'2005-05-31 07:02:09',1025,246,'2005-06-03 01:32:09',1,'2006-02-15 21:30:53'),(1052,'2005-05-31 07:07:03',2157,156,'2005-06-05 09:38:03',1,'2006-02-15 21:30:53'),(1053,'2005-05-31 07:12:44',3734,196,'2005-06-04 12:33:44',1,'2006-02-15 21:30:53'),(1054,'2005-05-31 07:33:25',1575,126,'2005-06-02 01:40:25',2,'2006-02-15 21:30:53'),(1055,'2005-05-31 07:47:18',1639,108,'2005-06-03 01:57:18',1,'2006-02-15 21:30:53'),(1056,'2005-05-31 07:48:07',1591,519,'2005-06-05 08:51:07',2,'2006-02-15 21:30:53'),(1057,'2005-05-31 07:58:06',497,124,'2005-06-06 03:21:06',1,'2006-02-15 21:30:53'),(1058,'2005-05-31 08:04:17',40,116,'2005-06-03 11:12:17',2,'2006-02-15 21:30:53'),(1059,'2005-05-31 08:20:43',3041,241,'2005-06-04 09:05:43',2,'2006-02-15 21:30:53'),(1060,'2005-05-31 08:21:43',2676,570,'2005-06-09 04:02:43',2,'2006-02-15 21:30:53'),(1061,'2005-05-31 08:27:58',965,109,'2005-06-07 02:34:58',1,'2006-02-15 21:30:53'),(1062,'2005-05-31 08:38:20',2223,176,'2005-06-09 08:23:20',2,'2006-02-15 21:30:53'),(1063,'2005-05-31 08:44:29',2484,7,'2005-06-09 08:00:29',1,'2006-02-15 21:30:53'),(1064,'2005-05-31 08:50:07',2373,460,'2005-06-02 14:47:07',2,'2006-02-15 21:30:53'),(1065,'2005-05-31 08:54:56',3379,316,'2005-06-08 09:21:56',1,'2006-02-15 21:30:53'),(1066,'2005-05-31 09:07:33',2383,541,'2005-06-09 05:34:33',2,'2006-02-15 21:30:53'),(1067,'2005-05-31 09:12:13',2345,32,'2005-06-01 06:15:13',1,'2006-02-15 21:30:53'),(1068,'2005-05-31 09:32:15',150,443,'2005-06-01 11:20:15',1,'2006-02-15 21:30:53'),(1069,'2005-05-31 09:32:31',3057,251,'2005-06-08 10:19:31',2,'2006-02-15 21:30:53'),(1070,'2005-05-31 09:39:56',3170,228,'2005-06-05 10:23:56',1,'2006-02-15 21:30:53'),(1071,'2005-05-31 09:48:56',469,174,'2005-06-02 03:52:56',2,'2006-02-15 21:30:53'),(1072,'2005-05-31 09:52:50',2557,272,'2005-06-05 05:39:50',1,'2006-02-15 21:30:53'),(1073,'2005-05-31 09:55:04',522,146,'2005-06-07 03:55:04',1,'2006-02-15 21:30:53'),(1074,'2005-05-31 10:04:42',2508,503,'2005-06-02 15:27:42',2,'2006-02-15 21:30:53'),(1075,'2005-05-31 10:13:34',2279,9,'2005-06-09 08:11:34',1,'2006-02-15 21:30:53'),(1076,'2005-05-31 10:14:31',2551,214,'2005-06-05 10:13:31',2,'2006-02-15 21:30:53'),(1077,'2005-05-31 10:22:54',1986,24,'2005-06-02 12:21:54',1,'2006-02-15 21:30:53'),(1078,'2005-05-31 10:28:33',3682,230,'2005-06-03 14:45:33',2,'2006-02-15 21:30:53'),(1079,'2005-05-31 10:48:17',268,312,'2005-06-08 12:30:17',1,'2006-02-15 21:30:53'),(1080,'2005-05-31 10:55:26',3491,215,'2005-06-03 13:13:26',2,'2006-02-15 21:30:53'),(1081,'2005-05-31 10:56:32',4524,404,'2005-06-06 11:31:32',1,'2006-02-15 21:30:53'),(1082,'2005-05-31 11:02:01',4510,239,'2005-06-05 08:43:01',1,'2006-02-15 21:30:53'),(1083,'2005-05-31 11:04:48',2393,556,'2005-06-05 13:32:48',1,'2006-02-15 21:30:53'),(1084,'2005-05-31 11:10:17',4577,12,'2005-06-01 11:15:17',1,'2006-02-15 21:30:53'),(1085,'2005-05-31 11:15:43',301,5,'2005-06-07 12:02:43',1,'2006-02-15 21:30:53'),(1086,'2005-05-31 11:17:37',2909,549,'2005-06-06 13:58:37',2,'2006-02-15 21:30:53'),(1087,'2005-05-31 11:18:08',431,169,'2005-06-04 08:33:08',1,'2006-02-15 21:30:53'),(1088,'2005-05-31 11:35:13',3988,356,'2005-06-06 16:01:13',2,'2006-02-15 21:30:53'),(1089,'2005-05-31 11:38:29',3784,367,'2005-06-02 08:06:29',1,'2006-02-15 21:30:53'),(1090,'2005-05-31 12:03:44',3329,23,'2005-06-02 15:54:44',2,'2006-02-15 21:30:53'),(1091,'2005-05-31 12:11:04',3853,251,'2005-06-04 11:42:04',1,'2006-02-15 21:30:53'),(1092,'2005-05-31 12:15:57',4412,278,'2005-06-03 15:39:57',2,'2006-02-15 21:30:53'),(1093,'2005-05-31 12:32:26',2189,214,'2005-06-03 07:51:26',2,'2006-02-15 21:30:53'),(1094,'2005-05-31 13:03:49',3810,547,'2005-06-05 14:30:49',2,'2006-02-15 21:30:53'),(1095,'2005-05-31 13:15:41',4546,252,'2005-06-05 12:10:41',1,'2006-02-15 21:30:53'),(1096,'2005-05-31 13:30:49',1066,271,'2005-06-09 13:53:49',1,'2006-02-15 21:30:53'),(1097,'2005-05-31 13:38:42',2285,491,'2005-06-01 13:54:42',2,'2006-02-15 21:30:53'),(1098,'2005-05-31 13:51:48',1050,425,'2005-06-09 18:42:48',2,'2006-02-15 21:30:53'),(1099,'2005-05-31 13:54:48',924,269,'2005-06-05 13:04:48',2,'2006-02-15 21:30:53'),(1100,'2005-05-31 14:03:21',316,497,'2005-06-06 16:08:21',1,'2006-02-15 21:30:53'),(1101,'2005-05-31 14:13:59',1174,260,'2005-06-07 15:49:59',1,'2006-02-15 21:30:53'),(1102,'2005-05-31 14:20:29',2052,115,'2005-06-04 17:38:29',2,'2006-02-15 21:30:53'),(1103,'2005-05-31 14:24:18',3154,353,'2005-06-09 10:27:18',1,'2006-02-15 21:30:53'),(1104,'2005-05-31 14:30:01',1619,466,'2005-06-05 12:07:01',1,'2006-02-15 21:30:53'),(1105,'2005-05-31 14:33:56',1708,26,'2005-06-07 11:30:56',1,'2006-02-15 21:30:53'),(1106,'2005-05-31 14:36:52',4185,109,'2005-06-01 14:33:52',2,'2006-02-15 21:30:53'),(1107,'2005-05-31 15:04:05',3449,53,'2005-06-07 16:42:05',2,'2006-02-15 21:30:53'),(1108,'2005-05-31 15:05:12',2562,254,'2005-06-09 19:48:12',2,'2006-02-15 21:30:53'),(1109,'2005-05-31 15:12:15',2031,481,'2005-06-09 16:21:15',1,'2006-02-15 21:30:53'),(1110,'2005-05-31 15:22:51',2085,355,'2005-06-07 14:32:51',1,'2006-02-15 21:30:53'),(1111,'2005-05-31 15:24:19',1137,300,'2005-06-08 21:18:19',1,'2006-02-15 21:30:53'),(1112,'2005-05-31 15:51:39',2453,214,'2005-06-03 14:04:39',1,'2006-02-15 21:30:53'),(1113,'2005-05-31 15:58:44',2078,451,'2005-06-05 18:05:44',2,'2006-02-15 21:30:53'),(1114,'2005-05-31 16:00:33',2287,117,'2005-06-01 19:05:33',1,'2006-02-15 21:30:53'),(1115,'2005-05-31 16:07:09',2140,109,'2005-06-04 18:51:09',1,'2006-02-15 21:30:53'),(1116,'2005-05-31 16:10:46',1356,256,'2005-06-01 20:27:46',2,'2006-02-15 21:30:53'),(1117,'2005-05-31 16:15:31',4125,189,'2005-06-04 17:20:31',1,'2006-02-15 21:30:53'),(1118,'2005-05-31 16:23:02',213,510,'2005-06-03 20:00:02',1,'2006-02-15 21:30:53'),(1119,'2005-05-31 16:34:27',4401,469,'2005-06-02 10:54:27',1,'2006-02-15 21:30:53'),(1120,'2005-05-31 16:37:14',2897,361,'2005-06-04 12:53:14',1,'2006-02-15 21:30:53'),(1121,'2005-05-31 16:37:36',1691,74,'2005-06-06 21:02:36',1,'2006-02-15 21:30:53'),(1122,'2005-05-31 16:39:33',1392,180,'2005-06-04 17:25:33',1,'2006-02-15 21:30:53'),(1123,'2005-05-31 16:48:43',142,448,'2005-06-02 19:17:43',2,'2006-02-15 21:30:53'),(1124,'2005-05-31 16:49:34',4560,134,'2005-06-04 19:32:34',2,'2006-02-15 21:30:53'),(1125,'2005-05-31 17:23:44',1172,234,'2005-06-01 15:02:44',1,'2006-02-15 21:30:53'),(1126,'2005-05-31 17:27:45',2765,431,'2005-06-04 20:06:45',2,'2006-02-15 21:30:53'),(1127,'2005-05-31 17:45:49',2412,387,'2005-06-08 22:41:49',2,'2006-02-15 21:30:53'),(1128,'2005-05-31 17:49:26',1496,311,'2005-06-05 19:51:26',2,'2006-02-15 21:30:53'),(1129,'2005-05-31 18:00:48',386,486,'2005-06-04 23:05:48',1,'2006-02-15 21:30:53'),(1130,'2005-05-31 18:13:57',3186,124,'2005-06-06 22:50:57',2,'2006-02-15 21:30:53'),(1131,'2005-05-31 18:44:19',2654,128,'2005-06-01 20:13:19',1,'2006-02-15 21:30:53'),(1132,'2005-05-31 18:44:53',1763,198,'2005-06-07 22:02:53',2,'2006-02-15 21:30:53'),(1133,'2005-05-31 19:12:21',4271,73,'2005-06-02 20:12:21',1,'2006-02-15 21:30:53'),(1134,'2005-05-31 19:14:15',143,191,'2005-06-02 17:13:15',2,'2006-02-15 21:30:53'),(1135,'2005-05-31 19:15:11',3118,122,'2005-06-01 14:44:11',2,'2006-02-15 21:30:53'),(1136,'2005-05-31 19:19:36',3963,50,'2005-06-09 16:04:36',2,'2006-02-15 21:30:53'),(1137,'2005-05-31 19:20:14',3259,351,'2005-06-07 16:10:14',1,'2006-02-15 21:30:53'),(1138,'2005-05-31 19:30:27',3944,438,'2005-06-05 21:42:27',1,'2006-02-15 21:30:53'),(1139,'2005-05-31 19:34:52',666,562,'2005-06-06 17:40:52',1,'2006-02-15 21:30:53'),(1140,'2005-05-31 19:36:30',3731,10,'2005-06-07 18:33:30',2,'2006-02-15 21:30:53'),(1141,'2005-05-31 19:42:02',4128,217,'2005-06-07 00:59:02',2,'2006-02-15 21:30:53'),(1142,'2005-05-31 19:46:38',3998,5,'2005-06-05 14:03:38',1,'2006-02-15 21:30:53'),(1143,'2005-05-31 19:53:03',2632,209,'2005-06-06 20:56:03',2,'2006-02-15 21:30:53'),(1144,'2005-05-31 20:04:10',2450,207,'2005-06-09 16:34:10',1,'2006-02-15 21:30:53'),(1145,'2005-05-31 20:13:45',1133,284,'2005-06-08 02:10:45',1,'2006-02-15 21:30:53'),(1146,'2005-05-31 20:34:45',3134,250,'2005-06-03 18:12:45',2,'2006-02-15 21:30:53'),(1147,'2005-05-31 20:37:52',622,259,'2005-06-06 19:23:52',2,'2006-02-15 21:30:53'),(1148,'2005-05-31 20:38:40',3307,235,'2005-06-02 18:35:40',2,'2006-02-15 21:30:53'),(1149,'2005-05-31 21:03:17',352,326,'2005-06-08 19:58:17',2,'2006-02-15 21:30:53'),(1150,'2005-05-31 21:20:09',1632,136,'2005-06-03 19:15:09',2,'2006-02-15 21:30:53'),(1151,'2005-05-31 21:29:00',1281,581,'2005-06-03 23:24:00',1,'2006-02-15 21:30:53'),(1152,'2005-05-31 21:32:17',210,191,'2005-06-04 21:07:17',2,'2006-02-15 21:30:53'),(1153,'2005-05-31 21:36:44',2725,506,'2005-06-10 01:26:44',2,'2006-02-15 21:30:53'),(1154,'2005-05-31 21:42:09',2732,59,'2005-06-08 16:40:09',1,'2006-02-15 21:30:53'),(1155,'2005-05-31 22:17:11',2048,251,'2005-06-04 20:27:11',2,'2006-02-15 21:30:53'),(1156,'2005-05-31 22:37:34',460,106,'2005-06-01 23:02:34',2,'2006-02-15 21:30:53'),(1157,'2005-05-31 22:47:45',1449,61,'2005-06-02 18:01:45',1,'2006-02-15 21:30:53'),(1158,'2005-06-14 22:53:33',1632,416,'2005-06-18 21:37:33',2,'2006-02-15 21:30:53'),(1159,'2005-06-14 22:55:13',4395,516,'2005-06-17 02:11:13',1,'2006-02-15 21:30:53'),(1160,'2005-06-14 23:00:34',2795,239,'2005-06-18 01:58:34',2,'2006-02-15 21:30:53'),(1161,'2005-06-14 23:07:08',1690,285,'2005-06-21 17:12:08',1,'2006-02-15 21:30:53'),(1162,'2005-06-14 23:09:38',987,310,'2005-06-23 22:00:38',1,'2006-02-15 21:30:53'),(1163,'2005-06-14 23:12:46',4209,592,'2005-06-23 21:53:46',1,'2006-02-15 21:30:53'),(1164,'2005-06-14 23:16:26',3691,49,'2005-06-16 21:00:26',1,'2006-02-15 21:30:53'),(1165,'2005-06-14 23:16:27',2855,264,'2005-06-20 02:40:27',2,'2006-02-15 21:30:53'),(1166,'2005-06-14 23:17:03',2508,46,'2005-06-15 20:43:03',1,'2006-02-15 21:30:53'),(1167,'2005-06-14 23:25:58',4021,323,'2005-06-18 05:18:58',2,'2006-02-15 21:30:53'),(1168,'2005-06-14 23:35:09',4368,481,'2005-06-19 03:20:09',1,'2006-02-15 21:30:53'),(1169,'2005-06-14 23:42:56',1062,139,'2005-06-16 04:02:56',2,'2006-02-15 21:30:53'),(1170,'2005-06-14 23:47:35',2444,595,'2005-06-17 05:28:35',2,'2006-02-15 21:30:53'),(1171,'2005-06-14 23:50:11',4082,284,'2005-06-17 21:44:11',2,'2006-02-15 21:30:53'),(1172,'2005-06-14 23:54:34',2685,306,'2005-06-16 02:26:34',1,'2006-02-15 21:30:53'),(1173,'2005-06-14 23:54:46',1050,191,'2005-06-19 23:26:46',2,'2006-02-15 21:30:53'),(1174,'2005-06-15 00:12:51',2653,95,'2005-06-21 02:10:51',2,'2006-02-15 21:30:53'),(1175,'2005-06-15 00:15:15',3255,197,'2005-06-20 19:23:15',2,'2006-02-15 21:30:53'),(1176,'2005-06-15 00:28:37',2715,512,'2005-06-21 21:42:37',1,'2006-02-15 21:30:53'),(1177,'2005-06-15 00:33:04',1897,210,'2005-06-16 03:47:04',2,'2006-02-15 21:30:53'),(1178,'2005-06-15 00:36:40',2553,279,'2005-06-21 00:27:40',2,'2006-02-15 21:30:53'),(1179,'2005-06-15 00:36:50',816,119,'2005-06-22 22:09:50',1,'2006-02-15 21:30:53'),(1180,'2005-06-15 00:39:01',3119,432,'2005-06-21 22:44:01',2,'2006-02-15 21:30:53'),(1181,'2005-06-15 00:42:17',2973,546,'2005-06-19 03:36:17',2,'2006-02-15 21:30:53'),(1182,'2005-06-15 00:45:21',1061,196,'2005-06-22 03:52:21',1,'2006-02-15 21:30:53'),(1183,'2005-06-15 00:49:19',706,329,'2005-06-20 04:33:19',1,'2006-02-15 21:30:53'),(1184,'2005-06-15 00:49:36',473,295,'2005-06-22 23:39:36',2,'2006-02-15 21:30:53'),(1185,'2005-06-15 00:54:12',2785,1,'2005-06-23 02:42:12',2,'2006-02-15 21:30:53'),(1186,'2005-06-15 00:56:45',1556,368,'2005-06-16 02:23:45',1,'2006-02-15 21:30:53'),(1187,'2005-06-15 00:58:50',1108,334,'2005-06-23 02:19:50',1,'2006-02-15 21:30:53'),(1188,'2005-06-15 01:04:07',246,173,'2005-06-19 03:48:07',1,'2006-02-15 21:30:53'),(1189,'2005-06-15 01:04:22',142,244,'2005-06-24 06:48:22',1,'2006-02-15 21:30:53'),(1190,'2005-06-15 01:05:32',2572,370,'2005-06-23 02:34:32',2,'2006-02-15 21:30:53'),(1191,'2005-06-15 01:10:35',2221,291,'2005-06-17 20:36:35',2,'2006-02-15 21:30:53'),(1192,'2005-06-15 01:18:39',4134,186,'2005-06-19 22:46:39',1,'2006-02-15 21:30:53'),(1193,'2005-06-15 01:24:20',4504,561,'2005-06-21 02:29:20',2,'2006-02-15 21:30:53'),(1194,'2005-06-15 01:25:08',3774,402,'2005-06-21 01:16:08',2,'2006-02-15 21:30:53'),(1195,'2005-06-15 01:37:38',2272,84,'2005-06-17 21:50:38',1,'2006-02-15 21:30:53'),(1196,'2005-06-15 01:38:31',994,52,'2005-06-18 06:55:31',1,'2006-02-15 21:30:53'),(1197,'2005-06-15 01:42:46',3812,349,'2005-06-20 00:22:46',1,'2006-02-15 21:30:53'),(1198,'2005-06-15 01:48:58',1138,491,'2005-06-20 01:07:58',2,'2006-02-15 21:30:53'),(1199,'2005-06-15 01:58:50',253,238,'2005-06-16 20:30:50',2,'2006-02-15 21:30:53'),(1200,'2005-06-15 01:59:51',3329,516,'2005-06-21 21:33:51',1,'2006-02-15 21:30:53'),(1201,'2005-06-15 02:06:28',2679,209,'2005-06-16 21:38:28',2,'2006-02-15 21:30:53'),(1202,'2005-06-15 02:08:04',2821,451,'2005-06-16 21:56:04',1,'2006-02-15 21:30:53'),(1203,'2005-06-15 02:09:02',2223,452,'2005-06-21 00:04:02',1,'2006-02-15 21:30:53'),(1204,'2005-06-15 02:21:46',2450,249,'2005-06-20 07:14:46',2,'2006-02-15 21:30:53'),(1205,'2005-06-15 02:25:56',470,340,'2005-06-22 23:19:56',1,'2006-02-15 21:30:53'),(1206,'2005-06-15 02:27:07',1097,264,'2005-06-18 22:46:07',2,'2006-02-15 21:30:53'),(1207,'2005-06-15 02:27:08',2277,430,'2005-06-19 08:18:08',2,'2006-02-15 21:30:53'),(1208,'2005-06-15 02:30:03',750,376,'2005-06-18 00:04:03',1,'2006-02-15 21:30:53'),(1209,'2005-06-15 02:31:12',1494,146,'2005-06-21 07:39:12',1,'2006-02-15 21:30:53'),(1210,'2005-06-15 02:57:51',7,345,'2005-06-20 01:41:51',2,'2006-02-15 21:30:53'),(1211,'2005-06-15 03:01:20',3360,122,'2005-06-18 07:52:20',2,'2006-02-15 21:30:53'),(1212,'2005-06-15 03:03:33',3611,371,'2005-06-17 06:31:33',1,'2006-02-15 21:30:53'),(1213,'2005-06-15 03:14:05',3191,94,'2005-06-15 21:41:05',2,'2006-02-15 21:30:53'),(1214,'2005-06-15 03:18:40',4482,46,'2005-06-20 07:32:40',1,'2006-02-15 21:30:53'),(1215,'2005-06-15 03:21:00',242,102,'2005-06-19 03:39:00',1,'2006-02-15 21:30:53'),(1216,'2005-06-15 03:23:48',3973,100,'2005-06-18 03:35:48',1,'2006-02-15 21:30:53'),(1217,'2005-06-15 03:24:14',600,203,'2005-06-18 22:37:14',2,'2006-02-15 21:30:53'),(1218,'2005-06-15 03:24:44',239,371,'2005-06-21 22:45:44',2,'2006-02-15 21:30:53'),(1219,'2005-06-15 03:25:59',3005,330,'2005-06-20 00:37:59',1,'2006-02-15 21:30:53'),(1220,'2005-06-15 03:26:15',1621,290,'2005-06-23 08:17:15',1,'2006-02-15 21:30:53'),(1221,'2005-06-15 03:35:16',2124,403,'2005-06-18 03:11:16',1,'2006-02-15 21:30:53'),(1222,'2005-06-15 03:38:49',2799,168,'2005-06-17 22:30:49',1,'2006-02-15 21:30:53'),(1223,'2005-06-15 03:38:53',1299,50,'2005-06-20 01:00:53',2,'2006-02-15 21:30:53'),(1224,'2005-06-15 03:44:25',1572,369,'2005-06-17 03:49:25',2,'2006-02-15 21:30:53'),(1225,'2005-06-15 03:45:35',1929,434,'2005-06-19 02:03:35',1,'2006-02-15 21:30:53'),(1226,'2005-06-15 03:46:10',2290,409,'2005-06-23 02:00:10',1,'2006-02-15 21:30:53'),(1227,'2005-06-15 03:50:03',654,428,'2005-06-21 23:48:03',2,'2006-02-15 21:30:53'),(1228,'2005-06-15 03:50:36',4473,398,'2005-06-17 22:41:36',1,'2006-02-15 21:30:53'),(1229,'2005-06-15 03:53:13',2140,468,'2005-06-18 04:09:13',1,'2006-02-15 21:30:53'),(1230,'2005-06-15 04:04:09',2324,447,'2005-06-16 02:21:09',1,'2006-02-15 21:30:53'),(1231,'2005-06-15 04:04:41',3003,302,'2005-06-20 23:52:41',2,'2006-02-15 21:30:53'),(1232,'2005-06-15 04:18:10',2743,391,'2005-06-17 06:02:10',2,'2006-02-15 21:30:53'),(1233,'2005-06-15 04:18:37',4214,550,'2005-06-22 03:36:37',1,'2006-02-15 21:30:53'),(1234,'2005-06-15 04:21:52',709,529,'2005-06-22 03:25:52',1,'2006-02-15 21:30:53'),(1235,'2005-06-15 04:31:28',1000,255,'2005-06-22 10:08:28',1,'2006-02-15 21:30:53'),(1236,'2005-06-15 04:34:27',3182,66,'2005-06-18 08:15:27',1,'2006-02-15 21:30:53'),(1237,'2005-06-15 04:44:10',3249,49,'2005-06-23 07:00:10',2,'2006-02-15 21:30:53'),(1238,'2005-06-15 04:49:08',3534,205,'2005-06-20 00:06:08',1,'2006-02-15 21:30:53'),(1239,'2005-06-15 04:53:01',3731,444,'2005-06-16 07:03:01',1,'2006-02-15 21:30:53'),(1240,'2005-06-15 04:58:07',3841,28,'2005-06-17 23:56:07',1,'2006-02-15 21:30:53'),(1241,'2005-06-15 04:59:43',4377,62,'2005-06-24 03:32:43',2,'2006-02-15 21:30:53'),(1242,'2005-06-15 05:05:07',821,141,'2005-06-22 04:57:07',1,'2006-02-15 21:30:53'),(1243,'2005-06-15 05:07:32',2629,107,'2005-06-21 08:17:32',2,'2006-02-15 21:30:53'),(1244,'2005-06-15 05:08:40',1026,515,'2005-06-20 10:41:40',1,'2006-02-15 21:30:53'),(1245,'2005-06-15 05:09:01',1314,234,'2005-06-22 06:55:01',2,'2006-02-15 21:30:53'),(1246,'2005-06-15 05:11:19',431,357,'2005-06-21 02:21:19',1,'2006-02-15 21:30:53'),(1247,'2005-06-15 05:16:40',4049,287,'2005-06-23 11:01:40',1,'2006-02-15 21:30:53'),(1248,'2005-06-15 05:33:52',3878,544,'2005-06-19 06:56:52',2,'2006-02-15 21:30:53'),(1249,'2005-06-15 05:38:09',2120,403,'2005-06-22 10:29:09',1,'2006-02-15 21:30:53'),(1250,'2005-06-15 05:55:40',4360,38,'2005-06-23 03:11:40',2,'2006-02-15 21:30:53'),(1251,'2005-06-15 05:58:55',3307,442,'2005-06-23 02:45:55',2,'2006-02-15 21:30:53'),(1252,'2005-06-15 06:05:18',1147,89,'2005-06-24 07:40:18',1,'2006-02-15 21:30:53'),(1253,'2005-06-15 06:06:33',3242,498,'2005-06-21 04:13:33',2,'2006-02-15 21:30:53'),(1254,'2005-06-15 06:11:16',3986,571,'2005-06-21 06:40:16',2,'2006-02-15 21:30:53'),(1255,'2005-06-15 06:13:45',1433,526,'2005-06-16 03:59:45',2,'2006-02-15 21:30:53'),(1256,'2005-06-15 06:13:57',1437,470,'2005-06-16 06:54:57',2,'2006-02-15 21:30:53'),(1257,'2005-06-15 06:15:36',1938,267,'2005-06-21 01:04:36',2,'2006-02-15 21:30:53'),(1258,'2005-06-15 06:21:30',4530,320,'2005-06-18 05:43:30',2,'2006-02-15 21:30:53'),(1259,'2005-06-15 06:37:55',4460,570,'2005-06-23 04:02:55',2,'2006-02-15 21:30:53'),(1260,'2005-06-15 06:42:25',330,586,'2005-06-16 10:44:25',2,'2006-02-15 21:30:53'),(1261,'2005-06-15 06:52:57',2447,95,'2005-06-21 01:47:57',2,'2006-02-15 21:30:53'),(1262,'2005-06-15 06:54:53',4495,236,'2005-06-22 08:09:53',2,'2006-02-15 21:30:53'),(1263,'2005-06-15 06:56:39',4144,540,'2005-06-16 11:08:39',1,'2006-02-15 21:30:53'),(1264,'2005-06-15 06:59:39',4176,439,'2005-06-18 08:10:39',2,'2006-02-15 21:30:53'),(1265,'2005-06-15 07:00:50',982,163,'2005-06-19 12:27:50',1,'2006-02-15 21:30:53'),(1266,'2005-06-15 07:11:39',2230,96,'2005-06-21 02:59:39',2,'2006-02-15 21:30:53'),(1267,'2005-06-15 07:21:21',4246,509,'2005-06-17 08:12:21',2,'2006-02-15 21:30:53'),(1268,'2005-06-15 07:29:30',3641,142,'2005-06-23 12:36:30',1,'2006-02-15 21:30:53'),(1269,'2005-06-15 07:29:59',108,59,'2005-06-16 13:26:59',2,'2006-02-15 21:30:53'),(1270,'2005-06-15 07:30:22',62,395,'2005-06-18 11:31:22',2,'2006-02-15 21:30:53'),(1271,'2005-06-15 07:32:24',379,560,'2005-06-21 05:12:24',1,'2006-02-15 21:30:53'),(1272,'2005-06-15 07:42:58',3128,135,'2005-06-18 12:00:58',1,'2006-02-15 21:30:53'),(1273,'2005-06-15 07:52:35',361,530,'2005-06-21 04:55:35',1,'2006-02-15 21:30:53'),(1274,'2005-06-15 07:52:52',2765,430,'2005-06-20 10:01:52',1,'2006-02-15 21:30:53'),(1275,'2005-06-15 07:55:43',950,214,'2005-06-20 06:30:43',1,'2006-02-15 21:30:53'),(1276,'2005-06-15 08:00:13',1508,388,'2005-06-24 02:55:13',2,'2006-02-15 21:30:53'),(1277,'2005-06-15 08:01:29',76,464,'2005-06-22 07:16:29',2,'2006-02-15 21:30:53'),(1278,'2005-06-15 08:09:12',4471,191,'2005-06-17 04:05:12',2,'2006-02-15 21:30:53'),(1279,'2005-06-15 08:13:57',698,183,'2005-06-18 09:36:57',2,'2006-02-15 21:30:53'),(1280,'2005-06-15 08:16:06',2597,266,'2005-06-21 04:10:06',2,'2006-02-15 21:30:53'),(1281,'2005-06-15 08:21:39',2963,511,'2005-06-17 11:03:39',1,'2006-02-15 21:30:53'),(1282,'2005-06-15 08:25:33',186,539,'2005-06-21 04:02:33',1,'2006-02-15 21:30:53'),(1283,'2005-06-15 08:27:30',3177,470,'2005-06-16 09:46:30',2,'2006-02-15 21:30:53'),(1284,'2005-06-15 08:27:33',1387,463,'2005-06-17 03:58:33',1,'2006-02-15 21:30:53'),(1285,'2005-06-15 08:33:06',1054,254,'2005-06-19 07:36:06',1,'2006-02-15 21:30:53'),(1286,'2005-06-15 08:41:13',774,179,'2005-06-23 13:13:13',2,'2006-02-15 21:30:53'),(1287,'2005-06-15 08:41:38',4204,104,'2005-06-22 14:02:38',1,'2006-02-15 21:30:53'),(1288,'2005-06-15 08:41:52',830,456,'2005-06-19 05:30:52',2,'2006-02-15 21:30:53'),(1289,'2005-06-15 08:44:09',3154,522,'2005-06-21 06:04:09',1,'2006-02-15 21:30:53'),(1290,'2005-06-15 08:52:44',1921,540,'2005-06-24 13:36:44',2,'2006-02-15 21:30:53'),(1291,'2005-06-15 08:55:01',3090,176,'2005-06-24 04:22:01',1,'2006-02-15 21:30:53'),(1292,'2005-06-15 09:03:52',4535,178,'2005-06-21 07:53:52',1,'2006-02-15 21:30:53'),(1293,'2005-06-15 09:06:24',2882,127,'2005-06-18 06:58:24',1,'2006-02-15 21:30:53'),(1294,'2005-06-15 09:09:27',339,327,'2005-06-19 04:43:27',1,'2006-02-15 21:30:53'),(1295,'2005-06-15 09:17:20',2897,449,'2005-06-18 10:14:20',2,'2006-02-15 21:30:53'),(1296,'2005-06-15 09:23:59',1760,200,'2005-06-19 03:44:59',2,'2006-02-15 21:30:53'),(1297,'2005-06-15 09:31:28',1075,4,'2005-06-19 04:33:28',1,'2006-02-15 21:30:53'),(1298,'2005-06-15 09:32:53',4163,334,'2005-06-16 12:40:53',2,'2006-02-15 21:30:53'),(1299,'2005-06-15 09:34:50',1584,91,'2005-06-21 12:07:50',1,'2006-02-15 21:30:53'),(1300,'2005-06-15 09:36:19',2524,186,'2005-06-17 13:54:19',2,'2006-02-15 21:30:53'),(1301,'2005-06-15 09:46:33',1484,33,'2005-06-24 08:56:33',2,'2006-02-15 21:30:53'),(1302,'2005-06-15 09:48:37',324,285,'2005-06-22 06:18:37',1,'2006-02-15 21:30:53'),(1303,'2005-06-15 09:55:57',2001,365,'2005-06-20 14:26:57',2,'2006-02-15 21:30:53'),(1304,'2005-06-15 09:56:02',1304,242,'2005-06-24 07:00:02',1,'2006-02-15 21:30:53'),(1305,'2005-06-15 09:59:16',187,8,'2005-06-19 09:48:16',2,'2006-02-15 21:30:53'),(1306,'2005-06-15 09:59:24',2132,524,'2005-06-19 09:37:24',2,'2006-02-15 21:30:53'),(1307,'2005-06-15 10:06:15',368,507,'2005-06-20 04:50:15',2,'2006-02-15 21:30:53'),(1308,'2005-06-15 10:07:48',220,236,'2005-06-24 15:24:48',1,'2006-02-15 21:30:53'),(1309,'2005-06-15 10:10:49',2356,200,'2005-06-16 12:44:49',1,'2006-02-15 21:30:53'),(1310,'2005-06-15 10:11:42',2045,27,'2005-06-16 15:00:42',1,'2006-02-15 21:30:53'),(1311,'2005-06-15 10:11:59',3114,326,'2005-06-17 08:44:59',2,'2006-02-15 21:30:53'),(1312,'2005-06-15 10:16:27',3608,313,'2005-06-20 06:53:27',1,'2006-02-15 21:30:53'),(1313,'2005-06-15 10:18:34',1657,448,'2005-06-23 06:25:34',1,'2006-02-15 21:30:53'),(1314,'2005-06-15 10:21:45',1359,538,'2005-06-21 14:10:45',1,'2006-02-15 21:30:53'),(1315,'2005-06-15 10:23:08',3844,405,'2005-06-21 15:06:08',1,'2006-02-15 21:30:53'),(1316,'2005-06-15 10:26:23',3891,138,'2005-06-21 09:25:23',2,'2006-02-15 21:30:53'),(1317,'2005-06-15 10:30:19',3696,316,'2005-06-24 08:18:19',1,'2006-02-15 21:30:53'),(1318,'2005-06-15 10:34:26',2760,341,'2005-06-20 16:20:26',1,'2006-02-15 21:30:53'),(1319,'2005-06-15 10:39:05',4296,190,'2005-06-18 05:25:05',1,'2006-02-15 21:30:53'),(1320,'2005-06-15 10:42:13',4484,84,'2005-06-17 13:44:13',1,'2006-02-15 21:30:53'),(1321,'2005-06-15 10:49:17',3516,204,'2005-06-16 15:30:17',1,'2006-02-15 21:30:53'),(1322,'2005-06-15 10:55:09',2076,217,'2005-06-18 15:14:09',2,'2006-02-15 21:30:53'),(1323,'2005-06-15 10:55:17',3273,187,'2005-06-24 09:51:17',1,'2006-02-15 21:30:53'),(1324,'2005-06-15 11:02:45',764,394,'2005-06-17 07:14:45',1,'2006-02-15 21:30:53'),(1325,'2005-06-15 11:03:24',52,193,'2005-06-20 10:54:24',1,'2006-02-15 21:30:53'),(1326,'2005-06-15 11:07:39',59,548,'2005-06-22 05:55:39',2,'2006-02-15 21:30:53'),(1327,'2005-06-15 11:11:39',403,539,'2005-06-22 10:45:39',1,'2006-02-15 21:30:53'),(1328,'2005-06-15 11:23:27',3665,295,'2005-06-19 12:42:27',2,'2006-02-15 21:30:53'),(1329,'2005-06-15 11:25:06',1154,359,'2005-06-17 16:10:06',2,'2006-02-15 21:30:53'),(1330,'2005-06-15 11:29:17',1219,587,'2005-06-24 13:36:17',2,'2006-02-15 21:30:53'),(1331,'2005-06-15 11:34:33',3089,277,'2005-06-21 09:46:33',1,'2006-02-15 21:30:53'),(1332,'2005-06-15 11:36:01',1412,116,'2005-06-17 14:29:01',1,'2006-02-15 21:30:53'),(1333,'2005-06-15 11:37:08',448,310,'2005-06-16 10:13:08',2,'2006-02-15 21:30:53'),(1334,'2005-06-15 11:43:09',1242,269,'2005-06-20 15:45:09',2,'2006-02-15 21:30:53'),(1335,'2005-06-15 11:51:30',1713,64,'2005-06-16 16:42:30',2,'2006-02-15 21:30:53'),(1336,'2005-06-15 12:01:34',1696,290,'2005-06-23 12:05:34',1,'2006-02-15 21:30:53'),(1337,'2005-06-15 12:12:42',4014,465,'2005-06-20 12:38:42',2,'2006-02-15 21:30:53'),(1338,'2005-06-15 12:17:34',1206,25,'2005-06-19 07:40:34',2,'2006-02-15 21:30:53'),(1339,'2005-06-15 12:21:56',424,162,'2005-06-19 07:46:56',1,'2006-02-15 21:30:53'),(1340,'2005-06-15 12:24:15',251,100,'2005-06-22 13:02:15',1,'2006-02-15 21:30:53'),(1341,'2005-06-15 12:26:18',3363,344,'2005-06-21 07:26:18',2,'2006-02-15 21:30:53'),(1342,'2005-06-15 12:26:21',4429,427,'2005-06-22 11:23:21',1,'2006-02-15 21:30:53'),(1343,'2005-06-15 12:27:19',2393,416,'2005-06-21 16:57:19',1,'2006-02-15 21:30:53'),(1344,'2005-06-15 12:29:41',1625,585,'2005-06-22 12:45:41',2,'2006-02-15 21:30:53'),(1345,'2005-06-15 12:32:13',1041,270,'2005-06-24 14:02:13',1,'2006-02-15 21:30:53'),(1346,'2005-06-15 12:39:52',4540,585,'2005-06-24 17:43:52',1,'2006-02-15 21:30:53'),(1347,'2005-06-15 12:43:43',374,190,'2005-06-16 09:55:43',1,'2006-02-15 21:30:53'),(1348,'2005-06-15 12:45:30',2078,196,'2005-06-17 17:12:30',1,'2006-02-15 21:30:53'),(1349,'2005-06-15 12:49:02',1131,267,'2005-06-17 15:20:02',1,'2006-02-15 21:30:53'),(1350,'2005-06-15 12:50:25',4261,316,'2005-06-23 11:35:25',1,'2006-02-15 21:30:53'),(1351,'2005-06-15 12:51:03',2364,484,'2005-06-22 07:23:03',1,'2006-02-15 21:30:53'),(1352,'2005-06-15 12:58:27',4352,276,'2005-06-18 10:57:27',1,'2006-02-15 21:30:53'),(1353,'2005-06-15 13:13:36',2711,480,'2005-06-21 08:46:36',2,'2006-02-15 21:30:53'),(1354,'2005-06-15 13:13:49',1294,83,'2005-06-23 13:08:49',2,'2006-02-15 21:30:53'),(1355,'2005-06-15 13:13:59',4203,499,'2005-06-20 12:23:59',1,'2006-02-15 21:30:53'),(1356,'2005-06-15 13:17:01',1318,212,'2005-06-19 16:22:01',1,'2006-02-15 21:30:53'),(1357,'2005-06-15 13:26:23',2285,205,'2005-06-23 14:12:23',1,'2006-02-15 21:30:53'),(1358,'2005-06-15 13:28:48',2025,442,'2005-06-21 13:40:48',1,'2006-02-15 21:30:53'),(1359,'2005-06-15 13:30:30',3140,353,'2005-06-17 14:55:30',1,'2006-02-15 21:30:53'),(1360,'2005-06-15 13:32:15',4107,14,'2005-06-18 10:59:15',2,'2006-02-15 21:30:53'),(1361,'2005-06-15 13:37:38',4338,115,'2005-06-19 17:08:38',1,'2006-02-15 21:30:53'),(1362,'2005-06-15 13:53:32',4524,98,'2005-06-19 16:05:32',1,'2006-02-15 21:30:53'),(1363,'2005-06-15 14:05:11',771,197,'2005-06-17 19:53:11',2,'2006-02-15 21:30:53'),(1364,'2005-06-15 14:05:32',115,400,'2005-06-16 15:31:32',1,'2006-02-15 21:30:53'),(1365,'2005-06-15 14:09:55',3813,25,'2005-06-19 18:11:55',2,'2006-02-15 21:30:53'),(1366,'2005-06-15 14:21:00',4238,576,'2005-06-24 17:36:00',1,'2006-02-15 21:30:53'),(1367,'2005-06-15 14:25:17',1505,94,'2005-06-21 19:15:17',1,'2006-02-15 21:30:53'),(1368,'2005-06-15 14:27:47',2020,222,'2005-06-23 18:07:47',2,'2006-02-15 21:30:53'),(1369,'2005-06-15 14:29:14',679,221,'2005-06-16 13:01:14',1,'2006-02-15 21:30:53'),(1370,'2005-06-15 14:31:05',644,396,'2005-06-22 19:23:05',2,'2006-02-15 21:30:53'),(1371,'2005-06-15 14:38:15',760,491,'2005-06-23 15:36:15',1,'2006-02-15 21:30:53'),(1372,'2005-06-15 14:45:48',3740,108,'2005-06-17 18:02:48',2,'2006-02-15 21:30:53'),(1373,'2005-06-15 14:48:04',284,51,'2005-06-22 09:48:04',1,'2006-02-15 21:30:53'),(1374,'2005-06-15 14:49:54',3353,120,'2005-06-22 12:30:54',1,'2006-02-15 21:30:53'),(1375,'2005-06-15 14:54:56',3555,500,'2005-06-21 14:48:56',2,'2006-02-15 21:30:53'),(1376,'2005-06-15 14:59:06',4271,215,'2005-06-19 17:34:06',1,'2006-02-15 21:30:53'),(1377,'2005-06-15 15:02:03',3410,245,'2005-06-22 14:54:03',2,'2006-02-15 21:30:53'),(1378,'2005-06-15 15:03:15',4372,253,'2005-06-19 16:50:15',1,'2006-02-15 21:30:53'),(1379,'2005-06-15 15:05:10',810,212,'2005-06-18 12:11:10',1,'2006-02-15 21:30:53'),(1380,'2005-06-15 15:13:10',3376,158,'2005-06-18 12:42:10',2,'2006-02-15 21:30:53'),(1381,'2005-06-15 15:17:21',3262,300,'2005-06-20 17:07:21',2,'2006-02-15 21:30:53'),(1382,'2005-06-15 15:18:08',3133,455,'2005-06-22 09:22:08',2,'2006-02-15 21:30:53'),(1383,'2005-06-15 15:20:06',1281,379,'2005-06-24 18:42:06',2,'2006-02-15 21:30:53'),(1384,'2005-06-15 15:22:03',4242,242,'2005-06-18 18:11:03',1,'2006-02-15 21:30:53'),(1385,'2005-06-15 15:28:23',4073,396,'2005-06-18 18:37:23',1,'2006-02-15 21:30:53'),(1386,'2005-06-15 15:38:58',1296,322,'2005-06-20 16:28:58',2,'2006-02-15 21:30:53'),(1387,'2005-06-15 15:40:56',515,278,'2005-06-17 10:39:56',1,'2006-02-15 21:30:53'),(1388,'2005-06-15 15:48:41',3987,500,'2005-06-22 17:51:41',1,'2006-02-15 21:30:53'),(1389,'2005-06-15 15:49:01',965,472,'2005-06-19 11:08:01',2,'2006-02-15 21:30:53'),(1390,'2005-06-15 16:06:29',4502,254,'2005-06-19 13:11:29',1,'2006-02-15 21:30:53'),(1391,'2005-06-15 16:11:21',4213,273,'2005-06-22 21:32:21',1,'2006-02-15 21:30:53'),(1392,'2005-06-15 16:12:27',363,460,'2005-06-16 17:30:27',2,'2006-02-15 21:30:53'),(1393,'2005-06-15 16:12:50',2767,177,'2005-06-19 10:40:50',2,'2006-02-15 21:30:53'),(1394,'2005-06-15 16:17:21',2802,268,'2005-06-21 20:44:21',2,'2006-02-15 21:30:53'),(1395,'2005-06-15 16:21:04',753,252,'2005-06-23 12:52:04',2,'2006-02-15 21:30:53'),(1396,'2005-06-15 16:22:38',1007,103,'2005-06-17 15:53:38',2,'2006-02-15 21:30:53'),(1397,'2005-06-15 16:25:26',1830,444,'2005-06-21 20:45:26',1,'2006-02-15 21:30:53'),(1398,'2005-06-15 16:28:42',4402,527,'2005-06-16 12:11:42',1,'2006-02-15 21:30:53'),(1399,'2005-06-15 16:29:51',1435,469,'2005-06-18 14:06:51',1,'2006-02-15 21:30:53'),(1400,'2005-06-15 16:29:56',230,571,'2005-06-21 14:43:56',2,'2006-02-15 21:30:53'),(1401,'2005-06-15 16:30:22',4081,366,'2005-06-21 11:07:22',2,'2006-02-15 21:30:53'),(1402,'2005-06-15 16:31:08',1951,381,'2005-06-24 19:31:08',1,'2006-02-15 21:30:53'),(1403,'2005-06-15 16:31:59',3380,546,'2005-06-22 14:23:59',2,'2006-02-15 21:30:53'),(1404,'2005-06-15 16:38:53',2776,375,'2005-06-16 20:37:53',1,'2006-02-15 21:30:53'),(1405,'2005-06-15 16:41:26',3184,243,'2005-06-21 18:16:26',1,'2006-02-15 21:30:53'),(1406,'2005-06-15 16:44:00',3118,199,'2005-06-21 11:22:00',2,'2006-02-15 21:30:53'),(1407,'2005-06-15 16:45:07',1286,89,'2005-06-23 14:01:07',1,'2006-02-15 21:30:53'),(1408,'2005-06-15 16:57:58',2655,396,'2005-06-22 21:08:58',1,'2006-02-15 21:30:53'),(1409,'2005-06-15 16:58:12',1398,297,'2005-06-21 11:21:12',2,'2006-02-15 21:30:53'),(1410,'2005-06-15 16:59:46',809,356,'2005-06-21 16:38:46',1,'2006-02-15 21:30:53'),(1411,'2005-06-15 17:05:36',2276,520,'2005-06-21 14:05:36',1,'2006-02-15 21:30:53'),(1412,'2005-06-15 17:09:48',4236,166,'2005-06-18 17:05:48',2,'2006-02-15 21:30:53'),(1413,'2005-06-15 17:25:07',3625,96,'2005-06-21 17:17:07',2,'2006-02-15 21:30:53'),(1414,'2005-06-15 17:26:32',4005,304,'2005-06-22 22:30:32',1,'2006-02-15 21:30:53'),(1415,'2005-06-15 17:31:57',1885,331,'2005-06-16 22:22:57',2,'2006-02-15 21:30:53'),(1416,'2005-06-15 17:44:57',3816,167,'2005-06-22 20:53:57',2,'2006-02-15 21:30:53'),(1417,'2005-06-15 17:45:51',1334,570,'2005-06-19 14:00:51',2,'2006-02-15 21:30:53'),(1418,'2005-06-15 17:51:27',2974,591,'2005-06-18 23:20:27',2,'2006-02-15 21:30:53'),(1419,'2005-06-15 17:54:50',1208,312,'2005-06-17 19:44:50',2,'2006-02-15 21:30:53'),(1420,'2005-06-15 17:56:14',4149,255,'2005-06-24 15:45:14',2,'2006-02-15 21:30:53'),(1421,'2005-06-15 17:57:04',2439,533,'2005-06-21 20:38:04',2,'2006-02-15 21:30:53'),(1422,'2005-06-15 18:02:53',1021,1,'2005-06-19 15:54:53',2,'2006-02-15 21:30:53'),(1423,'2005-06-15 18:08:12',1396,592,'2005-06-24 19:13:12',1,'2006-02-15 21:30:53'),(1424,'2005-06-15 18:08:14',887,224,'2005-06-24 23:16:14',2,'2006-02-15 21:30:53'),(1425,'2005-06-15 18:13:46',1308,108,'2005-06-18 22:50:46',2,'2006-02-15 21:30:53'),(1426,'2005-06-15 18:16:24',4412,363,'2005-06-18 22:15:24',2,'2006-02-15 21:30:53'),(1427,'2005-06-15 18:17:28',14,100,'2005-06-16 15:47:28',1,'2006-02-15 21:30:53'),(1428,'2005-06-15 18:19:30',3689,583,'2005-06-22 23:05:30',2,'2006-02-15 21:30:53'),(1429,'2005-06-15 18:24:10',4116,362,'2005-06-18 16:30:10',1,'2006-02-15 21:30:53'),(1430,'2005-06-15 18:24:55',3412,194,'2005-06-16 12:26:55',1,'2006-02-15 21:30:53'),(1431,'2005-06-15 18:26:29',3193,438,'2005-06-21 17:33:29',1,'2006-02-15 21:30:53'),(1432,'2005-06-15 18:27:24',523,339,'2005-06-21 14:03:24',2,'2006-02-15 21:30:53'),(1433,'2005-06-15 18:30:00',2310,88,'2005-06-16 15:14:00',1,'2006-02-15 21:30:53'),(1434,'2005-06-15 18:30:46',4228,544,'2005-06-24 17:51:46',1,'2006-02-15 21:30:53'),(1435,'2005-06-15 18:32:30',2769,510,'2005-06-24 12:44:30',2,'2006-02-15 21:30:53'),(1436,'2005-06-15 18:35:40',924,584,'2005-06-21 15:04:40',1,'2006-02-15 21:30:53'),(1437,'2005-06-15 18:37:04',3263,96,'2005-06-20 12:56:04',1,'2006-02-15 21:30:53'),(1438,'2005-06-15 18:38:51',1816,82,'2005-06-17 23:50:51',1,'2006-02-15 21:30:53'),(1439,'2005-06-15 18:45:32',3155,589,'2005-06-22 15:57:32',2,'2006-02-15 21:30:53'),(1440,'2005-06-15 18:53:14',2921,26,'2005-06-24 15:28:14',1,'2006-02-15 21:30:53'),(1441,'2005-06-15 18:54:21',2095,444,'2005-06-22 22:48:21',2,'2006-02-15 21:30:53'),(1442,'2005-06-15 18:55:34',3912,122,'2005-06-22 20:41:34',2,'2006-02-15 21:30:53'),(1443,'2005-06-15 18:57:51',2485,435,'2005-06-18 14:18:51',2,'2006-02-15 21:30:53'),(1444,'2005-06-15 19:08:16',1303,539,'2005-06-24 15:20:16',2,'2006-02-15 21:30:53'),(1445,'2005-06-15 19:10:07',3189,537,'2005-06-19 20:27:07',2,'2006-02-15 21:30:53'),(1446,'2005-06-15 19:13:45',1989,506,'2005-06-23 19:43:45',2,'2006-02-15 21:30:53'),(1447,'2005-06-15 19:13:51',984,471,'2005-06-21 22:56:51',1,'2006-02-15 21:30:53'),(1448,'2005-06-15 19:17:16',2781,246,'2005-06-23 21:56:16',2,'2006-02-15 21:30:53'),(1449,'2005-06-15 19:19:16',1525,471,'2005-06-18 15:24:16',2,'2006-02-15 21:30:53'),(1450,'2005-06-15 19:22:08',4132,268,'2005-06-16 17:53:08',2,'2006-02-15 21:30:53'),(1451,'2005-06-15 19:30:18',3560,18,'2005-06-19 19:22:18',2,'2006-02-15 21:30:53'),(1452,'2005-06-15 19:32:52',4348,243,'2005-06-16 13:45:52',1,'2006-02-15 21:30:53'),(1453,'2005-06-15 19:36:39',3274,457,'2005-06-19 00:16:39',2,'2006-02-15 21:30:53'),(1454,'2005-06-15 19:49:41',102,298,'2005-06-17 15:17:41',2,'2006-02-15 21:30:53'),(1455,'2005-06-15 19:51:06',2194,358,'2005-06-18 21:54:06',2,'2006-02-15 21:30:53'),(1456,'2005-06-15 20:00:11',632,590,'2005-06-23 18:03:11',2,'2006-02-15 21:30:53'),(1457,'2005-06-15 20:05:49',730,345,'2005-06-19 15:35:49',1,'2006-02-15 21:30:53'),(1458,'2005-06-15 20:24:05',3546,178,'2005-06-21 01:22:05',1,'2006-02-15 21:30:53'),(1459,'2005-06-15 20:25:53',1862,218,'2005-06-22 23:34:53',2,'2006-02-15 21:30:53'),(1460,'2005-06-15 20:27:02',1405,565,'2005-06-16 16:21:02',1,'2006-02-15 21:30:53'),(1461,'2005-06-15 20:32:08',4479,216,'2005-06-23 01:08:08',1,'2006-02-15 21:30:53'),(1462,'2005-06-15 20:37:40',653,187,'2005-06-18 19:36:40',2,'2006-02-15 21:30:53'),(1463,'2005-06-15 20:37:51',2984,569,'2005-06-21 16:46:51',2,'2006-02-15 21:30:53'),(1464,'2005-06-15 20:38:14',4113,387,'2005-06-17 14:52:14',2,'2006-02-15 21:30:53'),(1465,'2005-06-15 20:43:08',609,387,'2005-06-18 23:00:08',1,'2006-02-15 21:30:53'),(1466,'2005-06-15 20:46:04',1057,288,'2005-06-24 22:46:04',1,'2006-02-15 21:30:53'),(1467,'2005-06-15 20:47:10',688,506,'2005-06-22 00:30:10',1,'2006-02-15 21:30:53'),(1468,'2005-06-15 20:48:22',228,230,'2005-06-21 19:48:22',1,'2006-02-15 21:30:53'),(1469,'2005-06-15 20:52:36',2451,580,'2005-06-21 19:55:36',1,'2006-02-15 21:30:53'),(1470,'2005-06-15 20:53:07',4044,11,'2005-06-25 02:12:07',1,'2006-02-15 21:30:53'),(1471,'2005-06-15 20:53:26',565,428,'2005-06-24 18:25:26',2,'2006-02-15 21:30:53'),(1472,'2005-06-15 20:54:55',4233,373,'2005-06-24 21:52:55',2,'2006-02-15 21:30:53'),(1473,'2005-06-15 20:55:20',2377,249,'2005-06-21 16:40:20',2,'2006-02-15 21:30:53'),(1474,'2005-06-15 20:55:42',164,202,'2005-06-19 02:41:42',2,'2006-02-15 21:30:53'),(1475,'2005-06-15 21:08:01',1834,344,'2005-06-18 22:33:01',2,'2006-02-15 21:30:53'),(1476,'2005-06-15 21:08:46',1407,1,'2005-06-25 02:26:46',1,'2006-02-15 21:30:53'),(1477,'2005-06-15 21:11:18',418,51,'2005-06-19 02:05:18',1,'2006-02-15 21:30:53'),(1478,'2005-06-15 21:12:13',435,336,'2005-06-18 21:43:13',2,'2006-02-15 21:30:53'),(1479,'2005-06-15 21:13:38',172,592,'2005-06-17 01:26:38',2,'2006-02-15 21:30:53'),(1480,'2005-06-15 21:17:17',2598,27,'2005-06-23 22:01:17',1,'2006-02-15 21:30:53'),(1481,'2005-06-15 21:17:58',3041,125,'2005-06-18 17:53:58',2,'2006-02-15 21:30:53'),(1482,'2005-06-15 21:18:16',3980,60,'2005-06-16 17:07:16',1,'2006-02-15 21:30:53'),(1483,'2005-06-15 21:21:58',1926,242,'2005-06-24 00:44:58',2,'2006-02-15 21:30:53'),(1484,'2005-06-15 21:22:35',1589,320,'2005-06-20 02:27:35',2,'2006-02-15 21:30:53'),(1485,'2005-06-15 21:24:10',194,281,'2005-06-24 23:03:10',1,'2006-02-15 21:30:53'),(1486,'2005-06-15 21:25:30',847,62,'2005-06-16 16:36:30',1,'2006-02-15 21:30:53'),(1487,'2005-06-15 21:27:42',3791,76,'2005-06-22 03:09:42',2,'2006-02-15 21:30:53'),(1488,'2005-06-15 21:39:54',1081,355,'2005-06-16 20:33:54',1,'2006-02-15 21:30:53'),(1489,'2005-06-15 21:41:38',699,213,'2005-06-22 17:00:38',1,'2006-02-15 21:30:53'),(1490,'2005-06-15 21:42:17',3515,123,'2005-06-22 02:01:17',2,'2006-02-15 21:30:53'),(1491,'2005-06-15 21:48:18',848,354,'2005-06-20 16:40:18',1,'2006-02-15 21:30:53'),(1492,'2005-06-15 21:48:35',4148,360,'2005-06-17 17:18:35',1,'2006-02-15 21:30:53'),(1493,'2005-06-15 21:50:32',4581,235,'2005-06-17 01:02:32',2,'2006-02-15 21:30:53'),(1494,'2005-06-15 21:54:20',244,575,'2005-06-19 18:46:20',1,'2006-02-15 21:30:53'),(1495,'2005-06-15 21:54:31',1842,175,'2005-06-19 00:08:31',2,'2006-02-15 21:30:53'),(1496,'2005-06-15 21:55:58',3915,290,'2005-06-17 02:28:58',2,'2006-02-15 21:30:53'),(1497,'2005-06-15 21:56:39',2958,44,'2005-06-20 20:32:39',1,'2006-02-15 21:30:53'),(1498,'2005-06-15 21:58:00',3690,352,'2005-06-17 21:50:00',1,'2006-02-15 21:30:53'),(1499,'2005-06-15 21:58:07',165,375,'2005-06-22 19:37:07',2,'2006-02-15 21:30:53'),(1500,'2005-06-15 22:00:45',2652,237,'2005-06-18 16:19:45',2,'2006-02-15 21:30:53'),(1501,'2005-06-15 22:02:35',1780,148,'2005-06-23 18:59:35',1,'2006-02-15 21:30:53'),(1502,'2005-06-15 22:03:14',3277,5,'2005-06-23 18:42:14',2,'2006-02-15 21:30:53'),(1503,'2005-06-15 22:07:09',763,197,'2005-06-20 23:15:09',1,'2006-02-15 21:30:53'),(1504,'2005-06-15 22:08:06',3621,423,'2005-06-24 01:16:06',2,'2006-02-15 21:30:53'),(1505,'2005-06-15 22:12:50',2961,561,'2005-06-17 21:37:50',2,'2006-02-15 21:30:53'),(1506,'2005-06-15 22:19:37',4085,404,'2005-06-22 18:28:37',1,'2006-02-15 21:30:53'),(1507,'2005-06-15 22:25:26',2514,172,'2005-06-19 17:00:26',1,'2006-02-15 21:30:53'),(1508,'2005-06-15 22:33:24',1141,511,'2005-06-18 02:27:24',2,'2006-02-15 21:30:53'),(1509,'2005-06-15 22:35:53',655,167,'2005-06-23 17:09:53',2,'2006-02-15 21:30:53'),(1510,'2005-06-15 22:39:34',989,338,'2005-06-24 19:21:34',2,'2006-02-15 21:30:53'),(1511,'2005-06-15 22:45:06',1135,330,'2005-06-22 22:48:06',1,'2006-02-15 21:30:53'),(1512,'2005-06-15 22:53:03',1628,452,'2005-06-23 18:56:03',1,'2006-02-15 21:30:53'),(1513,'2005-06-15 22:53:30',1173,368,'2005-06-23 01:00:30',1,'2006-02-15 21:30:53'),(1514,'2005-06-15 22:57:34',2937,410,'2005-06-19 20:27:34',1,'2006-02-15 21:30:53'),(1515,'2005-06-15 23:07:50',3244,115,'2005-06-20 02:33:50',2,'2006-02-15 21:30:53'),(1516,'2005-06-15 23:11:10',3702,530,'2005-06-17 20:37:10',1,'2006-02-15 21:30:53'),(1517,'2005-06-15 23:20:26',3728,148,'2005-06-23 23:23:26',1,'2006-02-15 21:30:53'),(1518,'2005-06-15 23:36:37',4537,237,'2005-06-16 18:24:37',2,'2006-02-15 21:30:53'),(1519,'2005-06-15 23:55:27',1553,155,'2005-06-21 04:06:27',2,'2006-02-15 21:30:53'),(1520,'2005-06-15 23:57:20',3419,341,'2005-06-24 23:46:20',1,'2006-02-15 21:30:53'),(1521,'2005-06-15 23:58:53',4299,149,'2005-06-18 03:10:53',1,'2006-02-15 21:30:53'),(1522,'2005-06-16 00:17:39',235,133,'2005-06-22 05:38:39',1,'2006-02-15 21:30:53'),(1523,'2005-06-16 00:18:40',681,349,'2005-06-17 02:50:40',2,'2006-02-15 21:30:53'),(1524,'2005-06-16 00:25:52',3439,177,'2005-06-19 03:32:52',1,'2006-02-15 21:30:53'),(1525,'2005-06-16 00:26:07',1467,304,'2005-06-19 22:37:07',2,'2006-02-15 21:30:53'),(1526,'2005-06-16 00:27:51',1940,499,'2005-06-19 00:19:51',1,'2006-02-15 21:30:53'),(1527,'2005-06-16 00:31:40',296,188,'2005-06-21 05:20:40',1,'2006-02-15 21:30:53'),(1528,'2005-06-16 00:32:52',4297,110,'2005-06-25 01:07:52',2,'2006-02-15 21:30:53'),(1529,'2005-06-16 00:37:35',1688,362,'2005-06-22 18:58:35',2,'2006-02-15 21:30:53'),(1530,'2005-06-16 00:38:07',2421,392,'2005-06-24 02:45:07',2,'2006-02-15 21:30:53'),(1531,'2005-06-16 00:40:34',1388,515,'2005-06-22 02:44:34',1,'2006-02-15 21:30:53'),(1532,'2005-06-16 00:41:31',3793,290,'2005-06-20 21:36:31',1,'2006-02-15 21:30:53'),(1533,'2005-06-16 00:46:02',2452,116,'2005-06-17 20:11:02',1,'2006-02-15 21:30:53'),(1534,'2005-06-16 00:49:32',3124,42,'2005-06-18 02:41:32',1,'2006-02-15 21:30:53'),(1535,'2005-06-16 00:52:04',1096,202,'2005-06-20 22:47:04',2,'2006-02-15 21:30:53'),(1536,'2005-06-16 00:52:22',3248,339,'2005-06-17 21:43:22',1,'2006-02-15 21:30:53'),(1537,'2005-06-16 00:52:51',4577,594,'2005-06-20 19:33:51',2,'2006-02-15 21:30:53'),(1538,'2005-06-16 01:05:50',708,430,'2005-06-18 19:48:50',1,'2006-02-15 21:30:53'),(1539,'2005-06-16 01:11:25',267,390,'2005-06-23 03:43:25',2,'2006-02-15 21:30:53'),(1540,'2005-06-16 01:14:56',2707,586,'2005-06-20 23:31:56',2,'2006-02-15 21:30:53'),(1541,'2005-06-16 01:15:59',1911,189,'2005-06-22 21:26:59',2,'2006-02-15 21:30:53'),(1542,'2005-06-16 01:20:05',1714,182,'2005-06-22 03:59:05',1,'2006-02-15 21:30:53'),(1543,'2005-06-16 01:24:08',1188,28,'2005-06-18 06:24:08',2,'2006-02-15 21:30:53'),(1544,'2005-06-16 01:28:22',269,43,'2005-06-17 06:57:22',2,'2006-02-15 21:30:53'),(1545,'2005-06-16 01:31:23',762,563,'2005-06-24 05:50:23',1,'2006-02-15 21:30:53'),(1546,'2005-06-16 01:34:05',3913,3,'2005-06-24 04:27:05',1,'2006-02-15 21:30:53'),(1547,'2005-06-16 01:42:24',2909,343,'2005-06-19 01:13:24',1,'2006-02-15 21:30:53'),(1548,'2005-06-16 01:43:33',2094,374,'2005-06-23 22:04:33',2,'2006-02-15 21:30:53'),(1549,'2005-06-16 01:57:15',266,69,'2005-06-18 23:30:15',1,'2006-02-15 21:30:53'),(1550,'2005-06-16 01:58:35',2003,345,'2005-06-18 23:56:35',1,'2006-02-15 21:30:53'),(1551,'2005-06-16 02:01:15',4088,268,'2005-06-22 07:33:15',1,'2006-02-15 21:30:53'),(1552,'2005-06-16 02:01:37',819,518,'2005-06-21 00:59:37',2,'2006-02-15 21:30:53'),(1553,'2005-06-16 02:02:44',4026,416,'2005-06-19 07:50:44',1,'2006-02-15 21:30:53'),(1554,'2005-06-16 02:16:47',715,155,'2005-06-22 05:15:47',1,'2006-02-15 21:30:53'),(1555,'2005-06-16 02:17:07',4168,256,'2005-06-22 06:28:07',1,'2006-02-15 21:30:53'),(1556,'2005-06-16 02:19:02',533,54,'2005-06-17 22:36:02',2,'2006-02-15 21:30:53'),(1557,'2005-06-16 02:28:35',2617,439,'2005-06-16 22:11:35',2,'2006-02-15 21:30:53'),(1558,'2005-06-16 02:33:53',4350,20,'2005-06-19 20:50:53',2,'2006-02-15 21:30:53'),(1559,'2005-06-16 02:35:03',716,574,'2005-06-19 21:22:03',1,'2006-02-15 21:30:53'),(1560,'2005-06-16 02:36:43',3418,239,'2005-06-24 23:10:43',2,'2006-02-15 21:30:53'),(1561,'2005-06-16 02:41:30',2263,431,'2005-06-22 05:19:30',1,'2006-02-15 21:30:53'),(1562,'2005-06-16 02:46:27',595,395,'2005-06-23 00:56:27',2,'2006-02-15 21:30:53'),(1563,'2005-06-16 02:46:28',1516,262,'2005-06-18 02:37:28',1,'2006-02-15 21:30:53'),(1564,'2005-06-16 02:47:07',145,343,'2005-06-24 03:12:07',1,'2006-02-15 21:30:53'),(1565,'2005-06-16 03:13:09',3833,506,'2005-06-16 22:42:09',2,'2006-02-15 21:30:53'),(1566,'2005-06-16 03:13:20',3215,174,'2005-06-24 01:59:20',2,'2006-02-15 21:30:53'),(1567,'2005-06-16 03:13:30',3098,320,'2005-06-21 23:56:30',1,'2006-02-15 21:30:53'),(1568,'2005-06-16 03:14:01',635,178,'2005-06-19 21:17:01',2,'2006-02-15 21:30:53'),(1569,'2005-06-16 03:19:09',3927,363,'2005-06-18 21:55:09',2,'2006-02-15 21:30:53'),(1570,'2005-06-16 03:21:33',3711,82,'2005-06-22 22:03:33',2,'2006-02-15 21:30:53'),(1571,'2005-06-16 03:22:00',1019,54,'2005-06-22 23:27:00',1,'2006-02-15 21:30:53'),(1572,'2005-06-16 03:23:22',4179,560,'2005-06-20 06:03:22',2,'2006-02-15 21:30:53'),(1573,'2005-06-16 03:31:39',4536,371,'2005-06-25 04:04:39',1,'2006-02-15 21:30:53'),(1574,'2005-06-16 03:39:56',161,305,'2005-06-22 05:40:56',2,'2006-02-15 21:30:53'),(1575,'2005-06-16 03:41:38',3317,6,'2005-06-22 03:01:38',2,'2006-02-15 21:30:53'),(1576,'2005-06-16 03:54:39',1014,442,'2005-06-24 21:55:39',2,'2006-02-15 21:30:53'),(1577,'2005-06-16 04:03:28',367,327,'2005-06-24 22:40:28',2,'2006-02-15 21:30:53'),(1578,'2005-06-16 04:08:16',3397,365,'2005-06-23 07:57:16',1,'2006-02-15 21:30:53'),(1579,'2005-06-16 04:09:08',158,35,'2005-06-21 05:21:08',2,'2006-02-15 21:30:53'),(1580,'2005-06-16 04:12:25',2479,87,'2005-06-20 06:53:25',1,'2006-02-15 21:30:53'),(1581,'2005-06-16 04:28:45',4004,109,'2005-06-18 07:07:45',1,'2006-02-15 21:30:53'),(1582,'2005-06-16 04:31:57',163,536,'2005-06-22 01:25:57',1,'2006-02-15 21:30:53'),(1583,'2005-06-16 04:44:23',270,37,'2005-06-18 03:44:23',1,'2006-02-15 21:30:53'),(1584,'2005-06-16 04:50:50',3545,434,'2005-06-21 22:51:50',2,'2006-02-15 21:30:53'),(1585,'2005-06-16 04:51:13',1708,386,'2005-06-24 00:23:13',2,'2006-02-15 21:30:53'),(1586,'2005-06-16 04:51:18',769,140,'2005-06-21 06:54:18',2,'2006-02-15 21:30:53'),(1587,'2005-06-16 04:52:28',1781,62,'2005-06-23 07:36:28',1,'2006-02-15 21:30:53'),(1588,'2005-06-16 04:53:21',4472,322,'2005-06-25 07:29:21',2,'2006-02-15 21:30:53'),(1589,'2005-06-16 04:58:03',4307,293,'2005-06-24 08:36:03',1,'2006-02-15 21:30:53'),(1590,'2005-06-16 05:11:41',3685,98,'2005-06-23 10:11:41',1,'2006-02-15 21:30:53'),(1591,'2005-06-16 05:12:37',1648,83,'2005-06-25 06:28:37',2,'2006-02-15 21:30:53'),(1592,'2005-06-16 05:14:37',3798,187,'2005-06-20 10:52:37',2,'2006-02-15 21:30:53'),(1593,'2005-06-16 05:14:52',766,111,'2005-06-24 08:00:52',2,'2006-02-15 21:30:53'),(1594,'2005-06-16 05:15:12',3858,470,'2005-06-25 00:38:12',1,'2006-02-15 21:30:53'),(1595,'2005-06-16 05:23:46',1481,244,'2005-06-20 00:37:46',1,'2006-02-15 21:30:53'),(1596,'2005-06-16 05:30:58',2552,416,'2005-06-21 04:18:58',2,'2006-02-15 21:30:53'),(1597,'2005-06-16 05:47:03',743,432,'2005-06-18 04:21:03',1,'2006-02-15 21:30:53'),(1598,'2005-06-16 06:02:39',4171,314,'2005-06-23 09:09:39',1,'2006-02-15 21:30:53'),(1599,'2005-06-16 06:03:33',1476,215,'2005-06-21 07:46:33',2,'2006-02-15 21:30:53'),(1600,'2005-06-16 06:04:12',2264,196,'2005-06-19 09:39:12',2,'2006-02-15 21:30:53'),(1601,'2005-06-16 06:11:13',3115,428,'2005-06-21 08:57:13',2,'2006-02-15 21:30:53'),(1602,'2005-06-16 06:12:40',1777,441,'2005-06-19 03:50:40',2,'2006-02-15 21:30:53'),(1603,'2005-06-16 06:14:03',3308,395,'2005-06-17 06:04:03',2,'2006-02-15 21:30:53'),(1604,'2005-06-16 06:14:25',3226,272,'2005-06-17 03:53:25',2,'2006-02-15 21:30:53'),(1605,'2005-06-16 06:17:55',593,197,'2005-06-25 01:25:55',1,'2006-02-15 21:30:53'),(1606,'2005-06-16 06:18:31',4290,253,'2005-06-25 09:15:31',1,'2006-02-15 21:30:53'),(1607,'2005-06-16 06:25:35',3289,513,'2005-06-20 02:50:35',2,'2006-02-15 21:30:53'),(1608,'2005-06-16 06:28:57',2581,386,'2005-06-24 05:20:57',2,'2006-02-15 21:30:53'),(1609,'2005-06-16 06:34:59',2279,174,'2005-06-17 09:41:59',2,'2006-02-15 21:30:53'),(1610,'2005-06-16 06:36:33',3551,534,'2005-06-19 07:12:33',1,'2006-02-15 21:30:53'),(1611,'2005-06-16 06:41:35',1739,393,'2005-06-25 06:13:35',2,'2006-02-15 21:30:53'),(1612,'2005-06-16 06:52:05',3025,355,'2005-06-19 01:51:05',1,'2006-02-15 21:30:53'),(1613,'2005-06-16 06:55:10',4462,573,'2005-06-24 12:08:10',1,'2006-02-15 21:30:53'),(1614,'2005-06-16 06:58:02',23,489,'2005-06-23 11:24:02',1,'2006-02-15 21:30:53'),(1615,'2005-06-16 07:00:28',3894,362,'2005-06-25 08:53:28',1,'2006-02-15 21:30:53'),(1616,'2005-06-16 07:04:52',2296,204,'2005-06-24 04:06:52',1,'2006-02-15 21:30:53'),(1617,'2005-06-16 07:06:06',1382,83,'2005-06-25 03:35:06',1,'2006-02-15 21:30:53'),(1618,'2005-06-16 07:08:38',3741,134,'2005-06-25 05:26:38',2,'2006-02-15 21:30:53'),(1619,'2005-06-16 07:14:13',4258,232,'2005-06-19 05:50:13',2,'2006-02-15 21:30:53'),(1620,'2005-06-16 07:21:30',389,561,'2005-06-17 09:46:30',1,'2006-02-15 21:30:53'),(1621,'2005-06-16 07:24:12',3677,177,'2005-06-19 02:35:12',1,'2006-02-15 21:30:53'),(1622,'2005-06-16 07:33:18',1774,311,'2005-06-21 07:23:18',1,'2006-02-15 21:30:53'),(1623,'2005-06-16 07:48:50',4485,378,'2005-06-17 03:53:50',2,'2006-02-15 21:30:53'),(1624,'2005-06-16 07:48:57',1066,314,'2005-06-17 05:52:57',1,'2006-02-15 21:30:53'),(1625,'2005-06-16 07:49:08',3367,39,'2005-06-24 09:08:08',2,'2006-02-15 21:30:53'),(1626,'2005-06-16 07:49:47',694,260,'2005-06-22 13:32:47',2,'2006-02-15 21:30:53'),(1627,'2005-06-16 07:51:09',4135,468,'2005-06-24 02:24:09',1,'2006-02-15 21:30:53'),(1628,'2005-06-16 07:52:55',868,427,'2005-06-25 11:09:55',1,'2006-02-15 21:30:53'),(1629,'2005-06-16 07:53:47',4375,339,'2005-06-22 13:03:47',1,'2006-02-15 21:30:53'),(1630,'2005-06-16 07:55:01',2413,130,'2005-06-19 06:38:01',1,'2006-02-15 21:30:53'),(1631,'2005-06-16 08:01:02',2466,5,'2005-06-19 09:04:02',1,'2006-02-15 21:30:53'),(1632,'2005-06-16 08:03:42',1518,319,'2005-06-17 03:40:42',1,'2006-02-15 21:30:53'),(1633,'2005-06-16 08:08:40',280,4,'2005-06-17 11:12:40',1,'2006-02-15 21:30:53'),(1634,'2005-06-16 08:16:05',3990,121,'2005-06-17 04:49:05',1,'2006-02-15 21:30:53'),(1635,'2005-06-16 08:26:56',1187,566,'2005-06-25 06:17:56',2,'2006-02-15 21:30:53'),(1636,'2005-06-16 08:28:54',2052,574,'2005-06-24 09:23:54',1,'2006-02-15 21:30:53'),(1637,'2005-06-16 08:29:58',906,212,'2005-06-23 04:55:58',2,'2006-02-15 21:30:53'),(1638,'2005-06-16 08:32:36',1905,181,'2005-06-18 07:11:36',2,'2006-02-15 21:30:53'),(1639,'2005-06-16 08:33:39',176,450,'2005-06-25 07:51:39',1,'2006-02-15 21:30:53'),(1640,'2005-06-16 08:35:39',443,86,'2005-06-17 05:37:39',2,'2006-02-15 21:30:53'),(1641,'2005-06-16 08:46:26',2925,259,'2005-06-24 14:39:26',2,'2006-02-15 21:30:53'),(1642,'2005-06-16 08:54:15',3875,287,'2005-06-18 12:36:15',1,'2006-02-15 21:30:53'),(1643,'2005-06-16 08:55:35',1352,484,'2005-06-21 05:36:35',2,'2006-02-15 21:30:53'),(1644,'2005-06-16 08:58:18',749,596,'2005-06-21 06:47:18',1,'2006-02-15 21:30:53'),(1645,'2005-06-16 09:10:06',4434,234,'2005-06-23 04:36:06',2,'2006-02-15 21:30:53'),(1646,'2005-06-16 09:12:53',4037,131,'2005-06-24 08:03:53',2,'2006-02-15 21:30:53'),(1647,'2005-06-16 09:14:58',1936,454,'2005-06-17 10:46:58',1,'2006-02-15 21:30:53'),(1648,'2005-06-16 09:17:07',457,427,'2005-06-24 06:31:07',2,'2006-02-15 21:30:53'),(1649,'2005-06-16 09:20:33',390,352,'2005-06-18 13:42:33',1,'2006-02-15 21:30:53'),(1650,'2005-06-16 09:23:20',4125,299,'2005-06-23 11:25:20',1,'2006-02-15 21:30:53'),(1651,'2005-06-16 09:24:38',4444,524,'2005-06-17 09:50:38',2,'2006-02-15 21:30:53'),(1652,'2005-06-16 09:31:37',3416,533,'2005-06-19 14:02:37',2,'2006-02-15 21:30:53'),(1653,'2005-06-16 09:34:45',2294,517,'2005-06-18 09:13:45',1,'2006-02-15 21:30:53'),(1654,'2005-06-16 09:42:48',1039,348,'2005-06-20 14:28:48',2,'2006-02-15 21:30:53'),(1655,'2005-06-16 09:51:39',3693,488,'2005-06-23 14:53:39',2,'2006-02-15 21:30:53'),(1656,'2005-06-16 10:05:40',2253,31,'2005-06-22 06:26:40',1,'2006-02-15 21:30:53'),(1657,'2005-06-16 10:06:49',953,209,'2005-06-22 10:34:49',2,'2006-02-15 21:30:53'),(1658,'2005-06-16 10:07:10',272,568,'2005-06-21 09:23:10',2,'2006-02-15 21:30:53'),(1659,'2005-06-16 10:11:46',1182,296,'2005-06-20 13:51:46',1,'2006-02-15 21:30:53'),(1660,'2005-06-16 10:12:55',2374,238,'2005-06-18 05:56:55',2,'2006-02-15 21:30:53'),(1661,'2005-06-16 10:12:57',2403,508,'2005-06-24 09:23:57',2,'2006-02-15 21:30:53'),(1662,'2005-06-16 10:13:35',3552,378,'2005-06-23 13:54:35',1,'2006-02-15 21:30:53'),(1663,'2005-06-16 10:14:15',1558,186,'2005-06-23 08:34:15',2,'2006-02-15 21:30:53'),(1664,'2005-06-16 10:15:20',2464,216,'2005-06-18 12:11:20',2,'2006-02-15 21:30:53'),(1665,'2005-06-16 10:16:02',2613,490,'2005-06-23 09:32:02',1,'2006-02-15 21:30:53'),(1666,'2005-06-16 10:17:19',4019,557,'2005-06-21 05:50:19',1,'2006-02-15 21:30:53'),(1667,'2005-06-16 10:18:59',2362,333,'2005-06-22 14:45:59',2,'2006-02-15 21:30:53'),(1668,'2005-06-16 10:19:52',2483,569,'2005-06-23 12:22:52',2,'2006-02-15 21:30:53'),(1669,'2005-06-16 10:20:20',360,73,'2005-06-18 04:26:20',1,'2006-02-15 21:30:53'),(1670,'2005-06-16 10:26:33',2066,328,'2005-06-19 07:15:33',1,'2006-02-15 21:30:53'),(1671,'2005-06-16 10:30:22',3805,135,'2005-06-22 11:08:22',2,'2006-02-15 21:30:53'),(1672,'2005-06-16 10:37:34',4206,216,'2005-06-23 05:30:34',1,'2006-02-15 21:30:53'),(1673,'2005-06-16 10:40:17',907,534,'2005-06-18 16:13:17',1,'2006-02-15 21:30:53'),(1674,'2005-06-16 10:57:00',3606,234,'2005-06-18 07:31:00',2,'2006-02-15 21:30:53'),(1675,'2005-06-16 11:04:47',3048,371,'2005-06-24 06:56:47',2,'2006-02-15 21:30:53'),(1676,'2005-06-16 11:06:09',931,171,'2005-06-21 05:17:09',1,'2006-02-15 21:30:53'),(1677,'2005-06-16 11:07:11',240,191,'2005-06-23 10:50:11',1,'2006-02-15 21:30:53'),(1678,'2005-06-16 11:08:28',1856,352,'2005-06-19 15:44:28',1,'2006-02-15 21:30:53'),(1679,'2005-06-16 11:11:01',3959,227,'2005-06-23 08:11:01',1,'2006-02-15 21:30:53'),(1680,'2005-06-16 11:17:22',4441,469,'2005-06-25 15:55:22',2,'2006-02-15 21:30:53'),(1681,'2005-06-16 11:38:17',530,255,'2005-06-19 13:05:17',1,'2006-02-15 21:30:53'),(1682,'2005-06-16 11:54:25',2165,476,'2005-06-22 11:09:25',2,'2006-02-15 21:30:53'),(1683,'2005-06-16 11:54:55',2361,494,'2005-06-18 08:51:55',2,'2006-02-15 21:30:53'),(1684,'2005-06-16 11:57:34',806,485,'2005-06-19 09:12:34',1,'2006-02-15 21:30:53'),(1685,'2005-06-16 12:06:57',2754,85,'2005-06-21 16:53:57',2,'2006-02-15 21:30:53'),(1686,'2005-06-16 12:08:20',3883,529,'2005-06-20 10:59:20',1,'2006-02-15 21:30:53'),(1687,'2005-06-16 12:09:20',3686,140,'2005-06-18 06:18:20',2,'2006-02-15 21:30:53'),(1688,'2005-06-16 12:11:20',383,49,'2005-06-18 08:39:20',2,'2006-02-15 21:30:53'),(1689,'2005-06-16 12:18:41',4036,48,'2005-06-24 13:33:41',2,'2006-02-15 21:30:53'),(1690,'2005-06-16 12:24:18',1099,286,'2005-06-25 15:00:18',1,'2006-02-15 21:30:53'),(1691,'2005-06-16 12:24:28',4438,492,'2005-06-24 08:24:28',1,'2006-02-15 21:30:53'),(1692,'2005-06-16 12:30:19',3544,514,'2005-06-17 17:31:19',2,'2006-02-15 21:30:53'),(1693,'2005-06-16 12:39:51',2386,421,'2005-06-19 16:19:51',2,'2006-02-15 21:30:53'),(1694,'2005-06-16 12:40:23',147,532,'2005-06-20 09:18:23',2,'2006-02-15 21:30:53'),(1695,'2005-06-16 12:40:28',4436,159,'2005-06-22 13:41:28',1,'2006-02-15 21:30:53'),(1696,'2005-06-16 12:50:01',3928,502,'2005-06-24 12:08:01',2,'2006-02-15 21:30:53'),(1697,'2005-06-16 12:55:20',1801,340,'2005-06-23 17:41:20',2,'2006-02-15 21:30:53'),(1698,'2005-06-16 13:04:42',1474,407,'2005-06-21 15:54:42',1,'2006-02-15 21:30:53'),(1699,'2005-06-16 13:05:09',4507,27,'2005-06-17 09:53:09',2,'2006-02-15 21:30:53'),(1700,'2005-06-16 13:18:23',4251,456,'2005-06-21 16:46:23',2,'2006-02-15 21:30:53'),(1701,'2005-06-16 13:18:48',3000,315,'2005-06-22 15:00:48',1,'2006-02-15 21:30:53'),(1702,'2005-06-16 13:21:05',1822,242,'2005-06-19 10:13:05',2,'2006-02-15 21:30:53'),(1703,'2005-06-16 13:28:44',2346,589,'2005-06-17 11:03:44',1,'2006-02-15 21:30:53'),(1704,'2005-06-16 13:45:56',4425,488,'2005-06-24 18:12:56',1,'2006-02-15 21:30:53'),(1705,'2005-06-16 13:59:42',123,564,'2005-06-18 19:54:42',2,'2006-02-15 21:30:53'),(1706,'2005-06-16 14:01:02',2935,26,'2005-06-25 19:29:02',1,'2006-02-15 21:30:53'),(1707,'2005-06-16 14:01:27',185,4,'2005-06-18 09:35:27',1,'2006-02-15 21:30:53'),(1708,'2005-06-16 14:08:44',2259,478,'2005-06-19 08:35:44',1,'2006-02-15 21:30:53'),(1709,'2005-06-16 14:10:15',3501,426,'2005-06-24 16:38:15',2,'2006-02-15 21:30:53'),(1710,'2005-06-16 14:11:24',144,77,'2005-06-22 15:26:24',1,'2006-02-15 21:30:53'),(1711,'2005-06-16 14:11:52',273,347,'2005-06-25 08:49:52',1,'2006-02-15 21:30:53'),(1712,'2005-06-16 14:25:09',1363,535,'2005-06-17 17:55:09',1,'2006-02-15 21:30:53'),(1713,'2005-06-16 14:28:33',2580,164,'2005-06-18 09:02:33',1,'2006-02-15 21:30:53'),(1714,'2005-06-16 14:29:59',535,477,'2005-06-24 17:27:59',2,'2006-02-15 21:30:53'),(1715,'2005-06-16 14:37:12',1594,203,'2005-06-20 19:36:12',1,'2006-02-15 21:30:53'),(1716,'2005-06-16 14:39:31',20,24,'2005-06-19 15:37:31',1,'2006-02-15 21:30:53'),(1717,'2005-06-16 14:47:16',3007,277,'2005-06-19 10:11:16',2,'2006-02-15 21:30:53'),(1718,'2005-06-16 14:52:02',288,516,'2005-06-25 10:53:02',2,'2006-02-15 21:30:53'),(1719,'2005-06-16 14:55:53',2699,582,'2005-06-18 14:12:53',1,'2006-02-15 21:30:53'),(1720,'2005-06-16 15:00:14',3500,543,'2005-06-21 13:57:14',2,'2006-02-15 21:30:53'),(1721,'2005-06-16 15:01:36',3521,485,'2005-06-23 10:48:36',1,'2006-02-15 21:30:53'),(1722,'2005-06-16 15:12:52',2142,364,'2005-06-19 13:01:52',2,'2006-02-15 21:30:53'),(1723,'2005-06-16 15:14:18',2417,259,'2005-06-23 15:45:18',2,'2006-02-15 21:30:53'),(1724,'2005-06-16 15:15:43',61,146,'2005-06-23 10:14:43',2,'2006-02-15 21:30:53'),(1725,'2005-06-16 15:18:57',726,1,'2005-06-17 21:05:57',1,'2006-02-15 21:30:53'),(1726,'2005-06-16 15:19:10',116,3,'2005-06-25 11:39:10',2,'2006-02-15 21:30:53'),(1727,'2005-06-16 15:21:47',2951,457,'2005-06-17 14:12:47',1,'2006-02-15 21:30:53'),(1728,'2005-06-16 15:29:29',1366,59,'2005-06-23 12:47:29',1,'2006-02-15 21:30:53'),(1729,'2005-06-16 15:29:47',3364,523,'2005-06-25 20:55:47',2,'2006-02-15 21:30:53'),(1730,'2005-06-16 15:30:01',1372,390,'2005-06-19 12:56:01',1,'2006-02-15 21:30:53'),(1731,'2005-06-16 15:32:12',3698,344,'2005-06-19 18:58:12',2,'2006-02-15 21:30:53'),(1732,'2005-06-16 15:34:41',2287,129,'2005-06-18 13:05:41',1,'2006-02-15 21:30:53'),(1733,'2005-06-16 15:37:07',542,480,'2005-06-23 15:53:07',2,'2006-02-15 21:30:53'),(1734,'2005-06-16 15:49:30',1113,94,'2005-06-22 13:52:30',2,'2006-02-15 21:30:53'),(1735,'2005-06-16 15:51:52',97,4,'2005-06-20 13:27:52',1,'2006-02-15 21:30:53'),(1736,'2005-06-16 15:52:32',3771,139,'2005-06-21 14:39:32',2,'2006-02-15 21:30:53'),(1737,'2005-06-16 15:59:44',4029,467,'2005-06-23 12:22:44',1,'2006-02-15 21:30:53'),(1738,'2005-06-16 16:07:27',3260,177,'2005-06-20 15:22:27',1,'2006-02-15 21:30:53'),(1739,'2005-06-16 16:09:38',2557,450,'2005-06-22 18:04:38',2,'2006-02-15 21:30:53'),(1740,'2005-06-16 16:29:00',2282,324,'2005-06-20 14:07:00',2,'2006-02-15 21:30:53'),(1741,'2005-06-16 16:31:37',3722,176,'2005-06-25 21:38:37',1,'2006-02-15 21:30:53'),(1742,'2005-06-16 16:37:48',2772,576,'2005-06-17 19:47:48',2,'2006-02-15 21:30:53'),(1743,'2005-06-16 16:38:10',2777,258,'2005-06-17 13:13:10',1,'2006-02-15 21:30:53'),(1744,'2005-06-16 16:39:58',3075,230,'2005-06-18 19:50:58',2,'2006-02-15 21:30:53'),(1745,'2005-06-16 16:41:16',2812,178,'2005-06-23 21:02:16',2,'2006-02-15 21:30:53'),(1746,'2005-06-16 16:41:19',4272,385,'2005-06-19 11:28:19',2,'2006-02-15 21:30:53'),(1747,'2005-06-16 16:53:33',1661,273,'2005-06-25 21:48:33',2,'2006-02-15 21:30:53'),(1748,'2005-06-16 16:54:03',2434,473,'2005-06-18 20:11:03',1,'2006-02-15 21:30:53'),(1749,'2005-06-16 16:56:00',1554,283,'2005-06-21 21:02:00',2,'2006-02-15 21:30:53'),(1750,'2005-06-16 16:57:36',1103,321,'2005-06-25 21:51:36',1,'2006-02-15 21:30:53'),(1751,'2005-06-16 17:00:14',138,123,'2005-06-17 12:12:14',2,'2006-02-15 21:30:53'),(1752,'2005-06-16 17:02:55',3529,12,'2005-06-23 19:09:55',2,'2006-02-15 21:30:53'),(1753,'2005-06-16 17:08:17',3817,249,'2005-06-21 21:47:17',2,'2006-02-15 21:30:53'),(1754,'2005-06-16 17:13:23',4106,25,'2005-06-22 20:46:23',1,'2006-02-15 21:30:53'),(1755,'2005-06-16 17:18:44',1721,117,'2005-06-17 16:54:44',1,'2006-02-15 21:30:53'),(1756,'2005-06-16 17:22:33',1401,571,'2005-06-21 16:52:33',1,'2006-02-15 21:30:53'),(1757,'2005-06-16 17:32:24',4491,510,'2005-06-18 13:12:24',1,'2006-02-15 21:30:53'),(1758,'2005-06-16 17:39:39',2654,474,'2005-06-25 13:06:39',1,'2006-02-15 21:30:53'),(1759,'2005-06-16 17:46:37',1402,430,'2005-06-24 19:40:37',2,'2006-02-15 21:30:53'),(1760,'2005-06-16 17:48:37',3929,261,'2005-06-18 16:01:37',2,'2006-02-15 21:30:53'),(1761,'2005-06-16 17:49:57',1570,521,'2005-06-17 21:03:57',2,'2006-02-15 21:30:53'),(1762,'2005-06-16 17:50:19',3050,116,'2005-06-19 21:35:19',2,'2006-02-15 21:30:53'),(1763,'2005-06-16 17:51:01',1941,389,'2005-06-20 17:27:01',1,'2006-02-15 21:30:53'),(1764,'2005-06-16 17:51:54',705,392,'2005-06-21 20:36:54',2,'2006-02-15 21:30:53'),(1765,'2005-06-16 17:56:10',822,273,'2005-06-19 23:40:10',2,'2006-02-15 21:30:53'),(1766,'2005-06-16 17:59:37',2041,118,'2005-06-18 16:32:37',2,'2006-02-15 21:30:53'),(1767,'2005-06-16 18:01:36',1162,205,'2005-06-18 12:39:36',2,'2006-02-15 21:30:53'),(1768,'2005-06-16 18:02:06',2131,131,'2005-06-23 17:19:06',2,'2006-02-15 21:30:53'),(1769,'2005-06-16 18:07:48',1229,397,'2005-06-22 12:39:48',1,'2006-02-15 21:30:53'),(1770,'2005-06-16 18:07:55',1681,359,'2005-06-23 23:49:55',2,'2006-02-15 21:30:53'),(1771,'2005-06-16 18:12:17',1769,416,'2005-06-18 16:11:17',1,'2006-02-15 21:30:53'),(1772,'2005-06-16 18:12:54',1269,525,'2005-06-24 19:55:54',1,'2006-02-15 21:30:53'),(1773,'2005-06-16 18:13:43',4396,462,'2005-06-24 17:43:43',2,'2006-02-15 21:30:53'),(1774,'2005-06-16 18:27:52',3058,442,'2005-06-21 13:35:52',2,'2006-02-15 21:30:53'),(1775,'2005-06-16 18:28:19',1922,123,'2005-06-25 13:09:19',2,'2006-02-15 21:30:53'),(1776,'2005-06-16 18:46:58',1404,472,'2005-06-24 16:01:58',1,'2006-02-15 21:30:53'),(1777,'2005-06-16 18:52:12',3325,49,'2005-06-25 13:55:12',1,'2006-02-15 21:30:53'),(1778,'2005-06-16 18:54:48',2512,341,'2005-06-22 16:08:48',2,'2006-02-15 21:30:53'),(1779,'2005-06-16 18:55:11',1044,438,'2005-06-17 20:11:11',1,'2006-02-15 21:30:53'),(1780,'2005-06-16 19:11:45',146,352,'2005-06-19 15:34:45',2,'2006-02-15 21:30:53'),(1781,'2005-06-16 19:20:24',2841,429,'2005-06-25 17:02:24',2,'2006-02-15 21:30:53'),(1782,'2005-06-16 19:21:12',1820,498,'2005-06-22 16:03:12',2,'2006-02-15 21:30:53'),(1783,'2005-06-16 19:23:23',50,18,'2005-06-18 00:57:23',1,'2006-02-15 21:30:53'),(1784,'2005-06-16 19:25:32',3792,134,'2005-06-20 00:00:32',2,'2006-02-15 21:30:53'),(1785,'2005-06-16 19:27:12',3413,50,'2005-06-24 19:25:12',1,'2006-02-15 21:30:53'),(1786,'2005-06-16 19:30:54',263,323,'2005-06-19 14:24:54',1,'2006-02-15 21:30:53'),(1787,'2005-06-16 19:30:59',3823,546,'2005-06-21 18:25:59',2,'2006-02-15 21:30:53'),(1788,'2005-06-16 19:47:18',3794,357,'2005-06-22 23:10:18',1,'2006-02-15 21:30:53'),(1789,'2005-06-16 19:49:18',4264,105,'2005-06-23 17:07:18',2,'2006-02-15 21:30:53'),(1790,'2005-06-16 19:58:40',1070,158,'2005-06-17 19:31:40',2,'2006-02-15 21:30:53'),(1791,'2005-06-16 20:04:28',301,76,'2005-06-23 22:30:28',1,'2006-02-15 21:30:53'),(1792,'2005-06-16 20:04:50',3800,351,'2005-06-26 00:57:50',1,'2006-02-15 21:30:53'),(1793,'2005-06-16 20:07:27',4356,230,'2005-06-19 20:55:27',1,'2006-02-15 21:30:53'),(1794,'2005-06-16 20:08:37',497,452,'2005-06-22 01:54:37',1,'2006-02-15 21:30:53'),(1795,'2005-06-16 20:09:01',536,56,'2005-06-24 17:50:01',2,'2006-02-15 21:30:53'),(1796,'2005-06-16 20:10:43',3229,283,'2005-06-20 19:12:43',1,'2006-02-15 21:30:53'),(1797,'2005-06-16 20:13:03',3435,275,'2005-06-22 22:56:03',1,'2006-02-15 21:30:53'),(1798,'2005-06-16 20:16:15',1654,429,'2005-06-20 22:23:15',2,'2006-02-15 21:30:53'),(1799,'2005-06-16 20:17:20',2847,505,'2005-06-20 23:55:20',1,'2006-02-15 21:30:53'),(1800,'2005-06-16 20:18:46',2058,149,'2005-06-20 17:12:46',1,'2006-02-15 21:30:53'),(1801,'2005-06-16 20:21:53',1015,10,'2005-06-18 23:18:53',1,'2006-02-15 21:30:53'),(1802,'2005-06-16 20:23:30',4174,455,'2005-06-21 20:02:30',1,'2006-02-15 21:30:53'),(1803,'2005-06-16 20:32:47',3784,127,'2005-06-21 02:03:47',1,'2006-02-15 21:30:53'),(1804,'2005-06-16 20:33:15',1152,570,'2005-06-18 02:31:15',2,'2006-02-15 21:30:53'),(1805,'2005-06-16 20:36:00',3962,208,'2005-06-17 16:27:00',1,'2006-02-15 21:30:53'),(1806,'2005-06-16 20:41:57',2053,45,'2005-06-18 19:25:57',2,'2006-02-15 21:30:53'),(1807,'2005-06-16 20:58:59',1174,338,'2005-06-20 21:31:59',2,'2006-02-15 21:30:53'),(1808,'2005-06-16 20:59:35',2424,466,'2005-06-24 15:31:35',1,'2006-02-15 21:30:53'),(1809,'2005-06-16 21:00:20',1071,517,'2005-06-25 20:25:20',1,'2006-02-15 21:30:53'),(1810,'2005-06-16 21:06:00',2368,7,'2005-06-21 21:24:00',1,'2006-02-15 21:30:53'),(1811,'2005-06-16 21:06:20',3700,235,'2005-06-21 21:59:20',2,'2006-02-15 21:30:53'),(1812,'2005-06-16 21:08:46',751,37,'2005-06-21 15:44:46',2,'2006-02-15 21:30:53'),(1813,'2005-06-16 21:11:00',1236,259,'2005-06-24 15:30:00',1,'2006-02-15 21:30:53'),(1814,'2005-06-16 21:15:22',39,144,'2005-06-23 17:00:22',1,'2006-02-15 21:30:53'),(1815,'2005-06-16 21:16:07',1551,84,'2005-06-17 16:37:07',2,'2006-02-15 21:30:53'),(1816,'2005-06-16 21:20:41',2861,594,'2005-06-18 02:21:41',1,'2006-02-15 21:30:53'),(1817,'2005-06-16 21:20:52',1354,574,'2005-06-19 16:24:52',2,'2006-02-15 21:30:53'),(1818,'2005-06-16 21:30:34',1218,63,'2005-06-20 03:27:34',2,'2006-02-15 21:30:53'),(1819,'2005-06-16 21:32:50',1689,386,'2005-06-26 01:11:50',1,'2006-02-15 21:30:53'),(1820,'2005-06-16 21:34:50',3672,120,'2005-06-20 16:50:50',1,'2006-02-15 21:30:53'),(1821,'2005-06-16 21:42:49',3207,468,'2005-06-20 16:25:49',2,'2006-02-15 21:30:53'),(1822,'2005-06-16 21:43:45',674,86,'2005-06-17 21:37:45',1,'2006-02-15 21:30:53'),(1823,'2005-06-16 21:48:16',3871,448,'2005-06-22 03:09:16',1,'2006-02-15 21:30:53'),(1824,'2005-06-16 21:51:04',2269,575,'2005-06-18 18:12:04',1,'2006-02-15 21:30:53'),(1825,'2005-06-16 21:53:05',2908,55,'2005-06-20 17:22:05',2,'2006-02-15 21:30:53'),(1826,'2005-06-16 21:53:52',421,578,'2005-06-25 18:46:52',2,'2006-02-15 21:30:53'),(1827,'2005-06-16 21:54:40',3804,423,'2005-06-19 21:28:40',2,'2006-02-15 21:30:53'),(1828,'2005-06-16 22:04:34',316,68,'2005-06-20 21:07:34',2,'2006-02-15 21:30:53'),(1829,'2005-06-16 22:14:21',617,293,'2005-06-21 16:51:21',1,'2006-02-15 21:30:53'),(1830,'2005-06-16 22:18:43',4010,499,'2005-06-23 21:14:43',2,'2006-02-15 21:30:53'),(1831,'2005-06-16 22:22:17',2610,383,'2005-06-25 23:23:17',2,'2006-02-15 21:30:53'),(1832,'2005-06-16 22:35:20',500,220,'2005-06-19 03:09:20',1,'2006-02-15 21:30:53'),(1833,'2005-06-16 22:45:03',1337,121,'2005-06-20 22:02:03',2,'2006-02-15 21:30:53'),(1834,'2005-06-16 22:49:08',4018,189,'2005-06-22 21:08:08',1,'2006-02-15 21:30:53'),(1835,'2005-06-16 23:05:36',1482,112,'2005-06-19 04:46:36',1,'2006-02-15 21:30:53'),(1836,'2005-06-16 23:13:05',2753,176,'2005-06-24 01:40:05',2,'2006-02-15 21:30:53'),(1837,'2005-06-16 23:16:15',1259,309,'2005-06-21 21:54:15',1,'2006-02-15 21:30:53'),(1838,'2005-06-16 23:20:16',513,31,'2005-06-20 02:34:16',1,'2006-02-15 21:30:53'),(1839,'2005-06-16 23:22:22',2750,223,'2005-06-23 00:33:22',1,'2006-02-15 21:30:53'),(1840,'2005-06-16 23:39:34',340,404,'2005-06-21 23:36:34',1,'2006-02-15 21:30:53'),(1841,'2005-06-16 23:44:13',2363,6,'2005-06-22 04:09:13',1,'2006-02-15 21:30:53'),(1842,'2005-06-16 23:45:59',1472,426,'2005-06-26 05:31:59',1,'2006-02-15 21:30:53'),(1843,'2005-06-16 23:53:42',2714,132,'2005-06-22 18:33:42',2,'2006-02-15 21:30:53'),(1844,'2005-06-16 23:53:53',2307,454,'2005-06-22 02:19:53',2,'2006-02-15 21:30:53'),(1845,'2005-06-16 23:56:11',3395,215,'2005-06-19 01:41:11',2,'2006-02-15 21:30:53'),(1846,'2005-06-17 00:02:44',1725,422,'2005-06-18 23:47:44',2,'2006-02-15 21:30:53'),(1847,'2005-06-17 00:05:22',1189,363,'2005-06-20 21:09:22',1,'2006-02-15 21:30:53'),(1848,'2005-06-17 00:07:07',3797,526,'2005-06-21 21:41:07',2,'2006-02-15 21:30:53'),(1849,'2005-06-17 00:13:19',2507,341,'2005-06-23 18:37:19',2,'2006-02-15 21:30:53'),(1850,'2005-06-17 00:31:35',761,517,'2005-06-25 05:19:35',1,'2006-02-15 21:30:53'),(1851,'2005-06-17 00:32:26',1121,451,'2005-06-22 19:54:26',2,'2006-02-15 21:30:53'),(1852,'2005-06-17 00:38:20',4122,271,'2005-06-22 20:04:20',2,'2006-02-15 21:30:53'),(1853,'2005-06-17 00:39:54',2949,301,'2005-06-19 00:22:54',2,'2006-02-15 21:30:53'),(1854,'2005-06-17 00:43:57',119,37,'2005-06-23 05:49:57',1,'2006-02-15 21:30:53'),(1855,'2005-06-17 00:54:58',4457,492,'2005-06-20 19:29:58',1,'2006-02-15 21:30:53'),(1856,'2005-06-17 01:02:00',3034,161,'2005-06-19 21:29:00',2,'2006-02-15 21:30:53'),(1857,'2005-06-17 01:12:58',4257,427,'2005-06-21 04:49:58',1,'2006-02-15 21:30:53'),(1858,'2005-06-17 01:13:11',3200,99,'2005-06-18 21:33:11',2,'2006-02-15 21:30:53'),(1859,'2005-06-17 01:13:38',3405,533,'2005-06-18 03:13:38',1,'2006-02-15 21:30:53'),(1860,'2005-06-17 01:17:12',1853,293,'2005-06-21 22:35:12',1,'2006-02-15 21:30:53'),(1861,'2005-06-17 01:17:31',135,454,'2005-06-25 02:11:31',1,'2006-02-15 21:30:53'),(1862,'2005-06-17 01:29:30',3299,553,'2005-06-25 20:43:30',1,'2006-02-15 21:30:53'),(1863,'2005-06-17 01:31:46',4466,550,'2005-06-26 02:09:46',2,'2006-02-15 21:30:53'),(1864,'2005-06-17 01:39:47',1815,130,'2005-06-24 19:39:47',2,'2006-02-15 21:30:53'),(1865,'2005-06-17 01:49:36',2657,526,'2005-06-23 21:13:36',1,'2006-02-15 21:30:53'),(1866,'2005-06-17 01:53:19',2579,575,'2005-06-19 06:14:19',2,'2006-02-15 21:30:53'),(1867,'2005-06-17 02:01:37',3537,415,'2005-06-25 04:52:37',2,'2006-02-15 21:30:53'),(1868,'2005-06-17 02:03:22',2412,380,'2005-06-25 04:38:22',1,'2006-02-15 21:30:53'),(1869,'2005-06-17 02:08:00',871,351,'2005-06-19 21:43:00',1,'2006-02-15 21:30:53'),(1870,'2005-06-17 02:24:36',895,191,'2005-06-17 23:04:36',2,'2006-02-15 21:30:53'),(1871,'2005-06-17 02:25:12',481,204,'2005-06-23 03:16:12',2,'2006-02-15 21:30:53'),(1872,'2005-06-17 02:27:03',3596,206,'2005-06-20 22:41:03',2,'2006-02-15 21:30:53'),(1873,'2005-06-17 02:38:28',2933,71,'2005-06-23 04:39:28',1,'2006-02-15 21:30:53'),(1874,'2005-06-17 02:39:20',3884,30,'2005-06-24 04:41:20',2,'2006-02-15 21:30:53'),(1875,'2005-06-17 02:45:10',1652,528,'2005-06-22 22:54:10',2,'2006-02-15 21:30:53'),(1876,'2005-06-17 02:50:51',384,459,'2005-06-18 07:21:51',1,'2006-02-15 21:30:53'),(1877,'2005-06-17 02:54:16',3404,261,'2005-06-25 21:51:16',2,'2006-02-15 21:30:53'),(1878,'2005-06-17 02:55:32',3319,381,'2005-06-21 03:44:32',1,'2006-02-15 21:30:53'),(1879,'2005-06-17 02:57:34',3983,343,'2005-06-19 00:00:34',1,'2006-02-15 21:30:53'),(1880,'2005-06-17 03:08:59',1133,289,'2005-06-19 07:16:59',1,'2006-02-15 21:30:53'),(1881,'2005-06-17 03:09:56',159,134,'2005-06-18 01:49:56',1,'2006-02-15 21:30:53'),(1882,'2005-06-17 03:17:21',1400,47,'2005-06-19 22:23:21',2,'2006-02-15 21:30:53'),(1883,'2005-06-17 03:18:51',3504,550,'2005-06-18 05:46:51',1,'2006-02-15 21:30:53'),(1884,'2005-06-17 03:19:20',4567,305,'2005-06-21 00:19:20',1,'2006-02-15 21:30:53'),(1885,'2005-06-17 03:35:59',740,588,'2005-06-21 05:57:59',2,'2006-02-15 21:30:53'),(1886,'2005-06-17 03:36:02',2367,505,'2005-06-19 08:12:02',2,'2006-02-15 21:30:53'),(1887,'2005-06-17 03:53:18',3591,32,'2005-06-25 07:37:18',2,'2006-02-15 21:30:53'),(1888,'2005-06-17 03:58:36',2872,405,'2005-06-22 09:28:36',1,'2006-02-15 21:30:53'),(1889,'2005-06-17 04:05:12',3909,572,'2005-06-26 04:13:12',1,'2006-02-15 21:30:53'),(1890,'2005-06-17 04:06:13',1764,447,'2005-06-22 07:46:13',2,'2006-02-15 21:30:53'),(1891,'2005-06-17 04:16:44',3576,109,'2005-06-24 07:20:44',1,'2006-02-15 21:30:53'),(1892,'2005-06-17 04:17:33',139,319,'2005-06-20 00:06:33',1,'2006-02-15 21:30:53'),(1893,'2005-06-17 04:18:37',3346,390,'2005-06-23 23:35:37',2,'2006-02-15 21:30:53'),(1894,'2005-06-17 04:18:48',3707,204,'2005-06-26 00:07:48',1,'2006-02-15 21:30:53'),(1895,'2005-06-17 04:25:12',680,30,'2005-06-26 08:44:12',1,'2006-02-15 21:30:53'),(1896,'2005-06-17 04:25:46',2077,270,'2005-06-26 09:37:46',1,'2006-02-15 21:30:53'),(1897,'2005-06-17 04:26:23',4142,422,'2005-06-25 09:32:23',2,'2006-02-15 21:30:53'),(1898,'2005-06-17 04:28:11',2873,143,'2005-06-25 07:04:11',2,'2006-02-15 21:30:53'),(1899,'2005-06-17 04:29:15',858,200,'2005-06-26 08:39:15',1,'2006-02-15 21:30:53'),(1900,'2005-06-17 04:29:58',1425,34,'2005-06-21 05:58:58',1,'2006-02-15 21:30:53'),(1901,'2005-06-17 04:35:19',2469,292,'2005-06-25 06:09:19',2,'2006-02-15 21:30:53'),(1902,'2005-06-17 04:35:52',2905,479,'2005-06-20 06:52:52',2,'2006-02-15 21:30:53'),(1903,'2005-06-17 04:37:20',1939,588,'2005-06-26 09:05:20',2,'2006-02-15 21:30:53'),(1904,'2005-06-17 04:45:41',2472,87,'2005-06-17 23:56:41',2,'2006-02-15 21:30:53'),(1905,'2005-06-17 04:51:43',1043,39,'2005-06-24 09:35:43',1,'2006-02-15 21:30:53'),(1906,'2005-06-17 04:53:35',1049,455,'2005-06-21 01:16:35',2,'2006-02-15 21:30:53'),(1907,'2005-06-17 05:08:27',988,66,'2005-06-23 09:13:27',1,'2006-02-15 21:30:53'),(1908,'2005-06-17 05:10:36',399,358,'2005-06-19 03:52:36',1,'2006-02-15 21:30:53'),(1909,'2005-06-17 05:11:04',2599,269,'2005-06-19 04:33:04',2,'2006-02-15 21:30:53'),(1910,'2005-06-17 05:11:27',3903,199,'2005-06-23 23:16:27',1,'2006-02-15 21:30:53'),(1911,'2005-06-17 05:15:15',910,3,'2005-06-24 11:05:15',2,'2006-02-15 21:30:53'),(1912,'2005-06-17 05:18:32',4136,538,'2005-06-20 10:01:32',2,'2006-02-15 21:30:53'),(1913,'2005-06-17 05:19:47',1825,116,'2005-06-21 03:39:47',1,'2006-02-15 21:30:53'),(1914,'2005-06-17 05:25:54',3406,450,'2005-06-24 04:25:54',2,'2006-02-15 21:30:53'),(1915,'2005-06-17 05:28:28',2620,393,'2005-06-21 07:12:28',2,'2006-02-15 21:30:53'),(1916,'2005-06-17 05:29:59',4428,429,'2005-06-26 05:35:59',2,'2006-02-15 21:30:53'),(1917,'2005-06-17 05:36:07',2667,400,'2005-06-24 01:44:07',1,'2006-02-15 21:30:53'),(1918,'2005-06-17 05:40:14',3749,310,'2005-06-21 08:53:14',2,'2006-02-15 21:30:53'),(1919,'2005-06-17 05:40:52',3855,197,'2005-06-23 05:58:52',1,'2006-02-15 21:30:53'),(1920,'2005-06-17 06:00:23',2199,75,'2005-06-24 04:49:23',1,'2006-02-15 21:30:53'),(1921,'2005-06-17 06:04:16',4369,417,'2005-06-23 05:26:16',2,'2006-02-15 21:30:53'),(1922,'2005-06-17 06:04:25',2484,343,'2005-06-18 09:15:25',2,'2006-02-15 21:30:53'),(1923,'2005-06-17 06:06:10',691,400,'2005-06-24 04:29:10',2,'2006-02-15 21:30:53'),(1924,'2005-06-17 06:13:34',2577,86,'2005-06-18 01:51:34',1,'2006-02-15 21:30:53'),(1925,'2005-06-17 06:16:47',3995,510,'2005-06-21 06:03:47',1,'2006-02-15 21:30:53'),(1926,'2005-06-17 06:24:30',3509,462,'2005-06-25 03:39:30',2,'2006-02-15 21:30:53'),(1927,'2005-06-17 06:48:19',3304,188,'2005-06-21 03:23:19',1,'2006-02-15 21:30:53'),(1928,'2005-06-17 06:48:31',3454,353,'2005-06-26 08:17:31',1,'2006-02-15 21:30:53'),(1929,'2005-06-17 06:49:30',573,327,'2005-06-22 12:07:30',2,'2006-02-15 21:30:53'),(1930,'2005-06-17 06:50:46',79,112,'2005-06-19 08:51:46',2,'2006-02-15 21:30:53'),(1931,'2005-06-17 06:51:56',1411,391,'2005-06-22 08:27:56',1,'2006-02-15 21:30:53'),(1932,'2005-06-17 06:54:41',3185,120,'2005-06-19 05:12:41',2,'2006-02-15 21:30:53'),(1933,'2005-06-17 06:54:42',980,13,'2005-06-26 02:00:42',1,'2006-02-15 21:30:53'),(1934,'2005-06-17 07:04:57',4000,16,'2005-06-25 12:21:57',2,'2006-02-15 21:30:53'),(1935,'2005-06-17 07:14:15',1962,295,'2005-06-20 05:59:15',1,'2006-02-15 21:30:53'),(1936,'2005-06-17 07:15:41',3037,213,'2005-06-18 11:37:41',2,'2006-02-15 21:30:53'),(1937,'2005-06-17 07:16:46',1266,385,'2005-06-21 04:22:46',2,'2006-02-15 21:30:53'),(1938,'2005-06-17 07:18:36',570,454,'2005-06-19 01:43:36',2,'2006-02-15 21:30:53'),(1939,'2005-06-17 07:26:45',605,11,'2005-06-25 13:06:45',2,'2006-02-15 21:30:53'),(1940,'2005-06-17 07:42:22',105,451,'2005-06-22 11:59:22',1,'2006-02-15 21:30:53'),(1941,'2005-06-17 07:42:45',1063,519,'2005-06-20 07:12:45',1,'2006-02-15 21:30:53'),(1942,'2005-06-17 07:43:39',261,143,'2005-06-25 02:24:39',1,'2006-02-15 21:30:53'),(1943,'2005-06-17 07:49:17',4327,144,'2005-06-20 03:47:17',1,'2006-02-15 21:30:53'),(1944,'2005-06-17 07:50:53',318,16,'2005-06-23 02:52:53',2,'2006-02-15 21:30:53'),(1945,'2005-06-17 07:51:26',3366,207,'2005-06-23 13:22:26',2,'2006-02-15 21:30:53'),(1946,'2005-06-17 07:58:39',2335,389,'2005-06-25 06:49:39',2,'2006-02-15 21:30:53'),(1947,'2005-06-17 08:02:20',3344,479,'2005-06-25 10:25:20',1,'2006-02-15 21:30:53'),(1948,'2005-06-17 08:06:53',46,89,'2005-06-21 05:00:53',1,'2006-02-15 21:30:53'),(1949,'2005-06-17 08:19:22',1478,208,'2005-06-25 08:43:22',1,'2006-02-15 21:30:53'),(1950,'2005-06-17 08:26:52',723,594,'2005-06-22 08:08:52',2,'2006-02-15 21:30:53'),(1951,'2005-06-17 08:30:35',955,123,'2005-06-20 10:43:35',2,'2006-02-15 21:30:53'),(1952,'2005-06-17 08:33:02',1823,338,'2005-06-21 14:00:02',2,'2006-02-15 21:30:53'),(1953,'2005-06-17 08:34:57',3549,405,'2005-06-24 09:38:57',2,'2006-02-15 21:30:53'),(1954,'2005-06-17 08:37:55',3203,533,'2005-06-20 02:55:55',2,'2006-02-15 21:30:53'),(1955,'2005-06-17 08:40:22',811,311,'2005-06-19 10:47:22',1,'2006-02-15 21:30:53'),(1956,'2005-06-17 08:43:32',1403,492,'2005-06-21 11:08:32',1,'2006-02-15 21:30:53'),(1957,'2005-06-17 08:50:58',2496,68,'2005-06-26 13:39:58',2,'2006-02-15 21:30:53'),(1958,'2005-06-17 08:52:01',1843,581,'2005-06-23 07:55:01',2,'2006-02-15 21:30:53'),(1959,'2005-06-17 08:54:10',1464,554,'2005-06-20 05:02:10',2,'2006-02-15 21:30:53'),(1960,'2005-06-17 08:59:57',2202,27,'2005-06-23 14:38:57',2,'2006-02-15 21:30:53'),(1961,'2005-06-17 09:02:58',2851,384,'2005-06-20 03:07:58',1,'2006-02-15 21:30:53'),(1962,'2005-06-17 09:08:58',4386,536,'2005-06-23 14:55:58',1,'2006-02-15 21:30:53'),(1963,'2005-06-17 09:09:31',1943,154,'2005-06-24 13:16:31',2,'2006-02-15 21:30:53'),(1964,'2005-06-17 09:10:09',3390,53,'2005-06-21 15:08:09',1,'2006-02-15 21:30:53'),(1965,'2005-06-17 09:17:39',480,256,'2005-06-18 12:35:39',2,'2006-02-15 21:30:53'),(1966,'2005-06-17 09:19:45',2085,6,'2005-06-20 11:19:45',1,'2006-02-15 21:30:53'),(1967,'2005-06-17 09:19:52',3225,558,'2005-06-21 03:35:52',1,'2006-02-15 21:30:53'),(1968,'2005-06-17 09:20:36',1139,246,'2005-06-18 11:06:36',2,'2006-02-15 21:30:53'),(1969,'2005-06-17 09:22:22',4450,337,'2005-06-21 05:31:22',2,'2006-02-15 21:30:53'),(1970,'2005-06-17 09:23:16',1358,303,'2005-06-22 09:40:16',2,'2006-02-15 21:30:53'),(1971,'2005-06-17 09:23:59',2870,357,'2005-06-25 13:20:59',2,'2006-02-15 21:30:53'),(1972,'2005-06-17 09:25:49',2758,526,'2005-06-24 09:59:49',2,'2006-02-15 21:30:53'),(1973,'2005-06-17 09:26:15',3669,256,'2005-06-21 10:18:15',1,'2006-02-15 21:30:53'),(1974,'2005-06-17 09:30:05',1979,111,'2005-06-21 12:10:05',1,'2006-02-15 21:30:53'),(1975,'2005-06-17 09:32:10',2520,468,'2005-06-23 03:50:10',2,'2006-02-15 21:30:53'),(1976,'2005-06-17 09:38:08',3631,184,'2005-06-23 07:23:08',2,'2006-02-15 21:30:53'),(1977,'2005-06-17 09:38:22',2468,459,'2005-06-23 14:19:22',2,'2006-02-15 21:30:53'),(1978,'2005-06-17 09:42:34',1590,278,'2005-06-20 09:13:34',2,'2006-02-15 21:30:53'),(1979,'2005-06-17 09:45:30',3470,45,'2005-06-20 10:52:30',1,'2006-02-15 21:30:53'),(1980,'2005-06-17 09:48:05',2985,328,'2005-06-23 14:43:05',1,'2006-02-15 21:30:53'),(1981,'2005-06-17 10:03:34',3186,526,'2005-06-20 13:14:34',2,'2006-02-15 21:30:53'),(1982,'2005-06-17 10:12:15',1091,566,'2005-06-20 13:56:15',1,'2006-02-15 21:30:53'),(1983,'2005-06-17 10:22:13',1955,365,'2005-06-24 05:04:13',1,'2006-02-15 21:30:53'),(1984,'2005-06-17 10:25:28',3417,380,'2005-06-23 08:18:28',2,'2006-02-15 21:30:53'),(1985,'2005-06-17 10:31:37',87,411,'2005-06-22 11:17:37',1,'2006-02-15 21:30:53'),(1986,'2005-06-17 10:34:59',2894,541,'2005-06-24 04:57:59',2,'2006-02-15 21:30:53'),(1987,'2005-06-17 10:40:36',110,479,'2005-06-23 14:23:36',1,'2006-02-15 21:30:53'),(1988,'2005-06-17 10:42:34',3054,261,'2005-06-25 11:47:34',2,'2006-02-15 21:30:53'),(1989,'2005-06-17 10:47:24',634,35,'2005-06-19 05:12:24',1,'2006-02-15 21:30:53'),(1990,'2005-06-17 10:48:44',1471,571,'2005-06-24 08:11:44',1,'2006-02-15 21:30:53'),(1991,'2005-06-17 10:49:23',3963,105,'2005-06-25 10:48:23',1,'2006-02-15 21:30:53'),(1992,'2005-06-17 10:58:53',636,233,'2005-06-19 08:42:53',2,'2006-02-15 21:30:53'),(1993,'2005-06-17 10:59:24',168,234,'2005-06-23 07:30:24',2,'2006-02-15 21:30:53'),(1994,'2005-06-17 11:07:06',2203,346,'2005-06-25 08:32:06',2,'2006-02-15 21:30:53'),(1995,'2005-06-17 11:11:14',1866,10,'2005-06-26 16:37:14',1,'2006-02-15 21:30:53'),(1996,'2005-06-17 11:17:45',3074,149,'2005-06-26 09:42:45',1,'2006-02-15 21:30:53'),(1997,'2005-06-17 11:19:43',846,411,'2005-06-19 14:18:43',1,'2006-02-15 21:30:53'),(1998,'2005-06-17 11:24:57',4365,562,'2005-06-26 09:48:57',1,'2006-02-15 21:30:53'),(1999,'2005-06-17 11:30:08',3704,111,'2005-06-23 08:36:08',1,'2006-02-15 21:30:53'),(2000,'2005-06-17 11:32:30',323,163,'2005-06-22 13:37:30',1,'2006-02-15 21:30:53'),(2001,'2005-06-17 11:35:09',2069,260,'2005-06-21 14:52:09',2,'2006-02-15 21:30:53'),(2002,'2005-06-17 11:39:58',2406,514,'2005-06-24 15:41:58',2,'2006-02-15 21:30:53'),(2003,'2005-06-17 11:40:35',1581,515,'2005-06-19 08:30:35',2,'2006-02-15 21:30:53'),(2004,'2005-06-17 11:43:38',1342,171,'2005-06-24 08:05:38',2,'2006-02-15 21:30:53'),(2005,'2005-06-17 11:44:54',4177,234,'2005-06-19 10:53:54',1,'2006-02-15 21:30:53'),(2006,'2005-06-17 11:47:03',992,215,'2005-06-19 13:47:03',2,'2006-02-15 21:30:53'),(2007,'2005-06-17 11:47:17',1123,572,'2005-06-21 07:19:17',1,'2006-02-15 21:30:53'),(2008,'2005-06-17 11:48:05',2081,570,'2005-06-25 13:16:05',1,'2006-02-15 21:30:53'),(2009,'2005-06-17 11:48:31',1902,119,'2005-06-18 09:34:31',2,'2006-02-15 21:30:53'),(2010,'2005-06-17 11:54:15',2845,329,'2005-06-21 05:55:15',1,'2006-02-15 21:30:53'),(2011,'2005-06-17 11:56:09',734,350,'2005-06-24 06:47:09',2,'2006-02-15 21:30:53'),(2012,'2005-06-17 11:57:15',3588,84,'2005-06-24 17:18:15',1,'2006-02-15 21:30:53'),(2013,'2005-06-17 12:03:01',3256,165,'2005-06-24 10:04:01',1,'2006-02-15 21:30:53'),(2014,'2005-06-17 12:03:28',2969,337,'2005-06-25 16:00:28',2,'2006-02-15 21:30:53'),(2015,'2005-06-17 12:16:29',3776,484,'2005-06-18 14:40:29',2,'2006-02-15 21:30:53'),(2016,'2005-06-17 12:18:36',4265,282,'2005-06-20 12:13:36',1,'2006-02-15 21:30:53'),(2017,'2005-06-17 12:33:30',1434,516,'2005-06-19 10:08:30',2,'2006-02-15 21:30:53'),(2018,'2005-06-17 12:35:58',1278,380,'2005-06-26 13:16:58',2,'2006-02-15 21:30:53'),(2019,'2005-06-17 12:38:44',2314,528,'2005-06-23 17:38:44',2,'2006-02-15 21:30:53'),(2020,'2005-06-17 12:39:50',1914,384,'2005-06-19 14:59:50',1,'2006-02-15 21:30:53'),(2021,'2005-06-17 12:41:18',2852,319,'2005-06-23 17:17:18',2,'2006-02-15 21:30:53'),(2022,'2005-06-17 12:44:39',3053,547,'2005-06-25 12:32:39',1,'2006-02-15 21:30:53'),(2023,'2005-06-17 12:52:58',787,169,'2005-06-23 11:07:58',1,'2006-02-15 21:30:53'),(2024,'2005-06-17 13:00:51',2566,329,'2005-06-22 07:03:51',1,'2006-02-15 21:30:53'),(2025,'2005-06-17 13:04:00',1203,447,'2005-06-18 18:45:00',2,'2006-02-15 21:30:53'),(2026,'2005-06-17 13:05:38',3681,491,'2005-06-21 17:19:38',1,'2006-02-15 21:30:53'),(2027,'2005-06-17 13:06:56',4309,265,'2005-06-23 13:46:56',1,'2006-02-15 21:30:53'),(2028,'2005-06-17 13:08:08',4451,155,'2005-06-23 10:54:08',1,'2006-02-15 21:30:53'),(2029,'2005-06-17 13:10:59',914,512,'2005-06-19 18:15:59',1,'2006-02-15 21:30:53'),(2030,'2005-06-17 13:13:27',4024,457,'2005-06-19 10:44:27',1,'2006-02-15 21:30:53'),(2031,'2005-06-17 13:14:03',4275,570,'2005-06-25 10:06:03',2,'2006-02-15 21:30:53'),(2032,'2005-06-17 13:24:07',425,316,'2005-06-18 18:18:07',1,'2006-02-15 21:30:53'),(2033,'2005-06-17 13:24:43',58,90,'2005-06-20 12:34:43',1,'2006-02-15 21:30:53'),(2034,'2005-06-17 13:27:16',1512,587,'2005-06-22 08:53:16',2,'2006-02-15 21:30:53'),(2035,'2005-06-17 13:45:09',4371,158,'2005-06-26 15:30:09',2,'2006-02-15 21:30:53'),(2036,'2005-06-17 13:46:52',100,486,'2005-06-18 15:42:52',2,'2006-02-15 21:30:53'),(2037,'2005-06-17 13:54:20',2582,308,'2005-06-20 14:49:20',2,'2006-02-15 21:30:53'),(2038,'2005-06-17 14:00:51',4231,138,'2005-06-19 11:54:51',2,'2006-02-15 21:30:53'),(2039,'2005-06-17 14:03:43',1514,304,'2005-06-24 09:21:43',1,'2006-02-15 21:30:53'),(2040,'2005-06-17 14:18:37',227,260,'2005-06-22 19:08:37',1,'2006-02-15 21:30:53'),(2041,'2005-06-17 14:19:00',782,348,'2005-06-26 08:38:00',2,'2006-02-15 21:30:53'),(2042,'2005-06-17 14:31:02',3102,84,'2005-06-18 14:43:02',1,'2006-02-15 21:30:53'),(2043,'2005-06-17 14:31:12',2495,4,'2005-06-19 11:04:12',2,'2006-02-15 21:30:53'),(2044,'2005-06-17 14:37:57',2418,484,'2005-06-22 17:15:57',2,'2006-02-15 21:30:53'),(2045,'2005-06-17 14:38:11',561,391,'2005-06-26 13:44:11',2,'2006-02-15 21:30:53'),(2046,'2005-06-17 14:39:50',872,374,'2005-06-24 16:02:50',1,'2006-02-15 21:30:53'),(2047,'2005-06-17 14:40:58',2371,201,'2005-06-21 08:52:58',1,'2006-02-15 21:30:53'),(2048,'2005-06-17 14:55:29',2055,454,'2005-06-23 16:29:29',2,'2006-02-15 21:30:53'),(2049,'2005-06-17 14:58:36',1053,182,'2005-06-22 14:53:36',2,'2006-02-15 21:30:53'),(2050,'2005-06-17 15:07:30',1963,549,'2005-06-18 14:43:30',1,'2006-02-15 21:30:53'),(2051,'2005-06-17 15:10:16',2366,191,'2005-06-19 20:45:16',1,'2006-02-15 21:30:53'),(2052,'2005-06-17 15:14:43',1686,172,'2005-06-21 11:08:43',1,'2006-02-15 21:30:53'),(2053,'2005-06-17 15:19:34',4279,521,'2005-06-19 10:06:34',2,'2006-02-15 21:30:53'),(2054,'2005-06-17 15:26:37',1588,295,'2005-06-26 14:22:37',1,'2006-02-15 21:30:53'),(2055,'2005-06-17 15:27:03',1399,593,'2005-06-25 13:44:03',1,'2006-02-15 21:30:53'),(2056,'2005-06-17 15:27:33',229,42,'2005-06-20 13:04:33',2,'2006-02-15 21:30:53'),(2057,'2005-06-17 15:31:58',2803,190,'2005-06-25 09:39:58',1,'2006-02-15 21:30:53'),(2058,'2005-06-17 15:34:41',1324,57,'2005-06-25 14:50:41',1,'2006-02-15 21:30:53'),(2059,'2005-06-17 15:36:12',739,114,'2005-06-18 19:01:12',2,'2006-02-15 21:30:53'),(2060,'2005-06-17 15:42:42',1523,64,'2005-06-22 16:39:42',1,'2006-02-15 21:30:53'),(2061,'2005-06-17 15:47:00',4575,108,'2005-06-24 16:36:00',2,'2006-02-15 21:30:53'),(2062,'2005-06-17 15:56:43',1749,55,'2005-06-20 21:37:43',2,'2006-02-15 21:30:53'),(2063,'2005-06-17 15:56:53',4323,5,'2005-06-21 14:19:53',1,'2006-02-15 21:30:53'),(2064,'2005-06-17 15:57:56',1970,67,'2005-06-23 21:04:56',2,'2006-02-15 21:30:53'),(2065,'2005-06-17 16:03:46',844,266,'2005-06-22 16:41:46',2,'2006-02-15 21:30:53'),(2066,'2005-06-17 16:07:08',2561,248,'2005-06-24 15:20:08',2,'2006-02-15 21:30:53'),(2067,'2005-06-17 16:11:08',1711,297,'2005-06-22 13:01:08',2,'2006-02-15 21:30:53'),(2068,'2005-06-17 16:11:46',4252,387,'2005-06-20 11:28:46',1,'2006-02-15 21:30:53'),(2069,'2005-06-17 16:19:39',2746,551,'2005-06-26 16:48:39',1,'2006-02-15 21:30:53'),(2070,'2005-06-17 16:27:51',2609,24,'2005-06-20 20:46:51',1,'2006-02-15 21:30:53'),(2071,'2005-06-17 16:33:17',2867,479,'2005-06-23 21:51:17',1,'2006-02-15 21:30:53'),(2072,'2005-06-17 16:33:32',86,261,'2005-06-23 13:22:32',1,'2006-02-15 21:30:53'),(2073,'2005-06-17 16:33:59',3530,410,'2005-06-19 11:57:59',1,'2006-02-15 21:30:53'),(2074,'2005-06-17 16:40:03',71,495,'2005-06-20 21:34:03',1,'2006-02-15 21:30:53'),(2075,'2005-06-17 16:40:33',2415,459,'2005-06-19 13:55:33',2,'2006-02-15 21:30:53'),(2076,'2005-06-17 16:43:47',2242,217,'2005-06-24 11:12:47',1,'2006-02-15 21:30:53'),(2077,'2005-06-17 16:46:11',4478,113,'2005-06-19 15:10:11',1,'2006-02-15 21:30:53'),(2078,'2005-06-17 16:48:55',2021,278,'2005-06-19 18:01:55',1,'2006-02-15 21:30:53'),(2079,'2005-06-17 16:49:45',3853,465,'2005-06-18 18:10:45',1,'2006-02-15 21:30:53'),(2080,'2005-06-17 16:59:40',1231,476,'2005-06-21 11:28:40',2,'2006-02-15 21:30:53'),(2081,'2005-06-17 17:05:02',917,253,'2005-06-26 20:26:02',1,'2006-02-15 21:30:53'),(2082,'2005-06-17 17:13:32',434,254,'2005-06-19 16:16:32',1,'2006-02-15 21:30:53'),(2083,'2005-06-17 17:14:00',2423,97,'2005-06-18 18:31:00',2,'2006-02-15 21:30:53'),(2084,'2005-06-17 17:17:19',428,92,'2005-06-22 14:57:19',1,'2006-02-15 21:30:53'),(2085,'2005-06-17 17:30:56',2275,214,'2005-06-23 12:13:56',1,'2006-02-15 21:30:53'),(2086,'2005-06-17 17:32:07',898,326,'2005-06-21 20:19:07',2,'2006-02-15 21:30:53'),(2087,'2005-06-17 17:35:10',466,398,'2005-06-26 13:52:10',1,'2006-02-15 21:30:53'),(2088,'2005-06-17 17:35:30',506,310,'2005-06-23 20:13:30',2,'2006-02-15 21:30:53'),(2089,'2005-06-17 17:45:09',4030,156,'2005-06-25 16:41:09',1,'2006-02-15 21:30:53'),(2090,'2005-06-17 18:06:14',17,197,'2005-06-22 23:52:14',1,'2006-02-15 21:30:53'),(2091,'2005-06-17 18:09:04',4033,260,'2005-06-26 12:11:04',1,'2006-02-15 21:30:53'),(2092,'2005-06-17 18:12:16',4427,556,'2005-06-25 15:06:16',2,'2006-02-15 21:30:53'),(2093,'2005-06-17 18:14:08',814,26,'2005-06-26 18:10:08',1,'2006-02-15 21:30:53'),(2094,'2005-06-17 18:18:56',2205,308,'2005-06-18 19:36:56',1,'2006-02-15 21:30:53'),(2095,'2005-06-17 18:21:35',1907,8,'2005-06-23 23:49:35',2,'2006-02-15 21:30:53'),(2096,'2005-06-17 18:33:04',1069,431,'2005-06-21 17:29:04',2,'2006-02-15 21:30:53'),(2097,'2005-06-17 18:40:04',569,439,'2005-06-23 13:49:04',1,'2006-02-15 21:30:53'),(2098,'2005-06-17 18:42:09',3951,274,'2005-06-19 20:40:09',1,'2006-02-15 21:30:53'),(2099,'2005-06-17 18:47:26',3660,146,'2005-06-24 22:31:26',2,'2006-02-15 21:30:53'),(2100,'2005-06-17 18:53:21',2267,387,'2005-06-19 21:49:21',2,'2006-02-15 21:30:53'),(2101,'2005-06-17 18:57:02',2137,581,'2005-06-20 15:38:02',2,'2006-02-15 21:30:53'),(2102,'2005-06-17 19:05:22',2316,486,'2005-06-23 23:21:22',2,'2006-02-15 21:30:53'),(2103,'2005-06-17 19:13:10',1469,456,'2005-06-21 21:32:10',2,'2006-02-15 21:30:53'),(2104,'2005-06-17 19:14:30',3084,136,'2005-06-19 16:26:30',1,'2006-02-15 21:30:53'),(2105,'2005-06-17 19:15:45',4090,57,'2005-06-20 16:00:45',1,'2006-02-15 21:30:53'),(2106,'2005-06-17 19:29:03',643,66,'2005-06-23 18:17:03',2,'2006-02-15 21:30:53'),(2107,'2005-06-17 19:31:16',1270,104,'2005-06-18 23:33:16',1,'2006-02-15 21:30:53'),(2108,'2005-06-17 19:35:26',1395,503,'2005-06-25 15:45:26',1,'2006-02-15 21:30:53'),(2109,'2005-06-17 19:41:42',2292,493,'2005-06-25 17:03:42',2,'2006-02-15 21:30:53'),(2110,'2005-06-17 19:45:49',3592,163,'2005-06-26 18:59:49',2,'2006-02-15 21:30:53'),(2111,'2005-06-17 19:47:21',2108,76,'2005-06-19 22:46:21',2,'2006-02-15 21:30:53'),(2112,'2005-06-17 19:52:42',1629,18,'2005-06-25 00:00:42',2,'2006-02-15 21:30:53'),(2113,'2005-06-17 19:57:46',1509,406,'2005-06-24 00:22:46',1,'2006-02-15 21:30:53'),(2114,'2005-06-17 20:00:25',3541,358,'2005-06-23 18:51:25',1,'2006-02-15 21:30:53'),(2115,'2005-06-17 20:02:16',3448,270,'2005-06-25 16:56:16',2,'2006-02-15 21:30:53'),(2116,'2005-06-17 20:16:12',2373,24,'2005-06-18 17:03:12',2,'2006-02-15 21:30:53'),(2117,'2005-06-17 20:24:00',2,170,'2005-06-23 17:45:00',2,'2006-02-15 21:30:53'),(2118,'2005-06-17 20:28:29',1261,103,'2005-06-23 22:47:29',1,'2006-02-15 21:30:53'),(2119,'2005-06-17 20:34:42',2104,561,'2005-06-22 00:05:42',1,'2006-02-15 21:30:53'),(2120,'2005-06-17 20:36:50',1498,182,'2005-06-27 01:18:50',2,'2006-02-15 21:30:53'),(2121,'2005-06-17 20:38:54',141,467,'2005-06-22 23:06:54',2,'2006-02-15 21:30:53'),(2122,'2005-06-17 20:48:27',2932,245,'2005-06-23 00:58:27',2,'2006-02-15 21:30:53'),(2123,'2005-06-17 20:48:30',2497,545,'2005-06-18 19:17:30',2,'2006-02-15 21:30:53'),(2124,'2005-06-17 20:49:14',1273,178,'2005-06-23 17:44:14',1,'2006-02-15 21:30:53'),(2125,'2005-06-17 20:53:42',4303,473,'2005-06-19 01:53:42',2,'2006-02-15 21:30:53'),(2126,'2005-06-17 20:54:36',4276,263,'2005-06-27 02:16:36',1,'2006-02-15 21:30:53'),(2127,'2005-06-17 20:54:48',3757,187,'2005-06-18 16:28:48',2,'2006-02-15 21:30:53'),(2128,'2005-06-17 20:54:58',352,2,'2005-06-24 00:41:58',2,'2006-02-15 21:30:53'),(2129,'2005-06-17 20:58:32',1930,249,'2005-06-23 22:22:32',1,'2006-02-15 21:30:53'),(2130,'2005-06-17 21:00:44',1369,413,'2005-06-26 00:05:44',2,'2006-02-15 21:30:53'),(2131,'2005-06-17 21:02:25',4424,85,'2005-06-25 18:45:25',1,'2006-02-15 21:30:53'),(2132,'2005-06-17 21:05:06',2636,186,'2005-06-20 18:10:06',1,'2006-02-15 21:30:53'),(2133,'2005-06-17 21:10:05',932,268,'2005-06-23 22:41:05',1,'2006-02-15 21:30:53'),(2134,'2005-06-17 21:13:44',1699,378,'2005-06-26 16:28:44',2,'2006-02-15 21:30:53'),(2135,'2005-06-17 21:14:02',4091,39,'2005-06-19 00:59:02',1,'2006-02-15 21:30:53'),(2136,'2005-06-17 21:16:41',2651,20,'2005-06-24 22:42:41',2,'2006-02-15 21:30:53'),(2137,'2005-06-17 21:18:28',1158,581,'2005-06-20 21:05:28',1,'2006-02-15 21:30:53'),(2138,'2005-06-17 21:28:14',512,254,'2005-06-22 01:16:14',2,'2006-02-15 21:30:53'),(2139,'2005-06-17 21:29:34',807,236,'2005-06-26 21:05:34',1,'2006-02-15 21:30:53'),(2140,'2005-06-17 21:40:29',2395,56,'2005-06-19 00:42:29',1,'2006-02-15 21:30:53'),(2141,'2005-06-17 21:41:34',2176,86,'2005-06-19 00:15:34',1,'2006-02-15 21:30:53'),(2142,'2005-06-17 21:55:43',1787,253,'2005-06-26 19:41:43',2,'2006-02-15 21:30:53'),(2143,'2005-06-17 21:58:13',1257,507,'2005-06-19 23:59:13',2,'2006-02-15 21:30:53'),(2144,'2005-06-17 22:05:40',3303,46,'2005-06-21 02:53:40',1,'2006-02-15 21:30:53'),(2145,'2005-06-17 22:10:36',238,388,'2005-06-18 21:07:36',2,'2006-02-15 21:30:53'),(2146,'2005-06-17 22:26:23',326,456,'2005-06-26 17:10:23',1,'2006-02-15 21:30:53'),(2147,'2005-06-17 22:28:13',2752,279,'2005-06-22 20:50:13',1,'2006-02-15 21:30:53'),(2148,'2005-06-17 22:44:35',315,338,'2005-06-26 19:43:35',1,'2006-02-15 21:30:53'),(2149,'2005-06-17 22:50:00',3365,333,'2005-06-26 18:40:00',1,'2006-02-15 21:30:53'),(2150,'2005-06-17 22:50:36',1910,406,'2005-06-21 19:33:36',1,'2006-02-15 21:30:53'),(2151,'2005-06-17 22:52:37',407,329,'2005-06-20 22:00:37',1,'2006-02-15 21:30:53'),(2152,'2005-06-17 22:53:27',2665,307,'2005-06-23 19:19:27',1,'2006-02-15 21:30:53'),(2153,'2005-06-17 22:58:04',2440,357,'2005-06-24 19:38:04',2,'2006-02-15 21:30:53'),(2154,'2005-06-17 22:59:42',1655,30,'2005-06-24 04:11:42',1,'2006-02-15 21:30:53'),(2155,'2005-06-17 23:07:29',3640,227,'2005-06-25 03:23:29',2,'2006-02-15 21:30:53'),(2156,'2005-06-17 23:08:12',623,237,'2005-06-22 19:44:12',2,'2006-02-15 21:30:53'),(2157,'2005-06-17 23:30:52',1619,201,'2005-06-24 01:56:52',2,'2006-02-15 21:30:53'),(2158,'2005-06-17 23:36:27',243,530,'2005-06-19 19:25:27',2,'2006-02-15 21:30:53'),(2159,'2005-06-17 23:37:29',3095,465,'2005-06-25 00:18:29',2,'2006-02-15 21:30:53'),(2160,'2005-06-17 23:39:11',1644,32,'2005-06-22 20:04:11',1,'2006-02-15 21:30:53'),(2161,'2005-06-17 23:39:50',3149,75,'2005-06-26 23:28:50',2,'2006-02-15 21:30:53'),(2162,'2005-06-17 23:45:47',1790,277,'2005-06-21 21:03:47',1,'2006-02-15 21:30:53'),(2163,'2005-06-17 23:46:16',2600,130,'2005-06-22 22:48:16',2,'2006-02-15 21:30:53'),(2164,'2005-06-17 23:46:21',3442,227,'2005-06-24 19:10:21',2,'2006-02-15 21:30:53'),(2165,'2005-06-17 23:51:10',2392,471,'2005-06-21 23:54:10',1,'2006-02-15 21:30:53'),(2166,'2005-06-17 23:51:21',4343,305,'2005-06-27 01:06:21',2,'2006-02-15 21:30:53'),(2167,'2005-06-17 23:51:28',3796,307,'2005-06-21 00:43:28',2,'2006-02-15 21:30:53'),(2168,'2005-06-17 23:53:24',802,308,'2005-06-20 01:11:24',1,'2006-02-15 21:30:53'),(2169,'2005-06-17 23:57:23',785,120,'2005-06-19 20:14:23',2,'2006-02-15 21:30:53'),(2170,'2005-06-17 23:57:34',3989,42,'2005-06-22 03:37:34',2,'2006-02-15 21:30:53'),(2171,'2005-06-18 00:06:04',1768,147,'2005-06-24 18:09:04',2,'2006-02-15 21:30:53'),(2172,'2005-06-18 00:06:16',2912,457,'2005-06-26 00:50:16',1,'2006-02-15 21:30:53'),(2173,'2005-06-18 00:08:20',995,65,'2005-06-25 05:30:20',1,'2006-02-15 21:30:53'),(2174,'2005-06-18 00:09:01',3279,520,'2005-06-25 23:14:01',1,'2006-02-15 21:30:53'),(2175,'2005-06-18 00:17:58',4038,17,'2005-06-22 23:18:58',2,'2006-02-15 21:30:53'),(2176,'2005-06-18 00:29:51',4201,282,'2005-06-21 01:41:51',1,'2006-02-15 21:30:53'),(2177,'2005-06-18 00:34:45',492,340,'2005-06-26 18:40:45',1,'2006-02-15 21:30:53'),(2178,'2005-06-18 00:38:35',2950,260,'2005-06-21 02:56:35',1,'2006-02-15 21:30:53'),(2179,'2005-06-18 00:41:36',4334,338,'2005-06-19 02:17:36',1,'2006-02-15 21:30:53'),(2180,'2005-06-18 00:47:43',3564,497,'2005-06-25 04:12:43',2,'2006-02-15 21:30:53'),(2181,'2005-06-18 00:48:31',3481,176,'2005-06-25 06:43:31',2,'2006-02-15 21:30:53'),(2182,'2005-06-18 00:56:18',3494,454,'2005-06-26 20:01:18',1,'2006-02-15 21:30:53'),(2183,'2005-06-18 01:06:01',1776,340,'2005-06-22 01:20:01',1,'2006-02-15 21:30:53'),(2184,'2005-06-18 01:10:36',3468,537,'2005-06-21 05:59:36',2,'2006-02-15 21:30:53'),(2185,'2005-06-18 01:12:22',4326,198,'2005-06-20 20:41:22',1,'2006-02-15 21:30:53'),(2186,'2005-06-18 01:15:27',2050,204,'2005-06-21 06:16:27',1,'2006-02-15 21:30:53'),(2187,'2005-06-18 01:17:27',1385,477,'2005-06-20 22:18:27',1,'2006-02-15 21:30:53'),(2188,'2005-06-18 01:19:04',712,183,'2005-06-25 03:59:04',2,'2006-02-15 21:30:53'),(2189,'2005-06-18 01:20:26',249,500,'2005-06-25 00:30:26',1,'2006-02-15 21:30:53'),(2190,'2005-06-18 01:29:51',4398,342,'2005-06-26 04:31:51',2,'2006-02-15 21:30:53'),(2191,'2005-06-18 01:33:09',3369,58,'2005-06-19 20:18:09',1,'2006-02-15 21:30:53'),(2192,'2005-06-18 01:35:47',1886,456,'2005-06-23 23:38:47',2,'2006-02-15 21:30:53'),(2193,'2005-06-18 01:38:45',1013,112,'2005-06-22 19:51:45',1,'2006-02-15 21:30:53'),(2194,'2005-06-18 01:41:37',1827,149,'2005-06-25 04:27:37',1,'2006-02-15 21:30:53'),(2195,'2005-06-18 01:44:46',2247,286,'2005-06-25 20:50:46',1,'2006-02-15 21:30:53'),(2196,'2005-06-18 01:47:07',1925,240,'2005-06-26 03:18:07',2,'2006-02-15 21:30:53'),(2197,'2005-06-18 01:50:27',3350,103,'2005-06-19 01:31:27',2,'2006-02-15 21:30:53'),(2198,'2005-06-18 01:51:22',1983,109,'2005-06-26 06:57:22',2,'2006-02-15 21:30:53'),(2199,'2005-06-18 01:57:56',99,171,'2005-06-23 20:34:56',2,'2006-02-15 21:30:53'),(2200,'2005-06-18 01:59:16',1085,229,'2005-06-26 23:25:16',2,'2006-02-15 21:30:53'),(2201,'2005-06-18 02:08:27',1864,489,'2005-06-23 01:40:27',1,'2006-02-15 21:30:53'),(2202,'2005-06-18 02:09:24',815,297,'2005-06-26 07:17:24',2,'2006-02-15 21:30:53'),(2203,'2005-06-18 02:10:42',1347,46,'2005-06-22 06:25:42',2,'2006-02-15 21:30:53'),(2204,'2005-06-18 02:11:38',1137,426,'2005-06-24 00:28:38',1,'2006-02-15 21:30:53'),(2205,'2005-06-18 02:14:34',1245,593,'2005-06-25 05:11:34',1,'2006-02-15 21:30:53'),(2206,'2005-06-18 02:14:45',3651,438,'2005-06-24 23:20:45',2,'2006-02-15 21:30:53'),(2207,'2005-06-18 02:19:21',182,78,'2005-06-24 02:25:21',2,'2006-02-15 21:30:53'),(2208,'2005-06-18 02:22:07',2345,132,'2005-06-23 07:24:07',2,'2006-02-15 21:30:53'),(2209,'2005-06-18 02:24:01',2441,13,'2005-06-22 04:13:01',2,'2006-02-15 21:30:53'),(2210,'2005-06-18 02:27:01',219,108,'2005-06-21 00:45:01',1,'2006-02-15 21:30:53'),(2211,'2005-06-18 02:29:10',4114,166,'2005-06-22 02:02:10',1,'2006-02-15 21:30:53'),(2212,'2005-06-18 02:36:10',2458,336,'2005-06-19 21:21:10',1,'2006-02-15 21:30:53'),(2213,'2005-06-18 02:36:47',949,98,'2005-06-23 05:02:47',1,'2006-02-15 21:30:53'),(2214,'2005-06-18 02:44:37',2430,366,'2005-06-18 23:37:37',2,'2006-02-15 21:30:53'),(2215,'2005-06-18 02:48:21',2060,239,'2005-06-22 01:03:21',2,'2006-02-15 21:30:53'),(2216,'2005-06-18 03:08:17',1428,320,'2005-06-19 08:13:17',1,'2006-02-15 21:30:53'),(2217,'2005-06-18 03:12:29',2260,118,'2005-06-20 06:08:29',1,'2006-02-15 21:30:53'),(2218,'2005-06-18 03:13:13',3577,176,'2005-06-18 21:16:13',1,'2006-02-15 21:30:53'),(2219,'2005-06-18 03:16:54',1881,393,'2005-06-22 01:29:54',1,'2006-02-15 21:30:53'),(2220,'2005-06-18 03:21:36',320,587,'2005-06-21 07:45:36',2,'2006-02-15 21:30:53'),(2221,'2005-06-18 03:24:56',3905,156,'2005-06-22 08:27:56',1,'2006-02-15 21:30:53'),(2222,'2005-06-18 03:26:23',3834,10,'2005-06-26 08:50:23',2,'2006-02-15 21:30:53'),(2223,'2005-06-18 03:27:03',4068,303,'2005-06-27 09:19:03',2,'2006-02-15 21:30:53'),(2224,'2005-06-18 03:33:58',1336,153,'2005-06-18 22:10:58',1,'2006-02-15 21:30:53'),(2225,'2005-06-18 03:35:40',2829,503,'2005-06-23 03:05:40',1,'2006-02-15 21:30:53'),(2226,'2005-06-18 03:39:56',3487,225,'2005-06-24 07:26:56',2,'2006-02-15 21:30:53'),(2227,'2005-06-18 03:43:23',3623,200,'2005-06-19 05:55:23',2,'2006-02-15 21:30:53'),(2228,'2005-06-18 03:44:50',490,383,'2005-06-23 00:28:50',1,'2006-02-15 21:30:53'),(2229,'2005-06-18 03:50:18',2840,35,'2005-06-26 07:16:18',2,'2006-02-15 21:30:53'),(2230,'2005-06-18 03:50:49',833,256,'2005-06-25 01:12:49',2,'2006-02-15 21:30:53'),(2231,'2005-06-18 03:52:14',2280,35,'2005-06-23 06:52:14',1,'2006-02-15 21:30:53'),(2232,'2005-06-18 03:54:31',2463,52,'2005-06-22 07:29:31',1,'2006-02-15 21:30:53'),(2233,'2005-06-18 03:57:36',3063,31,'2005-06-21 09:42:36',2,'2006-02-15 21:30:53'),(2234,'2005-06-18 04:01:28',234,182,'2005-06-24 04:55:28',2,'2006-02-15 21:30:53'),(2235,'2005-06-18 04:08:50',3463,21,'2005-06-27 07:58:50',1,'2006-02-15 21:30:53'),(2236,'2005-06-18 04:12:33',4001,375,'2005-06-23 04:07:33',1,'2006-02-15 21:30:53'),(2237,'2005-06-18 04:17:44',1821,205,'2005-06-27 09:08:44',1,'2006-02-15 21:30:53'),(2238,'2005-06-18 04:22:06',2859,251,'2005-06-27 03:29:06',2,'2006-02-15 21:30:53'),(2239,'2005-06-18 04:23:54',4419,437,'2005-06-26 00:12:54',2,'2006-02-15 21:30:53'),(2240,'2005-06-18 04:28:27',1409,122,'2005-06-22 07:48:27',2,'2006-02-15 21:30:53'),(2241,'2005-06-18 04:31:41',921,406,'2005-06-24 22:34:41',2,'2006-02-15 21:30:53'),(2242,'2005-06-18 04:32:28',1995,146,'2005-06-24 03:26:28',2,'2006-02-15 21:30:53'),(2243,'2005-06-18 04:33:03',1254,328,'2005-06-23 04:14:03',2,'2006-02-15 21:30:53'),(2244,'2005-06-18 04:46:33',3629,233,'2005-06-20 04:28:33',1,'2006-02-15 21:30:53'),(2245,'2005-06-18 04:52:59',1496,194,'2005-06-24 05:07:59',2,'2006-02-15 21:30:53'),(2246,'2005-06-18 04:54:29',4287,414,'2005-06-22 09:14:29',1,'2006-02-15 21:30:53'),(2248,'2005-06-18 04:59:48',1999,446,'2005-06-19 08:51:48',2,'2006-02-15 21:30:53'),(2249,'2005-06-18 05:03:08',117,285,'2005-06-26 05:43:08',2,'2006-02-15 21:30:53'),(2250,'2005-06-18 05:03:36',4042,7,'2005-06-22 02:25:36',2,'2006-02-15 21:30:53'),(2251,'2005-06-18 05:05:08',1458,143,'2005-06-23 08:34:08',1,'2006-02-15 21:30:53'),(2252,'2005-06-18 05:05:18',1987,383,'2005-06-21 08:19:18',1,'2006-02-15 21:30:53'),(2253,'2005-06-18 05:11:43',3719,122,'2005-06-25 03:30:43',2,'2006-02-15 21:30:53'),(2254,'2005-06-18 05:15:14',1084,281,'2005-06-27 04:10:14',2,'2006-02-15 21:30:53'),(2255,'2005-06-18 05:21:12',24,410,'2005-06-26 09:19:12',1,'2006-02-15 21:30:53'),(2256,'2005-06-18 05:21:56',1863,93,'2005-06-27 02:06:56',2,'2006-02-15 21:30:53'),(2257,'2005-06-18 05:29:52',2846,34,'2005-06-22 00:19:52',1,'2006-02-15 21:30:53'),(2258,'2005-06-18 05:30:36',4573,292,'2005-06-24 09:09:36',1,'2006-02-15 21:30:53'),(2259,'2005-06-18 05:37:45',4103,491,'2005-06-21 01:51:45',1,'2006-02-15 21:30:53'),(2260,'2005-06-18 05:38:36',2773,297,'2005-06-20 08:08:36',1,'2006-02-15 21:30:53'),(2261,'2005-06-18 05:46:15',1763,570,'2005-06-24 05:06:15',1,'2006-02-15 21:30:53'),(2262,'2005-06-18 05:49:46',4172,218,'2005-06-20 00:25:46',2,'2006-02-15 21:30:53'),(2263,'2005-06-18 05:57:47',3259,452,'2005-06-20 06:13:47',1,'2006-02-15 21:30:53'),(2264,'2005-06-18 05:58:45',150,240,'2005-06-19 00:57:45',1,'2006-02-15 21:30:53'),(2265,'2005-06-18 06:03:27',3069,267,'2005-06-20 01:16:27',1,'2006-02-15 21:30:53'),(2266,'2005-06-18 06:05:02',2596,452,'2005-06-20 06:54:02',1,'2006-02-15 21:30:53'),(2267,'2005-06-18 06:10:23',2086,218,'2005-06-20 00:39:23',2,'2006-02-15 21:30:53'),(2268,'2005-06-18 06:13:41',4380,21,'2005-06-22 08:53:41',2,'2006-02-15 21:30:53'),(2269,'2005-06-18 06:20:54',3088,431,'2005-06-25 04:51:54',2,'2006-02-15 21:30:53'),(2270,'2005-06-18 06:29:01',3447,588,'2005-06-26 07:21:01',2,'2006-02-15 21:30:53'),(2271,'2005-06-18 06:29:52',2416,145,'2005-06-21 09:46:52',2,'2006-02-15 21:30:53'),(2272,'2005-06-18 06:29:53',1364,599,'2005-06-23 10:58:53',1,'2006-02-15 21:30:53'),(2273,'2005-06-18 06:30:02',4456,327,'2005-06-20 07:07:02',1,'2006-02-15 21:30:53'),(2274,'2005-06-18 06:31:15',3021,347,'2005-06-21 01:24:15',2,'2006-02-15 21:30:53'),(2275,'2005-06-18 06:31:29',2805,354,'2005-06-24 10:04:29',2,'2006-02-15 21:30:53'),(2276,'2005-06-18 06:33:48',1145,594,'2005-06-25 00:50:48',2,'2006-02-15 21:30:53'),(2277,'2005-06-18 06:35:03',3770,224,'2005-06-19 01:26:03',1,'2006-02-15 21:30:53'),(2278,'2005-06-18 06:37:57',1166,450,'2005-06-22 10:57:57',1,'2006-02-15 21:30:53'),(2279,'2005-06-18 06:38:22',1953,554,'2005-06-27 07:16:22',1,'2006-02-15 21:30:53'),(2280,'2005-06-18 06:46:54',4568,548,'2005-06-26 09:48:54',2,'2006-02-15 21:30:53'),(2281,'2005-06-18 06:47:29',4212,431,'2005-06-20 10:27:29',2,'2006-02-15 21:30:53'),(2282,'2005-06-18 06:48:23',4388,113,'2005-06-24 11:04:23',2,'2006-02-15 21:30:53'),(2283,'2005-06-18 06:56:06',2056,507,'2005-06-19 05:11:06',2,'2006-02-15 21:30:53'),(2284,'2005-06-18 06:59:51',2682,228,'2005-06-24 04:58:51',2,'2006-02-15 21:30:53'),(2285,'2005-06-18 07:00:54',755,447,'2005-06-25 08:58:54',2,'2006-02-15 21:30:53'),(2286,'2005-06-18 07:02:32',618,287,'2005-06-27 12:33:32',1,'2006-02-15 21:30:53'),(2287,'2005-06-18 07:04:36',1473,317,'2005-06-27 03:00:36',2,'2006-02-15 21:30:53'),(2288,'2005-06-18 07:23:17',877,247,'2005-06-26 07:44:17',2,'2006-02-15 21:30:53'),(2289,'2005-06-18 07:29:43',2030,392,'2005-06-24 11:16:43',2,'2006-02-15 21:30:53'),(2290,'2005-06-18 07:34:37',200,513,'2005-06-26 11:45:37',1,'2006-02-15 21:30:53'),(2291,'2005-06-18 07:36:46',3949,436,'2005-06-26 04:57:46',2,'2006-02-15 21:30:53'),(2292,'2005-06-18 07:37:48',173,130,'2005-06-20 02:45:48',2,'2006-02-15 21:30:53'),(2293,'2005-06-18 07:45:03',3209,178,'2005-06-24 08:12:03',1,'2006-02-15 21:30:53'),(2294,'2005-06-18 07:46:34',2096,72,'2005-06-22 12:34:34',2,'2006-02-15 21:30:53'),(2295,'2005-06-18 07:56:18',3250,106,'2005-06-21 07:10:18',1,'2006-02-15 21:30:53'),(2296,'2005-06-18 08:10:42',4558,481,'2005-06-20 12:26:42',2,'2006-02-15 21:30:53'),(2297,'2005-06-18 08:17:41',2262,111,'2005-06-26 05:08:41',2,'2006-02-15 21:30:53'),(2298,'2005-06-18 08:18:29',1227,497,'2005-06-24 11:51:29',1,'2006-02-15 21:30:53'),(2299,'2005-06-18 08:18:52',4339,28,'2005-06-26 11:48:52',1,'2006-02-15 21:30:53'),(2300,'2005-06-18 08:22:34',1617,291,'2005-06-24 04:51:34',2,'2006-02-15 21:30:53'),(2301,'2005-06-18 08:24:03',869,273,'2005-06-25 10:31:03',2,'2006-02-15 21:30:53'),(2302,'2005-06-18 08:27:33',1852,42,'2005-06-22 02:46:33',2,'2006-02-15 21:30:53'),(2303,'2005-06-18 08:27:59',1524,329,'2005-06-22 10:58:59',1,'2006-02-15 21:30:53'),(2304,'2005-06-18 08:30:15',3543,327,'2005-06-23 06:17:15',1,'2006-02-15 21:30:53'),(2305,'2005-06-18 08:31:18',622,149,'2005-06-24 06:18:18',2,'2006-02-15 21:30:53'),(2306,'2005-06-18 08:33:23',208,477,'2005-06-27 10:01:23',2,'2006-02-15 21:30:53'),(2307,'2005-06-18 08:34:59',4576,47,'2005-06-23 04:42:59',1,'2006-02-15 21:30:53'),(2308,'2005-06-18 08:41:48',197,1,'2005-06-22 03:36:48',2,'2006-02-15 21:30:53'),(2309,'2005-06-18 08:43:24',611,576,'2005-06-20 03:56:24',1,'2006-02-15 21:30:53'),(2310,'2005-06-18 08:45:59',2590,409,'2005-06-26 05:06:59',2,'2006-02-15 21:30:53'),(2311,'2005-06-18 08:51:29',4506,236,'2005-06-25 07:51:29',1,'2006-02-15 21:30:53'),(2312,'2005-06-18 08:55:46',402,184,'2005-06-24 04:34:46',2,'2006-02-15 21:30:53'),(2313,'2005-06-18 08:56:45',3134,379,'2005-06-26 10:30:45',2,'2006-02-15 21:30:53'),(2314,'2005-06-18 09:03:19',2157,160,'2005-06-19 12:14:19',1,'2006-02-15 21:30:53'),(2315,'2005-06-18 09:03:39',2766,372,'2005-06-22 11:18:39',1,'2006-02-15 21:30:53'),(2316,'2005-06-18 09:04:59',372,289,'2005-06-20 09:39:59',2,'2006-02-15 21:30:53'),(2317,'2005-06-18 09:12:18',1602,326,'2005-06-21 05:50:18',2,'2006-02-15 21:30:53'),(2318,'2005-06-18 09:13:54',2328,383,'2005-06-23 07:19:54',1,'2006-02-15 21:30:53'),(2319,'2005-06-18 09:24:22',1521,393,'2005-06-26 14:12:22',2,'2006-02-15 21:30:53'),(2320,'2005-06-18 09:24:50',597,552,'2005-06-24 07:59:50',1,'2006-02-15 21:30:53'),(2321,'2005-06-18 09:42:42',1160,565,'2005-06-25 14:28:42',1,'2006-02-15 21:30:53'),(2322,'2005-06-18 09:44:21',1893,213,'2005-06-25 09:29:21',1,'2006-02-15 21:30:53'),(2323,'2005-06-18 09:55:02',207,54,'2005-06-23 07:19:02',1,'2006-02-15 21:30:53'),(2324,'2005-06-18 10:00:33',2987,268,'2005-06-23 14:10:33',1,'2006-02-15 21:30:53'),(2325,'2005-06-18 10:08:07',752,406,'2005-06-21 15:07:07',1,'2006-02-15 21:30:53'),(2326,'2005-06-18 10:14:22',3829,174,'2005-06-24 07:01:22',2,'2006-02-15 21:30:53'),(2327,'2005-06-18 10:16:40',1351,571,'2005-06-20 15:06:40',1,'2006-02-15 21:30:53'),(2328,'2005-06-18 10:17:21',2304,441,'2005-06-21 04:18:21',1,'2006-02-15 21:30:53'),(2329,'2005-06-18 10:22:52',4156,587,'2005-06-20 12:03:52',2,'2006-02-15 21:30:53'),(2330,'2005-06-18 10:41:19',4285,390,'2005-06-25 10:48:19',1,'2006-02-15 21:30:53'),(2331,'2005-06-18 10:50:09',1546,221,'2005-06-25 14:30:09',1,'2006-02-15 21:30:53'),(2332,'2005-06-18 10:53:51',2152,140,'2005-06-24 12:06:51',2,'2006-02-15 21:30:53'),(2333,'2005-06-18 10:55:54',2323,283,'2005-06-25 07:09:54',2,'2006-02-15 21:30:53'),(2334,'2005-06-18 10:56:24',3076,223,'2005-06-22 10:38:24',2,'2006-02-15 21:30:53'),(2335,'2005-06-18 10:59:36',3968,446,'2005-06-26 06:42:36',2,'2006-02-15 21:30:53'),(2336,'2005-06-18 11:00:05',3888,124,'2005-06-25 06:02:05',2,'2006-02-15 21:30:53'),(2337,'2005-06-18 11:15:27',4522,582,'2005-06-26 06:59:27',2,'2006-02-15 21:30:53'),(2338,'2005-06-18 11:24:54',3165,316,'2005-06-19 07:34:54',1,'2006-02-15 21:30:53'),(2339,'2005-06-18 11:29:22',313,297,'2005-06-21 10:29:22',1,'2006-02-15 21:30:53'),(2340,'2005-06-18 11:30:56',1913,157,'2005-06-23 06:00:56',1,'2006-02-15 21:30:53'),(2341,'2005-06-18 11:35:30',638,31,'2005-06-27 11:56:30',2,'2006-02-15 21:30:53'),(2342,'2005-06-18 11:42:40',2169,146,'2005-06-20 14:40:40',1,'2006-02-15 21:30:53'),(2343,'2005-06-18 11:46:26',4554,20,'2005-06-22 11:37:26',2,'2006-02-15 21:30:53'),(2344,'2005-06-18 12:01:47',2015,498,'2005-06-19 11:56:47',2,'2006-02-15 21:30:53'),(2345,'2005-06-18 12:03:23',1818,6,'2005-06-22 14:25:23',2,'2006-02-15 21:30:53'),(2346,'2005-06-18 12:08:16',2575,308,'2005-06-27 15:02:16',1,'2006-02-15 21:30:53'),(2347,'2005-06-18 12:12:29',4516,194,'2005-06-23 14:03:29',1,'2006-02-15 21:30:53'),(2348,'2005-06-18 12:15:43',3622,449,'2005-06-24 14:03:43',2,'2006-02-15 21:30:53'),(2349,'2005-06-18 12:25:14',1536,495,'2005-06-19 11:24:14',2,'2006-02-15 21:30:53'),(2350,'2005-06-18 12:25:29',1179,471,'2005-06-23 11:35:29',1,'2006-02-15 21:30:53'),(2351,'2005-06-18 12:27:57',2942,216,'2005-06-23 16:14:57',1,'2006-02-15 21:30:53'),(2352,'2005-06-18 12:40:15',2141,590,'2005-06-22 07:07:15',2,'2006-02-15 21:30:53'),(2353,'2005-06-18 12:53:25',3223,361,'2005-06-19 13:53:25',1,'2006-02-15 21:30:53'),(2354,'2005-06-18 12:54:18',2793,77,'2005-06-26 07:23:18',2,'2006-02-15 21:30:53'),(2355,'2005-06-18 12:57:06',3613,125,'2005-06-26 07:32:06',1,'2006-02-15 21:30:53'),(2356,'2005-06-18 12:59:23',2207,455,'2005-06-21 10:12:23',2,'2006-02-15 21:30:53'),(2357,'2005-06-18 12:59:41',1323,561,'2005-06-26 16:40:41',1,'2006-02-15 21:30:53'),(2358,'2005-06-18 13:00:51',1728,478,'2005-06-26 12:58:51',1,'2006-02-15 21:30:53'),(2359,'2005-06-18 13:04:42',3087,201,'2005-06-25 11:52:42',1,'2006-02-15 21:30:53'),(2360,'2005-06-18 13:11:13',37,57,'2005-06-23 15:32:13',2,'2006-02-15 21:30:53'),(2361,'2005-06-18 13:19:05',3547,546,'2005-06-23 07:59:05',1,'2006-02-15 21:30:53'),(2362,'2005-06-18 13:31:15',2815,514,'2005-06-19 12:35:15',1,'2006-02-15 21:30:53'),(2363,'2005-06-18 13:33:59',3497,1,'2005-06-19 17:40:59',1,'2006-02-15 21:30:53'),(2364,'2005-06-18 13:37:32',2856,512,'2005-06-23 14:18:32',1,'2006-02-15 21:30:53'),(2365,'2005-06-18 13:45:34',3109,493,'2005-06-21 12:12:34',2,'2006-02-15 21:30:53'),(2366,'2005-06-18 13:46:39',1413,162,'2005-06-23 18:49:39',2,'2006-02-15 21:30:53'),(2367,'2005-06-18 14:00:31',4086,566,'2005-06-22 14:45:31',2,'2006-02-15 21:30:53'),(2368,'2005-06-18 14:10:27',1058,99,'2005-06-23 10:49:27',1,'2006-02-15 21:30:53'),(2369,'2005-06-18 14:25:29',1515,44,'2005-06-23 18:45:29',2,'2006-02-15 21:30:53'),(2370,'2005-06-18 14:29:54',2656,489,'2005-06-24 10:23:54',1,'2006-02-15 21:30:53'),(2371,'2005-06-18 14:35:29',178,248,'2005-06-22 09:38:29',2,'2006-02-15 21:30:53'),(2372,'2005-06-18 14:37:37',1567,96,'2005-06-21 08:40:37',2,'2006-02-15 21:30:53'),(2373,'2005-06-18 14:37:57',2780,544,'2005-06-23 19:29:57',2,'2006-02-15 21:30:53'),(2374,'2005-06-18 14:44:06',2634,71,'2005-06-22 17:14:06',1,'2006-02-15 21:30:53'),(2375,'2005-06-18 14:47:29',2175,259,'2005-06-26 13:52:29',2,'2006-02-15 21:30:53'),(2376,'2005-06-18 14:55:30',3664,479,'2005-06-25 17:40:30',1,'2006-02-15 21:30:53'),(2377,'2005-06-18 14:56:23',3568,193,'2005-06-27 12:36:23',1,'2006-02-15 21:30:53'),(2378,'2005-06-18 14:57:49',2796,384,'2005-06-26 18:23:49',2,'2006-02-15 21:30:53'),(2379,'2005-06-18 14:59:39',2708,597,'2005-06-24 13:26:39',2,'2006-02-15 21:30:53'),(2380,'2005-06-18 15:00:04',4413,256,'2005-06-24 13:29:04',2,'2006-02-15 21:30:53'),(2381,'2005-06-18 15:00:30',1491,167,'2005-06-22 11:38:30',1,'2006-02-15 21:30:53'),(2382,'2005-06-18 15:03:52',915,568,'2005-06-20 10:16:52',2,'2006-02-15 21:30:53'),(2383,'2005-06-18 15:17:59',2459,149,'2005-06-26 18:42:59',2,'2006-02-15 21:30:53'),(2384,'2005-06-18 15:18:49',3378,132,'2005-06-21 18:10:49',1,'2006-02-15 21:30:53'),(2385,'2005-06-18 15:22:40',1641,298,'2005-06-26 10:02:40',1,'2006-02-15 21:30:53'),(2386,'2005-06-18 15:22:51',1361,293,'2005-06-22 20:01:51',1,'2006-02-15 21:30:53'),(2387,'2005-06-18 15:24:19',692,289,'2005-06-25 17:41:19',2,'2006-02-15 21:30:53'),(2388,'2005-06-18 15:26:30',2923,53,'2005-06-20 20:24:30',1,'2006-02-15 21:30:53'),(2389,'2005-06-18 15:27:47',731,382,'2005-06-21 12:26:47',1,'2006-02-15 21:30:53'),(2390,'2005-06-18 15:29:26',2748,239,'2005-06-23 17:50:26',1,'2006-02-15 21:30:53'),(2391,'2005-06-18 15:33:30',2850,491,'2005-06-25 14:30:30',1,'2006-02-15 21:30:53'),(2392,'2005-06-18 15:34:18',2213,261,'2005-06-19 16:22:18',1,'2006-02-15 21:30:53'),(2393,'2005-06-18 15:37:55',3143,21,'2005-06-25 17:11:55',1,'2006-02-15 21:30:53'),(2394,'2005-06-18 15:42:30',2669,60,'2005-06-26 16:12:30',1,'2006-02-15 21:30:53'),(2395,'2005-06-18 15:45:15',899,544,'2005-06-27 19:11:15',2,'2006-02-15 21:30:53'),(2396,'2005-06-18 15:49:48',1986,31,'2005-06-27 20:31:48',2,'2006-02-15 21:30:53'),(2397,'2005-06-18 15:51:25',2895,76,'2005-06-24 15:52:25',1,'2006-02-15 21:30:53'),(2398,'2005-06-18 15:56:53',3001,526,'2005-06-27 14:25:53',2,'2006-02-15 21:30:53'),(2399,'2005-06-18 16:06:14',2492,577,'2005-06-26 16:56:14',2,'2006-02-15 21:30:53'),(2400,'2005-06-18 16:10:46',3194,410,'2005-06-25 20:34:46',1,'2006-02-15 21:30:53'),(2401,'2005-06-18 16:22:03',85,359,'2005-06-19 13:49:03',2,'2006-02-15 21:30:53'),(2402,'2005-06-18 16:24:45',2833,360,'2005-06-27 14:39:45',1,'2006-02-15 21:30:53'),(2403,'2005-06-18 16:33:22',2697,536,'2005-06-23 19:25:22',1,'2006-02-15 21:30:53'),(2404,'2005-06-18 16:33:48',4138,456,'2005-06-23 20:39:48',2,'2006-02-15 21:30:53'),(2405,'2005-06-18 16:36:38',3604,356,'2005-06-21 19:15:38',1,'2006-02-15 21:30:53'),(2406,'2005-06-18 16:39:37',1321,497,'2005-06-23 12:04:37',1,'2006-02-15 21:30:53'),(2407,'2005-06-18 16:50:41',2547,421,'2005-06-24 15:29:41',2,'2006-02-15 21:30:53'),(2408,'2005-06-18 16:50:44',258,87,'2005-06-19 20:11:44',1,'2006-02-15 21:30:53'),(2409,'2005-06-18 16:53:33',656,84,'2005-06-20 18:23:33',1,'2006-02-15 21:30:53'),(2410,'2005-06-18 16:55:08',265,381,'2005-06-20 12:40:08',2,'2006-02-15 21:30:53'),(2411,'2005-06-18 16:55:54',3302,558,'2005-06-25 12:44:54',1,'2006-02-15 21:30:53'),(2412,'2005-06-18 16:58:58',1946,127,'2005-06-27 22:57:58',1,'2006-02-15 21:30:53'),(2413,'2005-06-18 16:59:34',1851,170,'2005-06-27 16:10:34',2,'2006-02-15 21:30:53'),(2414,'2005-06-18 17:01:55',4500,275,'2005-06-20 17:42:55',1,'2006-02-15 21:30:53'),(2415,'2005-06-18 17:02:42',3105,434,'2005-06-25 13:16:42',2,'2006-02-15 21:30:53'),(2416,'2005-06-18 17:07:34',2868,26,'2005-06-24 19:16:34',1,'2006-02-15 21:30:53'),(2417,'2005-06-18 17:12:01',1956,219,'2005-06-26 13:32:01',1,'2006-02-15 21:30:53'),(2418,'2005-06-18 17:14:42',2756,381,'2005-06-26 16:33:42',1,'2006-02-15 21:30:53'),(2419,'2005-06-18 17:21:24',1255,102,'2005-06-26 18:25:24',1,'2006-02-15 21:30:53'),(2420,'2005-06-18 17:22:28',241,502,'2005-06-23 17:45:28',1,'2006-02-15 21:30:53'),(2421,'2005-06-18 17:25:05',3524,26,'2005-06-23 21:09:05',2,'2006-02-15 21:30:53'),(2422,'2005-06-18 17:28:57',3170,527,'2005-06-23 15:22:57',1,'2006-02-15 21:30:53'),(2423,'2005-06-18 17:32:08',1744,231,'2005-06-21 11:58:08',1,'2006-02-15 21:30:53'),(2424,'2005-06-18 17:35:08',1884,233,'2005-06-23 15:33:08',1,'2006-02-15 21:30:53'),(2425,'2005-06-18 17:37:45',2630,579,'2005-06-27 18:40:45',2,'2006-02-15 21:30:53'),(2426,'2005-06-18 17:40:44',474,543,'2005-06-22 14:30:44',2,'2006-02-15 21:30:53'),(2427,'2005-06-18 17:45:00',4278,176,'2005-06-27 20:07:00',2,'2006-02-15 21:30:53'),(2428,'2005-06-18 17:47:34',3892,241,'2005-06-19 14:39:34',2,'2006-02-15 21:30:53'),(2429,'2005-06-18 17:48:28',3238,583,'2005-06-27 15:52:28',1,'2006-02-15 21:30:53'),(2430,'2005-06-18 17:51:46',1984,434,'2005-06-23 19:17:46',1,'2006-02-15 21:30:53'),(2431,'2005-06-18 17:53:03',1383,295,'2005-06-25 15:08:03',2,'2006-02-15 21:30:53'),(2432,'2005-06-18 17:59:18',4420,250,'2005-06-25 15:19:18',2,'2006-02-15 21:30:53'),(2433,'2005-06-18 18:10:17',937,356,'2005-06-23 14:46:17',2,'2006-02-15 21:30:53'),(2434,'2005-06-18 18:11:51',3739,12,'2005-06-23 12:52:51',2,'2006-02-15 21:30:53'),(2435,'2005-06-18 18:12:26',3548,173,'2005-06-22 13:43:26',2,'2006-02-15 21:30:53'),(2436,'2005-06-18 18:13:32',3328,534,'2005-06-21 13:33:32',2,'2006-02-15 21:30:53'),(2437,'2005-06-18 18:30:26',1799,454,'2005-06-21 18:36:26',1,'2006-02-15 21:30:53'),(2438,'2005-06-18 18:34:21',184,31,'2005-06-19 16:50:21',1,'2006-02-15 21:30:53'),(2439,'2005-06-18 18:35:04',909,39,'2005-06-21 19:47:04',2,'2006-02-15 21:30:53'),(2440,'2005-06-18 18:41:09',2866,380,'2005-06-22 12:46:09',1,'2006-02-15 21:30:53'),(2441,'2005-06-18 18:45:11',3148,593,'2005-06-20 00:42:11',1,'2006-02-15 21:30:53'),(2442,'2005-06-18 18:49:18',4045,364,'2005-06-22 16:18:18',1,'2006-02-15 21:30:53'),(2443,'2005-06-18 18:52:30',1622,233,'2005-06-24 21:27:30',1,'2006-02-15 21:30:53'),(2444,'2005-06-18 18:58:12',2233,576,'2005-06-27 20:48:12',1,'2006-02-15 21:30:53'),(2445,'2005-06-18 19:02:11',2887,98,'2005-06-23 22:25:11',1,'2006-02-15 21:30:53'),(2446,'2005-06-18 19:04:41',1283,466,'2005-06-27 17:10:41',2,'2006-02-15 21:30:53'),(2447,'2005-06-18 19:10:55',2353,523,'2005-06-27 16:35:55',1,'2006-02-15 21:30:53'),(2448,'2005-06-18 19:13:45',1642,308,'2005-06-27 14:43:45',1,'2006-02-15 21:30:53'),(2449,'2005-06-18 19:18:36',3630,498,'2005-06-27 23:49:36',1,'2006-02-15 21:30:53'),(2450,'2005-06-18 19:25:47',863,230,'2005-06-27 15:54:47',1,'2006-02-15 21:30:53'),(2451,'2005-06-18 19:28:02',835,24,'2005-06-23 16:41:02',1,'2006-02-15 21:30:53'),(2452,'2005-06-18 19:29:21',4318,77,'2005-06-26 22:27:21',1,'2006-02-15 21:30:53'),(2453,'2005-06-18 19:30:53',2562,588,'2005-06-20 17:22:53',1,'2006-02-15 21:30:53'),(2454,'2005-06-18 19:32:51',314,253,'2005-06-24 20:03:51',2,'2006-02-15 21:30:53'),(2455,'2005-06-18 19:33:06',870,241,'2005-06-21 15:21:06',1,'2006-02-15 21:30:53'),(2456,'2005-06-18 19:36:50',553,147,'2005-06-23 22:48:50',1,'2006-02-15 21:30:53'),(2457,'2005-06-18 19:38:20',1277,91,'2005-06-26 20:48:20',1,'2006-02-15 21:30:53'),(2458,'2005-06-18 19:39:05',599,572,'2005-06-21 13:54:05',2,'2006-02-15 21:30:53'),(2459,'2005-06-18 19:44:08',1024,185,'2005-06-23 19:14:08',2,'2006-02-15 21:30:53'),(2460,'2005-06-18 19:54:13',3933,553,'2005-06-27 22:36:13',2,'2006-02-15 21:30:53'),(2461,'2005-06-18 19:58:12',78,343,'2005-06-28 01:35:12',2,'2006-02-15 21:30:53'),(2462,'2005-06-18 20:00:15',2151,468,'2005-06-21 21:54:15',2,'2006-02-15 21:30:53'),(2463,'2005-06-18 20:01:43',1186,194,'2005-06-25 15:04:43',2,'2006-02-15 21:30:53'),(2464,'2005-06-18 20:06:05',463,380,'2005-06-20 19:22:05',1,'2006-02-15 21:30:53'),(2465,'2005-06-18 20:07:02',3783,160,'2005-06-25 20:55:02',1,'2006-02-15 21:30:53'),(2466,'2005-06-18 20:18:42',1356,427,'2005-06-20 01:32:42',1,'2006-02-15 21:30:53'),(2467,'2005-06-18 20:20:05',4387,177,'2005-06-20 17:01:05',1,'2006-02-15 21:30:53'),(2468,'2005-06-18 20:23:52',1833,382,'2005-06-23 14:34:52',1,'2006-02-15 21:30:53'),(2469,'2005-06-18 20:24:23',1993,137,'2005-06-27 15:39:23',1,'2006-02-15 21:30:53'),(2470,'2005-06-18 20:28:31',4319,40,'2005-06-25 18:48:31',1,'2006-02-15 21:30:53'),(2471,'2005-06-18 20:31:00',3399,183,'2005-06-24 18:01:00',2,'2006-02-15 21:30:53'),(2472,'2005-06-18 20:32:40',4556,70,'2005-06-20 00:40:40',2,'2006-02-15 21:30:53'),(2473,'2005-06-18 20:42:45',3876,221,'2005-06-19 20:17:45',1,'2006-02-15 21:30:53'),(2474,'2005-06-18 20:51:34',3450,151,'2005-06-25 01:39:34',1,'2006-02-15 21:30:53'),(2475,'2005-06-18 20:52:46',889,336,'2005-06-21 19:40:46',2,'2006-02-15 21:30:53'),(2476,'2005-06-18 20:57:12',3998,334,'2005-06-20 15:42:12',1,'2006-02-15 21:30:53'),(2477,'2005-06-18 20:58:46',2510,206,'2005-06-22 21:49:46',1,'2006-02-15 21:30:53'),(2478,'2005-06-18 21:01:21',2798,241,'2005-06-24 00:20:21',1,'2006-02-15 21:30:53'),(2479,'2005-06-18 21:03:08',1624,408,'2005-06-22 16:49:08',1,'2006-02-15 21:30:53'),(2480,'2005-06-18 21:04:09',4078,310,'2005-06-22 16:24:09',1,'2006-02-15 21:30:53'),(2481,'2005-06-18 21:08:30',800,322,'2005-06-23 02:35:30',2,'2006-02-15 21:30:53'),(2482,'2005-06-18 21:10:44',452,122,'2005-06-19 20:39:44',1,'2006-02-15 21:30:53'),(2483,'2005-06-18 21:22:23',4225,88,'2005-06-25 01:14:23',1,'2006-02-15 21:30:53'),(2484,'2005-06-18 21:25:23',1511,515,'2005-06-24 16:03:23',2,'2006-02-15 21:30:53'),(2485,'2005-06-18 21:26:03',1562,56,'2005-06-21 22:09:03',2,'2006-02-15 21:30:53'),(2486,'2005-06-18 21:26:56',268,15,'2005-06-22 23:42:56',1,'2006-02-15 21:30:53'),(2487,'2005-06-18 21:32:54',3683,374,'2005-06-23 21:11:54',2,'2006-02-15 21:30:53'),(2488,'2005-06-18 21:38:26',1338,403,'2005-06-24 02:08:26',2,'2006-02-15 21:30:53'),(2489,'2005-06-18 22:00:44',4012,382,'2005-06-22 02:06:44',2,'2006-02-15 21:30:53'),(2490,'2005-06-18 22:00:50',1934,402,'2005-06-19 23:45:50',2,'2006-02-15 21:30:53'),(2491,'2005-06-18 22:01:31',1779,316,'2005-06-26 02:46:31',1,'2006-02-15 21:30:53'),(2492,'2005-06-18 22:04:15',2858,237,'2005-06-23 21:58:15',1,'2006-02-15 21:30:53'),(2493,'2005-06-18 22:12:09',4121,269,'2005-06-27 23:44:09',1,'2006-02-15 21:30:53'),(2494,'2005-06-18 22:15:09',1313,434,'2005-06-25 17:23:09',1,'2006-02-15 21:30:53'),(2495,'2005-06-18 22:15:42',3826,338,'2005-06-21 23:21:42',1,'2006-02-15 21:30:53'),(2496,'2005-06-18 22:20:11',646,527,'2005-06-20 03:08:11',2,'2006-02-15 21:30:53'),(2497,'2005-06-18 22:50:40',2327,171,'2005-06-26 22:39:40',1,'2006-02-15 21:30:53'),(2498,'2005-06-18 22:56:26',2291,74,'2005-06-22 20:02:26',1,'2006-02-15 21:30:53'),(2499,'2005-06-18 23:01:36',3172,348,'2005-06-20 21:50:36',2,'2006-02-15 21:30:53'),(2500,'2005-06-18 23:07:12',4241,12,'2005-06-26 17:27:12',1,'2006-02-15 21:30:53'),(2501,'2005-06-18 23:10:11',1185,450,'2005-06-24 18:40:11',2,'2006-02-15 21:30:53'),(2502,'2005-06-18 23:12:13',2622,325,'2005-06-20 04:19:13',2,'2006-02-15 21:30:53'),(2503,'2005-06-18 23:17:19',2486,176,'2005-06-23 03:57:19',2,'2006-02-15 21:30:53'),(2504,'2005-06-18 23:19:53',1684,452,'2005-06-21 04:43:53',2,'2006-02-15 21:30:53'),(2505,'2005-06-18 23:28:27',1670,519,'2005-06-26 01:36:27',1,'2006-02-15 21:30:53'),(2506,'2005-06-18 23:29:53',2308,82,'2005-06-25 18:11:53',2,'2006-02-15 21:30:53'),(2507,'2005-06-18 23:39:22',3121,325,'2005-06-21 19:23:22',1,'2006-02-15 21:30:53'),(2508,'2005-06-18 23:43:58',4322,476,'2005-06-20 19:26:58',2,'2006-02-15 21:30:53'),(2509,'2005-06-18 23:44:08',4469,213,'2005-06-20 01:36:08',2,'2006-02-15 21:30:53'),(2510,'2005-06-18 23:44:21',3827,384,'2005-06-24 00:31:21',1,'2006-02-15 21:30:53'),(2511,'2005-06-18 23:45:30',1824,234,'2005-06-24 01:21:30',2,'2006-02-15 21:30:53'),(2512,'2005-06-18 23:48:47',4515,27,'2005-06-21 04:58:47',2,'2006-02-15 21:30:53'),(2513,'2005-06-18 23:53:15',3379,515,'2005-06-24 21:16:15',2,'2006-02-15 21:30:53'),(2514,'2005-06-18 23:56:44',2559,382,'2005-06-23 21:10:44',1,'2006-02-15 21:30:53'),(2515,'2005-06-18 23:57:31',3213,188,'2005-06-22 05:31:31',2,'2006-02-15 21:30:53'),(2516,'2005-06-19 00:03:28',2678,87,'2005-06-21 00:30:28',2,'2006-02-15 21:30:53'),(2517,'2005-06-19 00:11:26',53,74,'2005-06-25 02:19:26',1,'2006-02-15 21:30:53'),(2518,'2005-06-19 00:16:23',3503,86,'2005-06-25 19:28:23',2,'2006-02-15 21:30:53'),(2519,'2005-06-19 00:19:21',1172,128,'2005-06-25 01:46:21',1,'2006-02-15 21:30:53'),(2520,'2005-06-19 00:29:00',4181,446,'2005-06-28 04:36:00',1,'2006-02-15 21:30:53'),(2521,'2005-06-19 00:41:08',132,92,'2005-06-22 00:40:08',1,'2006-02-15 21:30:53'),(2522,'2005-06-19 00:43:42',550,579,'2005-06-28 04:26:42',1,'2006-02-15 21:30:53'),(2523,'2005-06-19 00:45:56',460,89,'2005-06-21 00:54:56',2,'2006-02-15 21:30:53'),(2524,'2005-06-19 00:48:11',441,465,'2005-06-25 01:46:11',2,'2006-02-15 21:30:53'),(2525,'2005-06-19 00:48:22',1307,365,'2005-06-24 19:10:22',2,'2006-02-15 21:30:53'),(2526,'2005-06-19 01:03:07',3309,500,'2005-06-28 06:57:07',1,'2006-02-15 21:30:53'),(2527,'2005-06-19 01:10:31',387,463,'2005-06-20 05:37:31',2,'2006-02-15 21:30:53'),(2528,'2005-06-19 01:14:12',1836,331,'2005-06-26 05:08:12',2,'2006-02-15 21:30:53'),(2529,'2005-06-19 01:18:27',2306,478,'2005-06-24 00:26:27',1,'2006-02-15 21:30:53'),(2530,'2005-06-19 01:20:00',4166,31,'2005-06-23 04:10:00',1,'2006-02-15 21:30:53'),(2531,'2005-06-19 01:20:49',768,368,'2005-06-22 01:50:49',2,'2006-02-15 21:30:53'),(2532,'2005-06-19 01:27:46',1870,26,'2005-06-20 02:15:46',1,'2006-02-15 21:30:53'),(2533,'2005-06-19 01:34:26',4564,187,'2005-06-22 20:19:26',1,'2006-02-15 21:30:53'),(2534,'2005-06-19 01:38:39',2540,517,'2005-06-23 00:16:39',1,'2006-02-15 21:30:53'),(2535,'2005-06-19 01:39:04',901,130,'2005-06-28 01:33:04',2,'2006-02-15 21:30:53'),(2536,'2005-06-19 01:41:34',4232,163,'2005-06-27 03:11:34',1,'2006-02-15 21:30:53'),(2537,'2005-06-19 01:52:21',3499,388,'2005-06-26 02:09:21',1,'2006-02-15 21:30:53'),(2538,'2005-06-19 01:56:59',1287,472,'2005-06-25 00:54:59',2,'2006-02-15 21:30:53'),(2539,'2005-06-19 01:58:39',4474,527,'2005-06-19 22:17:39',2,'2006-02-15 21:30:53'),(2540,'2005-06-19 02:04:48',4305,363,'2005-06-20 22:42:48',2,'2006-02-15 21:30:53'),(2541,'2005-06-19 02:08:10',129,360,'2005-06-23 23:32:10',1,'2006-02-15 21:30:53'),(2542,'2005-06-19 02:08:39',1446,67,'2005-06-26 20:25:39',1,'2006-02-15 21:30:53'),(2543,'2005-06-19 02:14:11',1729,58,'2005-06-21 00:40:11',2,'2006-02-15 21:30:53'),(2544,'2005-06-19 02:16:17',1465,558,'2005-06-22 21:45:17',1,'2006-02-15 21:30:53'),(2545,'2005-06-19 02:23:36',3237,413,'2005-06-20 03:17:36',2,'2006-02-15 21:30:53'),(2546,'2005-06-19 02:39:39',971,272,'2005-06-23 03:56:39',2,'2006-02-15 21:30:53'),(2547,'2005-06-19 02:44:17',4560,162,'2005-06-24 08:01:17',2,'2006-02-15 21:30:53'),(2548,'2005-06-19 02:45:35',4292,561,'2005-06-22 06:52:35',2,'2006-02-15 21:30:53'),(2549,'2005-06-19 02:46:39',3854,495,'2005-06-26 22:30:39',2,'2006-02-15 21:30:53'),(2550,'2005-06-19 02:49:55',1370,38,'2005-06-24 01:37:55',1,'2006-02-15 21:30:53'),(2551,'2005-06-19 02:51:04',2007,444,'2005-06-28 05:02:04',1,'2006-02-15 21:30:53'),(2552,'2005-06-19 03:01:29',664,389,'2005-06-28 04:13:29',1,'2006-02-15 21:30:53'),(2553,'2005-06-19 03:04:59',923,473,'2005-06-26 02:36:59',2,'2006-02-15 21:30:53'),(2554,'2005-06-19 03:05:38',3916,322,'2005-06-25 23:03:38',1,'2006-02-15 21:30:53'),(2555,'2005-06-19 03:07:02',260,191,'2005-06-25 05:25:02',2,'2006-02-15 21:30:53'),(2556,'2005-06-19 03:07:32',125,377,'2005-06-23 23:09:32',1,'2006-02-15 21:30:53'),(2557,'2005-06-19 03:08:51',4546,257,'2005-06-20 07:59:51',1,'2006-02-15 21:30:53'),(2558,'2005-06-19 03:09:16',2920,361,'2005-06-24 05:29:16',1,'2006-02-15 21:30:53'),(2559,'2005-06-19 03:09:46',4433,414,'2005-06-28 07:49:46',1,'2006-02-15 21:30:53'),(2560,'2005-06-19 03:12:42',3340,309,'2005-06-28 02:28:42',1,'2006-02-15 21:30:53'),(2561,'2005-06-19 03:14:52',4128,256,'2005-06-21 02:42:52',2,'2006-02-15 21:30:53'),(2562,'2005-06-19 03:15:05',51,265,'2005-06-21 08:26:05',2,'2006-02-15 21:30:53'),(2563,'2005-06-19 03:24:17',1935,41,'2005-06-23 04:08:17',2,'2006-02-15 21:30:53'),(2564,'2005-06-19 03:41:10',4008,408,'2005-06-24 03:10:10',1,'2006-02-15 21:30:53'),(2565,'2005-06-19 03:44:03',2347,128,'2005-06-24 01:26:03',2,'2006-02-15 21:30:53'),(2566,'2005-06-19 03:45:39',495,486,'2005-06-25 08:43:39',2,'2006-02-15 21:30:53'),(2567,'2005-06-19 04:04:46',216,496,'2005-06-19 23:39:46',2,'2006-02-15 21:30:53'),(2568,'2005-06-19 04:09:03',3032,190,'2005-06-24 23:24:03',1,'2006-02-15 21:30:53'),(2569,'2005-06-19 04:19:04',30,213,'2005-06-26 04:31:04',1,'2006-02-15 21:30:53'),(2570,'2005-06-19 04:20:13',1105,5,'2005-06-25 07:00:13',1,'2006-02-15 21:30:53'),(2571,'2005-06-19 04:20:14',1800,66,'2005-06-21 07:28:14',2,'2006-02-15 21:30:53'),(2572,'2005-06-19 04:21:26',2449,159,'2005-06-23 09:22:26',2,'2006-02-15 21:30:53'),(2573,'2005-06-19 04:23:18',3354,563,'2005-06-23 06:04:18',1,'2006-02-15 21:30:53'),(2574,'2005-06-19 04:23:52',3320,143,'2005-06-20 05:24:52',1,'2006-02-15 21:30:53'),(2575,'2005-06-19 04:32:52',354,336,'2005-06-24 09:37:52',1,'2006-02-15 21:30:53'),(2576,'2005-06-19 04:34:15',2928,559,'2005-06-28 10:02:15',2,'2006-02-15 21:30:53'),(2577,'2005-06-19 04:36:03',447,66,'2005-06-28 00:38:03',2,'2006-02-15 21:30:53'),(2578,'2005-06-19 04:40:06',1695,267,'2005-06-26 09:37:06',2,'2006-02-15 21:30:53'),(2579,'2005-06-19 04:40:44',3836,493,'2005-06-22 09:22:44',1,'2006-02-15 21:30:53'),(2580,'2005-06-19 04:44:30',2527,219,'2005-06-23 04:15:30',1,'2006-02-15 21:30:53'),(2581,'2005-06-19 04:54:13',376,456,'2005-06-23 23:28:13',2,'2006-02-15 21:30:53'),(2582,'2005-06-19 04:56:27',201,267,'2005-06-26 08:56:27',2,'2006-02-15 21:30:53'),(2583,'2005-06-19 05:01:40',3999,523,'2005-06-28 00:04:40',1,'2006-02-15 21:30:53'),(2584,'2005-06-19 05:02:36',3733,90,'2005-06-28 04:52:36',2,'2006-02-15 21:30:53'),(2585,'2005-06-19 05:05:03',91,406,'2005-06-20 09:28:03',1,'2006-02-15 21:30:53'),(2586,'2005-06-19 05:05:11',4104,537,'2005-06-27 00:23:11',1,'2006-02-15 21:30:53'),(2587,'2005-06-19 05:06:14',2188,331,'2005-06-24 10:50:14',2,'2006-02-15 21:30:53'),(2588,'2005-06-19 05:20:31',3626,143,'2005-06-22 04:20:31',2,'2006-02-15 21:30:53'),(2589,'2005-06-19 05:21:27',225,164,'2005-06-21 09:55:27',2,'2006-02-15 21:30:53'),(2590,'2005-06-19 05:31:40',3572,324,'2005-06-20 07:58:40',2,'2006-02-15 21:30:53'),(2591,'2005-06-19 05:32:22',4481,438,'2005-06-25 23:42:22',1,'2006-02-15 21:30:53'),(2592,'2005-06-19 05:36:54',282,208,'2005-06-21 08:44:54',1,'2006-02-15 21:30:53'),(2593,'2005-06-19 05:40:11',2031,556,'2005-06-28 08:11:11',1,'2006-02-15 21:30:53'),(2594,'2005-06-19 05:43:43',829,123,'2005-06-25 03:41:43',2,'2006-02-15 21:30:53'),(2595,'2005-06-19 05:43:55',3197,122,'2005-06-25 10:20:55',1,'2006-02-15 21:30:53'),(2596,'2005-06-19 05:48:26',2229,80,'2005-06-24 10:16:26',1,'2006-02-15 21:30:53'),(2597,'2005-06-19 05:53:46',2278,407,'2005-06-20 05:14:46',1,'2006-02-15 21:30:53'),(2598,'2005-06-19 05:59:57',2079,265,'2005-06-24 11:44:57',2,'2006-02-15 21:30:53'),(2599,'2005-06-19 06:06:07',461,171,'2005-06-27 01:10:07',1,'2006-02-15 21:30:53'),(2600,'2005-06-19 06:07:25',469,423,'2005-06-28 03:37:25',2,'2006-02-15 21:30:53'),(2601,'2005-06-19 06:09:44',2898,98,'2005-06-20 08:03:44',1,'2006-02-15 21:30:53'),(2602,'2005-06-19 06:10:08',4124,173,'2005-06-24 00:39:08',2,'2006-02-15 21:30:53'),(2603,'2005-06-19 06:21:25',587,222,'2005-06-26 03:19:25',1,'2006-02-15 21:30:53'),(2604,'2005-06-19 06:30:10',2889,28,'2005-06-25 11:16:10',2,'2006-02-15 21:30:53'),(2605,'2005-06-19 06:48:01',2342,38,'2005-06-25 07:00:01',1,'2006-02-15 21:30:53'),(2606,'2005-06-19 06:51:32',4133,364,'2005-06-21 03:15:32',2,'2006-02-15 21:30:53'),(2607,'2005-06-19 06:55:01',3922,340,'2005-06-25 03:21:01',2,'2006-02-15 21:30:53'),(2608,'2005-06-19 07:10:36',1618,132,'2005-06-24 13:09:36',1,'2006-02-15 21:30:53'),(2609,'2005-06-19 07:13:12',2254,383,'2005-06-28 12:30:12',2,'2006-02-15 21:30:53'),(2610,'2005-06-19 07:16:20',3845,542,'2005-06-25 09:39:20',2,'2006-02-15 21:30:53'),(2611,'2005-06-19 07:18:17',3682,301,'2005-06-21 10:19:17',1,'2006-02-15 21:30:53'),(2612,'2005-06-19 07:19:41',1691,287,'2005-06-25 11:10:41',1,'2006-02-15 21:30:53'),(2613,'2005-06-19 07:25:50',3830,179,'2005-06-21 03:04:50',1,'2006-02-15 21:30:53'),(2614,'2005-06-19 07:28:11',4147,145,'2005-06-22 12:33:11',1,'2006-02-15 21:30:53'),(2615,'2005-06-19 07:29:13',3810,578,'2005-06-27 12:50:13',1,'2006-02-15 21:30:53'),(2616,'2005-06-19 07:33:00',581,478,'2005-06-28 03:05:00',1,'2006-02-15 21:30:53'),(2617,'2005-06-19 07:48:31',204,313,'2005-06-27 11:56:31',1,'2006-02-15 21:30:53'),(2618,'2005-06-19 08:03:01',2465,310,'2005-06-24 03:23:01',2,'2006-02-15 21:30:53'),(2619,'2005-06-19 08:03:12',1848,350,'2005-06-21 05:02:12',2,'2006-02-15 21:30:53'),(2620,'2005-06-19 08:06:29',3183,94,'2005-06-24 11:42:29',1,'2006-02-15 21:30:53'),(2621,'2005-06-19 08:07:31',1746,439,'2005-06-28 05:36:31',1,'2006-02-15 21:30:53'),(2622,'2005-06-19 08:10:41',1393,573,'2005-06-28 10:44:41',2,'2006-02-15 21:30:53'),(2623,'2005-06-19 08:11:51',4477,12,'2005-06-26 12:28:51',2,'2006-02-15 21:30:53'),(2624,'2005-06-19 08:22:09',3071,32,'2005-06-27 11:13:09',1,'2006-02-15 21:30:53'),(2625,'2005-06-19 08:23:11',3946,25,'2005-06-26 09:52:11',2,'2006-02-15 21:30:53'),(2626,'2005-06-19 08:28:44',2816,450,'2005-06-24 03:58:44',1,'2006-02-15 21:30:53'),(2627,'2005-06-19 08:32:00',2779,592,'2005-06-24 04:31:00',2,'2006-02-15 21:30:53'),(2628,'2005-06-19 08:34:53',3917,3,'2005-06-28 04:19:53',2,'2006-02-15 21:30:53'),(2629,'2005-06-19 08:42:12',1810,458,'2005-06-28 03:38:12',2,'2006-02-15 21:30:53'),(2630,'2005-06-19 08:47:21',3904,236,'2005-06-25 09:31:21',1,'2006-02-15 21:30:53'),(2631,'2005-06-19 08:49:53',3471,39,'2005-06-26 03:25:53',1,'2006-02-15 21:30:53'),(2632,'2005-06-19 08:51:47',2274,574,'2005-06-23 07:13:47',2,'2006-02-15 21:30:53'),(2633,'2005-06-19 08:53:10',3462,68,'2005-06-20 07:56:10',1,'2006-02-15 21:30:53'),(2634,'2005-06-19 08:55:17',3687,318,'2005-06-20 11:44:17',2,'2006-02-15 21:30:53'),(2635,'2005-06-19 09:08:45',3332,105,'2005-06-26 09:20:45',1,'2006-02-15 21:30:53'),(2636,'2005-06-19 09:13:06',2102,253,'2005-06-25 07:47:06',2,'2006-02-15 21:30:53'),(2637,'2005-06-19 09:20:56',2736,327,'2005-06-27 10:09:56',2,'2006-02-15 21:30:53'),(2638,'2005-06-19 09:23:30',2944,295,'2005-06-26 14:56:30',1,'2006-02-15 21:30:53'),(2639,'2005-06-19 09:24:02',3971,116,'2005-06-21 14:16:02',2,'2006-02-15 21:30:53'),(2640,'2005-06-19 09:26:13',721,540,'2005-06-20 14:38:13',1,'2006-02-15 21:30:53'),(2641,'2005-06-19 09:38:33',231,374,'2005-06-22 09:55:33',1,'2006-02-15 21:30:53'),(2642,'2005-06-19 09:39:01',2065,4,'2005-06-25 08:33:01',1,'2006-02-15 21:30:53'),(2643,'2005-06-19 09:39:27',1928,318,'2005-06-26 10:27:27',2,'2006-02-15 21:30:53'),(2644,'2005-06-19 09:42:30',1923,309,'2005-06-27 07:23:30',2,'2006-02-15 21:30:53'),(2645,'2005-06-19 09:50:35',2284,181,'2005-06-28 06:47:35',2,'2006-02-15 21:30:53'),(2646,'2005-06-19 09:56:01',3511,275,'2005-06-21 04:15:01',2,'2006-02-15 21:30:53'),(2647,'2005-06-19 09:57:56',1954,54,'2005-06-22 15:55:56',1,'2006-02-15 21:30:53'),(2648,'2005-06-19 10:06:20',1620,31,'2005-06-21 04:30:20',2,'2006-02-15 21:30:53'),(2649,'2005-06-19 10:20:09',98,153,'2005-06-21 10:05:09',1,'2006-02-15 21:30:53'),(2650,'2005-06-19 10:21:45',4211,209,'2005-06-21 08:01:45',1,'2006-02-15 21:30:53'),(2651,'2005-06-19 10:22:56',2181,576,'2005-06-27 13:37:56',1,'2006-02-15 21:30:53'),(2652,'2005-06-19 10:35:26',3108,589,'2005-06-28 08:03:26',1,'2006-02-15 21:30:53'),(2653,'2005-06-19 10:36:53',3528,340,'2005-06-26 15:15:53',1,'2006-02-15 21:30:53'),(2654,'2005-06-19 10:37:54',3697,405,'2005-06-27 11:44:54',2,'2006-02-15 21:30:53'),(2655,'2005-06-19 10:38:42',1649,29,'2005-06-23 14:20:42',1,'2006-02-15 21:30:53'),(2656,'2005-06-19 10:42:33',559,280,'2005-06-24 08:31:33',2,'2006-02-15 21:30:53'),(2657,'2005-06-19 10:42:59',3595,19,'2005-06-28 12:37:59',1,'2006-02-15 21:30:53'),(2658,'2005-06-19 10:43:42',3281,156,'2005-06-24 16:23:42',1,'2006-02-15 21:30:53'),(2659,'2005-06-19 10:47:42',66,139,'2005-06-23 14:03:42',1,'2006-02-15 21:30:53'),(2660,'2005-06-19 10:50:02',4341,221,'2005-06-28 12:49:02',1,'2006-02-15 21:30:53'),(2661,'2005-06-19 10:50:52',3652,452,'2005-06-25 08:44:52',2,'2006-02-15 21:30:53'),(2662,'2005-06-19 10:53:42',3936,68,'2005-06-20 11:41:42',1,'2006-02-15 21:30:53'),(2663,'2005-06-19 10:54:00',1012,583,'2005-06-20 16:48:00',1,'2006-02-15 21:30:53'),(2664,'2005-06-19 11:11:23',3496,299,'2005-06-28 08:30:23',2,'2006-02-15 21:30:53'),(2665,'2005-06-19 11:12:35',4531,133,'2005-06-26 11:55:35',2,'2006-02-15 21:30:53'),(2666,'2005-06-19 11:17:12',1872,454,'2005-06-28 12:47:12',1,'2006-02-15 21:30:53'),(2667,'2005-06-19 11:28:46',1028,200,'2005-06-27 11:48:46',2,'2006-02-15 21:30:53'),(2668,'2005-06-19 11:28:47',3127,568,'2005-06-24 10:12:47',2,'2006-02-15 21:30:53'),(2669,'2005-06-19 11:28:52',2734,523,'2005-06-20 16:43:52',1,'2006-02-15 21:30:53'),(2670,'2005-06-19 11:30:16',3518,457,'2005-06-21 17:25:16',2,'2006-02-15 21:30:53'),(2671,'2005-06-19 11:33:11',2164,451,'2005-06-26 14:30:11',2,'2006-02-15 21:30:53'),(2672,'2005-06-19 11:42:04',1164,420,'2005-06-25 09:14:04',2,'2006-02-15 21:30:53'),(2673,'2005-06-19 11:42:20',2487,29,'2005-06-23 07:16:20',1,'2006-02-15 21:30:53'),(2674,'2005-06-19 11:47:59',3744,585,'2005-06-20 08:09:59',1,'2006-02-15 21:30:53'),(2675,'2005-06-19 11:52:15',3078,230,'2005-06-23 16:45:15',1,'2006-02-15 21:30:53'),(2676,'2005-06-19 11:54:57',3938,477,'2005-06-24 15:34:57',2,'2006-02-15 21:30:53'),(2677,'2005-06-19 12:01:59',4384,428,'2005-06-21 06:15:59',2,'2006-02-15 21:30:53'),(2678,'2005-06-19 12:12:23',4230,258,'2005-06-21 16:28:23',2,'2006-02-15 21:30:53'),(2679,'2005-06-19 12:12:30',1994,109,'2005-06-27 08:27:30',1,'2006-02-15 21:30:53'),(2680,'2005-06-19 12:13:37',865,114,'2005-06-27 15:15:37',1,'2006-02-15 21:30:53'),(2681,'2005-06-19 12:15:27',2704,196,'2005-06-21 16:48:27',2,'2006-02-15 21:30:53'),(2682,'2005-06-19 12:18:17',3609,538,'2005-06-28 14:09:17',1,'2006-02-15 21:30:53'),(2683,'2005-06-19 12:27:19',2860,241,'2005-06-21 16:26:19',2,'2006-02-15 21:30:53'),(2684,'2005-06-19 12:29:08',1225,17,'2005-06-28 08:50:08',2,'2006-02-15 21:30:53'),(2685,'2005-06-19 12:35:21',1170,283,'2005-06-22 16:58:21',1,'2006-02-15 21:30:53'),(2686,'2005-06-19 12:44:20',2686,68,'2005-06-20 16:00:20',1,'2006-02-15 21:30:53'),(2687,'2005-06-19 12:46:52',3152,254,'2005-06-23 06:58:52',2,'2006-02-15 21:30:53'),(2688,'2005-06-19 12:50:56',4281,309,'2005-06-28 17:58:56',2,'2006-02-15 21:30:53'),(2689,'2005-06-19 12:58:53',2478,567,'2005-06-24 17:35:53',1,'2006-02-15 21:30:53'),(2690,'2005-06-19 13:00:02',1381,391,'2005-06-27 14:29:02',1,'2006-02-15 21:30:53'),(2691,'2005-06-19 13:06:50',3469,242,'2005-06-26 15:56:50',1,'2006-02-15 21:30:53'),(2692,'2005-06-19 13:08:19',3162,388,'2005-06-21 16:45:19',1,'2006-02-15 21:30:53'),(2693,'2005-06-19 13:11:47',2570,107,'2005-06-27 11:17:47',1,'2006-02-15 21:30:53'),(2694,'2005-06-19 13:17:21',380,368,'2005-06-24 15:09:21',1,'2006-02-15 21:30:53'),(2695,'2005-06-19 13:25:53',190,208,'2005-06-24 17:12:53',2,'2006-02-15 21:30:53'),(2696,'2005-06-19 13:28:42',2110,597,'2005-06-28 14:06:42',2,'2006-02-15 21:30:53'),(2697,'2005-06-19 13:29:08',2271,448,'2005-06-23 13:21:08',1,'2006-02-15 21:30:53'),(2698,'2005-06-19 13:29:11',3900,420,'2005-06-20 07:31:11',2,'2006-02-15 21:30:53'),(2699,'2005-06-19 13:29:28',72,267,'2005-06-24 11:15:28',2,'2006-02-15 21:30:53'),(2700,'2005-06-19 13:31:52',928,180,'2005-06-27 19:30:52',1,'2006-02-15 21:30:53'),(2701,'2005-06-19 13:33:06',1623,29,'2005-06-28 15:11:06',2,'2006-02-15 21:30:53'),(2702,'2005-06-19 13:35:56',1736,329,'2005-06-20 14:07:56',2,'2006-02-15 21:30:53'),(2703,'2005-06-19 13:36:06',4080,319,'2005-06-28 08:26:06',2,'2006-02-15 21:30:53'),(2704,'2005-06-19 13:50:10',2026,246,'2005-06-26 18:25:10',2,'2006-02-15 21:30:53'),(2705,'2005-06-19 13:54:30',1191,562,'2005-06-20 12:31:30',1,'2006-02-15 21:30:53'),(2706,'2005-06-19 13:56:51',373,559,'2005-06-21 17:23:51',2,'2006-02-15 21:30:53'),(2707,'2005-06-19 13:57:08',4486,589,'2005-06-27 11:09:08',2,'2006-02-15 21:30:53'),(2708,'2005-06-19 13:59:05',2659,541,'2005-06-24 10:02:05',2,'2006-02-15 21:30:53'),(2709,'2005-06-19 14:00:26',2877,7,'2005-06-23 14:56:26',2,'2006-02-15 21:30:53'),(2710,'2005-06-19 14:03:56',2965,446,'2005-06-21 16:15:56',1,'2006-02-15 21:30:53'),(2711,'2005-06-19 14:12:22',3944,313,'2005-06-21 09:29:22',1,'2006-02-15 21:30:53'),(2712,'2005-06-19 14:20:13',3132,411,'2005-06-22 19:08:13',1,'2006-02-15 21:30:53'),(2713,'2005-06-19 14:23:09',3979,378,'2005-06-20 17:55:09',1,'2006-02-15 21:30:53'),(2714,'2005-06-19 14:26:09',2853,81,'2005-06-23 17:24:09',2,'2006-02-15 21:30:53'),(2715,'2005-06-19 14:29:35',2082,404,'2005-06-26 08:44:35',2,'2006-02-15 21:30:53'),(2716,'2005-06-19 14:40:17',944,252,'2005-06-27 17:45:17',2,'2006-02-15 21:30:53'),(2717,'2005-06-19 14:46:10',140,200,'2005-06-22 20:17:10',1,'2006-02-15 21:30:53'),(2718,'2005-06-19 14:49:42',4443,139,'2005-06-26 19:37:42',1,'2006-02-15 21:30:53'),(2719,'2005-06-19 14:50:19',1200,336,'2005-06-20 14:33:19',2,'2006-02-15 21:30:53'),(2720,'2005-06-19 14:51:55',3597,504,'2005-06-27 13:06:55',1,'2006-02-15 21:30:53'),(2721,'2005-06-19 14:53:24',3786,358,'2005-06-21 18:22:24',2,'2006-02-15 21:30:53'),(2722,'2005-06-19 14:55:17',952,45,'2005-06-25 13:11:17',2,'2006-02-15 21:30:53'),(2723,'2005-06-19 14:55:23',4317,277,'2005-06-20 14:28:23',1,'2006-02-15 21:30:53'),(2724,'2005-06-19 14:57:54',3879,103,'2005-06-22 16:31:54',2,'2006-02-15 21:30:53'),(2725,'2005-06-19 15:01:23',63,246,'2005-06-22 09:08:23',1,'2006-02-15 21:30:53'),(2726,'2005-06-19 15:02:20',2970,420,'2005-06-21 15:38:20',1,'2006-02-15 21:30:53'),(2727,'2005-06-19 15:02:39',3261,129,'2005-06-28 17:49:39',1,'2006-02-15 21:30:53'),(2728,'2005-06-19 15:04:04',775,408,'2005-06-22 12:22:04',2,'2006-02-15 21:30:53'),(2729,'2005-06-19 15:06:15',4449,510,'2005-06-27 17:58:15',2,'2006-02-15 21:30:53'),(2730,'2005-06-19 15:10:09',1264,30,'2005-06-28 13:05:09',1,'2006-02-15 21:30:53'),(2731,'2005-06-19 15:14:55',4218,138,'2005-06-27 14:30:55',2,'2006-02-15 21:30:53'),(2732,'2005-06-19 15:19:39',610,386,'2005-06-25 19:39:39',2,'2006-02-15 21:30:53'),(2733,'2005-06-19 15:21:53',1535,188,'2005-06-23 11:58:53',2,'2006-02-15 21:30:53'),(2734,'2005-06-19 15:36:27',794,204,'2005-06-20 13:44:27',2,'2006-02-15 21:30:53'),(2735,'2005-06-19 15:42:07',4550,29,'2005-06-22 17:28:07',1,'2006-02-15 21:30:53'),(2736,'2005-06-19 15:43:20',4510,359,'2005-06-21 13:03:20',1,'2006-02-15 21:30:53'),(2737,'2005-06-19 15:48:33',3131,513,'2005-06-26 18:44:33',2,'2006-02-15 21:30:53'),(2738,'2005-06-19 15:56:30',350,75,'2005-06-20 16:14:30',2,'2006-02-15 21:30:53'),(2739,'2005-06-19 15:58:38',213,212,'2005-06-27 15:01:38',2,'2006-02-15 21:30:53'),(2740,'2005-06-19 15:59:04',1534,92,'2005-06-28 12:18:04',2,'2006-02-15 21:30:53'),(2741,'2005-06-19 16:05:41',1662,36,'2005-06-20 20:48:41',1,'2006-02-15 21:30:53'),(2742,'2005-06-19 16:05:47',4154,187,'2005-06-26 21:34:47',1,'2006-02-15 21:30:53'),(2743,'2005-06-19 16:15:56',2611,35,'2005-06-23 12:30:56',1,'2006-02-15 21:30:53'),(2744,'2005-06-19 16:20:40',4511,368,'2005-06-22 11:44:40',2,'2006-02-15 21:30:53'),(2745,'2005-06-19 16:21:19',1253,26,'2005-06-21 22:07:19',2,'2006-02-15 21:30:53'),(2746,'2005-06-19 16:21:40',933,562,'2005-06-28 11:56:40',2,'2006-02-15 21:30:53'),(2747,'2005-06-19 16:22:07',1374,422,'2005-06-24 19:28:07',1,'2006-02-15 21:30:53'),(2748,'2005-06-19 16:22:26',511,473,'2005-06-21 21:55:26',1,'2006-02-15 21:30:53'),(2749,'2005-06-19 16:27:35',1540,358,'2005-06-25 21:06:35',2,'2006-02-15 21:30:53'),(2750,'2005-06-19 16:37:24',3775,197,'2005-06-20 13:55:24',2,'2006-02-15 21:30:53'),(2751,'2005-06-19 16:39:23',1291,148,'2005-06-25 13:57:23',1,'2006-02-15 21:30:53'),(2752,'2005-06-19 16:44:18',386,149,'2005-06-22 12:40:18',2,'2006-02-15 21:30:53'),(2753,'2005-06-19 16:44:35',2408,23,'2005-06-24 13:45:35',1,'2006-02-15 21:30:53'),(2754,'2005-06-19 16:55:59',1761,267,'2005-06-26 18:11:59',1,'2006-02-15 21:30:53'),(2755,'2005-06-19 16:56:31',946,506,'2005-06-27 12:02:31',2,'2006-02-15 21:30:53'),(2756,'2005-06-19 16:57:42',3264,144,'2005-06-26 15:30:42',2,'2006-02-15 21:30:53'),(2757,'2005-06-19 17:01:14',3814,243,'2005-06-28 11:38:14',1,'2006-02-15 21:30:53'),(2758,'2005-06-19 17:04:35',3558,423,'2005-06-26 14:45:35',2,'2006-02-15 21:30:53'),(2759,'2005-06-19 17:10:24',687,351,'2005-06-24 21:56:24',2,'2006-02-15 21:30:53'),(2760,'2005-06-19 17:16:33',2602,192,'2005-06-26 14:58:33',1,'2006-02-15 21:30:53'),(2761,'2005-06-19 17:22:17',2134,431,'2005-06-20 20:20:17',2,'2006-02-15 21:30:53'),(2762,'2005-06-19 17:22:31',3431,457,'2005-06-25 22:43:31',2,'2006-02-15 21:30:53'),(2763,'2005-06-19 17:23:34',3096,276,'2005-06-21 21:37:34',2,'2006-02-15 21:30:53'),(2764,'2005-06-19 17:27:25',1718,479,'2005-06-28 17:18:25',2,'2006-02-15 21:30:53'),(2765,'2005-06-19 17:34:39',1017,478,'2005-06-27 23:26:39',1,'2006-02-15 21:30:53'),(2766,'2005-06-19 17:45:15',3421,345,'2005-06-23 20:11:15',2,'2006-02-15 21:30:53'),(2767,'2005-06-19 17:46:35',4052,596,'2005-06-24 22:42:35',1,'2006-02-15 21:30:53'),(2768,'2005-06-19 17:46:52',3018,129,'2005-06-25 21:49:52',1,'2006-02-15 21:30:53'),(2769,'2005-06-19 17:52:14',1222,354,'2005-06-26 20:30:14',2,'2006-02-15 21:30:53'),(2770,'2005-06-19 17:54:22',3042,533,'2005-06-26 23:09:22',2,'2006-02-15 21:30:53'),(2771,'2005-06-19 17:54:48',40,262,'2005-06-27 17:14:48',1,'2006-02-15 21:30:53'),(2772,'2005-06-19 17:59:27',1221,520,'2005-06-23 17:52:27',1,'2006-02-15 21:30:53'),(2773,'2005-06-19 18:04:18',4155,505,'2005-06-28 23:52:18',1,'2006-02-15 21:30:53'),(2774,'2005-06-19 18:05:11',2809,299,'2005-06-21 16:21:11',2,'2006-02-15 21:30:53'),(2775,'2005-06-19 18:14:20',672,590,'2005-06-26 19:52:20',1,'2006-02-15 21:30:53'),(2776,'2005-06-19 18:16:24',1726,551,'2005-06-26 14:43:24',2,'2006-02-15 21:30:53'),(2777,'2005-06-19 18:16:26',4092,230,'2005-06-20 13:43:26',2,'2006-02-15 21:30:53'),(2778,'2005-06-19 18:18:12',3357,422,'2005-06-28 21:43:12',1,'2006-02-15 21:30:53'),(2779,'2005-06-19 18:19:07',1020,376,'2005-06-23 18:25:07',2,'2006-02-15 21:30:53'),(2780,'2005-06-19 18:19:33',1513,360,'2005-06-28 22:29:33',1,'2006-02-15 21:30:53'),(2781,'2005-06-19 18:24:42',1230,197,'2005-06-27 17:02:42',2,'2006-02-15 21:30:53'),(2782,'2005-06-19 18:25:07',3644,156,'2005-06-22 14:10:07',1,'2006-02-15 21:30:53'),(2783,'2005-06-19 18:29:10',2778,113,'2005-06-21 22:09:10',1,'2006-02-15 21:30:53'),(2784,'2005-06-19 18:40:29',2305,289,'2005-06-28 15:27:29',1,'2006-02-15 21:30:53'),(2785,'2005-06-19 18:43:57',826,137,'2005-06-24 15:36:57',2,'2006-02-15 21:30:53'),(2786,'2005-06-19 18:46:43',2255,594,'2005-06-22 16:52:43',1,'2006-02-15 21:30:53'),(2787,'2005-06-19 18:47:00',3371,307,'2005-06-22 20:22:00',2,'2006-02-15 21:30:53'),(2788,'2005-06-19 18:48:11',1457,171,'2005-06-21 13:32:11',1,'2006-02-15 21:30:53'),(2789,'2005-06-19 18:48:21',2398,514,'2005-06-21 21:50:21',1,'2006-02-15 21:30:53'),(2790,'2005-06-19 18:49:45',202,97,'2005-06-21 00:13:45',1,'2006-02-15 21:30:53'),(2791,'2005-06-19 18:51:27',2174,299,'2005-06-22 19:35:27',2,'2006-02-15 21:30:53'),(2792,'2005-06-19 18:52:25',3057,437,'2005-06-23 17:39:25',1,'2006-02-15 21:30:53'),(2793,'2005-06-19 18:52:37',732,419,'2005-06-25 19:45:37',2,'2006-02-15 21:30:53'),(2794,'2005-06-19 18:53:05',1957,85,'2005-06-22 13:15:05',1,'2006-02-15 21:30:53'),(2795,'2005-06-19 18:58:53',3694,129,'2005-06-28 18:56:53',1,'2006-02-15 21:30:53'),(2796,'2005-06-19 19:00:37',2337,209,'2005-06-25 17:18:37',2,'2006-02-15 21:30:53'),(2797,'2005-06-19 19:04:32',3222,486,'2005-06-20 22:43:32',1,'2006-02-15 21:30:53'),(2798,'2005-06-19 19:07:48',1343,180,'2005-06-23 00:09:48',2,'2006-02-15 21:30:53'),(2799,'2005-06-19 19:15:21',4579,576,'2005-06-21 21:35:21',1,'2006-02-15 21:30:53'),(2800,'2005-06-19 19:15:56',183,146,'2005-06-23 00:15:56',1,'2006-02-15 21:30:53'),(2801,'2005-06-19 19:18:09',4572,29,'2005-06-20 20:11:09',2,'2006-02-15 21:30:53'),(2802,'2005-06-19 19:18:17',4067,489,'2005-06-21 17:58:17',2,'2006-02-15 21:30:53'),(2803,'2005-06-19 19:18:27',103,120,'2005-06-27 21:48:27',1,'2006-02-15 21:30:53'),(2804,'2005-06-19 19:24:54',88,426,'2005-06-25 01:19:54',2,'2006-02-15 21:30:53'),(2805,'2005-06-19 19:29:17',2153,80,'2005-06-27 23:14:17',2,'2006-02-15 21:30:53'),(2806,'2005-06-19 19:30:48',2114,510,'2005-06-20 19:42:48',2,'2006-02-15 21:30:53'),(2807,'2005-06-19 19:32:53',2825,194,'2005-06-25 00:30:53',2,'2006-02-15 21:30:53'),(2808,'2005-06-19 19:34:45',65,325,'2005-06-27 14:49:45',1,'2006-02-15 21:30:53'),(2809,'2005-06-19 19:40:27',1786,44,'2005-06-27 15:28:27',2,'2006-02-15 21:30:53'),(2810,'2005-06-19 19:44:12',2558,67,'2005-06-20 19:41:12',2,'2006-02-15 21:30:53'),(2811,'2005-06-19 19:53:30',3890,457,'2005-06-22 23:21:30',2,'2006-02-15 21:30:53'),(2812,'2005-06-19 19:58:16',3016,211,'2005-06-26 15:26:16',1,'2006-02-15 21:30:53'),(2813,'2005-06-19 20:01:47',3420,284,'2005-06-27 01:51:47',1,'2006-02-15 21:30:53'),(2814,'2005-06-19 20:01:59',1783,10,'2005-06-26 01:28:59',2,'2006-02-15 21:30:53'),(2815,'2005-06-19 20:03:29',3046,27,'2005-06-25 22:50:29',2,'2006-02-15 21:30:53'),(2816,'2005-06-19 20:04:23',2180,94,'2005-06-20 21:09:23',2,'2006-02-15 21:30:53'),(2817,'2005-06-19 20:05:22',3476,510,'2005-06-24 23:29:22',1,'2006-02-15 21:30:53'),(2818,'2005-06-19 20:05:52',2376,497,'2005-06-22 01:01:52',2,'2006-02-15 21:30:53'),(2819,'2005-06-19 20:13:33',4100,82,'2005-06-26 16:44:33',1,'2006-02-15 21:30:53'),(2820,'2005-06-19 20:20:33',851,316,'2005-06-26 20:32:33',1,'2006-02-15 21:30:53'),(2821,'2005-06-19 20:26:52',2551,532,'2005-06-27 23:48:52',1,'2006-02-15 21:30:53'),(2822,'2005-06-19 20:29:24',3599,48,'2005-06-23 02:21:24',1,'2006-02-15 21:30:53'),(2823,'2005-06-19 20:30:21',3566,260,'2005-06-26 17:58:21',1,'2006-02-15 21:30:53'),(2824,'2005-06-19 20:31:45',2878,506,'2005-06-29 00:40:45',2,'2006-02-15 21:30:53'),(2825,'2005-06-19 20:32:19',2601,418,'2005-06-22 22:32:19',1,'2006-02-15 21:30:53'),(2826,'2005-06-19 20:41:35',2980,125,'2005-06-25 17:23:35',1,'2006-02-15 21:30:53'),(2827,'2005-06-19 20:50:01',2745,23,'2005-06-20 18:54:01',2,'2006-02-15 21:30:53'),(2828,'2005-06-19 20:51:33',3230,526,'2005-06-25 17:38:33',1,'2006-02-15 21:30:53'),(2829,'2005-06-19 21:11:30',2047,341,'2005-06-24 18:10:30',1,'2006-02-15 21:30:53'),(2830,'2005-06-19 21:14:33',2080,21,'2005-06-21 17:46:33',1,'2006-02-15 21:30:53'),(2831,'2005-06-19 21:17:06',4089,468,'2005-06-22 16:56:06',2,'2006-02-15 21:30:53'),(2832,'2005-06-19 21:21:53',828,593,'2005-06-28 23:00:53',1,'2006-02-15 21:30:53'),(2833,'2005-06-19 21:34:54',1976,232,'2005-06-28 16:21:54',1,'2006-02-15 21:30:53'),(2834,'2005-06-19 21:41:46',2876,122,'2005-06-24 20:47:46',1,'2006-02-15 21:30:53'),(2835,'2005-06-19 21:44:11',4411,89,'2005-06-26 16:46:11',2,'2006-02-15 21:30:53'),(2836,'2005-06-19 21:58:21',1453,306,'2005-06-27 00:41:21',2,'2006-02-15 21:30:53'),(2837,'2005-06-19 22:03:50',417,371,'2005-06-20 21:24:50',1,'2006-02-15 21:30:53'),(2838,'2005-06-19 22:06:06',143,292,'2005-06-25 22:30:06',1,'2006-02-15 21:30:53'),(2839,'2005-06-19 22:07:24',3856,256,'2005-06-23 16:37:24',2,'2006-02-15 21:30:53'),(2840,'2005-06-19 22:17:44',1102,236,'2005-06-26 00:36:44',2,'2006-02-15 21:30:53'),(2841,'2005-06-19 22:21:06',614,193,'2005-06-28 00:56:06',1,'2006-02-15 21:30:53'),(2842,'2005-06-19 22:34:20',4183,217,'2005-06-22 03:46:20',2,'2006-02-15 21:30:53'),(2843,'2005-06-19 22:36:39',1520,148,'2005-06-26 22:33:39',2,'2006-02-15 21:30:53'),(2844,'2005-06-19 22:40:12',4452,178,'2005-06-24 03:58:12',2,'2006-02-15 21:30:53'),(2845,'2005-06-19 22:46:37',3948,583,'2005-06-23 03:31:37',1,'2006-02-15 21:30:53'),(2846,'2005-06-19 22:52:14',651,193,'2005-06-22 17:12:14',1,'2006-02-15 21:30:53'),(2847,'2005-06-19 22:54:01',1247,148,'2005-06-27 23:05:01',2,'2006-02-15 21:30:53'),(2848,'2005-06-19 22:55:37',3449,19,'2005-06-25 23:10:37',1,'2006-02-15 21:30:53'),(2849,'2005-06-19 23:06:00',3628,283,'2005-06-25 18:36:00',1,'2006-02-15 21:30:53'),(2850,'2005-06-19 23:06:28',206,262,'2005-06-28 03:30:28',2,'2006-02-15 21:30:53'),(2851,'2005-06-19 23:07:03',2168,361,'2005-06-22 17:26:03',1,'2006-02-15 21:30:53'),(2852,'2005-06-19 23:08:50',2695,453,'2005-06-26 04:00:50',1,'2006-02-15 21:30:53'),(2853,'2005-06-19 23:09:41',2578,453,'2005-06-28 00:51:41',2,'2006-02-15 21:30:53'),(2854,'2005-06-19 23:11:48',4453,81,'2005-06-23 19:37:48',2,'2006-02-15 21:30:53'),(2855,'2005-06-19 23:11:49',3495,483,'2005-06-26 21:52:49',1,'2006-02-15 21:30:53'),(2856,'2005-06-19 23:13:04',1859,210,'2005-06-23 22:47:04',1,'2006-02-15 21:30:53'),(2857,'2005-06-19 23:15:15',2886,364,'2005-06-25 04:24:15',2,'2006-02-15 21:30:53'),(2858,'2005-06-19 23:17:11',2628,268,'2005-06-21 19:07:11',1,'2006-02-15 21:30:53'),(2859,'2005-06-19 23:18:42',126,147,'2005-06-20 22:38:42',1,'2006-02-15 21:30:53'),(2860,'2005-06-19 23:20:40',3045,107,'2005-06-21 04:59:40',1,'2006-02-15 21:30:53'),(2861,'2005-06-19 23:21:34',1489,116,'2005-06-26 17:32:34',1,'2006-02-15 21:30:53'),(2862,'2005-06-19 23:47:24',4260,52,'2005-06-23 03:39:24',2,'2006-02-15 21:30:53'),(2863,'2005-06-19 23:58:38',2410,228,'2005-06-23 23:27:38',2,'2006-02-15 21:30:53'),(2864,'2005-06-20 00:00:52',1056,493,'2005-06-26 04:21:52',2,'2006-02-15 21:30:53'),(2865,'2005-06-20 00:00:55',1569,10,'2005-06-21 02:20:55',1,'2006-02-15 21:30:53'),(2866,'2005-06-20 00:01:36',2718,44,'2005-06-20 21:39:36',1,'2006-02-15 21:30:53'),(2867,'2005-06-20 00:08:38',95,483,'2005-06-23 19:35:38',1,'2006-02-15 21:30:53'),(2868,'2005-06-20 00:08:58',1213,214,'2005-06-25 21:23:58',2,'2006-02-15 21:30:53'),(2869,'2005-06-20 00:09:25',1331,155,'2005-06-24 04:40:25',2,'2006-02-15 21:30:53'),(2870,'2005-06-20 00:17:46',214,467,'2005-06-28 20:21:46',1,'2006-02-15 21:30:53'),(2871,'2005-06-20 00:27:49',1731,443,'2005-06-29 01:36:49',1,'2006-02-15 21:30:53'),(2872,'2005-06-20 00:38:21',3779,240,'2005-06-26 19:56:21',1,'2006-02-15 21:30:53'),(2873,'2005-06-20 00:41:25',3321,160,'2005-06-25 02:06:25',1,'2006-02-15 21:30:53'),(2874,'2005-06-20 00:42:26',331,166,'2005-06-28 01:37:26',2,'2006-02-15 21:30:53'),(2875,'2005-06-20 00:47:18',3012,186,'2005-06-25 18:54:18',2,'2006-02-15 21:30:53'),(2876,'2005-06-20 01:06:34',3117,39,'2005-06-23 04:55:34',1,'2006-02-15 21:30:53'),(2877,'2005-06-20 01:07:16',485,267,'2005-06-24 01:05:16',1,'2006-02-15 21:30:53'),(2878,'2005-06-20 01:09:14',4120,88,'2005-06-21 21:40:14',2,'2006-02-15 21:30:53'),(2879,'2005-06-20 01:24:10',1920,583,'2005-06-28 20:12:10',2,'2006-02-15 21:30:53'),(2880,'2005-06-20 01:24:54',1700,193,'2005-06-23 02:42:54',2,'2006-02-15 21:30:53'),(2881,'2005-06-20 01:26:18',1391,307,'2005-06-26 23:42:18',1,'2006-02-15 21:30:53'),(2882,'2005-06-20 01:26:26',205,152,'2005-06-21 19:33:26',1,'2006-02-15 21:30:53'),(2883,'2005-06-20 01:29:10',585,320,'2005-06-28 06:12:10',1,'2006-02-15 21:30:53'),(2884,'2005-06-20 01:31:16',3384,319,'2005-06-21 04:03:16',2,'2006-02-15 21:30:53'),(2885,'2005-06-20 01:33:42',2701,330,'2005-06-22 22:23:42',1,'2006-02-15 21:30:53'),(2886,'2005-06-20 01:38:39',1755,154,'2005-06-23 04:28:39',2,'2006-02-15 21:30:53'),(2887,'2005-06-20 01:39:43',1073,453,'2005-06-25 05:22:43',2,'2006-02-15 21:30:53'),(2888,'2005-06-20 01:50:56',468,7,'2005-06-22 05:05:56',2,'2006-02-15 21:30:53'),(2889,'2005-06-20 01:54:08',151,213,'2005-06-23 06:33:08',1,'2006-02-15 21:30:53'),(2890,'2005-06-20 02:00:45',3437,392,'2005-06-27 21:12:45',1,'2006-02-15 21:30:53'),(2891,'2005-06-20 02:02:05',343,32,'2005-06-25 02:45:05',1,'2006-02-15 21:30:53'),(2892,'2005-06-20 02:06:39',2993,430,'2005-06-21 02:50:39',2,'2006-02-15 21:30:53'),(2893,'2005-06-20 02:22:08',397,153,'2005-06-26 21:01:08',2,'2006-02-15 21:30:53'),(2894,'2005-06-20 02:22:42',4316,76,'2005-06-22 00:38:42',1,'2006-02-15 21:30:53'),(2895,'2005-06-20 02:26:31',4445,141,'2005-06-27 23:42:31',2,'2006-02-15 21:30:53'),(2896,'2005-06-20 02:33:42',1086,40,'2005-06-26 05:29:42',2,'2006-02-15 21:30:53'),(2897,'2005-06-20 02:34:23',3464,107,'2005-06-25 05:29:23',1,'2006-02-15 21:30:53'),(2898,'2005-06-20 02:38:06',3106,178,'2005-06-29 08:18:06',2,'2006-02-15 21:30:53'),(2899,'2005-06-20 02:39:21',1919,459,'2005-06-23 06:47:21',1,'2006-02-15 21:30:53'),(2900,'2005-06-20 02:40:04',3407,294,'2005-06-27 20:47:04',2,'2006-02-15 21:30:53'),(2901,'2005-06-20 02:41:28',667,25,'2005-06-23 04:43:28',2,'2006-02-15 21:30:53'),(2902,'2005-06-20 02:45:35',2787,304,'2005-06-26 07:51:35',1,'2006-02-15 21:30:53'),(2903,'2005-06-20 02:49:01',3580,53,'2005-06-25 05:03:01',2,'2006-02-15 21:30:53'),(2904,'2005-06-20 02:54:06',2195,55,'2005-06-21 06:57:06',2,'2006-02-15 21:30:53'),(2905,'2005-06-20 02:56:16',3898,189,'2005-06-24 23:51:16',2,'2006-02-15 21:30:53'),(2906,'2005-06-20 03:04:56',1087,58,'2005-06-23 05:57:56',2,'2006-02-15 21:30:53'),(2907,'2005-06-20 03:15:09',2516,208,'2005-06-20 21:56:09',2,'2006-02-15 21:30:53'),(2908,'2005-06-20 03:16:52',517,91,'2005-06-22 08:46:52',1,'2006-02-15 21:30:53'),(2909,'2005-06-20 03:19:10',1701,451,'2005-06-25 06:06:10',2,'2006-02-15 21:30:53'),(2910,'2005-06-20 03:31:18',630,57,'2005-06-28 00:35:18',1,'2006-02-15 21:30:53'),(2911,'2005-06-20 03:32:37',3645,502,'2005-06-22 22:06:37',1,'2006-02-15 21:30:53'),(2912,'2005-06-20 03:32:45',1076,196,'2005-06-21 23:32:45',1,'2006-02-15 21:30:53'),(2913,'2005-06-20 03:42:27',3456,402,'2005-06-23 04:47:27',1,'2006-02-15 21:30:53'),(2914,'2005-06-20 03:43:18',2419,342,'2005-06-25 03:44:18',2,'2006-02-15 21:30:53'),(2915,'2005-06-20 03:57:17',1293,262,'2005-06-24 05:59:17',2,'2006-02-15 21:30:53'),(2916,'2005-06-20 04:01:04',3086,590,'2005-06-27 22:40:04',2,'2006-02-15 21:30:53'),(2917,'2005-06-20 04:08:35',647,451,'2005-06-24 01:17:35',1,'2006-02-15 21:30:53'),(2918,'2005-06-20 04:09:04',1985,215,'2005-06-21 10:07:04',1,'2006-02-15 21:30:53'),(2919,'2005-06-20 04:10:16',2835,509,'2005-06-27 06:34:16',1,'2006-02-15 21:30:53'),(2920,'2005-06-20 04:12:46',487,588,'2005-06-26 23:34:46',2,'2006-02-15 21:30:53'),(2921,'2005-06-20 04:13:04',1785,59,'2005-06-28 01:28:04',1,'2006-02-15 21:30:53'),(2922,'2005-06-20 04:13:47',1671,176,'2005-06-22 04:38:47',2,'2006-02-15 21:30:53'),(2923,'2005-06-20 04:16:07',109,29,'2005-06-21 05:04:07',1,'2006-02-15 21:30:53'),(2924,'2005-06-20 04:20:14',580,132,'2005-06-21 01:13:14',1,'2006-02-15 21:30:53'),(2925,'2005-06-20 04:23:49',804,301,'2005-06-22 04:37:49',2,'2006-02-15 21:30:53'),(2926,'2005-06-20 04:37:45',1055,379,'2005-06-26 02:17:45',1,'2006-02-15 21:30:53'),(2927,'2005-06-20 04:41:41',393,403,'2005-06-23 01:59:41',1,'2006-02-15 21:30:53'),(2928,'2005-06-20 04:43:45',1265,104,'2005-06-21 06:58:45',2,'2006-02-15 21:30:53'),(2929,'2005-06-20 04:47:39',3389,333,'2005-06-25 23:16:39',2,'2006-02-15 21:30:53'),(2930,'2005-06-20 04:50:29',3615,585,'2005-06-28 06:00:29',2,'2006-02-15 21:30:53'),(2931,'2005-06-20 04:50:45',3122,258,'2005-06-29 09:18:45',1,'2006-02-15 21:30:53'),(2932,'2005-06-20 04:51:19',4418,526,'2005-06-29 08:31:19',1,'2006-02-15 21:30:53'),(2933,'2005-06-20 04:52:23',4483,323,'2005-06-26 07:12:23',2,'2006-02-15 21:30:53'),(2934,'2005-06-20 05:05:53',697,228,'2005-06-22 02:44:53',1,'2006-02-15 21:30:53'),(2935,'2005-06-20 05:07:24',2735,384,'2005-06-28 09:17:24',2,'2006-02-15 21:30:53'),(2936,'2005-06-20 05:09:27',2675,330,'2005-06-26 10:16:27',2,'2006-02-15 21:30:53'),(2937,'2005-06-20 05:15:37',1998,15,'2005-06-27 02:45:37',1,'2006-02-15 21:30:53'),(2938,'2005-06-20 05:17:22',1795,504,'2005-06-26 09:38:22',1,'2006-02-15 21:30:53'),(2939,'2005-06-20 05:18:16',2638,203,'2005-06-26 06:56:16',1,'2006-02-15 21:30:53'),(2940,'2005-06-20 05:20:01',2504,73,'2005-06-28 06:11:01',2,'2006-02-15 21:30:53'),(2941,'2005-06-20 05:22:18',3632,135,'2005-06-26 07:40:18',2,'2006-02-15 21:30:53'),(2942,'2005-06-20 05:27:31',999,242,'2005-06-29 00:35:31',1,'2006-02-15 21:30:53'),(2943,'2005-06-20 05:43:05',2591,418,'2005-06-25 04:31:05',1,'2006-02-15 21:30:53'),(2944,'2005-06-20 05:43:42',1550,474,'2005-06-29 09:40:42',2,'2006-02-15 21:30:53'),(2945,'2005-06-20 05:49:27',4193,153,'2005-06-26 09:48:27',1,'2006-02-15 21:30:53'),(2946,'2005-06-20 05:50:40',3737,213,'2005-06-21 00:42:40',2,'2006-02-15 21:30:53'),(2947,'2005-06-20 06:00:21',4302,151,'2005-06-23 10:04:21',2,'2006-02-15 21:30:53'),(2948,'2005-06-20 06:02:35',4254,289,'2005-06-29 09:12:35',2,'2006-02-15 21:30:53'),(2949,'2005-06-20 06:05:53',375,78,'2005-06-29 03:19:53',2,'2006-02-15 21:30:53'),(2950,'2005-06-20 06:08:36',1438,561,'2005-06-27 07:45:36',2,'2006-02-15 21:30:53'),(2951,'2005-06-20 06:23:01',2903,404,'2005-06-24 00:26:01',2,'2006-02-15 21:30:53'),(2952,'2005-06-20 06:26:57',3759,13,'2005-06-22 11:51:57',1,'2006-02-15 21:30:53'),(2953,'2005-06-20 06:39:11',1829,540,'2005-06-26 06:19:11',1,'2006-02-15 21:30:53'),(2954,'2005-06-20 06:45:00',377,336,'2005-06-23 11:43:00',1,'2006-02-15 21:30:53'),(2955,'2005-06-20 06:46:35',2312,244,'2005-06-25 05:34:35',2,'2006-02-15 21:30:53'),(2956,'2005-06-20 06:47:23',2684,533,'2005-06-22 07:24:23',2,'2006-02-15 21:30:53'),(2957,'2005-06-20 06:53:47',4034,542,'2005-06-29 09:21:47',2,'2006-02-15 21:30:53'),(2958,'2005-06-20 06:56:20',1380,260,'2005-06-29 02:33:20',2,'2006-02-15 21:30:53'),(2959,'2005-06-20 07:07:54',4185,372,'2005-06-27 03:31:54',1,'2006-02-15 21:30:53'),(2960,'2005-06-20 07:10:09',3970,16,'2005-06-26 08:14:09',2,'2006-02-15 21:30:53'),(2961,'2005-06-20 07:29:15',4539,399,'2005-06-24 08:05:15',1,'2006-02-15 21:30:53'),(2962,'2005-06-20 07:31:55',2978,364,'2005-06-26 04:43:55',1,'2006-02-15 21:30:53'),(2963,'2005-06-20 07:33:09',1444,24,'2005-06-28 09:23:09',1,'2006-02-15 21:30:53'),(2964,'2005-06-20 07:33:29',1201,590,'2005-06-29 12:48:29',1,'2006-02-15 21:30:53'),(2965,'2005-06-20 07:33:38',27,46,'2005-06-29 11:45:38',1,'2006-02-15 21:30:53'),(2966,'2005-06-20 07:39:33',3483,511,'2005-06-29 07:48:33',1,'2006-02-15 21:30:53'),(2967,'2005-06-20 07:40:35',4243,311,'2005-06-29 05:50:35',2,'2006-02-15 21:30:53'),(2968,'2005-06-20 07:41:47',4415,252,'2005-06-23 04:27:47',1,'2006-02-15 21:30:53'),(2969,'2005-06-20 07:44:27',1748,418,'2005-06-22 06:12:27',2,'2006-02-15 21:30:53'),(2970,'2005-06-20 07:51:51',1167,449,'2005-06-28 10:14:51',2,'2006-02-15 21:30:53'),(2971,'2005-06-20 07:56:00',1585,410,'2005-06-27 11:38:00',2,'2006-02-15 21:30:53'),(2972,'2005-06-20 07:57:54',2232,531,'2005-06-21 12:48:54',1,'2006-02-15 21:30:53'),(2973,'2005-06-20 07:59:27',2626,96,'2005-06-24 12:31:27',1,'2006-02-15 21:30:53'),(2974,'2005-06-20 08:00:24',2322,472,'2005-06-25 05:10:24',2,'2006-02-15 21:30:53'),(2975,'2005-06-20 08:06:18',4534,46,'2005-06-21 08:01:18',1,'2006-02-15 21:30:53'),(2976,'2005-06-20 08:09:11',4210,55,'2005-06-21 10:45:11',1,'2006-02-15 21:30:53'),(2977,'2005-06-20 08:15:27',2645,571,'2005-06-29 04:30:27',2,'2006-02-15 21:30:53'),(2978,'2005-06-20 08:25:16',4364,548,'2005-06-23 05:42:16',1,'2006-02-15 21:30:53'),(2979,'2005-06-20 08:31:05',3961,589,'2005-06-27 12:25:05',1,'2006-02-15 21:30:53'),(2980,'2005-06-20 08:35:03',310,343,'2005-06-29 07:57:03',2,'2006-02-15 21:30:53'),(2981,'2005-06-20 08:35:17',522,387,'2005-06-28 09:14:17',1,'2006-02-15 21:30:53'),(2982,'2005-06-20 08:38:29',2574,130,'2005-06-28 13:21:29',1,'2006-02-15 21:30:53'),(2983,'2005-06-20 08:41:42',1349,322,'2005-06-29 04:02:42',2,'2006-02-15 21:30:53'),(2984,'2005-06-20 08:43:44',1819,435,'2005-06-22 03:08:44',2,'2006-02-15 21:30:53'),(2985,'2005-06-20 08:45:08',122,154,'2005-06-22 04:26:08',2,'2006-02-15 21:30:53'),(2986,'2005-06-20 08:50:28',478,556,'2005-06-26 05:24:28',2,'2006-02-15 21:30:53'),(2987,'2005-06-20 08:55:50',1531,349,'2005-06-28 13:02:50',2,'2006-02-15 21:30:53'),(2988,'2005-06-20 08:59:08',3160,557,'2005-06-28 04:31:08',2,'2006-02-15 21:30:53'),(2989,'2005-06-20 08:59:37',1586,56,'2005-06-22 03:27:37',2,'2006-02-15 21:30:53'),(2990,'2005-06-20 09:02:51',4559,18,'2005-06-29 13:19:51',2,'2006-02-15 21:30:53'),(2991,'2005-06-20 09:10:43',4308,472,'2005-06-23 13:04:43',1,'2006-02-15 21:30:53'),(2992,'2005-06-20 09:11:51',3347,439,'2005-06-24 05:59:51',1,'2006-02-15 21:30:53'),(2993,'2005-06-20 09:12:12',1527,40,'2005-06-22 13:36:12',2,'2006-02-15 21:30:53'),(2994,'2005-06-20 09:17:05',1290,163,'2005-06-29 04:41:05',1,'2006-02-15 21:30:53'),(2995,'2005-06-20 09:18:22',4544,573,'2005-06-26 14:31:22',1,'2006-02-15 21:30:53'),(2996,'2005-06-20 09:20:29',4064,500,'2005-06-27 09:18:29',1,'2006-02-15 21:30:53'),(2997,'2005-06-20 09:23:45',1449,519,'2005-06-29 08:15:45',1,'2006-02-15 21:30:53'),(2998,'2005-06-20 09:30:22',1288,380,'2005-06-24 06:31:22',2,'2006-02-15 21:30:53'),(2999,'2005-06-20 09:30:34',735,295,'2005-06-26 05:51:34',2,'2006-02-15 21:30:53'),(3000,'2005-06-20 09:32:33',549,50,'2005-06-22 07:45:33',1,'2006-02-15 21:30:53'),(3001,'2005-06-20 09:50:16',2941,393,'2005-06-28 05:13:16',2,'2006-02-15 21:30:53'),(3002,'2005-06-20 09:56:12',2749,266,'2005-06-24 12:15:12',2,'2006-02-15 21:30:53'),(3003,'2005-06-20 10:00:51',616,38,'2005-06-22 06:28:51',2,'2006-02-15 21:30:53'),(3004,'2005-06-20 10:04:36',2836,113,'2005-06-23 07:38:36',2,'2006-02-15 21:30:53'),(3005,'2005-06-20 10:10:29',286,598,'2005-06-28 15:48:29',2,'2006-02-15 21:30:53'),(3006,'2005-06-20 10:10:29',1677,133,'2005-06-22 07:26:29',2,'2006-02-15 21:30:53'),(3007,'2005-06-20 10:11:53',1950,7,'2005-06-25 04:51:53',2,'2006-02-15 21:30:53'),(3008,'2005-06-20 10:23:25',3383,202,'2005-06-26 11:00:25',2,'2006-02-15 21:30:53'),(3009,'2005-06-20 10:24:44',2721,280,'2005-06-23 13:39:44',1,'2006-02-15 21:30:53'),(3010,'2005-06-20 10:29:59',1298,567,'2005-06-27 06:52:59',1,'2006-02-15 21:30:53'),(3011,'2005-06-20 10:39:10',4376,147,'2005-06-28 07:02:10',2,'2006-02-15 21:30:53'),(3012,'2005-06-20 10:43:13',1392,206,'2005-06-28 10:07:13',2,'2006-02-15 21:30:53'),(3013,'2005-06-20 10:45:09',4146,290,'2005-06-26 04:55:09',1,'2006-02-15 21:30:53'),(3014,'2005-06-20 10:45:20',2179,434,'2005-06-23 06:29:20',1,'2006-02-15 21:30:53'),(3015,'2005-06-20 10:48:56',1311,23,'2005-06-26 11:30:56',2,'2006-02-15 21:30:53'),(3016,'2005-06-20 10:55:08',3514,558,'2005-06-24 14:05:08',1,'2006-02-15 21:30:53'),(3017,'2005-06-20 11:08:56',2513,151,'2005-06-28 16:26:56',1,'2006-02-15 21:30:53'),(3018,'2005-06-20 11:10:35',4150,112,'2005-06-25 07:17:35',2,'2006-02-15 21:30:53'),(3019,'2005-06-20 11:11:52',491,144,'2005-06-27 08:30:52',2,'2006-02-15 21:30:53'),(3020,'2005-06-20 11:12:04',4363,74,'2005-06-27 07:31:04',2,'2006-02-15 21:30:53'),(3021,'2005-06-20 11:13:01',120,62,'2005-06-28 16:15:01',2,'2006-02-15 21:30:53'),(3022,'2005-06-20 11:17:20',3745,466,'2005-06-26 13:15:20',2,'2006-02-15 21:30:53'),(3023,'2005-06-20 11:18:11',4304,106,'2005-06-21 12:43:11',1,'2006-02-15 21:30:53'),(3024,'2005-06-20 11:29:17',1966,328,'2005-06-27 12:51:17',2,'2006-02-15 21:30:53'),(3025,'2005-06-20 11:46:48',1309,293,'2005-06-22 08:43:48',1,'2006-02-15 21:30:53'),(3026,'2005-06-20 11:48:00',4032,347,'2005-06-21 12:51:00',2,'2006-02-15 21:30:53'),(3027,'2005-06-20 11:50:30',4028,397,'2005-06-25 15:58:30',2,'2006-02-15 21:30:53'),(3028,'2005-06-20 11:50:52',886,264,'2005-06-21 11:05:52',2,'2006-02-15 21:30:53'),(3029,'2005-06-20 11:51:30',327,317,'2005-06-25 16:42:30',1,'2006-02-15 21:30:53'),(3030,'2005-06-20 11:51:59',1543,395,'2005-06-24 10:51:59',1,'2006-02-15 21:30:53'),(3031,'2005-06-20 11:52:49',1184,491,'2005-06-22 07:00:49',1,'2006-02-15 21:30:53'),(3032,'2005-06-20 11:58:30',3734,172,'2005-06-24 09:49:30',1,'2006-02-15 21:30:53'),(3033,'2005-06-20 12:02:05',4422,107,'2005-06-26 15:58:05',1,'2006-02-15 21:30:53'),(3034,'2005-06-20 12:15:50',2755,296,'2005-06-24 06:21:50',2,'2006-02-15 21:30:53'),(3035,'2005-06-20 12:17:03',1223,62,'2005-06-26 17:42:03',2,'2006-02-15 21:30:53'),(3036,'2005-06-20 12:18:31',4463,399,'2005-06-29 09:52:31',1,'2006-02-15 21:30:53'),(3037,'2005-06-20 12:28:03',2033,434,'2005-06-21 08:21:03',1,'2006-02-15 21:30:53'),(3038,'2005-06-20 12:28:59',2919,27,'2005-06-25 07:48:59',1,'2006-02-15 21:30:53'),(3039,'2005-06-20 12:32:30',4098,186,'2005-06-21 07:38:30',1,'2006-02-15 21:30:53'),(3040,'2005-06-20 12:34:13',2568,162,'2005-06-21 12:33:13',1,'2006-02-15 21:30:53'),(3041,'2005-06-20 12:35:44',2676,459,'2005-06-23 18:28:44',2,'2006-02-15 21:30:53'),(3042,'2005-06-20 12:38:27',3103,291,'2005-06-26 11:18:27',1,'2006-02-15 21:30:53'),(3043,'2005-06-20 12:38:35',633,599,'2005-06-29 14:16:35',2,'2006-02-15 21:30:53'),(3044,'2005-06-20 12:38:49',3216,424,'2005-06-25 07:49:49',1,'2006-02-15 21:30:53'),(3045,'2005-06-20 12:42:00',3065,459,'2005-06-23 10:49:00',2,'2006-02-15 21:30:53'),(3046,'2005-06-20 12:42:59',471,559,'2005-06-26 17:40:59',2,'2006-02-15 21:30:53'),(3047,'2005-06-20 12:45:33',624,13,'2005-06-29 13:09:33',2,'2006-02-15 21:30:53'),(3048,'2005-06-20 12:49:55',4389,482,'2005-06-26 11:06:55',1,'2006-02-15 21:30:53'),(3049,'2005-06-20 12:51:01',518,403,'2005-06-29 10:53:01',1,'2006-02-15 21:30:53'),(3050,'2005-06-20 13:03:03',2397,557,'2005-06-29 07:22:03',1,'2006-02-15 21:30:53'),(3051,'2005-06-20 13:06:52',1408,65,'2005-06-25 13:03:52',2,'2006-02-15 21:30:53'),(3052,'2005-06-20 13:09:19',2359,329,'2005-06-29 11:55:19',2,'2006-02-15 21:30:53'),(3053,'2005-06-20 13:10:30',818,329,'2005-06-25 17:22:30',2,'2006-02-15 21:30:53'),(3054,'2005-06-20 13:16:41',2817,322,'2005-06-28 13:45:41',2,'2006-02-15 21:30:53'),(3055,'2005-06-20 13:19:58',1510,23,'2005-06-27 14:54:58',1,'2006-02-15 21:30:53'),(3056,'2005-06-20 13:20:58',2010,95,'2005-06-26 08:35:58',2,'2006-02-15 21:30:53'),(3057,'2005-06-20 13:22:48',1101,307,'2005-06-26 17:22:48',2,'2006-02-15 21:30:53'),(3058,'2005-06-20 13:28:35',938,137,'2005-06-28 13:57:35',2,'2006-02-15 21:30:53'),(3059,'2005-06-20 13:38:41',2911,266,'2005-06-21 10:13:41',2,'2006-02-15 21:30:53'),(3060,'2005-06-20 13:47:20',2075,446,'2005-06-25 16:00:20',2,'2006-02-15 21:30:53'),(3061,'2005-06-20 13:48:21',4202,330,'2005-06-22 17:36:21',2,'2006-02-15 21:30:53'),(3062,'2005-06-20 13:50:00',591,75,'2005-06-27 08:18:00',1,'2006-02-15 21:30:53'),(3063,'2005-06-20 13:52:03',3954,515,'2005-06-28 13:36:03',2,'2006-02-15 21:30:53'),(3064,'2005-06-20 13:53:13',2624,276,'2005-06-25 16:33:13',2,'2006-02-15 21:30:53'),(3065,'2005-06-20 13:53:53',1687,227,'2005-06-24 11:31:53',1,'2006-02-15 21:30:53'),(3066,'2005-06-20 13:55:41',1116,268,'2005-06-26 09:38:41',2,'2006-02-15 21:30:53'),(3067,'2005-06-20 13:59:21',3094,349,'2005-06-28 19:09:21',2,'2006-02-15 21:30:53'),(3068,'2005-06-20 14:02:22',1958,516,'2005-06-22 12:52:22',2,'2006-02-15 21:30:53'),(3069,'2005-06-20 14:13:00',1952,237,'2005-06-28 10:57:00',1,'2006-02-15 21:30:53'),(3070,'2005-06-20 14:15:39',3860,543,'2005-06-25 12:52:39',2,'2006-02-15 21:30:53'),(3071,'2005-06-20 14:20:42',1198,582,'2005-06-24 19:01:42',1,'2006-02-15 21:30:53'),(3072,'2005-06-20 14:21:31',4131,423,'2005-06-27 18:46:31',2,'2006-02-15 21:30:53'),(3073,'2005-06-20 14:33:26',3164,471,'2005-06-26 08:42:26',2,'2006-02-15 21:30:53'),(3074,'2005-06-20 14:41:41',1441,299,'2005-06-21 15:56:41',1,'2006-02-15 21:30:53'),(3075,'2005-06-20 14:52:19',4346,161,'2005-06-28 18:48:19',2,'2006-02-15 21:30:53'),(3076,'2005-06-20 15:01:19',1344,109,'2005-06-28 16:53:19',2,'2006-02-15 21:30:53'),(3077,'2005-06-20 15:05:18',1675,303,'2005-06-26 20:52:18',2,'2006-02-15 21:30:53'),(3078,'2005-06-20 15:09:48',3642,367,'2005-06-24 16:54:48',1,'2006-02-15 21:30:53'),(3079,'2005-06-20 15:13:40',2135,350,'2005-06-21 12:03:40',1,'2006-02-15 21:30:53'),(3080,'2005-06-20 15:22:32',118,377,'2005-06-24 11:08:32',1,'2006-02-15 21:30:53'),(3081,'2005-06-20 15:29:13',2071,342,'2005-06-24 21:00:13',2,'2006-02-15 21:30:53'),(3082,'2005-06-20 15:32:11',4431,164,'2005-06-28 13:08:11',1,'2006-02-15 21:30:53'),(3083,'2005-06-20 15:33:47',2896,257,'2005-06-26 16:14:47',2,'2006-02-15 21:30:53'),(3084,'2005-06-20 15:35:24',3578,514,'2005-06-23 19:11:24',1,'2006-02-15 21:30:53'),(3085,'2005-06-20 15:42:33',4282,166,'2005-06-21 16:51:33',2,'2006-02-15 21:30:53'),(3086,'2005-06-20 15:42:40',4437,377,'2005-06-25 19:21:40',1,'2006-02-15 21:30:53'),(3087,'2005-06-20 15:53:59',1305,111,'2005-06-27 10:54:59',2,'2006-02-15 21:30:53'),(3088,'2005-06-20 15:56:05',3049,384,'2005-06-29 13:02:05',1,'2006-02-15 21:30:53'),(3089,'2005-06-20 15:57:01',539,151,'2005-06-25 13:15:01',2,'2006-02-15 21:30:53'),(3090,'2005-06-20 16:00:19',3301,267,'2005-06-23 14:55:19',1,'2006-02-15 21:30:53'),(3091,'2005-06-20 16:02:59',854,383,'2005-06-22 21:30:59',2,'2006-02-15 21:30:53'),(3092,'2005-06-20 16:04:42',4344,347,'2005-06-27 19:54:42',1,'2006-02-15 21:30:53'),(3093,'2005-06-20 16:06:14',2534,556,'2005-06-22 13:22:14',2,'2006-02-15 21:30:53'),(3094,'2005-06-20 16:06:51',2048,114,'2005-06-24 13:23:51',1,'2006-02-15 21:30:53'),(3095,'2005-06-20 16:16:53',3937,298,'2005-06-22 10:35:53',2,'2006-02-15 21:30:53'),(3096,'2005-06-20 16:17:56',3851,79,'2005-06-24 10:17:56',2,'2006-02-15 21:30:53'),(3097,'2005-06-20 16:26:14',4337,280,'2005-06-23 14:46:14',1,'2006-02-15 21:30:53'),(3098,'2005-06-20 16:37:01',3409,498,'2005-06-22 22:24:01',1,'2006-02-15 21:30:53'),(3099,'2005-06-20 16:44:33',3756,380,'2005-06-27 12:17:33',2,'2006-02-15 21:30:53'),(3100,'2005-06-20 16:47:57',2428,487,'2005-06-26 16:59:57',1,'2006-02-15 21:30:53'),(3101,'2005-06-20 16:48:58',1738,384,'2005-06-27 18:13:58',2,'2006-02-15 21:30:53'),(3102,'2005-06-20 16:55:55',1144,522,'2005-06-29 13:49:55',1,'2006-02-15 21:30:53'),(3103,'2005-06-20 16:58:19',1877,553,'2005-06-25 21:18:19',1,'2006-02-15 21:30:53'),(3104,'2005-06-20 17:06:46',1490,196,'2005-06-28 13:18:46',2,'2006-02-15 21:30:53'),(3105,'2005-06-20 17:11:46',130,385,'2005-06-21 11:48:46',2,'2006-02-15 21:30:53'),(3106,'2005-06-20 17:18:06',2637,201,'2005-06-24 14:50:06',2,'2006-02-15 21:30:53'),(3107,'2005-06-20 17:26:05',4527,303,'2005-06-25 12:36:05',1,'2006-02-15 21:30:53'),(3108,'2005-06-20 17:28:43',2218,189,'2005-06-27 21:23:43',1,'2006-02-15 21:30:53'),(3109,'2005-06-20 17:33:55',977,93,'2005-06-22 23:09:55',1,'2006-02-15 21:30:53'),(3110,'2005-06-20 17:40:12',2008,333,'2005-06-24 17:09:12',1,'2006-02-15 21:30:53'),(3111,'2005-06-20 17:46:47',4494,579,'2005-06-29 19:45:47',1,'2006-02-15 21:30:53'),(3112,'2005-06-20 17:53:30',3725,35,'2005-06-26 16:03:30',1,'2006-02-15 21:30:53'),(3113,'2005-06-20 17:56:40',3620,517,'2005-06-23 14:45:40',1,'2006-02-15 21:30:53'),(3114,'2005-06-20 17:57:47',2388,8,'2005-06-21 19:18:47',2,'2006-02-15 21:30:53'),(3115,'2005-06-20 17:59:05',2193,457,'2005-06-26 13:28:05',1,'2006-02-15 21:30:53'),(3116,'2005-06-20 18:04:55',276,108,'2005-06-21 12:12:55',2,'2006-02-15 21:30:53'),(3117,'2005-06-20 18:05:15',2184,31,'2005-06-26 17:28:15',1,'2006-02-15 21:30:53'),(3118,'2005-06-20 18:05:57',1258,125,'2005-06-23 23:01:57',1,'2006-02-15 21:30:53'),(3119,'2005-06-20 18:11:44',683,296,'2005-06-27 16:14:44',2,'2006-02-15 21:30:53'),(3120,'2005-06-20 18:19:29',2530,107,'2005-06-23 23:40:29',1,'2006-02-15 21:30:53'),(3121,'2005-06-20 18:23:30',797,132,'2005-06-21 20:36:30',1,'2006-02-15 21:30:53'),(3122,'2005-06-20 18:25:57',2720,87,'2005-06-29 16:08:57',1,'2006-02-15 21:30:53'),(3123,'2005-06-20 18:26:14',1656,289,'2005-06-29 17:17:14',1,'2006-02-15 21:30:53'),(3124,'2005-06-20 18:28:19',3342,113,'2005-06-28 21:08:19',1,'2006-02-15 21:30:53'),(3125,'2005-06-20 18:31:58',3293,382,'2005-06-21 15:03:58',1,'2006-02-15 21:30:53'),(3126,'2005-06-20 18:38:22',1183,5,'2005-06-26 00:00:22',1,'2006-02-15 21:30:53'),(3127,'2005-06-20 18:39:43',1292,461,'2005-06-28 17:55:43',1,'2006-02-15 21:30:53'),(3128,'2005-06-20 18:41:47',189,543,'2005-06-24 20:54:47',2,'2006-02-15 21:30:53'),(3129,'2005-06-20 18:57:48',1789,495,'2005-06-28 13:45:48',1,'2006-02-15 21:30:53'),(3130,'2005-06-20 19:03:22',2569,341,'2005-06-29 18:05:22',2,'2006-02-15 21:30:53'),(3131,'2005-06-20 19:08:00',3678,146,'2005-06-24 20:59:00',2,'2006-02-15 21:30:53'),(3132,'2005-06-20 19:09:46',711,90,'2005-06-24 19:42:46',1,'2006-02-15 21:30:53'),(3133,'2005-06-20 19:18:32',4529,120,'2005-06-26 17:54:32',2,'2006-02-15 21:30:53'),(3134,'2005-06-20 19:29:09',1389,537,'2005-06-29 19:31:09',2,'2006-02-15 21:30:53'),(3135,'2005-06-20 19:33:52',1122,12,'2005-06-29 18:20:52',1,'2006-02-15 21:30:53'),(3136,'2005-06-20 19:39:08',3349,377,'2005-06-22 23:35:08',2,'2006-02-15 21:30:53'),(3137,'2005-06-20 19:41:28',786,505,'2005-06-28 00:32:28',1,'2006-02-15 21:30:53'),(3138,'2005-06-20 19:43:45',2265,570,'2005-06-26 20:41:45',1,'2006-02-15 21:30:53'),(3139,'2005-06-20 19:44:45',3474,354,'2005-06-23 16:24:45',1,'2006-02-15 21:30:53'),(3140,'2005-06-20 19:47:12',2936,53,'2005-06-24 23:24:12',1,'2006-02-15 21:30:53'),(3141,'2005-06-20 19:55:47',1806,398,'2005-06-30 00:31:47',1,'2006-02-15 21:30:53'),(3142,'2005-06-20 19:59:28',3926,9,'2005-06-28 19:51:28',2,'2006-02-15 21:30:53'),(3143,'2005-06-20 20:01:52',1355,215,'2005-06-26 19:26:52',2,'2006-02-15 21:30:53'),(3144,'2005-06-20 20:14:20',1300,114,'2005-06-30 01:46:20',1,'2006-02-15 21:30:53'),(3145,'2005-06-20 20:21:17',2211,144,'2005-06-22 14:44:17',1,'2006-02-15 21:30:53'),(3146,'2005-06-20 20:21:48',2249,339,'2005-06-29 22:57:48',2,'2006-02-15 21:30:53'),(3147,'2005-06-20 20:25:17',615,390,'2005-06-28 20:22:17',2,'2006-02-15 21:30:53'),(3148,'2005-06-20 20:27:18',4490,202,'2005-06-24 20:30:18',2,'2006-02-15 21:30:53'),(3149,'2005-06-20 20:34:55',3295,55,'2005-06-21 18:51:55',1,'2006-02-15 21:30:53'),(3150,'2005-06-20 20:35:28',94,34,'2005-06-26 01:01:28',1,'2006-02-15 21:30:53'),(3151,'2005-06-20 20:36:53',2976,77,'2005-06-25 18:56:53',1,'2006-02-15 21:30:53'),(3152,'2005-06-20 20:42:41',1022,246,'2005-06-28 21:12:41',1,'2006-02-15 21:30:53'),(3153,'2005-06-20 20:44:15',659,430,'2005-06-23 16:04:15',1,'2006-02-15 21:30:53'),(3154,'2005-06-20 20:44:40',3195,550,'2005-06-23 19:10:40',1,'2006-02-15 21:30:53'),(3155,'2005-06-20 21:02:38',458,450,'2005-06-27 19:34:38',1,'2006-02-15 21:30:53'),(3156,'2005-06-20 21:03:46',2217,365,'2005-06-21 23:32:46',2,'2006-02-15 21:30:53'),(3157,'2005-06-20 21:07:54',1899,245,'2005-06-23 16:01:54',1,'2006-02-15 21:30:53'),(3158,'2005-06-20 21:08:19',3461,592,'2005-06-29 18:59:19',1,'2006-02-15 21:30:53'),(3159,'2005-06-20 21:11:50',33,388,'2005-06-29 19:35:50',2,'2006-02-15 21:30:53'),(3160,'2005-06-20 21:20:51',4333,561,'2005-06-29 18:06:51',2,'2006-02-15 21:30:53'),(3161,'2005-06-20 21:21:01',1326,373,'2005-06-21 18:22:01',2,'2006-02-15 21:30:53'),(3162,'2005-06-20 21:21:15',3220,113,'2005-06-29 18:42:15',1,'2006-02-15 21:30:53'),(3163,'2005-06-20 21:22:13',2632,391,'2005-06-26 15:22:13',2,'2006-02-15 21:30:53'),(3164,'2005-06-20 21:29:00',155,270,'2005-06-27 15:50:00',1,'2006-02-15 21:30:53'),(3165,'2005-06-20 21:29:17',796,85,'2005-06-22 18:03:17',1,'2006-02-15 21:30:53'),(3166,'2005-06-20 21:32:32',1850,424,'2005-06-27 20:29:32',1,'2006-02-15 21:30:53'),(3167,'2005-06-20 21:42:29',353,464,'2005-06-22 00:36:29',2,'2006-02-15 21:30:53'),(3168,'2005-06-20 21:46:01',2407,446,'2005-06-22 20:40:01',1,'2006-02-15 21:30:53'),(3169,'2005-06-20 21:55:54',2437,50,'2005-06-25 19:45:54',1,'2006-02-15 21:30:53'),(3170,'2005-06-20 22:02:54',1306,421,'2005-06-29 00:41:54',2,'2006-02-15 21:30:53'),(3171,'2005-06-20 22:15:47',2838,140,'2005-06-24 18:14:47',1,'2006-02-15 21:30:53'),(3172,'2005-06-20 22:19:25',1758,31,'2005-06-24 17:18:25',2,'2006-02-15 21:30:53'),(3173,'2005-06-20 22:21:10',4306,33,'2005-06-27 19:41:10',2,'2006-02-15 21:30:53'),(3174,'2005-06-20 22:24:00',3331,107,'2005-06-22 21:22:00',2,'2006-02-15 21:30:53'),(3175,'2005-06-20 22:30:23',4093,249,'2005-06-30 03:28:23',2,'2006-02-15 21:30:53'),(3176,'2005-06-20 22:31:54',1982,371,'2005-06-25 02:58:54',1,'2006-02-15 21:30:53'),(3177,'2005-06-20 22:32:44',2546,300,'2005-06-22 23:01:44',1,'2006-02-15 21:30:53'),(3178,'2005-06-20 22:35:12',3517,79,'2005-06-23 19:39:12',1,'2006-02-15 21:30:53'),(3179,'2005-06-20 22:37:59',2214,163,'2005-06-26 22:26:59',2,'2006-02-15 21:30:53'),(3180,'2005-06-20 22:48:44',3997,162,'2005-06-21 21:25:44',1,'2006-02-15 21:30:53'),(3181,'2005-06-20 22:51:02',3473,238,'2005-06-27 21:21:02',1,'2006-02-15 21:30:53'),(3182,'2005-06-20 22:52:18',4017,15,'2005-06-21 21:00:18',2,'2006-02-15 21:30:53'),(3183,'2005-06-20 22:55:55',4397,129,'2005-06-23 17:22:55',1,'2006-02-15 21:30:53'),(3184,'2005-06-20 22:57:44',3179,457,'2005-06-29 20:57:44',1,'2006-02-15 21:30:53'),(3185,'2005-06-20 22:58:01',601,234,'2005-06-27 00:26:01',1,'2006-02-15 21:30:53'),(3186,'2005-06-20 23:04:20',3198,406,'2005-06-29 02:56:20',2,'2006-02-15 21:30:53'),(3187,'2005-06-20 23:06:07',4357,150,'2005-06-27 01:14:07',2,'2006-02-15 21:30:53'),(3188,'2005-06-20 23:10:27',2471,522,'2005-06-25 19:37:27',2,'2006-02-15 21:30:53'),(3189,'2005-06-20 23:19:33',1502,538,'2005-06-24 17:46:33',1,'2006-02-15 21:30:53'),(3190,'2005-06-20 23:27:15',351,200,'2005-06-28 01:22:15',2,'2006-02-15 21:30:53'),(3191,'2005-06-20 23:46:39',4358,522,'2005-06-25 03:21:39',2,'2006-02-15 21:30:53'),(3192,'2005-06-20 23:49:12',3713,11,'2005-06-24 03:00:12',1,'2006-02-15 21:30:53'),(3193,'2005-06-20 23:52:30',3176,260,'2005-06-22 21:21:30',1,'2006-02-15 21:30:53'),(3194,'2005-06-20 23:59:57',1835,432,'2005-06-24 19:21:57',1,'2006-02-15 21:30:53'),(3195,'2005-06-21 00:02:10',2383,165,'2005-06-21 23:11:10',2,'2006-02-15 21:30:53'),(3196,'2005-06-21 00:02:28',1575,52,'2005-06-22 23:08:28',1,'2006-02-15 21:30:53'),(3197,'2005-06-21 00:07:23',1811,362,'2005-06-23 00:53:23',2,'2006-02-15 21:30:53'),(3198,'2005-06-21 00:08:54',1626,295,'2005-06-29 02:11:54',2,'2006-02-15 21:30:53'),(3199,'2005-06-21 00:12:40',3824,234,'2005-06-27 23:26:40',1,'2006-02-15 21:30:53'),(3200,'2005-06-21 00:22:47',4117,221,'2005-06-27 05:52:47',2,'2006-02-15 21:30:53'),(3201,'2005-06-21 00:30:26',6,597,'2005-06-28 03:42:26',1,'2006-02-15 21:30:53'),(3202,'2005-06-21 00:33:47',2725,273,'2005-06-24 04:05:47',2,'2006-02-15 21:30:53'),(3203,'2005-06-21 00:34:56',442,158,'2005-06-29 23:30:56',1,'2006-02-15 21:30:53'),(3204,'2005-06-21 00:37:50',2848,336,'2005-06-22 23:46:50',1,'2006-02-15 21:30:53'),(3205,'2005-06-21 00:38:47',2964,31,'2005-06-21 22:49:47',1,'2006-02-15 21:30:53'),(3206,'2005-06-21 00:39:39',2196,350,'2005-06-22 05:12:39',1,'2006-02-15 21:30:53'),(3207,'2005-06-21 00:43:16',4020,86,'2005-06-24 22:13:16',1,'2006-02-15 21:30:53'),(3208,'2005-06-21 00:50:03',3169,229,'2005-06-24 06:15:03',2,'2006-02-15 21:30:53'),(3209,'2005-06-21 00:51:06',287,307,'2005-06-22 21:49:06',2,'2006-02-15 21:30:53'),(3210,'2005-06-21 01:00:25',467,75,'2005-06-23 06:10:25',2,'2006-02-15 21:30:53'),(3211,'2005-06-21 01:01:29',1150,415,'2005-06-23 04:05:29',1,'2006-02-15 21:30:53'),(3212,'2005-06-21 01:04:35',4178,21,'2005-06-30 00:10:35',2,'2006-02-15 21:30:53'),(3213,'2005-06-21 01:05:19',3832,534,'2005-06-27 21:55:19',2,'2006-02-15 21:30:53'),(3214,'2005-06-21 01:08:26',776,142,'2005-06-23 03:24:26',2,'2006-02-15 21:30:53'),(3215,'2005-06-21 01:11:32',4140,279,'2005-06-26 19:42:32',1,'2006-02-15 21:30:53'),(3216,'2005-06-21 01:19:37',719,534,'2005-06-29 06:45:37',2,'2006-02-15 21:30:53'),(3217,'2005-06-21 01:28:12',1027,463,'2005-06-25 02:51:12',2,'2006-02-15 21:30:53'),(3218,'2005-06-21 01:38:09',1828,117,'2005-06-23 02:00:09',1,'2006-02-15 21:30:53'),(3219,'2005-06-21 01:43:26',3024,129,'2005-06-28 23:50:26',2,'2006-02-15 21:30:53'),(3220,'2005-06-21 01:46:25',1880,574,'2005-06-26 07:44:25',2,'2006-02-15 21:30:53'),(3221,'2005-06-21 01:49:47',245,454,'2005-06-25 06:31:47',1,'2006-02-15 21:30:53'),(3222,'2005-06-21 01:50:29',4023,501,'2005-06-27 00:52:29',2,'2006-02-15 21:30:53'),(3223,'2005-06-21 02:06:45',1033,299,'2005-06-22 07:16:45',2,'2006-02-15 21:30:53'),(3224,'2005-06-21 02:11:36',3318,173,'2005-06-23 21:17:36',1,'2006-02-15 21:30:53'),(3225,'2005-06-21 02:16:55',1003,448,'2005-06-27 05:39:55',2,'2006-02-15 21:30:53'),(3226,'2005-06-21 02:18:14',4079,576,'2005-06-26 22:32:14',2,'2006-02-15 21:30:53'),(3227,'2005-06-21 02:18:25',1156,568,'2005-06-27 00:59:25',1,'2006-02-15 21:30:53'),(3228,'2005-06-21 02:20:24',2489,535,'2005-06-29 00:50:24',2,'2006-02-15 21:30:53'),(3229,'2005-06-21 02:20:41',2301,81,'2005-06-26 00:39:41',1,'2006-02-15 21:30:53'),(3230,'2005-06-21 02:23:16',215,83,'2005-06-22 01:37:16',2,'2006-02-15 21:30:53'),(3231,'2005-06-21 02:25:00',237,28,'2005-06-23 05:46:00',2,'2006-02-15 21:30:53'),(3232,'2005-06-21 02:30:37',1972,555,'2005-06-29 03:10:37',1,'2006-02-15 21:30:53'),(3233,'2005-06-21 02:39:31',3542,353,'2005-06-28 05:23:31',2,'2006-02-15 21:30:53'),(3234,'2005-06-21 02:39:44',3252,459,'2005-06-29 07:27:44',1,'2006-02-15 21:30:53'),(3235,'2005-06-21 02:46:17',212,49,'2005-06-22 20:58:17',1,'2006-02-15 21:30:53'),(3236,'2005-06-21 02:47:43',1492,550,'2005-06-29 08:04:43',2,'2006-02-15 21:30:53'),(3237,'2005-06-21 02:47:56',4399,466,'2005-06-27 03:16:56',2,'2006-02-15 21:30:53'),(3238,'2005-06-21 02:48:21',2732,77,'2005-06-23 04:43:21',1,'2006-02-15 21:30:53'),(3239,'2005-06-21 02:48:40',3402,328,'2005-06-22 02:49:40',2,'2006-02-15 21:30:53'),(3240,'2005-06-21 02:53:17',2938,405,'2005-06-30 03:25:17',2,'2006-02-15 21:30:53'),(3241,'2005-06-21 02:54:32',1442,499,'2005-06-26 21:56:32',2,'2006-02-15 21:30:53'),(3242,'2005-06-21 02:56:24',1421,562,'2005-06-29 21:41:24',2,'2006-02-15 21:30:53'),(3243,'2005-06-21 03:00:11',2556,426,'2005-06-25 21:53:11',1,'2006-02-15 21:30:53'),(3244,'2005-06-21 03:01:10',291,53,'2005-06-24 06:59:10',2,'2006-02-15 21:30:53'),(3245,'2005-06-21 03:06:11',2057,358,'2005-06-25 08:06:11',2,'2006-02-15 21:30:53'),(3246,'2005-06-21 03:10:01',4432,41,'2005-06-28 00:46:01',1,'2006-02-15 21:30:53'),(3247,'2005-06-21 03:12:15',1406,277,'2005-06-27 00:44:15',1,'2006-02-15 21:30:53'),(3248,'2005-06-21 03:12:21',3656,78,'2005-06-28 03:54:21',2,'2006-02-15 21:30:53'),(3249,'2005-06-21 03:13:19',703,410,'2005-06-29 04:04:19',2,'2006-02-15 21:30:53'),(3250,'2005-06-21 03:16:36',736,467,'2005-06-29 00:53:36',2,'2006-02-15 21:30:53'),(3251,'2005-06-21 03:20:37',1414,317,'2005-06-23 04:54:37',2,'2006-02-15 21:30:53'),(3252,'2005-06-21 03:25:26',2009,213,'2005-06-24 00:38:26',2,'2006-02-15 21:30:53'),(3253,'2005-06-21 03:25:37',1906,405,'2005-06-27 02:46:37',2,'2006-02-15 21:30:53'),(3254,'2005-06-21 03:27:10',3893,472,'2005-06-22 22:01:10',2,'2006-02-15 21:30:53'),(3255,'2005-06-21 03:39:52',2564,482,'2005-06-24 04:02:52',1,'2006-02-15 21:30:53'),(3256,'2005-06-21 03:45:42',1235,319,'2005-06-30 02:51:42',2,'2006-02-15 21:30:53'),(3257,'2005-06-21 03:47:19',3975,263,'2005-06-28 01:24:19',2,'2006-02-15 21:30:53'),(3258,'2005-06-21 03:53:58',4417,241,'2005-06-22 22:49:58',2,'2006-02-15 21:30:53'),(3259,'2005-06-21 03:57:15',2751,478,'2005-06-24 03:32:15',1,'2006-02-15 21:30:53'),(3260,'2005-06-21 03:59:13',3627,380,'2005-06-23 03:29:13',1,'2006-02-15 21:30:53'),(3261,'2005-06-21 04:07:41',2029,169,'2005-06-24 06:25:41',2,'2006-02-15 21:30:53'),(3262,'2005-06-21 04:08:43',3773,9,'2005-06-28 02:55:43',1,'2006-02-15 21:30:53'),(3263,'2005-06-21 04:15:52',3491,118,'2005-06-24 02:19:52',2,'2006-02-15 21:30:53'),(3264,'2005-06-21 04:19:03',1666,340,'2005-06-23 01:29:03',1,'2006-02-15 21:30:53'),(3265,'2005-06-21 04:23:13',3637,437,'2005-06-28 03:37:13',1,'2006-02-15 21:30:53'),(3266,'2005-06-21 04:49:07',2533,175,'2005-06-26 05:19:07',2,'2006-02-15 21:30:53'),(3267,'2005-06-21 04:55:21',1118,134,'2005-06-29 23:46:21',1,'2006-02-15 21:30:53'),(3268,'2005-06-21 04:55:49',4366,329,'2005-06-30 00:23:49',2,'2006-02-15 21:30:53'),(3269,'2005-06-21 05:06:30',3828,17,'2005-06-27 09:26:30',2,'2006-02-15 21:30:53'),(3270,'2005-06-21 05:07:31',1578,86,'2005-06-22 07:45:31',2,'2006-02-15 21:30:53'),(3271,'2005-06-21 05:16:10',4191,196,'2005-06-27 10:46:10',1,'2006-02-15 21:30:53'),(3272,'2005-06-21 05:18:27',1090,550,'2005-06-30 02:51:27',1,'2006-02-15 21:30:53'),(3273,'2005-06-21 05:24:17',3538,104,'2005-06-23 01:21:17',2,'2006-02-15 21:30:53'),(3274,'2005-06-21 05:30:36',2156,277,'2005-06-24 05:12:36',1,'2006-02-15 21:30:53'),(3275,'2005-06-21 05:33:04',2320,368,'2005-06-30 00:37:04',2,'2006-02-15 21:30:53'),(3276,'2005-06-21 05:35:52',1890,425,'2005-06-29 03:26:52',2,'2006-02-15 21:30:53'),(3277,'2005-06-21 05:36:37',1330,229,'2005-06-29 10:54:37',1,'2006-02-15 21:30:53'),(3278,'2005-06-21 05:41:30',2832,554,'2005-06-22 03:43:30',1,'2006-02-15 21:30:53'),(3279,'2005-06-21 06:05:53',1672,462,'2005-06-25 09:40:53',1,'2006-02-15 21:30:53'),(3280,'2005-06-21 06:08:12',661,229,'2005-06-24 09:34:12',1,'2006-02-15 21:30:53'),(3281,'2005-06-21 06:08:47',4006,363,'2005-06-24 11:22:47',1,'2006-02-15 21:30:53'),(3282,'2005-06-21 06:18:42',1676,224,'2005-06-28 09:18:42',1,'2006-02-15 21:30:53'),(3283,'2005-06-21 06:19:07',3988,372,'2005-06-26 10:59:07',2,'2006-02-15 21:30:53'),(3284,'2005-06-21 06:24:45',4566,1,'2005-06-28 03:28:45',1,'2006-02-15 21:30:53'),(3285,'2005-06-21 06:30:13',948,481,'2005-06-23 10:31:13',2,'2006-02-15 21:30:53'),(3286,'2005-06-21 06:31:29',742,577,'2005-06-25 00:46:29',2,'2006-02-15 21:30:53'),(3287,'2005-06-21 06:32:39',4406,62,'2005-06-24 09:29:39',2,'2006-02-15 21:30:53'),(3288,'2005-06-21 06:36:59',1961,299,'2005-06-30 06:50:59',1,'2006-02-15 21:30:53'),(3289,'2005-06-21 06:41:48',2248,115,'2005-06-30 00:54:48',1,'2006-02-15 21:30:53'),(3290,'2005-06-21 06:45:34',2727,293,'2005-06-28 09:44:34',1,'2006-02-15 21:30:53'),(3291,'2005-06-21 06:55:36',3866,274,'2005-06-29 03:41:36',1,'2006-02-15 21:30:53'),(3292,'2005-06-21 06:59:11',3288,412,'2005-06-23 07:11:11',1,'2006-02-15 21:30:53'),(3293,'2005-06-21 06:59:33',4407,481,'2005-06-25 06:54:33',2,'2006-02-15 21:30:53'),(3294,'2005-06-21 07:03:23',2390,439,'2005-06-30 02:22:23',2,'2006-02-15 21:30:53'),(3295,'2005-06-21 07:04:17',1703,573,'2005-06-29 01:52:17',1,'2006-02-15 21:30:53'),(3296,'2005-06-21 07:04:53',2453,284,'2005-06-25 08:36:53',1,'2006-02-15 21:30:53'),(3297,'2005-06-21 07:08:19',3969,193,'2005-06-28 11:53:19',2,'2006-02-15 21:30:53'),(3298,'2005-06-21 07:09:44',444,492,'2005-06-30 11:26:44',2,'2006-02-15 21:30:53'),(3299,'2005-06-21 07:23:34',3427,199,'2005-06-27 04:02:34',1,'2006-02-15 21:30:53'),(3300,'2005-06-21 07:25:01',2505,565,'2005-06-25 01:47:01',1,'2006-02-15 21:30:53'),(3301,'2005-06-21 07:32:25',503,444,'2005-06-28 06:26:25',2,'2006-02-15 21:30:53'),(3302,'2005-06-21 07:33:40',562,594,'2005-06-29 06:02:40',1,'2006-02-15 21:30:53'),(3303,'2005-06-21 07:34:14',1565,361,'2005-06-26 13:18:14',2,'2006-02-15 21:30:53'),(3304,'2005-06-21 07:43:40',2154,431,'2005-06-27 08:06:40',2,'2006-02-15 21:30:53'),(3305,'2005-06-21 07:46:57',2811,578,'2005-06-27 06:16:57',1,'2006-02-15 21:30:53'),(3306,'2005-06-21 07:46:58',1669,406,'2005-06-26 11:22:58',2,'2006-02-15 21:30:53'),(3307,'2005-06-21 07:52:30',462,85,'2005-06-25 02:36:30',2,'2006-02-15 21:30:53'),(3308,'2005-06-21 07:58:36',3129,96,'2005-06-23 05:23:36',2,'2006-02-15 21:30:53'),(3309,'2005-06-21 08:00:49',248,463,'2005-06-29 04:11:49',2,'2006-02-15 21:30:53'),(3310,'2005-06-21 08:04:51',1717,395,'2005-06-22 04:20:51',2,'2006-02-15 21:30:53'),(3311,'2005-06-21 08:05:27',3438,518,'2005-06-22 06:51:27',2,'2006-02-15 21:30:53'),(3312,'2005-06-21 08:05:32',1008,554,'2005-06-27 03:34:32',2,'2006-02-15 21:30:53'),(3313,'2005-06-21 08:11:18',4267,213,'2005-06-23 04:28:18',2,'2006-02-15 21:30:53'),(3314,'2005-06-21 08:17:00',4332,185,'2005-06-22 06:00:00',2,'2006-02-15 21:30:53'),(3315,'2005-06-21 08:17:04',4108,438,'2005-06-24 11:04:04',1,'2006-02-15 21:30:53'),(3316,'2005-06-21 08:20:18',3271,451,'2005-06-28 07:44:18',1,'2006-02-15 21:30:53'),(3317,'2005-06-21 08:22:32',4095,584,'2005-06-26 14:18:32',2,'2006-02-15 21:30:53'),(3318,'2005-06-21 08:23:05',1111,414,'2005-06-27 14:07:05',2,'2006-02-15 21:30:53'),(3319,'2005-06-21 08:25:46',2482,461,'2005-06-27 03:54:46',2,'2006-02-15 21:30:53'),(3320,'2005-06-21 08:29:41',860,47,'2005-06-29 13:54:41',2,'2006-02-15 21:30:53'),(3321,'2005-06-21 08:33:26',1750,144,'2005-06-24 10:09:26',2,'2006-02-15 21:30:53'),(3322,'2005-06-21 08:42:37',4324,458,'2005-06-22 13:17:37',1,'2006-02-15 21:30:53'),(3323,'2005-06-21 08:45:33',2252,272,'2005-06-28 08:17:33',2,'2006-02-15 21:30:53'),(3324,'2005-06-21 08:49:16',2830,29,'2005-06-22 12:31:16',1,'2006-02-15 21:30:53'),(3325,'2005-06-21 08:51:44',1720,185,'2005-06-27 06:16:44',1,'2006-02-15 21:30:53'),(3326,'2005-06-21 09:04:50',1025,347,'2005-06-30 12:10:50',2,'2006-02-15 21:30:53'),(3327,'2005-06-21 09:04:50',3083,62,'2005-06-30 05:45:50',1,'2006-02-15 21:30:53'),(3328,'2005-06-21 09:08:44',2462,292,'2005-06-30 12:28:44',1,'2006-02-15 21:30:53'),(3329,'2005-06-21 09:20:31',3506,335,'2005-06-22 10:00:31',2,'2006-02-15 21:30:53'),(3330,'2005-06-21 09:22:37',299,294,'2005-06-23 07:16:37',2,'2006-02-15 21:30:53'),(3331,'2005-06-21 09:37:53',2913,352,'2005-06-26 04:01:53',2,'2006-02-15 21:30:53'),(3332,'2005-06-21 09:55:12',1975,82,'2005-06-25 08:32:12',2,'2006-02-15 21:30:53'),(3333,'2005-06-21 10:01:36',3688,111,'2005-06-25 10:27:36',2,'2006-02-15 21:30:53'),(3334,'2005-06-21 10:04:33',2491,66,'2005-06-29 06:09:33',2,'2006-02-15 21:30:53'),(3335,'2005-06-21 10:09:08',3033,339,'2005-06-27 11:33:08',1,'2006-02-15 21:30:53'),(3336,'2005-06-21 10:14:27',2122,173,'2005-06-22 09:29:27',1,'2006-02-15 21:30:53'),(3337,'2005-06-21 10:24:35',1176,318,'2005-06-22 13:51:35',1,'2006-02-15 21:30:53'),(3338,'2005-06-21 10:27:31',2097,171,'2005-06-30 14:15:31',2,'2006-02-15 21:30:53'),(3339,'2005-06-21 10:37:11',312,526,'2005-06-30 05:04:11',2,'2006-02-15 21:30:53'),(3340,'2005-06-21 10:37:23',2962,540,'2005-06-26 07:21:23',2,'2006-02-15 21:30:53'),(3341,'2005-06-21 10:37:25',2189,591,'2005-06-26 15:38:25',1,'2006-02-15 21:30:53'),(3342,'2005-06-21 10:46:36',2884,196,'2005-06-23 09:46:36',2,'2006-02-15 21:30:53'),(3343,'2005-06-21 10:56:59',2038,466,'2005-06-25 16:41:59',1,'2006-02-15 21:30:53'),(3344,'2005-06-21 10:57:27',4401,277,'2005-06-28 10:53:27',1,'2006-02-15 21:30:53'),(3345,'2005-06-21 11:05:07',4442,71,'2005-06-26 15:14:07',2,'2006-02-15 21:30:53'),(3346,'2005-06-21 11:06:53',4393,189,'2005-06-22 15:19:53',2,'2006-02-15 21:30:53'),(3347,'2005-06-21 11:08:32',4330,448,'2005-06-28 09:59:32',1,'2006-02-15 21:30:53'),(3348,'2005-06-21 11:16:42',2945,16,'2005-06-27 13:50:42',2,'2006-02-15 21:30:53'),(3349,'2005-06-21 11:17:35',3885,336,'2005-06-22 12:51:35',2,'2006-02-15 21:30:53'),(3350,'2005-06-21 11:21:38',3221,20,'2005-06-28 15:37:38',2,'2006-02-15 21:30:53'),(3351,'2005-06-21 11:21:39',1591,386,'2005-06-23 07:23:39',2,'2006-02-15 21:30:53'),(3352,'2005-06-21 11:26:29',578,510,'2005-06-28 07:26:29',1,'2006-02-15 21:30:53'),(3353,'2005-06-21 11:29:23',3984,236,'2005-06-27 15:06:23',1,'2006-02-15 21:30:53'),(3354,'2005-06-21 11:29:49',1083,529,'2005-06-25 07:39:49',2,'2006-02-15 21:30:53'),(3355,'2005-06-21 11:30:47',1960,275,'2005-06-23 06:04:47',1,'2006-02-15 21:30:53'),(3356,'2005-06-21 11:38:45',4532,403,'2005-06-26 17:18:45',1,'2006-02-15 21:30:53'),(3357,'2005-06-21 11:55:42',2528,57,'2005-06-22 07:19:42',2,'2006-02-15 21:30:53'),(3358,'2005-06-21 11:56:40',1772,69,'2005-06-26 08:28:40',2,'2006-02-15 21:30:53'),(3359,'2005-06-21 12:08:18',3825,67,'2005-06-25 16:35:18',2,'2006-02-15 21:30:53'),(3360,'2005-06-21 12:12:41',2792,498,'2005-06-26 06:32:41',1,'2006-02-15 21:30:53'),(3361,'2005-06-21 12:14:23',2671,268,'2005-06-26 10:01:23',2,'2006-02-15 21:30:53'),(3362,'2005-06-21 12:19:54',1284,454,'2005-06-23 06:59:54',2,'2006-02-15 21:30:53'),(3363,'2005-06-21 12:25:07',538,261,'2005-06-27 11:52:07',2,'2006-02-15 21:30:53'),(3364,'2005-06-21 12:37:46',2329,201,'2005-06-28 07:18:46',2,'2006-02-15 21:30:53'),(3365,'2005-06-21 12:55:48',657,133,'2005-06-23 13:38:48',2,'2006-02-15 21:30:53'),(3366,'2005-06-21 13:03:37',2584,511,'2005-06-26 16:29:37',1,'2006-02-15 21:30:53'),(3367,'2005-06-21 13:08:21',2442,80,'2005-06-26 08:43:21',2,'2006-02-15 21:30:53'),(3368,'2005-06-21 13:18:38',548,438,'2005-06-23 11:13:38',1,'2006-02-15 21:30:53'),(3369,'2005-06-21 13:20:31',303,431,'2005-06-30 13:45:31',2,'2006-02-15 21:30:53'),(3370,'2005-06-21 13:27:01',1573,559,'2005-06-25 09:27:01',1,'2006-02-15 21:30:53'),(3371,'2005-06-21 13:27:22',2526,595,'2005-06-29 14:04:22',2,'2006-02-15 21:30:53'),(3372,'2005-06-21 13:34:19',4169,346,'2005-06-27 08:41:19',2,'2006-02-15 21:30:53'),(3373,'2005-06-21 13:35:32',2219,316,'2005-06-30 12:03:32',1,'2006-02-15 21:30:53'),(3374,'2005-06-21 13:36:30',1067,279,'2005-06-23 15:10:30',2,'2006-02-15 21:30:53'),(3375,'2005-06-21 13:37:18',912,279,'2005-06-22 11:26:18',2,'2006-02-15 21:30:53'),(3376,'2005-06-21 13:43:02',3055,318,'2005-06-28 18:07:02',1,'2006-02-15 21:30:53'),(3377,'2005-06-21 13:51:12',1845,428,'2005-06-22 18:16:12',1,'2006-02-15 21:30:53'),(3378,'2005-06-21 13:51:28',35,387,'2005-06-25 09:21:28',1,'2006-02-15 21:30:53'),(3379,'2005-06-21 13:54:58',2022,566,'2005-06-23 13:43:58',2,'2006-02-15 21:30:53'),(3380,'2005-06-21 13:58:46',3212,483,'2005-06-30 09:29:46',1,'2006-02-15 21:30:53'),(3381,'2005-06-21 14:02:59',1373,183,'2005-06-29 18:11:59',2,'2006-02-15 21:30:53'),(3382,'2005-06-21 14:05:23',131,341,'2005-06-29 19:13:23',2,'2006-02-15 21:30:53'),(3383,'2005-06-21 14:07:19',2968,239,'2005-06-29 17:00:19',2,'2006-02-15 21:30:53'),(3384,'2005-06-21 14:07:35',409,91,'2005-06-26 16:34:35',1,'2006-02-15 21:30:53'),(3385,'2005-06-21 14:16:48',2810,514,'2005-06-24 10:32:48',2,'2006-02-15 21:30:53'),(3386,'2005-06-21 14:21:06',1224,190,'2005-06-24 08:32:06',2,'2006-02-15 21:30:53'),(3387,'2005-06-21 14:21:49',2709,305,'2005-06-24 16:46:49',2,'2006-02-15 21:30:53'),(3388,'2005-06-21 14:34:51',556,119,'2005-06-28 18:19:51',1,'2006-02-15 21:30:53'),(3389,'2005-06-21 14:37:55',727,395,'2005-06-28 18:13:55',1,'2006-02-15 21:30:53'),(3390,'2005-06-21 15:10:50',2034,151,'2005-06-26 12:38:50',1,'2006-02-15 21:30:53'),(3391,'2005-06-21 15:11:02',26,45,'2005-06-25 14:12:02',1,'2006-02-15 21:30:53'),(3392,'2005-06-21 15:12:44',3343,38,'2005-06-29 18:19:44',1,'2006-02-15 21:30:53'),(3393,'2005-06-21 15:14:27',1631,362,'2005-06-25 19:54:27',2,'2006-02-15 21:30:53'),(3394,'2005-06-21 15:17:39',3393,295,'2005-06-30 13:55:39',2,'2006-02-15 21:30:53'),(3395,'2005-06-21 15:19:19',3764,66,'2005-06-29 14:23:19',2,'2006-02-15 21:30:53'),(3396,'2005-06-21 15:23:08',2744,371,'2005-06-23 10:25:08',1,'2006-02-15 21:30:53'),(3397,'2005-06-21 15:30:11',602,552,'2005-06-22 21:12:11',1,'2006-02-15 21:30:53'),(3398,'2005-06-21 15:34:38',221,599,'2005-06-29 11:23:38',1,'2006-02-15 21:30:53'),(3399,'2005-06-21 15:47:48',619,98,'2005-06-26 13:46:48',1,'2006-02-15 21:30:53'),(3400,'2005-06-21 15:50:30',1697,298,'2005-06-25 18:07:30',1,'2006-02-15 21:30:53'),(3401,'2005-06-21 15:52:43',3423,577,'2005-06-30 21:09:43',2,'2006-02-15 21:30:53'),(3402,'2005-06-21 15:54:37',596,187,'2005-06-30 13:43:37',1,'2006-02-15 21:30:53'),(3403,'2005-06-21 15:55:06',1741,264,'2005-06-27 12:34:06',1,'2006-02-15 21:30:53'),(3404,'2005-06-21 15:57:52',2005,424,'2005-06-24 20:58:52',2,'2006-02-15 21:30:53'),(3405,'2005-06-21 15:58:25',2344,155,'2005-06-23 10:58:25',1,'2006-02-15 21:30:53'),(3406,'2005-06-21 16:00:18',2049,203,'2005-06-23 18:25:18',1,'2006-02-15 21:30:53'),(3407,'2005-06-21 16:14:02',3919,343,'2005-06-24 15:38:02',2,'2006-02-15 21:30:53'),(3408,'2005-06-21 16:15:11',3453,282,'2005-06-27 14:55:11',1,'2006-02-15 21:30:53'),(3409,'2005-06-21 16:17:38',3374,429,'2005-06-22 14:16:38',1,'2006-02-15 21:30:53'),(3410,'2005-06-21 16:20:47',1197,321,'2005-06-24 19:09:47',2,'2006-02-15 21:30:53'),(3411,'2005-06-21 16:31:27',4250,12,'2005-06-28 12:27:27',2,'2006-02-15 21:30:53'),(3412,'2005-06-21 16:44:31',3036,501,'2005-06-28 16:15:31',2,'2006-02-15 21:30:53'),(3413,'2005-06-21 16:57:07',666,322,'2005-06-30 12:03:07',2,'2006-02-15 21:30:53'),(3414,'2005-06-21 16:58:50',2929,226,'2005-06-24 17:26:50',1,'2006-02-15 21:30:53'),(3415,'2005-06-21 16:59:49',3540,444,'2005-06-27 17:19:49',1,'2006-02-15 21:30:53'),(3416,'2005-06-21 17:05:29',1215,76,'2005-06-23 17:58:29',2,'2006-02-15 21:30:53'),(3417,'2005-06-21 17:06:20',874,282,'2005-06-23 17:00:20',2,'2006-02-15 21:30:53'),(3418,'2005-06-21 17:06:38',4115,85,'2005-06-25 19:43:38',1,'2006-02-15 21:30:53'),(3419,'2005-06-21 17:18:01',4022,22,'2005-06-22 15:08:01',1,'2006-02-15 21:30:53'),(3420,'2005-06-21 17:22:36',2523,27,'2005-06-28 12:34:36',1,'2006-02-15 21:30:53'),(3421,'2005-06-21 17:22:58',3930,346,'2005-06-24 18:57:58',1,'2006-02-15 21:30:53'),(3422,'2005-06-21 17:24:40',2724,251,'2005-06-29 13:59:40',2,'2006-02-15 21:30:53'),(3423,'2005-06-21 17:38:02',3612,19,'2005-06-23 19:47:02',1,'2006-02-15 21:30:53'),(3424,'2005-06-21 17:42:51',1279,583,'2005-06-24 23:22:51',2,'2006-02-15 21:30:53'),(3425,'2005-06-21 18:07:07',4548,381,'2005-06-27 22:59:07',2,'2006-02-15 21:30:53'),(3426,'2005-06-21 18:12:10',3019,95,'2005-06-23 18:22:10',1,'2006-02-15 21:30:53'),(3427,'2005-06-21 18:31:09',560,561,'2005-06-22 14:18:09',2,'2006-02-15 21:30:53'),(3428,'2005-06-21 18:39:34',1959,40,'2005-06-22 18:23:34',2,'2006-02-15 21:30:53'),(3429,'2005-06-21 18:46:05',456,599,'2005-06-30 17:28:05',1,'2006-02-15 21:30:53'),(3430,'2005-06-21 18:46:08',1613,503,'2005-06-22 13:49:08',2,'2006-02-15 21:30:53'),(3431,'2005-06-21 18:46:48',133,516,'2005-06-26 23:08:48',1,'2006-02-15 21:30:53'),(3432,'2005-06-21 19:02:03',1814,216,'2005-06-25 00:57:03',2,'2006-02-15 21:30:53'),(3433,'2005-06-21 19:07:19',1077,228,'2005-06-29 18:01:19',2,'2006-02-15 21:30:53'),(3434,'2005-06-21 19:08:28',2295,141,'2005-06-23 14:25:28',1,'2006-02-15 21:30:53'),(3435,'2005-06-21 19:14:58',451,591,'2005-06-24 19:58:58',1,'2006-02-15 21:30:53'),(3436,'2005-06-21 19:16:09',2740,137,'2005-06-30 13:58:09',2,'2006-02-15 21:30:53'),(3437,'2005-06-21 19:20:17',1798,211,'2005-07-01 01:09:17',2,'2006-02-15 21:30:53'),(3438,'2005-06-21 19:31:40',1757,556,'2005-06-30 19:08:40',1,'2006-02-15 21:30:53'),(3439,'2005-06-21 19:36:15',1529,46,'2005-06-23 14:54:15',2,'2006-02-15 21:30:53'),(3440,'2005-06-21 19:58:18',853,491,'2005-06-27 22:08:18',1,'2006-02-15 21:30:53'),(3441,'2005-06-21 20:00:12',2863,326,'2005-06-24 00:24:12',2,'2006-02-15 21:30:53'),(3442,'2005-06-21 20:06:51',1896,255,'2005-06-25 17:35:51',2,'2006-02-15 21:30:53'),(3443,'2005-06-21 20:19:00',1639,377,'2005-06-30 15:39:00',1,'2006-02-15 21:30:53'),(3444,'2005-06-21 20:39:39',493,45,'2005-06-25 23:44:39',2,'2006-02-15 21:30:53'),(3445,'2005-06-21 20:40:28',2381,74,'2005-06-29 00:47:28',2,'2006-02-15 21:30:53'),(3446,'2005-06-21 20:45:51',1817,174,'2005-06-26 17:02:51',1,'2006-02-15 21:30:53'),(3447,'2005-06-21 20:53:31',1146,25,'2005-06-24 02:20:31',2,'2006-02-15 21:30:53'),(3448,'2005-06-21 20:59:20',592,476,'2005-06-24 15:40:20',1,'2006-02-15 21:30:53'),(3449,'2005-06-21 21:01:27',210,181,'2005-06-27 21:20:27',1,'2006-02-15 21:30:53'),(3450,'2005-06-21 21:01:57',2268,126,'2005-06-25 23:57:57',1,'2006-02-15 21:30:53'),(3451,'2005-06-21 21:10:39',3489,558,'2005-06-30 19:03:39',2,'2006-02-15 21:30:53'),(3452,'2005-06-21 21:11:27',2646,293,'2005-06-24 16:31:27',1,'2006-02-15 21:30:53'),(3453,'2005-06-21 21:12:11',842,278,'2005-06-23 17:39:11',2,'2006-02-15 21:30:53'),(3454,'2005-06-21 21:12:13',3009,524,'2005-06-25 23:23:13',1,'2006-02-15 21:30:53'),(3455,'2005-06-21 21:17:51',4403,340,'2005-06-23 17:22:51',1,'2006-02-15 21:30:53'),(3456,'2005-06-21 21:19:47',1119,150,'2005-06-28 18:18:47',2,'2006-02-15 21:30:53'),(3457,'2005-06-21 21:42:33',883,312,'2005-06-30 19:54:33',2,'2006-02-15 21:30:53'),(3458,'2005-06-21 21:42:49',2136,338,'2005-06-29 01:26:49',1,'2006-02-15 21:30:53'),(3459,'2005-06-21 21:45:47',3080,97,'2005-06-25 00:46:47',1,'2006-02-15 21:30:53'),(3460,'2005-06-21 21:46:56',1765,236,'2005-06-29 20:08:56',1,'2006-02-15 21:30:53'),(3461,'2005-06-21 21:49:18',1715,23,'2005-06-26 19:51:18',1,'2006-02-15 21:30:53'),(3462,'2005-06-21 21:52:52',547,568,'2005-06-28 21:41:52',1,'2006-02-15 21:30:53'),(3463,'2005-06-21 22:00:00',3436,96,'2005-06-22 19:22:00',2,'2006-02-15 21:30:53'),(3464,'2005-06-21 22:08:58',2698,251,'2005-06-26 16:23:58',2,'2006-02-15 21:30:53'),(3465,'2005-06-21 22:10:01',1488,510,'2005-06-30 21:35:01',1,'2006-02-15 21:30:53'),(3466,'2005-06-21 22:13:33',371,226,'2005-06-25 21:01:33',2,'2006-02-15 21:30:53'),(3467,'2005-06-21 22:19:25',729,543,'2005-06-27 00:03:25',2,'2006-02-15 21:30:53'),(3468,'2005-06-21 22:43:45',2899,100,'2005-06-30 01:49:45',1,'2006-02-15 21:30:53'),(3469,'2005-06-21 22:48:59',4087,181,'2005-06-28 19:32:59',1,'2006-02-15 21:30:53'),(3470,'2005-07-05 22:49:24',883,565,'2005-07-07 19:36:24',1,'2006-02-15 21:30:53'),(3471,'2005-07-05 22:51:44',1724,242,'2005-07-13 01:38:44',2,'2006-02-15 21:30:53'),(3472,'2005-07-05 22:56:33',841,37,'2005-07-13 17:18:33',2,'2006-02-15 21:30:53'),(3473,'2005-07-05 22:57:34',2735,60,'2005-07-12 23:53:34',1,'2006-02-15 21:30:53'),(3474,'2005-07-05 22:59:53',97,594,'2005-07-08 20:32:53',1,'2006-02-15 21:30:53'),(3475,'2005-07-05 23:01:21',2189,8,'2005-07-13 23:07:21',2,'2006-02-15 21:30:53'),(3476,'2005-07-05 23:02:37',3011,490,'2005-07-10 22:17:37',2,'2006-02-15 21:30:53'),(3477,'2005-07-05 23:05:17',4289,476,'2005-07-15 02:20:17',2,'2006-02-15 21:30:53'),(3478,'2005-07-05 23:05:44',2528,322,'2005-07-07 00:14:44',2,'2006-02-15 21:30:53'),(3479,'2005-07-05 23:08:53',2277,298,'2005-07-11 21:42:53',1,'2006-02-15 21:30:53'),(3480,'2005-07-05 23:11:43',1488,382,'2005-07-12 02:01:43',2,'2006-02-15 21:30:53'),(3481,'2005-07-05 23:13:07',3575,138,'2005-07-07 20:36:07',2,'2006-02-15 21:30:53'),(3482,'2005-07-05 23:13:22',1291,520,'2005-07-12 19:02:22',2,'2006-02-15 21:30:53'),(3483,'2005-07-05 23:13:51',79,536,'2005-07-13 18:31:51',1,'2006-02-15 21:30:53'),(3484,'2005-07-05 23:23:11',1934,114,'2005-07-11 00:27:11',2,'2006-02-15 21:30:53'),(3485,'2005-07-05 23:25:54',117,111,'2005-07-09 17:38:54',1,'2006-02-15 21:30:53'),(3486,'2005-07-05 23:29:55',4067,296,'2005-07-13 19:54:55',1,'2006-02-15 21:30:53'),(3487,'2005-07-05 23:30:36',1575,586,'2005-07-11 04:00:36',1,'2006-02-15 21:30:53'),(3488,'2005-07-05 23:32:49',898,349,'2005-07-15 02:01:49',2,'2006-02-15 21:30:53'),(3489,'2005-07-05 23:33:40',2936,397,'2005-07-15 02:15:40',2,'2006-02-15 21:30:53'),(3490,'2005-07-05 23:37:13',3041,369,'2005-07-12 22:07:13',1,'2006-02-15 21:30:53'),(3491,'2005-07-05 23:41:08',1835,421,'2005-07-13 21:53:08',1,'2006-02-15 21:30:53'),(3492,'2005-07-05 23:44:37',980,142,'2005-07-14 03:54:37',1,'2006-02-15 21:30:53'),(3493,'2005-07-05 23:46:19',473,169,'2005-07-15 02:31:19',1,'2006-02-15 21:30:53'),(3494,'2005-07-05 23:47:30',3149,348,'2005-07-11 18:10:30',1,'2006-02-15 21:30:53'),(3495,'2005-07-05 23:50:04',2306,553,'2005-07-10 01:06:04',1,'2006-02-15 21:30:53'),(3496,'2005-07-05 23:59:15',2430,295,'2005-07-09 19:39:15',2,'2006-02-15 21:30:53'),(3497,'2005-07-06 00:00:03',1970,299,'2005-07-09 01:27:03',1,'2006-02-15 21:30:53'),(3498,'2005-07-06 00:02:08',1869,444,'2005-07-10 00:19:08',1,'2006-02-15 21:30:53'),(3499,'2005-07-06 00:04:20',1850,520,'2005-07-14 21:12:20',2,'2006-02-15 21:30:53'),(3500,'2005-07-06 00:11:13',2447,32,'2005-07-13 19:01:13',2,'2006-02-15 21:30:53'),(3501,'2005-07-06 00:11:28',2219,270,'2005-07-10 20:32:28',2,'2006-02-15 21:30:53'),(3502,'2005-07-06 00:15:06',1026,126,'2005-07-13 01:35:06',1,'2006-02-15 21:30:53'),(3503,'2005-07-06 00:17:24',2944,449,'2005-07-08 03:47:24',1,'2006-02-15 21:30:53'),(3504,'2005-07-06 00:18:29',268,209,'2005-07-10 00:24:29',2,'2006-02-15 21:30:53'),(3505,'2005-07-06 00:19:32',2630,331,'2005-07-14 20:14:32',2,'2006-02-15 21:30:53'),(3506,'2005-07-06 00:22:29',19,459,'2005-07-07 22:15:29',1,'2006-02-15 21:30:53'),(3507,'2005-07-06 00:23:43',166,480,'2005-07-15 04:19:43',1,'2006-02-15 21:30:53'),(3508,'2005-07-06 00:24:25',2381,34,'2005-07-10 05:38:25',2,'2006-02-15 21:30:53'),(3509,'2005-07-06 00:24:57',4394,182,'2005-07-09 18:48:57',2,'2006-02-15 21:30:53'),(3510,'2005-07-06 00:27:41',2250,443,'2005-07-14 23:20:41',2,'2006-02-15 21:30:53'),(3511,'2005-07-06 00:42:01',2128,494,'2005-07-09 23:08:01',1,'2006-02-15 21:30:53'),(3512,'2005-07-06 00:43:06',371,291,'2005-07-12 06:18:06',2,'2006-02-15 21:30:53'),(3513,'2005-07-06 00:45:57',4225,223,'2005-07-11 19:04:57',2,'2006-02-15 21:30:53'),(3514,'2005-07-06 00:46:54',4546,536,'2005-07-09 05:47:54',1,'2006-02-15 21:30:53'),(3515,'2005-07-06 00:48:55',3220,131,'2005-07-09 00:15:55',1,'2006-02-15 21:30:53'),(3516,'2005-07-06 00:50:30',385,338,'2005-07-09 19:12:30',2,'2006-02-15 21:30:53'),(3517,'2005-07-06 00:52:35',2762,314,'2005-07-08 20:10:35',2,'2006-02-15 21:30:53'),(3518,'2005-07-06 00:56:03',2502,167,'2005-07-14 02:27:03',1,'2006-02-15 21:30:53'),(3519,'2005-07-06 00:57:29',4314,320,'2005-07-10 21:12:29',2,'2006-02-15 21:30:53'),(3520,'2005-07-06 00:58:27',2872,102,'2005-07-14 05:56:27',1,'2006-02-15 21:30:53'),(3521,'2005-07-06 01:00:11',1440,262,'2005-07-11 19:15:11',2,'2006-02-15 21:30:53'),(3522,'2005-07-06 01:00:21',4522,469,'2005-07-11 01:18:21',1,'2006-02-15 21:30:53'),(3523,'2005-07-06 01:01:38',2171,549,'2005-07-10 20:24:38',2,'2006-02-15 21:30:53'),(3524,'2005-07-06 01:01:51',1626,88,'2005-07-11 19:52:51',2,'2006-02-15 21:30:53'),(3525,'2005-07-06 01:02:39',208,51,'2005-07-14 02:27:39',1,'2006-02-15 21:30:53'),(3526,'2005-07-06 01:03:29',3871,469,'2005-07-15 01:22:29',2,'2006-02-15 21:30:53'),(3527,'2005-07-06 01:11:08',4537,389,'2005-07-08 01:21:08',1,'2006-02-15 21:30:53'),(3528,'2005-07-06 01:13:27',1954,201,'2005-07-06 23:45:27',2,'2006-02-15 21:30:53'),(3529,'2005-07-06 01:15:26',4316,350,'2005-07-07 04:28:26',1,'2006-02-15 21:30:53'),(3530,'2005-07-06 01:22:45',4542,168,'2005-07-10 03:23:45',1,'2006-02-15 21:30:53'),(3531,'2005-07-06 01:24:08',1890,165,'2005-07-11 22:00:08',2,'2006-02-15 21:30:53'),(3532,'2005-07-06 01:24:38',2635,274,'2005-07-11 06:42:38',2,'2006-02-15 21:30:53'),(3533,'2005-07-06 01:26:44',2028,206,'2005-07-14 21:37:44',1,'2006-02-15 21:30:53'),(3534,'2005-07-06 01:32:27',2055,283,'2005-07-08 23:14:27',1,'2006-02-15 21:30:53'),(3535,'2005-07-06 01:32:46',4214,65,'2005-07-11 03:15:46',1,'2006-02-15 21:30:53'),(3536,'2005-07-06 01:36:11',2328,339,'2005-07-12 20:00:11',2,'2006-02-15 21:30:53'),(3537,'2005-07-06 01:36:53',4220,479,'2005-07-13 07:01:53',2,'2006-02-15 21:30:53'),(3538,'2005-07-06 01:37:07',4361,228,'2005-07-11 06:02:07',2,'2006-02-15 21:30:53'),(3539,'2005-07-06 01:39:08',4081,444,'2005-07-07 05:38:08',1,'2006-02-15 21:30:53'),(3540,'2005-07-06 01:47:20',1295,97,'2005-07-08 23:48:20',2,'2006-02-15 21:30:53'),(3541,'2005-07-06 01:50:11',1204,501,'2005-07-12 03:24:11',1,'2006-02-15 21:30:53'),(3542,'2005-07-06 01:51:42',4391,593,'2005-07-11 03:29:42',1,'2006-02-15 21:30:53'),(3543,'2005-07-06 02:01:08',3997,394,'2005-07-07 03:14:08',1,'2006-02-15 21:30:53'),(3544,'2005-07-06 02:06:32',3098,115,'2005-07-09 04:35:32',2,'2006-02-15 21:30:53'),(3545,'2005-07-06 02:16:17',3924,442,'2005-07-11 00:54:17',1,'2006-02-15 21:30:53'),(3546,'2005-07-06 02:17:54',959,594,'2005-07-07 00:19:54',1,'2006-02-15 21:30:53'),(3547,'2005-07-06 02:18:06',2730,239,'2005-07-08 05:24:06',1,'2006-02-15 21:30:53'),(3548,'2005-07-06 02:23:39',4498,16,'2005-07-08 07:53:39',2,'2006-02-15 21:30:53'),(3549,'2005-07-06 02:24:55',3921,19,'2005-07-06 21:40:55',2,'2006-02-15 21:30:53'),(3550,'2005-07-06 02:29:21',2417,15,'2005-07-13 05:26:21',2,'2006-02-15 21:30:53'),(3551,'2005-07-06 02:33:48',3602,111,'2005-07-13 04:38:48',1,'2006-02-15 21:30:53'),(3552,'2005-07-06 02:34:09',1099,239,'2005-07-12 05:31:09',1,'2006-02-15 21:30:53'),(3553,'2005-07-06 02:35:41',4510,422,'2005-07-08 06:38:41',2,'2006-02-15 21:30:53'),(3554,'2005-07-06 02:37:10',793,538,'2005-07-09 01:58:10',1,'2006-02-15 21:30:53'),(3555,'2005-07-06 02:45:35',869,537,'2005-07-10 07:17:35',1,'2006-02-15 21:30:53'),(3556,'2005-07-06 02:46:13',3142,273,'2005-07-06 22:08:13',1,'2006-02-15 21:30:53'),(3557,'2005-07-06 02:48:39',3832,292,'2005-07-08 22:52:39',2,'2006-02-15 21:30:53'),(3558,'2005-07-06 02:49:06',1742,575,'2005-07-15 01:38:06',2,'2006-02-15 21:30:53'),(3559,'2005-07-06 02:49:42',2211,483,'2005-07-12 04:44:42',1,'2006-02-15 21:30:53'),(3560,'2005-07-06 02:51:37',888,592,'2005-07-10 01:35:37',2,'2006-02-15 21:30:53'),(3561,'2005-07-06 02:54:33',213,231,'2005-07-14 07:44:33',2,'2006-02-15 21:30:53'),(3562,'2005-07-06 02:54:36',1660,587,'2005-07-11 05:48:36',1,'2006-02-15 21:30:53'),(3563,'2005-07-06 02:57:01',4261,210,'2005-07-14 02:25:01',2,'2006-02-15 21:30:53'),(3564,'2005-07-06 03:02:13',1096,402,'2005-07-13 01:41:13',2,'2006-02-15 21:30:53'),(3565,'2005-07-06 03:02:58',599,97,'2005-07-13 21:31:58',2,'2006-02-15 21:30:53'),(3566,'2005-07-06 03:08:51',2774,392,'2005-07-12 05:04:51',1,'2006-02-15 21:30:53'),(3567,'2005-07-06 03:09:36',27,355,'2005-07-12 02:15:36',1,'2006-02-15 21:30:53'),(3568,'2005-07-06 03:11:57',2084,283,'2005-07-15 03:14:57',1,'2006-02-15 21:30:53'),(3569,'2005-07-06 03:17:23',1929,496,'2005-07-14 03:58:23',1,'2006-02-15 21:30:53'),(3570,'2005-07-06 03:23:43',1300,450,'2005-07-14 07:28:43',2,'2006-02-15 21:30:53'),(3571,'2005-07-06 03:32:31',4166,580,'2005-07-11 06:15:31',1,'2006-02-15 21:30:53'),(3572,'2005-07-06 03:33:23',1915,284,'2005-07-08 07:54:23',1,'2006-02-15 21:30:53'),(3573,'2005-07-06 03:33:48',146,66,'2005-07-07 22:39:48',1,'2006-02-15 21:30:53'),(3574,'2005-07-06 03:36:01',2799,225,'2005-07-10 01:29:01',2,'2006-02-15 21:30:53'),(3575,'2005-07-06 03:36:19',3234,49,'2005-07-08 06:21:19',1,'2006-02-15 21:30:53'),(3576,'2005-07-06 03:40:01',324,227,'2005-07-15 07:22:01',1,'2006-02-15 21:30:53'),(3577,'2005-07-06 03:40:36',4390,152,'2005-07-10 05:54:36',2,'2006-02-15 21:30:53'),(3578,'2005-07-06 03:47:05',2954,263,'2005-07-08 02:26:05',1,'2006-02-15 21:30:53'),(3579,'2005-07-06 03:47:47',3309,485,'2005-07-08 02:16:47',2,'2006-02-15 21:30:53'),(3580,'2005-07-06 03:48:44',3837,200,'2005-07-13 01:15:44',2,'2006-02-15 21:30:53'),(3581,'2005-07-06 03:57:35',4520,235,'2005-07-07 08:07:35',2,'2006-02-15 21:30:53'),(3582,'2005-07-06 04:10:35',1866,297,'2005-07-11 01:29:35',2,'2006-02-15 21:30:53'),(3583,'2005-07-06 04:10:43',204,574,'2005-07-14 22:17:43',2,'2006-02-15 21:30:53'),(3584,'2005-07-06 04:16:43',367,207,'2005-07-13 07:08:43',1,'2006-02-15 21:30:53'),(3585,'2005-07-06 04:22:36',2726,266,'2005-07-09 06:16:36',2,'2006-02-15 21:30:53'),(3586,'2005-07-06 04:24:42',616,493,'2005-07-09 02:37:42',1,'2006-02-15 21:30:53'),(3587,'2005-07-06 04:27:52',462,110,'2005-07-13 08:19:52',1,'2006-02-15 21:30:53'),(3588,'2005-07-06 04:29:13',3154,289,'2005-07-07 23:49:13',1,'2006-02-15 21:30:53'),(3589,'2005-07-06 04:30:18',3740,137,'2005-07-10 09:18:18',1,'2006-02-15 21:30:53'),(3590,'2005-07-06 04:35:12',1510,283,'2005-07-10 05:14:12',2,'2006-02-15 21:30:53'),(3591,'2005-07-06 04:37:10',1241,53,'2005-07-09 23:32:10',1,'2006-02-15 21:30:53'),(3592,'2005-07-06 04:38:50',1272,286,'2005-07-15 06:36:50',2,'2006-02-15 21:30:53'),(3593,'2005-07-06 04:39:52',619,78,'2005-07-11 23:20:52',2,'2006-02-15 21:30:53'),(3594,'2005-07-06 04:42:47',4566,522,'2005-07-10 00:49:47',1,'2006-02-15 21:30:53'),(3595,'2005-07-06 04:59:49',1431,92,'2005-07-15 06:26:49',2,'2006-02-15 21:30:53'),(3596,'2005-07-06 05:03:11',594,419,'2005-07-07 05:30:11',2,'2006-02-15 21:30:53'),(3597,'2005-07-06 05:03:59',4080,35,'2005-07-13 06:49:59',2,'2006-02-15 21:30:53'),(3598,'2005-07-06 05:11:04',1317,68,'2005-07-09 02:03:04',2,'2006-02-15 21:30:53'),(3599,'2005-07-06 05:16:36',3262,577,'2005-07-13 07:14:36',2,'2006-02-15 21:30:53'),(3600,'2005-07-06 05:19:42',2748,511,'2005-07-11 00:34:42',2,'2006-02-15 21:30:53'),(3601,'2005-07-06 05:20:25',2806,205,'2005-07-15 03:13:25',1,'2006-02-15 21:30:53'),(3602,'2005-07-06 05:23:10',2192,100,'2005-07-15 03:22:10',2,'2006-02-15 21:30:53'),(3603,'2005-07-06 05:25:03',2442,330,'2005-07-12 08:14:03',1,'2006-02-15 21:30:53'),(3604,'2005-07-06 05:25:22',1380,242,'2005-07-07 23:52:22',1,'2006-02-15 21:30:53'),(3605,'2005-07-06 05:27:15',384,347,'2005-07-10 00:05:15',2,'2006-02-15 21:30:53'),(3606,'2005-07-06 05:28:02',1737,166,'2005-07-10 04:51:02',1,'2006-02-15 21:30:53'),(3607,'2005-07-06 05:30:09',542,335,'2005-07-08 01:36:09',2,'2006-02-15 21:30:53'),(3608,'2005-07-06 05:35:39',3095,368,'2005-07-10 07:46:39',2,'2006-02-15 21:30:53'),(3609,'2005-07-06 05:36:22',1064,373,'2005-07-10 05:55:22',1,'2006-02-15 21:30:53'),(3610,'2005-07-06 05:36:59',1509,348,'2005-07-13 07:07:59',1,'2006-02-15 21:30:53'),(3611,'2005-07-06 05:37:18',4502,86,'2005-07-10 05:14:18',1,'2006-02-15 21:30:53'),(3612,'2005-07-06 05:37:26',2465,402,'2005-07-14 01:51:26',1,'2006-02-15 21:30:53'),(3613,'2005-07-06 05:45:53',3776,331,'2005-07-07 10:02:53',1,'2006-02-15 21:30:53'),(3614,'2005-07-06 05:46:05',853,502,'2005-07-11 01:24:05',2,'2006-02-15 21:30:53'),(3615,'2005-07-06 05:47:47',711,49,'2005-07-11 05:01:47',1,'2006-02-15 21:30:53'),(3616,'2005-07-06 05:52:13',557,571,'2005-07-10 10:24:13',1,'2006-02-15 21:30:53'),(3617,'2005-07-06 05:58:06',1337,125,'2005-07-13 02:10:06',1,'2006-02-15 21:30:53'),(3618,'2005-07-06 05:58:45',330,264,'2005-07-15 09:13:45',2,'2006-02-15 21:30:53'),(3619,'2005-07-06 05:59:44',3350,526,'2005-07-11 08:58:44',2,'2006-02-15 21:30:53'),(3620,'2005-07-06 06:01:50',1661,88,'2005-07-08 05:04:50',1,'2006-02-15 21:30:53'),(3621,'2005-07-06 06:03:55',3132,171,'2005-07-11 09:25:55',2,'2006-02-15 21:30:53'),(3622,'2005-07-06 06:05:04',3489,454,'2005-07-12 03:14:04',2,'2006-02-15 21:30:53'),(3623,'2005-07-06 06:05:23',430,80,'2005-07-07 05:59:23',1,'2006-02-15 21:30:53'),(3624,'2005-07-06 06:06:27',1778,115,'2005-07-13 08:30:27',2,'2006-02-15 21:30:53'),(3625,'2005-07-06 06:12:52',1133,175,'2005-07-12 07:37:52',1,'2006-02-15 21:30:53'),(3626,'2005-07-06 06:15:35',1599,337,'2005-07-10 10:18:35',2,'2006-02-15 21:30:53'),(3627,'2005-07-06 06:19:25',1087,322,'2005-07-11 05:53:25',1,'2006-02-15 21:30:53'),(3628,'2005-07-06 06:19:43',3509,588,'2005-07-07 02:23:43',1,'2006-02-15 21:30:53'),(3629,'2005-07-06 06:23:22',4019,441,'2005-07-08 09:32:22',2,'2006-02-15 21:30:53'),(3630,'2005-07-06 06:27:15',2448,102,'2005-07-12 10:36:15',1,'2006-02-15 21:30:53'),(3631,'2005-07-06 06:36:53',4068,47,'2005-07-07 10:32:53',1,'2006-02-15 21:30:53'),(3632,'2005-07-06 06:38:21',2583,366,'2005-07-11 03:19:21',1,'2006-02-15 21:30:53'),(3633,'2005-07-06 06:43:26',2978,95,'2005-07-10 04:54:26',1,'2006-02-15 21:30:53'),(3634,'2005-07-06 06:51:14',3688,245,'2005-07-10 02:30:14',1,'2006-02-15 21:30:53'),(3635,'2005-07-06 06:55:36',421,250,'2005-07-09 07:57:36',2,'2006-02-15 21:30:53'),(3636,'2005-07-06 07:03:52',3379,591,'2005-07-08 03:14:52',2,'2006-02-15 21:30:53'),(3637,'2005-07-06 07:06:31',3823,380,'2005-07-10 02:11:31',2,'2006-02-15 21:30:53'),(3638,'2005-07-06 07:08:17',190,452,'2005-07-13 12:30:17',1,'2006-02-15 21:30:53'),(3639,'2005-07-06 07:09:17',2812,7,'2005-07-15 05:12:17',2,'2006-02-15 21:30:53'),(3640,'2005-07-06 07:12:26',3432,271,'2005-07-10 04:54:26',2,'2006-02-15 21:30:53'),(3641,'2005-07-06 07:17:09',3834,79,'2005-07-11 07:25:09',1,'2006-02-15 21:30:53'),(3642,'2005-07-06 07:18:20',4204,166,'2005-07-09 01:37:20',1,'2006-02-15 21:30:53'),(3643,'2005-07-06 07:20:08',845,176,'2005-07-11 07:01:08',1,'2006-02-15 21:30:53'),(3644,'2005-07-06 07:20:11',4309,403,'2005-07-11 10:26:11',2,'2006-02-15 21:30:53'),(3645,'2005-07-06 07:22:09',3390,236,'2005-07-10 11:45:09',1,'2006-02-15 21:30:53'),(3646,'2005-07-06 07:28:59',3591,322,'2005-07-11 05:19:59',1,'2006-02-15 21:30:53'),(3647,'2005-07-06 07:29:17',3762,145,'2005-07-13 08:32:17',1,'2006-02-15 21:30:53'),(3648,'2005-07-06 07:30:41',2810,598,'2005-07-10 06:00:41',2,'2006-02-15 21:30:53'),(3649,'2005-07-06 07:32:42',3564,24,'2005-07-12 09:37:42',1,'2006-02-15 21:30:53'),(3650,'2005-07-06 07:34:15',3606,482,'2005-07-08 01:50:15',2,'2006-02-15 21:30:53'),(3651,'2005-07-06 07:40:31',3323,170,'2005-07-08 03:39:31',2,'2006-02-15 21:30:53'),(3652,'2005-07-06 07:44:30',1231,518,'2005-07-08 04:41:30',1,'2006-02-15 21:30:53'),(3653,'2005-07-06 07:45:13',2513,148,'2005-07-10 11:51:13',2,'2006-02-15 21:30:53'),(3654,'2005-07-06 07:45:31',1621,528,'2005-07-12 09:59:31',2,'2006-02-15 21:30:53'),(3655,'2005-07-06 07:52:54',1540,493,'2005-07-15 10:49:54',2,'2006-02-15 21:30:53'),(3656,'2005-07-06 07:55:22',4544,314,'2005-07-13 10:36:22',2,'2006-02-15 21:30:53'),(3657,'2005-07-06 07:55:30',4134,113,'2005-07-11 07:18:30',1,'2006-02-15 21:30:53'),(3658,'2005-07-06 08:01:08',3453,253,'2005-07-15 06:36:08',1,'2006-02-15 21:30:53'),(3659,'2005-07-06 08:03:14',2271,330,'2005-07-12 09:50:14',1,'2006-02-15 21:30:53'),(3660,'2005-07-06 08:07:29',1129,507,'2005-07-14 08:46:29',1,'2006-02-15 21:30:53'),(3661,'2005-07-06 08:10:02',2600,442,'2005-07-10 10:17:02',1,'2006-02-15 21:30:53'),(3662,'2005-07-06 08:11:48',3827,334,'2005-07-09 12:25:48',2,'2006-02-15 21:30:53'),(3663,'2005-07-06 08:15:47',2646,566,'2005-07-07 08:57:47',1,'2006-02-15 21:30:53'),(3664,'2005-07-06 08:15:57',3366,528,'2005-07-08 06:11:57',1,'2006-02-15 21:30:53'),(3665,'2005-07-06 08:23:08',922,102,'2005-07-13 13:38:08',2,'2006-02-15 21:30:53'),(3666,'2005-07-06 08:27:43',4212,347,'2005-07-09 07:37:43',2,'2006-02-15 21:30:53'),(3667,'2005-07-06 08:36:34',447,373,'2005-07-15 04:25:34',2,'2006-02-15 21:30:53'),(3668,'2005-07-06 08:36:48',269,514,'2005-07-10 11:31:48',1,'2006-02-15 21:30:53'),(3669,'2005-07-06 08:38:29',1299,530,'2005-07-10 05:28:29',1,'2006-02-15 21:30:53'),(3670,'2005-07-06 08:56:43',4271,268,'2005-07-11 09:11:43',1,'2006-02-15 21:30:53'),(3671,'2005-07-06 09:01:29',2821,179,'2005-07-15 08:08:29',1,'2006-02-15 21:30:53'),(3672,'2005-07-06 09:01:56',3883,283,'2005-07-11 14:18:56',1,'2006-02-15 21:30:53'),(3673,'2005-07-06 09:02:09',1837,88,'2005-07-15 06:45:09',2,'2006-02-15 21:30:53'),(3674,'2005-07-06 09:03:13',3686,559,'2005-07-13 08:43:13',1,'2006-02-15 21:30:53'),(3675,'2005-07-06 09:09:19',3662,282,'2005-07-12 08:51:19',1,'2006-02-15 21:30:53'),(3676,'2005-07-06 09:10:37',1967,137,'2005-07-14 08:24:37',1,'2006-02-15 21:30:53'),(3677,'2005-07-06 09:11:58',600,5,'2005-07-08 10:50:58',2,'2006-02-15 21:30:53'),(3678,'2005-07-06 09:15:15',3861,364,'2005-07-10 05:01:15',1,'2006-02-15 21:30:53'),(3679,'2005-07-06 09:15:57',2186,547,'2005-07-08 03:20:57',1,'2006-02-15 21:30:53'),(3680,'2005-07-06 09:16:10',2427,82,'2005-07-08 07:52:10',2,'2006-02-15 21:30:53'),(3681,'2005-07-06 09:19:30',3325,294,'2005-07-11 09:40:30',1,'2006-02-15 21:30:53'),(3682,'2005-07-06 09:22:48',2597,98,'2005-07-14 11:17:48',2,'2006-02-15 21:30:53'),(3683,'2005-07-06 09:25:56',3020,43,'2005-07-14 12:10:56',1,'2006-02-15 21:30:53'),(3684,'2005-07-06 09:29:22',3261,395,'2005-07-12 08:19:22',1,'2006-02-15 21:30:53'),(3685,'2005-07-06 09:30:45',2015,58,'2005-07-11 15:16:45',2,'2006-02-15 21:30:53'),(3686,'2005-07-06 09:37:50',376,548,'2005-07-09 10:15:50',2,'2006-02-15 21:30:53'),(3687,'2005-07-06 09:38:33',2040,207,'2005-07-14 07:50:33',1,'2006-02-15 21:30:53'),(3688,'2005-07-06 09:41:53',1102,380,'2005-07-14 10:30:53',2,'2006-02-15 21:30:53'),(3689,'2005-07-06 09:43:01',3168,129,'2005-07-11 09:57:01',1,'2006-02-15 21:30:53'),(3690,'2005-07-06 09:46:03',4405,435,'2005-07-07 12:12:03',1,'2006-02-15 21:30:53'),(3691,'2005-07-06 09:46:12',1937,478,'2005-07-07 14:08:12',1,'2006-02-15 21:30:53'),(3692,'2005-07-06 09:54:12',1237,286,'2005-07-11 09:42:12',2,'2006-02-15 21:30:53'),(3693,'2005-07-06 09:56:09',2989,545,'2005-07-15 06:50:09',2,'2006-02-15 21:30:53'),(3694,'2005-07-06 10:01:23',3848,419,'2005-07-08 11:44:23',2,'2006-02-15 21:30:53'),(3695,'2005-07-06 10:02:08',2823,441,'2005-07-09 15:43:08',1,'2006-02-15 21:30:53'),(3696,'2005-07-06 10:04:55',3244,497,'2005-07-11 15:58:55',2,'2006-02-15 21:30:53'),(3697,'2005-07-06 10:07:22',1223,182,'2005-07-13 14:04:22',2,'2006-02-15 21:30:53'),(3698,'2005-07-06 10:09:20',1263,461,'2005-07-08 15:49:20',1,'2006-02-15 21:30:53'),(3699,'2005-07-06 10:11:25',418,262,'2005-07-14 05:18:25',1,'2006-02-15 21:30:53'),(3700,'2005-07-06 10:12:19',343,72,'2005-07-07 14:21:19',2,'2006-02-15 21:30:53'),(3701,'2005-07-06 10:12:45',3679,31,'2005-07-09 08:52:45',1,'2006-02-15 21:30:53'),(3702,'2005-07-06 10:13:56',2204,428,'2005-07-10 08:12:56',1,'2006-02-15 21:30:53'),(3703,'2005-07-06 10:15:26',4276,421,'2005-07-13 13:00:26',1,'2006-02-15 21:30:53'),(3704,'2005-07-06 10:16:45',2687,323,'2005-07-13 12:44:45',2,'2006-02-15 21:30:53'),(3705,'2005-07-06 10:17:59',65,223,'2005-07-10 15:31:59',1,'2006-02-15 21:30:53'),(3706,'2005-07-06 10:18:01',681,132,'2005-07-09 09:07:01',2,'2006-02-15 21:30:53'),(3707,'2005-07-06 10:21:49',1080,14,'2005-07-12 05:14:49',2,'2006-02-15 21:30:53'),(3708,'2005-07-06 10:23:27',2105,201,'2005-07-14 09:26:27',1,'2006-02-15 21:30:53'),(3709,'2005-07-06 10:26:56',4033,187,'2005-07-15 13:51:56',2,'2006-02-15 21:30:53'),(3710,'2005-07-06 10:28:53',2596,228,'2005-07-15 06:17:53',2,'2006-02-15 21:30:53'),(3711,'2005-07-06 10:46:15',1914,75,'2005-07-07 09:25:15',2,'2006-02-15 21:30:53'),(3712,'2005-07-06 10:47:35',3741,504,'2005-07-15 09:39:35',1,'2006-02-15 21:30:53'),(3713,'2005-07-06 10:49:30',1823,504,'2005-07-13 10:44:30',1,'2006-02-15 21:30:53'),(3714,'2005-07-06 10:51:28',1985,276,'2005-07-09 13:57:28',2,'2006-02-15 21:30:53'),(3715,'2005-07-06 10:51:48',4456,228,'2005-07-11 06:08:48',1,'2006-02-15 21:30:53'),(3716,'2005-07-06 10:52:32',3271,92,'2005-07-14 08:45:32',2,'2006-02-15 21:30:53'),(3717,'2005-07-06 10:53:34',1677,173,'2005-07-07 13:43:34',2,'2006-02-15 21:30:53'),(3718,'2005-07-06 10:57:56',2624,56,'2005-07-12 12:54:56',1,'2006-02-15 21:30:53'),(3719,'2005-07-06 11:05:55',3573,376,'2005-07-11 08:10:55',2,'2006-02-15 21:30:53'),(3720,'2005-07-06 11:06:57',2958,96,'2005-07-09 14:16:57',1,'2006-02-15 21:30:53'),(3721,'2005-07-06 11:10:09',2654,226,'2005-07-11 07:45:09',2,'2006-02-15 21:30:53'),(3722,'2005-07-06 11:10:27',604,83,'2005-07-13 12:56:27',2,'2006-02-15 21:30:53'),(3723,'2005-07-06 11:12:02',4554,501,'2005-07-14 16:45:02',2,'2006-02-15 21:30:53'),(3724,'2005-07-06 11:12:48',3622,468,'2005-07-14 14:41:48',1,'2006-02-15 21:30:53'),(3725,'2005-07-06 11:15:04',2789,126,'2005-07-09 06:39:04',1,'2006-02-15 21:30:53'),(3726,'2005-07-06 11:15:49',742,363,'2005-07-11 05:54:49',2,'2006-02-15 21:30:53'),(3727,'2005-07-06 11:16:43',2886,57,'2005-07-07 15:39:43',1,'2006-02-15 21:30:53'),(3728,'2005-07-06 11:29:00',1798,298,'2005-07-11 06:28:00',1,'2006-02-15 21:30:53'),(3729,'2005-07-06 11:30:29',3156,90,'2005-07-12 07:18:29',1,'2006-02-15 21:30:53'),(3730,'2005-07-06 11:31:24',1665,355,'2005-07-15 06:53:24',1,'2006-02-15 21:30:53'),(3731,'2005-07-06 11:33:36',4133,558,'2005-07-15 12:23:36',2,'2006-02-15 21:30:53'),(3732,'2005-07-06 11:33:37',106,318,'2005-07-08 08:31:37',1,'2006-02-15 21:30:53'),(3733,'2005-07-06 11:33:55',3242,586,'2005-07-09 10:08:55',2,'2006-02-15 21:30:53'),(3734,'2005-07-06 11:40:27',4569,37,'2005-07-14 12:08:27',1,'2006-02-15 21:30:53'),(3735,'2005-07-06 11:42:04',2262,534,'2005-07-12 14:33:04',2,'2006-02-15 21:30:53'),(3736,'2005-07-06 11:43:44',1515,23,'2005-07-13 07:55:44',2,'2006-02-15 21:30:53'),(3737,'2005-07-06 11:45:53',123,403,'2005-07-13 15:27:53',1,'2006-02-15 21:30:53'),(3738,'2005-07-06 11:50:57',578,546,'2005-07-09 08:07:57',1,'2006-02-15 21:30:53'),(3739,'2005-07-06 11:54:18',4333,157,'2005-07-09 10:48:18',1,'2006-02-15 21:30:53'),(3740,'2005-07-06 11:55:35',1829,277,'2005-07-14 09:44:35',2,'2006-02-15 21:30:53'),(3741,'2005-07-06 12:00:18',1449,584,'2005-07-12 09:02:18',2,'2006-02-15 21:30:53'),(3742,'2005-07-06 12:01:38',2873,96,'2005-07-15 10:46:38',1,'2006-02-15 21:30:53'),(3743,'2005-07-06 12:03:54',1012,456,'2005-07-13 10:56:54',2,'2006-02-15 21:30:53'),(3744,'2005-07-06 12:10:02',3343,510,'2005-07-08 11:49:02',2,'2006-02-15 21:30:53'),(3745,'2005-07-06 12:10:32',1518,171,'2005-07-12 15:20:32',1,'2006-02-15 21:30:53'),(3746,'2005-07-06 12:10:51',3387,424,'2005-07-07 11:36:51',2,'2006-02-15 21:30:53'),(3747,'2005-07-06 12:11:14',1093,437,'2005-07-09 17:14:14',2,'2006-02-15 21:30:53'),(3748,'2005-07-06 12:11:22',2920,79,'2005-07-12 07:22:22',1,'2006-02-15 21:30:53'),(3749,'2005-07-06 12:18:03',1531,170,'2005-07-11 07:25:03',1,'2006-02-15 21:30:53'),(3750,'2005-07-06 12:19:28',2422,103,'2005-07-14 13:16:28',2,'2006-02-15 21:30:53'),(3751,'2005-07-06 12:23:41',3652,128,'2005-07-10 06:58:41',1,'2006-02-15 21:30:53'),(3752,'2005-07-06 12:30:12',4561,235,'2005-07-13 12:13:12',1,'2006-02-15 21:30:53'),(3753,'2005-07-06 12:34:06',774,358,'2005-07-07 14:19:06',2,'2006-02-15 21:30:53'),(3754,'2005-07-06 12:35:44',4042,83,'2005-07-08 16:28:44',1,'2006-02-15 21:30:53'),(3755,'2005-07-06 12:37:16',3147,402,'2005-07-13 07:22:16',1,'2006-02-15 21:30:53'),(3756,'2005-07-06 12:40:38',30,320,'2005-07-11 09:29:38',1,'2006-02-15 21:30:53'),(3757,'2005-07-06 12:42:26',2816,66,'2005-07-11 10:30:26',1,'2006-02-15 21:30:53'),(3758,'2005-07-06 12:43:11',2498,48,'2005-07-14 12:52:11',2,'2006-02-15 21:30:53'),(3759,'2005-07-06 12:46:38',4165,378,'2005-07-10 11:31:38',1,'2006-02-15 21:30:53'),(3760,'2005-07-06 12:49:28',1306,330,'2005-07-09 16:29:28',1,'2006-02-15 21:30:53'),(3761,'2005-07-06 12:52:44',4304,464,'2005-07-08 17:22:44',1,'2006-02-15 21:30:53'),(3762,'2005-07-06 12:52:49',1941,413,'2005-07-12 11:41:49',1,'2006-02-15 21:30:53'),(3763,'2005-07-06 12:56:31',1573,189,'2005-07-09 14:49:31',1,'2006-02-15 21:30:53'),(3764,'2005-07-06 13:01:03',3115,470,'2005-07-13 15:26:03',1,'2006-02-15 21:30:53'),(3765,'2005-07-06 13:01:47',1805,547,'2005-07-09 07:10:47',1,'2006-02-15 21:30:53'),(3766,'2005-07-06 13:04:35',4504,312,'2005-07-07 15:46:35',1,'2006-02-15 21:30:53'),(3767,'2005-07-06 13:07:27',923,582,'2005-07-08 18:48:27',1,'2006-02-15 21:30:53'),(3768,'2005-07-06 13:07:30',3995,573,'2005-07-09 16:26:30',2,'2006-02-15 21:30:53'),(3769,'2005-07-06 13:11:33',467,567,'2005-07-14 17:54:33',2,'2006-02-15 21:30:53'),(3770,'2005-07-06 13:14:28',3836,198,'2005-07-13 09:23:28',1,'2006-02-15 21:30:53'),(3771,'2005-07-06 13:19:34',1373,56,'2005-07-10 10:27:34',2,'2006-02-15 21:30:53'),(3772,'2005-07-06 13:22:53',434,338,'2005-07-10 11:54:53',2,'2006-02-15 21:30:53'),(3773,'2005-07-06 13:23:34',2034,263,'2005-07-08 17:23:34',2,'2006-02-15 21:30:53'),(3774,'2005-07-06 13:25:07',4044,439,'2005-07-15 12:56:07',2,'2006-02-15 21:30:53'),(3775,'2005-07-06 13:27:33',3696,300,'2005-07-09 10:27:33',1,'2006-02-15 21:30:53'),(3776,'2005-07-06 13:31:37',4387,278,'2005-07-10 10:53:37',2,'2006-02-15 21:30:53'),(3777,'2005-07-06 13:36:48',2470,548,'2005-07-11 14:26:48',1,'2006-02-15 21:30:53'),(3778,'2005-07-06 13:44:48',2181,122,'2005-07-13 09:31:48',2,'2006-02-15 21:30:53'),(3779,'2005-07-06 13:46:36',634,583,'2005-07-10 15:49:36',2,'2006-02-15 21:30:53'),(3780,'2005-07-06 13:52:02',1209,99,'2005-07-15 08:41:02',2,'2006-02-15 21:30:53'),(3781,'2005-07-06 13:53:41',3894,23,'2005-07-15 10:03:41',1,'2006-02-15 21:30:53'),(3782,'2005-07-06 13:57:03',3365,515,'2005-07-09 11:13:03',2,'2006-02-15 21:30:53'),(3783,'2005-07-06 13:57:31',2345,386,'2005-07-14 10:44:31',2,'2006-02-15 21:30:53'),(3784,'2005-07-06 13:57:56',2287,165,'2005-07-14 17:24:56',2,'2006-02-15 21:30:53'),(3785,'2005-07-06 14:00:13',3279,577,'2005-07-14 10:13:13',2,'2006-02-15 21:30:53'),(3786,'2005-07-06 14:00:41',4508,152,'2005-07-13 16:49:41',1,'2006-02-15 21:30:53'),(3787,'2005-07-06 14:02:01',288,474,'2005-07-09 19:09:01',2,'2006-02-15 21:30:53'),(3788,'2005-07-06 14:02:02',1363,379,'2005-07-10 18:24:02',1,'2006-02-15 21:30:53'),(3789,'2005-07-06 14:02:26',3560,595,'2005-07-14 18:13:26',1,'2006-02-15 21:30:53'),(3790,'2005-07-06 14:13:45',1711,10,'2005-07-14 13:35:45',1,'2006-02-15 21:30:53'),(3791,'2005-07-06 14:24:56',3426,452,'2005-07-14 11:06:56',2,'2006-02-15 21:30:53'),(3792,'2005-07-06 14:26:38',2651,312,'2005-07-11 16:34:38',1,'2006-02-15 21:30:53'),(3793,'2005-07-06 14:32:44',4558,553,'2005-07-08 13:55:44',1,'2006-02-15 21:30:53'),(3794,'2005-07-06 14:35:26',584,499,'2005-07-11 14:40:26',2,'2006-02-15 21:30:53'),(3795,'2005-07-06 14:37:41',240,153,'2005-07-11 20:27:41',2,'2006-02-15 21:30:53'),(3796,'2005-07-06 14:45:22',1649,228,'2005-07-07 11:01:22',2,'2006-02-15 21:30:53'),(3797,'2005-07-06 14:54:52',1047,374,'2005-07-10 09:50:52',2,'2006-02-15 21:30:53'),(3798,'2005-07-06 14:57:53',1942,479,'2005-07-07 10:48:53',2,'2006-02-15 21:30:53'),(3799,'2005-07-06 15:00:14',4532,251,'2005-07-10 15:39:14',1,'2006-02-15 21:30:53'),(3800,'2005-07-06 15:01:27',4004,100,'2005-07-15 11:12:27',2,'2006-02-15 21:30:53'),(3801,'2005-07-06 15:05:50',4209,68,'2005-07-12 12:56:50',1,'2006-02-15 21:30:53'),(3802,'2005-07-06 15:06:09',1017,91,'2005-07-08 09:33:09',2,'2006-02-15 21:30:53'),(3803,'2005-07-06 15:06:55',2062,494,'2005-07-08 18:53:55',1,'2006-02-15 21:30:53'),(3804,'2005-07-06 15:08:08',537,126,'2005-07-15 14:01:08',2,'2006-02-15 21:30:53'),(3805,'2005-07-06 15:08:42',1716,418,'2005-07-07 14:34:42',1,'2006-02-15 21:30:53'),(3806,'2005-07-06 15:09:41',3555,154,'2005-07-14 09:14:41',2,'2006-02-15 21:30:53'),(3807,'2005-07-06 15:11:44',39,425,'2005-07-10 09:20:44',1,'2006-02-15 21:30:53'),(3808,'2005-07-06 15:15:35',4339,314,'2005-07-07 16:10:35',1,'2006-02-15 21:30:53'),(3809,'2005-07-06 15:16:37',2932,358,'2005-07-09 14:45:37',1,'2006-02-15 21:30:53'),(3810,'2005-07-06 15:18:44',342,296,'2005-07-12 09:52:44',2,'2006-02-15 21:30:53'),(3811,'2005-07-06 15:20:37',695,208,'2005-07-08 16:26:37',2,'2006-02-15 21:30:53'),(3812,'2005-07-06 15:22:19',4490,381,'2005-07-08 13:04:19',1,'2006-02-15 21:30:53'),(3813,'2005-07-06 15:23:34',4100,189,'2005-07-08 19:03:34',1,'2006-02-15 21:30:53'),(3814,'2005-07-06 15:23:56',3826,306,'2005-07-13 20:51:56',2,'2006-02-15 21:30:53'),(3815,'2005-07-06 15:26:36',4038,472,'2005-07-11 17:07:36',2,'2006-02-15 21:30:53'),(3816,'2005-07-06 15:27:04',2941,489,'2005-07-14 13:12:04',1,'2006-02-15 21:30:53'),(3817,'2005-07-06 15:31:45',2933,267,'2005-07-11 17:11:45',1,'2006-02-15 21:30:53'),(3818,'2005-07-06 15:33:31',653,97,'2005-07-11 16:35:31',1,'2006-02-15 21:30:53'),(3819,'2005-07-06 15:35:06',1814,74,'2005-07-14 19:08:06',1,'2006-02-15 21:30:53'),(3820,'2005-07-06 15:35:26',4192,460,'2005-07-11 12:22:26',2,'2006-02-15 21:30:53'),(3821,'2005-07-06 15:36:20',4385,354,'2005-07-11 20:04:20',1,'2006-02-15 21:30:53'),(3822,'2005-07-06 15:41:15',1314,241,'2005-07-07 16:41:15',1,'2006-02-15 21:30:53'),(3823,'2005-07-06 15:41:27',124,265,'2005-07-09 09:48:27',1,'2006-02-15 21:30:53'),(3824,'2005-07-06 15:43:15',3107,107,'2005-07-13 16:05:15',2,'2006-02-15 21:30:53'),(3825,'2005-07-06 15:50:03',630,132,'2005-07-09 19:20:03',1,'2006-02-15 21:30:53'),(3826,'2005-07-06 15:51:58',73,451,'2005-07-13 12:35:58',1,'2006-02-15 21:30:53'),(3827,'2005-07-06 15:52:03',2072,41,'2005-07-08 21:43:03',2,'2006-02-15 21:30:53'),(3828,'2005-07-06 15:57:30',4493,498,'2005-07-10 12:17:30',2,'2006-02-15 21:30:53'),(3829,'2005-07-06 15:59:40',4126,356,'2005-07-11 10:29:40',1,'2006-02-15 21:30:53'),(3830,'2005-07-06 16:01:16',553,310,'2005-07-15 19:35:16',2,'2006-02-15 21:30:53'),(3831,'2005-07-06 16:06:35',1338,206,'2005-07-08 15:14:35',2,'2006-02-15 21:30:53'),(3832,'2005-07-06 16:12:23',4499,233,'2005-07-12 21:29:23',1,'2006-02-15 21:30:53'),(3833,'2005-07-06 16:18:28',3232,416,'2005-07-14 20:09:28',2,'2006-02-15 21:30:53'),(3834,'2005-07-06 16:19:56',3001,366,'2005-07-13 11:38:56',2,'2006-02-15 21:30:53'),(3835,'2005-07-06 16:22:45',935,486,'2005-07-11 17:04:45',2,'2006-02-15 21:30:53'),(3836,'2005-07-06 16:26:04',1148,351,'2005-07-10 15:08:04',1,'2006-02-15 21:30:53'),(3837,'2005-07-06 16:27:43',3166,309,'2005-07-07 18:02:43',1,'2006-02-15 21:30:53'),(3838,'2005-07-06 16:29:43',3404,565,'2005-07-11 20:50:43',1,'2006-02-15 21:30:53'),(3839,'2005-07-06 16:30:30',3230,231,'2005-07-11 19:00:30',1,'2006-02-15 21:30:53'),(3840,'2005-07-06 16:30:59',4384,468,'2005-07-15 22:08:59',2,'2006-02-15 21:30:53'),(3841,'2005-07-06 16:34:00',4228,470,'2005-07-08 15:12:00',2,'2006-02-15 21:30:53'),(3842,'2005-07-06 16:34:32',3119,583,'2005-07-08 11:55:32',2,'2006-02-15 21:30:53'),(3843,'2005-07-06 16:35:40',3844,62,'2005-07-07 18:29:40',1,'2006-02-15 21:30:53'),(3844,'2005-07-06 16:37:58',2814,179,'2005-07-09 19:54:58',2,'2006-02-15 21:30:53'),(3845,'2005-07-06 16:38:14',4495,28,'2005-07-09 14:59:14',2,'2006-02-15 21:30:53'),(3846,'2005-07-06 16:43:10',2829,88,'2005-07-14 11:09:10',2,'2006-02-15 21:30:53'),(3847,'2005-07-06 16:44:41',782,206,'2005-07-07 21:54:41',2,'2006-02-15 21:30:53'),(3848,'2005-07-06 16:47:32',2906,188,'2005-07-14 15:00:32',1,'2006-02-15 21:30:53'),(3849,'2005-07-06 16:49:43',3660,60,'2005-07-12 17:20:43',1,'2006-02-15 21:30:53'),(3850,'2005-07-06 16:51:21',1700,103,'2005-07-12 13:58:21',1,'2006-02-15 21:30:53'),(3851,'2005-07-06 16:54:12',493,436,'2005-07-11 22:49:12',1,'2006-02-15 21:30:53'),(3852,'2005-07-06 16:57:49',3329,511,'2005-07-11 17:11:49',1,'2006-02-15 21:30:53'),(3853,'2005-07-06 16:59:20',1411,537,'2005-07-07 12:30:20',2,'2006-02-15 21:30:53'),(3854,'2005-07-06 17:02:33',2054,243,'2005-07-12 17:32:33',2,'2006-02-15 21:30:53'),(3855,'2005-07-06 17:03:48',2931,46,'2005-07-12 14:32:48',1,'2006-02-15 21:30:53'),(3856,'2005-07-06 17:04:46',3083,498,'2005-07-14 19:23:46',2,'2006-02-15 21:30:53'),(3857,'2005-07-06 17:07:54',1135,236,'2005-07-07 13:28:54',1,'2006-02-15 21:30:53'),(3858,'2005-07-06 17:17:57',829,377,'2005-07-10 23:10:57',2,'2006-02-15 21:30:53'),(3859,'2005-07-06 17:18:15',2548,553,'2005-07-09 16:48:15',1,'2006-02-15 21:30:53'),(3860,'2005-07-06 17:20:24',144,514,'2005-07-09 22:33:24',1,'2006-02-15 21:30:53'),(3861,'2005-07-06 17:24:49',4506,202,'2005-07-15 22:19:49',2,'2006-02-15 21:30:53'),(3862,'2005-07-06 17:35:22',471,181,'2005-07-15 17:13:22',1,'2006-02-15 21:30:53'),(3863,'2005-07-06 17:40:18',363,481,'2005-07-07 17:58:18',2,'2006-02-15 21:30:53'),(3864,'2005-07-06 17:41:42',2811,68,'2005-07-08 14:17:42',1,'2006-02-15 21:30:53'),(3865,'2005-07-06 17:46:57',3579,357,'2005-07-12 12:20:57',1,'2006-02-15 21:30:53'),(3866,'2005-07-06 17:47:20',194,409,'2005-07-15 18:12:20',1,'2006-02-15 21:30:53'),(3867,'2005-07-06 17:52:19',3620,580,'2005-07-13 21:48:19',1,'2006-02-15 21:30:53'),(3868,'2005-07-06 17:54:13',1606,416,'2005-07-10 14:51:13',1,'2006-02-15 21:30:53'),(3869,'2005-07-06 17:56:46',2540,183,'2005-07-10 20:44:46',1,'2006-02-15 21:30:53'),(3870,'2005-07-06 17:57:54',3357,12,'2005-07-13 12:30:54',1,'2006-02-15 21:30:53'),(3871,'2005-07-06 17:58:51',3114,331,'2005-07-15 22:18:51',2,'2006-02-15 21:30:53'),(3872,'2005-07-06 18:00:19',1785,513,'2005-07-07 17:26:19',1,'2006-02-15 21:30:53'),(3873,'2005-07-06 18:03:16',4148,394,'2005-07-15 23:58:16',2,'2006-02-15 21:30:53'),(3874,'2005-07-06 18:06:12',1870,137,'2005-07-12 16:55:12',1,'2006-02-15 21:30:53'),(3875,'2005-07-06 18:15:39',712,108,'2005-07-11 17:34:39',1,'2006-02-15 21:30:53'),(3876,'2005-07-06 18:21:13',4039,295,'2005-07-14 16:57:13',2,'2006-02-15 21:30:53'),(3877,'2005-07-06 18:22:10',2796,576,'2005-07-07 23:38:10',1,'2006-02-15 21:30:53'),(3878,'2005-07-06 18:27:09',4022,385,'2005-07-15 20:13:09',2,'2006-02-15 21:30:53'),(3879,'2005-07-06 18:31:20',1376,81,'2005-07-09 19:03:20',2,'2006-02-15 21:30:53'),(3880,'2005-07-06 18:32:49',42,507,'2005-07-07 20:46:49',2,'2006-02-15 21:30:53'),(3881,'2005-07-06 18:35:37',143,456,'2005-07-10 00:06:37',2,'2006-02-15 21:30:53'),(3882,'2005-07-06 18:38:21',788,254,'2005-07-09 14:55:21',1,'2006-02-15 21:30:53'),(3883,'2005-07-06 18:39:38',3238,69,'2005-07-14 15:59:38',2,'2006-02-15 21:30:53'),(3884,'2005-07-06 18:41:33',1806,210,'2005-07-07 22:06:33',1,'2006-02-15 21:30:53'),(3885,'2005-07-06 18:43:43',1820,282,'2005-07-12 19:48:43',2,'2006-02-15 21:30:53'),(3886,'2005-07-06 18:44:24',2368,326,'2005-07-08 15:11:24',1,'2006-02-15 21:30:53'),(3887,'2005-07-06 18:46:34',1695,530,'2005-07-07 13:15:34',1,'2006-02-15 21:30:53'),(3888,'2005-07-06 18:54:20',1945,412,'2005-07-12 17:13:20',2,'2006-02-15 21:30:53'),(3889,'2005-07-06 18:56:25',2005,576,'2005-07-08 21:22:25',2,'2006-02-15 21:30:53'),(3890,'2005-07-06 18:58:15',2570,553,'2005-07-10 18:51:15',1,'2006-02-15 21:30:53'),(3891,'2005-07-06 18:58:25',3216,553,'2005-07-09 23:20:25',2,'2006-02-15 21:30:53'),(3892,'2005-07-06 18:58:58',778,549,'2005-07-10 19:29:58',1,'2006-02-15 21:30:53'),(3893,'2005-07-06 18:59:31',1281,350,'2005-07-12 19:21:31',1,'2006-02-15 21:30:53'),(3894,'2005-07-06 19:01:39',2087,149,'2005-07-12 21:35:39',2,'2006-02-15 21:30:53'),(3895,'2005-07-06 19:04:24',145,584,'2005-07-15 17:48:24',2,'2006-02-15 21:30:53'),(3896,'2005-07-06 19:09:15',1755,309,'2005-07-16 00:52:15',2,'2006-02-15 21:30:53'),(3897,'2005-07-06 19:11:43',14,277,'2005-07-11 21:50:43',2,'2006-02-15 21:30:53'),(3898,'2005-07-06 19:12:37',3858,53,'2005-07-11 15:50:37',1,'2006-02-15 21:30:53'),(3899,'2005-07-06 19:12:40',4020,485,'2005-07-13 23:41:40',1,'2006-02-15 21:30:53'),(3900,'2005-07-06 19:21:28',1497,129,'2005-07-15 21:06:28',2,'2006-02-15 21:30:53'),(3901,'2005-07-06 19:24:55',3367,321,'2005-07-14 20:30:55',2,'2006-02-15 21:30:53'),(3902,'2005-07-06 19:25:18',2868,192,'2005-07-10 17:42:18',2,'2006-02-15 21:30:53'),(3903,'2005-07-06 19:27:32',3614,369,'2005-07-08 23:27:32',1,'2006-02-15 21:30:53'),(3904,'2005-07-06 19:30:57',3600,485,'2005-07-11 18:47:57',2,'2006-02-15 21:30:53'),(3905,'2005-07-06 19:33:34',3817,526,'2005-07-15 17:55:34',1,'2006-02-15 21:30:53'),(3906,'2005-07-06 19:35:55',1383,293,'2005-07-15 22:35:55',1,'2006-02-15 21:30:53'),(3907,'2005-07-06 19:39:14',2507,452,'2005-07-11 17:45:14',1,'2006-02-15 21:30:53'),(3908,'2005-07-06 19:47:26',3980,116,'2005-07-13 19:59:26',1,'2006-02-15 21:30:53'),(3909,'2005-07-06 19:54:41',3423,396,'2005-07-15 18:11:41',2,'2006-02-15 21:30:53'),(3910,'2005-07-06 20:05:18',2085,248,'2005-07-10 18:51:18',1,'2006-02-15 21:30:53'),(3911,'2005-07-06 20:09:11',4548,34,'2005-07-08 23:53:11',1,'2006-02-15 21:30:53'),(3912,'2005-07-06 20:10:03',2449,154,'2005-07-08 18:39:03',2,'2006-02-15 21:30:53'),(3913,'2005-07-06 20:11:00',752,494,'2005-07-08 14:42:00',1,'2006-02-15 21:30:53'),(3914,'2005-07-06 20:11:10',4092,159,'2005-07-14 14:42:10',2,'2006-02-15 21:30:53'),(3915,'2005-07-06 20:16:46',125,163,'2005-07-10 17:24:46',1,'2006-02-15 21:30:53'),(3916,'2005-07-06 20:18:50',3198,46,'2005-07-12 21:56:50',1,'2006-02-15 21:30:53'),(3917,'2005-07-06 20:19:29',2747,471,'2005-07-11 00:49:29',1,'2006-02-15 21:30:53'),(3918,'2005-07-06 20:26:15',1111,435,'2005-07-15 20:32:15',1,'2006-02-15 21:30:53'),(3919,'2005-07-06 20:26:21',2695,147,'2005-07-15 00:13:21',1,'2006-02-15 21:30:53'),(3920,'2005-07-06 20:26:40',1551,321,'2005-07-15 15:00:40',2,'2006-02-15 21:30:53'),(3921,'2005-07-06 20:29:48',949,531,'2005-07-14 01:44:48',1,'2006-02-15 21:30:53'),(3922,'2005-07-06 20:32:27',2878,470,'2005-07-14 19:00:27',1,'2006-02-15 21:30:53'),(3923,'2005-07-06 20:34:10',2039,63,'2005-07-13 19:20:10',1,'2006-02-15 21:30:53'),(3924,'2005-07-06 20:38:02',187,114,'2005-07-11 23:35:02',2,'2006-02-15 21:30:53'),(3925,'2005-07-06 20:41:44',2653,428,'2005-07-15 21:05:44',2,'2006-02-15 21:30:53'),(3926,'2005-07-06 20:42:35',4241,500,'2005-07-09 16:30:35',2,'2006-02-15 21:30:53'),(3927,'2005-07-06 20:48:14',2194,404,'2005-07-10 15:37:14',1,'2006-02-15 21:30:53'),(3928,'2005-07-06 20:52:09',1960,411,'2005-07-08 18:51:09',1,'2006-02-15 21:30:53'),(3929,'2005-07-06 20:52:39',1235,453,'2005-07-12 00:27:39',2,'2006-02-15 21:30:53'),(3930,'2005-07-06 20:54:07',165,573,'2005-07-10 18:31:07',1,'2006-02-15 21:30:53'),(3931,'2005-07-06 21:03:46',182,176,'2005-07-16 01:32:46',1,'2006-02-15 21:30:53'),(3932,'2005-07-06 21:06:17',4396,490,'2005-07-07 19:25:17',2,'2006-02-15 21:30:53'),(3933,'2005-07-06 21:06:37',1202,229,'2005-07-08 20:23:37',1,'2006-02-15 21:30:53'),(3934,'2005-07-06 21:07:23',3187,576,'2005-07-10 18:20:23',2,'2006-02-15 21:30:53'),(3935,'2005-07-06 21:08:29',3402,503,'2005-07-15 23:28:29',2,'2006-02-15 21:30:53'),(3936,'2005-07-06 21:15:03',4258,129,'2005-07-08 17:45:03',2,'2006-02-15 21:30:53'),(3937,'2005-07-06 21:15:38',2091,211,'2005-07-15 00:01:38',2,'2006-02-15 21:30:53'),(3938,'2005-07-06 21:15:45',1991,341,'2005-07-13 20:02:45',2,'2006-02-15 21:30:53'),(3939,'2005-07-06 21:16:32',3627,149,'2005-07-11 03:12:32',2,'2006-02-15 21:30:53'),(3940,'2005-07-06 21:16:59',1502,116,'2005-07-07 19:17:59',2,'2006-02-15 21:30:53'),(3941,'2005-07-06 21:20:37',382,560,'2005-07-09 01:35:37',2,'2006-02-15 21:30:53'),(3942,'2005-07-06 21:21:34',677,553,'2005-07-15 02:34:34',1,'2006-02-15 21:30:53'),(3943,'2005-07-06 21:22:17',1816,566,'2005-07-07 21:26:17',1,'2006-02-15 21:30:53'),(3944,'2005-07-06 21:34:11',4213,436,'2005-07-08 23:46:11',2,'2006-02-15 21:30:53'),(3945,'2005-07-06 21:35:00',754,86,'2005-07-08 00:31:00',2,'2006-02-15 21:30:53'),(3946,'2005-07-06 21:39:24',294,13,'2005-07-11 16:10:24',1,'2006-02-15 21:30:53'),(3947,'2005-07-06 21:42:21',4188,324,'2005-07-08 19:37:21',1,'2006-02-15 21:30:53'),(3948,'2005-07-06 21:45:53',2254,161,'2005-07-08 19:24:53',2,'2006-02-15 21:30:53'),(3949,'2005-07-06 21:46:36',1765,153,'2005-07-11 03:18:36',1,'2006-02-15 21:30:53'),(3950,'2005-07-06 21:48:44',4153,598,'2005-07-14 02:25:44',1,'2006-02-15 21:30:53'),(3951,'2005-07-06 21:50:41',2288,250,'2005-07-12 02:09:41',2,'2006-02-15 21:30:53'),(3952,'2005-07-06 21:51:31',1719,417,'2005-07-13 15:54:31',1,'2006-02-15 21:30:53'),(3953,'2005-07-06 21:54:55',3879,385,'2005-07-09 18:52:55',1,'2006-02-15 21:30:53'),(3954,'2005-07-06 21:57:44',4250,558,'2005-07-08 02:37:44',2,'2006-02-15 21:30:53'),(3955,'2005-07-06 21:58:08',2523,247,'2005-07-08 03:43:08',1,'2006-02-15 21:30:53'),(3956,'2005-07-06 22:01:51',15,147,'2005-07-12 21:35:51',2,'2006-02-15 21:30:53'),(3957,'2005-07-06 22:05:47',443,414,'2005-07-16 01:08:47',1,'2006-02-15 21:30:53'),(3958,'2005-07-06 22:07:33',4117,288,'2005-07-10 19:31:33',2,'2006-02-15 21:30:53'),(3959,'2005-07-06 22:07:58',40,448,'2005-07-13 02:30:58',1,'2006-02-15 21:30:53'),(3960,'2005-07-06 22:08:53',2090,594,'2005-07-07 23:21:53',2,'2006-02-15 21:30:53'),(3961,'2005-07-06 22:11:43',4320,364,'2005-07-09 03:14:43',1,'2006-02-15 21:30:53'),(3962,'2005-07-06 22:13:45',379,307,'2005-07-15 00:22:45',2,'2006-02-15 21:30:53'),(3963,'2005-07-06 22:19:17',3912,111,'2005-07-15 01:22:17',2,'2006-02-15 21:30:53'),(3964,'2005-07-06 22:23:02',1853,30,'2005-07-07 22:21:02',1,'2006-02-15 21:30:53'),(3965,'2005-07-06 22:36:20',2863,243,'2005-07-09 17:45:20',1,'2006-02-15 21:30:53'),(3966,'2005-07-06 22:38:49',556,495,'2005-07-07 23:33:49',1,'2006-02-15 21:30:53'),(3967,'2005-07-06 22:45:10',2510,31,'2005-07-09 23:54:10',2,'2006-02-15 21:30:53'),(3968,'2005-07-06 22:47:09',558,235,'2005-07-12 21:01:09',1,'2006-02-15 21:30:53'),(3969,'2005-07-06 22:47:59',383,587,'2005-07-08 02:11:59',1,'2006-02-15 21:30:53'),(3970,'2005-07-06 22:48:17',701,381,'2005-07-15 19:07:17',1,'2006-02-15 21:30:53'),(3971,'2005-07-06 22:50:40',4415,473,'2005-07-08 01:02:40',1,'2006-02-15 21:30:53'),(3972,'2005-07-06 22:53:57',1895,598,'2005-07-11 01:32:57',1,'2006-02-15 21:30:53'),(3973,'2005-07-06 22:58:31',2625,592,'2005-07-16 03:27:31',2,'2006-02-15 21:30:53'),(3974,'2005-07-06 22:59:16',4282,318,'2005-07-11 22:30:16',1,'2006-02-15 21:30:53'),(3975,'2005-07-06 23:00:09',4343,545,'2005-07-10 01:39:09',2,'2006-02-15 21:30:53'),(3976,'2005-07-06 23:00:20',2424,329,'2005-07-07 21:51:20',2,'2006-02-15 21:30:53'),(3977,'2005-07-06 23:00:49',1284,449,'2005-07-15 00:41:49',1,'2006-02-15 21:30:53'),(3978,'2005-07-06 23:04:33',4341,343,'2005-07-10 17:45:33',2,'2006-02-15 21:30:53'),(3979,'2005-07-06 23:04:35',794,550,'2005-07-13 01:38:35',2,'2006-02-15 21:30:53'),(3980,'2005-07-06 23:11:11',1845,475,'2005-07-14 18:22:11',1,'2006-02-15 21:30:53'),(3981,'2005-07-06 23:12:12',842,375,'2005-07-13 01:47:12',2,'2006-02-15 21:30:53'),(3982,'2005-07-06 23:14:16',4327,64,'2005-07-08 21:21:16',2,'2006-02-15 21:30:53'),(3983,'2005-07-06 23:14:21',1261,6,'2005-07-12 17:55:21',2,'2006-02-15 21:30:53'),(3984,'2005-07-06 23:22:36',2205,570,'2005-07-08 21:40:36',2,'2006-02-15 21:30:53'),(3985,'2005-07-06 23:24:03',2096,307,'2005-07-10 00:20:03',2,'2006-02-15 21:30:53'),(3986,'2005-07-06 23:25:13',3737,122,'2005-07-09 21:26:13',2,'2006-02-15 21:30:53'),(3987,'2005-07-06 23:28:24',3104,270,'2005-07-15 00:52:24',1,'2006-02-15 21:30:53'),(3988,'2005-07-06 23:30:42',2981,421,'2005-07-13 03:06:42',2,'2006-02-15 21:30:53'),(3989,'2005-07-06 23:30:54',2366,213,'2005-07-12 01:28:54',1,'2006-02-15 21:30:53'),(3990,'2005-07-06 23:32:44',2009,558,'2005-07-14 01:35:44',2,'2006-02-15 21:30:53'),(3991,'2005-07-06 23:33:41',587,583,'2005-07-16 01:31:41',1,'2006-02-15 21:30:53'),(3992,'2005-07-06 23:36:56',3219,448,'2005-07-15 03:13:56',1,'2006-02-15 21:30:53'),(3993,'2005-07-06 23:37:06',1061,525,'2005-07-14 19:31:06',1,'2006-02-15 21:30:53'),(3994,'2005-07-06 23:39:01',902,487,'2005-07-14 00:33:01',1,'2006-02-15 21:30:53'),(3995,'2005-07-06 23:43:03',3990,128,'2005-07-13 04:13:03',2,'2006-02-15 21:30:53'),(3996,'2005-07-06 23:46:43',2857,551,'2005-07-14 22:34:43',2,'2006-02-15 21:30:53'),(3997,'2005-07-06 23:46:52',3895,52,'2005-07-14 05:39:52',2,'2006-02-15 21:30:53'),(3998,'2005-07-06 23:49:20',1245,566,'2005-07-12 20:39:20',1,'2006-02-15 21:30:53'),(3999,'2005-07-06 23:50:54',707,390,'2005-07-09 22:09:54',1,'2006-02-15 21:30:53'),(4000,'2005-07-06 23:58:37',2122,95,'2005-07-08 21:43:37',1,'2006-02-15 21:30:53'),(4001,'2005-07-07 00:07:00',864,120,'2005-07-13 21:27:00',2,'2006-02-15 21:30:53'),(4002,'2005-07-07 00:08:18',2790,308,'2005-07-14 01:29:18',2,'2006-02-15 21:30:53'),(4003,'2005-07-07 00:09:02',4054,8,'2005-07-08 04:27:02',1,'2006-02-15 21:30:53'),(4004,'2005-07-07 00:20:51',667,574,'2005-07-11 18:55:51',2,'2006-02-15 21:30:53'),(4005,'2005-07-07 00:22:26',3677,190,'2005-07-15 04:34:26',2,'2006-02-15 21:30:53'),(4006,'2005-07-07 00:25:29',397,473,'2005-07-08 05:30:29',2,'2006-02-15 21:30:53'),(4007,'2005-07-07 00:26:05',2071,285,'2005-07-15 19:53:05',1,'2006-02-15 21:30:53'),(4008,'2005-07-07 00:26:43',1107,505,'2005-07-16 03:58:43',2,'2006-02-15 21:30:53'),(4009,'2005-07-07 00:28:55',3607,394,'2005-07-10 00:37:55',1,'2006-02-15 21:30:53'),(4010,'2005-07-07 00:47:00',4509,476,'2005-07-12 06:23:00',2,'2006-02-15 21:30:53'),(4011,'2005-07-07 00:48:25',2052,20,'2005-07-13 06:30:25',2,'2006-02-15 21:30:53'),(4012,'2005-07-07 00:56:09',1400,104,'2005-07-10 21:49:09',1,'2006-02-15 21:30:53'),(4013,'2005-07-07 00:58:00',2344,475,'2005-07-15 19:42:00',2,'2006-02-15 21:30:53'),(4014,'2005-07-07 00:58:54',583,510,'2005-07-12 02:40:54',1,'2006-02-15 21:30:53'),(4015,'2005-07-07 00:59:46',3032,233,'2005-07-14 03:16:46',2,'2006-02-15 21:30:53'),(4016,'2005-07-07 01:05:50',3318,335,'2005-07-09 05:59:50',1,'2006-02-15 21:30:53'),(4017,'2005-07-07 01:08:18',3117,595,'2005-07-09 01:47:18',2,'2006-02-15 21:30:53'),(4018,'2005-07-07 01:10:33',906,207,'2005-07-12 20:54:33',2,'2006-02-15 21:30:53'),(4019,'2005-07-07 01:27:44',3200,294,'2005-07-10 21:30:44',1,'2006-02-15 21:30:53'),(4020,'2005-07-07 01:42:22',3760,471,'2005-07-10 00:53:22',1,'2006-02-15 21:30:53'),(4021,'2005-07-07 01:46:44',1676,315,'2005-07-12 00:16:44',2,'2006-02-15 21:30:53'),(4022,'2005-07-07 01:50:06',3914,390,'2005-07-09 21:47:06',2,'2006-02-15 21:30:53'),(4023,'2005-07-07 01:55:25',274,573,'2005-07-08 02:43:25',2,'2006-02-15 21:30:53'),(4024,'2005-07-07 02:11:23',3976,448,'2005-07-11 02:00:23',1,'2006-02-15 21:30:53'),(4025,'2005-07-07 02:13:24',3908,114,'2005-07-08 00:47:24',1,'2006-02-15 21:30:53'),(4026,'2005-07-07 02:15:48',4142,251,'2005-07-14 04:15:48',2,'2006-02-15 21:30:53'),(4027,'2005-07-07 02:19:01',56,116,'2005-07-10 01:12:01',1,'2006-02-15 21:30:53'),(4028,'2005-07-07 02:19:14',1651,344,'2005-07-15 08:09:14',2,'2006-02-15 21:30:53'),(4029,'2005-07-07 02:19:44',4075,518,'2005-07-15 02:30:44',2,'2006-02-15 21:30:53'),(4030,'2005-07-07 02:25:42',1734,300,'2005-07-08 22:53:42',2,'2006-02-15 21:30:53'),(4031,'2005-07-07 02:32:07',3094,143,'2005-07-14 06:01:07',2,'2006-02-15 21:30:53'),(4032,'2005-07-07 02:34:13',2628,335,'2005-07-14 22:43:13',1,'2006-02-15 21:30:53'),(4033,'2005-07-07 02:35:46',203,453,'2005-07-16 01:12:46',1,'2006-02-15 21:30:53'),(4034,'2005-07-07 02:36:33',1666,354,'2005-07-09 08:32:33',2,'2006-02-15 21:30:53'),(4035,'2005-07-07 02:45:02',3611,539,'2005-07-14 01:41:02',1,'2006-02-15 21:30:53'),(4036,'2005-07-07 02:48:00',500,397,'2005-07-07 22:46:00',1,'2006-02-15 21:30:53'),(4037,'2005-07-07 02:52:52',3903,594,'2005-07-16 00:09:52',1,'2006-02-15 21:30:53'),(4038,'2005-07-07 02:52:53',1264,27,'2005-07-11 22:32:53',2,'2006-02-15 21:30:53'),(4039,'2005-07-07 02:57:59',4050,290,'2005-07-12 03:44:59',2,'2006-02-15 21:30:53'),(4040,'2005-07-07 03:02:40',3046,103,'2005-07-16 06:05:40',2,'2006-02-15 21:30:53'),(4041,'2005-07-07 03:03:33',2217,445,'2005-07-09 07:57:33',2,'2006-02-15 21:30:53'),(4042,'2005-07-07 03:06:40',50,10,'2005-07-10 02:37:40',1,'2006-02-15 21:30:53'),(4043,'2005-07-07 03:09:50',3427,204,'2005-07-10 07:49:50',2,'2006-02-15 21:30:53'),(4044,'2005-07-07 03:22:23',3263,94,'2005-07-13 03:23:23',1,'2006-02-15 21:30:53'),(4045,'2005-07-07 03:26:14',1422,529,'2005-07-11 06:52:14',1,'2006-02-15 21:30:53'),(4046,'2005-07-07 03:27:59',3518,491,'2005-07-14 01:14:59',1,'2006-02-15 21:30:53'),(4047,'2005-07-07 03:28:49',3475,364,'2005-07-09 02:42:49',2,'2006-02-15 21:30:53'),(4048,'2005-07-07 03:30:52',659,474,'2005-07-14 05:05:52',2,'2006-02-15 21:30:53'),(4049,'2005-07-07 03:34:53',4172,79,'2005-07-15 04:10:53',2,'2006-02-15 21:30:53'),(4050,'2005-07-07 03:35:33',104,528,'2005-07-15 03:11:33',1,'2006-02-15 21:30:53'),(4051,'2005-07-07 03:37:28',2715,331,'2005-07-09 01:40:28',1,'2006-02-15 21:30:53'),(4052,'2005-07-07 03:38:22',206,442,'2005-07-13 02:56:22',2,'2006-02-15 21:30:53'),(4053,'2005-07-07 03:39:22',2889,377,'2005-07-09 22:32:22',1,'2006-02-15 21:30:53'),(4054,'2005-07-07 03:42:07',3885,260,'2005-07-10 03:22:07',1,'2006-02-15 21:30:53'),(4055,'2005-07-07 03:49:13',2561,513,'2005-07-11 03:15:13',2,'2006-02-15 21:30:53'),(4056,'2005-07-07 03:57:36',4211,360,'2005-07-09 08:53:36',2,'2006-02-15 21:30:53'),(4057,'2005-07-07 04:00:20',2838,141,'2005-07-12 08:14:20',1,'2006-02-15 21:30:53'),(4058,'2005-07-07 04:02:50',3877,442,'2005-07-10 04:30:50',2,'2006-02-15 21:30:53'),(4059,'2005-07-07 04:04:26',292,401,'2005-07-10 22:35:26',1,'2006-02-15 21:30:53'),(4060,'2005-07-07 04:10:13',2697,211,'2005-07-13 07:44:13',1,'2006-02-15 21:30:53'),(4061,'2005-07-07 04:13:35',62,70,'2005-07-10 23:58:35',2,'2006-02-15 21:30:53'),(4062,'2005-07-07 04:22:27',1323,410,'2005-07-09 03:27:27',1,'2006-02-15 21:30:53'),(4063,'2005-07-07 04:23:57',1452,331,'2005-07-14 23:35:57',2,'2006-02-15 21:30:53'),(4064,'2005-07-07 04:29:20',1402,47,'2005-07-14 05:48:20',2,'2006-02-15 21:30:53'),(4065,'2005-07-07 04:32:28',1339,26,'2005-07-12 08:30:28',1,'2006-02-15 21:30:53'),(4066,'2005-07-07 04:34:09',1975,368,'2005-07-10 23:54:09',1,'2006-02-15 21:30:53'),(4067,'2005-07-07 04:34:23',2945,469,'2005-07-16 04:04:23',1,'2006-02-15 21:30:53'),(4068,'2005-07-07 04:34:38',4152,206,'2005-07-11 09:16:38',2,'2006-02-15 21:30:53'),(4069,'2005-07-07 04:35:06',3361,570,'2005-07-10 23:59:06',2,'2006-02-15 21:30:53'),(4070,'2005-07-07 04:37:09',2926,496,'2005-07-08 04:19:09',2,'2006-02-15 21:30:53'),(4071,'2005-07-07 04:37:26',2883,209,'2005-07-13 06:45:26',2,'2006-02-15 21:30:53'),(4072,'2005-07-07 04:48:02',3130,310,'2005-07-12 10:32:02',2,'2006-02-15 21:30:53'),(4073,'2005-07-07 04:49:13',647,290,'2005-07-10 03:20:13',2,'2006-02-15 21:30:53'),(4074,'2005-07-07 04:49:49',2347,412,'2005-07-12 04:51:49',2,'2006-02-15 21:30:53'),(4075,'2005-07-07 04:51:44',1989,593,'2005-07-09 03:07:44',2,'2006-02-15 21:30:53'),(4076,'2005-07-07 04:52:15',3148,329,'2005-07-13 23:22:15',1,'2006-02-15 21:30:53'),(4077,'2005-07-07 04:53:40',2445,377,'2005-07-09 09:56:40',2,'2006-02-15 21:30:53'),(4078,'2005-07-07 05:05:05',1671,522,'2005-07-10 05:39:05',1,'2006-02-15 21:30:53'),(4079,'2005-07-07 05:06:27',2202,84,'2005-07-16 08:46:27',1,'2006-02-15 21:30:53'),(4080,'2005-07-07 05:09:54',1364,148,'2005-07-11 23:58:54',1,'2006-02-15 21:30:53'),(4081,'2005-07-07 05:10:08',1138,284,'2005-07-12 00:47:08',1,'2006-02-15 21:30:53'),(4082,'2005-07-07 05:11:53',2904,108,'2005-07-12 00:55:53',1,'2006-02-15 21:30:53'),(4083,'2005-07-07 05:13:15',3454,490,'2005-07-08 09:11:15',1,'2006-02-15 21:30:53'),(4084,'2005-07-07 05:16:00',2588,441,'2005-07-15 09:23:00',1,'2006-02-15 21:30:53'),(4085,'2005-07-07 05:25:39',1683,573,'2005-07-12 04:30:39',1,'2006-02-15 21:30:53'),(4086,'2005-07-07 05:26:06',253,494,'2005-07-12 00:45:06',2,'2006-02-15 21:30:53'),(4087,'2005-07-07 05:30:56',3066,433,'2005-07-16 10:20:56',1,'2006-02-15 21:30:53'),(4088,'2005-07-07 05:31:55',234,66,'2005-07-15 07:35:55',1,'2006-02-15 21:30:53'),(4089,'2005-07-07 05:45:59',3431,102,'2005-07-16 07:34:59',2,'2006-02-15 21:30:53'),(4090,'2005-07-07 05:47:33',3096,67,'2005-07-08 04:25:33',2,'2006-02-15 21:30:53'),(4091,'2005-07-07 05:53:38',3928,337,'2005-07-14 03:12:38',2,'2006-02-15 21:30:53'),(4092,'2005-07-07 05:54:18',1721,246,'2005-07-16 09:14:18',1,'2006-02-15 21:30:53'),(4093,'2005-07-07 05:54:50',1534,337,'2005-07-12 00:34:50',1,'2006-02-15 21:30:53'),(4094,'2005-07-07 06:00:21',2412,517,'2005-07-10 03:24:21',2,'2006-02-15 21:30:53'),(4095,'2005-07-07 06:01:48',2900,33,'2005-07-15 02:52:48',2,'2006-02-15 21:30:53'),(4096,'2005-07-07 06:09:11',3911,403,'2005-07-08 09:17:11',2,'2006-02-15 21:30:53'),(4097,'2005-07-07 06:10:55',2454,56,'2005-07-11 02:45:55',1,'2006-02-15 21:30:53'),(4098,'2005-07-07 06:14:51',2865,35,'2005-07-14 06:51:51',2,'2006-02-15 21:30:53'),(4099,'2005-07-07 06:20:33',1930,76,'2005-07-16 08:39:33',1,'2006-02-15 21:30:53'),(4100,'2005-07-07 06:20:52',2346,332,'2005-07-15 05:58:52',2,'2006-02-15 21:30:53'),(4101,'2005-07-07 06:25:11',2891,588,'2005-07-12 07:44:11',2,'2006-02-15 21:30:53'),(4102,'2005-07-07 06:25:19',3998,135,'2005-07-11 00:50:19',2,'2006-02-15 21:30:53'),(4103,'2005-07-07 06:25:28',3632,91,'2005-07-12 11:18:28',1,'2006-02-15 21:30:53'),(4104,'2005-07-07 06:25:41',1066,338,'2005-07-13 04:18:41',2,'2006-02-15 21:30:53'),(4105,'2005-07-07 06:31:00',439,423,'2005-07-09 03:52:00',1,'2006-02-15 21:30:53'),(4106,'2005-07-07 06:33:35',4083,563,'2005-07-13 04:03:35',1,'2006-02-15 21:30:53'),(4107,'2005-07-07 06:36:32',4232,206,'2005-07-14 03:36:32',1,'2006-02-15 21:30:53'),(4108,'2005-07-07 06:38:31',4535,66,'2005-07-08 10:44:31',1,'2006-02-15 21:30:53'),(4109,'2005-07-07 06:39:43',532,517,'2005-07-10 06:30:43',1,'2006-02-15 21:30:53'),(4110,'2005-07-07 06:44:27',226,486,'2005-07-12 05:43:27',2,'2006-02-15 21:30:53'),(4111,'2005-07-07 06:47:56',1009,515,'2005-07-13 02:13:56',1,'2006-02-15 21:30:53'),(4112,'2005-07-07 06:49:09',3284,533,'2005-07-16 06:53:09',2,'2006-02-15 21:30:53'),(4113,'2005-07-07 06:49:52',915,170,'2005-07-12 04:00:52',1,'2006-02-15 21:30:53'),(4114,'2005-07-07 06:51:12',4109,426,'2005-07-15 01:36:12',1,'2006-02-15 21:30:53'),(4115,'2005-07-07 06:52:23',102,371,'2005-07-14 06:12:23',2,'2006-02-15 21:30:53'),(4116,'2005-07-07 06:56:13',666,352,'2005-07-11 11:13:13',2,'2006-02-15 21:30:53'),(4117,'2005-07-07 06:58:14',780,158,'2005-07-16 05:28:14',1,'2006-02-15 21:30:53'),(4118,'2005-07-07 07:03:30',355,224,'2005-07-08 09:20:30',1,'2006-02-15 21:30:53'),(4119,'2005-07-07 07:06:03',2078,319,'2005-07-13 01:56:03',2,'2006-02-15 21:30:53'),(4120,'2005-07-07 07:07:03',987,559,'2005-07-16 04:07:03',1,'2006-02-15 21:30:53'),(4121,'2005-07-07 07:13:50',2429,176,'2005-07-13 04:32:50',2,'2006-02-15 21:30:53'),(4122,'2005-07-07 07:15:35',273,31,'2005-07-14 12:10:35',1,'2006-02-15 21:30:53'),(4123,'2005-07-07 07:16:19',2707,469,'2005-07-10 05:23:19',1,'2006-02-15 21:30:53'),(4124,'2005-07-07 07:19:54',2856,330,'2005-07-11 05:54:54',1,'2006-02-15 21:30:53'),(4125,'2005-07-07 07:20:29',4131,269,'2005-07-15 06:41:29',2,'2006-02-15 21:30:53'),(4126,'2005-07-07 07:24:11',3018,163,'2005-07-15 07:31:11',1,'2006-02-15 21:30:53'),(4127,'2005-07-07 07:26:19',1774,15,'2005-07-14 07:50:19',2,'2006-02-15 21:30:53'),(4128,'2005-07-07 07:35:25',3563,492,'2005-07-14 08:13:25',1,'2006-02-15 21:30:53'),(4129,'2005-07-07 07:37:03',1413,592,'2005-07-14 13:31:03',1,'2006-02-15 21:30:53'),(4130,'2005-07-07 07:51:53',4170,256,'2005-07-11 12:41:53',2,'2006-02-15 21:30:53'),(4131,'2005-07-07 07:53:18',2621,58,'2005-07-08 04:48:18',1,'2006-02-15 21:30:53'),(4132,'2005-07-07 08:06:07',993,154,'2005-07-10 14:04:07',1,'2006-02-15 21:30:53'),(4133,'2005-07-07 08:12:26',3672,488,'2005-07-16 03:43:26',1,'2006-02-15 21:30:53'),(4134,'2005-07-07 08:14:24',2917,183,'2005-07-09 10:42:24',1,'2006-02-15 21:30:53'),(4135,'2005-07-07 08:15:03',3384,36,'2005-07-11 10:56:03',1,'2006-02-15 21:30:53'),(4136,'2005-07-07 08:15:52',3461,203,'2005-07-10 04:22:52',2,'2006-02-15 21:30:53'),(4137,'2005-07-07 08:17:06',2065,485,'2005-07-11 10:52:06',2,'2006-02-15 21:30:53'),(4138,'2005-07-07 08:17:13',1588,317,'2005-07-14 05:18:13',2,'2006-02-15 21:30:53'),(4139,'2005-07-07 08:17:35',2094,509,'2005-07-14 14:01:35',2,'2006-02-15 21:30:53'),(4140,'2005-07-07 08:19:10',1897,190,'2005-07-14 07:27:10',2,'2006-02-15 21:30:53'),(4141,'2005-07-07 08:19:20',1904,456,'2005-07-11 06:54:20',1,'2006-02-15 21:30:53'),(4142,'2005-07-07 08:19:45',4045,492,'2005-07-08 13:55:45',1,'2006-02-15 21:30:53'),(4143,'2005-07-07 08:22:07',597,238,'2005-07-13 11:42:07',1,'2006-02-15 21:30:53'),(4144,'2005-07-07 08:25:44',550,431,'2005-07-16 13:10:44',2,'2006-02-15 21:30:53'),(4145,'2005-07-07 08:26:39',3050,592,'2005-07-16 12:54:39',2,'2006-02-15 21:30:53'),(4146,'2005-07-07 08:30:16',176,411,'2005-07-12 07:52:16',1,'2006-02-15 21:30:53'),(4147,'2005-07-07 08:32:12',2776,274,'2005-07-12 10:10:12',2,'2006-02-15 21:30:53'),(4148,'2005-07-07 08:36:58',260,59,'2005-07-09 05:51:58',1,'2006-02-15 21:30:53'),(4149,'2005-07-07 08:40:17',3028,50,'2005-07-10 02:58:17',2,'2006-02-15 21:30:53'),(4150,'2005-07-07 08:43:22',4424,188,'2005-07-08 05:21:22',2,'2006-02-15 21:30:53'),(4151,'2005-07-07 08:49:02',4564,428,'2005-07-11 05:19:02',1,'2006-02-15 21:30:53'),(4152,'2005-07-07 08:50:33',1761,89,'2005-07-14 10:56:33',2,'2006-02-15 21:30:53'),(4153,'2005-07-07 08:53:08',2185,299,'2005-07-11 05:09:08',2,'2006-02-15 21:30:53'),(4154,'2005-07-07 08:58:23',191,594,'2005-07-14 03:16:23',2,'2006-02-15 21:30:53'),(4155,'2005-07-07 09:00:49',212,548,'2005-07-13 10:59:49',2,'2006-02-15 21:30:53'),(4156,'2005-07-07 09:03:51',1259,585,'2005-07-12 09:46:51',2,'2006-02-15 21:30:53'),(4157,'2005-07-07 09:04:26',304,183,'2005-07-08 09:55:26',1,'2006-02-15 21:30:53'),(4158,'2005-07-07 09:05:42',291,433,'2005-07-09 04:28:42',1,'2006-02-15 21:30:53'),(4159,'2005-07-07 09:10:57',3625,62,'2005-07-09 10:19:57',2,'2006-02-15 21:30:53'),(4160,'2005-07-07 09:13:17',1909,326,'2005-07-15 11:50:17',2,'2006-02-15 21:30:53'),(4161,'2005-07-07 09:15:11',4021,216,'2005-07-15 06:59:11',1,'2006-02-15 21:30:53'),(4162,'2005-07-07 09:17:26',745,571,'2005-07-15 10:15:26',2,'2006-02-15 21:30:53'),(4163,'2005-07-07 09:19:28',3176,376,'2005-07-10 06:47:28',2,'2006-02-15 21:30:53'),(4164,'2005-07-07 09:20:11',3133,295,'2005-07-14 09:35:11',1,'2006-02-15 21:30:53'),(4165,'2005-07-07 09:23:27',3845,66,'2005-07-15 06:00:27',1,'2006-02-15 21:30:53'),(4166,'2005-07-07 09:33:30',3267,376,'2005-07-16 06:06:30',1,'2006-02-15 21:30:53'),(4167,'2005-07-07 09:37:08',3771,175,'2005-07-16 06:16:08',2,'2006-02-15 21:30:53'),(4168,'2005-07-07 09:37:24',1872,132,'2005-07-09 14:32:24',2,'2006-02-15 21:30:53'),(4169,'2005-07-07 09:39:18',3360,580,'2005-07-11 13:43:18',1,'2006-02-15 21:30:53'),(4170,'2005-07-07 09:44:36',2665,99,'2005-07-13 14:10:36',1,'2006-02-15 21:30:53'),(4171,'2005-07-07 09:49:04',4199,476,'2005-07-14 03:58:04',2,'2006-02-15 21:30:53'),(4172,'2005-07-07 09:49:09',1158,309,'2005-07-11 15:14:09',2,'2006-02-15 21:30:53'),(4173,'2005-07-07 09:57:26',4272,320,'2005-07-10 04:05:26',1,'2006-02-15 21:30:53'),(4174,'2005-07-07 09:59:49',3814,182,'2005-07-11 13:34:49',1,'2006-02-15 21:30:53'),(4175,'2005-07-07 10:02:03',1979,8,'2005-07-10 06:09:03',2,'2006-02-15 21:30:53'),(4176,'2005-07-07 10:03:34',2745,420,'2005-07-16 08:43:34',1,'2006-02-15 21:30:53'),(4177,'2005-07-07 10:12:36',4106,317,'2005-07-15 15:48:36',2,'2006-02-15 21:30:53'),(4178,'2005-07-07 10:14:31',2898,513,'2005-07-12 09:38:31',2,'2006-02-15 21:30:53'),(4179,'2005-07-07 10:17:15',559,75,'2005-07-10 05:12:15',2,'2006-02-15 21:30:53'),(4180,'2005-07-07 10:23:25',1704,3,'2005-07-10 13:18:25',1,'2006-02-15 21:30:53'),(4181,'2005-07-07 10:27:54',3725,598,'2005-07-13 06:09:54',1,'2006-02-15 21:30:53'),(4182,'2005-07-07 10:28:00',3080,256,'2005-07-08 12:50:00',1,'2006-02-15 21:30:53'),(4183,'2005-07-07 10:28:33',3342,479,'2005-07-15 12:29:33',1,'2006-02-15 21:30:53'),(4184,'2005-07-07 10:30:08',1022,468,'2005-07-14 12:56:08',1,'2006-02-15 21:30:53'),(4185,'2005-07-07 10:31:05',2425,395,'2005-07-13 05:30:05',2,'2006-02-15 21:30:53'),(4186,'2005-07-07 10:32:25',3910,185,'2005-07-15 06:22:25',1,'2006-02-15 21:30:53'),(4187,'2005-07-07 10:41:31',2,161,'2005-07-11 06:25:31',1,'2006-02-15 21:30:53'),(4188,'2005-07-07 10:45:29',3243,391,'2005-07-16 09:39:29',1,'2006-02-15 21:30:53'),(4189,'2005-07-07 10:51:07',1492,386,'2005-07-14 14:46:07',2,'2006-02-15 21:30:53'),(4190,'2005-07-07 10:52:39',826,349,'2005-07-11 13:19:39',1,'2006-02-15 21:30:53'),(4191,'2005-07-07 10:56:14',2475,390,'2005-07-11 09:56:14',1,'2006-02-15 21:30:53'),(4192,'2005-07-07 10:57:06',624,558,'2005-07-13 16:30:06',1,'2006-02-15 21:30:53'),(4193,'2005-07-07 10:57:21',3791,445,'2005-07-09 07:33:21',2,'2006-02-15 21:30:53'),(4194,'2005-07-07 10:59:39',1753,153,'2005-07-15 09:34:39',1,'2006-02-15 21:30:53'),(4195,'2005-07-07 11:00:02',450,455,'2005-07-14 16:54:02',1,'2006-02-15 21:30:53'),(4196,'2005-07-07 11:06:33',3407,564,'2005-07-14 13:46:33',1,'2006-02-15 21:30:53'),(4197,'2005-07-07 11:07:52',2515,324,'2005-07-10 10:19:52',1,'2006-02-15 21:30:53'),(4198,'2005-07-07 11:08:11',333,247,'2005-07-16 15:29:11',1,'2006-02-15 21:30:53'),(4199,'2005-07-07 11:13:07',2120,259,'2005-07-11 07:17:07',1,'2006-02-15 21:30:53'),(4200,'2005-07-07 11:15:11',1097,292,'2005-07-11 11:46:11',2,'2006-02-15 21:30:53'),(4201,'2005-07-07 11:19:51',3682,145,'2005-07-16 08:48:51',1,'2006-02-15 21:30:53'),(4202,'2005-07-07 11:23:48',2274,38,'2005-07-16 16:32:48',1,'2006-02-15 21:30:53'),(4203,'2005-07-07 11:24:14',2743,189,'2005-07-11 16:26:14',1,'2006-02-15 21:30:53'),(4204,'2005-07-07 11:24:18',1513,569,'2005-07-15 12:42:18',1,'2006-02-15 21:30:53'),(4205,'2005-07-07 11:25:39',3922,486,'2005-07-11 06:12:39',1,'2006-02-15 21:30:53'),(4206,'2005-07-07 11:32:16',1557,448,'2005-07-14 13:07:16',2,'2006-02-15 21:30:53'),(4207,'2005-07-07 11:32:45',1119,588,'2005-07-14 05:49:45',2,'2006-02-15 21:30:53'),(4208,'2005-07-07 11:34:22',3617,441,'2005-07-09 08:25:22',1,'2006-02-15 21:30:53'),(4209,'2005-07-07 11:35:08',2010,100,'2005-07-10 10:58:08',1,'2006-02-15 21:30:53'),(4210,'2005-07-07 11:36:20',1972,581,'2005-07-16 12:38:20',1,'2006-02-15 21:30:53'),(4211,'2005-07-07 11:50:41',2001,214,'2005-07-09 13:58:41',2,'2006-02-15 21:30:53'),(4212,'2005-07-07 11:53:14',1825,574,'2005-07-09 07:12:14',1,'2006-02-15 21:30:53'),(4213,'2005-07-07 11:53:49',705,103,'2005-07-13 07:51:49',1,'2006-02-15 21:30:53'),(4214,'2005-07-07 11:54:33',2534,484,'2005-07-08 10:49:33',2,'2006-02-15 21:30:53'),(4215,'2005-07-07 12:00:52',1239,22,'2005-07-11 15:14:52',2,'2006-02-15 21:30:53'),(4216,'2005-07-07 12:01:34',1216,467,'2005-07-08 09:59:34',1,'2006-02-15 21:30:53'),(4217,'2005-07-07 12:08:59',3186,228,'2005-07-11 15:07:59',2,'2006-02-15 21:30:53'),(4218,'2005-07-07 12:10:24',152,497,'2005-07-15 16:09:24',1,'2006-02-15 21:30:53'),(4219,'2005-07-07 12:11:22',2800,16,'2005-07-11 11:05:22',1,'2006-02-15 21:30:53'),(4220,'2005-07-07 12:12:36',821,513,'2005-07-10 13:37:36',1,'2006-02-15 21:30:53'),(4221,'2005-07-07 12:18:57',4567,143,'2005-07-12 09:47:57',2,'2006-02-15 21:30:53'),(4222,'2005-07-07 12:20:21',2053,467,'2005-07-11 11:09:21',2,'2006-02-15 21:30:53'),(4223,'2005-07-07 12:23:54',2407,405,'2005-07-10 14:46:54',2,'2006-02-15 21:30:53'),(4224,'2005-07-07 12:24:21',3659,419,'2005-07-10 11:48:21',1,'2006-02-15 21:30:53'),(4225,'2005-07-07 12:24:37',1766,377,'2005-07-12 06:47:37',2,'2006-02-15 21:30:53'),(4226,'2005-07-07 12:37:56',1692,57,'2005-07-09 08:48:56',2,'2006-02-15 21:30:53'),(4227,'2005-07-07 12:41:36',4186,78,'2005-07-15 12:33:36',1,'2006-02-15 21:30:53'),(4228,'2005-07-07 12:42:02',1020,38,'2005-07-12 10:52:02',1,'2006-02-15 21:30:53'),(4229,'2005-07-07 12:43:23',953,106,'2005-07-13 15:00:23',2,'2006-02-15 21:30:53'),(4230,'2005-07-07 12:46:47',353,205,'2005-07-15 06:52:47',1,'2006-02-15 21:30:53'),(4231,'2005-07-07 12:48:19',3522,194,'2005-07-13 18:45:19',1,'2006-02-15 21:30:53'),(4232,'2005-07-07 12:49:12',3841,347,'2005-07-15 16:45:12',1,'2006-02-15 21:30:53'),(4233,'2005-07-07 13:00:20',1849,488,'2005-07-13 16:37:20',1,'2006-02-15 21:30:53'),(4234,'2005-07-07 13:01:35',1179,195,'2005-07-15 13:05:35',1,'2006-02-15 21:30:53'),(4235,'2005-07-07 13:05:52',3525,86,'2005-07-10 12:17:52',2,'2006-02-15 21:30:53'),(4236,'2005-07-07 13:12:07',642,213,'2005-07-08 15:00:07',2,'2006-02-15 21:30:53'),(4237,'2005-07-07 13:16:55',3773,477,'2005-07-15 16:33:55',1,'2006-02-15 21:30:53'),(4238,'2005-07-07 13:22:20',3024,7,'2005-07-10 07:44:20',2,'2006-02-15 21:30:53'),(4239,'2005-07-07 13:23:17',3866,122,'2005-07-13 17:49:17',1,'2006-02-15 21:30:53'),(4240,'2005-07-07 13:33:12',1024,65,'2005-07-13 12:28:12',1,'2006-02-15 21:30:53'),(4241,'2005-07-07 13:39:00',4154,595,'2005-07-12 17:49:00',2,'2006-02-15 21:30:53'),(4242,'2005-07-07 13:39:01',3626,286,'2005-07-12 18:29:01',1,'2006-02-15 21:30:53'),(4243,'2005-07-07 13:39:58',4559,339,'2005-07-12 19:27:58',1,'2006-02-15 21:30:53'),(4244,'2005-07-07 13:41:58',592,581,'2005-07-09 15:32:58',2,'2006-02-15 21:30:53'),(4245,'2005-07-07 13:48:33',3743,91,'2005-07-10 09:54:33',1,'2006-02-15 21:30:53'),(4246,'2005-07-07 13:49:03',1141,411,'2005-07-09 13:01:03',1,'2006-02-15 21:30:53'),(4247,'2005-07-07 13:51:54',808,539,'2005-07-10 09:43:54',2,'2006-02-15 21:30:53'),(4248,'2005-07-07 13:59:20',773,161,'2005-07-14 15:18:20',2,'2006-02-15 21:30:53'),(4249,'2005-07-07 14:05:17',4185,111,'2005-07-10 09:21:17',2,'2006-02-15 21:30:53'),(4250,'2005-07-07 14:08:11',2556,423,'2005-07-13 08:09:11',2,'2006-02-15 21:30:53'),(4251,'2005-07-07 14:11:55',3541,367,'2005-07-16 14:01:55',2,'2006-02-15 21:30:53'),(4252,'2005-07-07 14:13:05',474,154,'2005-07-09 14:17:05',1,'2006-02-15 21:30:53'),(4253,'2005-07-07 14:13:13',3355,157,'2005-07-16 18:55:13',2,'2006-02-15 21:30:53'),(4254,'2005-07-07 14:13:52',3957,529,'2005-07-12 10:39:52',2,'2006-02-15 21:30:53'),(4255,'2005-07-07 14:14:13',749,10,'2005-07-12 18:32:13',1,'2006-02-15 21:30:53'),(4256,'2005-07-07 14:14:36',1386,129,'2005-07-10 09:41:36',1,'2006-02-15 21:30:53'),(4257,'2005-07-07 14:18:41',3927,553,'2005-07-08 14:58:41',1,'2006-02-15 21:30:53'),(4258,'2005-07-07 14:20:59',1562,492,'2005-07-16 10:03:59',1,'2006-02-15 21:30:53'),(4259,'2005-07-07 14:22:18',4378,467,'2005-07-11 19:38:18',1,'2006-02-15 21:30:53'),(4260,'2005-07-07 14:22:45',4575,305,'2005-07-08 15:10:45',2,'2006-02-15 21:30:53'),(4261,'2005-07-07 14:23:56',1405,496,'2005-07-13 15:26:56',1,'2006-02-15 21:30:53'),(4262,'2005-07-07 14:24:30',3122,29,'2005-07-14 13:12:30',1,'2006-02-15 21:30:53'),(4263,'2005-07-07 14:24:44',2975,16,'2005-07-13 18:22:44',1,'2006-02-15 21:30:53'),(4264,'2005-07-07 14:25:28',3499,406,'2005-07-08 08:49:28',2,'2006-02-15 21:30:53'),(4265,'2005-07-07 14:27:51',1685,69,'2005-07-12 19:55:51',2,'2006-02-15 21:30:53'),(4266,'2005-07-07 14:34:50',1578,509,'2005-07-08 09:23:50',2,'2006-02-15 21:30:53'),(4267,'2005-07-07 14:35:30',136,410,'2005-07-11 10:41:30',1,'2006-02-15 21:30:53'),(4268,'2005-07-07 14:36:05',432,80,'2005-07-16 14:36:05',1,'2006-02-15 21:30:53'),(4269,'2005-07-07 14:38:33',415,496,'2005-07-09 10:27:33',1,'2006-02-15 21:30:53'),(4270,'2005-07-07 14:38:41',183,210,'2005-07-10 19:07:41',2,'2006-02-15 21:30:53'),(4271,'2005-07-07 14:38:52',533,150,'2005-07-15 12:05:52',1,'2006-02-15 21:30:53'),(4272,'2005-07-07 14:39:20',488,120,'2005-07-13 08:57:20',2,'2006-02-15 21:30:53'),(4273,'2005-07-07 14:40:22',4163,159,'2005-07-13 09:58:22',2,'2006-02-15 21:30:53'),(4274,'2005-07-07 14:42:04',787,26,'2005-07-13 20:23:04',1,'2006-02-15 21:30:53'),(4275,'2005-07-07 14:43:51',1167,393,'2005-07-15 18:04:51',2,'2006-02-15 21:30:53'),(4276,'2005-07-07 14:50:59',221,366,'2005-07-09 15:42:59',2,'2006-02-15 21:30:53'),(4277,'2005-07-07 14:52:12',1983,106,'2005-07-09 13:10:12',1,'2006-02-15 21:30:53'),(4278,'2005-07-07 14:53:24',3693,6,'2005-07-13 14:21:24',2,'2006-02-15 21:30:53'),(4279,'2005-07-07 15:01:53',581,335,'2005-07-08 09:43:53',1,'2006-02-15 21:30:53'),(4280,'2005-07-07 15:09:31',1115,593,'2005-07-13 14:47:31',1,'2006-02-15 21:30:53'),(4281,'2005-07-07 15:17:50',1182,321,'2005-07-08 11:42:50',2,'2006-02-15 21:30:53'),(4282,'2005-07-07 15:26:31',3134,25,'2005-07-11 14:27:31',1,'2006-02-15 21:30:53'),(4283,'2005-07-07 15:29:35',2807,477,'2005-07-11 17:12:35',1,'2006-02-15 21:30:53'),(4284,'2005-07-07 15:31:57',1313,521,'2005-07-09 10:20:57',2,'2006-02-15 21:30:53'),(4285,'2005-07-07 15:34:35',511,308,'2005-07-15 09:43:35',2,'2006-02-15 21:30:53'),(4286,'2005-07-07 15:36:44',4496,111,'2005-07-11 13:04:44',2,'2006-02-15 21:30:53'),(4287,'2005-07-07 15:37:31',3558,94,'2005-07-16 19:59:31',2,'2006-02-15 21:30:53'),(4288,'2005-07-07 15:38:25',1508,64,'2005-07-13 16:23:25',2,'2006-02-15 21:30:53'),(4289,'2005-07-07 15:45:58',3172,231,'2005-07-09 11:11:58',2,'2006-02-15 21:30:53'),(4290,'2005-07-07 15:47:10',4174,277,'2005-07-15 15:03:10',1,'2006-02-15 21:30:53'),(4291,'2005-07-07 15:47:47',2074,298,'2005-07-10 11:45:47',1,'2006-02-15 21:30:53'),(4292,'2005-07-07 15:48:38',3084,401,'2005-07-15 17:53:38',1,'2006-02-15 21:30:53'),(4293,'2005-07-07 15:53:47',984,221,'2005-07-10 18:11:47',1,'2006-02-15 21:30:53'),(4294,'2005-07-07 15:56:23',2845,41,'2005-07-15 14:50:23',2,'2006-02-15 21:30:53'),(4295,'2005-07-07 16:08:51',2490,319,'2005-07-13 13:06:51',2,'2006-02-15 21:30:53'),(4296,'2005-07-07 16:16:03',977,407,'2005-07-08 20:16:03',2,'2006-02-15 21:30:53'),(4297,'2005-07-07 16:24:09',882,141,'2005-07-13 15:08:09',2,'2006-02-15 21:30:53'),(4298,'2005-07-07 16:27:25',1055,560,'2005-07-12 18:20:25',1,'2006-02-15 21:30:53'),(4299,'2005-07-07 16:33:48',870,80,'2005-07-16 11:48:48',1,'2006-02-15 21:30:53'),(4300,'2005-07-07 16:36:16',1189,38,'2005-07-10 13:59:16',2,'2006-02-15 21:30:53'),(4301,'2005-07-07 16:37:23',1630,440,'2005-07-11 18:05:23',2,'2006-02-15 21:30:53'),(4302,'2005-07-07 16:47:53',3669,332,'2005-07-16 22:22:53',2,'2006-02-15 21:30:53'),(4303,'2005-07-07 16:57:32',818,108,'2005-07-14 17:42:32',2,'2006-02-15 21:30:53'),(4304,'2005-07-07 17:01:19',3382,165,'2005-07-12 22:47:19',2,'2006-02-15 21:30:53'),(4305,'2005-07-07 17:07:11',3926,240,'2005-07-08 16:15:11',2,'2006-02-15 21:30:53'),(4306,'2005-07-07 17:12:32',1219,210,'2005-07-16 11:24:32',2,'2006-02-15 21:30:53'),(4307,'2005-07-07 17:20:39',2827,394,'2005-07-16 14:42:39',1,'2006-02-15 21:30:53'),(4308,'2005-07-07 17:29:16',1482,168,'2005-07-11 21:47:16',1,'2006-02-15 21:30:53'),(4309,'2005-07-07 17:29:41',3549,209,'2005-07-14 22:22:41',2,'2006-02-15 21:30:53'),(4310,'2005-07-07 17:30:56',3842,390,'2005-07-12 13:19:56',2,'2006-02-15 21:30:53'),(4311,'2005-07-07 17:31:14',2985,498,'2005-07-11 19:21:14',2,'2006-02-15 21:30:53'),(4312,'2005-07-07 17:34:59',3870,97,'2005-07-09 17:45:59',2,'2006-02-15 21:30:53'),(4313,'2005-07-07 17:36:56',91,29,'2005-07-13 12:00:56',1,'2006-02-15 21:30:53'),(4314,'2005-07-07 17:38:31',539,184,'2005-07-09 20:24:31',1,'2006-02-15 21:30:53'),(4315,'2005-07-07 17:40:26',1472,195,'2005-07-09 22:58:26',2,'2006-02-15 21:30:53'),(4316,'2005-07-07 17:44:22',517,301,'2005-07-14 15:12:22',2,'2006-02-15 21:30:53'),(4317,'2005-07-07 17:44:49',2234,110,'2005-07-08 21:48:49',2,'2006-02-15 21:30:53'),(4318,'2005-07-07 17:47:50',1607,321,'2005-07-14 12:15:50',2,'2006-02-15 21:30:53'),(4319,'2005-07-07 17:50:27',3389,25,'2005-07-10 13:53:27',2,'2006-02-15 21:30:53'),(4320,'2005-07-07 17:51:59',3437,376,'2005-07-13 18:39:59',1,'2006-02-15 21:30:53'),(4321,'2005-07-07 17:52:38',612,91,'2005-07-11 23:37:38',1,'2006-02-15 21:30:53'),(4322,'2005-07-07 17:54:37',1522,568,'2005-07-14 13:56:37',1,'2006-02-15 21:30:53'),(4323,'2005-07-07 17:55:53',1287,336,'2005-07-13 16:43:53',2,'2006-02-15 21:30:53'),(4324,'2005-07-07 17:57:56',952,226,'2005-07-13 22:34:56',1,'2006-02-15 21:30:53'),(4325,'2005-07-07 17:59:24',3728,373,'2005-07-16 17:10:24',2,'2006-02-15 21:30:53'),(4326,'2005-07-07 18:01:22',4037,331,'2005-07-16 15:45:22',1,'2006-02-15 21:30:53'),(4327,'2005-07-07 18:01:39',860,73,'2005-07-12 22:40:39',1,'2006-02-15 21:30:53'),(4328,'2005-07-07 18:03:17',2174,264,'2005-07-14 16:14:17',1,'2006-02-15 21:30:53'),(4329,'2005-07-07 18:04:16',638,504,'2005-07-15 17:58:16',2,'2006-02-15 21:30:53'),(4330,'2005-07-07 18:09:41',2408,408,'2005-07-14 22:05:41',1,'2006-02-15 21:30:53'),(4331,'2005-07-07 18:22:30',419,535,'2005-07-13 18:20:30',1,'2006-02-15 21:30:53'),(4332,'2005-07-07 18:25:26',1714,137,'2005-07-16 15:05:26',1,'2006-02-15 21:30:53'),(4333,'2005-07-07 18:31:50',76,113,'2005-07-08 21:26:50',1,'2006-02-15 21:30:53'),(4334,'2005-07-07 18:32:04',3021,210,'2005-07-08 16:19:04',1,'2006-02-15 21:30:53'),(4335,'2005-07-07 18:33:57',1332,375,'2005-07-11 13:23:57',1,'2006-02-15 21:30:53'),(4336,'2005-07-07 18:34:36',482,532,'2005-07-10 17:58:36',2,'2006-02-15 21:30:53'),(4337,'2005-07-07 18:36:37',2313,464,'2005-07-14 14:59:37',2,'2006-02-15 21:30:53'),(4338,'2005-07-07 18:39:56',3152,581,'2005-07-12 21:03:56',1,'2006-02-15 21:30:53'),(4339,'2005-07-07 18:41:42',3215,130,'2005-07-08 13:00:42',1,'2006-02-15 21:30:53'),(4340,'2005-07-07 18:41:46',3919,227,'2005-07-16 21:27:46',1,'2006-02-15 21:30:53'),(4341,'2005-07-07 18:44:23',4523,124,'2005-07-15 18:13:23',1,'2006-02-15 21:30:53'),(4342,'2005-07-07 18:47:03',1355,120,'2005-07-09 21:59:03',2,'2006-02-15 21:30:53'),(4343,'2005-07-07 18:48:54',1926,293,'2005-07-12 15:19:54',1,'2006-02-15 21:30:53'),(4344,'2005-07-07 18:50:47',1185,99,'2005-07-12 16:38:47',2,'2006-02-15 21:30:53'),(4345,'2005-07-07 18:52:57',2235,225,'2005-07-15 21:24:57',2,'2006-02-15 21:30:53'),(4346,'2005-07-07 18:58:45',1906,520,'2005-07-10 16:37:45',1,'2006-02-15 21:30:53'),(4347,'2005-07-07 18:58:57',1964,344,'2005-07-14 16:35:57',2,'2006-02-15 21:30:53'),(4348,'2005-07-07 19:02:05',1948,452,'2005-07-09 20:51:05',2,'2006-02-15 21:30:53'),(4349,'2005-07-07 19:02:37',3430,182,'2005-07-09 17:25:37',2,'2006-02-15 21:30:53'),(4350,'2005-07-07 19:02:41',2223,299,'2005-07-09 15:27:41',1,'2006-02-15 21:30:53'),(4351,'2005-07-07 19:04:24',3567,382,'2005-07-14 00:03:24',2,'2006-02-15 21:30:53'),(4352,'2005-07-07 19:15:58',2636,249,'2005-07-16 20:22:58',2,'2006-02-15 21:30:53'),(4353,'2005-07-07 19:19:05',368,452,'2005-07-13 13:40:05',1,'2006-02-15 21:30:53'),(4354,'2005-07-07 19:21:02',4423,208,'2005-07-15 17:03:02',2,'2006-02-15 21:30:53'),(4355,'2005-07-07 19:21:19',4557,438,'2005-07-09 00:55:19',2,'2006-02-15 21:30:53'),(4356,'2005-07-07 19:21:22',1907,318,'2005-07-16 15:57:22',1,'2006-02-15 21:30:53'),(4357,'2005-07-07 19:24:39',3413,103,'2005-07-12 00:11:39',1,'2006-02-15 21:30:53'),(4358,'2005-07-07 19:27:04',3136,446,'2005-07-14 23:46:04',1,'2006-02-15 21:30:53'),(4359,'2005-07-07 19:30:20',3222,282,'2005-07-09 13:34:20',1,'2006-02-15 21:30:53'),(4360,'2005-07-07 19:31:12',1811,92,'2005-07-10 23:11:12',2,'2006-02-15 21:30:53'),(4361,'2005-07-07 19:33:23',116,425,'2005-07-12 22:36:23',1,'2006-02-15 21:30:53'),(4362,'2005-07-07 19:35:30',3759,425,'2005-07-14 14:59:30',1,'2006-02-15 21:30:53'),(4363,'2005-07-07 19:43:28',3202,168,'2005-07-13 00:15:28',2,'2006-02-15 21:30:53'),(4364,'2005-07-07 19:46:51',10,145,'2005-07-08 21:55:51',1,'2006-02-15 21:30:53'),(4365,'2005-07-07 19:47:46',3207,442,'2005-07-08 23:21:46',2,'2006-02-15 21:30:53'),(4366,'2005-07-07 19:48:36',2961,524,'2005-07-14 01:14:36',1,'2006-02-15 21:30:53'),(4367,'2005-07-07 19:52:01',4529,48,'2005-07-13 19:41:01',2,'2006-02-15 21:30:53'),(4368,'2005-07-07 19:55:19',736,324,'2005-07-09 00:11:19',1,'2006-02-15 21:30:53'),(4369,'2005-07-07 20:01:38',3552,517,'2005-07-13 01:19:38',2,'2006-02-15 21:30:53'),(4370,'2005-07-07 20:05:36',1591,559,'2005-07-16 23:58:36',1,'2006-02-15 21:30:53'),(4371,'2005-07-07 20:06:45',2533,90,'2005-07-08 18:50:45',1,'2006-02-15 21:30:53'),(4372,'2005-07-07 20:09:01',2207,252,'2005-07-09 18:24:01',1,'2006-02-15 21:30:53'),(4373,'2005-07-07 20:10:59',3593,470,'2005-07-12 21:30:59',2,'2006-02-15 21:30:53'),(4374,'2005-07-07 20:13:58',4377,517,'2005-07-11 18:11:58',2,'2006-02-15 21:30:53'),(4375,'2005-07-07 20:20:29',3035,560,'2005-07-16 19:29:29',2,'2006-02-15 21:30:53'),(4376,'2005-07-07 20:24:33',1344,151,'2005-07-11 18:32:33',1,'2006-02-15 21:30:53'),(4377,'2005-07-07 20:28:57',3294,205,'2005-07-16 02:13:57',2,'2006-02-15 21:30:53'),(4378,'2005-07-07 20:29:08',1244,24,'2005-07-12 19:17:08',2,'2006-02-15 21:30:53'),(4379,'2005-07-07 20:32:30',2773,316,'2005-07-11 20:40:30',2,'2006-02-15 21:30:53'),(4380,'2005-07-07 20:35:00',3164,353,'2005-07-14 17:06:00',1,'2006-02-15 21:30:53'),(4381,'2005-07-07 20:37:53',3727,486,'2005-07-10 16:54:53',1,'2006-02-15 21:30:53'),(4382,'2005-07-07 20:41:03',657,26,'2005-07-14 15:15:03',1,'2006-02-15 21:30:53'),(4383,'2005-07-07 20:45:51',2649,591,'2005-07-17 00:52:51',2,'2006-02-15 21:30:53'),(4384,'2005-07-07 20:46:45',1178,59,'2005-07-16 21:54:45',1,'2006-02-15 21:30:53'),(4385,'2005-07-07 20:48:38',849,564,'2005-07-11 17:03:38',2,'2006-02-15 21:30:53'),(4386,'2005-07-07 20:55:19',499,314,'2005-07-10 21:51:19',1,'2006-02-15 21:30:53'),(4387,'2005-07-07 20:56:47',591,335,'2005-07-16 00:51:47',1,'2006-02-15 21:30:53'),(4388,'2005-07-07 20:58:03',3150,210,'2005-07-16 20:05:03',2,'2006-02-15 21:30:53'),(4389,'2005-07-07 20:58:58',1672,166,'2005-07-13 19:57:58',2,'2006-02-15 21:30:53'),(4390,'2005-07-07 20:59:06',6,44,'2005-07-09 00:04:06',2,'2006-02-15 21:30:53'),(4391,'2005-07-07 21:09:38',2135,42,'2005-07-09 17:35:38',1,'2006-02-15 21:30:53'),(4392,'2005-07-07 21:11:02',4236,491,'2005-07-13 21:52:02',1,'2006-02-15 21:30:53'),(4393,'2005-07-07 21:12:36',4034,395,'2005-07-09 22:41:36',2,'2006-02-15 21:30:53'),(4394,'2005-07-07 21:12:45',563,156,'2005-07-16 18:24:45',2,'2006-02-15 21:30:53'),(4395,'2005-07-07 21:13:22',360,544,'2005-07-08 22:59:22',2,'2006-02-15 21:30:53'),(4396,'2005-07-07 21:14:19',750,275,'2005-07-10 19:22:19',1,'2006-02-15 21:30:53'),(4397,'2005-07-07 21:14:54',3085,494,'2005-07-13 19:24:54',2,'2006-02-15 21:30:53'),(4398,'2005-07-07 21:18:44',3628,426,'2005-07-10 22:45:44',1,'2006-02-15 21:30:53'),(4399,'2005-07-07 21:20:28',4515,402,'2005-07-12 20:57:28',2,'2006-02-15 21:30:53'),(4400,'2005-07-07 21:22:26',49,370,'2005-07-16 00:59:26',2,'2006-02-15 21:30:53'),(4401,'2005-07-07 21:26:27',2725,405,'2005-07-12 17:18:27',2,'2006-02-15 21:30:53'),(4402,'2005-07-07 21:28:46',1198,26,'2005-07-08 17:04:46',1,'2006-02-15 21:30:53'),(4403,'2005-07-07 21:29:40',3973,447,'2005-07-09 17:58:40',1,'2006-02-15 21:30:53'),(4404,'2005-07-07 21:31:53',944,25,'2005-07-13 19:00:53',1,'2006-02-15 21:30:53'),(4405,'2005-07-07 21:33:16',2102,145,'2005-07-15 00:33:16',2,'2006-02-15 21:30:53'),(4406,'2005-07-07 21:35:16',438,448,'2005-07-15 16:13:16',2,'2006-02-15 21:30:53'),(4407,'2005-07-07 21:39:45',267,20,'2005-07-11 23:40:45',1,'2006-02-15 21:30:53'),(4408,'2005-07-07 21:41:06',2482,258,'2005-07-11 00:32:06',1,'2006-02-15 21:30:53'),(4409,'2005-07-07 21:47:29',3153,8,'2005-07-11 20:14:29',2,'2006-02-15 21:30:53'),(4410,'2005-07-07 21:48:16',2754,584,'2005-07-09 03:15:16',1,'2006-02-15 21:30:53'),(4411,'2005-07-07 21:54:58',320,224,'2005-07-14 16:14:58',2,'2006-02-15 21:30:53'),(4412,'2005-07-07 21:56:53',1181,282,'2005-07-11 19:28:53',1,'2006-02-15 21:30:53'),(4413,'2005-07-07 22:00:04',1062,565,'2005-07-10 18:20:04',2,'2006-02-15 21:30:53'),(4414,'2005-07-07 22:00:21',991,434,'2005-07-12 02:51:21',1,'2006-02-15 21:30:53'),(4415,'2005-07-07 22:01:43',1403,329,'2005-07-13 03:09:43',2,'2006-02-15 21:30:53'),(4416,'2005-07-07 22:04:36',1247,290,'2005-07-09 02:44:36',2,'2006-02-15 21:30:53'),(4417,'2005-07-07 22:05:05',743,452,'2005-07-09 16:16:05',2,'2006-02-15 21:30:53'),(4418,'2005-07-07 22:05:30',4368,417,'2005-07-11 18:42:30',1,'2006-02-15 21:30:53'),(4419,'2005-07-07 22:06:24',783,39,'2005-07-15 23:59:24',1,'2006-02-15 21:30:53'),(4420,'2005-07-07 22:07:31',4427,346,'2005-07-12 19:14:31',2,'2006-02-15 21:30:53'),(4421,'2005-07-07 22:07:55',4103,417,'2005-07-16 20:21:55',1,'2006-02-15 21:30:53'),(4422,'2005-07-07 22:09:45',1741,345,'2005-07-10 01:43:45',1,'2006-02-15 21:30:53'),(4423,'2005-07-07 22:11:28',2721,526,'2005-07-14 18:49:28',2,'2006-02-15 21:30:53'),(4424,'2005-07-07 22:14:43',662,384,'2005-07-11 01:17:43',1,'2006-02-15 21:30:53'),(4425,'2005-07-07 22:22:44',877,345,'2005-07-08 22:23:44',2,'2006-02-15 21:30:53'),(4426,'2005-07-07 22:28:32',364,242,'2005-07-16 02:04:32',1,'2006-02-15 21:30:53'),(4427,'2005-07-07 22:28:51',1021,69,'2005-07-11 21:37:51',2,'2006-02-15 21:30:53'),(4428,'2005-07-07 22:29:40',2575,181,'2005-07-11 02:46:40',2,'2006-02-15 21:30:53'),(4429,'2005-07-07 22:32:47',2949,187,'2005-07-15 03:10:47',2,'2006-02-15 21:30:53'),(4430,'2005-07-07 22:35:24',3436,278,'2005-07-14 23:49:24',1,'2006-02-15 21:30:53'),(4431,'2005-07-07 22:39:02',936,26,'2005-07-16 19:24:02',1,'2006-02-15 21:30:53'),(4432,'2005-07-07 22:40:02',2779,295,'2005-07-15 01:46:02',1,'2006-02-15 21:30:53'),(4433,'2005-07-07 22:45:41',88,449,'2005-07-16 23:30:41',2,'2006-02-15 21:30:53'),(4434,'2005-07-07 22:48:34',1801,32,'2005-07-09 18:55:34',1,'2006-02-15 21:30:53'),(4435,'2005-07-07 22:51:04',3815,157,'2005-07-14 23:15:04',2,'2006-02-15 21:30:53'),(4436,'2005-07-07 22:52:04',4326,563,'2005-07-10 04:51:04',1,'2006-02-15 21:30:53'),(4437,'2005-07-07 22:55:41',3578,414,'2005-07-13 19:40:41',1,'2006-02-15 21:30:53'),(4438,'2005-07-07 22:56:17',4371,104,'2005-07-16 17:28:17',1,'2006-02-15 21:30:53'),(4439,'2005-07-07 22:57:30',2393,521,'2005-07-10 18:28:30',1,'2006-02-15 21:30:53'),(4440,'2005-07-07 23:00:58',1236,507,'2005-07-08 21:31:58',2,'2006-02-15 21:30:53'),(4441,'2005-07-07 23:04:23',3680,211,'2005-07-13 19:07:23',1,'2006-02-15 21:30:53'),(4442,'2005-07-07 23:05:30',461,123,'2005-07-13 22:20:30',2,'2006-02-15 21:30:53'),(4443,'2005-07-07 23:05:53',72,389,'2005-07-16 01:46:53',1,'2006-02-15 21:30:53'),(4444,'2005-07-07 23:07:44',764,529,'2005-07-14 02:51:44',2,'2006-02-15 21:30:53'),(4445,'2005-07-07 23:08:22',3328,327,'2005-07-16 03:49:22',1,'2006-02-15 21:30:53'),(4446,'2005-07-07 23:12:16',2629,438,'2005-07-13 19:42:16',1,'2006-02-15 21:30:53'),(4447,'2005-07-07 23:15:28',404,549,'2005-07-14 22:53:28',2,'2006-02-15 21:30:53'),(4448,'2005-07-07 23:17:12',2768,536,'2005-07-13 18:26:12',1,'2006-02-15 21:30:53'),(4449,'2005-07-07 23:18:58',2813,354,'2005-07-15 20:40:58',2,'2006-02-15 21:30:53'),(4450,'2005-07-07 23:20:05',1252,345,'2005-07-13 19:50:05',2,'2006-02-15 21:30:53'),(4451,'2005-07-07 23:29:54',179,85,'2005-07-10 23:29:54',2,'2006-02-15 21:30:53'),(4452,'2005-07-07 23:31:54',2414,460,'2005-07-14 04:05:54',1,'2006-02-15 21:30:53'),(4453,'2005-07-07 23:32:39',89,560,'2005-07-12 01:38:39',2,'2006-02-15 21:30:53'),(4454,'2005-07-07 23:37:00',1395,9,'2005-07-11 02:30:00',1,'2006-02-15 21:30:53'),(4455,'2005-07-07 23:43:46',1396,507,'2005-07-08 21:34:46',2,'2006-02-15 21:30:53'),(4456,'2005-07-07 23:45:21',3395,421,'2005-07-13 23:03:21',2,'2006-02-15 21:30:53'),(4457,'2005-07-07 23:45:38',407,567,'2005-07-09 20:02:38',1,'2006-02-15 21:30:53'),(4458,'2005-07-07 23:47:47',1307,229,'2005-07-09 19:17:47',2,'2006-02-15 21:30:53'),(4459,'2005-07-07 23:48:52',3987,227,'2005-07-13 19:37:52',2,'2006-02-15 21:30:53'),(4460,'2005-07-07 23:50:14',4121,592,'2005-07-09 21:55:14',1,'2006-02-15 21:30:53'),(4461,'2005-07-07 23:59:43',3656,286,'2005-07-16 19:44:43',2,'2006-02-15 21:30:53'),(4462,'2005-07-08 00:02:49',4120,257,'2005-07-15 20:48:49',2,'2006-02-15 21:30:53'),(4463,'2005-07-08 00:04:59',4356,422,'2005-07-16 01:19:59',1,'2006-02-15 21:30:53'),(4464,'2005-07-08 00:07:18',4484,583,'2005-07-08 22:14:18',2,'2006-02-15 21:30:53'),(4465,'2005-07-08 00:07:45',2877,329,'2005-07-13 18:08:45',2,'2006-02-15 21:30:53'),(4466,'2005-07-08 00:12:53',3320,304,'2005-07-17 03:49:53',2,'2006-02-15 21:30:53'),(4467,'2005-07-08 00:13:52',4466,339,'2005-07-09 00:52:52',1,'2006-02-15 21:30:53'),(4468,'2005-07-08 00:17:59',3302,170,'2005-07-12 05:51:59',2,'2006-02-15 21:30:53'),(4469,'2005-07-08 00:18:32',2173,192,'2005-07-12 21:17:32',2,'2006-02-15 21:30:53'),(4470,'2005-07-08 00:20:57',3605,145,'2005-07-10 02:31:57',1,'2006-02-15 21:30:53'),(4471,'2005-07-08 00:21:29',263,30,'2005-07-11 18:48:29',2,'2006-02-15 21:30:53'),(4472,'2005-07-08 00:22:06',2089,343,'2005-07-16 20:16:06',1,'2006-02-15 21:30:53'),(4473,'2005-07-08 00:22:10',1387,481,'2005-07-09 21:11:10',1,'2006-02-15 21:30:53'),(4474,'2005-07-08 00:26:56',4474,137,'2005-07-12 23:07:56',1,'2006-02-15 21:30:53'),(4475,'2005-07-08 00:27:30',3466,340,'2005-07-09 05:39:30',1,'2006-02-15 21:30:53'),(4476,'2005-07-08 00:34:25',395,279,'2005-07-08 22:55:25',1,'2006-02-15 21:30:53'),(4477,'2005-07-08 00:38:24',1602,552,'2005-07-13 05:14:24',1,'2006-02-15 21:30:53'),(4478,'2005-07-08 00:39:08',1764,357,'2005-07-11 21:57:08',2,'2006-02-15 21:30:53'),(4479,'2005-07-08 00:52:35',3516,211,'2005-07-09 20:19:35',2,'2006-02-15 21:30:53'),(4480,'2005-07-08 00:56:30',4457,296,'2005-07-10 20:52:30',2,'2006-02-15 21:30:53'),(4481,'2005-07-08 00:58:15',1669,474,'2005-07-11 23:22:15',2,'2006-02-15 21:30:53'),(4482,'2005-07-08 01:01:18',3500,511,'2005-07-11 01:18:18',1,'2006-02-15 21:30:53'),(4483,'2005-07-08 01:03:12',1222,425,'2005-07-17 00:20:12',1,'2006-02-15 21:30:53'),(4484,'2005-07-08 01:05:57',2867,306,'2005-07-16 00:41:57',2,'2006-02-15 21:30:53'),(4485,'2005-07-08 01:07:54',2614,130,'2005-07-16 03:19:54',2,'2006-02-15 21:30:53'),(4486,'2005-07-08 01:09:09',837,197,'2005-07-16 23:40:09',1,'2006-02-15 21:30:53'),(4487,'2005-07-08 01:20:22',2220,360,'2005-07-16 21:23:22',2,'2006-02-15 21:30:53'),(4488,'2005-07-08 01:22:23',2108,89,'2005-07-13 21:17:23',1,'2006-02-15 21:30:53'),(4489,'2005-07-08 01:23:58',4306,259,'2005-07-09 01:35:58',2,'2006-02-15 21:30:53'),(4490,'2005-07-08 01:26:32',2690,161,'2005-07-09 01:13:32',1,'2006-02-15 21:30:53'),(4491,'2005-07-08 01:30:46',1168,413,'2005-07-11 03:12:46',1,'2006-02-15 21:30:53'),(4492,'2005-07-08 01:32:04',1152,247,'2005-07-10 22:11:04',1,'2006-02-15 21:30:53'),(4493,'2005-07-08 01:40:24',1369,167,'2005-07-09 02:17:24',2,'2006-02-15 21:30:53'),(4494,'2005-07-08 01:42:45',1655,349,'2005-07-16 22:29:45',2,'2006-02-15 21:30:53'),(4495,'2005-07-08 01:43:46',3515,404,'2005-07-10 07:38:46',1,'2006-02-15 21:30:53'),(4496,'2005-07-08 01:44:19',150,578,'2005-07-08 20:34:19',2,'2006-02-15 21:30:53'),(4497,'2005-07-08 01:51:32',1995,142,'2005-07-15 22:56:32',1,'2006-02-15 21:30:53'),(4498,'2005-07-08 02:07:50',4299,43,'2005-07-12 23:54:50',2,'2006-02-15 21:30:53'),(4499,'2005-07-08 02:08:48',851,199,'2005-07-10 07:06:48',2,'2006-02-15 21:30:53'),(4500,'2005-07-08 02:10:01',398,462,'2005-07-15 05:49:01',2,'2006-02-15 21:30:53'),(4501,'2005-07-08 02:12:00',1412,262,'2005-07-10 02:16:00',2,'2006-02-15 21:30:53'),(4502,'2005-07-08 02:12:04',225,470,'2005-07-15 02:19:04',2,'2006-02-15 21:30:53'),(4503,'2005-07-08 02:17:12',1503,8,'2005-07-13 08:12:12',1,'2006-02-15 21:30:53'),(4504,'2005-07-08 02:19:27',361,422,'2005-07-12 21:15:27',1,'2006-02-15 21:30:53'),(4505,'2005-07-08 02:20:04',1864,481,'2005-07-14 20:28:04',2,'2006-02-15 21:30:53'),(4506,'2005-07-08 02:22:18',1484,133,'2005-07-13 04:54:18',2,'2006-02-15 21:30:53'),(4507,'2005-07-08 02:22:45',819,505,'2005-07-14 20:53:45',1,'2006-02-15 21:30:53'),(4508,'2005-07-08 02:28:41',3996,97,'2005-07-16 23:59:41',1,'2006-02-15 21:30:53'),(4509,'2005-07-08 02:32:38',1760,230,'2005-07-14 01:05:38',2,'2006-02-15 21:30:53'),(4510,'2005-07-08 02:34:51',1085,27,'2005-07-17 06:03:51',2,'2006-02-15 21:30:53'),(4511,'2005-07-08 02:36:21',4438,75,'2005-07-15 06:01:21',1,'2006-02-15 21:30:53'),(4512,'2005-07-08 02:38:56',1569,424,'2005-07-10 20:46:56',1,'2006-02-15 21:30:53'),(4513,'2005-07-08 02:39:59',3704,182,'2005-07-14 07:48:59',2,'2006-02-15 21:30:53'),(4514,'2005-07-08 02:41:25',1938,576,'2005-07-15 06:17:25',1,'2006-02-15 21:30:53'),(4515,'2005-07-08 02:42:03',1998,229,'2005-07-10 07:22:03',2,'2006-02-15 21:30:53'),(4516,'2005-07-08 02:43:41',2314,497,'2005-07-14 02:20:41',1,'2006-02-15 21:30:53'),(4517,'2005-07-08 02:45:19',453,16,'2005-07-12 03:04:19',2,'2006-02-15 21:30:53'),(4518,'2005-07-08 02:48:36',697,592,'2005-07-13 04:53:36',2,'2006-02-15 21:30:53'),(4519,'2005-07-08 02:51:23',4425,459,'2005-07-12 06:52:23',2,'2006-02-15 21:30:53'),(4520,'2005-07-08 02:53:46',3505,104,'2005-07-08 22:27:46',2,'2006-02-15 21:30:53'),(4521,'2005-07-08 02:57:56',2652,327,'2005-07-11 22:49:56',2,'2006-02-15 21:30:53'),(4522,'2005-07-08 03:03:12',4114,307,'2005-07-10 04:49:12',1,'2006-02-15 21:30:53'),(4523,'2005-07-08 03:06:59',2785,347,'2005-07-17 04:44:59',1,'2006-02-15 21:30:53'),(4524,'2005-07-08 03:10:48',2218,185,'2005-07-09 07:49:48',2,'2006-02-15 21:30:53'),(4525,'2005-07-08 03:15:00',3631,458,'2005-07-11 04:53:00',1,'2006-02-15 21:30:53'),(4526,'2005-07-08 03:17:05',1443,1,'2005-07-14 01:19:05',2,'2006-02-15 21:30:53'),(4527,'2005-07-08 03:20:10',2263,468,'2005-07-15 02:21:10',1,'2006-02-15 21:30:53'),(4528,'2005-07-08 03:24:54',3209,439,'2005-07-09 03:50:54',2,'2006-02-15 21:30:53'),(4529,'2005-07-08 03:26:20',1361,104,'2005-07-16 05:04:20',1,'2006-02-15 21:30:53'),(4530,'2005-07-08 03:27:05',3775,79,'2005-07-11 07:44:05',1,'2006-02-15 21:30:53'),(4531,'2005-07-08 03:27:59',3108,142,'2005-07-10 22:48:59',1,'2006-02-15 21:30:53'),(4532,'2005-07-08 03:30:39',4012,481,'2005-07-11 21:49:39',1,'2006-02-15 21:30:53'),(4533,'2005-07-08 03:32:01',1105,474,'2005-07-10 21:57:01',1,'2006-02-15 21:30:53'),(4534,'2005-07-08 03:36:55',2518,132,'2005-07-16 00:49:55',2,'2006-02-15 21:30:53'),(4535,'2005-07-08 03:40:46',561,29,'2005-07-13 06:53:46',2,'2006-02-15 21:30:53'),(4536,'2005-07-08 03:43:22',220,26,'2005-07-15 08:44:22',1,'2006-02-15 21:30:53'),(4537,'2005-07-08 03:48:40',1305,448,'2005-07-13 22:54:40',2,'2006-02-15 21:30:53'),(4538,'2005-07-08 03:56:29',3638,451,'2005-07-15 08:24:29',1,'2006-02-15 21:30:53'),(4539,'2005-07-08 04:01:02',2450,264,'2005-07-14 22:32:02',1,'2006-02-15 21:30:53'),(4540,'2005-07-08 04:03:28',4160,309,'2005-07-13 03:31:28',2,'2006-02-15 21:30:53'),(4541,'2005-07-08 04:04:19',1976,248,'2005-07-13 07:27:19',2,'2006-02-15 21:30:53'),(4542,'2005-07-08 04:06:30',4169,293,'2005-07-16 06:54:30',2,'2006-02-15 21:30:53'),(4543,'2005-07-08 04:06:55',913,41,'2005-07-12 23:17:55',2,'2006-02-15 21:30:53'),(4544,'2005-07-08 04:11:04',4471,351,'2005-07-09 22:48:04',1,'2006-02-15 21:30:53'),(4545,'2005-07-08 04:17:47',3658,271,'2005-07-13 07:19:47',1,'2006-02-15 21:30:53'),(4546,'2005-07-08 04:18:36',4507,393,'2005-07-17 08:23:36',1,'2006-02-15 21:30:53'),(4547,'2005-07-08 04:20:19',3386,255,'2005-07-09 00:28:19',2,'2006-02-15 21:30:53'),(4548,'2005-07-08 04:21:54',765,164,'2005-07-14 23:16:54',2,'2006-02-15 21:30:53'),(4549,'2005-07-08 04:25:03',2797,98,'2005-07-10 09:01:03',2,'2006-02-15 21:30:53'),(4550,'2005-07-08 04:34:00',615,409,'2005-07-14 23:45:00',2,'2006-02-15 21:30:53'),(4551,'2005-07-08 04:36:21',1160,494,'2005-07-17 10:23:21',2,'2006-02-15 21:30:53'),(4552,'2005-07-08 04:36:35',2549,313,'2005-07-14 05:48:35',2,'2006-02-15 21:30:53'),(4553,'2005-07-08 04:43:41',2114,529,'2005-07-09 23:55:41',1,'2006-02-15 21:30:53'),(4554,'2005-07-08 04:48:03',3878,376,'2005-07-16 04:34:03',1,'2006-02-15 21:30:53'),(4555,'2005-07-08 04:48:36',1757,68,'2005-07-17 07:57:36',1,'2006-02-15 21:30:53'),(4556,'2005-07-08 04:48:41',4099,348,'2005-07-16 08:51:41',2,'2006-02-15 21:30:53'),(4557,'2005-07-08 04:49:15',1191,132,'2005-07-14 00:00:15',2,'2006-02-15 21:30:53'),(4558,'2005-07-08 04:55:26',828,448,'2005-07-09 10:53:26',2,'2006-02-15 21:30:53'),(4559,'2005-07-08 04:56:49',1911,424,'2005-07-12 08:56:49',2,'2006-02-15 21:30:53'),(4560,'2005-07-08 04:58:48',303,36,'2005-07-10 04:27:48',1,'2006-02-15 21:30:53'),(4561,'2005-07-08 05:02:43',1643,500,'2005-07-11 04:56:43',1,'2006-02-15 21:30:53'),(4562,'2005-07-08 05:08:32',963,454,'2005-07-12 08:16:32',2,'2006-02-15 21:30:53'),(4563,'2005-07-08 05:08:55',287,522,'2005-07-16 05:44:55',2,'2006-02-15 21:30:53'),(4564,'2005-07-08 05:09:38',2494,519,'2005-07-11 05:37:38',2,'2006-02-15 21:30:53'),(4565,'2005-07-08 05:12:28',3755,563,'2005-07-17 03:38:28',2,'2006-02-15 21:30:53'),(4566,'2005-07-08 05:18:50',4302,133,'2005-07-15 01:53:50',1,'2006-02-15 21:30:53'),(4567,'2005-07-08 05:20:04',4073,202,'2005-07-10 01:35:04',1,'2006-02-15 21:30:53'),(4568,'2005-07-08 05:23:59',2626,122,'2005-07-09 06:07:59',1,'2006-02-15 21:30:53'),(4569,'2005-07-08 05:30:51',2925,366,'2005-07-14 04:14:51',2,'2006-02-15 21:30:53'),(4570,'2005-07-08 05:33:59',2612,503,'2005-07-14 09:27:59',1,'2006-02-15 21:30:53'),(4571,'2005-07-08 05:34:41',2416,86,'2005-07-17 02:15:41',1,'2006-02-15 21:30:53'),(4572,'2005-07-08 05:36:59',1324,323,'2005-07-12 04:46:59',2,'2006-02-15 21:30:53'),(4573,'2005-07-08 05:38:46',2478,400,'2005-07-15 07:07:46',1,'2006-02-15 21:30:53'),(4574,'2005-07-08 05:39:42',536,257,'2005-07-08 23:44:42',2,'2006-02-15 21:30:53'),(4575,'2005-07-08 05:49:14',231,41,'2005-07-11 04:08:14',2,'2006-02-15 21:30:53'),(4576,'2005-07-08 05:51:19',1920,567,'2005-07-10 11:36:19',1,'2006-02-15 21:30:53'),(4577,'2005-07-08 05:59:00',1688,442,'2005-07-16 06:23:00',2,'2006-02-15 21:30:53'),(4578,'2005-07-08 06:00:17',1533,497,'2005-07-10 06:58:17',2,'2006-02-15 21:30:53'),(4579,'2005-07-08 06:01:56',4290,585,'2005-07-13 11:24:56',1,'2006-02-15 21:30:53'),(4580,'2005-07-08 06:04:23',3512,199,'2005-07-15 05:42:23',2,'2006-02-15 21:30:53'),(4581,'2005-07-08 06:05:06',887,591,'2005-07-16 00:54:06',1,'2006-02-15 21:30:53'),(4582,'2005-07-08 06:09:09',688,274,'2005-07-14 02:23:09',1,'2006-02-15 21:30:53'),(4583,'2005-07-08 06:09:44',4151,365,'2005-07-12 03:44:44',1,'2006-02-15 21:30:53'),(4584,'2005-07-08 06:11:02',2322,368,'2005-07-11 05:14:02',1,'2006-02-15 21:30:53'),(4585,'2005-07-08 06:11:58',1622,143,'2005-07-17 01:58:58',1,'2006-02-15 21:30:53'),(4586,'2005-07-08 06:12:33',1374,461,'2005-07-13 11:06:33',2,'2006-02-15 21:30:53'),(4587,'2005-07-08 06:16:26',3502,63,'2005-07-13 00:59:26',1,'2006-02-15 21:30:53'),(4588,'2005-07-08 06:18:01',3629,198,'2005-07-10 08:59:01',1,'2006-02-15 21:30:53'),(4589,'2005-07-08 06:26:04',1192,99,'2005-07-09 10:31:04',2,'2006-02-15 21:30:53'),(4590,'2005-07-08 06:27:48',4233,580,'2005-07-14 07:46:48',1,'2006-02-15 21:30:53'),(4591,'2005-07-08 06:29:43',2276,182,'2005-07-17 07:20:43',1,'2006-02-15 21:30:53'),(4592,'2005-07-08 06:31:28',2141,235,'2005-07-10 06:08:28',2,'2006-02-15 21:30:53'),(4593,'2005-07-08 06:38:12',2897,528,'2005-07-16 10:48:12',2,'2006-02-15 21:30:53'),(4594,'2005-07-08 06:40:06',26,506,'2005-07-16 05:51:06',2,'2006-02-15 21:30:53'),(4595,'2005-07-08 06:40:25',760,336,'2005-07-14 08:54:25',1,'2006-02-15 21:30:53'),(4596,'2005-07-08 06:41:25',2280,306,'2005-07-14 01:36:25',1,'2006-02-15 21:30:53'),(4597,'2005-07-08 06:43:42',3767,545,'2005-07-13 01:32:42',1,'2006-02-15 21:30:53'),(4598,'2005-07-08 06:46:26',258,82,'2005-07-16 01:21:26',1,'2006-02-15 21:30:53'),(4599,'2005-07-08 06:48:26',2098,356,'2005-07-11 07:06:26',1,'2006-02-15 21:30:53'),(4600,'2005-07-08 06:48:37',1526,457,'2005-07-15 10:11:37',1,'2006-02-15 21:30:53'),(4601,'2005-07-08 06:49:10',3184,572,'2005-07-09 07:43:10',1,'2006-02-15 21:30:53'),(4602,'2005-07-08 06:52:40',3616,129,'2005-07-10 06:30:40',1,'2006-02-15 21:30:53'),(4603,'2005-07-08 06:57:07',755,334,'2005-07-17 04:32:07',1,'2006-02-15 21:30:53'),(4604,'2005-07-08 06:58:43',4230,402,'2005-07-14 06:41:43',1,'2006-02-15 21:30:53'),(4605,'2005-07-08 07:00:14',1139,523,'2005-07-16 08:38:14',1,'2006-02-15 21:30:53'),(4606,'2005-07-08 07:05:50',1946,502,'2005-07-16 09:11:50',2,'2006-02-15 21:30:53'),(4607,'2005-07-08 07:15:14',1193,281,'2005-07-11 01:32:14',1,'2006-02-15 21:30:53'),(4608,'2005-07-08 07:19:11',758,11,'2005-07-11 01:37:11',1,'2006-02-15 21:30:53'),(4609,'2005-07-08 07:22:29',3711,573,'2005-07-10 08:06:29',1,'2006-02-15 21:30:53'),(4610,'2005-07-08 07:28:05',1279,265,'2005-07-14 02:10:05',1,'2006-02-15 21:30:53'),(4611,'2005-07-08 07:33:56',3486,1,'2005-07-12 13:25:56',2,'2006-02-15 21:30:53'),(4612,'2005-07-08 07:40:44',82,371,'2005-07-12 03:48:44',1,'2006-02-15 21:30:53'),(4613,'2005-07-08 07:44:49',476,581,'2005-07-09 04:47:49',1,'2006-02-15 21:30:53'),(4614,'2005-07-08 07:45:17',2579,71,'2005-07-12 02:10:17',2,'2006-02-15 21:30:53'),(4615,'2005-07-08 07:46:53',1200,404,'2005-07-16 12:43:53',2,'2006-02-15 21:30:53'),(4616,'2005-07-08 07:48:12',2580,280,'2005-07-10 08:13:12',2,'2006-02-15 21:30:53'),(4617,'2005-07-08 07:55:08',3784,475,'2005-07-17 02:49:08',2,'2006-02-15 21:30:53'),(4618,'2005-07-08 08:00:20',3691,179,'2005-07-14 05:59:20',1,'2006-02-15 21:30:53'),(4619,'2005-07-08 08:01:09',2127,579,'2005-07-16 05:52:09',2,'2006-02-15 21:30:53'),(4620,'2005-07-08 08:01:44',3467,210,'2005-07-16 07:43:44',2,'2006-02-15 21:30:53'),(4621,'2005-07-08 08:02:18',1594,297,'2005-07-12 08:53:18',2,'2006-02-15 21:30:53'),(4622,'2005-07-08 08:02:42',2710,289,'2005-07-10 07:46:42',2,'2006-02-15 21:30:53'),(4623,'2005-07-08 08:03:22',4171,593,'2005-07-12 09:11:22',2,'2006-02-15 21:30:53'),(4624,'2005-07-08 08:12:17',1548,341,'2005-07-15 12:24:17',2,'2006-02-15 21:30:53'),(4625,'2005-07-08 08:14:26',318,473,'2005-07-09 03:45:26',1,'2006-02-15 21:30:53'),(4626,'2005-07-08 08:18:21',37,268,'2005-07-10 11:36:21',1,'2006-02-15 21:30:53'),(4627,'2005-07-08 08:24:39',2383,78,'2005-07-13 11:04:39',2,'2006-02-15 21:30:53'),(4628,'2005-07-08 08:25:52',1888,540,'2005-07-10 11:22:52',1,'2006-02-15 21:30:53'),(4629,'2005-07-08 08:31:26',228,563,'2005-07-17 12:07:26',1,'2006-02-15 21:30:53'),(4630,'2005-07-08 08:33:38',3446,319,'2005-07-09 13:09:38',2,'2006-02-15 21:30:53'),(4631,'2005-07-08 08:38:22',470,59,'2005-07-11 03:33:22',2,'2006-02-15 21:30:53'),(4632,'2005-07-08 08:38:57',4330,393,'2005-07-15 09:33:57',1,'2006-02-15 21:30:53'),(4633,'2005-07-08 08:39:39',3178,348,'2005-07-15 10:23:39',1,'2006-02-15 21:30:53'),(4634,'2005-07-08 08:40:02',811,275,'2005-07-12 04:45:02',2,'2006-02-15 21:30:53'),(4635,'2005-07-08 08:42:40',2434,65,'2005-07-14 10:31:40',1,'2006-02-15 21:30:53'),(4636,'2005-07-08 08:44:32',1858,228,'2005-07-10 08:59:32',2,'2006-02-15 21:30:53'),(4637,'2005-07-08 08:49:54',1917,263,'2005-07-11 13:12:54',2,'2006-02-15 21:30:53'),(4638,'2005-07-08 08:57:20',2240,305,'2005-07-10 05:08:20',2,'2006-02-15 21:30:53'),(4639,'2005-07-08 08:57:21',2459,75,'2005-07-14 11:22:21',2,'2006-02-15 21:30:53'),(4640,'2005-07-08 08:59:34',1147,506,'2005-07-15 03:31:34',1,'2006-02-15 21:30:53'),(4641,'2005-07-08 09:09:46',2436,26,'2005-07-17 03:54:46',2,'2006-02-15 21:30:53'),(4642,'2005-07-08 09:13:28',1962,30,'2005-07-10 06:17:28',2,'2006-02-15 21:30:53'),(4643,'2005-07-08 09:13:56',239,436,'2005-07-10 12:09:56',2,'2006-02-15 21:30:53'),(4644,'2005-07-08 09:14:29',3239,38,'2005-07-10 07:20:29',2,'2006-02-15 21:30:53'),(4645,'2005-07-08 09:20:09',687,400,'2005-07-09 06:07:09',2,'2006-02-15 21:30:53'),(4646,'2005-07-08 09:23:26',618,362,'2005-07-16 04:03:26',1,'2006-02-15 21:30:53'),(4647,'2005-07-08 09:27:36',674,312,'2005-07-16 14:56:36',2,'2006-02-15 21:30:53'),(4648,'2005-07-08 09:31:27',3490,444,'2005-07-13 03:55:27',2,'2006-02-15 21:30:53'),(4649,'2005-07-08 09:32:05',1116,221,'2005-07-15 08:37:05',2,'2006-02-15 21:30:53'),(4650,'2005-07-08 09:32:08',2850,108,'2005-07-15 15:20:08',1,'2006-02-15 21:30:53'),(4651,'2005-07-08 09:39:39',4064,557,'2005-07-09 12:14:39',2,'2006-02-15 21:30:53'),(4652,'2005-07-08 09:47:51',4198,127,'2005-07-16 04:09:51',2,'2006-02-15 21:30:53'),(4653,'2005-07-08 09:48:01',2511,404,'2005-07-17 05:18:01',1,'2006-02-15 21:30:53'),(4654,'2005-07-08 09:48:03',4210,434,'2005-07-17 13:17:03',1,'2006-02-15 21:30:53'),(4655,'2005-07-08 09:49:22',4078,213,'2005-07-15 13:08:22',1,'2006-02-15 21:30:53'),(4656,'2005-07-08 09:50:10',839,141,'2005-07-13 15:00:10',1,'2006-02-15 21:30:53'),(4657,'2005-07-08 09:51:02',1002,54,'2005-07-09 09:29:02',2,'2006-02-15 21:30:53'),(4658,'2005-07-08 09:51:11',3131,166,'2005-07-10 12:30:11',2,'2006-02-15 21:30:53'),(4659,'2005-07-08 09:53:28',4389,425,'2005-07-14 14:56:28',2,'2006-02-15 21:30:53'),(4660,'2005-07-08 09:54:47',1208,139,'2005-07-11 15:19:47',2,'2006-02-15 21:30:53'),(4661,'2005-07-08 09:55:06',2641,518,'2005-07-11 08:26:06',1,'2006-02-15 21:30:53'),(4662,'2005-07-08 09:58:54',1370,553,'2005-07-10 12:51:54',1,'2006-02-15 21:30:53'),(4663,'2005-07-08 09:59:18',2959,139,'2005-07-10 11:25:18',1,'2006-02-15 21:30:53'),(4664,'2005-07-08 10:01:28',1318,546,'2005-07-12 10:37:28',2,'2006-02-15 21:30:53'),(4665,'2005-07-08 10:04:24',575,106,'2005-07-14 15:13:24',1,'2006-02-15 21:30:53'),(4666,'2005-07-08 10:05:02',4576,120,'2005-07-16 07:28:02',1,'2006-02-15 21:30:53'),(4667,'2005-07-08 10:06:26',3348,485,'2005-07-14 04:48:26',1,'2006-02-15 21:30:53'),(4668,'2005-07-08 10:11:45',3971,481,'2005-07-17 13:01:45',2,'2006-02-15 21:30:53'),(4669,'2005-07-08 10:13:08',3494,581,'2005-07-16 07:52:08',1,'2006-02-15 21:30:53'),(4670,'2005-07-08 10:14:18',3317,153,'2005-07-16 15:10:18',2,'2006-02-15 21:30:53'),(4671,'2005-07-08 10:15:32',2139,55,'2005-07-14 08:19:32',2,'2006-02-15 21:30:53'),(4672,'2005-07-08 10:15:38',1922,18,'2005-07-16 05:06:38',1,'2006-02-15 21:30:53'),(4673,'2005-07-08 10:16:00',2792,91,'2005-07-17 10:03:00',2,'2006-02-15 21:30:53'),(4674,'2005-07-08 10:19:28',1617,329,'2005-07-12 12:54:28',2,'2006-02-15 21:30:53'),(4675,'2005-07-08 10:24:22',1309,380,'2005-07-14 11:09:22',1,'2006-02-15 21:30:53'),(4676,'2005-07-08 10:26:02',2590,302,'2005-07-10 13:38:02',2,'2006-02-15 21:30:53'),(4677,'2005-07-08 10:30:36',1226,258,'2005-07-14 12:40:36',1,'2006-02-15 21:30:53'),(4678,'2005-07-08 10:30:40',241,219,'2005-07-13 11:08:40',1,'2006-02-15 21:30:53'),(4679,'2005-07-08 10:33:14',3610,423,'2005-07-15 14:30:14',2,'2006-02-15 21:30:53'),(4680,'2005-07-08 10:35:28',4043,227,'2005-07-14 08:42:28',1,'2006-02-15 21:30:53'),(4681,'2005-07-08 10:36:03',1025,133,'2005-07-16 09:21:03',2,'2006-02-15 21:30:53'),(4682,'2005-07-08 10:38:27',873,263,'2005-07-11 06:29:27',2,'2006-02-15 21:30:53'),(4683,'2005-07-08 10:38:28',3464,283,'2005-07-09 12:07:28',1,'2006-02-15 21:30:53'),(4684,'2005-07-08 10:41:06',503,585,'2005-07-17 10:35:06',1,'2006-02-15 21:30:53'),(4685,'2005-07-08 10:45:13',602,590,'2005-07-12 08:29:13',1,'2006-02-15 21:30:53'),(4686,'2005-07-08 10:53:39',1398,234,'2005-07-10 05:34:39',2,'2006-02-15 21:30:53'),(4687,'2005-07-08 10:54:19',1156,169,'2005-07-10 08:00:19',2,'2006-02-15 21:30:53'),(4688,'2005-07-08 11:03:29',3574,80,'2005-07-17 15:41:29',2,'2006-02-15 21:30:53'),(4689,'2005-07-08 11:03:47',2519,364,'2005-07-16 06:07:47',2,'2006-02-15 21:30:53'),(4690,'2005-07-08 11:04:02',3304,64,'2005-07-15 10:27:02',2,'2006-02-15 21:30:53'),(4691,'2005-07-08 11:04:53',596,126,'2005-07-09 07:48:53',1,'2006-02-15 21:30:53'),(4692,'2005-07-08 11:07:06',1490,288,'2005-07-09 14:08:06',1,'2006-02-15 21:30:53'),(4693,'2005-07-08 11:07:36',1694,221,'2005-07-14 08:40:36',1,'2006-02-15 21:30:53'),(4694,'2005-07-08 11:07:37',3637,229,'2005-07-12 06:53:37',2,'2006-02-15 21:30:53'),(4695,'2005-07-08 11:07:59',805,39,'2005-07-17 16:35:59',1,'2006-02-15 21:30:53'),(4696,'2005-07-08 11:12:27',1358,424,'2005-07-14 05:41:27',1,'2006-02-15 21:30:53'),(4697,'2005-07-08 11:19:14',4143,224,'2005-07-12 07:14:14',2,'2006-02-15 21:30:53'),(4698,'2005-07-08 11:19:31',3963,570,'2005-07-13 13:45:31',2,'2006-02-15 21:30:53'),(4699,'2005-07-08 11:36:56',2462,348,'2005-07-14 11:35:56',2,'2006-02-15 21:30:53'),(4700,'2005-07-08 11:37:21',3889,317,'2005-07-12 15:41:21',1,'2006-02-15 21:30:53'),(4701,'2005-07-08 11:38:48',3012,522,'2005-07-13 15:59:48',2,'2006-02-15 21:30:53'),(4702,'2005-07-08 11:41:36',2593,56,'2005-07-10 06:55:36',1,'2006-02-15 21:30:53'),(4703,'2005-07-08 11:44:56',2859,544,'2005-07-13 09:17:56',1,'2006-02-15 21:30:53'),(4704,'2005-07-08 11:45:35',2291,28,'2005-07-10 09:46:35',1,'2006-02-15 21:30:53'),(4705,'2005-07-08 11:50:38',3709,85,'2005-07-12 15:58:38',2,'2006-02-15 21:30:53'),(4706,'2005-07-08 11:51:41',2512,380,'2005-07-17 12:58:41',1,'2006-02-15 21:30:53'),(4707,'2005-07-08 11:57:28',52,286,'2005-07-10 17:47:28',1,'2006-02-15 21:30:53'),(4708,'2005-07-08 11:59:19',3249,212,'2005-07-17 07:11:19',2,'2006-02-15 21:30:53'),(4709,'2005-07-08 12:04:34',3964,124,'2005-07-15 06:48:34',1,'2006-02-15 21:30:53'),(4710,'2005-07-08 12:04:53',248,590,'2005-07-13 11:28:53',2,'2006-02-15 21:30:53'),(4711,'2005-07-08 12:06:58',2327,563,'2005-07-12 08:37:58',1,'2006-02-15 21:30:53'),(4712,'2005-07-08 12:10:50',2371,39,'2005-07-17 14:54:50',2,'2006-02-15 21:30:53'),(4713,'2005-07-08 12:12:33',1399,207,'2005-07-16 17:13:33',1,'2006-02-15 21:30:53'),(4714,'2005-07-08 12:12:48',1932,385,'2005-07-17 08:43:48',2,'2006-02-15 21:30:53'),(4715,'2005-07-08 12:15:37',4010,276,'2005-07-10 10:37:37',2,'2006-02-15 21:30:53'),(4716,'2005-07-08 12:18:51',1923,391,'2005-07-11 11:06:51',2,'2006-02-15 21:30:53'),(4717,'2005-07-08 12:22:43',1491,453,'2005-07-11 10:24:43',2,'2006-02-15 21:30:53'),(4718,'2005-07-08 12:32:08',1653,535,'2005-07-17 17:34:08',2,'2006-02-15 21:30:53'),(4719,'2005-07-08 12:33:00',1315,556,'2005-07-15 12:30:00',1,'2006-02-15 21:30:53'),(4720,'2005-07-08 12:34:34',2669,452,'2005-07-09 10:28:34',1,'2006-02-15 21:30:53'),(4721,'2005-07-08 12:39:31',3105,234,'2005-07-15 18:07:31',1,'2006-02-15 21:30:53'),(4722,'2005-07-08 12:42:27',3738,590,'2005-07-09 09:14:27',2,'2006-02-15 21:30:53'),(4723,'2005-07-08 12:44:59',965,44,'2005-07-17 07:22:59',2,'2006-02-15 21:30:53'),(4724,'2005-07-08 12:46:30',3375,18,'2005-07-14 12:39:30',1,'2006-02-15 21:30:53'),(4725,'2005-07-08 12:47:11',2058,3,'2005-07-15 09:08:11',2,'2006-02-15 21:30:53'),(4726,'2005-07-08 12:50:54',4369,144,'2005-07-17 07:09:54',2,'2006-02-15 21:30:53'),(4727,'2005-07-08 12:54:15',1251,39,'2005-07-17 14:32:15',2,'2006-02-15 21:30:53'),(4728,'2005-07-08 12:59:01',3687,462,'2005-07-13 13:00:01',1,'2006-02-15 21:30:53'),(4729,'2005-07-08 12:59:40',1429,205,'2005-07-10 13:35:40',2,'2006-02-15 21:30:53'),(4730,'2005-07-08 12:59:49',1619,126,'2005-07-14 16:15:49',2,'2006-02-15 21:30:53'),(4731,'2005-07-08 13:08:18',4124,241,'2005-07-09 13:16:18',2,'2006-02-15 21:30:53'),(4732,'2005-07-08 13:09:45',308,562,'2005-07-14 10:10:45',1,'2006-02-15 21:30:53'),(4733,'2005-07-08 13:12:07',2230,93,'2005-07-13 07:34:07',1,'2006-02-15 21:30:53'),(4734,'2005-07-08 13:12:12',1928,546,'2005-07-10 09:01:12',2,'2006-02-15 21:30:53'),(4735,'2005-07-08 13:12:27',4324,381,'2005-07-13 10:06:27',2,'2006-02-15 21:30:53'),(4736,'2005-07-08 13:22:55',3009,79,'2005-07-17 07:27:55',1,'2006-02-15 21:30:53'),(4737,'2005-07-08 13:23:53',4286,116,'2005-07-12 18:49:53',1,'2006-02-15 21:30:53'),(4738,'2005-07-08 13:24:58',2021,31,'2005-07-17 17:44:58',2,'2006-02-15 21:30:53'),(4739,'2005-07-08 13:25:57',140,197,'2005-07-11 17:36:57',1,'2006-02-15 21:30:53'),(4740,'2005-07-08 13:30:35',2559,379,'2005-07-14 18:43:35',1,'2006-02-15 21:30:53'),(4741,'2005-07-08 13:31:23',516,260,'2005-07-17 12:02:23',2,'2006-02-15 21:30:53'),(4742,'2005-07-08 13:35:23',3022,340,'2005-07-11 10:24:23',2,'2006-02-15 21:30:53'),(4743,'2005-07-08 13:42:36',80,535,'2005-07-11 18:54:36',2,'2006-02-15 21:30:53'),(4744,'2005-07-08 13:43:57',2948,507,'2005-07-12 09:21:57',2,'2006-02-15 21:30:53'),(4745,'2005-07-08 13:45:09',1351,354,'2005-07-12 18:54:09',1,'2006-02-15 21:30:53'),(4746,'2005-07-08 13:47:55',173,148,'2005-07-11 09:06:55',2,'2006-02-15 21:30:53'),(4747,'2005-07-08 13:53:01',3942,383,'2005-07-12 17:10:01',2,'2006-02-15 21:30:53'),(4748,'2005-07-08 13:59:38',4279,9,'2005-07-15 16:51:38',1,'2006-02-15 21:30:53'),(4749,'2005-07-08 14:05:58',1190,236,'2005-07-10 18:35:58',2,'2006-02-15 21:30:53'),(4750,'2005-07-08 14:07:03',3383,198,'2005-07-13 18:05:03',1,'2006-02-15 21:30:53'),(4751,'2005-07-08 14:07:52',3469,436,'2005-07-13 10:37:52',2,'2006-02-15 21:30:53'),(4752,'2005-07-08 14:15:20',3250,512,'2005-07-12 13:22:20',1,'2006-02-15 21:30:53'),(4753,'2005-07-08 14:18:41',1642,391,'2005-07-09 10:00:41',2,'2006-02-15 21:30:53'),(4754,'2005-07-08 14:20:01',3177,108,'2005-07-11 11:50:01',1,'2006-02-15 21:30:53'),(4755,'2005-07-08 14:23:41',661,378,'2005-07-10 19:35:41',1,'2006-02-15 21:30:53'),(4756,'2005-07-08 14:24:00',3068,351,'2005-07-12 16:16:00',1,'2006-02-15 21:30:53'),(4757,'2005-07-08 14:36:51',1278,504,'2005-07-12 15:28:51',1,'2006-02-15 21:30:53'),(4758,'2005-07-08 14:38:02',3698,288,'2005-07-13 12:09:02',2,'2006-02-15 21:30:53'),(4759,'2005-07-08 14:39:22',3999,284,'2005-07-17 15:02:22',2,'2006-02-15 21:30:53'),(4760,'2005-07-08 14:48:07',3718,177,'2005-07-10 12:41:07',2,'2006-02-15 21:30:53'),(4761,'2005-07-08 14:51:45',3556,351,'2005-07-14 20:28:45',1,'2006-02-15 21:30:53'),(4762,'2005-07-08 14:54:42',390,36,'2005-07-12 18:08:42',1,'2006-02-15 21:30:53'),(4763,'2005-07-08 14:57:32',899,465,'2005-07-15 10:00:32',2,'2006-02-15 21:30:53'),(4764,'2005-07-08 15:01:25',1188,89,'2005-07-17 15:16:25',1,'2006-02-15 21:30:53'),(4765,'2005-07-08 15:08:45',469,437,'2005-07-13 10:44:45',1,'2006-02-15 21:30:53'),(4766,'2005-07-08 15:16:04',1057,149,'2005-07-15 11:04:04',2,'2006-02-15 21:30:53'),(4767,'2005-07-08 15:18:53',3744,350,'2005-07-13 15:48:53',1,'2006-02-15 21:30:53'),(4768,'2005-07-08 15:28:20',2787,482,'2005-07-09 11:46:20',1,'2006-02-15 21:30:53'),(4769,'2005-07-08 15:29:16',3462,501,'2005-07-09 18:42:16',2,'2006-02-15 21:30:53'),(4770,'2005-07-08 15:29:46',2406,573,'2005-07-14 13:31:46',1,'2006-02-15 21:30:53'),(4771,'2005-07-08 15:33:32',1060,32,'2005-07-10 12:38:32',1,'2006-02-15 21:30:53'),(4772,'2005-07-08 15:41:11',2156,486,'2005-07-17 15:25:11',1,'2006-02-15 21:30:53'),(4773,'2005-07-08 15:41:39',3025,519,'2005-07-13 18:16:39',1,'2006-02-15 21:30:53'),(4774,'2005-07-08 15:42:28',673,489,'2005-07-16 18:29:28',2,'2006-02-15 21:30:53'),(4775,'2005-07-08 15:44:05',4277,595,'2005-07-11 20:39:05',2,'2006-02-15 21:30:53'),(4776,'2005-07-08 15:44:20',2598,563,'2005-07-17 10:50:20',2,'2006-02-15 21:30:53'),(4777,'2005-07-08 15:48:34',449,102,'2005-07-16 15:25:34',1,'2006-02-15 21:30:53'),(4778,'2005-07-08 15:51:51',611,78,'2005-07-12 16:58:51',2,'2006-02-15 21:30:53'),(4779,'2005-07-08 15:53:41',1321,338,'2005-07-15 20:30:41',1,'2006-02-15 21:30:53'),(4780,'2005-07-08 16:06:51',2740,115,'2005-07-13 18:34:51',1,'2006-02-15 21:30:53'),(4781,'2005-07-08 16:06:55',1818,593,'2005-07-16 11:22:55',2,'2006-02-15 21:30:53'),(4782,'2005-07-08 16:08:51',445,436,'2005-07-17 17:56:51',1,'2006-02-15 21:30:53'),(4783,'2005-07-08 16:09:24',3952,214,'2005-07-16 21:53:24',2,'2006-02-15 21:30:53'),(4784,'2005-07-08 16:09:56',549,182,'2005-07-09 20:35:56',1,'2006-02-15 21:30:53'),(4785,'2005-07-08 16:10:19',58,474,'2005-07-11 18:52:19',1,'2006-02-15 21:30:53'),(4786,'2005-07-08 16:13:05',2724,294,'2005-07-16 15:29:05',1,'2006-02-15 21:30:53'),(4787,'2005-07-08 16:16:04',3929,7,'2005-07-14 18:02:04',2,'2006-02-15 21:30:53'),(4788,'2005-07-08 16:17:35',691,533,'2005-07-11 11:56:35',2,'2006-02-15 21:30:53'),(4789,'2005-07-08 16:22:01',20,73,'2005-07-15 18:29:01',2,'2006-02-15 21:30:53'),(4790,'2005-07-08 16:25:27',100,500,'2005-07-11 11:35:27',1,'2006-02-15 21:30:53'),(4791,'2005-07-08 16:27:24',2505,393,'2005-07-14 21:50:24',2,'2006-02-15 21:30:53'),(4792,'2005-07-08 16:29:38',2132,147,'2005-07-10 16:31:38',2,'2006-02-15 21:30:53'),(4793,'2005-07-08 16:30:01',3090,427,'2005-07-15 17:56:01',1,'2006-02-15 21:30:53'),(4794,'2005-07-08 16:30:11',2497,451,'2005-07-17 12:41:11',2,'2006-02-15 21:30:53'),(4795,'2005-07-08 16:32:54',3409,497,'2005-07-09 14:15:54',1,'2006-02-15 21:30:53'),(4796,'2005-07-08 16:35:44',2484,9,'2005-07-13 11:08:44',2,'2006-02-15 21:30:53'),(4797,'2005-07-08 16:39:05',1389,265,'2005-07-09 11:41:05',1,'2006-02-15 21:30:53'),(4798,'2005-07-08 16:45:16',3874,212,'2005-07-16 13:45:16',2,'2006-02-15 21:30:53'),(4799,'2005-07-08 16:49:27',4112,512,'2005-07-12 19:58:27',2,'2006-02-15 21:30:53'),(4800,'2005-07-08 16:51:08',1940,99,'2005-07-13 14:16:08',2,'2006-02-15 21:30:53'),(4801,'2005-07-08 16:51:36',761,431,'2005-07-13 17:23:36',1,'2006-02-15 21:30:53'),(4802,'2005-07-08 16:55:17',22,562,'2005-07-15 19:34:17',1,'2006-02-15 21:30:53'),(4803,'2005-07-08 16:56:34',1786,174,'2005-07-14 20:16:34',1,'2006-02-15 21:30:53'),(4804,'2005-07-08 16:57:30',3756,269,'2005-07-10 18:25:30',1,'2006-02-15 21:30:53'),(4805,'2005-07-08 16:59:12',377,453,'2005-07-09 15:02:12',1,'2006-02-15 21:30:53'),(4806,'2005-07-08 17:01:02',214,506,'2005-07-15 21:41:02',1,'2006-02-15 21:30:53'),(4807,'2005-07-08 17:01:48',4511,348,'2005-07-16 22:33:48',2,'2006-02-15 21:30:53'),(4808,'2005-07-08 17:02:49',2544,563,'2005-07-12 22:49:49',2,'2006-02-15 21:30:53'),(4809,'2005-07-08 17:03:22',4251,474,'2005-07-17 22:39:22',1,'2006-02-15 21:30:53'),(4810,'2005-07-08 17:04:06',4056,209,'2005-07-09 13:41:06',1,'2006-02-15 21:30:53'),(4811,'2005-07-08 17:04:24',4032,127,'2005-07-12 16:41:24',2,'2006-02-15 21:30:53'),(4812,'2005-07-08 17:07:11',3281,304,'2005-07-17 21:03:11',2,'2006-02-15 21:30:53'),(4813,'2005-07-08 17:09:56',2752,439,'2005-07-09 22:29:56',1,'2006-02-15 21:30:53'),(4814,'2005-07-08 17:11:09',3497,244,'2005-07-17 12:43:09',2,'2006-02-15 21:30:53'),(4815,'2005-07-08 17:12:51',840,581,'2005-07-17 13:14:51',1,'2006-02-15 21:30:53'),(4816,'2005-07-08 17:14:14',2700,207,'2005-07-11 15:03:14',1,'2006-02-15 21:30:53'),(4817,'2005-07-08 17:17:31',1608,145,'2005-07-09 22:32:31',2,'2006-02-15 21:30:53'),(4818,'2005-07-08 17:18:22',115,144,'2005-07-14 14:40:22',1,'2006-02-15 21:30:53'),(4819,'2005-07-08 17:19:15',1342,64,'2005-07-16 14:32:15',1,'2006-02-15 21:30:53'),(4820,'2005-07-08 17:25:23',2672,172,'2005-07-17 20:32:23',2,'2006-02-15 21:30:53'),(4821,'2005-07-08 17:28:08',1690,172,'2005-07-11 17:44:08',1,'2006-02-15 21:30:53'),(4822,'2005-07-08 17:28:47',3970,185,'2005-07-14 13:06:47',1,'2006-02-15 21:30:53'),(4823,'2005-07-08 17:28:54',155,206,'2005-07-11 23:10:54',1,'2006-02-15 21:30:53'),(4824,'2005-07-08 17:37:39',1855,225,'2005-07-16 18:27:39',1,'2006-02-15 21:30:53'),(4825,'2005-07-08 17:43:01',2419,563,'2005-07-11 20:58:01',1,'2006-02-15 21:30:53'),(4826,'2005-07-08 17:44:25',911,180,'2005-07-16 20:14:25',2,'2006-02-15 21:30:53'),(4827,'2005-07-08 17:46:30',4455,110,'2005-07-11 14:12:30',2,'2006-02-15 21:30:53'),(4828,'2005-07-08 17:52:29',1100,92,'2005-07-11 14:35:29',1,'2006-02-15 21:30:53'),(4829,'2005-07-08 17:54:18',2661,133,'2005-07-11 23:41:18',1,'2006-02-15 21:30:53'),(4830,'2005-07-08 17:56:23',1150,359,'2005-07-17 21:40:23',2,'2006-02-15 21:30:53'),(4831,'2005-07-08 18:00:14',2739,243,'2005-07-12 15:54:14',2,'2006-02-15 21:30:53'),(4832,'2005-07-08 18:07:05',1838,509,'2005-07-10 19:37:05',2,'2006-02-15 21:30:53'),(4833,'2005-07-08 18:07:35',2921,581,'2005-07-13 15:29:35',2,'2006-02-15 21:30:53'),(4834,'2005-07-08 18:07:45',1288,301,'2005-07-14 15:27:45',1,'2006-02-15 21:30:53'),(4835,'2005-07-08 18:08:13',2499,95,'2005-07-17 16:51:13',2,'2006-02-15 21:30:53'),(4836,'2005-07-08 18:09:08',2756,311,'2005-07-15 20:19:08',1,'2006-02-15 21:30:53'),(4837,'2005-07-08 18:09:12',1944,149,'2005-07-11 16:40:12',1,'2006-02-15 21:30:53'),(4838,'2005-07-08 18:11:00',3733,84,'2005-07-17 12:57:00',2,'2006-02-15 21:30:53'),(4839,'2005-07-08 18:13:10',1810,556,'2005-07-15 12:49:10',1,'2006-02-15 21:30:53'),(4840,'2005-07-08 18:18:16',1670,119,'2005-07-16 14:59:16',1,'2006-02-15 21:30:53'),(4841,'2005-07-08 18:18:23',518,248,'2005-07-11 16:51:23',2,'2006-02-15 21:30:53'),(4842,'2005-07-08 18:21:30',1438,160,'2005-07-10 22:25:30',2,'2006-02-15 21:30:53'),(4843,'2005-07-08 18:27:28',3640,45,'2005-07-15 00:26:28',2,'2006-02-15 21:30:53'),(4844,'2005-07-08 18:28:13',4057,237,'2005-07-09 21:17:13',2,'2006-02-15 21:30:53'),(4845,'2005-07-08 18:28:20',2337,553,'2005-07-09 14:38:20',2,'2006-02-15 21:30:53'),(4846,'2005-07-08 18:29:05',417,556,'2005-07-10 22:33:05',2,'2006-02-15 21:30:53'),(4847,'2005-07-08 18:29:13',3397,544,'2005-07-15 18:12:13',2,'2006-02-15 21:30:53'),(4848,'2005-07-08 18:30:16',2962,251,'2005-07-12 19:53:16',2,'2006-02-15 21:30:53'),(4849,'2005-07-08 18:34:34',4323,146,'2005-07-14 20:27:34',2,'2006-02-15 21:30:53'),(4850,'2005-07-08 18:39:31',3039,154,'2005-07-13 00:18:31',2,'2006-02-15 21:30:53'),(4851,'2005-07-08 18:40:05',134,557,'2005-07-12 21:46:05',1,'2006-02-15 21:30:53'),(4852,'2005-07-08 18:43:15',3545,418,'2005-07-15 18:48:15',2,'2006-02-15 21:30:53'),(4853,'2005-07-08 18:43:18',1454,23,'2005-07-12 14:28:18',2,'2006-02-15 21:30:53'),(4854,'2005-07-08 18:44:44',3644,487,'2005-07-13 13:37:44',1,'2006-02-15 21:30:53'),(4855,'2005-07-08 18:45:50',1146,337,'2005-07-11 18:23:50',2,'2006-02-15 21:30:53'),(4856,'2005-07-08 18:47:38',2441,7,'2005-07-13 15:02:38',2,'2006-02-15 21:30:53'),(4857,'2005-07-08 18:52:07',2069,211,'2005-07-11 22:06:07',1,'2006-02-15 21:30:53'),(4858,'2005-07-08 18:53:24',3424,447,'2005-07-17 20:32:24',2,'2006-02-15 21:30:53'),(4859,'2005-07-08 18:54:04',1939,369,'2005-07-13 13:04:04',1,'2006-02-15 21:30:53'),(4860,'2005-07-08 18:54:07',428,123,'2005-07-17 15:09:07',2,'2006-02-15 21:30:53'),(4861,'2005-07-08 18:57:30',2984,455,'2005-07-16 15:12:30',2,'2006-02-15 21:30:53'),(4862,'2005-07-08 19:02:46',293,291,'2005-07-17 20:17:46',1,'2006-02-15 21:30:53'),(4863,'2005-07-08 19:03:15',1,431,'2005-07-11 21:29:15',2,'2006-02-15 21:30:53'),(4864,'2005-07-08 19:05:34',2974,281,'2005-07-17 15:05:34',2,'2006-02-15 21:30:53'),(4865,'2005-07-08 19:09:04',1614,418,'2005-07-13 21:25:04',2,'2006-02-15 21:30:53'),(4866,'2005-07-08 19:09:59',4036,278,'2005-07-15 00:51:59',2,'2006-02-15 21:30:53'),(4867,'2005-07-08 19:10:52',4090,593,'2005-07-09 21:43:52',2,'2006-02-15 21:30:53'),(4868,'2005-07-08 19:13:50',1157,307,'2005-07-14 20:59:50',2,'2006-02-15 21:30:53'),(4869,'2005-07-08 19:14:05',2860,376,'2005-07-15 22:27:05',1,'2006-02-15 21:30:53'),(4870,'2005-07-08 19:14:45',3089,260,'2005-07-12 18:58:45',2,'2006-02-15 21:30:53'),(4871,'2005-07-08 19:19:52',2509,210,'2005-07-13 20:27:52',2,'2006-02-15 21:30:53'),(4872,'2005-07-08 19:23:16',1836,103,'2005-07-10 14:17:16',2,'2006-02-15 21:30:53'),(4873,'2005-07-08 19:23:32',4500,473,'2005-07-11 15:24:32',1,'2006-02-15 21:30:53'),(4874,'2005-07-08 19:23:38',2386,223,'2005-07-13 14:39:38',2,'2006-02-15 21:30:53'),(4875,'2005-07-08 19:24:17',843,555,'2005-07-11 19:15:17',2,'2006-02-15 21:30:53'),(4876,'2005-07-08 19:27:50',1959,283,'2005-07-14 15:42:50',1,'2006-02-15 21:30:53'),(4877,'2005-07-08 19:31:02',1846,287,'2005-07-15 19:05:02',1,'2006-02-15 21:30:53'),(4878,'2005-07-08 19:33:49',4009,172,'2005-07-17 17:47:49',1,'2006-02-15 21:30:53'),(4879,'2005-07-08 19:34:55',1406,196,'2005-07-09 15:53:55',1,'2006-02-15 21:30:53'),(4880,'2005-07-08 19:36:17',4178,269,'2005-07-13 00:01:17',1,'2006-02-15 21:30:53'),(4881,'2005-07-08 19:40:34',4346,349,'2005-07-09 17:08:34',2,'2006-02-15 21:30:53'),(4882,'2005-07-08 19:42:03',4540,184,'2005-07-16 22:24:03',1,'2006-02-15 21:30:53'),(4883,'2005-07-08 19:46:58',1366,563,'2005-07-10 15:48:58',1,'2006-02-15 21:30:53'),(4884,'2005-07-08 19:49:17',3543,425,'2005-07-15 23:14:17',2,'2006-02-15 21:30:53'),(4885,'2005-07-08 19:51:17',442,233,'2005-07-12 16:02:17',2,'2006-02-15 21:30:53'),(4886,'2005-07-08 19:53:22',3393,474,'2005-07-09 17:05:22',1,'2006-02-15 21:30:53'),(4887,'2005-07-08 19:59:14',3613,543,'2005-07-15 22:53:14',1,'2006-02-15 21:30:53'),(4888,'2005-07-08 20:04:27',1220,527,'2005-07-10 14:53:27',2,'2006-02-15 21:30:53'),(4889,'2005-07-08 20:04:43',4463,5,'2005-07-13 17:57:43',2,'2006-02-15 21:30:53'),(4890,'2005-07-08 20:05:38',3576,574,'2005-07-14 14:55:38',2,'2006-02-15 21:30:53'),(4891,'2005-07-08 20:06:19',1787,59,'2005-07-16 18:52:19',1,'2006-02-15 21:30:53'),(4892,'2005-07-08 20:06:25',3566,193,'2005-07-14 20:04:25',1,'2006-02-15 21:30:53'),(4893,'2005-07-08 20:19:55',2060,210,'2005-07-15 21:28:55',2,'2006-02-15 21:30:53'),(4894,'2005-07-08 20:21:31',1028,286,'2005-07-11 01:59:31',1,'2006-02-15 21:30:53'),(4895,'2005-07-08 20:22:05',2620,242,'2005-07-12 20:49:05',1,'2006-02-15 21:30:53'),(4896,'2005-07-08 20:23:15',3006,129,'2005-07-10 15:38:15',1,'2006-02-15 21:30:53'),(4897,'2005-07-08 20:25:11',2950,258,'2005-07-09 17:16:11',1,'2006-02-15 21:30:53'),(4898,'2005-07-08 20:31:43',3212,218,'2005-07-15 15:58:43',2,'2006-02-15 21:30:53'),(4899,'2005-07-08 20:37:11',414,32,'2005-07-10 21:53:11',1,'2006-02-15 21:30:53'),(4900,'2005-07-08 20:38:06',3487,426,'2005-07-09 22:45:06',2,'2006-02-15 21:30:53'),(4901,'2005-07-08 20:44:51',2187,507,'2005-07-10 01:04:51',1,'2006-02-15 21:30:53'),(4902,'2005-07-08 20:49:30',2238,554,'2005-07-13 16:54:30',2,'2006-02-15 21:30:53'),(4903,'2005-07-08 20:50:05',1769,132,'2005-07-13 15:27:05',1,'2006-02-15 21:30:53'),(4904,'2005-07-08 20:53:27',2051,173,'2005-07-18 01:16:27',1,'2006-02-15 21:30:53'),(4905,'2005-07-08 20:56:00',4101,246,'2005-07-12 00:19:00',2,'2006-02-15 21:30:53'),(4906,'2005-07-08 20:59:13',1527,490,'2005-07-15 01:12:13',2,'2006-02-15 21:30:53'),(4907,'2005-07-08 21:01:41',1206,209,'2005-07-13 02:23:41',2,'2006-02-15 21:30:53'),(4908,'2005-07-08 21:05:44',1963,160,'2005-07-17 21:33:44',2,'2006-02-15 21:30:53'),(4909,'2005-07-08 21:07:24',1451,228,'2005-07-10 22:34:24',1,'2006-02-15 21:30:53'),(4910,'2005-07-08 21:13:56',3675,219,'2005-07-18 02:39:56',2,'2006-02-15 21:30:53'),(4911,'2005-07-08 21:20:26',4479,66,'2005-07-15 03:11:26',1,'2006-02-15 21:30:53'),(4912,'2005-07-08 21:26:11',2012,275,'2005-07-18 02:19:11',1,'2006-02-15 21:30:53'),(4913,'2005-07-08 21:27:48',982,368,'2005-07-18 02:51:48',1,'2006-02-15 21:30:53'),(4914,'2005-07-08 21:30:53',298,535,'2005-07-17 01:29:53',1,'2006-02-15 21:30:53'),(4915,'2005-07-08 21:31:22',2772,178,'2005-07-13 16:45:22',2,'2006-02-15 21:30:53'),(4916,'2005-07-08 21:32:17',2680,212,'2005-07-14 20:55:17',2,'2006-02-15 21:30:53'),(4917,'2005-07-08 21:32:30',3231,104,'2005-07-09 15:34:30',1,'2006-02-15 21:30:53'),(4918,'2005-07-08 21:37:31',3819,220,'2005-07-11 20:16:31',2,'2006-02-15 21:30:53'),(4919,'2005-07-08 21:41:54',2106,157,'2005-07-11 23:14:54',1,'2006-02-15 21:30:53'),(4920,'2005-07-08 21:42:10',4285,239,'2005-07-15 03:08:10',1,'2006-02-15 21:30:53'),(4921,'2005-07-08 21:43:21',425,109,'2005-07-10 16:06:21',2,'2006-02-15 21:30:53'),(4922,'2005-07-08 21:44:00',2928,577,'2005-07-10 02:58:00',2,'2006-02-15 21:30:53'),(4923,'2005-07-08 21:44:39',932,18,'2005-07-17 15:50:39',2,'2006-02-15 21:30:53'),(4924,'2005-07-08 21:55:25',4344,180,'2005-07-16 16:52:25',1,'2006-02-15 21:30:53'),(4925,'2005-07-08 21:56:00',2169,68,'2005-07-14 17:17:00',2,'2006-02-15 21:30:53'),(4926,'2005-07-08 22:01:48',4155,415,'2005-07-18 03:27:48',1,'2006-02-15 21:30:53'),(4927,'2005-07-08 22:05:35',2566,136,'2005-07-14 23:22:35',2,'2006-02-15 21:30:53'),(4928,'2005-07-08 22:05:41',4363,77,'2005-07-09 23:09:41',2,'2006-02-15 21:30:53'),(4929,'2005-07-08 22:06:18',734,297,'2005-07-17 18:17:18',2,'2006-02-15 21:30:53'),(4930,'2005-07-08 22:15:48',2057,451,'2005-07-15 21:02:48',2,'2006-02-15 21:30:53'),(4931,'2005-07-08 22:16:18',2750,284,'2005-07-17 03:42:18',1,'2006-02-15 21:30:53'),(4932,'2005-07-08 22:17:40',4237,558,'2005-07-15 22:13:40',2,'2006-02-15 21:30:53'),(4933,'2005-07-08 22:18:29',322,579,'2005-07-13 03:47:29',2,'2006-02-15 21:30:53'),(4934,'2005-07-08 22:18:42',1744,517,'2005-07-10 20:44:42',2,'2006-02-15 21:30:53'),(4935,'2005-07-08 22:20:56',2708,230,'2005-07-12 01:01:56',2,'2006-02-15 21:30:53'),(4936,'2005-07-08 22:24:50',2033,298,'2005-07-15 03:14:50',2,'2006-02-15 21:30:53'),(4937,'2005-07-08 22:29:59',33,273,'2005-07-15 21:51:59',2,'2006-02-15 21:30:53'),(4938,'2005-07-08 22:32:53',2164,418,'2005-07-14 16:48:53',2,'2006-02-15 21:30:53'),(4939,'2005-07-08 22:35:30',3201,425,'2005-07-17 22:05:30',1,'2006-02-15 21:30:53'),(4940,'2005-07-08 22:36:06',971,215,'2005-07-15 04:28:06',1,'2006-02-15 21:30:53'),(4941,'2005-07-08 22:39:10',3816,553,'2005-07-15 17:49:10',2,'2006-02-15 21:30:53'),(4942,'2005-07-08 22:42:47',4467,120,'2005-07-15 04:36:47',2,'2006-02-15 21:30:53'),(4943,'2005-07-08 22:43:05',2732,11,'2005-07-15 18:17:05',2,'2006-02-15 21:30:53'),(4944,'2005-07-08 22:44:28',3648,293,'2005-07-17 21:51:28',2,'2006-02-15 21:30:53'),(4945,'2005-07-08 22:45:02',2079,165,'2005-07-11 23:59:02',2,'2006-02-15 21:30:53'),(4946,'2005-07-08 22:46:23',272,440,'2005-07-16 17:19:23',1,'2006-02-15 21:30:53'),(4947,'2005-07-08 22:49:37',3905,388,'2005-07-17 21:03:37',1,'2006-02-15 21:30:53'),(4948,'2005-07-08 22:54:21',2972,518,'2005-07-17 03:52:21',2,'2006-02-15 21:30:53'),(4949,'2005-07-08 22:57:10',1184,567,'2005-07-11 01:26:10',2,'2006-02-15 21:30:53'),(4950,'2005-07-08 22:58:07',3291,148,'2005-07-09 20:41:07',2,'2006-02-15 21:30:53'),(4951,'2005-07-08 22:58:21',2766,28,'2005-07-16 18:58:21',1,'2006-02-15 21:30:53'),(4952,'2005-07-08 23:00:07',459,14,'2005-07-09 21:47:07',1,'2006-02-15 21:30:53'),(4953,'2005-07-08 23:09:48',2460,168,'2005-07-11 02:08:48',2,'2006-02-15 21:30:53'),(4954,'2005-07-08 23:14:16',627,99,'2005-07-14 23:23:16',2,'2006-02-15 21:30:53'),(4955,'2005-07-08 23:16:21',1103,225,'2005-07-14 02:09:21',2,'2006-02-15 21:30:53'),(4956,'2005-07-08 23:17:10',1512,477,'2005-07-18 00:14:10',1,'2006-02-15 21:30:53'),(4957,'2005-07-08 23:18:48',4082,399,'2005-07-09 23:13:48',1,'2006-02-15 21:30:53'),(4958,'2005-07-08 23:19:52',2354,346,'2005-07-17 20:31:52',1,'2006-02-15 21:30:53'),(4959,'2005-07-08 23:22:23',3898,236,'2005-07-10 03:17:23',2,'2006-02-15 21:30:53'),(4960,'2005-07-08 23:27:16',2176,434,'2005-07-18 02:01:16',1,'2006-02-15 21:30:53'),(4961,'2005-07-08 23:35:53',3668,96,'2005-07-14 22:46:53',2,'2006-02-15 21:30:53'),(4962,'2005-07-08 23:36:13',4399,532,'2005-07-15 03:39:13',1,'2006-02-15 21:30:53'),(4963,'2005-07-08 23:38:40',737,404,'2005-07-12 05:33:40',2,'2006-02-15 21:30:53'),(4964,'2005-07-08 23:46:38',1033,455,'2005-07-09 22:19:38',2,'2006-02-15 21:30:53'),(4965,'2005-07-08 23:46:57',535,432,'2005-07-15 18:47:57',1,'2006-02-15 21:30:53'),(4966,'2005-07-08 23:47:25',4360,118,'2005-07-14 03:35:25',1,'2006-02-15 21:30:53'),(4967,'2005-07-08 23:48:03',108,339,'2005-07-15 23:51:03',2,'2006-02-15 21:30:53'),(4968,'2005-07-08 23:49:19',3204,390,'2005-07-14 02:46:19',1,'2006-02-15 21:30:53'),(4969,'2005-07-08 23:51:26',4563,231,'2005-07-12 03:21:26',2,'2006-02-15 21:30:53'),(4970,'2005-07-08 23:54:29',2983,100,'2005-07-16 22:47:29',1,'2006-02-15 21:30:53'),(4971,'2005-07-08 23:54:49',460,64,'2005-07-16 00:15:49',1,'2006-02-15 21:30:53'),(4972,'2005-07-08 23:56:09',2451,498,'2005-07-16 19:15:09',1,'2006-02-15 21:30:53'),(4973,'2005-07-08 23:58:18',391,432,'2005-07-14 21:42:18',1,'2006-02-15 21:30:53'),(4974,'2005-07-09 00:00:36',1071,152,'2005-07-13 21:03:36',1,'2006-02-15 21:30:53'),(4975,'2005-07-09 00:02:46',3730,101,'2005-07-14 18:05:46',2,'2006-02-15 21:30:53'),(4976,'2005-07-09 00:03:30',617,199,'2005-07-10 19:05:30',1,'2006-02-15 21:30:53'),(4977,'2005-07-09 00:15:50',3310,584,'2005-07-10 00:34:50',2,'2006-02-15 21:30:53'),(4978,'2005-07-09 00:22:02',2578,279,'2005-07-18 04:37:02',1,'2006-02-15 21:30:53'),(4979,'2005-07-09 00:24:34',3447,204,'2005-07-12 20:04:34',1,'2006-02-15 21:30:53'),(4980,'2005-07-09 00:26:59',2638,100,'2005-07-14 19:42:59',1,'2006-02-15 21:30:53'),(4981,'2005-07-09 00:29:29',3363,399,'2005-07-16 19:06:29',2,'2006-02-15 21:30:53'),(4982,'2005-07-09 00:30:52',249,162,'2005-07-15 23:50:52',1,'2006-02-15 21:30:53'),(4983,'2005-07-09 00:34:16',1469,81,'2005-07-17 03:21:16',2,'2006-02-15 21:30:53'),(4984,'2005-07-09 00:35:31',1303,214,'2005-07-17 03:44:31',1,'2006-02-15 21:30:53'),(4985,'2005-07-09 00:36:02',2146,208,'2005-07-14 04:06:02',2,'2006-02-15 21:30:53'),(4986,'2005-07-09 00:44:33',3517,589,'2005-07-09 19:45:33',2,'2006-02-15 21:30:53'),(4987,'2005-07-09 00:45:41',996,277,'2005-07-14 03:32:41',2,'2006-02-15 21:30:53'),(4988,'2005-07-09 00:46:14',2718,433,'2005-07-16 01:45:14',2,'2006-02-15 21:30:53'),(4989,'2005-07-09 00:46:56',3326,210,'2005-07-17 06:24:56',1,'2006-02-15 21:30:53'),(4990,'2005-07-09 00:48:49',3305,35,'2005-07-10 06:36:49',2,'2006-02-15 21:30:53'),(4991,'2005-07-09 00:49:03',1856,540,'2005-07-13 05:02:03',1,'2006-02-15 21:30:53'),(4992,'2005-07-09 00:49:37',2081,315,'2005-07-16 02:05:37',1,'2006-02-15 21:30:53'),(4993,'2005-07-09 00:49:47',1740,517,'2005-07-11 21:19:47',1,'2006-02-15 21:30:53'),(4994,'2005-07-09 00:54:13',2546,246,'2005-07-09 21:02:13',1,'2006-02-15 21:30:53'),(4995,'2005-07-09 00:57:46',2063,247,'2005-07-13 03:32:46',1,'2006-02-15 21:30:53'),(4996,'2005-07-09 00:59:46',4440,129,'2005-07-16 01:30:46',2,'2006-02-15 21:30:53'),(4997,'2005-07-09 01:06:03',186,102,'2005-07-18 04:21:03',2,'2006-02-15 21:30:53'),(4998,'2005-07-09 01:07:21',202,534,'2005-07-10 05:48:21',2,'2006-02-15 21:30:53'),(4999,'2005-07-09 01:12:57',1797,196,'2005-07-17 00:12:57',1,'2006-02-15 21:30:53'),(5000,'2005-07-09 01:16:13',668,146,'2005-07-14 21:55:13',1,'2006-02-15 21:30:53'),(5001,'2005-07-09 01:17:04',2025,40,'2005-07-16 03:25:04',2,'2006-02-15 21:30:53'),(5002,'2005-07-09 01:17:08',2388,430,'2005-07-15 21:53:08',1,'2006-02-15 21:30:53'),(5003,'2005-07-09 01:19:03',3438,569,'2005-07-10 04:28:03',2,'2006-02-15 21:30:53'),(5004,'2005-07-09 01:20:50',2637,382,'2005-07-09 19:56:50',1,'2006-02-15 21:30:53'),(5005,'2005-07-09 01:21:44',3034,451,'2005-07-14 20:27:44',1,'2006-02-15 21:30:53'),(5006,'2005-07-09 01:24:07',1277,486,'2005-07-18 03:56:07',1,'2006-02-15 21:30:53'),(5007,'2005-07-09 01:26:22',3079,207,'2005-07-12 20:48:22',1,'2006-02-15 21:30:53'),(5008,'2005-07-09 01:31:42',824,509,'2005-07-11 22:34:42',2,'2006-02-15 21:30:53'),(5009,'2005-07-09 01:32:17',1539,102,'2005-07-18 03:39:17',2,'2006-02-15 21:30:53'),(5010,'2005-07-09 01:33:23',1999,574,'2005-07-14 04:00:23',2,'2006-02-15 21:30:53'),(5011,'2005-07-09 01:44:40',463,249,'2005-07-11 00:58:40',2,'2006-02-15 21:30:53'),(5012,'2005-07-09 01:45:04',1456,251,'2005-07-12 02:13:04',1,'2006-02-15 21:30:53'),(5013,'2005-07-09 01:46:45',3000,35,'2005-07-16 06:57:45',1,'2006-02-15 21:30:53'),(5014,'2005-07-09 01:51:49',4095,334,'2005-07-10 04:48:49',1,'2006-02-15 21:30:53'),(5015,'2005-07-09 01:54:24',1564,178,'2005-07-12 20:07:24',1,'2006-02-15 21:30:53'),(5016,'2005-07-09 01:57:57',1871,5,'2005-07-09 22:07:57',1,'2006-02-15 21:30:53'),(5017,'2005-07-09 02:00:16',3745,241,'2005-07-14 06:28:16',1,'2006-02-15 21:30:53'),(5018,'2005-07-09 02:01:05',2317,541,'2005-07-10 04:09:05',1,'2006-02-15 21:30:53'),(5019,'2005-07-09 02:04:32',3534,295,'2005-07-15 07:01:32',2,'2006-02-15 21:30:53'),(5020,'2005-07-09 02:07:56',4113,565,'2005-07-09 23:59:56',1,'2006-02-15 21:30:53'),(5021,'2005-07-09 02:09:41',3445,73,'2005-07-13 05:47:41',1,'2006-02-15 21:30:53'),(5022,'2005-07-09 02:10:54',928,499,'2005-07-17 08:07:54',2,'2006-02-15 21:30:53'),(5023,'2005-07-09 02:23:16',3206,358,'2005-07-15 20:37:16',1,'2006-02-15 21:30:53'),(5024,'2005-07-09 02:25:12',2987,335,'2005-07-12 03:15:12',1,'2006-02-15 21:30:53'),(5025,'2005-07-09 02:28:24',153,91,'2005-07-12 04:43:24',2,'2006-02-15 21:30:53'),(5026,'2005-07-09 02:32:34',989,463,'2005-07-13 04:39:34',2,'2006-02-15 21:30:53'),(5027,'2005-07-09 02:32:37',2179,109,'2005-07-16 23:13:37',1,'2006-02-15 21:30:53'),(5028,'2005-07-09 02:34:45',4531,30,'2005-07-14 20:45:45',2,'2006-02-15 21:30:53'),(5029,'2005-07-09 02:35:32',3938,265,'2005-07-17 22:46:32',1,'2006-02-15 21:30:53'),(5030,'2005-07-09 02:35:43',25,497,'2005-07-17 02:05:43',1,'2006-02-15 21:30:53'),(5031,'2005-07-09 02:36:37',4224,312,'2005-07-14 03:09:37',2,'2006-02-15 21:30:53'),(5032,'2005-07-09 02:39:47',2257,333,'2005-07-10 07:45:47',1,'2006-02-15 21:30:53'),(5033,'2005-07-09 02:42:01',2841,299,'2005-07-14 00:29:01',1,'2006-02-15 21:30:53'),(5034,'2005-07-09 02:48:15',340,148,'2005-07-11 23:13:15',2,'2006-02-15 21:30:53'),(5035,'2005-07-09 02:51:34',3699,99,'2005-07-16 21:38:34',1,'2006-02-15 21:30:53'),(5036,'2005-07-09 02:58:41',75,573,'2005-07-17 04:09:41',1,'2006-02-15 21:30:53'),(5037,'2005-07-09 02:59:10',435,524,'2005-07-15 07:54:10',2,'2006-02-15 21:30:53'),(5038,'2005-07-09 03:12:52',3086,10,'2005-07-17 22:27:52',2,'2006-02-15 21:30:53'),(5039,'2005-07-09 03:14:45',2020,268,'2005-07-16 06:57:45',2,'2006-02-15 21:30:53'),(5040,'2005-07-09 03:16:34',2479,405,'2005-07-17 01:13:34',2,'2006-02-15 21:30:53'),(5041,'2005-07-09 03:18:51',2711,305,'2005-07-13 03:08:51',1,'2006-02-15 21:30:53'),(5042,'2005-07-09 03:20:30',3609,254,'2005-07-15 07:22:30',1,'2006-02-15 21:30:53'),(5043,'2005-07-09 03:25:18',2979,369,'2005-07-13 00:57:18',2,'2006-02-15 21:30:53'),(5044,'2005-07-09 03:30:25',1625,147,'2005-07-11 02:32:25',2,'2006-02-15 21:30:53'),(5045,'2005-07-09 03:33:32',1041,230,'2005-07-18 06:15:32',1,'2006-02-15 21:30:53'),(5046,'2005-07-09 03:34:57',1639,227,'2005-07-17 22:36:57',2,'2006-02-15 21:30:53'),(5047,'2005-07-09 03:44:15',230,272,'2005-07-15 09:07:15',2,'2006-02-15 21:30:53'),(5048,'2005-07-09 03:46:33',1271,466,'2005-07-15 01:14:33',1,'2006-02-15 21:30:53'),(5049,'2005-07-09 03:54:12',3336,144,'2005-07-11 22:39:12',2,'2006-02-15 21:30:53'),(5050,'2005-07-09 03:54:38',3876,337,'2005-07-10 02:23:38',2,'2006-02-15 21:30:53'),(5051,'2005-07-09 03:57:53',4091,85,'2005-07-16 08:22:53',2,'2006-02-15 21:30:53'),(5052,'2005-07-09 03:59:43',1884,305,'2005-07-12 05:48:43',1,'2006-02-15 21:30:53'),(5053,'2005-07-09 03:59:46',570,295,'2005-07-09 23:53:46',2,'2006-02-15 21:30:53'),(5054,'2005-07-09 04:01:02',4001,135,'2005-07-18 05:16:02',2,'2006-02-15 21:30:53'),(5055,'2005-07-09 04:05:28',751,54,'2005-07-14 04:26:28',2,'2006-02-15 21:30:53'),(5056,'2005-07-09 04:13:45',2599,526,'2005-07-10 06:17:45',2,'2006-02-15 21:30:53'),(5057,'2005-07-09 04:20:29',1076,178,'2005-07-14 23:59:29',1,'2006-02-15 21:30:53'),(5058,'2005-07-09 04:20:35',917,221,'2005-07-18 08:09:35',2,'2006-02-15 21:30:53'),(5059,'2005-07-09 04:28:01',3951,396,'2005-07-15 22:57:01',1,'2006-02-15 21:30:53'),(5060,'2005-07-09 04:28:03',4317,57,'2005-07-12 07:41:03',2,'2006-02-15 21:30:53'),(5061,'2005-07-09 04:30:50',3893,230,'2005-07-12 03:24:50',1,'2006-02-15 21:30:53'),(5062,'2005-07-09 04:36:49',2190,141,'2005-07-10 06:26:49',1,'2006-02-15 21:30:53'),(5063,'2005-07-09 04:37:31',1027,133,'2005-07-13 09:56:31',2,'2006-02-15 21:30:53'),(5064,'2005-07-09 04:38:51',373,512,'2005-07-18 00:33:51',2,'2006-02-15 21:30:53'),(5065,'2005-07-09 04:42:00',1788,599,'2005-07-12 08:55:00',1,'2006-02-15 21:30:53'),(5066,'2005-07-09 04:48:50',1702,169,'2005-07-12 22:54:50',2,'2006-02-15 21:30:53'),(5067,'2005-07-09 04:52:35',1480,225,'2005-07-11 23:33:35',2,'2006-02-15 21:30:53'),(5068,'2005-07-09 04:53:18',2937,10,'2005-07-13 09:21:18',1,'2006-02-15 21:30:53'),(5069,'2005-07-09 04:56:30',4417,183,'2005-07-13 23:53:30',2,'2006-02-15 21:30:53'),(5070,'2005-07-09 04:58:26',2305,407,'2005-07-09 23:00:26',2,'2006-02-15 21:30:53'),(5071,'2005-07-09 05:00:39',4358,12,'2005-07-09 23:08:39',1,'2006-02-15 21:30:53'),(5072,'2005-07-09 05:01:58',94,254,'2005-07-18 08:17:58',2,'2006-02-15 21:30:53'),(5073,'2005-07-09 05:02:35',546,408,'2005-07-15 01:22:35',2,'2006-02-15 21:30:53'),(5074,'2005-07-09 05:06:24',1379,12,'2005-07-12 04:37:24',1,'2006-02-15 21:30:53'),(5075,'2005-07-09 05:12:07',903,170,'2005-07-12 08:29:07',1,'2006-02-15 21:30:53'),(5076,'2005-07-09 05:13:22',4388,574,'2005-07-16 09:11:22',1,'2006-02-15 21:30:53'),(5077,'2005-07-09 05:18:01',686,574,'2005-07-17 10:39:01',2,'2006-02-15 21:30:53'),(5078,'2005-07-09 05:20:24',1994,78,'2005-07-13 06:41:24',2,'2006-02-15 21:30:53'),(5079,'2005-07-09 05:20:40',3948,566,'2005-07-17 00:06:40',1,'2006-02-15 21:30:53'),(5080,'2005-07-09 05:23:55',635,254,'2005-07-11 05:56:55',2,'2006-02-15 21:30:53'),(5081,'2005-07-09 05:25:20',1953,420,'2005-07-13 23:45:20',1,'2006-02-15 21:30:53'),(5082,'2005-07-09 05:28:38',1584,470,'2005-07-10 02:46:38',2,'2006-02-15 21:30:53'),(5083,'2005-07-09 05:30:32',148,494,'2005-07-11 02:20:32',1,'2006-02-15 21:30:53'),(5084,'2005-07-09 05:33:27',3113,87,'2005-07-17 08:54:27',2,'2006-02-15 21:30:53'),(5085,'2005-07-09 05:36:49',4164,437,'2005-07-13 09:26:49',1,'2006-02-15 21:30:53'),(5086,'2005-07-09 05:40:04',3072,539,'2005-07-16 07:51:04',1,'2006-02-15 21:30:53'),(5087,'2005-07-09 05:44:28',3716,395,'2005-07-10 02:25:28',2,'2006-02-15 21:30:53'),(5088,'2005-07-09 05:45:16',3324,454,'2005-07-15 00:41:16',2,'2006-02-15 21:30:53'),(5089,'2005-07-09 05:45:40',451,289,'2005-07-15 05:31:40',1,'2006-02-15 21:30:53'),(5090,'2005-07-09 05:48:22',1728,296,'2005-07-11 06:50:22',2,'2006-02-15 21:30:53'),(5091,'2005-07-09 05:52:54',4572,149,'2005-07-10 02:49:54',1,'2006-02-15 21:30:53'),(5092,'2005-07-09 05:57:39',3256,139,'2005-07-12 00:45:39',2,'2006-02-15 21:30:53'),(5093,'2005-07-09 05:59:12',2734,597,'2005-07-10 11:45:12',2,'2006-02-15 21:30:53'),(5094,'2005-07-09 05:59:47',4451,178,'2005-07-18 05:34:47',2,'2006-02-15 21:30:53'),(5095,'2005-07-09 06:08:22',2788,292,'2005-07-11 10:52:22',1,'2006-02-15 21:30:53'),(5096,'2005-07-09 06:08:23',490,231,'2005-07-14 11:36:23',1,'2006-02-15 21:30:53'),(5097,'2005-07-09 06:09:51',3252,343,'2005-07-10 03:55:51',2,'2006-02-15 21:30:53'),(5098,'2005-07-09 06:13:54',1772,406,'2005-07-10 04:27:54',1,'2006-02-15 21:30:53'),(5099,'2005-07-09 06:14:30',768,393,'2005-07-12 08:23:30',2,'2006-02-15 21:30:53'),(5100,'2005-07-09 06:16:03',3193,101,'2005-07-10 10:21:03',1,'2006-02-15 21:30:53'),(5101,'2005-07-09 06:21:29',2737,154,'2005-07-11 02:58:29',1,'2006-02-15 21:30:53'),(5102,'2005-07-09 06:25:48',242,316,'2005-07-16 11:32:48',2,'2006-02-15 21:30:53'),(5103,'2005-07-09 06:34:40',2390,397,'2005-07-10 03:44:40',2,'2006-02-15 21:30:53'),(5104,'2005-07-09 06:37:07',2109,14,'2005-07-14 12:32:07',1,'2006-02-15 21:30:53'),(5105,'2005-07-09 06:38:59',2555,290,'2005-07-17 03:06:59',2,'2006-02-15 21:30:53'),(5106,'2005-07-09 06:40:24',110,137,'2005-07-13 10:28:24',1,'2006-02-15 21:30:53'),(5107,'2005-07-09 06:42:32',1697,21,'2005-07-10 08:21:32',2,'2006-02-15 21:30:53'),(5108,'2005-07-09 06:44:30',4229,30,'2005-07-17 04:24:30',1,'2006-02-15 21:30:53'),(5109,'2005-07-09 06:48:49',2373,102,'2005-07-14 01:17:49',1,'2006-02-15 21:30:53'),(5110,'2005-07-09 06:57:25',195,200,'2005-07-12 05:39:25',2,'2006-02-15 21:30:53'),(5111,'2005-07-09 07:02:19',2875,12,'2005-07-10 06:27:19',2,'2006-02-15 21:30:53'),(5112,'2005-07-09 07:04:04',3529,285,'2005-07-13 08:42:04',1,'2006-02-15 21:30:53'),(5113,'2005-07-09 07:06:18',3618,282,'2005-07-13 07:10:18',2,'2006-02-15 21:30:53'),(5114,'2005-07-09 07:07:05',3734,64,'2005-07-15 03:06:05',1,'2006-02-15 21:30:53'),(5115,'2005-07-09 07:07:18',2296,212,'2005-07-16 03:28:18',2,'2006-02-15 21:30:53'),(5116,'2005-07-09 07:10:12',2491,332,'2005-07-14 09:16:12',2,'2006-02-15 21:30:53'),(5117,'2005-07-09 07:11:22',2284,208,'2005-07-15 08:44:22',1,'2006-02-15 21:30:53'),(5118,'2005-07-09 07:13:52',957,5,'2005-07-18 05:18:52',2,'2006-02-15 21:30:53'),(5119,'2005-07-09 07:14:18',2996,301,'2005-07-18 04:07:18',1,'2006-02-15 21:30:53'),(5120,'2005-07-09 07:14:23',4431,373,'2005-07-14 04:00:23',2,'2006-02-15 21:30:53'),(5121,'2005-07-09 07:18:31',3321,526,'2005-07-15 01:48:31',1,'2006-02-15 21:30:53'),(5122,'2005-07-09 07:19:35',1423,261,'2005-07-16 03:04:35',2,'2006-02-15 21:30:53'),(5123,'2005-07-09 07:20:30',4278,219,'2005-07-14 05:24:30',1,'2006-02-15 21:30:53'),(5124,'2005-07-09 07:25:19',1857,565,'2005-07-15 01:51:19',1,'2006-02-15 21:30:53'),(5125,'2005-07-09 07:25:28',990,263,'2005-07-12 12:34:28',1,'2006-02-15 21:30:53'),(5126,'2005-07-09 07:25:35',3312,315,'2005-07-18 05:05:35',1,'2006-02-15 21:30:53'),(5127,'2005-07-09 07:25:47',3649,129,'2005-07-13 11:44:47',2,'2006-02-15 21:30:53'),(5128,'2005-07-09 07:25:54',3757,155,'2005-07-16 04:04:54',2,'2006-02-15 21:30:53'),(5129,'2005-07-09 07:28:33',4516,441,'2005-07-14 05:12:33',2,'2006-02-15 21:30:53'),(5130,'2005-07-09 07:29:45',3264,93,'2005-07-13 05:56:45',1,'2006-02-15 21:30:53'),(5131,'2005-07-09 07:35:03',3179,167,'2005-07-10 06:05:03',1,'2006-02-15 21:30:53'),(5132,'2005-07-09 07:40:32',4158,101,'2005-07-16 02:16:32',2,'2006-02-15 21:30:53'),(5133,'2005-07-09 07:43:22',3403,469,'2005-07-12 04:52:22',1,'2006-02-15 21:30:53'),(5134,'2005-07-09 07:53:12',149,491,'2005-07-16 05:30:12',1,'2006-02-15 21:30:53'),(5135,'2005-07-09 07:53:22',3005,538,'2005-07-16 04:50:22',2,'2006-02-15 21:30:53'),(5136,'2005-07-09 07:55:01',3498,395,'2005-07-11 05:26:01',2,'2006-02-15 21:30:53'),(5137,'2005-07-09 08:00:34',409,126,'2005-07-12 05:34:34',1,'2006-02-15 21:30:53'),(5138,'2005-07-09 08:00:46',1283,548,'2005-07-12 09:31:46',2,'2006-02-15 21:30:53'),(5139,'2005-07-09 08:01:51',51,539,'2005-07-18 09:16:51',2,'2006-02-15 21:30:53'),(5140,'2005-07-09 08:04:59',947,303,'2005-07-11 08:28:59',2,'2006-02-15 21:30:53'),(5141,'2005-07-09 08:05:14',590,488,'2005-07-18 04:36:14',1,'2006-02-15 21:30:53'),(5142,'2005-07-09 08:05:23',369,56,'2005-07-13 12:37:23',2,'2006-02-15 21:30:53'),(5143,'2005-07-09 08:07:07',3803,196,'2005-07-18 10:17:07',1,'2006-02-15 21:30:53'),(5144,'2005-07-09 08:09:53',3530,89,'2005-07-18 07:11:53',2,'2006-02-15 21:30:53'),(5145,'2005-07-09 08:13:25',2397,204,'2005-07-10 03:56:25',2,'2006-02-15 21:30:53'),(5146,'2005-07-09 08:14:58',776,194,'2005-07-11 07:04:58',1,'2006-02-15 21:30:53'),(5147,'2005-07-09 08:17:41',2270,326,'2005-07-18 09:45:41',2,'2006-02-15 21:30:53'),(5148,'2005-07-09 08:22:46',456,48,'2005-07-18 04:36:46',1,'2006-02-15 21:30:53'),(5149,'2005-07-09 08:28:23',1500,330,'2005-07-16 06:19:23',2,'2006-02-15 21:30:53'),(5150,'2005-07-09 08:28:40',1961,410,'2005-07-16 04:47:40',1,'2006-02-15 21:30:53'),(5151,'2005-07-09 08:31:03',224,228,'2005-07-10 08:18:03',2,'2006-02-15 21:30:53'),(5152,'2005-07-09 08:34:44',4005,331,'2005-07-10 05:26:44',1,'2006-02-15 21:30:53'),(5153,'2005-07-09 08:35:05',2826,504,'2005-07-18 14:21:05',1,'2006-02-15 21:30:53'),(5154,'2005-07-09 08:46:18',3785,361,'2005-07-14 03:19:18',1,'2006-02-15 21:30:53'),(5155,'2005-07-09 08:46:54',988,523,'2005-07-14 04:13:54',1,'2006-02-15 21:30:53'),(5156,'2005-07-09 08:51:42',416,5,'2005-07-15 03:59:42',2,'2006-02-15 21:30:53'),(5157,'2005-07-09 08:52:12',637,463,'2005-07-12 04:32:12',2,'2006-02-15 21:30:53'),(5158,'2005-07-09 08:53:09',2825,272,'2005-07-10 11:05:09',1,'2006-02-15 21:30:53'),(5159,'2005-07-09 08:55:52',3479,213,'2005-07-10 04:32:52',1,'2006-02-15 21:30:53'),(5160,'2005-07-09 08:57:07',1925,467,'2005-07-18 06:01:07',1,'2006-02-15 21:30:53'),(5161,'2005-07-09 08:57:56',2617,284,'2005-07-18 07:41:56',2,'2006-02-15 21:30:53'),(5162,'2005-07-09 09:00:11',2765,43,'2005-07-17 07:26:11',1,'2006-02-15 21:30:53'),(5163,'2005-07-09 09:00:28',1486,103,'2005-07-17 08:07:28',2,'2006-02-15 21:30:53'),(5164,'2005-07-09 09:03:14',1170,511,'2005-07-14 04:20:14',1,'2006-02-15 21:30:53'),(5165,'2005-07-09 09:08:53',280,590,'2005-07-14 06:01:53',1,'2006-02-15 21:30:53'),(5166,'2005-07-09 09:15:48',2771,298,'2005-07-16 06:04:48',1,'2006-02-15 21:30:53'),(5167,'2005-07-09 09:18:43',2485,437,'2005-07-14 12:59:43',2,'2006-02-15 21:30:53'),(5168,'2005-07-09 09:20:01',4096,420,'2005-07-11 14:42:01',1,'2006-02-15 21:30:53'),(5169,'2005-07-09 09:22:25',2608,116,'2005-07-10 03:48:25',1,'2006-02-15 21:30:53'),(5170,'2005-07-09 09:24:19',66,209,'2005-07-18 04:02:19',1,'2006-02-15 21:30:53'),(5171,'2005-07-09 09:26:55',2099,371,'2005-07-10 10:34:55',1,'2006-02-15 21:30:53'),(5172,'2005-07-09 09:31:27',4046,214,'2005-07-13 04:03:27',1,'2006-02-15 21:30:53'),(5173,'2005-07-09 09:31:44',2848,490,'2005-07-15 04:20:44',2,'2006-02-15 21:30:53'),(5174,'2005-07-09 09:31:59',3621,47,'2005-07-15 03:49:59',1,'2006-02-15 21:30:53'),(5175,'2005-07-09 09:34:28',1003,409,'2005-07-15 15:19:28',2,'2006-02-15 21:30:53'),(5176,'2005-07-09 09:39:31',328,119,'2005-07-17 11:56:31',2,'2006-02-15 21:30:53'),(5177,'2005-07-09 09:43:21',1675,452,'2005-07-13 07:29:21',1,'2006-02-15 21:30:53'),(5178,'2005-07-09 09:59:52',1750,167,'2005-07-18 13:01:52',2,'2006-02-15 21:30:53'),(5179,'2005-07-09 10:00:44',2995,256,'2005-07-11 06:52:44',1,'2006-02-15 21:30:53'),(5180,'2005-07-09 10:06:53',3684,494,'2005-07-12 15:25:53',1,'2006-02-15 21:30:53'),(5181,'2005-07-09 10:07:27',2569,45,'2005-07-17 10:18:27',2,'2006-02-15 21:30:53'),(5182,'2005-07-09 10:08:10',725,197,'2005-07-16 14:36:10',2,'2006-02-15 21:30:53'),(5183,'2005-07-09 10:13:45',2866,394,'2005-07-16 15:55:45',2,'2006-02-15 21:30:53'),(5184,'2005-07-09 10:14:34',1101,166,'2005-07-14 16:05:34',2,'2006-02-15 21:30:53'),(5185,'2005-07-09 10:14:39',357,53,'2005-07-10 13:31:39',1,'2006-02-15 21:30:53'),(5186,'2005-07-09 10:18:40',2415,276,'2005-07-13 05:05:40',2,'2006-02-15 21:30:53'),(5187,'2005-07-09 10:19:51',2631,91,'2005-07-14 10:35:51',1,'2006-02-15 21:30:53'),(5188,'2005-07-09 10:22:31',3265,34,'2005-07-13 04:41:31',1,'2006-02-15 21:30:53'),(5189,'2005-07-09 10:23:21',2539,113,'2005-07-14 08:06:21',1,'2006-02-15 21:30:53'),(5190,'2005-07-09 10:25:24',2213,532,'2005-07-18 04:33:24',1,'2006-02-15 21:30:53'),(5191,'2005-07-09 10:26:48',2131,167,'2005-07-10 15:52:48',2,'2006-02-15 21:30:53'),(5192,'2005-07-09 10:27:09',1225,410,'2005-07-10 12:04:09',1,'2006-02-15 21:30:53'),(5193,'2005-07-09 10:28:18',2166,485,'2005-07-12 12:18:18',1,'2006-02-15 21:30:53'),(5194,'2005-07-09 10:31:34',3809,202,'2005-07-15 08:50:34',2,'2006-02-15 21:30:53'),(5195,'2005-07-09 10:39:31',3399,59,'2005-07-18 13:54:31',1,'2006-02-15 21:30:53'),(5196,'2005-07-09 10:43:34',2278,536,'2005-07-13 12:10:34',2,'2006-02-15 21:30:53'),(5197,'2005-07-09 10:43:54',1571,541,'2005-07-16 10:19:54',1,'2006-02-15 21:30:53'),(5198,'2005-07-09 10:49:10',218,101,'2005-07-13 04:52:10',1,'2006-02-15 21:30:53'),(5199,'2005-07-09 10:50:56',349,42,'2005-07-10 06:43:56',1,'2006-02-15 21:30:53'),(5200,'2005-07-09 10:52:09',4528,125,'2005-07-13 15:12:09',1,'2006-02-15 21:30:53'),(5201,'2005-07-09 10:52:53',2453,551,'2005-07-16 12:41:53',2,'2006-02-15 21:30:53'),(5202,'2005-07-09 10:53:48',3417,321,'2005-07-15 13:31:48',1,'2006-02-15 21:30:53'),(5203,'2005-07-09 10:53:59',3661,588,'2005-07-15 09:45:59',2,'2006-02-15 21:30:53'),(5204,'2005-07-09 10:54:14',1791,432,'2005-07-12 14:29:14',2,'2006-02-15 21:30:53'),(5205,'2005-07-09 10:56:37',161,79,'2005-07-13 05:45:37',1,'2006-02-15 21:30:53'),(5206,'2005-07-09 11:11:01',692,517,'2005-07-17 07:23:01',2,'2006-02-15 21:30:53'),(5207,'2005-07-09 11:15:44',3496,59,'2005-07-17 06:00:44',1,'2006-02-15 21:30:53'),(5208,'2005-07-09 11:16:56',1881,560,'2005-07-10 07:21:56',2,'2006-02-15 21:30:53'),(5209,'2005-07-09 11:22:39',4441,222,'2005-07-17 09:31:39',1,'2006-02-15 21:30:53'),(5210,'2005-07-09 11:24:19',4514,355,'2005-07-11 06:27:19',1,'2006-02-15 21:30:53'),(5211,'2005-07-09 11:26:50',2216,241,'2005-07-16 15:30:50',1,'2006-02-15 21:30:53'),(5212,'2005-07-09 11:37:47',3240,400,'2005-07-15 14:42:47',1,'2006-02-15 21:30:53'),(5213,'2005-07-09 11:39:43',3708,552,'2005-07-18 16:20:43',2,'2006-02-15 21:30:53'),(5214,'2005-07-09 11:43:08',1657,290,'2005-07-17 08:58:08',2,'2006-02-15 21:30:53'),(5215,'2005-07-09 11:47:58',3888,528,'2005-07-18 09:58:58',1,'2006-02-15 21:30:53'),(5216,'2005-07-09 11:54:58',1644,515,'2005-07-12 09:46:58',2,'2006-02-15 21:30:53'),(5217,'2005-07-09 11:56:50',4150,430,'2005-07-17 07:10:50',1,'2006-02-15 21:30:53'),(5218,'2005-07-09 11:57:12',1121,83,'2005-07-13 06:34:12',2,'2006-02-15 21:30:53'),(5219,'2005-07-09 11:57:55',3933,209,'2005-07-15 09:43:55',2,'2006-02-15 21:30:53'),(5220,'2005-07-09 11:59:04',2577,435,'2005-07-15 06:20:04',1,'2006-02-15 21:30:53'),(5221,'2005-07-09 12:02:23',2339,84,'2005-07-16 15:43:23',1,'2006-02-15 21:30:53'),(5222,'2005-07-09 12:05:45',2508,400,'2005-07-13 12:11:45',1,'2006-02-15 21:30:53'),(5223,'2005-07-09 12:06:03',2335,72,'2005-07-17 15:50:03',1,'2006-02-15 21:30:53'),(5224,'2005-07-09 12:07:27',279,311,'2005-07-17 08:59:27',1,'2006-02-15 21:30:53'),(5225,'2005-07-09 12:10:16',703,445,'2005-07-12 09:55:16',2,'2006-02-15 21:30:53'),(5226,'2005-07-09 12:10:44',3128,218,'2005-07-11 17:32:44',2,'2006-02-15 21:30:53'),(5227,'2005-07-09 12:16:39',1862,362,'2005-07-18 15:38:39',2,'2006-02-15 21:30:53'),(5228,'2005-07-09 12:26:01',622,195,'2005-07-14 13:31:01',2,'2006-02-15 21:30:53'),(5229,'2005-07-09 12:30:18',4472,372,'2005-07-14 15:31:18',2,'2006-02-15 21:30:53'),(5230,'2005-07-09 12:30:23',3707,51,'2005-07-13 08:41:23',1,'2006-02-15 21:30:53'),(5231,'2005-07-09 12:35:02',1275,405,'2005-07-10 09:22:02',1,'2006-02-15 21:30:53'),(5232,'2005-07-09 12:35:08',3353,175,'2005-07-14 14:55:08',1,'2006-02-15 21:30:53'),(5233,'2005-07-09 12:44:26',1401,131,'2005-07-15 12:31:26',1,'2006-02-15 21:30:53'),(5234,'2005-07-09 12:44:47',4182,398,'2005-07-17 10:02:47',1,'2006-02-15 21:30:53'),(5235,'2005-07-09 12:54:25',1044,122,'2005-07-18 16:28:25',1,'2006-02-15 21:30:53'),(5236,'2005-07-09 12:56:29',1215,519,'2005-07-13 08:26:29',1,'2006-02-15 21:30:53'),(5237,'2005-07-09 12:56:58',2341,84,'2005-07-11 15:41:58',1,'2006-02-15 21:30:53'),(5238,'2005-07-09 13:11:14',3297,100,'2005-07-10 07:27:14',2,'2006-02-15 21:30:53'),(5239,'2005-07-09 13:12:35',380,497,'2005-07-10 13:37:35',1,'2006-02-15 21:30:53'),(5240,'2005-07-09 13:14:48',1378,350,'2005-07-10 18:47:48',2,'2006-02-15 21:30:53'),(5241,'2005-07-09 13:19:14',4079,314,'2005-07-11 14:32:14',1,'2006-02-15 21:30:53'),(5242,'2005-07-09 13:20:25',848,12,'2005-07-18 07:38:25',1,'2006-02-15 21:30:53'),(5243,'2005-07-09 13:22:08',122,587,'2005-07-16 09:25:08',1,'2006-02-15 21:30:53'),(5244,'2005-07-09 13:24:07',3726,1,'2005-07-14 14:01:07',2,'2006-02-15 21:30:53'),(5245,'2005-07-09 13:24:14',3547,115,'2005-07-12 11:16:14',1,'2006-02-15 21:30:53'),(5246,'2005-07-09 13:25:18',3548,276,'2005-07-13 18:38:18',1,'2006-02-15 21:30:53'),(5247,'2005-07-09 13:26:28',1186,298,'2005-07-12 14:00:28',2,'2006-02-15 21:30:53'),(5248,'2005-07-09 13:29:44',246,279,'2005-07-12 18:12:44',1,'2006-02-15 21:30:53'),(5249,'2005-07-09 13:33:53',1950,389,'2005-07-11 12:55:53',2,'2006-02-15 21:30:53'),(5250,'2005-07-09 13:35:32',2162,384,'2005-07-13 12:19:32',1,'2006-02-15 21:30:53'),(5251,'2005-07-09 13:36:10',478,474,'2005-07-15 11:40:10',1,'2006-02-15 21:30:53'),(5252,'2005-07-09 13:40:44',2581,335,'2005-07-14 09:41:44',1,'2006-02-15 21:30:53'),(5253,'2005-07-09 13:41:17',2241,532,'2005-07-17 17:09:17',1,'2006-02-15 21:30:53'),(5254,'2005-07-09 13:50:11',654,263,'2005-07-13 09:07:11',1,'2006-02-15 21:30:53'),(5255,'2005-07-09 13:51:08',4418,313,'2005-07-17 13:58:08',2,'2006-02-15 21:30:53'),(5256,'2005-07-09 13:55:45',4226,273,'2005-07-15 17:02:45',1,'2006-02-15 21:30:53'),(5257,'2005-07-09 13:56:43',286,292,'2005-07-10 14:26:43',2,'2006-02-15 21:30:53'),(5258,'2005-07-09 13:56:56',3125,207,'2005-07-11 16:01:56',2,'2006-02-15 21:30:53'),(5259,'2005-07-09 14:02:50',1310,207,'2005-07-11 19:13:50',2,'2006-02-15 21:30:53'),(5260,'2005-07-09 14:05:45',3143,75,'2005-07-14 08:41:45',2,'2006-02-15 21:30:53'),(5261,'2005-07-09 14:06:56',2899,105,'2005-07-11 14:21:56',2,'2006-02-15 21:30:53'),(5262,'2005-07-09 14:08:01',1092,240,'2005-07-12 16:48:01',1,'2006-02-15 21:30:53'),(5263,'2005-07-09 14:10:36',119,406,'2005-07-12 15:07:36',1,'2006-02-15 21:30:53'),(5264,'2005-07-09 14:11:28',3307,545,'2005-07-12 18:24:28',2,'2006-02-15 21:30:53'),(5265,'2005-07-09 14:15:01',4482,139,'2005-07-18 14:43:01',2,'2006-02-15 21:30:53'),(5266,'2005-07-09 14:17:40',2409,222,'2005-07-16 10:42:40',1,'2006-02-15 21:30:53'),(5267,'2005-07-09 14:21:10',2242,233,'2005-07-15 12:02:10',1,'2006-02-15 21:30:53'),(5268,'2005-07-09 14:22:43',1083,119,'2005-07-12 08:27:43',1,'2006-02-15 21:30:53'),(5269,'2005-07-09 14:23:05',3886,230,'2005-07-17 14:03:05',1,'2006-02-15 21:30:53'),(5270,'2005-07-09 14:23:46',1523,128,'2005-07-13 15:04:46',1,'2006-02-15 21:30:53'),(5271,'2005-07-09 14:25:01',2691,522,'2005-07-16 17:28:01',1,'2006-02-15 21:30:53'),(5272,'2005-07-09 14:26:01',1547,90,'2005-07-12 20:20:01',1,'2006-02-15 21:30:53'),(5273,'2005-07-09 14:31:24',4570,38,'2005-07-14 13:27:24',2,'2006-02-15 21:30:53'),(5274,'2005-07-09 14:34:09',4579,108,'2005-07-14 13:02:09',1,'2006-02-15 21:30:53'),(5275,'2005-07-09 14:34:18',729,249,'2005-07-13 12:56:18',2,'2006-02-15 21:30:53'),(5276,'2005-07-09 14:35:13',2524,521,'2005-07-12 14:24:13',2,'2006-02-15 21:30:53'),(5277,'2005-07-09 14:40:42',2026,332,'2005-07-16 14:18:42',2,'2006-02-15 21:30:53'),(5278,'2005-07-09 14:44:23',2573,532,'2005-07-15 10:48:23',1,'2006-02-15 21:30:53'),(5279,'2005-07-09 14:46:36',709,64,'2005-07-17 10:04:36',2,'2006-02-15 21:30:53'),(5280,'2005-07-09 14:55:07',1177,351,'2005-07-12 10:05:07',2,'2006-02-15 21:30:53'),(5281,'2005-07-09 14:55:07',1966,71,'2005-07-13 15:24:07',2,'2006-02-15 21:30:53'),(5282,'2005-07-09 15:01:23',4386,226,'2005-07-13 11:06:23',2,'2006-02-15 21:30:53'),(5283,'2005-07-09 15:07:17',644,295,'2005-07-17 09:52:17',2,'2006-02-15 21:30:53'),(5284,'2005-07-09 15:08:21',1036,585,'2005-07-16 09:53:21',2,'2006-02-15 21:30:53'),(5285,'2005-07-09 15:10:44',676,468,'2005-07-16 13:02:44',2,'2006-02-15 21:30:53'),(5286,'2005-07-09 15:11:41',483,498,'2005-07-10 19:19:41',2,'2006-02-15 21:30:53'),(5287,'2005-07-09 15:11:54',3110,523,'2005-07-16 16:05:54',2,'2006-02-15 21:30:53'),(5288,'2005-07-09 15:13:07',850,120,'2005-07-16 12:39:07',1,'2006-02-15 21:30:53'),(5289,'2005-07-09 15:14:08',4336,30,'2005-07-12 12:51:08',2,'2006-02-15 21:30:53'),(5290,'2005-07-09 15:14:47',277,50,'2005-07-11 20:30:47',2,'2006-02-15 21:30:53'),(5291,'2005-07-09 15:15:02',1367,194,'2005-07-15 10:22:02',2,'2006-02-15 21:30:53'),(5292,'2005-07-09 15:16:54',3195,62,'2005-07-11 15:21:54',1,'2006-02-15 21:30:53'),(5293,'2005-07-09 15:17:23',2880,542,'2005-07-11 11:23:23',2,'2006-02-15 21:30:53'),(5294,'2005-07-09 15:23:42',3237,22,'2005-07-15 15:28:42',2,'2006-02-15 21:30:53'),(5295,'2005-07-09 15:25:06',4460,86,'2005-07-10 12:40:06',1,'2006-02-15 21:30:53'),(5296,'2005-07-09 15:26:27',495,109,'2005-07-15 10:03:27',2,'2006-02-15 21:30:53'),(5297,'2005-07-09 15:32:29',3434,202,'2005-07-14 14:58:29',1,'2006-02-15 21:30:53'),(5298,'2005-07-09 15:36:17',3491,149,'2005-07-18 19:07:17',2,'2006-02-15 21:30:53'),(5299,'2005-07-09 15:38:09',4416,469,'2005-07-15 16:39:09',2,'2006-02-15 21:30:53'),(5300,'2005-07-09 15:40:46',2520,8,'2005-07-15 13:46:46',1,'2006-02-15 21:30:53'),(5301,'2005-07-09 15:42:10',245,459,'2005-07-16 21:27:10',2,'2006-02-15 21:30:53'),(5302,'2005-07-09 15:42:36',4270,72,'2005-07-10 21:04:36',2,'2006-02-15 21:30:53'),(5303,'2005-07-09 15:44:09',3572,350,'2005-07-15 18:09:09',2,'2006-02-15 21:30:53'),(5304,'2005-07-09 15:48:06',4411,51,'2005-07-14 19:29:06',1,'2006-02-15 21:30:53'),(5305,'2005-07-09 15:55:36',625,309,'2005-07-18 15:59:36',1,'2006-02-15 21:30:53'),(5306,'2005-07-09 15:56:45',2221,409,'2005-07-15 19:02:45',2,'2006-02-15 21:30:53'),(5307,'2005-07-09 15:57:15',2847,32,'2005-07-17 13:42:15',2,'2006-02-15 21:30:53'),(5308,'2005-07-09 15:58:38',1684,52,'2005-07-15 13:55:38',2,'2006-02-15 21:30:53'),(5309,'2005-07-09 16:00:16',4026,338,'2005-07-17 17:56:16',1,'2006-02-15 21:30:53'),(5310,'2005-07-09 16:00:34',1565,24,'2005-07-12 12:45:34',2,'2006-02-15 21:30:53'),(5311,'2005-07-09 16:02:54',986,107,'2005-07-18 10:44:54',1,'2006-02-15 21:30:53'),(5312,'2005-07-09 16:03:09',2123,258,'2005-07-13 16:41:09',2,'2006-02-15 21:30:53'),(5313,'2005-07-09 16:04:45',1885,52,'2005-07-17 18:53:45',2,'2006-02-15 21:30:53'),(5314,'2005-07-09 16:05:28',3770,372,'2005-07-10 18:18:28',1,'2006-02-15 21:30:53'),(5315,'2005-07-09 16:09:19',585,134,'2005-07-14 21:10:19',1,'2006-02-15 21:30:53'),(5316,'2005-07-09 16:09:42',3856,438,'2005-07-11 15:20:42',1,'2006-02-15 21:30:53'),(5317,'2005-07-09 16:10:25',2693,14,'2005-07-18 17:10:25',2,'2006-02-15 21:30:53'),(5318,'2005-07-09 16:11:33',1738,472,'2005-07-14 12:49:33',2,'2006-02-15 21:30:53'),(5319,'2005-07-09 16:17:44',1899,282,'2005-07-18 16:35:44',1,'2006-02-15 21:30:53'),(5320,'2005-07-09 16:23:32',3140,228,'2005-07-18 18:16:32',1,'2006-02-15 21:30:53'),(5321,'2005-07-09 16:26:33',3347,245,'2005-07-15 15:05:33',2,'2006-02-15 21:30:53'),(5322,'2005-07-09 16:28:13',4420,432,'2005-07-18 14:53:13',1,'2006-02-15 21:30:53'),(5323,'2005-07-09 16:34:07',1302,35,'2005-07-13 21:37:07',1,'2006-02-15 21:30:53'),(5324,'2005-07-09 16:34:18',4024,113,'2005-07-15 12:35:18',2,'2006-02-15 21:30:53'),(5325,'2005-07-09 16:35:47',2703,492,'2005-07-10 11:52:47',1,'2006-02-15 21:30:53'),(5326,'2005-07-09 16:38:01',797,1,'2005-07-13 18:02:01',1,'2006-02-15 21:30:53'),(5327,'2005-07-09 16:39:49',3657,547,'2005-07-12 18:47:49',2,'2006-02-15 21:30:53'),(5328,'2005-07-09 16:48:29',2444,247,'2005-07-17 20:20:29',2,'2006-02-15 21:30:53'),(5329,'2005-07-09 16:49:46',1628,402,'2005-07-16 19:05:46',1,'2006-02-15 21:30:53'),(5330,'2005-07-09 16:53:57',3812,410,'2005-07-18 19:54:57',1,'2006-02-15 21:30:53'),(5331,'2005-07-09 16:54:06',4181,447,'2005-07-10 19:04:06',1,'2006-02-15 21:30:53'),(5332,'2005-07-09 16:59:23',3269,568,'2005-07-10 16:01:23',2,'2006-02-15 21:30:53'),(5333,'2005-07-09 16:59:38',2142,419,'2005-07-16 17:23:38',2,'2006-02-15 21:30:53'),(5334,'2005-07-09 17:00:13',3852,482,'2005-07-11 15:50:13',1,'2006-02-15 21:30:53'),(5335,'2005-07-09 17:00:49',2353,588,'2005-07-12 12:21:49',2,'2006-02-15 21:30:53'),(5336,'2005-07-09 17:01:08',4144,410,'2005-07-11 19:22:08',2,'2006-02-15 21:30:53'),(5337,'2005-07-09 17:03:50',4168,343,'2005-07-16 22:25:50',2,'2006-02-15 21:30:53'),(5338,'2005-07-09 17:07:07',3449,191,'2005-07-14 11:15:07',1,'2006-02-15 21:30:53'),(5339,'2005-07-09 17:09:17',698,380,'2005-07-10 21:07:17',2,'2006-02-15 21:30:53'),(5340,'2005-07-09 17:11:35',650,267,'2005-07-17 17:59:35',2,'2006-02-15 21:30:53'),(5341,'2005-07-09 17:13:23',2522,8,'2005-07-14 18:11:23',2,'2006-02-15 21:30:53'),(5342,'2005-07-09 17:20:03',3828,289,'2005-07-18 12:44:03',2,'2006-02-15 21:30:53'),(5343,'2005-07-09 17:23:43',92,485,'2005-07-18 22:14:43',1,'2006-02-15 21:30:53'),(5344,'2005-07-09 17:27:05',159,197,'2005-07-10 15:51:05',2,'2006-02-15 21:30:53'),(5345,'2005-07-09 17:28:18',3055,348,'2005-07-11 14:30:18',2,'2006-02-15 21:30:53'),(5346,'2005-07-09 17:29:01',2488,287,'2005-07-14 12:47:01',2,'2006-02-15 21:30:53'),(5347,'2005-07-09 17:31:32',1293,246,'2005-07-10 21:06:32',2,'2006-02-15 21:30:53'),(5348,'2005-07-09 17:34:11',3495,597,'2005-07-15 18:32:11',2,'2006-02-15 21:30:53'),(5349,'2005-07-09 17:35:35',3139,161,'2005-07-18 14:05:35',1,'2006-02-15 21:30:53'),(5350,'2005-07-09 17:39:30',724,129,'2005-07-11 16:43:30',2,'2006-02-15 21:30:53'),(5351,'2005-07-09 17:40:52',3722,112,'2005-07-14 16:55:52',2,'2006-02-15 21:30:53'),(5352,'2005-07-09 17:54:58',908,372,'2005-07-15 16:20:58',1,'2006-02-15 21:30:53'),(5353,'2005-07-09 18:04:29',2994,196,'2005-07-15 17:46:29',2,'2006-02-15 21:30:53'),(5354,'2005-07-09 18:04:33',951,354,'2005-07-15 18:19:33',1,'2006-02-15 21:30:53'),(5355,'2005-07-09 18:07:17',2458,100,'2005-07-16 20:33:17',2,'2006-02-15 21:30:53'),(5356,'2005-07-09 18:08:28',2905,188,'2005-07-14 14:11:28',2,'2006-02-15 21:30:53'),(5357,'2005-07-09 18:08:59',1988,411,'2005-07-16 17:28:59',2,'2006-02-15 21:30:53'),(5358,'2005-07-09 18:09:21',3764,71,'2005-07-14 23:59:21',2,'2006-02-15 21:30:53'),(5359,'2005-07-09 18:10:52',4392,453,'2005-07-18 13:34:52',2,'2006-02-15 21:30:53'),(5360,'2005-07-09 18:14:03',679,562,'2005-07-10 15:17:03',2,'2006-02-15 21:30:53'),(5361,'2005-07-09 18:15:32',2045,279,'2005-07-17 23:32:32',2,'2006-02-15 21:30:53'),(5362,'2005-07-09 18:16:08',24,266,'2005-07-18 18:27:08',1,'2006-02-15 21:30:53'),(5363,'2005-07-09 18:18:49',2180,425,'2005-07-14 22:16:49',1,'2006-02-15 21:30:53'),(5364,'2005-07-09 18:24:48',2746,366,'2005-07-10 12:30:48',1,'2006-02-15 21:30:53'),(5365,'2005-07-09 18:27:00',4469,527,'2005-07-11 14:18:00',1,'2006-02-15 21:30:53'),(5366,'2005-07-09 18:28:37',886,187,'2005-07-13 20:45:37',1,'2006-02-15 21:30:53'),(5367,'2005-07-09 18:39:15',1446,485,'2005-07-16 14:19:15',2,'2006-02-15 21:30:53'),(5368,'2005-07-09 18:41:59',4429,502,'2005-07-16 00:32:59',2,'2006-02-15 21:30:53'),(5369,'2005-07-09 18:42:16',1550,538,'2005-07-12 18:16:16',2,'2006-02-15 21:30:53'),(5370,'2005-07-09 18:43:19',2193,248,'2005-07-15 19:59:19',1,'2006-02-15 21:30:53'),(5371,'2005-07-09 18:47:48',789,425,'2005-07-14 14:39:48',2,'2006-02-15 21:30:53'),(5372,'2005-07-09 18:48:39',3551,148,'2005-07-11 17:40:39',1,'2006-02-15 21:30:53'),(5373,'2005-07-09 18:48:57',950,428,'2005-07-10 16:34:57',1,'2006-02-15 21:30:53'),(5374,'2005-07-09 18:52:08',946,144,'2005-07-16 16:34:08',1,'2006-02-15 21:30:53'),(5375,'2005-07-09 18:52:55',1407,558,'2005-07-16 15:32:55',2,'2006-02-15 21:30:53'),(5376,'2005-07-09 18:54:08',1730,104,'2005-07-17 22:01:08',1,'2006-02-15 21:30:53'),(5377,'2005-07-09 19:04:30',3118,578,'2005-07-11 14:42:30',1,'2006-02-15 21:30:53'),(5378,'2005-07-09 19:05:56',1570,138,'2005-07-10 18:03:56',2,'2006-02-15 21:30:53'),(5379,'2005-07-09 19:08:03',2110,475,'2005-07-10 17:58:03',1,'2006-02-15 21:30:53'),(5380,'2005-07-09 19:08:44',3047,166,'2005-07-11 20:09:44',1,'2006-02-15 21:30:53'),(5381,'2005-07-09 19:11:11',3033,332,'2005-07-13 17:10:11',2,'2006-02-15 21:30:53'),(5382,'2005-07-09 19:12:57',78,586,'2005-07-14 15:44:57',1,'2006-02-15 21:30:53'),(5383,'2005-07-09 19:14:32',573,14,'2005-07-11 19:57:32',1,'2006-02-15 21:30:53'),(5384,'2005-07-09 19:17:46',1729,180,'2005-07-12 13:50:46',1,'2006-02-15 21:30:53'),(5385,'2005-07-09 19:18:11',4291,112,'2005-07-16 18:50:11',2,'2006-02-15 21:30:53'),(5386,'2005-07-09 19:19:09',721,594,'2005-07-13 00:13:09',2,'2006-02-15 21:30:53'),(5387,'2005-07-09 19:25:14',4452,244,'2005-07-11 21:00:14',1,'2006-02-15 21:30:53'),(5388,'2005-07-09 19:25:25',1546,332,'2005-07-14 19:51:25',2,'2006-02-15 21:30:53'),(5389,'2005-07-09 19:25:45',3882,484,'2005-07-17 13:31:45',1,'2006-02-15 21:30:53'),(5390,'2005-07-09 19:26:22',715,139,'2005-07-14 22:46:22',1,'2006-02-15 21:30:53'),(5391,'2005-07-09 19:28:34',402,132,'2005-07-18 01:07:34',1,'2006-02-15 21:30:53'),(5392,'2005-07-09 19:32:30',2552,499,'2005-07-16 15:01:30',1,'2006-02-15 21:30:53'),(5393,'2005-07-09 19:35:12',1417,446,'2005-07-11 14:00:12',1,'2006-02-15 21:30:53'),(5394,'2005-07-09 19:36:15',1828,83,'2005-07-18 18:10:15',2,'2006-02-15 21:30:53'),(5395,'2005-07-09 19:42:37',4428,131,'2005-07-10 15:39:37',1,'2006-02-15 21:30:53'),(5396,'2005-07-09 19:42:52',3795,559,'2005-07-15 21:45:52',1,'2006-02-15 21:30:53'),(5397,'2005-07-09 19:43:51',4376,191,'2005-07-17 00:11:51',1,'2006-02-15 21:30:53'),(5398,'2005-07-09 19:44:58',4352,199,'2005-07-17 00:56:58',1,'2006-02-15 21:30:53'),(5399,'2005-07-09 19:52:44',261,67,'2005-07-10 18:31:44',2,'2006-02-15 21:30:53'),(5400,'2005-07-09 19:56:40',3435,192,'2005-07-14 20:43:40',2,'2006-02-15 21:30:53'),(5401,'2005-07-09 19:59:10',431,43,'2005-07-11 23:21:10',2,'2006-02-15 21:30:53'),(5402,'2005-07-09 20:01:58',4450,379,'2005-07-10 14:07:58',1,'2006-02-15 21:30:53'),(5403,'2005-07-09 20:07:09',3991,36,'2005-07-12 18:33:09',1,'2006-02-15 21:30:53'),(5404,'2005-07-09 20:10:43',3685,236,'2005-07-13 15:16:43',1,'2006-02-15 21:30:53'),(5405,'2005-07-09 20:11:49',799,45,'2005-07-18 18:37:49',2,'2006-02-15 21:30:53'),(5406,'2005-07-09 20:13:23',1322,563,'2005-07-11 22:05:23',2,'2006-02-15 21:30:53'),(5407,'2005-07-09 20:16:07',3641,475,'2005-07-14 21:41:07',2,'2006-02-15 21:30:53'),(5408,'2005-07-09 20:16:51',3162,144,'2005-07-18 22:19:51',1,'2006-02-15 21:30:53'),(5409,'2005-07-09 20:17:19',3538,446,'2005-07-13 23:30:19',1,'2006-02-15 21:30:53'),(5410,'2005-07-09 20:21:10',2261,281,'2005-07-18 21:43:10',2,'2006-02-15 21:30:53'),(5411,'2005-07-09 20:23:38',4292,304,'2005-07-16 01:17:38',2,'2006-02-15 21:30:53'),(5412,'2005-07-09 20:23:52',3174,458,'2005-07-18 18:40:52',1,'2006-02-15 21:30:53'),(5413,'2005-07-09 20:28:42',2056,167,'2005-07-10 19:23:42',2,'2006-02-15 21:30:53'),(5414,'2005-07-09 20:29:36',1201,174,'2005-07-13 01:55:36',2,'2006-02-15 21:30:53'),(5415,'2005-07-09 20:30:03',4413,475,'2005-07-18 00:20:03',1,'2006-02-15 21:30:53'),(5416,'2005-07-09 20:33:50',568,219,'2005-07-14 01:50:50',2,'2006-02-15 21:30:53'),(5417,'2005-07-09 20:34:09',3569,265,'2005-07-14 00:36:09',2,'2006-02-15 21:30:53'),(5418,'2005-07-09 20:41:35',55,114,'2005-07-14 00:15:35',1,'2006-02-15 21:30:53'),(5419,'2005-07-09 20:47:36',1516,226,'2005-07-12 01:36:36',1,'2006-02-15 21:30:53'),(5420,'2005-07-09 20:48:42',1739,80,'2005-07-15 21:35:42',2,'2006-02-15 21:30:53'),(5421,'2005-07-09 20:49:12',2437,33,'2005-07-10 16:30:12',1,'2006-02-15 21:30:53'),(5422,'2005-07-09 20:55:47',436,409,'2005-07-15 15:15:47',2,'2006-02-15 21:30:53'),(5423,'2005-07-09 20:56:48',1952,440,'2005-07-17 14:58:48',2,'2006-02-15 21:30:53'),(5424,'2005-07-09 20:59:09',3694,72,'2005-07-12 00:05:09',2,'2006-02-15 21:30:53'),(5425,'2005-07-09 21:02:26',531,37,'2005-07-16 23:38:26',2,'2006-02-15 21:30:53'),(5426,'2005-07-09 21:04:47',251,438,'2005-07-17 00:55:47',1,'2006-02-15 21:30:53'),(5427,'2005-07-09 21:12:26',3197,499,'2005-07-14 01:02:26',1,'2006-02-15 21:30:53'),(5428,'2005-07-09 21:12:50',3109,346,'2005-07-14 16:25:50',2,'2006-02-15 21:30:53'),(5429,'2005-07-09 21:14:03',2467,105,'2005-07-18 01:33:03',1,'2006-02-15 21:30:53'),(5430,'2005-07-09 21:19:54',1441,173,'2005-07-15 22:53:54',1,'2006-02-15 21:30:53'),(5431,'2005-07-09 21:21:11',2780,213,'2005-07-10 21:16:11',1,'2006-02-15 21:30:53'),(5432,'2005-07-09 21:21:25',1958,64,'2005-07-14 21:34:25',2,'2006-02-15 21:30:53'),(5433,'2005-07-09 21:22:00',2679,349,'2005-07-10 21:18:00',2,'2006-02-15 21:30:53'),(5434,'2005-07-09 21:25:20',3790,334,'2005-07-15 03:12:20',2,'2006-02-15 21:30:53'),(5435,'2005-07-09 21:28:07',2884,273,'2005-07-18 21:16:07',2,'2006-02-15 21:30:53'),(5436,'2005-07-09 21:31:11',2364,89,'2005-07-13 16:59:11',2,'2006-02-15 21:30:53'),(5437,'2005-07-09 21:32:29',3532,26,'2005-07-15 00:27:29',2,'2006-02-15 21:30:53'),(5438,'2005-07-09 21:34:32',487,241,'2005-07-16 02:21:32',2,'2006-02-15 21:30:53'),(5439,'2005-07-09 21:39:35',1993,58,'2005-07-13 17:45:35',2,'2006-02-15 21:30:53'),(5440,'2005-07-09 21:45:17',138,332,'2005-07-11 22:43:17',2,'2006-02-15 21:30:53'),(5441,'2005-07-09 21:52:05',3913,7,'2005-07-17 02:54:05',1,'2006-02-15 21:30:53'),(5442,'2005-07-09 21:55:19',3093,29,'2005-07-19 01:18:19',2,'2006-02-15 21:30:53'),(5443,'2005-07-09 21:56:09',2951,137,'2005-07-16 00:33:09',2,'2006-02-15 21:30:53'),(5444,'2005-07-09 21:58:57',2968,10,'2005-07-11 03:09:57',2,'2006-02-15 21:30:53'),(5445,'2005-07-09 21:59:41',565,578,'2005-07-15 00:40:41',1,'2006-02-15 21:30:53'),(5446,'2005-07-09 21:59:55',2769,454,'2005-07-11 01:45:55',2,'2006-02-15 21:30:53'),(5447,'2005-07-09 22:09:28',2530,473,'2005-07-18 20:03:28',2,'2006-02-15 21:30:53'),(5448,'2005-07-09 22:11:14',646,463,'2005-07-15 21:08:14',2,'2006-02-15 21:30:53'),(5449,'2005-07-09 22:12:01',921,261,'2005-07-18 01:18:01',2,'2006-02-15 21:30:53'),(5450,'2005-07-09 22:13:25',2356,328,'2005-07-13 23:28:25',1,'2006-02-15 21:30:53'),(5451,'2005-07-09 22:22:10',3484,39,'2005-07-11 02:43:10',1,'2006-02-15 21:30:53'),(5452,'2005-07-09 22:23:21',2036,80,'2005-07-17 00:20:21',1,'2006-02-15 21:30:53'),(5453,'2005-07-09 22:24:11',1780,106,'2005-07-19 04:08:11',1,'2006-02-15 21:30:53'),(5454,'2005-07-09 22:24:25',3049,97,'2005-07-11 01:52:25',1,'2006-02-15 21:30:53'),(5455,'2005-07-09 22:28:45',1955,464,'2005-07-18 02:50:45',2,'2006-02-15 21:30:53'),(5456,'2005-07-09 22:31:45',3003,360,'2005-07-12 03:53:45',1,'2006-02-15 21:30:53'),(5457,'2005-07-09 22:33:14',4179,433,'2005-07-12 02:30:14',1,'2006-02-15 21:30:53'),(5458,'2005-07-09 22:35:49',2203,521,'2005-07-16 22:55:49',1,'2006-02-15 21:30:53'),(5459,'2005-07-09 22:43:56',1847,168,'2005-07-12 18:05:56',1,'2006-02-15 21:30:53'),(5460,'2005-07-09 22:46:14',2410,38,'2005-07-12 21:26:14',2,'2006-02-15 21:30:53'),(5461,'2005-07-09 22:48:04',53,244,'2005-07-10 17:56:04',2,'2006-02-15 21:30:53'),(5462,'2005-07-09 22:56:53',871,583,'2005-07-11 21:50:53',2,'2006-02-15 21:30:53'),(5463,'2005-07-09 22:57:02',601,374,'2005-07-11 03:10:02',1,'2006-02-15 21:30:53'),(5464,'2005-07-09 22:58:14',3692,434,'2005-07-15 02:48:14',1,'2006-02-15 21:30:53'),(5465,'2005-07-09 23:01:13',723,503,'2005-07-13 01:03:13',1,'2006-02-15 21:30:53'),(5466,'2005-07-09 23:03:21',2302,482,'2005-07-10 20:11:21',2,'2006-02-15 21:30:53'),(5467,'2005-07-09 23:05:47',374,543,'2005-07-16 17:06:47',2,'2006-02-15 21:30:53'),(5468,'2005-07-09 23:06:09',2196,81,'2005-07-13 00:48:09',1,'2006-02-15 21:30:53'),(5469,'2005-07-09 23:08:07',2201,475,'2005-07-13 19:13:07',1,'2006-02-15 21:30:53'),(5470,'2005-07-09 23:10:49',3254,325,'2005-07-18 04:30:49',1,'2006-02-15 21:30:53'),(5471,'2005-07-09 23:11:52',4086,347,'2005-07-13 02:08:52',2,'2006-02-15 21:30:53'),(5472,'2005-07-09 23:16:40',865,165,'2005-07-10 18:43:40',2,'2006-02-15 21:30:53'),(5473,'2005-07-09 23:19:11',4283,51,'2005-07-19 02:30:11',2,'2006-02-15 21:30:53'),(5474,'2005-07-09 23:23:57',3608,375,'2005-07-15 03:11:57',1,'2006-02-15 21:30:53'),(5475,'2005-07-09 23:31:38',726,219,'2005-07-12 03:51:38',1,'2006-02-15 21:30:53'),(5476,'2005-07-09 23:37:09',1199,427,'2005-07-15 23:57:09',1,'2006-02-15 21:30:53'),(5477,'2005-07-09 23:43:49',994,542,'2005-07-15 05:03:49',2,'2006-02-15 21:30:53'),(5478,'2005-07-09 23:45:15',3213,583,'2005-07-15 22:48:15',1,'2006-02-15 21:30:53'),(5479,'2005-07-09 23:47:33',216,250,'2005-07-13 01:09:33',1,'2006-02-15 21:30:53'),(5480,'2005-07-09 23:49:07',847,452,'2005-07-12 00:15:07',1,'2006-02-15 21:30:53'),(5481,'2005-07-09 23:51:57',562,479,'2005-07-11 05:28:57',2,'2006-02-15 21:30:53'),(5482,'2005-07-09 23:53:04',2136,460,'2005-07-15 04:59:04',1,'2006-02-15 21:30:53'),(5483,'2005-07-09 23:54:09',4362,89,'2005-07-17 23:36:09',1,'2006-02-15 21:30:53'),(5484,'2005-07-09 23:54:37',3248,495,'2005-07-15 02:05:37',1,'2006-02-15 21:30:53'),(5485,'2005-07-09 23:55:25',3930,173,'2005-07-14 04:08:25',1,'2006-02-15 21:30:53'),(5486,'2005-07-09 23:57:44',2864,538,'2005-07-14 00:23:44',1,'2006-02-15 21:30:53'),(5487,'2005-07-10 00:01:50',1144,341,'2005-07-10 20:43:50',1,'2006-02-15 21:30:53'),(5488,'2005-07-10 00:02:06',4262,173,'2005-07-15 01:45:06',2,'2006-02-15 21:30:53'),(5489,'2005-07-10 00:07:03',2319,490,'2005-07-15 19:52:03',1,'2006-02-15 21:30:53'),(5490,'2005-07-10 00:09:11',3044,367,'2005-07-14 21:23:11',1,'2006-02-15 21:30:53'),(5491,'2005-07-10 00:09:45',2007,49,'2005-07-11 02:25:45',1,'2006-02-15 21:30:53'),(5492,'2005-07-10 00:11:09',4524,558,'2005-07-14 01:27:09',1,'2006-02-15 21:30:53'),(5493,'2005-07-10 00:11:44',2037,539,'2005-07-15 19:24:44',2,'2006-02-15 21:30:53'),(5494,'2005-07-10 00:15:00',3087,139,'2005-07-17 01:12:00',2,'2006-02-15 21:30:53'),(5495,'2005-07-10 00:16:54',2199,257,'2005-07-19 01:22:54',2,'2006-02-15 21:30:53'),(5496,'2005-07-10 00:20:23',3182,369,'2005-07-18 21:10:23',2,'2006-02-15 21:30:53'),(5497,'2005-07-10 00:23:23',4473,92,'2005-07-16 03:54:23',1,'2006-02-15 21:30:53'),(5498,'2005-07-10 00:27:21',63,302,'2005-07-13 20:11:21',2,'2006-02-15 21:30:53'),(5499,'2005-07-10 00:27:45',1525,127,'2005-07-17 06:11:45',1,'2006-02-15 21:30:53'),(5500,'2005-07-10 00:28:17',3380,457,'2005-07-15 19:09:17',1,'2006-02-15 21:30:53'),(5501,'2005-07-10 00:33:48',3979,372,'2005-07-17 02:58:48',1,'2006-02-15 21:30:53'),(5502,'2005-07-10 00:34:15',3712,243,'2005-07-11 21:44:15',1,'2006-02-15 21:30:53'),(5503,'2005-07-10 00:35:37',3892,262,'2005-07-12 20:29:37',1,'2006-02-15 21:30:53'),(5504,'2005-07-10 00:36:38',3053,455,'2005-07-16 19:36:38',1,'2006-02-15 21:30:53'),(5505,'2005-07-10 00:38:48',896,253,'2005-07-12 03:12:48',2,'2006-02-15 21:30:53'),(5506,'2005-07-10 00:45:48',2432,117,'2005-07-18 20:35:48',2,'2006-02-15 21:30:53'),(5507,'2005-07-10 00:49:04',716,399,'2005-07-15 22:06:04',2,'2006-02-15 21:30:53'),(5508,'2005-07-10 00:50:01',2977,345,'2005-07-16 19:07:01',1,'2006-02-15 21:30:53'),(5509,'2005-07-10 00:54:46',1142,102,'2005-07-16 05:10:46',1,'2006-02-15 21:30:53'),(5510,'2005-07-10 00:58:37',1298,67,'2005-07-17 22:02:37',2,'2006-02-15 21:30:53'),(5511,'2005-07-10 01:00:00',3678,301,'2005-07-12 20:44:00',1,'2006-02-15 21:30:53'),(5512,'2005-07-10 01:05:38',4470,405,'2005-07-17 20:47:38',1,'2006-02-15 21:30:53'),(5513,'2005-07-10 01:05:41',2558,356,'2005-07-11 02:05:41',2,'2006-02-15 21:30:53'),(5514,'2005-07-10 01:09:42',1824,522,'2005-07-17 05:47:42',1,'2006-02-15 21:30:53'),(5515,'2005-07-10 01:12:44',3772,39,'2005-07-13 00:39:44',1,'2006-02-15 21:30:53'),(5516,'2005-07-10 01:13:52',1902,581,'2005-07-15 22:56:52',1,'2006-02-15 21:30:53'),(5517,'2005-07-10 01:15:00',3689,42,'2005-07-19 01:59:00',1,'2006-02-15 21:30:53'),(5518,'2005-07-10 01:15:11',3340,451,'2005-07-18 19:28:11',2,'2006-02-15 21:30:53'),(5519,'2005-07-10 01:18:32',1312,85,'2005-07-11 20:39:32',1,'2006-02-15 21:30:53'),(5520,'2005-07-10 01:30:41',2527,501,'2005-07-15 21:37:41',2,'2006-02-15 21:30:53'),(5521,'2005-07-10 01:31:22',1956,182,'2005-07-17 05:42:22',2,'2006-02-15 21:30:53'),(5522,'2005-07-10 01:46:29',2622,573,'2005-07-18 00:41:29',2,'2006-02-15 21:30:53'),(5523,'2005-07-10 01:47:55',2233,125,'2005-07-18 22:25:55',1,'2006-02-15 21:30:53'),(5524,'2005-07-10 01:49:24',3596,386,'2005-07-14 22:55:24',1,'2006-02-15 21:30:53'),(5525,'2005-07-10 02:03:08',3141,241,'2005-07-18 07:32:08',1,'2006-02-15 21:30:53'),(5526,'2005-07-10 02:04:03',3909,144,'2005-07-16 22:15:03',2,'2006-02-15 21:30:53'),(5527,'2005-07-10 02:06:01',4462,554,'2005-07-15 00:55:01',2,'2006-02-15 21:30:53'),(5528,'2005-07-10 02:09:21',680,551,'2005-07-17 06:22:21',2,'2006-02-15 21:30:53'),(5529,'2005-07-10 02:11:13',1652,590,'2005-07-15 06:56:13',2,'2006-02-15 21:30:53'),(5530,'2005-07-10 02:13:49',2701,74,'2005-07-18 08:01:49',2,'2006-02-15 21:30:53'),(5531,'2005-07-10 02:13:59',2992,173,'2005-07-15 00:01:59',2,'2006-02-15 21:30:53'),(5532,'2005-07-10 02:17:31',983,522,'2005-07-16 02:57:31',2,'2006-02-15 21:30:53'),(5533,'2005-07-10 02:19:28',2567,270,'2005-07-11 01:37:28',1,'2006-02-15 21:30:53'),(5534,'2005-07-10 02:26:49',3251,156,'2005-07-11 07:13:49',1,'2006-02-15 21:30:53'),(5535,'2005-07-10 02:27:42',1623,394,'2005-07-12 21:13:42',1,'2006-02-15 21:30:53'),(5536,'2005-07-10 02:29:42',1919,195,'2005-07-13 04:06:42',2,'2006-02-15 21:30:53'),(5537,'2005-07-10 02:35:41',1781,254,'2005-07-13 07:11:41',2,'2006-02-15 21:30:53'),(5538,'2005-07-10 02:39:40',2119,367,'2005-07-12 01:39:40',2,'2006-02-15 21:30:53'),(5539,'2005-07-10 02:42:58',3217,90,'2005-07-16 02:27:58',2,'2006-02-15 21:30:53'),(5540,'2005-07-10 02:44:21',132,250,'2005-07-11 07:13:21',1,'2006-02-15 21:30:53'),(5541,'2005-07-10 02:44:27',1211,135,'2005-07-13 04:13:27',2,'2006-02-15 21:30:53'),(5542,'2005-07-10 02:45:53',1713,105,'2005-07-15 23:23:53',2,'2006-02-15 21:30:53'),(5543,'2005-07-10 02:48:03',1496,71,'2005-07-17 05:49:03',2,'2006-02-15 21:30:53'),(5544,'2005-07-10 02:48:07',1014,316,'2005-07-17 01:08:07',1,'2006-02-15 21:30:53'),(5545,'2005-07-10 02:50:29',118,236,'2005-07-16 02:11:29',1,'2006-02-15 21:30:53'),(5546,'2005-07-10 02:50:37',2918,515,'2005-07-16 08:22:37',1,'2006-02-15 21:30:53'),(5547,'2005-07-10 02:52:47',1432,519,'2005-07-16 02:10:47',1,'2006-02-15 21:30:53'),(5548,'2005-07-10 02:56:45',2973,317,'2005-07-13 01:33:45',2,'2006-02-15 21:30:53'),(5549,'2005-07-10 02:58:29',2685,163,'2005-07-17 05:24:29',2,'2006-02-15 21:30:53'),(5550,'2005-07-10 02:58:35',1905,254,'2005-07-16 02:38:35',2,'2006-02-15 21:30:53'),(5551,'2005-07-10 03:01:09',4238,44,'2005-07-18 02:04:09',2,'2006-02-15 21:30:53'),(5552,'2005-07-10 03:01:19',2879,27,'2005-07-13 06:53:19',2,'2006-02-15 21:30:53'),(5553,'2005-07-10 03:03:35',1686,6,'2005-07-14 07:49:35',2,'2006-02-15 21:30:53'),(5554,'2005-07-10 03:03:38',4084,252,'2005-07-17 00:00:38',2,'2006-02-15 21:30:53'),(5555,'2005-07-10 03:08:55',2551,79,'2005-07-11 01:36:55',2,'2006-02-15 21:30:53'),(5556,'2005-07-10 03:10:17',4483,354,'2005-07-14 02:47:17',1,'2006-02-15 21:30:53'),(5557,'2005-07-10 03:10:21',1433,346,'2005-07-11 21:34:21',1,'2006-02-15 21:30:53'),(5558,'2005-07-10 03:12:08',1123,96,'2005-07-14 03:09:08',2,'2006-02-15 21:30:53'),(5559,'2005-07-10 03:13:07',4122,496,'2005-07-18 08:33:07',1,'2006-02-15 21:30:53'),(5560,'2005-07-10 03:13:24',720,231,'2005-07-19 06:03:24',2,'2006-02-15 21:30:53'),(5561,'2005-07-10 03:15:24',1048,369,'2005-07-15 06:46:24',1,'2006-02-15 21:30:53'),(5562,'2005-07-10 03:17:42',3604,300,'2005-07-12 03:26:42',1,'2006-02-15 21:30:53'),(5563,'2005-07-10 03:21:02',2258,362,'2005-07-14 07:40:02',1,'2006-02-15 21:30:53'),(5564,'2005-07-10 03:23:05',196,355,'2005-07-16 07:46:05',2,'2006-02-15 21:30:53'),(5565,'2005-07-10 03:29:48',3368,14,'2005-07-17 04:43:48',1,'2006-02-15 21:30:53'),(5566,'2005-07-10 03:30:17',1343,124,'2005-07-13 06:32:17',1,'2006-02-15 21:30:53'),(5567,'2005-07-10 03:36:46',1616,147,'2005-07-15 23:22:46',2,'2006-02-15 21:30:53'),(5568,'2005-07-10 03:36:56',1130,424,'2005-07-11 08:35:56',2,'2006-02-15 21:30:53'),(5569,'2005-07-10 03:38:32',2835,69,'2005-07-16 00:02:32',2,'2006-02-15 21:30:53'),(5570,'2005-07-10 03:46:47',2013,374,'2005-07-17 09:28:47',1,'2006-02-15 21:30:53'),(5571,'2005-07-10 03:48:20',1084,76,'2005-07-11 02:09:20',2,'2006-02-15 21:30:53'),(5572,'2005-07-10 03:49:00',2709,458,'2005-07-14 01:25:00',1,'2006-02-15 21:30:53'),(5573,'2005-07-10 03:50:47',2957,170,'2005-07-17 06:40:47',2,'2006-02-15 21:30:53'),(5574,'2005-07-10 03:54:38',2307,163,'2005-07-19 07:20:38',2,'2006-02-15 21:30:53'),(5575,'2005-07-10 03:55:50',2316,107,'2005-07-12 08:40:50',1,'2006-02-15 21:30:53'),(5576,'2005-07-10 03:57:05',1453,217,'2005-07-13 02:16:05',2,'2006-02-15 21:30:53'),(5577,'2005-07-10 03:58:40',3779,266,'2005-07-14 03:36:40',1,'2006-02-15 21:30:53'),(5578,'2005-07-10 04:00:31',4543,378,'2005-07-16 08:06:31',2,'2006-02-15 21:30:53'),(5579,'2005-07-10 04:04:29',945,203,'2005-07-14 04:31:29',1,'2006-02-15 21:30:53'),(5580,'2005-07-10 04:05:49',2753,521,'2005-07-18 22:36:49',2,'2006-02-15 21:30:53'),(5581,'2005-07-10 04:06:06',3450,306,'2005-07-15 08:31:06',2,'2006-02-15 21:30:53'),(5582,'2005-07-10 04:08:25',3341,305,'2005-07-13 06:04:25',1,'2006-02-15 21:30:53'),(5583,'2005-07-10 04:08:48',1242,391,'2005-07-19 07:59:48',1,'2006-02-15 21:30:53'),(5584,'2005-07-10 04:15:25',2606,289,'2005-07-16 22:54:25',2,'2006-02-15 21:30:53'),(5585,'2005-07-10 04:15:43',3524,63,'2005-07-15 08:24:43',1,'2006-02-15 21:30:53'),(5586,'2005-07-10 04:17:06',2965,427,'2005-07-18 07:11:06',1,'2006-02-15 21:30:53'),(5587,'2005-07-10 04:17:25',4485,531,'2005-07-15 01:41:25',1,'2006-02-15 21:30:53'),(5588,'2005-07-10 04:21:10',1166,535,'2005-07-16 02:58:10',2,'2006-02-15 21:30:53'),(5589,'2005-07-10 04:22:58',3673,296,'2005-07-10 23:13:58',1,'2006-02-15 21:30:53'),(5590,'2005-07-10 04:23:11',4442,407,'2005-07-19 09:03:11',1,'2006-02-15 21:30:53'),(5591,'2005-07-10 04:25:03',378,374,'2005-07-16 04:21:03',1,'2006-02-15 21:30:53'),(5592,'2005-07-10 04:26:13',2471,222,'2005-07-19 02:32:13',2,'2006-02-15 21:30:53'),(5593,'2005-07-10 04:33:13',702,287,'2005-07-17 08:44:13',2,'2006-02-15 21:30:53'),(5594,'2005-07-10 04:33:36',61,440,'2005-07-12 08:13:36',2,'2006-02-15 21:30:53'),(5595,'2005-07-10 04:33:45',264,572,'2005-07-16 04:04:45',1,'2006-02-15 21:30:53'),(5596,'2005-07-10 04:43:14',1662,240,'2005-07-11 22:58:14',2,'2006-02-15 21:30:53'),(5597,'2005-07-10 04:47:57',4264,576,'2005-07-17 01:54:57',2,'2006-02-15 21:30:53'),(5598,'2005-07-10 04:48:29',3412,397,'2005-07-18 10:33:29',2,'2006-02-15 21:30:53'),(5599,'2005-07-10 04:52:04',3054,391,'2005-07-13 05:19:04',1,'2006-02-15 21:30:53'),(5600,'2005-07-10 04:55:45',3713,138,'2005-07-18 03:10:45',2,'2006-02-15 21:30:53'),(5601,'2005-07-10 04:56:55',3062,511,'2005-07-11 00:14:55',1,'2006-02-15 21:30:53'),(5602,'2005-07-10 05:02:22',3544,253,'2005-07-14 23:40:22',2,'2006-02-15 21:30:53'),(5603,'2005-07-10 05:04:54',1308,74,'2005-07-12 01:54:54',2,'2006-02-15 21:30:53'),(5604,'2005-07-10 05:05:00',3702,78,'2005-07-12 08:04:00',1,'2006-02-15 21:30:53'),(5605,'2005-07-10 05:06:45',2964,273,'2005-07-15 02:51:45',2,'2006-02-15 21:30:53'),(5606,'2005-07-10 05:07:55',2896,51,'2005-07-15 00:14:55',2,'2006-02-15 21:30:53'),(5607,'2005-07-10 05:08:10',4257,52,'2005-07-15 00:40:10',2,'2006-02-15 21:30:53'),(5608,'2005-07-10 05:08:26',3854,384,'2005-07-10 23:24:26',1,'2006-02-15 21:30:53'),(5609,'2005-07-10 05:09:46',1553,492,'2005-07-12 10:38:46',1,'2006-02-15 21:30:53'),(5610,'2005-07-10 05:09:52',481,131,'2005-07-13 07:08:52',2,'2006-02-15 21:30:53'),(5611,'2005-07-10 05:13:43',2832,424,'2005-07-16 05:56:43',1,'2006-02-15 21:30:53'),(5612,'2005-07-10 05:15:12',2363,472,'2005-07-17 09:50:12',2,'2006-02-15 21:30:53'),(5613,'2005-07-10 05:15:43',4517,220,'2005-07-13 05:17:43',2,'2006-02-15 21:30:53'),(5614,'2005-07-10 05:16:56',133,371,'2005-07-13 02:03:56',1,'2006-02-15 21:30:53'),(5615,'2005-07-10 05:18:51',1521,173,'2005-07-17 11:05:51',2,'2006-02-15 21:30:53'),(5616,'2005-07-10 05:21:11',4014,238,'2005-07-18 08:42:11',2,'2006-02-15 21:30:53'),(5617,'2005-07-10 05:28:50',2324,342,'2005-07-12 00:02:50',2,'2006-02-15 21:30:53'),(5618,'2005-07-10 05:28:58',757,316,'2005-07-18 01:38:58',1,'2006-02-15 21:30:53'),(5619,'2005-07-10 05:29:33',113,204,'2005-07-15 00:40:33',1,'2006-02-15 21:30:53'),(5620,'2005-07-10 05:30:52',2980,92,'2005-07-16 04:13:52',1,'2006-02-15 21:30:53'),(5621,'2005-07-10 05:34:10',552,310,'2005-07-14 02:49:10',1,'2006-02-15 21:30:53'),(5622,'2005-07-10 05:39:37',1783,568,'2005-07-15 00:48:37',2,'2006-02-15 21:30:53'),(5623,'2005-07-10 05:41:38',4464,229,'2005-07-14 01:01:38',2,'2006-02-15 21:30:53'),(5624,'2005-07-10 05:43:16',1015,114,'2005-07-12 05:33:16',1,'2006-02-15 21:30:53'),(5625,'2005-07-10 05:44:02',1751,114,'2005-07-12 00:03:02',2,'2006-02-15 21:30:53'),(5626,'2005-07-10 05:49:35',3029,389,'2005-07-15 08:05:35',1,'2006-02-15 21:30:53'),(5627,'2005-07-10 05:51:12',244,136,'2005-07-17 09:56:12',2,'2006-02-15 21:30:53'),(5628,'2005-07-10 05:56:40',4040,87,'2005-07-17 11:13:40',1,'2006-02-15 21:30:53'),(5629,'2005-07-10 06:02:25',400,546,'2005-07-16 07:33:25',1,'2006-02-15 21:30:53'),(5630,'2005-07-10 06:08:14',1151,537,'2005-07-14 03:37:14',2,'2006-02-15 21:30:53'),(5631,'2005-07-10 06:15:45',2095,595,'2005-07-17 09:53:45',2,'2006-02-15 21:30:53'),(5632,'2005-07-10 06:17:06',2632,404,'2005-07-17 02:32:06',2,'2006-02-15 21:30:53'),(5633,'2005-07-10 06:22:24',1056,480,'2005-07-11 05:59:24',2,'2006-02-15 21:30:53'),(5634,'2005-07-10 06:25:48',323,487,'2005-07-17 09:07:48',2,'2006-02-15 21:30:53'),(5635,'2005-07-10 06:28:39',1457,222,'2005-07-17 08:35:39',2,'2006-02-15 21:30:53'),(5636,'2005-07-10 06:31:24',4116,2,'2005-07-13 02:36:24',1,'2006-02-15 21:30:53'),(5637,'2005-07-10 06:31:37',4436,45,'2005-07-17 01:16:37',1,'2006-02-15 21:30:53'),(5638,'2005-07-10 06:32:49',1528,570,'2005-07-13 04:32:49',2,'2006-02-15 21:30:53'),(5639,'2005-07-10 06:33:39',2452,249,'2005-07-19 07:47:39',1,'2006-02-15 21:30:53'),(5640,'2005-07-10 06:38:00',2706,574,'2005-07-18 08:56:00',2,'2006-02-15 21:30:53'),(5641,'2005-07-10 06:43:43',3568,50,'2005-07-15 06:33:43',1,'2006-02-15 21:30:53'),(5642,'2005-07-10 06:46:08',3630,299,'2005-07-13 10:03:08',1,'2006-02-15 21:30:53'),(5643,'2005-07-10 06:49:00',796,34,'2005-07-14 01:53:00',1,'2006-02-15 21:30:53'),(5644,'2005-07-10 06:57:44',4069,476,'2005-07-15 03:52:44',2,'2006-02-15 21:30:53'),(5645,'2005-07-10 06:58:21',1586,333,'2005-07-18 04:19:21',2,'2006-02-15 21:30:53'),(5646,'2005-07-10 07:08:09',1471,166,'2005-07-14 03:48:09',2,'2006-02-15 21:30:53'),(5647,'2005-07-10 07:08:40',1466,128,'2005-07-13 05:19:40',2,'2006-02-15 21:30:53'),(5648,'2005-07-10 07:09:21',4359,24,'2005-07-16 07:23:21',2,'2006-02-15 21:30:53'),(5649,'2005-07-10 07:15:07',1349,336,'2005-07-12 11:57:07',2,'2006-02-15 21:30:53'),(5650,'2005-07-10 07:17:01',2793,461,'2005-07-15 11:59:01',1,'2006-02-15 21:30:53'),(5651,'2005-07-10 07:17:13',301,239,'2005-07-15 12:13:13',2,'2006-02-15 21:30:53'),(5652,'2005-07-10 07:18:58',927,42,'2005-07-19 07:52:58',1,'2006-02-15 21:30:53'),(5653,'2005-07-10 07:21:27',919,28,'2005-07-16 01:58:27',1,'2006-02-15 21:30:53'),(5654,'2005-07-10 07:24:46',3419,490,'2005-07-14 07:39:46',2,'2006-02-15 21:30:53'),(5655,'2005-07-10 07:31:06',3470,113,'2005-07-17 08:22:06',1,'2006-02-15 21:30:53'),(5656,'2005-07-10 07:31:07',4138,159,'2005-07-15 04:44:07',1,'2006-02-15 21:30:53'),(5657,'2005-07-10 07:33:43',4342,508,'2005-07-18 01:55:43',2,'2006-02-15 21:30:53'),(5658,'2005-07-10 07:34:08',4402,165,'2005-07-19 04:21:08',2,'2006-02-15 21:30:53'),(5659,'2005-07-10 07:45:40',4265,9,'2005-07-15 05:20:40',1,'2006-02-15 21:30:53'),(5660,'2005-07-10 07:46:12',1404,171,'2005-07-17 07:48:12',1,'2006-02-15 21:30:53'),(5661,'2005-07-10 07:53:51',1878,108,'2005-07-14 12:57:51',2,'2006-02-15 21:30:53'),(5662,'2005-07-10 07:59:24',219,502,'2005-07-14 13:06:24',1,'2006-02-15 21:30:53'),(5663,'2005-07-10 08:01:33',3078,530,'2005-07-15 03:36:33',2,'2006-02-15 21:30:53'),(5664,'2005-07-10 08:04:41',2375,469,'2005-07-17 10:29:41',1,'2006-02-15 21:30:53'),(5665,'2005-07-10 08:10:08',1175,415,'2005-07-11 05:22:08',2,'2006-02-15 21:30:53'),(5666,'2005-07-10 08:10:29',2225,242,'2005-07-17 04:54:29',2,'2006-02-15 21:30:53'),(5667,'2005-07-10 08:11:03',683,336,'2005-07-15 08:23:03',2,'2006-02-15 21:30:53'),(5668,'2005-07-10 08:11:05',309,211,'2005-07-16 13:15:05',1,'2006-02-15 21:30:53'),(5669,'2005-07-10 08:12:53',1173,323,'2005-07-11 05:48:53',2,'2006-02-15 21:30:53'),(5670,'2005-07-10 08:14:52',610,121,'2005-07-14 04:13:52',2,'2006-02-15 21:30:53'),(5671,'2005-07-10 08:18:22',1304,268,'2005-07-11 07:03:22',2,'2006-02-15 21:30:53'),(5672,'2005-07-10 08:19:38',2326,158,'2005-07-16 06:28:38',2,'2006-02-15 21:30:53'),(5673,'2005-07-10 08:21:54',4018,117,'2005-07-11 05:54:54',2,'2006-02-15 21:30:53'),(5674,'2005-07-10 08:26:26',548,258,'2005-07-16 02:43:26',1,'2006-02-15 21:30:53'),(5675,'2005-07-10 08:31:06',2134,376,'2005-07-17 11:48:06',1,'2006-02-15 21:30:53'),(5676,'2005-07-10 08:38:32',3595,153,'2005-07-13 10:11:32',1,'2006-02-15 21:30:53'),(5677,'2005-07-10 08:41:28',2647,105,'2005-07-12 09:05:28',2,'2006-02-15 21:30:53'),(5678,'2005-07-10 08:42:42',4366,96,'2005-07-19 03:48:42',1,'2006-02-15 21:30:53'),(5679,'2005-07-10 08:44:02',389,138,'2005-07-14 05:30:02',1,'2006-02-15 21:30:53'),(5680,'2005-07-10 08:47:36',3503,199,'2005-07-17 06:10:36',1,'2006-02-15 21:30:53'),(5681,'2005-07-10 08:48:39',4176,50,'2005-07-18 07:17:39',1,'2006-02-15 21:30:53'),(5682,'2005-07-10 08:51:39',17,302,'2005-07-12 14:44:39',2,'2006-02-15 21:30:53'),(5683,'2005-07-10 08:52:13',4433,285,'2005-07-19 10:25:13',1,'2006-02-15 21:30:53'),(5684,'2005-07-10 08:59:03',99,132,'2005-07-15 07:21:03',1,'2006-02-15 21:30:53'),(5685,'2005-07-10 09:01:38',1462,170,'2005-07-17 10:58:38',1,'2006-02-15 21:30:53'),(5686,'2005-07-10 09:06:03',717,521,'2005-07-11 10:59:03',2,'2006-02-15 21:30:53'),(5687,'2005-07-10 09:07:19',2170,363,'2005-07-16 11:17:19',2,'2006-02-15 21:30:53'),(5688,'2005-07-10 09:16:08',3036,598,'2005-07-15 09:44:08',1,'2006-02-15 21:30:53'),(5689,'2005-07-10 09:24:17',1731,381,'2005-07-15 05:36:17',1,'2006-02-15 21:30:53'),(5690,'2005-07-10 09:26:49',1326,362,'2005-07-19 07:17:49',2,'2006-02-15 21:30:53'),(5691,'2005-07-10 09:29:49',3526,466,'2005-07-16 13:37:49',1,'2006-02-15 21:30:53'),(5692,'2005-07-10 09:32:22',59,244,'2005-07-15 15:20:22',2,'2006-02-15 21:30:53'),(5693,'2005-07-10 09:35:43',2167,208,'2005-07-12 08:05:43',2,'2006-02-15 21:30:53'),(5694,'2005-07-10 09:40:38',3476,57,'2005-07-14 09:16:38',1,'2006-02-15 21:30:53'),(5695,'2005-07-10 09:43:40',440,459,'2005-07-13 15:04:40',2,'2006-02-15 21:30:53'),(5696,'2005-07-10 09:44:32',128,96,'2005-07-12 13:38:32',2,'2006-02-15 21:30:53'),(5697,'2005-07-10 09:44:44',934,515,'2005-07-12 12:13:44',2,'2006-02-15 21:30:53'),(5698,'2005-07-10 09:47:00',639,46,'2005-07-16 06:26:00',1,'2006-02-15 21:30:53'),(5699,'2005-07-10 09:48:04',958,211,'2005-07-17 09:07:04',1,'2006-02-15 21:30:53'),(5700,'2005-07-10 09:49:42',3961,87,'2005-07-19 04:20:42',1,'2006-02-15 21:30:53'),(5701,'2005-07-10 09:56:24',2395,91,'2005-07-16 15:11:24',2,'2006-02-15 21:30:53'),(5702,'2005-07-10 10:00:01',3349,324,'2005-07-11 15:29:01',1,'2006-02-15 21:30:53'),(5703,'2005-07-10 10:04:15',1585,132,'2005-07-16 07:43:15',1,'2006-02-15 21:30:53'),(5704,'2005-07-10 10:06:29',2104,591,'2005-07-17 10:48:29',1,'2006-02-15 21:30:53'),(5705,'2005-07-10 10:09:17',4030,300,'2005-07-19 07:24:17',2,'2006-02-15 21:30:53'),(5706,'2005-07-10 10:21:46',3701,255,'2005-07-16 04:37:46',2,'2006-02-15 21:30:53'),(5707,'2005-07-10 10:26:14',708,581,'2005-07-18 06:19:14',1,'2006-02-15 21:30:53'),(5708,'2005-07-10 10:29:19',571,484,'2005-07-18 06:50:19',1,'2006-02-15 21:30:53'),(5709,'2005-07-10 10:31:52',732,302,'2005-07-12 10:47:52',1,'2006-02-15 21:30:53'),(5710,'2005-07-10 10:32:52',2843,265,'2005-07-18 06:28:52',1,'2006-02-15 21:30:53'),(5711,'2005-07-10 10:37:20',3988,481,'2005-07-13 11:20:20',1,'2006-02-15 21:30:53'),(5712,'2005-07-10 10:40:32',3480,304,'2005-07-12 11:45:32',1,'2006-02-15 21:30:53'),(5713,'2005-07-10 10:46:15',1213,572,'2005-07-19 14:34:15',1,'2006-02-15 21:30:53'),(5714,'2005-07-10 10:46:57',3706,17,'2005-07-18 14:07:57',1,'2006-02-15 21:30:53'),(5715,'2005-07-10 10:48:03',1638,132,'2005-07-18 11:27:03',1,'2006-02-15 21:30:53'),(5716,'2005-07-10 10:59:23',3416,102,'2005-07-16 12:25:23',2,'2006-02-15 21:30:53'),(5717,'2005-07-10 11:02:03',529,15,'2005-07-13 13:00:03',1,'2006-02-15 21:30:53'),(5718,'2005-07-10 11:03:20',3719,20,'2005-07-19 15:38:20',2,'2006-02-15 21:30:53'),(5719,'2005-07-10 11:07:40',2100,94,'2005-07-15 14:14:40',2,'2006-02-15 21:30:53'),(5720,'2005-07-10 11:09:12',576,339,'2005-07-16 07:31:12',1,'2006-02-15 21:30:53'),(5721,'2005-07-10 11:09:35',2348,5,'2005-07-17 16:41:35',2,'2006-02-15 21:30:53'),(5722,'2005-07-10 11:10:04',2890,556,'2005-07-12 16:31:04',2,'2006-02-15 21:30:53'),(5723,'2005-07-10 11:14:48',605,33,'2005-07-11 15:46:48',2,'2006-02-15 21:30:53'),(5724,'2005-07-10 11:18:12',3597,289,'2005-07-16 14:53:12',2,'2006-02-15 21:30:53'),(5725,'2005-07-10 11:21:21',4293,426,'2005-07-14 05:34:21',2,'2006-02-15 21:30:53'),(5726,'2005-07-10 11:22:08',3582,131,'2005-07-13 05:55:08',1,'2006-02-15 21:30:53'),(5727,'2005-07-10 11:25:28',3338,550,'2005-07-11 11:03:28',2,'2006-02-15 21:30:53'),(5728,'2005-07-10 11:26:14',636,335,'2005-07-15 12:55:14',1,'2006-02-15 21:30:53'),(5729,'2005-07-10 11:27:25',4137,188,'2005-07-15 06:13:25',2,'2006-02-15 21:30:53'),(5730,'2005-07-10 11:28:32',1903,301,'2005-07-11 11:45:32',2,'2006-02-15 21:30:53'),(5731,'2005-07-10 11:31:52',2960,440,'2005-07-14 11:44:52',1,'2006-02-15 21:30:53'),(5732,'2005-07-10 11:36:32',2833,597,'2005-07-12 13:09:32',2,'2006-02-15 21:30:53'),(5733,'2005-07-10 11:37:24',3806,415,'2005-07-11 12:34:24',2,'2006-02-15 21:30:53'),(5734,'2005-07-10 11:37:28',399,447,'2005-07-16 11:10:28',1,'2006-02-15 21:30:53'),(5735,'2005-07-10 11:39:15',3259,65,'2005-07-19 09:52:15',1,'2006-02-15 21:30:53'),(5736,'2005-07-10 11:45:48',1172,27,'2005-07-13 16:40:48',1,'2006-02-15 21:30:53'),(5737,'2005-07-10 11:50:04',1118,218,'2005-07-13 10:37:04',1,'2006-02-15 21:30:53'),(5738,'2005-07-10 11:50:51',200,187,'2005-07-19 17:46:51',1,'2006-02-15 21:30:53'),(5739,'2005-07-10 11:51:50',163,219,'2005-07-19 17:40:50',1,'2006-02-15 21:30:53'),(5740,'2005-07-10 11:51:58',2147,325,'2005-07-12 07:53:58',2,'2006-02-15 21:30:53'),(5741,'2005-07-10 11:55:40',2041,513,'2005-07-16 15:02:40',2,'2006-02-15 21:30:53'),(5742,'2005-07-10 11:56:18',3975,596,'2005-07-19 06:59:18',2,'2006-02-15 21:30:53'),(5743,'2005-07-10 11:57:38',593,297,'2005-07-19 15:38:38',2,'2006-02-15 21:30:53'),(5744,'2005-07-10 12:08:33',1372,437,'2005-07-14 12:34:33',2,'2006-02-15 21:30:53'),(5745,'2005-07-10 12:10:11',41,305,'2005-07-19 06:56:11',1,'2006-02-15 21:30:53'),(5746,'2005-07-10 12:15:12',3071,82,'2005-07-16 07:02:12',1,'2006-02-15 21:30:53'),(5747,'2005-07-10 12:15:33',4562,583,'2005-07-18 10:11:33',1,'2006-02-15 21:30:53'),(5748,'2005-07-10 12:19:59',1618,99,'2005-07-12 12:59:59',1,'2006-02-15 21:30:53'),(5749,'2005-07-10 12:20:36',1768,304,'2005-07-19 10:39:36',1,'2006-02-15 21:30:53'),(5750,'2005-07-10 12:20:41',3855,330,'2005-07-17 08:25:41',2,'2006-02-15 21:30:53'),(5751,'2005-07-10 12:25:11',387,479,'2005-07-11 15:23:11',1,'2006-02-15 21:30:53'),(5752,'2005-07-10 12:27:38',4444,86,'2005-07-18 09:22:38',2,'2006-02-15 21:30:53'),(5753,'2005-07-10 12:29:43',3639,444,'2005-07-17 12:50:43',2,'2006-02-15 21:30:53'),(5754,'2005-07-10 12:32:43',162,291,'2005-07-12 13:11:43',2,'2006-02-15 21:30:53'),(5755,'2005-07-10 12:38:56',2760,2,'2005-07-19 17:02:56',1,'2006-02-15 21:30:53'),(5756,'2005-07-10 12:39:28',130,183,'2005-07-11 14:08:28',2,'2006-02-15 21:30:53'),(5757,'2005-07-10 12:40:17',1827,101,'2005-07-12 14:02:17',1,'2006-02-15 21:30:53'),(5758,'2005-07-10 12:42:43',502,363,'2005-07-16 10:18:43',2,'2006-02-15 21:30:53'),(5759,'2005-07-10 12:43:22',816,591,'2005-07-16 16:42:22',1,'2006-02-15 21:30:53'),(5760,'2005-07-10 12:44:48',1050,154,'2005-07-14 12:25:48',1,'2006-02-15 21:30:53'),(5761,'2005-07-10 12:45:36',1763,287,'2005-07-13 10:05:36',2,'2006-02-15 21:30:53'),(5762,'2005-07-10 12:48:01',1815,217,'2005-07-18 16:43:01',1,'2006-02-15 21:30:53'),(5763,'2005-07-10 12:58:12',753,397,'2005-07-14 08:52:12',1,'2006-02-15 21:30:53'),(5764,'2005-07-10 12:58:16',1556,245,'2005-07-19 07:28:16',1,'2006-02-15 21:30:53'),(5765,'2005-07-10 13:03:02',2619,293,'2005-07-16 09:31:02',1,'2006-02-15 21:30:53'),(5766,'2005-07-10 13:07:31',7,406,'2005-07-16 13:03:31',1,'2006-02-15 21:30:53'),(5767,'2005-07-10 13:13:18',2871,32,'2005-07-17 14:41:18',2,'2006-02-15 21:30:53'),(5768,'2005-07-10 13:15:26',345,196,'2005-07-15 09:42:26',1,'2006-02-15 21:30:53'),(5769,'2005-07-10 13:17:58',4052,141,'2005-07-11 11:32:58',1,'2006-02-15 21:30:53'),(5770,'2005-07-10 13:21:28',914,71,'2005-07-11 08:59:28',2,'2006-02-15 21:30:53'),(5771,'2005-07-10 13:26:45',3275,153,'2005-07-14 15:43:45',1,'2006-02-15 21:30:53'),(5772,'2005-07-10 13:27:40',3635,21,'2005-07-17 08:24:40',1,'2006-02-15 21:30:53'),(5773,'2005-07-10 13:31:09',3277,180,'2005-07-15 08:21:09',2,'2006-02-15 21:30:53'),(5774,'2005-07-10 13:31:56',326,113,'2005-07-18 07:32:56',1,'2006-02-15 21:30:53'),(5775,'2005-07-10 13:34:26',2175,325,'2005-07-15 10:01:26',1,'2006-02-15 21:30:53'),(5776,'2005-07-10 13:35:22',3592,568,'2005-07-12 17:58:22',1,'2006-02-15 21:30:53'),(5777,'2005-07-10 13:38:41',3959,40,'2005-07-17 15:48:41',2,'2006-02-15 21:30:53'),(5778,'2005-07-10 13:41:37',4435,324,'2005-07-14 16:26:37',1,'2006-02-15 21:30:53'),(5779,'2005-07-10 13:45:54',3266,244,'2005-07-15 18:13:54',1,'2006-02-15 21:30:53'),(5780,'2005-07-10 13:46:23',168,516,'2005-07-14 17:19:23',2,'2006-02-15 21:30:53'),(5781,'2005-07-10 13:49:30',3191,167,'2005-07-11 12:11:30',2,'2006-02-15 21:30:53'),(5782,'2005-07-10 13:52:56',2514,440,'2005-07-15 09:32:56',2,'2006-02-15 21:30:53'),(5783,'2005-07-10 13:55:33',3331,385,'2005-07-16 12:13:33',1,'2006-02-15 21:30:53'),(5784,'2005-07-10 14:03:28',2323,422,'2005-07-16 16:22:28',1,'2006-02-15 21:30:53'),(5785,'2005-07-10 14:06:03',142,211,'2005-07-17 17:59:03',2,'2006-02-15 21:30:53'),(5786,'2005-07-10 14:06:44',2290,350,'2005-07-14 19:55:44',2,'2006-02-15 21:30:53'),(5787,'2005-07-10 14:08:49',1075,44,'2005-07-19 18:29:49',1,'2006-02-15 21:30:53'),(5788,'2005-07-10 14:10:22',1707,63,'2005-07-14 19:46:22',2,'2006-02-15 21:30:53'),(5789,'2005-07-10 14:11:26',2601,571,'2005-07-18 16:19:26',1,'2006-02-15 21:30:53'),(5790,'2005-07-10 14:15:21',1696,235,'2005-07-14 08:53:21',2,'2006-02-15 21:30:53'),(5791,'2005-07-10 14:16:22',2795,319,'2005-07-19 13:38:22',2,'2006-02-15 21:30:53'),(5792,'2005-07-10 14:22:19',4234,92,'2005-07-19 09:08:19',1,'2006-02-15 21:30:53'),(5793,'2005-07-10 14:33:00',2927,268,'2005-07-13 19:27:00',1,'2006-02-15 21:30:53'),(5794,'2005-07-10 14:34:53',1164,198,'2005-07-17 11:50:53',2,'2006-02-15 21:30:53'),(5795,'2005-07-10 14:36:29',3958,304,'2005-07-14 13:26:29',1,'2006-02-15 21:30:53'),(5796,'2005-07-10 14:42:54',1631,286,'2005-07-17 08:47:54',2,'2006-02-15 21:30:53'),(5797,'2005-07-10 14:43:52',1880,384,'2005-07-13 16:12:52',2,'2006-02-15 21:30:53'),(5798,'2005-07-10 14:45:09',331,107,'2005-07-16 13:43:09',1,'2006-02-15 21:30:53'),(5799,'2005-07-10 14:53:35',3045,520,'2005-07-14 16:18:35',2,'2006-02-15 21:30:53'),(5800,'2005-07-10 14:58:36',2466,411,'2005-07-11 19:50:36',2,'2006-02-15 21:30:53'),(5801,'2005-07-10 14:59:05',3511,439,'2005-07-14 17:55:05',2,'2006-02-15 21:30:53'),(5802,'2005-07-10 15:02:17',2295,520,'2005-07-19 15:43:17',2,'2006-02-15 21:30:53'),(5803,'2005-07-10 15:05:42',1982,244,'2005-07-15 10:19:42',1,'2006-02-15 21:30:53'),(5804,'2005-07-10 15:06:31',2168,137,'2005-07-14 11:00:31',1,'2006-02-15 21:30:53'),(5805,'2005-07-10 15:08:41',3553,532,'2005-07-19 16:35:41',2,'2006-02-15 21:30:53'),(5806,'2005-07-10 15:11:54',29,108,'2005-07-15 11:51:54',2,'2006-02-15 21:30:53'),(5807,'2005-07-10 15:16:30',2092,301,'2005-07-11 14:02:30',2,'2006-02-15 21:30:53'),(5808,'2005-07-10 15:17:33',2310,170,'2005-07-14 12:14:33',2,'2006-02-15 21:30:53'),(5809,'2005-07-10 15:19:30',1748,461,'2005-07-13 12:31:30',2,'2006-02-15 21:30:53'),(5810,'2005-07-10 15:22:04',1426,482,'2005-07-18 21:05:04',2,'2006-02-15 21:30:53'),(5811,'2005-07-10 15:27:04',4007,441,'2005-07-12 17:20:04',1,'2006-02-15 21:30:53'),(5812,'2005-07-10 15:27:56',1681,581,'2005-07-18 15:37:56',2,'2006-02-15 21:30:53'),(5813,'2005-07-10 15:34:37',942,512,'2005-07-17 16:14:37',2,'2006-02-15 21:30:53'),(5814,'2005-07-10 15:46:50',2537,71,'2005-07-13 15:28:50',2,'2006-02-15 21:30:53'),(5815,'2005-07-10 15:48:19',2934,22,'2005-07-13 12:09:19',1,'2006-02-15 21:30:53'),(5816,'2005-07-10 15:48:47',1746,382,'2005-07-13 11:51:47',2,'2006-02-15 21:30:53'),(5817,'2005-07-10 15:49:12',2993,28,'2005-07-18 19:30:12',2,'2006-02-15 21:30:53'),(5818,'2005-07-10 15:51:12',3940,334,'2005-07-14 14:10:12',2,'2006-02-15 21:30:53'),(5819,'2005-07-10 15:56:20',3439,347,'2005-07-12 19:59:20',2,'2006-02-15 21:30:53'),(5820,'2005-07-10 16:04:59',1511,485,'2005-07-16 12:10:59',1,'2006-02-15 21:30:53'),(5821,'2005-07-10 16:07:16',147,302,'2005-07-14 19:48:16',1,'2006-02-15 21:30:53'),(5822,'2005-07-10 16:10:39',1385,38,'2005-07-13 19:05:39',2,'2006-02-15 21:30:53'),(5823,'2005-07-10 16:19:52',1879,483,'2005-07-11 12:33:52',2,'2006-02-15 21:30:53'),(5824,'2005-07-10 16:19:53',1980,449,'2005-07-12 11:17:53',2,'2006-02-15 21:30:53'),(5825,'2005-07-10 16:20:30',3843,444,'2005-07-11 18:58:30',1,'2006-02-15 21:30:53'),(5826,'2005-07-10 16:21:02',4104,254,'2005-07-17 21:08:02',1,'2006-02-15 21:30:53'),(5827,'2005-07-10 16:22:20',1296,290,'2005-07-15 21:13:20',2,'2006-02-15 21:30:53'),(5828,'2005-07-10 16:27:25',2999,156,'2005-07-11 18:42:25',1,'2006-02-15 21:30:53'),(5829,'2005-07-10 16:29:41',3405,118,'2005-07-14 22:03:41',1,'2006-02-15 21:30:53'),(5830,'2005-07-10 16:34:00',2358,59,'2005-07-18 16:42:00',1,'2006-02-15 21:30:53'),(5831,'2005-07-10 16:34:02',830,43,'2005-07-11 14:27:02',2,'2006-02-15 21:30:53'),(5832,'2005-07-10 16:34:48',2387,63,'2005-07-17 17:25:48',1,'2006-02-15 21:30:53'),(5833,'2005-07-10 16:39:24',3829,187,'2005-07-17 12:52:24',1,'2006-02-15 21:30:53'),(5834,'2005-07-10 16:44:12',85,360,'2005-07-14 11:34:12',2,'2006-02-15 21:30:53'),(5835,'2005-07-10 16:44:58',800,11,'2005-07-17 16:03:58',2,'2006-02-15 21:30:53'),(5836,'2005-07-10 16:49:02',1842,310,'2005-07-11 22:35:02',2,'2006-02-15 21:30:53'),(5837,'2005-07-10 16:57:50',1648,478,'2005-07-18 14:07:50',2,'2006-02-15 21:30:53'),(5838,'2005-07-10 17:04:56',1627,202,'2005-07-11 15:15:56',1,'2006-02-15 21:30:53'),(5839,'2005-07-10 17:08:30',252,367,'2005-07-13 21:21:30',2,'2006-02-15 21:30:53'),(5840,'2005-07-10 17:09:09',1073,72,'2005-07-15 22:52:09',1,'2006-02-15 21:30:53'),(5841,'2005-07-10 17:11:31',1230,525,'2005-07-18 15:50:31',2,'2006-02-15 21:30:53'),(5842,'2005-07-10 17:11:37',139,247,'2005-07-14 21:43:37',1,'2006-02-15 21:30:53'),(5843,'2005-07-10 17:14:27',1615,599,'2005-07-15 21:18:27',2,'2006-02-15 21:30:53'),(5844,'2005-07-10 17:14:43',609,147,'2005-07-12 19:27:43',1,'2006-02-15 21:30:53'),(5845,'2005-07-10 17:23:14',2882,334,'2005-07-12 16:29:14',2,'2006-02-15 21:30:53'),(5846,'2005-07-10 17:25:24',938,233,'2005-07-12 13:41:24',2,'2006-02-15 21:30:53'),(5847,'2005-07-10 17:27:42',4403,220,'2005-07-12 14:51:42',2,'2006-02-15 21:30:53'),(5848,'2005-07-10 17:28:14',4549,409,'2005-07-14 11:54:14',1,'2006-02-15 21:30:53'),(5849,'2005-07-10 17:32:33',1632,44,'2005-07-19 22:39:33',1,'2006-02-15 21:30:53'),(5850,'2005-07-10 17:36:27',4015,531,'2005-07-15 16:44:27',2,'2006-02-15 21:30:53'),(5851,'2005-07-10 17:40:47',3944,510,'2005-07-11 19:24:47',2,'2006-02-15 21:30:53'),(5852,'2005-07-10 17:43:30',3890,484,'2005-07-15 15:05:30',2,'2006-02-15 21:30:53'),(5853,'2005-07-10 17:45:13',3026,520,'2005-07-17 21:37:13',1,'2006-02-15 21:30:53'),(5854,'2005-07-10 17:47:34',997,547,'2005-07-13 20:14:34',2,'2006-02-15 21:30:53'),(5855,'2005-07-10 17:54:06',2457,166,'2005-07-18 15:41:06',2,'2006-02-15 21:30:53'),(5856,'2005-07-10 17:57:32',497,314,'2005-07-11 13:57:32',1,'2006-02-15 21:30:53'),(5857,'2005-07-10 17:59:29',1265,29,'2005-07-18 18:13:29',1,'2006-02-15 21:30:53'),(5858,'2005-07-10 18:00:07',2913,257,'2005-07-11 20:01:07',2,'2006-02-15 21:30:53'),(5859,'2005-07-10 18:02:02',131,220,'2005-07-11 23:24:02',1,'2006-02-15 21:30:53'),(5860,'2005-07-10 18:08:49',3897,180,'2005-07-16 16:43:49',2,'2006-02-15 21:30:53'),(5861,'2005-07-10 18:14:22',3881,277,'2005-07-14 15:32:22',1,'2006-02-15 21:30:53'),(5862,'2005-07-10 18:20:48',2075,157,'2005-07-17 00:09:48',1,'2006-02-15 21:30:53'),(5863,'2005-07-10 18:25:23',2557,419,'2005-07-15 23:49:23',1,'2006-02-15 21:30:53'),(5864,'2005-07-10 18:29:57',4380,437,'2005-07-19 14:27:57',2,'2006-02-15 21:30:53'),(5865,'2005-07-10 18:31:05',1382,126,'2005-07-12 18:29:05',2,'2006-02-15 21:30:53'),(5866,'2005-07-10 18:35:14',457,484,'2005-07-19 19:41:14',2,'2006-02-15 21:30:53'),(5867,'2005-07-10 18:39:01',730,321,'2005-07-19 21:56:01',2,'2006-02-15 21:30:53'),(5868,'2005-07-10 18:39:16',452,429,'2005-07-15 21:19:16',1,'2006-02-15 21:30:53'),(5869,'2005-07-10 18:40:09',2157,40,'2005-07-17 18:42:09',1,'2006-02-15 21:30:53'),(5870,'2005-07-10 18:40:25',1524,438,'2005-07-12 15:39:25',2,'2006-02-15 21:30:53'),(5871,'2005-07-10 18:46:08',3288,307,'2005-07-16 17:32:08',1,'2006-02-15 21:30:53'),(5872,'2005-07-10 18:54:05',270,364,'2005-07-19 15:41:05',1,'2006-02-15 21:30:53'),(5873,'2005-07-10 19:02:10',3151,354,'2005-07-14 19:13:10',2,'2006-02-15 21:30:53'),(5874,'2005-07-10 19:02:51',2255,131,'2005-07-16 13:14:51',1,'2006-02-15 21:30:53'),(5875,'2005-07-10 19:06:47',964,575,'2005-07-18 17:33:47',2,'2006-02-15 21:30:53'),(5876,'2005-07-10 19:07:15',4445,578,'2005-07-14 17:29:15',2,'2006-02-15 21:30:53'),(5877,'2005-07-10 19:08:51',1520,537,'2005-07-19 19:48:51',1,'2006-02-15 21:30:53'),(5878,'2005-07-10 19:09:57',3805,271,'2005-07-16 17:22:57',1,'2006-02-15 21:30:53'),(5879,'2005-07-10 19:12:47',3851,430,'2005-07-16 16:32:47',1,'2006-02-15 21:30:53'),(5880,'2005-07-10 19:14:58',359,482,'2005-07-17 01:13:58',1,'2006-02-15 21:30:53'),(5881,'2005-07-10 19:19:43',236,25,'2005-07-12 20:11:43',1,'2006-02-15 21:30:53'),(5882,'2005-07-10 19:20:34',2830,319,'2005-07-11 18:39:34',2,'2006-02-15 21:30:53'),(5883,'2005-07-10 19:25:21',2820,17,'2005-07-16 20:50:21',2,'2006-02-15 21:30:53'),(5884,'2005-07-10 19:31:38',916,498,'2005-07-11 20:30:38',1,'2006-02-15 21:30:53'),(5885,'2005-07-10 19:33:50',3129,331,'2005-07-17 00:26:50',2,'2006-02-15 21:30:53'),(5886,'2005-07-10 19:36:25',907,215,'2005-07-11 22:24:25',2,'2006-02-15 21:30:53'),(5887,'2005-07-10 19:45:47',2602,532,'2005-07-15 22:15:47',1,'2006-02-15 21:30:53'),(5888,'2005-07-10 19:52:17',1620,268,'2005-07-18 20:32:17',2,'2006-02-15 21:30:53'),(5889,'2005-07-10 19:54:41',1706,491,'2005-07-12 20:08:41',2,'2006-02-15 21:30:53'),(5890,'2005-07-10 20:00:25',1463,535,'2005-07-18 17:57:25',2,'2006-02-15 21:30:53'),(5891,'2005-07-10 20:01:17',4355,184,'2005-07-12 00:15:17',1,'2006-02-15 21:30:53'),(5892,'2005-07-10 20:02:42',4322,333,'2005-07-11 20:02:42',1,'2006-02-15 21:30:53'),(5893,'2005-07-10 20:05:30',1689,439,'2005-07-14 23:05:30',1,'2006-02-15 21:30:53'),(5894,'2005-07-10 20:09:34',2264,194,'2005-07-17 15:39:34',1,'2006-02-15 21:30:53'),(5895,'2005-07-10 20:13:19',2272,164,'2005-07-17 17:51:19',1,'2006-02-15 21:30:53'),(5896,'2005-07-10 20:15:56',731,357,'2005-07-12 00:39:56',1,'2006-02-15 21:30:53'),(5897,'2005-07-10 20:16:14',740,413,'2005-07-19 15:49:14',2,'2006-02-15 21:30:53'),(5898,'2005-07-10 20:18:09',3257,538,'2005-07-16 14:44:09',1,'2006-02-15 21:30:53'),(5899,'2005-07-10 20:21:52',1391,388,'2005-07-13 00:46:52',1,'2006-02-15 21:30:53'),(5900,'2005-07-10 20:21:54',1081,419,'2005-07-17 00:26:54',1,'2006-02-15 21:30:53'),(5901,'2005-07-10 20:22:12',86,165,'2005-07-19 16:43:12',2,'2006-02-15 21:30:53'),(5902,'2005-07-10 20:31:24',2727,228,'2005-07-11 20:50:24',1,'2006-02-15 21:30:53'),(5903,'2005-07-10 20:39:04',1388,573,'2005-07-11 17:41:04',1,'2006-02-15 21:30:53'),(5904,'2005-07-10 20:39:44',350,531,'2005-07-13 17:57:44',2,'2006-02-15 21:30:53'),(5905,'2005-07-10 20:41:09',3891,10,'2005-07-19 14:49:09',1,'2006-02-15 21:30:53'),(5906,'2005-07-10 20:41:41',514,323,'2005-07-14 00:12:41',2,'2006-02-15 21:30:53'),(5907,'2005-07-10 20:41:41',4432,168,'2005-07-15 21:18:41',2,'2006-02-15 21:30:53'),(5908,'2005-07-10 20:44:14',810,156,'2005-07-13 15:05:14',2,'2006-02-15 21:30:53'),(5909,'2005-07-10 20:46:13',2333,44,'2005-07-14 18:01:13',2,'2006-02-15 21:30:53'),(5910,'2005-07-10 20:51:34',1039,464,'2005-07-19 14:54:34',1,'2006-02-15 21:30:53'),(5911,'2005-07-10 20:51:42',4140,420,'2005-07-14 21:58:42',2,'2006-02-15 21:30:53'),(5912,'2005-07-10 20:58:22',1187,351,'2005-07-17 01:15:22',2,'2006-02-15 21:30:53'),(5913,'2005-07-10 20:58:55',2767,277,'2005-07-13 15:18:55',1,'2006-02-15 21:30:53'),(5914,'2005-07-10 21:01:12',2639,372,'2005-07-16 18:27:12',2,'2006-02-15 21:30:53'),(5915,'2005-07-10 21:12:16',2464,66,'2005-07-15 16:59:16',2,'2006-02-15 21:30:53'),(5916,'2005-07-10 21:26:31',2267,35,'2005-07-19 20:23:31',1,'2006-02-15 21:30:53'),(5917,'2005-07-10 21:30:22',2910,74,'2005-07-12 18:54:22',2,'2006-02-15 21:30:53'),(5918,'2005-07-10 21:32:06',120,34,'2005-07-19 21:35:06',1,'2006-02-15 21:30:53'),(5919,'2005-07-10 21:32:14',164,92,'2005-07-12 16:47:14',1,'2006-02-15 21:30:53'),(5920,'2005-07-10 21:33:58',1893,221,'2005-07-17 19:41:58',2,'2006-02-15 21:30:53'),(5921,'2005-07-10 21:35:12',3920,7,'2005-07-18 19:59:12',1,'2006-02-15 21:30:53'),(5922,'2005-07-10 21:36:53',1392,271,'2005-07-16 02:51:53',1,'2006-02-15 21:30:53'),(5923,'2005-07-10 21:40:06',1817,401,'2005-07-13 00:01:06',1,'2006-02-15 21:30:53'),(5924,'2005-07-10 21:41:23',629,191,'2005-07-16 21:33:23',1,'2006-02-15 21:30:53'),(5925,'2005-07-10 21:41:27',3724,503,'2005-07-18 18:35:27',2,'2006-02-15 21:30:53'),(5926,'2005-07-10 21:53:42',2840,282,'2005-07-20 01:04:42',1,'2006-02-15 21:30:53'),(5927,'2005-07-10 21:57:14',807,70,'2005-07-16 19:32:14',1,'2006-02-15 21:30:53'),(5928,'2005-07-10 21:58:30',4132,50,'2005-07-15 19:41:30',1,'2006-02-15 21:30:53'),(5929,'2005-07-10 21:59:29',4303,54,'2005-07-14 20:20:29',2,'2006-02-15 21:30:53'),(5930,'2005-07-10 21:59:32',2338,254,'2005-07-11 18:40:32',2,'2006-02-15 21:30:53'),(5931,'2005-07-10 22:04:19',2259,341,'2005-07-13 00:45:19',2,'2006-02-15 21:30:53'),(5932,'2005-07-10 22:05:15',2269,523,'2005-07-12 17:04:15',2,'2006-02-15 21:30:53'),(5933,'2005-07-10 22:06:48',4372,419,'2005-07-12 23:58:48',2,'2006-02-15 21:30:53'),(5934,'2005-07-10 22:07:59',3825,576,'2005-07-15 21:07:59',2,'2006-02-15 21:30:53'),(5935,'2005-07-10 22:11:04',3371,258,'2005-07-19 18:12:04',2,'2006-02-15 21:30:53'),(5936,'2005-07-10 22:14:30',1951,522,'2005-07-15 01:32:30',1,'2006-02-15 21:30:53'),(5937,'2005-07-10 22:16:08',1579,580,'2005-07-16 03:08:08',2,'2006-02-15 21:30:53'),(5938,'2005-07-10 22:17:42',2834,236,'2005-07-16 22:38:42',2,'2006-02-15 21:30:53'),(5939,'2005-07-10 22:30:05',4491,207,'2005-07-14 00:02:05',2,'2006-02-15 21:30:53'),(5940,'2005-07-10 22:31:01',3295,292,'2005-07-14 00:52:01',1,'2006-02-15 21:30:53'),(5941,'2005-07-10 22:40:47',492,43,'2005-07-17 00:19:47',2,'2006-02-15 21:30:53'),(5942,'2005-07-10 22:47:17',2861,317,'2005-07-17 01:54:17',2,'2006-02-15 21:30:53'),(5943,'2005-07-10 22:48:13',3019,255,'2005-07-16 01:33:13',1,'2006-02-15 21:30:53'),(5944,'2005-07-10 22:51:44',3904,432,'2005-07-18 17:54:44',2,'2006-02-15 21:30:53'),(5945,'2005-07-10 22:52:42',427,374,'2005-07-11 21:52:42',1,'2006-02-15 21:30:53'),(5946,'2005-07-10 22:57:29',1629,308,'2005-07-12 00:08:29',1,'2006-02-15 21:30:53'),(5947,'2005-07-10 23:07:42',327,331,'2005-07-18 23:13:42',1,'2006-02-15 21:30:53'),(5948,'2005-07-10 23:12:08',3260,57,'2005-07-18 19:06:08',2,'2006-02-15 21:30:53'),(5949,'2005-07-10 23:13:00',4397,496,'2005-07-14 01:10:00',2,'2006-02-15 21:30:53'),(5950,'2005-07-10 23:13:45',4319,585,'2005-07-13 02:35:45',1,'2006-02-15 21:30:53'),(5951,'2005-07-10 23:14:29',2501,589,'2005-07-13 01:01:29',1,'2006-02-15 21:30:53'),(5952,'2005-07-10 23:18:20',3406,595,'2005-07-16 17:42:20',1,'2006-02-15 21:30:53'),(5953,'2005-07-10 23:21:35',992,386,'2005-07-14 20:48:35',2,'2006-02-15 21:30:53'),(5954,'2005-07-10 23:22:01',2627,32,'2005-07-14 04:42:01',2,'2006-02-15 21:30:53'),(5955,'2005-07-10 23:22:10',834,409,'2005-07-17 17:55:10',2,'2006-02-15 21:30:53'),(5956,'2005-07-10 23:23:08',2536,499,'2005-07-13 17:36:08',1,'2006-02-15 21:30:53'),(5957,'2005-07-10 23:24:02',2517,210,'2005-07-12 20:28:02',1,'2006-02-15 21:30:53'),(5958,'2005-07-10 23:31:51',3468,430,'2005-07-19 00:36:51',2,'2006-02-15 21:30:53'),(5959,'2005-07-10 23:35:36',3169,436,'2005-07-13 02:19:36',1,'2006-02-15 21:30:53'),(5960,'2005-07-10 23:38:34',3884,239,'2005-07-11 19:21:34',1,'2006-02-15 21:30:53'),(5961,'2005-07-10 23:43:23',3537,21,'2005-07-15 05:21:23',2,'2006-02-15 21:30:53'),(5962,'2005-07-10 23:45:22',1292,507,'2005-07-13 03:49:22',2,'2006-02-15 21:30:53'),(5963,'2005-07-10 23:47:08',4434,35,'2005-07-12 04:27:08',1,'2006-02-15 21:30:53'),(5964,'2005-07-10 23:47:18',3981,456,'2005-07-12 03:55:18',2,'2006-02-15 21:30:53'),(5965,'2005-07-10 23:51:52',4476,348,'2005-07-11 23:29:52',1,'2006-02-15 21:30:53'),(5966,'2005-07-10 23:59:27',2076,384,'2005-07-14 23:38:27',2,'2006-02-15 21:30:53'),(5967,'2005-07-11 00:02:19',2125,215,'2005-07-18 23:08:19',1,'2006-02-15 21:30:53'),(5968,'2005-07-11 00:03:11',3273,554,'2005-07-19 18:46:11',1,'2006-02-15 21:30:53'),(5969,'2005-07-11 00:03:22',4177,433,'2005-07-18 01:28:22',2,'2006-02-15 21:30:53'),(5970,'2005-07-11 00:04:50',1514,94,'2005-07-19 03:36:50',1,'2006-02-15 21:30:53'),(5971,'2005-07-11 00:05:58',2191,84,'2005-07-19 04:50:58',2,'2006-02-15 21:30:53'),(5972,'2005-07-11 00:08:54',4577,30,'2005-07-17 21:01:54',1,'2006-02-15 21:30:53'),(5973,'2005-07-11 00:09:17',1194,165,'2005-07-14 19:18:17',1,'2006-02-15 21:30:53'),(5974,'2005-07-11 00:10:37',3984,517,'2005-07-18 18:48:37',2,'2006-02-15 21:30:53'),(5975,'2005-07-11 00:14:19',2997,15,'2005-07-16 04:21:19',1,'2006-02-15 21:30:53'),(5976,'2005-07-11 00:16:35',1693,505,'2005-07-20 01:30:35',2,'2006-02-15 21:30:53'),(5977,'2005-07-11 00:16:38',4011,484,'2005-07-19 21:00:38',1,'2006-02-15 21:30:53'),(5978,'2005-07-11 00:16:54',1720,508,'2005-07-19 18:55:54',1,'2006-02-15 21:30:53'),(5979,'2005-07-11 00:17:09',1736,251,'2005-07-14 00:38:09',1,'2006-02-15 21:30:53'),(5980,'2005-07-11 00:18:21',1777,309,'2005-07-14 21:26:21',1,'2006-02-15 21:30:53'),(5981,'2005-07-11 00:19:04',2151,241,'2005-07-13 19:10:04',1,'2006-02-15 21:30:53'),(5982,'2005-07-11 00:24:44',2329,403,'2005-07-14 04:42:44',2,'2006-02-15 21:30:53'),(5983,'2005-07-11 00:34:11',351,127,'2005-07-15 05:37:11',1,'2006-02-15 21:30:53'),(5984,'2005-07-11 00:44:36',2801,178,'2005-07-15 00:04:36',1,'2006-02-15 21:30:53'),(5985,'2005-07-11 00:51:58',1108,506,'2005-07-14 22:02:58',2,'2006-02-15 21:30:53'),(5986,'2005-07-11 00:54:56',1624,171,'2005-07-13 22:52:56',2,'2006-02-15 21:30:53'),(5987,'2005-07-11 00:55:31',1000,447,'2005-07-16 06:28:31',2,'2006-02-15 21:30:53'),(5988,'2005-07-11 00:55:38',151,158,'2005-07-13 21:36:38',2,'2006-02-15 21:30:53'),(5989,'2005-07-11 00:57:53',696,283,'2005-07-15 02:24:53',1,'2006-02-15 21:30:53'),(5990,'2005-07-11 01:03:14',1561,432,'2005-07-15 19:32:14',1,'2006-02-15 21:30:53'),(5991,'2005-07-11 01:03:38',3623,590,'2005-07-12 22:32:38',2,'2006-02-15 21:30:53'),(5992,'2005-07-11 01:06:21',4216,54,'2005-07-13 19:15:21',2,'2006-02-15 21:30:53'),(5993,'2005-07-11 01:06:41',3588,529,'2005-07-14 19:19:41',1,'2006-02-15 21:30:53'),(5994,'2005-07-11 01:14:10',4287,295,'2005-07-12 00:42:10',2,'2006-02-15 21:30:53'),(5995,'2005-07-11 01:15:39',4357,360,'2005-07-20 05:01:39',2,'2006-02-15 21:30:53'),(5996,'2005-07-11 01:18:33',4263,223,'2005-07-17 04:18:33',1,'2006-02-15 21:30:53'),(5997,'2005-07-11 01:19:50',3542,128,'2005-07-16 06:29:50',1,'2006-02-15 21:30:53'),(5998,'2005-07-11 01:20:46',1458,250,'2005-07-15 21:41:46',1,'2006-02-15 21:30:53'),(5999,'2005-07-11 01:21:22',211,450,'2005-07-19 01:35:22',1,'2006-02-15 21:30:53'),(6000,'2005-07-11 01:23:06',1986,371,'2005-07-12 04:39:06',2,'2006-02-15 21:30:53'),(6001,'2005-07-11 01:24:44',1779,45,'2005-07-11 22:55:44',1,'2006-02-15 21:30:53'),(6002,'2005-07-11 01:27:49',4422,45,'2005-07-12 06:02:49',1,'2006-02-15 21:30:53'),(6003,'2005-07-11 01:28:33',296,527,'2005-07-17 21:24:33',1,'2006-02-15 21:30:53'),(6004,'2005-07-11 01:34:25',1756,204,'2005-07-18 00:48:25',2,'2006-02-15 21:30:53'),(6005,'2005-07-11 01:36:42',809,78,'2005-07-14 04:47:42',2,'2006-02-15 21:30:53'),(6006,'2005-07-11 01:38:42',4201,399,'2005-07-17 05:18:42',2,'2006-02-15 21:30:53'),(6007,'2005-07-11 01:43:06',4393,289,'2005-07-17 04:46:06',1,'2006-02-15 21:30:53'),(6008,'2005-07-11 01:51:29',1227,216,'2005-07-18 01:39:29',1,'2006-02-15 21:30:53'),(6009,'2005-07-11 01:51:58',494,470,'2005-07-18 07:12:58',2,'2006-02-15 21:30:53'),(6010,'2005-07-11 01:52:28',771,285,'2005-07-13 03:13:28',1,'2006-02-15 21:30:53'),(6011,'2005-07-11 01:54:48',3899,527,'2005-07-18 07:17:48',2,'2006-02-15 21:30:53'),(6012,'2005-07-11 02:00:12',2609,258,'2005-07-17 02:49:12',2,'2006-02-15 21:30:53'),(6013,'2005-07-11 02:02:03',3774,543,'2005-07-14 02:07:03',1,'2006-02-15 21:30:53'),(6014,'2005-07-11 02:02:55',3748,397,'2005-07-12 23:49:55',1,'2006-02-15 21:30:53'),(6015,'2005-07-11 02:04:12',295,596,'2005-07-13 02:43:12',2,'2006-02-15 21:30:53'),(6016,'2005-07-11 02:04:45',651,296,'2005-07-17 22:22:45',1,'2006-02-15 21:30:53'),(6017,'2005-07-11 02:05:32',4088,596,'2005-07-14 22:50:32',1,'2006-02-15 21:30:53'),(6018,'2005-07-11 02:06:36',4555,500,'2005-07-12 02:16:36',2,'2006-02-15 21:30:53'),(6019,'2005-07-11 02:08:29',3483,9,'2005-07-13 02:19:29',2,'2006-02-15 21:30:53'),(6020,'2005-07-11 02:08:55',1974,71,'2005-07-16 22:07:55',1,'2006-02-15 21:30:53'),(6021,'2005-07-11 02:10:18',3949,173,'2005-07-13 05:19:18',1,'2006-02-15 21:30:53'),(6022,'2005-07-11 02:15:53',2435,469,'2005-07-13 03:40:53',2,'2006-02-15 21:30:53'),(6023,'2005-07-11 02:15:57',3794,456,'2005-07-15 21:30:57',2,'2006-02-15 21:30:53'),(6024,'2005-07-11 02:16:47',2923,271,'2005-07-12 05:54:47',1,'2006-02-15 21:30:53'),(6025,'2005-07-11 02:18:13',3306,113,'2005-07-11 23:30:13',1,'2006-02-15 21:30:53'),(6026,'2005-07-11 02:21:43',3936,409,'2005-07-13 03:49:43',1,'2006-02-15 21:30:53'),(6027,'2005-07-11 02:26:29',4536,513,'2005-07-18 23:05:29',1,'2006-02-15 21:30:53'),(6028,'2005-07-11 02:31:44',784,450,'2005-07-14 03:18:44',1,'2006-02-15 21:30:53'),(6029,'2005-07-11 02:36:46',2030,520,'2005-07-14 20:51:46',2,'2006-02-15 21:30:53'),(6030,'2005-07-11 02:37:51',95,36,'2005-07-16 22:34:51',2,'2006-02-15 21:30:53'),(6031,'2005-07-11 02:42:14',1530,224,'2005-07-14 03:24:14',2,'2006-02-15 21:30:53'),(6032,'2005-07-11 02:49:01',3792,28,'2005-07-18 05:05:01',2,'2006-02-15 21:30:53'),(6033,'2005-07-11 02:59:34',2819,322,'2005-07-16 03:48:34',2,'2006-02-15 21:30:53'),(6034,'2005-07-11 03:00:50',1735,324,'2005-07-16 06:19:50',1,'2006-02-15 21:30:53'),(6035,'2005-07-11 03:01:45',3474,176,'2005-07-14 01:04:45',2,'2006-02-15 21:30:53'),(6036,'2005-07-11 03:02:28',2553,297,'2005-07-15 22:12:28',2,'2006-02-15 21:30:53'),(6037,'2005-07-11 03:06:54',1886,386,'2005-07-12 22:46:54',2,'2006-02-15 21:30:53'),(6038,'2005-07-11 03:10:37',1555,243,'2005-07-19 05:14:37',2,'2006-02-15 21:30:53'),(6039,'2005-07-11 03:12:19',1776,137,'2005-07-19 05:46:19',1,'2006-02-15 21:30:53'),(6040,'2005-07-11 03:14:26',2161,511,'2005-07-14 01:12:26',2,'2006-02-15 21:30:53'),(6041,'2005-07-11 03:14:58',2815,551,'2005-07-13 00:48:58',2,'2006-02-15 21:30:53'),(6042,'2005-07-11 03:17:04',2153,5,'2005-07-19 07:08:04',1,'2006-02-15 21:30:53'),(6043,'2005-07-11 03:18:10',3303,430,'2005-07-12 05:50:10',1,'2006-02-15 21:30:53'),(6044,'2005-07-11 03:18:39',1270,481,'2005-07-13 06:58:39',2,'2006-02-15 21:30:53'),(6045,'2005-07-11 03:21:05',2003,39,'2005-07-17 23:10:05',1,'2006-02-15 21:30:53'),(6046,'2005-07-11 03:21:49',1935,569,'2005-07-19 23:58:49',1,'2006-02-15 21:30:53'),(6047,'2005-07-11 03:27:01',4147,235,'2005-07-16 06:42:01',2,'2006-02-15 21:30:53'),(6048,'2005-07-11 03:32:23',975,154,'2005-07-14 07:39:23',1,'2006-02-15 21:30:53'),(6049,'2005-07-11 03:32:32',2582,236,'2005-07-15 06:57:32',2,'2006-02-15 21:30:53'),(6050,'2005-07-11 03:34:29',825,527,'2005-07-15 02:55:29',1,'2006-02-15 21:30:53'),(6051,'2005-07-11 03:46:41',2675,435,'2005-07-11 22:36:41',2,'2006-02-15 21:30:53'),(6052,'2005-07-11 03:51:27',881,75,'2005-07-16 02:55:27',2,'2006-02-15 21:30:53'),(6053,'2005-07-11 03:51:59',2836,237,'2005-07-19 09:13:59',2,'2006-02-15 21:30:53'),(6054,'2005-07-11 03:58:39',1176,354,'2005-07-13 23:08:39',1,'2006-02-15 21:30:53'),(6055,'2005-07-11 03:59:08',595,125,'2005-07-18 05:35:08',2,'2006-02-15 21:30:53'),(6056,'2005-07-11 04:01:27',3069,145,'2005-07-12 04:14:27',1,'2006-02-15 21:30:53'),(6057,'2005-07-11 04:03:40',1340,187,'2005-07-17 01:34:40',2,'2006-02-15 21:30:53'),(6058,'2005-07-11 04:03:51',3761,498,'2005-07-14 03:52:51',1,'2006-02-15 21:30:53'),(6059,'2005-07-11 04:03:54',1437,394,'2005-07-18 01:35:54',1,'2006-02-15 21:30:53'),(6060,'2005-07-11 04:06:17',3146,342,'2005-07-12 03:05:17',1,'2006-02-15 21:30:53'),(6061,'2005-07-11 04:06:25',1859,392,'2005-07-11 23:11:25',1,'2006-02-15 21:30:53'),(6062,'2005-07-11 04:11:58',3301,408,'2005-07-15 05:00:58',1,'2006-02-15 21:30:53'),(6063,'2005-07-11 04:16:51',1715,519,'2005-07-13 08:35:51',2,'2006-02-15 21:30:53'),(6064,'2005-07-11 04:23:18',265,297,'2005-07-19 02:21:18',1,'2006-02-15 21:30:53'),(6065,'2005-07-11 04:25:51',1007,562,'2005-07-17 08:19:51',1,'2006-02-15 21:30:53'),(6066,'2005-07-11 04:32:42',1877,155,'2005-07-15 03:56:42',2,'2006-02-15 21:30:53'),(6067,'2005-07-11 04:34:49',2097,186,'2005-07-16 09:33:49',1,'2006-02-15 21:30:53'),(6068,'2005-07-11 04:41:09',2331,265,'2005-07-14 04:45:09',1,'2006-02-15 21:30:53'),(6069,'2005-07-11 04:44:59',256,553,'2005-07-13 01:00:59',1,'2006-02-15 21:30:53'),(6070,'2005-07-11 04:47:42',1679,267,'2005-07-13 01:49:42',2,'2006-02-15 21:30:53'),(6071,'2005-07-11 04:50:03',889,179,'2005-07-19 23:52:03',1,'2006-02-15 21:30:53'),(6072,'2005-07-11 04:52:40',1790,339,'2005-07-18 01:02:40',1,'2006-02-15 21:30:53'),(6073,'2005-07-11 04:54:31',4243,466,'2005-07-20 07:23:31',1,'2006-02-15 21:30:53'),(6074,'2005-07-11 04:59:56',2876,259,'2005-07-13 23:31:56',1,'2006-02-15 21:30:53'),(6075,'2005-07-11 05:03:03',2160,283,'2005-07-12 01:28:03',1,'2006-02-15 21:30:53'),(6076,'2005-07-11 05:05:30',1792,143,'2005-07-18 04:22:30',1,'2006-02-15 21:30:53'),(6077,'2005-07-11 05:06:08',2154,542,'2005-07-16 10:29:08',1,'2006-02-15 21:30:53'),(6078,'2005-07-11 05:06:52',3985,91,'2005-07-17 06:13:52',2,'2006-02-15 21:30:53'),(6079,'2005-07-11 05:07:14',1494,119,'2005-07-17 08:45:14',1,'2006-02-15 21:30:53'),(6080,'2005-07-11 05:08:11',2682,115,'2005-07-16 09:54:11',2,'2006-02-15 21:30:53'),(6081,'2005-07-11 05:11:09',2286,72,'2005-07-13 05:33:09',2,'2006-02-15 21:30:53'),(6082,'2005-07-11 05:12:41',1091,82,'2005-07-16 03:40:41',2,'2006-02-15 21:30:53'),(6083,'2005-07-11 05:12:49',3183,285,'2005-07-15 00:46:49',2,'2006-02-15 21:30:53'),(6084,'2005-07-11 05:16:20',1334,479,'2005-07-19 01:38:20',2,'2006-02-15 21:30:53'),(6085,'2005-07-11 05:24:36',312,155,'2005-07-16 03:49:36',2,'2006-02-15 21:30:53'),(6086,'2005-07-11 05:29:03',1505,420,'2005-07-16 01:17:03',1,'2006-02-15 21:30:53'),(6087,'2005-07-11 05:29:22',198,155,'2005-07-12 23:33:22',2,'2006-02-15 21:30:53'),(6088,'2005-07-11 05:40:35',3796,498,'2005-07-17 07:14:35',2,'2006-02-15 21:30:53'),(6089,'2005-07-11 05:45:59',3298,580,'2005-07-17 11:04:59',2,'2006-02-15 21:30:53'),(6090,'2005-07-11 05:47:08',71,241,'2005-07-20 07:52:08',2,'2006-02-15 21:30:53'),(6091,'2005-07-11 05:49:18',580,383,'2005-07-15 07:26:18',1,'2006-02-15 21:30:53'),(6092,'2005-07-11 05:51:31',2129,75,'2005-07-17 03:42:31',1,'2006-02-15 21:30:53'),(6093,'2005-07-11 05:52:50',1868,117,'2005-07-20 11:45:50',1,'2006-02-15 21:30:53'),(6094,'2005-07-11 05:54:42',2684,285,'2005-07-18 08:19:42',2,'2006-02-15 21:30:53'),(6095,'2005-07-11 06:06:41',727,501,'2005-07-19 06:14:41',1,'2006-02-15 21:30:53'),(6096,'2005-07-11 06:18:04',2720,420,'2005-07-14 01:15:04',1,'2006-02-15 21:30:53'),(6097,'2005-07-11 06:21:43',297,416,'2005-07-16 10:04:43',1,'2006-02-15 21:30:53'),(6098,'2005-07-11 06:23:28',3016,525,'2005-07-17 04:05:28',1,'2006-02-15 21:30:53'),(6099,'2005-07-11 06:24:44',3865,469,'2005-07-15 08:03:44',2,'2006-02-15 21:30:53'),(6100,'2005-07-11 06:40:31',3485,16,'2005-07-14 10:59:31',2,'2006-02-15 21:30:53'),(6101,'2005-07-11 06:50:33',2618,508,'2005-07-18 01:52:33',2,'2006-02-15 21:30:53'),(6102,'2005-07-11 06:53:09',4305,146,'2005-07-17 07:05:09',1,'2006-02-15 21:30:53'),(6103,'2005-07-11 06:59:55',262,540,'2005-07-16 09:30:55',1,'2006-02-15 21:30:53'),(6104,'2005-07-11 07:01:35',3531,389,'2005-07-17 02:29:35',1,'2006-02-15 21:30:53'),(6105,'2005-07-11 07:03:19',3501,595,'2005-07-19 06:46:19',1,'2006-02-15 21:30:53'),(6106,'2005-07-11 07:05:06',2714,185,'2005-07-20 09:27:06',1,'2006-02-15 21:30:53'),(6107,'2005-07-11 07:07:09',3798,304,'2005-07-14 07:32:09',2,'2006-02-15 21:30:53'),(6108,'2005-07-11 07:19:24',4296,572,'2005-07-13 12:38:24',2,'2006-02-15 21:30:53'),(6109,'2005-07-11 07:20:57',3603,163,'2005-07-13 07:29:57',2,'2006-02-15 21:30:53'),(6110,'2005-07-11 07:23:47',541,405,'2005-07-20 03:17:47',2,'2006-02-15 21:30:53'),(6111,'2005-07-11 07:26:57',3504,300,'2005-07-13 10:43:57',2,'2006-02-15 21:30:53'),(6112,'2005-07-11 07:28:05',1311,366,'2005-07-18 07:29:05',1,'2006-02-15 21:30:53'),(6113,'2005-07-11 07:31:08',4437,115,'2005-07-20 11:01:08',2,'2006-02-15 21:30:53'),(6114,'2005-07-11 07:33:48',479,404,'2005-07-18 06:13:48',2,'2006-02-15 21:30:53'),(6115,'2005-07-11 07:36:50',3415,27,'2005-07-13 11:30:50',1,'2006-02-15 21:30:53'),(6116,'2005-07-11 07:37:38',247,381,'2005-07-14 11:53:38',2,'2006-02-15 21:30:53'),(6117,'2005-07-11 07:39:38',2613,135,'2005-07-18 12:07:38',2,'2006-02-15 21:30:53'),(6118,'2005-07-11 07:43:08',3013,13,'2005-07-20 03:17:08',1,'2006-02-15 21:30:53'),(6119,'2005-07-11 07:44:46',4281,472,'2005-07-20 04:41:46',2,'2006-02-15 21:30:53'),(6120,'2005-07-11 07:49:53',3299,268,'2005-07-19 04:56:53',2,'2006-02-15 21:30:53'),(6121,'2005-07-11 07:55:27',1613,347,'2005-07-16 03:43:27',2,'2006-02-15 21:30:53'),(6122,'2005-07-11 07:58:07',2212,32,'2005-07-16 09:52:07',1,'2006-02-15 21:30:53'),(6123,'2005-07-11 08:02:27',1354,200,'2005-07-15 08:58:27',2,'2006-02-15 21:30:53'),(6124,'2005-07-11 08:02:32',2022,368,'2005-07-12 05:58:32',2,'2006-02-15 21:30:53'),(6125,'2005-07-11 08:03:35',2439,307,'2005-07-18 12:46:35',1,'2006-02-15 21:30:53'),(6126,'2005-07-11 08:06:56',1069,230,'2005-07-16 11:42:56',1,'2006-02-15 21:30:53'),(6127,'2005-07-11 08:06:59',285,355,'2005-07-12 09:01:59',1,'2006-02-15 21:30:53'),(6128,'2005-07-11 08:15:08',2050,18,'2005-07-13 03:36:08',1,'2006-02-15 21:30:53'),(6129,'2005-07-11 08:15:09',3875,222,'2005-07-18 13:00:09',1,'2006-02-15 21:30:53'),(6130,'2005-07-11 08:19:56',2547,538,'2005-07-16 12:02:56',2,'2006-02-15 21:30:53'),(6131,'2005-07-11 08:22:05',3313,107,'2005-07-14 07:40:05',1,'2006-02-15 21:30:53'),(6132,'2005-07-11 08:24:44',3229,319,'2005-07-13 06:41:44',1,'2006-02-15 21:30:53'),(6133,'2005-07-11 08:25:22',1992,107,'2005-07-13 13:17:22',1,'2006-02-15 21:30:53'),(6134,'2005-07-11 08:28:19',3225,305,'2005-07-18 09:20:19',2,'2006-02-15 21:30:53'),(6135,'2005-07-11 08:32:23',833,325,'2005-07-17 08:43:23',1,'2006-02-15 21:30:53'),(6136,'2005-07-11 08:34:09',205,346,'2005-07-14 06:11:09',1,'2006-02-15 21:30:53'),(6137,'2005-07-11 08:34:20',2029,67,'2005-07-13 03:31:20',2,'2006-02-15 21:30:53'),(6138,'2005-07-11 08:36:04',1808,438,'2005-07-13 10:30:04',2,'2006-02-15 21:30:53'),(6139,'2005-07-11 08:39:33',3065,206,'2005-07-17 08:00:33',2,'2006-02-15 21:30:53'),(6140,'2005-07-11 08:40:47',2749,363,'2005-07-14 07:26:47',1,'2006-02-15 21:30:53'),(6141,'2005-07-11 08:52:16',2279,228,'2005-07-17 03:00:16',1,'2006-02-15 21:30:53'),(6142,'2005-07-11 08:54:09',1722,136,'2005-07-18 05:23:09',2,'2006-02-15 21:30:53'),(6143,'2005-07-11 09:02:37',1030,169,'2005-07-19 05:57:37',2,'2006-02-15 21:30:53'),(6144,'2005-07-11 09:02:53',1077,554,'2005-07-15 10:58:53',2,'2006-02-15 21:30:53'),(6145,'2005-07-11 09:07:01',1359,540,'2005-07-19 08:21:01',1,'2006-02-15 21:30:53'),(6146,'2005-07-11 09:09:59',3374,11,'2005-07-20 11:42:59',2,'2006-02-15 21:30:53'),(6147,'2005-07-11 09:13:08',910,35,'2005-07-17 03:48:08',1,'2006-02-15 21:30:53'),(6148,'2005-07-11 09:14:22',4318,410,'2005-07-12 08:01:22',1,'2006-02-15 21:30:53'),(6149,'2005-07-11 09:19:31',4337,26,'2005-07-17 14:45:31',2,'2006-02-15 21:30:53'),(6150,'2005-07-11 09:23:56',1110,418,'2005-07-15 10:56:56',2,'2006-02-15 21:30:53'),(6151,'2005-07-11 09:25:17',352,476,'2005-07-12 05:11:17',1,'2006-02-15 21:30:53'),(6152,'2005-07-11 09:25:52',560,361,'2005-07-17 07:40:52',2,'2006-02-15 21:30:53'),(6153,'2005-07-11 09:31:04',105,47,'2005-07-19 03:41:04',1,'2006-02-15 21:30:53'),(6154,'2005-07-11 09:32:19',2717,368,'2005-07-16 15:10:19',1,'2006-02-15 21:30:53'),(6155,'2005-07-11 09:45:31',785,229,'2005-07-18 08:09:31',1,'2006-02-15 21:30:53'),(6156,'2005-07-11 09:45:48',302,297,'2005-07-15 04:51:48',1,'2006-02-15 21:30:53'),(6157,'2005-07-11 09:48:16',4481,133,'2005-07-16 05:00:16',2,'2006-02-15 21:30:53'),(6158,'2005-07-11 09:50:24',3954,92,'2005-07-13 04:49:24',2,'2006-02-15 21:30:53'),(6159,'2005-07-11 09:55:34',126,225,'2005-07-13 10:01:34',2,'2006-02-15 21:30:53'),(6160,'2005-07-11 10:08:13',2716,110,'2005-07-14 08:18:13',1,'2006-02-15 21:30:53'),(6161,'2005-07-11 10:11:54',3681,524,'2005-07-15 12:12:54',2,'2006-02-15 21:30:53'),(6162,'2005-07-11 10:12:30',786,79,'2005-07-19 06:02:30',2,'2006-02-15 21:30:53'),(6163,'2005-07-11 10:13:46',1330,1,'2005-07-19 13:15:46',2,'2006-02-15 21:30:53'),(6164,'2005-07-11 10:16:23',2755,47,'2005-07-14 11:21:23',1,'2006-02-15 21:30:53'),(6165,'2005-07-11 10:17:29',3540,9,'2005-07-17 07:27:29',1,'2006-02-15 21:30:53'),(6166,'2005-07-11 10:19:05',967,503,'2005-07-12 14:30:05',1,'2006-02-15 21:30:53'),(6167,'2005-07-11 10:21:21',3255,200,'2005-07-14 15:38:21',1,'2006-02-15 21:30:53'),(6168,'2005-07-11 10:21:38',284,77,'2005-07-14 09:55:38',2,'2006-02-15 21:30:53'),(6169,'2005-07-11 10:25:56',2781,148,'2005-07-19 07:18:56',2,'2006-02-15 21:30:53'),(6170,'2005-07-11 10:29:21',278,580,'2005-07-16 05:13:21',2,'2006-02-15 21:30:53'),(6171,'2005-07-11 10:29:35',448,491,'2005-07-16 12:01:35',1,'2006-02-15 21:30:53'),(6172,'2005-07-11 10:32:09',3514,219,'2005-07-14 16:23:09',1,'2006-02-15 21:30:53'),(6173,'2005-07-11 10:33:11',4252,419,'2005-07-15 10:57:11',1,'2006-02-15 21:30:53'),(6174,'2005-07-11 10:36:28',3123,7,'2005-07-18 16:19:28',2,'2006-02-15 21:30:53'),(6175,'2005-07-11 10:44:37',3037,195,'2005-07-15 08:13:37',1,'2006-02-15 21:30:53'),(6176,'2005-07-11 10:48:21',2969,279,'2005-07-12 15:54:21',2,'2006-02-15 21:30:53'),(6177,'2005-07-11 10:53:49',313,589,'2005-07-17 14:54:49',1,'2006-02-15 21:30:53'),(6178,'2005-07-11 10:59:09',2777,91,'2005-07-16 11:19:09',2,'2006-02-15 21:30:53'),(6179,'2005-07-11 10:59:59',3665,42,'2005-07-17 06:02:59',1,'2006-02-15 21:30:53'),(6180,'2005-07-11 11:06:50',4401,351,'2005-07-19 09:03:50',2,'2006-02-15 21:30:53'),(6181,'2005-07-11 11:10:11',4398,200,'2005-07-15 09:33:11',1,'2006-02-15 21:30:53'),(6182,'2005-07-11 11:11:38',2562,540,'2005-07-17 08:33:38',2,'2006-02-15 21:30:53'),(6183,'2005-07-11 11:14:35',856,402,'2005-07-16 15:35:35',1,'2006-02-15 21:30:53'),(6184,'2005-07-11 11:19:21',1131,146,'2005-07-19 07:35:21',1,'2006-02-15 21:30:53'),(6185,'2005-07-11 11:25:09',4331,294,'2005-07-18 12:09:09',2,'2006-02-15 21:30:53'),(6186,'2005-07-11 11:26:41',2086,128,'2005-07-17 12:02:41',2,'2006-02-15 21:30:53'),(6187,'2005-07-11 11:28:51',3344,500,'2005-07-12 15:44:51',1,'2006-02-15 21:30:53'),(6188,'2005-07-11 11:31:47',189,114,'2005-07-15 09:28:47',1,'2006-02-15 21:30:53'),(6189,'2005-07-11 11:36:03',3800,552,'2005-07-20 15:33:03',2,'2006-02-15 21:30:53'),(6190,'2005-07-11 11:36:18',2564,321,'2005-07-19 17:05:18',2,'2006-02-15 21:30:53'),(6191,'2005-07-11 11:37:52',3448,480,'2005-07-17 12:45:52',1,'2006-02-15 21:30:53'),(6192,'2005-07-11 11:44:41',4573,314,'2005-07-19 10:12:41',1,'2006-02-15 21:30:53'),(6193,'2005-07-11 11:46:57',465,189,'2005-07-19 14:11:57',2,'2006-02-15 21:30:53'),(6194,'2005-07-11 11:51:00',1049,83,'2005-07-15 12:34:00',2,'2006-02-15 21:30:53'),(6195,'2005-07-11 12:00:32',4193,319,'2005-07-16 15:00:32',2,'2006-02-15 21:30:53'),(6196,'2005-07-11 12:05:46',995,429,'2005-07-18 08:27:46',2,'2006-02-15 21:30:53'),(6197,'2005-07-11 12:09:51',4156,596,'2005-07-12 06:15:51',1,'2006-02-15 21:30:53'),(6198,'2005-07-11 12:12:17',3345,470,'2005-07-18 07:40:17',2,'2006-02-15 21:30:53'),(6199,'2005-07-11 12:16:03',4329,80,'2005-07-18 15:33:03',2,'2006-02-15 21:30:53'),(6200,'2005-07-11 12:16:42',3258,137,'2005-07-17 09:27:42',2,'2006-02-15 21:30:53'),(6201,'2005-07-11 12:18:07',4530,559,'2005-07-12 12:11:07',2,'2006-02-15 21:30:53'),(6202,'2005-07-11 12:24:25',1424,373,'2005-07-18 08:13:25',1,'2006-02-15 21:30:53'),(6203,'2005-07-11 12:28:57',1001,408,'2005-07-15 14:10:57',1,'2006-02-15 21:30:53'),(6204,'2005-07-11 12:29:22',2572,362,'2005-07-13 10:41:22',2,'2006-02-15 21:30:53'),(6205,'2005-07-11 12:31:24',3442,303,'2005-07-13 11:31:24',2,'2006-02-15 21:30:53'),(6206,'2005-07-11 12:32:14',1368,459,'2005-07-15 15:01:14',2,'2006-02-15 21:30:53'),(6207,'2005-07-11 12:34:24',3226,143,'2005-07-14 10:15:24',2,'2006-02-15 21:30:53'),(6208,'2005-07-11 12:34:56',672,31,'2005-07-19 15:17:56',1,'2006-02-15 21:30:53'),(6209,'2005-07-11 12:36:05',3091,219,'2005-07-17 14:48:05',2,'2006-02-15 21:30:53'),(6210,'2005-07-11 12:36:43',931,209,'2005-07-17 17:45:43',2,'2006-02-15 21:30:53'),(6211,'2005-07-11 12:39:01',2699,6,'2005-07-20 15:59:01',2,'2006-02-15 21:30:53'),(6212,'2005-07-11 12:40:48',3962,337,'2005-07-15 17:49:48',2,'2006-02-15 21:30:53'),(6213,'2005-07-11 12:43:07',485,23,'2005-07-16 07:23:07',2,'2006-02-15 21:30:53'),(6214,'2005-07-11 12:49:48',1258,49,'2005-07-18 07:41:48',2,'2006-02-15 21:30:53'),(6215,'2005-07-11 12:52:36',316,390,'2005-07-12 08:33:36',1,'2006-02-15 21:30:53'),(6216,'2005-07-11 12:57:05',3571,387,'2005-07-13 12:31:05',1,'2006-02-15 21:30:53'),(6217,'2005-07-11 13:13:45',1090,177,'2005-07-19 16:37:45',2,'2006-02-15 21:30:53'),(6218,'2005-07-11 13:14:58',815,410,'2005-07-16 08:13:58',2,'2006-02-15 21:30:53'),(6219,'2005-07-11 13:18:37',38,303,'2005-07-13 13:18:37',2,'2006-02-15 21:30:53'),(6220,'2005-07-11 13:22:06',1717,421,'2005-07-12 17:46:06',2,'2006-02-15 21:30:53'),(6221,'2005-07-11 13:24:27',1699,393,'2005-07-15 17:51:27',1,'2006-02-15 21:30:53'),(6222,'2005-07-11 13:25:49',2066,386,'2005-07-13 14:32:49',1,'2006-02-15 21:30:53'),(6223,'2005-07-11 13:27:09',3754,192,'2005-07-12 14:02:09',1,'2006-02-15 21:30:53'),(6224,'2005-07-11 13:42:18',3274,475,'2005-07-16 09:28:18',1,'2006-02-15 21:30:53'),(6225,'2005-07-11 13:45:14',2483,204,'2005-07-14 10:23:14',1,'2006-02-15 21:30:53'),(6226,'2005-07-11 13:48:11',2758,134,'2005-07-15 17:18:11',2,'2006-02-15 21:30:53'),(6227,'2005-07-11 13:56:46',1654,210,'2005-07-18 12:53:46',1,'2006-02-15 21:30:53'),(6228,'2005-07-11 13:58:36',2281,367,'2005-07-17 19:03:36',2,'2006-02-15 21:30:53'),(6229,'2005-07-11 13:59:50',3137,399,'2005-07-20 09:26:50',1,'2006-02-15 21:30:53'),(6230,'2005-07-11 14:02:19',2260,490,'2005-07-17 08:11:19',2,'2006-02-15 21:30:53'),(6231,'2005-07-11 14:02:36',2526,122,'2005-07-13 19:04:36',2,'2006-02-15 21:30:53'),(6232,'2005-07-11 14:08:27',2492,590,'2005-07-20 19:34:27',2,'2006-02-15 21:30:53'),(6233,'2005-07-11 14:10:47',3731,378,'2005-07-15 15:13:47',2,'2006-02-15 21:30:53'),(6234,'2005-07-11 14:16:10',2911,232,'2005-07-19 19:55:10',1,'2006-02-15 21:30:53'),(6235,'2005-07-11 14:17:51',2659,379,'2005-07-17 11:14:51',2,'2006-02-15 21:30:53'),(6236,'2005-07-11 14:18:17',3813,338,'2005-07-14 08:47:17',2,'2006-02-15 21:30:53'),(6237,'2005-07-11 14:19:12',2215,166,'2005-07-15 15:05:12',1,'2006-02-15 21:30:53'),(6238,'2005-07-11 14:20:18',3749,23,'2005-07-14 18:34:18',1,'2006-02-15 21:30:53'),(6239,'2005-07-11 14:20:48',4107,132,'2005-07-17 13:41:48',2,'2006-02-15 21:30:53'),(6240,'2005-07-11 14:32:41',640,524,'2005-07-20 18:38:41',1,'2006-02-15 21:30:53'),(6241,'2005-07-11 14:40:48',4449,74,'2005-07-18 09:51:48',1,'2006-02-15 21:30:53'),(6242,'2005-07-11 14:45:04',670,245,'2005-07-12 18:34:04',2,'2006-02-15 21:30:53'),(6243,'2005-07-11 14:53:25',3456,26,'2005-07-15 09:26:25',2,'2006-02-15 21:30:53'),(6244,'2005-07-11 14:53:38',1558,383,'2005-07-12 16:42:38',1,'2006-02-15 21:30:53'),(6245,'2005-07-11 14:56:57',512,241,'2005-07-16 14:35:57',1,'2006-02-15 21:30:53'),(6246,'2005-07-11 14:57:51',2376,172,'2005-07-19 19:10:51',2,'2006-02-15 21:30:53'),(6247,'2005-07-11 15:00:05',2504,589,'2005-07-18 13:47:05',1,'2006-02-15 21:30:53'),(6248,'2005-07-11 15:01:54',2686,6,'2005-07-19 16:58:54',1,'2006-02-15 21:30:53'),(6249,'2005-07-11 15:02:02',4334,30,'2005-07-14 11:37:02',2,'2006-02-15 21:30:53'),(6250,'2005-07-11 15:02:04',4087,458,'2005-07-17 10:54:04',1,'2006-02-15 21:30:53'),(6251,'2005-07-11 15:06:20',3956,230,'2005-07-18 20:11:20',2,'2006-02-15 21:30:53'),(6252,'2005-07-11 15:06:29',1294,295,'2005-07-16 14:07:29',1,'2006-02-15 21:30:53'),(6253,'2005-07-11 15:07:19',1425,570,'2005-07-13 11:00:19',1,'2006-02-15 21:30:53'),(6254,'2005-07-11 15:10:18',2038,20,'2005-07-17 14:20:18',2,'2006-02-15 21:30:53'),(6255,'2005-07-11 15:11:33',1459,319,'2005-07-15 19:55:33',2,'2006-02-15 21:30:53'),(6256,'2005-07-11 15:19:22',480,307,'2005-07-13 12:43:22',1,'2006-02-15 21:30:53'),(6257,'2005-07-11 15:23:46',3253,492,'2005-07-14 17:26:46',2,'2006-02-15 21:30:53'),(6258,'2005-07-11 15:24:32',632,417,'2005-07-18 18:29:32',1,'2006-02-15 21:30:53'),(6259,'2005-07-11 15:25:52',3007,84,'2005-07-13 11:54:52',2,'2006-02-15 21:30:53'),(6260,'2005-07-11 15:26:29',4308,454,'2005-07-13 17:37:29',2,'2006-02-15 21:30:53'),(6261,'2005-07-11 15:28:34',694,386,'2005-07-14 17:54:34',1,'2006-02-15 21:30:53'),(6262,'2005-07-11 15:33:24',4136,355,'2005-07-17 12:40:24',1,'2006-02-15 21:30:53'),(6263,'2005-07-11 15:33:50',2391,336,'2005-07-17 12:49:50',2,'2006-02-15 21:30:53'),(6264,'2005-07-11 15:42:35',4246,565,'2005-07-12 11:29:35',2,'2006-02-15 21:30:53'),(6265,'2005-07-11 15:43:51',3931,477,'2005-07-12 12:51:51',2,'2006-02-15 21:30:53'),(6266,'2005-07-11 15:45:39',941,397,'2005-07-15 18:29:39',1,'2006-02-15 21:30:53'),(6267,'2005-07-11 15:53:00',2152,20,'2005-07-17 18:09:00',2,'2006-02-15 21:30:53'),(6268,'2005-07-11 15:55:34',1154,125,'2005-07-19 17:25:34',1,'2006-02-15 21:30:53'),(6269,'2005-07-11 15:58:43',3915,167,'2005-07-13 13:25:43',1,'2006-02-15 21:30:53'),(6270,'2005-07-11 15:59:10',2308,292,'2005-07-18 10:29:10',2,'2006-02-15 21:30:53'),(6271,'2005-07-11 16:01:35',1246,467,'2005-07-20 12:07:35',2,'2006-02-15 21:30:53'),(6272,'2005-07-11 16:03:49',3103,240,'2005-07-15 19:54:49',1,'2006-02-15 21:30:53'),(6273,'2005-07-11 16:08:41',2403,152,'2005-07-14 16:41:41',2,'2006-02-15 21:30:53'),(6274,'2005-07-11 16:09:42',2998,472,'2005-07-19 20:46:42',1,'2006-02-15 21:30:53'),(6275,'2005-07-11 16:12:11',3599,333,'2005-07-17 20:19:11',2,'2006-02-15 21:30:53'),(6276,'2005-07-11 16:15:50',1826,284,'2005-07-19 20:50:50',2,'2006-02-15 21:30:53'),(6277,'2005-07-11 16:19:01',4023,92,'2005-07-18 21:00:01',2,'2006-02-15 21:30:53'),(6278,'2005-07-11 16:20:02',2232,558,'2005-07-19 19:29:02',2,'2006-02-15 21:30:53'),(6279,'2005-07-11 16:26:07',1254,49,'2005-07-17 21:05:07',2,'2006-02-15 21:30:53'),(6280,'2005-07-11 16:36:17',4055,33,'2005-07-13 14:04:17',2,'2006-02-15 21:30:53'),(6281,'2005-07-11 16:38:16',835,236,'2005-07-13 10:57:16',2,'2006-02-15 21:30:53'),(6282,'2005-07-11 16:46:22',4453,60,'2005-07-15 13:19:22',1,'2006-02-15 21:30:53'),(6283,'2005-07-11 16:47:32',3319,402,'2005-07-17 21:46:32',1,'2006-02-15 21:30:53'),(6284,'2005-07-11 16:51:39',2938,177,'2005-07-15 19:59:39',1,'2006-02-15 21:30:53'),(6285,'2005-07-11 16:52:07',2140,444,'2005-07-13 21:33:07',2,'2006-02-15 21:30:53'),(6286,'2005-07-11 16:55:35',1070,140,'2005-07-13 22:51:35',1,'2006-02-15 21:30:53'),(6287,'2005-07-11 17:00:04',35,93,'2005-07-12 13:16:04',1,'2006-02-15 21:30:53'),(6288,'2005-07-11 17:01:52',3235,357,'2005-07-19 15:11:52',1,'2006-02-15 21:30:53'),(6289,'2005-07-11 17:06:39',3185,99,'2005-07-12 15:54:39',2,'2006-02-15 21:30:53'),(6290,'2005-07-11 17:12:42',2634,66,'2005-07-19 21:53:42',2,'2006-02-15 21:30:53'),(6291,'2005-07-11 17:16:40',3126,262,'2005-07-13 18:24:40',2,'2006-02-15 21:30:53'),(6292,'2005-07-11 17:23:33',4375,505,'2005-07-12 16:27:33',2,'2006-02-15 21:30:53'),(6293,'2005-07-11 17:24:57',4260,471,'2005-07-13 18:45:57',2,'2006-02-15 21:30:53'),(6294,'2005-07-11 17:25:55',1732,463,'2005-07-15 17:48:55',1,'2006-02-15 21:30:53'),(6295,'2005-07-11 17:30:58',1393,7,'2005-07-15 15:50:58',1,'2006-02-15 21:30:53'),(6296,'2005-07-11 17:34:04',4202,484,'2005-07-17 21:12:04',1,'2006-02-15 21:30:53'),(6297,'2005-07-11 17:37:22',2738,69,'2005-07-19 13:54:22',2,'2006-02-15 21:30:53'),(6298,'2005-07-11 17:42:33',3906,256,'2005-07-13 18:14:33',2,'2006-02-15 21:30:53'),(6299,'2005-07-11 17:45:08',4125,324,'2005-07-13 16:36:08',2,'2006-02-15 21:30:53'),(6300,'2005-07-11 17:50:09',1269,283,'2005-07-18 13:11:09',1,'2006-02-15 21:30:53'),(6301,'2005-07-11 17:54:09',3528,275,'2005-07-18 20:42:09',2,'2006-02-15 21:30:53'),(6302,'2005-07-11 17:55:38',3221,391,'2005-07-17 22:11:38',1,'2006-02-15 21:30:53'),(6303,'2005-07-11 17:55:43',846,236,'2005-07-13 12:50:43',1,'2006-02-15 21:30:53'),(6304,'2005-07-11 18:02:16',4183,579,'2005-07-14 14:01:16',1,'2006-02-15 21:30:53'),(6305,'2005-07-11 18:02:25',1544,337,'2005-07-20 13:29:25',1,'2006-02-15 21:30:53'),(6306,'2005-07-11 18:04:26',486,208,'2005-07-20 14:22:26',2,'2006-02-15 21:30:53'),(6307,'2005-07-11 18:04:29',4029,345,'2005-07-17 23:40:29',2,'2006-02-15 21:30:53'),(6308,'2005-07-11 18:08:41',3155,472,'2005-07-19 15:48:41',2,'2006-02-15 21:30:53'),(6309,'2005-07-11 18:13:24',1054,232,'2005-07-13 23:11:24',1,'2006-02-15 21:30:53'),(6310,'2005-07-11 18:14:05',3064,537,'2005-07-16 15:39:05',2,'2006-02-15 21:30:53'),(6311,'2005-07-11 18:18:52',1789,373,'2005-07-16 17:52:52',2,'2006-02-15 21:30:53'),(6312,'2005-07-11 18:19:02',2188,417,'2005-07-18 00:00:02',1,'2006-02-15 21:30:53'),(6313,'2005-07-11 18:29:52',2976,283,'2005-07-14 21:34:52',1,'2006-02-15 21:30:53'),(6314,'2005-07-11 18:32:44',4128,55,'2005-07-17 23:58:44',1,'2006-02-15 21:30:53'),(6315,'2005-07-11 18:42:49',608,374,'2005-07-12 23:19:49',2,'2006-02-15 21:30:53'),(6316,'2005-07-11 18:44:52',1910,526,'2005-07-19 23:35:52',2,'2006-02-15 21:30:53'),(6317,'2005-07-11 18:47:41',4206,225,'2005-07-14 18:18:41',1,'2006-02-15 21:30:53'),(6318,'2005-07-11 18:48:22',2048,425,'2005-07-12 13:39:22',1,'2006-02-15 21:30:53'),(6319,'2005-07-11 18:50:45',3739,233,'2005-07-12 15:26:45',1,'2006-02-15 21:30:53'),(6320,'2005-07-11 18:50:55',441,511,'2005-07-13 22:46:55',2,'2006-02-15 21:30:53'),(6321,'2005-07-11 18:51:02',2655,388,'2005-07-14 20:57:02',2,'2006-02-15 21:30:53'),(6322,'2005-07-11 18:58:20',4115,403,'2005-07-14 16:41:20',2,'2006-02-15 21:30:53'),(6323,'2005-07-11 19:02:19',1352,346,'2005-07-14 15:54:19',1,'2006-02-15 21:30:53'),(6324,'2005-07-11 19:02:34',655,386,'2005-07-17 15:57:34',1,'2006-02-15 21:30:53'),(6325,'2005-07-11 19:06:01',4556,542,'2005-07-18 18:25:01',2,'2006-02-15 21:30:53'),(6326,'2005-07-11 19:06:55',2137,563,'2005-07-12 20:41:55',1,'2006-02-15 21:30:53'),(6327,'2005-07-11 19:07:29',909,146,'2005-07-15 16:09:29',1,'2006-02-15 21:30:53'),(6328,'2005-07-11 19:09:33',999,260,'2005-07-12 20:16:33',2,'2006-02-15 21:30:53'),(6329,'2005-07-11 19:10:38',2763,352,'2005-07-19 14:46:38',2,'2006-02-15 21:30:53'),(6330,'2005-07-11 19:15:42',3917,119,'2005-07-17 19:10:42',1,'2006-02-15 21:30:53'),(6331,'2005-07-11 19:17:21',1356,295,'2005-07-18 18:35:21',2,'2006-02-15 21:30:53'),(6332,'2005-07-11 19:19:06',1733,538,'2005-07-13 13:51:06',2,'2006-02-15 21:30:53'),(6333,'2005-07-11 19:20:16',2610,285,'2005-07-17 15:33:16',1,'2006-02-15 21:30:53'),(6334,'2005-07-11 19:20:44',948,168,'2005-07-19 18:49:44',2,'2006-02-15 21:30:53'),(6335,'2005-07-11 19:25:15',2757,396,'2005-07-16 17:02:15',1,'2006-02-15 21:30:53'),(6336,'2005-07-11 19:30:13',1229,471,'2005-07-20 21:27:13',2,'2006-02-15 21:30:53'),(6337,'2005-07-11 19:30:47',3967,47,'2005-07-19 20:27:47',2,'2006-02-15 21:30:53'),(6338,'2005-07-11 19:39:41',1691,54,'2005-07-18 01:13:41',2,'2006-02-15 21:30:53'),(6339,'2005-07-11 19:45:32',2401,145,'2005-07-18 22:34:32',2,'2006-02-15 21:30:53'),(6340,'2005-07-11 19:46:05',2374,264,'2005-07-20 16:51:05',2,'2006-02-15 21:30:53'),(6341,'2005-07-11 19:48:02',3580,448,'2005-07-15 01:31:02',1,'2006-02-15 21:30:53'),(6342,'2005-07-11 19:48:24',1851,403,'2005-07-13 14:09:24',2,'2006-02-15 21:30:53'),(6343,'2005-07-11 19:51:35',513,147,'2005-07-12 19:13:35',1,'2006-02-15 21:30:53'),(6344,'2005-07-11 20:04:43',3074,78,'2005-07-18 14:35:43',2,'2006-02-15 21:30:53'),(6345,'2005-07-11 20:05:18',4332,532,'2005-07-20 17:28:18',1,'2006-02-15 21:30:53'),(6346,'2005-07-11 20:08:34',4066,445,'2005-07-16 16:35:34',2,'2006-02-15 21:30:53'),(6347,'2005-07-11 20:18:53',3160,178,'2005-07-16 20:45:53',1,'2006-02-15 21:30:53'),(6348,'2005-07-11 20:21:18',21,66,'2005-07-19 15:56:18',2,'2006-02-15 21:30:53'),(6349,'2005-07-11 20:25:05',1581,216,'2005-07-21 00:35:05',2,'2006-02-15 21:30:53'),(6350,'2005-07-11 20:30:15',2853,225,'2005-07-16 21:30:15',1,'2006-02-15 21:30:53'),(6351,'2005-07-11 20:31:44',1852,507,'2005-07-18 17:16:44',2,'2006-02-15 21:30:53'),(6352,'2005-07-11 20:34:13',1143,235,'2005-07-13 19:49:13',1,'2006-02-15 21:30:53'),(6353,'2005-07-11 20:48:56',699,130,'2005-07-21 00:11:56',1,'2006-02-15 21:30:53'),(6354,'2005-07-11 20:54:27',3203,176,'2005-07-18 23:46:27',2,'2006-02-15 21:30:53'),(6355,'2005-07-11 20:56:29',2472,482,'2005-07-20 01:50:29',2,'2006-02-15 21:30:53'),(6356,'2005-07-11 20:57:48',2645,149,'2005-07-12 22:40:48',2,'2006-02-15 21:30:53'),(6357,'2005-07-11 20:58:51',658,252,'2005-07-12 15:06:51',1,'2006-02-15 21:30:53'),(6358,'2005-07-11 21:03:12',4527,567,'2005-07-15 20:06:12',2,'2006-02-15 21:30:53'),(6359,'2005-07-11 21:06:17',1656,30,'2005-07-16 02:51:17',2,'2006-02-15 21:30:53'),(6360,'2005-07-11 21:07:40',3075,338,'2005-07-16 15:11:40',1,'2006-02-15 21:30:53'),(6361,'2005-07-11 21:09:14',2903,561,'2005-07-14 18:26:14',2,'2006-02-15 21:30:53'),(6362,'2005-07-11 21:09:31',4259,358,'2005-07-13 23:08:31',1,'2006-02-15 21:30:53'),(6363,'2005-07-11 21:13:19',4167,344,'2005-07-20 15:44:19',1,'2006-02-15 21:30:53'),(6364,'2005-07-11 21:14:48',4146,160,'2005-07-20 23:20:48',2,'2006-02-15 21:30:53'),(6365,'2005-07-11 21:17:40',4550,566,'2005-07-14 20:53:40',1,'2006-02-15 21:30:53'),(6366,'2005-07-11 21:18:16',3989,366,'2005-07-17 00:21:16',1,'2006-02-15 21:30:53'),(6367,'2005-07-11 21:18:29',1465,357,'2005-07-15 01:05:29',1,'2006-02-15 21:30:53'),(6368,'2005-07-11 21:19:01',3666,588,'2005-07-13 17:56:01',2,'2006-02-15 21:30:53'),(6369,'2005-07-11 21:23:36',1086,252,'2005-07-13 22:23:36',2,'2006-02-15 21:30:53'),(6370,'2005-07-11 21:28:32',1410,99,'2005-07-20 02:51:32',2,'2006-02-15 21:30:53'),(6371,'2005-07-11 21:31:51',4297,265,'2005-07-16 23:10:51',1,'2006-02-15 21:30:53'),(6372,'2005-07-11 21:35:06',741,64,'2005-07-15 02:30:06',2,'2006-02-15 21:30:53'),(6373,'2005-07-11 21:35:20',1042,115,'2005-07-13 23:22:20',2,'2006-02-15 21:30:53'),(6374,'2005-07-11 21:36:10',266,244,'2005-07-17 15:50:10',2,'2006-02-15 21:30:53'),(6375,'2005-07-11 21:39:46',1936,8,'2005-07-18 02:12:46',2,'2006-02-15 21:30:53'),(6376,'2005-07-11 21:40:23',1834,263,'2005-07-13 23:16:23',1,'2006-02-15 21:30:53'),(6377,'2005-07-11 21:41:16',4017,118,'2005-07-15 20:05:16',1,'2006-02-15 21:30:53'),(6378,'2005-07-11 21:45:23',3170,145,'2005-07-14 16:56:23',1,'2006-02-15 21:30:53'),(6379,'2005-07-11 21:51:25',522,287,'2005-07-17 03:38:25',2,'2006-02-15 21:30:53'),(6380,'2005-07-11 21:55:40',3378,172,'2005-07-17 20:42:40',1,'2006-02-15 21:30:53'),(6381,'2005-07-11 21:58:48',2584,340,'2005-07-16 16:18:48',1,'2006-02-15 21:30:53'),(6382,'2005-07-11 21:58:53',3223,336,'2005-07-17 21:18:53',2,'2006-02-15 21:30:53'),(6383,'2005-07-11 22:06:53',4275,486,'2005-07-17 16:09:53',1,'2006-02-15 21:30:53'),(6384,'2005-07-11 22:07:26',491,313,'2005-07-16 22:39:26',1,'2006-02-15 21:30:53'),(6385,'2005-07-11 22:07:32',1830,69,'2005-07-20 16:57:32',1,'2006-02-15 21:30:53'),(6386,'2005-07-11 22:14:57',633,593,'2005-07-15 16:41:57',2,'2006-02-15 21:30:53'),(6387,'2005-07-11 22:15:56',1726,384,'2005-07-14 20:20:56',2,'2006-02-15 21:30:53'),(6388,'2005-07-11 22:17:16',3506,525,'2005-07-19 23:50:16',2,'2006-02-15 21:30:53'),(6389,'2005-07-11 22:18:20',2268,274,'2005-07-16 16:57:20',2,'2006-02-15 21:30:53'),(6390,'2005-07-11 22:19:23',3057,77,'2005-07-15 20:10:23',2,'2006-02-15 21:30:53'),(6391,'2005-07-11 22:23:09',1745,264,'2005-07-15 23:02:09',1,'2006-02-15 21:30:53'),(6392,'2005-07-11 22:25:19',4406,468,'2005-07-16 04:24:19',1,'2006-02-15 21:30:53'),(6393,'2005-07-11 22:28:12',3802,164,'2005-07-14 18:03:12',1,'2006-02-15 21:30:53'),(6394,'2005-07-11 22:29:15',2574,52,'2005-07-20 02:19:15',2,'2006-02-15 21:30:53'),(6395,'2005-07-11 22:29:29',3058,264,'2005-07-18 00:50:29',1,'2006-02-15 21:30:53'),(6396,'2005-07-11 22:31:08',2394,507,'2005-07-19 17:19:08',2,'2006-02-15 21:30:53'),(6397,'2005-07-11 22:34:02',2423,287,'2005-07-13 23:01:02',1,'2006-02-15 21:30:53'),(6398,'2005-07-11 22:34:49',1409,296,'2005-07-17 17:58:49',2,'2006-02-15 21:30:53'),(6399,'2005-07-11 22:39:05',2031,288,'2005-07-16 01:12:05',1,'2006-02-15 21:30:53'),(6400,'2005-07-11 22:43:44',3289,536,'2005-07-19 03:58:44',2,'2006-02-15 21:30:53'),(6401,'2005-07-11 22:44:34',1427,35,'2005-07-12 22:18:34',2,'2006-02-15 21:30:53'),(6402,'2005-07-11 22:46:10',2576,66,'2005-07-16 04:02:10',1,'2006-02-15 21:30:53'),(6403,'2005-07-11 22:46:25',1019,238,'2005-07-13 22:15:25',1,'2006-02-15 21:30:53'),(6404,'2005-07-11 22:49:50',1183,526,'2005-07-14 18:29:50',2,'2006-02-15 21:30:53'),(6405,'2005-07-11 22:53:12',3983,357,'2005-07-18 23:02:12',2,'2006-02-15 21:30:53'),(6406,'2005-07-11 22:55:27',4439,392,'2005-07-20 04:50:27',2,'2006-02-15 21:30:53'),(6407,'2005-07-11 23:02:19',775,140,'2005-07-21 00:30:19',1,'2006-02-15 21:30:53'),(6408,'2005-07-11 23:03:02',2008,350,'2005-07-19 23:09:02',2,'2006-02-15 21:30:53'),(6409,'2005-07-11 23:05:49',3859,537,'2005-07-13 00:13:49',2,'2006-02-15 21:30:53'),(6410,'2005-07-11 23:08:06',1127,560,'2005-07-19 19:57:06',2,'2006-02-15 21:30:53'),(6411,'2005-07-11 23:10:50',4347,124,'2005-07-19 17:15:50',1,'2006-02-15 21:30:53'),(6412,'2005-07-11 23:19:21',3797,220,'2005-07-16 19:48:21',1,'2006-02-15 21:30:53'),(6413,'2005-07-11 23:26:11',4446,251,'2005-07-17 21:58:11',2,'2006-02-15 21:30:53'),(6414,'2005-07-11 23:26:13',814,502,'2005-07-18 17:29:13',1,'2006-02-15 21:30:53'),(6415,'2005-07-11 23:27:52',4175,84,'2005-07-19 22:29:52',2,'2006-02-15 21:30:53'),(6416,'2005-07-11 23:29:14',1063,158,'2005-07-13 20:20:14',1,'2006-02-15 21:30:53'),(6417,'2005-07-11 23:35:11',3042,80,'2005-07-18 20:00:11',2,'2006-02-15 21:30:53'),(6418,'2005-07-11 23:36:27',3101,185,'2005-07-16 18:42:27',1,'2006-02-15 21:30:53'),(6419,'2005-07-11 23:36:38',3683,311,'2005-07-13 03:23:38',1,'2006-02-15 21:30:53'),(6420,'2005-07-11 23:38:49',4443,206,'2005-07-17 17:46:49',2,'2006-02-15 21:30:53'),(6421,'2005-07-11 23:45:25',4477,479,'2005-07-15 20:45:25',2,'2006-02-15 21:30:53'),(6422,'2005-07-11 23:46:19',762,257,'2005-07-20 22:12:19',1,'2006-02-15 21:30:53'),(6423,'2005-07-11 23:47:31',892,427,'2005-07-19 18:16:31',1,'2006-02-15 21:30:53'),(6424,'2005-07-11 23:49:37',3040,359,'2005-07-21 00:53:37',1,'2006-02-15 21:30:53'),(6425,'2005-07-11 23:54:52',2487,339,'2005-07-13 18:37:52',1,'2006-02-15 21:30:53'),(6426,'2005-07-11 23:56:38',498,495,'2005-07-21 05:22:38',1,'2006-02-15 21:30:53'),(6427,'2005-07-11 23:57:34',1043,122,'2005-07-14 18:05:34',2,'2006-02-15 21:30:53'),(6428,'2005-07-12 00:01:51',4365,187,'2005-07-20 22:02:51',2,'2006-02-15 21:30:53'),(6429,'2005-07-12 00:02:50',141,342,'2005-07-21 02:08:50',1,'2006-02-15 21:30:53'),(6430,'2005-07-12 00:03:34',178,390,'2005-07-15 03:11:34',1,'2006-02-15 21:30:53'),(6431,'2005-07-12 00:03:57',3471,458,'2005-07-20 03:47:57',1,'2006-02-15 21:30:53'),(6432,'2005-07-12 00:09:41',970,293,'2005-07-20 20:06:41',1,'2006-02-15 21:30:53'),(6433,'2005-07-12 00:12:02',1357,101,'2005-07-21 04:25:02',2,'2006-02-15 21:30:53'),(6434,'2005-07-12 00:14:25',1478,102,'2005-07-20 19:54:25',2,'2006-02-15 21:30:53'),(6435,'2005-07-12 00:16:19',1957,561,'2005-07-17 19:15:19',1,'2006-02-15 21:30:53'),(6436,'2005-07-12 00:18:42',3758,122,'2005-07-13 03:57:42',2,'2006-02-15 21:30:53'),(6437,'2005-07-12 00:20:29',4539,355,'2005-07-12 22:26:29',1,'2006-02-15 21:30:53'),(6438,'2005-07-12 00:23:01',412,211,'2005-07-17 22:45:01',1,'2006-02-15 21:30:53'),(6439,'2005-07-12 00:23:48',3463,406,'2005-07-13 00:54:48',2,'2006-02-15 21:30:53'),(6440,'2005-07-12 00:25:04',2148,269,'2005-07-13 04:52:04',2,'2006-02-15 21:30:53'),(6441,'2005-07-12 00:27:08',2489,505,'2005-07-14 03:12:08',1,'2006-02-15 21:30:53'),(6442,'2005-07-12 00:29:45',1273,360,'2005-07-15 19:37:45',2,'2006-02-15 21:30:53'),(6443,'2005-07-12 00:35:51',895,155,'2005-07-16 04:50:51',1,'2006-02-15 21:30:53'),(6444,'2005-07-12 00:36:02',2214,168,'2005-07-18 05:53:02',1,'2006-02-15 21:30:53'),(6445,'2005-07-12 00:37:02',582,385,'2005-07-17 22:05:02',2,'2006-02-15 21:30:53'),(6446,'2005-07-12 00:44:08',3634,473,'2005-07-14 20:39:08',2,'2006-02-15 21:30:53'),(6447,'2005-07-12 00:45:17',3945,482,'2005-07-18 05:56:17',2,'2006-02-15 21:30:53'),(6448,'2005-07-12 00:45:59',2663,160,'2005-07-17 00:34:59',1,'2006-02-15 21:30:53'),(6449,'2005-07-12 00:48:58',4395,117,'2005-07-21 02:57:58',1,'2006-02-15 21:30:53'),(6450,'2005-07-12 00:49:05',2413,32,'2005-07-13 01:54:05',2,'2006-02-15 21:30:53'),(6451,'2005-07-12 00:52:19',1008,381,'2005-07-16 21:30:19',2,'2006-02-15 21:30:53'),(6452,'2005-07-12 00:57:31',109,388,'2005-07-14 20:41:31',1,'2006-02-15 21:30:53'),(6453,'2005-07-12 00:59:53',2506,169,'2005-07-14 19:17:53',2,'2006-02-15 21:30:53'),(6454,'2005-07-12 01:00:12',4028,446,'2005-07-16 22:12:12',1,'2006-02-15 21:30:53'),(6455,'2005-07-12 01:01:58',4267,277,'2005-07-16 02:42:58',2,'2006-02-15 21:30:53'),(6456,'2005-07-12 01:05:11',259,387,'2005-07-20 23:26:11',2,'2006-02-15 21:30:53'),(6457,'2005-07-12 01:06:35',2970,64,'2005-07-14 03:27:35',1,'2006-02-15 21:30:53'),(6458,'2005-07-12 01:08:52',2809,138,'2005-07-16 20:22:52',1,'2006-02-15 21:30:53'),(6459,'2005-07-12 01:12:03',4025,557,'2005-07-15 23:48:03',1,'2006-02-15 21:30:53'),(6460,'2005-07-12 01:13:44',2402,371,'2005-07-17 04:51:44',2,'2006-02-15 21:30:53'),(6461,'2005-07-12 01:14:03',1799,135,'2005-07-19 21:12:03',1,'2006-02-15 21:30:53'),(6462,'2005-07-12 01:15:24',4534,414,'2005-07-19 05:11:24',2,'2006-02-15 21:30:53'),(6463,'2005-07-12 01:16:11',2930,391,'2005-07-13 01:37:11',1,'2006-02-15 21:30:53'),(6464,'2005-07-12 01:16:40',3100,303,'2005-07-20 00:53:40',1,'2006-02-15 21:30:53'),(6465,'2005-07-12 01:17:11',2047,207,'2005-07-20 00:29:11',2,'2006-02-15 21:30:53'),(6466,'2005-07-12 01:21:03',3369,235,'2005-07-14 04:05:03',1,'2006-02-15 21:30:53'),(6467,'2005-07-12 01:22:03',2067,457,'2005-07-20 04:37:03',2,'2006-02-15 21:30:53'),(6468,'2005-07-12 01:27:09',4560,541,'2005-07-20 00:37:09',2,'2006-02-15 21:30:53'),(6469,'2005-07-12 01:29:27',3830,147,'2005-07-16 20:22:27',2,'2006-02-15 21:30:53'),(6470,'2005-07-12 01:29:41',1680,240,'2005-07-15 21:33:41',2,'2006-02-15 21:30:53'),(6471,'2005-07-12 01:31:06',2253,397,'2005-07-13 05:26:06',1,'2006-02-15 21:30:53'),(6472,'2005-07-12 01:33:25',3780,183,'2005-07-15 20:26:25',1,'2006-02-15 21:30:53'),(6473,'2005-07-12 01:35:40',527,594,'2005-07-20 20:11:40',1,'2006-02-15 21:30:53'),(6474,'2005-07-12 01:36:46',310,43,'2005-07-16 07:24:46',2,'2006-02-15 21:30:53'),(6475,'2005-07-12 01:36:57',2035,74,'2005-07-17 21:22:57',1,'2006-02-15 21:30:53'),(6476,'2005-07-12 01:37:48',978,28,'2005-07-12 20:21:48',2,'2006-02-15 21:30:53'),(6477,'2005-07-12 01:38:42',804,181,'2005-07-17 05:19:42',2,'2006-02-15 21:30:53'),(6478,'2005-07-12 01:41:44',2589,483,'2005-07-15 20:48:44',1,'2006-02-15 21:30:53'),(6479,'2005-07-12 01:49:00',2587,558,'2005-07-21 04:26:00',1,'2006-02-15 21:30:53'),(6480,'2005-07-12 01:49:29',3076,309,'2005-07-17 01:00:29',1,'2006-02-15 21:30:53'),(6481,'2005-07-12 01:50:15',2392,128,'2005-07-20 03:03:15',1,'2006-02-15 21:30:53'),(6482,'2005-07-12 01:50:21',4135,57,'2005-07-14 06:49:21',2,'2006-02-15 21:30:53'),(6483,'2005-07-12 01:59:20',1053,263,'2005-07-12 22:22:20',2,'2006-02-15 21:30:53'),(6484,'2005-07-12 02:04:10',4093,556,'2005-07-17 23:18:10',2,'2006-02-15 21:30:53'),(6485,'2005-07-12 02:07:59',1224,319,'2005-07-19 22:56:59',1,'2006-02-15 21:30:53'),(6486,'2005-07-12 02:09:36',4008,75,'2005-07-14 03:04:36',2,'2006-02-15 21:30:53'),(6487,'2005-07-12 02:17:00',4000,277,'2005-07-19 00:57:00',2,'2006-02-15 21:30:53'),(6488,'2005-07-12 02:20:09',3974,169,'2005-07-20 00:53:09',2,'2006-02-15 21:30:53'),(6489,'2005-07-12 02:22:46',1821,268,'2005-07-17 06:16:46',2,'2006-02-15 21:30:53'),(6490,'2005-07-12 02:28:03',2249,548,'2005-07-19 03:06:03',2,'2006-02-15 21:30:53'),(6491,'2005-07-12 02:28:31',2803,415,'2005-07-21 00:38:31',1,'2006-02-15 21:30:53'),(6492,'2005-07-12 02:28:40',466,590,'2005-07-17 05:58:40',2,'2006-02-15 21:30:53'),(6493,'2005-07-12 02:40:41',16,184,'2005-07-16 04:56:41',1,'2006-02-15 21:30:53'),(6494,'2005-07-12 02:42:51',1124,57,'2005-07-20 06:57:51',1,'2006-02-15 21:30:53'),(6495,'2005-07-12 02:57:02',2440,19,'2005-07-14 08:35:02',1,'2006-02-15 21:30:53'),(6496,'2005-07-12 02:57:39',3550,139,'2005-07-20 01:43:39',1,'2006-02-15 21:30:53'),(6497,'2005-07-12 03:04:29',933,222,'2005-07-17 21:36:29',2,'2006-02-15 21:30:53'),(6498,'2005-07-12 03:05:38',243,48,'2005-07-19 07:12:38',1,'2006-02-15 21:30:53'),(6499,'2005-07-12 03:11:18',3165,474,'2005-07-21 07:50:18',2,'2006-02-15 21:30:53'),(6500,'2005-07-12 03:11:23',4521,577,'2005-07-13 00:51:23',2,'2006-02-15 21:30:53'),(6501,'2005-07-12 03:11:55',2851,219,'2005-07-16 02:08:55',2,'2006-02-15 21:30:53'),(6502,'2005-07-12 03:15:45',1641,40,'2005-07-17 08:47:45',2,'2006-02-15 21:30:53'),(6503,'2005-07-12 03:18:07',1319,120,'2005-07-15 00:05:07',1,'2006-02-15 21:30:53'),(6504,'2005-07-12 03:19:14',3786,535,'2005-07-17 01:13:14',2,'2006-02-15 21:30:53'),(6505,'2005-07-12 03:27:37',3986,415,'2005-07-17 22:42:37',2,'2006-02-15 21:30:53'),(6506,'2005-07-12 03:28:22',386,423,'2005-07-17 22:43:22',1,'2006-02-15 21:30:53'),(6507,'2005-07-12 03:33:12',2463,118,'2005-07-20 03:56:12',1,'2006-02-15 21:30:53'),(6508,'2005-07-12 03:34:50',1474,597,'2005-07-17 02:57:50',2,'2006-02-15 21:30:53'),(6509,'2005-07-12 03:35:01',2468,427,'2005-07-13 06:50:01',2,'2006-02-15 21:30:53'),(6510,'2005-07-12 03:35:39',905,446,'2005-07-21 01:41:39',1,'2006-02-15 21:30:53'),(6511,'2005-07-12 03:39:29',1350,322,'2005-07-17 01:01:29',2,'2006-02-15 21:30:53'),(6512,'2005-07-12 03:42:49',1703,68,'2005-07-13 05:01:49',2,'2006-02-15 21:30:53'),(6513,'2005-07-12 03:44:43',2671,393,'2005-07-13 05:54:43',1,'2006-02-15 21:30:53'),(6514,'2005-07-12 03:47:44',3562,73,'2005-07-20 00:11:44',1,'2006-02-15 21:30:53'),(6515,'2005-07-12 03:50:32',706,261,'2005-07-15 03:54:32',2,'2006-02-15 21:30:53'),(6516,'2005-07-12 03:51:54',863,291,'2005-07-14 03:41:54',2,'2006-02-15 21:30:53'),(6517,'2005-07-12 03:52:39',185,387,'2005-07-20 08:00:39',1,'2006-02-15 21:30:53'),(6518,'2005-07-12 03:59:42',2698,288,'2005-07-19 22:21:42',2,'2006-02-15 21:30:53'),(6519,'2005-07-12 04:00:36',4149,598,'2005-07-19 01:15:36',1,'2006-02-15 21:30:53'),(6520,'2005-07-12 04:05:16',1535,270,'2005-07-15 08:26:16',1,'2006-02-15 21:30:53'),(6521,'2005-07-12 04:06:11',3293,49,'2005-07-21 05:50:11',1,'2006-02-15 21:30:53'),(6522,'2005-07-12 04:11:58',3916,142,'2005-07-15 08:32:58',1,'2006-02-15 21:30:53'),(6523,'2005-07-12 04:14:19',1848,574,'2005-07-17 00:38:19',1,'2006-02-15 21:30:53'),(6524,'2005-07-12 04:14:35',1467,376,'2005-07-17 03:59:35',2,'2006-02-15 21:30:53'),(6525,'2005-07-12 04:17:15',1408,103,'2005-07-18 23:11:15',1,'2006-02-15 21:30:53'),(6526,'2005-07-12 04:21:20',1718,225,'2005-07-18 23:45:20',2,'2006-02-15 21:30:53'),(6527,'2005-07-12 04:23:06',538,65,'2005-07-17 00:20:06',1,'2006-02-15 21:30:53'),(6528,'2005-07-12 04:29:44',3824,598,'2005-07-18 02:39:44',2,'2006-02-15 21:30:53'),(6529,'2005-07-12 04:31:04',1058,503,'2005-07-17 07:09:04',2,'2006-02-15 21:30:53'),(6530,'2005-07-12 04:33:19',3410,75,'2005-07-15 08:26:19',1,'2006-02-15 21:30:53'),(6531,'2005-07-12 04:35:24',4231,510,'2005-07-16 05:37:24',2,'2006-02-15 21:30:53'),(6532,'2005-07-12 04:38:32',2361,225,'2005-07-13 03:54:32',1,'2006-02-15 21:30:53'),(6533,'2005-07-12 04:39:38',3853,366,'2005-07-18 05:29:38',1,'2006-02-15 21:30:53'),(6534,'2005-07-12 04:39:43',2359,577,'2005-07-16 06:33:43',1,'2006-02-15 21:30:53'),(6535,'2005-07-12 04:43:43',1921,446,'2005-07-17 04:52:43',1,'2006-02-15 21:30:53'),(6536,'2005-07-12 04:44:25',3521,289,'2005-07-18 01:52:25',2,'2006-02-15 21:30:53'),(6537,'2005-07-12 04:46:30',3381,207,'2005-07-19 03:04:30',2,'2006-02-15 21:30:53'),(6538,'2005-07-12 04:50:26',1987,529,'2005-07-20 23:44:26',2,'2006-02-15 21:30:53'),(6539,'2005-07-12 04:50:49',2275,259,'2005-07-19 03:23:49',1,'2006-02-15 21:30:53'),(6540,'2005-07-12 04:51:13',937,156,'2005-07-21 03:38:13',1,'2006-02-15 21:30:53'),(6541,'2005-07-12 04:53:41',1795,529,'2005-07-17 23:17:41',2,'2006-02-15 21:30:53'),(6542,'2005-07-12 04:53:49',2421,359,'2005-07-13 01:48:49',1,'2006-02-15 21:30:53'),(6543,'2005-07-12 04:54:32',2568,264,'2005-07-15 09:50:32',2,'2006-02-15 21:30:53'),(6544,'2005-07-12 04:56:15',1218,97,'2005-07-17 08:28:15',1,'2006-02-15 21:30:53'),(6545,'2005-07-12 04:56:30',4447,376,'2005-07-20 05:41:30',1,'2006-02-15 21:30:53'),(6546,'2005-07-12 04:57:17',393,105,'2005-07-17 09:29:17',2,'2006-02-15 21:30:53'),(6547,'2005-07-12 04:57:46',2656,262,'2005-07-18 08:36:46',2,'2006-02-15 21:30:53'),(6548,'2005-07-12 05:00:46',2480,488,'2005-07-19 04:40:46',2,'2006-02-15 21:30:53'),(6549,'2005-07-12 05:02:01',2688,493,'2005-07-20 06:19:01',2,'2006-02-15 21:30:53'),(6550,'2005-07-12 05:03:14',2184,112,'2005-07-19 04:06:14',1,'2006-02-15 21:30:53'),(6551,'2005-07-12 05:03:43',282,567,'2005-07-13 10:44:43',1,'2006-02-15 21:30:53'),(6552,'2005-07-12 05:05:06',766,493,'2005-07-13 05:12:06',2,'2006-02-15 21:30:53'),(6553,'2005-07-12 05:06:39',1137,265,'2005-07-21 10:37:39',1,'2006-02-15 21:30:53'),(6554,'2005-07-12 05:07:26',2741,178,'2005-07-21 06:06:26',2,'2006-02-15 21:30:53'),(6555,'2005-07-12 05:08:16',1282,188,'2005-07-14 04:09:16',1,'2006-02-15 21:30:53'),(6556,'2005-07-12 05:10:16',3901,570,'2005-07-13 04:16:16',2,'2006-02-15 21:30:53'),(6557,'2005-07-12 05:12:03',1442,116,'2005-07-20 06:49:03',1,'2006-02-15 21:30:53'),(6558,'2005-07-12 05:16:07',2195,164,'2005-07-13 05:32:07',2,'2006-02-15 21:30:53'),(6559,'2005-07-12 05:20:35',458,353,'2005-07-16 08:44:35',2,'2006-02-15 21:30:53'),(6560,'2005-07-12 05:22:06',433,54,'2005-07-15 00:04:06',2,'2006-02-15 21:30:53'),(6561,'2005-07-12 05:24:02',4568,528,'2005-07-16 03:43:02',2,'2006-02-15 21:30:53'),(6562,'2005-07-12 05:26:26',3969,27,'2005-07-16 05:10:26',2,'2006-02-15 21:30:53'),(6563,'2005-07-12 05:34:09',87,438,'2005-07-21 07:37:09',1,'2006-02-15 21:30:53'),(6564,'2005-07-12 05:34:44',2320,210,'2005-07-18 06:12:44',2,'2006-02-15 21:30:53'),(6565,'2005-07-12 05:39:50',2751,35,'2005-07-13 01:07:50',2,'2006-02-15 21:30:53'),(6566,'2005-07-12 05:42:53',1822,178,'2005-07-19 01:23:53',2,'2006-02-15 21:30:53'),(6567,'2005-07-12 05:43:09',1336,198,'2005-07-19 08:18:09',2,'2006-02-15 21:30:53'),(6568,'2005-07-12 05:45:47',4203,13,'2005-07-15 05:18:47',2,'2006-02-15 21:30:53'),(6569,'2005-07-12 05:47:40',759,183,'2005-07-20 06:23:40',2,'2006-02-15 21:30:53'),(6570,'2005-07-12 05:50:31',2082,217,'2005-07-13 09:58:31',1,'2006-02-15 21:30:53'),(6571,'2005-07-12 05:51:47',3700,140,'2005-07-15 11:31:47',1,'2006-02-15 21:30:53'),(6572,'2005-07-12 05:56:38',3121,35,'2005-07-16 10:41:38',1,'2006-02-15 21:30:53'),(6573,'2005-07-12 06:03:40',3308,239,'2005-07-13 11:49:40',2,'2006-02-15 21:30:53'),(6574,'2005-07-12 06:04:22',621,115,'2005-07-18 03:19:22',2,'2006-02-15 21:30:53'),(6575,'2005-07-12 06:12:53',1414,598,'2005-07-18 07:55:53',2,'2006-02-15 21:30:53'),(6576,'2005-07-12 06:13:41',339,362,'2005-07-16 03:22:41',1,'2006-02-15 21:30:53'),(6577,'2005-07-12 06:15:05',4191,439,'2005-07-15 06:23:05',1,'2006-02-15 21:30:53'),(6578,'2005-07-12 06:15:41',2304,229,'2005-07-15 10:43:41',1,'2006-02-15 21:30:53'),(6580,'2005-07-12 06:26:10',1543,31,'2005-07-13 06:44:10',1,'2006-02-15 21:30:53'),(6581,'2005-07-12 06:26:49',2121,468,'2005-07-14 05:07:49',2,'2006-02-15 21:30:53'),(6582,'2005-07-12 06:28:12',2077,420,'2005-07-19 06:19:12',1,'2006-02-15 21:30:53'),(6583,'2005-07-12 06:42:31',2343,462,'2005-07-15 07:51:31',1,'2006-02-15 21:30:53'),(6584,'2005-07-12 06:43:36',1800,472,'2005-07-16 12:18:36',2,'2006-02-15 21:30:53'),(6585,'2005-07-12 06:50:52',2064,136,'2005-07-21 06:51:52',1,'2006-02-15 21:30:53'),(6586,'2005-07-12 06:56:24',3860,93,'2005-07-17 09:36:24',1,'2006-02-15 21:30:53'),(6587,'2005-07-12 06:56:26',238,419,'2005-07-20 05:53:26',2,'2006-02-15 21:30:53'),(6588,'2005-07-12 06:57:40',1257,420,'2005-07-16 04:27:40',1,'2006-02-15 21:30:53'),(6589,'2005-07-12 07:06:29',1595,424,'2005-07-14 12:06:29',2,'2006-02-15 21:30:53'),(6590,'2005-07-12 07:08:21',1067,442,'2005-07-18 06:16:21',2,'2006-02-15 21:30:53'),(6591,'2005-07-12 07:13:46',2846,509,'2005-07-16 05:15:46',2,'2006-02-15 21:30:53'),(6592,'2005-07-12 07:19:35',3481,273,'2005-07-19 07:15:35',1,'2006-02-15 21:30:53'),(6593,'2005-07-12 07:21:17',3441,356,'2005-07-14 02:35:17',2,'2006-02-15 21:30:53'),(6594,'2005-07-12 07:25:43',4458,517,'2005-07-13 07:59:43',1,'2006-02-15 21:30:53'),(6595,'2005-07-12 07:25:48',1286,458,'2005-07-20 02:24:48',2,'2006-02-15 21:30:53'),(6596,'2005-07-12 07:32:59',890,409,'2005-07-13 02:47:59',1,'2006-02-15 21:30:53'),(6597,'2005-07-12 07:37:02',979,479,'2005-07-16 10:24:02',2,'2006-02-15 21:30:53'),(6598,'2005-07-12 07:38:25',2049,532,'2005-07-19 07:58:25',1,'2006-02-15 21:30:53'),(6599,'2005-07-12 07:41:14',4348,519,'2005-07-21 02:45:14',2,'2006-02-15 21:30:53'),(6600,'2005-07-12 07:41:48',3315,389,'2005-07-18 12:36:48',2,'2006-02-15 21:30:53'),(6601,'2005-07-12 07:44:49',1640,464,'2005-07-20 03:22:49',2,'2006-02-15 21:30:53'),(6602,'2005-07-12 07:50:24',2382,214,'2005-07-20 03:25:24',2,'2006-02-15 21:30:53'),(6603,'2005-07-12 07:52:55',3583,425,'2005-07-16 13:19:55',2,'2006-02-15 21:30:53'),(6604,'2005-07-12 07:57:45',822,365,'2005-07-16 05:41:45',2,'2006-02-15 21:30:53'),(6605,'2005-07-12 08:01:07',2892,547,'2005-07-19 03:12:07',1,'2006-02-15 21:30:53'),(6606,'2005-07-12 08:03:40',2805,178,'2005-07-13 09:05:40',1,'2006-02-15 21:30:53'),(6607,'2005-07-12 08:08:50',337,562,'2005-07-20 09:17:50',1,'2006-02-15 21:30:53'),(6608,'2005-07-12 08:16:50',3577,244,'2005-07-18 07:08:50',2,'2006-02-15 21:30:53'),(6609,'2005-07-12 08:19:41',3332,133,'2005-07-19 08:19:41',2,'2006-02-15 21:30:53'),(6610,'2005-07-12 08:20:02',645,353,'2005-07-21 09:16:02',2,'2006-02-15 21:30:53'),(6611,'2005-07-12 08:20:23',1604,286,'2005-07-16 07:19:23',1,'2006-02-15 21:30:53'),(6612,'2005-07-12 08:28:33',235,152,'2005-07-17 06:25:33',1,'2006-02-15 21:30:53'),(6613,'2005-07-12 08:30:07',3421,460,'2005-07-14 10:25:07',2,'2006-02-15 21:30:53'),(6614,'2005-07-12 08:33:49',3004,144,'2005-07-18 07:28:49',2,'2006-02-15 21:30:53'),(6615,'2005-07-12 08:36:22',23,438,'2005-07-20 09:03:22',1,'2006-02-15 21:30:53'),(6616,'2005-07-12 08:37:30',1833,179,'2005-07-20 10:33:30',1,'2006-02-15 21:30:53'),(6617,'2005-07-12 08:39:56',2292,248,'2005-07-14 09:32:56',2,'2006-02-15 21:30:53'),(6618,'2005-07-12 08:41:42',4266,327,'2005-07-14 05:34:42',1,'2006-02-15 21:30:53'),(6619,'2005-07-12 08:50:48',4062,305,'2005-07-14 11:54:48',1,'2006-02-15 21:30:53'),(6620,'2005-07-12 08:51:03',2362,337,'2005-07-16 03:59:03',2,'2006-02-15 21:30:53'),(6621,'2005-07-12 08:57:30',2229,561,'2005-07-14 09:47:30',1,'2006-02-15 21:30:53'),(6622,'2005-07-12 09:04:11',4350,325,'2005-07-13 04:27:11',1,'2006-02-15 21:30:53'),(6623,'2005-07-12 09:05:34',4412,302,'2005-07-19 13:54:34',2,'2006-02-15 21:30:53'),(6624,'2005-07-12 09:05:50',3946,335,'2005-07-18 13:59:50',2,'2006-02-15 21:30:53'),(6625,'2005-07-12 09:06:40',735,443,'2005-07-21 04:57:40',2,'2006-02-15 21:30:53'),(6626,'2005-07-12 09:16:24',2418,269,'2005-07-17 04:06:24',2,'2006-02-15 21:30:53'),(6627,'2005-07-12 09:16:46',626,565,'2005-07-17 10:58:46',1,'2006-02-15 21:30:53'),(6628,'2005-07-12 09:18:08',2894,211,'2005-07-21 04:27:08',2,'2006-02-15 21:30:53'),(6629,'2005-07-12 09:18:35',2855,582,'2005-07-20 11:34:35',2,'2006-02-15 21:30:53'),(6630,'2005-07-12 09:30:05',1843,462,'2005-07-14 08:29:05',2,'2006-02-15 21:30:53'),(6631,'2005-07-12 09:31:43',2340,204,'2005-07-15 05:00:43',2,'2006-02-15 21:30:53'),(6632,'2005-07-12 09:33:10',2929,442,'2005-07-15 11:36:10',1,'2006-02-15 21:30:53'),(6633,'2005-07-12 09:35:42',2908,150,'2005-07-13 12:56:42',2,'2006-02-15 21:30:53'),(6634,'2005-07-12 09:37:18',2943,50,'2005-07-13 09:28:18',1,'2006-02-15 21:30:53'),(6635,'2005-07-12 09:47:58',515,273,'2005-07-16 15:43:58',1,'2006-02-15 21:30:53'),(6636,'2005-07-12 09:49:46',3270,441,'2005-07-14 12:15:46',1,'2006-02-15 21:30:53'),(6637,'2005-07-12 09:57:39',2852,164,'2005-07-19 08:40:39',1,'2006-02-15 21:30:53'),(6638,'2005-07-12 09:58:02',207,87,'2005-07-13 09:40:02',1,'2006-02-15 21:30:53'),(6639,'2005-07-12 10:00:44',3385,587,'2005-07-19 04:56:44',1,'2006-02-15 21:30:53'),(6640,'2005-07-12 10:27:19',2794,148,'2005-07-21 06:28:19',2,'2006-02-15 21:30:53'),(6641,'2005-07-12 10:33:14',2165,334,'2005-07-20 08:24:14',2,'2006-02-15 21:30:53'),(6642,'2005-07-12 10:37:52',201,441,'2005-07-13 15:13:52',1,'2006-02-15 21:30:53'),(6643,'2005-07-12 10:39:22',174,88,'2005-07-18 13:52:22',1,'2006-02-15 21:30:53'),(6644,'2005-07-12 10:39:39',2667,285,'2005-07-14 11:50:39',1,'2006-02-15 21:30:53'),(6645,'2005-07-12 10:39:55',2858,73,'2005-07-17 07:41:55',1,'2006-02-15 21:30:53'),(6646,'2005-07-12 10:41:34',4061,508,'2005-07-15 05:31:34',1,'2006-02-15 21:30:53'),(6647,'2005-07-12 10:43:53',1841,8,'2005-07-14 05:37:53',1,'2006-02-15 21:30:53'),(6648,'2005-07-12 10:46:30',718,356,'2005-07-14 16:15:30',1,'2006-02-15 21:30:53'),(6649,'2005-07-12 10:51:09',70,57,'2005-07-14 16:05:09',2,'2006-02-15 21:30:53'),(6650,'2005-07-12 10:57:10',1589,526,'2005-07-14 07:24:10',1,'2006-02-15 21:30:53'),(6651,'2005-07-12 10:57:28',98,447,'2005-07-15 06:06:28',2,'2006-02-15 21:30:53'),(6652,'2005-07-12 10:59:38',2200,518,'2005-07-13 13:52:38',1,'2006-02-15 21:30:53'),(6653,'2005-07-12 11:06:17',614,25,'2005-07-19 16:52:17',2,'2006-02-15 21:30:53'),(6654,'2005-07-12 11:06:28',2870,458,'2005-07-20 10:27:28',1,'2006-02-15 21:30:53'),(6655,'2005-07-12 11:08:32',3937,100,'2005-07-15 15:17:32',1,'2006-02-15 21:30:53'),(6656,'2005-07-12 11:09:47',2282,330,'2005-07-14 05:50:47',1,'2006-02-15 21:30:53'),(6657,'2005-07-12 11:11:36',3697,553,'2005-07-16 15:56:36',1,'2006-02-15 21:30:53'),(6658,'2005-07-12 11:13:21',172,27,'2005-07-17 09:10:21',2,'2006-02-15 21:30:53'),(6659,'2005-07-12 11:18:05',2285,134,'2005-07-16 16:45:05',2,'2006-02-15 21:30:53'),(6660,'2005-07-12 11:20:12',446,598,'2005-07-20 12:58:12',2,'2006-02-15 21:30:53'),(6661,'2005-07-12 11:20:39',2367,315,'2005-07-16 08:17:39',2,'2006-02-15 21:30:53'),(6662,'2005-07-12 11:21:06',1464,99,'2005-07-13 13:00:06',1,'2006-02-15 21:30:53'),(6663,'2005-07-12 11:27:35',4364,5,'2005-07-21 16:35:35',1,'2006-02-15 21:30:53'),(6664,'2005-07-12 11:28:22',4578,351,'2005-07-15 09:30:22',1,'2006-02-15 21:30:53'),(6665,'2005-07-12 11:29:14',2912,587,'2005-07-19 11:26:14',2,'2006-02-15 21:30:53'),(6666,'2005-07-12 11:32:15',3194,314,'2005-07-14 16:09:15',2,'2006-02-15 21:30:53'),(6667,'2005-07-12 11:36:22',215,50,'2005-07-19 12:53:22',1,'2006-02-15 21:30:53'),(6668,'2005-07-12 11:37:45',1498,199,'2005-07-14 13:28:45',2,'2006-02-15 21:30:53'),(6669,'2005-07-12 11:39:55',1420,355,'2005-07-20 05:56:55',1,'2006-02-15 21:30:53'),(6670,'2005-07-12 11:44:33',3106,249,'2005-07-19 07:54:33',2,'2006-02-15 21:30:53'),(6671,'2005-07-12 11:48:48',955,526,'2005-07-19 16:55:48',2,'2006-02-15 21:30:53'),(6672,'2005-07-12 11:49:16',375,439,'2005-07-13 07:03:16',2,'2006-02-15 21:30:53'),(6673,'2005-07-12 11:50:56',1997,322,'2005-07-13 14:27:56',1,'2006-02-15 21:30:53'),(6674,'2005-07-12 11:51:54',2385,399,'2005-07-13 16:57:54',1,'2006-02-15 21:30:53'),(6675,'2005-07-12 11:53:06',2124,523,'2005-07-13 06:09:06',1,'2006-02-15 21:30:53'),(6676,'2005-07-12 11:53:40',2294,571,'2005-07-19 09:15:40',1,'2006-02-15 21:30:53'),(6677,'2005-07-12 11:58:14',2389,516,'2005-07-21 06:05:14',2,'2006-02-15 21:30:53'),(6678,'2005-07-12 11:58:36',3473,330,'2005-07-15 17:50:36',2,'2006-02-15 21:30:53'),(6679,'2005-07-12 12:01:07',3664,586,'2005-07-14 11:36:07',1,'2006-02-15 21:30:53'),(6680,'2005-07-12 12:01:56',2887,43,'2005-07-16 17:32:56',1,'2006-02-15 21:30:53'),(6681,'2005-07-12 12:04:12',854,368,'2005-07-19 11:01:12',2,'2006-02-15 21:30:53'),(6682,'2005-07-12 12:12:43',1984,339,'2005-07-21 10:49:43',2,'2006-02-15 21:30:53'),(6683,'2005-07-12 12:14:05',3433,244,'2005-07-17 14:02:05',2,'2006-02-15 21:30:53'),(6684,'2005-07-12 12:14:42',2817,583,'2005-07-21 11:07:42',2,'2006-02-15 21:30:53'),(6685,'2005-07-12 12:16:28',1434,5,'2005-07-19 17:03:28',1,'2006-02-15 21:30:53'),(6686,'2005-07-12 12:18:38',3804,6,'2005-07-13 17:56:38',2,'2006-02-15 21:30:53'),(6687,'2005-07-12 12:19:23',2736,128,'2005-07-19 17:12:23',1,'2006-02-15 21:30:53'),(6688,'2005-07-12 12:22:12',2377,246,'2005-07-14 14:05:12',1,'2006-02-15 21:30:53'),(6689,'2005-07-12 12:22:13',1568,525,'2005-07-16 07:44:13',1,'2006-02-15 21:30:53'),(6690,'2005-07-12 12:23:02',4254,447,'2005-07-16 15:39:02',2,'2006-02-15 21:30:53'),(6691,'2005-07-12 12:26:38',403,192,'2005-07-18 13:26:38',2,'2006-02-15 21:30:53'),(6692,'2005-07-12 12:35:39',2837,372,'2005-07-20 11:20:39',2,'2006-02-15 21:30:53'),(6693,'2005-07-12 12:37:00',2014,573,'2005-07-20 09:36:00',1,'2006-02-15 21:30:53'),(6694,'2005-07-12 12:39:23',586,204,'2005-07-19 14:47:23',1,'2006-02-15 21:30:53'),(6695,'2005-07-12 12:39:39',3088,550,'2005-07-17 13:36:39',2,'2006-02-15 21:30:53'),(6696,'2005-07-12 12:44:04',299,273,'2005-07-16 14:17:04',1,'2006-02-15 21:30:53'),(6697,'2005-07-12 12:44:57',210,103,'2005-07-19 13:02:57',1,'2006-02-15 21:30:53'),(6698,'2005-07-12 12:45:00',4419,64,'2005-07-16 11:16:00',2,'2006-02-15 21:30:53'),(6699,'2005-07-12 12:45:21',3411,565,'2005-07-15 12:59:21',1,'2006-02-15 21:30:53'),(6700,'2005-07-12 12:47:22',3063,184,'2005-07-21 16:04:22',1,'2006-02-15 21:30:53'),(6701,'2005-07-12 12:47:59',3428,454,'2005-07-13 10:28:59',1,'2006-02-15 21:30:53'),(6702,'2005-07-12 12:48:03',233,164,'2005-07-13 11:55:03',1,'2006-02-15 21:30:53'),(6703,'2005-07-12 12:50:19',46,470,'2005-07-16 13:41:19',1,'2006-02-15 21:30:53'),(6704,'2005-07-12 12:50:24',1590,595,'2005-07-20 16:41:24',2,'2006-02-15 21:30:53'),(6705,'2005-07-12 12:53:11',4268,363,'2005-07-13 07:17:11',1,'2006-02-15 21:30:53'),(6706,'2005-07-12 12:59:16',4552,267,'2005-07-19 10:37:16',1,'2006-02-15 21:30:53'),(6707,'2005-07-12 13:07:55',406,80,'2005-07-16 16:26:55',2,'2006-02-15 21:30:53'),(6708,'2005-07-12 13:10:55',372,82,'2005-07-21 07:36:55',1,'2006-02-15 21:30:53'),(6709,'2005-07-12 13:20:41',4049,322,'2005-07-16 10:37:41',2,'2006-02-15 21:30:53'),(6710,'2005-07-12 13:23:09',806,462,'2005-07-20 10:10:09',2,'2006-02-15 21:30:53'),(6711,'2005-07-12 13:23:40',2247,257,'2005-07-20 11:45:40',2,'2006-02-15 21:30:53'),(6712,'2005-07-12 13:24:47',4581,226,'2005-07-20 09:35:47',2,'2006-02-15 21:30:53'),(6713,'2005-07-12 13:27:36',4218,557,'2005-07-16 11:14:36',1,'2006-02-15 21:30:53'),(6714,'2005-07-12 13:29:06',1947,370,'2005-07-18 16:02:06',2,'2006-02-15 21:30:53'),(6715,'2005-07-12 13:32:28',643,386,'2005-07-15 17:01:28',2,'2006-02-15 21:30:53'),(6716,'2005-07-12 13:34:58',2783,367,'2005-07-19 15:09:58',1,'2006-02-15 21:30:53'),(6717,'2005-07-12 13:35:02',523,273,'2005-07-20 15:03:02',1,'2006-02-15 21:30:53'),(6718,'2005-07-12 13:38:06',2283,541,'2005-07-18 09:05:06',1,'2006-02-15 21:30:53'),(6719,'2005-07-12 13:40:37',739,330,'2005-07-15 15:23:37',2,'2006-02-15 21:30:53'),(6720,'2005-07-12 13:41:16',2704,151,'2005-07-13 14:41:16',2,'2006-02-15 21:30:53'),(6721,'2005-07-12 13:42:58',2798,462,'2005-07-19 16:39:58',2,'2006-02-15 21:30:53'),(6722,'2005-07-12 13:44:03',3124,211,'2005-07-19 12:43:03',2,'2006-02-15 21:30:53'),(6723,'2005-07-12 13:44:57',2678,499,'2005-07-14 15:57:57',2,'2006-02-15 21:30:53'),(6724,'2005-07-12 13:45:15',2486,262,'2005-07-19 19:18:15',1,'2006-02-15 21:30:53'),(6725,'2005-07-12 13:47:17',831,213,'2005-07-17 13:31:17',1,'2006-02-15 21:30:53'),(6726,'2005-07-12 13:48:14',4494,97,'2005-07-16 11:11:14',1,'2006-02-15 21:30:53'),(6727,'2005-07-12 13:54:25',3793,407,'2005-07-14 17:29:25',1,'2006-02-15 21:30:53'),(6728,'2005-07-12 13:56:48',2113,414,'2005-07-15 18:49:48',1,'2006-02-15 21:30:53'),(6729,'2005-07-12 13:58:23',2495,455,'2005-07-19 09:34:23',2,'2006-02-15 21:30:53'),(6730,'2005-07-12 13:58:25',1552,532,'2005-07-20 13:01:25',1,'2006-02-15 21:30:53'),(6731,'2005-07-12 13:58:27',844,593,'2005-07-15 10:04:27',2,'2006-02-15 21:30:53'),(6732,'2005-07-12 13:58:51',1913,299,'2005-07-17 17:42:51',1,'2006-02-15 21:30:53'),(6733,'2005-07-12 14:04:01',1476,585,'2005-07-21 18:57:01',2,'2006-02-15 21:30:53'),(6734,'2005-07-12 14:04:24',2248,446,'2005-07-21 19:47:24',1,'2006-02-15 21:30:53'),(6735,'2005-07-12 14:08:20',276,428,'2005-07-18 09:41:20',2,'2006-02-15 21:30:53'),(6736,'2005-07-12 14:16:50',530,342,'2005-07-15 16:26:50',1,'2006-02-15 21:30:53'),(6737,'2005-07-12 14:16:52',315,304,'2005-07-18 19:48:52',1,'2006-02-15 21:30:53'),(6738,'2005-07-12 14:17:55',1197,366,'2005-07-21 10:11:55',2,'2006-02-15 21:30:53'),(6739,'2005-07-12 14:22:08',1221,71,'2005-07-18 16:57:08',2,'2006-02-15 21:30:53'),(6740,'2005-07-12 14:22:08',2431,139,'2005-07-14 14:35:08',1,'2006-02-15 21:30:53'),(6741,'2005-07-12 14:24:16',237,359,'2005-07-15 08:31:16',1,'2006-02-15 21:30:53'),(6742,'2005-07-12 14:25:31',4242,558,'2005-07-17 08:50:31',2,'2006-02-15 21:30:53'),(6743,'2005-07-12 14:29:25',158,261,'2005-07-13 13:13:25',1,'2006-02-15 21:30:53'),(6744,'2005-07-12 14:30:28',2565,64,'2005-07-14 16:20:28',1,'2006-02-15 21:30:53'),(6745,'2005-07-12 14:30:51',1331,524,'2005-07-13 13:42:51',2,'2006-02-15 21:30:53'),(6746,'2005-07-12 14:33:01',3127,537,'2005-07-17 19:52:01',2,'2006-02-15 21:30:53'),(6747,'2005-07-12 14:33:21',3651,126,'2005-07-13 09:59:21',2,'2006-02-15 21:30:53'),(6748,'2005-07-12 14:39:27',3655,540,'2005-07-18 13:40:27',2,'2006-02-15 21:30:53'),(6749,'2005-07-12 14:43:05',2895,334,'2005-07-21 15:13:05',2,'2006-02-15 21:30:53'),(6750,'2005-07-12 14:49:39',3838,459,'2005-07-18 18:43:39',2,'2006-02-15 21:30:53'),(6751,'2005-07-12 14:50:34',1749,312,'2005-07-15 19:39:34',2,'2006-02-15 21:30:53'),(6752,'2005-07-12 14:53:15',3392,453,'2005-07-20 09:23:15',1,'2006-02-15 21:30:53'),(6753,'2005-07-12 14:55:42',2591,147,'2005-07-18 19:16:42',1,'2006-02-15 21:30:53'),(6754,'2005-07-12 14:59:24',1460,114,'2005-07-14 11:04:24',2,'2006-02-15 21:30:53'),(6755,'2005-07-12 15:07:49',2542,126,'2005-07-21 18:43:49',2,'2006-02-15 21:30:53'),(6756,'2005-07-12 15:08:28',1174,531,'2005-07-13 14:25:28',2,'2006-02-15 21:30:53'),(6757,'2005-07-12 15:09:48',547,558,'2005-07-17 15:04:48',2,'2006-02-15 21:30:53'),(6758,'2005-07-12 15:13:49',4098,546,'2005-07-20 09:31:49',2,'2006-02-15 21:30:53'),(6759,'2005-07-12 15:14:48',3624,49,'2005-07-15 11:29:48',1,'2006-02-15 21:30:53'),(6760,'2005-07-12 15:16:00',501,502,'2005-07-20 13:20:00',2,'2006-02-15 21:30:53'),(6761,'2005-07-12 15:17:42',3645,7,'2005-07-18 17:59:42',2,'2006-02-15 21:30:53'),(6762,'2005-07-12 15:25:33',3857,262,'2005-07-21 18:57:33',1,'2006-02-15 21:30:53'),(6763,'2005-07-12 15:26:34',3364,314,'2005-07-18 16:38:34',2,'2006-02-15 21:30:53'),(6764,'2005-07-12 15:29:27',4407,396,'2005-07-21 20:00:27',2,'2006-02-15 21:30:53'),(6765,'2005-07-12 15:30:47',2571,433,'2005-07-19 14:19:47',2,'2006-02-15 21:30:53'),(6766,'2005-07-12 15:32:01',3615,171,'2005-07-18 14:03:01',2,'2006-02-15 21:30:53'),(6767,'2005-07-12 15:46:55',1819,208,'2005-07-17 17:36:55',2,'2006-02-15 21:30:53'),(6768,'2005-07-12 15:47:51',3418,151,'2005-07-19 21:17:51',2,'2006-02-15 21:30:53'),(6769,'2005-07-12 15:48:54',1687,63,'2005-07-21 14:39:54',2,'2006-02-15 21:30:53'),(6770,'2005-07-12 15:49:40',2080,360,'2005-07-20 10:14:40',2,'2006-02-15 21:30:53'),(6771,'2005-07-12 15:54:40',1113,396,'2005-07-17 15:56:40',2,'2006-02-15 21:30:53'),(6772,'2005-07-12 15:55:35',3810,89,'2005-07-18 10:47:35',1,'2006-02-15 21:30:53'),(6773,'2005-07-12 15:55:39',3346,12,'2005-07-18 17:52:39',2,'2006-02-15 21:30:53'),(6774,'2005-07-12 15:56:08',868,171,'2005-07-13 18:42:08',1,'2006-02-15 21:30:53'),(6775,'2005-07-12 16:01:44',2909,383,'2005-07-19 14:11:44',1,'2006-02-15 21:30:53'),(6776,'2005-07-12 16:02:09',2398,348,'2005-07-20 16:31:09',1,'2006-02-15 21:30:53'),(6777,'2005-07-12 16:04:40',4089,351,'2005-07-20 15:05:40',2,'2006-02-15 21:30:53'),(6778,'2005-07-12 16:06:00',4503,381,'2005-07-14 21:57:00',2,'2006-02-15 21:30:53'),(6779,'2005-07-12 16:10:50',4468,404,'2005-07-17 14:51:50',2,'2006-02-15 21:30:53'),(6780,'2005-07-12 16:18:12',1255,121,'2005-07-13 17:56:12',2,'2006-02-15 21:30:53'),(6781,'2005-07-12 16:21:47',3783,533,'2005-07-15 19:52:47',1,'2006-02-15 21:30:53'),(6782,'2005-07-12 16:23:25',2742,199,'2005-07-20 18:46:25',2,'2006-02-15 21:30:53'),(6783,'2005-07-12 16:27:56',3633,506,'2005-07-13 12:11:56',2,'2006-02-15 21:30:53'),(6784,'2005-07-12 16:28:49',197,578,'2005-07-15 17:27:49',1,'2006-02-15 21:30:53'),(6785,'2005-07-12 16:30:57',4448,69,'2005-07-18 20:46:57',1,'2006-02-15 21:30:53'),(6786,'2005-07-12 16:32:33',2011,546,'2005-07-16 12:42:33',2,'2006-02-15 21:30:53'),(6787,'2005-07-12 16:33:28',1481,342,'2005-07-18 21:48:28',2,'2006-02-15 21:30:53'),(6788,'2005-07-12 16:33:44',1162,460,'2005-07-20 15:38:44',2,'2006-02-15 21:30:53'),(6789,'2005-07-12 16:34:40',1973,76,'2005-07-14 17:02:40',2,'2006-02-15 21:30:53'),(6790,'2005-07-12 16:34:59',4486,400,'2005-07-17 21:43:59',2,'2006-02-15 21:30:53'),(6791,'2005-07-12 16:35:07',1495,144,'2005-07-20 15:32:07',2,'2006-02-15 21:30:53'),(6792,'2005-07-12 16:37:28',510,571,'2005-07-20 11:20:28',2,'2006-02-15 21:30:53'),(6793,'2005-07-12 16:37:55',103,148,'2005-07-21 16:04:55',2,'2006-02-15 21:30:53'),(6794,'2005-07-12 16:38:23',813,233,'2005-07-20 17:36:23',2,'2006-02-15 21:30:53'),(6795,'2005-07-12 16:41:00',1489,245,'2005-07-21 20:52:00',1,'2006-02-15 21:30:53'),(6796,'2005-07-12 16:44:16',227,291,'2005-07-16 14:48:16',2,'2006-02-15 21:30:53'),(6797,'2005-07-12 16:47:06',1536,469,'2005-07-14 14:38:06',2,'2006-02-15 21:30:53'),(6798,'2005-07-12 16:49:11',275,115,'2005-07-19 12:11:11',2,'2006-02-15 21:30:53'),(6799,'2005-07-12 16:52:13',2778,42,'2005-07-14 15:11:13',2,'2006-02-15 21:30:53'),(6800,'2005-07-12 17:03:56',3742,599,'2005-07-21 20:32:56',2,'2006-02-15 21:30:53'),(6801,'2005-07-12 17:09:08',872,500,'2005-07-21 22:25:08',1,'2006-02-15 21:30:53'),(6802,'2005-07-12 17:14:17',2942,298,'2005-07-17 11:54:17',2,'2006-02-15 21:30:53'),(6803,'2005-07-12 17:21:49',2676,490,'2005-07-14 18:01:49',2,'2006-02-15 21:30:53'),(6804,'2005-07-12 17:22:06',1554,269,'2005-07-21 11:37:06',1,'2006-02-15 21:30:53'),(6805,'2005-07-12 17:23:01',1758,262,'2005-07-21 19:38:01',2,'2006-02-15 21:30:53'),(6806,'2005-07-12 17:31:43',656,179,'2005-07-17 14:36:43',1,'2006-02-15 21:30:53'),(6807,'2005-07-12 17:33:53',669,376,'2005-07-18 16:28:53',2,'2006-02-15 21:30:53'),(6808,'2005-07-12 17:36:42',362,263,'2005-07-18 23:33:42',2,'2006-02-15 21:30:53'),(6809,'2005-07-12 17:51:54',3455,168,'2005-07-17 15:10:54',1,'2006-02-15 21:30:53'),(6810,'2005-07-12 17:54:19',2802,485,'2005-07-20 16:58:19',2,'2006-02-15 21:30:53'),(6811,'2005-07-12 17:54:33',1572,107,'2005-07-20 17:39:33',1,'2006-02-15 21:30:53'),(6812,'2005-07-12 18:03:25',2227,553,'2005-07-20 18:33:25',2,'2006-02-15 21:30:53'),(6813,'2005-07-12 18:03:50',135,54,'2005-07-16 16:30:50',1,'2006-02-15 21:30:53'),(6814,'2005-07-12 18:11:58',1863,579,'2005-07-18 20:37:58',2,'2006-02-15 21:30:53'),(6815,'2005-07-12 18:14:10',3236,468,'2005-07-17 14:16:10',1,'2006-02-15 21:30:53'),(6816,'2005-07-12 18:18:50',2963,290,'2005-07-18 21:09:50',2,'2006-02-15 21:30:53'),(6817,'2005-07-12 18:19:57',184,135,'2005-07-19 22:53:57',1,'2006-02-15 21:30:53'),(6818,'2005-07-12 18:20:54',1013,153,'2005-07-21 00:03:54',2,'2006-02-15 21:30:53'),(6819,'2005-07-12 18:21:01',1253,198,'2005-07-13 21:14:01',1,'2006-02-15 21:30:53'),(6820,'2005-07-12 18:21:30',223,243,'2005-07-14 15:14:30',1,'2006-02-15 21:30:53'),(6821,'2005-07-12 18:22:10',623,363,'2005-07-14 13:25:10',2,'2006-02-15 21:30:53'),(6822,'2005-07-12 18:23:39',1592,300,'2005-07-19 21:06:39',1,'2006-02-15 21:30:53'),(6823,'2005-07-12 18:24:31',795,557,'2005-07-17 23:13:31',1,'2006-02-15 21:30:53'),(6824,'2005-07-12 18:26:46',858,579,'2005-07-21 15:23:46',1,'2006-02-15 21:30:53'),(6825,'2005-07-12 18:28:12',2342,281,'2005-07-15 19:24:12',1,'2006-02-15 21:30:53'),(6826,'2005-07-12 18:32:02',1708,408,'2005-07-16 23:21:02',1,'2006-02-15 21:30:53'),(6827,'2005-07-12 18:33:45',1529,283,'2005-07-13 19:09:45',1,'2006-02-15 21:30:53'),(6828,'2005-07-12 18:38:51',874,502,'2005-07-14 20:10:51',1,'2006-02-15 21:30:53'),(6829,'2005-07-12 18:38:59',4184,361,'2005-07-16 23:25:59',1,'2006-02-15 21:30:53'),(6830,'2005-07-12 18:42:55',1943,578,'2005-07-17 17:58:55',1,'2006-02-15 21:30:53'),(6831,'2005-07-12 18:44:04',924,163,'2005-07-16 21:39:04',2,'2006-02-15 21:30:53'),(6832,'2005-07-12 18:51:41',444,220,'2005-07-20 13:29:41',2,'2006-02-15 21:30:53'),(6833,'2005-07-12 18:53:34',912,301,'2005-07-19 22:21:34',2,'2006-02-15 21:30:53'),(6834,'2005-07-12 18:53:37',897,533,'2005-07-19 13:42:37',1,'2006-02-15 21:30:53'),(6835,'2005-07-12 18:58:03',1444,367,'2005-07-18 00:41:03',1,'2006-02-15 21:30:53'),(6836,'2005-07-12 18:58:05',2744,113,'2005-07-15 17:45:05',1,'2006-02-15 21:30:53'),(6837,'2005-07-12 18:59:45',1203,533,'2005-07-21 22:47:45',2,'2006-02-15 21:30:53'),(6838,'2005-07-12 19:01:30',3492,354,'2005-07-17 23:42:30',1,'2006-02-15 21:30:53'),(6839,'2005-07-12 19:03:19',3900,357,'2005-07-15 23:48:19',1,'2006-02-15 21:30:53'),(6840,'2005-07-12 19:03:22',1381,323,'2005-07-21 18:34:22',2,'2006-02-15 21:30:53'),(6841,'2005-07-12 19:04:24',2265,108,'2005-07-14 23:58:24',1,'2006-02-15 21:30:53'),(6842,'2005-07-12 19:07:55',3376,366,'2005-07-19 22:47:55',1,'2006-02-15 21:30:53'),(6843,'2005-07-12 19:14:05',746,561,'2005-07-20 23:15:05',1,'2006-02-15 21:30:53'),(6844,'2005-07-12 19:14:53',3211,482,'2005-07-18 16:07:53',2,'2006-02-15 21:30:53'),(6845,'2005-07-12 19:20:41',3833,414,'2005-07-14 15:27:41',1,'2006-02-15 21:30:53'),(6846,'2005-07-12 19:20:45',1214,18,'2005-07-17 00:06:45',1,'2006-02-15 21:30:53'),(6847,'2005-07-12 19:22:37',346,63,'2005-07-21 18:53:37',2,'2006-02-15 21:30:53'),(6848,'2005-07-12 19:24:07',1782,433,'2005-07-14 17:03:07',1,'2006-02-15 21:30:53'),(6849,'2005-07-12 19:29:19',4307,479,'2005-07-19 22:03:19',1,'2006-02-15 21:30:53'),(6850,'2005-07-12 19:30:42',1145,433,'2005-07-17 21:26:42',2,'2006-02-15 21:30:53'),(6851,'2005-07-12 19:32:14',664,280,'2005-07-17 21:03:14',1,'2006-02-15 21:30:53'),(6852,'2005-07-12 19:33:49',2182,75,'2005-07-13 20:01:49',2,'2006-02-15 21:30:53'),(6853,'2005-07-12 19:38:11',4006,299,'2005-07-20 00:14:11',1,'2006-02-15 21:30:53'),(6854,'2005-07-12 19:38:57',3173,151,'2005-07-16 16:28:57',1,'2006-02-15 21:30:53'),(6855,'2005-07-12 19:46:29',2657,24,'2005-07-15 16:56:29',2,'2006-02-15 21:30:53'),(6856,'2005-07-12 19:50:16',4338,275,'2005-07-14 22:25:16',1,'2006-02-15 21:30:53'),(6857,'2005-07-12 19:53:30',424,196,'2005-07-13 15:22:30',1,'2006-02-15 21:30:53'),(6858,'2005-07-12 19:53:51',1095,516,'2005-07-19 14:12:51',1,'2006-02-15 21:30:53'),(6859,'2005-07-12 19:53:57',4108,321,'2005-07-17 19:48:57',2,'2006-02-15 21:30:53'),(6860,'2005-07-12 19:54:17',2907,91,'2005-07-18 13:59:17',1,'2006-02-15 21:30:53'),(6861,'2005-07-12 19:56:52',354,83,'2005-07-13 16:02:52',1,'2006-02-15 21:30:53'),(6862,'2005-07-12 19:58:09',3477,231,'2005-07-18 15:48:09',2,'2006-02-15 21:30:53'),(6863,'2005-07-12 19:58:34',229,484,'2005-07-21 16:57:34',1,'2006-02-15 21:30:53'),(6864,'2005-07-12 19:59:25',2252,38,'2005-07-19 15:52:25',2,'2006-02-15 21:30:53'),(6865,'2005-07-12 20:02:40',1428,175,'2005-07-20 00:39:40',2,'2006-02-15 21:30:53'),(6866,'2005-07-12 20:03:44',2481,312,'2005-07-15 01:55:44',1,'2006-02-15 21:30:53'),(6867,'2005-07-12 20:06:47',3354,190,'2005-07-19 16:59:47',1,'2006-02-15 21:30:53'),(6868,'2005-07-12 20:10:17',719,306,'2005-07-15 22:34:17',2,'2006-02-15 21:30:53'),(6869,'2005-07-12 20:12:06',3546,278,'2005-07-13 18:37:06',1,'2006-02-15 21:30:53'),(6870,'2005-07-12 20:13:45',3102,13,'2005-07-16 22:09:45',2,'2006-02-15 21:30:53'),(6871,'2005-07-12 20:13:49',3612,204,'2005-07-14 20:11:49',2,'2006-02-15 21:30:53'),(6872,'2005-07-12 20:15:04',3246,86,'2005-07-18 18:19:04',1,'2006-02-15 21:30:53'),(6873,'2005-07-12 20:20:50',802,161,'2005-07-17 01:51:50',1,'2006-02-15 21:30:53'),(6874,'2005-07-12 20:20:53',4478,539,'2005-07-19 19:41:53',1,'2006-02-15 21:30:53'),(6875,'2005-07-12 20:23:05',3420,172,'2005-07-19 00:09:05',2,'2006-02-15 21:30:53'),(6876,'2005-07-12 20:32:50',34,531,'2005-07-16 21:12:50',1,'2006-02-15 21:30:53'),(6877,'2005-07-12 20:32:58',3968,231,'2005-07-18 18:01:58',1,'2006-02-15 21:30:53'),(6878,'2005-07-12 20:37:13',2428,363,'2005-07-19 20:13:13',2,'2006-02-15 21:30:53'),(6879,'2005-07-12 20:37:37',1901,416,'2005-07-20 15:40:37',2,'2006-02-15 21:30:53'),(6880,'2005-07-12 20:41:35',1473,229,'2005-07-17 02:22:35',1,'2006-02-15 21:30:53'),(6881,'2005-07-12 20:46:35',2496,346,'2005-07-21 00:26:35',2,'2006-02-15 21:30:53'),(6882,'2005-07-12 20:50:39',2469,166,'2005-07-14 21:01:39',1,'2006-02-15 21:30:53'),(6883,'2005-07-12 20:50:48',468,596,'2005-07-19 16:00:48',2,'2006-02-15 21:30:53'),(6884,'2005-07-12 20:52:41',3642,17,'2005-07-20 23:13:41',1,'2006-02-15 21:30:53'),(6885,'2005-07-12 20:56:04',3972,159,'2005-07-15 19:21:04',2,'2006-02-15 21:30:53'),(6886,'2005-07-12 20:58:04',4533,429,'2005-07-18 16:56:04',2,'2006-02-15 21:30:53'),(6887,'2005-07-12 21:00:23',4487,542,'2005-07-21 17:46:23',1,'2006-02-15 21:30:53'),(6888,'2005-07-12 21:01:11',1896,490,'2005-07-17 21:49:11',2,'2006-02-15 21:30:53'),(6889,'2005-07-12 21:01:22',2919,198,'2005-07-20 20:16:22',2,'2006-02-15 21:30:53'),(6890,'2005-07-12 21:03:03',2538,473,'2005-07-14 00:47:03',1,'2006-02-15 21:30:53'),(6891,'2005-07-12 21:07:35',3189,507,'2005-07-14 16:59:35',2,'2006-02-15 21:30:53'),(6892,'2005-07-12 21:10:04',1567,138,'2005-07-13 23:03:04',2,'2006-02-15 21:30:53'),(6893,'2005-07-12 21:20:11',2611,377,'2005-07-21 18:55:11',2,'2006-02-15 21:30:53'),(6894,'2005-07-12 21:20:50',1347,315,'2005-07-20 23:42:50',2,'2006-02-15 21:30:53'),(6895,'2005-07-12 21:23:59',2935,599,'2005-07-19 20:47:59',2,'2006-02-15 21:30:53'),(6896,'2005-07-12 21:25:37',1266,111,'2005-07-20 23:51:37',1,'2006-02-15 21:30:53'),(6897,'2005-07-12 21:30:41',170,13,'2005-07-15 03:19:41',1,'2006-02-15 21:30:53'),(6898,'2005-07-12 21:39:04',1725,557,'2005-07-15 20:30:04',1,'2006-02-15 21:30:53'),(6899,'2005-07-12 21:44:16',3565,483,'2005-07-21 22:21:16',2,'2006-02-15 21:30:53'),(6900,'2005-07-12 21:45:25',129,292,'2005-07-19 21:19:25',1,'2006-02-15 21:30:53'),(6901,'2005-07-12 21:46:33',4574,158,'2005-07-16 21:36:33',1,'2006-02-15 21:30:53'),(6902,'2005-07-12 21:57:16',314,485,'2005-07-14 20:56:16',1,'2006-02-15 21:30:53'),(6903,'2005-07-12 21:58:15',3690,517,'2005-07-14 01:38:15',2,'2006-02-15 21:30:53'),(6904,'2005-07-12 22:02:09',2312,465,'2005-07-17 16:42:09',1,'2006-02-15 21:30:53'),(6905,'2005-07-12 22:02:18',763,25,'2005-07-18 23:30:18',1,'2006-02-15 21:30:53'),(6906,'2005-07-12 22:03:02',1435,335,'2005-07-15 00:35:02',1,'2006-02-15 21:30:53'),(6907,'2005-07-12 22:03:49',2516,575,'2005-07-18 19:18:49',1,'2006-02-15 21:30:53'),(6908,'2005-07-12 22:08:46',3161,529,'2005-07-21 00:21:46',2,'2006-02-15 21:30:53'),(6909,'2005-07-12 22:09:30',769,174,'2005-07-17 02:05:30',2,'2006-02-15 21:30:53'),(6910,'2005-07-12 22:11:21',1290,546,'2005-07-21 02:35:21',1,'2006-02-15 21:30:53'),(6911,'2005-07-12 22:14:34',901,361,'2005-07-18 20:17:34',1,'2006-02-15 21:30:53'),(6912,'2005-07-12 22:17:16',1701,471,'2005-07-19 18:18:16',1,'2006-02-15 21:30:53'),(6913,'2005-07-12 22:18:12',569,443,'2005-07-14 23:03:12',2,'2006-02-15 21:30:53'),(6914,'2005-07-12 22:26:56',496,361,'2005-07-17 20:03:56',1,'2006-02-15 21:30:53'),(6915,'2005-07-12 22:28:09',1243,559,'2005-07-14 00:53:09',1,'2006-02-15 21:30:53'),(6916,'2005-07-12 22:29:18',3311,88,'2005-07-19 16:46:18',1,'2006-02-15 21:30:53'),(6917,'2005-07-12 22:30:15',3048,23,'2005-07-20 03:20:15',1,'2006-02-15 21:30:53'),(6918,'2005-07-12 22:30:29',4085,140,'2005-07-19 22:51:29',1,'2006-02-15 21:30:53'),(6919,'2005-07-12 22:32:17',1122,540,'2005-07-18 20:09:17',1,'2006-02-15 21:30:53'),(6920,'2005-07-12 22:32:58',2301,109,'2005-07-19 20:29:58',2,'2006-02-15 21:30:53'),(6921,'2005-07-12 22:39:03',3322,265,'2005-07-21 18:54:03',2,'2006-02-15 21:30:53'),(6922,'2005-07-12 22:39:48',1114,371,'2005-07-14 18:35:48',1,'2006-02-15 21:30:53'),(6923,'2005-07-12 22:40:48',2642,490,'2005-07-19 23:07:48',2,'2006-02-15 21:30:53'),(6924,'2005-07-26 22:51:53',1257,502,'2005-08-03 19:04:53',2,'2006-02-15 21:30:53'),(6925,'2005-07-26 22:52:32',2919,42,'2005-07-29 21:22:32',1,'2006-02-15 21:30:53'),(6926,'2005-07-26 22:52:45',1276,354,'2005-07-28 18:32:45',1,'2006-02-15 21:30:53'),(6927,'2005-07-26 22:56:00',4511,470,'2005-08-05 03:16:00',2,'2006-02-15 21:30:53'),(6928,'2005-07-26 22:56:21',3605,487,'2005-07-30 04:46:21',1,'2006-02-15 21:30:53'),(6929,'2005-07-26 22:59:19',3339,508,'2005-08-03 22:40:19',1,'2006-02-15 21:30:53'),(6930,'2005-07-26 23:00:01',2989,393,'2005-08-04 01:57:01',2,'2006-02-15 21:30:53'),(6931,'2005-07-26 23:02:57',2794,333,'2005-07-28 04:48:57',2,'2006-02-15 21:30:53'),(6932,'2005-07-26 23:08:04',4517,463,'2005-08-05 01:35:04',1,'2006-02-15 21:30:53'),(6933,'2005-07-26 23:09:23',1334,385,'2005-07-31 20:50:23',1,'2006-02-15 21:30:53'),(6934,'2005-07-26 23:11:03',455,107,'2005-08-04 19:18:03',1,'2006-02-15 21:30:53'),(6935,'2005-07-26 23:13:10',2771,435,'2005-07-27 18:09:10',1,'2006-02-15 21:30:53'),(6936,'2005-07-26 23:13:34',60,538,'2005-07-30 19:14:34',1,'2006-02-15 21:30:53'),(6937,'2005-07-26 23:15:50',1768,592,'2005-07-27 19:14:50',1,'2006-02-15 21:30:53'),(6938,'2005-07-26 23:16:04',2058,427,'2005-08-05 00:59:04',2,'2006-02-15 21:30:53'),(6939,'2005-07-26 23:17:51',278,354,'2005-08-03 21:12:51',2,'2006-02-15 21:30:53'),(6940,'2005-07-26 23:18:35',3876,149,'2005-08-05 01:44:35',2,'2006-02-15 21:30:53'),(6941,'2005-07-26 23:18:49',1575,441,'2005-07-31 00:23:49',2,'2006-02-15 21:30:53'),(6942,'2005-07-26 23:27:40',1203,470,'2005-07-31 03:17:40',2,'2006-02-15 21:30:53'),(6943,'2005-07-26 23:28:13',2436,21,'2005-07-30 02:22:13',2,'2006-02-15 21:30:53'),(6944,'2005-07-26 23:34:02',1168,373,'2005-08-05 01:27:02',1,'2006-02-15 21:30:53'),(6945,'2005-07-26 23:35:29',1627,560,'2005-07-28 00:12:29',1,'2006-02-15 21:30:53'),(6946,'2005-07-26 23:40:07',1854,181,'2005-08-04 01:18:07',2,'2006-02-15 21:30:53'),(6947,'2005-07-26 23:42:03',760,200,'2005-08-02 05:06:03',2,'2006-02-15 21:30:53'),(6948,'2005-07-26 23:43:49',3088,228,'2005-07-27 21:24:49',2,'2006-02-15 21:30:53'),(6949,'2005-07-26 23:44:12',1594,103,'2005-07-30 05:39:12',2,'2006-02-15 21:30:53'),(6950,'2005-07-26 23:45:33',197,503,'2005-07-31 04:40:33',2,'2006-02-15 21:30:53'),(6951,'2005-07-26 23:47:31',3348,98,'2005-07-31 22:17:31',1,'2006-02-15 21:30:53'),(6952,'2005-07-26 23:51:27',4288,290,'2005-07-30 02:45:27',2,'2006-02-15 21:30:53'),(6953,'2005-07-26 23:52:47',2910,306,'2005-07-30 23:07:47',1,'2006-02-15 21:30:53'),(6954,'2005-07-26 23:55:13',1112,584,'2005-07-28 19:01:13',2,'2006-02-15 21:30:53'),(6955,'2005-07-26 23:55:48',1104,469,'2005-08-02 03:25:48',2,'2006-02-15 21:30:53'),(6956,'2005-07-26 23:55:57',2499,240,'2005-08-03 21:41:57',1,'2006-02-15 21:30:53'),(6957,'2005-07-27 00:00:00',2231,518,'2005-07-29 19:32:00',2,'2006-02-15 21:30:53'),(6958,'2005-07-27 00:02:41',657,333,'2005-07-28 00:53:41',2,'2006-02-15 21:30:53'),(6959,'2005-07-27 00:07:51',1618,452,'2005-07-27 20:45:51',2,'2006-02-15 21:30:53'),(6960,'2005-07-27 00:08:33',192,421,'2005-08-03 20:58:33',2,'2006-02-15 21:30:53'),(6961,'2005-07-27 00:10:49',2205,38,'2005-07-30 00:26:49',2,'2006-02-15 21:30:53'),(6962,'2005-07-27 00:10:58',4500,245,'2005-07-30 02:11:58',2,'2006-02-15 21:30:53'),(6963,'2005-07-27 00:13:02',4284,489,'2005-08-03 18:13:02',1,'2006-02-15 21:30:53'),(6964,'2005-07-27 00:15:04',1537,404,'2005-07-31 00:04:04',2,'2006-02-15 21:30:53'),(6965,'2005-07-27 00:15:18',74,185,'2005-07-28 04:30:18',2,'2006-02-15 21:30:53'),(6966,'2005-07-27 00:15:35',1577,45,'2005-08-05 03:04:35',2,'2006-02-15 21:30:53'),(6967,'2005-07-27 00:16:31',1145,296,'2005-08-03 22:19:31',1,'2006-02-15 21:30:53'),(6968,'2005-07-27 00:16:45',1662,370,'2005-07-30 23:16:45',2,'2006-02-15 21:30:53'),(6969,'2005-07-27 00:23:54',2650,579,'2005-08-03 04:34:54',1,'2006-02-15 21:30:53'),(6970,'2005-07-27 00:26:14',17,418,'2005-08-03 20:00:14',2,'2006-02-15 21:30:53'),(6971,'2005-07-27 00:26:17',3493,366,'2005-08-01 03:59:17',2,'2006-02-15 21:30:53'),(6972,'2005-07-27 00:31:25',1716,434,'2005-07-28 22:15:25',2,'2006-02-15 21:30:53'),(6973,'2005-07-27 00:32:04',4572,564,'2005-07-29 01:05:04',2,'2006-02-15 21:30:53'),(6974,'2005-07-27 00:39:16',2924,122,'2005-08-04 01:59:16',2,'2006-02-15 21:30:53'),(6975,'2005-07-27 00:39:54',3328,527,'2005-08-02 19:49:54',1,'2006-02-15 21:30:53'),(6976,'2005-07-27 00:40:01',3096,41,'2005-07-31 22:30:01',2,'2006-02-15 21:30:53'),(6977,'2005-07-27 00:40:50',3545,429,'2005-08-02 19:08:50',2,'2006-02-15 21:30:53'),(6978,'2005-07-27 00:47:40',3645,132,'2005-07-31 04:32:40',2,'2006-02-15 21:30:53'),(6979,'2005-07-27 00:49:53',1001,141,'2005-07-31 03:59:53',2,'2006-02-15 21:30:53'),(6980,'2005-07-27 00:50:30',1127,164,'2005-08-03 23:35:30',1,'2006-02-15 21:30:53'),(6981,'2005-07-27 00:51:38',154,362,'2005-07-28 01:06:38',2,'2006-02-15 21:30:53'),(6982,'2005-07-27 00:53:41',3843,284,'2005-07-31 06:19:41',2,'2006-02-15 21:30:53'),(6983,'2005-07-27 00:55:03',1758,443,'2005-08-01 21:19:03',2,'2006-02-15 21:30:53'),(6984,'2005-07-27 00:56:30',2407,297,'2005-08-02 01:14:30',2,'2006-02-15 21:30:53'),(6985,'2005-07-27 00:57:42',1834,448,'2005-07-31 00:53:42',1,'2006-02-15 21:30:53'),(6986,'2005-07-27 00:59:05',2104,262,'2005-07-29 00:31:05',1,'2006-02-15 21:30:53'),(6987,'2005-07-27 00:59:50',3134,334,'2005-07-28 01:47:50',1,'2006-02-15 21:30:53'),(6988,'2005-07-27 01:00:08',756,316,'2005-07-31 04:35:08',2,'2006-02-15 21:30:53'),(6989,'2005-07-27 01:00:34',4036,120,'2005-07-30 23:53:34',1,'2006-02-15 21:30:53'),(6990,'2005-07-27 01:02:46',4065,146,'2005-07-31 00:22:46',1,'2006-02-15 21:30:53'),(6991,'2005-07-27 01:03:06',319,307,'2005-08-05 04:18:06',2,'2006-02-15 21:30:53'),(6992,'2005-07-27 01:04:45',3411,106,'2005-07-28 02:34:45',2,'2006-02-15 21:30:53'),(6993,'2005-07-27 01:05:24',3114,154,'2005-07-30 06:23:24',2,'2006-02-15 21:30:53'),(6994,'2005-07-27 01:08:26',4316,400,'2005-08-04 22:58:26',2,'2006-02-15 21:30:53'),(6995,'2005-07-27 01:12:13',1630,66,'2005-07-29 21:26:13',1,'2006-02-15 21:30:53'),(6996,'2005-07-27 01:13:45',3237,236,'2005-07-28 20:43:45',1,'2006-02-15 21:30:53'),(6997,'2005-07-27 01:14:02',2130,342,'2005-07-29 01:12:02',2,'2006-02-15 21:30:53'),(6998,'2005-07-27 01:16:29',788,300,'2005-07-30 05:50:29',2,'2006-02-15 21:30:53'),(6999,'2005-07-27 01:21:19',12,224,'2005-07-29 20:33:19',2,'2006-02-15 21:30:53'),(7000,'2005-07-27 01:23:24',2024,31,'2005-08-03 02:10:24',2,'2006-02-15 21:30:53'),(7001,'2005-07-27 01:25:34',1460,240,'2005-07-31 23:30:34',2,'2006-02-15 21:30:53'),(7002,'2005-07-27 01:26:14',4157,349,'2005-08-01 20:10:14',1,'2006-02-15 21:30:53'),(7003,'2005-07-27 01:32:06',636,161,'2005-07-30 21:33:06',2,'2006-02-15 21:30:53'),(7004,'2005-07-27 01:36:05',4416,314,'2005-08-03 23:46:05',1,'2006-02-15 21:30:53'),(7005,'2005-07-27 01:38:36',2438,446,'2005-08-02 05:56:36',2,'2006-02-15 21:30:53'),(7006,'2005-07-27 01:42:20',3522,264,'2005-08-03 03:19:20',1,'2006-02-15 21:30:53'),(7007,'2005-07-27 01:43:39',4186,257,'2005-07-31 21:04:39',1,'2006-02-15 21:30:53'),(7008,'2005-07-27 01:44:03',3659,12,'2005-07-28 21:19:03',2,'2006-02-15 21:30:53'),(7009,'2005-07-27 01:45:44',1585,414,'2005-07-28 05:50:44',1,'2006-02-15 21:30:53'),(7010,'2005-07-27 01:56:01',3016,590,'2005-07-30 04:40:01',1,'2006-02-15 21:30:53'),(7011,'2005-07-27 01:58:34',4082,254,'2005-07-28 06:11:34',1,'2006-02-15 21:30:53'),(7012,'2005-07-27 02:01:03',779,239,'2005-08-05 07:34:03',2,'2006-02-15 21:30:53'),(7013,'2005-07-27 02:03:21',3919,463,'2005-07-31 22:12:21',1,'2006-02-15 21:30:53'),(7014,'2005-07-27 02:14:40',714,524,'2005-08-03 00:32:40',2,'2006-02-15 21:30:53'),(7015,'2005-07-27 02:15:01',376,34,'2005-07-28 07:46:01',2,'2006-02-15 21:30:53'),(7016,'2005-07-27 02:15:16',1425,423,'2005-08-01 23:08:16',2,'2006-02-15 21:30:53'),(7017,'2005-07-27 02:16:03',753,176,'2005-07-31 07:49:03',1,'2006-02-15 21:30:53'),(7018,'2005-07-27 02:20:22',1078,451,'2005-08-02 05:04:22',2,'2006-02-15 21:30:53'),(7019,'2005-07-27 02:20:26',3837,491,'2005-08-02 22:48:26',1,'2006-02-15 21:30:53'),(7020,'2005-07-27 02:24:27',3965,506,'2005-07-29 01:27:27',2,'2006-02-15 21:30:53'),(7021,'2005-07-27 02:26:38',2690,380,'2005-08-05 01:18:38',1,'2006-02-15 21:30:53'),(7022,'2005-07-27 02:31:15',1711,243,'2005-07-29 02:52:15',1,'2006-02-15 21:30:53'),(7023,'2005-07-27 02:32:44',4196,303,'2005-08-03 04:06:44',1,'2006-02-15 21:30:53'),(7024,'2005-07-27 02:36:40',3113,252,'2005-07-28 06:58:40',1,'2006-02-15 21:30:53'),(7025,'2005-07-27 02:40:29',3530,176,'2005-07-29 23:02:29',2,'2006-02-15 21:30:53'),(7026,'2005-07-27 02:48:58',3456,493,'2005-07-29 03:41:58',2,'2006-02-15 21:30:53'),(7027,'2005-07-27 02:50:15',3280,61,'2005-08-04 02:58:15',1,'2006-02-15 21:30:53'),(7028,'2005-07-27 02:54:25',834,179,'2005-08-02 06:16:25',2,'2006-02-15 21:30:53'),(7029,'2005-07-27 02:57:43',2862,389,'2005-07-30 08:24:43',1,'2006-02-15 21:30:53'),(7030,'2005-07-27 03:01:40',1277,550,'2005-07-31 07:01:40',1,'2006-02-15 21:30:53'),(7031,'2005-07-27 03:02:07',1435,530,'2005-08-02 07:14:07',1,'2006-02-15 21:30:53'),(7032,'2005-07-27 03:03:09',3397,269,'2005-07-28 22:57:09',1,'2006-02-15 21:30:53'),(7033,'2005-07-27 03:03:25',2803,352,'2005-07-28 01:57:25',2,'2006-02-15 21:30:53'),(7034,'2005-07-27 03:03:37',1712,281,'2005-07-28 23:18:37',1,'2006-02-15 21:30:53'),(7035,'2005-07-27 03:06:09',2439,90,'2005-08-02 21:59:09',2,'2006-02-15 21:30:53'),(7036,'2005-07-27 03:06:12',2569,70,'2005-07-28 23:26:12',2,'2006-02-15 21:30:53'),(7037,'2005-07-27 03:06:44',3155,171,'2005-08-02 04:51:44',2,'2006-02-15 21:30:53'),(7038,'2005-07-27 03:07:29',1909,518,'2005-07-31 04:55:29',2,'2006-02-15 21:30:53'),(7039,'2005-07-27 03:11:48',1906,99,'2005-08-01 23:55:48',1,'2006-02-15 21:30:53'),(7040,'2005-07-27 03:17:19',470,524,'2005-07-29 07:03:19',2,'2006-02-15 21:30:53'),(7041,'2005-07-27 03:18:32',4212,379,'2005-07-30 06:40:32',2,'2006-02-15 21:30:53'),(7042,'2005-07-27 03:20:18',399,188,'2005-08-01 02:23:18',1,'2006-02-15 21:30:53'),(7043,'2005-07-27 03:24:23',3422,493,'2005-08-05 02:55:23',2,'2006-02-15 21:30:53'),(7044,'2005-07-27 03:27:29',88,147,'2005-08-01 07:00:29',2,'2006-02-15 21:30:53'),(7045,'2005-07-27 03:27:35',1788,64,'2005-08-01 06:31:35',2,'2006-02-15 21:30:53'),(7046,'2005-07-27 03:27:56',3740,349,'2005-07-30 00:54:56',2,'2006-02-15 21:30:53'),(7047,'2005-07-27 03:31:11',2866,236,'2005-08-03 23:40:11',1,'2006-02-15 21:30:53'),(7048,'2005-07-27 03:31:48',3707,581,'2005-08-05 07:30:48',2,'2006-02-15 21:30:53'),(7049,'2005-07-27 03:32:41',3043,332,'2005-08-04 08:32:41',2,'2006-02-15 21:30:53'),(7050,'2005-07-27 03:33:17',1135,55,'2005-08-02 03:12:17',1,'2006-02-15 21:30:53'),(7051,'2005-07-27 03:34:37',1310,184,'2005-07-31 03:48:37',2,'2006-02-15 21:30:53'),(7052,'2005-07-27 03:36:38',3798,75,'2005-08-03 21:51:38',1,'2006-02-15 21:30:53'),(7053,'2005-07-27 03:38:54',149,408,'2005-07-31 01:13:54',1,'2006-02-15 21:30:53'),(7054,'2005-07-27 03:43:28',2661,179,'2005-08-04 09:15:28',1,'2006-02-15 21:30:53'),(7055,'2005-07-27 03:45:42',4305,154,'2005-07-30 05:11:42',1,'2006-02-15 21:30:53'),(7056,'2005-07-27 03:46:27',805,233,'2005-08-05 07:46:27',1,'2006-02-15 21:30:53'),(7057,'2005-07-27 03:50:03',1196,320,'2005-08-04 04:36:03',1,'2006-02-15 21:30:53'),(7058,'2005-07-27 03:50:46',716,90,'2005-08-04 07:40:46',2,'2006-02-15 21:30:53'),(7059,'2005-07-27 03:51:02',129,578,'2005-08-02 22:04:02',1,'2006-02-15 21:30:53'),(7060,'2005-07-27 03:51:04',3912,479,'2005-08-03 07:53:04',1,'2006-02-15 21:30:53'),(7061,'2005-07-27 03:51:10',880,145,'2005-07-31 05:36:10',1,'2006-02-15 21:30:53'),(7062,'2005-07-27 03:52:01',226,469,'2005-08-03 08:26:01',1,'2006-02-15 21:30:53'),(7063,'2005-07-27 03:52:27',2125,58,'2005-08-04 07:53:27',1,'2006-02-15 21:30:53'),(7064,'2005-07-27 03:53:29',4204,320,'2005-08-03 06:32:29',1,'2006-02-15 21:30:53'),(7065,'2005-07-27 03:53:43',3570,536,'2005-07-30 23:41:43',2,'2006-02-15 21:30:53'),(7066,'2005-07-27 03:53:52',1862,185,'2005-08-05 03:32:52',1,'2006-02-15 21:30:53'),(7067,'2005-07-27 03:55:10',870,60,'2005-08-01 02:56:10',1,'2006-02-15 21:30:53'),(7068,'2005-07-27 03:57:50',4465,568,'2005-07-30 04:27:50',1,'2006-02-15 21:30:53'),(7069,'2005-07-27 03:59:35',2073,343,'2005-08-05 03:33:35',1,'2006-02-15 21:30:53'),(7070,'2005-07-27 04:01:08',4182,280,'2005-07-30 08:10:08',2,'2006-02-15 21:30:53'),(7071,'2005-07-27 04:01:15',4361,61,'2005-08-03 05:18:15',2,'2006-02-15 21:30:53'),(7072,'2005-07-27 04:02:33',3899,260,'2005-07-28 09:26:33',2,'2006-02-15 21:30:53'),(7073,'2005-07-27 04:03:26',3859,92,'2005-08-03 05:50:26',1,'2006-02-15 21:30:53'),(7074,'2005-07-27 04:06:24',1390,165,'2005-07-28 02:04:24',1,'2006-02-15 21:30:53'),(7075,'2005-07-27 04:11:40',4414,530,'2005-08-03 08:16:40',2,'2006-02-15 21:30:53'),(7076,'2005-07-27 04:12:14',2821,333,'2005-08-05 00:44:14',1,'2006-02-15 21:30:53'),(7077,'2005-07-27 04:13:02',3186,155,'2005-07-31 23:15:02',1,'2006-02-15 21:30:53'),(7078,'2005-07-27 04:16:37',4518,545,'2005-08-05 02:34:37',1,'2006-02-15 21:30:53'),(7079,'2005-07-27 04:21:58',4356,356,'2005-08-04 08:08:58',1,'2006-02-15 21:30:53'),(7080,'2005-07-27 04:25:25',710,466,'2005-08-04 04:22:25',2,'2006-02-15 21:30:53'),(7081,'2005-07-27 04:25:59',462,420,'2005-08-01 00:14:59',1,'2006-02-15 21:30:53'),(7082,'2005-07-27 04:27:32',2032,64,'2005-07-30 06:06:32',2,'2006-02-15 21:30:53'),(7083,'2005-07-27 04:28:39',2663,575,'2005-07-30 04:35:39',2,'2006-02-15 21:30:53'),(7084,'2005-07-27 04:34:07',785,32,'2005-08-05 00:21:07',2,'2006-02-15 21:30:53'),(7085,'2005-07-27 04:35:44',2603,223,'2005-08-05 07:10:44',2,'2006-02-15 21:30:53'),(7086,'2005-07-27 04:39:46',2938,595,'2005-08-05 00:32:46',2,'2006-02-15 21:30:53'),(7087,'2005-07-27 04:42:08',1159,22,'2005-08-02 00:53:08',1,'2006-02-15 21:30:53'),(7088,'2005-07-27 04:42:28',373,88,'2005-08-04 07:09:28',2,'2006-02-15 21:30:53'),(7089,'2005-07-27 04:43:42',1380,446,'2005-07-30 10:04:42',1,'2006-02-15 21:30:53'),(7090,'2005-07-27 04:43:53',3495,218,'2005-07-29 07:33:53',2,'2006-02-15 21:30:53'),(7091,'2005-07-27 04:44:10',2593,322,'2005-07-31 07:14:10',1,'2006-02-15 21:30:53'),(7092,'2005-07-27 04:46:00',1433,345,'2005-08-03 07:22:00',2,'2006-02-15 21:30:53'),(7093,'2005-07-27 04:47:00',3065,574,'2005-07-31 10:15:00',1,'2006-02-15 21:30:53'),(7094,'2005-07-27 04:47:33',867,373,'2005-07-31 04:07:33',2,'2006-02-15 21:30:53'),(7095,'2005-07-27 04:51:15',1008,551,'2005-08-05 10:25:15',2,'2006-02-15 21:30:53'),(7096,'2005-07-27 04:54:42',2575,3,'2005-08-03 01:42:42',2,'2006-02-15 21:30:53'),(7097,'2005-07-27 04:56:09',258,487,'2005-07-31 05:47:09',1,'2006-02-15 21:30:53'),(7098,'2005-07-27 05:01:08',2555,359,'2005-08-02 07:49:08',2,'2006-02-15 21:30:53'),(7099,'2005-07-27 05:03:44',3136,6,'2005-07-29 00:12:44',2,'2006-02-15 21:30:53'),(7100,'2005-07-27 05:05:01',4224,413,'2005-07-28 23:12:01',2,'2006-02-15 21:30:53'),(7101,'2005-07-27 05:06:34',2006,221,'2005-07-29 06:12:34',1,'2006-02-15 21:30:53'),(7102,'2005-07-27 05:07:21',1081,411,'2005-08-01 09:41:21',2,'2006-02-15 21:30:53'),(7103,'2005-07-27 05:08:59',1697,403,'2005-07-29 03:42:59',2,'2006-02-15 21:30:53'),(7104,'2005-07-27 05:15:25',118,217,'2005-08-01 05:36:25',2,'2006-02-15 21:30:53'),(7105,'2005-07-27 05:15:37',864,15,'2005-07-28 05:49:37',2,'2006-02-15 21:30:53'),(7106,'2005-07-27 05:21:24',1415,201,'2005-08-02 01:58:24',2,'2006-02-15 21:30:53'),(7107,'2005-07-27 05:22:04',1883,104,'2005-08-02 06:38:04',1,'2006-02-15 21:30:53'),(7108,'2005-07-27 05:28:32',2720,355,'2005-07-31 07:52:32',1,'2006-02-15 21:30:53'),(7109,'2005-07-27 05:28:57',1658,406,'2005-08-04 10:41:57',2,'2006-02-15 21:30:53'),(7110,'2005-07-27 05:30:48',3289,157,'2005-07-28 01:43:48',1,'2006-02-15 21:30:53'),(7111,'2005-07-27 05:38:16',1252,473,'2005-07-29 04:28:16',2,'2006-02-15 21:30:53'),(7112,'2005-07-27 05:38:42',4056,101,'2005-08-03 05:35:42',1,'2006-02-15 21:30:53'),(7113,'2005-07-27 05:41:20',1963,534,'2005-07-30 04:50:20',1,'2006-02-15 21:30:53'),(7114,'2005-07-27 05:42:13',3892,121,'2005-07-29 01:59:13',1,'2006-02-15 21:30:53'),(7115,'2005-07-27 05:42:58',3620,359,'2005-08-02 05:35:58',2,'2006-02-15 21:30:53'),(7116,'2005-07-27 05:46:43',1755,209,'2005-08-05 05:54:43',1,'2006-02-15 21:30:53'),(7117,'2005-07-27 05:48:36',2772,326,'2005-08-01 00:33:36',1,'2006-02-15 21:30:53'),(7118,'2005-07-27 05:53:50',582,591,'2005-08-05 04:19:50',2,'2006-02-15 21:30:53'),(7119,'2005-07-27 05:55:32',1732,102,'2005-07-29 03:19:32',1,'2006-02-15 21:30:53'),(7120,'2005-07-27 05:56:39',416,98,'2005-08-04 10:57:39',1,'2006-02-15 21:30:53'),(7121,'2005-07-27 05:58:32',1264,252,'2005-07-29 06:14:32',1,'2006-02-15 21:30:53'),(7122,'2005-07-27 06:03:18',1699,172,'2005-08-04 10:43:18',2,'2006-02-15 21:30:53'),(7123,'2005-07-27 06:08:48',134,232,'2005-08-04 05:26:48',1,'2006-02-15 21:30:53'),(7124,'2005-07-27 06:09:30',3449,34,'2005-08-02 09:31:30',1,'2006-02-15 21:30:53'),(7125,'2005-07-27 06:11:00',801,460,'2005-08-04 09:41:00',2,'2006-02-15 21:30:53'),(7126,'2005-07-27 06:13:13',3240,582,'2005-07-28 08:22:13',2,'2006-02-15 21:30:53'),(7127,'2005-07-27 06:13:48',273,486,'2005-08-01 02:50:48',2,'2006-02-15 21:30:53'),(7128,'2005-07-27 06:14:36',143,529,'2005-08-02 05:18:36',1,'2006-02-15 21:30:53'),(7129,'2005-07-27 06:18:01',1930,221,'2005-07-28 02:38:01',1,'2006-02-15 21:30:53'),(7130,'2005-07-27 06:23:36',420,81,'2005-07-28 10:23:36',1,'2006-02-15 21:30:53'),(7131,'2005-07-27 06:25:06',2832,585,'2005-07-31 09:07:06',1,'2006-02-15 21:30:53'),(7132,'2005-07-27 06:28:34',3201,227,'2005-08-05 06:02:34',2,'2006-02-15 21:30:53'),(7133,'2005-07-27 06:29:23',2995,496,'2005-07-29 03:20:23',2,'2006-02-15 21:30:53'),(7134,'2005-07-27 06:33:06',1058,574,'2005-07-28 06:15:06',1,'2006-02-15 21:30:53'),(7135,'2005-07-27 06:34:32',2959,172,'2005-07-28 03:01:32',1,'2006-02-15 21:30:53'),(7136,'2005-07-27 06:38:25',1929,6,'2005-08-03 05:13:25',1,'2006-02-15 21:30:53'),(7137,'2005-07-27 06:40:41',3957,483,'2005-07-29 09:05:41',2,'2006-02-15 21:30:53'),(7138,'2005-07-27 06:47:13',1418,31,'2005-08-03 01:12:13',2,'2006-02-15 21:30:53'),(7139,'2005-07-27 06:52:21',846,575,'2005-07-30 01:45:21',1,'2006-02-15 21:30:53'),(7140,'2005-07-27 06:54:12',2028,35,'2005-08-03 10:36:12',2,'2006-02-15 21:30:53'),(7141,'2005-07-27 06:55:27',3579,423,'2005-08-01 11:10:27',1,'2006-02-15 21:30:53'),(7142,'2005-07-27 06:55:39',1743,396,'2005-07-28 01:41:39',2,'2006-02-15 21:30:53'),(7143,'2005-07-27 06:56:31',2877,91,'2005-07-31 04:38:31',2,'2006-02-15 21:30:53'),(7144,'2005-07-27 07:00:37',4506,485,'2005-08-01 06:57:37',1,'2006-02-15 21:30:53'),(7145,'2005-07-27 07:01:00',3653,109,'2005-07-31 02:31:00',1,'2006-02-15 21:30:53'),(7146,'2005-07-27 07:02:30',2245,323,'2005-08-05 10:29:30',1,'2006-02-15 21:30:53'),(7147,'2005-07-27 07:02:34',990,192,'2005-08-01 02:16:34',1,'2006-02-15 21:30:53'),(7148,'2005-07-27 07:04:09',1783,354,'2005-08-03 10:20:09',2,'2006-02-15 21:30:53'),(7149,'2005-07-27 07:10:40',3902,242,'2005-08-03 07:37:40',2,'2006-02-15 21:30:53'),(7150,'2005-07-27 07:11:14',457,191,'2005-08-05 06:55:14',2,'2006-02-15 21:30:53'),(7151,'2005-07-27 07:14:31',1259,289,'2005-08-01 01:35:31',2,'2006-02-15 21:30:53'),(7152,'2005-07-27 07:15:01',2338,370,'2005-08-05 04:50:01',1,'2006-02-15 21:30:53'),(7153,'2005-07-27 07:15:38',2657,41,'2005-07-28 09:56:38',1,'2006-02-15 21:30:53'),(7154,'2005-07-27 07:16:17',2019,518,'2005-07-28 04:04:17',2,'2006-02-15 21:30:53'),(7155,'2005-07-27 07:18:46',171,23,'2005-08-04 10:28:46',1,'2006-02-15 21:30:53'),(7156,'2005-07-27 07:19:34',34,154,'2005-07-31 04:31:34',1,'2006-02-15 21:30:53'),(7157,'2005-07-27 07:20:28',1353,423,'2005-08-02 07:19:28',1,'2006-02-15 21:30:53'),(7158,'2005-07-27 07:23:58',2432,38,'2005-08-03 06:00:58',2,'2006-02-15 21:30:53'),(7159,'2005-07-27 07:24:00',1220,158,'2005-08-05 11:13:00',1,'2006-02-15 21:30:53'),(7160,'2005-07-27 07:26:06',3905,71,'2005-07-31 04:54:06',2,'2006-02-15 21:30:53'),(7161,'2005-07-27 07:26:32',378,572,'2005-08-03 01:26:32',2,'2006-02-15 21:30:53'),(7162,'2005-07-27 07:32:45',2251,289,'2005-07-30 03:48:45',1,'2006-02-15 21:30:53'),(7163,'2005-07-27 07:36:11',3666,38,'2005-08-04 06:03:11',2,'2006-02-15 21:30:53'),(7164,'2005-07-27 07:36:34',527,284,'2005-08-04 05:05:34',2,'2006-02-15 21:30:53'),(7165,'2005-07-27 07:36:46',497,243,'2005-07-30 09:22:46',2,'2006-02-15 21:30:53'),(7166,'2005-07-27 07:36:56',1375,562,'2005-08-02 03:46:56',1,'2006-02-15 21:30:53'),(7167,'2005-07-27 07:37:26',238,380,'2005-08-03 06:39:26',1,'2006-02-15 21:30:53'),(7168,'2005-07-27 07:51:11',6,252,'2005-08-01 04:08:11',2,'2006-02-15 21:30:53'),(7169,'2005-07-27 07:51:39',735,559,'2005-08-01 06:42:39',1,'2006-02-15 21:30:53'),(7170,'2005-07-27 07:58:26',370,140,'2005-07-28 02:30:26',1,'2006-02-15 21:30:53'),(7171,'2005-07-27 07:58:35',4381,406,'2005-08-03 07:45:35',1,'2006-02-15 21:30:53'),(7172,'2005-07-27 07:59:16',2405,362,'2005-08-01 04:46:16',1,'2006-02-15 21:30:53'),(7173,'2005-07-27 07:59:24',177,592,'2005-07-28 02:23:24',2,'2006-02-15 21:30:53'),(7174,'2005-07-27 08:00:36',46,570,'2005-08-01 03:11:36',1,'2006-02-15 21:30:53'),(7175,'2005-07-27 08:03:22',568,190,'2005-08-01 02:47:22',2,'2006-02-15 21:30:53'),(7176,'2005-07-27 08:04:28',227,257,'2005-07-29 14:00:28',2,'2006-02-15 21:30:53'),(7177,'2005-07-27 08:07:39',3818,133,'2005-07-30 03:17:39',2,'2006-02-15 21:30:53'),(7178,'2005-07-27 08:09:25',1899,31,'2005-07-29 13:00:25',2,'2006-02-15 21:30:53'),(7179,'2005-07-27 08:10:29',2365,537,'2005-07-28 12:24:29',2,'2006-02-15 21:30:53'),(7180,'2005-07-27 08:14:34',460,215,'2005-07-31 05:24:34',1,'2006-02-15 21:30:53'),(7181,'2005-07-27 08:14:34',2788,130,'2005-07-28 03:09:34',1,'2006-02-15 21:30:53'),(7182,'2005-07-27 08:15:38',3209,97,'2005-08-03 12:48:38',2,'2006-02-15 21:30:53'),(7183,'2005-07-27 08:18:38',3384,302,'2005-08-01 03:24:38',1,'2006-02-15 21:30:53'),(7184,'2005-07-27 08:22:26',2324,457,'2005-08-02 09:34:26',2,'2006-02-15 21:30:53'),(7185,'2005-07-27 08:23:54',2340,121,'2005-07-30 09:50:54',1,'2006-02-15 21:30:53'),(7186,'2005-07-27 08:26:12',4005,584,'2005-07-28 12:21:12',1,'2006-02-15 21:30:53'),(7187,'2005-07-27 08:27:58',2733,169,'2005-08-05 09:05:58',1,'2006-02-15 21:30:53'),(7188,'2005-07-27 08:32:08',2199,259,'2005-07-28 08:02:08',1,'2006-02-15 21:30:53'),(7189,'2005-07-27 08:35:02',4419,151,'2005-07-30 14:00:02',2,'2006-02-15 21:30:53'),(7190,'2005-07-27 08:36:01',1330,372,'2005-07-30 08:32:01',2,'2006-02-15 21:30:53'),(7191,'2005-07-27 08:36:15',4292,495,'2005-08-03 08:54:15',1,'2006-02-15 21:30:53'),(7192,'2005-07-27 08:36:55',4329,532,'2005-07-30 11:58:55',2,'2006-02-15 21:30:53'),(7193,'2005-07-27 08:37:00',1801,237,'2005-07-30 12:51:00',2,'2006-02-15 21:30:53'),(7194,'2005-07-27 08:39:58',254,172,'2005-08-01 03:12:58',1,'2006-02-15 21:30:53'),(7195,'2005-07-27 08:47:01',721,157,'2005-07-30 08:40:01',2,'2006-02-15 21:30:53'),(7196,'2005-07-27 08:49:08',2998,118,'2005-07-29 03:54:08',1,'2006-02-15 21:30:53'),(7197,'2005-07-27 08:49:32',2109,577,'2005-07-31 13:50:32',1,'2006-02-15 21:30:53'),(7198,'2005-07-27 08:50:07',4283,520,'2005-08-04 09:46:07',2,'2006-02-15 21:30:53'),(7199,'2005-07-27 08:53:23',3685,292,'2005-08-03 10:01:23',1,'2006-02-15 21:30:53'),(7200,'2005-07-27 08:57:38',4406,78,'2005-08-02 12:29:38',2,'2006-02-15 21:30:53'),(7201,'2005-07-27 08:57:40',482,598,'2005-08-04 09:55:40',2,'2006-02-15 21:30:53'),(7202,'2005-07-27 09:00:20',109,560,'2005-08-04 03:09:20',1,'2006-02-15 21:30:53'),(7203,'2005-07-27 09:01:23',1685,492,'2005-08-04 14:14:23',1,'2006-02-15 21:30:53'),(7204,'2005-07-27 09:02:31',2512,531,'2005-08-03 08:56:31',2,'2006-02-15 21:30:53'),(7205,'2005-07-27 09:06:13',2828,36,'2005-08-05 07:11:13',1,'2006-02-15 21:30:53'),(7206,'2005-07-27 09:07:05',3752,373,'2005-07-31 03:13:05',2,'2006-02-15 21:30:53'),(7207,'2005-07-27 09:13:26',336,51,'2005-08-01 10:24:26',1,'2006-02-15 21:30:53'),(7208,'2005-07-27 09:16:28',1523,138,'2005-07-28 09:40:28',1,'2006-02-15 21:30:53'),(7209,'2005-07-27 09:16:53',3766,49,'2005-07-30 08:09:53',2,'2006-02-15 21:30:53'),(7210,'2005-07-27 09:19:05',1984,176,'2005-07-28 04:35:05',1,'2006-02-15 21:30:53'),(7211,'2005-07-27 09:20:00',4445,285,'2005-08-02 14:53:00',1,'2006-02-15 21:30:53'),(7212,'2005-07-27 09:21:22',2905,591,'2005-08-01 04:47:22',2,'2006-02-15 21:30:53'),(7213,'2005-07-27 09:22:29',2836,502,'2005-08-03 13:53:29',2,'2006-02-15 21:30:53'),(7214,'2005-07-27 09:23:33',802,309,'2005-08-03 13:14:33',2,'2006-02-15 21:30:53'),(7215,'2005-07-27 09:24:00',2713,473,'2005-08-05 07:37:00',2,'2006-02-15 21:30:53'),(7216,'2005-07-27 09:27:45',1812,292,'2005-08-03 13:08:45',1,'2006-02-15 21:30:53'),(7217,'2005-07-27 09:31:44',2646,20,'2005-07-29 10:48:44',1,'2006-02-15 21:30:53'),(7218,'2005-07-27 09:34:24',2458,530,'2005-08-01 07:00:24',1,'2006-02-15 21:30:53'),(7219,'2005-07-27 09:35:36',4046,512,'2005-07-29 04:44:36',1,'2006-02-15 21:30:53'),(7220,'2005-07-27 09:35:54',3867,79,'2005-08-04 06:00:54',2,'2006-02-15 21:30:53'),(7221,'2005-07-27 09:37:35',3820,579,'2005-07-28 11:25:35',1,'2006-02-15 21:30:53'),(7222,'2005-07-27 09:38:43',2330,206,'2005-07-28 06:25:43',1,'2006-02-15 21:30:53'),(7223,'2005-07-27 09:42:27',2623,325,'2005-08-04 04:02:27',1,'2006-02-15 21:30:53'),(7224,'2005-07-27 09:44:26',2701,106,'2005-08-05 12:46:26',2,'2006-02-15 21:30:53'),(7225,'2005-07-27 09:47:12',632,306,'2005-08-03 13:19:12',2,'2006-02-15 21:30:53'),(7226,'2005-07-27 09:47:53',3507,370,'2005-08-01 08:24:53',1,'2006-02-15 21:30:53'),(7227,'2005-07-27 09:53:43',791,164,'2005-08-05 09:36:43',2,'2006-02-15 21:30:53'),(7228,'2005-07-27 09:55:33',1693,481,'2005-07-29 04:33:33',2,'2006-02-15 21:30:53'),(7229,'2005-07-27 10:00:54',978,182,'2005-07-28 13:58:54',2,'2006-02-15 21:30:53'),(7230,'2005-07-27 10:01:41',1152,245,'2005-08-02 11:00:41',1,'2006-02-15 21:30:53'),(7231,'2005-07-27 10:01:51',1638,86,'2005-08-05 13:38:51',2,'2006-02-15 21:30:53'),(7232,'2005-07-27 10:04:19',1147,306,'2005-07-28 09:43:19',2,'2006-02-15 21:30:53'),(7233,'2005-07-27 10:08:36',213,245,'2005-07-31 16:00:36',1,'2006-02-15 21:30:53'),(7234,'2005-07-27 10:08:45',3873,372,'2005-07-31 13:58:45',1,'2006-02-15 21:30:53'),(7235,'2005-07-27 10:09:30',1261,354,'2005-08-05 11:44:30',2,'2006-02-15 21:30:53'),(7236,'2005-07-27 10:09:39',3004,218,'2005-08-03 16:05:39',1,'2006-02-15 21:30:53'),(7237,'2005-07-27 10:12:36',1904,29,'2005-07-31 08:40:36',2,'2006-02-15 21:30:53'),(7238,'2005-07-27 10:13:41',1197,116,'2005-07-29 11:07:41',1,'2006-02-15 21:30:53'),(7239,'2005-07-27 10:20:27',1786,278,'2005-07-29 10:15:27',1,'2006-02-15 21:30:53'),(7240,'2005-07-27 10:21:15',4565,324,'2005-08-03 05:04:15',1,'2006-02-15 21:30:53'),(7241,'2005-07-27 10:25:49',2433,354,'2005-07-28 05:30:49',2,'2006-02-15 21:30:53'),(7242,'2005-07-27 10:25:51',1966,565,'2005-08-04 16:02:51',2,'2006-02-15 21:30:53'),(7243,'2005-07-27 10:26:11',1287,238,'2005-07-29 11:43:11',2,'2006-02-15 21:30:53'),(7244,'2005-07-27 10:27:33',1329,339,'2005-07-30 13:09:33',1,'2006-02-15 21:30:53'),(7245,'2005-07-27 10:29:06',260,95,'2005-08-05 12:09:06',2,'2006-02-15 21:30:53'),(7246,'2005-07-27 10:30:41',2003,333,'2005-07-30 05:44:41',1,'2006-02-15 21:30:53'),(7247,'2005-07-27 10:32:58',1445,102,'2005-07-29 05:00:58',2,'2006-02-15 21:30:53'),(7248,'2005-07-27 10:37:45',4256,456,'2005-08-01 13:13:45',1,'2006-02-15 21:30:53'),(7249,'2005-07-27 10:39:53',2441,425,'2005-07-28 14:48:53',2,'2006-02-15 21:30:53'),(7250,'2005-07-27 10:44:09',3410,589,'2005-07-28 11:47:09',1,'2006-02-15 21:30:53'),(7251,'2005-07-27 10:44:55',1737,360,'2005-08-01 16:12:55',1,'2006-02-15 21:30:53'),(7252,'2005-07-27 10:45:28',3107,549,'2005-08-04 06:24:28',2,'2006-02-15 21:30:53'),(7253,'2005-07-27 10:46:37',1950,236,'2005-07-28 11:18:37',1,'2006-02-15 21:30:53'),(7254,'2005-07-27 10:48:50',2697,286,'2005-07-28 10:34:50',1,'2006-02-15 21:30:53'),(7255,'2005-07-27 10:49:54',2101,502,'2005-07-31 10:40:54',2,'2006-02-15 21:30:53'),(7256,'2005-07-27 10:58:32',4275,363,'2005-07-29 08:58:32',2,'2006-02-15 21:30:53'),(7257,'2005-07-27 11:04:17',3302,480,'2005-08-04 12:32:17',2,'2006-02-15 21:30:53'),(7258,'2005-07-27 11:05:54',2079,494,'2005-08-02 11:36:54',1,'2006-02-15 21:30:53'),(7259,'2005-07-27 11:06:00',2345,406,'2005-08-02 06:44:00',2,'2006-02-15 21:30:53'),(7260,'2005-07-27 11:09:28',3827,434,'2005-08-03 09:41:28',1,'2006-02-15 21:30:53'),(7261,'2005-07-27 11:15:01',942,172,'2005-07-28 09:42:01',2,'2006-02-15 21:30:53'),(7262,'2005-07-27 11:15:36',4097,522,'2005-07-30 10:49:36',2,'2006-02-15 21:30:53'),(7263,'2005-07-27 11:17:22',725,324,'2005-08-04 10:59:22',1,'2006-02-15 21:30:53'),(7264,'2005-07-27 11:18:58',2391,299,'2005-08-03 07:43:58',2,'2006-02-15 21:30:53'),(7265,'2005-07-27 11:19:01',3465,290,'2005-08-01 09:29:01',1,'2006-02-15 21:30:53'),(7266,'2005-07-27 11:22:17',3379,24,'2005-08-04 05:45:17',1,'2006-02-15 21:30:53'),(7267,'2005-07-27 11:22:55',3661,122,'2005-08-01 08:13:55',1,'2006-02-15 21:30:53'),(7268,'2005-07-27 11:23:09',2740,260,'2005-08-01 12:42:09',2,'2006-02-15 21:30:53'),(7269,'2005-07-27 11:23:47',2089,209,'2005-07-31 13:10:47',1,'2006-02-15 21:30:53'),(7270,'2005-07-27 11:29:02',1888,526,'2005-08-05 08:04:02',1,'2006-02-15 21:30:53'),(7271,'2005-07-27 11:29:11',858,469,'2005-08-05 15:33:11',1,'2006-02-15 21:30:53'),(7272,'2005-07-27 11:30:20',250,364,'2005-07-29 17:16:20',2,'2006-02-15 21:30:53'),(7273,'2005-07-27 11:31:22',2465,1,'2005-07-31 06:50:22',1,'2006-02-15 21:30:53'),(7274,'2005-07-27 11:35:34',4087,180,'2005-08-01 07:10:34',1,'2006-02-15 21:30:53'),(7275,'2005-07-27 11:39:08',775,323,'2005-07-30 13:37:08',2,'2006-02-15 21:30:53'),(7276,'2005-07-27 11:41:57',1665,314,'2005-08-01 10:39:57',1,'2006-02-15 21:30:53'),(7277,'2005-07-27 11:48:37',1544,67,'2005-08-03 07:20:37',1,'2006-02-15 21:30:53'),(7278,'2005-07-27 11:50:34',531,592,'2005-08-01 10:22:34',1,'2006-02-15 21:30:53'),(7279,'2005-07-27 11:50:47',1424,12,'2005-07-30 11:19:47',2,'2006-02-15 21:30:53'),(7280,'2005-07-27 11:50:52',236,342,'2005-07-30 15:53:52',2,'2006-02-15 21:30:53'),(7281,'2005-07-27 11:59:20',1350,491,'2005-08-04 12:48:20',1,'2006-02-15 21:30:53'),(7282,'2005-07-27 12:00:19',4418,276,'2005-08-04 14:48:19',2,'2006-02-15 21:30:53'),(7283,'2005-07-27 12:02:41',3101,508,'2005-08-05 07:25:41',1,'2006-02-15 21:30:53'),(7284,'2005-07-27 12:12:04',2336,52,'2005-07-31 11:17:04',2,'2006-02-15 21:30:53'),(7285,'2005-07-27 12:14:06',2855,498,'2005-08-03 14:57:06',2,'2006-02-15 21:30:53'),(7286,'2005-07-27 12:23:49',3452,498,'2005-08-04 07:57:49',1,'2006-02-15 21:30:53'),(7287,'2005-07-27 12:24:12',926,198,'2005-07-31 15:34:12',1,'2006-02-15 21:30:53'),(7288,'2005-07-27 12:24:59',45,226,'2005-08-02 15:52:59',2,'2006-02-15 21:30:53'),(7289,'2005-07-27 12:26:51',2157,187,'2005-08-02 18:20:51',2,'2006-02-15 21:30:53'),(7290,'2005-07-27 12:28:45',3652,423,'2005-08-01 16:18:45',1,'2006-02-15 21:30:53'),(7291,'2005-07-27 12:30:47',310,263,'2005-08-01 12:45:47',1,'2006-02-15 21:30:53'),(7292,'2005-07-27 12:34:14',795,468,'2005-08-01 18:16:14',2,'2006-02-15 21:30:53'),(7293,'2005-07-27 12:37:28',3333,5,'2005-07-30 15:12:28',2,'2006-02-15 21:30:53'),(7294,'2005-07-27 12:38:14',487,313,'2005-07-30 13:01:14',1,'2006-02-15 21:30:53'),(7295,'2005-07-27 12:38:47',3396,462,'2005-08-05 10:12:47',1,'2006-02-15 21:30:53'),(7296,'2005-07-27 12:39:48',1681,400,'2005-08-04 18:24:48',2,'2006-02-15 21:30:53'),(7297,'2005-07-27 12:39:48',1855,135,'2005-07-29 17:50:48',2,'2006-02-15 21:30:53'),(7298,'2005-07-27 12:45:14',1653,121,'2005-07-30 07:02:14',1,'2006-02-15 21:30:53'),(7299,'2005-07-27 12:49:56',3002,286,'2005-08-03 12:25:56',1,'2006-02-15 21:30:53'),(7300,'2005-07-27 12:50:17',4561,272,'2005-08-04 18:43:17',1,'2006-02-15 21:30:53'),(7301,'2005-07-27 12:50:23',3367,93,'2005-08-01 09:43:23',2,'2006-02-15 21:30:53'),(7302,'2005-07-27 12:52:13',4539,477,'2005-07-29 15:13:13',2,'2006-02-15 21:30:53'),(7303,'2005-07-27 12:54:39',1398,163,'2005-07-31 09:26:39',2,'2006-02-15 21:30:53'),(7304,'2005-07-27 12:56:56',1162,74,'2005-08-05 09:19:56',2,'2006-02-15 21:30:53'),(7305,'2005-07-27 12:57:06',2464,229,'2005-07-30 13:13:06',2,'2006-02-15 21:30:53'),(7306,'2005-07-27 12:57:26',2269,207,'2005-08-03 09:35:26',2,'2006-02-15 21:30:53'),(7307,'2005-07-27 12:59:10',3882,595,'2005-07-29 11:35:10',1,'2006-02-15 21:30:53'),(7308,'2005-07-27 13:00:25',1452,229,'2005-08-03 16:04:25',1,'2006-02-15 21:30:53'),(7309,'2005-07-27 13:00:29',633,317,'2005-07-29 12:15:29',2,'2006-02-15 21:30:53'),(7310,'2005-07-27 13:00:55',3711,103,'2005-07-28 17:54:55',1,'2006-02-15 21:30:53'),(7311,'2005-07-27 13:02:54',2807,582,'2005-08-04 09:52:54',1,'2006-02-15 21:30:53'),(7312,'2005-07-27 13:03:14',228,543,'2005-07-31 07:56:14',2,'2006-02-15 21:30:53'),(7313,'2005-07-27 13:11:57',1884,396,'2005-08-02 07:31:57',1,'2006-02-15 21:30:53'),(7314,'2005-07-27 13:13:32',1376,11,'2005-08-03 09:24:32',2,'2006-02-15 21:30:53'),(7315,'2005-07-27 13:14:56',974,208,'2005-08-03 08:44:56',2,'2006-02-15 21:30:53'),(7316,'2005-07-27 13:19:03',3344,114,'2005-07-28 07:43:03',2,'2006-02-15 21:30:53'),(7317,'2005-07-27 13:19:41',1518,443,'2005-07-29 16:16:41',2,'2006-02-15 21:30:53'),(7318,'2005-07-27 13:25:31',1954,301,'2005-07-31 11:44:31',2,'2006-02-15 21:30:53'),(7319,'2005-07-27 13:31:25',2370,576,'2005-08-04 07:31:25',1,'2006-02-15 21:30:53'),(7320,'2005-07-27 13:33:35',4348,241,'2005-07-31 13:22:35',2,'2006-02-15 21:30:53'),(7321,'2005-07-27 13:33:38',3525,38,'2005-08-03 07:35:38',2,'2006-02-15 21:30:53'),(7322,'2005-07-27 13:37:26',1810,508,'2005-08-03 18:00:26',2,'2006-02-15 21:30:53'),(7323,'2005-07-27 13:39:40',3830,125,'2005-07-29 08:45:40',2,'2006-02-15 21:30:53'),(7324,'2005-07-27 13:42:39',2572,462,'2005-08-04 10:33:39',2,'2006-02-15 21:30:53'),(7325,'2005-07-27 13:46:55',1727,289,'2005-07-28 14:21:55',1,'2006-02-15 21:30:53'),(7326,'2005-07-27 13:50:40',2844,432,'2005-07-30 08:16:40',1,'2006-02-15 21:30:53'),(7327,'2005-07-27 13:53:26',4074,508,'2005-08-04 17:58:26',2,'2006-02-15 21:30:53'),(7328,'2005-07-27 13:55:18',663,26,'2005-08-01 19:52:18',1,'2006-02-15 21:30:53'),(7329,'2005-07-27 13:55:34',906,226,'2005-08-04 15:15:34',1,'2006-02-15 21:30:53'),(7330,'2005-07-27 13:56:46',3705,237,'2005-08-04 07:56:46',1,'2006-02-15 21:30:53'),(7331,'2005-07-27 13:57:50',2090,60,'2005-07-31 08:59:50',1,'2006-02-15 21:30:53'),(7332,'2005-07-27 13:58:57',1761,151,'2005-08-02 12:40:57',1,'2006-02-15 21:30:53'),(7333,'2005-07-27 13:59:11',1331,230,'2005-07-30 16:04:11',1,'2006-02-15 21:30:53'),(7334,'2005-07-27 13:59:58',3006,461,'2005-07-29 11:33:58',1,'2006-02-15 21:30:53'),(7335,'2005-07-27 14:06:50',1219,219,'2005-08-05 18:27:50',2,'2006-02-15 21:30:53'),(7336,'2005-07-27 14:11:45',2706,46,'2005-07-28 11:00:45',2,'2006-02-15 21:30:53'),(7337,'2005-07-27 14:12:04',3314,525,'2005-08-03 14:57:04',2,'2006-02-15 21:30:53'),(7338,'2005-07-27 14:13:34',107,251,'2005-08-03 18:36:34',2,'2006-02-15 21:30:53'),(7339,'2005-07-27 14:17:48',3343,316,'2005-07-31 12:47:48',2,'2006-02-15 21:30:53'),(7340,'2005-07-27 14:18:10',1344,567,'2005-07-30 09:57:10',1,'2006-02-15 21:30:53'),(7341,'2005-07-27 14:23:55',3567,498,'2005-07-28 14:11:55',2,'2006-02-15 21:30:53'),(7342,'2005-07-27 14:25:17',4083,504,'2005-08-04 10:02:17',2,'2006-02-15 21:30:53'),(7343,'2005-07-27 14:27:13',1177,526,'2005-07-30 09:27:13',2,'2006-02-15 21:30:53'),(7344,'2005-07-27 14:29:28',1714,366,'2005-07-31 15:36:28',1,'2006-02-15 21:30:53'),(7345,'2005-07-27 14:29:53',2434,572,'2005-08-03 18:38:53',2,'2006-02-15 21:30:53'),(7346,'2005-07-27 14:30:42',741,2,'2005-08-02 16:48:42',1,'2006-02-15 21:30:53'),(7347,'2005-07-27 14:31:24',3779,225,'2005-07-31 16:19:24',1,'2006-02-15 21:30:53'),(7348,'2005-07-27 14:32:32',3238,43,'2005-07-28 17:05:32',1,'2006-02-15 21:30:53'),(7349,'2005-07-27 14:33:00',861,195,'2005-08-01 15:01:00',2,'2006-02-15 21:30:53'),(7350,'2005-07-27 14:34:14',737,410,'2005-08-02 19:19:14',2,'2006-02-15 21:30:53'),(7351,'2005-07-27 14:37:36',2147,445,'2005-07-30 09:58:36',2,'2006-02-15 21:30:53'),(7352,'2005-07-27 14:38:29',35,429,'2005-07-28 14:24:29',1,'2006-02-15 21:30:53'),(7353,'2005-07-27 14:38:39',1308,357,'2005-07-31 19:50:39',1,'2006-02-15 21:30:53'),(7354,'2005-07-27 14:42:11',2395,598,'2005-08-03 18:19:11',2,'2006-02-15 21:30:53'),(7355,'2005-07-27 14:45:59',3803,115,'2005-08-02 17:23:59',2,'2006-02-15 21:30:53'),(7356,'2005-07-27 14:47:35',309,397,'2005-07-28 18:10:35',2,'2006-02-15 21:30:53'),(7357,'2005-07-27 14:48:31',1917,438,'2005-08-02 18:07:31',2,'2006-02-15 21:30:53'),(7358,'2005-07-27 14:49:44',175,245,'2005-07-28 20:00:44',1,'2006-02-15 21:30:53'),(7359,'2005-07-27 14:51:04',174,183,'2005-07-31 16:03:04',2,'2006-02-15 21:30:53'),(7360,'2005-07-27 14:52:06',1312,467,'2005-08-02 12:24:06',2,'2006-02-15 21:30:53'),(7361,'2005-07-27 14:53:55',4567,463,'2005-07-31 19:48:55',2,'2006-02-15 21:30:53'),(7362,'2005-07-27 14:58:27',1902,419,'2005-08-01 11:51:27',1,'2006-02-15 21:30:53'),(7363,'2005-07-27 14:58:29',1649,407,'2005-08-05 09:02:29',1,'2006-02-15 21:30:53'),(7364,'2005-07-27 14:58:40',3046,592,'2005-08-03 09:01:40',2,'2006-02-15 21:30:53'),(7365,'2005-07-27 15:00:20',3283,450,'2005-07-30 12:58:20',1,'2006-02-15 21:30:53'),(7366,'2005-07-27 15:01:17',461,357,'2005-08-04 20:28:17',1,'2006-02-15 21:30:53'),(7367,'2005-07-27 15:05:45',1738,383,'2005-08-02 13:46:45',1,'2006-02-15 21:30:53'),(7368,'2005-07-27 15:06:05',2265,286,'2005-07-31 14:10:05',2,'2006-02-15 21:30:53'),(7369,'2005-07-27 15:07:58',3889,139,'2005-07-30 09:16:58',2,'2006-02-15 21:30:53'),(7370,'2005-07-27 15:15:53',2022,89,'2005-08-03 19:53:53',2,'2006-02-15 21:30:53'),(7371,'2005-07-27 15:18:42',1807,577,'2005-08-01 09:58:42',1,'2006-02-15 21:30:53'),(7372,'2005-07-27 15:18:42',3202,584,'2005-08-01 15:18:42',2,'2006-02-15 21:30:53'),(7373,'2005-07-27 15:19:33',3074,488,'2005-08-04 10:45:33',1,'2006-02-15 21:30:53'),(7374,'2005-07-27 15:20:57',3184,438,'2005-08-05 13:09:57',2,'2006-02-15 21:30:53'),(7375,'2005-07-27 15:22:33',2970,381,'2005-08-01 20:06:33',1,'2006-02-15 21:30:53'),(7376,'2005-07-27 15:23:02',488,2,'2005-08-04 10:35:02',2,'2006-02-15 21:30:53'),(7377,'2005-07-27 15:31:28',1369,588,'2005-08-02 19:59:28',2,'2006-02-15 21:30:53'),(7378,'2005-07-27 15:31:33',3297,144,'2005-08-03 17:15:33',2,'2006-02-15 21:30:53'),(7379,'2005-07-27 15:36:43',424,415,'2005-07-30 16:37:43',2,'2006-02-15 21:30:53'),(7380,'2005-07-27 15:37:01',988,348,'2005-08-03 19:24:01',1,'2006-02-15 21:30:53'),(7381,'2005-07-27 15:40:26',1595,483,'2005-08-02 17:26:26',2,'2006-02-15 21:30:53'),(7382,'2005-07-27 15:43:15',356,518,'2005-07-28 11:18:15',2,'2006-02-15 21:30:53'),(7383,'2005-07-27 15:46:53',3860,50,'2005-08-03 11:10:53',1,'2006-02-15 21:30:53'),(7384,'2005-07-27 15:49:45',3573,585,'2005-08-04 15:17:45',1,'2006-02-15 21:30:53'),(7385,'2005-07-27 15:49:46',2996,56,'2005-07-28 13:50:46',2,'2006-02-15 21:30:53'),(7386,'2005-07-27 15:52:10',3569,190,'2005-08-04 15:13:10',1,'2006-02-15 21:30:53'),(7387,'2005-07-27 15:54:19',3274,233,'2005-08-03 14:46:19',1,'2006-02-15 21:30:53'),(7388,'2005-07-27 15:54:19',4559,455,'2005-08-01 17:02:19',2,'2006-02-15 21:30:53'),(7389,'2005-07-27 15:56:15',3822,156,'2005-07-30 21:28:15',2,'2006-02-15 21:30:53'),(7390,'2005-07-27 15:59:19',1723,230,'2005-08-04 10:09:19',2,'2006-02-15 21:30:53'),(7391,'2005-07-27 16:00:00',1153,531,'2005-08-04 18:07:00',2,'2006-02-15 21:30:53'),(7392,'2005-07-27 16:01:05',3159,204,'2005-08-01 17:23:05',2,'2006-02-15 21:30:53'),(7393,'2005-07-27 16:02:52',2369,181,'2005-08-02 13:24:52',1,'2006-02-15 21:30:53'),(7394,'2005-07-27 16:03:08',2399,30,'2005-08-04 11:27:08',2,'2006-02-15 21:30:53'),(7395,'2005-07-27 16:03:11',2888,411,'2005-07-31 20:26:11',2,'2006-02-15 21:30:53'),(7396,'2005-07-27 16:03:53',3346,595,'2005-08-05 10:36:53',2,'2006-02-15 21:30:53'),(7397,'2005-07-27 16:05:00',4474,245,'2005-08-01 20:29:00',1,'2006-02-15 21:30:53'),(7398,'2005-07-27 16:07:22',1572,51,'2005-08-05 16:16:22',1,'2006-02-15 21:30:53'),(7399,'2005-07-27 16:16:02',1682,526,'2005-08-03 18:02:02',2,'2006-02-15 21:30:53'),(7400,'2005-07-27 16:16:37',2874,133,'2005-07-31 12:34:37',2,'2006-02-15 21:30:53'),(7401,'2005-07-27 16:17:55',2759,583,'2005-08-04 15:48:55',1,'2006-02-15 21:30:53'),(7402,'2005-07-27 16:19:40',2707,287,'2005-08-05 14:48:40',2,'2006-02-15 21:30:53'),(7403,'2005-07-27 16:22:09',2551,163,'2005-08-01 15:32:09',1,'2006-02-15 21:30:53'),(7404,'2005-07-27 16:24:43',2359,190,'2005-07-29 11:40:43',2,'2006-02-15 21:30:53'),(7405,'2005-07-27 16:25:11',2312,42,'2005-08-01 12:33:11',2,'2006-02-15 21:30:53'),(7406,'2005-07-27 16:25:45',1412,77,'2005-08-05 20:39:45',1,'2006-02-15 21:30:53'),(7407,'2005-07-27 16:29:04',3093,410,'2005-08-01 17:47:04',2,'2006-02-15 21:30:53'),(7408,'2005-07-27 16:31:40',625,371,'2005-07-31 11:56:40',2,'2006-02-15 21:30:53'),(7409,'2005-07-27 16:38:24',2352,585,'2005-07-30 18:06:24',1,'2006-02-15 21:30:53'),(7410,'2005-07-27 16:41:59',1559,337,'2005-07-29 22:11:59',1,'2006-02-15 21:30:53'),(7411,'2005-07-27 16:42:30',515,302,'2005-08-05 17:38:30',1,'2006-02-15 21:30:53'),(7412,'2005-07-27 16:44:34',950,582,'2005-08-04 15:06:34',2,'2006-02-15 21:30:53'),(7413,'2005-07-27 16:45:40',2909,254,'2005-07-31 12:02:40',1,'2006-02-15 21:30:53'),(7414,'2005-07-27 16:46:07',3276,265,'2005-08-02 20:04:07',1,'2006-02-15 21:30:53'),(7415,'2005-07-27 16:50:59',4410,294,'2005-08-02 11:21:59',1,'2006-02-15 21:30:53'),(7416,'2005-07-27 16:55:25',653,350,'2005-07-29 11:27:25',1,'2006-02-15 21:30:53'),(7417,'2005-07-27 16:58:33',2952,214,'2005-07-30 22:17:33',1,'2006-02-15 21:30:53'),(7418,'2005-07-27 16:59:09',3029,332,'2005-07-29 15:08:09',2,'2006-02-15 21:30:53'),(7419,'2005-07-27 17:04:15',3454,352,'2005-08-05 21:54:15',2,'2006-02-15 21:30:53'),(7420,'2005-07-27 17:09:39',3505,547,'2005-07-30 12:30:39',2,'2006-02-15 21:30:53'),(7421,'2005-07-27 17:10:05',3548,70,'2005-08-05 17:55:05',1,'2006-02-15 21:30:53'),(7422,'2005-07-27 17:10:42',3954,286,'2005-08-03 19:32:42',1,'2006-02-15 21:30:53'),(7423,'2005-07-27 17:11:47',666,277,'2005-07-29 12:29:47',2,'2006-02-15 21:30:53'),(7424,'2005-07-27 17:14:19',660,558,'2005-08-01 19:21:19',2,'2006-02-15 21:30:53'),(7425,'2005-07-27 17:18:35',435,263,'2005-08-02 11:18:35',1,'2006-02-15 21:30:53'),(7426,'2005-07-27 17:19:46',4420,239,'2005-07-29 21:41:46',1,'2006-02-15 21:30:53'),(7427,'2005-07-27 17:20:16',2548,442,'2005-08-03 20:38:16',2,'2006-02-15 21:30:53'),(7428,'2005-07-27 17:21:52',243,90,'2005-08-05 17:13:52',2,'2006-02-15 21:30:53'),(7429,'2005-07-27 17:24:50',2160,515,'2005-08-05 23:02:50',1,'2006-02-15 21:30:53'),(7430,'2005-07-27 17:26:14',4205,562,'2005-08-01 13:02:14',2,'2006-02-15 21:30:53'),(7431,'2005-07-27 17:27:27',3931,589,'2005-07-31 18:40:27',1,'2006-02-15 21:30:53'),(7432,'2005-07-27 17:31:40',3169,132,'2005-07-28 17:44:40',2,'2006-02-15 21:30:53'),(7433,'2005-07-27 17:32:20',1748,282,'2005-08-01 18:49:20',1,'2006-02-15 21:30:53'),(7434,'2005-07-27 17:34:40',2927,241,'2005-07-29 15:01:40',1,'2006-02-15 21:30:53'),(7435,'2005-07-27 17:38:44',1574,380,'2005-07-30 16:57:44',1,'2006-02-15 21:30:53'),(7436,'2005-07-27 17:39:12',299,45,'2005-08-01 12:40:12',2,'2006-02-15 21:30:53'),(7437,'2005-07-27 17:39:18',2617,135,'2005-07-28 18:33:18',2,'2006-02-15 21:30:53'),(7438,'2005-07-27 17:40:40',1364,52,'2005-08-05 15:25:40',1,'2006-02-15 21:30:53'),(7439,'2005-07-27 17:42:31',4091,102,'2005-08-05 16:34:31',1,'2006-02-15 21:30:53'),(7440,'2005-07-27 17:43:27',1476,484,'2005-08-03 22:12:27',1,'2006-02-15 21:30:53'),(7441,'2005-07-27 17:46:53',4039,198,'2005-07-31 23:05:53',1,'2006-02-15 21:30:53'),(7442,'2005-07-27 17:47:00',2471,105,'2005-07-28 21:37:00',1,'2006-02-15 21:30:53'),(7443,'2005-07-27 17:47:43',703,380,'2005-07-29 13:15:43',1,'2006-02-15 21:30:53'),(7444,'2005-07-27 17:49:16',120,531,'2005-07-28 15:05:16',1,'2006-02-15 21:30:53'),(7445,'2005-07-27 17:57:15',4115,394,'2005-07-31 20:24:15',1,'2006-02-15 21:30:53'),(7446,'2005-07-27 18:00:24',2337,486,'2005-07-29 13:40:24',1,'2006-02-15 21:30:53'),(7447,'2005-07-27 18:02:08',1795,107,'2005-07-29 21:15:08',1,'2006-02-15 21:30:53'),(7448,'2005-07-27 18:06:30',3584,175,'2005-07-29 15:43:30',1,'2006-02-15 21:30:53'),(7449,'2005-07-27 18:17:41',2084,421,'2005-08-01 18:52:41',1,'2006-02-15 21:30:53'),(7450,'2005-07-27 18:18:35',3496,191,'2005-08-04 15:18:35',1,'2006-02-15 21:30:53'),(7451,'2005-07-27 18:18:41',2382,29,'2005-08-03 13:55:41',2,'2006-02-15 21:30:53'),(7452,'2005-07-27 18:26:39',3482,285,'2005-08-04 17:35:39',2,'2006-02-15 21:30:53'),(7453,'2005-07-27 18:27:13',2992,29,'2005-07-29 23:52:13',1,'2006-02-15 21:30:53'),(7454,'2005-07-27 18:27:26',3248,75,'2005-07-30 23:50:26',1,'2006-02-15 21:30:53'),(7455,'2005-07-27 18:34:41',3815,405,'2005-07-31 17:32:41',1,'2006-02-15 21:30:53'),(7456,'2005-07-27 18:34:53',1959,501,'2005-07-29 17:46:53',2,'2006-02-15 21:30:53'),(7457,'2005-07-27 18:35:17',3635,510,'2005-07-30 12:41:17',2,'2006-02-15 21:30:53'),(7458,'2005-07-27 18:36:17',2964,327,'2005-07-31 22:43:17',1,'2006-02-15 21:30:53'),(7459,'2005-07-27 18:40:20',2053,2,'2005-08-02 21:07:20',2,'2006-02-15 21:30:53'),(7460,'2005-07-27 18:41:35',919,442,'2005-07-29 15:16:35',2,'2006-02-15 21:30:53'),(7461,'2005-07-27 18:45:15',1236,476,'2005-07-29 17:19:15',1,'2006-02-15 21:30:53'),(7462,'2005-07-27 18:47:47',878,114,'2005-07-29 20:46:47',2,'2006-02-15 21:30:53'),(7463,'2005-07-27 18:48:32',3676,284,'2005-07-29 23:54:32',2,'2006-02-15 21:30:53'),(7464,'2005-07-27 18:49:42',845,31,'2005-07-28 20:45:42',2,'2006-02-15 21:30:53'),(7465,'2005-07-27 18:50:30',2357,115,'2005-07-30 20:55:30',1,'2006-02-15 21:30:53'),(7466,'2005-07-27 18:51:17',2791,53,'2005-07-31 16:58:17',1,'2006-02-15 21:30:53'),(7467,'2005-07-27 18:51:54',3869,240,'2005-08-03 23:27:54',2,'2006-02-15 21:30:53'),(7468,'2005-07-27 18:52:27',3166,113,'2005-08-03 19:29:27',2,'2006-02-15 21:30:53'),(7469,'2005-07-27 18:57:40',3723,189,'2005-07-31 00:17:40',1,'2006-02-15 21:30:53'),(7470,'2005-07-27 19:01:03',289,564,'2005-08-05 19:16:03',2,'2006-02-15 21:30:53'),(7471,'2005-07-27 19:02:19',1776,95,'2005-07-30 15:12:19',1,'2006-02-15 21:30:53'),(7472,'2005-07-27 19:04:19',1535,103,'2005-08-03 00:08:19',2,'2006-02-15 21:30:53'),(7473,'2005-07-27 19:05:40',401,341,'2005-08-05 14:47:40',1,'2006-02-15 21:30:53'),(7474,'2005-07-27 19:07:17',2971,110,'2005-07-30 00:37:17',1,'2006-02-15 21:30:53'),(7475,'2005-07-27 19:07:43',1670,255,'2005-08-04 22:12:43',2,'2006-02-15 21:30:53'),(7476,'2005-07-27 19:08:56',2288,64,'2005-07-31 16:36:56',2,'2006-02-15 21:30:53'),(7477,'2005-07-27 19:11:03',2692,355,'2005-08-02 19:25:03',1,'2006-02-15 21:30:53'),(7478,'2005-07-27 19:16:02',3791,521,'2005-08-04 22:30:02',2,'2006-02-15 21:30:53'),(7479,'2005-07-27 19:18:17',218,434,'2005-07-30 18:55:17',1,'2006-02-15 21:30:53'),(7480,'2005-07-27 19:19:53',452,344,'2005-08-02 01:01:53',1,'2006-02-15 21:30:53'),(7481,'2005-07-27 19:20:25',1804,240,'2005-07-29 19:07:25',2,'2006-02-15 21:30:53'),(7482,'2005-07-27 19:24:16',485,348,'2005-08-05 18:49:16',2,'2006-02-15 21:30:53'),(7483,'2005-07-27 19:25:00',3678,106,'2005-07-29 21:19:00',2,'2006-02-15 21:30:53'),(7484,'2005-07-27 19:28:17',2746,211,'2005-07-31 20:05:17',2,'2006-02-15 21:30:53'),(7485,'2005-07-27 19:29:09',631,362,'2005-07-30 16:28:09',1,'2006-02-15 21:30:53'),(7486,'2005-07-27 19:29:24',4362,393,'2005-08-02 20:46:24',2,'2006-02-15 21:30:53'),(7487,'2005-07-27 19:32:45',4451,58,'2005-07-28 15:11:45',1,'2006-02-15 21:30:53'),(7488,'2005-07-27 19:36:15',554,365,'2005-08-05 14:14:15',1,'2006-02-15 21:30:53'),(7489,'2005-07-27 19:39:38',3732,16,'2005-07-30 23:10:38',2,'2006-02-15 21:30:53'),(7490,'2005-07-27 19:48:12',4503,595,'2005-08-04 17:15:12',1,'2006-02-15 21:30:53'),(7491,'2005-07-27 19:53:23',4261,239,'2005-07-28 23:25:23',2,'2006-02-15 21:30:53'),(7492,'2005-07-27 19:54:18',908,155,'2005-07-31 15:36:18',2,'2006-02-15 21:30:53'),(7493,'2005-07-27 19:55:46',2868,177,'2005-08-02 19:46:46',2,'2006-02-15 21:30:53'),(7494,'2005-07-27 19:56:31',2259,60,'2005-07-30 14:28:31',1,'2006-02-15 21:30:53'),(7495,'2005-07-27 20:01:20',3446,426,'2005-07-30 16:40:20',1,'2006-02-15 21:30:53'),(7496,'2005-07-27 20:04:05',2449,257,'2005-08-02 20:12:05',1,'2006-02-15 21:30:53'),(7497,'2005-07-27 20:05:27',286,387,'2005-07-30 22:47:27',1,'2006-02-15 21:30:53'),(7498,'2005-07-27 20:09:31',1144,455,'2005-07-29 23:38:31',1,'2006-02-15 21:30:53'),(7499,'2005-07-27 20:10:28',3503,157,'2005-07-30 16:24:28',1,'2006-02-15 21:30:53'),(7500,'2005-07-27 20:16:03',609,160,'2005-07-29 18:50:03',1,'2006-02-15 21:30:53'),(7501,'2005-07-27 20:16:59',1464,587,'2005-08-04 00:11:59',2,'2006-02-15 21:30:53'),(7502,'2005-07-27 20:19:08',3229,303,'2005-07-28 18:32:08',2,'2006-02-15 21:30:53'),(7503,'2005-07-27 20:23:12',579,3,'2005-08-05 18:46:12',2,'2006-02-15 21:30:53'),(7504,'2005-07-27 20:24:31',3354,283,'2005-07-30 21:25:31',2,'2006-02-15 21:30:53'),(7505,'2005-07-27 20:28:03',1342,209,'2005-08-03 17:04:03',1,'2006-02-15 21:30:53'),(7506,'2005-07-27 20:28:34',2091,527,'2005-08-05 18:14:34',1,'2006-02-15 21:30:53'),(7507,'2005-07-27 20:31:48',3618,512,'2005-08-02 17:27:48',1,'2006-02-15 21:30:53'),(7508,'2005-07-27 20:33:08',3401,465,'2005-08-01 01:29:08',1,'2006-02-15 21:30:53'),(7509,'2005-07-27 20:37:19',4134,228,'2005-08-04 19:35:19',2,'2006-02-15 21:30:53'),(7510,'2005-07-27 20:37:57',1617,257,'2005-08-01 17:14:57',2,'2006-02-15 21:30:53'),(7511,'2005-07-27 20:38:40',4044,591,'2005-08-04 22:36:40',2,'2006-02-15 21:30:53'),(7512,'2005-07-27 20:40:40',1343,352,'2005-08-05 01:44:40',1,'2006-02-15 21:30:53'),(7513,'2005-07-27 20:51:04',939,411,'2005-08-03 20:15:04',2,'2006-02-15 21:30:53'),(7514,'2005-07-27 20:51:49',400,44,'2005-07-29 18:21:49',2,'2006-02-15 21:30:53'),(7515,'2005-07-27 20:52:37',1211,390,'2005-08-02 20:17:37',2,'2006-02-15 21:30:53'),(7516,'2005-07-27 20:55:28',2178,134,'2005-07-30 00:50:28',1,'2006-02-15 21:30:53'),(7517,'2005-07-27 20:57:07',3177,41,'2005-08-04 15:08:07',1,'2006-02-15 21:30:53'),(7518,'2005-07-27 21:01:16',2676,257,'2005-08-03 15:26:16',1,'2006-02-15 21:30:53'),(7519,'2005-07-27 21:01:41',4009,124,'2005-08-05 19:15:41',1,'2006-02-15 21:30:53'),(7520,'2005-07-27 21:02:02',3875,191,'2005-07-28 18:18:02',1,'2006-02-15 21:30:53'),(7521,'2005-07-27 21:04:42',3144,176,'2005-08-03 16:06:42',1,'2006-02-15 21:30:53'),(7522,'2005-07-27 21:11:03',2038,478,'2005-08-02 16:40:03',1,'2006-02-15 21:30:53'),(7523,'2005-07-27 21:11:23',4153,410,'2005-07-28 16:37:23',1,'2006-02-15 21:30:53'),(7524,'2005-07-27 21:11:44',4295,225,'2005-08-03 02:17:44',1,'2006-02-15 21:30:53'),(7525,'2005-07-27 21:13:28',4084,281,'2005-08-04 19:44:28',2,'2006-02-15 21:30:53'),(7526,'2005-07-27 21:13:47',696,44,'2005-08-05 15:23:47',2,'2006-02-15 21:30:53'),(7527,'2005-07-27 21:14:28',2124,426,'2005-08-05 21:08:28',1,'2006-02-15 21:30:53'),(7528,'2005-07-27 21:15:25',1218,213,'2005-08-03 19:12:25',1,'2006-02-15 21:30:53'),(7529,'2005-07-27 21:18:08',3644,145,'2005-08-06 00:59:08',1,'2006-02-15 21:30:53'),(7530,'2005-07-27 21:18:58',3810,98,'2005-07-31 01:51:58',2,'2006-02-15 21:30:53'),(7531,'2005-07-27 21:19:34',2393,221,'2005-08-06 01:07:34',2,'2006-02-15 21:30:53'),(7532,'2005-07-27 21:20:52',677,34,'2005-07-30 21:38:52',1,'2006-02-15 21:30:53'),(7533,'2005-07-27 21:24:33',1791,594,'2005-08-05 16:33:33',2,'2006-02-15 21:30:53'),(7534,'2005-07-27 21:26:17',2276,282,'2005-08-05 00:23:17',2,'2006-02-15 21:30:53'),(7535,'2005-07-27 21:32:39',772,123,'2005-08-05 23:42:39',1,'2006-02-15 21:30:53'),(7536,'2005-07-27 21:34:09',3417,307,'2005-08-02 03:26:09',1,'2006-02-15 21:30:53'),(7537,'2005-07-27 21:36:09',4456,269,'2005-08-01 01:51:09',1,'2006-02-15 21:30:53'),(7538,'2005-07-27 21:38:04',2486,361,'2005-08-02 03:14:04',1,'2006-02-15 21:30:53'),(7539,'2005-07-27 21:39:42',1849,423,'2005-08-06 00:12:42',1,'2006-02-15 21:30:53'),(7540,'2005-07-27 21:39:55',2198,207,'2005-08-04 18:10:55',2,'2006-02-15 21:30:53'),(7541,'2005-07-27 21:40:05',4100,206,'2005-07-29 16:13:05',1,'2006-02-15 21:30:53'),(7542,'2005-07-27 21:43:04',1912,110,'2005-07-30 00:02:04',1,'2006-02-15 21:30:53'),(7543,'2005-07-27 21:44:28',1289,526,'2005-08-04 21:42:28',2,'2006-02-15 21:30:53'),(7544,'2005-07-27 21:47:37',766,249,'2005-08-05 02:29:37',2,'2006-02-15 21:30:53'),(7545,'2005-07-27 21:48:03',2541,292,'2005-08-01 22:23:03',2,'2006-02-15 21:30:53'),(7546,'2005-07-27 21:50:09',3683,494,'2005-08-05 03:07:09',2,'2006-02-15 21:30:53'),(7547,'2005-07-27 21:51:48',1733,547,'2005-08-06 01:05:48',2,'2006-02-15 21:30:53'),(7548,'2005-07-27 21:53:18',2194,484,'2005-08-02 17:50:18',1,'2006-02-15 21:30:53'),(7549,'2005-07-27 21:53:21',1765,591,'2005-08-05 18:53:21',1,'2006-02-15 21:30:53'),(7550,'2005-07-27 21:55:07',4488,71,'2005-07-28 23:34:07',2,'2006-02-15 21:30:53'),(7551,'2005-07-27 21:59:15',2635,304,'2005-07-31 19:54:15',2,'2006-02-15 21:30:53'),(7552,'2005-07-27 22:03:41',2166,16,'2005-07-28 22:24:41',1,'2006-02-15 21:30:53'),(7553,'2005-07-27 22:11:36',1643,275,'2005-08-03 17:52:36',1,'2006-02-15 21:30:53'),(7554,'2005-07-27 22:12:41',1805,135,'2005-08-04 01:34:41',2,'2006-02-15 21:30:53'),(7555,'2005-07-27 22:17:05',3421,533,'2005-08-02 02:50:05',2,'2006-02-15 21:30:53'),(7556,'2005-07-27 22:17:17',794,188,'2005-07-28 19:17:17',2,'2006-02-15 21:30:53'),(7557,'2005-07-27 22:18:19',3152,131,'2005-07-29 00:24:19',1,'2006-02-15 21:30:53'),(7558,'2005-07-27 22:19:08',550,80,'2005-07-30 21:31:08',1,'2006-02-15 21:30:53'),(7559,'2005-07-27 22:20:03',661,149,'2005-08-06 00:26:03',2,'2006-02-15 21:30:53'),(7560,'2005-07-27 22:20:17',3574,562,'2005-08-02 23:00:17',2,'2006-02-15 21:30:53'),(7561,'2005-07-27 22:21:05',3433,291,'2005-08-04 01:02:05',1,'2006-02-15 21:30:53'),(7562,'2005-07-27 22:25:15',4417,366,'2005-08-01 01:21:15',2,'2006-02-15 21:30:53'),(7563,'2005-07-27 22:25:36',2709,453,'2005-08-01 03:59:36',2,'2006-02-15 21:30:53'),(7564,'2005-07-27 22:31:17',2887,291,'2005-08-01 01:05:17',2,'2006-02-15 21:30:53'),(7565,'2005-07-27 22:33:59',1028,114,'2005-07-30 03:03:59',2,'2006-02-15 21:30:53'),(7566,'2005-07-27 22:34:45',1802,144,'2005-08-01 22:20:45',1,'2006-02-15 21:30:53'),(7567,'2005-07-27 22:38:05',1066,504,'2005-07-30 17:20:05',1,'2006-02-15 21:30:53'),(7568,'2005-07-27 22:38:53',1578,296,'2005-07-29 00:51:53',1,'2006-02-15 21:30:53'),(7569,'2005-07-27 22:38:53',2315,528,'2005-08-05 19:03:53',2,'2006-02-15 21:30:53'),(7570,'2005-07-27 22:40:06',3189,110,'2005-07-28 23:14:06',1,'2006-02-15 21:30:53'),(7571,'2005-07-27 22:43:42',3850,368,'2005-07-30 22:17:42',1,'2006-02-15 21:30:53'),(7572,'2005-07-27 22:44:29',3068,532,'2005-08-01 03:04:29',1,'2006-02-15 21:30:53'),(7573,'2005-07-27 22:46:20',314,467,'2005-08-04 01:55:20',1,'2006-02-15 21:30:53'),(7574,'2005-07-27 22:53:00',298,200,'2005-07-29 18:39:00',2,'2006-02-15 21:30:53'),(7575,'2005-07-27 22:53:52',702,582,'2005-07-29 02:02:52',1,'2006-02-15 21:30:53'),(7576,'2005-07-27 22:54:35',3374,446,'2005-08-03 03:53:35',2,'2006-02-15 21:30:53'),(7577,'2005-07-27 22:56:07',2723,332,'2005-08-05 21:23:07',2,'2006-02-15 21:30:53'),(7578,'2005-07-27 22:58:17',4210,332,'2005-07-29 23:14:17',1,'2006-02-15 21:30:53'),(7579,'2005-07-27 23:06:41',501,352,'2005-07-31 20:08:41',2,'2006-02-15 21:30:53'),(7580,'2005-07-27 23:07:40',338,28,'2005-08-05 02:17:40',1,'2006-02-15 21:30:53'),(7581,'2005-07-27 23:14:35',2051,166,'2005-07-29 21:30:35',1,'2006-02-15 21:30:53'),(7582,'2005-07-27 23:15:14',3941,128,'2005-07-29 03:18:14',2,'2006-02-15 21:30:53'),(7583,'2005-07-27 23:15:22',2890,198,'2005-08-04 04:39:22',2,'2006-02-15 21:30:53'),(7584,'2005-07-27 23:15:46',4390,338,'2005-08-03 02:18:46',2,'2006-02-15 21:30:53'),(7585,'2005-07-27 23:18:22',467,440,'2005-07-30 23:08:22',1,'2006-02-15 21:30:53'),(7586,'2005-07-27 23:19:29',15,316,'2005-07-29 23:04:29',1,'2006-02-15 21:30:53'),(7587,'2005-07-27 23:23:03',655,113,'2005-08-01 17:34:03',1,'2006-02-15 21:30:53'),(7588,'2005-07-27 23:23:31',4033,360,'2005-08-04 02:54:31',1,'2006-02-15 21:30:53'),(7589,'2005-07-27 23:23:36',1569,32,'2005-08-04 00:16:36',1,'2006-02-15 21:30:53'),(7590,'2005-07-27 23:24:24',2152,73,'2005-07-28 19:53:24',2,'2006-02-15 21:30:53'),(7591,'2005-07-27 23:25:54',651,525,'2005-08-02 22:54:54',1,'2006-02-15 21:30:53'),(7592,'2005-07-27 23:26:04',4105,316,'2005-07-29 23:48:04',2,'2006-02-15 21:30:53'),(7593,'2005-07-27 23:28:47',1158,436,'2005-08-02 19:51:47',1,'2006-02-15 21:30:53'),(7594,'2005-07-27 23:30:41',3230,424,'2005-08-02 04:29:41',1,'2006-02-15 21:30:53'),(7595,'2005-07-27 23:32:23',4313,390,'2005-08-03 05:28:23',1,'2006-02-15 21:30:53'),(7596,'2005-07-27 23:33:57',2097,275,'2005-08-01 20:46:57',2,'2006-02-15 21:30:53'),(7597,'2005-07-27 23:35:49',2856,169,'2005-07-30 21:38:49',1,'2006-02-15 21:30:53'),(7598,'2005-07-27 23:36:01',4545,438,'2005-07-29 23:35:01',2,'2006-02-15 21:30:53'),(7599,'2005-07-27 23:38:46',3272,87,'2005-07-28 22:52:46',1,'2006-02-15 21:30:53'),(7600,'2005-07-27 23:41:18',3492,107,'2005-08-06 04:40:18',1,'2006-02-15 21:30:53'),(7601,'2005-07-27 23:48:15',903,228,'2005-07-29 02:45:15',1,'2006-02-15 21:30:53'),(7602,'2005-07-27 23:48:35',2516,366,'2005-08-04 17:58:35',1,'2006-02-15 21:30:53'),(7603,'2005-07-27 23:54:44',124,497,'2005-07-29 01:24:44',1,'2006-02-15 21:30:53'),(7604,'2005-07-27 23:54:52',3720,406,'2005-08-05 03:04:52',2,'2006-02-15 21:30:53'),(7605,'2005-07-27 23:57:01',1391,576,'2005-08-03 04:11:01',1,'2006-02-15 21:30:53'),(7606,'2005-07-28 00:02:15',637,201,'2005-07-29 03:14:15',2,'2006-02-15 21:30:53'),(7607,'2005-07-28 00:05:53',3914,293,'2005-07-31 04:13:53',1,'2006-02-15 21:30:53'),(7608,'2005-07-28 00:08:36',1256,167,'2005-07-28 18:13:36',1,'2006-02-15 21:30:53'),(7609,'2005-07-28 00:11:00',3655,179,'2005-07-31 03:04:00',1,'2006-02-15 21:30:53'),(7610,'2005-07-28 00:11:35',1279,450,'2005-07-31 00:33:35',1,'2006-02-15 21:30:53'),(7611,'2005-07-28 00:11:47',3347,467,'2005-07-28 18:35:47',1,'2006-02-15 21:30:53'),(7612,'2005-07-28 00:11:55',1411,563,'2005-07-30 00:47:55',1,'2006-02-15 21:30:53'),(7613,'2005-07-28 00:13:58',4253,202,'2005-08-06 05:36:58',2,'2006-02-15 21:30:53'),(7614,'2005-07-28 00:14:38',3475,440,'2005-07-29 18:18:38',1,'2006-02-15 21:30:53'),(7615,'2005-07-28 00:15:24',3884,373,'2005-07-31 02:00:24',1,'2006-02-15 21:30:53'),(7616,'2005-07-28 00:15:26',3790,9,'2005-07-30 21:52:26',1,'2006-02-15 21:30:53'),(7617,'2005-07-28 00:18:40',2904,340,'2005-08-01 01:17:40',1,'2006-02-15 21:30:53'),(7618,'2005-07-28 00:24:14',774,271,'2005-08-01 04:35:14',1,'2006-02-15 21:30:53'),(7619,'2005-07-28 00:25:41',1057,419,'2005-07-30 04:35:41',2,'2006-02-15 21:30:53'),(7620,'2005-07-28 00:27:17',931,580,'2005-07-31 02:04:17',1,'2006-02-15 21:30:53'),(7621,'2005-07-28 00:34:06',1833,88,'2005-08-06 00:13:06',1,'2006-02-15 21:30:53'),(7622,'2005-07-28 00:37:34',4014,198,'2005-07-31 23:27:34',2,'2006-02-15 21:30:53'),(7623,'2005-07-28 00:37:41',1146,459,'2005-08-04 19:38:41',2,'2006-02-15 21:30:53'),(7624,'2005-07-28 00:37:44',2756,415,'2005-07-30 21:26:44',1,'2006-02-15 21:30:53'),(7625,'2005-07-28 00:47:56',3129,382,'2005-08-02 23:34:56',1,'2006-02-15 21:30:53'),(7626,'2005-07-28 00:49:01',4200,450,'2005-07-31 00:43:01',1,'2006-02-15 21:30:53'),(7627,'2005-07-28 00:56:47',782,52,'2005-08-02 04:16:47',1,'2006-02-15 21:30:53'),(7628,'2005-07-28 00:58:04',1240,516,'2005-08-03 19:16:04',1,'2006-02-15 21:30:53'),(7629,'2005-07-28 01:00:09',2453,229,'2005-07-30 06:49:09',1,'2006-02-15 21:30:53'),(7630,'2005-07-28 01:01:03',2798,351,'2005-07-31 01:08:03',2,'2006-02-15 21:30:53'),(7631,'2005-07-28 01:01:15',2437,132,'2005-08-01 06:16:15',2,'2006-02-15 21:30:53'),(7632,'2005-07-28 01:02:40',3233,181,'2005-07-30 05:31:40',2,'2006-02-15 21:30:53'),(7633,'2005-07-28 01:03:41',4171,402,'2005-08-01 23:54:41',2,'2006-02-15 21:30:53'),(7634,'2005-07-28 01:07:01',4487,365,'2005-07-31 05:00:01',1,'2006-02-15 21:30:53'),(7635,'2005-07-28 01:08:11',55,413,'2005-08-01 03:32:11',2,'2006-02-15 21:30:53'),(7636,'2005-07-28 01:08:36',202,51,'2005-08-03 21:36:36',1,'2006-02-15 21:30:53'),(7637,'2005-07-28 01:12:25',87,91,'2005-08-02 03:48:25',1,'2006-02-15 21:30:53'),(7638,'2005-07-28 01:13:26',1890,172,'2005-07-28 20:34:26',1,'2006-02-15 21:30:53'),(7639,'2005-07-28 01:14:36',767,459,'2005-07-29 00:19:36',1,'2006-02-15 21:30:53'),(7640,'2005-07-28 01:14:49',3014,229,'2005-08-03 21:50:49',1,'2006-02-15 21:30:53'),(7641,'2005-07-28 01:15:45',1868,475,'2005-08-04 23:50:45',1,'2006-02-15 21:30:53'),(7642,'2005-07-28 01:16:51',3995,523,'2005-08-02 00:45:51',2,'2006-02-15 21:30:53'),(7643,'2005-07-28 01:19:44',4369,407,'2005-08-04 21:16:44',1,'2006-02-15 21:30:53'),(7644,'2005-07-28 01:27:33',882,173,'2005-07-31 22:58:33',2,'2006-02-15 21:30:53'),(7645,'2005-07-28 01:27:42',830,381,'2005-08-03 07:16:42',2,'2006-02-15 21:30:53'),(7646,'2005-07-28 01:31:45',1615,255,'2005-07-31 07:16:45',1,'2006-02-15 21:30:53'),(7647,'2005-07-28 01:35:17',3079,36,'2005-08-01 00:14:17',1,'2006-02-15 21:30:53'),(7648,'2005-07-28 01:35:33',797,310,'2005-08-04 06:21:33',2,'2006-02-15 21:30:53'),(7649,'2005-07-28 01:37:26',2704,318,'2005-07-28 21:18:26',1,'2006-02-15 21:30:53'),(7650,'2005-07-28 01:47:20',701,290,'2005-08-05 06:00:20',2,'2006-02-15 21:30:53'),(7651,'2005-07-28 01:48:32',2753,401,'2005-08-03 03:10:32',2,'2006-02-15 21:30:53'),(7652,'2005-07-28 01:50:29',92,5,'2005-07-30 22:23:29',2,'2006-02-15 21:30:53'),(7653,'2005-07-28 01:58:30',814,232,'2005-07-28 23:32:30',2,'2006-02-15 21:30:53'),(7654,'2005-07-28 02:00:14',1009,360,'2005-07-31 20:50:14',2,'2006-02-15 21:30:53'),(7655,'2005-07-28 02:01:11',2665,513,'2005-07-30 23:12:11',2,'2006-02-15 21:30:53'),(7656,'2005-07-28 02:07:19',178,148,'2005-07-31 04:05:19',1,'2006-02-15 21:30:53'),(7657,'2005-07-28 02:09:00',2319,518,'2005-08-04 21:44:00',1,'2006-02-15 21:30:53'),(7658,'2005-07-28 02:09:12',1798,272,'2005-07-30 00:54:12',2,'2006-02-15 21:30:53'),(7659,'2005-07-28 02:09:45',1622,584,'2005-08-02 05:34:45',2,'2006-02-15 21:30:53'),(7660,'2005-07-28 02:10:10',4385,4,'2005-07-30 04:29:10',2,'2006-02-15 21:30:53'),(7661,'2005-07-28 02:10:27',3060,256,'2005-08-05 03:45:27',2,'2006-02-15 21:30:53'),(7662,'2005-07-28 02:16:08',1017,534,'2005-08-03 21:51:08',1,'2006-02-15 21:30:53'),(7663,'2005-07-28 02:19:48',832,470,'2005-07-30 21:43:48',2,'2006-02-15 21:30:53'),(7664,'2005-07-28 02:24:23',1989,461,'2005-07-29 23:01:23',1,'2006-02-15 21:30:53'),(7665,'2005-07-28 02:28:30',1455,590,'2005-07-31 20:42:30',1,'2006-02-15 21:30:53'),(7666,'2005-07-28 02:35:12',688,196,'2005-08-05 05:43:12',2,'2006-02-15 21:30:53'),(7667,'2005-07-28 02:37:22',2415,443,'2005-08-05 21:37:22',1,'2006-02-15 21:30:53'),(7668,'2005-07-28 02:41:31',3880,508,'2005-08-02 06:08:31',1,'2006-02-15 21:30:53'),(7669,'2005-07-28 02:44:07',2624,483,'2005-07-29 00:54:07',1,'2006-02-15 21:30:53'),(7670,'2005-07-28 02:44:25',1356,252,'2005-07-29 21:55:25',2,'2006-02-15 21:30:53'),(7671,'2005-07-28 02:48:31',3464,442,'2005-07-30 23:04:31',1,'2006-02-15 21:30:53'),(7672,'2005-07-28 02:49:41',573,542,'2005-08-04 02:38:41',1,'2006-02-15 21:30:53'),(7673,'2005-07-28 02:53:53',2368,409,'2005-08-06 00:07:53',1,'2006-02-15 21:30:53'),(7674,'2005-07-28 02:54:30',682,177,'2005-08-05 23:09:30',1,'2006-02-15 21:30:53'),(7675,'2005-07-28 02:55:20',153,189,'2005-07-31 05:27:20',1,'2006-02-15 21:30:53'),(7676,'2005-07-28 02:55:27',1110,508,'2005-08-01 03:50:27',2,'2006-02-15 21:30:53'),(7677,'2005-07-28 02:56:37',4464,566,'2005-07-31 02:21:37',1,'2006-02-15 21:30:53'),(7678,'2005-07-28 02:58:16',3398,510,'2005-08-06 04:22:16',1,'2006-02-15 21:30:53'),(7679,'2005-07-28 02:58:39',1063,444,'2005-08-02 04:58:39',1,'2006-02-15 21:30:53'),(7680,'2005-07-28 02:59:08',1784,559,'2005-08-03 03:37:08',2,'2006-02-15 21:30:53'),(7681,'2005-07-28 03:07:09',1176,432,'2005-07-29 08:30:09',2,'2006-02-15 21:30:53'),(7682,'2005-07-28 03:07:29',3296,400,'2005-08-04 08:48:29',2,'2006-02-15 21:30:53'),(7683,'2005-07-28 03:11:29',1760,73,'2005-08-04 00:14:29',1,'2006-02-15 21:30:53'),(7684,'2005-07-28 03:11:54',3365,40,'2005-07-31 04:40:54',2,'2006-02-15 21:30:53'),(7685,'2005-07-28 03:13:00',2213,468,'2005-08-01 00:29:00',2,'2006-02-15 21:30:53'),(7686,'2005-07-28 03:19:23',2144,184,'2005-08-04 05:17:23',2,'2006-02-15 21:30:53'),(7687,'2005-07-28 03:20:26',689,325,'2005-08-02 05:48:26',2,'2006-02-15 21:30:53'),(7688,'2005-07-28 03:20:47',1179,491,'2005-08-06 06:07:47',2,'2006-02-15 21:30:53'),(7689,'2005-07-28 03:21:24',1803,253,'2005-07-31 08:01:24',2,'2006-02-15 21:30:53'),(7690,'2005-07-28 03:26:21',1076,150,'2005-07-29 00:08:21',1,'2006-02-15 21:30:53'),(7691,'2005-07-28 03:30:09',1579,112,'2005-07-29 21:31:09',1,'2006-02-15 21:30:53'),(7692,'2005-07-28 03:30:21',267,392,'2005-07-30 22:25:21',1,'2006-02-15 21:30:53'),(7693,'2005-07-28 03:31:22',2479,148,'2005-07-31 06:42:22',2,'2006-02-15 21:30:53'),(7694,'2005-07-28 03:39:25',2892,538,'2005-07-31 05:47:25',1,'2006-02-15 21:30:53'),(7695,'2005-07-28 03:41:13',2742,323,'2005-08-06 05:06:13',2,'2006-02-15 21:30:53'),(7696,'2005-07-28 03:41:35',3463,56,'2005-08-06 05:48:35',2,'2006-02-15 21:30:53'),(7697,'2005-07-28 03:43:45',3966,377,'2005-08-03 07:55:45',2,'2006-02-15 21:30:53'),(7698,'2005-07-28 03:44:14',3650,561,'2005-08-04 03:44:14',2,'2006-02-15 21:30:53'),(7699,'2005-07-28 03:52:21',4332,53,'2005-08-01 05:00:21',2,'2006-02-15 21:30:53'),(7700,'2005-07-28 03:54:14',3546,124,'2005-08-05 06:20:14',2,'2006-02-15 21:30:53'),(7701,'2005-07-28 03:54:28',1604,306,'2005-08-01 08:39:28',2,'2006-02-15 21:30:53'),(7702,'2005-07-28 03:56:05',253,349,'2005-07-31 03:29:05',1,'2006-02-15 21:30:53'),(7703,'2005-07-28 03:59:21',2150,3,'2005-08-05 08:52:21',1,'2006-02-15 21:30:53'),(7704,'2005-07-28 04:02:13',2342,265,'2005-08-04 00:51:13',1,'2006-02-15 21:30:53'),(7705,'2005-07-28 04:02:58',1072,22,'2005-08-05 01:19:58',2,'2006-02-15 21:30:53'),(7706,'2005-07-28 04:03:17',994,263,'2005-07-29 22:16:17',2,'2006-02-15 21:30:53'),(7707,'2005-07-28 04:07:47',2563,232,'2005-07-29 02:02:47',1,'2006-02-15 21:30:53'),(7708,'2005-07-28 04:19:15',398,363,'2005-08-04 04:41:15',1,'2006-02-15 21:30:53'),(7709,'2005-07-28 04:22:14',3800,81,'2005-07-31 09:18:14',2,'2006-02-15 21:30:53'),(7710,'2005-07-28 04:24:07',3716,77,'2005-08-03 22:49:07',2,'2006-02-15 21:30:53'),(7711,'2005-07-28 04:26:42',2695,426,'2005-07-29 07:30:42',2,'2006-02-15 21:30:53'),(7712,'2005-07-28 04:29:53',3256,361,'2005-08-02 00:57:53',2,'2006-02-15 21:30:53'),(7713,'2005-07-28 04:32:14',2018,572,'2005-08-03 04:30:14',2,'2006-02-15 21:30:53'),(7714,'2005-07-28 04:32:30',940,70,'2005-08-02 07:10:30',2,'2006-02-15 21:30:53'),(7715,'2005-07-28 04:32:38',3210,512,'2005-08-05 00:37:38',2,'2006-02-15 21:30:53'),(7716,'2005-07-28 04:33:15',1493,284,'2005-08-04 00:08:15',2,'2006-02-15 21:30:53'),(7717,'2005-07-28 04:33:54',730,459,'2005-07-30 02:46:54',2,'2006-02-15 21:30:53'),(7718,'2005-07-28 04:37:59',3587,4,'2005-07-29 09:20:59',2,'2006-02-15 21:30:53'),(7719,'2005-07-28 04:39:09',2481,286,'2005-08-05 03:15:09',1,'2006-02-15 21:30:53'),(7720,'2005-07-28 04:41:44',185,520,'2005-08-04 06:51:44',2,'2006-02-15 21:30:53'),(7721,'2005-07-28 04:42:58',2228,83,'2005-07-31 07:52:58',1,'2006-02-15 21:30:53'),(7722,'2005-07-28 04:44:58',3828,309,'2005-07-30 01:29:58',1,'2006-02-15 21:30:53'),(7723,'2005-07-28 04:45:37',3263,147,'2005-07-30 09:03:37',2,'2006-02-15 21:30:53'),(7724,'2005-07-28 04:46:30',346,3,'2005-08-04 08:41:30',1,'2006-02-15 21:30:53'),(7725,'2005-07-28 04:47:14',1922,326,'2005-08-04 09:03:14',1,'2006-02-15 21:30:53'),(7726,'2005-07-28 04:52:19',2578,219,'2005-08-04 09:05:19',1,'2006-02-15 21:30:53'),(7727,'2005-07-28 04:52:43',2274,123,'2005-08-03 01:12:43',2,'2006-02-15 21:30:53'),(7728,'2005-07-28 04:56:33',492,130,'2005-07-31 07:54:33',1,'2006-02-15 21:30:53'),(7729,'2005-07-28 04:57:57',1491,89,'2005-07-30 09:38:57',1,'2006-02-15 21:30:53'),(7730,'2005-07-28 04:59:48',3118,155,'2005-08-04 04:35:48',2,'2006-02-15 21:30:53'),(7731,'2005-07-28 05:01:18',1533,413,'2005-07-29 02:22:18',1,'2006-02-15 21:30:53'),(7732,'2005-07-28 05:03:32',3597,158,'2005-07-29 10:20:32',1,'2006-02-15 21:30:53'),(7733,'2005-07-28 05:04:47',10,82,'2005-08-05 05:12:47',2,'2006-02-15 21:30:53'),(7734,'2005-07-28 05:08:44',2726,135,'2005-07-30 09:42:44',2,'2006-02-15 21:30:53'),(7735,'2005-07-28 05:09:56',3949,372,'2005-07-31 23:34:56',2,'2006-02-15 21:30:53'),(7736,'2005-07-28 05:12:04',4466,205,'2005-08-05 02:28:04',2,'2006-02-15 21:30:53'),(7737,'2005-07-28 05:15:03',1235,494,'2005-08-04 01:24:03',1,'2006-02-15 21:30:53'),(7738,'2005-07-28 05:21:42',80,10,'2005-08-03 09:46:42',2,'2006-02-15 21:30:53'),(7739,'2005-07-28 05:21:51',1554,186,'2005-07-30 02:06:51',2,'2006-02-15 21:30:53'),(7740,'2005-07-28 05:23:36',3613,395,'2005-08-01 02:20:36',2,'2006-02-15 21:30:53'),(7741,'2005-07-28 05:25:55',3917,591,'2005-08-02 02:40:55',1,'2006-02-15 21:30:53'),(7742,'2005-07-28 05:33:16',1808,49,'2005-08-06 01:04:16',2,'2006-02-15 21:30:53'),(7743,'2005-07-28 05:36:13',2883,210,'2005-08-03 11:28:13',2,'2006-02-15 21:30:53'),(7744,'2005-07-28 05:38:20',1863,288,'2005-07-31 11:00:20',1,'2006-02-15 21:30:53'),(7745,'2005-07-28 05:46:28',1014,285,'2005-08-06 07:44:28',2,'2006-02-15 21:30:53'),(7746,'2005-07-28 05:48:56',176,299,'2005-08-04 07:33:56',1,'2006-02-15 21:30:53'),(7747,'2005-07-28 05:50:11',1775,78,'2005-08-03 09:51:11',1,'2006-02-15 21:30:53'),(7748,'2005-07-28 05:52:23',3523,415,'2005-07-31 01:35:23',2,'2006-02-15 21:30:53'),(7749,'2005-07-28 05:53:36',3585,232,'2005-08-01 03:49:36',1,'2006-02-15 21:30:53'),(7750,'2005-07-28 05:55:30',820,220,'2005-08-06 04:32:30',2,'2006-02-15 21:30:53'),(7751,'2005-07-28 05:56:13',4425,176,'2005-08-05 08:08:13',1,'2006-02-15 21:30:53'),(7752,'2005-07-28 06:01:00',2218,209,'2005-08-03 06:09:00',1,'2006-02-15 21:30:53'),(7753,'2005-07-28 06:09:19',3071,531,'2005-08-06 06:17:19',1,'2006-02-15 21:30:53'),(7754,'2005-07-28 06:10:55',1981,138,'2005-07-29 02:46:55',1,'2006-02-15 21:30:53'),(7755,'2005-07-28 06:22:18',1247,449,'2005-08-06 11:38:18',2,'2006-02-15 21:30:53'),(7756,'2005-07-28 06:22:52',1611,469,'2005-08-05 11:55:52',2,'2006-02-15 21:30:53'),(7757,'2005-07-28 06:23:00',3445,502,'2005-07-30 12:02:00',1,'2006-02-15 21:30:53'),(7758,'2005-07-28 06:23:41',4333,356,'2005-08-03 06:06:41',2,'2006-02-15 21:30:53'),(7759,'2005-07-28 06:28:45',3381,405,'2005-08-03 11:38:45',1,'2006-02-15 21:30:53'),(7760,'2005-07-28 06:29:45',409,307,'2005-08-03 01:36:45',1,'2006-02-15 21:30:53'),(7761,'2005-07-28 06:31:45',3568,112,'2005-07-30 01:36:45',2,'2006-02-15 21:30:53'),(7762,'2005-07-28 06:34:23',3234,462,'2005-08-05 09:55:23',2,'2006-02-15 21:30:53'),(7763,'2005-07-28 06:35:16',2461,116,'2005-08-03 02:46:16',2,'2006-02-15 21:30:53'),(7764,'2005-07-28 06:40:05',3537,142,'2005-07-30 02:51:05',2,'2006-02-15 21:30:53'),(7765,'2005-07-28 06:40:33',4098,294,'2005-07-31 01:25:33',1,'2006-02-15 21:30:53'),(7766,'2005-07-28 06:41:57',2774,292,'2005-08-06 11:21:57',2,'2006-02-15 21:30:53'),(7767,'2005-07-28 06:42:02',329,139,'2005-08-05 11:19:02',2,'2006-02-15 21:30:53'),(7768,'2005-07-28 06:44:03',2450,123,'2005-07-29 09:46:03',1,'2006-02-15 21:30:53'),(7769,'2005-07-28 06:45:23',3250,30,'2005-07-30 12:18:23',1,'2006-02-15 21:30:53'),(7770,'2005-07-28 06:49:35',1486,507,'2005-08-06 08:16:35',1,'2006-02-15 21:30:53'),(7771,'2005-07-28 06:52:12',1003,175,'2005-07-30 12:48:12',1,'2006-02-15 21:30:53'),(7772,'2005-07-28 06:59:09',986,552,'2005-08-01 10:49:09',1,'2006-02-15 21:30:53'),(7773,'2005-07-28 07:02:17',4143,380,'2005-07-30 04:16:17',2,'2006-02-15 21:30:53'),(7774,'2005-07-28 07:03:25',3483,259,'2005-08-03 02:05:25',1,'2006-02-15 21:30:53'),(7775,'2005-07-28 07:04:36',3795,475,'2005-08-03 06:36:36',2,'2006-02-15 21:30:53'),(7776,'2005-07-28 07:04:36',4170,385,'2005-08-01 09:32:36',1,'2006-02-15 21:30:53'),(7777,'2005-07-28 07:04:42',4422,287,'2005-07-29 01:57:42',1,'2006-02-15 21:30:53'),(7778,'2005-07-28 07:10:11',1044,248,'2005-08-05 05:09:11',1,'2006-02-15 21:30:53'),(7779,'2005-07-28 07:11:11',3663,414,'2005-07-30 11:12:11',1,'2006-02-15 21:30:53'),(7780,'2005-07-28 07:11:55',3069,236,'2005-08-06 05:41:55',1,'2006-02-15 21:30:53'),(7781,'2005-07-28 07:13:20',541,539,'2005-08-06 05:43:20',2,'2006-02-15 21:30:53'),(7782,'2005-07-28 07:13:40',3770,199,'2005-08-05 06:50:40',1,'2006-02-15 21:30:53'),(7783,'2005-07-28 07:14:43',3817,581,'2005-08-01 05:03:43',2,'2006-02-15 21:30:53'),(7784,'2005-07-28 07:15:32',3611,505,'2005-08-06 05:00:32',1,'2006-02-15 21:30:53'),(7785,'2005-07-28 07:16:11',4277,460,'2005-08-02 03:43:11',1,'2006-02-15 21:30:53'),(7786,'2005-07-28 07:18:26',2285,222,'2005-07-29 03:00:26',1,'2006-02-15 21:30:53'),(7787,'2005-07-28 07:19:02',2191,203,'2005-08-06 02:38:02',2,'2006-02-15 21:30:53'),(7788,'2005-07-28 07:21:55',95,487,'2005-08-03 06:33:55',1,'2006-02-15 21:30:53'),(7789,'2005-07-28 07:22:07',2837,426,'2005-08-06 10:47:07',1,'2006-02-15 21:30:53'),(7790,'2005-07-28 07:22:35',2327,189,'2005-07-30 02:59:35',1,'2006-02-15 21:30:53'),(7791,'2005-07-28 07:22:51',822,514,'2005-07-30 03:09:51',1,'2006-02-15 21:30:53'),(7792,'2005-07-28 07:24:02',3736,236,'2005-08-04 11:13:02',1,'2006-02-15 21:30:53'),(7793,'2005-07-28 07:26:14',24,32,'2005-08-03 07:45:14',1,'2006-02-15 21:30:53'),(7794,'2005-07-28 07:28:03',4509,510,'2005-08-06 12:32:03',2,'2006-02-15 21:30:53'),(7795,'2005-07-28 07:28:16',1278,38,'2005-07-31 12:03:16',1,'2006-02-15 21:30:53'),(7796,'2005-07-28 07:39:39',622,419,'2005-08-02 05:34:39',2,'2006-02-15 21:30:53'),(7797,'2005-07-28 07:41:07',4180,370,'2005-07-31 04:13:07',1,'2006-02-15 21:30:53'),(7798,'2005-07-28 07:41:59',3281,236,'2005-07-31 12:36:59',1,'2006-02-15 21:30:53'),(7799,'2005-07-28 07:42:09',2163,384,'2005-08-02 10:02:09',2,'2006-02-15 21:30:53'),(7800,'2005-07-28 07:50:59',3386,499,'2005-07-29 07:31:59',2,'2006-02-15 21:30:53'),(7801,'2005-07-28 07:51:56',2052,9,'2005-07-30 12:18:56',1,'2006-02-15 21:30:53'),(7802,'2005-07-28 07:51:57',1108,298,'2005-07-29 09:32:57',1,'2006-02-15 21:30:53'),(7803,'2005-07-28 07:52:13',3438,449,'2005-08-03 13:35:13',1,'2006-02-15 21:30:53'),(7804,'2005-07-28 07:56:00',592,249,'2005-07-30 10:33:00',2,'2006-02-15 21:30:53'),(7805,'2005-07-28 07:56:41',3204,366,'2005-08-04 06:53:41',1,'2006-02-15 21:30:53'),(7806,'2005-07-28 07:58:17',4317,440,'2005-08-06 10:15:17',1,'2006-02-15 21:30:53'),(7807,'2005-07-28 07:58:27',2204,504,'2005-08-01 02:48:27',2,'2006-02-15 21:30:53'),(7808,'2005-07-28 07:58:56',4052,327,'2005-08-02 10:49:56',1,'2006-02-15 21:30:53'),(7809,'2005-07-28 07:59:46',4150,94,'2005-08-02 02:56:46',1,'2006-02-15 21:30:53'),(7810,'2005-07-28 08:00:38',30,537,'2005-08-02 06:14:38',2,'2006-02-15 21:30:53'),(7811,'2005-07-28 08:06:01',3891,347,'2005-07-30 10:08:01',2,'2006-02-15 21:30:53'),(7812,'2005-07-28 08:06:52',4556,237,'2005-07-31 09:57:52',2,'2006-02-15 21:30:53'),(7813,'2005-07-28 08:08:27',4216,411,'2005-07-30 03:08:27',2,'2006-02-15 21:30:53'),(7814,'2005-07-28 08:09:48',2662,258,'2005-08-01 13:14:48',2,'2006-02-15 21:30:53'),(7815,'2005-07-28 08:14:11',3551,300,'2005-07-30 02:34:11',2,'2006-02-15 21:30:53'),(7816,'2005-07-28 08:14:12',1422,283,'2005-07-30 08:00:12',2,'2006-02-15 21:30:53'),(7817,'2005-07-28 08:20:55',600,259,'2005-07-30 11:55:55',1,'2006-02-15 21:30:53'),(7818,'2005-07-28 08:25:00',1672,301,'2005-07-29 14:07:00',1,'2006-02-15 21:30:53'),(7819,'2005-07-28 08:27:14',3182,100,'2005-08-02 12:34:14',2,'2006-02-15 21:30:53'),(7820,'2005-07-28 08:28:51',4475,459,'2005-08-05 10:00:51',1,'2006-02-15 21:30:53'),(7821,'2005-07-28 08:31:23',1184,433,'2005-08-03 05:08:23',2,'2006-02-15 21:30:53'),(7822,'2005-07-28 08:31:45',1428,156,'2005-07-31 11:06:45',1,'2006-02-15 21:30:53'),(7823,'2005-07-28 08:32:53',84,428,'2005-08-06 11:59:53',1,'2006-02-15 21:30:53'),(7824,'2005-07-28 08:34:47',2241,153,'2005-08-05 09:43:47',2,'2006-02-15 21:30:53'),(7825,'2005-07-28 08:34:57',4340,348,'2005-08-06 02:45:57',1,'2006-02-15 21:30:53'),(7826,'2005-07-28 08:35:51',1473,214,'2005-08-05 07:57:51',2,'2006-02-15 21:30:53'),(7827,'2005-07-28 08:37:22',659,422,'2005-07-31 04:27:22',1,'2006-02-15 21:30:53'),(7828,'2005-07-28 08:40:46',1710,212,'2005-07-30 14:22:46',1,'2006-02-15 21:30:53'),(7829,'2005-07-28 08:43:39',111,5,'2005-08-04 14:33:39',1,'2006-02-15 21:30:53'),(7830,'2005-07-28 08:43:49',4492,144,'2005-08-04 09:30:49',2,'2006-02-15 21:30:53'),(7831,'2005-07-28 08:44:21',4436,499,'2005-07-30 03:25:21',2,'2006-02-15 21:30:53'),(7832,'2005-07-28 08:46:11',284,92,'2005-08-04 06:55:11',1,'2006-02-15 21:30:53'),(7833,'2005-07-28 08:46:14',1166,263,'2005-08-04 06:13:14',1,'2006-02-15 21:30:53'),(7834,'2005-07-28 08:46:43',4124,278,'2005-07-31 07:09:43',2,'2006-02-15 21:30:53'),(7835,'2005-07-28 08:49:39',43,547,'2005-08-02 07:16:39',2,'2006-02-15 21:30:53'),(7836,'2005-07-28 08:55:27',1770,481,'2005-08-05 09:35:27',1,'2006-02-15 21:30:53'),(7837,'2005-07-28 08:58:32',115,374,'2005-07-29 14:11:32',1,'2006-02-15 21:30:53'),(7838,'2005-07-28 09:00:21',2222,550,'2005-07-29 05:52:21',1,'2006-02-15 21:30:53'),(7839,'2005-07-28 09:01:13',914,518,'2005-08-04 11:46:13',1,'2006-02-15 21:30:53'),(7840,'2005-07-28 09:03:02',2899,482,'2005-08-06 06:15:02',1,'2006-02-15 21:30:53'),(7841,'2005-07-28 09:04:45',1092,1,'2005-07-30 12:37:45',2,'2006-02-15 21:30:53'),(7842,'2005-07-28 09:10:06',2447,276,'2005-08-04 06:52:06',2,'2006-02-15 21:30:53'),(7843,'2005-07-28 09:10:22',3962,75,'2005-08-01 11:27:22',2,'2006-02-15 21:30:53'),(7844,'2005-07-28 09:16:19',4220,187,'2005-08-05 14:06:19',2,'2006-02-15 21:30:53'),(7845,'2005-07-28 09:18:07',38,352,'2005-08-04 10:23:07',2,'2006-02-15 21:30:53'),(7846,'2005-07-28 09:21:18',4201,309,'2005-08-06 07:10:18',2,'2006-02-15 21:30:53'),(7847,'2005-07-28 09:23:14',3602,323,'2005-08-02 11:02:14',2,'2006-02-15 21:30:53'),(7848,'2005-07-28 09:24:31',162,509,'2005-08-05 05:11:31',2,'2006-02-15 21:30:53'),(7849,'2005-07-28 09:30:02',996,423,'2005-08-06 12:41:02',2,'2006-02-15 21:30:53'),(7850,'2005-07-28 09:31:13',2913,118,'2005-08-02 14:06:13',2,'2006-02-15 21:30:53'),(7851,'2005-07-28 09:31:58',3596,253,'2005-08-04 09:58:58',2,'2006-02-15 21:30:53'),(7852,'2005-07-28 09:34:29',3462,123,'2005-07-30 05:48:29',1,'2006-02-15 21:30:53'),(7853,'2005-07-28 09:36:38',4053,318,'2005-07-29 15:01:38',1,'2006-02-15 21:30:53'),(7854,'2005-07-28 09:42:31',3531,84,'2005-08-02 09:25:31',1,'2006-02-15 21:30:53'),(7855,'2005-07-28 09:43:02',2474,288,'2005-07-30 12:57:02',2,'2006-02-15 21:30:53'),(7856,'2005-07-28 09:48:24',2376,375,'2005-07-29 09:49:24',2,'2006-02-15 21:30:53'),(7857,'2005-07-28 09:49:40',4027,500,'2005-08-01 05:34:40',2,'2006-02-15 21:30:53'),(7858,'2005-07-28 09:50:18',992,144,'2005-08-05 14:33:18',1,'2006-02-15 21:30:53'),(7859,'2005-07-28 09:57:17',3392,547,'2005-08-04 06:04:17',1,'2006-02-15 21:30:53'),(7860,'2005-07-28 09:58:02',2400,241,'2005-08-05 06:04:02',1,'2006-02-15 21:30:53'),(7861,'2005-07-28 10:02:01',1781,208,'2005-08-06 13:17:01',1,'2006-02-15 21:30:53'),(7862,'2005-07-28 10:02:25',2507,299,'2005-08-05 13:10:25',1,'2006-02-15 21:30:53'),(7863,'2005-07-28 10:05:46',1212,182,'2005-07-29 14:42:46',1,'2006-02-15 21:30:53'),(7864,'2005-07-28 10:06:10',1238,20,'2005-08-04 08:38:10',1,'2006-02-15 21:30:53'),(7865,'2005-07-28 10:07:04',2334,148,'2005-08-06 08:16:04',2,'2006-02-15 21:30:53'),(7866,'2005-07-28 10:08:01',1602,101,'2005-08-04 09:29:01',2,'2006-02-15 21:30:53'),(7867,'2005-07-28 10:08:54',713,297,'2005-07-30 10:26:54',2,'2006-02-15 21:30:53'),(7868,'2005-07-28 10:08:55',3589,43,'2005-07-30 11:52:55',1,'2006-02-15 21:30:53'),(7869,'2005-07-28 10:13:15',3005,298,'2005-08-03 12:58:15',1,'2006-02-15 21:30:53'),(7870,'2005-07-28 10:16:03',970,240,'2005-07-31 16:06:03',1,'2006-02-15 21:30:53'),(7871,'2005-07-28 10:16:37',3990,491,'2005-08-05 11:24:37',2,'2006-02-15 21:30:53'),(7872,'2005-07-28 10:18:16',826,66,'2005-07-31 10:57:16',1,'2006-02-15 21:30:53'),(7873,'2005-07-28 10:19:46',2947,82,'2005-07-31 04:43:46',2,'2006-02-15 21:30:53'),(7874,'2005-07-28 10:21:52',2981,86,'2005-08-06 16:19:52',1,'2006-02-15 21:30:53'),(7875,'2005-07-28 10:23:48',3693,504,'2005-08-02 12:09:48',1,'2006-02-15 21:30:53'),(7876,'2005-07-28 10:24:22',3563,577,'2005-08-04 07:15:22',1,'2006-02-15 21:30:53'),(7877,'2005-07-28 10:25:36',2576,65,'2005-08-05 12:46:36',1,'2006-02-15 21:30:53'),(7878,'2005-07-28 10:27:10',1564,141,'2005-07-29 11:22:10',1,'2006-02-15 21:30:53'),(7879,'2005-07-28 10:27:46',1969,125,'2005-07-31 07:48:46',1,'2006-02-15 21:30:53'),(7880,'2005-07-28 10:30:37',3670,182,'2005-08-03 08:05:37',2,'2006-02-15 21:30:53'),(7881,'2005-07-28 10:33:22',533,249,'2005-08-02 12:10:22',1,'2006-02-15 21:30:53'),(7882,'2005-07-28 10:33:42',3922,516,'2005-07-29 13:49:42',1,'2006-02-15 21:30:53'),(7883,'2005-07-28 10:37:20',447,526,'2005-08-02 05:08:20',1,'2006-02-15 21:30:53'),(7884,'2005-07-28 10:37:24',3871,502,'2005-07-31 10:31:24',1,'2006-02-15 21:30:53'),(7885,'2005-07-28 10:37:41',4294,260,'2005-08-05 07:56:41',1,'2006-02-15 21:30:53'),(7886,'2005-07-28 10:37:55',237,352,'2005-08-04 13:22:55',2,'2006-02-15 21:30:53'),(7887,'2005-07-28 10:40:12',2820,253,'2005-08-02 06:09:12',1,'2006-02-15 21:30:53'),(7888,'2005-07-28 10:40:24',545,378,'2005-08-01 16:18:24',1,'2006-02-15 21:30:53'),(7889,'2005-07-28 10:43:21',3123,416,'2005-07-30 09:11:21',1,'2006-02-15 21:30:53'),(7890,'2005-07-28 10:43:40',3443,553,'2005-07-31 06:07:40',1,'2006-02-15 21:30:53'),(7891,'2005-07-28 10:43:56',3637,560,'2005-08-05 14:04:56',2,'2006-02-15 21:30:53'),(7892,'2005-07-28 10:46:58',2717,397,'2005-07-30 16:03:58',1,'2006-02-15 21:30:53'),(7893,'2005-07-28 10:49:27',3058,479,'2005-08-02 06:46:27',1,'2006-02-15 21:30:53'),(7894,'2005-07-28 10:53:58',3532,330,'2005-08-02 13:42:58',2,'2006-02-15 21:30:53'),(7895,'2005-07-28 10:57:15',900,67,'2005-08-02 15:10:15',2,'2006-02-15 21:30:53'),(7896,'2005-07-28 11:00:58',3561,389,'2005-08-04 14:30:58',2,'2006-02-15 21:30:53'),(7897,'2005-07-28 11:01:51',1396,75,'2005-07-31 13:13:51',1,'2006-02-15 21:30:53'),(7898,'2005-07-28 11:08:22',2680,499,'2005-08-03 12:28:22',1,'2006-02-15 21:30:53'),(7899,'2005-07-28 11:10:12',4130,452,'2005-08-02 13:20:12',2,'2006-02-15 21:30:53'),(7900,'2005-07-28 11:11:33',2781,154,'2005-08-05 06:29:33',2,'2006-02-15 21:30:53'),(7901,'2005-07-28 11:12:12',4435,280,'2005-08-01 08:13:12',1,'2006-02-15 21:30:53'),(7902,'2005-07-28 11:14:19',3066,356,'2005-07-30 09:01:19',2,'2006-02-15 21:30:53'),(7903,'2005-07-28 11:20:36',2767,588,'2005-07-31 09:16:36',1,'2006-02-15 21:30:53'),(7904,'2005-07-28 11:25:39',316,477,'2005-08-06 08:22:39',2,'2006-02-15 21:30:53'),(7905,'2005-07-28 11:26:57',4287,455,'2005-08-02 06:14:57',1,'2006-02-15 21:30:53'),(7906,'2005-07-28 11:31:42',1216,85,'2005-08-01 11:56:42',2,'2006-02-15 21:30:53'),(7907,'2005-07-28 11:32:00',3252,433,'2005-07-30 15:27:00',1,'2006-02-15 21:30:53'),(7908,'2005-07-28 11:32:57',3646,360,'2005-08-03 13:30:57',2,'2006-02-15 21:30:53'),(7909,'2005-07-28 11:38:08',3355,210,'2005-07-29 13:54:08',1,'2006-02-15 21:30:53'),(7910,'2005-07-28 11:44:56',2044,480,'2005-08-05 14:37:56',2,'2006-02-15 21:30:53'),(7911,'2005-07-28 11:46:45',390,3,'2005-07-29 07:19:45',1,'2006-02-15 21:30:53'),(7912,'2005-07-28 11:46:58',745,127,'2005-08-05 12:50:58',1,'2006-02-15 21:30:53'),(7913,'2005-07-28 11:47:23',4001,459,'2005-08-05 06:36:23',1,'2006-02-15 21:30:53'),(7914,'2005-07-28 11:48:08',2796,469,'2005-07-30 14:14:08',1,'2006-02-15 21:30:53'),(7915,'2005-07-28 11:49:46',2088,186,'2005-08-04 12:21:46',2,'2006-02-15 21:30:53'),(7916,'2005-07-28 11:49:53',3877,13,'2005-07-29 15:01:53',1,'2006-02-15 21:30:53'),(7917,'2005-07-28 11:56:57',2071,416,'2005-07-29 14:06:57',1,'2006-02-15 21:30:53'),(7918,'2005-07-28 11:58:53',63,473,'2005-08-04 12:08:53',2,'2006-02-15 21:30:53'),(7919,'2005-07-28 11:59:45',2138,36,'2005-08-06 11:19:45',1,'2006-02-15 21:30:53'),(7920,'2005-07-28 12:01:19',66,48,'2005-08-05 07:08:19',1,'2006-02-15 21:30:53'),(7921,'2005-07-28 12:02:46',116,100,'2005-08-01 12:08:46',2,'2006-02-15 21:30:53'),(7922,'2005-07-28 12:05:25',817,125,'2005-08-02 12:13:25',2,'2006-02-15 21:30:53'),(7923,'2005-07-28 12:08:29',2273,458,'2005-08-04 12:30:29',1,'2006-02-15 21:30:53'),(7924,'2005-07-28 12:08:53',656,97,'2005-07-30 06:45:53',2,'2006-02-15 21:30:53'),(7925,'2005-07-28 12:10:02',1763,500,'2005-08-02 15:50:02',1,'2006-02-15 21:30:53'),(7926,'2005-07-28 12:13:02',180,78,'2005-08-05 08:54:02',1,'2006-02-15 21:30:53'),(7927,'2005-07-28 12:13:42',1263,27,'2005-08-05 12:02:42',1,'2006-02-15 21:30:53'),(7928,'2005-07-28 12:15:51',912,473,'2005-08-05 06:34:51',1,'2006-02-15 21:30:53'),(7929,'2005-07-28 12:16:40',2652,307,'2005-07-31 13:09:40',2,'2006-02-15 21:30:53'),(7930,'2005-07-28 12:21:08',4181,320,'2005-07-30 11:56:08',1,'2006-02-15 21:30:53'),(7931,'2005-07-28 12:23:41',1923,326,'2005-08-06 09:49:41',2,'2006-02-15 21:30:53'),(7932,'2005-07-28 12:24:54',3738,462,'2005-07-30 11:33:54',1,'2006-02-15 21:30:53'),(7933,'2005-07-28 12:27:27',3175,297,'2005-07-29 10:34:27',2,'2006-02-15 21:30:53'),(7934,'2005-07-28 12:33:10',2642,332,'2005-08-04 07:40:10',2,'2006-02-15 21:30:53'),(7935,'2005-07-28 12:33:17',3664,462,'2005-08-04 14:40:17',2,'2006-02-15 21:30:53'),(7936,'2005-07-28 12:33:21',563,520,'2005-07-30 13:31:21',2,'2006-02-15 21:30:53'),(7937,'2005-07-28 12:38:22',3944,323,'2005-07-29 09:19:22',1,'2006-02-15 21:30:53'),(7938,'2005-07-28 12:39:11',2579,114,'2005-08-04 16:56:11',1,'2006-02-15 21:30:53'),(7939,'2005-07-28 12:45:47',2004,37,'2005-07-30 18:32:47',2,'2006-02-15 21:30:53'),(7940,'2005-07-28 12:46:47',901,409,'2005-07-29 06:46:47',2,'2006-02-15 21:30:53'),(7941,'2005-07-28 12:47:20',439,566,'2005-08-01 08:46:20',1,'2006-02-15 21:30:53'),(7942,'2005-07-28 12:49:44',1636,56,'2005-07-31 18:07:44',2,'2006-02-15 21:30:53'),(7943,'2005-07-28 12:50:55',2914,346,'2005-08-04 11:29:55',2,'2006-02-15 21:30:53'),(7944,'2005-07-28 12:51:22',3148,504,'2005-07-30 12:19:22',1,'2006-02-15 21:30:53'),(7945,'2005-07-28 12:53:58',3326,316,'2005-08-03 14:04:58',1,'2006-02-15 21:30:53'),(7946,'2005-07-28 13:01:22',99,90,'2005-08-03 15:27:22',2,'2006-02-15 21:30:53'),(7947,'2005-07-28 13:05:50',2504,279,'2005-08-02 11:16:50',2,'2006-02-15 21:30:53'),(7948,'2005-07-28 13:06:16',215,589,'2005-08-05 08:38:16',1,'2006-02-15 21:30:53'),(7949,'2005-07-28 13:07:24',2145,487,'2005-08-02 09:41:24',1,'2006-02-15 21:30:53'),(7950,'2005-07-28 13:21:00',2286,122,'2005-08-05 18:47:00',2,'2006-02-15 21:30:53'),(7951,'2005-07-28 13:21:16',3979,237,'2005-08-06 08:21:16',1,'2006-02-15 21:30:53'),(7952,'2005-07-28 13:23:49',3313,158,'2005-08-01 08:50:49',1,'2006-02-15 21:30:53'),(7953,'2005-07-28 13:24:32',4471,319,'2005-08-05 16:09:32',2,'2006-02-15 21:30:53'),(7954,'2005-07-28 13:25:05',3735,145,'2005-07-29 18:50:05',2,'2006-02-15 21:30:53'),(7955,'2005-07-28 13:31:36',1519,522,'2005-07-30 10:03:36',1,'2006-02-15 21:30:53'),(7956,'2005-07-28 13:32:17',4335,118,'2005-08-06 14:51:17',2,'2006-02-15 21:30:53'),(7957,'2005-07-28 13:34:08',1623,78,'2005-08-05 07:58:08',1,'2006-02-15 21:30:53'),(7958,'2005-07-28 13:34:34',421,593,'2005-07-29 16:03:34',1,'2006-02-15 21:30:53'),(7959,'2005-07-28 13:43:20',1549,178,'2005-08-02 12:13:20',2,'2006-02-15 21:30:53'),(7960,'2005-07-28 13:47:08',2718,324,'2005-08-03 15:17:08',1,'2006-02-15 21:30:53'),(7961,'2005-07-28 13:47:21',3284,45,'2005-08-01 09:33:21',1,'2006-02-15 21:30:53'),(7962,'2005-07-28 13:48:09',1746,126,'2005-08-03 19:21:09',1,'2006-02-15 21:30:53'),(7963,'2005-07-28 13:48:38',921,247,'2005-08-06 19:37:38',2,'2006-02-15 21:30:53'),(7964,'2005-07-28 13:49:58',2528,574,'2005-08-03 10:03:58',2,'2006-02-15 21:30:53'),(7965,'2005-07-28 13:52:57',3671,134,'2005-07-29 14:54:57',1,'2006-02-15 21:30:53'),(7966,'2005-07-28 13:53:54',2514,91,'2005-08-06 15:32:54',1,'2006-02-15 21:30:53'),(7967,'2005-07-28 13:56:51',2040,187,'2005-08-03 19:38:51',1,'2006-02-15 21:30:53'),(7968,'2005-07-28 13:57:35',3865,597,'2005-08-04 13:40:35',1,'2006-02-15 21:30:53'),(7969,'2005-07-28 13:57:37',2224,123,'2005-08-04 19:31:37',1,'2006-02-15 21:30:53'),(7970,'2005-07-28 13:58:38',998,507,'2005-08-02 12:27:38',1,'2006-02-15 21:30:53'),(7971,'2005-07-28 14:00:47',1910,445,'2005-08-02 10:01:47',1,'2006-02-15 21:30:53'),(7972,'2005-07-28 14:07:46',2930,269,'2005-08-01 11:28:46',2,'2006-02-15 21:30:53'),(7973,'2005-07-28 14:10:06',3936,339,'2005-07-29 11:26:06',2,'2006-02-15 21:30:53'),(7974,'2005-07-28 14:11:57',2442,380,'2005-08-02 19:25:57',2,'2006-02-15 21:30:53'),(7975,'2005-07-28 14:12:47',2565,211,'2005-08-05 09:18:47',1,'2006-02-15 21:30:53'),(7976,'2005-07-28 14:13:24',2296,205,'2005-08-05 09:01:24',1,'2006-02-15 21:30:53'),(7977,'2005-07-28 14:15:54',3162,389,'2005-08-01 18:58:54',2,'2006-02-15 21:30:53'),(7978,'2005-07-28 14:16:14',508,431,'2005-08-01 12:53:14',2,'2006-02-15 21:30:53'),(7979,'2005-07-28 14:16:30',3303,94,'2005-08-03 09:39:30',2,'2006-02-15 21:30:53'),(7980,'2005-07-28 14:16:49',1019,329,'2005-08-05 09:20:49',1,'2006-02-15 21:30:53'),(7981,'2005-07-28 14:18:25',90,392,'2005-08-04 15:21:25',2,'2006-02-15 21:30:53'),(7982,'2005-07-28 14:19:59',668,71,'2005-07-29 14:09:59',2,'2006-02-15 21:30:53'),(7983,'2005-07-28 14:23:01',1836,115,'2005-07-29 11:51:01',1,'2006-02-15 21:30:53'),(7984,'2005-07-28 14:27:51',2893,208,'2005-08-04 17:34:51',1,'2006-02-15 21:30:53'),(7985,'2005-07-28 14:29:01',4022,388,'2005-08-03 17:20:01',2,'2006-02-15 21:30:53'),(7986,'2005-07-28 14:30:13',1283,395,'2005-08-05 09:35:13',1,'2006-02-15 21:30:53'),(7987,'2005-07-28 14:36:52',288,443,'2005-08-05 16:49:52',2,'2006-02-15 21:30:53'),(7988,'2005-07-28 14:37:18',2906,517,'2005-08-05 10:53:18',1,'2006-02-15 21:30:53'),(7989,'2005-07-28 14:39:05',3196,149,'2005-08-05 13:58:05',2,'2006-02-15 21:30:53'),(7990,'2005-07-28 14:43:08',188,232,'2005-08-01 10:51:08',2,'2006-02-15 21:30:53'),(7991,'2005-07-28 14:45:45',1133,59,'2005-07-29 15:05:45',2,'2006-02-15 21:30:53'),(7992,'2005-07-28 14:53:06',1851,33,'2005-07-29 18:17:06',1,'2006-02-15 21:30:53'),(7993,'2005-07-28 14:56:41',2926,353,'2005-08-01 17:01:41',2,'2006-02-15 21:30:53'),(7994,'2005-07-28 14:56:54',2431,21,'2005-07-30 09:56:54',2,'2006-02-15 21:30:53'),(7995,'2005-07-28 15:00:09',536,89,'2005-08-01 12:33:09',2,'2006-02-15 21:30:53'),(7996,'2005-07-28 15:00:49',2171,408,'2005-08-04 20:58:49',2,'2006-02-15 21:30:53'),(7997,'2005-07-28 15:02:25',1845,591,'2005-08-04 14:35:25',1,'2006-02-15 21:30:53'),(7998,'2005-07-28 15:08:48',1397,598,'2005-07-31 16:14:48',2,'2006-02-15 21:30:53'),(7999,'2005-07-28 15:10:14',2750,170,'2005-08-06 17:08:14',2,'2006-02-15 21:30:53'),(8000,'2005-07-28 15:10:25',1644,212,'2005-08-06 19:15:25',1,'2006-02-15 21:30:53'),(8001,'2005-07-28 15:10:55',2570,10,'2005-08-05 18:23:55',1,'2006-02-15 21:30:53'),(8002,'2005-07-28 15:11:00',22,449,'2005-07-31 15:46:00',2,'2006-02-15 21:30:53'),(8003,'2005-07-28 15:11:27',2775,89,'2005-08-04 18:35:27',1,'2006-02-15 21:30:53'),(8004,'2005-07-28 15:14:07',4428,393,'2005-07-30 19:32:07',2,'2006-02-15 21:30:53'),(8005,'2005-07-28 15:15:11',670,488,'2005-07-29 14:54:11',1,'2006-02-15 21:30:53'),(8006,'2005-07-28 15:15:41',3959,109,'2005-08-05 19:29:41',2,'2006-02-15 21:30:53'),(8007,'2005-07-28 15:22:27',1942,525,'2005-07-30 13:06:27',2,'2006-02-15 21:30:53'),(8008,'2005-07-28 15:25:55',2093,41,'2005-08-04 13:16:55',1,'2006-02-15 21:30:53'),(8009,'2005-07-28 15:25:58',337,372,'2005-08-04 10:16:58',2,'2006-02-15 21:30:53'),(8010,'2005-07-28 15:26:20',68,467,'2005-08-04 18:39:20',2,'2006-02-15 21:30:53'),(8011,'2005-07-28 15:26:39',4274,497,'2005-07-30 13:59:39',1,'2006-02-15 21:30:53'),(8012,'2005-07-28 15:29:00',1513,343,'2005-08-05 12:28:00',2,'2006-02-15 21:30:53'),(8013,'2005-07-28 15:30:26',2074,403,'2005-08-05 16:29:26',1,'2006-02-15 21:30:53'),(8014,'2005-07-28 15:32:07',2339,11,'2005-07-31 20:52:07',1,'2006-02-15 21:30:53'),(8015,'2005-07-28 15:33:03',1814,23,'2005-07-30 15:32:03',2,'2006-02-15 21:30:53'),(8016,'2005-07-28 15:35:41',516,391,'2005-07-30 20:06:41',2,'2006-02-15 21:30:53'),(8017,'2005-07-28 15:35:41',1764,328,'2005-08-01 19:12:41',1,'2006-02-15 21:30:53'),(8018,'2005-07-28 15:36:48',4129,377,'2005-08-06 20:04:48',1,'2006-02-15 21:30:53'),(8019,'2005-07-28 15:37:43',1844,84,'2005-08-04 15:40:43',2,'2006-02-15 21:30:53'),(8020,'2005-07-28 15:43:32',4459,498,'2005-08-05 12:19:32',1,'2006-02-15 21:30:53'),(8021,'2005-07-28 15:45:24',1920,501,'2005-08-04 10:49:24',1,'2006-02-15 21:30:53'),(8022,'2005-07-28 15:48:56',294,314,'2005-08-06 13:40:56',1,'2006-02-15 21:30:53'),(8023,'2005-07-28 15:53:29',2133,411,'2005-07-31 12:26:29',1,'2006-02-15 21:30:53'),(8024,'2005-07-28 15:55:40',1735,90,'2005-08-02 09:56:40',1,'2006-02-15 21:30:53'),(8025,'2005-07-28 16:03:27',2932,421,'2005-08-03 21:58:27',2,'2006-02-15 21:30:53'),(8026,'2005-07-28 16:05:38',4225,511,'2005-07-29 21:28:38',2,'2006-02-15 21:30:53'),(8027,'2005-07-28 16:09:57',1335,436,'2005-08-05 18:17:57',1,'2006-02-15 21:30:53'),(8028,'2005-07-28 16:11:15',2715,137,'2005-08-05 15:11:15',1,'2006-02-15 21:30:53'),(8029,'2005-07-28 16:11:21',4273,61,'2005-08-05 13:52:21',1,'2006-02-15 21:30:53'),(8030,'2005-07-28 16:12:53',2633,30,'2005-07-31 17:15:53',1,'2006-02-15 21:30:53'),(8031,'2005-07-28 16:15:49',2196,40,'2005-08-02 18:27:49',2,'2006-02-15 21:30:53'),(8032,'2005-07-28 16:17:00',431,230,'2005-07-29 13:32:00',1,'2006-02-15 21:30:53'),(8033,'2005-07-28 16:18:23',4268,1,'2005-07-30 17:56:23',1,'2006-02-15 21:30:53'),(8034,'2005-07-28 16:20:26',1997,502,'2005-08-04 19:11:26',2,'2006-02-15 21:30:53'),(8035,'2005-07-28 16:23:01',1503,14,'2005-08-05 10:52:01',1,'2006-02-15 21:30:53'),(8036,'2005-07-28 16:27:43',2741,412,'2005-08-01 13:41:43',2,'2006-02-15 21:30:53'),(8037,'2005-07-28 16:31:20',3973,409,'2005-07-31 12:18:20',2,'2006-02-15 21:30:53'),(8038,'2005-07-28 16:32:55',1225,30,'2005-07-30 21:08:55',1,'2006-02-15 21:30:53'),(8039,'2005-07-28 16:35:16',1996,203,'2005-07-30 14:49:16',1,'2006-02-15 21:30:53'),(8040,'2005-07-28 16:39:43',4543,163,'2005-08-02 20:00:43',2,'2006-02-15 21:30:53'),(8041,'2005-07-28 16:39:56',763,357,'2005-07-30 18:44:56',1,'2006-02-15 21:30:53'),(8042,'2005-07-28 16:45:11',4325,14,'2005-08-04 17:16:11',2,'2006-02-15 21:30:53'),(8043,'2005-07-28 16:45:44',208,577,'2005-08-01 12:26:44',1,'2006-02-15 21:30:53'),(8044,'2005-07-28 16:49:12',879,442,'2005-08-02 22:41:12',1,'2006-02-15 21:30:53'),(8045,'2005-07-28 16:49:38',3427,368,'2005-08-03 15:42:38',1,'2006-02-15 21:30:53'),(8046,'2005-07-28 16:49:41',2873,120,'2005-07-31 21:33:41',1,'2006-02-15 21:30:53'),(8047,'2005-07-28 16:49:43',2936,292,'2005-08-03 14:48:43',2,'2006-02-15 21:30:53'),(8048,'2005-07-28 16:50:26',2721,182,'2005-08-06 19:20:26',1,'2006-02-15 21:30:53'),(8049,'2005-07-28 16:51:58',673,42,'2005-07-31 22:18:58',1,'2006-02-15 21:30:53'),(8050,'2005-07-28 16:55:47',1864,488,'2005-08-02 13:20:47',1,'2006-02-15 21:30:53'),(8051,'2005-07-28 16:56:16',4405,192,'2005-07-29 22:48:16',1,'2006-02-15 21:30:53'),(8052,'2005-07-28 16:57:31',2460,166,'2005-08-03 18:03:31',2,'2006-02-15 21:30:53'),(8053,'2005-07-28 16:59:41',1511,526,'2005-08-03 22:28:41',2,'2006-02-15 21:30:53'),(8054,'2005-07-28 17:02:18',1062,225,'2005-08-06 11:55:18',1,'2006-02-15 21:30:53'),(8055,'2005-07-28 17:02:32',4162,304,'2005-07-31 22:05:32',2,'2006-02-15 21:30:53'),(8056,'2005-07-28 17:04:15',4018,589,'2005-08-03 19:11:15',2,'2006-02-15 21:30:53'),(8057,'2005-07-28 17:07:13',4177,483,'2005-08-03 16:25:13',1,'2006-02-15 21:30:53'),(8058,'2005-07-28 17:07:49',2148,404,'2005-08-03 22:57:49',1,'2006-02-15 21:30:53'),(8059,'2005-07-28 17:09:59',2611,372,'2005-07-31 15:42:59',2,'2006-02-15 21:30:53'),(8060,'2005-07-28 17:10:02',3765,577,'2005-08-05 17:11:02',1,'2006-02-15 21:30:53'),(8061,'2005-07-28 17:12:53',650,467,'2005-08-05 13:56:53',2,'2006-02-15 21:30:53'),(8062,'2005-07-28 17:15:06',1384,317,'2005-07-30 16:56:06',2,'2006-02-15 21:30:53'),(8063,'2005-07-28 17:15:11',935,163,'2005-08-04 16:45:11',1,'2006-02-15 21:30:53'),(8064,'2005-07-28 17:15:38',3788,488,'2005-08-04 18:04:38',2,'2006-02-15 21:30:53'),(8065,'2005-07-28 17:15:48',413,220,'2005-08-04 15:49:48',2,'2006-02-15 21:30:53'),(8066,'2005-07-28 17:20:09',3208,462,'2005-07-31 18:36:09',2,'2006-02-15 21:30:53'),(8067,'2005-07-28 17:20:17',3923,209,'2005-07-29 21:55:17',1,'2006-02-15 21:30:53'),(8068,'2005-07-28 17:22:28',209,216,'2005-07-29 12:24:28',2,'2006-02-15 21:30:53'),(8069,'2005-07-28 17:23:46',2822,178,'2005-07-30 16:19:46',1,'2006-02-15 21:30:53'),(8070,'2005-07-28 17:26:56',1606,89,'2005-08-01 17:33:56',1,'2006-02-15 21:30:53'),(8071,'2005-07-28 17:27:48',2582,131,'2005-08-03 11:48:48',2,'2006-02-15 21:30:53'),(8072,'2005-07-28 17:27:59',2347,99,'2005-07-30 19:08:59',1,'2006-02-15 21:30:53'),(8073,'2005-07-28 17:29:02',630,314,'2005-08-01 22:17:02',2,'2006-02-15 21:30:53'),(8074,'2005-07-28 17:33:39',1558,1,'2005-07-29 20:17:39',1,'2006-02-15 21:30:53'),(8075,'2005-07-28 17:37:28',2175,61,'2005-07-29 11:56:28',2,'2006-02-15 21:30:53'),(8076,'2005-07-28 17:45:58',214,17,'2005-08-04 18:07:58',2,'2006-02-15 21:30:53'),(8077,'2005-07-28 17:54:35',3253,122,'2005-07-29 19:28:35',2,'2006-02-15 21:30:53'),(8078,'2005-07-28 17:54:42',3839,407,'2005-07-30 18:18:42',2,'2006-02-15 21:30:53'),(8079,'2005-07-28 17:58:36',3564,432,'2005-07-29 14:48:36',2,'2006-02-15 21:30:53'),(8080,'2005-07-28 18:05:06',3035,406,'2005-07-29 22:44:06',2,'2006-02-15 21:30:53'),(8081,'2005-07-28 18:06:46',4404,362,'2005-08-04 18:54:46',1,'2006-02-15 21:30:53'),(8082,'2005-07-28 18:08:02',3089,423,'2005-08-04 14:33:02',2,'2006-02-15 21:30:53'),(8083,'2005-07-28 18:09:48',2187,30,'2005-08-04 21:47:48',2,'2006-02-15 21:30:53'),(8084,'2005-07-28 18:11:58',911,571,'2005-08-03 23:41:58',2,'2006-02-15 21:30:53'),(8085,'2005-07-28 18:13:15',3059,552,'2005-08-04 13:45:15',2,'2006-02-15 21:30:53'),(8086,'2005-07-28 18:17:14',1182,3,'2005-07-30 18:22:14',2,'2006-02-15 21:30:53'),(8087,'2005-07-28 18:21:16',1913,295,'2005-08-03 12:38:16',2,'2006-02-15 21:30:53'),(8088,'2005-07-28 18:23:49',2590,343,'2005-08-06 23:25:49',2,'2006-02-15 21:30:53'),(8089,'2005-07-28 18:26:47',1414,50,'2005-08-03 21:28:47',1,'2006-02-15 21:30:53'),(8090,'2005-07-28 18:27:29',1336,387,'2005-08-02 14:08:29',2,'2006-02-15 21:30:53'),(8091,'2005-07-28 18:27:29',3025,126,'2005-08-01 19:45:29',2,'2006-02-15 21:30:53'),(8092,'2005-07-28 18:28:07',2034,167,'2005-07-30 19:17:07',2,'2006-02-15 21:30:53'),(8093,'2005-07-28 18:29:16',1427,533,'2005-08-05 21:49:16',1,'2006-02-15 21:30:53'),(8094,'2005-07-28 18:30:28',4276,432,'2005-08-05 17:37:28',2,'2006-02-15 21:30:53'),(8095,'2005-07-28 18:32:40',2685,42,'2005-08-06 23:45:40',1,'2006-02-15 21:30:53'),(8096,'2005-07-28 18:32:46',502,506,'2005-08-06 15:00:46',1,'2006-02-15 21:30:53'),(8097,'2005-07-28 18:32:49',2719,436,'2005-08-06 16:09:49',1,'2006-02-15 21:30:53'),(8098,'2005-07-28 18:34:20',1757,41,'2005-07-31 19:07:20',2,'2006-02-15 21:30:53'),(8099,'2005-07-28 18:35:12',3694,36,'2005-07-30 15:44:12',2,'2006-02-15 21:30:53'),(8100,'2005-07-28 18:43:11',2859,11,'2005-08-02 15:56:11',2,'2006-02-15 21:30:53'),(8101,'2005-07-28 18:47:23',731,6,'2005-07-31 16:23:23',1,'2006-02-15 21:30:53'),(8102,'2005-07-28 18:49:43',4505,237,'2005-08-03 23:04:43',2,'2006-02-15 21:30:53'),(8103,'2005-07-28 18:50:14',4472,397,'2005-08-04 16:53:14',1,'2006-02-15 21:30:53'),(8104,'2005-07-28 18:59:36',1080,533,'2005-08-03 22:05:36',2,'2006-02-15 21:30:53'),(8105,'2005-07-28 18:59:46',1316,314,'2005-07-29 22:51:46',1,'2006-02-15 21:30:53'),(8106,'2005-07-28 19:02:46',963,137,'2005-07-30 20:48:46',2,'2006-02-15 21:30:53'),(8107,'2005-07-28 19:03:16',1318,518,'2005-08-05 17:18:16',2,'2006-02-15 21:30:53'),(8108,'2005-07-28 19:07:38',1600,295,'2005-08-03 15:13:38',2,'2006-02-15 21:30:53'),(8109,'2005-07-28 19:07:44',652,407,'2005-07-31 14:59:44',1,'2006-02-15 21:30:53'),(8110,'2005-07-28 19:07:45',1244,225,'2005-08-04 22:12:45',1,'2006-02-15 21:30:53'),(8111,'2005-07-28 19:10:03',3226,148,'2005-07-29 22:25:03',1,'2006-02-15 21:30:53'),(8112,'2005-07-28 19:11:07',2444,528,'2005-08-03 18:41:07',1,'2006-02-15 21:30:53'),(8113,'2005-07-28 19:14:00',4269,541,'2005-08-06 00:05:00',2,'2006-02-15 21:30:53'),(8114,'2005-07-28 19:14:06',815,509,'2005-08-05 13:16:06',1,'2006-02-15 21:30:53'),(8115,'2005-07-28 19:14:17',2080,106,'2005-08-03 14:58:17',2,'2006-02-15 21:30:53'),(8116,'2005-07-28 19:20:07',4497,1,'2005-07-29 22:54:07',1,'2006-02-15 21:30:53'),(8117,'2005-07-28 19:20:16',1502,300,'2005-08-05 23:55:16',1,'2006-02-15 21:30:53'),(8118,'2005-07-28 19:22:22',331,566,'2005-08-01 22:13:22',1,'2006-02-15 21:30:53'),(8119,'2005-07-28 19:23:15',1542,398,'2005-08-04 15:53:15',2,'2006-02-15 21:30:53'),(8120,'2005-07-28 19:24:24',3993,235,'2005-07-31 14:31:24',2,'2006-02-15 21:30:53'),(8121,'2005-07-28 19:25:45',2229,363,'2005-08-02 13:30:45',2,'2006-02-15 21:30:53'),(8122,'2005-07-28 19:27:37',2141,18,'2005-07-29 19:48:37',2,'2006-02-15 21:30:53'),(8123,'2005-07-28 19:28:23',2256,138,'2005-08-04 19:41:23',1,'2006-02-15 21:30:53'),(8124,'2005-07-28 19:28:58',1187,357,'2005-07-31 00:45:58',1,'2006-02-15 21:30:53'),(8125,'2005-07-28 19:31:48',4330,96,'2005-07-30 01:09:48',1,'2006-02-15 21:30:53'),(8126,'2005-07-28 19:32:41',719,537,'2005-08-05 00:33:41',2,'2006-02-15 21:30:53'),(8127,'2005-07-28 19:45:19',4265,20,'2005-07-31 22:07:19',2,'2006-02-15 21:30:53'),(8128,'2005-07-28 19:46:06',2872,71,'2005-08-06 16:10:06',2,'2006-02-15 21:30:53'),(8129,'2005-07-28 19:47:02',2546,345,'2005-07-31 21:33:02',2,'2006-02-15 21:30:53'),(8130,'2005-07-28 19:48:15',4055,499,'2005-08-05 14:18:15',2,'2006-02-15 21:30:53'),(8131,'2005-07-28 19:55:21',437,281,'2005-08-02 21:52:21',2,'2006-02-15 21:30:53'),(8132,'2005-07-28 19:57:31',1303,562,'2005-08-02 22:16:31',2,'2006-02-15 21:30:53'),(8133,'2005-07-28 20:01:06',849,461,'2005-08-01 20:01:06',1,'2006-02-15 21:30:53'),(8134,'2005-07-28 20:01:23',1695,41,'2005-08-03 01:00:23',2,'2006-02-15 21:30:53'),(8135,'2005-07-28 20:03:25',1339,164,'2005-08-03 01:28:25',2,'2006-02-15 21:30:53'),(8136,'2005-07-28 20:05:48',3434,429,'2005-08-01 20:31:48',2,'2006-02-15 21:30:53'),(8137,'2005-07-28 20:07:18',3188,312,'2005-08-03 17:41:18',1,'2006-02-15 21:30:53'),(8138,'2005-07-28 20:12:17',1258,371,'2005-08-01 15:21:17',2,'2006-02-15 21:30:53'),(8139,'2005-07-28 20:16:30',3651,177,'2005-08-03 18:00:30',2,'2006-02-15 21:30:53'),(8140,'2005-07-28 20:17:50',4270,119,'2005-07-30 18:07:50',1,'2006-02-15 21:30:53'),(8141,'2005-07-28 20:21:19',361,523,'2005-07-30 19:16:19',2,'2006-02-15 21:30:53'),(8142,'2005-07-28 20:21:54',1075,322,'2005-07-31 18:39:54',2,'2006-02-15 21:30:53'),(8143,'2005-07-28 20:23:11',3629,429,'2005-08-01 18:17:11',1,'2006-02-15 21:30:53'),(8144,'2005-07-28 20:30:55',3556,320,'2005-07-31 18:10:55',2,'2006-02-15 21:30:53'),(8145,'2005-07-28 20:34:41',937,198,'2005-08-05 15:28:41',2,'2006-02-15 21:30:53'),(8146,'2005-07-28 20:37:36',2430,476,'2005-07-31 16:03:36',2,'2006-02-15 21:30:53'),(8147,'2005-07-28 20:37:56',628,228,'2005-07-30 18:26:56',1,'2006-02-15 21:30:53'),(8148,'2005-07-28 20:39:47',537,347,'2005-08-02 16:29:47',1,'2006-02-15 21:30:53'),(8149,'2005-07-28 20:48:12',1790,591,'2005-08-01 20:07:12',2,'2006-02-15 21:30:53'),(8150,'2005-07-28 20:50:41',3489,497,'2005-08-02 00:43:41',1,'2006-02-15 21:30:53'),(8151,'2005-07-28 20:50:52',4370,495,'2005-07-31 14:50:52',1,'2006-02-15 21:30:53'),(8152,'2005-07-28 20:53:05',2557,46,'2005-08-06 20:03:05',2,'2006-02-15 21:30:53'),(8153,'2005-07-28 20:55:49',2173,347,'2005-08-01 15:56:49',2,'2006-02-15 21:30:53'),(8154,'2005-07-28 20:56:18',1180,285,'2005-08-01 21:56:18',2,'2006-02-15 21:30:53'),(8155,'2005-07-28 20:57:06',3023,428,'2005-08-02 18:40:06',2,'2006-02-15 21:30:53'),(8156,'2005-07-28 20:59:04',1977,257,'2005-08-01 01:52:04',1,'2006-02-15 21:30:53'),(8157,'2005-07-28 21:06:45',915,566,'2005-08-04 16:06:45',1,'2006-02-15 21:30:53'),(8158,'2005-07-28 21:08:46',4327,458,'2005-08-01 21:50:46',2,'2006-02-15 21:30:53'),(8159,'2005-07-28 21:09:28',1118,47,'2005-08-04 15:34:28',1,'2006-02-15 21:30:53'),(8160,'2005-07-28 21:10:30',2446,138,'2005-08-05 16:52:30',2,'2006-02-15 21:30:53'),(8161,'2005-07-28 21:11:00',848,555,'2005-08-03 23:32:00',1,'2006-02-15 21:30:53'),(8162,'2005-07-28 21:11:46',4393,107,'2005-08-04 18:26:46',1,'2006-02-15 21:30:53'),(8163,'2005-07-28 21:11:48',1919,157,'2005-07-31 18:30:48',1,'2006-02-15 21:30:53'),(8164,'2005-07-28 21:17:19',1674,461,'2005-07-30 21:12:19',2,'2006-02-15 21:30:53'),(8165,'2005-07-28 21:23:06',3460,197,'2005-08-01 21:32:06',1,'2006-02-15 21:30:53'),(8166,'2005-07-28 21:23:33',3906,42,'2005-08-03 21:07:33',2,'2006-02-15 21:30:53'),(8167,'2005-07-28 21:25:45',3181,311,'2005-08-04 18:04:45',1,'2006-02-15 21:30:53'),(8168,'2005-07-28 21:28:32',1120,365,'2005-07-30 02:10:32',1,'2006-02-15 21:30:53'),(8169,'2005-07-28 21:29:46',4086,366,'2005-08-06 22:29:46',1,'2006-02-15 21:30:53'),(8170,'2005-07-28 21:32:29',2495,40,'2005-08-03 22:02:29',1,'2006-02-15 21:30:53'),(8171,'2005-07-28 21:32:57',3380,296,'2005-07-30 21:19:57',1,'2006-02-15 21:30:53'),(8172,'2005-07-28 21:34:36',1237,329,'2005-08-06 23:53:36',1,'2006-02-15 21:30:53'),(8173,'2005-07-28 21:35:44',4377,332,'2005-08-06 19:15:44',2,'2006-02-15 21:30:53'),(8174,'2005-07-28 21:36:52',465,359,'2005-08-04 00:32:52',1,'2006-02-15 21:30:53'),(8175,'2005-07-28 21:38:16',641,429,'2005-08-07 01:34:16',2,'2006-02-15 21:30:53'),(8176,'2005-07-28 21:42:08',3527,347,'2005-08-03 22:59:08',2,'2006-02-15 21:30:53'),(8177,'2005-07-28 21:43:54',3696,122,'2005-08-02 22:38:54',2,'2006-02-15 21:30:53'),(8178,'2005-07-28 21:54:31',2825,503,'2005-08-02 23:56:31',2,'2006-02-15 21:30:53'),(8179,'2005-07-28 22:05:13',2902,578,'2005-07-30 21:57:13',2,'2006-02-15 21:30:53'),(8180,'2005-07-28 22:05:24',3236,281,'2005-08-01 19:09:24',1,'2006-02-15 21:30:53'),(8181,'2005-07-28 22:18:38',357,522,'2005-08-06 02:43:38',2,'2006-02-15 21:30:53'),(8182,'2005-07-28 22:19:12',4120,427,'2005-08-01 22:40:12',2,'2006-02-15 21:30:53'),(8183,'2005-07-28 22:21:07',1545,119,'2005-08-04 19:20:07',2,'2006-02-15 21:30:53'),(8184,'2005-07-28 22:22:35',1249,160,'2005-07-31 19:30:35',1,'2006-02-15 21:30:53'),(8185,'2005-07-28 22:23:49',2452,568,'2005-07-31 00:07:49',1,'2006-02-15 21:30:53'),(8186,'2005-07-28 22:30:27',4255,102,'2005-07-31 21:08:27',1,'2006-02-15 21:30:53'),(8187,'2005-07-28 22:33:53',945,87,'2005-08-03 03:54:53',1,'2006-02-15 21:30:53'),(8188,'2005-07-28 22:34:12',3826,10,'2005-08-01 02:32:12',2,'2006-02-15 21:30:53'),(8189,'2005-07-28 22:36:26',3515,361,'2005-08-04 00:12:26',2,'2006-02-15 21:30:53'),(8190,'2005-07-28 22:47:06',2290,267,'2005-08-04 21:51:06',1,'2006-02-15 21:30:53'),(8191,'2005-07-28 22:47:14',1777,508,'2005-07-31 23:13:14',2,'2006-02-15 21:30:53'),(8192,'2005-07-28 22:49:11',255,552,'2005-07-30 04:13:11',1,'2006-02-15 21:30:53'),(8193,'2005-07-28 22:50:50',2402,15,'2005-08-01 04:14:50',2,'2006-02-15 21:30:53'),(8194,'2005-07-28 22:51:44',1148,424,'2005-07-29 17:13:44',1,'2006-02-15 21:30:53'),(8195,'2005-07-28 22:52:58',3989,590,'2005-08-04 02:12:58',1,'2006-02-15 21:30:53'),(8196,'2005-07-28 22:56:11',3435,21,'2005-08-06 04:53:11',1,'2006-02-15 21:30:53'),(8197,'2005-07-28 23:04:10',4126,407,'2005-08-05 00:06:10',2,'2006-02-15 21:30:53'),(8198,'2005-07-28 23:08:05',1767,356,'2005-08-06 00:43:05',2,'2006-02-15 21:30:53'),(8199,'2005-07-28 23:10:25',404,471,'2005-08-04 23:30:25',1,'2006-02-15 21:30:53'),(8200,'2005-07-28 23:10:46',353,185,'2005-07-29 18:35:46',1,'2006-02-15 21:30:53'),(8201,'2005-07-28 23:10:48',220,567,'2005-08-01 00:50:48',2,'2006-02-15 21:30:53'),(8202,'2005-07-28 23:11:45',3802,75,'2005-08-03 21:57:45',2,'2006-02-15 21:30:53'),(8203,'2005-07-28 23:14:56',3878,100,'2005-07-31 04:19:56',2,'2006-02-15 21:30:53'),(8204,'2005-07-28 23:18:29',2472,398,'2005-08-02 04:49:29',1,'2006-02-15 21:30:53'),(8205,'2005-07-28 23:18:48',2944,434,'2005-07-30 00:37:48',2,'2006-02-15 21:30:53'),(8206,'2005-07-28 23:20:31',2979,422,'2005-08-04 21:36:31',1,'2006-02-15 21:30:53'),(8207,'2005-07-28 23:26:31',1195,475,'2005-08-06 03:26:31',1,'2006-02-15 21:30:53'),(8208,'2005-07-28 23:26:35',1362,530,'2005-08-01 23:00:35',2,'2006-02-15 21:30:53'),(8209,'2005-07-28 23:29:28',2484,127,'2005-08-07 04:22:28',2,'2006-02-15 21:30:53'),(8210,'2005-07-28 23:31:05',3424,300,'2005-08-06 17:36:05',1,'2006-02-15 21:30:53'),(8211,'2005-07-28 23:34:22',1859,193,'2005-08-04 21:18:22',1,'2006-02-15 21:30:53'),(8212,'2005-07-28 23:37:23',1305,159,'2005-08-04 04:33:23',2,'2006-02-15 21:30:53'),(8213,'2005-07-28 23:37:33',3816,17,'2005-07-31 00:32:33',2,'2006-02-15 21:30:53'),(8214,'2005-07-28 23:37:57',352,509,'2005-08-07 00:29:57',2,'2006-02-15 21:30:53'),(8215,'2005-07-28 23:43:56',2921,437,'2005-08-03 19:30:56',2,'2006-02-15 21:30:53'),(8216,'2005-07-28 23:43:59',2211,254,'2005-08-06 05:05:59',1,'2006-02-15 21:30:53'),(8217,'2005-07-28 23:44:13',3747,206,'2005-08-03 21:27:13',2,'2006-02-15 21:30:53'),(8218,'2005-07-28 23:45:41',2769,578,'2005-08-02 00:14:41',1,'2006-02-15 21:30:53'),(8219,'2005-07-28 23:46:31',3609,227,'2005-08-03 00:11:31',2,'2006-02-15 21:30:53'),(8220,'2005-07-28 23:46:41',1061,360,'2005-07-31 22:14:41',2,'2006-02-15 21:30:53'),(8221,'2005-07-28 23:47:19',3138,496,'2005-08-02 20:42:19',1,'2006-02-15 21:30:53'),(8222,'2005-07-28 23:51:53',2999,278,'2005-08-05 22:48:53',1,'2006-02-15 21:30:53'),(8223,'2005-07-28 23:56:01',4508,282,'2005-08-03 22:27:01',1,'2006-02-15 21:30:53'),(8224,'2005-07-28 23:59:02',1995,467,'2005-08-02 04:54:02',1,'2006-02-15 21:30:53'),(8225,'2005-07-28 23:59:29',3631,41,'2005-07-30 03:27:29',2,'2006-02-15 21:30:53'),(8226,'2005-07-29 00:01:04',3541,368,'2005-08-01 19:08:04',2,'2006-02-15 21:30:53'),(8227,'2005-07-29 00:02:22',269,167,'2005-07-31 04:05:22',1,'2006-02-15 21:30:53'),(8228,'2005-07-29 00:08:58',1955,72,'2005-08-03 00:12:58',2,'2006-02-15 21:30:53'),(8229,'2005-07-29 00:09:08',4272,498,'2005-07-31 19:29:08',2,'2006-02-15 21:30:53'),(8230,'2005-07-29 00:12:59',1937,2,'2005-08-06 19:52:59',2,'2006-02-15 21:30:53'),(8231,'2005-07-29 00:14:37',1083,331,'2005-07-31 19:12:37',1,'2006-02-15 21:30:53'),(8232,'2005-07-29 00:14:37',3255,526,'2005-08-06 00:57:37',1,'2006-02-15 21:30:53'),(8233,'2005-07-29 00:16:23',1640,93,'2005-08-03 05:17:23',2,'2006-02-15 21:30:53'),(8234,'2005-07-29 00:19:20',644,227,'2005-08-03 19:16:20',2,'2006-02-15 21:30:53'),(8235,'2005-07-29 00:22:56',1581,320,'2005-08-03 04:03:56',2,'2006-02-15 21:30:53'),(8236,'2005-07-29 00:27:04',1901,369,'2005-07-31 05:02:04',2,'2006-02-15 21:30:53'),(8237,'2005-07-29 00:29:56',608,441,'2005-08-06 03:10:56',1,'2006-02-15 21:30:53'),(8238,'2005-07-29 00:30:06',2941,320,'2005-08-02 22:52:06',2,'2006-02-15 21:30:53'),(8239,'2005-07-29 00:31:39',3951,549,'2005-07-29 19:33:39',1,'2006-02-15 21:30:53'),(8240,'2005-07-29 00:33:32',1975,509,'2005-08-05 21:25:32',2,'2006-02-15 21:30:53'),(8241,'2005-07-29 00:33:36',4297,26,'2005-08-03 01:31:36',1,'2006-02-15 21:30:53'),(8242,'2005-07-29 00:34:27',509,99,'2005-08-05 23:13:27',2,'2006-02-15 21:30:53'),(8243,'2005-07-29 00:35:33',1873,481,'2005-08-04 06:02:33',2,'2006-02-15 21:30:53'),(8244,'2005-07-29 00:35:34',1552,175,'2005-08-05 04:18:34',2,'2006-02-15 21:30:53'),(8245,'2005-07-29 00:37:09',3330,555,'2005-08-05 05:48:09',2,'2006-02-15 21:30:53'),(8246,'2005-07-29 00:38:41',1724,146,'2005-08-05 06:28:41',2,'2006-02-15 21:30:53'),(8247,'2005-07-29 00:41:38',2607,539,'2005-08-06 20:29:38',2,'2006-02-15 21:30:53'),(8248,'2005-07-29 00:41:56',2017,272,'2005-08-05 18:53:56',2,'2006-02-15 21:30:53'),(8249,'2005-07-29 00:48:44',3331,57,'2005-08-07 04:25:44',2,'2006-02-15 21:30:53'),(8250,'2005-07-29 00:49:15',4519,533,'2005-08-04 02:53:15',1,'2006-02-15 21:30:53'),(8251,'2005-07-29 00:50:14',2317,408,'2005-08-03 23:52:14',2,'2006-02-15 21:30:53'),(8252,'2005-07-29 00:54:17',3312,257,'2005-07-31 20:34:17',1,'2006-02-15 21:30:53'),(8253,'2005-07-29 00:57:06',2388,76,'2005-08-07 01:46:06',1,'2006-02-15 21:30:53'),(8254,'2005-07-29 00:59:31',1787,392,'2005-08-03 23:43:31',2,'2006-02-15 21:30:53'),(8255,'2005-07-29 01:02:30',3715,224,'2005-08-01 22:39:30',1,'2006-02-15 21:30:53'),(8256,'2005-07-29 01:02:42',1483,537,'2005-07-31 22:29:42',2,'2006-02-15 21:30:53'),(8257,'2005-07-29 01:03:20',3024,566,'2005-08-04 21:54:20',1,'2006-02-15 21:30:53'),(8258,'2005-07-29 01:03:42',1379,370,'2005-08-04 22:08:42',2,'2006-02-15 21:30:53'),(8259,'2005-07-29 01:05:16',343,274,'2005-08-01 23:27:16',2,'2006-02-15 21:30:53'),(8260,'2005-07-29 01:11:00',4249,366,'2005-08-06 00:36:00',1,'2006-02-15 21:30:53'),(8261,'2005-07-29 01:11:05',1915,50,'2005-08-04 03:13:05',2,'2006-02-15 21:30:53'),(8262,'2005-07-29 01:11:18',1341,563,'2005-08-02 05:17:18',2,'2006-02-15 21:30:53'),(8263,'2005-07-29 01:11:23',28,5,'2005-07-31 01:53:23',2,'2006-02-15 21:30:53'),(8264,'2005-07-29 01:18:50',2987,175,'2005-08-03 05:31:50',2,'2006-02-15 21:30:53'),(8265,'2005-07-29 01:20:15',2389,409,'2005-08-06 19:32:15',2,'2006-02-15 21:30:53'),(8266,'2005-07-29 01:20:16',1972,196,'2005-07-30 04:31:16',1,'2006-02-15 21:30:53'),(8267,'2005-07-29 01:21:02',4107,131,'2005-08-04 19:34:02',2,'2006-02-15 21:30:53'),(8268,'2005-07-29 01:23:23',4239,421,'2005-08-05 01:36:23',1,'2006-02-15 21:30:53'),(8269,'2005-07-29 01:26:54',2778,376,'2005-08-04 22:42:54',1,'2006-02-15 21:30:53'),(8270,'2005-07-29 01:27:22',3565,282,'2005-07-29 20:55:22',1,'2006-02-15 21:30:53'),(8271,'2005-07-29 01:27:44',83,481,'2005-08-07 05:01:44',2,'2006-02-15 21:30:53'),(8272,'2005-07-29 01:29:51',70,346,'2005-08-03 21:56:51',2,'2006-02-15 21:30:53'),(8273,'2005-07-29 01:33:16',4244,532,'2005-08-06 04:26:16',2,'2006-02-15 21:30:53'),(8274,'2005-07-29 01:34:32',2634,340,'2005-08-01 20:15:32',2,'2006-02-15 21:30:53'),(8275,'2005-07-29 01:35:47',4432,336,'2005-07-30 02:16:47',1,'2006-02-15 21:30:53'),(8276,'2005-07-29 01:38:43',2451,466,'2005-08-03 23:00:43',1,'2006-02-15 21:30:53'),(8277,'2005-07-29 01:38:53',1296,13,'2005-08-04 07:09:53',2,'2006-02-15 21:30:53'),(8278,'2005-07-29 01:42:55',768,265,'2005-08-05 01:55:55',2,'2006-02-15 21:30:53'),(8279,'2005-07-29 01:43:37',3838,176,'2005-08-03 02:36:37',1,'2006-02-15 21:30:53'),(8280,'2005-07-29 01:45:51',1208,195,'2005-08-05 22:51:51',2,'2006-02-15 21:30:53'),(8281,'2005-07-29 01:46:00',899,441,'2005-08-04 23:09:00',1,'2006-02-15 21:30:53'),(8282,'2005-07-29 01:49:04',980,462,'2005-08-05 01:51:04',2,'2006-02-15 21:30:53'),(8283,'2005-07-29 01:52:22',2002,300,'2005-08-05 03:22:22',2,'2006-02-15 21:30:53'),(8284,'2005-07-29 01:56:40',4371,446,'2005-08-07 07:15:40',2,'2006-02-15 21:30:53'),(8285,'2005-07-29 02:00:18',678,56,'2005-08-03 20:43:18',2,'2006-02-15 21:30:53'),(8286,'2005-07-29 02:02:46',4092,87,'2005-08-06 06:00:46',1,'2006-02-15 21:30:53'),(8287,'2005-07-29 02:03:58',812,178,'2005-08-07 02:11:58',1,'2006-02-15 21:30:53'),(8288,'2005-07-29 02:04:22',1822,55,'2005-08-05 04:21:22',2,'2006-02-15 21:30:53'),(8289,'2005-07-29 02:23:24',4579,459,'2005-08-06 03:23:24',2,'2006-02-15 21:30:53'),(8290,'2005-07-29 02:24:08',3823,462,'2005-08-03 01:02:08',2,'2006-02-15 21:30:53'),(8291,'2005-07-29 02:28:25',2817,455,'2005-08-03 20:57:25',2,'2006-02-15 21:30:53'),(8292,'2005-07-29 02:29:36',4003,192,'2005-08-07 08:06:36',1,'2006-02-15 21:30:53'),(8293,'2005-07-29 02:30:50',831,71,'2005-08-04 03:09:50',2,'2006-02-15 21:30:53'),(8294,'2005-07-29 02:32:41',1811,520,'2005-08-02 06:28:41',1,'2006-02-15 21:30:53'),(8295,'2005-07-29 02:42:14',2065,406,'2005-07-30 22:22:14',1,'2006-02-15 21:30:53'),(8296,'2005-07-29 02:43:25',2543,88,'2005-08-01 00:23:25',1,'2006-02-15 21:30:53'),(8297,'2005-07-29 02:45:46',3774,349,'2005-07-31 20:49:46',1,'2006-02-15 21:30:53'),(8298,'2005-07-29 02:47:36',952,493,'2005-08-05 07:58:36',2,'2006-02-15 21:30:53'),(8299,'2005-07-29 02:56:00',1797,173,'2005-07-30 22:35:00',2,'2006-02-15 21:30:53'),(8300,'2005-07-29 02:57:59',4364,222,'2005-08-05 01:12:59',2,'2006-02-15 21:30:53'),(8301,'2005-07-29 03:00:08',562,101,'2005-08-01 04:26:08',2,'2006-02-15 21:30:53'),(8302,'2005-07-29 03:01:24',1314,103,'2005-07-30 01:08:24',2,'2006-02-15 21:30:53'),(8303,'2005-07-29 03:05:56',1620,574,'2005-08-04 06:13:56',1,'2006-02-15 21:30:53'),(8304,'2005-07-29 03:08:30',4431,119,'2005-08-02 03:04:30',2,'2006-02-15 21:30:53'),(8305,'2005-07-29 03:08:47',3916,566,'2005-08-06 07:49:47',2,'2006-02-15 21:30:53'),(8306,'2005-07-29 03:12:26',1708,232,'2005-08-01 23:26:26',1,'2006-02-15 21:30:53'),(8307,'2005-07-29 03:18:34',3197,39,'2005-08-06 05:51:34',2,'2006-02-15 21:30:53'),(8308,'2005-07-29 03:22:15',601,582,'2005-08-04 21:38:15',2,'2006-02-15 21:30:53'),(8309,'2005-07-29 03:22:20',2250,446,'2005-08-01 06:30:20',1,'2006-02-15 21:30:53'),(8310,'2005-07-29 03:25:56',2637,238,'2005-08-06 23:18:56',2,'2006-02-15 21:30:53'),(8311,'2005-07-29 03:26:07',3623,63,'2005-08-02 01:46:07',1,'2006-02-15 21:30:53'),(8312,'2005-07-29 03:32:38',3996,143,'2005-07-31 02:12:38',1,'2006-02-15 21:30:53'),(8313,'2005-07-29 03:34:21',2736,91,'2005-08-02 01:32:21',1,'2006-02-15 21:30:53'),(8314,'2005-07-29 03:35:04',2182,118,'2005-08-06 08:43:04',2,'2006-02-15 21:30:53'),(8315,'2005-07-29 03:37:07',1420,135,'2005-07-29 23:22:07',2,'2006-02-15 21:30:53'),(8316,'2005-07-29 03:38:49',4118,549,'2005-08-03 07:41:49',1,'2006-02-15 21:30:53'),(8317,'2005-07-29 03:39:07',3898,415,'2005-08-03 00:14:07',1,'2006-02-15 21:30:53'),(8318,'2005-07-29 03:44:30',4524,167,'2005-07-30 05:03:30',2,'2006-02-15 21:30:53'),(8319,'2005-07-29 03:44:52',747,280,'2005-08-01 00:35:52',2,'2006-02-15 21:30:53'),(8320,'2005-07-29 03:49:58',1285,513,'2005-08-03 01:00:58',1,'2006-02-15 21:30:53'),(8321,'2005-07-29 03:50:54',1875,354,'2005-08-01 02:08:54',1,'2006-02-15 21:30:53'),(8322,'2005-07-29 03:52:49',301,541,'2005-08-02 22:53:49',1,'2006-02-15 21:30:53'),(8323,'2005-07-29 03:52:59',2766,87,'2005-08-06 01:49:59',2,'2006-02-15 21:30:53'),(8324,'2005-07-29 03:56:05',1467,98,'2005-08-02 01:41:05',1,'2006-02-15 21:30:53'),(8325,'2005-07-29 03:57:27',932,362,'2005-08-06 22:30:27',1,'2006-02-15 21:30:53'),(8326,'2005-07-29 03:58:49',108,1,'2005-08-01 05:16:49',2,'2006-02-15 21:30:53'),(8327,'2005-07-29 04:00:52',2928,317,'2005-07-31 08:27:52',1,'2006-02-15 21:30:53'),(8328,'2005-07-29 04:06:24',4454,314,'2005-08-03 22:24:24',1,'2006-02-15 21:30:53'),(8329,'2005-07-29 04:06:33',3468,108,'2005-08-06 01:46:33',1,'2006-02-15 21:30:53'),(8330,'2005-07-29 04:09:07',2294,412,'2005-08-05 05:00:07',2,'2006-02-15 21:30:53'),(8331,'2005-07-29 04:13:29',18,148,'2005-08-04 07:09:29',1,'2006-02-15 21:30:53'),(8332,'2005-07-29 04:16:00',1142,217,'2005-08-03 03:34:00',1,'2006-02-15 21:30:53'),(8333,'2005-07-29 04:16:40',823,494,'2005-08-02 10:10:40',2,'2006-02-15 21:30:53'),(8334,'2005-07-29 04:18:25',982,154,'2005-08-07 07:18:25',2,'2006-02-15 21:30:53'),(8335,'2005-07-29 04:18:25',1719,143,'2005-07-31 08:12:25',2,'2006-02-15 21:30:53'),(8336,'2005-07-29 04:20:42',2120,210,'2005-08-05 10:17:42',1,'2006-02-15 21:30:53'),(8337,'2005-07-29 04:31:55',752,157,'2005-08-02 02:38:55',2,'2006-02-15 21:30:53'),(8338,'2005-07-29 04:40:39',2257,389,'2005-08-07 04:40:39',2,'2006-02-15 21:30:53'),(8339,'2005-07-29 04:41:13',1870,129,'2005-07-30 09:01:13',2,'2006-02-15 21:30:53'),(8340,'2005-07-29 04:41:44',1553,386,'2005-08-07 10:33:44',1,'2006-02-15 21:30:53'),(8341,'2005-07-29 04:42:01',4208,309,'2005-08-04 00:58:01',1,'2006-02-15 21:30:53'),(8342,'2005-07-29 04:45:05',3301,572,'2005-08-01 07:20:05',1,'2006-02-15 21:30:53'),(8343,'2005-07-29 04:45:16',4267,439,'2005-08-02 03:37:16',1,'2006-02-15 21:30:53'),(8344,'2005-07-29 04:45:25',221,257,'2005-08-06 01:53:25',1,'2006-02-15 21:30:53'),(8345,'2005-07-29 04:47:37',1034,129,'2005-08-02 07:25:37',1,'2006-02-15 21:30:53'),(8346,'2005-07-29 04:48:22',2475,385,'2005-08-01 04:22:22',1,'2006-02-15 21:30:53'),(8347,'2005-07-29 04:49:25',4407,157,'2005-07-31 00:57:25',2,'2006-02-15 21:30:53'),(8348,'2005-07-29 04:49:26',4533,174,'2005-08-05 03:26:26',2,'2006-02-15 21:30:53'),(8349,'2005-07-29 04:50:22',534,416,'2005-08-05 08:50:22',1,'2006-02-15 21:30:53'),(8350,'2005-07-29 04:50:39',3726,513,'2005-07-31 05:36:39',2,'2006-02-15 21:30:53'),(8351,'2005-07-29 04:50:53',2963,202,'2005-07-30 07:28:53',2,'2006-02-15 21:30:53'),(8352,'2005-07-29 04:52:01',2710,168,'2005-08-06 07:39:01',2,'2006-02-15 21:30:53'),(8353,'2005-07-29 04:52:10',26,585,'2005-07-30 04:01:10',1,'2006-02-15 21:30:53'),(8354,'2005-07-29 04:56:26',4476,579,'2005-08-01 08:04:26',2,'2006-02-15 21:30:53'),(8355,'2005-07-29 04:57:43',4569,270,'2005-08-03 06:25:43',1,'2006-02-15 21:30:53'),(8356,'2005-07-29 04:58:56',2951,483,'2005-08-06 03:07:56',1,'2006-02-15 21:30:53'),(8357,'2005-07-29 04:59:44',892,76,'2005-08-01 04:26:44',1,'2006-02-15 21:30:53'),(8358,'2005-07-29 05:00:58',1449,372,'2005-08-01 02:49:58',2,'2006-02-15 21:30:53'),(8359,'2005-07-29 05:02:12',140,531,'2005-08-04 08:52:12',1,'2006-02-15 21:30:53'),(8360,'2005-07-29 05:08:00',4135,62,'2005-08-02 00:40:00',1,'2006-02-15 21:30:53'),(8361,'2005-07-29 05:08:57',3404,360,'2005-08-03 02:49:57',1,'2006-02-15 21:30:53'),(8362,'2005-07-29 05:09:11',2287,223,'2005-08-04 00:08:11',2,'2006-02-15 21:30:53'),(8363,'2005-07-29 05:10:08',1607,302,'2005-08-06 00:11:08',1,'2006-02-15 21:30:53'),(8364,'2005-07-29 05:10:31',1361,362,'2005-07-30 04:02:31',2,'2006-02-15 21:30:53'),(8365,'2005-07-29 05:11:00',53,280,'2005-07-30 05:30:00',2,'2006-02-15 21:30:53'),(8366,'2005-07-29 05:11:14',479,39,'2005-08-05 01:48:14',1,'2006-02-15 21:30:53'),(8367,'2005-07-29 05:11:19',4551,383,'2005-08-02 00:35:19',1,'2006-02-15 21:30:53'),(8368,'2005-07-29 05:15:41',1410,200,'2005-08-07 01:35:41',1,'2006-02-15 21:30:53'),(8369,'2005-07-29 05:15:42',1456,507,'2005-08-01 03:36:42',2,'2006-02-15 21:30:53'),(8370,'2005-07-29 05:16:21',1206,121,'2005-08-06 23:16:21',1,'2006-02-15 21:30:53'),(8371,'2005-07-29 05:16:35',2466,396,'2005-07-31 01:49:35',1,'2006-02-15 21:30:53'),(8372,'2005-07-29 05:18:08',754,523,'2005-08-06 09:39:08',1,'2006-02-15 21:30:53'),(8373,'2005-07-29 05:19:53',2070,457,'2005-08-04 04:39:53',1,'2006-02-15 21:30:53'),(8374,'2005-07-29 05:24:02',1084,589,'2005-08-05 03:55:02',1,'2006-02-15 21:30:53'),(8375,'2005-07-29 05:25:30',3634,125,'2005-08-04 01:43:30',2,'2006-02-15 21:30:53'),(8376,'2005-07-29 05:25:32',3588,43,'2005-08-01 07:42:32',2,'2006-02-15 21:30:53'),(8377,'2005-07-29 05:27:40',270,73,'2005-07-30 02:52:40',2,'2006-02-15 21:30:53'),(8378,'2005-07-29 05:28:35',3500,347,'2005-08-02 05:55:35',1,'2006-02-15 21:30:53'),(8379,'2005-07-29 05:29:40',3907,193,'2005-08-06 05:56:40',2,'2006-02-15 21:30:53'),(8380,'2005-07-29 05:31:29',2279,145,'2005-08-02 01:27:29',1,'2006-02-15 21:30:53'),(8381,'2005-07-29 05:31:44',865,313,'2005-07-31 09:20:44',1,'2006-02-15 21:30:53'),(8382,'2005-07-29 05:33:21',317,238,'2005-08-03 03:38:21',1,'2006-02-15 21:30:53'),(8383,'2005-07-29 05:36:47',3809,495,'2005-08-03 05:53:47',2,'2006-02-15 21:30:53'),(8384,'2005-07-29 05:38:43',3807,227,'2005-08-01 07:31:43',2,'2006-02-15 21:30:53'),(8385,'2005-07-29 05:39:16',4108,233,'2005-08-03 00:30:16',1,'2006-02-15 21:30:53'),(8386,'2005-07-29 05:45:30',388,435,'2005-08-05 03:56:30',2,'2006-02-15 21:30:53'),(8387,'2005-07-29 05:47:27',910,428,'2005-07-31 06:26:27',1,'2006-02-15 21:30:53'),(8388,'2005-07-29 05:48:15',770,178,'2005-08-05 06:24:15',2,'2006-02-15 21:30:53'),(8389,'2005-07-29 05:50:09',1241,133,'2005-08-06 05:15:09',2,'2006-02-15 21:30:53'),(8390,'2005-07-29 05:52:26',581,32,'2005-08-04 08:12:26',2,'2006-02-15 21:30:53'),(8391,'2005-07-29 05:52:50',2134,36,'2005-08-03 04:45:50',2,'2006-02-15 21:30:53'),(8392,'2005-07-29 06:00:27',1323,65,'2005-08-02 00:30:27',2,'2006-02-15 21:30:53'),(8393,'2005-07-29 06:02:11',3369,504,'2005-08-07 03:23:11',1,'2006-02-15 21:30:53'),(8394,'2005-07-29 06:02:14',3933,148,'2005-08-03 08:15:14',1,'2006-02-15 21:30:53'),(8395,'2005-07-29 06:03:30',1471,535,'2005-07-31 09:08:30',2,'2006-02-15 21:30:53'),(8396,'2005-07-29 06:07:00',3911,516,'2005-07-30 05:32:00',2,'2006-02-15 21:30:53'),(8397,'2005-07-29 06:09:35',3542,518,'2005-08-01 02:08:35',1,'2006-02-15 21:30:53'),(8398,'2005-07-29 06:12:40',348,220,'2005-08-02 05:01:40',2,'2006-02-15 21:30:53'),(8399,'2005-07-29 06:20:18',233,286,'2005-08-04 01:26:18',1,'2006-02-15 21:30:53'),(8400,'2005-07-29 06:23:56',3680,573,'2005-07-31 02:41:56',2,'2006-02-15 21:30:53'),(8401,'2005-07-29 06:25:08',3121,232,'2005-08-01 06:49:08',1,'2006-02-15 21:30:53'),(8402,'2005-07-29 06:25:45',186,47,'2005-08-07 10:48:45',1,'2006-02-15 21:30:53'),(8403,'2005-07-29 06:26:39',1360,163,'2005-08-02 05:37:39',1,'2006-02-15 21:30:53'),(8404,'2005-07-29 06:27:01',2086,65,'2005-08-07 04:33:01',1,'2006-02-15 21:30:53'),(8405,'2005-07-29 06:28:19',2164,76,'2005-08-07 08:14:19',2,'2006-02-15 21:30:53'),(8406,'2005-07-29 06:34:45',2047,274,'2005-08-06 02:28:45',1,'2006-02-15 21:30:53'),(8407,'2005-07-29 06:37:02',2985,336,'2005-08-04 03:13:02',1,'2006-02-15 21:30:53'),(8408,'2005-07-29 06:40:40',1841,90,'2005-07-30 10:02:40',2,'2006-02-15 21:30:53'),(8409,'2005-07-29 06:41:22',4314,303,'2005-07-31 11:21:22',1,'2006-02-15 21:30:53'),(8410,'2005-07-29 06:41:36',3448,277,'2005-08-02 08:38:36',1,'2006-02-15 21:30:53'),(8411,'2005-07-29 06:44:23',3085,412,'2005-08-07 03:56:23',1,'2006-02-15 21:30:53'),(8412,'2005-07-29 06:44:50',743,312,'2005-08-06 05:04:50',1,'2006-02-15 21:30:53'),(8413,'2005-07-29 06:47:39',2762,104,'2005-08-02 09:15:39',2,'2006-02-15 21:30:53'),(8414,'2005-07-29 06:48:35',1337,433,'2005-08-06 10:54:35',2,'2006-02-15 21:30:53'),(8415,'2005-07-29 06:52:27',2903,128,'2005-08-02 10:40:27',1,'2006-02-15 21:30:53'),(8416,'2005-07-29 06:52:54',1999,315,'2005-08-05 09:50:54',2,'2006-02-15 21:30:53'),(8417,'2005-07-29 06:53:36',750,227,'2005-08-06 09:31:36',2,'2006-02-15 21:30:53'),(8418,'2005-07-29 06:54:21',3081,355,'2005-08-05 06:50:21',2,'2006-02-15 21:30:53'),(8419,'2005-07-29 06:54:48',4574,37,'2005-08-06 05:02:48',1,'2006-02-15 21:30:53'),(8420,'2005-07-29 07:00:45',4184,376,'2005-08-06 02:20:45',1,'2006-02-15 21:30:53'),(8421,'2005-07-29 07:00:47',3399,588,'2005-08-02 08:03:47',2,'2006-02-15 21:30:53'),(8422,'2005-07-29 07:02:55',3104,7,'2005-08-03 12:35:55',1,'2006-02-15 21:30:53'),(8423,'2005-07-29 07:02:57',187,468,'2005-08-06 04:59:57',1,'2006-02-15 21:30:53'),(8424,'2005-07-29 07:06:03',366,138,'2005-08-06 12:00:03',2,'2006-02-15 21:30:53'),(8425,'2005-07-29 07:06:21',3491,486,'2005-08-05 07:57:21',2,'2006-02-15 21:30:53'),(8426,'2005-07-29 07:07:48',1840,564,'2005-08-07 08:56:48',2,'2006-02-15 21:30:53'),(8427,'2005-07-29 07:08:36',1624,441,'2005-07-30 11:54:36',2,'2006-02-15 21:30:53'),(8428,'2005-07-29 07:10:14',2545,398,'2005-08-06 02:29:14',2,'2006-02-15 21:30:53'),(8429,'2005-07-29 07:11:49',2456,588,'2005-07-31 02:45:49',1,'2006-02-15 21:30:53'),(8430,'2005-07-29 07:12:17',3377,219,'2005-08-03 09:53:17',2,'2006-02-15 21:30:53'),(8431,'2005-07-29 07:12:48',1583,193,'2005-08-01 10:03:48',1,'2006-02-15 21:30:53'),(8432,'2005-07-29 07:13:33',3896,572,'2005-07-30 03:14:33',1,'2006-02-15 21:30:53'),(8433,'2005-07-29 07:19:16',1957,125,'2005-08-05 03:29:16',1,'2006-02-15 21:30:53'),(8434,'2005-07-29 07:20:14',40,141,'2005-07-30 08:50:14',2,'2006-02-15 21:30:53'),(8435,'2005-07-29 07:20:16',4462,520,'2005-08-02 09:54:16',2,'2006-02-15 21:30:53'),(8436,'2005-07-29 07:21:20',2702,598,'2005-07-31 12:56:20',2,'2006-02-15 21:30:53'),(8437,'2005-07-29 07:23:43',2118,96,'2005-08-04 10:52:43',1,'2006-02-15 21:30:53'),(8438,'2005-07-29 07:25:42',720,97,'2005-08-04 07:39:42',1,'2006-02-15 21:30:53'),(8439,'2005-07-29 07:28:43',182,224,'2005-08-04 11:22:43',1,'2006-02-15 21:30:53'),(8440,'2005-07-29 07:31:26',489,175,'2005-08-04 07:04:26',1,'2006-02-15 21:30:53'),(8441,'2005-07-29 07:33:05',1000,526,'2005-08-04 04:00:05',2,'2006-02-15 21:30:53'),(8442,'2005-07-29 07:33:07',4345,185,'2005-08-03 03:09:07',2,'2006-02-15 21:30:53'),(8443,'2005-07-29 07:33:12',1059,251,'2005-08-02 01:36:12',2,'2006-02-15 21:30:53'),(8444,'2005-07-29 07:36:13',3329,213,'2005-08-05 04:55:13',1,'2006-02-15 21:30:53'),(8445,'2005-07-29 07:37:48',2792,384,'2005-08-04 10:43:48',1,'2006-02-15 21:30:53'),(8446,'2005-07-29 07:38:10',1593,235,'2005-08-06 04:39:10',2,'2006-02-15 21:30:53'),(8447,'2005-07-29 07:38:14',930,11,'2005-08-05 02:27:14',2,'2006-02-15 21:30:53'),(8448,'2005-07-29 07:41:54',4349,393,'2005-08-02 13:12:54',1,'2006-02-15 21:30:53'),(8449,'2005-07-29 07:42:25',2610,273,'2005-07-30 06:07:25',2,'2006-02-15 21:30:53'),(8450,'2005-07-29 07:44:05',484,401,'2005-08-01 12:23:05',1,'2006-02-15 21:30:53'),(8451,'2005-07-29 07:44:56',3309,495,'2005-08-06 02:29:56',1,'2006-02-15 21:30:53'),(8452,'2005-07-29 07:45:00',4312,16,'2005-08-05 09:46:00',2,'2006-02-15 21:30:53'),(8453,'2005-07-29 07:46:29',2907,32,'2005-07-30 07:07:29',1,'2006-02-15 21:30:53'),(8454,'2005-07-29 07:49:04',159,244,'2005-08-03 04:43:04',2,'2006-02-15 21:30:53'),(8455,'2005-07-29 07:53:06',4043,404,'2005-08-05 05:29:06',1,'2006-02-15 21:30:53'),(8456,'2005-07-29 07:58:31',671,388,'2005-08-05 07:17:31',2,'2006-02-15 21:30:53'),(8457,'2005-07-29 07:59:03',3371,239,'2005-08-04 08:42:03',1,'2006-02-15 21:30:53'),(8458,'2005-07-29 08:05:09',3857,317,'2005-08-02 03:42:09',1,'2006-02-15 21:30:53'),(8459,'2005-07-29 08:05:40',3441,144,'2005-08-04 03:24:40',1,'2006-02-15 21:30:53'),(8460,'2005-07-29 08:08:03',2826,329,'2005-08-07 06:53:03',2,'2006-02-15 21:30:53'),(8461,'2005-07-29 08:11:31',3373,399,'2005-08-06 09:23:31',1,'2006-02-15 21:30:53'),(8462,'2005-07-29 08:15:42',3633,200,'2005-08-04 03:57:42',1,'2006-02-15 21:30:53'),(8463,'2005-07-29 08:17:51',466,203,'2005-08-03 13:41:51',1,'2006-02-15 21:30:53'),(8464,'2005-07-29 08:18:20',2343,28,'2005-08-03 04:50:20',2,'2006-02-15 21:30:53'),(8465,'2005-07-29 08:20:49',4109,238,'2005-07-31 04:02:49',2,'2006-02-15 21:30:53'),(8466,'2005-07-29 08:24:47',4010,285,'2005-07-31 03:43:47',1,'2006-02-15 21:30:53'),(8467,'2005-07-29 08:25:35',263,326,'2005-08-07 03:28:35',2,'2006-02-15 21:30:53'),(8468,'2005-07-29 08:26:04',1338,282,'2005-08-02 07:18:04',1,'2006-02-15 21:30:53'),(8469,'2005-07-29 08:26:27',2754,408,'2005-08-05 04:26:27',2,'2006-02-15 21:30:53'),(8470,'2005-07-29 08:28:50',3717,159,'2005-07-30 13:40:50',2,'2006-02-15 21:30:53'),(8471,'2005-07-29 08:32:11',1520,533,'2005-08-01 13:55:11',1,'2006-02-15 21:30:53'),(8472,'2005-07-29 08:36:22',2975,196,'2005-08-02 07:55:22',1,'2006-02-15 21:30:53'),(8473,'2005-07-29 08:36:53',4141,311,'2005-07-31 12:14:53',1,'2006-02-15 21:30:53'),(8474,'2005-07-29 08:36:56',4346,323,'2005-08-01 03:07:56',1,'2006-02-15 21:30:53'),(8475,'2005-07-29 08:37:41',3695,260,'2005-08-04 10:03:41',2,'2006-02-15 21:30:53'),(8476,'2005-07-29 08:39:12',3741,470,'2005-08-06 03:03:12',1,'2006-02-15 21:30:53'),(8477,'2005-07-29 08:40:36',3571,354,'2005-08-06 08:28:36',2,'2006-02-15 21:30:53'),(8478,'2005-07-29 08:40:36',3742,162,'2005-08-01 10:23:36',1,'2006-02-15 21:30:53'),(8479,'2005-07-29 08:42:04',1990,195,'2005-08-01 03:10:04',1,'2006-02-15 21:30:53'),(8480,'2005-07-29 08:44:46',3512,467,'2005-08-05 13:22:46',1,'2006-02-15 21:30:53'),(8481,'2005-07-29 08:45:57',1739,454,'2005-08-01 12:50:57',2,'2006-02-15 21:30:53'),(8482,'2005-07-29 08:46:33',2686,405,'2005-07-31 11:07:33',2,'2006-02-15 21:30:53'),(8483,'2005-07-29 08:50:18',2786,186,'2005-08-03 06:46:18',1,'2006-02-15 21:30:53'),(8484,'2005-07-29 08:51:59',742,260,'2005-07-30 09:07:59',1,'2006-02-15 21:30:53'),(8485,'2005-07-29 08:53:09',3172,420,'2005-07-30 11:25:09',1,'2006-02-15 21:30:53'),(8486,'2005-07-29 08:53:38',1759,221,'2005-08-01 14:12:38',2,'2006-02-15 21:30:53'),(8487,'2005-07-29 08:53:49',1893,82,'2005-07-31 09:10:49',2,'2006-02-15 21:30:53'),(8488,'2005-07-29 08:57:38',2176,478,'2005-08-02 04:16:38',1,'2006-02-15 21:30:53'),(8489,'2005-07-29 08:58:03',375,265,'2005-08-02 07:50:03',2,'2006-02-15 21:30:53'),(8490,'2005-07-29 08:59:25',1943,367,'2005-08-05 14:02:25',2,'2006-02-15 21:30:53'),(8491,'2005-07-29 09:02:13',1806,242,'2005-08-03 04:32:13',1,'2006-02-15 21:30:53'),(8492,'2005-07-29 09:04:17',4553,266,'2005-08-02 08:48:17',2,'2006-02-15 21:30:53'),(8493,'2005-07-29 09:04:31',664,390,'2005-08-04 05:17:31',2,'2006-02-15 21:30:53'),(8494,'2005-07-29 09:04:32',3524,92,'2005-07-31 10:30:32',1,'2006-02-15 21:30:53'),(8495,'2005-07-29 09:05:06',344,51,'2005-08-06 05:48:06',2,'2006-02-15 21:30:53'),(8496,'2005-07-29 09:05:33',765,114,'2005-08-02 06:32:33',1,'2006-02-15 21:30:53'),(8497,'2005-07-29 09:07:03',1837,593,'2005-08-02 09:18:03',2,'2006-02-15 21:30:53'),(8498,'2005-07-29 09:07:38',4468,190,'2005-08-04 07:01:38',1,'2006-02-15 21:30:53'),(8499,'2005-07-29 09:10:41',219,42,'2005-08-05 10:01:41',1,'2006-02-15 21:30:53'),(8500,'2005-07-29 09:12:01',4516,348,'2005-07-31 10:15:01',1,'2006-02-15 21:30:53'),(8501,'2005-07-29 09:12:51',1052,309,'2005-07-30 11:19:51',2,'2006-02-15 21:30:53'),(8502,'2005-07-29 09:15:41',2149,457,'2005-07-30 10:41:41',1,'2006-02-15 21:30:53'),(8503,'2005-07-29 09:16:50',1164,240,'2005-08-04 11:34:50',2,'2006-02-15 21:30:53'),(8504,'2005-07-29 09:20:16',2295,561,'2005-08-07 04:27:16',2,'2006-02-15 21:30:53'),(8505,'2005-07-29 09:22:52',1454,346,'2005-08-06 05:23:52',1,'2006-02-15 21:30:53'),(8506,'2005-07-29 09:23:52',3714,506,'2005-07-31 04:42:52',1,'2006-02-15 21:30:53'),(8507,'2005-07-29 09:29:44',3273,524,'2005-08-07 05:48:44',2,'2006-02-15 21:30:53'),(8508,'2005-07-29 09:34:38',4173,484,'2005-08-01 14:52:38',2,'2006-02-15 21:30:53'),(8509,'2005-07-29 09:38:19',1332,80,'2005-08-04 11:45:19',1,'2006-02-15 21:30:53'),(8510,'2005-07-29 09:41:38',7,487,'2005-08-05 05:30:38',2,'2006-02-15 21:30:53'),(8511,'2005-07-29 09:42:42',3667,598,'2005-08-06 14:22:42',2,'2006-02-15 21:30:53'),(8512,'2005-07-29 09:48:03',4132,351,'2005-07-31 13:40:03',1,'2006-02-15 21:30:53'),(8513,'2005-07-29 09:52:59',3156,142,'2005-07-31 12:05:59',1,'2006-02-15 21:30:53'),(8514,'2005-07-29 09:53:33',3755,99,'2005-07-30 06:34:33',2,'2006-02-15 21:30:53'),(8515,'2005-07-29 09:55:20',1071,477,'2005-08-05 07:08:20',2,'2006-02-15 21:30:53'),(8516,'2005-07-29 10:00:03',981,337,'2005-08-02 09:34:03',1,'2006-02-15 21:30:53'),(8517,'2005-07-29 10:00:48',2064,274,'2005-08-06 14:37:48',2,'2006-02-15 21:30:53'),(8518,'2005-07-29 10:05:27',2311,385,'2005-08-02 05:39:27',1,'2006-02-15 21:30:53'),(8519,'2005-07-29 10:09:43',1163,588,'2005-08-03 08:14:43',2,'2006-02-15 21:30:53'),(8520,'2005-07-29 10:10:02',2440,103,'2005-08-02 05:25:02',2,'2006-02-15 21:30:53'),(8521,'2005-07-29 10:12:45',2608,402,'2005-08-07 04:37:45',2,'2006-02-15 21:30:53'),(8522,'2005-07-29 10:16:19',3636,363,'2005-08-06 14:58:19',1,'2006-02-15 21:30:53'),(8523,'2005-07-29 10:18:27',3614,558,'2005-08-04 09:31:27',1,'2006-02-15 21:30:53'),(8524,'2005-07-29 10:20:07',2110,124,'2005-08-03 04:30:07',1,'2006-02-15 21:30:53'),(8525,'2005-07-29 10:20:19',1322,111,'2005-07-30 05:49:19',2,'2006-02-15 21:30:53'),(8526,'2005-07-29 10:20:48',575,88,'2005-08-03 14:15:48',1,'2006-02-15 21:30:53'),(8527,'2005-07-29 10:21:00',709,168,'2005-08-05 16:05:00',2,'2006-02-15 21:30:53'),(8528,'2005-07-29 10:24:22',2107,428,'2005-08-07 10:34:22',1,'2006-02-15 21:30:53'),(8529,'2005-07-29 10:24:31',1055,501,'2005-08-01 16:06:31',1,'2006-02-15 21:30:53'),(8530,'2005-07-29 10:26:14',4528,233,'2005-07-31 10:24:14',1,'2006-02-15 21:30:53'),(8531,'2005-07-29 10:26:15',1631,427,'2005-08-06 09:28:15',1,'2006-02-15 21:30:53'),(8532,'2005-07-29 10:26:56',3045,546,'2005-08-02 13:23:56',2,'2006-02-15 21:30:53'),(8533,'2005-07-29 10:29:16',551,542,'2005-08-01 06:52:16',1,'2006-02-15 21:30:53'),(8534,'2005-07-29 10:30:13',4029,516,'2005-08-02 04:47:13',1,'2006-02-15 21:30:53'),(8535,'2005-07-29 10:32:33',4489,536,'2005-07-31 05:46:33',1,'2006-02-15 21:30:53'),(8536,'2005-07-29 10:37:23',4510,219,'2005-07-31 07:21:23',2,'2006-02-15 21:30:53'),(8537,'2005-07-29 10:44:54',1012,447,'2005-08-06 14:55:54',2,'2006-02-15 21:30:53'),(8538,'2005-07-29 10:45:17',3768,500,'2005-08-04 15:12:17',1,'2006-02-15 21:30:53'),(8539,'2005-07-29 10:48:24',599,325,'2005-07-30 06:29:24',2,'2006-02-15 21:30:53'),(8540,'2005-07-29 10:52:51',539,180,'2005-08-07 11:44:51',2,'2006-02-15 21:30:53'),(8541,'2005-07-29 10:55:01',976,340,'2005-07-31 10:53:01',1,'2006-02-15 21:30:53'),(8542,'2005-07-29 11:01:50',792,213,'2005-07-30 08:19:50',1,'2006-02-15 21:30:53'),(8543,'2005-07-29 11:01:57',403,346,'2005-08-03 06:03:57',1,'2006-02-15 21:30:53'),(8544,'2005-07-29 11:02:08',412,542,'2005-08-06 15:06:08',2,'2006-02-15 21:30:53'),(8545,'2005-07-29 11:07:04',3261,3,'2005-08-06 13:30:04',2,'2006-02-15 21:30:53'),(8546,'2005-07-29 11:08:48',3224,418,'2005-08-03 16:50:48',2,'2006-02-15 21:30:53'),(8547,'2005-07-29 11:10:15',875,438,'2005-08-03 12:50:15',1,'2006-02-15 21:30:53'),(8548,'2005-07-29 11:11:33',3366,14,'2005-08-04 11:52:33',2,'2006-02-15 21:30:53'),(8549,'2005-07-29 11:12:13',1866,206,'2005-08-06 06:04:13',2,'2006-02-15 21:30:53'),(8550,'2005-07-29 11:12:37',1340,70,'2005-07-30 15:05:37',2,'2006-02-15 21:30:53'),(8551,'2005-07-29 11:13:11',2083,340,'2005-08-05 05:17:11',2,'2006-02-15 21:30:53'),(8552,'2005-07-29 11:14:02',1987,490,'2005-08-05 14:13:02',2,'2006-02-15 21:30:53'),(8553,'2005-07-29 11:15:36',2645,49,'2005-08-07 16:37:36',1,'2006-02-15 21:30:53'),(8554,'2005-07-29 11:16:29',1563,582,'2005-07-31 06:38:29',2,'2006-02-15 21:30:53'),(8555,'2005-07-29 11:18:01',2784,18,'2005-07-30 10:47:01',2,'2006-02-15 21:30:53'),(8556,'2005-07-29 11:18:27',2793,231,'2005-07-30 05:21:27',2,'2006-02-15 21:30:53'),(8557,'2005-07-29 11:19:59',1481,459,'2005-08-07 12:50:59',1,'2006-02-15 21:30:53'),(8558,'2005-07-29 11:24:49',1160,169,'2005-07-31 15:03:49',1,'2006-02-15 21:30:53'),(8559,'2005-07-29 11:25:54',2078,279,'2005-08-04 10:16:54',2,'2006-02-15 21:30:53'),(8560,'2005-07-29 11:27:27',3499,430,'2005-08-01 12:05:27',2,'2006-02-15 21:30:53'),(8561,'2005-07-29 11:29:12',2207,344,'2005-08-05 09:17:12',1,'2006-02-15 21:30:53'),(8562,'2005-07-29 11:32:13',3595,255,'2005-07-30 08:23:13',2,'2006-02-15 21:30:53'),(8563,'2005-07-29 11:32:58',61,67,'2005-08-05 07:21:58',2,'2006-02-15 21:30:53'),(8564,'2005-07-29 11:33:00',2830,316,'2005-08-05 15:35:00',1,'2006-02-15 21:30:53'),(8565,'2005-07-29 11:35:23',3211,280,'2005-08-06 08:28:23',1,'2006-02-15 21:30:53'),(8566,'2005-07-29 11:35:46',2011,544,'2005-07-30 13:50:46',1,'2006-02-15 21:30:53'),(8567,'2005-07-29 11:37:30',1612,594,'2005-08-03 05:58:30',2,'2006-02-15 21:30:53'),(8568,'2005-07-29 11:38:22',1599,583,'2005-08-04 13:22:22',2,'2006-02-15 21:30:53'),(8569,'2005-07-29 11:39:17',276,348,'2005-07-31 07:50:17',2,'2006-02-15 21:30:53'),(8570,'2005-07-29 11:40:08',3094,131,'2005-08-06 10:23:08',1,'2006-02-15 21:30:53'),(8571,'2005-07-29 11:48:39',1778,407,'2005-08-03 06:35:39',2,'2006-02-15 21:30:53'),(8572,'2005-07-29 11:51:24',2815,267,'2005-08-02 11:44:24',1,'2006-02-15 21:30:53'),(8573,'2005-07-29 11:51:25',1637,179,'2005-08-07 08:53:25',1,'2006-02-15 21:30:53'),(8574,'2005-07-29 11:51:53',2949,71,'2005-08-03 05:59:53',2,'2006-02-15 21:30:53'),(8575,'2005-07-29 11:52:47',1668,441,'2005-08-03 08:14:47',2,'2006-02-15 21:30:53'),(8576,'2005-07-29 11:55:01',3552,157,'2005-08-03 08:41:01',2,'2006-02-15 21:30:53'),(8577,'2005-07-29 11:56:30',520,328,'2005-08-07 15:41:30',1,'2006-02-15 21:30:53'),(8578,'2005-07-29 11:58:14',3737,148,'2005-08-03 06:25:14',1,'2006-02-15 21:30:53'),(8579,'2005-07-29 11:59:22',4045,250,'2005-07-30 11:41:22',2,'2006-02-15 21:30:53'),(8580,'2005-07-29 12:00:27',4040,543,'2005-08-04 16:39:27',1,'2006-02-15 21:30:53'),(8581,'2005-07-29 12:02:06',2102,254,'2005-08-02 10:32:06',2,'2006-02-15 21:30:53'),(8582,'2005-07-29 12:03:27',841,162,'2005-08-03 07:02:27',1,'2006-02-15 21:30:53'),(8583,'2005-07-29 12:04:50',3130,191,'2005-08-04 17:21:50',1,'2006-02-15 21:30:53'),(8584,'2005-07-29 12:07:53',1656,482,'2005-07-31 09:27:53',1,'2006-02-15 21:30:53'),(8585,'2005-07-29 12:14:18',512,516,'2005-08-03 08:31:18',2,'2006-02-15 21:30:53'),(8586,'2005-07-29 12:16:34',2752,374,'2005-08-07 06:48:34',1,'2006-02-15 21:30:53'),(8587,'2005-07-29 12:18:40',1941,108,'2005-08-03 14:01:40',1,'2006-02-15 21:30:53'),(8588,'2005-07-29 12:22:20',2858,416,'2005-07-31 10:49:20',1,'2006-02-15 21:30:53'),(8589,'2005-07-29 12:28:17',1628,293,'2005-08-05 11:40:17',1,'2006-02-15 21:30:53'),(8590,'2005-07-29 12:32:20',2505,114,'2005-08-07 08:00:20',1,'2006-02-15 21:30:53'),(8591,'2005-07-29 12:32:33',2568,418,'2005-08-01 16:19:33',2,'2006-02-15 21:30:53'),(8592,'2005-07-29 12:33:58',1952,271,'2005-08-04 07:14:58',2,'2006-02-15 21:30:53'),(8593,'2005-07-29 12:38:14',2601,181,'2005-08-07 07:04:14',1,'2006-02-15 21:30:53'),(8594,'2005-07-29 12:42:13',4155,115,'2005-08-02 07:38:13',1,'2006-02-15 21:30:53'),(8595,'2005-07-29 12:47:43',3225,423,'2005-08-07 13:51:43',2,'2006-02-15 21:30:53'),(8596,'2005-07-29 12:48:54',59,233,'2005-08-04 07:19:54',2,'2006-02-15 21:30:53'),(8597,'2005-07-29 12:55:55',4218,222,'2005-08-05 18:54:55',1,'2006-02-15 21:30:53'),(8598,'2005-07-29 12:56:59',626,2,'2005-08-01 08:39:59',2,'2006-02-15 21:30:53'),(8599,'2005-07-29 12:58:52',1169,545,'2005-08-03 08:19:52',1,'2006-02-15 21:30:53'),(8600,'2005-07-29 13:01:19',1488,226,'2005-07-31 15:40:19',2,'2006-02-15 21:30:53'),(8601,'2005-07-29 13:03:31',3247,181,'2005-08-06 16:32:31',1,'2006-02-15 21:30:53'),(8602,'2005-07-29 13:04:27',4002,64,'2005-08-03 12:21:27',2,'2006-02-15 21:30:53'),(8603,'2005-07-29 13:07:07',3007,594,'2005-08-04 18:32:07',2,'2006-02-15 21:30:53'),(8604,'2005-07-29 13:07:13',3909,326,'2005-07-31 18:00:13',2,'2006-02-15 21:30:53'),(8605,'2005-07-29 13:13:34',3805,224,'2005-08-07 08:29:34',1,'2006-02-15 21:30:53'),(8606,'2005-07-29 13:14:24',4051,340,'2005-07-30 14:52:24',1,'2006-02-15 21:30:53'),(8607,'2005-07-29 13:18:00',4290,336,'2005-07-30 18:51:00',2,'2006-02-15 21:30:53'),(8608,'2005-07-29 13:18:52',2976,165,'2005-07-30 19:01:52',2,'2006-02-15 21:30:53'),(8609,'2005-07-29 13:19:25',3997,354,'2005-08-06 08:33:25',2,'2006-02-15 21:30:53'),(8610,'2005-07-29 13:25:02',4222,563,'2005-08-03 08:10:02',2,'2006-02-15 21:30:53'),(8611,'2005-07-29 13:26:21',610,373,'2005-08-07 18:20:21',2,'2006-02-15 21:30:53'),(8612,'2005-07-29 13:28:20',3518,392,'2005-08-06 14:39:20',2,'2006-02-15 21:30:53'),(8613,'2005-07-29 13:30:58',394,411,'2005-08-05 16:21:58',2,'2006-02-15 21:30:53'),(8614,'2005-07-29 13:32:05',604,552,'2005-08-04 15:26:05',1,'2006-02-15 21:30:53'),(8615,'2005-07-29 13:36:01',4453,15,'2005-08-03 13:15:01',1,'2006-02-15 21:30:53'),(8616,'2005-07-29 13:39:09',2583,493,'2005-08-01 16:49:09',1,'2006-02-15 21:30:53'),(8617,'2005-07-29 13:46:14',385,441,'2005-08-06 13:26:14',2,'2006-02-15 21:30:53'),(8618,'2005-07-29 13:48:20',985,270,'2005-08-06 14:12:20',2,'2006-02-15 21:30:53'),(8619,'2005-07-29 13:50:08',2169,50,'2005-08-06 13:15:08',1,'2006-02-15 21:30:53'),(8620,'2005-07-29 13:51:20',3718,306,'2005-08-02 13:05:20',1,'2006-02-15 21:30:53'),(8621,'2005-07-29 13:52:42',2473,358,'2005-07-30 11:42:42',2,'2006-02-15 21:30:53'),(8622,'2005-07-29 13:53:28',4076,98,'2005-07-31 16:12:28',2,'2006-02-15 21:30:53'),(8623,'2005-07-29 13:55:11',458,142,'2005-08-05 11:16:11',1,'2006-02-15 21:30:53'),(8624,'2005-07-29 13:55:36',4402,439,'2005-08-02 12:23:36',2,'2006-02-15 21:30:53'),(8625,'2005-07-29 13:59:13',884,410,'2005-08-07 17:56:13',2,'2006-02-15 21:30:53'),(8626,'2005-07-29 14:03:20',3092,148,'2005-08-02 09:05:20',1,'2006-02-15 21:30:53'),(8627,'2005-07-29 14:05:12',4235,226,'2005-08-05 16:53:12',2,'2006-02-15 21:30:53'),(8628,'2005-07-29 14:06:24',4484,550,'2005-08-06 10:42:24',2,'2006-02-15 21:30:53'),(8629,'2005-07-29 14:06:35',853,567,'2005-08-03 16:59:35',2,'2006-02-15 21:30:53'),(8630,'2005-07-29 14:07:59',1378,406,'2005-08-03 13:18:59',2,'2006-02-15 21:30:53'),(8631,'2005-07-29 14:08:06',98,559,'2005-08-05 14:57:06',1,'2006-02-15 21:30:53'),(8632,'2005-07-29 14:11:25',1666,563,'2005-08-07 15:32:25',1,'2006-02-15 21:30:53'),(8633,'2005-07-29 14:19:53',3436,534,'2005-08-01 11:31:53',2,'2006-02-15 21:30:53'),(8634,'2005-07-29 14:19:57',2023,335,'2005-08-07 13:44:57',1,'2006-02-15 21:30:53'),(8635,'2005-07-29 14:22:48',2894,383,'2005-08-01 11:59:48',2,'2006-02-15 21:30:53'),(8636,'2005-07-29 14:24:13',4308,252,'2005-08-02 14:39:13',1,'2006-02-15 21:30:53'),(8637,'2005-07-29 14:30:11',1069,310,'2005-08-04 14:00:11',1,'2006-02-15 21:30:53'),(8638,'2005-07-29 14:30:23',4060,571,'2005-08-01 10:32:23',1,'2006-02-15 21:30:53'),(8639,'2005-07-29 14:30:31',3504,290,'2005-08-02 16:04:31',1,'2006-02-15 21:30:53'),(8640,'2005-07-29 14:34:17',1874,257,'2005-08-01 13:09:17',2,'2006-02-15 21:30:53'),(8641,'2005-07-29 14:37:30',3199,30,'2005-08-02 19:32:30',2,'2006-02-15 21:30:53'),(8642,'2005-07-29 14:38:17',3947,522,'2005-08-03 14:41:17',1,'2006-02-15 21:30:53'),(8643,'2005-07-29 14:45:23',381,59,'2005-08-04 18:42:23',1,'2006-02-15 21:30:53'),(8644,'2005-07-29 14:45:45',4507,314,'2005-08-03 20:10:45',2,'2006-02-15 21:30:53'),(8645,'2005-07-29 14:47:45',2532,535,'2005-07-30 14:56:45',2,'2006-02-15 21:30:53'),(8646,'2005-07-29 14:48:48',89,302,'2005-08-03 18:11:48',2,'2006-02-15 21:30:53'),(8647,'2005-07-29 14:52:59',556,307,'2005-08-06 11:09:59',2,'2006-02-15 21:30:53'),(8648,'2005-07-29 14:56:21',160,416,'2005-07-31 16:56:21',2,'2006-02-15 21:30:53'),(8649,'2005-07-29 14:57:33',789,69,'2005-08-07 09:43:33',2,'2006-02-15 21:30:53'),(8650,'2005-07-29 14:59:04',1272,134,'2005-08-04 13:13:04',2,'2006-02-15 21:30:53'),(8651,'2005-07-29 15:02:18',2095,61,'2005-08-07 09:34:18',2,'2006-02-15 21:30:53'),(8652,'2005-07-29 15:02:54',2729,219,'2005-08-07 17:21:54',2,'2006-02-15 21:30:53'),(8653,'2005-07-29 15:04:23',4440,230,'2005-08-02 09:39:23',2,'2006-02-15 21:30:53'),(8654,'2005-07-29 15:04:27',3925,84,'2005-08-07 18:37:27',1,'2006-02-15 21:30:53'),(8655,'2005-07-29 15:04:42',3986,232,'2005-08-04 11:26:42',1,'2006-02-15 21:30:53'),(8656,'2005-07-29 15:05:52',1385,460,'2005-07-31 20:57:52',2,'2006-02-15 21:30:53'),(8657,'2005-07-29 15:09:25',3194,236,'2005-07-31 19:10:25',1,'2006-02-15 21:30:53'),(8658,'2005-07-29 15:16:37',2033,427,'2005-08-07 20:45:37',2,'2006-02-15 21:30:53'),(8659,'2005-07-29 15:26:31',558,168,'2005-08-06 19:05:31',2,'2006-02-15 21:30:53'),(8660,'2005-07-29 15:26:59',3122,566,'2005-08-05 21:04:59',2,'2006-02-15 21:30:53'),(8661,'2005-07-29 15:28:24',3409,341,'2005-08-05 20:04:24',2,'2006-02-15 21:30:53'),(8662,'2005-07-29 15:31:33',3758,362,'2005-07-30 09:39:33',2,'2006-02-15 21:30:53'),(8663,'2005-07-29 15:33:18',1281,214,'2005-07-30 18:03:18',1,'2006-02-15 21:30:53'),(8664,'2005-07-29 15:36:27',198,102,'2005-08-04 20:11:27',1,'2006-02-15 21:30:53'),(8665,'2005-07-29 15:39:29',1113,265,'2005-08-01 10:33:29',2,'2006-02-15 21:30:53'),(8666,'2005-07-29 15:39:38',3669,591,'2005-08-06 17:12:38',1,'2006-02-15 21:30:53'),(8667,'2005-07-29 15:40:57',3439,25,'2005-07-31 20:59:57',1,'2006-02-15 21:30:53'),(8668,'2005-07-29 15:41:31',4531,71,'2005-08-01 16:20:31',2,'2006-02-15 21:30:53'),(8669,'2005-07-29 15:44:55',1667,401,'2005-08-01 14:09:55',2,'2006-02-15 21:30:53'),(8670,'2005-07-29 15:49:03',2354,446,'2005-08-01 20:19:03',2,'2006-02-15 21:30:53'),(8671,'2005-07-29 15:49:37',1431,577,'2005-08-05 18:20:37',1,'2006-02-15 21:30:53'),(8672,'2005-07-29 15:49:48',405,495,'2005-08-06 17:59:48',2,'2006-02-15 21:30:53'),(8673,'2005-07-29 15:50:14',2167,29,'2005-08-03 18:30:14',1,'2006-02-15 21:30:53'),(8674,'2005-07-29 15:54:22',1744,412,'2005-07-31 12:15:22',1,'2006-02-15 21:30:53'),(8675,'2005-07-29 15:56:18',1026,258,'2005-07-30 18:50:18',1,'2006-02-15 21:30:53'),(8676,'2005-07-29 15:59:06',283,533,'2005-08-05 19:12:06',2,'2006-02-15 21:30:53'),(8677,'2005-07-29 16:01:13',513,315,'2005-08-07 19:21:13',2,'2006-02-15 21:30:53'),(8678,'2005-07-29 16:04:00',3991,210,'2005-08-05 12:37:00',1,'2006-02-15 21:30:53'),(8679,'2005-07-29 16:07:47',3549,536,'2005-08-02 18:37:47',1,'2006-02-15 21:30:53'),(8680,'2005-07-29 16:08:03',1227,330,'2005-07-31 17:26:03',1,'2006-02-15 21:30:53'),(8681,'2005-07-29 16:12:01',4004,309,'2005-08-01 18:14:01',2,'2006-02-15 21:30:53'),(8682,'2005-07-29 16:15:26',4328,348,'2005-08-03 20:15:26',2,'2006-02-15 21:30:53'),(8683,'2005-07-29 16:15:43',3915,513,'2005-08-07 19:19:43',1,'2006-02-15 21:30:53'),(8684,'2005-07-29 16:16:33',2457,185,'2005-08-07 12:27:33',2,'2006-02-15 21:30:53'),(8685,'2005-07-29 16:17:05',1827,321,'2005-08-07 17:44:05',1,'2006-02-15 21:30:53'),(8686,'2005-07-29 16:17:49',4160,52,'2005-08-01 12:50:49',2,'2006-02-15 21:30:53'),(8687,'2005-07-29 16:19:17',222,117,'2005-08-01 15:28:17',1,'2006-02-15 21:30:53'),(8688,'2005-07-29 16:31:32',2263,381,'2005-07-30 12:39:32',1,'2006-02-15 21:30:53'),(8689,'2005-07-29 16:38:58',824,487,'2005-08-01 17:09:58',2,'2006-02-15 21:30:53'),(8690,'2005-07-29 16:39:28',1292,291,'2005-08-01 14:03:28',2,'2006-02-15 21:30:53'),(8691,'2005-07-29 16:41:23',672,446,'2005-08-02 12:32:23',2,'2006-02-15 21:30:53'),(8692,'2005-07-29 16:43:39',3192,88,'2005-08-01 15:54:39',2,'2006-02-15 21:30:53'),(8693,'2005-07-29 16:44:13',917,51,'2005-08-01 15:56:13',1,'2006-02-15 21:30:53'),(8694,'2005-07-29 16:44:48',503,345,'2005-08-06 16:28:48',1,'2006-02-15 21:30:53'),(8695,'2005-07-29 16:44:55',694,280,'2005-08-07 12:47:55',1,'2006-02-15 21:30:53'),(8696,'2005-07-29 16:45:18',2553,178,'2005-08-07 18:51:18',1,'2006-02-15 21:30:53'),(8697,'2005-07-29 16:46:07',443,291,'2005-08-02 19:27:07',2,'2006-02-15 21:30:53'),(8698,'2005-07-29 16:52:17',2973,324,'2005-08-04 13:20:17',2,'2006-02-15 21:30:53'),(8699,'2005-07-29 16:53:00',4080,123,'2005-08-07 20:31:00',1,'2006-02-15 21:30:53'),(8700,'2005-07-29 16:56:01',3710,196,'2005-07-31 16:19:01',2,'2006-02-15 21:30:53'),(8701,'2005-07-29 17:02:35',3158,245,'2005-08-07 19:55:35',2,'2006-02-15 21:30:53'),(8702,'2005-07-29 17:04:37',2215,306,'2005-08-05 15:30:37',2,'2006-02-15 21:30:53'),(8703,'2005-07-29 17:12:44',1065,439,'2005-07-30 19:38:44',1,'2006-02-15 21:30:53'),(8704,'2005-07-29 17:13:45',2117,107,'2005-08-03 20:03:45',2,'2006-02-15 21:30:53'),(8705,'2005-07-29 17:14:29',4038,2,'2005-08-02 16:01:29',1,'2006-02-15 21:30:53'),(8706,'2005-07-29 17:19:15',2886,515,'2005-08-03 22:52:15',1,'2006-02-15 21:30:53'),(8707,'2005-07-29 17:21:58',2525,157,'2005-08-02 14:47:58',2,'2006-02-15 21:30:53'),(8708,'2005-07-29 17:24:13',4054,529,'2005-08-04 13:57:13',1,'2006-02-15 21:30:53'),(8709,'2005-07-29 17:25:54',902,199,'2005-08-02 22:35:54',1,'2006-02-15 21:30:53'),(8710,'2005-07-29 17:26:03',3391,566,'2005-07-30 19:51:03',1,'2006-02-15 21:30:53'),(8711,'2005-07-29 17:27:15',3471,575,'2005-07-31 12:57:15',1,'2006-02-15 21:30:53'),(8712,'2005-07-29 17:30:06',2800,41,'2005-08-03 22:55:06',2,'2006-02-15 21:30:53'),(8713,'2005-07-29 17:31:19',473,433,'2005-08-02 16:37:19',2,'2006-02-15 21:30:53'),(8714,'2005-07-29 17:31:40',4547,362,'2005-08-04 16:12:40',2,'2006-02-15 21:30:53'),(8715,'2005-07-29 17:33:45',860,11,'2005-08-01 17:30:45',1,'2006-02-15 21:30:53'),(8716,'2005-07-29 17:39:09',2123,48,'2005-08-03 20:26:09',2,'2006-02-15 21:30:53'),(8717,'2005-07-29 17:40:45',1821,260,'2005-08-01 22:38:45',2,'2006-02-15 21:30:53'),(8718,'2005-07-29 17:41:14',137,23,'2005-08-01 18:22:14',2,'2006-02-15 21:30:53'),(8719,'2005-07-29 17:45:45',995,333,'2005-08-01 13:53:45',1,'2006-02-15 21:30:53'),(8720,'2005-07-29 17:48:32',152,180,'2005-08-04 14:30:32',2,'2006-02-15 21:30:53'),(8721,'2005-07-29 17:56:21',2416,312,'2005-08-02 21:30:21',2,'2006-02-15 21:30:53'),(8722,'2005-07-29 17:58:58',1389,401,'2005-08-07 23:40:58',1,'2006-02-15 21:30:53'),(8723,'2005-07-29 18:03:47',224,39,'2005-08-06 18:53:47',1,'2006-02-15 21:30:53'),(8724,'2005-07-29 18:05:21',898,372,'2005-08-01 15:41:21',1,'2006-02-15 21:30:53'),(8725,'2005-07-29 18:08:42',2385,421,'2005-08-04 16:01:42',2,'2006-02-15 21:30:53'),(8726,'2005-07-29 18:09:22',897,409,'2005-08-06 16:24:22',1,'2006-02-15 21:30:53'),(8727,'2005-07-29 18:09:57',3031,528,'2005-08-03 13:41:57',2,'2006-02-15 21:30:53'),(8728,'2005-07-29 18:12:49',973,341,'2005-08-06 22:45:49',1,'2006-02-15 21:30:53'),(8729,'2005-07-29 18:23:02',3342,83,'2005-07-31 16:09:02',2,'2006-02-15 21:30:53'),(8730,'2005-07-29 18:23:34',4191,592,'2005-08-01 19:56:34',1,'2006-02-15 21:30:53'),(8731,'2005-07-29 18:23:57',2638,179,'2005-08-05 19:38:57',1,'2006-02-15 21:30:53'),(8732,'2005-07-29 18:25:03',1143,346,'2005-08-07 18:56:03',2,'2006-02-15 21:30:53'),(8733,'2005-07-29 18:26:34',3187,450,'2005-08-03 15:06:34',1,'2006-02-15 21:30:53'),(8734,'2005-07-29 18:28:15',2374,303,'2005-08-05 23:38:15',1,'2006-02-15 21:30:53'),(8735,'2005-07-29 18:28:54',2881,570,'2005-08-03 12:43:54',2,'2006-02-15 21:30:53'),(8736,'2005-07-29 18:31:15',1726,530,'2005-07-30 16:24:15',2,'2006-02-15 21:30:53'),(8737,'2005-07-29 18:32:13',4154,298,'2005-08-05 21:07:13',2,'2006-02-15 21:30:53'),(8738,'2005-07-29 18:32:47',3893,210,'2005-08-02 13:05:47',2,'2006-02-15 21:30:53'),(8739,'2005-07-29 18:34:33',4310,326,'2005-08-02 16:05:33',1,'2006-02-15 21:30:53'),(8740,'2005-07-29 18:41:31',3781,378,'2005-08-01 18:38:31',1,'2006-02-15 21:30:53'),(8741,'2005-07-29 18:44:57',165,4,'2005-08-03 18:25:57',2,'2006-02-15 21:30:53'),(8742,'2005-07-29 18:56:12',918,208,'2005-08-03 16:42:12',1,'2006-02-15 21:30:53'),(8743,'2005-07-29 18:57:01',2664,282,'2005-07-31 22:09:01',2,'2006-02-15 21:30:53'),(8744,'2005-07-29 18:58:24',1086,280,'2005-08-05 17:56:24',1,'2006-02-15 21:30:53'),(8745,'2005-07-29 19:03:05',1766,293,'2005-08-06 14:06:05',2,'2006-02-15 21:30:53'),(8746,'2005-07-29 19:03:15',2179,275,'2005-07-30 17:06:15',1,'2006-02-15 21:30:53'),(8747,'2005-07-29 19:07:57',2584,70,'2005-07-30 16:01:57',1,'2006-02-15 21:30:53'),(8748,'2005-07-29 19:08:37',2184,237,'2005-08-01 16:24:37',1,'2006-02-15 21:30:53'),(8749,'2005-07-29 19:13:15',2252,456,'2005-08-01 15:02:15',1,'2006-02-15 21:30:53'),(8750,'2005-07-29 19:14:21',3157,158,'2005-07-31 17:22:21',2,'2006-02-15 21:30:53'),(8751,'2005-07-29 19:14:39',3467,386,'2005-07-31 23:11:39',1,'2006-02-15 21:30:53'),(8752,'2005-07-29 19:15:07',4202,253,'2005-07-31 13:27:07',1,'2006-02-15 21:30:53'),(8753,'2005-07-29 19:15:50',1345,560,'2005-07-31 19:13:50',2,'2006-02-15 21:30:53'),(8754,'2005-07-29 19:18:30',1678,174,'2005-08-05 18:39:30',2,'2006-02-15 21:30:53'),(8755,'2005-07-29 19:18:31',1498,372,'2005-07-31 19:20:31',2,'2006-02-15 21:30:53'),(8756,'2005-07-29 19:18:57',4146,120,'2005-08-02 20:07:57',2,'2006-02-15 21:30:53'),(8757,'2005-07-29 19:19:10',3473,462,'2005-08-02 13:47:10',2,'2006-02-15 21:30:53'),(8758,'2005-07-29 19:20:49',2816,442,'2005-08-05 21:57:49',2,'2006-02-15 21:30:53'),(8759,'2005-07-29 19:22:37',844,209,'2005-08-07 15:36:37',2,'2006-02-15 21:30:53'),(8760,'2005-07-29 19:22:40',3566,118,'2005-08-05 01:09:40',2,'2006-02-15 21:30:53'),(8761,'2005-07-29 19:26:47',1317,539,'2005-08-08 00:09:47',1,'2006-02-15 21:30:53'),(8762,'2005-07-29 19:30:02',2765,463,'2005-08-04 18:38:02',1,'2006-02-15 21:30:53'),(8763,'2005-07-29 19:38:24',374,510,'2005-08-04 16:51:24',1,'2006-02-15 21:30:53'),(8764,'2005-07-29 19:39:04',2348,303,'2005-08-01 13:52:04',1,'2006-02-15 21:30:53'),(8765,'2005-07-29 19:40:08',2631,538,'2005-07-31 14:24:08',2,'2006-02-15 21:30:53'),(8766,'2005-07-29 19:41:04',3888,338,'2005-08-02 00:41:04',2,'2006-02-15 21:30:53'),(8767,'2005-07-29 19:42:33',962,467,'2005-08-01 20:52:33',2,'2006-02-15 21:30:53'),(8768,'2005-07-29 19:43:02',1601,468,'2005-08-03 23:36:02',1,'2006-02-15 21:30:53'),(8769,'2005-07-29 19:45:33',2180,588,'2005-08-05 22:09:33',2,'2006-02-15 21:30:53'),(8770,'2005-07-29 19:53:50',4025,499,'2005-08-05 14:22:50',1,'2006-02-15 21:30:53'),(8771,'2005-07-29 19:54:41',3533,347,'2005-08-03 20:38:41',1,'2006-02-15 21:30:53'),(8772,'2005-07-29 19:55:25',3526,122,'2005-08-05 18:48:25',1,'2006-02-15 21:30:53'),(8773,'2005-07-29 19:55:34',131,592,'2005-07-30 14:11:34',1,'2006-02-15 21:30:53'),(8774,'2005-07-29 20:05:04',315,161,'2005-07-31 14:32:04',1,'2006-02-15 21:30:53'),(8775,'2005-07-29 20:05:38',1358,44,'2005-07-30 21:13:38',1,'2006-02-15 21:30:53'),(8776,'2005-07-29 20:07:06',1565,587,'2005-08-06 20:42:06',2,'2006-02-15 21:30:53'),(8777,'2005-07-29 20:10:21',2462,382,'2005-07-30 20:32:21',2,'2006-02-15 21:30:53'),(8778,'2005-07-29 20:14:25',3654,582,'2005-08-04 00:50:25',1,'2006-02-15 21:30:53'),(8779,'2005-07-29 20:15:00',3245,202,'2005-08-03 21:17:00',1,'2006-02-15 21:30:53'),(8780,'2005-07-29 20:19:45',1095,328,'2005-08-03 22:22:45',2,'2006-02-15 21:30:53'),(8781,'2005-07-29 20:20:16',3746,235,'2005-07-30 16:19:16',2,'2006-02-15 21:30:53'),(8782,'2005-07-29 20:29:34',4379,365,'2005-08-04 02:19:34',1,'2006-02-15 21:30:53'),(8783,'2005-07-29 20:31:28',2316,71,'2005-08-02 19:33:28',2,'2006-02-15 21:30:53'),(8784,'2005-07-29 20:35:37',2308,580,'2005-07-30 17:22:37',1,'2006-02-15 21:30:53'),(8785,'2005-07-29 20:36:26',216,42,'2005-07-30 15:06:26',1,'2006-02-15 21:30:53'),(8786,'2005-07-29 20:39:49',2404,533,'2005-08-03 18:08:49',1,'2006-02-15 21:30:53'),(8787,'2005-07-29 20:43:49',2366,222,'2005-07-31 15:15:49',1,'2006-02-15 21:30:53'),(8788,'2005-07-29 20:46:44',3412,121,'2005-08-03 02:25:44',2,'2006-02-15 21:30:53'),(8789,'2005-07-29 20:47:27',3062,71,'2005-08-05 18:36:27',1,'2006-02-15 21:30:53'),(8790,'2005-07-29 20:51:41',751,323,'2005-07-30 17:30:41',2,'2006-02-15 21:30:53'),(8791,'2005-07-29 20:53:23',1677,469,'2005-07-31 18:14:23',1,'2006-02-15 21:30:53'),(8792,'2005-07-29 20:56:14',3764,203,'2005-08-07 16:44:14',2,'2006-02-15 21:30:53'),(8793,'2005-07-29 20:57:22',1819,167,'2005-08-02 01:40:22',2,'2006-02-15 21:30:53'),(8794,'2005-07-29 20:59:38',3509,320,'2005-07-31 00:15:38',2,'2006-02-15 21:30:53'),(8795,'2005-07-29 21:04:14',1896,302,'2005-07-31 02:58:14',2,'2006-02-15 21:30:53'),(8796,'2005-07-29 21:09:11',2234,74,'2005-08-04 22:55:11',1,'2006-02-15 21:30:53'),(8797,'2005-07-29 21:10:37',2929,566,'2005-08-07 21:43:37',1,'2006-02-15 21:30:53'),(8798,'2005-07-29 21:15:38',800,513,'2005-08-05 02:46:38',2,'2006-02-15 21:30:53'),(8799,'2005-07-29 21:16:47',326,237,'2005-08-07 22:09:47',2,'2006-02-15 21:30:53'),(8800,'2005-07-29 21:18:59',2082,207,'2005-08-06 19:59:59',2,'2006-02-15 21:30:53'),(8801,'2005-07-29 21:25:22',1111,590,'2005-08-01 00:02:22',1,'2006-02-15 21:30:53'),(8802,'2005-07-29 21:25:51',296,407,'2005-07-30 18:15:51',2,'2006-02-15 21:30:53'),(8803,'2005-07-29 21:26:24',2814,86,'2005-08-06 18:05:24',2,'2006-02-15 21:30:53'),(8804,'2005-07-29 21:28:19',4461,363,'2005-08-01 20:15:19',2,'2006-02-15 21:30:53'),(8805,'2005-07-29 21:29:58',4041,39,'2005-08-04 23:12:58',1,'2006-02-15 21:30:53'),(8806,'2005-07-29 21:36:34',4085,454,'2005-08-02 00:58:34',1,'2006-02-15 21:30:53'),(8807,'2005-07-29 21:36:59',2612,396,'2005-08-01 17:40:59',1,'2006-02-15 21:30:53'),(8808,'2005-07-29 21:39:07',593,173,'2005-08-03 02:09:07',2,'2006-02-15 21:30:53'),(8809,'2005-07-29 21:42:49',3278,8,'2005-08-04 01:13:49',1,'2006-02-15 21:30:53'),(8810,'2005-07-29 21:45:19',1233,431,'2005-08-08 01:45:19',2,'2006-02-15 21:30:53'),(8811,'2005-07-29 21:46:21',2041,245,'2005-08-07 16:51:21',2,'2006-02-15 21:30:53'),(8812,'2005-07-29 21:47:40',1172,563,'2005-08-04 01:18:40',2,'2006-02-15 21:30:53'),(8813,'2005-07-29 21:47:55',3442,497,'2005-08-05 01:16:55',1,'2006-02-15 21:30:53'),(8814,'2005-07-29 21:49:43',1492,487,'2005-08-01 19:56:43',1,'2006-02-15 21:30:53'),(8815,'2005-07-29 21:51:26',3469,230,'2005-08-03 22:37:26',1,'2006-02-15 21:30:53'),(8816,'2005-07-29 21:53:00',3984,209,'2005-08-01 21:20:00',1,'2006-02-15 21:30:53'),(8817,'2005-07-29 22:09:08',2716,175,'2005-08-01 19:07:08',1,'2006-02-15 21:30:53'),(8818,'2005-07-29 22:14:04',3090,98,'2005-08-07 17:26:04',1,'2006-02-15 21:30:53'),(8819,'2005-07-29 22:14:26',3100,591,'2005-08-06 23:02:26',2,'2006-02-15 21:30:53'),(8820,'2005-07-29 22:14:56',481,594,'2005-08-05 23:36:56',2,'2006-02-15 21:30:53'),(8821,'2005-07-29 22:18:12',52,477,'2005-08-05 22:00:12',1,'2006-02-15 21:30:53'),(8822,'2005-07-29 22:20:21',744,35,'2005-08-06 03:00:21',2,'2006-02-15 21:30:53'),(8823,'2005-07-29 22:22:12',951,75,'2005-08-07 21:03:12',1,'2006-02-15 21:30:53'),(8824,'2005-07-29 22:22:58',3506,164,'2005-07-31 21:02:58',2,'2006-02-15 21:30:53'),(8825,'2005-07-29 22:24:16',881,101,'2005-08-05 00:27:16',2,'2006-02-15 21:30:53'),(8826,'2005-07-29 22:30:16',1800,369,'2005-07-30 19:43:16',1,'2006-02-15 21:30:53'),(8827,'2005-07-29 22:31:24',1517,157,'2005-08-06 21:05:24',2,'2006-02-15 21:30:53'),(8828,'2005-07-29 22:32:54',1608,547,'2005-07-30 20:41:54',1,'2006-02-15 21:30:53'),(8829,'2005-07-29 22:33:34',1466,173,'2005-08-05 20:23:34',2,'2006-02-15 21:30:53'),(8830,'2005-07-29 22:34:35',1751,202,'2005-08-05 20:12:35',2,'2006-02-15 21:30:53'),(8831,'2005-07-29 22:37:41',3520,13,'2005-08-08 04:28:41',1,'2006-02-15 21:30:53'),(8832,'2005-07-29 22:37:49',380,125,'2005-08-04 23:32:49',1,'2006-02-15 21:30:53'),(8833,'2005-07-29 22:39:36',1741,101,'2005-08-05 21:19:36',1,'2006-02-15 21:30:53'),(8834,'2005-07-29 22:41:48',4477,243,'2005-08-05 03:21:48',2,'2006-02-15 21:30:53'),(8835,'2005-07-29 22:44:35',2653,237,'2005-08-05 23:28:35',1,'2006-02-15 21:30:53'),(8836,'2005-07-29 22:46:08',3265,14,'2005-08-02 19:53:08',2,'2006-02-15 21:30:53'),(8837,'2005-07-29 22:49:00',42,372,'2005-08-07 21:56:00',2,'2006-02-15 21:30:53'),(8838,'2005-07-29 22:52:23',133,550,'2005-08-03 22:49:23',1,'2006-02-15 21:30:53'),(8839,'2005-07-29 22:52:34',3440,580,'2005-08-05 03:24:34',2,'2006-02-15 21:30:53'),(8840,'2005-07-29 22:55:38',1484,295,'2005-08-06 02:11:38',1,'2006-02-15 21:30:53'),(8841,'2005-07-29 22:56:07',3935,363,'2005-08-01 21:21:07',2,'2006-02-15 21:30:53'),(8842,'2005-07-29 23:03:40',4203,292,'2005-08-06 23:23:40',2,'2006-02-15 21:30:53'),(8843,'2005-07-29 23:04:25',406,294,'2005-08-05 22:12:25',1,'2006-02-15 21:30:53'),(8844,'2005-07-29 23:05:08',327,244,'2005-08-06 00:24:08',2,'2006-02-15 21:30:53'),(8845,'2005-07-29 23:06:13',3036,543,'2005-08-02 20:16:13',1,'2006-02-15 21:30:53'),(8846,'2005-07-29 23:10:28',2912,108,'2005-08-03 22:07:28',2,'2006-02-15 21:30:53'),(8847,'2005-07-29 23:13:41',4133,480,'2005-07-31 23:55:41',1,'2006-02-15 21:30:53'),(8848,'2005-07-29 23:20:58',2972,545,'2005-08-03 17:28:58',2,'2006-02-15 21:30:53'),(8849,'2005-07-29 23:21:01',4300,79,'2005-08-03 20:01:01',1,'2006-02-15 21:30:53'),(8850,'2005-07-29 23:24:20',355,86,'2005-07-31 00:43:20',2,'2006-02-15 21:30:53'),(8851,'2005-07-29 23:26:19',212,445,'2005-08-05 03:59:19',2,'2006-02-15 21:30:53'),(8852,'2005-07-29 23:30:03',1138,42,'2005-08-05 05:22:03',2,'2006-02-15 21:30:53'),(8853,'2005-07-29 23:34:21',2323,58,'2005-07-31 21:20:21',2,'2006-02-15 21:30:53'),(8854,'2005-07-29 23:40:07',1365,527,'2005-08-01 00:35:07',2,'2006-02-15 21:30:53'),(8855,'2005-07-29 23:40:10',4388,335,'2005-08-02 18:07:10',2,'2006-02-15 21:30:53'),(8856,'2005-07-29 23:42:00',2942,365,'2005-08-07 03:00:00',1,'2006-02-15 21:30:53'),(8857,'2005-07-29 23:44:22',1348,477,'2005-07-31 21:32:22',2,'2006-02-15 21:30:53'),(8858,'2005-07-29 23:44:35',2378,558,'2005-08-01 05:25:35',2,'2006-02-15 21:30:53'),(8859,'2005-07-29 23:44:43',603,216,'2005-08-07 18:14:43',2,'2006-02-15 21:30:53'),(8860,'2005-07-29 23:45:57',2841,531,'2005-08-06 02:14:57',2,'2006-02-15 21:30:53'),(8861,'2005-07-29 23:47:29',759,560,'2005-08-07 01:27:29',1,'2006-02-15 21:30:53'),(8862,'2005-07-29 23:49:23',916,21,'2005-08-04 20:11:23',1,'2006-02-15 21:30:53'),(8863,'2005-07-29 23:52:01',75,47,'2005-08-04 20:28:01',1,'2006-02-15 21:30:53'),(8864,'2005-07-29 23:52:12',2321,167,'2005-07-30 22:12:12',1,'2006-02-15 21:30:53'),(8865,'2005-07-29 23:54:54',1835,305,'2005-07-31 05:10:54',2,'2006-02-15 21:30:53'),(8866,'2005-07-29 23:58:19',1530,44,'2005-08-01 05:19:19',2,'2006-02-15 21:30:53'),(8867,'2005-07-30 00:02:18',1388,497,'2005-08-04 00:44:18',2,'2006-02-15 21:30:53'),(8868,'2005-07-30 00:02:26',1229,512,'2005-08-01 22:28:26',2,'2006-02-15 21:30:53'),(8869,'2005-07-30 00:06:32',4353,308,'2005-07-31 20:49:32',2,'2006-02-15 21:30:53'),(8870,'2005-07-30 00:08:08',4104,90,'2005-08-08 00:15:08',2,'2006-02-15 21:30:53'),(8871,'2005-07-30 00:12:41',4535,382,'2005-08-08 03:53:41',1,'2006-02-15 21:30:53'),(8872,'2005-07-30 00:13:54',2669,186,'2005-08-01 18:34:54',1,'2006-02-15 21:30:53'),(8873,'2005-07-30 00:14:32',3498,91,'2005-08-04 20:42:32',2,'2006-02-15 21:30:53'),(8874,'2005-07-30 00:14:45',459,564,'2005-08-02 22:34:45',2,'2006-02-15 21:30:53'),(8875,'2005-07-30 00:15:09',1294,121,'2005-08-04 02:54:09',2,'2006-02-15 21:30:53'),(8876,'2005-07-30 00:15:09',2394,579,'2005-08-02 23:56:09',1,'2006-02-15 21:30:53'),(8877,'2005-07-30 00:15:22',1140,417,'2005-07-31 00:53:22',1,'2006-02-15 21:30:53'),(8878,'2005-07-30 00:15:57',440,25,'2005-08-01 00:22:57',2,'2006-02-15 21:30:53'),(8879,'2005-07-30 00:16:02',2956,584,'2005-08-06 20:10:02',2,'2006-02-15 21:30:53'),(8880,'2005-07-30 00:16:55',2920,51,'2005-08-01 01:05:55',1,'2006-02-15 21:30:53'),(8881,'2005-07-30 00:22:31',2012,118,'2005-08-04 19:10:31',1,'2006-02-15 21:30:53'),(8882,'2005-07-30 00:24:05',441,410,'2005-08-03 19:48:05',2,'2006-02-15 21:30:53'),(8883,'2005-07-30 00:24:48',1421,168,'2005-08-04 00:24:48',2,'2006-02-15 21:30:53'),(8884,'2005-07-30 00:26:22',3050,80,'2005-08-05 03:24:22',1,'2006-02-15 21:30:53'),(8885,'2005-07-30 00:36:26',2984,135,'2005-08-06 03:05:26',1,'2006-02-15 21:30:53'),(8886,'2005-07-30 00:36:31',1469,418,'2005-08-08 06:18:31',1,'2006-02-15 21:30:53'),(8887,'2005-07-30 00:36:54',4119,389,'2005-08-04 19:07:54',1,'2006-02-15 21:30:53'),(8888,'2005-07-30 00:39:36',2824,284,'2005-08-01 02:28:36',2,'2006-02-15 21:30:53'),(8889,'2005-07-30 00:39:43',3457,558,'2005-08-02 23:22:43',1,'2006-02-15 21:30:53'),(8890,'2005-07-30 00:42:06',3656,470,'2005-08-05 21:04:06',1,'2006-02-15 21:30:53'),(8891,'2005-07-30 00:46:55',4093,435,'2005-08-06 23:32:55',2,'2006-02-15 21:30:53'),(8892,'2005-07-30 00:47:03',1584,184,'2005-08-06 03:23:03',2,'2006-02-15 21:30:53'),(8893,'2005-07-30 00:48:19',1048,147,'2005-08-01 03:25:19',1,'2006-02-15 21:30:53'),(8894,'2005-07-30 00:48:31',2055,552,'2005-07-31 05:49:31',1,'2006-02-15 21:30:53'),(8895,'2005-07-30 00:49:17',3217,494,'2005-07-31 01:56:17',1,'2006-02-15 21:30:53'),(8896,'2005-07-30 00:51:21',3560,205,'2005-07-31 22:33:21',1,'2006-02-15 21:30:53'),(8897,'2005-07-30 01:00:17',1964,459,'2005-08-01 03:41:17',1,'2006-02-15 21:30:53'),(8898,'2005-07-30 01:02:20',3961,452,'2005-08-05 22:02:20',2,'2006-02-15 21:30:53'),(8899,'2005-07-30 01:05:30',4148,252,'2005-08-01 23:32:30',1,'2006-02-15 21:30:53'),(8900,'2005-07-30 01:07:03',3057,375,'2005-08-06 04:07:03',1,'2006-02-15 21:30:53'),(8901,'2005-07-30 01:07:12',4392,28,'2005-08-02 06:34:12',1,'2006-02-15 21:30:53'),(8902,'2005-07-30 01:08:06',2983,408,'2005-08-05 00:00:06',2,'2006-02-15 21:30:53'),(8903,'2005-07-30 01:08:06',4546,406,'2005-07-30 21:47:06',2,'2006-02-15 21:30:53'),(8904,'2005-07-30 01:08:33',3622,575,'2005-08-04 02:33:33',1,'2006-02-15 21:30:53'),(8905,'2005-07-30 01:11:11',2154,240,'2005-08-04 22:39:11',1,'2006-02-15 21:30:53'),(8906,'2005-07-30 01:21:39',2667,560,'2005-08-07 02:14:39',2,'2006-02-15 21:30:53'),(8907,'2005-07-30 01:25:03',3239,576,'2005-08-03 05:41:03',1,'2006-02-15 21:30:53'),(8908,'2005-07-30 01:26:05',4498,391,'2005-07-31 20:39:05',1,'2006-02-15 21:30:53'),(8909,'2005-07-30 01:28:03',2606,556,'2005-08-06 04:40:03',2,'2006-02-15 21:30:53'),(8910,'2005-07-30 01:29:48',1039,569,'2005-07-31 21:33:48',2,'2006-02-15 21:30:53'),(8911,'2005-07-30 01:30:57',2159,445,'2005-08-02 20:01:57',1,'2006-02-15 21:30:53'),(8912,'2005-07-30 01:31:25',1686,280,'2005-08-02 07:14:25',2,'2006-02-15 21:30:53'),(8913,'2005-07-30 01:35:01',429,391,'2005-08-06 06:13:01',1,'2006-02-15 21:30:53'),(8914,'2005-07-30 01:42:03',1347,32,'2005-08-04 03:53:03',1,'2006-02-15 21:30:53'),(8915,'2005-07-30 01:42:09',3030,42,'2005-08-04 23:29:09',2,'2006-02-15 21:30:53'),(8916,'2005-07-30 01:42:21',3852,377,'2005-08-03 05:28:21',1,'2006-02-15 21:30:53'),(8917,'2005-07-30 01:47:02',4460,309,'2005-08-05 21:10:02',2,'2006-02-15 21:30:53'),(8918,'2005-07-30 01:56:22',2544,424,'2005-08-04 01:58:22',2,'2006-02-15 21:30:53'),(8919,'2005-07-30 01:57:03',4006,337,'2005-08-08 05:14:03',1,'2006-02-15 21:30:53'),(8920,'2005-07-30 01:59:24',4079,78,'2005-08-02 22:37:24',2,'2006-02-15 21:30:53'),(8921,'2005-07-30 02:04:02',1016,354,'2005-07-31 06:18:02',1,'2006-02-15 21:30:53'),(8922,'2005-07-30 02:08:25',1696,446,'2005-08-08 07:19:25',2,'2006-02-15 21:30:53'),(8923,'2005-07-30 02:08:49',2425,446,'2005-08-03 23:45:49',2,'2006-02-15 21:30:53'),(8924,'2005-07-30 02:08:58',2291,38,'2005-08-05 02:13:58',2,'2006-02-15 21:30:53'),(8925,'2005-07-30 02:09:14',3753,500,'2005-07-30 21:39:14',1,'2006-02-15 21:30:53'),(8926,'2005-07-30 02:10:31',3677,510,'2005-08-03 23:56:31',1,'2006-02-15 21:30:53'),(8927,'2005-07-30 02:13:31',272,15,'2005-08-01 01:34:31',1,'2006-02-15 21:30:53'),(8928,'2005-07-30 02:18:19',706,366,'2005-08-05 00:49:19',2,'2006-02-15 21:30:53'),(8929,'2005-07-30 02:28:22',3501,472,'2005-08-06 06:13:22',1,'2006-02-15 21:30:53'),(8930,'2005-07-30 02:28:38',1107,202,'2005-08-02 01:43:38',2,'2006-02-15 21:30:53'),(8931,'2005-07-30 02:30:07',16,268,'2005-08-02 08:24:07',2,'2006-02-15 21:30:53'),(8932,'2005-07-30 02:31:26',4537,295,'2005-08-04 02:17:26',2,'2006-02-15 21:30:53'),(8933,'2005-07-30 02:36:06',1664,260,'2005-08-02 23:37:06',2,'2006-02-15 21:30:53'),(8934,'2005-07-30 02:37:05',3223,494,'2005-08-01 20:42:05',1,'2006-02-15 21:30:53'),(8935,'2005-07-30 02:38:45',285,76,'2005-08-02 07:11:45',2,'2006-02-15 21:30:53'),(8936,'2005-07-30 02:47:13',1408,227,'2005-08-01 02:25:13',2,'2006-02-15 21:30:53'),(8937,'2005-07-30 02:53:21',2406,544,'2005-08-08 03:33:21',2,'2006-02-15 21:30:53'),(8938,'2005-07-30 02:56:08',4031,92,'2005-07-31 23:08:08',2,'2006-02-15 21:30:53'),(8939,'2005-07-30 02:56:53',4175,598,'2005-08-01 21:19:53',1,'2006-02-15 21:30:53'),(8940,'2005-07-30 02:57:26',1566,212,'2005-08-05 22:05:26',1,'2006-02-15 21:30:53'),(8941,'2005-07-30 02:59:21',4147,329,'2005-08-02 05:18:21',2,'2006-02-15 21:30:53'),(8942,'2005-07-30 03:01:07',4375,77,'2005-08-06 22:50:07',2,'2006-02-15 21:30:53'),(8943,'2005-07-30 03:06:48',3698,531,'2005-08-02 00:59:48',2,'2006-02-15 21:30:53'),(8944,'2005-07-30 03:11:44',3513,172,'2005-08-06 23:15:44',2,'2006-02-15 21:30:53'),(8945,'2005-07-30 03:11:48',1441,447,'2005-08-07 07:53:48',2,'2006-02-15 21:30:53'),(8946,'2005-07-30 03:14:53',3510,257,'2005-08-04 00:50:53',1,'2006-02-15 21:30:53'),(8947,'2005-07-30 03:15:37',341,24,'2005-08-04 07:10:37',2,'2006-02-15 21:30:53'),(8948,'2005-07-30 03:16:18',948,597,'2005-08-04 03:16:18',1,'2006-02-15 21:30:53'),(8949,'2005-07-30 03:17:02',2876,231,'2005-08-08 07:38:02',1,'2006-02-15 21:30:53'),(8950,'2005-07-30 03:17:13',3015,11,'2005-08-07 00:20:13',1,'2006-02-15 21:30:53'),(8951,'2005-07-30 03:18:24',127,336,'2005-08-08 08:50:24',2,'2006-02-15 21:30:53'),(8952,'2005-07-30 03:20:38',4397,36,'2005-08-02 02:54:38',1,'2006-02-15 21:30:53'),(8953,'2005-07-30 03:21:05',535,278,'2005-08-02 05:24:05',2,'2006-02-15 21:30:53'),(8954,'2005-07-30 03:25:51',991,137,'2005-08-06 05:10:51',2,'2006-02-15 21:30:53'),(8955,'2005-07-30 03:28:27',4532,405,'2005-08-04 04:56:27',2,'2006-02-15 21:30:53'),(8956,'2005-07-30 03:32:29',2129,71,'2005-08-01 03:08:29',2,'2006-02-15 21:30:53'),(8957,'2005-07-30 03:34:10',811,158,'2005-08-06 07:05:10',1,'2006-02-15 21:30:53'),(8958,'2005-07-30 03:34:26',1556,536,'2005-08-06 08:14:26',1,'2006-02-15 21:30:53'),(8959,'2005-07-30 03:35:49',3508,550,'2005-08-06 02:02:49',2,'2006-02-15 21:30:53'),(8960,'2005-07-30 03:36:31',391,525,'2005-08-01 23:46:31',2,'2006-02-15 21:30:53'),(8961,'2005-07-30 03:43:35',3679,211,'2005-08-06 07:42:35',1,'2006-02-15 21:30:53'),(8962,'2005-07-30 03:43:45',4439,406,'2005-08-07 00:33:45',1,'2006-02-15 21:30:53'),(8963,'2005-07-30 03:46:26',100,544,'2005-08-08 06:12:26',1,'2006-02-15 21:30:53'),(8964,'2005-07-30 03:49:35',280,424,'2005-08-06 23:28:35',2,'2006-02-15 21:30:53'),(8965,'2005-07-30 03:52:37',2419,599,'2005-08-05 01:28:37',2,'2006-02-15 21:30:53'),(8966,'2005-07-30 03:54:12',1903,522,'2005-07-31 04:51:12',1,'2006-02-15 21:30:53'),(8967,'2005-07-30 03:56:55',1536,480,'2005-08-06 05:25:55',2,'2006-02-15 21:30:53'),(8968,'2005-07-30 03:57:32',2280,339,'2005-07-31 00:09:32',1,'2006-02-15 21:30:53'),(8969,'2005-07-30 04:00:19',2043,121,'2005-08-06 04:39:19',1,'2006-02-15 21:30:53'),(8970,'2005-07-30 04:02:05',2940,313,'2005-08-07 03:40:05',2,'2006-02-15 21:30:53'),(8971,'2005-07-30 04:03:58',3572,35,'2005-08-08 04:16:58',2,'2006-02-15 21:30:53'),(8972,'2005-07-30 04:06:25',1974,89,'2005-08-04 22:49:25',1,'2006-02-15 21:30:53'),(8973,'2005-07-30 04:09:13',886,282,'2005-08-07 22:30:13',2,'2006-02-15 21:30:53'),(8974,'2005-07-30 04:09:16',3376,425,'2005-08-04 06:55:16',1,'2006-02-15 21:30:53'),(8975,'2005-07-30 04:10:18',3288,356,'2005-08-07 01:06:18',2,'2006-02-15 21:30:53'),(8976,'2005-07-30 04:12:32',2135,507,'2005-08-04 23:08:32',1,'2006-02-15 21:30:53'),(8977,'2005-07-30 04:14:07',4099,334,'2005-08-05 23:45:07',2,'2006-02-15 21:30:53'),(8978,'2005-07-30 04:14:28',711,5,'2005-08-06 09:08:28',1,'2006-02-15 21:30:53'),(8979,'2005-07-30 04:20:25',1394,529,'2005-08-08 03:39:25',2,'2006-02-15 21:30:53'),(8980,'2005-07-30 04:22:15',3061,105,'2005-08-04 08:16:15',1,'2006-02-15 21:30:53'),(8981,'2005-07-30 04:25:30',4413,310,'2005-08-06 02:37:30',1,'2006-02-15 21:30:53'),(8982,'2005-07-30 04:31:02',1128,251,'2005-07-31 04:22:02',1,'2006-02-15 21:30:53'),(8983,'2005-07-30 04:31:08',1861,144,'2005-07-31 09:28:08',1,'2006-02-15 21:30:53'),(8984,'2005-07-30 04:31:50',2126,485,'2005-08-04 03:24:50',1,'2006-02-15 21:30:53'),(8985,'2005-07-30 04:34:51',3179,12,'2005-08-06 00:45:51',2,'2006-02-15 21:30:53'),(8986,'2005-07-30 04:37:20',3992,551,'2005-07-31 23:54:20',1,'2006-02-15 21:30:53'),(8987,'2005-07-30 04:37:36',1434,135,'2005-08-08 10:14:36',2,'2006-02-15 21:30:53'),(8988,'2005-07-30 04:38:49',777,487,'2005-08-07 07:00:49',2,'2006-02-15 21:30:53'),(8989,'2005-07-30 04:39:19',954,575,'2005-08-06 02:11:19',1,'2006-02-15 21:30:53'),(8990,'2005-07-30 04:41:42',1869,292,'2005-08-07 22:50:42',2,'2006-02-15 21:30:53'),(8991,'2005-07-30 04:42:54',4540,474,'2005-08-01 23:51:54',1,'2006-02-15 21:30:53'),(8992,'2005-07-30 04:44:18',4478,54,'2005-08-01 00:29:18',1,'2006-02-15 21:30:53'),(8993,'2005-07-30 04:51:25',1891,382,'2005-08-01 01:04:25',1,'2006-02-15 21:30:53'),(8994,'2005-07-30 04:51:32',1527,287,'2005-08-07 09:41:32',1,'2006-02-15 21:30:53'),(8995,'2005-07-30 04:53:11',3575,331,'2005-08-07 00:24:11',1,'2006-02-15 21:30:53'),(8996,'2005-07-30 04:53:23',1970,579,'2005-07-31 06:01:23',1,'2006-02-15 21:30:53'),(8997,'2005-07-30 04:53:56',850,31,'2005-08-03 07:10:56',1,'2006-02-15 21:30:53'),(8998,'2005-07-30 04:54:14',1573,120,'2005-08-08 08:18:14',2,'2006-02-15 21:30:53'),(8999,'2005-07-30 04:55:46',3458,424,'2005-08-01 00:16:46',2,'2006-02-15 21:30:53'),(9000,'2005-07-30 04:58:55',3763,290,'2005-08-08 04:01:55',2,'2006-02-15 21:30:53'),(9001,'2005-07-30 04:59:41',3682,440,'2005-07-31 08:56:41',2,'2006-02-15 21:30:53'),(9002,'2005-07-30 05:02:21',1936,137,'2005-07-31 04:58:21',1,'2006-02-15 21:30:53'),(9003,'2005-07-30 05:02:52',1605,507,'2005-07-31 10:33:52',1,'2006-02-15 21:30:53'),(9004,'2005-07-30 05:04:27',3775,178,'2005-07-31 00:49:27',1,'2006-02-15 21:30:53'),(9005,'2005-07-30 05:04:58',157,204,'2005-08-03 07:41:58',2,'2006-02-15 21:30:53'),(9006,'2005-07-30 05:06:32',3315,49,'2005-07-31 08:24:32',1,'2006-02-15 21:30:53'),(9007,'2005-07-30 05:09:32',2813,63,'2005-08-02 06:12:32',2,'2006-02-15 21:30:53'),(9008,'2005-07-30 05:10:26',3592,371,'2005-07-31 08:13:26',1,'2006-02-15 21:30:53'),(9009,'2005-07-30 05:12:01',4136,166,'2005-08-07 10:58:01',1,'2006-02-15 21:30:53'),(9010,'2005-07-30 05:12:04',1698,152,'2005-08-06 02:54:04',2,'2006-02-15 21:30:53'),(9011,'2005-07-30 05:16:29',2799,236,'2005-08-05 06:57:29',1,'2006-02-15 21:30:53'),(9012,'2005-07-30 05:18:57',3604,494,'2005-08-06 06:21:57',1,'2006-02-15 21:30:53'),(9013,'2005-07-30 05:19:20',2367,347,'2005-08-04 01:35:20',1,'2006-02-15 21:30:53'),(9014,'2005-07-30 05:19:27',311,297,'2005-08-01 01:10:27',2,'2006-02-15 21:30:53'),(9015,'2005-07-30 05:21:32',4128,203,'2005-08-08 07:03:32',2,'2006-02-15 21:30:53'),(9016,'2005-07-30 05:26:13',4309,312,'2005-08-04 00:25:13',2,'2006-02-15 21:30:53'),(9017,'2005-07-30 05:26:20',3325,319,'2005-08-04 10:00:20',2,'2006-02-15 21:30:53'),(9018,'2005-07-30 05:28:40',1982,218,'2005-08-07 01:34:40',1,'2006-02-15 21:30:53'),(9019,'2005-07-30 05:28:53',946,235,'2005-08-03 02:16:53',2,'2006-02-15 21:30:53'),(9020,'2005-07-30 05:31:27',1700,142,'2005-08-08 06:44:27',2,'2006-02-15 21:30:53'),(9021,'2005-07-30 05:34:24',674,498,'2005-08-03 04:13:24',1,'2006-02-15 21:30:53'),(9022,'2005-07-30 05:34:45',4473,159,'2005-08-03 23:57:45',2,'2006-02-15 21:30:53'),(9023,'2005-07-30 05:36:40',2911,148,'2005-08-07 06:20:40',1,'2006-02-15 21:30:53'),(9024,'2005-07-30 05:44:42',164,329,'2005-08-05 03:15:42',2,'2006-02-15 21:30:53'),(9025,'2005-07-30 05:50:08',2244,473,'2005-07-31 09:58:08',1,'2006-02-15 21:30:53'),(9026,'2005-07-30 05:55:31',1524,423,'2005-08-01 03:19:31',1,'2006-02-15 21:30:53'),(9027,'2005-07-30 05:58:27',449,72,'2005-08-03 03:02:27',1,'2006-02-15 21:30:53'),(9028,'2005-07-30 06:00:35',2687,119,'2005-08-02 01:35:35',1,'2006-02-15 21:30:53'),(9029,'2005-07-30 06:03:11',2220,52,'2005-08-04 01:42:11',1,'2006-02-15 21:30:53'),(9030,'2005-07-30 06:05:38',2237,367,'2005-08-03 00:19:38',1,'2006-02-15 21:30:53'),(9031,'2005-07-30 06:06:10',2377,2,'2005-08-04 10:45:10',2,'2006-02-15 21:30:53'),(9032,'2005-07-30 06:06:54',4448,369,'2005-08-01 05:27:54',1,'2006-02-15 21:30:53'),(9033,'2005-07-30 06:07:42',3416,35,'2005-08-05 01:18:42',1,'2006-02-15 21:30:53'),(9034,'2005-07-30 06:10:58',3847,144,'2005-08-08 05:00:58',2,'2006-02-15 21:30:53'),(9035,'2005-07-30 06:16:07',3785,243,'2005-08-06 09:22:07',1,'2006-02-15 21:30:53'),(9036,'2005-07-30 06:18:38',790,18,'2005-07-31 01:22:38',1,'2006-02-15 21:30:53'),(9037,'2005-07-30 06:23:14',3833,356,'2005-08-08 06:25:14',1,'2006-02-15 21:30:53'),(9038,'2005-07-30 06:23:35',217,514,'2005-08-06 11:10:35',1,'2006-02-15 21:30:53'),(9039,'2005-07-30 06:24:28',4493,485,'2005-08-08 00:28:28',1,'2006-02-15 21:30:53'),(9040,'2005-07-30 06:31:45',392,33,'2005-08-03 12:20:45',1,'2006-02-15 21:30:53'),(9041,'2005-07-30 06:32:36',1103,454,'2005-08-01 10:28:36',2,'2006-02-15 21:30:53'),(9042,'2005-07-30 06:33:55',2770,398,'2005-08-04 09:31:55',2,'2006-02-15 21:30:53'),(9043,'2005-07-30 06:34:07',4127,9,'2005-08-02 01:16:07',1,'2006-02-15 21:30:53'),(9044,'2005-07-30 06:35:21',3796,319,'2005-07-31 10:27:21',1,'2006-02-15 21:30:53'),(9045,'2005-07-30 06:36:57',4521,46,'2005-08-08 01:51:57',1,'2006-02-15 21:30:53'),(9046,'2005-07-30 06:46:55',1736,215,'2005-08-01 02:21:55',2,'2006-02-15 21:30:53'),(9047,'2005-07-30 06:56:33',256,522,'2005-08-08 06:40:33',2,'2006-02-15 21:30:53'),(9048,'2005-07-30 06:57:07',3929,100,'2005-08-05 00:57:07',1,'2006-02-15 21:30:53'),(9049,'2005-07-30 06:57:28',2620,417,'2005-08-04 09:02:28',1,'2006-02-15 21:30:53'),(9050,'2005-07-30 06:59:55',106,40,'2005-08-06 06:37:55',1,'2006-02-15 21:30:53'),(9051,'2005-07-30 07:05:54',1847,337,'2005-08-07 09:12:54',2,'2006-02-15 21:30:53'),(9052,'2005-07-30 07:06:08',3351,408,'2005-08-03 10:30:08',1,'2006-02-15 21:30:53'),(9053,'2005-07-30 07:07:39',2535,485,'2005-08-01 09:22:39',2,'2006-02-15 21:30:53'),(9054,'2005-07-30 07:11:44',2860,209,'2005-08-08 01:55:44',2,'2006-02-15 21:30:53'),(9055,'2005-07-30 07:13:07',634,512,'2005-08-01 12:18:07',1,'2006-02-15 21:30:53'),(9056,'2005-07-30 07:13:20',4363,380,'2005-08-03 07:36:20',1,'2006-02-15 21:30:53'),(9057,'2005-07-30 07:14:18',3141,202,'2005-08-01 05:10:18',2,'2006-02-15 21:30:53'),(9058,'2005-07-30 07:15:45',4214,403,'2005-07-31 02:57:45',2,'2006-02-15 21:30:53'),(9059,'2005-07-30 07:18:44',480,267,'2005-08-08 08:39:44',1,'2006-02-15 21:30:53'),(9060,'2005-07-30 07:20:36',4360,87,'2005-08-03 10:51:36',1,'2006-02-15 21:30:53'),(9061,'2005-07-30 07:21:52',1933,255,'2005-08-08 10:52:52',1,'2006-02-15 21:30:53'),(9062,'2005-07-30 07:23:17',2780,358,'2005-08-02 12:07:17',1,'2006-02-15 21:30:53'),(9063,'2005-07-30 07:24:34',2851,564,'2005-08-05 01:28:34',2,'2006-02-15 21:30:53'),(9064,'2005-07-30 07:24:55',1417,194,'2005-08-07 08:44:55',2,'2006-02-15 21:30:53'),(9065,'2005-07-30 07:25:09',349,238,'2005-07-31 05:18:09',2,'2006-02-15 21:30:53'),(9066,'2005-07-30 07:28:54',196,171,'2005-08-02 05:23:54',1,'2006-02-15 21:30:53'),(9067,'2005-07-30 07:31:01',3628,382,'2005-08-04 11:44:01',2,'2006-02-15 21:30:53'),(9068,'2005-07-30 07:31:45',2264,78,'2005-08-08 06:40:45',1,'2006-02-15 21:30:53'),(9069,'2005-07-30 07:39:59',1852,258,'2005-08-02 04:10:59',1,'2006-02-15 21:30:53'),(9070,'2005-07-30 07:40:39',3690,276,'2005-08-01 04:19:39',2,'2006-02-15 21:30:53'),(9071,'2005-07-30 07:40:58',3151,523,'2005-08-01 06:59:58',2,'2006-02-15 21:30:53'),(9072,'2005-07-30 07:45:49',4536,106,'2005-08-04 10:00:49',1,'2006-02-15 21:30:53'),(9073,'2005-07-30 07:49:56',2185,141,'2005-08-05 06:25:56',2,'2006-02-15 21:30:53'),(9074,'2005-07-30 07:50:10',3244,84,'2005-08-01 11:21:10',2,'2006-02-15 21:30:53'),(9075,'2005-07-30 07:55:14',1931,20,'2005-08-02 13:49:14',1,'2006-02-15 21:30:53'),(9076,'2005-07-30 07:58:12',496,447,'2005-08-08 06:04:12',1,'2006-02-15 21:30:53'),(9077,'2005-07-30 08:00:19',4324,471,'2005-08-08 11:21:19',1,'2006-02-15 21:30:53'),(9078,'2005-07-30 08:01:00',955,300,'2005-07-31 10:39:00',1,'2006-02-15 21:30:53'),(9079,'2005-07-30 08:02:00',2143,193,'2005-07-31 04:02:00',2,'2006-02-15 21:30:53'),(9080,'2005-07-30 08:02:39',94,276,'2005-08-06 12:02:39',1,'2006-02-15 21:30:53'),(9081,'2005-07-30 08:09:58',3040,572,'2005-08-03 13:27:58',1,'2006-02-15 21:30:53'),(9082,'2005-07-30 08:11:22',4042,438,'2005-08-06 09:26:22',2,'2006-02-15 21:30:53'),(9083,'2005-07-30 08:14:27',456,488,'2005-08-07 14:02:27',1,'2006-02-15 21:30:53'),(9084,'2005-07-30 08:14:29',3950,171,'2005-08-03 11:12:29',2,'2006-02-15 21:30:53'),(9085,'2005-07-30 08:17:24',3400,33,'2005-08-03 09:35:24',2,'2006-02-15 21:30:53'),(9086,'2005-07-30 08:18:46',2779,57,'2005-08-06 06:10:46',2,'2006-02-15 21:30:53'),(9087,'2005-07-30 08:19:47',4048,546,'2005-08-02 07:15:47',1,'2006-02-15 21:30:53'),(9088,'2005-07-30 08:21:02',3407,245,'2005-08-01 09:55:02',1,'2006-02-15 21:30:53'),(9089,'2005-07-30 08:23:39',490,369,'2005-07-31 06:00:39',1,'2006-02-15 21:30:53'),(9090,'2005-07-30 08:24:42',3426,104,'2005-08-08 06:17:42',2,'2006-02-15 21:30:53'),(9091,'2005-07-30 08:30:45',2249,66,'2005-08-07 13:28:45',1,'2006-02-15 21:30:53'),(9092,'2005-07-30 08:30:56',1877,17,'2005-08-06 08:09:56',2,'2006-02-15 21:30:53'),(9093,'2005-07-30 08:33:24',2208,96,'2005-08-04 11:07:24',1,'2006-02-15 21:30:53'),(9094,'2005-07-30 08:35:10',2699,140,'2005-08-07 08:18:10',2,'2006-02-15 21:30:53'),(9095,'2005-07-30 08:38:36',3019,511,'2005-07-31 06:14:36',1,'2006-02-15 21:30:53'),(9096,'2005-07-30 08:39:23',540,216,'2005-08-01 03:33:23',1,'2006-02-15 21:30:53'),(9097,'2005-07-30 08:40:35',570,173,'2005-08-04 11:19:35',2,'2006-02-15 21:30:53'),(9098,'2005-07-30 08:44:21',1267,144,'2005-08-08 12:31:21',1,'2006-02-15 21:30:53'),(9099,'2005-07-30 08:45:48',594,250,'2005-08-01 03:18:48',2,'2006-02-15 21:30:53'),(9100,'2005-07-30 08:46:09',4117,4,'2005-08-05 10:34:09',1,'2006-02-15 21:30:53'),(9101,'2005-07-30 08:47:13',3165,566,'2005-08-02 12:52:13',1,'2006-02-15 21:30:53'),(9102,'2005-07-30 08:48:20',1154,276,'2005-08-04 10:19:20',1,'2006-02-15 21:30:53'),(9103,'2005-07-30 08:49:26',3806,280,'2005-07-31 14:15:26',1,'2006-02-15 21:30:53'),(9104,'2005-07-30 08:49:55',3372,322,'2005-08-06 12:23:55',1,'2006-02-15 21:30:53'),(9105,'2005-07-30 08:50:25',4443,262,'2005-08-05 06:08:25',1,'2006-02-15 21:30:53'),(9106,'2005-07-30 08:52:34',2935,148,'2005-08-02 07:38:34',2,'2006-02-15 21:30:53'),(9107,'2005-07-30 08:52:45',1068,531,'2005-08-05 08:39:45',2,'2006-02-15 21:30:53'),(9108,'2005-07-30 08:56:36',3977,490,'2005-08-04 11:07:36',1,'2006-02-15 21:30:53'),(9109,'2005-07-30 08:58:24',787,266,'2005-08-07 06:56:24',1,'2006-02-15 21:30:53'),(9110,'2005-07-30 09:05:42',1474,317,'2005-08-03 05:15:42',1,'2006-02-15 21:30:53'),(9111,'2005-07-30 09:05:44',166,211,'2005-08-04 14:27:44',2,'2006-02-15 21:30:53'),(9112,'2005-07-30 09:06:31',395,74,'2005-08-04 05:12:31',2,'2006-02-15 21:30:53'),(9113,'2005-07-30 09:09:03',3903,374,'2005-07-31 03:13:03',1,'2006-02-15 21:30:53'),(9114,'2005-07-30 09:13:21',893,18,'2005-08-05 06:00:21',2,'2006-02-15 21:30:53'),(9115,'2005-07-30 09:13:55',3750,322,'2005-08-04 04:02:55',2,'2006-02-15 21:30:53'),(9116,'2005-07-30 09:19:41',2917,446,'2005-08-03 08:01:41',2,'2006-02-15 21:30:53'),(9117,'2005-07-30 09:20:59',3055,371,'2005-08-07 08:47:59',1,'2006-02-15 21:30:53'),(9118,'2005-07-30 09:24:18',4538,172,'2005-08-02 14:46:18',2,'2006-02-15 21:30:53'),(9119,'2005-07-30 09:25:56',275,305,'2005-08-03 03:36:56',1,'2006-02-15 21:30:53'),(9120,'2005-07-30 09:26:08',139,473,'2005-08-08 09:52:08',1,'2006-02-15 21:30:53'),(9121,'2005-07-30 09:36:26',3098,150,'2005-08-05 15:17:26',2,'2006-02-15 21:30:53'),(9122,'2005-07-30 09:36:52',627,365,'2005-08-05 13:20:52',1,'2006-02-15 21:30:53'),(9123,'2005-07-30 09:39:15',3748,293,'2005-08-02 08:12:15',2,'2006-02-15 21:30:53'),(9124,'2005-07-30 09:43:12',4552,105,'2005-08-06 06:17:12',1,'2006-02-15 21:30:53'),(9125,'2005-07-30 09:43:39',333,335,'2005-08-07 14:02:39',1,'2006-02-15 21:30:53'),(9126,'2005-07-30 09:44:15',4495,590,'2005-08-02 11:02:15',2,'2006-02-15 21:30:53'),(9127,'2005-07-30 09:46:36',4114,300,'2005-07-31 07:43:36',1,'2006-02-15 21:30:53'),(9128,'2005-07-30 09:51:14',3647,372,'2005-08-07 06:23:14',1,'2006-02-15 21:30:53'),(9129,'2005-07-30 09:51:21',2658,125,'2005-08-07 08:50:21',2,'2006-02-15 21:30:53'),(9130,'2005-07-30 09:55:10',1715,354,'2005-08-04 08:57:10',1,'2006-02-15 21:30:53'),(9131,'2005-07-30 09:55:57',623,142,'2005-08-01 14:21:57',1,'2006-02-15 21:30:53'),(9132,'2005-07-30 09:56:00',402,159,'2005-08-02 09:22:00',1,'2006-02-15 21:30:53'),(9133,'2005-07-30 09:59:00',408,576,'2005-08-07 04:24:00',1,'2006-02-15 21:30:53'),(9134,'2005-07-30 10:00:21',3797,559,'2005-08-01 05:01:21',1,'2006-02-15 21:30:53'),(9135,'2005-07-30 10:06:53',821,161,'2005-08-03 13:57:53',2,'2006-02-15 21:30:53'),(9136,'2005-07-30 10:07:20',1734,57,'2005-07-31 08:20:20',2,'2006-02-15 21:30:53'),(9137,'2005-07-30 10:09:24',840,459,'2005-08-06 04:30:24',2,'2006-02-15 21:30:53'),(9138,'2005-07-30 10:11:52',2550,17,'2005-07-31 07:05:52',2,'2006-02-15 21:30:53'),(9139,'2005-07-30 10:11:52',2809,133,'2005-08-03 12:44:52',1,'2006-02-15 21:30:53'),(9140,'2005-07-30 10:12:01',4095,25,'2005-08-06 09:16:01',2,'2006-02-15 21:30:53'),(9141,'2005-07-30 10:16:04',3087,484,'2005-08-05 08:01:04',1,'2006-02-15 21:30:53'),(9142,'2005-07-30 10:21:03',4467,486,'2005-08-04 15:14:03',1,'2006-02-15 21:30:53'),(9143,'2005-07-30 10:22:11',2962,511,'2005-08-07 06:13:11',2,'2006-02-15 21:30:53'),(9144,'2005-07-30 10:22:15',718,381,'2005-08-05 08:14:15',1,'2006-02-15 21:30:53'),(9145,'2005-07-30 10:27:55',559,176,'2005-08-07 14:41:55',2,'2006-02-15 21:30:53'),(9146,'2005-07-30 10:32:08',483,302,'2005-08-08 14:30:08',1,'2006-02-15 21:30:53'),(9147,'2005-07-30 10:38:59',4167,394,'2005-08-02 11:45:59',2,'2006-02-15 21:30:53'),(9148,'2005-07-30 10:39:10',1407,333,'2005-08-04 07:17:10',2,'2006-02-15 21:30:53'),(9149,'2005-07-30 10:45:12',2632,21,'2005-08-01 09:40:12',1,'2006-02-15 21:30:53'),(9150,'2005-07-30 10:49:32',2834,213,'2005-08-08 15:43:32',1,'2006-02-15 21:30:53'),(9151,'2005-07-30 10:50:53',3956,102,'2005-08-07 08:19:53',1,'2006-02-15 21:30:53'),(9152,'2005-07-30 10:51:27',3607,595,'2005-07-31 06:38:27',2,'2006-02-15 21:30:53'),(9153,'2005-07-30 10:58:16',3743,589,'2005-08-03 06:16:16',2,'2006-02-15 21:30:53'),(9154,'2005-07-30 10:59:54',576,312,'2005-08-05 16:47:54',1,'2006-02-15 21:30:53'),(9155,'2005-07-30 11:00:00',3787,107,'2005-08-02 05:24:00',2,'2006-02-15 21:30:53'),(9156,'2005-07-30 11:04:55',1747,145,'2005-07-31 14:10:55',2,'2006-02-15 21:30:53'),(9157,'2005-07-30 11:06:23',146,19,'2005-08-05 05:29:23',2,'2006-02-15 21:30:53'),(9158,'2005-07-30 11:12:03',4017,16,'2005-08-02 05:55:03',2,'2006-02-15 21:30:53'),(9159,'2005-07-30 11:16:37',1234,217,'2005-08-03 10:32:37',1,'2006-02-15 21:30:53'),(9160,'2005-07-30 11:17:33',183,34,'2005-08-06 15:16:33',2,'2006-02-15 21:30:53'),(9161,'2005-07-30 11:19:18',969,433,'2005-08-02 05:32:18',1,'2006-02-15 21:30:53'),(9162,'2005-07-30 11:21:56',4198,184,'2005-08-02 15:32:56',1,'2006-02-15 21:30:53'),(9163,'2005-07-30 11:23:22',4562,345,'2005-07-31 07:34:22',2,'2006-02-15 21:30:53'),(9164,'2005-07-30 11:24:14',4434,342,'2005-08-08 16:24:14',1,'2006-02-15 21:30:53'),(9165,'2005-07-30 11:24:28',4034,291,'2005-08-03 09:38:28',1,'2006-02-15 21:30:53'),(9166,'2005-07-30 11:26:28',308,12,'2005-08-04 12:32:28',1,'2006-02-15 21:30:53'),(9167,'2005-07-30 11:30:37',1785,162,'2005-08-08 17:13:37',1,'2006-02-15 21:30:53'),(9168,'2005-07-30 11:31:17',2035,75,'2005-08-08 16:56:17',2,'2006-02-15 21:30:53'),(9169,'2005-07-30 11:35:00',1567,245,'2005-08-06 16:16:00',2,'2006-02-15 21:30:53'),(9170,'2005-07-30 11:35:24',4279,425,'2005-08-05 05:36:24',1,'2006-02-15 21:30:53'),(9171,'2005-07-30 11:36:24',1832,189,'2005-08-07 06:04:24',2,'2006-02-15 21:30:53'),(9172,'2005-07-30 11:36:38',695,437,'2005-08-04 09:39:38',1,'2006-02-15 21:30:53'),(9173,'2005-07-30 11:40:10',2103,381,'2005-08-04 05:40:10',2,'2006-02-15 21:30:53'),(9174,'2005-07-30 11:42:10',2636,144,'2005-07-31 09:52:10',1,'2006-02-15 21:30:53'),(9175,'2005-07-30 11:47:48',358,133,'2005-08-02 08:13:48',1,'2006-02-15 21:30:53'),(9176,'2005-07-30 11:50:54',2659,260,'2005-08-02 14:25:54',2,'2006-02-15 21:30:53'),(9177,'2005-07-30 11:52:40',1088,400,'2005-08-08 09:35:40',1,'2006-02-15 21:30:53'),(9178,'2005-07-30 11:58:50',2046,448,'2005-08-08 15:24:50',2,'2006-02-15 21:30:53'),(9179,'2005-07-30 12:02:41',62,50,'2005-08-05 15:23:41',2,'2006-02-15 21:30:53'),(9180,'2005-07-30 12:03:15',3479,442,'2005-08-01 14:25:15',1,'2006-02-15 21:30:53'),(9181,'2005-07-30 12:05:58',3953,224,'2005-08-02 06:22:58',1,'2006-02-15 21:30:53'),(9182,'2005-07-30 12:06:58',2533,165,'2005-08-08 11:33:58',2,'2006-02-15 21:30:53'),(9183,'2005-07-30 12:09:56',4320,475,'2005-08-06 11:50:56',2,'2006-02-15 21:30:53'),(9184,'2005-07-30 12:10:19',51,365,'2005-08-01 07:35:19',2,'2006-02-15 21:30:53'),(9185,'2005-07-30 12:10:40',2268,426,'2005-08-06 07:01:40',1,'2006-02-15 21:30:53'),(9186,'2005-07-30 12:13:48',4513,273,'2005-07-31 11:59:48',1,'2006-02-15 21:30:53'),(9187,'2005-07-30 12:14:03',4008,469,'2005-08-04 13:10:03',2,'2006-02-15 21:30:53'),(9188,'2005-07-30 12:19:54',727,195,'2005-08-06 09:12:54',2,'2006-02-15 21:30:53'),(9189,'2005-07-30 12:20:59',4529,485,'2005-08-06 16:15:59',1,'2006-02-15 21:30:53'),(9190,'2005-07-30 12:24:17',4421,177,'2005-08-03 07:41:17',2,'2006-02-15 21:30:53'),(9191,'2005-07-30 12:25:51',500,314,'2005-08-05 16:13:51',1,'2006-02-15 21:30:53'),(9192,'2005-07-30 12:26:26',2372,102,'2005-08-04 07:54:26',2,'2006-02-15 21:30:53'),(9193,'2005-07-30 12:28:42',3470,69,'2005-08-02 12:17:42',2,'2006-02-15 21:30:53'),(9194,'2005-07-30 12:28:45',2467,294,'2005-08-06 14:38:45',1,'2006-02-15 21:30:53'),(9195,'2005-07-30 12:29:43',944,440,'2005-08-04 12:35:43',1,'2006-02-15 21:30:53'),(9196,'2005-07-30 12:30:19',4298,251,'2005-07-31 18:01:19',2,'2006-02-15 21:30:53'),(9197,'2005-07-30 12:31:36',3214,168,'2005-08-03 09:05:36',1,'2006-02-15 21:30:53'),(9198,'2005-07-30 12:37:08',2371,105,'2005-08-07 16:37:08',2,'2006-02-15 21:30:53'),(9199,'2005-07-30 12:38:00',4336,580,'2005-08-01 07:09:00',1,'2006-02-15 21:30:53'),(9200,'2005-07-30 12:39:52',3277,137,'2005-08-08 09:43:52',2,'2006-02-15 21:30:53'),(9201,'2005-07-30 12:42:21',4387,291,'2005-08-08 06:50:21',1,'2006-02-15 21:30:53'),(9202,'2005-07-30 12:43:24',4525,466,'2005-08-07 10:39:24',2,'2006-02-15 21:30:53'),(9203,'2005-07-30 12:43:40',2112,169,'2005-08-01 09:31:40',2,'2006-02-15 21:30:53'),(9204,'2005-07-30 12:43:58',4378,43,'2005-08-03 16:26:58',2,'2006-02-15 21:30:53'),(9205,'2005-07-30 12:46:40',4165,259,'2005-08-08 14:58:40',1,'2006-02-15 21:30:53'),(9206,'2005-07-30 12:46:59',2021,404,'2005-08-03 14:58:59',1,'2006-02-15 21:30:53'),(9207,'2005-07-30 12:49:57',1346,345,'2005-07-31 14:32:57',2,'2006-02-15 21:30:53'),(9208,'2005-07-30 12:54:03',2751,339,'2005-08-06 17:22:03',2,'2006-02-15 21:30:53'),(9209,'2005-07-30 12:55:36',3940,23,'2005-08-03 11:31:36',2,'2006-02-15 21:30:53'),(9210,'2005-07-30 12:56:44',101,105,'2005-08-08 09:41:44',2,'2006-02-15 21:30:53'),(9211,'2005-07-30 12:59:45',595,57,'2005-08-07 18:17:45',2,'2006-02-15 21:30:53'),(9212,'2005-07-30 13:03:13',2111,73,'2005-08-06 09:48:13',1,'2006-02-15 21:30:53'),(9213,'2005-07-30 13:07:11',184,388,'2005-08-01 15:30:11',1,'2006-02-15 21:30:53'),(9214,'2005-07-30 13:10:14',2823,181,'2005-08-06 14:22:14',2,'2006-02-15 21:30:53'),(9215,'2005-07-30 13:11:11',3591,128,'2005-08-06 13:06:11',1,'2006-02-15 21:30:53'),(9216,'2005-07-30 13:11:19',2783,38,'2005-07-31 11:27:19',2,'2006-02-15 21:30:53'),(9217,'2005-07-30 13:13:55',1561,112,'2005-08-05 17:27:55',1,'2006-02-15 21:30:53'),(9218,'2005-07-30 13:14:35',119,172,'2005-08-07 18:03:35',1,'2006-02-15 21:30:53'),(9219,'2005-07-30 13:15:21',771,329,'2005-08-01 11:39:21',1,'2006-02-15 21:30:53'),(9220,'2005-07-30 13:17:27',2463,569,'2005-08-07 11:34:27',2,'2006-02-15 21:30:53'),(9221,'2005-07-30 13:20:06',2496,113,'2005-08-06 13:58:06',2,'2006-02-15 21:30:53'),(9222,'2005-07-30 13:21:08',3648,95,'2005-08-08 10:42:08',2,'2006-02-15 21:30:53'),(9223,'2005-07-30 13:23:20',3231,595,'2005-08-04 11:24:20',1,'2006-02-15 21:30:53'),(9224,'2005-07-30 13:25:37',2260,406,'2005-08-01 15:13:37',2,'2006-02-15 21:30:53'),(9225,'2005-07-30 13:29:47',1992,391,'2005-08-02 17:08:47',2,'2006-02-15 21:30:53'),(9226,'2005-07-30 13:31:20',4315,3,'2005-08-06 16:42:20',1,'2006-02-15 21:30:53'),(9227,'2005-07-30 13:36:13',2353,522,'2005-08-07 17:39:13',1,'2006-02-15 21:30:53'),(9228,'2005-07-30 13:36:57',2325,91,'2005-08-05 10:43:57',1,'2006-02-15 21:30:53'),(9229,'2005-07-30 13:38:17',3780,276,'2005-08-08 18:17:17',2,'2006-02-15 21:30:53'),(9230,'2005-07-30 13:39:42',1199,109,'2005-07-31 19:20:42',1,'2006-02-15 21:30:53'),(9231,'2005-07-30 13:42:15',1587,489,'2005-08-02 19:27:15',1,'2006-02-15 21:30:53'),(9232,'2005-07-30 13:43:00',1991,502,'2005-08-02 11:39:00',2,'2006-02-15 21:30:53'),(9233,'2005-07-30 13:44:15',2320,357,'2005-08-07 13:02:15',2,'2006-02-15 21:30:53'),(9234,'2005-07-30 13:45:54',1660,128,'2005-08-02 15:33:54',1,'2006-02-15 21:30:53'),(9235,'2005-07-30 13:47:17',984,181,'2005-08-06 17:15:17',2,'2006-02-15 21:30:53'),(9236,'2005-07-30 13:47:43',4030,2,'2005-08-08 18:52:43',1,'2006-02-15 21:30:53'),(9237,'2005-07-30 13:48:17',2777,157,'2005-07-31 13:57:17',2,'2006-02-15 21:30:53'),(9238,'2005-07-30 13:49:43',3356,12,'2005-08-08 08:25:43',2,'2006-02-15 21:30:53'),(9239,'2005-07-30 13:50:52',1728,580,'2005-08-06 16:28:52',1,'2006-02-15 21:30:53'),(9240,'2005-07-30 13:57:54',587,92,'2005-08-03 12:23:54',2,'2006-02-15 21:30:53'),(9241,'2005-07-30 13:58:41',4145,187,'2005-08-04 09:44:41',2,'2006-02-15 21:30:53'),(9242,'2005-07-30 14:03:58',755,306,'2005-08-02 18:09:58',2,'2006-02-15 21:30:53'),(9243,'2005-07-30 14:06:27',876,516,'2005-08-06 09:26:27',2,'2006-02-15 21:30:53'),(9244,'2005-07-30 14:06:53',3640,27,'2005-08-03 19:46:53',1,'2006-02-15 21:30:53'),(9245,'2005-07-30 14:07:50',2586,116,'2005-08-06 17:59:50',2,'2006-02-15 21:30:53'),(9246,'2005-07-30 14:12:31',3390,185,'2005-08-02 14:25:31',2,'2006-02-15 21:30:53'),(9247,'2005-07-30 14:13:56',4106,426,'2005-08-02 16:34:56',2,'2006-02-15 21:30:53'),(9248,'2005-07-30 14:14:11',1382,2,'2005-08-05 11:19:11',1,'2006-02-15 21:30:53'),(9249,'2005-07-30 14:15:02',2015,296,'2005-08-05 13:02:02',1,'2006-02-15 21:30:53'),(9250,'2005-07-30 14:18:16',4544,539,'2005-08-04 12:31:16',1,'2006-02-15 21:30:53'),(9251,'2005-07-30 14:19:25',2948,390,'2005-08-08 11:22:25',2,'2006-02-15 21:30:53'),(9252,'2005-07-30 14:19:59',2350,322,'2005-08-07 15:17:59',1,'2006-02-15 21:30:53'),(9253,'2005-07-30 14:20:12',4183,151,'2005-07-31 11:31:12',2,'2006-02-15 21:30:53'),(9254,'2005-07-30 14:26:11',495,33,'2005-08-04 16:12:11',1,'2006-02-15 21:30:53'),(9255,'2005-07-30 14:26:46',1596,23,'2005-08-07 18:16:46',1,'2006-02-15 21:30:53'),(9256,'2005-07-30 14:29:29',4021,19,'2005-08-05 16:59:29',1,'2006-02-15 21:30:53'),(9257,'2005-07-30 14:30:38',2615,466,'2005-08-04 17:57:38',1,'2006-02-15 21:30:53'),(9258,'2005-07-30 14:31:31',2007,275,'2005-08-05 16:29:31',2,'2006-02-15 21:30:53'),(9259,'2005-07-30 14:37:44',97,138,'2005-08-06 18:05:44',2,'2006-02-15 21:30:53'),(9260,'2005-07-30 14:38:22',3969,13,'2005-08-07 18:47:22',2,'2006-02-15 21:30:53'),(9261,'2005-07-30 14:39:35',372,380,'2005-08-08 11:26:35',1,'2006-02-15 21:30:53'),(9262,'2005-07-30 14:45:02',2322,349,'2005-08-05 15:18:02',2,'2006-02-15 21:30:53'),(9263,'2005-07-30 14:48:24',73,410,'2005-08-04 19:06:24',2,'2006-02-15 21:30:53'),(9264,'2005-07-30 14:51:36',4071,157,'2005-08-02 10:06:36',1,'2006-02-15 21:30:53'),(9265,'2005-07-30 14:55:25',3700,560,'2005-08-02 11:34:25',1,'2006-02-15 21:30:53'),(9266,'2005-07-30 14:59:01',1705,364,'2005-07-31 17:01:01',2,'2006-02-15 21:30:53'),(9267,'2005-07-30 14:59:05',645,409,'2005-08-04 10:17:05',1,'2006-02-15 21:30:53'),(9268,'2005-07-30 15:02:30',3593,592,'2005-08-05 12:50:30',1,'2006-02-15 21:30:53'),(9269,'2005-07-30 15:02:33',548,435,'2005-08-02 16:32:33',1,'2006-02-15 21:30:53'),(9270,'2005-07-30 15:03:16',700,232,'2005-07-31 16:09:16',2,'2006-02-15 21:30:53'),(9271,'2005-07-30 15:04:31',2660,100,'2005-07-31 20:33:31',1,'2006-02-15 21:30:53'),(9272,'2005-07-30 15:05:22',1352,553,'2005-08-05 10:02:22',2,'2006-02-15 21:30:53'),(9273,'2005-07-30 15:05:36',1867,497,'2005-08-08 09:07:36',1,'2006-02-15 21:30:53'),(9274,'2005-07-30 15:07:04',4424,47,'2005-08-06 11:17:04',2,'2006-02-15 21:30:53'),(9275,'2005-07-30 15:09:15',1916,439,'2005-07-31 10:23:15',2,'2006-02-15 21:30:53'),(9276,'2005-07-30 15:09:28',1528,237,'2005-08-06 19:39:28',1,'2006-02-15 21:30:53'),(9277,'2005-07-30 15:13:45',3734,82,'2005-08-05 10:25:45',2,'2006-02-15 21:30:53'),(9278,'2005-07-30 15:15:19',3782,581,'2005-08-03 20:21:19',1,'2006-02-15 21:30:53'),(9279,'2005-07-30 15:15:21',1070,567,'2005-08-07 18:46:21',1,'2006-02-15 21:30:53'),(9280,'2005-07-30 15:15:38',4103,286,'2005-08-05 19:20:38',2,'2006-02-15 21:30:53'),(9281,'2005-07-30 15:15:51',3086,398,'2005-08-05 12:58:51',1,'2006-02-15 21:30:53'),(9282,'2005-07-30 15:17:31',736,259,'2005-08-07 20:46:31',1,'2006-02-15 21:30:53'),(9283,'2005-07-30 15:25:19',1858,360,'2005-08-01 15:35:19',2,'2006-02-15 21:30:53'),(9284,'2005-07-30 15:25:19',3976,38,'2005-08-01 17:45:19',2,'2006-02-15 21:30:53'),(9285,'2005-07-30 15:26:08',3686,273,'2005-08-06 15:59:08',2,'2006-02-15 21:30:53'),(9286,'2005-07-30 15:32:28',2477,154,'2005-07-31 20:42:28',2,'2006-02-15 21:30:53'),(9287,'2005-07-30 15:35:39',2048,551,'2005-08-02 10:15:39',1,'2006-02-15 21:30:53'),(9288,'2005-07-30 15:56:39',2640,447,'2005-08-04 13:25:39',2,'2006-02-15 21:30:53'),(9289,'2005-07-30 15:57:04',389,453,'2005-08-07 18:46:04',1,'2006-02-15 21:30:53'),(9290,'2005-07-30 15:59:08',2275,500,'2005-08-06 21:49:08',2,'2006-02-15 21:30:53'),(9291,'2005-07-30 16:03:39',2884,406,'2005-08-05 11:11:39',2,'2006-02-15 21:30:53'),(9292,'2005-07-30 16:08:21',1702,11,'2005-08-07 10:38:21',2,'2006-02-15 21:30:53'),(9293,'2005-07-30 16:12:28',1676,65,'2005-08-05 18:34:28',2,'2006-02-15 21:30:53'),(9294,'2005-07-30 16:14:37',2468,433,'2005-08-07 18:49:37',1,'2006-02-15 21:30:53'),(9295,'2005-07-30 16:18:39',494,102,'2005-08-03 12:46:39',1,'2006-02-15 21:30:53'),(9296,'2005-07-30 16:21:13',4088,2,'2005-08-08 11:57:13',1,'2006-02-15 21:30:53'),(9297,'2005-07-30 16:26:29',3502,191,'2005-08-03 13:51:29',1,'2006-02-15 21:30:53'),(9298,'2005-07-30 16:27:53',2106,208,'2005-08-07 12:32:53',2,'2006-02-15 21:30:53'),(9299,'2005-07-30 16:32:51',1515,555,'2005-08-08 15:28:51',2,'2006-02-15 21:30:53'),(9300,'2005-07-30 16:33:12',1639,571,'2005-08-05 15:56:12',1,'2006-02-15 21:30:53'),(9301,'2005-07-30 16:34:29',1073,174,'2005-07-31 18:41:29',2,'2006-02-15 21:30:53'),(9302,'2005-07-30 16:34:57',2326,55,'2005-07-31 11:08:57',2,'2006-02-15 21:30:53'),(9303,'2005-07-30 16:35:59',4299,186,'2005-08-03 18:31:59',1,'2006-02-15 21:30:53'),(9304,'2005-07-30 16:41:34',2937,296,'2005-08-02 13:55:34',2,'2006-02-15 21:30:53'),(9305,'2005-07-30 16:45:56',1224,82,'2005-08-08 21:15:56',2,'2006-02-15 21:30:53'),(9306,'2005-07-30 16:47:17',3983,336,'2005-08-02 22:15:17',1,'2006-02-15 21:30:53'),(9307,'2005-07-30 16:52:43',3831,538,'2005-08-01 11:58:43',1,'2006-02-15 21:30:53'),(9308,'2005-07-30 16:53:21',2202,267,'2005-08-08 15:33:21',2,'2006-02-15 21:30:53'),(9309,'2005-07-30 16:55:53',3616,30,'2005-08-07 11:23:53',1,'2006-02-15 21:30:53'),(9310,'2005-07-30 16:57:09',2957,529,'2005-08-03 18:14:09',1,'2006-02-15 21:30:53'),(9311,'2005-07-30 16:58:31',1432,178,'2005-08-07 15:23:31',1,'2006-02-15 21:30:53'),(9312,'2005-07-30 16:59:17',2483,76,'2005-08-03 17:24:17',2,'2006-02-15 21:30:53'),(9313,'2005-07-30 16:59:43',4070,41,'2005-08-05 14:06:43',2,'2006-02-15 21:30:53'),(9314,'2005-07-30 17:05:19',2358,390,'2005-07-31 12:19:19',1,'2006-02-15 21:30:53'),(9315,'2005-07-30 17:05:29',444,96,'2005-08-01 12:47:29',1,'2006-02-15 21:30:53'),(9316,'2005-07-30 17:11:58',4409,366,'2005-08-05 14:36:58',1,'2006-02-15 21:30:53'),(9317,'2005-07-30 17:13:37',4138,217,'2005-08-08 11:33:37',1,'2006-02-15 21:30:53'),(9318,'2005-07-30 17:14:30',2426,314,'2005-08-06 16:53:30',1,'2006-02-15 21:30:53'),(9319,'2005-07-30 17:15:27',4066,136,'2005-08-03 14:03:27',1,'2006-02-15 21:30:53'),(9320,'2005-07-30 17:16:39',909,221,'2005-08-06 18:43:39',2,'2006-02-15 21:30:53'),(9321,'2005-07-30 17:19:44',3558,112,'2005-08-06 22:42:44',2,'2006-02-15 21:30:53'),(9322,'2005-07-30 17:21:39',223,439,'2005-08-06 16:58:39',2,'2006-02-15 21:30:53'),(9323,'2005-07-30 17:21:44',3749,131,'2005-08-03 16:28:44',1,'2006-02-15 21:30:53'),(9324,'2005-07-30 17:28:52',1231,332,'2005-08-06 19:02:52',1,'2006-02-15 21:30:53'),(9325,'2005-07-30 17:29:19',1938,476,'2005-08-08 12:55:19',2,'2006-02-15 21:30:53'),(9326,'2005-07-30 17:30:03',3772,588,'2005-08-01 13:41:03',2,'2006-02-15 21:30:53'),(9327,'2005-07-30 17:31:03',345,373,'2005-08-08 19:16:03',1,'2006-02-15 21:30:53'),(9328,'2005-07-30 17:32:11',1087,89,'2005-08-05 13:36:11',1,'2006-02-15 21:30:53'),(9329,'2005-07-30 17:42:38',1293,593,'2005-08-08 23:17:38',1,'2006-02-15 21:30:53'),(9330,'2005-07-30 17:44:24',4227,232,'2005-08-08 17:39:24',1,'2006-02-15 21:30:53'),(9331,'2005-07-30 17:46:50',2248,274,'2005-08-01 19:03:50',1,'2006-02-15 21:30:53'),(9332,'2005-07-30 17:53:39',1156,480,'2005-08-02 12:25:39',1,'2006-02-15 21:30:53'),(9333,'2005-07-30 17:53:45',1377,437,'2005-07-31 22:35:45',2,'2006-02-15 21:30:53'),(9334,'2005-07-30 17:56:38',1499,25,'2005-08-03 21:27:38',1,'2006-02-15 21:30:53'),(9335,'2005-07-30 18:00:53',1006,522,'2005-08-01 16:05:53',1,'2006-02-15 21:30:53'),(9336,'2005-07-30 18:01:15',1911,557,'2005-08-05 23:10:15',1,'2006-02-15 21:30:53'),(9337,'2005-07-30 18:02:25',2363,90,'2005-07-31 12:30:25',2,'2006-02-15 21:30:53'),(9338,'2005-07-30 18:03:13',1482,333,'2005-08-08 23:57:13',2,'2006-02-15 21:30:53'),(9339,'2005-07-30 18:03:28',3171,68,'2005-08-08 19:45:28',2,'2006-02-15 21:30:53'),(9340,'2005-07-30 18:07:16',3228,213,'2005-08-04 14:33:16',2,'2006-02-15 21:30:53'),(9341,'2005-07-30 18:07:58',894,557,'2005-08-01 17:43:58',1,'2006-02-15 21:30:53'),(9342,'2005-07-30 18:09:56',2318,552,'2005-08-08 13:54:56',2,'2006-02-15 21:30:53'),(9343,'2005-07-30 18:13:13',3521,53,'2005-08-02 13:48:13',1,'2006-02-15 21:30:53'),(9344,'2005-07-30 18:13:45',1005,396,'2005-08-07 15:23:45',2,'2006-02-15 21:30:53'),(9345,'2005-07-30 18:13:51',2042,436,'2005-08-07 13:45:51',2,'2006-02-15 21:30:53'),(9346,'2005-07-30 18:13:52',2845,196,'2005-08-03 17:58:52',1,'2006-02-15 21:30:53'),(9347,'2005-07-30 18:16:03',3557,479,'2005-08-05 18:35:03',1,'2006-02-15 21:30:53'),(9348,'2005-07-30 18:17:09',3128,87,'2005-08-07 15:25:09',1,'2006-02-15 21:30:53'),(9349,'2005-07-30 18:20:08',3739,579,'2005-08-08 22:06:08',1,'2006-02-15 21:30:53'),(9350,'2005-07-30 18:24:30',798,434,'2005-08-02 15:34:30',2,'2006-02-15 21:30:53'),(9351,'2005-07-30 18:28:30',2063,107,'2005-08-02 17:26:30',1,'2006-02-15 21:30:53'),(9352,'2005-07-30 18:29:26',2619,360,'2005-07-31 19:43:26',1,'2006-02-15 21:30:53'),(9353,'2005-07-30 18:30:37',3581,283,'2005-08-06 22:32:37',2,'2006-02-15 21:30:53'),(9354,'2005-07-30 18:32:51',510,595,'2005-08-02 21:28:51',2,'2006-02-15 21:30:53'),(9355,'2005-07-30 18:35:25',1122,201,'2005-08-03 20:33:25',2,'2006-02-15 21:30:53'),(9356,'2005-07-30 18:36:24',4188,60,'2005-08-03 14:10:24',1,'2006-02-15 21:30:53'),(9357,'2005-07-30 18:37:00',3927,181,'2005-08-08 19:57:00',2,'2006-02-15 21:30:53'),(9358,'2005-07-30 18:37:24',712,302,'2005-08-07 23:34:24',2,'2006-02-15 21:30:53'),(9359,'2005-07-30 18:39:28',21,501,'2005-07-31 15:39:28',1,'2006-02-15 21:30:53'),(9360,'2005-07-30 18:39:43',2119,186,'2005-08-04 22:41:43',2,'2006-02-15 21:30:53'),(9361,'2005-07-30 18:43:49',4163,335,'2005-08-06 21:24:49',1,'2006-02-15 21:30:53'),(9362,'2005-07-30 18:44:16',3357,420,'2005-08-01 20:14:16',1,'2006-02-15 21:30:53'),(9363,'2005-07-30 18:44:23',873,323,'2005-08-04 15:03:23',1,'2006-02-15 21:30:53'),(9364,'2005-07-30 18:44:44',306,87,'2005-08-08 23:55:44',2,'2006-02-15 21:30:53'),(9365,'2005-07-30 18:46:02',1539,232,'2005-08-03 20:15:02',1,'2006-02-15 21:30:53'),(9366,'2005-07-30 18:48:57',4013,557,'2005-08-03 15:17:57',2,'2006-02-15 21:30:53'),(9367,'2005-07-30 18:49:58',793,557,'2005-08-08 22:04:58',1,'2006-02-15 21:30:53'),(9368,'2005-07-30 18:50:53',3026,388,'2005-08-05 17:56:53',2,'2006-02-15 21:30:53'),(9369,'2005-07-30 18:52:19',3538,36,'2005-08-01 12:53:19',1,'2006-02-15 21:30:53'),(9370,'2005-07-30 18:57:29',4433,588,'2005-08-01 21:35:29',2,'2006-02-15 21:30:53'),(9371,'2005-07-30 18:58:00',2980,4,'2005-08-03 15:14:00',1,'2006-02-15 21:30:53'),(9372,'2005-07-30 19:04:30',4075,454,'2005-08-09 00:18:30',2,'2006-02-15 21:30:53'),(9373,'2005-07-30 19:05:36',3478,180,'2005-08-05 16:16:36',2,'2006-02-15 21:30:53'),(9374,'2005-07-30 19:10:03',103,302,'2005-08-06 21:54:03',2,'2006-02-15 21:30:53'),(9375,'2005-07-30 19:10:17',3063,529,'2005-08-02 23:00:17',1,'2006-02-15 21:30:53'),(9376,'2005-07-30 19:11:49',451,86,'2005-08-04 18:14:49',1,'2006-02-15 21:30:53'),(9377,'2005-07-30 19:12:18',4164,421,'2005-08-05 19:38:18',1,'2006-02-15 21:30:53'),(9378,'2005-07-30 19:12:54',2209,197,'2005-08-05 18:16:54',1,'2006-02-15 21:30:53'),(9379,'2005-07-30 19:13:01',3855,452,'2005-08-07 19:18:01',2,'2006-02-15 21:30:53'),(9380,'2005-07-30 19:17:31',4403,264,'2005-08-01 20:46:31',1,'2006-02-15 21:30:53'),(9381,'2005-07-30 19:23:04',4064,329,'2005-07-31 23:37:04',2,'2006-02-15 21:30:53'),(9382,'2005-07-30 19:23:44',2127,17,'2005-08-06 16:20:44',2,'2006-02-15 21:30:53'),(9383,'2005-07-30 19:24:50',2806,416,'2005-08-01 21:41:50',2,'2006-02-15 21:30:53'),(9384,'2005-07-30 19:25:35',2313,220,'2005-08-08 21:50:35',1,'2006-02-15 21:30:53'),(9385,'2005-07-30 19:25:49',3453,570,'2005-08-08 17:08:49',2,'2006-02-15 21:30:53'),(9386,'2005-07-30 19:26:21',1123,189,'2005-08-05 21:00:21',2,'2006-02-15 21:30:53'),(9387,'2005-07-30 19:27:05',577,495,'2005-08-07 21:19:05',2,'2006-02-15 21:30:53'),(9388,'2005-07-30 19:27:22',2116,332,'2005-08-08 15:31:22',2,'2006-02-15 21:30:53'),(9389,'2005-07-30 19:27:59',3124,198,'2005-08-04 18:25:59',2,'2006-02-15 21:30:53'),(9390,'2005-07-30 19:42:07',1794,103,'2005-08-01 23:17:07',1,'2006-02-15 21:30:53'),(9391,'2005-07-30 19:48:41',665,273,'2005-08-04 15:27:41',1,'2006-02-15 21:30:53'),(9392,'2005-07-30 19:50:13',2797,29,'2005-08-03 22:38:13',2,'2006-02-15 21:30:53'),(9393,'2005-07-30 20:04:48',843,158,'2005-08-02 15:52:48',2,'2006-02-15 21:30:53'),(9394,'2005-07-30 20:06:24',161,204,'2005-08-06 22:36:24',1,'2006-02-15 21:30:53'),(9395,'2005-07-30 20:07:06',1298,306,'2005-08-08 21:21:06',1,'2006-02-15 21:30:53'),(9396,'2005-07-30 20:07:24',1250,91,'2005-08-03 21:20:24',2,'2006-02-15 21:30:53'),(9397,'2005-07-30 20:07:29',1550,373,'2005-08-05 00:36:29',1,'2006-02-15 21:30:53'),(9398,'2005-07-30 20:09:00',1175,570,'2005-08-01 23:35:00',2,'2006-02-15 21:30:53'),(9399,'2005-07-30 20:14:50',3668,569,'2005-08-03 17:30:50',1,'2006-02-15 21:30:53'),(9400,'2005-07-30 20:15:58',3910,368,'2005-08-03 21:21:58',1,'2006-02-15 21:30:53'),(9401,'2005-07-30 20:18:19',2057,331,'2005-08-07 15:46:19',1,'2006-02-15 21:30:53'),(9402,'2005-07-30 20:18:27',2424,48,'2005-08-07 21:29:27',2,'2006-02-15 21:30:53'),(9403,'2005-07-30 20:18:53',3466,267,'2005-08-06 19:54:53',1,'2006-02-15 21:30:53'),(9404,'2005-07-30 20:21:35',3832,140,'2005-08-02 15:52:35',1,'2006-02-15 21:30:53'),(9405,'2005-07-30 20:22:17',1983,463,'2005-08-08 16:55:17',1,'2006-02-15 21:30:53'),(9406,'2005-07-30 20:24:00',3419,453,'2005-08-07 19:50:00',1,'2006-02-15 21:30:53'),(9407,'2005-07-30 20:25:24',2594,585,'2005-08-08 22:51:24',2,'2006-02-15 21:30:53'),(9408,'2005-07-30 20:32:09',4383,571,'2005-08-04 20:14:09',2,'2006-02-15 21:30:53'),(9409,'2005-07-30 20:33:53',3053,156,'2005-08-05 18:32:53',2,'2006-02-15 21:30:53'),(9410,'2005-07-30 20:38:05',1789,22,'2005-07-31 19:57:05',2,'2006-02-15 21:30:53'),(9411,'2005-07-30 20:38:22',3484,536,'2005-08-06 01:23:22',2,'2006-02-15 21:30:53'),(9412,'2005-07-30 20:44:10',2482,522,'2005-08-06 21:13:10',2,'2006-02-15 21:30:53'),(9413,'2005-07-30 20:44:39',2618,290,'2005-08-01 01:56:39',2,'2006-02-15 21:30:53'),(9414,'2005-07-30 20:46:02',578,484,'2005-08-07 21:23:02',2,'2006-02-15 21:30:53'),(9415,'2005-07-30 20:48:31',3336,139,'2005-08-05 19:45:31',2,'2006-02-15 21:30:53'),(9416,'2005-07-30 20:52:45',1470,265,'2005-08-02 17:38:45',2,'2006-02-15 21:30:53'),(9417,'2005-07-30 20:54:55',2509,519,'2005-08-04 00:54:55',2,'2006-02-15 21:30:53'),(9418,'2005-07-30 21:00:52',241,168,'2005-08-08 15:56:52',2,'2006-02-15 21:30:53'),(9419,'2005-07-30 21:04:59',4427,142,'2005-08-06 15:47:59',2,'2006-02-15 21:30:53'),(9420,'2005-07-30 21:05:18',147,72,'2005-08-05 23:52:18',2,'2006-02-15 21:30:53'),(9421,'2005-07-30 21:08:32',2206,161,'2005-08-02 00:43:32',1,'2006-02-15 21:30:53'),(9422,'2005-07-30 21:08:41',1843,470,'2005-08-07 15:55:41',1,'2006-02-15 21:30:53'),(9423,'2005-07-30 21:10:14',3145,242,'2005-08-07 16:34:14',2,'2006-02-15 21:30:53'),(9424,'2005-07-30 21:10:56',4499,256,'2005-08-05 00:01:56',1,'2006-02-15 21:30:53'),(9425,'2005-07-30 21:11:21',271,295,'2005-08-05 19:00:21',1,'2006-02-15 21:30:53'),(9427,'2005-07-30 21:16:33',1494,85,'2005-08-05 17:23:33',2,'2006-02-15 21:30:53'),(9428,'2005-07-30 21:18:37',1948,335,'2005-08-05 16:09:37',1,'2006-02-15 21:30:53'),(9429,'2005-07-30 21:19:26',1769,288,'2005-08-07 18:39:26',1,'2006-02-15 21:30:53'),(9430,'2005-07-30 21:20:13',1529,367,'2005-08-04 21:45:13',2,'2006-02-15 21:30:53'),(9431,'2005-07-30 21:24:22',3364,39,'2005-08-03 01:22:22',2,'2006-02-15 21:30:53'),(9432,'2005-07-30 21:26:18',2489,570,'2005-08-05 00:23:18',1,'2006-02-15 21:30:53'),(9433,'2005-07-30 21:28:17',1082,128,'2005-08-08 18:20:17',2,'2006-02-15 21:30:53'),(9434,'2005-07-30 21:29:41',3792,13,'2005-08-01 16:30:41',2,'2006-02-15 21:30:53'),(9435,'2005-07-30 21:31:02',3116,301,'2005-08-05 22:34:02',1,'2006-02-15 21:30:53'),(9436,'2005-07-30 21:33:01',2329,268,'2005-08-06 17:38:01',1,'2006-02-15 21:30:53'),(9437,'2005-07-30 21:36:04',1230,592,'2005-08-08 01:26:04',1,'2006-02-15 21:30:53'),(9438,'2005-07-30 21:36:15',121,14,'2005-08-07 16:54:15',2,'2006-02-15 21:30:53'),(9439,'2005-07-30 21:38:12',290,479,'2005-08-06 00:03:12',1,'2006-02-15 21:30:53'),(9440,'2005-07-30 21:40:15',414,535,'2005-08-04 15:45:15',2,'2006-02-15 21:30:53'),(9441,'2005-07-30 21:43:28',3982,519,'2005-08-08 16:57:28',1,'2006-02-15 21:30:53'),(9442,'2005-07-30 21:44:31',44,75,'2005-08-04 01:29:31',1,'2006-02-15 21:30:53'),(9443,'2005-07-30 21:45:46',1675,3,'2005-08-05 21:22:46',1,'2006-02-15 21:30:53'),(9444,'2005-07-30 21:48:44',1134,259,'2005-08-08 22:36:44',2,'2006-02-15 21:30:53'),(9445,'2005-07-30 21:50:42',1480,549,'2005-08-05 18:34:42',2,'2006-02-15 21:30:53'),(9446,'2005-07-30 21:53:01',1880,477,'2005-08-06 19:00:01',2,'2006-02-15 21:30:53'),(9447,'2005-07-30 21:54:22',1053,82,'2005-08-09 01:07:22',2,'2006-02-15 21:30:53'),(9448,'2005-07-30 21:56:13',1213,278,'2005-08-04 18:03:13',1,'2006-02-15 21:30:53'),(9449,'2005-07-30 22:02:34',2,581,'2005-08-06 02:09:34',1,'2006-02-15 21:30:53'),(9450,'2005-07-30 22:04:04',1371,430,'2005-08-05 18:39:04',2,'2006-02-15 21:30:53'),(9451,'2005-07-30 22:10:17',685,584,'2005-08-07 02:53:17',2,'2006-02-15 21:30:53'),(9452,'2005-07-30 22:19:16',3178,130,'2005-08-04 19:26:16',1,'2006-02-15 21:30:53'),(9453,'2005-07-30 22:20:04',1988,221,'2005-08-08 02:27:04',1,'2006-02-15 21:30:53'),(9454,'2005-07-30 22:20:09',3028,81,'2005-08-04 01:33:09',2,'2006-02-15 21:30:53'),(9455,'2005-07-30 22:20:29',2647,220,'2005-08-08 20:08:29',1,'2006-02-15 21:30:53'),(9456,'2005-07-30 22:22:16',2068,534,'2005-08-05 18:56:16',2,'2006-02-15 21:30:53'),(9457,'2005-07-30 22:23:05',2172,487,'2005-07-31 23:07:05',2,'2006-02-15 21:30:53'),(9458,'2005-07-30 22:24:34',3105,343,'2005-08-04 21:26:34',2,'2006-02-15 21:30:53'),(9459,'2005-07-30 22:24:46',1132,489,'2005-08-02 00:44:46',2,'2006-02-15 21:30:53'),(9460,'2005-07-30 22:25:39',4463,580,'2005-08-08 20:56:39',2,'2006-02-15 21:30:53'),(9461,'2005-07-30 22:29:13',1679,377,'2005-08-05 20:55:13',2,'2006-02-15 21:30:53'),(9462,'2005-07-30 22:30:44',4090,192,'2005-08-09 03:54:44',2,'2006-02-15 21:30:53'),(9463,'2005-07-30 22:30:57',883,352,'2005-08-03 22:53:57',1,'2006-02-15 21:30:53'),(9464,'2005-07-30 22:31:31',3904,534,'2005-08-07 01:10:31',2,'2006-02-15 21:30:53'),(9465,'2005-07-30 22:39:53',3084,2,'2005-08-06 16:43:53',2,'2006-02-15 21:30:53'),(9466,'2005-07-30 22:44:36',2595,137,'2005-08-07 02:35:36',2,'2006-02-15 21:30:53'),(9467,'2005-07-30 22:45:34',1905,202,'2005-08-08 00:58:34',2,'2006-02-15 21:30:53'),(9468,'2005-07-30 22:53:52',4366,20,'2005-08-07 00:22:52',2,'2006-02-15 21:30:53'),(9469,'2005-07-30 22:56:34',967,59,'2005-08-07 03:16:34',2,'2006-02-15 21:30:53'),(9470,'2005-07-30 23:01:31',3908,566,'2005-08-07 01:35:31',2,'2006-02-15 21:30:53'),(9471,'2005-07-30 23:02:36',2390,424,'2005-08-04 17:49:36',1,'2006-02-15 21:30:53'),(9472,'2005-07-30 23:03:32',4178,404,'2005-08-01 18:02:32',1,'2006-02-15 21:30:53'),(9473,'2005-07-30 23:04:13',1717,185,'2005-08-04 21:48:13',2,'2006-02-15 21:30:53'),(9474,'2005-07-30 23:05:44',3771,206,'2005-08-05 23:46:44',1,'2006-02-15 21:30:53'),(9475,'2005-07-30 23:06:33',2186,567,'2005-08-04 23:23:33',1,'2006-02-15 21:30:53'),(9476,'2005-07-30 23:06:40',3599,197,'2005-08-04 22:52:40',2,'2006-02-15 21:30:53'),(9477,'2005-07-30 23:07:22',1932,213,'2005-08-04 20:54:22',1,'2006-02-15 21:30:53'),(9478,'2005-07-30 23:12:53',1139,283,'2005-08-04 02:41:53',1,'2006-02-15 21:30:53'),(9479,'2005-07-30 23:22:09',3461,308,'2005-07-31 22:26:09',2,'2006-02-15 21:30:53'),(9480,'2005-07-30 23:26:03',597,373,'2005-08-04 21:18:03',2,'2006-02-15 21:30:53'),(9481,'2005-07-30 23:26:05',613,481,'2005-08-04 17:46:05',1,'2006-02-15 21:30:53'),(9482,'2005-07-30 23:29:16',2421,348,'2005-08-02 20:37:16',2,'2006-02-15 21:30:53'),(9483,'2005-07-30 23:31:31',1136,593,'2005-08-09 04:29:31',2,'2006-02-15 21:30:53'),(9484,'2005-07-30 23:31:40',3389,26,'2005-08-02 18:25:40',1,'2006-02-15 21:30:53'),(9485,'2005-07-30 23:32:40',3722,338,'2005-08-08 17:44:40',1,'2006-02-15 21:30:53'),(9486,'2005-07-30 23:35:42',2787,403,'2005-08-09 02:08:42',2,'2006-02-15 21:30:53'),(9487,'2005-07-30 23:40:22',2165,406,'2005-08-01 22:29:22',1,'2006-02-15 21:30:53'),(9488,'2005-07-30 23:42:42',4221,528,'2005-08-08 22:15:42',1,'2006-02-15 21:30:53'),(9489,'2005-07-30 23:43:32',4011,17,'2005-07-31 20:45:32',2,'2006-02-15 21:30:53'),(9490,'2005-07-30 23:45:09',1302,487,'2005-08-07 18:50:09',1,'2006-02-15 21:30:53'),(9491,'2005-07-30 23:45:23',3624,179,'2005-08-01 00:33:23',2,'2006-02-15 21:30:53'),(9492,'2005-07-30 23:52:21',639,126,'2005-08-08 20:50:21',2,'2006-02-15 21:30:53'),(9493,'2005-07-30 23:52:30',1522,5,'2005-08-08 05:22:30',1,'2006-02-15 21:30:53'),(9494,'2005-07-30 23:52:46',3799,254,'2005-08-05 23:13:46',2,'2006-02-15 21:30:53'),(9495,'2005-07-30 23:54:26',2128,397,'2005-08-01 22:02:26',2,'2006-02-15 21:30:53'),(9496,'2005-07-30 23:55:20',453,125,'2005-08-02 02:47:20',2,'2006-02-15 21:30:53'),(9497,'2005-07-30 23:56:54',933,595,'2005-08-04 19:52:54',1,'2006-02-15 21:30:53'),(9498,'2005-07-30 23:56:55',1035,289,'2005-08-03 18:34:55',2,'2006-02-15 21:30:53'),(9499,'2005-07-30 23:58:30',602,461,'2005-08-01 00:55:30',2,'2006-02-15 21:30:53'),(9500,'2005-07-30 23:58:36',2808,241,'2005-08-07 21:08:36',2,'2006-02-15 21:30:53'),(9501,'2005-07-30 23:59:21',4398,75,'2005-08-05 19:50:21',2,'2006-02-15 21:30:53'),(9502,'2005-07-31 00:02:10',2700,471,'2005-08-01 19:47:10',1,'2006-02-15 21:30:53'),(9503,'2005-07-31 00:02:38',1013,311,'2005-08-06 06:01:38',1,'2006-02-15 21:30:53'),(9504,'2005-07-31 00:09:07',91,125,'2005-08-02 05:44:07',1,'2006-02-15 21:30:53'),(9505,'2005-07-31 00:11:19',4047,543,'2005-08-05 18:24:19',2,'2006-02-15 21:30:53'),(9506,'2005-07-31 00:19:01',3872,189,'2005-08-02 00:20:01',1,'2006-02-15 21:30:53'),(9507,'2005-07-31 00:22:29',387,525,'2005-08-07 05:59:29',2,'2006-02-15 21:30:53'),(9508,'2005-07-31 00:22:39',1204,316,'2005-08-04 05:40:39',1,'2006-02-15 21:30:53'),(9509,'2005-07-31 00:22:42',818,320,'2005-08-03 23:24:42',1,'2006-02-15 21:30:53'),(9510,'2005-07-31 00:24:17',2301,494,'2005-08-08 18:47:17',2,'2006-02-15 21:30:53'),(9511,'2005-07-31 00:25:05',964,549,'2005-08-09 02:46:05',1,'2006-02-15 21:30:53'),(9512,'2005-07-31 00:26:30',3786,173,'2005-08-04 23:43:30',2,'2006-02-15 21:30:53'),(9513,'2005-07-31 00:28:30',396,317,'2005-08-01 00:22:30',2,'2006-02-15 21:30:53'),(9514,'2005-07-31 00:29:44',1892,243,'2005-08-02 23:49:44',1,'2006-02-15 21:30:53'),(9515,'2005-07-31 00:35:05',3099,264,'2005-08-02 23:35:05',2,'2006-02-15 21:30:53'),(9516,'2005-07-31 00:40:58',3519,424,'2005-08-07 02:13:58',2,'2006-02-15 21:30:53'),(9517,'2005-07-31 00:41:23',3299,170,'2005-08-02 23:08:23',1,'2006-02-15 21:30:53'),(9518,'2005-07-31 00:43:26',2714,215,'2005-08-04 19:12:26',2,'2006-02-15 21:30:53'),(9519,'2005-07-31 00:45:57',3767,235,'2005-08-06 00:59:57',2,'2006-02-15 21:30:53'),(9520,'2005-07-31 00:50:54',1306,299,'2005-08-04 20:05:54',1,'2006-02-15 21:30:53'),(9521,'2005-07-31 00:52:24',1423,227,'2005-08-06 03:33:24',2,'2006-02-15 21:30:53'),(9522,'2005-07-31 00:55:11',4266,294,'2005-08-03 06:41:11',2,'2006-02-15 21:30:53'),(9523,'2005-07-31 00:56:09',891,356,'2005-08-05 05:44:09',2,'2006-02-15 21:30:53'),(9524,'2005-07-31 01:01:06',1796,535,'2005-08-04 04:06:06',2,'2006-02-15 21:30:53'),(9525,'2005-07-31 01:02:18',2990,246,'2005-08-06 21:31:18',1,'2006-02-15 21:30:53'),(9526,'2005-07-31 01:02:22',417,342,'2005-08-04 03:00:22',1,'2006-02-15 21:30:53'),(9527,'2005-07-31 01:02:24',2539,200,'2005-08-09 02:08:24',2,'2006-02-15 21:30:53'),(9528,'2005-07-31 01:05:04',193,241,'2005-08-07 01:16:04',1,'2006-02-15 21:30:53'),(9529,'2005-07-31 01:05:26',816,123,'2005-08-02 22:30:26',2,'2006-02-15 21:30:53'),(9530,'2005-07-31 01:09:06',1718,148,'2005-08-04 23:47:06',2,'2006-02-15 21:30:53'),(9531,'2005-07-31 01:11:53',4550,268,'2005-08-07 02:49:53',1,'2006-02-15 21:30:53'),(9532,'2005-07-31 01:16:51',1309,488,'2005-08-01 20:23:51',1,'2006-02-15 21:30:53'),(9533,'2005-07-31 01:18:10',4156,522,'2005-08-07 19:58:10',1,'2006-02-15 21:30:53'),(9534,'2005-07-31 01:18:27',4457,519,'2005-08-06 00:28:27',1,'2006-02-15 21:30:53'),(9535,'2005-07-31 01:18:53',2413,485,'2005-08-04 03:04:53',2,'2006-02-15 21:30:53'),(9536,'2005-07-31 01:19:02',2547,310,'2005-08-02 19:38:02',1,'2006-02-15 21:30:53'),(9537,'2005-07-31 01:23:00',546,488,'2005-08-01 01:16:00',2,'2006-02-15 21:30:53'),(9538,'2005-07-31 01:25:22',3402,68,'2005-08-06 00:10:22',2,'2006-02-15 21:30:53'),(9539,'2005-07-31 01:36:19',3793,436,'2005-08-04 23:47:19',1,'2006-02-15 21:30:53'),(9540,'2005-07-31 01:40:06',2200,365,'2005-08-01 01:09:06',1,'2006-02-15 21:30:53'),(9541,'2005-07-31 01:40:14',1774,422,'2005-08-05 06:34:14',2,'2006-02-15 21:30:53'),(9542,'2005-07-31 01:41:48',2243,595,'2005-08-01 00:49:48',2,'2006-02-15 21:30:53'),(9543,'2005-07-31 01:43:34',956,369,'2005-08-01 06:49:34',1,'2006-02-15 21:30:53'),(9544,'2005-07-31 01:44:51',2383,28,'2005-08-05 05:25:51',2,'2006-02-15 21:30:53'),(9545,'2005-07-31 01:46:24',3451,594,'2005-08-09 06:11:24',1,'2006-02-15 21:30:53'),(9546,'2005-07-31 01:47:40',211,63,'2005-08-02 07:25:40',2,'2006-02-15 21:30:53'),(9547,'2005-07-31 01:52:34',2414,440,'2005-08-03 23:12:34',2,'2006-02-15 21:30:53'),(9548,'2005-07-31 01:54:19',3038,576,'2005-08-05 00:50:19',2,'2006-02-15 21:30:53'),(9549,'2005-07-31 01:57:04',2409,63,'2005-08-07 21:00:04',2,'2006-02-15 21:30:53'),(9550,'2005-07-31 01:57:34',2233,583,'2005-08-08 23:33:34',1,'2006-02-15 21:30:53'),(9551,'2005-07-31 02:04:58',1260,30,'2005-08-06 04:07:58',2,'2006-02-15 21:30:53'),(9552,'2005-07-31 02:05:32',3544,261,'2005-08-01 06:59:32',1,'2006-02-15 21:30:53'),(9553,'2005-07-31 02:06:34',4187,579,'2005-08-08 02:20:34',1,'2006-02-15 21:30:53'),(9554,'2005-07-31 02:06:49',2581,490,'2005-08-01 22:27:49',1,'2006-02-15 21:30:53'),(9555,'2005-07-31 02:11:16',2108,382,'2005-08-03 06:58:16',2,'2006-02-15 21:30:53'),(9556,'2005-07-31 02:13:30',3269,521,'2005-08-08 06:46:30',1,'2006-02-15 21:30:53'),(9557,'2005-07-31 02:14:01',708,328,'2005-08-05 23:55:01',1,'2006-02-15 21:30:53'),(9558,'2005-07-31 02:14:35',1161,418,'2005-08-06 03:00:35',1,'2006-02-15 21:30:53'),(9559,'2005-07-31 02:15:53',2882,159,'2005-08-08 02:38:53',1,'2006-02-15 21:30:53'),(9560,'2005-07-31 02:17:27',4236,471,'2005-08-07 03:33:27',1,'2006-02-15 21:30:53'),(9561,'2005-07-31 02:22:13',1079,58,'2005-08-03 07:00:13',2,'2006-02-15 21:30:53'),(9562,'2005-07-31 02:23:20',1571,116,'2005-08-06 21:01:20',2,'2006-02-15 21:30:53'),(9563,'2005-07-31 02:28:39',3858,167,'2005-08-05 22:10:39',1,'2006-02-15 21:30:53'),(9564,'2005-07-31 02:31:37',383,377,'2005-08-03 22:57:37',2,'2006-02-15 21:30:53'),(9565,'2005-07-31 02:32:00',3621,485,'2005-08-04 05:45:00',1,'2006-02-15 21:30:53'),(9566,'2005-07-31 02:32:10',643,346,'2005-08-02 23:54:10',2,'2006-02-15 21:30:53'),(9567,'2005-07-31 02:36:11',3688,37,'2005-08-07 01:19:11',2,'2006-02-15 21:30:53'),(9568,'2005-07-31 02:37:44',1248,358,'2005-08-02 07:07:44',2,'2006-02-15 21:30:53'),(9569,'2005-07-31 02:39:38',813,405,'2005-08-02 05:09:38',2,'2006-02-15 21:30:53'),(9570,'2005-07-31 02:40:37',591,385,'2005-08-01 01:59:37',1,'2006-02-15 21:30:53'),(9571,'2005-07-31 02:42:18',2219,1,'2005-08-02 23:26:18',2,'2006-02-15 21:30:53'),(9572,'2005-07-31 02:44:10',1453,283,'2005-08-01 03:30:10',2,'2006-02-15 21:30:53'),(9573,'2005-07-31 02:45:38',3745,59,'2005-08-09 04:31:38',2,'2006-02-15 21:30:53'),(9574,'2005-07-31 02:49:20',2782,233,'2005-08-05 02:36:20',2,'2006-02-15 21:30:53'),(9575,'2005-07-31 02:51:53',3971,193,'2005-08-03 20:54:53',2,'2006-02-15 21:30:53'),(9576,'2005-07-31 02:52:59',3327,145,'2005-08-05 23:35:59',2,'2006-02-15 21:30:53'),(9577,'2005-07-31 02:53:33',2423,526,'2005-08-07 05:56:33',1,'2006-02-15 21:30:53'),(9578,'2005-07-31 02:54:31',2965,115,'2005-08-02 02:48:31',1,'2006-02-15 21:30:53'),(9579,'2005-07-31 02:59:20',3547,35,'2005-08-06 03:52:20',2,'2006-02-15 21:30:53'),(9580,'2005-07-31 03:01:11',532,22,'2005-08-05 06:01:11',1,'2006-02-15 21:30:53'),(9581,'2005-07-31 03:03:07',2588,302,'2005-08-05 23:01:07',1,'2006-02-15 21:30:53'),(9582,'2005-07-31 03:05:19',3913,347,'2005-08-04 07:26:19',1,'2006-02-15 21:30:53'),(9583,'2005-07-31 03:05:21',3543,568,'2005-08-06 00:14:21',2,'2006-02-15 21:30:53'),(9584,'2005-07-31 03:05:48',419,141,'2005-08-01 05:50:48',2,'2006-02-15 21:30:53'),(9585,'2005-07-31 03:05:55',3249,197,'2005-08-02 23:54:55',2,'2006-02-15 21:30:53'),(9586,'2005-07-31 03:07:16',3987,415,'2005-08-04 00:39:16',1,'2006-02-15 21:30:53'),(9587,'2005-07-31 03:10:30',2966,235,'2005-08-06 06:54:30',2,'2006-02-15 21:30:53'),(9588,'2005-07-31 03:13:13',1368,499,'2005-08-02 04:06:13',1,'2006-02-15 21:30:53'),(9589,'2005-07-31 03:13:29',2604,574,'2005-08-09 01:51:29',2,'2006-02-15 21:30:53'),(9590,'2005-07-31 03:17:16',2293,585,'2005-08-08 04:24:16',1,'2006-02-15 21:30:53'),(9591,'2005-07-31 03:19:28',504,97,'2005-08-01 07:30:28',1,'2006-02-15 21:30:53'),(9592,'2005-07-31 03:21:16',1828,14,'2005-08-05 08:32:16',1,'2006-02-15 21:30:53'),(9593,'2005-07-31 03:22:30',1223,28,'2005-08-05 08:23:30',1,'2006-02-15 21:30:53'),(9594,'2005-07-31 03:23:52',4382,148,'2005-08-04 23:06:52',1,'2006-02-15 21:30:53'),(9595,'2005-07-31 03:27:58',2829,3,'2005-08-03 05:58:58',1,'2006-02-15 21:30:53'),(9596,'2005-07-31 03:28:47',2847,55,'2005-08-04 03:43:47',2,'2006-02-15 21:30:53'),(9597,'2005-07-31 03:29:07',3317,61,'2005-08-09 03:33:07',2,'2006-02-15 21:30:53'),(9598,'2005-07-31 03:30:41',1105,468,'2005-08-04 03:54:41',1,'2006-02-15 21:30:53'),(9599,'2005-07-31 03:32:06',3164,502,'2005-08-04 07:47:06',2,'2006-02-15 21:30:53'),(9600,'2005-07-31 03:35:34',3731,464,'2005-08-08 22:50:34',1,'2006-02-15 21:30:53'),(9601,'2005-07-31 03:42:17',1592,553,'2005-08-04 02:02:17',2,'2006-02-15 21:30:53'),(9602,'2005-07-31 03:42:51',3173,386,'2005-08-01 08:39:51',1,'2006-02-15 21:30:53'),(9603,'2005-07-31 03:43:43',2266,541,'2005-08-02 00:11:43',2,'2006-02-15 21:30:53'),(9604,'2005-07-31 03:47:12',4342,580,'2005-08-03 06:48:12',1,'2006-02-15 21:30:53'),(9605,'2005-07-31 03:50:07',1477,94,'2005-08-07 09:15:07',2,'2006-02-15 21:30:53'),(9606,'2005-07-31 03:50:46',1357,253,'2005-08-01 05:29:46',2,'2006-02-15 21:30:53'),(9607,'2005-07-31 03:51:06',3414,294,'2005-08-02 00:18:06',2,'2006-02-15 21:30:53'),(9608,'2005-07-31 03:51:52',363,397,'2005-08-06 05:38:52',2,'2006-02-15 21:30:53'),(9609,'2005-07-31 03:53:24',693,112,'2005-08-05 08:32:24',2,'2006-02-15 21:30:53'),(9610,'2005-07-31 03:54:05',3110,16,'2005-08-06 23:11:05',1,'2006-02-15 21:30:53'),(9611,'2005-07-31 03:54:43',1976,215,'2005-08-05 03:54:43',2,'2006-02-15 21:30:53'),(9612,'2005-07-31 03:58:31',2142,69,'2005-08-04 07:34:31',2,'2006-02-15 21:30:53'),(9613,'2005-07-31 03:58:53',3251,188,'2005-08-02 00:10:53',1,'2006-02-15 21:30:53'),(9614,'2005-07-31 03:59:31',2955,548,'2005-08-08 04:19:31',1,'2006-02-15 21:30:53'),(9615,'2005-07-31 03:59:56',3370,50,'2005-08-02 00:46:56',2,'2006-02-15 21:30:53'),(9616,'2005-07-31 04:05:01',1210,550,'2005-08-05 00:10:01',1,'2006-02-15 21:30:53'),(9617,'2005-07-31 04:15:38',529,102,'2005-08-02 04:24:38',1,'2006-02-15 21:30:53'),(9618,'2005-07-31 04:16:14',2688,253,'2005-08-07 02:43:14',2,'2006-02-15 21:30:53'),(9619,'2005-07-31 04:17:02',1730,138,'2005-08-05 06:36:02',2,'2006-02-15 21:30:53'),(9620,'2005-07-31 04:19:18',2177,576,'2005-08-08 09:20:18',1,'2006-02-15 21:30:53'),(9621,'2005-07-31 04:21:08',325,38,'2005-08-08 03:50:08',2,'2006-02-15 21:30:53'),(9622,'2005-07-31 04:21:45',2255,411,'2005-08-02 09:20:45',1,'2006-02-15 21:30:53'),(9623,'2005-07-31 04:30:02',113,360,'2005-08-06 23:34:02',1,'2006-02-15 21:30:53'),(9624,'2005-07-31 04:30:03',3480,7,'2005-08-06 09:13:03',1,'2006-02-15 21:30:53'),(9625,'2005-07-31 04:30:48',1703,445,'2005-08-03 01:12:48',1,'2006-02-15 21:30:53'),(9626,'2005-07-31 04:37:41',2216,546,'2005-08-08 04:00:41',1,'2006-02-15 21:30:53'),(9627,'2005-07-31 04:42:46',471,12,'2005-08-08 00:42:46',2,'2006-02-15 21:30:53'),(9628,'2005-07-31 04:51:11',1387,565,'2005-07-31 23:11:11',2,'2006-02-15 21:30:53'),(9629,'2005-07-31 04:54:43',2773,8,'2005-08-02 08:36:43',1,'2006-02-15 21:30:53'),(9630,'2005-07-31 04:57:07',2008,599,'2005-08-07 10:55:07',2,'2006-02-15 21:30:53'),(9631,'2005-07-31 05:02:00',321,595,'2005-08-02 02:04:00',2,'2006-02-15 21:30:53'),(9632,'2005-07-31 05:02:23',3368,217,'2005-08-06 04:49:23',2,'2006-02-15 21:30:53'),(9633,'2005-07-31 05:04:08',1141,334,'2005-08-06 00:52:08',2,'2006-02-15 21:30:53'),(9634,'2005-07-31 05:06:02',924,444,'2005-08-04 06:53:02',1,'2006-02-15 21:30:53'),(9635,'2005-07-31 05:12:27',1687,371,'2005-08-02 00:24:27',2,'2006-02-15 21:30:53'),(9636,'2005-07-31 05:12:59',1725,27,'2005-08-09 07:31:59',2,'2006-02-15 21:30:53'),(9637,'2005-07-31 05:18:54',3013,130,'2005-08-03 01:23:54',2,'2006-02-15 21:30:53'),(9638,'2005-07-31 05:30:27',1616,436,'2005-08-09 02:04:27',1,'2006-02-15 21:30:53'),(9639,'2005-07-31 05:32:10',1373,459,'2005-08-03 07:04:10',2,'2006-02-15 21:30:53'),(9640,'2005-07-31 05:33:25',1067,67,'2005-08-09 09:41:25',1,'2006-02-15 21:30:53'),(9641,'2005-07-31 05:33:48',1085,30,'2005-08-04 07:43:48',1,'2006-02-15 21:30:53'),(9642,'2005-07-31 05:33:57',3550,68,'2005-08-05 04:54:57',1,'2006-02-15 21:30:53'),(9643,'2005-07-31 05:35:48',3576,538,'2005-08-08 04:28:48',2,'2006-02-15 21:30:53'),(9644,'2005-07-31 05:40:35',4577,441,'2005-08-09 08:18:35',1,'2006-02-15 21:30:53'),(9645,'2005-07-31 05:42:49',3413,519,'2005-08-04 00:08:49',1,'2006-02-15 21:30:53'),(9646,'2005-07-31 05:43:28',3756,89,'2005-08-08 04:00:28',1,'2006-02-15 21:30:53'),(9647,'2005-07-31 05:45:15',3415,475,'2005-08-06 08:54:15',1,'2006-02-15 21:30:53'),(9648,'2005-07-31 05:46:03',4063,72,'2005-08-09 04:36:03',2,'2006-02-15 21:30:53'),(9649,'2005-07-31 05:46:54',1588,51,'2005-08-04 08:42:54',2,'2006-02-15 21:30:53'),(9650,'2005-07-31 05:47:32',2997,414,'2005-08-04 00:50:32',2,'2006-02-15 21:30:53'),(9651,'2005-07-31 05:48:49',4059,324,'2005-08-04 06:53:49',1,'2006-02-15 21:30:53'),(9652,'2005-07-31 05:49:53',448,207,'2005-08-06 07:38:53',2,'2006-02-15 21:30:53'),(9653,'2005-07-31 05:55:38',1451,383,'2005-08-03 09:35:38',2,'2006-02-15 21:30:53'),(9654,'2005-07-31 05:57:42',3286,506,'2005-08-06 04:19:42',1,'2006-02-15 21:30:53'),(9655,'2005-07-31 05:57:54',3403,435,'2005-08-06 02:00:54',1,'2006-02-15 21:30:53'),(9656,'2005-07-31 06:00:21',4215,39,'2005-08-05 04:36:21',1,'2006-02-15 21:30:53'),(9657,'2005-07-31 06:00:41',2681,402,'2005-08-06 06:51:41',2,'2006-02-15 21:30:53'),(9658,'2005-07-31 06:00:52',2332,282,'2005-08-09 04:47:52',2,'2006-02-15 21:30:53'),(9659,'2005-07-31 06:02:14',4262,360,'2005-08-07 00:54:14',2,'2006-02-15 21:30:53'),(9660,'2005-07-31 06:03:17',1090,406,'2005-08-07 06:59:17',2,'2006-02-15 21:30:53'),(9661,'2005-07-31 06:06:37',2693,237,'2005-08-04 07:37:37',1,'2006-02-15 21:30:53'),(9662,'2005-07-31 06:09:53',2757,96,'2005-08-08 00:50:53',2,'2006-02-15 21:30:53'),(9663,'2005-07-31 06:10:48',2099,339,'2005-08-01 11:40:48',2,'2006-02-15 21:30:53'),(9664,'2005-07-31 06:12:08',360,13,'2005-08-04 02:19:08',2,'2006-02-15 21:30:53'),(9665,'2005-07-31 06:17:33',2863,478,'2005-08-04 08:53:33',1,'2006-02-15 21:30:53'),(9666,'2005-07-31 06:20:58',4318,592,'2005-08-06 06:09:58',2,'2006-02-15 21:30:53'),(9667,'2005-07-31 06:23:52',4289,523,'2005-08-09 09:12:52',1,'2006-02-15 21:30:53'),(9668,'2005-07-31 06:31:03',1647,378,'2005-08-07 06:19:03',2,'2006-02-15 21:30:53'),(9669,'2005-07-31 06:31:36',4496,277,'2005-08-08 03:05:36',2,'2006-02-15 21:30:53'),(9670,'2005-07-31 06:33:33',3709,349,'2005-08-07 04:51:33',1,'2006-02-15 21:30:53'),(9671,'2005-07-31 06:33:41',920,133,'2005-08-02 07:50:41',1,'2006-02-15 21:30:53'),(9672,'2005-07-31 06:34:06',4394,183,'2005-08-08 10:29:06',2,'2006-02-15 21:30:53'),(9673,'2005-07-31 06:34:55',339,27,'2005-08-09 09:15:55',2,'2006-02-15 21:30:53'),(9674,'2005-07-31 06:36:53',3213,297,'2005-08-06 02:50:53',2,'2006-02-15 21:30:53'),(9675,'2005-07-31 06:37:07',2523,243,'2005-08-03 07:03:07',1,'2006-02-15 21:30:53'),(9676,'2005-07-31 06:39:13',681,239,'2005-08-05 09:31:13',2,'2006-02-15 21:30:53'),(9677,'2005-07-31 06:39:45',3200,274,'2005-08-01 02:37:45',2,'2006-02-15 21:30:53'),(9678,'2005-07-31 06:40:47',3430,383,'2005-08-02 00:57:47',2,'2006-02-15 21:30:53'),(9679,'2005-07-31 06:41:19',3819,599,'2005-08-02 07:23:19',1,'2006-02-15 21:30:53'),(9680,'2005-07-31 06:41:46',3010,84,'2005-08-01 11:02:46',2,'2006-02-15 21:30:53'),(9681,'2005-07-31 06:42:09',64,160,'2005-08-06 08:21:09',1,'2006-02-15 21:30:53'),(9682,'2005-07-31 06:47:10',2427,425,'2005-08-04 09:07:10',1,'2006-02-15 21:30:53'),(9683,'2005-07-31 06:47:13',856,141,'2005-08-04 05:52:13',2,'2006-02-15 21:30:53'),(9684,'2005-07-31 06:48:33',362,591,'2005-08-01 07:07:33',2,'2006-02-15 21:30:53'),(9685,'2005-07-31 06:49:18',3097,165,'2005-08-04 03:19:18',1,'2006-02-15 21:30:53'),(9686,'2005-07-31 06:50:06',3825,386,'2005-08-06 08:41:06',1,'2006-02-15 21:30:53'),(9687,'2005-07-31 06:52:54',3540,470,'2005-08-01 03:40:54',2,'2006-02-15 21:30:53'),(9688,'2005-07-31 06:56:08',1304,566,'2005-08-08 03:31:08',2,'2006-02-15 21:30:53'),(9689,'2005-07-31 07:00:08',819,498,'2005-08-04 03:33:08',2,'2006-02-15 21:30:53'),(9690,'2005-07-31 07:06:29',4449,468,'2005-08-06 09:45:29',2,'2006-02-15 21:30:53'),(9691,'2005-07-31 07:09:55',2626,50,'2005-08-09 02:29:55',1,'2006-02-15 21:30:53'),(9692,'2005-07-31 07:11:04',3481,295,'2005-08-07 06:34:04',2,'2006-02-15 21:30:53'),(9693,'2005-07-31 07:11:50',1031,273,'2005-08-08 09:55:50',1,'2006-02-15 21:30:53'),(9694,'2005-07-31 07:13:16',3447,508,'2005-08-06 09:12:16',2,'2006-02-15 21:30:53'),(9695,'2005-07-31 07:13:30',726,95,'2005-08-07 05:38:30',2,'2006-02-15 21:30:53'),(9696,'2005-07-31 07:13:46',2703,156,'2005-08-03 10:49:46',2,'2006-02-15 21:30:53'),(9697,'2005-07-31 07:23:11',762,479,'2005-08-05 08:04:11',2,'2006-02-15 21:30:53'),(9698,'2005-07-31 07:24:35',3477,594,'2005-08-09 04:52:35',2,'2006-02-15 21:30:53'),(9699,'2005-07-31 07:29:25',199,21,'2005-08-06 01:35:25',1,'2006-02-15 21:30:53'),(9700,'2005-07-31 07:29:59',2678,40,'2005-08-02 09:53:59',1,'2006-02-15 21:30:53'),(9701,'2005-07-31 07:32:21',4581,401,'2005-08-01 05:07:21',2,'2006-02-15 21:30:53'),(9702,'2005-07-31 07:34:07',3353,525,'2005-08-02 06:13:07',2,'2006-02-15 21:30:53'),(9703,'2005-07-31 07:34:52',2708,57,'2005-08-03 13:33:52',2,'2006-02-15 21:30:53'),(9704,'2005-07-31 07:39:32',1402,385,'2005-08-06 01:50:32',2,'2006-02-15 21:30:53'),(9705,'2005-07-31 07:40:33',4158,28,'2005-08-01 03:50:33',2,'2006-02-15 21:30:53'),(9706,'2005-07-31 07:43:19',142,508,'2005-08-05 11:11:19',1,'2006-02-15 21:30:53'),(9707,'2005-07-31 07:44:18',203,351,'2005-08-08 12:45:18',1,'2006-02-15 21:30:53'),(9708,'2005-07-31 07:45:33',3264,12,'2005-08-08 08:56:33',1,'2006-02-15 21:30:53'),(9709,'2005-07-31 08:04:55',2096,137,'2005-08-07 08:58:55',1,'2006-02-15 21:30:53'),(9710,'2005-07-31 08:05:31',3486,380,'2005-08-09 03:29:31',2,'2006-02-15 21:30:53'),(9711,'2005-07-31 08:06:41',1525,231,'2005-08-02 10:30:41',2,'2006-02-15 21:30:53'),(9712,'2005-07-31 08:13:11',2487,219,'2005-08-08 12:40:11',2,'2006-02-15 21:30:53'),(9713,'2005-07-31 08:13:28',929,158,'2005-08-07 10:11:28',1,'2006-02-15 21:30:53'),(9714,'2005-07-31 08:15:32',1532,144,'2005-08-03 08:33:32',2,'2006-02-15 21:30:53'),(9715,'2005-07-31 08:16:58',3319,237,'2005-08-04 11:13:58',1,'2006-02-15 21:30:53'),(9716,'2005-07-31 08:23:53',3385,287,'2005-08-08 12:03:53',2,'2006-02-15 21:30:53'),(9717,'2005-07-31 08:24:41',4207,114,'2005-08-04 02:51:41',1,'2006-02-15 21:30:53'),(9718,'2005-07-31 08:25:03',2747,23,'2005-08-08 04:16:03',2,'2006-02-15 21:30:53'),(9719,'2005-07-31 08:25:13',335,584,'2005-08-05 08:22:13',1,'2006-02-15 21:30:53'),(9720,'2005-07-31 08:25:21',1282,587,'2005-08-07 11:30:21',2,'2006-02-15 21:30:53'),(9721,'2005-07-31 08:28:46',3942,196,'2005-08-05 14:03:46',1,'2006-02-15 21:30:53'),(9722,'2005-07-31 08:29:48',4260,125,'2005-08-07 07:52:48',2,'2006-02-15 21:30:53'),(9723,'2005-07-31 08:31:18',3968,24,'2005-08-03 10:25:18',1,'2006-02-15 21:30:53'),(9724,'2005-07-31 08:33:08',518,130,'2005-08-08 04:50:08',1,'2006-02-15 21:30:53'),(9725,'2005-07-31 08:35:18',3960,503,'2005-08-03 03:46:18',2,'2006-02-15 21:30:53'),(9726,'2005-07-31 08:37:07',1701,162,'2005-08-09 06:09:07',1,'2006-02-15 21:30:53'),(9727,'2005-07-31 08:39:13',3076,536,'2005-08-03 07:54:13',1,'2006-02-15 21:30:53'),(9728,'2005-07-31 08:40:54',3630,399,'2005-08-03 04:14:54',2,'2006-02-15 21:30:53'),(9729,'2005-07-31 08:43:43',4199,273,'2005-08-01 13:25:43',2,'2006-02-15 21:30:53'),(9730,'2005-07-31 08:50:08',2605,242,'2005-08-08 12:21:08',2,'2006-02-15 21:30:53'),(9731,'2005-07-31 08:54:47',3713,349,'2005-08-05 03:47:47',1,'2006-02-15 21:30:53'),(9732,'2005-07-31 08:56:08',3262,288,'2005-08-07 11:05:08',2,'2006-02-15 21:30:53'),(9733,'2005-07-31 08:57:35',1255,575,'2005-08-04 04:47:35',1,'2006-02-15 21:30:53'),(9734,'2005-07-31 08:57:45',3320,125,'2005-08-05 11:57:45',1,'2006-02-15 21:30:53'),(9735,'2005-07-31 08:57:49',4228,315,'2005-08-08 13:51:49',2,'2006-02-15 21:30:53'),(9736,'2005-07-31 08:58:40',2072,13,'2005-08-09 08:34:40',2,'2006-02-15 21:30:53'),(9737,'2005-07-31 08:59:18',1720,475,'2005-08-03 12:19:18',2,'2006-02-15 21:30:53'),(9738,'2005-07-31 09:04:14',2278,568,'2005-08-05 14:40:14',2,'2006-02-15 21:30:53'),(9739,'2005-07-31 09:08:03',1328,343,'2005-08-04 13:57:03',1,'2006-02-15 21:30:53'),(9740,'2005-07-31 09:08:03',3497,443,'2005-08-06 04:48:03',2,'2006-02-15 21:30:53'),(9741,'2005-07-31 09:09:22',1971,495,'2005-08-07 10:01:22',1,'2006-02-15 21:30:53'),(9742,'2005-07-31 09:10:20',4058,48,'2005-08-08 10:07:20',1,'2006-02-15 21:30:53'),(9743,'2005-07-31 09:12:42',1740,476,'2005-08-06 11:57:42',2,'2006-02-15 21:30:53'),(9744,'2005-07-31 09:15:38',839,459,'2005-08-03 10:31:38',2,'2006-02-15 21:30:53'),(9745,'2005-07-31 09:16:14',3610,217,'2005-08-07 12:11:14',1,'2006-02-15 21:30:53'),(9746,'2005-07-31 09:16:48',1459,308,'2005-08-07 06:36:48',2,'2006-02-15 21:30:53'),(9747,'2005-07-31 09:16:57',2455,106,'2005-08-08 06:47:57',2,'2006-02-15 21:30:53'),(9748,'2005-07-31 09:17:56',3308,550,'2005-08-02 14:54:56',1,'2006-02-15 21:30:53'),(9749,'2005-07-31 09:18:33',658,52,'2005-08-06 07:41:33',1,'2006-02-15 21:30:53'),(9750,'2005-07-31 09:19:46',3174,527,'2005-08-06 08:07:46',1,'2006-02-15 21:30:53'),(9751,'2005-07-31 09:20:50',36,202,'2005-08-01 05:34:50',2,'2006-02-15 21:30:53'),(9752,'2005-07-31 09:22:02',249,199,'2005-08-02 14:34:02',1,'2006-02-15 21:30:53'),(9753,'2005-07-31 09:22:38',3529,98,'2005-08-01 08:45:38',1,'2006-02-15 21:30:53'),(9754,'2005-07-31 09:23:43',3751,479,'2005-08-08 06:04:43',1,'2006-02-15 21:30:53'),(9755,'2005-07-31 09:24:55',86,108,'2005-08-07 06:00:55',2,'2006-02-15 21:30:53'),(9756,'2005-07-31 09:25:00',207,400,'2005-08-02 05:11:00',1,'2006-02-15 21:30:53'),(9757,'2005-07-31 09:25:14',2596,408,'2005-08-01 14:43:14',2,'2006-02-15 21:30:53'),(9758,'2005-07-31 09:25:38',1307,160,'2005-08-03 14:16:38',1,'2006-02-15 21:30:53'),(9759,'2005-07-31 09:25:57',2950,574,'2005-08-07 12:56:57',2,'2006-02-15 21:30:53'),(9760,'2005-07-31 09:29:33',426,511,'2005-08-09 07:32:33',2,'2006-02-15 21:30:53'),(9761,'2005-07-31 09:31:54',3778,60,'2005-08-03 11:02:54',2,'2006-02-15 21:30:53'),(9762,'2005-07-31 09:32:54',155,540,'2005-08-05 04:55:54',1,'2006-02-15 21:30:53'),(9763,'2005-07-31 09:34:03',126,393,'2005-08-08 05:30:03',1,'2006-02-15 21:30:53'),(9764,'2005-07-31 09:42:58',3761,136,'2005-08-07 07:22:58',2,'2006-02-15 21:30:53'),(9765,'2005-07-31 09:44:40',472,551,'2005-08-05 10:57:40',1,'2006-02-15 21:30:53'),(9766,'2005-07-31 09:46:29',4049,570,'2005-08-01 05:08:29',1,'2006-02-15 21:30:53'),(9767,'2005-07-31 09:46:49',3432,89,'2005-08-03 11:20:49',1,'2006-02-15 21:30:53'),(9768,'2005-07-31 09:48:41',2656,582,'2005-08-08 11:40:41',2,'2006-02-15 21:30:53'),(9769,'2005-07-31 09:52:16',2958,484,'2005-08-06 09:26:16',1,'2006-02-15 21:30:53'),(9770,'2005-07-31 09:52:40',1226,317,'2005-08-09 06:44:40',1,'2006-02-15 21:30:53'),(9771,'2005-07-31 09:55:36',4123,398,'2005-08-04 10:11:36',2,'2006-02-15 21:30:53'),(9772,'2005-07-31 09:56:07',3639,147,'2005-08-01 13:50:07',2,'2006-02-15 21:30:53'),(9773,'2005-07-31 09:56:56',4555,376,'2005-08-04 09:38:56',1,'2006-02-15 21:30:53'),(9774,'2005-07-31 09:57:51',4174,306,'2005-08-02 09:08:51',2,'2006-02-15 21:30:53'),(9775,'2005-07-31 10:00:00',2818,162,'2005-08-01 08:57:00',2,'2006-02-15 21:30:53'),(9776,'2005-07-31 10:01:03',2524,73,'2005-08-03 07:20:03',2,'2006-02-15 21:30:53'),(9777,'2005-07-31 10:01:06',225,539,'2005-08-08 04:44:06',2,'2006-02-15 21:30:53'),(9778,'2005-07-31 10:02:04',304,230,'2005-08-04 07:44:04',2,'2006-02-15 21:30:53'),(9779,'2005-07-31 10:08:33',1280,402,'2005-08-03 14:56:33',1,'2006-02-15 21:30:53'),(9780,'2005-07-31 10:10:22',3241,102,'2005-08-02 11:43:22',1,'2006-02-15 21:30:53'),(9781,'2005-07-31 10:13:02',2310,155,'2005-08-09 14:46:02',1,'2006-02-15 21:30:53'),(9782,'2005-07-31 10:14:26',2397,438,'2005-08-06 16:11:26',1,'2006-02-15 21:30:53'),(9783,'2005-07-31 10:15:46',836,75,'2005-08-09 13:22:46',2,'2006-02-15 21:30:53'),(9784,'2005-07-31 10:21:32',2761,362,'2005-08-07 09:20:32',2,'2006-02-15 21:30:53'),(9785,'2005-07-31 10:22:15',4101,587,'2005-08-02 10:02:15',1,'2006-02-15 21:30:53'),(9786,'2005-07-31 10:25:21',2560,586,'2005-08-03 04:28:21',1,'2006-02-15 21:30:53'),(9787,'2005-07-31 10:26:19',3559,272,'2005-08-09 09:02:19',1,'2006-02-15 21:30:53'),(9788,'2005-07-31 10:28:21',4367,344,'2005-08-09 13:45:21',1,'2006-02-15 21:30:53'),(9789,'2005-07-31 10:30:25',619,137,'2005-08-03 14:58:25',1,'2006-02-15 21:30:53'),(9790,'2005-07-31 10:34:08',3643,284,'2005-08-04 11:19:08',2,'2006-02-15 21:30:53'),(9791,'2005-07-31 10:35:22',3642,300,'2005-08-03 05:34:22',1,'2006-02-15 21:30:53'),(9792,'2005-07-31 10:43:41',3163,292,'2005-08-07 10:18:41',1,'2006-02-15 21:30:53'),(9793,'2005-07-31 10:45:11',4576,295,'2005-08-03 14:29:11',1,'2006-02-15 21:30:53'),(9794,'2005-07-31 10:47:01',1771,403,'2005-08-02 06:52:01',2,'2006-02-15 21:30:53'),(9795,'2005-07-31 10:47:19',2005,63,'2005-08-04 09:32:19',2,'2006-02-15 21:30:53'),(9796,'2005-07-31 10:52:43',1038,539,'2005-08-09 06:08:43',1,'2006-02-15 21:30:53'),(9797,'2005-07-31 10:53:44',687,52,'2005-08-09 05:51:44',1,'2006-02-15 21:30:53'),(9798,'2005-07-31 10:55:18',3759,55,'2005-08-01 07:37:18',2,'2006-02-15 21:30:53'),(9799,'2005-07-31 10:58:32',3008,494,'2005-08-01 12:08:32',1,'2006-02-15 21:30:53'),(9800,'2005-07-31 11:00:58',2153,257,'2005-08-02 10:13:58',2,'2006-02-15 21:30:53'),(9801,'2005-07-31 11:03:13',3033,158,'2005-08-04 10:55:13',2,'2006-02-15 21:30:53'),(9802,'2005-07-31 11:04:20',2156,594,'2005-08-03 05:28:20',1,'2006-02-15 21:30:53'),(9803,'2005-07-31 11:06:02',3783,520,'2005-08-01 06:25:02',1,'2006-02-15 21:30:53'),(9804,'2005-07-31 11:07:39',2490,196,'2005-08-09 11:57:39',1,'2006-02-15 21:30:53'),(9805,'2005-07-31 11:11:10',4179,36,'2005-08-03 07:36:10',2,'2006-02-15 21:30:53'),(9806,'2005-07-31 11:13:49',245,46,'2005-08-04 06:18:49',1,'2006-02-15 21:30:53'),(9807,'2005-07-31 11:13:52',2137,267,'2005-08-02 07:34:52',1,'2006-02-15 21:30:53'),(9808,'2005-07-31 11:17:22',3259,583,'2005-08-07 15:54:22',1,'2006-02-15 21:30:53'),(9809,'2005-07-31 11:19:21',359,286,'2005-08-08 12:43:21',2,'2006-02-15 21:30:53'),(9810,'2005-07-31 11:22:41',2066,545,'2005-08-01 09:40:41',2,'2006-02-15 21:30:53'),(9811,'2005-07-31 11:23:45',3305,77,'2005-08-06 15:51:45',1,'2006-02-15 21:30:53'),(9812,'2005-07-31 11:28:07',1540,57,'2005-08-01 12:35:07',2,'2006-02-15 21:30:53'),(9813,'2005-07-31 11:29:23',1706,245,'2005-08-07 08:01:23',2,'2006-02-15 21:30:53'),(9814,'2005-07-31 11:29:46',136,79,'2005-08-08 15:49:46',1,'2006-02-15 21:30:53'),(9815,'2005-07-31 11:30:51',2728,540,'2005-08-08 12:52:51',1,'2006-02-15 21:30:53'),(9816,'2005-07-31 11:32:58',4560,3,'2005-08-04 17:12:58',2,'2006-02-15 21:30:53'),(9817,'2005-07-31 11:33:31',4019,170,'2005-08-08 14:49:31',2,'2006-02-15 21:30:53'),(9818,'2005-07-31 11:34:32',1254,183,'2005-08-04 08:20:32',1,'2006-02-15 21:30:53'),(9819,'2005-07-31 11:39:13',1927,292,'2005-08-06 09:11:13',2,'2006-02-15 21:30:53'),(9820,'2005-07-31 11:46:57',499,279,'2005-08-08 13:35:57',1,'2006-02-15 21:30:53'),(9821,'2005-07-31 11:47:54',386,271,'2005-08-08 06:21:54',2,'2006-02-15 21:30:53'),(9822,'2005-07-31 11:48:25',2469,381,'2005-08-05 15:52:25',2,'2006-02-15 21:30:53'),(9823,'2005-07-31 11:49:00',4423,129,'2005-08-07 09:06:00',2,'2006-02-15 21:30:53'),(9824,'2005-07-31 11:49:55',4368,404,'2005-08-07 16:54:55',2,'2006-02-15 21:30:53'),(9825,'2005-07-31 11:50:51',4322,390,'2005-08-02 07:18:51',1,'2006-02-15 21:30:53'),(9826,'2005-07-31 11:51:46',2649,595,'2005-08-09 17:18:46',1,'2006-02-15 21:30:53'),(9827,'2005-07-31 11:56:55',3840,329,'2005-08-09 16:29:55',1,'2006-02-15 21:30:53'),(9828,'2005-07-31 11:56:57',3845,376,'2005-08-02 17:05:57',1,'2006-02-15 21:30:53'),(9829,'2005-07-31 11:58:38',231,435,'2005-08-07 08:11:38',2,'2006-02-15 21:30:53'),(9830,'2005-07-31 11:59:05',170,112,'2005-08-06 10:38:05',1,'2006-02-15 21:30:53'),(9831,'2005-07-31 11:59:32',1961,192,'2005-08-04 07:14:32',1,'2006-02-15 21:30:53'),(9832,'2005-07-31 12:01:49',3126,64,'2005-08-08 09:21:49',1,'2006-02-15 21:30:53'),(9833,'2005-07-31 12:05:01',4243,368,'2005-08-09 09:25:01',2,'2006-02-15 21:30:53'),(9834,'2005-07-31 12:05:42',2292,340,'2005-08-07 15:26:42',1,'2006-02-15 21:30:53'),(9835,'2005-07-31 12:07:35',1051,328,'2005-08-04 07:32:35',2,'2006-02-15 21:30:53'),(9836,'2005-07-31 12:12:00',2870,313,'2005-08-09 06:53:00',1,'2006-02-15 21:30:53'),(9837,'2005-07-31 12:14:19',3488,573,'2005-08-09 17:08:19',1,'2006-02-15 21:30:53'),(9838,'2005-07-31 12:18:49',3866,208,'2005-08-03 16:49:49',2,'2006-02-15 21:30:53'),(9839,'2005-07-31 12:21:16',1591,561,'2005-08-09 13:41:16',2,'2006-02-15 21:30:53'),(9840,'2005-07-31 12:23:18',364,388,'2005-08-06 15:59:18',1,'2006-02-15 21:30:53'),(9841,'2005-07-31 12:24:19',4554,238,'2005-08-09 15:31:19',1,'2006-02-15 21:30:53'),(9842,'2005-07-31 12:24:58',2896,261,'2005-08-02 11:01:58',2,'2006-02-15 21:30:53'),(9843,'2005-07-31 12:25:28',2923,532,'2005-08-01 09:51:28',2,'2006-02-15 21:30:53'),(9844,'2005-07-31 12:26:31',3930,181,'2005-08-05 13:58:31',1,'2006-02-15 21:30:53'),(9845,'2005-07-31 12:28:05',2417,79,'2005-08-06 06:47:05',1,'2006-02-15 21:30:53'),(9846,'2005-07-31 12:30:12',4240,573,'2005-08-05 08:24:12',2,'2006-02-15 21:30:53'),(9847,'2005-07-31 12:33:43',1137,174,'2005-08-04 14:15:43',2,'2006-02-15 21:30:53'),(9848,'2005-07-31 12:44:33',3290,346,'2005-08-07 13:49:33',2,'2006-02-15 21:30:53'),(9849,'2005-07-31 12:44:34',2230,429,'2005-08-02 16:49:34',1,'2006-02-15 21:30:53'),(9850,'2005-07-31 12:46:52',1461,497,'2005-08-04 10:52:52',2,'2006-02-15 21:30:53'),(9851,'2005-07-31 12:50:24',25,49,'2005-08-08 08:30:24',2,'2006-02-15 21:30:53'),(9852,'2005-07-31 12:52:17',4257,415,'2005-08-05 07:59:17',2,'2006-02-15 21:30:53'),(9853,'2005-07-31 12:58:20',1782,221,'2005-08-04 10:47:20',1,'2006-02-15 21:30:53'),(9854,'2005-07-31 12:59:34',1049,441,'2005-08-03 07:20:34',2,'2006-02-15 21:30:53'),(9855,'2005-07-31 13:00:33',1246,326,'2005-08-03 16:18:33',2,'2006-02-15 21:30:53'),(9856,'2005-07-31 13:00:35',723,347,'2005-08-07 18:07:35',1,'2006-02-15 21:30:53'),(9857,'2005-07-31 13:00:53',3316,168,'2005-08-09 15:56:53',1,'2006-02-15 21:30:53'),(9858,'2005-07-31 13:02:07',252,128,'2005-08-03 15:14:07',2,'2006-02-15 21:30:53'),(9859,'2005-07-31 13:02:55',4094,127,'2005-08-05 11:04:55',1,'2006-02-15 21:30:53'),(9860,'2005-07-31 13:03:24',3266,585,'2005-08-07 07:28:24',2,'2006-02-15 21:30:53'),(9861,'2005-07-31 13:04:14',1050,264,'2005-08-09 15:22:14',1,'2006-02-15 21:30:53'),(9862,'2005-07-31 13:05:03',474,513,'2005-08-01 09:05:03',2,'2006-02-15 21:30:53'),(9863,'2005-07-31 13:05:29',19,239,'2005-08-08 12:33:29',1,'2006-02-15 21:30:53'),(9864,'2005-07-31 13:06:54',3619,394,'2005-08-02 11:47:54',2,'2006-02-15 21:30:53'),(9865,'2005-07-31 13:10:45',1355,580,'2005-08-02 09:19:45',2,'2006-02-15 21:30:53'),(9866,'2005-07-31 13:13:50',3555,374,'2005-08-07 15:11:50',1,'2006-02-15 21:30:53'),(9867,'2005-07-31 13:17:04',2485,83,'2005-08-05 07:17:04',2,'2006-02-15 21:30:53'),(9868,'2005-07-31 13:20:08',266,378,'2005-08-01 18:17:08',2,'2006-02-15 21:30:53'),(9869,'2005-07-31 13:21:54',783,261,'2005-08-07 09:09:54',1,'2006-02-15 21:30:53'),(9870,'2005-07-31 13:22:51',442,195,'2005-08-05 16:04:51',1,'2006-02-15 21:30:53'),(9871,'2005-07-31 13:25:46',194,109,'2005-08-01 13:12:46',2,'2006-02-15 21:30:53'),(9872,'2005-07-31 13:27:55',1021,376,'2005-08-04 14:33:55',1,'2006-02-15 21:30:53'),(9873,'2005-07-31 13:32:18',667,442,'2005-08-06 11:15:18',2,'2006-02-15 21:30:53'),(9874,'2005-07-31 13:32:31',2476,482,'2005-08-07 09:50:31',2,'2006-02-15 21:30:53'),(9875,'2005-07-31 13:37:41',2878,421,'2005-08-03 15:17:41',2,'2006-02-15 21:30:53'),(9876,'2005-07-31 13:37:51',828,347,'2005-08-07 18:05:51',2,'2006-02-15 21:30:53'),(9877,'2005-07-31 13:41:57',1299,559,'2005-08-06 15:27:57',2,'2006-02-15 21:30:53'),(9878,'2005-07-31 13:42:02',1753,424,'2005-08-05 10:15:02',2,'2006-02-15 21:30:53'),(9879,'2005-07-31 13:45:32',1935,178,'2005-08-07 17:12:32',1,'2006-02-15 21:30:53'),(9880,'2005-07-31 13:49:02',3590,64,'2005-08-08 10:31:02',2,'2006-02-15 21:30:53'),(9881,'2005-07-31 13:50:38',4209,412,'2005-08-06 08:58:38',1,'2006-02-15 21:30:53'),(9882,'2005-07-31 13:53:33',1429,311,'2005-08-09 15:55:33',1,'2006-02-15 21:30:53'),(9883,'2005-07-31 13:53:37',4286,356,'2005-08-06 15:45:37',1,'2006-02-15 21:30:53'),(9884,'2005-07-31 13:56:24',511,590,'2005-08-01 16:59:24',1,'2006-02-15 21:30:53'),(9885,'2005-07-31 13:59:32',3600,461,'2005-08-07 12:30:32',2,'2006-02-15 21:30:53'),(9886,'2005-07-31 14:00:13',1386,519,'2005-08-08 19:30:13',1,'2006-02-15 21:30:53'),(9887,'2005-07-31 14:00:32',436,549,'2005-08-05 19:16:32',1,'2006-02-15 21:30:53'),(9888,'2005-07-31 14:00:53',4400,5,'2005-08-08 18:51:53',2,'2006-02-15 21:30:53'),(9889,'2005-07-31 14:02:50',2842,143,'2005-08-05 12:09:50',2,'2006-02-15 21:30:53'),(9890,'2005-07-31 14:04:44',1024,151,'2005-08-01 11:24:44',1,'2006-02-15 21:30:53'),(9891,'2005-07-31 14:05:44',3359,462,'2005-08-02 16:21:44',2,'2006-02-15 21:30:53'),(9892,'2005-07-31 14:06:25',1045,251,'2005-08-03 18:11:25',2,'2006-02-15 21:30:53'),(9893,'2005-07-31 14:07:21',2445,179,'2005-08-01 09:20:21',2,'2006-02-15 21:30:53'),(9894,'2005-07-31 14:07:44',3724,199,'2005-08-05 18:01:44',2,'2006-02-15 21:30:53'),(9895,'2005-07-31 14:07:56',835,560,'2005-08-05 14:56:56',1,'2006-02-15 21:30:53'),(9896,'2005-07-31 14:09:48',2591,586,'2005-08-01 20:02:48',1,'2006-02-15 21:30:53'),(9897,'2005-07-31 14:11:57',3945,538,'2005-08-02 12:20:57',1,'2006-02-15 21:30:53'),(9898,'2005-07-31 14:12:03',2151,359,'2005-08-01 12:27:03',1,'2006-02-15 21:30:53'),(9899,'2005-07-31 14:12:36',3352,168,'2005-08-08 08:59:36',1,'2006-02-15 21:30:53'),(9900,'2005-07-31 14:15:05',3132,453,'2005-08-07 11:58:05',2,'2006-02-15 21:30:53'),(9901,'2005-07-31 14:20:59',3332,277,'2005-08-03 09:30:59',1,'2006-02-15 21:30:53'),(9902,'2005-07-31 14:24:33',486,218,'2005-08-09 11:11:33',2,'2006-02-15 21:30:53'),(9903,'2005-07-31 14:31:44',1621,316,'2005-08-08 20:03:44',1,'2006-02-15 21:30:53'),(9904,'2005-07-31 14:34:17',4089,428,'2005-08-08 17:19:17',1,'2006-02-15 21:30:53'),(9905,'2005-07-31 14:37:03',2839,519,'2005-08-01 15:55:03',2,'2006-02-15 21:30:53'),(9906,'2005-07-31 14:38:12',4241,204,'2005-08-01 13:56:12',1,'2006-02-15 21:30:53'),(9907,'2005-07-31 14:39:50',4282,120,'2005-08-09 09:39:50',1,'2006-02-15 21:30:53'),(9908,'2005-07-31 14:39:52',4408,27,'2005-08-09 09:46:52',2,'2006-02-15 21:30:53'),(9909,'2005-07-31 14:43:34',2600,587,'2005-08-09 15:31:34',1,'2006-02-15 21:30:53'),(9910,'2005-07-31 14:47:57',368,122,'2005-08-05 18:20:57',1,'2006-02-15 21:30:53'),(9911,'2005-07-31 14:48:01',3879,112,'2005-08-06 11:55:01',1,'2006-02-15 21:30:53'),(9912,'2005-07-31 14:49:04',3119,367,'2005-08-03 15:40:04',1,'2006-02-15 21:30:53'),(9913,'2005-07-31 14:51:04',3744,229,'2005-08-06 12:12:04',1,'2006-02-15 21:30:53'),(9914,'2005-07-31 14:51:19',3147,530,'2005-08-05 09:51:19',1,'2006-02-15 21:30:53'),(9915,'2005-07-31 14:52:26',2933,566,'2005-08-03 11:53:26',1,'2006-02-15 21:30:53'),(9916,'2005-07-31 14:54:52',949,432,'2005-08-07 13:18:52',1,'2006-02-15 21:30:53'),(9917,'2005-07-31 14:55:11',3829,159,'2005-08-02 13:58:11',2,'2006-02-15 21:30:53'),(9918,'2005-07-31 14:55:22',2519,283,'2005-08-04 09:02:22',2,'2006-02-15 21:30:53'),(9919,'2005-07-31 14:55:46',3205,291,'2005-08-08 11:43:46',2,'2006-02-15 21:30:53'),(9920,'2005-07-31 14:57:13',3108,139,'2005-08-03 18:58:13',2,'2006-02-15 21:30:53'),(9921,'2005-07-31 14:59:21',1004,332,'2005-08-01 12:40:21',2,'2006-02-15 21:30:53'),(9922,'2005-07-31 14:59:37',3615,25,'2005-08-06 14:05:37',1,'2006-02-15 21:30:53'),(9923,'2005-07-31 15:00:15',1635,209,'2005-08-05 11:09:15',2,'2006-02-15 21:30:53'),(9924,'2005-07-31 15:04:57',1986,64,'2005-08-05 20:07:57',2,'2006-02-15 21:30:53'),(9925,'2005-07-31 15:08:47',2351,24,'2005-08-02 20:27:47',1,'2006-02-15 21:30:53'),(9926,'2005-07-31 15:11:51',3733,472,'2005-08-09 18:26:51',1,'2006-02-15 21:30:53'),(9927,'2005-07-31 15:12:13',999,346,'2005-08-01 11:37:13',1,'2006-02-15 21:30:53'),(9928,'2005-07-31 15:13:57',3627,53,'2005-08-06 20:39:57',1,'2006-02-15 21:30:53'),(9929,'2005-07-31 15:17:24',2521,564,'2005-08-03 17:27:24',1,'2006-02-15 21:30:53'),(9930,'2005-07-31 15:18:03',4491,304,'2005-08-01 12:36:03',2,'2006-02-15 21:30:53'),(9931,'2005-07-31 15:18:19',3455,183,'2005-08-04 14:23:19',2,'2006-02-15 21:30:53'),(9932,'2005-07-31 15:19:48',1691,264,'2005-08-05 21:09:48',1,'2006-02-15 21:30:53'),(9933,'2005-07-31 15:24:46',2349,111,'2005-08-01 10:00:46',1,'2006-02-15 21:30:53'),(9934,'2005-07-31 15:25:26',2492,236,'2005-08-05 17:13:26',1,'2006-02-15 21:30:53'),(9935,'2005-07-31 15:27:07',2247,10,'2005-08-05 11:23:07',1,'2006-02-15 21:30:53'),(9936,'2005-07-31 15:27:41',979,153,'2005-08-06 16:25:41',1,'2006-02-15 21:30:53'),(9937,'2005-07-31 15:28:10',3697,521,'2005-08-06 21:20:10',2,'2006-02-15 21:30:53'),(9938,'2005-07-31 15:28:47',2871,63,'2005-08-09 21:24:47',2,'2006-02-15 21:30:53'),(9939,'2005-07-31 15:29:00',3049,538,'2005-08-08 11:09:00',1,'2006-02-15 21:30:53'),(9940,'2005-07-31 15:29:06',3975,388,'2005-08-06 14:26:06',2,'2006-02-15 21:30:53'),(9941,'2005-07-31 15:31:25',1756,175,'2005-08-05 17:23:25',1,'2006-02-15 21:30:53'),(9942,'2005-07-31 15:35:43',4573,545,'2005-08-07 17:37:43',2,'2006-02-15 21:30:53'),(9943,'2005-07-31 15:37:29',887,494,'2005-08-09 18:25:29',1,'2006-02-15 21:30:53'),(9944,'2005-07-31 15:44:43',2540,241,'2005-08-08 10:30:43',1,'2006-02-15 21:30:53'),(9945,'2005-07-31 15:47:51',2075,309,'2005-08-02 19:06:51',1,'2006-02-15 21:30:53'),(9946,'2005-07-31 15:48:54',2100,29,'2005-08-03 12:42:54',2,'2006-02-15 21:30:53'),(9947,'2005-07-31 15:49:40',1173,138,'2005-08-08 11:11:40',1,'2006-02-15 21:30:53'),(9948,'2005-07-31 15:49:41',806,342,'2005-08-06 12:36:41',1,'2006-02-15 21:30:53'),(9949,'2005-07-31 15:50:10',3258,309,'2005-08-01 17:53:10',2,'2006-02-15 21:30:53'),(9950,'2005-07-31 15:50:22',1657,572,'2005-08-08 19:10:22',2,'2006-02-15 21:30:53'),(9951,'2005-07-31 15:51:16',4412,95,'2005-08-03 14:54:16',1,'2006-02-15 21:30:53'),(9952,'2005-07-31 15:52:37',1634,128,'2005-08-06 10:50:37',2,'2006-02-15 21:30:53'),(9953,'2005-07-31 15:56:35',1646,211,'2005-08-02 12:01:35',2,'2006-02-15 21:30:53'),(9954,'2005-07-31 15:57:07',1830,463,'2005-08-05 12:04:07',2,'2006-02-15 21:30:53'),(9955,'2005-07-31 16:01:26',1745,342,'2005-08-04 11:15:26',2,'2006-02-15 21:30:53'),(9956,'2005-07-31 16:03:47',4485,342,'2005-08-01 16:40:47',2,'2006-02-15 21:30:53'),(9957,'2005-07-31 16:03:55',1857,85,'2005-08-04 15:16:55',2,'2006-02-15 21:30:53'),(9958,'2005-07-31 16:03:56',4142,157,'2005-08-04 15:21:56',2,'2006-02-15 21:30:53'),(9959,'2005-07-31 16:04:22',340,199,'2005-08-03 21:51:22',2,'2006-02-15 21:30:53'),(9960,'2005-07-31 16:05:52',1022,569,'2005-08-05 14:15:52',2,'2006-02-15 21:30:53'),(9961,'2005-07-31 16:07:50',1856,40,'2005-08-07 18:37:50',2,'2006-02-15 21:30:53'),(9962,'2005-07-31 16:10:36',1951,576,'2005-08-02 17:09:36',1,'2006-02-15 21:30:53'),(9963,'2005-07-31 16:16:46',1609,573,'2005-08-02 22:00:46',1,'2006-02-15 21:30:53'),(9964,'2005-07-31 16:17:39',3149,191,'2005-08-03 15:03:39',1,'2006-02-15 21:30:53'),(9965,'2005-07-31 16:19:32',3946,101,'2005-08-05 20:18:32',2,'2006-02-15 21:30:53'),(9966,'2005-07-31 16:26:46',4137,373,'2005-08-03 14:29:46',1,'2006-02-15 21:30:53'),(9967,'2005-07-31 16:31:17',958,537,'2005-08-06 13:52:17',1,'2006-02-15 21:30:53'),(9968,'2005-07-31 16:32:16',2666,363,'2005-08-08 12:23:16',1,'2006-02-15 21:30:53'),(9969,'2005-07-31 16:38:12',938,151,'2005-08-05 11:45:12',2,'2006-02-15 21:30:53'),(9970,'2005-07-31 16:38:24',2846,578,'2005-08-02 12:59:24',2,'2006-02-15 21:30:53'),(9971,'2005-07-31 16:42:16',2674,573,'2005-08-09 18:08:16',2,'2006-02-15 21:30:53'),(9972,'2005-07-31 16:42:43',190,506,'2005-08-02 11:05:43',2,'2006-02-15 21:30:53'),(9973,'2005-07-31 16:49:31',1850,369,'2005-08-03 22:03:31',2,'2006-02-15 21:30:53'),(9974,'2005-07-31 16:51:11',430,503,'2005-08-05 16:04:11',1,'2006-02-15 21:30:53'),(9975,'2005-07-31 16:53:43',2564,40,'2005-08-07 20:13:43',2,'2006-02-15 21:30:53'),(9976,'2005-07-31 16:57:49',4219,579,'2005-08-03 16:33:49',2,'2006-02-15 21:30:53'),(9977,'2005-07-31 16:58:42',2300,363,'2005-08-09 13:34:42',1,'2006-02-15 21:30:53'),(9978,'2005-07-31 16:59:51',2812,427,'2005-08-06 16:48:51',2,'2006-02-15 21:30:53'),(9979,'2005-07-31 17:00:07',646,576,'2005-08-08 20:40:07',1,'2006-02-15 21:30:53'),(9980,'2005-07-31 17:02:00',122,225,'2005-08-08 11:11:00',2,'2006-02-15 21:30:53'),(9981,'2005-07-31 17:08:31',1354,321,'2005-08-01 22:46:31',2,'2006-02-15 21:30:53'),(9982,'2005-07-31 17:09:02',2698,428,'2005-08-02 13:02:02',2,'2006-02-15 21:30:53'),(9983,'2005-07-31 17:09:36',350,129,'2005-08-08 20:26:36',1,'2006-02-15 21:30:53'),(9984,'2005-07-31 17:12:23',433,432,'2005-08-01 21:04:23',2,'2006-02-15 21:30:53'),(9985,'2005-07-31 17:14:47',1831,85,'2005-08-01 12:11:47',2,'2006-02-15 21:30:53'),(9986,'2005-07-31 17:16:50',1242,124,'2005-08-05 18:34:50',2,'2006-02-15 21:30:53'),(9987,'2005-07-31 17:22:35',1619,15,'2005-08-01 21:19:35',2,'2006-02-15 21:30:53'),(9988,'2005-07-31 17:22:36',3844,243,'2005-08-07 18:35:36',2,'2006-02-15 21:30:53'),(9989,'2005-07-31 17:22:39',1713,79,'2005-08-01 18:55:39',1,'2006-02-15 21:30:53'),(9990,'2005-07-31 17:24:21',4481,555,'2005-08-09 17:14:21',2,'2006-02-15 21:30:53'),(9991,'2005-07-31 17:26:27',3662,414,'2005-08-03 17:36:27',1,'2006-02-15 21:30:53'),(9992,'2005-07-31 17:29:48',4242,304,'2005-08-09 13:02:48',2,'2006-02-15 21:30:53'),(9993,'2005-07-31 17:30:20',2503,225,'2005-08-01 20:53:20',2,'2006-02-15 21:30:53'),(9994,'2005-07-31 17:30:31',2155,195,'2005-08-01 11:35:31',1,'2006-02-15 21:30:53'),(9995,'2005-07-31 17:30:47',1978,180,'2005-08-04 12:20:47',2,'2006-02-15 21:30:53'),(9996,'2005-07-31 17:32:03',3271,104,'2005-08-06 16:17:03',2,'2006-02-15 21:30:53'),(9997,'2005-07-31 17:37:30',640,579,'2005-08-02 14:49:30',1,'2006-02-15 21:30:53'),(9998,'2005-07-31 17:40:35',2549,30,'2005-08-04 18:15:35',1,'2006-02-15 21:30:53'),(9999,'2005-07-31 17:40:53',1438,543,'2005-08-01 14:25:53',1,'2006-02-15 21:30:53'),(10000,'2005-07-31 17:41:05',3221,576,'2005-08-02 20:51:05',1,'2006-02-15 21:30:53'),(10001,'2005-07-31 17:46:18',2188,244,'2005-08-07 20:38:18',1,'2006-02-15 21:30:53'),(10002,'2005-07-31 17:48:16',1002,323,'2005-08-06 16:15:16',1,'2006-02-15 21:30:53'),(10003,'2005-07-31 17:48:51',1603,13,'2005-08-02 14:23:51',1,'2006-02-15 21:30:53'),(10004,'2005-07-31 17:51:23',2396,570,'2005-08-03 19:12:23',1,'2006-02-15 21:30:53'),(10005,'2005-07-31 17:53:51',928,454,'2005-08-09 21:39:51',1,'2006-02-15 21:30:53'),(10006,'2005-07-31 17:54:35',2538,470,'2005-08-02 20:40:35',2,'2006-02-15 21:30:53'),(10007,'2005-07-31 17:54:58',293,445,'2005-08-05 17:24:58',2,'2006-02-15 21:30:53'),(10008,'2005-07-31 17:59:36',2589,91,'2005-08-03 22:43:36',2,'2006-02-15 21:30:53'),(10009,'2005-07-31 18:00:28',4441,437,'2005-08-08 22:24:28',2,'2006-02-15 21:30:53'),(10010,'2005-07-31 18:01:36',2655,373,'2005-08-07 20:27:36',2,'2006-02-15 21:30:53'),(10011,'2005-07-31 18:02:41',606,128,'2005-08-08 17:04:41',1,'2006-02-15 21:30:53'),(10012,'2005-07-31 18:06:06',2554,513,'2005-08-09 16:47:06',2,'2006-02-15 21:30:53'),(10013,'2005-07-31 18:08:21',2364,377,'2005-08-08 13:22:21',2,'2006-02-15 21:30:53'),(10014,'2005-07-31 18:10:56',2344,443,'2005-08-02 23:36:56',1,'2006-02-15 21:30:53'),(10015,'2005-07-31 18:11:17',67,153,'2005-08-03 15:48:17',2,'2006-02-15 21:30:53'),(10016,'2005-07-31 18:13:06',2183,478,'2005-08-09 22:11:06',1,'2006-02-15 21:30:53'),(10017,'2005-07-31 18:13:22',1495,424,'2005-08-05 16:03:22',1,'2006-02-15 21:30:53'),(10018,'2005-07-31 18:15:14',3708,481,'2005-08-05 14:44:14',2,'2006-02-15 21:30:53'),(10019,'2005-07-31 18:20:56',2114,536,'2005-08-07 14:25:56',1,'2006-02-15 21:30:53'),(10020,'2005-07-31 18:21:08',302,526,'2005-08-02 14:03:08',2,'2006-02-15 21:30:53'),(10021,'2005-07-31 18:24:39',3235,597,'2005-08-01 19:16:39',1,'2006-02-15 21:30:53'),(10022,'2005-07-31 18:25:30',1900,115,'2005-08-04 13:35:30',1,'2006-02-15 21:30:53'),(10023,'2005-07-31 18:25:51',384,318,'2005-08-09 18:00:51',1,'2006-02-15 21:30:53'),(10024,'2005-07-31 18:26:36',265,129,'2005-08-09 16:16:36',1,'2006-02-15 21:30:53'),(10025,'2005-07-31 18:29:09',475,565,'2005-08-07 14:20:09',2,'2006-02-15 21:30:53'),(10026,'2005-07-31 18:31:51',39,332,'2005-08-03 21:14:51',2,'2006-02-15 21:30:53'),(10027,'2005-07-31 18:33:51',525,287,'2005-08-09 18:40:51',1,'2006-02-15 21:30:53'),(10028,'2005-07-31 18:35:54',2305,323,'2005-08-01 13:01:54',2,'2006-02-15 21:30:53'),(10029,'2005-07-31 18:37:47',505,578,'2005-08-06 14:58:47',2,'2006-02-15 21:30:53'),(10030,'2005-07-31 18:39:36',1392,325,'2005-08-03 15:29:36',2,'2006-02-15 21:30:53'),(10031,'2005-07-31 18:40:15',3048,96,'2005-08-03 14:38:15',1,'2006-02-15 21:30:53'),(10032,'2005-07-31 18:41:55',2331,126,'2005-08-04 22:45:55',1,'2006-02-15 21:30:53'),(10033,'2005-07-31 18:44:29',4480,381,'2005-08-04 19:52:29',1,'2006-02-15 21:30:53'),(10034,'2005-07-31 18:45:30',354,442,'2005-08-04 21:13:30',2,'2006-02-15 21:30:53'),(10035,'2005-07-31 18:46:46',2694,333,'2005-08-04 20:33:46',1,'2006-02-15 21:30:53'),(10036,'2005-07-31 18:47:20',41,491,'2005-08-03 22:53:20',1,'2006-02-15 21:30:53'),(10037,'2005-07-31 18:48:08',438,58,'2005-08-09 19:11:08',2,'2006-02-15 21:30:53'),(10038,'2005-07-31 18:49:12',3727,112,'2005-08-01 18:02:12',1,'2006-02-15 21:30:53'),(10039,'2005-07-31 18:50:40',4391,111,'2005-08-01 18:49:40',2,'2006-02-15 21:30:53'),(10040,'2005-07-31 18:54:15',2281,268,'2005-08-05 17:33:15',2,'2006-02-15 21:30:53'),(10041,'2005-07-31 19:01:02',2994,379,'2005-08-07 21:32:02',1,'2006-02-15 21:30:53'),(10042,'2005-07-31 19:01:25',123,204,'2005-08-06 14:21:25',1,'2006-02-15 21:30:53'),(10043,'2005-07-31 19:02:07',2558,222,'2005-08-07 17:58:07',1,'2006-02-15 21:30:53'),(10044,'2005-07-31 19:02:33',3349,388,'2005-08-05 13:24:33',2,'2006-02-15 21:30:53'),(10045,'2005-07-31 19:04:35',58,118,'2005-08-07 16:53:35',1,'2006-02-15 21:30:53'),(10046,'2005-07-31 19:07:11',4302,50,'2005-08-03 13:25:11',1,'2006-02-15 21:30:53'),(10047,'2005-07-31 19:07:43',4195,244,'2005-08-07 00:20:43',2,'2006-02-15 21:30:53'),(10048,'2005-07-31 19:08:56',3821,267,'2005-08-05 20:15:56',2,'2006-02-15 21:30:53'),(10049,'2005-07-31 19:11:11',854,457,'2005-08-03 22:15:11',1,'2006-02-15 21:30:53'),(10050,'2005-07-31 19:13:29',295,230,'2005-08-06 15:44:29',1,'2006-02-15 21:30:53'),(10051,'2005-07-31 19:14:20',163,74,'2005-08-05 19:45:20',1,'2006-02-15 21:30:53'),(10052,'2005-07-31 19:15:13',3307,39,'2005-08-07 22:47:13',2,'2006-02-15 21:30:53'),(10053,'2005-07-31 19:15:39',4102,223,'2005-08-07 22:32:39',1,'2006-02-15 21:30:53'),(10054,'2005-07-31 19:15:52',2303,598,'2005-08-04 19:54:52',1,'2006-02-15 21:30:53'),(10055,'2005-07-31 19:15:58',2725,336,'2005-08-05 20:23:58',1,'2006-02-15 21:30:53'),(10056,'2005-07-31 19:19:13',281,237,'2005-08-01 16:09:13',2,'2006-02-15 21:30:53'),(10057,'2005-07-31 19:20:18',3485,230,'2005-08-08 17:59:18',2,'2006-02-15 21:30:53'),(10058,'2005-07-31 19:20:21',758,237,'2005-08-04 00:41:21',2,'2006-02-15 21:30:53'),(10059,'2005-07-31 19:20:49',2020,274,'2005-08-03 14:39:49',1,'2006-02-15 21:30:53'),(10060,'2005-07-31 19:23:00',1979,42,'2005-08-08 19:07:00',1,'2006-02-15 21:30:53'),(10061,'2005-07-31 19:23:25',1401,390,'2005-08-04 19:38:25',1,'2006-02-15 21:30:53'),(10062,'2005-07-31 19:24:55',1815,333,'2005-08-03 22:51:55',2,'2006-02-15 21:30:53'),(10063,'2005-07-31 19:25:13',3003,517,'2005-08-09 15:55:13',1,'2006-02-15 21:30:53'),(10064,'2005-07-31 19:27:02',3140,41,'2005-08-06 21:15:02',1,'2006-02-15 21:30:53'),(10065,'2005-07-31 19:27:34',1426,495,'2005-08-01 13:45:34',2,'2006-02-15 21:30:53'),(10066,'2005-07-31 19:30:01',4285,123,'2005-08-01 14:45:01',2,'2006-02-15 21:30:53'),(10067,'2005-07-31 19:37:58',1940,148,'2005-08-04 17:32:58',2,'2006-02-15 21:30:53'),(10068,'2005-07-31 19:39:38',4000,58,'2005-08-05 22:49:38',1,'2006-02-15 21:30:53'),(10069,'2005-07-31 19:43:18',2168,270,'2005-08-06 19:40:18',2,'2006-02-15 21:30:53'),(10070,'2005-07-31 19:46:29',1010,325,'2005-08-03 22:21:29',1,'2006-02-15 21:30:53'),(10071,'2005-07-31 19:49:35',2360,353,'2005-08-03 00:00:35',2,'2006-02-15 21:30:53'),(10072,'2005-07-31 19:50:37',3963,520,'2005-08-03 00:25:37',2,'2006-02-15 21:30:53'),(10073,'2005-07-31 19:53:15',4246,584,'2005-08-05 23:12:15',2,'2006-02-15 21:30:53'),(10074,'2005-07-31 19:57:16',1268,69,'2005-08-04 00:54:16',1,'2006-02-15 21:30:53'),(10075,'2005-07-31 19:58:42',2037,469,'2005-08-08 19:49:42',1,'2006-02-15 21:30:53'),(10076,'2005-07-31 20:00:34',1117,555,'2005-08-10 00:37:34',2,'2006-02-15 21:30:53'),(10077,'2005-07-31 20:01:06',2333,19,'2005-08-09 16:07:06',1,'2006-02-15 21:30:53'),(10078,'2005-07-31 20:02:02',3198,151,'2005-08-04 00:45:02',1,'2006-02-15 21:30:53'),(10079,'2005-07-31 20:05:45',4541,486,'2005-08-04 16:25:45',2,'2006-02-15 21:30:53'),(10080,'2005-07-31 20:07:10',4355,62,'2005-08-04 23:07:10',2,'2006-02-15 21:30:53'),(10081,'2005-07-31 20:07:44',3183,443,'2005-08-06 20:04:44',1,'2006-02-15 21:30:53'),(10082,'2005-07-31 20:09:32',1275,76,'2005-08-01 15:41:32',2,'2006-02-15 21:30:53'),(10083,'2005-07-31 20:10:19',2585,449,'2005-08-06 23:18:19',1,'2006-02-15 21:30:53'),(10084,'2005-07-31 20:11:29',524,528,'2005-08-06 22:28:29',2,'2006-02-15 21:30:53'),(10085,'2005-07-31 20:12:02',2556,392,'2005-08-03 00:03:02',2,'2006-02-15 21:30:53'),(10086,'2005-07-31 20:14:08',2853,205,'2005-08-07 01:33:08',2,'2006-02-15 21:30:53'),(10087,'2005-07-31 20:15:22',1393,245,'2005-08-07 01:33:22',1,'2006-02-15 21:30:53'),(10088,'2005-07-31 20:16:21',4293,46,'2005-08-01 22:47:21',2,'2006-02-15 21:30:53'),(10089,'2005-07-31 20:17:09',248,160,'2005-08-01 19:14:09',2,'2006-02-15 21:30:53'),(10090,'2005-07-31 20:22:01',4023,533,'2005-08-04 17:30:01',1,'2006-02-15 21:30:53'),(10091,'2005-07-31 20:23:13',1878,135,'2005-08-02 21:58:13',2,'2006-02-15 21:30:53'),(10092,'2005-07-31 20:28:09',4151,364,'2005-08-01 21:37:09',1,'2006-02-15 21:30:53'),(10093,'2005-07-31 20:30:32',3943,162,'2005-08-04 00:04:32',2,'2006-02-15 21:30:53'),(10094,'2005-07-31 20:31:18',2865,596,'2005-08-06 18:31:18',2,'2006-02-15 21:30:53'),(10095,'2005-07-31 20:38:35',4062,370,'2005-08-02 02:33:35',1,'2006-02-15 21:30:53'),(10096,'2005-07-31 20:38:58',3606,290,'2005-08-06 02:34:58',1,'2006-02-15 21:30:53'),(10097,'2005-07-31 20:39:38',784,519,'2005-08-08 22:22:38',1,'2006-02-15 21:30:53'),(10098,'2005-07-31 20:41:17',1324,155,'2005-08-02 00:06:17',2,'2006-02-15 21:30:53'),(10099,'2005-07-31 20:47:14',1960,220,'2005-08-02 17:25:14',1,'2006-02-15 21:30:53'),(10100,'2005-07-31 20:47:18',4050,330,'2005-08-03 16:58:18',2,'2006-02-15 21:30:53'),(10101,'2005-07-31 20:47:29',2513,119,'2005-08-04 21:28:29',1,'2006-02-15 21:30:53'),(10102,'2005-07-31 20:49:10',4078,170,'2005-08-08 20:15:10',1,'2006-02-15 21:30:53'),(10103,'2005-07-31 20:49:13',77,25,'2005-08-05 15:55:13',2,'2006-02-15 21:30:53'),(10104,'2005-07-31 20:49:14',3358,186,'2005-08-05 01:11:14',2,'2006-02-15 21:30:53'),(10105,'2005-07-31 20:54:20',112,286,'2005-08-09 17:45:20',1,'2006-02-15 21:30:53'),(10106,'2005-07-31 21:00:47',3444,556,'2005-08-02 20:11:47',2,'2006-02-15 21:30:53'),(10107,'2005-07-31 21:01:46',1326,414,'2005-08-09 01:33:46',2,'2006-02-15 21:30:53'),(10108,'2005-07-31 21:02:14',3703,326,'2005-08-01 18:28:14',1,'2006-02-15 21:30:53'),(10109,'2005-07-31 21:04:49',2852,403,'2005-08-08 19:25:49',1,'2006-02-15 21:30:53'),(10110,'2005-07-31 21:06:12',4081,138,'2005-08-03 02:03:12',2,'2006-02-15 21:30:53'),(10111,'2005-07-31 21:08:33',3474,38,'2005-08-06 02:58:33',2,'2006-02-15 21:30:53'),(10112,'2005-07-31 21:08:56',2643,198,'2005-08-01 23:35:56',2,'2006-02-15 21:30:53'),(10113,'2005-07-31 21:10:03',3974,461,'2005-08-02 21:13:03',2,'2006-02-15 21:30:53'),(10114,'2005-07-31 21:12:58',3881,218,'2005-08-02 19:45:58',2,'2006-02-15 21:30:53'),(10115,'2005-07-31 21:13:47',2731,68,'2005-08-10 00:44:47',1,'2006-02-15 21:30:53'),(10116,'2005-07-31 21:14:02',738,28,'2005-08-03 01:48:02',2,'2006-02-15 21:30:53'),(10117,'2005-07-31 21:14:31',1894,459,'2005-08-01 15:59:31',2,'2006-02-15 21:30:53'),(10118,'2005-07-31 21:16:31',1209,143,'2005-08-03 02:32:31',1,'2006-02-15 21:30:53'),(10119,'2005-07-31 21:20:59',54,351,'2005-08-02 23:14:59',2,'2006-02-15 21:30:53'),(10120,'2005-07-31 21:24:24',1709,396,'2005-08-03 17:44:24',2,'2006-02-15 21:30:53'),(10121,'2005-07-31 21:24:53',2969,425,'2005-08-03 22:24:53',1,'2006-02-15 21:30:53'),(10122,'2005-07-31 21:29:28',4229,196,'2005-08-09 00:04:28',1,'2006-02-15 21:30:53'),(10123,'2005-07-31 21:30:46',4564,487,'2005-08-06 16:28:46',1,'2006-02-15 21:30:53'),(10124,'2005-07-31 21:31:49',1956,396,'2005-08-04 00:06:49',1,'2006-02-15 21:30:53'),(10125,'2005-07-31 21:33:03',493,178,'2005-08-01 19:10:03',1,'2006-02-15 21:30:53'),(10126,'2005-07-31 21:36:07',3,39,'2005-08-03 23:59:07',1,'2006-02-15 21:30:53'),(10127,'2005-07-31 21:39:48',717,478,'2005-08-06 00:10:48',1,'2006-02-15 21:30:53'),(10128,'2005-07-31 21:40:04',2559,508,'2005-08-02 02:21:04',1,'2006-02-15 21:30:53'),(10129,'2005-07-31 21:41:35',2848,564,'2005-08-05 17:05:35',1,'2006-02-15 21:30:53'),(10130,'2005-07-31 21:44:30',3964,95,'2005-08-04 17:06:30',1,'2006-02-15 21:30:53'),(10131,'2005-07-31 21:45:28',4169,510,'2005-08-04 00:19:28',2,'2006-02-15 21:30:53'),(10132,'2005-07-31 21:50:24',3934,23,'2005-08-07 23:37:24',2,'2006-02-15 21:30:53'),(10133,'2005-07-31 21:55:07',614,234,'2005-08-08 23:04:07',1,'2006-02-15 21:30:53'),(10134,'2005-07-31 21:56:10',4483,311,'2005-08-06 21:20:10',1,'2006-02-15 21:30:53'),(10135,'2005-07-31 21:57:32',4193,307,'2005-08-05 22:23:32',1,'2006-02-15 21:30:53'),(10136,'2005-07-31 21:58:56',3142,2,'2005-08-03 19:44:56',1,'2006-02-15 21:30:53'),(10137,'2005-07-31 22:01:41',612,236,'2005-08-07 22:24:41',1,'2006-02-15 21:30:53'),(10138,'2005-07-31 22:02:09',179,225,'2005-08-07 20:46:09',2,'2006-02-15 21:30:53'),(10139,'2005-07-31 22:02:20',407,441,'2005-08-04 02:09:20',1,'2006-02-15 21:30:53'),(10140,'2005-07-31 22:03:20',2494,550,'2005-08-07 23:15:20',2,'2006-02-15 21:30:53'),(10141,'2005-07-31 22:08:29',8,8,'2005-08-06 16:59:29',1,'2006-02-15 21:30:53'),(10142,'2005-07-31 22:10:54',1839,257,'2005-08-09 19:04:54',2,'2006-02-15 21:30:53'),(10143,'2005-07-31 22:11:43',2139,271,'2005-08-09 17:48:43',2,'2006-02-15 21:30:53'),(10144,'2005-07-31 22:13:52',3011,49,'2005-08-05 19:27:52',1,'2006-02-15 21:30:53'),(10145,'2005-07-31 22:15:13',2511,361,'2005-08-06 23:26:13',1,'2006-02-15 21:30:53'),(10146,'2005-07-31 22:17:56',1721,559,'2005-08-02 21:27:56',1,'2006-02-15 21:30:53'),(10147,'2005-07-31 22:18:43',1351,198,'2005-08-02 23:08:43',2,'2006-02-15 21:30:53'),(10148,'2005-07-31 22:19:16',1381,63,'2005-08-05 00:15:16',2,'2006-02-15 21:30:53'),(10149,'2005-07-31 22:20:46',890,276,'2005-08-07 23:12:46',2,'2006-02-15 21:30:53'),(10150,'2005-07-31 22:22:00',2328,419,'2005-08-05 01:17:00',2,'2006-02-15 21:30:53'),(10151,'2005-07-31 22:22:37',4442,361,'2005-08-01 22:20:37',1,'2006-02-15 21:30:53'),(10152,'2005-07-31 22:28:05',1114,244,'2005-08-08 22:39:05',2,'2006-02-15 21:30:53'),(10153,'2005-07-31 22:30:10',2945,297,'2005-08-06 02:32:10',2,'2006-02-15 21:30:53'),(10154,'2005-07-31 22:30:49',2745,149,'2005-08-07 03:05:49',2,'2006-02-15 21:30:53'),(10155,'2005-07-31 22:31:43',3176,235,'2005-08-07 02:43:43',1,'2006-02-15 21:30:53'),(10156,'2005-07-31 22:36:00',141,179,'2005-08-02 00:03:00',2,'2006-02-15 21:30:53'),(10157,'2005-07-31 22:38:48',2960,232,'2005-08-01 21:38:48',1,'2006-02-15 21:30:53'),(10158,'2005-07-31 22:40:31',1626,393,'2005-08-08 18:25:31',2,'2006-02-15 21:30:53'),(10159,'2005-07-31 22:54:30',1174,515,'2005-08-03 00:43:30',2,'2006-02-15 21:30:53'),(10160,'2005-07-31 23:07:40',863,295,'2005-08-05 23:34:40',1,'2006-02-15 21:30:53'),(10161,'2005-07-31 23:09:41',2651,120,'2005-08-02 20:46:41',2,'2006-02-15 21:30:53'),(10162,'2005-07-31 23:11:01',1327,475,'2005-08-07 01:52:01',2,'2006-02-15 21:30:53'),(10163,'2005-07-31 23:12:34',2811,425,'2005-08-01 22:47:34',2,'2006-02-15 21:30:53'),(10164,'2005-07-31 23:17:57',1405,89,'2005-08-05 19:43:57',1,'2006-02-15 21:30:53'),(10165,'2005-07-31 23:21:23',3476,50,'2005-08-06 18:06:23',1,'2006-02-15 21:30:53'),(10166,'2005-07-31 23:22:20',4304,484,'2005-08-07 18:06:20',2,'2006-02-15 21:30:53'),(10167,'2005-07-31 23:24:31',1222,129,'2005-08-06 17:42:31',2,'2006-02-15 21:30:53'),(10168,'2005-07-31 23:25:24',4548,570,'2005-08-02 19:03:24',1,'2006-02-15 21:30:53'),(10169,'2005-07-31 23:27:13',2675,57,'2005-08-05 20:32:13',2,'2006-02-15 21:30:53'),(10170,'2005-07-31 23:27:31',804,41,'2005-08-08 04:53:31',2,'2006-02-15 21:30:53'),(10171,'2005-07-31 23:29:05',1367,401,'2005-08-03 19:39:05',1,'2006-02-15 21:30:53'),(10172,'2005-07-31 23:29:51',2506,426,'2005-08-09 01:57:51',1,'2006-02-15 21:30:53'),(10173,'2005-07-31 23:36:59',2527,326,'2005-08-08 20:20:59',2,'2006-02-15 21:30:53'),(10174,'2005-07-31 23:40:08',2459,359,'2005-08-06 21:08:08',2,'2006-02-15 21:30:53'),(10175,'2005-07-31 23:40:11',3672,137,'2005-08-09 02:22:11',1,'2006-02-15 21:30:53'),(10176,'2005-07-31 23:40:35',1181,19,'2005-08-09 00:46:35',2,'2006-02-15 21:30:53'),(10177,'2005-07-31 23:42:33',2242,279,'2005-08-03 01:30:33',2,'2006-02-15 21:30:53'),(10178,'2005-07-31 23:43:04',1582,491,'2005-08-03 00:43:04',1,'2006-02-15 21:30:53'),(10179,'2005-07-31 23:49:54',2136,131,'2005-08-01 20:46:54',2,'2006-02-15 21:30:53'),(10180,'2005-07-31 23:57:43',757,50,'2005-08-09 04:04:43',2,'2006-02-15 21:30:53'),(10181,'2005-08-01 00:00:44',3111,113,'2005-08-04 19:33:44',1,'2006-02-15 21:30:53'),(10182,'2005-08-01 00:08:01',4112,578,'2005-08-09 18:14:01',2,'2006-02-15 21:30:53'),(10183,'2005-08-01 00:08:01',4319,377,'2005-08-09 20:41:01',1,'2006-02-15 21:30:53'),(10184,'2005-08-01 00:09:33',2785,77,'2005-08-05 04:12:33',2,'2006-02-15 21:30:53'),(10185,'2005-08-01 00:12:11',1266,64,'2005-08-03 03:03:11',1,'2006-02-15 21:30:53'),(10186,'2005-08-01 00:12:36',4563,294,'2005-08-07 05:08:36',1,'2006-02-15 21:30:53'),(10187,'2005-08-01 00:15:49',1629,400,'2005-08-05 01:00:49',2,'2006-02-15 21:30:53'),(10188,'2005-08-01 00:19:41',1221,331,'2005-08-08 00:19:41',2,'2006-02-15 21:30:53'),(10189,'2005-08-01 00:25:00',616,509,'2005-08-03 06:01:00',2,'2006-02-15 21:30:53'),(10190,'2005-08-01 00:27:53',4411,138,'2005-08-01 20:32:53',2,'2006-02-15 21:30:53'),(10191,'2005-08-01 00:28:38',1131,196,'2005-08-06 02:23:38',1,'2006-02-15 21:30:53'),(10192,'2005-08-01 00:33:00',1632,569,'2005-08-05 03:37:00',2,'2006-02-15 21:30:53'),(10193,'2005-08-01 00:33:27',2036,358,'2005-08-07 20:15:27',1,'2006-02-15 21:30:53'),(10194,'2005-08-01 00:33:52',1447,290,'2005-08-06 04:50:52',2,'2006-02-15 21:30:53'),(10195,'2005-08-01 00:34:42',2691,396,'2005-08-08 05:04:42',2,'2006-02-15 21:30:53'),(10196,'2005-08-01 00:34:51',3070,199,'2005-08-05 03:43:51',1,'2006-02-15 21:30:53'),(10197,'2005-08-01 00:35:25',1186,127,'2005-08-07 06:04:25',2,'2006-02-15 21:30:53'),(10198,'2005-08-01 00:36:15',1297,366,'2005-08-07 06:18:15',2,'2006-02-15 21:30:53'),(10199,'2005-08-01 00:38:55',3665,526,'2005-08-05 03:41:55',1,'2006-02-15 21:30:53'),(10200,'2005-08-01 00:39:05',580,421,'2005-08-05 01:07:05',1,'2006-02-15 21:30:53'),(10201,'2005-08-01 00:42:18',3649,299,'2005-08-08 20:49:18',2,'2006-02-15 21:30:53'),(10202,'2005-08-01 00:43:18',1099,306,'2005-08-08 23:26:18',1,'2006-02-15 21:30:53'),(10203,'2005-08-01 00:45:27',1096,157,'2005-08-04 22:45:27',2,'2006-02-15 21:30:53'),(10204,'2005-08-01 00:47:39',764,572,'2005-08-05 01:11:39',1,'2006-02-15 21:30:53'),(10205,'2005-08-01 00:48:24',33,87,'2005-08-06 23:53:24',1,'2006-02-15 21:30:53'),(10206,'2005-08-01 00:52:40',4479,90,'2005-08-10 02:36:40',2,'2006-02-15 21:30:53'),(10207,'2005-08-01 00:53:01',2925,334,'2005-08-05 05:51:01',2,'2006-02-15 21:30:53'),(10208,'2005-08-01 00:54:51',3324,246,'2005-08-04 22:39:51',2,'2006-02-15 21:30:53'),(10209,'2005-08-01 00:56:47',2429,303,'2005-08-03 19:58:47',2,'2006-02-15 21:30:53'),(10210,'2005-08-01 00:58:52',49,391,'2005-08-10 01:16:52',1,'2006-02-15 21:30:53'),(10211,'2005-08-01 01:01:16',810,530,'2005-08-10 01:31:16',1,'2006-02-15 21:30:53'),(10212,'2005-08-01 01:01:35',3728,324,'2005-08-02 23:02:35',1,'2006-02-15 21:30:53'),(10213,'2005-08-01 01:03:18',1462,106,'2005-08-09 20:07:18',1,'2006-02-15 21:30:53'),(10214,'2005-08-01 01:04:15',648,597,'2005-08-01 19:31:15',2,'2006-02-15 21:30:53'),(10215,'2005-08-01 01:04:28',838,345,'2005-08-09 21:43:28',2,'2006-02-15 21:30:53'),(10216,'2005-08-01 01:06:27',3603,436,'2005-08-08 22:41:27',2,'2006-02-15 21:30:53'),(10217,'2005-08-01 01:07:27',1193,389,'2005-08-09 00:42:27',1,'2006-02-15 21:30:53'),(10218,'2005-08-01 01:09:44',3886,101,'2005-08-05 20:08:44',1,'2006-02-15 21:30:53'),(10219,'2005-08-01 01:10:33',2262,505,'2005-08-10 02:45:33',2,'2006-02-15 21:30:53'),(10220,'2005-08-01 01:13:22',3920,294,'2005-08-04 22:57:22',2,'2006-02-15 21:30:53'),(10221,'2005-08-01 01:16:50',3051,373,'2005-08-03 05:35:50',2,'2006-02-15 21:30:53'),(10222,'2005-08-01 01:17:42',1214,295,'2005-08-08 02:45:42',1,'2006-02-15 21:30:53'),(10223,'2005-08-01 01:23:15',1370,522,'2005-08-02 19:39:15',1,'2006-02-15 21:30:53'),(10224,'2005-08-01 01:31:56',1443,587,'2005-08-05 21:21:56',2,'2006-02-15 21:30:53'),(10225,'2005-08-01 01:38:40',3131,498,'2005-08-06 20:00:40',1,'2006-02-15 21:30:53'),(10226,'2005-08-01 01:40:04',3067,107,'2005-08-08 01:02:04',1,'2006-02-15 21:30:53'),(10227,'2005-08-01 01:42:22',872,571,'2005-08-09 23:45:22',2,'2006-02-15 21:30:53'),(10228,'2005-08-01 01:43:18',1742,106,'2005-08-06 22:10:18',2,'2006-02-15 21:30:53'),(10229,'2005-08-01 01:45:26',3459,175,'2005-08-10 06:21:26',1,'2006-02-15 21:30:53'),(10230,'2005-08-01 01:49:36',76,398,'2005-08-05 01:29:36',2,'2006-02-15 21:30:53'),(10231,'2005-08-01 01:50:49',1056,511,'2005-08-06 03:12:49',1,'2006-02-15 21:30:53'),(10232,'2005-08-01 01:50:55',586,512,'2005-08-03 04:12:55',1,'2006-02-15 21:30:53'),(10233,'2005-08-01 01:54:23',4571,459,'2005-08-10 00:23:23',2,'2006-02-15 21:30:53'),(10234,'2005-08-01 01:56:20',1641,207,'2005-08-09 01:51:20',2,'2006-02-15 21:30:53'),(10235,'2005-08-01 01:57:48',2850,30,'2005-08-10 07:38:48',2,'2006-02-15 21:30:53'),(10236,'2005-08-01 02:05:34',3754,470,'2005-08-01 23:40:34',1,'2006-02-15 21:30:53'),(10237,'2005-08-01 02:07:32',432,313,'2005-08-07 03:54:32',1,'2006-02-15 21:30:53'),(10238,'2005-08-01 02:08:05',561,192,'2005-08-02 01:52:05',1,'2006-02-15 21:30:53'),(10239,'2005-08-01 02:09:22',1232,467,'2005-08-04 01:35:22',2,'2006-02-15 21:30:53'),(10240,'2005-08-01 02:09:33',4494,109,'2005-08-07 02:22:33',2,'2006-02-15 21:30:53'),(10241,'2005-08-01 02:12:25',1526,161,'2005-08-08 00:37:25',1,'2006-02-15 21:30:53'),(10242,'2005-08-01 02:18:12',1825,342,'2005-08-02 22:32:12',2,'2006-02-15 21:30:53'),(10243,'2005-08-01 02:18:46',2236,132,'2005-08-06 21:45:46',1,'2006-02-15 21:30:53'),(10244,'2005-08-01 02:20:01',567,51,'2005-08-06 23:06:01',2,'2006-02-15 21:30:53'),(10245,'2005-08-01 02:24:09',2880,163,'2005-08-02 02:31:09',1,'2006-02-15 21:30:53'),(10246,'2005-08-01 02:29:50',3598,261,'2005-08-09 01:17:50',2,'2006-02-15 21:30:53'),(10247,'2005-08-01 02:34:06',4035,189,'2005-08-09 02:33:06',1,'2006-02-15 21:30:53'),(10248,'2005-08-01 02:35:28',2146,298,'2005-08-08 02:24:28',2,'2006-02-15 21:30:53'),(10249,'2005-08-01 02:35:39',135,437,'2005-08-06 06:50:39',1,'2006-02-15 21:30:53'),(10250,'2005-08-01 02:38:42',3706,116,'2005-08-07 03:59:42',2,'2006-02-15 21:30:53'),(10251,'2005-08-01 02:39:12',2986,39,'2005-08-06 03:51:12',1,'2006-02-15 21:30:53'),(10252,'2005-08-01 02:39:39',2380,86,'2005-08-10 00:40:39',2,'2006-02-15 21:30:53'),(10253,'2005-08-01 02:39:49',1406,101,'2005-08-08 04:28:49',2,'2006-02-15 21:30:53'),(10254,'2005-08-01 02:42:03',2238,416,'2005-08-05 23:31:03',1,'2006-02-15 21:30:53'),(10255,'2005-08-01 02:46:13',4558,459,'2005-08-03 05:54:13',1,'2006-02-15 21:30:53'),(10256,'2005-08-01 02:47:11',780,58,'2005-08-05 05:21:11',2,'2006-02-15 21:30:53'),(10257,'2005-08-01 02:49:43',2403,543,'2005-08-04 04:45:43',2,'2006-02-15 21:30:53'),(10258,'2005-08-01 02:51:09',2062,469,'2005-08-08 23:57:09',2,'2006-02-15 21:30:53'),(10259,'2005-08-01 02:52:05',1881,566,'2005-08-03 20:54:05',1,'2006-02-15 21:30:53'),(10260,'2005-08-01 02:58:07',2864,461,'2005-08-05 02:06:07',2,'2006-02-15 21:30:53'),(10261,'2005-08-01 02:58:27',2346,50,'2005-08-01 21:55:27',2,'2006-02-15 21:30:53'),(10262,'2005-08-01 03:01:26',3842,181,'2005-08-08 08:03:26',2,'2006-02-15 21:30:53'),(10263,'2005-08-01 03:02:48',2420,415,'2005-08-08 02:16:48',2,'2006-02-15 21:30:53'),(10264,'2005-08-01 03:03:12',1374,297,'2005-08-08 00:34:12',2,'2006-02-15 21:30:53'),(10265,'2005-08-01 03:05:04',3338,510,'2005-08-08 08:09:04',1,'2006-02-15 21:30:53'),(10266,'2005-08-01 03:05:59',476,49,'2005-08-06 06:23:59',1,'2006-02-15 21:30:53'),(10267,'2005-08-01 03:07:26',3883,72,'2005-08-07 22:49:26',1,'2006-02-15 21:30:53'),(10268,'2005-08-01 03:08:56',2755,138,'2005-08-08 02:41:56',1,'2006-02-15 21:30:53'),(10269,'2005-08-01 03:09:26',2537,39,'2005-08-02 00:01:26',1,'2006-02-15 21:30:53'),(10270,'2005-08-01 03:10:24',2025,168,'2005-08-07 03:04:24',2,'2006-02-15 21:30:53'),(10271,'2005-08-01 03:13:39',3692,6,'2005-08-07 23:40:39',1,'2006-02-15 21:30:53'),(10272,'2005-08-01 03:14:34',128,273,'2005-08-10 05:56:34',2,'2006-02-15 21:30:53'),(10273,'2005-08-01 03:14:47',1458,212,'2005-08-07 03:59:47',1,'2006-02-15 21:30:53'),(10274,'2005-08-01 03:16:51',2916,375,'2005-08-04 22:22:51',2,'2006-02-15 21:30:53'),(10275,'2005-08-01 03:20:08',669,463,'2005-08-08 06:48:08',1,'2006-02-15 21:30:53'),(10276,'2005-08-01 03:22:23',2201,48,'2005-08-03 07:59:23',1,'2006-02-15 21:30:53'),(10277,'2005-08-01 03:22:41',1472,176,'2005-08-05 05:07:41',1,'2006-02-15 21:30:53'),(10278,'2005-08-01 03:25:27',2497,154,'2005-08-08 07:52:27',1,'2006-02-15 21:30:53'),(10279,'2005-08-01 03:26:44',3794,247,'2005-08-07 22:35:44',2,'2006-02-15 21:30:53'),(10280,'2005-08-01 03:27:15',1457,542,'2005-08-07 23:01:15',2,'2006-02-15 21:30:53'),(10281,'2005-08-01 03:28:33',1047,549,'2005-08-02 05:06:33',1,'2006-02-15 21:30:53'),(10282,'2005-08-01 03:29:10',617,472,'2005-08-07 06:16:10',1,'2006-02-15 21:30:53'),(10283,'2005-08-01 03:29:45',4237,462,'2005-08-07 04:19:45',1,'2006-02-15 21:30:53'),(10284,'2005-08-01 03:33:19',2879,20,'2005-08-09 07:58:19',1,'2006-02-15 21:30:53'),(10285,'2005-08-01 03:35:11',4523,167,'2005-08-05 03:55:11',2,'2006-02-15 21:30:53'),(10286,'2005-08-01 03:35:58',498,532,'2005-08-10 05:17:58',2,'2006-02-15 21:30:53'),(10287,'2005-08-01 03:37:01',125,141,'2005-08-05 23:03:01',2,'2006-02-15 21:30:53'),(10288,'2005-08-01 03:38:42',572,63,'2005-08-06 04:34:42',1,'2006-02-15 21:30:53'),(10289,'2005-08-01 03:39:48',3153,566,'2005-08-08 02:56:48',1,'2006-02-15 21:30:53'),(10290,'2005-08-01 03:39:50',4542,364,'2005-08-08 22:29:50',2,'2006-02-15 21:30:53'),(10291,'2005-08-01 03:39:57',2056,420,'2005-08-05 02:05:57',2,'2006-02-15 21:30:53'),(10292,'2005-08-01 03:42:40',2562,340,'2005-08-01 23:36:40',2,'2006-02-15 21:30:53'),(10293,'2005-08-01 03:44:26',1570,258,'2005-08-05 04:16:26',2,'2006-02-15 21:30:53'),(10294,'2005-08-01 03:48:12',528,28,'2005-08-09 01:19:12',2,'2006-02-15 21:30:53'),(10295,'2005-08-01 03:53:49',2355,123,'2005-08-10 03:56:49',1,'2006-02-15 21:30:53'),(10296,'2005-08-01 04:04:37',1958,573,'2005-08-01 23:59:37',1,'2006-02-15 21:30:53'),(10297,'2005-08-01 04:05:04',2795,289,'2005-08-09 06:08:04',1,'2006-02-15 21:30:53'),(10298,'2005-08-01 04:06:03',1383,323,'2005-08-05 05:59:03',2,'2006-02-15 21:30:53'),(10299,'2005-08-01 04:08:04',1125,369,'2005-08-04 08:11:04',1,'2006-02-15 21:30:53'),(10300,'2005-08-01 04:08:11',4334,207,'2005-08-04 00:24:11',1,'2006-02-15 21:30:53'),(10301,'2005-08-01 04:09:37',3072,583,'2005-08-04 23:14:37',2,'2006-02-15 21:30:53'),(10302,'2005-08-01 04:12:08',1043,144,'2005-08-01 22:12:08',2,'2006-02-15 21:30:53'),(10303,'2005-08-01 04:13:33',936,479,'2005-08-06 02:16:33',2,'2006-02-15 21:30:53'),(10304,'2005-08-01 04:14:12',1538,346,'2005-08-07 22:38:12',1,'2006-02-15 21:30:53'),(10305,'2005-08-01 04:16:16',2946,160,'2005-08-07 23:47:16',1,'2006-02-15 21:30:53'),(10306,'2005-08-01 04:19:18',2819,541,'2005-08-09 02:16:18',1,'2006-02-15 21:30:53'),(10307,'2005-08-01 04:21:54',975,332,'2005-08-04 09:24:54',2,'2006-02-15 21:30:53'),(10308,'2005-08-01 04:22:49',588,240,'2005-08-09 04:39:49',2,'2006-02-15 21:30:53'),(10309,'2005-08-01 04:24:18',1505,156,'2005-08-09 08:32:18',2,'2006-02-15 21:30:53'),(10310,'2005-08-01 04:24:47',9,271,'2005-08-04 05:36:47',2,'2006-02-15 21:30:53'),(10311,'2005-08-01 04:27:59',4211,151,'2005-08-02 08:51:59',1,'2006-02-15 21:30:53'),(10312,'2005-08-01 04:29:06',4389,172,'2005-08-08 04:52:06',2,'2006-02-15 21:30:53'),(10313,'2005-08-01 04:29:29',1194,80,'2005-08-04 08:12:29',2,'2006-02-15 21:30:53'),(10314,'2005-08-01 04:31:18',1548,252,'2005-08-06 01:49:18',2,'2006-02-15 21:30:53'),(10315,'2005-08-01 04:34:45',895,258,'2005-08-07 05:27:45',1,'2006-02-15 21:30:53'),(10316,'2005-08-01 04:34:57',1907,469,'2005-08-06 02:34:57',2,'2006-02-15 21:30:53'),(10317,'2005-08-01 04:35:34',110,561,'2005-08-06 02:27:34',2,'2006-02-15 21:30:53'),(10318,'2005-08-01 04:36:53',885,548,'2005-08-04 00:54:53',1,'2006-02-15 21:30:53'),(10319,'2005-08-01 04:37:19',3120,394,'2005-08-05 03:18:19',2,'2006-02-15 21:30:53'),(10320,'2005-08-01 04:39:26',2298,152,'2005-08-08 06:01:26',1,'2006-02-15 21:30:53'),(10321,'2005-08-01 04:40:02',4512,177,'2005-08-03 04:18:02',1,'2006-02-15 21:30:53'),(10322,'2005-08-01 04:44:13',1543,535,'2005-08-08 00:20:13',2,'2006-02-15 21:30:53'),(10323,'2005-08-01 04:44:58',3539,577,'2005-08-06 07:56:58',1,'2006-02-15 21:30:53'),(10324,'2005-08-01 04:49:06',523,25,'2005-08-09 08:04:06',2,'2006-02-15 21:30:53'),(10325,'2005-08-01 04:52:12',2749,258,'2005-08-08 09:31:12',1,'2006-02-15 21:30:53'),(10326,'2005-08-01 04:55:34',3856,325,'2005-08-02 05:18:34',1,'2006-02-15 21:30:53'),(10327,'2005-08-01 04:55:35',328,382,'2005-08-07 08:17:35',2,'2006-02-15 21:30:53'),(10328,'2005-08-01 04:56:10',1191,85,'2005-08-01 23:22:10',2,'2006-02-15 21:30:53'),(10329,'2005-08-01 04:56:13',2289,302,'2005-08-03 03:54:13',1,'2006-02-15 21:30:53'),(10330,'2005-08-01 04:57:04',1580,7,'2005-08-07 23:00:04',2,'2006-02-15 21:30:53'),(10331,'2005-08-01 04:57:14',4152,575,'2005-08-07 06:46:14',1,'2006-02-15 21:30:53'),(10332,'2005-08-01 04:57:32',642,258,'2005-08-10 02:42:32',2,'2006-02-15 21:30:53'),(10333,'2005-08-01 04:58:32',3955,499,'2005-08-04 00:51:32',2,'2006-02-15 21:30:53'),(10334,'2005-08-01 04:58:42',3387,445,'2005-08-09 02:00:42',1,'2006-02-15 21:30:53'),(10335,'2005-08-01 04:59:30',323,33,'2005-08-05 02:26:30',1,'2006-02-15 21:30:53'),(10336,'2005-08-01 04:59:53',1091,370,'2005-08-03 08:05:53',2,'2006-02-15 21:30:53'),(10337,'2005-08-01 05:01:46',307,451,'2005-08-10 02:41:46',1,'2006-02-15 21:30:53'),(10338,'2005-08-01 05:03:03',1295,339,'2005-08-09 05:13:03',2,'2006-02-15 21:30:53'),(10339,'2005-08-01 05:05:50',615,363,'2005-08-10 07:15:50',2,'2006-02-15 21:30:53'),(10340,'2005-08-01 05:07:03',3608,568,'2005-08-06 01:03:03',1,'2006-02-15 21:30:53'),(10341,'2005-08-01 05:10:02',3304,445,'2005-08-07 11:01:02',1,'2006-02-15 21:30:53'),(10342,'2005-08-01 05:11:11',332,140,'2005-08-10 00:27:11',1,'2006-02-15 21:30:53'),(10343,'2005-08-01 05:15:47',2627,267,'2005-08-02 04:48:47',2,'2006-02-15 21:30:53'),(10344,'2005-08-01 05:18:23',3673,367,'2005-08-06 05:20:23',1,'2006-02-15 21:30:53'),(10345,'2005-08-01 05:18:56',3985,42,'2005-08-04 01:34:56',2,'2006-02-15 21:30:53'),(10346,'2005-08-01 05:19:23',4192,476,'2005-08-06 01:00:23',1,'2006-02-15 21:30:53'),(10347,'2005-08-01 05:20:03',953,574,'2005-08-04 10:03:03',1,'2006-02-15 21:30:53'),(10348,'2005-08-01 05:23:00',2076,14,'2005-08-04 01:12:00',2,'2006-02-15 21:30:53'),(10349,'2005-08-01 05:27:13',114,295,'2005-08-08 10:15:13',1,'2006-02-15 21:30:53'),(10350,'2005-08-01 05:30:05',2067,78,'2005-08-05 09:59:05',1,'2006-02-15 21:30:53'),(10351,'2005-08-01 05:32:13',3725,173,'2005-08-08 09:48:13',1,'2006-02-15 21:30:53'),(10352,'2005-08-01 05:44:36',1288,564,'2005-08-05 07:15:36',2,'2006-02-15 21:30:53'),(10353,'2005-08-01 05:46:33',1446,535,'2005-08-08 09:14:33',1,'2006-02-15 21:30:53'),(10354,'2005-08-01 05:47:10',1680,416,'2005-08-06 09:04:10',1,'2006-02-15 21:30:53'),(10355,'2005-08-01 05:47:37',2158,161,'2005-08-02 09:28:37',2,'2006-02-15 21:30:53'),(10356,'2005-08-01 05:49:17',313,56,'2005-08-10 05:57:17',1,'2006-02-15 21:30:53'),(10357,'2005-08-01 05:49:49',3102,475,'2005-08-04 02:34:49',2,'2006-02-15 21:30:53'),(10358,'2005-08-01 05:50:07',3039,517,'2005-08-03 08:18:07',1,'2006-02-15 21:30:53'),(10359,'2005-08-01 05:52:21',259,369,'2005-08-06 05:52:21',2,'2006-02-15 21:30:53'),(10360,'2005-08-01 05:52:53',1129,443,'2005-08-05 10:55:53',1,'2006-02-15 21:30:53'),(10361,'2005-08-01 05:53:49',318,529,'2005-08-10 00:42:49',2,'2006-02-15 21:30:53'),(10362,'2005-08-01 05:55:13',72,181,'2005-08-10 10:23:13',2,'2006-02-15 21:30:53'),(10363,'2005-08-01 06:01:52',320,174,'2005-08-05 03:56:52',1,'2006-02-15 21:30:53'),(10364,'2005-08-01 06:06:49',1842,317,'2005-08-09 06:05:49',2,'2006-02-15 21:30:53'),(10365,'2005-08-01 06:08:44',4032,442,'2005-08-06 02:07:44',1,'2006-02-15 21:30:53'),(10366,'2005-08-01 06:09:37',2654,119,'2005-08-05 03:19:37',1,'2006-02-15 21:30:53'),(10367,'2005-08-01 06:12:19',3408,242,'2005-08-04 12:11:19',2,'2006-02-15 21:30:53'),(10368,'2005-08-01 06:13:38',3535,593,'2005-08-08 04:40:38',2,'2006-02-15 21:30:53'),(10369,'2005-08-01 06:13:44',2534,424,'2005-08-07 09:46:44',1,'2006-02-15 21:30:53'),(10370,'2005-08-01 06:18:04',4358,546,'2005-08-05 01:41:04',2,'2006-02-15 21:30:53'),(10371,'2005-08-01 06:20:29',923,327,'2005-08-04 00:31:29',2,'2006-02-15 21:30:53'),(10372,'2005-08-01 06:23:48',635,419,'2005-08-06 03:47:48',1,'2006-02-15 21:30:53'),(10373,'2005-08-01 06:24:26',1754,588,'2005-08-02 12:07:26',1,'2006-02-15 21:30:53'),(10374,'2005-08-01 06:25:27',4351,307,'2005-08-07 05:44:27',2,'2006-02-15 21:30:53'),(10375,'2005-08-01 06:26:22',857,202,'2005-08-06 02:51:22',2,'2006-02-15 21:30:53'),(10376,'2005-08-01 06:27:13',4194,474,'2005-08-07 06:11:13',2,'2006-02-15 21:30:53'),(10377,'2005-08-01 06:28:28',2401,559,'2005-08-10 05:45:28',2,'2006-02-15 21:30:53'),(10378,'2005-08-01 06:30:04',4110,113,'2005-08-06 09:10:04',1,'2006-02-15 21:30:53'),(10379,'2005-08-01 06:34:29',3103,141,'2005-08-06 07:49:29',1,'2006-02-15 21:30:53'),(10380,'2005-08-01 06:34:36',2225,533,'2005-08-02 09:08:36',1,'2006-02-15 21:30:53'),(10381,'2005-08-01 06:36:37',522,412,'2005-08-05 11:17:37',1,'2006-02-15 21:30:53'),(10382,'2005-08-01 06:36:45',4455,242,'2005-08-02 06:06:45',1,'2006-02-15 21:30:53'),(10383,'2005-08-01 06:37:16',4166,592,'2005-08-03 07:36:16',2,'2006-02-15 21:30:53'),(10384,'2005-08-01 06:39:14',2622,366,'2005-08-02 03:06:14',1,'2006-02-15 21:30:53'),(10385,'2005-08-01 06:39:55',778,179,'2005-08-06 02:16:55',1,'2006-02-15 21:30:53'),(10386,'2005-08-01 06:42:20',1568,26,'2005-08-07 06:12:20',2,'2006-02-15 21:30:53'),(10387,'2005-08-01 06:42:31',1651,87,'2005-08-08 07:44:31',1,'2006-02-15 21:30:53'),(10388,'2005-08-01 06:42:44',3180,99,'2005-08-09 11:43:44',2,'2006-02-15 21:30:53'),(10389,'2005-08-01 06:46:43',3534,346,'2005-08-08 07:07:43',2,'2006-02-15 21:30:53'),(10390,'2005-08-01 06:46:48',1489,502,'2005-08-09 02:55:48',2,'2006-02-15 21:30:53'),(10391,'2005-08-01 06:49:05',2203,357,'2005-08-04 01:51:05',2,'2006-02-15 21:30:53'),(10392,'2005-08-01 06:50:26',3017,12,'2005-08-10 10:52:26',1,'2006-02-15 21:30:53'),(10393,'2005-08-01 06:52:50',808,258,'2005-08-05 08:45:50',1,'2006-02-15 21:30:53'),(10394,'2005-08-01 06:58:17',1655,128,'2005-08-05 02:09:17',1,'2006-02-15 21:30:53'),(10395,'2005-08-01 07:08:22',279,129,'2005-08-05 08:00:22',2,'2006-02-15 21:30:53'),(10396,'2005-08-01 07:08:46',2982,284,'2005-08-08 03:47:46',1,'2006-02-15 21:30:53'),(10397,'2005-08-01 07:11:27',4168,504,'2005-08-03 07:51:27',1,'2006-02-15 21:30:53'),(10398,'2005-08-01 07:11:49',4306,174,'2005-08-04 05:54:49',1,'2006-02-15 21:30:53'),(10399,'2005-08-01 07:13:39',2515,204,'2005-08-10 06:56:39',1,'2006-02-15 21:30:53'),(10400,'2005-08-01 07:18:24',3897,132,'2005-08-10 08:38:24',1,'2006-02-15 21:30:53'),(10401,'2005-08-01 07:27:09',1560,564,'2005-08-02 01:38:09',1,'2006-02-15 21:30:53'),(10402,'2005-08-01 07:27:19',274,410,'2005-08-04 12:30:19',1,'2006-02-15 21:30:53'),(10403,'2005-08-01 07:30:45',1968,494,'2005-08-03 03:03:45',2,'2006-02-15 21:30:53'),(10404,'2005-08-01 07:31:25',2580,253,'2005-08-07 09:23:25',1,'2006-02-15 21:30:53'),(10405,'2005-08-01 07:35:25',3641,463,'2005-08-05 05:38:25',2,'2006-02-15 21:30:53'),(10406,'2005-08-01 07:37:05',2614,391,'2005-08-02 06:11:05',1,'2006-02-15 21:30:53'),(10407,'2005-08-01 07:38:07',543,101,'2005-08-02 05:38:07',2,'2006-02-15 21:30:53'),(10408,'2005-08-01 07:42:10',4144,334,'2005-08-09 02:29:10',2,'2006-02-15 21:30:53'),(10409,'2005-08-01 07:49:15',2804,449,'2005-08-02 13:42:15',2,'2006-02-15 21:30:53'),(10410,'2005-08-01 07:53:29',3901,247,'2005-08-10 08:56:29',1,'2006-02-15 21:30:53'),(10411,'2005-08-01 07:56:32',1946,522,'2005-08-10 04:58:32',2,'2006-02-15 21:30:53'),(10412,'2005-08-01 07:57:16',1555,325,'2005-08-04 11:44:16',2,'2006-02-15 21:30:53'),(10413,'2005-08-01 07:59:39',1018,376,'2005-08-08 03:55:39',1,'2006-02-15 21:30:53'),(10414,'2005-08-01 08:03:55',1271,361,'2005-08-04 08:44:55',2,'2006-02-15 21:30:53'),(10415,'2005-08-01 08:05:59',2597,591,'2005-08-04 13:46:59',1,'2006-02-15 21:30:53'),(10416,'2005-08-01 08:08:39',2629,449,'2005-08-10 09:26:39',2,'2006-02-15 21:30:53'),(10417,'2005-08-01 08:10:36',3675,427,'2005-08-02 03:42:36',2,'2006-02-15 21:30:53'),(10418,'2005-08-01 08:11:07',1692,248,'2005-08-04 11:12:07',2,'2006-02-15 21:30:53'),(10419,'2005-08-01 08:13:22',415,66,'2005-08-06 04:45:22',2,'2006-02-15 21:30:53'),(10420,'2005-08-01 08:13:53',3490,354,'2005-08-06 08:05:53',2,'2006-02-15 21:30:53'),(10421,'2005-08-01 08:14:10',925,262,'2005-08-03 05:56:10',2,'2006-02-15 21:30:53'),(10422,'2005-08-01 08:17:11',37,166,'2005-08-10 10:08:11',2,'2006-02-15 21:30:53'),(10423,'2005-08-01 08:19:53',739,7,'2005-08-08 10:25:53',1,'2006-02-15 21:30:53'),(10424,'2005-08-01 08:22:54',1921,88,'2005-08-06 13:44:54',1,'2006-02-15 21:30:53'),(10425,'2005-08-01 08:23:25',322,447,'2005-08-05 04:29:25',1,'2006-02-15 21:30:53'),(10426,'2005-08-01 08:26:08',1325,305,'2005-08-09 04:09:08',1,'2006-02-15 21:30:53'),(10427,'2005-08-01 08:30:11',2978,356,'2005-08-07 06:18:11',2,'2006-02-15 21:30:53'),(10428,'2005-08-01 08:30:11',4245,46,'2005-08-02 09:30:11',2,'2006-02-15 21:30:53'),(10429,'2005-08-01 08:34:18',3894,511,'2005-08-10 12:38:18',1,'2006-02-15 21:30:53'),(10430,'2005-08-01 08:37:06',1150,471,'2005-08-03 07:25:06',1,'2006-02-15 21:30:53'),(10431,'2005-08-01 08:41:54',1074,138,'2005-08-07 09:44:54',2,'2006-02-15 21:30:53'),(10432,'2005-08-01 08:43:21',4238,450,'2005-08-08 13:09:21',2,'2006-02-15 21:30:53'),(10433,'2005-08-01 08:45:56',1508,517,'2005-08-05 09:46:56',2,'2006-02-15 21:30:53'),(10434,'2005-08-01 08:47:00',4073,73,'2005-08-06 08:34:00',1,'2006-02-15 21:30:53'),(10435,'2005-08-01 08:50:51',1934,392,'2005-08-08 12:23:51',1,'2006-02-15 21:30:53'),(10436,'2005-08-01 08:50:59',4026,455,'2005-08-04 05:23:59',1,'2006-02-15 21:30:53'),(10437,'2005-08-01 08:51:04',14,1,'2005-08-10 12:12:04',1,'2006-02-15 21:30:53'),(10438,'2005-08-01 08:53:04',4217,316,'2005-08-09 06:39:04',2,'2006-02-15 21:30:53'),(10439,'2005-08-01 08:54:26',2711,332,'2005-08-08 14:04:26',1,'2006-02-15 21:30:53'),(10440,'2005-08-01 08:54:32',842,299,'2005-08-02 10:59:32',2,'2006-02-15 21:30:53'),(10441,'2005-08-01 08:55:56',4122,176,'2005-08-03 10:26:56',2,'2006-02-15 21:30:53'),(10442,'2005-08-01 08:58:08',4570,40,'2005-08-05 09:07:08',2,'2006-02-15 21:30:53'),(10443,'2005-08-01 09:01:04',1965,403,'2005-08-04 09:07:04',2,'2006-02-15 21:30:53'),(10444,'2005-08-01 09:01:40',3242,106,'2005-08-09 11:31:40',1,'2006-02-15 21:30:53'),(10445,'2005-08-01 09:02:15',3582,211,'2005-08-08 10:26:15',2,'2006-02-15 21:30:53'),(10446,'2005-08-01 09:02:17',2671,95,'2005-08-04 10:00:17',2,'2006-02-15 21:30:53'),(10447,'2005-08-01 09:04:58',1198,241,'2005-08-08 06:24:58',1,'2006-02-15 21:30:53'),(10448,'2005-08-01 09:09:31',2254,311,'2005-08-02 09:55:31',2,'2006-02-15 21:30:53'),(10449,'2005-08-01 09:09:59',1395,213,'2005-08-05 11:25:59',1,'2006-02-15 21:30:53'),(10450,'2005-08-01 09:10:03',234,380,'2005-08-08 12:34:03',1,'2006-02-15 21:30:53'),(10451,'2005-08-01 09:11:25',2435,9,'2005-08-03 12:37:25',2,'2006-02-15 21:30:53'),(10452,'2005-08-01 09:11:36',1973,442,'2005-08-04 13:28:36',2,'2006-02-15 21:30:53'),(10453,'2005-08-01 09:13:27',1531,188,'2005-08-08 11:34:27',2,'2006-02-15 21:30:53'),(10454,'2005-08-01 09:14:00',397,9,'2005-08-04 04:52:00',2,'2006-02-15 21:30:53'),(10455,'2005-08-01 09:15:00',4197,99,'2005-08-05 13:35:00',1,'2006-02-15 21:30:53'),(10456,'2005-08-01 09:17:21',4339,81,'2005-08-06 10:30:21',1,'2006-02-15 21:30:53'),(10457,'2005-08-01 09:17:34',3052,121,'2005-08-06 07:28:34',2,'2006-02-15 21:30:53'),(10458,'2005-08-01 09:19:48',1500,309,'2005-08-02 10:16:48',1,'2006-02-15 21:30:53'),(10459,'2005-08-01 09:20:09',201,131,'2005-08-03 11:36:09',1,'2006-02-15 21:30:53'),(10460,'2005-08-01 09:31:00',4504,197,'2005-08-09 09:28:00',1,'2006-02-15 21:30:53'),(10461,'2005-08-01 09:32:53',3212,270,'2005-08-09 10:19:53',1,'2006-02-15 21:30:53'),(10462,'2005-08-01 09:38:28',4526,193,'2005-08-02 09:52:28',2,'2006-02-15 21:30:53'),(10463,'2005-08-01 09:39:43',1301,291,'2005-08-10 03:42:43',1,'2006-02-15 21:30:53'),(10464,'2005-08-01 09:43:14',464,427,'2005-08-06 09:01:14',1,'2006-02-15 21:30:53'),(10465,'2005-08-01 09:45:25',4384,534,'2005-08-10 09:08:25',2,'2006-02-15 21:30:53'),(10466,'2005-08-01 09:45:26',138,2,'2005-08-06 06:28:26',1,'2006-02-15 21:30:53'),(10467,'2005-08-01 09:45:58',3773,412,'2005-08-09 10:17:58',2,'2006-02-15 21:30:53'),(10468,'2005-08-01 09:48:29',2115,129,'2005-08-05 09:58:29',2,'2006-02-15 21:30:53'),(10469,'2005-08-01 09:51:11',3054,466,'2005-08-05 06:53:11',2,'2006-02-15 21:30:53'),(10470,'2005-08-01 09:52:26',82,523,'2005-08-05 06:52:26',1,'2006-02-15 21:30:53'),(10471,'2005-08-01 09:52:37',1684,135,'2005-08-07 09:40:37',2,'2006-02-15 21:30:53'),(10472,'2005-08-01 09:54:41',506,405,'2005-08-04 13:31:41',1,'2006-02-15 21:30:53'),(10473,'2005-08-01 09:56:24',3034,329,'2005-08-10 12:36:24',2,'2006-02-15 21:30:53'),(10474,'2005-08-01 10:01:42',4482,488,'2005-08-08 12:32:42',1,'2006-02-15 21:30:53'),(10475,'2005-08-01 10:03:17',2931,115,'2005-08-10 15:50:17',2,'2006-02-15 21:30:53'),(10476,'2005-08-01 10:03:20',1993,263,'2005-08-10 06:52:20',1,'2006-02-15 21:30:53'),(10477,'2005-08-01 10:04:17',235,506,'2005-08-06 11:32:17',2,'2006-02-15 21:30:53'),(10478,'2005-08-01 10:09:06',3885,417,'2005-08-06 05:05:06',1,'2006-02-15 21:30:53'),(10479,'2005-08-01 10:11:25',4580,275,'2005-08-06 04:52:25',1,'2006-02-15 21:30:53'),(10480,'2005-08-01 10:13:41',553,560,'2005-08-03 10:27:41',1,'2006-02-15 21:30:53'),(10481,'2005-08-01 10:17:26',229,170,'2005-08-09 08:50:26',1,'2006-02-15 21:30:53'),(10482,'2005-08-01 10:17:47',48,358,'2005-08-02 15:04:47',2,'2006-02-15 21:30:53'),(10483,'2005-08-01 10:19:45',1521,129,'2005-08-04 09:29:45',1,'2006-02-15 21:30:53'),(10484,'2005-08-01 10:19:53',1908,400,'2005-08-03 05:36:53',1,'2006-02-15 21:30:53'),(10485,'2005-08-01 10:20:34',29,50,'2005-08-09 09:20:34',1,'2006-02-15 21:30:53'),(10486,'2005-08-01 10:23:43',2454,527,'2005-08-05 07:11:43',2,'2006-02-15 21:30:53'),(10487,'2005-08-01 10:26:34',1121,577,'2005-08-07 16:11:34',1,'2006-02-15 21:30:53'),(10488,'2005-08-01 10:27:27',297,423,'2005-08-02 11:05:27',2,'2006-02-15 21:30:53'),(10489,'2005-08-01 10:27:42',4067,54,'2005-08-07 12:56:42',1,'2006-02-15 21:30:53'),(10490,'2005-08-01 10:37:11',4365,329,'2005-08-03 10:01:11',2,'2006-02-15 21:30:53'),(10491,'2005-08-01 10:38:27',3091,24,'2005-08-04 04:55:27',2,'2006-02-15 21:30:53'),(10492,'2005-08-01 10:42:28',1669,334,'2005-08-02 07:05:28',1,'2006-02-15 21:30:53'),(10493,'2005-08-01 10:43:12',2375,285,'2005-08-07 08:13:12',2,'2006-02-15 21:30:53'),(10494,'2005-08-01 10:45:21',847,188,'2005-08-02 12:34:21',1,'2006-02-15 21:30:53'),(10495,'2005-08-01 10:45:51',2232,41,'2005-08-06 08:11:51',1,'2006-02-15 21:30:53'),(10496,'2005-08-01 10:53:16',411,525,'2005-08-08 10:34:16',2,'2006-02-15 21:30:53'),(10497,'2005-08-01 10:55:59',1060,499,'2005-08-07 11:15:59',1,'2006-02-15 21:30:53'),(10498,'2005-08-01 10:56:48',2672,355,'2005-08-03 15:46:48',2,'2006-02-15 21:30:53'),(10499,'2005-08-01 11:00:20',3293,459,'2005-08-10 11:52:20',2,'2006-02-15 21:30:53'),(10500,'2005-08-01 11:01:01',469,477,'2005-08-06 08:59:01',2,'2006-02-15 21:30:53'),(10501,'2005-08-01 11:04:46',1792,351,'2005-08-02 12:10:46',2,'2006-02-15 21:30:53'),(10502,'2005-08-01 11:06:39',3193,357,'2005-08-05 07:11:39',1,'2006-02-15 21:30:53'),(10503,'2005-08-01 11:07:44',1823,357,'2005-08-08 08:22:44',1,'2006-02-15 21:30:53'),(10504,'2005-08-01 11:10:55',3345,530,'2005-08-10 10:16:55',1,'2006-02-15 21:30:53'),(10505,'2005-08-01 11:13:59',2977,426,'2005-08-05 07:20:59',2,'2006-02-15 21:30:53'),(10506,'2005-08-01 11:16:05',1171,216,'2005-08-03 05:37:05',2,'2006-02-15 21:30:53'),(10507,'2005-08-01 11:22:20',367,45,'2005-08-04 13:18:20',2,'2006-02-15 21:30:53'),(10508,'2005-08-01 11:23:27',3890,431,'2005-08-02 10:17:27',1,'2006-02-15 21:30:53'),(10509,'2005-08-01 11:25:28',96,504,'2005-08-10 09:19:28',2,'2006-02-15 21:30:53'),(10510,'2005-08-01 11:28:30',410,259,'2005-08-07 11:37:30',1,'2006-02-15 21:30:53'),(10511,'2005-08-01 11:32:16',3874,487,'2005-08-04 09:38:16',1,'2006-02-15 21:30:53'),(10512,'2005-08-01 11:36:19',3294,438,'2005-08-09 06:52:19',2,'2006-02-15 21:30:53'),(10513,'2005-08-01 11:37:34',4057,105,'2005-08-02 17:15:34',2,'2006-02-15 21:30:53'),(10514,'2005-08-01 11:39:26',1512,7,'2005-08-03 07:53:26',2,'2006-02-15 21:30:53'),(10515,'2005-08-01 11:41:33',874,383,'2005-08-08 06:23:33',2,'2006-02-15 21:30:53'),(10516,'2005-08-01 11:41:55',3924,449,'2005-08-08 17:16:55',1,'2006-02-15 21:30:53'),(10517,'2005-08-01 11:41:57',2299,199,'2005-08-05 06:14:57',1,'2006-02-15 21:30:53'),(10518,'2005-08-01 11:44:08',4444,556,'2005-08-07 07:58:08',2,'2006-02-15 21:30:53'),(10519,'2005-08-01 11:44:13',1967,456,'2005-08-09 16:57:13',1,'2006-02-15 21:30:53'),(10520,'2005-08-01 11:45:58',4396,543,'2005-08-06 17:28:58',2,'2006-02-15 21:30:53'),(10521,'2005-08-01 11:46:17',662,346,'2005-08-05 11:06:17',2,'2006-02-15 21:30:53'),(10522,'2005-08-01 11:48:51',4159,254,'2005-08-05 12:40:51',1,'2006-02-15 21:30:53'),(10523,'2005-08-01 11:52:32',2408,34,'2005-08-02 10:47:32',1,'2006-02-15 21:30:53'),(10524,'2005-08-01 11:53:12',4116,38,'2005-08-08 10:40:12',2,'2006-02-15 21:30:53'),(10525,'2005-08-01 11:53:17',3811,36,'2005-08-07 07:24:17',1,'2006-02-15 21:30:53'),(10526,'2005-08-01 11:55:33',27,14,'2005-08-08 16:42:33',1,'2006-02-15 21:30:53'),(10527,'2005-08-01 11:55:54',4530,431,'2005-08-05 15:56:54',2,'2006-02-15 21:30:53'),(10528,'2005-08-01 11:56:22',4401,564,'2005-08-07 07:13:22',1,'2006-02-15 21:30:53'),(10529,'2005-08-01 12:00:02',851,444,'2005-08-08 16:18:02',1,'2006-02-15 21:30:53'),(10530,'2005-08-01 12:01:17',3216,520,'2005-08-06 09:55:17',2,'2006-02-15 21:30:53'),(10531,'2005-08-01 12:06:30',3846,459,'2005-08-04 10:23:30',2,'2006-02-15 21:30:53'),(10532,'2005-08-01 12:06:35',746,191,'2005-08-07 16:04:35',2,'2006-02-15 21:30:53'),(10533,'2005-08-01 12:14:16',1924,593,'2005-08-09 17:13:16',2,'2006-02-15 21:30:53'),(10534,'2005-08-01 12:15:11',4354,397,'2005-08-04 17:06:11',1,'2006-02-15 21:30:53'),(10535,'2005-08-01 12:21:13',1838,284,'2005-08-09 08:58:13',1,'2006-02-15 21:30:53'),(10536,'2005-08-01 12:21:53',1251,86,'2005-08-04 13:08:53',2,'2006-02-15 21:30:53'),(10537,'2005-08-01 12:22:28',2140,418,'2005-08-08 07:27:28',1,'2006-02-15 21:30:53'),(10538,'2005-08-01 12:22:41',686,37,'2005-08-02 10:31:41',2,'2006-02-15 21:30:53'),(10539,'2005-08-01 12:23:00',3341,232,'2005-08-07 10:25:00',2,'2006-02-15 21:30:53'),(10540,'2005-08-01 12:24:42',4121,84,'2005-08-03 08:39:42',2,'2006-02-15 21:30:53'),(10541,'2005-08-01 12:24:54',1413,234,'2005-08-03 16:18:54',1,'2006-02-15 21:30:53'),(10542,'2005-08-01 12:32:23',1102,465,'2005-08-08 16:26:23',1,'2006-02-15 21:30:53'),(10543,'2005-08-01 12:36:09',624,29,'2005-08-07 07:42:09',1,'2006-02-15 21:30:53'),(10544,'2005-08-01 12:36:21',3195,589,'2005-08-07 12:25:21',2,'2006-02-15 21:30:53'),(10545,'2005-08-01 12:37:46',4230,425,'2005-08-04 16:02:46',2,'2006-02-15 21:30:53'),(10546,'2005-08-01 12:44:17',1589,362,'2005-08-06 16:26:17',2,'2006-02-15 21:30:53'),(10547,'2005-08-01 12:44:17',1707,403,'2005-08-08 06:53:17',1,'2006-02-15 21:30:53'),(10548,'2005-08-01 12:44:32',1914,85,'2005-08-07 09:17:32',1,'2006-02-15 21:30:53'),(10549,'2005-08-01 12:46:39',3719,61,'2005-08-06 17:17:39',1,'2006-02-15 21:30:53'),(10550,'2005-08-01 12:46:52',1980,129,'2005-08-05 16:48:52',2,'2006-02-15 21:30:53'),(10551,'2005-08-01 12:48:55',2974,294,'2005-08-10 16:11:55',1,'2006-02-15 21:30:53'),(10552,'2005-08-01 12:49:44',4263,119,'2005-08-04 16:20:44',2,'2006-02-15 21:30:53'),(10553,'2005-08-01 12:54:06',2768,415,'2005-08-06 15:27:06',1,'2006-02-15 21:30:53'),(10554,'2005-08-01 12:56:19',3220,209,'2005-08-03 09:44:19',2,'2006-02-15 21:30:53'),(10555,'2005-08-01 12:56:38',377,487,'2005-08-10 18:19:38',1,'2006-02-15 21:30:53'),(10556,'2005-08-01 12:58:42',144,117,'2005-08-03 07:18:42',2,'2006-02-15 21:30:53'),(10557,'2005-08-01 12:59:24',240,385,'2005-08-04 17:08:24',2,'2006-02-15 21:30:53'),(10558,'2005-08-01 13:00:20',4399,117,'2005-08-05 16:31:20',1,'2006-02-15 21:30:53'),(10559,'2005-08-01 13:02:58',2861,174,'2005-08-09 10:03:58',2,'2006-02-15 21:30:53'),(10560,'2005-08-01 13:04:57',1534,427,'2005-08-05 18:25:57',2,'2006-02-15 21:30:53'),(10561,'2005-08-01 13:05:35',2195,8,'2005-08-04 08:34:35',2,'2006-02-15 21:30:53'),(10562,'2005-08-01 13:05:52',1947,178,'2005-08-02 17:05:52',1,'2006-02-15 21:30:53'),(10563,'2005-08-01 13:06:03',1885,214,'2005-08-09 08:39:03',2,'2006-02-15 21:30:53'),(10564,'2005-08-01 13:07:34',4469,387,'2005-08-06 15:14:34',2,'2006-02-15 21:30:53'),(10565,'2005-08-01 13:08:27',347,165,'2005-08-02 10:30:27',1,'2006-02-15 21:30:53'),(10566,'2005-08-01 13:12:11',3988,269,'2005-08-05 11:16:11',2,'2006-02-15 21:30:53'),(10567,'2005-08-01 13:16:01',2744,212,'2005-08-05 14:59:01',1,'2006-02-15 21:30:53'),(10568,'2005-08-01 13:17:28',3009,130,'2005-08-08 17:04:28',1,'2006-02-15 21:30:53'),(10569,'2005-08-01 13:18:23',611,179,'2005-08-10 13:33:23',1,'2006-02-15 21:30:53'),(10570,'2005-08-01 13:23:06',369,21,'2005-08-05 15:30:06',2,'2006-02-15 21:30:53'),(10571,'2005-08-01 13:25:30',3660,308,'2005-08-02 16:43:30',2,'2006-02-15 21:30:53'),(10572,'2005-08-01 13:26:53',1239,386,'2005-08-07 18:47:53',2,'2006-02-15 21:30:53'),(10573,'2005-08-01 13:27:24',4252,585,'2005-08-04 15:09:24',2,'2006-02-15 21:30:53'),(10574,'2005-08-01 13:36:51',679,287,'2005-08-10 13:25:51',2,'2006-02-15 21:30:53'),(10575,'2005-08-01 13:41:41',4447,251,'2005-08-08 11:30:41',1,'2006-02-15 21:30:53'),(10576,'2005-08-01 13:46:02',1876,180,'2005-08-05 10:19:02',1,'2006-02-15 21:30:53'),(10577,'2005-08-01 13:46:38',2240,428,'2005-08-06 11:35:38',2,'2006-02-15 21:30:53'),(10578,'2005-08-01 13:48:02',3704,113,'2005-08-07 13:40:02',1,'2006-02-15 21:30:53'),(10579,'2005-08-01 13:48:22',4068,270,'2005-08-07 11:51:22',1,'2006-02-15 21:30:53'),(10580,'2005-08-01 13:51:14',590,234,'2005-08-08 11:49:14',2,'2006-02-15 21:30:53'),(10581,'2005-08-01 13:52:30',2801,217,'2005-08-10 19:11:30',1,'2006-02-15 21:30:53'),(10582,'2005-08-01 13:54:22',2536,233,'2005-08-05 16:46:22',2,'2006-02-15 21:30:53'),(10583,'2005-08-01 13:54:35',704,125,'2005-08-03 18:21:35',1,'2006-02-15 21:30:53'),(10584,'2005-08-01 13:58:47',715,86,'2005-08-06 13:38:47',2,'2006-02-15 21:30:53'),(10585,'2005-08-01 14:00:42',2670,228,'2005-08-09 11:42:42',2,'2006-02-15 21:30:53'),(10586,'2005-08-01 14:00:59',3306,583,'2005-08-06 10:00:59',2,'2006-02-15 21:30:53'),(10587,'2005-08-01 14:03:38',3000,521,'2005-08-08 19:59:38',2,'2006-02-15 21:30:53'),(10588,'2005-08-01 14:10:21',2384,49,'2005-08-03 13:47:21',2,'2006-02-15 21:30:53'),(10589,'2005-08-01 14:11:09',4280,375,'2005-08-09 09:28:09',2,'2006-02-15 21:30:53'),(10590,'2005-08-01 14:11:53',740,78,'2005-08-04 20:04:53',1,'2006-02-15 21:30:53'),(10591,'2005-08-01 14:12:29',3360,52,'2005-08-04 08:46:29',2,'2006-02-15 21:30:53'),(10592,'2005-08-01 14:13:00',829,265,'2005-08-09 13:03:00',2,'2006-02-15 21:30:53'),(10593,'2005-08-01 14:13:19',1886,144,'2005-08-06 08:48:19',2,'2006-02-15 21:30:53'),(10594,'2005-08-01 14:14:59',1826,53,'2005-08-07 10:48:59',2,'2006-02-15 21:30:53'),(10595,'2005-08-01 14:16:28',966,137,'2005-08-03 10:37:28',1,'2006-02-15 21:30:53'),(10596,'2005-08-01 14:18:57',803,112,'2005-08-07 14:59:57',2,'2006-02-15 21:30:53'),(10597,'2005-08-01 14:19:48',3292,3,'2005-08-08 20:01:48',1,'2006-02-15 21:30:53'),(10598,'2005-08-01 14:23:36',2341,397,'2005-08-10 14:07:36',2,'2006-02-15 21:30:53'),(10599,'2005-08-01 14:23:58',2422,271,'2005-08-06 10:45:58',2,'2006-02-15 21:30:53'),(10600,'2005-08-01 14:25:21',3900,294,'2005-08-06 18:00:21',1,'2006-02-15 21:30:53'),(10601,'2005-08-01 14:25:40',2843,420,'2005-08-10 09:07:40',1,'2006-02-15 21:30:53'),(10602,'2005-08-01 14:30:23',1506,111,'2005-08-07 15:20:23',1,'2006-02-15 21:30:53'),(10603,'2005-08-01 14:30:35',4024,394,'2005-08-05 11:13:35',2,'2006-02-15 21:30:53'),(10604,'2005-08-01 14:35:08',2833,250,'2005-08-08 10:19:08',2,'2006-02-15 21:30:53'),(10605,'2005-08-01 14:36:26',680,341,'2005-08-06 12:04:26',2,'2006-02-15 21:30:53'),(10606,'2005-08-01 14:39:15',81,335,'2005-08-08 11:31:15',1,'2006-02-15 21:30:53'),(10607,'2005-08-01 14:44:43',3999,438,'2005-08-02 16:39:43',2,'2006-02-15 21:30:53'),(10608,'2005-08-01 14:48:41',3835,381,'2005-08-04 17:32:41',2,'2006-02-15 21:30:53'),(10609,'2005-08-01 14:48:45',2587,5,'2005-08-04 13:41:45',2,'2006-02-15 21:30:53'),(10610,'2005-08-01 14:49:41',1865,396,'2005-08-03 13:07:41',1,'2006-02-15 21:30:53'),(10611,'2005-08-01 14:53:52',957,135,'2005-08-07 09:15:52',2,'2006-02-15 21:30:53'),(10612,'2005-08-01 14:55:31',287,554,'2005-08-06 19:01:31',1,'2006-02-15 21:30:53'),(10613,'2005-08-01 14:56:14',4357,527,'2005-08-07 09:33:14',1,'2006-02-15 21:30:53'),(10614,'2005-08-01 14:57:00',232,533,'2005-08-10 09:31:00',2,'2006-02-15 21:30:53'),(10615,'2005-08-01 14:58:14',2639,34,'2005-08-02 13:38:14',1,'2006-02-15 21:30:53'),(10616,'2005-08-01 14:59:50',1094,20,'2005-08-07 11:38:50',2,'2006-02-15 21:30:53'),(10617,'2005-08-01 15:05:52',4344,476,'2005-08-09 18:54:52',1,'2006-02-15 21:30:53'),(10618,'2005-08-01 15:06:38',3729,386,'2005-08-06 15:52:38',2,'2006-02-15 21:30:53'),(10619,'2005-08-01 15:07:04',2189,132,'2005-08-07 11:42:04',2,'2006-02-15 21:30:53'),(10620,'2005-08-01 15:09:17',3064,183,'2005-08-09 13:58:17',1,'2006-02-15 21:30:53'),(10621,'2005-08-01 15:10:26',1650,172,'2005-08-04 10:58:26',1,'2006-02-15 21:30:53'),(10622,'2005-08-01 15:12:00',3044,171,'2005-08-08 14:09:00',1,'2006-02-15 21:30:53'),(10623,'2005-08-01 15:22:38',4426,494,'2005-08-03 11:03:38',2,'2006-02-15 21:30:53'),(10624,'2005-08-01 15:27:05',3801,74,'2005-08-05 19:50:05',1,'2006-02-15 21:30:53'),(10625,'2005-08-01 15:27:10',3022,5,'2005-08-02 13:16:10',1,'2006-02-15 21:30:53'),(10626,'2005-08-01 15:32:41',1042,122,'2005-08-05 18:08:41',1,'2006-02-15 21:30:53'),(10627,'2005-08-01 15:33:03',2026,472,'2005-08-02 21:26:03',1,'2006-02-15 21:30:53'),(10628,'2005-08-01 15:33:19',427,285,'2005-08-05 17:27:19',1,'2006-02-15 21:30:53'),(10629,'2005-08-01 15:33:32',997,575,'2005-08-08 12:40:32',2,'2006-02-15 21:30:53'),(10630,'2005-08-01 15:34:46',2335,39,'2005-08-03 10:50:46',1,'2006-02-15 21:30:53'),(10631,'2005-08-01 15:35:14',2712,304,'2005-08-03 10:48:14',1,'2006-02-15 21:30:53'),(10632,'2005-08-01 15:36:56',1290,406,'2005-08-05 17:32:56',1,'2006-02-15 21:30:53'),(10633,'2005-08-01 15:37:17',3125,475,'2005-08-10 14:30:17',2,'2006-02-15 21:30:53'),(10634,'2005-08-01 15:37:48',445,592,'2005-08-02 12:11:48',2,'2006-02-15 21:30:53'),(10635,'2005-08-01 15:37:58',547,52,'2005-08-07 11:15:58',2,'2006-02-15 21:30:53'),(10636,'2005-08-01 15:40:35',621,385,'2005-08-05 18:46:35',1,'2006-02-15 21:30:53'),(10637,'2005-08-01 15:44:09',1243,161,'2005-08-04 14:42:09',1,'2006-02-15 21:30:53'),(10638,'2005-08-01 15:44:20',2239,132,'2005-08-08 16:05:20',2,'2006-02-15 21:30:53'),(10639,'2005-08-01 15:44:43',1015,39,'2005-08-10 13:51:43',1,'2006-02-15 21:30:53'),(10640,'2005-08-01 15:44:51',3020,375,'2005-08-06 15:52:51',1,'2006-02-15 21:30:53'),(10641,'2005-08-01 15:44:57',972,285,'2005-08-04 18:15:57',2,'2006-02-15 21:30:53'),(10642,'2005-08-01 15:45:11',2573,294,'2005-08-02 20:13:11',1,'2006-02-15 21:30:53'),(10643,'2005-08-01 15:48:33',3853,495,'2005-08-06 20:24:33',2,'2006-02-15 21:30:53'),(10644,'2005-08-01 15:52:00',4374,7,'2005-08-08 16:08:00',1,'2006-02-15 21:30:53'),(10645,'2005-08-01 15:52:01',3864,130,'2005-08-09 18:58:01',1,'2006-02-15 21:30:53'),(10646,'2005-08-01 15:57:55',1752,209,'2005-08-02 19:08:55',1,'2006-02-15 21:30:53'),(10647,'2005-08-01 16:08:46',3137,115,'2005-08-06 20:37:46',2,'2006-02-15 21:30:53'),(10648,'2005-08-01 16:08:52',691,270,'2005-08-05 20:17:52',1,'2006-02-15 21:30:53'),(10649,'2005-08-01 16:11:40',1032,278,'2005-08-06 14:09:40',2,'2006-02-15 21:30:53'),(10650,'2005-08-01 16:18:45',2306,242,'2005-08-09 16:29:45',1,'2006-02-15 21:30:53'),(10651,'2005-08-01 16:20:22',1541,404,'2005-08-03 15:53:22',1,'2006-02-15 21:30:53'),(10652,'2005-08-01 16:24:08',1633,241,'2005-08-03 16:00:08',2,'2006-02-15 21:30:53'),(10653,'2005-08-01 16:28:07',1190,75,'2005-08-07 21:22:07',2,'2006-02-15 21:30:53'),(10654,'2005-08-01 16:31:35',2522,399,'2005-08-05 12:04:35',2,'2006-02-15 21:30:53'),(10655,'2005-08-01 16:33:27',1399,385,'2005-08-08 17:17:27',2,'2006-02-15 21:30:53'),(10656,'2005-08-01 16:38:04',2571,80,'2005-08-09 19:37:04',2,'2006-02-15 21:30:53'),(10657,'2005-08-01 16:38:44',3075,590,'2005-08-06 16:05:44',2,'2006-02-15 21:30:53'),(10658,'2005-08-01 16:39:18',2943,469,'2005-08-09 18:17:18',2,'2006-02-15 21:30:53'),(10659,'2005-08-01 16:40:34',786,238,'2005-08-09 21:00:34',2,'2006-02-15 21:30:53'),(10660,'2005-08-01 16:48:01',2518,253,'2005-08-07 14:42:01',2,'2006-02-15 21:30:53'),(10661,'2005-08-01 16:48:31',3311,177,'2005-08-02 21:02:31',1,'2006-02-15 21:30:53'),(10662,'2005-08-01 16:50:57',2857,151,'2005-08-03 17:19:57',1,'2006-02-15 21:30:53'),(10663,'2005-08-01 16:51:08',4258,433,'2005-08-08 21:17:08',2,'2006-02-15 21:30:53'),(10664,'2005-08-01 16:51:15',3167,337,'2005-08-04 19:14:15',2,'2006-02-15 21:30:53'),(10665,'2005-08-01 16:56:17',3594,133,'2005-08-03 18:58:17',1,'2006-02-15 21:30:53'),(10666,'2005-08-01 16:56:36',1945,197,'2005-08-07 22:23:36',2,'2006-02-15 21:30:53'),(10667,'2005-08-01 16:58:22',3937,340,'2005-08-10 15:41:22',1,'2006-02-15 21:30:53'),(10668,'2005-08-01 17:00:27',2085,58,'2005-08-02 14:49:27',2,'2006-02-15 21:30:53'),(10669,'2005-08-01 17:03:28',2121,559,'2005-08-08 21:34:28',2,'2006-02-15 21:30:53'),(10670,'2005-08-01 17:07:16',156,512,'2005-08-10 11:46:16',2,'2006-02-15 21:30:53'),(10671,'2005-08-01 17:09:59',4430,10,'2005-08-09 21:36:59',1,'2006-02-15 21:30:53'),(10672,'2005-08-01 17:10:54',3674,375,'2005-08-07 12:19:54',2,'2006-02-15 21:30:53'),(10673,'2005-08-01 17:11:51',2735,528,'2005-08-03 13:32:51',1,'2006-02-15 21:30:53'),(10674,'2005-08-01 17:11:52',1962,340,'2005-08-08 19:34:52',1,'2006-02-15 21:30:53'),(10675,'2005-08-01 17:11:57',649,522,'2005-08-10 17:18:57',1,'2006-02-15 21:30:53'),(10676,'2005-08-01 17:14:15',629,79,'2005-08-04 12:34:15',1,'2006-02-15 21:30:53'),(10677,'2005-08-01 17:24:35',4350,483,'2005-08-04 20:03:35',1,'2006-02-15 21:30:53'),(10678,'2005-08-01 17:26:24',4438,56,'2005-08-05 22:55:24',1,'2006-02-15 21:30:53'),(10679,'2005-08-01 17:27:58',4437,198,'2005-08-08 16:06:58',1,'2006-02-15 21:30:53'),(10680,'2005-08-01 17:28:05',2498,60,'2005-08-04 19:34:05',1,'2006-02-15 21:30:53'),(10681,'2005-08-01 17:30:35',1468,119,'2005-08-02 14:48:35',2,'2006-02-15 21:30:53'),(10682,'2005-08-01 17:32:53',4557,18,'2005-08-06 15:49:53',2,'2006-02-15 21:30:53'),(10683,'2005-08-01 17:33:03',244,246,'2005-08-04 23:12:03',1,'2006-02-15 21:30:53'),(10684,'2005-08-01 17:47:00',1985,244,'2005-08-09 15:00:00',2,'2006-02-15 21:30:53'),(10685,'2005-08-01 17:49:38',2029,200,'2005-08-07 21:04:38',2,'2006-02-15 21:30:53'),(10686,'2005-08-01 17:51:21',2542,150,'2005-08-03 19:01:21',1,'2006-02-15 21:30:53'),(10687,'2005-08-01 17:53:02',3191,16,'2005-08-05 19:16:02',2,'2006-02-15 21:30:53'),(10688,'2005-08-01 17:53:43',3161,449,'2005-08-09 21:50:43',1,'2006-02-15 21:30:53'),(10689,'2005-08-01 18:04:18',1442,568,'2005-08-05 21:17:18',2,'2006-02-15 21:30:53'),(10690,'2005-08-01 18:05:54',807,80,'2005-08-10 21:43:54',2,'2006-02-15 21:30:53'),(10691,'2005-08-01 18:09:53',4281,276,'2005-08-03 16:32:53',1,'2006-02-15 21:30:53'),(10692,'2005-08-01 18:12:35',371,596,'2005-08-07 13:06:35',1,'2006-02-15 21:30:53'),(10693,'2005-08-01 18:14:14',2387,444,'2005-08-03 22:00:14',2,'2006-02-15 21:30:53'),(10694,'2005-08-01 18:15:07',3429,98,'2005-08-10 15:38:07',1,'2006-02-15 21:30:53'),(10695,'2005-08-01 18:16:20',3612,374,'2005-08-03 12:21:20',2,'2006-02-15 21:30:53'),(10696,'2005-08-01 18:18:13',47,120,'2005-08-04 14:09:13',1,'2006-02-15 21:30:53'),(10697,'2005-08-01 18:20:23',3115,519,'2005-08-07 21:18:23',1,'2006-02-15 21:30:53'),(10698,'2005-08-01 18:24:41',2738,135,'2005-08-08 18:59:41',2,'2006-02-15 21:30:53'),(10699,'2005-08-01 18:24:51',1029,125,'2005-08-06 20:18:51',1,'2006-02-15 21:30:53'),(10700,'2005-08-01 18:26:31',4259,203,'2005-08-07 19:51:31',2,'2006-02-15 21:30:53'),(10701,'2005-08-01 18:28:17',3958,538,'2005-08-09 21:51:17',1,'2006-02-15 21:30:53'),(10702,'2005-08-01 18:34:59',2802,560,'2005-08-09 23:44:59',2,'2006-02-15 21:30:53'),(10703,'2005-08-01 18:37:39',1818,181,'2005-08-07 23:50:39',2,'2006-02-15 21:30:53'),(10704,'2005-08-01 18:38:02',960,594,'2005-08-08 20:19:02',1,'2006-02-15 21:30:53'),(10705,'2005-08-01 18:38:54',4338,381,'2005-08-04 18:00:54',1,'2006-02-15 21:30:53'),(10706,'2005-08-01 18:41:28',1183,147,'2005-08-10 14:30:28',1,'2006-02-15 21:30:53'),(10707,'2005-08-01 18:41:34',1165,558,'2005-08-06 12:41:34',1,'2006-02-15 21:30:53'),(10708,'2005-08-01 18:43:28',3978,567,'2005-08-09 15:24:28',1,'2006-02-15 21:30:53'),(10709,'2005-08-01 18:43:57',282,418,'2005-08-06 13:17:57',2,'2006-02-15 21:30:53'),(10710,'2005-08-01 18:44:36',3082,177,'2005-08-03 13:17:36',1,'2006-02-15 21:30:53'),(10711,'2005-08-01 18:45:09',4278,400,'2005-08-02 19:47:09',2,'2006-02-15 21:30:53'),(10712,'2005-08-01 18:47:56',1188,532,'2005-08-07 19:26:56',2,'2006-02-15 21:30:53'),(10713,'2005-08-01 18:50:05',2030,369,'2005-08-05 00:43:05',2,'2006-02-15 21:30:53'),(10714,'2005-08-01 18:51:29',1465,64,'2005-08-04 18:49:29',2,'2006-02-15 21:30:53'),(10715,'2005-08-01 18:51:48',1054,386,'2005-08-06 14:44:48',1,'2006-02-15 21:30:53'),(10716,'2005-08-01 18:53:48',3405,515,'2005-08-04 13:49:48',1,'2006-02-15 21:30:53'),(10717,'2005-08-01 18:53:53',2934,365,'2005-08-05 21:28:53',1,'2006-02-15 21:30:53'),(10718,'2005-08-01 18:55:38',2763,394,'2005-08-04 14:45:38',1,'2006-02-15 21:30:53'),(10719,'2005-08-01 19:00:28',3861,188,'2005-08-07 17:04:28',1,'2006-02-15 21:30:53'),(10720,'2005-08-01 19:04:33',3712,326,'2005-08-06 23:12:33',2,'2006-02-15 21:30:53'),(10721,'2005-08-01 19:05:18',904,18,'2005-08-09 20:45:18',2,'2006-02-15 21:30:53'),(10722,'2005-08-01 19:07:08',2849,90,'2005-08-04 14:09:08',2,'2006-02-15 21:30:53'),(10723,'2005-08-01 19:10:49',2526,580,'2005-08-08 19:21:49',2,'2006-02-15 21:30:53'),(10724,'2005-08-01 19:10:59',3425,576,'2005-08-07 18:44:59',1,'2006-02-15 21:30:53'),(10725,'2005-08-01 19:11:04',4486,534,'2005-08-07 18:16:04',2,'2006-02-15 21:30:53'),(10726,'2005-08-01 19:14:53',749,75,'2005-08-08 23:56:53',2,'2006-02-15 21:30:53'),(10727,'2005-08-01 19:15:08',2049,16,'2005-08-03 13:52:08',1,'2006-02-15 21:30:53'),(10728,'2005-08-01 19:15:09',3133,309,'2005-08-04 19:35:09',1,'2006-02-15 21:30:53'),(10729,'2005-08-01 19:21:11',2918,595,'2005-08-07 21:20:11',2,'2006-02-15 21:30:53'),(10730,'2005-08-01 19:21:42',1793,368,'2005-08-10 21:18:42',1,'2006-02-15 21:30:53'),(10731,'2005-08-01 19:21:48',4248,278,'2005-08-08 22:01:48',2,'2006-02-15 21:30:53'),(10732,'2005-08-01 19:25:18',2810,538,'2005-08-10 22:26:18',1,'2006-02-15 21:30:53'),(10733,'2005-08-01 19:28:01',3980,560,'2005-08-09 18:41:01',1,'2006-02-15 21:30:53'),(10734,'2005-08-01 19:28:47',1130,21,'2005-08-03 00:41:47',2,'2006-02-15 21:30:53'),(10735,'2005-08-01 19:29:45',4061,544,'2005-08-02 19:50:45',2,'2006-02-15 21:30:53'),(10736,'2005-08-01 19:30:21',2227,272,'2005-08-02 22:37:21',1,'2006-02-15 21:30:53'),(10737,'2005-08-01 19:31:24',1773,149,'2005-08-10 19:17:24',1,'2006-02-15 21:30:53'),(10738,'2005-08-01 19:39:08',544,377,'2005-08-10 20:37:08',1,'2006-02-15 21:30:53'),(10739,'2005-08-01 19:46:11',3160,197,'2005-08-06 21:08:11',2,'2006-02-15 21:30:53'),(10740,'2005-08-01 19:50:32',3215,144,'2005-08-07 23:25:32',1,'2006-02-15 21:30:53'),(10741,'2005-08-01 19:52:52',3300,469,'2005-08-04 19:58:52',1,'2006-02-15 21:30:53'),(10742,'2005-08-01 19:53:13',3658,416,'2005-08-10 15:05:13',1,'2006-02-15 21:30:53'),(10743,'2005-08-01 19:55:09',4206,197,'2005-08-03 19:29:09',1,'2006-02-15 21:30:53'),(10744,'2005-08-01 19:56:49',565,439,'2005-08-09 16:33:49',2,'2006-02-15 21:30:53'),(10745,'2005-08-01 19:57:06',446,307,'2005-08-07 18:04:06',1,'2006-02-15 21:30:53'),(10746,'2005-08-01 19:58:49',305,508,'2005-08-10 19:00:49',2,'2006-02-15 21:30:53'),(10747,'2005-08-01 19:59:41',4527,266,'2005-08-10 00:00:41',2,'2006-02-15 21:30:53'),(10748,'2005-08-01 20:01:24',3769,181,'2005-08-05 19:55:24',1,'2006-02-15 21:30:53'),(10749,'2005-08-01 20:02:01',2953,214,'2005-08-03 14:20:01',1,'2006-02-15 21:30:53'),(10750,'2005-08-01 20:06:00',3206,201,'2005-08-07 15:48:00',1,'2006-02-15 21:30:53'),(10751,'2005-08-01 20:06:10',3257,518,'2005-08-10 22:36:10',2,'2006-02-15 21:30:53'),(10752,'2005-08-01 20:08:49',3203,147,'2005-08-10 15:41:49',2,'2006-02-15 21:30:53'),(10753,'2005-08-01 20:09:24',1557,273,'2005-08-09 19:31:24',1,'2006-02-15 21:30:53'),(10754,'2005-08-01 20:12:33',2122,460,'2005-08-10 01:07:33',2,'2006-02-15 21:30:53'),(10755,'2005-08-01 20:14:14',1217,239,'2005-08-07 01:04:14',1,'2006-02-15 21:30:53'),(10756,'2005-08-01 20:17:03',4247,596,'2005-08-08 18:31:03',2,'2006-02-15 21:30:53'),(10757,'2005-08-01 20:22:44',102,188,'2005-08-04 19:48:44',2,'2006-02-15 21:30:53'),(10758,'2005-08-01 20:22:51',191,373,'2005-08-10 16:11:51',1,'2006-02-15 21:30:53'),(10759,'2005-08-01 20:22:51',3528,256,'2005-08-07 22:07:51',1,'2006-02-15 21:30:53'),(10760,'2005-08-01 20:25:20',1311,497,'2005-08-09 16:57:20',1,'2006-02-15 21:30:53'),(10761,'2005-08-01 20:25:35',3967,36,'2005-08-08 15:20:35',2,'2006-02-15 21:30:53'),(10762,'2005-08-01 20:28:39',1363,208,'2005-08-05 17:36:39',1,'2006-02-15 21:30:53'),(10763,'2005-08-01 20:32:27',987,276,'2005-08-05 01:24:27',2,'2006-02-15 21:30:53'),(10764,'2005-08-01 20:32:42',3808,357,'2005-08-03 22:14:42',2,'2006-02-15 21:30:53'),(10765,'2005-08-01 20:34:51',566,337,'2005-08-04 00:02:51',1,'2006-02-15 21:30:53'),(10766,'2005-08-01 20:36:29',947,420,'2005-08-04 00:30:29',1,'2006-02-15 21:30:53'),(10767,'2005-08-01 20:37:23',2875,488,'2005-08-04 23:15:23',2,'2006-02-15 21:30:53'),(10768,'2005-08-01 20:39:32',454,273,'2005-08-10 19:41:32',1,'2006-02-15 21:30:53'),(10769,'2005-08-01 20:43:02',3222,348,'2005-08-05 02:32:02',1,'2006-02-15 21:30:53'),(10770,'2005-08-01 20:45:39',2567,262,'2005-08-04 19:21:39',1,'2006-02-15 21:30:53'),(10771,'2005-08-01 20:49:35',1274,485,'2005-08-10 16:58:35',1,'2006-02-15 21:30:53'),(10772,'2005-08-01 20:51:10',132,485,'2005-08-10 15:50:10',1,'2006-02-15 21:30:53'),(10773,'2005-08-01 20:53:45',3854,181,'2005-08-07 00:16:45',1,'2006-02-15 21:30:53'),(10774,'2005-08-01 20:54:33',4231,407,'2005-08-08 20:59:33',2,'2006-02-15 21:30:53'),(10775,'2005-08-01 20:59:52',4190,263,'2005-08-04 19:31:52',2,'2006-02-15 21:30:53'),(10776,'2005-08-01 20:59:58',1598,565,'2005-08-10 20:33:58',2,'2006-02-15 21:30:53'),(10777,'2005-08-01 21:03:50',3487,493,'2005-08-06 19:29:50',1,'2006-02-15 21:30:53'),(10778,'2005-08-01 21:11:39',1939,220,'2005-08-02 22:59:39',2,'2006-02-15 21:30:53'),(10779,'2005-08-01 21:11:54',2092,578,'2005-08-09 21:00:54',2,'2006-02-15 21:30:53'),(10780,'2005-08-01 21:14:24',1450,51,'2005-08-07 16:32:24',2,'2006-02-15 21:30:53'),(10781,'2005-08-01 21:22:41',1321,259,'2005-08-06 01:02:41',1,'2006-02-15 21:30:53'),(10782,'2005-08-01 21:23:25',1507,577,'2005-08-03 20:15:25',2,'2006-02-15 21:30:53'),(10783,'2005-08-01 21:23:37',1192,495,'2005-08-09 20:18:37',1,'2006-02-15 21:30:53'),(10784,'2005-08-01 21:24:28',3494,208,'2005-08-09 19:23:28',1,'2006-02-15 21:30:53'),(10785,'2005-08-01 21:24:55',2282,397,'2005-08-06 17:47:55',1,'2006-02-15 21:30:53'),(10786,'2005-08-01 21:29:34',50,490,'2005-08-10 17:27:34',1,'2006-02-15 21:30:53'),(10787,'2005-08-01 21:35:01',3246,127,'2005-08-10 23:30:01',1,'2006-02-15 21:30:53'),(10788,'2005-08-01 21:37:10',3350,160,'2005-08-03 01:33:10',1,'2006-02-15 21:30:53'),(10789,'2005-08-01 21:37:55',3298,403,'2005-08-07 17:01:55',2,'2006-02-15 21:30:53'),(10790,'2005-08-01 21:38:37',3080,274,'2005-08-08 17:20:37',2,'2006-02-15 21:30:53'),(10791,'2005-08-01 21:41:52',2061,338,'2005-08-04 03:28:52',2,'2006-02-15 21:30:53'),(10792,'2005-08-01 21:44:24',1037,264,'2005-08-02 19:48:24',2,'2006-02-15 21:30:53'),(10793,'2005-08-01 21:48:03',3018,225,'2005-08-10 19:16:03',1,'2006-02-15 21:30:53'),(10794,'2005-08-01 21:51:15',889,27,'2005-08-10 18:51:15',2,'2006-02-15 21:30:53'),(10795,'2005-08-01 21:56:37',2748,76,'2005-08-03 01:36:37',1,'2006-02-15 21:30:53'),(10796,'2005-08-01 21:56:41',2113,534,'2005-08-05 01:09:41',1,'2006-02-15 21:30:53'),(10797,'2005-08-01 22:02:51',1731,308,'2005-08-03 23:07:51',1,'2006-02-15 21:30:53'),(10798,'2005-08-01 22:03:10',382,141,'2005-08-08 01:34:10',1,'2006-02-15 21:30:53'),(10799,'2005-08-01 22:03:31',3282,145,'2005-08-06 20:19:31',2,'2006-02-15 21:30:53'),(10800,'2005-08-01 22:07:44',507,583,'2005-08-05 22:45:44',1,'2006-02-15 21:30:53'),(10801,'2005-08-01 22:09:35',3757,116,'2005-08-08 22:23:35',1,'2006-02-15 21:30:53'),(10802,'2005-08-01 22:18:32',3998,178,'2005-08-10 18:41:32',2,'2006-02-15 21:30:53'),(10803,'2005-08-01 22:22:07',3318,46,'2005-08-08 02:37:07',2,'2006-02-15 21:30:53'),(10804,'2005-08-01 22:22:11',2915,596,'2005-08-03 03:42:11',2,'2006-02-15 21:30:53'),(10805,'2005-08-01 22:23:37',557,203,'2005-08-05 01:22:37',2,'2006-02-15 21:30:53'),(10806,'2005-08-01 22:25:29',3553,89,'2005-08-04 18:46:29',2,'2006-02-15 21:30:53'),(10807,'2005-08-01 22:26:10',1673,287,'2005-08-05 21:55:10',1,'2006-02-15 21:30:53'),(10808,'2005-08-01 22:37:11',596,480,'2005-08-09 02:37:11',1,'2006-02-15 21:30:53'),(10809,'2005-08-01 22:39:27',1167,340,'2005-08-03 03:44:27',2,'2006-02-15 21:30:53'),(10810,'2005-08-01 22:40:39',2314,376,'2005-08-06 19:47:39',1,'2006-02-15 21:30:53'),(10811,'2005-08-01 22:41:15',4012,209,'2005-08-10 00:10:15',1,'2006-02-15 21:30:53'),(10812,'2005-08-01 22:41:16',3762,11,'2005-08-07 00:50:16',1,'2006-02-15 21:30:53'),(10813,'2005-08-01 22:43:00',3580,456,'2005-08-03 21:43:00',1,'2006-02-15 21:30:53'),(10814,'2005-08-01 22:43:12',2758,49,'2005-08-05 02:35:12',2,'2006-02-15 21:30:53'),(10815,'2005-08-01 22:46:21',877,62,'2005-08-03 02:43:21',2,'2006-02-15 21:30:53'),(10816,'2005-08-01 22:48:57',905,129,'2005-08-10 04:39:57',2,'2006-02-15 21:30:53'),(10817,'2005-08-01 22:51:08',3056,501,'2005-08-10 16:55:08',2,'2006-02-15 21:30:53'),(10818,'2005-08-01 22:52:45',4549,309,'2005-08-06 04:07:45',1,'2006-02-15 21:30:53'),(10819,'2005-08-01 22:52:57',983,308,'2005-08-06 00:08:57',1,'2006-02-15 21:30:53'),(10820,'2005-08-01 22:53:40',1487,97,'2005-08-02 17:59:40',2,'2006-02-15 21:30:53'),(10821,'2005-08-01 22:54:27',2016,522,'2005-08-07 02:15:27',2,'2006-02-15 21:30:53'),(10822,'2005-08-01 22:54:28',3895,343,'2005-08-02 17:19:28',1,'2006-02-15 21:30:53'),(10823,'2005-08-01 22:59:10',3322,405,'2005-08-08 23:44:10',1,'2006-02-15 21:30:53'),(10824,'2005-08-01 23:00:22',3948,482,'2005-08-04 04:14:22',2,'2006-02-15 21:30:53'),(10825,'2005-08-01 23:05:33',4386,587,'2005-08-04 04:33:33',1,'2006-02-15 21:30:53'),(10826,'2005-08-01 23:07:56',1228,476,'2005-08-08 04:10:56',2,'2006-02-15 21:30:53'),(10827,'2005-08-01 23:13:00',1590,46,'2005-08-08 02:51:00',1,'2006-02-15 21:30:53'),(10828,'2005-08-01 23:16:10',2448,471,'2005-08-09 21:17:10',1,'2006-02-15 21:30:53'),(10829,'2005-08-01 23:17:06',168,554,'2005-08-09 17:22:06',2,'2006-02-15 21:30:53'),(10830,'2005-08-01 23:18:06',4176,148,'2005-08-06 23:15:06',2,'2006-02-15 21:30:53'),(10831,'2005-08-01 23:22:45',1496,78,'2005-08-07 01:05:45',2,'2006-02-15 21:30:53'),(10832,'2005-08-01 23:24:53',4096,487,'2005-08-06 23:18:53',1,'2006-02-15 21:30:53'),(10833,'2005-08-01 23:25:55',4380,422,'2005-08-10 18:01:55',1,'2006-02-15 21:30:53'),(10834,'2005-08-01 23:28:00',2270,252,'2005-08-07 01:21:00',1,'2006-02-15 21:30:53'),(10835,'2005-08-01 23:28:49',351,90,'2005-08-10 21:28:49',2,'2006-02-15 21:30:53'),(10836,'2005-08-01 23:29:58',4534,217,'2005-08-07 23:03:58',2,'2006-02-15 21:30:53'),(10837,'2005-08-01 23:30:22',1816,410,'2005-08-07 23:02:22',1,'2006-02-15 21:30:53'),(10838,'2005-08-01 23:36:10',69,387,'2005-08-05 04:55:10',2,'2006-02-15 21:30:53'),(10839,'2005-08-01 23:37:39',2867,482,'2005-08-02 20:18:39',1,'2006-02-15 21:30:53'),(10840,'2005-08-01 23:38:34',583,593,'2005-08-07 02:36:34',2,'2006-02-15 21:30:53'),(10841,'2005-08-01 23:39:21',4337,102,'2005-08-07 20:47:21',1,'2006-02-15 21:30:53'),(10842,'2005-08-01 23:41:24',1300,137,'2005-08-11 03:48:24',1,'2006-02-15 21:30:53'),(10843,'2005-08-01 23:43:03',1286,192,'2005-08-09 23:49:03',2,'2006-02-15 21:30:53'),(10844,'2005-08-01 23:46:58',1516,333,'2005-08-09 19:42:58',2,'2006-02-15 21:30:53'),(10845,'2005-08-01 23:47:03',2737,42,'2005-08-08 01:57:03',1,'2006-02-15 21:30:53'),(10846,'2005-08-01 23:47:54',2277,441,'2005-08-08 01:10:54',1,'2006-02-15 21:30:53'),(10847,'2005-08-01 23:49:33',1200,280,'2005-08-10 05:37:33',2,'2006-02-15 21:30:53'),(10848,'2005-08-01 23:50:22',2630,368,'2005-08-06 00:52:22',1,'2006-02-15 21:30:53'),(10849,'2005-08-01 23:51:00',1683,278,'2005-08-10 19:59:00',2,'2006-02-15 21:30:53'),(10850,'2005-08-01 23:53:45',1853,199,'2005-08-10 21:11:45',1,'2006-02-15 21:30:53'),(10851,'2005-08-01 23:58:45',1359,154,'2005-08-04 00:59:45',1,'2006-02-15 21:30:53'),(10852,'2005-08-02 00:00:33',3862,27,'2005-08-03 23:09:33',1,'2006-02-15 21:30:53'),(10853,'2005-08-02 00:00:54',2682,41,'2005-08-10 05:37:54',2,'2006-02-15 21:30:53'),(10854,'2005-08-02 00:02:06',3295,356,'2005-08-02 21:55:06',2,'2006-02-15 21:30:53'),(10855,'2005-08-02 00:06:37',1366,274,'2005-08-03 00:39:37',1,'2006-02-15 21:30:53'),(10856,'2005-08-02 00:07:14',2010,451,'2005-08-04 02:48:14',2,'2006-02-15 21:30:53'),(10857,'2005-08-02 00:07:20',2961,360,'2005-08-04 02:35:20',1,'2006-02-15 21:30:53'),(10858,'2005-08-02 00:08:39',852,312,'2005-08-05 00:58:39',2,'2006-02-15 21:30:53'),(10859,'2005-08-02 00:11:39',277,375,'2005-08-08 19:52:39',1,'2006-02-15 21:30:53'),(10860,'2005-08-02 00:12:32',2827,25,'2005-08-04 03:50:32',1,'2006-02-15 21:30:53'),(10861,'2005-08-02 00:12:46',2162,131,'2005-08-09 04:09:46',2,'2006-02-15 21:30:53'),(10862,'2005-08-02 00:17:34',1077,176,'2005-08-08 00:31:34',2,'2006-02-15 21:30:53'),(10863,'2005-08-02 00:18:07',1170,161,'2005-08-10 06:16:07',2,'2006-02-15 21:30:53'),(10864,'2005-08-02 00:18:59',1694,134,'2005-08-08 22:20:59',1,'2006-02-15 21:30:53'),(10865,'2005-08-02 00:22:46',1485,201,'2005-08-09 05:08:46',2,'2006-02-15 21:30:53'),(10866,'2005-08-02 00:22:49',117,424,'2005-08-07 04:38:49',1,'2006-02-15 21:30:53'),(10867,'2005-08-02 00:24:15',2577,473,'2005-08-05 21:09:15',1,'2006-02-15 21:30:53'),(10868,'2005-08-02 00:25:15',2443,562,'2005-08-10 02:31:15',2,'2006-02-15 21:30:53'),(10869,'2005-08-02 00:26:54',2967,568,'2005-08-04 03:40:54',2,'2006-02-15 21:30:53'),(10870,'2005-08-02 00:27:12',1509,33,'2005-08-02 20:00:12',2,'2006-02-15 21:30:53'),(10871,'2005-08-02 00:27:24',104,75,'2005-08-05 06:25:24',1,'2006-02-15 21:30:53'),(10872,'2005-08-02 00:27:50',2470,84,'2005-08-06 20:34:50',2,'2006-02-15 21:30:53'),(10873,'2005-08-02 00:30:34',169,506,'2005-08-07 00:16:34',2,'2006-02-15 21:30:53'),(10874,'2005-08-02 00:31:00',2552,230,'2005-08-07 05:04:00',1,'2006-02-15 21:30:53'),(10875,'2005-08-02 00:31:44',862,175,'2005-08-05 22:24:44',2,'2006-02-15 21:30:53'),(10876,'2005-08-02 00:31:58',2161,559,'2005-08-05 21:45:58',1,'2006-02-15 21:30:53'),(10877,'2005-08-02 00:32:04',3337,487,'2005-08-07 19:44:04',2,'2006-02-15 21:30:53'),(10878,'2005-08-02 00:33:12',3511,45,'2005-08-07 06:02:12',1,'2006-02-15 21:30:53'),(10879,'2005-08-02 00:33:20',4415,334,'2005-08-09 04:13:20',2,'2006-02-15 21:30:53'),(10880,'2005-08-02 00:34:12',450,528,'2005-08-06 21:15:12',2,'2006-02-15 21:30:53'),(10881,'2005-08-02 00:38:14',781,253,'2005-08-09 22:02:14',2,'2006-02-15 21:30:53'),(10882,'2005-08-02 00:47:16',1349,54,'2005-08-09 22:11:16',1,'2006-02-15 21:30:53'),(10883,'2005-08-02 00:47:19',4,301,'2005-08-03 00:02:19',1,'2006-02-15 21:30:53'),(10884,'2005-08-02 00:47:33',3702,569,'2005-08-03 04:38:33',1,'2006-02-15 21:30:53'),(10885,'2005-08-02 00:51:37',4223,493,'2005-08-09 20:49:37',2,'2006-02-15 21:30:53'),(10886,'2005-08-02 00:52:34',943,77,'2005-08-08 00:30:34',1,'2006-02-15 21:30:53'),(10887,'2005-08-02 00:52:35',3450,573,'2005-08-03 05:37:35',1,'2006-02-15 21:30:53'),(10888,'2005-08-02 00:52:45',2412,428,'2005-08-03 03:07:45',1,'2006-02-15 21:30:53'),(10889,'2005-08-02 00:54:33',2098,64,'2005-08-07 19:42:33',1,'2006-02-15 21:30:53'),(10890,'2005-08-02 00:58:46',78,210,'2005-08-10 02:13:46',1,'2006-02-15 21:30:53'),(10891,'2005-08-02 01:09:55',1269,201,'2005-08-05 05:03:55',2,'2006-02-15 21:30:53'),(10892,'2005-08-02 01:12:06',3243,109,'2005-08-09 23:53:06',1,'2006-02-15 21:30:53'),(10893,'2005-08-02 01:12:13',2529,306,'2005-08-11 05:53:13',2,'2006-02-15 21:30:53'),(10894,'2005-08-02 01:12:35',598,51,'2005-08-09 22:55:35',1,'2006-02-15 21:30:53'),(10895,'2005-08-02 01:16:59',93,77,'2005-08-03 02:41:59',2,'2006-02-15 21:30:53'),(10896,'2005-08-02 01:19:33',2283,505,'2005-08-08 06:54:33',1,'2006-02-15 21:30:53'),(10897,'2005-08-02 01:23:42',291,338,'2005-08-03 23:27:42',1,'2006-02-15 21:30:53'),(10898,'2005-08-02 01:29:57',3814,23,'2005-08-06 00:07:57',2,'2006-02-15 21:30:53'),(10899,'2005-08-02 01:30:21',859,29,'2005-08-06 05:01:21',2,'2006-02-15 21:30:53'),(10900,'2005-08-02 01:34:26',1749,139,'2005-08-07 00:52:26',2,'2006-02-15 21:30:53'),(10901,'2005-08-02 01:35:44',3813,290,'2005-08-04 21:20:44',2,'2006-02-15 21:30:53'),(10902,'2005-08-02 01:35:46',3863,486,'2005-08-09 01:59:46',1,'2006-02-15 21:30:53'),(10903,'2005-08-02 01:41:59',2696,547,'2005-08-06 23:03:59',1,'2006-02-15 21:30:53'),(10904,'2005-08-02 01:43:02',3681,593,'2005-08-04 04:34:02',1,'2006-02-15 21:30:53'),(10905,'2005-08-02 01:45:59',2835,439,'2005-08-04 22:28:59',1,'2006-02-15 21:30:53'),(10906,'2005-08-02 01:47:04',3139,463,'2005-08-07 20:41:04',2,'2006-02-15 21:30:53'),(10907,'2005-08-02 01:51:48',1430,561,'2005-08-02 19:53:48',1,'2006-02-15 21:30:53'),(10908,'2005-08-02 01:53:06',1284,269,'2005-08-04 02:46:06',2,'2006-02-15 21:30:53'),(10909,'2005-08-02 01:53:59',3516,413,'2005-08-03 04:36:59',2,'2006-02-15 21:30:53'),(10910,'2005-08-02 01:54:34',2428,266,'2005-08-10 04:04:34',2,'2006-02-15 21:30:53'),(10911,'2005-08-02 01:58:36',769,195,'2005-08-08 07:37:36',2,'2006-02-15 21:30:53'),(10912,'2005-08-02 02:00:03',732,477,'2005-08-06 05:55:03',1,'2006-02-15 21:30:53'),(10913,'2005-08-02 02:04:03',3388,565,'2005-08-09 03:21:03',1,'2006-02-15 21:30:53'),(10914,'2005-08-02 02:04:43',585,584,'2005-08-06 03:00:43',1,'2006-02-15 21:30:53'),(10915,'2005-08-02 02:05:04',4568,418,'2005-08-10 21:58:04',2,'2006-02-15 21:30:53'),(10916,'2005-08-02 02:05:59',3841,25,'2005-08-06 03:46:59',2,'2006-02-15 21:30:53'),(10917,'2005-08-02 02:06:18',3146,378,'2005-08-03 22:42:18',1,'2006-02-15 21:30:53'),(10918,'2005-08-02 02:10:56',3418,2,'2005-08-02 21:23:56',1,'2006-02-15 21:30:53'),(10919,'2005-08-02 02:11:03',868,115,'2005-08-04 01:49:03',1,'2006-02-15 21:30:53'),(10920,'2005-08-02 02:14:10',3106,531,'2005-08-06 23:36:10',1,'2006-02-15 21:30:53'),(10921,'2005-08-02 02:14:33',1820,555,'2005-08-09 20:58:33',2,'2006-02-15 21:30:53'),(10922,'2005-08-02 02:14:40',4522,539,'2005-08-06 06:04:40',1,'2006-02-15 21:30:53'),(10923,'2005-08-02 02:15:01',2602,239,'2005-08-03 04:18:01',1,'2006-02-15 21:30:53'),(10924,'2005-08-02 02:20:19',589,540,'2005-08-11 05:50:19',2,'2006-02-15 21:30:53'),(10925,'2005-08-02 02:24:38',1475,98,'2005-08-03 05:06:38',1,'2006-02-15 21:30:53'),(10926,'2005-08-02 02:26:37',4016,460,'2005-08-09 20:55:37',1,'2006-02-15 21:30:53'),(10927,'2005-08-02 02:31:15',4125,288,'2005-08-10 20:41:15',1,'2006-02-15 21:30:53'),(10928,'2005-08-02 02:34:12',2885,211,'2005-08-07 21:13:12',1,'2006-02-15 21:30:53'),(10929,'2005-08-02 02:35:44',913,305,'2005-08-05 03:52:44',1,'2006-02-15 21:30:53'),(10930,'2005-08-02 02:38:07',2027,206,'2005-08-08 05:15:07',2,'2006-02-15 21:30:53'),(10931,'2005-08-02 02:44:59',3268,545,'2005-08-04 02:02:59',1,'2006-02-15 21:30:53'),(10932,'2005-08-02 02:46:22',1688,595,'2005-08-06 01:49:22',2,'2006-02-15 21:30:53'),(10933,'2005-08-02 02:50:49',3970,313,'2005-08-08 04:39:49',1,'2006-02-15 21:30:53'),(10934,'2005-08-02 02:52:18',4458,142,'2005-08-06 01:23:18',2,'2006-02-15 21:30:53'),(10935,'2005-08-02 02:54:53',4373,42,'2005-08-10 00:07:53',2,'2006-02-15 21:30:53'),(10936,'2005-08-02 02:55:04',463,445,'2005-08-11 07:56:04',1,'2006-02-15 21:30:53'),(10937,'2005-08-02 03:00:18',1320,416,'2005-08-11 03:44:18',2,'2006-02-15 21:30:53'),(10938,'2005-08-02 03:05:22',3918,502,'2005-08-05 08:31:22',1,'2006-02-15 21:30:53'),(10939,'2005-08-02 03:06:20',2131,161,'2005-08-04 01:22:20',2,'2006-02-15 21:30:53'),(10940,'2005-08-02 03:08:29',3760,120,'2005-08-07 21:28:29',2,'2006-02-15 21:30:53'),(10941,'2005-08-02 03:11:33',2132,531,'2005-08-10 07:31:33',1,'2006-02-15 21:30:53'),(10942,'2005-08-02 03:16:31',2304,78,'2005-08-11 02:46:31',2,'2006-02-15 21:30:53'),(10943,'2005-08-02 03:17:29',1036,377,'2005-08-03 00:50:29',2,'2006-02-15 21:30:53'),(10944,'2005-08-02 03:20:03',2373,470,'2005-08-04 04:13:03',2,'2006-02-15 21:30:53'),(10945,'2005-08-02 03:20:23',3684,532,'2005-08-09 03:23:23',1,'2006-02-15 21:30:53'),(10946,'2005-08-02 03:20:39',4271,56,'2005-08-05 02:59:39',1,'2006-02-15 21:30:53'),(10947,'2005-08-02 03:23:17',2510,500,'2005-08-07 05:25:17',1,'2006-02-15 21:30:53'),(10948,'2005-08-02 03:23:23',4429,220,'2005-08-05 23:18:23',1,'2006-02-15 21:30:53'),(10949,'2005-08-02 03:24:04',2309,389,'2005-08-06 08:36:04',2,'2006-02-15 21:30:53'),(10950,'2005-08-02 03:25:08',707,451,'2005-08-07 23:11:08',2,'2006-02-15 21:30:53'),(10951,'2005-08-02 03:26:35',173,144,'2005-08-07 22:03:35',1,'2006-02-15 21:30:53'),(10952,'2005-08-02 03:28:21',3218,111,'2005-08-09 01:41:21',1,'2006-02-15 21:30:53'),(10953,'2005-08-02 03:28:38',1510,483,'2005-08-11 03:53:38',1,'2006-02-15 21:30:53'),(10954,'2005-08-02 03:30:24',3406,20,'2005-08-08 05:52:24',2,'2006-02-15 21:30:53'),(10955,'2005-08-02 03:32:34',618,490,'2005-08-09 21:53:34',2,'2006-02-15 21:30:53'),(10956,'2005-08-02 03:33:14',4372,54,'2005-08-09 09:20:14',2,'2006-02-15 21:30:53'),(10957,'2005-08-02 03:33:30',1652,447,'2005-08-10 06:19:30',2,'2006-02-15 21:30:53'),(10958,'2005-08-02 03:37:13',2174,160,'2005-08-04 23:28:13',2,'2006-02-15 21:30:53'),(10959,'2005-08-02 03:39:39',4233,431,'2005-08-11 07:20:39',1,'2006-02-15 21:30:53'),(10960,'2005-08-02 03:46:18',3536,399,'2005-08-11 01:29:18',1,'2006-02-15 21:30:53'),(10961,'2005-08-02 03:47:55',1416,375,'2005-08-09 02:03:55',1,'2006-02-15 21:30:53'),(10962,'2005-08-02 03:48:13',1953,538,'2005-08-07 00:04:13',1,'2006-02-15 21:30:53'),(10963,'2005-08-02 03:48:17',4501,36,'2005-08-02 22:15:17',1,'2006-02-15 21:30:53'),(10964,'2005-08-02 03:56:23',2356,36,'2005-08-09 23:11:23',2,'2006-02-15 21:30:53'),(10965,'2005-08-02 04:00:19',2192,580,'2005-08-09 03:27:19',1,'2006-02-15 21:30:53'),(10966,'2005-08-02 04:00:47',478,584,'2005-08-08 01:58:47',2,'2006-02-15 21:30:53'),(10967,'2005-08-02 04:02:16',683,149,'2005-08-09 07:57:16',1,'2006-02-15 21:30:53'),(10968,'2005-08-02 04:03:13',888,234,'2005-08-11 08:36:13',1,'2006-02-15 21:30:53'),(10969,'2005-08-02 04:04:32',1898,244,'2005-08-09 23:18:32',1,'2006-02-15 21:30:53'),(10970,'2005-08-02 04:06:46',1202,260,'2005-08-10 04:27:46',1,'2006-02-15 21:30:53'),(10971,'2005-08-02 04:08:17',2789,383,'2005-08-09 00:02:17',1,'2006-02-15 21:30:53'),(10972,'2005-08-02 04:08:25',1928,348,'2005-08-09 23:25:25',1,'2006-02-15 21:30:53'),(10973,'2005-08-02 04:09:42',3562,127,'2005-08-08 05:24:42',2,'2006-02-15 21:30:53'),(10974,'2005-08-02 04:10:52',690,491,'2005-08-09 08:26:52',1,'2006-02-15 21:30:53'),(10975,'2005-08-02 04:11:25',2616,361,'2005-08-04 04:39:25',2,'2006-02-15 21:30:53'),(10976,'2005-08-02 04:11:48',2418,326,'2005-08-06 06:30:48',2,'2006-02-15 21:30:53'),(10977,'2005-08-02 04:12:17',2302,300,'2005-08-06 06:52:17',2,'2006-02-15 21:30:53'),(10978,'2005-08-02 04:12:27',1597,487,'2005-08-10 08:19:27',2,'2006-02-15 21:30:53'),(10979,'2005-08-02 04:16:37',2625,160,'2005-08-06 00:01:37',2,'2006-02-15 21:30:53'),(10980,'2005-08-02 04:17:32',150,547,'2005-08-04 05:12:32',1,'2006-02-15 21:30:53'),(10981,'2005-08-02 04:17:53',3699,305,'2005-08-09 03:45:53',2,'2006-02-15 21:30:53'),(10982,'2005-08-02 04:19:11',2508,345,'2005-08-04 00:20:11',2,'2006-02-15 21:30:53'),(10983,'2005-08-02 04:24:23',4502,380,'2005-08-09 08:05:23',2,'2006-02-15 21:30:53'),(10984,'2005-08-02 04:30:02',1813,450,'2005-08-10 02:51:02',1,'2006-02-15 21:30:53'),(10985,'2005-08-02 04:30:19',2734,186,'2005-08-03 05:18:19',1,'2006-02-15 21:30:53'),(10986,'2005-08-02 04:35:24',555,597,'2005-08-09 07:34:24',2,'2006-02-15 21:30:53'),(10987,'2005-08-02 04:36:52',968,349,'2005-08-04 00:03:52',1,'2006-02-15 21:30:53'),(10988,'2005-08-02 04:38:17',1157,509,'2005-08-09 00:09:17',1,'2006-02-15 21:30:53'),(10989,'2005-08-02 04:40:54',2272,7,'2005-08-09 03:39:54',2,'2006-02-15 21:30:53'),(10990,'2005-08-02 04:41:06',262,111,'2005-08-10 05:02:06',2,'2006-02-15 21:30:53'),(10991,'2005-08-02 04:41:12',2854,77,'2005-08-05 05:36:12',2,'2006-02-15 21:30:53'),(10992,'2005-08-02 04:41:17',11,180,'2005-08-09 02:13:17',1,'2006-02-15 21:30:53'),(10993,'2005-08-02 04:45:01',292,383,'2005-08-04 03:32:01',1,'2006-02-15 21:30:53'),(10994,'2005-08-02 04:46:53',647,323,'2005-08-11 10:30:53',1,'2006-02-15 21:30:53'),(10995,'2005-08-02 04:48:00',2891,340,'2005-08-07 05:00:00',1,'2006-02-15 21:30:53'),(10996,'2005-08-02 04:48:11',2235,26,'2005-08-06 08:00:11',1,'2006-02-15 21:30:53'),(10997,'2005-08-02 04:49:02',300,334,'2005-08-10 08:13:02',2,'2006-02-15 21:30:53'),(10998,'2005-08-02 04:50:55',1479,435,'2005-08-11 03:43:55',1,'2006-02-15 21:30:53'),(10999,'2005-08-02 04:53:13',2013,227,'2005-08-06 04:36:13',2,'2006-02-15 21:30:53'),(11000,'2005-08-02 04:56:14',264,265,'2005-08-07 01:39:14',2,'2006-02-15 21:30:53'),(11001,'2005-08-02 04:56:45',3701,5,'2005-08-11 08:04:45',1,'2006-02-15 21:30:53'),(11002,'2005-08-02 05:02:56',3073,583,'2005-08-05 07:04:56',2,'2006-02-15 21:30:53'),(11003,'2005-08-02 05:03:05',4301,272,'2005-08-05 10:48:05',2,'2006-02-15 21:30:53'),(11004,'2005-08-02 05:04:18',200,45,'2005-08-11 00:03:18',2,'2006-02-15 21:30:53'),(11005,'2005-08-02 05:05:23',1547,216,'2005-08-07 23:28:23',2,'2006-02-15 21:30:53'),(11006,'2005-08-02 05:05:52',2776,473,'2005-08-05 03:33:52',1,'2006-02-15 21:30:53'),(11007,'2005-08-02 05:05:53',4172,98,'2005-08-05 01:56:53',2,'2006-02-15 21:30:53'),(11008,'2005-08-02 05:06:17',2831,375,'2005-08-10 01:22:17',2,'2006-02-15 21:30:53'),(11009,'2005-08-02 05:06:23',2574,596,'2005-08-08 03:02:23',1,'2006-02-15 21:30:53'),(11010,'2005-08-02 05:06:27',869,326,'2005-08-03 23:47:27',2,'2006-02-15 21:30:53'),(11011,'2005-08-02 05:07:07',3981,256,'2005-08-09 07:16:07',1,'2006-02-15 21:30:53'),(11012,'2005-08-02 05:09:42',542,162,'2005-08-05 07:22:42',2,'2006-02-15 21:30:53'),(11013,'2005-08-02 05:10:54',2993,527,'2005-08-10 08:59:54',1,'2006-02-15 21:30:53'),(11014,'2005-08-02 05:12:22',393,269,'2005-08-07 09:33:22',1,'2006-02-15 21:30:53'),(11015,'2005-08-02 05:13:00',4331,138,'2005-08-08 04:18:00',2,'2006-02-15 21:30:53'),(11016,'2005-08-02 05:19:13',4446,116,'2005-08-05 05:31:13',1,'2006-02-15 21:30:53'),(11017,'2005-08-02 05:19:51',4140,480,'2005-08-09 00:36:51',2,'2006-02-15 21:30:53'),(11018,'2005-08-02 05:27:53',2988,197,'2005-08-07 10:48:53',1,'2006-02-15 21:30:53'),(11019,'2005-08-02 05:29:31',3227,112,'2005-08-04 00:42:31',1,'2006-02-15 21:30:53'),(11020,'2005-08-02 05:29:48',1645,242,'2005-08-06 05:36:48',2,'2006-02-15 21:30:53'),(11021,'2005-08-02 05:30:11',2069,385,'2005-08-05 05:50:11',2,'2006-02-15 21:30:53'),(11022,'2005-08-02 05:35:03',827,206,'2005-08-09 10:20:03',2,'2006-02-15 21:30:53'),(11023,'2005-08-02 05:36:38',3617,6,'2005-08-10 05:39:38',1,'2006-02-15 21:30:53'),(11024,'2005-08-02 05:38:31',2284,427,'2005-08-11 04:47:31',1,'2006-02-15 21:30:53'),(11025,'2005-08-02 05:39:12',2253,419,'2005-08-08 00:09:12',2,'2006-02-15 21:30:53'),(11026,'2005-08-02 05:46:05',3554,531,'2005-08-07 06:27:05',2,'2006-02-15 21:30:53'),(11027,'2005-08-02 05:47:10',571,412,'2005-08-05 23:51:10',1,'2006-02-15 21:30:53'),(11028,'2005-08-02 05:48:20',2764,66,'2005-08-10 11:21:20',1,'2006-02-15 21:30:53'),(11029,'2005-08-02 05:51:10',1023,45,'2005-08-05 04:15:10',1,'2006-02-15 21:30:53'),(11030,'2005-08-02 05:51:20',1437,569,'2005-08-06 04:20:20',1,'2006-02-15 21:30:53'),(11031,'2005-08-02 05:52:58',1205,361,'2005-08-07 07:14:58',2,'2006-02-15 21:30:53'),(11032,'2005-08-02 05:53:35',1119,359,'2005-08-05 02:58:35',2,'2006-02-15 21:30:53'),(11033,'2005-08-02 05:54:17',3323,155,'2005-08-09 10:50:17',2,'2006-02-15 21:30:53'),(11034,'2005-08-02 05:54:53',2939,586,'2005-08-09 04:14:53',1,'2006-02-15 21:30:53'),(11035,'2005-08-02 05:55:39',3776,305,'2005-08-08 06:46:39',2,'2006-02-15 21:30:53'),(11036,'2005-08-02 05:56:29',2054,502,'2005-08-05 05:00:29',2,'2006-02-15 21:30:53'),(11037,'2005-08-02 05:58:12',4291,220,'2005-08-07 11:26:12',1,'2006-02-15 21:30:53'),(11038,'2005-08-02 05:59:42',4452,403,'2005-08-08 04:37:42',2,'2006-02-15 21:30:53'),(11039,'2005-08-02 06:00:53',549,170,'2005-08-05 06:19:53',2,'2006-02-15 21:30:53'),(11040,'2005-08-02 06:03:22',2297,223,'2005-08-03 07:58:22',1,'2006-02-15 21:30:53'),(11041,'2005-08-02 06:03:53',1897,435,'2005-08-03 11:57:53',1,'2006-02-15 21:30:53'),(11042,'2005-08-02 06:04:33',4149,439,'2005-08-11 01:30:33',1,'2006-02-15 21:30:53'),(11043,'2005-08-02 06:04:44',65,573,'2005-08-06 11:37:44',1,'2006-02-15 21:30:53'),(11044,'2005-08-02 06:05:27',2922,122,'2005-08-06 05:15:27',1,'2006-02-15 21:30:53'),(11045,'2005-08-02 06:07:54',2214,402,'2005-08-08 00:37:54',1,'2006-02-15 21:30:53'),(11046,'2005-08-02 06:08:34',2105,526,'2005-08-06 08:45:34',2,'2006-02-15 21:30:53'),(11047,'2005-08-02 06:09:20',2267,416,'2005-08-11 08:36:20',1,'2006-02-15 21:30:53'),(11048,'2005-08-02 06:15:07',206,491,'2005-08-04 02:47:07',2,'2006-02-15 21:30:53'),(11049,'2005-08-02 06:15:40',4352,38,'2005-08-11 10:09:40',2,'2006-02-15 21:30:53'),(11050,'2005-08-02 06:17:16',2077,234,'2005-08-09 05:58:16',1,'2006-02-15 21:30:53'),(11051,'2005-08-02 06:23:39',4189,446,'2005-08-06 06:46:39',2,'2006-02-15 21:30:53'),(11052,'2005-08-02 06:26:19',1089,331,'2005-08-06 04:20:19',2,'2006-02-15 21:30:53'),(11053,'2005-08-02 06:27:13',2599,50,'2005-08-09 11:24:13',2,'2006-02-15 21:30:53'),(11054,'2005-08-02 06:33:07',728,577,'2005-08-10 02:52:07',2,'2006-02-15 21:30:53'),(11055,'2005-08-02 06:36:05',3851,182,'2005-08-06 00:36:05',1,'2006-02-15 21:30:53'),(11056,'2005-08-02 06:36:27',1404,88,'2005-08-10 06:02:27',1,'2006-02-15 21:30:53'),(11057,'2005-08-02 06:38:19',3143,137,'2005-08-11 03:43:19',1,'2006-02-15 21:30:53'),(11058,'2005-08-02 06:38:44',3270,274,'2005-08-06 06:45:44',1,'2006-02-15 21:30:53'),(11059,'2005-08-02 06:41:38',428,189,'2005-08-09 04:34:38',1,'2006-02-15 21:30:53'),(11060,'2005-08-02 06:48:18',3395,496,'2005-08-10 11:49:18',1,'2006-02-15 21:30:53'),(11061,'2005-08-02 06:50:18',809,245,'2005-08-07 07:41:18',2,'2006-02-15 21:30:53'),(11062,'2005-08-02 06:52:54',2014,346,'2005-08-07 10:59:54',1,'2006-02-15 21:30:53'),(11063,'2005-08-02 06:53:48',2261,461,'2005-08-05 03:38:48',2,'2006-02-15 21:30:53'),(11064,'2005-08-02 06:55:17',3012,338,'2005-08-06 03:29:17',1,'2006-02-15 21:30:53'),(11065,'2005-08-02 06:57:55',2226,357,'2005-08-06 01:31:55',2,'2006-02-15 21:30:53'),(11066,'2005-08-02 06:58:32',4213,373,'2005-08-10 01:27:32',2,'2006-02-15 21:30:53'),(11067,'2005-08-02 07:03:24',965,85,'2005-08-10 08:59:24',2,'2006-02-15 21:30:53'),(11068,'2005-08-02 07:08:07',1262,52,'2005-08-09 11:15:07',2,'2006-02-15 21:30:53'),(11069,'2005-08-02 07:09:34',57,4,'2005-08-08 08:39:34',1,'2006-02-15 21:30:53'),(11070,'2005-08-02 07:10:39',4020,298,'2005-08-03 07:43:39',1,'2006-02-15 21:30:53'),(11071,'2005-08-02 07:10:53',4264,294,'2005-08-07 09:58:53',1,'2006-02-15 21:30:53'),(11072,'2005-08-02 07:10:57',3078,21,'2005-08-04 07:42:57',1,'2006-02-15 21:30:53'),(11073,'2005-08-02 07:13:03',4232,234,'2005-08-03 05:46:03',1,'2006-02-15 21:30:53'),(11074,'2005-08-02 07:21:43',1439,277,'2005-08-08 05:18:43',1,'2006-02-15 21:30:53'),(11075,'2005-08-02 07:24:23',3027,503,'2005-08-08 04:55:23',1,'2006-02-15 21:30:53'),(11076,'2005-08-02 07:24:47',837,211,'2005-08-10 09:16:47',1,'2006-02-15 21:30:53'),(11077,'2005-08-02 07:26:43',4254,158,'2005-08-09 10:34:43',2,'2006-02-15 21:30:53'),(11078,'2005-08-02 07:26:58',2362,587,'2005-08-07 01:59:58',2,'2006-02-15 21:30:53'),(11079,'2005-08-02 07:29:10',3185,29,'2005-08-07 01:59:10',2,'2006-02-15 21:30:53'),(11080,'2005-08-02 07:29:56',4303,571,'2005-08-08 05:58:56',1,'2006-02-15 21:30:53'),(11081,'2005-08-02 07:30:14',3804,513,'2005-08-09 08:50:14',1,'2006-02-15 21:30:53'),(11082,'2005-08-02 07:30:19',3037,190,'2005-08-07 05:20:19',2,'2006-02-15 21:30:53'),(11083,'2005-08-02 07:32:01',4395,295,'2005-08-08 02:23:01',1,'2006-02-15 21:30:53'),(11084,'2005-08-02 07:34:19',32,369,'2005-08-07 09:30:19',1,'2006-02-15 21:30:53'),(11085,'2005-08-02 07:36:44',3207,276,'2005-08-04 03:32:44',1,'2006-02-15 21:30:53'),(11086,'2005-08-02 07:38:44',552,371,'2005-08-11 06:30:44',1,'2006-02-15 21:30:53'),(11087,'2005-08-02 07:41:41',654,2,'2005-08-10 10:37:41',2,'2006-02-15 21:30:53'),(11088,'2005-08-02 07:48:31',2739,138,'2005-08-05 08:09:31',2,'2006-02-15 21:30:53'),(11089,'2005-08-02 07:52:20',825,421,'2005-08-07 07:24:20',1,'2006-02-15 21:30:53'),(11090,'2005-08-02 07:56:40',2743,89,'2005-08-10 07:58:40',1,'2006-02-15 21:30:53'),(11091,'2005-08-02 07:56:41',1659,423,'2005-08-07 05:35:41',2,'2006-02-15 21:30:53'),(11092,'2005-08-02 07:58:50',569,60,'2005-08-04 03:23:50',2,'2006-02-15 21:30:53'),(11093,'2005-08-02 07:59:49',239,82,'2005-08-11 06:01:49',1,'2006-02-15 21:30:53'),(11094,'2005-08-02 08:03:02',3095,18,'2005-08-03 11:34:02',1,'2006-02-15 21:30:53'),(11095,'2005-08-02 08:03:20',3517,278,'2005-08-10 05:20:20',1,'2006-02-15 21:30:53'),(11096,'2005-08-02 08:05:19',1436,34,'2005-08-04 07:28:19',2,'2006-02-15 21:30:53'),(11097,'2005-08-02 08:05:46',2493,575,'2005-08-10 12:00:46',2,'2006-02-15 21:30:53'),(11098,'2005-08-02 08:06:18',158,570,'2005-08-11 04:50:18',2,'2006-02-15 21:30:53'),(11099,'2005-08-02 08:07:12',1444,102,'2005-08-07 12:11:12',2,'2006-02-15 21:30:53'),(11100,'2005-08-02 08:08:00',3047,65,'2005-08-10 07:19:00',1,'2006-02-15 21:30:53'),(11101,'2005-08-02 08:08:24',2621,80,'2005-08-06 05:55:24',1,'2006-02-15 21:30:53'),(11102,'2005-08-02 08:08:30',3112,73,'2005-08-04 09:16:30',1,'2006-02-15 21:30:53'),(11103,'2005-08-02 08:09:54',1879,158,'2005-08-07 12:05:54',1,'2006-02-15 21:30:53'),(11104,'2005-08-02 08:09:58',3042,196,'2005-08-05 11:55:58',1,'2006-02-15 21:30:53'),(11105,'2005-08-02 08:13:31',3170,245,'2005-08-03 11:08:31',1,'2006-02-15 21:30:53'),(11106,'2005-08-02 08:17:38',2307,287,'2005-08-03 07:54:38',1,'2006-02-15 21:30:53'),(11107,'2005-08-02 08:19:38',2217,410,'2005-08-07 08:46:38',2,'2006-02-15 21:30:53'),(11108,'2005-08-02 08:20:01',560,447,'2005-08-03 13:22:01',2,'2006-02-15 21:30:53'),(11109,'2005-08-02 08:20:29',2683,479,'2005-08-09 11:35:29',2,'2006-02-15 21:30:53'),(11110,'2005-08-02 08:20:31',4311,4,'2005-08-04 05:06:31',2,'2006-02-15 21:30:53'),(11111,'2005-08-02 08:21:27',334,378,'2005-08-06 07:48:27',2,'2006-02-15 21:30:53'),(11112,'2005-08-02 08:25:14',526,207,'2005-08-03 08:41:14',1,'2006-02-15 21:30:53'),(11113,'2005-08-02 08:26:24',1654,231,'2005-08-07 09:24:24',2,'2006-02-15 21:30:53'),(11114,'2005-08-02 08:26:45',1273,572,'2005-08-03 08:41:45',2,'2006-02-15 21:30:53'),(11115,'2005-08-02 08:31:06',3812,408,'2005-08-04 02:36:06',2,'2006-02-15 21:30:53'),(11116,'2005-08-02 08:34:40',434,344,'2005-08-09 04:56:40',1,'2006-02-15 21:30:53'),(11117,'2005-08-02 08:36:03',1613,474,'2005-08-05 06:56:03',2,'2006-02-15 21:30:53'),(11118,'2005-08-02 08:44:18',2411,15,'2005-08-05 08:08:18',2,'2006-02-15 21:30:53'),(11119,'2005-08-02 08:44:44',4307,489,'2005-08-10 11:32:44',2,'2006-02-15 21:30:53'),(11120,'2005-08-02 08:47:04',4185,322,'2005-08-05 05:33:04',1,'2006-02-15 21:30:53'),(11121,'2005-08-02 08:48:31',1025,572,'2005-08-04 05:08:31',2,'2006-02-15 21:30:53'),(11122,'2005-08-02 08:49:09',3021,383,'2005-08-08 04:33:09',1,'2006-02-15 21:30:53'),(11123,'2005-08-02 08:54:17',1926,150,'2005-08-09 11:11:17',2,'2006-02-15 21:30:53'),(11124,'2005-08-02 08:55:25',698,249,'2005-08-10 10:59:25',1,'2006-02-15 21:30:53'),(11125,'2005-08-02 08:55:35',2081,237,'2005-08-03 09:12:35',1,'2006-02-15 21:30:53'),(11126,'2005-08-02 08:59:04',3310,47,'2005-08-04 11:00:04',1,'2006-02-15 21:30:53'),(11127,'2005-08-02 09:00:59',1106,351,'2005-08-05 11:54:59',2,'2006-02-15 21:30:53'),(11128,'2005-08-02 09:03:25',3472,386,'2005-08-09 04:36:25',1,'2006-02-15 21:30:53'),(11129,'2005-08-02 09:08:44',23,566,'2005-08-04 04:00:44',1,'2006-02-15 21:30:53'),(11130,'2005-08-02 09:08:59',684,329,'2005-08-09 07:50:59',2,'2006-02-15 21:30:53'),(11131,'2005-08-02 09:10:04',1860,293,'2005-08-08 09:59:04',2,'2006-02-15 21:30:53'),(11132,'2005-08-02 09:14:09',2212,398,'2005-08-08 06:39:09',1,'2006-02-15 21:30:53'),(11133,'2005-08-02 09:15:45',675,120,'2005-08-04 10:39:45',1,'2006-02-15 21:30:53'),(11134,'2005-08-02 09:19:22',2641,372,'2005-08-11 03:56:22',1,'2006-02-15 21:30:53'),(11135,'2005-08-02 09:22:25',799,32,'2005-08-04 14:30:25',2,'2006-02-15 21:30:53'),(11136,'2005-08-02 09:22:57',1315,559,'2005-08-08 14:12:57',2,'2006-02-15 21:30:53'),(11137,'2005-08-02 09:25:31',2500,310,'2005-08-08 08:10:31',1,'2006-02-15 21:30:53'),(11138,'2005-08-02 09:26:16',4250,458,'2005-08-11 07:50:16',2,'2006-02-15 21:30:53'),(11139,'2005-08-02 09:27:36',1011,236,'2005-08-08 14:07:36',2,'2006-02-15 21:30:53'),(11140,'2005-08-02 09:27:45',3836,132,'2005-08-05 04:10:45',1,'2006-02-15 21:30:53'),(11141,'2005-08-02 09:29:11',1614,15,'2005-08-04 07:50:11',1,'2006-02-15 21:30:53'),(11142,'2005-08-02 09:30:11',2954,306,'2005-08-05 06:52:11',1,'2006-02-15 21:30:53'),(11143,'2005-08-02 09:32:54',3382,100,'2005-08-05 12:04:54',2,'2006-02-15 21:30:53'),(11144,'2005-08-02 09:39:17',2724,376,'2005-08-03 11:53:17',2,'2006-02-15 21:30:53'),(11145,'2005-08-02 09:43:24',1270,291,'2005-08-05 15:29:24',1,'2006-02-15 21:30:53'),(11146,'2005-08-02 09:45:32',2488,552,'2005-08-07 07:33:32',1,'2006-02-15 21:30:53'),(11147,'2005-08-02 09:45:54',1562,597,'2005-08-07 07:28:54',1,'2006-02-15 21:30:53'),(11148,'2005-08-02 09:47:08',2991,230,'2005-08-08 10:57:08',1,'2006-02-15 21:30:53'),(11149,'2005-08-02 09:51:43',3254,358,'2005-08-11 09:40:43',2,'2006-02-15 21:30:53'),(11150,'2005-08-02 09:51:46',2193,527,'2005-08-05 09:03:46',2,'2006-02-15 21:30:53'),(11151,'2005-08-02 09:52:44',3939,391,'2005-08-05 06:29:44',2,'2006-02-15 21:30:53'),(11152,'2005-08-02 09:53:36',3887,494,'2005-08-11 14:58:36',1,'2006-02-15 21:30:53'),(11153,'2005-08-02 09:54:19',1546,220,'2005-08-10 14:57:19',1,'2006-02-15 21:30:53'),(11154,'2005-08-02 09:54:50',697,160,'2005-08-06 14:48:50',2,'2006-02-15 21:30:53'),(11155,'2005-08-02 09:55:28',2001,73,'2005-08-03 06:00:28',2,'2006-02-15 21:30:53'),(11156,'2005-08-02 09:56:06',907,465,'2005-08-04 13:36:06',2,'2006-02-15 21:30:53'),(11157,'2005-08-02 09:58:15',1313,244,'2005-08-06 04:23:15',2,'2006-02-15 21:30:53'),(11158,'2005-08-02 09:58:28',530,190,'2005-08-10 13:54:28',2,'2006-02-15 21:30:53'),(11159,'2005-08-02 10:00:55',4575,249,'2005-08-05 10:38:55',1,'2006-02-15 21:30:53'),(11160,'2005-08-02 10:05:30',3260,436,'2005-08-07 08:30:30',1,'2006-02-15 21:30:53'),(11161,'2005-08-02 10:05:57',3321,503,'2005-08-06 05:05:57',2,'2006-02-15 21:30:53'),(11162,'2005-08-02 10:07:54',1809,277,'2005-08-05 11:35:54',2,'2006-02-15 21:30:53'),(11163,'2005-08-02 10:08:40',1925,505,'2005-08-05 14:59:40',1,'2006-02-15 21:30:53'),(11164,'2005-08-02 10:10:56',4450,580,'2005-08-10 11:20:56',2,'2006-02-15 21:30:53'),(11165,'2005-08-02 10:12:17',2059,513,'2005-08-04 11:09:17',1,'2006-02-15 21:30:53'),(11166,'2005-08-02 10:14:58',638,11,'2005-08-11 11:43:58',1,'2006-02-15 21:30:53'),(11167,'2005-08-02 10:15:51',148,451,'2005-08-09 09:18:51',1,'2006-02-15 21:30:53'),(11168,'2005-08-02 10:19:42',468,555,'2005-08-04 08:42:42',1,'2006-02-15 21:30:53'),(11169,'2005-08-02 10:19:42',2392,329,'2005-08-07 05:45:42',1,'2006-02-15 21:30:53'),(11170,'2005-08-02 10:21:53',1333,547,'2005-08-08 11:08:53',1,'2006-02-15 21:30:53'),(11171,'2005-08-02 10:23:41',3117,339,'2005-08-04 14:22:41',2,'2006-02-15 21:30:53'),(11172,'2005-08-02 10:27:52',1207,76,'2005-08-11 12:47:52',1,'2006-02-15 21:30:53'),(11173,'2005-08-02 10:28:00',4296,146,'2005-08-10 14:53:00',1,'2006-02-15 21:30:53'),(11174,'2005-08-02 10:32:11',1551,328,'2005-08-09 12:30:11',1,'2006-02-15 21:30:53'),(11175,'2005-08-02 10:38:47',85,164,'2005-08-07 07:11:47',2,'2006-02-15 21:30:53'),(11176,'2005-08-02 10:39:43',1448,37,'2005-08-09 14:42:43',2,'2006-02-15 21:30:53'),(11177,'2005-08-02 10:43:48',1149,2,'2005-08-10 10:55:48',2,'2006-02-15 21:30:53'),(11178,'2005-08-02 10:48:10',2613,342,'2005-08-06 06:07:10',1,'2006-02-15 21:30:53'),(11179,'2005-08-02 10:50:06',4376,5,'2005-08-04 05:24:06',1,'2006-02-15 21:30:53'),(11180,'2005-08-02 10:54:30',3632,534,'2005-08-11 15:55:30',1,'2006-02-15 21:30:53'),(11181,'2005-08-02 10:55:03',3127,557,'2005-08-07 10:43:03',1,'2006-02-15 21:30:53'),(11182,'2005-08-02 10:55:14',605,54,'2005-08-06 05:58:14',1,'2006-02-15 21:30:53'),(11183,'2005-08-02 11:00:32',833,102,'2005-08-04 08:59:32',2,'2006-02-15 21:30:53'),(11184,'2005-08-02 11:01:26',871,259,'2005-08-11 06:29:26',1,'2006-02-15 21:30:53'),(11185,'2005-08-02 11:04:35',1215,469,'2005-08-05 13:48:35',2,'2006-02-15 21:30:53'),(11186,'2005-08-02 11:12:08',733,353,'2005-08-03 10:46:08',1,'2006-02-15 21:30:53'),(11187,'2005-08-02 11:16:19',3626,410,'2005-08-11 06:11:19',1,'2006-02-15 21:30:53'),(11188,'2005-08-02 11:17:11',1372,485,'2005-08-08 16:46:11',2,'2006-02-15 21:30:53'),(11189,'2005-08-02 11:17:23',729,565,'2005-08-09 16:30:23',2,'2006-02-15 21:30:53'),(11190,'2005-08-02 11:21:34',922,254,'2005-08-05 05:23:34',1,'2006-02-15 21:30:53'),(11191,'2005-08-02 11:24:07',1097,571,'2005-08-10 10:39:07',1,'2006-02-15 21:30:53'),(11192,'2005-08-02 11:29:41',1998,349,'2005-08-07 06:01:41',2,'2006-02-15 21:30:53'),(11193,'2005-08-02 11:31:33',2246,292,'2005-08-04 14:00:33',1,'2006-02-15 21:30:53'),(11194,'2005-08-02 11:35:53',2732,135,'2005-08-10 11:28:53',1,'2006-02-15 21:30:53'),(11195,'2005-08-02 11:42:23',4359,177,'2005-08-03 08:29:23',1,'2006-02-15 21:30:53'),(11196,'2005-08-02 11:42:40',2648,126,'2005-08-10 11:58:40',2,'2006-02-15 21:30:53'),(11197,'2005-08-02 11:45:07',3041,122,'2005-08-03 09:07:07',1,'2006-02-15 21:30:53'),(11198,'2005-08-02 11:45:15',2908,540,'2005-08-10 11:42:15',2,'2006-02-15 21:30:53'),(11199,'2005-08-02 11:47:40',3926,578,'2005-08-10 06:52:40',2,'2006-02-15 21:30:53'),(11200,'2005-08-02 11:48:36',2730,98,'2005-08-07 08:35:36',2,'2006-02-15 21:30:53'),(11201,'2005-08-02 11:49:16',1501,195,'2005-08-11 08:39:16',1,'2006-02-15 21:30:53'),(11202,'2005-08-02 11:51:57',3625,231,'2005-08-08 09:41:57',1,'2006-02-15 21:30:53'),(11203,'2005-08-02 11:52:41',4520,92,'2005-08-10 15:52:41',2,'2006-02-15 21:30:53'),(11204,'2005-08-02 11:56:31',3578,247,'2005-08-06 14:16:31',2,'2006-02-15 21:30:53'),(11205,'2005-08-02 11:56:54',4321,552,'2005-08-05 08:24:54',1,'2006-02-15 21:30:53'),(11206,'2005-08-02 11:58:03',4131,72,'2005-08-07 12:36:03',2,'2006-02-15 21:30:53'),(11207,'2005-08-02 12:01:30',4470,481,'2005-08-05 07:56:30',1,'2006-02-15 21:30:53'),(11208,'2005-08-02 12:02:37',4566,320,'2005-08-05 10:56:37',1,'2006-02-15 21:30:53'),(11209,'2005-08-02 12:09:45',3219,24,'2005-08-07 08:52:45',1,'2006-02-15 21:30:53'),(11210,'2005-08-02 12:15:54',422,202,'2005-08-04 16:18:54',2,'2006-02-15 21:30:53'),(11211,'2005-08-02 12:16:48',1722,245,'2005-08-03 10:40:48',1,'2006-02-15 21:30:53'),(11212,'2005-08-02 12:18:29',4007,343,'2005-08-05 16:05:29',2,'2006-02-15 21:30:53'),(11213,'2005-08-02 12:18:35',1007,584,'2005-08-05 08:44:35',2,'2006-02-15 21:30:53'),(11214,'2005-08-02 12:19:50',2722,407,'2005-08-11 06:38:50',1,'2006-02-15 21:30:53'),(11215,'2005-08-02 12:20:42',379,197,'2005-08-06 14:01:42',1,'2006-02-15 21:30:53'),(11216,'2005-08-02 12:23:43',1109,473,'2005-08-03 13:19:43',1,'2006-02-15 21:30:53'),(11217,'2005-08-02 12:26:31',1201,417,'2005-08-09 09:53:31',2,'2006-02-15 21:30:53'),(11218,'2005-08-02 12:29:12',1126,500,'2005-08-10 16:13:12',2,'2006-02-15 21:30:53'),(11219,'2005-08-02 12:30:20',2889,461,'2005-08-08 13:42:20',2,'2006-02-15 21:30:53'),(11220,'2005-08-02 12:31:41',3777,84,'2005-08-05 08:23:41',2,'2006-02-15 21:30:53'),(11221,'2005-08-02 12:32:12',1689,146,'2005-08-03 17:13:12',1,'2006-02-15 21:30:53'),(11222,'2005-08-02 12:32:28',1780,407,'2005-08-11 18:15:28',2,'2006-02-15 21:30:53'),(11223,'2005-08-02 12:34:27',1994,597,'2005-08-07 14:21:27',1,'2006-02-15 21:30:53'),(11224,'2005-08-02 12:40:38',3938,181,'2005-08-04 10:02:38',2,'2006-02-15 21:30:53'),(11225,'2005-08-02 12:43:27',3721,159,'2005-08-04 18:41:27',2,'2006-02-15 21:30:53'),(11226,'2005-08-02 12:47:30',79,282,'2005-08-06 11:24:30',1,'2006-02-15 21:30:53'),(11227,'2005-08-02 12:48:05',1101,65,'2005-08-11 14:08:05',1,'2006-02-15 21:30:53'),(11228,'2005-08-02 12:55:23',2561,144,'2005-08-08 12:31:23',1,'2006-02-15 21:30:53'),(11229,'2005-08-02 12:56:37',941,332,'2005-08-11 11:13:37',2,'2006-02-15 21:30:53'),(11230,'2005-08-02 12:59:08',1463,257,'2005-08-04 13:42:08',1,'2006-02-15 21:30:53'),(11231,'2005-08-02 13:02:11',1100,90,'2005-08-07 10:05:11',2,'2006-02-15 21:30:53'),(11232,'2005-08-02 13:04:12',971,8,'2005-08-10 15:39:12',1,'2006-02-15 21:30:53'),(11233,'2005-08-02 13:06:11',2221,266,'2005-08-08 15:02:11',1,'2006-02-15 21:30:53'),(11234,'2005-08-02 13:12:17',1020,27,'2005-08-05 17:37:17',1,'2006-02-15 21:30:53'),(11235,'2005-08-02 13:13:21',2501,127,'2005-08-03 07:17:21',1,'2006-02-15 21:30:53'),(11236,'2005-08-02 13:17:21',145,420,'2005-08-09 09:53:21',2,'2006-02-15 21:30:53'),(11237,'2005-08-02 13:24:01',2668,426,'2005-08-05 11:41:01',2,'2006-02-15 21:30:53'),(11238,'2005-08-02 13:25:50',2705,506,'2005-08-08 19:12:50',2,'2006-02-15 21:30:53'),(11239,'2005-08-02 13:27:11',189,111,'2005-08-03 14:36:11',1,'2006-02-15 21:30:53'),(11240,'2005-08-02 13:28:30',2170,597,'2005-08-05 11:40:30',1,'2006-02-15 21:30:53'),(11241,'2005-08-02 13:29:24',3657,543,'2005-08-11 11:36:24',2,'2006-02-15 21:30:53'),(11242,'2005-08-02 13:32:00',1041,434,'2005-08-10 19:24:00',2,'2006-02-15 21:30:53'),(11243,'2005-08-02 13:32:48',2517,361,'2005-08-11 18:55:48',1,'2006-02-15 21:30:53'),(11244,'2005-08-02 13:33:24',3423,142,'2005-08-10 10:18:24',2,'2006-02-15 21:30:53'),(11245,'2005-08-02 13:33:50',2609,92,'2005-08-04 10:20:50',2,'2006-02-15 21:30:53'),(11246,'2005-08-02 13:33:56',3577,550,'2005-08-03 08:52:56',2,'2006-02-15 21:30:53'),(11247,'2005-08-02 13:34:08',1661,441,'2005-08-06 16:23:08',2,'2006-02-15 21:30:53'),(11248,'2005-08-02 13:35:34',4139,312,'2005-08-03 10:37:34',1,'2006-02-15 21:30:53'),(11249,'2005-08-02 13:35:40',3394,157,'2005-08-07 11:22:40',1,'2006-02-15 21:30:53'),(11250,'2005-08-02 13:35:42',2223,279,'2005-08-10 12:32:42',2,'2006-02-15 21:30:53'),(11251,'2005-08-02 13:40:49',2181,532,'2005-08-09 14:16:49',2,'2006-02-15 21:30:53'),(11252,'2005-08-02 13:42:13',2410,337,'2005-08-06 19:04:13',2,'2006-02-15 21:30:53'),(11253,'2005-08-02 13:42:44',2898,303,'2005-08-09 17:06:44',2,'2006-02-15 21:30:53'),(11254,'2005-08-02 13:43:49',56,315,'2005-08-08 13:16:49',1,'2006-02-15 21:30:53'),(11255,'2005-08-02 13:44:30',3393,569,'2005-08-03 12:00:30',1,'2006-02-15 21:30:53'),(11256,'2005-08-02 13:44:53',2060,2,'2005-08-04 16:39:53',1,'2006-02-15 21:30:53'),(11257,'2005-08-02 13:45:05',105,468,'2005-08-11 16:37:05',1,'2006-02-15 21:30:53'),(11258,'2005-08-02 13:45:39',1576,242,'2005-08-06 07:57:39',1,'2006-02-15 21:30:53'),(11259,'2005-08-02 13:46:30',896,330,'2005-08-07 14:03:30',1,'2006-02-15 21:30:53'),(11260,'2005-08-02 13:52:19',4015,207,'2005-08-06 08:13:19',2,'2006-02-15 21:30:53'),(11261,'2005-08-02 13:54:26',31,204,'2005-08-10 19:04:26',2,'2006-02-15 21:30:53'),(11262,'2005-08-02 13:58:55',71,348,'2005-08-05 18:09:55',2,'2006-02-15 21:30:53'),(11263,'2005-08-02 14:02:19',1189,421,'2005-08-07 14:03:19',2,'2006-02-15 21:30:53'),(11264,'2005-08-02 14:05:18',3420,360,'2005-08-10 08:46:18',2,'2006-02-15 21:30:53'),(11265,'2005-08-02 14:05:42',3870,531,'2005-08-11 15:27:42',2,'2006-02-15 21:30:53'),(11266,'2005-08-02 14:07:35',3972,99,'2005-08-04 13:31:35',1,'2006-02-15 21:30:53'),(11267,'2005-08-02 14:09:08',2045,244,'2005-08-10 12:33:08',1,'2006-02-15 21:30:53'),(11268,'2005-08-02 14:10:39',3275,558,'2005-08-04 14:35:39',1,'2006-02-15 21:30:53'),(11269,'2005-08-02 14:11:41',2398,297,'2005-08-08 18:53:41',1,'2006-02-15 21:30:53'),(11270,'2005-08-02 14:18:07',1882,418,'2005-08-03 08:20:07',1,'2006-02-15 21:30:53'),(11271,'2005-08-02 14:18:22',4323,93,'2005-08-07 09:35:22',2,'2006-02-15 21:30:53'),(11272,'2005-08-02 14:20:27',4111,158,'2005-08-07 12:24:27',2,'2006-02-15 21:30:53'),(11273,'2005-08-02 14:20:55',3383,541,'2005-08-07 12:57:55',1,'2006-02-15 21:30:53'),(11274,'2005-08-02 14:24:08',1253,70,'2005-08-11 14:56:08',1,'2006-02-15 21:30:53'),(11275,'2005-08-02 14:25:58',2838,464,'2005-08-07 11:20:58',1,'2006-02-15 21:30:53'),(11276,'2005-08-02 14:28:46',4226,190,'2005-08-04 14:00:46',1,'2006-02-15 21:30:53'),(11277,'2005-08-02 14:28:50',2050,68,'2005-08-04 13:50:50',1,'2006-02-15 21:30:53'),(11278,'2005-08-02 14:29:43',961,143,'2005-08-07 10:13:43',1,'2006-02-15 21:30:53'),(11279,'2005-08-02 14:30:03',151,125,'2005-08-10 09:49:03',2,'2006-02-15 21:30:53'),(11280,'2005-08-02 14:34:33',1846,134,'2005-08-08 15:40:33',2,'2006-02-15 21:30:53'),(11281,'2005-08-02 14:35:01',2210,137,'2005-08-07 17:28:01',1,'2006-02-15 21:30:53'),(11282,'2005-08-02 14:35:03',1824,273,'2005-08-03 16:02:03',2,'2006-02-15 21:30:53'),(11283,'2005-08-02 14:39:46',312,134,'2005-08-05 10:19:46',2,'2006-02-15 21:30:53'),(11284,'2005-08-02 14:42:45',172,8,'2005-08-04 11:55:45',2,'2006-02-15 21:30:53'),(11285,'2005-08-02 14:44:02',3849,585,'2005-08-11 16:45:02',2,'2006-02-15 21:30:53'),(11286,'2005-08-02 14:44:22',1319,207,'2005-08-10 09:01:22',2,'2006-02-15 21:30:53'),(11287,'2005-08-02 14:49:51',927,55,'2005-08-09 09:19:51',2,'2006-02-15 21:30:53'),(11288,'2005-08-02 14:54:08',1478,298,'2005-08-11 12:22:08',1,'2006-02-15 21:30:53'),(11289,'2005-08-02 14:55:00',2869,10,'2005-08-11 13:57:00',1,'2006-02-15 21:30:53'),(11290,'2005-08-02 14:57:44',425,582,'2005-08-09 19:36:44',2,'2006-02-15 21:30:53'),(11291,'2005-08-02 14:57:58',491,417,'2005-08-11 09:04:58',2,'2006-02-15 21:30:53'),(11292,'2005-08-02 14:58:41',210,13,'2005-08-06 14:38:41',2,'2006-02-15 21:30:53'),(11293,'2005-08-02 15:00:43',1514,475,'2005-08-11 17:49:43',1,'2006-02-15 21:30:53'),(11294,'2005-08-02 15:08:27',855,411,'2005-08-03 18:28:27',1,'2006-02-15 21:30:53'),(11295,'2005-08-02 15:10:06',423,67,'2005-08-10 09:52:06',1,'2006-02-15 21:30:53'),(11296,'2005-08-02 15:15:27',247,154,'2005-08-11 16:12:27',1,'2006-02-15 21:30:53'),(11297,'2005-08-02 15:22:47',2531,62,'2005-08-11 18:45:47',1,'2006-02-15 21:30:53'),(11298,'2005-08-02 15:32:32',1663,35,'2005-08-06 20:22:32',1,'2006-02-15 21:30:53'),(11299,'2005-08-02 15:36:52',3232,1,'2005-08-10 16:40:52',2,'2006-02-15 21:30:53'),(11300,'2005-08-02 15:37:42',3032,552,'2005-08-11 14:25:42',1,'2006-02-15 21:30:53'),(11301,'2005-08-02 15:37:59',676,502,'2005-08-04 10:57:59',2,'2006-02-15 21:30:53'),(11302,'2005-08-02 15:38:03',1918,51,'2005-08-09 10:33:03',2,'2006-02-15 21:30:53'),(11303,'2005-08-02 15:39:18',1817,417,'2005-08-05 10:59:18',1,'2006-02-15 21:30:53'),(11304,'2005-08-02 15:40:10',2592,413,'2005-08-06 16:12:10',2,'2006-02-15 21:30:53'),(11305,'2005-08-02 15:44:55',1690,341,'2005-08-08 16:42:55',2,'2006-02-15 21:30:53'),(11306,'2005-08-02 15:45:10',13,247,'2005-08-03 21:14:10',2,'2006-02-15 21:30:53'),(11307,'2005-08-02 15:48:08',1490,15,'2005-08-06 20:33:08',2,'2006-02-15 21:30:53'),(11308,'2005-08-02 15:50:44',699,16,'2005-08-05 11:38:44',2,'2006-02-15 21:30:53'),(11309,'2005-08-02 15:50:55',607,275,'2005-08-09 18:28:55',1,'2006-02-15 21:30:53'),(11310,'2005-08-02 15:51:58',3601,415,'2005-08-07 12:34:58',1,'2006-02-15 21:30:53'),(11311,'2005-08-02 15:53:48',204,197,'2005-08-03 16:32:48',1,'2006-02-15 21:30:53'),(11312,'2005-08-02 15:56:51',1093,190,'2005-08-07 20:56:51',2,'2006-02-15 21:30:53'),(11313,'2005-08-02 16:02:51',2689,419,'2005-08-03 14:54:51',1,'2006-02-15 21:30:53'),(11314,'2005-08-02 16:04:08',2790,26,'2005-08-04 18:47:08',1,'2006-02-15 21:30:53'),(11315,'2005-08-02 16:05:17',1116,13,'2005-08-05 16:33:17',1,'2006-02-15 21:30:53'),(11316,'2005-08-02 16:07:49',521,108,'2005-08-10 13:22:49',1,'2006-02-15 21:30:53'),(11317,'2005-08-02 16:08:52',1889,502,'2005-08-08 21:12:52',1,'2006-02-15 21:30:53'),(11318,'2005-08-02 16:09:11',2386,532,'2005-08-07 11:28:11',2,'2006-02-15 21:30:53'),(11319,'2005-08-02 16:10:09',4069,178,'2005-08-09 11:21:09',2,'2006-02-15 21:30:53'),(11320,'2005-08-02 16:13:28',3362,550,'2005-08-05 21:23:28',1,'2006-02-15 21:30:53'),(11321,'2005-08-02 16:15:07',205,266,'2005-08-04 20:35:07',2,'2006-02-15 21:30:53'),(11322,'2005-08-02 16:23:17',761,418,'2005-08-09 19:55:17',2,'2006-02-15 21:30:53'),(11323,'2005-08-02 16:29:57',3784,419,'2005-08-06 16:01:57',1,'2006-02-15 21:30:53'),(11324,'2005-08-02 16:31:17',2900,540,'2005-08-08 15:38:17',2,'2006-02-15 21:30:53'),(11325,'2005-08-02 16:33:11',4514,422,'2005-08-08 13:42:11',1,'2006-02-15 21:30:53'),(11326,'2005-08-02 16:34:29',1762,530,'2005-08-03 17:40:29',2,'2006-02-15 21:30:53'),(11327,'2005-08-02 16:40:47',773,361,'2005-08-03 22:13:47',1,'2006-02-15 21:30:53'),(11328,'2005-08-02 16:42:38',2031,219,'2005-08-04 21:02:38',1,'2006-02-15 21:30:53'),(11329,'2005-08-02 16:42:52',2677,399,'2005-08-08 16:45:52',1,'2006-02-15 21:30:53'),(11330,'2005-08-02 16:45:33',4326,75,'2005-08-04 15:15:33',2,'2006-02-15 21:30:53'),(11331,'2005-08-02 16:49:01',3789,568,'2005-08-09 19:15:01',1,'2006-02-15 21:30:53'),(11332,'2005-08-02 16:52:57',2381,467,'2005-08-04 14:13:57',1,'2006-02-15 21:30:53'),(11333,'2005-08-02 16:53:00',3335,225,'2005-08-07 20:49:00',2,'2006-02-15 21:30:53'),(11334,'2005-08-02 16:53:20',1504,560,'2005-08-11 20:47:20',1,'2006-02-15 21:30:53'),(11335,'2005-08-02 16:57:37',2968,157,'2005-08-09 19:43:37',1,'2006-02-15 21:30:53'),(11336,'2005-08-02 16:58:56',1949,473,'2005-08-06 16:56:56',1,'2006-02-15 21:30:53'),(11337,'2005-08-02 16:59:09',3428,366,'2005-08-10 20:41:09',2,'2006-02-15 21:30:53'),(11338,'2005-08-02 17:00:12',3689,26,'2005-08-03 18:54:12',1,'2006-02-15 21:30:53'),(11339,'2005-08-02 17:02:06',705,263,'2005-08-08 21:12:06',1,'2006-02-15 21:30:53'),(11340,'2005-08-02 17:05:43',1403,366,'2005-08-09 13:25:43',1,'2006-02-15 21:30:53'),(11341,'2005-08-02 17:09:24',3586,15,'2005-08-09 19:48:24',2,'2006-02-15 21:30:53'),(11342,'2005-08-02 17:11:35',4251,179,'2005-08-07 15:04:35',1,'2006-02-15 21:30:53'),(11343,'2005-08-02 17:12:30',564,466,'2005-08-09 12:08:30',1,'2006-02-15 21:30:53'),(11344,'2005-08-02 17:13:26',365,38,'2005-08-07 16:44:26',1,'2006-02-15 21:30:53'),(11345,'2005-08-02 17:14:19',1895,405,'2005-08-11 14:02:19',2,'2006-02-15 21:30:53'),(11346,'2005-08-02 17:15:38',584,100,'2005-08-04 13:31:38',2,'2006-02-15 21:30:53'),(11347,'2005-08-02 17:18:07',195,217,'2005-08-05 12:30:07',1,'2006-02-15 21:30:53'),(11348,'2005-08-02 17:18:38',1704,389,'2005-08-06 16:11:38',2,'2006-02-15 21:30:53'),(11349,'2005-08-02 17:21:49',1871,73,'2005-08-06 18:40:49',1,'2006-02-15 21:30:53'),(11350,'2005-08-02 17:22:59',1265,598,'2005-08-09 19:56:59',2,'2006-02-15 21:30:53'),(11351,'2005-08-02 17:28:07',242,198,'2005-08-09 21:55:07',1,'2006-02-15 21:30:53'),(11352,'2005-08-02 17:29:39',2760,546,'2005-08-10 15:31:39',1,'2006-02-15 21:30:53'),(11353,'2005-08-02 17:34:45',1729,444,'2005-08-09 16:01:45',1,'2006-02-15 21:30:53'),(11354,'2005-08-02 17:35:10',1887,569,'2005-08-09 12:07:10',2,'2006-02-15 21:30:53'),(11355,'2005-08-02 17:37:43',2673,185,'2005-08-05 19:59:43',1,'2006-02-15 21:30:53'),(11356,'2005-08-02 17:42:40',303,200,'2005-08-11 23:29:40',1,'2006-02-15 21:30:53'),(11357,'2005-08-02 17:42:49',2644,148,'2005-08-11 18:14:49',1,'2006-02-15 21:30:53'),(11358,'2005-08-02 17:45:02',2361,56,'2005-08-11 18:16:02',1,'2006-02-15 21:30:53'),(11359,'2005-08-02 17:45:55',1648,466,'2005-08-10 20:53:55',2,'2006-02-15 21:30:53'),(11360,'2005-08-02 17:46:04',1750,66,'2005-08-04 21:02:04',2,'2006-02-15 21:30:53'),(11361,'2005-08-02 17:46:34',1124,547,'2005-08-03 15:21:34',1,'2006-02-15 21:30:53'),(11362,'2005-08-02 17:47:25',2628,331,'2005-08-07 20:14:25',1,'2006-02-15 21:30:53'),(11363,'2005-08-02 17:48:39',3190,274,'2005-08-05 17:20:39',1,'2006-02-15 21:30:53'),(11364,'2005-08-02 17:53:36',4515,44,'2005-08-03 14:16:36',1,'2006-02-15 21:30:53'),(11365,'2005-08-02 18:00:09',1151,508,'2005-08-04 13:40:09',2,'2006-02-15 21:30:53'),(11366,'2005-08-02 18:01:25',3583,280,'2005-08-11 15:02:25',1,'2006-02-15 21:30:53'),(11367,'2005-08-02 18:01:38',1440,1,'2005-08-04 13:19:38',1,'2006-02-15 21:30:53'),(11368,'2005-08-02 18:03:05',866,153,'2005-08-07 20:40:05',1,'2006-02-15 21:30:53'),(11369,'2005-08-02 18:04:41',2480,480,'2005-08-09 18:41:41',1,'2006-02-15 21:30:53'),(11370,'2005-08-02 18:06:01',3077,146,'2005-08-04 15:10:01',1,'2006-02-15 21:30:53'),(11371,'2005-08-02 18:07:36',324,561,'2005-08-06 17:52:36',1,'2006-02-15 21:30:53'),(11372,'2005-08-02 18:10:50',796,327,'2005-08-07 17:58:50',1,'2006-02-15 21:30:53'),(11373,'2005-08-02 18:14:12',181,267,'2005-08-06 23:37:12',1,'2006-02-15 21:30:53'),(11374,'2005-08-02 18:14:54',2805,424,'2005-08-04 18:22:54',1,'2006-02-15 21:30:53'),(11375,'2005-08-02 18:14:56',1064,346,'2005-08-08 23:29:56',1,'2006-02-15 21:30:53'),(11376,'2005-08-02 18:16:00',2530,177,'2005-08-11 23:38:00',2,'2006-02-15 21:30:53'),(11377,'2005-08-02 18:16:47',3334,119,'2005-08-08 13:46:47',1,'2006-02-15 21:30:53'),(11378,'2005-08-02 18:16:52',3824,188,'2005-08-03 14:25:52',1,'2006-02-15 21:30:53'),(11379,'2005-08-02 18:16:55',251,61,'2005-08-07 18:12:55',1,'2006-02-15 21:30:53'),(11380,'2005-08-02 18:17:32',1046,551,'2005-08-03 19:26:32',2,'2006-02-15 21:30:53'),(11381,'2005-08-02 18:19:29',993,451,'2005-08-08 20:39:29',2,'2006-02-15 21:30:53'),(11382,'2005-08-02 18:20:52',3848,407,'2005-08-07 17:06:52',1,'2006-02-15 21:30:53'),(11383,'2005-08-02 18:22:05',257,445,'2005-08-11 17:18:05',1,'2006-02-15 21:30:53'),(11384,'2005-08-02 18:23:01',2840,225,'2005-08-05 17:59:01',1,'2006-02-15 21:30:53'),(11385,'2005-08-02 18:23:11',2478,192,'2005-08-06 12:37:11',1,'2006-02-15 21:30:53'),(11386,'2005-08-02 18:24:03',519,183,'2005-08-06 21:22:03',1,'2006-02-15 21:30:53'),(11387,'2005-08-02 18:32:38',2491,481,'2005-08-07 19:08:38',2,'2006-02-15 21:30:53'),(11388,'2005-08-02 18:35:55',477,369,'2005-08-09 21:56:55',1,'2006-02-15 21:30:53'),(11389,'2005-08-02 18:39:12',3267,270,'2005-08-03 23:23:12',2,'2006-02-15 21:30:53'),(11390,'2005-08-02 18:39:16',3135,294,'2005-08-04 21:43:16',1,'2006-02-15 21:30:53'),(11391,'2005-08-02 18:40:12',2039,403,'2005-08-10 15:55:12',1,'2006-02-15 21:30:53'),(11392,'2005-08-02 18:41:11',261,146,'2005-08-11 21:41:11',1,'2006-02-15 21:30:53'),(11393,'2005-08-02 18:44:29',1033,501,'2005-08-11 23:58:29',1,'2006-02-15 21:30:53'),(11394,'2005-08-02 18:44:45',2087,257,'2005-08-06 22:51:45',2,'2006-02-15 21:30:53'),(11395,'2005-08-02 18:47:44',4234,225,'2005-08-10 17:07:44',2,'2006-02-15 21:30:53'),(11396,'2005-08-02 18:48:29',1155,59,'2005-08-04 16:05:29',2,'2006-02-15 21:30:53'),(11397,'2005-08-02 18:53:14',2566,470,'2005-08-09 18:09:14',1,'2006-02-15 21:30:53'),(11398,'2005-08-02 18:55:15',3952,6,'2005-08-10 19:50:15',2,'2006-02-15 21:30:53'),(11399,'2005-08-02 18:56:28',2094,565,'2005-08-11 23:19:28',1,'2006-02-15 21:30:53'),(11400,'2005-08-02 19:00:52',3150,9,'2005-08-09 19:45:52',2,'2006-02-15 21:30:53'),(11401,'2005-08-02 19:05:06',1799,544,'2005-08-09 22:34:06',1,'2006-02-15 21:30:53'),(11402,'2005-08-02 19:07:21',3291,561,'2005-08-07 20:59:21',1,'2006-02-15 21:30:53'),(11403,'2005-08-02 19:10:21',4072,587,'2005-08-04 00:44:21',2,'2006-02-15 21:30:53'),(11404,'2005-08-02 19:12:40',3285,60,'2005-08-11 22:38:40',2,'2006-02-15 21:30:53'),(11405,'2005-08-02 19:13:39',418,10,'2005-08-07 19:19:39',2,'2006-02-15 21:30:53'),(11406,'2005-08-02 19:16:10',2502,525,'2005-08-04 20:51:10',2,'2006-02-15 21:30:53'),(11407,'2005-08-02 19:18:43',3437,513,'2005-08-08 16:15:43',2,'2006-02-15 21:30:53'),(11408,'2005-08-02 19:25:13',1779,83,'2005-08-06 17:12:13',1,'2006-02-15 21:30:53'),(11409,'2005-08-02 19:26:51',3691,418,'2005-08-07 19:55:51',1,'2006-02-15 21:30:53'),(11410,'2005-08-02 19:29:01',692,592,'2005-08-11 16:50:01',1,'2006-02-15 21:30:53'),(11411,'2005-08-02 19:29:47',1497,141,'2005-08-09 16:27:47',2,'2006-02-15 21:30:53'),(11412,'2005-08-02 19:32:51',2271,141,'2005-08-11 22:16:51',1,'2006-02-15 21:30:53'),(11413,'2005-08-02 19:35:19',1115,297,'2005-08-05 21:33:19',2,'2006-02-15 21:30:53'),(11414,'2005-08-02 19:43:07',1772,353,'2005-08-07 15:22:07',2,'2006-02-15 21:30:53'),(11415,'2005-08-02 19:43:38',2197,572,'2005-08-10 15:13:38',1,'2006-02-15 21:30:53'),(11416,'2005-08-02 19:44:04',1848,58,'2005-08-11 15:30:04',1,'2006-02-15 21:30:53'),(11417,'2005-08-02 19:44:46',3083,437,'2005-08-11 21:43:46',2,'2006-02-15 21:30:53'),(11418,'2005-08-02 19:45:33',4490,91,'2005-08-06 17:40:33',1,'2006-02-15 21:30:53'),(11419,'2005-08-02 19:46:38',514,444,'2005-08-11 14:49:38',1,'2006-02-15 21:30:53'),(11420,'2005-08-02 19:47:56',3928,158,'2005-08-05 21:48:56',2,'2006-02-15 21:30:53'),(11421,'2005-08-02 19:51:53',3361,473,'2005-08-12 00:50:53',2,'2006-02-15 21:30:53'),(11422,'2005-08-02 19:52:08',342,72,'2005-08-11 18:40:08',2,'2006-02-15 21:30:53'),(11423,'2005-08-02 19:57:13',3431,241,'2005-08-06 00:54:13',2,'2006-02-15 21:30:53'),(11424,'2005-08-02 19:57:42',1030,84,'2005-08-10 16:57:42',2,'2006-02-15 21:30:53'),(11425,'2005-08-02 19:58:48',989,419,'2005-08-03 19:30:48',2,'2006-02-15 21:30:53'),(11426,'2005-08-02 20:00:09',130,572,'2005-08-09 01:30:09',2,'2006-02-15 21:30:53'),(11427,'2005-08-02 20:02:39',3287,403,'2005-08-04 22:26:39',2,'2006-02-15 21:30:53'),(11428,'2005-08-02 20:03:10',722,326,'2005-08-04 01:55:10',1,'2006-02-15 21:30:53'),(11429,'2005-08-02 20:03:52',1098,348,'2005-08-10 16:38:52',2,'2006-02-15 21:30:53'),(11430,'2005-08-02 20:04:36',2258,140,'2005-08-08 19:43:36',1,'2006-02-15 21:30:53'),(11431,'2005-08-02 20:05:16',1409,271,'2005-08-04 00:05:16',2,'2006-02-15 21:30:53'),(11432,'2005-08-02 20:10:01',959,540,'2005-08-07 01:28:01',1,'2006-02-15 21:30:53'),(11433,'2005-08-02 20:13:10',1,518,'2005-08-11 21:35:10',1,'2006-02-15 21:30:53'),(11434,'2005-08-02 20:13:14',3154,391,'2005-08-05 15:01:14',1,'2006-02-15 21:30:53'),(11435,'2005-08-02 20:14:23',1625,502,'2005-08-05 20:40:23',1,'2006-02-15 21:30:53'),(11436,'2005-08-02 20:16:06',3834,106,'2005-08-05 20:40:06',2,'2006-02-15 21:30:53'),(11437,'2005-08-02 20:20:06',2679,225,'2005-08-05 22:17:06',2,'2006-02-15 21:30:53'),(11438,'2005-08-02 20:21:08',1040,372,'2005-08-10 22:12:08',1,'2006-02-15 21:30:53'),(11439,'2005-08-02 20:22:45',2897,18,'2005-08-04 18:30:45',1,'2006-02-15 21:30:53'),(11440,'2005-08-02 20:24:02',2727,306,'2005-08-07 16:42:02',2,'2006-02-15 21:30:53'),(11441,'2005-08-02 20:25:41',1027,389,'2005-08-05 00:05:41',2,'2006-02-15 21:30:53'),(11442,'2005-08-02 20:26:19',2598,208,'2005-08-07 00:33:19',2,'2006-02-15 21:30:53'),(11443,'2005-08-02 20:29:30',1291,581,'2005-08-07 01:08:30',2,'2006-02-15 21:30:53'),(11444,'2005-08-02 20:32:55',1419,28,'2005-08-08 23:21:55',2,'2006-02-15 21:30:53'),(11445,'2005-08-02 20:33:35',3340,108,'2005-08-08 16:02:35',2,'2006-02-15 21:30:53'),(11446,'2005-08-02 20:33:37',748,342,'2005-08-03 18:22:37',1,'2006-02-15 21:30:53'),(11447,'2005-08-02 20:36:25',3868,508,'2005-08-07 18:52:25',1,'2006-02-15 21:30:53'),(11448,'2005-08-02 20:44:33',1185,496,'2005-08-05 22:58:33',2,'2006-02-15 21:30:53'),(11449,'2005-08-02 20:44:43',3279,443,'2005-08-07 23:47:43',2,'2006-02-15 21:30:53'),(11450,'2005-08-02 20:45:54',2009,214,'2005-08-08 17:17:54',2,'2006-02-15 21:30:53'),(11451,'2005-08-02 20:45:56',776,515,'2005-08-06 21:42:56',2,'2006-02-15 21:30:53'),(11452,'2005-08-02 20:59:52',1245,35,'2005-08-12 01:16:52',1,'2006-02-15 21:30:53'),(11453,'2005-08-02 21:00:05',4578,84,'2005-08-08 22:03:05',2,'2006-02-15 21:30:53'),(11454,'2005-08-02 21:04:39',2901,199,'2005-08-05 19:03:39',1,'2006-02-15 21:30:53'),(11455,'2005-08-02 21:07:06',2000,498,'2005-08-12 01:21:06',1,'2006-02-15 21:30:53'),(11456,'2005-08-02 21:14:04',3638,322,'2005-08-07 19:49:04',2,'2006-02-15 21:30:53'),(11457,'2005-08-02 21:14:16',1642,379,'2005-08-10 02:39:16',2,'2006-02-15 21:30:53'),(11458,'2005-08-02 21:24:02',3514,575,'2005-08-04 01:32:02',2,'2006-02-15 21:30:53'),(11459,'2005-08-02 21:25:25',3730,392,'2005-08-04 19:57:25',2,'2006-02-15 21:30:53'),(11460,'2005-08-02 21:28:03',4113,403,'2005-08-08 18:24:03',1,'2006-02-15 21:30:53'),(11461,'2005-08-02 21:35:00',4343,65,'2005-08-05 01:34:00',1,'2006-02-15 21:30:53'),(11462,'2005-08-02 21:36:46',167,268,'2005-08-10 01:48:46',1,'2006-02-15 21:30:53'),(11463,'2005-08-02 21:37:36',1944,138,'2005-08-08 03:11:36',2,'2006-02-15 21:30:53'),(11464,'2005-08-02 21:42:07',538,577,'2005-08-03 21:44:07',2,'2006-02-15 21:30:53'),(11465,'2005-08-02 21:43:52',2190,447,'2005-08-10 22:24:52',1,'2006-02-15 21:30:53'),(11466,'2005-08-02 21:46:46',3363,556,'2005-08-06 01:42:46',1,'2006-02-15 21:30:53'),(11467,'2005-08-02 21:47:07',246,117,'2005-08-09 00:50:07',1,'2006-02-15 21:30:53'),(11468,'2005-08-02 21:47:26',3168,413,'2005-08-05 02:30:26',2,'2006-02-15 21:30:53'),(11469,'2005-08-02 21:48:09',230,77,'2005-08-06 18:37:09',1,'2006-02-15 21:30:53'),(11470,'2005-08-02 21:48:28',2379,346,'2005-08-05 23:58:28',2,'2006-02-15 21:30:53'),(11471,'2005-08-02 21:49:03',3378,355,'2005-08-08 00:17:03',1,'2006-02-15 21:30:53'),(11472,'2005-08-02 21:49:06',1829,410,'2005-08-11 20:17:06',1,'2006-02-15 21:30:53'),(11473,'2005-08-02 21:52:03',620,536,'2005-08-09 02:01:03',1,'2006-02-15 21:30:53'),(11474,'2005-08-02 21:53:08',574,214,'2005-08-05 22:36:08',1,'2006-02-15 21:30:53'),(11475,'2005-08-02 21:55:09',3687,194,'2005-08-09 20:28:09',2,'2006-02-15 21:30:53'),(11476,'2005-08-02 22:03:47',724,144,'2005-08-09 02:19:47',1,'2006-02-15 21:30:53'),(11477,'2005-08-02 22:09:01',1671,47,'2005-08-07 03:46:01',2,'2006-02-15 21:30:53'),(11478,'2005-08-02 22:09:05',3932,197,'2005-08-04 18:02:05',1,'2006-02-15 21:30:53'),(11479,'2005-08-02 22:18:13',4077,237,'2005-08-12 00:43:13',1,'2006-02-15 21:30:53'),(11480,'2005-08-02 22:18:24',4161,14,'2005-08-04 21:22:24',2,'2006-02-15 21:30:53'),(11481,'2005-08-02 22:18:41',4028,234,'2005-08-09 23:43:41',2,'2006-02-15 21:30:53'),(11482,'2005-08-02 22:24:31',1400,134,'2005-08-04 01:48:31',1,'2006-02-15 21:30:53'),(11483,'2005-08-02 22:28:22',1586,45,'2005-08-11 18:06:22',1,'2006-02-15 21:30:53'),(11484,'2005-08-02 22:28:23',330,165,'2005-08-04 20:51:23',2,'2006-02-15 21:30:53'),(11485,'2005-08-02 22:33:25',1872,326,'2005-08-04 23:26:25',2,'2006-02-15 21:30:53'),(11486,'2005-08-02 22:34:06',1610,236,'2005-08-09 00:46:06',2,'2006-02-15 21:30:53'),(11487,'2005-08-02 22:35:05',734,239,'2005-08-08 00:54:05',2,'2006-02-15 21:30:53'),(11488,'2005-08-02 22:35:15',2520,45,'2005-08-09 00:28:15',2,'2006-02-15 21:30:53'),(11489,'2005-08-02 22:35:28',3001,474,'2005-08-04 00:29:28',2,'2006-02-15 21:30:53'),(11490,'2005-08-02 22:36:00',1178,156,'2005-08-09 16:36:00',1,'2006-02-15 21:30:53'),(11491,'2005-08-02 22:44:50',268,307,'2005-08-11 01:55:50',2,'2006-02-15 21:30:53'),(11492,'2005-08-02 22:46:47',4037,349,'2005-08-09 19:54:47',2,'2006-02-15 21:30:53'),(11493,'2005-08-02 22:47:00',3375,124,'2005-08-10 20:53:00',2,'2006-02-15 21:30:53'),(11494,'2005-08-02 22:51:23',3994,579,'2005-08-09 01:52:23',1,'2006-02-15 21:30:53'),(11495,'2005-08-16 22:51:20',1265,247,'2005-08-23 00:44:20',1,'2006-02-15 21:30:53'),(11496,'2006-02-14 15:16:03',2047,155,NULL,1,'2006-02-15 21:30:53'),(11497,'2005-08-16 22:52:30',436,12,'2005-08-21 19:52:30',1,'2006-02-15 21:30:53'),(11498,'2005-08-16 22:52:54',487,482,'2005-08-25 03:27:54',2,'2006-02-15 21:30:53'),(11499,'2005-08-16 22:54:12',3857,172,'2005-08-24 03:37:12',2,'2006-02-15 21:30:53'),(11500,'2005-08-16 23:01:22',4003,584,'2005-08-24 22:54:22',1,'2006-02-15 21:30:53'),(11501,'2005-08-16 23:04:53',2147,23,'2005-08-19 20:57:53',2,'2006-02-15 21:30:53'),(11502,'2005-08-16 23:06:30',4470,11,'2005-08-19 03:49:30',1,'2006-02-15 21:30:53'),(11503,'2005-08-16 23:10:34',1496,526,'2005-08-25 03:55:34',1,'2006-02-15 21:30:53'),(11504,'2005-08-16 23:16:46',2132,350,'2005-08-18 20:49:46',2,'2006-02-15 21:30:53'),(11505,'2005-08-16 23:18:47',3344,34,'2005-08-23 19:52:47',2,'2006-02-15 21:30:53'),(11506,'2005-08-16 23:25:48',1529,565,'2005-08-22 18:17:48',1,'2006-02-15 21:30:53'),(11507,'2005-08-16 23:26:43',4197,236,'2005-08-24 22:48:43',2,'2006-02-15 21:30:53'),(11508,'2005-08-16 23:27:36',2688,19,'2005-08-25 01:34:36',2,'2006-02-15 21:30:53'),(11509,'2005-08-16 23:29:53',2750,273,'2005-08-19 02:09:53',1,'2006-02-15 21:30:53'),(11510,'2005-08-16 23:30:07',2997,400,'2005-08-25 17:35:07',1,'2006-02-15 21:30:53'),(11511,'2005-08-16 23:39:59',2127,397,'2005-08-18 18:04:59',1,'2006-02-15 21:30:53'),(11512,'2005-08-16 23:51:06',1248,373,'2005-08-26 02:06:06',2,'2006-02-15 21:30:53'),(11513,'2005-08-16 23:51:33',4473,499,'2005-08-24 01:37:33',2,'2006-02-15 21:30:53'),(11514,'2005-08-16 23:53:10',4240,423,'2005-08-23 22:04:10',1,'2006-02-15 21:30:53'),(11515,'2005-08-16 23:54:34',1053,279,'2005-08-21 19:00:34',1,'2006-02-15 21:30:53'),(11516,'2005-08-16 23:54:47',1860,90,'2005-08-17 20:05:47',1,'2006-02-15 21:30:53'),(11517,'2005-08-16 23:56:28',4266,280,'2005-08-21 22:40:28',1,'2006-02-15 21:30:53'),(11518,'2005-08-16 23:59:49',3297,407,'2005-08-17 22:51:49',2,'2006-02-15 21:30:53'),(11519,'2005-08-17 00:01:27',1034,381,'2005-08-19 04:54:27',2,'2006-02-15 21:30:53'),(11520,'2005-08-17 00:04:28',3536,119,'2005-08-26 02:03:28',1,'2006-02-15 21:30:53'),(11521,'2005-08-17 00:04:54',463,229,'2005-08-21 00:57:54',1,'2006-02-15 21:30:53'),(11522,'2005-08-17 00:05:05',2033,599,'2005-08-24 04:56:05',1,'2006-02-15 21:30:53'),(11523,'2005-08-17 00:10:10',1329,421,'2005-08-24 22:39:10',1,'2006-02-15 21:30:53'),(11524,'2005-08-17 00:10:55',317,533,'2005-08-23 05:30:55',1,'2006-02-15 21:30:53'),(11525,'2005-08-17 00:15:31',1107,174,'2005-08-20 21:14:31',1,'2006-02-15 21:30:53'),(11526,'2005-08-17 00:17:38',2419,572,'2005-08-18 03:59:38',2,'2006-02-15 21:30:53'),(11527,'2005-08-17 00:25:06',162,264,'2005-08-22 21:13:06',1,'2006-02-15 21:30:53'),(11528,'2005-08-17 00:27:23',893,14,'2005-08-22 06:12:23',2,'2006-02-15 21:30:53'),(11529,'2005-08-17 00:28:01',3071,4,'2005-08-19 04:47:01',2,'2006-02-15 21:30:53'),(11530,'2005-08-17 00:29:00',365,400,'2005-08-22 03:22:00',1,'2006-02-15 21:30:53'),(11531,'2005-08-17 00:30:04',1817,278,'2005-08-20 01:12:04',2,'2006-02-15 21:30:53'),(11532,'2005-08-17 00:34:14',1947,413,'2005-08-22 19:37:14',2,'2006-02-15 21:30:53'),(11533,'2005-08-17 00:34:53',4252,264,'2005-08-22 06:10:53',1,'2006-02-15 21:30:53'),(11534,'2005-08-17 00:35:27',2414,144,'2005-08-24 01:36:27',1,'2006-02-15 21:30:53'),(11535,'2005-08-17 00:39:54',1649,356,'2005-08-24 20:46:54',2,'2006-02-15 21:30:53'),(11536,'2005-08-17 00:40:03',2735,428,'2005-08-21 19:11:03',1,'2006-02-15 21:30:53'),(11537,'2005-08-17 00:41:08',190,474,'2005-08-19 00:25:08',2,'2006-02-15 21:30:53'),(11538,'2005-08-17 00:44:04',554,431,'2005-08-18 03:43:04',2,'2006-02-15 21:30:53'),(11539,'2005-08-17 00:45:41',2064,264,'2005-08-19 06:03:41',1,'2006-02-15 21:30:53'),(11540,'2005-08-17 00:48:03',3385,370,'2005-08-25 03:46:03',1,'2006-02-15 21:30:53'),(11541,'2006-02-14 15:16:03',2026,335,NULL,1,'2006-02-15 21:30:53'),(11542,'2005-08-17 00:51:32',2155,7,'2005-08-24 20:29:32',2,'2006-02-15 21:30:53'),(11543,'2005-08-17 00:54:28',2860,238,'2005-08-25 04:31:28',2,'2006-02-15 21:30:53'),(11544,'2005-08-17 00:55:07',836,439,'2005-08-22 19:25:07',1,'2006-02-15 21:30:53'),(11545,'2005-08-17 00:56:06',3198,257,'2005-08-25 22:47:06',1,'2006-02-15 21:30:53'),(11546,'2005-08-17 00:57:36',2522,24,'2005-08-18 23:16:36',1,'2006-02-15 21:30:53'),(11547,'2005-08-17 00:59:24',737,114,'2005-08-20 04:03:24',2,'2006-02-15 21:30:53'),(11548,'2005-08-17 00:59:47',480,323,'2005-08-22 05:09:47',1,'2006-02-15 21:30:53'),(11549,'2005-08-17 01:01:48',945,402,'2005-08-19 21:24:48',2,'2006-02-15 21:30:53'),(11550,'2005-08-17 01:02:06',2972,339,'2005-08-22 21:44:06',1,'2006-02-15 21:30:53'),(11551,'2005-08-17 01:03:49',3356,168,'2005-08-18 22:31:49',1,'2006-02-15 21:30:53'),(11552,'2005-08-17 01:04:29',1143,230,'2005-08-23 23:07:29',1,'2006-02-15 21:30:53'),(11553,'2005-08-17 01:04:31',3317,360,'2005-08-24 00:44:31',1,'2006-02-15 21:30:53'),(11554,'2005-08-17 01:05:17',2212,460,'2005-08-20 06:20:17',2,'2006-02-15 21:30:53'),(11555,'2005-08-17 01:08:59',2569,372,'2005-08-18 06:09:59',2,'2006-02-15 21:30:53'),(11556,'2005-08-17 01:11:53',373,9,'2005-08-18 23:41:53',1,'2006-02-15 21:30:53'),(11557,'2005-08-17 01:19:20',2376,416,'2005-08-24 02:25:20',1,'2006-02-15 21:30:53'),(11558,'2005-08-17 01:19:52',1681,403,'2005-08-19 00:47:52',2,'2006-02-15 21:30:53'),(11559,'2005-08-17 01:20:26',1812,385,'2005-08-24 03:11:26',1,'2006-02-15 21:30:53'),(11560,'2005-08-17 01:20:30',2316,320,'2005-08-18 04:29:30',2,'2006-02-15 21:30:53'),(11561,'2005-08-17 01:23:09',189,149,'2005-08-23 21:02:09',2,'2006-02-15 21:30:53'),(11562,'2005-08-17 01:23:39',2992,424,'2005-08-26 06:16:39',1,'2006-02-15 21:30:53'),(11563,'2006-02-14 15:16:03',1545,83,NULL,1,'2006-02-15 21:30:53'),(11564,'2005-08-17 01:27:49',2237,332,'2005-08-19 22:07:49',1,'2006-02-15 21:30:53'),(11565,'2005-08-17 01:28:05',173,83,'2005-08-23 23:33:05',2,'2006-02-15 21:30:53'),(11566,'2005-08-17 01:28:35',4020,520,'2005-08-20 22:42:35',1,'2006-02-15 21:30:53'),(11567,'2005-08-17 01:28:43',567,558,'2005-08-24 20:20:43',2,'2006-02-15 21:30:53'),(11568,'2005-08-17 01:30:01',183,342,'2005-08-18 22:21:01',2,'2006-02-15 21:30:53'),(11569,'2005-08-17 01:31:04',2592,504,'2005-08-24 03:36:04',2,'2006-02-15 21:30:53'),(11570,'2005-08-17 01:34:32',2466,343,'2005-08-24 05:47:32',1,'2006-02-15 21:30:53'),(11571,'2005-08-17 01:37:51',203,296,'2005-08-17 20:30:51',1,'2006-02-15 21:30:53'),(11572,'2005-08-17 01:37:55',3512,515,'2005-08-19 06:22:55',2,'2006-02-15 21:30:53'),(11573,'2005-08-17 01:38:18',639,146,'2005-08-19 05:06:18',2,'2006-02-15 21:30:53'),(11574,'2005-08-17 01:38:19',3596,277,'2005-08-18 20:30:19',2,'2006-02-15 21:30:53'),(11575,'2005-08-17 01:50:26',1725,319,'2005-08-18 00:43:26',1,'2006-02-15 21:30:53'),(11576,'2005-08-17 01:53:20',327,293,'2005-08-19 00:15:20',1,'2006-02-15 21:30:53'),(11577,'2006-02-14 15:16:03',4106,219,NULL,2,'2006-02-15 21:30:53'),(11578,'2005-08-17 01:54:13',192,590,'2005-08-26 02:00:13',2,'2006-02-15 21:30:53'),(11579,'2005-08-17 01:57:49',4256,356,'2005-08-22 02:42:49',1,'2006-02-15 21:30:53'),(11580,'2005-08-17 01:59:07',1346,436,'2005-08-21 06:18:07',2,'2006-02-15 21:30:53'),(11581,'2005-08-17 02:03:02',1249,231,'2005-08-24 03:53:02',2,'2006-02-15 21:30:53'),(11582,'2005-08-17 02:03:49',2115,339,'2005-08-24 03:29:49',1,'2006-02-15 21:30:53'),(11583,'2005-08-17 02:08:13',133,542,'2005-08-20 23:13:13',2,'2006-02-15 21:30:53'),(11584,'2005-08-17 02:13:26',3906,479,'2005-08-22 01:24:26',2,'2006-02-15 21:30:53'),(11585,'2005-08-17 02:14:36',753,297,'2005-08-20 07:37:36',2,'2006-02-15 21:30:53'),(11586,'2005-08-17 02:20:42',3140,465,'2005-08-26 05:01:42',1,'2006-02-15 21:30:53'),(11587,'2005-08-17 02:21:03',1319,156,'2005-08-25 21:02:03',2,'2006-02-15 21:30:53'),(11588,'2005-08-17 02:26:23',2480,565,'2005-08-22 02:32:23',1,'2006-02-15 21:30:53'),(11589,'2005-08-17 02:28:22',3480,554,'2005-08-25 00:08:22',1,'2006-02-15 21:30:53'),(11590,'2005-08-17 02:28:33',3600,491,'2005-08-20 03:13:33',1,'2006-02-15 21:30:53'),(11591,'2005-08-17 02:29:41',1670,6,'2005-08-23 20:47:41',1,'2006-02-15 21:30:53'),(11592,'2005-08-17 02:36:04',720,383,'2005-08-19 00:31:04',1,'2006-02-15 21:30:53'),(11593,'2006-02-14 15:16:03',817,99,NULL,1,'2006-02-15 21:30:53'),(11594,'2005-08-17 02:47:02',319,198,'2005-08-22 05:14:02',2,'2006-02-15 21:30:53'),(11595,'2005-08-17 02:53:14',466,350,'2005-08-26 02:05:14',1,'2006-02-15 21:30:53'),(11596,'2005-08-17 02:53:55',1674,290,'2005-08-26 02:19:55',1,'2006-02-15 21:30:53'),(11597,'2005-08-17 03:02:56',4073,272,'2005-08-26 04:47:56',1,'2006-02-15 21:30:53'),(11598,'2005-08-17 03:03:07',1949,319,'2005-08-22 21:05:07',2,'2006-02-15 21:30:53'),(11599,'2005-08-17 03:08:10',3749,112,'2005-08-25 05:01:10',2,'2006-02-15 21:30:53'),(11600,'2005-08-17 03:12:04',1978,400,'2005-08-23 07:10:04',1,'2006-02-15 21:30:53'),(11601,'2005-08-17 03:14:47',1098,471,'2005-08-20 00:21:47',2,'2006-02-15 21:30:53'),(11602,'2005-08-17 03:21:19',2082,391,'2005-08-19 05:23:19',1,'2006-02-15 21:30:53'),(11603,'2005-08-17 03:22:10',3910,406,'2005-08-18 06:48:10',1,'2006-02-15 21:30:53'),(11604,'2005-08-17 03:28:27',1820,388,'2005-08-19 05:38:27',2,'2006-02-15 21:30:53'),(11605,'2005-08-17 03:30:57',1292,455,'2005-08-24 07:02:57',2,'2006-02-15 21:30:53'),(11606,'2005-08-17 03:32:43',4138,499,'2005-08-18 04:30:43',1,'2006-02-15 21:30:53'),(11607,'2005-08-17 03:36:06',4345,242,'2005-08-20 01:06:06',1,'2006-02-15 21:30:53'),(11608,'2005-08-17 03:36:52',1673,448,'2005-08-25 07:17:52',2,'2006-02-15 21:30:53'),(11609,'2005-08-17 03:41:11',351,73,'2005-08-25 01:30:11',2,'2006-02-15 21:30:53'),(11610,'2005-08-17 03:43:37',3048,275,'2005-08-20 22:14:37',1,'2006-02-15 21:30:53'),(11611,'2006-02-14 15:16:03',1857,192,NULL,2,'2006-02-15 21:30:53'),(11612,'2005-08-17 03:48:51',375,526,'2005-08-20 03:03:51',1,'2006-02-15 21:30:53'),(11613,'2005-08-17 03:50:33',2486,126,'2005-08-25 00:37:33',2,'2006-02-15 21:30:53'),(11614,'2005-08-17 03:52:18',805,2,'2005-08-20 07:04:18',1,'2006-02-15 21:30:53'),(11615,'2005-08-17 03:54:35',4331,436,'2005-08-23 06:54:35',2,'2006-02-15 21:30:53'),(11616,'2005-08-17 04:00:01',2588,36,'2005-08-20 23:03:01',2,'2006-02-15 21:30:53'),(11617,'2005-08-17 04:00:40',1898,324,'2005-08-18 00:36:40',1,'2006-02-15 21:30:53'),(11618,'2005-08-17 04:01:36',954,175,'2005-08-23 01:02:36',1,'2006-02-15 21:30:53'),(11619,'2005-08-17 04:03:26',3652,374,'2005-08-22 03:07:26',1,'2006-02-15 21:30:53'),(11620,'2005-08-17 04:06:22',3801,502,'2005-08-17 23:53:22',1,'2006-02-15 21:30:53'),(11621,'2005-08-17 04:13:45',3708,216,'2005-08-26 01:00:45',1,'2006-02-15 21:30:53'),(11622,'2005-08-17 04:15:46',499,220,'2005-08-24 04:48:46',1,'2006-02-15 21:30:53'),(11623,'2005-08-17 04:15:47',759,163,'2005-08-19 04:11:47',2,'2006-02-15 21:30:53'),(11624,'2005-08-17 04:17:42',606,527,'2005-08-18 02:46:42',1,'2006-02-15 21:30:53'),(11625,'2005-08-17 04:18:52',712,521,'2005-08-25 03:05:52',2,'2006-02-15 21:30:53'),(11626,'2005-08-17 04:25:42',4279,266,'2005-08-23 05:46:42',1,'2006-02-15 21:30:53'),(11627,'2005-08-17 04:25:47',3945,168,'2005-08-26 02:54:47',2,'2006-02-15 21:30:53'),(11628,'2005-08-17 04:27:18',3656,256,'2005-08-25 01:12:18',2,'2006-02-15 21:30:53'),(11629,'2005-08-17 04:27:24',786,299,'2005-08-26 10:25:24',2,'2006-02-15 21:30:53'),(11630,'2005-08-17 04:27:46',688,72,'2005-08-19 09:58:46',2,'2006-02-15 21:30:53'),(11631,'2005-08-17 04:28:56',59,168,'2005-08-24 00:42:56',2,'2006-02-15 21:30:53'),(11632,'2005-08-17 04:29:32',2551,238,'2005-08-22 03:44:32',1,'2006-02-15 21:30:53'),(11633,'2005-08-17 04:30:09',1706,468,'2005-08-20 06:56:09',1,'2006-02-15 21:30:53'),(11634,'2005-08-17 04:31:49',2576,206,'2005-08-21 02:51:49',1,'2006-02-15 21:30:53'),(11635,'2005-08-17 04:33:17',2642,98,'2005-08-21 07:50:17',2,'2006-02-15 21:30:53'),(11636,'2005-08-17 04:36:31',791,276,'2005-08-24 00:03:31',2,'2006-02-15 21:30:53'),(11637,'2005-08-17 04:36:39',479,283,'2005-08-18 02:17:39',1,'2006-02-15 21:30:53'),(11638,'2005-08-17 04:39:09',3421,152,'2005-08-25 06:42:09',2,'2006-02-15 21:30:53'),(11639,'2005-08-17 04:43:29',3985,462,'2005-08-25 01:04:29',2,'2006-02-15 21:30:53'),(11640,'2005-08-17 04:44:33',1718,501,'2005-08-21 09:29:33',2,'2006-02-15 21:30:53'),(11641,'2005-08-17 04:45:39',2717,79,'2005-08-20 10:38:39',1,'2006-02-15 21:30:53'),(11642,'2005-08-17 04:48:05',3790,25,'2005-08-18 01:53:05',2,'2006-02-15 21:30:53'),(11643,'2005-08-17 04:49:35',1378,197,'2005-08-24 07:05:35',1,'2006-02-15 21:30:53'),(11644,'2005-08-17 04:49:46',1760,438,'2005-08-24 08:49:46',1,'2006-02-15 21:30:53'),(11645,'2005-08-17 04:50:56',4261,35,'2005-08-25 23:03:56',1,'2006-02-15 21:30:53'),(11646,'2006-02-14 15:16:03',478,11,NULL,2,'2006-02-15 21:30:53'),(11647,'2005-08-17 04:54:14',3016,110,'2005-08-23 04:16:14',2,'2006-02-15 21:30:53'),(11648,'2005-08-17 04:56:16',3362,465,'2005-08-26 00:53:16',2,'2006-02-15 21:30:53'),(11649,'2005-08-17 04:59:26',3222,217,'2005-08-20 04:02:26',2,'2006-02-15 21:30:53'),(11650,'2005-08-17 05:00:03',3979,418,'2005-08-22 01:45:03',2,'2006-02-15 21:30:53'),(11651,'2005-08-17 05:02:25',3681,143,'2005-08-24 08:15:25',2,'2006-02-15 21:30:53'),(11652,'2006-02-14 15:16:03',1622,597,NULL,2,'2006-02-15 21:30:53'),(11653,'2005-08-17 05:06:10',4475,358,'2005-08-24 03:09:10',2,'2006-02-15 21:30:53'),(11654,'2005-08-17 05:06:19',1048,218,'2005-08-18 04:32:19',2,'2006-02-15 21:30:53'),(11655,'2005-08-17 05:11:07',1699,113,'2005-08-26 10:18:07',1,'2006-02-15 21:30:53'),(11656,'2005-08-17 05:11:09',1451,56,'2005-08-25 07:51:09',1,'2006-02-15 21:30:53'),(11657,'2006-02-14 15:16:03',3043,53,NULL,2,'2006-02-15 21:30:53'),(11658,'2005-08-17 05:19:17',2008,422,'2005-08-24 07:03:17',2,'2006-02-15 21:30:53'),(11659,'2005-08-17 05:20:45',2881,112,'2005-08-22 10:18:45',1,'2006-02-15 21:30:53'),(11660,'2005-08-17 05:22:42',4081,525,'2005-08-23 01:03:42',1,'2006-02-15 21:30:53'),(11661,'2005-08-17 05:25:57',1008,27,'2005-08-25 04:37:57',1,'2006-02-15 21:30:53'),(11662,'2005-08-17 05:27:37',2730,177,'2005-08-26 09:56:37',2,'2006-02-15 21:30:53'),(11663,'2005-08-17 05:30:19',3798,373,'2005-08-25 08:14:19',1,'2006-02-15 21:30:53'),(11664,'2005-08-17 05:35:52',1343,433,'2005-08-18 02:40:52',1,'2006-02-15 21:30:53'),(11665,'2005-08-17 05:36:57',334,254,'2005-08-23 01:38:57',1,'2006-02-15 21:30:53'),(11666,'2005-08-17 05:45:10',250,531,'2005-08-19 06:47:10',2,'2006-02-15 21:30:53'),(11667,'2005-08-17 05:46:55',1516,582,'2005-08-26 08:19:55',1,'2006-02-15 21:30:53'),(11668,'2005-08-17 05:47:32',2162,249,'2005-08-20 03:11:32',1,'2006-02-15 21:30:53'),(11669,'2005-08-17 05:48:51',3224,487,'2005-08-22 01:22:51',1,'2006-02-15 21:30:53'),(11670,'2005-08-17 05:48:59',4437,286,'2005-08-19 08:51:59',1,'2006-02-15 21:30:53'),(11671,'2005-08-17 05:50:21',3569,338,'2005-08-20 03:43:21',1,'2006-02-15 21:30:53'),(11672,'2006-02-14 15:16:03',3947,521,NULL,2,'2006-02-15 21:30:53'),(11673,'2005-08-17 05:54:15',823,303,'2005-08-21 08:12:15',2,'2006-02-15 21:30:53'),(11674,'2005-08-17 05:56:27',582,306,'2005-08-24 08:50:27',2,'2006-02-15 21:30:53'),(11675,'2005-08-17 05:57:54',1322,514,'2005-08-21 23:57:54',1,'2006-02-15 21:30:53'),(11676,'2006-02-14 15:16:03',4496,216,NULL,2,'2006-02-15 21:30:53'),(11677,'2005-08-17 06:06:26',2206,407,'2005-08-20 04:35:26',2,'2006-02-15 21:30:53'),(11678,'2005-08-17 06:07:39',3511,176,'2005-08-21 10:51:39',2,'2006-02-15 21:30:53'),(11679,'2005-08-17 06:08:54',3337,72,'2005-08-21 07:50:54',1,'2006-02-15 21:30:53'),(11680,'2005-08-17 06:12:27',4538,221,'2005-08-23 08:54:27',1,'2006-02-15 21:30:53'),(11681,'2005-08-17 06:13:30',1260,543,'2005-08-26 01:29:30',2,'2006-02-15 21:30:53'),(11682,'2005-08-17 06:13:40',2544,387,'2005-08-18 06:11:40',1,'2006-02-15 21:30:53'),(11683,'2005-08-17 06:15:17',2603,66,'2005-08-26 05:33:17',1,'2006-02-15 21:30:53'),(11684,'2005-08-17 06:27:15',4277,517,'2005-08-22 02:11:15',2,'2006-02-15 21:30:53'),(11685,'2005-08-17 06:39:16',3552,51,'2005-08-22 04:20:16',2,'2006-02-15 21:30:53'),(11686,'2005-08-17 06:39:30',1393,392,'2005-08-21 10:19:30',2,'2006-02-15 21:30:53'),(11687,'2005-08-17 06:39:59',1977,169,'2005-08-23 04:53:59',1,'2006-02-15 21:30:53'),(11688,'2005-08-17 06:41:58',2229,82,'2005-08-25 04:38:58',1,'2006-02-15 21:30:53'),(11689,'2005-08-17 06:42:08',2390,419,'2005-08-26 06:09:08',1,'2006-02-15 21:30:53'),(11690,'2005-08-17 06:44:22',3934,267,'2005-08-24 03:49:22',1,'2006-02-15 21:30:53'),(11691,'2005-08-17 06:51:05',2529,515,'2005-08-24 09:53:05',1,'2006-02-15 21:30:53'),(11692,'2005-08-17 06:52:41',1222,350,'2005-08-24 12:17:41',2,'2006-02-15 21:30:53'),(11693,'2005-08-17 06:56:56',793,221,'2005-08-24 06:20:56',2,'2006-02-15 21:30:53'),(11694,'2005-08-17 06:57:30',3540,410,'2005-08-24 07:52:30',1,'2006-02-15 21:30:53'),(11695,'2005-08-17 07:01:08',1110,386,'2005-08-21 09:21:08',1,'2006-02-15 21:30:53'),(11696,'2005-08-17 07:01:09',3816,522,'2005-08-21 09:12:09',2,'2006-02-15 21:30:53'),(11697,'2005-08-17 07:09:19',383,329,'2005-08-19 02:02:19',1,'2006-02-15 21:30:53'),(11698,'2005-08-17 07:09:59',3946,353,'2005-08-19 04:31:59',1,'2006-02-15 21:30:53'),(11699,'2005-08-17 07:11:58',3997,339,'2005-08-26 12:08:58',1,'2006-02-15 21:30:53'),(11700,'2005-08-17 07:12:31',2365,104,'2005-08-18 04:21:31',2,'2006-02-15 21:30:53'),(11701,'2005-08-17 07:15:47',993,34,'2005-08-19 01:44:47',2,'2006-02-15 21:30:53'),(11702,'2005-08-17 07:18:56',3286,526,'2005-08-24 06:33:56',1,'2006-02-15 21:30:53'),(11703,'2005-08-17 07:19:29',1692,279,'2005-08-20 09:35:29',2,'2006-02-15 21:30:53'),(11704,'2005-08-17 07:21:22',1099,135,'2005-08-25 06:06:22',1,'2006-02-15 21:30:53'),(11705,'2005-08-17 07:22:25',4242,489,'2005-08-18 06:42:25',1,'2006-02-15 21:30:53'),(11706,'2005-08-17 07:23:46',4234,414,'2005-08-18 10:13:46',2,'2006-02-15 21:30:53'),(11707,'2005-08-17 07:24:59',1030,581,'2005-08-24 10:40:59',1,'2006-02-15 21:30:53'),(11708,'2005-08-17 07:26:47',76,582,'2005-08-22 04:11:47',1,'2006-02-15 21:30:53'),(11709,'2006-02-14 15:16:03',1720,330,NULL,1,'2006-02-15 21:30:53'),(11710,'2005-08-17 07:29:44',613,553,'2005-08-19 02:06:44',2,'2006-02-15 21:30:53'),(11711,'2005-08-17 07:30:55',1503,470,'2005-08-18 09:21:55',1,'2006-02-15 21:30:53'),(11712,'2005-08-17 07:32:51',3607,203,'2005-08-21 09:18:51',2,'2006-02-15 21:30:53'),(11713,'2005-08-17 07:34:05',1919,590,'2005-08-25 07:49:05',1,'2006-02-15 21:30:53'),(11714,'2005-08-17 07:34:55',17,151,'2005-08-18 04:07:55',1,'2006-02-15 21:30:53'),(11715,'2005-08-17 07:40:55',1615,452,'2005-08-25 11:19:55',1,'2006-02-15 21:30:53'),(11716,'2005-08-17 07:40:55',3054,287,'2005-08-21 05:56:55',1,'2006-02-15 21:30:53'),(11717,'2005-08-17 07:44:09',1371,566,'2005-08-20 09:39:09',2,'2006-02-15 21:30:53'),(11718,'2005-08-17 07:44:42',3673,555,'2005-08-23 03:02:42',2,'2006-02-15 21:30:53'),(11719,'2005-08-17 07:46:05',2054,338,'2005-08-23 08:52:05',1,'2006-02-15 21:30:53'),(11720,'2005-08-17 07:46:54',1707,121,'2005-08-26 04:19:54',2,'2006-02-15 21:30:53'),(11721,'2005-08-17 07:49:17',1923,46,'2005-08-18 04:08:17',1,'2006-02-15 21:30:53'),(11722,'2005-08-17 07:53:03',2430,321,'2005-08-22 06:56:03',2,'2006-02-15 21:30:53'),(11723,'2005-08-17 07:56:22',1665,341,'2005-08-22 03:49:22',1,'2006-02-15 21:30:53'),(11724,'2005-08-17 08:04:44',4484,207,'2005-08-25 03:25:44',2,'2006-02-15 21:30:53'),(11725,'2005-08-17 08:09:00',519,45,'2005-08-18 09:50:00',1,'2006-02-15 21:30:53'),(11726,'2005-08-17 08:11:10',4438,266,'2005-08-22 05:45:10',1,'2006-02-15 21:30:53'),(11727,'2005-08-17 08:12:20',98,6,'2005-08-19 12:45:20',1,'2006-02-15 21:30:53'),(11728,'2005-08-17 08:12:26',726,444,'2005-08-18 03:26:26',1,'2006-02-15 21:30:53'),(11729,'2005-08-17 08:14:41',2819,215,'2005-08-22 02:54:41',1,'2006-02-15 21:30:53'),(11730,'2005-08-17 08:22:00',3817,98,'2005-08-22 05:43:00',2,'2006-02-15 21:30:53'),(11731,'2005-08-17 08:24:35',917,52,'2005-08-24 02:54:35',2,'2006-02-15 21:30:53'),(11732,'2005-08-17 08:29:46',460,137,'2005-08-23 14:21:46',2,'2006-02-15 21:30:53'),(11733,'2005-08-17 08:31:03',439,251,'2005-08-21 05:44:03',2,'2006-02-15 21:30:53'),(11734,'2005-08-17 08:34:22',4063,337,'2005-08-25 11:56:22',2,'2006-02-15 21:30:53'),(11735,'2005-08-17 08:35:42',2555,452,'2005-08-26 11:04:42',1,'2006-02-15 21:30:53'),(11736,'2005-08-17 08:40:55',4217,535,'2005-08-26 09:03:55',1,'2006-02-15 21:30:53'),(11737,'2005-08-17 08:42:08',4128,549,'2005-08-19 08:14:08',1,'2006-02-15 21:30:53'),(11738,'2005-08-17 08:45:55',3042,347,'2005-08-26 07:09:55',1,'2006-02-15 21:30:53'),(11739,'2006-02-14 15:16:03',4568,373,NULL,2,'2006-02-15 21:30:53'),(11740,'2005-08-17 08:48:31',2441,27,'2005-08-24 07:47:31',2,'2006-02-15 21:30:53'),(11741,'2005-08-17 08:48:39',1819,473,'2005-08-20 07:37:39',1,'2006-02-15 21:30:53'),(11742,'2005-08-17 08:48:43',596,470,'2005-08-23 07:18:43',2,'2006-02-15 21:30:53'),(11743,'2005-08-17 08:49:05',294,336,'2005-08-22 08:53:05',2,'2006-02-15 21:30:53'),(11744,'2005-08-17 08:54:30',297,26,'2005-08-25 03:28:30',1,'2006-02-15 21:30:53'),(11745,'2005-08-17 09:00:01',4018,240,'2005-08-26 14:29:01',2,'2006-02-15 21:30:53'),(11746,'2005-08-17 09:03:24',4571,299,'2005-08-25 06:08:24',2,'2006-02-15 21:30:53'),(11747,'2005-08-17 09:03:31',1041,555,'2005-08-19 08:23:31',2,'2006-02-15 21:30:53'),(11748,'2005-08-17 09:04:02',1175,595,'2005-08-21 12:22:02',2,'2006-02-15 21:30:53'),(11749,'2005-08-17 09:04:03',4141,567,'2005-08-19 09:32:03',2,'2006-02-15 21:30:53'),(11750,'2005-08-17 09:07:00',665,190,'2005-08-23 08:16:00',2,'2006-02-15 21:30:53'),(11751,'2005-08-17 09:07:56',3309,51,'2005-08-26 13:16:56',1,'2006-02-15 21:30:53'),(11752,'2005-08-17 09:10:55',1833,481,'2005-08-18 06:22:55',1,'2006-02-15 21:30:53'),(11753,'2005-08-17 09:11:52',2599,43,'2005-08-25 05:03:52',2,'2006-02-15 21:30:53'),(11754,'2006-02-14 15:16:03',3747,163,NULL,2,'2006-02-15 21:30:53'),(11755,'2005-08-17 09:15:35',3457,513,'2005-08-23 06:28:35',2,'2006-02-15 21:30:53'),(11756,'2005-08-17 09:29:22',1798,198,'2005-08-21 12:17:22',1,'2006-02-15 21:30:53'),(11757,'2006-02-14 15:16:03',1295,550,NULL,2,'2006-02-15 21:30:53'),(11758,'2005-08-17 09:33:02',11,533,'2005-08-24 05:03:02',2,'2006-02-15 21:30:53'),(11759,'2005-08-17 09:41:23',2655,108,'2005-08-19 11:58:23',2,'2006-02-15 21:30:53'),(11760,'2005-08-17 09:44:22',626,545,'2005-08-24 14:39:22',2,'2006-02-15 21:30:53'),(11761,'2005-08-17 09:44:59',2230,13,'2005-08-25 07:46:59',1,'2006-02-15 21:30:53'),(11762,'2005-08-17 09:48:06',1204,244,'2005-08-26 13:12:06',2,'2006-02-15 21:30:53'),(11763,'2005-08-17 09:51:39',872,586,'2005-08-21 10:15:39',2,'2006-02-15 21:30:53'),(11764,'2005-08-17 09:51:54',4502,252,'2005-08-20 07:11:54',1,'2006-02-15 21:30:53'),(11765,'2005-08-17 09:55:28',4311,308,'2005-08-19 15:53:28',2,'2006-02-15 21:30:53'),(11766,'2005-08-17 09:58:40',2999,544,'2005-08-21 04:59:40',1,'2006-02-15 21:30:53'),(11767,'2005-08-17 10:00:40',2374,77,'2005-08-25 04:14:40',2,'2006-02-15 21:30:53'),(11768,'2005-08-17 10:02:29',1307,564,'2005-08-23 10:26:29',1,'2006-02-15 21:30:53'),(11769,'2005-08-17 10:04:49',1406,418,'2005-08-20 09:22:49',1,'2006-02-15 21:30:53'),(11770,'2005-08-17 10:05:05',2862,475,'2005-08-20 15:59:05',1,'2006-02-15 21:30:53'),(11771,'2005-08-17 10:17:09',2575,324,'2005-08-25 10:58:09',1,'2006-02-15 21:30:53'),(11772,'2005-08-17 10:18:57',1021,237,'2005-08-26 12:48:57',2,'2006-02-15 21:30:53'),(11773,'2005-08-17 10:19:51',1886,384,'2005-08-23 04:30:51',1,'2006-02-15 21:30:53'),(11774,'2005-08-17 10:20:39',1679,488,'2005-08-23 13:37:39',1,'2006-02-15 21:30:53'),(11775,'2005-08-17 10:25:53',256,574,'2005-08-22 08:37:53',2,'2006-02-15 21:30:53'),(11776,'2005-08-17 10:27:19',2400,306,'2005-08-20 14:02:19',2,'2006-02-15 21:30:53'),(11777,'2005-08-17 10:27:19',4065,83,'2005-08-26 13:10:19',1,'2006-02-15 21:30:53'),(11778,'2005-08-17 10:31:40',1306,213,'2005-08-25 13:53:40',2,'2006-02-15 21:30:53'),(11779,'2005-08-17 10:31:58',181,126,'2005-08-24 15:28:58',2,'2006-02-15 21:30:53'),(11780,'2005-08-17 10:34:24',2268,297,'2005-08-21 04:55:24',1,'2006-02-15 21:30:53'),(11781,'2005-08-17 10:37:00',1853,506,'2005-08-21 12:03:00',2,'2006-02-15 21:30:53'),(11782,'2006-02-14 15:16:03',4098,354,NULL,1,'2006-02-15 21:30:53'),(11783,'2005-08-17 10:39:24',979,152,'2005-08-21 12:43:24',2,'2006-02-15 21:30:53'),(11784,'2005-08-17 10:48:05',3101,297,'2005-08-19 06:47:05',1,'2006-02-15 21:30:53'),(11785,'2005-08-17 10:54:46',2760,182,'2005-08-23 14:15:46',2,'2006-02-15 21:30:53'),(11786,'2005-08-17 10:57:40',1487,435,'2005-08-24 06:48:40',2,'2006-02-15 21:30:53'),(11787,'2005-08-17 10:59:00',1980,195,'2005-08-19 05:56:00',1,'2006-02-15 21:30:53'),(11788,'2005-08-17 10:59:18',1310,560,'2005-08-22 11:12:18',1,'2006-02-15 21:30:53'),(11789,'2005-08-17 10:59:24',851,150,'2005-08-26 16:17:24',1,'2006-02-15 21:30:53'),(11790,'2005-08-17 11:00:08',2384,451,'2005-08-20 05:15:08',2,'2006-02-15 21:30:53'),(11791,'2005-08-17 11:01:11',3640,219,'2005-08-22 06:31:11',2,'2006-02-15 21:30:53'),(11792,'2005-08-17 11:03:53',3703,376,'2005-08-26 06:34:53',1,'2006-02-15 21:30:53'),(11793,'2005-08-17 11:05:53',1955,352,'2005-08-25 12:25:53',1,'2006-02-15 21:30:53'),(11794,'2005-08-17 11:08:48',3486,453,'2005-08-20 13:36:48',2,'2006-02-15 21:30:53'),(11795,'2005-08-17 11:13:38',2220,565,'2005-08-19 14:20:38',2,'2006-02-15 21:30:53'),(11796,'2005-08-17 11:16:47',3983,435,'2005-08-18 16:55:47',2,'2006-02-15 21:30:53'),(11797,'2005-08-17 11:17:21',1142,546,'2005-08-18 09:14:21',2,'2006-02-15 21:30:53'),(11798,'2005-08-17 11:21:43',3974,448,'2005-08-25 07:43:43',2,'2006-02-15 21:30:53'),(11799,'2005-08-17 11:25:25',40,501,'2005-08-25 13:03:25',2,'2006-02-15 21:30:53'),(11800,'2005-08-17 11:29:52',2284,350,'2005-08-21 08:37:52',1,'2006-02-15 21:30:53'),(11801,'2005-08-17 11:30:11',659,126,'2005-08-23 09:54:11',1,'2006-02-15 21:30:53'),(11802,'2005-08-17 11:32:51',2815,221,'2005-08-22 10:56:51',1,'2006-02-15 21:30:53'),(11803,'2005-08-17 11:42:08',3648,160,'2005-08-22 07:45:08',2,'2006-02-15 21:30:53'),(11804,'2005-08-17 11:42:45',1040,556,'2005-08-25 07:11:45',1,'2006-02-15 21:30:53'),(11805,'2005-08-17 11:48:47',1208,208,'2005-08-26 11:06:47',2,'2006-02-15 21:30:53'),(11806,'2005-08-17 11:49:28',3203,125,'2005-08-22 15:42:28',1,'2006-02-15 21:30:53'),(11807,'2005-08-17 11:51:15',4052,201,'2005-08-21 11:47:15',2,'2006-02-15 21:30:53'),(11808,'2005-08-17 11:51:16',4042,462,'2005-08-18 14:01:16',2,'2006-02-15 21:30:53'),(11809,'2005-08-17 11:51:39',1136,305,'2005-08-24 17:14:39',1,'2006-02-15 21:30:53'),(11810,'2005-08-17 11:56:48',1548,270,'2005-08-20 17:39:48',1,'2006-02-15 21:30:53'),(11811,'2005-08-17 11:59:18',195,130,'2005-08-18 09:13:18',2,'2006-02-15 21:30:53'),(11812,'2005-08-17 12:00:54',119,132,'2005-08-18 16:08:54',1,'2006-02-15 21:30:53'),(11813,'2005-08-17 12:06:54',1074,36,'2005-08-21 17:52:54',2,'2006-02-15 21:30:53'),(11814,'2005-08-17 12:09:20',3462,509,'2005-08-25 16:56:20',2,'2006-02-15 21:30:53'),(11815,'2005-08-17 12:13:26',272,192,'2005-08-22 17:15:26',2,'2006-02-15 21:30:53'),(11816,'2005-08-17 12:14:16',3897,224,'2005-08-19 06:15:16',2,'2006-02-15 21:30:53'),(11817,'2005-08-17 12:20:01',2297,38,'2005-08-19 18:06:01',1,'2006-02-15 21:30:53'),(11818,'2005-08-17 12:22:04',213,512,'2005-08-25 15:59:04',2,'2006-02-15 21:30:53'),(11819,'2005-08-17 12:25:17',656,208,'2005-08-19 16:12:17',1,'2006-02-15 21:30:53'),(11820,'2005-08-17 12:25:33',2801,401,'2005-08-19 07:04:33',2,'2006-02-15 21:30:53'),(11821,'2005-08-17 12:27:55',2711,20,'2005-08-18 07:07:55',1,'2006-02-15 21:30:53'),(11822,'2005-08-17 12:32:39',1317,263,'2005-08-18 12:30:39',2,'2006-02-15 21:30:53'),(11823,'2005-08-17 12:36:37',2626,352,'2005-08-22 11:10:37',2,'2006-02-15 21:30:53'),(11824,'2005-08-17 12:37:54',2639,1,'2005-08-19 10:11:54',2,'2006-02-15 21:30:53'),(11825,'2005-08-17 12:43:30',2656,296,'2005-08-20 15:25:30',1,'2006-02-15 21:30:53'),(11826,'2005-08-17 12:43:46',1837,536,'2005-08-19 16:59:46',2,'2006-02-15 21:30:53'),(11827,'2005-08-17 12:44:27',3064,523,'2005-08-24 13:31:27',1,'2006-02-15 21:30:53'),(11828,'2005-08-17 12:48:28',2593,268,'2005-08-24 09:24:28',2,'2006-02-15 21:30:53'),(11829,'2005-08-17 12:52:04',2207,563,'2005-08-19 10:50:04',2,'2006-02-15 21:30:53'),(11830,'2005-08-17 12:53:15',3713,522,'2005-08-25 08:08:15',1,'2006-02-15 21:30:53'),(11831,'2005-08-17 12:54:47',4562,32,'2005-08-21 11:21:47',1,'2006-02-15 21:30:53'),(11832,'2005-08-17 12:55:31',2331,125,'2005-08-19 08:31:31',1,'2006-02-15 21:30:53'),(11833,'2005-08-17 13:00:33',3728,424,'2005-08-18 13:45:33',2,'2006-02-15 21:30:53'),(11834,'2005-08-17 13:00:40',2407,261,'2005-08-22 12:50:40',1,'2006-02-15 21:30:53'),(11835,'2005-08-17 13:03:13',2796,479,'2005-08-19 10:50:13',1,'2006-02-15 21:30:53'),(11836,'2005-08-17 13:03:36',2253,198,'2005-08-19 17:15:36',1,'2006-02-15 21:30:53'),(11837,'2005-08-17 13:04:41',1085,81,'2005-08-26 14:19:41',1,'2006-02-15 21:30:53'),(11838,'2005-08-17 13:06:00',3576,161,'2005-08-20 11:44:00',1,'2006-02-15 21:30:53'),(11839,'2005-08-17 13:08:45',2282,80,'2005-08-18 15:05:45',2,'2006-02-15 21:30:53'),(11840,'2005-08-17 13:09:01',1824,491,'2005-08-19 17:42:01',1,'2006-02-15 21:30:53'),(11841,'2005-08-17 13:12:20',1524,270,'2005-08-21 11:16:20',2,'2006-02-15 21:30:53'),(11842,'2005-08-17 13:13:37',2680,422,'2005-08-20 08:32:37',1,'2006-02-15 21:30:53'),(11843,'2005-08-17 13:14:50',3091,187,'2005-08-22 11:31:50',2,'2006-02-15 21:30:53'),(11844,'2005-08-17 13:16:04',3791,368,'2005-08-18 10:16:04',1,'2006-02-15 21:30:53'),(11845,'2005-08-17 13:16:38',14,65,'2005-08-18 11:21:38',1,'2006-02-15 21:30:53'),(11846,'2005-08-17 13:18:29',3306,283,'2005-08-22 18:05:29',2,'2006-02-15 21:30:53'),(11847,'2006-02-14 15:16:03',1784,337,NULL,1,'2006-02-15 21:30:53'),(11848,'2006-02-14 15:16:03',3680,152,NULL,1,'2006-02-15 21:30:53'),(11849,'2005-08-17 13:24:55',1191,92,'2005-08-22 12:50:55',2,'2006-02-15 21:30:53'),(11850,'2005-08-17 13:30:15',1437,80,'2005-08-21 17:24:15',1,'2006-02-15 21:30:53'),(11851,'2005-08-17 13:30:27',3225,376,'2005-08-20 15:34:27',2,'2006-02-15 21:30:53'),(11852,'2005-08-17 13:38:27',2358,596,'2005-08-24 08:50:27',1,'2006-02-15 21:30:53'),(11853,'2005-08-17 13:39:32',3888,6,'2005-08-23 18:44:32',2,'2006-02-15 21:30:53'),(11854,'2005-08-17 13:42:52',137,313,'2005-08-26 14:04:52',1,'2006-02-15 21:30:53'),(11855,'2005-08-17 13:43:07',1062,535,'2005-08-26 08:07:07',1,'2006-02-15 21:30:53'),(11856,'2005-08-17 13:44:49',305,28,'2005-08-21 17:20:49',1,'2006-02-15 21:30:53'),(11857,'2005-08-17 13:48:30',101,146,'2005-08-18 15:55:30',1,'2006-02-15 21:30:53'),(11858,'2005-08-17 13:50:31',3483,503,'2005-08-19 08:45:31',2,'2006-02-15 21:30:53'),(11859,'2005-08-17 13:51:20',423,144,'2005-08-21 13:47:20',2,'2006-02-15 21:30:53'),(11860,'2005-08-17 13:52:26',4354,257,'2005-08-24 14:47:26',1,'2006-02-15 21:30:53'),(11861,'2005-08-17 13:53:47',2674,232,'2005-08-21 16:07:47',1,'2006-02-15 21:30:53'),(11862,'2005-08-17 13:54:53',2604,529,'2005-08-19 10:48:53',1,'2006-02-15 21:30:53'),(11863,'2005-08-17 13:56:01',1003,112,'2005-08-23 18:38:01',1,'2006-02-15 21:30:53'),(11864,'2005-08-17 14:02:01',2985,96,'2005-08-21 19:54:01',1,'2006-02-15 21:30:53'),(11865,'2005-08-17 14:03:46',2577,345,'2005-08-19 08:39:46',1,'2006-02-15 21:30:53'),(11866,'2006-02-14 15:16:03',2758,200,NULL,2,'2006-02-15 21:30:53'),(11867,'2005-08-17 14:04:28',938,434,'2005-08-21 10:08:28',1,'2006-02-15 21:30:53'),(11868,'2005-08-17 14:05:34',2909,445,'2005-08-19 15:47:34',1,'2006-02-15 21:30:53'),(11869,'2005-08-17 14:10:22',3453,19,'2005-08-24 18:39:22',1,'2006-02-15 21:30:53'),(11870,'2005-08-17 14:11:28',4251,432,'2005-08-24 16:43:28',1,'2006-02-15 21:30:53'),(11871,'2005-08-17 14:11:44',3013,484,'2005-08-18 17:50:44',1,'2006-02-15 21:30:53'),(11872,'2005-08-17 14:11:45',4306,113,'2005-08-21 17:02:45',2,'2006-02-15 21:30:53'),(11873,'2005-08-17 14:14:39',4021,554,'2005-08-18 17:20:39',2,'2006-02-15 21:30:53'),(11874,'2005-08-17 14:16:40',2637,467,'2005-08-18 15:51:40',2,'2006-02-15 21:30:53'),(11875,'2005-08-17 14:16:48',1787,294,'2005-08-26 14:20:48',1,'2006-02-15 21:30:53'),(11876,'2005-08-17 14:18:21',3982,426,'2005-08-20 19:48:21',1,'2006-02-15 21:30:53'),(11877,'2005-08-17 14:21:11',4528,445,'2005-08-25 19:46:11',1,'2006-02-15 21:30:53'),(11878,'2005-08-17 14:23:52',255,549,'2005-08-21 14:23:52',1,'2006-02-15 21:30:53'),(11879,'2005-08-17 14:25:09',2500,312,'2005-08-26 09:19:09',1,'2006-02-15 21:30:53'),(11880,'2005-08-17 14:28:28',1539,597,'2005-08-26 12:32:28',2,'2006-02-15 21:30:53'),(11881,'2005-08-17 14:31:56',3124,272,'2005-08-21 11:05:56',1,'2006-02-15 21:30:53'),(11882,'2005-08-17 14:33:41',2401,234,'2005-08-26 17:25:41',2,'2006-02-15 21:30:53'),(11883,'2005-08-17 14:41:28',221,551,'2005-08-19 09:54:28',1,'2006-02-15 21:30:53'),(11884,'2005-08-17 14:43:23',797,178,'2005-08-25 15:38:23',1,'2006-02-15 21:30:53'),(11885,'2005-08-17 14:53:53',3931,481,'2005-08-22 10:59:53',1,'2006-02-15 21:30:53'),(11886,'2005-08-17 14:58:51',608,204,'2005-08-19 16:07:51',2,'2006-02-15 21:30:53'),(11887,'2005-08-17 15:03:13',3290,54,'2005-08-19 09:49:13',1,'2006-02-15 21:30:53'),(11888,'2005-08-17 15:04:05',1100,160,'2005-08-25 18:52:05',2,'2006-02-15 21:30:53'),(11889,'2005-08-17 15:08:27',293,395,'2005-08-18 17:10:27',1,'2006-02-15 21:30:53'),(11890,'2005-08-17 15:08:43',3023,487,'2005-08-26 14:56:43',2,'2006-02-15 21:30:53'),(11891,'2005-08-17 15:11:55',2619,115,'2005-08-22 11:11:55',2,'2006-02-15 21:30:53'),(11892,'2005-08-17 15:13:21',746,227,'2005-08-21 09:19:21',2,'2006-02-15 21:30:53'),(11893,'2005-08-17 15:13:29',2321,496,'2005-08-25 11:09:29',1,'2006-02-15 21:30:53'),(11894,'2005-08-17 15:15:01',1223,67,'2005-08-26 13:49:01',1,'2006-02-15 21:30:53'),(11895,'2005-08-17 15:15:07',2156,236,'2005-08-18 11:00:07',2,'2006-02-15 21:30:53'),(11896,'2005-08-17 15:19:54',259,436,'2005-08-24 18:22:54',2,'2006-02-15 21:30:53'),(11897,'2005-08-17 15:24:06',3904,238,'2005-08-23 11:50:06',2,'2006-02-15 21:30:53'),(11898,'2005-08-17 15:24:12',3163,169,'2005-08-24 13:36:12',2,'2006-02-15 21:30:53'),(11899,'2005-08-17 15:29:12',3179,84,'2005-08-24 17:41:12',1,'2006-02-15 21:30:53'),(11900,'2005-08-17 15:30:44',1931,239,'2005-08-19 16:12:44',1,'2006-02-15 21:30:53'),(11901,'2005-08-17 15:35:47',4274,70,'2005-08-20 10:33:47',2,'2006-02-15 21:30:53'),(11902,'2005-08-17 15:37:34',1387,63,'2005-08-22 17:28:34',2,'2006-02-15 21:30:53'),(11903,'2005-08-17 15:37:45',1196,542,'2005-08-23 18:31:45',2,'2006-02-15 21:30:53'),(11904,'2005-08-17 15:39:26',2846,145,'2005-08-21 18:24:26',2,'2006-02-15 21:30:53'),(11905,'2005-08-17 15:40:18',2725,349,'2005-08-26 15:14:18',2,'2006-02-15 21:30:53'),(11906,'2005-08-17 15:40:46',325,478,'2005-08-20 15:20:46',2,'2006-02-15 21:30:53'),(11907,'2005-08-17 15:40:47',3928,505,'2005-08-20 19:55:47',2,'2006-02-15 21:30:53'),(11908,'2005-08-17 15:43:09',3390,314,'2005-08-24 14:32:09',2,'2006-02-15 21:30:53'),(11909,'2006-02-14 15:16:03',871,474,NULL,1,'2006-02-15 21:30:53'),(11910,'2005-08-17 15:44:37',4254,418,'2005-08-19 10:58:37',2,'2006-02-15 21:30:53'),(11911,'2005-08-17 15:51:35',3578,472,'2005-08-26 20:26:35',2,'2006-02-15 21:30:53'),(11912,'2005-08-17 15:51:49',744,573,'2005-08-24 18:48:49',1,'2006-02-15 21:30:53'),(11913,'2005-08-17 15:53:17',741,295,'2005-08-24 18:50:17',2,'2006-02-15 21:30:53'),(11914,'2005-08-17 16:04:42',1634,230,'2005-08-22 19:29:42',1,'2006-02-15 21:30:53'),(11915,'2005-08-17 16:05:28',1557,269,'2005-08-25 19:53:28',2,'2006-02-15 21:30:53'),(11916,'2005-08-17 16:05:51',2631,86,'2005-08-20 10:23:51',1,'2006-02-15 21:30:53'),(11917,'2005-08-17 16:08:17',1608,270,'2005-08-20 20:01:17',1,'2006-02-15 21:30:53'),(11918,'2005-08-17 16:08:42',2169,533,'2005-08-20 20:12:42',1,'2006-02-15 21:30:53'),(11919,'2005-08-17 16:08:49',4497,40,'2005-08-20 16:59:49',2,'2006-02-15 21:30:53'),(11920,'2005-08-17 16:10:19',4253,402,'2005-08-20 13:54:19',2,'2006-02-15 21:30:53'),(11921,'2005-08-17 16:12:27',494,485,'2005-08-25 22:07:27',1,'2006-02-15 21:30:53'),(11922,'2005-08-17 16:20:37',3707,15,'2005-08-26 16:53:37',2,'2006-02-15 21:30:53'),(11923,'2005-08-17 16:21:47',1907,72,'2005-08-18 14:26:47',2,'2006-02-15 21:30:53'),(11924,'2005-08-17 16:22:05',1711,202,'2005-08-26 12:34:05',1,'2006-02-15 21:30:53'),(11925,'2005-08-17 16:23:04',1441,370,'2005-08-21 11:38:04',1,'2006-02-15 21:30:53'),(11926,'2005-08-17 16:25:02',2111,516,'2005-08-22 11:36:02',1,'2006-02-15 21:30:53'),(11927,'2005-08-17 16:25:03',3134,178,'2005-08-23 16:41:03',1,'2006-02-15 21:30:53'),(11928,'2005-08-17 16:28:24',79,261,'2005-08-23 17:50:24',2,'2006-02-15 21:30:53'),(11929,'2005-08-17 16:28:51',3765,327,'2005-08-25 19:36:51',1,'2006-02-15 21:30:53'),(11930,'2005-08-17 16:28:53',1299,5,'2005-08-25 10:31:53',1,'2006-02-15 21:30:53'),(11931,'2005-08-17 16:35:14',2022,242,'2005-08-19 19:16:14',1,'2006-02-15 21:30:53'),(11932,'2005-08-17 16:36:12',151,364,'2005-08-18 19:34:12',2,'2006-02-15 21:30:53'),(11933,'2005-08-17 16:38:20',2574,438,'2005-08-22 14:31:20',1,'2006-02-15 21:30:53'),(11934,'2005-08-17 16:40:00',1230,596,'2005-08-20 20:13:00',2,'2006-02-15 21:30:53'),(11935,'2005-08-17 16:42:13',1640,66,'2005-08-22 20:38:13',2,'2006-02-15 21:30:53'),(11936,'2005-08-17 16:45:34',1127,380,'2005-08-21 13:33:34',2,'2006-02-15 21:30:53'),(11937,'2005-08-17 16:48:36',2926,515,'2005-08-24 19:01:36',1,'2006-02-15 21:30:53'),(11938,'2005-08-17 16:54:54',3927,426,'2005-08-24 19:18:54',1,'2006-02-15 21:30:53'),(11939,'2005-08-17 16:55:57',3305,516,'2005-08-24 21:36:57',1,'2006-02-15 21:30:53'),(11940,'2005-08-17 16:56:28',1188,163,'2005-08-18 15:09:28',1,'2006-02-15 21:30:53'),(11941,'2005-08-17 16:56:57',159,566,'2005-08-24 16:29:57',1,'2006-02-15 21:30:53'),(11942,'2006-02-14 15:16:03',4094,576,NULL,2,'2006-02-15 21:30:53'),(11943,'2005-08-17 17:00:42',4466,69,'2005-08-26 22:07:42',1,'2006-02-15 21:30:53'),(11944,'2005-08-17 17:02:42',27,389,'2005-08-21 16:40:42',2,'2006-02-15 21:30:53'),(11945,'2005-08-17 17:05:33',1108,380,'2005-08-20 18:37:33',2,'2006-02-15 21:30:53'),(11946,'2005-08-17 17:05:53',2953,569,'2005-08-19 13:56:53',1,'2006-02-15 21:30:53'),(11947,'2005-08-17 17:08:13',2928,220,'2005-08-23 21:53:13',1,'2006-02-15 21:30:53'),(11948,'2005-08-17 17:11:05',3329,40,'2005-08-25 21:16:05',2,'2006-02-15 21:30:53'),(11949,'2005-08-17 17:12:26',854,198,'2005-08-23 20:48:26',1,'2006-02-15 21:30:53'),(11950,'2005-08-17 17:13:16',4412,190,'2005-08-26 21:25:16',1,'2006-02-15 21:30:53'),(11951,'2005-08-17 17:14:02',1394,155,'2005-08-26 12:04:02',2,'2006-02-15 21:30:53'),(11952,'2005-08-17 17:14:57',2411,288,'2005-08-19 19:15:57',1,'2006-02-15 21:30:53'),(11953,'2005-08-17 17:16:42',2993,399,'2005-08-23 18:28:42',1,'2006-02-15 21:30:53'),(11954,'2005-08-17 17:18:36',220,145,'2005-08-18 19:49:36',1,'2006-02-15 21:30:53'),(11955,'2005-08-17 17:21:35',1221,319,'2005-08-24 22:06:35',1,'2006-02-15 21:30:53'),(11956,'2005-08-17 17:22:05',2533,457,'2005-08-25 22:19:05',2,'2006-02-15 21:30:53'),(11957,'2005-08-17 17:22:29',1924,198,'2005-08-23 21:47:29',2,'2006-02-15 21:30:53'),(11958,'2005-08-17 17:23:20',2061,217,'2005-08-24 14:47:20',2,'2006-02-15 21:30:53'),(11959,'2005-08-17 17:23:35',2694,101,'2005-08-20 20:57:35',1,'2006-02-15 21:30:53'),(11960,'2005-08-17 17:24:30',3924,84,'2005-08-18 14:28:30',1,'2006-02-15 21:30:53'),(11961,'2005-08-17 17:28:01',2015,276,'2005-08-21 20:43:01',1,'2006-02-15 21:30:53'),(11962,'2005-08-17 17:34:38',4384,29,'2005-08-21 12:59:38',2,'2006-02-15 21:30:53'),(11963,'2005-08-17 17:35:47',232,211,'2005-08-23 16:19:47',2,'2006-02-15 21:30:53'),(11964,'2005-08-17 17:37:03',2225,309,'2005-08-25 11:55:03',2,'2006-02-15 21:30:53'),(11965,'2005-08-17 17:39:45',194,490,'2005-08-19 12:05:45',1,'2006-02-15 21:30:53'),(11966,'2005-08-17 17:40:04',3702,283,'2005-08-20 15:45:04',1,'2006-02-15 21:30:53'),(11967,'2005-08-17 17:45:00',1151,521,'2005-08-22 13:03:00',1,'2006-02-15 21:30:53'),(11968,'2005-08-17 17:47:34',698,239,'2005-08-18 19:40:34',1,'2006-02-15 21:30:53'),(11969,'2005-08-17 17:49:37',668,550,'2005-08-19 19:45:37',2,'2006-02-15 21:30:53'),(11970,'2005-08-17 17:53:09',1779,21,'2005-08-24 14:41:09',1,'2006-02-15 21:30:53'),(11971,'2005-08-17 17:53:42',2756,131,'2005-08-18 12:11:42',2,'2006-02-15 21:30:53'),(11972,'2005-08-17 17:55:46',1282,308,'2005-08-22 15:31:46',2,'2006-02-15 21:30:53'),(11973,'2005-08-17 17:55:58',1472,131,'2005-08-21 19:55:58',2,'2006-02-15 21:30:53'),(11974,'2005-08-17 17:56:48',1609,485,'2005-08-21 19:14:48',2,'2006-02-15 21:30:53'),(11975,'2005-08-17 17:58:39',3843,458,'2005-08-20 19:11:39',2,'2006-02-15 21:30:53'),(11976,'2005-08-17 17:59:19',498,373,'2005-08-23 14:51:19',2,'2006-02-15 21:30:53'),(11977,'2005-08-17 18:01:15',1528,536,'2005-08-23 23:03:15',1,'2006-02-15 21:30:53'),(11978,'2005-08-17 18:02:10',4380,499,'2005-08-18 20:40:10',2,'2006-02-15 21:30:53'),(11979,'2005-08-17 18:07:13',568,255,'2005-08-19 23:12:13',1,'2006-02-15 21:30:53'),(11980,'2005-08-17 18:10:18',4165,589,'2005-08-20 13:28:18',1,'2006-02-15 21:30:53'),(11981,'2005-08-17 18:10:40',3228,294,'2005-08-20 16:56:40',1,'2006-02-15 21:30:53'),(11982,'2005-08-17 18:13:07',118,186,'2005-08-18 19:06:07',1,'2006-02-15 21:30:53'),(11983,'2005-08-17 18:13:55',2580,304,'2005-08-23 18:27:55',2,'2006-02-15 21:30:53'),(11984,'2005-08-17 18:16:30',3577,96,'2005-08-24 21:09:30',2,'2006-02-15 21:30:53'),(11985,'2005-08-17 18:19:44',2208,198,'2005-08-18 19:14:44',2,'2006-02-15 21:30:53'),(11986,'2005-08-17 18:21:58',1610,352,'2005-08-18 13:05:58',1,'2006-02-15 21:30:53'),(11987,'2005-08-17 18:21:59',1478,494,'2005-08-25 19:20:59',1,'2006-02-15 21:30:53'),(11988,'2005-08-17 18:23:50',3429,62,'2005-08-18 22:30:50',2,'2006-02-15 21:30:53'),(11989,'2005-08-17 18:23:58',3686,439,'2005-08-20 20:31:58',2,'2006-02-15 21:30:53'),(11990,'2005-08-17 18:26:22',3012,17,'2005-08-19 14:34:22',2,'2006-02-15 21:30:53'),(11991,'2005-08-17 18:27:08',940,361,'2005-08-25 14:07:08',1,'2006-02-15 21:30:53'),(11992,'2005-08-17 18:27:22',4132,136,'2005-08-26 22:38:22',2,'2006-02-15 21:30:53'),(11993,'2005-08-17 18:27:49',295,303,'2005-08-21 00:04:49',1,'2006-02-15 21:30:53'),(11994,'2005-08-17 18:29:35',3428,319,'2005-08-25 23:39:35',1,'2006-02-15 21:30:53'),(11995,'2006-02-14 15:16:03',3953,69,NULL,1,'2006-02-15 21:30:53'),(11996,'2005-08-17 18:34:37',2720,510,'2005-08-20 22:25:37',2,'2006-02-15 21:30:53'),(11997,'2005-08-17 18:34:38',2193,411,'2005-08-26 00:12:38',2,'2006-02-15 21:30:53'),(11998,'2005-08-17 18:46:21',4258,299,'2005-08-18 20:29:21',1,'2006-02-15 21:30:53'),(11999,'2005-08-17 18:47:07',4333,125,'2005-08-20 23:26:07',2,'2006-02-15 21:30:53'),(12000,'2005-08-17 18:49:44',2256,149,'2005-08-24 16:34:44',2,'2006-02-15 21:30:53'),(12001,'2006-02-14 15:16:03',4158,52,NULL,2,'2006-02-15 21:30:53'),(12002,'2005-08-17 18:56:02',1386,75,'2005-08-20 17:36:02',1,'2006-02-15 21:30:53'),(12003,'2005-08-17 18:56:05',3868,70,'2005-08-18 23:52:05',1,'2006-02-15 21:30:53'),(12004,'2005-08-17 18:56:53',2690,499,'2005-08-26 14:56:53',1,'2006-02-15 21:30:53'),(12005,'2005-08-17 18:56:55',2062,403,'2005-08-25 20:23:55',2,'2006-02-15 21:30:53'),(12006,'2005-08-17 19:09:12',4072,272,'2005-08-24 13:50:12',1,'2006-02-15 21:30:53'),(12007,'2005-08-17 19:10:34',3007,268,'2005-08-24 14:09:34',1,'2006-02-15 21:30:53'),(12008,'2005-08-17 19:16:18',865,562,'2005-08-18 14:24:18',2,'2006-02-15 21:30:53'),(12009,'2006-02-14 15:16:03',2134,296,NULL,2,'2006-02-15 21:30:53'),(12010,'2005-08-17 19:17:54',1076,554,'2005-08-26 00:41:54',1,'2006-02-15 21:30:53'),(12011,'2005-08-17 19:19:44',495,313,'2005-08-23 00:56:44',2,'2006-02-15 21:30:53'),(12012,'2005-08-17 19:20:48',2698,69,'2005-08-22 16:50:48',1,'2006-02-15 21:30:53'),(12013,'2005-08-17 19:23:02',3530,586,'2005-08-23 00:31:02',2,'2006-02-15 21:30:53'),(12014,'2005-08-17 19:29:44',1778,554,'2005-08-23 20:40:44',1,'2006-02-15 21:30:53'),(12015,'2005-08-17 19:32:44',593,11,'2005-08-23 13:36:44',2,'2006-02-15 21:30:53'),(12016,'2005-08-17 19:33:24',2109,327,'2005-08-21 19:59:24',2,'2006-02-15 21:30:53'),(12017,'2005-08-17 19:33:49',344,573,'2005-08-22 01:16:49',2,'2006-02-15 21:30:53'),(12018,'2005-08-17 19:44:46',1921,319,'2005-08-26 20:24:46',1,'2006-02-15 21:30:53'),(12019,'2005-08-17 19:48:55',2566,90,'2005-08-21 18:20:55',1,'2006-02-15 21:30:53'),(12020,'2005-08-17 19:50:33',3258,72,'2005-08-25 17:54:33',1,'2006-02-15 21:30:53'),(12021,'2005-08-17 19:52:43',3977,27,'2005-08-23 21:49:43',1,'2006-02-15 21:30:53'),(12022,'2005-08-17 19:52:45',2067,461,'2005-08-18 18:26:45',2,'2006-02-15 21:30:53'),(12023,'2005-08-17 19:54:54',247,22,'2005-08-26 23:03:54',1,'2006-02-15 21:30:53'),(12024,'2005-08-17 19:57:34',2398,484,'2005-08-21 23:00:34',2,'2006-02-15 21:30:53'),(12025,'2005-08-17 19:59:06',4019,209,'2005-08-23 14:39:06',2,'2006-02-15 21:30:53'),(12026,'2005-08-17 20:00:10',1568,468,'2005-08-26 01:54:10',1,'2006-02-15 21:30:53'),(12027,'2005-08-17 20:01:12',45,285,'2005-08-26 21:08:12',2,'2006-02-15 21:30:53'),(12028,'2005-08-17 20:03:47',607,316,'2005-08-23 17:09:47',2,'2006-02-15 21:30:53'),(12029,'2005-08-17 20:07:01',3516,148,'2005-08-19 19:36:01',2,'2006-02-15 21:30:53'),(12030,'2005-08-17 20:10:48',449,434,'2005-08-19 00:32:48',1,'2006-02-15 21:30:53'),(12031,'2005-08-17 20:11:35',2793,10,'2005-08-24 23:48:35',2,'2006-02-15 21:30:53'),(12032,'2005-08-17 20:14:26',1106,141,'2005-08-26 16:01:26',1,'2006-02-15 21:30:53'),(12033,'2005-08-17 20:14:34',2731,321,'2005-08-26 00:22:34',2,'2006-02-15 21:30:53'),(12034,'2005-08-17 20:15:31',834,321,'2005-08-24 15:46:31',2,'2006-02-15 21:30:53'),(12035,'2005-08-17 20:18:06',2335,469,'2005-08-21 16:41:06',2,'2006-02-15 21:30:53'),(12036,'2005-08-17 20:19:06',3620,85,'2005-08-18 19:57:06',2,'2006-02-15 21:30:53'),(12037,'2005-08-17 20:21:35',766,356,'2005-08-22 17:16:35',2,'2006-02-15 21:30:53'),(12038,'2005-08-17 20:28:26',3794,148,'2005-08-20 23:09:26',2,'2006-02-15 21:30:53'),(12039,'2005-08-17 20:29:08',4404,563,'2005-08-23 21:20:08',2,'2006-02-15 21:30:53'),(12040,'2005-08-17 20:29:56',1288,558,'2005-08-26 22:17:56',1,'2006-02-15 21:30:53'),(12041,'2005-08-17 20:34:33',2389,295,'2005-08-19 00:47:33',1,'2006-02-15 21:30:53'),(12042,'2005-08-17 20:36:37',1772,570,'2005-08-21 15:03:37',1,'2006-02-15 21:30:53'),(12043,'2005-08-17 20:38:21',3706,592,'2005-08-22 16:52:21',2,'2006-02-15 21:30:53'),(12044,'2005-08-17 20:39:37',3377,388,'2005-08-19 18:34:37',1,'2006-02-15 21:30:53'),(12045,'2005-08-17 20:40:46',469,556,'2005-08-20 18:18:46',2,'2006-02-15 21:30:53'),(12046,'2005-08-17 20:47:46',3895,435,'2005-08-19 16:09:46',2,'2006-02-15 21:30:53'),(12047,'2005-08-17 20:48:32',3886,251,'2005-08-26 00:07:32',1,'2006-02-15 21:30:53'),(12048,'2005-08-17 20:49:24',3773,466,'2005-08-27 02:01:24',2,'2006-02-15 21:30:53'),(12049,'2005-08-17 20:53:27',2433,178,'2005-08-26 19:45:27',2,'2006-02-15 21:30:53'),(12050,'2005-08-17 20:55:25',2348,405,'2005-08-22 20:31:25',2,'2006-02-15 21:30:53'),(12051,'2005-08-17 20:56:15',4001,579,'2005-08-25 19:08:15',1,'2006-02-15 21:30:53'),(12052,'2005-08-17 20:57:02',99,536,'2005-08-25 19:04:02',1,'2006-02-15 21:30:53'),(12053,'2005-08-17 20:57:27',4448,280,'2005-08-20 19:51:27',1,'2006-02-15 21:30:53'),(12054,'2005-08-17 20:59:56',3780,53,'2005-08-23 19:57:56',1,'2006-02-15 21:30:53'),(12055,'2005-08-17 21:02:19',1481,35,'2005-08-18 15:24:19',1,'2006-02-15 21:30:53'),(12056,'2005-08-17 21:03:48',1091,460,'2005-08-21 22:42:48',2,'2006-02-15 21:30:53'),(12057,'2005-08-17 21:04:35',1878,263,'2005-08-25 00:17:35',1,'2006-02-15 21:30:53'),(12058,'2005-08-17 21:07:41',2438,540,'2005-08-26 16:07:41',1,'2006-02-15 21:30:53'),(12059,'2005-08-17 21:09:23',4111,393,'2005-08-25 23:09:23',1,'2006-02-15 21:30:53'),(12060,'2005-08-17 21:11:57',2373,127,'2005-08-21 01:42:57',1,'2006-02-15 21:30:53'),(12061,'2005-08-17 21:13:35',144,532,'2005-08-22 19:18:35',1,'2006-02-15 21:30:53'),(12062,'2005-08-17 21:24:47',1791,330,'2005-08-20 20:35:47',2,'2006-02-15 21:30:53'),(12063,'2005-08-17 21:24:48',1141,550,'2005-08-23 22:10:48',2,'2006-02-15 21:30:53'),(12064,'2006-02-14 15:16:03',298,284,NULL,1,'2006-02-15 21:30:53'),(12065,'2005-08-17 21:31:46',3644,77,'2005-08-26 02:26:46',2,'2006-02-15 21:30:53'),(12066,'2006-02-14 15:16:03',2474,267,NULL,2,'2006-02-15 21:30:53'),(12067,'2005-08-17 21:36:47',2013,514,'2005-08-22 01:10:47',2,'2006-02-15 21:30:53'),(12068,'2005-08-17 21:37:08',4327,388,'2005-08-26 00:10:08',1,'2006-02-15 21:30:53'),(12069,'2005-08-17 21:39:40',631,389,'2005-08-22 01:12:40',2,'2006-02-15 21:30:53'),(12070,'2005-08-17 21:46:47',1357,158,'2005-08-22 22:59:47',1,'2006-02-15 21:30:53'),(12071,'2005-08-17 21:49:14',1874,507,'2005-08-22 18:20:14',1,'2006-02-15 21:30:53'),(12072,'2005-08-17 21:50:25',209,61,'2005-08-25 22:36:25',2,'2006-02-15 21:30:53'),(12073,'2005-08-17 21:50:39',2939,173,'2005-08-21 02:59:39',1,'2006-02-15 21:30:53'),(12074,'2005-08-17 21:50:57',711,417,'2005-08-20 00:58:57',2,'2006-02-15 21:30:53'),(12075,'2005-08-17 21:54:55',3147,125,'2005-08-23 23:04:55',1,'2006-02-15 21:30:53'),(12076,'2005-08-17 21:58:19',4278,298,'2005-08-20 22:10:19',1,'2006-02-15 21:30:53'),(12077,'2005-08-17 21:59:14',3589,550,'2005-08-22 03:23:14',1,'2006-02-15 21:30:53'),(12078,'2005-08-17 22:00:22',684,137,'2005-08-24 02:54:22',2,'2006-02-15 21:30:53'),(12079,'2005-08-17 22:04:17',646,230,'2005-08-24 20:22:17',2,'2006-02-15 21:30:53'),(12080,'2005-08-17 22:08:04',1491,394,'2005-08-19 22:55:04',2,'2006-02-15 21:30:53'),(12081,'2005-08-17 22:10:46',620,597,'2005-08-22 22:37:46',1,'2006-02-15 21:30:53'),(12082,'2005-08-17 22:13:15',3435,521,'2005-08-24 18:30:15',1,'2006-02-15 21:30:53'),(12083,'2005-08-17 22:13:37',1985,474,'2005-08-19 19:01:37',2,'2006-02-15 21:30:53'),(12084,'2005-08-17 22:16:49',2706,60,'2005-08-24 17:42:49',2,'2006-02-15 21:30:53'),(12085,'2005-08-17 22:17:09',600,31,'2005-08-21 01:45:09',1,'2006-02-15 21:30:53'),(12086,'2005-08-17 22:20:01',3963,140,'2005-08-26 02:14:01',1,'2006-02-15 21:30:53'),(12087,'2005-08-17 22:20:12',324,144,'2005-08-20 02:11:12',2,'2006-02-15 21:30:53'),(12088,'2005-08-17 22:20:16',1754,360,'2005-08-25 23:30:16',2,'2006-02-15 21:30:53'),(12089,'2005-08-17 22:20:29',651,538,'2005-08-24 02:12:29',1,'2006-02-15 21:30:53'),(12090,'2005-08-17 22:21:43',3392,391,'2005-08-20 23:53:43',2,'2006-02-15 21:30:53'),(12091,'2005-08-17 22:22:50',2161,555,'2005-08-27 03:55:50',1,'2006-02-15 21:30:53'),(12092,'2005-08-17 22:28:15',3964,38,'2005-08-18 16:46:15',2,'2006-02-15 21:30:53'),(12093,'2005-08-17 22:28:40',216,141,'2005-08-22 02:05:40',1,'2006-02-15 21:30:53'),(12094,'2005-08-17 22:31:04',1050,130,'2005-08-23 22:45:04',1,'2006-02-15 21:30:53'),(12095,'2005-08-17 22:32:37',1089,46,'2005-08-20 04:00:37',1,'2006-02-15 21:30:53'),(12096,'2005-08-17 22:32:50',44,463,'2005-08-25 03:33:50',1,'2006-02-15 21:30:53'),(12097,'2005-08-17 22:35:24',4135,325,'2005-08-18 20:31:24',2,'2006-02-15 21:30:53'),(12098,'2005-08-17 22:38:31',534,545,'2005-08-20 01:56:31',1,'2006-02-15 21:30:53'),(12099,'2005-08-17 22:38:54',1743,195,'2005-08-18 21:29:54',2,'2006-02-15 21:30:53'),(12100,'2005-08-17 22:41:10',4365,391,'2005-08-24 21:31:10',2,'2006-02-15 21:30:53'),(12101,'2006-02-14 15:16:03',1556,479,NULL,1,'2006-02-15 21:30:53'),(12102,'2005-08-17 22:45:26',4268,392,'2005-08-24 01:47:26',2,'2006-02-15 21:30:53'),(12103,'2005-08-17 22:49:09',4363,153,'2005-08-24 21:53:09',1,'2006-02-15 21:30:53'),(12104,'2005-08-17 22:53:00',4551,16,'2005-08-23 19:49:00',1,'2006-02-15 21:30:53'),(12105,'2005-08-17 22:54:45',2848,390,'2005-08-21 00:33:45',2,'2006-02-15 21:30:53'),(12106,'2005-08-17 22:55:32',3234,465,'2005-08-19 23:55:32',2,'2006-02-15 21:30:53'),(12107,'2005-08-17 22:56:24',1060,141,'2005-08-24 19:36:24',1,'2006-02-15 21:30:53'),(12108,'2005-08-17 22:56:39',1675,207,'2005-08-26 19:37:39',1,'2006-02-15 21:30:53'),(12109,'2005-08-17 22:58:35',1423,509,'2005-08-25 19:44:35',2,'2006-02-15 21:30:53'),(12110,'2005-08-17 22:59:46',2984,511,'2005-08-23 17:51:46',1,'2006-02-15 21:30:53'),(12111,'2005-08-17 22:59:55',2905,317,'2005-08-22 19:33:55',2,'2006-02-15 21:30:53'),(12112,'2005-08-17 23:00:31',4290,576,'2005-08-25 02:05:31',1,'2006-02-15 21:30:53'),(12113,'2005-08-17 23:01:00',2707,393,'2005-08-25 03:57:00',2,'2006-02-15 21:30:53'),(12114,'2005-08-17 23:02:00',1405,65,'2005-08-26 18:02:00',1,'2006-02-15 21:30:53'),(12115,'2005-08-17 23:04:15',1228,457,'2005-08-20 22:25:15',2,'2006-02-15 21:30:53'),(12116,'2006-02-14 15:16:03',3082,560,NULL,2,'2006-02-15 21:30:53'),(12117,'2005-08-17 23:11:12',4140,303,'2005-08-22 23:56:12',1,'2006-02-15 21:30:53'),(12118,'2005-08-17 23:14:25',158,89,'2005-08-26 22:26:25',1,'2006-02-15 21:30:53'),(12119,'2005-08-17 23:16:44',4298,567,'2005-08-20 02:13:44',2,'2006-02-15 21:30:53'),(12120,'2005-08-17 23:16:46',2912,323,'2005-08-19 00:11:46',2,'2006-02-15 21:30:53'),(12121,'2005-08-17 23:20:40',3423,69,'2005-08-22 21:30:40',2,'2006-02-15 21:30:53'),(12122,'2005-08-17 23:20:45',4030,375,'2005-08-25 04:23:45',2,'2006-02-15 21:30:53'),(12123,'2005-08-17 23:22:18',361,497,'2005-08-19 23:36:18',2,'2006-02-15 21:30:53'),(12124,'2005-08-17 23:22:46',2036,22,'2005-08-21 01:40:46',1,'2006-02-15 21:30:53'),(12125,'2005-08-17 23:24:25',136,573,'2005-08-25 03:08:25',2,'2006-02-15 21:30:53'),(12126,'2005-08-17 23:25:21',2304,302,'2005-08-23 21:51:21',1,'2006-02-15 21:30:53'),(12127,'2006-02-14 15:16:03',4218,582,NULL,2,'2006-02-15 21:30:53'),(12128,'2005-08-17 23:31:09',2252,415,'2005-08-24 05:07:09',2,'2006-02-15 21:30:53'),(12129,'2005-08-17 23:31:25',891,146,'2005-08-26 19:10:25',2,'2006-02-15 21:30:53'),(12130,'2006-02-14 15:16:03',1358,516,NULL,2,'2006-02-15 21:30:53'),(12131,'2005-08-17 23:34:16',3380,21,'2005-08-26 01:18:16',1,'2006-02-15 21:30:53'),(12132,'2005-08-17 23:37:03',2600,403,'2005-08-22 04:53:03',2,'2006-02-15 21:30:53'),(12133,'2005-08-17 23:47:16',1958,132,'2005-08-19 03:46:16',2,'2006-02-15 21:30:53'),(12134,'2005-08-17 23:49:43',2682,288,'2005-08-21 21:00:43',1,'2006-02-15 21:30:53'),(12135,'2005-08-17 23:50:24',1019,381,'2005-08-23 18:01:24',2,'2006-02-15 21:30:53'),(12136,'2005-08-17 23:51:30',3944,527,'2005-08-23 01:35:30',1,'2006-02-15 21:30:53'),(12137,'2005-08-17 23:52:26',3632,109,'2005-08-27 00:19:26',1,'2006-02-15 21:30:53'),(12138,'2005-08-17 23:55:54',388,317,'2005-08-26 23:32:54',1,'2006-02-15 21:30:53'),(12139,'2005-08-17 23:57:13',1537,342,'2005-08-24 19:13:13',1,'2006-02-15 21:30:53'),(12140,'2005-08-17 23:57:55',322,408,'2005-08-21 20:09:55',2,'2006-02-15 21:30:53'),(12141,'2006-02-14 15:16:03',731,101,NULL,1,'2006-02-15 21:30:53'),(12142,'2005-08-18 00:04:12',3748,373,'2005-08-24 01:24:12',2,'2006-02-15 21:30:53'),(12143,'2005-08-18 00:06:26',2876,117,'2005-08-24 02:45:26',2,'2006-02-15 21:30:53'),(12144,'2006-02-14 15:16:03',512,587,NULL,1,'2006-02-15 21:30:53'),(12145,'2005-08-18 00:10:04',3482,5,'2005-08-26 00:51:04',1,'2006-02-15 21:30:53'),(12146,'2005-08-18 00:10:04',3833,434,'2005-08-25 19:18:04',2,'2006-02-15 21:30:53'),(12147,'2005-08-18 00:10:20',705,41,'2005-08-23 20:36:20',2,'2006-02-15 21:30:53'),(12148,'2005-08-18 00:13:15',2409,254,'2005-08-20 01:27:15',2,'2006-02-15 21:30:53'),(12149,'2005-08-18 00:13:51',3696,277,'2005-08-26 19:47:51',1,'2006-02-15 21:30:53'),(12150,'2005-08-18 00:13:55',3781,555,'2005-08-20 23:35:55',2,'2006-02-15 21:30:53'),(12151,'2005-08-18 00:14:03',1976,4,'2005-08-18 23:52:03',2,'2006-02-15 21:30:53'),(12152,'2005-08-18 00:21:35',2797,367,'2005-08-22 02:51:35',1,'2006-02-15 21:30:53'),(12153,'2005-08-18 00:22:30',3929,387,'2005-08-23 04:13:30',2,'2006-02-15 21:30:53'),(12154,'2005-08-18 00:23:56',2491,163,'2005-08-21 00:31:56',2,'2006-02-15 21:30:53'),(12155,'2005-08-18 00:24:30',2065,315,'2005-08-18 19:12:30',2,'2006-02-15 21:30:53'),(12156,'2005-08-18 00:27:33',3270,212,'2005-08-26 01:43:33',1,'2006-02-15 21:30:53'),(12157,'2005-08-18 00:33:45',2311,569,'2005-08-22 19:33:45',1,'2006-02-15 21:30:53'),(12158,'2005-08-18 00:34:20',4121,289,'2005-08-22 20:10:20',2,'2006-02-15 21:30:53'),(12159,'2005-08-18 00:36:09',2243,106,'2005-08-27 06:31:09',1,'2006-02-15 21:30:53'),(12160,'2005-08-18 00:37:59',1328,481,'2005-08-19 20:51:59',1,'2006-02-15 21:30:53'),(12161,'2005-08-18 00:41:46',2420,444,'2005-08-26 22:59:46',2,'2006-02-15 21:30:53'),(12162,'2005-08-18 00:44:30',2697,284,'2005-08-25 03:34:30',1,'2006-02-15 21:30:53'),(12163,'2005-08-18 00:46:01',1349,455,'2005-08-22 06:16:01',1,'2006-02-15 21:30:53'),(12164,'2005-08-18 00:46:38',3849,587,'2005-08-19 04:38:38',2,'2006-02-15 21:30:53'),(12165,'2005-08-18 00:53:37',4215,24,'2005-08-27 00:09:37',2,'2006-02-15 21:30:53'),(12166,'2005-08-18 00:57:06',3627,184,'2005-08-26 03:13:06',2,'2006-02-15 21:30:53'),(12167,'2005-08-18 01:00:02',3085,338,'2005-08-21 00:04:02',2,'2006-02-15 21:30:53'),(12168,'2005-08-18 01:03:52',2859,535,'2005-08-18 20:19:52',1,'2006-02-15 21:30:53'),(12169,'2005-08-18 01:05:54',2281,323,'2005-08-24 02:16:54',2,'2006-02-15 21:30:53'),(12170,'2005-08-18 01:06:10',1125,289,'2005-08-25 02:40:10',2,'2006-02-15 21:30:53'),(12171,'2005-08-18 01:06:13',454,457,'2005-08-22 19:39:13',2,'2006-02-15 21:30:53'),(12172,'2005-08-18 01:07:00',1162,226,'2005-08-22 21:01:00',2,'2006-02-15 21:30:53'),(12173,'2005-08-18 01:08:34',2830,41,'2005-08-24 20:52:34',1,'2006-02-15 21:30:53'),(12174,'2005-08-18 01:08:53',1458,101,'2005-08-20 03:28:53',1,'2006-02-15 21:30:53'),(12175,'2005-08-18 01:10:17',4558,328,'2005-08-19 05:25:17',2,'2006-02-15 21:30:53'),(12176,'2005-08-18 01:10:33',3873,255,'2005-08-24 02:45:33',2,'2006-02-15 21:30:53'),(12177,'2005-08-18 01:15:47',522,470,'2005-08-24 23:23:47',2,'2006-02-15 21:30:53'),(12178,'2005-08-18 01:17:32',1152,276,'2005-08-25 19:32:32',1,'2006-02-15 21:30:53'),(12179,'2005-08-18 01:21:21',1499,222,'2005-08-19 00:59:21',1,'2006-02-15 21:30:53'),(12180,'2005-08-18 01:28:15',2276,20,'2005-08-20 20:52:15',2,'2006-02-15 21:30:53'),(12181,'2005-08-18 01:28:18',532,81,'2005-08-23 21:17:18',2,'2006-02-15 21:30:53'),(12182,'2005-08-18 01:30:19',296,555,'2005-08-21 05:52:19',1,'2006-02-15 21:30:53'),(12183,'2005-08-18 01:34:13',3153,344,'2005-08-24 04:38:13',1,'2006-02-15 21:30:53'),(12184,'2005-08-18 01:36:00',1723,51,'2005-08-21 01:59:00',1,'2006-02-15 21:30:53'),(12185,'2005-08-18 01:40:14',1558,588,'2005-08-25 05:04:14',1,'2006-02-15 21:30:53'),(12186,'2005-08-18 01:43:36',1342,312,'2005-08-23 07:13:36',1,'2006-02-15 21:30:53'),(12187,'2005-08-18 01:45:50',3360,38,'2005-08-22 20:12:50',1,'2006-02-15 21:30:53'),(12188,'2005-08-18 01:51:43',2989,456,'2005-08-18 22:23:43',1,'2006-02-15 21:30:53'),(12189,'2005-08-18 01:51:44',1764,363,'2005-08-26 01:01:44',1,'2006-02-15 21:30:53'),(12190,'2005-08-18 01:54:44',2464,28,'2005-08-27 04:32:44',1,'2006-02-15 21:30:53'),(12191,'2005-08-18 01:57:11',2667,316,'2005-08-22 22:53:11',2,'2006-02-15 21:30:53'),(12192,'2005-08-18 02:01:40',3450,270,'2005-08-21 05:45:40',1,'2006-02-15 21:30:53'),(12193,'2005-08-18 02:03:59',1086,290,'2005-08-25 05:32:59',2,'2006-02-15 21:30:53'),(12194,'2005-08-18 02:04:47',292,558,'2005-08-25 20:45:47',2,'2006-02-15 21:30:53'),(12195,'2005-08-18 02:07:49',943,347,'2005-08-19 23:54:49',2,'2006-02-15 21:30:53'),(12196,'2005-08-18 02:08:48',4302,111,'2005-08-26 00:39:48',1,'2006-02-15 21:30:53'),(12197,'2005-08-18 02:08:58',3687,564,'2005-08-26 21:54:58',2,'2006-02-15 21:30:53'),(12198,'2005-08-18 02:09:20',1628,86,'2005-08-21 21:28:20',2,'2006-02-15 21:30:53'),(12199,'2005-08-18 02:09:23',424,96,'2005-08-22 20:33:23',1,'2006-02-15 21:30:53'),(12200,'2005-08-18 02:12:33',840,52,'2005-08-18 20:47:33',2,'2006-02-15 21:30:53'),(12201,'2005-08-18 02:14:06',3676,540,'2005-08-23 04:44:06',1,'2006-02-15 21:30:53'),(12202,'2005-08-18 02:14:08',672,563,'2005-08-24 04:35:08',1,'2006-02-15 21:30:53'),(12203,'2005-08-18 02:18:52',4228,591,'2005-08-22 21:01:52',1,'2006-02-15 21:30:53'),(12204,'2005-08-18 02:20:35',304,575,'2005-08-26 01:27:35',2,'2006-02-15 21:30:53'),(12205,'2005-08-18 02:21:08',774,437,'2005-08-27 00:08:08',2,'2006-02-15 21:30:53'),(12206,'2005-08-18 02:22:20',3275,254,'2005-08-23 05:36:20',1,'2006-02-15 21:30:53'),(12207,'2005-08-18 02:24:07',3745,265,'2005-08-22 07:53:07',1,'2006-02-15 21:30:53'),(12208,'2005-08-18 02:25:25',2039,551,'2005-08-20 04:53:25',2,'2006-02-15 21:30:53'),(12209,'2005-08-18 02:27:20',279,243,'2005-08-21 00:41:20',2,'2006-02-15 21:30:53'),(12210,'2005-08-18 02:27:29',3035,217,'2005-08-20 23:32:29',2,'2006-02-15 21:30:53'),(12211,'2005-08-18 02:31:18',1484,19,'2005-08-26 02:36:18',1,'2006-02-15 21:30:53'),(12212,'2005-08-18 02:33:29',3898,449,'2005-08-25 07:10:29',2,'2006-02-15 21:30:53'),(12213,'2005-08-18 02:33:55',4058,157,'2005-08-24 03:14:55',1,'2006-02-15 21:30:53'),(12214,'2005-08-18 02:34:22',2094,231,'2005-08-21 07:48:22',2,'2006-02-15 21:30:53'),(12215,'2005-08-18 02:35:39',4095,47,'2005-08-24 00:36:39',1,'2006-02-15 21:30:53'),(12216,'2005-08-18 02:37:07',4139,131,'2005-08-19 02:09:07',2,'2006-02-15 21:30:53'),(12217,'2005-08-18 02:44:44',2556,105,'2005-08-24 03:27:44',1,'2006-02-15 21:30:53'),(12218,'2005-08-18 02:48:14',1933,70,'2005-08-21 01:52:14',2,'2006-02-15 21:30:53'),(12219,'2005-08-18 02:49:54',2249,271,'2005-08-23 07:52:54',1,'2006-02-15 21:30:53'),(12220,'2005-08-18 02:50:02',982,530,'2005-08-22 00:20:02',1,'2006-02-15 21:30:53'),(12221,'2005-08-18 02:50:51',2488,98,'2005-08-27 06:22:51',2,'2006-02-15 21:30:53'),(12222,'2006-02-14 15:16:03',3949,22,NULL,1,'2006-02-15 21:30:53'),(12223,'2005-08-18 02:58:40',4142,397,'2005-08-23 23:30:40',2,'2006-02-15 21:30:53'),(12224,'2005-08-18 02:59:09',1781,372,'2005-08-19 06:22:09',1,'2006-02-15 21:30:53'),(12225,'2005-08-18 03:00:11',1876,306,'2005-08-24 05:01:11',1,'2006-02-15 21:30:53'),(12226,'2005-08-18 03:00:48',682,234,'2005-08-25 00:43:48',2,'2006-02-15 21:30:53'),(12227,'2005-08-18 03:04:28',3671,591,'2005-08-21 08:52:28',2,'2006-02-15 21:30:53'),(12228,'2005-08-18 03:08:10',2772,9,'2005-08-20 02:48:10',1,'2006-02-15 21:30:53'),(12229,'2005-08-18 03:08:23',1123,382,'2005-08-22 03:42:23',1,'2006-02-15 21:30:53'),(12230,'2005-08-18 03:11:04',1910,231,'2005-08-27 04:06:04',1,'2006-02-15 21:30:53'),(12231,'2005-08-18 03:11:44',1115,231,'2005-08-24 03:26:44',1,'2006-02-15 21:30:53'),(12232,'2005-08-18 03:14:14',2399,87,'2005-08-19 05:44:14',2,'2006-02-15 21:30:53'),(12233,'2005-08-18 03:16:54',174,535,'2005-08-22 04:48:54',2,'2006-02-15 21:30:53'),(12234,'2005-08-18 03:17:33',3823,352,'2005-08-25 04:44:33',2,'2006-02-15 21:30:53'),(12235,'2005-08-18 03:17:50',957,595,'2005-08-20 02:49:50',1,'2006-02-15 21:30:53'),(12236,'2005-08-18 03:19:29',1190,474,'2005-08-23 07:39:29',2,'2006-02-15 21:30:53'),(12237,'2005-08-18 03:24:38',4422,381,'2005-08-25 09:05:38',1,'2006-02-15 21:30:53'),(12238,'2005-08-18 03:25:08',4043,46,'2005-08-20 02:41:08',2,'2006-02-15 21:30:53'),(12239,'2005-08-18 03:26:42',1948,75,'2005-08-24 23:48:42',1,'2006-02-15 21:30:53'),(12240,'2005-08-18 03:27:11',1168,30,'2005-08-26 04:34:11',2,'2006-02-15 21:30:53'),(12241,'2005-08-18 03:33:17',1261,248,'2005-08-21 03:13:17',2,'2006-02-15 21:30:53'),(12242,'2005-08-18 03:37:31',2095,121,'2005-08-25 06:50:31',1,'2006-02-15 21:30:53'),(12243,'2005-08-18 03:38:54',1829,354,'2005-08-27 06:56:54',2,'2006-02-15 21:30:53'),(12244,'2005-08-18 03:39:11',4441,362,'2005-08-21 02:57:11',2,'2006-02-15 21:30:53'),(12245,'2005-08-18 03:46:40',2960,576,'2005-08-24 22:27:40',2,'2006-02-15 21:30:53'),(12246,'2005-08-18 03:48:41',3199,258,'2005-08-25 05:12:41',1,'2006-02-15 21:30:53'),(12247,'2005-08-18 03:51:51',2264,254,'2005-08-24 05:36:51',2,'2006-02-15 21:30:53'),(12248,'2005-08-18 03:53:18',2120,562,'2005-08-22 04:53:18',1,'2006-02-15 21:30:53'),(12249,'2005-08-18 03:53:34',3586,135,'2005-08-21 01:14:34',1,'2006-02-15 21:30:53'),(12250,'2005-08-18 03:57:29',921,1,'2005-08-22 23:05:29',1,'2006-02-15 21:30:53'),(12251,'2005-08-18 03:59:02',3044,276,'2005-08-19 02:38:02',1,'2006-02-15 21:30:53'),(12252,'2005-08-18 03:59:51',127,350,'2005-08-25 08:54:51',2,'2006-02-15 21:30:53'),(12253,'2005-08-18 04:00:50',566,446,'2005-08-19 04:43:50',1,'2006-02-15 21:30:53'),(12254,'2005-08-18 04:05:29',2858,6,'2005-08-23 04:17:29',1,'2006-02-15 21:30:53'),(12255,'2005-08-18 04:07:20',2100,266,'2005-08-21 22:19:20',1,'2006-02-15 21:30:53'),(12256,'2005-08-18 04:09:39',2975,572,'2005-08-22 01:53:39',2,'2006-02-15 21:30:53'),(12257,'2005-08-18 04:11:03',269,87,'2005-08-25 01:20:03',2,'2006-02-15 21:30:53'),(12258,'2005-08-18 04:11:13',2861,83,'2005-08-21 23:40:13',2,'2006-02-15 21:30:53'),(12259,'2005-08-18 04:14:35',2904,429,'2005-08-18 22:30:35',2,'2006-02-15 21:30:53'),(12260,'2005-08-18 04:15:43',1352,150,'2005-08-26 23:31:43',1,'2006-02-15 21:30:53'),(12261,'2005-08-18 04:16:06',4076,485,'2005-08-27 08:04:06',1,'2006-02-15 21:30:53'),(12262,'2005-08-18 04:16:15',591,125,'2005-08-20 09:16:15',1,'2006-02-15 21:30:53'),(12263,'2005-08-18 04:16:18',4053,131,'2005-08-21 07:22:18',1,'2006-02-15 21:30:53'),(12264,'2005-08-18 04:17:33',3073,87,'2005-08-26 08:07:33',1,'2006-02-15 21:30:53'),(12265,'2005-08-18 04:22:01',537,247,'2005-08-20 03:22:01',1,'2006-02-15 21:30:53'),(12266,'2005-08-18 04:22:31',2192,467,'2005-08-19 04:25:31',2,'2006-02-15 21:30:53'),(12267,'2005-08-18 04:24:30',652,388,'2005-08-26 03:01:30',2,'2006-02-15 21:30:53'),(12268,'2005-08-18 04:26:54',93,39,'2005-08-23 06:40:54',2,'2006-02-15 21:30:53'),(12269,'2005-08-18 04:27:54',724,573,'2005-08-25 07:03:54',1,'2006-02-15 21:30:53'),(12270,'2005-08-18 04:32:05',2456,190,'2005-08-21 01:37:05',2,'2006-02-15 21:30:53'),(12271,'2005-08-18 04:33:11',3866,471,'2005-08-20 23:10:11',1,'2006-02-15 21:30:53'),(12272,'2005-08-18 04:39:10',1964,15,'2005-08-24 09:41:10',1,'2006-02-15 21:30:53'),(12273,'2005-08-18 04:40:50',3539,431,'2005-08-25 01:44:50',2,'2006-02-15 21:30:53'),(12274,'2005-08-18 04:41:47',265,47,'2005-08-27 07:00:47',1,'2006-02-15 21:30:53'),(12275,'2005-08-18 04:42:02',1474,507,'2005-08-25 00:50:02',1,'2006-02-15 21:30:53'),(12276,'2005-08-18 04:43:22',4491,397,'2005-08-22 01:49:22',2,'2006-02-15 21:30:53'),(12277,'2006-02-14 15:16:03',407,33,NULL,2,'2006-02-15 21:30:53'),(12278,'2005-08-18 04:46:45',3205,294,'2005-08-24 08:59:45',2,'2006-02-15 21:30:53'),(12279,'2005-08-18 04:47:30',4159,421,'2005-08-19 09:47:30',2,'2006-02-15 21:30:53'),(12280,'2005-08-18 04:49:27',4032,46,'2005-08-21 03:39:27',2,'2006-02-15 21:30:53'),(12281,'2005-08-18 04:50:32',4576,417,'2005-08-21 00:14:32',2,'2006-02-15 21:30:53'),(12282,'2005-08-18 04:54:20',3623,173,'2005-08-23 05:28:20',2,'2006-02-15 21:30:53'),(12283,'2005-08-18 04:54:25',574,240,'2005-08-23 04:02:25',1,'2006-02-15 21:30:53'),(12284,'2005-08-18 04:55:49',3162,147,'2005-08-22 08:45:49',2,'2006-02-15 21:30:53'),(12285,'2005-08-18 04:56:43',3531,215,'2005-08-19 23:32:43',2,'2006-02-15 21:30:53'),(12286,'2005-08-18 04:57:59',3729,34,'2005-08-18 23:20:59',2,'2006-02-15 21:30:53'),(12287,'2005-08-18 04:58:06',2238,136,'2005-08-24 00:06:06',1,'2006-02-15 21:30:53'),(12288,'2005-08-18 05:01:20',4401,523,'2005-08-25 09:51:20',2,'2006-02-15 21:30:53'),(12289,'2005-08-18 05:05:28',443,575,'2005-08-26 09:02:28',1,'2006-02-15 21:30:53'),(12290,'2005-08-18 05:08:03',4100,283,'2005-08-23 08:10:03',2,'2006-02-15 21:30:53'),(12291,'2005-08-18 05:08:37',4270,73,'2005-08-23 09:01:37',1,'2006-02-15 21:30:53'),(12292,'2005-08-18 05:08:54',1417,58,'2005-08-27 02:51:54',1,'2006-02-15 21:30:53'),(12293,'2005-08-18 05:13:36',614,514,'2005-08-25 04:00:36',2,'2006-02-15 21:30:53'),(12294,'2005-08-18 05:14:44',2479,4,'2005-08-27 01:32:44',2,'2006-02-15 21:30:53'),(12295,'2005-08-18 05:15:46',1651,532,'2005-08-26 02:23:46',2,'2006-02-15 21:30:53'),(12296,'2005-08-18 05:16:28',2091,258,'2005-08-22 10:32:28',1,'2006-02-15 21:30:53'),(12297,'2005-08-18 05:19:57',903,436,'2005-08-21 00:53:57',1,'2006-02-15 21:30:53'),(12298,'2005-08-18 05:30:31',904,46,'2005-08-27 07:33:31',1,'2006-02-15 21:30:53'),(12299,'2005-08-18 05:32:32',892,176,'2005-08-22 08:14:32',2,'2006-02-15 21:30:53'),(12300,'2005-08-18 05:36:14',3213,540,'2005-08-25 00:20:14',2,'2006-02-15 21:30:53'),(12301,'2005-08-18 05:36:20',2293,317,'2005-08-23 03:15:20',1,'2006-02-15 21:30:53'),(12302,'2005-08-18 05:41:39',765,514,'2005-08-22 06:02:39',1,'2006-02-15 21:30:53'),(12303,'2005-08-18 05:43:22',1604,245,'2005-08-27 08:54:22',2,'2006-02-15 21:30:53'),(12304,'2005-08-18 05:44:29',1381,228,'2005-08-24 04:31:29',1,'2006-02-15 21:30:53'),(12305,'2005-08-18 05:46:29',4463,534,'2005-08-22 11:14:29',2,'2006-02-15 21:30:53'),(12306,'2005-08-18 05:47:55',3853,541,'2005-08-21 01:56:55',1,'2006-02-15 21:30:53'),(12307,'2005-08-18 05:48:23',2679,187,'2005-08-26 02:32:23',1,'2006-02-15 21:30:53'),(12308,'2005-08-18 05:48:53',2877,569,'2005-08-22 09:03:53',1,'2006-02-15 21:30:53'),(12309,'2005-08-18 05:58:40',762,9,'2005-08-20 02:20:40',2,'2006-02-15 21:30:53'),(12310,'2005-08-18 06:02:34',3814,385,'2005-08-24 01:08:34',2,'2006-02-15 21:30:53'),(12311,'2005-08-18 06:07:00',1650,211,'2005-08-21 07:54:00',2,'2006-02-15 21:30:53'),(12312,'2005-08-18 06:07:26',80,185,'2005-08-21 02:07:26',2,'2006-02-15 21:30:53'),(12313,'2005-08-18 06:07:31',2053,180,'2005-08-27 00:20:31',1,'2006-02-15 21:30:53'),(12314,'2005-08-18 06:10:02',2204,455,'2005-08-25 02:48:02',1,'2006-02-15 21:30:53'),(12315,'2005-08-18 06:15:06',2012,579,'2005-08-24 07:45:06',2,'2006-02-15 21:30:53'),(12316,'2005-08-18 06:16:09',4325,94,'2005-08-27 05:54:09',2,'2006-02-15 21:30:53'),(12317,'2005-08-18 06:17:06',90,510,'2005-08-22 08:56:06',1,'2006-02-15 21:30:53'),(12318,'2005-08-18 06:21:56',3694,332,'2005-08-27 06:07:56',1,'2006-02-15 21:30:53'),(12319,'2005-08-18 06:26:45',999,368,'2005-08-23 01:35:45',1,'2006-02-15 21:30:53'),(12320,'2005-08-18 06:26:51',3248,267,'2005-08-20 04:00:51',1,'2006-02-15 21:30:53'),(12321,'2005-08-18 06:27:05',516,274,'2005-08-24 02:26:05',1,'2006-02-15 21:30:53'),(12322,'2005-08-18 06:35:28',4235,365,'2005-08-23 07:34:28',1,'2006-02-15 21:30:53'),(12323,'2005-08-18 06:36:22',4107,336,'2005-08-26 11:36:22',1,'2006-02-15 21:30:53'),(12324,'2005-08-18 06:38:20',2436,221,'2005-08-20 02:28:20',2,'2006-02-15 21:30:53'),(12325,'2005-08-18 06:41:30',1844,404,'2005-08-26 02:49:30',1,'2006-02-15 21:30:53'),(12326,'2005-08-18 06:41:59',1865,114,'2005-08-19 10:16:59',2,'2006-02-15 21:30:53'),(12327,'2005-08-18 06:43:22',2425,261,'2005-08-25 10:50:22',2,'2006-02-15 21:30:53'),(12328,'2005-08-18 06:43:56',1355,77,'2005-08-23 10:19:56',2,'2006-02-15 21:30:53'),(12329,'2005-08-18 06:44:30',3127,397,'2005-08-25 04:05:30',1,'2006-02-15 21:30:53'),(12330,'2005-08-18 06:46:33',889,587,'2005-08-26 11:35:33',2,'2006-02-15 21:30:53'),(12331,'2005-08-18 06:47:19',4565,483,'2005-08-25 05:51:19',2,'2006-02-15 21:30:53'),(12332,'2005-08-18 06:51:05',627,235,'2005-08-20 04:28:05',2,'2006-02-15 21:30:53'),(12333,'2005-08-18 06:51:39',4370,18,'2005-08-21 01:44:39',2,'2006-02-15 21:30:53'),(12334,'2005-08-18 06:52:36',2629,160,'2005-08-25 12:06:36',1,'2006-02-15 21:30:53'),(12335,'2005-08-18 06:59:15',2776,150,'2005-08-20 06:47:15',1,'2006-02-15 21:30:53'),(12336,'2005-08-18 06:59:41',2484,75,'2005-08-23 01:36:41',1,'2006-02-15 21:30:53'),(12337,'2005-08-18 07:02:24',4221,117,'2005-08-20 10:11:24',1,'2006-02-15 21:30:53'),(12338,'2005-08-18 07:04:24',274,408,'2005-08-19 08:36:24',2,'2006-02-15 21:30:53'),(12339,'2005-08-18 07:05:06',1600,370,'2005-08-19 02:27:06',2,'2006-02-15 21:30:53'),(12340,'2005-08-18 07:07:01',3561,239,'2005-08-20 05:06:01',1,'2006-02-15 21:30:53'),(12341,'2005-08-18 07:09:27',130,154,'2005-08-21 03:44:27',1,'2006-02-15 21:30:53'),(12342,'2005-08-18 07:12:46',1408,63,'2005-08-21 07:44:46',1,'2006-02-15 21:30:53'),(12343,'2005-08-18 07:15:13',448,507,'2005-08-27 11:07:13',1,'2006-02-15 21:30:53'),(12344,'2005-08-18 07:15:19',3675,269,'2005-08-24 04:58:19',2,'2006-02-15 21:30:53'),(12345,'2005-08-18 07:16:58',2359,44,'2005-08-25 05:50:58',1,'2006-02-15 21:30:53'),(12346,'2005-08-18 07:17:55',1200,265,'2005-08-21 11:35:55',2,'2006-02-15 21:30:53'),(12347,'2005-08-18 07:18:10',1788,454,'2005-08-19 05:49:10',1,'2006-02-15 21:30:53'),(12348,'2005-08-18 07:21:47',434,186,'2005-08-25 04:41:47',2,'2006-02-15 21:30:53'),(12349,'2005-08-18 07:23:42',4191,545,'2005-08-19 04:25:42',1,'2006-02-15 21:30:53'),(12350,'2005-08-18 07:29:46',1333,172,'2005-08-21 12:50:46',1,'2006-02-15 21:30:53'),(12351,'2005-08-18 07:32:12',2299,95,'2005-08-24 04:29:12',2,'2006-02-15 21:30:53'),(12352,'2006-02-14 15:16:03',643,155,NULL,1,'2006-02-15 21:30:53'),(12353,'2005-08-18 07:33:08',1594,141,'2005-08-21 03:42:08',2,'2006-02-15 21:30:53'),(12354,'2005-08-18 07:34:07',2913,499,'2005-08-26 05:56:07',1,'2006-02-15 21:30:53'),(12355,'2005-08-18 07:36:23',4112,452,'2005-08-20 08:59:23',1,'2006-02-15 21:30:53'),(12356,'2005-08-18 07:37:05',493,529,'2005-08-24 10:49:05',1,'2006-02-15 21:30:53'),(12357,'2005-08-18 07:40:52',166,19,'2005-08-22 02:51:52',1,'2006-02-15 21:30:53'),(12358,'2005-08-18 07:41:43',504,16,'2005-08-20 03:46:43',1,'2006-02-15 21:30:53'),(12359,'2005-08-18 07:44:05',4172,28,'2005-08-19 02:26:05',1,'2006-02-15 21:30:53'),(12360,'2005-08-18 07:46:35',929,123,'2005-08-26 12:01:35',1,'2006-02-15 21:30:53'),(12361,'2005-08-18 07:47:31',1418,250,'2005-08-22 12:08:31',2,'2006-02-15 21:30:53'),(12362,'2005-08-18 07:48:05',3131,367,'2005-08-20 05:16:05',2,'2006-02-15 21:30:53'),(12363,'2005-08-18 07:52:49',3447,181,'2005-08-26 03:20:49',2,'2006-02-15 21:30:53'),(12364,'2005-08-18 07:55:09',3398,84,'2005-08-19 05:29:09',2,'2006-02-15 21:30:53'),(12365,'2005-08-18 07:55:09',4350,303,'2005-08-24 05:42:09',1,'2006-02-15 21:30:53'),(12366,'2005-08-18 07:55:14',3799,115,'2005-08-22 06:12:14',1,'2006-02-15 21:30:53'),(12367,'2005-08-18 07:57:14',1822,7,'2005-08-27 07:07:14',2,'2006-02-15 21:30:53'),(12368,'2005-08-18 07:57:38',3777,392,'2005-08-25 05:49:38',2,'2006-02-15 21:30:53'),(12369,'2005-08-18 07:57:43',484,337,'2005-08-26 09:36:43',1,'2006-02-15 21:30:53'),(12370,'2005-08-18 07:57:47',3343,503,'2005-08-22 11:32:47',1,'2006-02-15 21:30:53'),(12371,'2005-08-18 08:02:46',622,451,'2005-08-19 02:50:46',2,'2006-02-15 21:30:53'),(12372,'2005-08-18 08:04:35',2982,131,'2005-08-27 08:13:35',2,'2006-02-15 21:30:53'),(12373,'2005-08-18 08:07:25',777,367,'2005-08-27 03:41:25',1,'2006-02-15 21:30:53'),(12374,'2005-08-18 08:07:45',939,74,'2005-08-26 10:42:45',2,'2006-02-15 21:30:53'),(12375,'2005-08-18 08:20:08',3508,365,'2005-08-21 08:50:08',2,'2006-02-15 21:30:53'),(12376,'2005-08-18 08:20:29',852,116,'2005-08-20 13:20:29',1,'2006-02-15 21:30:53'),(12377,'2005-08-18 08:26:05',4564,31,'2005-08-23 02:51:05',2,'2006-02-15 21:30:53'),(12378,'2005-08-18 08:26:13',4418,266,'2005-08-19 07:21:13',1,'2006-02-15 21:30:53'),(12379,'2005-08-18 08:26:48',2879,99,'2005-08-19 10:08:48',2,'2006-02-15 21:30:53'),(12380,'2005-08-18 08:27:28',55,215,'2005-08-25 02:58:28',2,'2006-02-15 21:30:53'),(12381,'2005-08-18 08:31:43',3651,190,'2005-08-23 12:24:43',2,'2006-02-15 21:30:53'); -INSERT INTO rental VALUES (12382,'2005-08-18 08:32:33',3049,566,'2005-08-26 03:45:33',2,'2006-02-15 21:30:53'),(12383,'2005-08-18 08:36:03',1641,295,'2005-08-23 03:30:03',2,'2006-02-15 21:30:53'),(12384,'2005-08-18 08:36:58',2557,193,'2005-08-23 05:08:58',1,'2006-02-15 21:30:53'),(12385,'2005-08-18 08:39:33',3143,146,'2005-08-21 14:22:33',1,'2006-02-15 21:30:53'),(12386,'2005-08-18 08:45:57',3303,199,'2005-08-24 04:50:57',2,'2006-02-15 21:30:53'),(12387,'2005-08-18 08:46:24',3604,530,'2005-08-21 02:56:24',2,'2006-02-15 21:30:53'),(12388,'2005-08-18 08:48:09',4016,555,'2005-08-26 09:05:09',2,'2006-02-15 21:30:53'),(12389,'2005-08-18 08:48:36',1891,394,'2005-08-22 08:59:36',2,'2006-02-15 21:30:53'),(12390,'2005-08-18 08:51:42',3603,377,'2005-08-23 13:06:42',1,'2006-02-15 21:30:53'),(12391,'2005-08-18 08:52:53',1507,307,'2005-08-22 12:15:53',2,'2006-02-15 21:30:53'),(12392,'2005-08-18 08:57:58',2695,113,'2005-08-25 05:20:58',2,'2006-02-15 21:30:53'),(12393,'2005-08-18 09:02:41',2435,396,'2005-08-26 12:47:41',1,'2006-02-15 21:30:53'),(12394,'2005-08-18 09:05:15',3605,330,'2005-08-23 11:10:15',1,'2006-02-15 21:30:53'),(12395,'2005-08-18 09:06:30',2020,541,'2005-08-21 12:09:30',2,'2006-02-15 21:30:53'),(12396,'2005-08-18 09:11:23',3624,40,'2005-08-26 05:35:23',2,'2006-02-15 21:30:53'),(12397,'2005-08-18 09:12:52',1872,371,'2005-08-27 10:44:52',2,'2006-02-15 21:30:53'),(12398,'2005-08-18 09:13:24',4247,321,'2005-08-27 14:58:24',1,'2006-02-15 21:30:53'),(12399,'2005-08-18 09:13:42',3950,347,'2005-08-27 11:44:42',1,'2006-02-15 21:30:53'),(12400,'2005-08-18 09:19:12',1767,10,'2005-08-26 06:52:12',1,'2006-02-15 21:30:53'),(12401,'2005-08-18 09:20:51',4314,479,'2005-08-21 05:50:51',2,'2006-02-15 21:30:53'),(12402,'2005-08-18 09:27:34',385,123,'2005-08-25 13:10:34',2,'2006-02-15 21:30:53'),(12403,'2005-08-18 09:31:05',2124,440,'2005-08-23 09:54:05',2,'2006-02-15 21:30:53'),(12404,'2005-08-18 09:36:34',1097,342,'2005-08-23 10:12:34',2,'2006-02-15 21:30:53'),(12405,'2005-08-18 09:37:30',228,266,'2005-08-27 13:11:30',2,'2006-02-15 21:30:53'),(12406,'2005-08-18 09:38:02',4368,510,'2005-08-22 12:56:02',1,'2006-02-15 21:30:53'),(12407,'2005-08-18 09:39:26',391,220,'2005-08-24 05:19:26',2,'2006-02-15 21:30:53'),(12408,'2005-08-18 09:40:38',2360,143,'2005-08-19 04:45:38',1,'2006-02-15 21:30:53'),(12409,'2005-08-18 09:43:58',2568,64,'2005-08-19 15:02:58',2,'2006-02-15 21:30:53'),(12410,'2005-08-18 09:45:33',1904,210,'2005-08-27 08:50:33',1,'2006-02-15 21:30:53'),(12411,'2005-08-18 09:47:57',1234,181,'2005-08-21 05:54:57',2,'2006-02-15 21:30:53'),(12412,'2005-08-18 09:49:52',1578,75,'2005-08-23 12:32:52',2,'2006-02-15 21:30:53'),(12413,'2005-08-18 09:50:34',3466,366,'2005-08-23 05:57:34',2,'2006-02-15 21:30:53'),(12414,'2005-08-18 09:50:40',4454,32,'2005-08-26 06:45:40',2,'2006-02-15 21:30:53'),(12415,'2005-08-18 09:54:01',392,443,'2005-08-24 15:41:01',1,'2006-02-15 21:30:53'),(12416,'2005-08-18 09:56:48',3784,515,'2005-08-22 12:34:48',1,'2006-02-15 21:30:53'),(12417,'2005-08-18 09:57:00',3500,71,'2005-08-19 08:56:00',1,'2006-02-15 21:30:53'),(12418,'2005-08-18 09:59:36',4186,241,'2005-08-19 11:35:36',2,'2006-02-15 21:30:53'),(12419,'2005-08-18 10:01:48',3111,133,'2005-08-19 13:40:48',1,'2006-02-15 21:30:53'),(12420,'2005-08-18 10:01:50',452,477,'2005-08-22 08:14:50',1,'2006-02-15 21:30:53'),(12421,'2005-08-18 10:04:06',4067,158,'2005-08-24 08:45:06',2,'2006-02-15 21:30:53'),(12422,'2005-08-18 10:13:12',1855,451,'2005-08-20 14:36:12',2,'2006-02-15 21:30:53'),(12423,'2005-08-18 10:14:52',1014,470,'2005-08-26 13:16:52',2,'2006-02-15 21:30:53'),(12424,'2005-08-18 10:16:57',2055,319,'2005-08-27 04:41:57',1,'2006-02-15 21:30:53'),(12425,'2005-08-18 10:18:06',2000,405,'2005-08-27 08:16:06',2,'2006-02-15 21:30:53'),(12426,'2005-08-18 10:24:11',799,75,'2005-08-22 15:34:11',2,'2006-02-15 21:30:53'),(12427,'2005-08-18 10:24:17',1759,333,'2005-08-27 14:22:17',1,'2006-02-15 21:30:53'),(12428,'2005-08-18 10:24:21',3735,121,'2005-08-24 05:12:21',1,'2006-02-15 21:30:53'),(12429,'2005-08-18 10:26:46',2994,436,'2005-08-27 13:23:46',1,'2006-02-15 21:30:53'),(12430,'2005-08-18 10:32:41',2840,196,'2005-08-22 16:16:41',1,'2006-02-15 21:30:53'),(12431,'2005-08-18 10:34:59',4461,89,'2005-08-22 14:42:59',1,'2006-02-15 21:30:53'),(12432,'2005-08-18 10:35:13',2543,263,'2005-08-26 08:20:13',2,'2006-02-15 21:30:53'),(12433,'2005-08-18 10:37:49',1776,552,'2005-08-19 08:00:49',1,'2006-02-15 21:30:53'),(12434,'2005-08-18 10:38:08',3078,314,'2005-08-22 16:14:08',2,'2006-02-15 21:30:53'),(12435,'2005-08-18 10:38:31',3211,160,'2005-08-26 15:18:31',1,'2006-02-15 21:30:53'),(12436,'2005-08-18 10:41:05',3761,499,'2005-08-23 07:36:05',2,'2006-02-15 21:30:53'),(12437,'2005-08-18 10:42:43',4036,467,'2005-08-26 11:58:43',2,'2006-02-15 21:30:53'),(12438,'2005-08-18 10:42:52',2043,186,'2005-08-25 11:42:52',1,'2006-02-15 21:30:53'),(12439,'2005-08-18 10:44:57',3204,153,'2005-08-22 06:51:57',1,'2006-02-15 21:30:53'),(12440,'2005-08-18 10:47:35',2779,474,'2005-08-21 11:10:35',2,'2006-02-15 21:30:53'),(12441,'2005-08-18 10:47:57',2163,561,'2005-08-26 07:11:57',2,'2006-02-15 21:30:53'),(12442,'2005-08-18 10:50:07',78,270,'2005-08-21 08:06:07',1,'2006-02-15 21:30:53'),(12443,'2005-08-18 10:50:59',2048,233,'2005-08-26 07:48:59',2,'2006-02-15 21:30:53'),(12444,'2005-08-18 10:53:12',1639,285,'2005-08-19 13:54:12',2,'2006-02-15 21:30:53'),(12445,'2005-08-18 10:56:20',3347,350,'2005-08-21 16:46:20',1,'2006-02-15 21:30:53'),(12446,'2005-08-18 10:56:29',2138,448,'2005-08-23 05:30:29',1,'2006-02-15 21:30:53'),(12447,'2005-08-18 10:57:01',4084,469,'2005-08-27 06:05:01',1,'2006-02-15 21:30:53'),(12448,'2005-08-18 10:59:04',3889,72,'2005-08-21 06:45:04',2,'2006-02-15 21:30:53'),(12449,'2005-08-18 11:03:04',663,285,'2005-08-19 07:34:04',1,'2006-02-15 21:30:53'),(12450,'2005-08-18 11:04:04',3439,518,'2005-08-22 07:24:04',1,'2006-02-15 21:30:53'),(12451,'2005-08-18 11:04:42',2780,183,'2005-08-20 08:20:42',1,'2006-02-15 21:30:53'),(12452,'2005-08-18 11:14:35',4260,358,'2005-08-27 09:09:35',1,'2006-02-15 21:30:53'),(12453,'2005-08-18 11:17:07',2487,104,'2005-08-25 12:34:07',1,'2006-02-15 21:30:53'),(12454,'2005-08-18 11:19:02',4219,184,'2005-08-19 12:00:02',2,'2006-02-15 21:30:53'),(12455,'2005-08-18 11:19:47',4478,46,'2005-08-22 16:08:47',2,'2006-02-15 21:30:53'),(12456,'2005-08-18 11:21:51',4578,85,'2005-08-21 13:28:51',1,'2006-02-15 21:30:53'),(12457,'2006-02-14 15:16:03',2145,80,NULL,2,'2006-02-15 21:30:53'),(12458,'2005-08-18 11:22:53',4579,277,'2005-08-22 14:30:53',2,'2006-02-15 21:30:53'),(12459,'2005-08-18 11:25:11',421,39,'2005-08-22 06:13:11',1,'2006-02-15 21:30:53'),(12460,'2005-08-18 11:25:13',3550,419,'2005-08-27 06:27:13',2,'2006-02-15 21:30:53'),(12461,'2005-08-18 11:28:14',1569,27,'2005-08-21 09:47:14',1,'2006-02-15 21:30:53'),(12462,'2005-08-18 11:28:55',890,574,'2005-08-20 12:06:55',2,'2006-02-15 21:30:53'),(12463,'2005-08-18 11:31:34',30,214,'2005-08-23 12:04:34',1,'2006-02-15 21:30:53'),(12464,'2005-08-18 11:33:34',1954,157,'2005-08-27 14:33:34',1,'2006-02-15 21:30:53'),(12465,'2005-08-18 11:35:02',1733,486,'2005-08-21 11:52:02',2,'2006-02-15 21:30:53'),(12466,'2005-08-18 11:36:55',2686,462,'2005-08-23 13:46:55',1,'2006-02-15 21:30:53'),(12467,'2005-08-18 11:40:09',1414,212,'2005-08-19 13:33:09',2,'2006-02-15 21:30:53'),(12468,'2005-08-18 11:41:47',1689,80,'2005-08-24 16:43:47',2,'2006-02-15 21:30:53'),(12469,'2005-08-18 11:53:07',2395,237,'2005-08-24 16:00:07',1,'2006-02-15 21:30:53'),(12470,'2005-08-18 11:55:42',1290,82,'2005-08-24 08:27:42',2,'2006-02-15 21:30:53'),(12471,'2005-08-18 11:57:00',242,101,'2005-08-26 13:17:00',2,'2006-02-15 21:30:53'),(12472,'2005-08-18 11:58:48',4458,297,'2005-08-27 16:37:48',2,'2006-02-15 21:30:53'),(12473,'2005-08-18 11:59:44',1237,303,'2005-08-21 13:38:44',1,'2006-02-15 21:30:53'),(12474,'2005-08-18 12:10:03',2240,78,'2005-08-27 17:05:03',1,'2006-02-15 21:30:53'),(12475,'2005-08-18 12:14:21',3118,401,'2005-08-24 14:43:21',2,'2006-02-15 21:30:53'),(12476,'2005-08-18 12:22:40',2784,122,'2005-08-20 17:29:40',2,'2006-02-15 21:30:53'),(12477,'2005-08-18 12:25:01',4516,74,'2005-08-25 17:25:01',2,'2006-02-15 21:30:53'),(12478,'2005-08-18 12:25:16',4512,42,'2005-08-22 06:27:16',2,'2006-02-15 21:30:53'),(12479,'2005-08-18 12:26:37',1119,401,'2005-08-21 18:08:37',2,'2006-02-15 21:30:53'),(12480,'2005-08-18 12:26:43',3339,446,'2005-08-26 13:23:43',1,'2006-02-15 21:30:53'),(12481,'2005-08-18 12:31:34',2424,218,'2005-08-21 16:08:34',2,'2006-02-15 21:30:53'),(12482,'2005-08-18 12:37:36',3778,247,'2005-08-26 09:53:36',1,'2006-02-15 21:30:53'),(12483,'2005-08-18 12:38:37',1805,488,'2005-08-24 13:26:37',1,'2006-02-15 21:30:53'),(12484,'2005-08-18 12:39:37',3690,300,'2005-08-24 08:47:37',2,'2006-02-15 21:30:53'),(12485,'2005-08-18 12:41:41',422,345,'2005-08-22 16:38:41',2,'2006-02-15 21:30:53'),(12486,'2005-08-18 12:42:50',2991,515,'2005-08-27 13:41:50',2,'2006-02-15 21:30:53'),(12487,'2005-08-18 12:45:24',2554,485,'2005-08-22 12:39:24',1,'2006-02-15 21:30:53'),(12488,'2005-08-18 12:48:22',3323,29,'2005-08-19 16:19:22',1,'2006-02-15 21:30:53'),(12489,'2006-02-14 15:16:03',387,60,NULL,2,'2006-02-15 21:30:53'),(12490,'2005-08-18 12:48:45',1577,187,'2005-08-27 15:53:45',1,'2006-02-15 21:30:53'),(12491,'2005-08-18 12:48:45',2354,247,'2005-08-22 12:40:45',2,'2006-02-15 21:30:53'),(12492,'2005-08-18 12:49:04',2839,224,'2005-08-26 17:55:04',1,'2006-02-15 21:30:53'),(12493,'2005-08-18 12:53:38',3029,487,'2005-08-27 13:15:38',2,'2006-02-15 21:30:53'),(12494,'2005-08-18 12:53:49',3845,522,'2005-08-26 15:52:49',1,'2006-02-15 21:30:53'),(12495,'2005-08-18 12:56:37',1225,102,'2005-08-22 06:58:37',1,'2006-02-15 21:30:53'),(12496,'2005-08-18 12:58:25',456,489,'2005-08-27 18:43:25',2,'2006-02-15 21:30:53'),(12497,'2005-08-18 12:58:40',824,388,'2005-08-24 08:24:40',1,'2006-02-15 21:30:53'),(12498,'2005-08-18 13:01:08',1063,408,'2005-08-21 13:12:08',1,'2006-02-15 21:30:53'),(12499,'2005-08-18 13:05:37',2611,42,'2005-08-19 07:41:37',1,'2006-02-15 21:30:53'),(12500,'2005-08-18 13:05:51',36,310,'2005-08-19 14:54:51',2,'2006-02-15 21:30:53'),(12501,'2005-08-18 13:13:13',728,173,'2005-08-23 07:24:13',2,'2006-02-15 21:30:53'),(12502,'2005-08-18 13:16:31',2153,235,'2005-08-19 17:47:31',1,'2006-02-15 21:30:53'),(12503,'2005-08-18 13:16:46',3548,379,'2005-08-19 10:24:46',2,'2006-02-15 21:30:53'),(12504,'2005-08-18 13:17:07',4429,44,'2005-08-24 09:13:07',2,'2006-02-15 21:30:53'),(12505,'2005-08-18 13:17:30',3741,406,'2005-08-23 18:03:30',1,'2006-02-15 21:30:53'),(12506,'2006-02-14 15:16:03',1132,114,NULL,2,'2006-02-15 21:30:53'),(12507,'2005-08-18 13:19:13',199,584,'2005-08-27 11:48:13',2,'2006-02-15 21:30:53'),(12508,'2005-08-18 13:20:13',1059,29,'2005-08-22 12:55:13',1,'2006-02-15 21:30:53'),(12509,'2005-08-18 13:21:52',2462,175,'2005-08-20 12:14:52',2,'2006-02-15 21:30:53'),(12510,'2005-08-18 13:22:25',3051,394,'2005-08-27 17:38:25',2,'2006-02-15 21:30:53'),(12511,'2005-08-18 13:23:19',919,447,'2005-08-22 11:43:19',2,'2006-02-15 21:30:53'),(12512,'2005-08-18 13:28:27',3959,148,'2005-08-26 19:08:27',2,'2006-02-15 21:30:53'),(12513,'2005-08-18 13:31:45',29,527,'2005-08-25 08:26:45',1,'2006-02-15 21:30:53'),(12514,'2005-08-18 13:33:55',3310,400,'2005-08-23 12:50:55',2,'2006-02-15 21:30:53'),(12515,'2005-08-18 13:39:26',2703,63,'2005-08-22 09:05:26',1,'2006-02-15 21:30:53'),(12516,'2005-08-18 13:39:53',1332,302,'2005-08-20 08:33:53',1,'2006-02-15 21:30:53'),(12517,'2005-08-18 13:40:20',2908,520,'2005-08-27 14:04:20',1,'2006-02-15 21:30:53'),(12518,'2005-08-18 13:41:32',3860,264,'2005-08-23 13:01:32',1,'2006-02-15 21:30:53'),(12519,'2005-08-18 13:42:14',2394,203,'2005-08-24 16:44:14',1,'2006-02-15 21:30:53'),(12520,'2005-08-18 13:42:45',681,52,'2005-08-23 12:54:45',2,'2006-02-15 21:30:53'),(12521,'2005-08-18 13:43:07',1022,369,'2005-08-21 07:53:07',1,'2006-02-15 21:30:53'),(12522,'2005-08-18 13:45:40',4435,342,'2005-08-27 17:05:40',1,'2006-02-15 21:30:53'),(12523,'2005-08-18 13:45:41',888,230,'2005-08-27 10:46:41',1,'2006-02-15 21:30:53'),(12524,'2006-02-14 15:16:03',857,438,NULL,1,'2006-02-15 21:30:53'),(12525,'2005-08-18 13:48:31',2357,96,'2005-08-23 13:04:31',2,'2006-02-15 21:30:53'),(12526,'2005-08-18 13:48:43',3541,54,'2005-08-19 10:05:43',1,'2006-02-15 21:30:53'),(12527,'2005-08-18 13:48:46',2536,459,'2005-08-26 13:31:46',2,'2006-02-15 21:30:53'),(12528,'2005-08-18 13:52:41',3381,398,'2005-08-27 09:09:41',2,'2006-02-15 21:30:53'),(12529,'2005-08-18 13:53:36',1956,382,'2005-08-19 18:20:36',2,'2006-02-15 21:30:53'),(12530,'2005-08-18 13:54:48',1054,521,'2005-08-26 08:58:48',2,'2006-02-15 21:30:53'),(12531,'2005-08-18 13:57:50',2771,27,'2005-08-22 09:46:50',2,'2006-02-15 21:30:53'),(12532,'2005-08-18 13:57:58',114,184,'2005-08-24 14:58:58',2,'2006-02-15 21:30:53'),(12533,'2005-08-18 14:01:40',795,331,'2005-08-20 15:32:40',1,'2006-02-15 21:30:53'),(12534,'2005-08-18 14:04:41',995,187,'2005-08-25 16:57:41',1,'2006-02-15 21:30:53'),(12535,'2005-08-18 14:05:22',2944,516,'2005-08-25 16:35:22',1,'2006-02-15 21:30:53'),(12536,'2005-08-18 14:06:06',2343,373,'2005-08-25 14:21:06',1,'2006-02-15 21:30:53'),(12537,'2005-08-18 14:06:39',57,56,'2005-08-25 09:36:39',2,'2006-02-15 21:30:53'),(12538,'2005-08-18 14:09:09',1373,118,'2005-08-23 19:12:09',1,'2006-02-15 21:30:53'),(12539,'2005-08-18 14:10:09',3259,136,'2005-08-19 19:44:09',2,'2006-02-15 21:30:53'),(12540,'2005-08-18 14:17:30',2826,304,'2005-08-26 15:33:30',2,'2006-02-15 21:30:53'),(12541,'2005-08-18 14:18:30',4357,584,'2005-08-26 10:24:30',1,'2006-02-15 21:30:53'),(12542,'2005-08-18 14:21:11',1920,230,'2005-08-20 16:06:11',2,'2006-02-15 21:30:53'),(12543,'2005-08-18 14:23:55',330,324,'2005-08-20 12:42:55',1,'2006-02-15 21:30:53'),(12544,'2005-08-18 14:25:51',3783,354,'2005-08-26 18:42:51',1,'2006-02-15 21:30:53'),(12545,'2005-08-18 14:28:00',1988,168,'2005-08-26 14:10:00',1,'2006-02-15 21:30:53'),(12546,'2005-08-18 14:29:37',610,30,'2005-08-26 09:47:37',1,'2006-02-15 21:30:53'),(12547,'2005-08-18 14:29:39',3046,591,'2005-08-22 16:52:39',2,'2006-02-15 21:30:53'),(12548,'2005-08-18 14:35:26',750,426,'2005-08-27 18:58:26',1,'2006-02-15 21:30:53'),(12549,'2005-08-18 14:38:07',1010,377,'2005-08-21 08:45:07',1,'2006-02-15 21:30:53'),(12550,'2005-08-18 14:40:38',4267,138,'2005-08-19 13:33:38',2,'2006-02-15 21:30:53'),(12551,'2005-08-18 14:46:26',2195,15,'2005-08-19 16:59:26',2,'2006-02-15 21:30:53'),(12552,'2005-08-18 14:46:34',4303,413,'2005-08-20 11:02:34',2,'2006-02-15 21:30:53'),(12553,'2005-08-18 14:46:54',2893,454,'2005-08-22 13:41:54',1,'2006-02-15 21:30:53'),(12554,'2005-08-18 14:47:28',715,404,'2005-08-25 14:34:28',2,'2006-02-15 21:30:53'),(12555,'2005-08-18 14:49:22',4434,557,'2005-08-26 14:11:22',2,'2006-02-15 21:30:53'),(12556,'2005-08-18 14:49:55',1984,3,'2005-08-24 15:20:55',2,'2006-02-15 21:30:53'),(12557,'2005-08-18 14:51:03',313,364,'2005-08-19 13:30:03',2,'2006-02-15 21:30:53'),(12558,'2005-08-18 14:52:35',167,289,'2005-08-26 09:45:35',2,'2006-02-15 21:30:53'),(12559,'2005-08-18 14:53:58',39,513,'2005-08-25 20:22:58',1,'2006-02-15 21:30:53'),(12560,'2005-08-18 14:54:19',829,596,'2005-08-27 13:39:19',1,'2006-02-15 21:30:53'),(12561,'2005-08-18 14:58:51',812,392,'2005-08-20 10:53:51',1,'2006-02-15 21:30:53'),(12562,'2005-08-18 15:00:03',529,212,'2005-08-23 12:55:03',2,'2006-02-15 21:30:53'),(12563,'2005-08-18 15:08:29',2552,393,'2005-08-27 15:15:29',1,'2006-02-15 21:30:53'),(12564,'2005-08-18 15:11:35',263,348,'2005-08-22 11:45:35',2,'2006-02-15 21:30:53'),(12565,'2005-08-18 15:12:17',1284,211,'2005-08-19 12:26:17',2,'2006-02-15 21:30:53'),(12566,'2005-08-18 15:13:04',1684,407,'2005-08-21 19:29:04',2,'2006-02-15 21:30:53'),(12567,'2005-08-18 15:14:36',2931,308,'2005-08-26 18:56:36',1,'2006-02-15 21:30:53'),(12568,'2005-08-18 15:15:44',2654,569,'2005-08-22 19:32:44',2,'2006-02-15 21:30:53'),(12569,'2005-08-18 15:20:46',1009,29,'2005-08-24 12:38:46',2,'2006-02-15 21:30:53'),(12570,'2005-08-18 15:23:31',3973,211,'2005-08-22 09:59:31',2,'2006-02-15 21:30:53'),(12571,'2005-08-18 15:31:18',1013,591,'2005-08-23 15:20:18',2,'2006-02-15 21:30:53'),(12572,'2005-08-18 15:32:54',1366,253,'2005-08-21 10:30:54',1,'2006-02-15 21:30:53'),(12573,'2005-08-18 15:32:57',1416,182,'2005-08-21 18:29:57',2,'2006-02-15 21:30:53'),(12574,'2006-02-14 15:16:03',177,317,NULL,2,'2006-02-15 21:30:53'),(12575,'2005-08-18 15:37:42',3441,117,'2005-08-25 19:17:42',1,'2006-02-15 21:30:53'),(12576,'2005-08-18 15:38:31',329,119,'2005-08-22 21:29:31',2,'2006-02-15 21:30:53'),(12577,'2005-08-18 15:39:46',4134,16,'2005-08-25 18:05:46',2,'2006-02-15 21:30:53'),(12578,'2005-08-18 15:47:11',930,514,'2005-08-21 10:55:11',1,'2006-02-15 21:30:53'),(12579,'2005-08-18 15:47:49',3021,547,'2005-08-20 18:12:49',2,'2006-02-15 21:30:53'),(12580,'2005-08-18 15:49:08',1197,53,'2005-08-24 11:03:08',2,'2006-02-15 21:30:53'),(12581,'2005-08-18 15:49:15',4309,70,'2005-08-23 20:18:15',1,'2006-02-15 21:30:53'),(12582,'2005-08-18 15:51:12',4467,462,'2005-08-20 12:05:12',1,'2006-02-15 21:30:53'),(12583,'2005-08-18 15:51:36',3090,108,'2005-08-20 18:47:36',2,'2006-02-15 21:30:53'),(12584,'2005-08-18 15:51:36',4487,371,'2005-08-25 19:21:36',1,'2006-02-15 21:30:53'),(12585,'2005-08-18 15:52:12',773,110,'2005-08-22 21:00:12',1,'2006-02-15 21:30:53'),(12586,'2005-08-18 15:54:39',4245,460,'2005-08-21 19:29:39',1,'2006-02-15 21:30:53'),(12587,'2005-08-18 16:03:13',3081,499,'2005-08-25 19:30:13',1,'2006-02-15 21:30:53'),(12588,'2005-08-18 16:04:45',694,415,'2005-08-23 20:30:45',1,'2006-02-15 21:30:53'),(12589,'2005-08-18 16:06:31',956,275,'2005-08-27 17:20:31',1,'2006-02-15 21:30:53'),(12590,'2005-08-18 16:11:35',2624,308,'2005-08-23 10:35:35',1,'2006-02-15 21:30:53'),(12591,'2005-08-18 16:16:41',723,546,'2005-08-24 10:29:41',2,'2006-02-15 21:30:53'),(12592,'2005-08-18 16:17:50',1618,305,'2005-08-25 20:20:50',1,'2006-02-15 21:30:53'),(12593,'2005-08-18 16:17:54',4092,72,'2005-08-21 18:02:54',2,'2006-02-15 21:30:53'),(12594,'2005-08-18 16:24:24',4421,198,'2005-08-25 15:45:24',1,'2006-02-15 21:30:53'),(12595,'2005-08-18 16:27:08',1662,286,'2005-08-19 14:53:08',1,'2006-02-15 21:30:53'),(12596,'2005-08-18 16:29:35',3662,378,'2005-08-24 16:48:35',1,'2006-02-15 21:30:53'),(12597,'2005-08-18 16:34:02',3804,474,'2005-08-25 17:30:02',2,'2006-02-15 21:30:53'),(12598,'2005-08-18 16:34:03',3159,340,'2005-08-22 16:44:03',1,'2006-02-15 21:30:53'),(12599,'2005-08-18 16:42:45',2032,34,'2005-08-23 18:27:45',2,'2006-02-15 21:30:53'),(12600,'2005-08-18 16:44:24',1475,171,'2005-08-25 17:28:24',1,'2006-02-15 21:30:53'),(12601,'2005-08-18 16:47:52',3099,598,'2005-08-24 11:05:52',1,'2006-02-15 21:30:53'),(12602,'2005-08-18 16:49:50',2001,533,'2005-08-21 11:13:50',2,'2006-02-15 21:30:53'),(12603,'2005-08-18 16:56:20',2769,119,'2005-08-25 11:50:20',2,'2006-02-15 21:30:53'),(12604,'2005-08-18 16:58:48',4127,12,'2005-08-19 19:36:48',1,'2006-02-15 21:30:53'),(12605,'2005-08-18 16:59:37',1359,496,'2005-08-20 18:09:37',1,'2006-02-15 21:30:53'),(12606,'2005-08-18 17:02:21',359,275,'2005-08-24 22:38:21',1,'2006-02-15 21:30:53'),(12607,'2005-08-18 17:03:49',2130,526,'2005-08-19 18:29:49',1,'2006-02-15 21:30:53'),(12608,'2005-08-18 17:05:15',624,366,'2005-08-23 17:00:15',2,'2006-02-15 21:30:53'),(12609,'2005-08-18 17:06:22',2327,486,'2005-08-20 21:30:22',1,'2006-02-15 21:30:53'),(12610,'2006-02-14 15:16:03',3181,269,NULL,1,'2006-02-15 21:30:53'),(12611,'2005-08-18 17:09:42',1925,359,'2005-08-24 11:57:42',2,'2006-02-15 21:30:53'),(12612,'2005-08-18 17:10:05',1035,129,'2005-08-26 15:55:05',2,'2006-02-15 21:30:53'),(12613,'2005-08-18 17:16:01',3877,8,'2005-08-23 18:40:01',2,'2006-02-15 21:30:53'),(12614,'2005-08-18 17:16:03',2233,60,'2005-08-26 16:56:03',2,'2006-02-15 21:30:53'),(12615,'2005-08-18 17:16:07',2191,29,'2005-08-27 12:57:07',1,'2006-02-15 21:30:53'),(12616,'2005-08-18 17:22:41',2952,476,'2005-08-25 18:52:41',2,'2006-02-15 21:30:53'),(12617,'2005-08-18 17:22:48',3573,564,'2005-08-24 17:40:48',2,'2006-02-15 21:30:53'),(12618,'2005-08-18 17:24:02',302,117,'2005-08-19 15:22:02',1,'2006-02-15 21:30:53'),(12619,'2005-08-18 17:24:15',980,592,'2005-08-21 15:56:15',1,'2006-02-15 21:30:53'),(12620,'2005-08-18 17:26:38',2663,221,'2005-08-25 13:24:38',1,'2006-02-15 21:30:53'),(12621,'2005-08-18 17:31:36',4566,439,'2005-08-24 16:43:36',2,'2006-02-15 21:30:53'),(12622,'2005-08-18 17:34:11',278,529,'2005-08-24 16:10:11',1,'2006-02-15 21:30:53'),(12623,'2005-08-18 17:34:19',3670,177,'2005-08-20 21:30:19',1,'2006-02-15 21:30:53'),(12624,'2005-08-18 17:35:00',1135,434,'2005-08-27 12:18:00',2,'2006-02-15 21:30:53'),(12625,'2005-08-18 17:36:19',2645,108,'2005-08-23 11:42:19',1,'2006-02-15 21:30:53'),(12626,'2005-08-18 17:36:45',4230,361,'2005-08-26 17:12:45',1,'2006-02-15 21:30:53'),(12627,'2005-08-18 17:37:11',3760,150,'2005-08-19 14:59:11',2,'2006-02-15 21:30:53'),(12628,'2005-08-18 17:40:25',3210,520,'2005-08-25 13:39:25',1,'2006-02-15 21:30:53'),(12629,'2005-08-18 17:40:33',1705,459,'2005-08-26 21:09:33',1,'2006-02-15 21:30:53'),(12630,'2005-08-18 17:49:28',1457,452,'2005-08-24 12:23:28',1,'2006-02-15 21:30:53'),(12631,'2005-08-18 17:52:51',2782,339,'2005-08-25 14:40:51',2,'2006-02-15 21:30:53'),(12632,'2005-08-18 17:54:21',827,381,'2005-08-22 18:58:21',1,'2006-02-15 21:30:53'),(12633,'2005-08-18 17:55:38',4341,469,'2005-08-23 17:19:38',2,'2006-02-15 21:30:53'),(12634,'2005-08-18 17:58:14',1037,549,'2005-08-19 21:08:14',2,'2006-02-15 21:30:53'),(12635,'2005-08-18 18:00:23',331,15,'2005-08-23 16:40:23',2,'2006-02-15 21:30:53'),(12636,'2005-08-18 18:00:29',1645,380,'2005-08-26 20:08:29',2,'2006-02-15 21:30:53'),(12637,'2005-08-18 18:06:53',4005,145,'2005-08-19 17:36:53',1,'2006-02-15 21:30:53'),(12638,'2005-08-18 18:11:39',2849,172,'2005-08-25 21:54:39',2,'2006-02-15 21:30:53'),(12639,'2005-08-18 18:13:05',562,500,'2005-08-27 16:00:05',2,'2006-02-15 21:30:53'),(12640,'2005-08-18 18:14:49',1715,544,'2005-08-24 21:25:49',1,'2006-02-15 21:30:53'),(12641,'2005-08-18 18:18:08',776,467,'2005-08-19 23:17:08',1,'2006-02-15 21:30:53'),(12642,'2005-08-18 18:19:16',2080,167,'2005-08-20 17:30:16',2,'2006-02-15 21:30:53'),(12643,'2005-08-18 18:21:06',2245,165,'2005-08-24 14:26:06',1,'2006-02-15 21:30:53'),(12644,'2005-08-18 18:22:27',1511,300,'2005-08-26 00:01:27',1,'2006-02-15 21:30:53'),(12645,'2006-02-14 15:16:03',1658,457,NULL,1,'2006-02-15 21:30:53'),(12646,'2005-08-18 18:25:06',3103,388,'2005-08-24 18:45:06',1,'2006-02-15 21:30:53'),(12647,'2005-08-18 18:29:51',323,520,'2005-08-27 22:51:51',1,'2006-02-15 21:30:53'),(12648,'2005-08-18 18:30:21',3545,519,'2005-08-25 19:17:21',1,'2006-02-15 21:30:53'),(12649,'2005-08-18 18:31:47',3201,530,'2005-08-22 21:07:47',2,'2006-02-15 21:30:53'),(12650,'2005-08-18 18:33:20',3237,276,'2005-08-21 17:45:20',2,'2006-02-15 21:30:53'),(12651,'2005-08-18 18:36:16',8,34,'2005-08-22 22:01:16',1,'2006-02-15 21:30:53'),(12652,'2005-08-18 18:48:58',2118,9,'2005-08-21 14:15:58',1,'2006-02-15 21:30:53'),(12653,'2005-08-18 18:53:17',3353,78,'2005-08-26 14:08:17',1,'2006-02-15 21:30:53'),(12654,'2005-08-18 18:56:40',2217,438,'2005-08-20 17:51:40',2,'2006-02-15 21:30:53'),(12655,'2005-08-18 18:57:44',859,533,'2005-08-27 22:40:44',2,'2006-02-15 21:30:53'),(12656,'2005-08-18 18:58:35',3981,286,'2005-08-21 00:41:35',1,'2006-02-15 21:30:53'),(12657,'2005-08-18 19:02:16',3621,100,'2005-08-21 14:59:16',1,'2006-02-15 21:30:53'),(12658,'2005-08-18 19:05:42',4320,193,'2005-08-19 19:08:42',1,'2006-02-15 21:30:53'),(12659,'2005-08-18 19:05:49',336,329,'2005-08-24 22:12:49',2,'2006-02-15 21:30:53'),(12660,'2005-08-18 19:07:23',414,21,'2005-08-27 17:20:23',2,'2006-02-15 21:30:53'),(12661,'2005-08-18 19:10:10',1547,333,'2005-08-22 20:30:10',1,'2006-02-15 21:30:53'),(12662,'2005-08-18 19:10:41',1412,75,'2005-08-23 16:59:41',1,'2006-02-15 21:30:53'),(12663,'2005-08-18 19:10:52',1163,375,'2005-08-19 15:46:52',1,'2006-02-15 21:30:53'),(12664,'2005-08-18 19:10:54',2732,577,'2005-08-25 19:19:54',1,'2006-02-15 21:30:53'),(12665,'2006-02-14 15:16:03',1701,410,NULL,2,'2006-02-15 21:30:53'),(12666,'2005-08-18 19:11:41',4156,251,'2005-08-21 18:04:41',2,'2006-02-15 21:30:53'),(12667,'2005-08-18 19:11:45',104,545,'2005-08-27 13:34:45',2,'2006-02-15 21:30:53'),(12668,'2005-08-18 19:16:47',1986,14,'2005-08-19 16:31:47',1,'2006-02-15 21:30:53'),(12669,'2005-08-18 19:17:47',4530,433,'2005-08-24 14:55:47',1,'2006-02-15 21:30:53'),(12670,'2005-08-18 19:17:58',1716,580,'2005-08-23 20:54:58',2,'2006-02-15 21:30:53'),(12671,'2005-08-18 19:19:59',1734,577,'2005-08-23 17:53:59',2,'2006-02-15 21:30:53'),(12672,'2006-02-14 15:16:03',1722,228,NULL,1,'2006-02-15 21:30:53'),(12673,'2005-08-18 19:21:56',4204,535,'2005-08-26 22:44:56',2,'2006-02-15 21:30:53'),(12674,'2005-08-18 19:24:56',636,185,'2005-08-26 22:16:56',2,'2006-02-15 21:30:53'),(12675,'2005-08-18 19:34:02',569,140,'2005-08-23 13:36:02',2,'2006-02-15 21:30:53'),(12676,'2005-08-18 19:34:40',2581,393,'2005-08-20 18:03:40',2,'2006-02-15 21:30:53'),(12677,'2005-08-18 19:36:05',1311,334,'2005-08-22 21:23:05',2,'2006-02-15 21:30:53'),(12678,'2005-08-18 19:41:27',2504,181,'2005-08-23 15:14:27',2,'2006-02-15 21:30:53'),(12679,'2005-08-18 19:42:11',1535,463,'2005-08-25 01:01:11',1,'2006-02-15 21:30:53'),(12680,'2005-08-18 19:43:46',833,259,'2005-08-27 00:08:46',2,'2006-02-15 21:30:53'),(12681,'2005-08-18 19:48:06',1570,518,'2005-08-23 15:05:06',2,'2006-02-15 21:30:53'),(12682,'2006-02-14 15:16:03',1148,245,NULL,2,'2006-02-15 21:30:53'),(12683,'2005-08-18 19:50:43',1802,166,'2005-08-26 00:47:43',1,'2006-02-15 21:30:53'),(12684,'2005-08-18 19:51:27',978,196,'2005-08-19 15:56:27',1,'2006-02-15 21:30:53'),(12685,'2005-08-18 19:51:29',4283,114,'2005-08-27 14:58:29',2,'2006-02-15 21:30:53'),(12686,'2005-08-18 19:55:09',501,385,'2005-08-26 14:17:09',1,'2006-02-15 21:30:53'),(12687,'2005-08-18 19:57:39',3092,285,'2005-08-27 01:36:39',2,'2006-02-15 21:30:53'),(12688,'2005-08-18 19:59:54',2315,65,'2005-08-26 18:52:54',2,'2006-02-15 21:30:53'),(12689,'2005-08-18 20:06:34',1066,296,'2005-08-22 20:11:34',2,'2006-02-15 21:30:53'),(12690,'2005-08-18 20:06:57',3574,361,'2005-08-24 20:54:57',2,'2006-02-15 21:30:53'),(12691,'2005-08-18 20:07:46',3744,534,'2005-08-26 18:49:46',2,'2006-02-15 21:30:53'),(12692,'2005-08-18 20:09:19',2781,273,'2005-08-21 00:14:19',1,'2006-02-15 21:30:53'),(12693,'2005-08-18 20:10:19',1543,584,'2005-08-25 21:11:19',1,'2006-02-15 21:30:53'),(12694,'2005-08-18 20:10:39',1741,268,'2005-08-25 20:47:39',1,'2006-02-15 21:30:53'),(12695,'2005-08-18 20:11:35',446,483,'2005-08-25 18:29:35',1,'2006-02-15 21:30:53'),(12696,'2005-08-18 20:13:08',3989,374,'2005-08-19 18:02:08',2,'2006-02-15 21:30:53'),(12697,'2005-08-18 20:14:56',2774,152,'2005-08-23 21:54:56',1,'2006-02-15 21:30:53'),(12698,'2006-02-14 15:16:03',3657,497,NULL,1,'2006-02-15 21:30:53'),(12699,'2005-08-18 20:20:59',3695,66,'2005-08-22 17:00:59',1,'2006-02-15 21:30:53'),(12700,'2005-08-18 20:24:46',540,397,'2005-08-23 21:50:46',1,'2006-02-15 21:30:53'),(12701,'2005-08-18 20:26:47',2337,489,'2005-08-26 23:36:47',2,'2006-02-15 21:30:53'),(12702,'2005-08-18 20:30:33',1884,474,'2005-08-27 01:22:33',2,'2006-02-15 21:30:53'),(12703,'2005-08-18 20:37:13',1278,453,'2005-08-26 16:13:13',1,'2006-02-15 21:30:53'),(12704,'2005-08-18 20:43:00',51,93,'2005-08-21 22:28:00',2,'2006-02-15 21:30:53'),(12705,'2005-08-18 20:44:14',2342,517,'2005-08-23 20:46:14',1,'2006-02-15 21:30:53'),(12706,'2005-08-18 20:44:34',1079,170,'2005-08-26 21:47:34',1,'2006-02-15 21:30:53'),(12707,'2005-08-18 20:52:02',1565,426,'2005-08-25 19:03:02',2,'2006-02-15 21:30:53'),(12708,'2005-08-18 20:59:17',3448,28,'2005-08-24 22:40:17',1,'2006-02-15 21:30:53'),(12709,'2005-08-18 20:59:51',3878,476,'2005-08-26 01:21:51',2,'2006-02-15 21:30:53'),(12710,'2005-08-18 21:02:50',3011,310,'2005-08-26 15:07:50',2,'2006-02-15 21:30:53'),(12711,'2005-08-18 21:03:32',2530,122,'2005-08-26 17:31:32',1,'2006-02-15 21:30:53'),(12712,'2005-08-18 21:04:13',2628,444,'2005-08-25 18:15:13',2,'2006-02-15 21:30:53'),(12713,'2005-08-18 21:07:28',1505,56,'2005-08-24 17:46:28',1,'2006-02-15 21:30:53'),(12714,'2005-08-18 21:08:01',868,372,'2005-08-27 17:09:01',2,'2006-02-15 21:30:53'),(12715,'2005-08-18 21:09:38',3768,266,'2005-08-21 20:25:38',1,'2006-02-15 21:30:53'),(12716,'2006-02-14 15:16:03',858,570,NULL,2,'2006-02-15 21:30:53'),(12717,'2005-08-18 21:15:40',3551,167,'2005-08-20 00:59:40',2,'2006-02-15 21:30:53'),(12718,'2005-08-18 21:21:44',3221,176,'2005-08-20 01:01:44',1,'2006-02-15 21:30:53'),(12719,'2006-02-14 15:16:03',1094,87,NULL,2,'2006-02-15 21:30:53'),(12720,'2005-08-18 21:28:42',2676,419,'2005-08-25 18:02:42',1,'2006-02-15 21:30:53'),(12721,'2005-08-18 21:30:12',1045,239,'2005-08-22 22:45:12',1,'2006-02-15 21:30:53'),(12722,'2005-08-18 21:33:53',913,416,'2005-08-27 23:47:53',2,'2006-02-15 21:30:53'),(12723,'2005-08-18 21:34:16',4167,430,'2005-08-22 22:37:16',1,'2006-02-15 21:30:53'),(12724,'2005-08-18 21:37:20',2224,242,'2005-08-27 21:56:20',2,'2006-02-15 21:30:53'),(12725,'2005-08-18 21:43:09',4071,51,'2005-08-23 18:50:09',1,'2006-02-15 21:30:53'),(12726,'2005-08-18 21:44:46',20,397,'2005-08-19 21:58:46',2,'2006-02-15 21:30:53'),(12727,'2005-08-18 21:45:15',15,178,'2005-08-24 15:52:15',1,'2006-02-15 21:30:53'),(12728,'2005-08-18 21:47:48',3156,129,'2005-08-25 16:13:48',1,'2006-02-15 21:30:53'),(12729,'2005-08-18 21:52:59',3711,424,'2005-08-21 00:02:59',1,'2006-02-15 21:30:53'),(12730,'2005-08-18 21:55:01',75,7,'2005-08-22 01:23:01',1,'2006-02-15 21:30:53'),(12731,'2005-08-18 21:55:38',1719,128,'2005-08-23 20:30:38',1,'2006-02-15 21:30:53'),(12732,'2005-08-18 21:57:50',3307,535,'2005-08-19 18:28:50',2,'2006-02-15 21:30:53'),(12733,'2005-08-18 21:59:00',3243,144,'2005-08-24 02:25:00',1,'2006-02-15 21:30:53'),(12734,'2005-08-18 22:04:52',3619,121,'2005-08-25 00:34:52',1,'2006-02-15 21:30:53'),(12735,'2005-08-18 22:04:54',3679,383,'2005-08-23 21:19:54',2,'2006-02-15 21:30:53'),(12736,'2006-02-14 15:16:03',3591,244,NULL,2,'2006-02-15 21:30:53'),(12737,'2005-08-18 22:11:37',736,204,'2005-08-26 04:08:37',1,'2006-02-15 21:30:53'),(12738,'2005-08-18 22:11:47',4313,589,'2005-08-27 17:55:47',2,'2006-02-15 21:30:53'),(12739,'2005-08-18 22:15:18',4129,292,'2005-08-27 00:37:18',2,'2006-02-15 21:30:53'),(12740,'2005-08-18 22:17:04',1157,330,'2005-08-23 23:42:04',1,'2006-02-15 21:30:53'),(12741,'2005-08-18 22:17:05',2084,435,'2005-08-25 20:07:05',2,'2006-02-15 21:30:53'),(12742,'2005-08-18 22:22:03',1742,68,'2005-08-22 04:01:03',1,'2006-02-15 21:30:53'),(12743,'2005-08-18 22:22:31',2630,565,'2005-08-27 00:31:31',1,'2006-02-15 21:30:53'),(12744,'2005-08-18 22:22:36',3815,593,'2005-08-24 00:26:36',1,'2006-02-15 21:30:53'),(12745,'2005-08-18 22:22:45',262,24,'2005-08-20 01:44:45',2,'2006-02-15 21:30:53'),(12746,'2006-02-14 15:16:03',1012,211,NULL,1,'2006-02-15 21:30:53'),(12747,'2005-08-18 22:28:22',4075,549,'2005-08-22 22:25:22',2,'2006-02-15 21:30:53'),(12748,'2005-08-18 22:29:05',3249,373,'2005-08-24 18:25:05',2,'2006-02-15 21:30:53'),(12749,'2005-08-18 22:31:21',828,388,'2005-08-20 22:53:21',1,'2006-02-15 21:30:53'),(12750,'2005-08-18 22:32:39',3717,535,'2005-08-26 01:54:39',1,'2006-02-15 21:30:53'),(12751,'2005-08-18 22:33:22',2791,352,'2005-08-20 20:28:22',2,'2006-02-15 21:30:53'),(12752,'2005-08-18 22:33:36',3595,514,'2005-08-27 23:55:36',1,'2006-02-15 21:30:53'),(12753,'2005-08-18 22:37:39',1494,470,'2005-08-27 00:21:39',2,'2006-02-15 21:30:53'),(12754,'2005-08-18 22:37:41',4154,134,'2005-08-27 20:17:41',2,'2006-02-15 21:30:53'),(12755,'2005-08-18 22:38:47',105,439,'2005-08-22 23:58:47',1,'2006-02-15 21:30:53'),(12756,'2005-08-18 22:52:13',1840,89,'2005-08-21 17:22:13',1,'2006-02-15 21:30:53'),(12757,'2005-08-18 22:57:45',1095,147,'2005-08-21 22:43:45',1,'2006-02-15 21:30:53'),(12758,'2005-08-18 22:58:34',2279,30,'2005-08-22 23:33:34',1,'2006-02-15 21:30:53'),(12759,'2006-02-14 15:16:03',4193,354,NULL,2,'2006-02-15 21:30:53'),(12760,'2005-08-18 23:03:19',4188,363,'2005-08-24 17:53:19',1,'2006-02-15 21:30:53'),(12761,'2005-08-18 23:05:22',2684,364,'2005-08-22 01:08:22',2,'2006-02-15 21:30:53'),(12762,'2005-08-18 23:06:54',3909,502,'2005-08-21 18:30:54',1,'2006-02-15 21:30:53'),(12763,'2005-08-18 23:07:01',393,472,'2005-08-21 18:45:01',1,'2006-02-15 21:30:53'),(12764,'2005-08-18 23:14:15',26,183,'2005-08-22 20:23:15',1,'2006-02-15 21:30:53'),(12765,'2005-08-18 23:21:50',2244,298,'2005-08-28 04:42:50',2,'2006-02-15 21:30:53'),(12766,'2005-08-18 23:25:20',3737,50,'2005-08-27 04:43:20',1,'2006-02-15 21:30:53'),(12767,'2005-08-18 23:25:49',3351,432,'2005-08-28 02:40:49',2,'2006-02-15 21:30:53'),(12768,'2005-08-18 23:26:11',1993,458,'2005-08-19 20:31:11',2,'2006-02-15 21:30:53'),(12769,'2005-08-18 23:26:40',926,504,'2005-08-25 03:03:40',1,'2006-02-15 21:30:53'),(12770,'2005-08-18 23:29:00',1654,575,'2005-08-26 20:57:00',2,'2006-02-15 21:30:53'),(12771,'2005-08-18 23:29:23',3076,484,'2005-08-22 17:31:23',2,'2006-02-15 21:30:53'),(12772,'2005-08-18 23:29:25',1179,397,'2005-08-23 20:32:25',1,'2006-02-15 21:30:53'),(12773,'2005-08-18 23:32:19',4390,360,'2005-08-27 04:40:19',1,'2006-02-15 21:30:53'),(12774,'2005-08-18 23:34:22',3601,21,'2005-08-28 05:00:22',2,'2006-02-15 21:30:53'),(12775,'2005-08-18 23:35:56',4374,54,'2005-08-26 18:37:56',1,'2006-02-15 21:30:53'),(12776,'2005-08-18 23:37:33',2345,55,'2005-08-23 03:07:33',1,'2006-02-15 21:30:53'),(12777,'2005-08-18 23:39:22',3467,130,'2005-08-27 20:28:22',1,'2006-02-15 21:30:53'),(12778,'2005-08-18 23:40:23',3626,290,'2005-08-19 18:14:23',2,'2006-02-15 21:30:53'),(12779,'2005-08-18 23:44:00',1814,325,'2005-08-26 05:27:00',2,'2006-02-15 21:30:53'),(12780,'2005-08-18 23:48:16',54,373,'2005-08-20 18:13:16',2,'2006-02-15 21:30:53'),(12781,'2005-08-18 23:50:24',1187,168,'2005-08-21 02:31:24',1,'2006-02-15 21:30:53'),(12782,'2005-08-18 23:56:23',1454,495,'2005-08-25 18:47:23',1,'2006-02-15 21:30:53'),(12783,'2005-08-19 00:01:14',1109,503,'2005-08-21 22:02:14',2,'2006-02-15 21:30:53'),(12784,'2005-08-19 00:02:46',447,513,'2005-08-20 04:39:46',1,'2006-02-15 21:30:53'),(12785,'2005-08-19 00:05:49',4190,145,'2005-08-21 04:39:49',2,'2006-02-15 21:30:53'),(12786,'2006-02-14 15:16:03',97,512,NULL,1,'2006-02-15 21:30:53'),(12787,'2005-08-19 00:07:58',2023,278,'2005-08-24 00:42:58',2,'2006-02-15 21:30:53'),(12788,'2005-08-19 00:15:09',644,90,'2005-08-27 21:54:09',1,'2006-02-15 21:30:53'),(12789,'2005-08-19 00:16:19',2412,557,'2005-08-25 00:18:19',2,'2006-02-15 21:30:53'),(12790,'2005-08-19 00:16:54',1281,44,'2005-08-26 02:00:54',1,'2006-02-15 21:30:53'),(12791,'2005-08-19 00:17:09',3594,573,'2005-08-22 23:46:09',1,'2006-02-15 21:30:53'),(12792,'2006-02-14 15:16:03',1435,405,NULL,2,'2006-02-15 21:30:53'),(12793,'2005-08-19 00:20:36',1195,403,'2005-08-28 02:43:36',1,'2006-02-15 21:30:53'),(12794,'2005-08-19 00:20:37',1586,336,'2005-08-26 01:48:37',1,'2006-02-15 21:30:53'),(12795,'2005-08-19 00:21:52',2745,360,'2005-08-22 22:13:52',2,'2006-02-15 21:30:53'),(12796,'2005-08-19 00:22:24',1285,368,'2005-08-19 22:53:24',2,'2006-02-15 21:30:53'),(12797,'2005-08-19 00:24:08',1595,5,'2005-08-21 22:53:08',2,'2006-02-15 21:30:53'),(12798,'2005-08-19 00:24:33',4244,534,'2005-08-21 23:01:33',2,'2006-02-15 21:30:53'),(12799,'2005-08-19 00:27:01',3885,197,'2005-08-22 03:30:01',2,'2006-02-15 21:30:53'),(12800,'2005-08-19 00:27:11',257,545,'2005-08-22 01:08:11',1,'2006-02-15 21:30:53'),(12801,'2005-08-19 00:27:19',960,202,'2005-08-26 03:10:19',1,'2006-02-15 21:30:53'),(12802,'2005-08-19 00:27:41',2461,462,'2005-08-28 03:24:41',1,'2006-02-15 21:30:53'),(12803,'2005-08-19 00:28:21',1058,390,'2005-08-23 02:02:21',1,'2006-02-15 21:30:53'),(12804,'2005-08-19 00:33:15',147,365,'2005-08-28 02:16:15',2,'2006-02-15 21:30:53'),(12805,'2005-08-19 00:36:34',2964,345,'2005-08-26 20:38:34',1,'2006-02-15 21:30:53'),(12806,'2005-08-19 00:37:26',4488,423,'2005-08-23 18:49:26',2,'2006-02-15 21:30:53'),(12807,'2005-08-19 00:38:46',2323,513,'2005-08-28 03:37:46',2,'2006-02-15 21:30:53'),(12808,'2005-08-19 00:40:41',3920,55,'2005-08-21 06:39:41',2,'2006-02-15 21:30:53'),(12809,'2005-08-19 00:42:24',2005,22,'2005-08-23 06:06:24',1,'2006-02-15 21:30:53'),(12810,'2005-08-19 00:44:10',1340,250,'2005-08-22 22:30:10',2,'2006-02-15 21:30:53'),(12811,'2005-08-19 00:51:28',641,54,'2005-08-24 01:57:28',2,'2006-02-15 21:30:53'),(12812,'2005-08-19 00:54:02',4024,450,'2005-08-22 20:35:02',2,'2006-02-15 21:30:53'),(12813,'2005-08-19 00:54:22',3285,500,'2005-08-19 21:17:22',2,'2006-02-15 21:30:53'),(12814,'2005-08-19 00:58:24',204,465,'2005-08-21 05:46:24',1,'2006-02-15 21:30:53'),(12815,'2005-08-19 00:59:42',435,588,'2005-08-25 21:43:42',2,'2006-02-15 21:30:53'),(12816,'2005-08-19 01:04:05',4051,342,'2005-08-24 01:25:05',1,'2006-02-15 21:30:53'),(12817,'2005-08-19 01:04:35',1246,113,'2005-08-25 21:14:35',1,'2006-02-15 21:30:53'),(12818,'2005-08-19 01:04:59',3069,528,'2005-08-26 21:39:59',2,'2006-02-15 21:30:53'),(12819,'2005-08-19 01:05:05',1117,542,'2005-08-22 05:50:05',1,'2006-02-15 21:30:53'),(12820,'2005-08-19 01:05:08',2936,127,'2005-08-21 05:37:08',2,'2006-02-15 21:30:53'),(12821,'2005-08-19 01:07:02',3418,41,'2005-08-23 01:22:02',2,'2006-02-15 21:30:53'),(12822,'2005-08-19 01:15:24',419,426,'2005-08-20 06:38:24',1,'2006-02-15 21:30:53'),(12823,'2005-08-19 01:15:47',426,316,'2005-08-22 05:32:47',2,'2006-02-15 21:30:53'),(12824,'2005-08-19 01:18:00',1875,247,'2005-08-22 01:12:00',2,'2006-02-15 21:30:53'),(12825,'2005-08-19 01:23:58',4495,328,'2005-08-20 00:19:58',2,'2006-02-15 21:30:53'),(12826,'2005-08-19 01:25:11',1277,439,'2005-08-27 01:22:11',1,'2006-02-15 21:30:53'),(12827,'2005-08-19 01:27:23',880,253,'2005-08-27 02:22:23',2,'2006-02-15 21:30:53'),(12828,'2005-08-19 01:37:47',4208,378,'2005-08-24 22:31:47',2,'2006-02-15 21:30:53'),(12829,'2005-08-19 01:38:18',1129,326,'2005-08-25 22:23:18',2,'2006-02-15 21:30:53'),(12830,'2005-08-19 01:40:25',4080,409,'2005-08-20 23:49:25',2,'2006-02-15 21:30:53'),(12831,'2005-08-19 01:40:43',1916,183,'2005-08-28 05:22:43',1,'2006-02-15 21:30:53'),(12832,'2005-08-19 01:41:44',2820,563,'2005-08-24 23:15:44',2,'2006-02-15 21:30:53'),(12833,'2005-08-19 01:42:28',3723,59,'2005-08-26 20:13:28',1,'2006-02-15 21:30:53'),(12834,'2005-08-19 01:47:30',757,133,'2005-08-24 20:08:30',1,'2006-02-15 21:30:53'),(12835,'2005-08-19 01:47:45',1477,124,'2005-08-26 00:58:45',2,'2006-02-15 21:30:53'),(12836,'2005-08-19 01:48:33',1380,196,'2005-08-23 04:46:33',1,'2006-02-15 21:30:53'),(12837,'2005-08-19 01:51:09',2288,495,'2005-08-22 07:14:09',2,'2006-02-15 21:30:53'),(12838,'2005-08-19 01:51:50',1207,308,'2005-08-27 23:12:50',1,'2006-02-15 21:30:53'),(12839,'2005-08-19 01:53:43',1970,360,'2005-08-28 02:27:43',2,'2006-02-15 21:30:53'),(12840,'2005-08-19 01:54:11',2098,182,'2005-08-28 01:11:11',2,'2006-02-15 21:30:53'),(12841,'2005-08-19 01:55:55',4233,257,'2005-08-24 02:56:55',1,'2006-02-15 21:30:53'),(12842,'2005-08-19 01:57:21',2540,119,'2005-08-28 01:10:21',1,'2006-02-15 21:30:53'),(12843,'2005-08-19 01:58:54',3279,128,'2005-08-20 00:20:54',2,'2006-02-15 21:30:53'),(12844,'2005-08-19 01:59:08',4146,584,'2005-08-24 22:21:08',1,'2006-02-15 21:30:53'),(12845,'2005-08-19 02:02:37',1698,106,'2005-08-22 01:08:37',1,'2006-02-15 21:30:53'),(12846,'2005-08-19 02:03:26',286,305,'2005-08-25 07:39:26',2,'2006-02-15 21:30:53'),(12847,'2005-08-19 02:04:07',384,91,'2005-08-23 20:13:07',2,'2006-02-15 21:30:53'),(12848,'2005-08-19 02:05:11',2833,539,'2005-08-24 05:27:11',2,'2006-02-15 21:30:53'),(12849,'2005-08-19 02:05:37',3489,280,'2005-08-23 07:00:37',1,'2006-02-15 21:30:53'),(12850,'2005-08-19 02:08:06',1816,440,'2005-08-20 21:06:06',2,'2006-02-15 21:30:53'),(12851,'2005-08-19 02:12:12',3311,194,'2005-08-25 23:51:12',1,'2006-02-15 21:30:53'),(12852,'2005-08-19 02:12:40',2446,260,'2005-08-19 23:42:40',1,'2006-02-15 21:30:53'),(12853,'2005-08-19 02:15:32',3753,232,'2005-08-27 21:26:32',2,'2006-02-15 21:30:53'),(12854,'2005-08-19 02:18:51',4577,362,'2005-08-24 04:16:51',2,'2006-02-15 21:30:53'),(12855,'2005-08-19 02:18:58',2900,242,'2005-08-19 20:50:58',1,'2006-02-15 21:30:53'),(12856,'2005-08-19 02:19:13',132,4,'2005-08-23 07:49:13',2,'2006-02-15 21:30:53'),(12857,'2005-08-19 02:20:13',4307,443,'2005-08-20 20:20:13',1,'2006-02-15 21:30:53'),(12858,'2005-08-19 02:22:16',3024,144,'2005-08-26 07:25:16',2,'2006-02-15 21:30:53'),(12859,'2005-08-19 02:23:23',2289,139,'2005-08-28 04:55:23',2,'2006-02-15 21:30:53'),(12860,'2005-08-19 02:24:41',778,548,'2005-08-25 07:43:41',1,'2006-02-15 21:30:53'),(12861,'2005-08-19 02:30:24',3115,287,'2005-08-22 08:23:24',1,'2006-02-15 21:30:53'),(12862,'2005-08-19 02:31:59',473,198,'2005-08-26 08:16:59',2,'2006-02-15 21:30:53'),(12863,'2005-08-19 02:35:59',780,234,'2005-08-21 21:13:59',1,'2006-02-15 21:30:53'),(12864,'2005-08-19 02:38:26',4481,465,'2005-08-22 21:42:26',2,'2006-02-15 21:30:53'),(12865,'2005-08-19 02:38:50',3437,460,'2005-08-21 02:33:50',1,'2006-02-15 21:30:53'),(12866,'2005-08-19 02:39:47',1766,229,'2005-08-27 02:14:47',1,'2006-02-15 21:30:53'),(12867,'2005-08-19 02:40:11',4499,330,'2005-08-20 04:01:11',1,'2006-02-15 21:30:53'),(12868,'2005-08-19 02:47:19',4054,551,'2005-08-20 00:30:19',2,'2006-02-15 21:30:53'),(12869,'2005-08-19 02:50:36',3939,99,'2005-08-26 21:38:36',2,'2006-02-15 21:30:53'),(12870,'2005-08-19 02:54:38',991,86,'2005-08-27 00:45:38',1,'2006-02-15 21:30:53'),(12871,'2005-08-19 02:55:36',2625,217,'2005-08-22 01:00:36',2,'2006-02-15 21:30:53'),(12872,'2005-08-19 02:57:37',1975,54,'2005-08-22 23:23:37',1,'2006-02-15 21:30:53'),(12873,'2005-08-19 03:05:41',2140,138,'2005-08-22 06:57:41',2,'2006-02-15 21:30:53'),(12874,'2005-08-19 03:07:57',848,254,'2005-08-22 22:42:57',2,'2006-02-15 21:30:53'),(12875,'2005-08-19 03:10:21',1708,483,'2005-08-26 01:00:21',2,'2006-02-15 21:30:53'),(12876,'2005-08-19 03:12:19',803,356,'2005-08-20 02:24:19',2,'2006-02-15 21:30:53'),(12877,'2005-08-19 03:16:58',1016,40,'2005-08-25 02:10:58',2,'2006-02-15 21:30:53'),(12878,'2005-08-19 03:17:08',1182,596,'2005-08-23 03:44:08',1,'2006-02-15 21:30:53'),(12879,'2005-08-19 03:22:55',3556,210,'2005-08-24 22:00:55',1,'2006-02-15 21:30:53'),(12880,'2005-08-19 03:27:17',3386,552,'2005-08-28 06:16:17',2,'2006-02-15 21:30:53'),(12881,'2005-08-19 03:28:13',1432,121,'2005-08-25 05:25:13',1,'2006-02-15 21:30:53'),(12882,'2005-08-19 03:33:46',911,153,'2005-08-21 22:49:46',1,'2006-02-15 21:30:53'),(12883,'2005-08-19 03:33:47',964,555,'2005-08-23 21:55:47',1,'2006-02-15 21:30:53'),(12884,'2005-08-19 03:34:04',2768,348,'2005-08-28 01:00:04',2,'2006-02-15 21:30:53'),(12885,'2005-08-19 03:37:25',883,185,'2005-08-20 22:10:25',1,'2006-02-15 21:30:53'),(12886,'2005-08-19 03:38:32',2157,174,'2005-08-26 02:17:32',1,'2006-02-15 21:30:53'),(12887,'2005-08-19 03:38:54',1214,150,'2005-08-27 08:45:54',1,'2006-02-15 21:30:53'),(12888,'2005-08-19 03:41:09',4398,146,'2005-08-24 07:09:09',2,'2006-02-15 21:30:53'),(12889,'2005-08-19 03:41:31',4376,515,'2005-08-27 00:46:31',2,'2006-02-15 21:30:53'),(12890,'2005-08-19 03:42:08',3831,150,'2005-08-19 23:08:08',1,'2006-02-15 21:30:53'),(12891,'2006-02-14 15:16:03',2764,388,NULL,2,'2006-02-15 21:30:53'),(12892,'2005-08-19 03:46:34',1044,121,'2005-08-21 05:11:34',2,'2006-02-15 21:30:53'),(12893,'2005-08-19 03:46:43',168,498,'2005-08-20 08:38:43',2,'2006-02-15 21:30:53'),(12894,'2005-08-19 03:49:28',4581,541,'2005-08-25 01:51:28',2,'2006-02-15 21:30:53'),(12895,'2005-08-19 03:50:48',4372,396,'2005-08-26 09:13:48',1,'2006-02-15 21:30:53'),(12896,'2005-08-19 03:52:44',148,220,'2005-08-24 22:27:44',1,'2006-02-15 21:30:53'),(12897,'2006-02-14 15:16:03',1512,178,NULL,2,'2006-02-15 21:30:53'),(12898,'2005-08-19 03:54:34',1555,586,'2005-08-23 08:14:34',2,'2006-02-15 21:30:53'),(12899,'2005-08-19 04:03:34',830,105,'2005-08-20 08:34:34',2,'2006-02-15 21:30:53'),(12900,'2005-08-19 04:03:49',849,408,'2005-08-24 22:11:49',2,'2006-02-15 21:30:53'),(12901,'2006-02-14 15:16:03',2799,180,NULL,2,'2006-02-15 21:30:53'),(12902,'2006-02-14 15:16:03',464,91,NULL,2,'2006-02-15 21:30:53'),(12903,'2005-08-19 04:09:38',2340,302,'2005-08-26 03:24:38',2,'2006-02-15 21:30:53'),(12904,'2005-08-19 04:10:50',459,257,'2005-08-27 23:24:50',1,'2006-02-15 21:30:53'),(12905,'2005-08-19 04:13:37',1043,480,'2005-08-26 23:52:37',1,'2006-02-15 21:30:53'),(12906,'2005-08-19 04:13:43',2060,401,'2005-08-20 04:24:43',1,'2006-02-15 21:30:53'),(12907,'2005-08-19 04:16:13',2844,422,'2005-08-27 02:43:13',1,'2006-02-15 21:30:53'),(12908,'2005-08-19 04:19:05',175,340,'2005-08-25 09:50:05',1,'2006-02-15 21:30:53'),(12909,'2005-08-19 04:20:25',4300,210,'2005-08-24 06:40:25',2,'2006-02-15 21:30:53'),(12910,'2005-08-19 04:23:13',3968,128,'2005-08-20 22:27:13',1,'2006-02-15 21:30:53'),(12911,'2005-08-19 04:24:10',1770,367,'2005-08-26 00:35:10',2,'2006-02-15 21:30:53'),(12912,'2005-08-19 04:24:35',1747,364,'2005-08-27 07:13:35',2,'2006-02-15 21:30:53'),(12913,'2005-08-19 04:25:39',3719,356,'2005-08-25 07:23:39',1,'2006-02-15 21:30:53'),(12914,'2005-08-19 04:25:59',4396,501,'2005-08-23 08:04:59',2,'2006-02-15 21:30:53'),(12915,'2006-02-14 15:16:03',2651,516,NULL,1,'2006-02-15 21:30:53'),(12916,'2005-08-19 04:27:05',2277,157,'2005-08-21 02:33:05',2,'2006-02-15 21:30:53'),(12917,'2005-08-19 04:27:11',107,152,'2005-08-20 03:04:11',2,'2006-02-15 21:30:53'),(12918,'2005-08-19 04:31:36',972,13,'2005-08-25 05:50:36',1,'2006-02-15 21:30:53'),(12919,'2005-08-19 04:32:15',2121,263,'2005-08-24 05:56:15',2,'2006-02-15 21:30:53'),(12920,'2005-08-19 04:32:32',2516,511,'2005-08-27 00:44:32',2,'2006-02-15 21:30:53'),(12921,'2005-08-19 04:47:48',781,234,'2005-08-25 00:07:48',2,'2006-02-15 21:30:53'),(12922,'2005-08-19 04:48:48',342,25,'2005-08-23 23:32:48',1,'2006-02-15 21:30:53'),(12923,'2005-08-19 04:50:20',1390,531,'2005-08-22 10:42:20',1,'2006-02-15 21:30:53'),(12924,'2005-08-19 04:51:47',3807,519,'2005-08-26 07:50:47',1,'2006-02-15 21:30:53'),(12925,'2005-08-19 04:59:01',3361,57,'2005-08-27 02:03:01',2,'2006-02-15 21:30:53'),(12926,'2005-08-19 05:00:16',23,336,'2005-08-26 06:12:16',2,'2006-02-15 21:30:53'),(12927,'2005-08-19 05:02:46',1171,223,'2005-08-23 01:08:46',1,'2006-02-15 21:30:53'),(12928,'2005-08-19 05:04:09',4531,353,'2005-08-24 09:09:09',2,'2006-02-15 21:30:53'),(12929,'2005-08-19 05:05:23',1531,310,'2005-08-25 04:37:23',1,'2006-02-15 21:30:53'),(12930,'2005-08-19 05:11:32',4410,414,'2005-08-22 02:20:32',2,'2006-02-15 21:30:53'),(12931,'2005-08-19 05:11:47',3070,407,'2005-08-21 00:59:47',1,'2006-02-15 21:30:53'),(12932,'2005-08-19 05:17:30',2295,416,'2005-08-21 09:24:30',1,'2006-02-15 21:30:53'),(12933,'2005-08-19 05:18:20',4103,589,'2005-08-27 00:13:20',1,'2006-02-15 21:30:53'),(12934,'2005-08-19 05:18:42',3242,591,'2005-08-24 10:42:42',1,'2006-02-15 21:30:53'),(12935,'2005-08-19 05:20:25',193,279,'2005-08-21 03:10:25',2,'2006-02-15 21:30:53'),(12936,'2005-08-19 05:25:06',654,387,'2005-08-28 08:21:06',1,'2006-02-15 21:30:53'),(12937,'2005-08-19 05:25:30',3826,348,'2005-08-22 10:40:30',2,'2006-02-15 21:30:53'),(12938,'2006-02-14 15:16:03',3987,28,NULL,1,'2006-02-15 21:30:53'),(12939,'2005-08-19 05:38:25',3375,181,'2005-08-23 23:52:25',1,'2006-02-15 21:30:53'),(12940,'2005-08-19 05:38:29',2222,340,'2005-08-20 08:15:29',1,'2006-02-15 21:30:53'),(12941,'2005-08-19 05:39:26',2951,195,'2005-08-22 09:50:26',2,'2006-02-15 21:30:53'),(12942,'2005-08-19 05:40:36',3938,103,'2005-08-27 02:04:36',1,'2006-02-15 21:30:53'),(12943,'2005-08-19 05:46:26',3930,547,'2005-08-22 03:26:26',2,'2006-02-15 21:30:53'),(12944,'2005-08-19 05:48:12',2956,148,'2005-08-28 10:10:12',1,'2006-02-15 21:30:53'),(12945,'2005-08-19 05:51:46',3638,312,'2005-08-23 11:22:46',2,'2006-02-15 21:30:53'),(12946,'2005-08-19 05:53:34',2066,444,'2005-08-20 07:30:34',1,'2006-02-15 21:30:53'),(12947,'2005-08-19 05:54:21',935,499,'2005-08-22 09:17:21',1,'2006-02-15 21:30:53'),(12948,'2005-08-19 05:55:14',4173,442,'2005-08-22 01:05:14',2,'2006-02-15 21:30:53'),(12949,'2005-08-19 05:55:52',4209,279,'2005-08-23 00:01:52',1,'2006-02-15 21:30:53'),(12950,'2005-08-19 05:55:58',1064,463,'2005-08-23 08:05:58',1,'2006-02-15 21:30:53'),(12951,'2005-08-19 05:56:44',2143,70,'2005-08-24 11:28:44',2,'2006-02-15 21:30:53'),(12952,'2005-08-19 06:00:52',2460,228,'2005-08-20 02:17:52',1,'2006-02-15 21:30:53'),(12953,'2005-08-19 06:04:07',3954,429,'2005-08-28 11:05:07',1,'2006-02-15 21:30:53'),(12954,'2005-08-19 06:04:34',3592,63,'2005-08-28 02:12:34',2,'2006-02-15 21:30:53'),(12955,'2005-08-19 06:05:58',2040,410,'2005-08-26 04:24:58',2,'2006-02-15 21:30:53'),(12956,'2005-08-19 06:06:26',3613,241,'2005-08-28 08:37:26',2,'2006-02-15 21:30:53'),(12957,'2005-08-19 06:12:44',2219,512,'2005-08-28 10:49:44',2,'2006-02-15 21:30:53'),(12958,'2005-08-19 06:19:21',4214,569,'2005-08-20 02:21:21',1,'2006-02-15 21:30:53'),(12959,'2006-02-14 15:16:03',1540,284,NULL,2,'2006-02-15 21:30:53'),(12960,'2005-08-19 06:21:52',3498,152,'2005-08-25 04:16:52',1,'2006-02-15 21:30:53'),(12961,'2005-08-19 06:22:37',4529,386,'2005-08-23 00:49:37',1,'2006-02-15 21:30:53'),(12962,'2005-08-19 06:22:48',575,171,'2005-08-27 07:47:48',1,'2006-02-15 21:30:53'),(12963,'2005-08-19 06:26:04',1521,2,'2005-08-23 11:37:04',2,'2006-02-15 21:30:53'),(12964,'2005-08-19 06:29:13',2854,142,'2005-08-22 12:23:13',2,'2006-02-15 21:30:53'),(12965,'2005-08-19 06:33:00',4308,430,'2005-08-22 02:02:00',1,'2006-02-15 21:30:53'),(12966,'2005-08-19 06:37:48',3196,69,'2005-08-26 03:59:48',2,'2006-02-15 21:30:53'),(12967,'2005-08-19 06:37:51',3404,170,'2005-08-25 06:58:51',2,'2006-02-15 21:30:53'),(12968,'2005-08-19 06:38:18',3108,166,'2005-08-20 08:29:18',1,'2006-02-15 21:30:53'),(12969,'2005-08-19 06:38:59',191,224,'2005-08-25 09:09:59',2,'2006-02-15 21:30:53'),(12970,'2006-02-14 15:16:03',3999,216,NULL,1,'2006-02-15 21:30:53'),(12971,'2005-08-19 06:42:43',3504,492,'2005-08-23 10:49:43',2,'2006-02-15 21:30:53'),(12972,'2005-08-19 06:43:28',1218,55,'2005-08-27 11:30:28',1,'2006-02-15 21:30:53'),(12973,'2005-08-19 06:48:11',128,163,'2005-08-22 07:18:11',2,'2006-02-15 21:30:53'),(12974,'2005-08-19 06:51:02',3599,218,'2005-08-25 11:48:02',2,'2006-02-15 21:30:53'),(12975,'2005-08-19 06:51:19',3300,236,'2005-08-25 04:22:19',1,'2006-02-15 21:30:53'),(12976,'2005-08-19 06:52:58',66,592,'2005-08-26 11:23:58',2,'2006-02-15 21:30:53'),(12977,'2005-08-19 06:55:33',2004,388,'2005-08-27 07:38:33',2,'2006-02-15 21:30:53'),(12978,'2005-08-19 06:57:27',3252,167,'2005-08-20 09:10:27',2,'2006-02-15 21:30:53'),(12979,'2005-08-19 07:00:35',1227,267,'2005-08-21 06:12:35',2,'2006-02-15 21:30:53'),(12980,'2005-08-19 07:03:14',1854,144,'2005-08-26 05:07:14',1,'2006-02-15 21:30:53'),(12981,'2005-08-19 07:04:00',3925,481,'2005-08-21 09:17:00',1,'2006-02-15 21:30:53'),(12982,'2005-08-19 07:06:34',1258,44,'2005-08-21 06:53:34',1,'2006-02-15 21:30:53'),(12983,'2005-08-19 07:06:51',406,148,'2005-08-28 10:35:51',2,'2006-02-15 21:30:53'),(12984,'2005-08-19 07:06:51',4211,537,'2005-08-22 04:04:51',1,'2006-02-15 21:30:53'),(12985,'2005-08-19 07:08:05',4133,83,'2005-08-24 02:25:05',1,'2006-02-15 21:30:53'),(12986,'2005-08-19 07:09:36',1145,210,'2005-08-22 05:01:36',1,'2006-02-15 21:30:53'),(12987,'2005-08-19 07:11:44',3665,134,'2005-08-20 04:17:44',1,'2006-02-15 21:30:53'),(12988,'2006-02-14 15:16:03',81,236,NULL,2,'2006-02-15 21:30:53'),(12989,'2005-08-19 07:19:04',2929,306,'2005-08-21 10:58:04',1,'2006-02-15 21:30:53'),(12990,'2005-08-19 07:20:39',1825,360,'2005-08-21 12:31:39',2,'2006-02-15 21:30:53'),(12991,'2005-08-19 07:21:24',2227,126,'2005-08-21 04:31:24',2,'2006-02-15 21:30:53'),(12992,'2005-08-19 07:23:06',3022,597,'2005-08-23 06:11:06',2,'2006-02-15 21:30:53'),(12993,'2005-08-19 07:24:03',4225,484,'2005-08-26 07:15:03',2,'2006-02-15 21:30:53'),(12994,'2005-08-19 07:26:10',3809,506,'2005-08-20 07:02:10',2,'2006-02-15 21:30:53'),(12995,'2005-08-19 07:26:30',2069,566,'2005-08-25 12:47:30',2,'2006-02-15 21:30:53'),(12996,'2005-08-19 07:31:32',4445,380,'2005-08-25 11:59:32',1,'2006-02-15 21:30:53'),(12997,'2005-08-19 07:31:46',1661,311,'2005-08-24 09:20:46',2,'2006-02-15 21:30:53'),(12998,'2005-08-19 07:32:16',2301,354,'2005-08-24 01:56:16',2,'2006-02-15 21:30:53'),(12999,'2005-08-19 07:34:53',661,24,'2005-08-26 03:57:53',1,'2006-02-15 21:30:53'),(13000,'2005-08-19 07:36:42',2341,141,'2005-08-22 08:50:42',1,'2006-02-15 21:30:53'),(13001,'2005-08-19 07:36:44',2505,254,'2005-08-22 13:06:44',1,'2006-02-15 21:30:53'),(13002,'2005-08-19 07:37:58',3892,477,'2005-08-26 11:32:58',2,'2006-02-15 21:30:53'),(13003,'2005-08-19 07:39:29',3431,451,'2005-08-23 05:48:29',2,'2006-02-15 21:30:53'),(13004,'2005-08-19 07:40:08',771,442,'2005-08-20 11:49:08',1,'2006-02-15 21:30:53'),(13005,'2005-08-19 07:45:42',3417,104,'2005-08-20 12:45:42',2,'2006-02-15 21:30:53'),(13006,'2005-08-19 07:47:16',3157,134,'2005-08-21 06:17:16',1,'2006-02-15 21:30:53'),(13007,'2005-08-19 07:47:43',4280,430,'2005-08-26 02:48:43',2,'2006-02-15 21:30:53'),(13008,'2006-02-14 15:16:03',1838,181,NULL,1,'2006-02-15 21:30:53'),(13009,'2005-08-19 07:50:35',677,376,'2005-08-21 06:04:35',1,'2006-02-15 21:30:53'),(13010,'2005-08-19 07:52:21',825,413,'2005-08-27 12:51:21',1,'2006-02-15 21:30:53'),(13011,'2005-08-19 07:53:58',1998,529,'2005-08-24 12:00:58',1,'2006-02-15 21:30:53'),(13012,'2005-08-19 07:54:59',1690,145,'2005-08-26 09:50:59',2,'2006-02-15 21:30:53'),(13013,'2005-08-19 07:55:51',841,293,'2005-08-26 05:14:51',1,'2006-02-15 21:30:53'),(13014,'2005-08-19 07:56:08',3400,344,'2005-08-21 10:20:08',2,'2006-02-15 21:30:53'),(13015,'2005-08-19 07:56:51',3461,126,'2005-08-28 07:05:51',2,'2006-02-15 21:30:53'),(13016,'2005-08-19 07:57:14',3095,175,'2005-08-23 03:29:14',1,'2006-02-15 21:30:53'),(13017,'2005-08-19 08:02:24',2160,104,'2005-08-26 07:32:24',1,'2006-02-15 21:30:53'),(13018,'2005-08-19 08:04:50',2122,168,'2005-08-26 11:46:50',1,'2006-02-15 21:30:53'),(13019,'2005-08-19 08:07:43',2827,597,'2005-08-20 12:09:43',2,'2006-02-15 21:30:53'),(13020,'2005-08-19 08:07:50',4501,92,'2005-08-28 11:42:50',1,'2006-02-15 21:30:53'),(13021,'2005-08-19 08:08:04',1242,309,'2005-08-26 12:04:04',2,'2006-02-15 21:30:53'),(13022,'2006-02-14 15:16:03',2266,336,NULL,2,'2006-02-15 21:30:53'),(13023,'2005-08-19 08:13:54',1566,69,'2005-08-27 13:18:54',1,'2006-02-15 21:30:53'),(13024,'2005-08-19 08:19:21',2917,401,'2005-08-27 05:18:21',1,'2006-02-15 21:30:53'),(13025,'2006-02-14 15:16:03',4066,269,NULL,1,'2006-02-15 21:30:53'),(13026,'2005-08-19 08:22:45',3026,79,'2005-08-21 09:31:45',1,'2006-02-15 21:30:53'),(13027,'2005-08-19 08:25:16',3756,128,'2005-08-25 13:42:16',1,'2006-02-15 21:30:53'),(13028,'2005-08-19 08:27:23',2165,371,'2005-08-24 03:46:23',1,'2006-02-15 21:30:53'),(13029,'2005-08-19 08:28:04',3283,293,'2005-08-22 12:25:04',2,'2006-02-15 21:30:53'),(13030,'2005-08-19 08:28:11',2614,240,'2005-08-24 07:20:11',1,'2006-02-15 21:30:53'),(13031,'2005-08-19 08:30:04',1525,567,'2005-08-23 09:35:04',2,'2006-02-15 21:30:53'),(13032,'2005-08-19 08:31:50',3699,82,'2005-08-23 04:00:50',2,'2006-02-15 21:30:53'),(13033,'2005-08-19 08:34:39',1682,344,'2005-08-28 10:13:39',1,'2006-02-15 21:30:53'),(13034,'2005-08-19 08:41:29',990,387,'2005-08-20 07:36:29',2,'2006-02-15 21:30:53'),(13035,'2005-08-19 08:46:45',4082,135,'2005-08-22 11:42:45',1,'2006-02-15 21:30:53'),(13036,'2005-08-19 08:48:37',1469,20,'2005-08-22 04:13:37',2,'2006-02-15 21:30:53'),(13037,'2005-08-19 08:53:57',65,275,'2005-08-28 08:56:57',2,'2006-02-15 21:30:53'),(13038,'2005-08-19 08:55:16',2226,532,'2005-08-25 12:23:16',2,'2006-02-15 21:30:53'),(13039,'2005-08-19 08:55:19',1952,370,'2005-08-20 07:39:19',2,'2006-02-15 21:30:53'),(13040,'2005-08-19 09:04:24',4113,425,'2005-08-23 12:36:24',2,'2006-02-15 21:30:53'),(13041,'2005-08-19 09:05:38',1576,462,'2005-08-27 06:34:38',1,'2006-02-15 21:30:53'),(13042,'2005-08-19 09:06:08',1047,414,'2005-08-22 13:46:08',2,'2006-02-15 21:30:53'),(13043,'2005-08-19 09:07:13',24,127,'2005-08-27 07:49:13',1,'2006-02-15 21:30:53'),(13044,'2005-08-19 09:14:31',809,142,'2005-08-20 11:16:31',1,'2006-02-15 21:30:53'),(13045,'2005-08-19 09:17:35',389,254,'2005-08-23 12:04:35',1,'2006-02-15 21:30:53'),(13046,'2005-08-19 09:21:10',965,37,'2005-08-26 13:00:10',2,'2006-02-15 21:30:53'),(13047,'2005-08-19 09:24:49',2704,394,'2005-08-24 11:06:49',2,'2006-02-15 21:30:53'),(13048,'2005-08-19 09:25:06',1029,486,'2005-08-28 11:18:06',2,'2006-02-15 21:30:53'),(13049,'2005-08-19 09:25:40',4122,53,'2005-08-27 10:19:40',2,'2006-02-15 21:30:53'),(13050,'2005-08-19 09:31:23',3682,131,'2005-08-26 06:56:23',2,'2006-02-15 21:30:53'),(13051,'2005-08-19 09:31:33',4064,90,'2005-08-28 06:15:33',1,'2006-02-15 21:30:53'),(13052,'2005-08-19 09:31:42',3036,502,'2005-08-28 15:11:42',2,'2006-02-15 21:30:53'),(13053,'2005-08-19 09:31:48',2044,140,'2005-08-28 07:51:48',2,'2006-02-15 21:30:53'),(13054,'2005-08-19 09:34:02',2983,325,'2005-08-23 05:25:02',2,'2006-02-15 21:30:53'),(13055,'2005-08-19 09:36:28',3580,485,'2005-08-24 05:53:28',2,'2006-02-15 21:30:53'),(13056,'2006-02-14 15:16:03',3751,115,NULL,2,'2006-02-15 21:30:53'),(13057,'2005-08-19 09:40:05',876,105,'2005-08-28 13:22:05',2,'2006-02-15 21:30:53'),(13058,'2005-08-19 09:40:53',2437,24,'2005-08-26 05:48:53',2,'2006-02-15 21:30:53'),(13059,'2005-08-19 09:42:01',3810,341,'2005-08-21 12:07:01',1,'2006-02-15 21:30:53'),(13060,'2005-08-19 09:43:25',507,22,'2005-08-28 15:22:25',1,'2006-02-15 21:30:53'),(13061,'2005-08-19 09:43:39',730,576,'2005-08-24 10:03:39',1,'2006-02-15 21:30:53'),(13062,'2005-08-19 09:44:17',1790,385,'2005-08-27 11:42:17',1,'2006-02-15 21:30:53'),(13063,'2005-08-19 09:45:41',1192,5,'2005-08-24 09:11:41',2,'2006-02-15 21:30:53'),(13064,'2005-08-19 09:46:53',4131,588,'2005-08-21 08:29:53',1,'2006-02-15 21:30:53'),(13065,'2005-08-19 09:48:52',1887,518,'2005-08-22 07:12:52',1,'2006-02-15 21:30:53'),(13066,'2005-08-19 09:50:39',3730,336,'2005-08-22 14:01:39',1,'2006-02-15 21:30:53'),(13067,'2005-08-19 09:51:17',3825,172,'2005-08-25 09:58:17',2,'2006-02-15 21:30:53'),(13068,'2005-08-19 09:55:16',3019,1,'2005-08-20 14:44:16',2,'2006-02-15 21:30:53'),(13069,'2005-08-19 09:55:20',368,299,'2005-08-24 04:10:20',2,'2006-02-15 21:30:53'),(13070,'2005-08-19 09:56:23',2214,235,'2005-08-24 09:08:23',2,'2006-02-15 21:30:53'),(13071,'2005-08-19 10:01:07',527,578,'2005-08-26 14:26:07',1,'2006-02-15 21:30:53'),(13072,'2005-08-19 10:03:30',2313,447,'2005-08-22 14:27:30',2,'2006-02-15 21:30:53'),(13073,'2005-08-19 10:05:38',855,506,'2005-08-26 07:37:38',2,'2006-02-15 21:30:53'),(13074,'2005-08-19 10:06:53',3266,341,'2005-08-28 09:56:53',2,'2006-02-15 21:30:53'),(13075,'2005-08-19 10:10:10',4125,224,'2005-08-21 08:44:10',2,'2006-02-15 21:30:53'),(13076,'2005-08-19 10:10:26',1226,201,'2005-08-22 05:41:26',1,'2006-02-15 21:30:53'),(13077,'2005-08-19 10:15:19',433,241,'2005-08-21 06:51:19',2,'2006-02-15 21:30:53'),(13078,'2005-08-19 10:16:43',4104,479,'2005-08-27 11:35:43',2,'2006-02-15 21:30:53'),(13079,'2006-02-14 15:16:03',733,107,NULL,1,'2006-02-15 21:30:53'),(13080,'2005-08-19 10:18:00',4222,452,'2005-08-22 06:37:00',2,'2006-02-15 21:30:53'),(13081,'2005-08-19 10:19:06',3077,170,'2005-08-20 05:49:06',1,'2006-02-15 21:30:53'),(13082,'2005-08-19 10:19:19',2117,387,'2005-08-28 05:02:19',1,'2006-02-15 21:30:53'),(13083,'2005-08-19 10:26:45',3469,455,'2005-08-23 05:31:45',2,'2006-02-15 21:30:53'),(13084,'2005-08-19 10:27:25',3792,204,'2005-08-26 07:32:25',2,'2006-02-15 21:30:53'),(13085,'2005-08-19 10:28:22',360,215,'2005-08-22 07:37:22',2,'2006-02-15 21:30:53'),(13086,'2005-08-19 10:32:28',3712,350,'2005-08-26 07:57:28',2,'2006-02-15 21:30:53'),(13087,'2005-08-19 10:33:52',2693,171,'2005-08-27 09:15:52',2,'2006-02-15 21:30:53'),(13088,'2005-08-19 10:36:11',4281,457,'2005-08-21 09:12:11',1,'2006-02-15 21:30:53'),(13089,'2005-08-19 10:38:56',1783,63,'2005-08-24 12:41:56',1,'2006-02-15 21:30:53'),(13090,'2005-08-19 10:39:54',1447,52,'2005-08-28 10:31:54',1,'2006-02-15 21:30:53'),(13091,'2005-08-19 10:40:10',1815,127,'2005-08-23 09:03:10',1,'2006-02-15 21:30:53'),(13092,'2005-08-19 10:41:09',4359,480,'2005-08-25 05:11:09',2,'2006-02-15 21:30:53'),(13093,'2005-08-19 10:46:16',1667,160,'2005-08-26 08:05:16',1,'2006-02-15 21:30:53'),(13094,'2005-08-19 10:47:58',3178,494,'2005-08-21 06:20:58',1,'2006-02-15 21:30:53'),(13095,'2005-08-19 10:48:10',520,508,'2005-08-28 06:15:10',1,'2006-02-15 21:30:53'),(13096,'2005-08-19 10:49:03',420,13,'2005-08-21 05:33:03',1,'2006-02-15 21:30:53'),(13097,'2005-08-19 10:50:43',4194,157,'2005-08-24 11:10:43',2,'2006-02-15 21:30:53'),(13098,'2005-08-19 10:51:59',3770,51,'2005-08-24 11:27:59',1,'2006-02-15 21:30:53'),(13099,'2005-08-19 10:55:19',969,436,'2005-08-27 10:54:19',1,'2006-02-15 21:30:53'),(13100,'2005-08-19 10:55:45',916,451,'2005-08-25 12:28:45',1,'2006-02-15 21:30:53'),(13101,'2005-08-19 11:01:54',1804,39,'2005-08-27 16:06:54',2,'2006-02-15 21:30:53'),(13102,'2005-08-19 11:02:03',2885,285,'2005-08-28 13:05:03',2,'2006-02-15 21:30:53'),(13103,'2005-08-19 11:05:51',1751,274,'2005-08-26 09:16:51',2,'2006-02-15 21:30:53'),(13104,'2005-08-19 11:06:06',310,591,'2005-08-21 13:50:06',2,'2006-02-15 21:30:53'),(13105,'2005-08-19 11:06:16',729,279,'2005-08-27 15:21:16',1,'2006-02-15 21:30:53'),(13106,'2006-02-14 15:16:03',3212,440,NULL,1,'2006-02-15 21:30:53'),(13107,'2005-08-19 11:13:58',3870,356,'2005-08-20 15:03:58',2,'2006-02-15 21:30:53'),(13108,'2006-02-14 15:16:03',3630,73,NULL,1,'2006-02-15 21:30:53'),(13109,'2005-08-19 11:23:20',46,259,'2005-08-25 17:05:20',1,'2006-02-15 21:30:53'),(13110,'2005-08-19 11:24:37',62,447,'2005-08-21 05:48:37',1,'2006-02-15 21:30:53'),(13111,'2005-08-19 11:25:10',580,26,'2005-08-21 05:52:10',2,'2006-02-15 21:30:53'),(13112,'2005-08-19 11:27:10',2074,259,'2005-08-22 05:32:10',1,'2006-02-15 21:30:53'),(13113,'2005-08-19 11:27:20',2393,573,'2005-08-23 12:40:20',1,'2006-02-15 21:30:53'),(13114,'2005-08-19 11:27:32',4342,550,'2005-08-28 11:21:32',2,'2006-02-15 21:30:53'),(13115,'2005-08-19 11:27:43',1961,84,'2005-08-20 10:58:43',1,'2006-02-15 21:30:53'),(13116,'2005-08-19 11:31:41',1544,150,'2005-08-27 16:05:41',1,'2006-02-15 21:30:53'),(13117,'2005-08-19 11:33:20',3430,385,'2005-08-20 11:55:20',2,'2006-02-15 21:30:53'),(13118,'2005-08-19 11:39:58',470,181,'2005-08-25 14:44:58',1,'2006-02-15 21:30:53'),(13119,'2005-08-19 11:44:59',1401,240,'2005-08-20 12:30:59',2,'2006-02-15 21:30:53'),(13120,'2005-08-19 11:47:38',2273,314,'2005-08-26 08:20:38',2,'2006-02-15 21:30:53'),(13121,'2005-08-19 11:51:39',3517,251,'2005-08-22 11:50:39',2,'2006-02-15 21:30:53'),(13122,'2005-08-19 11:53:49',3319,277,'2005-08-26 16:01:49',2,'2006-02-15 21:30:53'),(13123,'2005-08-19 11:55:13',2804,220,'2005-08-21 05:55:13',2,'2006-02-15 21:30:53'),(13124,'2005-08-19 11:55:59',2105,78,'2005-08-26 06:01:59',2,'2006-02-15 21:30:53'),(13125,'2005-08-19 11:57:49',3722,192,'2005-08-26 07:53:49',1,'2006-02-15 21:30:53'),(13126,'2005-08-19 12:00:28',1392,253,'2005-08-28 17:27:28',1,'2006-02-15 21:30:53'),(13127,'2005-08-19 12:04:03',2582,178,'2005-08-27 13:56:03',1,'2006-02-15 21:30:53'),(13128,'2005-08-19 12:04:16',485,206,'2005-08-26 16:06:16',2,'2006-02-15 21:30:53'),(13129,'2005-08-19 12:05:04',4455,274,'2005-08-26 10:24:04',1,'2006-02-15 21:30:53'),(13130,'2005-08-19 12:06:42',2006,254,'2005-08-23 12:08:42',1,'2006-02-15 21:30:53'),(13131,'2005-08-19 12:08:13',1466,480,'2005-08-27 13:43:13',2,'2006-02-15 21:30:53'),(13132,'2005-08-19 12:10:57',1748,529,'2005-08-27 12:22:57',2,'2006-02-15 21:30:53'),(13133,'2005-08-19 12:11:03',1635,523,'2005-08-28 12:36:03',2,'2006-02-15 21:30:53'),(13134,'2005-08-19 12:14:14',1354,184,'2005-08-20 11:52:14',1,'2006-02-15 21:30:53'),(13135,'2005-08-19 12:22:52',1585,361,'2005-08-21 14:04:52',2,'2006-02-15 21:30:53'),(13136,'2005-08-19 12:24:23',2532,50,'2005-08-28 08:37:23',2,'2006-02-15 21:30:53'),(13137,'2005-08-19 12:26:32',4431,20,'2005-08-22 13:26:32',1,'2006-02-15 21:30:53'),(13138,'2005-08-19 12:30:01',3138,214,'2005-08-21 06:35:01',2,'2006-02-15 21:30:53'),(13139,'2005-08-19 12:32:10',2099,554,'2005-08-24 12:12:10',1,'2006-02-15 21:30:53'),(13140,'2005-08-19 12:35:56',4210,323,'2005-08-27 18:24:56',2,'2006-02-15 21:30:53'),(13141,'2005-08-19 12:41:41',4545,376,'2005-08-21 08:17:41',2,'2006-02-15 21:30:53'),(13142,'2005-08-19 12:42:28',1404,269,'2005-08-26 14:52:28',1,'2006-02-15 21:30:53'),(13143,'2005-08-19 12:44:38',1655,371,'2005-08-25 10:59:38',2,'2006-02-15 21:30:53'),(13144,'2005-08-19 12:45:55',3766,456,'2005-08-27 10:37:55',2,'2006-02-15 21:30:53'),(13145,'2005-08-19 12:53:53',1383,72,'2005-08-23 08:06:53',1,'2006-02-15 21:30:53'),(13146,'2005-08-19 12:54:42',1463,116,'2005-08-26 07:31:42',1,'2006-02-15 21:30:53'),(13147,'2005-08-19 12:55:09',3490,37,'2005-08-22 18:10:09',1,'2006-02-15 21:30:53'),(13148,'2005-08-19 12:55:30',1762,137,'2005-08-21 11:01:30',1,'2006-02-15 21:30:53'),(13149,'2005-08-19 13:07:12',1436,40,'2005-08-28 18:12:12',1,'2006-02-15 21:30:53'),(13150,'2005-08-19 13:08:19',1514,457,'2005-08-25 18:00:19',1,'2006-02-15 21:30:53'),(13151,'2005-08-19 13:08:23',3045,16,'2005-08-20 12:38:23',2,'2006-02-15 21:30:53'),(13152,'2005-08-19 13:09:32',3571,597,'2005-08-25 14:47:32',1,'2006-02-15 21:30:53'),(13153,'2005-08-19 13:09:47',3896,431,'2005-08-23 17:35:47',2,'2006-02-15 21:30:53'),(13154,'2005-08-19 13:09:54',2465,255,'2005-08-26 16:40:54',1,'2006-02-15 21:30:53'),(13155,'2005-08-19 13:10:23',290,442,'2005-08-25 19:07:23',2,'2006-02-15 21:30:53'),(13156,'2005-08-19 13:10:42',770,512,'2005-08-25 15:08:42',2,'2006-02-15 21:30:53'),(13157,'2005-08-19 13:12:28',4391,592,'2005-08-20 10:41:28',1,'2006-02-15 21:30:53'),(13158,'2005-08-19 13:18:10',944,327,'2005-08-25 09:27:10',1,'2006-02-15 21:30:53'),(13159,'2005-08-19 13:19:59',2300,497,'2005-08-21 09:22:59',2,'2006-02-15 21:30:53'),(13160,'2005-08-19 13:21:04',410,484,'2005-08-22 18:49:04',1,'2006-02-15 21:30:53'),(13161,'2006-02-14 15:16:03',986,175,NULL,1,'2006-02-15 21:30:53'),(13162,'2005-08-19 13:28:26',1845,478,'2005-08-24 17:37:26',1,'2006-02-15 21:30:53'),(13163,'2005-08-19 13:29:46',3068,57,'2005-08-22 07:48:46',2,'2006-02-15 21:30:53'),(13164,'2005-08-19 13:30:55',1104,145,'2005-08-26 10:12:55',2,'2006-02-15 21:30:53'),(13165,'2005-08-19 13:34:10',138,289,'2005-08-21 18:33:10',2,'2006-02-15 21:30:53'),(13166,'2005-08-19 13:36:28',4386,504,'2005-08-22 07:57:28',1,'2006-02-15 21:30:53'),(13167,'2005-08-19 13:36:41',557,120,'2005-08-23 15:29:41',2,'2006-02-15 21:30:53'),(13168,'2005-08-19 13:37:28',2210,186,'2005-08-27 17:54:28',2,'2006-02-15 21:30:53'),(13169,'2005-08-19 13:43:35',1709,141,'2005-08-26 09:31:35',1,'2006-02-15 21:30:53'),(13170,'2005-08-19 13:45:48',1072,176,'2005-08-27 11:00:48',2,'2006-02-15 21:30:53'),(13171,'2005-08-19 13:48:54',1765,122,'2005-08-27 18:57:54',1,'2006-02-15 21:30:53'),(13172,'2005-08-19 13:49:07',1301,298,'2005-08-20 19:39:07',2,'2006-02-15 21:30:53'),(13173,'2005-08-19 13:50:36',1304,29,'2005-08-26 12:34:36',2,'2006-02-15 21:30:53'),(13174,'2005-08-19 13:52:50',2303,482,'2005-08-22 14:43:50',2,'2006-02-15 21:30:53'),(13175,'2005-08-19 13:54:53',3187,239,'2005-08-20 16:25:53',2,'2006-02-15 21:30:53'),(13176,'2005-08-19 13:56:54',2269,1,'2005-08-23 08:50:54',2,'2006-02-15 21:30:53'),(13177,'2005-08-19 13:56:58',3172,126,'2005-08-23 13:13:58',2,'2006-02-15 21:30:53'),(13178,'2006-02-14 15:16:03',693,394,NULL,1,'2006-02-15 21:30:53'),(13179,'2005-08-19 13:59:53',1624,104,'2005-08-25 12:10:53',1,'2006-02-15 21:30:53'),(13180,'2005-08-19 14:00:38',3443,322,'2005-08-20 09:56:38',1,'2006-02-15 21:30:53'),(13181,'2005-08-19 14:00:56',1256,128,'2005-08-24 13:52:56',2,'2006-02-15 21:30:53'),(13182,'2006-02-14 15:16:03',364,496,NULL,2,'2006-02-15 21:30:53'),(13183,'2005-08-19 14:09:26',2404,301,'2005-08-28 08:44:26',2,'2006-02-15 21:30:53'),(13184,'2005-08-19 14:16:18',4395,393,'2005-08-20 08:44:18',1,'2006-02-15 21:30:53'),(13185,'2005-08-19 14:22:30',241,174,'2005-08-20 10:13:30',2,'2006-02-15 21:30:53'),(13186,'2005-08-19 14:23:19',2802,176,'2005-08-28 11:26:19',1,'2006-02-15 21:30:53'),(13187,'2005-08-19 14:24:48',1944,543,'2005-08-20 19:37:48',1,'2006-02-15 21:30:53'),(13188,'2005-08-19 14:27:03',583,472,'2005-08-28 09:15:03',2,'2006-02-15 21:30:53'),(13189,'2005-08-19 14:27:16',3444,368,'2005-08-28 10:34:16',1,'2006-02-15 21:30:53'),(13190,'2005-08-19 14:27:59',4316,290,'2005-08-26 13:45:59',1,'2006-02-15 21:30:53'),(13191,'2005-08-19 14:28:48',2753,371,'2005-08-23 12:53:48',2,'2006-02-15 21:30:53'),(13192,'2005-08-19 14:30:06',966,532,'2005-08-27 15:20:06',1,'2006-02-15 21:30:53'),(13193,'2005-08-19 14:33:45',523,118,'2005-08-28 08:46:45',2,'2006-02-15 21:30:53'),(13194,'2005-08-19 14:34:12',2473,58,'2005-08-26 10:18:12',2,'2006-02-15 21:30:53'),(13195,'2005-08-19 14:39:14',2537,565,'2005-08-24 10:30:14',2,'2006-02-15 21:30:53'),(13196,'2005-08-19 14:40:32',458,202,'2005-08-26 18:15:32',2,'2006-02-15 21:30:53'),(13197,'2005-08-19 14:44:03',3190,358,'2005-08-22 10:11:03',1,'2006-02-15 21:30:53'),(13198,'2005-08-19 14:47:18',4273,169,'2005-08-21 18:09:18',2,'2006-02-15 21:30:53'),(13199,'2005-08-19 14:53:22',4291,339,'2005-08-27 19:03:22',2,'2006-02-15 21:30:53'),(13200,'2005-08-19 14:55:58',2746,577,'2005-08-27 11:35:58',2,'2006-02-15 21:30:53'),(13201,'2005-08-19 14:56:05',111,508,'2005-08-25 14:37:05',1,'2006-02-15 21:30:53'),(13202,'2005-08-19 14:58:30',3546,381,'2005-08-27 17:10:30',1,'2006-02-15 21:30:53'),(13203,'2005-08-19 15:00:58',804,257,'2005-08-27 15:38:58',2,'2006-02-15 21:30:53'),(13204,'2005-08-19 15:02:48',4524,152,'2005-08-24 18:07:48',1,'2006-02-15 21:30:53'),(13205,'2005-08-19 15:05:26',2616,495,'2005-08-25 10:41:26',2,'2006-02-15 21:30:53'),(13206,'2005-08-19 15:05:34',2477,504,'2005-08-21 20:37:34',2,'2006-02-15 21:30:53'),(13207,'2005-08-19 15:14:38',674,58,'2005-08-27 16:09:38',1,'2006-02-15 21:30:53'),(13208,'2005-08-19 15:18:55',609,435,'2005-08-24 11:59:55',1,'2006-02-15 21:30:53'),(13209,'2006-02-14 15:16:03',1574,5,NULL,2,'2006-02-15 21:30:53'),(13210,'2005-08-19 15:23:38',2789,487,'2005-08-21 11:57:38',1,'2006-02-15 21:30:53'),(13211,'2005-08-19 15:23:41',1968,289,'2005-08-22 16:58:41',1,'2006-02-15 21:30:53'),(13212,'2005-08-19 15:24:07',3691,158,'2005-08-24 21:03:07',1,'2006-02-15 21:30:53'),(13213,'2005-08-19 15:25:48',1546,13,'2005-08-22 09:32:48',1,'2006-02-15 21:30:53'),(13214,'2005-08-19 15:31:06',2675,157,'2005-08-20 19:58:06',2,'2006-02-15 21:30:53'),(13215,'2005-08-19 15:35:38',3740,460,'2005-08-27 12:16:38',1,'2006-02-15 21:30:53'),(13216,'2005-08-19 15:36:05',4335,422,'2005-08-25 19:03:05',2,'2006-02-15 21:30:53'),(13217,'2005-08-19 15:38:39',616,565,'2005-08-21 14:33:39',1,'2006-02-15 21:30:53'),(13218,'2005-08-19 15:39:39',4148,257,'2005-08-22 17:28:39',1,'2006-02-15 21:30:53'),(13219,'2005-08-19 15:40:28',2075,288,'2005-08-22 21:20:28',2,'2006-02-15 21:30:53'),(13220,'2005-08-19 15:42:32',1017,448,'2005-08-25 13:37:32',1,'2006-02-15 21:30:53'),(13221,'2005-08-19 15:45:47',120,468,'2005-08-26 21:10:47',1,'2006-02-15 21:30:53'),(13222,'2005-08-19 15:47:58',1656,91,'2005-08-26 12:43:58',1,'2006-02-15 21:30:53'),(13223,'2005-08-19 15:52:04',332,461,'2005-08-22 16:27:04',1,'2006-02-15 21:30:53'),(13224,'2005-08-19 15:52:13',3086,526,'2005-08-28 20:53:13',2,'2006-02-15 21:30:53'),(13225,'2005-08-19 15:54:33',1420,562,'2005-08-25 16:40:33',1,'2006-02-15 21:30:53'),(13226,'2005-08-19 16:05:36',2850,46,'2005-08-21 10:07:36',2,'2006-02-15 21:30:53'),(13227,'2005-08-19 16:05:38',2759,288,'2005-08-20 21:39:38',1,'2006-02-15 21:30:53'),(13228,'2005-08-19 16:08:16',2497,571,'2005-08-20 18:55:16',1,'2006-02-15 21:30:53'),(13229,'2005-08-19 16:08:33',634,283,'2005-08-22 19:54:33',2,'2006-02-15 21:30:53'),(13230,'2005-08-19 16:12:07',3645,151,'2005-08-21 12:19:07',1,'2006-02-15 21:30:53'),(13231,'2005-08-19 16:12:49',2126,280,'2005-08-27 17:14:49',2,'2006-02-15 21:30:53'),(13232,'2005-08-19 16:13:32',2370,206,'2005-08-28 14:42:32',2,'2006-02-15 21:30:53'),(13233,'2005-08-19 16:14:41',1057,279,'2005-08-24 21:13:41',1,'2006-02-15 21:30:53'),(13234,'2005-08-19 16:17:15',976,559,'2005-08-27 12:36:15',1,'2006-02-15 21:30:53'),(13235,'2005-08-19 16:17:53',3902,367,'2005-08-27 14:57:53',1,'2006-02-15 21:30:53'),(13236,'2005-08-19 16:18:24',4574,267,'2005-08-27 17:48:24',2,'2006-02-15 21:30:53'),(13237,'2005-08-19 16:18:36',1272,169,'2005-08-25 15:22:36',2,'2006-02-15 21:30:53'),(13238,'2005-08-19 16:20:56',985,348,'2005-08-23 15:51:56',2,'2006-02-15 21:30:53'),(13239,'2005-08-19 16:22:13',3296,541,'2005-08-23 19:26:13',1,'2006-02-15 21:30:53'),(13240,'2005-08-19 16:22:14',1411,179,'2005-08-20 13:24:14',1,'2006-02-15 21:30:53'),(13241,'2005-08-19 16:25:00',3106,33,'2005-08-26 12:27:00',2,'2006-02-15 21:30:53'),(13242,'2005-08-19 16:28:47',230,414,'2005-08-24 22:13:47',2,'2006-02-15 21:30:53'),(13243,'2005-08-19 16:33:16',355,251,'2005-08-25 13:19:16',2,'2006-02-15 21:30:53'),(13244,'2005-08-19 16:43:04',3246,298,'2005-08-22 15:21:04',2,'2006-02-15 21:30:53'),(13245,'2005-08-19 16:43:41',1001,261,'2005-08-20 21:17:41',1,'2006-02-15 21:30:53'),(13246,'2006-02-14 15:16:03',1849,411,NULL,2,'2006-02-15 21:30:53'),(13247,'2005-08-19 16:45:59',1271,24,'2005-08-25 15:25:59',1,'2006-02-15 21:30:53'),(13248,'2005-08-19 16:47:41',2864,559,'2005-08-28 18:11:41',2,'2006-02-15 21:30:53'),(13249,'2005-08-19 16:47:41',3084,377,'2005-08-20 13:30:41',1,'2006-02-15 21:30:53'),(13250,'2005-08-19 16:47:55',2524,448,'2005-08-26 16:54:55',2,'2006-02-15 21:30:53'),(13251,'2005-08-19 16:48:37',4216,111,'2005-08-20 16:33:37',1,'2006-02-15 21:30:53'),(13252,'2005-08-19 16:50:50',775,451,'2005-08-22 22:09:50',2,'2006-02-15 21:30:53'),(13253,'2005-08-19 16:53:56',472,399,'2005-08-20 11:38:56',2,'2006-02-15 21:30:53'),(13254,'2005-08-19 16:54:01',3412,532,'2005-08-27 19:50:01',2,'2006-02-15 21:30:53'),(13255,'2005-08-19 16:54:12',1101,150,'2005-08-28 17:00:12',1,'2006-02-15 21:30:53'),(13256,'2005-08-19 16:54:12',2719,289,'2005-08-28 16:54:12',1,'2006-02-15 21:30:53'),(13257,'2005-08-19 17:01:20',164,300,'2005-08-24 17:26:20',1,'2006-02-15 21:30:53'),(13258,'2005-08-19 17:05:37',2246,349,'2005-08-24 17:36:37',2,'2006-02-15 21:30:53'),(13259,'2005-08-19 17:08:53',2518,458,'2005-08-23 14:14:53',1,'2006-02-15 21:30:53'),(13260,'2005-08-19 17:09:22',578,251,'2005-08-24 21:31:22',2,'2006-02-15 21:30:53'),(13261,'2006-02-14 15:16:03',3538,417,NULL,1,'2006-02-15 21:30:53'),(13262,'2005-08-19 17:20:15',4483,184,'2005-08-26 18:28:15',2,'2006-02-15 21:30:53'),(13263,'2005-08-19 17:26:55',214,206,'2005-08-28 20:07:55',2,'2006-02-15 21:30:53'),(13264,'2005-08-19 17:27:10',1881,109,'2005-08-27 16:00:10',1,'2006-02-15 21:30:53'),(13265,'2005-08-19 17:29:00',3933,314,'2005-08-20 12:59:00',2,'2006-02-15 21:30:53'),(13266,'2005-08-19 17:31:20',1326,571,'2005-08-21 11:41:20',2,'2006-02-15 21:30:53'),(13267,'2005-08-19 17:31:36',550,335,'2005-08-21 13:47:36',1,'2006-02-15 21:30:53'),(13268,'2005-08-19 17:33:50',1166,255,'2005-08-25 17:15:50',2,'2006-02-15 21:30:53'),(13269,'2005-08-19 17:34:00',2382,461,'2005-08-20 15:17:00',2,'2006-02-15 21:30:53'),(13270,'2005-08-19 17:41:16',405,159,'2005-08-23 20:22:16',2,'2006-02-15 21:30:53'),(13271,'2005-08-19 17:42:06',3872,242,'2005-08-27 18:39:06',2,'2006-02-15 21:30:53'),(13272,'2005-08-19 17:49:13',2531,145,'2005-08-23 15:49:13',2,'2006-02-15 21:30:53'),(13273,'2005-08-19 17:49:13',4181,433,'2005-08-21 14:15:13',1,'2006-02-15 21:30:53'),(13274,'2005-08-19 17:50:03',704,272,'2005-08-20 14:39:03',2,'2006-02-15 21:30:53'),(13275,'2005-08-19 17:53:38',710,377,'2005-08-23 16:29:38',2,'2006-02-15 21:30:53'),(13276,'2005-08-19 17:53:42',625,516,'2005-08-28 20:49:42',2,'2006-02-15 21:30:53'),(13277,'2005-08-19 17:57:35',3820,316,'2005-08-25 15:45:35',2,'2006-02-15 21:30:53'),(13278,'2005-08-19 17:57:53',2691,282,'2005-08-22 23:16:53',1,'2006-02-15 21:30:53'),(13279,'2005-08-19 18:02:18',2472,343,'2005-08-24 22:15:18',2,'2006-02-15 21:30:53'),(13280,'2005-08-19 18:02:51',218,368,'2005-08-21 23:17:51',2,'2006-02-15 21:30:53'),(13281,'2005-08-19 18:07:47',113,220,'2005-08-20 21:51:47',2,'2006-02-15 21:30:53'),(13282,'2005-08-19 18:08:18',4373,59,'2005-08-24 14:08:18',1,'2006-02-15 21:30:53'),(13283,'2005-08-19 18:10:19',2602,180,'2005-08-23 16:09:19',2,'2006-02-15 21:30:53'),(13284,'2005-08-19 18:12:31',2128,338,'2005-08-25 21:26:31',2,'2006-02-15 21:30:53'),(13285,'2005-08-19 18:18:44',2139,182,'2005-08-20 12:33:44',1,'2006-02-15 21:30:53'),(13286,'2005-08-19 18:28:07',2685,245,'2005-08-22 17:23:07',2,'2006-02-15 21:30:53'),(13287,'2005-08-19 18:28:24',2716,569,'2005-08-26 20:13:24',2,'2006-02-15 21:30:53'),(13288,'2005-08-19 18:30:10',3558,162,'2005-08-20 19:20:10',2,'2006-02-15 21:30:53'),(13289,'2005-08-19 18:31:30',3527,497,'2005-08-20 13:43:30',1,'2006-02-15 21:30:53'),(13290,'2005-08-19 18:31:50',4174,23,'2005-08-25 15:49:50',2,'2006-02-15 21:30:53'),(13291,'2005-08-19 18:32:11',1631,243,'2005-08-20 18:22:11',2,'2006-02-15 21:30:53'),(13292,'2005-08-19 18:35:32',1336,171,'2005-08-22 00:27:32',1,'2006-02-15 21:30:53'),(13293,'2005-08-19 18:35:52',380,399,'2005-08-23 17:18:52',2,'2006-02-15 21:30:53'),(13294,'2005-08-19 18:36:35',156,534,'2005-08-20 13:57:35',1,'2006-02-15 21:30:53'),(13295,'2006-02-14 15:16:03',2408,229,NULL,1,'2006-02-15 21:30:53'),(13296,'2005-08-19 18:43:53',1728,300,'2005-08-21 23:30:53',2,'2006-02-15 21:30:53'),(13297,'2005-08-19 18:45:49',3818,359,'2005-08-22 14:58:49',2,'2006-02-15 21:30:53'),(13298,'2006-02-14 15:16:03',2133,361,NULL,2,'2006-02-15 21:30:53'),(13299,'2005-08-19 18:46:33',4385,373,'2005-08-22 20:45:33',1,'2006-02-15 21:30:53'),(13300,'2005-08-19 18:46:56',842,531,'2005-08-28 20:23:56',2,'2006-02-15 21:30:53'),(13301,'2005-08-19 18:53:15',2261,494,'2005-08-26 21:37:15',1,'2006-02-15 21:30:53'),(13302,'2005-08-19 18:54:26',4041,51,'2005-08-21 23:01:26',1,'2006-02-15 21:30:53'),(13303,'2005-08-19 18:55:21',34,184,'2005-08-23 18:49:21',2,'2006-02-15 21:30:53'),(13304,'2005-08-19 18:56:32',2979,405,'2005-08-23 20:04:32',2,'2006-02-15 21:30:53'),(13305,'2005-08-19 18:57:05',2386,337,'2005-08-28 22:28:05',1,'2006-02-15 21:30:53'),(13306,'2005-08-19 18:57:29',2742,229,'2005-08-20 20:09:29',2,'2006-02-15 21:30:53'),(13307,'2005-08-19 18:58:44',2242,547,'2005-08-22 00:15:44',1,'2006-02-15 21:30:53'),(13308,'2005-08-19 18:59:42',3189,414,'2005-08-28 13:21:42',2,'2006-02-15 21:30:53'),(13309,'2005-08-19 19:04:00',2108,91,'2005-08-28 23:08:00',2,'2006-02-15 21:30:53'),(13310,'2005-08-19 19:05:16',2563,311,'2005-08-23 22:47:16',1,'2006-02-15 21:30:53'),(13311,'2005-08-19 19:07:09',3890,520,'2005-08-20 23:07:09',1,'2006-02-15 21:30:53'),(13312,'2005-08-19 19:09:14',2891,418,'2005-08-23 00:50:14',2,'2006-02-15 21:30:53'),(13313,'2005-08-19 19:11:41',3709,580,'2005-08-21 23:53:41',2,'2006-02-15 21:30:53'),(13314,'2005-08-19 19:12:43',2899,347,'2005-08-27 00:20:43',2,'2006-02-15 21:30:53'),(13315,'2005-08-19 19:16:18',3151,54,'2005-08-21 20:58:18',1,'2006-02-15 21:30:53'),(13316,'2005-08-19 19:23:30',4450,10,'2005-08-22 23:37:30',1,'2006-02-15 21:30:53'),(13317,'2005-08-19 19:25:42',3349,20,'2005-08-20 20:57:42',2,'2006-02-15 21:30:53'),(13318,'2005-08-19 19:33:57',1389,413,'2005-08-21 17:52:57',2,'2006-02-15 21:30:53'),(13319,'2005-08-19 19:35:13',2496,438,'2005-08-27 17:59:13',1,'2006-02-15 21:30:53'),(13320,'2005-08-19 19:35:33',4522,172,'2005-08-24 20:09:33',2,'2006-02-15 21:30:53'),(13321,'2005-08-19 19:40:37',4183,280,'2005-08-21 19:09:37',2,'2006-02-15 21:30:53'),(13322,'2005-08-19 19:43:08',2149,559,'2005-08-24 16:30:08',2,'2006-02-15 21:30:53'),(13323,'2005-08-19 19:48:07',1055,133,'2005-08-23 15:28:07',1,'2006-02-15 21:30:53'),(13324,'2005-08-19 19:51:00',4349,564,'2005-08-20 20:26:00',1,'2006-02-15 21:30:53'),(13325,'2005-08-19 19:52:02',2388,334,'2005-08-22 21:14:02',1,'2006-02-15 21:30:53'),(13326,'2005-08-19 19:52:52',429,576,'2005-08-20 18:56:52',1,'2006-02-15 21:30:53'),(13327,'2005-08-19 19:55:45',1808,72,'2005-08-22 15:05:45',2,'2006-02-15 21:30:53'),(13328,'2005-08-19 19:56:01',605,462,'2005-08-20 22:16:01',2,'2006-02-15 21:30:53'),(13329,'2005-08-19 19:56:55',3136,373,'2005-08-25 01:19:55',2,'2006-02-15 21:30:53'),(13330,'2005-08-19 19:59:21',4276,297,'2005-08-20 15:34:21',2,'2006-02-15 21:30:53'),(13331,'2005-08-19 20:00:25',3867,23,'2005-08-21 17:03:25',1,'2006-02-15 21:30:53'),(13332,'2005-08-19 20:00:51',3144,503,'2005-08-25 14:30:51',1,'2006-02-15 21:30:53'),(13333,'2006-02-14 15:16:03',1092,64,NULL,2,'2006-02-15 21:30:53'),(13334,'2005-08-19 20:02:33',461,379,'2005-08-22 00:45:33',1,'2006-02-15 21:30:53'),(13335,'2005-08-19 20:03:18',1861,74,'2005-08-24 20:09:18',2,'2006-02-15 21:30:53'),(13336,'2005-08-19 20:03:22',1011,289,'2005-08-24 23:42:22',1,'2006-02-15 21:30:53'),(13337,'2005-08-19 20:06:57',3584,374,'2005-08-20 16:31:57',1,'2006-02-15 21:30:53'),(13338,'2005-08-19 20:09:59',3739,86,'2005-08-23 22:59:59',2,'2006-02-15 21:30:53'),(13339,'2005-08-19 20:18:36',1428,15,'2005-08-28 21:34:36',1,'2006-02-15 21:30:53'),(13340,'2005-08-19 20:18:39',4358,45,'2005-08-28 21:06:39',2,'2006-02-15 21:30:53'),(13341,'2005-08-19 20:18:53',1749,460,'2005-08-27 14:36:53',1,'2006-02-15 21:30:53'),(13342,'2005-08-19 20:21:36',3476,172,'2005-08-21 16:26:36',1,'2006-02-15 21:30:53'),(13343,'2005-08-19 20:22:08',1032,591,'2005-08-27 17:21:08',1,'2006-02-15 21:30:53'),(13344,'2005-08-19 20:22:44',4392,514,'2005-08-25 18:39:44',1,'2006-02-15 21:30:53'),(13345,'2005-08-19 20:25:24',47,55,'2005-08-27 20:38:24',1,'2006-02-15 21:30:53'),(13346,'2005-08-19 20:28:21',4541,131,'2005-08-28 00:28:21',2,'2006-02-15 21:30:53'),(13347,'2005-08-19 20:28:48',4038,562,'2005-08-28 19:33:48',2,'2006-02-15 21:30:53'),(13348,'2005-08-19 20:31:48',275,456,'2005-08-21 21:01:48',1,'2006-02-15 21:30:53'),(13349,'2005-08-19 20:43:16',4262,234,'2005-08-20 16:21:16',1,'2006-02-15 21:30:53'),(13350,'2005-08-19 20:44:00',3523,214,'2005-08-27 01:23:00',2,'2006-02-15 21:30:53'),(13351,'2006-02-14 15:16:03',4130,42,NULL,2,'2006-02-15 21:30:53'),(13352,'2005-08-19 20:51:40',2689,80,'2005-08-24 01:22:40',1,'2006-02-15 21:30:53'),(13353,'2005-08-19 20:53:43',2790,131,'2005-08-25 01:25:43',1,'2006-02-15 21:30:53'),(13354,'2005-08-19 20:55:23',1356,213,'2005-08-27 20:09:23',2,'2006-02-15 21:30:53'),(13355,'2005-08-19 20:59:19',585,396,'2005-08-23 21:44:19',1,'2006-02-15 21:30:53'),(13356,'2005-08-19 21:02:21',2713,324,'2005-08-24 00:31:21',1,'2006-02-15 21:30:53'),(13357,'2005-08-19 21:02:59',3295,393,'2005-08-25 23:46:59',2,'2006-02-15 21:30:53'),(13358,'2005-08-19 21:04:20',1510,439,'2005-08-24 20:49:20',2,'2006-02-15 21:30:53'),(13359,'2005-08-19 21:04:49',4175,434,'2005-08-27 01:46:49',1,'2006-02-15 21:30:53'),(13360,'2005-08-19 21:05:11',3396,327,'2005-08-24 16:05:11',2,'2006-02-15 21:30:53'),(13361,'2005-08-19 21:07:22',4289,107,'2005-08-21 21:26:22',2,'2006-02-15 21:30:53'),(13362,'2005-08-19 21:07:54',869,565,'2005-08-20 17:29:54',2,'2006-02-15 21:30:53'),(13363,'2005-08-19 21:07:59',588,288,'2005-08-21 17:08:59',1,'2006-02-15 21:30:53'),(13364,'2005-08-19 21:09:30',2773,236,'2005-08-25 18:37:30',1,'2006-02-15 21:30:53'),(13365,'2005-08-19 21:12:37',4136,307,'2005-08-25 19:56:37',2,'2006-02-15 21:30:53'),(13366,'2005-08-19 21:14:45',602,259,'2005-08-21 03:06:45',1,'2006-02-15 21:30:53'),(13367,'2005-08-19 21:19:27',4569,290,'2005-08-24 15:22:27',2,'2006-02-15 21:30:53'),(13368,'2005-08-19 21:19:35',1073,342,'2005-08-21 16:12:35',2,'2006-02-15 21:30:53'),(13369,'2005-08-19 21:19:47',2728,116,'2005-08-24 23:25:47',1,'2006-02-15 21:30:53'),(13370,'2005-08-19 21:20:11',239,101,'2005-08-25 22:51:11',1,'2006-02-15 21:30:53'),(13371,'2005-08-19 21:21:47',3401,34,'2005-08-26 16:17:47',2,'2006-02-15 21:30:53'),(13372,'2005-08-19 21:23:19',3366,150,'2005-08-24 22:12:19',1,'2006-02-15 21:30:53'),(13373,'2005-08-19 21:23:31',4045,7,'2005-08-25 22:38:31',1,'2006-02-15 21:30:53'),(13374,'2006-02-14 15:16:03',2721,227,NULL,1,'2006-02-15 21:30:53'),(13375,'2005-08-19 21:31:31',949,120,'2005-08-29 00:17:31',1,'2006-02-15 21:30:53'),(13376,'2005-08-19 21:31:45',898,40,'2005-08-22 01:14:45',2,'2006-02-15 21:30:53'),(13377,'2005-08-19 21:32:23',1316,572,'2005-08-25 22:24:23',1,'2006-02-15 21:30:53'),(13378,'2005-08-19 21:33:35',2708,368,'2005-08-20 22:47:35',1,'2006-02-15 21:30:53'),(13379,'2005-08-19 21:33:39',1623,227,'2005-08-22 21:00:39',1,'2006-02-15 21:30:53'),(13380,'2005-08-19 21:36:58',4250,451,'2005-08-22 23:55:58',1,'2006-02-15 21:30:53'),(13381,'2005-08-19 21:37:57',2823,21,'2005-08-21 18:07:57',2,'2006-02-15 21:30:53'),(13382,'2005-08-19 21:38:41',3720,436,'2005-08-28 15:49:41',1,'2006-02-15 21:30:53'),(13383,'2005-08-19 21:38:44',3193,434,'2005-08-28 23:22:44',2,'2006-02-15 21:30:53'),(13384,'2005-08-19 21:38:51',1462,440,'2005-08-23 17:55:51',1,'2006-02-15 21:30:53'),(13385,'2005-08-19 21:39:35',4323,252,'2005-08-22 22:38:35',2,'2006-02-15 21:30:53'),(13386,'2005-08-19 21:43:58',4476,324,'2005-08-24 20:29:58',2,'2006-02-15 21:30:53'),(13387,'2005-08-19 21:46:10',123,504,'2005-08-24 01:16:10',1,'2006-02-15 21:30:53'),(13388,'2005-08-19 21:46:49',942,317,'2005-08-27 16:18:49',1,'2006-02-15 21:30:53'),(13389,'2005-08-19 21:52:51',3352,257,'2005-08-25 02:38:51',1,'2006-02-15 21:30:53'),(13390,'2006-02-14 15:16:03',2855,135,NULL,1,'2006-02-15 21:30:53'),(13391,'2005-08-19 22:01:42',4220,16,'2005-08-24 22:20:42',2,'2006-02-15 21:30:53'),(13392,'2005-08-19 22:03:22',692,409,'2005-08-28 19:27:22',1,'2006-02-15 21:30:53'),(13393,'2005-08-19 22:03:46',958,15,'2005-08-28 19:19:46',2,'2006-02-15 21:30:53'),(13394,'2005-08-19 22:05:19',2597,45,'2005-08-21 23:53:19',1,'2006-02-15 21:30:53'),(13395,'2005-08-19 22:05:40',53,80,'2005-08-22 01:31:40',2,'2006-02-15 21:30:53'),(13396,'2005-08-19 22:06:09',4169,517,'2005-08-23 23:26:09',2,'2006-02-15 21:30:53'),(13397,'2005-08-19 22:06:35',3863,379,'2005-08-29 01:11:35',2,'2006-02-15 21:30:53'),(13398,'2005-08-19 22:08:48',3376,405,'2005-08-23 03:24:48',1,'2006-02-15 21:30:53'),(13399,'2005-08-19 22:09:28',2309,21,'2005-08-25 20:25:28',2,'2006-02-15 21:30:53'),(13400,'2005-08-19 22:11:44',2173,179,'2005-08-20 23:27:44',2,'2006-02-15 21:30:53'),(13401,'2005-08-19 22:16:16',488,139,'2005-08-25 19:01:16',2,'2006-02-15 21:30:53'),(13402,'2005-08-19 22:16:53',3264,372,'2005-08-22 22:28:53',1,'2006-02-15 21:30:53'),(13403,'2005-08-19 22:18:07',3241,3,'2005-08-27 19:23:07',1,'2006-02-15 21:30:53'),(13404,'2005-08-19 22:18:42',416,414,'2005-08-23 16:29:42',2,'2006-02-15 21:30:53'),(13405,'2005-08-19 22:20:49',1554,181,'2005-08-28 21:21:49',1,'2006-02-15 21:30:53'),(13406,'2005-08-19 22:22:01',3031,113,'2005-08-22 18:16:01',1,'2006-02-15 21:30:53'),(13407,'2005-08-19 22:26:26',2512,131,'2005-08-22 16:34:26',1,'2006-02-15 21:30:53'),(13408,'2005-08-19 22:34:51',2795,575,'2005-08-21 03:30:51',1,'2006-02-15 21:30:53'),(13409,'2005-08-19 22:36:26',873,214,'2005-08-22 01:52:26',2,'2006-02-15 21:30:53'),(13410,'2005-08-19 22:41:44',1421,104,'2005-08-26 18:05:44',2,'2006-02-15 21:30:53'),(13411,'2005-08-19 22:43:38',4425,21,'2005-08-26 18:29:38',2,'2006-02-15 21:30:53'),(13412,'2005-08-19 22:46:35',2806,404,'2005-08-26 18:06:35',1,'2006-02-15 21:30:53'),(13413,'2005-08-19 22:46:46',1501,390,'2005-08-24 22:52:46',1,'2006-02-15 21:30:53'),(13414,'2005-08-19 22:47:34',4126,438,'2005-08-21 02:50:34',1,'2006-02-15 21:30:53'),(13415,'2005-08-19 22:48:09',1105,181,'2005-08-25 02:09:09',1,'2006-02-15 21:30:53'),(13416,'2005-08-19 22:48:48',1075,204,'2005-08-21 22:09:48',2,'2006-02-15 21:30:53'),(13417,'2005-08-19 22:51:39',92,468,'2005-08-23 03:34:39',1,'2006-02-15 21:30:53'),(13418,'2005-08-19 22:53:56',2113,246,'2005-08-28 02:05:56',2,'2006-02-15 21:30:53'),(13419,'2006-02-14 15:16:03',3507,537,NULL,1,'2006-02-15 21:30:53'),(13420,'2005-08-19 22:57:25',1796,102,'2005-08-28 22:46:25',1,'2006-02-15 21:30:53'),(13421,'2006-02-14 15:16:03',9,366,NULL,1,'2006-02-15 21:30:53'),(13422,'2005-08-19 23:07:24',3835,404,'2005-08-28 04:12:24',2,'2006-02-15 21:30:53'),(13423,'2005-08-19 23:07:42',546,311,'2005-08-26 20:45:42',1,'2006-02-15 21:30:53'),(13424,'2005-08-19 23:10:09',4340,216,'2005-08-23 02:25:09',1,'2006-02-15 21:30:53'),(13425,'2005-08-19 23:11:44',2274,340,'2005-08-25 21:19:44',2,'2006-02-15 21:30:53'),(13426,'2005-08-19 23:15:00',3409,213,'2005-08-21 01:53:00',2,'2006-02-15 21:30:53'),(13427,'2005-08-19 23:19:02',3120,239,'2005-08-21 18:30:02',1,'2006-02-15 21:30:53'),(13428,'2006-02-14 15:16:03',106,44,NULL,2,'2006-02-15 21:30:53'),(13429,'2005-08-19 23:25:37',3677,23,'2005-08-28 01:04:37',2,'2006-02-15 21:30:53'),(13430,'2005-08-19 23:25:43',2852,381,'2005-08-22 18:41:43',1,'2006-02-15 21:30:53'),(13431,'2005-08-19 23:28:15',1700,229,'2005-08-25 04:44:15',1,'2006-02-15 21:30:53'),(13432,'2005-08-19 23:29:06',2216,78,'2005-08-23 00:57:06',1,'2006-02-15 21:30:53'),(13433,'2005-08-19 23:30:53',1647,171,'2005-08-22 05:18:53',2,'2006-02-15 21:30:53'),(13434,'2005-08-19 23:34:26',2073,221,'2005-08-23 18:33:26',1,'2006-02-15 21:30:53'),(13435,'2005-08-19 23:35:44',3919,30,'2005-08-24 18:14:44',2,'2006-02-15 21:30:53'),(13436,'2005-08-19 23:36:25',2499,29,'2005-08-23 18:38:25',1,'2006-02-15 21:30:53'),(13437,'2005-08-19 23:37:52',2292,67,'2005-08-28 22:17:52',1,'2006-02-15 21:30:53'),(13438,'2005-08-19 23:38:02',1750,520,'2005-08-26 21:36:02',1,'2006-02-15 21:30:53'),(13439,'2005-08-19 23:42:16',3535,551,'2005-08-26 21:24:16',2,'2006-02-15 21:30:53'),(13440,'2005-08-19 23:42:52',2842,260,'2005-08-25 19:19:52',1,'2006-02-15 21:30:53'),(13441,'2005-08-19 23:48:23',3188,125,'2005-08-28 23:47:23',1,'2006-02-15 21:30:53'),(13442,'2005-08-19 23:50:45',2432,356,'2005-08-27 22:01:45',2,'2006-02-15 21:30:53'),(13443,'2005-08-19 23:53:42',3161,236,'2005-08-28 05:37:42',1,'2006-02-15 21:30:53'),(13444,'2005-08-20 00:00:24',2564,37,'2005-08-21 05:59:24',2,'2006-02-15 21:30:53'),(13445,'2005-08-20 00:05:33',1630,495,'2005-08-21 21:20:33',1,'2006-02-15 21:30:53'),(13446,'2005-08-20 00:06:13',3226,488,'2005-08-22 19:56:13',1,'2006-02-15 21:30:53'),(13447,'2005-08-20 00:09:36',285,542,'2005-08-25 01:22:36',1,'2006-02-15 21:30:53'),(13448,'2005-08-20 00:12:43',2870,327,'2005-08-25 02:33:43',1,'2006-02-15 21:30:53'),(13449,'2005-08-20 00:17:01',1297,400,'2005-08-23 20:42:01',2,'2006-02-15 21:30:53'),(13450,'2005-08-20 00:18:15',135,61,'2005-08-24 19:36:15',1,'2006-02-15 21:30:53'),(13451,'2005-08-20 00:18:25',3837,6,'2005-08-29 01:08:25',1,'2006-02-15 21:30:53'),(13452,'2005-08-20 00:20:07',2449,430,'2005-08-25 05:43:07',1,'2006-02-15 21:30:53'),(13453,'2005-08-20 00:30:51',2203,164,'2005-08-28 18:43:51',2,'2006-02-15 21:30:53'),(13454,'2005-08-20 00:30:52',1553,430,'2005-08-27 19:45:52',2,'2006-02-15 21:30:53'),(13455,'2005-08-20 00:32:17',1315,133,'2005-08-26 19:33:17',1,'2006-02-15 21:30:53'),(13456,'2005-08-20 00:33:19',1644,13,'2005-08-22 01:47:19',1,'2006-02-15 21:30:53'),(13457,'2005-08-20 00:33:22',1220,256,'2005-08-26 21:37:22',2,'2006-02-15 21:30:53'),(13458,'2005-08-20 00:35:30',4223,228,'2005-08-21 20:51:30',1,'2006-02-15 21:30:53'),(13459,'2005-08-20 00:45:40',3666,114,'2005-08-29 02:53:40',2,'2006-02-15 21:30:53'),(13460,'2005-08-20 00:48:24',244,410,'2005-08-28 04:13:24',2,'2006-02-15 21:30:53'),(13461,'2005-08-20 00:49:04',2621,421,'2005-08-28 02:49:04',2,'2006-02-15 21:30:53'),(13462,'2005-08-20 00:49:19',3865,489,'2005-08-26 06:21:19',2,'2006-02-15 21:30:53'),(13463,'2005-08-20 00:50:54',510,21,'2005-08-28 23:00:54',1,'2006-02-15 21:30:53'),(13464,'2006-02-14 15:16:03',4292,576,NULL,1,'2006-02-15 21:30:53'),(13465,'2005-08-20 00:54:14',1305,575,'2005-08-21 20:55:14',2,'2006-02-15 21:30:53'),(13466,'2005-08-20 00:55:16',3088,262,'2005-08-22 22:48:16',1,'2006-02-15 21:30:53'),(13467,'2005-08-20 00:56:44',696,373,'2005-08-20 20:16:44',1,'2006-02-15 21:30:53'),(13468,'2005-08-20 00:56:44',1851,266,'2005-08-29 06:26:44',1,'2006-02-15 21:30:53'),(13469,'2005-08-20 00:59:36',1410,235,'2005-08-24 22:41:36',1,'2006-02-15 21:30:53'),(13470,'2005-08-20 01:01:16',3097,141,'2005-08-21 03:19:16',1,'2006-02-15 21:30:53'),(13471,'2005-08-20 01:02:26',1391,296,'2005-08-25 06:37:26',2,'2006-02-15 21:30:53'),(13472,'2005-08-20 01:03:31',3074,137,'2005-08-28 02:54:31',1,'2006-02-15 21:30:53'),(13473,'2005-08-20 01:03:50',381,390,'2005-08-22 02:33:50',2,'2006-02-15 21:30:53'),(13474,'2005-08-20 01:04:32',1209,116,'2005-08-21 20:26:32',2,'2006-02-15 21:30:53'),(13475,'2005-08-20 01:05:05',3214,68,'2005-08-20 20:22:05',2,'2006-02-15 21:30:53'),(13476,'2005-08-20 01:06:04',2866,7,'2005-08-24 23:56:04',1,'2006-02-15 21:30:53'),(13477,'2005-08-20 01:07:00',1442,222,'2005-08-26 02:47:00',1,'2006-02-15 21:30:53'),(13478,'2005-08-20 01:07:14',2190,466,'2005-08-22 03:41:14',1,'2006-02-15 21:30:53'),(13479,'2005-08-20 01:09:11',1262,87,'2005-08-26 05:35:11',2,'2006-02-15 21:30:53'),(13480,'2005-08-20 01:10:27',206,16,'2005-08-27 22:18:27',2,'2006-02-15 21:30:53'),(13481,'2005-08-20 01:11:12',2678,157,'2005-08-26 23:07:12',2,'2006-02-15 21:30:53'),(13482,'2005-08-20 01:14:30',1627,183,'2005-08-24 04:57:30',1,'2006-02-15 21:30:53'),(13483,'2005-08-20 01:16:38',2550,441,'2005-08-21 20:43:38',2,'2006-02-15 21:30:53'),(13484,'2005-08-20 01:16:52',1533,152,'2005-08-22 23:47:52',2,'2006-02-15 21:30:53'),(13485,'2005-08-20 01:20:14',3802,379,'2005-08-22 01:28:14',2,'2006-02-15 21:30:53'),(13486,'2006-02-14 15:16:03',4460,274,NULL,1,'2006-02-15 21:30:53'),(13487,'2005-08-20 01:27:05',2609,458,'2005-08-24 00:41:05',2,'2006-02-15 21:30:53'),(13488,'2005-08-20 01:28:42',867,444,'2005-08-25 06:17:42',2,'2006-02-15 21:30:53'),(13489,'2005-08-20 01:29:06',2934,443,'2005-08-27 21:11:06',1,'2006-02-15 21:30:53'),(13490,'2005-08-20 01:29:29',238,18,'2005-08-21 22:36:29',2,'2006-02-15 21:30:53'),(13491,'2005-08-20 01:30:56',2503,258,'2005-08-28 23:26:56',2,'2006-02-15 21:30:53'),(13492,'2005-08-20 01:32:04',1155,462,'2005-08-29 02:14:04',2,'2006-02-15 21:30:53'),(13493,'2005-08-20 01:33:36',2927,37,'2005-08-24 06:32:36',1,'2006-02-15 21:30:53'),(13494,'2005-08-20 01:36:34',1632,414,'2005-08-21 06:52:34',1,'2006-02-15 21:30:53'),(13495,'2005-08-20 01:40:25',3881,92,'2005-08-23 06:32:25',2,'2006-02-15 21:30:53'),(13496,'2005-08-20 01:42:29',3040,454,'2005-08-29 06:47:29',2,'2006-02-15 21:30:53'),(13497,'2005-08-20 01:46:38',1296,481,'2005-08-26 05:37:38',2,'2006-02-15 21:30:53'),(13498,'2005-08-20 01:51:23',1603,578,'2005-08-24 05:32:23',1,'2006-02-15 21:30:53'),(13499,'2005-08-20 01:52:30',1893,300,'2005-08-28 04:57:30',1,'2006-02-15 21:30:53'),(13500,'2005-08-20 01:54:39',1353,577,'2005-08-25 21:23:39',1,'2006-02-15 21:30:53'),(13501,'2005-08-20 01:56:20',4369,390,'2005-08-22 23:07:20',2,'2006-02-15 21:30:53'),(13502,'2005-08-20 01:58:15',1324,309,'2005-08-21 20:21:15',1,'2006-02-15 21:30:53'),(13503,'2005-08-20 02:00:33',453,15,'2005-08-28 21:03:33',1,'2006-02-15 21:30:53'),(13504,'2005-08-20 02:01:48',4322,293,'2005-08-25 21:52:48',2,'2006-02-15 21:30:53'),(13505,'2005-08-20 02:05:57',914,536,'2005-08-23 05:52:57',1,'2006-02-15 21:30:53'),(13506,'2005-08-20 02:07:06',1334,261,'2005-08-26 08:06:06',1,'2006-02-15 21:30:53'),(13507,'2005-08-20 02:10:27',3324,478,'2005-08-23 04:03:27',2,'2006-02-15 21:30:53'),(13508,'2005-08-20 02:12:54',4120,408,'2005-08-28 21:47:54',2,'2006-02-15 21:30:53'),(13509,'2005-08-20 02:14:16',3698,128,'2005-08-22 06:36:16',2,'2006-02-15 21:30:53'),(13510,'2005-08-20 02:18:30',691,107,'2005-08-27 01:33:30',1,'2006-02-15 21:30:53'),(13511,'2005-08-20 02:21:40',2973,23,'2005-08-21 03:26:40',1,'2006-02-15 21:30:53'),(13512,'2005-08-20 02:27:13',4508,62,'2005-08-28 04:40:13',2,'2006-02-15 21:30:53'),(13513,'2005-08-20 02:27:53',1653,454,'2005-08-22 06:10:53',1,'2006-02-15 21:30:53'),(13514,'2005-08-20 02:28:09',3407,96,'2005-08-25 00:41:09',1,'2006-02-15 21:30:53'),(13515,'2005-08-20 02:29:47',3438,194,'2005-08-23 08:12:47',2,'2006-02-15 21:30:53'),(13516,'2005-08-20 02:32:45',4286,95,'2005-08-27 04:38:45',1,'2006-02-15 21:30:53'),(13517,'2005-08-20 02:33:17',533,186,'2005-08-23 22:40:17',2,'2006-02-15 21:30:53'),(13518,'2005-08-20 02:36:17',352,528,'2005-08-24 08:06:17',1,'2006-02-15 21:30:53'),(13519,'2005-08-20 02:37:07',182,12,'2005-08-23 01:26:07',2,'2006-02-15 21:30:53'),(13520,'2005-08-20 02:41:46',3326,74,'2005-08-22 01:53:46',1,'2006-02-15 21:30:53'),(13521,'2005-08-20 02:42:28',2586,384,'2005-08-22 06:12:28',1,'2006-02-15 21:30:53'),(13522,'2005-08-20 02:44:06',2940,343,'2005-08-28 05:30:06',1,'2006-02-15 21:30:53'),(13523,'2005-08-20 02:47:03',163,572,'2005-08-28 07:43:03',1,'2006-02-15 21:30:53'),(13524,'2005-08-20 02:48:43',4557,593,'2005-08-27 03:14:43',2,'2006-02-15 21:30:53'),(13525,'2005-08-20 02:50:44',3514,111,'2005-08-26 22:58:44',2,'2006-02-15 21:30:53'),(13526,'2005-08-20 02:58:42',1966,277,'2005-08-27 22:36:42',2,'2006-02-15 21:30:53'),(13527,'2005-08-20 03:00:47',4424,521,'2005-08-25 01:03:47',1,'2006-02-15 21:30:53'),(13528,'2005-08-20 03:03:31',1847,202,'2005-08-26 03:09:31',1,'2006-02-15 21:30:53'),(13529,'2005-08-20 03:07:47',1979,193,'2005-08-21 21:50:47',1,'2006-02-15 21:30:53'),(13530,'2005-08-20 03:12:43',597,156,'2005-08-23 09:01:43',2,'2006-02-15 21:30:53'),(13531,'2005-08-20 03:26:10',2778,156,'2005-08-25 03:41:10',1,'2006-02-15 21:30:53'),(13532,'2005-08-20 03:29:28',1433,168,'2005-08-23 22:53:28',2,'2006-02-15 21:30:53'),(13533,'2005-08-20 03:30:00',1801,436,'2005-08-27 05:53:00',1,'2006-02-15 21:30:53'),(13534,'2006-02-14 15:16:03',2476,75,NULL,1,'2006-02-15 21:30:53'),(13535,'2005-08-20 03:30:25',1563,86,'2005-08-28 04:35:25',1,'2006-02-15 21:30:53'),(13536,'2005-08-20 03:35:16',667,183,'2005-08-25 04:06:16',2,'2006-02-15 21:30:53'),(13537,'2005-08-20 03:39:15',2521,418,'2005-08-23 22:03:15',2,'2006-02-15 21:30:53'),(13538,'2006-02-14 15:16:03',581,279,NULL,1,'2006-02-15 21:30:53'),(13539,'2005-08-20 03:40:27',3110,518,'2005-08-27 07:15:27',1,'2006-02-15 21:30:53'),(13540,'2005-08-20 03:41:23',3785,557,'2005-08-27 09:09:23',2,'2006-02-15 21:30:53'),(13541,'2005-08-20 03:41:41',1363,15,'2005-08-24 23:14:41',1,'2006-02-15 21:30:53'),(13542,'2005-08-20 03:41:57',4543,147,'2005-08-29 03:21:57',2,'2006-02-15 21:30:53'),(13543,'2005-08-20 03:43:13',2142,163,'2005-08-29 07:14:13',2,'2006-02-15 21:30:53'),(13544,'2005-08-20 03:44:26',58,538,'2005-08-27 22:11:26',1,'2006-02-15 21:30:53'),(13545,'2005-08-20 03:50:15',615,417,'2005-08-27 22:24:15',1,'2006-02-15 21:30:53'),(13546,'2005-08-20 03:50:24',2492,390,'2005-08-28 03:04:24',2,'2006-02-15 21:30:53'),(13547,'2005-08-20 03:53:16',3122,456,'2005-08-25 04:02:16',1,'2006-02-15 21:30:53'),(13548,'2005-08-20 03:53:20',4389,319,'2005-08-27 21:54:20',1,'2006-02-15 21:30:53'),(13549,'2005-08-20 03:58:41',508,274,'2005-08-28 22:49:41',1,'2006-02-15 21:30:53'),(13550,'2005-08-20 03:58:51',208,206,'2005-08-28 00:45:51',2,'2006-02-15 21:30:53'),(13551,'2005-08-20 04:00:30',1049,503,'2005-08-21 06:26:30',2,'2006-02-15 21:30:53'),(13552,'2005-08-20 04:03:51',758,578,'2005-08-23 02:48:51',2,'2006-02-15 21:30:53'),(13553,'2005-08-20 04:07:21',4407,314,'2005-08-28 09:55:21',1,'2006-02-15 21:30:53'),(13554,'2005-08-20 04:08:39',2648,569,'2005-08-28 07:11:39',2,'2006-02-15 21:30:53'),(13555,'2005-08-20 04:09:50',3176,93,'2005-08-29 05:20:50',1,'2006-02-15 21:30:53'),(13556,'2005-08-20 04:10:26',3914,266,'2005-08-26 06:45:26',2,'2006-02-15 21:30:53'),(13557,'2005-08-20 04:12:41',2290,23,'2005-08-21 02:33:41',2,'2006-02-15 21:30:53'),(13558,'2005-08-20 04:13:17',1551,564,'2005-08-24 06:38:17',1,'2006-02-15 21:30:53'),(13559,'2005-08-20 04:16:07',2413,444,'2005-08-24 23:23:07',1,'2006-02-15 21:30:53'),(13560,'2005-08-20 04:17:16',820,56,'2005-08-28 08:38:16',1,'2006-02-15 21:30:53'),(13561,'2006-02-14 15:16:03',3202,530,NULL,1,'2006-02-15 21:30:53'),(13562,'2005-08-20 04:31:45',4547,36,'2005-08-25 09:59:45',1,'2006-02-15 21:30:53'),(13563,'2005-08-20 04:33:31',599,366,'2005-08-24 07:08:31',2,'2006-02-15 21:30:53'),(13564,'2005-08-20 04:34:46',678,36,'2005-08-28 23:18:46',2,'2006-02-15 21:30:53'),(13565,'2005-08-20 04:38:52',3378,214,'2005-08-27 07:17:52',1,'2006-02-15 21:30:53'),(13566,'2005-08-20 04:45:32',4397,558,'2005-08-28 02:12:32',2,'2006-02-15 21:30:53'),(13567,'2005-08-20 04:49:21',543,242,'2005-08-26 10:27:21',1,'2006-02-15 21:30:53'),(13568,'2005-08-20 05:02:46',1243,151,'2005-08-27 03:12:46',2,'2006-02-15 21:30:53'),(13569,'2005-08-20 05:02:59',1934,496,'2005-08-28 00:51:59',1,'2006-02-15 21:30:53'),(13570,'2005-08-20 05:04:57',2808,188,'2005-08-24 06:19:57',2,'2006-02-15 21:30:53'),(13571,'2005-08-20 05:05:14',1251,458,'2005-08-25 03:59:14',2,'2006-02-15 21:30:53'),(13572,'2005-08-20 05:07:27',660,11,'2005-08-23 23:33:27',1,'2006-02-15 21:30:53'),(13573,'2005-08-20 05:10:14',3032,59,'2005-08-22 00:59:14',1,'2006-02-15 21:30:53'),(13574,'2005-08-20 05:10:39',2383,552,'2005-08-21 02:21:39',2,'2006-02-15 21:30:53'),(13575,'2005-08-20 05:15:20',2729,339,'2005-08-28 07:36:20',2,'2006-02-15 21:30:53'),(13576,'2005-08-20 05:19:56',2669,223,'2005-08-22 09:08:56',2,'2006-02-15 21:30:53'),(13577,'2006-02-14 15:16:03',3844,448,NULL,2,'2006-02-15 21:30:53'),(13578,'2006-02-14 15:16:03',4301,352,NULL,2,'2006-02-15 21:30:53'),(13579,'2005-08-20 05:22:06',4237,333,'2005-08-28 02:33:06',2,'2006-02-15 21:30:53'),(13580,'2005-08-20 05:23:34',4419,526,'2005-08-23 02:45:34',1,'2006-02-15 21:30:53'),(13581,'2005-08-20 05:26:15',1753,119,'2005-08-21 11:07:15',2,'2006-02-15 21:30:53'),(13582,'2005-08-20 05:28:11',211,166,'2005-08-23 02:06:11',2,'2006-02-15 21:30:53'),(13583,'2005-08-20 05:29:45',176,74,'2005-08-26 06:49:45',1,'2006-02-15 21:30:53'),(13584,'2006-02-14 15:16:03',3966,548,NULL,2,'2006-02-15 21:30:53'),(13585,'2005-08-20 05:32:23',3314,470,'2005-08-27 23:36:23',1,'2006-02-15 21:30:53'),(13586,'2005-08-20 05:40:33',4544,445,'2005-08-25 01:32:33',2,'2006-02-15 21:30:53'),(13587,'2006-02-14 15:16:03',2455,431,NULL,2,'2006-02-15 21:30:53'),(13588,'2005-08-20 05:47:11',702,279,'2005-08-28 02:45:11',2,'2006-02-15 21:30:53'),(13589,'2005-08-20 05:47:25',3216,574,'2005-08-23 01:29:25',2,'2006-02-15 21:30:53'),(13590,'2005-08-20 05:48:59',4417,264,'2005-08-25 00:44:59',2,'2006-02-15 21:30:53'),(13591,'2005-08-20 05:50:05',3089,390,'2005-08-27 08:43:05',2,'2006-02-15 21:30:53'),(13592,'2005-08-20 05:50:35',1509,470,'2005-08-23 04:52:35',1,'2006-02-15 21:30:53'),(13593,'2005-08-20 05:50:52',261,585,'2005-08-27 05:28:52',2,'2006-02-15 21:30:53'),(13594,'2005-08-20 05:53:31',3424,7,'2005-08-23 09:01:31',1,'2006-02-15 21:30:53'),(13595,'2005-08-20 05:54:27',673,545,'2005-08-29 01:25:27',1,'2006-02-15 21:30:53'),(13596,'2005-08-20 05:58:58',482,513,'2005-08-27 08:35:58',1,'2006-02-15 21:30:53'),(13597,'2005-08-20 05:59:05',3697,72,'2005-08-24 05:38:05',2,'2006-02-15 21:30:53'),(13598,'2005-08-20 05:59:17',2803,259,'2005-08-29 01:02:17',1,'2006-02-15 21:30:53'),(13599,'2005-08-20 06:00:03',3333,150,'2005-08-29 07:56:03',1,'2006-02-15 21:30:53'),(13600,'2005-08-20 06:00:25',431,528,'2005-08-28 02:39:25',1,'2006-02-15 21:30:53'),(13601,'2005-08-20 06:01:15',2166,189,'2005-08-29 06:14:15',2,'2006-02-15 21:30:53'),(13602,'2005-08-20 06:02:02',2805,348,'2005-08-27 04:51:02',1,'2006-02-15 21:30:53'),(13603,'2005-08-20 06:02:48',937,362,'2005-08-29 09:39:48',1,'2006-02-15 21:30:53'),(13604,'2005-08-20 06:03:33',4352,353,'2005-08-21 07:06:33',1,'2006-02-15 21:30:53'),(13605,'2005-08-20 06:06:17',4446,522,'2005-08-26 00:53:17',2,'2006-02-15 21:30:53'),(13606,'2005-08-20 06:07:01',83,146,'2005-08-27 04:59:01',2,'2006-02-15 21:30:53'),(13607,'2005-08-20 06:08:42',2692,491,'2005-08-21 01:59:42',2,'2006-02-15 21:30:53'),(13608,'2005-08-20 06:10:44',4110,193,'2005-08-24 07:08:44',1,'2006-02-15 21:30:53'),(13609,'2005-08-20 06:11:51',299,328,'2005-08-23 04:13:51',2,'2006-02-15 21:30:53'),(13610,'2005-08-20 06:14:12',2526,3,'2005-08-26 00:44:12',2,'2006-02-15 21:30:53'),(13611,'2005-08-20 06:20:42',1460,112,'2005-08-28 10:07:42',1,'2006-02-15 21:30:53'),(13612,'2005-08-20 06:22:08',675,505,'2005-08-28 02:22:08',1,'2006-02-15 21:30:53'),(13613,'2005-08-20 06:23:53',2415,201,'2005-08-29 11:40:53',2,'2006-02-15 21:30:53'),(13614,'2005-08-20 06:28:37',3736,381,'2005-08-22 07:54:37',2,'2006-02-15 21:30:53'),(13615,'2005-08-20 06:28:53',1864,539,'2005-08-27 11:40:53',2,'2006-02-15 21:30:53'),(13616,'2005-08-20 06:30:33',1694,194,'2005-08-27 09:29:33',2,'2006-02-15 21:30:53'),(13617,'2005-08-20 06:35:30',4059,526,'2005-08-29 09:03:30',1,'2006-02-15 21:30:53'),(13618,'2005-08-20 06:36:46',390,390,'2005-08-29 05:17:46',2,'2006-02-15 21:30:53'),(13619,'2005-08-20 06:39:26',1068,365,'2005-08-23 05:22:26',2,'2006-02-15 21:30:53'),(13620,'2005-08-20 06:41:27',2361,92,'2005-08-24 11:02:27',1,'2006-02-15 21:30:53'),(13621,'2005-08-20 06:43:44',3754,581,'2005-08-23 06:25:44',2,'2006-02-15 21:30:53'),(13622,'2005-08-20 06:45:32',3355,335,'2005-08-25 02:40:32',1,'2006-02-15 21:30:53'),(13623,'2005-08-20 06:49:46',3948,321,'2005-08-25 05:19:46',2,'2006-02-15 21:30:53'),(13624,'2005-08-20 06:51:02',430,63,'2005-08-29 02:39:02',1,'2006-02-15 21:30:53'),(13625,'2005-08-20 06:52:03',60,422,'2005-08-27 07:43:03',1,'2006-02-15 21:30:53'),(13626,'2005-08-20 06:55:24',594,524,'2005-08-29 12:32:24',1,'2006-02-15 21:30:53'),(13627,'2005-08-20 06:59:00',603,329,'2005-08-29 11:43:00',2,'2006-02-15 21:30:53'),(13628,'2005-08-20 07:03:53',1006,500,'2005-08-22 11:27:53',2,'2006-02-15 21:30:53'),(13629,'2005-08-20 07:04:07',1834,392,'2005-08-25 12:36:07',1,'2006-02-15 21:30:53'),(13630,'2005-08-20 07:05:56',3346,244,'2005-08-29 04:15:56',1,'2006-02-15 21:30:53'),(13631,'2005-08-20 07:07:37',1015,535,'2005-08-22 04:01:37',1,'2006-02-15 21:30:53'),(13632,'2005-08-20 07:10:52',4008,409,'2005-08-29 10:19:52',2,'2006-02-15 21:30:53'),(13633,'2005-08-20 07:13:47',3227,301,'2005-08-24 11:25:47',1,'2006-02-15 21:30:53'),(13634,'2005-08-20 07:16:45',850,411,'2005-08-22 03:38:45',1,'2006-02-15 21:30:53'),(13635,'2005-08-20 07:17:35',669,286,'2005-08-29 06:27:35',1,'2006-02-15 21:30:53'),(13636,'2005-08-20 07:20:09',1467,349,'2005-08-23 09:58:09',1,'2006-02-15 21:30:53'),(13637,'2005-08-20 07:21:15',2298,342,'2005-08-24 10:13:15',2,'2006-02-15 21:30:53'),(13638,'2005-08-20 07:21:15',3255,493,'2005-08-23 11:09:15',2,'2006-02-15 21:30:53'),(13639,'2005-08-20 07:22:07',2489,562,'2005-08-23 11:24:07',2,'2006-02-15 21:30:53'),(13640,'2005-08-20 07:22:53',3427,541,'2005-08-21 11:54:53',2,'2006-02-15 21:30:53'),(13641,'2005-08-20 07:34:42',367,281,'2005-08-26 05:18:42',1,'2006-02-15 21:30:53'),(13642,'2005-08-20 07:42:17',4415,452,'2005-08-29 10:49:17',1,'2006-02-15 21:30:53'),(13643,'2005-08-20 07:42:24',2443,398,'2005-08-26 09:13:24',2,'2006-02-15 21:30:53'),(13644,'2005-08-20 07:46:30',970,464,'2005-08-27 01:54:30',1,'2006-02-15 21:30:53'),(13645,'2005-08-20 07:47:05',157,387,'2005-08-23 02:58:05',1,'2006-02-15 21:30:53'),(13646,'2005-08-20 07:47:08',1347,242,'2005-08-29 08:33:08',1,'2006-02-15 21:30:53'),(13647,'2005-08-20 07:48:07',3269,519,'2005-08-28 07:56:07',2,'2006-02-15 21:30:53'),(13648,'2005-08-20 07:48:10',3921,596,'2005-08-22 12:15:10',2,'2006-02-15 21:30:53'),(13649,'2005-08-20 07:48:38',1495,259,'2005-08-23 07:43:38',2,'2006-02-15 21:30:53'),(13650,'2005-08-20 07:49:06',2644,322,'2005-08-28 10:11:06',1,'2006-02-15 21:30:53'),(13651,'2005-08-20 07:50:08',1082,256,'2005-08-21 07:11:08',1,'2006-02-15 21:30:53'),(13652,'2005-08-20 07:52:34',2548,67,'2005-08-23 08:58:34',2,'2006-02-15 21:30:53'),(13653,'2005-08-20 07:54:54',4029,129,'2005-08-29 06:43:54',1,'2006-02-15 21:30:53'),(13654,'2005-08-20 07:58:21',1582,469,'2005-08-21 09:40:21',2,'2006-02-15 21:30:53'),(13655,'2005-08-20 07:59:13',4294,207,'2005-08-22 12:04:13',1,'2006-02-15 21:30:53'),(13656,'2005-08-20 08:01:07',3180,411,'2005-08-28 13:16:07',2,'2006-02-15 21:30:53'),(13657,'2005-08-20 08:01:39',1752,414,'2005-08-23 07:31:39',1,'2006-02-15 21:30:53'),(13658,'2005-08-20 08:02:22',3827,487,'2005-08-28 06:00:22',1,'2006-02-15 21:30:53'),(13659,'2005-08-20 08:05:52',3610,520,'2005-08-24 12:38:52',1,'2006-02-15 21:30:53'),(13660,'2005-08-20 08:05:56',3972,72,'2005-08-22 13:22:56',1,'2006-02-15 21:30:53'),(13661,'2005-08-20 08:05:59',3996,471,'2005-08-29 12:15:59',1,'2006-02-15 21:30:53'),(13662,'2005-08-20 08:11:58',3880,592,'2005-08-26 13:34:58',1,'2006-02-15 21:30:53'),(13663,'2005-08-20 08:12:33',3969,240,'2005-08-27 03:23:33',2,'2006-02-15 21:30:53'),(13664,'2005-08-20 08:18:36',3750,264,'2005-08-26 11:04:36',1,'2006-02-15 21:30:53'),(13665,'2005-08-20 08:19:20',117,291,'2005-08-28 06:26:20',1,'2006-02-15 21:30:53'),(13666,'2005-08-20 08:20:19',2007,451,'2005-08-22 03:22:19',1,'2006-02-15 21:30:53'),(13667,'2005-08-20 08:25:34',3856,280,'2005-08-24 07:04:34',2,'2006-02-15 21:30:53'),(13668,'2005-08-20 08:26:06',3659,123,'2005-08-25 05:52:06',2,'2006-02-15 21:30:53'),(13669,'2005-08-20 08:26:32',4504,261,'2005-08-27 08:10:32',2,'2006-02-15 21:30:53'),(13670,'2005-08-20 08:27:01',1951,147,'2005-08-29 05:59:01',2,'2006-02-15 21:30:53'),(13671,'2005-08-20 08:27:03',1473,201,'2005-08-26 03:56:03',1,'2006-02-15 21:30:53'),(13672,'2005-08-20 08:27:27',2068,201,'2005-08-22 06:15:27',2,'2006-02-15 21:30:53'),(13673,'2005-08-20 08:27:30',343,332,'2005-08-26 05:14:30',1,'2006-02-15 21:30:53'),(13674,'2005-08-20 08:30:54',3397,36,'2005-08-22 02:59:54',1,'2006-02-15 21:30:53'),(13675,'2005-08-20 08:32:51',350,493,'2005-08-27 03:52:51',2,'2006-02-15 21:30:53'),(13676,'2005-08-20 08:33:21',3170,103,'2005-08-25 02:51:21',1,'2006-02-15 21:30:53'),(13677,'2005-08-20 08:34:41',4013,15,'2005-08-26 11:51:41',2,'2006-02-15 21:30:53'),(13678,'2005-08-20 08:38:24',1118,337,'2005-08-27 13:54:24',2,'2006-02-15 21:30:53'),(13679,'2005-08-20 08:39:34',2878,229,'2005-08-29 10:06:34',2,'2006-02-15 21:30:53'),(13680,'2005-08-20 08:44:06',2822,70,'2005-08-27 09:58:06',2,'2006-02-15 21:30:53'),(13681,'2005-08-20 08:47:37',3039,328,'2005-08-27 09:47:37',1,'2006-02-15 21:30:53'),(13682,'2005-08-20 08:50:39',287,30,'2005-08-21 09:05:39',2,'2006-02-15 21:30:53'),(13683,'2005-08-20 08:54:55',1729,255,'2005-08-24 14:10:55',2,'2006-02-15 21:30:53'),(13684,'2005-08-20 08:55:53',2213,348,'2005-08-25 08:11:53',1,'2006-02-15 21:30:53'),(13685,'2005-08-20 08:57:11',3336,260,'2005-08-27 07:26:11',1,'2006-02-15 21:30:53'),(13686,'2005-08-20 08:57:28',666,306,'2005-08-24 07:21:28',2,'2006-02-15 21:30:53'),(13687,'2005-08-20 08:57:51',3629,290,'2005-08-22 07:02:51',2,'2006-02-15 21:30:53'),(13688,'2005-08-20 08:59:38',1116,572,'2005-08-28 04:54:38',2,'2006-02-15 21:30:53'),(13689,'2005-08-20 09:04:30',819,336,'2005-08-22 05:38:30',2,'2006-02-15 21:30:53'),(13690,'2005-08-20 09:07:27',3721,513,'2005-08-23 08:03:27',2,'2006-02-15 21:30:53'),(13691,'2005-08-20 09:07:39',676,548,'2005-08-28 15:03:39',1,'2006-02-15 21:30:53'),(13692,'2005-08-20 09:07:52',1928,65,'2005-08-21 05:17:52',1,'2006-02-15 21:30:53'),(13693,'2005-08-20 09:11:42',933,552,'2005-08-24 15:00:42',2,'2006-02-15 21:30:53'),(13694,'2005-08-20 09:13:23',3654,454,'2005-08-28 06:10:23',1,'2006-02-15 21:30:53'),(13695,'2005-08-20 09:13:25',3114,258,'2005-08-27 11:51:25',2,'2006-02-15 21:30:53'),(13696,'2005-08-20 09:16:15',1279,206,'2005-08-21 03:33:15',1,'2006-02-15 21:30:53'),(13697,'2005-08-20 09:21:08',291,76,'2005-08-29 12:33:08',1,'2006-02-15 21:30:53'),(13698,'2005-08-20 09:24:26',3829,364,'2005-08-22 05:04:26',2,'2006-02-15 21:30:53'),(13699,'2005-08-20 09:26:14',3913,21,'2005-08-29 08:16:14',2,'2006-02-15 21:30:53'),(13700,'2005-08-20 09:26:17',4229,265,'2005-08-27 05:49:17',2,'2006-02-15 21:30:53'),(13701,'2005-08-20 09:27:05',1643,564,'2005-08-21 14:54:05',1,'2006-02-15 21:30:53'),(13702,'2005-08-20 09:27:20',700,296,'2005-08-29 15:04:20',2,'2006-02-15 21:30:53'),(13703,'2005-08-20 09:29:35',2296,356,'2005-08-27 08:03:35',2,'2006-02-15 21:30:53'),(13704,'2005-08-20 09:32:04',3373,4,'2005-08-23 14:29:04',2,'2006-02-15 21:30:53'),(13705,'2005-08-20 09:32:23',3663,451,'2005-08-21 13:51:23',1,'2006-02-15 21:30:53'),(13706,'2005-08-20 09:32:56',3005,363,'2005-08-28 05:22:56',2,'2006-02-15 21:30:53'),(13707,'2005-08-20 09:33:58',826,232,'2005-08-23 07:44:58',2,'2006-02-15 21:30:53'),(13708,'2005-08-20 09:34:07',2236,218,'2005-08-26 10:17:07',1,'2006-02-15 21:30:53'),(13709,'2005-08-20 09:34:51',4089,422,'2005-08-23 04:13:51',1,'2006-02-15 21:30:53'),(13710,'2005-08-20 09:35:20',756,333,'2005-08-21 05:29:20',2,'2006-02-15 21:30:53'),(13711,'2005-08-20 09:35:20',2318,453,'2005-08-28 09:06:20',2,'2006-02-15 21:30:53'),(13712,'2005-08-20 09:38:04',1039,581,'2005-08-21 06:10:04',1,'2006-02-15 21:30:53'),(13713,'2006-02-14 15:16:03',3075,267,NULL,1,'2006-02-15 21:30:53'),(13714,'2005-08-20 09:41:09',2659,277,'2005-08-22 06:28:09',1,'2006-02-15 21:30:53'),(13715,'2005-08-20 09:43:06',1028,292,'2005-08-27 10:22:06',1,'2006-02-15 21:30:53'),(13716,'2005-08-20 09:48:32',86,386,'2005-08-26 07:20:32',2,'2006-02-15 21:30:53'),(13717,'2005-08-20 09:50:52',1629,300,'2005-08-28 11:32:52',2,'2006-02-15 21:30:53'),(13718,'2005-08-20 09:53:44',205,19,'2005-08-29 13:46:44',2,'2006-02-15 21:30:53'),(13719,'2006-02-14 15:16:03',3547,208,NULL,1,'2006-02-15 21:30:53'),(13720,'2005-08-20 10:01:39',813,427,'2005-08-27 08:26:39',1,'2006-02-15 21:30:53'),(13721,'2005-08-20 10:02:59',1444,297,'2005-08-24 07:02:59',2,'2006-02-15 21:30:53'),(13722,'2005-08-20 10:03:45',1581,422,'2005-08-25 04:26:45',1,'2006-02-15 21:30:53'),(13723,'2005-08-20 10:05:30',411,110,'2005-08-27 07:43:30',2,'2006-02-15 21:30:53'),(13724,'2005-08-20 10:07:28',200,80,'2005-08-24 07:47:28',2,'2006-02-15 21:30:53'),(13725,'2005-08-20 10:08:27',3861,306,'2005-08-28 06:52:27',2,'2006-02-15 21:30:53'),(13726,'2005-08-20 10:08:40',2258,214,'2005-08-23 14:58:40',1,'2006-02-15 21:30:53'),(13727,'2005-08-20 10:08:53',4201,85,'2005-08-27 09:30:53',1,'2006-02-15 21:30:53'),(13728,'2005-08-20 10:11:07',1962,157,'2005-08-23 10:32:07',1,'2006-02-15 21:30:53'),(13729,'2005-08-20 10:17:08',4108,415,'2005-08-28 15:35:08',1,'2006-02-15 21:30:53'),(13730,'2005-08-20 10:17:09',1330,548,'2005-08-28 10:45:09',1,'2006-02-15 21:30:53'),(13731,'2005-08-20 10:22:08',1133,450,'2005-08-21 12:04:08',2,'2006-02-15 21:30:53'),(13732,'2005-08-20 10:24:41',1138,17,'2005-08-22 04:44:41',1,'2006-02-15 21:30:53'),(13733,'2005-08-20 10:25:12',3994,85,'2005-08-21 10:49:12',2,'2006-02-15 21:30:53'),(13734,'2005-08-20 10:29:57',4561,374,'2005-08-25 14:41:57',2,'2006-02-15 21:30:53'),(13735,'2005-08-20 10:31:01',1813,35,'2005-08-26 05:00:01',1,'2006-02-15 21:30:53'),(13736,'2005-08-20 10:31:23',3369,32,'2005-08-28 06:51:23',1,'2006-02-15 21:30:53'),(13737,'2005-08-20 10:41:50',4319,200,'2005-08-25 14:33:50',2,'2006-02-15 21:30:53'),(13738,'2005-08-20 10:42:42',2748,273,'2005-08-25 09:32:42',1,'2006-02-15 21:30:53'),(13739,'2005-08-20 10:45:10',3027,441,'2005-08-28 08:46:10',2,'2006-02-15 21:30:53'),(13740,'2005-08-20 10:48:43',4366,21,'2005-08-29 15:30:43',1,'2006-02-15 21:30:53'),(13741,'2005-08-20 10:48:47',3887,195,'2005-08-21 11:19:47',1,'2006-02-15 21:30:53'),(13742,'2005-08-20 10:49:15',1377,580,'2005-08-21 11:05:15',2,'2006-02-15 21:30:53'),(13743,'2005-08-20 10:51:27',3693,57,'2005-08-24 15:54:27',1,'2006-02-15 21:30:53'),(13744,'2005-08-20 10:51:45',2962,408,'2005-08-25 06:42:45',2,'2006-02-15 21:30:53'),(13745,'2005-08-20 10:53:49',1264,142,'2005-08-25 13:25:49',1,'2006-02-15 21:30:53'),(13746,'2005-08-20 10:55:28',3742,520,'2005-08-25 07:48:28',2,'2006-02-15 21:30:53'),(13747,'2005-08-20 10:56:06',3332,74,'2005-08-29 10:29:06',1,'2006-02-15 21:30:53'),(13748,'2005-08-20 10:59:54',2198,410,'2005-08-23 12:33:54',1,'2006-02-15 21:30:53'),(13749,'2005-08-20 11:00:37',2811,282,'2005-08-26 12:04:37',1,'2006-02-15 21:30:53'),(13750,'2005-08-20 11:11:42',3363,246,'2005-08-29 16:16:42',2,'2006-02-15 21:30:53'),(13751,'2005-08-20 11:17:03',185,105,'2005-08-22 14:12:03',2,'2006-02-15 21:30:53'),(13752,'2005-08-20 11:17:45',1794,77,'2005-08-29 13:25:45',2,'2006-02-15 21:30:53'),(13753,'2006-02-14 15:16:03',3746,495,NULL,1,'2006-02-15 21:30:53'),(13754,'2005-08-20 11:18:08',1740,108,'2005-08-22 11:55:08',1,'2006-02-15 21:30:53'),(13755,'2005-08-20 11:18:53',1927,342,'2005-08-27 06:51:53',2,'2006-02-15 21:30:53'),(13756,'2006-02-14 15:16:03',1146,252,NULL,2,'2006-02-15 21:30:53'),(13757,'2005-08-20 11:20:12',1147,14,'2005-08-23 10:14:12',2,'2006-02-15 21:30:53'),(13758,'2005-08-20 11:21:26',864,255,'2005-08-29 14:37:26',2,'2006-02-15 21:30:53'),(13759,'2005-08-20 11:24:48',595,269,'2005-08-29 10:29:48',1,'2006-02-15 21:30:53'),(13760,'2005-08-20 11:26:33',3459,436,'2005-08-27 11:12:33',2,'2006-02-15 21:30:53'),(13761,'2005-08-20 11:28:50',3149,376,'2005-08-21 12:05:50',2,'2006-02-15 21:30:53'),(13762,'2005-08-20 11:29:32',451,566,'2005-08-23 17:25:32',1,'2006-02-15 21:30:53'),(13763,'2005-08-20 11:37:56',4171,469,'2005-08-26 13:12:56',1,'2006-02-15 21:30:53'),(13764,'2005-08-20 11:38:16',989,386,'2005-08-27 08:01:16',1,'2006-02-15 21:30:53'),(13765,'2005-08-20 11:39:00',2104,219,'2005-08-21 06:05:00',1,'2006-02-15 21:30:53'),(13766,'2005-08-20 11:42:01',1313,189,'2005-08-27 13:44:01',2,'2006-02-15 21:30:53'),(13767,'2005-08-20 11:43:36',2739,506,'2005-08-22 17:10:36',1,'2006-02-15 21:30:53'),(13768,'2005-08-20 11:43:43',3847,198,'2005-08-27 07:56:43',2,'2006-02-15 21:30:53'),(13769,'2005-08-20 11:43:52',2868,56,'2005-08-28 13:19:52',1,'2006-02-15 21:30:53'),(13770,'2005-08-20 11:45:54',998,538,'2005-08-22 17:08:54',1,'2006-02-15 21:30:53'),(13771,'2005-08-20 11:47:21',2278,512,'2005-08-22 17:09:21',1,'2006-02-15 21:30:53'),(13772,'2005-08-20 11:47:52',2038,387,'2005-08-28 05:50:52',2,'2006-02-15 21:30:53'),(13773,'2005-08-20 11:50:14',3389,64,'2005-08-26 12:35:14',1,'2006-02-15 21:30:53'),(13774,'2005-08-20 11:54:01',735,244,'2005-08-22 13:25:01',2,'2006-02-15 21:30:53'),(13775,'2005-08-20 11:56:30',1858,116,'2005-08-28 12:48:30',2,'2006-02-15 21:30:53'),(13776,'2005-08-20 11:57:06',2439,137,'2005-08-26 10:55:06',1,'2006-02-15 21:30:53'),(13777,'2005-08-20 12:03:35',3587,29,'2005-08-27 10:13:35',1,'2006-02-15 21:30:53'),(13778,'2005-08-20 12:03:44',2385,539,'2005-08-28 12:09:44',1,'2006-02-15 21:30:53'),(13779,'2005-08-20 12:03:54',63,440,'2005-08-28 15:24:54',2,'2006-02-15 21:30:53'),(13780,'2006-02-14 15:16:03',1775,14,NULL,2,'2006-02-15 21:30:53'),(13781,'2005-08-20 12:06:45',971,368,'2005-08-26 06:50:45',2,'2006-02-15 21:30:53'),(13782,'2005-08-20 12:09:26',577,305,'2005-08-23 08:31:26',2,'2006-02-15 21:30:53'),(13783,'2005-08-20 12:11:03',2643,28,'2005-08-21 15:53:03',2,'2006-02-15 21:30:53'),(13784,'2005-08-20 12:11:28',3087,431,'2005-08-25 08:11:28',1,'2006-02-15 21:30:53'),(13785,'2005-08-20 12:11:46',379,453,'2005-08-21 06:39:46',1,'2006-02-15 21:30:53'),(13786,'2005-08-20 12:13:24',515,94,'2005-08-28 07:24:24',2,'2006-02-15 21:30:53'),(13787,'2005-08-20 12:15:23',253,188,'2005-08-27 06:24:23',2,'2006-02-15 21:30:53'),(13788,'2005-08-20 12:15:41',3177,393,'2005-08-28 16:28:41',2,'2006-02-15 21:30:53'),(13789,'2005-08-20 12:16:38',2523,53,'2005-08-25 07:29:38',1,'2006-02-15 21:30:53'),(13790,'2005-08-20 12:17:27',1385,11,'2005-08-25 12:20:27',1,'2006-02-15 21:30:53'),(13791,'2005-08-20 12:21:05',1890,67,'2005-08-22 17:58:05',1,'2006-02-15 21:30:53'),(13792,'2005-08-20 12:21:37',4157,78,'2005-08-27 14:28:37',1,'2006-02-15 21:30:53'),(13793,'2005-08-20 12:22:04',2598,424,'2005-08-27 09:51:04',2,'2006-02-15 21:30:53'),(13794,'2005-08-20 12:25:32',2148,557,'2005-08-23 06:38:32',2,'2006-02-15 21:30:53'),(13795,'2005-08-20 12:32:09',2837,331,'2005-08-21 17:28:09',1,'2006-02-15 21:30:53'),(13796,'2005-08-20 12:32:32',28,209,'2005-08-29 10:48:32',2,'2006-02-15 21:30:53'),(13797,'2005-08-20 12:33:36',2857,529,'2005-08-25 18:03:36',1,'2006-02-15 21:30:53'),(13798,'2006-02-14 15:16:03',526,15,NULL,2,'2006-02-15 21:30:53'),(13799,'2005-08-20 12:36:42',4413,196,'2005-08-28 08:47:42',1,'2006-02-15 21:30:53'),(13800,'2005-08-20 12:40:48',1552,407,'2005-08-22 15:06:48',1,'2006-02-15 21:30:53'),(13801,'2005-08-20 12:40:53',1464,433,'2005-08-21 16:29:53',1,'2006-02-15 21:30:53'),(13802,'2005-08-20 12:44:53',2079,156,'2005-08-22 09:18:53',2,'2006-02-15 21:30:53'),(13803,'2005-08-20 12:46:17',1084,486,'2005-08-24 15:44:17',2,'2006-02-15 21:30:53'),(13804,'2005-08-20 12:46:32',2232,19,'2005-08-29 14:04:32',2,'2006-02-15 21:30:53'),(13805,'2005-08-20 12:53:12',349,454,'2005-08-27 15:21:12',1,'2006-02-15 21:30:53'),(13806,'2005-08-20 12:53:46',444,341,'2005-08-21 10:36:46',1,'2006-02-15 21:30:53'),(13807,'2005-08-20 12:55:40',3822,4,'2005-08-28 09:06:40',2,'2006-02-15 21:30:53'),(13808,'2005-08-20 12:55:43',3689,262,'2005-08-29 11:01:43',2,'2006-02-15 21:30:53'),(13809,'2005-08-20 12:56:03',1597,207,'2005-08-27 11:58:03',1,'2006-02-15 21:30:53'),(13810,'2005-08-20 12:59:38',2228,450,'2005-08-21 17:40:38',1,'2006-02-15 21:30:53'),(13811,'2005-08-20 13:00:30',1235,168,'2005-08-24 10:18:30',1,'2006-02-15 21:30:53'),(13812,'2005-08-20 13:01:43',2788,122,'2005-08-22 16:32:43',2,'2006-02-15 21:30:53'),(13813,'2005-08-20 13:03:26',601,455,'2005-08-25 08:42:26',1,'2006-02-15 21:30:53'),(13814,'2005-08-20 13:07:23',2129,436,'2005-08-22 16:23:23',2,'2006-02-15 21:30:53'),(13815,'2005-08-20 13:08:53',3388,582,'2005-08-29 13:11:53',2,'2006-02-15 21:30:53'),(13816,'2005-08-20 13:13:56',273,27,'2005-08-25 09:46:56',1,'2006-02-15 21:30:53'),(13817,'2005-08-20 13:15:30',1935,293,'2005-08-22 18:48:30',2,'2006-02-15 21:30:53'),(13818,'2005-08-20 13:20:09',1283,495,'2005-08-21 18:41:09',1,'2006-02-15 21:30:53'),(13819,'2005-08-20 13:23:15',1459,296,'2005-08-22 16:02:15',2,'2006-02-15 21:30:53'),(13820,'2005-08-20 13:26:37',3191,81,'2005-08-27 14:05:37',1,'2006-02-15 21:30:53'),(13821,'2005-08-20 13:33:47',2402,355,'2005-08-25 18:09:47',1,'2006-02-15 21:30:53'),(13822,'2005-08-20 13:39:28',807,499,'2005-08-24 07:40:28',1,'2006-02-15 21:30:53'),(13823,'2005-08-20 13:42:10',3875,89,'2005-08-22 18:45:10',1,'2006-02-15 21:30:53'),(13824,'2005-08-20 13:43:12',2845,413,'2005-08-22 17:26:12',1,'2006-02-15 21:30:53'),(13825,'2005-08-20 13:43:22',2135,167,'2005-08-29 19:13:22',1,'2006-02-15 21:30:53'),(13826,'2005-08-20 13:46:38',401,436,'2005-08-29 13:07:38',1,'2006-02-15 21:30:53'),(13827,'2005-08-20 13:47:19',1103,342,'2005-08-28 09:13:19',1,'2006-02-15 21:30:53'),(13828,'2005-08-20 13:49:52',2391,450,'2005-08-25 07:49:52',2,'2006-02-15 21:30:53'),(13829,'2005-08-20 13:50:17',3980,146,'2005-08-24 11:30:17',2,'2006-02-15 21:30:53'),(13830,'2005-08-20 13:57:59',2874,61,'2005-08-25 11:29:59',1,'2006-02-15 21:30:53'),(13831,'2005-08-20 13:59:35',570,480,'2005-08-24 12:50:35',1,'2006-02-15 21:30:53'),(13832,'2005-08-20 14:00:25',3299,29,'2005-08-28 10:11:25',1,'2006-02-15 21:30:53'),(13833,'2005-08-20 14:00:29',792,175,'2005-08-29 12:01:29',2,'2006-02-15 21:30:53'),(13834,'2005-08-20 14:03:08',875,426,'2005-08-22 10:12:08',1,'2006-02-15 21:30:53'),(13835,'2005-08-20 14:06:33',3738,143,'2005-08-26 12:15:33',2,'2006-02-15 21:30:53'),(13836,'2005-08-20 14:18:16',4271,375,'2005-08-21 18:13:16',2,'2006-02-15 21:30:53'),(13837,'2005-08-20 14:19:03',3220,67,'2005-08-22 16:25:03',2,'2006-02-15 21:30:53'),(13838,'2005-08-20 14:22:46',1134,437,'2005-08-29 12:28:46',2,'2006-02-15 21:30:53'),(13839,'2005-08-20 14:23:16',1056,437,'2005-08-26 19:11:16',2,'2006-02-15 21:30:53'),(13840,'2005-08-20 14:23:20',1211,40,'2005-08-28 11:53:20',1,'2006-02-15 21:30:53'),(13841,'2005-08-20 14:25:18',3277,203,'2005-08-29 15:49:18',1,'2006-02-15 21:30:53'),(13842,'2005-08-20 14:29:37',4337,180,'2005-08-29 18:19:37',1,'2006-02-15 21:30:53'),(13843,'2005-08-20 14:30:01',3058,308,'2005-08-27 10:06:01',2,'2006-02-15 21:30:53'),(13844,'2005-08-20 14:30:26',983,179,'2005-08-29 17:08:26',1,'2006-02-15 21:30:53'),(13845,'2005-08-20 14:31:21',3993,559,'2005-08-29 18:29:21',1,'2006-02-15 21:30:53'),(13846,'2005-08-20 14:32:31',3289,257,'2005-08-28 16:58:31',1,'2006-02-15 21:30:53'),(13847,'2005-08-20 14:33:59',2647,82,'2005-08-25 08:49:59',1,'2006-02-15 21:30:53'),(13848,'2005-08-20 14:37:49',802,447,'2005-08-25 13:15:49',1,'2006-02-15 21:30:53'),(13849,'2005-08-20 14:42:34',3774,261,'2005-08-24 13:09:34',2,'2006-02-15 21:30:53'),(13850,'2005-08-20 14:43:03',3030,546,'2005-08-27 11:41:03',2,'2006-02-15 21:30:53'),(13851,'2005-08-20 14:44:22',3278,80,'2005-08-22 18:10:22',1,'2006-02-15 21:30:53'),(13852,'2005-08-20 14:45:23',85,535,'2005-08-22 16:47:23',2,'2006-02-15 21:30:53'),(13853,'2005-08-20 14:47:02',1680,186,'2005-08-26 20:32:02',1,'2006-02-15 21:30:53'),(13854,'2005-08-20 14:48:42',4192,158,'2005-08-21 14:55:42',2,'2006-02-15 21:30:53'),(13855,'2005-08-20 14:48:55',1617,96,'2005-08-28 14:45:55',1,'2006-02-15 21:30:53'),(13856,'2005-08-20 14:49:32',4196,407,'2005-08-29 12:37:32',2,'2006-02-15 21:30:53'),(13857,'2005-08-20 14:50:06',2542,366,'2005-08-24 10:38:06',2,'2006-02-15 21:30:53'),(13858,'2005-08-20 14:50:57',2167,33,'2005-08-23 12:10:57',2,'2006-02-15 21:30:53'),(13859,'2005-08-20 14:53:43',4381,504,'2005-08-28 09:50:43',1,'2006-02-15 21:30:53'),(13860,'2005-08-20 14:55:09',558,275,'2005-08-22 20:42:09',1,'2006-02-15 21:30:53'),(13861,'2005-08-20 14:56:53',303,154,'2005-08-22 18:13:53',2,'2006-02-15 21:30:53'),(13862,'2005-08-20 14:57:01',3271,170,'2005-08-27 10:48:01',2,'2006-02-15 21:30:53'),(13863,'2005-08-20 14:57:50',2417,563,'2005-08-29 15:36:50',2,'2006-02-15 21:30:53'),(13864,'2005-08-20 14:59:55',3935,214,'2005-08-22 09:30:55',2,'2006-02-15 21:30:53'),(13865,'2005-08-20 15:04:09',3647,275,'2005-08-24 10:06:09',2,'2006-02-15 21:30:53'),(13866,'2005-08-20 15:05:29',3432,343,'2005-08-23 11:27:29',2,'2006-02-15 21:30:53'),(13867,'2005-08-20 15:05:42',4514,591,'2005-08-29 10:48:42',2,'2006-02-15 21:30:53'),(13868,'2005-08-20 15:06:26',3173,51,'2005-08-22 19:08:26',2,'2006-02-15 21:30:53'),(13869,'2005-08-20 15:08:57',1990,386,'2005-08-29 13:13:57',2,'2006-02-15 21:30:53'),(13870,'2005-08-20 15:09:16',563,167,'2005-08-28 10:00:16',2,'2006-02-15 21:30:53'),(13871,'2005-08-20 15:10:13',3206,372,'2005-08-29 19:43:13',2,'2006-02-15 21:30:53'),(13872,'2005-08-20 15:10:30',2416,421,'2005-08-24 10:14:30',2,'2006-02-15 21:30:53'),(13873,'2005-08-20 15:11:11',1683,306,'2005-08-22 20:13:11',2,'2006-02-15 21:30:53'),(13874,'2005-08-20 15:11:48',72,86,'2005-08-21 18:26:48',2,'2006-02-15 21:30:53'),(13875,'2005-08-20 15:13:11',348,83,'2005-08-21 13:11:11',1,'2006-02-15 21:30:53'),(13876,'2005-08-20 15:15:28',3137,334,'2005-08-23 12:42:28',2,'2006-02-15 21:30:53'),(13877,'2005-08-20 15:16:18',3387,5,'2005-08-22 18:20:18',1,'2006-02-15 21:30:53'),(13878,'2005-08-20 15:17:38',49,481,'2005-08-21 21:11:38',2,'2006-02-15 21:30:53'),(13879,'2005-08-20 15:18:10',4022,112,'2005-08-22 19:23:10',2,'2006-02-15 21:30:53'),(13880,'2005-08-20 15:18:20',3911,268,'2005-08-24 18:03:20',2,'2006-02-15 21:30:53'),(13881,'2005-08-20 15:18:55',2831,144,'2005-08-25 11:25:55',1,'2006-02-15 21:30:53'),(13882,'2005-08-20 15:23:26',3245,51,'2005-08-22 13:03:26',1,'2006-02-15 21:30:53'),(13883,'2005-08-20 15:28:53',584,568,'2005-08-21 13:11:53',1,'2006-02-15 21:30:53'),(13884,'2005-08-20 15:30:51',3182,466,'2005-08-26 13:34:51',1,'2006-02-15 21:30:53'),(13885,'2005-08-20 15:32:09',3195,537,'2005-08-26 15:54:09',1,'2006-02-15 21:30:53'),(13886,'2005-08-20 15:34:43',2248,73,'2005-08-26 11:48:43',2,'2006-02-15 21:30:53'),(13887,'2005-08-20 15:39:00',4002,413,'2005-08-24 16:17:00',2,'2006-02-15 21:30:53'),(13888,'2005-08-20 15:39:42',1943,297,'2005-08-28 13:41:42',1,'2006-02-15 21:30:53'),(13889,'2005-08-20 15:40:06',4406,501,'2005-08-22 14:09:06',2,'2006-02-15 21:30:53'),(13890,'2005-08-20 15:41:00',2965,54,'2005-08-22 16:00:00',1,'2006-02-15 21:30:53'),(13891,'2005-08-20 15:42:05',2042,289,'2005-08-25 13:26:05',1,'2006-02-15 21:30:53'),(13892,'2005-08-20 15:50:17',1236,337,'2005-08-29 13:33:17',2,'2006-02-15 21:30:53'),(13893,'2005-08-20 15:52:52',3503,390,'2005-08-27 16:21:52',2,'2006-02-15 21:30:53'),(13894,'2005-08-20 15:55:20',2649,360,'2005-08-26 17:26:20',2,'2006-02-15 21:30:53'),(13895,'2005-08-20 15:58:28',3060,12,'2005-08-26 15:07:28',2,'2006-02-15 21:30:53'),(13896,'2005-08-20 15:59:56',1338,278,'2005-08-21 20:14:56',2,'2006-02-15 21:30:53'),(13897,'2005-08-20 16:02:28',628,258,'2005-08-23 14:29:28',1,'2006-02-15 21:30:53'),(13898,'2006-02-14 15:16:03',4007,369,NULL,2,'2006-02-15 21:30:53'),(13899,'2005-08-20 16:05:11',427,204,'2005-08-23 15:14:11',2,'2006-02-15 21:30:53'),(13900,'2005-08-20 16:05:41',1140,66,'2005-08-22 15:13:41',1,'2006-02-15 21:30:53'),(13901,'2005-08-20 16:06:53',3281,166,'2005-08-28 11:30:53',1,'2006-02-15 21:30:53'),(13902,'2005-08-20 16:07:08',1165,275,'2005-08-24 16:43:08',2,'2006-02-15 21:30:53'),(13903,'2005-08-20 16:07:55',1676,272,'2005-08-25 18:26:55',1,'2006-02-15 21:30:53'),(13904,'2005-08-20 16:11:34',721,93,'2005-08-26 12:46:34',1,'2006-02-15 21:30:53'),(13905,'2005-08-20 16:12:48',2714,437,'2005-08-28 16:05:48',1,'2006-02-15 21:30:53'),(13906,'2005-08-20 16:16:03',3960,87,'2005-08-21 13:29:03',2,'2006-02-15 21:30:53'),(13907,'2005-08-20 16:17:27',806,328,'2005-08-24 20:14:27',2,'2006-02-15 21:30:53'),(13908,'2005-08-20 16:21:40',3661,532,'2005-08-29 21:16:40',1,'2006-02-15 21:30:53'),(13909,'2005-08-20 16:26:36',1508,309,'2005-08-21 20:59:36',2,'2006-02-15 21:30:53'),(13910,'2005-08-20 16:30:49',252,133,'2005-08-24 13:30:49',2,'2006-02-15 21:30:53'),(13911,'2005-08-20 16:31:33',4400,304,'2005-08-28 19:26:33',2,'2006-02-15 21:30:53'),(13912,'2005-08-20 16:32:10',968,207,'2005-08-29 17:37:10',2,'2006-02-15 21:30:53'),(13913,'2005-08-20 16:37:35',4259,197,'2005-08-26 13:12:35',2,'2006-02-15 21:30:53'),(13914,'2005-08-20 16:38:57',3037,237,'2005-08-26 14:53:57',2,'2006-02-15 21:30:53'),(13915,'2005-08-20 16:42:53',1180,129,'2005-08-23 20:30:53',2,'2006-02-15 21:30:53'),(13916,'2005-08-20 16:43:02',2971,302,'2005-08-25 19:21:02',1,'2006-02-15 21:30:53'),(13917,'2005-08-20 16:43:28',4326,10,'2005-08-29 16:44:28',2,'2006-02-15 21:30:53'),(13918,'2005-08-20 16:47:32',3301,248,'2005-08-21 12:00:32',2,'2006-02-15 21:30:53'),(13919,'2005-08-20 16:47:34',909,129,'2005-08-23 21:27:34',2,'2006-02-15 21:30:53'),(13920,'2005-08-20 16:51:18',3200,460,'2005-08-27 16:05:18',2,'2006-02-15 21:30:53'),(13921,'2005-08-20 16:57:11',3943,59,'2005-08-22 19:25:11',2,'2006-02-15 21:30:53'),(13922,'2005-08-20 17:02:37',1398,237,'2005-08-29 19:28:37',1,'2006-02-15 21:30:53'),(13923,'2005-08-20 17:05:02',3129,588,'2005-08-27 11:22:02',2,'2006-02-15 21:30:53'),(13924,'2005-08-20 17:05:18',3066,444,'2005-08-23 16:54:18',2,'2006-02-15 21:30:53'),(13925,'2005-08-20 17:05:34',4034,565,'2005-08-27 15:32:34',2,'2006-02-15 21:30:53'),(13926,'2005-08-20 17:09:27',932,158,'2005-08-28 13:42:27',2,'2006-02-15 21:30:53'),(13927,'2005-08-20 17:11:58',4284,417,'2005-08-24 12:44:58',1,'2006-02-15 21:30:53'),(13928,'2005-08-20 17:12:28',1121,244,'2005-08-21 13:33:28',1,'2006-02-15 21:30:53'),(13929,'2005-08-20 17:13:48',946,57,'2005-08-28 15:19:48',1,'2006-02-15 21:30:53'),(13930,'2005-08-20 17:15:06',3585,58,'2005-08-21 14:29:06',1,'2006-02-15 21:30:53'),(13931,'2005-08-20 17:16:10',3884,32,'2005-08-27 12:03:10',2,'2006-02-15 21:30:53'),(13932,'2005-08-20 17:17:00',471,441,'2005-08-24 14:06:00',1,'2006-02-15 21:30:53'),(13933,'2005-08-20 17:17:07',647,159,'2005-08-22 18:10:07',2,'2006-02-15 21:30:53'),(13934,'2005-08-20 17:18:48',4567,457,'2005-08-26 15:31:48',1,'2006-02-15 21:30:53'),(13935,'2005-08-20 17:20:49',4426,205,'2005-08-24 16:52:49',2,'2006-02-15 21:30:53'),(13936,'2005-08-20 17:22:35',1731,364,'2005-08-23 20:07:35',2,'2006-02-15 21:30:53'),(13937,'2005-08-20 17:22:51',1755,172,'2005-08-27 15:51:51',1,'2006-02-15 21:30:53'),(13938,'2005-08-20 17:24:45',3743,463,'2005-08-21 18:39:45',1,'2006-02-15 21:30:53'),(13939,'2005-08-20 17:28:01',2700,585,'2005-08-23 14:40:01',2,'2006-02-15 21:30:53'),(13940,'2005-08-20 17:28:57',2638,187,'2005-08-27 22:07:57',1,'2006-02-15 21:30:53'),(13941,'2006-02-14 15:16:03',2727,476,NULL,2,'2006-02-15 21:30:53'),(13942,'2005-08-20 17:30:52',4403,211,'2005-08-25 13:46:52',2,'2006-02-15 21:30:53'),(13943,'2005-08-20 17:31:18',22,464,'2005-08-24 11:33:18',1,'2006-02-15 21:30:53'),(13944,'2005-08-20 17:41:16',3685,408,'2005-08-23 12:02:16',1,'2006-02-15 21:30:53'),(13945,'2005-08-20 17:43:56',3328,270,'2005-08-26 19:19:56',1,'2006-02-15 21:30:53'),(13946,'2005-08-20 17:44:32',3564,529,'2005-08-28 19:19:32',1,'2006-02-15 21:30:53'),(13947,'2005-08-20 17:46:06',2562,218,'2005-08-29 23:44:06',2,'2006-02-15 21:30:53'),(13948,'2005-08-20 17:50:48',4033,410,'2005-08-25 20:56:48',2,'2006-02-15 21:30:53'),(13949,'2005-08-20 17:55:13',1518,34,'2005-08-22 20:49:13',1,'2006-02-15 21:30:53'),(13950,'2005-08-20 17:58:00',3978,93,'2005-08-29 23:23:00',1,'2006-02-15 21:30:53'),(13951,'2005-08-20 17:58:11',2034,40,'2005-08-26 14:50:11',2,'2006-02-15 21:30:53'),(13952,'2006-02-14 15:16:03',224,199,NULL,2,'2006-02-15 21:30:53'),(13953,'2005-08-20 18:00:37',1818,371,'2005-08-28 14:52:37',1,'2006-02-15 21:30:53'),(13954,'2005-08-20 18:02:41',3812,207,'2005-08-27 21:52:41',2,'2006-02-15 21:30:53'),(13955,'2005-08-20 18:05:12',2613,273,'2005-08-29 18:25:12',1,'2006-02-15 21:30:53'),(13956,'2005-08-20 18:08:19',3757,484,'2005-08-29 17:03:19',1,'2006-02-15 21:30:53'),(13957,'2005-08-20 18:09:04',2889,179,'2005-08-23 16:52:04',1,'2006-02-15 21:30:53'),(13958,'2005-08-20 18:11:44',2380,33,'2005-08-28 14:59:44',1,'2006-02-15 21:30:53'),(13959,'2005-08-20 18:16:21',2283,142,'2005-08-22 13:56:21',2,'2006-02-15 21:30:53'),(13960,'2005-08-20 18:16:26',4177,459,'2005-08-29 14:06:26',1,'2006-02-15 21:30:53'),(13961,'2005-08-20 18:16:34',2271,129,'2005-08-21 16:14:34',1,'2006-02-15 21:30:53'),(13962,'2005-08-20 18:18:06',1434,348,'2005-08-24 22:16:06',2,'2006-02-15 21:30:53'),(13963,'2005-08-20 18:20:18',4145,368,'2005-08-24 21:26:18',1,'2006-02-15 21:30:53'),(13964,'2005-08-20 18:24:26',108,128,'2005-08-21 21:19:26',2,'2006-02-15 21:30:53'),(13965,'2006-02-14 15:16:03',670,324,NULL,2,'2006-02-15 21:30:53'),(13966,'2005-08-20 18:28:28',4520,260,'2005-08-22 16:49:28',2,'2006-02-15 21:30:53'),(13967,'2005-08-20 18:28:46',2751,459,'2005-08-26 17:37:46',2,'2006-02-15 21:30:53'),(13968,'2006-02-14 15:16:03',3715,15,NULL,2,'2006-02-15 21:30:53'),(13969,'2005-08-20 18:42:40',1836,237,'2005-08-27 17:33:40',2,'2006-02-15 21:30:53'),(13970,'2005-08-20 18:43:34',1942,418,'2005-08-22 15:17:34',2,'2006-02-15 21:30:53'),(13971,'2005-08-20 18:44:53',1678,64,'2005-08-22 16:25:53',2,'2006-02-15 21:30:53'),(13972,'2005-08-20 18:52:17',1687,553,'2005-08-28 15:19:17',1,'2006-02-15 21:30:53'),(13973,'2005-08-20 18:52:43',1181,58,'2005-08-21 19:11:43',1,'2006-02-15 21:30:53'),(13974,'2005-08-20 18:54:59',1912,479,'2005-08-28 13:02:59',1,'2006-02-15 21:30:53'),(13975,'2005-08-20 18:58:23',3821,286,'2005-08-25 20:58:23',1,'2006-02-15 21:30:53'),(13976,'2005-08-20 19:02:16',1785,278,'2005-08-25 17:58:16',2,'2006-02-15 21:30:53'),(13977,'2005-08-20 19:02:34',1126,115,'2005-08-24 14:14:34',1,'2006-02-15 21:30:53'),(13978,'2005-08-20 19:03:25',1263,260,'2005-08-27 18:02:25',2,'2006-02-15 21:30:53'),(13979,'2005-08-20 19:03:49',2998,211,'2005-08-24 21:23:49',1,'2006-02-15 21:30:53'),(13980,'2005-08-20 19:04:40',1067,391,'2005-08-21 18:36:40',2,'2006-02-15 21:30:53'),(13981,'2005-08-20 19:07:20',3342,249,'2005-08-23 15:13:20',1,'2006-02-15 21:30:53'),(13982,'2005-08-20 19:08:25',2901,448,'2005-08-28 15:59:25',2,'2006-02-15 21:30:53'),(13983,'2005-08-20 19:08:32',457,231,'2005-08-29 23:45:32',1,'2006-02-15 21:30:53'),(13984,'2005-08-20 19:12:30',2183,473,'2005-08-29 22:04:30',1,'2006-02-15 21:30:53'),(13985,'2005-08-20 19:13:06',1081,339,'2005-08-24 21:24:06',2,'2006-02-15 21:30:53'),(13986,'2005-08-20 19:13:23',3701,152,'2005-08-22 20:59:23',2,'2006-02-15 21:30:53'),(13987,'2005-08-20 19:19:30',1443,246,'2005-08-23 15:37:30',2,'2006-02-15 21:30:53'),(13988,'2005-08-20 19:21:28',3567,466,'2005-08-21 22:20:28',2,'2006-02-15 21:30:53'),(13989,'2005-08-20 19:27:50',1470,252,'2005-08-28 15:17:50',2,'2006-02-15 21:30:53'),(13990,'2005-08-20 19:29:23',2272,481,'2005-08-25 18:50:23',2,'2006-02-15 21:30:53'),(13991,'2005-08-20 19:29:44',1971,296,'2005-08-24 21:10:44',1,'2006-02-15 21:30:53'),(13992,'2005-08-20 19:30:35',2798,136,'2005-08-24 19:09:35',2,'2006-02-15 21:30:53'),(13993,'2005-08-20 19:32:29',1158,93,'2005-08-26 16:59:29',2,'2006-02-15 21:30:53'),(13994,'2005-08-20 19:33:21',142,180,'2005-08-24 20:55:21',1,'2006-02-15 21:30:53'),(13995,'2005-08-20 19:34:43',3789,381,'2005-08-25 22:25:43',2,'2006-02-15 21:30:53'),(13996,'2005-08-20 19:45:43',3341,306,'2005-08-22 16:47:43',2,'2006-02-15 21:30:53'),(13997,'2005-08-20 19:51:28',2330,175,'2005-08-26 01:29:28',2,'2006-02-15 21:30:53'),(13998,'2005-08-20 19:52:38',3936,530,'2005-08-26 14:57:38',1,'2006-02-15 21:30:53'),(13999,'2005-08-20 19:53:32',4149,239,'2005-08-26 19:01:32',1,'2006-02-15 21:30:53'),(14000,'2005-08-20 20:06:05',3907,276,'2005-08-28 17:02:05',1,'2006-02-15 21:30:53'),(14001,'2005-08-20 20:07:15',1318,120,'2005-08-27 00:50:15',2,'2006-02-15 21:30:53'),(14002,'2005-08-20 20:12:19',87,33,'2005-08-23 00:23:19',1,'2006-02-15 21:30:53'),(14003,'2005-08-20 20:16:06',3165,256,'2005-08-28 14:36:06',1,'2006-02-15 21:30:53'),(14004,'2005-08-20 20:16:35',3445,358,'2005-08-28 17:23:35',2,'2006-02-15 21:30:53'),(14005,'2005-08-20 20:19:05',1415,135,'2005-08-26 01:42:05',2,'2006-02-15 21:30:53'),(14006,'2005-08-20 20:21:36',2189,186,'2005-08-21 15:26:36',1,'2006-02-15 21:30:53'),(14007,'2005-08-20 20:22:47',374,284,'2005-08-28 20:40:47',2,'2006-02-15 21:30:53'),(14008,'2005-08-20 20:26:00',2427,560,'2005-08-28 17:23:00',2,'2006-02-15 21:30:53'),(14009,'2005-08-20 20:26:53',3004,382,'2005-08-21 23:32:53',2,'2006-02-15 21:30:53'),(14010,'2005-08-20 20:29:46',934,537,'2005-08-26 17:37:46',2,'2006-02-15 21:30:53'),(14011,'2005-08-20 20:32:56',1212,379,'2005-08-28 21:44:56',1,'2006-02-15 21:30:53'),(14012,'2005-08-20 20:42:12',1866,274,'2005-08-23 23:10:12',2,'2006-02-15 21:30:53'),(14013,'2005-08-20 20:42:50',3941,496,'2005-08-25 21:37:50',2,'2006-02-15 21:30:53'),(14014,'2005-08-20 20:47:09',2188,335,'2005-08-21 22:08:09',2,'2006-02-15 21:30:53'),(14015,'2005-08-20 20:47:43',3145,554,'2005-08-26 19:37:43',1,'2006-02-15 21:30:53'),(14016,'2005-08-20 20:52:03',509,220,'2005-08-23 18:04:03',2,'2006-02-15 21:30:53'),(14017,'2005-08-20 20:55:32',920,230,'2005-08-23 16:12:32',1,'2006-02-15 21:30:53'),(14018,'2006-02-14 15:16:03',2136,533,NULL,2,'2006-02-15 21:30:53'),(14019,'2005-08-20 20:59:15',1929,202,'2005-08-28 17:29:15',2,'2006-02-15 21:30:53'),(14020,'2005-08-20 20:59:43',2257,72,'2005-08-23 17:11:43',2,'2006-02-15 21:30:53'),(14021,'2005-08-20 21:02:12',4394,147,'2005-08-27 22:15:12',1,'2006-02-15 21:30:53'),(14022,'2005-08-20 21:08:49',4068,170,'2005-08-29 21:57:49',1,'2006-02-15 21:30:53'),(14023,'2005-08-20 21:10:32',2668,304,'2005-08-23 20:57:32',1,'2006-02-15 21:30:53'),(14024,'2005-08-20 21:13:58',1492,87,'2005-08-29 23:02:58',1,'2006-02-15 21:30:53'),(14025,'2005-08-20 21:19:36',4521,37,'2005-08-29 23:39:36',1,'2006-02-15 21:30:53'),(14026,'2005-08-20 21:21:08',115,231,'2005-08-22 23:19:08',2,'2006-02-15 21:30:53'),(14027,'2005-08-20 21:21:34',284,432,'2005-08-28 17:46:34',1,'2006-02-15 21:30:53'),(14028,'2005-08-20 21:23:03',4061,158,'2005-08-25 17:29:03',2,'2006-02-15 21:30:53'),(14029,'2005-08-20 21:23:11',2653,219,'2005-08-22 18:01:11',2,'2006-02-15 21:30:53'),(14030,'2005-08-20 21:23:54',1027,127,'2005-08-27 01:19:54',1,'2006-02-15 21:30:53'),(14031,'2005-08-20 21:24:24',440,361,'2005-08-23 21:47:24',2,'2006-02-15 21:30:53'),(14032,'2005-08-20 21:26:55',3542,317,'2005-08-26 19:19:55',1,'2006-02-15 21:30:53'),(14033,'2005-08-20 21:30:53',525,243,'2005-08-23 01:45:53',2,'2006-02-15 21:30:53'),(14034,'2005-08-20 21:31:52',3484,200,'2005-08-29 00:13:52',1,'2006-02-15 21:30:53'),(14035,'2005-08-20 21:31:58',2035,260,'2005-08-22 16:28:58',1,'2006-02-15 21:30:53'),(14036,'2005-08-20 21:35:27',202,256,'2005-08-23 03:29:27',1,'2006-02-15 21:30:53'),(14037,'2005-08-20 21:35:58',3655,372,'2005-08-29 23:06:58',2,'2006-02-15 21:30:53'),(14038,'2005-08-20 21:39:23',1069,589,'2005-08-27 23:57:23',2,'2006-02-15 21:30:53'),(14039,'2005-08-20 21:39:43',4187,383,'2005-08-24 19:03:43',1,'2006-02-15 21:30:53'),(14040,'2005-08-20 21:43:44',905,17,'2005-08-25 16:30:44',1,'2006-02-15 21:30:53'),(14041,'2005-08-20 21:45:23',52,247,'2005-08-26 01:42:23',1,'2006-02-15 21:30:53'),(14042,'2005-08-20 21:45:51',505,322,'2005-08-23 19:57:51',2,'2006-02-15 21:30:53'),(14043,'2005-08-20 21:46:43',1485,586,'2005-08-21 18:27:43',2,'2006-02-15 21:30:53'),(14044,'2005-08-20 21:48:38',1422,145,'2005-08-29 02:56:38',1,'2006-02-15 21:30:53'),(14045,'2005-08-20 21:50:11',3010,509,'2005-08-25 19:03:11',2,'2006-02-15 21:30:53'),(14046,'2005-08-20 21:53:21',2352,524,'2005-08-23 17:51:21',2,'2006-02-15 21:30:53'),(14047,'2005-08-20 22:00:43',186,579,'2005-08-24 03:17:43',2,'2006-02-15 21:30:53'),(14048,'2005-08-20 22:03:18',3475,105,'2005-08-25 02:57:18',2,'2006-02-15 21:30:53'),(14049,'2005-08-20 22:08:55',1335,112,'2005-08-28 20:24:55',1,'2006-02-15 21:30:53'),(14050,'2005-08-20 22:09:04',1737,596,'2005-08-26 01:39:04',2,'2006-02-15 21:30:53'),(14051,'2005-08-20 22:09:51',4012,362,'2005-08-29 04:04:51',2,'2006-02-15 21:30:53'),(14052,'2005-08-20 22:11:46',3893,514,'2005-08-22 20:26:46',2,'2006-02-15 21:30:53'),(14053,'2005-08-20 22:13:59',2177,5,'2005-08-26 20:50:59',2,'2006-02-15 21:30:53'),(14054,'2005-08-20 22:17:01',338,50,'2005-08-21 21:34:01',1,'2006-02-15 21:30:53'),(14055,'2005-08-20 22:18:00',1571,148,'2005-08-22 02:09:00',2,'2006-02-15 21:30:53'),(14056,'2005-08-20 22:18:53',1300,22,'2005-08-27 01:05:53',2,'2006-02-15 21:30:53'),(14057,'2005-08-20 22:22:59',1526,333,'2005-08-25 16:58:59',2,'2006-02-15 21:30:53'),(14058,'2005-08-20 22:24:35',178,430,'2005-08-30 02:26:35',1,'2006-02-15 21:30:53'),(14059,'2005-08-20 22:24:44',2045,141,'2005-08-26 21:25:44',2,'2006-02-15 21:30:53'),(14060,'2006-02-14 15:16:03',3100,175,NULL,2,'2006-02-15 21:30:53'),(14061,'2005-08-20 22:32:11',73,53,'2005-08-22 19:28:11',1,'2006-02-15 21:30:53'),(14062,'2005-08-20 22:34:34',2841,239,'2005-08-25 17:11:34',2,'2006-02-15 21:30:53'),(14063,'2005-08-20 22:36:40',1215,275,'2005-08-25 00:18:40',2,'2006-02-15 21:30:53'),(14064,'2005-08-20 22:39:16',2938,103,'2005-08-22 00:45:16',2,'2006-02-15 21:30:53'),(14065,'2005-08-20 22:40:47',3758,190,'2005-08-24 01:47:47',1,'2006-02-15 21:30:53'),(14066,'2005-08-20 22:45:58',2444,274,'2005-08-29 00:23:58',2,'2006-02-15 21:30:53'),(14067,'2005-08-20 22:49:23',1376,259,'2005-08-29 22:28:23',2,'2006-02-15 21:30:53'),(14068,'2005-08-20 22:50:59',818,412,'2005-08-29 00:45:59',1,'2006-02-15 21:30:53'),(14069,'2005-08-20 22:51:25',2239,197,'2005-08-30 00:30:25',2,'2006-02-15 21:30:53'),(14070,'2005-08-20 22:56:34',846,581,'2005-08-29 22:02:34',1,'2006-02-15 21:30:53'),(14071,'2005-08-20 23:01:56',2471,550,'2005-08-22 02:14:56',1,'2006-02-15 21:30:53'),(14072,'2005-08-20 23:07:10',2387,515,'2005-08-23 03:38:10',2,'2006-02-15 21:30:53'),(14073,'2005-08-20 23:12:57',2996,230,'2005-08-28 18:47:57',2,'2006-02-15 21:30:53'),(14074,'2005-08-20 23:16:07',1303,506,'2005-08-26 04:45:07',1,'2006-02-15 21:30:53'),(14075,'2005-08-20 23:18:54',3793,32,'2005-08-26 21:59:54',2,'2006-02-15 21:30:53'),(14076,'2005-08-20 23:20:10',1070,574,'2005-08-24 04:00:10',1,'2006-02-15 21:30:53'),(14077,'2005-08-20 23:24:07',3184,21,'2005-08-29 02:53:07',1,'2006-02-15 21:30:53'),(14078,'2005-08-20 23:26:40',1642,396,'2005-08-28 02:30:40',1,'2006-02-15 21:30:53'),(14079,'2005-08-20 23:29:25',3528,348,'2005-08-25 04:16:25',2,'2006-02-15 21:30:53'),(14080,'2005-08-20 23:29:50',3962,266,'2005-08-26 00:33:50',1,'2006-02-15 21:30:53'),(14081,'2005-08-20 23:35:13',589,392,'2005-08-28 01:41:13',2,'2006-02-15 21:30:53'),(14082,'2005-08-20 23:42:00',3767,179,'2005-08-27 00:59:00',1,'2006-02-15 21:30:53'),(14083,'2005-08-20 23:42:31',1823,176,'2005-08-28 21:44:31',1,'2006-02-15 21:30:53'),(14084,'2005-08-20 23:42:46',900,37,'2005-08-24 20:06:46',1,'2006-02-15 21:30:53'),(14085,'2005-08-20 23:46:24',3506,471,'2005-08-29 02:31:24',2,'2006-02-15 21:30:53'),(14086,'2005-08-20 23:47:54',3244,253,'2005-08-27 22:49:54',1,'2006-02-15 21:30:53'),(14087,'2005-08-20 23:53:40',2368,289,'2005-08-26 20:22:40',1,'2006-02-15 21:30:53'),(14088,'2005-08-20 23:57:24',1184,518,'2005-08-28 21:49:24',1,'2006-02-15 21:30:53'),(14089,'2005-08-20 23:59:02',1400,425,'2005-08-27 00:19:02',1,'2006-02-15 21:30:53'),(14090,'2005-08-21 00:11:16',3254,168,'2005-08-23 19:48:16',2,'2006-02-15 21:30:53'),(14091,'2005-08-21 00:11:17',3304,53,'2005-08-27 18:38:17',1,'2006-02-15 21:30:53'),(14092,'2005-08-21 00:14:32',1596,273,'2005-08-24 22:22:32',2,'2006-02-15 21:30:53'),(14093,'2005-08-21 00:21:29',1176,177,'2005-08-22 04:01:29',1,'2006-02-15 21:30:53'),(14094,'2005-08-21 00:21:35',3674,471,'2005-08-23 05:27:35',2,'2006-02-15 21:30:53'),(14095,'2005-08-21 00:25:45',1550,489,'2005-08-28 23:00:45',1,'2006-02-15 21:30:53'),(14096,'2005-08-21 00:27:46',2089,342,'2005-08-22 22:53:46',1,'2006-02-15 21:30:53'),(14097,'2005-08-21 00:28:48',4351,88,'2005-08-29 22:15:48',1,'2006-02-15 21:30:53'),(14098,'2005-08-21 00:30:32',6,554,NULL,2,'2006-02-23 04:12:08'),(14099,'2005-08-21 00:31:03',2452,224,'2005-08-27 03:18:03',2,'2006-02-15 21:30:53'),(14100,'2005-08-21 00:31:07',4295,397,'2005-08-25 05:31:07',2,'2006-02-15 21:30:53'),(14101,'2005-08-21 00:33:03',1892,19,'2005-08-24 01:59:03',1,'2006-02-15 21:30:53'),(14102,'2005-08-21 00:35:21',3772,584,'2005-08-30 04:51:21',2,'2006-02-15 21:30:53'),(14103,'2005-08-21 00:37:00',1438,409,'2005-08-25 22:09:00',2,'2006-02-15 21:30:53'),(14104,'2005-08-21 00:37:44',912,178,'2005-08-21 22:55:44',2,'2006-02-15 21:30:53'),(14105,'2005-08-21 00:44:34',1111,71,'2005-08-29 19:00:34',1,'2006-02-15 21:30:53'),(14106,'2005-08-21 00:46:01',2673,315,'2005-08-27 23:44:01',1,'2006-02-15 21:30:53'),(14107,'2006-02-14 15:16:03',3998,251,NULL,1,'2006-02-15 21:30:53'),(14108,'2005-08-21 00:52:45',4339,243,'2005-08-21 19:35:45',2,'2006-02-15 21:30:53'),(14109,'2005-08-21 00:52:58',1046,180,'2005-08-22 00:09:58',2,'2006-02-15 21:30:53'),(14110,'2005-08-21 00:53:09',2709,35,'2005-08-24 05:33:09',2,'2006-02-15 21:30:53'),(14111,'2005-08-21 00:59:01',1294,130,'2005-08-22 20:43:01',2,'2006-02-15 21:30:53'),(14112,'2005-08-21 01:00:46',734,141,'2005-08-27 03:46:46',1,'2006-02-15 21:30:53'),(14113,'2005-08-21 01:03:30',931,288,'2005-08-23 06:46:30',2,'2006-02-15 21:30:53'),(14114,'2005-08-21 01:07:11',2270,8,'2005-08-24 20:33:11',1,'2006-02-15 21:30:53'),(14115,'2005-08-21 01:10:29',1945,257,'2005-08-24 01:21:29',1,'2006-02-15 21:30:53'),(14116,'2005-08-21 01:11:17',2356,142,'2005-08-24 23:45:17',2,'2006-02-15 21:30:53'),(14117,'2005-08-21 01:11:59',573,493,'2005-08-22 06:56:59',1,'2006-02-15 21:30:53'),(14118,'2005-08-21 01:13:37',2605,337,'2005-08-28 02:35:37',2,'2006-02-15 21:30:53'),(14119,'2005-08-21 01:15:59',129,53,'2005-08-27 23:36:59',2,'2006-02-15 21:30:53'),(14120,'2005-08-21 01:25:00',4069,302,'2005-08-24 23:21:00',2,'2006-02-15 21:30:53'),(14121,'2005-08-21 01:26:33',4207,417,'2005-08-28 22:47:33',2,'2006-02-15 21:30:53'),(14122,'2005-08-21 01:29:01',3955,86,'2005-08-27 05:31:01',1,'2006-02-15 21:30:53'),(14123,'2005-08-21 01:31:25',143,66,'2005-08-23 02:32:25',1,'2006-02-15 21:30:53'),(14124,'2005-08-21 01:31:51',311,35,'2005-08-24 22:20:51',2,'2006-02-15 21:30:53'),(14125,'2005-08-21 01:32:16',2174,265,'2005-08-26 00:09:16',1,'2006-02-15 21:30:53'),(14126,'2005-08-21 01:32:17',2738,215,'2005-08-23 01:02:17',1,'2006-02-15 21:30:53'),(14127,'2005-08-21 01:33:32',4532,550,'2005-08-22 02:47:32',2,'2006-02-15 21:30:53'),(14128,'2005-08-21 01:35:58',2594,81,'2005-08-21 21:23:58',2,'2006-02-15 21:30:53'),(14129,'2005-08-21 01:42:15',3572,362,'2005-08-23 20:04:15',2,'2006-02-15 21:30:53'),(14130,'2005-08-21 01:43:11',3859,352,'2005-08-27 21:16:11',2,'2006-02-15 21:30:53'),(14131,'2005-08-21 01:43:40',4382,267,'2005-08-29 02:00:40',2,'2006-02-15 21:30:53'),(14132,'2005-08-21 01:43:58',3806,91,'2005-08-26 20:16:58',2,'2006-02-15 21:30:53'),(14133,'2005-08-21 01:44:14',2463,453,'2005-08-30 02:19:14',2,'2006-02-15 21:30:53'),(14134,'2005-08-21 01:45:54',2159,497,'2005-08-24 01:36:54',1,'2006-02-15 21:30:53'),(14135,'2005-08-21 01:53:54',347,59,'2005-08-27 05:57:54',1,'2006-02-15 21:30:53'),(14136,'2005-08-21 01:57:26',268,135,'2005-08-28 01:11:26',1,'2006-02-15 21:30:53'),(14137,'2006-02-14 15:16:03',2346,53,NULL,2,'2006-02-15 21:30:53'),(14138,'2005-08-21 01:59:37',1238,121,'2005-08-30 01:17:37',2,'2006-02-15 21:30:53'),(14139,'2005-08-21 02:04:33',2280,561,'2005-08-22 04:16:33',2,'2006-02-15 21:30:53'),(14140,'2005-08-21 02:04:57',2070,65,'2005-08-29 06:41:57',2,'2006-02-15 21:30:53'),(14141,'2005-08-21 02:07:22',4527,190,'2005-08-30 07:32:22',1,'2006-02-15 21:30:53'),(14142,'2005-08-21 02:07:43',1479,544,'2005-08-23 02:37:43',2,'2006-02-15 21:30:53'),(14143,'2005-08-21 02:10:32',2549,146,'2005-08-23 23:50:32',1,'2006-02-15 21:30:53'),(14144,'2005-08-21 02:10:57',2366,46,'2005-08-28 01:02:57',1,'2006-02-15 21:30:53'),(14145,'2005-08-21 02:11:38',150,314,'2005-08-22 22:19:38',2,'2006-02-15 21:30:53'),(14146,'2005-08-21 02:13:31',2151,192,'2005-08-24 22:47:31',2,'2006-02-15 21:30:53'),(14147,'2005-08-21 02:14:03',1476,366,'2005-08-27 22:38:03',1,'2006-02-15 21:30:53'),(14148,'2005-08-21 02:17:49',1605,528,'2005-08-22 00:12:49',1,'2006-02-15 21:30:53'),(14149,'2005-08-21 02:22:47',3371,518,'2005-08-24 02:36:47',1,'2006-02-15 21:30:53'),(14150,'2005-08-21 02:23:03',2324,161,'2005-08-25 22:50:03',2,'2006-02-15 21:30:53'),(14151,'2005-08-21 02:23:25',2785,426,'2005-08-30 07:08:25',1,'2006-02-15 21:30:53'),(14152,'2005-08-21 02:23:50',2561,379,'2005-08-25 06:05:50',1,'2006-02-15 21:30:53'),(14153,'2005-08-21 02:24:33',1502,120,'2005-08-27 05:28:33',2,'2006-02-15 21:30:53'),(14154,'2005-08-21 02:30:00',951,468,'2005-08-28 01:41:00',2,'2006-02-15 21:30:53'),(14155,'2005-08-21 02:31:35',769,148,'2005-08-27 06:00:35',2,'2006-02-15 21:30:53'),(14156,'2005-08-21 02:35:16',437,147,'2005-08-27 01:32:16',2,'2006-02-15 21:30:53'),(14157,'2005-08-21 02:43:15',4471,128,'2005-08-24 02:47:15',1,'2006-02-15 21:30:53'),(14158,'2005-08-21 02:43:20',474,114,'2005-08-28 02:19:20',1,'2006-02-15 21:30:53'),(14159,'2005-08-21 02:45:58',3231,144,'2005-08-27 04:53:58',1,'2006-02-15 21:30:53'),(14160,'2006-02-14 15:16:03',2428,493,NULL,2,'2006-02-15 21:30:53'),(14161,'2005-08-21 02:51:59',2744,21,'2005-08-28 21:38:59',2,'2006-02-15 21:30:53'),(14162,'2005-08-21 02:55:34',3788,315,'2005-08-27 00:13:34',1,'2006-02-15 21:30:53'),(14163,'2005-08-21 02:56:52',1007,204,'2005-08-21 21:03:52',2,'2006-02-15 21:30:53'),(14164,'2005-08-21 02:58:02',2381,274,'2005-08-29 23:17:02',2,'2006-02-15 21:30:53'),(14165,'2005-08-21 02:59:17',4151,150,'2005-08-24 23:09:17',2,'2006-02-15 21:30:53'),(14166,'2005-08-21 02:59:31',2457,190,'2005-08-24 23:19:31',2,'2006-02-15 21:30:53'),(14167,'2005-08-21 02:59:48',1005,64,'2005-08-29 22:17:48',1,'2006-02-15 21:30:53'),(14168,'2005-08-21 03:00:03',1321,49,'2005-08-29 06:04:03',2,'2006-02-15 21:30:53'),(14169,'2005-08-21 03:00:31',3800,396,'2005-08-30 01:16:31',1,'2006-02-15 21:30:53'),(14170,'2005-08-21 03:00:39',894,259,'2005-08-27 23:07:39',1,'2006-02-15 21:30:53'),(14171,'2005-08-21 03:00:42',4179,320,'2005-08-24 00:54:42',1,'2006-02-15 21:30:53'),(14172,'2006-02-14 15:16:03',2158,450,NULL,2,'2006-02-15 21:30:53'),(14173,'2005-08-21 03:01:01',3175,152,'2005-08-22 02:40:01',1,'2006-02-15 21:30:53'),(14174,'2005-08-21 03:01:45',1862,29,'2005-08-22 07:19:45',2,'2006-02-15 21:30:53'),(14175,'2006-02-14 15:16:03',2021,452,NULL,1,'2006-02-15 21:30:53'),(14176,'2005-08-21 03:09:23',4420,556,'2005-08-26 21:26:23',1,'2006-02-15 21:30:53'),(14177,'2005-08-21 03:11:33',409,121,'2005-08-28 21:41:33',2,'2006-02-15 21:30:53'),(14178,'2005-08-21 03:13:45',2178,524,'2005-08-22 01:50:45',1,'2006-02-15 21:30:53'),(14179,'2005-08-21 03:14:27',3956,79,'2005-08-26 00:46:27',2,'2006-02-15 21:30:53'),(14180,'2005-08-21 03:16:15',796,262,'2005-08-24 22:31:15',2,'2006-02-15 21:30:53'),(14181,'2005-08-21 03:16:30',197,210,'2005-08-29 06:25:30',2,'2006-02-15 21:30:53'),(14182,'2005-08-21 03:17:10',2422,519,'2005-08-24 21:46:10',1,'2006-02-15 21:30:53'),(14183,'2005-08-21 03:24:29',1888,26,'2005-08-22 07:25:29',2,'2006-02-15 21:30:53'),(14184,'2005-08-21 03:24:50',3759,148,'2005-08-29 01:46:50',2,'2006-02-15 21:30:53'),(14185,'2005-08-21 03:28:37',3957,579,'2005-08-26 01:15:37',1,'2006-02-15 21:30:53'),(14186,'2005-08-21 03:31:07',3158,461,'2005-08-28 07:29:07',2,'2006-02-15 21:30:53'),(14187,'2005-08-21 03:32:03',4031,275,'2005-08-25 03:29:03',2,'2006-02-15 21:30:53'),(14188,'2005-08-21 03:32:04',4492,548,'2005-08-22 07:26:04',1,'2006-02-15 21:30:53'),(14189,'2005-08-21 03:32:17',2209,127,'2005-08-22 04:46:17',2,'2006-02-15 21:30:53'),(14190,'2005-08-21 03:35:21',4203,517,'2005-08-29 07:35:21',2,'2006-02-15 21:30:53'),(14191,'2005-08-21 03:35:58',301,423,'2005-08-28 00:28:58',1,'2006-02-15 21:30:53'),(14192,'2005-08-21 03:37:42',3563,26,'2005-08-28 05:31:42',2,'2006-02-15 21:30:53'),(14193,'2005-08-21 03:38:27',513,25,'2005-08-28 09:16:27',1,'2006-02-15 21:30:53'),(14194,'2005-08-21 03:40:11',2003,138,'2005-08-26 07:38:11',1,'2006-02-15 21:30:53'),(14195,'2005-08-21 03:40:35',3732,93,'2005-08-23 01:22:35',1,'2006-02-15 21:30:53'),(14196,'2005-08-21 03:40:40',4477,281,'2005-08-25 05:55:40',1,'2006-02-15 21:30:53'),(14197,'2005-08-21 03:47:25',340,469,'2005-08-30 09:15:25',2,'2006-02-15 21:30:53'),(14198,'2005-08-21 03:48:31',465,381,'2005-08-24 07:10:31',2,'2006-02-15 21:30:53'),(14199,'2005-08-21 03:48:43',658,442,'2005-08-23 04:01:43',1,'2006-02-15 21:30:53'),(14200,'2005-08-21 03:51:27',2339,349,'2005-08-29 22:00:27',1,'2006-02-15 21:30:53'),(14201,'2005-08-21 03:51:34',314,427,'2005-08-30 03:42:34',2,'2006-02-15 21:30:53'),(14202,'2005-08-21 03:51:52',1995,473,'2005-08-22 09:35:52',1,'2006-02-15 21:30:53'),(14203,'2005-08-21 03:51:52',3668,95,'2005-08-24 06:13:52',2,'2006-02-15 21:30:53'),(14204,'2006-02-14 15:16:03',4334,287,NULL,1,'2006-02-15 21:30:53'),(14205,'2005-08-21 03:57:15',315,406,'2005-08-30 08:46:15',2,'2006-02-15 21:30:53'),(14206,'2005-08-21 03:59:26',860,279,'2005-08-26 03:52:26',1,'2006-02-15 21:30:53'),(14207,'2005-08-21 04:08:19',1327,569,'2005-08-29 07:59:19',2,'2006-02-15 21:30:53'),(14208,'2005-08-21 04:09:18',4180,299,'2005-08-22 03:29:18',1,'2006-02-15 21:30:53'),(14209,'2005-08-21 04:17:56',896,472,'2005-08-27 06:57:56',1,'2006-02-15 21:30:53'),(14210,'2005-08-21 04:28:02',1867,468,'2005-08-24 02:14:02',2,'2006-02-15 21:30:53'),(14211,'2005-08-21 04:29:11',300,372,'2005-08-24 02:50:11',2,'2006-02-15 21:30:53'),(14212,'2005-08-21 04:29:26',4540,354,'2005-08-24 00:46:26',2,'2006-02-15 21:30:53'),(14213,'2005-08-21 04:30:47',382,511,'2005-08-24 23:01:47',1,'2006-02-15 21:30:53'),(14214,'2005-08-21 04:30:49',4510,198,'2005-08-26 04:42:49',1,'2006-02-15 21:30:53'),(14215,'2005-08-21 04:34:11',35,54,'2005-08-27 10:30:11',2,'2006-02-15 21:30:53'),(14216,'2006-02-14 15:16:03',3763,186,NULL,1,'2006-02-15 21:30:53'),(14217,'2005-08-21 04:37:56',2847,66,'2005-08-26 03:55:56',2,'2006-02-15 21:30:53'),(14218,'2005-08-21 04:43:59',4087,104,'2005-08-27 10:29:59',1,'2006-02-15 21:30:53'),(14219,'2006-02-14 15:16:03',3718,334,NULL,2,'2006-02-15 21:30:53'),(14220,'2006-02-14 15:16:03',2618,162,NULL,1,'2006-02-15 21:30:53'),(14221,'2005-08-21 04:49:41',3824,51,'2005-08-29 23:52:41',1,'2006-02-15 21:30:53'),(14222,'2005-08-21 04:49:48',714,7,'2005-08-25 05:34:48',2,'2006-02-15 21:30:53'),(14223,'2005-08-21 04:51:51',514,392,'2005-08-29 00:37:51',1,'2006-02-15 21:30:53'),(14224,'2005-08-21 04:53:08',3634,323,'2005-08-27 04:12:08',2,'2006-02-15 21:30:53'),(14225,'2005-08-21 04:53:37',984,4,'2005-08-25 23:39:37',2,'2006-02-15 21:30:53'),(14226,'2005-08-21 04:55:37',1793,316,'2005-08-24 04:32:37',1,'2006-02-15 21:30:53'),(14227,'2005-08-21 04:56:31',4102,277,'2005-08-22 05:04:31',2,'2006-02-15 21:30:53'),(14228,'2005-08-21 04:57:08',2016,71,'2005-08-25 00:06:08',2,'2006-02-15 21:30:53'),(14229,'2005-08-21 04:57:15',4479,186,'2005-08-26 10:00:15',1,'2006-02-15 21:30:53'),(14230,'2005-08-21 04:57:29',844,584,'2005-08-27 08:14:29',2,'2006-02-15 21:30:53'),(14231,'2005-08-21 05:04:34',1244,307,'2005-08-23 04:58:34',1,'2006-02-15 21:30:53'),(14232,'2005-08-21 05:07:02',2710,176,'2005-08-29 06:57:02',1,'2006-02-15 21:30:53'),(14233,'2005-08-21 05:07:08',2943,599,'2005-08-28 03:20:08',1,'2006-02-15 21:30:53'),(14234,'2005-08-21 05:07:12',1439,271,'2005-08-23 06:44:12',2,'2006-02-15 21:30:53'),(14235,'2005-08-21 05:08:42',125,558,'2005-08-29 23:36:42',1,'2006-02-15 21:30:53'),(14236,'2005-08-21 05:13:16',172,25,'2005-08-26 04:03:16',2,'2006-02-15 21:30:53'),(14237,'2005-08-21 05:15:00',3284,410,'2005-08-25 10:06:00',1,'2006-02-15 21:30:53'),(14238,'2005-08-21 05:16:40',3148,192,'2005-08-30 02:13:40',2,'2006-02-15 21:30:53'),(14239,'2005-08-21 05:18:57',1559,416,'2005-08-22 00:12:57',2,'2006-02-15 21:30:53'),(14240,'2005-08-21 05:19:39',3294,12,'2005-08-22 23:25:39',2,'2006-02-15 21:30:53'),(14241,'2005-08-21 05:24:55',2547,291,'2005-08-30 03:33:55',1,'2006-02-15 21:30:53'),(14242,'2005-08-21 05:25:59',1588,68,'2005-08-27 07:22:59',1,'2006-02-15 21:30:53'),(14243,'2006-02-14 15:16:03',1489,264,NULL,1,'2006-02-15 21:30:53'),(14244,'2005-08-21 05:29:55',1150,43,'2005-08-24 01:06:55',1,'2006-02-15 21:30:53'),(14245,'2005-08-21 05:30:54',975,354,'2005-08-26 07:02:54',1,'2006-02-15 21:30:53'),(14246,'2005-08-21 05:34:09',3499,120,'2005-08-26 06:12:09',1,'2006-02-15 21:30:53'),(14247,'2005-08-21 05:35:17',267,302,'2005-08-26 03:22:17',1,'2006-02-15 21:30:53'),(14248,'2005-08-21 05:35:57',725,293,'2005-08-28 05:53:57',2,'2006-02-15 21:30:53'),(14249,'2005-08-21 05:38:05',695,268,'2005-08-28 09:07:05',2,'2006-02-15 21:30:53'),(14250,'2005-08-21 05:39:35',3008,313,'2005-08-28 10:06:35',2,'2006-02-15 21:30:53'),(14251,'2005-08-21 05:42:20',139,486,'2005-08-26 06:20:20',2,'2006-02-15 21:30:53'),(14252,'2005-08-21 05:44:07',2660,13,'2005-08-29 08:53:07',1,'2006-02-15 21:30:53'),(14253,'2005-08-21 05:47:52',4246,456,'2005-08-25 04:28:52',1,'2006-02-15 21:30:53'),(14254,'2005-08-21 05:51:28',1549,589,'2005-08-29 06:05:28',2,'2006-02-15 21:30:53'),(14255,'2005-08-21 05:51:37',3125,492,'2005-08-29 10:00:37',1,'2006-02-15 21:30:53'),(14256,'2005-08-21 05:52:27',2922,331,'2005-08-29 02:10:27',2,'2006-02-15 21:30:53'),(14257,'2005-08-21 05:52:57',3830,178,'2005-08-29 03:18:57',2,'2006-02-15 21:30:53'),(14258,'2005-08-21 05:56:36',752,359,'2005-08-26 06:14:36',1,'2006-02-15 21:30:53'),(14259,'2005-08-21 06:00:22',3705,583,'2005-08-22 05:38:22',2,'2006-02-15 21:30:53'),(14260,'2005-08-21 06:01:08',2961,40,'2005-08-29 09:01:08',2,'2006-02-15 21:30:53'),(14261,'2005-08-21 06:07:24',1426,166,'2005-08-26 09:57:24',1,'2006-02-15 21:30:53'),(14262,'2005-08-21 06:08:13',1430,324,'2005-08-30 10:55:13',1,'2006-02-15 21:30:53'),(14263,'2005-08-21 06:08:15',2595,533,'2005-08-29 09:22:15',2,'2006-02-15 21:30:53'),(14264,'2005-08-21 06:18:22',3426,295,'2005-08-25 08:08:22',1,'2006-02-15 21:30:53'),(14265,'2005-08-21 06:20:14',3116,134,'2005-08-23 09:05:14',1,'2006-02-15 21:30:53'),(14266,'2005-08-21 06:20:51',3543,269,'2005-08-23 00:44:51',1,'2006-02-15 21:30:53'),(14267,'2006-02-14 15:16:03',2199,527,NULL,2,'2006-02-15 21:30:53'),(14268,'2005-08-21 06:21:24',2442,278,'2005-08-23 05:39:24',2,'2006-02-15 21:30:53'),(14269,'2005-08-21 06:22:07',531,241,'2005-08-30 00:41:07',2,'2006-02-15 21:30:53'),(14270,'2005-08-21 06:22:18',4083,171,'2005-08-27 08:04:18',1,'2006-02-15 21:30:53'),(14271,'2005-08-21 06:23:29',4506,224,'2005-08-27 04:49:29',1,'2006-02-15 21:30:53'),(14272,'2005-08-21 06:24:55',3908,243,'2005-08-28 02:25:55',1,'2006-02-15 21:30:53'),(14273,'2005-08-21 06:26:48',2640,388,'2005-08-30 10:34:48',1,'2006-02-15 21:30:53'),(14274,'2005-08-21 06:29:20',3183,405,'2005-08-26 06:25:20',2,'2006-02-15 21:30:53'),(14275,'2005-08-21 06:30:30',3238,163,'2005-08-25 12:28:30',1,'2006-02-15 21:30:53'),(14276,'2005-08-21 06:34:05',3637,318,'2005-08-28 10:13:05',2,'2006-02-15 21:30:53'),(14277,'2005-08-21 06:34:41',2652,566,'2005-08-28 10:53:41',2,'2006-02-15 21:30:53'),(14278,'2006-02-14 15:16:03',2334,557,NULL,2,'2006-02-15 21:30:53'),(14279,'2005-08-21 06:39:08',3325,387,'2005-08-29 11:01:08',2,'2006-02-15 21:30:53'),(14280,'2005-08-21 06:39:58',1561,481,'2005-08-23 04:50:58',1,'2006-02-15 21:30:53'),(14281,'2005-08-21 06:40:48',1848,166,'2005-08-26 11:42:48',2,'2006-02-15 21:30:53'),(14282,'2005-08-21 06:41:29',3107,450,'2005-08-22 12:37:29',1,'2006-02-15 21:30:53'),(14283,'2005-08-21 06:44:14',3052,253,'2005-08-24 01:01:14',1,'2006-02-15 21:30:53'),(14284,'2005-08-21 06:44:37',633,486,'2005-08-28 05:03:37',1,'2006-02-15 21:30:53'),(14285,'2005-08-21 06:50:48',402,249,'2005-08-28 11:35:48',1,'2006-02-15 21:30:53'),(14286,'2005-08-21 06:53:53',2377,558,'2005-08-27 11:37:53',2,'2006-02-15 21:30:53'),(14287,'2005-08-21 06:53:59',2426,427,'2005-08-25 03:10:59',2,'2006-02-15 21:30:53'),(14288,'2005-08-21 06:57:34',587,512,'2005-08-26 11:32:34',1,'2006-02-15 21:30:53'),(14289,'2005-08-21 06:58:49',1185,103,'2005-08-25 11:29:49',2,'2006-02-15 21:30:53'),(14290,'2005-08-21 07:02:59',790,366,'2005-08-28 02:57:59',1,'2006-02-15 21:30:53'),(14291,'2005-08-21 07:03:05',3988,56,'2005-08-26 12:56:05',2,'2006-02-15 21:30:53'),(14292,'2005-08-21 07:06:20',1959,251,'2005-08-22 01:39:20',2,'2006-02-15 21:30:53'),(14293,'2005-08-21 07:06:47',3555,364,'2005-08-22 05:07:47',2,'2006-02-15 21:30:53'),(14294,'2005-08-21 07:07:26',354,455,'2005-08-22 02:20:26',2,'2006-02-15 21:30:53'),(14295,'2005-08-21 07:09:27',2187,336,'2005-08-22 01:27:27',2,'2006-02-15 21:30:53'),(14296,'2005-08-21 07:13:23',3813,275,'2005-08-26 11:14:23',1,'2006-02-15 21:30:53'),(14297,'2005-08-21 07:13:46',1712,566,'2005-08-25 09:07:46',1,'2006-02-15 21:30:53'),(14298,'2005-08-21 07:17:10',4317,410,'2005-08-25 10:10:10',1,'2006-02-15 21:30:53'),(14299,'2005-08-21 07:18:57',4028,342,'2005-08-24 01:28:57',1,'2006-02-15 21:30:53'),(14300,'2005-08-21 07:19:37',690,382,'2005-08-25 12:06:37',2,'2006-02-15 21:30:53'),(14301,'2005-08-21 07:19:48',283,162,'2005-08-28 02:06:48',1,'2006-02-15 21:30:53'),(14302,'2005-08-21 07:19:57',1287,511,'2005-08-28 02:59:57',1,'2006-02-15 21:30:53'),(14303,'2005-08-21 07:22:43',992,475,'2005-08-24 11:52:43',1,'2006-02-15 21:30:53'),(14304,'2005-08-21 07:23:10',2650,417,'2005-08-26 11:21:10',2,'2006-02-15 21:30:53'),(14305,'2005-08-21 07:29:05',2056,58,'2005-08-27 08:18:05',1,'2006-02-15 21:30:53'),(14306,'2005-08-21 07:32:35',4027,453,'2005-08-30 05:53:35',1,'2006-02-15 21:30:53'),(14307,'2005-08-21 07:34:52',2894,328,'2005-08-29 09:45:52',1,'2006-02-15 21:30:53'),(14308,'2005-08-21 07:43:21',3478,419,'2005-08-25 02:39:21',2,'2006-02-15 21:30:53'),(14309,'2005-08-21 07:44:17',4447,468,'2005-08-30 07:23:17',2,'2006-02-15 21:30:53'),(14310,'2005-08-21 07:44:32',95,177,'2005-08-22 09:02:32',1,'2006-02-15 21:30:53'),(14311,'2005-08-21 07:45:47',1761,69,'2005-08-27 02:23:47',2,'2006-02-15 21:30:53'),(14312,'2005-08-21 07:48:34',1090,238,'2005-08-23 04:45:34',1,'2006-02-15 21:30:53'),(14313,'2005-08-21 07:49:53',3384,468,'2005-08-30 05:52:53',2,'2006-02-15 21:30:53'),(14314,'2005-08-21 07:50:14',4115,178,'2005-08-24 10:47:14',2,'2006-02-15 21:30:53'),(14315,'2005-08-21 07:56:39',1164,459,'2005-08-27 04:52:39',1,'2006-02-15 21:30:53'),(14316,'2005-08-21 07:59:47',386,64,'2005-08-23 02:20:47',2,'2006-02-15 21:30:53'),(14317,'2005-08-21 08:00:40',2090,471,'2005-08-27 06:52:40',1,'2006-02-15 21:30:53'),(14318,'2006-02-14 15:16:03',1042,508,NULL,2,'2006-02-15 21:30:53'),(14319,'2005-08-21 08:00:55',4480,410,'2005-08-26 05:04:55',1,'2006-02-15 21:30:53'),(14320,'2005-08-21 08:04:40',3121,199,'2005-08-22 02:09:40',1,'2006-02-15 21:30:53'),(14321,'2005-08-21 08:05:12',967,236,'2005-08-23 02:17:12',1,'2006-02-15 21:30:53'),(14322,'2005-08-21 08:06:30',2818,221,'2005-08-29 10:12:30',2,'2006-02-15 21:30:53'),(14323,'2005-08-21 08:08:43',1257,97,'2005-08-25 10:44:43',1,'2006-02-15 21:30:53'),(14324,'2005-08-21 08:10:56',1361,155,'2005-08-30 12:09:56',1,'2006-02-15 21:30:53'),(14325,'2005-08-21 08:15:38',4432,313,'2005-08-23 08:08:38',2,'2006-02-15 21:30:53'),(14326,'2005-08-21 08:15:41',1052,17,'2005-08-27 05:22:41',1,'2006-02-15 21:30:53'),(14327,'2005-08-21 08:18:18',553,457,'2005-08-30 02:21:18',2,'2006-02-15 21:30:53'),(14328,'2005-08-21 08:18:20',3194,489,'2005-08-25 03:05:20',2,'2006-02-15 21:30:53'),(14329,'2005-08-21 08:22:56',3544,6,'2005-08-28 02:22:56',2,'2006-02-15 21:30:53'),(14330,'2005-08-21 08:29:20',763,84,'2005-08-30 03:59:20',2,'2006-02-15 21:30:53'),(14331,'2005-08-21 08:29:38',3128,372,'2005-08-29 13:18:38',2,'2006-02-15 21:30:53'),(14332,'2005-08-21 08:30:43',1388,496,'2005-08-29 10:51:43',1,'2006-02-15 21:30:53'),(14333,'2005-08-21 08:31:03',2976,93,'2005-08-28 03:39:03',2,'2006-02-15 21:30:53'),(14334,'2005-08-21 08:32:32',1448,595,'2005-08-25 02:53:32',2,'2006-02-15 21:30:53'),(14335,'2005-08-21 08:33:07',2610,263,'2005-08-26 14:16:07',1,'2006-02-15 21:30:53'),(14336,'2005-08-21 08:33:42',3166,362,'2005-08-23 03:27:42',1,'2006-02-15 21:30:53'),(14337,'2005-08-21 08:34:26',3529,506,'2005-08-24 11:31:26',1,'2006-02-15 21:30:53'),(14338,'2005-08-21 08:36:03',1789,205,'2005-08-24 12:31:03',2,'2006-02-15 21:30:53'),(14339,'2005-08-21 08:37:15',1744,30,'2005-08-26 03:37:15',2,'2006-02-15 21:30:53'),(14340,'2005-08-21 08:38:21',2181,230,'2005-08-25 09:25:21',1,'2006-02-15 21:30:53'),(14341,'2005-08-21 08:38:24',4498,560,'2005-08-26 12:36:24',1,'2006-02-15 21:30:53'),(14342,'2005-08-21 08:39:26',2749,559,'2005-08-23 11:40:26',2,'2006-02-15 21:30:53'),(14343,'2005-08-21 08:40:21',3769,238,'2005-08-29 03:06:21',1,'2006-02-15 21:30:53'),(14344,'2005-08-21 08:40:56',1562,341,'2005-08-27 12:40:56',1,'2006-02-15 21:30:53'),(14345,'2005-08-21 08:41:15',1726,598,'2005-08-24 11:59:15',1,'2006-02-15 21:30:53'),(14346,'2005-08-21 08:42:26',109,17,'2005-08-23 09:18:26',2,'2006-02-15 21:30:53'),(14347,'2005-08-21 08:42:31',3862,214,'2005-08-25 07:11:31',2,'2006-02-15 21:30:53'),(14348,'2005-08-21 08:54:26',885,496,'2005-08-24 02:55:26',2,'2006-02-15 21:30:53'),(14349,'2005-08-21 08:54:53',96,119,'2005-08-30 14:27:53',1,'2006-02-15 21:30:53'),(14350,'2005-08-21 08:58:38',3174,222,'2005-08-30 03:29:38',2,'2006-02-15 21:30:53'),(14351,'2005-08-21 09:04:20',2037,66,'2005-08-25 05:27:20',1,'2006-02-15 21:30:53'),(14352,'2005-08-21 09:06:29',1224,527,'2005-08-28 13:36:29',1,'2006-02-15 21:30:53'),(14353,'2005-08-21 09:07:50',1612,129,'2005-08-22 10:31:50',2,'2006-02-15 21:30:53'),(14354,'2005-08-21 09:08:14',1137,382,'2005-08-30 05:27:14',1,'2006-02-15 21:30:53'),(14355,'2005-08-21 09:08:29',649,271,'2005-08-27 10:08:29',2,'2006-02-15 21:30:53'),(14356,'2005-08-21 09:08:51',3169,65,'2005-08-24 04:36:51',2,'2006-02-15 21:30:53'),(14357,'2005-08-21 09:13:09',2906,233,'2005-08-22 05:41:09',2,'2006-02-15 21:30:53'),(14358,'2005-08-21 09:14:28',861,112,'2005-08-24 05:05:28',1,'2006-02-15 21:30:53'),(14359,'2005-08-21 09:16:19',1841,401,'2005-08-22 09:28:19',1,'2006-02-15 21:30:53'),(14360,'2005-08-21 09:16:40',2677,246,'2005-08-29 11:43:40',2,'2006-02-15 21:30:53'),(14361,'2006-02-14 15:16:03',1231,191,NULL,2,'2006-02-15 21:30:53'),(14362,'2005-08-21 09:19:49',1992,312,'2005-08-26 11:06:49',1,'2006-02-15 21:30:53'),(14363,'2005-08-21 09:20:03',2579,560,'2005-08-23 14:26:03',1,'2006-02-15 21:30:53'),(14364,'2005-08-21 09:25:11',3513,236,'2005-08-29 09:04:11',1,'2006-02-15 21:30:53'),(14365,'2005-08-21 09:25:13',618,457,'2005-08-27 11:48:13',1,'2006-02-15 21:30:53'),(14366,'2005-08-21 09:31:39',4011,524,'2005-08-26 11:55:39',2,'2006-02-15 21:30:53'),(14367,'2005-08-21 09:31:44',870,244,'2005-08-26 03:54:44',2,'2006-02-15 21:30:53'),(14368,'2005-08-21 09:31:47',2063,351,'2005-08-30 04:17:47',1,'2006-02-15 21:30:53'),(14369,'2005-08-21 09:33:44',1636,392,'2005-08-25 08:56:44',1,'2006-02-15 21:30:53'),(14370,'2005-08-21 09:35:14',3520,161,'2005-08-27 05:21:14',2,'2006-02-15 21:30:53'),(14371,'2005-08-21 09:37:16',2197,221,'2005-08-27 13:50:16',2,'2006-02-15 21:30:53'),(14372,'2005-08-21 09:39:50',1953,520,'2005-08-28 13:36:50',1,'2006-02-15 21:30:53'),(14373,'2005-08-21 09:44:53',4433,268,'2005-08-25 15:37:53',1,'2006-02-15 21:30:53'),(14374,'2006-02-14 15:16:03',236,213,NULL,2,'2006-02-15 21:30:53'),(14375,'2005-08-21 09:46:35',2507,550,'2005-08-26 10:24:35',2,'2006-02-15 21:30:53'),(14376,'2005-08-21 09:48:56',1936,582,'2005-08-22 12:15:56',2,'2006-02-15 21:30:53'),(14377,'2005-08-21 09:49:28',1325,6,'2005-08-29 13:34:28',1,'2006-02-15 21:30:53'),(14378,'2005-08-21 09:50:02',810,515,'2005-08-30 09:07:02',1,'2006-02-15 21:30:53'),(14379,'2005-08-21 09:53:03',3062,136,'2005-08-24 14:32:03',1,'2006-02-15 21:30:53'),(14380,'2005-08-21 09:53:52',1523,198,'2005-08-25 05:03:52',2,'2006-02-15 21:30:53'),(14381,'2005-08-21 09:55:47',811,391,'2005-08-25 08:23:47',1,'2006-02-15 21:30:53'),(14382,'2005-08-21 10:01:03',4119,119,'2005-08-22 13:21:03',2,'2006-02-15 21:30:53'),(14383,'2005-08-21 10:02:05',1941,482,'2005-08-24 12:21:05',2,'2006-02-15 21:30:53'),(14384,'2005-08-21 10:02:37',2429,371,'2005-08-26 08:20:37',1,'2006-02-15 21:30:53'),(14385,'2005-08-21 10:02:55',4356,317,'2005-08-25 07:19:55',2,'2006-02-15 21:30:53'),(14386,'2005-08-21 10:06:34',3402,514,'2005-08-25 14:19:34',1,'2006-02-15 21:30:53'),(14387,'2005-08-21 10:10:01',1286,295,'2005-08-28 14:16:01',2,'2006-02-15 21:30:53'),(14388,'2005-08-21 10:15:13',1078,274,'2005-08-30 13:41:13',2,'2006-02-15 21:30:53'),(14389,'2005-08-21 10:15:20',2718,145,'2005-08-27 05:39:20',1,'2006-02-15 21:30:53'),(14390,'2005-08-21 10:15:38',3951,366,'2005-08-28 05:50:38',2,'2006-02-15 21:30:53'),(14391,'2005-08-21 10:16:27',3117,205,'2005-08-23 07:00:27',2,'2006-02-15 21:30:53'),(14392,'2005-08-21 10:19:25',847,586,'2005-08-28 15:57:25',2,'2006-02-15 21:30:53'),(14393,'2005-08-21 10:22:51',3937,368,'2005-08-29 08:28:51',1,'2006-02-15 21:30:53'),(14394,'2005-08-21 10:23:10',4555,118,'2005-08-28 09:33:10',1,'2006-02-15 21:30:53'),(14395,'2005-08-21 10:24:00',632,506,'2005-08-28 12:23:00',2,'2006-02-15 21:30:53'),(14396,'2005-08-21 10:24:54',3855,353,'2005-08-22 04:49:54',2,'2006-02-15 21:30:53'),(14397,'2005-08-21 10:25:56',3883,47,'2005-08-24 07:48:56',1,'2006-02-15 21:30:53'),(14398,'2005-08-21 10:27:21',357,505,'2005-08-23 10:46:21',2,'2006-02-15 21:30:53'),(14399,'2005-08-21 10:33:23',3582,188,'2005-08-27 08:00:23',1,'2006-02-15 21:30:53'),(14400,'2005-08-21 10:33:45',3891,569,'2005-08-26 12:05:45',1,'2006-02-15 21:30:53'),(14401,'2005-08-21 10:36:20',3468,407,'2005-08-30 06:45:20',1,'2006-02-15 21:30:53'),(14402,'2005-08-21 10:38:17',749,467,'2005-08-27 08:36:17',2,'2006-02-15 21:30:53'),(14403,'2005-08-21 10:40:34',3581,297,'2005-08-29 11:29:34',1,'2006-02-15 21:30:53'),(14404,'2005-08-21 10:43:04',3660,192,'2005-08-30 10:00:04',1,'2006-02-15 21:30:53'),(14405,'2005-08-21 10:45:01',2777,470,'2005-08-30 04:48:01',2,'2006-02-15 21:30:53'),(14406,'2005-08-21 10:46:35',2741,181,'2005-08-28 15:55:35',1,'2006-02-15 21:30:53'),(14407,'2005-08-21 10:46:51',2403,500,'2005-08-25 09:28:51',2,'2006-02-15 21:30:53'),(14408,'2005-08-21 10:47:24',222,593,'2005-08-27 08:18:24',1,'2006-02-15 21:30:53'),(14409,'2005-08-21 10:53:35',1161,314,'2005-08-25 10:40:35',2,'2006-02-15 21:30:53'),(14410,'2005-08-21 10:54:49',839,196,'2005-08-26 08:28:49',2,'2006-02-15 21:30:53'),(14411,'2005-08-21 10:54:57',2125,502,'2005-08-22 13:17:57',2,'2006-02-15 21:30:53'),(14412,'2005-08-21 11:02:09',212,121,'2005-08-29 06:44:09',1,'2006-02-15 21:30:53'),(14413,'2005-08-21 11:06:33',50,367,'2005-08-29 16:10:33',1,'2006-02-15 21:30:53'),(14414,'2005-08-21 11:08:17',1757,515,'2005-08-23 08:37:17',2,'2006-02-15 21:30:53'),(14415,'2006-02-14 15:16:03',2670,561,NULL,2,'2006-02-15 21:30:53'),(14416,'2005-08-21 11:11:46',3002,384,'2005-08-25 12:33:46',1,'2006-02-15 21:30:53'),(14417,'2005-08-21 11:13:35',1768,596,'2005-08-25 11:27:35',1,'2006-02-15 21:30:53'),(14418,'2005-08-21 11:14:26',89,442,'2005-08-28 08:34:26',2,'2006-02-15 21:30:53'),(14419,'2005-08-21 11:15:46',3146,221,'2005-08-30 16:37:46',1,'2006-02-15 21:30:53'),(14420,'2005-08-21 11:16:15',2495,551,'2005-08-24 06:06:15',2,'2006-02-15 21:30:53'),(14421,'2005-08-21 11:20:21',4402,406,'2005-08-24 06:26:21',1,'2006-02-15 21:30:53'),(14422,'2005-08-21 11:21:46',1382,361,'2005-08-25 13:15:46',1,'2006-02-15 21:30:53'),(14423,'2005-08-21 11:23:59',2873,521,'2005-08-26 11:52:59',2,'2006-02-15 21:30:53'),(14424,'2005-08-21 11:24:11',2535,489,'2005-08-29 13:13:11',2,'2006-02-15 21:30:53'),(14425,'2006-02-14 15:16:03',2752,560,NULL,2,'2006-02-15 21:30:53'),(14426,'2006-02-14 15:16:03',2902,315,NULL,1,'2006-02-15 21:30:53'),(14427,'2005-08-21 11:26:06',2353,163,'2005-08-27 10:39:06',1,'2006-02-15 21:30:53'),(14428,'2005-08-21 11:27:07',1614,458,'2005-08-29 09:50:07',1,'2006-02-15 21:30:53'),(14429,'2005-08-21 11:29:43',2513,66,'2005-08-24 12:05:43',1,'2006-02-15 21:30:53'),(14430,'2005-08-21 11:31:11',2623,5,'2005-08-26 06:29:11',1,'2006-02-15 21:30:53'),(14431,'2005-08-21 11:31:15',1572,106,'2005-08-26 11:22:15',2,'2006-02-15 21:30:53'),(14432,'2005-08-21 11:36:15',2294,138,'2005-08-24 08:02:15',2,'2006-02-15 21:30:53'),(14433,'2005-08-21 11:36:34',732,401,'2005-08-26 08:51:34',1,'2006-02-15 21:30:53'),(14434,'2005-08-21 11:40:46',2085,549,'2005-08-24 05:50:46',1,'2006-02-15 21:30:53'),(14435,'2005-08-21 11:44:37',2919,169,'2005-08-24 08:04:37',1,'2006-02-15 21:30:53'),(14436,'2005-08-21 11:48:27',3473,560,'2005-08-25 15:49:27',2,'2006-02-15 21:30:53'),(14437,'2005-08-21 11:48:32',1504,136,'2005-08-25 11:06:32',2,'2006-02-15 21:30:53'),(14438,'2005-08-21 11:51:10',1621,392,'2005-08-28 17:10:10',1,'2006-02-15 21:30:53'),(14439,'2005-08-21 11:52:41',3903,564,'2005-08-30 10:36:41',1,'2006-02-15 21:30:53'),(14440,'2005-08-21 11:59:04',3495,194,'2005-08-23 10:10:04',1,'2006-02-15 21:30:53'),(14441,'2005-08-21 11:59:38',1210,260,'2005-08-26 11:17:38',2,'2006-02-15 21:30:53'),(14442,'2005-08-21 12:00:21',122,205,'2005-08-23 17:00:21',2,'2006-02-15 21:30:53'),(14443,'2005-08-21 12:06:32',376,447,'2005-08-29 13:44:32',2,'2006-02-15 21:30:53'),(14444,'2005-08-21 12:07:25',2211,225,'2005-08-28 08:36:25',2,'2006-02-15 21:30:53'),(14445,'2005-08-21 12:07:42',3186,256,'2005-08-22 17:51:42',2,'2006-02-15 21:30:53'),(14446,'2005-08-21 12:10:41',4367,21,'2005-08-26 14:42:41',1,'2006-02-15 21:30:53'),(14447,'2005-08-21 12:12:05',1889,584,'2005-08-27 14:47:05',2,'2006-02-15 21:30:53'),(14448,'2005-08-21 12:13:10',1937,263,'2005-08-30 08:46:10',1,'2006-02-15 21:30:53'),(14449,'2005-08-21 12:13:18',653,529,'2005-08-27 15:41:18',2,'2006-02-15 21:30:53'),(14450,'2005-08-21 12:21:25',1194,48,'2005-08-26 14:35:25',2,'2006-02-15 21:30:53'),(14451,'2005-08-21 12:21:44',3967,467,'2005-08-22 15:07:44',2,'2006-02-15 21:30:53'),(14452,'2005-08-21 12:23:20',4231,325,'2005-08-27 06:26:20',1,'2006-02-15 21:30:53'),(14453,'2005-08-21 12:33:34',3312,237,'2005-08-27 11:10:34',1,'2006-02-15 21:30:53'),(14454,'2005-08-21 12:35:49',2475,150,'2005-08-22 16:28:49',2,'2006-02-15 21:30:53'),(14455,'2005-08-21 12:36:11',3442,68,'2005-08-27 08:12:11',2,'2006-02-15 21:30:53'),(14456,'2005-08-21 12:38:09',2520,125,'2005-08-26 08:29:09',1,'2006-02-15 21:30:53'),(14457,'2005-08-21 12:47:38',4288,340,'2005-08-25 13:07:38',1,'2006-02-15 21:30:53'),(14458,'2005-08-21 12:47:53',1769,256,'2005-08-30 17:09:53',2,'2006-02-15 21:30:53'),(14459,'2005-08-21 12:48:08',1532,98,'2005-08-27 10:50:08',2,'2006-02-15 21:30:53'),(14460,'2005-08-21 12:48:48',4137,120,'2005-08-30 16:34:48',2,'2006-02-15 21:30:53'),(14461,'2005-08-21 12:50:33',371,42,'2005-08-30 13:35:33',1,'2006-02-15 21:30:53'),(14462,'2005-08-21 12:50:57',2201,96,'2005-08-27 10:42:57',2,'2006-02-15 21:30:53'),(14463,'2005-08-21 12:51:49',1403,365,'2005-08-29 12:17:49',1,'2006-02-15 21:30:53'),(14464,'2005-08-21 12:52:54',2310,121,'2005-08-25 16:42:54',1,'2006-02-15 21:30:53'),(14465,'2005-08-21 12:54:22',4206,262,'2005-08-28 10:46:22',2,'2006-02-15 21:30:53'),(14466,'2005-08-21 13:03:13',923,442,'2005-08-22 15:19:13',2,'2006-02-15 21:30:53'),(14467,'2005-08-21 13:03:33',1498,522,'2005-08-28 15:28:33',1,'2006-02-15 21:30:53'),(14468,'2005-08-21 13:07:10',4168,224,'2005-08-30 19:05:10',2,'2006-02-15 21:30:53'),(14469,'2005-08-21 13:07:24',1957,554,'2005-08-24 10:37:24',1,'2006-02-15 21:30:53'),(14470,'2005-08-21 13:09:41',3899,379,'2005-08-23 10:20:41',2,'2006-02-15 21:30:53'),(14471,'2005-08-21 13:10:40',1254,395,'2005-08-26 16:49:40',1,'2006-02-15 21:30:53'),(14472,'2005-08-21 13:13:57',4097,184,'2005-08-23 14:04:57',2,'2006-02-15 21:30:53'),(14473,'2005-08-21 13:19:03',2747,298,'2005-08-23 15:12:03',1,'2006-02-15 21:30:53'),(14474,'2005-08-21 13:22:48',2632,294,'2005-08-27 14:13:48',2,'2006-02-15 21:30:53'),(14475,'2005-08-21 13:24:32',3164,2,'2005-08-27 08:59:32',2,'2006-02-15 21:30:53'),(14476,'2005-08-21 13:31:07',2821,101,'2005-08-23 17:06:07',1,'2006-02-15 21:30:53'),(14477,'2005-08-21 13:32:38',1564,126,'2005-08-25 18:02:38',2,'2006-02-15 21:30:53'),(14478,'2005-08-21 13:33:28',2990,231,'2005-08-25 13:33:28',2,'2006-02-15 21:30:53'),(14479,'2005-08-21 13:35:54',2235,324,'2005-08-29 12:12:54',2,'2006-02-15 21:30:53'),(14480,'2005-08-21 13:36:40',229,411,'2005-08-26 08:39:40',1,'2006-02-15 21:30:53'),(14481,'2005-08-21 13:41:14',4099,367,'2005-08-30 07:53:14',2,'2006-02-15 21:30:53'),(14482,'2005-08-21 13:42:45',2765,23,'2005-08-27 11:55:45',1,'2006-02-15 21:30:53'),(14483,'2005-08-21 13:43:59',37,275,'2005-08-28 16:38:59',2,'2006-02-15 21:30:53'),(14484,'2005-08-21 13:47:29',3714,418,'2005-08-23 18:25:29',1,'2006-02-15 21:30:53'),(14485,'2005-08-21 13:52:07',1637,241,'2005-08-30 13:06:07',2,'2006-02-15 21:30:53'),(14486,'2005-08-21 13:52:54',3119,138,'2005-08-23 07:58:54',1,'2006-02-15 21:30:53'),(14487,'2005-08-21 13:53:33',2578,526,'2005-08-29 19:32:33',1,'2006-02-15 21:30:53'),(14488,'2006-02-14 15:16:03',4202,75,NULL,2,'2006-02-15 21:30:53'),(14489,'2005-08-21 13:53:59',2312,9,'2005-08-30 15:45:59',2,'2006-02-15 21:30:53'),(14490,'2005-08-21 13:54:15',1771,205,'2005-08-28 19:08:15',2,'2006-02-15 21:30:53'),(14491,'2005-08-21 13:55:39',2072,226,'2005-08-29 17:51:39',1,'2006-02-15 21:30:53'),(14492,'2005-08-21 13:59:08',1591,266,'2005-08-23 11:09:08',1,'2006-02-15 21:30:53'),(14493,'2005-08-21 14:01:44',2590,389,'2005-08-28 17:20:44',1,'2006-02-15 21:30:53'),(14494,'2005-08-21 14:02:50',169,5,'2005-08-22 16:45:50',2,'2006-02-15 21:30:53'),(14495,'2005-08-21 14:04:39',3215,429,'2005-08-22 16:53:39',2,'2006-02-15 21:30:53'),(14496,'2005-08-21 14:07:35',2185,223,'2005-08-24 12:31:35',1,'2006-02-15 21:30:53'),(14497,'2005-08-21 14:09:47',3240,254,'2005-08-22 11:10:47',2,'2006-02-15 21:30:53'),(14498,'2005-08-21 14:10:44',3971,544,'2005-08-23 08:29:44',1,'2006-02-15 21:30:53'),(14499,'2005-08-21 14:11:19',4109,292,'2005-08-23 16:10:19',2,'2006-02-15 21:30:53'),(14500,'2005-08-21 14:11:30',2024,451,'2005-08-27 12:19:30',1,'2006-02-15 21:30:53'),(14501,'2005-08-21 14:14:38',3588,576,'2005-08-25 17:58:38',1,'2006-02-15 21:30:53'),(14502,'2005-08-21 14:22:28',2986,378,'2005-08-23 10:40:28',1,'2006-02-15 21:30:53'),(14503,'2006-02-14 15:16:03',2144,188,NULL,1,'2006-02-15 21:30:53'),(14504,'2005-08-21 14:23:01',4536,312,'2005-08-27 13:56:01',1,'2006-02-15 21:30:53'),(14505,'2005-08-21 14:26:28',2172,203,'2005-08-29 17:34:28',1,'2006-02-15 21:30:53'),(14506,'2005-08-21 14:32:27',4493,537,'2005-08-24 19:02:27',2,'2006-02-15 21:30:53'),(14507,'2005-08-21 14:32:45',1969,175,'2005-08-28 09:50:45',2,'2006-02-15 21:30:53'),(14508,'2005-08-21 14:33:58',703,396,'2005-08-27 10:45:58',2,'2006-02-15 21:30:53'),(14509,'2005-08-21 14:39:58',541,520,'2005-08-26 13:19:58',1,'2006-02-15 21:30:53'),(14510,'2005-08-21 14:44:41',1868,547,'2005-08-30 20:19:41',1,'2006-02-15 21:30:53'),(14511,'2005-08-21 14:45:34',4452,16,'2005-08-28 10:36:34',2,'2006-02-15 21:30:53'),(14512,'2005-08-21 14:47:09',579,51,'2005-08-24 18:10:09',2,'2006-02-15 21:30:53'),(14513,'2005-08-21 14:51:35',4265,185,'2005-08-24 13:24:35',2,'2006-02-15 21:30:53'),(14514,'2005-08-21 14:51:52',1259,295,'2005-08-30 10:40:52',2,'2006-02-15 21:30:53'),(14515,'2005-08-21 14:52:14',2215,242,'2005-08-27 10:27:14',1,'2006-02-15 21:30:53'),(14516,'2006-02-14 15:16:03',713,457,NULL,2,'2006-02-15 21:30:53'),(14517,'2005-08-21 14:57:03',3568,311,'2005-08-24 13:52:03',2,'2006-02-15 21:30:53'),(14518,'2005-08-21 14:58:58',2734,82,'2005-08-24 13:19:58',2,'2006-02-15 21:30:53'),(14519,'2005-08-21 14:59:29',1541,403,'2005-08-22 11:48:29',2,'2006-02-15 21:30:53'),(14520,'2005-08-21 15:00:49',4533,150,'2005-08-30 19:04:49',1,'2006-02-15 21:30:53'),(14521,'2005-08-21 15:01:32',1538,200,'2005-08-28 19:12:32',1,'2006-02-15 21:30:53'),(14522,'2005-08-21 15:01:34',2101,535,'2005-08-25 16:37:34',1,'2006-02-15 21:30:53'),(14523,'2005-08-21 15:03:45',345,433,'2005-08-22 18:06:45',2,'2006-02-15 21:30:53'),(14524,'2005-08-21 15:05:27',4409,374,'2005-08-29 12:07:27',2,'2006-02-15 21:30:53'),(14525,'2005-08-21 15:06:49',3020,420,'2005-08-22 16:30:49',1,'2006-02-15 21:30:53'),(14526,'2006-02-14 15:16:03',1799,534,NULL,1,'2006-02-15 21:30:53'),(14527,'2005-08-21 15:07:42',3496,232,'2005-08-23 12:31:42',1,'2006-02-15 21:30:53'),(14528,'2005-08-21 15:08:05',4305,46,'2005-08-26 15:58:05',2,'2006-02-15 21:30:53'),(14529,'2005-08-21 15:08:31',1774,380,'2005-08-29 17:15:31',1,'2006-02-15 21:30:53'),(14530,'2005-08-21 15:10:50',1905,77,'2005-08-26 09:20:50',2,'2006-02-15 21:30:53'),(14531,'2006-02-14 15:16:03',4296,568,NULL,2,'2006-02-15 21:30:53'),(14532,'2005-08-21 15:15:03',2057,37,'2005-08-25 17:41:03',2,'2006-02-15 21:30:53'),(14533,'2005-08-21 15:15:19',2202,586,'2005-08-26 12:47:19',1,'2006-02-15 21:30:53'),(14534,'2005-08-21 15:16:29',2514,56,'2005-08-26 16:18:29',1,'2006-02-15 21:30:53'),(14535,'2005-08-21 15:22:37',530,412,'2005-08-29 19:23:37',2,'2006-02-15 21:30:53'),(14536,'2005-08-21 15:22:50',2615,48,'2005-08-27 17:03:50',1,'2006-02-15 21:30:53'),(14537,'2005-08-21 15:24:24',3755,405,'2005-08-23 17:14:24',2,'2006-02-15 21:30:53'),(14538,'2005-08-21 15:28:15',3348,471,'2005-08-22 19:55:15',2,'2006-02-15 21:30:53'),(14539,'2005-08-21 15:29:47',3340,41,'2005-08-28 19:01:47',1,'2006-02-15 21:30:53'),(14540,'2005-08-21 15:34:23',2362,28,'2005-08-27 11:51:23',2,'2006-02-15 21:30:53'),(14541,'2005-08-21 15:34:32',1275,576,'2005-08-25 13:18:32',1,'2006-02-15 21:30:53'),(14542,'2005-08-21 15:36:34',1247,101,'2005-08-27 20:24:34',2,'2006-02-15 21:30:53'),(14543,'2005-08-21 15:39:01',709,579,'2005-08-28 09:47:01',1,'2006-02-15 21:30:53'),(14544,'2005-08-21 15:41:01',2445,589,'2005-08-24 15:20:01',1,'2006-02-15 21:30:53'),(14545,'2005-08-21 15:44:23',2459,13,'2005-08-29 20:09:23',2,'2006-02-15 21:30:53'),(14546,'2005-08-21 15:50:50',1515,466,'2005-08-23 11:37:50',2,'2006-02-15 21:30:53'),(14547,'2005-08-21 15:51:38',1172,265,'2005-08-26 15:35:38',1,'2006-02-15 21:30:53'),(14548,'2005-08-21 15:53:52',226,299,'2005-08-25 15:39:52',2,'2006-02-15 21:30:53'),(14549,'2005-08-21 15:54:21',4117,155,'2005-08-22 17:22:21',1,'2006-02-15 21:30:53'),(14550,'2005-08-21 15:56:39',2814,473,'2005-08-23 21:40:39',1,'2006-02-15 21:30:53'),(14551,'2005-08-21 15:57:25',496,521,'2005-08-28 11:10:25',2,'2006-02-15 21:30:53'),(14552,'2005-08-21 15:59:27',1991,477,'2005-08-27 11:46:27',1,'2006-02-15 21:30:53'),(14553,'2005-08-21 15:59:40',3160,434,'2005-08-23 11:54:40',2,'2006-02-15 21:30:53'),(14554,'2005-08-21 16:03:01',31,38,'2005-08-26 13:09:01',2,'2006-02-15 21:30:53'),(14555,'2005-08-21 16:03:02',1926,440,'2005-08-23 14:18:02',1,'2006-02-15 21:30:53'),(14556,'2005-08-21 16:03:27',475,265,'2005-08-29 15:49:27',1,'2006-02-15 21:30:53'),(14557,'2005-08-21 16:05:11',483,490,'2005-08-27 16:37:11',1,'2006-02-15 21:30:53'),(14558,'2005-08-21 16:10:50',3958,273,'2005-08-28 16:36:50',2,'2006-02-15 21:30:53'),(14559,'2005-08-21 16:11:35',3842,433,'2005-08-30 15:26:35',1,'2006-02-15 21:30:53'),(14560,'2005-08-21 16:13:47',1616,579,'2005-08-26 15:19:47',1,'2006-02-15 21:30:53'),(14561,'2005-08-21 16:20:43',2498,443,'2005-08-27 16:48:43',1,'2006-02-15 21:30:53'),(14562,'2005-08-21 16:22:59',3501,107,'2005-08-22 21:15:59',1,'2006-02-15 21:30:53'),(14563,'2005-08-21 16:23:53',3984,212,'2005-08-25 11:30:53',2,'2006-02-15 21:30:53'),(14564,'2005-08-21 16:24:43',3250,22,'2005-08-26 16:58:43',1,'2006-02-15 21:30:53'),(14565,'2005-08-21 16:24:45',4160,250,'2005-08-25 14:42:45',1,'2006-02-15 21:30:53'),(14566,'2005-08-21 16:25:05',84,87,'2005-08-26 10:31:05',1,'2006-02-15 21:30:53'),(14567,'2005-08-21 16:27:25',3805,214,'2005-08-26 10:47:25',1,'2006-02-15 21:30:53'),(14568,'2005-08-21 16:30:48',3331,582,'2005-08-22 13:49:48',1,'2006-02-15 21:30:53'),(14569,'2005-08-21 16:31:22',884,15,'2005-08-25 21:27:22',2,'2006-02-15 21:30:53'),(14570,'2005-08-21 16:32:32',955,32,'2005-08-30 12:03:32',2,'2006-02-15 21:30:53'),(14571,'2005-08-21 16:40:26',2218,296,'2005-08-29 17:10:26',1,'2006-02-15 21:30:53'),(14572,'2005-08-21 16:44:31',1397,538,'2005-08-26 16:35:31',2,'2006-02-15 21:30:53'),(14573,'2005-08-21 16:44:32',2423,240,'2005-08-23 14:01:32',2,'2006-02-15 21:30:53'),(14574,'2005-08-21 16:50:34',1611,62,'2005-08-26 14:24:34',2,'2006-02-15 21:30:53'),(14575,'2005-08-21 16:51:34',3752,159,'2005-08-30 20:13:34',2,'2006-02-15 21:30:53'),(14576,'2005-08-21 16:52:03',1189,45,'2005-08-28 19:43:03',2,'2006-02-15 21:30:53'),(14577,'2005-08-21 16:52:29',1965,126,'2005-08-26 12:30:29',1,'2006-02-15 21:30:53'),(14578,'2005-08-21 16:53:38',3141,389,'2005-08-28 20:36:38',2,'2006-02-15 21:30:53'),(14579,'2005-08-21 16:54:47',1205,260,'2005-08-28 12:35:47',1,'2006-02-15 21:30:53'),(14580,'2005-08-21 16:56:39',1440,448,'2005-08-28 15:25:39',1,'2006-02-15 21:30:53'),(14581,'2005-08-21 17:07:08',751,243,'2005-08-26 16:02:08',1,'2006-02-15 21:30:53'),(14582,'2005-08-21 17:08:33',1004,438,'2005-08-29 18:04:33',2,'2006-02-15 21:30:53'),(14583,'2005-08-21 17:11:47',1203,455,'2005-08-24 16:16:47',2,'2006-02-15 21:30:53'),(14584,'2005-08-21 17:15:33',2617,481,'2005-08-24 20:24:33',2,'2006-02-15 21:30:53'),(14585,'2005-08-21 17:18:33',82,30,'2005-08-26 11:36:33',1,'2006-02-15 21:30:53'),(14586,'2005-08-21 17:19:09',3094,182,'2005-08-26 17:00:09',1,'2006-02-15 21:30:53'),(14587,'2005-08-21 17:20:55',2329,250,'2005-08-26 17:17:55',1,'2006-02-15 21:30:53'),(14588,'2005-08-21 17:25:53',1350,219,'2005-08-28 21:47:53',2,'2006-02-15 21:30:53'),(14589,'2005-08-21 17:28:55',2810,179,'2005-08-22 23:06:55',1,'2006-02-15 21:30:53'),(14590,'2005-08-21 17:29:10',2633,526,'2005-08-28 20:15:10',1,'2006-02-15 21:30:53'),(14591,'2005-08-21 17:30:09',3410,538,'2005-08-24 12:27:09',1,'2006-02-15 21:30:53'),(14592,'2005-08-21 17:30:17',2681,563,'2005-08-22 20:06:17',2,'2006-02-15 21:30:53'),(14593,'2005-08-21 17:33:18',1399,564,'2005-08-24 22:11:18',1,'2006-02-15 21:30:53'),(14594,'2005-08-21 17:34:24',2978,62,'2005-08-26 22:04:24',2,'2006-02-15 21:30:53'),(14595,'2005-08-21 17:35:17',1879,118,'2005-08-27 12:11:17',1,'2006-02-15 21:30:53'),(14596,'2005-08-21 17:38:37',2010,472,'2005-08-30 20:28:37',1,'2006-02-15 21:30:53'),(14597,'2005-08-21 17:39:41',1160,472,'2005-08-25 14:07:41',1,'2006-02-15 21:30:53'),(14598,'2005-08-21 17:40:05',1113,359,'2005-08-29 18:16:05',2,'2006-02-15 21:30:53'),(14599,'2005-08-21 17:43:42',4575,599,'2005-08-22 18:53:42',1,'2006-02-15 21:30:53'),(14600,'2005-08-21 17:45:21',3532,255,'2005-08-28 19:03:21',1,'2006-02-15 21:30:53'),(14601,'2005-08-21 17:45:52',548,406,'2005-08-29 15:10:52',1,'2006-02-15 21:30:53'),(14602,'2005-08-21 17:48:49',3771,370,'2005-08-28 21:38:49',1,'2006-02-15 21:30:53'),(14603,'2005-08-21 17:51:06',94,26,'2005-08-28 15:36:06',1,'2006-02-15 21:30:53'),(14604,'2006-02-14 15:16:03',1024,585,NULL,2,'2006-02-15 21:30:53'),(14605,'2005-08-21 17:56:06',476,394,'2005-08-24 18:35:06',1,'2006-02-15 21:30:53'),(14606,'2006-02-14 15:16:03',2291,592,NULL,2,'2006-02-15 21:30:53'),(14607,'2005-08-21 17:56:50',4518,417,'2005-08-22 17:44:50',2,'2006-02-15 21:30:53'),(14608,'2005-08-21 17:57:22',3321,90,'2005-08-25 13:20:22',1,'2006-02-15 21:30:53'),(14609,'2005-08-21 17:57:26',1206,551,'2005-08-25 14:04:26',2,'2006-02-15 21:30:53'),(14610,'2005-08-21 17:59:09',1894,260,'2005-08-29 21:36:09',2,'2006-02-15 21:30:53'),(14611,'2005-08-21 18:01:41',4078,443,'2005-08-26 12:34:41',1,'2006-02-15 21:30:53'),(14612,'2005-08-21 18:03:15',4105,445,'2005-08-27 13:39:15',1,'2006-02-15 21:30:53'),(14613,'2005-08-21 18:03:20',3841,20,'2005-08-26 19:46:20',1,'2006-02-15 21:30:53'),(14614,'2005-08-21 18:03:51',3053,468,'2005-08-30 13:37:51',1,'2006-02-15 21:30:53'),(14615,'2005-08-21 18:06:32',2332,171,'2005-08-30 13:19:32',2,'2006-02-15 21:30:53'),(14616,'2006-02-14 15:16:03',4537,532,NULL,1,'2006-02-15 21:30:53'),(14617,'2005-08-21 18:07:40',3562,51,'2005-08-24 23:48:40',2,'2006-02-15 21:30:53'),(14618,'2005-08-21 18:09:51',4490,270,'2005-08-28 22:47:51',1,'2006-02-15 21:30:53'),(14619,'2005-08-21 18:10:03',1589,338,'2005-08-23 13:40:03',2,'2006-02-15 21:30:53'),(14620,'2005-08-21 18:10:43',3272,78,'2005-08-22 15:19:43',2,'2006-02-15 21:30:53'),(14621,'2005-08-21 18:17:59',3622,344,'2005-08-23 14:16:59',1,'2006-02-15 21:30:53'),(14622,'2005-08-21 18:25:59',2702,559,'2005-08-31 00:11:59',2,'2006-02-15 21:30:53'),(14623,'2005-08-21 18:29:13',901,33,'2005-08-26 20:48:13',2,'2006-02-15 21:30:53'),(14624,'2005-08-21 18:32:42',4,344,'2005-08-23 21:09:42',1,'2006-02-15 21:30:53'),(14625,'2005-08-21 18:34:21',2661,507,'2005-08-29 21:41:21',1,'2006-02-15 21:30:53'),(14626,'2005-08-21 18:35:44',1038,554,'2005-08-25 23:54:44',2,'2006-02-15 21:30:53'),(14627,'2005-08-21 18:35:54',2470,49,'2005-08-30 21:17:54',1,'2006-02-15 21:30:53'),(14628,'2005-08-21 18:37:24',3636,331,'2005-08-27 20:25:24',2,'2006-02-15 21:30:53'),(14629,'2005-08-21 18:39:52',761,148,'2005-08-25 19:14:52',2,'2006-02-15 21:30:53'),(14630,'2005-08-21 18:43:44',4049,294,'2005-08-29 17:08:44',2,'2006-02-15 21:30:53'),(14631,'2005-08-21 18:47:49',782,209,'2005-08-28 16:54:49',1,'2006-02-15 21:30:53'),(14632,'2005-08-21 18:48:06',2807,38,'2005-08-25 00:33:06',2,'2006-02-15 21:30:53'),(14633,'2005-08-21 18:51:10',2137,551,'2005-08-25 13:07:10',1,'2006-02-15 21:30:53'),(14634,'2005-08-21 18:51:28',486,494,'2005-08-29 19:30:28',2,'2006-02-15 21:30:53'),(14635,'2005-08-21 18:51:43',2171,108,'2005-08-27 16:30:43',2,'2006-02-15 21:30:53'),(14636,'2005-08-21 18:59:17',1671,339,'2005-08-23 13:19:17',2,'2006-02-15 21:30:53'),(14637,'2005-08-21 19:01:00',1846,76,'2005-08-26 23:03:00',2,'2006-02-15 21:30:53'),(14638,'2005-08-21 19:01:36',3583,216,'2005-08-22 15:09:36',2,'2006-02-15 21:30:53'),(14639,'2005-08-21 19:01:39',3510,210,'2005-08-26 14:08:39',1,'2006-02-15 21:30:53'),(14640,'2005-08-21 19:03:19',1880,253,'2005-08-27 00:37:19',2,'2006-02-15 21:30:53'),(14641,'2005-08-21 19:05:23',2205,147,'2005-08-22 22:30:23',2,'2006-02-15 21:30:53'),(14642,'2005-08-21 19:09:40',1280,81,'2005-08-30 13:25:40',2,'2006-02-15 21:30:53'),(14643,'2005-08-21 19:11:58',798,119,'2005-08-29 19:52:58',1,'2006-02-15 21:30:53'),(14644,'2005-08-21 19:12:12',3905,453,'2005-08-29 17:08:12',1,'2006-02-15 21:30:53'),(14645,'2005-08-21 19:12:47',2369,334,'2005-08-25 21:42:47',1,'2006-02-15 21:30:53'),(14646,'2005-08-21 19:14:48',948,186,'2005-08-23 17:15:48',1,'2006-02-15 21:30:53'),(14647,'2005-08-21 19:15:33',3854,36,'2005-08-30 18:58:33',2,'2006-02-15 21:30:53'),(14648,'2005-08-21 19:18:01',2250,284,'2005-08-25 14:59:01',2,'2006-02-15 21:30:53'),(14649,'2005-08-21 19:19:21',4074,43,'2005-08-22 17:23:21',1,'2006-02-15 21:30:53'),(14650,'2005-08-21 19:24:51',1274,190,'2005-08-25 13:58:51',2,'2006-02-15 21:30:53'),(14651,'2005-08-21 19:31:09',4037,544,'2005-08-28 14:26:09',2,'2006-02-15 21:30:53'),(14652,'2005-08-21 19:32:05',4163,453,'2005-08-23 23:33:05',2,'2006-02-15 21:30:53'),(14653,'2005-08-21 19:35:59',491,593,'2005-08-24 15:31:59',1,'2006-02-15 21:30:53'),(14654,'2005-08-21 19:36:59',687,173,'2005-08-23 22:03:59',2,'2006-02-15 21:30:53'),(14655,'2005-08-21 19:37:10',785,253,'2005-08-22 15:43:10',1,'2006-02-15 21:30:53'),(14656,'2005-08-21 19:39:28',4205,201,'2005-08-24 01:36:28',2,'2006-02-15 21:30:53'),(14657,'2005-08-21 19:39:43',477,244,'2005-08-26 22:39:43',2,'2006-02-15 21:30:53'),(14658,'2005-08-21 19:41:50',1465,473,'2005-08-25 16:11:50',1,'2006-02-15 21:30:53'),(14659,'2005-08-21 19:42:36',928,119,'2005-08-26 14:06:36',1,'2006-02-15 21:30:53'),(14660,'2005-08-21 19:43:21',3433,452,'2005-08-22 20:42:21',1,'2006-02-15 21:30:53'),(14661,'2005-08-21 19:44:21',745,469,'2005-08-27 14:35:21',1,'2006-02-15 21:30:53'),(14662,'2005-08-21 19:45:27',2969,403,'2005-08-23 14:44:27',2,'2006-02-15 21:30:53'),(14663,'2005-08-21 19:47:55',2351,150,'2005-08-27 17:36:55',2,'2006-02-15 21:30:53'),(14664,'2005-08-21 19:48:47',4377,153,'2005-08-27 16:47:47',1,'2006-02-15 21:30:53'),(14665,'2005-08-21 19:49:46',2896,58,'2005-08-30 18:00:46',1,'2006-02-15 21:30:53'),(14666,'2005-08-21 19:51:09',2560,122,'2005-08-30 22:42:09',2,'2006-02-15 21:30:53'),(14667,'2005-08-21 19:51:11',2608,55,'2005-08-23 17:37:11',1,'2006-02-15 21:30:53'),(14668,'2005-08-21 19:51:30',1450,152,'2005-08-29 19:38:30',2,'2006-02-15 21:30:53'),(14669,'2005-08-21 19:54:06',3154,317,'2005-08-25 23:12:06',1,'2006-02-15 21:30:53'),(14670,'2005-08-21 19:54:11',4324,537,'2005-08-27 21:42:11',2,'2006-02-15 21:30:53'),(14671,'2005-08-21 19:59:30',2622,53,'2005-08-22 19:39:30',1,'2006-02-15 21:30:53'),(14672,'2005-08-21 19:59:33',4144,325,'2005-08-30 19:40:33',1,'2006-02-15 21:30:53'),(14673,'2005-08-21 20:01:18',1827,445,'2005-08-25 18:55:18',1,'2006-02-15 21:30:53'),(14674,'2005-08-21 20:01:34',572,300,'2005-08-27 18:33:34',1,'2006-02-15 21:30:53'),(14675,'2005-08-21 20:01:51',328,170,'2005-08-26 14:30:51',2,'2006-02-15 21:30:53'),(14676,'2005-08-21 20:02:18',877,49,'2005-08-26 21:55:18',1,'2006-02-15 21:30:53'),(14677,'2005-08-21 20:12:30',4411,26,'2005-08-28 15:11:30',1,'2006-02-15 21:30:53'),(14678,'2005-08-21 20:12:43',1911,383,'2005-08-31 02:11:43',2,'2006-02-15 21:30:53'),(14679,'2005-08-21 20:14:58',1520,193,'2005-08-23 23:39:58',1,'2006-02-15 21:30:53'),(14680,'2005-08-21 20:19:52',4469,524,'2005-08-28 17:10:52',1,'2006-02-15 21:30:53'),(14681,'2005-08-21 20:25:13',1083,212,'2005-08-30 19:48:13',1,'2006-02-15 21:30:53'),(14682,'2005-08-21 20:25:57',2974,314,'2005-08-28 00:42:57',2,'2006-02-15 21:30:53'),(14683,'2005-08-21 20:27:44',3850,342,'2005-08-29 16:54:44',1,'2006-02-15 21:30:53'),(14684,'2005-08-21 20:28:26',3593,369,'2005-08-28 19:01:26',2,'2006-02-15 21:30:53'),(14685,'2005-08-21 20:31:25',1320,69,'2005-08-22 21:02:25',1,'2006-02-15 21:30:53'),(14686,'2005-08-21 20:32:08',814,34,'2005-08-26 18:07:08',1,'2006-02-15 21:30:53'),(14687,'2005-08-21 20:32:16',306,550,'2005-08-26 16:17:16',2,'2006-02-15 21:30:53'),(14688,'2005-08-21 20:32:37',2573,219,'2005-08-27 00:06:37',2,'2006-02-15 21:30:53'),(14689,'2005-08-21 20:33:00',1124,463,'2005-08-22 18:10:00',1,'2006-02-15 21:30:53'),(14690,'2005-08-21 20:42:25',3649,456,'2005-08-29 18:42:25',2,'2006-02-15 21:30:53'),(14691,'2005-08-21 20:42:29',2131,404,'2005-08-24 01:22:29',1,'2006-02-15 21:30:53'),(14692,'2005-08-21 20:43:21',1908,192,'2005-08-28 19:02:21',1,'2006-02-15 21:30:53'),(14693,'2005-08-21 20:44:19',3454,269,'2005-08-29 00:37:19',2,'2006-02-15 21:30:53'),(14694,'2005-08-21 20:46:42',2767,363,'2005-08-23 16:18:42',1,'2006-02-15 21:30:53'),(14695,'2005-08-21 20:46:47',412,206,'2005-08-22 22:25:47',2,'2006-02-15 21:30:53'),(14696,'2005-08-21 20:48:05',3776,435,'2005-08-25 14:55:05',1,'2006-02-15 21:30:53'),(14697,'2005-08-21 20:49:21',48,409,'2005-08-26 01:39:21',2,'2006-02-15 21:30:53'),(14698,'2005-08-21 20:49:58',4255,196,'2005-08-29 20:13:58',2,'2006-02-15 21:30:53'),(14699,'2005-08-21 20:50:48',1427,3,'2005-08-29 18:08:48',2,'2006-02-15 21:30:53'),(14700,'2005-08-21 20:53:40',3446,360,'2005-08-23 22:01:40',1,'2006-02-15 21:30:53'),(14701,'2005-08-21 20:54:32',3034,34,'2005-08-30 16:46:32',1,'2006-02-15 21:30:53'),(14702,'2005-08-21 21:00:03',4096,345,'2005-08-30 16:59:03',1,'2006-02-15 21:30:53'),(14703,'2005-08-21 21:01:19',4329,29,'2005-08-22 15:13:19',2,'2006-02-15 21:30:53'),(14704,'2005-08-21 21:02:22',4062,248,'2005-08-27 23:10:22',2,'2006-02-15 21:30:53'),(14705,'2005-08-21 21:02:55',2493,243,'2005-08-25 20:20:55',2,'2006-02-15 21:30:53'),(14706,'2005-08-21 21:04:42',4494,589,'2005-08-22 19:55:42',2,'2006-02-15 21:30:53'),(14707,'2005-08-21 21:06:29',2916,530,'2005-08-30 23:37:29',1,'2006-02-15 21:30:53'),(14708,'2005-08-21 21:07:23',2828,226,'2005-08-28 15:47:23',1,'2006-02-15 21:30:53'),(14709,'2005-08-21 21:07:59',1856,300,'2005-08-31 02:19:59',1,'2006-02-15 21:30:53'),(14710,'2005-08-21 21:15:23',1922,587,'2005-08-30 19:45:23',1,'2006-02-15 21:30:53'),(14711,'2005-08-21 21:22:07',1973,448,'2005-08-30 16:24:07',2,'2006-02-15 21:30:53'),(14712,'2005-08-21 21:22:56',1198,226,'2005-08-25 01:53:56',1,'2006-02-15 21:30:53'),(14713,'2005-08-21 21:27:24',3350,148,'2005-08-23 20:26:24',1,'2006-02-15 21:30:53'),(14714,'2005-08-21 21:27:43',1,279,'2005-08-30 22:26:43',1,'2006-02-15 21:30:53'),(14715,'2005-08-21 21:28:18',4453,287,'2005-08-26 22:13:18',2,'2006-02-15 21:30:53'),(14716,'2005-08-21 21:29:55',2285,78,'2005-08-23 18:34:55',2,'2006-02-15 21:30:53'),(14717,'2005-08-21 21:30:39',3839,366,'2005-08-26 16:58:39',2,'2006-02-15 21:30:53'),(14718,'2005-08-21 21:39:25',3618,340,'2005-08-26 22:07:25',2,'2006-02-15 21:30:53'),(14719,'2005-08-21 21:41:57',4091,599,'2005-08-25 20:37:57',1,'2006-02-15 21:30:53'),(14720,'2005-08-21 21:43:53',3617,395,'2005-08-25 18:21:53',1,'2006-02-15 21:30:53'),(14721,'2005-08-21 21:50:51',4257,349,'2005-08-30 19:21:51',1,'2006-02-15 21:30:53'),(14722,'2005-08-21 21:50:53',2930,236,'2005-08-30 03:13:53',1,'2006-02-15 21:30:53'),(14723,'2005-08-21 21:52:32',2755,548,'2005-08-31 00:03:32',2,'2006-02-15 21:30:53'),(14724,'2005-08-21 21:53:47',3559,552,'2005-08-23 20:14:47',2,'2006-02-15 21:30:53'),(14725,'2005-08-21 22:02:08',4427,403,'2005-08-23 03:59:08',2,'2006-02-15 21:30:53'),(14726,'2005-08-21 22:08:52',4556,216,'2005-08-22 18:28:52',1,'2006-02-15 21:30:53'),(14727,'2005-08-21 22:12:45',650,275,'2005-08-25 00:46:45',1,'2006-02-15 21:30:53'),(14728,'2005-08-21 22:15:36',2671,474,'2005-08-25 17:14:36',2,'2006-02-15 21:30:53'),(14729,'2005-08-21 22:16:57',2483,289,'2005-08-27 21:32:57',1,'2006-02-15 21:30:53'),(14730,'2005-08-21 22:21:11',2949,439,'2005-08-30 03:02:11',1,'2006-02-15 21:30:53'),(14731,'2005-08-21 22:21:49',1351,154,'2005-08-24 16:27:49',1,'2006-02-15 21:30:53'),(14732,'2005-08-21 22:22:29',1915,482,'2005-08-23 18:34:29',1,'2006-02-15 21:30:53'),(14733,'2005-08-21 22:22:33',398,408,'2005-08-26 21:01:33',1,'2006-02-15 21:30:53'),(14734,'2006-02-14 15:16:03',1369,448,NULL,2,'2006-02-15 21:30:53'),(14735,'2005-08-21 22:25:09',950,35,'2005-08-23 21:16:09',1,'2006-02-15 21:30:53'),(14736,'2005-08-21 22:25:53',207,139,'2005-08-25 19:01:53',2,'2006-02-15 21:30:53'),(14737,'2005-08-21 22:27:11',1842,124,'2005-08-25 18:51:11',2,'2006-02-15 21:30:53'),(14738,'2005-08-21 22:29:13',3315,521,'2005-08-29 21:19:13',1,'2006-02-15 21:30:53'),(14739,'2005-08-21 22:33:22',4026,226,'2005-08-22 19:45:22',1,'2006-02-15 21:30:53'),(14740,'2005-08-21 22:35:33',1717,333,'2005-08-26 17:49:33',1,'2006-02-15 21:30:53'),(14741,'2006-02-14 15:16:03',612,60,NULL,2,'2006-02-15 21:30:53'),(14742,'2005-08-21 22:39:01',2988,421,'2005-08-26 00:17:01',1,'2006-02-15 21:30:53'),(14743,'2005-08-21 22:41:56',4570,2,'2005-08-29 00:18:56',1,'2006-02-15 21:30:53'),(14744,'2005-08-21 22:45:21',800,213,'2005-08-29 23:57:21',1,'2006-02-15 21:30:53'),(14745,'2005-08-21 22:53:01',4399,277,'2005-08-23 23:22:01',1,'2006-02-15 21:30:53'),(14746,'2005-08-21 22:54:02',3197,284,'2005-08-27 17:04:02',2,'2006-02-15 21:30:53'),(14747,'2005-08-21 23:00:02',201,153,'2005-08-26 18:58:02',2,'2006-02-15 21:30:53'),(14748,'2005-08-21 23:02:02',1697,81,'2005-08-28 05:01:02',2,'2006-02-15 21:30:53'),(14749,'2005-08-21 23:08:33',831,235,'2005-08-29 20:46:33',2,'2006-02-15 21:30:53'),(14750,'2005-08-21 23:09:32',918,303,'2005-08-30 00:46:32',2,'2006-02-15 21:30:53'),(14751,'2005-08-21 23:11:23',1156,195,'2005-08-30 20:01:23',2,'2006-02-15 21:30:53'),(14752,'2005-08-21 23:11:42',1252,362,'2005-08-28 22:12:42',1,'2006-02-15 21:30:53'),(14753,'2005-08-21 23:11:43',1803,155,'2005-08-22 22:25:43',2,'2006-02-15 21:30:53'),(14754,'2005-08-21 23:17:26',2355,137,'2005-08-29 18:55:26',2,'2006-02-15 21:30:53'),(14755,'2005-08-21 23:18:08',862,328,'2005-08-27 01:06:08',2,'2006-02-15 21:30:53'),(14756,'2005-08-21 23:21:23',564,288,'2005-08-24 01:44:23',1,'2006-02-15 21:30:53'),(14757,'2005-08-21 23:23:37',1154,473,'2005-08-26 23:24:37',2,'2006-02-15 21:30:53'),(14758,'2005-08-21 23:24:52',2372,339,'2005-08-27 04:25:52',2,'2006-02-15 21:30:53'),(14759,'2005-08-21 23:28:58',3871,362,'2005-08-31 00:35:58',2,'2006-02-15 21:30:53'),(14760,'2006-02-14 15:16:03',1367,355,NULL,1,'2006-02-15 21:30:53'),(14761,'2005-08-21 23:30:28',2657,490,'2005-08-26 03:26:28',1,'2006-02-15 21:30:53'),(14762,'2005-08-21 23:33:57',4249,1,'2005-08-23 01:30:57',1,'2006-02-15 21:30:53'),(14763,'2005-08-21 23:34:00',1480,116,'2005-08-31 03:58:00',2,'2006-02-15 21:30:53'),(14764,'2005-08-21 23:37:47',1270,529,'2005-08-24 00:23:47',2,'2006-02-15 21:30:53'),(14765,'2005-08-21 23:40:28',2817,435,'2005-08-25 04:55:28',2,'2006-02-15 21:30:53'),(14766,'2005-08-21 23:42:20',768,523,'2005-08-26 03:46:20',1,'2006-02-15 21:30:53'),(14767,'2005-08-21 23:43:00',1232,69,'2005-08-29 05:26:00',1,'2006-02-15 21:30:53'),(14768,'2005-08-21 23:44:53',3465,570,'2005-08-27 20:33:53',1,'2006-02-15 21:30:53'),(14769,'2006-02-14 15:16:03',1800,361,NULL,1,'2006-02-15 21:30:53'),(14770,'2005-08-21 23:47:16',2977,372,'2005-08-25 04:48:16',1,'2006-02-15 21:30:53'),(14771,'2005-08-21 23:50:15',2665,149,'2005-08-28 22:55:15',2,'2006-02-15 21:30:53'),(14772,'2005-08-21 23:50:39',4047,411,'2005-08-30 20:44:39',2,'2006-02-15 21:30:53'),(14773,'2005-08-21 23:50:57',2541,413,'2005-08-26 04:45:57',2,'2006-02-15 21:30:53'),(14774,'2005-08-21 23:52:32',3185,252,'2005-08-26 23:42:32',2,'2006-02-15 21:30:53'),(14775,'2005-08-21 23:53:07',4044,400,'2005-08-22 18:07:07',2,'2006-02-15 21:30:53'),(14776,'2005-08-21 23:53:35',3488,15,'2005-08-24 02:00:35',2,'2006-02-15 21:30:53'),(14777,'2005-08-21 23:55:50',237,389,'2005-08-28 04:31:50',1,'2006-02-15 21:30:53'),(14778,'2005-08-21 23:56:30',2152,396,'2005-08-26 00:07:30',2,'2006-02-15 21:30:53'),(14779,'2005-08-22 00:00:56',1087,279,'2005-08-31 00:01:56',2,'2006-02-15 21:30:53'),(14780,'2005-08-22 00:06:33',3171,491,'2005-08-22 22:02:33',2,'2006-02-15 21:30:53'),(14781,'2005-08-22 00:15:12',3458,71,'2005-08-29 21:02:12',1,'2006-02-15 21:30:53'),(14782,'2005-08-22 00:17:20',1727,211,'2005-08-23 01:24:20',1,'2006-02-15 21:30:53'),(14783,'2005-08-22 00:21:57',3419,332,'2005-08-28 01:27:57',2,'2006-02-15 21:30:53'),(14784,'2005-08-22 00:23:13',441,117,'2005-08-28 03:42:13',1,'2006-02-15 21:30:53'),(14785,'2005-08-22 00:24:37',1981,560,'2005-08-25 04:15:37',1,'2006-02-15 21:30:53'),(14786,'2005-08-22 00:24:42',2959,370,'2005-08-25 19:36:42',1,'2006-02-15 21:30:53'),(14787,'2005-08-22 00:25:59',2634,38,'2005-08-28 22:30:59',2,'2006-02-15 21:30:53'),(14788,'2005-08-22 00:27:59',1917,139,'2005-08-29 23:54:59',2,'2006-02-15 21:30:53'),(14789,'2005-08-22 00:29:39',2344,279,'2005-08-25 02:25:39',1,'2006-02-15 21:30:53'),(14790,'2005-08-22 00:34:17',1002,397,'2005-08-31 02:27:17',1,'2006-02-15 21:30:53'),(14791,'2005-08-22 00:35:55',1490,317,'2005-08-30 20:23:55',1,'2006-02-15 21:30:53'),(14792,'2005-08-22 00:36:41',4436,396,'2005-08-30 18:58:41',1,'2006-02-15 21:30:53'),(14793,'2005-08-22 00:37:57',4285,154,'2005-08-29 05:44:57',2,'2006-02-15 21:30:53'),(14794,'2005-08-22 00:39:31',413,156,'2005-08-28 20:08:31',2,'2006-02-15 21:30:53'),(14795,'2005-08-22 00:40:22',1695,303,'2005-08-26 01:37:22',1,'2006-02-15 21:30:53'),(14796,'2005-08-22 00:40:49',941,441,'2005-08-30 03:59:49',1,'2006-02-15 21:30:53'),(14797,'2005-08-22 00:41:24',1131,546,'2005-08-23 18:51:24',1,'2006-02-15 21:30:53'),(14798,'2005-08-22 00:44:08',7,92,'2005-08-27 02:18:08',2,'2006-02-15 21:30:53'),(14799,'2005-08-22 00:44:57',1276,454,'2005-08-24 20:08:57',2,'2006-02-15 21:30:53'),(14800,'2005-08-22 00:46:18',3554,533,'2005-08-26 01:44:18',2,'2006-02-15 21:30:53'),(14801,'2005-08-22 00:46:54',1677,184,'2005-08-30 19:03:54',1,'2006-02-15 21:30:53'),(14802,'2005-08-22 00:48:23',707,505,'2005-08-28 01:02:23',1,'2006-02-15 21:30:53'),(14803,'2005-08-22 00:49:10',2525,278,'2005-08-22 23:44:10',2,'2006-02-15 21:30:53'),(14804,'2005-08-22 00:51:25',372,94,'2005-08-26 21:15:25',1,'2006-02-15 21:30:53'),(14805,'2005-08-22 00:52:01',783,169,'2005-08-23 03:28:01',2,'2006-02-15 21:30:53'),(14806,'2005-08-22 00:53:08',2049,231,'2005-08-23 06:26:08',2,'2006-02-15 21:30:53'),(14807,'2005-08-22 00:57:43',335,90,'2005-08-26 23:40:43',1,'2006-02-15 21:30:53'),(14808,'2005-08-22 00:58:35',1657,362,'2005-08-29 20:16:35',2,'2006-02-15 21:30:53'),(14809,'2005-08-22 01:00:42',1077,188,'2005-08-29 19:55:42',1,'2006-02-15 21:30:53'),(14810,'2005-08-22 01:08:34',1982,78,'2005-08-25 07:00:34',2,'2006-02-15 21:30:53'),(14811,'2005-08-22 01:09:04',1613,53,'2005-08-26 19:30:04',1,'2006-02-15 21:30:53'),(14812,'2005-08-22 01:10:32',4282,211,'2005-08-26 05:21:32',1,'2006-02-15 21:30:53'),(14813,'2005-08-22 01:11:37',3364,142,'2005-08-24 05:57:37',2,'2006-02-15 21:30:53'),(14814,'2005-08-22 01:12:14',3109,250,'2005-08-27 23:24:14',2,'2006-02-15 21:30:53'),(14815,'2005-08-22 01:12:44',1183,314,'2005-08-24 01:42:44',2,'2006-02-15 21:30:53'),(14816,'2005-08-22 01:15:51',4086,534,'2005-08-28 04:11:51',1,'2006-02-15 21:30:53'),(14817,'2005-08-22 01:17:16',910,215,'2005-08-27 02:43:16',1,'2006-02-15 21:30:53'),(14818,'2005-08-22 01:17:18',1619,580,'2005-08-26 05:40:18',1,'2006-02-15 21:30:53'),(14819,'2005-08-22 01:17:19',2890,410,'2005-08-30 05:54:19',1,'2006-02-15 21:30:53'),(14820,'2005-08-22 01:18:37',1409,52,'2005-08-23 19:44:37',1,'2006-02-15 21:30:53'),(14821,'2005-08-22 01:20:19',3155,62,'2005-08-29 03:06:19',2,'2006-02-15 21:30:53'),(14822,'2005-08-22 01:21:14',2835,52,'2005-08-30 03:59:14',1,'2006-02-15 21:30:53'),(14823,'2005-08-22 01:24:42',680,503,'2005-08-22 19:45:42',2,'2006-02-15 21:30:53'),(14824,'2005-08-22 01:27:51',4162,594,'2005-08-23 03:24:51',2,'2006-02-15 21:30:53'),(14825,'2005-08-22 01:27:57',1449,1,'2005-08-27 07:01:57',2,'2006-02-15 21:30:53'),(14826,'2005-08-22 01:32:14',4023,426,'2005-08-23 03:52:14',2,'2006-02-15 21:30:53'),(14827,'2005-08-22 01:32:32',2267,88,'2005-08-31 06:21:32',2,'2006-02-15 21:30:53'),(14828,'2005-08-22 01:34:05',4114,319,'2005-08-27 06:27:05',2,'2006-02-15 21:30:53'),(14829,'2005-08-22 01:35:37',3606,546,'2005-08-23 19:55:37',2,'2006-02-15 21:30:53'),(14830,'2005-08-22 01:37:19',637,590,'2005-08-27 20:10:19',1,'2006-02-15 21:30:53'),(14831,'2005-08-22 01:40:49',3370,156,'2005-08-23 02:47:49',1,'2006-02-15 21:30:53'),(14832,'2005-08-22 01:43:29',1828,494,'2005-08-29 07:19:29',2,'2006-02-15 21:30:53'),(14833,'2005-08-22 01:45:18',1960,551,'2005-08-28 21:24:18',1,'2006-02-15 21:30:53'),(14834,'2005-08-22 01:45:58',3105,262,'2005-08-28 20:52:58',1,'2006-02-15 21:30:53'),(14835,'2005-08-22 01:49:07',755,404,'2005-08-30 04:28:07',1,'2006-02-15 21:30:53'),(14836,'2005-08-22 01:52:26',4287,418,'2005-08-22 23:39:26',1,'2006-02-15 21:30:53'),(14837,'2005-08-22 01:54:52',2251,43,'2005-08-29 02:24:52',1,'2006-02-15 21:30:53'),(14838,'2005-08-22 01:57:34',506,404,'2005-08-25 06:34:34',1,'2006-02-15 21:30:53'),(14839,'2005-08-22 01:58:15',3440,567,'2005-08-24 05:24:15',2,'2006-02-15 21:30:53'),(14840,'2005-08-22 01:58:42',1240,354,'2005-08-29 22:32:42',2,'2006-02-15 21:30:53'),(14841,'2005-08-22 02:03:30',4017,384,'2005-08-28 02:08:30',2,'2006-02-15 21:30:53'),(14842,'2005-08-22 02:04:38',2511,467,'2005-08-30 06:46:38',2,'2006-02-15 21:30:53'),(14843,'2005-08-22 02:05:25',3000,454,'2005-08-28 22:11:25',1,'2006-02-15 21:30:53'),(14844,'2005-08-22 02:09:12',145,513,'2005-08-31 05:43:12',1,'2006-02-15 21:30:53'),(14845,'2005-08-22 02:12:44',69,292,'2005-08-24 02:36:44',2,'2006-02-15 21:30:53'),(14846,'2005-08-22 02:13:48',3840,309,'2005-08-30 05:39:48',1,'2006-02-15 21:30:53'),(14847,'2005-08-22 02:13:51',2995,327,'2005-08-29 03:42:51',2,'2006-02-15 21:30:53'),(14848,'2005-08-22 02:14:19',395,218,'2005-08-26 02:54:19',2,'2006-02-15 21:30:53'),(14849,'2005-08-22 02:15:26',3354,177,'2005-08-28 00:56:26',2,'2006-02-15 21:30:53'),(14850,'2005-08-22 02:16:55',2405,435,'2005-08-26 21:08:55',1,'2006-02-15 21:30:53'),(14851,'2005-08-22 02:20:44',1139,180,'2005-08-26 08:02:44',2,'2006-02-15 21:30:53'),(14852,'2005-08-22 02:25:53',2262,352,'2005-08-25 04:27:53',1,'2006-02-15 21:30:53'),(14853,'2005-08-22 02:26:33',3575,388,'2005-08-31 02:49:33',2,'2006-02-15 21:30:53'),(14854,'2005-08-22 02:26:47',1989,117,'2005-08-23 05:53:47',1,'2006-02-15 21:30:53'),(14855,'2005-08-22 02:27:32',1668,187,'2005-08-31 03:35:32',1,'2006-02-15 21:30:53'),(14856,'2005-08-22 02:31:51',3292,151,'2005-08-26 23:41:51',2,'2006-02-15 21:30:53'),(14857,'2005-08-22 02:42:39',4150,232,'2005-08-24 21:26:39',2,'2006-02-15 21:30:53'),(14858,'2005-08-22 02:46:18',366,499,'2005-08-30 08:22:18',1,'2006-02-15 21:30:53'),(14859,'2005-08-22 02:46:35',2150,463,'2005-08-24 22:37:35',2,'2006-02-15 21:30:53'),(14860,'2005-08-22 02:47:07',1368,418,'2005-08-28 00:00:07',1,'2006-02-15 21:30:53'),(14861,'2005-08-22 02:48:05',1806,422,'2005-08-27 00:50:05',1,'2006-02-15 21:30:53'),(14862,'2005-08-22 02:51:41',3479,78,'2005-08-28 06:30:41',2,'2006-02-15 21:30:53'),(14863,'2005-08-22 02:57:04',779,440,'2005-08-30 03:24:04',2,'2006-02-15 21:30:53'),(14864,'2005-08-22 02:57:06',2872,460,'2005-08-22 22:19:06',1,'2006-02-15 21:30:53'),(14865,'2005-08-22 03:06:38',3775,94,'2005-08-23 04:26:38',1,'2006-02-15 21:30:53'),(14866,'2005-08-22 03:11:35',2607,445,'2005-08-30 00:10:35',1,'2006-02-15 21:30:53'),(14867,'2005-08-22 03:14:46',271,114,'2005-08-25 03:53:46',2,'2006-02-15 21:30:53'),(14868,'2005-08-22 03:15:01',4383,160,'2005-08-25 01:24:01',1,'2006-02-15 21:30:53'),(14869,'2005-08-22 03:20:26',455,21,'2005-08-23 05:25:26',2,'2006-02-15 21:30:53'),(14870,'2005-08-22 03:23:20',2170,512,'2005-08-23 06:50:20',2,'2006-02-15 21:30:53'),(14871,'2005-08-22 03:23:24',3411,204,'2005-08-23 22:23:24',2,'2006-02-15 21:30:53'),(14872,'2005-08-22 03:23:41',962,15,'2005-08-29 23:25:41',1,'2006-02-15 21:30:53'),(14873,'2005-08-22 03:31:06',3533,314,'2005-08-31 05:34:06',1,'2006-02-15 21:30:53'),(14874,'2005-08-22 03:32:05',1782,268,'2005-08-24 07:02:05',2,'2006-02-15 21:30:53'),(14875,'2005-08-22 03:34:39',3912,513,'2005-08-26 03:40:39',1,'2006-02-15 21:30:53'),(14876,'2005-08-22 03:39:29',3669,210,'2005-08-23 06:53:29',1,'2006-02-15 21:30:53'),(14877,'2005-08-22 03:39:56',974,266,'2005-08-24 03:41:56',2,'2006-02-15 21:30:53'),(14878,'2006-02-14 15:16:03',1202,441,NULL,2,'2006-02-15 21:30:53'),(14879,'2005-08-22 03:42:12',2154,148,'2005-08-27 06:14:12',1,'2006-02-15 21:30:53'),(14880,'2005-08-22 03:44:36',3615,224,'2005-08-24 05:45:36',2,'2006-02-15 21:30:53'),(14881,'2005-08-22 03:47:39',210,425,'2005-08-26 05:58:39',2,'2006-02-15 21:30:53'),(14882,'2005-08-22 03:52:21',12,417,'2005-08-25 04:50:21',2,'2006-02-15 21:30:53'),(14883,'2005-08-22 03:55:02',1946,177,'2005-08-28 02:51:02',1,'2006-02-15 21:30:53'),(14884,'2005-08-22 03:57:08',2957,547,'2005-08-23 07:11:08',1,'2006-02-15 21:30:53'),(14885,'2005-08-22 03:58:29',2097,248,'2005-08-30 05:26:29',1,'2006-02-15 21:30:53'),(14886,'2005-08-22 03:59:01',4330,379,'2005-08-23 01:22:01',1,'2006-02-15 21:30:53'),(14887,'2005-08-22 04:04:31',56,421,'2005-08-31 02:30:31',1,'2006-02-15 21:30:53'),(14888,'2005-08-22 04:09:18',3345,91,'2005-08-23 07:34:18',2,'2006-02-15 21:30:53'),(14889,'2005-08-22 04:10:10',1579,299,'2005-08-24 06:23:10',2,'2006-02-15 21:30:53'),(14890,'2005-08-22 04:10:49',517,346,'2005-08-30 23:23:49',1,'2006-02-15 21:30:53'),(14891,'2005-08-22 04:11:02',288,482,'2005-08-27 03:22:02',1,'2006-02-15 21:30:53'),(14892,'2005-08-22 04:15:05',3061,82,'2005-08-31 06:07:05',1,'2006-02-15 21:30:53'),(14893,'2005-08-22 04:15:48',2336,461,'2005-08-30 08:05:48',1,'2006-02-15 21:30:53'),(14894,'2005-08-22 04:16:56',3494,347,'2005-08-24 00:30:56',2,'2006-02-15 21:30:53'),(14895,'2005-08-22 04:19:23',4462,340,'2005-08-27 04:02:23',1,'2006-02-15 21:30:53'),(14896,'2005-08-22 04:20:55',2508,569,'2005-08-29 05:11:55',2,'2006-02-15 21:30:53'),(14897,'2005-08-22 04:22:31',1607,175,'2005-08-26 00:09:31',1,'2006-02-15 21:30:53'),(14898,'2005-08-22 04:26:34',1736,299,'2005-08-31 10:04:34',1,'2006-02-15 21:30:53'),(14899,'2005-08-22 04:26:38',3700,304,'2005-08-31 08:36:38',2,'2006-02-15 21:30:53'),(14900,'2005-08-22 04:27:48',3420,329,'2005-08-25 03:50:48',2,'2006-02-15 21:30:53'),(14901,'2005-08-22 04:31:37',4297,258,'2005-08-29 08:24:37',1,'2006-02-15 21:30:53'),(14902,'2005-08-22 04:31:50',866,423,'2005-08-23 23:47:50',2,'2006-02-15 21:30:53'),(14903,'2005-08-22 04:31:50',1795,51,'2005-08-25 22:53:50',2,'2006-02-15 21:30:53'),(14904,'2005-08-22 04:32:01',722,71,'2005-08-29 05:21:01',1,'2006-02-15 21:30:53'),(14905,'2005-08-22 04:34:22',4166,286,'2005-08-26 04:00:22',2,'2006-02-15 21:30:53'),(14906,'2005-08-22 04:38:18',153,366,'2005-08-29 23:03:18',1,'2006-02-15 21:30:53'),(14907,'2005-08-22 04:44:09',2469,116,'2005-08-25 09:53:09',1,'2006-02-15 21:30:53'),(14908,'2005-08-22 04:44:10',102,349,'2005-08-25 05:09:10',2,'2006-02-15 21:30:53'),(14909,'2005-08-22 04:48:44',1997,155,'2005-08-25 04:59:44',1,'2006-02-15 21:30:53'),(14910,'2005-08-22 04:50:52',1266,540,'2005-08-25 04:14:52',1,'2006-02-15 21:30:53'),(14911,'2005-08-22 04:51:42',353,273,'2005-08-28 05:37:42',1,'2006-02-15 21:30:53'),(14912,'2005-08-22 04:51:42',2658,404,'2005-08-23 23:50:42',1,'2006-02-15 21:30:53'),(14913,'2005-08-22 04:52:13',3609,503,'2005-08-23 06:49:13',2,'2006-02-15 21:30:53'),(14914,'2005-08-22 04:53:35',4348,156,'2005-08-26 10:35:35',1,'2006-02-15 21:30:53'),(14915,'2006-02-14 15:16:03',112,349,NULL,1,'2006-02-15 21:30:53'),(14916,'2005-08-22 04:56:57',2110,80,'2005-08-24 06:36:57',2,'2006-02-15 21:30:53'),(14917,'2005-08-22 05:03:59',377,289,'2005-08-29 04:00:59',2,'2006-02-15 21:30:53'),(14918,'2005-08-22 05:06:38',4056,154,'2005-08-30 01:44:38',2,'2006-02-15 21:30:53'),(14919,'2005-08-22 05:07:17',1587,244,'2005-08-30 06:41:17',2,'2006-02-15 21:30:53'),(14920,'2005-08-22 05:08:58',3357,106,'2005-08-23 02:51:58',1,'2006-02-15 21:30:53'),(14921,'2005-08-22 05:12:24',3724,284,'2005-08-26 08:20:24',2,'2006-02-15 21:30:53'),(14922,'2005-08-22 05:13:05',2322,151,'2005-08-30 04:59:05',1,'2006-02-15 21:30:53'),(14923,'2005-08-22 05:13:33',3434,460,'2005-08-28 01:39:33',2,'2006-02-15 21:30:53'),(14924,'2005-08-22 05:15:17',4189,118,'2005-08-23 10:11:17',1,'2006-02-15 21:30:53'),(14925,'2005-08-22 05:16:16',442,128,'2005-08-30 02:47:16',2,'2006-02-15 21:30:53'),(14926,'2005-08-22 05:18:44',2448,357,'2005-08-26 02:18:44',1,'2006-02-15 21:30:53'),(14927,'2005-08-22 05:31:53',952,193,'2005-08-27 07:04:53',1,'2006-02-15 21:30:53'),(14928,'2006-02-14 15:16:03',4375,472,NULL,1,'2006-02-15 21:30:53'),(14929,'2005-08-22 05:32:38',4195,546,'2005-08-28 00:02:38',1,'2006-02-15 21:30:53'),(14930,'2005-08-22 05:38:32',2875,584,'2005-08-30 07:21:32',1,'2006-02-15 21:30:53'),(14931,'2005-08-22 05:38:55',657,63,'2005-08-28 04:15:55',2,'2006-02-15 21:30:53'),(14932,'2005-08-22 05:40:39',2259,516,'2005-08-23 11:02:39',2,'2006-02-15 21:30:53'),(14933,'2006-02-14 15:16:03',1186,21,NULL,2,'2006-02-15 21:30:53'),(14934,'2005-08-22 05:47:15',815,226,'2005-08-26 11:32:15',1,'2006-02-15 21:30:53'),(14935,'2005-08-22 05:47:31',2025,380,'2005-08-29 00:33:31',2,'2006-02-15 21:30:53'),(14936,'2005-08-22 05:51:26',3710,241,'2005-08-29 10:21:26',2,'2006-02-15 21:30:53'),(14937,'2005-08-22 05:51:59',1241,348,'2005-08-31 01:45:59',2,'2006-02-15 21:30:53'),(14938,'2005-08-22 05:52:39',408,541,'2005-08-31 11:43:39',1,'2006-02-15 21:30:53'),(14939,'2005-08-22 05:53:52',719,328,'2005-08-27 06:20:52',1,'2006-02-15 21:30:53'),(14940,'2005-08-22 05:54:03',2635,46,'2005-08-24 05:52:03',2,'2006-02-15 21:30:53'),(14941,'2005-08-22 05:58:23',2328,574,'2005-08-28 10:58:23',1,'2006-02-15 21:30:53'),(14942,'2005-08-22 05:58:27',32,471,'2005-08-31 10:08:27',1,'2006-02-15 21:30:53'),(14943,'2005-08-22 05:59:59',3515,265,'2005-08-26 10:31:59',2,'2006-02-15 21:30:53'),(14944,'2005-08-22 06:01:26',535,153,'2005-08-24 10:33:26',2,'2006-02-15 21:30:53'),(14945,'2005-08-22 06:05:38',1567,304,'2005-08-29 12:01:38',1,'2006-02-15 21:30:53'),(14946,'2005-08-22 06:07:10',1395,308,'2005-08-28 05:25:10',1,'2006-02-15 21:30:53'),(14947,'2005-08-22 06:07:52',3497,68,'2005-08-28 01:12:52',2,'2006-02-15 21:30:53'),(14948,'2005-08-22 06:10:53',2914,488,'2005-08-28 11:24:53',2,'2006-02-15 21:30:53'),(14949,'2005-08-22 06:12:16',2434,111,'2005-08-25 08:25:16',2,'2006-02-15 21:30:53'),(14950,'2005-08-22 06:17:12',635,362,'2005-08-27 08:48:12',2,'2006-02-15 21:30:53'),(14951,'2005-08-22 06:19:37',2800,197,'2005-08-30 05:51:37',2,'2006-02-15 21:30:53'),(14952,'2005-08-22 06:20:07',2950,575,'2005-08-28 01:18:07',1,'2006-02-15 21:30:53'),(14953,'2005-08-22 06:23:54',816,182,'2005-08-28 03:19:54',1,'2006-02-15 21:30:53'),(14954,'2006-02-14 15:16:03',3608,525,NULL,1,'2006-02-15 21:30:53'),(14955,'2005-08-22 06:25:52',1534,445,'2005-08-25 12:13:52',2,'2006-02-15 21:30:53'),(14956,'2005-08-22 06:26:16',3650,571,'2005-08-25 11:06:16',2,'2006-02-15 21:30:53'),(14957,'2005-08-22 06:29:34',1384,323,'2005-08-26 04:52:34',2,'2006-02-15 21:30:53'),(14958,'2005-08-22 06:30:10',1710,347,'2005-08-28 09:43:10',2,'2006-02-15 21:30:53'),(14959,'2005-08-22 06:30:28',2009,569,'2005-08-25 09:48:28',1,'2006-02-15 21:30:53'),(14960,'2005-08-22 06:31:36',3316,147,'2005-08-29 07:10:36',2,'2006-02-15 21:30:53'),(14961,'2005-08-22 06:35:50',3274,52,'2005-08-31 04:07:50',2,'2006-02-15 21:30:53'),(14962,'2005-08-22 06:37:43',3104,449,'2005-08-29 03:44:43',2,'2006-02-15 21:30:53'),(14963,'2005-08-22 06:38:10',2672,384,'2005-08-31 05:35:10',2,'2006-02-15 21:30:53'),(14964,'2005-08-22 06:39:24',2302,500,'2005-08-26 06:05:24',1,'2006-02-15 21:30:53'),(14965,'2005-08-22 06:45:53',1036,148,'2005-08-27 10:05:53',1,'2006-02-15 21:30:53'),(14966,'2005-08-22 06:45:57',679,259,'2005-08-31 10:02:57',1,'2006-02-15 21:30:53'),(14967,'2005-08-22 06:46:03',289,67,'2005-08-23 01:02:03',2,'2006-02-15 21:30:53'),(14968,'2005-08-22 06:46:59',3302,129,'2005-08-29 07:36:59',1,'2006-02-15 21:30:53'),(14969,'2005-08-22 06:49:15',4060,120,'2005-08-29 05:52:15',1,'2006-02-15 21:30:53'),(14970,'2005-08-22 06:49:29',536,529,'2005-08-29 08:47:29',1,'2006-02-15 21:30:53'),(14971,'2005-08-22 06:52:49',1883,378,'2005-08-28 06:27:49',2,'2006-02-15 21:30:53'),(14972,'2005-08-22 06:53:21',3422,310,'2005-08-29 02:25:21',1,'2006-02-15 21:30:53'),(14973,'2005-08-22 06:59:28',2888,201,'2005-08-30 02:28:28',1,'2006-02-15 21:30:53'),(14974,'2005-08-22 07:04:25',2596,157,'2005-08-27 12:39:25',1,'2006-02-15 21:30:53'),(14975,'2005-08-22 07:07:50',924,244,'2005-08-28 07:23:50',2,'2006-02-15 21:30:53'),(14976,'2005-08-22 07:10:26',77,581,'2005-08-28 07:22:26',1,'2006-02-15 21:30:53'),(14977,'2005-08-22 07:12:53',4093,59,'2005-08-30 08:11:53',2,'2006-02-15 21:30:53'),(14978,'2005-08-22 07:13:15',699,94,'2005-08-25 12:26:15',1,'2006-02-15 21:30:53'),(14979,'2005-08-22 07:16:36',2320,387,'2005-08-24 02:29:36',2,'2006-02-15 21:30:53'),(14980,'2005-08-22 07:16:45',2701,518,'2005-08-26 06:04:45',2,'2006-02-15 21:30:53'),(14981,'2005-08-22 07:19:05',1239,544,'2005-08-26 03:08:05',2,'2006-02-15 21:30:53'),(14982,'2005-08-22 07:20:55',2333,542,'2005-08-31 04:35:55',2,'2006-02-15 21:30:53'),(14983,'2005-08-22 07:32:23',3579,363,'2005-08-30 11:39:23',2,'2006-02-15 21:30:53'),(14984,'2005-08-22 07:35:31',1704,334,'2005-08-30 02:32:31',1,'2006-02-15 21:30:53'),(14985,'2005-08-22 07:35:56',2017,29,'2005-08-29 13:17:56',1,'2006-02-15 21:30:53'),(14986,'2005-08-22 07:37:24',1493,278,'2005-08-23 04:22:24',2,'2006-02-15 21:30:53'),(14987,'2005-08-22 07:41:08',1513,138,'2005-08-24 03:15:08',2,'2006-02-15 21:30:53'),(14988,'2005-08-22 07:46:05',2114,186,'2005-08-29 06:43:05',1,'2006-02-15 21:30:53'),(14989,'2005-08-22 07:47:07',1431,58,'2005-08-26 04:42:07',2,'2006-02-15 21:30:53'),(14990,'2005-08-22 07:48:01',4057,198,'2005-08-24 06:41:01',2,'2006-02-15 21:30:53'),(14991,'2005-08-22 07:50:44',708,172,'2005-08-30 06:32:44',2,'2006-02-15 21:30:53'),(14992,'2005-08-22 07:51:47',4430,415,'2005-08-25 08:17:47',2,'2006-02-15 21:30:53'),(14993,'2005-08-22 07:52:18',3416,437,'2005-08-27 02:13:18',1,'2006-02-15 21:30:53'),(14994,'2005-08-22 07:52:24',1601,509,'2005-08-26 09:57:24',1,'2006-02-15 21:30:53'),(14995,'2005-08-22 07:52:31',4178,482,'2005-08-24 05:16:31',1,'2006-02-15 21:30:53'),(14996,'2005-08-22 07:52:41',1178,411,'2005-08-29 02:35:41',1,'2006-02-15 21:30:53'),(14997,'2005-08-22 07:53:00',2724,29,'2005-08-28 03:47:00',2,'2006-02-15 21:30:53'),(14998,'2005-08-22 07:53:14',3852,92,'2005-08-24 03:46:14',2,'2006-02-15 21:30:53'),(14999,'2005-08-22 07:54:47',3399,594,'2005-08-23 08:39:47',1,'2006-02-15 21:30:53'),(15000,'2005-08-22 07:54:58',3080,161,'2005-08-24 12:46:58',2,'2006-02-15 21:30:53'),(15001,'2005-08-22 08:00:49',2869,186,'2005-08-27 05:53:49',2,'2006-02-15 21:30:53'),(15002,'2005-08-22 08:06:00',4198,242,'2005-08-24 10:48:00',1,'2006-02-15 21:30:53'),(15003,'2005-08-22 08:11:24',4009,167,'2005-08-28 08:49:24',1,'2006-02-15 21:30:53'),(15004,'2005-08-22 08:15:21',4464,375,'2005-08-28 10:35:21',1,'2006-02-15 21:30:53'),(15005,'2005-08-22 08:15:44',2897,335,'2005-08-24 09:52:44',2,'2006-02-15 21:30:53'),(15006,'2005-08-22 08:20:15',2967,97,'2005-08-23 11:57:15',1,'2006-02-15 21:30:53'),(15007,'2005-08-22 08:21:21',3692,165,'2005-08-27 04:44:21',2,'2006-02-15 21:30:53'),(15008,'2005-08-22 08:24:32',961,277,'2005-08-31 13:48:32',2,'2006-02-15 21:30:53'),(15009,'2005-08-22 08:27:27',4025,325,'2005-08-26 05:57:27',2,'2006-02-15 21:30:53'),(15010,'2005-08-22 08:30:17',171,508,'2005-08-29 13:24:17',2,'2006-02-15 21:30:53'),(15011,'2005-08-22 08:31:07',2722,329,'2005-08-24 04:47:07',1,'2006-02-15 21:30:53'),(15012,'2005-08-22 08:42:32',1584,454,'2005-08-28 05:04:32',1,'2006-02-15 21:30:53'),(15013,'2005-08-22 08:42:45',141,141,'2005-08-24 05:20:45',2,'2006-02-15 21:30:53'),(15014,'2005-08-22 08:43:11',3678,373,'2005-08-31 02:55:11',1,'2006-02-15 21:30:53'),(15015,'2005-08-22 08:43:50',3067,14,'2005-08-31 06:53:50',2,'2006-02-15 21:30:53'),(15016,'2005-08-22 08:47:35',879,434,'2005-08-28 14:23:35',2,'2006-02-15 21:30:53'),(15017,'2005-08-22 08:47:44',3975,144,'2005-08-29 08:16:44',1,'2006-02-15 21:30:53'),(15018,'2005-08-22 08:52:38',394,504,'2005-08-25 08:08:38',1,'2006-02-15 21:30:53'),(15019,'2005-08-22 08:52:53',3425,450,'2005-08-25 13:07:53',2,'2006-02-15 21:30:53'),(15020,'2005-08-22 08:54:12',3460,267,'2005-08-27 04:54:12',1,'2006-02-15 21:30:53'),(15021,'2006-02-14 15:16:03',418,100,NULL,2,'2006-02-15 21:30:53'),(15022,'2005-08-22 08:55:43',249,506,'2005-08-31 05:35:43',2,'2006-02-15 21:30:53'),(15023,'2005-08-22 08:56:48',358,296,'2005-08-29 08:13:48',1,'2006-02-15 21:30:53'),(15024,'2005-08-22 08:57:10',1831,139,'2005-08-24 10:39:10',1,'2006-02-15 21:30:53'),(15025,'2005-08-22 08:57:24',2107,257,'2005-08-24 06:09:24',2,'2006-02-15 21:30:53'),(15026,'2005-08-22 09:01:52',4328,66,'2005-08-28 09:21:52',1,'2006-02-15 21:30:53'),(15027,'2005-08-22 09:03:04',326,478,'2005-08-29 04:03:04',2,'2006-02-15 21:30:53'),(15028,'2005-08-22 09:03:44',4248,37,'2005-08-30 11:28:44',1,'2006-02-15 21:30:53'),(15029,'2005-08-22 09:04:53',2234,139,'2005-08-25 09:03:53',1,'2006-02-15 21:30:53'),(15030,'2005-08-22 09:10:21',3168,341,'2005-08-24 06:00:21',2,'2006-02-15 21:30:53'),(15031,'2005-08-22 09:11:48',3926,430,'2005-08-27 06:11:48',1,'2006-02-15 21:30:53'),(15032,'2005-08-22 09:14:09',3414,467,'2005-08-25 09:50:09',2,'2006-02-15 21:30:53'),(15033,'2005-08-22 09:25:24',2431,168,'2005-08-28 09:56:24',2,'2006-02-15 21:30:53'),(15034,'2005-08-22 09:33:08',1331,235,'2005-08-29 13:04:08',1,'2006-02-15 21:30:53'),(15035,'2005-08-22 09:34:32',339,513,'2005-08-28 10:23:32',1,'2006-02-15 21:30:53'),(15036,'2005-08-22 09:36:00',874,280,'2005-08-23 08:12:00',2,'2006-02-15 21:30:53'),(15037,'2005-08-22 09:36:33',4517,234,'2005-08-31 11:20:33',2,'2006-02-15 21:30:53'),(15038,'2005-08-22 09:37:27',1685,3,'2005-08-23 14:39:27',1,'2006-02-15 21:30:53'),(15039,'2005-08-22 09:37:54',895,180,'2005-08-28 12:23:54',1,'2006-02-15 21:30:53'),(15040,'2005-08-22 09:41:09',3207,523,'2005-08-23 12:49:09',2,'2006-02-15 21:30:53'),(15041,'2005-08-22 09:43:18',1913,372,'2005-08-23 11:04:18',2,'2006-02-15 21:30:53'),(15042,'2005-08-22 09:47:37',3796,553,'2005-08-31 04:42:37',1,'2006-02-15 21:30:53'),(15043,'2005-08-22 09:49:32',3797,182,'2005-08-28 13:50:32',1,'2006-02-15 21:30:53'),(15044,'2005-08-22 09:51:54',4513,439,'2005-08-31 12:45:54',1,'2006-02-15 21:30:53'),(15045,'2005-08-22 09:53:23',3485,161,'2005-08-26 10:09:23',2,'2006-02-15 21:30:53'),(15046,'2005-08-22 09:54:54',1536,474,'2005-08-26 07:34:54',1,'2006-02-15 21:30:53'),(15047,'2005-08-22 09:57:16',1309,19,'2005-08-23 11:39:16',1,'2006-02-15 21:30:53'),(15048,'2005-08-22 10:00:04',2895,27,'2005-08-26 08:26:04',1,'2006-02-15 21:30:53'),(15049,'2005-08-22 10:06:28',1573,102,'2005-08-26 15:12:28',1,'2006-02-15 21:30:53'),(15050,'2005-08-22 10:07:52',3961,167,'2005-08-23 04:45:52',1,'2006-02-15 21:30:53'),(15051,'2005-08-22 10:08:50',1419,300,'2005-08-28 10:23:50',1,'2006-02-15 21:30:53'),(15052,'2005-08-22 10:09:19',2349,147,'2005-08-31 09:27:19',2,'2006-02-15 21:30:53'),(15053,'2005-08-22 10:13:09',1065,374,'2005-08-28 12:42:09',2,'2006-02-15 21:30:53'),(15054,'2005-08-22 10:14:33',2314,44,'2005-08-25 15:07:33',1,'2006-02-15 21:30:53'),(15055,'2005-08-22 10:14:39',623,125,'2005-08-25 07:25:39',2,'2006-02-15 21:30:53'),(15056,'2005-08-22 10:15:54',1871,503,'2005-08-25 07:21:54',1,'2006-02-15 21:30:53'),(15057,'2005-08-22 10:19:58',4534,20,'2005-08-28 05:12:58',1,'2006-02-15 21:30:53'),(15058,'2005-08-22 10:20:55',3537,288,'2005-08-26 12:37:55',1,'2006-02-15 21:30:53'),(15059,'2005-08-22 10:22:00',4079,564,'2005-08-29 07:01:00',2,'2006-02-15 21:30:53'),(15060,'2005-08-22 10:24:32',2740,63,'2005-08-31 11:17:32',2,'2006-02-15 21:30:53'),(15061,'2005-08-22 10:29:44',3436,90,'2005-08-24 14:40:44',1,'2006-02-15 21:30:53'),(15062,'2005-08-22 10:34:39',4393,139,'2005-08-26 13:09:39',2,'2006-02-15 21:30:53'),(15063,'2005-08-22 10:39:51',1159,30,'2005-08-25 16:03:51',2,'2006-02-15 21:30:53'),(15064,'2005-08-22 10:41:58',1233,425,'2005-08-28 13:34:58',2,'2006-02-15 21:30:53'),(15065,'2005-08-22 10:46:44',468,510,'2005-08-27 09:40:44',2,'2006-02-15 21:30:53'),(15066,'2005-08-22 10:49:06',2712,530,'2005-08-23 10:25:06',1,'2006-02-15 21:30:53'),(15067,'2005-08-22 10:49:21',3684,461,'2005-08-24 09:01:21',1,'2006-02-15 21:30:53'),(15068,'2005-08-22 10:50:13',3268,373,'2005-08-26 05:04:13',2,'2006-02-15 21:30:53'),(15069,'2005-08-22 10:55:42',592,568,'2005-08-28 06:59:42',2,'2006-02-15 21:30:53'),(15070,'2005-08-22 10:55:45',2687,441,'2005-08-26 09:23:45',1,'2006-02-15 21:30:53'),(15071,'2005-08-22 10:58:43',417,541,'2005-08-31 14:53:43',1,'2006-02-15 21:30:53'),(15072,'2005-08-22 10:58:45',2871,405,'2005-08-30 16:18:45',1,'2006-02-15 21:30:53'),(15073,'2005-08-22 11:01:15',3970,336,'2005-08-31 09:23:15',1,'2006-02-15 21:30:53'),(15074,'2005-08-22 11:02:52',3112,567,'2005-08-28 07:59:52',2,'2006-02-15 21:30:53'),(15075,'2005-08-22 11:04:52',1938,535,'2005-08-30 05:06:52',1,'2006-02-15 21:30:53'),(15076,'2005-08-22 11:05:34',4170,287,'2005-08-27 14:40:34',1,'2006-02-15 21:30:53'),(15077,'2005-08-22 11:09:18',3142,503,'2005-08-29 08:41:18',1,'2006-02-15 21:30:53'),(15078,'2005-08-22 11:09:31',3001,197,'2005-08-25 12:16:31',1,'2006-02-15 21:30:53'),(15079,'2005-08-22 11:09:56',4552,540,'2005-08-24 15:40:56',2,'2006-02-15 21:30:53'),(15080,'2005-08-22 11:11:51',927,133,'2005-08-23 13:09:51',1,'2006-02-15 21:30:53'),(15081,'2005-08-22 11:14:31',2501,313,'2005-08-28 14:23:31',2,'2006-02-15 21:30:53'),(15082,'2005-08-22 11:17:06',2046,137,'2005-08-28 06:40:06',1,'2006-02-15 21:30:53'),(15083,'2005-08-22 11:17:37',1691,397,'2005-08-28 06:27:37',2,'2006-02-15 21:30:53'),(15084,'2005-08-22 11:17:59',821,287,'2005-08-23 09:23:59',1,'2006-02-15 21:30:53'),(15085,'2005-08-22 11:19:22',1669,67,'2005-08-25 09:04:22',2,'2006-02-15 21:30:53'),(15086,'2005-08-22 11:21:08',264,494,'2005-08-30 08:18:08',2,'2006-02-15 21:30:53'),(15087,'2005-08-22 11:24:09',233,404,'2005-08-27 16:42:09',2,'2006-02-15 21:30:53'),(15088,'2005-08-22 11:28:26',4199,377,'2005-08-24 15:46:26',2,'2006-02-15 21:30:53'),(15089,'2005-08-22 11:34:06',3288,61,'2005-08-31 12:45:06',1,'2006-02-15 21:30:53'),(15090,'2005-08-22 11:34:33',2918,582,'2005-08-31 06:09:33',2,'2006-02-15 21:30:53'),(15091,'2005-08-22 11:34:43',2092,477,'2005-08-23 16:52:43',2,'2006-02-15 21:30:53'),(15092,'2005-08-22 11:36:16',2418,464,'2005-08-28 09:49:16',2,'2006-02-15 21:30:53'),(15093,'2005-08-22 11:39:03',3534,60,'2005-08-23 06:16:03',2,'2006-02-15 21:30:53'),(15094,'2006-02-14 15:16:03',922,424,NULL,1,'2006-02-15 21:30:53'),(15095,'2005-08-22 11:41:35',489,202,'2005-08-25 16:44:35',2,'2006-02-15 21:30:53'),(15096,'2005-08-22 11:43:04',1983,33,'2005-08-29 12:16:04',2,'2006-02-15 21:30:53'),(15097,'2005-08-22 11:43:42',2838,475,'2005-08-27 10:25:42',1,'2006-02-15 21:30:53'),(15098,'2005-08-22 11:48:19',4414,88,'2005-08-31 11:07:19',2,'2006-02-15 21:30:53'),(15099,'2005-08-22 11:49:16',1940,86,'2005-08-26 06:38:16',2,'2006-02-15 21:30:53'),(15100,'2005-08-22 11:55:03',4489,312,'2005-08-25 14:55:03',1,'2006-02-15 21:30:53'),(15101,'2005-08-22 11:56:02',683,335,'2005-08-28 13:08:02',2,'2006-02-15 21:30:53'),(15102,'2005-08-22 11:58:58',2317,555,'2005-08-29 08:37:58',1,'2006-02-15 21:30:53'),(15103,'2005-08-22 12:01:06',853,101,'2005-08-25 14:40:06',2,'2006-02-15 21:30:53'),(15104,'2005-08-22 12:01:16',4550,359,'2005-08-27 17:48:16',1,'2006-02-15 21:30:53'),(15105,'2005-08-22 12:01:33',3965,338,'2005-08-26 14:29:33',2,'2006-02-15 21:30:53'),(15106,'2005-08-22 12:01:48',399,155,'2005-08-27 16:12:48',1,'2006-02-15 21:30:53'),(15107,'2005-08-22 12:05:02',2378,376,'2005-08-23 11:09:02',1,'2006-02-15 21:30:53'),(15108,'2005-08-22 12:10:07',3463,447,'2005-08-26 14:46:07',2,'2006-02-15 21:30:53'),(15109,'2005-08-22 12:12:58',565,588,'2005-08-30 07:20:58',1,'2006-02-15 21:30:53'),(15110,'2005-08-22 12:16:46',1379,72,'2005-08-26 13:36:46',1,'2006-02-15 21:30:53'),(15111,'2005-08-22 12:21:43',4101,119,'2005-08-24 09:31:43',1,'2006-02-15 21:30:53'),(15112,'2005-08-22 12:21:49',2832,160,'2005-08-27 11:03:49',1,'2006-02-15 21:30:53'),(15113,'2005-08-22 12:23:59',4338,424,'2005-08-27 09:59:59',1,'2006-02-15 21:30:53'),(15114,'2005-08-22 12:24:55',2481,121,'2005-08-31 17:06:55',1,'2006-02-15 21:30:53'),(15115,'2005-08-22 12:28:01',1739,33,'2005-08-26 16:12:01',1,'2006-02-15 21:30:53'),(15116,'2005-08-22 12:35:40',518,217,'2005-08-23 17:58:40',1,'2006-02-15 21:30:53'),(15117,'2005-08-22 12:38:20',2502,292,'2005-08-27 07:36:20',2,'2006-02-15 21:30:53'),(15118,'2005-08-22 12:38:37',2081,473,'2005-08-29 14:01:37',2,'2006-02-15 21:30:53'),(15119,'2005-08-22 12:41:33',4526,288,'2005-08-23 14:44:33',2,'2006-02-15 21:30:53'),(15120,'2005-08-22 12:42:47',3083,11,'2005-08-23 14:21:47',1,'2006-02-15 21:30:53'),(15121,'2005-08-22 12:46:37',2981,415,'2005-08-25 17:42:37',1,'2006-02-15 21:30:53'),(15122,'2005-08-22 12:47:45',1686,91,'2005-08-29 13:18:45',2,'2006-02-15 21:30:53'),(15123,'2005-08-22 12:48:44',1455,445,'2005-08-27 11:07:44',1,'2006-02-15 21:30:53'),(15124,'2005-08-22 12:51:38',1598,39,'2005-08-26 09:05:38',1,'2006-02-15 21:30:53'),(15125,'2005-08-22 12:53:22',3942,221,'2005-08-29 18:44:22',1,'2006-02-15 21:30:53'),(15126,'2005-08-22 12:53:58',1902,459,'2005-08-28 07:39:58',1,'2006-02-15 21:30:53'),(15127,'2005-08-22 12:56:29',2397,287,'2005-08-26 10:58:29',1,'2006-02-15 21:30:53'),(15128,'2005-08-22 12:57:26',3229,457,'2005-08-30 11:35:26',2,'2006-02-15 21:30:53'),(15129,'2005-08-22 13:03:52',3782,234,'2005-08-29 10:56:52',2,'2006-02-15 21:30:53'),(15130,'2005-08-22 13:04:32',2375,536,'2005-08-30 17:24:32',1,'2006-02-15 21:30:53'),(15131,'2005-08-22 13:06:26',1930,119,'2005-08-30 16:43:26',1,'2006-02-15 21:30:53'),(15132,'2005-08-22 13:11:25',3474,393,'2005-08-27 17:04:25',2,'2006-02-15 21:30:53'),(15133,'2005-08-22 13:17:43',3408,137,'2005-08-26 08:40:43',1,'2006-02-15 21:30:53'),(15134,'2005-08-22 13:18:25',4442,22,'2005-08-29 18:03:25',1,'2006-02-15 21:30:53'),(15135,'2005-08-22 13:19:19',555,284,'2005-08-27 17:09:19',2,'2006-02-15 21:30:53'),(15136,'2005-08-22 13:19:25',2606,435,'2005-08-24 07:28:25',2,'2006-02-15 21:30:53'),(15137,'2005-08-22 13:20:28',856,241,'2005-08-26 09:35:28',1,'2006-02-15 21:30:53'),(15138,'2005-08-22 13:36:30',2467,50,'2005-08-27 15:35:30',1,'2006-02-15 21:30:53'),(15139,'2005-08-22 13:38:11',2018,237,'2005-08-30 09:00:11',1,'2006-02-15 21:30:53'),(15140,'2005-08-22 13:39:20',1402,414,'2005-08-30 18:19:20',2,'2006-02-15 21:30:53'),(15141,'2005-08-22 13:41:49',227,541,'2005-08-28 15:25:49',2,'2006-02-15 21:30:53'),(15142,'2005-08-22 13:44:32',1337,351,'2005-08-29 14:19:32',1,'2006-02-15 21:30:53'),(15143,'2005-08-22 13:46:24',1519,274,'2005-08-25 09:47:24',2,'2006-02-15 21:30:53'),(15144,'2005-08-22 13:49:18',559,527,'2005-08-26 11:11:18',2,'2006-02-15 21:30:53'),(15145,'2005-08-22 13:53:04',2179,2,'2005-08-31 15:51:04',1,'2006-02-15 21:30:53'),(15146,'2005-08-22 13:57:55',3102,72,'2005-08-28 12:57:55',2,'2006-02-15 21:30:53'),(15147,'2005-08-22 13:58:23',2553,4,'2005-08-28 14:33:23',2,'2006-02-15 21:30:53'),(15148,'2005-08-22 13:59:19',3704,359,'2005-08-31 13:59:19',2,'2006-02-15 21:30:53'),(15149,'2005-08-22 14:08:06',3059,537,'2005-08-25 08:25:06',1,'2006-02-15 21:30:53'),(15150,'2005-08-22 14:12:05',1797,161,'2005-08-27 12:47:05',1,'2006-02-15 21:30:53'),(15151,'2005-08-22 14:23:11',4070,463,'2005-08-30 14:01:11',1,'2006-02-15 21:30:53'),(15152,'2005-08-22 14:25:21',739,123,'2005-08-31 14:28:21',1,'2006-02-15 21:30:53'),(15153,'2005-08-22 14:26:01',1051,512,'2005-08-27 14:17:01',2,'2006-02-15 21:30:53'),(15154,'2005-08-22 14:27:37',3395,106,'2005-08-29 20:04:37',2,'2006-02-15 21:30:53'),(15155,'2005-08-22 14:27:46',2641,43,'2005-08-23 17:46:46',2,'2006-02-15 21:30:53'),(15156,'2005-08-22 14:29:11',1174,494,'2005-08-30 17:48:11',2,'2006-02-15 21:30:53'),(15157,'2005-08-22 14:30:09',1909,580,'2005-08-29 18:28:09',1,'2006-02-15 21:30:53'),(15158,'2005-08-22 14:30:39',3614,588,'2005-08-27 15:55:39',1,'2006-02-15 21:30:53'),(15159,'2005-08-22 14:32:25',4355,525,'2005-08-24 11:19:25',2,'2006-02-15 21:30:53'),(15160,'2005-08-22 14:33:50',4321,249,'2005-08-28 11:26:50',1,'2006-02-15 21:30:53'),(15161,'2005-08-22 14:37:22',1445,20,'2005-08-27 17:40:22',1,'2006-02-15 21:30:53'),(15162,'2005-08-22 14:41:05',1756,439,'2005-08-27 20:23:05',2,'2006-02-15 21:30:53'),(15163,'2005-08-22 14:43:13',3597,100,'2005-08-26 14:26:13',1,'2006-02-15 21:30:53'),(15164,'2005-08-22 14:47:53',997,193,'2005-08-25 16:05:53',1,'2006-02-15 21:30:53'),(15165,'2005-08-22 14:59:30',3664,168,'2005-08-29 15:46:30',2,'2006-02-15 21:30:53'),(15166,'2005-08-22 15:05:37',1530,504,'2005-08-30 12:22:37',2,'2006-02-15 21:30:53'),(15167,'2006-02-14 15:16:03',973,190,NULL,2,'2006-02-15 21:30:53'),(15168,'2005-08-22 15:14:20',3218,526,'2005-08-25 20:12:20',2,'2006-02-15 21:30:53'),(15169,'2005-08-22 15:21:56',794,76,'2005-08-28 09:40:56',1,'2006-02-15 21:30:53'),(15170,'2005-08-22 15:22:15',2123,521,'2005-08-23 20:32:15',1,'2006-02-15 21:30:53'),(15171,'2005-08-22 15:23:59',1201,119,'2005-08-28 12:05:59',2,'2006-02-15 21:30:53'),(15172,'2005-08-22 15:25:33',2367,511,'2005-08-23 17:29:33',1,'2006-02-15 21:30:53'),(15173,'2005-08-22 15:26:29',2585,338,'2005-08-29 14:03:29',1,'2006-02-15 21:30:53'),(15174,'2005-08-22 15:26:36',19,111,'2005-08-31 10:47:36',2,'2006-02-15 21:30:53'),(15175,'2005-08-22 15:29:15',4318,380,'2005-08-27 15:11:15',2,'2006-02-15 21:30:53'),(15176,'2005-08-22 15:30:25',3063,115,'2005-08-31 20:00:25',1,'2006-02-15 21:30:53'),(15177,'2005-08-22 15:34:49',838,493,'2005-08-26 12:54:49',1,'2006-02-15 21:30:53'),(15178,'2005-08-22 15:36:04',1745,15,'2005-08-26 21:00:04',2,'2006-02-15 21:30:53'),(15179,'2005-08-22 15:36:22',450,328,'2005-08-31 19:57:22',1,'2006-02-15 21:30:53'),(15180,'2005-08-22 15:42:57',234,532,'2005-08-24 12:49:57',2,'2006-02-15 21:30:53'),(15181,'2005-08-22 15:46:20',3900,266,'2005-08-27 09:56:20',1,'2006-02-15 21:30:53'),(15182,'2005-08-22 15:47:05',645,443,'2005-08-25 11:55:05',1,'2006-02-15 21:30:53'),(15183,'2005-08-22 15:49:54',2696,268,'2005-08-25 12:29:54',1,'2006-02-15 21:30:53'),(15184,'2005-08-22 15:51:12',1193,471,'2005-08-24 19:23:12',2,'2006-02-15 21:30:53'),(15185,'2005-08-22 15:52:50',2948,472,'2005-08-31 20:38:50',1,'2006-02-15 21:30:53'),(15186,'2005-08-22 15:52:57',1323,104,'2005-08-24 21:12:57',1,'2006-02-15 21:30:53'),(15187,'2005-08-22 15:53:32',2338,461,'2005-08-27 14:21:32',1,'2006-02-15 21:30:53'),(15188,'2005-08-22 15:55:48',131,478,'2005-08-29 19:10:48',1,'2006-02-15 21:30:53'),(15189,'2005-08-22 15:56:42',2559,398,'2005-08-29 12:20:42',1,'2006-02-15 21:30:53'),(15190,'2005-08-22 15:57:38',2096,84,'2005-08-24 13:46:38',1,'2006-02-15 21:30:53'),(15191,'2006-02-14 15:16:03',3688,75,NULL,1,'2006-02-15 21:30:53'),(15192,'2005-08-22 16:06:23',4213,216,'2005-08-27 13:12:23',1,'2006-02-15 21:30:53'),(15193,'2005-08-22 16:06:49',1033,40,'2005-08-25 17:23:49',1,'2006-02-15 21:30:53'),(15194,'2005-08-22 16:07:34',1217,332,'2005-08-26 19:16:34',1,'2006-02-15 21:30:53'),(15195,'2005-08-22 16:08:23',1080,508,'2005-08-30 17:56:23',2,'2006-02-15 21:30:53'),(15196,'2005-08-22 16:11:32',1413,181,'2005-08-30 22:06:32',1,'2006-02-15 21:30:53'),(15197,'2005-08-22 16:14:25',2915,159,'2005-08-26 16:22:25',2,'2006-02-15 21:30:53'),(15198,'2005-08-22 16:15:33',1253,396,'2005-08-29 20:49:33',1,'2006-02-15 21:30:53'),(15199,'2005-08-22 16:17:49',18,216,'2005-08-25 20:12:49',1,'2006-02-15 21:30:53'),(15200,'2005-08-22 16:22:53',1000,374,'2005-08-24 10:25:53',2,'2006-02-15 21:30:53'),(15201,'2005-08-22 16:24:42',4456,301,'2005-08-31 17:54:42',1,'2006-02-15 21:30:53'),(15202,'2005-08-22 16:26:53',2119,374,'2005-08-23 13:49:53',2,'2006-02-15 21:30:53'),(15203,'2005-08-22 16:28:00',743,568,'2005-08-26 16:55:00',2,'2006-02-15 21:30:53'),(15204,'2005-08-22 16:30:43',1471,317,'2005-08-26 20:37:43',2,'2006-02-15 21:30:53'),(15205,'2005-08-22 16:32:23',3276,489,'2005-08-27 16:08:23',1,'2006-02-15 21:30:53'),(15206,'2005-08-22 16:33:39',3901,524,'2005-08-31 11:41:39',1,'2006-02-15 21:30:53'),(15207,'2005-08-22 16:35:25',1149,442,'2005-08-23 14:06:25',1,'2006-02-15 21:30:53'),(15208,'2005-08-22 16:35:47',4346,267,'2005-08-30 15:16:47',1,'2006-02-15 21:30:53'),(15209,'2005-08-22 16:37:32',1620,588,'2005-08-25 19:04:32',1,'2006-02-15 21:30:53'),(15210,'2005-08-22 16:37:36',3811,332,'2005-08-29 11:54:36',1,'2006-02-15 21:30:53'),(15211,'2005-08-22 16:40:21',3025,410,'2005-08-28 13:33:21',2,'2006-02-15 21:30:53'),(15212,'2005-08-22 16:44:26',2182,562,'2005-08-27 20:26:26',1,'2006-02-15 21:30:53'),(15213,'2005-08-22 16:49:02',2002,166,'2005-08-31 20:22:02',1,'2006-02-15 21:30:53'),(15214,'2005-08-22 16:53:29',1500,574,'2005-08-24 14:17:29',1,'2006-02-15 21:30:53'),(15215,'2005-08-22 16:55:26',1906,344,'2005-08-25 20:19:26',1,'2006-02-15 21:30:53'),(15216,'2005-08-22 16:57:02',1633,166,'2005-08-24 16:11:02',2,'2006-02-15 21:30:53'),(15217,'2005-08-22 16:58:31',91,90,'2005-08-23 22:33:31',1,'2006-02-15 21:30:53'),(15218,'2005-08-22 16:59:05',10,139,'2005-08-30 17:01:05',1,'2006-02-15 21:30:53'),(15219,'2005-08-22 17:00:31',3313,544,'2005-08-31 20:16:31',1,'2006-02-15 21:30:53'),(15220,'2005-08-22 17:02:23',187,128,'2005-08-28 21:02:23',1,'2006-02-15 21:30:53'),(15221,'2005-08-22 17:12:29',110,253,'2005-08-24 20:46:29',2,'2006-02-15 21:30:53'),(15222,'2005-08-22 17:12:30',1360,390,'2005-08-27 15:10:30',2,'2006-02-15 21:30:53'),(15223,'2005-08-22 17:13:39',2263,541,'2005-08-27 11:17:39',2,'2006-02-15 21:30:53'),(15224,'2005-08-22 17:18:05',33,81,'2005-08-29 14:35:05',2,'2006-02-15 21:30:53'),(15225,'2005-08-22 17:18:32',1646,224,'2005-08-24 17:25:32',1,'2006-02-15 21:30:53'),(15226,'2005-08-22 17:20:17',318,54,'2005-08-31 15:36:17',1,'2006-02-15 21:30:53'),(15227,'2005-08-22 17:22:41',2987,151,'2005-08-23 20:59:41',1,'2006-02-15 21:30:53'),(15228,'2005-08-22 17:27:23',2485,48,'2005-08-29 11:38:23',2,'2006-02-15 21:30:53'),(15229,'2005-08-22 17:30:25',320,63,'2005-08-23 14:13:25',1,'2006-02-15 21:30:53'),(15230,'2005-08-22 17:31:41',2572,466,'2005-08-25 21:57:41',2,'2006-02-15 21:30:53'),(15231,'2005-08-22 17:32:57',2980,187,'2005-08-25 13:06:57',1,'2006-02-15 21:30:53'),(15232,'2005-08-22 17:37:02',61,5,'2005-08-25 18:45:02',1,'2006-02-15 21:30:53'),(15233,'2005-08-22 17:41:53',4405,197,'2005-08-24 12:59:53',2,'2006-02-15 21:30:53'),(15234,'2006-02-14 15:16:03',908,228,NULL,2,'2006-02-15 21:30:53'),(15235,'2005-08-22 17:43:12',2726,416,'2005-08-29 23:03:12',2,'2006-02-15 21:30:53'),(15236,'2005-08-22 17:44:27',4124,557,'2005-08-24 23:25:27',1,'2006-02-15 21:30:53'),(15237,'2005-08-22 17:44:30',4485,148,'2005-08-24 12:51:30',1,'2006-02-15 21:30:53'),(15238,'2005-08-22 17:46:12',403,70,'2005-08-29 16:41:12',1,'2006-02-15 21:30:53'),(15239,'2005-08-22 17:46:17',1809,501,'2005-08-26 19:03:17',1,'2006-02-15 21:30:53'),(15240,'2005-08-22 17:46:41',2014,11,'2005-08-23 15:08:41',2,'2006-02-15 21:30:53'),(15241,'2005-08-22 17:47:40',832,337,'2005-08-29 15:28:40',2,'2006-02-15 21:30:53'),(15242,'2005-08-22 17:48:10',2106,364,'2005-08-27 23:32:10',1,'2006-02-15 21:30:53'),(15243,'2005-08-22 17:48:28',4408,308,'2005-08-31 13:22:28',1,'2006-02-15 21:30:53'),(15244,'2005-08-22 17:48:42',1486,271,'2005-08-28 13:17:42',2,'2006-02-15 21:30:53'),(15245,'2005-08-22 17:49:35',2545,298,'2005-08-26 18:25:35',2,'2006-02-15 21:30:53'),(15246,'2005-08-22 17:50:49',3786,100,'2005-08-30 22:21:49',1,'2006-02-15 21:30:53'),(15247,'2005-08-22 17:52:05',4572,250,'2005-08-31 21:37:05',1,'2006-02-15 21:30:53'),(15248,'2005-08-22 17:53:06',977,20,'2005-08-25 18:43:06',2,'2006-02-15 21:30:53'),(15249,'2005-08-22 17:58:27',121,444,'2005-08-30 14:55:27',1,'2006-02-15 21:30:53'),(15250,'2005-08-22 18:03:11',2176,143,'2005-08-27 12:19:11',2,'2006-02-15 21:30:53'),(15251,'2005-08-22 18:03:57',1994,285,'2005-08-23 20:56:57',2,'2006-02-15 21:30:53'),(15252,'2005-08-22 18:04:22',1821,453,'2005-08-25 17:14:22',2,'2006-02-15 21:30:53'),(15253,'2005-08-22 18:05:21',4143,333,'2005-08-23 18:06:21',2,'2006-02-15 21:30:53'),(15254,'2005-08-22 18:13:07',3762,209,'2005-08-24 21:55:07',1,'2006-02-15 21:30:53'),(15255,'2005-08-22 18:16:50',3415,84,'2005-08-28 14:14:50',2,'2006-02-15 21:30:53'),(15256,'2005-08-22 18:20:07',1873,198,'2005-08-28 12:57:07',1,'2006-02-15 21:30:53'),(15257,'2005-08-22 18:21:04',915,223,'2005-08-30 20:13:04',1,'2006-02-15 21:30:53'),(15258,'2005-08-22 18:22:44',788,293,'2005-08-25 16:54:44',1,'2006-02-15 21:30:53'),(15259,'2005-08-22 18:23:23',3261,488,'2005-08-27 13:06:23',1,'2006-02-15 21:30:53'),(15260,'2005-08-22 18:24:16',3135,274,'2005-08-24 21:26:16',1,'2006-02-15 21:30:53'),(15261,'2005-08-22 18:24:34',2200,140,'2005-08-27 19:53:34',1,'2006-02-15 21:30:53'),(15262,'2005-08-22 18:25:21',2534,298,'2005-08-28 22:19:21',1,'2006-02-15 21:30:53'),(15263,'2005-08-22 18:27:33',184,324,'2005-08-30 14:05:33',1,'2006-02-15 21:30:53'),(15264,'2005-08-22 18:27:38',4459,440,'2005-08-24 12:39:38',1,'2006-02-15 21:30:53'),(15265,'2005-08-22 18:35:59',1763,512,'2005-08-28 21:18:59',2,'2006-02-15 21:30:53'),(15266,'2005-08-22 18:37:24',1870,124,'2005-08-23 17:34:24',2,'2006-02-15 21:30:53'),(15267,'2005-08-22 18:37:48',2966,153,'2005-08-24 00:22:48',1,'2006-02-15 21:30:53'),(15268,'2005-08-22 18:39:11',1245,301,'2005-08-26 21:46:11',1,'2006-02-15 21:30:53'),(15269,'2005-08-22 18:39:44',524,275,'2005-08-24 17:29:44',1,'2006-02-15 21:30:53'),(15270,'2005-08-22 18:48:42',4123,262,'2005-08-28 15:38:42',2,'2006-02-15 21:30:53'),(15271,'2005-08-22 18:48:48',4232,59,'2005-08-30 00:45:48',2,'2006-02-15 21:30:53'),(15272,'2005-08-22 18:49:40',1664,422,'2005-08-28 21:22:40',1,'2006-02-15 21:30:53'),(15273,'2005-08-22 18:53:28',2558,422,'2005-08-30 18:58:28',2,'2006-02-15 21:30:53'),(15274,'2005-08-22 18:55:52',3519,515,'2005-08-23 20:02:52',1,'2006-02-15 21:30:53'),(15275,'2005-08-22 18:57:39',1522,597,'2005-08-23 19:00:39',2,'2006-02-15 21:30:53'),(15276,'2005-08-22 18:59:01',4523,490,'2005-08-23 19:49:01',2,'2006-02-15 21:30:53'),(15277,'2005-08-22 19:02:48',1780,217,'2005-08-31 18:53:48',2,'2006-02-15 21:30:53'),(15278,'2005-08-22 19:06:47',2454,472,'2005-08-25 01:00:47',2,'2006-02-15 21:30:53'),(15279,'2005-08-22 19:08:49',1088,363,'2005-08-30 00:38:49',2,'2006-02-15 21:30:53'),(15280,'2005-08-22 19:09:52',3464,317,'2005-08-28 00:39:52',1,'2006-02-15 21:30:53'),(15281,'2005-08-22 19:10:26',3992,543,'2005-08-27 21:55:26',2,'2006-02-15 21:30:53'),(15282,'2006-02-14 15:16:03',1932,163,NULL,1,'2006-02-15 21:30:53'),(15283,'2005-08-22 19:16:04',1688,219,'2005-08-31 21:05:04',1,'2006-02-15 21:30:53'),(15284,'2005-08-22 19:17:08',2265,393,'2005-08-29 13:28:08',2,'2006-02-15 21:30:53'),(15285,'2005-08-22 19:17:24',481,233,'2005-08-25 00:25:24',1,'2006-02-15 21:30:53'),(15286,'2005-08-22 19:17:56',3731,74,'2005-08-29 16:08:56',2,'2006-02-15 21:30:53'),(15287,'2005-08-22 19:19:37',308,535,'2005-08-29 16:05:37',1,'2006-02-15 21:30:53'),(15288,'2005-08-22 19:23:58',1999,475,'2005-08-26 23:28:58',1,'2006-02-15 21:30:53'),(15289,'2005-08-22 19:27:24',1026,513,'2005-08-30 22:21:24',1,'2006-02-15 21:30:53'),(15290,'2005-08-22 19:28:02',270,404,'2005-08-31 20:04:02',2,'2006-02-15 21:30:53'),(15291,'2005-08-22 19:28:04',1461,494,'2005-08-26 15:07:04',1,'2006-02-15 21:30:53'),(15292,'2005-08-22 19:28:56',3072,337,'2005-08-28 22:39:56',2,'2006-02-15 21:30:53'),(15293,'2006-02-14 15:16:03',1219,263,NULL,2,'2006-02-15 21:30:53'),(15294,'2006-02-14 15:16:03',70,108,NULL,1,'2006-02-15 21:30:53'),(15295,'2005-08-22 19:36:21',2164,186,'2005-08-31 00:07:21',2,'2006-02-15 21:30:53'),(15296,'2005-08-22 19:37:20',2715,55,'2005-08-24 15:16:20',1,'2006-02-15 21:30:53'),(15297,'2006-02-14 15:16:03',3192,327,NULL,2,'2006-02-15 21:30:53'),(15298,'2005-08-22 19:41:37',1446,1,'2005-08-28 22:49:37',1,'2006-02-15 21:30:53'),(15299,'2005-08-22 19:42:57',767,381,'2005-08-23 15:29:57',2,'2006-02-15 21:30:53'),(15300,'2005-08-22 19:44:00',2319,399,'2005-08-25 22:49:00',2,'2006-02-15 21:30:53'),(15301,'2005-08-22 19:44:16',619,454,'2005-08-26 22:57:16',2,'2006-02-15 21:30:53'),(15302,'2005-08-22 19:44:53',188,320,'2005-08-24 18:13:53',2,'2006-02-15 21:30:53'),(15303,'2005-08-22 19:44:59',1672,390,'2005-08-30 21:59:59',1,'2006-02-15 21:30:53'),(15304,'2005-08-22 19:45:57',4332,112,'2005-08-28 00:21:57',2,'2006-02-15 21:30:53'),(15305,'2005-08-22 19:46:05',671,529,'2005-08-27 19:11:05',2,'2006-02-15 21:30:53'),(15306,'2005-08-22 19:46:36',521,340,'2005-08-27 14:09:36',1,'2006-02-15 21:30:53'),(15307,'2005-08-22 19:54:26',4525,598,'2005-08-29 01:38:26',2,'2006-02-15 21:30:53'),(15308,'2005-08-22 19:54:31',987,329,'2005-08-26 23:09:31',1,'2006-02-15 21:30:53'),(15309,'2005-08-22 19:54:52',2743,141,'2005-08-24 23:00:52',2,'2006-02-15 21:30:53'),(15310,'2005-08-22 19:56:41',2546,360,'2005-08-24 16:32:41',2,'2006-02-15 21:30:53'),(15311,'2005-08-22 19:56:52',3612,176,'2005-08-31 20:15:52',2,'2006-02-15 21:30:53'),(15312,'2005-08-22 19:58:15',2509,280,'2005-08-25 19:21:15',2,'2006-02-15 21:30:53'),(15313,'2005-08-22 19:59:42',2587,333,'2005-08-24 15:03:42',2,'2006-02-15 21:30:53'),(15314,'2006-02-14 15:16:03',2754,412,NULL,1,'2006-02-15 21:30:53'),(15315,'2005-08-22 20:03:46',312,1,'2005-08-30 01:51:46',2,'2006-02-15 21:30:53'),(15316,'2005-08-22 20:07:03',1830,422,'2005-08-27 18:45:03',1,'2006-02-15 21:30:53'),(15317,'2005-08-22 20:14:13',2325,512,'2005-08-29 18:32:13',1,'2006-02-15 21:30:53'),(15318,'2005-08-22 20:15:16',1738,60,'2005-08-25 14:17:16',1,'2006-02-15 21:30:53'),(15319,'2005-08-22 20:17:17',3041,188,'2005-08-25 01:06:17',2,'2006-02-15 21:30:53'),(15320,'2005-08-22 20:17:49',648,407,'2005-08-28 17:31:49',1,'2006-02-15 21:30:53'),(15321,'2005-08-22 20:20:04',4152,384,'2005-08-24 23:26:04',2,'2006-02-15 21:30:53'),(15322,'2005-08-22 20:20:30',3553,263,'2005-08-25 01:26:30',2,'2006-02-15 21:30:53'),(15323,'2005-08-22 20:22:40',1153,178,'2005-08-26 00:35:40',1,'2006-02-15 21:30:53'),(15324,'2005-08-22 20:23:13',161,93,'2005-08-29 18:23:13',1,'2006-02-15 21:30:53'),(15325,'2005-08-22 20:27:38',3549,74,'2005-08-23 15:24:38',1,'2006-02-15 21:30:53'),(15326,'2006-02-14 15:16:03',3320,58,NULL,1,'2006-02-15 21:30:53'),(15327,'2005-08-22 20:31:24',1018,450,'2005-08-30 23:52:24',1,'2006-02-15 21:30:53'),(15328,'2005-08-22 20:31:38',4546,274,'2005-08-29 20:17:38',1,'2006-02-15 21:30:53'),(15329,'2005-08-22 20:32:39',1900,521,'2005-08-23 17:15:39',1,'2006-02-15 21:30:53'),(15330,'2005-08-22 20:35:30',689,427,'2005-08-30 21:54:30',1,'2006-02-15 21:30:53'),(15331,'2005-08-22 20:37:57',146,147,'2005-08-25 21:56:57',1,'2006-02-15 21:30:53'),(15332,'2005-08-22 20:41:53',3368,162,'2005-08-24 01:45:53',1,'2006-02-15 21:30:53'),(15333,'2005-08-22 20:44:06',1839,142,'2005-08-29 22:34:06',2,'2006-02-15 21:30:53'),(15334,'2005-08-22 20:44:35',3882,407,'2005-08-29 23:03:35',2,'2006-02-15 21:30:53'),(15335,'2005-08-22 20:44:55',1593,363,'2005-08-28 21:43:55',1,'2006-02-15 21:30:53'),(15336,'2005-08-22 20:47:48',490,461,'2005-08-31 18:17:48',2,'2006-02-15 21:30:53'),(15337,'2005-08-22 20:49:51',280,237,'2005-08-26 23:27:51',1,'2006-02-15 21:30:53'),(15338,'2005-08-22 20:51:24',502,13,'2005-08-24 23:41:24',2,'2006-02-15 21:30:53'),(15339,'2005-08-22 20:52:12',1660,331,'2005-08-26 00:36:12',2,'2006-02-15 21:30:53'),(15340,'2005-08-22 20:55:56',3653,313,'2005-08-27 18:52:56',1,'2006-02-15 21:30:53'),(15341,'2005-08-22 20:56:31',3359,91,'2005-08-30 17:25:31',1,'2006-02-15 21:30:53'),(15342,'2005-08-22 20:56:41',3287,459,'2005-08-26 22:51:41',2,'2006-02-15 21:30:53'),(15343,'2005-08-22 21:01:25',2589,538,'2005-08-28 16:15:25',1,'2006-02-15 21:30:53'),(15344,'2005-08-22 21:01:48',3560,193,'2005-08-27 15:47:48',1,'2006-02-15 21:30:53'),(15345,'2005-08-22 21:05:50',3481,277,'2005-08-26 20:30:50',1,'2006-02-15 21:30:53'),(15346,'2005-08-22 21:06:00',3525,266,'2005-08-28 22:08:00',1,'2006-02-15 21:30:53'),(15347,'2005-08-22 21:12:19',3764,519,'2005-08-24 20:12:19',1,'2006-02-15 21:30:53'),(15348,'2005-08-22 21:13:46',3846,587,'2005-08-24 17:06:46',1,'2006-02-15 21:30:53'),(15349,'2005-08-22 21:13:51',4055,587,'2005-08-23 20:55:51',1,'2006-02-15 21:30:53'),(15350,'2005-08-22 21:15:29',1170,488,'2005-08-24 02:56:29',1,'2006-02-15 21:30:53'),(15351,'2005-08-22 21:15:46',3260,154,'2005-08-23 17:38:46',1,'2006-02-15 21:30:53'),(15352,'2005-08-22 21:16:54',16,560,'2005-08-31 00:38:54',2,'2006-02-15 21:30:53'),(15353,'2005-08-22 21:18:08',3470,368,'2005-08-25 20:29:08',2,'2006-02-15 21:30:53'),(15354,'2005-08-22 21:18:59',4212,412,'2005-08-27 20:12:59',2,'2006-02-15 21:30:53'),(15355,'2005-08-22 21:19:24',3477,493,'2005-08-28 20:36:24',2,'2006-02-15 21:30:53'),(15356,'2005-08-22 21:24:19',4507,539,'2005-08-25 22:32:19',2,'2006-02-15 21:30:53'),(15357,'2005-08-22 21:28:59',727,24,'2005-08-25 17:15:59',1,'2006-02-15 21:30:53'),(15358,'2005-08-22 21:29:14',822,448,'2005-08-31 00:10:14',2,'2006-02-15 21:30:53'),(15359,'2005-08-22 21:34:00',4505,77,'2005-08-29 18:59:00',1,'2006-02-15 21:30:53'),(15360,'2005-08-22 21:36:51',1950,531,'2005-08-24 16:46:51',1,'2006-02-15 21:30:53'),(15361,'2005-08-22 21:39:45',1407,380,'2005-08-23 17:32:45',2,'2006-02-15 21:30:53'),(15362,'2005-08-22 21:40:20',1023,497,'2005-08-29 15:55:20',1,'2006-02-15 21:30:53'),(15363,'2005-08-22 21:41:40',2326,480,'2005-08-23 21:40:40',1,'2006-02-15 21:30:53'),(15364,'2005-08-22 21:41:41',4184,204,'2005-08-28 00:49:41',1,'2006-02-15 21:30:53'),(15365,'2005-08-22 21:42:17',3382,327,'2005-09-01 03:14:17',2,'2006-02-15 21:30:53'),(15366,'2005-08-22 21:45:57',1453,374,'2005-08-30 16:35:57',1,'2006-02-15 21:30:53'),(15367,'2005-08-22 21:47:53',160,355,'2005-08-27 17:54:53',2,'2006-02-15 21:30:53'),(15368,'2005-08-22 21:57:15',1130,370,'2005-08-29 16:28:15',1,'2006-02-15 21:30:53'),(15369,'2005-08-22 21:58:06',881,121,'2005-08-26 00:27:06',2,'2006-02-15 21:30:53'),(15370,'2005-08-22 21:59:29',67,10,'2005-08-27 16:32:29',1,'2006-02-15 21:30:53'),(15371,'2006-02-14 15:16:03',3672,94,NULL,2,'2006-02-15 21:30:53'),(15372,'2005-08-22 21:59:51',3876,273,'2005-08-23 17:01:51',1,'2006-02-15 21:30:53'),(15373,'2005-08-22 22:08:11',4439,14,'2005-08-24 01:05:11',2,'2006-02-15 21:30:53'),(15374,'2005-08-22 22:09:09',4275,8,'2005-08-31 01:10:09',1,'2006-02-15 21:30:53'),(15375,'2005-08-22 22:12:02',3864,191,'2005-08-24 00:50:02',2,'2006-02-15 21:30:53'),(15376,'2005-08-22 22:21:35',2963,390,'2005-08-28 20:56:35',1,'2006-02-15 21:30:53'),(15377,'2005-08-22 22:22:33',3405,551,'2005-08-29 18:41:33',1,'2006-02-15 21:30:53'),(15378,'2005-08-22 22:25:17',1483,340,'2005-08-30 17:04:17',1,'2006-02-15 21:30:53'),(15379,'2005-08-22 22:26:13',1899,148,'2005-08-31 18:19:13',1,'2006-02-15 21:30:53'),(15380,'2005-08-22 22:28:15',3642,423,'2005-08-28 23:21:15',1,'2006-02-15 21:30:53'),(15381,'2005-08-22 22:28:36',845,110,'2005-08-24 19:26:36',2,'2006-02-15 21:30:53'),(15382,'2005-08-22 22:30:50',333,376,'2005-08-24 04:07:50',2,'2006-02-15 21:30:53'),(15383,'2005-08-22 22:31:20',686,405,'2005-08-28 17:43:20',1,'2006-02-15 21:30:53'),(15384,'2005-08-22 22:34:44',3208,26,'2005-08-23 23:25:44',2,'2006-02-15 21:30:53'),(15385,'2005-08-22 22:37:34',140,434,'2005-08-26 00:36:34',2,'2006-02-15 21:30:53'),(15386,'2005-08-22 22:41:14',3056,327,'2005-08-29 22:29:14',1,'2006-02-15 21:30:53'),(15387,'2005-08-22 22:49:13',3879,323,'2005-08-29 01:49:13',2,'2006-02-15 21:30:53'),(15388,'2005-08-22 22:49:23',3995,50,'2005-09-01 03:50:23',2,'2006-02-15 21:30:53'),(15389,'2005-08-22 22:51:13',2077,231,'2005-08-28 23:46:13',1,'2006-02-15 21:30:53'),(15390,'2005-08-22 22:57:25',462,551,'2005-08-31 18:06:25',1,'2006-02-15 21:30:53'),(15391,'2005-08-22 23:01:45',3918,482,'2005-08-29 02:59:45',2,'2006-02-15 21:30:53'),(15392,'2005-08-22 23:02:15',538,410,'2005-09-01 01:14:15',2,'2006-02-15 21:30:53'),(15393,'2005-08-22 23:04:09',2924,443,'2005-08-27 02:23:09',2,'2006-02-15 21:30:53'),(15394,'2005-08-22 23:04:21',3455,507,'2005-08-25 20:53:21',2,'2006-02-15 21:30:53'),(15395,'2005-08-22 23:06:25',2880,526,'2005-08-30 19:18:25',1,'2006-02-15 21:30:53'),(15396,'2005-08-22 23:07:57',4050,319,'2005-08-28 19:39:57',2,'2006-02-15 21:30:53'),(15397,'2005-08-22 23:08:46',1482,261,'2005-08-25 20:58:46',1,'2006-02-15 21:30:53'),(15398,'2005-08-22 23:10:49',4451,109,'2005-08-28 00:49:49',2,'2006-02-15 21:30:53'),(15399,'2005-08-22 23:11:59',3858,379,'2005-08-26 22:16:59',2,'2006-02-15 21:30:53'),(15400,'2005-08-22 23:13:03',2664,473,'2005-08-28 18:34:03',1,'2006-02-15 21:30:53'),(15401,'2005-08-22 23:13:10',1721,103,'2005-09-01 03:44:10',1,'2006-02-15 21:30:53'),(15402,'2005-08-22 23:17:41',1575,293,'2005-08-30 20:07:41',2,'2006-02-15 21:30:53'),(15403,'2005-08-22 23:18:10',4315,581,'2005-08-23 18:08:10',2,'2006-02-15 21:30:53'),(15404,'2005-08-22 23:19:44',3557,211,'2005-08-30 19:58:44',2,'2006-02-15 21:30:53'),(15405,'2005-08-22 23:20:41',3263,596,'2005-08-25 23:53:41',1,'2006-02-15 21:30:53'),(15406,'2005-08-22 23:21:22',400,227,'2005-08-28 22:21:22',1,'2006-02-15 21:30:53'),(15407,'2006-02-14 15:16:03',3330,42,NULL,2,'2006-02-15 21:30:53'),(15408,'2005-08-22 23:26:32',165,156,'2005-08-30 20:22:32',1,'2006-02-15 21:30:53'),(15409,'2005-08-22 23:26:32',560,188,'2005-08-24 22:44:32',1,'2006-02-15 21:30:53'),(15410,'2005-08-22 23:27:43',2052,403,'2005-08-29 05:12:43',2,'2006-02-15 21:30:53'),(15411,'2005-08-22 23:35:41',4423,461,'2005-08-26 00:51:41',1,'2006-02-15 21:30:53'),(15412,'2005-08-22 23:37:11',1267,199,'2005-08-28 23:26:11',2,'2006-02-15 21:30:53'),(15413,'2005-08-22 23:38:01',2494,476,'2005-08-23 19:27:01',2,'2006-02-15 21:30:53'),(15414,'2005-08-22 23:43:54',718,532,'2005-08-30 18:26:54',1,'2006-02-15 21:30:53'),(15415,'2005-08-22 23:48:56',4176,204,'2005-09-01 02:05:56',1,'2006-02-15 21:30:53'),(15416,'2005-08-22 23:51:23',1167,383,'2005-08-29 20:03:23',1,'2006-02-15 21:30:53'),(15417,'2005-08-22 23:54:04',1826,305,'2005-08-26 22:25:04',1,'2006-02-15 21:30:53'),(15418,'2005-08-22 23:54:14',808,205,'2005-08-28 04:23:14',2,'2006-02-15 21:30:53'),(15419,'2005-08-22 23:54:36',1120,450,'2005-08-25 00:52:36',1,'2006-02-15 21:30:53'),(15420,'2005-08-22 23:55:51',1396,161,'2005-08-31 20:09:51',2,'2006-02-15 21:30:53'),(15421,'2005-08-22 23:56:37',3,541,'2005-08-25 18:58:37',2,'2006-02-15 21:30:53'),(15422,'2005-08-22 23:58:09',2601,309,'2005-08-30 19:03:09',2,'2006-02-15 21:30:53'),(15423,'2006-02-14 15:16:03',1786,596,NULL,1,'2006-02-15 21:30:53'),(15424,'2005-08-23 00:03:01',3452,138,'2005-08-27 23:27:01',2,'2006-02-15 21:30:53'),(15425,'2005-08-23 00:05:57',551,259,'2005-09-01 05:08:57',1,'2006-02-15 21:30:53'),(15426,'2005-08-23 00:07:19',3280,347,'2005-08-26 23:19:19',1,'2006-02-15 21:30:53'),(15427,'2005-08-23 00:07:53',2775,448,'2005-09-01 02:55:53',2,'2006-02-15 21:30:53'),(15428,'2005-08-23 00:11:52',4379,402,'2005-08-24 02:35:52',1,'2006-02-15 21:30:53'),(15429,'2005-08-23 00:20:31',740,241,'2005-08-23 20:22:31',1,'2006-02-15 21:30:53'),(15430,'2006-02-14 15:16:03',4353,282,NULL,1,'2006-02-15 21:30:53'),(15431,'2005-08-23 00:26:47',3251,550,'2005-08-31 23:26:47',2,'2006-02-15 21:30:53'),(15432,'2005-08-23 00:26:52',1896,117,'2005-08-27 06:11:52',1,'2006-02-15 21:30:53'),(15433,'2005-08-23 00:27:18',155,198,'2005-08-26 21:36:18',1,'2006-02-15 21:30:53'),(15434,'2005-08-23 00:28:16',4378,518,'2005-08-26 04:27:16',2,'2006-02-15 21:30:53'),(15435,'2005-08-23 00:28:19',2103,468,'2005-08-26 00:44:19',2,'2006-02-15 21:30:53'),(15436,'2005-08-23 00:30:26',1527,505,'2005-08-28 06:29:26',1,'2006-02-15 21:30:53'),(15437,'2005-08-23 00:31:09',4236,368,'2005-08-30 06:17:09',2,'2006-02-15 21:30:53'),(15438,'2005-08-23 00:31:57',2030,46,'2005-08-26 20:02:57',1,'2006-02-15 21:30:53'),(15439,'2005-08-23 00:34:28',3848,136,'2005-08-27 01:07:28',1,'2006-02-15 21:30:53'),(15440,'2005-08-23 00:37:21',2254,559,'2005-08-24 23:24:21',1,'2006-02-15 21:30:53'),(15441,'2006-02-14 15:16:03',258,422,NULL,2,'2006-02-15 21:30:53'),(15442,'2005-08-23 00:42:49',1452,42,'2005-08-27 00:35:49',1,'2006-02-15 21:30:53'),(15443,'2005-08-23 00:44:15',742,598,'2005-09-01 05:33:15',2,'2006-02-15 21:30:53'),(15444,'2005-08-23 00:46:52',959,153,'2005-08-29 20:37:52',2,'2006-02-15 21:30:53'),(15445,'2005-08-23 00:48:29',196,28,'2005-08-28 00:33:29',1,'2006-02-15 21:30:53'),(15446,'2005-08-23 00:49:24',503,379,'2005-08-26 02:09:24',2,'2006-02-15 21:30:53'),(15447,'2005-08-23 00:53:57',4090,331,'2005-08-29 06:19:57',2,'2006-02-15 21:30:53'),(15448,'2005-08-23 00:55:24',2903,490,'2005-08-25 02:20:24',1,'2006-02-15 21:30:53'),(15449,'2005-08-23 00:55:43',2856,461,'2005-08-28 03:41:43',1,'2006-02-15 21:30:53'),(15450,'2005-08-23 00:56:01',1102,322,'2005-08-24 01:00:01',2,'2006-02-15 21:30:53'),(15451,'2005-08-23 00:56:27',231,514,'2005-08-24 00:15:27',2,'2006-02-15 21:30:53'),(15452,'2005-08-23 00:57:12',717,115,'2005-08-28 00:19:12',1,'2006-02-15 21:30:53'),(15453,'2005-08-23 01:01:01',2,359,'2005-08-30 20:08:01',1,'2006-02-15 21:30:53'),(15454,'2006-02-14 15:16:03',2946,142,NULL,2,'2006-02-15 21:30:53'),(15455,'2005-08-23 01:05:00',3991,238,'2005-08-26 22:56:00',1,'2006-02-15 21:30:53'),(15456,'2005-08-23 01:07:01',2451,262,'2005-08-24 23:28:01',2,'2006-02-15 21:30:53'),(15457,'2005-08-23 01:07:37',4539,306,'2005-08-26 19:46:37',1,'2006-02-15 21:30:53'),(15458,'2006-02-14 15:16:03',25,590,NULL,2,'2006-02-15 21:30:53'),(15459,'2005-08-23 01:09:48',2058,346,'2005-08-24 04:52:48',1,'2006-02-15 21:30:53'),(15460,'2005-08-23 01:10:42',2907,20,'2005-08-28 20:49:42',2,'2006-02-15 21:30:53'),(15461,'2005-08-23 01:13:52',4542,103,'2005-08-30 00:44:52',1,'2006-02-15 21:30:53'),(15462,'2005-08-23 01:14:01',3267,389,'2005-08-29 19:52:01',1,'2006-02-15 21:30:53'),(15463,'2005-08-23 01:15:07',863,127,'2005-08-29 06:50:07',1,'2006-02-15 21:30:53'),(15464,'2005-08-23 01:15:18',3235,62,'2005-08-29 02:58:18',2,'2006-02-15 21:30:53'),(15465,'2005-08-23 01:16:33',362,520,'2005-08-28 20:08:33',2,'2006-02-15 21:30:53'),(15466,'2005-08-23 01:16:55',571,418,'2005-08-29 22:57:55',1,'2006-02-15 21:30:53'),(15467,'2005-08-23 01:22:12',3658,103,'2005-08-29 23:42:12',2,'2006-02-15 21:30:53'),(15468,'2005-08-23 01:25:30',2440,399,'2005-08-28 01:40:30',2,'2006-02-15 21:30:53'),(15469,'2005-08-23 01:29:59',1939,597,'2005-08-27 04:02:59',1,'2006-02-15 21:30:53'),(15470,'2005-08-23 01:35:12',3009,416,'2005-09-01 05:33:12',1,'2006-02-15 21:30:53'),(15471,'2005-08-23 01:38:48',2591,139,'2005-08-31 19:47:48',1,'2006-02-15 21:30:53'),(15472,'2005-08-23 01:39:05',4293,226,'2005-08-25 04:43:05',1,'2006-02-15 21:30:53'),(15473,'2005-08-23 01:39:10',356,259,'2005-08-25 03:48:10',1,'2006-02-15 21:30:53'),(15474,'2005-08-23 01:39:10',3015,188,'2005-08-23 21:46:10',2,'2006-02-15 21:30:53'),(15475,'2005-08-23 01:44:43',4503,562,'2005-08-23 23:53:43',2,'2006-02-15 21:30:53'),(15476,'2005-08-23 01:45:07',2478,433,'2005-08-26 21:07:07',2,'2006-02-15 21:30:53'),(15477,'2005-08-23 01:46:35',2406,142,'2005-08-28 22:12:35',1,'2006-02-15 21:30:53'),(15478,'2005-08-23 01:50:31',4563,167,'2005-08-27 21:40:31',2,'2006-02-15 21:30:53'),(15479,'2005-08-23 01:50:53',4182,149,'2005-08-29 00:53:53',1,'2006-02-15 21:30:53'),(15480,'2005-08-23 01:57:20',3298,577,'2005-08-26 04:43:20',2,'2006-02-15 21:30:53'),(15481,'2005-08-23 01:59:14',3262,414,'2005-08-27 04:38:14',1,'2006-02-15 21:30:53'),(15482,'2005-08-23 02:01:20',3923,181,'2005-08-24 03:25:20',2,'2006-02-15 21:30:53'),(15483,'2005-08-23 02:02:53',2970,173,'2005-08-26 04:13:53',1,'2006-02-15 21:30:53'),(15484,'2005-08-23 02:04:49',642,342,'2005-08-24 05:46:49',1,'2006-02-15 21:30:53'),(15485,'2005-08-23 02:04:57',281,114,'2005-08-28 07:05:57',2,'2006-02-15 21:30:53'),(15486,'2005-08-23 02:05:20',1666,502,'2005-08-29 07:52:20',2,'2006-02-15 21:30:53'),(15487,'2005-08-23 02:05:51',2636,469,'2005-08-25 04:45:51',1,'2006-02-15 21:30:53'),(15488,'2005-08-23 02:06:01',4535,385,'2005-08-29 21:35:01',2,'2006-02-15 21:30:53'),(15489,'2005-08-23 02:06:41',764,285,'2005-08-25 06:50:41',1,'2006-02-15 21:30:53'),(15490,'2005-08-23 02:08:18',3922,493,'2005-08-30 06:15:18',1,'2006-02-15 21:30:53'),(15491,'2005-08-23 02:08:40',2059,28,'2005-08-23 20:23:40',2,'2006-02-15 21:30:53'),(15492,'2005-08-23 02:13:46',1298,520,'2005-08-26 21:53:46',2,'2006-02-15 21:30:53'),(15493,'2005-08-23 02:20:53',3521,308,'2005-08-25 23:02:53',1,'2006-02-15 21:30:53'),(15494,'2005-08-23 02:25:09',2968,455,'2005-08-27 00:18:09',1,'2006-02-15 21:30:53'),(15495,'2005-08-23 02:26:10',4310,193,'2005-08-30 01:07:10',2,'2006-02-15 21:30:53'),(15496,'2005-08-23 02:30:23',1863,275,'2005-08-31 03:31:23',2,'2006-02-15 21:30:53'),(15497,'2006-02-14 15:16:03',363,107,NULL,1,'2006-02-15 21:30:53'),(15498,'2005-08-23 02:33:27',1583,83,'2005-08-23 22:30:27',1,'2006-02-15 21:30:53'),(15499,'2005-08-23 02:37:19',630,488,'2005-08-23 20:57:19',1,'2006-02-15 21:30:53'),(15500,'2005-08-23 02:39:37',886,74,'2005-08-27 06:42:37',1,'2006-02-15 21:30:53'),(15501,'2005-08-23 02:39:56',4468,138,'2005-08-25 04:39:56',1,'2006-02-15 21:30:53'),(15502,'2005-08-23 02:40:04',3219,433,'2005-08-31 00:36:04',2,'2006-02-15 21:30:53'),(15503,'2005-08-23 02:44:49',4519,582,'2005-08-27 06:33:49',2,'2006-02-15 21:30:53'),(15504,'2005-08-23 02:45:21',1967,315,'2005-09-01 03:24:21',2,'2006-02-15 21:30:53'),(15505,'2005-08-23 02:46:13',1144,375,'2005-08-26 23:34:13',2,'2006-02-15 21:30:53'),(15506,'2005-08-23 02:48:24',1914,553,'2005-08-28 04:10:24',1,'2006-02-15 21:30:53'),(15507,'2005-08-23 02:48:26',3130,563,'2005-08-27 01:32:26',1,'2006-02-15 21:30:53'),(15508,'2005-08-23 02:49:04',4035,293,'2005-08-29 00:58:04',1,'2006-02-15 21:30:53'),(15509,'2005-08-23 02:51:24',1291,6,'2005-08-31 06:21:24',2,'2006-02-15 21:30:53'),(15510,'2005-08-23 02:51:27',3239,209,'2005-09-01 02:44:27',2,'2006-02-15 21:30:53'),(15511,'2005-08-23 02:55:42',3327,303,'2005-08-31 03:14:42',2,'2006-02-15 21:30:53'),(15512,'2005-08-23 02:57:30',4336,25,'2005-08-25 01:47:30',2,'2006-02-15 21:30:53'),(15513,'2005-08-23 03:01:56',3779,147,'2005-08-24 23:46:56',2,'2006-02-15 21:30:53'),(15514,'2005-08-23 03:03:40',2824,366,'2005-08-24 01:06:40',1,'2006-02-15 21:30:53'),(15515,'2005-08-23 03:03:53',3940,307,'2005-08-25 08:27:53',2,'2006-02-15 21:30:53'),(15516,'2005-08-23 03:12:54',219,82,'2005-08-30 04:02:54',1,'2006-02-15 21:30:53'),(15517,'2005-08-23 03:13:01',2221,187,'2005-08-25 21:14:01',2,'2006-02-15 21:30:53'),(15518,'2005-08-23 03:19:34',3522,410,'2005-08-24 02:55:34',1,'2006-02-15 21:30:53'),(15519,'2005-08-23 03:23:32',542,443,'2005-08-25 03:48:32',1,'2006-02-15 21:30:53'),(15520,'2005-08-23 03:30:45',1792,163,'2005-09-01 00:20:45',1,'2006-02-15 21:30:53'),(15521,'2005-08-23 03:30:51',134,331,'2005-08-28 22:09:51',1,'2006-02-15 21:30:53'),(15522,'2005-08-23 03:32:31',2396,468,'2005-08-30 02:17:31',2,'2006-02-15 21:30:53'),(15523,'2005-08-23 03:32:36',2570,432,'2005-08-26 22:08:36',2,'2006-02-15 21:30:53'),(15524,'2005-08-23 03:36:26',2886,68,'2005-08-26 06:28:26',2,'2006-02-15 21:30:53'),(15525,'2005-08-23 03:43:32',3509,123,'2005-08-25 07:31:32',2,'2006-02-15 21:30:53'),(15526,'2005-08-23 03:44:30',2892,516,'2005-08-30 08:19:30',1,'2006-02-15 21:30:53'),(15527,'2005-08-23 03:44:51',88,393,'2005-08-25 03:09:51',1,'2006-02-15 21:30:53'),(15528,'2005-08-23 03:45:40',3033,114,'2005-08-25 01:16:40',1,'2006-02-15 21:30:53'),(15529,'2005-08-23 03:46:47',4015,19,'2005-08-24 00:59:47',1,'2006-02-15 21:30:53'),(15530,'2005-08-23 03:50:48',154,167,'2005-08-28 22:17:48',2,'2006-02-15 21:30:53'),(15531,'2005-08-23 03:52:36',2410,355,'2005-08-25 23:21:36',1,'2006-02-15 21:30:53'),(15532,'2006-02-14 15:16:03',1061,23,NULL,1,'2006-02-15 21:30:53'),(15533,'2005-08-23 03:54:39',1895,400,'2005-08-26 08:27:39',2,'2006-02-15 21:30:53'),(15534,'2005-08-23 03:55:54',544,169,'2005-08-24 03:54:54',1,'2006-02-15 21:30:53'),(15535,'2005-08-23 03:58:02',2371,346,'2005-08-25 05:06:02',2,'2006-02-15 21:30:53'),(15536,'2005-08-23 03:58:28',4004,98,'2005-08-31 03:28:28',2,'2006-02-15 21:30:53'),(15537,'2005-08-23 04:00:30',2958,137,'2005-08-24 01:45:30',2,'2006-02-15 21:30:53'),(15538,'2005-08-23 04:07:37',4226,211,'2005-08-28 07:37:37',1,'2006-02-15 21:30:53'),(15539,'2005-08-23 04:09:03',2853,582,'2005-08-26 04:01:03',1,'2006-02-15 21:30:53'),(15540,'2005-08-23 04:12:52',1696,197,'2005-08-31 04:25:52',1,'2006-02-15 21:30:53'),(15541,'2005-08-23 04:13:53',2762,148,'2005-08-29 05:51:53',1,'2006-02-15 21:30:53'),(15542,'2006-02-14 15:16:03',21,111,NULL,1,'2006-02-15 21:30:53'),(15543,'2005-08-23 04:15:41',3836,282,'2005-09-01 05:09:41',2,'2006-02-15 21:30:53'),(15544,'2005-08-23 04:17:56',1918,30,'2005-09-01 00:43:56',2,'2006-02-15 21:30:53'),(15545,'2005-08-23 04:20:16',843,513,'2005-08-29 08:22:16',1,'2006-02-15 21:30:53'),(15546,'2005-08-23 04:20:38',2087,223,'2005-09-01 09:57:38',2,'2006-02-15 21:30:53'),(15547,'2005-08-23 04:25:50',1488,69,'2005-08-26 00:57:50',1,'2006-02-15 21:30:53'),(15548,'2005-08-23 04:26:20',2350,334,'2005-08-28 01:27:20',1,'2006-02-15 21:30:53'),(15549,'2005-08-23 04:27:06',369,170,'2005-09-01 06:07:06',1,'2006-02-15 21:30:53'),(15550,'2005-08-23 04:27:54',1375,465,'2005-08-29 01:29:54',1,'2006-02-15 21:30:53'),(15551,'2005-08-23 04:28:25',3570,345,'2005-08-26 07:19:25',1,'2006-02-15 21:30:53'),(15552,'2005-08-23 04:33:23',4347,527,'2005-09-01 10:25:23',2,'2006-02-15 21:30:53'),(15553,'2005-08-23 04:33:39',1659,232,'2005-08-25 07:53:39',2,'2006-02-15 21:30:53'),(15554,'2005-08-23 04:48:12',198,280,'2005-08-29 05:11:12',1,'2006-02-15 21:30:53'),(15555,'2005-08-23 04:51:52',1869,347,'2005-08-24 01:01:52',1,'2006-02-15 21:30:53'),(15556,'2005-08-23 04:52:16',3683,108,'2005-09-01 02:05:16',2,'2006-02-15 21:30:53'),(15557,'2005-08-23 04:52:17',3641,444,'2005-08-30 02:15:17',2,'2006-02-15 21:30:53'),(15558,'2005-08-23 04:52:22',638,474,'2005-09-01 02:26:22',1,'2006-02-15 21:30:53'),(15559,'2005-08-23 04:55:05',1773,517,'2005-08-30 09:01:05',2,'2006-02-15 21:30:53'),(15560,'2005-08-23 05:01:13',3616,107,'2005-09-01 05:02:13',1,'2006-02-15 21:30:53'),(15561,'2005-08-23 05:02:31',68,469,'2005-09-01 02:51:31',1,'2006-02-15 21:30:53'),(15562,'2005-08-23 05:04:33',4238,149,'2005-08-27 09:58:33',1,'2006-02-15 21:30:53'),(15563,'2005-08-23 05:08:58',170,372,'2005-08-24 04:24:58',1,'2006-02-15 21:30:53'),(15564,'2005-08-23 05:10:42',1268,353,'2005-08-30 03:17:42',1,'2006-02-15 21:30:53'),(15565,'2005-08-23 05:13:09',71,546,'2005-08-30 08:58:09',2,'2006-02-15 21:30:53'),(15566,'2005-08-23 05:17:23',4344,76,'2005-09-01 08:09:23',2,'2006-02-15 21:30:53'),(15567,'2005-08-23 05:20:36',2506,54,'2005-08-24 10:09:36',2,'2006-02-15 21:30:53'),(15568,'2005-08-23 05:24:09',988,556,'2005-08-27 08:57:09',2,'2006-02-15 21:30:53'),(15569,'2005-08-23 05:24:29',1071,313,'2005-08-30 08:23:29',2,'2006-02-15 21:30:53'),(15570,'2005-08-23 05:24:55',4014,557,'2005-08-31 07:06:55',2,'2006-02-15 21:30:53'),(15571,'2005-08-23 05:26:30',716,57,'2005-08-29 00:54:30',2,'2006-02-15 21:30:53'),(15572,'2005-08-23 05:28:01',2816,506,'2005-08-27 00:14:01',2,'2006-02-15 21:30:53'),(15573,'2005-08-23 05:28:36',3133,561,'2005-08-27 05:37:36',2,'2006-02-15 21:30:53'),(15574,'2005-08-23 05:29:32',3253,130,'2005-09-01 01:25:32',2,'2006-02-15 21:30:53'),(15575,'2005-08-23 05:30:19',3916,218,'2005-08-27 05:19:19',2,'2006-02-15 21:30:53'),(15576,'2005-08-23 05:32:03',3257,595,'2005-08-26 02:31:03',1,'2006-02-15 21:30:53'),(15577,'2006-02-14 15:16:03',539,29,NULL,2,'2006-02-15 21:30:53'),(15578,'2005-08-23 05:37:13',2829,302,'2005-08-27 01:11:13',1,'2006-02-15 21:30:53'),(15579,'2005-08-23 05:38:41',3986,480,'2005-08-29 09:18:41',1,'2006-02-15 21:30:53'),(15580,'2005-08-23 05:39:06',754,279,'2005-09-01 01:14:06',2,'2006-02-15 21:30:53'),(15581,'2005-08-23 05:42:13',4010,462,'2005-08-28 00:03:13',1,'2006-02-15 21:30:53'),(15582,'2005-08-23 05:45:44',4264,297,'2005-08-25 07:54:44',2,'2006-02-15 21:30:53'),(15583,'2005-08-23 05:47:55',4299,215,'2005-08-26 01:46:55',1,'2006-02-15 21:30:53'),(15584,'2005-08-23 05:49:21',3526,500,'2005-08-27 04:49:21',1,'2006-02-15 21:30:53'),(15585,'2005-08-23 05:55:22',1177,545,'2005-08-24 11:45:22',2,'2006-02-15 21:30:53'),(15586,'2005-08-23 05:57:04',3232,148,'2005-08-31 01:59:04',1,'2006-02-15 21:30:53'),(15587,'2005-08-23 06:00:28',2510,499,'2005-08-29 10:15:28',1,'2006-02-15 21:30:53'),(15588,'2005-08-23 06:02:35',1810,503,'2005-08-30 04:01:35',2,'2006-02-15 21:30:53'),(15589,'2005-08-23 06:03:31',2379,22,'2005-08-30 07:44:31',2,'2006-02-15 21:30:53'),(15590,'2005-08-23 06:09:44',4048,599,'2005-09-01 06:53:44',2,'2006-02-15 21:30:53'),(15591,'2005-08-23 06:11:52',64,62,'2005-08-25 05:34:52',1,'2006-02-15 21:30:53'),(15593,'2005-08-23 06:15:09',3734,153,'2005-08-27 07:47:09',2,'2006-02-15 21:30:53'),(15594,'2005-08-23 06:18:43',4227,567,'2005-09-01 09:09:43',2,'2006-02-15 21:30:53'),(15595,'2005-08-23 06:19:12',4046,264,'2005-08-31 04:52:12',1,'2006-02-15 21:30:53'),(15596,'2005-08-23 06:19:51',3834,186,'2005-08-25 03:32:51',1,'2006-02-15 21:30:53'),(15597,'2005-08-23 06:21:20',3795,420,'2005-08-28 02:47:20',2,'2006-02-15 21:30:53'),(15598,'2005-08-23 06:23:26',2794,66,'2005-09-01 05:43:26',1,'2006-02-15 21:30:53'),(15599,'2005-08-23 06:25:07',4560,103,'2005-08-29 00:48:07',1,'2006-02-15 21:30:53'),(15600,'2005-08-23 06:31:24',2260,113,'2005-08-28 06:53:24',1,'2006-02-15 21:30:53'),(15601,'2005-08-23 06:33:26',3643,579,'2005-08-24 04:10:26',1,'2006-02-15 21:30:53'),(15602,'2005-08-23 06:41:07',1429,81,'2005-08-24 07:16:07',1,'2006-02-15 21:30:53'),(15603,'2005-08-23 06:41:32',2565,6,'2005-08-28 08:51:32',1,'2006-02-15 21:30:53'),(15604,'2005-08-23 06:44:19',4000,458,'2005-08-29 07:17:19',1,'2006-02-15 21:30:53'),(15605,'2005-08-23 06:48:47',3152,544,'2005-08-28 06:09:47',1,'2006-02-15 21:30:53'),(15606,'2005-08-23 06:50:27',1811,279,'2005-08-28 04:23:27',2,'2006-02-15 21:30:53'),(15607,'2005-08-23 06:54:06',4118,484,'2005-08-26 05:03:06',2,'2006-02-15 21:30:53'),(15608,'2005-08-23 06:55:26',2921,454,'2005-08-28 10:24:26',1,'2006-02-15 21:30:53'),(15609,'2005-08-23 06:56:04',1730,256,'2005-09-01 03:25:04',1,'2006-02-15 21:30:53'),(15610,'2005-08-23 06:56:15',2076,215,'2005-08-24 07:37:15',2,'2006-02-15 21:30:53'),(15611,'2005-08-23 06:56:18',1713,184,'2005-08-25 06:10:18',1,'2006-02-15 21:30:53'),(15612,'2005-08-23 06:59:07',3367,305,'2005-09-01 11:26:07',2,'2006-02-15 21:30:53'),(15613,'2005-08-23 07:03:19',307,461,'2005-08-31 07:50:19',2,'2006-02-15 21:30:53'),(15614,'2005-08-23 07:05:15',1216,287,'2005-09-01 11:41:15',1,'2006-02-15 21:30:53'),(15615,'2005-08-23 07:06:00',899,584,'2005-08-30 11:21:00',2,'2006-02-15 21:30:53'),(15616,'2005-08-23 07:06:38',2947,70,'2005-08-30 04:16:38',1,'2006-02-15 21:30:53'),(15617,'2005-08-23 07:07:22',4085,569,'2005-08-27 01:24:22',2,'2006-02-15 21:30:53'),(15618,'2005-08-23 07:07:58',1903,60,'2005-08-29 03:48:58',1,'2006-02-15 21:30:53'),(15619,'2005-08-23 07:10:14',2468,3,'2005-08-26 07:21:14',2,'2006-02-15 21:30:53'),(15620,'2005-08-23 07:10:22',1173,270,'2005-08-28 06:51:22',2,'2006-02-15 21:30:53'),(15621,'2005-08-23 07:13:43',3832,123,'2005-08-29 08:19:43',1,'2006-02-15 21:30:53'),(15622,'2005-08-23 07:22:02',3335,302,'2005-09-01 06:08:02',2,'2006-02-15 21:30:53'),(15623,'2005-08-23 07:23:29',3003,525,'2005-08-31 01:47:29',1,'2006-02-15 21:30:53'),(15624,'2005-08-23 07:24:27',396,105,'2005-08-29 12:36:27',2,'2006-02-15 21:30:53'),(15625,'2005-08-23 07:25:29',4200,207,'2005-08-27 13:17:29',2,'2006-02-15 21:30:53'),(15626,'2005-08-23 07:25:34',640,370,'2005-08-28 11:01:34',1,'2006-02-15 21:30:53'),(15627,'2005-08-23 07:25:38',1364,453,'2005-08-31 02:53:38',2,'2006-02-15 21:30:53'),(15628,'2005-08-23 07:28:04',1348,408,'2005-08-26 04:23:04',1,'2006-02-15 21:30:53'),(15629,'2005-08-23 07:28:22',3725,286,'2005-08-29 06:29:22',2,'2006-02-15 21:30:53'),(15630,'2005-08-23 07:29:13',3590,580,'2005-08-31 04:33:13',2,'2006-02-15 21:30:53'),(15631,'2005-08-23 07:30:23',2458,93,'2005-08-24 07:23:23',1,'2006-02-15 21:30:53'),(15632,'2005-08-23 07:30:26',2941,60,'2005-08-24 07:53:26',2,'2006-02-15 21:30:53'),(15633,'2005-08-23 07:31:10',882,497,'2005-08-26 04:35:10',2,'2006-02-15 21:30:53'),(15634,'2005-08-23 07:34:18',2517,576,'2005-08-24 12:00:18',2,'2006-02-15 21:30:53'),(15635,'2005-08-23 07:43:00',3308,4,'2005-08-27 10:47:00',1,'2006-02-15 21:30:53'),(15636,'2005-08-23 07:50:46',1169,380,'2005-08-26 07:59:46',2,'2006-02-15 21:30:53'),(15637,'2005-08-23 07:53:38',445,172,'2005-08-29 03:16:38',2,'2006-02-15 21:30:53'),(15638,'2005-08-23 07:54:54',3358,563,'2005-08-30 13:33:54',2,'2006-02-15 21:30:53'),(15639,'2005-08-23 08:03:25',42,214,'2005-08-24 10:21:25',2,'2006-02-15 21:30:53'),(15640,'2005-08-23 08:04:40',3505,262,'2005-08-24 06:38:40',1,'2006-02-15 21:30:53'),(15641,'2005-08-23 08:06:49',3126,240,'2005-08-24 13:17:49',1,'2006-02-15 21:30:53'),(15642,'2005-08-23 08:09:11',2627,160,'2005-08-28 05:57:11',1,'2006-02-15 21:30:53'),(15643,'2005-08-23 08:13:26',103,298,'2005-08-25 05:18:26',2,'2006-02-15 21:30:53'),(15644,'2006-02-14 15:16:03',3139,43,NULL,2,'2006-02-15 21:30:53'),(15645,'2006-02-14 15:16:03',3838,214,NULL,2,'2006-02-15 21:30:53'),(15646,'2005-08-23 08:19:55',3217,114,'2005-08-29 02:32:55',1,'2006-02-15 21:30:53'),(15647,'2005-08-23 08:23:56',2051,251,'2005-08-26 11:00:56',1,'2006-02-15 21:30:53'),(15648,'2005-08-23 08:27:57',4039,80,'2005-08-30 08:53:57',2,'2006-02-15 21:30:53'),(15649,'2005-08-23 08:28:03',415,60,'2005-08-30 05:11:03',1,'2006-02-15 21:30:53'),(15650,'2005-08-23 08:29:53',2447,353,'2005-08-25 07:23:53',2,'2006-02-15 21:30:53'),(15651,'2005-08-23 08:31:49',3393,451,'2005-08-26 02:57:49',1,'2006-02-15 21:30:53'),(15652,'2005-08-23 08:34:10',4440,578,'2005-08-30 12:31:10',1,'2006-02-15 21:30:53'),(15653,'2005-08-23 08:34:42',2736,439,'2005-09-01 03:07:42',1,'2006-02-15 21:30:53'),(15654,'2005-08-23 08:34:53',4360,471,'2005-08-30 04:18:53',2,'2006-02-15 21:30:53'),(15655,'2006-02-14 15:16:03',604,359,NULL,1,'2006-02-15 21:30:53'),(15656,'2005-08-23 08:38:58',4239,334,'2005-08-24 04:08:58',2,'2006-02-15 21:30:53'),(15657,'2005-08-23 08:42:40',1897,36,'2005-09-01 13:08:40',1,'2006-02-15 21:30:53'),(15658,'2005-08-23 08:48:43',3565,22,'2005-08-25 05:38:43',1,'2006-02-15 21:30:53'),(15659,'2005-08-23 08:48:43',4573,131,'2005-08-27 14:19:43',2,'2006-02-15 21:30:53'),(15660,'2005-08-23 08:51:21',3223,388,'2005-08-28 06:26:21',2,'2006-02-15 21:30:53'),(15661,'2005-08-23 08:52:03',1599,346,'2005-08-30 08:17:03',2,'2006-02-15 21:30:53'),(15662,'2005-08-23 08:52:50',3028,223,'2005-08-24 08:08:50',1,'2006-02-15 21:30:53'),(15663,'2005-08-23 08:54:26',3291,291,'2005-08-29 02:56:26',1,'2006-02-15 21:30:53'),(15664,'2005-08-23 08:57:11',2029,351,'2005-08-31 14:19:11',2,'2006-02-15 21:30:53'),(15665,'2005-08-23 08:59:12',3471,487,'2005-08-24 12:50:12',2,'2006-02-15 21:30:53'),(15666,'2005-08-23 09:01:10',3406,586,'2005-08-31 12:32:10',2,'2006-02-15 21:30:53'),(15667,'2005-08-23 09:02:03',1302,73,'2005-08-24 05:47:03',1,'2006-02-15 21:30:53'),(15668,'2005-08-23 09:02:04',1963,38,'2005-08-29 03:17:04',2,'2006-02-15 21:30:53'),(15669,'2005-08-23 09:06:17',1542,334,'2005-08-30 08:10:17',2,'2006-02-15 21:30:53'),(15670,'2005-08-23 09:07:11',2834,211,'2005-08-31 04:32:11',2,'2006-02-15 21:30:53'),(15671,'2005-08-23 09:08:16',3716,112,'2005-08-29 14:01:16',1,'2006-02-15 21:30:53'),(15672,'2005-08-23 09:09:18',701,210,'2005-08-27 06:19:18',1,'2006-02-15 21:30:53'),(15673,'2005-08-23 09:12:50',3096,321,'2005-08-29 12:45:50',2,'2006-02-15 21:30:53'),(15674,'2005-08-23 09:16:39',4482,90,'2005-09-01 11:57:39',1,'2006-02-15 21:30:53'),(15675,'2005-08-23 09:18:52',4153,293,'2005-08-30 14:59:52',2,'2006-02-15 21:30:53'),(15676,'2005-08-23 09:23:08',3874,353,'2005-08-30 06:19:08',2,'2006-02-15 21:30:53'),(15677,'2005-08-23 09:23:36',2050,109,'2005-08-27 05:01:36',1,'2006-02-15 21:30:53'),(15678,'2005-08-23 09:23:45',1345,413,'2005-08-27 11:38:45',2,'2006-02-15 21:30:53'),(15679,'2005-08-23 09:27:29',2945,103,'2005-08-28 09:14:29',1,'2006-02-15 21:30:53'),(15680,'2005-08-23 09:33:22',1370,169,'2005-08-31 13:29:22',2,'2006-02-15 21:30:53'),(15681,'2005-08-23 09:35:34',2813,61,'2005-08-27 08:33:34',1,'2006-02-15 21:30:53'),(15682,'2005-08-23 09:37:34',3293,31,'2005-08-31 06:01:34',1,'2006-02-15 21:30:53'),(15683,'2005-08-23 09:38:17',3787,168,'2005-08-30 12:31:17',2,'2006-02-15 21:30:53'),(15684,'2005-08-23 09:40:04',3976,586,'2005-08-28 15:28:04',1,'2006-02-15 21:30:53'),(15685,'2005-08-23 09:41:28',370,491,'2005-08-30 10:11:28',1,'2006-02-15 21:30:53'),(15686,'2005-08-23 09:42:21',2041,206,'2005-08-29 12:22:21',1,'2006-02-15 21:30:53'),(15687,'2005-08-23 09:46:33',276,112,'2005-09-01 06:07:33',1,'2006-02-15 21:30:53'),(15688,'2005-08-23 09:48:45',2851,105,'2005-08-30 10:28:45',2,'2006-02-15 21:30:53'),(15689,'2005-08-23 09:52:55',248,259,'2005-08-29 11:15:55',1,'2006-02-15 21:30:53'),(15690,'2005-08-23 09:53:30',2102,554,'2005-08-29 10:27:30',1,'2006-02-15 21:30:53'),(15691,'2005-08-23 09:53:54',784,200,'2005-08-27 10:14:54',1,'2006-02-15 21:30:53'),(15692,'2005-08-23 10:00:02',1852,503,'2005-08-24 05:25:02',1,'2006-02-15 21:30:53'),(15693,'2005-08-23 10:00:24',748,94,'2005-08-25 08:23:24',1,'2006-02-15 21:30:53'),(15694,'2005-08-23 10:02:46',3017,506,'2005-08-31 05:46:46',2,'2006-02-15 21:30:53'),(15695,'2006-02-14 15:16:03',2954,300,NULL,1,'2006-02-15 21:30:53'),(15696,'2005-08-23 10:04:17',2836,93,'2005-08-25 08:47:17',2,'2006-02-15 21:30:53'),(15697,'2005-08-23 10:04:36',1987,380,'2005-08-24 05:00:36',2,'2006-02-15 21:30:53'),(15698,'2005-08-23 10:11:40',4465,395,'2005-08-28 08:50:40',2,'2006-02-15 21:30:53'),(15699,'2005-08-23 10:20:35',4155,501,'2005-08-30 13:56:35',1,'2006-02-15 21:30:53'),(15700,'2005-08-23 10:21:21',2935,552,'2005-08-24 15:37:21',1,'2006-02-15 21:30:53'),(15701,'2005-08-23 10:22:21',2942,516,'2005-08-24 10:52:21',1,'2006-02-15 21:30:53'),(15702,'2005-08-23 10:23:28',1602,56,'2005-08-29 11:08:28',2,'2006-02-15 21:30:53'),(15703,'2005-08-23 10:23:48',2883,322,'2005-09-01 06:54:48',2,'2006-02-15 21:30:53'),(15704,'2005-08-23 10:25:45',738,71,'2005-08-29 16:06:45',2,'2006-02-15 21:30:53'),(15705,'2005-08-23 10:32:52',936,356,'2005-08-29 13:18:52',2,'2006-02-15 21:30:53'),(15706,'2005-08-23 10:32:52',4486,220,'2005-08-24 07:03:52',2,'2006-02-15 21:30:53'),(15707,'2005-08-23 10:35:45',3646,91,'2005-08-27 10:57:45',1,'2006-02-15 21:30:53'),(15708,'2005-08-23 10:35:51',1974,46,'2005-08-27 16:02:51',1,'2006-02-15 21:30:53'),(15709,'2005-08-23 10:36:00',346,206,'2005-08-28 06:18:00',2,'2006-02-15 21:30:53'),(15710,'2006-02-14 15:16:03',1020,421,NULL,1,'2006-02-15 21:30:53'),(15711,'2005-08-23 10:43:00',789,297,'2005-08-29 16:29:00',1,'2006-02-15 21:30:53'),(15712,'2005-08-23 10:43:56',1882,351,'2005-08-29 15:35:56',2,'2006-02-15 21:30:53'),(15713,'2005-08-23 10:56:15',337,432,'2005-08-29 09:14:15',2,'2006-02-15 21:30:53'),(15714,'2006-02-14 15:16:03',2083,56,NULL,1,'2006-02-15 21:30:53'),(15715,'2005-08-23 10:57:40',3808,86,'2005-08-28 12:40:40',1,'2006-02-15 21:30:53'),(15716,'2005-08-23 11:02:00',2812,408,'2005-08-28 14:46:00',1,'2006-02-15 21:30:53'),(15717,'2006-02-14 15:16:03',902,208,NULL,2,'2006-02-15 21:30:53'),(15718,'2005-08-23 11:05:17',2180,276,'2005-08-28 12:50:17',1,'2006-02-15 21:30:53'),(15719,'2005-08-23 11:08:46',3990,599,'2005-08-25 07:25:46',1,'2006-02-15 21:30:53'),(15720,'2005-08-23 11:15:20',2490,456,'2005-08-31 09:49:20',1,'2006-02-15 21:30:53'),(15721,'2005-08-23 11:16:16',685,154,'2005-08-28 10:21:16',1,'2006-02-15 21:30:53'),(15722,'2005-08-23 11:16:29',2809,26,'2005-09-01 13:24:29',2,'2006-02-15 21:30:53'),(15723,'2005-08-23 11:17:26',3915,504,'2005-08-31 13:58:26',2,'2006-02-15 21:30:53'),(15724,'2005-08-23 11:22:09',1025,478,'2005-08-28 12:56:09',2,'2006-02-15 21:30:53'),(15725,'2005-08-23 11:25:00',378,599,'2005-08-26 11:46:00',1,'2006-02-15 21:30:53'),(15726,'2005-08-23 11:28:26',906,503,'2005-08-28 11:23:26',2,'2006-02-15 21:30:53'),(15727,'2005-08-23 11:28:49',2184,416,'2005-08-24 06:24:49',2,'2006-02-15 21:30:53'),(15728,'2005-08-23 11:30:32',2567,323,'2005-08-28 09:52:32',2,'2006-02-15 21:30:53'),(15729,'2006-02-14 15:16:03',2699,193,NULL,2,'2006-02-15 21:30:53'),(15730,'2005-08-23 11:32:35',947,147,'2005-08-30 13:46:35',2,'2006-02-15 21:30:53'),(15731,'2005-08-23 11:33:25',3403,118,'2005-08-24 07:19:25',2,'2006-02-15 21:30:53'),(15732,'2005-08-23 11:35:12',3247,412,'2005-08-26 12:50:12',2,'2006-02-15 21:30:53'),(15733,'2005-08-23 11:37:32',4185,512,'2005-08-28 16:27:32',1,'2006-02-15 21:30:53'),(15734,'2005-08-23 11:40:08',3952,302,'2005-08-27 08:16:08',1,'2006-02-15 21:30:53'),(15735,'2006-02-14 15:16:03',3167,295,NULL,1,'2006-02-15 21:30:53'),(15736,'2005-08-23 11:40:30',4272,127,'2005-08-30 12:40:30',1,'2006-02-15 21:30:53'),(15737,'2005-08-23 11:52:18',996,83,'2005-08-28 15:28:18',1,'2006-02-15 21:30:53'),(15738,'2005-08-23 11:55:50',556,38,'2005-08-30 15:07:50',1,'2006-02-15 21:30:53'),(15739,'2005-08-23 11:56:22',266,74,'2005-08-29 16:10:22',2,'2006-02-15 21:30:53'),(15740,'2005-08-23 12:07:51',100,229,'2005-08-24 13:23:51',2,'2006-02-15 21:30:53'),(15741,'2005-08-23 12:10:54',4243,126,'2005-08-24 10:08:54',2,'2006-02-15 21:30:53'),(15742,'2005-08-23 12:11:37',1339,200,'2005-08-31 07:28:37',2,'2006-02-15 21:30:53'),(15743,'2005-08-23 12:12:05',1625,139,'2005-08-26 11:35:05',1,'2006-02-15 21:30:53'),(15744,'2005-08-23 12:15:51',2364,59,'2005-08-31 17:19:51',1,'2006-02-15 21:30:53'),(15745,'2006-02-14 15:16:03',2737,43,NULL,1,'2006-02-15 21:30:53'),(15746,'2005-08-23 12:26:19',2241,246,'2005-08-26 09:51:19',2,'2006-02-15 21:30:53'),(15747,'2005-08-23 12:29:24',1517,381,'2005-08-31 08:27:24',2,'2006-02-15 21:30:53'),(15748,'2005-08-23 12:33:00',2757,380,'2005-08-25 15:15:00',2,'2006-02-15 21:30:53'),(15749,'2005-08-23 12:33:41',4224,575,'2005-08-24 10:52:41',1,'2006-02-15 21:30:53'),(15750,'2005-08-23 12:36:05',4474,496,'2005-08-24 17:40:05',2,'2006-02-15 21:30:53'),(15751,'2005-08-23 12:41:07',697,199,'2005-08-29 07:03:07',2,'2006-02-15 21:30:53'),(15752,'2005-08-23 12:41:38',2112,17,'2005-09-01 14:06:38',1,'2006-02-15 21:30:53'),(15753,'2005-08-23 12:43:30',3451,144,'2005-09-01 09:07:30',2,'2006-02-15 21:30:53'),(15754,'2005-08-23 12:43:42',2306,356,'2005-08-27 17:45:42',2,'2006-02-15 21:30:53'),(15755,'2005-08-23 12:46:38',511,423,'2005-08-25 12:59:38',1,'2006-02-15 21:30:53'),(15756,'2005-08-23 12:47:05',878,112,'2005-08-28 08:34:05',2,'2006-02-15 21:30:53'),(15757,'2005-08-23 12:47:16',1308,356,'2005-08-29 17:19:16',1,'2006-02-15 21:30:53'),(15758,'2005-08-23 12:47:26',152,46,'2005-08-29 11:05:26',2,'2006-02-15 21:30:53'),(15759,'2005-08-23 12:47:37',1341,361,'2005-09-01 11:28:37',2,'2006-02-15 21:30:53'),(15760,'2005-08-23 12:50:00',3050,273,'2005-08-29 15:41:00',2,'2006-02-15 21:30:53'),(15761,'2005-08-23 12:55:51',4362,416,'2005-08-26 16:51:51',1,'2006-02-15 21:30:53'),(15762,'2005-08-23 13:01:43',887,351,'2005-08-26 16:35:43',1,'2006-02-15 21:30:53'),(15763,'2005-08-23 13:02:59',124,158,'2005-08-24 17:45:59',2,'2006-02-15 21:30:53'),(15764,'2005-08-23 13:05:10',2937,8,'2005-08-25 16:15:10',1,'2006-02-15 21:30:53'),(15765,'2005-08-23 13:06:19',1250,408,'2005-08-31 12:18:19',1,'2006-02-15 21:30:53'),(15766,'2005-08-23 13:10:16',1996,436,'2005-08-30 09:27:16',1,'2006-02-15 21:30:53'),(15767,'2005-08-23 13:14:15',3492,241,'2005-08-27 14:43:15',2,'2006-02-15 21:30:53'),(15768,'2005-08-23 13:14:47',662,267,'2005-08-29 14:17:47',2,'2006-02-15 21:30:53'),(15769,'2005-08-23 13:16:15',2392,276,'2005-08-28 18:31:15',1,'2006-02-15 21:30:53'),(15770,'2005-08-23 13:18:16',1424,113,'2005-08-29 11:31:16',1,'2006-02-15 21:30:53'),(15771,'2005-08-23 13:18:46',3667,262,'2005-08-26 07:29:46',1,'2006-02-15 21:30:53'),(15772,'2005-08-23 13:22:56',4343,202,'2005-08-26 10:35:56',2,'2006-02-15 21:30:53'),(15773,'2005-08-23 13:24:57',1626,189,'2005-08-31 14:16:57',2,'2006-02-15 21:30:53'),(15774,'2005-08-23 13:25:08',1273,254,'2005-08-28 10:08:08',2,'2006-02-15 21:30:53'),(15775,'2005-08-23 13:25:44',2146,173,'2005-09-01 16:56:44',1,'2006-02-15 21:30:53'),(15776,'2005-08-23 13:26:01',43,514,'2005-08-29 18:17:01',1,'2006-02-15 21:30:53'),(15777,'2005-08-23 13:29:08',4241,130,'2005-08-27 18:50:08',2,'2006-02-15 21:30:53'),(15778,'2006-02-14 15:16:03',1269,234,NULL,1,'2006-02-15 21:30:53'),(15779,'2005-08-23 13:33:46',1560,419,'2005-08-28 08:40:46',2,'2006-02-15 21:30:53'),(15780,'2006-02-14 15:16:03',2911,120,NULL,2,'2006-02-15 21:30:53'),(15781,'2005-08-23 13:41:05',4449,412,'2005-08-31 13:11:05',1,'2006-02-15 21:30:53'),(15782,'2005-08-23 13:43:26',3282,245,'2005-08-30 14:03:26',1,'2006-02-15 21:30:53'),(15783,'2005-08-23 13:45:44',397,247,'2005-08-26 09:18:44',2,'2006-02-15 21:30:53'),(15784,'2005-08-23 13:46:00',126,425,'2005-08-30 11:49:00',2,'2006-02-15 21:30:53'),(15785,'2005-08-23 13:46:27',1758,543,'2005-08-27 10:16:27',2,'2006-02-15 21:30:53'),(15786,'2005-08-23 13:48:34',3132,371,'2005-08-27 15:59:34',1,'2006-02-15 21:30:53'),(15787,'2005-08-23 13:51:57',2932,123,'2005-08-27 17:06:57',1,'2006-02-15 21:30:53'),(15788,'2005-08-23 13:54:39',13,269,'2005-08-26 10:17:39',1,'2006-02-15 21:30:53'),(15789,'2005-08-23 13:56:40',1213,350,'2005-08-27 15:25:40',1,'2006-02-15 21:30:53'),(15790,'2005-08-23 14:01:07',2887,233,'2005-08-30 10:32:07',2,'2006-02-15 21:30:53'),(15791,'2005-08-23 14:02:13',4147,445,'2005-09-01 09:03:13',2,'2006-02-15 21:30:53'),(15792,'2005-08-23 14:05:37',2175,581,'2005-08-28 10:54:37',1,'2006-02-15 21:30:53'),(15793,'2005-08-23 14:06:19',2863,22,'2005-08-24 19:59:19',2,'2006-02-15 21:30:53'),(15794,'2006-02-14 15:16:03',3917,579,NULL,2,'2006-02-15 21:30:53'),(15795,'2005-08-23 14:07:56',4371,417,'2005-08-25 12:10:56',2,'2006-02-15 21:30:53'),(15796,'2005-08-23 14:12:22',1425,158,'2005-08-28 17:03:22',2,'2006-02-15 21:30:53'),(15797,'2005-08-23 14:13:47',497,503,'2005-08-25 09:16:47',2,'2006-02-15 21:30:53'),(15798,'2005-08-23 14:23:03',3803,203,'2005-08-30 17:39:03',2,'2006-02-15 21:30:53'),(15799,'2005-08-23 14:23:23',2519,215,'2005-08-24 17:15:23',2,'2006-02-15 21:30:53'),(15800,'2005-08-23 14:23:44',963,43,'2005-08-29 17:04:44',2,'2006-02-15 21:30:53'),(15801,'2005-08-23 14:26:04',1590,165,'2005-08-28 15:04:04',1,'2006-02-15 21:30:53'),(15802,'2005-08-23 14:26:51',41,158,'2005-08-29 16:28:51',2,'2006-02-15 21:30:53'),(15803,'2005-08-23 14:27:07',500,105,'2005-08-28 12:01:07',2,'2006-02-15 21:30:53'),(15804,'2005-08-23 14:29:16',3338,585,'2005-08-26 08:41:16',1,'2006-02-15 21:30:53'),(15805,'2005-08-23 14:31:19',4511,8,'2005-08-25 19:01:19',2,'2006-02-15 21:30:53'),(15806,'2005-08-23 14:31:50',2683,166,'2005-08-27 16:08:50',2,'2006-02-15 21:30:53'),(15807,'2005-08-23 14:35:10',2705,350,'2005-08-29 19:06:10',2,'2006-02-15 21:30:53'),(15808,'2005-08-23 14:38:37',1663,446,'2005-08-27 14:45:37',2,'2006-02-15 21:30:53'),(15809,'2005-08-23 14:42:07',1885,431,'2005-08-27 15:00:07',2,'2006-02-15 21:30:53'),(15810,'2005-08-23 14:43:15',2196,171,'2005-08-25 17:41:15',1,'2006-02-15 21:30:53'),(15811,'2005-08-23 14:43:46',3487,300,'2005-08-27 16:43:46',1,'2006-02-15 21:30:53'),(15812,'2005-08-23 14:47:26',4457,45,'2005-09-01 10:51:26',2,'2006-02-15 21:30:53'),(15813,'2006-02-14 15:16:03',981,9,NULL,1,'2006-02-15 21:30:53'),(15814,'2005-08-23 14:52:50',4361,459,'2005-08-27 16:12:50',2,'2006-02-15 21:30:53'),(15815,'2005-08-23 14:55:47',316,444,'2005-08-24 12:37:47',1,'2006-02-15 21:30:53'),(15816,'2005-08-23 14:58:06',3628,31,'2005-08-28 13:30:06',1,'2006-02-15 21:30:53'),(15817,'2005-08-23 14:59:51',598,348,'2005-08-25 15:27:51',1,'2006-02-15 21:30:53'),(15818,'2005-08-23 14:59:58',2620,439,'2005-08-27 13:13:58',2,'2006-02-15 21:30:53'),(15819,'2005-08-23 15:01:54',3639,274,'2005-08-31 20:01:54',2,'2006-02-15 21:30:53'),(15820,'2005-08-23 15:03:13',4553,308,'2005-08-25 20:12:13',1,'2006-02-15 21:30:53'),(15821,'2005-08-23 15:03:58',1714,233,'2005-08-24 17:46:58',2,'2006-02-15 21:30:53'),(15822,'2005-08-23 15:05:59',3602,492,'2005-08-24 11:13:59',1,'2006-02-15 21:30:53'),(15823,'2005-08-23 15:08:00',3047,81,'2005-08-24 17:52:00',2,'2006-02-15 21:30:53'),(15824,'2005-08-23 15:09:17',2933,371,'2005-08-28 15:14:17',2,'2006-02-15 21:30:53'),(15825,'2005-08-23 15:10:42',149,346,'2005-08-29 09:28:42',2,'2006-02-15 21:30:53'),(15826,'2005-08-23 15:15:02',215,311,'2005-08-31 20:39:02',2,'2006-02-15 21:30:53'),(15827,'2005-08-23 15:15:19',1732,346,'2005-08-24 10:50:19',2,'2006-02-15 21:30:53'),(15828,'2005-08-23 15:16:32',428,327,'2005-08-29 12:20:32',1,'2006-02-15 21:30:53'),(15829,'2005-08-23 15:17:14',4387,30,'2005-08-27 13:04:14',1,'2006-02-15 21:30:53'),(15830,'2005-08-23 15:19:15',309,467,'2005-08-25 18:42:15',2,'2006-02-15 21:30:53'),(15831,'2005-08-23 15:21:19',3123,401,'2005-08-24 15:47:19',2,'2006-02-15 21:30:53'),(15832,'2005-08-23 15:21:35',1468,537,'2005-08-30 15:01:35',2,'2006-02-15 21:30:53'),(15833,'2005-08-23 15:22:15',801,349,'2005-08-31 14:54:15',1,'2006-02-15 21:30:53'),(15834,'2005-08-23 15:23:50',217,165,'2005-09-01 19:31:50',1,'2006-02-15 21:30:53'),(15835,'2005-08-23 15:25:27',1362,128,'2005-09-01 16:14:27',2,'2006-02-15 21:30:53'),(15836,'2005-08-23 15:29:17',260,468,'2005-08-26 11:44:17',2,'2006-02-15 21:30:53'),(15837,'2005-08-23 15:29:41',4388,283,'2005-08-27 18:17:41',1,'2006-02-15 21:30:53'),(15838,'2005-08-23 15:30:48',2194,579,'2005-08-31 11:20:48',2,'2006-02-15 21:30:53'),(15839,'2005-08-23 15:34:46',3726,294,'2005-08-30 21:00:46',2,'2006-02-15 21:30:53'),(15840,'2005-08-23 15:34:49',1901,316,'2005-08-24 16:54:49',1,'2006-02-15 21:30:53'),(15841,'2005-08-23 15:35:59',2865,571,'2005-08-30 19:30:59',2,'2006-02-15 21:30:53'),(15842,'2005-08-23 15:36:05',1850,146,'2005-08-30 14:05:05',2,'2006-02-15 21:30:53'),(15843,'2005-08-23 15:37:31',611,215,'2005-08-28 18:41:31',2,'2006-02-15 21:30:53'),(15844,'2005-08-23 15:38:12',2027,119,'2005-08-26 15:18:12',1,'2006-02-15 21:30:53'),(15845,'2005-08-23 15:38:34',4312,89,'2005-08-25 10:06:34',1,'2006-02-15 21:30:53'),(15846,'2005-08-23 15:39:18',3635,47,'2005-08-27 14:28:18',2,'2006-02-15 21:30:53'),(15847,'2005-08-23 15:39:38',2287,163,'2005-08-24 11:46:38',1,'2006-02-15 21:30:53'),(15848,'2005-08-23 15:41:12',2141,336,'2005-08-26 10:29:12',2,'2006-02-15 21:30:53'),(15849,'2005-08-23 15:41:20',4077,482,'2005-08-27 15:47:20',2,'2006-02-15 21:30:53'),(15850,'2005-08-23 15:45:42',586,563,'2005-08-27 19:24:42',1,'2006-02-15 21:30:53'),(15851,'2005-08-23 15:46:33',2286,469,'2005-08-29 15:52:33',1,'2006-02-15 21:30:53'),(15852,'2005-08-23 15:47:02',1506,140,'2005-08-25 19:37:02',1,'2006-02-15 21:30:53'),(15853,'2005-08-23 15:54:20',225,500,'2005-08-24 18:53:20',2,'2006-02-15 21:30:53'),(15854,'2005-08-23 15:58:05',1648,464,'2005-08-26 19:23:05',1,'2006-02-15 21:30:53'),(15855,'2005-08-23 15:59:01',2528,192,'2005-08-29 20:26:01',1,'2006-02-15 21:30:53'),(15856,'2005-08-23 15:59:12',3379,395,'2005-08-25 15:36:12',1,'2006-02-15 21:30:53'),(15857,'2005-08-23 15:59:51',2733,575,'2005-08-26 12:01:51',2,'2006-02-15 21:30:53'),(15858,'2005-08-23 16:07:15',4515,81,'2005-08-25 19:36:15',2,'2006-02-15 21:30:53'),(15859,'2005-08-23 16:08:15',4269,465,'2005-08-28 11:08:15',1,'2006-02-15 21:30:53'),(15860,'2005-08-23 16:08:40',2583,41,'2005-08-28 15:35:40',1,'2006-02-15 21:30:53'),(15861,'2005-08-23 16:15:45',1859,256,'2005-09-01 11:37:45',2,'2006-02-15 21:30:53'),(15862,'2006-02-14 15:16:03',925,215,NULL,1,'2006-02-15 21:30:53'),(15863,'2005-08-23 16:17:09',2783,328,'2005-08-28 16:10:09',2,'2006-02-15 21:30:53'),(15864,'2005-08-23 16:18:12',3014,256,'2005-08-29 17:10:12',2,'2006-02-15 21:30:53'),(15865,'2005-08-23 16:18:25',2031,482,'2005-08-26 10:57:25',2,'2006-02-15 21:30:53'),(15866,'2005-08-23 16:19:02',3828,296,'2005-08-31 12:29:02',2,'2006-02-15 21:30:53'),(15867,'2006-02-14 15:16:03',837,505,NULL,2,'2006-02-15 21:30:53'),(15868,'2005-08-23 16:19:14',2186,306,'2005-08-29 16:14:14',2,'2006-02-15 21:30:53'),(15869,'2005-08-23 16:22:20',1344,357,'2005-08-27 11:52:20',1,'2006-02-15 21:30:53'),(15870,'2005-08-23 16:23:08',590,251,'2005-08-28 20:30:08',2,'2006-02-15 21:30:53'),(15871,'2005-08-23 16:24:24',425,57,'2005-09-01 13:48:24',2,'2006-02-15 21:30:53'),(15872,'2005-08-23 16:27:24',3391,212,'2005-08-31 11:57:24',1,'2006-02-15 21:30:53'),(15873,'2005-08-23 16:27:59',4548,577,'2005-08-26 11:11:59',2,'2006-02-15 21:30:53'),(15874,'2005-08-23 16:30:55',621,132,'2005-08-28 20:57:55',1,'2006-02-15 21:30:53'),(15875,'2006-02-14 15:16:03',3611,41,NULL,1,'2006-02-15 21:30:53'),(15876,'2005-08-23 16:32:10',1735,87,'2005-08-24 18:16:10',1,'2006-02-15 21:30:53'),(15877,'2005-08-23 16:33:33',2307,559,'2005-08-26 10:36:33',2,'2006-02-15 21:30:53'),(15878,'2005-08-23 16:34:31',1592,493,'2005-08-27 21:51:31',2,'2006-02-15 21:30:53'),(15879,'2005-08-23 16:42:53',235,482,'2005-08-29 16:21:53',2,'2006-02-15 21:30:53'),(15880,'2005-08-23 16:43:54',2538,528,'2005-08-31 14:40:54',2,'2006-02-15 21:30:53'),(15881,'2005-08-23 16:44:25',617,383,'2005-08-29 13:58:25',1,'2006-02-15 21:30:53'),(15882,'2005-08-23 16:44:31',2028,312,'2005-09-01 15:44:31',2,'2006-02-15 21:30:53'),(15883,'2005-08-23 16:44:56',2792,550,'2005-08-24 22:42:56',1,'2006-02-15 21:30:53'),(15884,'2005-08-23 16:45:28',2255,81,'2005-08-27 20:18:28',1,'2006-02-15 21:30:53'),(15885,'2005-08-23 16:50:43',2116,565,'2005-08-29 20:19:43',1,'2006-02-15 21:30:53'),(15886,'2005-08-23 16:50:53',3038,91,'2005-08-26 15:38:53',2,'2006-02-15 21:30:53'),(15887,'2005-08-23 16:54:09',4263,201,'2005-08-26 13:20:09',2,'2006-02-15 21:30:53'),(15888,'2005-08-23 16:56:14',2955,321,'2005-08-31 14:32:14',1,'2006-02-15 21:30:53'),(15889,'2005-08-23 16:57:43',787,137,'2005-08-27 22:14:43',1,'2006-02-15 21:30:53'),(15890,'2005-08-23 16:58:12',3625,87,'2005-08-24 12:23:12',1,'2006-02-15 21:30:53'),(15891,'2005-08-23 17:00:12',2168,52,'2005-08-31 21:12:12',1,'2006-02-15 21:30:53'),(15892,'2005-08-23 17:01:00',1365,174,'2005-08-28 12:50:00',1,'2006-02-15 21:30:53'),(15893,'2005-08-23 17:02:00',2571,438,'2005-08-30 12:45:00',2,'2006-02-15 21:30:53'),(15894,'2006-02-14 15:16:03',4416,168,NULL,1,'2006-02-15 21:30:53'),(15895,'2005-08-23 17:09:31',2275,342,'2005-08-30 17:15:31',1,'2006-02-15 21:30:53'),(15896,'2005-08-23 17:09:56',528,585,'2005-08-31 14:51:56',2,'2006-02-15 21:30:53'),(15897,'2005-08-23 17:12:31',1652,15,'2005-08-30 17:22:31',1,'2006-02-15 21:30:53'),(15898,'2005-08-23 17:13:01',3502,88,'2005-08-29 11:22:01',2,'2006-02-15 21:30:53'),(15899,'2005-08-23 17:16:28',3851,596,'2005-08-29 21:46:28',2,'2006-02-15 21:30:53'),(15900,'2005-08-23 17:16:30',1112,562,'2005-08-27 18:02:30',1,'2006-02-15 21:30:53'),(15901,'2005-08-23 17:19:17',2761,226,'2005-08-30 14:24:17',2,'2006-02-15 21:30:53'),(15902,'2005-08-23 17:28:03',4500,172,'2005-08-30 18:36:03',1,'2006-02-15 21:30:53'),(15903,'2005-08-23 17:30:40',1289,267,'2005-08-29 14:12:40',1,'2006-02-15 21:30:53'),(15904,'2005-08-23 17:32:19',179,37,'2005-08-24 21:05:19',2,'2006-02-15 21:30:53'),(15905,'2005-08-23 17:33:04',3631,59,'2005-08-26 17:38:04',2,'2006-02-15 21:30:53'),(15906,'2005-08-23 17:36:00',3230,445,'2005-08-28 15:32:00',2,'2006-02-15 21:30:53'),(15907,'2005-08-23 17:39:35',2898,2,'2005-08-25 23:23:35',1,'2006-02-15 21:30:53'),(15908,'2005-08-23 17:42:00',2453,135,'2005-08-31 22:32:00',1,'2006-02-15 21:30:53'),(15909,'2005-08-23 17:42:42',404,452,'2005-08-26 20:25:42',1,'2006-02-15 21:30:53'),(15910,'2005-08-23 17:43:16',254,456,'2005-08-24 21:55:16',2,'2006-02-15 21:30:53'),(15911,'2005-08-23 17:44:53',3006,582,'2005-09-01 19:14:53',1,'2006-02-15 21:30:53'),(15912,'2005-08-23 17:47:40',3079,229,'2005-08-31 14:43:40',2,'2006-02-15 21:30:53'),(15913,'2005-08-23 17:48:30',3894,93,'2005-08-31 21:17:30',2,'2006-02-15 21:30:53'),(15914,'2005-08-23 17:49:26',747,557,'2005-08-24 12:20:26',1,'2006-02-15 21:30:53'),(15915,'2005-08-23 17:52:01',3566,167,'2005-08-24 20:40:01',2,'2006-02-15 21:30:53'),(15916,'2005-08-23 17:56:01',4580,327,'2005-08-31 21:49:01',2,'2006-02-15 21:30:53'),(15917,'2005-08-23 17:57:28',2093,589,'2005-08-29 20:03:28',1,'2006-02-15 21:30:53'),(15918,'2005-08-23 17:57:35',1456,262,'2005-08-28 14:16:35',2,'2006-02-15 21:30:53'),(15919,'2005-08-23 18:01:31',1746,497,'2005-08-24 16:27:31',1,'2006-02-15 21:30:53'),(15920,'2005-08-23 18:05:10',243,212,'2005-08-26 18:09:10',1,'2006-02-15 21:30:53'),(15921,'2005-08-23 18:06:54',223,522,'2005-08-30 20:19:54',2,'2006-02-15 21:30:53'),(15922,'2005-08-23 18:07:31',1702,263,'2005-09-01 22:27:31',1,'2006-02-15 21:30:53'),(15923,'2005-08-23 18:08:19',1693,276,'2005-08-26 18:06:19',2,'2006-02-15 21:30:53'),(15924,'2005-08-23 18:08:59',1114,541,'2005-08-27 12:20:59',2,'2006-02-15 21:30:53'),(15925,'2005-08-23 18:15:06',3394,440,'2005-08-26 18:09:06',2,'2006-02-15 21:30:53'),(15926,'2005-08-23 18:20:56',2231,151,'2005-08-24 18:20:56',2,'2006-02-15 21:30:53'),(15927,'2005-08-23 18:23:11',2450,401,'2005-08-24 15:09:11',1,'2006-02-15 21:30:53'),(15928,'2005-08-23 18:23:24',2086,75,'2005-09-01 23:43:24',2,'2006-02-15 21:30:53'),(15929,'2005-08-23 18:23:30',1832,477,'2005-08-27 17:04:30',1,'2006-02-15 21:30:53'),(15930,'2005-08-23 18:26:51',180,379,'2005-08-31 16:12:51',1,'2006-02-15 21:30:53'),(15931,'2005-08-23 18:28:09',1128,237,'2005-08-28 23:08:09',1,'2006-02-15 21:30:53'),(15932,'2005-08-23 18:31:40',4554,405,'2005-08-24 16:30:40',2,'2006-02-15 21:30:53'),(15933,'2005-08-23 18:36:44',3493,176,'2005-08-26 12:41:44',2,'2006-02-15 21:30:53'),(15934,'2005-08-23 18:40:41',994,216,'2005-08-25 00:18:41',2,'2006-02-15 21:30:53'),(15935,'2005-08-23 18:41:11',907,361,'2005-08-25 20:59:11',1,'2006-02-15 21:30:53'),(15936,'2005-08-23 18:43:11',1293,411,'2005-08-26 00:19:11',1,'2006-02-15 21:30:53'),(15937,'2005-08-23 18:43:22',2882,194,'2005-08-24 22:53:22',1,'2006-02-15 21:30:53'),(15938,'2005-08-23 18:43:31',2884,341,'2005-08-31 00:26:31',2,'2006-02-15 21:30:53'),(15939,'2005-08-23 18:44:21',3209,382,'2005-09-01 17:25:21',2,'2006-02-15 21:30:53'),(15940,'2005-08-23 18:45:06',1606,86,'2005-08-30 13:00:06',2,'2006-02-15 21:30:53'),(15941,'2005-08-23 18:46:44',4304,424,'2005-08-31 17:31:44',1,'2006-02-15 21:30:53'),(15942,'2005-08-23 18:48:40',1096,210,'2005-09-01 18:39:40',2,'2006-02-15 21:30:53'),(15943,'2005-08-23 18:49:32',706,462,'2005-08-27 19:20:32',1,'2006-02-15 21:30:53'),(15944,'2005-08-23 18:50:54',4559,348,'2005-08-25 18:04:54',2,'2006-02-15 21:30:53'),(15945,'2005-08-23 18:51:41',3633,43,'2005-08-28 18:42:41',1,'2006-02-15 21:30:53'),(15946,'2005-08-23 18:54:07',4549,561,'2005-08-28 21:21:07',1,'2006-02-15 21:30:53'),(15947,'2005-08-23 18:54:32',1877,580,'2005-08-24 22:39:32',2,'2006-02-15 21:30:53'),(15948,'2005-08-23 18:59:33',432,520,'2005-08-31 13:02:33',2,'2006-02-15 21:30:53'),(15949,'2005-08-23 19:06:04',1199,386,'2005-08-26 18:39:04',2,'2006-02-15 21:30:53'),(15950,'2005-08-23 19:09:39',1374,280,'2005-08-31 17:03:39',2,'2006-02-15 21:30:53'),(15951,'2005-08-23 19:10:32',3018,446,'2005-08-29 14:17:32',1,'2006-02-15 21:30:53'),(15952,'2005-08-23 19:11:29',1314,224,'2005-08-28 14:41:29',1,'2006-02-15 21:30:53'),(15953,'2005-08-23 19:13:46',3727,540,'2005-08-28 23:05:46',1,'2006-02-15 21:30:53'),(15954,'2005-08-23 19:14:07',576,460,'2005-08-24 20:21:07',1,'2006-02-15 21:30:53'),(15955,'2005-08-23 19:19:06',2247,349,'2005-08-31 23:34:06',1,'2006-02-15 21:30:53'),(15956,'2005-08-23 19:19:21',2763,354,'2005-08-25 22:15:21',2,'2006-02-15 21:30:53'),(15957,'2005-08-23 19:21:22',74,418,'2005-08-31 16:42:22',1,'2006-02-15 21:30:53'),(15958,'2005-08-23 19:22:36',4164,492,'2005-08-30 01:03:36',1,'2006-02-15 21:30:53'),(15959,'2005-08-23 19:27:04',547,415,'2005-08-24 15:24:04',1,'2006-02-15 21:30:53'),(15960,'2005-08-23 19:35:42',1497,431,'2005-08-26 17:36:42',2,'2006-02-15 21:30:53'),(15961,'2005-08-23 19:35:42',4006,200,'2005-08-30 22:52:42',1,'2006-02-15 21:30:53'),(15962,'2005-08-23 19:42:04',3491,160,'2005-08-25 23:53:04',1,'2006-02-15 21:30:53'),(15963,'2005-08-23 19:42:46',3819,134,'2005-08-25 22:12:46',1,'2006-02-15 21:30:53'),(15964,'2005-08-23 19:45:25',251,141,'2005-08-26 22:43:25',2,'2006-02-15 21:30:53'),(15965,'2005-08-23 19:46:39',3449,509,'2005-08-24 20:08:39',2,'2006-02-15 21:30:53'),(15966,'2006-02-14 15:16:03',4472,374,NULL,1,'2006-02-15 21:30:53'),(15967,'2005-08-23 19:50:06',321,257,'2005-08-29 14:51:06',1,'2006-02-15 21:30:53'),(15968,'2005-08-23 19:51:29',3598,257,'2005-08-24 15:07:29',1,'2006-02-15 21:30:53'),(15969,'2005-08-23 19:51:30',1807,327,'2005-08-31 23:50:30',1,'2006-02-15 21:30:53'),(15970,'2005-08-23 19:54:24',4509,395,'2005-08-24 18:07:24',1,'2006-02-15 21:30:53'),(15971,'2005-08-23 19:59:33',3456,187,'2005-09-02 01:28:33',1,'2006-02-15 21:30:53'),(15972,'2005-08-23 20:00:30',4428,25,'2005-08-30 00:25:30',1,'2006-02-15 21:30:53'),(15973,'2005-08-23 20:04:41',2766,343,'2005-09-01 20:08:41',2,'2006-02-15 21:30:53'),(15974,'2005-08-23 20:06:04',3518,201,'2005-08-27 17:33:04',2,'2006-02-15 21:30:53'),(15975,'2005-08-23 20:06:23',2723,174,'2005-08-27 19:52:23',1,'2006-02-15 21:30:53'),(15976,'2005-08-23 20:07:08',835,227,'2005-08-25 01:47:08',2,'2006-02-15 21:30:53'),(15977,'2005-08-23 20:07:10',1031,550,'2005-09-01 22:12:10',2,'2006-02-15 21:30:53'),(15978,'2005-08-23 20:08:18',4444,536,'2005-08-31 17:35:18',2,'2006-02-15 21:30:53'),(15979,'2005-08-23 20:08:26',3733,536,'2005-08-26 19:19:26',1,'2006-02-15 21:30:53'),(15980,'2005-08-23 20:10:13',3365,196,'2005-08-24 17:44:13',2,'2006-02-15 21:30:53'),(15981,'2005-08-23 20:12:17',2867,489,'2005-08-30 20:43:17',1,'2006-02-15 21:30:53'),(15982,'2005-08-23 20:13:31',2920,370,'2005-09-01 21:51:31',2,'2006-02-15 21:30:53'),(15983,'2005-08-23 20:13:38',3318,464,'2005-08-30 18:42:38',1,'2006-02-15 21:30:53'),(15984,'2005-08-23 20:16:27',2011,495,'2005-08-27 01:43:27',1,'2006-02-15 21:30:53'),(15985,'2005-08-23 20:20:23',2646,179,'2005-08-26 20:55:23',1,'2006-02-15 21:30:53'),(15986,'2005-08-23 20:20:37',3472,226,'2005-08-29 20:49:37',1,'2006-02-15 21:30:53'),(15987,'2005-08-23 20:22:17',3150,302,'2005-08-31 21:46:17',2,'2006-02-15 21:30:53'),(15988,'2005-08-23 20:23:08',3932,400,'2005-08-28 20:50:08',1,'2006-02-15 21:30:53'),(15989,'2005-08-23 20:24:36',38,96,'2005-08-26 20:35:36',1,'2006-02-15 21:30:53'),(15990,'2005-08-23 20:25:11',3233,512,'2005-08-25 15:01:11',2,'2006-02-15 21:30:53'),(15991,'2005-08-23 20:27:34',2078,203,'2005-08-28 16:48:34',2,'2006-02-15 21:30:53'),(15992,'2005-08-23 20:28:32',3334,589,'2005-08-24 21:35:32',1,'2006-02-15 21:30:53'),(15993,'2005-08-23 20:28:44',1638,12,'2005-08-27 16:23:44',2,'2006-02-15 21:30:53'),(15994,'2005-08-23 20:29:10',438,595,'2005-08-28 01:41:10',2,'2006-02-15 21:30:53'),(15995,'2005-08-23 20:29:56',1122,377,'2005-08-30 18:09:56',1,'2006-02-15 21:30:53'),(15996,'2005-08-23 20:31:38',3098,151,'2005-08-29 20:58:38',1,'2006-02-15 21:30:53'),(15997,'2005-08-23 20:40:31',2843,447,'2005-08-26 19:47:31',1,'2006-02-15 21:30:53'),(15998,'2005-08-23 20:41:09',1229,545,'2005-08-27 00:20:09',1,'2006-02-15 21:30:53'),(15999,'2005-08-23 20:44:10',2584,377,'2005-08-31 02:38:10',2,'2006-02-15 21:30:53'),(16000,'2005-08-23 20:44:36',282,71,'2005-08-25 02:29:36',1,'2006-02-15 21:30:53'),(16001,'2005-08-23 20:45:53',245,108,'2005-08-27 15:52:53',1,'2006-02-15 21:30:53'),(16002,'2005-08-23 20:47:12',2770,73,'2005-08-27 23:07:12',1,'2006-02-15 21:30:53'),(16003,'2005-08-23 20:47:28',3413,577,'2005-08-31 23:22:28',1,'2006-02-15 21:30:53'),(16004,'2005-08-23 20:53:20',2223,147,'2005-08-31 15:15:20',2,'2006-02-15 21:30:53'),(16005,'2005-08-23 21:00:22',3265,466,'2005-09-02 02:35:22',1,'2006-02-15 21:30:53'),(16006,'2005-08-23 21:01:09',240,533,'2005-08-25 19:33:09',1,'2006-02-15 21:30:53'),(16007,'2005-08-23 21:02:43',3236,126,'2005-08-30 23:37:43',2,'2006-02-15 21:30:53'),(16008,'2005-08-23 21:04:51',3273,189,'2005-08-31 22:09:51',1,'2006-02-15 21:30:53'),(16009,'2005-08-23 21:07:59',3055,133,'2005-08-29 16:54:59',2,'2006-02-15 21:30:53'),(16010,'2005-08-23 21:10:24',2539,173,'2005-08-25 17:58:24',1,'2006-02-15 21:30:53'),(16011,'2005-08-23 21:11:33',1093,389,'2005-08-31 17:51:33',1,'2006-02-15 21:30:53'),(16012,'2005-08-23 21:13:39',2421,80,'2005-08-30 23:52:39',2,'2006-02-15 21:30:53'),(16013,'2005-08-23 21:17:17',561,462,'2005-08-26 21:15:17',1,'2006-02-15 21:30:53'),(16014,'2005-08-23 21:18:31',3322,532,'2005-08-31 17:28:31',2,'2006-02-15 21:30:53'),(16015,'2005-08-23 21:25:03',3113,50,'2005-08-24 20:05:03',2,'2006-02-15 21:30:53'),(16016,'2005-08-23 21:26:35',3374,595,'2005-08-28 16:06:35',2,'2006-02-15 21:30:53'),(16017,'2005-08-23 21:27:11',664,535,'2005-08-24 23:22:11',1,'2006-02-15 21:30:53'),(16018,'2005-08-23 21:27:35',897,439,'2005-08-30 00:36:35',1,'2006-02-15 21:30:53'),(16019,'2005-08-23 21:30:45',3093,278,'2005-08-27 23:45:45',2,'2006-02-15 21:30:53'),(16020,'2005-08-23 21:34:33',277,311,'2005-09-01 18:17:33',1,'2006-02-15 21:30:53'),(16021,'2005-08-23 21:37:59',3057,314,'2005-08-31 01:52:59',1,'2006-02-15 21:30:53'),(16022,'2005-08-23 21:44:27',2925,504,'2005-08-28 01:52:27',1,'2006-02-15 21:30:53'),(16023,'2005-08-23 21:45:02',2347,124,'2005-08-24 21:28:02',1,'2006-02-15 21:30:53'),(16024,'2005-08-23 21:46:47',2910,473,'2005-08-27 02:06:47',1,'2006-02-15 21:30:53'),(16025,'2005-08-23 21:48:54',1777,569,'2005-08-24 22:05:54',2,'2006-02-15 21:30:53'),(16026,'2005-08-23 21:49:22',467,484,'2005-08-27 00:47:22',1,'2006-02-15 21:30:53'),(16027,'2005-08-23 21:49:33',1724,160,'2005-08-30 16:19:33',2,'2006-02-15 21:30:53'),(16028,'2005-08-23 21:52:56',2515,119,'2005-08-30 18:16:56',2,'2006-02-15 21:30:53'),(16029,'2005-08-23 21:54:02',953,143,'2005-08-29 23:55:02',1,'2006-02-15 21:30:53'),(16030,'2005-08-23 21:56:04',4161,137,'2005-08-31 01:24:04',2,'2006-02-15 21:30:53'),(16031,'2005-08-23 21:59:26',1843,102,'2005-08-29 20:15:26',1,'2006-02-15 21:30:53'),(16032,'2005-08-23 21:59:57',2527,447,'2005-08-31 22:46:57',2,'2006-02-15 21:30:53'),(16033,'2005-08-23 22:06:15',760,226,'2005-09-01 02:36:15',2,'2006-02-15 21:30:53'),(16034,'2005-08-23 22:06:34',655,502,'2005-08-29 18:44:34',1,'2006-02-15 21:30:53'),(16035,'2005-08-23 22:08:04',549,37,'2005-08-28 03:46:04',1,'2006-02-15 21:30:53'),(16036,'2005-08-23 22:12:44',1372,425,'2005-08-25 17:48:44',2,'2006-02-15 21:30:53'),(16037,'2005-08-23 22:13:04',341,45,'2005-09-01 02:48:04',2,'2006-02-15 21:30:53'),(16038,'2005-08-23 22:14:31',2612,172,'2005-08-30 03:28:31',1,'2006-02-15 21:30:53'),(16039,'2005-08-23 22:18:51',545,78,'2005-08-31 19:55:51',2,'2006-02-15 21:30:53'),(16040,'2005-08-23 22:19:33',3524,195,'2005-09-02 02:19:33',2,'2006-02-15 21:30:53'),(16041,'2005-08-23 22:20:26',4116,121,'2005-08-25 20:14:26',2,'2006-02-15 21:30:53'),(16042,'2005-08-23 22:20:40',629,131,'2005-08-24 17:54:40',1,'2006-02-15 21:30:53'),(16043,'2005-08-23 22:21:03',3869,526,'2005-08-31 03:09:03',2,'2006-02-15 21:30:53'),(16044,'2005-08-23 22:24:39',1312,468,'2005-08-25 04:08:39',1,'2006-02-15 21:30:53'),(16045,'2005-08-23 22:25:26',772,14,'2005-08-25 23:54:26',1,'2006-02-15 21:30:53'),(16046,'2005-08-23 22:26:47',4364,74,'2005-08-27 18:02:47',2,'2006-02-15 21:30:53'),(16047,'2005-08-23 22:42:48',2088,114,'2005-08-25 02:48:48',2,'2006-02-15 21:30:53'),(16048,'2005-08-23 22:43:07',2019,103,'2005-08-31 21:33:07',1,'2006-02-15 21:30:53'),(16049,'2005-08-23 22:50:12',2666,393,'2005-08-30 01:01:12',2,'2006-02-15 21:30:53'); -COMMIT; - --- --- Trigger to enforce rental_date on INSERT --- - -CREATE TRIGGER rental_date BEFORE INSERT ON rental FOR EACH ROW SET NEW.rental_date = NOW(); - --- --- Dumping data for table staff --- - -SET AUTOCOMMIT=0; -INSERT INTO staff VALUES (1,'Mike','Hillyer',3,NULL,'Mike.Hillyer@sakilastaff.com',1,1,'Mike','8cb2237d0679ca88db6464eac60da96345513964','2006-02-15 04:57:16'),(2,'Jon','Stephens',4,NULL,'Jon.Stephens@sakilastaff.com',2,1,'Jon','8cb2237d0679ca88db6464eac60da96345513964','2006-02-15 04:57:16'); -COMMIT; - --- --- Dumping data for table store --- - -SET AUTOCOMMIT=0; -INSERT INTO store VALUES (1,1,1,'2006-02-15 04:57:12'),(2,2,2,'2006-02-15 04:57:12'); -COMMIT; - -SET SQL_MODE=@OLD_SQL_MODE; -SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +-- Sakila Sample Database Data +-- Version 0.8 + +-- Copyright (c) 2006, MySQL AB +-- All rights reserved. + +-- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +-- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +-- * Neither the name of MySQL AB nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; + +USE sakila; + +-- +-- Dumping data for table actor +-- + +SET AUTOCOMMIT=0; +INSERT INTO actor VALUES (1,'PENELOPE','GUINESS','2006-02-15 04:34:33'),(2,'NICK','WAHLBERG','2006-02-15 04:34:33'),(3,'ED','CHASE','2006-02-15 04:34:33'),(4,'JENNIFER','DAVIS','2006-02-15 04:34:33'),(5,'JOHNNY','LOLLOBRIGIDA','2006-02-15 04:34:33'),(6,'BETTE','NICHOLSON','2006-02-15 04:34:33'),(7,'GRACE','MOSTEL','2006-02-15 04:34:33'),(8,'MATTHEW','JOHANSSON','2006-02-15 04:34:33'),(9,'JOE','SWANK','2006-02-15 04:34:33'),(10,'CHRISTIAN','GABLE','2006-02-15 04:34:33'),(11,'ZERO','CAGE','2006-02-15 04:34:33'),(12,'KARL','BERRY','2006-02-15 04:34:33'),(13,'UMA','WOOD','2006-02-15 04:34:33'),(14,'VIVIEN','BERGEN','2006-02-15 04:34:33'),(15,'CUBA','OLIVIER','2006-02-15 04:34:33'),(16,'FRED','COSTNER','2006-02-15 04:34:33'),(17,'HELEN','VOIGHT','2006-02-15 04:34:33'),(18,'DAN','TORN','2006-02-15 04:34:33'),(19,'BOB','FAWCETT','2006-02-15 04:34:33'),(20,'LUCILLE','TRACY','2006-02-15 04:34:33'),(21,'KIRSTEN','PALTROW','2006-02-15 04:34:33'),(22,'ELVIS','MARX','2006-02-15 04:34:33'),(23,'SANDRA','KILMER','2006-02-15 04:34:33'),(24,'CAMERON','STREEP','2006-02-15 04:34:33'),(25,'KEVIN','BLOOM','2006-02-15 04:34:33'),(26,'RIP','CRAWFORD','2006-02-15 04:34:33'),(27,'JULIA','MCQUEEN','2006-02-15 04:34:33'),(28,'WOODY','HOFFMAN','2006-02-15 04:34:33'),(29,'ALEC','WAYNE','2006-02-15 04:34:33'),(30,'SANDRA','PECK','2006-02-15 04:34:33'),(31,'SISSY','SOBIESKI','2006-02-15 04:34:33'),(32,'TIM','HACKMAN','2006-02-15 04:34:33'),(33,'MILLA','PECK','2006-02-15 04:34:33'),(34,'AUDREY','OLIVIER','2006-02-15 04:34:33'),(35,'JUDY','DEAN','2006-02-15 04:34:33'),(36,'BURT','DUKAKIS','2006-02-15 04:34:33'),(37,'VAL','BOLGER','2006-02-15 04:34:33'),(38,'TOM','MCKELLEN','2006-02-15 04:34:33'),(39,'GOLDIE','BRODY','2006-02-15 04:34:33'),(40,'JOHNNY','CAGE','2006-02-15 04:34:33'),(41,'JODIE','DEGENERES','2006-02-15 04:34:33'),(42,'TOM','MIRANDA','2006-02-15 04:34:33'),(43,'KIRK','JOVOVICH','2006-02-15 04:34:33'),(44,'NICK','STALLONE','2006-02-15 04:34:33'),(45,'REESE','KILMER','2006-02-15 04:34:33'),(46,'PARKER','GOLDBERG','2006-02-15 04:34:33'),(47,'JULIA','BARRYMORE','2006-02-15 04:34:33'),(48,'FRANCES','DAY-LEWIS','2006-02-15 04:34:33'),(49,'ANNE','CRONYN','2006-02-15 04:34:33'),(50,'NATALIE','HOPKINS','2006-02-15 04:34:33'),(51,'GARY','PHOENIX','2006-02-15 04:34:33'),(52,'CARMEN','HUNT','2006-02-15 04:34:33'),(53,'MENA','TEMPLE','2006-02-15 04:34:33'),(54,'PENELOPE','PINKETT','2006-02-15 04:34:33'),(55,'FAY','KILMER','2006-02-15 04:34:33'),(56,'DAN','HARRIS','2006-02-15 04:34:33'),(57,'JUDE','CRUISE','2006-02-15 04:34:33'),(58,'CHRISTIAN','AKROYD','2006-02-15 04:34:33'),(59,'DUSTIN','TAUTOU','2006-02-15 04:34:33'),(60,'HENRY','BERRY','2006-02-15 04:34:33'),(61,'CHRISTIAN','NEESON','2006-02-15 04:34:33'),(62,'JAYNE','NEESON','2006-02-15 04:34:33'),(63,'CAMERON','WRAY','2006-02-15 04:34:33'),(64,'RAY','JOHANSSON','2006-02-15 04:34:33'),(65,'ANGELA','HUDSON','2006-02-15 04:34:33'),(66,'MARY','TANDY','2006-02-15 04:34:33'),(67,'JESSICA','BAILEY','2006-02-15 04:34:33'),(68,'RIP','WINSLET','2006-02-15 04:34:33'),(69,'KENNETH','PALTROW','2006-02-15 04:34:33'),(70,'MICHELLE','MCCONAUGHEY','2006-02-15 04:34:33'),(71,'ADAM','GRANT','2006-02-15 04:34:33'),(72,'SEAN','WILLIAMS','2006-02-15 04:34:33'),(73,'GARY','PENN','2006-02-15 04:34:33'),(74,'MILLA','KEITEL','2006-02-15 04:34:33'),(75,'BURT','POSEY','2006-02-15 04:34:33'),(76,'ANGELINA','ASTAIRE','2006-02-15 04:34:33'),(77,'CARY','MCCONAUGHEY','2006-02-15 04:34:33'),(78,'GROUCHO','SINATRA','2006-02-15 04:34:33'),(79,'MAE','HOFFMAN','2006-02-15 04:34:33'),(80,'RALPH','CRUZ','2006-02-15 04:34:33'),(81,'SCARLETT','DAMON','2006-02-15 04:34:33'),(82,'WOODY','JOLIE','2006-02-15 04:34:33'),(83,'BEN','WILLIS','2006-02-15 04:34:33'),(84,'JAMES','PITT','2006-02-15 04:34:33'),(85,'MINNIE','ZELLWEGER','2006-02-15 04:34:33'),(86,'GREG','CHAPLIN','2006-02-15 04:34:33'),(87,'SPENCER','PECK','2006-02-15 04:34:33'),(88,'KENNETH','PESCI','2006-02-15 04:34:33'),(89,'CHARLIZE','DENCH','2006-02-15 04:34:33'),(90,'SEAN','GUINESS','2006-02-15 04:34:33'),(91,'CHRISTOPHER','BERRY','2006-02-15 04:34:33'),(92,'KIRSTEN','AKROYD','2006-02-15 04:34:33'),(93,'ELLEN','PRESLEY','2006-02-15 04:34:33'),(94,'KENNETH','TORN','2006-02-15 04:34:33'),(95,'DARYL','WAHLBERG','2006-02-15 04:34:33'),(96,'GENE','WILLIS','2006-02-15 04:34:33'),(97,'MEG','HAWKE','2006-02-15 04:34:33'),(98,'CHRIS','BRIDGES','2006-02-15 04:34:33'),(99,'JIM','MOSTEL','2006-02-15 04:34:33'),(100,'SPENCER','DEPP','2006-02-15 04:34:33'),(101,'SUSAN','DAVIS','2006-02-15 04:34:33'),(102,'WALTER','TORN','2006-02-15 04:34:33'),(103,'MATTHEW','LEIGH','2006-02-15 04:34:33'),(104,'PENELOPE','CRONYN','2006-02-15 04:34:33'),(105,'SIDNEY','CROWE','2006-02-15 04:34:33'),(106,'GROUCHO','DUNST','2006-02-15 04:34:33'),(107,'GINA','DEGENERES','2006-02-15 04:34:33'),(108,'WARREN','NOLTE','2006-02-15 04:34:33'),(109,'SYLVESTER','DERN','2006-02-15 04:34:33'),(110,'SUSAN','DAVIS','2006-02-15 04:34:33'),(111,'CAMERON','ZELLWEGER','2006-02-15 04:34:33'),(112,'RUSSELL','BACALL','2006-02-15 04:34:33'),(113,'MORGAN','HOPKINS','2006-02-15 04:34:33'),(114,'MORGAN','MCDORMAND','2006-02-15 04:34:33'),(115,'HARRISON','BALE','2006-02-15 04:34:33'),(116,'DAN','STREEP','2006-02-15 04:34:33'),(117,'RENEE','TRACY','2006-02-15 04:34:33'),(118,'CUBA','ALLEN','2006-02-15 04:34:33'),(119,'WARREN','JACKMAN','2006-02-15 04:34:33'),(120,'PENELOPE','MONROE','2006-02-15 04:34:33'),(121,'LIZA','BERGMAN','2006-02-15 04:34:33'),(122,'SALMA','NOLTE','2006-02-15 04:34:33'),(123,'JULIANNE','DENCH','2006-02-15 04:34:33'),(124,'SCARLETT','BENING','2006-02-15 04:34:33'),(125,'ALBERT','NOLTE','2006-02-15 04:34:33'),(126,'FRANCES','TOMEI','2006-02-15 04:34:33'),(127,'KEVIN','GARLAND','2006-02-15 04:34:33'),(128,'CATE','MCQUEEN','2006-02-15 04:34:33'),(129,'DARYL','CRAWFORD','2006-02-15 04:34:33'),(130,'GRETA','KEITEL','2006-02-15 04:34:33'),(131,'JANE','JACKMAN','2006-02-15 04:34:33'),(132,'ADAM','HOPPER','2006-02-15 04:34:33'),(133,'RICHARD','PENN','2006-02-15 04:34:33'),(134,'GENE','HOPKINS','2006-02-15 04:34:33'),(135,'RITA','REYNOLDS','2006-02-15 04:34:33'),(136,'ED','MANSFIELD','2006-02-15 04:34:33'),(137,'MORGAN','WILLIAMS','2006-02-15 04:34:33'),(138,'LUCILLE','DEE','2006-02-15 04:34:33'),(139,'EWAN','GOODING','2006-02-15 04:34:33'),(140,'WHOOPI','HURT','2006-02-15 04:34:33'),(141,'CATE','HARRIS','2006-02-15 04:34:33'),(142,'JADA','RYDER','2006-02-15 04:34:33'),(143,'RIVER','DEAN','2006-02-15 04:34:33'),(144,'ANGELA','WITHERSPOON','2006-02-15 04:34:33'),(145,'KIM','ALLEN','2006-02-15 04:34:33'),(146,'ALBERT','JOHANSSON','2006-02-15 04:34:33'),(147,'FAY','WINSLET','2006-02-15 04:34:33'),(148,'EMILY','DEE','2006-02-15 04:34:33'),(149,'RUSSELL','TEMPLE','2006-02-15 04:34:33'),(150,'JAYNE','NOLTE','2006-02-15 04:34:33'),(151,'GEOFFREY','HESTON','2006-02-15 04:34:33'),(152,'BEN','HARRIS','2006-02-15 04:34:33'),(153,'MINNIE','KILMER','2006-02-15 04:34:33'),(154,'MERYL','GIBSON','2006-02-15 04:34:33'),(155,'IAN','TANDY','2006-02-15 04:34:33'),(156,'FAY','WOOD','2006-02-15 04:34:33'),(157,'GRETA','MALDEN','2006-02-15 04:34:33'),(158,'VIVIEN','BASINGER','2006-02-15 04:34:33'),(159,'LAURA','BRODY','2006-02-15 04:34:33'),(160,'CHRIS','DEPP','2006-02-15 04:34:33'),(161,'HARVEY','HOPE','2006-02-15 04:34:33'),(162,'OPRAH','KILMER','2006-02-15 04:34:33'),(163,'CHRISTOPHER','WEST','2006-02-15 04:34:33'),(164,'HUMPHREY','WILLIS','2006-02-15 04:34:33'),(165,'AL','GARLAND','2006-02-15 04:34:33'),(166,'NICK','DEGENERES','2006-02-15 04:34:33'),(167,'LAURENCE','BULLOCK','2006-02-15 04:34:33'),(168,'WILL','WILSON','2006-02-15 04:34:33'),(169,'KENNETH','HOFFMAN','2006-02-15 04:34:33'),(170,'MENA','HOPPER','2006-02-15 04:34:33'),(171,'OLYMPIA','PFEIFFER','2006-02-15 04:34:33'),(172,'GROUCHO','WILLIAMS','2006-02-15 04:34:33'),(173,'ALAN','DREYFUSS','2006-02-15 04:34:33'),(174,'MICHAEL','BENING','2006-02-15 04:34:33'),(175,'WILLIAM','HACKMAN','2006-02-15 04:34:33'),(176,'JON','CHASE','2006-02-15 04:34:33'),(177,'GENE','MCKELLEN','2006-02-15 04:34:33'),(178,'LISA','MONROE','2006-02-15 04:34:33'),(179,'ED','GUINESS','2006-02-15 04:34:33'),(180,'JEFF','SILVERSTONE','2006-02-15 04:34:33'),(181,'MATTHEW','CARREY','2006-02-15 04:34:33'),(182,'DEBBIE','AKROYD','2006-02-15 04:34:33'),(183,'RUSSELL','CLOSE','2006-02-15 04:34:33'),(184,'HUMPHREY','GARLAND','2006-02-15 04:34:33'),(185,'MICHAEL','BOLGER','2006-02-15 04:34:33'),(186,'JULIA','ZELLWEGER','2006-02-15 04:34:33'),(187,'RENEE','BALL','2006-02-15 04:34:33'),(188,'ROCK','DUKAKIS','2006-02-15 04:34:33'),(189,'CUBA','BIRCH','2006-02-15 04:34:33'),(190,'AUDREY','BAILEY','2006-02-15 04:34:33'),(191,'GREGORY','GOODING','2006-02-15 04:34:33'),(192,'JOHN','SUVARI','2006-02-15 04:34:33'),(193,'BURT','TEMPLE','2006-02-15 04:34:33'),(194,'MERYL','ALLEN','2006-02-15 04:34:33'),(195,'JAYNE','SILVERSTONE','2006-02-15 04:34:33'),(196,'BELA','WALKEN','2006-02-15 04:34:33'),(197,'REESE','WEST','2006-02-15 04:34:33'),(198,'MARY','KEITEL','2006-02-15 04:34:33'),(199,'JULIA','FAWCETT','2006-02-15 04:34:33'),(200,'THORA','TEMPLE','2006-02-15 04:34:33'); +COMMIT; + +-- +-- Dumping data for table address +-- + +SET AUTOCOMMIT=0; +INSERT INTO address VALUES (1,'47 MySakila Drive',NULL,'Alberta',300,'','','2006-02-15 04:45:30'),(2,'28 MySQL Boulevard',NULL,'QLD',576,'','','2006-02-15 04:45:30'),(3,'23 Workhaven Lane',NULL,'Alberta',300,'','14033335568','2006-02-15 04:45:30'),(4,'1411 Lillydale Drive',NULL,'QLD',576,'','6172235589','2006-02-15 04:45:30'),(5,'1913 Hanoi Way','','Nagasaki',463,'35200','28303384290','2006-02-15 04:45:30'),(6,'1121 Loja Avenue','','California',449,'17886','838635286649','2006-02-15 04:45:30'),(7,'692 Joliet Street','','Attika',38,'83579','448477190408','2006-02-15 04:45:30'),(8,'1566 Inegl Manor','','Mandalay',349,'53561','705814003527','2006-02-15 04:45:30'),(9,'53 Idfu Parkway','','Nantou',361,'42399','10655648674','2006-02-15 04:45:30'),(10,'1795 Santiago de Compostela Way','','Texas',295,'18743','860452626434','2006-02-15 04:45:30'),(11,'900 Santiago de Compostela Parkway','','Central Serbia',280,'93896','716571220373','2006-02-15 04:45:30'),(12,'478 Joliet Way','','Hamilton',200,'77948','657282285970','2006-02-15 04:45:30'),(13,'613 Korolev Drive','','Masqat',329,'45844','380657522649','2006-02-15 04:45:30'),(14,'1531 Sal Drive','','Esfahan',162,'53628','648856936185','2006-02-15 04:45:30'),(15,'1542 Tarlac Parkway','','Kanagawa',440,'1027','635297277345','2006-02-15 04:45:30'),(16,'808 Bhopal Manor','','Haryana',582,'10672','465887807014','2006-02-15 04:45:30'),(17,'270 Amroha Parkway','','Osmaniye',384,'29610','695479687538','2006-02-15 04:45:30'),(18,'770 Bydgoszcz Avenue','','California',120,'16266','517338314235','2006-02-15 04:45:30'),(19,'419 Iligan Lane','','Madhya Pradesh',76,'72878','990911107354','2006-02-15 04:45:30'),(20,'360 Toulouse Parkway','','England',495,'54308','949312333307','2006-02-15 04:45:30'),(21,'270 Toulon Boulevard','','Kalmykia',156,'81766','407752414682','2006-02-15 04:45:30'),(22,'320 Brest Avenue','','Kaduna',252,'43331','747791594069','2006-02-15 04:45:30'),(23,'1417 Lancaster Avenue','','Northern Cape',267,'72192','272572357893','2006-02-15 04:45:30'),(24,'1688 Okara Way','','Nothwest Border Prov',327,'21954','144453869132','2006-02-15 04:45:30'),(25,'262 A Corua (La Corua) Parkway','','Dhaka',525,'34418','892775750063','2006-02-15 04:45:30'),(26,'28 Charlotte Amalie Street','','Rabat-Sal-Zammour-Z',443,'37551','161968374323','2006-02-15 04:45:30'),(27,'1780 Hino Boulevard','','Liepaja',303,'7716','902731229323','2006-02-15 04:45:30'),(28,'96 Tafuna Way','','Crdoba',128,'99865','934730187245','2006-02-15 04:45:30'),(29,'934 San Felipe de Puerto Plata Street','','Sind',472,'99780','196495945706','2006-02-15 04:45:30'),(30,'18 Duisburg Boulevard','','',121,'58327','998009777982','2006-02-15 04:45:30'),(31,'217 Botshabelo Place','','Southern Mindanao',138,'49521','665356572025','2006-02-15 04:45:30'),(32,'1425 Shikarpur Manor','','Bihar',346,'65599','678220867005','2006-02-15 04:45:30'),(33,'786 Aurora Avenue','','Yamaguchi',474,'65750','18461860151','2006-02-15 04:45:30'),(34,'1668 Anpolis Street','','Taipei',316,'50199','525255540978','2006-02-15 04:45:30'),(35,'33 Gorontalo Way','','West Bengali',257,'30348','745994947458','2006-02-15 04:45:30'),(36,'176 Mandaluyong Place','','Uttar Pradesh',239,'65213','627705991774','2006-02-15 04:45:30'),(37,'127 Purnea (Purnia) Manor','','Piemonte',17,'79388','911872220378','2006-02-15 04:45:30'),(38,'61 Tama Street','','Okayama',284,'94065','708403338270','2006-02-15 04:45:30'),(39,'391 Callao Drive','','Midi-Pyrnes',544,'34021','440512153169','2006-02-15 04:45:30'),(40,'334 Munger (Monghyr) Lane','','Markazi',31,'38145','481183273622','2006-02-15 04:45:30'),(41,'1440 Fukuyama Loop','','Henan',362,'47929','912257250465','2006-02-15 04:45:30'),(42,'269 Cam Ranh Parkway','','Chisinau',115,'34689','489783829737','2006-02-15 04:45:30'),(43,'306 Antofagasta Place','','Esprito Santo',569,'3989','378318851631','2006-02-15 04:45:30'),(44,'671 Graz Street','','Oriental',353,'94399','680768868518','2006-02-15 04:45:30'),(45,'42 Brindisi Place','','Yerevan',586,'16744','42384721397','2006-02-15 04:45:30'),(46,'1632 Bislig Avenue','','Nonthaburi',394,'61117','471675840679','2006-02-15 04:45:30'),(47,'1447 Imus Way','','Tahiti',167,'48942','539758313890','2006-02-15 04:45:30'),(48,'1998 Halifax Drive','','Lipetsk',308,'76022','177727722820','2006-02-15 04:45:30'),(49,'1718 Valencia Street','','Antofagasta',27,'37359','675292816413','2006-02-15 04:45:30'),(50,'46 Pjatigorsk Lane','','Moscow (City)',343,'23616','262076994845','2006-02-15 04:45:30'),(51,'686 Garland Manor','','Cear',247,'52535','69493378813','2006-02-15 04:45:30'),(52,'909 Garland Manor','','Tatarstan',367,'69367','705800322606','2006-02-15 04:45:30'),(53,'725 Isesaki Place','','Mekka',237,'74428','876295323994','2006-02-15 04:45:30'),(54,'115 Hidalgo Parkway','','Khartum',379,'80168','307703950263','2006-02-15 04:45:30'),(55,'1135 Izumisano Parkway','','California',171,'48150','171822533480','2006-02-15 04:45:30'),(56,'939 Probolinggo Loop','','Galicia',1,'4166','680428310138','2006-02-15 04:45:30'),(57,'17 Kabul Boulevard','','Chiba',355,'38594','697760867968','2006-02-15 04:45:30'),(58,'1964 Allappuzha (Alleppey) Street','','Yamaguchi',227,'48980','920811325222','2006-02-15 04:45:30'),(59,'1697 Kowloon and New Kowloon Loop','','Moskova',49,'57807','499352017190','2006-02-15 04:45:30'),(60,'1668 Saint Louis Place','','Tahiti',397,'39072','347487831378','2006-02-15 04:45:30'),(61,'943 Tokat Street','','Vaduz',560,'45428','889318963672','2006-02-15 04:45:30'),(62,'1114 Liepaja Street','','Sarawak',282,'69226','212869228936','2006-02-15 04:45:30'),(63,'1213 Ranchi Parkway','','Karnataka',350,'94352','800024380485','2006-02-15 04:45:30'),(64,'81 Hodeida Way','','Rajasthan',231,'55561','250767749542','2006-02-15 04:45:30'),(65,'915 Ponce Place','','Basel-Stadt',56,'83980','1395251317','2006-02-15 04:45:30'),(66,'1717 Guadalajara Lane','','Missouri',441,'85505','914090181665','2006-02-15 04:45:30'),(67,'1214 Hanoi Way','','Nebraska',306,'67055','491001136577','2006-02-15 04:45:30'),(68,'1966 Amroha Avenue','','Sichuan',139,'70385','333489324603','2006-02-15 04:45:30'),(69,'698 Otsu Street','','Cayenne',105,'71110','409983924481','2006-02-15 04:45:30'),(70,'1150 Kimchon Manor','','Skne ln',321,'96109','663449333709','2006-02-15 04:45:30'),(71,'1586 Guaruj Place','','Hunan',579,'5135','947233365992','2006-02-15 04:45:30'),(72,'57 Arlington Manor','','Madhya Pradesh',475,'48960','990214419142','2006-02-15 04:45:30'),(73,'1031 Daugavpils Parkway','','Bchar',63,'59025','107137400143','2006-02-15 04:45:30'),(74,'1124 Buenaventura Drive','','Mekka',13,'6856','407733804223','2006-02-15 04:45:30'),(75,'492 Cam Ranh Street','','Eastern Visayas',61,'50805','565018274456','2006-02-15 04:45:30'),(76,'89 Allappuzha (Alleppey) Manor','','National Capital Reg',517,'75444','255800440636','2006-02-15 04:45:30'),(77,'1947 Poos de Caldas Boulevard','','Chiayi',114,'60951','427454485876','2006-02-15 04:45:30'),(78,'1206 Dos Quebradas Place','','So Paulo',431,'20207','241832790687','2006-02-15 04:45:30'),(79,'1551 Rampur Lane','','Changhwa',108,'72394','251164340471','2006-02-15 04:45:30'),(80,'602 Paarl Street','','Pavlodar',402,'98889','896314772871','2006-02-15 04:45:30'),(81,'1692 Ede Loop','','So Paulo',30,'9223','918711376618','2006-02-15 04:45:30'),(82,'936 Salzburg Lane','','Uttar Pradesh',425,'96709','875756771675','2006-02-15 04:45:30'),(83,'586 Tete Way','','Kanagawa',256,'1079','18581624103','2006-02-15 04:45:30'),(84,'1888 Kabul Drive','','Oyo & Osun',217,'20936','701457319790','2006-02-15 04:45:30'),(85,'320 Baiyin Parkway','','Mahajanga',319,'37307','223664661973','2006-02-15 04:45:30'),(86,'927 Baha Blanca Parkway','','Krim',479,'9495','821972242086','2006-02-15 04:45:30'),(87,'929 Tallahassee Loop','','Gauteng',497,'74671','800716535041','2006-02-15 04:45:30'),(88,'125 Citt del Vaticano Boulevard','','Puebla',40,'67912','48417642933','2006-02-15 04:45:30'),(89,'1557 Ktahya Boulevard','','England',88,'88002','720998247660','2006-02-15 04:45:30'),(90,'870 Ashqelon Loop','','Songkhla',489,'84931','135117278909','2006-02-15 04:45:30'),(91,'1740 Portoviejo Avenue','','Sucre',480,'29932','198123170793','2006-02-15 04:45:30'),(92,'1942 Ciparay Parkway','','Cheju',113,'82624','978987363654','2006-02-15 04:45:30'),(93,'1926 El Alto Avenue','','Buenos Aires',289,'75543','846225459260','2006-02-15 04:45:30'),(94,'1952 Chatsworth Drive','','Guangdong',332,'25958','991562402283','2006-02-15 04:45:30'),(95,'1370 Le Mans Avenue','','Brunei and Muara',53,'52163','345679835036','2006-02-15 04:45:30'),(96,'984 Effon-Alaiye Avenue','','Gois',183,'17119','132986892228','2006-02-15 04:45:30'),(97,'832 Nakhon Sawan Manor','','Inner Mongolia',592,'49021','275595571388','2006-02-15 04:45:30'),(98,'152 Kitwe Parkway','','Caraga',82,'53182','835433605312','2006-02-15 04:45:30'),(99,'1697 Tanauan Lane','','Punjab',399,'22870','4764773857','2006-02-15 04:45:30'),(100,'1308 Arecibo Way','','Georgia',41,'30695','6171054059','2006-02-15 04:45:30'),(101,'1599 Plock Drive','','Tete',534,'71986','817248913162','2006-02-15 04:45:30'),(102,'669 Firozabad Loop','','Abu Dhabi',12,'92265','412903167998','2006-02-15 04:45:30'),(103,'588 Vila Velha Manor','','Kyongsangbuk',268,'51540','333339908719','2006-02-15 04:45:30'),(104,'1913 Kamakura Place','','Lipetsk',238,'97287','942570536750','2006-02-15 04:45:30'),(105,'733 Mandaluyong Place','','Asir',2,'77459','196568435814','2006-02-15 04:45:30'),(106,'659 Vaduz Drive','','Ha Darom',34,'49708','709935135487','2006-02-15 04:45:30'),(107,'1177 Jelets Way','','Kwara & Kogi',220,'3305','484292626944','2006-02-15 04:45:30'),(108,'1386 Yangor Avenue','','Provence-Alpes-Cte',543,'80720','449216226468','2006-02-15 04:45:30'),(109,'454 Nakhon Sawan Boulevard','','Funafuti',173,'76383','963887147572','2006-02-15 04:45:30'),(110,'1867 San Juan Bautista Tuxtepec Avenue','','Ivanovo',225,'78311','547003310357','2006-02-15 04:45:30'),(111,'1532 Dzerzinsk Way','','Buenos Aires',334,'9599','330838016880','2006-02-15 04:45:30'),(112,'1002 Ahmadnagar Manor','','Mxico',213,'93026','371490777743','2006-02-15 04:45:30'),(113,'682 Junan Way','','North West',273,'30418','622255216127','2006-02-15 04:45:30'),(114,'804 Elista Drive','','Hubei',159,'61069','379804592943','2006-02-15 04:45:30'),(115,'1378 Alvorada Avenue','','Distrito Federal',102,'75834','272234298332','2006-02-15 04:45:30'),(116,'793 Cam Ranh Avenue','','California',292,'87057','824370924746','2006-02-15 04:45:30'),(117,'1079 Tel Aviv-Jaffa Boulevard','','Sucre',132,'10885','358178933857','2006-02-15 04:45:30'),(118,'442 Rae Bareli Place','','Nordrhein-Westfalen',148,'24321','886636413768','2006-02-15 04:45:30'),(119,'1107 Nakhon Sawan Avenue','','Mxico',365,'75149','867546627903','2006-02-15 04:45:30'),(120,'544 Malm Parkway','','Central Java',403,'63502','386759646229','2006-02-15 04:45:30'),(121,'1967 Sincelejo Place','','Gujarat',176,'73644','577812616052','2006-02-15 04:45:30'),(122,'333 Goinia Way','','Texas',185,'78625','909029256431','2006-02-15 04:45:30'),(123,'1987 Coacalco de Berriozbal Loop','','al-Qalyubiya',476,'96065','787654415858','2006-02-15 04:45:30'),(124,'241 Mosul Lane','','Risaralda',147,'76157','765345144779','2006-02-15 04:45:30'),(125,'211 Chiayi Drive','','Uttar Pradesh',164,'58186','665993880048','2006-02-15 04:45:30'),(126,'1175 Tanauan Way','','Lima',305,'64615','937222955822','2006-02-15 04:45:30'),(127,'117 Boa Vista Way','','Uttar Pradesh',566,'6804','677976133614','2006-02-15 04:45:30'),(128,'848 Tafuna Manor','','Ktahya',281,'45142','614935229095','2006-02-15 04:45:30'),(129,'569 Baicheng Lane','','Gauteng',85,'60304','490211944645','2006-02-15 04:45:30'),(130,'1666 Qomsheh Drive','','So Paulo',410,'66255','582835362905','2006-02-15 04:45:30'),(131,'801 Hagonoy Drive','','Smolensk',484,'8439','237426099212','2006-02-15 04:45:30'),(132,'1050 Garden Grove Avenue','','Slaskie',236,'4999','973047364353','2006-02-15 04:45:30'),(133,'1854 Tieli Street','','Shandong',302,'15819','509492324775','2006-02-15 04:45:30'),(134,'758 Junan Lane','','Gois',190,'82639','935448624185','2006-02-15 04:45:30'),(135,'1752 So Leopoldo Parkway','','Taka-Karpatia',345,'14014','252265130067','2006-02-15 04:45:30'),(136,'898 Belm Manor','','Free State',87,'49757','707169393853','2006-02-15 04:45:30'),(137,'261 Saint Louis Way','','Coahuila de Zaragoza',541,'83401','321944036800','2006-02-15 04:45:30'),(138,'765 Southampton Drive','','al-Qalyubiya',421,'4285','23712411567','2006-02-15 04:45:30'),(139,'943 Johannesburg Avenue','','Maharashtra',417,'5892','90921003005','2006-02-15 04:45:30'),(140,'788 Atinsk Street','','Karnataka',211,'81691','146497509724','2006-02-15 04:45:30'),(141,'1749 Daxian Place','','Gelderland',29,'11044','963369996279','2006-02-15 04:45:30'),(142,'1587 Sullana Lane','','Inner Mongolia',207,'85769','468060467018','2006-02-15 04:45:30'),(143,'1029 Dzerzinsk Manor','','Ynlin',542,'57519','33173584456','2006-02-15 04:45:30'),(144,'1666 Beni-Mellal Place','','Tennessee',123,'13377','9099941466','2006-02-15 04:45:30'),(145,'928 Jaffna Loop','','Hiroshima',172,'93762','581852137991','2006-02-15 04:45:30'),(146,'483 Ljubertsy Parkway','','Scotland',149,'60562','581174211853','2006-02-15 04:45:30'),(147,'374 Bat Yam Boulevard','','Kilis',266,'97700','923261616249','2006-02-15 04:45:30'),(148,'1027 Songkhla Manor','','Minsk',340,'30861','563660187896','2006-02-15 04:45:30'),(149,'999 Sanaa Loop','','Gauteng',491,'3439','918032330119','2006-02-15 04:45:30'),(150,'879 Newcastle Way','','Michigan',499,'90732','206841104594','2006-02-15 04:45:30'),(151,'1337 Lincoln Parkway','','Saitama',555,'99457','597815221267','2006-02-15 04:45:30'),(152,'1952 Pune Lane','','Saint-Denis',442,'92150','354615066969','2006-02-15 04:45:30'),(153,'782 Mosul Street','','Massachusetts',94,'25545','885899703621','2006-02-15 04:45:30'),(154,'781 Shimonoseki Drive','','Michoacn de Ocampo',202,'95444','632316273199','2006-02-15 04:45:30'),(155,'1560 Jelets Boulevard','','Shandong',291,'77777','189446090264','2006-02-15 04:45:30'),(156,'1963 Moscow Place','','Assam',354,'64863','761379480249','2006-02-15 04:45:30'),(157,'456 Escobar Way','','Jakarta Raya',232,'36061','719202533520','2006-02-15 04:45:30'),(158,'798 Cianjur Avenue','','Shanxi',590,'76990','499408708580','2006-02-15 04:45:30'),(159,'185 Novi Sad Place','','Bern',72,'41778','904253967161','2006-02-15 04:45:30'),(160,'1367 Yantai Manor','','Ondo & Ekiti',381,'21294','889538496300','2006-02-15 04:45:30'),(161,'1386 Nakhon Sawan Boulevard','','Pyongyang-si',420,'53502','368899174225','2006-02-15 04:45:30'),(162,'369 Papeete Way','','North Carolina',187,'66639','170117068815','2006-02-15 04:45:30'),(163,'1440 Compton Place','','North Austria',307,'81037','931059836497','2006-02-15 04:45:30'),(164,'1623 Baha Blanca Manor','','Moskova',310,'81511','149981248346','2006-02-15 04:45:30'),(165,'97 Shimoga Avenue','','Tel Aviv',533,'44660','177167004331','2006-02-15 04:45:30'),(166,'1740 Le Mans Loop','','Pays de la Loire',297,'22853','168476538960','2006-02-15 04:45:30'),(167,'1287 Xiangfan Boulevard','','Gifu',253,'57844','819416131190','2006-02-15 04:45:30'),(168,'842 Salzburg Lane','','Adana',529,'3313','697151428760','2006-02-15 04:45:30'),(169,'154 Tallahassee Loop','','Xinxiang',199,'62250','935508855935','2006-02-15 04:45:30'),(170,'710 San Felipe del Progreso Avenue','','Lilongwe',304,'76901','843801144113','2006-02-15 04:45:30'),(171,'1540 Wroclaw Drive','','Maharashtra',107,'62686','182363341674','2006-02-15 04:45:30'),(172,'475 Atinsk Way','','Gansu',240,'59571','201705577290','2006-02-15 04:45:30'),(173,'1294 Firozabad Drive','','Jiangxi',407,'70618','161801569569','2006-02-15 04:45:30'),(174,'1877 Ezhou Lane','','Rajasthan',550,'63337','264541743403','2006-02-15 04:45:30'),(175,'316 Uruapan Street','','Perak',223,'58194','275788967899','2006-02-15 04:45:30'),(176,'29 Pyongyang Loop','','Batman',58,'47753','734780743462','2006-02-15 04:45:30'),(177,'1010 Klerksdorp Way','','Steiermark',186,'6802','493008546874','2006-02-15 04:45:30'),(178,'1848 Salala Boulevard','','Miranda',373,'25220','48265851133','2006-02-15 04:45:30'),(179,'431 Xiangtan Avenue','','Kerala',18,'4854','230250973122','2006-02-15 04:45:30'),(180,'757 Rustenburg Avenue','','Skikda',483,'89668','506134035434','2006-02-15 04:45:30'),(181,'146 Johannesburg Way','','Tamaulipas',330,'54132','953689007081','2006-02-15 04:45:30'),(182,'1891 Rizhao Boulevard','','So Paulo',456,'47288','391065549876','2006-02-15 04:45:30'),(183,'1089 Iwatsuki Avenue','','Kirov',270,'35109','866092335135','2006-02-15 04:45:30'),(184,'1410 Benin City Parkway','','Risaralda',405,'29747','104150372603','2006-02-15 04:45:30'),(185,'682 Garden Grove Place','','Tennessee',333,'67497','72136330362','2006-02-15 04:45:30'),(186,'533 al-Ayn Boulevard','','California',126,'8862','662227486184','2006-02-15 04:45:30'),(187,'1839 Szkesfehrvr Parkway','','Gois',317,'55709','947468818183','2006-02-15 04:45:30'),(188,'741 Ambattur Manor','','Noord-Brabant',438,'43310','302590383819','2006-02-15 04:45:30'),(189,'927 Barcelona Street','','Chaharmahal va Bakht',467,'65121','951486492670','2006-02-15 04:45:30'),(190,'435 0 Way','','West Bengali',195,'74750','760171523969','2006-02-15 04:45:30'),(191,'140 Chiayi Parkway','','Sumy',506,'38982','855863906434','2006-02-15 04:45:30'),(192,'1166 Changhwa Street','','Caraga',62,'58852','650752094490','2006-02-15 04:45:30'),(193,'891 Novi Sad Manor','','Ontario',383,'5379','247646995453','2006-02-15 04:45:30'),(194,'605 Rio Claro Parkway','','Tabora',513,'49348','352469351088','2006-02-15 04:45:30'),(195,'1077 San Felipe de Puerto Plata Place','','Rostov-na-Donu',369,'65387','812824036424','2006-02-15 04:45:30'),(196,'9 San Miguel de Tucumn Manor','','Uttar Pradesh',169,'90845','956188728558','2006-02-15 04:45:30'),(197,'447 Surakarta Loop','','Nyanza',271,'10428','940830176580','2006-02-15 04:45:30'),(198,'345 Oshawa Boulevard','','Tokyo-to',204,'32114','104491201771','2006-02-15 04:45:30'),(199,'1792 Valle de la Pascua Place','','Nordrhein-Westfalen',477,'15540','419419591240','2006-02-15 04:45:30'),(200,'1074 Binzhou Manor','','Baden-Wrttemberg',325,'36490','331132568928','2006-02-15 04:45:30'),(201,'817 Bradford Loop','','Jiangsu',109,'89459','264286442804','2006-02-15 04:45:30'),(202,'955 Bamenda Way','','Ondo & Ekiti',218,'1545','768481779568','2006-02-15 04:45:30'),(203,'1149 A Corua (La Corua) Boulevard','','Haiphong',194,'95824','470884141195','2006-02-15 04:45:30'),(204,'387 Mwene-Ditu Drive','','Ahal',35,'8073','764477681869','2006-02-15 04:45:30'),(205,'68 Molodetno Manor','','Nordrhein-Westfalen',575,'4662','146640639760','2006-02-15 04:45:30'),(206,'642 Nador Drive','','Maharashtra',77,'3924','369050085652','2006-02-15 04:45:30'),(207,'1688 Nador Lane','','Sulawesi Utara',184,'61613','652218196731','2006-02-15 04:45:30'),(208,'1215 Pyongyang Parkway','','Usak',557,'25238','646237101779','2006-02-15 04:45:30'),(209,'1679 Antofagasta Street','','Alto Paran',122,'86599','905903574913','2006-02-15 04:45:30'),(210,'1304 s-Hertogenbosch Way','','Santa Catarina',83,'10925','90336226227','2006-02-15 04:45:30'),(211,'850 Salala Loop','','Kitaa',371,'10800','403404780639','2006-02-15 04:45:30'),(212,'624 Oshawa Boulevard','','West Bengali',51,'89959','49677664184','2006-02-15 04:45:30'),(213,'43 Dadu Avenue','','Rajasthan',74,'4855','95666951770','2006-02-15 04:45:30'),(214,'751 Lima Loop','','Aden',7,'99405','756460337785','2006-02-15 04:45:30'),(215,'1333 Haldia Street','','Jilin',174,'82161','408304391718','2006-02-15 04:45:30'),(216,'660 Jedda Boulevard','','Washington',65,'25053','168758068397','2006-02-15 04:45:30'),(217,'1001 Miyakonojo Lane','','Taizz',518,'67924','584316724815','2006-02-15 04:45:30'),(218,'226 Brest Manor','','California',508,'2299','785881412500','2006-02-15 04:45:30'),(219,'1229 Valencia Parkway','','Haskovo',498,'99124','352679173732','2006-02-15 04:45:30'),(220,'1201 Qomsheh Manor','','Gois',28,'21464','873492228462','2006-02-15 04:45:30'),(221,'866 Shivapuri Manor','','Uttar Pradesh',448,'22474','778502731092','2006-02-15 04:45:30'),(222,'1168 Najafabad Parkway','','Kabol',251,'40301','886649065861','2006-02-15 04:45:30'),(223,'1244 Allappuzha (Alleppey) Place','','Buenos Aires',567,'20657','991802825778','2006-02-15 04:45:30'),(224,'1842 Luzinia Boulevard','','Zanzibar West',593,'94420','706878974831','2006-02-15 04:45:30'),(225,'1926 Gingoog Street','','Sisilia',511,'22824','469738825391','2006-02-15 04:45:30'),(226,'810 Palghat (Palakkad) Boulevard','','Jaroslavl',235,'73431','516331171356','2006-02-15 04:45:30'),(227,'1820 Maring Parkway','','Punjab',324,'88307','99760893676','2006-02-15 04:45:30'),(228,'60 Poos de Caldas Street','','Rajasthan',243,'82338','963063788669','2006-02-15 04:45:30'),(229,'1014 Loja Manor','','Tamil Nadu',22,'66851','460795526514','2006-02-15 04:45:30'),(230,'201 Effon-Alaiye Way','','Asuncin',37,'64344','684192903087','2006-02-15 04:45:30'),(231,'430 Alessandria Loop','','Saarland',439,'47446','669828224459','2006-02-15 04:45:30'),(232,'754 Valencia Place','','Phnom Penh',406,'87911','594319417514','2006-02-15 04:45:30'),(233,'356 Olomouc Manor','','Gois',26,'93323','22326410776','2006-02-15 04:45:30'),(234,'1256 Bislig Boulevard','','Botosani',86,'50598','479007229460','2006-02-15 04:45:30'),(235,'954 Kimchon Place','','West Bengali',559,'42420','541327526474','2006-02-15 04:45:30'),(236,'885 Yingkou Manor','','Kaduna',596,'31390','588964509072','2006-02-15 04:45:30'),(237,'1736 Cavite Place','','Qina',216,'98775','431770603551','2006-02-15 04:45:30'),(238,'346 Skikda Parkway','','Hawalli',233,'90628','630424482919','2006-02-15 04:45:30'),(239,'98 Stara Zagora Boulevard','','Valle',96,'76448','610173756082','2006-02-15 04:45:30'),(240,'1479 Rustenburg Boulevard','','Southern Tagalog',527,'18727','727785483194','2006-02-15 04:45:30'),(241,'647 A Corua (La Corua) Street','','Chollanam',357,'36971','792557457753','2006-02-15 04:45:30'),(242,'1964 Gijn Manor','','Karnataka',473,'14408','918119601885','2006-02-15 04:45:30'),(243,'47 Syktyvkar Lane','','West Java',118,'22236','63937119031','2006-02-15 04:45:30'),(244,'1148 Saarbrcken Parkway','','Fukushima',226,'1921','137773001988','2006-02-15 04:45:30'),(245,'1103 Bilbays Parkway','','Hubei',578,'87660','279979529227','2006-02-15 04:45:30'),(246,'1246 Boksburg Parkway','','Hebei',422,'28349','890283544295','2006-02-15 04:45:30'),(247,'1483 Pathankot Street','','Tucumn',454,'37288','686015532180','2006-02-15 04:45:30'),(248,'582 Papeete Loop','','Central Visayas',294,'27722','569868543137','2006-02-15 04:45:30'),(249,'300 Junan Street','','Kyonggi',553,'81314','890289150158','2006-02-15 04:45:30'),(250,'829 Grand Prairie Way','','Paran',328,'6461','741070712873','2006-02-15 04:45:30'),(251,'1473 Changhwa Parkway','','Mxico',124,'75933','266798132374','2006-02-15 04:45:30'),(252,'1309 Weifang Street','','Florida',520,'57338','435785045362','2006-02-15 04:45:30'),(253,'1760 Oshawa Manor','','Tianjin',535,'38140','56257502250','2006-02-15 04:45:30'),(254,'786 Stara Zagora Way','','Oyo & Osun',390,'98332','716256596301','2006-02-15 04:45:30'),(255,'1966 Tonghae Street','','Anhalt Sachsen',198,'36481','567359279425','2006-02-15 04:45:30'),(256,'1497 Yuzhou Drive','','England',312,'3433','246810237916','2006-02-15 04:45:30'),(258,'752 Ondo Loop','','Miyazaki',338,'32474','134673576619','2006-02-15 04:45:30'),(259,'1338 Zalantun Lane','','Minas Gerais',413,'45403','840522972766','2006-02-15 04:45:30'),(260,'127 Iwakuni Boulevard','','Central Luzon',192,'20777','987442542471','2006-02-15 04:45:30'),(261,'51 Laredo Avenue','','Sagaing',342,'68146','884536620568','2006-02-15 04:45:30'),(262,'771 Yaound Manor','','Sofala',64,'86768','245477603573','2006-02-15 04:45:30'),(263,'532 Toulon Street','','Santiago',460,'69517','46871694740','2006-02-15 04:45:30'),(264,'1027 Banjul Place','','West Bengali',197,'50390','538241037443','2006-02-15 04:45:30'),(265,'1158 Mandi Bahauddin Parkway','','Shanxi',136,'98484','276555730211','2006-02-15 04:45:30'),(266,'862 Xintai Lane','','Cagayan Valley',548,'30065','265153400632','2006-02-15 04:45:30'),(267,'816 Cayenne Parkway','','Manab',414,'93629','282874611748','2006-02-15 04:45:30'),(268,'1831 Nam Dinh Loop','','National Capital Reg',323,'51990','322888976727','2006-02-15 04:45:30'),(269,'446 Kirovo-Tepetsk Lane','','Osaka',203,'19428','303967439816','2006-02-15 04:45:30'),(270,'682 Halisahar Place','','Severn Morava',378,'20536','475553436330','2006-02-15 04:45:30'),(271,'1587 Loja Manor','','Salzburg',447,'5410','621625204422','2006-02-15 04:45:30'),(272,'1762 Paarl Parkway','','Hunan',298,'53928','192459639410','2006-02-15 04:45:30'),(273,'1519 Ilorin Place','','Kerala',395,'49298','357445645426','2006-02-15 04:45:30'),(274,'920 Kumbakonam Loop','','California',446,'75090','685010736240','2006-02-15 04:45:30'),(275,'906 Goinia Way','','Wielkopolskie',255,'83565','701767622697','2006-02-15 04:45:30'),(276,'1675 Xiangfan Manor','','Tamil Nadu',283,'11763','271149517630','2006-02-15 04:45:30'),(277,'85 San Felipe de Puerto Plata Drive','','Shandong',584,'46063','170739645687','2006-02-15 04:45:30'),(278,'144 South Hill Loop','','Guanajuato',445,'2012','45387294817','2006-02-15 04:45:30'),(279,'1884 Shikarpur Avenue','','Haryana',263,'85548','959949395183','2006-02-15 04:45:30'),(280,'1980 Kamjanets-Podilskyi Street','','Illinois',404,'89502','874337098891','2006-02-15 04:45:30'),(281,'1944 Bamenda Way','','Michigan',573,'24645','75975221996','2006-02-15 04:45:30'),(282,'556 Baybay Manor','','Oyo & Osun',374,'55802','363982224739','2006-02-15 04:45:30'),(283,'457 Tongliao Loop','','Bursa',222,'56254','880756161823','2006-02-15 04:45:30'),(284,'600 Bradford Street','','East Azerbaidzan',514,'96204','117592274996','2006-02-15 04:45:30'),(285,'1006 Santa Brbara dOeste Manor','','Ondo & Ekiti',389,'36229','85059738746','2006-02-15 04:45:30'),(286,'1308 Sumy Loop','','Fujian',175,'30657','583021225407','2006-02-15 04:45:30'),(287,'1405 Chisinau Place','','Ponce',411,'8160','62781725285','2006-02-15 04:45:30'),(288,'226 Halifax Street','','Xinxiang',277,'58492','790651020929','2006-02-15 04:45:30'),(289,'1279 Udine Parkway','','Edo & Delta',69,'75860','195003555232','2006-02-15 04:45:30'),(290,'1336 Benin City Drive','','Shiga',386,'46044','341242939532','2006-02-15 04:45:30'),(291,'1155 Liaocheng Place','','Oyo & Osun',152,'22650','558236142492','2006-02-15 04:45:30'),(292,'1993 Tabuk Lane','','Tamil Nadu',522,'64221','648482415405','2006-02-15 04:45:30'),(293,'86 Higashiosaka Lane','','Guanajuato',563,'33768','957128697225','2006-02-15 04:45:30'),(294,'1912 Allende Manor','','Kowloon and New Kowl',279,'58124','172262454487','2006-02-15 04:45:30'),(295,'544 Tarsus Boulevard','','Gurico',562,'53145','892523334','2006-02-15 04:45:30'),(296,'1936 Cuman Avenue','','Virginia',433,'61195','976798660411','2006-02-15 04:45:30'),(297,'1192 Tongliao Street','','Sharja',470,'19065','350970907017','2006-02-15 04:45:30'),(298,'44 Najafabad Way','','Baskimaa',146,'61391','96604821070','2006-02-15 04:45:30'),(299,'32 Pudukkottai Lane','','Ohio',140,'38834','967274728547','2006-02-15 04:45:30'),(300,'661 Chisinau Lane','','Pietari',274,'8856','816436065431','2006-02-15 04:45:30'),(301,'951 Stara Zagora Manor','','Punjab',400,'98573','429925609431','2006-02-15 04:45:30'),(302,'922 Vila Velha Loop','','Maharashtra',9,'4085','510737228015','2006-02-15 04:45:30'),(303,'898 Jining Lane','','Pohjois-Pohjanmaa',387,'40070','161643343536','2006-02-15 04:45:30'),(304,'1635 Kuwana Boulevard','','Hiroshima',205,'52137','710603868323','2006-02-15 04:45:30'),(305,'41 El Alto Parkway','','Maharashtra',398,'56883','51917807050','2006-02-15 04:45:30'),(306,'1883 Maikop Lane','','Kaliningrad',254,'68469','96110042435','2006-02-15 04:45:30'),(307,'1908 Gaziantep Place','','Liaoning',536,'58979','108053751300','2006-02-15 04:45:30'),(308,'687 Alessandria Parkway','','Sanaa',455,'57587','407218522294','2006-02-15 04:45:30'),(309,'827 Yuncheng Drive','','Callao',99,'79047','504434452842','2006-02-15 04:45:30'),(310,'913 Coacalco de Berriozbal Loop','','Texas',33,'42141','262088367001','2006-02-15 04:45:30'),(311,'715 So Bernardo do Campo Lane','','Kedah',507,'84804','181179321332','2006-02-15 04:45:30'),(312,'1354 Siegen Street','','Rio de Janeiro',25,'80184','573441801529','2006-02-15 04:45:30'),(313,'1191 Sungai Petani Boulevard','','Missouri',262,'9668','983259819766','2006-02-15 04:45:30'),(314,'1224 Huejutla de Reyes Boulevard','','Lombardia',91,'70923','806016930576','2006-02-15 04:45:30'),(315,'543 Bergamo Avenue','','Minas Gerais',215,'59686','103602195112','2006-02-15 04:45:30'),(316,'746 Joliet Lane','','Kursk',286,'94878','688485191923','2006-02-15 04:45:30'),(317,'780 Kimberley Way','','Tabuk',515,'17032','824396883951','2006-02-15 04:45:30'),(318,'1774 Yaound Place','','Hubei',166,'91400','613124286867','2006-02-15 04:45:30'),(319,'1957 Yantai Lane','','So Paulo',490,'59255','704948322302','2006-02-15 04:45:30'),(320,'1542 Lubumbashi Boulevard','','Tel Aviv',57,'62472','508800331065','2006-02-15 04:45:30'),(321,'651 Pathankot Loop','','Maharashtra',336,'59811','139378397418','2006-02-15 04:45:30'),(322,'1359 Zhoushan Parkway','','Streymoyar',545,'29763','46568045367','2006-02-15 04:45:30'),(323,'1769 Iwaki Lane','','Kujawsko-Pomorskie',97,'25787','556100547674','2006-02-15 04:45:30'),(324,'1145 Vilnius Manor','','Mxico',451,'73170','674805712553','2006-02-15 04:45:30'),(325,'1892 Nabereznyje Telny Lane','','Tutuila',516,'28396','478229987054','2006-02-15 04:45:30'),(326,'470 Boksburg Street','','Central',81,'97960','908029859266','2006-02-15 04:45:30'),(327,'1427 A Corua (La Corua) Place','','Buenos Aires',45,'85799','972574862516','2006-02-15 04:45:30'),(328,'479 San Felipe del Progreso Avenue','','Morelos',130,'54949','869051782691','2006-02-15 04:45:30'),(329,'867 Benin City Avenue','','Henan',591,'78543','168884817145','2006-02-15 04:45:30'),(330,'981 Kumbakonam Place','','Distrito Federal',89,'87611','829116184079','2006-02-15 04:45:30'),(331,'1016 Iwakuni Street','','St George',269,'49833','961370847344','2006-02-15 04:45:30'),(332,'663 Baha Blanca Parkway','','Adana',5,'33463','834418779292','2006-02-15 04:45:30'),(333,'1860 Taguig Loop','','West Java',119,'59550','38158430589','2006-02-15 04:45:30'),(334,'1816 Bydgoszcz Loop','','Dhaka',234,'64308','965273813662','2006-02-15 04:45:30'),(335,'587 Benguela Manor','','Illinois',42,'91590','165450987037','2006-02-15 04:45:30'),(336,'430 Kumbakonam Drive','','Santa F',457,'28814','105470691550','2006-02-15 04:45:30'),(337,'1838 Tabriz Lane','','Dhaka',143,'1195','38988715447','2006-02-15 04:45:30'),(338,'431 Szkesfehrvr Avenue','','Baki',48,'57828','119501405123','2006-02-15 04:45:30'),(339,'503 Sogamoso Loop','','Sumqayit',505,'49812','834626715837','2006-02-15 04:45:30'),(340,'507 Smolensk Loop','','Sousse',492,'22971','80303246192','2006-02-15 04:45:30'),(341,'1920 Weifang Avenue','','Uttar Pradesh',427,'15643','869507847714','2006-02-15 04:45:30'),(342,'124 al-Manama Way','','Hiroshima',382,'52368','647899404952','2006-02-15 04:45:30'),(343,'1443 Mardan Street','','Western Cape',392,'31483','231383037471','2006-02-15 04:45:30'),(344,'1909 Benguela Lane','','Henan',581,'19913','624138001031','2006-02-15 04:45:30'),(345,'68 Ponce Parkway','','Hanoi',201,'85926','870635127812','2006-02-15 04:45:30'),(346,'1217 Konotop Avenue','','Gelderland',151,'504','718917251754','2006-02-15 04:45:30'),(347,'1293 Nam Dinh Way','','Roraima',84,'71583','697656479977','2006-02-15 04:45:30'),(348,'785 Vaduz Street','','Baja California',335,'36170','895616862749','2006-02-15 04:45:30'),(349,'1516 Escobar Drive','','Tongatapu',370,'46069','64536069371','2006-02-15 04:45:30'),(350,'1628 Nagareyama Lane','','Central',453,'60079','20064292617','2006-02-15 04:45:30'),(351,'1157 Nyeri Loop','','Adygea',320,'56380','262744791493','2006-02-15 04:45:30'),(352,'1673 Tangail Drive','','Daugavpils',137,'26857','627924259271','2006-02-15 04:45:30'),(353,'381 Kabul Way','','Taipei',209,'87272','55477302294','2006-02-15 04:45:30'),(354,'953 Hodeida Street','','Southern Tagalog',221,'18841','53912826864','2006-02-15 04:45:30'),(355,'469 Nakhon Sawan Street','','Tuvassia',531,'58866','689199636560','2006-02-15 04:45:30'),(356,'1378 Beira Loop','','Krasnojarsk',597,'40792','840957664136','2006-02-15 04:45:30'),(357,'1641 Changhwa Place','','Nord-Ouest',52,'37636','256546485220','2006-02-15 04:45:30'),(358,'1698 Southport Loop','','Hidalgo',393,'49009','754358349853','2006-02-15 04:45:30'),(359,'519 Nyeri Manor','','So Paulo',461,'37650','764680915323','2006-02-15 04:45:30'),(360,'619 Hunuco Avenue','','Shimane',331,'81508','142596392389','2006-02-15 04:45:30'),(361,'45 Aparecida de Goinia Place','','Madhya Pradesh',464,'7431','650496654258','2006-02-15 04:45:30'),(362,'482 Kowloon and New Kowloon Manor','','Bratislava',90,'97056','738968474939','2006-02-15 04:45:30'),(363,'604 Bern Place','','Jharkhand',429,'5373','620719383725','2006-02-15 04:45:30'),(364,'1623 Kingstown Drive','','Buenos Aires',20,'91299','296394569728','2006-02-15 04:45:30'),(365,'1009 Zanzibar Lane','','Arecibo',32,'64875','102396298916','2006-02-15 04:45:30'),(366,'114 Jalib al-Shuyukh Manor','','Centre',585,'60440','845378657301','2006-02-15 04:45:30'),(367,'1163 London Parkway','','Par',66,'6066','675120358494','2006-02-15 04:45:30'),(368,'1658 Jastrzebie-Zdrj Loop','','Central',372,'96584','568367775448','2006-02-15 04:45:30'),(369,'817 Laredo Avenue','','Jalisco',188,'77449','151249681135','2006-02-15 04:45:30'),(370,'1565 Tangail Manor','','Okinawa',377,'45750','634445428822','2006-02-15 04:45:30'),(371,'1912 Emeishan Drive','','Balikesir',50,'33050','99883471275','2006-02-15 04:45:30'),(372,'230 Urawa Drive','','Andhra Pradesh',8,'2738','166898395731','2006-02-15 04:45:30'),(373,'1922 Miraj Way','','Esfahan',356,'13203','320471479776','2006-02-15 04:45:30'),(374,'433 Florencia Street','','Chihuahua',250,'91330','561729882725','2006-02-15 04:45:30'),(375,'1049 Matamoros Parkway','','Karnataka',191,'69640','960505250340','2006-02-15 04:45:30'),(376,'1061 Ede Avenue','','Southern Tagalog',98,'57810','333390595558','2006-02-15 04:45:30'),(377,'154 Oshawa Manor','','East Java',415,'72771','440365973660','2006-02-15 04:45:30'),(378,'1191 Tandil Drive','','Southern Tagalog',523,'6362','45554316010','2006-02-15 04:45:30'),(379,'1133 Rizhao Avenue','','Pernambuco',572,'2800','600264533987','2006-02-15 04:45:30'),(380,'1519 Santiago de los Caballeros Loop','','East Kasai',348,'22025','409315295763','2006-02-15 04:45:30'),(381,'1618 Olomouc Manor','','Kurgan',285,'26385','96846695220','2006-02-15 04:45:30'),(382,'220 Hidalgo Drive','','Kermanshah',265,'45298','342720754566','2006-02-15 04:45:30'),(383,'686 Donostia-San Sebastin Lane','','Guangdong',471,'97390','71857599858','2006-02-15 04:45:30'),(384,'97 Mogiljov Lane','','Gujarat',73,'89294','924815207181','2006-02-15 04:45:30'),(385,'1642 Charlotte Amalie Drive','','Slaskie',549,'75442','821476736117','2006-02-15 04:45:30'),(386,'1368 Maracabo Boulevard','','',493,'32716','934352415130','2006-02-15 04:45:30'),(387,'401 Sucre Boulevard','','New Hampshire',322,'25007','486395999608','2006-02-15 04:45:30'),(388,'368 Hunuco Boulevard','','Namibe',360,'17165','106439158941','2006-02-15 04:45:30'),(389,'500 Lincoln Parkway','','Jiangsu',210,'95509','550306965159','2006-02-15 04:45:30'),(390,'102 Chapra Drive','','Ibaragi',521,'14073','776031833752','2006-02-15 04:45:30'),(391,'1793 Meixian Place','','Hmelnytskyi',258,'33535','619966287415','2006-02-15 04:45:30'),(392,'514 Ife Way','','Shaba',315,'69973','900235712074','2006-02-15 04:45:30'),(393,'717 Changzhou Lane','','Southern Tagalog',104,'21615','426255288071','2006-02-15 04:45:30'),(394,'753 Ilorin Avenue','','Sichuan',157,'3656','464511145118','2006-02-15 04:45:30'),(395,'1337 Mit Ghamr Avenue','','Nakhon Sawan',358,'29810','175283210378','2006-02-15 04:45:30'),(396,'767 Pyongyang Drive','','Osaka',229,'83536','667736124769','2006-02-15 04:45:30'),(397,'614 Pak Kret Street','','Addis Abeba',6,'27796','47808359842','2006-02-15 04:45:30'),(398,'954 Lapu-Lapu Way','','Moskova',278,'8816','737229003916','2006-02-15 04:45:30'),(399,'331 Bydgoszcz Parkway','','Asturia',181,'966','537374465982','2006-02-15 04:45:30'),(400,'1152 Citrus Heights Manor','','al-Qadarif',15,'5239','765957414528','2006-02-15 04:45:30'),(401,'168 Cianjur Manor','','Saitama',228,'73824','679095087143','2006-02-15 04:45:30'),(402,'616 Hagonoy Avenue','','Krasnojarsk',39,'46043','604177838256','2006-02-15 04:45:30'),(403,'1190 0 Place','','Rio Grande do Sul',44,'10417','841876514789','2006-02-15 04:45:30'),(404,'734 Bchar Place','','Punjab',375,'30586','280578750435','2006-02-15 04:45:30'),(405,'530 Lausanne Lane','','Texas',135,'11067','775235029633','2006-02-15 04:45:30'),(406,'454 Patiala Lane','','Fukushima',276,'13496','794553031307','2006-02-15 04:45:30'),(407,'1346 Mysore Drive','','Bretagne',92,'61507','516647474029','2006-02-15 04:45:30'),(408,'990 Etawah Loop','','Tamil Nadu',564,'79940','206169448769','2006-02-15 04:45:30'),(409,'1266 Laredo Parkway','','Saitama',380,'7664','1483365694','2006-02-15 04:45:30'),(410,'88 Nagaon Manor','','Buenos Aires',524,'86868','779461480495','2006-02-15 04:45:30'),(411,'264 Bhimavaram Manor','','St Thomas',111,'54749','302526949177','2006-02-15 04:45:30'),(412,'1639 Saarbrcken Drive','','North West',437,'9827','328494873422','2006-02-15 04:45:30'),(413,'692 Amroha Drive','','Northern',230,'35575','359478883004','2006-02-15 04:45:30'),(414,'1936 Lapu-Lapu Parkway','','Bauchi & Gombe',141,'7122','653436985797','2006-02-15 04:45:30'),(415,'432 Garden Grove Street','','Ontario',430,'65630','615964523510','2006-02-15 04:45:30'),(416,'1445 Carmen Parkway','','West Java',117,'70809','598912394463','2006-02-15 04:45:30'),(417,'791 Salinas Street','','Punjab',208,'40509','129953030512','2006-02-15 04:45:30'),(418,'126 Acua Parkway','','West Bengali',71,'58888','480039662421','2006-02-15 04:45:30'),(419,'397 Sunnyvale Avenue','','Guanajuato',19,'55566','680851640676','2006-02-15 04:45:30'),(420,'992 Klerksdorp Loop','','Utrecht',23,'33711','855290087237','2006-02-15 04:45:30'),(421,'966 Arecibo Loop','','Sind',134,'94018','15273765306','2006-02-15 04:45:30'),(422,'289 Santo Andr Manor','','al-Sharqiya',16,'72410','214976066017','2006-02-15 04:45:30'),(423,'437 Chungho Drive','','Puerto Plata',450,'59489','491271355190','2006-02-15 04:45:30'),(424,'1948 Bayugan Parkway','','Bihar',264,'60622','987306329957','2006-02-15 04:45:30'),(425,'1866 al-Qatif Avenue','','California',155,'89420','546793516940','2006-02-15 04:45:30'),(426,'1661 Abha Drive','','Tamil Nadu',416,'14400','270456873752','2006-02-15 04:45:30'),(427,'1557 Cape Coral Parkway','','Hubei',293,'46875','368284120423','2006-02-15 04:45:30'),(428,'1727 Matamoros Place','','Sawhaj',465,'78813','129673677866','2006-02-15 04:45:30'),(429,'1269 Botosani Manor','','Guangdong',468,'47394','736517327853','2006-02-15 04:45:30'),(430,'355 Vitria de Santo Anto Way','','Oaxaca',452,'81758','548003849552','2006-02-15 04:45:30'),(431,'1596 Acua Parkway','','Jharkhand',418,'70425','157133457169','2006-02-15 04:45:30'),(432,'259 Ipoh Drive','','So Paulo',189,'64964','419009857119','2006-02-15 04:45:30'),(433,'1823 Hoshiarpur Lane','','Komi',510,'33191','307133768620','2006-02-15 04:45:30'),(434,'1404 Taguig Drive','','Okayama',547,'87212','572068624538','2006-02-15 04:45:30'),(435,'740 Udaipur Lane','','Nizni Novgorod',150,'33505','497288595103','2006-02-15 04:45:30'),(436,'287 Cuautla Boulevard','','Chuquisaca',501,'72736','82619513349','2006-02-15 04:45:30'),(437,'1766 Almirante Brown Street','','KwaZulu-Natal',364,'63104','617567598243','2006-02-15 04:45:30'),(438,'596 Huixquilucan Place','','Nampula',351,'65892','342709348083','2006-02-15 04:45:30'),(439,'1351 Aparecida de Goinia Parkway','','Northern Mindanao',391,'41775','959834530529','2006-02-15 04:45:30'),(440,'722 Bradford Lane','','Shandong',249,'90920','746251338300','2006-02-15 04:45:30'),(441,'983 Santa F Way','','British Colombia',565,'47472','145720452260','2006-02-15 04:45:30'),(442,'1245 Ibirit Way','','La Romana',290,'40926','331888642162','2006-02-15 04:45:30'),(443,'1836 Korla Parkway','','Copperbelt',272,'55405','689681677428','2006-02-15 04:45:30'),(444,'231 Kaliningrad Place','','Lombardia',70,'57833','575081026569','2006-02-15 04:45:30'),(445,'495 Bhimavaram Lane','','Maharashtra',144,'3','82088937724','2006-02-15 04:45:30'),(446,'1924 Shimonoseki Drive','','Batna',59,'52625','406784385440','2006-02-15 04:45:30'),(447,'105 Dzerzinsk Manor','','Inner Mongolia',540,'48570','240776414296','2006-02-15 04:45:30'),(448,'614 Denizli Parkway','','Rio Grande do Sul',486,'29444','876491807547','2006-02-15 04:45:30'),(449,'1289 Belm Boulevard','','Tartumaa',530,'88306','237368926031','2006-02-15 04:45:30'),(450,'203 Tambaram Street','','Buenos Aires',161,'73942','411549550611','2006-02-15 04:45:30'),(451,'1704 Tambaram Manor','','West Bengali',554,'2834','39463554936','2006-02-15 04:45:30'),(452,'207 Cuernavaca Loop','','Tatarstan',352,'52671','782900030287','2006-02-15 04:45:30'),(453,'319 Springs Loop','','Baijeri',160,'99552','72524459905','2006-02-15 04:45:30'),(454,'956 Nam Dinh Manor','','Kerman',481,'21872','474047727727','2006-02-15 04:45:30'),(455,'1947 Paarl Way','','Central Java',509,'23636','834061016202','2006-02-15 04:45:30'),(456,'814 Simferopol Loop','','Sinaloa',154,'48745','524567129902','2006-02-15 04:45:30'),(457,'535 Ahmadnagar Manor','','Abu Dhabi',3,'41136','985109775584','2006-02-15 04:45:30'),(458,'138 Caracas Boulevard','','Zulia',326,'16790','974433019532','2006-02-15 04:45:30'),(459,'251 Florencia Drive','','Michoacn de Ocampo',556,'16119','118011831565','2006-02-15 04:45:30'),(460,'659 Gatineau Boulevard','','La Paz',153,'28587','205524798287','2006-02-15 04:45:30'),(461,'1889 Valparai Way','','Ziguinchor',600,'75559','670370974122','2006-02-15 04:45:30'),(462,'1485 Bratislava Place','','Illinois',435,'83183','924663855568','2006-02-15 04:45:30'),(463,'935 Aden Boulevard','','Central Java',532,'64709','335052544020','2006-02-15 04:45:30'),(464,'76 Kermanshah Manor','','Esfahan',423,'23343','762361821578','2006-02-15 04:45:30'),(465,'734 Tanshui Avenue','','Caquet',170,'70664','366776723320','2006-02-15 04:45:30'),(466,'118 Jaffna Loop','','Northern Mindanao',182,'10447','325526730021','2006-02-15 04:45:30'),(467,'1621 Tongliao Avenue','','Irkutsk',558,'22173','209342540247','2006-02-15 04:45:30'),(468,'1844 Usak Avenue','','Nova Scotia',196,'84461','164414772677','2006-02-15 04:45:30'),(469,'1872 Toulon Loop','','OHiggins',428,'7939','928809465153','2006-02-15 04:45:30'),(470,'1088 Ibirit Place','','Jalisco',595,'88502','49084281333','2006-02-15 04:45:30'),(471,'1322 Mosul Parkway','','Shandong',145,'95400','268053970382','2006-02-15 04:45:30'),(472,'1447 Chatsworth Place','','Chihuahua',129,'41545','769370126331','2006-02-15 04:45:30'),(473,'1257 Guadalajara Street','','Karnataka',78,'33599','195337700615','2006-02-15 04:45:30'),(474,'1469 Plock Lane','','Galicia',388,'95835','622884741180','2006-02-15 04:45:30'),(475,'434 Ourense (Orense) Manor','','Hodeida',206,'14122','562370137426','2006-02-15 04:45:30'),(476,'270 Tambaram Parkway','','Gauteng',244,'9668','248446668735','2006-02-15 04:45:30'),(477,'1786 Salinas Place','','Nam Ha',359,'66546','206060652238','2006-02-15 04:45:30'),(478,'1078 Stara Zagora Drive','','Aceh',301,'69221','932992626595','2006-02-15 04:45:30'),(479,'1854 Okara Boulevard','','Drenthe',158,'42123','131912793873','2006-02-15 04:45:30'),(480,'421 Yaound Street','','Sumy',385,'11363','726875628268','2006-02-15 04:45:30'),(481,'1153 Allende Way','','Qubec',179,'20336','856872225376','2006-02-15 04:45:30'),(482,'808 Naala-Porto Parkway','','England',500,'41060','553452430707','2006-02-15 04:45:30'),(483,'632 Usolje-Sibirskoje Parkway','','Ha Darom',36,'73085','667648979883','2006-02-15 04:45:30'),(484,'98 Pyongyang Boulevard','','Ohio',11,'88749','191958435142','2006-02-15 04:45:30'),(485,'984 Novoterkassk Loop','','Gaziantep',180,'28165','435118527255','2006-02-15 04:45:30'),(486,'64 Korla Street','','Mwanza',347,'25145','510383179153','2006-02-15 04:45:30'),(487,'1785 So Bernardo do Campo Street','','Veracruz',125,'71182','684529463244','2006-02-15 04:45:30'),(488,'698 Jelets Boulevard','','Denizli',142,'2596','975185523021','2006-02-15 04:45:30'),(489,'1297 Alvorada Parkway','','Ningxia',587,'11839','508348602835','2006-02-15 04:45:30'),(490,'1909 Dayton Avenue','','Guangdong',469,'88513','702955450528','2006-02-15 04:45:30'),(491,'1789 Saint-Denis Parkway','','Coahuila de Zaragoza',4,'8268','936806643983','2006-02-15 04:45:30'),(492,'185 Mannheim Lane','','Stavropol',408,'23661','589377568313','2006-02-15 04:45:30'),(493,'184 Mandaluyong Street','','Baja California Sur',288,'94239','488425406814','2006-02-15 04:45:30'),(494,'591 Sungai Petani Drive','','Okayama',376,'46400','37247325001','2006-02-15 04:45:30'),(495,'656 Matamoros Drive','','Boyac',487,'19489','17305839123','2006-02-15 04:45:30'),(496,'775 ostka Drive','','al-Daqahliya',337,'22358','171973024401','2006-02-15 04:45:30'),(497,'1013 Tabuk Boulevard','','West Bengali',261,'96203','158399646978','2006-02-15 04:45:30'),(498,'319 Plock Parkway','','Istanbul',504,'26101','854259976812','2006-02-15 04:45:30'),(499,'1954 Kowloon and New Kowloon Way','','Chimborazo',434,'63667','898559280434','2006-02-15 04:45:30'),(500,'362 Rajkot Lane','','Gansu',47,'98030','962020153680','2006-02-15 04:45:30'),(501,'1060 Tandil Lane','','Shandong',432,'72349','211256301880','2006-02-15 04:45:30'),(502,'1515 Korla Way','','England',589,'57197','959467760895','2006-02-15 04:45:30'),(503,'1416 San Juan Bautista Tuxtepec Avenue','','Zufar',444,'50592','144206758053','2006-02-15 04:45:30'),(504,'1 Valle de Santiago Avenue','','Apulia',93,'86208','465897838272','2006-02-15 04:45:30'),(505,'519 Brescia Parkway','','East Java',318,'69504','793996678771','2006-02-15 04:45:30'),(506,'414 Mandaluyong Street','','Lubelskie',314,'16370','52709222667','2006-02-15 04:45:30'),(507,'1197 Sokoto Boulevard','','West Bengali',478,'87687','868602816371','2006-02-15 04:45:30'),(508,'496 Celaya Drive','','Nagano',552,'90797','759586584889','2006-02-15 04:45:30'),(509,'786 Matsue Way','','Illinois',245,'37469','111177206479','2006-02-15 04:45:30'),(510,'48 Maracabo Place','','Central Luzon',519,'1570','82671830126','2006-02-15 04:45:30'),(511,'1152 al-Qatif Lane','','Kalimantan Barat',412,'44816','131370665218','2006-02-15 04:45:30'),(512,'1269 Ipoh Avenue','','Eskisehir',163,'54674','402630109080','2006-02-15 04:45:30'),(513,'758 Korolev Parkway','','Andhra Pradesh',568,'75474','441628280920','2006-02-15 04:45:30'),(514,'1747 Rustenburg Place','','Bihar',110,'51369','442673923363','2006-02-15 04:45:30'),(515,'886 Tonghae Place','','Volgograd',259,'19450','711928348157','2006-02-15 04:45:30'),(516,'1574 Goinia Boulevard','','Heilongjiang',502,'39529','59634255214','2006-02-15 04:45:30'),(517,'548 Uruapan Street','','Ontario',312,'35653','879347453467','2006-02-15 04:45:30'),(519,'962 Tama Loop','','',583,'65952','282667506728','2006-02-15 04:45:30'),(520,'1778 Gijn Manor','','Hubei',594,'35156','288910576761','2006-02-15 04:45:30'),(521,'568 Dhule (Dhulia) Loop','','Coquimbo',127,'92568','602101369463','2006-02-15 04:45:30'),(522,'1768 Udine Loop','','Battambang',60,'32347','448876499197','2006-02-15 04:45:30'),(523,'608 Birgunj Parkway','','Taipei',116,'400','627425618482','2006-02-15 04:45:30'),(524,'680 A Corua (La Corua) Manor','','Sivas',482,'49806','158326114853','2006-02-15 04:45:30'),(525,'1949 Sanya Street','','Gumma',224,'61244','132100972047','2006-02-15 04:45:30'),(526,'617 Klerksdorp Place','','Khanh Hoa',366,'94707','574973479129','2006-02-15 04:45:30'),(527,'1993 0 Loop','','Liaoning',588,'41214','25865528181','2006-02-15 04:45:30'),(528,'1176 Southend-on-Sea Manor','','Southern Tagalog',458,'81651','236679267178','2006-02-15 04:45:30'),(529,'600 Purnea (Purnia) Avenue','','Nghe An',571,'18043','638409958875','2006-02-15 04:45:30'),(530,'1003 Qinhuangdao Street','','West Java',419,'25972','35533115997','2006-02-15 04:45:30'),(531,'1986 Sivas Place','','Friuli-Venezia Giuli',551,'95775','182059202712','2006-02-15 04:45:30'),(532,'1427 Tabuk Place','','Florida',101,'31342','214756839122','2006-02-15 04:45:30'),(533,'556 Asuncin Way','','Mogiljov',339,'35364','338244023543','2006-02-15 04:45:30'),(534,'486 Ondo Parkway','','Benguela',67,'35202','105882218332','2006-02-15 04:45:30'),(535,'635 Brest Manor','','Andhra Pradesh',75,'40899','80593242951','2006-02-15 04:45:30'),(536,'166 Jinchang Street','','Buenos Aires',165,'86760','717566026669','2006-02-15 04:45:30'),(537,'958 Sagamihara Lane','','Mie',287,'88408','427274926505','2006-02-15 04:45:30'),(538,'1817 Livorno Way','','Khanh Hoa',100,'79401','478380208348','2006-02-15 04:45:30'),(539,'1332 Gaziantep Lane','','Shandong',80,'22813','383353187467','2006-02-15 04:45:30'),(540,'949 Allende Lane','','Uttar Pradesh',24,'67521','122981120653','2006-02-15 04:45:30'),(541,'195 Ilorin Street','','Chari-Baguirmi',363,'49250','8912935608','2006-02-15 04:45:30'),(542,'193 Bhusawal Place','','Kang-won',539,'9750','745267607502','2006-02-15 04:45:30'),(543,'43 Vilnius Manor','','Colorado',42,'79814','484500282381','2006-02-15 04:45:30'),(544,'183 Haiphong Street','','Jilin',46,'69953','488600270038','2006-02-15 04:45:30'),(545,'163 Augusta-Richmond County Loop','','Carabobo',561,'33030','754579047924','2006-02-15 04:45:30'),(546,'191 Jos Azueta Parkway','','Ruse',436,'13629','932156667696','2006-02-15 04:45:30'),(547,'379 Lublin Parkway','','Toscana',309,'74568','921960450089','2006-02-15 04:45:30'),(548,'1658 Cuman Loop','','Sumatera Selatan',396,'51309','784907335610','2006-02-15 04:45:30'),(549,'454 Qinhuangdao Drive','','Tadla-Azilal',68,'25866','786270036240','2006-02-15 04:45:30'),(550,'1715 Okayama Street','','So Paulo',485,'55676','169352919175','2006-02-15 04:45:30'),(551,'182 Nukualofa Drive','','Sumy',275,'15414','426346224043','2006-02-15 04:45:30'),(552,'390 Wroclaw Way','','Hainan',462,'5753','357593328658','2006-02-15 04:45:30'),(553,'1421 Quilmes Lane','','Ishikawa',260,'19151','135407755975','2006-02-15 04:45:30'),(554,'947 Trshavn Place','','Central Luzon',528,'841','50898428626','2006-02-15 04:45:30'),(555,'1764 Jalib al-Shuyukh Parkway','','Galicia',459,'77642','84794532510','2006-02-15 04:45:30'),(556,'346 Cam Ranh Avenue','','Zhejiang',599,'39976','978430786151','2006-02-15 04:45:30'),(557,'1407 Pachuca de Soto Place','','Rio Grande do Sul',21,'26284','380077794770','2006-02-15 04:45:30'),(558,'904 Clarksville Drive','','Zhejiang',193,'52234','955349440539','2006-02-15 04:45:30'),(559,'1917 Kumbakonam Parkway','','Vojvodina',368,'11892','698182547686','2006-02-15 04:45:30'),(560,'1447 Imus Place','','Gujarat',426,'12905','62127829280','2006-02-15 04:45:30'),(561,'1497 Fengshan Drive','','KwaZulu-Natal',112,'63022','368738360376','2006-02-15 04:45:30'),(562,'869 Shikarpur Way','','England',496,'57380','590764256785','2006-02-15 04:45:30'),(563,'1059 Yuncheng Avenue','','Vilna',570,'47498','107092893983','2006-02-15 04:45:30'),(564,'505 Madiun Boulevard','','Dolnoslaskie',577,'97271','970638808606','2006-02-15 04:45:30'),(565,'1741 Hoshiarpur Boulevard','','al-Sharqiya',79,'22372','855066328617','2006-02-15 04:45:30'),(566,'1229 Varanasi (Benares) Manor','','Buenos Aires',43,'40195','817740355461','2006-02-15 04:45:30'),(567,'1894 Boa Vista Way','','Texas',178,'77464','239357986667','2006-02-15 04:45:30'),(568,'1342 Sharja Way','','Sokoto & Kebbi & Zam',488,'93655','946114054231','2006-02-15 04:45:30'),(569,'1342 Abha Boulevard','','Bukarest',95,'10714','997453607116','2006-02-15 04:45:30'),(570,'415 Pune Avenue','','Shandong',580,'44274','203202500108','2006-02-15 04:45:30'),(571,'1746 Faaa Way','','Huanuco',214,'32515','863080561151','2006-02-15 04:45:30'),(572,'539 Hami Way','','Tokat',538,'52196','525518075499','2006-02-15 04:45:30'),(573,'1407 Surakarta Manor','','Moskova',466,'33224','324346485054','2006-02-15 04:45:30'),(574,'502 Mandi Bahauddin Parkway','','Anzotegui',55,'15992','618156722572','2006-02-15 04:45:30'),(575,'1052 Pathankot Avenue','','Sichuan',299,'77397','128499386727','2006-02-15 04:45:30'),(576,'1351 Sousse Lane','','Coahuila de Zaragoza',341,'37815','203804046132','2006-02-15 04:45:30'),(577,'1501 Pangkal Pinang Avenue','','Mazowieckie',409,'943','770864062795','2006-02-15 04:45:30'),(578,'1405 Hagonoy Avenue','','Slaskie',133,'86587','867287719310','2006-02-15 04:45:30'),(579,'521 San Juan Bautista Tuxtepec Place','','Qaraghandy',598,'95093','844018348565','2006-02-15 04:45:30'),(580,'923 Tangail Boulevard','','Tokyo-to',10,'33384','315528269898','2006-02-15 04:45:30'),(581,'186 Skikda Lane','','Morelos',131,'89422','14465669789','2006-02-15 04:45:30'),(582,'1568 Celaya Parkway','','Kaohsiung',168,'34750','278669994384','2006-02-15 04:45:30'),(583,'1489 Kakamigahara Lane','','Taipei',526,'98883','29341849811','2006-02-15 04:45:30'),(584,'1819 Alessandria Loop','','Campeche',103,'53829','377633994405','2006-02-15 04:45:30'),(585,'1208 Tama Loop','','Ninawa',344,'73605','954786054144','2006-02-15 04:45:30'),(586,'951 Springs Lane','','Central Mindanao',219,'96115','165164761435','2006-02-15 04:45:30'),(587,'760 Miyakonojo Drive','','Guerrero',246,'64682','294449058179','2006-02-15 04:45:30'),(588,'966 Asuncin Way','','Hidalgo',212,'62703','995527378381','2006-02-15 04:45:30'),(589,'1584 Ljubertsy Lane','','England',494,'22954','285710089439','2006-02-15 04:45:30'),(590,'247 Jining Parkway','','Banjul',54,'53446','170115379190','2006-02-15 04:45:30'),(591,'773 Dallas Manor','','Buenos Aires',424,'12664','914466027044','2006-02-15 04:45:30'),(592,'1923 Stara Zagora Lane','','Nantou',546,'95179','182178609211','2006-02-15 04:45:30'),(593,'1402 Zanzibar Boulevard','','Guanajuato',106,'71102','387448063440','2006-02-15 04:45:30'),(594,'1464 Kursk Parkway','','Shandong',574,'17381','338758048786','2006-02-15 04:45:30'),(595,'1074 Sanaa Parkway','','Loja',311,'22474','154124128457','2006-02-15 04:45:30'),(596,'1759 Niznekamsk Avenue','','al-Manama',14,'39414','864392582257','2006-02-15 04:45:30'),(597,'32 Liaocheng Way','','Minas Gerais',248,'1944','410877354933','2006-02-15 04:45:30'),(598,'42 Fontana Avenue','','Fejr',512,'14684','437829801725','2006-02-15 04:45:30'),(599,'1895 Zhezqazghan Drive','','California',177,'36693','137809746111','2006-02-15 04:45:30'),(600,'1837 Kaduna Parkway','','Inner Mongolia',241,'82580','640843562301','2006-02-15 04:45:30'),(601,'844 Bucuresti Place','','Liaoning',242,'36603','935952366111','2006-02-15 04:45:30'),(602,'1101 Bucuresti Boulevard','','West Greece',401,'97661','199514580428','2006-02-15 04:45:30'),(603,'1103 Quilmes Boulevard','','Piura',503,'52137','644021380889','2006-02-15 04:45:30'),(604,'1331 Usak Boulevard','','Vaud',296,'61960','145308717464','2006-02-15 04:45:30'),(605,'1325 Fukuyama Street','','Heilongjiang',537,'27107','288241215394','2006-02-15 04:45:30'); +COMMIT; + +-- +-- Dumping data for table category +-- + +SET AUTOCOMMIT=0; +INSERT INTO category VALUES (1,'Action','2006-02-15 04:46:27'),(2,'Animation','2006-02-15 04:46:27'),(3,'Children','2006-02-15 04:46:27'),(4,'Classics','2006-02-15 04:46:27'),(5,'Comedy','2006-02-15 04:46:27'),(6,'Documentary','2006-02-15 04:46:27'),(7,'Drama','2006-02-15 04:46:27'),(8,'Family','2006-02-15 04:46:27'),(9,'Foreign','2006-02-15 04:46:27'),(10,'Games','2006-02-15 04:46:27'),(11,'Horror','2006-02-15 04:46:27'),(12,'Music','2006-02-15 04:46:27'),(13,'New','2006-02-15 04:46:27'),(14,'Sci-Fi','2006-02-15 04:46:27'),(15,'Sports','2006-02-15 04:46:27'),(16,'Travel','2006-02-15 04:46:27'); +COMMIT; + +-- +-- Dumping data for table city +-- + +SET AUTOCOMMIT=0; +INSERT INTO city VALUES (1,'A Corua (La Corua)',87,'2006-02-15 04:45:25'),(2,'Abha',82,'2006-02-15 04:45:25'),(3,'Abu Dhabi',101,'2006-02-15 04:45:25'),(4,'Acua',60,'2006-02-15 04:45:25'),(5,'Adana',97,'2006-02-15 04:45:25'),(6,'Addis Abeba',31,'2006-02-15 04:45:25'),(7,'Aden',107,'2006-02-15 04:45:25'),(8,'Adoni',44,'2006-02-15 04:45:25'),(9,'Ahmadnagar',44,'2006-02-15 04:45:25'),(10,'Akishima',50,'2006-02-15 04:45:25'),(11,'Akron',103,'2006-02-15 04:45:25'),(12,'al-Ayn',101,'2006-02-15 04:45:25'),(13,'al-Hawiya',82,'2006-02-15 04:45:25'),(14,'al-Manama',11,'2006-02-15 04:45:25'),(15,'al-Qadarif',89,'2006-02-15 04:45:25'),(16,'al-Qatif',82,'2006-02-15 04:45:25'),(17,'Alessandria',49,'2006-02-15 04:45:25'),(18,'Allappuzha (Alleppey)',44,'2006-02-15 04:45:25'),(19,'Allende',60,'2006-02-15 04:45:25'),(20,'Almirante Brown',6,'2006-02-15 04:45:25'),(21,'Alvorada',15,'2006-02-15 04:45:25'),(22,'Ambattur',44,'2006-02-15 04:45:25'),(23,'Amersfoort',67,'2006-02-15 04:45:25'),(24,'Amroha',44,'2006-02-15 04:45:25'),(25,'Angra dos Reis',15,'2006-02-15 04:45:25'),(26,'Anpolis',15,'2006-02-15 04:45:25'),(27,'Antofagasta',22,'2006-02-15 04:45:25'),(28,'Aparecida de Goinia',15,'2006-02-15 04:45:25'),(29,'Apeldoorn',67,'2006-02-15 04:45:25'),(30,'Araatuba',15,'2006-02-15 04:45:25'),(31,'Arak',46,'2006-02-15 04:45:25'),(32,'Arecibo',77,'2006-02-15 04:45:25'),(33,'Arlington',103,'2006-02-15 04:45:25'),(34,'Ashdod',48,'2006-02-15 04:45:25'),(35,'Ashgabat',98,'2006-02-15 04:45:25'),(36,'Ashqelon',48,'2006-02-15 04:45:25'),(37,'Asuncin',73,'2006-02-15 04:45:25'),(38,'Athenai',39,'2006-02-15 04:45:25'),(39,'Atinsk',80,'2006-02-15 04:45:25'),(40,'Atlixco',60,'2006-02-15 04:45:25'),(41,'Augusta-Richmond County',103,'2006-02-15 04:45:25'),(42,'Aurora',103,'2006-02-15 04:45:25'),(43,'Avellaneda',6,'2006-02-15 04:45:25'),(44,'Bag',15,'2006-02-15 04:45:25'),(45,'Baha Blanca',6,'2006-02-15 04:45:25'),(46,'Baicheng',23,'2006-02-15 04:45:25'),(47,'Baiyin',23,'2006-02-15 04:45:25'),(48,'Baku',10,'2006-02-15 04:45:25'),(49,'Balaiha',80,'2006-02-15 04:45:25'),(50,'Balikesir',97,'2006-02-15 04:45:25'),(51,'Balurghat',44,'2006-02-15 04:45:25'),(52,'Bamenda',19,'2006-02-15 04:45:25'),(53,'Bandar Seri Begawan',16,'2006-02-15 04:45:25'),(54,'Banjul',37,'2006-02-15 04:45:25'),(55,'Barcelona',104,'2006-02-15 04:45:25'),(56,'Basel',91,'2006-02-15 04:45:25'),(57,'Bat Yam',48,'2006-02-15 04:45:25'),(58,'Batman',97,'2006-02-15 04:45:25'),(59,'Batna',2,'2006-02-15 04:45:25'),(60,'Battambang',18,'2006-02-15 04:45:25'),(61,'Baybay',75,'2006-02-15 04:45:25'),(62,'Bayugan',75,'2006-02-15 04:45:25'),(63,'Bchar',2,'2006-02-15 04:45:25'),(64,'Beira',63,'2006-02-15 04:45:25'),(65,'Bellevue',103,'2006-02-15 04:45:25'),(66,'Belm',15,'2006-02-15 04:45:25'),(67,'Benguela',4,'2006-02-15 04:45:25'),(68,'Beni-Mellal',62,'2006-02-15 04:45:25'),(69,'Benin City',69,'2006-02-15 04:45:25'),(70,'Bergamo',49,'2006-02-15 04:45:25'),(71,'Berhampore (Baharampur)',44,'2006-02-15 04:45:25'),(72,'Bern',91,'2006-02-15 04:45:25'),(73,'Bhavnagar',44,'2006-02-15 04:45:25'),(74,'Bhilwara',44,'2006-02-15 04:45:25'),(75,'Bhimavaram',44,'2006-02-15 04:45:25'),(76,'Bhopal',44,'2006-02-15 04:45:25'),(77,'Bhusawal',44,'2006-02-15 04:45:25'),(78,'Bijapur',44,'2006-02-15 04:45:25'),(79,'Bilbays',29,'2006-02-15 04:45:25'),(80,'Binzhou',23,'2006-02-15 04:45:25'),(81,'Birgunj',66,'2006-02-15 04:45:25'),(82,'Bislig',75,'2006-02-15 04:45:25'),(83,'Blumenau',15,'2006-02-15 04:45:25'),(84,'Boa Vista',15,'2006-02-15 04:45:25'),(85,'Boksburg',85,'2006-02-15 04:45:25'),(86,'Botosani',78,'2006-02-15 04:45:25'),(87,'Botshabelo',85,'2006-02-15 04:45:25'),(88,'Bradford',102,'2006-02-15 04:45:25'),(89,'Braslia',15,'2006-02-15 04:45:25'),(90,'Bratislava',84,'2006-02-15 04:45:25'),(91,'Brescia',49,'2006-02-15 04:45:25'),(92,'Brest',34,'2006-02-15 04:45:25'),(93,'Brindisi',49,'2006-02-15 04:45:25'),(94,'Brockton',103,'2006-02-15 04:45:25'),(95,'Bucuresti',78,'2006-02-15 04:45:25'),(96,'Buenaventura',24,'2006-02-15 04:45:25'),(97,'Bydgoszcz',76,'2006-02-15 04:45:25'),(98,'Cabuyao',75,'2006-02-15 04:45:25'),(99,'Callao',74,'2006-02-15 04:45:25'),(100,'Cam Ranh',105,'2006-02-15 04:45:25'),(101,'Cape Coral',103,'2006-02-15 04:45:25'),(102,'Caracas',104,'2006-02-15 04:45:25'),(103,'Carmen',60,'2006-02-15 04:45:25'),(104,'Cavite',75,'2006-02-15 04:45:25'),(105,'Cayenne',35,'2006-02-15 04:45:25'),(106,'Celaya',60,'2006-02-15 04:45:25'),(107,'Chandrapur',44,'2006-02-15 04:45:25'),(108,'Changhwa',92,'2006-02-15 04:45:25'),(109,'Changzhou',23,'2006-02-15 04:45:25'),(110,'Chapra',44,'2006-02-15 04:45:25'),(111,'Charlotte Amalie',106,'2006-02-15 04:45:25'),(112,'Chatsworth',85,'2006-02-15 04:45:25'),(113,'Cheju',86,'2006-02-15 04:45:25'),(114,'Chiayi',92,'2006-02-15 04:45:25'),(115,'Chisinau',61,'2006-02-15 04:45:25'),(116,'Chungho',92,'2006-02-15 04:45:25'),(117,'Cianjur',45,'2006-02-15 04:45:25'),(118,'Ciomas',45,'2006-02-15 04:45:25'),(119,'Ciparay',45,'2006-02-15 04:45:25'),(120,'Citrus Heights',103,'2006-02-15 04:45:25'),(121,'Citt del Vaticano',41,'2006-02-15 04:45:25'),(122,'Ciudad del Este',73,'2006-02-15 04:45:25'),(123,'Clarksville',103,'2006-02-15 04:45:25'),(124,'Coacalco de Berriozbal',60,'2006-02-15 04:45:25'),(125,'Coatzacoalcos',60,'2006-02-15 04:45:25'),(126,'Compton',103,'2006-02-15 04:45:25'),(127,'Coquimbo',22,'2006-02-15 04:45:25'),(128,'Crdoba',6,'2006-02-15 04:45:25'),(129,'Cuauhtmoc',60,'2006-02-15 04:45:25'),(130,'Cuautla',60,'2006-02-15 04:45:25'),(131,'Cuernavaca',60,'2006-02-15 04:45:25'),(132,'Cuman',104,'2006-02-15 04:45:25'),(133,'Czestochowa',76,'2006-02-15 04:45:25'),(134,'Dadu',72,'2006-02-15 04:45:25'),(135,'Dallas',103,'2006-02-15 04:45:25'),(136,'Datong',23,'2006-02-15 04:45:25'),(137,'Daugavpils',54,'2006-02-15 04:45:25'),(138,'Davao',75,'2006-02-15 04:45:25'),(139,'Daxian',23,'2006-02-15 04:45:25'),(140,'Dayton',103,'2006-02-15 04:45:25'),(141,'Deba Habe',69,'2006-02-15 04:45:25'),(142,'Denizli',97,'2006-02-15 04:45:25'),(143,'Dhaka',12,'2006-02-15 04:45:25'),(144,'Dhule (Dhulia)',44,'2006-02-15 04:45:25'),(145,'Dongying',23,'2006-02-15 04:45:25'),(146,'Donostia-San Sebastin',87,'2006-02-15 04:45:25'),(147,'Dos Quebradas',24,'2006-02-15 04:45:25'),(148,'Duisburg',38,'2006-02-15 04:45:25'),(149,'Dundee',102,'2006-02-15 04:45:25'),(150,'Dzerzinsk',80,'2006-02-15 04:45:25'),(151,'Ede',67,'2006-02-15 04:45:25'),(152,'Effon-Alaiye',69,'2006-02-15 04:45:25'),(153,'El Alto',14,'2006-02-15 04:45:25'),(154,'El Fuerte',60,'2006-02-15 04:45:25'),(155,'El Monte',103,'2006-02-15 04:45:25'),(156,'Elista',80,'2006-02-15 04:45:25'),(157,'Emeishan',23,'2006-02-15 04:45:25'),(158,'Emmen',67,'2006-02-15 04:45:25'),(159,'Enshi',23,'2006-02-15 04:45:25'),(160,'Erlangen',38,'2006-02-15 04:45:25'),(161,'Escobar',6,'2006-02-15 04:45:25'),(162,'Esfahan',46,'2006-02-15 04:45:25'),(163,'Eskisehir',97,'2006-02-15 04:45:25'),(164,'Etawah',44,'2006-02-15 04:45:25'),(165,'Ezeiza',6,'2006-02-15 04:45:25'),(166,'Ezhou',23,'2006-02-15 04:45:25'),(167,'Faaa',36,'2006-02-15 04:45:25'),(168,'Fengshan',92,'2006-02-15 04:45:25'),(169,'Firozabad',44,'2006-02-15 04:45:25'),(170,'Florencia',24,'2006-02-15 04:45:25'),(171,'Fontana',103,'2006-02-15 04:45:25'),(172,'Fukuyama',50,'2006-02-15 04:45:25'),(173,'Funafuti',99,'2006-02-15 04:45:25'),(174,'Fuyu',23,'2006-02-15 04:45:25'),(175,'Fuzhou',23,'2006-02-15 04:45:25'),(176,'Gandhinagar',44,'2006-02-15 04:45:25'),(177,'Garden Grove',103,'2006-02-15 04:45:25'),(178,'Garland',103,'2006-02-15 04:45:25'),(179,'Gatineau',20,'2006-02-15 04:45:25'),(180,'Gaziantep',97,'2006-02-15 04:45:25'),(181,'Gijn',87,'2006-02-15 04:45:25'),(182,'Gingoog',75,'2006-02-15 04:45:25'),(183,'Goinia',15,'2006-02-15 04:45:25'),(184,'Gorontalo',45,'2006-02-15 04:45:25'),(185,'Grand Prairie',103,'2006-02-15 04:45:25'),(186,'Graz',9,'2006-02-15 04:45:25'),(187,'Greensboro',103,'2006-02-15 04:45:25'),(188,'Guadalajara',60,'2006-02-15 04:45:25'),(189,'Guaruj',15,'2006-02-15 04:45:25'),(190,'guas Lindas de Gois',15,'2006-02-15 04:45:25'),(191,'Gulbarga',44,'2006-02-15 04:45:25'),(192,'Hagonoy',75,'2006-02-15 04:45:25'),(193,'Haining',23,'2006-02-15 04:45:25'),(194,'Haiphong',105,'2006-02-15 04:45:25'),(195,'Haldia',44,'2006-02-15 04:45:25'),(196,'Halifax',20,'2006-02-15 04:45:25'),(197,'Halisahar',44,'2006-02-15 04:45:25'),(198,'Halle/Saale',38,'2006-02-15 04:45:25'),(199,'Hami',23,'2006-02-15 04:45:25'),(200,'Hamilton',68,'2006-02-15 04:45:25'),(201,'Hanoi',105,'2006-02-15 04:45:25'),(202,'Hidalgo',60,'2006-02-15 04:45:25'),(203,'Higashiosaka',50,'2006-02-15 04:45:25'),(204,'Hino',50,'2006-02-15 04:45:25'),(205,'Hiroshima',50,'2006-02-15 04:45:25'),(206,'Hodeida',107,'2006-02-15 04:45:25'),(207,'Hohhot',23,'2006-02-15 04:45:25'),(208,'Hoshiarpur',44,'2006-02-15 04:45:25'),(209,'Hsichuh',92,'2006-02-15 04:45:25'),(210,'Huaian',23,'2006-02-15 04:45:25'),(211,'Hubli-Dharwad',44,'2006-02-15 04:45:25'),(212,'Huejutla de Reyes',60,'2006-02-15 04:45:25'),(213,'Huixquilucan',60,'2006-02-15 04:45:25'),(214,'Hunuco',74,'2006-02-15 04:45:25'),(215,'Ibirit',15,'2006-02-15 04:45:25'),(216,'Idfu',29,'2006-02-15 04:45:25'),(217,'Ife',69,'2006-02-15 04:45:25'),(218,'Ikerre',69,'2006-02-15 04:45:25'),(219,'Iligan',75,'2006-02-15 04:45:25'),(220,'Ilorin',69,'2006-02-15 04:45:25'),(221,'Imus',75,'2006-02-15 04:45:25'),(222,'Inegl',97,'2006-02-15 04:45:25'),(223,'Ipoh',59,'2006-02-15 04:45:25'),(224,'Isesaki',50,'2006-02-15 04:45:25'),(225,'Ivanovo',80,'2006-02-15 04:45:25'),(226,'Iwaki',50,'2006-02-15 04:45:25'),(227,'Iwakuni',50,'2006-02-15 04:45:25'),(228,'Iwatsuki',50,'2006-02-15 04:45:25'),(229,'Izumisano',50,'2006-02-15 04:45:25'),(230,'Jaffna',88,'2006-02-15 04:45:25'),(231,'Jaipur',44,'2006-02-15 04:45:25'),(232,'Jakarta',45,'2006-02-15 04:45:25'),(233,'Jalib al-Shuyukh',53,'2006-02-15 04:45:25'),(234,'Jamalpur',12,'2006-02-15 04:45:25'),(235,'Jaroslavl',80,'2006-02-15 04:45:25'),(236,'Jastrzebie-Zdrj',76,'2006-02-15 04:45:25'),(237,'Jedda',82,'2006-02-15 04:45:25'),(238,'Jelets',80,'2006-02-15 04:45:25'),(239,'Jhansi',44,'2006-02-15 04:45:25'),(240,'Jinchang',23,'2006-02-15 04:45:25'),(241,'Jining',23,'2006-02-15 04:45:25'),(242,'Jinzhou',23,'2006-02-15 04:45:25'),(243,'Jodhpur',44,'2006-02-15 04:45:25'),(244,'Johannesburg',85,'2006-02-15 04:45:25'),(245,'Joliet',103,'2006-02-15 04:45:25'),(246,'Jos Azueta',60,'2006-02-15 04:45:25'),(247,'Juazeiro do Norte',15,'2006-02-15 04:45:25'),(248,'Juiz de Fora',15,'2006-02-15 04:45:25'),(249,'Junan',23,'2006-02-15 04:45:25'),(250,'Jurez',60,'2006-02-15 04:45:25'),(251,'Kabul',1,'2006-02-15 04:45:25'),(252,'Kaduna',69,'2006-02-15 04:45:25'),(253,'Kakamigahara',50,'2006-02-15 04:45:25'),(254,'Kaliningrad',80,'2006-02-15 04:45:25'),(255,'Kalisz',76,'2006-02-15 04:45:25'),(256,'Kamakura',50,'2006-02-15 04:45:25'),(257,'Kamarhati',44,'2006-02-15 04:45:25'),(258,'Kamjanets-Podilskyi',100,'2006-02-15 04:45:25'),(259,'Kamyin',80,'2006-02-15 04:45:25'),(260,'Kanazawa',50,'2006-02-15 04:45:25'),(261,'Kanchrapara',44,'2006-02-15 04:45:25'),(262,'Kansas City',103,'2006-02-15 04:45:25'),(263,'Karnal',44,'2006-02-15 04:45:25'),(264,'Katihar',44,'2006-02-15 04:45:25'),(265,'Kermanshah',46,'2006-02-15 04:45:25'),(266,'Kilis',97,'2006-02-15 04:45:25'),(267,'Kimberley',85,'2006-02-15 04:45:25'),(268,'Kimchon',86,'2006-02-15 04:45:25'),(269,'Kingstown',81,'2006-02-15 04:45:25'),(270,'Kirovo-Tepetsk',80,'2006-02-15 04:45:25'),(271,'Kisumu',52,'2006-02-15 04:45:25'),(272,'Kitwe',109,'2006-02-15 04:45:25'),(273,'Klerksdorp',85,'2006-02-15 04:45:25'),(274,'Kolpino',80,'2006-02-15 04:45:25'),(275,'Konotop',100,'2006-02-15 04:45:25'),(276,'Koriyama',50,'2006-02-15 04:45:25'),(277,'Korla',23,'2006-02-15 04:45:25'),(278,'Korolev',80,'2006-02-15 04:45:25'),(279,'Kowloon and New Kowloon',42,'2006-02-15 04:45:25'),(280,'Kragujevac',108,'2006-02-15 04:45:25'),(281,'Ktahya',97,'2006-02-15 04:45:25'),(282,'Kuching',59,'2006-02-15 04:45:25'),(283,'Kumbakonam',44,'2006-02-15 04:45:25'),(284,'Kurashiki',50,'2006-02-15 04:45:25'),(285,'Kurgan',80,'2006-02-15 04:45:25'),(286,'Kursk',80,'2006-02-15 04:45:25'),(287,'Kuwana',50,'2006-02-15 04:45:25'),(288,'La Paz',60,'2006-02-15 04:45:25'),(289,'La Plata',6,'2006-02-15 04:45:25'),(290,'La Romana',27,'2006-02-15 04:45:25'),(291,'Laiwu',23,'2006-02-15 04:45:25'),(292,'Lancaster',103,'2006-02-15 04:45:25'),(293,'Laohekou',23,'2006-02-15 04:45:25'),(294,'Lapu-Lapu',75,'2006-02-15 04:45:25'),(295,'Laredo',103,'2006-02-15 04:45:25'),(296,'Lausanne',91,'2006-02-15 04:45:25'),(297,'Le Mans',34,'2006-02-15 04:45:25'),(298,'Lengshuijiang',23,'2006-02-15 04:45:25'),(299,'Leshan',23,'2006-02-15 04:45:25'),(300,'Lethbridge',20,'2006-02-15 04:45:25'),(301,'Lhokseumawe',45,'2006-02-15 04:45:25'),(302,'Liaocheng',23,'2006-02-15 04:45:25'),(303,'Liepaja',54,'2006-02-15 04:45:25'),(304,'Lilongwe',58,'2006-02-15 04:45:25'),(305,'Lima',74,'2006-02-15 04:45:25'),(306,'Lincoln',103,'2006-02-15 04:45:25'),(307,'Linz',9,'2006-02-15 04:45:25'),(308,'Lipetsk',80,'2006-02-15 04:45:25'),(309,'Livorno',49,'2006-02-15 04:45:25'),(310,'Ljubertsy',80,'2006-02-15 04:45:25'),(311,'Loja',28,'2006-02-15 04:45:25'),(312,'London',102,'2006-02-15 04:45:25'),(313,'London',20,'2006-02-15 04:45:25'),(314,'Lublin',76,'2006-02-15 04:45:25'),(315,'Lubumbashi',25,'2006-02-15 04:45:25'),(316,'Lungtan',92,'2006-02-15 04:45:25'),(317,'Luzinia',15,'2006-02-15 04:45:25'),(318,'Madiun',45,'2006-02-15 04:45:25'),(319,'Mahajanga',57,'2006-02-15 04:45:25'),(320,'Maikop',80,'2006-02-15 04:45:25'),(321,'Malm',90,'2006-02-15 04:45:25'),(322,'Manchester',103,'2006-02-15 04:45:25'),(323,'Mandaluyong',75,'2006-02-15 04:45:25'),(324,'Mandi Bahauddin',72,'2006-02-15 04:45:25'),(325,'Mannheim',38,'2006-02-15 04:45:25'),(326,'Maracabo',104,'2006-02-15 04:45:25'),(327,'Mardan',72,'2006-02-15 04:45:25'),(328,'Maring',15,'2006-02-15 04:45:25'),(329,'Masqat',71,'2006-02-15 04:45:25'),(330,'Matamoros',60,'2006-02-15 04:45:25'),(331,'Matsue',50,'2006-02-15 04:45:25'),(332,'Meixian',23,'2006-02-15 04:45:25'),(333,'Memphis',103,'2006-02-15 04:45:25'),(334,'Merlo',6,'2006-02-15 04:45:25'),(335,'Mexicali',60,'2006-02-15 04:45:25'),(336,'Miraj',44,'2006-02-15 04:45:25'),(337,'Mit Ghamr',29,'2006-02-15 04:45:25'),(338,'Miyakonojo',50,'2006-02-15 04:45:25'),(339,'Mogiljov',13,'2006-02-15 04:45:25'),(340,'Molodetno',13,'2006-02-15 04:45:25'),(341,'Monclova',60,'2006-02-15 04:45:25'),(342,'Monywa',64,'2006-02-15 04:45:25'),(343,'Moscow',80,'2006-02-15 04:45:25'),(344,'Mosul',47,'2006-02-15 04:45:25'),(345,'Mukateve',100,'2006-02-15 04:45:25'),(346,'Munger (Monghyr)',44,'2006-02-15 04:45:25'),(347,'Mwanza',93,'2006-02-15 04:45:25'),(348,'Mwene-Ditu',25,'2006-02-15 04:45:25'),(349,'Myingyan',64,'2006-02-15 04:45:25'),(350,'Mysore',44,'2006-02-15 04:45:25'),(351,'Naala-Porto',63,'2006-02-15 04:45:25'),(352,'Nabereznyje Telny',80,'2006-02-15 04:45:25'),(353,'Nador',62,'2006-02-15 04:45:25'),(354,'Nagaon',44,'2006-02-15 04:45:25'),(355,'Nagareyama',50,'2006-02-15 04:45:25'),(356,'Najafabad',46,'2006-02-15 04:45:25'),(357,'Naju',86,'2006-02-15 04:45:25'),(358,'Nakhon Sawan',94,'2006-02-15 04:45:25'),(359,'Nam Dinh',105,'2006-02-15 04:45:25'),(360,'Namibe',4,'2006-02-15 04:45:25'),(361,'Nantou',92,'2006-02-15 04:45:25'),(362,'Nanyang',23,'2006-02-15 04:45:25'),(363,'NDjamna',21,'2006-02-15 04:45:25'),(364,'Newcastle',85,'2006-02-15 04:45:25'),(365,'Nezahualcyotl',60,'2006-02-15 04:45:25'),(366,'Nha Trang',105,'2006-02-15 04:45:25'),(367,'Niznekamsk',80,'2006-02-15 04:45:25'),(368,'Novi Sad',108,'2006-02-15 04:45:25'),(369,'Novoterkassk',80,'2006-02-15 04:45:25'),(370,'Nukualofa',95,'2006-02-15 04:45:25'),(371,'Nuuk',40,'2006-02-15 04:45:25'),(372,'Nyeri',52,'2006-02-15 04:45:25'),(373,'Ocumare del Tuy',104,'2006-02-15 04:45:25'),(374,'Ogbomosho',69,'2006-02-15 04:45:25'),(375,'Okara',72,'2006-02-15 04:45:25'),(376,'Okayama',50,'2006-02-15 04:45:25'),(377,'Okinawa',50,'2006-02-15 04:45:25'),(378,'Olomouc',26,'2006-02-15 04:45:25'),(379,'Omdurman',89,'2006-02-15 04:45:25'),(380,'Omiya',50,'2006-02-15 04:45:25'),(381,'Ondo',69,'2006-02-15 04:45:25'),(382,'Onomichi',50,'2006-02-15 04:45:25'),(383,'Oshawa',20,'2006-02-15 04:45:25'),(384,'Osmaniye',97,'2006-02-15 04:45:25'),(385,'ostka',100,'2006-02-15 04:45:25'),(386,'Otsu',50,'2006-02-15 04:45:25'),(387,'Oulu',33,'2006-02-15 04:45:25'),(388,'Ourense (Orense)',87,'2006-02-15 04:45:25'),(389,'Owo',69,'2006-02-15 04:45:25'),(390,'Oyo',69,'2006-02-15 04:45:25'),(391,'Ozamis',75,'2006-02-15 04:45:25'),(392,'Paarl',85,'2006-02-15 04:45:25'),(393,'Pachuca de Soto',60,'2006-02-15 04:45:25'),(394,'Pak Kret',94,'2006-02-15 04:45:25'),(395,'Palghat (Palakkad)',44,'2006-02-15 04:45:25'),(396,'Pangkal Pinang',45,'2006-02-15 04:45:25'),(397,'Papeete',36,'2006-02-15 04:45:25'),(398,'Parbhani',44,'2006-02-15 04:45:25'),(399,'Pathankot',44,'2006-02-15 04:45:25'),(400,'Patiala',44,'2006-02-15 04:45:25'),(401,'Patras',39,'2006-02-15 04:45:25'),(402,'Pavlodar',51,'2006-02-15 04:45:25'),(403,'Pemalang',45,'2006-02-15 04:45:25'),(404,'Peoria',103,'2006-02-15 04:45:25'),(405,'Pereira',24,'2006-02-15 04:45:25'),(406,'Phnom Penh',18,'2006-02-15 04:45:25'),(407,'Pingxiang',23,'2006-02-15 04:45:25'),(408,'Pjatigorsk',80,'2006-02-15 04:45:25'),(409,'Plock',76,'2006-02-15 04:45:25'),(410,'Po',15,'2006-02-15 04:45:25'),(411,'Ponce',77,'2006-02-15 04:45:25'),(412,'Pontianak',45,'2006-02-15 04:45:25'),(413,'Poos de Caldas',15,'2006-02-15 04:45:25'),(414,'Portoviejo',28,'2006-02-15 04:45:25'),(415,'Probolinggo',45,'2006-02-15 04:45:25'),(416,'Pudukkottai',44,'2006-02-15 04:45:25'),(417,'Pune',44,'2006-02-15 04:45:25'),(418,'Purnea (Purnia)',44,'2006-02-15 04:45:25'),(419,'Purwakarta',45,'2006-02-15 04:45:25'),(420,'Pyongyang',70,'2006-02-15 04:45:25'),(421,'Qalyub',29,'2006-02-15 04:45:25'),(422,'Qinhuangdao',23,'2006-02-15 04:45:25'),(423,'Qomsheh',46,'2006-02-15 04:45:25'),(424,'Quilmes',6,'2006-02-15 04:45:25'),(425,'Rae Bareli',44,'2006-02-15 04:45:25'),(426,'Rajkot',44,'2006-02-15 04:45:25'),(427,'Rampur',44,'2006-02-15 04:45:25'),(428,'Rancagua',22,'2006-02-15 04:45:25'),(429,'Ranchi',44,'2006-02-15 04:45:25'),(430,'Richmond Hill',20,'2006-02-15 04:45:25'),(431,'Rio Claro',15,'2006-02-15 04:45:25'),(432,'Rizhao',23,'2006-02-15 04:45:25'),(433,'Roanoke',103,'2006-02-15 04:45:25'),(434,'Robamba',28,'2006-02-15 04:45:25'),(435,'Rockford',103,'2006-02-15 04:45:25'),(436,'Ruse',17,'2006-02-15 04:45:25'),(437,'Rustenburg',85,'2006-02-15 04:45:25'),(438,'s-Hertogenbosch',67,'2006-02-15 04:45:25'),(439,'Saarbrcken',38,'2006-02-15 04:45:25'),(440,'Sagamihara',50,'2006-02-15 04:45:25'),(441,'Saint Louis',103,'2006-02-15 04:45:25'),(442,'Saint-Denis',79,'2006-02-15 04:45:25'),(443,'Sal',62,'2006-02-15 04:45:25'),(444,'Salala',71,'2006-02-15 04:45:25'),(445,'Salamanca',60,'2006-02-15 04:45:25'),(446,'Salinas',103,'2006-02-15 04:45:25'),(447,'Salzburg',9,'2006-02-15 04:45:25'),(448,'Sambhal',44,'2006-02-15 04:45:25'),(449,'San Bernardino',103,'2006-02-15 04:45:25'),(450,'San Felipe de Puerto Plata',27,'2006-02-15 04:45:25'),(451,'San Felipe del Progreso',60,'2006-02-15 04:45:25'),(452,'San Juan Bautista Tuxtepec',60,'2006-02-15 04:45:25'),(453,'San Lorenzo',73,'2006-02-15 04:45:25'),(454,'San Miguel de Tucumn',6,'2006-02-15 04:45:25'),(455,'Sanaa',107,'2006-02-15 04:45:25'),(456,'Santa Brbara dOeste',15,'2006-02-15 04:45:25'),(457,'Santa F',6,'2006-02-15 04:45:25'),(458,'Santa Rosa',75,'2006-02-15 04:45:25'),(459,'Santiago de Compostela',87,'2006-02-15 04:45:25'),(460,'Santiago de los Caballeros',27,'2006-02-15 04:45:25'),(461,'Santo Andr',15,'2006-02-15 04:45:25'),(462,'Sanya',23,'2006-02-15 04:45:25'),(463,'Sasebo',50,'2006-02-15 04:45:25'),(464,'Satna',44,'2006-02-15 04:45:25'),(465,'Sawhaj',29,'2006-02-15 04:45:25'),(466,'Serpuhov',80,'2006-02-15 04:45:25'),(467,'Shahr-e Kord',46,'2006-02-15 04:45:25'),(468,'Shanwei',23,'2006-02-15 04:45:25'),(469,'Shaoguan',23,'2006-02-15 04:45:25'),(470,'Sharja',101,'2006-02-15 04:45:25'),(471,'Shenzhen',23,'2006-02-15 04:45:25'),(472,'Shikarpur',72,'2006-02-15 04:45:25'),(473,'Shimoga',44,'2006-02-15 04:45:25'),(474,'Shimonoseki',50,'2006-02-15 04:45:25'),(475,'Shivapuri',44,'2006-02-15 04:45:25'),(476,'Shubra al-Khayma',29,'2006-02-15 04:45:25'),(477,'Siegen',38,'2006-02-15 04:45:25'),(478,'Siliguri (Shiliguri)',44,'2006-02-15 04:45:25'),(479,'Simferopol',100,'2006-02-15 04:45:25'),(480,'Sincelejo',24,'2006-02-15 04:45:25'),(481,'Sirjan',46,'2006-02-15 04:45:25'),(482,'Sivas',97,'2006-02-15 04:45:25'),(483,'Skikda',2,'2006-02-15 04:45:25'),(484,'Smolensk',80,'2006-02-15 04:45:25'),(485,'So Bernardo do Campo',15,'2006-02-15 04:45:25'),(486,'So Leopoldo',15,'2006-02-15 04:45:25'),(487,'Sogamoso',24,'2006-02-15 04:45:25'),(488,'Sokoto',69,'2006-02-15 04:45:25'),(489,'Songkhla',94,'2006-02-15 04:45:25'),(490,'Sorocaba',15,'2006-02-15 04:45:25'),(491,'Soshanguve',85,'2006-02-15 04:45:25'),(492,'Sousse',96,'2006-02-15 04:45:25'),(493,'South Hill',5,'2006-02-15 04:45:25'),(494,'Southampton',102,'2006-02-15 04:45:25'),(495,'Southend-on-Sea',102,'2006-02-15 04:45:25'),(496,'Southport',102,'2006-02-15 04:45:25'),(497,'Springs',85,'2006-02-15 04:45:25'),(498,'Stara Zagora',17,'2006-02-15 04:45:25'),(499,'Sterling Heights',103,'2006-02-15 04:45:25'),(500,'Stockport',102,'2006-02-15 04:45:25'),(501,'Sucre',14,'2006-02-15 04:45:25'),(502,'Suihua',23,'2006-02-15 04:45:25'),(503,'Sullana',74,'2006-02-15 04:45:25'),(504,'Sultanbeyli',97,'2006-02-15 04:45:25'),(505,'Sumqayit',10,'2006-02-15 04:45:25'),(506,'Sumy',100,'2006-02-15 04:45:25'),(507,'Sungai Petani',59,'2006-02-15 04:45:25'),(508,'Sunnyvale',103,'2006-02-15 04:45:25'),(509,'Surakarta',45,'2006-02-15 04:45:25'),(510,'Syktyvkar',80,'2006-02-15 04:45:25'),(511,'Syrakusa',49,'2006-02-15 04:45:25'),(512,'Szkesfehrvr',43,'2006-02-15 04:45:25'),(513,'Tabora',93,'2006-02-15 04:45:25'),(514,'Tabriz',46,'2006-02-15 04:45:25'),(515,'Tabuk',82,'2006-02-15 04:45:25'),(516,'Tafuna',3,'2006-02-15 04:45:25'),(517,'Taguig',75,'2006-02-15 04:45:25'),(518,'Taizz',107,'2006-02-15 04:45:25'),(519,'Talavera',75,'2006-02-15 04:45:25'),(520,'Tallahassee',103,'2006-02-15 04:45:25'),(521,'Tama',50,'2006-02-15 04:45:25'),(522,'Tambaram',44,'2006-02-15 04:45:25'),(523,'Tanauan',75,'2006-02-15 04:45:25'),(524,'Tandil',6,'2006-02-15 04:45:25'),(525,'Tangail',12,'2006-02-15 04:45:25'),(526,'Tanshui',92,'2006-02-15 04:45:25'),(527,'Tanza',75,'2006-02-15 04:45:25'),(528,'Tarlac',75,'2006-02-15 04:45:25'),(529,'Tarsus',97,'2006-02-15 04:45:25'),(530,'Tartu',30,'2006-02-15 04:45:25'),(531,'Teboksary',80,'2006-02-15 04:45:25'),(532,'Tegal',45,'2006-02-15 04:45:25'),(533,'Tel Aviv-Jaffa',48,'2006-02-15 04:45:25'),(534,'Tete',63,'2006-02-15 04:45:25'),(535,'Tianjin',23,'2006-02-15 04:45:25'),(536,'Tiefa',23,'2006-02-15 04:45:25'),(537,'Tieli',23,'2006-02-15 04:45:25'),(538,'Tokat',97,'2006-02-15 04:45:25'),(539,'Tonghae',86,'2006-02-15 04:45:25'),(540,'Tongliao',23,'2006-02-15 04:45:25'),(541,'Torren',60,'2006-02-15 04:45:25'),(542,'Touliu',92,'2006-02-15 04:45:25'),(543,'Toulon',34,'2006-02-15 04:45:25'),(544,'Toulouse',34,'2006-02-15 04:45:25'),(545,'Trshavn',32,'2006-02-15 04:45:25'),(546,'Tsaotun',92,'2006-02-15 04:45:25'),(547,'Tsuyama',50,'2006-02-15 04:45:25'),(548,'Tuguegarao',75,'2006-02-15 04:45:25'),(549,'Tychy',76,'2006-02-15 04:45:25'),(550,'Udaipur',44,'2006-02-15 04:45:25'),(551,'Udine',49,'2006-02-15 04:45:25'),(552,'Ueda',50,'2006-02-15 04:45:25'),(553,'Uijongbu',86,'2006-02-15 04:45:25'),(554,'Uluberia',44,'2006-02-15 04:45:25'),(555,'Urawa',50,'2006-02-15 04:45:25'),(556,'Uruapan',60,'2006-02-15 04:45:25'),(557,'Usak',97,'2006-02-15 04:45:25'),(558,'Usolje-Sibirskoje',80,'2006-02-15 04:45:25'),(559,'Uttarpara-Kotrung',44,'2006-02-15 04:45:25'),(560,'Vaduz',55,'2006-02-15 04:45:25'),(561,'Valencia',104,'2006-02-15 04:45:25'),(562,'Valle de la Pascua',104,'2006-02-15 04:45:25'),(563,'Valle de Santiago',60,'2006-02-15 04:45:25'),(564,'Valparai',44,'2006-02-15 04:45:25'),(565,'Vancouver',20,'2006-02-15 04:45:25'),(566,'Varanasi (Benares)',44,'2006-02-15 04:45:25'),(567,'Vicente Lpez',6,'2006-02-15 04:45:25'),(568,'Vijayawada',44,'2006-02-15 04:45:25'),(569,'Vila Velha',15,'2006-02-15 04:45:25'),(570,'Vilnius',56,'2006-02-15 04:45:25'),(571,'Vinh',105,'2006-02-15 04:45:25'),(572,'Vitria de Santo Anto',15,'2006-02-15 04:45:25'),(573,'Warren',103,'2006-02-15 04:45:25'),(574,'Weifang',23,'2006-02-15 04:45:25'),(575,'Witten',38,'2006-02-15 04:45:25'),(576,'Woodridge',8,'2006-02-15 04:45:25'),(577,'Wroclaw',76,'2006-02-15 04:45:25'),(578,'Xiangfan',23,'2006-02-15 04:45:25'),(579,'Xiangtan',23,'2006-02-15 04:45:25'),(580,'Xintai',23,'2006-02-15 04:45:25'),(581,'Xinxiang',23,'2006-02-15 04:45:25'),(582,'Yamuna Nagar',44,'2006-02-15 04:45:25'),(583,'Yangor',65,'2006-02-15 04:45:25'),(584,'Yantai',23,'2006-02-15 04:45:25'),(585,'Yaound',19,'2006-02-15 04:45:25'),(586,'Yerevan',7,'2006-02-15 04:45:25'),(587,'Yinchuan',23,'2006-02-15 04:45:25'),(588,'Yingkou',23,'2006-02-15 04:45:25'),(589,'York',102,'2006-02-15 04:45:25'),(590,'Yuncheng',23,'2006-02-15 04:45:25'),(591,'Yuzhou',23,'2006-02-15 04:45:25'),(592,'Zalantun',23,'2006-02-15 04:45:25'),(593,'Zanzibar',93,'2006-02-15 04:45:25'),(594,'Zaoyang',23,'2006-02-15 04:45:25'),(595,'Zapopan',60,'2006-02-15 04:45:25'),(596,'Zaria',69,'2006-02-15 04:45:25'),(597,'Zeleznogorsk',80,'2006-02-15 04:45:25'),(598,'Zhezqazghan',51,'2006-02-15 04:45:25'),(599,'Zhoushan',23,'2006-02-15 04:45:25'),(600,'Ziguinchor',83,'2006-02-15 04:45:25'); +COMMIT; + +-- +-- Dumping data for table country +-- + +SET AUTOCOMMIT=0; +INSERT INTO country VALUES (1,'Afghanistan','2006-02-15 04:44:00'),(2,'Algeria','2006-02-15 04:44:00'),(3,'American Samoa','2006-02-15 04:44:00'),(4,'Angola','2006-02-15 04:44:00'),(5,'Anguilla','2006-02-15 04:44:00'),(6,'Argentina','2006-02-15 04:44:00'),(7,'Armenia','2006-02-15 04:44:00'),(8,'Australia','2006-02-15 04:44:00'),(9,'Austria','2006-02-15 04:44:00'),(10,'Azerbaijan','2006-02-15 04:44:00'),(11,'Bahrain','2006-02-15 04:44:00'),(12,'Bangladesh','2006-02-15 04:44:00'),(13,'Belarus','2006-02-15 04:44:00'),(14,'Bolivia','2006-02-15 04:44:00'),(15,'Brazil','2006-02-15 04:44:00'),(16,'Brunei','2006-02-15 04:44:00'),(17,'Bulgaria','2006-02-15 04:44:00'),(18,'Cambodia','2006-02-15 04:44:00'),(19,'Cameroon','2006-02-15 04:44:00'),(20,'Canada','2006-02-15 04:44:00'),(21,'Chad','2006-02-15 04:44:00'),(22,'Chile','2006-02-15 04:44:00'),(23,'China','2006-02-15 04:44:00'),(24,'Colombia','2006-02-15 04:44:00'),(25,'Congo, The Democratic Republic of the','2006-02-15 04:44:00'),(26,'Czech Republic','2006-02-15 04:44:00'),(27,'Dominican Republic','2006-02-15 04:44:00'),(28,'Ecuador','2006-02-15 04:44:00'),(29,'Egypt','2006-02-15 04:44:00'),(30,'Estonia','2006-02-15 04:44:00'),(31,'Ethiopia','2006-02-15 04:44:00'),(32,'Faroe Islands','2006-02-15 04:44:00'),(33,'Finland','2006-02-15 04:44:00'),(34,'France','2006-02-15 04:44:00'),(35,'French Guiana','2006-02-15 04:44:00'),(36,'French Polynesia','2006-02-15 04:44:00'),(37,'Gambia','2006-02-15 04:44:00'),(38,'Germany','2006-02-15 04:44:00'),(39,'Greece','2006-02-15 04:44:00'),(40,'Greenland','2006-02-15 04:44:00'),(41,'Holy See (Vatican City State)','2006-02-15 04:44:00'),(42,'Hong Kong','2006-02-15 04:44:00'),(43,'Hungary','2006-02-15 04:44:00'),(44,'India','2006-02-15 04:44:00'),(45,'Indonesia','2006-02-15 04:44:00'),(46,'Iran','2006-02-15 04:44:00'),(47,'Iraq','2006-02-15 04:44:00'),(48,'Israel','2006-02-15 04:44:00'),(49,'Italy','2006-02-15 04:44:00'),(50,'Japan','2006-02-15 04:44:00'),(51,'Kazakstan','2006-02-15 04:44:00'),(52,'Kenya','2006-02-15 04:44:00'),(53,'Kuwait','2006-02-15 04:44:00'),(54,'Latvia','2006-02-15 04:44:00'),(55,'Liechtenstein','2006-02-15 04:44:00'),(56,'Lithuania','2006-02-15 04:44:00'),(57,'Madagascar','2006-02-15 04:44:00'),(58,'Malawi','2006-02-15 04:44:00'),(59,'Malaysia','2006-02-15 04:44:00'),(60,'Mexico','2006-02-15 04:44:00'),(61,'Moldova','2006-02-15 04:44:00'),(62,'Morocco','2006-02-15 04:44:00'),(63,'Mozambique','2006-02-15 04:44:00'),(64,'Myanmar','2006-02-15 04:44:00'),(65,'Nauru','2006-02-15 04:44:00'),(66,'Nepal','2006-02-15 04:44:00'),(67,'Netherlands','2006-02-15 04:44:00'),(68,'New Zealand','2006-02-15 04:44:00'),(69,'Nigeria','2006-02-15 04:44:00'),(70,'North Korea','2006-02-15 04:44:00'),(71,'Oman','2006-02-15 04:44:00'),(72,'Pakistan','2006-02-15 04:44:00'),(73,'Paraguay','2006-02-15 04:44:00'),(74,'Peru','2006-02-15 04:44:00'),(75,'Philippines','2006-02-15 04:44:00'),(76,'Poland','2006-02-15 04:44:00'),(77,'Puerto Rico','2006-02-15 04:44:00'),(78,'Romania','2006-02-15 04:44:00'),(79,'Runion','2006-02-15 04:44:00'),(80,'Russian Federation','2006-02-15 04:44:00'),(81,'Saint Vincent and the Grenadines','2006-02-15 04:44:00'),(82,'Saudi Arabia','2006-02-15 04:44:00'),(83,'Senegal','2006-02-15 04:44:00'),(84,'Slovakia','2006-02-15 04:44:00'),(85,'South Africa','2006-02-15 04:44:00'),(86,'South Korea','2006-02-15 04:44:00'),(87,'Spain','2006-02-15 04:44:00'),(88,'Sri Lanka','2006-02-15 04:44:00'),(89,'Sudan','2006-02-15 04:44:00'),(90,'Sweden','2006-02-15 04:44:00'),(91,'Switzerland','2006-02-15 04:44:00'),(92,'Taiwan','2006-02-15 04:44:00'),(93,'Tanzania','2006-02-15 04:44:00'),(94,'Thailand','2006-02-15 04:44:00'),(95,'Tonga','2006-02-15 04:44:00'),(96,'Tunisia','2006-02-15 04:44:00'),(97,'Turkey','2006-02-15 04:44:00'),(98,'Turkmenistan','2006-02-15 04:44:00'),(99,'Tuvalu','2006-02-15 04:44:00'),(100,'Ukraine','2006-02-15 04:44:00'),(101,'United Arab Emirates','2006-02-15 04:44:00'),(102,'United Kingdom','2006-02-15 04:44:00'),(103,'United States','2006-02-15 04:44:00'),(104,'Venezuela','2006-02-15 04:44:00'),(105,'Vietnam','2006-02-15 04:44:00'),(106,'Virgin Islands, U.S.','2006-02-15 04:44:00'),(107,'Yemen','2006-02-15 04:44:00'),(108,'Yugoslavia','2006-02-15 04:44:00'),(109,'Zambia','2006-02-15 04:44:00'); +COMMIT; + +-- +-- Dumping data for table customer +-- + +SET AUTOCOMMIT=0; +INSERT INTO customer VALUES (1,1,'MARY','SMITH','MARY.SMITH@sakilacustomer.org',5,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(2,1,'PATRICIA','JOHNSON','PATRICIA.JOHNSON@sakilacustomer.org',6,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(3,1,'LINDA','WILLIAMS','LINDA.WILLIAMS@sakilacustomer.org',7,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(4,2,'BARBARA','JONES','BARBARA.JONES@sakilacustomer.org',8,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(5,1,'ELIZABETH','BROWN','ELIZABETH.BROWN@sakilacustomer.org',9,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(6,2,'JENNIFER','DAVIS','JENNIFER.DAVIS@sakilacustomer.org',10,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(7,1,'MARIA','MILLER','MARIA.MILLER@sakilacustomer.org',11,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(8,2,'SUSAN','WILSON','SUSAN.WILSON@sakilacustomer.org',12,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(9,2,'MARGARET','MOORE','MARGARET.MOORE@sakilacustomer.org',13,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(10,1,'DOROTHY','TAYLOR','DOROTHY.TAYLOR@sakilacustomer.org',14,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(11,2,'LISA','ANDERSON','LISA.ANDERSON@sakilacustomer.org',15,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(12,1,'NANCY','THOMAS','NANCY.THOMAS@sakilacustomer.org',16,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(13,2,'KAREN','JACKSON','KAREN.JACKSON@sakilacustomer.org',17,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(14,2,'BETTY','WHITE','BETTY.WHITE@sakilacustomer.org',18,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(15,1,'HELEN','HARRIS','HELEN.HARRIS@sakilacustomer.org',19,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(16,2,'SANDRA','MARTIN','SANDRA.MARTIN@sakilacustomer.org',20,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(17,1,'DONNA','THOMPSON','DONNA.THOMPSON@sakilacustomer.org',21,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(18,2,'CAROL','GARCIA','CAROL.GARCIA@sakilacustomer.org',22,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(19,1,'RUTH','MARTINEZ','RUTH.MARTINEZ@sakilacustomer.org',23,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(20,2,'SHARON','ROBINSON','SHARON.ROBINSON@sakilacustomer.org',24,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(21,1,'MICHELLE','CLARK','MICHELLE.CLARK@sakilacustomer.org',25,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(22,1,'LAURA','RODRIGUEZ','LAURA.RODRIGUEZ@sakilacustomer.org',26,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(23,2,'SARAH','LEWIS','SARAH.LEWIS@sakilacustomer.org',27,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(24,2,'KIMBERLY','LEE','KIMBERLY.LEE@sakilacustomer.org',28,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(25,1,'DEBORAH','WALKER','DEBORAH.WALKER@sakilacustomer.org',29,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(26,2,'JESSICA','HALL','JESSICA.HALL@sakilacustomer.org',30,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(27,2,'SHIRLEY','ALLEN','SHIRLEY.ALLEN@sakilacustomer.org',31,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(28,1,'CYNTHIA','YOUNG','CYNTHIA.YOUNG@sakilacustomer.org',32,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(29,2,'ANGELA','HERNANDEZ','ANGELA.HERNANDEZ@sakilacustomer.org',33,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(30,1,'MELISSA','KING','MELISSA.KING@sakilacustomer.org',34,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(31,2,'BRENDA','WRIGHT','BRENDA.WRIGHT@sakilacustomer.org',35,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(32,1,'AMY','LOPEZ','AMY.LOPEZ@sakilacustomer.org',36,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(33,2,'ANNA','HILL','ANNA.HILL@sakilacustomer.org',37,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(34,2,'REBECCA','SCOTT','REBECCA.SCOTT@sakilacustomer.org',38,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(35,2,'VIRGINIA','GREEN','VIRGINIA.GREEN@sakilacustomer.org',39,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(36,2,'KATHLEEN','ADAMS','KATHLEEN.ADAMS@sakilacustomer.org',40,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(37,1,'PAMELA','BAKER','PAMELA.BAKER@sakilacustomer.org',41,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(38,1,'MARTHA','GONZALEZ','MARTHA.GONZALEZ@sakilacustomer.org',42,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(39,1,'DEBRA','NELSON','DEBRA.NELSON@sakilacustomer.org',43,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(40,2,'AMANDA','CARTER','AMANDA.CARTER@sakilacustomer.org',44,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(41,1,'STEPHANIE','MITCHELL','STEPHANIE.MITCHELL@sakilacustomer.org',45,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(42,2,'CAROLYN','PEREZ','CAROLYN.PEREZ@sakilacustomer.org',46,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(43,2,'CHRISTINE','ROBERTS','CHRISTINE.ROBERTS@sakilacustomer.org',47,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(44,1,'MARIE','TURNER','MARIE.TURNER@sakilacustomer.org',48,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(45,1,'JANET','PHILLIPS','JANET.PHILLIPS@sakilacustomer.org',49,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(46,2,'CATHERINE','CAMPBELL','CATHERINE.CAMPBELL@sakilacustomer.org',50,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(47,1,'FRANCES','PARKER','FRANCES.PARKER@sakilacustomer.org',51,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(48,1,'ANN','EVANS','ANN.EVANS@sakilacustomer.org',52,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(49,2,'JOYCE','EDWARDS','JOYCE.EDWARDS@sakilacustomer.org',53,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(50,1,'DIANE','COLLINS','DIANE.COLLINS@sakilacustomer.org',54,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(51,1,'ALICE','STEWART','ALICE.STEWART@sakilacustomer.org',55,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(52,1,'JULIE','SANCHEZ','JULIE.SANCHEZ@sakilacustomer.org',56,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(53,1,'HEATHER','MORRIS','HEATHER.MORRIS@sakilacustomer.org',57,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(54,1,'TERESA','ROGERS','TERESA.ROGERS@sakilacustomer.org',58,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(55,2,'DORIS','REED','DORIS.REED@sakilacustomer.org',59,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(56,1,'GLORIA','COOK','GLORIA.COOK@sakilacustomer.org',60,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(57,2,'EVELYN','MORGAN','EVELYN.MORGAN@sakilacustomer.org',61,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(58,1,'JEAN','BELL','JEAN.BELL@sakilacustomer.org',62,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(59,1,'CHERYL','MURPHY','CHERYL.MURPHY@sakilacustomer.org',63,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(60,1,'MILDRED','BAILEY','MILDRED.BAILEY@sakilacustomer.org',64,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(61,2,'KATHERINE','RIVERA','KATHERINE.RIVERA@sakilacustomer.org',65,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(62,1,'JOAN','COOPER','JOAN.COOPER@sakilacustomer.org',66,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(63,1,'ASHLEY','RICHARDSON','ASHLEY.RICHARDSON@sakilacustomer.org',67,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(64,2,'JUDITH','COX','JUDITH.COX@sakilacustomer.org',68,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(65,2,'ROSE','HOWARD','ROSE.HOWARD@sakilacustomer.org',69,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(66,2,'JANICE','WARD','JANICE.WARD@sakilacustomer.org',70,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(67,1,'KELLY','TORRES','KELLY.TORRES@sakilacustomer.org',71,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(68,1,'NICOLE','PETERSON','NICOLE.PETERSON@sakilacustomer.org',72,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(69,2,'JUDY','GRAY','JUDY.GRAY@sakilacustomer.org',73,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(70,2,'CHRISTINA','RAMIREZ','CHRISTINA.RAMIREZ@sakilacustomer.org',74,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(71,1,'KATHY','JAMES','KATHY.JAMES@sakilacustomer.org',75,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(72,2,'THERESA','WATSON','THERESA.WATSON@sakilacustomer.org',76,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(73,2,'BEVERLY','BROOKS','BEVERLY.BROOKS@sakilacustomer.org',77,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(74,1,'DENISE','KELLY','DENISE.KELLY@sakilacustomer.org',78,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(75,2,'TAMMY','SANDERS','TAMMY.SANDERS@sakilacustomer.org',79,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(76,2,'IRENE','PRICE','IRENE.PRICE@sakilacustomer.org',80,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(77,2,'JANE','BENNETT','JANE.BENNETT@sakilacustomer.org',81,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(78,1,'LORI','WOOD','LORI.WOOD@sakilacustomer.org',82,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(79,1,'RACHEL','BARNES','RACHEL.BARNES@sakilacustomer.org',83,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(80,1,'MARILYN','ROSS','MARILYN.ROSS@sakilacustomer.org',84,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(81,1,'ANDREA','HENDERSON','ANDREA.HENDERSON@sakilacustomer.org',85,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(82,1,'KATHRYN','COLEMAN','KATHRYN.COLEMAN@sakilacustomer.org',86,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(83,1,'LOUISE','JENKINS','LOUISE.JENKINS@sakilacustomer.org',87,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(84,2,'SARA','PERRY','SARA.PERRY@sakilacustomer.org',88,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(85,2,'ANNE','POWELL','ANNE.POWELL@sakilacustomer.org',89,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(86,2,'JACQUELINE','LONG','JACQUELINE.LONG@sakilacustomer.org',90,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(87,1,'WANDA','PATTERSON','WANDA.PATTERSON@sakilacustomer.org',91,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(88,2,'BONNIE','HUGHES','BONNIE.HUGHES@sakilacustomer.org',92,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(89,1,'JULIA','FLORES','JULIA.FLORES@sakilacustomer.org',93,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(90,2,'RUBY','WASHINGTON','RUBY.WASHINGTON@sakilacustomer.org',94,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(91,2,'LOIS','BUTLER','LOIS.BUTLER@sakilacustomer.org',95,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(92,2,'TINA','SIMMONS','TINA.SIMMONS@sakilacustomer.org',96,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(93,1,'PHYLLIS','FOSTER','PHYLLIS.FOSTER@sakilacustomer.org',97,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(94,1,'NORMA','GONZALES','NORMA.GONZALES@sakilacustomer.org',98,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(95,2,'PAULA','BRYANT','PAULA.BRYANT@sakilacustomer.org',99,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(96,1,'DIANA','ALEXANDER','DIANA.ALEXANDER@sakilacustomer.org',100,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(97,2,'ANNIE','RUSSELL','ANNIE.RUSSELL@sakilacustomer.org',101,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(98,1,'LILLIAN','GRIFFIN','LILLIAN.GRIFFIN@sakilacustomer.org',102,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(99,2,'EMILY','DIAZ','EMILY.DIAZ@sakilacustomer.org',103,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(100,1,'ROBIN','HAYES','ROBIN.HAYES@sakilacustomer.org',104,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(101,1,'PEGGY','MYERS','PEGGY.MYERS@sakilacustomer.org',105,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(102,1,'CRYSTAL','FORD','CRYSTAL.FORD@sakilacustomer.org',106,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(103,1,'GLADYS','HAMILTON','GLADYS.HAMILTON@sakilacustomer.org',107,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(104,1,'RITA','GRAHAM','RITA.GRAHAM@sakilacustomer.org',108,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(105,1,'DAWN','SULLIVAN','DAWN.SULLIVAN@sakilacustomer.org',109,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(106,1,'CONNIE','WALLACE','CONNIE.WALLACE@sakilacustomer.org',110,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(107,1,'FLORENCE','WOODS','FLORENCE.WOODS@sakilacustomer.org',111,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(108,1,'TRACY','COLE','TRACY.COLE@sakilacustomer.org',112,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(109,2,'EDNA','WEST','EDNA.WEST@sakilacustomer.org',113,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(110,2,'TIFFANY','JORDAN','TIFFANY.JORDAN@sakilacustomer.org',114,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(111,1,'CARMEN','OWENS','CARMEN.OWENS@sakilacustomer.org',115,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(112,2,'ROSA','REYNOLDS','ROSA.REYNOLDS@sakilacustomer.org',116,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(113,2,'CINDY','FISHER','CINDY.FISHER@sakilacustomer.org',117,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(114,2,'GRACE','ELLIS','GRACE.ELLIS@sakilacustomer.org',118,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(115,1,'WENDY','HARRISON','WENDY.HARRISON@sakilacustomer.org',119,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(116,1,'VICTORIA','GIBSON','VICTORIA.GIBSON@sakilacustomer.org',120,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(117,1,'EDITH','MCDONALD','EDITH.MCDONALD@sakilacustomer.org',121,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(118,1,'KIM','CRUZ','KIM.CRUZ@sakilacustomer.org',122,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(119,1,'SHERRY','MARSHALL','SHERRY.MARSHALL@sakilacustomer.org',123,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(120,2,'SYLVIA','ORTIZ','SYLVIA.ORTIZ@sakilacustomer.org',124,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(121,1,'JOSEPHINE','GOMEZ','JOSEPHINE.GOMEZ@sakilacustomer.org',125,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(122,1,'THELMA','MURRAY','THELMA.MURRAY@sakilacustomer.org',126,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(123,2,'SHANNON','FREEMAN','SHANNON.FREEMAN@sakilacustomer.org',127,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(124,1,'SHEILA','WELLS','SHEILA.WELLS@sakilacustomer.org',128,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(125,1,'ETHEL','WEBB','ETHEL.WEBB@sakilacustomer.org',129,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(126,1,'ELLEN','SIMPSON','ELLEN.SIMPSON@sakilacustomer.org',130,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(127,2,'ELAINE','STEVENS','ELAINE.STEVENS@sakilacustomer.org',131,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(128,1,'MARJORIE','TUCKER','MARJORIE.TUCKER@sakilacustomer.org',132,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(129,1,'CARRIE','PORTER','CARRIE.PORTER@sakilacustomer.org',133,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(130,1,'CHARLOTTE','HUNTER','CHARLOTTE.HUNTER@sakilacustomer.org',134,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(131,2,'MONICA','HICKS','MONICA.HICKS@sakilacustomer.org',135,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(132,2,'ESTHER','CRAWFORD','ESTHER.CRAWFORD@sakilacustomer.org',136,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(133,1,'PAULINE','HENRY','PAULINE.HENRY@sakilacustomer.org',137,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(134,1,'EMMA','BOYD','EMMA.BOYD@sakilacustomer.org',138,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(135,2,'JUANITA','MASON','JUANITA.MASON@sakilacustomer.org',139,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(136,2,'ANITA','MORALES','ANITA.MORALES@sakilacustomer.org',140,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(137,2,'RHONDA','KENNEDY','RHONDA.KENNEDY@sakilacustomer.org',141,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(138,1,'HAZEL','WARREN','HAZEL.WARREN@sakilacustomer.org',142,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(139,1,'AMBER','DIXON','AMBER.DIXON@sakilacustomer.org',143,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(140,1,'EVA','RAMOS','EVA.RAMOS@sakilacustomer.org',144,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(141,1,'DEBBIE','REYES','DEBBIE.REYES@sakilacustomer.org',145,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(142,1,'APRIL','BURNS','APRIL.BURNS@sakilacustomer.org',146,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(143,1,'LESLIE','GORDON','LESLIE.GORDON@sakilacustomer.org',147,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(144,1,'CLARA','SHAW','CLARA.SHAW@sakilacustomer.org',148,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(145,1,'LUCILLE','HOLMES','LUCILLE.HOLMES@sakilacustomer.org',149,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(146,1,'JAMIE','RICE','JAMIE.RICE@sakilacustomer.org',150,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(147,2,'JOANNE','ROBERTSON','JOANNE.ROBERTSON@sakilacustomer.org',151,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(148,1,'ELEANOR','HUNT','ELEANOR.HUNT@sakilacustomer.org',152,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(149,1,'VALERIE','BLACK','VALERIE.BLACK@sakilacustomer.org',153,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(150,2,'DANIELLE','DANIELS','DANIELLE.DANIELS@sakilacustomer.org',154,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(151,2,'MEGAN','PALMER','MEGAN.PALMER@sakilacustomer.org',155,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(152,1,'ALICIA','MILLS','ALICIA.MILLS@sakilacustomer.org',156,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(153,2,'SUZANNE','NICHOLS','SUZANNE.NICHOLS@sakilacustomer.org',157,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(154,2,'MICHELE','GRANT','MICHELE.GRANT@sakilacustomer.org',158,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(155,1,'GAIL','KNIGHT','GAIL.KNIGHT@sakilacustomer.org',159,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(156,1,'BERTHA','FERGUSON','BERTHA.FERGUSON@sakilacustomer.org',160,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(157,2,'DARLENE','ROSE','DARLENE.ROSE@sakilacustomer.org',161,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(158,1,'VERONICA','STONE','VERONICA.STONE@sakilacustomer.org',162,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(159,1,'JILL','HAWKINS','JILL.HAWKINS@sakilacustomer.org',163,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(160,2,'ERIN','DUNN','ERIN.DUNN@sakilacustomer.org',164,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(161,1,'GERALDINE','PERKINS','GERALDINE.PERKINS@sakilacustomer.org',165,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(162,2,'LAUREN','HUDSON','LAUREN.HUDSON@sakilacustomer.org',166,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(163,1,'CATHY','SPENCER','CATHY.SPENCER@sakilacustomer.org',167,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(164,2,'JOANN','GARDNER','JOANN.GARDNER@sakilacustomer.org',168,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(165,2,'LORRAINE','STEPHENS','LORRAINE.STEPHENS@sakilacustomer.org',169,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(166,1,'LYNN','PAYNE','LYNN.PAYNE@sakilacustomer.org',170,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(167,2,'SALLY','PIERCE','SALLY.PIERCE@sakilacustomer.org',171,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(168,1,'REGINA','BERRY','REGINA.BERRY@sakilacustomer.org',172,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(169,2,'ERICA','MATTHEWS','ERICA.MATTHEWS@sakilacustomer.org',173,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(170,1,'BEATRICE','ARNOLD','BEATRICE.ARNOLD@sakilacustomer.org',174,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(171,2,'DOLORES','WAGNER','DOLORES.WAGNER@sakilacustomer.org',175,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(172,1,'BERNICE','WILLIS','BERNICE.WILLIS@sakilacustomer.org',176,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(173,1,'AUDREY','RAY','AUDREY.RAY@sakilacustomer.org',177,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(174,2,'YVONNE','WATKINS','YVONNE.WATKINS@sakilacustomer.org',178,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(175,1,'ANNETTE','OLSON','ANNETTE.OLSON@sakilacustomer.org',179,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(176,1,'JUNE','CARROLL','JUNE.CARROLL@sakilacustomer.org',180,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(177,2,'SAMANTHA','DUNCAN','SAMANTHA.DUNCAN@sakilacustomer.org',181,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(178,2,'MARION','SNYDER','MARION.SNYDER@sakilacustomer.org',182,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(179,1,'DANA','HART','DANA.HART@sakilacustomer.org',183,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(180,2,'STACY','CUNNINGHAM','STACY.CUNNINGHAM@sakilacustomer.org',184,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(181,2,'ANA','BRADLEY','ANA.BRADLEY@sakilacustomer.org',185,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(182,1,'RENEE','LANE','RENEE.LANE@sakilacustomer.org',186,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(183,2,'IDA','ANDREWS','IDA.ANDREWS@sakilacustomer.org',187,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(184,1,'VIVIAN','RUIZ','VIVIAN.RUIZ@sakilacustomer.org',188,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(185,1,'ROBERTA','HARPER','ROBERTA.HARPER@sakilacustomer.org',189,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(186,2,'HOLLY','FOX','HOLLY.FOX@sakilacustomer.org',190,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(187,2,'BRITTANY','RILEY','BRITTANY.RILEY@sakilacustomer.org',191,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(188,1,'MELANIE','ARMSTRONG','MELANIE.ARMSTRONG@sakilacustomer.org',192,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(189,1,'LORETTA','CARPENTER','LORETTA.CARPENTER@sakilacustomer.org',193,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(190,2,'YOLANDA','WEAVER','YOLANDA.WEAVER@sakilacustomer.org',194,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(191,1,'JEANETTE','GREENE','JEANETTE.GREENE@sakilacustomer.org',195,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(192,1,'LAURIE','LAWRENCE','LAURIE.LAWRENCE@sakilacustomer.org',196,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(193,2,'KATIE','ELLIOTT','KATIE.ELLIOTT@sakilacustomer.org',197,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(194,2,'KRISTEN','CHAVEZ','KRISTEN.CHAVEZ@sakilacustomer.org',198,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(195,1,'VANESSA','SIMS','VANESSA.SIMS@sakilacustomer.org',199,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(196,1,'ALMA','AUSTIN','ALMA.AUSTIN@sakilacustomer.org',200,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(197,2,'SUE','PETERS','SUE.PETERS@sakilacustomer.org',201,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(198,2,'ELSIE','KELLEY','ELSIE.KELLEY@sakilacustomer.org',202,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(199,2,'BETH','FRANKLIN','BETH.FRANKLIN@sakilacustomer.org',203,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(200,2,'JEANNE','LAWSON','JEANNE.LAWSON@sakilacustomer.org',204,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(201,1,'VICKI','FIELDS','VICKI.FIELDS@sakilacustomer.org',205,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(202,2,'CARLA','GUTIERREZ','CARLA.GUTIERREZ@sakilacustomer.org',206,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(203,1,'TARA','RYAN','TARA.RYAN@sakilacustomer.org',207,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(204,1,'ROSEMARY','SCHMIDT','ROSEMARY.SCHMIDT@sakilacustomer.org',208,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(205,2,'EILEEN','CARR','EILEEN.CARR@sakilacustomer.org',209,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(206,1,'TERRI','VASQUEZ','TERRI.VASQUEZ@sakilacustomer.org',210,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(207,1,'GERTRUDE','CASTILLO','GERTRUDE.CASTILLO@sakilacustomer.org',211,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(208,1,'LUCY','WHEELER','LUCY.WHEELER@sakilacustomer.org',212,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(209,2,'TONYA','CHAPMAN','TONYA.CHAPMAN@sakilacustomer.org',213,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(210,2,'ELLA','OLIVER','ELLA.OLIVER@sakilacustomer.org',214,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(211,1,'STACEY','MONTGOMERY','STACEY.MONTGOMERY@sakilacustomer.org',215,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(212,2,'WILMA','RICHARDS','WILMA.RICHARDS@sakilacustomer.org',216,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(213,1,'GINA','WILLIAMSON','GINA.WILLIAMSON@sakilacustomer.org',217,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(214,1,'KRISTIN','JOHNSTON','KRISTIN.JOHNSTON@sakilacustomer.org',218,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(215,2,'JESSIE','BANKS','JESSIE.BANKS@sakilacustomer.org',219,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(216,1,'NATALIE','MEYER','NATALIE.MEYER@sakilacustomer.org',220,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(217,2,'AGNES','BISHOP','AGNES.BISHOP@sakilacustomer.org',221,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(218,1,'VERA','MCCOY','VERA.MCCOY@sakilacustomer.org',222,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(219,2,'WILLIE','HOWELL','WILLIE.HOWELL@sakilacustomer.org',223,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(220,2,'CHARLENE','ALVAREZ','CHARLENE.ALVAREZ@sakilacustomer.org',224,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(221,1,'BESSIE','MORRISON','BESSIE.MORRISON@sakilacustomer.org',225,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(222,2,'DELORES','HANSEN','DELORES.HANSEN@sakilacustomer.org',226,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(223,1,'MELINDA','FERNANDEZ','MELINDA.FERNANDEZ@sakilacustomer.org',227,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(224,2,'PEARL','GARZA','PEARL.GARZA@sakilacustomer.org',228,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(225,1,'ARLENE','HARVEY','ARLENE.HARVEY@sakilacustomer.org',229,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(226,2,'MAUREEN','LITTLE','MAUREEN.LITTLE@sakilacustomer.org',230,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(227,1,'COLLEEN','BURTON','COLLEEN.BURTON@sakilacustomer.org',231,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(228,2,'ALLISON','STANLEY','ALLISON.STANLEY@sakilacustomer.org',232,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(229,1,'TAMARA','NGUYEN','TAMARA.NGUYEN@sakilacustomer.org',233,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(230,2,'JOY','GEORGE','JOY.GEORGE@sakilacustomer.org',234,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(231,1,'GEORGIA','JACOBS','GEORGIA.JACOBS@sakilacustomer.org',235,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(232,2,'CONSTANCE','REID','CONSTANCE.REID@sakilacustomer.org',236,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(233,2,'LILLIE','KIM','LILLIE.KIM@sakilacustomer.org',237,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(234,1,'CLAUDIA','FULLER','CLAUDIA.FULLER@sakilacustomer.org',238,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(235,1,'JACKIE','LYNCH','JACKIE.LYNCH@sakilacustomer.org',239,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(236,1,'MARCIA','DEAN','MARCIA.DEAN@sakilacustomer.org',240,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(237,1,'TANYA','GILBERT','TANYA.GILBERT@sakilacustomer.org',241,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(238,1,'NELLIE','GARRETT','NELLIE.GARRETT@sakilacustomer.org',242,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(239,2,'MINNIE','ROMERO','MINNIE.ROMERO@sakilacustomer.org',243,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(240,1,'MARLENE','WELCH','MARLENE.WELCH@sakilacustomer.org',244,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(241,2,'HEIDI','LARSON','HEIDI.LARSON@sakilacustomer.org',245,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(242,1,'GLENDA','FRAZIER','GLENDA.FRAZIER@sakilacustomer.org',246,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(243,1,'LYDIA','BURKE','LYDIA.BURKE@sakilacustomer.org',247,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(244,2,'VIOLA','HANSON','VIOLA.HANSON@sakilacustomer.org',248,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(245,1,'COURTNEY','DAY','COURTNEY.DAY@sakilacustomer.org',249,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(246,1,'MARIAN','MENDOZA','MARIAN.MENDOZA@sakilacustomer.org',250,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(247,1,'STELLA','MORENO','STELLA.MORENO@sakilacustomer.org',251,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(248,1,'CAROLINE','BOWMAN','CAROLINE.BOWMAN@sakilacustomer.org',252,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(249,2,'DORA','MEDINA','DORA.MEDINA@sakilacustomer.org',253,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(250,2,'JO','FOWLER','JO.FOWLER@sakilacustomer.org',254,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(251,2,'VICKIE','BREWER','VICKIE.BREWER@sakilacustomer.org',255,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(252,2,'MATTIE','HOFFMAN','MATTIE.HOFFMAN@sakilacustomer.org',256,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(253,1,'TERRY','CARLSON','TERRY.CARLSON@sakilacustomer.org',258,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(254,2,'MAXINE','SILVA','MAXINE.SILVA@sakilacustomer.org',259,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(255,2,'IRMA','PEARSON','IRMA.PEARSON@sakilacustomer.org',260,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(256,2,'MABEL','HOLLAND','MABEL.HOLLAND@sakilacustomer.org',261,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(257,2,'MARSHA','DOUGLAS','MARSHA.DOUGLAS@sakilacustomer.org',262,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(258,1,'MYRTLE','FLEMING','MYRTLE.FLEMING@sakilacustomer.org',263,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(259,2,'LENA','JENSEN','LENA.JENSEN@sakilacustomer.org',264,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(260,1,'CHRISTY','VARGAS','CHRISTY.VARGAS@sakilacustomer.org',265,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(261,1,'DEANNA','BYRD','DEANNA.BYRD@sakilacustomer.org',266,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(262,2,'PATSY','DAVIDSON','PATSY.DAVIDSON@sakilacustomer.org',267,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(263,1,'HILDA','HOPKINS','HILDA.HOPKINS@sakilacustomer.org',268,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(264,1,'GWENDOLYN','MAY','GWENDOLYN.MAY@sakilacustomer.org',269,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(265,2,'JENNIE','TERRY','JENNIE.TERRY@sakilacustomer.org',270,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(266,2,'NORA','HERRERA','NORA.HERRERA@sakilacustomer.org',271,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(267,1,'MARGIE','WADE','MARGIE.WADE@sakilacustomer.org',272,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(268,1,'NINA','SOTO','NINA.SOTO@sakilacustomer.org',273,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(269,1,'CASSANDRA','WALTERS','CASSANDRA.WALTERS@sakilacustomer.org',274,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(270,1,'LEAH','CURTIS','LEAH.CURTIS@sakilacustomer.org',275,1,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(271,1,'PENNY','NEAL','PENNY.NEAL@sakilacustomer.org',276,0,'2006-02-14 22:04:36','2006-02-15 04:57:20'),(272,1,'KAY','CALDWELL','KAY.CALDWELL@sakilacustomer.org',277,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(273,2,'PRISCILLA','LOWE','PRISCILLA.LOWE@sakilacustomer.org',278,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(274,1,'NAOMI','JENNINGS','NAOMI.JENNINGS@sakilacustomer.org',279,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(275,2,'CAROLE','BARNETT','CAROLE.BARNETT@sakilacustomer.org',280,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(276,1,'BRANDY','GRAVES','BRANDY.GRAVES@sakilacustomer.org',281,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(277,2,'OLGA','JIMENEZ','OLGA.JIMENEZ@sakilacustomer.org',282,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(278,2,'BILLIE','HORTON','BILLIE.HORTON@sakilacustomer.org',283,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(279,2,'DIANNE','SHELTON','DIANNE.SHELTON@sakilacustomer.org',284,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(280,2,'TRACEY','BARRETT','TRACEY.BARRETT@sakilacustomer.org',285,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(281,2,'LEONA','OBRIEN','LEONA.OBRIEN@sakilacustomer.org',286,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(282,2,'JENNY','CASTRO','JENNY.CASTRO@sakilacustomer.org',287,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(283,1,'FELICIA','SUTTON','FELICIA.SUTTON@sakilacustomer.org',288,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(284,1,'SONIA','GREGORY','SONIA.GREGORY@sakilacustomer.org',289,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(285,1,'MIRIAM','MCKINNEY','MIRIAM.MCKINNEY@sakilacustomer.org',290,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(286,1,'VELMA','LUCAS','VELMA.LUCAS@sakilacustomer.org',291,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(287,2,'BECKY','MILES','BECKY.MILES@sakilacustomer.org',292,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(288,1,'BOBBIE','CRAIG','BOBBIE.CRAIG@sakilacustomer.org',293,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(289,1,'VIOLET','RODRIQUEZ','VIOLET.RODRIQUEZ@sakilacustomer.org',294,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(290,1,'KRISTINA','CHAMBERS','KRISTINA.CHAMBERS@sakilacustomer.org',295,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(291,1,'TONI','HOLT','TONI.HOLT@sakilacustomer.org',296,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(292,2,'MISTY','LAMBERT','MISTY.LAMBERT@sakilacustomer.org',297,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(293,2,'MAE','FLETCHER','MAE.FLETCHER@sakilacustomer.org',298,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(294,2,'SHELLY','WATTS','SHELLY.WATTS@sakilacustomer.org',299,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(295,1,'DAISY','BATES','DAISY.BATES@sakilacustomer.org',300,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(296,2,'RAMONA','HALE','RAMONA.HALE@sakilacustomer.org',301,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(297,1,'SHERRI','RHODES','SHERRI.RHODES@sakilacustomer.org',302,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(298,1,'ERIKA','PENA','ERIKA.PENA@sakilacustomer.org',303,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(299,2,'JAMES','GANNON','JAMES.GANNON@sakilacustomer.org',304,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(300,1,'JOHN','FARNSWORTH','JOHN.FARNSWORTH@sakilacustomer.org',305,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(301,2,'ROBERT','BAUGHMAN','ROBERT.BAUGHMAN@sakilacustomer.org',306,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(302,1,'MICHAEL','SILVERMAN','MICHAEL.SILVERMAN@sakilacustomer.org',307,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(303,2,'WILLIAM','SATTERFIELD','WILLIAM.SATTERFIELD@sakilacustomer.org',308,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(304,2,'DAVID','ROYAL','DAVID.ROYAL@sakilacustomer.org',309,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(305,1,'RICHARD','MCCRARY','RICHARD.MCCRARY@sakilacustomer.org',310,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(306,1,'CHARLES','KOWALSKI','CHARLES.KOWALSKI@sakilacustomer.org',311,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(307,2,'JOSEPH','JOY','JOSEPH.JOY@sakilacustomer.org',312,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(308,1,'THOMAS','GRIGSBY','THOMAS.GRIGSBY@sakilacustomer.org',313,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(309,1,'CHRISTOPHER','GRECO','CHRISTOPHER.GRECO@sakilacustomer.org',314,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(310,2,'DANIEL','CABRAL','DANIEL.CABRAL@sakilacustomer.org',315,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(311,2,'PAUL','TROUT','PAUL.TROUT@sakilacustomer.org',316,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(312,2,'MARK','RINEHART','MARK.RINEHART@sakilacustomer.org',317,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(313,2,'DONALD','MAHON','DONALD.MAHON@sakilacustomer.org',318,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(314,1,'GEORGE','LINTON','GEORGE.LINTON@sakilacustomer.org',319,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(315,2,'KENNETH','GOODEN','KENNETH.GOODEN@sakilacustomer.org',320,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(316,1,'STEVEN','CURLEY','STEVEN.CURLEY@sakilacustomer.org',321,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(317,2,'EDWARD','BAUGH','EDWARD.BAUGH@sakilacustomer.org',322,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(318,1,'BRIAN','WYMAN','BRIAN.WYMAN@sakilacustomer.org',323,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(319,2,'RONALD','WEINER','RONALD.WEINER@sakilacustomer.org',324,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(320,2,'ANTHONY','SCHWAB','ANTHONY.SCHWAB@sakilacustomer.org',325,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(321,1,'KEVIN','SCHULER','KEVIN.SCHULER@sakilacustomer.org',326,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(322,1,'JASON','MORRISSEY','JASON.MORRISSEY@sakilacustomer.org',327,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(323,2,'MATTHEW','MAHAN','MATTHEW.MAHAN@sakilacustomer.org',328,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(324,2,'GARY','COY','GARY.COY@sakilacustomer.org',329,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(325,1,'TIMOTHY','BUNN','TIMOTHY.BUNN@sakilacustomer.org',330,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(326,1,'JOSE','ANDREW','JOSE.ANDREW@sakilacustomer.org',331,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(327,2,'LARRY','THRASHER','LARRY.THRASHER@sakilacustomer.org',332,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(328,2,'JEFFREY','SPEAR','JEFFREY.SPEAR@sakilacustomer.org',333,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(329,2,'FRANK','WAGGONER','FRANK.WAGGONER@sakilacustomer.org',334,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(330,1,'SCOTT','SHELLEY','SCOTT.SHELLEY@sakilacustomer.org',335,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(331,1,'ERIC','ROBERT','ERIC.ROBERT@sakilacustomer.org',336,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(332,1,'STEPHEN','QUALLS','STEPHEN.QUALLS@sakilacustomer.org',337,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(333,2,'ANDREW','PURDY','ANDREW.PURDY@sakilacustomer.org',338,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(334,2,'RAYMOND','MCWHORTER','RAYMOND.MCWHORTER@sakilacustomer.org',339,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(335,1,'GREGORY','MAULDIN','GREGORY.MAULDIN@sakilacustomer.org',340,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(336,1,'JOSHUA','MARK','JOSHUA.MARK@sakilacustomer.org',341,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(337,1,'JERRY','JORDON','JERRY.JORDON@sakilacustomer.org',342,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(338,1,'DENNIS','GILMAN','DENNIS.GILMAN@sakilacustomer.org',343,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(339,2,'WALTER','PERRYMAN','WALTER.PERRYMAN@sakilacustomer.org',344,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(340,1,'PATRICK','NEWSOM','PATRICK.NEWSOM@sakilacustomer.org',345,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(341,1,'PETER','MENARD','PETER.MENARD@sakilacustomer.org',346,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(342,1,'HAROLD','MARTINO','HAROLD.MARTINO@sakilacustomer.org',347,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(343,1,'DOUGLAS','GRAF','DOUGLAS.GRAF@sakilacustomer.org',348,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(344,1,'HENRY','BILLINGSLEY','HENRY.BILLINGSLEY@sakilacustomer.org',349,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(345,1,'CARL','ARTIS','CARL.ARTIS@sakilacustomer.org',350,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(346,1,'ARTHUR','SIMPKINS','ARTHUR.SIMPKINS@sakilacustomer.org',351,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(347,2,'RYAN','SALISBURY','RYAN.SALISBURY@sakilacustomer.org',352,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(348,2,'ROGER','QUINTANILLA','ROGER.QUINTANILLA@sakilacustomer.org',353,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(349,2,'JOE','GILLILAND','JOE.GILLILAND@sakilacustomer.org',354,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(350,1,'JUAN','FRALEY','JUAN.FRALEY@sakilacustomer.org',355,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(351,1,'JACK','FOUST','JACK.FOUST@sakilacustomer.org',356,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(352,1,'ALBERT','CROUSE','ALBERT.CROUSE@sakilacustomer.org',357,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(353,1,'JONATHAN','SCARBOROUGH','JONATHAN.SCARBOROUGH@sakilacustomer.org',358,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(354,2,'JUSTIN','NGO','JUSTIN.NGO@sakilacustomer.org',359,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(355,2,'TERRY','GRISSOM','TERRY.GRISSOM@sakilacustomer.org',360,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(356,2,'GERALD','FULTZ','GERALD.FULTZ@sakilacustomer.org',361,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(357,1,'KEITH','RICO','KEITH.RICO@sakilacustomer.org',362,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(358,2,'SAMUEL','MARLOW','SAMUEL.MARLOW@sakilacustomer.org',363,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(359,2,'WILLIE','MARKHAM','WILLIE.MARKHAM@sakilacustomer.org',364,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(360,2,'RALPH','MADRIGAL','RALPH.MADRIGAL@sakilacustomer.org',365,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(361,2,'LAWRENCE','LAWTON','LAWRENCE.LAWTON@sakilacustomer.org',366,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(362,1,'NICHOLAS','BARFIELD','NICHOLAS.BARFIELD@sakilacustomer.org',367,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(363,2,'ROY','WHITING','ROY.WHITING@sakilacustomer.org',368,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(364,1,'BENJAMIN','VARNEY','BENJAMIN.VARNEY@sakilacustomer.org',369,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(365,2,'BRUCE','SCHWARZ','BRUCE.SCHWARZ@sakilacustomer.org',370,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(366,1,'BRANDON','HUEY','BRANDON.HUEY@sakilacustomer.org',371,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(367,1,'ADAM','GOOCH','ADAM.GOOCH@sakilacustomer.org',372,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(368,1,'HARRY','ARCE','HARRY.ARCE@sakilacustomer.org',373,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(369,2,'FRED','WHEAT','FRED.WHEAT@sakilacustomer.org',374,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(370,2,'WAYNE','TRUONG','WAYNE.TRUONG@sakilacustomer.org',375,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(371,1,'BILLY','POULIN','BILLY.POULIN@sakilacustomer.org',376,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(372,2,'STEVE','MACKENZIE','STEVE.MACKENZIE@sakilacustomer.org',377,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(373,1,'LOUIS','LEONE','LOUIS.LEONE@sakilacustomer.org',378,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(374,2,'JEREMY','HURTADO','JEREMY.HURTADO@sakilacustomer.org',379,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(375,2,'AARON','SELBY','AARON.SELBY@sakilacustomer.org',380,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(376,1,'RANDY','GAITHER','RANDY.GAITHER@sakilacustomer.org',381,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(377,1,'HOWARD','FORTNER','HOWARD.FORTNER@sakilacustomer.org',382,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(378,1,'EUGENE','CULPEPPER','EUGENE.CULPEPPER@sakilacustomer.org',383,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(379,1,'CARLOS','COUGHLIN','CARLOS.COUGHLIN@sakilacustomer.org',384,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(380,1,'RUSSELL','BRINSON','RUSSELL.BRINSON@sakilacustomer.org',385,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(381,2,'BOBBY','BOUDREAU','BOBBY.BOUDREAU@sakilacustomer.org',386,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(382,2,'VICTOR','BARKLEY','VICTOR.BARKLEY@sakilacustomer.org',387,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(383,1,'MARTIN','BALES','MARTIN.BALES@sakilacustomer.org',388,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(384,2,'ERNEST','STEPP','ERNEST.STEPP@sakilacustomer.org',389,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(385,1,'PHILLIP','HOLM','PHILLIP.HOLM@sakilacustomer.org',390,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(386,1,'TODD','TAN','TODD.TAN@sakilacustomer.org',391,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(387,2,'JESSE','SCHILLING','JESSE.SCHILLING@sakilacustomer.org',392,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(388,2,'CRAIG','MORRELL','CRAIG.MORRELL@sakilacustomer.org',393,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(389,1,'ALAN','KAHN','ALAN.KAHN@sakilacustomer.org',394,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(390,1,'SHAWN','HEATON','SHAWN.HEATON@sakilacustomer.org',395,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(391,1,'CLARENCE','GAMEZ','CLARENCE.GAMEZ@sakilacustomer.org',396,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(392,2,'SEAN','DOUGLASS','SEAN.DOUGLASS@sakilacustomer.org',397,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(393,1,'PHILIP','CAUSEY','PHILIP.CAUSEY@sakilacustomer.org',398,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(394,2,'CHRIS','BROTHERS','CHRIS.BROTHERS@sakilacustomer.org',399,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(395,2,'JOHNNY','TURPIN','JOHNNY.TURPIN@sakilacustomer.org',400,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(396,1,'EARL','SHANKS','EARL.SHANKS@sakilacustomer.org',401,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(397,1,'JIMMY','SCHRADER','JIMMY.SCHRADER@sakilacustomer.org',402,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(398,1,'ANTONIO','MEEK','ANTONIO.MEEK@sakilacustomer.org',403,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(399,1,'DANNY','ISOM','DANNY.ISOM@sakilacustomer.org',404,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(400,2,'BRYAN','HARDISON','BRYAN.HARDISON@sakilacustomer.org',405,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(401,2,'TONY','CARRANZA','TONY.CARRANZA@sakilacustomer.org',406,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(402,1,'LUIS','YANEZ','LUIS.YANEZ@sakilacustomer.org',407,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(403,1,'MIKE','WAY','MIKE.WAY@sakilacustomer.org',408,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(404,2,'STANLEY','SCROGGINS','STANLEY.SCROGGINS@sakilacustomer.org',409,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(405,1,'LEONARD','SCHOFIELD','LEONARD.SCHOFIELD@sakilacustomer.org',410,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(406,1,'NATHAN','RUNYON','NATHAN.RUNYON@sakilacustomer.org',411,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(407,1,'DALE','RATCLIFF','DALE.RATCLIFF@sakilacustomer.org',412,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(408,1,'MANUEL','MURRELL','MANUEL.MURRELL@sakilacustomer.org',413,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(409,2,'RODNEY','MOELLER','RODNEY.MOELLER@sakilacustomer.org',414,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(410,2,'CURTIS','IRBY','CURTIS.IRBY@sakilacustomer.org',415,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(411,1,'NORMAN','CURRIER','NORMAN.CURRIER@sakilacustomer.org',416,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(412,2,'ALLEN','BUTTERFIELD','ALLEN.BUTTERFIELD@sakilacustomer.org',417,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(413,2,'MARVIN','YEE','MARVIN.YEE@sakilacustomer.org',418,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(414,1,'VINCENT','RALSTON','VINCENT.RALSTON@sakilacustomer.org',419,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(415,1,'GLENN','PULLEN','GLENN.PULLEN@sakilacustomer.org',420,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(416,2,'JEFFERY','PINSON','JEFFERY.PINSON@sakilacustomer.org',421,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(417,1,'TRAVIS','ESTEP','TRAVIS.ESTEP@sakilacustomer.org',422,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(418,2,'JEFF','EAST','JEFF.EAST@sakilacustomer.org',423,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(419,1,'CHAD','CARBONE','CHAD.CARBONE@sakilacustomer.org',424,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(420,1,'JACOB','LANCE','JACOB.LANCE@sakilacustomer.org',425,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(421,1,'LEE','HAWKS','LEE.HAWKS@sakilacustomer.org',426,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(422,1,'MELVIN','ELLINGTON','MELVIN.ELLINGTON@sakilacustomer.org',427,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(423,2,'ALFRED','CASILLAS','ALFRED.CASILLAS@sakilacustomer.org',428,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(424,2,'KYLE','SPURLOCK','KYLE.SPURLOCK@sakilacustomer.org',429,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(425,2,'FRANCIS','SIKES','FRANCIS.SIKES@sakilacustomer.org',430,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(426,1,'BRADLEY','MOTLEY','BRADLEY.MOTLEY@sakilacustomer.org',431,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(427,2,'JESUS','MCCARTNEY','JESUS.MCCARTNEY@sakilacustomer.org',432,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(428,2,'HERBERT','KRUGER','HERBERT.KRUGER@sakilacustomer.org',433,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(429,2,'FREDERICK','ISBELL','FREDERICK.ISBELL@sakilacustomer.org',434,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(430,1,'RAY','HOULE','RAY.HOULE@sakilacustomer.org',435,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(431,2,'JOEL','FRANCISCO','JOEL.FRANCISCO@sakilacustomer.org',436,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(432,1,'EDWIN','BURK','EDWIN.BURK@sakilacustomer.org',437,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(433,1,'DON','BONE','DON.BONE@sakilacustomer.org',438,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(434,1,'EDDIE','TOMLIN','EDDIE.TOMLIN@sakilacustomer.org',439,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(435,2,'RICKY','SHELBY','RICKY.SHELBY@sakilacustomer.org',440,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(436,1,'TROY','QUIGLEY','TROY.QUIGLEY@sakilacustomer.org',441,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(437,2,'RANDALL','NEUMANN','RANDALL.NEUMANN@sakilacustomer.org',442,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(438,1,'BARRY','LOVELACE','BARRY.LOVELACE@sakilacustomer.org',443,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(439,2,'ALEXANDER','FENNELL','ALEXANDER.FENNELL@sakilacustomer.org',444,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(440,1,'BERNARD','COLBY','BERNARD.COLBY@sakilacustomer.org',445,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(441,1,'MARIO','CHEATHAM','MARIO.CHEATHAM@sakilacustomer.org',446,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(442,1,'LEROY','BUSTAMANTE','LEROY.BUSTAMANTE@sakilacustomer.org',447,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(443,2,'FRANCISCO','SKIDMORE','FRANCISCO.SKIDMORE@sakilacustomer.org',448,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(444,2,'MARCUS','HIDALGO','MARCUS.HIDALGO@sakilacustomer.org',449,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(445,1,'MICHEAL','FORMAN','MICHEAL.FORMAN@sakilacustomer.org',450,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(446,2,'THEODORE','CULP','THEODORE.CULP@sakilacustomer.org',451,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(447,1,'CLIFFORD','BOWENS','CLIFFORD.BOWENS@sakilacustomer.org',452,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(448,1,'MIGUEL','BETANCOURT','MIGUEL.BETANCOURT@sakilacustomer.org',453,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(449,2,'OSCAR','AQUINO','OSCAR.AQUINO@sakilacustomer.org',454,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(450,1,'JAY','ROBB','JAY.ROBB@sakilacustomer.org',455,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(451,1,'JIM','REA','JIM.REA@sakilacustomer.org',456,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(452,1,'TOM','MILNER','TOM.MILNER@sakilacustomer.org',457,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(453,1,'CALVIN','MARTEL','CALVIN.MARTEL@sakilacustomer.org',458,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(454,2,'ALEX','GRESHAM','ALEX.GRESHAM@sakilacustomer.org',459,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(455,2,'JON','WILES','JON.WILES@sakilacustomer.org',460,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(456,2,'RONNIE','RICKETTS','RONNIE.RICKETTS@sakilacustomer.org',461,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(457,2,'BILL','GAVIN','BILL.GAVIN@sakilacustomer.org',462,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(458,1,'LLOYD','DOWD','LLOYD.DOWD@sakilacustomer.org',463,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(459,1,'TOMMY','COLLAZO','TOMMY.COLLAZO@sakilacustomer.org',464,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(460,1,'LEON','BOSTIC','LEON.BOSTIC@sakilacustomer.org',465,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(461,1,'DEREK','BLAKELY','DEREK.BLAKELY@sakilacustomer.org',466,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(462,2,'WARREN','SHERROD','WARREN.SHERROD@sakilacustomer.org',467,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(463,2,'DARRELL','POWER','DARRELL.POWER@sakilacustomer.org',468,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(464,1,'JEROME','KENYON','JEROME.KENYON@sakilacustomer.org',469,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(465,1,'FLOYD','GANDY','FLOYD.GANDY@sakilacustomer.org',470,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(466,1,'LEO','EBERT','LEO.EBERT@sakilacustomer.org',471,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(467,2,'ALVIN','DELOACH','ALVIN.DELOACH@sakilacustomer.org',472,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(468,1,'TIM','CARY','TIM.CARY@sakilacustomer.org',473,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(469,2,'WESLEY','BULL','WESLEY.BULL@sakilacustomer.org',474,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(470,1,'GORDON','ALLARD','GORDON.ALLARD@sakilacustomer.org',475,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(471,1,'DEAN','SAUER','DEAN.SAUER@sakilacustomer.org',476,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(472,1,'GREG','ROBINS','GREG.ROBINS@sakilacustomer.org',477,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(473,2,'JORGE','OLIVARES','JORGE.OLIVARES@sakilacustomer.org',478,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(474,2,'DUSTIN','GILLETTE','DUSTIN.GILLETTE@sakilacustomer.org',479,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(475,2,'PEDRO','CHESTNUT','PEDRO.CHESTNUT@sakilacustomer.org',480,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(476,1,'DERRICK','BOURQUE','DERRICK.BOURQUE@sakilacustomer.org',481,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(477,1,'DAN','PAINE','DAN.PAINE@sakilacustomer.org',482,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(478,1,'LEWIS','LYMAN','LEWIS.LYMAN@sakilacustomer.org',483,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(479,1,'ZACHARY','HITE','ZACHARY.HITE@sakilacustomer.org',484,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(480,1,'COREY','HAUSER','COREY.HAUSER@sakilacustomer.org',485,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(481,1,'HERMAN','DEVORE','HERMAN.DEVORE@sakilacustomer.org',486,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(482,1,'MAURICE','CRAWLEY','MAURICE.CRAWLEY@sakilacustomer.org',487,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(483,2,'VERNON','CHAPA','VERNON.CHAPA@sakilacustomer.org',488,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(484,1,'ROBERTO','VU','ROBERTO.VU@sakilacustomer.org',489,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(485,1,'CLYDE','TOBIAS','CLYDE.TOBIAS@sakilacustomer.org',490,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(486,1,'GLEN','TALBERT','GLEN.TALBERT@sakilacustomer.org',491,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(487,2,'HECTOR','POINDEXTER','HECTOR.POINDEXTER@sakilacustomer.org',492,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(488,2,'SHANE','MILLARD','SHANE.MILLARD@sakilacustomer.org',493,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(489,1,'RICARDO','MEADOR','RICARDO.MEADOR@sakilacustomer.org',494,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(490,1,'SAM','MCDUFFIE','SAM.MCDUFFIE@sakilacustomer.org',495,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(491,2,'RICK','MATTOX','RICK.MATTOX@sakilacustomer.org',496,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(492,2,'LESTER','KRAUS','LESTER.KRAUS@sakilacustomer.org',497,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(493,1,'BRENT','HARKINS','BRENT.HARKINS@sakilacustomer.org',498,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(494,2,'RAMON','CHOATE','RAMON.CHOATE@sakilacustomer.org',499,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(495,2,'CHARLIE','BESS','CHARLIE.BESS@sakilacustomer.org',500,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(496,2,'TYLER','WREN','TYLER.WREN@sakilacustomer.org',501,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(497,2,'GILBERT','SLEDGE','GILBERT.SLEDGE@sakilacustomer.org',502,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(498,1,'GENE','SANBORN','GENE.SANBORN@sakilacustomer.org',503,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(499,2,'MARC','OUTLAW','MARC.OUTLAW@sakilacustomer.org',504,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(500,1,'REGINALD','KINDER','REGINALD.KINDER@sakilacustomer.org',505,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(501,1,'RUBEN','GEARY','RUBEN.GEARY@sakilacustomer.org',506,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(502,1,'BRETT','CORNWELL','BRETT.CORNWELL@sakilacustomer.org',507,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(503,1,'ANGEL','BARCLAY','ANGEL.BARCLAY@sakilacustomer.org',508,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(504,1,'NATHANIEL','ADAM','NATHANIEL.ADAM@sakilacustomer.org',509,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(505,1,'RAFAEL','ABNEY','RAFAEL.ABNEY@sakilacustomer.org',510,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(506,2,'LESLIE','SEWARD','LESLIE.SEWARD@sakilacustomer.org',511,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(507,2,'EDGAR','RHOADS','EDGAR.RHOADS@sakilacustomer.org',512,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(508,2,'MILTON','HOWLAND','MILTON.HOWLAND@sakilacustomer.org',513,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(509,1,'RAUL','FORTIER','RAUL.FORTIER@sakilacustomer.org',514,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(510,2,'BEN','EASTER','BEN.EASTER@sakilacustomer.org',515,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(511,1,'CHESTER','BENNER','CHESTER.BENNER@sakilacustomer.org',516,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(512,1,'CECIL','VINES','CECIL.VINES@sakilacustomer.org',517,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(513,2,'DUANE','TUBBS','DUANE.TUBBS@sakilacustomer.org',519,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(514,2,'FRANKLIN','TROUTMAN','FRANKLIN.TROUTMAN@sakilacustomer.org',520,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(515,1,'ANDRE','RAPP','ANDRE.RAPP@sakilacustomer.org',521,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(516,2,'ELMER','NOE','ELMER.NOE@sakilacustomer.org',522,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(517,2,'BRAD','MCCURDY','BRAD.MCCURDY@sakilacustomer.org',523,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(518,1,'GABRIEL','HARDER','GABRIEL.HARDER@sakilacustomer.org',524,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(519,2,'RON','DELUCA','RON.DELUCA@sakilacustomer.org',525,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(520,2,'MITCHELL','WESTMORELAND','MITCHELL.WESTMORELAND@sakilacustomer.org',526,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(521,2,'ROLAND','SOUTH','ROLAND.SOUTH@sakilacustomer.org',527,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(522,2,'ARNOLD','HAVENS','ARNOLD.HAVENS@sakilacustomer.org',528,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(523,1,'HARVEY','GUAJARDO','HARVEY.GUAJARDO@sakilacustomer.org',529,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(524,1,'JARED','ELY','JARED.ELY@sakilacustomer.org',530,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(525,2,'ADRIAN','CLARY','ADRIAN.CLARY@sakilacustomer.org',531,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(526,2,'KARL','SEAL','KARL.SEAL@sakilacustomer.org',532,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(527,1,'CORY','MEEHAN','CORY.MEEHAN@sakilacustomer.org',533,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(528,1,'CLAUDE','HERZOG','CLAUDE.HERZOG@sakilacustomer.org',534,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(529,2,'ERIK','GUILLEN','ERIK.GUILLEN@sakilacustomer.org',535,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(530,2,'DARRYL','ASHCRAFT','DARRYL.ASHCRAFT@sakilacustomer.org',536,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(531,2,'JAMIE','WAUGH','JAMIE.WAUGH@sakilacustomer.org',537,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(532,2,'NEIL','RENNER','NEIL.RENNER@sakilacustomer.org',538,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(533,1,'JESSIE','MILAM','JESSIE.MILAM@sakilacustomer.org',539,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(534,1,'CHRISTIAN','JUNG','CHRISTIAN.JUNG@sakilacustomer.org',540,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(535,1,'JAVIER','ELROD','JAVIER.ELROD@sakilacustomer.org',541,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(536,2,'FERNANDO','CHURCHILL','FERNANDO.CHURCHILL@sakilacustomer.org',542,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(537,2,'CLINTON','BUFORD','CLINTON.BUFORD@sakilacustomer.org',543,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(538,2,'TED','BREAUX','TED.BREAUX@sakilacustomer.org',544,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(539,1,'MATHEW','BOLIN','MATHEW.BOLIN@sakilacustomer.org',545,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(540,1,'TYRONE','ASHER','TYRONE.ASHER@sakilacustomer.org',546,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(541,2,'DARREN','WINDHAM','DARREN.WINDHAM@sakilacustomer.org',547,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(542,2,'LONNIE','TIRADO','LONNIE.TIRADO@sakilacustomer.org',548,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(543,1,'LANCE','PEMBERTON','LANCE.PEMBERTON@sakilacustomer.org',549,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(544,2,'CODY','NOLEN','CODY.NOLEN@sakilacustomer.org',550,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(545,2,'JULIO','NOLAND','JULIO.NOLAND@sakilacustomer.org',551,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(546,1,'KELLY','KNOTT','KELLY.KNOTT@sakilacustomer.org',552,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(547,1,'KURT','EMMONS','KURT.EMMONS@sakilacustomer.org',553,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(548,1,'ALLAN','CORNISH','ALLAN.CORNISH@sakilacustomer.org',554,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(549,1,'NELSON','CHRISTENSON','NELSON.CHRISTENSON@sakilacustomer.org',555,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(550,2,'GUY','BROWNLEE','GUY.BROWNLEE@sakilacustomer.org',556,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(551,2,'CLAYTON','BARBEE','CLAYTON.BARBEE@sakilacustomer.org',557,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(552,2,'HUGH','WALDROP','HUGH.WALDROP@sakilacustomer.org',558,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(553,1,'MAX','PITT','MAX.PITT@sakilacustomer.org',559,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(554,1,'DWAYNE','OLVERA','DWAYNE.OLVERA@sakilacustomer.org',560,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(555,1,'DWIGHT','LOMBARDI','DWIGHT.LOMBARDI@sakilacustomer.org',561,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(556,2,'ARMANDO','GRUBER','ARMANDO.GRUBER@sakilacustomer.org',562,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(557,1,'FELIX','GAFFNEY','FELIX.GAFFNEY@sakilacustomer.org',563,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(558,1,'JIMMIE','EGGLESTON','JIMMIE.EGGLESTON@sakilacustomer.org',564,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(559,2,'EVERETT','BANDA','EVERETT.BANDA@sakilacustomer.org',565,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(560,1,'JORDAN','ARCHULETA','JORDAN.ARCHULETA@sakilacustomer.org',566,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(561,2,'IAN','STILL','IAN.STILL@sakilacustomer.org',567,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(562,1,'WALLACE','SLONE','WALLACE.SLONE@sakilacustomer.org',568,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(563,2,'KEN','PREWITT','KEN.PREWITT@sakilacustomer.org',569,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(564,2,'BOB','PFEIFFER','BOB.PFEIFFER@sakilacustomer.org',570,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(565,2,'JAIME','NETTLES','JAIME.NETTLES@sakilacustomer.org',571,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(566,1,'CASEY','MENA','CASEY.MENA@sakilacustomer.org',572,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(567,2,'ALFREDO','MCADAMS','ALFREDO.MCADAMS@sakilacustomer.org',573,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(568,2,'ALBERTO','HENNING','ALBERTO.HENNING@sakilacustomer.org',574,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(569,2,'DAVE','GARDINER','DAVE.GARDINER@sakilacustomer.org',575,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(570,2,'IVAN','CROMWELL','IVAN.CROMWELL@sakilacustomer.org',576,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(571,2,'JOHNNIE','CHISHOLM','JOHNNIE.CHISHOLM@sakilacustomer.org',577,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(572,1,'SIDNEY','BURLESON','SIDNEY.BURLESON@sakilacustomer.org',578,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(573,1,'BYRON','BOX','BYRON.BOX@sakilacustomer.org',579,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(574,2,'JULIAN','VEST','JULIAN.VEST@sakilacustomer.org',580,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(575,2,'ISAAC','OGLESBY','ISAAC.OGLESBY@sakilacustomer.org',581,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(576,2,'MORRIS','MCCARTER','MORRIS.MCCARTER@sakilacustomer.org',582,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(577,2,'CLIFTON','MALCOLM','CLIFTON.MALCOLM@sakilacustomer.org',583,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(578,2,'WILLARD','LUMPKIN','WILLARD.LUMPKIN@sakilacustomer.org',584,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(579,2,'DARYL','LARUE','DARYL.LARUE@sakilacustomer.org',585,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(580,1,'ROSS','GREY','ROSS.GREY@sakilacustomer.org',586,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(581,1,'VIRGIL','WOFFORD','VIRGIL.WOFFORD@sakilacustomer.org',587,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(582,2,'ANDY','VANHORN','ANDY.VANHORN@sakilacustomer.org',588,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(583,1,'MARSHALL','THORN','MARSHALL.THORN@sakilacustomer.org',589,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(584,2,'SALVADOR','TEEL','SALVADOR.TEEL@sakilacustomer.org',590,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(585,1,'PERRY','SWAFFORD','PERRY.SWAFFORD@sakilacustomer.org',591,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(586,1,'KIRK','STCLAIR','KIRK.STCLAIR@sakilacustomer.org',592,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(587,1,'SERGIO','STANFIELD','SERGIO.STANFIELD@sakilacustomer.org',593,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(588,1,'MARION','OCAMPO','MARION.OCAMPO@sakilacustomer.org',594,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(589,1,'TRACY','HERRMANN','TRACY.HERRMANN@sakilacustomer.org',595,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(590,2,'SETH','HANNON','SETH.HANNON@sakilacustomer.org',596,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(591,1,'KENT','ARSENAULT','KENT.ARSENAULT@sakilacustomer.org',597,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(592,1,'TERRANCE','ROUSH','TERRANCE.ROUSH@sakilacustomer.org',598,0,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(593,2,'RENE','MCALISTER','RENE.MCALISTER@sakilacustomer.org',599,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(594,1,'EDUARDO','HIATT','EDUARDO.HIATT@sakilacustomer.org',600,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(595,1,'TERRENCE','GUNDERSON','TERRENCE.GUNDERSON@sakilacustomer.org',601,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(596,1,'ENRIQUE','FORSYTHE','ENRIQUE.FORSYTHE@sakilacustomer.org',602,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(597,1,'FREDDIE','DUGGAN','FREDDIE.DUGGAN@sakilacustomer.org',603,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(598,1,'WADE','DELVALLE','WADE.DELVALLE@sakilacustomer.org',604,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'),(599,2,'AUSTIN','CINTRON','AUSTIN.CINTRON@sakilacustomer.org',605,1,'2006-02-14 22:04:37','2006-02-15 04:57:20'); +COMMIT; + +-- +-- Trigger to enforce create dates on INSERT +-- + +CREATE TRIGGER customer_create_date BEFORE INSERT ON customer FOR EACH ROW SET NEW.create_date = NOW(); + +-- +-- Dumping data for table film +-- + +SET AUTOCOMMIT=0; +INSERT INTO film VALUES (1,'ACADEMY DINOSAUR','A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies',2006,1,NULL,6,'0.99',86,'20.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(2,'ACE GOLDFINGER','A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China',2006,1,NULL,3,'4.99',48,'12.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(3,'ADAPTATION HOLES','A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory',2006,1,NULL,7,'2.99',50,'18.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(4,'AFFAIR PREJUDICE','A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank',2006,1,NULL,5,'2.99',117,'26.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(5,'AFRICAN EGG','A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico',2006,1,NULL,6,'2.99',130,'22.99','G','Deleted Scenes','2006-02-15 05:03:42'),(6,'AGENT TRUMAN','A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China',2006,1,NULL,3,'2.99',169,'17.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(7,'AIRPLANE SIERRA','A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat',2006,1,NULL,6,'4.99',62,'28.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(8,'AIRPORT POLLOCK','A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India',2006,1,NULL,6,'4.99',54,'15.99','R','Trailers','2006-02-15 05:03:42'),(9,'ALABAMA DEVIL','A Thoughtful Panorama of a Database Administrator And a Mad Scientist who must Outgun a Mad Scientist in A Jet Boat',2006,1,NULL,3,'2.99',114,'21.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(10,'ALADDIN CALENDAR','A Action-Packed Tale of a Man And a Lumberjack who must Reach a Feminist in Ancient China',2006,1,NULL,6,'4.99',63,'24.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(11,'ALAMO VIDEOTAPE','A Boring Epistle of a Butler And a Cat who must Fight a Pastry Chef in A MySQL Convention',2006,1,NULL,6,'0.99',126,'16.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(12,'ALASKA PHANTOM','A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia',2006,1,NULL,6,'0.99',136,'22.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(13,'ALI FOREVER','A Action-Packed Drama of a Dentist And a Crocodile who must Battle a Feminist in The Canadian Rockies',2006,1,NULL,4,'4.99',150,'21.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(14,'ALICE FANTASIA','A Emotional Drama of a A Shark And a Database Administrator who must Vanquish a Pioneer in Soviet Georgia',2006,1,NULL,6,'0.99',94,'23.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(15,'ALIEN CENTER','A Brilliant Drama of a Cat And a Mad Scientist who must Battle a Feminist in A MySQL Convention',2006,1,NULL,5,'2.99',46,'10.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(16,'ALLEY EVOLUTION','A Fast-Paced Drama of a Robot And a Composer who must Battle a Astronaut in New Orleans',2006,1,NULL,6,'2.99',180,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(17,'ALONE TRIP','A Fast-Paced Character Study of a Composer And a Dog who must Outgun a Boat in An Abandoned Fun House',2006,1,NULL,3,'0.99',82,'14.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(18,'ALTER VICTORY','A Thoughtful Drama of a Composer And a Feminist who must Meet a Secret Agent in The Canadian Rockies',2006,1,NULL,6,'0.99',57,'27.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(19,'AMADEUS HOLY','A Emotional Display of a Pioneer And a Technical Writer who must Battle a Man in A Baloon',2006,1,NULL,6,'0.99',113,'20.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(20,'AMELIE HELLFIGHTERS','A Boring Drama of a Woman And a Squirrel who must Conquer a Student in A Baloon',2006,1,NULL,4,'4.99',79,'23.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(21,'AMERICAN CIRCUS','A Insightful Drama of a Girl And a Astronaut who must Face a Database Administrator in A Shark Tank',2006,1,NULL,3,'4.99',129,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(22,'AMISTAD MIDSUMMER','A Emotional Character Study of a Dentist And a Crocodile who must Meet a Sumo Wrestler in California',2006,1,NULL,6,'2.99',85,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(23,'ANACONDA CONFESSIONS','A Lacklusture Display of a Dentist And a Dentist who must Fight a Girl in Australia',2006,1,NULL,3,'0.99',92,'9.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(24,'ANALYZE HOOSIERS','A Thoughtful Display of a Explorer And a Pastry Chef who must Overcome a Feminist in The Sahara Desert',2006,1,NULL,6,'2.99',181,'19.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(25,'ANGELS LIFE','A Thoughtful Display of a Woman And a Astronaut who must Battle a Robot in Berlin',2006,1,NULL,3,'2.99',74,'15.99','G','Trailers','2006-02-15 05:03:42'),(26,'ANNIE IDENTITY','A Amazing Panorama of a Pastry Chef And a Boat who must Escape a Woman in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',86,'15.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(27,'ANONYMOUS HUMAN','A Amazing Reflection of a Database Administrator And a Astronaut who must Outrace a Database Administrator in A Shark Tank',2006,1,NULL,7,'0.99',179,'12.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(28,'ANTHEM LUKE','A Touching Panorama of a Waitress And a Woman who must Outrace a Dog in An Abandoned Amusement Park',2006,1,NULL,5,'4.99',91,'16.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(29,'ANTITRUST TOMATOES','A Fateful Yarn of a Womanizer And a Feminist who must Succumb a Database Administrator in Ancient India',2006,1,NULL,5,'2.99',168,'11.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(30,'ANYTHING SAVANNAH','A Epic Story of a Pastry Chef And a Woman who must Chase a Feminist in An Abandoned Fun House',2006,1,NULL,4,'2.99',82,'27.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(31,'APACHE DIVINE','A Awe-Inspiring Reflection of a Pastry Chef And a Teacher who must Overcome a Sumo Wrestler in A U-Boat',2006,1,NULL,5,'4.99',92,'16.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(32,'APOCALYPSE FLAMINGOS','A Astounding Story of a Dog And a Squirrel who must Defeat a Woman in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',119,'11.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(33,'APOLLO TEEN','A Action-Packed Reflection of a Crocodile And a Explorer who must Find a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,5,'2.99',153,'15.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(34,'ARABIA DOGMA','A Touching Epistle of a Madman And a Mad Cow who must Defeat a Student in Nigeria',2006,1,NULL,6,'0.99',62,'29.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(35,'ARACHNOPHOBIA ROLLERCOASTER','A Action-Packed Reflection of a Pastry Chef And a Composer who must Discover a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'2.99',147,'24.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(36,'ARGONAUTS TOWN','A Emotional Epistle of a Forensic Psychologist And a Butler who must Challenge a Waitress in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',127,'12.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(37,'ARIZONA BANG','A Brilliant Panorama of a Mad Scientist And a Mad Cow who must Meet a Pioneer in A Monastery',2006,1,NULL,3,'2.99',121,'28.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(38,'ARK RIDGEMONT','A Beautiful Yarn of a Pioneer And a Monkey who must Pursue a Explorer in The Sahara Desert',2006,1,NULL,6,'0.99',68,'25.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(39,'ARMAGEDDON LOST','A Fast-Paced Tale of a Boat And a Teacher who must Succumb a Composer in An Abandoned Mine Shaft',2006,1,NULL,5,'0.99',99,'10.99','G','Trailers','2006-02-15 05:03:42'),(40,'ARMY FLINTSTONES','A Boring Saga of a Database Administrator And a Womanizer who must Battle a Waitress in Nigeria',2006,1,NULL,4,'0.99',148,'22.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(41,'ARSENIC INDEPENDENCE','A Fanciful Documentary of a Mad Cow And a Womanizer who must Find a Dentist in Berlin',2006,1,NULL,4,'0.99',137,'17.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(42,'ARTIST COLDBLOODED','A Stunning Reflection of a Robot And a Moose who must Challenge a Woman in California',2006,1,NULL,5,'2.99',170,'10.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(43,'ATLANTIS CAUSE','A Thrilling Yarn of a Feminist And a Hunter who must Fight a Technical Writer in A Shark Tank',2006,1,NULL,6,'2.99',170,'15.99','G','Behind the Scenes','2006-02-15 05:03:42'),(44,'ATTACKS HATE','A Fast-Paced Panorama of a Technical Writer And a Mad Scientist who must Find a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',113,'21.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(45,'ATTRACTION NEWTON','A Astounding Panorama of a Composer And a Frisbee who must Reach a Husband in Ancient Japan',2006,1,NULL,5,'4.99',83,'14.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(46,'AUTUMN CROW','A Beautiful Tale of a Dentist And a Mad Cow who must Battle a Moose in The Sahara Desert',2006,1,NULL,3,'4.99',108,'13.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(47,'BABY HALL','A Boring Character Study of a A Shark And a Girl who must Outrace a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',153,'23.99','NC-17','Commentaries','2006-02-15 05:03:42'),(48,'BACKLASH UNDEFEATED','A Stunning Character Study of a Mad Scientist And a Mad Cow who must Kill a Car in A Monastery',2006,1,NULL,3,'4.99',118,'24.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(49,'BADMAN DAWN','A Emotional Panorama of a Pioneer And a Composer who must Escape a Mad Scientist in A Jet Boat',2006,1,NULL,6,'2.99',162,'22.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(50,'BAKED CLEOPATRA','A Stunning Drama of a Forensic Psychologist And a Husband who must Overcome a Waitress in A Monastery',2006,1,NULL,3,'2.99',182,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(51,'BALLOON HOMEWARD','A Insightful Panorama of a Forensic Psychologist And a Mad Cow who must Build a Mad Scientist in The First Manned Space Station',2006,1,NULL,5,'2.99',75,'10.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(52,'BALLROOM MOCKINGBIRD','A Thrilling Documentary of a Composer And a Monkey who must Find a Feminist in California',2006,1,NULL,6,'0.99',173,'29.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(53,'BANG KWAI','A Epic Drama of a Madman And a Cat who must Face a A Shark in An Abandoned Amusement Park',2006,1,NULL,5,'2.99',87,'25.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(54,'BANGER PINOCCHIO','A Awe-Inspiring Drama of a Car And a Pastry Chef who must Chase a Crocodile in The First Manned Space Station',2006,1,NULL,5,'0.99',113,'15.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(55,'BARBARELLA STREETCAR','A Awe-Inspiring Story of a Feminist And a Cat who must Conquer a Dog in A Monastery',2006,1,NULL,6,'2.99',65,'27.99','G','Behind the Scenes','2006-02-15 05:03:42'),(56,'BAREFOOT MANCHURIAN','A Intrepid Story of a Cat And a Student who must Vanquish a Girl in An Abandoned Amusement Park',2006,1,NULL,6,'2.99',129,'15.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(57,'BASIC EASY','A Stunning Epistle of a Man And a Husband who must Reach a Mad Scientist in A Jet Boat',2006,1,NULL,4,'2.99',90,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(58,'BEACH HEARTBREAKERS','A Fateful Display of a Womanizer And a Mad Scientist who must Outgun a A Shark in Soviet Georgia',2006,1,NULL,6,'2.99',122,'16.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(59,'BEAR GRACELAND','A Astounding Saga of a Dog And a Boy who must Kill a Teacher in The First Manned Space Station',2006,1,NULL,4,'2.99',160,'20.99','R','Deleted Scenes','2006-02-15 05:03:42'),(60,'BEAST HUNCHBACK','A Awe-Inspiring Epistle of a Student And a Squirrel who must Defeat a Boy in Ancient China',2006,1,NULL,3,'4.99',89,'22.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(61,'BEAUTY GREASE','A Fast-Paced Display of a Composer And a Moose who must Sink a Robot in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',175,'28.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(62,'BED HIGHBALL','A Astounding Panorama of a Lumberjack And a Dog who must Redeem a Woman in An Abandoned Fun House',2006,1,NULL,5,'2.99',106,'23.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(63,'BEDAZZLED MARRIED','A Astounding Character Study of a Madman And a Robot who must Meet a Mad Scientist in An Abandoned Fun House',2006,1,NULL,6,'0.99',73,'21.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(64,'BEETHOVEN EXORCIST','A Epic Display of a Pioneer And a Student who must Challenge a Butler in The Gulf of Mexico',2006,1,NULL,6,'0.99',151,'26.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(65,'BEHAVIOR RUNAWAY','A Unbelieveable Drama of a Student And a Husband who must Outrace a Sumo Wrestler in Berlin',2006,1,NULL,3,'4.99',100,'20.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(66,'BENEATH RUSH','A Astounding Panorama of a Man And a Monkey who must Discover a Man in The First Manned Space Station',2006,1,NULL,6,'0.99',53,'27.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(67,'BERETS AGENT','A Taut Saga of a Crocodile And a Boy who must Overcome a Technical Writer in Ancient China',2006,1,NULL,5,'2.99',77,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(68,'BETRAYED REAR','A Emotional Character Study of a Boat And a Pioneer who must Find a Explorer in A Shark Tank',2006,1,NULL,5,'4.99',122,'26.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(69,'BEVERLY OUTLAW','A Fanciful Documentary of a Womanizer And a Boat who must Defeat a Madman in The First Manned Space Station',2006,1,NULL,3,'2.99',85,'21.99','R','Trailers','2006-02-15 05:03:42'),(70,'BIKINI BORROWERS','A Astounding Drama of a Astronaut And a Cat who must Discover a Woman in The First Manned Space Station',2006,1,NULL,7,'4.99',142,'26.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(71,'BILKO ANONYMOUS','A Emotional Reflection of a Teacher And a Man who must Meet a Cat in The First Manned Space Station',2006,1,NULL,3,'4.99',100,'25.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(72,'BILL OTHERS','A Stunning Saga of a Mad Scientist And a Forensic Psychologist who must Challenge a Squirrel in A MySQL Convention',2006,1,NULL,6,'2.99',93,'12.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(73,'BINGO TALENTED','A Touching Tale of a Girl And a Crocodile who must Discover a Waitress in Nigeria',2006,1,NULL,5,'2.99',150,'22.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(74,'BIRCH ANTITRUST','A Fanciful Panorama of a Husband And a Pioneer who must Outgun a Dog in A Baloon',2006,1,NULL,4,'4.99',162,'18.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(75,'BIRD INDEPENDENCE','A Thrilling Documentary of a Car And a Student who must Sink a Hunter in The Canadian Rockies',2006,1,NULL,6,'4.99',163,'14.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(76,'BIRDCAGE CASPER','A Fast-Paced Saga of a Frisbee And a Astronaut who must Overcome a Feminist in Ancient India',2006,1,NULL,4,'0.99',103,'23.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(77,'BIRDS PERDITION','A Boring Story of a Womanizer And a Pioneer who must Face a Dog in California',2006,1,NULL,5,'4.99',61,'15.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(78,'BLACKOUT PRIVATE','A Intrepid Yarn of a Pastry Chef And a Mad Scientist who must Challenge a Secret Agent in Ancient Japan',2006,1,NULL,7,'2.99',85,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(79,'BLADE POLISH','A Thoughtful Character Study of a Frisbee And a Pastry Chef who must Fight a Dentist in The First Manned Space Station',2006,1,NULL,5,'0.99',114,'10.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(80,'BLANKET BEVERLY','A Emotional Documentary of a Student And a Girl who must Build a Boat in Nigeria',2006,1,NULL,7,'2.99',148,'21.99','G','Trailers','2006-02-15 05:03:42'),(81,'BLINDNESS GUN','A Touching Drama of a Robot And a Dentist who must Meet a Hunter in A Jet Boat',2006,1,NULL,6,'4.99',103,'29.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(82,'BLOOD ARGONAUTS','A Boring Drama of a Explorer And a Man who must Kill a Lumberjack in A Manhattan Penthouse',2006,1,NULL,3,'0.99',71,'13.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(83,'BLUES INSTINCT','A Insightful Documentary of a Boat And a Composer who must Meet a Forensic Psychologist in An Abandoned Fun House',2006,1,NULL,5,'2.99',50,'18.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(84,'BOILED DARES','A Awe-Inspiring Story of a Waitress And a Dog who must Discover a Dentist in Ancient Japan',2006,1,NULL,7,'4.99',102,'13.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(85,'BONNIE HOLOCAUST','A Fast-Paced Story of a Crocodile And a Robot who must Find a Moose in Ancient Japan',2006,1,NULL,4,'0.99',63,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(86,'BOOGIE AMELIE','A Lacklusture Character Study of a Husband And a Sumo Wrestler who must Succumb a Technical Writer in The Gulf of Mexico',2006,1,NULL,6,'4.99',121,'11.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(87,'BOONDOCK BALLROOM','A Fateful Panorama of a Crocodile And a Boy who must Defeat a Monkey in The Gulf of Mexico',2006,1,NULL,7,'0.99',76,'14.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(88,'BORN SPINAL','A Touching Epistle of a Frisbee And a Husband who must Pursue a Student in Nigeria',2006,1,NULL,7,'4.99',179,'17.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(89,'BORROWERS BEDAZZLED','A Brilliant Epistle of a Teacher And a Sumo Wrestler who must Defeat a Man in An Abandoned Fun House',2006,1,NULL,7,'0.99',63,'22.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(90,'BOULEVARD MOB','A Fateful Epistle of a Moose And a Monkey who must Confront a Lumberjack in Ancient China',2006,1,NULL,3,'0.99',63,'11.99','R','Trailers','2006-02-15 05:03:42'),(91,'BOUND CHEAPER','A Thrilling Panorama of a Database Administrator And a Astronaut who must Challenge a Lumberjack in A Baloon',2006,1,NULL,5,'0.99',98,'17.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(92,'BOWFINGER GABLES','A Fast-Paced Yarn of a Waitress And a Composer who must Outgun a Dentist in California',2006,1,NULL,7,'4.99',72,'19.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(93,'BRANNIGAN SUNRISE','A Amazing Epistle of a Moose And a Crocodile who must Outrace a Dog in Berlin',2006,1,NULL,4,'4.99',121,'27.99','PG','Trailers','2006-02-15 05:03:42'),(94,'BRAVEHEART HUMAN','A Insightful Story of a Dog And a Pastry Chef who must Battle a Girl in Berlin',2006,1,NULL,7,'2.99',176,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(95,'BREAKFAST GOLDFINGER','A Beautiful Reflection of a Student And a Student who must Fight a Moose in Berlin',2006,1,NULL,5,'4.99',123,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(96,'BREAKING HOME','A Beautiful Display of a Secret Agent And a Monkey who must Battle a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',169,'21.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(97,'BRIDE INTRIGUE','A Epic Tale of a Robot And a Monkey who must Vanquish a Man in New Orleans',2006,1,NULL,7,'0.99',56,'24.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(98,'BRIGHT ENCOUNTERS','A Fateful Yarn of a Lumberjack And a Feminist who must Conquer a Student in A Jet Boat',2006,1,NULL,4,'4.99',73,'12.99','PG-13','Trailers','2006-02-15 05:03:42'),(99,'BRINGING HYSTERICAL','A Fateful Saga of a A Shark And a Technical Writer who must Find a Woman in A Jet Boat',2006,1,NULL,7,'2.99',136,'14.99','PG','Trailers','2006-02-15 05:03:42'),(100,'BROOKLYN DESERT','A Beautiful Drama of a Dentist And a Composer who must Battle a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,7,'4.99',161,'21.99','R','Commentaries','2006-02-15 05:03:42'),(101,'BROTHERHOOD BLANKET','A Fateful Character Study of a Butler And a Technical Writer who must Sink a Astronaut in Ancient Japan',2006,1,NULL,3,'0.99',73,'26.99','R','Behind the Scenes','2006-02-15 05:03:42'),(102,'BUBBLE GROSSE','A Awe-Inspiring Panorama of a Crocodile And a Moose who must Confront a Girl in A Baloon',2006,1,NULL,4,'4.99',60,'20.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(103,'BUCKET BROTHERHOOD','A Amazing Display of a Girl And a Womanizer who must Succumb a Lumberjack in A Baloon Factory',2006,1,NULL,7,'4.99',133,'27.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(104,'BUGSY SONG','A Awe-Inspiring Character Study of a Secret Agent And a Boat who must Find a Squirrel in The First Manned Space Station',2006,1,NULL,4,'2.99',119,'17.99','G','Commentaries','2006-02-15 05:03:42'),(105,'BULL SHAWSHANK','A Fanciful Drama of a Moose And a Squirrel who must Conquer a Pioneer in The Canadian Rockies',2006,1,NULL,6,'0.99',125,'21.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(106,'BULWORTH COMMANDMENTS','A Amazing Display of a Mad Cow And a Pioneer who must Redeem a Sumo Wrestler in The Outback',2006,1,NULL,4,'2.99',61,'14.99','G','Trailers','2006-02-15 05:03:42'),(107,'BUNCH MINDS','A Emotional Story of a Feminist And a Feminist who must Escape a Pastry Chef in A MySQL Convention',2006,1,NULL,4,'2.99',63,'13.99','G','Behind the Scenes','2006-02-15 05:03:42'),(108,'BUTCH PANTHER','A Lacklusture Yarn of a Feminist And a Database Administrator who must Face a Hunter in New Orleans',2006,1,NULL,6,'0.99',67,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(109,'BUTTERFLY CHOCOLAT','A Fateful Story of a Girl And a Composer who must Conquer a Husband in A Shark Tank',2006,1,NULL,3,'0.99',89,'17.99','G','Behind the Scenes','2006-02-15 05:03:42'),(110,'CABIN FLASH','A Stunning Epistle of a Boat And a Man who must Challenge a A Shark in A Baloon Factory',2006,1,NULL,4,'0.99',53,'25.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(111,'CADDYSHACK JEDI','A Awe-Inspiring Epistle of a Woman And a Madman who must Fight a Robot in Soviet Georgia',2006,1,NULL,3,'0.99',52,'17.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(112,'CALENDAR GUNFIGHT','A Thrilling Drama of a Frisbee And a Lumberjack who must Sink a Man in Nigeria',2006,1,NULL,4,'4.99',120,'22.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(113,'CALIFORNIA BIRDS','A Thrilling Yarn of a Database Administrator And a Robot who must Battle a Database Administrator in Ancient India',2006,1,NULL,4,'4.99',75,'19.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(114,'CAMELOT VACATION','A Touching Character Study of a Woman And a Waitress who must Battle a Pastry Chef in A MySQL Convention',2006,1,NULL,3,'0.99',61,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(115,'CAMPUS REMEMBER','A Astounding Drama of a Crocodile And a Mad Cow who must Build a Robot in A Jet Boat',2006,1,NULL,5,'2.99',167,'27.99','R','Behind the Scenes','2006-02-15 05:03:42'),(116,'CANDIDATE PERDITION','A Brilliant Epistle of a Composer And a Database Administrator who must Vanquish a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'2.99',70,'10.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(117,'CANDLES GRAPES','A Fanciful Character Study of a Monkey And a Explorer who must Build a Astronaut in An Abandoned Fun House',2006,1,NULL,6,'4.99',135,'15.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(118,'CANYON STOCK','A Thoughtful Reflection of a Waitress And a Feminist who must Escape a Squirrel in A Manhattan Penthouse',2006,1,NULL,7,'0.99',85,'26.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(119,'CAPER MOTIONS','A Fateful Saga of a Moose And a Car who must Pursue a Woman in A MySQL Convention',2006,1,NULL,6,'0.99',176,'22.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(120,'CARIBBEAN LIBERTY','A Fanciful Tale of a Pioneer And a Technical Writer who must Outgun a Pioneer in A Shark Tank',2006,1,NULL,3,'4.99',92,'16.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(121,'CAROL TEXAS','A Astounding Character Study of a Composer And a Student who must Overcome a Composer in A Monastery',2006,1,NULL,4,'2.99',151,'15.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(122,'CARRIE BUNCH','A Amazing Epistle of a Student And a Astronaut who must Discover a Frisbee in The Canadian Rockies',2006,1,NULL,7,'0.99',114,'11.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(123,'CASABLANCA SUPER','A Amazing Panorama of a Crocodile And a Forensic Psychologist who must Pursue a Secret Agent in The First Manned Space Station',2006,1,NULL,6,'4.99',85,'22.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(124,'CASPER DRAGONFLY','A Intrepid Documentary of a Boat And a Crocodile who must Chase a Robot in The Sahara Desert',2006,1,NULL,3,'4.99',163,'16.99','PG-13','Trailers','2006-02-15 05:03:42'),(125,'CASSIDY WYOMING','A Intrepid Drama of a Frisbee And a Hunter who must Kill a Secret Agent in New Orleans',2006,1,NULL,5,'2.99',61,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(126,'CASUALTIES ENCINO','A Insightful Yarn of a A Shark And a Pastry Chef who must Face a Boy in A Monastery',2006,1,NULL,3,'4.99',179,'16.99','G','Trailers','2006-02-15 05:03:42'),(127,'CAT CONEHEADS','A Fast-Paced Panorama of a Girl And a A Shark who must Confront a Boy in Ancient India',2006,1,NULL,5,'4.99',112,'14.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(128,'CATCH AMISTAD','A Boring Reflection of a Lumberjack And a Feminist who must Discover a Woman in Nigeria',2006,1,NULL,7,'0.99',183,'10.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(129,'CAUSE DATE','A Taut Tale of a Explorer And a Pastry Chef who must Conquer a Hunter in A MySQL Convention',2006,1,NULL,3,'2.99',179,'16.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(130,'CELEBRITY HORN','A Amazing Documentary of a Secret Agent And a Astronaut who must Vanquish a Hunter in A Shark Tank',2006,1,NULL,7,'0.99',110,'24.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(131,'CENTER DINOSAUR','A Beautiful Character Study of a Sumo Wrestler And a Dentist who must Find a Dog in California',2006,1,NULL,5,'4.99',152,'12.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(132,'CHAINSAW UPTOWN','A Beautiful Documentary of a Boy And a Robot who must Discover a Squirrel in Australia',2006,1,NULL,6,'0.99',114,'25.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(133,'CHAMBER ITALIAN','A Fateful Reflection of a Moose And a Husband who must Overcome a Monkey in Nigeria',2006,1,NULL,7,'4.99',117,'14.99','NC-17','Trailers','2006-02-15 05:03:42'),(134,'CHAMPION FLATLINERS','A Amazing Story of a Mad Cow And a Dog who must Kill a Husband in A Monastery',2006,1,NULL,4,'4.99',51,'21.99','PG','Trailers','2006-02-15 05:03:42'),(135,'CHANCE RESURRECTION','A Astounding Story of a Forensic Psychologist And a Forensic Psychologist who must Overcome a Moose in Ancient China',2006,1,NULL,3,'2.99',70,'22.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(136,'CHAPLIN LICENSE','A Boring Drama of a Dog And a Forensic Psychologist who must Outrace a Explorer in Ancient India',2006,1,NULL,7,'2.99',146,'26.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(137,'CHARADE DUFFEL','A Action-Packed Display of a Man And a Waitress who must Build a Dog in A MySQL Convention',2006,1,NULL,3,'2.99',66,'21.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(138,'CHARIOTS CONSPIRACY','A Unbelieveable Epistle of a Robot And a Husband who must Chase a Robot in The First Manned Space Station',2006,1,NULL,5,'2.99',71,'29.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(139,'CHASING FIGHT','A Astounding Saga of a Technical Writer And a Butler who must Battle a Butler in A Shark Tank',2006,1,NULL,7,'4.99',114,'21.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(140,'CHEAPER CLYDE','A Emotional Character Study of a Pioneer And a Girl who must Discover a Dog in Ancient Japan',2006,1,NULL,6,'0.99',87,'23.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(141,'CHICAGO NORTH','A Fateful Yarn of a Mad Cow And a Waitress who must Battle a Student in California',2006,1,NULL,6,'4.99',185,'11.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(142,'CHICKEN HELLFIGHTERS','A Emotional Drama of a Dog And a Explorer who must Outrace a Technical Writer in Australia',2006,1,NULL,3,'0.99',122,'24.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(143,'CHILL LUCK','A Lacklusture Epistle of a Boat And a Technical Writer who must Fight a A Shark in The Canadian Rockies',2006,1,NULL,6,'0.99',142,'17.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(144,'CHINATOWN GLADIATOR','A Brilliant Panorama of a Technical Writer And a Lumberjack who must Escape a Butler in Ancient India',2006,1,NULL,7,'4.99',61,'24.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(145,'CHISUM BEHAVIOR','A Epic Documentary of a Sumo Wrestler And a Butler who must Kill a Car in Ancient India',2006,1,NULL,5,'4.99',124,'25.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(146,'CHITTY LOCK','A Boring Epistle of a Boat And a Database Administrator who must Kill a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,6,'2.99',107,'24.99','G','Commentaries','2006-02-15 05:03:42'),(147,'CHOCOLAT HARRY','A Action-Packed Epistle of a Dentist And a Moose who must Meet a Mad Cow in Ancient Japan',2006,1,NULL,5,'0.99',101,'16.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(148,'CHOCOLATE DUCK','A Unbelieveable Story of a Mad Scientist And a Technical Writer who must Discover a Composer in Ancient China',2006,1,NULL,3,'2.99',132,'13.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(149,'CHRISTMAS MOONSHINE','A Action-Packed Epistle of a Feminist And a Astronaut who must Conquer a Boat in A Manhattan Penthouse',2006,1,NULL,7,'0.99',150,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(150,'CIDER DESIRE','A Stunning Character Study of a Composer And a Mad Cow who must Succumb a Cat in Soviet Georgia',2006,1,NULL,7,'2.99',101,'9.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(151,'CINCINATTI WHISPERER','A Brilliant Saga of a Pastry Chef And a Hunter who must Confront a Butler in Berlin',2006,1,NULL,5,'4.99',143,'26.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(152,'CIRCUS YOUTH','A Thoughtful Drama of a Pastry Chef And a Dentist who must Pursue a Girl in A Baloon',2006,1,NULL,5,'2.99',90,'13.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(153,'CITIZEN SHREK','A Fanciful Character Study of a Technical Writer And a Husband who must Redeem a Robot in The Outback',2006,1,NULL,7,'0.99',165,'18.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(154,'CLASH FREDDY','A Amazing Yarn of a Composer And a Squirrel who must Escape a Astronaut in Australia',2006,1,NULL,6,'2.99',81,'12.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(155,'CLEOPATRA DEVIL','A Fanciful Documentary of a Crocodile And a Technical Writer who must Fight a A Shark in A Baloon',2006,1,NULL,6,'0.99',150,'26.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(156,'CLERKS ANGELS','A Thrilling Display of a Sumo Wrestler And a Girl who must Confront a Man in A Baloon',2006,1,NULL,3,'4.99',164,'15.99','G','Commentaries','2006-02-15 05:03:42'),(157,'CLOCKWORK PARADISE','A Insightful Documentary of a Technical Writer And a Feminist who must Challenge a Cat in A Baloon',2006,1,NULL,7,'0.99',143,'29.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(158,'CLONES PINOCCHIO','A Amazing Drama of a Car And a Robot who must Pursue a Dentist in New Orleans',2006,1,NULL,6,'2.99',124,'16.99','R','Behind the Scenes','2006-02-15 05:03:42'),(159,'CLOSER BANG','A Unbelieveable Panorama of a Frisbee And a Hunter who must Vanquish a Monkey in Ancient India',2006,1,NULL,5,'4.99',58,'12.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(160,'CLUB GRAFFITI','A Epic Tale of a Pioneer And a Hunter who must Escape a Girl in A U-Boat',2006,1,NULL,4,'0.99',65,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(161,'CLUE GRAIL','A Taut Tale of a Butler And a Mad Scientist who must Build a Crocodile in Ancient China',2006,1,NULL,6,'4.99',70,'27.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(162,'CLUELESS BUCKET','A Taut Tale of a Car And a Pioneer who must Conquer a Sumo Wrestler in An Abandoned Fun House',2006,1,NULL,4,'2.99',95,'13.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(163,'CLYDE THEORY','A Beautiful Yarn of a Astronaut And a Frisbee who must Overcome a Explorer in A Jet Boat',2006,1,NULL,4,'0.99',139,'29.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(164,'COAST RAINBOW','A Astounding Documentary of a Mad Cow And a Pioneer who must Challenge a Butler in The Sahara Desert',2006,1,NULL,4,'0.99',55,'20.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(165,'COLDBLOODED DARLING','A Brilliant Panorama of a Dentist And a Moose who must Find a Student in The Gulf of Mexico',2006,1,NULL,7,'4.99',70,'27.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(166,'COLOR PHILADELPHIA','A Thoughtful Panorama of a Car And a Crocodile who must Sink a Monkey in The Sahara Desert',2006,1,NULL,6,'2.99',149,'19.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(167,'COMA HEAD','A Awe-Inspiring Drama of a Boy And a Frisbee who must Escape a Pastry Chef in California',2006,1,NULL,6,'4.99',109,'10.99','NC-17','Commentaries','2006-02-15 05:03:42'),(168,'COMANCHEROS ENEMY','A Boring Saga of a Lumberjack And a Monkey who must Find a Monkey in The Gulf of Mexico',2006,1,NULL,5,'0.99',67,'23.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(169,'COMFORTS RUSH','A Unbelieveable Panorama of a Pioneer And a Husband who must Meet a Mad Cow in An Abandoned Mine Shaft',2006,1,NULL,3,'2.99',76,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(170,'COMMAND DARLING','A Awe-Inspiring Tale of a Forensic Psychologist And a Woman who must Challenge a Database Administrator in Ancient Japan',2006,1,NULL,5,'4.99',120,'28.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(171,'COMMANDMENTS EXPRESS','A Fanciful Saga of a Student And a Mad Scientist who must Battle a Hunter in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',59,'13.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(172,'CONEHEADS SMOOCHY','A Touching Story of a Womanizer And a Composer who must Pursue a Husband in Nigeria',2006,1,NULL,7,'4.99',112,'12.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(173,'CONFESSIONS MAGUIRE','A Insightful Story of a Car And a Boy who must Battle a Technical Writer in A Baloon',2006,1,NULL,7,'4.99',65,'25.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(174,'CONFIDENTIAL INTERVIEW','A Stunning Reflection of a Cat And a Woman who must Find a Astronaut in Ancient Japan',2006,1,NULL,6,'4.99',180,'13.99','NC-17','Commentaries','2006-02-15 05:03:42'),(175,'CONFUSED CANDLES','A Stunning Epistle of a Cat And a Forensic Psychologist who must Confront a Pioneer in A Baloon',2006,1,NULL,3,'2.99',122,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(176,'CONGENIALITY QUEST','A Touching Documentary of a Cat And a Pastry Chef who must Find a Lumberjack in A Baloon',2006,1,NULL,6,'0.99',87,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(177,'CONNECTICUT TRAMP','A Unbelieveable Drama of a Crocodile And a Mad Cow who must Reach a Dentist in A Shark Tank',2006,1,NULL,4,'4.99',172,'20.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(178,'CONNECTION MICROCOSMOS','A Fateful Documentary of a Crocodile And a Husband who must Face a Husband in The First Manned Space Station',2006,1,NULL,6,'0.99',115,'25.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(179,'CONQUERER NUTS','A Taut Drama of a Mad Scientist And a Man who must Escape a Pioneer in An Abandoned Mine Shaft',2006,1,NULL,4,'4.99',173,'14.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(180,'CONSPIRACY SPIRIT','A Awe-Inspiring Story of a Student And a Frisbee who must Conquer a Crocodile in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',184,'27.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(181,'CONTACT ANONYMOUS','A Insightful Display of a A Shark And a Monkey who must Face a Database Administrator in Ancient India',2006,1,NULL,7,'2.99',166,'10.99','PG-13','Commentaries','2006-02-15 05:03:42'),(182,'CONTROL ANTHEM','A Fateful Documentary of a Robot And a Student who must Battle a Cat in A Monastery',2006,1,NULL,7,'4.99',185,'9.99','G','Commentaries','2006-02-15 05:03:42'),(183,'CONVERSATION DOWNHILL','A Taut Character Study of a Husband And a Waitress who must Sink a Squirrel in A MySQL Convention',2006,1,NULL,4,'4.99',112,'14.99','R','Commentaries','2006-02-15 05:03:42'),(184,'CORE SUIT','A Unbelieveable Tale of a Car And a Explorer who must Confront a Boat in A Manhattan Penthouse',2006,1,NULL,3,'2.99',92,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(185,'COWBOY DOOM','A Astounding Drama of a Boy And a Lumberjack who must Fight a Butler in A Baloon',2006,1,NULL,3,'2.99',146,'10.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(186,'CRAFT OUTFIELD','A Lacklusture Display of a Explorer And a Hunter who must Succumb a Database Administrator in A Baloon Factory',2006,1,NULL,6,'0.99',64,'17.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(187,'CRANES RESERVOIR','A Fanciful Documentary of a Teacher And a Dog who must Outgun a Forensic Psychologist in A Baloon Factory',2006,1,NULL,5,'2.99',57,'12.99','NC-17','Commentaries','2006-02-15 05:03:42'),(188,'CRAZY HOME','A Fanciful Panorama of a Boy And a Woman who must Vanquish a Database Administrator in The Outback',2006,1,NULL,7,'2.99',136,'24.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(189,'CREATURES SHAKESPEARE','A Emotional Drama of a Womanizer And a Squirrel who must Vanquish a Crocodile in Ancient India',2006,1,NULL,3,'0.99',139,'23.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(190,'CREEPERS KANE','A Awe-Inspiring Reflection of a Squirrel And a Boat who must Outrace a Car in A Jet Boat',2006,1,NULL,5,'4.99',172,'23.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(191,'CROOKED FROGMEN','A Unbelieveable Drama of a Hunter And a Database Administrator who must Battle a Crocodile in An Abandoned Amusement Park',2006,1,NULL,6,'0.99',143,'27.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(192,'CROSSING DIVORCE','A Beautiful Documentary of a Dog And a Robot who must Redeem a Womanizer in Berlin',2006,1,NULL,4,'4.99',50,'19.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(193,'CROSSROADS CASUALTIES','A Intrepid Documentary of a Sumo Wrestler And a Astronaut who must Battle a Composer in The Outback',2006,1,NULL,5,'2.99',153,'20.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(194,'CROW GREASE','A Awe-Inspiring Documentary of a Woman And a Husband who must Sink a Database Administrator in The First Manned Space Station',2006,1,NULL,6,'0.99',104,'22.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(195,'CROWDS TELEMARK','A Intrepid Documentary of a Astronaut And a Forensic Psychologist who must Find a Frisbee in An Abandoned Fun House',2006,1,NULL,3,'4.99',112,'16.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(196,'CRUELTY UNFORGIVEN','A Brilliant Tale of a Car And a Moose who must Battle a Dentist in Nigeria',2006,1,NULL,7,'0.99',69,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(197,'CRUSADE HONEY','A Fast-Paced Reflection of a Explorer And a Butler who must Battle a Madman in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',112,'27.99','R','Commentaries','2006-02-15 05:03:42'),(198,'CRYSTAL BREAKING','A Fast-Paced Character Study of a Feminist And a Explorer who must Face a Pastry Chef in Ancient Japan',2006,1,NULL,6,'2.99',184,'22.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(199,'CUPBOARD SINNERS','A Emotional Reflection of a Frisbee And a Boat who must Reach a Pastry Chef in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',56,'29.99','R','Behind the Scenes','2006-02-15 05:03:42'),(200,'CURTAIN VIDEOTAPE','A Boring Reflection of a Dentist And a Mad Cow who must Chase a Secret Agent in A Shark Tank',2006,1,NULL,7,'0.99',133,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(201,'CYCLONE FAMILY','A Lacklusture Drama of a Student And a Monkey who must Sink a Womanizer in A MySQL Convention',2006,1,NULL,7,'2.99',176,'18.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(202,'DADDY PITTSBURGH','A Epic Story of a A Shark And a Student who must Confront a Explorer in The Gulf of Mexico',2006,1,NULL,5,'4.99',161,'26.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(203,'DAISY MENAGERIE','A Fast-Paced Saga of a Pastry Chef And a Monkey who must Sink a Composer in Ancient India',2006,1,NULL,5,'4.99',84,'9.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(204,'DALMATIONS SWEDEN','A Emotional Epistle of a Moose And a Hunter who must Overcome a Robot in A Manhattan Penthouse',2006,1,NULL,4,'0.99',106,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(205,'DANCES NONE','A Insightful Reflection of a A Shark And a Dog who must Kill a Butler in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',58,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(206,'DANCING FEVER','A Stunning Story of a Explorer And a Forensic Psychologist who must Face a Crocodile in A Shark Tank',2006,1,NULL,6,'0.99',144,'25.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(207,'DANGEROUS UPTOWN','A Unbelieveable Story of a Mad Scientist And a Woman who must Overcome a Dog in California',2006,1,NULL,7,'4.99',121,'26.99','PG','Commentaries','2006-02-15 05:03:42'),(208,'DARES PLUTO','A Fateful Story of a Robot And a Dentist who must Defeat a Astronaut in New Orleans',2006,1,NULL,7,'2.99',89,'16.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(209,'DARKNESS WAR','A Touching Documentary of a Husband And a Hunter who must Escape a Boy in The Sahara Desert',2006,1,NULL,6,'2.99',99,'24.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(210,'DARKO DORADO','A Stunning Reflection of a Frisbee And a Husband who must Redeem a Dog in New Orleans',2006,1,NULL,3,'4.99',130,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(211,'DARLING BREAKING','A Brilliant Documentary of a Astronaut And a Squirrel who must Succumb a Student in The Gulf of Mexico',2006,1,NULL,7,'4.99',165,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(212,'DARN FORRESTER','A Fateful Story of a A Shark And a Explorer who must Succumb a Technical Writer in A Jet Boat',2006,1,NULL,7,'4.99',185,'14.99','G','Deleted Scenes','2006-02-15 05:03:42'),(213,'DATE SPEED','A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention',2006,1,NULL,4,'0.99',104,'19.99','R','Commentaries','2006-02-15 05:03:42'),(214,'DAUGHTER MADIGAN','A Beautiful Tale of a Hunter And a Mad Scientist who must Confront a Squirrel in The First Manned Space Station',2006,1,NULL,3,'4.99',59,'13.99','PG-13','Trailers','2006-02-15 05:03:42'),(215,'DAWN POND','A Thoughtful Documentary of a Dentist And a Forensic Psychologist who must Defeat a Waitress in Berlin',2006,1,NULL,4,'4.99',57,'27.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(216,'DAY UNFAITHFUL','A Stunning Documentary of a Composer And a Mad Scientist who must Find a Technical Writer in A U-Boat',2006,1,NULL,3,'4.99',113,'16.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(217,'DAZED PUNK','A Action-Packed Story of a Pioneer And a Technical Writer who must Discover a Forensic Psychologist in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',120,'20.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(218,'DECEIVER BETRAYED','A Taut Story of a Moose And a Squirrel who must Build a Husband in Ancient India',2006,1,NULL,7,'0.99',122,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(219,'DEEP CRUSADE','A Amazing Tale of a Crocodile And a Squirrel who must Discover a Composer in Australia',2006,1,NULL,6,'4.99',51,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(220,'DEER VIRGINIAN','A Thoughtful Story of a Mad Cow And a Womanizer who must Overcome a Mad Scientist in Soviet Georgia',2006,1,NULL,7,'2.99',106,'13.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(221,'DELIVERANCE MULHOLLAND','A Astounding Saga of a Monkey And a Moose who must Conquer a Butler in A Shark Tank',2006,1,NULL,4,'0.99',100,'9.99','R','Deleted Scenes','2006-02-15 05:03:42'),(222,'DESERT POSEIDON','A Brilliant Documentary of a Butler And a Frisbee who must Build a Astronaut in New Orleans',2006,1,NULL,4,'4.99',64,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(223,'DESIRE ALIEN','A Fast-Paced Tale of a Dog And a Forensic Psychologist who must Meet a Astronaut in The First Manned Space Station',2006,1,NULL,7,'2.99',76,'24.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(224,'DESPERATE TRAINSPOTTING','A Epic Yarn of a Forensic Psychologist And a Teacher who must Face a Lumberjack in California',2006,1,NULL,7,'4.99',81,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(225,'DESTINATION JERK','A Beautiful Yarn of a Teacher And a Cat who must Build a Car in A U-Boat',2006,1,NULL,3,'0.99',76,'19.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(226,'DESTINY SATURDAY','A Touching Drama of a Crocodile And a Crocodile who must Conquer a Explorer in Soviet Georgia',2006,1,NULL,4,'4.99',56,'20.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(227,'DETAILS PACKER','A Epic Saga of a Waitress And a Composer who must Face a Boat in A U-Boat',2006,1,NULL,4,'4.99',88,'17.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(228,'DETECTIVE VISION','A Fanciful Documentary of a Pioneer And a Woman who must Redeem a Hunter in Ancient Japan',2006,1,NULL,4,'0.99',143,'16.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(229,'DEVIL DESIRE','A Beautiful Reflection of a Monkey And a Dentist who must Face a Database Administrator in Ancient Japan',2006,1,NULL,6,'4.99',87,'12.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(230,'DIARY PANIC','A Thoughtful Character Study of a Frisbee And a Mad Cow who must Outgun a Man in Ancient India',2006,1,NULL,7,'2.99',107,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(231,'DINOSAUR SECRETARY','A Action-Packed Drama of a Feminist And a Girl who must Reach a Robot in The Canadian Rockies',2006,1,NULL,7,'2.99',63,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(232,'DIRTY ACE','A Action-Packed Character Study of a Forensic Psychologist And a Girl who must Build a Dentist in The Outback',2006,1,NULL,7,'2.99',147,'29.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(233,'DISCIPLE MOTHER','A Touching Reflection of a Mad Scientist And a Boat who must Face a Moose in A Shark Tank',2006,1,NULL,3,'0.99',141,'17.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(234,'DISTURBING SCARFACE','A Lacklusture Display of a Crocodile And a Butler who must Overcome a Monkey in A U-Boat',2006,1,NULL,6,'2.99',94,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(235,'DIVIDE MONSTER','A Intrepid Saga of a Man And a Forensic Psychologist who must Reach a Squirrel in A Monastery',2006,1,NULL,6,'2.99',68,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(236,'DIVINE RESURRECTION','A Boring Character Study of a Man And a Womanizer who must Succumb a Teacher in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',100,'19.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(237,'DIVORCE SHINING','A Unbelieveable Saga of a Crocodile And a Student who must Discover a Cat in Ancient India',2006,1,NULL,3,'2.99',47,'21.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(238,'DOCTOR GRAIL','A Insightful Drama of a Womanizer And a Waitress who must Reach a Forensic Psychologist in The Outback',2006,1,NULL,4,'2.99',57,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(239,'DOGMA FAMILY','A Brilliant Character Study of a Database Administrator And a Monkey who must Succumb a Astronaut in New Orleans',2006,1,NULL,5,'4.99',122,'16.99','G','Commentaries','2006-02-15 05:03:42'),(240,'DOLLS RAGE','A Thrilling Display of a Pioneer And a Frisbee who must Escape a Teacher in The Outback',2006,1,NULL,7,'2.99',120,'10.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(241,'DONNIE ALLEY','A Awe-Inspiring Tale of a Butler And a Frisbee who must Vanquish a Teacher in Ancient Japan',2006,1,NULL,4,'0.99',125,'20.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(242,'DOOM DANCING','A Astounding Panorama of a Car And a Mad Scientist who must Battle a Lumberjack in A MySQL Convention',2006,1,NULL,4,'0.99',68,'13.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(243,'DOORS PRESIDENT','A Awe-Inspiring Display of a Squirrel And a Woman who must Overcome a Boy in The Gulf of Mexico',2006,1,NULL,3,'4.99',49,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(244,'DORADO NOTTING','A Action-Packed Tale of a Sumo Wrestler And a A Shark who must Meet a Frisbee in California',2006,1,NULL,5,'4.99',139,'26.99','NC-17','Commentaries','2006-02-15 05:03:42'),(245,'DOUBLE WRATH','A Thoughtful Yarn of a Womanizer And a Dog who must Challenge a Madman in The Gulf of Mexico',2006,1,NULL,4,'0.99',177,'28.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(246,'DOUBTFIRE LABYRINTH','A Intrepid Panorama of a Butler And a Composer who must Meet a Mad Cow in The Sahara Desert',2006,1,NULL,5,'4.99',154,'16.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(247,'DOWNHILL ENOUGH','A Emotional Tale of a Pastry Chef And a Forensic Psychologist who must Succumb a Monkey in The Sahara Desert',2006,1,NULL,3,'0.99',47,'19.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(248,'DOZEN LION','A Taut Drama of a Cat And a Girl who must Defeat a Frisbee in The Canadian Rockies',2006,1,NULL,6,'4.99',177,'20.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(249,'DRACULA CRYSTAL','A Thrilling Reflection of a Feminist And a Cat who must Find a Frisbee in An Abandoned Fun House',2006,1,NULL,7,'0.99',176,'26.99','G','Commentaries','2006-02-15 05:03:42'),(250,'DRAGON SQUAD','A Taut Reflection of a Boy And a Waitress who must Outgun a Teacher in Ancient China',2006,1,NULL,4,'0.99',170,'26.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(251,'DRAGONFLY STRANGERS','A Boring Documentary of a Pioneer And a Man who must Vanquish a Man in Nigeria',2006,1,NULL,6,'4.99',133,'19.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(252,'DREAM PICKUP','A Epic Display of a Car And a Composer who must Overcome a Forensic Psychologist in The Gulf of Mexico',2006,1,NULL,6,'2.99',135,'18.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(253,'DRIFTER COMMANDMENTS','A Epic Reflection of a Womanizer And a Squirrel who must Discover a Husband in A Jet Boat',2006,1,NULL,5,'4.99',61,'18.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(254,'DRIVER ANNIE','A Lacklusture Character Study of a Butler And a Car who must Redeem a Boat in An Abandoned Fun House',2006,1,NULL,4,'2.99',159,'11.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(255,'DRIVING POLISH','A Action-Packed Yarn of a Feminist And a Technical Writer who must Sink a Boat in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',175,'21.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(256,'DROP WATERFRONT','A Fanciful Documentary of a Husband And a Explorer who must Reach a Madman in Ancient China',2006,1,NULL,6,'4.99',178,'20.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(257,'DRUMLINE CYCLONE','A Insightful Panorama of a Monkey And a Sumo Wrestler who must Outrace a Mad Scientist in The Canadian Rockies',2006,1,NULL,3,'0.99',110,'14.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(258,'DRUMS DYNAMITE','A Epic Display of a Crocodile And a Crocodile who must Confront a Dog in An Abandoned Amusement Park',2006,1,NULL,6,'0.99',96,'11.99','PG','Trailers','2006-02-15 05:03:42'),(259,'DUCK RACER','A Lacklusture Yarn of a Teacher And a Squirrel who must Overcome a Dog in A Shark Tank',2006,1,NULL,4,'2.99',116,'15.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(260,'DUDE BLINDNESS','A Stunning Reflection of a Husband And a Lumberjack who must Face a Frisbee in An Abandoned Fun House',2006,1,NULL,3,'4.99',132,'9.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(261,'DUFFEL APOCALYPSE','A Emotional Display of a Boat And a Explorer who must Challenge a Madman in A MySQL Convention',2006,1,NULL,5,'0.99',171,'13.99','G','Commentaries','2006-02-15 05:03:42'),(262,'DUMBO LUST','A Touching Display of a Feminist And a Dentist who must Conquer a Husband in The Gulf of Mexico',2006,1,NULL,5,'0.99',119,'17.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(263,'DURHAM PANKY','A Brilliant Panorama of a Girl And a Boy who must Face a Mad Scientist in An Abandoned Mine Shaft',2006,1,NULL,6,'4.99',154,'14.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(264,'DWARFS ALTER','A Emotional Yarn of a Girl And a Dog who must Challenge a Composer in Ancient Japan',2006,1,NULL,6,'2.99',101,'13.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(265,'DYING MAKER','A Intrepid Tale of a Boat And a Monkey who must Kill a Cat in California',2006,1,NULL,5,'4.99',168,'28.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(266,'DYNAMITE TARZAN','A Intrepid Documentary of a Forensic Psychologist And a Mad Scientist who must Face a Explorer in A U-Boat',2006,1,NULL,4,'0.99',141,'27.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(267,'EAGLES PANKY','A Thoughtful Story of a Car And a Boy who must Find a A Shark in The Sahara Desert',2006,1,NULL,4,'4.99',140,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(268,'EARLY HOME','A Amazing Panorama of a Mad Scientist And a Husband who must Meet a Woman in The Outback',2006,1,NULL,6,'4.99',96,'27.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(269,'EARRING INSTINCT','A Stunning Character Study of a Dentist And a Mad Cow who must Find a Teacher in Nigeria',2006,1,NULL,3,'0.99',98,'22.99','R','Behind the Scenes','2006-02-15 05:03:42'),(270,'EARTH VISION','A Stunning Drama of a Butler And a Madman who must Outrace a Womanizer in Ancient India',2006,1,NULL,7,'0.99',85,'29.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(271,'EASY GLADIATOR','A Fateful Story of a Monkey And a Girl who must Overcome a Pastry Chef in Ancient India',2006,1,NULL,5,'4.99',148,'12.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(272,'EDGE KISSING','A Beautiful Yarn of a Composer And a Mad Cow who must Redeem a Mad Scientist in A Jet Boat',2006,1,NULL,5,'4.99',153,'9.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(273,'EFFECT GLADIATOR','A Beautiful Display of a Pastry Chef And a Pastry Chef who must Outgun a Forensic Psychologist in A Manhattan Penthouse',2006,1,NULL,6,'0.99',107,'14.99','PG','Commentaries','2006-02-15 05:03:42'),(274,'EGG IGBY','A Beautiful Documentary of a Boat And a Sumo Wrestler who must Succumb a Database Administrator in The First Manned Space Station',2006,1,NULL,4,'2.99',67,'20.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(275,'EGYPT TENENBAUMS','A Intrepid Story of a Madman And a Secret Agent who must Outrace a Astronaut in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',85,'11.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(276,'ELEMENT FREDDY','A Awe-Inspiring Reflection of a Waitress And a Squirrel who must Kill a Mad Cow in A Jet Boat',2006,1,NULL,6,'4.99',115,'28.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(277,'ELEPHANT TROJAN','A Beautiful Panorama of a Lumberjack And a Forensic Psychologist who must Overcome a Frisbee in A Baloon',2006,1,NULL,4,'4.99',126,'24.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(278,'ELF MURDER','A Action-Packed Story of a Frisbee And a Woman who must Reach a Girl in An Abandoned Mine Shaft',2006,1,NULL,4,'4.99',155,'19.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(279,'ELIZABETH SHANE','A Lacklusture Display of a Womanizer And a Dog who must Face a Sumo Wrestler in Ancient Japan',2006,1,NULL,7,'4.99',152,'11.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(280,'EMPIRE MALKOVICH','A Amazing Story of a Feminist And a Cat who must Face a Car in An Abandoned Fun House',2006,1,NULL,7,'0.99',177,'26.99','G','Deleted Scenes','2006-02-15 05:03:42'),(281,'ENCINO ELF','A Astounding Drama of a Feminist And a Teacher who must Confront a Husband in A Baloon',2006,1,NULL,6,'0.99',143,'9.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(282,'ENCOUNTERS CURTAIN','A Insightful Epistle of a Pastry Chef And a Womanizer who must Build a Boat in New Orleans',2006,1,NULL,5,'0.99',92,'20.99','NC-17','Trailers','2006-02-15 05:03:42'),(283,'ENDING CROWDS','A Unbelieveable Display of a Dentist And a Madman who must Vanquish a Squirrel in Berlin',2006,1,NULL,6,'0.99',85,'10.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(284,'ENEMY ODDS','A Fanciful Panorama of a Mad Scientist And a Woman who must Pursue a Astronaut in Ancient India',2006,1,NULL,5,'4.99',77,'23.99','NC-17','Trailers','2006-02-15 05:03:42'),(285,'ENGLISH BULWORTH','A Intrepid Epistle of a Pastry Chef And a Pastry Chef who must Pursue a Crocodile in Ancient China',2006,1,NULL,3,'0.99',51,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(286,'ENOUGH RAGING','A Astounding Character Study of a Boat And a Secret Agent who must Find a Mad Cow in The Sahara Desert',2006,1,NULL,7,'2.99',158,'16.99','NC-17','Commentaries','2006-02-15 05:03:42'),(287,'ENTRAPMENT SATISFACTION','A Thoughtful Panorama of a Hunter And a Teacher who must Reach a Mad Cow in A U-Boat',2006,1,NULL,5,'0.99',176,'19.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(288,'ESCAPE METROPOLIS','A Taut Yarn of a Astronaut And a Technical Writer who must Outgun a Boat in New Orleans',2006,1,NULL,7,'2.99',167,'20.99','R','Trailers','2006-02-15 05:03:42'),(289,'EVE RESURRECTION','A Awe-Inspiring Yarn of a Pastry Chef And a Database Administrator who must Challenge a Teacher in A Baloon',2006,1,NULL,5,'4.99',66,'25.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(290,'EVERYONE CRAFT','A Fateful Display of a Waitress And a Dentist who must Reach a Butler in Nigeria',2006,1,NULL,4,'0.99',163,'29.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(291,'EVOLUTION ALTER','A Fanciful Character Study of a Feminist And a Madman who must Find a Explorer in A Baloon Factory',2006,1,NULL,5,'0.99',174,'10.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(292,'EXCITEMENT EVE','A Brilliant Documentary of a Monkey And a Car who must Conquer a Crocodile in A Shark Tank',2006,1,NULL,3,'0.99',51,'20.99','G','Commentaries','2006-02-15 05:03:42'),(293,'EXORCIST STING','A Touching Drama of a Dog And a Sumo Wrestler who must Conquer a Mad Scientist in Berlin',2006,1,NULL,6,'2.99',167,'17.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(294,'EXPECATIONS NATURAL','A Amazing Drama of a Butler And a Husband who must Reach a A Shark in A U-Boat',2006,1,NULL,5,'4.99',138,'26.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(295,'EXPENDABLE STALLION','A Amazing Character Study of a Mad Cow And a Squirrel who must Discover a Hunter in A U-Boat',2006,1,NULL,3,'0.99',97,'14.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(296,'EXPRESS LONELY','A Boring Drama of a Astronaut And a Boat who must Face a Boat in California',2006,1,NULL,5,'2.99',178,'23.99','R','Trailers','2006-02-15 05:03:42'),(297,'EXTRAORDINARY CONQUERER','A Stunning Story of a Dog And a Feminist who must Face a Forensic Psychologist in Berlin',2006,1,NULL,6,'2.99',122,'29.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(298,'EYES DRIVING','A Thrilling Story of a Cat And a Waitress who must Fight a Explorer in The Outback',2006,1,NULL,4,'2.99',172,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(299,'FACTORY DRAGON','A Action-Packed Saga of a Teacher And a Frisbee who must Escape a Lumberjack in The Sahara Desert',2006,1,NULL,4,'0.99',144,'9.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(300,'FALCON VOLUME','A Fateful Saga of a Sumo Wrestler And a Hunter who must Redeem a A Shark in New Orleans',2006,1,NULL,5,'4.99',102,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(301,'FAMILY SWEET','A Epic Documentary of a Teacher And a Boy who must Escape a Woman in Berlin',2006,1,NULL,4,'0.99',155,'24.99','R','Trailers','2006-02-15 05:03:42'),(302,'FANTASIA PARK','A Thoughtful Documentary of a Mad Scientist And a A Shark who must Outrace a Feminist in Australia',2006,1,NULL,5,'2.99',131,'29.99','G','Commentaries','2006-02-15 05:03:42'),(303,'FANTASY TROOPERS','A Touching Saga of a Teacher And a Monkey who must Overcome a Secret Agent in A MySQL Convention',2006,1,NULL,6,'0.99',58,'27.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(304,'FARGO GANDHI','A Thrilling Reflection of a Pastry Chef And a Crocodile who must Reach a Teacher in The Outback',2006,1,NULL,3,'2.99',130,'28.99','G','Deleted Scenes','2006-02-15 05:03:42'),(305,'FATAL HAUNTED','A Beautiful Drama of a Student And a Secret Agent who must Confront a Dentist in Ancient Japan',2006,1,NULL,6,'2.99',91,'24.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(306,'FEATHERS METAL','A Thoughtful Yarn of a Monkey And a Teacher who must Find a Dog in Australia',2006,1,NULL,3,'0.99',104,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(307,'FELLOWSHIP AUTUMN','A Lacklusture Reflection of a Dentist And a Hunter who must Meet a Teacher in A Baloon',2006,1,NULL,6,'4.99',77,'9.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(308,'FERRIS MOTHER','A Touching Display of a Frisbee And a Frisbee who must Kill a Girl in The Gulf of Mexico',2006,1,NULL,3,'2.99',142,'13.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(309,'FEUD FROGMEN','A Brilliant Reflection of a Database Administrator And a Mad Cow who must Chase a Woman in The Canadian Rockies',2006,1,NULL,6,'0.99',98,'29.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(310,'FEVER EMPIRE','A Insightful Panorama of a Cat And a Boat who must Defeat a Boat in The Gulf of Mexico',2006,1,NULL,5,'4.99',158,'20.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(311,'FICTION CHRISTMAS','A Emotional Yarn of a A Shark And a Student who must Battle a Robot in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',72,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(312,'FIDDLER LOST','A Boring Tale of a Squirrel And a Dog who must Challenge a Madman in The Gulf of Mexico',2006,1,NULL,4,'4.99',75,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(313,'FIDELITY DEVIL','A Awe-Inspiring Drama of a Technical Writer And a Composer who must Reach a Pastry Chef in A U-Boat',2006,1,NULL,5,'4.99',118,'11.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(314,'FIGHT JAWBREAKER','A Intrepid Panorama of a Womanizer And a Girl who must Escape a Girl in A Manhattan Penthouse',2006,1,NULL,3,'0.99',91,'13.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(315,'FINDING ANACONDA','A Fateful Tale of a Database Administrator And a Girl who must Battle a Squirrel in New Orleans',2006,1,NULL,4,'0.99',156,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(316,'FIRE WOLVES','A Intrepid Documentary of a Frisbee And a Dog who must Outrace a Lumberjack in Nigeria',2006,1,NULL,5,'4.99',173,'18.99','R','Trailers','2006-02-15 05:03:42'),(317,'FIREBALL PHILADELPHIA','A Amazing Yarn of a Dentist And a A Shark who must Vanquish a Madman in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',148,'25.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(318,'FIREHOUSE VIETNAM','A Awe-Inspiring Character Study of a Boat And a Boy who must Kill a Pastry Chef in The Sahara Desert',2006,1,NULL,7,'0.99',103,'14.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(319,'FISH OPUS','A Touching Display of a Feminist And a Girl who must Confront a Astronaut in Australia',2006,1,NULL,4,'2.99',125,'22.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(320,'FLAMINGOS CONNECTICUT','A Fast-Paced Reflection of a Composer And a Composer who must Meet a Cat in The Sahara Desert',2006,1,NULL,4,'4.99',80,'28.99','PG-13','Trailers','2006-02-15 05:03:42'),(321,'FLASH WARS','A Astounding Saga of a Moose And a Pastry Chef who must Chase a Student in The Gulf of Mexico',2006,1,NULL,3,'4.99',123,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(322,'FLATLINERS KILLER','A Taut Display of a Secret Agent And a Waitress who must Sink a Robot in An Abandoned Mine Shaft',2006,1,NULL,5,'2.99',100,'29.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(323,'FLIGHT LIES','A Stunning Character Study of a Crocodile And a Pioneer who must Pursue a Teacher in New Orleans',2006,1,NULL,7,'4.99',179,'22.99','R','Trailers','2006-02-15 05:03:42'),(324,'FLINTSTONES HAPPINESS','A Fateful Story of a Husband And a Moose who must Vanquish a Boy in California',2006,1,NULL,3,'4.99',148,'11.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(325,'FLOATS GARDEN','A Action-Packed Epistle of a Robot And a Car who must Chase a Boat in Ancient Japan',2006,1,NULL,6,'2.99',145,'29.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(326,'FLYING HOOK','A Thrilling Display of a Mad Cow And a Dog who must Challenge a Frisbee in Nigeria',2006,1,NULL,6,'2.99',69,'18.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(327,'FOOL MOCKINGBIRD','A Lacklusture Tale of a Crocodile And a Composer who must Defeat a Madman in A U-Boat',2006,1,NULL,3,'4.99',158,'24.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(328,'FOREVER CANDIDATE','A Unbelieveable Panorama of a Technical Writer And a Man who must Pursue a Frisbee in A U-Boat',2006,1,NULL,7,'2.99',131,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(329,'FORREST SONS','A Thrilling Documentary of a Forensic Psychologist And a Butler who must Defeat a Explorer in A Jet Boat',2006,1,NULL,4,'2.99',63,'15.99','R','Commentaries','2006-02-15 05:03:42'),(330,'FORRESTER COMANCHEROS','A Fateful Tale of a Squirrel And a Forensic Psychologist who must Redeem a Man in Nigeria',2006,1,NULL,7,'4.99',112,'22.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(331,'FORWARD TEMPLE','A Astounding Display of a Forensic Psychologist And a Mad Scientist who must Challenge a Girl in New Orleans',2006,1,NULL,6,'2.99',90,'25.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(332,'FRANKENSTEIN STRANGER','A Insightful Character Study of a Feminist And a Pioneer who must Pursue a Pastry Chef in Nigeria',2006,1,NULL,7,'0.99',159,'16.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(333,'FREAKY POCUS','A Fast-Paced Documentary of a Pastry Chef And a Crocodile who must Chase a Squirrel in The Gulf of Mexico',2006,1,NULL,7,'2.99',126,'16.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(334,'FREDDY STORM','A Intrepid Saga of a Man And a Lumberjack who must Vanquish a Husband in The Outback',2006,1,NULL,6,'4.99',65,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(335,'FREEDOM CLEOPATRA','A Emotional Reflection of a Dentist And a Mad Cow who must Face a Squirrel in A Baloon',2006,1,NULL,5,'0.99',133,'23.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(336,'FRENCH HOLIDAY','A Thrilling Epistle of a Dog And a Feminist who must Kill a Madman in Berlin',2006,1,NULL,5,'4.99',99,'22.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(337,'FRIDA SLIPPER','A Fateful Story of a Lumberjack And a Car who must Escape a Boat in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',73,'11.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(338,'FRISCO FORREST','A Beautiful Documentary of a Woman And a Pioneer who must Pursue a Mad Scientist in A Shark Tank',2006,1,NULL,6,'4.99',51,'23.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(339,'FROGMEN BREAKING','A Unbelieveable Yarn of a Mad Scientist And a Cat who must Chase a Lumberjack in Australia',2006,1,NULL,5,'0.99',111,'17.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(340,'FRONTIER CABIN','A Emotional Story of a Madman And a Waitress who must Battle a Teacher in An Abandoned Fun House',2006,1,NULL,6,'4.99',183,'14.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(341,'FROST HEAD','A Amazing Reflection of a Lumberjack And a Cat who must Discover a Husband in A MySQL Convention',2006,1,NULL,5,'0.99',82,'13.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(342,'FUGITIVE MAGUIRE','A Taut Epistle of a Feminist And a Sumo Wrestler who must Battle a Crocodile in Australia',2006,1,NULL,7,'4.99',83,'28.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(343,'FULL FLATLINERS','A Beautiful Documentary of a Astronaut And a Moose who must Pursue a Monkey in A Shark Tank',2006,1,NULL,6,'2.99',94,'14.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(344,'FURY MURDER','A Lacklusture Reflection of a Boat And a Forensic Psychologist who must Fight a Waitress in A Monastery',2006,1,NULL,3,'0.99',178,'28.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(345,'GABLES METROPOLIS','A Fateful Display of a Cat And a Pioneer who must Challenge a Pastry Chef in A Baloon Factory',2006,1,NULL,3,'0.99',161,'17.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(346,'GALAXY SWEETHEARTS','A Emotional Reflection of a Womanizer And a Pioneer who must Face a Squirrel in Berlin',2006,1,NULL,4,'4.99',128,'13.99','R','Deleted Scenes','2006-02-15 05:03:42'),(347,'GAMES BOWFINGER','A Astounding Documentary of a Butler And a Explorer who must Challenge a Butler in A Monastery',2006,1,NULL,7,'4.99',119,'17.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(348,'GANDHI KWAI','A Thoughtful Display of a Mad Scientist And a Secret Agent who must Chase a Boat in Berlin',2006,1,NULL,7,'0.99',86,'9.99','PG-13','Trailers','2006-02-15 05:03:42'),(349,'GANGS PRIDE','A Taut Character Study of a Woman And a A Shark who must Confront a Frisbee in Berlin',2006,1,NULL,4,'2.99',185,'27.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(350,'GARDEN ISLAND','A Unbelieveable Character Study of a Womanizer And a Madman who must Reach a Man in The Outback',2006,1,NULL,3,'4.99',80,'21.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(351,'GASLIGHT CRUSADE','A Amazing Epistle of a Boy And a Astronaut who must Redeem a Man in The Gulf of Mexico',2006,1,NULL,4,'2.99',106,'10.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(352,'GATHERING CALENDAR','A Intrepid Tale of a Pioneer And a Moose who must Conquer a Frisbee in A MySQL Convention',2006,1,NULL,4,'0.99',176,'22.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(353,'GENTLEMEN STAGE','A Awe-Inspiring Reflection of a Monkey And a Student who must Overcome a Dentist in The First Manned Space Station',2006,1,NULL,6,'2.99',125,'22.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(354,'GHOST GROUNDHOG','A Brilliant Panorama of a Madman And a Composer who must Succumb a Car in Ancient India',2006,1,NULL,6,'4.99',85,'18.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(355,'GHOSTBUSTERS ELF','A Thoughtful Epistle of a Dog And a Feminist who must Chase a Composer in Berlin',2006,1,NULL,7,'0.99',101,'18.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(356,'GIANT TROOPERS','A Fateful Display of a Feminist And a Monkey who must Vanquish a Monkey in The Canadian Rockies',2006,1,NULL,5,'2.99',102,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(357,'GILBERT PELICAN','A Fateful Tale of a Man And a Feminist who must Conquer a Crocodile in A Manhattan Penthouse',2006,1,NULL,7,'0.99',114,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(358,'GILMORE BOILED','A Unbelieveable Documentary of a Boat And a Husband who must Succumb a Student in A U-Boat',2006,1,NULL,5,'0.99',163,'29.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(359,'GLADIATOR WESTWARD','A Astounding Reflection of a Squirrel And a Sumo Wrestler who must Sink a Dentist in Ancient Japan',2006,1,NULL,6,'4.99',173,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(360,'GLASS DYING','A Astounding Drama of a Frisbee And a Astronaut who must Fight a Dog in Ancient Japan',2006,1,NULL,4,'0.99',103,'24.99','G','Trailers','2006-02-15 05:03:42'),(361,'GLEAMING JAWBREAKER','A Amazing Display of a Composer And a Forensic Psychologist who must Discover a Car in The Canadian Rockies',2006,1,NULL,5,'2.99',89,'25.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(362,'GLORY TRACY','A Amazing Saga of a Woman And a Womanizer who must Discover a Cat in The First Manned Space Station',2006,1,NULL,7,'2.99',115,'13.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(363,'GO PURPLE','A Fast-Paced Display of a Car And a Database Administrator who must Battle a Woman in A Baloon',2006,1,NULL,3,'0.99',54,'12.99','R','Trailers','2006-02-15 05:03:42'),(364,'GODFATHER DIARY','A Stunning Saga of a Lumberjack And a Squirrel who must Chase a Car in The Outback',2006,1,NULL,3,'2.99',73,'14.99','NC-17','Trailers','2006-02-15 05:03:42'),(365,'GOLD RIVER','A Taut Documentary of a Database Administrator And a Waitress who must Reach a Mad Scientist in A Baloon Factory',2006,1,NULL,4,'4.99',154,'21.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(366,'GOLDFINGER SENSIBILITY','A Insightful Drama of a Mad Scientist And a Hunter who must Defeat a Pastry Chef in New Orleans',2006,1,NULL,3,'0.99',93,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(367,'GOLDMINE TYCOON','A Brilliant Epistle of a Composer And a Frisbee who must Conquer a Husband in The Outback',2006,1,NULL,6,'0.99',153,'20.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(368,'GONE TROUBLE','A Insightful Character Study of a Mad Cow And a Forensic Psychologist who must Conquer a A Shark in A Manhattan Penthouse',2006,1,NULL,7,'2.99',84,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(369,'GOODFELLAS SALUTE','A Unbelieveable Tale of a Dog And a Explorer who must Sink a Mad Cow in A Baloon Factory',2006,1,NULL,4,'4.99',56,'22.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(370,'GORGEOUS BINGO','A Action-Packed Display of a Sumo Wrestler And a Car who must Overcome a Waitress in A Baloon Factory',2006,1,NULL,4,'2.99',108,'26.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(371,'GOSFORD DONNIE','A Epic Panorama of a Mad Scientist And a Monkey who must Redeem a Secret Agent in Berlin',2006,1,NULL,5,'4.99',129,'17.99','G','Commentaries','2006-02-15 05:03:42'),(372,'GRACELAND DYNAMITE','A Taut Display of a Cat And a Girl who must Overcome a Database Administrator in New Orleans',2006,1,NULL,5,'4.99',140,'26.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(373,'GRADUATE LORD','A Lacklusture Epistle of a Girl And a A Shark who must Meet a Mad Scientist in Ancient China',2006,1,NULL,7,'2.99',156,'14.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(374,'GRAFFITI LOVE','A Unbelieveable Epistle of a Sumo Wrestler And a Hunter who must Build a Composer in Berlin',2006,1,NULL,3,'0.99',117,'29.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(375,'GRAIL FRANKENSTEIN','A Unbelieveable Saga of a Teacher And a Monkey who must Fight a Girl in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',85,'17.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(376,'GRAPES FURY','A Boring Yarn of a Mad Cow And a Sumo Wrestler who must Meet a Robot in Australia',2006,1,NULL,4,'0.99',155,'20.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(377,'GREASE YOUTH','A Emotional Panorama of a Secret Agent And a Waitress who must Escape a Composer in Soviet Georgia',2006,1,NULL,7,'0.99',135,'20.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(378,'GREATEST NORTH','A Astounding Character Study of a Secret Agent And a Robot who must Build a A Shark in Berlin',2006,1,NULL,5,'2.99',93,'24.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(379,'GREEDY ROOTS','A Amazing Reflection of a A Shark And a Butler who must Chase a Hunter in The Canadian Rockies',2006,1,NULL,7,'0.99',166,'14.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(380,'GREEK EVERYONE','A Stunning Display of a Butler And a Teacher who must Confront a A Shark in The First Manned Space Station',2006,1,NULL,7,'2.99',176,'11.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(381,'GRINCH MASSAGE','A Intrepid Display of a Madman And a Feminist who must Pursue a Pioneer in The First Manned Space Station',2006,1,NULL,7,'4.99',150,'25.99','R','Trailers','2006-02-15 05:03:42'),(382,'GRIT CLOCKWORK','A Thoughtful Display of a Dentist And a Squirrel who must Confront a Lumberjack in A Shark Tank',2006,1,NULL,3,'0.99',137,'21.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(383,'GROOVE FICTION','A Unbelieveable Reflection of a Moose And a A Shark who must Defeat a Lumberjack in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',111,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(384,'GROSSE WONDERFUL','A Epic Drama of a Cat And a Explorer who must Redeem a Moose in Australia',2006,1,NULL,5,'4.99',49,'19.99','R','Behind the Scenes','2006-02-15 05:03:42'),(385,'GROUNDHOG UNCUT','A Brilliant Panorama of a Astronaut And a Technical Writer who must Discover a Butler in A Manhattan Penthouse',2006,1,NULL,6,'4.99',139,'26.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(386,'GUMP DATE','A Intrepid Yarn of a Explorer And a Student who must Kill a Husband in An Abandoned Mine Shaft',2006,1,NULL,3,'4.99',53,'12.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(387,'GUN BONNIE','A Boring Display of a Sumo Wrestler And a Husband who must Build a Waitress in The Gulf of Mexico',2006,1,NULL,7,'0.99',100,'27.99','G','Behind the Scenes','2006-02-15 05:03:42'),(388,'GUNFIGHT MOON','A Epic Reflection of a Pastry Chef And a Explorer who must Reach a Dentist in The Sahara Desert',2006,1,NULL,5,'0.99',70,'16.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(389,'GUNFIGHTER MUSSOLINI','A Touching Saga of a Robot And a Boy who must Kill a Man in Ancient Japan',2006,1,NULL,3,'2.99',127,'9.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(390,'GUYS FALCON','A Boring Story of a Woman And a Feminist who must Redeem a Squirrel in A U-Boat',2006,1,NULL,4,'4.99',84,'20.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(391,'HALF OUTFIELD','A Epic Epistle of a Database Administrator And a Crocodile who must Face a Madman in A Jet Boat',2006,1,NULL,6,'2.99',146,'25.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(392,'HALL CASSIDY','A Beautiful Panorama of a Pastry Chef And a A Shark who must Battle a Pioneer in Soviet Georgia',2006,1,NULL,5,'4.99',51,'13.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(393,'HALLOWEEN NUTS','A Amazing Panorama of a Forensic Psychologist And a Technical Writer who must Fight a Dentist in A U-Boat',2006,1,NULL,6,'2.99',47,'19.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(394,'HAMLET WISDOM','A Touching Reflection of a Man And a Man who must Sink a Robot in The Outback',2006,1,NULL,7,'2.99',146,'21.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(395,'HANDICAP BOONDOCK','A Beautiful Display of a Pioneer And a Squirrel who must Vanquish a Sumo Wrestler in Soviet Georgia',2006,1,NULL,4,'0.99',108,'28.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(396,'HANGING DEEP','A Action-Packed Yarn of a Boat And a Crocodile who must Build a Monkey in Berlin',2006,1,NULL,5,'4.99',62,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(397,'HANKY OCTOBER','A Boring Epistle of a Database Administrator And a Explorer who must Pursue a Madman in Soviet Georgia',2006,1,NULL,5,'2.99',107,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(398,'HANOVER GALAXY','A Stunning Reflection of a Girl And a Secret Agent who must Succumb a Boy in A MySQL Convention',2006,1,NULL,5,'4.99',47,'21.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(399,'HAPPINESS UNITED','A Action-Packed Panorama of a Husband And a Feminist who must Meet a Forensic Psychologist in Ancient Japan',2006,1,NULL,6,'2.99',100,'23.99','G','Deleted Scenes','2006-02-15 05:03:42'),(400,'HARDLY ROBBERS','A Emotional Character Study of a Hunter And a Car who must Kill a Woman in Berlin',2006,1,NULL,7,'2.99',72,'15.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(401,'HAROLD FRENCH','A Stunning Saga of a Sumo Wrestler And a Student who must Outrace a Moose in The Sahara Desert',2006,1,NULL,6,'0.99',168,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(402,'HARPER DYING','A Awe-Inspiring Reflection of a Woman And a Cat who must Confront a Feminist in The Sahara Desert',2006,1,NULL,3,'0.99',52,'15.99','G','Trailers','2006-02-15 05:03:42'),(403,'HARRY IDAHO','A Taut Yarn of a Technical Writer And a Feminist who must Outrace a Dog in California',2006,1,NULL,5,'4.99',121,'18.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(404,'HATE HANDICAP','A Intrepid Reflection of a Mad Scientist And a Pioneer who must Overcome a Hunter in The First Manned Space Station',2006,1,NULL,4,'0.99',107,'26.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(405,'HAUNTED ANTITRUST','A Amazing Saga of a Man And a Dentist who must Reach a Technical Writer in Ancient India',2006,1,NULL,6,'4.99',76,'13.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(406,'HAUNTING PIANIST','A Fast-Paced Story of a Database Administrator And a Composer who must Defeat a Squirrel in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',181,'22.99','R','Behind the Scenes','2006-02-15 05:03:42'),(407,'HAWK CHILL','A Action-Packed Drama of a Mad Scientist And a Composer who must Outgun a Car in Australia',2006,1,NULL,5,'0.99',47,'12.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(408,'HEAD STRANGER','A Thoughtful Saga of a Hunter And a Crocodile who must Confront a Dog in The Gulf of Mexico',2006,1,NULL,4,'4.99',69,'28.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(409,'HEARTBREAKERS BRIGHT','A Awe-Inspiring Documentary of a A Shark And a Dentist who must Outrace a Pastry Chef in The Canadian Rockies',2006,1,NULL,3,'4.99',59,'9.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(410,'HEAVEN FREEDOM','A Intrepid Story of a Butler And a Car who must Vanquish a Man in New Orleans',2006,1,NULL,7,'2.99',48,'19.99','PG','Commentaries','2006-02-15 05:03:42'),(411,'HEAVENLY GUN','A Beautiful Yarn of a Forensic Psychologist And a Frisbee who must Battle a Moose in A Jet Boat',2006,1,NULL,5,'4.99',49,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(412,'HEAVYWEIGHTS BEAST','A Unbelieveable Story of a Composer And a Dog who must Overcome a Womanizer in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',102,'25.99','G','Deleted Scenes','2006-02-15 05:03:42'),(413,'HEDWIG ALTER','A Action-Packed Yarn of a Womanizer And a Lumberjack who must Chase a Sumo Wrestler in A Monastery',2006,1,NULL,7,'2.99',169,'16.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(414,'HELLFIGHTERS SIERRA','A Taut Reflection of a A Shark And a Dentist who must Battle a Boat in Soviet Georgia',2006,1,NULL,3,'2.99',75,'23.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(415,'HIGH ENCINO','A Fateful Saga of a Waitress And a Hunter who must Outrace a Sumo Wrestler in Australia',2006,1,NULL,3,'2.99',84,'23.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(416,'HIGHBALL POTTER','A Action-Packed Saga of a Husband And a Dog who must Redeem a Database Administrator in The Sahara Desert',2006,1,NULL,6,'0.99',110,'10.99','R','Deleted Scenes','2006-02-15 05:03:42'),(417,'HILLS NEIGHBORS','A Epic Display of a Hunter And a Feminist who must Sink a Car in A U-Boat',2006,1,NULL,5,'0.99',93,'29.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(418,'HOBBIT ALIEN','A Emotional Drama of a Husband And a Girl who must Outgun a Composer in The First Manned Space Station',2006,1,NULL,5,'0.99',157,'27.99','PG-13','Commentaries','2006-02-15 05:03:42'),(419,'HOCUS FRIDA','A Awe-Inspiring Tale of a Girl And a Madman who must Outgun a Student in A Shark Tank',2006,1,NULL,4,'2.99',141,'19.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(420,'HOLES BRANNIGAN','A Fast-Paced Reflection of a Technical Writer And a Student who must Fight a Boy in The Canadian Rockies',2006,1,NULL,7,'4.99',128,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(421,'HOLIDAY GAMES','A Insightful Reflection of a Waitress And a Madman who must Pursue a Boy in Ancient Japan',2006,1,NULL,7,'4.99',78,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(422,'HOLLOW JEOPARDY','A Beautiful Character Study of a Robot And a Astronaut who must Overcome a Boat in A Monastery',2006,1,NULL,7,'4.99',136,'25.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(423,'HOLLYWOOD ANONYMOUS','A Fast-Paced Epistle of a Boy And a Explorer who must Escape a Dog in A U-Boat',2006,1,NULL,7,'0.99',69,'29.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(424,'HOLOCAUST HIGHBALL','A Awe-Inspiring Yarn of a Composer And a Man who must Find a Robot in Soviet Georgia',2006,1,NULL,6,'0.99',149,'12.99','R','Deleted Scenes','2006-02-15 05:03:42'),(425,'HOLY TADPOLE','A Action-Packed Display of a Feminist And a Pioneer who must Pursue a Dog in A Baloon Factory',2006,1,NULL,6,'0.99',88,'20.99','R','Behind the Scenes','2006-02-15 05:03:42'),(426,'HOME PITY','A Touching Panorama of a Man And a Secret Agent who must Challenge a Teacher in A MySQL Convention',2006,1,NULL,7,'4.99',185,'15.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(427,'HOMEWARD CIDER','A Taut Reflection of a Astronaut And a Squirrel who must Fight a Squirrel in A Manhattan Penthouse',2006,1,NULL,5,'0.99',103,'19.99','R','Trailers','2006-02-15 05:03:42'),(428,'HOMICIDE PEACH','A Astounding Documentary of a Hunter And a Boy who must Confront a Boy in A MySQL Convention',2006,1,NULL,6,'2.99',141,'21.99','PG-13','Commentaries','2006-02-15 05:03:42'),(429,'HONEY TIES','A Taut Story of a Waitress And a Crocodile who must Outrace a Lumberjack in A Shark Tank',2006,1,NULL,3,'0.99',84,'29.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(430,'HOOK CHARIOTS','A Insightful Story of a Boy And a Dog who must Redeem a Boy in Australia',2006,1,NULL,7,'0.99',49,'23.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(431,'HOOSIERS BIRDCAGE','A Astounding Display of a Explorer And a Boat who must Vanquish a Car in The First Manned Space Station',2006,1,NULL,3,'2.99',176,'12.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(432,'HOPE TOOTSIE','A Amazing Documentary of a Student And a Sumo Wrestler who must Outgun a A Shark in A Shark Tank',2006,1,NULL,4,'2.99',139,'22.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(433,'HORN WORKING','A Stunning Display of a Mad Scientist And a Technical Writer who must Succumb a Monkey in A Shark Tank',2006,1,NULL,4,'2.99',95,'23.99','PG','Trailers','2006-02-15 05:03:42'),(434,'HORROR REIGN','A Touching Documentary of a A Shark And a Car who must Build a Husband in Nigeria',2006,1,NULL,3,'0.99',139,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(435,'HOTEL HAPPINESS','A Thrilling Yarn of a Pastry Chef And a A Shark who must Challenge a Mad Scientist in The Outback',2006,1,NULL,6,'4.99',181,'28.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(436,'HOURS RAGE','A Fateful Story of a Explorer And a Feminist who must Meet a Technical Writer in Soviet Georgia',2006,1,NULL,4,'0.99',122,'14.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(437,'HOUSE DYNAMITE','A Taut Story of a Pioneer And a Squirrel who must Battle a Student in Soviet Georgia',2006,1,NULL,7,'2.99',109,'13.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(438,'HUMAN GRAFFITI','A Beautiful Reflection of a Womanizer And a Sumo Wrestler who must Chase a Database Administrator in The Gulf of Mexico',2006,1,NULL,3,'2.99',68,'22.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(439,'HUNCHBACK IMPOSSIBLE','A Touching Yarn of a Frisbee And a Dentist who must Fight a Composer in Ancient Japan',2006,1,NULL,4,'4.99',151,'28.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(440,'HUNGER ROOF','A Unbelieveable Yarn of a Student And a Database Administrator who must Outgun a Husband in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',105,'21.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(441,'HUNTER ALTER','A Emotional Drama of a Mad Cow And a Boat who must Redeem a Secret Agent in A Shark Tank',2006,1,NULL,5,'2.99',125,'21.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(442,'HUNTING MUSKETEERS','A Thrilling Reflection of a Pioneer And a Dentist who must Outrace a Womanizer in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',65,'24.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(443,'HURRICANE AFFAIR','A Lacklusture Epistle of a Database Administrator And a Woman who must Meet a Hunter in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',49,'11.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(444,'HUSTLER PARTY','A Emotional Reflection of a Sumo Wrestler And a Monkey who must Conquer a Robot in The Sahara Desert',2006,1,NULL,3,'4.99',83,'22.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(445,'HYDE DOCTOR','A Fanciful Documentary of a Boy And a Woman who must Redeem a Womanizer in A Jet Boat',2006,1,NULL,5,'2.99',100,'11.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(446,'HYSTERICAL GRAIL','A Amazing Saga of a Madman And a Dentist who must Build a Car in A Manhattan Penthouse',2006,1,NULL,5,'4.99',150,'19.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(447,'ICE CROSSING','A Fast-Paced Tale of a Butler And a Moose who must Overcome a Pioneer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',131,'28.99','R','Deleted Scenes','2006-02-15 05:03:42'),(448,'IDAHO LOVE','A Fast-Paced Drama of a Student And a Crocodile who must Meet a Database Administrator in The Outback',2006,1,NULL,3,'2.99',172,'25.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(449,'IDENTITY LOVER','A Boring Tale of a Composer And a Mad Cow who must Defeat a Car in The Outback',2006,1,NULL,4,'2.99',119,'12.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(450,'IDOLS SNATCHERS','A Insightful Drama of a Car And a Composer who must Fight a Man in A Monastery',2006,1,NULL,5,'2.99',84,'29.99','NC-17','Trailers','2006-02-15 05:03:42'),(451,'IGBY MAKER','A Epic Documentary of a Hunter And a Dog who must Outgun a Dog in A Baloon Factory',2006,1,NULL,7,'4.99',160,'12.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(452,'ILLUSION AMELIE','A Emotional Epistle of a Boat And a Mad Scientist who must Outrace a Robot in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',122,'15.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(453,'IMAGE PRINCESS','A Lacklusture Panorama of a Secret Agent And a Crocodile who must Discover a Madman in The Canadian Rockies',2006,1,NULL,3,'2.99',178,'17.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(454,'IMPACT ALADDIN','A Epic Character Study of a Frisbee And a Moose who must Outgun a Technical Writer in A Shark Tank',2006,1,NULL,6,'0.99',180,'20.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(455,'IMPOSSIBLE PREJUDICE','A Awe-Inspiring Yarn of a Monkey And a Hunter who must Chase a Teacher in Ancient China',2006,1,NULL,7,'4.99',103,'11.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(456,'INCH JET','A Fateful Saga of a Womanizer And a Student who must Defeat a Butler in A Monastery',2006,1,NULL,6,'4.99',167,'18.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(457,'INDEPENDENCE HOTEL','A Thrilling Tale of a Technical Writer And a Boy who must Face a Pioneer in A Monastery',2006,1,NULL,5,'0.99',157,'21.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(458,'INDIAN LOVE','A Insightful Saga of a Mad Scientist And a Mad Scientist who must Kill a Astronaut in An Abandoned Fun House',2006,1,NULL,4,'0.99',135,'26.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(459,'INFORMER DOUBLE','A Action-Packed Display of a Woman And a Dentist who must Redeem a Forensic Psychologist in The Canadian Rockies',2006,1,NULL,4,'4.99',74,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(460,'INNOCENT USUAL','A Beautiful Drama of a Pioneer And a Crocodile who must Challenge a Student in The Outback',2006,1,NULL,3,'4.99',178,'26.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(461,'INSECTS STONE','A Epic Display of a Butler And a Dog who must Vanquish a Crocodile in A Manhattan Penthouse',2006,1,NULL,3,'0.99',123,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(462,'INSIDER ARIZONA','A Astounding Saga of a Mad Scientist And a Hunter who must Pursue a Robot in A Baloon Factory',2006,1,NULL,5,'2.99',78,'17.99','NC-17','Commentaries','2006-02-15 05:03:42'),(463,'INSTINCT AIRPORT','A Touching Documentary of a Mad Cow And a Explorer who must Confront a Butler in A Manhattan Penthouse',2006,1,NULL,4,'2.99',116,'21.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(464,'INTENTIONS EMPIRE','A Astounding Epistle of a Cat And a Cat who must Conquer a Mad Cow in A U-Boat',2006,1,NULL,3,'2.99',107,'13.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(465,'INTERVIEW LIAISONS','A Action-Packed Reflection of a Student And a Butler who must Discover a Database Administrator in A Manhattan Penthouse',2006,1,NULL,4,'4.99',59,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(466,'INTOLERABLE INTENTIONS','A Awe-Inspiring Story of a Monkey And a Pastry Chef who must Succumb a Womanizer in A MySQL Convention',2006,1,NULL,6,'4.99',63,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(467,'INTRIGUE WORST','A Fanciful Character Study of a Explorer And a Mad Scientist who must Vanquish a Squirrel in A Jet Boat',2006,1,NULL,6,'0.99',181,'10.99','G','Deleted Scenes','2006-02-15 05:03:42'),(468,'INVASION CYCLONE','A Lacklusture Character Study of a Mad Scientist And a Womanizer who must Outrace a Explorer in A Monastery',2006,1,NULL,5,'2.99',97,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(469,'IRON MOON','A Fast-Paced Documentary of a Mad Cow And a Boy who must Pursue a Dentist in A Baloon',2006,1,NULL,7,'4.99',46,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(470,'ISHTAR ROCKETEER','A Astounding Saga of a Dog And a Squirrel who must Conquer a Dog in An Abandoned Fun House',2006,1,NULL,4,'4.99',79,'24.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(471,'ISLAND EXORCIST','A Fanciful Panorama of a Technical Writer And a Boy who must Find a Dentist in An Abandoned Fun House',2006,1,NULL,7,'2.99',84,'23.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(472,'ITALIAN AFRICAN','A Astounding Character Study of a Monkey And a Moose who must Outgun a Cat in A U-Boat',2006,1,NULL,3,'4.99',174,'24.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(473,'JACKET FRISCO','A Insightful Reflection of a Womanizer And a Husband who must Conquer a Pastry Chef in A Baloon',2006,1,NULL,5,'2.99',181,'16.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(474,'JADE BUNCH','A Insightful Panorama of a Squirrel And a Mad Cow who must Confront a Student in The First Manned Space Station',2006,1,NULL,6,'2.99',174,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(475,'JAPANESE RUN','A Awe-Inspiring Epistle of a Feminist And a Girl who must Sink a Girl in The Outback',2006,1,NULL,6,'0.99',135,'29.99','G','Deleted Scenes','2006-02-15 05:03:42'),(476,'JASON TRAP','A Thoughtful Tale of a Woman And a A Shark who must Conquer a Dog in A Monastery',2006,1,NULL,5,'2.99',130,'9.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(477,'JAWBREAKER BROOKLYN','A Stunning Reflection of a Boat And a Pastry Chef who must Succumb a A Shark in A Jet Boat',2006,1,NULL,5,'0.99',118,'15.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(478,'JAWS HARRY','A Thrilling Display of a Database Administrator And a Monkey who must Overcome a Dog in An Abandoned Fun House',2006,1,NULL,4,'2.99',112,'10.99','G','Deleted Scenes','2006-02-15 05:03:42'),(479,'JEDI BENEATH','A Astounding Reflection of a Explorer And a Dentist who must Pursue a Student in Nigeria',2006,1,NULL,7,'0.99',128,'12.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(480,'JEEPERS WEDDING','A Astounding Display of a Composer And a Dog who must Kill a Pastry Chef in Soviet Georgia',2006,1,NULL,3,'2.99',84,'29.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(481,'JEKYLL FROGMEN','A Fanciful Epistle of a Student And a Astronaut who must Kill a Waitress in A Shark Tank',2006,1,NULL,4,'2.99',58,'22.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(482,'JEOPARDY ENCINO','A Boring Panorama of a Man And a Mad Cow who must Face a Explorer in Ancient India',2006,1,NULL,3,'0.99',102,'12.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(483,'JERICHO MULAN','A Amazing Yarn of a Hunter And a Butler who must Defeat a Boy in A Jet Boat',2006,1,NULL,3,'2.99',171,'29.99','NC-17','Commentaries','2006-02-15 05:03:42'),(484,'JERK PAYCHECK','A Touching Character Study of a Pastry Chef And a Database Administrator who must Reach a A Shark in Ancient Japan',2006,1,NULL,3,'2.99',172,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(485,'JERSEY SASSY','A Lacklusture Documentary of a Madman And a Mad Cow who must Find a Feminist in Ancient Japan',2006,1,NULL,6,'4.99',60,'16.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(486,'JET NEIGHBORS','A Amazing Display of a Lumberjack And a Teacher who must Outrace a Woman in A U-Boat',2006,1,NULL,7,'4.99',59,'14.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(487,'JINGLE SAGEBRUSH','A Epic Character Study of a Feminist And a Student who must Meet a Woman in A Baloon',2006,1,NULL,6,'4.99',124,'29.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(488,'JOON NORTHWEST','A Thrilling Panorama of a Technical Writer And a Car who must Discover a Forensic Psychologist in A Shark Tank',2006,1,NULL,3,'0.99',105,'23.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(489,'JUGGLER HARDLY','A Epic Story of a Mad Cow And a Astronaut who must Challenge a Car in California',2006,1,NULL,4,'0.99',54,'14.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(490,'JUMANJI BLADE','A Intrepid Yarn of a Husband And a Womanizer who must Pursue a Mad Scientist in New Orleans',2006,1,NULL,4,'2.99',121,'13.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(491,'JUMPING WRATH','A Touching Epistle of a Monkey And a Feminist who must Discover a Boat in Berlin',2006,1,NULL,4,'0.99',74,'18.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(492,'JUNGLE CLOSER','A Boring Character Study of a Boy And a Woman who must Battle a Astronaut in Australia',2006,1,NULL,6,'0.99',134,'11.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(493,'KANE EXORCIST','A Epic Documentary of a Composer And a Robot who must Overcome a Car in Berlin',2006,1,NULL,5,'0.99',92,'18.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(494,'KARATE MOON','A Astounding Yarn of a Womanizer And a Dog who must Reach a Waitress in A MySQL Convention',2006,1,NULL,4,'0.99',120,'21.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(495,'KENTUCKIAN GIANT','A Stunning Yarn of a Woman And a Frisbee who must Escape a Waitress in A U-Boat',2006,1,NULL,5,'2.99',169,'10.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(496,'KICK SAVANNAH','A Emotional Drama of a Monkey And a Robot who must Defeat a Monkey in New Orleans',2006,1,NULL,3,'0.99',179,'10.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(497,'KILL BROTHERHOOD','A Touching Display of a Hunter And a Secret Agent who must Redeem a Husband in The Outback',2006,1,NULL,4,'0.99',54,'15.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(498,'KILLER INNOCENT','A Fanciful Character Study of a Student And a Explorer who must Succumb a Composer in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',161,'11.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(499,'KING EVOLUTION','A Action-Packed Tale of a Boy And a Lumberjack who must Chase a Madman in A Baloon',2006,1,NULL,3,'4.99',184,'24.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(500,'KISS GLORY','A Lacklusture Reflection of a Girl And a Husband who must Find a Robot in The Canadian Rockies',2006,1,NULL,5,'4.99',163,'11.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(501,'KISSING DOLLS','A Insightful Reflection of a Pioneer And a Teacher who must Build a Composer in The First Manned Space Station',2006,1,NULL,3,'4.99',141,'9.99','R','Trailers','2006-02-15 05:03:42'),(502,'KNOCK WARLOCK','A Unbelieveable Story of a Teacher And a Boat who must Confront a Moose in A Baloon',2006,1,NULL,4,'2.99',71,'21.99','PG-13','Trailers','2006-02-15 05:03:42'),(503,'KRAMER CHOCOLATE','A Amazing Yarn of a Robot And a Pastry Chef who must Redeem a Mad Scientist in The Outback',2006,1,NULL,3,'2.99',171,'24.99','R','Trailers','2006-02-15 05:03:42'),(504,'KWAI HOMEWARD','A Amazing Drama of a Car And a Squirrel who must Pursue a Car in Soviet Georgia',2006,1,NULL,5,'0.99',46,'25.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(505,'LABYRINTH LEAGUE','A Awe-Inspiring Saga of a Composer And a Frisbee who must Succumb a Pioneer in The Sahara Desert',2006,1,NULL,6,'2.99',46,'24.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(506,'LADY STAGE','A Beautiful Character Study of a Woman And a Man who must Pursue a Explorer in A U-Boat',2006,1,NULL,4,'4.99',67,'14.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(507,'LADYBUGS ARMAGEDDON','A Fateful Reflection of a Dog And a Mad Scientist who must Meet a Mad Scientist in New Orleans',2006,1,NULL,4,'0.99',113,'13.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(508,'LAMBS CINCINATTI','A Insightful Story of a Man And a Feminist who must Fight a Composer in Australia',2006,1,NULL,6,'4.99',144,'18.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(509,'LANGUAGE COWBOY','A Epic Yarn of a Cat And a Madman who must Vanquish a Dentist in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',78,'26.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(510,'LAWLESS VISION','A Insightful Yarn of a Boy And a Sumo Wrestler who must Outgun a Car in The Outback',2006,1,NULL,6,'4.99',181,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(511,'LAWRENCE LOVE','A Fanciful Yarn of a Database Administrator And a Mad Cow who must Pursue a Womanizer in Berlin',2006,1,NULL,7,'0.99',175,'23.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(512,'LEAGUE HELLFIGHTERS','A Thoughtful Saga of a A Shark And a Monkey who must Outgun a Student in Ancient China',2006,1,NULL,5,'4.99',110,'25.99','PG-13','Trailers','2006-02-15 05:03:42'),(513,'LEATHERNECKS DWARFS','A Fateful Reflection of a Dog And a Mad Cow who must Outrace a Teacher in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',153,'21.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(514,'LEBOWSKI SOLDIERS','A Beautiful Epistle of a Secret Agent And a Pioneer who must Chase a Astronaut in Ancient China',2006,1,NULL,6,'2.99',69,'17.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(515,'LEGALLY SECRETARY','A Astounding Tale of a A Shark And a Moose who must Meet a Womanizer in The Sahara Desert',2006,1,NULL,7,'4.99',113,'14.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(516,'LEGEND JEDI','A Awe-Inspiring Epistle of a Pioneer And a Student who must Outgun a Crocodile in The Outback',2006,1,NULL,7,'0.99',59,'18.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(517,'LESSON CLEOPATRA','A Emotional Display of a Man And a Explorer who must Build a Boy in A Manhattan Penthouse',2006,1,NULL,3,'0.99',167,'28.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(518,'LIAISONS SWEET','A Boring Drama of a A Shark And a Explorer who must Redeem a Waitress in The Canadian Rockies',2006,1,NULL,5,'4.99',140,'15.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(519,'LIBERTY MAGNIFICENT','A Boring Drama of a Student And a Cat who must Sink a Technical Writer in A Baloon',2006,1,NULL,3,'2.99',138,'27.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(520,'LICENSE WEEKEND','A Insightful Story of a Man And a Husband who must Overcome a Madman in A Monastery',2006,1,NULL,7,'2.99',91,'28.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(521,'LIES TREATMENT','A Fast-Paced Character Study of a Dentist And a Moose who must Defeat a Composer in The First Manned Space Station',2006,1,NULL,7,'4.99',147,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(522,'LIFE TWISTED','A Thrilling Reflection of a Teacher And a Composer who must Find a Man in The First Manned Space Station',2006,1,NULL,4,'2.99',137,'9.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(523,'LIGHTS DEER','A Unbelieveable Epistle of a Dog And a Woman who must Confront a Moose in The Gulf of Mexico',2006,1,NULL,7,'0.99',174,'21.99','R','Commentaries','2006-02-15 05:03:42'),(524,'LION UNCUT','A Intrepid Display of a Pastry Chef And a Cat who must Kill a A Shark in Ancient China',2006,1,NULL,6,'0.99',50,'13.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(525,'LOATHING LEGALLY','A Boring Epistle of a Pioneer And a Mad Scientist who must Escape a Frisbee in The Gulf of Mexico',2006,1,NULL,4,'0.99',140,'29.99','R','Deleted Scenes','2006-02-15 05:03:42'),(526,'LOCK REAR','A Thoughtful Character Study of a Squirrel And a Technical Writer who must Outrace a Student in Ancient Japan',2006,1,NULL,7,'2.99',120,'10.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(527,'LOLA AGENT','A Astounding Tale of a Mad Scientist And a Husband who must Redeem a Database Administrator in Ancient Japan',2006,1,NULL,4,'4.99',85,'24.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(528,'LOLITA WORLD','A Thrilling Drama of a Girl And a Robot who must Redeem a Waitress in An Abandoned Mine Shaft',2006,1,NULL,4,'2.99',155,'25.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(529,'LONELY ELEPHANT','A Intrepid Story of a Student And a Dog who must Challenge a Explorer in Soviet Georgia',2006,1,NULL,3,'2.99',67,'12.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(530,'LORD ARIZONA','A Action-Packed Display of a Frisbee And a Pastry Chef who must Pursue a Crocodile in A Jet Boat',2006,1,NULL,5,'2.99',108,'27.99','PG-13','Trailers','2006-02-15 05:03:42'),(531,'LOSE INCH','A Stunning Reflection of a Student And a Technical Writer who must Battle a Butler in The First Manned Space Station',2006,1,NULL,3,'0.99',137,'18.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(532,'LOSER HUSTLER','A Stunning Drama of a Robot And a Feminist who must Outgun a Butler in Nigeria',2006,1,NULL,5,'4.99',80,'28.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(533,'LOST BIRD','A Emotional Character Study of a Robot And a A Shark who must Defeat a Technical Writer in A Manhattan Penthouse',2006,1,NULL,4,'2.99',98,'21.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(534,'LOUISIANA HARRY','A Lacklusture Drama of a Girl And a Technical Writer who must Redeem a Monkey in A Shark Tank',2006,1,NULL,5,'0.99',70,'18.99','PG-13','Trailers','2006-02-15 05:03:42'),(535,'LOVE SUICIDES','A Brilliant Panorama of a Hunter And a Explorer who must Pursue a Dentist in An Abandoned Fun House',2006,1,NULL,6,'0.99',181,'21.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(536,'LOVELY JINGLE','A Fanciful Yarn of a Crocodile And a Forensic Psychologist who must Discover a Crocodile in The Outback',2006,1,NULL,3,'2.99',65,'18.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(537,'LOVER TRUMAN','A Emotional Yarn of a Robot And a Boy who must Outgun a Technical Writer in A U-Boat',2006,1,NULL,3,'2.99',75,'29.99','G','Trailers','2006-02-15 05:03:42'),(538,'LOVERBOY ATTACKS','A Boring Story of a Car And a Butler who must Build a Girl in Soviet Georgia',2006,1,NULL,7,'0.99',162,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(539,'LUCK OPUS','A Boring Display of a Moose And a Squirrel who must Outrace a Teacher in A Shark Tank',2006,1,NULL,7,'2.99',152,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(540,'LUCKY FLYING','A Lacklusture Character Study of a A Shark And a Man who must Find a Forensic Psychologist in A U-Boat',2006,1,NULL,7,'2.99',97,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(541,'LUKE MUMMY','A Taut Character Study of a Boy And a Robot who must Redeem a Mad Scientist in Ancient India',2006,1,NULL,5,'2.99',74,'21.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(542,'LUST LOCK','A Fanciful Panorama of a Hunter And a Dentist who must Meet a Secret Agent in The Sahara Desert',2006,1,NULL,3,'2.99',52,'28.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(543,'MADIGAN DORADO','A Astounding Character Study of a A Shark And a A Shark who must Discover a Crocodile in The Outback',2006,1,NULL,5,'4.99',116,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(544,'MADISON TRAP','A Awe-Inspiring Reflection of a Monkey And a Dentist who must Overcome a Pioneer in A U-Boat',2006,1,NULL,4,'2.99',147,'11.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(545,'MADNESS ATTACKS','A Fanciful Tale of a Squirrel And a Boat who must Defeat a Crocodile in The Gulf of Mexico',2006,1,NULL,4,'0.99',178,'14.99','PG-13','Trailers','2006-02-15 05:03:42'),(546,'MADRE GABLES','A Intrepid Panorama of a Sumo Wrestler And a Forensic Psychologist who must Discover a Moose in The First Manned Space Station',2006,1,NULL,7,'2.99',98,'27.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(547,'MAGIC MALLRATS','A Touching Documentary of a Pastry Chef And a Pastry Chef who must Build a Mad Scientist in California',2006,1,NULL,3,'0.99',117,'19.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(548,'MAGNIFICENT CHITTY','A Insightful Story of a Teacher And a Hunter who must Face a Mad Cow in California',2006,1,NULL,3,'2.99',53,'27.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(549,'MAGNOLIA FORRESTER','A Thoughtful Documentary of a Composer And a Explorer who must Conquer a Dentist in New Orleans',2006,1,NULL,4,'0.99',171,'28.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(550,'MAGUIRE APACHE','A Fast-Paced Reflection of a Waitress And a Hunter who must Defeat a Forensic Psychologist in A Baloon',2006,1,NULL,6,'2.99',74,'22.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(551,'MAIDEN HOME','A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention',2006,1,NULL,3,'4.99',138,'9.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(552,'MAJESTIC FLOATS','A Thrilling Character Study of a Moose And a Student who must Escape a Butler in The First Manned Space Station',2006,1,NULL,5,'0.99',130,'15.99','PG','Trailers','2006-02-15 05:03:42'),(553,'MAKER GABLES','A Stunning Display of a Moose And a Database Administrator who must Pursue a Composer in A Jet Boat',2006,1,NULL,4,'0.99',136,'12.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(554,'MALKOVICH PET','A Intrepid Reflection of a Waitress And a A Shark who must Kill a Squirrel in The Outback',2006,1,NULL,6,'2.99',159,'22.99','G','Behind the Scenes','2006-02-15 05:03:42'),(555,'MALLRATS UNITED','A Thrilling Yarn of a Waitress And a Dentist who must Find a Hunter in A Monastery',2006,1,NULL,4,'0.99',133,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(556,'MALTESE HOPE','A Fast-Paced Documentary of a Crocodile And a Sumo Wrestler who must Conquer a Explorer in California',2006,1,NULL,6,'4.99',127,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(557,'MANCHURIAN CURTAIN','A Stunning Tale of a Mad Cow And a Boy who must Battle a Boy in Berlin',2006,1,NULL,5,'2.99',177,'27.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(558,'MANNEQUIN WORST','A Astounding Saga of a Mad Cow And a Pastry Chef who must Discover a Husband in Ancient India',2006,1,NULL,3,'2.99',71,'18.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(559,'MARRIED GO','A Fanciful Story of a Womanizer And a Dog who must Face a Forensic Psychologist in The Sahara Desert',2006,1,NULL,7,'2.99',114,'22.99','G','Behind the Scenes','2006-02-15 05:03:42'),(560,'MARS ROMAN','A Boring Drama of a Car And a Dog who must Succumb a Madman in Soviet Georgia',2006,1,NULL,6,'0.99',62,'21.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(561,'MASK PEACH','A Boring Character Study of a Student And a Robot who must Meet a Woman in California',2006,1,NULL,6,'2.99',123,'26.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(562,'MASKED BUBBLE','A Fanciful Documentary of a Pioneer And a Boat who must Pursue a Pioneer in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',151,'12.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(563,'MASSACRE USUAL','A Fateful Reflection of a Waitress And a Crocodile who must Challenge a Forensic Psychologist in California',2006,1,NULL,6,'4.99',165,'16.99','R','Commentaries','2006-02-15 05:03:42'),(564,'MASSAGE IMAGE','A Fateful Drama of a Frisbee And a Crocodile who must Vanquish a Dog in The First Manned Space Station',2006,1,NULL,4,'2.99',161,'11.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(565,'MATRIX SNOWMAN','A Action-Packed Saga of a Womanizer And a Woman who must Overcome a Student in California',2006,1,NULL,6,'4.99',56,'9.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(566,'MAUDE MOD','A Beautiful Documentary of a Forensic Psychologist And a Cat who must Reach a Astronaut in Nigeria',2006,1,NULL,6,'0.99',72,'20.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(567,'MEET CHOCOLATE','A Boring Documentary of a Dentist And a Butler who must Confront a Monkey in A MySQL Convention',2006,1,NULL,3,'2.99',80,'26.99','G','Trailers','2006-02-15 05:03:42'),(568,'MEMENTO ZOOLANDER','A Touching Epistle of a Squirrel And a Explorer who must Redeem a Pastry Chef in The Sahara Desert',2006,1,NULL,4,'4.99',77,'11.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(569,'MENAGERIE RUSHMORE','A Unbelieveable Panorama of a Composer And a Butler who must Overcome a Database Administrator in The First Manned Space Station',2006,1,NULL,7,'2.99',147,'18.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(570,'MERMAID INSECTS','A Lacklusture Drama of a Waitress And a Husband who must Fight a Husband in California',2006,1,NULL,5,'4.99',104,'20.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(571,'METAL ARMAGEDDON','A Thrilling Display of a Lumberjack And a Crocodile who must Meet a Monkey in A Baloon Factory',2006,1,NULL,6,'2.99',161,'26.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(572,'METROPOLIS COMA','A Emotional Saga of a Database Administrator And a Pastry Chef who must Confront a Teacher in A Baloon Factory',2006,1,NULL,4,'2.99',64,'9.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(573,'MICROCOSMOS PARADISE','A Touching Character Study of a Boat And a Student who must Sink a A Shark in Nigeria',2006,1,NULL,6,'2.99',105,'22.99','PG-13','Commentaries','2006-02-15 05:03:42'),(574,'MIDNIGHT WESTWARD','A Taut Reflection of a Husband And a A Shark who must Redeem a Pastry Chef in A Monastery',2006,1,NULL,3,'0.99',86,'19.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(575,'MIDSUMMER GROUNDHOG','A Fateful Panorama of a Moose And a Dog who must Chase a Crocodile in Ancient Japan',2006,1,NULL,3,'4.99',48,'27.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(576,'MIGHTY LUCK','A Astounding Epistle of a Mad Scientist And a Pioneer who must Escape a Database Administrator in A MySQL Convention',2006,1,NULL,7,'2.99',122,'13.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(577,'MILE MULAN','A Lacklusture Epistle of a Cat And a Husband who must Confront a Boy in A MySQL Convention',2006,1,NULL,4,'0.99',64,'10.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(578,'MILLION ACE','A Brilliant Documentary of a Womanizer And a Squirrel who must Find a Technical Writer in The Sahara Desert',2006,1,NULL,4,'4.99',142,'16.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(579,'MINDS TRUMAN','A Taut Yarn of a Mad Scientist And a Crocodile who must Outgun a Database Administrator in A Monastery',2006,1,NULL,3,'4.99',149,'22.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(580,'MINE TITANS','A Amazing Yarn of a Robot And a Womanizer who must Discover a Forensic Psychologist in Berlin',2006,1,NULL,3,'4.99',166,'12.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(581,'MINORITY KISS','A Insightful Display of a Lumberjack And a Sumo Wrestler who must Meet a Man in The Outback',2006,1,NULL,4,'0.99',59,'16.99','G','Trailers','2006-02-15 05:03:42'),(582,'MIRACLE VIRTUAL','A Touching Epistle of a Butler And a Boy who must Find a Mad Scientist in The Sahara Desert',2006,1,NULL,3,'2.99',162,'19.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(583,'MISSION ZOOLANDER','A Intrepid Story of a Sumo Wrestler And a Teacher who must Meet a A Shark in An Abandoned Fun House',2006,1,NULL,3,'4.99',164,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(584,'MIXED DOORS','A Taut Drama of a Womanizer And a Lumberjack who must Succumb a Pioneer in Ancient India',2006,1,NULL,6,'2.99',180,'26.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(585,'MOB DUFFEL','A Unbelieveable Documentary of a Frisbee And a Boat who must Meet a Boy in The Canadian Rockies',2006,1,NULL,4,'0.99',105,'25.99','G','Trailers','2006-02-15 05:03:42'),(586,'MOCKINGBIRD HOLLYWOOD','A Thoughtful Panorama of a Man And a Car who must Sink a Composer in Berlin',2006,1,NULL,4,'0.99',60,'27.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(587,'MOD SECRETARY','A Boring Documentary of a Mad Cow And a Cat who must Build a Lumberjack in New Orleans',2006,1,NULL,6,'4.99',77,'20.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(588,'MODEL FISH','A Beautiful Panorama of a Boat And a Crocodile who must Outrace a Dog in Australia',2006,1,NULL,4,'4.99',175,'11.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(589,'MODERN DORADO','A Awe-Inspiring Story of a Butler And a Sumo Wrestler who must Redeem a Boy in New Orleans',2006,1,NULL,3,'0.99',74,'20.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(590,'MONEY HAROLD','A Touching Tale of a Explorer And a Boat who must Defeat a Robot in Australia',2006,1,NULL,3,'2.99',135,'17.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(591,'MONSOON CAUSE','A Astounding Tale of a Crocodile And a Car who must Outrace a Squirrel in A U-Boat',2006,1,NULL,6,'4.99',182,'20.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(592,'MONSTER SPARTACUS','A Fast-Paced Story of a Waitress And a Cat who must Fight a Girl in Australia',2006,1,NULL,6,'2.99',107,'28.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(593,'MONTEREY LABYRINTH','A Awe-Inspiring Drama of a Monkey And a Composer who must Escape a Feminist in A U-Boat',2006,1,NULL,6,'0.99',158,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(594,'MONTEZUMA COMMAND','A Thrilling Reflection of a Waitress And a Butler who must Battle a Butler in A Jet Boat',2006,1,NULL,6,'0.99',126,'22.99','NC-17','Trailers','2006-02-15 05:03:42'),(595,'MOON BUNCH','A Beautiful Tale of a Astronaut And a Mad Cow who must Challenge a Cat in A Baloon Factory',2006,1,NULL,7,'0.99',83,'20.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(596,'MOONSHINE CABIN','A Thoughtful Display of a Astronaut And a Feminist who must Chase a Frisbee in A Jet Boat',2006,1,NULL,4,'4.99',171,'25.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(597,'MOONWALKER FOOL','A Epic Drama of a Feminist And a Pioneer who must Sink a Composer in New Orleans',2006,1,NULL,5,'4.99',184,'12.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(598,'MOSQUITO ARMAGEDDON','A Thoughtful Character Study of a Waitress And a Feminist who must Build a Teacher in Ancient Japan',2006,1,NULL,6,'0.99',57,'22.99','G','Trailers','2006-02-15 05:03:42'),(599,'MOTHER OLEANDER','A Boring Tale of a Husband And a Boy who must Fight a Squirrel in Ancient China',2006,1,NULL,3,'0.99',103,'20.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(600,'MOTIONS DETAILS','A Awe-Inspiring Reflection of a Dog And a Student who must Kill a Car in An Abandoned Fun House',2006,1,NULL,5,'0.99',166,'16.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(601,'MOULIN WAKE','A Astounding Story of a Forensic Psychologist And a Cat who must Battle a Teacher in An Abandoned Mine Shaft',2006,1,NULL,4,'0.99',79,'20.99','PG-13','Trailers','2006-02-15 05:03:42'),(602,'MOURNING PURPLE','A Lacklusture Display of a Waitress And a Lumberjack who must Chase a Pioneer in New Orleans',2006,1,NULL,5,'0.99',146,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(603,'MOVIE SHAKESPEARE','A Insightful Display of a Database Administrator And a Student who must Build a Hunter in Berlin',2006,1,NULL,6,'4.99',53,'27.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(604,'MULAN MOON','A Emotional Saga of a Womanizer And a Pioneer who must Overcome a Dentist in A Baloon',2006,1,NULL,4,'0.99',160,'10.99','G','Behind the Scenes','2006-02-15 05:03:42'),(605,'MULHOLLAND BEAST','A Awe-Inspiring Display of a Husband And a Squirrel who must Battle a Sumo Wrestler in A Jet Boat',2006,1,NULL,7,'2.99',157,'13.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(606,'MUMMY CREATURES','A Fateful Character Study of a Crocodile And a Monkey who must Meet a Dentist in Australia',2006,1,NULL,3,'0.99',160,'15.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(607,'MUPPET MILE','A Lacklusture Story of a Madman And a Teacher who must Kill a Frisbee in The Gulf of Mexico',2006,1,NULL,5,'4.99',50,'18.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(608,'MURDER ANTITRUST','A Brilliant Yarn of a Car And a Database Administrator who must Escape a Boy in A MySQL Convention',2006,1,NULL,6,'2.99',166,'11.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(609,'MUSCLE BRIGHT','A Stunning Panorama of a Sumo Wrestler And a Husband who must Redeem a Madman in Ancient India',2006,1,NULL,7,'2.99',185,'23.99','G','Deleted Scenes','2006-02-15 05:03:42'),(610,'MUSIC BOONDOCK','A Thrilling Tale of a Butler And a Astronaut who must Battle a Explorer in The First Manned Space Station',2006,1,NULL,7,'0.99',129,'17.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(611,'MUSKETEERS WAIT','A Touching Yarn of a Student And a Moose who must Fight a Mad Cow in Australia',2006,1,NULL,7,'4.99',73,'17.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(612,'MUSSOLINI SPOILERS','A Thrilling Display of a Boat And a Monkey who must Meet a Composer in Ancient China',2006,1,NULL,6,'2.99',180,'10.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(613,'MYSTIC TRUMAN','A Epic Yarn of a Teacher And a Hunter who must Outgun a Explorer in Soviet Georgia',2006,1,NULL,5,'0.99',92,'19.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(614,'NAME DETECTIVE','A Touching Saga of a Sumo Wrestler And a Cat who must Pursue a Mad Scientist in Nigeria',2006,1,NULL,5,'4.99',178,'11.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(615,'NASH CHOCOLAT','A Epic Reflection of a Monkey And a Mad Cow who must Kill a Forensic Psychologist in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',180,'21.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(616,'NATIONAL STORY','A Taut Epistle of a Mad Scientist And a Girl who must Escape a Monkey in California',2006,1,NULL,4,'2.99',92,'19.99','NC-17','Trailers','2006-02-15 05:03:42'),(617,'NATURAL STOCK','A Fast-Paced Story of a Sumo Wrestler And a Girl who must Defeat a Car in A Baloon Factory',2006,1,NULL,4,'0.99',50,'24.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(618,'NECKLACE OUTBREAK','A Astounding Epistle of a Database Administrator And a Mad Scientist who must Pursue a Cat in California',2006,1,NULL,3,'0.99',132,'21.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(619,'NEIGHBORS CHARADE','A Fanciful Reflection of a Crocodile And a Astronaut who must Outrace a Feminist in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',161,'20.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(620,'NEMO CAMPUS','A Lacklusture Reflection of a Monkey And a Squirrel who must Outrace a Womanizer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',131,'23.99','NC-17','Trailers','2006-02-15 05:03:42'),(621,'NETWORK PEAK','A Unbelieveable Reflection of a Butler And a Boat who must Outgun a Mad Scientist in California',2006,1,NULL,5,'2.99',75,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(622,'NEWSIES STORY','A Action-Packed Character Study of a Dog And a Lumberjack who must Outrace a Moose in The Gulf of Mexico',2006,1,NULL,4,'0.99',159,'25.99','G','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(623,'NEWTON LABYRINTH','A Intrepid Character Study of a Moose And a Waitress who must Find a A Shark in Ancient India',2006,1,NULL,4,'0.99',75,'9.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(624,'NIGHTMARE CHILL','A Brilliant Display of a Robot And a Butler who must Fight a Waitress in An Abandoned Mine Shaft',2006,1,NULL,3,'4.99',149,'25.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(625,'NONE SPIKING','A Boring Reflection of a Secret Agent And a Astronaut who must Face a Composer in A Manhattan Penthouse',2006,1,NULL,3,'0.99',83,'18.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(626,'NOON PAPI','A Unbelieveable Character Study of a Mad Scientist And a Astronaut who must Find a Pioneer in A Manhattan Penthouse',2006,1,NULL,5,'2.99',57,'12.99','G','Behind the Scenes','2006-02-15 05:03:42'),(627,'NORTH TEQUILA','A Beautiful Character Study of a Mad Cow And a Robot who must Reach a Womanizer in New Orleans',2006,1,NULL,4,'4.99',67,'9.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(628,'NORTHWEST POLISH','A Boring Character Study of a Boy And a A Shark who must Outrace a Womanizer in The Outback',2006,1,NULL,5,'2.99',172,'24.99','PG','Trailers','2006-02-15 05:03:42'),(629,'NOTORIOUS REUNION','A Amazing Epistle of a Woman And a Squirrel who must Fight a Hunter in A Baloon',2006,1,NULL,7,'0.99',128,'9.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(630,'NOTTING SPEAKEASY','A Thoughtful Display of a Butler And a Womanizer who must Find a Waitress in The Canadian Rockies',2006,1,NULL,7,'0.99',48,'19.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(631,'NOVOCAINE FLIGHT','A Fanciful Display of a Student And a Teacher who must Outgun a Crocodile in Nigeria',2006,1,NULL,4,'0.99',64,'11.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(632,'NUTS TIES','A Thoughtful Drama of a Explorer And a Womanizer who must Meet a Teacher in California',2006,1,NULL,5,'4.99',145,'10.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(633,'OCTOBER SUBMARINE','A Taut Epistle of a Monkey And a Boy who must Confront a Husband in A Jet Boat',2006,1,NULL,6,'4.99',54,'10.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(634,'ODDS BOOGIE','A Thrilling Yarn of a Feminist And a Madman who must Battle a Hunter in Berlin',2006,1,NULL,6,'0.99',48,'14.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(635,'OKLAHOMA JUMANJI','A Thoughtful Drama of a Dentist And a Womanizer who must Meet a Husband in The Sahara Desert',2006,1,NULL,7,'0.99',58,'15.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(636,'OLEANDER CLUE','A Boring Story of a Teacher And a Monkey who must Succumb a Forensic Psychologist in A Jet Boat',2006,1,NULL,5,'0.99',161,'12.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(637,'OPEN AFRICAN','A Lacklusture Drama of a Secret Agent And a Explorer who must Discover a Car in A U-Boat',2006,1,NULL,7,'4.99',131,'16.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(638,'OPERATION OPERATION','A Intrepid Character Study of a Man And a Frisbee who must Overcome a Madman in Ancient China',2006,1,NULL,7,'2.99',156,'23.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(639,'OPPOSITE NECKLACE','A Fateful Epistle of a Crocodile And a Moose who must Kill a Explorer in Nigeria',2006,1,NULL,7,'4.99',92,'9.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(640,'OPUS ICE','A Fast-Paced Drama of a Hunter And a Boy who must Discover a Feminist in The Sahara Desert',2006,1,NULL,5,'4.99',102,'21.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(641,'ORANGE GRAPES','A Astounding Documentary of a Butler And a Womanizer who must Face a Dog in A U-Boat',2006,1,NULL,4,'0.99',76,'21.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(642,'ORDER BETRAYED','A Amazing Saga of a Dog And a A Shark who must Challenge a Cat in The Sahara Desert',2006,1,NULL,7,'2.99',120,'13.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(643,'ORIENT CLOSER','A Astounding Epistle of a Technical Writer And a Teacher who must Fight a Squirrel in The Sahara Desert',2006,1,NULL,3,'2.99',118,'22.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(644,'OSCAR GOLD','A Insightful Tale of a Database Administrator And a Dog who must Face a Madman in Soviet Georgia',2006,1,NULL,7,'2.99',115,'29.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(645,'OTHERS SOUP','A Lacklusture Documentary of a Mad Cow And a Madman who must Sink a Moose in The Gulf of Mexico',2006,1,NULL,7,'2.99',118,'18.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(646,'OUTBREAK DIVINE','A Unbelieveable Yarn of a Database Administrator And a Woman who must Succumb a A Shark in A U-Boat',2006,1,NULL,6,'0.99',169,'12.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(647,'OUTFIELD MASSACRE','A Thoughtful Drama of a Husband And a Secret Agent who must Pursue a Database Administrator in Ancient India',2006,1,NULL,4,'0.99',129,'18.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(648,'OUTLAW HANKY','A Thoughtful Story of a Astronaut And a Composer who must Conquer a Dog in The Sahara Desert',2006,1,NULL,7,'4.99',148,'17.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(649,'OZ LIAISONS','A Epic Yarn of a Mad Scientist And a Cat who must Confront a Womanizer in A Baloon Factory',2006,1,NULL,4,'2.99',85,'14.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(650,'PACIFIC AMISTAD','A Thrilling Yarn of a Dog And a Moose who must Kill a Pastry Chef in A Manhattan Penthouse',2006,1,NULL,3,'0.99',144,'27.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(651,'PACKER MADIGAN','A Epic Display of a Sumo Wrestler And a Forensic Psychologist who must Build a Woman in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',84,'20.99','PG-13','Trailers','2006-02-15 05:03:42'),(652,'PAJAMA JAWBREAKER','A Emotional Drama of a Boy And a Technical Writer who must Redeem a Sumo Wrestler in California',2006,1,NULL,3,'0.99',126,'14.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(653,'PANIC CLUB','A Fanciful Display of a Teacher And a Crocodile who must Succumb a Girl in A Baloon',2006,1,NULL,3,'4.99',102,'15.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(654,'PANKY SUBMARINE','A Touching Documentary of a Dentist And a Sumo Wrestler who must Overcome a Boy in The Gulf of Mexico',2006,1,NULL,4,'4.99',93,'19.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(655,'PANTHER REDS','A Brilliant Panorama of a Moose And a Man who must Reach a Teacher in The Gulf of Mexico',2006,1,NULL,5,'4.99',109,'22.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(656,'PAPI NECKLACE','A Fanciful Display of a Car And a Monkey who must Escape a Squirrel in Ancient Japan',2006,1,NULL,3,'0.99',128,'9.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(657,'PARADISE SABRINA','A Intrepid Yarn of a Car And a Moose who must Outrace a Crocodile in A Manhattan Penthouse',2006,1,NULL,5,'2.99',48,'12.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(658,'PARIS WEEKEND','A Intrepid Story of a Squirrel And a Crocodile who must Defeat a Monkey in The Outback',2006,1,NULL,7,'2.99',121,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(659,'PARK CITIZEN','A Taut Epistle of a Sumo Wrestler And a Girl who must Face a Husband in Ancient Japan',2006,1,NULL,3,'4.99',109,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(660,'PARTY KNOCK','A Fateful Display of a Technical Writer And a Butler who must Battle a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',107,'11.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(661,'PAST SUICIDES','A Intrepid Tale of a Madman And a Astronaut who must Challenge a Hunter in A Monastery',2006,1,NULL,5,'4.99',157,'17.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(662,'PATHS CONTROL','A Astounding Documentary of a Butler And a Cat who must Find a Frisbee in Ancient China',2006,1,NULL,3,'4.99',118,'9.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(663,'PATIENT SISTER','A Emotional Epistle of a Squirrel And a Robot who must Confront a Lumberjack in Soviet Georgia',2006,1,NULL,7,'0.99',99,'29.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(664,'PATRIOT ROMAN','A Taut Saga of a Robot And a Database Administrator who must Challenge a Astronaut in California',2006,1,NULL,6,'2.99',65,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(665,'PATTON INTERVIEW','A Thrilling Documentary of a Composer And a Secret Agent who must Succumb a Cat in Berlin',2006,1,NULL,4,'2.99',175,'22.99','PG','Commentaries','2006-02-15 05:03:42'),(666,'PAYCHECK WAIT','A Awe-Inspiring Reflection of a Boy And a Man who must Discover a Moose in The Sahara Desert',2006,1,NULL,4,'4.99',145,'27.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(667,'PEACH INNOCENT','A Action-Packed Drama of a Monkey And a Dentist who must Chase a Butler in Berlin',2006,1,NULL,3,'2.99',160,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(668,'PEAK FOREVER','A Insightful Reflection of a Boat And a Secret Agent who must Vanquish a Astronaut in An Abandoned Mine Shaft',2006,1,NULL,7,'4.99',80,'25.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(669,'PEARL DESTINY','A Lacklusture Yarn of a Astronaut And a Pastry Chef who must Sink a Dog in A U-Boat',2006,1,NULL,3,'2.99',74,'10.99','NC-17','Trailers','2006-02-15 05:03:42'),(670,'PELICAN COMFORTS','A Epic Documentary of a Boy And a Monkey who must Pursue a Astronaut in Berlin',2006,1,NULL,4,'4.99',48,'17.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(671,'PERDITION FARGO','A Fast-Paced Story of a Car And a Cat who must Outgun a Hunter in Berlin',2006,1,NULL,7,'4.99',99,'27.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(672,'PERFECT GROOVE','A Thrilling Yarn of a Dog And a Dog who must Build a Husband in A Baloon',2006,1,NULL,7,'2.99',82,'17.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(673,'PERSONAL LADYBUGS','A Epic Saga of a Hunter And a Technical Writer who must Conquer a Cat in Ancient Japan',2006,1,NULL,3,'0.99',118,'19.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(674,'PET HAUNTING','A Unbelieveable Reflection of a Explorer And a Boat who must Conquer a Woman in California',2006,1,NULL,3,'0.99',99,'11.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(675,'PHANTOM GLORY','A Beautiful Documentary of a Astronaut And a Crocodile who must Discover a Madman in A Monastery',2006,1,NULL,6,'2.99',60,'17.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(676,'PHILADELPHIA WIFE','A Taut Yarn of a Hunter And a Astronaut who must Conquer a Database Administrator in The Sahara Desert',2006,1,NULL,7,'4.99',137,'16.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(677,'PIANIST OUTFIELD','A Intrepid Story of a Boy And a Technical Writer who must Pursue a Lumberjack in A Monastery',2006,1,NULL,6,'0.99',136,'25.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(678,'PICKUP DRIVING','A Touching Documentary of a Husband And a Boat who must Meet a Pastry Chef in A Baloon Factory',2006,1,NULL,3,'2.99',77,'23.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(679,'PILOT HOOSIERS','A Awe-Inspiring Reflection of a Crocodile And a Sumo Wrestler who must Meet a Forensic Psychologist in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',50,'17.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(680,'PINOCCHIO SIMON','A Action-Packed Reflection of a Mad Scientist And a A Shark who must Find a Feminist in California',2006,1,NULL,4,'4.99',103,'21.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(681,'PIRATES ROXANNE','A Stunning Drama of a Woman And a Lumberjack who must Overcome a A Shark in The Canadian Rockies',2006,1,NULL,4,'0.99',100,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(682,'PITTSBURGH HUNCHBACK','A Thrilling Epistle of a Boy And a Boat who must Find a Student in Soviet Georgia',2006,1,NULL,4,'4.99',134,'17.99','PG-13','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(683,'PITY BOUND','A Boring Panorama of a Feminist And a Moose who must Defeat a Database Administrator in Nigeria',2006,1,NULL,5,'4.99',60,'19.99','NC-17','Commentaries','2006-02-15 05:03:42'),(684,'PIZZA JUMANJI','A Epic Saga of a Cat And a Squirrel who must Outgun a Robot in A U-Boat',2006,1,NULL,4,'2.99',173,'11.99','NC-17','Commentaries','2006-02-15 05:03:42'),(685,'PLATOON INSTINCT','A Thrilling Panorama of a Man And a Woman who must Reach a Woman in Australia',2006,1,NULL,6,'4.99',132,'10.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(686,'PLUTO OLEANDER','A Action-Packed Reflection of a Car And a Moose who must Outgun a Car in A Shark Tank',2006,1,NULL,5,'4.99',84,'9.99','R','Behind the Scenes','2006-02-15 05:03:42'),(687,'POCUS PULP','A Intrepid Yarn of a Frisbee And a Dog who must Build a Astronaut in A Baloon Factory',2006,1,NULL,6,'0.99',138,'15.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(688,'POLISH BROOKLYN','A Boring Character Study of a Database Administrator And a Lumberjack who must Reach a Madman in The Outback',2006,1,NULL,6,'0.99',61,'12.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(689,'POLLOCK DELIVERANCE','A Intrepid Story of a Madman And a Frisbee who must Outgun a Boat in The Sahara Desert',2006,1,NULL,5,'2.99',137,'14.99','PG','Commentaries','2006-02-15 05:03:42'),(690,'POND SEATTLE','A Stunning Drama of a Teacher And a Boat who must Battle a Feminist in Ancient China',2006,1,NULL,7,'2.99',185,'25.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(691,'POSEIDON FOREVER','A Thoughtful Epistle of a Womanizer And a Monkey who must Vanquish a Dentist in A Monastery',2006,1,NULL,6,'4.99',159,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(692,'POTLUCK MIXED','A Beautiful Story of a Dog And a Technical Writer who must Outgun a Student in A Baloon',2006,1,NULL,3,'2.99',179,'10.99','G','Behind the Scenes','2006-02-15 05:03:42'),(693,'POTTER CONNECTICUT','A Thrilling Epistle of a Frisbee And a Cat who must Fight a Technical Writer in Berlin',2006,1,NULL,5,'2.99',115,'16.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(694,'PREJUDICE OLEANDER','A Epic Saga of a Boy And a Dentist who must Outrace a Madman in A U-Boat',2006,1,NULL,6,'4.99',98,'15.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(695,'PRESIDENT BANG','A Fateful Panorama of a Technical Writer And a Moose who must Battle a Robot in Soviet Georgia',2006,1,NULL,6,'4.99',144,'12.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(696,'PRIDE ALAMO','A Thoughtful Drama of a A Shark And a Forensic Psychologist who must Vanquish a Student in Ancient India',2006,1,NULL,6,'0.99',114,'20.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(697,'PRIMARY GLASS','A Fateful Documentary of a Pastry Chef And a Butler who must Build a Dog in The Canadian Rockies',2006,1,NULL,7,'0.99',53,'16.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(698,'PRINCESS GIANT','A Thrilling Yarn of a Pastry Chef And a Monkey who must Battle a Monkey in A Shark Tank',2006,1,NULL,3,'2.99',71,'29.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(699,'PRIVATE DROP','A Stunning Story of a Technical Writer And a Hunter who must Succumb a Secret Agent in A Baloon',2006,1,NULL,7,'4.99',106,'26.99','PG','Trailers','2006-02-15 05:03:42'),(700,'PRIX UNDEFEATED','A Stunning Saga of a Mad Scientist And a Boat who must Overcome a Dentist in Ancient China',2006,1,NULL,4,'2.99',115,'13.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(701,'PSYCHO SHRUNK','A Amazing Panorama of a Crocodile And a Explorer who must Fight a Husband in Nigeria',2006,1,NULL,5,'2.99',155,'11.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(702,'PULP BEVERLY','A Unbelieveable Display of a Dog And a Crocodile who must Outrace a Man in Nigeria',2006,1,NULL,4,'2.99',89,'12.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(703,'PUNK DIVORCE','A Fast-Paced Tale of a Pastry Chef And a Boat who must Face a Frisbee in The Canadian Rockies',2006,1,NULL,6,'4.99',100,'18.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(704,'PURE RUNNER','A Thoughtful Documentary of a Student And a Madman who must Challenge a Squirrel in A Manhattan Penthouse',2006,1,NULL,3,'2.99',121,'25.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(705,'PURPLE MOVIE','A Boring Display of a Pastry Chef And a Sumo Wrestler who must Discover a Frisbee in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',88,'9.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(706,'QUEEN LUKE','A Astounding Story of a Girl And a Boy who must Challenge a Composer in New Orleans',2006,1,NULL,5,'4.99',163,'22.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(707,'QUEST MUSSOLINI','A Fateful Drama of a Husband And a Sumo Wrestler who must Battle a Pastry Chef in A Baloon Factory',2006,1,NULL,5,'2.99',177,'29.99','R','Behind the Scenes','2006-02-15 05:03:42'),(708,'QUILLS BULL','A Thoughtful Story of a Pioneer And a Woman who must Reach a Moose in Australia',2006,1,NULL,4,'4.99',112,'19.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(709,'RACER EGG','A Emotional Display of a Monkey And a Waitress who must Reach a Secret Agent in California',2006,1,NULL,7,'2.99',147,'19.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(710,'RAGE GAMES','A Fast-Paced Saga of a Astronaut And a Secret Agent who must Escape a Hunter in An Abandoned Amusement Park',2006,1,NULL,4,'4.99',120,'18.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(711,'RAGING AIRPLANE','A Astounding Display of a Secret Agent And a Technical Writer who must Escape a Mad Scientist in A Jet Boat',2006,1,NULL,4,'4.99',154,'18.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(712,'RAIDERS ANTITRUST','A Amazing Drama of a Teacher And a Feminist who must Meet a Woman in The First Manned Space Station',2006,1,NULL,4,'0.99',82,'11.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(713,'RAINBOW SHOCK','A Action-Packed Story of a Hunter And a Boy who must Discover a Lumberjack in Ancient India',2006,1,NULL,3,'4.99',74,'14.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(714,'RANDOM GO','A Fateful Drama of a Frisbee And a Student who must Confront a Cat in A Shark Tank',2006,1,NULL,6,'2.99',73,'29.99','NC-17','Trailers','2006-02-15 05:03:42'),(715,'RANGE MOONWALKER','A Insightful Documentary of a Hunter And a Dentist who must Confront a Crocodile in A Baloon',2006,1,NULL,3,'4.99',147,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(716,'REAP UNFAITHFUL','A Thrilling Epistle of a Composer And a Sumo Wrestler who must Challenge a Mad Cow in A MySQL Convention',2006,1,NULL,6,'2.99',136,'26.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(717,'REAR TRADING','A Awe-Inspiring Reflection of a Forensic Psychologist And a Secret Agent who must Succumb a Pastry Chef in Soviet Georgia',2006,1,NULL,6,'0.99',97,'23.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(718,'REBEL AIRPORT','A Intrepid Yarn of a Database Administrator And a Boat who must Outrace a Husband in Ancient India',2006,1,NULL,7,'0.99',73,'24.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(719,'RECORDS ZORRO','A Amazing Drama of a Mad Scientist And a Composer who must Build a Husband in The Outback',2006,1,NULL,7,'4.99',182,'11.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(720,'REDEMPTION COMFORTS','A Emotional Documentary of a Dentist And a Woman who must Battle a Mad Scientist in Ancient China',2006,1,NULL,3,'2.99',179,'20.99','NC-17','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(721,'REDS POCUS','A Lacklusture Yarn of a Sumo Wrestler And a Squirrel who must Redeem a Monkey in Soviet Georgia',2006,1,NULL,7,'4.99',182,'23.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(722,'REEF SALUTE','A Action-Packed Saga of a Teacher And a Lumberjack who must Battle a Dentist in A Baloon',2006,1,NULL,5,'0.99',123,'26.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(723,'REIGN GENTLEMEN','A Emotional Yarn of a Composer And a Man who must Escape a Butler in The Gulf of Mexico',2006,1,NULL,3,'2.99',82,'29.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(724,'REMEMBER DIARY','A Insightful Tale of a Technical Writer And a Waitress who must Conquer a Monkey in Ancient India',2006,1,NULL,5,'2.99',110,'15.99','R','Trailers,Commentaries','2006-02-15 05:03:42'),(725,'REQUIEM TYCOON','A Unbelieveable Character Study of a Cat And a Database Administrator who must Pursue a Teacher in A Monastery',2006,1,NULL,6,'4.99',167,'25.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(726,'RESERVOIR ADAPTATION','A Intrepid Drama of a Teacher And a Moose who must Kill a Car in California',2006,1,NULL,7,'2.99',61,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(727,'RESURRECTION SILVERADO','A Epic Yarn of a Robot And a Explorer who must Challenge a Girl in A MySQL Convention',2006,1,NULL,6,'0.99',117,'12.99','PG','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(728,'REUNION WITCHES','A Unbelieveable Documentary of a Database Administrator And a Frisbee who must Redeem a Mad Scientist in A Baloon Factory',2006,1,NULL,3,'0.99',63,'26.99','R','Commentaries','2006-02-15 05:03:42'),(729,'RIDER CADDYSHACK','A Taut Reflection of a Monkey And a Womanizer who must Chase a Moose in Nigeria',2006,1,NULL,5,'2.99',177,'28.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(730,'RIDGEMONT SUBMARINE','A Unbelieveable Drama of a Waitress And a Composer who must Sink a Mad Cow in Ancient Japan',2006,1,NULL,3,'0.99',46,'28.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(731,'RIGHT CRANES','A Fateful Character Study of a Boat And a Cat who must Find a Database Administrator in A Jet Boat',2006,1,NULL,7,'4.99',153,'29.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(732,'RINGS HEARTBREAKERS','A Amazing Yarn of a Sumo Wrestler And a Boat who must Conquer a Waitress in New Orleans',2006,1,NULL,5,'0.99',58,'17.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(733,'RIVER OUTLAW','A Thrilling Character Study of a Squirrel And a Lumberjack who must Face a Hunter in A MySQL Convention',2006,1,NULL,4,'0.99',149,'29.99','PG-13','Commentaries','2006-02-15 05:03:42'),(734,'ROAD ROXANNE','A Boring Character Study of a Waitress And a Astronaut who must Fight a Crocodile in Ancient Japan',2006,1,NULL,4,'4.99',158,'12.99','R','Behind the Scenes','2006-02-15 05:03:42'),(735,'ROBBERS JOON','A Thoughtful Story of a Mad Scientist And a Waitress who must Confront a Forensic Psychologist in Soviet Georgia',2006,1,NULL,7,'2.99',102,'26.99','PG-13','Commentaries','2006-02-15 05:03:42'),(736,'ROBBERY BRIGHT','A Taut Reflection of a Robot And a Squirrel who must Fight a Boat in Ancient Japan',2006,1,NULL,4,'0.99',134,'21.99','R','Trailers','2006-02-15 05:03:42'),(737,'ROCK INSTINCT','A Astounding Character Study of a Robot And a Moose who must Overcome a Astronaut in Ancient India',2006,1,NULL,4,'0.99',102,'28.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(738,'ROCKETEER MOTHER','A Awe-Inspiring Character Study of a Robot And a Sumo Wrestler who must Discover a Womanizer in A Shark Tank',2006,1,NULL,3,'0.99',178,'27.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(739,'ROCKY WAR','A Fast-Paced Display of a Squirrel And a Explorer who must Outgun a Mad Scientist in Nigeria',2006,1,NULL,4,'4.99',145,'17.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(740,'ROLLERCOASTER BRINGING','A Beautiful Drama of a Robot And a Lumberjack who must Discover a Technical Writer in A Shark Tank',2006,1,NULL,5,'2.99',153,'13.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(741,'ROMAN PUNK','A Thoughtful Panorama of a Mad Cow And a Student who must Battle a Forensic Psychologist in Berlin',2006,1,NULL,7,'0.99',81,'28.99','NC-17','Trailers','2006-02-15 05:03:42'),(742,'ROOF CHAMPION','A Lacklusture Reflection of a Car And a Explorer who must Find a Monkey in A Baloon',2006,1,NULL,7,'0.99',101,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(743,'ROOM ROMAN','A Awe-Inspiring Panorama of a Composer And a Secret Agent who must Sink a Composer in A Shark Tank',2006,1,NULL,7,'0.99',60,'27.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(744,'ROOTS REMEMBER','A Brilliant Drama of a Mad Cow And a Hunter who must Escape a Hunter in Berlin',2006,1,NULL,4,'0.99',89,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(745,'ROSES TREASURE','A Astounding Panorama of a Monkey And a Secret Agent who must Defeat a Woman in The First Manned Space Station',2006,1,NULL,5,'4.99',162,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(746,'ROUGE SQUAD','A Awe-Inspiring Drama of a Astronaut And a Frisbee who must Conquer a Mad Scientist in Australia',2006,1,NULL,3,'0.99',118,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(747,'ROXANNE REBEL','A Astounding Story of a Pastry Chef And a Database Administrator who must Fight a Man in The Outback',2006,1,NULL,5,'0.99',171,'9.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(748,'RUGRATS SHAKESPEARE','A Touching Saga of a Crocodile And a Crocodile who must Discover a Technical Writer in Nigeria',2006,1,NULL,4,'0.99',109,'16.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(749,'RULES HUMAN','A Beautiful Epistle of a Astronaut And a Student who must Confront a Monkey in An Abandoned Fun House',2006,1,NULL,6,'4.99',153,'19.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(750,'RUN PACIFIC','A Touching Tale of a Cat And a Pastry Chef who must Conquer a Pastry Chef in A MySQL Convention',2006,1,NULL,3,'0.99',145,'25.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(751,'RUNAWAY TENENBAUMS','A Thoughtful Documentary of a Boat And a Man who must Meet a Boat in An Abandoned Fun House',2006,1,NULL,6,'0.99',181,'17.99','NC-17','Commentaries','2006-02-15 05:03:42'),(752,'RUNNER MADIGAN','A Thoughtful Documentary of a Crocodile And a Robot who must Outrace a Womanizer in The Outback',2006,1,NULL,6,'0.99',101,'27.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(753,'RUSH GOODFELLAS','A Emotional Display of a Man And a Dentist who must Challenge a Squirrel in Australia',2006,1,NULL,3,'0.99',48,'20.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(754,'RUSHMORE MERMAID','A Boring Story of a Woman And a Moose who must Reach a Husband in A Shark Tank',2006,1,NULL,6,'2.99',150,'17.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(755,'SABRINA MIDNIGHT','A Emotional Story of a Squirrel And a Crocodile who must Succumb a Husband in The Sahara Desert',2006,1,NULL,5,'4.99',99,'11.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(756,'SADDLE ANTITRUST','A Stunning Epistle of a Feminist And a A Shark who must Battle a Woman in An Abandoned Fun House',2006,1,NULL,7,'2.99',80,'10.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(757,'SAGEBRUSH CLUELESS','A Insightful Story of a Lumberjack And a Hunter who must Kill a Boy in Ancient Japan',2006,1,NULL,4,'2.99',106,'28.99','G','Trailers','2006-02-15 05:03:42'),(758,'SAINTS BRIDE','A Fateful Tale of a Technical Writer And a Composer who must Pursue a Explorer in The Gulf of Mexico',2006,1,NULL,5,'2.99',125,'11.99','G','Deleted Scenes','2006-02-15 05:03:42'),(759,'SALUTE APOLLO','A Awe-Inspiring Character Study of a Boy And a Feminist who must Sink a Crocodile in Ancient China',2006,1,NULL,4,'2.99',73,'29.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(760,'SAMURAI LION','A Fast-Paced Story of a Pioneer And a Astronaut who must Reach a Boat in A Baloon',2006,1,NULL,5,'2.99',110,'21.99','G','Commentaries','2006-02-15 05:03:42'),(761,'SANTA PARIS','A Emotional Documentary of a Moose And a Car who must Redeem a Mad Cow in A Baloon Factory',2006,1,NULL,7,'2.99',154,'23.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(762,'SASSY PACKER','A Fast-Paced Documentary of a Dog And a Teacher who must Find a Moose in A Manhattan Penthouse',2006,1,NULL,6,'0.99',154,'29.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(763,'SATISFACTION CONFIDENTIAL','A Lacklusture Yarn of a Dentist And a Butler who must Meet a Secret Agent in Ancient China',2006,1,NULL,3,'4.99',75,'26.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(764,'SATURDAY LAMBS','A Thoughtful Reflection of a Mad Scientist And a Moose who must Kill a Husband in A Baloon',2006,1,NULL,3,'4.99',150,'28.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(765,'SATURN NAME','A Fateful Epistle of a Butler And a Boy who must Redeem a Teacher in Berlin',2006,1,NULL,7,'4.99',182,'18.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(766,'SAVANNAH TOWN','A Awe-Inspiring Tale of a Astronaut And a Database Administrator who must Chase a Secret Agent in The Gulf of Mexico',2006,1,NULL,5,'0.99',84,'25.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(767,'SCALAWAG DUCK','A Fateful Reflection of a Car And a Teacher who must Confront a Waitress in A Monastery',2006,1,NULL,6,'4.99',183,'13.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(768,'SCARFACE BANG','A Emotional Yarn of a Teacher And a Girl who must Find a Teacher in A Baloon Factory',2006,1,NULL,3,'4.99',102,'11.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(769,'SCHOOL JACKET','A Intrepid Yarn of a Monkey And a Boy who must Fight a Composer in A Manhattan Penthouse',2006,1,NULL,5,'4.99',151,'21.99','PG-13','Trailers','2006-02-15 05:03:42'),(770,'SCISSORHANDS SLUMS','A Awe-Inspiring Drama of a Girl And a Technical Writer who must Meet a Feminist in The Canadian Rockies',2006,1,NULL,5,'2.99',147,'13.99','G','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(771,'SCORPION APOLLO','A Awe-Inspiring Documentary of a Technical Writer And a Husband who must Meet a Monkey in An Abandoned Fun House',2006,1,NULL,3,'4.99',137,'23.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(772,'SEA VIRGIN','A Fast-Paced Documentary of a Technical Writer And a Pastry Chef who must Escape a Moose in A U-Boat',2006,1,NULL,4,'2.99',80,'24.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(773,'SEABISCUIT PUNK','A Insightful Saga of a Man And a Forensic Psychologist who must Discover a Mad Cow in A MySQL Convention',2006,1,NULL,6,'2.99',112,'28.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(774,'SEARCHERS WAIT','A Fast-Paced Tale of a Car And a Mad Scientist who must Kill a Womanizer in Ancient Japan',2006,1,NULL,3,'2.99',182,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(775,'SEATTLE EXPECATIONS','A Insightful Reflection of a Crocodile And a Sumo Wrestler who must Meet a Technical Writer in The Sahara Desert',2006,1,NULL,4,'4.99',110,'18.99','PG-13','Trailers','2006-02-15 05:03:42'),(776,'SECRET GROUNDHOG','A Astounding Story of a Cat And a Database Administrator who must Build a Technical Writer in New Orleans',2006,1,NULL,6,'4.99',90,'11.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(777,'SECRETARY ROUGE','A Action-Packed Panorama of a Mad Cow And a Composer who must Discover a Robot in A Baloon Factory',2006,1,NULL,5,'4.99',158,'10.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(778,'SECRETS PARADISE','A Fateful Saga of a Cat And a Frisbee who must Kill a Girl in A Manhattan Penthouse',2006,1,NULL,3,'4.99',109,'24.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(779,'SENSE GREEK','A Taut Saga of a Lumberjack And a Pastry Chef who must Escape a Sumo Wrestler in An Abandoned Fun House',2006,1,NULL,4,'4.99',54,'23.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(780,'SENSIBILITY REAR','A Emotional Tale of a Robot And a Sumo Wrestler who must Redeem a Pastry Chef in A Baloon Factory',2006,1,NULL,7,'4.99',98,'15.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(781,'SEVEN SWARM','A Unbelieveable Character Study of a Dog And a Mad Cow who must Kill a Monkey in Berlin',2006,1,NULL,4,'4.99',127,'15.99','R','Deleted Scenes','2006-02-15 05:03:42'),(782,'SHAKESPEARE SADDLE','A Fast-Paced Panorama of a Lumberjack And a Database Administrator who must Defeat a Madman in A MySQL Convention',2006,1,NULL,6,'2.99',60,'26.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(783,'SHANE DARKNESS','A Action-Packed Saga of a Moose And a Lumberjack who must Find a Woman in Berlin',2006,1,NULL,5,'2.99',93,'22.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(784,'SHANGHAI TYCOON','A Fast-Paced Character Study of a Crocodile And a Lumberjack who must Build a Husband in An Abandoned Fun House',2006,1,NULL,7,'2.99',47,'20.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(785,'SHAWSHANK BUBBLE','A Lacklusture Story of a Moose And a Monkey who must Confront a Butler in An Abandoned Amusement Park',2006,1,NULL,6,'4.99',80,'20.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(786,'SHEPHERD MIDSUMMER','A Thoughtful Drama of a Robot And a Womanizer who must Kill a Lumberjack in A Baloon',2006,1,NULL,7,'0.99',113,'14.99','R','Deleted Scenes','2006-02-15 05:03:42'),(787,'SHINING ROSES','A Awe-Inspiring Character Study of a Astronaut And a Forensic Psychologist who must Challenge a Madman in Ancient India',2006,1,NULL,4,'0.99',125,'12.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(788,'SHIP WONDERLAND','A Thrilling Saga of a Monkey And a Frisbee who must Escape a Explorer in The Outback',2006,1,NULL,5,'2.99',104,'15.99','R','Commentaries','2006-02-15 05:03:42'),(789,'SHOCK CABIN','A Fateful Tale of a Mad Cow And a Crocodile who must Meet a Husband in New Orleans',2006,1,NULL,7,'2.99',79,'15.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(790,'SHOOTIST SUPERFLY','A Fast-Paced Story of a Crocodile And a A Shark who must Sink a Pioneer in Berlin',2006,1,NULL,6,'0.99',67,'22.99','PG-13','Trailers','2006-02-15 05:03:42'),(791,'SHOW LORD','A Fanciful Saga of a Student And a Girl who must Find a Butler in Ancient Japan',2006,1,NULL,3,'4.99',167,'24.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(792,'SHREK LICENSE','A Fateful Yarn of a Secret Agent And a Feminist who must Find a Feminist in A Jet Boat',2006,1,NULL,7,'2.99',154,'15.99','PG-13','Commentaries','2006-02-15 05:03:42'),(793,'SHRUNK DIVINE','A Fateful Character Study of a Waitress And a Technical Writer who must Battle a Hunter in A Baloon',2006,1,NULL,6,'2.99',139,'14.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(794,'SIDE ARK','A Stunning Panorama of a Crocodile And a Womanizer who must Meet a Feminist in The Canadian Rockies',2006,1,NULL,5,'0.99',52,'28.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(795,'SIEGE MADRE','A Boring Tale of a Frisbee And a Crocodile who must Vanquish a Moose in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',111,'23.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(796,'SIERRA DIVIDE','A Emotional Character Study of a Frisbee And a Mad Scientist who must Build a Madman in California',2006,1,NULL,3,'0.99',135,'12.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(797,'SILENCE KANE','A Emotional Drama of a Sumo Wrestler And a Dentist who must Confront a Sumo Wrestler in A Baloon',2006,1,NULL,7,'0.99',67,'23.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(798,'SILVERADO GOLDFINGER','A Stunning Epistle of a Sumo Wrestler And a Man who must Challenge a Waitress in Ancient India',2006,1,NULL,4,'4.99',74,'11.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(799,'SIMON NORTH','A Thrilling Documentary of a Technical Writer And a A Shark who must Face a Pioneer in A Shark Tank',2006,1,NULL,3,'0.99',51,'26.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(800,'SINNERS ATLANTIS','A Epic Display of a Dog And a Boat who must Succumb a Mad Scientist in An Abandoned Mine Shaft',2006,1,NULL,7,'2.99',126,'19.99','PG-13','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(801,'SISTER FREDDY','A Stunning Saga of a Butler And a Woman who must Pursue a Explorer in Australia',2006,1,NULL,5,'4.99',152,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(802,'SKY MIRACLE','A Epic Drama of a Mad Scientist And a Explorer who must Succumb a Waitress in An Abandoned Fun House',2006,1,NULL,7,'2.99',132,'15.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(803,'SLACKER LIAISONS','A Fast-Paced Tale of a A Shark And a Student who must Meet a Crocodile in Ancient China',2006,1,NULL,7,'4.99',179,'29.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(804,'SLEEPING SUSPECTS','A Stunning Reflection of a Sumo Wrestler And a Explorer who must Sink a Frisbee in A MySQL Convention',2006,1,NULL,7,'4.99',129,'13.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(805,'SLEEPLESS MONSOON','A Amazing Saga of a Moose And a Pastry Chef who must Escape a Butler in Australia',2006,1,NULL,5,'4.99',64,'12.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(806,'SLEEPY JAPANESE','A Emotional Epistle of a Moose And a Composer who must Fight a Technical Writer in The Outback',2006,1,NULL,4,'2.99',137,'25.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(807,'SLEUTH ORIENT','A Fateful Character Study of a Husband And a Dog who must Find a Feminist in Ancient India',2006,1,NULL,4,'0.99',87,'25.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(808,'SLING LUKE','A Intrepid Character Study of a Robot And a Monkey who must Reach a Secret Agent in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',84,'10.99','R','Behind the Scenes','2006-02-15 05:03:42'),(809,'SLIPPER FIDELITY','A Taut Reflection of a Secret Agent And a Man who must Redeem a Explorer in A MySQL Convention',2006,1,NULL,5,'0.99',156,'14.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(810,'SLUMS DUCK','A Amazing Character Study of a Teacher And a Database Administrator who must Defeat a Waitress in A Jet Boat',2006,1,NULL,5,'0.99',147,'21.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(811,'SMILE EARRING','A Intrepid Drama of a Teacher And a Butler who must Build a Pastry Chef in Berlin',2006,1,NULL,4,'2.99',60,'29.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(812,'SMOKING BARBARELLA','A Lacklusture Saga of a Mad Cow And a Mad Scientist who must Sink a Cat in A MySQL Convention',2006,1,NULL,7,'0.99',50,'13.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(813,'SMOOCHY CONTROL','A Thrilling Documentary of a Husband And a Feminist who must Face a Mad Scientist in Ancient China',2006,1,NULL,7,'0.99',184,'18.99','R','Behind the Scenes','2006-02-15 05:03:42'),(814,'SNATCH SLIPPER','A Insightful Panorama of a Woman And a Feminist who must Defeat a Forensic Psychologist in Berlin',2006,1,NULL,6,'4.99',110,'15.99','PG','Commentaries','2006-02-15 05:03:42'),(815,'SNATCHERS MONTEZUMA','A Boring Epistle of a Sumo Wrestler And a Woman who must Escape a Man in The Canadian Rockies',2006,1,NULL,4,'2.99',74,'14.99','PG-13','Commentaries','2006-02-15 05:03:42'),(816,'SNOWMAN ROLLERCOASTER','A Fateful Display of a Lumberjack And a Girl who must Succumb a Mad Cow in A Manhattan Penthouse',2006,1,NULL,3,'0.99',62,'27.99','G','Trailers','2006-02-15 05:03:42'),(817,'SOLDIERS EVOLUTION','A Lacklusture Panorama of a A Shark And a Pioneer who must Confront a Student in The First Manned Space Station',2006,1,NULL,7,'4.99',185,'27.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(818,'SOMETHING DUCK','A Boring Character Study of a Car And a Husband who must Outgun a Frisbee in The First Manned Space Station',2006,1,NULL,4,'4.99',180,'17.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(819,'SONG HEDWIG','A Amazing Documentary of a Man And a Husband who must Confront a Squirrel in A MySQL Convention',2006,1,NULL,3,'0.99',165,'29.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(820,'SONS INTERVIEW','A Taut Character Study of a Explorer And a Mad Cow who must Battle a Hunter in Ancient China',2006,1,NULL,3,'2.99',184,'11.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(821,'SORORITY QUEEN','A Fast-Paced Display of a Squirrel And a Composer who must Fight a Forensic Psychologist in A Jet Boat',2006,1,NULL,6,'0.99',184,'17.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(822,'SOUP WISDOM','A Fast-Paced Display of a Robot And a Butler who must Defeat a Butler in A MySQL Convention',2006,1,NULL,6,'0.99',169,'12.99','R','Behind the Scenes','2006-02-15 05:03:42'),(823,'SOUTH WAIT','A Amazing Documentary of a Car And a Robot who must Escape a Lumberjack in An Abandoned Amusement Park',2006,1,NULL,4,'2.99',143,'21.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(824,'SPARTACUS CHEAPER','A Thrilling Panorama of a Pastry Chef And a Secret Agent who must Overcome a Student in A Manhattan Penthouse',2006,1,NULL,4,'4.99',52,'19.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(825,'SPEAKEASY DATE','A Lacklusture Drama of a Forensic Psychologist And a Car who must Redeem a Man in A Manhattan Penthouse',2006,1,NULL,6,'2.99',165,'22.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(826,'SPEED SUIT','A Brilliant Display of a Frisbee And a Mad Scientist who must Succumb a Robot in Ancient China',2006,1,NULL,7,'4.99',124,'19.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(827,'SPICE SORORITY','A Fateful Display of a Pioneer And a Hunter who must Defeat a Husband in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',141,'22.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(828,'SPIKING ELEMENT','A Lacklusture Epistle of a Dentist And a Technical Writer who must Find a Dog in A Monastery',2006,1,NULL,7,'2.99',79,'12.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(829,'SPINAL ROCKY','A Lacklusture Epistle of a Sumo Wrestler And a Squirrel who must Defeat a Explorer in California',2006,1,NULL,7,'2.99',138,'12.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(830,'SPIRIT FLINTSTONES','A Brilliant Yarn of a Cat And a Car who must Confront a Explorer in Ancient Japan',2006,1,NULL,7,'0.99',149,'23.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(831,'SPIRITED CASUALTIES','A Taut Story of a Waitress And a Man who must Face a Car in A Baloon Factory',2006,1,NULL,5,'0.99',138,'20.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(832,'SPLASH GUMP','A Taut Saga of a Crocodile And a Boat who must Conquer a Hunter in A Shark Tank',2006,1,NULL,5,'0.99',175,'16.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(833,'SPLENDOR PATTON','A Taut Story of a Dog And a Explorer who must Find a Astronaut in Berlin',2006,1,NULL,5,'0.99',134,'20.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(834,'SPOILERS HELLFIGHTERS','A Fanciful Story of a Technical Writer And a Squirrel who must Defeat a Dog in The Gulf of Mexico',2006,1,NULL,4,'0.99',151,'26.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(835,'SPY MILE','A Thrilling Documentary of a Feminist And a Feminist who must Confront a Feminist in A Baloon',2006,1,NULL,6,'2.99',112,'13.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(836,'SQUAD FISH','A Fast-Paced Display of a Pastry Chef And a Dog who must Kill a Teacher in Berlin',2006,1,NULL,3,'2.99',136,'14.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(837,'STAGE WORLD','A Lacklusture Panorama of a Woman And a Frisbee who must Chase a Crocodile in A Jet Boat',2006,1,NULL,4,'2.99',85,'19.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(838,'STAGECOACH ARMAGEDDON','A Touching Display of a Pioneer And a Butler who must Chase a Car in California',2006,1,NULL,5,'4.99',112,'25.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(839,'STALLION SUNDANCE','A Fast-Paced Tale of a Car And a Dog who must Outgun a A Shark in Australia',2006,1,NULL,5,'0.99',130,'23.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(840,'STAMPEDE DISTURBING','A Unbelieveable Tale of a Woman And a Lumberjack who must Fight a Frisbee in A U-Boat',2006,1,NULL,5,'0.99',75,'26.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(841,'STAR OPERATION','A Insightful Character Study of a Girl And a Car who must Pursue a Mad Cow in A Shark Tank',2006,1,NULL,5,'2.99',181,'9.99','PG','Commentaries','2006-02-15 05:03:42'),(842,'STATE WASTELAND','A Beautiful Display of a Cat And a Pastry Chef who must Outrace a Mad Cow in A Jet Boat',2006,1,NULL,4,'2.99',113,'13.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(843,'STEEL SANTA','A Fast-Paced Yarn of a Composer And a Frisbee who must Face a Moose in Nigeria',2006,1,NULL,4,'4.99',143,'15.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(844,'STEERS ARMAGEDDON','A Stunning Character Study of a Car And a Girl who must Succumb a Car in A MySQL Convention',2006,1,NULL,6,'4.99',140,'16.99','PG','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(845,'STEPMOM DREAM','A Touching Epistle of a Crocodile And a Teacher who must Build a Forensic Psychologist in A MySQL Convention',2006,1,NULL,7,'4.99',48,'9.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(846,'STING PERSONAL','A Fanciful Drama of a Frisbee And a Dog who must Fight a Madman in A Jet Boat',2006,1,NULL,3,'4.99',93,'9.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(847,'STOCK GLASS','A Boring Epistle of a Crocodile And a Lumberjack who must Outgun a Moose in Ancient China',2006,1,NULL,7,'2.99',160,'10.99','PG','Commentaries','2006-02-15 05:03:42'),(848,'STONE FIRE','A Intrepid Drama of a Astronaut And a Crocodile who must Find a Boat in Soviet Georgia',2006,1,NULL,3,'0.99',94,'19.99','G','Trailers','2006-02-15 05:03:42'),(849,'STORM HAPPINESS','A Insightful Drama of a Feminist And a A Shark who must Vanquish a Boat in A Shark Tank',2006,1,NULL,6,'0.99',57,'28.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(850,'STORY SIDE','A Lacklusture Saga of a Boy And a Cat who must Sink a Dentist in An Abandoned Mine Shaft',2006,1,NULL,7,'0.99',163,'27.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(851,'STRAIGHT HOURS','A Boring Panorama of a Secret Agent And a Girl who must Sink a Waitress in The Outback',2006,1,NULL,3,'0.99',151,'19.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(852,'STRANGELOVE DESIRE','A Awe-Inspiring Panorama of a Lumberjack And a Waitress who must Defeat a Crocodile in An Abandoned Amusement Park',2006,1,NULL,4,'0.99',103,'27.99','NC-17','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(853,'STRANGER STRANGERS','A Awe-Inspiring Yarn of a Womanizer And a Explorer who must Fight a Woman in The First Manned Space Station',2006,1,NULL,3,'4.99',139,'12.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(854,'STRANGERS GRAFFITI','A Brilliant Character Study of a Secret Agent And a Man who must Find a Cat in The Gulf of Mexico',2006,1,NULL,4,'4.99',119,'22.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(855,'STREAK RIDGEMONT','A Astounding Character Study of a Hunter And a Waitress who must Sink a Man in New Orleans',2006,1,NULL,7,'0.99',132,'28.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(856,'STREETCAR INTENTIONS','A Insightful Character Study of a Waitress And a Crocodile who must Sink a Waitress in The Gulf of Mexico',2006,1,NULL,5,'4.99',73,'11.99','R','Commentaries','2006-02-15 05:03:42'),(857,'STRICTLY SCARFACE','A Touching Reflection of a Crocodile And a Dog who must Chase a Hunter in An Abandoned Fun House',2006,1,NULL,3,'2.99',144,'24.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(858,'SUBMARINE BED','A Amazing Display of a Car And a Monkey who must Fight a Teacher in Soviet Georgia',2006,1,NULL,5,'4.99',127,'21.99','R','Trailers','2006-02-15 05:03:42'),(859,'SUGAR WONKA','A Touching Story of a Dentist And a Database Administrator who must Conquer a Astronaut in An Abandoned Amusement Park',2006,1,NULL,3,'4.99',114,'20.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(860,'SUICIDES SILENCE','A Emotional Character Study of a Car And a Girl who must Face a Composer in A U-Boat',2006,1,NULL,4,'4.99',93,'13.99','G','Deleted Scenes','2006-02-15 05:03:42'),(861,'SUIT WALLS','A Touching Panorama of a Lumberjack And a Frisbee who must Build a Dog in Australia',2006,1,NULL,3,'4.99',111,'12.99','R','Commentaries','2006-02-15 05:03:42'),(862,'SUMMER SCARFACE','A Emotional Panorama of a Lumberjack And a Hunter who must Meet a Girl in A Shark Tank',2006,1,NULL,5,'0.99',53,'25.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(863,'SUN CONFESSIONS','A Beautiful Display of a Mad Cow And a Dog who must Redeem a Waitress in An Abandoned Amusement Park',2006,1,NULL,5,'0.99',141,'9.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(864,'SUNDANCE INVASION','A Epic Drama of a Lumberjack And a Explorer who must Confront a Hunter in A Baloon Factory',2006,1,NULL,5,'0.99',92,'21.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(865,'SUNRISE LEAGUE','A Beautiful Epistle of a Madman And a Butler who must Face a Crocodile in A Manhattan Penthouse',2006,1,NULL,3,'4.99',135,'19.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(866,'SUNSET RACER','A Awe-Inspiring Reflection of a Astronaut And a A Shark who must Defeat a Forensic Psychologist in California',2006,1,NULL,6,'0.99',48,'28.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(867,'SUPER WYOMING','A Action-Packed Saga of a Pastry Chef And a Explorer who must Discover a A Shark in The Outback',2006,1,NULL,5,'4.99',58,'10.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(868,'SUPERFLY TRIP','A Beautiful Saga of a Lumberjack And a Teacher who must Build a Technical Writer in An Abandoned Fun House',2006,1,NULL,5,'0.99',114,'27.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(869,'SUSPECTS QUILLS','A Emotional Epistle of a Pioneer And a Crocodile who must Battle a Man in A Manhattan Penthouse',2006,1,NULL,4,'2.99',47,'22.99','PG','Trailers','2006-02-15 05:03:42'),(870,'SWARM GOLD','A Insightful Panorama of a Crocodile And a Boat who must Conquer a Sumo Wrestler in A MySQL Convention',2006,1,NULL,4,'0.99',123,'12.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(871,'SWEDEN SHINING','A Taut Documentary of a Car And a Robot who must Conquer a Boy in The Canadian Rockies',2006,1,NULL,6,'4.99',176,'19.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(872,'SWEET BROTHERHOOD','A Unbelieveable Epistle of a Sumo Wrestler And a Hunter who must Chase a Forensic Psychologist in A Baloon',2006,1,NULL,3,'2.99',185,'27.99','R','Deleted Scenes','2006-02-15 05:03:42'),(873,'SWEETHEARTS SUSPECTS','A Brilliant Character Study of a Frisbee And a Sumo Wrestler who must Confront a Woman in The Gulf of Mexico',2006,1,NULL,3,'0.99',108,'13.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(874,'TADPOLE PARK','A Beautiful Tale of a Frisbee And a Moose who must Vanquish a Dog in An Abandoned Amusement Park',2006,1,NULL,6,'2.99',155,'13.99','PG','Trailers,Commentaries','2006-02-15 05:03:42'),(875,'TALENTED HOMICIDE','A Lacklusture Panorama of a Dentist And a Forensic Psychologist who must Outrace a Pioneer in A U-Boat',2006,1,NULL,6,'0.99',173,'9.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(876,'TARZAN VIDEOTAPE','A Fast-Paced Display of a Lumberjack And a Mad Scientist who must Succumb a Sumo Wrestler in The Sahara Desert',2006,1,NULL,3,'2.99',91,'11.99','PG-13','Trailers','2006-02-15 05:03:42'),(877,'TAXI KICK','A Amazing Epistle of a Girl And a Woman who must Outrace a Waitress in Soviet Georgia',2006,1,NULL,4,'0.99',64,'23.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(878,'TEEN APOLLO','A Awe-Inspiring Drama of a Dog And a Man who must Escape a Robot in A Shark Tank',2006,1,NULL,3,'4.99',74,'25.99','G','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(879,'TELEGRAPH VOYAGE','A Fateful Yarn of a Husband And a Dog who must Battle a Waitress in A Jet Boat',2006,1,NULL,3,'4.99',148,'20.99','PG','Commentaries','2006-02-15 05:03:42'),(880,'TELEMARK HEARTBREAKERS','A Action-Packed Panorama of a Technical Writer And a Man who must Build a Forensic Psychologist in A Manhattan Penthouse',2006,1,NULL,6,'2.99',152,'9.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(881,'TEMPLE ATTRACTION','A Action-Packed Saga of a Forensic Psychologist And a Woman who must Battle a Womanizer in Soviet Georgia',2006,1,NULL,5,'4.99',71,'13.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(882,'TENENBAUMS COMMAND','A Taut Display of a Pioneer And a Man who must Reach a Girl in The Gulf of Mexico',2006,1,NULL,4,'0.99',99,'24.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(883,'TEQUILA PAST','A Action-Packed Panorama of a Mad Scientist And a Robot who must Challenge a Student in Nigeria',2006,1,NULL,6,'4.99',53,'17.99','PG','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(884,'TERMINATOR CLUB','A Touching Story of a Crocodile And a Girl who must Sink a Man in The Gulf of Mexico',2006,1,NULL,5,'4.99',88,'11.99','R','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(885,'TEXAS WATCH','A Awe-Inspiring Yarn of a Student And a Teacher who must Fight a Teacher in An Abandoned Amusement Park',2006,1,NULL,7,'0.99',179,'22.99','NC-17','Trailers','2006-02-15 05:03:42'),(886,'THEORY MERMAID','A Fateful Yarn of a Composer And a Monkey who must Vanquish a Womanizer in The First Manned Space Station',2006,1,NULL,5,'0.99',184,'9.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(887,'THIEF PELICAN','A Touching Documentary of a Madman And a Mad Scientist who must Outrace a Feminist in An Abandoned Mine Shaft',2006,1,NULL,5,'4.99',135,'28.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(888,'THIN SAGEBRUSH','A Emotional Drama of a Husband And a Lumberjack who must Build a Cat in Ancient India',2006,1,NULL,5,'4.99',53,'9.99','PG-13','Behind the Scenes','2006-02-15 05:03:42'),(889,'TIES HUNGER','A Insightful Saga of a Astronaut And a Explorer who must Pursue a Mad Scientist in A U-Boat',2006,1,NULL,3,'4.99',111,'28.99','R','Deleted Scenes','2006-02-15 05:03:42'),(890,'TIGHTS DAWN','A Thrilling Epistle of a Boat And a Secret Agent who must Face a Boy in A Baloon',2006,1,NULL,5,'0.99',172,'14.99','R','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(891,'TIMBERLAND SKY','A Boring Display of a Man And a Dog who must Redeem a Girl in A U-Boat',2006,1,NULL,3,'0.99',69,'13.99','G','Commentaries','2006-02-15 05:03:42'),(892,'TITANIC BOONDOCK','A Brilliant Reflection of a Feminist And a Dog who must Fight a Boy in A Baloon Factory',2006,1,NULL,3,'4.99',104,'18.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(893,'TITANS JERK','A Unbelieveable Panorama of a Feminist And a Sumo Wrestler who must Challenge a Technical Writer in Ancient China',2006,1,NULL,4,'4.99',91,'11.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(894,'TOMATOES HELLFIGHTERS','A Thoughtful Epistle of a Madman And a Astronaut who must Overcome a Monkey in A Shark Tank',2006,1,NULL,6,'0.99',68,'23.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(895,'TOMORROW HUSTLER','A Thoughtful Story of a Moose And a Husband who must Face a Secret Agent in The Sahara Desert',2006,1,NULL,3,'2.99',142,'21.99','R','Commentaries','2006-02-15 05:03:42'),(896,'TOOTSIE PILOT','A Awe-Inspiring Documentary of a Womanizer And a Pastry Chef who must Kill a Lumberjack in Berlin',2006,1,NULL,3,'0.99',157,'10.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(897,'TORQUE BOUND','A Emotional Display of a Crocodile And a Husband who must Reach a Man in Ancient Japan',2006,1,NULL,3,'4.99',179,'27.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(898,'TOURIST PELICAN','A Boring Story of a Butler And a Astronaut who must Outrace a Pioneer in Australia',2006,1,NULL,4,'4.99',152,'18.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(899,'TOWERS HURRICANE','A Fateful Display of a Monkey And a Car who must Sink a Husband in A MySQL Convention',2006,1,NULL,7,'0.99',144,'14.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(900,'TOWN ARK','A Awe-Inspiring Documentary of a Moose And a Madman who must Meet a Dog in An Abandoned Mine Shaft',2006,1,NULL,6,'2.99',136,'17.99','R','Behind the Scenes','2006-02-15 05:03:42'),(901,'TRACY CIDER','A Touching Reflection of a Database Administrator And a Madman who must Build a Lumberjack in Nigeria',2006,1,NULL,3,'0.99',142,'29.99','G','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(902,'TRADING PINOCCHIO','A Emotional Character Study of a Student And a Explorer who must Discover a Frisbee in The First Manned Space Station',2006,1,NULL,6,'4.99',170,'22.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(903,'TRAFFIC HOBBIT','A Amazing Epistle of a Squirrel And a Lumberjack who must Succumb a Database Administrator in A U-Boat',2006,1,NULL,5,'4.99',139,'13.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(904,'TRAIN BUNCH','A Thrilling Character Study of a Robot And a Squirrel who must Face a Dog in Ancient India',2006,1,NULL,3,'4.99',71,'26.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(905,'TRAINSPOTTING STRANGERS','A Fast-Paced Drama of a Pioneer And a Mad Cow who must Challenge a Madman in Ancient Japan',2006,1,NULL,7,'4.99',132,'10.99','PG-13','Trailers','2006-02-15 05:03:42'),(906,'TRAMP OTHERS','A Brilliant Display of a Composer And a Cat who must Succumb a A Shark in Ancient India',2006,1,NULL,4,'0.99',171,'27.99','PG','Deleted Scenes','2006-02-15 05:03:42'),(907,'TRANSLATION SUMMER','A Touching Reflection of a Man And a Monkey who must Pursue a Womanizer in A MySQL Convention',2006,1,NULL,4,'0.99',168,'10.99','PG-13','Trailers','2006-02-15 05:03:42'),(908,'TRAP GUYS','A Unbelieveable Story of a Boy And a Mad Cow who must Challenge a Database Administrator in The Sahara Desert',2006,1,NULL,3,'4.99',110,'11.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(909,'TREASURE COMMAND','A Emotional Saga of a Car And a Madman who must Discover a Pioneer in California',2006,1,NULL,3,'0.99',102,'28.99','PG-13','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(910,'TREATMENT JEKYLL','A Boring Story of a Teacher And a Student who must Outgun a Cat in An Abandoned Mine Shaft',2006,1,NULL,3,'0.99',87,'19.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(911,'TRIP NEWTON','A Fanciful Character Study of a Lumberjack And a Car who must Discover a Cat in An Abandoned Amusement Park',2006,1,NULL,7,'4.99',64,'14.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(912,'TROJAN TOMORROW','A Astounding Panorama of a Husband And a Sumo Wrestler who must Pursue a Boat in Ancient India',2006,1,NULL,3,'2.99',52,'9.99','PG','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(913,'TROOPERS METAL','A Fanciful Drama of a Monkey And a Feminist who must Sink a Man in Berlin',2006,1,NULL,3,'0.99',115,'20.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(914,'TROUBLE DATE','A Lacklusture Panorama of a Forensic Psychologist And a Woman who must Kill a Explorer in Ancient Japan',2006,1,NULL,6,'2.99',61,'13.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(915,'TRUMAN CRAZY','A Thrilling Epistle of a Moose And a Boy who must Meet a Database Administrator in A Monastery',2006,1,NULL,7,'4.99',92,'9.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(916,'TURN STAR','A Stunning Tale of a Man And a Monkey who must Chase a Student in New Orleans',2006,1,NULL,3,'2.99',80,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(917,'TUXEDO MILE','A Boring Drama of a Man And a Forensic Psychologist who must Face a Frisbee in Ancient India',2006,1,NULL,3,'2.99',152,'24.99','R','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(918,'TWISTED PIRATES','A Touching Display of a Frisbee And a Boat who must Kill a Girl in A MySQL Convention',2006,1,NULL,4,'4.99',152,'23.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(919,'TYCOON GATHERING','A Emotional Display of a Husband And a A Shark who must Succumb a Madman in A Manhattan Penthouse',2006,1,NULL,3,'4.99',82,'17.99','G','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(920,'UNBREAKABLE KARATE','A Amazing Character Study of a Robot And a Student who must Chase a Robot in Australia',2006,1,NULL,3,'0.99',62,'16.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(921,'UNCUT SUICIDES','A Intrepid Yarn of a Explorer And a Pastry Chef who must Pursue a Mad Cow in A U-Boat',2006,1,NULL,7,'2.99',172,'29.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(922,'UNDEFEATED DALMATIONS','A Unbelieveable Display of a Crocodile And a Feminist who must Overcome a Moose in An Abandoned Amusement Park',2006,1,NULL,7,'4.99',107,'22.99','PG-13','Commentaries','2006-02-15 05:03:42'),(923,'UNFAITHFUL KILL','A Taut Documentary of a Waitress And a Mad Scientist who must Battle a Technical Writer in New Orleans',2006,1,NULL,7,'2.99',78,'12.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(924,'UNFORGIVEN ZOOLANDER','A Taut Epistle of a Monkey And a Sumo Wrestler who must Vanquish a A Shark in A Baloon Factory',2006,1,NULL,7,'0.99',129,'15.99','PG','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(925,'UNITED PILOT','A Fast-Paced Reflection of a Cat And a Mad Cow who must Fight a Car in The Sahara Desert',2006,1,NULL,3,'0.99',164,'27.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(926,'UNTOUCHABLES SUNRISE','A Amazing Documentary of a Woman And a Astronaut who must Outrace a Teacher in An Abandoned Fun House',2006,1,NULL,5,'2.99',120,'11.99','NC-17','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(927,'UPRISING UPTOWN','A Fanciful Reflection of a Boy And a Butler who must Pursue a Woman in Berlin',2006,1,NULL,6,'2.99',174,'16.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(928,'UPTOWN YOUNG','A Fateful Documentary of a Dog And a Hunter who must Pursue a Teacher in An Abandoned Amusement Park',2006,1,NULL,5,'2.99',84,'16.99','PG','Commentaries','2006-02-15 05:03:42'),(929,'USUAL UNTOUCHABLES','A Touching Display of a Explorer And a Lumberjack who must Fight a Forensic Psychologist in A Shark Tank',2006,1,NULL,5,'4.99',128,'21.99','PG-13','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(930,'VACATION BOONDOCK','A Fanciful Character Study of a Secret Agent And a Mad Scientist who must Reach a Teacher in Australia',2006,1,NULL,4,'2.99',145,'23.99','R','Commentaries','2006-02-15 05:03:42'),(931,'VALENTINE VANISHING','A Thrilling Display of a Husband And a Butler who must Reach a Pastry Chef in California',2006,1,NULL,7,'0.99',48,'9.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(932,'VALLEY PACKER','A Astounding Documentary of a Astronaut And a Boy who must Outrace a Sumo Wrestler in Berlin',2006,1,NULL,3,'0.99',73,'21.99','G','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(933,'VAMPIRE WHALE','A Epic Story of a Lumberjack And a Monkey who must Confront a Pioneer in A MySQL Convention',2006,1,NULL,4,'4.99',126,'11.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(934,'VANILLA DAY','A Fast-Paced Saga of a Girl And a Forensic Psychologist who must Redeem a Girl in Nigeria',2006,1,NULL,7,'4.99',122,'20.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(935,'VANISHED GARDEN','A Intrepid Character Study of a Squirrel And a A Shark who must Kill a Lumberjack in California',2006,1,NULL,5,'0.99',142,'17.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(936,'VANISHING ROCKY','A Brilliant Reflection of a Man And a Woman who must Conquer a Pioneer in A MySQL Convention',2006,1,NULL,3,'2.99',123,'21.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(937,'VARSITY TRIP','A Action-Packed Character Study of a Astronaut And a Explorer who must Reach a Monkey in A MySQL Convention',2006,1,NULL,7,'2.99',85,'14.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(938,'VELVET TERMINATOR','A Lacklusture Tale of a Pastry Chef And a Technical Writer who must Confront a Crocodile in An Abandoned Amusement Park',2006,1,NULL,3,'4.99',173,'14.99','R','Behind the Scenes','2006-02-15 05:03:42'),(939,'VERTIGO NORTHWEST','A Unbelieveable Display of a Mad Scientist And a Mad Scientist who must Outgun a Mad Cow in Ancient Japan',2006,1,NULL,4,'2.99',90,'17.99','R','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(940,'VICTORY ACADEMY','A Insightful Epistle of a Mad Scientist And a Explorer who must Challenge a Cat in The Sahara Desert',2006,1,NULL,6,'0.99',64,'19.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(941,'VIDEOTAPE ARSENIC','A Lacklusture Display of a Girl And a Astronaut who must Succumb a Student in Australia',2006,1,NULL,4,'4.99',145,'10.99','NC-17','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(942,'VIETNAM SMOOCHY','A Lacklusture Display of a Butler And a Man who must Sink a Explorer in Soviet Georgia',2006,1,NULL,7,'0.99',174,'27.99','PG-13','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(943,'VILLAIN DESPERATE','A Boring Yarn of a Pioneer And a Feminist who must Redeem a Cat in An Abandoned Amusement Park',2006,1,NULL,4,'4.99',76,'27.99','PG-13','Trailers,Commentaries','2006-02-15 05:03:42'),(944,'VIRGIN DAISY','A Awe-Inspiring Documentary of a Robot And a Mad Scientist who must Reach a Database Administrator in A Shark Tank',2006,1,NULL,6,'4.99',179,'29.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(945,'VIRGINIAN PLUTO','A Emotional Panorama of a Dentist And a Crocodile who must Meet a Boy in Berlin',2006,1,NULL,5,'0.99',164,'22.99','R','Deleted Scenes','2006-02-15 05:03:42'),(946,'VIRTUAL SPOILERS','A Fateful Tale of a Database Administrator And a Squirrel who must Discover a Student in Soviet Georgia',2006,1,NULL,3,'4.99',144,'14.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(947,'VISION TORQUE','A Thoughtful Documentary of a Dog And a Man who must Sink a Man in A Shark Tank',2006,1,NULL,5,'0.99',59,'16.99','PG-13','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(948,'VOICE PEACH','A Amazing Panorama of a Pioneer And a Student who must Overcome a Mad Scientist in A Manhattan Penthouse',2006,1,NULL,6,'0.99',139,'22.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(949,'VOLCANO TEXAS','A Awe-Inspiring Yarn of a Hunter And a Feminist who must Challenge a Dentist in The Outback',2006,1,NULL,6,'0.99',157,'27.99','NC-17','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(950,'VOLUME HOUSE','A Boring Tale of a Dog And a Woman who must Meet a Dentist in California',2006,1,NULL,7,'4.99',132,'12.99','PG','Commentaries','2006-02-15 05:03:42'),(951,'VOYAGE LEGALLY','A Epic Tale of a Squirrel And a Hunter who must Conquer a Boy in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',78,'28.99','PG-13','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(952,'WAGON JAWS','A Intrepid Drama of a Moose And a Boat who must Kill a Explorer in A Manhattan Penthouse',2006,1,NULL,7,'2.99',152,'17.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(953,'WAIT CIDER','A Intrepid Epistle of a Woman And a Forensic Psychologist who must Succumb a Astronaut in A Manhattan Penthouse',2006,1,NULL,3,'0.99',112,'9.99','PG-13','Trailers','2006-02-15 05:03:42'),(954,'WAKE JAWS','A Beautiful Saga of a Feminist And a Composer who must Challenge a Moose in Berlin',2006,1,NULL,7,'4.99',73,'18.99','G','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(955,'WALLS ARTIST','A Insightful Panorama of a Teacher And a Teacher who must Overcome a Mad Cow in An Abandoned Fun House',2006,1,NULL,7,'4.99',135,'19.99','PG','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(956,'WANDA CHAMBER','A Insightful Drama of a A Shark And a Pioneer who must Find a Womanizer in The Outback',2006,1,NULL,7,'4.99',107,'23.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(957,'WAR NOTTING','A Boring Drama of a Teacher And a Sumo Wrestler who must Challenge a Secret Agent in The Canadian Rockies',2006,1,NULL,7,'4.99',80,'26.99','G','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(958,'WARDROBE PHANTOM','A Action-Packed Display of a Mad Cow And a Astronaut who must Kill a Car in Ancient India',2006,1,NULL,6,'2.99',178,'19.99','G','Trailers,Commentaries','2006-02-15 05:03:42'),(959,'WARLOCK WEREWOLF','A Astounding Yarn of a Pioneer And a Crocodile who must Defeat a A Shark in The Outback',2006,1,NULL,6,'2.99',83,'10.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(960,'WARS PLUTO','A Taut Reflection of a Teacher And a Database Administrator who must Chase a Madman in The Sahara Desert',2006,1,NULL,5,'2.99',128,'15.99','G','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(961,'WASH HEAVENLY','A Awe-Inspiring Reflection of a Cat And a Pioneer who must Escape a Hunter in Ancient China',2006,1,NULL,7,'4.99',161,'22.99','R','Commentaries','2006-02-15 05:03:42'),(962,'WASTELAND DIVINE','A Fanciful Story of a Database Administrator And a Womanizer who must Fight a Database Administrator in Ancient China',2006,1,NULL,7,'2.99',85,'18.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(963,'WATCH TRACY','A Fast-Paced Yarn of a Dog And a Frisbee who must Conquer a Hunter in Nigeria',2006,1,NULL,5,'0.99',78,'12.99','PG','Trailers,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(964,'WATERFRONT DELIVERANCE','A Unbelieveable Documentary of a Dentist And a Technical Writer who must Build a Womanizer in Nigeria',2006,1,NULL,4,'4.99',61,'17.99','G','Behind the Scenes','2006-02-15 05:03:42'),(965,'WATERSHIP FRONTIER','A Emotional Yarn of a Boat And a Crocodile who must Meet a Moose in Soviet Georgia',2006,1,NULL,6,'0.99',112,'28.99','G','Commentaries','2006-02-15 05:03:42'),(966,'WEDDING APOLLO','A Action-Packed Tale of a Student And a Waitress who must Conquer a Lumberjack in An Abandoned Mine Shaft',2006,1,NULL,3,'0.99',70,'14.99','PG','Trailers','2006-02-15 05:03:42'),(967,'WEEKEND PERSONAL','A Fast-Paced Documentary of a Car And a Butler who must Find a Frisbee in A Jet Boat',2006,1,NULL,5,'2.99',134,'26.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(968,'WEREWOLF LOLA','A Fanciful Story of a Man And a Sumo Wrestler who must Outrace a Student in A Monastery',2006,1,NULL,6,'4.99',79,'19.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(969,'WEST LION','A Intrepid Drama of a Butler And a Lumberjack who must Challenge a Database Administrator in A Manhattan Penthouse',2006,1,NULL,4,'4.99',159,'29.99','G','Trailers','2006-02-15 05:03:42'),(970,'WESTWARD SEABISCUIT','A Lacklusture Tale of a Butler And a Husband who must Face a Boy in Ancient China',2006,1,NULL,7,'0.99',52,'11.99','NC-17','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(971,'WHALE BIKINI','A Intrepid Story of a Pastry Chef And a Database Administrator who must Kill a Feminist in A MySQL Convention',2006,1,NULL,4,'4.99',109,'11.99','PG-13','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(972,'WHISPERER GIANT','A Intrepid Story of a Dentist And a Hunter who must Confront a Monkey in Ancient Japan',2006,1,NULL,4,'4.99',59,'24.99','PG-13','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(973,'WIFE TURN','A Awe-Inspiring Epistle of a Teacher And a Feminist who must Confront a Pioneer in Ancient Japan',2006,1,NULL,3,'4.99',183,'27.99','NC-17','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(974,'WILD APOLLO','A Beautiful Story of a Monkey And a Sumo Wrestler who must Conquer a A Shark in A MySQL Convention',2006,1,NULL,4,'0.99',181,'24.99','R','Trailers,Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(975,'WILLOW TRACY','A Brilliant Panorama of a Boat And a Astronaut who must Challenge a Teacher in A Manhattan Penthouse',2006,1,NULL,6,'2.99',137,'22.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(976,'WIND PHANTOM','A Touching Saga of a Madman And a Forensic Psychologist who must Build a Sumo Wrestler in An Abandoned Mine Shaft',2006,1,NULL,6,'0.99',111,'12.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(977,'WINDOW SIDE','A Astounding Character Study of a Womanizer And a Hunter who must Escape a Robot in A Monastery',2006,1,NULL,3,'2.99',85,'25.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(978,'WISDOM WORKER','A Unbelieveable Saga of a Forensic Psychologist And a Student who must Face a Squirrel in The First Manned Space Station',2006,1,NULL,3,'0.99',98,'12.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(979,'WITCHES PANIC','A Awe-Inspiring Drama of a Secret Agent And a Hunter who must Fight a Moose in Nigeria',2006,1,NULL,6,'4.99',100,'10.99','NC-17','Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(980,'WIZARD COLDBLOODED','A Lacklusture Display of a Robot And a Girl who must Defeat a Sumo Wrestler in A MySQL Convention',2006,1,NULL,4,'4.99',75,'12.99','PG','Commentaries,Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(981,'WOLVES DESIRE','A Fast-Paced Drama of a Squirrel And a Robot who must Succumb a Technical Writer in A Manhattan Penthouse',2006,1,NULL,7,'0.99',55,'13.99','NC-17','Behind the Scenes','2006-02-15 05:03:42'),(982,'WOMEN DORADO','A Insightful Documentary of a Waitress And a Butler who must Vanquish a Composer in Australia',2006,1,NULL,4,'0.99',126,'23.99','R','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(983,'WON DARES','A Unbelieveable Documentary of a Teacher And a Monkey who must Defeat a Explorer in A U-Boat',2006,1,NULL,7,'2.99',105,'18.99','PG','Behind the Scenes','2006-02-15 05:03:42'),(984,'WONDERFUL DROP','A Boring Panorama of a Woman And a Madman who must Overcome a Butler in A U-Boat',2006,1,NULL,3,'2.99',126,'20.99','NC-17','Commentaries','2006-02-15 05:03:42'),(985,'WONDERLAND CHRISTMAS','A Awe-Inspiring Character Study of a Waitress And a Car who must Pursue a Mad Scientist in The First Manned Space Station',2006,1,NULL,4,'4.99',111,'19.99','PG','Commentaries','2006-02-15 05:03:42'),(986,'WONKA SEA','A Brilliant Saga of a Boat And a Mad Scientist who must Meet a Moose in Ancient India',2006,1,NULL,6,'2.99',85,'24.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(987,'WORDS HUNTER','A Action-Packed Reflection of a Composer And a Mad Scientist who must Face a Pioneer in A MySQL Convention',2006,1,NULL,3,'2.99',116,'13.99','PG','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(988,'WORKER TARZAN','A Action-Packed Yarn of a Secret Agent And a Technical Writer who must Battle a Sumo Wrestler in The First Manned Space Station',2006,1,NULL,7,'2.99',139,'26.99','R','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'),(989,'WORKING MICROCOSMOS','A Stunning Epistle of a Dentist And a Dog who must Kill a Madman in Ancient China',2006,1,NULL,4,'4.99',74,'22.99','R','Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(990,'WORLD LEATHERNECKS','A Unbelieveable Tale of a Pioneer And a Astronaut who must Overcome a Robot in An Abandoned Amusement Park',2006,1,NULL,3,'0.99',171,'13.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(991,'WORST BANGER','A Thrilling Drama of a Madman And a Dentist who must Conquer a Boy in The Outback',2006,1,NULL,4,'2.99',185,'26.99','PG','Deleted Scenes,Behind the Scenes','2006-02-15 05:03:42'),(992,'WRATH MILE','A Intrepid Reflection of a Technical Writer And a Hunter who must Defeat a Sumo Wrestler in A Monastery',2006,1,NULL,5,'0.99',176,'17.99','NC-17','Trailers,Commentaries','2006-02-15 05:03:42'),(993,'WRONG BEHAVIOR','A Emotional Saga of a Crocodile And a Sumo Wrestler who must Discover a Mad Cow in New Orleans',2006,1,NULL,6,'2.99',178,'10.99','PG-13','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(994,'WYOMING STORM','A Awe-Inspiring Panorama of a Robot And a Boat who must Overcome a Feminist in A U-Boat',2006,1,NULL,6,'4.99',100,'29.99','PG-13','Deleted Scenes','2006-02-15 05:03:42'),(995,'YENTL IDAHO','A Amazing Display of a Robot And a Astronaut who must Fight a Womanizer in Berlin',2006,1,NULL,5,'4.99',86,'11.99','R','Trailers,Commentaries,Deleted Scenes','2006-02-15 05:03:42'),(996,'YOUNG LANGUAGE','A Unbelieveable Yarn of a Boat And a Database Administrator who must Meet a Boy in The First Manned Space Station',2006,1,NULL,6,'0.99',183,'9.99','G','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(997,'YOUTH KICK','A Touching Drama of a Teacher And a Cat who must Challenge a Technical Writer in A U-Boat',2006,1,NULL,4,'0.99',179,'14.99','NC-17','Trailers,Behind the Scenes','2006-02-15 05:03:42'),(998,'ZHIVAGO CORE','A Fateful Yarn of a Composer And a Man who must Face a Boy in The Canadian Rockies',2006,1,NULL,6,'0.99',105,'10.99','NC-17','Deleted Scenes','2006-02-15 05:03:42'),(999,'ZOOLANDER FICTION','A Fateful Reflection of a Waitress And a Boat who must Discover a Sumo Wrestler in Ancient China',2006,1,NULL,5,'2.99',101,'28.99','R','Trailers,Deleted Scenes','2006-02-15 05:03:42'),(1000,'ZORRO ARK','A Intrepid Panorama of a Mad Scientist And a Boy who must Redeem a Boy in A Monastery',2006,1,NULL,3,'4.99',50,'18.99','NC-17','Trailers,Commentaries,Behind the Scenes','2006-02-15 05:03:42'); +COMMIT; + +-- +-- Dumping data for table film_actor +-- + +SET AUTOCOMMIT=0; +INSERT INTO film_actor VALUES (1,1,'2006-02-15 05:05:03'),(1,23,'2006-02-15 05:05:03'),(1,25,'2006-02-15 05:05:03'),(1,106,'2006-02-15 05:05:03'),(1,140,'2006-02-15 05:05:03'),(1,166,'2006-02-15 05:05:03'),(1,277,'2006-02-15 05:05:03'),(1,361,'2006-02-15 05:05:03'),(1,438,'2006-02-15 05:05:03'),(1,499,'2006-02-15 05:05:03'),(1,506,'2006-02-15 05:05:03'),(1,509,'2006-02-15 05:05:03'),(1,605,'2006-02-15 05:05:03'),(1,635,'2006-02-15 05:05:03'),(1,749,'2006-02-15 05:05:03'),(1,832,'2006-02-15 05:05:03'),(1,939,'2006-02-15 05:05:03'),(1,970,'2006-02-15 05:05:03'),(1,980,'2006-02-15 05:05:03'),(2,3,'2006-02-15 05:05:03'),(2,31,'2006-02-15 05:05:03'),(2,47,'2006-02-15 05:05:03'),(2,105,'2006-02-15 05:05:03'),(2,132,'2006-02-15 05:05:03'),(2,145,'2006-02-15 05:05:03'),(2,226,'2006-02-15 05:05:03'),(2,249,'2006-02-15 05:05:03'),(2,314,'2006-02-15 05:05:03'),(2,321,'2006-02-15 05:05:03'),(2,357,'2006-02-15 05:05:03'),(2,369,'2006-02-15 05:05:03'),(2,399,'2006-02-15 05:05:03'),(2,458,'2006-02-15 05:05:03'),(2,481,'2006-02-15 05:05:03'),(2,485,'2006-02-15 05:05:03'),(2,518,'2006-02-15 05:05:03'),(2,540,'2006-02-15 05:05:03'),(2,550,'2006-02-15 05:05:03'),(2,555,'2006-02-15 05:05:03'),(2,561,'2006-02-15 05:05:03'),(2,742,'2006-02-15 05:05:03'),(2,754,'2006-02-15 05:05:03'),(2,811,'2006-02-15 05:05:03'),(2,958,'2006-02-15 05:05:03'),(3,17,'2006-02-15 05:05:03'),(3,40,'2006-02-15 05:05:03'),(3,42,'2006-02-15 05:05:03'),(3,87,'2006-02-15 05:05:03'),(3,111,'2006-02-15 05:05:03'),(3,185,'2006-02-15 05:05:03'),(3,289,'2006-02-15 05:05:03'),(3,329,'2006-02-15 05:05:03'),(3,336,'2006-02-15 05:05:03'),(3,341,'2006-02-15 05:05:03'),(3,393,'2006-02-15 05:05:03'),(3,441,'2006-02-15 05:05:03'),(3,453,'2006-02-15 05:05:03'),(3,480,'2006-02-15 05:05:03'),(3,539,'2006-02-15 05:05:03'),(3,618,'2006-02-15 05:05:03'),(3,685,'2006-02-15 05:05:03'),(3,827,'2006-02-15 05:05:03'),(3,966,'2006-02-15 05:05:03'),(3,967,'2006-02-15 05:05:03'),(3,971,'2006-02-15 05:05:03'),(3,996,'2006-02-15 05:05:03'),(4,23,'2006-02-15 05:05:03'),(4,25,'2006-02-15 05:05:03'),(4,56,'2006-02-15 05:05:03'),(4,62,'2006-02-15 05:05:03'),(4,79,'2006-02-15 05:05:03'),(4,87,'2006-02-15 05:05:03'),(4,355,'2006-02-15 05:05:03'),(4,379,'2006-02-15 05:05:03'),(4,398,'2006-02-15 05:05:03'),(4,463,'2006-02-15 05:05:03'),(4,490,'2006-02-15 05:05:03'),(4,616,'2006-02-15 05:05:03'),(4,635,'2006-02-15 05:05:03'),(4,691,'2006-02-15 05:05:03'),(4,712,'2006-02-15 05:05:03'),(4,714,'2006-02-15 05:05:03'),(4,721,'2006-02-15 05:05:03'),(4,798,'2006-02-15 05:05:03'),(4,832,'2006-02-15 05:05:03'),(4,858,'2006-02-15 05:05:03'),(4,909,'2006-02-15 05:05:03'),(4,924,'2006-02-15 05:05:03'),(5,19,'2006-02-15 05:05:03'),(5,54,'2006-02-15 05:05:03'),(5,85,'2006-02-15 05:05:03'),(5,146,'2006-02-15 05:05:03'),(5,171,'2006-02-15 05:05:03'),(5,172,'2006-02-15 05:05:03'),(5,202,'2006-02-15 05:05:03'),(5,203,'2006-02-15 05:05:03'),(5,286,'2006-02-15 05:05:03'),(5,288,'2006-02-15 05:05:03'),(5,316,'2006-02-15 05:05:03'),(5,340,'2006-02-15 05:05:03'),(5,369,'2006-02-15 05:05:03'),(5,375,'2006-02-15 05:05:03'),(5,383,'2006-02-15 05:05:03'),(5,392,'2006-02-15 05:05:03'),(5,411,'2006-02-15 05:05:03'),(5,503,'2006-02-15 05:05:03'),(5,535,'2006-02-15 05:05:03'),(5,571,'2006-02-15 05:05:03'),(5,650,'2006-02-15 05:05:03'),(5,665,'2006-02-15 05:05:03'),(5,687,'2006-02-15 05:05:03'),(5,730,'2006-02-15 05:05:03'),(5,732,'2006-02-15 05:05:03'),(5,811,'2006-02-15 05:05:03'),(5,817,'2006-02-15 05:05:03'),(5,841,'2006-02-15 05:05:03'),(5,865,'2006-02-15 05:05:03'),(6,29,'2006-02-15 05:05:03'),(6,53,'2006-02-15 05:05:03'),(6,60,'2006-02-15 05:05:03'),(6,70,'2006-02-15 05:05:03'),(6,112,'2006-02-15 05:05:03'),(6,164,'2006-02-15 05:05:03'),(6,165,'2006-02-15 05:05:03'),(6,193,'2006-02-15 05:05:03'),(6,256,'2006-02-15 05:05:03'),(6,451,'2006-02-15 05:05:03'),(6,503,'2006-02-15 05:05:03'),(6,509,'2006-02-15 05:05:03'),(6,517,'2006-02-15 05:05:03'),(6,519,'2006-02-15 05:05:03'),(6,605,'2006-02-15 05:05:03'),(6,692,'2006-02-15 05:05:03'),(6,826,'2006-02-15 05:05:03'),(6,892,'2006-02-15 05:05:03'),(6,902,'2006-02-15 05:05:03'),(6,994,'2006-02-15 05:05:03'),(7,25,'2006-02-15 05:05:03'),(7,27,'2006-02-15 05:05:03'),(7,35,'2006-02-15 05:05:03'),(7,67,'2006-02-15 05:05:03'),(7,96,'2006-02-15 05:05:03'),(7,170,'2006-02-15 05:05:03'),(7,173,'2006-02-15 05:05:03'),(7,217,'2006-02-15 05:05:03'),(7,218,'2006-02-15 05:05:03'),(7,225,'2006-02-15 05:05:03'),(7,292,'2006-02-15 05:05:03'),(7,351,'2006-02-15 05:05:03'),(7,414,'2006-02-15 05:05:03'),(7,463,'2006-02-15 05:05:03'),(7,554,'2006-02-15 05:05:03'),(7,618,'2006-02-15 05:05:03'),(7,633,'2006-02-15 05:05:03'),(7,637,'2006-02-15 05:05:03'),(7,691,'2006-02-15 05:05:03'),(7,758,'2006-02-15 05:05:03'),(7,766,'2006-02-15 05:05:03'),(7,770,'2006-02-15 05:05:03'),(7,805,'2006-02-15 05:05:03'),(7,806,'2006-02-15 05:05:03'),(7,846,'2006-02-15 05:05:03'),(7,900,'2006-02-15 05:05:03'),(7,901,'2006-02-15 05:05:03'),(7,910,'2006-02-15 05:05:03'),(7,957,'2006-02-15 05:05:03'),(7,959,'2006-02-15 05:05:03'),(8,47,'2006-02-15 05:05:03'),(8,115,'2006-02-15 05:05:03'),(8,158,'2006-02-15 05:05:03'),(8,179,'2006-02-15 05:05:03'),(8,195,'2006-02-15 05:05:03'),(8,205,'2006-02-15 05:05:03'),(8,255,'2006-02-15 05:05:03'),(8,263,'2006-02-15 05:05:03'),(8,321,'2006-02-15 05:05:03'),(8,396,'2006-02-15 05:05:03'),(8,458,'2006-02-15 05:05:03'),(8,523,'2006-02-15 05:05:03'),(8,532,'2006-02-15 05:05:03'),(8,554,'2006-02-15 05:05:03'),(8,752,'2006-02-15 05:05:03'),(8,769,'2006-02-15 05:05:03'),(8,771,'2006-02-15 05:05:03'),(8,859,'2006-02-15 05:05:03'),(8,895,'2006-02-15 05:05:03'),(8,936,'2006-02-15 05:05:03'),(9,30,'2006-02-15 05:05:03'),(9,74,'2006-02-15 05:05:03'),(9,147,'2006-02-15 05:05:03'),(9,148,'2006-02-15 05:05:03'),(9,191,'2006-02-15 05:05:03'),(9,200,'2006-02-15 05:05:03'),(9,204,'2006-02-15 05:05:03'),(9,434,'2006-02-15 05:05:03'),(9,510,'2006-02-15 05:05:03'),(9,514,'2006-02-15 05:05:03'),(9,552,'2006-02-15 05:05:03'),(9,650,'2006-02-15 05:05:03'),(9,671,'2006-02-15 05:05:03'),(9,697,'2006-02-15 05:05:03'),(9,722,'2006-02-15 05:05:03'),(9,752,'2006-02-15 05:05:03'),(9,811,'2006-02-15 05:05:03'),(9,815,'2006-02-15 05:05:03'),(9,865,'2006-02-15 05:05:03'),(9,873,'2006-02-15 05:05:03'),(9,889,'2006-02-15 05:05:03'),(9,903,'2006-02-15 05:05:03'),(9,926,'2006-02-15 05:05:03'),(9,964,'2006-02-15 05:05:03'),(9,974,'2006-02-15 05:05:03'),(10,1,'2006-02-15 05:05:03'),(10,9,'2006-02-15 05:05:03'),(10,191,'2006-02-15 05:05:03'),(10,236,'2006-02-15 05:05:03'),(10,251,'2006-02-15 05:05:03'),(10,366,'2006-02-15 05:05:03'),(10,477,'2006-02-15 05:05:03'),(10,480,'2006-02-15 05:05:03'),(10,522,'2006-02-15 05:05:03'),(10,530,'2006-02-15 05:05:03'),(10,587,'2006-02-15 05:05:03'),(10,694,'2006-02-15 05:05:03'),(10,703,'2006-02-15 05:05:03'),(10,716,'2006-02-15 05:05:03'),(10,782,'2006-02-15 05:05:03'),(10,914,'2006-02-15 05:05:03'),(10,929,'2006-02-15 05:05:03'),(10,930,'2006-02-15 05:05:03'),(10,964,'2006-02-15 05:05:03'),(10,966,'2006-02-15 05:05:03'),(10,980,'2006-02-15 05:05:03'),(10,983,'2006-02-15 05:05:03'),(11,118,'2006-02-15 05:05:03'),(11,205,'2006-02-15 05:05:03'),(11,281,'2006-02-15 05:05:03'),(11,283,'2006-02-15 05:05:03'),(11,348,'2006-02-15 05:05:03'),(11,364,'2006-02-15 05:05:03'),(11,395,'2006-02-15 05:05:03'),(11,429,'2006-02-15 05:05:03'),(11,433,'2006-02-15 05:05:03'),(11,453,'2006-02-15 05:05:03'),(11,485,'2006-02-15 05:05:03'),(11,532,'2006-02-15 05:05:03'),(11,567,'2006-02-15 05:05:03'),(11,587,'2006-02-15 05:05:03'),(11,597,'2006-02-15 05:05:03'),(11,636,'2006-02-15 05:05:03'),(11,709,'2006-02-15 05:05:03'),(11,850,'2006-02-15 05:05:03'),(11,854,'2006-02-15 05:05:03'),(11,888,'2006-02-15 05:05:03'),(11,896,'2006-02-15 05:05:03'),(11,928,'2006-02-15 05:05:03'),(11,938,'2006-02-15 05:05:03'),(11,969,'2006-02-15 05:05:03'),(11,988,'2006-02-15 05:05:03'),(12,16,'2006-02-15 05:05:03'),(12,17,'2006-02-15 05:05:03'),(12,34,'2006-02-15 05:05:03'),(12,37,'2006-02-15 05:05:03'),(12,91,'2006-02-15 05:05:03'),(12,92,'2006-02-15 05:05:03'),(12,107,'2006-02-15 05:05:03'),(12,155,'2006-02-15 05:05:03'),(12,177,'2006-02-15 05:05:03'),(12,208,'2006-02-15 05:05:03'),(12,213,'2006-02-15 05:05:03'),(12,216,'2006-02-15 05:05:03'),(12,243,'2006-02-15 05:05:03'),(12,344,'2006-02-15 05:05:03'),(12,400,'2006-02-15 05:05:03'),(12,416,'2006-02-15 05:05:03'),(12,420,'2006-02-15 05:05:03'),(12,457,'2006-02-15 05:05:03'),(12,513,'2006-02-15 05:05:03'),(12,540,'2006-02-15 05:05:03'),(12,593,'2006-02-15 05:05:03'),(12,631,'2006-02-15 05:05:03'),(12,635,'2006-02-15 05:05:03'),(12,672,'2006-02-15 05:05:03'),(12,716,'2006-02-15 05:05:03'),(12,728,'2006-02-15 05:05:03'),(12,812,'2006-02-15 05:05:03'),(12,838,'2006-02-15 05:05:03'),(12,871,'2006-02-15 05:05:03'),(12,880,'2006-02-15 05:05:03'),(12,945,'2006-02-15 05:05:03'),(13,17,'2006-02-15 05:05:03'),(13,29,'2006-02-15 05:05:03'),(13,45,'2006-02-15 05:05:03'),(13,87,'2006-02-15 05:05:03'),(13,110,'2006-02-15 05:05:03'),(13,144,'2006-02-15 05:05:03'),(13,154,'2006-02-15 05:05:03'),(13,162,'2006-02-15 05:05:03'),(13,203,'2006-02-15 05:05:03'),(13,254,'2006-02-15 05:05:03'),(13,337,'2006-02-15 05:05:03'),(13,346,'2006-02-15 05:05:03'),(13,381,'2006-02-15 05:05:03'),(13,385,'2006-02-15 05:05:03'),(13,427,'2006-02-15 05:05:03'),(13,456,'2006-02-15 05:05:03'),(13,513,'2006-02-15 05:05:03'),(13,515,'2006-02-15 05:05:03'),(13,522,'2006-02-15 05:05:03'),(13,524,'2006-02-15 05:05:03'),(13,528,'2006-02-15 05:05:03'),(13,571,'2006-02-15 05:05:03'),(13,588,'2006-02-15 05:05:03'),(13,597,'2006-02-15 05:05:03'),(13,600,'2006-02-15 05:05:03'),(13,718,'2006-02-15 05:05:03'),(13,729,'2006-02-15 05:05:03'),(13,816,'2006-02-15 05:05:03'),(13,817,'2006-02-15 05:05:03'),(13,832,'2006-02-15 05:05:03'),(13,833,'2006-02-15 05:05:03'),(13,843,'2006-02-15 05:05:03'),(13,897,'2006-02-15 05:05:03'),(13,966,'2006-02-15 05:05:03'),(13,998,'2006-02-15 05:05:03'),(14,154,'2006-02-15 05:05:03'),(14,187,'2006-02-15 05:05:03'),(14,232,'2006-02-15 05:05:03'),(14,241,'2006-02-15 05:05:03'),(14,253,'2006-02-15 05:05:03'),(14,255,'2006-02-15 05:05:03'),(14,258,'2006-02-15 05:05:03'),(14,284,'2006-02-15 05:05:03'),(14,292,'2006-02-15 05:05:03'),(14,370,'2006-02-15 05:05:03'),(14,415,'2006-02-15 05:05:03'),(14,417,'2006-02-15 05:05:03'),(14,418,'2006-02-15 05:05:03'),(14,454,'2006-02-15 05:05:03'),(14,472,'2006-02-15 05:05:03'),(14,475,'2006-02-15 05:05:03'),(14,495,'2006-02-15 05:05:03'),(14,536,'2006-02-15 05:05:03'),(14,537,'2006-02-15 05:05:03'),(14,612,'2006-02-15 05:05:03'),(14,688,'2006-02-15 05:05:03'),(14,759,'2006-02-15 05:05:03'),(14,764,'2006-02-15 05:05:03'),(14,847,'2006-02-15 05:05:03'),(14,856,'2006-02-15 05:05:03'),(14,890,'2006-02-15 05:05:03'),(14,908,'2006-02-15 05:05:03'),(14,919,'2006-02-15 05:05:03'),(14,948,'2006-02-15 05:05:03'),(14,970,'2006-02-15 05:05:03'),(15,31,'2006-02-15 05:05:03'),(15,89,'2006-02-15 05:05:03'),(15,91,'2006-02-15 05:05:03'),(15,108,'2006-02-15 05:05:03'),(15,125,'2006-02-15 05:05:03'),(15,236,'2006-02-15 05:05:03'),(15,275,'2006-02-15 05:05:03'),(15,280,'2006-02-15 05:05:03'),(15,326,'2006-02-15 05:05:03'),(15,342,'2006-02-15 05:05:03'),(15,414,'2006-02-15 05:05:03'),(15,445,'2006-02-15 05:05:03'),(15,500,'2006-02-15 05:05:03'),(15,502,'2006-02-15 05:05:03'),(15,541,'2006-02-15 05:05:03'),(15,553,'2006-02-15 05:05:03'),(15,594,'2006-02-15 05:05:03'),(15,626,'2006-02-15 05:05:03'),(15,635,'2006-02-15 05:05:03'),(15,745,'2006-02-15 05:05:03'),(15,783,'2006-02-15 05:05:03'),(15,795,'2006-02-15 05:05:03'),(15,817,'2006-02-15 05:05:03'),(15,886,'2006-02-15 05:05:03'),(15,924,'2006-02-15 05:05:03'),(15,949,'2006-02-15 05:05:03'),(15,968,'2006-02-15 05:05:03'),(15,985,'2006-02-15 05:05:03'),(16,80,'2006-02-15 05:05:03'),(16,87,'2006-02-15 05:05:03'),(16,101,'2006-02-15 05:05:03'),(16,121,'2006-02-15 05:05:03'),(16,155,'2006-02-15 05:05:03'),(16,177,'2006-02-15 05:05:03'),(16,218,'2006-02-15 05:05:03'),(16,221,'2006-02-15 05:05:03'),(16,267,'2006-02-15 05:05:03'),(16,269,'2006-02-15 05:05:03'),(16,271,'2006-02-15 05:05:03'),(16,280,'2006-02-15 05:05:03'),(16,287,'2006-02-15 05:05:03'),(16,345,'2006-02-15 05:05:03'),(16,438,'2006-02-15 05:05:03'),(16,453,'2006-02-15 05:05:03'),(16,455,'2006-02-15 05:05:03'),(16,456,'2006-02-15 05:05:03'),(16,503,'2006-02-15 05:05:03'),(16,548,'2006-02-15 05:05:03'),(16,582,'2006-02-15 05:05:03'),(16,583,'2006-02-15 05:05:03'),(16,717,'2006-02-15 05:05:03'),(16,758,'2006-02-15 05:05:03'),(16,779,'2006-02-15 05:05:03'),(16,886,'2006-02-15 05:05:03'),(16,967,'2006-02-15 05:05:03'),(17,96,'2006-02-15 05:05:03'),(17,119,'2006-02-15 05:05:03'),(17,124,'2006-02-15 05:05:03'),(17,127,'2006-02-15 05:05:03'),(17,154,'2006-02-15 05:05:03'),(17,199,'2006-02-15 05:05:03'),(17,201,'2006-02-15 05:05:03'),(17,236,'2006-02-15 05:05:03'),(17,280,'2006-02-15 05:05:03'),(17,310,'2006-02-15 05:05:03'),(17,313,'2006-02-15 05:05:03'),(17,378,'2006-02-15 05:05:03'),(17,457,'2006-02-15 05:05:03'),(17,469,'2006-02-15 05:05:03'),(17,478,'2006-02-15 05:05:03'),(17,500,'2006-02-15 05:05:03'),(17,515,'2006-02-15 05:05:03'),(17,521,'2006-02-15 05:05:03'),(17,573,'2006-02-15 05:05:03'),(17,603,'2006-02-15 05:05:03'),(17,606,'2006-02-15 05:05:03'),(17,734,'2006-02-15 05:05:03'),(17,770,'2006-02-15 05:05:03'),(17,794,'2006-02-15 05:05:03'),(17,800,'2006-02-15 05:05:03'),(17,853,'2006-02-15 05:05:03'),(17,873,'2006-02-15 05:05:03'),(17,874,'2006-02-15 05:05:03'),(17,880,'2006-02-15 05:05:03'),(17,948,'2006-02-15 05:05:03'),(17,957,'2006-02-15 05:05:03'),(17,959,'2006-02-15 05:05:03'),(18,44,'2006-02-15 05:05:03'),(18,84,'2006-02-15 05:05:03'),(18,144,'2006-02-15 05:05:03'),(18,172,'2006-02-15 05:05:03'),(18,268,'2006-02-15 05:05:03'),(18,279,'2006-02-15 05:05:03'),(18,280,'2006-02-15 05:05:03'),(18,321,'2006-02-15 05:05:03'),(18,386,'2006-02-15 05:05:03'),(18,460,'2006-02-15 05:05:03'),(18,462,'2006-02-15 05:05:03'),(18,484,'2006-02-15 05:05:03'),(18,536,'2006-02-15 05:05:03'),(18,561,'2006-02-15 05:05:03'),(18,612,'2006-02-15 05:05:03'),(18,717,'2006-02-15 05:05:03'),(18,808,'2006-02-15 05:05:03'),(18,842,'2006-02-15 05:05:03'),(18,863,'2006-02-15 05:05:03'),(18,883,'2006-02-15 05:05:03'),(18,917,'2006-02-15 05:05:03'),(18,944,'2006-02-15 05:05:03'),(19,2,'2006-02-15 05:05:03'),(19,3,'2006-02-15 05:05:03'),(19,144,'2006-02-15 05:05:03'),(19,152,'2006-02-15 05:05:03'),(19,182,'2006-02-15 05:05:03'),(19,208,'2006-02-15 05:05:03'),(19,212,'2006-02-15 05:05:03'),(19,217,'2006-02-15 05:05:03'),(19,266,'2006-02-15 05:05:03'),(19,404,'2006-02-15 05:05:03'),(19,428,'2006-02-15 05:05:03'),(19,473,'2006-02-15 05:05:03'),(19,490,'2006-02-15 05:05:03'),(19,510,'2006-02-15 05:05:03'),(19,513,'2006-02-15 05:05:03'),(19,644,'2006-02-15 05:05:03'),(19,670,'2006-02-15 05:05:03'),(19,673,'2006-02-15 05:05:03'),(19,711,'2006-02-15 05:05:03'),(19,750,'2006-02-15 05:05:03'),(19,752,'2006-02-15 05:05:03'),(19,756,'2006-02-15 05:05:03'),(19,771,'2006-02-15 05:05:03'),(19,785,'2006-02-15 05:05:03'),(19,877,'2006-02-15 05:05:03'),(20,1,'2006-02-15 05:05:03'),(20,54,'2006-02-15 05:05:03'),(20,63,'2006-02-15 05:05:03'),(20,140,'2006-02-15 05:05:03'),(20,146,'2006-02-15 05:05:03'),(20,165,'2006-02-15 05:05:03'),(20,231,'2006-02-15 05:05:03'),(20,243,'2006-02-15 05:05:03'),(20,269,'2006-02-15 05:05:03'),(20,274,'2006-02-15 05:05:03'),(20,348,'2006-02-15 05:05:03'),(20,366,'2006-02-15 05:05:03'),(20,445,'2006-02-15 05:05:03'),(20,478,'2006-02-15 05:05:03'),(20,492,'2006-02-15 05:05:03'),(20,499,'2006-02-15 05:05:03'),(20,527,'2006-02-15 05:05:03'),(20,531,'2006-02-15 05:05:03'),(20,538,'2006-02-15 05:05:03'),(20,589,'2006-02-15 05:05:03'),(20,643,'2006-02-15 05:05:03'),(20,652,'2006-02-15 05:05:03'),(20,663,'2006-02-15 05:05:03'),(20,714,'2006-02-15 05:05:03'),(20,717,'2006-02-15 05:05:03'),(20,757,'2006-02-15 05:05:03'),(20,784,'2006-02-15 05:05:03'),(20,863,'2006-02-15 05:05:03'),(20,962,'2006-02-15 05:05:03'),(20,977,'2006-02-15 05:05:03'),(21,6,'2006-02-15 05:05:03'),(21,87,'2006-02-15 05:05:03'),(21,88,'2006-02-15 05:05:03'),(21,142,'2006-02-15 05:05:03'),(21,159,'2006-02-15 05:05:03'),(21,179,'2006-02-15 05:05:03'),(21,253,'2006-02-15 05:05:03'),(21,281,'2006-02-15 05:05:03'),(21,321,'2006-02-15 05:05:03'),(21,398,'2006-02-15 05:05:03'),(21,426,'2006-02-15 05:05:03'),(21,429,'2006-02-15 05:05:03'),(21,497,'2006-02-15 05:05:03'),(21,507,'2006-02-15 05:05:03'),(21,530,'2006-02-15 05:05:03'),(21,680,'2006-02-15 05:05:03'),(21,686,'2006-02-15 05:05:03'),(21,700,'2006-02-15 05:05:03'),(21,702,'2006-02-15 05:05:03'),(21,733,'2006-02-15 05:05:03'),(21,734,'2006-02-15 05:05:03'),(21,798,'2006-02-15 05:05:03'),(21,804,'2006-02-15 05:05:03'),(21,887,'2006-02-15 05:05:03'),(21,893,'2006-02-15 05:05:03'),(21,920,'2006-02-15 05:05:03'),(21,983,'2006-02-15 05:05:03'),(22,9,'2006-02-15 05:05:03'),(22,23,'2006-02-15 05:05:03'),(22,56,'2006-02-15 05:05:03'),(22,89,'2006-02-15 05:05:03'),(22,111,'2006-02-15 05:05:03'),(22,146,'2006-02-15 05:05:03'),(22,291,'2006-02-15 05:05:03'),(22,294,'2006-02-15 05:05:03'),(22,349,'2006-02-15 05:05:03'),(22,369,'2006-02-15 05:05:03'),(22,418,'2006-02-15 05:05:03'),(22,430,'2006-02-15 05:05:03'),(22,483,'2006-02-15 05:05:03'),(22,491,'2006-02-15 05:05:03'),(22,495,'2006-02-15 05:05:03'),(22,536,'2006-02-15 05:05:03'),(22,600,'2006-02-15 05:05:03'),(22,634,'2006-02-15 05:05:03'),(22,648,'2006-02-15 05:05:03'),(22,688,'2006-02-15 05:05:03'),(22,731,'2006-02-15 05:05:03'),(22,742,'2006-02-15 05:05:03'),(22,775,'2006-02-15 05:05:03'),(22,802,'2006-02-15 05:05:03'),(22,912,'2006-02-15 05:05:03'),(22,964,'2006-02-15 05:05:03'),(23,6,'2006-02-15 05:05:03'),(23,42,'2006-02-15 05:05:03'),(23,78,'2006-02-15 05:05:03'),(23,105,'2006-02-15 05:05:03'),(23,116,'2006-02-15 05:05:03'),(23,117,'2006-02-15 05:05:03'),(23,125,'2006-02-15 05:05:03'),(23,212,'2006-02-15 05:05:03'),(23,226,'2006-02-15 05:05:03'),(23,235,'2006-02-15 05:05:03'),(23,254,'2006-02-15 05:05:03'),(23,367,'2006-02-15 05:05:03'),(23,370,'2006-02-15 05:05:03'),(23,414,'2006-02-15 05:05:03'),(23,419,'2006-02-15 05:05:03'),(23,435,'2006-02-15 05:05:03'),(23,449,'2006-02-15 05:05:03'),(23,491,'2006-02-15 05:05:03'),(23,536,'2006-02-15 05:05:03'),(23,549,'2006-02-15 05:05:03'),(23,636,'2006-02-15 05:05:03'),(23,649,'2006-02-15 05:05:03'),(23,673,'2006-02-15 05:05:03'),(23,691,'2006-02-15 05:05:03'),(23,766,'2006-02-15 05:05:03'),(23,782,'2006-02-15 05:05:03'),(23,804,'2006-02-15 05:05:03'),(23,820,'2006-02-15 05:05:03'),(23,826,'2006-02-15 05:05:03'),(23,833,'2006-02-15 05:05:03'),(23,842,'2006-02-15 05:05:03'),(23,853,'2006-02-15 05:05:03'),(23,855,'2006-02-15 05:05:03'),(23,856,'2006-02-15 05:05:03'),(23,935,'2006-02-15 05:05:03'),(23,981,'2006-02-15 05:05:03'),(23,997,'2006-02-15 05:05:03'),(24,3,'2006-02-15 05:05:03'),(24,83,'2006-02-15 05:05:03'),(24,112,'2006-02-15 05:05:03'),(24,126,'2006-02-15 05:05:03'),(24,148,'2006-02-15 05:05:03'),(24,164,'2006-02-15 05:05:03'),(24,178,'2006-02-15 05:05:03'),(24,194,'2006-02-15 05:05:03'),(24,199,'2006-02-15 05:05:03'),(24,242,'2006-02-15 05:05:03'),(24,256,'2006-02-15 05:05:03'),(24,277,'2006-02-15 05:05:03'),(24,335,'2006-02-15 05:05:03'),(24,405,'2006-02-15 05:05:03'),(24,463,'2006-02-15 05:05:03'),(24,515,'2006-02-15 05:05:03'),(24,585,'2006-02-15 05:05:03'),(24,603,'2006-02-15 05:05:03'),(24,653,'2006-02-15 05:05:03'),(24,704,'2006-02-15 05:05:03'),(24,781,'2006-02-15 05:05:03'),(24,829,'2006-02-15 05:05:03'),(24,832,'2006-02-15 05:05:03'),(24,969,'2006-02-15 05:05:03'),(25,21,'2006-02-15 05:05:03'),(25,86,'2006-02-15 05:05:03'),(25,153,'2006-02-15 05:05:03'),(25,179,'2006-02-15 05:05:03'),(25,204,'2006-02-15 05:05:03'),(25,213,'2006-02-15 05:05:03'),(25,226,'2006-02-15 05:05:03'),(25,245,'2006-02-15 05:05:03'),(25,311,'2006-02-15 05:05:03'),(25,404,'2006-02-15 05:05:03'),(25,411,'2006-02-15 05:05:03'),(25,420,'2006-02-15 05:05:03'),(25,538,'2006-02-15 05:05:03'),(25,564,'2006-02-15 05:05:03'),(25,583,'2006-02-15 05:05:03'),(25,606,'2006-02-15 05:05:03'),(25,688,'2006-02-15 05:05:03'),(25,697,'2006-02-15 05:05:03'),(25,755,'2006-02-15 05:05:03'),(25,871,'2006-02-15 05:05:03'),(25,914,'2006-02-15 05:05:03'),(26,9,'2006-02-15 05:05:03'),(26,21,'2006-02-15 05:05:03'),(26,34,'2006-02-15 05:05:03'),(26,90,'2006-02-15 05:05:03'),(26,93,'2006-02-15 05:05:03'),(26,103,'2006-02-15 05:05:03'),(26,147,'2006-02-15 05:05:03'),(26,186,'2006-02-15 05:05:03'),(26,201,'2006-02-15 05:05:03'),(26,225,'2006-02-15 05:05:03'),(26,241,'2006-02-15 05:05:03'),(26,327,'2006-02-15 05:05:03'),(26,329,'2006-02-15 05:05:03'),(26,340,'2006-02-15 05:05:03'),(26,345,'2006-02-15 05:05:03'),(26,390,'2006-02-15 05:05:03'),(26,392,'2006-02-15 05:05:03'),(26,529,'2006-02-15 05:05:03'),(26,544,'2006-02-15 05:05:03'),(26,564,'2006-02-15 05:05:03'),(26,635,'2006-02-15 05:05:03'),(26,644,'2006-02-15 05:05:03'),(26,682,'2006-02-15 05:05:03'),(26,688,'2006-02-15 05:05:03'),(26,715,'2006-02-15 05:05:03'),(26,732,'2006-02-15 05:05:03'),(26,758,'2006-02-15 05:05:03'),(26,764,'2006-02-15 05:05:03'),(26,795,'2006-02-15 05:05:03'),(26,821,'2006-02-15 05:05:03'),(26,885,'2006-02-15 05:05:03'),(26,904,'2006-02-15 05:05:03'),(26,906,'2006-02-15 05:05:03'),(27,19,'2006-02-15 05:05:03'),(27,34,'2006-02-15 05:05:03'),(27,85,'2006-02-15 05:05:03'),(27,150,'2006-02-15 05:05:03'),(27,172,'2006-02-15 05:05:03'),(27,273,'2006-02-15 05:05:03'),(27,334,'2006-02-15 05:05:03'),(27,347,'2006-02-15 05:05:03'),(27,359,'2006-02-15 05:05:03'),(27,398,'2006-02-15 05:05:03'),(27,415,'2006-02-15 05:05:03'),(27,462,'2006-02-15 05:05:03'),(27,477,'2006-02-15 05:05:03'),(27,500,'2006-02-15 05:05:03'),(27,503,'2006-02-15 05:05:03'),(27,540,'2006-02-15 05:05:03'),(27,586,'2006-02-15 05:05:03'),(27,593,'2006-02-15 05:05:03'),(27,637,'2006-02-15 05:05:03'),(27,679,'2006-02-15 05:05:03'),(27,682,'2006-02-15 05:05:03'),(27,695,'2006-02-15 05:05:03'),(27,771,'2006-02-15 05:05:03'),(27,805,'2006-02-15 05:05:03'),(27,830,'2006-02-15 05:05:03'),(27,854,'2006-02-15 05:05:03'),(27,873,'2006-02-15 05:05:03'),(27,880,'2006-02-15 05:05:03'),(27,889,'2006-02-15 05:05:03'),(27,904,'2006-02-15 05:05:03'),(27,967,'2006-02-15 05:05:03'),(27,986,'2006-02-15 05:05:03'),(27,996,'2006-02-15 05:05:03'),(28,14,'2006-02-15 05:05:03'),(28,43,'2006-02-15 05:05:03'),(28,58,'2006-02-15 05:05:03'),(28,74,'2006-02-15 05:05:03'),(28,96,'2006-02-15 05:05:03'),(28,107,'2006-02-15 05:05:03'),(28,259,'2006-02-15 05:05:03'),(28,263,'2006-02-15 05:05:03'),(28,287,'2006-02-15 05:05:03'),(28,358,'2006-02-15 05:05:03'),(28,502,'2006-02-15 05:05:03'),(28,508,'2006-02-15 05:05:03'),(28,532,'2006-02-15 05:05:03'),(28,551,'2006-02-15 05:05:03'),(28,574,'2006-02-15 05:05:03'),(28,597,'2006-02-15 05:05:03'),(28,619,'2006-02-15 05:05:03'),(28,625,'2006-02-15 05:05:03'),(28,652,'2006-02-15 05:05:03'),(28,679,'2006-02-15 05:05:03'),(28,743,'2006-02-15 05:05:03'),(28,790,'2006-02-15 05:05:03'),(28,793,'2006-02-15 05:05:03'),(28,816,'2006-02-15 05:05:03'),(28,827,'2006-02-15 05:05:03'),(28,835,'2006-02-15 05:05:03'),(28,879,'2006-02-15 05:05:03'),(28,908,'2006-02-15 05:05:03'),(28,953,'2006-02-15 05:05:03'),(28,973,'2006-02-15 05:05:03'),(28,994,'2006-02-15 05:05:03'),(29,10,'2006-02-15 05:05:03'),(29,79,'2006-02-15 05:05:03'),(29,105,'2006-02-15 05:05:03'),(29,110,'2006-02-15 05:05:03'),(29,131,'2006-02-15 05:05:03'),(29,133,'2006-02-15 05:05:03'),(29,172,'2006-02-15 05:05:03'),(29,226,'2006-02-15 05:05:03'),(29,273,'2006-02-15 05:05:03'),(29,282,'2006-02-15 05:05:03'),(29,296,'2006-02-15 05:05:03'),(29,311,'2006-02-15 05:05:03'),(29,335,'2006-02-15 05:05:03'),(29,342,'2006-02-15 05:05:03'),(29,436,'2006-02-15 05:05:03'),(29,444,'2006-02-15 05:05:03'),(29,449,'2006-02-15 05:05:03'),(29,462,'2006-02-15 05:05:03'),(29,482,'2006-02-15 05:05:03'),(29,488,'2006-02-15 05:05:03'),(29,519,'2006-02-15 05:05:03'),(29,547,'2006-02-15 05:05:03'),(29,590,'2006-02-15 05:05:03'),(29,646,'2006-02-15 05:05:03'),(29,723,'2006-02-15 05:05:03'),(29,812,'2006-02-15 05:05:03'),(29,862,'2006-02-15 05:05:03'),(29,928,'2006-02-15 05:05:03'),(29,944,'2006-02-15 05:05:03'),(30,1,'2006-02-15 05:05:03'),(30,53,'2006-02-15 05:05:03'),(30,64,'2006-02-15 05:05:03'),(30,69,'2006-02-15 05:05:03'),(30,77,'2006-02-15 05:05:03'),(30,87,'2006-02-15 05:05:03'),(30,260,'2006-02-15 05:05:03'),(30,262,'2006-02-15 05:05:03'),(30,286,'2006-02-15 05:05:03'),(30,292,'2006-02-15 05:05:03'),(30,301,'2006-02-15 05:05:03'),(30,318,'2006-02-15 05:05:03'),(30,321,'2006-02-15 05:05:03'),(30,357,'2006-02-15 05:05:03'),(30,565,'2006-02-15 05:05:03'),(30,732,'2006-02-15 05:05:03'),(30,797,'2006-02-15 05:05:03'),(30,838,'2006-02-15 05:05:03'),(30,945,'2006-02-15 05:05:03'),(31,88,'2006-02-15 05:05:03'),(31,146,'2006-02-15 05:05:03'),(31,163,'2006-02-15 05:05:03'),(31,164,'2006-02-15 05:05:03'),(31,188,'2006-02-15 05:05:03'),(31,299,'2006-02-15 05:05:03'),(31,308,'2006-02-15 05:05:03'),(31,368,'2006-02-15 05:05:03'),(31,380,'2006-02-15 05:05:03'),(31,431,'2006-02-15 05:05:03'),(31,585,'2006-02-15 05:05:03'),(31,637,'2006-02-15 05:05:03'),(31,700,'2006-02-15 05:05:03'),(31,739,'2006-02-15 05:05:03'),(31,793,'2006-02-15 05:05:03'),(31,802,'2006-02-15 05:05:03'),(31,880,'2006-02-15 05:05:03'),(31,978,'2006-02-15 05:05:03'),(32,65,'2006-02-15 05:05:03'),(32,84,'2006-02-15 05:05:03'),(32,103,'2006-02-15 05:05:03'),(32,112,'2006-02-15 05:05:03'),(32,136,'2006-02-15 05:05:03'),(32,197,'2006-02-15 05:05:03'),(32,199,'2006-02-15 05:05:03'),(32,219,'2006-02-15 05:05:03'),(32,309,'2006-02-15 05:05:03'),(32,312,'2006-02-15 05:05:03'),(32,401,'2006-02-15 05:05:03'),(32,427,'2006-02-15 05:05:03'),(32,431,'2006-02-15 05:05:03'),(32,523,'2006-02-15 05:05:03'),(32,567,'2006-02-15 05:05:03'),(32,585,'2006-02-15 05:05:03'),(32,606,'2006-02-15 05:05:03'),(32,651,'2006-02-15 05:05:03'),(32,667,'2006-02-15 05:05:03'),(32,669,'2006-02-15 05:05:03'),(32,815,'2006-02-15 05:05:03'),(32,928,'2006-02-15 05:05:03'),(32,980,'2006-02-15 05:05:03'),(33,56,'2006-02-15 05:05:03'),(33,112,'2006-02-15 05:05:03'),(33,135,'2006-02-15 05:05:03'),(33,154,'2006-02-15 05:05:03'),(33,214,'2006-02-15 05:05:03'),(33,252,'2006-02-15 05:05:03'),(33,305,'2006-02-15 05:05:03'),(33,306,'2006-02-15 05:05:03'),(33,473,'2006-02-15 05:05:03'),(33,489,'2006-02-15 05:05:03'),(33,574,'2006-02-15 05:05:03'),(33,618,'2006-02-15 05:05:03'),(33,667,'2006-02-15 05:05:03'),(33,694,'2006-02-15 05:05:03'),(33,712,'2006-02-15 05:05:03'),(33,735,'2006-02-15 05:05:03'),(33,737,'2006-02-15 05:05:03'),(33,754,'2006-02-15 05:05:03'),(33,775,'2006-02-15 05:05:03'),(33,878,'2006-02-15 05:05:03'),(33,881,'2006-02-15 05:05:03'),(33,965,'2006-02-15 05:05:03'),(33,972,'2006-02-15 05:05:03'),(33,993,'2006-02-15 05:05:03'),(34,43,'2006-02-15 05:05:03'),(34,90,'2006-02-15 05:05:03'),(34,119,'2006-02-15 05:05:03'),(34,125,'2006-02-15 05:05:03'),(34,172,'2006-02-15 05:05:03'),(34,182,'2006-02-15 05:05:03'),(34,244,'2006-02-15 05:05:03'),(34,336,'2006-02-15 05:05:03'),(34,389,'2006-02-15 05:05:03'),(34,393,'2006-02-15 05:05:03'),(34,438,'2006-02-15 05:05:03'),(34,493,'2006-02-15 05:05:03'),(34,502,'2006-02-15 05:05:03'),(34,525,'2006-02-15 05:05:03'),(34,668,'2006-02-15 05:05:03'),(34,720,'2006-02-15 05:05:03'),(34,779,'2006-02-15 05:05:03'),(34,788,'2006-02-15 05:05:03'),(34,794,'2006-02-15 05:05:03'),(34,836,'2006-02-15 05:05:03'),(34,846,'2006-02-15 05:05:03'),(34,853,'2006-02-15 05:05:03'),(34,929,'2006-02-15 05:05:03'),(34,950,'2006-02-15 05:05:03'),(34,971,'2006-02-15 05:05:03'),(35,10,'2006-02-15 05:05:03'),(35,35,'2006-02-15 05:05:03'),(35,52,'2006-02-15 05:05:03'),(35,201,'2006-02-15 05:05:03'),(35,256,'2006-02-15 05:05:03'),(35,389,'2006-02-15 05:05:03'),(35,589,'2006-02-15 05:05:03'),(35,612,'2006-02-15 05:05:03'),(35,615,'2006-02-15 05:05:03'),(35,707,'2006-02-15 05:05:03'),(35,732,'2006-02-15 05:05:03'),(35,738,'2006-02-15 05:05:03'),(35,748,'2006-02-15 05:05:03'),(35,817,'2006-02-15 05:05:03'),(35,914,'2006-02-15 05:05:03'),(36,15,'2006-02-15 05:05:03'),(36,81,'2006-02-15 05:05:03'),(36,171,'2006-02-15 05:05:03'),(36,231,'2006-02-15 05:05:03'),(36,245,'2006-02-15 05:05:03'),(36,283,'2006-02-15 05:05:03'),(36,380,'2006-02-15 05:05:03'),(36,381,'2006-02-15 05:05:03'),(36,387,'2006-02-15 05:05:03'),(36,390,'2006-02-15 05:05:03'),(36,410,'2006-02-15 05:05:03'),(36,426,'2006-02-15 05:05:03'),(36,427,'2006-02-15 05:05:03'),(36,453,'2006-02-15 05:05:03'),(36,466,'2006-02-15 05:05:03'),(36,484,'2006-02-15 05:05:03'),(36,493,'2006-02-15 05:05:03'),(36,499,'2006-02-15 05:05:03'),(36,569,'2006-02-15 05:05:03'),(36,590,'2006-02-15 05:05:03'),(36,600,'2006-02-15 05:05:03'),(36,714,'2006-02-15 05:05:03'),(36,715,'2006-02-15 05:05:03'),(36,716,'2006-02-15 05:05:03'),(36,731,'2006-02-15 05:05:03'),(36,875,'2006-02-15 05:05:03'),(36,915,'2006-02-15 05:05:03'),(36,931,'2006-02-15 05:05:03'),(36,956,'2006-02-15 05:05:03'),(37,10,'2006-02-15 05:05:03'),(37,12,'2006-02-15 05:05:03'),(37,19,'2006-02-15 05:05:03'),(37,118,'2006-02-15 05:05:03'),(37,119,'2006-02-15 05:05:03'),(37,122,'2006-02-15 05:05:03'),(37,146,'2006-02-15 05:05:03'),(37,204,'2006-02-15 05:05:03'),(37,253,'2006-02-15 05:05:03'),(37,260,'2006-02-15 05:05:03'),(37,277,'2006-02-15 05:05:03'),(37,317,'2006-02-15 05:05:03'),(37,467,'2006-02-15 05:05:03'),(37,477,'2006-02-15 05:05:03'),(37,485,'2006-02-15 05:05:03'),(37,508,'2006-02-15 05:05:03'),(37,529,'2006-02-15 05:05:03'),(37,553,'2006-02-15 05:05:03'),(37,555,'2006-02-15 05:05:03'),(37,572,'2006-02-15 05:05:03'),(37,588,'2006-02-15 05:05:03'),(37,662,'2006-02-15 05:05:03'),(37,663,'2006-02-15 05:05:03'),(37,694,'2006-02-15 05:05:03'),(37,697,'2006-02-15 05:05:03'),(37,785,'2006-02-15 05:05:03'),(37,839,'2006-02-15 05:05:03'),(37,840,'2006-02-15 05:05:03'),(37,853,'2006-02-15 05:05:03'),(37,900,'2006-02-15 05:05:03'),(37,925,'2006-02-15 05:05:03'),(37,963,'2006-02-15 05:05:03'),(37,966,'2006-02-15 05:05:03'),(37,989,'2006-02-15 05:05:03'),(37,997,'2006-02-15 05:05:03'),(38,24,'2006-02-15 05:05:03'),(38,111,'2006-02-15 05:05:03'),(38,160,'2006-02-15 05:05:03'),(38,176,'2006-02-15 05:05:03'),(38,223,'2006-02-15 05:05:03'),(38,241,'2006-02-15 05:05:03'),(38,274,'2006-02-15 05:05:03'),(38,335,'2006-02-15 05:05:03'),(38,338,'2006-02-15 05:05:03'),(38,353,'2006-02-15 05:05:03'),(38,448,'2006-02-15 05:05:03'),(38,450,'2006-02-15 05:05:03'),(38,458,'2006-02-15 05:05:03'),(38,501,'2006-02-15 05:05:03'),(38,516,'2006-02-15 05:05:03'),(38,547,'2006-02-15 05:05:03'),(38,583,'2006-02-15 05:05:03'),(38,618,'2006-02-15 05:05:03'),(38,619,'2006-02-15 05:05:03'),(38,705,'2006-02-15 05:05:03'),(38,793,'2006-02-15 05:05:03'),(38,827,'2006-02-15 05:05:03'),(38,839,'2006-02-15 05:05:03'),(38,853,'2006-02-15 05:05:03'),(38,876,'2006-02-15 05:05:03'),(39,71,'2006-02-15 05:05:03'),(39,73,'2006-02-15 05:05:03'),(39,168,'2006-02-15 05:05:03'),(39,203,'2006-02-15 05:05:03'),(39,222,'2006-02-15 05:05:03'),(39,290,'2006-02-15 05:05:03'),(39,293,'2006-02-15 05:05:03'),(39,320,'2006-02-15 05:05:03'),(39,415,'2006-02-15 05:05:03'),(39,425,'2006-02-15 05:05:03'),(39,431,'2006-02-15 05:05:03'),(39,456,'2006-02-15 05:05:03'),(39,476,'2006-02-15 05:05:03'),(39,559,'2006-02-15 05:05:03'),(39,587,'2006-02-15 05:05:03'),(39,598,'2006-02-15 05:05:03'),(39,606,'2006-02-15 05:05:03'),(39,648,'2006-02-15 05:05:03'),(39,683,'2006-02-15 05:05:03'),(39,689,'2006-02-15 05:05:03'),(39,696,'2006-02-15 05:05:03'),(39,700,'2006-02-15 05:05:03'),(39,703,'2006-02-15 05:05:03'),(39,736,'2006-02-15 05:05:03'),(39,772,'2006-02-15 05:05:03'),(39,815,'2006-02-15 05:05:03'),(39,831,'2006-02-15 05:05:03'),(39,920,'2006-02-15 05:05:03'),(40,1,'2006-02-15 05:05:03'),(40,11,'2006-02-15 05:05:03'),(40,34,'2006-02-15 05:05:03'),(40,107,'2006-02-15 05:05:03'),(40,128,'2006-02-15 05:05:03'),(40,163,'2006-02-15 05:05:03'),(40,177,'2006-02-15 05:05:03'),(40,223,'2006-02-15 05:05:03'),(40,233,'2006-02-15 05:05:03'),(40,326,'2006-02-15 05:05:03'),(40,374,'2006-02-15 05:05:03'),(40,394,'2006-02-15 05:05:03'),(40,396,'2006-02-15 05:05:03'),(40,463,'2006-02-15 05:05:03'),(40,466,'2006-02-15 05:05:03'),(40,494,'2006-02-15 05:05:03'),(40,521,'2006-02-15 05:05:03'),(40,723,'2006-02-15 05:05:03'),(40,737,'2006-02-15 05:05:03'),(40,744,'2006-02-15 05:05:03'),(40,747,'2006-02-15 05:05:03'),(40,754,'2006-02-15 05:05:03'),(40,799,'2006-02-15 05:05:03'),(40,835,'2006-02-15 05:05:03'),(40,868,'2006-02-15 05:05:03'),(40,869,'2006-02-15 05:05:03'),(40,887,'2006-02-15 05:05:03'),(40,933,'2006-02-15 05:05:03'),(40,938,'2006-02-15 05:05:03'),(41,4,'2006-02-15 05:05:03'),(41,60,'2006-02-15 05:05:03'),(41,69,'2006-02-15 05:05:03'),(41,86,'2006-02-15 05:05:03'),(41,100,'2006-02-15 05:05:03'),(41,150,'2006-02-15 05:05:03'),(41,159,'2006-02-15 05:05:03'),(41,194,'2006-02-15 05:05:03'),(41,203,'2006-02-15 05:05:03'),(41,212,'2006-02-15 05:05:03'),(41,230,'2006-02-15 05:05:03'),(41,249,'2006-02-15 05:05:03'),(41,252,'2006-02-15 05:05:03'),(41,305,'2006-02-15 05:05:03'),(41,336,'2006-02-15 05:05:03'),(41,383,'2006-02-15 05:05:03'),(41,544,'2006-02-15 05:05:03'),(41,596,'2006-02-15 05:05:03'),(41,657,'2006-02-15 05:05:03'),(41,674,'2006-02-15 05:05:03'),(41,678,'2006-02-15 05:05:03'),(41,721,'2006-02-15 05:05:03'),(41,724,'2006-02-15 05:05:03'),(41,779,'2006-02-15 05:05:03'),(41,784,'2006-02-15 05:05:03'),(41,799,'2006-02-15 05:05:03'),(41,894,'2006-02-15 05:05:03'),(41,912,'2006-02-15 05:05:03'),(41,942,'2006-02-15 05:05:03'),(42,24,'2006-02-15 05:05:03'),(42,139,'2006-02-15 05:05:03'),(42,309,'2006-02-15 05:05:03'),(42,320,'2006-02-15 05:05:03'),(42,333,'2006-02-15 05:05:03'),(42,500,'2006-02-15 05:05:03'),(42,502,'2006-02-15 05:05:03'),(42,505,'2006-02-15 05:05:03'),(42,527,'2006-02-15 05:05:03'),(42,535,'2006-02-15 05:05:03'),(42,546,'2006-02-15 05:05:03'),(42,568,'2006-02-15 05:05:03'),(42,648,'2006-02-15 05:05:03'),(42,665,'2006-02-15 05:05:03'),(42,673,'2006-02-15 05:05:03'),(42,687,'2006-02-15 05:05:03'),(42,713,'2006-02-15 05:05:03'),(42,738,'2006-02-15 05:05:03'),(42,798,'2006-02-15 05:05:03'),(42,861,'2006-02-15 05:05:03'),(42,865,'2006-02-15 05:05:03'),(42,867,'2006-02-15 05:05:03'),(42,876,'2006-02-15 05:05:03'),(42,890,'2006-02-15 05:05:03'),(42,907,'2006-02-15 05:05:03'),(42,922,'2006-02-15 05:05:03'),(42,932,'2006-02-15 05:05:03'),(43,19,'2006-02-15 05:05:03'),(43,42,'2006-02-15 05:05:03'),(43,56,'2006-02-15 05:05:03'),(43,89,'2006-02-15 05:05:03'),(43,105,'2006-02-15 05:05:03'),(43,147,'2006-02-15 05:05:03'),(43,161,'2006-02-15 05:05:03'),(43,180,'2006-02-15 05:05:03'),(43,239,'2006-02-15 05:05:03'),(43,276,'2006-02-15 05:05:03'),(43,330,'2006-02-15 05:05:03'),(43,344,'2006-02-15 05:05:03'),(43,359,'2006-02-15 05:05:03'),(43,377,'2006-02-15 05:05:03'),(43,410,'2006-02-15 05:05:03'),(43,462,'2006-02-15 05:05:03'),(43,533,'2006-02-15 05:05:03'),(43,598,'2006-02-15 05:05:03'),(43,605,'2006-02-15 05:05:03'),(43,608,'2006-02-15 05:05:03'),(43,621,'2006-02-15 05:05:03'),(43,753,'2006-02-15 05:05:03'),(43,827,'2006-02-15 05:05:03'),(43,833,'2006-02-15 05:05:03'),(43,917,'2006-02-15 05:05:03'),(43,958,'2006-02-15 05:05:03'),(44,58,'2006-02-15 05:05:03'),(44,84,'2006-02-15 05:05:03'),(44,88,'2006-02-15 05:05:03'),(44,94,'2006-02-15 05:05:03'),(44,109,'2006-02-15 05:05:03'),(44,176,'2006-02-15 05:05:03'),(44,242,'2006-02-15 05:05:03'),(44,273,'2006-02-15 05:05:03'),(44,322,'2006-02-15 05:05:03'),(44,420,'2006-02-15 05:05:03'),(44,434,'2006-02-15 05:05:03'),(44,490,'2006-02-15 05:05:03'),(44,591,'2006-02-15 05:05:03'),(44,598,'2006-02-15 05:05:03'),(44,604,'2006-02-15 05:05:03'),(44,699,'2006-02-15 05:05:03'),(44,751,'2006-02-15 05:05:03'),(44,784,'2006-02-15 05:05:03'),(44,825,'2006-02-15 05:05:03'),(44,854,'2006-02-15 05:05:03'),(44,875,'2006-02-15 05:05:03'),(44,878,'2006-02-15 05:05:03'),(44,883,'2006-02-15 05:05:03'),(44,896,'2006-02-15 05:05:03'),(44,902,'2006-02-15 05:05:03'),(44,937,'2006-02-15 05:05:03'),(44,944,'2006-02-15 05:05:03'),(44,952,'2006-02-15 05:05:03'),(44,982,'2006-02-15 05:05:03'),(44,998,'2006-02-15 05:05:03'),(45,18,'2006-02-15 05:05:03'),(45,65,'2006-02-15 05:05:03'),(45,66,'2006-02-15 05:05:03'),(45,115,'2006-02-15 05:05:03'),(45,117,'2006-02-15 05:05:03'),(45,164,'2006-02-15 05:05:03'),(45,187,'2006-02-15 05:05:03'),(45,198,'2006-02-15 05:05:03'),(45,219,'2006-02-15 05:05:03'),(45,330,'2006-02-15 05:05:03'),(45,407,'2006-02-15 05:05:03'),(45,416,'2006-02-15 05:05:03'),(45,463,'2006-02-15 05:05:03'),(45,467,'2006-02-15 05:05:03'),(45,484,'2006-02-15 05:05:03'),(45,502,'2006-02-15 05:05:03'),(45,503,'2006-02-15 05:05:03'),(45,508,'2006-02-15 05:05:03'),(45,537,'2006-02-15 05:05:03'),(45,680,'2006-02-15 05:05:03'),(45,714,'2006-02-15 05:05:03'),(45,767,'2006-02-15 05:05:03'),(45,778,'2006-02-15 05:05:03'),(45,797,'2006-02-15 05:05:03'),(45,810,'2006-02-15 05:05:03'),(45,895,'2006-02-15 05:05:03'),(45,900,'2006-02-15 05:05:03'),(45,901,'2006-02-15 05:05:03'),(45,920,'2006-02-15 05:05:03'),(45,925,'2006-02-15 05:05:03'),(45,975,'2006-02-15 05:05:03'),(45,978,'2006-02-15 05:05:03'),(46,38,'2006-02-15 05:05:03'),(46,51,'2006-02-15 05:05:03'),(46,174,'2006-02-15 05:05:03'),(46,254,'2006-02-15 05:05:03'),(46,296,'2006-02-15 05:05:03'),(46,319,'2006-02-15 05:05:03'),(46,407,'2006-02-15 05:05:03'),(46,448,'2006-02-15 05:05:03'),(46,456,'2006-02-15 05:05:03'),(46,463,'2006-02-15 05:05:03'),(46,478,'2006-02-15 05:05:03'),(46,538,'2006-02-15 05:05:03'),(46,540,'2006-02-15 05:05:03'),(46,567,'2006-02-15 05:05:03'),(46,731,'2006-02-15 05:05:03'),(46,766,'2006-02-15 05:05:03'),(46,768,'2006-02-15 05:05:03'),(46,820,'2006-02-15 05:05:03'),(46,829,'2006-02-15 05:05:03'),(46,830,'2006-02-15 05:05:03'),(46,836,'2006-02-15 05:05:03'),(46,889,'2006-02-15 05:05:03'),(46,980,'2006-02-15 05:05:03'),(46,991,'2006-02-15 05:05:03'),(47,25,'2006-02-15 05:05:03'),(47,36,'2006-02-15 05:05:03'),(47,53,'2006-02-15 05:05:03'),(47,67,'2006-02-15 05:05:03'),(47,172,'2006-02-15 05:05:03'),(47,233,'2006-02-15 05:05:03'),(47,273,'2006-02-15 05:05:03'),(47,351,'2006-02-15 05:05:03'),(47,385,'2006-02-15 05:05:03'),(47,484,'2006-02-15 05:05:03'),(47,508,'2006-02-15 05:05:03'),(47,576,'2006-02-15 05:05:03'),(47,670,'2006-02-15 05:05:03'),(47,734,'2006-02-15 05:05:03'),(47,737,'2006-02-15 05:05:03'),(47,770,'2006-02-15 05:05:03'),(47,777,'2006-02-15 05:05:03'),(47,787,'2006-02-15 05:05:03'),(47,790,'2006-02-15 05:05:03'),(47,913,'2006-02-15 05:05:03'),(47,923,'2006-02-15 05:05:03'),(47,924,'2006-02-15 05:05:03'),(47,944,'2006-02-15 05:05:03'),(47,973,'2006-02-15 05:05:03'),(48,99,'2006-02-15 05:05:03'),(48,101,'2006-02-15 05:05:03'),(48,134,'2006-02-15 05:05:03'),(48,150,'2006-02-15 05:05:03'),(48,164,'2006-02-15 05:05:03'),(48,211,'2006-02-15 05:05:03'),(48,245,'2006-02-15 05:05:03'),(48,267,'2006-02-15 05:05:03'),(48,287,'2006-02-15 05:05:03'),(48,295,'2006-02-15 05:05:03'),(48,312,'2006-02-15 05:05:03'),(48,315,'2006-02-15 05:05:03'),(48,345,'2006-02-15 05:05:03'),(48,349,'2006-02-15 05:05:03'),(48,428,'2006-02-15 05:05:03'),(48,506,'2006-02-15 05:05:03'),(48,545,'2006-02-15 05:05:03'),(48,559,'2006-02-15 05:05:03'),(48,570,'2006-02-15 05:05:03'),(48,599,'2006-02-15 05:05:03'),(48,645,'2006-02-15 05:05:03'),(48,705,'2006-02-15 05:05:03'),(48,757,'2006-02-15 05:05:03'),(48,792,'2006-02-15 05:05:03'),(48,922,'2006-02-15 05:05:03'),(48,926,'2006-02-15 05:05:03'),(49,31,'2006-02-15 05:05:03'),(49,151,'2006-02-15 05:05:03'),(49,195,'2006-02-15 05:05:03'),(49,207,'2006-02-15 05:05:03'),(49,250,'2006-02-15 05:05:03'),(49,282,'2006-02-15 05:05:03'),(49,348,'2006-02-15 05:05:03'),(49,391,'2006-02-15 05:05:03'),(49,400,'2006-02-15 05:05:03'),(49,407,'2006-02-15 05:05:03'),(49,423,'2006-02-15 05:05:03'),(49,433,'2006-02-15 05:05:03'),(49,469,'2006-02-15 05:05:03'),(49,506,'2006-02-15 05:05:03'),(49,542,'2006-02-15 05:05:03'),(49,558,'2006-02-15 05:05:03'),(49,579,'2006-02-15 05:05:03'),(49,595,'2006-02-15 05:05:03'),(49,662,'2006-02-15 05:05:03'),(49,709,'2006-02-15 05:05:03'),(49,716,'2006-02-15 05:05:03'),(49,725,'2006-02-15 05:05:03'),(49,729,'2006-02-15 05:05:03'),(49,811,'2006-02-15 05:05:03'),(49,927,'2006-02-15 05:05:03'),(49,977,'2006-02-15 05:05:03'),(49,980,'2006-02-15 05:05:03'),(50,111,'2006-02-15 05:05:03'),(50,178,'2006-02-15 05:05:03'),(50,243,'2006-02-15 05:05:03'),(50,248,'2006-02-15 05:05:03'),(50,274,'2006-02-15 05:05:03'),(50,288,'2006-02-15 05:05:03'),(50,303,'2006-02-15 05:05:03'),(50,306,'2006-02-15 05:05:03'),(50,327,'2006-02-15 05:05:03'),(50,372,'2006-02-15 05:05:03'),(50,401,'2006-02-15 05:05:03'),(50,417,'2006-02-15 05:05:03'),(50,420,'2006-02-15 05:05:03'),(50,437,'2006-02-15 05:05:03'),(50,476,'2006-02-15 05:05:03'),(50,504,'2006-02-15 05:05:03'),(50,520,'2006-02-15 05:05:03'),(50,552,'2006-02-15 05:05:03'),(50,591,'2006-02-15 05:05:03'),(50,621,'2006-02-15 05:05:03'),(50,632,'2006-02-15 05:05:03'),(50,645,'2006-02-15 05:05:03'),(50,672,'2006-02-15 05:05:03'),(50,717,'2006-02-15 05:05:03'),(50,732,'2006-02-15 05:05:03'),(50,795,'2006-02-15 05:05:03'),(50,829,'2006-02-15 05:05:03'),(50,840,'2006-02-15 05:05:03'),(50,897,'2006-02-15 05:05:03'),(50,918,'2006-02-15 05:05:03'),(50,924,'2006-02-15 05:05:03'),(50,957,'2006-02-15 05:05:03'),(51,5,'2006-02-15 05:05:03'),(51,63,'2006-02-15 05:05:03'),(51,103,'2006-02-15 05:05:03'),(51,112,'2006-02-15 05:05:03'),(51,121,'2006-02-15 05:05:03'),(51,153,'2006-02-15 05:05:03'),(51,395,'2006-02-15 05:05:03'),(51,408,'2006-02-15 05:05:03'),(51,420,'2006-02-15 05:05:03'),(51,461,'2006-02-15 05:05:03'),(51,490,'2006-02-15 05:05:03'),(51,525,'2006-02-15 05:05:03'),(51,627,'2006-02-15 05:05:03'),(51,678,'2006-02-15 05:05:03'),(51,733,'2006-02-15 05:05:03'),(51,734,'2006-02-15 05:05:03'),(51,737,'2006-02-15 05:05:03'),(51,750,'2006-02-15 05:05:03'),(51,847,'2006-02-15 05:05:03'),(51,891,'2006-02-15 05:05:03'),(51,895,'2006-02-15 05:05:03'),(51,940,'2006-02-15 05:05:03'),(51,974,'2006-02-15 05:05:03'),(51,990,'2006-02-15 05:05:03'),(51,993,'2006-02-15 05:05:03'),(52,20,'2006-02-15 05:05:03'),(52,92,'2006-02-15 05:05:03'),(52,96,'2006-02-15 05:05:03'),(52,108,'2006-02-15 05:05:03'),(52,203,'2006-02-15 05:05:03'),(52,249,'2006-02-15 05:05:03'),(52,341,'2006-02-15 05:05:03'),(52,376,'2006-02-15 05:05:03'),(52,388,'2006-02-15 05:05:03'),(52,407,'2006-02-15 05:05:03'),(52,424,'2006-02-15 05:05:03'),(52,474,'2006-02-15 05:05:03'),(52,515,'2006-02-15 05:05:03'),(52,517,'2006-02-15 05:05:03'),(52,584,'2006-02-15 05:05:03'),(52,596,'2006-02-15 05:05:03'),(52,664,'2006-02-15 05:05:03'),(52,675,'2006-02-15 05:05:03'),(52,689,'2006-02-15 05:05:03'),(52,714,'2006-02-15 05:05:03'),(52,812,'2006-02-15 05:05:03'),(52,878,'2006-02-15 05:05:03'),(52,879,'2006-02-15 05:05:03'),(52,915,'2006-02-15 05:05:03'),(52,951,'2006-02-15 05:05:03'),(52,999,'2006-02-15 05:05:03'),(53,1,'2006-02-15 05:05:03'),(53,9,'2006-02-15 05:05:03'),(53,51,'2006-02-15 05:05:03'),(53,58,'2006-02-15 05:05:03'),(53,109,'2006-02-15 05:05:03'),(53,122,'2006-02-15 05:05:03'),(53,126,'2006-02-15 05:05:03'),(53,181,'2006-02-15 05:05:03'),(53,256,'2006-02-15 05:05:03'),(53,268,'2006-02-15 05:05:03'),(53,285,'2006-02-15 05:05:03'),(53,307,'2006-02-15 05:05:03'),(53,358,'2006-02-15 05:05:03'),(53,386,'2006-02-15 05:05:03'),(53,447,'2006-02-15 05:05:03'),(53,465,'2006-02-15 05:05:03'),(53,490,'2006-02-15 05:05:03'),(53,492,'2006-02-15 05:05:03'),(53,508,'2006-02-15 05:05:03'),(53,518,'2006-02-15 05:05:03'),(53,573,'2006-02-15 05:05:03'),(53,576,'2006-02-15 05:05:03'),(53,577,'2006-02-15 05:05:03'),(53,697,'2006-02-15 05:05:03'),(53,725,'2006-02-15 05:05:03'),(53,727,'2006-02-15 05:05:03'),(53,937,'2006-02-15 05:05:03'),(53,947,'2006-02-15 05:05:03'),(53,961,'2006-02-15 05:05:03'),(53,980,'2006-02-15 05:05:03'),(54,84,'2006-02-15 05:05:03'),(54,129,'2006-02-15 05:05:03'),(54,150,'2006-02-15 05:05:03'),(54,184,'2006-02-15 05:05:03'),(54,285,'2006-02-15 05:05:03'),(54,292,'2006-02-15 05:05:03'),(54,301,'2006-02-15 05:05:03'),(54,348,'2006-02-15 05:05:03'),(54,489,'2006-02-15 05:05:03'),(54,510,'2006-02-15 05:05:03'),(54,524,'2006-02-15 05:05:03'),(54,546,'2006-02-15 05:05:03'),(54,600,'2006-02-15 05:05:03'),(54,636,'2006-02-15 05:05:03'),(54,649,'2006-02-15 05:05:03'),(54,658,'2006-02-15 05:05:03'),(54,754,'2006-02-15 05:05:03'),(54,764,'2006-02-15 05:05:03'),(54,842,'2006-02-15 05:05:03'),(54,858,'2006-02-15 05:05:03'),(54,861,'2006-02-15 05:05:03'),(54,913,'2006-02-15 05:05:03'),(54,970,'2006-02-15 05:05:03'),(54,988,'2006-02-15 05:05:03'),(54,990,'2006-02-15 05:05:03'),(55,8,'2006-02-15 05:05:03'),(55,27,'2006-02-15 05:05:03'),(55,75,'2006-02-15 05:05:03'),(55,197,'2006-02-15 05:05:03'),(55,307,'2006-02-15 05:05:03'),(55,320,'2006-02-15 05:05:03'),(55,340,'2006-02-15 05:05:03'),(55,403,'2006-02-15 05:05:03'),(55,485,'2006-02-15 05:05:03'),(55,486,'2006-02-15 05:05:03'),(55,603,'2006-02-15 05:05:03'),(55,612,'2006-02-15 05:05:03'),(55,620,'2006-02-15 05:05:03'),(55,709,'2006-02-15 05:05:03'),(55,776,'2006-02-15 05:05:03'),(55,790,'2006-02-15 05:05:03'),(55,815,'2006-02-15 05:05:03'),(55,827,'2006-02-15 05:05:03'),(55,930,'2006-02-15 05:05:03'),(55,963,'2006-02-15 05:05:03'),(56,63,'2006-02-15 05:05:03'),(56,87,'2006-02-15 05:05:03'),(56,226,'2006-02-15 05:05:03'),(56,236,'2006-02-15 05:05:03'),(56,298,'2006-02-15 05:05:03'),(56,307,'2006-02-15 05:05:03'),(56,354,'2006-02-15 05:05:03'),(56,383,'2006-02-15 05:05:03'),(56,417,'2006-02-15 05:05:03'),(56,421,'2006-02-15 05:05:03'),(56,457,'2006-02-15 05:05:03'),(56,462,'2006-02-15 05:05:03'),(56,474,'2006-02-15 05:05:03'),(56,521,'2006-02-15 05:05:03'),(56,593,'2006-02-15 05:05:03'),(56,728,'2006-02-15 05:05:03'),(56,750,'2006-02-15 05:05:03'),(56,769,'2006-02-15 05:05:03'),(56,781,'2006-02-15 05:05:03'),(56,795,'2006-02-15 05:05:03'),(56,844,'2006-02-15 05:05:03'),(56,851,'2006-02-15 05:05:03'),(56,862,'2006-02-15 05:05:03'),(56,868,'2006-02-15 05:05:03'),(56,892,'2006-02-15 05:05:03'),(56,893,'2006-02-15 05:05:03'),(56,936,'2006-02-15 05:05:03'),(56,965,'2006-02-15 05:05:03'),(57,16,'2006-02-15 05:05:03'),(57,34,'2006-02-15 05:05:03'),(57,101,'2006-02-15 05:05:03'),(57,114,'2006-02-15 05:05:03'),(57,122,'2006-02-15 05:05:03'),(57,134,'2006-02-15 05:05:03'),(57,144,'2006-02-15 05:05:03'),(57,153,'2006-02-15 05:05:03'),(57,192,'2006-02-15 05:05:03'),(57,213,'2006-02-15 05:05:03'),(57,258,'2006-02-15 05:05:03'),(57,267,'2006-02-15 05:05:03'),(57,317,'2006-02-15 05:05:03'),(57,340,'2006-02-15 05:05:03'),(57,393,'2006-02-15 05:05:03'),(57,437,'2006-02-15 05:05:03'),(57,447,'2006-02-15 05:05:03'),(57,502,'2006-02-15 05:05:03'),(57,592,'2006-02-15 05:05:03'),(57,605,'2006-02-15 05:05:03'),(57,637,'2006-02-15 05:05:03'),(57,685,'2006-02-15 05:05:03'),(57,707,'2006-02-15 05:05:03'),(57,714,'2006-02-15 05:05:03'),(57,717,'2006-02-15 05:05:03'),(57,737,'2006-02-15 05:05:03'),(57,767,'2006-02-15 05:05:03'),(57,852,'2006-02-15 05:05:03'),(57,891,'2006-02-15 05:05:03'),(57,918,'2006-02-15 05:05:03'),(58,48,'2006-02-15 05:05:03'),(58,68,'2006-02-15 05:05:03'),(58,119,'2006-02-15 05:05:03'),(58,128,'2006-02-15 05:05:03'),(58,135,'2006-02-15 05:05:03'),(58,175,'2006-02-15 05:05:03'),(58,199,'2006-02-15 05:05:03'),(58,235,'2006-02-15 05:05:03'),(58,242,'2006-02-15 05:05:03'),(58,243,'2006-02-15 05:05:03'),(58,254,'2006-02-15 05:05:03'),(58,306,'2006-02-15 05:05:03'),(58,316,'2006-02-15 05:05:03'),(58,417,'2006-02-15 05:05:03'),(58,426,'2006-02-15 05:05:03'),(58,460,'2006-02-15 05:05:03'),(58,477,'2006-02-15 05:05:03'),(58,541,'2006-02-15 05:05:03'),(58,549,'2006-02-15 05:05:03'),(58,551,'2006-02-15 05:05:03'),(58,553,'2006-02-15 05:05:03'),(58,578,'2006-02-15 05:05:03'),(58,602,'2006-02-15 05:05:03'),(58,632,'2006-02-15 05:05:03'),(58,635,'2006-02-15 05:05:03'),(58,638,'2006-02-15 05:05:03'),(58,698,'2006-02-15 05:05:03'),(58,726,'2006-02-15 05:05:03'),(58,755,'2006-02-15 05:05:03'),(58,800,'2006-02-15 05:05:03'),(58,856,'2006-02-15 05:05:03'),(58,858,'2006-02-15 05:05:03'),(59,5,'2006-02-15 05:05:03'),(59,46,'2006-02-15 05:05:03'),(59,54,'2006-02-15 05:05:03'),(59,72,'2006-02-15 05:05:03'),(59,88,'2006-02-15 05:05:03'),(59,121,'2006-02-15 05:05:03'),(59,129,'2006-02-15 05:05:03'),(59,130,'2006-02-15 05:05:03'),(59,183,'2006-02-15 05:05:03'),(59,210,'2006-02-15 05:05:03'),(59,241,'2006-02-15 05:05:03'),(59,295,'2006-02-15 05:05:03'),(59,418,'2006-02-15 05:05:03'),(59,572,'2006-02-15 05:05:03'),(59,644,'2006-02-15 05:05:03'),(59,650,'2006-02-15 05:05:03'),(59,689,'2006-02-15 05:05:03'),(59,694,'2006-02-15 05:05:03'),(59,702,'2006-02-15 05:05:03'),(59,713,'2006-02-15 05:05:03'),(59,749,'2006-02-15 05:05:03'),(59,772,'2006-02-15 05:05:03'),(59,853,'2006-02-15 05:05:03'),(59,862,'2006-02-15 05:05:03'),(59,943,'2006-02-15 05:05:03'),(59,946,'2006-02-15 05:05:03'),(59,984,'2006-02-15 05:05:03'),(60,31,'2006-02-15 05:05:03'),(60,85,'2006-02-15 05:05:03'),(60,133,'2006-02-15 05:05:03'),(60,142,'2006-02-15 05:05:03'),(60,177,'2006-02-15 05:05:03'),(60,179,'2006-02-15 05:05:03'),(60,186,'2006-02-15 05:05:03'),(60,222,'2006-02-15 05:05:03'),(60,235,'2006-02-15 05:05:03'),(60,239,'2006-02-15 05:05:03'),(60,253,'2006-02-15 05:05:03'),(60,262,'2006-02-15 05:05:03'),(60,297,'2006-02-15 05:05:03'),(60,299,'2006-02-15 05:05:03'),(60,334,'2006-02-15 05:05:03'),(60,376,'2006-02-15 05:05:03'),(60,423,'2006-02-15 05:05:03'),(60,436,'2006-02-15 05:05:03'),(60,493,'2006-02-15 05:05:03'),(60,534,'2006-02-15 05:05:03'),(60,551,'2006-02-15 05:05:03'),(60,658,'2006-02-15 05:05:03'),(60,665,'2006-02-15 05:05:03'),(60,679,'2006-02-15 05:05:03'),(60,754,'2006-02-15 05:05:03'),(60,771,'2006-02-15 05:05:03'),(60,783,'2006-02-15 05:05:03'),(60,784,'2006-02-15 05:05:03'),(60,805,'2006-02-15 05:05:03'),(60,830,'2006-02-15 05:05:03'),(60,835,'2006-02-15 05:05:03'),(60,928,'2006-02-15 05:05:03'),(60,952,'2006-02-15 05:05:03'),(60,971,'2006-02-15 05:05:03'),(60,986,'2006-02-15 05:05:03'),(61,235,'2006-02-15 05:05:03'),(61,237,'2006-02-15 05:05:03'),(61,307,'2006-02-15 05:05:03'),(61,362,'2006-02-15 05:05:03'),(61,372,'2006-02-15 05:05:03'),(61,374,'2006-02-15 05:05:03'),(61,423,'2006-02-15 05:05:03'),(61,433,'2006-02-15 05:05:03'),(61,508,'2006-02-15 05:05:03'),(61,518,'2006-02-15 05:05:03'),(61,519,'2006-02-15 05:05:03'),(61,535,'2006-02-15 05:05:03'),(61,537,'2006-02-15 05:05:03'),(61,585,'2006-02-15 05:05:03'),(61,639,'2006-02-15 05:05:03'),(61,648,'2006-02-15 05:05:03'),(61,649,'2006-02-15 05:05:03'),(61,703,'2006-02-15 05:05:03'),(61,752,'2006-02-15 05:05:03'),(61,766,'2006-02-15 05:05:03'),(61,767,'2006-02-15 05:05:03'),(61,780,'2006-02-15 05:05:03'),(61,831,'2006-02-15 05:05:03'),(61,832,'2006-02-15 05:05:03'),(61,990,'2006-02-15 05:05:03'),(62,6,'2006-02-15 05:05:03'),(62,42,'2006-02-15 05:05:03'),(62,54,'2006-02-15 05:05:03'),(62,100,'2006-02-15 05:05:03'),(62,101,'2006-02-15 05:05:03'),(62,129,'2006-02-15 05:05:03'),(62,198,'2006-02-15 05:05:03'),(62,211,'2006-02-15 05:05:03'),(62,231,'2006-02-15 05:05:03'),(62,272,'2006-02-15 05:05:03'),(62,295,'2006-02-15 05:05:03'),(62,337,'2006-02-15 05:05:03'),(62,375,'2006-02-15 05:05:03'),(62,385,'2006-02-15 05:05:03'),(62,393,'2006-02-15 05:05:03'),(62,398,'2006-02-15 05:05:03'),(62,406,'2006-02-15 05:05:03'),(62,413,'2006-02-15 05:05:03'),(62,428,'2006-02-15 05:05:03'),(62,445,'2006-02-15 05:05:03'),(62,457,'2006-02-15 05:05:03'),(62,465,'2006-02-15 05:05:03'),(62,688,'2006-02-15 05:05:03'),(62,707,'2006-02-15 05:05:03'),(62,719,'2006-02-15 05:05:03'),(62,951,'2006-02-15 05:05:03'),(62,981,'2006-02-15 05:05:03'),(62,988,'2006-02-15 05:05:03'),(62,990,'2006-02-15 05:05:03'),(63,73,'2006-02-15 05:05:03'),(63,134,'2006-02-15 05:05:03'),(63,167,'2006-02-15 05:05:03'),(63,208,'2006-02-15 05:05:03'),(63,225,'2006-02-15 05:05:03'),(63,248,'2006-02-15 05:05:03'),(63,249,'2006-02-15 05:05:03'),(63,278,'2006-02-15 05:05:03'),(63,392,'2006-02-15 05:05:03'),(63,517,'2006-02-15 05:05:03'),(63,633,'2006-02-15 05:05:03'),(63,763,'2006-02-15 05:05:03'),(63,781,'2006-02-15 05:05:03'),(63,809,'2006-02-15 05:05:03'),(63,893,'2006-02-15 05:05:03'),(63,932,'2006-02-15 05:05:03'),(63,944,'2006-02-15 05:05:03'),(63,945,'2006-02-15 05:05:03'),(63,981,'2006-02-15 05:05:03'),(64,3,'2006-02-15 05:05:03'),(64,10,'2006-02-15 05:05:03'),(64,37,'2006-02-15 05:05:03'),(64,87,'2006-02-15 05:05:03'),(64,88,'2006-02-15 05:05:03'),(64,124,'2006-02-15 05:05:03'),(64,197,'2006-02-15 05:05:03'),(64,280,'2006-02-15 05:05:03'),(64,291,'2006-02-15 05:05:03'),(64,307,'2006-02-15 05:05:03'),(64,335,'2006-02-15 05:05:03'),(64,345,'2006-02-15 05:05:03'),(64,448,'2006-02-15 05:05:03'),(64,469,'2006-02-15 05:05:03'),(64,471,'2006-02-15 05:05:03'),(64,506,'2006-02-15 05:05:03'),(64,543,'2006-02-15 05:05:03'),(64,557,'2006-02-15 05:05:03'),(64,569,'2006-02-15 05:05:03'),(64,572,'2006-02-15 05:05:03'),(64,597,'2006-02-15 05:05:03'),(64,616,'2006-02-15 05:05:03'),(64,646,'2006-02-15 05:05:03'),(64,694,'2006-02-15 05:05:03'),(64,832,'2006-02-15 05:05:03'),(64,852,'2006-02-15 05:05:03'),(64,860,'2006-02-15 05:05:03'),(64,921,'2006-02-15 05:05:03'),(64,925,'2006-02-15 05:05:03'),(64,980,'2006-02-15 05:05:03'),(65,39,'2006-02-15 05:05:03'),(65,46,'2006-02-15 05:05:03'),(65,97,'2006-02-15 05:05:03'),(65,106,'2006-02-15 05:05:03'),(65,117,'2006-02-15 05:05:03'),(65,125,'2006-02-15 05:05:03'),(65,158,'2006-02-15 05:05:03'),(65,276,'2006-02-15 05:05:03'),(65,305,'2006-02-15 05:05:03'),(65,338,'2006-02-15 05:05:03'),(65,347,'2006-02-15 05:05:03'),(65,371,'2006-02-15 05:05:03'),(65,398,'2006-02-15 05:05:03'),(65,471,'2006-02-15 05:05:03'),(65,475,'2006-02-15 05:05:03'),(65,476,'2006-02-15 05:05:03'),(65,491,'2006-02-15 05:05:03'),(65,496,'2006-02-15 05:05:03'),(65,516,'2006-02-15 05:05:03'),(65,517,'2006-02-15 05:05:03'),(65,541,'2006-02-15 05:05:03'),(65,556,'2006-02-15 05:05:03'),(65,571,'2006-02-15 05:05:03'),(65,577,'2006-02-15 05:05:03'),(65,615,'2006-02-15 05:05:03'),(65,658,'2006-02-15 05:05:03'),(65,683,'2006-02-15 05:05:03'),(65,694,'2006-02-15 05:05:03'),(65,714,'2006-02-15 05:05:03'),(65,735,'2006-02-15 05:05:03'),(65,852,'2006-02-15 05:05:03'),(65,938,'2006-02-15 05:05:03'),(65,951,'2006-02-15 05:05:03'),(65,965,'2006-02-15 05:05:03'),(66,55,'2006-02-15 05:05:03'),(66,143,'2006-02-15 05:05:03'),(66,207,'2006-02-15 05:05:03'),(66,226,'2006-02-15 05:05:03'),(66,229,'2006-02-15 05:05:03'),(66,230,'2006-02-15 05:05:03'),(66,283,'2006-02-15 05:05:03'),(66,300,'2006-02-15 05:05:03'),(66,342,'2006-02-15 05:05:03'),(66,350,'2006-02-15 05:05:03'),(66,361,'2006-02-15 05:05:03'),(66,376,'2006-02-15 05:05:03'),(66,424,'2006-02-15 05:05:03'),(66,434,'2006-02-15 05:05:03'),(66,553,'2006-02-15 05:05:03'),(66,608,'2006-02-15 05:05:03'),(66,676,'2006-02-15 05:05:03'),(66,697,'2006-02-15 05:05:03'),(66,706,'2006-02-15 05:05:03'),(66,725,'2006-02-15 05:05:03'),(66,769,'2006-02-15 05:05:03'),(66,793,'2006-02-15 05:05:03'),(66,829,'2006-02-15 05:05:03'),(66,871,'2006-02-15 05:05:03'),(66,909,'2006-02-15 05:05:03'),(66,915,'2006-02-15 05:05:03'),(66,928,'2006-02-15 05:05:03'),(66,951,'2006-02-15 05:05:03'),(66,957,'2006-02-15 05:05:03'),(66,960,'2006-02-15 05:05:03'),(66,999,'2006-02-15 05:05:03'),(67,24,'2006-02-15 05:05:03'),(67,57,'2006-02-15 05:05:03'),(67,67,'2006-02-15 05:05:03'),(67,144,'2006-02-15 05:05:03'),(67,242,'2006-02-15 05:05:03'),(67,244,'2006-02-15 05:05:03'),(67,256,'2006-02-15 05:05:03'),(67,408,'2006-02-15 05:05:03'),(67,477,'2006-02-15 05:05:03'),(67,496,'2006-02-15 05:05:03'),(67,512,'2006-02-15 05:05:03'),(67,576,'2006-02-15 05:05:03'),(67,601,'2006-02-15 05:05:03'),(67,725,'2006-02-15 05:05:03'),(67,726,'2006-02-15 05:05:03'),(67,731,'2006-02-15 05:05:03'),(67,766,'2006-02-15 05:05:03'),(67,861,'2006-02-15 05:05:03'),(67,870,'2006-02-15 05:05:03'),(67,915,'2006-02-15 05:05:03'),(67,945,'2006-02-15 05:05:03'),(67,972,'2006-02-15 05:05:03'),(67,981,'2006-02-15 05:05:03'),(68,9,'2006-02-15 05:05:03'),(68,45,'2006-02-15 05:05:03'),(68,133,'2006-02-15 05:05:03'),(68,161,'2006-02-15 05:05:03'),(68,205,'2006-02-15 05:05:03'),(68,213,'2006-02-15 05:05:03'),(68,215,'2006-02-15 05:05:03'),(68,255,'2006-02-15 05:05:03'),(68,296,'2006-02-15 05:05:03'),(68,315,'2006-02-15 05:05:03'),(68,325,'2006-02-15 05:05:03'),(68,331,'2006-02-15 05:05:03'),(68,347,'2006-02-15 05:05:03'),(68,357,'2006-02-15 05:05:03'),(68,378,'2006-02-15 05:05:03'),(68,380,'2006-02-15 05:05:03'),(68,386,'2006-02-15 05:05:03'),(68,396,'2006-02-15 05:05:03'),(68,435,'2006-02-15 05:05:03'),(68,497,'2006-02-15 05:05:03'),(68,607,'2006-02-15 05:05:03'),(68,654,'2006-02-15 05:05:03'),(68,665,'2006-02-15 05:05:03'),(68,671,'2006-02-15 05:05:03'),(68,706,'2006-02-15 05:05:03'),(68,747,'2006-02-15 05:05:03'),(68,834,'2006-02-15 05:05:03'),(68,839,'2006-02-15 05:05:03'),(68,840,'2006-02-15 05:05:03'),(68,971,'2006-02-15 05:05:03'),(69,15,'2006-02-15 05:05:03'),(69,88,'2006-02-15 05:05:03'),(69,111,'2006-02-15 05:05:03'),(69,202,'2006-02-15 05:05:03'),(69,236,'2006-02-15 05:05:03'),(69,292,'2006-02-15 05:05:03'),(69,300,'2006-02-15 05:05:03'),(69,306,'2006-02-15 05:05:03'),(69,374,'2006-02-15 05:05:03'),(69,396,'2006-02-15 05:05:03'),(69,452,'2006-02-15 05:05:03'),(69,466,'2006-02-15 05:05:03'),(69,529,'2006-02-15 05:05:03'),(69,612,'2006-02-15 05:05:03'),(69,720,'2006-02-15 05:05:03'),(69,722,'2006-02-15 05:05:03'),(69,761,'2006-02-15 05:05:03'),(69,791,'2006-02-15 05:05:03'),(69,864,'2006-02-15 05:05:03'),(69,877,'2006-02-15 05:05:03'),(69,914,'2006-02-15 05:05:03'),(70,50,'2006-02-15 05:05:03'),(70,53,'2006-02-15 05:05:03'),(70,92,'2006-02-15 05:05:03'),(70,202,'2006-02-15 05:05:03'),(70,227,'2006-02-15 05:05:03'),(70,249,'2006-02-15 05:05:03'),(70,290,'2006-02-15 05:05:03'),(70,304,'2006-02-15 05:05:03'),(70,343,'2006-02-15 05:05:03'),(70,414,'2006-02-15 05:05:03'),(70,453,'2006-02-15 05:05:03'),(70,466,'2006-02-15 05:05:03'),(70,504,'2006-02-15 05:05:03'),(70,584,'2006-02-15 05:05:03'),(70,628,'2006-02-15 05:05:03'),(70,654,'2006-02-15 05:05:03'),(70,725,'2006-02-15 05:05:03'),(70,823,'2006-02-15 05:05:03'),(70,834,'2006-02-15 05:05:03'),(70,856,'2006-02-15 05:05:03'),(70,869,'2006-02-15 05:05:03'),(70,953,'2006-02-15 05:05:03'),(70,964,'2006-02-15 05:05:03'),(71,26,'2006-02-15 05:05:03'),(71,52,'2006-02-15 05:05:03'),(71,233,'2006-02-15 05:05:03'),(71,317,'2006-02-15 05:05:03'),(71,359,'2006-02-15 05:05:03'),(71,362,'2006-02-15 05:05:03'),(71,385,'2006-02-15 05:05:03'),(71,399,'2006-02-15 05:05:03'),(71,450,'2006-02-15 05:05:03'),(71,532,'2006-02-15 05:05:03'),(71,560,'2006-02-15 05:05:03'),(71,574,'2006-02-15 05:05:03'),(71,638,'2006-02-15 05:05:03'),(71,773,'2006-02-15 05:05:03'),(71,833,'2006-02-15 05:05:03'),(71,874,'2006-02-15 05:05:03'),(71,918,'2006-02-15 05:05:03'),(71,956,'2006-02-15 05:05:03'),(72,34,'2006-02-15 05:05:03'),(72,144,'2006-02-15 05:05:03'),(72,237,'2006-02-15 05:05:03'),(72,249,'2006-02-15 05:05:03'),(72,286,'2006-02-15 05:05:03'),(72,296,'2006-02-15 05:05:03'),(72,325,'2006-02-15 05:05:03'),(72,331,'2006-02-15 05:05:03'),(72,405,'2006-02-15 05:05:03'),(72,450,'2006-02-15 05:05:03'),(72,550,'2006-02-15 05:05:03'),(72,609,'2006-02-15 05:05:03'),(72,623,'2006-02-15 05:05:03'),(72,636,'2006-02-15 05:05:03'),(72,640,'2006-02-15 05:05:03'),(72,665,'2006-02-15 05:05:03'),(72,718,'2006-02-15 05:05:03'),(72,743,'2006-02-15 05:05:03'),(72,757,'2006-02-15 05:05:03'),(72,773,'2006-02-15 05:05:03'),(72,854,'2006-02-15 05:05:03'),(72,865,'2006-02-15 05:05:03'),(72,938,'2006-02-15 05:05:03'),(72,956,'2006-02-15 05:05:03'),(72,964,'2006-02-15 05:05:03'),(72,969,'2006-02-15 05:05:03'),(73,36,'2006-02-15 05:05:03'),(73,45,'2006-02-15 05:05:03'),(73,51,'2006-02-15 05:05:03'),(73,77,'2006-02-15 05:05:03'),(73,148,'2006-02-15 05:05:03'),(73,245,'2006-02-15 05:05:03'),(73,275,'2006-02-15 05:05:03'),(73,322,'2006-02-15 05:05:03'),(73,374,'2006-02-15 05:05:03'),(73,379,'2006-02-15 05:05:03'),(73,467,'2006-02-15 05:05:03'),(73,548,'2006-02-15 05:05:03'),(73,561,'2006-02-15 05:05:03'),(73,562,'2006-02-15 05:05:03'),(73,565,'2006-02-15 05:05:03'),(73,627,'2006-02-15 05:05:03'),(73,666,'2006-02-15 05:05:03'),(73,667,'2006-02-15 05:05:03'),(73,707,'2006-02-15 05:05:03'),(73,748,'2006-02-15 05:05:03'),(73,772,'2006-02-15 05:05:03'),(73,823,'2006-02-15 05:05:03'),(73,936,'2006-02-15 05:05:03'),(73,946,'2006-02-15 05:05:03'),(73,950,'2006-02-15 05:05:03'),(73,998,'2006-02-15 05:05:03'),(74,28,'2006-02-15 05:05:03'),(74,44,'2006-02-15 05:05:03'),(74,117,'2006-02-15 05:05:03'),(74,185,'2006-02-15 05:05:03'),(74,192,'2006-02-15 05:05:03'),(74,203,'2006-02-15 05:05:03'),(74,263,'2006-02-15 05:05:03'),(74,321,'2006-02-15 05:05:03'),(74,415,'2006-02-15 05:05:03'),(74,484,'2006-02-15 05:05:03'),(74,503,'2006-02-15 05:05:03'),(74,537,'2006-02-15 05:05:03'),(74,543,'2006-02-15 05:05:03'),(74,617,'2006-02-15 05:05:03'),(74,626,'2006-02-15 05:05:03'),(74,637,'2006-02-15 05:05:03'),(74,663,'2006-02-15 05:05:03'),(74,704,'2006-02-15 05:05:03'),(74,720,'2006-02-15 05:05:03'),(74,747,'2006-02-15 05:05:03'),(74,780,'2006-02-15 05:05:03'),(74,804,'2006-02-15 05:05:03'),(74,834,'2006-02-15 05:05:03'),(74,836,'2006-02-15 05:05:03'),(74,848,'2006-02-15 05:05:03'),(74,872,'2006-02-15 05:05:03'),(74,902,'2006-02-15 05:05:03'),(74,956,'2006-02-15 05:05:03'),(75,12,'2006-02-15 05:05:03'),(75,34,'2006-02-15 05:05:03'),(75,143,'2006-02-15 05:05:03'),(75,170,'2006-02-15 05:05:03'),(75,222,'2006-02-15 05:05:03'),(75,301,'2006-02-15 05:05:03'),(75,347,'2006-02-15 05:05:03'),(75,372,'2006-02-15 05:05:03'),(75,436,'2006-02-15 05:05:03'),(75,445,'2006-02-15 05:05:03'),(75,446,'2006-02-15 05:05:03'),(75,492,'2006-02-15 05:05:03'),(75,498,'2006-02-15 05:05:03'),(75,508,'2006-02-15 05:05:03'),(75,541,'2006-02-15 05:05:03'),(75,547,'2006-02-15 05:05:03'),(75,579,'2006-02-15 05:05:03'),(75,645,'2006-02-15 05:05:03'),(75,667,'2006-02-15 05:05:03'),(75,744,'2006-02-15 05:05:03'),(75,764,'2006-02-15 05:05:03'),(75,780,'2006-02-15 05:05:03'),(75,870,'2006-02-15 05:05:03'),(75,920,'2006-02-15 05:05:03'),(76,60,'2006-02-15 05:05:03'),(76,66,'2006-02-15 05:05:03'),(76,68,'2006-02-15 05:05:03'),(76,95,'2006-02-15 05:05:03'),(76,122,'2006-02-15 05:05:03'),(76,187,'2006-02-15 05:05:03'),(76,223,'2006-02-15 05:05:03'),(76,234,'2006-02-15 05:05:03'),(76,251,'2006-02-15 05:05:03'),(76,348,'2006-02-15 05:05:03'),(76,444,'2006-02-15 05:05:03'),(76,464,'2006-02-15 05:05:03'),(76,474,'2006-02-15 05:05:03'),(76,498,'2006-02-15 05:05:03'),(76,568,'2006-02-15 05:05:03'),(76,604,'2006-02-15 05:05:03'),(76,606,'2006-02-15 05:05:03'),(76,642,'2006-02-15 05:05:03'),(76,648,'2006-02-15 05:05:03'),(76,650,'2006-02-15 05:05:03'),(76,709,'2006-02-15 05:05:03'),(76,760,'2006-02-15 05:05:03'),(76,765,'2006-02-15 05:05:03'),(76,781,'2006-02-15 05:05:03'),(76,850,'2006-02-15 05:05:03'),(76,862,'2006-02-15 05:05:03'),(76,866,'2006-02-15 05:05:03'),(76,870,'2006-02-15 05:05:03'),(76,912,'2006-02-15 05:05:03'),(76,935,'2006-02-15 05:05:03'),(76,958,'2006-02-15 05:05:03'),(77,13,'2006-02-15 05:05:03'),(77,22,'2006-02-15 05:05:03'),(77,40,'2006-02-15 05:05:03'),(77,73,'2006-02-15 05:05:03'),(77,78,'2006-02-15 05:05:03'),(77,153,'2006-02-15 05:05:03'),(77,224,'2006-02-15 05:05:03'),(77,240,'2006-02-15 05:05:03'),(77,245,'2006-02-15 05:05:03'),(77,261,'2006-02-15 05:05:03'),(77,343,'2006-02-15 05:05:03'),(77,442,'2006-02-15 05:05:03'),(77,458,'2006-02-15 05:05:03'),(77,538,'2006-02-15 05:05:03'),(77,566,'2006-02-15 05:05:03'),(77,612,'2006-02-15 05:05:03'),(77,635,'2006-02-15 05:05:03'),(77,694,'2006-02-15 05:05:03'),(77,749,'2006-02-15 05:05:03'),(77,938,'2006-02-15 05:05:03'),(77,943,'2006-02-15 05:05:03'),(77,963,'2006-02-15 05:05:03'),(77,969,'2006-02-15 05:05:03'),(77,993,'2006-02-15 05:05:03'),(78,86,'2006-02-15 05:05:03'),(78,239,'2006-02-15 05:05:03'),(78,260,'2006-02-15 05:05:03'),(78,261,'2006-02-15 05:05:03'),(78,265,'2006-02-15 05:05:03'),(78,301,'2006-02-15 05:05:03'),(78,387,'2006-02-15 05:05:03'),(78,393,'2006-02-15 05:05:03'),(78,428,'2006-02-15 05:05:03'),(78,457,'2006-02-15 05:05:03'),(78,505,'2006-02-15 05:05:03'),(78,520,'2006-02-15 05:05:03'),(78,530,'2006-02-15 05:05:03'),(78,549,'2006-02-15 05:05:03'),(78,552,'2006-02-15 05:05:03'),(78,599,'2006-02-15 05:05:03'),(78,670,'2006-02-15 05:05:03'),(78,674,'2006-02-15 05:05:03'),(78,689,'2006-02-15 05:05:03'),(78,762,'2006-02-15 05:05:03'),(78,767,'2006-02-15 05:05:03'),(78,811,'2006-02-15 05:05:03'),(78,852,'2006-02-15 05:05:03'),(78,880,'2006-02-15 05:05:03'),(78,963,'2006-02-15 05:05:03'),(78,968,'2006-02-15 05:05:03'),(79,32,'2006-02-15 05:05:03'),(79,33,'2006-02-15 05:05:03'),(79,40,'2006-02-15 05:05:03'),(79,141,'2006-02-15 05:05:03'),(79,205,'2006-02-15 05:05:03'),(79,230,'2006-02-15 05:05:03'),(79,242,'2006-02-15 05:05:03'),(79,262,'2006-02-15 05:05:03'),(79,267,'2006-02-15 05:05:03'),(79,269,'2006-02-15 05:05:03'),(79,299,'2006-02-15 05:05:03'),(79,367,'2006-02-15 05:05:03'),(79,428,'2006-02-15 05:05:03'),(79,430,'2006-02-15 05:05:03'),(79,473,'2006-02-15 05:05:03'),(79,607,'2006-02-15 05:05:03'),(79,628,'2006-02-15 05:05:03'),(79,634,'2006-02-15 05:05:03'),(79,646,'2006-02-15 05:05:03'),(79,727,'2006-02-15 05:05:03'),(79,750,'2006-02-15 05:05:03'),(79,753,'2006-02-15 05:05:03'),(79,769,'2006-02-15 05:05:03'),(79,776,'2006-02-15 05:05:03'),(79,788,'2006-02-15 05:05:03'),(79,840,'2006-02-15 05:05:03'),(79,853,'2006-02-15 05:05:03'),(79,916,'2006-02-15 05:05:03'),(80,69,'2006-02-15 05:05:03'),(80,118,'2006-02-15 05:05:03'),(80,124,'2006-02-15 05:05:03'),(80,175,'2006-02-15 05:05:03'),(80,207,'2006-02-15 05:05:03'),(80,212,'2006-02-15 05:05:03'),(80,260,'2006-02-15 05:05:03'),(80,262,'2006-02-15 05:05:03'),(80,280,'2006-02-15 05:05:03'),(80,341,'2006-02-15 05:05:03'),(80,342,'2006-02-15 05:05:03'),(80,343,'2006-02-15 05:05:03'),(80,362,'2006-02-15 05:05:03'),(80,436,'2006-02-15 05:05:03'),(80,475,'2006-02-15 05:05:03'),(80,553,'2006-02-15 05:05:03'),(80,619,'2006-02-15 05:05:03'),(80,622,'2006-02-15 05:05:03'),(80,680,'2006-02-15 05:05:03'),(80,687,'2006-02-15 05:05:03'),(80,688,'2006-02-15 05:05:03'),(80,709,'2006-02-15 05:05:03'),(80,788,'2006-02-15 05:05:03'),(80,807,'2006-02-15 05:05:03'),(80,858,'2006-02-15 05:05:03'),(80,888,'2006-02-15 05:05:03'),(80,941,'2006-02-15 05:05:03'),(80,979,'2006-02-15 05:05:03'),(81,4,'2006-02-15 05:05:03'),(81,11,'2006-02-15 05:05:03'),(81,59,'2006-02-15 05:05:03'),(81,89,'2006-02-15 05:05:03'),(81,178,'2006-02-15 05:05:03'),(81,186,'2006-02-15 05:05:03'),(81,194,'2006-02-15 05:05:03'),(81,215,'2006-02-15 05:05:03'),(81,219,'2006-02-15 05:05:03'),(81,232,'2006-02-15 05:05:03'),(81,260,'2006-02-15 05:05:03'),(81,267,'2006-02-15 05:05:03'),(81,268,'2006-02-15 05:05:03'),(81,304,'2006-02-15 05:05:03'),(81,332,'2006-02-15 05:05:03'),(81,389,'2006-02-15 05:05:03'),(81,398,'2006-02-15 05:05:03'),(81,453,'2006-02-15 05:05:03'),(81,458,'2006-02-15 05:05:03'),(81,465,'2006-02-15 05:05:03'),(81,505,'2006-02-15 05:05:03'),(81,508,'2006-02-15 05:05:03'),(81,527,'2006-02-15 05:05:03'),(81,545,'2006-02-15 05:05:03'),(81,564,'2006-02-15 05:05:03'),(81,578,'2006-02-15 05:05:03'),(81,579,'2006-02-15 05:05:03'),(81,613,'2006-02-15 05:05:03'),(81,619,'2006-02-15 05:05:03'),(81,643,'2006-02-15 05:05:03'),(81,692,'2006-02-15 05:05:03'),(81,710,'2006-02-15 05:05:03'),(81,729,'2006-02-15 05:05:03'),(81,761,'2006-02-15 05:05:03'),(81,827,'2006-02-15 05:05:03'),(81,910,'2006-02-15 05:05:03'),(82,17,'2006-02-15 05:05:03'),(82,33,'2006-02-15 05:05:03'),(82,104,'2006-02-15 05:05:03'),(82,143,'2006-02-15 05:05:03'),(82,188,'2006-02-15 05:05:03'),(82,242,'2006-02-15 05:05:03'),(82,247,'2006-02-15 05:05:03'),(82,290,'2006-02-15 05:05:03'),(82,306,'2006-02-15 05:05:03'),(82,316,'2006-02-15 05:05:03'),(82,344,'2006-02-15 05:05:03'),(82,453,'2006-02-15 05:05:03'),(82,468,'2006-02-15 05:05:03'),(82,480,'2006-02-15 05:05:03'),(82,497,'2006-02-15 05:05:03'),(82,503,'2006-02-15 05:05:03'),(82,527,'2006-02-15 05:05:03'),(82,551,'2006-02-15 05:05:03'),(82,561,'2006-02-15 05:05:03'),(82,750,'2006-02-15 05:05:03'),(82,787,'2006-02-15 05:05:03'),(82,802,'2006-02-15 05:05:03'),(82,838,'2006-02-15 05:05:03'),(82,839,'2006-02-15 05:05:03'),(82,870,'2006-02-15 05:05:03'),(82,877,'2006-02-15 05:05:03'),(82,893,'2006-02-15 05:05:03'),(82,911,'2006-02-15 05:05:03'),(82,954,'2006-02-15 05:05:03'),(82,978,'2006-02-15 05:05:03'),(82,985,'2006-02-15 05:05:03'),(83,49,'2006-02-15 05:05:03'),(83,52,'2006-02-15 05:05:03'),(83,58,'2006-02-15 05:05:03'),(83,110,'2006-02-15 05:05:03'),(83,120,'2006-02-15 05:05:03'),(83,121,'2006-02-15 05:05:03'),(83,135,'2006-02-15 05:05:03'),(83,165,'2006-02-15 05:05:03'),(83,217,'2006-02-15 05:05:03'),(83,247,'2006-02-15 05:05:03'),(83,249,'2006-02-15 05:05:03'),(83,263,'2006-02-15 05:05:03'),(83,268,'2006-02-15 05:05:03'),(83,279,'2006-02-15 05:05:03'),(83,281,'2006-02-15 05:05:03'),(83,339,'2006-02-15 05:05:03'),(83,340,'2006-02-15 05:05:03'),(83,369,'2006-02-15 05:05:03'),(83,412,'2006-02-15 05:05:03'),(83,519,'2006-02-15 05:05:03'),(83,529,'2006-02-15 05:05:03'),(83,615,'2006-02-15 05:05:03'),(83,631,'2006-02-15 05:05:03'),(83,655,'2006-02-15 05:05:03'),(83,672,'2006-02-15 05:05:03'),(83,686,'2006-02-15 05:05:03'),(83,719,'2006-02-15 05:05:03'),(83,764,'2006-02-15 05:05:03'),(83,777,'2006-02-15 05:05:03'),(83,784,'2006-02-15 05:05:03'),(83,833,'2006-02-15 05:05:03'),(83,873,'2006-02-15 05:05:03'),(83,932,'2006-02-15 05:05:03'),(84,19,'2006-02-15 05:05:03'),(84,39,'2006-02-15 05:05:03'),(84,46,'2006-02-15 05:05:03'),(84,175,'2006-02-15 05:05:03'),(84,238,'2006-02-15 05:05:03'),(84,281,'2006-02-15 05:05:03'),(84,290,'2006-02-15 05:05:03'),(84,312,'2006-02-15 05:05:03'),(84,317,'2006-02-15 05:05:03'),(84,413,'2006-02-15 05:05:03'),(84,414,'2006-02-15 05:05:03'),(84,460,'2006-02-15 05:05:03'),(84,479,'2006-02-15 05:05:03'),(84,491,'2006-02-15 05:05:03'),(84,529,'2006-02-15 05:05:03'),(84,540,'2006-02-15 05:05:03'),(84,566,'2006-02-15 05:05:03'),(84,574,'2006-02-15 05:05:03'),(84,589,'2006-02-15 05:05:03'),(84,616,'2006-02-15 05:05:03'),(84,646,'2006-02-15 05:05:03'),(84,703,'2006-02-15 05:05:03'),(84,729,'2006-02-15 05:05:03'),(84,764,'2006-02-15 05:05:03'),(84,782,'2006-02-15 05:05:03'),(84,809,'2006-02-15 05:05:03'),(84,830,'2006-02-15 05:05:03'),(84,843,'2006-02-15 05:05:03'),(84,887,'2006-02-15 05:05:03'),(84,975,'2006-02-15 05:05:03'),(84,996,'2006-02-15 05:05:03'),(85,2,'2006-02-15 05:05:03'),(85,14,'2006-02-15 05:05:03'),(85,72,'2006-02-15 05:05:03'),(85,85,'2006-02-15 05:05:03'),(85,92,'2006-02-15 05:05:03'),(85,148,'2006-02-15 05:05:03'),(85,216,'2006-02-15 05:05:03'),(85,290,'2006-02-15 05:05:03'),(85,296,'2006-02-15 05:05:03'),(85,297,'2006-02-15 05:05:03'),(85,337,'2006-02-15 05:05:03'),(85,383,'2006-02-15 05:05:03'),(85,421,'2006-02-15 05:05:03'),(85,446,'2006-02-15 05:05:03'),(85,461,'2006-02-15 05:05:03'),(85,475,'2006-02-15 05:05:03'),(85,478,'2006-02-15 05:05:03'),(85,522,'2006-02-15 05:05:03'),(85,543,'2006-02-15 05:05:03'),(85,558,'2006-02-15 05:05:03'),(85,591,'2006-02-15 05:05:03'),(85,630,'2006-02-15 05:05:03'),(85,678,'2006-02-15 05:05:03'),(85,711,'2006-02-15 05:05:03'),(85,761,'2006-02-15 05:05:03'),(85,812,'2006-02-15 05:05:03'),(85,869,'2006-02-15 05:05:03'),(85,875,'2006-02-15 05:05:03'),(85,895,'2006-02-15 05:05:03'),(85,957,'2006-02-15 05:05:03'),(85,960,'2006-02-15 05:05:03'),(86,137,'2006-02-15 05:05:03'),(86,163,'2006-02-15 05:05:03'),(86,196,'2006-02-15 05:05:03'),(86,216,'2006-02-15 05:05:03'),(86,249,'2006-02-15 05:05:03'),(86,303,'2006-02-15 05:05:03'),(86,331,'2006-02-15 05:05:03'),(86,364,'2006-02-15 05:05:03'),(86,391,'2006-02-15 05:05:03'),(86,432,'2006-02-15 05:05:03'),(86,482,'2006-02-15 05:05:03'),(86,486,'2006-02-15 05:05:03'),(86,519,'2006-02-15 05:05:03'),(86,520,'2006-02-15 05:05:03'),(86,548,'2006-02-15 05:05:03'),(86,623,'2006-02-15 05:05:03'),(86,631,'2006-02-15 05:05:03'),(86,636,'2006-02-15 05:05:03'),(86,752,'2006-02-15 05:05:03'),(86,760,'2006-02-15 05:05:03'),(86,808,'2006-02-15 05:05:03'),(86,857,'2006-02-15 05:05:03'),(86,878,'2006-02-15 05:05:03'),(86,893,'2006-02-15 05:05:03'),(86,905,'2006-02-15 05:05:03'),(86,923,'2006-02-15 05:05:03'),(86,929,'2006-02-15 05:05:03'),(87,48,'2006-02-15 05:05:03'),(87,157,'2006-02-15 05:05:03'),(87,161,'2006-02-15 05:05:03'),(87,199,'2006-02-15 05:05:03'),(87,207,'2006-02-15 05:05:03'),(87,250,'2006-02-15 05:05:03'),(87,253,'2006-02-15 05:05:03'),(87,312,'2006-02-15 05:05:03'),(87,421,'2006-02-15 05:05:03'),(87,570,'2006-02-15 05:05:03'),(87,599,'2006-02-15 05:05:03'),(87,606,'2006-02-15 05:05:03'),(87,654,'2006-02-15 05:05:03'),(87,679,'2006-02-15 05:05:03'),(87,706,'2006-02-15 05:05:03'),(87,718,'2006-02-15 05:05:03'),(87,721,'2006-02-15 05:05:03'),(87,830,'2006-02-15 05:05:03'),(87,870,'2006-02-15 05:05:03'),(87,952,'2006-02-15 05:05:03'),(87,961,'2006-02-15 05:05:03'),(88,4,'2006-02-15 05:05:03'),(88,76,'2006-02-15 05:05:03'),(88,87,'2006-02-15 05:05:03'),(88,128,'2006-02-15 05:05:03'),(88,170,'2006-02-15 05:05:03'),(88,193,'2006-02-15 05:05:03'),(88,234,'2006-02-15 05:05:03'),(88,304,'2006-02-15 05:05:03'),(88,602,'2006-02-15 05:05:03'),(88,620,'2006-02-15 05:05:03'),(88,668,'2006-02-15 05:05:03'),(88,717,'2006-02-15 05:05:03'),(88,785,'2006-02-15 05:05:03'),(88,819,'2006-02-15 05:05:03'),(88,839,'2006-02-15 05:05:03'),(88,881,'2006-02-15 05:05:03'),(88,908,'2006-02-15 05:05:03'),(88,929,'2006-02-15 05:05:03'),(88,940,'2006-02-15 05:05:03'),(88,968,'2006-02-15 05:05:03'),(89,47,'2006-02-15 05:05:03'),(89,103,'2006-02-15 05:05:03'),(89,117,'2006-02-15 05:05:03'),(89,162,'2006-02-15 05:05:03'),(89,182,'2006-02-15 05:05:03'),(89,187,'2006-02-15 05:05:03'),(89,212,'2006-02-15 05:05:03'),(89,254,'2006-02-15 05:05:03'),(89,266,'2006-02-15 05:05:03'),(89,306,'2006-02-15 05:05:03'),(89,342,'2006-02-15 05:05:03'),(89,406,'2006-02-15 05:05:03'),(89,410,'2006-02-15 05:05:03'),(89,446,'2006-02-15 05:05:03'),(89,473,'2006-02-15 05:05:03'),(89,488,'2006-02-15 05:05:03'),(89,529,'2006-02-15 05:05:03'),(89,542,'2006-02-15 05:05:03'),(89,564,'2006-02-15 05:05:03'),(89,697,'2006-02-15 05:05:03'),(89,833,'2006-02-15 05:05:03'),(89,864,'2006-02-15 05:05:03'),(89,970,'2006-02-15 05:05:03'),(89,976,'2006-02-15 05:05:03'),(90,2,'2006-02-15 05:05:03'),(90,11,'2006-02-15 05:05:03'),(90,100,'2006-02-15 05:05:03'),(90,197,'2006-02-15 05:05:03'),(90,212,'2006-02-15 05:05:03'),(90,262,'2006-02-15 05:05:03'),(90,303,'2006-02-15 05:05:03'),(90,330,'2006-02-15 05:05:03'),(90,363,'2006-02-15 05:05:03'),(90,374,'2006-02-15 05:05:03'),(90,384,'2006-02-15 05:05:03'),(90,385,'2006-02-15 05:05:03'),(90,391,'2006-02-15 05:05:03'),(90,406,'2006-02-15 05:05:03'),(90,433,'2006-02-15 05:05:03'),(90,442,'2006-02-15 05:05:03'),(90,451,'2006-02-15 05:05:03'),(90,520,'2006-02-15 05:05:03'),(90,529,'2006-02-15 05:05:03'),(90,542,'2006-02-15 05:05:03'),(90,586,'2006-02-15 05:05:03'),(90,633,'2006-02-15 05:05:03'),(90,663,'2006-02-15 05:05:03'),(90,676,'2006-02-15 05:05:03'),(90,771,'2006-02-15 05:05:03'),(90,817,'2006-02-15 05:05:03'),(90,838,'2006-02-15 05:05:03'),(90,855,'2006-02-15 05:05:03'),(90,858,'2006-02-15 05:05:03'),(90,868,'2006-02-15 05:05:03'),(90,880,'2006-02-15 05:05:03'),(90,901,'2006-02-15 05:05:03'),(90,925,'2006-02-15 05:05:03'),(91,13,'2006-02-15 05:05:03'),(91,25,'2006-02-15 05:05:03'),(91,48,'2006-02-15 05:05:03'),(91,176,'2006-02-15 05:05:03'),(91,181,'2006-02-15 05:05:03'),(91,190,'2006-02-15 05:05:03'),(91,335,'2006-02-15 05:05:03'),(91,416,'2006-02-15 05:05:03'),(91,447,'2006-02-15 05:05:03'),(91,480,'2006-02-15 05:05:03'),(91,493,'2006-02-15 05:05:03'),(91,509,'2006-02-15 05:05:03'),(91,511,'2006-02-15 05:05:03'),(91,608,'2006-02-15 05:05:03'),(91,807,'2006-02-15 05:05:03'),(91,829,'2006-02-15 05:05:03'),(91,849,'2006-02-15 05:05:03'),(91,859,'2006-02-15 05:05:03'),(91,941,'2006-02-15 05:05:03'),(91,982,'2006-02-15 05:05:03'),(92,90,'2006-02-15 05:05:03'),(92,94,'2006-02-15 05:05:03'),(92,103,'2006-02-15 05:05:03'),(92,104,'2006-02-15 05:05:03'),(92,123,'2006-02-15 05:05:03'),(92,137,'2006-02-15 05:05:03'),(92,207,'2006-02-15 05:05:03'),(92,229,'2006-02-15 05:05:03'),(92,338,'2006-02-15 05:05:03'),(92,381,'2006-02-15 05:05:03'),(92,436,'2006-02-15 05:05:03'),(92,443,'2006-02-15 05:05:03'),(92,453,'2006-02-15 05:05:03'),(92,470,'2006-02-15 05:05:03'),(92,505,'2006-02-15 05:05:03'),(92,512,'2006-02-15 05:05:03'),(92,543,'2006-02-15 05:05:03'),(92,545,'2006-02-15 05:05:03'),(92,547,'2006-02-15 05:05:03'),(92,553,'2006-02-15 05:05:03'),(92,564,'2006-02-15 05:05:03'),(92,568,'2006-02-15 05:05:03'),(92,618,'2006-02-15 05:05:03'),(92,662,'2006-02-15 05:05:03'),(92,686,'2006-02-15 05:05:03'),(92,699,'2006-02-15 05:05:03'),(92,712,'2006-02-15 05:05:03'),(92,728,'2006-02-15 05:05:03'),(92,802,'2006-02-15 05:05:03'),(92,825,'2006-02-15 05:05:03'),(92,838,'2006-02-15 05:05:03'),(92,889,'2006-02-15 05:05:03'),(92,929,'2006-02-15 05:05:03'),(92,991,'2006-02-15 05:05:03'),(93,71,'2006-02-15 05:05:03'),(93,120,'2006-02-15 05:05:03'),(93,124,'2006-02-15 05:05:03'),(93,280,'2006-02-15 05:05:03'),(93,325,'2006-02-15 05:05:03'),(93,339,'2006-02-15 05:05:03'),(93,427,'2006-02-15 05:05:03'),(93,445,'2006-02-15 05:05:03'),(93,453,'2006-02-15 05:05:03'),(93,473,'2006-02-15 05:05:03'),(93,573,'2006-02-15 05:05:03'),(93,621,'2006-02-15 05:05:03'),(93,644,'2006-02-15 05:05:03'),(93,678,'2006-02-15 05:05:03'),(93,680,'2006-02-15 05:05:03'),(93,699,'2006-02-15 05:05:03'),(93,744,'2006-02-15 05:05:03'),(93,768,'2006-02-15 05:05:03'),(93,777,'2006-02-15 05:05:03'),(93,835,'2006-02-15 05:05:03'),(93,856,'2006-02-15 05:05:03'),(93,874,'2006-02-15 05:05:03'),(93,909,'2006-02-15 05:05:03'),(93,916,'2006-02-15 05:05:03'),(93,982,'2006-02-15 05:05:03'),(94,13,'2006-02-15 05:05:03'),(94,60,'2006-02-15 05:05:03'),(94,76,'2006-02-15 05:05:03'),(94,122,'2006-02-15 05:05:03'),(94,153,'2006-02-15 05:05:03'),(94,193,'2006-02-15 05:05:03'),(94,206,'2006-02-15 05:05:03'),(94,228,'2006-02-15 05:05:03'),(94,270,'2006-02-15 05:05:03'),(94,275,'2006-02-15 05:05:03'),(94,320,'2006-02-15 05:05:03'),(94,322,'2006-02-15 05:05:03'),(94,337,'2006-02-15 05:05:03'),(94,354,'2006-02-15 05:05:03'),(94,402,'2006-02-15 05:05:03'),(94,428,'2006-02-15 05:05:03'),(94,457,'2006-02-15 05:05:03'),(94,473,'2006-02-15 05:05:03'),(94,475,'2006-02-15 05:05:03'),(94,512,'2006-02-15 05:05:03'),(94,517,'2006-02-15 05:05:03'),(94,521,'2006-02-15 05:05:03'),(94,533,'2006-02-15 05:05:03'),(94,540,'2006-02-15 05:05:03'),(94,548,'2006-02-15 05:05:03'),(94,551,'2006-02-15 05:05:03'),(94,712,'2006-02-15 05:05:03'),(94,713,'2006-02-15 05:05:03'),(94,724,'2006-02-15 05:05:03'),(94,775,'2006-02-15 05:05:03'),(94,788,'2006-02-15 05:05:03'),(94,950,'2006-02-15 05:05:03'),(94,989,'2006-02-15 05:05:03'),(95,22,'2006-02-15 05:05:03'),(95,35,'2006-02-15 05:05:03'),(95,47,'2006-02-15 05:05:03'),(95,52,'2006-02-15 05:05:03'),(95,65,'2006-02-15 05:05:03'),(95,74,'2006-02-15 05:05:03'),(95,126,'2006-02-15 05:05:03'),(95,207,'2006-02-15 05:05:03'),(95,245,'2006-02-15 05:05:03'),(95,294,'2006-02-15 05:05:03'),(95,301,'2006-02-15 05:05:03'),(95,312,'2006-02-15 05:05:03'),(95,329,'2006-02-15 05:05:03'),(95,353,'2006-02-15 05:05:03'),(95,375,'2006-02-15 05:05:03'),(95,420,'2006-02-15 05:05:03'),(95,424,'2006-02-15 05:05:03'),(95,431,'2006-02-15 05:05:03'),(95,498,'2006-02-15 05:05:03'),(95,522,'2006-02-15 05:05:03'),(95,546,'2006-02-15 05:05:03'),(95,551,'2006-02-15 05:05:03'),(95,619,'2006-02-15 05:05:03'),(95,627,'2006-02-15 05:05:03'),(95,690,'2006-02-15 05:05:03'),(95,748,'2006-02-15 05:05:03'),(95,813,'2006-02-15 05:05:03'),(95,828,'2006-02-15 05:05:03'),(95,855,'2006-02-15 05:05:03'),(95,903,'2006-02-15 05:05:03'),(95,923,'2006-02-15 05:05:03'),(96,8,'2006-02-15 05:05:03'),(96,36,'2006-02-15 05:05:03'),(96,40,'2006-02-15 05:05:03'),(96,54,'2006-02-15 05:05:03'),(96,58,'2006-02-15 05:05:03'),(96,66,'2006-02-15 05:05:03'),(96,134,'2006-02-15 05:05:03'),(96,209,'2006-02-15 05:05:03'),(96,244,'2006-02-15 05:05:03'),(96,320,'2006-02-15 05:05:03'),(96,430,'2006-02-15 05:05:03'),(96,452,'2006-02-15 05:05:03'),(96,486,'2006-02-15 05:05:03'),(96,572,'2006-02-15 05:05:03'),(96,590,'2006-02-15 05:05:03'),(96,661,'2006-02-15 05:05:03'),(96,778,'2006-02-15 05:05:03'),(96,832,'2006-02-15 05:05:03'),(96,846,'2006-02-15 05:05:03'),(96,874,'2006-02-15 05:05:03'),(96,945,'2006-02-15 05:05:03'),(96,968,'2006-02-15 05:05:03'),(96,987,'2006-02-15 05:05:03'),(97,143,'2006-02-15 05:05:03'),(97,177,'2006-02-15 05:05:03'),(97,188,'2006-02-15 05:05:03'),(97,197,'2006-02-15 05:05:03'),(97,256,'2006-02-15 05:05:03'),(97,312,'2006-02-15 05:05:03'),(97,342,'2006-02-15 05:05:03'),(97,348,'2006-02-15 05:05:03'),(97,358,'2006-02-15 05:05:03'),(97,370,'2006-02-15 05:05:03'),(97,437,'2006-02-15 05:05:03'),(97,446,'2006-02-15 05:05:03'),(97,466,'2006-02-15 05:05:03'),(97,518,'2006-02-15 05:05:03'),(97,553,'2006-02-15 05:05:03'),(97,561,'2006-02-15 05:05:03'),(97,641,'2006-02-15 05:05:03'),(97,656,'2006-02-15 05:05:03'),(97,728,'2006-02-15 05:05:03'),(97,755,'2006-02-15 05:05:03'),(97,757,'2006-02-15 05:05:03'),(97,826,'2006-02-15 05:05:03'),(97,862,'2006-02-15 05:05:03'),(97,930,'2006-02-15 05:05:03'),(97,933,'2006-02-15 05:05:03'),(97,947,'2006-02-15 05:05:03'),(97,951,'2006-02-15 05:05:03'),(98,66,'2006-02-15 05:05:03'),(98,72,'2006-02-15 05:05:03'),(98,81,'2006-02-15 05:05:03'),(98,87,'2006-02-15 05:05:03'),(98,107,'2006-02-15 05:05:03'),(98,120,'2006-02-15 05:05:03'),(98,183,'2006-02-15 05:05:03'),(98,194,'2006-02-15 05:05:03'),(98,212,'2006-02-15 05:05:03'),(98,297,'2006-02-15 05:05:03'),(98,607,'2006-02-15 05:05:03'),(98,634,'2006-02-15 05:05:03'),(98,686,'2006-02-15 05:05:03'),(98,705,'2006-02-15 05:05:03'),(98,710,'2006-02-15 05:05:03'),(98,721,'2006-02-15 05:05:03'),(98,725,'2006-02-15 05:05:03'),(98,734,'2006-02-15 05:05:03'),(98,738,'2006-02-15 05:05:03'),(98,765,'2006-02-15 05:05:03'),(98,782,'2006-02-15 05:05:03'),(98,824,'2006-02-15 05:05:03'),(98,829,'2006-02-15 05:05:03'),(98,912,'2006-02-15 05:05:03'),(98,955,'2006-02-15 05:05:03'),(98,985,'2006-02-15 05:05:03'),(98,990,'2006-02-15 05:05:03'),(99,7,'2006-02-15 05:05:03'),(99,27,'2006-02-15 05:05:03'),(99,84,'2006-02-15 05:05:03'),(99,250,'2006-02-15 05:05:03'),(99,322,'2006-02-15 05:05:03'),(99,325,'2006-02-15 05:05:03'),(99,381,'2006-02-15 05:05:03'),(99,414,'2006-02-15 05:05:03'),(99,475,'2006-02-15 05:05:03'),(99,490,'2006-02-15 05:05:03'),(99,512,'2006-02-15 05:05:03'),(99,540,'2006-02-15 05:05:03'),(99,572,'2006-02-15 05:05:03'),(99,600,'2006-02-15 05:05:03'),(99,618,'2006-02-15 05:05:03'),(99,620,'2006-02-15 05:05:03'),(99,622,'2006-02-15 05:05:03'),(99,636,'2006-02-15 05:05:03'),(99,672,'2006-02-15 05:05:03'),(99,726,'2006-02-15 05:05:03'),(99,741,'2006-02-15 05:05:03'),(99,796,'2006-02-15 05:05:03'),(99,835,'2006-02-15 05:05:03'),(99,967,'2006-02-15 05:05:03'),(99,978,'2006-02-15 05:05:03'),(99,982,'2006-02-15 05:05:03'),(100,17,'2006-02-15 05:05:03'),(100,118,'2006-02-15 05:05:03'),(100,250,'2006-02-15 05:05:03'),(100,411,'2006-02-15 05:05:03'),(100,414,'2006-02-15 05:05:03'),(100,513,'2006-02-15 05:05:03'),(100,563,'2006-02-15 05:05:03'),(100,642,'2006-02-15 05:05:03'),(100,714,'2006-02-15 05:05:03'),(100,718,'2006-02-15 05:05:03'),(100,759,'2006-02-15 05:05:03'),(100,779,'2006-02-15 05:05:03'),(100,815,'2006-02-15 05:05:03'),(100,846,'2006-02-15 05:05:03'),(100,850,'2006-02-15 05:05:03'),(100,872,'2006-02-15 05:05:03'),(100,877,'2006-02-15 05:05:03'),(100,909,'2006-02-15 05:05:03'),(100,919,'2006-02-15 05:05:03'),(100,944,'2006-02-15 05:05:03'),(100,967,'2006-02-15 05:05:03'),(100,979,'2006-02-15 05:05:03'),(100,991,'2006-02-15 05:05:03'),(100,992,'2006-02-15 05:05:03'),(101,60,'2006-02-15 05:05:03'),(101,66,'2006-02-15 05:05:03'),(101,85,'2006-02-15 05:05:03'),(101,146,'2006-02-15 05:05:03'),(101,189,'2006-02-15 05:05:03'),(101,250,'2006-02-15 05:05:03'),(101,255,'2006-02-15 05:05:03'),(101,263,'2006-02-15 05:05:03'),(101,275,'2006-02-15 05:05:03'),(101,289,'2006-02-15 05:05:03'),(101,491,'2006-02-15 05:05:03'),(101,494,'2006-02-15 05:05:03'),(101,511,'2006-02-15 05:05:03'),(101,568,'2006-02-15 05:05:03'),(101,608,'2006-02-15 05:05:03'),(101,617,'2006-02-15 05:05:03'),(101,655,'2006-02-15 05:05:03'),(101,662,'2006-02-15 05:05:03'),(101,700,'2006-02-15 05:05:03'),(101,702,'2006-02-15 05:05:03'),(101,758,'2006-02-15 05:05:03'),(101,774,'2006-02-15 05:05:03'),(101,787,'2006-02-15 05:05:03'),(101,828,'2006-02-15 05:05:03'),(101,841,'2006-02-15 05:05:03'),(101,928,'2006-02-15 05:05:03'),(101,932,'2006-02-15 05:05:03'),(101,936,'2006-02-15 05:05:03'),(101,941,'2006-02-15 05:05:03'),(101,978,'2006-02-15 05:05:03'),(101,980,'2006-02-15 05:05:03'),(101,984,'2006-02-15 05:05:03'),(101,988,'2006-02-15 05:05:03'),(102,20,'2006-02-15 05:05:03'),(102,34,'2006-02-15 05:05:03'),(102,53,'2006-02-15 05:05:03'),(102,123,'2006-02-15 05:05:03'),(102,124,'2006-02-15 05:05:03'),(102,194,'2006-02-15 05:05:03'),(102,200,'2006-02-15 05:05:03'),(102,205,'2006-02-15 05:05:03'),(102,268,'2006-02-15 05:05:03'),(102,326,'2006-02-15 05:05:03'),(102,329,'2006-02-15 05:05:03'),(102,334,'2006-02-15 05:05:03'),(102,351,'2006-02-15 05:05:03'),(102,418,'2006-02-15 05:05:03'),(102,431,'2006-02-15 05:05:03'),(102,446,'2006-02-15 05:05:03'),(102,485,'2006-02-15 05:05:03'),(102,508,'2006-02-15 05:05:03'),(102,517,'2006-02-15 05:05:03'),(102,521,'2006-02-15 05:05:03'),(102,526,'2006-02-15 05:05:03'),(102,529,'2006-02-15 05:05:03'),(102,544,'2006-02-15 05:05:03'),(102,600,'2006-02-15 05:05:03'),(102,605,'2006-02-15 05:05:03'),(102,606,'2006-02-15 05:05:03'),(102,624,'2006-02-15 05:05:03'),(102,631,'2006-02-15 05:05:03'),(102,712,'2006-02-15 05:05:03'),(102,728,'2006-02-15 05:05:03'),(102,744,'2006-02-15 05:05:03'),(102,796,'2006-02-15 05:05:03'),(102,802,'2006-02-15 05:05:03'),(102,810,'2006-02-15 05:05:03'),(102,828,'2006-02-15 05:05:03'),(102,837,'2006-02-15 05:05:03'),(102,845,'2006-02-15 05:05:03'),(102,852,'2006-02-15 05:05:03'),(102,958,'2006-02-15 05:05:03'),(102,979,'2006-02-15 05:05:03'),(102,980,'2006-02-15 05:05:03'),(103,5,'2006-02-15 05:05:03'),(103,118,'2006-02-15 05:05:03'),(103,130,'2006-02-15 05:05:03'),(103,197,'2006-02-15 05:05:03'),(103,199,'2006-02-15 05:05:03'),(103,206,'2006-02-15 05:05:03'),(103,215,'2006-02-15 05:05:03'),(103,221,'2006-02-15 05:05:03'),(103,271,'2006-02-15 05:05:03'),(103,285,'2006-02-15 05:05:03'),(103,315,'2006-02-15 05:05:03'),(103,318,'2006-02-15 05:05:03'),(103,333,'2006-02-15 05:05:03'),(103,347,'2006-02-15 05:05:03'),(103,356,'2006-02-15 05:05:03'),(103,360,'2006-02-15 05:05:03'),(103,378,'2006-02-15 05:05:03'),(103,437,'2006-02-15 05:05:03'),(103,585,'2006-02-15 05:05:03'),(103,609,'2006-02-15 05:05:03'),(103,639,'2006-02-15 05:05:03'),(103,643,'2006-02-15 05:05:03'),(103,692,'2006-02-15 05:05:03'),(103,735,'2006-02-15 05:05:03'),(103,822,'2006-02-15 05:05:03'),(103,895,'2006-02-15 05:05:03'),(103,903,'2006-02-15 05:05:03'),(103,912,'2006-02-15 05:05:03'),(103,942,'2006-02-15 05:05:03'),(103,956,'2006-02-15 05:05:03'),(104,19,'2006-02-15 05:05:03'),(104,39,'2006-02-15 05:05:03'),(104,40,'2006-02-15 05:05:03'),(104,59,'2006-02-15 05:05:03'),(104,70,'2006-02-15 05:05:03'),(104,136,'2006-02-15 05:05:03'),(104,156,'2006-02-15 05:05:03'),(104,184,'2006-02-15 05:05:03'),(104,198,'2006-02-15 05:05:03'),(104,233,'2006-02-15 05:05:03'),(104,259,'2006-02-15 05:05:03'),(104,287,'2006-02-15 05:05:03'),(104,309,'2006-02-15 05:05:03'),(104,313,'2006-02-15 05:05:03'),(104,394,'2006-02-15 05:05:03'),(104,401,'2006-02-15 05:05:03'),(104,463,'2006-02-15 05:05:03'),(104,506,'2006-02-15 05:05:03'),(104,516,'2006-02-15 05:05:03'),(104,583,'2006-02-15 05:05:03'),(104,600,'2006-02-15 05:05:03'),(104,607,'2006-02-15 05:05:03'),(104,657,'2006-02-15 05:05:03'),(104,677,'2006-02-15 05:05:03'),(104,739,'2006-02-15 05:05:03'),(104,892,'2006-02-15 05:05:03'),(104,904,'2006-02-15 05:05:03'),(104,926,'2006-02-15 05:05:03'),(104,945,'2006-02-15 05:05:03'),(104,984,'2006-02-15 05:05:03'),(104,999,'2006-02-15 05:05:03'),(105,12,'2006-02-15 05:05:03'),(105,15,'2006-02-15 05:05:03'),(105,21,'2006-02-15 05:05:03'),(105,29,'2006-02-15 05:05:03'),(105,42,'2006-02-15 05:05:03'),(105,116,'2006-02-15 05:05:03'),(105,158,'2006-02-15 05:05:03'),(105,239,'2006-02-15 05:05:03'),(105,280,'2006-02-15 05:05:03'),(105,283,'2006-02-15 05:05:03'),(105,315,'2006-02-15 05:05:03'),(105,333,'2006-02-15 05:05:03'),(105,372,'2006-02-15 05:05:03'),(105,377,'2006-02-15 05:05:03'),(105,530,'2006-02-15 05:05:03'),(105,558,'2006-02-15 05:05:03'),(105,561,'2006-02-15 05:05:03'),(105,606,'2006-02-15 05:05:03'),(105,649,'2006-02-15 05:05:03'),(105,686,'2006-02-15 05:05:03'),(105,750,'2006-02-15 05:05:03'),(105,795,'2006-02-15 05:05:03'),(105,831,'2006-02-15 05:05:03'),(105,835,'2006-02-15 05:05:03'),(105,858,'2006-02-15 05:05:03'),(105,864,'2006-02-15 05:05:03'),(105,893,'2006-02-15 05:05:03'),(105,906,'2006-02-15 05:05:03'),(105,910,'2006-02-15 05:05:03'),(105,915,'2006-02-15 05:05:03'),(105,954,'2006-02-15 05:05:03'),(105,990,'2006-02-15 05:05:03'),(105,993,'2006-02-15 05:05:03'),(105,994,'2006-02-15 05:05:03'),(106,44,'2006-02-15 05:05:03'),(106,83,'2006-02-15 05:05:03'),(106,108,'2006-02-15 05:05:03'),(106,126,'2006-02-15 05:05:03'),(106,136,'2006-02-15 05:05:03'),(106,166,'2006-02-15 05:05:03'),(106,189,'2006-02-15 05:05:03'),(106,194,'2006-02-15 05:05:03'),(106,204,'2006-02-15 05:05:03'),(106,229,'2006-02-15 05:05:03'),(106,241,'2006-02-15 05:05:03'),(106,345,'2006-02-15 05:05:03'),(106,365,'2006-02-15 05:05:03'),(106,399,'2006-02-15 05:05:03'),(106,439,'2006-02-15 05:05:03'),(106,457,'2006-02-15 05:05:03'),(106,469,'2006-02-15 05:05:03'),(106,500,'2006-02-15 05:05:03'),(106,505,'2006-02-15 05:05:03'),(106,559,'2006-02-15 05:05:03'),(106,566,'2006-02-15 05:05:03'),(106,585,'2006-02-15 05:05:03'),(106,639,'2006-02-15 05:05:03'),(106,654,'2006-02-15 05:05:03'),(106,659,'2006-02-15 05:05:03'),(106,675,'2006-02-15 05:05:03'),(106,687,'2006-02-15 05:05:03'),(106,752,'2006-02-15 05:05:03'),(106,763,'2006-02-15 05:05:03'),(106,780,'2006-02-15 05:05:03'),(106,858,'2006-02-15 05:05:03'),(106,866,'2006-02-15 05:05:03'),(106,881,'2006-02-15 05:05:03'),(106,894,'2006-02-15 05:05:03'),(106,934,'2006-02-15 05:05:03'),(107,62,'2006-02-15 05:05:03'),(107,112,'2006-02-15 05:05:03'),(107,133,'2006-02-15 05:05:03'),(107,136,'2006-02-15 05:05:03'),(107,138,'2006-02-15 05:05:03'),(107,162,'2006-02-15 05:05:03'),(107,165,'2006-02-15 05:05:03'),(107,172,'2006-02-15 05:05:03'),(107,209,'2006-02-15 05:05:03'),(107,220,'2006-02-15 05:05:03'),(107,239,'2006-02-15 05:05:03'),(107,277,'2006-02-15 05:05:03'),(107,292,'2006-02-15 05:05:03'),(107,338,'2006-02-15 05:05:03'),(107,348,'2006-02-15 05:05:03'),(107,369,'2006-02-15 05:05:03'),(107,388,'2006-02-15 05:05:03'),(107,392,'2006-02-15 05:05:03'),(107,409,'2006-02-15 05:05:03'),(107,430,'2006-02-15 05:05:03'),(107,445,'2006-02-15 05:05:03'),(107,454,'2006-02-15 05:05:03'),(107,458,'2006-02-15 05:05:03'),(107,467,'2006-02-15 05:05:03'),(107,520,'2006-02-15 05:05:03'),(107,534,'2006-02-15 05:05:03'),(107,548,'2006-02-15 05:05:03'),(107,571,'2006-02-15 05:05:03'),(107,574,'2006-02-15 05:05:03'),(107,603,'2006-02-15 05:05:03'),(107,606,'2006-02-15 05:05:03'),(107,637,'2006-02-15 05:05:03'),(107,774,'2006-02-15 05:05:03'),(107,781,'2006-02-15 05:05:03'),(107,796,'2006-02-15 05:05:03'),(107,831,'2006-02-15 05:05:03'),(107,849,'2006-02-15 05:05:03'),(107,859,'2006-02-15 05:05:03'),(107,879,'2006-02-15 05:05:03'),(107,905,'2006-02-15 05:05:03'),(107,973,'2006-02-15 05:05:03'),(107,977,'2006-02-15 05:05:03'),(108,1,'2006-02-15 05:05:03'),(108,6,'2006-02-15 05:05:03'),(108,9,'2006-02-15 05:05:03'),(108,137,'2006-02-15 05:05:03'),(108,208,'2006-02-15 05:05:03'),(108,219,'2006-02-15 05:05:03'),(108,242,'2006-02-15 05:05:03'),(108,278,'2006-02-15 05:05:03'),(108,302,'2006-02-15 05:05:03'),(108,350,'2006-02-15 05:05:03'),(108,378,'2006-02-15 05:05:03'),(108,379,'2006-02-15 05:05:03'),(108,495,'2006-02-15 05:05:03'),(108,507,'2006-02-15 05:05:03'),(108,517,'2006-02-15 05:05:03'),(108,561,'2006-02-15 05:05:03'),(108,567,'2006-02-15 05:05:03'),(108,648,'2006-02-15 05:05:03'),(108,652,'2006-02-15 05:05:03'),(108,655,'2006-02-15 05:05:03'),(108,673,'2006-02-15 05:05:03'),(108,693,'2006-02-15 05:05:03'),(108,696,'2006-02-15 05:05:03'),(108,702,'2006-02-15 05:05:03'),(108,721,'2006-02-15 05:05:03'),(108,733,'2006-02-15 05:05:03'),(108,741,'2006-02-15 05:05:03'),(108,744,'2006-02-15 05:05:03'),(108,887,'2006-02-15 05:05:03'),(108,892,'2006-02-15 05:05:03'),(108,894,'2006-02-15 05:05:03'),(108,920,'2006-02-15 05:05:03'),(108,958,'2006-02-15 05:05:03'),(108,966,'2006-02-15 05:05:03'),(109,12,'2006-02-15 05:05:03'),(109,48,'2006-02-15 05:05:03'),(109,77,'2006-02-15 05:05:03'),(109,157,'2006-02-15 05:05:03'),(109,174,'2006-02-15 05:05:03'),(109,190,'2006-02-15 05:05:03'),(109,243,'2006-02-15 05:05:03'),(109,281,'2006-02-15 05:05:03'),(109,393,'2006-02-15 05:05:03'),(109,463,'2006-02-15 05:05:03'),(109,622,'2006-02-15 05:05:03'),(109,657,'2006-02-15 05:05:03'),(109,694,'2006-02-15 05:05:03'),(109,700,'2006-02-15 05:05:03'),(109,732,'2006-02-15 05:05:03'),(109,753,'2006-02-15 05:05:03'),(109,785,'2006-02-15 05:05:03'),(109,786,'2006-02-15 05:05:03'),(109,863,'2006-02-15 05:05:03'),(109,885,'2006-02-15 05:05:03'),(109,955,'2006-02-15 05:05:03'),(109,967,'2006-02-15 05:05:03'),(110,8,'2006-02-15 05:05:03'),(110,27,'2006-02-15 05:05:03'),(110,62,'2006-02-15 05:05:03'),(110,120,'2006-02-15 05:05:03'),(110,126,'2006-02-15 05:05:03'),(110,156,'2006-02-15 05:05:03'),(110,292,'2006-02-15 05:05:03'),(110,343,'2006-02-15 05:05:03'),(110,360,'2006-02-15 05:05:03'),(110,369,'2006-02-15 05:05:03'),(110,435,'2006-02-15 05:05:03'),(110,513,'2006-02-15 05:05:03'),(110,525,'2006-02-15 05:05:03'),(110,539,'2006-02-15 05:05:03'),(110,545,'2006-02-15 05:05:03'),(110,625,'2006-02-15 05:05:03'),(110,650,'2006-02-15 05:05:03'),(110,801,'2006-02-15 05:05:03'),(110,912,'2006-02-15 05:05:03'),(110,961,'2006-02-15 05:05:03'),(110,987,'2006-02-15 05:05:03'),(111,61,'2006-02-15 05:05:03'),(111,78,'2006-02-15 05:05:03'),(111,98,'2006-02-15 05:05:03'),(111,162,'2006-02-15 05:05:03'),(111,179,'2006-02-15 05:05:03'),(111,194,'2006-02-15 05:05:03'),(111,325,'2006-02-15 05:05:03'),(111,359,'2006-02-15 05:05:03'),(111,382,'2006-02-15 05:05:03'),(111,403,'2006-02-15 05:05:03'),(111,407,'2006-02-15 05:05:03'),(111,414,'2006-02-15 05:05:03'),(111,474,'2006-02-15 05:05:03'),(111,489,'2006-02-15 05:05:03'),(111,508,'2006-02-15 05:05:03'),(111,555,'2006-02-15 05:05:03'),(111,603,'2006-02-15 05:05:03'),(111,608,'2006-02-15 05:05:03'),(111,643,'2006-02-15 05:05:03'),(111,669,'2006-02-15 05:05:03'),(111,679,'2006-02-15 05:05:03'),(111,680,'2006-02-15 05:05:03'),(111,699,'2006-02-15 05:05:03'),(111,731,'2006-02-15 05:05:03'),(111,732,'2006-02-15 05:05:03'),(111,737,'2006-02-15 05:05:03'),(111,744,'2006-02-15 05:05:03'),(111,777,'2006-02-15 05:05:03'),(111,847,'2006-02-15 05:05:03'),(111,894,'2006-02-15 05:05:03'),(111,919,'2006-02-15 05:05:03'),(111,962,'2006-02-15 05:05:03'),(111,973,'2006-02-15 05:05:03'),(112,34,'2006-02-15 05:05:03'),(112,37,'2006-02-15 05:05:03'),(112,151,'2006-02-15 05:05:03'),(112,173,'2006-02-15 05:05:03'),(112,188,'2006-02-15 05:05:03'),(112,231,'2006-02-15 05:05:03'),(112,312,'2006-02-15 05:05:03'),(112,322,'2006-02-15 05:05:03'),(112,443,'2006-02-15 05:05:03'),(112,450,'2006-02-15 05:05:03'),(112,565,'2006-02-15 05:05:03'),(112,603,'2006-02-15 05:05:03'),(112,606,'2006-02-15 05:05:03'),(112,654,'2006-02-15 05:05:03'),(112,666,'2006-02-15 05:05:03'),(112,700,'2006-02-15 05:05:03'),(112,728,'2006-02-15 05:05:03'),(112,772,'2006-02-15 05:05:03'),(112,796,'2006-02-15 05:05:03'),(112,817,'2006-02-15 05:05:03'),(112,829,'2006-02-15 05:05:03'),(112,856,'2006-02-15 05:05:03'),(112,865,'2006-02-15 05:05:03'),(112,869,'2006-02-15 05:05:03'),(112,988,'2006-02-15 05:05:03'),(113,35,'2006-02-15 05:05:03'),(113,84,'2006-02-15 05:05:03'),(113,116,'2006-02-15 05:05:03'),(113,181,'2006-02-15 05:05:03'),(113,218,'2006-02-15 05:05:03'),(113,249,'2006-02-15 05:05:03'),(113,258,'2006-02-15 05:05:03'),(113,292,'2006-02-15 05:05:03'),(113,322,'2006-02-15 05:05:03'),(113,353,'2006-02-15 05:05:03'),(113,403,'2006-02-15 05:05:03'),(113,525,'2006-02-15 05:05:03'),(113,642,'2006-02-15 05:05:03'),(113,656,'2006-02-15 05:05:03'),(113,674,'2006-02-15 05:05:03'),(113,680,'2006-02-15 05:05:03'),(113,700,'2006-02-15 05:05:03'),(113,719,'2006-02-15 05:05:03'),(113,723,'2006-02-15 05:05:03'),(113,726,'2006-02-15 05:05:03'),(113,732,'2006-02-15 05:05:03'),(113,748,'2006-02-15 05:05:03'),(113,838,'2006-02-15 05:05:03'),(113,890,'2006-02-15 05:05:03'),(113,921,'2006-02-15 05:05:03'),(113,969,'2006-02-15 05:05:03'),(113,981,'2006-02-15 05:05:03'),(114,13,'2006-02-15 05:05:03'),(114,68,'2006-02-15 05:05:03'),(114,90,'2006-02-15 05:05:03'),(114,162,'2006-02-15 05:05:03'),(114,188,'2006-02-15 05:05:03'),(114,194,'2006-02-15 05:05:03'),(114,210,'2006-02-15 05:05:03'),(114,237,'2006-02-15 05:05:03'),(114,254,'2006-02-15 05:05:03'),(114,305,'2006-02-15 05:05:03'),(114,339,'2006-02-15 05:05:03'),(114,420,'2006-02-15 05:05:03'),(114,425,'2006-02-15 05:05:03'),(114,452,'2006-02-15 05:05:03'),(114,538,'2006-02-15 05:05:03'),(114,619,'2006-02-15 05:05:03'),(114,757,'2006-02-15 05:05:03'),(114,807,'2006-02-15 05:05:03'),(114,827,'2006-02-15 05:05:03'),(114,841,'2006-02-15 05:05:03'),(114,861,'2006-02-15 05:05:03'),(114,866,'2006-02-15 05:05:03'),(114,913,'2006-02-15 05:05:03'),(114,961,'2006-02-15 05:05:03'),(114,993,'2006-02-15 05:05:03'),(115,49,'2006-02-15 05:05:03'),(115,52,'2006-02-15 05:05:03'),(115,245,'2006-02-15 05:05:03'),(115,246,'2006-02-15 05:05:03'),(115,277,'2006-02-15 05:05:03'),(115,302,'2006-02-15 05:05:03'),(115,379,'2006-02-15 05:05:03'),(115,383,'2006-02-15 05:05:03'),(115,391,'2006-02-15 05:05:03'),(115,428,'2006-02-15 05:05:03'),(115,506,'2006-02-15 05:05:03'),(115,531,'2006-02-15 05:05:03'),(115,607,'2006-02-15 05:05:03'),(115,615,'2006-02-15 05:05:03'),(115,661,'2006-02-15 05:05:03'),(115,671,'2006-02-15 05:05:03'),(115,686,'2006-02-15 05:05:03'),(115,703,'2006-02-15 05:05:03'),(115,714,'2006-02-15 05:05:03'),(115,740,'2006-02-15 05:05:03'),(115,754,'2006-02-15 05:05:03'),(115,846,'2006-02-15 05:05:03'),(115,887,'2006-02-15 05:05:03'),(115,952,'2006-02-15 05:05:03'),(115,955,'2006-02-15 05:05:03'),(115,966,'2006-02-15 05:05:03'),(115,985,'2006-02-15 05:05:03'),(115,994,'2006-02-15 05:05:03'),(116,36,'2006-02-15 05:05:03'),(116,48,'2006-02-15 05:05:03'),(116,88,'2006-02-15 05:05:03'),(116,90,'2006-02-15 05:05:03'),(116,105,'2006-02-15 05:05:03'),(116,128,'2006-02-15 05:05:03'),(116,336,'2006-02-15 05:05:03'),(116,338,'2006-02-15 05:05:03'),(116,384,'2006-02-15 05:05:03'),(116,412,'2006-02-15 05:05:03'),(116,420,'2006-02-15 05:05:03'),(116,451,'2006-02-15 05:05:03'),(116,481,'2006-02-15 05:05:03'),(116,492,'2006-02-15 05:05:03'),(116,584,'2006-02-15 05:05:03'),(116,606,'2006-02-15 05:05:03'),(116,622,'2006-02-15 05:05:03'),(116,647,'2006-02-15 05:05:03'),(116,653,'2006-02-15 05:05:03'),(116,742,'2006-02-15 05:05:03'),(116,784,'2006-02-15 05:05:03'),(116,844,'2006-02-15 05:05:03'),(116,939,'2006-02-15 05:05:03'),(116,956,'2006-02-15 05:05:03'),(117,10,'2006-02-15 05:05:03'),(117,15,'2006-02-15 05:05:03'),(117,42,'2006-02-15 05:05:03'),(117,167,'2006-02-15 05:05:03'),(117,178,'2006-02-15 05:05:03'),(117,190,'2006-02-15 05:05:03'),(117,197,'2006-02-15 05:05:03'),(117,224,'2006-02-15 05:05:03'),(117,246,'2006-02-15 05:05:03'),(117,273,'2006-02-15 05:05:03'),(117,298,'2006-02-15 05:05:03'),(117,316,'2006-02-15 05:05:03'),(117,337,'2006-02-15 05:05:03'),(117,395,'2006-02-15 05:05:03'),(117,423,'2006-02-15 05:05:03'),(117,432,'2006-02-15 05:05:03'),(117,459,'2006-02-15 05:05:03'),(117,468,'2006-02-15 05:05:03'),(117,550,'2006-02-15 05:05:03'),(117,578,'2006-02-15 05:05:03'),(117,707,'2006-02-15 05:05:03'),(117,710,'2006-02-15 05:05:03'),(117,738,'2006-02-15 05:05:03'),(117,739,'2006-02-15 05:05:03'),(117,778,'2006-02-15 05:05:03'),(117,783,'2006-02-15 05:05:03'),(117,785,'2006-02-15 05:05:03'),(117,797,'2006-02-15 05:05:03'),(117,812,'2006-02-15 05:05:03'),(117,831,'2006-02-15 05:05:03'),(117,864,'2006-02-15 05:05:03'),(117,887,'2006-02-15 05:05:03'),(117,926,'2006-02-15 05:05:03'),(118,35,'2006-02-15 05:05:03'),(118,39,'2006-02-15 05:05:03'),(118,41,'2006-02-15 05:05:03'),(118,49,'2006-02-15 05:05:03'),(118,55,'2006-02-15 05:05:03'),(118,136,'2006-02-15 05:05:03'),(118,141,'2006-02-15 05:05:03'),(118,151,'2006-02-15 05:05:03'),(118,311,'2006-02-15 05:05:03'),(118,384,'2006-02-15 05:05:03'),(118,399,'2006-02-15 05:05:03'),(118,499,'2006-02-15 05:05:03'),(118,517,'2006-02-15 05:05:03'),(118,553,'2006-02-15 05:05:03'),(118,558,'2006-02-15 05:05:03'),(118,572,'2006-02-15 05:05:03'),(118,641,'2006-02-15 05:05:03'),(118,656,'2006-02-15 05:05:03'),(118,695,'2006-02-15 05:05:03'),(118,735,'2006-02-15 05:05:03'),(118,788,'2006-02-15 05:05:03'),(118,852,'2006-02-15 05:05:03'),(118,938,'2006-02-15 05:05:03'),(118,957,'2006-02-15 05:05:03'),(118,969,'2006-02-15 05:05:03'),(119,21,'2006-02-15 05:05:03'),(119,49,'2006-02-15 05:05:03'),(119,64,'2006-02-15 05:05:03'),(119,87,'2006-02-15 05:05:03'),(119,143,'2006-02-15 05:05:03'),(119,171,'2006-02-15 05:05:03'),(119,172,'2006-02-15 05:05:03'),(119,173,'2006-02-15 05:05:03'),(119,381,'2006-02-15 05:05:03'),(119,394,'2006-02-15 05:05:03'),(119,412,'2006-02-15 05:05:03'),(119,418,'2006-02-15 05:05:03'),(119,454,'2006-02-15 05:05:03'),(119,509,'2006-02-15 05:05:03'),(119,521,'2006-02-15 05:05:03'),(119,567,'2006-02-15 05:05:03'),(119,570,'2006-02-15 05:05:03'),(119,592,'2006-02-15 05:05:03'),(119,614,'2006-02-15 05:05:03'),(119,636,'2006-02-15 05:05:03'),(119,649,'2006-02-15 05:05:03'),(119,693,'2006-02-15 05:05:03'),(119,738,'2006-02-15 05:05:03'),(119,751,'2006-02-15 05:05:03'),(119,782,'2006-02-15 05:05:03'),(119,786,'2006-02-15 05:05:03'),(119,788,'2006-02-15 05:05:03'),(119,802,'2006-02-15 05:05:03'),(119,858,'2006-02-15 05:05:03'),(119,868,'2006-02-15 05:05:03'),(119,900,'2006-02-15 05:05:03'),(119,939,'2006-02-15 05:05:03'),(120,57,'2006-02-15 05:05:03'),(120,63,'2006-02-15 05:05:03'),(120,144,'2006-02-15 05:05:03'),(120,149,'2006-02-15 05:05:03'),(120,208,'2006-02-15 05:05:03'),(120,231,'2006-02-15 05:05:03'),(120,238,'2006-02-15 05:05:03'),(120,255,'2006-02-15 05:05:03'),(120,414,'2006-02-15 05:05:03'),(120,424,'2006-02-15 05:05:03'),(120,489,'2006-02-15 05:05:03'),(120,513,'2006-02-15 05:05:03'),(120,590,'2006-02-15 05:05:03'),(120,641,'2006-02-15 05:05:03'),(120,642,'2006-02-15 05:05:03'),(120,659,'2006-02-15 05:05:03'),(120,682,'2006-02-15 05:05:03'),(120,691,'2006-02-15 05:05:03'),(120,715,'2006-02-15 05:05:03'),(120,717,'2006-02-15 05:05:03'),(120,722,'2006-02-15 05:05:03'),(120,746,'2006-02-15 05:05:03'),(120,830,'2006-02-15 05:05:03'),(120,894,'2006-02-15 05:05:03'),(120,898,'2006-02-15 05:05:03'),(120,911,'2006-02-15 05:05:03'),(120,994,'2006-02-15 05:05:03'),(121,141,'2006-02-15 05:05:03'),(121,154,'2006-02-15 05:05:03'),(121,161,'2006-02-15 05:05:03'),(121,170,'2006-02-15 05:05:03'),(121,186,'2006-02-15 05:05:03'),(121,198,'2006-02-15 05:05:03'),(121,220,'2006-02-15 05:05:03'),(121,222,'2006-02-15 05:05:03'),(121,284,'2006-02-15 05:05:03'),(121,297,'2006-02-15 05:05:03'),(121,338,'2006-02-15 05:05:03'),(121,353,'2006-02-15 05:05:03'),(121,449,'2006-02-15 05:05:03'),(121,479,'2006-02-15 05:05:03'),(121,517,'2006-02-15 05:05:03'),(121,633,'2006-02-15 05:05:03'),(121,654,'2006-02-15 05:05:03'),(121,658,'2006-02-15 05:05:03'),(121,666,'2006-02-15 05:05:03'),(121,771,'2006-02-15 05:05:03'),(121,780,'2006-02-15 05:05:03'),(121,847,'2006-02-15 05:05:03'),(121,884,'2006-02-15 05:05:03'),(121,885,'2006-02-15 05:05:03'),(121,966,'2006-02-15 05:05:03'),(122,22,'2006-02-15 05:05:03'),(122,29,'2006-02-15 05:05:03'),(122,76,'2006-02-15 05:05:03'),(122,83,'2006-02-15 05:05:03'),(122,157,'2006-02-15 05:05:03'),(122,158,'2006-02-15 05:05:03'),(122,166,'2006-02-15 05:05:03'),(122,227,'2006-02-15 05:05:03'),(122,238,'2006-02-15 05:05:03'),(122,300,'2006-02-15 05:05:03'),(122,307,'2006-02-15 05:05:03'),(122,363,'2006-02-15 05:05:03'),(122,470,'2006-02-15 05:05:03'),(122,489,'2006-02-15 05:05:03'),(122,491,'2006-02-15 05:05:03'),(122,542,'2006-02-15 05:05:03'),(122,620,'2006-02-15 05:05:03'),(122,649,'2006-02-15 05:05:03'),(122,654,'2006-02-15 05:05:03'),(122,673,'2006-02-15 05:05:03'),(122,718,'2006-02-15 05:05:03'),(122,795,'2006-02-15 05:05:03'),(122,957,'2006-02-15 05:05:03'),(122,961,'2006-02-15 05:05:03'),(122,998,'2006-02-15 05:05:03'),(123,3,'2006-02-15 05:05:03'),(123,43,'2006-02-15 05:05:03'),(123,67,'2006-02-15 05:05:03'),(123,105,'2006-02-15 05:05:03'),(123,148,'2006-02-15 05:05:03'),(123,151,'2006-02-15 05:05:03'),(123,185,'2006-02-15 05:05:03'),(123,223,'2006-02-15 05:05:03'),(123,234,'2006-02-15 05:05:03'),(123,245,'2006-02-15 05:05:03'),(123,246,'2006-02-15 05:05:03'),(123,266,'2006-02-15 05:05:03'),(123,286,'2006-02-15 05:05:03'),(123,429,'2006-02-15 05:05:03'),(123,442,'2006-02-15 05:05:03'),(123,446,'2006-02-15 05:05:03'),(123,479,'2006-02-15 05:05:03'),(123,480,'2006-02-15 05:05:03'),(123,494,'2006-02-15 05:05:03'),(123,503,'2006-02-15 05:05:03'),(123,530,'2006-02-15 05:05:03'),(123,576,'2006-02-15 05:05:03'),(123,577,'2006-02-15 05:05:03'),(123,589,'2006-02-15 05:05:03'),(123,593,'2006-02-15 05:05:03'),(123,725,'2006-02-15 05:05:03'),(123,730,'2006-02-15 05:05:03'),(123,786,'2006-02-15 05:05:03'),(123,860,'2006-02-15 05:05:03'),(123,892,'2006-02-15 05:05:03'),(123,926,'2006-02-15 05:05:03'),(123,988,'2006-02-15 05:05:03'),(124,22,'2006-02-15 05:05:03'),(124,64,'2006-02-15 05:05:03'),(124,106,'2006-02-15 05:05:03'),(124,113,'2006-02-15 05:05:03'),(124,190,'2006-02-15 05:05:03'),(124,246,'2006-02-15 05:05:03'),(124,260,'2006-02-15 05:05:03'),(124,263,'2006-02-15 05:05:03'),(124,289,'2006-02-15 05:05:03'),(124,306,'2006-02-15 05:05:03'),(124,312,'2006-02-15 05:05:03'),(124,322,'2006-02-15 05:05:03'),(124,343,'2006-02-15 05:05:03'),(124,449,'2006-02-15 05:05:03'),(124,468,'2006-02-15 05:05:03'),(124,539,'2006-02-15 05:05:03'),(124,601,'2006-02-15 05:05:03'),(124,726,'2006-02-15 05:05:03'),(124,742,'2006-02-15 05:05:03'),(124,775,'2006-02-15 05:05:03'),(124,785,'2006-02-15 05:05:03'),(124,814,'2006-02-15 05:05:03'),(124,858,'2006-02-15 05:05:03'),(124,882,'2006-02-15 05:05:03'),(124,987,'2006-02-15 05:05:03'),(124,997,'2006-02-15 05:05:03'),(125,62,'2006-02-15 05:05:03'),(125,98,'2006-02-15 05:05:03'),(125,100,'2006-02-15 05:05:03'),(125,114,'2006-02-15 05:05:03'),(125,175,'2006-02-15 05:05:03'),(125,188,'2006-02-15 05:05:03'),(125,204,'2006-02-15 05:05:03'),(125,238,'2006-02-15 05:05:03'),(125,250,'2006-02-15 05:05:03'),(125,324,'2006-02-15 05:05:03'),(125,338,'2006-02-15 05:05:03'),(125,361,'2006-02-15 05:05:03'),(125,367,'2006-02-15 05:05:03'),(125,395,'2006-02-15 05:05:03'),(125,414,'2006-02-15 05:05:03'),(125,428,'2006-02-15 05:05:03'),(125,429,'2006-02-15 05:05:03'),(125,450,'2006-02-15 05:05:03'),(125,497,'2006-02-15 05:05:03'),(125,557,'2006-02-15 05:05:03'),(125,568,'2006-02-15 05:05:03'),(125,584,'2006-02-15 05:05:03'),(125,602,'2006-02-15 05:05:03'),(125,623,'2006-02-15 05:05:03'),(125,664,'2006-02-15 05:05:03'),(125,683,'2006-02-15 05:05:03'),(125,710,'2006-02-15 05:05:03'),(125,877,'2006-02-15 05:05:03'),(125,908,'2006-02-15 05:05:03'),(125,949,'2006-02-15 05:05:03'),(125,965,'2006-02-15 05:05:03'),(126,21,'2006-02-15 05:05:03'),(126,34,'2006-02-15 05:05:03'),(126,43,'2006-02-15 05:05:03'),(126,58,'2006-02-15 05:05:03'),(126,85,'2006-02-15 05:05:03'),(126,96,'2006-02-15 05:05:03'),(126,193,'2006-02-15 05:05:03'),(126,194,'2006-02-15 05:05:03'),(126,199,'2006-02-15 05:05:03'),(126,256,'2006-02-15 05:05:03'),(126,263,'2006-02-15 05:05:03'),(126,288,'2006-02-15 05:05:03'),(126,317,'2006-02-15 05:05:03'),(126,347,'2006-02-15 05:05:03'),(126,369,'2006-02-15 05:05:03'),(126,370,'2006-02-15 05:05:03'),(126,419,'2006-02-15 05:05:03'),(126,468,'2006-02-15 05:05:03'),(126,469,'2006-02-15 05:05:03'),(126,545,'2006-02-15 05:05:03'),(126,685,'2006-02-15 05:05:03'),(126,836,'2006-02-15 05:05:03'),(126,860,'2006-02-15 05:05:03'),(127,36,'2006-02-15 05:05:03'),(127,47,'2006-02-15 05:05:03'),(127,48,'2006-02-15 05:05:03'),(127,79,'2006-02-15 05:05:03'),(127,119,'2006-02-15 05:05:03'),(127,141,'2006-02-15 05:05:03'),(127,157,'2006-02-15 05:05:03'),(127,202,'2006-02-15 05:05:03'),(127,286,'2006-02-15 05:05:03'),(127,333,'2006-02-15 05:05:03'),(127,354,'2006-02-15 05:05:03'),(127,366,'2006-02-15 05:05:03'),(127,382,'2006-02-15 05:05:03'),(127,388,'2006-02-15 05:05:03'),(127,411,'2006-02-15 05:05:03'),(127,459,'2006-02-15 05:05:03'),(127,553,'2006-02-15 05:05:03'),(127,573,'2006-02-15 05:05:03'),(127,613,'2006-02-15 05:05:03'),(127,617,'2006-02-15 05:05:03'),(127,641,'2006-02-15 05:05:03'),(127,710,'2006-02-15 05:05:03'),(127,727,'2006-02-15 05:05:03'),(127,749,'2006-02-15 05:05:03'),(127,763,'2006-02-15 05:05:03'),(127,771,'2006-02-15 05:05:03'),(127,791,'2006-02-15 05:05:03'),(127,819,'2006-02-15 05:05:03'),(127,839,'2006-02-15 05:05:03'),(127,846,'2006-02-15 05:05:03'),(127,911,'2006-02-15 05:05:03'),(127,953,'2006-02-15 05:05:03'),(127,970,'2006-02-15 05:05:03'),(128,26,'2006-02-15 05:05:03'),(128,82,'2006-02-15 05:05:03'),(128,119,'2006-02-15 05:05:03'),(128,168,'2006-02-15 05:05:03'),(128,212,'2006-02-15 05:05:03'),(128,238,'2006-02-15 05:05:03'),(128,299,'2006-02-15 05:05:03'),(128,312,'2006-02-15 05:05:03'),(128,326,'2006-02-15 05:05:03'),(128,336,'2006-02-15 05:05:03'),(128,345,'2006-02-15 05:05:03'),(128,407,'2006-02-15 05:05:03'),(128,462,'2006-02-15 05:05:03'),(128,485,'2006-02-15 05:05:03'),(128,516,'2006-02-15 05:05:03'),(128,564,'2006-02-15 05:05:03'),(128,614,'2006-02-15 05:05:03'),(128,650,'2006-02-15 05:05:03'),(128,665,'2006-02-15 05:05:03'),(128,671,'2006-02-15 05:05:03'),(128,693,'2006-02-15 05:05:03'),(128,696,'2006-02-15 05:05:03'),(128,759,'2006-02-15 05:05:03'),(128,774,'2006-02-15 05:05:03'),(128,814,'2006-02-15 05:05:03'),(128,899,'2006-02-15 05:05:03'),(128,912,'2006-02-15 05:05:03'),(128,944,'2006-02-15 05:05:03'),(128,949,'2006-02-15 05:05:03'),(128,965,'2006-02-15 05:05:03'),(129,56,'2006-02-15 05:05:03'),(129,89,'2006-02-15 05:05:03'),(129,101,'2006-02-15 05:05:03'),(129,166,'2006-02-15 05:05:03'),(129,202,'2006-02-15 05:05:03'),(129,230,'2006-02-15 05:05:03'),(129,247,'2006-02-15 05:05:03'),(129,249,'2006-02-15 05:05:03'),(129,348,'2006-02-15 05:05:03'),(129,367,'2006-02-15 05:05:03'),(129,391,'2006-02-15 05:05:03'),(129,418,'2006-02-15 05:05:03'),(129,431,'2006-02-15 05:05:03'),(129,452,'2006-02-15 05:05:03'),(129,471,'2006-02-15 05:05:03'),(129,520,'2006-02-15 05:05:03'),(129,597,'2006-02-15 05:05:03'),(129,602,'2006-02-15 05:05:03'),(129,640,'2006-02-15 05:05:03'),(129,669,'2006-02-15 05:05:03'),(129,684,'2006-02-15 05:05:03'),(129,705,'2006-02-15 05:05:03'),(129,805,'2006-02-15 05:05:03'),(129,826,'2006-02-15 05:05:03'),(129,834,'2006-02-15 05:05:03'),(129,857,'2006-02-15 05:05:03'),(129,910,'2006-02-15 05:05:03'),(129,920,'2006-02-15 05:05:03'),(129,938,'2006-02-15 05:05:03'),(129,962,'2006-02-15 05:05:03'),(130,9,'2006-02-15 05:05:03'),(130,26,'2006-02-15 05:05:03'),(130,37,'2006-02-15 05:05:03'),(130,43,'2006-02-15 05:05:03'),(130,49,'2006-02-15 05:05:03'),(130,57,'2006-02-15 05:05:03'),(130,107,'2006-02-15 05:05:03'),(130,112,'2006-02-15 05:05:03'),(130,208,'2006-02-15 05:05:03'),(130,326,'2006-02-15 05:05:03'),(130,375,'2006-02-15 05:05:03'),(130,416,'2006-02-15 05:05:03'),(130,431,'2006-02-15 05:05:03'),(130,452,'2006-02-15 05:05:03'),(130,453,'2006-02-15 05:05:03'),(130,478,'2006-02-15 05:05:03'),(130,507,'2006-02-15 05:05:03'),(130,525,'2006-02-15 05:05:03'),(130,549,'2006-02-15 05:05:03'),(130,592,'2006-02-15 05:05:03'),(130,702,'2006-02-15 05:05:03'),(130,725,'2006-02-15 05:05:03'),(130,764,'2006-02-15 05:05:03'),(130,809,'2006-02-15 05:05:03'),(130,869,'2006-02-15 05:05:03'),(130,930,'2006-02-15 05:05:03'),(130,981,'2006-02-15 05:05:03'),(131,48,'2006-02-15 05:05:03'),(131,66,'2006-02-15 05:05:03'),(131,94,'2006-02-15 05:05:03'),(131,120,'2006-02-15 05:05:03'),(131,147,'2006-02-15 05:05:03'),(131,206,'2006-02-15 05:05:03'),(131,320,'2006-02-15 05:05:03'),(131,383,'2006-02-15 05:05:03'),(131,432,'2006-02-15 05:05:03'),(131,436,'2006-02-15 05:05:03'),(131,450,'2006-02-15 05:05:03'),(131,479,'2006-02-15 05:05:03'),(131,494,'2006-02-15 05:05:03'),(131,515,'2006-02-15 05:05:03'),(131,539,'2006-02-15 05:05:03'),(131,590,'2006-02-15 05:05:03'),(131,647,'2006-02-15 05:05:03'),(131,693,'2006-02-15 05:05:03'),(131,713,'2006-02-15 05:05:03'),(131,770,'2006-02-15 05:05:03'),(131,798,'2006-02-15 05:05:03'),(131,809,'2006-02-15 05:05:03'),(131,875,'2006-02-15 05:05:03'),(131,881,'2006-02-15 05:05:03'),(131,921,'2006-02-15 05:05:03'),(132,81,'2006-02-15 05:05:03'),(132,82,'2006-02-15 05:05:03'),(132,133,'2006-02-15 05:05:03'),(132,156,'2006-02-15 05:05:03'),(132,162,'2006-02-15 05:05:03'),(132,311,'2006-02-15 05:05:03'),(132,345,'2006-02-15 05:05:03'),(132,377,'2006-02-15 05:05:03'),(132,410,'2006-02-15 05:05:03'),(132,538,'2006-02-15 05:05:03'),(132,562,'2006-02-15 05:05:03'),(132,586,'2006-02-15 05:05:03'),(132,626,'2006-02-15 05:05:03'),(132,637,'2006-02-15 05:05:03'),(132,698,'2006-02-15 05:05:03'),(132,756,'2006-02-15 05:05:03'),(132,806,'2006-02-15 05:05:03'),(132,897,'2006-02-15 05:05:03'),(132,899,'2006-02-15 05:05:03'),(132,904,'2006-02-15 05:05:03'),(132,930,'2006-02-15 05:05:03'),(132,987,'2006-02-15 05:05:03'),(133,7,'2006-02-15 05:05:03'),(133,51,'2006-02-15 05:05:03'),(133,133,'2006-02-15 05:05:03'),(133,172,'2006-02-15 05:05:03'),(133,210,'2006-02-15 05:05:03'),(133,270,'2006-02-15 05:05:03'),(133,280,'2006-02-15 05:05:03'),(133,286,'2006-02-15 05:05:03'),(133,338,'2006-02-15 05:05:03'),(133,342,'2006-02-15 05:05:03'),(133,351,'2006-02-15 05:05:03'),(133,368,'2006-02-15 05:05:03'),(133,385,'2006-02-15 05:05:03'),(133,390,'2006-02-15 05:05:03'),(133,397,'2006-02-15 05:05:03'),(133,410,'2006-02-15 05:05:03'),(133,452,'2006-02-15 05:05:03'),(133,463,'2006-02-15 05:05:03'),(133,514,'2006-02-15 05:05:03'),(133,588,'2006-02-15 05:05:03'),(133,594,'2006-02-15 05:05:03'),(133,635,'2006-02-15 05:05:03'),(133,652,'2006-02-15 05:05:03'),(133,727,'2006-02-15 05:05:03'),(133,806,'2006-02-15 05:05:03'),(133,868,'2006-02-15 05:05:03'),(133,882,'2006-02-15 05:05:03'),(133,894,'2006-02-15 05:05:03'),(133,933,'2006-02-15 05:05:03'),(133,952,'2006-02-15 05:05:03'),(134,132,'2006-02-15 05:05:03'),(134,145,'2006-02-15 05:05:03'),(134,161,'2006-02-15 05:05:03'),(134,219,'2006-02-15 05:05:03'),(134,243,'2006-02-15 05:05:03'),(134,250,'2006-02-15 05:05:03'),(134,278,'2006-02-15 05:05:03'),(134,341,'2006-02-15 05:05:03'),(134,386,'2006-02-15 05:05:03'),(134,413,'2006-02-15 05:05:03'),(134,558,'2006-02-15 05:05:03'),(134,588,'2006-02-15 05:05:03'),(134,624,'2006-02-15 05:05:03'),(134,655,'2006-02-15 05:05:03'),(134,683,'2006-02-15 05:05:03'),(134,690,'2006-02-15 05:05:03'),(134,861,'2006-02-15 05:05:03'),(134,896,'2006-02-15 05:05:03'),(134,897,'2006-02-15 05:05:03'),(134,915,'2006-02-15 05:05:03'),(134,927,'2006-02-15 05:05:03'),(134,936,'2006-02-15 05:05:03'),(135,35,'2006-02-15 05:05:03'),(135,41,'2006-02-15 05:05:03'),(135,65,'2006-02-15 05:05:03'),(135,88,'2006-02-15 05:05:03'),(135,170,'2006-02-15 05:05:03'),(135,269,'2006-02-15 05:05:03'),(135,320,'2006-02-15 05:05:03'),(135,353,'2006-02-15 05:05:03'),(135,357,'2006-02-15 05:05:03'),(135,364,'2006-02-15 05:05:03'),(135,455,'2006-02-15 05:05:03'),(135,458,'2006-02-15 05:05:03'),(135,484,'2006-02-15 05:05:03'),(135,541,'2006-02-15 05:05:03'),(135,553,'2006-02-15 05:05:03'),(135,616,'2006-02-15 05:05:03'),(135,628,'2006-02-15 05:05:03'),(135,719,'2006-02-15 05:05:03'),(135,814,'2006-02-15 05:05:03'),(135,905,'2006-02-15 05:05:03'),(136,20,'2006-02-15 05:05:03'),(136,25,'2006-02-15 05:05:03'),(136,33,'2006-02-15 05:05:03'),(136,56,'2006-02-15 05:05:03'),(136,61,'2006-02-15 05:05:03'),(136,193,'2006-02-15 05:05:03'),(136,214,'2006-02-15 05:05:03'),(136,229,'2006-02-15 05:05:03'),(136,243,'2006-02-15 05:05:03'),(136,256,'2006-02-15 05:05:03'),(136,262,'2006-02-15 05:05:03'),(136,271,'2006-02-15 05:05:03'),(136,288,'2006-02-15 05:05:03'),(136,300,'2006-02-15 05:05:03'),(136,364,'2006-02-15 05:05:03'),(136,401,'2006-02-15 05:05:03'),(136,414,'2006-02-15 05:05:03'),(136,420,'2006-02-15 05:05:03'),(136,474,'2006-02-15 05:05:03'),(136,485,'2006-02-15 05:05:03'),(136,542,'2006-02-15 05:05:03'),(136,552,'2006-02-15 05:05:03'),(136,620,'2006-02-15 05:05:03'),(136,649,'2006-02-15 05:05:03'),(136,686,'2006-02-15 05:05:03'),(136,781,'2006-02-15 05:05:03'),(136,806,'2006-02-15 05:05:03'),(136,808,'2006-02-15 05:05:03'),(136,818,'2006-02-15 05:05:03'),(136,842,'2006-02-15 05:05:03'),(136,933,'2006-02-15 05:05:03'),(136,993,'2006-02-15 05:05:03'),(137,6,'2006-02-15 05:05:03'),(137,14,'2006-02-15 05:05:03'),(137,56,'2006-02-15 05:05:03'),(137,96,'2006-02-15 05:05:03'),(137,160,'2006-02-15 05:05:03'),(137,224,'2006-02-15 05:05:03'),(137,249,'2006-02-15 05:05:03'),(137,254,'2006-02-15 05:05:03'),(137,263,'2006-02-15 05:05:03'),(137,268,'2006-02-15 05:05:03'),(137,304,'2006-02-15 05:05:03'),(137,390,'2006-02-15 05:05:03'),(137,410,'2006-02-15 05:05:03'),(137,433,'2006-02-15 05:05:03'),(137,446,'2006-02-15 05:05:03'),(137,489,'2006-02-15 05:05:03'),(137,530,'2006-02-15 05:05:03'),(137,564,'2006-02-15 05:05:03'),(137,603,'2006-02-15 05:05:03'),(137,610,'2006-02-15 05:05:03'),(137,688,'2006-02-15 05:05:03'),(137,703,'2006-02-15 05:05:03'),(137,745,'2006-02-15 05:05:03'),(137,758,'2006-02-15 05:05:03'),(137,832,'2006-02-15 05:05:03'),(137,841,'2006-02-15 05:05:03'),(137,917,'2006-02-15 05:05:03'),(138,8,'2006-02-15 05:05:03'),(138,52,'2006-02-15 05:05:03'),(138,61,'2006-02-15 05:05:03'),(138,125,'2006-02-15 05:05:03'),(138,157,'2006-02-15 05:05:03'),(138,214,'2006-02-15 05:05:03'),(138,258,'2006-02-15 05:05:03'),(138,376,'2006-02-15 05:05:03'),(138,403,'2006-02-15 05:05:03'),(138,446,'2006-02-15 05:05:03'),(138,453,'2006-02-15 05:05:03'),(138,508,'2006-02-15 05:05:03'),(138,553,'2006-02-15 05:05:03'),(138,561,'2006-02-15 05:05:03'),(138,583,'2006-02-15 05:05:03'),(138,627,'2006-02-15 05:05:03'),(138,639,'2006-02-15 05:05:03'),(138,695,'2006-02-15 05:05:03'),(138,747,'2006-02-15 05:05:03'),(138,879,'2006-02-15 05:05:03'),(138,885,'2006-02-15 05:05:03'),(138,923,'2006-02-15 05:05:03'),(138,970,'2006-02-15 05:05:03'),(138,989,'2006-02-15 05:05:03'),(139,20,'2006-02-15 05:05:03'),(139,35,'2006-02-15 05:05:03'),(139,57,'2006-02-15 05:05:03'),(139,74,'2006-02-15 05:05:03'),(139,90,'2006-02-15 05:05:03'),(139,107,'2006-02-15 05:05:03'),(139,155,'2006-02-15 05:05:03'),(139,170,'2006-02-15 05:05:03'),(139,181,'2006-02-15 05:05:03'),(139,200,'2006-02-15 05:05:03'),(139,229,'2006-02-15 05:05:03'),(139,233,'2006-02-15 05:05:03'),(139,261,'2006-02-15 05:05:03'),(139,262,'2006-02-15 05:05:03'),(139,266,'2006-02-15 05:05:03'),(139,282,'2006-02-15 05:05:03'),(139,284,'2006-02-15 05:05:03'),(139,373,'2006-02-15 05:05:03'),(139,447,'2006-02-15 05:05:03'),(139,489,'2006-02-15 05:05:03'),(139,529,'2006-02-15 05:05:03'),(139,540,'2006-02-15 05:05:03'),(139,570,'2006-02-15 05:05:03'),(139,602,'2006-02-15 05:05:03'),(139,605,'2006-02-15 05:05:03'),(139,636,'2006-02-15 05:05:03'),(139,691,'2006-02-15 05:05:03'),(139,706,'2006-02-15 05:05:03'),(139,719,'2006-02-15 05:05:03'),(139,744,'2006-02-15 05:05:03'),(139,746,'2006-02-15 05:05:03'),(139,862,'2006-02-15 05:05:03'),(139,892,'2006-02-15 05:05:03'),(140,27,'2006-02-15 05:05:03'),(140,77,'2006-02-15 05:05:03'),(140,112,'2006-02-15 05:05:03'),(140,135,'2006-02-15 05:05:03'),(140,185,'2006-02-15 05:05:03'),(140,258,'2006-02-15 05:05:03'),(140,370,'2006-02-15 05:05:03'),(140,373,'2006-02-15 05:05:03'),(140,498,'2006-02-15 05:05:03'),(140,509,'2006-02-15 05:05:03'),(140,576,'2006-02-15 05:05:03'),(140,587,'2006-02-15 05:05:03'),(140,599,'2006-02-15 05:05:03'),(140,608,'2006-02-15 05:05:03'),(140,647,'2006-02-15 05:05:03'),(140,665,'2006-02-15 05:05:03'),(140,670,'2006-02-15 05:05:03'),(140,693,'2006-02-15 05:05:03'),(140,702,'2006-02-15 05:05:03'),(140,729,'2006-02-15 05:05:03'),(140,730,'2006-02-15 05:05:03'),(140,731,'2006-02-15 05:05:03'),(140,736,'2006-02-15 05:05:03'),(140,742,'2006-02-15 05:05:03'),(140,778,'2006-02-15 05:05:03'),(140,820,'2006-02-15 05:05:03'),(140,830,'2006-02-15 05:05:03'),(140,835,'2006-02-15 05:05:03'),(140,857,'2006-02-15 05:05:03'),(140,923,'2006-02-15 05:05:03'),(140,934,'2006-02-15 05:05:03'),(140,999,'2006-02-15 05:05:03'),(141,43,'2006-02-15 05:05:03'),(141,67,'2006-02-15 05:05:03'),(141,188,'2006-02-15 05:05:03'),(141,191,'2006-02-15 05:05:03'),(141,207,'2006-02-15 05:05:03'),(141,223,'2006-02-15 05:05:03'),(141,341,'2006-02-15 05:05:03'),(141,358,'2006-02-15 05:05:03'),(141,380,'2006-02-15 05:05:03'),(141,395,'2006-02-15 05:05:03'),(141,467,'2006-02-15 05:05:03'),(141,491,'2006-02-15 05:05:03'),(141,589,'2006-02-15 05:05:03'),(141,607,'2006-02-15 05:05:03'),(141,673,'2006-02-15 05:05:03'),(141,740,'2006-02-15 05:05:03'),(141,752,'2006-02-15 05:05:03'),(141,768,'2006-02-15 05:05:03'),(141,772,'2006-02-15 05:05:03'),(141,787,'2006-02-15 05:05:03'),(141,821,'2006-02-15 05:05:03'),(141,829,'2006-02-15 05:05:03'),(141,840,'2006-02-15 05:05:03'),(141,849,'2006-02-15 05:05:03'),(141,862,'2006-02-15 05:05:03'),(141,863,'2006-02-15 05:05:03'),(141,909,'2006-02-15 05:05:03'),(141,992,'2006-02-15 05:05:03'),(142,10,'2006-02-15 05:05:03'),(142,18,'2006-02-15 05:05:03'),(142,107,'2006-02-15 05:05:03'),(142,139,'2006-02-15 05:05:03'),(142,186,'2006-02-15 05:05:03'),(142,199,'2006-02-15 05:05:03'),(142,248,'2006-02-15 05:05:03'),(142,328,'2006-02-15 05:05:03'),(142,350,'2006-02-15 05:05:03'),(142,371,'2006-02-15 05:05:03'),(142,470,'2006-02-15 05:05:03'),(142,481,'2006-02-15 05:05:03'),(142,494,'2006-02-15 05:05:03'),(142,501,'2006-02-15 05:05:03'),(142,504,'2006-02-15 05:05:03'),(142,540,'2006-02-15 05:05:03'),(142,554,'2006-02-15 05:05:03'),(142,575,'2006-02-15 05:05:03'),(142,608,'2006-02-15 05:05:03'),(142,710,'2006-02-15 05:05:03'),(142,712,'2006-02-15 05:05:03'),(142,735,'2006-02-15 05:05:03'),(142,759,'2006-02-15 05:05:03'),(142,794,'2006-02-15 05:05:03'),(142,842,'2006-02-15 05:05:03'),(142,859,'2006-02-15 05:05:03'),(142,863,'2006-02-15 05:05:03'),(142,875,'2006-02-15 05:05:03'),(142,906,'2006-02-15 05:05:03'),(142,914,'2006-02-15 05:05:03'),(142,999,'2006-02-15 05:05:03'),(143,47,'2006-02-15 05:05:03'),(143,79,'2006-02-15 05:05:03'),(143,141,'2006-02-15 05:05:03'),(143,175,'2006-02-15 05:05:03'),(143,232,'2006-02-15 05:05:03'),(143,239,'2006-02-15 05:05:03'),(143,316,'2006-02-15 05:05:03'),(143,339,'2006-02-15 05:05:03'),(143,361,'2006-02-15 05:05:03'),(143,386,'2006-02-15 05:05:03'),(143,404,'2006-02-15 05:05:03'),(143,457,'2006-02-15 05:05:03'),(143,485,'2006-02-15 05:05:03'),(143,497,'2006-02-15 05:05:03'),(143,560,'2006-02-15 05:05:03'),(143,576,'2006-02-15 05:05:03'),(143,603,'2006-02-15 05:05:03'),(143,613,'2006-02-15 05:05:03'),(143,659,'2006-02-15 05:05:03'),(143,660,'2006-02-15 05:05:03'),(143,680,'2006-02-15 05:05:03'),(143,687,'2006-02-15 05:05:03'),(143,690,'2006-02-15 05:05:03'),(143,706,'2006-02-15 05:05:03'),(143,792,'2006-02-15 05:05:03'),(143,821,'2006-02-15 05:05:03'),(143,830,'2006-02-15 05:05:03'),(143,872,'2006-02-15 05:05:03'),(143,878,'2006-02-15 05:05:03'),(143,906,'2006-02-15 05:05:03'),(143,958,'2006-02-15 05:05:03'),(144,18,'2006-02-15 05:05:03'),(144,67,'2006-02-15 05:05:03'),(144,79,'2006-02-15 05:05:03'),(144,90,'2006-02-15 05:05:03'),(144,99,'2006-02-15 05:05:03'),(144,105,'2006-02-15 05:05:03'),(144,123,'2006-02-15 05:05:03'),(144,125,'2006-02-15 05:05:03'),(144,127,'2006-02-15 05:05:03'),(144,130,'2006-02-15 05:05:03'),(144,135,'2006-02-15 05:05:03'),(144,164,'2006-02-15 05:05:03'),(144,184,'2006-02-15 05:05:03'),(144,216,'2006-02-15 05:05:03'),(144,228,'2006-02-15 05:05:03'),(144,260,'2006-02-15 05:05:03'),(144,272,'2006-02-15 05:05:03'),(144,291,'2006-02-15 05:05:03'),(144,293,'2006-02-15 05:05:03'),(144,312,'2006-02-15 05:05:03'),(144,393,'2006-02-15 05:05:03'),(144,396,'2006-02-15 05:05:03'),(144,473,'2006-02-15 05:05:03'),(144,504,'2006-02-15 05:05:03'),(144,540,'2006-02-15 05:05:03'),(144,599,'2006-02-15 05:05:03'),(144,668,'2006-02-15 05:05:03'),(144,702,'2006-02-15 05:05:03'),(144,753,'2006-02-15 05:05:03'),(144,762,'2006-02-15 05:05:03'),(144,776,'2006-02-15 05:05:03'),(144,785,'2006-02-15 05:05:03'),(144,845,'2006-02-15 05:05:03'),(144,894,'2006-02-15 05:05:03'),(144,953,'2006-02-15 05:05:03'),(145,39,'2006-02-15 05:05:03'),(145,109,'2006-02-15 05:05:03'),(145,120,'2006-02-15 05:05:03'),(145,154,'2006-02-15 05:05:03'),(145,155,'2006-02-15 05:05:03'),(145,243,'2006-02-15 05:05:03'),(145,293,'2006-02-15 05:05:03'),(145,402,'2006-02-15 05:05:03'),(145,409,'2006-02-15 05:05:03'),(145,457,'2006-02-15 05:05:03'),(145,475,'2006-02-15 05:05:03'),(145,487,'2006-02-15 05:05:03'),(145,494,'2006-02-15 05:05:03'),(145,527,'2006-02-15 05:05:03'),(145,592,'2006-02-15 05:05:03'),(145,625,'2006-02-15 05:05:03'),(145,629,'2006-02-15 05:05:03'),(145,641,'2006-02-15 05:05:03'),(145,661,'2006-02-15 05:05:03'),(145,664,'2006-02-15 05:05:03'),(145,692,'2006-02-15 05:05:03'),(145,713,'2006-02-15 05:05:03'),(145,726,'2006-02-15 05:05:03'),(145,748,'2006-02-15 05:05:03'),(145,822,'2006-02-15 05:05:03'),(145,893,'2006-02-15 05:05:03'),(145,923,'2006-02-15 05:05:03'),(145,953,'2006-02-15 05:05:03'),(146,12,'2006-02-15 05:05:03'),(146,16,'2006-02-15 05:05:03'),(146,33,'2006-02-15 05:05:03'),(146,117,'2006-02-15 05:05:03'),(146,177,'2006-02-15 05:05:03'),(146,191,'2006-02-15 05:05:03'),(146,197,'2006-02-15 05:05:03'),(146,207,'2006-02-15 05:05:03'),(146,218,'2006-02-15 05:05:03'),(146,278,'2006-02-15 05:05:03'),(146,296,'2006-02-15 05:05:03'),(146,314,'2006-02-15 05:05:03'),(146,320,'2006-02-15 05:05:03'),(146,372,'2006-02-15 05:05:03'),(146,384,'2006-02-15 05:05:03'),(146,402,'2006-02-15 05:05:03'),(146,410,'2006-02-15 05:05:03'),(146,427,'2006-02-15 05:05:03'),(146,429,'2006-02-15 05:05:03'),(146,512,'2006-02-15 05:05:03'),(146,514,'2006-02-15 05:05:03'),(146,571,'2006-02-15 05:05:03'),(146,591,'2006-02-15 05:05:03'),(146,720,'2006-02-15 05:05:03'),(146,731,'2006-02-15 05:05:03'),(146,734,'2006-02-15 05:05:03'),(146,871,'2006-02-15 05:05:03'),(146,909,'2006-02-15 05:05:03'),(146,922,'2006-02-15 05:05:03'),(146,945,'2006-02-15 05:05:03'),(146,955,'2006-02-15 05:05:03'),(146,966,'2006-02-15 05:05:03'),(146,969,'2006-02-15 05:05:03'),(147,4,'2006-02-15 05:05:03'),(147,85,'2006-02-15 05:05:03'),(147,131,'2006-02-15 05:05:03'),(147,139,'2006-02-15 05:05:03'),(147,145,'2006-02-15 05:05:03'),(147,178,'2006-02-15 05:05:03'),(147,251,'2006-02-15 05:05:03'),(147,254,'2006-02-15 05:05:03'),(147,295,'2006-02-15 05:05:03'),(147,298,'2006-02-15 05:05:03'),(147,305,'2006-02-15 05:05:03'),(147,310,'2006-02-15 05:05:03'),(147,318,'2006-02-15 05:05:03'),(147,333,'2006-02-15 05:05:03'),(147,341,'2006-02-15 05:05:03'),(147,351,'2006-02-15 05:05:03'),(147,394,'2006-02-15 05:05:03'),(147,402,'2006-02-15 05:05:03'),(147,405,'2006-02-15 05:05:03'),(147,410,'2006-02-15 05:05:03'),(147,431,'2006-02-15 05:05:03'),(147,443,'2006-02-15 05:05:03'),(147,508,'2006-02-15 05:05:03'),(147,554,'2006-02-15 05:05:03'),(147,563,'2006-02-15 05:05:03'),(147,649,'2006-02-15 05:05:03'),(147,688,'2006-02-15 05:05:03'),(147,708,'2006-02-15 05:05:03'),(147,864,'2006-02-15 05:05:03'),(147,957,'2006-02-15 05:05:03'),(147,987,'2006-02-15 05:05:03'),(148,27,'2006-02-15 05:05:03'),(148,57,'2006-02-15 05:05:03'),(148,133,'2006-02-15 05:05:03'),(148,149,'2006-02-15 05:05:03'),(148,226,'2006-02-15 05:05:03'),(148,342,'2006-02-15 05:05:03'),(148,368,'2006-02-15 05:05:03'),(148,422,'2006-02-15 05:05:03'),(148,468,'2006-02-15 05:05:03'),(148,633,'2006-02-15 05:05:03'),(148,718,'2006-02-15 05:05:03'),(148,768,'2006-02-15 05:05:03'),(148,772,'2006-02-15 05:05:03'),(148,792,'2006-02-15 05:05:03'),(149,53,'2006-02-15 05:05:03'),(149,72,'2006-02-15 05:05:03'),(149,95,'2006-02-15 05:05:03'),(149,118,'2006-02-15 05:05:03'),(149,139,'2006-02-15 05:05:03'),(149,146,'2006-02-15 05:05:03'),(149,153,'2006-02-15 05:05:03'),(149,159,'2006-02-15 05:05:03'),(149,169,'2006-02-15 05:05:03'),(149,178,'2006-02-15 05:05:03'),(149,188,'2006-02-15 05:05:03'),(149,193,'2006-02-15 05:05:03'),(149,339,'2006-02-15 05:05:03'),(149,354,'2006-02-15 05:05:03'),(149,362,'2006-02-15 05:05:03'),(149,365,'2006-02-15 05:05:03'),(149,458,'2006-02-15 05:05:03'),(149,631,'2006-02-15 05:05:03'),(149,670,'2006-02-15 05:05:03'),(149,685,'2006-02-15 05:05:03'),(149,761,'2006-02-15 05:05:03'),(149,782,'2006-02-15 05:05:03'),(149,810,'2006-02-15 05:05:03'),(149,811,'2006-02-15 05:05:03'),(149,899,'2006-02-15 05:05:03'),(149,905,'2006-02-15 05:05:03'),(149,913,'2006-02-15 05:05:03'),(149,921,'2006-02-15 05:05:03'),(149,947,'2006-02-15 05:05:03'),(149,949,'2006-02-15 05:05:03'),(149,992,'2006-02-15 05:05:03'),(150,23,'2006-02-15 05:05:03'),(150,63,'2006-02-15 05:05:03'),(150,75,'2006-02-15 05:05:03'),(150,94,'2006-02-15 05:05:03'),(150,105,'2006-02-15 05:05:03'),(150,168,'2006-02-15 05:05:03'),(150,190,'2006-02-15 05:05:03'),(150,206,'2006-02-15 05:05:03'),(150,233,'2006-02-15 05:05:03'),(150,270,'2006-02-15 05:05:03'),(150,285,'2006-02-15 05:05:03'),(150,306,'2006-02-15 05:05:03'),(150,386,'2006-02-15 05:05:03'),(150,433,'2006-02-15 05:05:03'),(150,446,'2006-02-15 05:05:03'),(150,447,'2006-02-15 05:05:03'),(150,468,'2006-02-15 05:05:03'),(150,508,'2006-02-15 05:05:03'),(150,542,'2006-02-15 05:05:03'),(150,551,'2006-02-15 05:05:03'),(150,629,'2006-02-15 05:05:03'),(150,647,'2006-02-15 05:05:03'),(150,672,'2006-02-15 05:05:03'),(150,697,'2006-02-15 05:05:03'),(150,728,'2006-02-15 05:05:03'),(150,777,'2006-02-15 05:05:03'),(150,854,'2006-02-15 05:05:03'),(150,873,'2006-02-15 05:05:03'),(150,880,'2006-02-15 05:05:03'),(150,887,'2006-02-15 05:05:03'),(150,889,'2006-02-15 05:05:03'),(150,892,'2006-02-15 05:05:03'),(150,953,'2006-02-15 05:05:03'),(150,962,'2006-02-15 05:05:03'),(151,131,'2006-02-15 05:05:03'),(151,144,'2006-02-15 05:05:03'),(151,167,'2006-02-15 05:05:03'),(151,170,'2006-02-15 05:05:03'),(151,217,'2006-02-15 05:05:03'),(151,232,'2006-02-15 05:05:03'),(151,342,'2006-02-15 05:05:03'),(151,367,'2006-02-15 05:05:03'),(151,370,'2006-02-15 05:05:03'),(151,382,'2006-02-15 05:05:03'),(151,451,'2006-02-15 05:05:03'),(151,463,'2006-02-15 05:05:03'),(151,482,'2006-02-15 05:05:03'),(151,501,'2006-02-15 05:05:03'),(151,527,'2006-02-15 05:05:03'),(151,539,'2006-02-15 05:05:03'),(151,570,'2006-02-15 05:05:03'),(151,574,'2006-02-15 05:05:03'),(151,634,'2006-02-15 05:05:03'),(151,658,'2006-02-15 05:05:03'),(151,665,'2006-02-15 05:05:03'),(151,703,'2006-02-15 05:05:03'),(151,880,'2006-02-15 05:05:03'),(151,892,'2006-02-15 05:05:03'),(151,895,'2006-02-15 05:05:03'),(151,989,'2006-02-15 05:05:03'),(152,59,'2006-02-15 05:05:03'),(152,153,'2006-02-15 05:05:03'),(152,217,'2006-02-15 05:05:03'),(152,248,'2006-02-15 05:05:03'),(152,318,'2006-02-15 05:05:03'),(152,332,'2006-02-15 05:05:03'),(152,475,'2006-02-15 05:05:03'),(152,476,'2006-02-15 05:05:03'),(152,578,'2006-02-15 05:05:03'),(152,607,'2006-02-15 05:05:03'),(152,611,'2006-02-15 05:05:03'),(152,615,'2006-02-15 05:05:03'),(152,674,'2006-02-15 05:05:03'),(152,680,'2006-02-15 05:05:03'),(152,729,'2006-02-15 05:05:03'),(152,768,'2006-02-15 05:05:03'),(152,821,'2006-02-15 05:05:03'),(152,846,'2006-02-15 05:05:03'),(152,891,'2006-02-15 05:05:03'),(152,898,'2006-02-15 05:05:03'),(152,927,'2006-02-15 05:05:03'),(152,964,'2006-02-15 05:05:03'),(152,968,'2006-02-15 05:05:03'),(153,47,'2006-02-15 05:05:03'),(153,64,'2006-02-15 05:05:03'),(153,136,'2006-02-15 05:05:03'),(153,180,'2006-02-15 05:05:03'),(153,203,'2006-02-15 05:05:03'),(153,231,'2006-02-15 05:05:03'),(153,444,'2006-02-15 05:05:03'),(153,476,'2006-02-15 05:05:03'),(153,480,'2006-02-15 05:05:03'),(153,486,'2006-02-15 05:05:03'),(153,536,'2006-02-15 05:05:03'),(153,627,'2006-02-15 05:05:03'),(153,732,'2006-02-15 05:05:03'),(153,756,'2006-02-15 05:05:03'),(153,766,'2006-02-15 05:05:03'),(153,817,'2006-02-15 05:05:03'),(153,847,'2006-02-15 05:05:03'),(153,919,'2006-02-15 05:05:03'),(153,938,'2006-02-15 05:05:03'),(153,988,'2006-02-15 05:05:03'),(154,27,'2006-02-15 05:05:03'),(154,111,'2006-02-15 05:05:03'),(154,141,'2006-02-15 05:05:03'),(154,158,'2006-02-15 05:05:03'),(154,169,'2006-02-15 05:05:03'),(154,170,'2006-02-15 05:05:03'),(154,193,'2006-02-15 05:05:03'),(154,208,'2006-02-15 05:05:03'),(154,274,'2006-02-15 05:05:03'),(154,276,'2006-02-15 05:05:03'),(154,282,'2006-02-15 05:05:03'),(154,299,'2006-02-15 05:05:03'),(154,314,'2006-02-15 05:05:03'),(154,396,'2006-02-15 05:05:03'),(154,399,'2006-02-15 05:05:03'),(154,421,'2006-02-15 05:05:03'),(154,440,'2006-02-15 05:05:03'),(154,467,'2006-02-15 05:05:03'),(154,474,'2006-02-15 05:05:03'),(154,489,'2006-02-15 05:05:03'),(154,588,'2006-02-15 05:05:03'),(154,602,'2006-02-15 05:05:03'),(154,680,'2006-02-15 05:05:03'),(154,698,'2006-02-15 05:05:03'),(154,802,'2006-02-15 05:05:03'),(154,842,'2006-02-15 05:05:03'),(154,954,'2006-02-15 05:05:03'),(154,988,'2006-02-15 05:05:03'),(155,20,'2006-02-15 05:05:03'),(155,67,'2006-02-15 05:05:03'),(155,128,'2006-02-15 05:05:03'),(155,153,'2006-02-15 05:05:03'),(155,220,'2006-02-15 05:05:03'),(155,249,'2006-02-15 05:05:03'),(155,303,'2006-02-15 05:05:03'),(155,312,'2006-02-15 05:05:03'),(155,359,'2006-02-15 05:05:03'),(155,361,'2006-02-15 05:05:03'),(155,383,'2006-02-15 05:05:03'),(155,387,'2006-02-15 05:05:03'),(155,407,'2006-02-15 05:05:03'),(155,427,'2006-02-15 05:05:03'),(155,459,'2006-02-15 05:05:03'),(155,513,'2006-02-15 05:05:03'),(155,584,'2006-02-15 05:05:03'),(155,590,'2006-02-15 05:05:03'),(155,630,'2006-02-15 05:05:03'),(155,688,'2006-02-15 05:05:03'),(155,757,'2006-02-15 05:05:03'),(155,768,'2006-02-15 05:05:03'),(155,785,'2006-02-15 05:05:03'),(155,849,'2006-02-15 05:05:03'),(155,885,'2006-02-15 05:05:03'),(155,890,'2006-02-15 05:05:03'),(155,941,'2006-02-15 05:05:03'),(155,966,'2006-02-15 05:05:03'),(155,987,'2006-02-15 05:05:03'),(155,997,'2006-02-15 05:05:03'),(155,1000,'2006-02-15 05:05:03'),(156,53,'2006-02-15 05:05:03'),(156,155,'2006-02-15 05:05:03'),(156,198,'2006-02-15 05:05:03'),(156,244,'2006-02-15 05:05:03'),(156,262,'2006-02-15 05:05:03'),(156,263,'2006-02-15 05:05:03'),(156,285,'2006-02-15 05:05:03'),(156,297,'2006-02-15 05:05:03'),(156,301,'2006-02-15 05:05:03'),(156,349,'2006-02-15 05:05:03'),(156,379,'2006-02-15 05:05:03'),(156,448,'2006-02-15 05:05:03'),(156,462,'2006-02-15 05:05:03'),(156,467,'2006-02-15 05:05:03'),(156,504,'2006-02-15 05:05:03'),(156,518,'2006-02-15 05:05:03'),(156,593,'2006-02-15 05:05:03'),(156,646,'2006-02-15 05:05:03'),(156,705,'2006-02-15 05:05:03'),(156,754,'2006-02-15 05:05:03'),(156,775,'2006-02-15 05:05:03'),(156,844,'2006-02-15 05:05:03'),(157,10,'2006-02-15 05:05:03'),(157,24,'2006-02-15 05:05:03'),(157,34,'2006-02-15 05:05:03'),(157,122,'2006-02-15 05:05:03'),(157,159,'2006-02-15 05:05:03'),(157,183,'2006-02-15 05:05:03'),(157,210,'2006-02-15 05:05:03'),(157,217,'2006-02-15 05:05:03'),(157,291,'2006-02-15 05:05:03'),(157,303,'2006-02-15 05:05:03'),(157,321,'2006-02-15 05:05:03'),(157,326,'2006-02-15 05:05:03'),(157,353,'2006-02-15 05:05:03'),(157,400,'2006-02-15 05:05:03'),(157,406,'2006-02-15 05:05:03'),(157,431,'2006-02-15 05:05:03'),(157,496,'2006-02-15 05:05:03'),(157,535,'2006-02-15 05:05:03'),(157,573,'2006-02-15 05:05:03'),(157,574,'2006-02-15 05:05:03'),(157,604,'2006-02-15 05:05:03'),(157,616,'2006-02-15 05:05:03'),(157,642,'2006-02-15 05:05:03'),(157,661,'2006-02-15 05:05:03'),(157,696,'2006-02-15 05:05:03'),(157,713,'2006-02-15 05:05:03'),(157,802,'2006-02-15 05:05:03'),(157,835,'2006-02-15 05:05:03'),(157,874,'2006-02-15 05:05:03'),(157,913,'2006-02-15 05:05:03'),(157,967,'2006-02-15 05:05:03'),(157,973,'2006-02-15 05:05:03'),(158,32,'2006-02-15 05:05:03'),(158,47,'2006-02-15 05:05:03'),(158,64,'2006-02-15 05:05:03'),(158,66,'2006-02-15 05:05:03'),(158,102,'2006-02-15 05:05:03'),(158,121,'2006-02-15 05:05:03'),(158,177,'2006-02-15 05:05:03'),(158,178,'2006-02-15 05:05:03'),(158,188,'2006-02-15 05:05:03'),(158,215,'2006-02-15 05:05:03'),(158,241,'2006-02-15 05:05:03'),(158,293,'2006-02-15 05:05:03'),(158,437,'2006-02-15 05:05:03'),(158,473,'2006-02-15 05:05:03'),(158,483,'2006-02-15 05:05:03'),(158,532,'2006-02-15 05:05:03'),(158,555,'2006-02-15 05:05:03'),(158,581,'2006-02-15 05:05:03'),(158,601,'2006-02-15 05:05:03'),(158,616,'2006-02-15 05:05:03'),(158,626,'2006-02-15 05:05:03'),(158,637,'2006-02-15 05:05:03'),(158,799,'2006-02-15 05:05:03'),(158,812,'2006-02-15 05:05:03'),(158,824,'2006-02-15 05:05:03'),(158,830,'2006-02-15 05:05:03'),(158,840,'2006-02-15 05:05:03'),(158,869,'2006-02-15 05:05:03'),(158,879,'2006-02-15 05:05:03'),(158,880,'2006-02-15 05:05:03'),(158,894,'2006-02-15 05:05:03'),(158,896,'2006-02-15 05:05:03'),(158,967,'2006-02-15 05:05:03'),(158,968,'2006-02-15 05:05:03'),(158,990,'2006-02-15 05:05:03'),(159,20,'2006-02-15 05:05:03'),(159,82,'2006-02-15 05:05:03'),(159,127,'2006-02-15 05:05:03'),(159,187,'2006-02-15 05:05:03'),(159,206,'2006-02-15 05:05:03'),(159,208,'2006-02-15 05:05:03'),(159,223,'2006-02-15 05:05:03'),(159,248,'2006-02-15 05:05:03'),(159,342,'2006-02-15 05:05:03'),(159,343,'2006-02-15 05:05:03'),(159,344,'2006-02-15 05:05:03'),(159,364,'2006-02-15 05:05:03'),(159,418,'2006-02-15 05:05:03'),(159,549,'2006-02-15 05:05:03'),(159,561,'2006-02-15 05:05:03'),(159,600,'2006-02-15 05:05:03'),(159,674,'2006-02-15 05:05:03'),(159,680,'2006-02-15 05:05:03'),(159,784,'2006-02-15 05:05:03'),(159,789,'2006-02-15 05:05:03'),(159,800,'2006-02-15 05:05:03'),(159,802,'2006-02-15 05:05:03'),(159,818,'2006-02-15 05:05:03'),(159,876,'2006-02-15 05:05:03'),(159,907,'2006-02-15 05:05:03'),(159,978,'2006-02-15 05:05:03'),(160,2,'2006-02-15 05:05:03'),(160,17,'2006-02-15 05:05:03'),(160,43,'2006-02-15 05:05:03'),(160,242,'2006-02-15 05:05:03'),(160,267,'2006-02-15 05:05:03'),(160,275,'2006-02-15 05:05:03'),(160,368,'2006-02-15 05:05:03'),(160,455,'2006-02-15 05:05:03'),(160,469,'2006-02-15 05:05:03'),(160,484,'2006-02-15 05:05:03'),(160,579,'2006-02-15 05:05:03'),(160,660,'2006-02-15 05:05:03'),(160,755,'2006-02-15 05:05:03'),(160,767,'2006-02-15 05:05:03'),(160,769,'2006-02-15 05:05:03'),(160,794,'2006-02-15 05:05:03'),(160,826,'2006-02-15 05:05:03'),(160,883,'2006-02-15 05:05:03'),(160,950,'2006-02-15 05:05:03'),(160,954,'2006-02-15 05:05:03'),(161,43,'2006-02-15 05:05:03'),(161,58,'2006-02-15 05:05:03'),(161,89,'2006-02-15 05:05:03'),(161,90,'2006-02-15 05:05:03'),(161,120,'2006-02-15 05:05:03'),(161,188,'2006-02-15 05:05:03'),(161,247,'2006-02-15 05:05:03'),(161,269,'2006-02-15 05:05:03'),(161,281,'2006-02-15 05:05:03'),(161,340,'2006-02-15 05:05:03'),(161,353,'2006-02-15 05:05:03'),(161,401,'2006-02-15 05:05:03'),(161,414,'2006-02-15 05:05:03'),(161,425,'2006-02-15 05:05:03'),(161,469,'2006-02-15 05:05:03'),(161,526,'2006-02-15 05:05:03'),(161,588,'2006-02-15 05:05:03'),(161,644,'2006-02-15 05:05:03'),(161,653,'2006-02-15 05:05:03'),(161,655,'2006-02-15 05:05:03'),(161,669,'2006-02-15 05:05:03'),(161,684,'2006-02-15 05:05:03'),(161,714,'2006-02-15 05:05:03'),(161,749,'2006-02-15 05:05:03'),(161,807,'2006-02-15 05:05:03'),(161,825,'2006-02-15 05:05:03'),(161,850,'2006-02-15 05:05:03'),(161,880,'2006-02-15 05:05:03'),(161,920,'2006-02-15 05:05:03'),(161,921,'2006-02-15 05:05:03'),(161,924,'2006-02-15 05:05:03'),(161,927,'2006-02-15 05:05:03'),(162,1,'2006-02-15 05:05:03'),(162,4,'2006-02-15 05:05:03'),(162,7,'2006-02-15 05:05:03'),(162,18,'2006-02-15 05:05:03'),(162,28,'2006-02-15 05:05:03'),(162,32,'2006-02-15 05:05:03'),(162,33,'2006-02-15 05:05:03'),(162,41,'2006-02-15 05:05:03'),(162,85,'2006-02-15 05:05:03'),(162,121,'2006-02-15 05:05:03'),(162,164,'2006-02-15 05:05:03'),(162,274,'2006-02-15 05:05:03'),(162,279,'2006-02-15 05:05:03'),(162,409,'2006-02-15 05:05:03'),(162,410,'2006-02-15 05:05:03'),(162,415,'2006-02-15 05:05:03'),(162,500,'2006-02-15 05:05:03'),(162,574,'2006-02-15 05:05:03'),(162,612,'2006-02-15 05:05:03'),(162,636,'2006-02-15 05:05:03'),(162,659,'2006-02-15 05:05:03'),(162,786,'2006-02-15 05:05:03'),(162,844,'2006-02-15 05:05:03'),(162,909,'2006-02-15 05:05:03'),(162,968,'2006-02-15 05:05:03'),(163,30,'2006-02-15 05:05:03'),(163,45,'2006-02-15 05:05:03'),(163,166,'2006-02-15 05:05:03'),(163,180,'2006-02-15 05:05:03'),(163,239,'2006-02-15 05:05:03'),(163,283,'2006-02-15 05:05:03'),(163,303,'2006-02-15 05:05:03'),(163,304,'2006-02-15 05:05:03'),(163,307,'2006-02-15 05:05:03'),(163,394,'2006-02-15 05:05:03'),(163,409,'2006-02-15 05:05:03'),(163,434,'2006-02-15 05:05:03'),(163,444,'2006-02-15 05:05:03'),(163,522,'2006-02-15 05:05:03'),(163,719,'2006-02-15 05:05:03'),(163,785,'2006-02-15 05:05:03'),(163,833,'2006-02-15 05:05:03'),(163,881,'2006-02-15 05:05:03'),(163,891,'2006-02-15 05:05:03'),(163,947,'2006-02-15 05:05:03'),(163,996,'2006-02-15 05:05:03'),(164,15,'2006-02-15 05:05:03'),(164,23,'2006-02-15 05:05:03'),(164,148,'2006-02-15 05:05:03'),(164,169,'2006-02-15 05:05:03'),(164,252,'2006-02-15 05:05:03'),(164,324,'2006-02-15 05:05:03'),(164,347,'2006-02-15 05:05:03'),(164,367,'2006-02-15 05:05:03'),(164,431,'2006-02-15 05:05:03'),(164,448,'2006-02-15 05:05:03'),(164,469,'2006-02-15 05:05:03'),(164,545,'2006-02-15 05:05:03'),(164,610,'2006-02-15 05:05:03'),(164,613,'2006-02-15 05:05:03'),(164,673,'2006-02-15 05:05:03'),(164,681,'2006-02-15 05:05:03'),(164,698,'2006-02-15 05:05:03'),(164,801,'2006-02-15 05:05:03'),(164,820,'2006-02-15 05:05:03'),(164,832,'2006-02-15 05:05:03'),(164,834,'2006-02-15 05:05:03'),(164,851,'2006-02-15 05:05:03'),(164,884,'2006-02-15 05:05:03'),(164,908,'2006-02-15 05:05:03'),(164,957,'2006-02-15 05:05:03'),(164,984,'2006-02-15 05:05:03'),(165,72,'2006-02-15 05:05:03'),(165,95,'2006-02-15 05:05:03'),(165,146,'2006-02-15 05:05:03'),(165,204,'2006-02-15 05:05:03'),(165,253,'2006-02-15 05:05:03'),(165,286,'2006-02-15 05:05:03'),(165,360,'2006-02-15 05:05:03'),(165,375,'2006-02-15 05:05:03'),(165,395,'2006-02-15 05:05:03'),(165,421,'2006-02-15 05:05:03'),(165,437,'2006-02-15 05:05:03'),(165,473,'2006-02-15 05:05:03'),(165,607,'2006-02-15 05:05:03'),(165,644,'2006-02-15 05:05:03'),(165,659,'2006-02-15 05:05:03'),(165,693,'2006-02-15 05:05:03'),(165,737,'2006-02-15 05:05:03'),(165,779,'2006-02-15 05:05:03'),(165,798,'2006-02-15 05:05:03'),(165,807,'2006-02-15 05:05:03'),(165,809,'2006-02-15 05:05:03'),(165,832,'2006-02-15 05:05:03'),(165,833,'2006-02-15 05:05:03'),(165,947,'2006-02-15 05:05:03'),(165,948,'2006-02-15 05:05:03'),(165,962,'2006-02-15 05:05:03'),(166,25,'2006-02-15 05:05:03'),(166,38,'2006-02-15 05:05:03'),(166,55,'2006-02-15 05:05:03'),(166,61,'2006-02-15 05:05:03'),(166,68,'2006-02-15 05:05:03'),(166,86,'2006-02-15 05:05:03'),(166,146,'2006-02-15 05:05:03'),(166,255,'2006-02-15 05:05:03'),(166,297,'2006-02-15 05:05:03'),(166,306,'2006-02-15 05:05:03'),(166,326,'2006-02-15 05:05:03'),(166,361,'2006-02-15 05:05:03'),(166,366,'2006-02-15 05:05:03'),(166,426,'2006-02-15 05:05:03'),(166,580,'2006-02-15 05:05:03'),(166,622,'2006-02-15 05:05:03'),(166,674,'2006-02-15 05:05:03'),(166,714,'2006-02-15 05:05:03'),(166,788,'2006-02-15 05:05:03'),(166,867,'2006-02-15 05:05:03'),(166,944,'2006-02-15 05:05:03'),(166,1000,'2006-02-15 05:05:03'),(167,17,'2006-02-15 05:05:03'),(167,25,'2006-02-15 05:05:03'),(167,63,'2006-02-15 05:05:03'),(167,72,'2006-02-15 05:05:03'),(167,107,'2006-02-15 05:05:03'),(167,120,'2006-02-15 05:05:03'),(167,191,'2006-02-15 05:05:03'),(167,294,'2006-02-15 05:05:03'),(167,319,'2006-02-15 05:05:03'),(167,339,'2006-02-15 05:05:03'),(167,341,'2006-02-15 05:05:03'),(167,496,'2006-02-15 05:05:03'),(167,554,'2006-02-15 05:05:03'),(167,626,'2006-02-15 05:05:03'),(167,628,'2006-02-15 05:05:03'),(167,672,'2006-02-15 05:05:03'),(167,692,'2006-02-15 05:05:03'),(167,717,'2006-02-15 05:05:03'),(167,734,'2006-02-15 05:05:03'),(167,794,'2006-02-15 05:05:03'),(167,800,'2006-02-15 05:05:03'),(167,802,'2006-02-15 05:05:03'),(167,856,'2006-02-15 05:05:03'),(167,864,'2006-02-15 05:05:03'),(167,882,'2006-02-15 05:05:03'),(167,923,'2006-02-15 05:05:03'),(168,32,'2006-02-15 05:05:03'),(168,56,'2006-02-15 05:05:03'),(168,92,'2006-02-15 05:05:03'),(168,115,'2006-02-15 05:05:03'),(168,188,'2006-02-15 05:05:03'),(168,196,'2006-02-15 05:05:03'),(168,208,'2006-02-15 05:05:03'),(168,237,'2006-02-15 05:05:03'),(168,241,'2006-02-15 05:05:03'),(168,255,'2006-02-15 05:05:03'),(168,305,'2006-02-15 05:05:03'),(168,336,'2006-02-15 05:05:03'),(168,387,'2006-02-15 05:05:03'),(168,433,'2006-02-15 05:05:03'),(168,438,'2006-02-15 05:05:03'),(168,519,'2006-02-15 05:05:03'),(168,602,'2006-02-15 05:05:03'),(168,619,'2006-02-15 05:05:03'),(168,626,'2006-02-15 05:05:03'),(168,652,'2006-02-15 05:05:03'),(168,678,'2006-02-15 05:05:03'),(168,685,'2006-02-15 05:05:03'),(168,804,'2006-02-15 05:05:03'),(168,807,'2006-02-15 05:05:03'),(168,826,'2006-02-15 05:05:03'),(168,841,'2006-02-15 05:05:03'),(168,886,'2006-02-15 05:05:03'),(168,889,'2006-02-15 05:05:03'),(168,892,'2006-02-15 05:05:03'),(168,927,'2006-02-15 05:05:03'),(168,959,'2006-02-15 05:05:03'),(169,6,'2006-02-15 05:05:03'),(169,78,'2006-02-15 05:05:03'),(169,93,'2006-02-15 05:05:03'),(169,246,'2006-02-15 05:05:03'),(169,248,'2006-02-15 05:05:03'),(169,289,'2006-02-15 05:05:03'),(169,301,'2006-02-15 05:05:03'),(169,326,'2006-02-15 05:05:03'),(169,349,'2006-02-15 05:05:03'),(169,372,'2006-02-15 05:05:03'),(169,398,'2006-02-15 05:05:03'),(169,434,'2006-02-15 05:05:03'),(169,505,'2006-02-15 05:05:03'),(169,564,'2006-02-15 05:05:03'),(169,571,'2006-02-15 05:05:03'),(169,634,'2006-02-15 05:05:03'),(169,642,'2006-02-15 05:05:03'),(169,673,'2006-02-15 05:05:03'),(169,694,'2006-02-15 05:05:03'),(169,727,'2006-02-15 05:05:03'),(169,778,'2006-02-15 05:05:03'),(169,815,'2006-02-15 05:05:03'),(169,847,'2006-02-15 05:05:03'),(169,849,'2006-02-15 05:05:03'),(169,894,'2006-02-15 05:05:03'),(169,897,'2006-02-15 05:05:03'),(169,954,'2006-02-15 05:05:03'),(169,992,'2006-02-15 05:05:03'),(169,998,'2006-02-15 05:05:03'),(170,7,'2006-02-15 05:05:03'),(170,15,'2006-02-15 05:05:03'),(170,27,'2006-02-15 05:05:03'),(170,33,'2006-02-15 05:05:03'),(170,102,'2006-02-15 05:05:03'),(170,139,'2006-02-15 05:05:03'),(170,180,'2006-02-15 05:05:03'),(170,184,'2006-02-15 05:05:03'),(170,212,'2006-02-15 05:05:03'),(170,299,'2006-02-15 05:05:03'),(170,322,'2006-02-15 05:05:03'),(170,358,'2006-02-15 05:05:03'),(170,416,'2006-02-15 05:05:03'),(170,508,'2006-02-15 05:05:03'),(170,537,'2006-02-15 05:05:03'),(170,705,'2006-02-15 05:05:03'),(170,758,'2006-02-15 05:05:03'),(170,764,'2006-02-15 05:05:03'),(170,868,'2006-02-15 05:05:03'),(170,877,'2006-02-15 05:05:03'),(170,886,'2006-02-15 05:05:03'),(170,925,'2006-02-15 05:05:03'),(170,993,'2006-02-15 05:05:03'),(170,996,'2006-02-15 05:05:03'),(171,49,'2006-02-15 05:05:03'),(171,146,'2006-02-15 05:05:03'),(171,166,'2006-02-15 05:05:03'),(171,181,'2006-02-15 05:05:03'),(171,219,'2006-02-15 05:05:03'),(171,273,'2006-02-15 05:05:03'),(171,296,'2006-02-15 05:05:03'),(171,318,'2006-02-15 05:05:03'),(171,342,'2006-02-15 05:05:03'),(171,397,'2006-02-15 05:05:03'),(171,447,'2006-02-15 05:05:03'),(171,450,'2006-02-15 05:05:03'),(171,466,'2006-02-15 05:05:03'),(171,549,'2006-02-15 05:05:03'),(171,560,'2006-02-15 05:05:03'),(171,566,'2006-02-15 05:05:03'),(171,608,'2006-02-15 05:05:03'),(171,625,'2006-02-15 05:05:03'),(171,645,'2006-02-15 05:05:03'),(171,701,'2006-02-15 05:05:03'),(171,761,'2006-02-15 05:05:03'),(171,779,'2006-02-15 05:05:03'),(171,849,'2006-02-15 05:05:03'),(171,872,'2006-02-15 05:05:03'),(171,892,'2006-02-15 05:05:03'),(171,898,'2006-02-15 05:05:03'),(171,903,'2006-02-15 05:05:03'),(171,953,'2006-02-15 05:05:03'),(172,57,'2006-02-15 05:05:03'),(172,100,'2006-02-15 05:05:03'),(172,148,'2006-02-15 05:05:03'),(172,215,'2006-02-15 05:05:03'),(172,302,'2006-02-15 05:05:03'),(172,345,'2006-02-15 05:05:03'),(172,368,'2006-02-15 05:05:03'),(172,385,'2006-02-15 05:05:03'),(172,423,'2006-02-15 05:05:03'),(172,487,'2006-02-15 05:05:03'),(172,493,'2006-02-15 05:05:03'),(172,529,'2006-02-15 05:05:03'),(172,538,'2006-02-15 05:05:03'),(172,567,'2006-02-15 05:05:03'),(172,609,'2006-02-15 05:05:03'),(172,639,'2006-02-15 05:05:03'),(172,649,'2006-02-15 05:05:03'),(172,661,'2006-02-15 05:05:03'),(172,667,'2006-02-15 05:05:03'),(172,710,'2006-02-15 05:05:03'),(172,744,'2006-02-15 05:05:03'),(172,758,'2006-02-15 05:05:03'),(172,771,'2006-02-15 05:05:03'),(172,833,'2006-02-15 05:05:03'),(172,959,'2006-02-15 05:05:03'),(173,49,'2006-02-15 05:05:03'),(173,55,'2006-02-15 05:05:03'),(173,74,'2006-02-15 05:05:03'),(173,80,'2006-02-15 05:05:03'),(173,106,'2006-02-15 05:05:03'),(173,154,'2006-02-15 05:05:03'),(173,162,'2006-02-15 05:05:03'),(173,188,'2006-02-15 05:05:03'),(173,235,'2006-02-15 05:05:03'),(173,313,'2006-02-15 05:05:03'),(173,379,'2006-02-15 05:05:03'),(173,405,'2006-02-15 05:05:03'),(173,491,'2006-02-15 05:05:03'),(173,496,'2006-02-15 05:05:03'),(173,529,'2006-02-15 05:05:03'),(173,550,'2006-02-15 05:05:03'),(173,564,'2006-02-15 05:05:03'),(173,571,'2006-02-15 05:05:03'),(173,592,'2006-02-15 05:05:03'),(173,688,'2006-02-15 05:05:03'),(173,753,'2006-02-15 05:05:03'),(173,757,'2006-02-15 05:05:03'),(173,852,'2006-02-15 05:05:03'),(173,857,'2006-02-15 05:05:03'),(173,921,'2006-02-15 05:05:03'),(173,928,'2006-02-15 05:05:03'),(173,933,'2006-02-15 05:05:03'),(174,11,'2006-02-15 05:05:03'),(174,61,'2006-02-15 05:05:03'),(174,168,'2006-02-15 05:05:03'),(174,298,'2006-02-15 05:05:03'),(174,352,'2006-02-15 05:05:03'),(174,442,'2006-02-15 05:05:03'),(174,451,'2006-02-15 05:05:03'),(174,496,'2006-02-15 05:05:03'),(174,610,'2006-02-15 05:05:03'),(174,618,'2006-02-15 05:05:03'),(174,622,'2006-02-15 05:05:03'),(174,659,'2006-02-15 05:05:03'),(174,677,'2006-02-15 05:05:03'),(174,705,'2006-02-15 05:05:03'),(174,722,'2006-02-15 05:05:03'),(174,780,'2006-02-15 05:05:03'),(174,797,'2006-02-15 05:05:03'),(174,809,'2006-02-15 05:05:03'),(174,827,'2006-02-15 05:05:03'),(174,830,'2006-02-15 05:05:03'),(174,852,'2006-02-15 05:05:03'),(174,853,'2006-02-15 05:05:03'),(174,879,'2006-02-15 05:05:03'),(174,982,'2006-02-15 05:05:03'),(175,9,'2006-02-15 05:05:03'),(175,29,'2006-02-15 05:05:03'),(175,67,'2006-02-15 05:05:03'),(175,129,'2006-02-15 05:05:03'),(175,155,'2006-02-15 05:05:03'),(175,190,'2006-02-15 05:05:03'),(175,191,'2006-02-15 05:05:03'),(175,362,'2006-02-15 05:05:03'),(175,405,'2006-02-15 05:05:03'),(175,424,'2006-02-15 05:05:03'),(175,439,'2006-02-15 05:05:03'),(175,442,'2006-02-15 05:05:03'),(175,483,'2006-02-15 05:05:03'),(175,591,'2006-02-15 05:05:03'),(175,596,'2006-02-15 05:05:03'),(175,616,'2006-02-15 05:05:03'),(175,719,'2006-02-15 05:05:03'),(175,729,'2006-02-15 05:05:03'),(175,772,'2006-02-15 05:05:03'),(175,778,'2006-02-15 05:05:03'),(175,828,'2006-02-15 05:05:03'),(175,842,'2006-02-15 05:05:03'),(175,890,'2006-02-15 05:05:03'),(175,908,'2006-02-15 05:05:03'),(175,977,'2006-02-15 05:05:03'),(175,978,'2006-02-15 05:05:03'),(175,998,'2006-02-15 05:05:03'),(176,13,'2006-02-15 05:05:03'),(176,73,'2006-02-15 05:05:03'),(176,89,'2006-02-15 05:05:03'),(176,150,'2006-02-15 05:05:03'),(176,162,'2006-02-15 05:05:03'),(176,238,'2006-02-15 05:05:03'),(176,252,'2006-02-15 05:05:03'),(176,303,'2006-02-15 05:05:03'),(176,320,'2006-02-15 05:05:03'),(176,401,'2006-02-15 05:05:03'),(176,417,'2006-02-15 05:05:03'),(176,441,'2006-02-15 05:05:03'),(176,458,'2006-02-15 05:05:03'),(176,461,'2006-02-15 05:05:03'),(176,517,'2006-02-15 05:05:03'),(176,521,'2006-02-15 05:05:03'),(176,543,'2006-02-15 05:05:03'),(176,573,'2006-02-15 05:05:03'),(176,699,'2006-02-15 05:05:03'),(176,726,'2006-02-15 05:05:03'),(176,740,'2006-02-15 05:05:03'),(176,746,'2006-02-15 05:05:03'),(176,758,'2006-02-15 05:05:03'),(176,802,'2006-02-15 05:05:03'),(176,827,'2006-02-15 05:05:03'),(176,839,'2006-02-15 05:05:03'),(176,859,'2006-02-15 05:05:03'),(176,872,'2006-02-15 05:05:03'),(176,946,'2006-02-15 05:05:03'),(177,12,'2006-02-15 05:05:03'),(177,39,'2006-02-15 05:05:03'),(177,52,'2006-02-15 05:05:03'),(177,55,'2006-02-15 05:05:03'),(177,86,'2006-02-15 05:05:03'),(177,175,'2006-02-15 05:05:03'),(177,188,'2006-02-15 05:05:03'),(177,235,'2006-02-15 05:05:03'),(177,237,'2006-02-15 05:05:03'),(177,289,'2006-02-15 05:05:03'),(177,363,'2006-02-15 05:05:03'),(177,401,'2006-02-15 05:05:03'),(177,433,'2006-02-15 05:05:03'),(177,458,'2006-02-15 05:05:03'),(177,522,'2006-02-15 05:05:03'),(177,543,'2006-02-15 05:05:03'),(177,563,'2006-02-15 05:05:03'),(177,649,'2006-02-15 05:05:03'),(177,683,'2006-02-15 05:05:03'),(177,684,'2006-02-15 05:05:03'),(177,726,'2006-02-15 05:05:03'),(177,751,'2006-02-15 05:05:03'),(177,763,'2006-02-15 05:05:03'),(177,764,'2006-02-15 05:05:03'),(177,827,'2006-02-15 05:05:03'),(177,910,'2006-02-15 05:05:03'),(177,956,'2006-02-15 05:05:03'),(178,30,'2006-02-15 05:05:03'),(178,34,'2006-02-15 05:05:03'),(178,109,'2006-02-15 05:05:03'),(178,146,'2006-02-15 05:05:03'),(178,160,'2006-02-15 05:05:03'),(178,164,'2006-02-15 05:05:03'),(178,194,'2006-02-15 05:05:03'),(178,197,'2006-02-15 05:05:03'),(178,273,'2006-02-15 05:05:03'),(178,311,'2006-02-15 05:05:03'),(178,397,'2006-02-15 05:05:03'),(178,483,'2006-02-15 05:05:03'),(178,517,'2006-02-15 05:05:03'),(178,537,'2006-02-15 05:05:03'),(178,587,'2006-02-15 05:05:03'),(178,708,'2006-02-15 05:05:03'),(178,733,'2006-02-15 05:05:03'),(178,744,'2006-02-15 05:05:03'),(178,762,'2006-02-15 05:05:03'),(178,930,'2006-02-15 05:05:03'),(178,974,'2006-02-15 05:05:03'),(178,983,'2006-02-15 05:05:03'),(178,1000,'2006-02-15 05:05:03'),(179,24,'2006-02-15 05:05:03'),(179,27,'2006-02-15 05:05:03'),(179,65,'2006-02-15 05:05:03'),(179,85,'2006-02-15 05:05:03'),(179,109,'2006-02-15 05:05:03'),(179,131,'2006-02-15 05:05:03'),(179,159,'2006-02-15 05:05:03'),(179,193,'2006-02-15 05:05:03'),(179,250,'2006-02-15 05:05:03'),(179,291,'2006-02-15 05:05:03'),(179,353,'2006-02-15 05:05:03'),(179,415,'2006-02-15 05:05:03'),(179,463,'2006-02-15 05:05:03'),(179,468,'2006-02-15 05:05:03'),(179,489,'2006-02-15 05:05:03'),(179,566,'2006-02-15 05:05:03'),(179,588,'2006-02-15 05:05:03'),(179,650,'2006-02-15 05:05:03'),(179,698,'2006-02-15 05:05:03'),(179,732,'2006-02-15 05:05:03'),(179,737,'2006-02-15 05:05:03'),(179,769,'2006-02-15 05:05:03'),(179,811,'2006-02-15 05:05:03'),(179,817,'2006-02-15 05:05:03'),(179,852,'2006-02-15 05:05:03'),(179,924,'2006-02-15 05:05:03'),(179,931,'2006-02-15 05:05:03'),(179,960,'2006-02-15 05:05:03'),(179,976,'2006-02-15 05:05:03'),(180,12,'2006-02-15 05:05:03'),(180,33,'2006-02-15 05:05:03'),(180,144,'2006-02-15 05:05:03'),(180,195,'2006-02-15 05:05:03'),(180,258,'2006-02-15 05:05:03'),(180,441,'2006-02-15 05:05:03'),(180,506,'2006-02-15 05:05:03'),(180,561,'2006-02-15 05:05:03'),(180,609,'2006-02-15 05:05:03'),(180,622,'2006-02-15 05:05:03'),(180,628,'2006-02-15 05:05:03'),(180,657,'2006-02-15 05:05:03'),(180,724,'2006-02-15 05:05:03'),(180,729,'2006-02-15 05:05:03'),(180,732,'2006-02-15 05:05:03'),(180,777,'2006-02-15 05:05:03'),(180,809,'2006-02-15 05:05:03'),(180,811,'2006-02-15 05:05:03'),(180,820,'2006-02-15 05:05:03'),(180,824,'2006-02-15 05:05:03'),(180,847,'2006-02-15 05:05:03'),(180,869,'2006-02-15 05:05:03'),(180,874,'2006-02-15 05:05:03'),(180,955,'2006-02-15 05:05:03'),(180,963,'2006-02-15 05:05:03'),(181,5,'2006-02-15 05:05:03'),(181,40,'2006-02-15 05:05:03'),(181,74,'2006-02-15 05:05:03'),(181,78,'2006-02-15 05:05:03'),(181,83,'2006-02-15 05:05:03'),(181,152,'2006-02-15 05:05:03'),(181,195,'2006-02-15 05:05:03'),(181,233,'2006-02-15 05:05:03'),(181,286,'2006-02-15 05:05:03'),(181,301,'2006-02-15 05:05:03'),(181,311,'2006-02-15 05:05:03'),(181,381,'2006-02-15 05:05:03'),(181,387,'2006-02-15 05:05:03'),(181,403,'2006-02-15 05:05:03'),(181,409,'2006-02-15 05:05:03'),(181,420,'2006-02-15 05:05:03'),(181,437,'2006-02-15 05:05:03'),(181,456,'2006-02-15 05:05:03'),(181,507,'2006-02-15 05:05:03'),(181,522,'2006-02-15 05:05:03'),(181,539,'2006-02-15 05:05:03'),(181,542,'2006-02-15 05:05:03'),(181,546,'2006-02-15 05:05:03'),(181,579,'2006-02-15 05:05:03'),(181,596,'2006-02-15 05:05:03'),(181,604,'2006-02-15 05:05:03'),(181,609,'2006-02-15 05:05:03'),(181,625,'2006-02-15 05:05:03'),(181,744,'2006-02-15 05:05:03'),(181,816,'2006-02-15 05:05:03'),(181,836,'2006-02-15 05:05:03'),(181,868,'2006-02-15 05:05:03'),(181,870,'2006-02-15 05:05:03'),(181,874,'2006-02-15 05:05:03'),(181,892,'2006-02-15 05:05:03'),(181,907,'2006-02-15 05:05:03'),(181,911,'2006-02-15 05:05:03'),(181,921,'2006-02-15 05:05:03'),(181,991,'2006-02-15 05:05:03'),(182,33,'2006-02-15 05:05:03'),(182,160,'2006-02-15 05:05:03'),(182,301,'2006-02-15 05:05:03'),(182,324,'2006-02-15 05:05:03'),(182,346,'2006-02-15 05:05:03'),(182,362,'2006-02-15 05:05:03'),(182,391,'2006-02-15 05:05:03'),(182,413,'2006-02-15 05:05:03'),(182,421,'2006-02-15 05:05:03'),(182,437,'2006-02-15 05:05:03'),(182,590,'2006-02-15 05:05:03'),(182,639,'2006-02-15 05:05:03'),(182,668,'2006-02-15 05:05:03'),(182,677,'2006-02-15 05:05:03'),(182,679,'2006-02-15 05:05:03'),(182,695,'2006-02-15 05:05:03'),(182,714,'2006-02-15 05:05:03'),(182,720,'2006-02-15 05:05:03'),(182,819,'2006-02-15 05:05:03'),(182,828,'2006-02-15 05:05:03'),(182,845,'2006-02-15 05:05:03'),(182,864,'2006-02-15 05:05:03'),(182,940,'2006-02-15 05:05:03'),(182,990,'2006-02-15 05:05:03'),(183,32,'2006-02-15 05:05:03'),(183,40,'2006-02-15 05:05:03'),(183,71,'2006-02-15 05:05:03'),(183,113,'2006-02-15 05:05:03'),(183,313,'2006-02-15 05:05:03'),(183,388,'2006-02-15 05:05:03'),(183,389,'2006-02-15 05:05:03'),(183,390,'2006-02-15 05:05:03'),(183,495,'2006-02-15 05:05:03'),(183,520,'2006-02-15 05:05:03'),(183,576,'2006-02-15 05:05:03'),(183,636,'2006-02-15 05:05:03'),(183,715,'2006-02-15 05:05:03'),(183,850,'2006-02-15 05:05:03'),(183,862,'2006-02-15 05:05:03'),(183,914,'2006-02-15 05:05:03'),(183,941,'2006-02-15 05:05:03'),(183,949,'2006-02-15 05:05:03'),(183,983,'2006-02-15 05:05:03'),(184,35,'2006-02-15 05:05:03'),(184,87,'2006-02-15 05:05:03'),(184,146,'2006-02-15 05:05:03'),(184,169,'2006-02-15 05:05:03'),(184,221,'2006-02-15 05:05:03'),(184,336,'2006-02-15 05:05:03'),(184,371,'2006-02-15 05:05:03'),(184,452,'2006-02-15 05:05:03'),(184,486,'2006-02-15 05:05:03'),(184,492,'2006-02-15 05:05:03'),(184,500,'2006-02-15 05:05:03'),(184,574,'2006-02-15 05:05:03'),(184,580,'2006-02-15 05:05:03'),(184,597,'2006-02-15 05:05:03'),(184,615,'2006-02-15 05:05:03'),(184,640,'2006-02-15 05:05:03'),(184,642,'2006-02-15 05:05:03'),(184,650,'2006-02-15 05:05:03'),(184,661,'2006-02-15 05:05:03'),(184,684,'2006-02-15 05:05:03'),(184,745,'2006-02-15 05:05:03'),(184,772,'2006-02-15 05:05:03'),(184,787,'2006-02-15 05:05:03'),(184,867,'2006-02-15 05:05:03'),(184,959,'2006-02-15 05:05:03'),(184,966,'2006-02-15 05:05:03'),(184,967,'2006-02-15 05:05:03'),(184,969,'2006-02-15 05:05:03'),(184,985,'2006-02-15 05:05:03'),(185,7,'2006-02-15 05:05:03'),(185,95,'2006-02-15 05:05:03'),(185,138,'2006-02-15 05:05:03'),(185,265,'2006-02-15 05:05:03'),(185,286,'2006-02-15 05:05:03'),(185,360,'2006-02-15 05:05:03'),(185,411,'2006-02-15 05:05:03'),(185,427,'2006-02-15 05:05:03'),(185,437,'2006-02-15 05:05:03'),(185,448,'2006-02-15 05:05:03'),(185,494,'2006-02-15 05:05:03'),(185,510,'2006-02-15 05:05:03'),(185,518,'2006-02-15 05:05:03'),(185,554,'2006-02-15 05:05:03'),(185,560,'2006-02-15 05:05:03'),(185,571,'2006-02-15 05:05:03'),(185,584,'2006-02-15 05:05:03'),(185,631,'2006-02-15 05:05:03'),(185,665,'2006-02-15 05:05:03'),(185,694,'2006-02-15 05:05:03'),(185,730,'2006-02-15 05:05:03'),(185,761,'2006-02-15 05:05:03'),(185,818,'2006-02-15 05:05:03'),(185,845,'2006-02-15 05:05:03'),(185,880,'2006-02-15 05:05:03'),(185,882,'2006-02-15 05:05:03'),(185,919,'2006-02-15 05:05:03'),(185,920,'2006-02-15 05:05:03'),(185,965,'2006-02-15 05:05:03'),(185,973,'2006-02-15 05:05:03'),(186,95,'2006-02-15 05:05:03'),(186,187,'2006-02-15 05:05:03'),(186,208,'2006-02-15 05:05:03'),(186,228,'2006-02-15 05:05:03'),(186,237,'2006-02-15 05:05:03'),(186,422,'2006-02-15 05:05:03'),(186,482,'2006-02-15 05:05:03'),(186,508,'2006-02-15 05:05:03'),(186,552,'2006-02-15 05:05:03'),(186,579,'2006-02-15 05:05:03'),(186,637,'2006-02-15 05:05:03'),(186,648,'2006-02-15 05:05:03'),(186,654,'2006-02-15 05:05:03'),(186,729,'2006-02-15 05:05:03'),(186,983,'2006-02-15 05:05:03'),(186,994,'2006-02-15 05:05:03'),(187,17,'2006-02-15 05:05:03'),(187,25,'2006-02-15 05:05:03'),(187,29,'2006-02-15 05:05:03'),(187,51,'2006-02-15 05:05:03'),(187,73,'2006-02-15 05:05:03'),(187,76,'2006-02-15 05:05:03'),(187,98,'2006-02-15 05:05:03'),(187,110,'2006-02-15 05:05:03'),(187,127,'2006-02-15 05:05:03'),(187,168,'2006-02-15 05:05:03'),(187,222,'2006-02-15 05:05:03'),(187,224,'2006-02-15 05:05:03'),(187,297,'2006-02-15 05:05:03'),(187,354,'2006-02-15 05:05:03'),(187,379,'2006-02-15 05:05:03'),(187,417,'2006-02-15 05:05:03'),(187,435,'2006-02-15 05:05:03'),(187,441,'2006-02-15 05:05:03'),(187,474,'2006-02-15 05:05:03'),(187,499,'2006-02-15 05:05:03'),(187,538,'2006-02-15 05:05:03'),(187,548,'2006-02-15 05:05:03'),(187,561,'2006-02-15 05:05:03'),(187,617,'2006-02-15 05:05:03'),(187,625,'2006-02-15 05:05:03'),(187,664,'2006-02-15 05:05:03'),(187,671,'2006-02-15 05:05:03'),(187,768,'2006-02-15 05:05:03'),(187,779,'2006-02-15 05:05:03'),(187,906,'2006-02-15 05:05:03'),(187,914,'2006-02-15 05:05:03'),(187,923,'2006-02-15 05:05:03'),(187,976,'2006-02-15 05:05:03'),(188,1,'2006-02-15 05:05:03'),(188,10,'2006-02-15 05:05:03'),(188,14,'2006-02-15 05:05:03'),(188,51,'2006-02-15 05:05:03'),(188,102,'2006-02-15 05:05:03'),(188,111,'2006-02-15 05:05:03'),(188,146,'2006-02-15 05:05:03'),(188,206,'2006-02-15 05:05:03'),(188,223,'2006-02-15 05:05:03'),(188,289,'2006-02-15 05:05:03'),(188,311,'2006-02-15 05:05:03'),(188,322,'2006-02-15 05:05:03'),(188,338,'2006-02-15 05:05:03'),(188,396,'2006-02-15 05:05:03'),(188,412,'2006-02-15 05:05:03'),(188,506,'2006-02-15 05:05:03'),(188,517,'2006-02-15 05:05:03'),(188,529,'2006-02-15 05:05:03'),(188,566,'2006-02-15 05:05:03'),(188,593,'2006-02-15 05:05:03'),(188,606,'2006-02-15 05:05:03'),(188,662,'2006-02-15 05:05:03'),(188,770,'2006-02-15 05:05:03'),(188,773,'2006-02-15 05:05:03'),(188,774,'2006-02-15 05:05:03'),(188,815,'2006-02-15 05:05:03'),(188,849,'2006-02-15 05:05:03'),(188,925,'2006-02-15 05:05:03'),(188,988,'2006-02-15 05:05:03'),(188,989,'2006-02-15 05:05:03'),(189,43,'2006-02-15 05:05:03'),(189,82,'2006-02-15 05:05:03'),(189,171,'2006-02-15 05:05:03'),(189,266,'2006-02-15 05:05:03'),(189,272,'2006-02-15 05:05:03'),(189,315,'2006-02-15 05:05:03'),(189,378,'2006-02-15 05:05:03'),(189,492,'2006-02-15 05:05:03'),(189,509,'2006-02-15 05:05:03'),(189,512,'2006-02-15 05:05:03'),(189,519,'2006-02-15 05:05:03'),(189,533,'2006-02-15 05:05:03'),(189,548,'2006-02-15 05:05:03'),(189,560,'2006-02-15 05:05:03'),(189,628,'2006-02-15 05:05:03'),(189,734,'2006-02-15 05:05:03'),(189,748,'2006-02-15 05:05:03'),(189,788,'2006-02-15 05:05:03'),(189,820,'2006-02-15 05:05:03'),(189,853,'2006-02-15 05:05:03'),(189,882,'2006-02-15 05:05:03'),(189,896,'2006-02-15 05:05:03'),(189,899,'2006-02-15 05:05:03'),(189,940,'2006-02-15 05:05:03'),(190,38,'2006-02-15 05:05:03'),(190,54,'2006-02-15 05:05:03'),(190,62,'2006-02-15 05:05:03'),(190,87,'2006-02-15 05:05:03'),(190,173,'2006-02-15 05:05:03'),(190,234,'2006-02-15 05:05:03'),(190,253,'2006-02-15 05:05:03'),(190,278,'2006-02-15 05:05:03'),(190,310,'2006-02-15 05:05:03'),(190,374,'2006-02-15 05:05:03'),(190,411,'2006-02-15 05:05:03'),(190,426,'2006-02-15 05:05:03'),(190,472,'2006-02-15 05:05:03'),(190,549,'2006-02-15 05:05:03'),(190,562,'2006-02-15 05:05:03'),(190,606,'2006-02-15 05:05:03'),(190,623,'2006-02-15 05:05:03'),(190,679,'2006-02-15 05:05:03'),(190,682,'2006-02-15 05:05:03'),(190,693,'2006-02-15 05:05:03'),(190,695,'2006-02-15 05:05:03'),(190,705,'2006-02-15 05:05:03'),(190,708,'2006-02-15 05:05:03'),(190,802,'2006-02-15 05:05:03'),(190,806,'2006-02-15 05:05:03'),(190,874,'2006-02-15 05:05:03'),(190,959,'2006-02-15 05:05:03'),(191,16,'2006-02-15 05:05:03'),(191,39,'2006-02-15 05:05:03'),(191,84,'2006-02-15 05:05:03'),(191,185,'2006-02-15 05:05:03'),(191,219,'2006-02-15 05:05:03'),(191,293,'2006-02-15 05:05:03'),(191,296,'2006-02-15 05:05:03'),(191,378,'2006-02-15 05:05:03'),(191,410,'2006-02-15 05:05:03'),(191,420,'2006-02-15 05:05:03'),(191,461,'2006-02-15 05:05:03'),(191,544,'2006-02-15 05:05:03'),(191,551,'2006-02-15 05:05:03'),(191,596,'2006-02-15 05:05:03'),(191,638,'2006-02-15 05:05:03'),(191,668,'2006-02-15 05:05:03'),(191,692,'2006-02-15 05:05:03'),(191,775,'2006-02-15 05:05:03'),(191,801,'2006-02-15 05:05:03'),(191,819,'2006-02-15 05:05:03'),(191,827,'2006-02-15 05:05:03'),(191,830,'2006-02-15 05:05:03'),(191,834,'2006-02-15 05:05:03'),(191,849,'2006-02-15 05:05:03'),(191,858,'2006-02-15 05:05:03'),(191,914,'2006-02-15 05:05:03'),(191,958,'2006-02-15 05:05:03'),(191,969,'2006-02-15 05:05:03'),(191,971,'2006-02-15 05:05:03'),(191,993,'2006-02-15 05:05:03'),(192,16,'2006-02-15 05:05:03'),(192,69,'2006-02-15 05:05:03'),(192,117,'2006-02-15 05:05:03'),(192,155,'2006-02-15 05:05:03'),(192,166,'2006-02-15 05:05:03'),(192,179,'2006-02-15 05:05:03'),(192,214,'2006-02-15 05:05:03'),(192,361,'2006-02-15 05:05:03'),(192,367,'2006-02-15 05:05:03'),(192,426,'2006-02-15 05:05:03'),(192,465,'2006-02-15 05:05:03'),(192,470,'2006-02-15 05:05:03'),(192,475,'2006-02-15 05:05:03'),(192,485,'2006-02-15 05:05:03'),(192,541,'2006-02-15 05:05:03'),(192,578,'2006-02-15 05:05:03'),(192,592,'2006-02-15 05:05:03'),(192,614,'2006-02-15 05:05:03'),(192,618,'2006-02-15 05:05:03'),(192,622,'2006-02-15 05:05:03'),(192,674,'2006-02-15 05:05:03'),(192,677,'2006-02-15 05:05:03'),(192,680,'2006-02-15 05:05:03'),(192,682,'2006-02-15 05:05:03'),(192,708,'2006-02-15 05:05:03'),(192,711,'2006-02-15 05:05:03'),(192,747,'2006-02-15 05:05:03'),(192,763,'2006-02-15 05:05:03'),(192,819,'2006-02-15 05:05:03'),(193,44,'2006-02-15 05:05:03'),(193,80,'2006-02-15 05:05:03'),(193,103,'2006-02-15 05:05:03'),(193,109,'2006-02-15 05:05:03'),(193,119,'2006-02-15 05:05:03'),(193,141,'2006-02-15 05:05:03'),(193,164,'2006-02-15 05:05:03'),(193,291,'2006-02-15 05:05:03'),(193,352,'2006-02-15 05:05:03'),(193,358,'2006-02-15 05:05:03'),(193,376,'2006-02-15 05:05:03'),(193,412,'2006-02-15 05:05:03'),(193,462,'2006-02-15 05:05:03'),(193,689,'2006-02-15 05:05:03'),(193,709,'2006-02-15 05:05:03'),(193,745,'2006-02-15 05:05:03'),(193,807,'2006-02-15 05:05:03'),(193,828,'2006-02-15 05:05:03'),(193,834,'2006-02-15 05:05:03'),(193,851,'2006-02-15 05:05:03'),(193,937,'2006-02-15 05:05:03'),(193,953,'2006-02-15 05:05:03'),(193,960,'2006-02-15 05:05:03'),(194,9,'2006-02-15 05:05:03'),(194,42,'2006-02-15 05:05:03'),(194,67,'2006-02-15 05:05:03'),(194,86,'2006-02-15 05:05:03'),(194,88,'2006-02-15 05:05:03'),(194,98,'2006-02-15 05:05:03'),(194,135,'2006-02-15 05:05:03'),(194,161,'2006-02-15 05:05:03'),(194,163,'2006-02-15 05:05:03'),(194,215,'2006-02-15 05:05:03'),(194,232,'2006-02-15 05:05:03'),(194,352,'2006-02-15 05:05:03'),(194,415,'2006-02-15 05:05:03'),(194,486,'2006-02-15 05:05:03'),(194,498,'2006-02-15 05:05:03'),(194,531,'2006-02-15 05:05:03'),(194,719,'2006-02-15 05:05:03'),(194,738,'2006-02-15 05:05:03'),(194,786,'2006-02-15 05:05:03'),(194,872,'2006-02-15 05:05:03'),(194,938,'2006-02-15 05:05:03'),(194,940,'2006-02-15 05:05:03'),(195,129,'2006-02-15 05:05:03'),(195,130,'2006-02-15 05:05:03'),(195,141,'2006-02-15 05:05:03'),(195,144,'2006-02-15 05:05:03'),(195,298,'2006-02-15 05:05:03'),(195,359,'2006-02-15 05:05:03'),(195,361,'2006-02-15 05:05:03'),(195,392,'2006-02-15 05:05:03'),(195,403,'2006-02-15 05:05:03'),(195,494,'2006-02-15 05:05:03'),(195,520,'2006-02-15 05:05:03'),(195,534,'2006-02-15 05:05:03'),(195,560,'2006-02-15 05:05:03'),(195,592,'2006-02-15 05:05:03'),(195,649,'2006-02-15 05:05:03'),(195,658,'2006-02-15 05:05:03'),(195,673,'2006-02-15 05:05:03'),(195,677,'2006-02-15 05:05:03'),(195,706,'2006-02-15 05:05:03'),(195,738,'2006-02-15 05:05:03'),(195,769,'2006-02-15 05:05:03'),(195,781,'2006-02-15 05:05:03'),(195,794,'2006-02-15 05:05:03'),(195,813,'2006-02-15 05:05:03'),(195,869,'2006-02-15 05:05:03'),(195,885,'2006-02-15 05:05:03'),(195,962,'2006-02-15 05:05:03'),(196,64,'2006-02-15 05:05:03'),(196,122,'2006-02-15 05:05:03'),(196,156,'2006-02-15 05:05:03'),(196,169,'2006-02-15 05:05:03'),(196,276,'2006-02-15 05:05:03'),(196,284,'2006-02-15 05:05:03'),(196,303,'2006-02-15 05:05:03'),(196,324,'2006-02-15 05:05:03'),(196,423,'2006-02-15 05:05:03'),(196,473,'2006-02-15 05:05:03'),(196,484,'2006-02-15 05:05:03'),(196,515,'2006-02-15 05:05:03'),(196,524,'2006-02-15 05:05:03'),(196,541,'2006-02-15 05:05:03'),(196,560,'2006-02-15 05:05:03'),(196,575,'2006-02-15 05:05:03'),(196,576,'2006-02-15 05:05:03'),(196,587,'2006-02-15 05:05:03'),(196,615,'2006-02-15 05:05:03'),(196,635,'2006-02-15 05:05:03'),(196,684,'2006-02-15 05:05:03'),(196,795,'2006-02-15 05:05:03'),(196,815,'2006-02-15 05:05:03'),(196,833,'2006-02-15 05:05:03'),(196,837,'2006-02-15 05:05:03'),(196,906,'2006-02-15 05:05:03'),(196,908,'2006-02-15 05:05:03'),(196,919,'2006-02-15 05:05:03'),(196,939,'2006-02-15 05:05:03'),(196,972,'2006-02-15 05:05:03'),(197,6,'2006-02-15 05:05:03'),(197,29,'2006-02-15 05:05:03'),(197,63,'2006-02-15 05:05:03'),(197,123,'2006-02-15 05:05:03'),(197,129,'2006-02-15 05:05:03'),(197,147,'2006-02-15 05:05:03'),(197,164,'2006-02-15 05:05:03'),(197,189,'2006-02-15 05:05:03'),(197,243,'2006-02-15 05:05:03'),(197,249,'2006-02-15 05:05:03'),(197,258,'2006-02-15 05:05:03'),(197,364,'2006-02-15 05:05:03'),(197,369,'2006-02-15 05:05:03'),(197,370,'2006-02-15 05:05:03'),(197,418,'2006-02-15 05:05:03'),(197,522,'2006-02-15 05:05:03'),(197,531,'2006-02-15 05:05:03'),(197,554,'2006-02-15 05:05:03'),(197,598,'2006-02-15 05:05:03'),(197,628,'2006-02-15 05:05:03'),(197,691,'2006-02-15 05:05:03'),(197,724,'2006-02-15 05:05:03'),(197,746,'2006-02-15 05:05:03'),(197,752,'2006-02-15 05:05:03'),(197,758,'2006-02-15 05:05:03'),(197,769,'2006-02-15 05:05:03'),(197,815,'2006-02-15 05:05:03'),(197,916,'2006-02-15 05:05:03'),(197,950,'2006-02-15 05:05:03'),(197,967,'2006-02-15 05:05:03'),(197,974,'2006-02-15 05:05:03'),(197,979,'2006-02-15 05:05:03'),(197,995,'2006-02-15 05:05:03'),(198,1,'2006-02-15 05:05:03'),(198,109,'2006-02-15 05:05:03'),(198,125,'2006-02-15 05:05:03'),(198,186,'2006-02-15 05:05:03'),(198,262,'2006-02-15 05:05:03'),(198,264,'2006-02-15 05:05:03'),(198,303,'2006-02-15 05:05:03'),(198,309,'2006-02-15 05:05:03'),(198,311,'2006-02-15 05:05:03'),(198,329,'2006-02-15 05:05:03'),(198,347,'2006-02-15 05:05:03'),(198,379,'2006-02-15 05:05:03'),(198,395,'2006-02-15 05:05:03'),(198,406,'2006-02-15 05:05:03'),(198,450,'2006-02-15 05:05:03'),(198,464,'2006-02-15 05:05:03'),(198,482,'2006-02-15 05:05:03'),(198,499,'2006-02-15 05:05:03'),(198,536,'2006-02-15 05:05:03'),(198,541,'2006-02-15 05:05:03'),(198,545,'2006-02-15 05:05:03'),(198,555,'2006-02-15 05:05:03'),(198,568,'2006-02-15 05:05:03'),(198,570,'2006-02-15 05:05:03'),(198,588,'2006-02-15 05:05:03'),(198,597,'2006-02-15 05:05:03'),(198,628,'2006-02-15 05:05:03'),(198,745,'2006-02-15 05:05:03'),(198,758,'2006-02-15 05:05:03'),(198,796,'2006-02-15 05:05:03'),(198,806,'2006-02-15 05:05:03'),(198,817,'2006-02-15 05:05:03'),(198,843,'2006-02-15 05:05:03'),(198,858,'2006-02-15 05:05:03'),(198,871,'2006-02-15 05:05:03'),(198,886,'2006-02-15 05:05:03'),(198,892,'2006-02-15 05:05:03'),(198,924,'2006-02-15 05:05:03'),(198,952,'2006-02-15 05:05:03'),(198,997,'2006-02-15 05:05:03'),(199,67,'2006-02-15 05:05:03'),(199,84,'2006-02-15 05:05:03'),(199,145,'2006-02-15 05:05:03'),(199,159,'2006-02-15 05:05:03'),(199,216,'2006-02-15 05:05:03'),(199,432,'2006-02-15 05:05:03'),(199,541,'2006-02-15 05:05:03'),(199,604,'2006-02-15 05:05:03'),(199,640,'2006-02-15 05:05:03'),(199,689,'2006-02-15 05:05:03'),(199,730,'2006-02-15 05:05:03'),(199,784,'2006-02-15 05:05:03'),(199,785,'2006-02-15 05:05:03'),(199,886,'2006-02-15 05:05:03'),(199,953,'2006-02-15 05:05:03'),(200,5,'2006-02-15 05:05:03'),(200,49,'2006-02-15 05:05:03'),(200,80,'2006-02-15 05:05:03'),(200,116,'2006-02-15 05:05:03'),(200,121,'2006-02-15 05:05:03'),(200,149,'2006-02-15 05:05:03'),(200,346,'2006-02-15 05:05:03'),(200,419,'2006-02-15 05:05:03'),(200,462,'2006-02-15 05:05:03'),(200,465,'2006-02-15 05:05:03'),(200,474,'2006-02-15 05:05:03'),(200,537,'2006-02-15 05:05:03'),(200,538,'2006-02-15 05:05:03'),(200,544,'2006-02-15 05:05:03'),(200,714,'2006-02-15 05:05:03'),(200,879,'2006-02-15 05:05:03'),(200,912,'2006-02-15 05:05:03'),(200,945,'2006-02-15 05:05:03'),(200,958,'2006-02-15 05:05:03'),(200,993,'2006-02-15 05:05:03'); +COMMIT; + +-- +-- Dumping data for table film_category +-- + +SET AUTOCOMMIT=0; +INSERT INTO film_category VALUES (1,6,'2006-02-15 05:07:09'),(2,11,'2006-02-15 05:07:09'),(3,6,'2006-02-15 05:07:09'),(4,11,'2006-02-15 05:07:09'),(5,8,'2006-02-15 05:07:09'),(6,9,'2006-02-15 05:07:09'),(7,5,'2006-02-15 05:07:09'),(8,11,'2006-02-15 05:07:09'),(9,11,'2006-02-15 05:07:09'),(10,15,'2006-02-15 05:07:09'),(11,9,'2006-02-15 05:07:09'),(12,12,'2006-02-15 05:07:09'),(13,11,'2006-02-15 05:07:09'),(14,4,'2006-02-15 05:07:09'),(15,9,'2006-02-15 05:07:09'),(16,9,'2006-02-15 05:07:09'),(17,12,'2006-02-15 05:07:09'),(18,2,'2006-02-15 05:07:09'),(19,1,'2006-02-15 05:07:09'),(20,12,'2006-02-15 05:07:09'),(21,1,'2006-02-15 05:07:09'),(22,13,'2006-02-15 05:07:09'),(23,2,'2006-02-15 05:07:09'),(24,11,'2006-02-15 05:07:09'),(25,13,'2006-02-15 05:07:09'),(26,14,'2006-02-15 05:07:09'),(27,15,'2006-02-15 05:07:09'),(28,5,'2006-02-15 05:07:09'),(29,1,'2006-02-15 05:07:09'),(30,11,'2006-02-15 05:07:09'),(31,8,'2006-02-15 05:07:09'),(32,13,'2006-02-15 05:07:09'),(33,7,'2006-02-15 05:07:09'),(34,11,'2006-02-15 05:07:09'),(35,11,'2006-02-15 05:07:09'),(36,2,'2006-02-15 05:07:09'),(37,4,'2006-02-15 05:07:09'),(38,1,'2006-02-15 05:07:09'),(39,14,'2006-02-15 05:07:09'),(40,6,'2006-02-15 05:07:09'),(41,16,'2006-02-15 05:07:09'),(42,15,'2006-02-15 05:07:09'),(43,8,'2006-02-15 05:07:09'),(44,14,'2006-02-15 05:07:09'),(45,13,'2006-02-15 05:07:09'),(46,10,'2006-02-15 05:07:09'),(47,9,'2006-02-15 05:07:09'),(48,3,'2006-02-15 05:07:09'),(49,14,'2006-02-15 05:07:09'),(50,8,'2006-02-15 05:07:09'),(51,12,'2006-02-15 05:07:09'),(52,9,'2006-02-15 05:07:09'),(53,8,'2006-02-15 05:07:09'),(54,12,'2006-02-15 05:07:09'),(55,14,'2006-02-15 05:07:09'),(56,1,'2006-02-15 05:07:09'),(57,16,'2006-02-15 05:07:09'),(58,6,'2006-02-15 05:07:09'),(59,3,'2006-02-15 05:07:09'),(60,4,'2006-02-15 05:07:09'),(61,7,'2006-02-15 05:07:09'),(62,6,'2006-02-15 05:07:09'),(63,8,'2006-02-15 05:07:09'),(64,7,'2006-02-15 05:07:09'),(65,11,'2006-02-15 05:07:09'),(66,3,'2006-02-15 05:07:09'),(67,1,'2006-02-15 05:07:09'),(68,3,'2006-02-15 05:07:09'),(69,14,'2006-02-15 05:07:09'),(70,2,'2006-02-15 05:07:09'),(71,8,'2006-02-15 05:07:09'),(72,6,'2006-02-15 05:07:09'),(73,14,'2006-02-15 05:07:09'),(74,12,'2006-02-15 05:07:09'),(75,16,'2006-02-15 05:07:09'),(76,12,'2006-02-15 05:07:09'),(77,13,'2006-02-15 05:07:09'),(78,2,'2006-02-15 05:07:09'),(79,7,'2006-02-15 05:07:09'),(80,8,'2006-02-15 05:07:09'),(81,14,'2006-02-15 05:07:09'),(82,8,'2006-02-15 05:07:09'),(83,8,'2006-02-15 05:07:09'),(84,16,'2006-02-15 05:07:09'),(85,6,'2006-02-15 05:07:09'),(86,12,'2006-02-15 05:07:09'),(87,16,'2006-02-15 05:07:09'),(88,16,'2006-02-15 05:07:09'),(89,2,'2006-02-15 05:07:09'),(90,13,'2006-02-15 05:07:09'),(91,4,'2006-02-15 05:07:09'),(92,11,'2006-02-15 05:07:09'),(93,13,'2006-02-15 05:07:09'),(94,8,'2006-02-15 05:07:09'),(95,13,'2006-02-15 05:07:09'),(96,13,'2006-02-15 05:07:09'),(97,1,'2006-02-15 05:07:09'),(98,7,'2006-02-15 05:07:09'),(99,5,'2006-02-15 05:07:09'),(100,9,'2006-02-15 05:07:09'),(101,6,'2006-02-15 05:07:09'),(102,15,'2006-02-15 05:07:09'),(103,16,'2006-02-15 05:07:09'),(104,9,'2006-02-15 05:07:09'),(105,1,'2006-02-15 05:07:09'),(106,10,'2006-02-15 05:07:09'),(107,7,'2006-02-15 05:07:09'),(108,13,'2006-02-15 05:07:09'),(109,13,'2006-02-15 05:07:09'),(110,3,'2006-02-15 05:07:09'),(111,1,'2006-02-15 05:07:09'),(112,9,'2006-02-15 05:07:09'),(113,15,'2006-02-15 05:07:09'),(114,14,'2006-02-15 05:07:09'),(115,1,'2006-02-15 05:07:09'),(116,4,'2006-02-15 05:07:09'),(117,10,'2006-02-15 05:07:09'),(118,2,'2006-02-15 05:07:09'),(119,5,'2006-02-15 05:07:09'),(120,15,'2006-02-15 05:07:09'),(121,2,'2006-02-15 05:07:09'),(122,11,'2006-02-15 05:07:09'),(123,16,'2006-02-15 05:07:09'),(124,3,'2006-02-15 05:07:09'),(125,16,'2006-02-15 05:07:09'),(126,1,'2006-02-15 05:07:09'),(127,5,'2006-02-15 05:07:09'),(128,9,'2006-02-15 05:07:09'),(129,6,'2006-02-15 05:07:09'),(130,1,'2006-02-15 05:07:09'),(131,4,'2006-02-15 05:07:09'),(132,14,'2006-02-15 05:07:09'),(133,12,'2006-02-15 05:07:09'),(134,2,'2006-02-15 05:07:09'),(135,15,'2006-02-15 05:07:09'),(136,13,'2006-02-15 05:07:09'),(137,14,'2006-02-15 05:07:09'),(138,14,'2006-02-15 05:07:09'),(139,8,'2006-02-15 05:07:09'),(140,14,'2006-02-15 05:07:09'),(141,10,'2006-02-15 05:07:09'),(142,6,'2006-02-15 05:07:09'),(143,7,'2006-02-15 05:07:09'),(144,13,'2006-02-15 05:07:09'),(145,8,'2006-02-15 05:07:09'),(146,7,'2006-02-15 05:07:09'),(147,8,'2006-02-15 05:07:09'),(148,9,'2006-02-15 05:07:09'),(149,3,'2006-02-15 05:07:09'),(150,6,'2006-02-15 05:07:09'),(151,14,'2006-02-15 05:07:09'),(152,3,'2006-02-15 05:07:09'),(153,14,'2006-02-15 05:07:09'),(154,2,'2006-02-15 05:07:09'),(155,13,'2006-02-15 05:07:09'),(156,6,'2006-02-15 05:07:09'),(157,3,'2006-02-15 05:07:09'),(158,12,'2006-02-15 05:07:09'),(159,5,'2006-02-15 05:07:09'),(160,2,'2006-02-15 05:07:09'),(161,12,'2006-02-15 05:07:09'),(162,1,'2006-02-15 05:07:09'),(163,13,'2006-02-15 05:07:09'),(164,6,'2006-02-15 05:07:09'),(165,14,'2006-02-15 05:07:09'),(166,4,'2006-02-15 05:07:09'),(167,16,'2006-02-15 05:07:09'),(168,3,'2006-02-15 05:07:09'),(169,16,'2006-02-15 05:07:09'),(170,9,'2006-02-15 05:07:09'),(171,11,'2006-02-15 05:07:09'),(172,7,'2006-02-15 05:07:09'),(173,7,'2006-02-15 05:07:09'),(174,12,'2006-02-15 05:07:09'),(175,8,'2006-02-15 05:07:09'),(176,15,'2006-02-15 05:07:09'),(177,14,'2006-02-15 05:07:09'),(178,5,'2006-02-15 05:07:09'),(179,7,'2006-02-15 05:07:09'),(180,4,'2006-02-15 05:07:09'),(181,16,'2006-02-15 05:07:09'),(182,5,'2006-02-15 05:07:09'),(183,8,'2006-02-15 05:07:09'),(184,4,'2006-02-15 05:07:09'),(185,9,'2006-02-15 05:07:09'),(186,7,'2006-02-15 05:07:09'),(187,15,'2006-02-15 05:07:09'),(188,5,'2006-02-15 05:07:09'),(189,10,'2006-02-15 05:07:09'),(190,4,'2006-02-15 05:07:09'),(191,3,'2006-02-15 05:07:09'),(192,9,'2006-02-15 05:07:09'),(193,2,'2006-02-15 05:07:09'),(194,1,'2006-02-15 05:07:09'),(195,14,'2006-02-15 05:07:09'),(196,4,'2006-02-15 05:07:09'),(197,15,'2006-02-15 05:07:09'),(198,9,'2006-02-15 05:07:09'),(199,6,'2006-02-15 05:07:09'),(200,10,'2006-02-15 05:07:09'),(201,9,'2006-02-15 05:07:09'),(202,5,'2006-02-15 05:07:09'),(203,14,'2006-02-15 05:07:09'),(204,7,'2006-02-15 05:07:09'),(205,1,'2006-02-15 05:07:09'),(206,6,'2006-02-15 05:07:09'),(207,9,'2006-02-15 05:07:09'),(208,2,'2006-02-15 05:07:09'),(209,7,'2006-02-15 05:07:09'),(210,1,'2006-02-15 05:07:09'),(211,10,'2006-02-15 05:07:09'),(212,1,'2006-02-15 05:07:09'),(213,8,'2006-02-15 05:07:09'),(214,3,'2006-02-15 05:07:09'),(215,10,'2006-02-15 05:07:09'),(216,13,'2006-02-15 05:07:09'),(217,10,'2006-02-15 05:07:09'),(218,7,'2006-02-15 05:07:09'),(219,6,'2006-02-15 05:07:09'),(220,12,'2006-02-15 05:07:09'),(221,6,'2006-02-15 05:07:09'),(222,11,'2006-02-15 05:07:09'),(223,2,'2006-02-15 05:07:09'),(224,16,'2006-02-15 05:07:09'),(225,7,'2006-02-15 05:07:09'),(226,13,'2006-02-15 05:07:09'),(227,10,'2006-02-15 05:07:09'),(228,4,'2006-02-15 05:07:09'),(229,1,'2006-02-15 05:07:09'),(230,7,'2006-02-15 05:07:09'),(231,8,'2006-02-15 05:07:09'),(232,10,'2006-02-15 05:07:09'),(233,16,'2006-02-15 05:07:09'),(234,14,'2006-02-15 05:07:09'),(235,14,'2006-02-15 05:07:09'),(236,10,'2006-02-15 05:07:09'),(237,15,'2006-02-15 05:07:09'),(238,3,'2006-02-15 05:07:09'),(239,2,'2006-02-15 05:07:09'),(240,14,'2006-02-15 05:07:09'),(241,2,'2006-02-15 05:07:09'),(242,5,'2006-02-15 05:07:09'),(243,2,'2006-02-15 05:07:09'),(244,12,'2006-02-15 05:07:09'),(245,2,'2006-02-15 05:07:09'),(246,9,'2006-02-15 05:07:09'),(247,5,'2006-02-15 05:07:09'),(248,6,'2006-02-15 05:07:09'),(249,4,'2006-02-15 05:07:09'),(250,1,'2006-02-15 05:07:09'),(251,13,'2006-02-15 05:07:09'),(252,1,'2006-02-15 05:07:09'),(253,1,'2006-02-15 05:07:09'),(254,15,'2006-02-15 05:07:09'),(255,12,'2006-02-15 05:07:09'),(256,15,'2006-02-15 05:07:09'),(257,16,'2006-02-15 05:07:09'),(258,11,'2006-02-15 05:07:09'),(259,2,'2006-02-15 05:07:09'),(260,15,'2006-02-15 05:07:09'),(261,6,'2006-02-15 05:07:09'),(262,8,'2006-02-15 05:07:09'),(263,15,'2006-02-15 05:07:09'),(264,10,'2006-02-15 05:07:09'),(265,5,'2006-02-15 05:07:09'),(266,4,'2006-02-15 05:07:09'),(267,13,'2006-02-15 05:07:09'),(268,2,'2006-02-15 05:07:09'),(269,8,'2006-02-15 05:07:09'),(270,13,'2006-02-15 05:07:09'),(271,1,'2006-02-15 05:07:09'),(272,7,'2006-02-15 05:07:09'),(273,8,'2006-02-15 05:07:09'),(274,6,'2006-02-15 05:07:09'),(275,11,'2006-02-15 05:07:09'),(276,5,'2006-02-15 05:07:09'),(277,11,'2006-02-15 05:07:09'),(278,12,'2006-02-15 05:07:09'),(279,15,'2006-02-15 05:07:09'),(280,3,'2006-02-15 05:07:09'),(281,10,'2006-02-15 05:07:09'),(282,7,'2006-02-15 05:07:09'),(283,13,'2006-02-15 05:07:09'),(284,12,'2006-02-15 05:07:09'),(285,14,'2006-02-15 05:07:09'),(286,16,'2006-02-15 05:07:09'),(287,1,'2006-02-15 05:07:09'),(288,16,'2006-02-15 05:07:09'),(289,13,'2006-02-15 05:07:09'),(290,9,'2006-02-15 05:07:09'),(291,15,'2006-02-15 05:07:09'),(292,1,'2006-02-15 05:07:09'),(293,15,'2006-02-15 05:07:09'),(294,16,'2006-02-15 05:07:09'),(295,6,'2006-02-15 05:07:09'),(296,14,'2006-02-15 05:07:09'),(297,4,'2006-02-15 05:07:09'),(298,14,'2006-02-15 05:07:09'),(299,16,'2006-02-15 05:07:09'),(300,2,'2006-02-15 05:07:09'),(301,11,'2006-02-15 05:07:09'),(302,10,'2006-02-15 05:07:09'),(303,1,'2006-02-15 05:07:09'),(304,3,'2006-02-15 05:07:09'),(305,13,'2006-02-15 05:07:09'),(306,10,'2006-02-15 05:07:09'),(307,16,'2006-02-15 05:07:09'),(308,5,'2006-02-15 05:07:09'),(309,8,'2006-02-15 05:07:09'),(310,10,'2006-02-15 05:07:09'),(311,9,'2006-02-15 05:07:09'),(312,14,'2006-02-15 05:07:09'),(313,11,'2006-02-15 05:07:09'),(314,2,'2006-02-15 05:07:09'),(315,8,'2006-02-15 05:07:09'),(316,10,'2006-02-15 05:07:09'),(317,5,'2006-02-15 05:07:09'),(318,1,'2006-02-15 05:07:09'),(319,14,'2006-02-15 05:07:09'),(320,13,'2006-02-15 05:07:09'),(321,13,'2006-02-15 05:07:09'),(322,15,'2006-02-15 05:07:09'),(323,15,'2006-02-15 05:07:09'),(324,5,'2006-02-15 05:07:09'),(325,2,'2006-02-15 05:07:09'),(326,2,'2006-02-15 05:07:09'),(327,1,'2006-02-15 05:07:09'),(328,3,'2006-02-15 05:07:09'),(329,1,'2006-02-15 05:07:09'),(330,2,'2006-02-15 05:07:09'),(331,10,'2006-02-15 05:07:09'),(332,5,'2006-02-15 05:07:09'),(333,12,'2006-02-15 05:07:09'),(334,11,'2006-02-15 05:07:09'),(335,5,'2006-02-15 05:07:09'),(336,6,'2006-02-15 05:07:09'),(337,9,'2006-02-15 05:07:09'),(338,14,'2006-02-15 05:07:09'),(339,16,'2006-02-15 05:07:09'),(340,13,'2006-02-15 05:07:09'),(341,4,'2006-02-15 05:07:09'),(342,16,'2006-02-15 05:07:09'),(343,3,'2006-02-15 05:07:09'),(344,3,'2006-02-15 05:07:09'),(345,8,'2006-02-15 05:07:09'),(346,4,'2006-02-15 05:07:09'),(347,16,'2006-02-15 05:07:09'),(348,8,'2006-02-15 05:07:09'),(349,2,'2006-02-15 05:07:09'),(350,14,'2006-02-15 05:07:09'),(351,11,'2006-02-15 05:07:09'),(352,10,'2006-02-15 05:07:09'),(353,9,'2006-02-15 05:07:09'),(354,3,'2006-02-15 05:07:09'),(355,2,'2006-02-15 05:07:09'),(356,3,'2006-02-15 05:07:09'),(357,4,'2006-02-15 05:07:09'),(358,4,'2006-02-15 05:07:09'),(359,8,'2006-02-15 05:07:09'),(360,1,'2006-02-15 05:07:09'),(361,15,'2006-02-15 05:07:09'),(362,10,'2006-02-15 05:07:09'),(363,12,'2006-02-15 05:07:09'),(364,13,'2006-02-15 05:07:09'),(365,5,'2006-02-15 05:07:09'),(366,7,'2006-02-15 05:07:09'),(367,14,'2006-02-15 05:07:09'),(368,7,'2006-02-15 05:07:09'),(369,14,'2006-02-15 05:07:09'),(370,3,'2006-02-15 05:07:09'),(371,1,'2006-02-15 05:07:09'),(372,15,'2006-02-15 05:07:09'),(373,3,'2006-02-15 05:07:09'),(374,14,'2006-02-15 05:07:09'),(375,1,'2006-02-15 05:07:09'),(376,9,'2006-02-15 05:07:09'),(377,8,'2006-02-15 05:07:09'),(378,12,'2006-02-15 05:07:09'),(379,7,'2006-02-15 05:07:09'),(380,9,'2006-02-15 05:07:09'),(381,10,'2006-02-15 05:07:09'),(382,10,'2006-02-15 05:07:09'),(383,15,'2006-02-15 05:07:09'),(384,12,'2006-02-15 05:07:09'),(385,5,'2006-02-15 05:07:09'),(386,16,'2006-02-15 05:07:09'),(387,10,'2006-02-15 05:07:09'),(388,5,'2006-02-15 05:07:09'),(389,15,'2006-02-15 05:07:09'),(390,14,'2006-02-15 05:07:09'),(391,8,'2006-02-15 05:07:09'),(392,3,'2006-02-15 05:07:09'),(393,6,'2006-02-15 05:07:09'),(394,14,'2006-02-15 05:07:09'),(395,1,'2006-02-15 05:07:09'),(396,7,'2006-02-15 05:07:09'),(397,14,'2006-02-15 05:07:09'),(398,12,'2006-02-15 05:07:09'),(399,9,'2006-02-15 05:07:09'),(400,6,'2006-02-15 05:07:09'),(401,7,'2006-02-15 05:07:09'),(402,2,'2006-02-15 05:07:09'),(403,7,'2006-02-15 05:07:09'),(404,5,'2006-02-15 05:07:09'),(405,16,'2006-02-15 05:07:09'),(406,10,'2006-02-15 05:07:09'),(407,6,'2006-02-15 05:07:09'),(408,10,'2006-02-15 05:07:09'),(409,3,'2006-02-15 05:07:09'),(410,5,'2006-02-15 05:07:09'),(411,12,'2006-02-15 05:07:09'),(412,6,'2006-02-15 05:07:09'),(413,5,'2006-02-15 05:07:09'),(414,9,'2006-02-15 05:07:09'),(415,11,'2006-02-15 05:07:09'),(416,9,'2006-02-15 05:07:09'),(417,1,'2006-02-15 05:07:09'),(418,7,'2006-02-15 05:07:09'),(419,8,'2006-02-15 05:07:09'),(420,15,'2006-02-15 05:07:09'),(421,9,'2006-02-15 05:07:09'),(422,14,'2006-02-15 05:07:09'),(423,3,'2006-02-15 05:07:09'),(424,3,'2006-02-15 05:07:09'),(425,4,'2006-02-15 05:07:09'),(426,12,'2006-02-15 05:07:09'),(427,6,'2006-02-15 05:07:09'),(428,8,'2006-02-15 05:07:09'),(429,15,'2006-02-15 05:07:09'),(430,2,'2006-02-15 05:07:09'),(431,9,'2006-02-15 05:07:09'),(432,4,'2006-02-15 05:07:09'),(433,2,'2006-02-15 05:07:09'),(434,16,'2006-02-15 05:07:09'),(435,9,'2006-02-15 05:07:09'),(436,13,'2006-02-15 05:07:09'),(437,8,'2006-02-15 05:07:09'),(438,10,'2006-02-15 05:07:09'),(439,7,'2006-02-15 05:07:09'),(440,9,'2006-02-15 05:07:09'),(441,6,'2006-02-15 05:07:09'),(442,8,'2006-02-15 05:07:09'),(443,5,'2006-02-15 05:07:09'),(444,5,'2006-02-15 05:07:09'),(445,4,'2006-02-15 05:07:09'),(446,15,'2006-02-15 05:07:09'),(447,10,'2006-02-15 05:07:09'),(448,13,'2006-02-15 05:07:09'),(449,14,'2006-02-15 05:07:09'),(450,3,'2006-02-15 05:07:09'),(451,16,'2006-02-15 05:07:09'),(452,9,'2006-02-15 05:07:09'),(453,15,'2006-02-15 05:07:09'),(454,12,'2006-02-15 05:07:09'),(455,9,'2006-02-15 05:07:09'),(456,2,'2006-02-15 05:07:09'),(457,6,'2006-02-15 05:07:09'),(458,8,'2006-02-15 05:07:09'),(459,9,'2006-02-15 05:07:09'),(460,9,'2006-02-15 05:07:09'),(461,2,'2006-02-15 05:07:09'),(462,12,'2006-02-15 05:07:09'),(463,15,'2006-02-15 05:07:09'),(464,2,'2006-02-15 05:07:09'),(465,13,'2006-02-15 05:07:09'),(466,6,'2006-02-15 05:07:09'),(467,9,'2006-02-15 05:07:09'),(468,3,'2006-02-15 05:07:09'),(469,4,'2006-02-15 05:07:09'),(470,2,'2006-02-15 05:07:09'),(471,4,'2006-02-15 05:07:09'),(472,16,'2006-02-15 05:07:09'),(473,7,'2006-02-15 05:07:09'),(474,15,'2006-02-15 05:07:09'),(475,11,'2006-02-15 05:07:09'),(476,8,'2006-02-15 05:07:09'),(477,12,'2006-02-15 05:07:09'),(478,5,'2006-02-15 05:07:09'),(479,8,'2006-02-15 05:07:09'),(480,4,'2006-02-15 05:07:09'),(481,13,'2006-02-15 05:07:09'),(482,4,'2006-02-15 05:07:09'),(483,10,'2006-02-15 05:07:09'),(484,4,'2006-02-15 05:07:09'),(485,3,'2006-02-15 05:07:09'),(486,9,'2006-02-15 05:07:09'),(487,4,'2006-02-15 05:07:09'),(488,15,'2006-02-15 05:07:09'),(489,2,'2006-02-15 05:07:09'),(490,13,'2006-02-15 05:07:09'),(491,3,'2006-02-15 05:07:09'),(492,13,'2006-02-15 05:07:09'),(493,9,'2006-02-15 05:07:09'),(494,11,'2006-02-15 05:07:09'),(495,11,'2006-02-15 05:07:09'),(496,16,'2006-02-15 05:07:09'),(497,6,'2006-02-15 05:07:09'),(498,8,'2006-02-15 05:07:09'),(499,8,'2006-02-15 05:07:09'),(500,9,'2006-02-15 05:07:09'),(501,1,'2006-02-15 05:07:09'),(502,5,'2006-02-15 05:07:09'),(503,15,'2006-02-15 05:07:09'),(504,7,'2006-02-15 05:07:09'),(505,3,'2006-02-15 05:07:09'),(506,11,'2006-02-15 05:07:09'),(507,10,'2006-02-15 05:07:09'),(508,10,'2006-02-15 05:07:09'),(509,3,'2006-02-15 05:07:09'),(510,2,'2006-02-15 05:07:09'),(511,1,'2006-02-15 05:07:09'),(512,4,'2006-02-15 05:07:09'),(513,16,'2006-02-15 05:07:09'),(514,7,'2006-02-15 05:07:09'),(515,3,'2006-02-15 05:07:09'),(516,12,'2006-02-15 05:07:09'),(517,15,'2006-02-15 05:07:09'),(518,16,'2006-02-15 05:07:09'),(519,15,'2006-02-15 05:07:09'),(520,14,'2006-02-15 05:07:09'),(521,7,'2006-02-15 05:07:09'),(522,5,'2006-02-15 05:07:09'),(523,4,'2006-02-15 05:07:09'),(524,5,'2006-02-15 05:07:09'),(525,4,'2006-02-15 05:07:09'),(526,16,'2006-02-15 05:07:09'),(527,11,'2006-02-15 05:07:09'),(528,8,'2006-02-15 05:07:09'),(529,5,'2006-02-15 05:07:09'),(530,1,'2006-02-15 05:07:09'),(531,9,'2006-02-15 05:07:09'),(532,15,'2006-02-15 05:07:09'),(533,9,'2006-02-15 05:07:09'),(534,8,'2006-02-15 05:07:09'),(535,11,'2006-02-15 05:07:09'),(536,4,'2006-02-15 05:07:09'),(537,4,'2006-02-15 05:07:09'),(538,13,'2006-02-15 05:07:09'),(539,7,'2006-02-15 05:07:09'),(540,12,'2006-02-15 05:07:09'),(541,2,'2006-02-15 05:07:09'),(542,1,'2006-02-15 05:07:09'),(543,16,'2006-02-15 05:07:09'),(544,6,'2006-02-15 05:07:09'),(545,9,'2006-02-15 05:07:09'),(546,10,'2006-02-15 05:07:09'),(547,3,'2006-02-15 05:07:09'),(548,4,'2006-02-15 05:07:09'),(549,1,'2006-02-15 05:07:09'),(550,8,'2006-02-15 05:07:09'),(551,13,'2006-02-15 05:07:09'),(552,6,'2006-02-15 05:07:09'),(553,3,'2006-02-15 05:07:09'),(554,4,'2006-02-15 05:07:09'),(555,5,'2006-02-15 05:07:09'),(556,10,'2006-02-15 05:07:09'),(557,8,'2006-02-15 05:07:09'),(558,13,'2006-02-15 05:07:09'),(559,14,'2006-02-15 05:07:09'),(560,10,'2006-02-15 05:07:09'),(561,13,'2006-02-15 05:07:09'),(562,12,'2006-02-15 05:07:09'),(563,10,'2006-02-15 05:07:09'),(564,2,'2006-02-15 05:07:09'),(565,9,'2006-02-15 05:07:09'),(566,9,'2006-02-15 05:07:09'),(567,9,'2006-02-15 05:07:09'),(568,5,'2006-02-15 05:07:09'),(569,2,'2006-02-15 05:07:09'),(570,15,'2006-02-15 05:07:09'),(571,6,'2006-02-15 05:07:09'),(572,14,'2006-02-15 05:07:09'),(573,3,'2006-02-15 05:07:09'),(574,1,'2006-02-15 05:07:09'),(575,6,'2006-02-15 05:07:09'),(576,6,'2006-02-15 05:07:09'),(577,15,'2006-02-15 05:07:09'),(578,4,'2006-02-15 05:07:09'),(579,1,'2006-02-15 05:07:09'),(580,13,'2006-02-15 05:07:09'),(581,12,'2006-02-15 05:07:09'),(582,2,'2006-02-15 05:07:09'),(583,2,'2006-02-15 05:07:09'),(584,9,'2006-02-15 05:07:09'),(585,7,'2006-02-15 05:07:09'),(586,1,'2006-02-15 05:07:09'),(587,6,'2006-02-15 05:07:09'),(588,3,'2006-02-15 05:07:09'),(589,6,'2006-02-15 05:07:09'),(590,13,'2006-02-15 05:07:09'),(591,10,'2006-02-15 05:07:09'),(592,12,'2006-02-15 05:07:09'),(593,11,'2006-02-15 05:07:09'),(594,1,'2006-02-15 05:07:09'),(595,9,'2006-02-15 05:07:09'),(596,10,'2006-02-15 05:07:09'),(597,10,'2006-02-15 05:07:09'),(598,15,'2006-02-15 05:07:09'),(599,15,'2006-02-15 05:07:09'),(600,11,'2006-02-15 05:07:09'),(601,16,'2006-02-15 05:07:09'),(602,14,'2006-02-15 05:07:09'),(603,8,'2006-02-15 05:07:09'),(604,5,'2006-02-15 05:07:09'),(605,9,'2006-02-15 05:07:09'),(606,15,'2006-02-15 05:07:09'),(607,9,'2006-02-15 05:07:09'),(608,3,'2006-02-15 05:07:09'),(609,16,'2006-02-15 05:07:09'),(610,8,'2006-02-15 05:07:09'),(611,4,'2006-02-15 05:07:09'),(612,15,'2006-02-15 05:07:09'),(613,5,'2006-02-15 05:07:09'),(614,10,'2006-02-15 05:07:09'),(615,2,'2006-02-15 05:07:09'),(616,6,'2006-02-15 05:07:09'),(617,8,'2006-02-15 05:07:09'),(618,7,'2006-02-15 05:07:09'),(619,15,'2006-02-15 05:07:09'),(620,14,'2006-02-15 05:07:09'),(621,8,'2006-02-15 05:07:09'),(622,6,'2006-02-15 05:07:09'),(623,9,'2006-02-15 05:07:09'),(624,10,'2006-02-15 05:07:09'),(625,14,'2006-02-15 05:07:09'),(626,3,'2006-02-15 05:07:09'),(627,6,'2006-02-15 05:07:09'),(628,15,'2006-02-15 05:07:09'),(629,6,'2006-02-15 05:07:09'),(630,7,'2006-02-15 05:07:09'),(631,15,'2006-02-15 05:07:09'),(632,13,'2006-02-15 05:07:09'),(633,4,'2006-02-15 05:07:09'),(634,8,'2006-02-15 05:07:09'),(635,13,'2006-02-15 05:07:09'),(636,12,'2006-02-15 05:07:09'),(637,14,'2006-02-15 05:07:09'),(638,5,'2006-02-15 05:07:09'),(639,8,'2006-02-15 05:07:09'),(640,9,'2006-02-15 05:07:09'),(641,9,'2006-02-15 05:07:09'),(642,16,'2006-02-15 05:07:09'),(643,7,'2006-02-15 05:07:09'),(644,2,'2006-02-15 05:07:09'),(645,16,'2006-02-15 05:07:09'),(646,10,'2006-02-15 05:07:09'),(647,12,'2006-02-15 05:07:09'),(648,16,'2006-02-15 05:07:09'),(649,2,'2006-02-15 05:07:09'),(650,6,'2006-02-15 05:07:09'),(651,2,'2006-02-15 05:07:09'),(652,4,'2006-02-15 05:07:09'),(653,11,'2006-02-15 05:07:09'),(654,10,'2006-02-15 05:07:09'),(655,14,'2006-02-15 05:07:09'),(656,16,'2006-02-15 05:07:09'),(657,5,'2006-02-15 05:07:09'),(658,11,'2006-02-15 05:07:09'),(659,1,'2006-02-15 05:07:09'),(660,5,'2006-02-15 05:07:09'),(661,9,'2006-02-15 05:07:09'),(662,7,'2006-02-15 05:07:09'),(663,4,'2006-02-15 05:07:09'),(664,1,'2006-02-15 05:07:09'),(665,11,'2006-02-15 05:07:09'),(666,7,'2006-02-15 05:07:09'),(667,15,'2006-02-15 05:07:09'),(668,15,'2006-02-15 05:07:09'),(669,9,'2006-02-15 05:07:09'),(670,6,'2006-02-15 05:07:09'),(671,15,'2006-02-15 05:07:09'),(672,5,'2006-02-15 05:07:09'),(673,12,'2006-02-15 05:07:09'),(674,9,'2006-02-15 05:07:09'),(675,13,'2006-02-15 05:07:09'),(676,15,'2006-02-15 05:07:09'),(677,13,'2006-02-15 05:07:09'),(678,15,'2006-02-15 05:07:09'),(679,8,'2006-02-15 05:07:09'),(680,5,'2006-02-15 05:07:09'),(681,15,'2006-02-15 05:07:09'),(682,8,'2006-02-15 05:07:09'),(683,7,'2006-02-15 05:07:09'),(684,10,'2006-02-15 05:07:09'),(685,13,'2006-02-15 05:07:09'),(686,13,'2006-02-15 05:07:09'),(687,6,'2006-02-15 05:07:09'),(688,3,'2006-02-15 05:07:09'),(689,9,'2006-02-15 05:07:09'),(690,2,'2006-02-15 05:07:09'),(691,15,'2006-02-15 05:07:09'),(692,2,'2006-02-15 05:07:09'),(693,2,'2006-02-15 05:07:09'),(694,4,'2006-02-15 05:07:09'),(695,8,'2006-02-15 05:07:09'),(696,2,'2006-02-15 05:07:09'),(697,1,'2006-02-15 05:07:09'),(698,6,'2006-02-15 05:07:09'),(699,10,'2006-02-15 05:07:09'),(700,8,'2006-02-15 05:07:09'),(701,10,'2006-02-15 05:07:09'),(702,11,'2006-02-15 05:07:09'),(703,2,'2006-02-15 05:07:09'),(704,5,'2006-02-15 05:07:09'),(705,9,'2006-02-15 05:07:09'),(706,7,'2006-02-15 05:07:09'),(707,1,'2006-02-15 05:07:09'),(708,6,'2006-02-15 05:07:09'),(709,7,'2006-02-15 05:07:09'),(710,8,'2006-02-15 05:07:09'),(711,14,'2006-02-15 05:07:09'),(712,6,'2006-02-15 05:07:09'),(713,6,'2006-02-15 05:07:09'),(714,14,'2006-02-15 05:07:09'),(715,8,'2006-02-15 05:07:09'),(716,11,'2006-02-15 05:07:09'),(717,1,'2006-02-15 05:07:09'),(718,12,'2006-02-15 05:07:09'),(719,15,'2006-02-15 05:07:09'),(720,13,'2006-02-15 05:07:09'),(721,12,'2006-02-15 05:07:09'),(722,11,'2006-02-15 05:07:09'),(723,14,'2006-02-15 05:07:09'),(724,8,'2006-02-15 05:07:09'),(725,4,'2006-02-15 05:07:09'),(726,9,'2006-02-15 05:07:09'),(727,8,'2006-02-15 05:07:09'),(728,7,'2006-02-15 05:07:09'),(729,15,'2006-02-15 05:07:09'),(730,13,'2006-02-15 05:07:09'),(731,4,'2006-02-15 05:07:09'),(732,1,'2006-02-15 05:07:09'),(733,15,'2006-02-15 05:07:09'),(734,6,'2006-02-15 05:07:09'),(735,3,'2006-02-15 05:07:09'),(736,8,'2006-02-15 05:07:09'),(737,11,'2006-02-15 05:07:09'),(738,9,'2006-02-15 05:07:09'),(739,7,'2006-02-15 05:07:09'),(740,11,'2006-02-15 05:07:09'),(741,12,'2006-02-15 05:07:09'),(742,10,'2006-02-15 05:07:09'),(743,2,'2006-02-15 05:07:09'),(744,4,'2006-02-15 05:07:09'),(745,15,'2006-02-15 05:07:09'),(746,10,'2006-02-15 05:07:09'),(747,10,'2006-02-15 05:07:09'),(748,1,'2006-02-15 05:07:09'),(749,11,'2006-02-15 05:07:09'),(750,13,'2006-02-15 05:07:09'),(751,13,'2006-02-15 05:07:09'),(752,12,'2006-02-15 05:07:09'),(753,8,'2006-02-15 05:07:09'),(754,5,'2006-02-15 05:07:09'),(755,3,'2006-02-15 05:07:09'),(756,5,'2006-02-15 05:07:09'),(757,6,'2006-02-15 05:07:09'),(758,7,'2006-02-15 05:07:09'),(759,13,'2006-02-15 05:07:09'),(760,13,'2006-02-15 05:07:09'),(761,3,'2006-02-15 05:07:09'),(762,10,'2006-02-15 05:07:09'),(763,15,'2006-02-15 05:07:09'),(764,15,'2006-02-15 05:07:09'),(765,5,'2006-02-15 05:07:09'),(766,7,'2006-02-15 05:07:09'),(767,12,'2006-02-15 05:07:09'),(768,3,'2006-02-15 05:07:09'),(769,9,'2006-02-15 05:07:09'),(770,9,'2006-02-15 05:07:09'),(771,7,'2006-02-15 05:07:09'),(772,7,'2006-02-15 05:07:09'),(773,15,'2006-02-15 05:07:09'),(774,5,'2006-02-15 05:07:09'),(775,7,'2006-02-15 05:07:09'),(776,6,'2006-02-15 05:07:09'),(777,15,'2006-02-15 05:07:09'),(778,8,'2006-02-15 05:07:09'),(779,15,'2006-02-15 05:07:09'),(780,8,'2006-02-15 05:07:09'),(781,10,'2006-02-15 05:07:09'),(782,15,'2006-02-15 05:07:09'),(783,16,'2006-02-15 05:07:09'),(784,16,'2006-02-15 05:07:09'),(785,16,'2006-02-15 05:07:09'),(786,3,'2006-02-15 05:07:09'),(787,16,'2006-02-15 05:07:09'),(788,6,'2006-02-15 05:07:09'),(789,9,'2006-02-15 05:07:09'),(790,7,'2006-02-15 05:07:09'),(791,6,'2006-02-15 05:07:09'),(792,9,'2006-02-15 05:07:09'),(793,1,'2006-02-15 05:07:09'),(794,1,'2006-02-15 05:07:09'),(795,8,'2006-02-15 05:07:09'),(796,15,'2006-02-15 05:07:09'),(797,12,'2006-02-15 05:07:09'),(798,14,'2006-02-15 05:07:09'),(799,11,'2006-02-15 05:07:09'),(800,11,'2006-02-15 05:07:09'),(801,3,'2006-02-15 05:07:09'),(802,1,'2006-02-15 05:07:09'),(803,7,'2006-02-15 05:07:09'),(804,11,'2006-02-15 05:07:09'),(805,2,'2006-02-15 05:07:09'),(806,13,'2006-02-15 05:07:09'),(807,10,'2006-02-15 05:07:09'),(808,4,'2006-02-15 05:07:09'),(809,15,'2006-02-15 05:07:09'),(810,8,'2006-02-15 05:07:09'),(811,16,'2006-02-15 05:07:09'),(812,6,'2006-02-15 05:07:09'),(813,15,'2006-02-15 05:07:09'),(814,5,'2006-02-15 05:07:09'),(815,4,'2006-02-15 05:07:09'),(816,2,'2006-02-15 05:07:09'),(817,14,'2006-02-15 05:07:09'),(818,7,'2006-02-15 05:07:09'),(819,12,'2006-02-15 05:07:09'),(820,2,'2006-02-15 05:07:09'),(821,9,'2006-02-15 05:07:09'),(822,8,'2006-02-15 05:07:09'),(823,1,'2006-02-15 05:07:09'),(824,8,'2006-02-15 05:07:09'),(825,1,'2006-02-15 05:07:09'),(826,16,'2006-02-15 05:07:09'),(827,7,'2006-02-15 05:07:09'),(828,4,'2006-02-15 05:07:09'),(829,8,'2006-02-15 05:07:09'),(830,11,'2006-02-15 05:07:09'),(831,14,'2006-02-15 05:07:09'),(832,8,'2006-02-15 05:07:09'),(833,3,'2006-02-15 05:07:09'),(834,6,'2006-02-15 05:07:09'),(835,10,'2006-02-15 05:07:09'),(836,15,'2006-02-15 05:07:09'),(837,5,'2006-02-15 05:07:09'),(838,1,'2006-02-15 05:07:09'),(839,14,'2006-02-15 05:07:09'),(840,10,'2006-02-15 05:07:09'),(841,15,'2006-02-15 05:07:09'),(842,10,'2006-02-15 05:07:09'),(843,4,'2006-02-15 05:07:09'),(844,15,'2006-02-15 05:07:09'),(845,9,'2006-02-15 05:07:09'),(846,13,'2006-02-15 05:07:09'),(847,13,'2006-02-15 05:07:09'),(848,16,'2006-02-15 05:07:09'),(849,2,'2006-02-15 05:07:09'),(850,1,'2006-02-15 05:07:09'),(851,15,'2006-02-15 05:07:09'),(852,3,'2006-02-15 05:07:09'),(853,3,'2006-02-15 05:07:09'),(854,11,'2006-02-15 05:07:09'),(855,6,'2006-02-15 05:07:09'),(856,11,'2006-02-15 05:07:09'),(857,5,'2006-02-15 05:07:09'),(858,5,'2006-02-15 05:07:09'),(859,2,'2006-02-15 05:07:09'),(860,14,'2006-02-15 05:07:09'),(861,10,'2006-02-15 05:07:09'),(862,4,'2006-02-15 05:07:09'),(863,14,'2006-02-15 05:07:09'),(864,3,'2006-02-15 05:07:09'),(865,2,'2006-02-15 05:07:09'),(866,8,'2006-02-15 05:07:09'),(867,8,'2006-02-15 05:07:09'),(868,16,'2006-02-15 05:07:09'),(869,1,'2006-02-15 05:07:09'),(870,11,'2006-02-15 05:07:09'),(871,5,'2006-02-15 05:07:09'),(872,16,'2006-02-15 05:07:09'),(873,3,'2006-02-15 05:07:09'),(874,4,'2006-02-15 05:07:09'),(875,15,'2006-02-15 05:07:09'),(876,11,'2006-02-15 05:07:09'),(877,12,'2006-02-15 05:07:09'),(878,16,'2006-02-15 05:07:09'),(879,12,'2006-02-15 05:07:09'),(880,2,'2006-02-15 05:07:09'),(881,11,'2006-02-15 05:07:09'),(882,7,'2006-02-15 05:07:09'),(883,3,'2006-02-15 05:07:09'),(884,12,'2006-02-15 05:07:09'),(885,11,'2006-02-15 05:07:09'),(886,2,'2006-02-15 05:07:09'),(887,2,'2006-02-15 05:07:09'),(888,6,'2006-02-15 05:07:09'),(889,3,'2006-02-15 05:07:09'),(890,15,'2006-02-15 05:07:09'),(891,4,'2006-02-15 05:07:09'),(892,2,'2006-02-15 05:07:09'),(893,14,'2006-02-15 05:07:09'),(894,16,'2006-02-15 05:07:09'),(895,4,'2006-02-15 05:07:09'),(896,3,'2006-02-15 05:07:09'),(897,7,'2006-02-15 05:07:09'),(898,15,'2006-02-15 05:07:09'),(899,4,'2006-02-15 05:07:09'),(900,9,'2006-02-15 05:07:09'),(901,2,'2006-02-15 05:07:09'),(902,15,'2006-02-15 05:07:09'),(903,16,'2006-02-15 05:07:09'),(904,11,'2006-02-15 05:07:09'),(905,5,'2006-02-15 05:07:09'),(906,5,'2006-02-15 05:07:09'),(907,7,'2006-02-15 05:07:09'),(908,9,'2006-02-15 05:07:09'),(909,11,'2006-02-15 05:07:09'),(910,7,'2006-02-15 05:07:09'),(911,1,'2006-02-15 05:07:09'),(912,14,'2006-02-15 05:07:09'),(913,13,'2006-02-15 05:07:09'),(914,16,'2006-02-15 05:07:09'),(915,1,'2006-02-15 05:07:09'),(916,2,'2006-02-15 05:07:09'),(917,15,'2006-02-15 05:07:09'),(918,3,'2006-02-15 05:07:09'),(919,10,'2006-02-15 05:07:09'),(920,13,'2006-02-15 05:07:09'),(921,12,'2006-02-15 05:07:09'),(922,11,'2006-02-15 05:07:09'),(923,7,'2006-02-15 05:07:09'),(924,14,'2006-02-15 05:07:09'),(925,6,'2006-02-15 05:07:09'),(926,6,'2006-02-15 05:07:09'),(927,1,'2006-02-15 05:07:09'),(928,3,'2006-02-15 05:07:09'),(929,9,'2006-02-15 05:07:09'),(930,14,'2006-02-15 05:07:09'),(931,16,'2006-02-15 05:07:09'),(932,5,'2006-02-15 05:07:09'),(933,13,'2006-02-15 05:07:09'),(934,10,'2006-02-15 05:07:09'),(935,13,'2006-02-15 05:07:09'),(936,12,'2006-02-15 05:07:09'),(937,13,'2006-02-15 05:07:09'),(938,5,'2006-02-15 05:07:09'),(939,5,'2006-02-15 05:07:09'),(940,15,'2006-02-15 05:07:09'),(941,10,'2006-02-15 05:07:09'),(942,7,'2006-02-15 05:07:09'),(943,6,'2006-02-15 05:07:09'),(944,7,'2006-02-15 05:07:09'),(945,6,'2006-02-15 05:07:09'),(946,8,'2006-02-15 05:07:09'),(947,9,'2006-02-15 05:07:09'),(948,13,'2006-02-15 05:07:09'),(949,10,'2006-02-15 05:07:09'),(950,4,'2006-02-15 05:07:09'),(951,4,'2006-02-15 05:07:09'),(952,6,'2006-02-15 05:07:09'),(953,2,'2006-02-15 05:07:09'),(954,13,'2006-02-15 05:07:09'),(955,3,'2006-02-15 05:07:09'),(956,10,'2006-02-15 05:07:09'),(957,9,'2006-02-15 05:07:09'),(958,7,'2006-02-15 05:07:09'),(959,3,'2006-02-15 05:07:09'),(960,6,'2006-02-15 05:07:09'),(961,9,'2006-02-15 05:07:09'),(962,4,'2006-02-15 05:07:09'),(963,2,'2006-02-15 05:07:09'),(964,1,'2006-02-15 05:07:09'),(965,11,'2006-02-15 05:07:09'),(966,6,'2006-02-15 05:07:09'),(967,14,'2006-02-15 05:07:09'),(968,1,'2006-02-15 05:07:09'),(969,7,'2006-02-15 05:07:09'),(970,4,'2006-02-15 05:07:09'),(971,9,'2006-02-15 05:07:09'),(972,14,'2006-02-15 05:07:09'),(973,6,'2006-02-15 05:07:09'),(974,13,'2006-02-15 05:07:09'),(975,8,'2006-02-15 05:07:09'),(976,10,'2006-02-15 05:07:09'),(977,16,'2006-02-15 05:07:09'),(978,5,'2006-02-15 05:07:09'),(979,7,'2006-02-15 05:07:09'),(980,12,'2006-02-15 05:07:09'),(981,16,'2006-02-15 05:07:09'),(982,1,'2006-02-15 05:07:09'),(983,12,'2006-02-15 05:07:09'),(984,9,'2006-02-15 05:07:09'),(985,14,'2006-02-15 05:07:09'),(986,2,'2006-02-15 05:07:09'),(987,12,'2006-02-15 05:07:09'),(988,16,'2006-02-15 05:07:09'),(989,16,'2006-02-15 05:07:09'),(990,11,'2006-02-15 05:07:09'),(991,1,'2006-02-15 05:07:09'),(992,6,'2006-02-15 05:07:09'),(993,3,'2006-02-15 05:07:09'),(994,13,'2006-02-15 05:07:09'),(995,11,'2006-02-15 05:07:09'),(996,6,'2006-02-15 05:07:09'),(997,12,'2006-02-15 05:07:09'),(998,11,'2006-02-15 05:07:09'),(999,3,'2006-02-15 05:07:09'),(1000,5,'2006-02-15 05:07:09'); +COMMIT; + +-- +-- Dumping data for table inventory +-- + +SET AUTOCOMMIT=0; +INSERT INTO inventory VALUES (1,1,1,'2006-02-15 05:09:17'),(2,1,1,'2006-02-15 05:09:17'),(3,1,1,'2006-02-15 05:09:17'),(4,1,1,'2006-02-15 05:09:17'),(5,1,2,'2006-02-15 05:09:17'),(6,1,2,'2006-02-15 05:09:17'),(7,1,2,'2006-02-15 05:09:17'),(8,1,2,'2006-02-15 05:09:17'),(9,2,2,'2006-02-15 05:09:17'),(10,2,2,'2006-02-15 05:09:17'),(11,2,2,'2006-02-15 05:09:17'),(12,3,2,'2006-02-15 05:09:17'),(13,3,2,'2006-02-15 05:09:17'),(14,3,2,'2006-02-15 05:09:17'),(15,3,2,'2006-02-15 05:09:17'),(16,4,1,'2006-02-15 05:09:17'),(17,4,1,'2006-02-15 05:09:17'),(18,4,1,'2006-02-15 05:09:17'),(19,4,1,'2006-02-15 05:09:17'),(20,4,2,'2006-02-15 05:09:17'),(21,4,2,'2006-02-15 05:09:17'),(22,4,2,'2006-02-15 05:09:17'),(23,5,2,'2006-02-15 05:09:17'),(24,5,2,'2006-02-15 05:09:17'),(25,5,2,'2006-02-15 05:09:17'),(26,6,1,'2006-02-15 05:09:17'),(27,6,1,'2006-02-15 05:09:17'),(28,6,1,'2006-02-15 05:09:17'),(29,6,2,'2006-02-15 05:09:17'),(30,6,2,'2006-02-15 05:09:17'),(31,6,2,'2006-02-15 05:09:17'),(32,7,1,'2006-02-15 05:09:17'),(33,7,1,'2006-02-15 05:09:17'),(34,7,2,'2006-02-15 05:09:17'),(35,7,2,'2006-02-15 05:09:17'),(36,7,2,'2006-02-15 05:09:17'),(37,8,2,'2006-02-15 05:09:17'),(38,8,2,'2006-02-15 05:09:17'),(39,8,2,'2006-02-15 05:09:17'),(40,8,2,'2006-02-15 05:09:17'),(41,9,1,'2006-02-15 05:09:17'),(42,9,1,'2006-02-15 05:09:17'),(43,9,1,'2006-02-15 05:09:17'),(44,9,2,'2006-02-15 05:09:17'),(45,9,2,'2006-02-15 05:09:17'),(46,10,1,'2006-02-15 05:09:17'),(47,10,1,'2006-02-15 05:09:17'),(48,10,1,'2006-02-15 05:09:17'),(49,10,1,'2006-02-15 05:09:17'),(50,10,2,'2006-02-15 05:09:17'),(51,10,2,'2006-02-15 05:09:17'),(52,10,2,'2006-02-15 05:09:17'),(53,11,1,'2006-02-15 05:09:17'),(54,11,1,'2006-02-15 05:09:17'),(55,11,1,'2006-02-15 05:09:17'),(56,11,1,'2006-02-15 05:09:17'),(57,11,2,'2006-02-15 05:09:17'),(58,11,2,'2006-02-15 05:09:17'),(59,11,2,'2006-02-15 05:09:17'),(60,12,1,'2006-02-15 05:09:17'),(61,12,1,'2006-02-15 05:09:17'),(62,12,1,'2006-02-15 05:09:17'),(63,12,2,'2006-02-15 05:09:17'),(64,12,2,'2006-02-15 05:09:17'),(65,12,2,'2006-02-15 05:09:17'),(66,12,2,'2006-02-15 05:09:17'),(67,13,2,'2006-02-15 05:09:17'),(68,13,2,'2006-02-15 05:09:17'),(69,13,2,'2006-02-15 05:09:17'),(70,13,2,'2006-02-15 05:09:17'),(71,15,1,'2006-02-15 05:09:17'),(72,15,1,'2006-02-15 05:09:17'),(73,15,2,'2006-02-15 05:09:17'),(74,15,2,'2006-02-15 05:09:17'),(75,15,2,'2006-02-15 05:09:17'),(76,15,2,'2006-02-15 05:09:17'),(77,16,1,'2006-02-15 05:09:17'),(78,16,1,'2006-02-15 05:09:17'),(79,16,2,'2006-02-15 05:09:17'),(80,16,2,'2006-02-15 05:09:17'),(81,17,1,'2006-02-15 05:09:17'),(82,17,1,'2006-02-15 05:09:17'),(83,17,1,'2006-02-15 05:09:17'),(84,17,2,'2006-02-15 05:09:17'),(85,17,2,'2006-02-15 05:09:17'),(86,17,2,'2006-02-15 05:09:17'),(87,18,1,'2006-02-15 05:09:17'),(88,18,1,'2006-02-15 05:09:17'),(89,18,1,'2006-02-15 05:09:17'),(90,18,2,'2006-02-15 05:09:17'),(91,18,2,'2006-02-15 05:09:17'),(92,18,2,'2006-02-15 05:09:17'),(93,19,1,'2006-02-15 05:09:17'),(94,19,1,'2006-02-15 05:09:17'),(95,19,1,'2006-02-15 05:09:17'),(96,19,1,'2006-02-15 05:09:17'),(97,19,2,'2006-02-15 05:09:17'),(98,19,2,'2006-02-15 05:09:17'),(99,20,1,'2006-02-15 05:09:17'),(100,20,1,'2006-02-15 05:09:17'),(101,20,1,'2006-02-15 05:09:17'),(102,21,1,'2006-02-15 05:09:17'),(103,21,1,'2006-02-15 05:09:17'),(104,21,2,'2006-02-15 05:09:17'),(105,21,2,'2006-02-15 05:09:17'),(106,21,2,'2006-02-15 05:09:17'),(107,21,2,'2006-02-15 05:09:17'),(108,22,1,'2006-02-15 05:09:17'),(109,22,1,'2006-02-15 05:09:17'),(110,22,1,'2006-02-15 05:09:17'),(111,22,1,'2006-02-15 05:09:17'),(112,22,2,'2006-02-15 05:09:17'),(113,22,2,'2006-02-15 05:09:17'),(114,22,2,'2006-02-15 05:09:17'),(115,23,1,'2006-02-15 05:09:17'),(116,23,1,'2006-02-15 05:09:17'),(117,23,1,'2006-02-15 05:09:17'),(118,23,2,'2006-02-15 05:09:17'),(119,23,2,'2006-02-15 05:09:17'),(120,24,1,'2006-02-15 05:09:17'),(121,24,1,'2006-02-15 05:09:17'),(122,24,1,'2006-02-15 05:09:17'),(123,24,1,'2006-02-15 05:09:17'),(124,25,1,'2006-02-15 05:09:17'),(125,25,1,'2006-02-15 05:09:17'),(126,25,1,'2006-02-15 05:09:17'),(127,25,1,'2006-02-15 05:09:17'),(128,25,2,'2006-02-15 05:09:17'),(129,25,2,'2006-02-15 05:09:17'),(130,26,1,'2006-02-15 05:09:17'),(131,26,1,'2006-02-15 05:09:17'),(132,26,2,'2006-02-15 05:09:17'),(133,26,2,'2006-02-15 05:09:17'),(134,26,2,'2006-02-15 05:09:17'),(135,27,1,'2006-02-15 05:09:17'),(136,27,1,'2006-02-15 05:09:17'),(137,27,1,'2006-02-15 05:09:17'),(138,27,1,'2006-02-15 05:09:17'),(139,28,1,'2006-02-15 05:09:17'),(140,28,1,'2006-02-15 05:09:17'),(141,28,1,'2006-02-15 05:09:17'),(142,29,1,'2006-02-15 05:09:17'),(143,29,1,'2006-02-15 05:09:17'),(144,30,1,'2006-02-15 05:09:17'),(145,30,1,'2006-02-15 05:09:17'),(146,31,1,'2006-02-15 05:09:17'),(147,31,1,'2006-02-15 05:09:17'),(148,31,1,'2006-02-15 05:09:17'),(149,31,1,'2006-02-15 05:09:17'),(150,31,2,'2006-02-15 05:09:17'),(151,31,2,'2006-02-15 05:09:17'),(152,31,2,'2006-02-15 05:09:17'),(153,31,2,'2006-02-15 05:09:17'),(154,32,2,'2006-02-15 05:09:17'),(155,32,2,'2006-02-15 05:09:17'),(156,34,2,'2006-02-15 05:09:17'),(157,34,2,'2006-02-15 05:09:17'),(158,34,2,'2006-02-15 05:09:17'),(159,34,2,'2006-02-15 05:09:17'),(160,35,1,'2006-02-15 05:09:17'),(161,35,1,'2006-02-15 05:09:17'),(162,35,1,'2006-02-15 05:09:17'),(163,35,1,'2006-02-15 05:09:17'),(164,35,2,'2006-02-15 05:09:17'),(165,35,2,'2006-02-15 05:09:17'),(166,35,2,'2006-02-15 05:09:17'),(167,37,1,'2006-02-15 05:09:17'),(168,37,1,'2006-02-15 05:09:17'),(169,37,1,'2006-02-15 05:09:17'),(170,37,1,'2006-02-15 05:09:17'),(171,37,2,'2006-02-15 05:09:17'),(172,37,2,'2006-02-15 05:09:17'),(173,37,2,'2006-02-15 05:09:17'),(174,39,1,'2006-02-15 05:09:17'),(175,39,1,'2006-02-15 05:09:17'),(176,39,1,'2006-02-15 05:09:17'),(177,39,2,'2006-02-15 05:09:17'),(178,39,2,'2006-02-15 05:09:17'),(179,39,2,'2006-02-15 05:09:17'),(180,39,2,'2006-02-15 05:09:17'),(181,40,2,'2006-02-15 05:09:17'),(182,40,2,'2006-02-15 05:09:17'),(183,40,2,'2006-02-15 05:09:17'),(184,40,2,'2006-02-15 05:09:17'),(185,42,2,'2006-02-15 05:09:17'),(186,42,2,'2006-02-15 05:09:17'),(187,42,2,'2006-02-15 05:09:17'),(188,42,2,'2006-02-15 05:09:17'),(189,43,1,'2006-02-15 05:09:17'),(190,43,1,'2006-02-15 05:09:17'),(191,43,1,'2006-02-15 05:09:17'),(192,43,2,'2006-02-15 05:09:17'),(193,43,2,'2006-02-15 05:09:17'),(194,43,2,'2006-02-15 05:09:17'),(195,43,2,'2006-02-15 05:09:17'),(196,44,1,'2006-02-15 05:09:17'),(197,44,1,'2006-02-15 05:09:17'),(198,44,2,'2006-02-15 05:09:17'),(199,44,2,'2006-02-15 05:09:17'),(200,44,2,'2006-02-15 05:09:17'),(201,45,1,'2006-02-15 05:09:17'),(202,45,1,'2006-02-15 05:09:17'),(203,45,1,'2006-02-15 05:09:17'),(204,45,1,'2006-02-15 05:09:17'),(205,45,2,'2006-02-15 05:09:17'),(206,45,2,'2006-02-15 05:09:17'),(207,46,2,'2006-02-15 05:09:17'),(208,46,2,'2006-02-15 05:09:17'),(209,46,2,'2006-02-15 05:09:17'),(210,47,2,'2006-02-15 05:09:17'),(211,47,2,'2006-02-15 05:09:17'),(212,48,1,'2006-02-15 05:09:17'),(213,48,1,'2006-02-15 05:09:17'),(214,48,2,'2006-02-15 05:09:17'),(215,48,2,'2006-02-15 05:09:17'),(216,49,1,'2006-02-15 05:09:17'),(217,49,1,'2006-02-15 05:09:17'),(218,49,1,'2006-02-15 05:09:17'),(219,49,2,'2006-02-15 05:09:17'),(220,49,2,'2006-02-15 05:09:17'),(221,49,2,'2006-02-15 05:09:17'),(222,50,1,'2006-02-15 05:09:17'),(223,50,1,'2006-02-15 05:09:17'),(224,50,1,'2006-02-15 05:09:17'),(225,50,2,'2006-02-15 05:09:17'),(226,50,2,'2006-02-15 05:09:17'),(227,51,1,'2006-02-15 05:09:17'),(228,51,1,'2006-02-15 05:09:17'),(229,51,2,'2006-02-15 05:09:17'),(230,51,2,'2006-02-15 05:09:17'),(231,51,2,'2006-02-15 05:09:17'),(232,51,2,'2006-02-15 05:09:17'),(233,52,2,'2006-02-15 05:09:17'),(234,52,2,'2006-02-15 05:09:17'),(235,53,1,'2006-02-15 05:09:17'),(236,53,1,'2006-02-15 05:09:17'),(237,54,1,'2006-02-15 05:09:17'),(238,54,1,'2006-02-15 05:09:17'),(239,54,1,'2006-02-15 05:09:17'),(240,54,2,'2006-02-15 05:09:17'),(241,54,2,'2006-02-15 05:09:17'),(242,55,1,'2006-02-15 05:09:17'),(243,55,1,'2006-02-15 05:09:17'),(244,55,1,'2006-02-15 05:09:17'),(245,55,1,'2006-02-15 05:09:17'),(246,55,2,'2006-02-15 05:09:17'),(247,55,2,'2006-02-15 05:09:17'),(248,56,1,'2006-02-15 05:09:17'),(249,56,1,'2006-02-15 05:09:17'),(250,56,1,'2006-02-15 05:09:17'),(251,56,2,'2006-02-15 05:09:17'),(252,56,2,'2006-02-15 05:09:17'),(253,57,1,'2006-02-15 05:09:17'),(254,57,1,'2006-02-15 05:09:17'),(255,57,1,'2006-02-15 05:09:17'),(256,57,1,'2006-02-15 05:09:17'),(257,57,2,'2006-02-15 05:09:17'),(258,57,2,'2006-02-15 05:09:17'),(259,57,2,'2006-02-15 05:09:17'),(260,58,2,'2006-02-15 05:09:17'),(261,58,2,'2006-02-15 05:09:17'),(262,58,2,'2006-02-15 05:09:17'),(263,58,2,'2006-02-15 05:09:17'),(264,59,1,'2006-02-15 05:09:17'),(265,59,1,'2006-02-15 05:09:17'),(266,59,1,'2006-02-15 05:09:17'),(267,59,2,'2006-02-15 05:09:17'),(268,59,2,'2006-02-15 05:09:17'),(269,60,1,'2006-02-15 05:09:17'),(270,60,1,'2006-02-15 05:09:17'),(271,60,1,'2006-02-15 05:09:17'),(272,61,1,'2006-02-15 05:09:17'),(273,61,1,'2006-02-15 05:09:17'),(274,61,1,'2006-02-15 05:09:17'),(275,61,1,'2006-02-15 05:09:17'),(276,61,2,'2006-02-15 05:09:17'),(277,61,2,'2006-02-15 05:09:17'),(278,62,2,'2006-02-15 05:09:17'),(279,62,2,'2006-02-15 05:09:17'),(280,63,1,'2006-02-15 05:09:17'),(281,63,1,'2006-02-15 05:09:17'),(282,63,2,'2006-02-15 05:09:17'),(283,63,2,'2006-02-15 05:09:17'),(284,64,2,'2006-02-15 05:09:17'),(285,64,2,'2006-02-15 05:09:17'),(286,64,2,'2006-02-15 05:09:17'),(287,65,2,'2006-02-15 05:09:17'),(288,65,2,'2006-02-15 05:09:17'),(289,65,2,'2006-02-15 05:09:17'),(290,65,2,'2006-02-15 05:09:17'),(291,66,1,'2006-02-15 05:09:17'),(292,66,1,'2006-02-15 05:09:17'),(293,66,1,'2006-02-15 05:09:17'),(294,67,1,'2006-02-15 05:09:17'),(295,67,1,'2006-02-15 05:09:17'),(296,67,2,'2006-02-15 05:09:17'),(297,67,2,'2006-02-15 05:09:17'),(298,67,2,'2006-02-15 05:09:17'),(299,67,2,'2006-02-15 05:09:17'),(300,68,1,'2006-02-15 05:09:17'),(301,68,1,'2006-02-15 05:09:17'),(302,68,2,'2006-02-15 05:09:17'),(303,68,2,'2006-02-15 05:09:17'),(304,69,1,'2006-02-15 05:09:17'),(305,69,1,'2006-02-15 05:09:17'),(306,69,1,'2006-02-15 05:09:17'),(307,69,1,'2006-02-15 05:09:17'),(308,69,2,'2006-02-15 05:09:17'),(309,69,2,'2006-02-15 05:09:17'),(310,69,2,'2006-02-15 05:09:17'),(311,69,2,'2006-02-15 05:09:17'),(312,70,1,'2006-02-15 05:09:17'),(313,70,1,'2006-02-15 05:09:17'),(314,70,2,'2006-02-15 05:09:17'),(315,70,2,'2006-02-15 05:09:17'),(316,71,2,'2006-02-15 05:09:17'),(317,71,2,'2006-02-15 05:09:17'),(318,71,2,'2006-02-15 05:09:17'),(319,71,2,'2006-02-15 05:09:17'),(320,72,1,'2006-02-15 05:09:17'),(321,72,1,'2006-02-15 05:09:17'),(322,72,1,'2006-02-15 05:09:17'),(323,72,1,'2006-02-15 05:09:17'),(324,72,2,'2006-02-15 05:09:17'),(325,72,2,'2006-02-15 05:09:17'),(326,73,1,'2006-02-15 05:09:17'),(327,73,1,'2006-02-15 05:09:17'),(328,73,1,'2006-02-15 05:09:17'),(329,73,1,'2006-02-15 05:09:17'),(330,73,2,'2006-02-15 05:09:17'),(331,73,2,'2006-02-15 05:09:17'),(332,73,2,'2006-02-15 05:09:17'),(333,73,2,'2006-02-15 05:09:17'),(334,74,1,'2006-02-15 05:09:17'),(335,74,1,'2006-02-15 05:09:17'),(336,74,1,'2006-02-15 05:09:17'),(337,74,2,'2006-02-15 05:09:17'),(338,74,2,'2006-02-15 05:09:17'),(339,75,2,'2006-02-15 05:09:17'),(340,75,2,'2006-02-15 05:09:17'),(341,75,2,'2006-02-15 05:09:17'),(342,76,1,'2006-02-15 05:09:17'),(343,76,1,'2006-02-15 05:09:17'),(344,76,1,'2006-02-15 05:09:17'),(345,77,1,'2006-02-15 05:09:17'),(346,77,1,'2006-02-15 05:09:17'),(347,77,1,'2006-02-15 05:09:17'),(348,77,1,'2006-02-15 05:09:17'),(349,77,2,'2006-02-15 05:09:17'),(350,77,2,'2006-02-15 05:09:17'),(351,78,1,'2006-02-15 05:09:17'),(352,78,1,'2006-02-15 05:09:17'),(353,78,1,'2006-02-15 05:09:17'),(354,78,2,'2006-02-15 05:09:17'),(355,78,2,'2006-02-15 05:09:17'),(356,78,2,'2006-02-15 05:09:17'),(357,78,2,'2006-02-15 05:09:17'),(358,79,1,'2006-02-15 05:09:17'),(359,79,1,'2006-02-15 05:09:17'),(360,79,1,'2006-02-15 05:09:17'),(361,79,2,'2006-02-15 05:09:17'),(362,79,2,'2006-02-15 05:09:17'),(363,79,2,'2006-02-15 05:09:17'),(364,80,1,'2006-02-15 05:09:17'),(365,80,1,'2006-02-15 05:09:17'),(366,80,1,'2006-02-15 05:09:17'),(367,80,1,'2006-02-15 05:09:17'),(368,81,1,'2006-02-15 05:09:17'),(369,81,1,'2006-02-15 05:09:17'),(370,81,1,'2006-02-15 05:09:17'),(371,81,1,'2006-02-15 05:09:17'),(372,82,1,'2006-02-15 05:09:17'),(373,82,1,'2006-02-15 05:09:17'),(374,83,1,'2006-02-15 05:09:17'),(375,83,1,'2006-02-15 05:09:17'),(376,83,1,'2006-02-15 05:09:17'),(377,83,2,'2006-02-15 05:09:17'),(378,83,2,'2006-02-15 05:09:17'),(379,84,1,'2006-02-15 05:09:17'),(380,84,1,'2006-02-15 05:09:17'),(381,84,1,'2006-02-15 05:09:17'),(382,84,1,'2006-02-15 05:09:17'),(383,85,2,'2006-02-15 05:09:17'),(384,85,2,'2006-02-15 05:09:17'),(385,85,2,'2006-02-15 05:09:17'),(386,85,2,'2006-02-15 05:09:17'),(387,86,1,'2006-02-15 05:09:17'),(388,86,1,'2006-02-15 05:09:17'),(389,86,1,'2006-02-15 05:09:17'),(390,86,1,'2006-02-15 05:09:17'),(391,86,2,'2006-02-15 05:09:17'),(392,86,2,'2006-02-15 05:09:17'),(393,86,2,'2006-02-15 05:09:17'),(394,86,2,'2006-02-15 05:09:17'),(395,88,2,'2006-02-15 05:09:17'),(396,88,2,'2006-02-15 05:09:17'),(397,88,2,'2006-02-15 05:09:17'),(398,88,2,'2006-02-15 05:09:17'),(399,89,1,'2006-02-15 05:09:17'),(400,89,1,'2006-02-15 05:09:17'),(401,89,1,'2006-02-15 05:09:17'),(402,89,2,'2006-02-15 05:09:17'),(403,89,2,'2006-02-15 05:09:17'),(404,89,2,'2006-02-15 05:09:17'),(405,90,1,'2006-02-15 05:09:17'),(406,90,1,'2006-02-15 05:09:17'),(407,90,1,'2006-02-15 05:09:17'),(408,90,2,'2006-02-15 05:09:17'),(409,90,2,'2006-02-15 05:09:17'),(410,90,2,'2006-02-15 05:09:17'),(411,91,1,'2006-02-15 05:09:17'),(412,91,1,'2006-02-15 05:09:17'),(413,91,1,'2006-02-15 05:09:17'),(414,91,1,'2006-02-15 05:09:17'),(415,91,2,'2006-02-15 05:09:17'),(416,91,2,'2006-02-15 05:09:17'),(417,91,2,'2006-02-15 05:09:17'),(418,91,2,'2006-02-15 05:09:17'),(419,92,1,'2006-02-15 05:09:17'),(420,92,1,'2006-02-15 05:09:17'),(421,92,2,'2006-02-15 05:09:17'),(422,92,2,'2006-02-15 05:09:17'),(423,93,2,'2006-02-15 05:09:17'),(424,93,2,'2006-02-15 05:09:17'),(425,93,2,'2006-02-15 05:09:17'),(426,94,1,'2006-02-15 05:09:17'),(427,94,1,'2006-02-15 05:09:17'),(428,95,1,'2006-02-15 05:09:17'),(429,95,1,'2006-02-15 05:09:17'),(430,95,2,'2006-02-15 05:09:17'),(431,95,2,'2006-02-15 05:09:17'),(432,95,2,'2006-02-15 05:09:17'),(433,96,1,'2006-02-15 05:09:17'),(434,96,1,'2006-02-15 05:09:17'),(435,96,1,'2006-02-15 05:09:17'),(436,97,1,'2006-02-15 05:09:17'),(437,97,1,'2006-02-15 05:09:17'),(438,97,1,'2006-02-15 05:09:17'),(439,97,1,'2006-02-15 05:09:17'),(440,97,2,'2006-02-15 05:09:17'),(441,97,2,'2006-02-15 05:09:17'),(442,98,1,'2006-02-15 05:09:17'),(443,98,1,'2006-02-15 05:09:17'),(444,98,1,'2006-02-15 05:09:17'),(445,99,1,'2006-02-15 05:09:17'),(446,99,1,'2006-02-15 05:09:17'),(447,99,1,'2006-02-15 05:09:17'),(448,99,2,'2006-02-15 05:09:17'),(449,99,2,'2006-02-15 05:09:17'),(450,99,2,'2006-02-15 05:09:17'),(451,100,1,'2006-02-15 05:09:17'),(452,100,1,'2006-02-15 05:09:17'),(453,100,1,'2006-02-15 05:09:17'),(454,100,1,'2006-02-15 05:09:17'),(455,100,2,'2006-02-15 05:09:17'),(456,100,2,'2006-02-15 05:09:17'),(457,101,1,'2006-02-15 05:09:17'),(458,101,1,'2006-02-15 05:09:17'),(459,101,1,'2006-02-15 05:09:17'),(460,101,1,'2006-02-15 05:09:17'),(461,101,2,'2006-02-15 05:09:17'),(462,101,2,'2006-02-15 05:09:17'),(463,102,2,'2006-02-15 05:09:17'),(464,102,2,'2006-02-15 05:09:17'),(465,103,1,'2006-02-15 05:09:17'),(466,103,1,'2006-02-15 05:09:17'),(467,103,1,'2006-02-15 05:09:17'),(468,103,1,'2006-02-15 05:09:17'),(469,103,2,'2006-02-15 05:09:17'),(470,103,2,'2006-02-15 05:09:17'),(471,103,2,'2006-02-15 05:09:17'),(472,103,2,'2006-02-15 05:09:17'),(473,104,2,'2006-02-15 05:09:17'),(474,104,2,'2006-02-15 05:09:17'),(475,104,2,'2006-02-15 05:09:17'),(476,105,1,'2006-02-15 05:09:17'),(477,105,1,'2006-02-15 05:09:17'),(478,105,2,'2006-02-15 05:09:17'),(479,105,2,'2006-02-15 05:09:17'),(480,105,2,'2006-02-15 05:09:17'),(481,106,1,'2006-02-15 05:09:17'),(482,106,1,'2006-02-15 05:09:17'),(483,107,2,'2006-02-15 05:09:17'),(484,107,2,'2006-02-15 05:09:17'),(485,109,1,'2006-02-15 05:09:17'),(486,109,1,'2006-02-15 05:09:17'),(487,109,1,'2006-02-15 05:09:17'),(488,109,1,'2006-02-15 05:09:17'),(489,109,2,'2006-02-15 05:09:17'),(490,109,2,'2006-02-15 05:09:17'),(491,109,2,'2006-02-15 05:09:17'),(492,109,2,'2006-02-15 05:09:17'),(493,110,1,'2006-02-15 05:09:17'),(494,110,1,'2006-02-15 05:09:17'),(495,110,1,'2006-02-15 05:09:17'),(496,110,1,'2006-02-15 05:09:17'),(497,111,2,'2006-02-15 05:09:17'),(498,111,2,'2006-02-15 05:09:17'),(499,111,2,'2006-02-15 05:09:17'),(500,111,2,'2006-02-15 05:09:17'),(501,112,1,'2006-02-15 05:09:17'),(502,112,1,'2006-02-15 05:09:17'),(503,112,1,'2006-02-15 05:09:17'),(504,112,1,'2006-02-15 05:09:17'),(505,112,2,'2006-02-15 05:09:17'),(506,112,2,'2006-02-15 05:09:17'),(507,112,2,'2006-02-15 05:09:17'),(508,113,2,'2006-02-15 05:09:17'),(509,113,2,'2006-02-15 05:09:17'),(510,113,2,'2006-02-15 05:09:17'),(511,113,2,'2006-02-15 05:09:17'),(512,114,1,'2006-02-15 05:09:17'),(513,114,1,'2006-02-15 05:09:17'),(514,114,1,'2006-02-15 05:09:17'),(515,114,1,'2006-02-15 05:09:17'),(516,114,2,'2006-02-15 05:09:17'),(517,114,2,'2006-02-15 05:09:17'),(518,114,2,'2006-02-15 05:09:17'),(519,115,1,'2006-02-15 05:09:17'),(520,115,1,'2006-02-15 05:09:17'),(521,115,1,'2006-02-15 05:09:17'),(522,115,2,'2006-02-15 05:09:17'),(523,115,2,'2006-02-15 05:09:17'),(524,115,2,'2006-02-15 05:09:17'),(525,115,2,'2006-02-15 05:09:17'),(526,116,1,'2006-02-15 05:09:17'),(527,116,1,'2006-02-15 05:09:17'),(528,116,2,'2006-02-15 05:09:17'),(529,116,2,'2006-02-15 05:09:17'),(530,116,2,'2006-02-15 05:09:17'),(531,116,2,'2006-02-15 05:09:17'),(532,117,1,'2006-02-15 05:09:17'),(533,117,1,'2006-02-15 05:09:17'),(534,117,1,'2006-02-15 05:09:17'),(535,117,1,'2006-02-15 05:09:17'),(536,117,2,'2006-02-15 05:09:17'),(537,117,2,'2006-02-15 05:09:17'),(538,118,1,'2006-02-15 05:09:17'),(539,118,1,'2006-02-15 05:09:17'),(540,118,1,'2006-02-15 05:09:17'),(541,118,1,'2006-02-15 05:09:17'),(542,118,2,'2006-02-15 05:09:17'),(543,118,2,'2006-02-15 05:09:17'),(544,119,1,'2006-02-15 05:09:17'),(545,119,1,'2006-02-15 05:09:17'),(546,119,1,'2006-02-15 05:09:17'),(547,119,2,'2006-02-15 05:09:17'),(548,119,2,'2006-02-15 05:09:17'),(549,119,2,'2006-02-15 05:09:17'),(550,119,2,'2006-02-15 05:09:17'),(551,120,1,'2006-02-15 05:09:17'),(552,120,1,'2006-02-15 05:09:17'),(553,120,1,'2006-02-15 05:09:17'),(554,121,1,'2006-02-15 05:09:17'),(555,121,1,'2006-02-15 05:09:17'),(556,121,1,'2006-02-15 05:09:17'),(557,121,2,'2006-02-15 05:09:17'),(558,121,2,'2006-02-15 05:09:17'),(559,121,2,'2006-02-15 05:09:17'),(560,122,1,'2006-02-15 05:09:17'),(561,122,1,'2006-02-15 05:09:17'),(562,122,1,'2006-02-15 05:09:17'),(563,122,1,'2006-02-15 05:09:17'),(564,122,2,'2006-02-15 05:09:17'),(565,122,2,'2006-02-15 05:09:17'),(566,122,2,'2006-02-15 05:09:17'),(567,123,1,'2006-02-15 05:09:17'),(568,123,1,'2006-02-15 05:09:17'),(569,123,2,'2006-02-15 05:09:17'),(570,123,2,'2006-02-15 05:09:17'),(571,123,2,'2006-02-15 05:09:17'),(572,124,2,'2006-02-15 05:09:17'),(573,124,2,'2006-02-15 05:09:17'),(574,124,2,'2006-02-15 05:09:17'),(575,125,2,'2006-02-15 05:09:17'),(576,125,2,'2006-02-15 05:09:17'),(577,126,2,'2006-02-15 05:09:17'),(578,126,2,'2006-02-15 05:09:17'),(579,126,2,'2006-02-15 05:09:17'),(580,127,1,'2006-02-15 05:09:17'),(581,127,1,'2006-02-15 05:09:17'),(582,127,1,'2006-02-15 05:09:17'),(583,127,1,'2006-02-15 05:09:17'),(584,127,2,'2006-02-15 05:09:17'),(585,127,2,'2006-02-15 05:09:17'),(586,127,2,'2006-02-15 05:09:17'),(587,127,2,'2006-02-15 05:09:17'),(588,129,1,'2006-02-15 05:09:17'),(589,129,1,'2006-02-15 05:09:17'),(590,129,1,'2006-02-15 05:09:17'),(591,129,2,'2006-02-15 05:09:17'),(592,129,2,'2006-02-15 05:09:17'),(593,129,2,'2006-02-15 05:09:17'),(594,130,1,'2006-02-15 05:09:17'),(595,130,1,'2006-02-15 05:09:17'),(596,130,2,'2006-02-15 05:09:17'),(597,130,2,'2006-02-15 05:09:17'),(598,130,2,'2006-02-15 05:09:17'),(599,130,2,'2006-02-15 05:09:17'),(600,131,1,'2006-02-15 05:09:17'),(601,131,1,'2006-02-15 05:09:17'),(602,131,1,'2006-02-15 05:09:17'),(603,131,1,'2006-02-15 05:09:17'),(604,131,2,'2006-02-15 05:09:17'),(605,131,2,'2006-02-15 05:09:17'),(606,132,1,'2006-02-15 05:09:17'),(607,132,1,'2006-02-15 05:09:17'),(608,132,1,'2006-02-15 05:09:17'),(609,132,1,'2006-02-15 05:09:17'),(610,132,2,'2006-02-15 05:09:17'),(611,132,2,'2006-02-15 05:09:17'),(612,133,1,'2006-02-15 05:09:17'),(613,133,1,'2006-02-15 05:09:17'),(614,133,2,'2006-02-15 05:09:17'),(615,133,2,'2006-02-15 05:09:17'),(616,134,2,'2006-02-15 05:09:17'),(617,134,2,'2006-02-15 05:09:17'),(618,134,2,'2006-02-15 05:09:17'),(619,135,1,'2006-02-15 05:09:17'),(620,135,1,'2006-02-15 05:09:17'),(621,135,1,'2006-02-15 05:09:17'),(622,135,2,'2006-02-15 05:09:17'),(623,135,2,'2006-02-15 05:09:17'),(624,135,2,'2006-02-15 05:09:17'),(625,135,2,'2006-02-15 05:09:17'),(626,136,1,'2006-02-15 05:09:17'),(627,136,1,'2006-02-15 05:09:17'),(628,136,1,'2006-02-15 05:09:17'),(629,137,2,'2006-02-15 05:09:17'),(630,137,2,'2006-02-15 05:09:17'),(631,137,2,'2006-02-15 05:09:17'),(632,137,2,'2006-02-15 05:09:17'),(633,138,1,'2006-02-15 05:09:17'),(634,138,1,'2006-02-15 05:09:17'),(635,138,2,'2006-02-15 05:09:17'),(636,138,2,'2006-02-15 05:09:17'),(637,138,2,'2006-02-15 05:09:17'),(638,139,1,'2006-02-15 05:09:17'),(639,139,1,'2006-02-15 05:09:17'),(640,139,1,'2006-02-15 05:09:17'),(641,139,1,'2006-02-15 05:09:17'),(642,139,2,'2006-02-15 05:09:17'),(643,139,2,'2006-02-15 05:09:17'),(644,140,1,'2006-02-15 05:09:17'),(645,140,1,'2006-02-15 05:09:17'),(646,140,2,'2006-02-15 05:09:17'),(647,140,2,'2006-02-15 05:09:17'),(648,140,2,'2006-02-15 05:09:17'),(649,141,1,'2006-02-15 05:09:17'),(650,141,1,'2006-02-15 05:09:17'),(651,141,1,'2006-02-15 05:09:17'),(652,141,2,'2006-02-15 05:09:17'),(653,141,2,'2006-02-15 05:09:17'),(654,142,1,'2006-02-15 05:09:17'),(655,142,1,'2006-02-15 05:09:17'),(656,142,1,'2006-02-15 05:09:17'),(657,142,2,'2006-02-15 05:09:17'),(658,142,2,'2006-02-15 05:09:17'),(659,143,1,'2006-02-15 05:09:17'),(660,143,1,'2006-02-15 05:09:17'),(661,143,1,'2006-02-15 05:09:17'),(662,143,1,'2006-02-15 05:09:17'),(663,143,2,'2006-02-15 05:09:17'),(664,143,2,'2006-02-15 05:09:17'),(665,143,2,'2006-02-15 05:09:17'),(666,145,2,'2006-02-15 05:09:17'),(667,145,2,'2006-02-15 05:09:17'),(668,145,2,'2006-02-15 05:09:17'),(669,146,1,'2006-02-15 05:09:17'),(670,146,1,'2006-02-15 05:09:17'),(671,146,1,'2006-02-15 05:09:17'),(672,147,1,'2006-02-15 05:09:17'),(673,147,1,'2006-02-15 05:09:17'),(674,147,1,'2006-02-15 05:09:17'),(675,147,2,'2006-02-15 05:09:17'),(676,147,2,'2006-02-15 05:09:17'),(677,147,2,'2006-02-15 05:09:17'),(678,149,1,'2006-02-15 05:09:17'),(679,149,1,'2006-02-15 05:09:17'),(680,149,1,'2006-02-15 05:09:17'),(681,149,2,'2006-02-15 05:09:17'),(682,149,2,'2006-02-15 05:09:17'),(683,149,2,'2006-02-15 05:09:17'),(684,150,1,'2006-02-15 05:09:17'),(685,150,1,'2006-02-15 05:09:17'),(686,150,2,'2006-02-15 05:09:17'),(687,150,2,'2006-02-15 05:09:17'),(688,150,2,'2006-02-15 05:09:17'),(689,150,2,'2006-02-15 05:09:17'),(690,151,1,'2006-02-15 05:09:17'),(691,151,1,'2006-02-15 05:09:17'),(692,151,2,'2006-02-15 05:09:17'),(693,151,2,'2006-02-15 05:09:17'),(694,152,1,'2006-02-15 05:09:17'),(695,152,1,'2006-02-15 05:09:17'),(696,152,1,'2006-02-15 05:09:17'),(697,152,1,'2006-02-15 05:09:17'),(698,153,1,'2006-02-15 05:09:17'),(699,153,1,'2006-02-15 05:09:17'),(700,153,1,'2006-02-15 05:09:17'),(701,153,1,'2006-02-15 05:09:17'),(702,154,1,'2006-02-15 05:09:17'),(703,154,1,'2006-02-15 05:09:17'),(704,154,1,'2006-02-15 05:09:17'),(705,154,2,'2006-02-15 05:09:17'),(706,154,2,'2006-02-15 05:09:17'),(707,154,2,'2006-02-15 05:09:17'),(708,154,2,'2006-02-15 05:09:17'),(709,155,1,'2006-02-15 05:09:17'),(710,155,1,'2006-02-15 05:09:17'),(711,155,2,'2006-02-15 05:09:17'),(712,155,2,'2006-02-15 05:09:17'),(713,155,2,'2006-02-15 05:09:17'),(714,156,2,'2006-02-15 05:09:17'),(715,156,2,'2006-02-15 05:09:17'),(716,157,2,'2006-02-15 05:09:17'),(717,157,2,'2006-02-15 05:09:17'),(718,157,2,'2006-02-15 05:09:17'),(719,158,1,'2006-02-15 05:09:17'),(720,158,1,'2006-02-15 05:09:17'),(721,158,2,'2006-02-15 05:09:17'),(722,158,2,'2006-02-15 05:09:17'),(723,158,2,'2006-02-15 05:09:17'),(724,159,1,'2006-02-15 05:09:17'),(725,159,1,'2006-02-15 05:09:17'),(726,159,1,'2006-02-15 05:09:17'),(727,159,1,'2006-02-15 05:09:17'),(728,159,2,'2006-02-15 05:09:17'),(729,159,2,'2006-02-15 05:09:17'),(730,159,2,'2006-02-15 05:09:17'),(731,160,1,'2006-02-15 05:09:17'),(732,160,1,'2006-02-15 05:09:17'),(733,160,2,'2006-02-15 05:09:17'),(734,160,2,'2006-02-15 05:09:17'),(735,160,2,'2006-02-15 05:09:17'),(736,161,1,'2006-02-15 05:09:17'),(737,161,1,'2006-02-15 05:09:17'),(738,162,1,'2006-02-15 05:09:17'),(739,162,1,'2006-02-15 05:09:17'),(740,162,1,'2006-02-15 05:09:17'),(741,162,2,'2006-02-15 05:09:17'),(742,162,2,'2006-02-15 05:09:17'),(743,162,2,'2006-02-15 05:09:17'),(744,162,2,'2006-02-15 05:09:17'),(745,163,2,'2006-02-15 05:09:17'),(746,163,2,'2006-02-15 05:09:17'),(747,163,2,'2006-02-15 05:09:17'),(748,164,1,'2006-02-15 05:09:17'),(749,164,1,'2006-02-15 05:09:17'),(750,164,2,'2006-02-15 05:09:17'),(751,164,2,'2006-02-15 05:09:17'),(752,164,2,'2006-02-15 05:09:17'),(753,165,1,'2006-02-15 05:09:17'),(754,165,1,'2006-02-15 05:09:17'),(755,165,1,'2006-02-15 05:09:17'),(756,165,2,'2006-02-15 05:09:17'),(757,165,2,'2006-02-15 05:09:17'),(758,166,1,'2006-02-15 05:09:17'),(759,166,1,'2006-02-15 05:09:17'),(760,166,1,'2006-02-15 05:09:17'),(761,166,1,'2006-02-15 05:09:17'),(762,166,2,'2006-02-15 05:09:17'),(763,166,2,'2006-02-15 05:09:17'),(764,167,1,'2006-02-15 05:09:17'),(765,167,1,'2006-02-15 05:09:17'),(766,167,1,'2006-02-15 05:09:17'),(767,167,1,'2006-02-15 05:09:17'),(768,167,2,'2006-02-15 05:09:17'),(769,167,2,'2006-02-15 05:09:17'),(770,167,2,'2006-02-15 05:09:17'),(771,168,1,'2006-02-15 05:09:17'),(772,168,1,'2006-02-15 05:09:17'),(773,169,1,'2006-02-15 05:09:17'),(774,169,1,'2006-02-15 05:09:17'),(775,169,2,'2006-02-15 05:09:17'),(776,169,2,'2006-02-15 05:09:17'),(777,170,1,'2006-02-15 05:09:17'),(778,170,1,'2006-02-15 05:09:17'),(779,170,2,'2006-02-15 05:09:17'),(780,170,2,'2006-02-15 05:09:17'),(781,170,2,'2006-02-15 05:09:17'),(782,170,2,'2006-02-15 05:09:17'),(783,172,1,'2006-02-15 05:09:17'),(784,172,1,'2006-02-15 05:09:17'),(785,172,1,'2006-02-15 05:09:17'),(786,172,1,'2006-02-15 05:09:17'),(787,172,2,'2006-02-15 05:09:17'),(788,172,2,'2006-02-15 05:09:17'),(789,172,2,'2006-02-15 05:09:17'),(790,173,1,'2006-02-15 05:09:17'),(791,173,1,'2006-02-15 05:09:17'),(792,173,1,'2006-02-15 05:09:17'),(793,173,2,'2006-02-15 05:09:17'),(794,173,2,'2006-02-15 05:09:17'),(795,174,1,'2006-02-15 05:09:17'),(796,174,1,'2006-02-15 05:09:17'),(797,174,1,'2006-02-15 05:09:17'),(798,174,1,'2006-02-15 05:09:17'),(799,174,2,'2006-02-15 05:09:17'),(800,174,2,'2006-02-15 05:09:17'),(801,174,2,'2006-02-15 05:09:17'),(802,174,2,'2006-02-15 05:09:17'),(803,175,1,'2006-02-15 05:09:17'),(804,175,1,'2006-02-15 05:09:17'),(805,175,2,'2006-02-15 05:09:17'),(806,175,2,'2006-02-15 05:09:17'),(807,175,2,'2006-02-15 05:09:17'),(808,176,1,'2006-02-15 05:09:17'),(809,176,1,'2006-02-15 05:09:17'),(810,176,2,'2006-02-15 05:09:17'),(811,176,2,'2006-02-15 05:09:17'),(812,176,2,'2006-02-15 05:09:17'),(813,176,2,'2006-02-15 05:09:17'),(814,177,2,'2006-02-15 05:09:17'),(815,177,2,'2006-02-15 05:09:17'),(816,177,2,'2006-02-15 05:09:17'),(817,178,1,'2006-02-15 05:09:17'),(818,178,1,'2006-02-15 05:09:17'),(819,179,1,'2006-02-15 05:09:17'),(820,179,1,'2006-02-15 05:09:17'),(821,179,1,'2006-02-15 05:09:17'),(822,179,1,'2006-02-15 05:09:17'),(823,180,2,'2006-02-15 05:09:17'),(824,180,2,'2006-02-15 05:09:17'),(825,181,1,'2006-02-15 05:09:17'),(826,181,1,'2006-02-15 05:09:17'),(827,181,1,'2006-02-15 05:09:17'),(828,181,2,'2006-02-15 05:09:17'),(829,181,2,'2006-02-15 05:09:17'),(830,181,2,'2006-02-15 05:09:17'),(831,181,2,'2006-02-15 05:09:17'),(832,182,1,'2006-02-15 05:09:17'),(833,182,1,'2006-02-15 05:09:17'),(834,183,1,'2006-02-15 05:09:17'),(835,183,1,'2006-02-15 05:09:17'),(836,183,1,'2006-02-15 05:09:17'),(837,183,2,'2006-02-15 05:09:17'),(838,183,2,'2006-02-15 05:09:17'),(839,183,2,'2006-02-15 05:09:17'),(840,184,1,'2006-02-15 05:09:17'),(841,184,1,'2006-02-15 05:09:17'),(842,184,2,'2006-02-15 05:09:17'),(843,184,2,'2006-02-15 05:09:17'),(844,184,2,'2006-02-15 05:09:17'),(845,185,1,'2006-02-15 05:09:17'),(846,185,1,'2006-02-15 05:09:17'),(847,186,1,'2006-02-15 05:09:17'),(848,186,1,'2006-02-15 05:09:17'),(849,186,2,'2006-02-15 05:09:17'),(850,186,2,'2006-02-15 05:09:17'),(851,187,2,'2006-02-15 05:09:17'),(852,187,2,'2006-02-15 05:09:17'),(853,187,2,'2006-02-15 05:09:17'),(854,188,1,'2006-02-15 05:09:17'),(855,188,1,'2006-02-15 05:09:17'),(856,188,1,'2006-02-15 05:09:17'),(857,189,1,'2006-02-15 05:09:17'),(858,189,1,'2006-02-15 05:09:17'),(859,189,2,'2006-02-15 05:09:17'),(860,189,2,'2006-02-15 05:09:17'),(861,189,2,'2006-02-15 05:09:17'),(862,189,2,'2006-02-15 05:09:17'),(863,190,2,'2006-02-15 05:09:17'),(864,190,2,'2006-02-15 05:09:17'),(865,190,2,'2006-02-15 05:09:17'),(866,190,2,'2006-02-15 05:09:17'),(867,191,1,'2006-02-15 05:09:17'),(868,191,1,'2006-02-15 05:09:17'),(869,191,1,'2006-02-15 05:09:17'),(870,191,2,'2006-02-15 05:09:17'),(871,191,2,'2006-02-15 05:09:17'),(872,191,2,'2006-02-15 05:09:17'),(873,193,1,'2006-02-15 05:09:17'),(874,193,1,'2006-02-15 05:09:17'),(875,193,1,'2006-02-15 05:09:17'),(876,193,1,'2006-02-15 05:09:17'),(877,193,2,'2006-02-15 05:09:17'),(878,193,2,'2006-02-15 05:09:17'),(879,193,2,'2006-02-15 05:09:17'),(880,193,2,'2006-02-15 05:09:17'),(881,194,1,'2006-02-15 05:09:17'),(882,194,1,'2006-02-15 05:09:17'),(883,194,2,'2006-02-15 05:09:17'),(884,194,2,'2006-02-15 05:09:17'),(885,196,1,'2006-02-15 05:09:17'),(886,196,1,'2006-02-15 05:09:17'),(887,197,1,'2006-02-15 05:09:17'),(888,197,1,'2006-02-15 05:09:17'),(889,199,1,'2006-02-15 05:09:17'),(890,199,1,'2006-02-15 05:09:17'),(891,199,1,'2006-02-15 05:09:17'),(892,199,1,'2006-02-15 05:09:17'),(893,199,2,'2006-02-15 05:09:17'),(894,199,2,'2006-02-15 05:09:17'),(895,199,2,'2006-02-15 05:09:17'),(896,199,2,'2006-02-15 05:09:17'),(897,200,1,'2006-02-15 05:09:17'),(898,200,1,'2006-02-15 05:09:17'),(899,200,1,'2006-02-15 05:09:17'),(900,200,1,'2006-02-15 05:09:17'),(901,200,2,'2006-02-15 05:09:17'),(902,200,2,'2006-02-15 05:09:17'),(903,200,2,'2006-02-15 05:09:17'),(904,200,2,'2006-02-15 05:09:17'),(905,201,1,'2006-02-15 05:09:17'),(906,201,1,'2006-02-15 05:09:17'),(907,201,1,'2006-02-15 05:09:17'),(908,201,1,'2006-02-15 05:09:17'),(909,202,1,'2006-02-15 05:09:17'),(910,202,1,'2006-02-15 05:09:17'),(911,202,1,'2006-02-15 05:09:17'),(912,203,2,'2006-02-15 05:09:17'),(913,203,2,'2006-02-15 05:09:17'),(914,203,2,'2006-02-15 05:09:17'),(915,203,2,'2006-02-15 05:09:17'),(916,204,1,'2006-02-15 05:09:17'),(917,204,1,'2006-02-15 05:09:17'),(918,204,1,'2006-02-15 05:09:17'),(919,204,1,'2006-02-15 05:09:17'),(920,204,2,'2006-02-15 05:09:17'),(921,204,2,'2006-02-15 05:09:17'),(922,205,1,'2006-02-15 05:09:17'),(923,205,1,'2006-02-15 05:09:17'),(924,205,1,'2006-02-15 05:09:17'),(925,205,1,'2006-02-15 05:09:17'),(926,206,1,'2006-02-15 05:09:17'),(927,206,1,'2006-02-15 05:09:17'),(928,206,1,'2006-02-15 05:09:17'),(929,206,1,'2006-02-15 05:09:17'),(930,206,2,'2006-02-15 05:09:17'),(931,206,2,'2006-02-15 05:09:17'),(932,206,2,'2006-02-15 05:09:17'),(933,206,2,'2006-02-15 05:09:17'),(934,207,1,'2006-02-15 05:09:17'),(935,207,1,'2006-02-15 05:09:17'),(936,207,1,'2006-02-15 05:09:17'),(937,207,1,'2006-02-15 05:09:17'),(938,208,1,'2006-02-15 05:09:17'),(939,208,1,'2006-02-15 05:09:17'),(940,208,1,'2006-02-15 05:09:17'),(941,209,1,'2006-02-15 05:09:17'),(942,209,1,'2006-02-15 05:09:17'),(943,209,1,'2006-02-15 05:09:17'),(944,209,1,'2006-02-15 05:09:17'),(945,210,2,'2006-02-15 05:09:17'),(946,210,2,'2006-02-15 05:09:17'),(947,210,2,'2006-02-15 05:09:17'),(948,211,1,'2006-02-15 05:09:17'),(949,211,1,'2006-02-15 05:09:17'),(950,212,1,'2006-02-15 05:09:17'),(951,212,1,'2006-02-15 05:09:17'),(952,212,1,'2006-02-15 05:09:17'),(953,212,2,'2006-02-15 05:09:17'),(954,212,2,'2006-02-15 05:09:17'),(955,213,1,'2006-02-15 05:09:17'),(956,213,1,'2006-02-15 05:09:17'),(957,213,1,'2006-02-15 05:09:17'),(958,213,1,'2006-02-15 05:09:17'),(959,214,2,'2006-02-15 05:09:17'),(960,214,2,'2006-02-15 05:09:17'),(961,214,2,'2006-02-15 05:09:17'),(962,214,2,'2006-02-15 05:09:17'),(963,215,1,'2006-02-15 05:09:17'),(964,215,1,'2006-02-15 05:09:17'),(965,215,1,'2006-02-15 05:09:17'),(966,215,2,'2006-02-15 05:09:17'),(967,215,2,'2006-02-15 05:09:17'),(968,215,2,'2006-02-15 05:09:17'),(969,216,1,'2006-02-15 05:09:17'),(970,216,1,'2006-02-15 05:09:17'),(971,216,2,'2006-02-15 05:09:17'),(972,216,2,'2006-02-15 05:09:17'),(973,216,2,'2006-02-15 05:09:17'),(974,218,1,'2006-02-15 05:09:17'),(975,218,1,'2006-02-15 05:09:17'),(976,218,1,'2006-02-15 05:09:17'),(977,218,1,'2006-02-15 05:09:17'),(978,218,2,'2006-02-15 05:09:17'),(979,218,2,'2006-02-15 05:09:17'),(980,218,2,'2006-02-15 05:09:17'),(981,219,1,'2006-02-15 05:09:17'),(982,219,1,'2006-02-15 05:09:17'),(983,219,1,'2006-02-15 05:09:17'),(984,219,1,'2006-02-15 05:09:17'),(985,220,1,'2006-02-15 05:09:17'),(986,220,1,'2006-02-15 05:09:17'),(987,220,1,'2006-02-15 05:09:17'),(988,220,1,'2006-02-15 05:09:17'),(989,220,2,'2006-02-15 05:09:17'),(990,220,2,'2006-02-15 05:09:17'),(991,220,2,'2006-02-15 05:09:17'),(992,220,2,'2006-02-15 05:09:17'),(993,222,1,'2006-02-15 05:09:17'),(994,222,1,'2006-02-15 05:09:17'),(995,222,2,'2006-02-15 05:09:17'),(996,222,2,'2006-02-15 05:09:17'),(997,222,2,'2006-02-15 05:09:17'),(998,222,2,'2006-02-15 05:09:17'),(999,223,2,'2006-02-15 05:09:17'),(1000,223,2,'2006-02-15 05:09:17'),(1001,224,1,'2006-02-15 05:09:17'),(1002,224,1,'2006-02-15 05:09:17'),(1003,225,1,'2006-02-15 05:09:17'),(1004,225,1,'2006-02-15 05:09:17'),(1005,225,1,'2006-02-15 05:09:17'),(1006,226,1,'2006-02-15 05:09:17'),(1007,226,1,'2006-02-15 05:09:17'),(1008,226,2,'2006-02-15 05:09:17'),(1009,226,2,'2006-02-15 05:09:17'),(1010,226,2,'2006-02-15 05:09:17'),(1011,227,1,'2006-02-15 05:09:17'),(1012,227,1,'2006-02-15 05:09:17'),(1013,227,1,'2006-02-15 05:09:17'),(1014,227,2,'2006-02-15 05:09:17'),(1015,227,2,'2006-02-15 05:09:17'),(1016,228,1,'2006-02-15 05:09:17'),(1017,228,1,'2006-02-15 05:09:17'),(1018,228,1,'2006-02-15 05:09:17'),(1019,228,2,'2006-02-15 05:09:17'),(1020,228,2,'2006-02-15 05:09:17'),(1021,228,2,'2006-02-15 05:09:17'),(1022,228,2,'2006-02-15 05:09:17'),(1023,229,1,'2006-02-15 05:09:17'),(1024,229,1,'2006-02-15 05:09:17'),(1025,229,2,'2006-02-15 05:09:17'),(1026,229,2,'2006-02-15 05:09:17'),(1027,230,1,'2006-02-15 05:09:17'),(1028,230,1,'2006-02-15 05:09:17'),(1029,231,1,'2006-02-15 05:09:17'),(1030,231,1,'2006-02-15 05:09:17'),(1031,231,1,'2006-02-15 05:09:17'),(1032,231,1,'2006-02-15 05:09:17'),(1033,231,2,'2006-02-15 05:09:17'),(1034,231,2,'2006-02-15 05:09:17'),(1035,231,2,'2006-02-15 05:09:17'),(1036,231,2,'2006-02-15 05:09:17'),(1037,232,1,'2006-02-15 05:09:17'),(1038,232,1,'2006-02-15 05:09:17'),(1039,232,1,'2006-02-15 05:09:17'),(1040,232,2,'2006-02-15 05:09:17'),(1041,232,2,'2006-02-15 05:09:17'),(1042,233,1,'2006-02-15 05:09:17'),(1043,233,1,'2006-02-15 05:09:17'),(1044,233,1,'2006-02-15 05:09:17'),(1045,233,1,'2006-02-15 05:09:17'),(1046,233,2,'2006-02-15 05:09:17'),(1047,233,2,'2006-02-15 05:09:17'),(1048,234,1,'2006-02-15 05:09:17'),(1049,234,1,'2006-02-15 05:09:17'),(1050,234,1,'2006-02-15 05:09:17'),(1051,234,1,'2006-02-15 05:09:17'),(1052,234,2,'2006-02-15 05:09:17'),(1053,234,2,'2006-02-15 05:09:17'),(1054,234,2,'2006-02-15 05:09:17'),(1055,235,1,'2006-02-15 05:09:17'),(1056,235,1,'2006-02-15 05:09:17'),(1057,235,2,'2006-02-15 05:09:17'),(1058,235,2,'2006-02-15 05:09:17'),(1059,235,2,'2006-02-15 05:09:17'),(1060,235,2,'2006-02-15 05:09:17'),(1061,236,2,'2006-02-15 05:09:17'),(1062,236,2,'2006-02-15 05:09:17'),(1063,236,2,'2006-02-15 05:09:17'),(1064,236,2,'2006-02-15 05:09:17'),(1065,237,1,'2006-02-15 05:09:17'),(1066,237,1,'2006-02-15 05:09:17'),(1067,238,1,'2006-02-15 05:09:17'),(1068,238,1,'2006-02-15 05:09:17'),(1069,239,1,'2006-02-15 05:09:17'),(1070,239,1,'2006-02-15 05:09:17'),(1071,239,1,'2006-02-15 05:09:17'),(1072,239,1,'2006-02-15 05:09:17'),(1073,239,2,'2006-02-15 05:09:17'),(1074,239,2,'2006-02-15 05:09:17'),(1075,239,2,'2006-02-15 05:09:17'),(1076,239,2,'2006-02-15 05:09:17'),(1077,240,2,'2006-02-15 05:09:17'),(1078,240,2,'2006-02-15 05:09:17'),(1079,240,2,'2006-02-15 05:09:17'),(1080,241,1,'2006-02-15 05:09:17'),(1081,241,1,'2006-02-15 05:09:17'),(1082,241,1,'2006-02-15 05:09:17'),(1083,241,1,'2006-02-15 05:09:17'),(1084,242,1,'2006-02-15 05:09:17'),(1085,242,1,'2006-02-15 05:09:17'),(1086,242,2,'2006-02-15 05:09:17'),(1087,242,2,'2006-02-15 05:09:17'),(1088,242,2,'2006-02-15 05:09:17'),(1089,243,1,'2006-02-15 05:09:17'),(1090,243,1,'2006-02-15 05:09:17'),(1091,243,2,'2006-02-15 05:09:17'),(1092,243,2,'2006-02-15 05:09:17'),(1093,243,2,'2006-02-15 05:09:17'),(1094,243,2,'2006-02-15 05:09:17'),(1095,244,1,'2006-02-15 05:09:17'),(1096,244,1,'2006-02-15 05:09:17'),(1097,244,1,'2006-02-15 05:09:17'),(1098,244,1,'2006-02-15 05:09:17'),(1099,244,2,'2006-02-15 05:09:17'),(1100,244,2,'2006-02-15 05:09:17'),(1101,244,2,'2006-02-15 05:09:17'),(1102,245,1,'2006-02-15 05:09:17'),(1103,245,1,'2006-02-15 05:09:17'),(1104,245,1,'2006-02-15 05:09:17'),(1105,245,2,'2006-02-15 05:09:17'),(1106,245,2,'2006-02-15 05:09:17'),(1107,245,2,'2006-02-15 05:09:17'),(1108,245,2,'2006-02-15 05:09:17'),(1109,246,2,'2006-02-15 05:09:17'),(1110,246,2,'2006-02-15 05:09:17'),(1111,246,2,'2006-02-15 05:09:17'),(1112,247,1,'2006-02-15 05:09:17'),(1113,247,1,'2006-02-15 05:09:17'),(1114,247,1,'2006-02-15 05:09:17'),(1115,247,2,'2006-02-15 05:09:17'),(1116,247,2,'2006-02-15 05:09:17'),(1117,247,2,'2006-02-15 05:09:17'),(1118,247,2,'2006-02-15 05:09:17'),(1119,248,2,'2006-02-15 05:09:17'),(1120,248,2,'2006-02-15 05:09:17'),(1121,249,1,'2006-02-15 05:09:17'),(1122,249,1,'2006-02-15 05:09:17'),(1123,249,2,'2006-02-15 05:09:17'),(1124,249,2,'2006-02-15 05:09:17'),(1125,249,2,'2006-02-15 05:09:17'),(1126,249,2,'2006-02-15 05:09:17'),(1127,250,2,'2006-02-15 05:09:17'),(1128,250,2,'2006-02-15 05:09:17'),(1129,250,2,'2006-02-15 05:09:17'),(1130,250,2,'2006-02-15 05:09:17'),(1131,251,1,'2006-02-15 05:09:17'),(1132,251,1,'2006-02-15 05:09:17'),(1133,251,2,'2006-02-15 05:09:17'),(1134,251,2,'2006-02-15 05:09:17'),(1135,251,2,'2006-02-15 05:09:17'),(1136,252,1,'2006-02-15 05:09:17'),(1137,252,1,'2006-02-15 05:09:17'),(1138,252,1,'2006-02-15 05:09:17'),(1139,252,2,'2006-02-15 05:09:17'),(1140,252,2,'2006-02-15 05:09:17'),(1141,252,2,'2006-02-15 05:09:17'),(1142,253,1,'2006-02-15 05:09:17'),(1143,253,1,'2006-02-15 05:09:17'),(1144,253,1,'2006-02-15 05:09:17'),(1145,253,1,'2006-02-15 05:09:17'),(1146,253,2,'2006-02-15 05:09:17'),(1147,253,2,'2006-02-15 05:09:17'),(1148,254,1,'2006-02-15 05:09:17'),(1149,254,1,'2006-02-15 05:09:17'),(1150,254,2,'2006-02-15 05:09:17'),(1151,254,2,'2006-02-15 05:09:17'),(1152,254,2,'2006-02-15 05:09:17'),(1153,255,1,'2006-02-15 05:09:17'),(1154,255,1,'2006-02-15 05:09:17'),(1155,255,1,'2006-02-15 05:09:17'),(1156,255,1,'2006-02-15 05:09:17'),(1157,255,2,'2006-02-15 05:09:17'),(1158,255,2,'2006-02-15 05:09:17'),(1159,256,2,'2006-02-15 05:09:17'),(1160,256,2,'2006-02-15 05:09:17'),(1161,256,2,'2006-02-15 05:09:17'),(1162,257,2,'2006-02-15 05:09:17'),(1163,257,2,'2006-02-15 05:09:17'),(1164,257,2,'2006-02-15 05:09:17'),(1165,258,2,'2006-02-15 05:09:17'),(1166,258,2,'2006-02-15 05:09:17'),(1167,258,2,'2006-02-15 05:09:17'),(1168,258,2,'2006-02-15 05:09:17'),(1169,259,1,'2006-02-15 05:09:17'),(1170,259,1,'2006-02-15 05:09:17'),(1171,260,2,'2006-02-15 05:09:17'),(1172,260,2,'2006-02-15 05:09:17'),(1173,260,2,'2006-02-15 05:09:17'),(1174,260,2,'2006-02-15 05:09:17'),(1175,261,1,'2006-02-15 05:09:17'),(1176,261,1,'2006-02-15 05:09:17'),(1177,262,2,'2006-02-15 05:09:17'),(1178,262,2,'2006-02-15 05:09:17'),(1179,263,1,'2006-02-15 05:09:17'),(1180,263,1,'2006-02-15 05:09:17'),(1181,263,1,'2006-02-15 05:09:17'),(1182,263,1,'2006-02-15 05:09:17'),(1183,263,2,'2006-02-15 05:09:17'),(1184,263,2,'2006-02-15 05:09:17'),(1185,263,2,'2006-02-15 05:09:17'),(1186,264,2,'2006-02-15 05:09:17'),(1187,264,2,'2006-02-15 05:09:17'),(1188,265,1,'2006-02-15 05:09:17'),(1189,265,1,'2006-02-15 05:09:17'),(1190,265,1,'2006-02-15 05:09:17'),(1191,265,1,'2006-02-15 05:09:17'),(1192,266,1,'2006-02-15 05:09:17'),(1193,266,1,'2006-02-15 05:09:17'),(1194,266,1,'2006-02-15 05:09:17'),(1195,266,1,'2006-02-15 05:09:17'),(1196,266,2,'2006-02-15 05:09:17'),(1197,266,2,'2006-02-15 05:09:17'),(1198,266,2,'2006-02-15 05:09:17'),(1199,266,2,'2006-02-15 05:09:17'),(1200,267,1,'2006-02-15 05:09:17'),(1201,267,1,'2006-02-15 05:09:17'),(1202,267,1,'2006-02-15 05:09:17'),(1203,267,1,'2006-02-15 05:09:17'),(1204,267,2,'2006-02-15 05:09:17'),(1205,267,2,'2006-02-15 05:09:17'),(1206,268,2,'2006-02-15 05:09:17'),(1207,268,2,'2006-02-15 05:09:17'),(1208,269,1,'2006-02-15 05:09:17'),(1209,269,1,'2006-02-15 05:09:17'),(1210,269,2,'2006-02-15 05:09:17'),(1211,269,2,'2006-02-15 05:09:17'),(1212,269,2,'2006-02-15 05:09:17'),(1213,269,2,'2006-02-15 05:09:17'),(1214,270,1,'2006-02-15 05:09:17'),(1215,270,1,'2006-02-15 05:09:17'),(1216,270,1,'2006-02-15 05:09:17'),(1217,270,2,'2006-02-15 05:09:17'),(1218,270,2,'2006-02-15 05:09:17'),(1219,270,2,'2006-02-15 05:09:17'),(1220,270,2,'2006-02-15 05:09:17'),(1221,271,1,'2006-02-15 05:09:17'),(1222,271,1,'2006-02-15 05:09:17'),(1223,271,1,'2006-02-15 05:09:17'),(1224,271,2,'2006-02-15 05:09:17'),(1225,271,2,'2006-02-15 05:09:17'),(1226,272,1,'2006-02-15 05:09:17'),(1227,272,1,'2006-02-15 05:09:17'),(1228,272,1,'2006-02-15 05:09:17'),(1229,272,1,'2006-02-15 05:09:17'),(1230,273,1,'2006-02-15 05:09:17'),(1231,273,1,'2006-02-15 05:09:17'),(1232,273,1,'2006-02-15 05:09:17'),(1233,273,1,'2006-02-15 05:09:17'),(1234,273,2,'2006-02-15 05:09:17'),(1235,273,2,'2006-02-15 05:09:17'),(1236,273,2,'2006-02-15 05:09:17'),(1237,274,1,'2006-02-15 05:09:17'),(1238,274,1,'2006-02-15 05:09:17'),(1239,274,1,'2006-02-15 05:09:17'),(1240,274,2,'2006-02-15 05:09:17'),(1241,274,2,'2006-02-15 05:09:17'),(1242,274,2,'2006-02-15 05:09:17'),(1243,274,2,'2006-02-15 05:09:17'),(1244,275,1,'2006-02-15 05:09:17'),(1245,275,1,'2006-02-15 05:09:17'),(1246,275,1,'2006-02-15 05:09:17'),(1247,275,2,'2006-02-15 05:09:17'),(1248,275,2,'2006-02-15 05:09:17'),(1249,276,1,'2006-02-15 05:09:17'),(1250,276,1,'2006-02-15 05:09:17'),(1251,276,1,'2006-02-15 05:09:17'),(1252,276,1,'2006-02-15 05:09:17'),(1253,277,1,'2006-02-15 05:09:17'),(1254,277,1,'2006-02-15 05:09:17'),(1255,277,1,'2006-02-15 05:09:17'),(1256,278,1,'2006-02-15 05:09:17'),(1257,278,1,'2006-02-15 05:09:17'),(1258,279,1,'2006-02-15 05:09:17'),(1259,279,1,'2006-02-15 05:09:17'),(1260,280,1,'2006-02-15 05:09:17'),(1261,280,1,'2006-02-15 05:09:17'),(1262,280,1,'2006-02-15 05:09:17'),(1263,280,1,'2006-02-15 05:09:17'),(1264,280,2,'2006-02-15 05:09:17'),(1265,280,2,'2006-02-15 05:09:17'),(1266,281,1,'2006-02-15 05:09:17'),(1267,281,1,'2006-02-15 05:09:17'),(1268,281,2,'2006-02-15 05:09:17'),(1269,281,2,'2006-02-15 05:09:17'),(1270,281,2,'2006-02-15 05:09:17'),(1271,281,2,'2006-02-15 05:09:17'),(1272,282,1,'2006-02-15 05:09:17'),(1273,282,1,'2006-02-15 05:09:17'),(1274,282,1,'2006-02-15 05:09:17'),(1275,282,2,'2006-02-15 05:09:17'),(1276,282,2,'2006-02-15 05:09:17'),(1277,282,2,'2006-02-15 05:09:17'),(1278,283,1,'2006-02-15 05:09:17'),(1279,283,1,'2006-02-15 05:09:17'),(1280,283,1,'2006-02-15 05:09:17'),(1281,284,1,'2006-02-15 05:09:17'),(1282,284,1,'2006-02-15 05:09:17'),(1283,284,1,'2006-02-15 05:09:17'),(1284,284,2,'2006-02-15 05:09:17'),(1285,284,2,'2006-02-15 05:09:17'),(1286,284,2,'2006-02-15 05:09:17'),(1287,284,2,'2006-02-15 05:09:17'),(1288,285,1,'2006-02-15 05:09:17'),(1289,285,1,'2006-02-15 05:09:17'),(1290,285,1,'2006-02-15 05:09:17'),(1291,285,2,'2006-02-15 05:09:17'),(1292,285,2,'2006-02-15 05:09:17'),(1293,285,2,'2006-02-15 05:09:17'),(1294,285,2,'2006-02-15 05:09:17'),(1295,286,1,'2006-02-15 05:09:17'),(1296,286,1,'2006-02-15 05:09:17'),(1297,286,2,'2006-02-15 05:09:17'),(1298,286,2,'2006-02-15 05:09:17'),(1299,286,2,'2006-02-15 05:09:17'),(1300,287,1,'2006-02-15 05:09:17'),(1301,287,1,'2006-02-15 05:09:17'),(1302,287,2,'2006-02-15 05:09:17'),(1303,287,2,'2006-02-15 05:09:17'),(1304,288,1,'2006-02-15 05:09:17'),(1305,288,1,'2006-02-15 05:09:17'),(1306,288,2,'2006-02-15 05:09:17'),(1307,288,2,'2006-02-15 05:09:17'),(1308,288,2,'2006-02-15 05:09:17'),(1309,288,2,'2006-02-15 05:09:17'),(1310,289,1,'2006-02-15 05:09:17'),(1311,289,1,'2006-02-15 05:09:17'),(1312,290,1,'2006-02-15 05:09:17'),(1313,290,1,'2006-02-15 05:09:17'),(1314,290,1,'2006-02-15 05:09:17'),(1315,291,1,'2006-02-15 05:09:17'),(1316,291,1,'2006-02-15 05:09:17'),(1317,291,1,'2006-02-15 05:09:17'),(1318,291,1,'2006-02-15 05:09:17'),(1319,292,1,'2006-02-15 05:09:17'),(1320,292,1,'2006-02-15 05:09:17'),(1321,292,1,'2006-02-15 05:09:17'),(1322,292,2,'2006-02-15 05:09:17'),(1323,292,2,'2006-02-15 05:09:17'),(1324,292,2,'2006-02-15 05:09:17'),(1325,293,1,'2006-02-15 05:09:17'),(1326,293,1,'2006-02-15 05:09:17'),(1327,293,2,'2006-02-15 05:09:17'),(1328,293,2,'2006-02-15 05:09:17'),(1329,293,2,'2006-02-15 05:09:17'),(1330,294,1,'2006-02-15 05:09:17'),(1331,294,1,'2006-02-15 05:09:17'),(1332,294,2,'2006-02-15 05:09:17'),(1333,294,2,'2006-02-15 05:09:17'),(1334,294,2,'2006-02-15 05:09:17'),(1335,295,1,'2006-02-15 05:09:17'),(1336,295,1,'2006-02-15 05:09:17'),(1337,295,1,'2006-02-15 05:09:17'),(1338,295,1,'2006-02-15 05:09:17'),(1339,295,2,'2006-02-15 05:09:17'),(1340,295,2,'2006-02-15 05:09:17'),(1341,295,2,'2006-02-15 05:09:17'),(1342,295,2,'2006-02-15 05:09:17'),(1343,296,1,'2006-02-15 05:09:17'),(1344,296,1,'2006-02-15 05:09:17'),(1345,296,1,'2006-02-15 05:09:17'),(1346,296,1,'2006-02-15 05:09:17'),(1347,297,2,'2006-02-15 05:09:17'),(1348,297,2,'2006-02-15 05:09:17'),(1349,298,1,'2006-02-15 05:09:17'),(1350,298,1,'2006-02-15 05:09:17'),(1351,298,2,'2006-02-15 05:09:17'),(1352,298,2,'2006-02-15 05:09:17'),(1353,298,2,'2006-02-15 05:09:17'),(1354,299,1,'2006-02-15 05:09:17'),(1355,299,1,'2006-02-15 05:09:17'),(1356,299,1,'2006-02-15 05:09:17'),(1357,299,1,'2006-02-15 05:09:17'),(1358,300,1,'2006-02-15 05:09:17'),(1359,300,1,'2006-02-15 05:09:17'),(1360,300,2,'2006-02-15 05:09:17'),(1361,300,2,'2006-02-15 05:09:17'),(1362,300,2,'2006-02-15 05:09:17'),(1363,300,2,'2006-02-15 05:09:17'),(1364,301,1,'2006-02-15 05:09:17'),(1365,301,1,'2006-02-15 05:09:17'),(1366,301,1,'2006-02-15 05:09:17'),(1367,301,1,'2006-02-15 05:09:17'),(1368,301,2,'2006-02-15 05:09:17'),(1369,301,2,'2006-02-15 05:09:17'),(1370,301,2,'2006-02-15 05:09:17'),(1371,301,2,'2006-02-15 05:09:17'),(1372,302,1,'2006-02-15 05:09:17'),(1373,302,1,'2006-02-15 05:09:17'),(1374,302,2,'2006-02-15 05:09:17'),(1375,302,2,'2006-02-15 05:09:17'),(1376,302,2,'2006-02-15 05:09:17'),(1377,302,2,'2006-02-15 05:09:17'),(1378,303,1,'2006-02-15 05:09:17'),(1379,303,1,'2006-02-15 05:09:17'),(1380,303,1,'2006-02-15 05:09:17'),(1381,303,1,'2006-02-15 05:09:17'),(1382,303,2,'2006-02-15 05:09:17'),(1383,303,2,'2006-02-15 05:09:17'),(1384,304,1,'2006-02-15 05:09:17'),(1385,304,1,'2006-02-15 05:09:17'),(1386,304,1,'2006-02-15 05:09:17'),(1387,304,1,'2006-02-15 05:09:17'),(1388,304,2,'2006-02-15 05:09:17'),(1389,304,2,'2006-02-15 05:09:17'),(1390,305,1,'2006-02-15 05:09:17'),(1391,305,1,'2006-02-15 05:09:17'),(1392,305,1,'2006-02-15 05:09:17'),(1393,305,1,'2006-02-15 05:09:17'),(1394,305,2,'2006-02-15 05:09:17'),(1395,305,2,'2006-02-15 05:09:17'),(1396,305,2,'2006-02-15 05:09:17'),(1397,306,1,'2006-02-15 05:09:17'),(1398,306,1,'2006-02-15 05:09:17'),(1399,306,1,'2006-02-15 05:09:17'),(1400,307,1,'2006-02-15 05:09:17'),(1401,307,1,'2006-02-15 05:09:17'),(1402,307,1,'2006-02-15 05:09:17'),(1403,307,2,'2006-02-15 05:09:17'),(1404,307,2,'2006-02-15 05:09:17'),(1405,307,2,'2006-02-15 05:09:17'),(1406,308,1,'2006-02-15 05:09:17'),(1407,308,1,'2006-02-15 05:09:17'),(1408,308,2,'2006-02-15 05:09:17'),(1409,308,2,'2006-02-15 05:09:17'),(1410,309,1,'2006-02-15 05:09:17'),(1411,309,1,'2006-02-15 05:09:17'),(1412,309,2,'2006-02-15 05:09:17'),(1413,309,2,'2006-02-15 05:09:17'),(1414,309,2,'2006-02-15 05:09:17'),(1415,309,2,'2006-02-15 05:09:17'),(1416,310,1,'2006-02-15 05:09:17'),(1417,310,1,'2006-02-15 05:09:17'),(1418,311,1,'2006-02-15 05:09:17'),(1419,311,1,'2006-02-15 05:09:17'),(1420,311,1,'2006-02-15 05:09:17'),(1421,311,2,'2006-02-15 05:09:17'),(1422,311,2,'2006-02-15 05:09:17'),(1423,311,2,'2006-02-15 05:09:17'),(1424,311,2,'2006-02-15 05:09:17'),(1425,312,2,'2006-02-15 05:09:17'),(1426,312,2,'2006-02-15 05:09:17'),(1427,312,2,'2006-02-15 05:09:17'),(1428,313,1,'2006-02-15 05:09:17'),(1429,313,1,'2006-02-15 05:09:17'),(1430,313,1,'2006-02-15 05:09:17'),(1431,313,1,'2006-02-15 05:09:17'),(1432,313,2,'2006-02-15 05:09:17'),(1433,313,2,'2006-02-15 05:09:17'),(1434,314,1,'2006-02-15 05:09:17'),(1435,314,1,'2006-02-15 05:09:17'),(1436,314,2,'2006-02-15 05:09:17'),(1437,314,2,'2006-02-15 05:09:17'),(1438,314,2,'2006-02-15 05:09:17'),(1439,314,2,'2006-02-15 05:09:17'),(1440,315,2,'2006-02-15 05:09:17'),(1441,315,2,'2006-02-15 05:09:17'),(1442,315,2,'2006-02-15 05:09:17'),(1443,316,2,'2006-02-15 05:09:17'),(1444,316,2,'2006-02-15 05:09:17'),(1445,317,1,'2006-02-15 05:09:17'),(1446,317,1,'2006-02-15 05:09:17'),(1447,317,1,'2006-02-15 05:09:17'),(1448,317,1,'2006-02-15 05:09:17'),(1449,317,2,'2006-02-15 05:09:17'),(1450,317,2,'2006-02-15 05:09:17'),(1451,317,2,'2006-02-15 05:09:17'),(1452,319,1,'2006-02-15 05:09:17'),(1453,319,1,'2006-02-15 05:09:17'),(1454,319,1,'2006-02-15 05:09:17'),(1455,319,2,'2006-02-15 05:09:17'),(1456,319,2,'2006-02-15 05:09:17'),(1457,319,2,'2006-02-15 05:09:17'),(1458,319,2,'2006-02-15 05:09:17'),(1459,320,1,'2006-02-15 05:09:17'),(1460,320,1,'2006-02-15 05:09:17'),(1461,320,1,'2006-02-15 05:09:17'),(1462,320,2,'2006-02-15 05:09:17'),(1463,320,2,'2006-02-15 05:09:17'),(1464,320,2,'2006-02-15 05:09:17'),(1465,320,2,'2006-02-15 05:09:17'),(1466,321,1,'2006-02-15 05:09:17'),(1467,321,1,'2006-02-15 05:09:17'),(1468,321,1,'2006-02-15 05:09:17'),(1469,321,1,'2006-02-15 05:09:17'),(1470,322,1,'2006-02-15 05:09:17'),(1471,322,1,'2006-02-15 05:09:17'),(1472,322,1,'2006-02-15 05:09:17'),(1473,322,1,'2006-02-15 05:09:17'),(1474,322,2,'2006-02-15 05:09:17'),(1475,322,2,'2006-02-15 05:09:17'),(1476,323,2,'2006-02-15 05:09:17'),(1477,323,2,'2006-02-15 05:09:17'),(1478,323,2,'2006-02-15 05:09:17'),(1479,323,2,'2006-02-15 05:09:17'),(1480,324,1,'2006-02-15 05:09:17'),(1481,324,1,'2006-02-15 05:09:17'),(1482,324,1,'2006-02-15 05:09:17'),(1483,324,2,'2006-02-15 05:09:17'),(1484,324,2,'2006-02-15 05:09:17'),(1485,326,1,'2006-02-15 05:09:17'),(1486,326,1,'2006-02-15 05:09:17'),(1487,326,2,'2006-02-15 05:09:17'),(1488,326,2,'2006-02-15 05:09:17'),(1489,326,2,'2006-02-15 05:09:17'),(1490,326,2,'2006-02-15 05:09:17'),(1491,327,1,'2006-02-15 05:09:17'),(1492,327,1,'2006-02-15 05:09:17'),(1493,327,1,'2006-02-15 05:09:17'),(1494,327,1,'2006-02-15 05:09:17'),(1495,327,2,'2006-02-15 05:09:17'),(1496,327,2,'2006-02-15 05:09:17'),(1497,328,2,'2006-02-15 05:09:17'),(1498,328,2,'2006-02-15 05:09:17'),(1499,328,2,'2006-02-15 05:09:17'),(1500,328,2,'2006-02-15 05:09:17'),(1501,329,1,'2006-02-15 05:09:17'),(1502,329,1,'2006-02-15 05:09:17'),(1503,329,1,'2006-02-15 05:09:17'),(1504,329,2,'2006-02-15 05:09:17'),(1505,329,2,'2006-02-15 05:09:17'),(1506,329,2,'2006-02-15 05:09:17'),(1507,330,1,'2006-02-15 05:09:17'),(1508,330,1,'2006-02-15 05:09:17'),(1509,330,1,'2006-02-15 05:09:17'),(1510,330,1,'2006-02-15 05:09:17'),(1511,330,2,'2006-02-15 05:09:17'),(1512,330,2,'2006-02-15 05:09:17'),(1513,330,2,'2006-02-15 05:09:17'),(1514,331,1,'2006-02-15 05:09:17'),(1515,331,1,'2006-02-15 05:09:17'),(1516,331,1,'2006-02-15 05:09:17'),(1517,331,1,'2006-02-15 05:09:17'),(1518,331,2,'2006-02-15 05:09:17'),(1519,331,2,'2006-02-15 05:09:17'),(1520,331,2,'2006-02-15 05:09:17'),(1521,331,2,'2006-02-15 05:09:17'),(1522,333,1,'2006-02-15 05:09:17'),(1523,333,1,'2006-02-15 05:09:17'),(1524,333,2,'2006-02-15 05:09:17'),(1525,333,2,'2006-02-15 05:09:17'),(1526,334,1,'2006-02-15 05:09:17'),(1527,334,1,'2006-02-15 05:09:17'),(1528,334,2,'2006-02-15 05:09:17'),(1529,334,2,'2006-02-15 05:09:17'),(1530,334,2,'2006-02-15 05:09:17'),(1531,334,2,'2006-02-15 05:09:17'),(1532,335,1,'2006-02-15 05:09:17'),(1533,335,1,'2006-02-15 05:09:17'),(1534,336,1,'2006-02-15 05:09:17'),(1535,336,1,'2006-02-15 05:09:17'),(1536,336,1,'2006-02-15 05:09:17'),(1537,336,2,'2006-02-15 05:09:17'),(1538,336,2,'2006-02-15 05:09:17'),(1539,337,1,'2006-02-15 05:09:17'),(1540,337,1,'2006-02-15 05:09:17'),(1541,337,2,'2006-02-15 05:09:17'),(1542,337,2,'2006-02-15 05:09:17'),(1543,338,2,'2006-02-15 05:09:17'),(1544,338,2,'2006-02-15 05:09:17'),(1545,338,2,'2006-02-15 05:09:17'),(1546,339,2,'2006-02-15 05:09:17'),(1547,339,2,'2006-02-15 05:09:17'),(1548,339,2,'2006-02-15 05:09:17'),(1549,340,1,'2006-02-15 05:09:17'),(1550,340,1,'2006-02-15 05:09:17'),(1551,341,1,'2006-02-15 05:09:17'),(1552,341,1,'2006-02-15 05:09:17'),(1553,341,1,'2006-02-15 05:09:17'),(1554,341,1,'2006-02-15 05:09:17'),(1555,341,2,'2006-02-15 05:09:17'),(1556,341,2,'2006-02-15 05:09:17'),(1557,341,2,'2006-02-15 05:09:17'),(1558,341,2,'2006-02-15 05:09:17'),(1559,342,1,'2006-02-15 05:09:17'),(1560,342,1,'2006-02-15 05:09:17'),(1561,342,1,'2006-02-15 05:09:17'),(1562,342,1,'2006-02-15 05:09:17'),(1563,343,1,'2006-02-15 05:09:17'),(1564,343,1,'2006-02-15 05:09:17'),(1565,344,1,'2006-02-15 05:09:17'),(1566,344,1,'2006-02-15 05:09:17'),(1567,344,1,'2006-02-15 05:09:17'),(1568,344,2,'2006-02-15 05:09:17'),(1569,344,2,'2006-02-15 05:09:17'),(1570,345,1,'2006-02-15 05:09:17'),(1571,345,1,'2006-02-15 05:09:17'),(1572,345,1,'2006-02-15 05:09:17'),(1573,345,2,'2006-02-15 05:09:17'),(1574,345,2,'2006-02-15 05:09:17'),(1575,346,1,'2006-02-15 05:09:17'),(1576,346,1,'2006-02-15 05:09:17'),(1577,346,2,'2006-02-15 05:09:17'),(1578,346,2,'2006-02-15 05:09:17'),(1579,346,2,'2006-02-15 05:09:17'),(1580,346,2,'2006-02-15 05:09:17'),(1581,347,1,'2006-02-15 05:09:17'),(1582,347,1,'2006-02-15 05:09:17'),(1583,347,1,'2006-02-15 05:09:17'),(1584,347,1,'2006-02-15 05:09:17'),(1585,348,2,'2006-02-15 05:09:17'),(1586,348,2,'2006-02-15 05:09:17'),(1587,348,2,'2006-02-15 05:09:17'),(1588,348,2,'2006-02-15 05:09:17'),(1589,349,1,'2006-02-15 05:09:17'),(1590,349,1,'2006-02-15 05:09:17'),(1591,349,1,'2006-02-15 05:09:17'),(1592,349,1,'2006-02-15 05:09:17'),(1593,349,2,'2006-02-15 05:09:17'),(1594,349,2,'2006-02-15 05:09:17'),(1595,349,2,'2006-02-15 05:09:17'),(1596,350,1,'2006-02-15 05:09:17'),(1597,350,1,'2006-02-15 05:09:17'),(1598,350,1,'2006-02-15 05:09:17'),(1599,350,1,'2006-02-15 05:09:17'),(1600,350,2,'2006-02-15 05:09:17'),(1601,350,2,'2006-02-15 05:09:17'),(1602,350,2,'2006-02-15 05:09:17'),(1603,350,2,'2006-02-15 05:09:17'),(1604,351,1,'2006-02-15 05:09:17'),(1605,351,1,'2006-02-15 05:09:17'),(1606,351,1,'2006-02-15 05:09:17'),(1607,351,2,'2006-02-15 05:09:17'),(1608,351,2,'2006-02-15 05:09:17'),(1609,351,2,'2006-02-15 05:09:17'),(1610,352,2,'2006-02-15 05:09:17'),(1611,352,2,'2006-02-15 05:09:17'),(1612,352,2,'2006-02-15 05:09:17'),(1613,352,2,'2006-02-15 05:09:17'),(1614,353,1,'2006-02-15 05:09:17'),(1615,353,1,'2006-02-15 05:09:17'),(1616,353,2,'2006-02-15 05:09:17'),(1617,353,2,'2006-02-15 05:09:17'),(1618,353,2,'2006-02-15 05:09:17'),(1619,353,2,'2006-02-15 05:09:17'),(1620,354,1,'2006-02-15 05:09:17'),(1621,354,1,'2006-02-15 05:09:17'),(1622,354,1,'2006-02-15 05:09:17'),(1623,354,2,'2006-02-15 05:09:17'),(1624,354,2,'2006-02-15 05:09:17'),(1625,355,2,'2006-02-15 05:09:17'),(1626,355,2,'2006-02-15 05:09:17'),(1627,356,1,'2006-02-15 05:09:17'),(1628,356,1,'2006-02-15 05:09:17'),(1629,356,1,'2006-02-15 05:09:17'),(1630,356,1,'2006-02-15 05:09:17'),(1631,356,2,'2006-02-15 05:09:17'),(1632,356,2,'2006-02-15 05:09:17'),(1633,356,2,'2006-02-15 05:09:17'),(1634,356,2,'2006-02-15 05:09:17'),(1635,357,2,'2006-02-15 05:09:17'),(1636,357,2,'2006-02-15 05:09:17'),(1637,357,2,'2006-02-15 05:09:17'),(1638,357,2,'2006-02-15 05:09:17'),(1639,358,1,'2006-02-15 05:09:17'),(1640,358,1,'2006-02-15 05:09:17'),(1641,358,1,'2006-02-15 05:09:17'),(1642,358,1,'2006-02-15 05:09:17'),(1643,358,2,'2006-02-15 05:09:17'),(1644,358,2,'2006-02-15 05:09:17'),(1645,358,2,'2006-02-15 05:09:17'),(1646,358,2,'2006-02-15 05:09:17'),(1647,360,1,'2006-02-15 05:09:17'),(1648,360,1,'2006-02-15 05:09:17'),(1649,360,1,'2006-02-15 05:09:17'),(1650,360,1,'2006-02-15 05:09:17'),(1651,361,1,'2006-02-15 05:09:17'),(1652,361,1,'2006-02-15 05:09:17'),(1653,361,1,'2006-02-15 05:09:17'),(1654,361,1,'2006-02-15 05:09:17'),(1655,361,2,'2006-02-15 05:09:17'),(1656,361,2,'2006-02-15 05:09:17'),(1657,361,2,'2006-02-15 05:09:17'),(1658,361,2,'2006-02-15 05:09:17'),(1659,362,1,'2006-02-15 05:09:17'),(1660,362,1,'2006-02-15 05:09:17'),(1661,363,1,'2006-02-15 05:09:17'),(1662,363,1,'2006-02-15 05:09:17'),(1663,363,1,'2006-02-15 05:09:17'),(1664,363,2,'2006-02-15 05:09:17'),(1665,363,2,'2006-02-15 05:09:17'),(1666,363,2,'2006-02-15 05:09:17'),(1667,364,1,'2006-02-15 05:09:17'),(1668,364,1,'2006-02-15 05:09:17'),(1669,364,1,'2006-02-15 05:09:17'),(1670,365,1,'2006-02-15 05:09:17'),(1671,365,1,'2006-02-15 05:09:17'),(1672,365,2,'2006-02-15 05:09:17'),(1673,365,2,'2006-02-15 05:09:17'),(1674,366,1,'2006-02-15 05:09:17'),(1675,366,1,'2006-02-15 05:09:17'),(1676,366,1,'2006-02-15 05:09:17'),(1677,366,1,'2006-02-15 05:09:17'),(1678,366,2,'2006-02-15 05:09:17'),(1679,366,2,'2006-02-15 05:09:17'),(1680,366,2,'2006-02-15 05:09:17'),(1681,367,1,'2006-02-15 05:09:17'),(1682,367,1,'2006-02-15 05:09:17'),(1683,367,1,'2006-02-15 05:09:17'),(1684,367,1,'2006-02-15 05:09:17'),(1685,367,2,'2006-02-15 05:09:17'),(1686,367,2,'2006-02-15 05:09:17'),(1687,367,2,'2006-02-15 05:09:17'),(1688,368,1,'2006-02-15 05:09:17'),(1689,368,1,'2006-02-15 05:09:17'),(1690,369,1,'2006-02-15 05:09:17'),(1691,369,1,'2006-02-15 05:09:17'),(1692,369,1,'2006-02-15 05:09:17'),(1693,369,1,'2006-02-15 05:09:17'),(1694,369,2,'2006-02-15 05:09:17'),(1695,369,2,'2006-02-15 05:09:17'),(1696,369,2,'2006-02-15 05:09:17'),(1697,369,2,'2006-02-15 05:09:17'),(1698,370,1,'2006-02-15 05:09:17'),(1699,370,1,'2006-02-15 05:09:17'),(1700,370,1,'2006-02-15 05:09:17'),(1701,370,2,'2006-02-15 05:09:17'),(1702,370,2,'2006-02-15 05:09:17'),(1703,371,1,'2006-02-15 05:09:17'),(1704,371,1,'2006-02-15 05:09:17'),(1705,371,1,'2006-02-15 05:09:17'),(1706,372,1,'2006-02-15 05:09:17'),(1707,372,1,'2006-02-15 05:09:17'),(1708,373,1,'2006-02-15 05:09:17'),(1709,373,1,'2006-02-15 05:09:17'),(1710,373,1,'2006-02-15 05:09:17'),(1711,373,2,'2006-02-15 05:09:17'),(1712,373,2,'2006-02-15 05:09:17'),(1713,374,1,'2006-02-15 05:09:17'),(1714,374,1,'2006-02-15 05:09:17'),(1715,374,1,'2006-02-15 05:09:17'),(1716,374,2,'2006-02-15 05:09:17'),(1717,374,2,'2006-02-15 05:09:17'),(1718,374,2,'2006-02-15 05:09:17'),(1719,374,2,'2006-02-15 05:09:17'),(1720,375,1,'2006-02-15 05:09:17'),(1721,375,1,'2006-02-15 05:09:17'),(1722,376,1,'2006-02-15 05:09:17'),(1723,376,1,'2006-02-15 05:09:17'),(1724,376,1,'2006-02-15 05:09:17'),(1725,376,1,'2006-02-15 05:09:17'),(1726,376,2,'2006-02-15 05:09:17'),(1727,376,2,'2006-02-15 05:09:17'),(1728,376,2,'2006-02-15 05:09:17'),(1729,377,1,'2006-02-15 05:09:17'),(1730,377,1,'2006-02-15 05:09:17'),(1731,377,1,'2006-02-15 05:09:17'),(1732,377,2,'2006-02-15 05:09:17'),(1733,377,2,'2006-02-15 05:09:17'),(1734,377,2,'2006-02-15 05:09:17'),(1735,378,1,'2006-02-15 05:09:17'),(1736,378,1,'2006-02-15 05:09:17'),(1737,378,1,'2006-02-15 05:09:17'),(1738,378,1,'2006-02-15 05:09:17'),(1739,378,2,'2006-02-15 05:09:17'),(1740,378,2,'2006-02-15 05:09:17'),(1741,378,2,'2006-02-15 05:09:17'),(1742,378,2,'2006-02-15 05:09:17'),(1743,379,2,'2006-02-15 05:09:17'),(1744,379,2,'2006-02-15 05:09:17'),(1745,379,2,'2006-02-15 05:09:17'),(1746,379,2,'2006-02-15 05:09:17'),(1747,380,1,'2006-02-15 05:09:17'),(1748,380,1,'2006-02-15 05:09:17'),(1749,380,2,'2006-02-15 05:09:17'),(1750,380,2,'2006-02-15 05:09:17'),(1751,380,2,'2006-02-15 05:09:17'),(1752,381,1,'2006-02-15 05:09:17'),(1753,381,1,'2006-02-15 05:09:17'),(1754,381,2,'2006-02-15 05:09:17'),(1755,381,2,'2006-02-15 05:09:17'),(1756,381,2,'2006-02-15 05:09:17'),(1757,382,1,'2006-02-15 05:09:17'),(1758,382,1,'2006-02-15 05:09:17'),(1759,382,1,'2006-02-15 05:09:17'),(1760,382,1,'2006-02-15 05:09:17'),(1761,382,2,'2006-02-15 05:09:17'),(1762,382,2,'2006-02-15 05:09:17'),(1763,382,2,'2006-02-15 05:09:17'),(1764,382,2,'2006-02-15 05:09:17'),(1765,383,1,'2006-02-15 05:09:17'),(1766,383,1,'2006-02-15 05:09:17'),(1767,383,1,'2006-02-15 05:09:17'),(1768,383,2,'2006-02-15 05:09:17'),(1769,383,2,'2006-02-15 05:09:17'),(1770,384,2,'2006-02-15 05:09:17'),(1771,384,2,'2006-02-15 05:09:17'),(1772,384,2,'2006-02-15 05:09:17'),(1773,385,1,'2006-02-15 05:09:17'),(1774,385,1,'2006-02-15 05:09:17'),(1775,385,2,'2006-02-15 05:09:17'),(1776,385,2,'2006-02-15 05:09:17'),(1777,385,2,'2006-02-15 05:09:17'),(1778,387,1,'2006-02-15 05:09:17'),(1779,387,1,'2006-02-15 05:09:17'),(1780,387,1,'2006-02-15 05:09:17'),(1781,387,2,'2006-02-15 05:09:17'),(1782,387,2,'2006-02-15 05:09:17'),(1783,387,2,'2006-02-15 05:09:17'),(1784,388,1,'2006-02-15 05:09:17'),(1785,388,1,'2006-02-15 05:09:17'),(1786,388,1,'2006-02-15 05:09:17'),(1787,388,2,'2006-02-15 05:09:17'),(1788,388,2,'2006-02-15 05:09:17'),(1789,388,2,'2006-02-15 05:09:17'),(1790,389,1,'2006-02-15 05:09:17'),(1791,389,1,'2006-02-15 05:09:17'),(1792,389,2,'2006-02-15 05:09:17'),(1793,389,2,'2006-02-15 05:09:17'),(1794,390,1,'2006-02-15 05:09:17'),(1795,390,1,'2006-02-15 05:09:17'),(1796,390,1,'2006-02-15 05:09:17'),(1797,391,1,'2006-02-15 05:09:17'),(1798,391,1,'2006-02-15 05:09:17'),(1799,391,1,'2006-02-15 05:09:17'),(1800,391,1,'2006-02-15 05:09:17'),(1801,391,2,'2006-02-15 05:09:17'),(1802,391,2,'2006-02-15 05:09:17'),(1803,391,2,'2006-02-15 05:09:17'),(1804,392,1,'2006-02-15 05:09:17'),(1805,392,1,'2006-02-15 05:09:17'),(1806,392,1,'2006-02-15 05:09:17'),(1807,392,1,'2006-02-15 05:09:17'),(1808,392,2,'2006-02-15 05:09:17'),(1809,392,2,'2006-02-15 05:09:17'),(1810,393,1,'2006-02-15 05:09:17'),(1811,393,1,'2006-02-15 05:09:17'),(1812,394,1,'2006-02-15 05:09:17'),(1813,394,1,'2006-02-15 05:09:17'),(1814,394,1,'2006-02-15 05:09:17'),(1815,394,1,'2006-02-15 05:09:17'),(1816,395,1,'2006-02-15 05:09:17'),(1817,395,1,'2006-02-15 05:09:17'),(1818,395,1,'2006-02-15 05:09:17'),(1819,395,2,'2006-02-15 05:09:17'),(1820,395,2,'2006-02-15 05:09:17'),(1821,395,2,'2006-02-15 05:09:17'),(1822,396,2,'2006-02-15 05:09:17'),(1823,396,2,'2006-02-15 05:09:17'),(1824,396,2,'2006-02-15 05:09:17'),(1825,396,2,'2006-02-15 05:09:17'),(1826,397,1,'2006-02-15 05:09:17'),(1827,397,1,'2006-02-15 05:09:17'),(1828,397,1,'2006-02-15 05:09:17'),(1829,397,2,'2006-02-15 05:09:17'),(1830,397,2,'2006-02-15 05:09:17'),(1831,397,2,'2006-02-15 05:09:17'),(1832,397,2,'2006-02-15 05:09:17'),(1833,398,2,'2006-02-15 05:09:17'),(1834,398,2,'2006-02-15 05:09:17'),(1835,398,2,'2006-02-15 05:09:17'),(1836,398,2,'2006-02-15 05:09:17'),(1837,399,2,'2006-02-15 05:09:17'),(1838,399,2,'2006-02-15 05:09:17'),(1839,400,1,'2006-02-15 05:09:17'),(1840,400,1,'2006-02-15 05:09:17'),(1841,401,1,'2006-02-15 05:09:17'),(1842,401,1,'2006-02-15 05:09:17'),(1843,402,1,'2006-02-15 05:09:17'),(1844,402,1,'2006-02-15 05:09:17'),(1845,402,1,'2006-02-15 05:09:17'),(1846,402,2,'2006-02-15 05:09:17'),(1847,402,2,'2006-02-15 05:09:17'),(1848,402,2,'2006-02-15 05:09:17'),(1849,403,1,'2006-02-15 05:09:17'),(1850,403,1,'2006-02-15 05:09:17'),(1851,403,1,'2006-02-15 05:09:17'),(1852,403,1,'2006-02-15 05:09:17'),(1853,403,2,'2006-02-15 05:09:17'),(1854,403,2,'2006-02-15 05:09:17'),(1855,403,2,'2006-02-15 05:09:17'),(1856,403,2,'2006-02-15 05:09:17'),(1857,405,2,'2006-02-15 05:09:17'),(1858,405,2,'2006-02-15 05:09:17'),(1859,406,1,'2006-02-15 05:09:17'),(1860,406,1,'2006-02-15 05:09:17'),(1861,406,2,'2006-02-15 05:09:17'),(1862,406,2,'2006-02-15 05:09:17'),(1863,406,2,'2006-02-15 05:09:17'),(1864,406,2,'2006-02-15 05:09:17'),(1865,407,1,'2006-02-15 05:09:17'),(1866,407,1,'2006-02-15 05:09:17'),(1867,408,1,'2006-02-15 05:09:17'),(1868,408,1,'2006-02-15 05:09:17'),(1869,408,1,'2006-02-15 05:09:17'),(1870,408,1,'2006-02-15 05:09:17'),(1871,408,2,'2006-02-15 05:09:17'),(1872,408,2,'2006-02-15 05:09:17'),(1873,408,2,'2006-02-15 05:09:17'),(1874,409,1,'2006-02-15 05:09:17'),(1875,409,1,'2006-02-15 05:09:17'),(1876,409,1,'2006-02-15 05:09:17'),(1877,409,1,'2006-02-15 05:09:17'),(1878,409,2,'2006-02-15 05:09:17'),(1879,409,2,'2006-02-15 05:09:17'),(1880,409,2,'2006-02-15 05:09:17'),(1881,410,1,'2006-02-15 05:09:17'),(1882,410,1,'2006-02-15 05:09:17'),(1883,410,1,'2006-02-15 05:09:17'),(1884,410,2,'2006-02-15 05:09:17'),(1885,410,2,'2006-02-15 05:09:17'),(1886,411,1,'2006-02-15 05:09:17'),(1887,411,1,'2006-02-15 05:09:17'),(1888,412,1,'2006-02-15 05:09:17'),(1889,412,1,'2006-02-15 05:09:17'),(1890,412,1,'2006-02-15 05:09:17'),(1891,412,1,'2006-02-15 05:09:17'),(1892,412,2,'2006-02-15 05:09:17'),(1893,412,2,'2006-02-15 05:09:17'),(1894,412,2,'2006-02-15 05:09:17'),(1895,412,2,'2006-02-15 05:09:17'),(1896,413,1,'2006-02-15 05:09:17'),(1897,413,1,'2006-02-15 05:09:17'),(1898,413,1,'2006-02-15 05:09:17'),(1899,414,1,'2006-02-15 05:09:17'),(1900,414,1,'2006-02-15 05:09:17'),(1901,414,1,'2006-02-15 05:09:17'),(1902,414,2,'2006-02-15 05:09:17'),(1903,414,2,'2006-02-15 05:09:17'),(1904,414,2,'2006-02-15 05:09:17'),(1905,415,1,'2006-02-15 05:09:17'),(1906,415,1,'2006-02-15 05:09:17'),(1907,415,1,'2006-02-15 05:09:17'),(1908,415,2,'2006-02-15 05:09:17'),(1909,415,2,'2006-02-15 05:09:17'),(1910,415,2,'2006-02-15 05:09:17'),(1911,416,1,'2006-02-15 05:09:17'),(1912,416,1,'2006-02-15 05:09:17'),(1913,416,2,'2006-02-15 05:09:17'),(1914,416,2,'2006-02-15 05:09:17'),(1915,416,2,'2006-02-15 05:09:17'),(1916,416,2,'2006-02-15 05:09:17'),(1917,417,1,'2006-02-15 05:09:17'),(1918,417,1,'2006-02-15 05:09:17'),(1919,417,1,'2006-02-15 05:09:17'),(1920,417,1,'2006-02-15 05:09:17'),(1921,417,2,'2006-02-15 05:09:17'),(1922,417,2,'2006-02-15 05:09:17'),(1923,418,1,'2006-02-15 05:09:17'),(1924,418,1,'2006-02-15 05:09:17'),(1925,418,1,'2006-02-15 05:09:17'),(1926,418,1,'2006-02-15 05:09:17'),(1927,418,2,'2006-02-15 05:09:17'),(1928,418,2,'2006-02-15 05:09:17'),(1929,418,2,'2006-02-15 05:09:17'),(1930,418,2,'2006-02-15 05:09:17'),(1931,420,1,'2006-02-15 05:09:17'),(1932,420,1,'2006-02-15 05:09:17'),(1933,420,2,'2006-02-15 05:09:17'),(1934,420,2,'2006-02-15 05:09:17'),(1935,420,2,'2006-02-15 05:09:17'),(1936,421,2,'2006-02-15 05:09:17'),(1937,421,2,'2006-02-15 05:09:17'),(1938,421,2,'2006-02-15 05:09:17'),(1939,421,2,'2006-02-15 05:09:17'),(1940,422,2,'2006-02-15 05:09:17'),(1941,422,2,'2006-02-15 05:09:17'),(1942,423,1,'2006-02-15 05:09:17'),(1943,423,1,'2006-02-15 05:09:17'),(1944,423,2,'2006-02-15 05:09:17'),(1945,423,2,'2006-02-15 05:09:17'),(1946,424,1,'2006-02-15 05:09:17'),(1947,424,1,'2006-02-15 05:09:17'),(1948,424,1,'2006-02-15 05:09:17'),(1949,424,2,'2006-02-15 05:09:17'),(1950,424,2,'2006-02-15 05:09:17'),(1951,425,2,'2006-02-15 05:09:17'),(1952,425,2,'2006-02-15 05:09:17'),(1953,426,2,'2006-02-15 05:09:17'),(1954,426,2,'2006-02-15 05:09:17'),(1955,426,2,'2006-02-15 05:09:17'),(1956,427,1,'2006-02-15 05:09:17'),(1957,427,1,'2006-02-15 05:09:17'),(1958,427,1,'2006-02-15 05:09:17'),(1959,427,1,'2006-02-15 05:09:17'),(1960,428,1,'2006-02-15 05:09:17'),(1961,428,1,'2006-02-15 05:09:17'),(1962,428,1,'2006-02-15 05:09:17'),(1963,428,1,'2006-02-15 05:09:17'),(1964,428,2,'2006-02-15 05:09:17'),(1965,428,2,'2006-02-15 05:09:17'),(1966,429,1,'2006-02-15 05:09:17'),(1967,429,1,'2006-02-15 05:09:17'),(1968,429,2,'2006-02-15 05:09:17'),(1969,429,2,'2006-02-15 05:09:17'),(1970,429,2,'2006-02-15 05:09:17'),(1971,429,2,'2006-02-15 05:09:17'),(1972,430,2,'2006-02-15 05:09:17'),(1973,430,2,'2006-02-15 05:09:17'),(1974,430,2,'2006-02-15 05:09:17'),(1975,430,2,'2006-02-15 05:09:17'),(1976,431,2,'2006-02-15 05:09:17'),(1977,431,2,'2006-02-15 05:09:17'),(1978,431,2,'2006-02-15 05:09:17'),(1979,432,1,'2006-02-15 05:09:17'),(1980,432,1,'2006-02-15 05:09:17'),(1981,432,1,'2006-02-15 05:09:17'),(1982,432,2,'2006-02-15 05:09:17'),(1983,432,2,'2006-02-15 05:09:17'),(1984,433,1,'2006-02-15 05:09:17'),(1985,433,1,'2006-02-15 05:09:17'),(1986,433,1,'2006-02-15 05:09:17'),(1987,433,1,'2006-02-15 05:09:17'),(1988,433,2,'2006-02-15 05:09:17'),(1989,433,2,'2006-02-15 05:09:17'),(1990,434,1,'2006-02-15 05:09:17'),(1991,434,1,'2006-02-15 05:09:17'),(1992,434,1,'2006-02-15 05:09:17'),(1993,434,1,'2006-02-15 05:09:17'),(1994,434,2,'2006-02-15 05:09:17'),(1995,434,2,'2006-02-15 05:09:17'),(1996,434,2,'2006-02-15 05:09:17'),(1997,434,2,'2006-02-15 05:09:17'),(1998,435,1,'2006-02-15 05:09:17'),(1999,435,1,'2006-02-15 05:09:17'),(2000,436,1,'2006-02-15 05:09:17'),(2001,436,1,'2006-02-15 05:09:17'),(2002,436,1,'2006-02-15 05:09:17'),(2003,436,2,'2006-02-15 05:09:17'),(2004,436,2,'2006-02-15 05:09:17'),(2005,436,2,'2006-02-15 05:09:17'),(2006,437,1,'2006-02-15 05:09:17'),(2007,437,1,'2006-02-15 05:09:17'),(2008,437,2,'2006-02-15 05:09:17'),(2009,437,2,'2006-02-15 05:09:17'),(2010,437,2,'2006-02-15 05:09:17'),(2011,437,2,'2006-02-15 05:09:17'),(2012,438,1,'2006-02-15 05:09:17'),(2013,438,1,'2006-02-15 05:09:17'),(2014,438,2,'2006-02-15 05:09:17'),(2015,438,2,'2006-02-15 05:09:17'),(2016,438,2,'2006-02-15 05:09:17'),(2017,439,1,'2006-02-15 05:09:17'),(2018,439,1,'2006-02-15 05:09:17'),(2019,439,1,'2006-02-15 05:09:17'),(2020,439,1,'2006-02-15 05:09:17'),(2021,439,2,'2006-02-15 05:09:17'),(2022,439,2,'2006-02-15 05:09:17'),(2023,440,1,'2006-02-15 05:09:17'),(2024,440,1,'2006-02-15 05:09:17'),(2025,440,2,'2006-02-15 05:09:17'),(2026,440,2,'2006-02-15 05:09:17'),(2027,441,1,'2006-02-15 05:09:17'),(2028,441,1,'2006-02-15 05:09:17'),(2029,442,1,'2006-02-15 05:09:17'),(2030,442,1,'2006-02-15 05:09:17'),(2031,442,1,'2006-02-15 05:09:17'),(2032,443,1,'2006-02-15 05:09:17'),(2033,443,1,'2006-02-15 05:09:17'),(2034,443,1,'2006-02-15 05:09:17'),(2035,443,2,'2006-02-15 05:09:17'),(2036,443,2,'2006-02-15 05:09:17'),(2037,443,2,'2006-02-15 05:09:17'),(2038,443,2,'2006-02-15 05:09:17'),(2039,444,1,'2006-02-15 05:09:17'),(2040,444,1,'2006-02-15 05:09:17'),(2041,444,1,'2006-02-15 05:09:17'),(2042,444,1,'2006-02-15 05:09:17'),(2043,444,2,'2006-02-15 05:09:17'),(2044,444,2,'2006-02-15 05:09:17'),(2045,444,2,'2006-02-15 05:09:17'),(2046,444,2,'2006-02-15 05:09:17'),(2047,445,1,'2006-02-15 05:09:17'),(2048,445,1,'2006-02-15 05:09:17'),(2049,445,1,'2006-02-15 05:09:17'),(2050,445,2,'2006-02-15 05:09:17'),(2051,445,2,'2006-02-15 05:09:17'),(2052,445,2,'2006-02-15 05:09:17'),(2053,446,1,'2006-02-15 05:09:17'),(2054,446,1,'2006-02-15 05:09:17'),(2055,446,2,'2006-02-15 05:09:17'),(2056,446,2,'2006-02-15 05:09:17'),(2057,447,1,'2006-02-15 05:09:17'),(2058,447,1,'2006-02-15 05:09:17'),(2059,447,1,'2006-02-15 05:09:17'),(2060,447,1,'2006-02-15 05:09:17'),(2061,447,2,'2006-02-15 05:09:17'),(2062,447,2,'2006-02-15 05:09:17'),(2063,447,2,'2006-02-15 05:09:17'),(2064,448,1,'2006-02-15 05:09:17'),(2065,448,1,'2006-02-15 05:09:17'),(2066,448,2,'2006-02-15 05:09:17'),(2067,448,2,'2006-02-15 05:09:17'),(2068,448,2,'2006-02-15 05:09:17'),(2069,449,2,'2006-02-15 05:09:17'),(2070,449,2,'2006-02-15 05:09:17'),(2071,449,2,'2006-02-15 05:09:17'),(2072,449,2,'2006-02-15 05:09:17'),(2073,450,1,'2006-02-15 05:09:17'),(2074,450,1,'2006-02-15 05:09:17'),(2075,450,1,'2006-02-15 05:09:17'),(2076,450,2,'2006-02-15 05:09:17'),(2077,450,2,'2006-02-15 05:09:17'),(2078,450,2,'2006-02-15 05:09:17'),(2079,450,2,'2006-02-15 05:09:17'),(2080,451,1,'2006-02-15 05:09:17'),(2081,451,1,'2006-02-15 05:09:17'),(2082,451,2,'2006-02-15 05:09:17'),(2083,451,2,'2006-02-15 05:09:17'),(2084,451,2,'2006-02-15 05:09:17'),(2085,452,2,'2006-02-15 05:09:17'),(2086,452,2,'2006-02-15 05:09:17'),(2087,452,2,'2006-02-15 05:09:17'),(2088,452,2,'2006-02-15 05:09:17'),(2089,453,1,'2006-02-15 05:09:17'),(2090,453,1,'2006-02-15 05:09:17'),(2091,453,1,'2006-02-15 05:09:17'),(2092,453,2,'2006-02-15 05:09:17'),(2093,453,2,'2006-02-15 05:09:17'),(2094,454,1,'2006-02-15 05:09:17'),(2095,454,1,'2006-02-15 05:09:17'),(2096,455,1,'2006-02-15 05:09:17'),(2097,455,1,'2006-02-15 05:09:17'),(2098,455,1,'2006-02-15 05:09:17'),(2099,455,1,'2006-02-15 05:09:17'),(2100,456,1,'2006-02-15 05:09:17'),(2101,456,1,'2006-02-15 05:09:17'),(2102,456,2,'2006-02-15 05:09:17'),(2103,456,2,'2006-02-15 05:09:17'),(2104,456,2,'2006-02-15 05:09:17'),(2105,456,2,'2006-02-15 05:09:17'),(2106,457,1,'2006-02-15 05:09:17'),(2107,457,1,'2006-02-15 05:09:17'),(2108,457,2,'2006-02-15 05:09:17'),(2109,457,2,'2006-02-15 05:09:17'),(2110,457,2,'2006-02-15 05:09:17'),(2111,457,2,'2006-02-15 05:09:17'),(2112,458,1,'2006-02-15 05:09:17'),(2113,458,1,'2006-02-15 05:09:17'),(2114,458,2,'2006-02-15 05:09:17'),(2115,458,2,'2006-02-15 05:09:17'),(2116,458,2,'2006-02-15 05:09:17'),(2117,458,2,'2006-02-15 05:09:17'),(2118,459,2,'2006-02-15 05:09:17'),(2119,459,2,'2006-02-15 05:09:17'),(2120,460,1,'2006-02-15 05:09:17'),(2121,460,1,'2006-02-15 05:09:17'),(2122,460,1,'2006-02-15 05:09:17'),(2123,460,1,'2006-02-15 05:09:17'),(2124,460,2,'2006-02-15 05:09:17'),(2125,460,2,'2006-02-15 05:09:17'),(2126,460,2,'2006-02-15 05:09:17'),(2127,460,2,'2006-02-15 05:09:17'),(2128,461,1,'2006-02-15 05:09:17'),(2129,461,1,'2006-02-15 05:09:17'),(2130,461,2,'2006-02-15 05:09:17'),(2131,461,2,'2006-02-15 05:09:17'),(2132,461,2,'2006-02-15 05:09:17'),(2133,461,2,'2006-02-15 05:09:17'),(2134,462,1,'2006-02-15 05:09:17'),(2135,462,1,'2006-02-15 05:09:17'),(2136,462,2,'2006-02-15 05:09:17'),(2137,462,2,'2006-02-15 05:09:17'),(2138,462,2,'2006-02-15 05:09:17'),(2139,463,1,'2006-02-15 05:09:17'),(2140,463,1,'2006-02-15 05:09:17'),(2141,463,1,'2006-02-15 05:09:17'),(2142,463,2,'2006-02-15 05:09:17'),(2143,463,2,'2006-02-15 05:09:17'),(2144,464,1,'2006-02-15 05:09:17'),(2145,464,1,'2006-02-15 05:09:17'),(2146,464,1,'2006-02-15 05:09:17'),(2147,464,1,'2006-02-15 05:09:17'),(2148,464,2,'2006-02-15 05:09:17'),(2149,464,2,'2006-02-15 05:09:17'),(2150,464,2,'2006-02-15 05:09:17'),(2151,465,1,'2006-02-15 05:09:17'),(2152,465,1,'2006-02-15 05:09:17'),(2153,465,2,'2006-02-15 05:09:17'),(2154,465,2,'2006-02-15 05:09:17'),(2155,465,2,'2006-02-15 05:09:17'),(2156,466,1,'2006-02-15 05:09:17'),(2157,466,1,'2006-02-15 05:09:17'),(2158,467,1,'2006-02-15 05:09:17'),(2159,467,1,'2006-02-15 05:09:17'),(2160,467,1,'2006-02-15 05:09:17'),(2161,467,1,'2006-02-15 05:09:17'),(2162,467,2,'2006-02-15 05:09:17'),(2163,467,2,'2006-02-15 05:09:17'),(2164,467,2,'2006-02-15 05:09:17'),(2165,468,1,'2006-02-15 05:09:17'),(2166,468,1,'2006-02-15 05:09:17'),(2167,468,1,'2006-02-15 05:09:17'),(2168,468,1,'2006-02-15 05:09:17'),(2169,468,2,'2006-02-15 05:09:17'),(2170,468,2,'2006-02-15 05:09:17'),(2171,468,2,'2006-02-15 05:09:17'),(2172,468,2,'2006-02-15 05:09:17'),(2173,469,2,'2006-02-15 05:09:17'),(2174,469,2,'2006-02-15 05:09:17'),(2175,469,2,'2006-02-15 05:09:17'),(2176,470,1,'2006-02-15 05:09:17'),(2177,470,1,'2006-02-15 05:09:17'),(2178,471,1,'2006-02-15 05:09:17'),(2179,471,1,'2006-02-15 05:09:17'),(2180,471,1,'2006-02-15 05:09:17'),(2181,471,2,'2006-02-15 05:09:17'),(2182,471,2,'2006-02-15 05:09:17'),(2183,471,2,'2006-02-15 05:09:17'),(2184,471,2,'2006-02-15 05:09:17'),(2185,472,2,'2006-02-15 05:09:17'),(2186,472,2,'2006-02-15 05:09:17'),(2187,473,1,'2006-02-15 05:09:17'),(2188,473,1,'2006-02-15 05:09:17'),(2189,473,2,'2006-02-15 05:09:17'),(2190,473,2,'2006-02-15 05:09:17'),(2191,473,2,'2006-02-15 05:09:17'),(2192,474,2,'2006-02-15 05:09:17'),(2193,474,2,'2006-02-15 05:09:17'),(2194,474,2,'2006-02-15 05:09:17'),(2195,474,2,'2006-02-15 05:09:17'),(2196,475,2,'2006-02-15 05:09:17'),(2197,475,2,'2006-02-15 05:09:17'),(2198,476,1,'2006-02-15 05:09:17'),(2199,476,1,'2006-02-15 05:09:17'),(2200,476,1,'2006-02-15 05:09:17'),(2201,476,2,'2006-02-15 05:09:17'),(2202,476,2,'2006-02-15 05:09:17'),(2203,476,2,'2006-02-15 05:09:17'),(2204,476,2,'2006-02-15 05:09:17'),(2205,477,2,'2006-02-15 05:09:17'),(2206,477,2,'2006-02-15 05:09:17'),(2207,477,2,'2006-02-15 05:09:17'),(2208,478,1,'2006-02-15 05:09:17'),(2209,478,1,'2006-02-15 05:09:17'),(2210,478,2,'2006-02-15 05:09:17'),(2211,478,2,'2006-02-15 05:09:17'),(2212,478,2,'2006-02-15 05:09:17'),(2213,479,1,'2006-02-15 05:09:17'),(2214,479,1,'2006-02-15 05:09:17'),(2215,479,2,'2006-02-15 05:09:17'),(2216,479,2,'2006-02-15 05:09:17'),(2217,479,2,'2006-02-15 05:09:17'),(2218,480,1,'2006-02-15 05:09:17'),(2219,480,1,'2006-02-15 05:09:17'),(2220,480,2,'2006-02-15 05:09:17'),(2221,480,2,'2006-02-15 05:09:17'),(2222,481,1,'2006-02-15 05:09:17'),(2223,481,1,'2006-02-15 05:09:17'),(2224,481,1,'2006-02-15 05:09:17'),(2225,481,2,'2006-02-15 05:09:17'),(2226,481,2,'2006-02-15 05:09:17'),(2227,481,2,'2006-02-15 05:09:17'),(2228,482,1,'2006-02-15 05:09:17'),(2229,482,1,'2006-02-15 05:09:17'),(2230,482,1,'2006-02-15 05:09:17'),(2231,483,1,'2006-02-15 05:09:17'),(2232,483,1,'2006-02-15 05:09:17'),(2233,483,1,'2006-02-15 05:09:17'),(2234,483,2,'2006-02-15 05:09:17'),(2235,483,2,'2006-02-15 05:09:17'),(2236,484,1,'2006-02-15 05:09:17'),(2237,484,1,'2006-02-15 05:09:17'),(2238,484,1,'2006-02-15 05:09:17'),(2239,484,1,'2006-02-15 05:09:17'),(2240,484,2,'2006-02-15 05:09:17'),(2241,484,2,'2006-02-15 05:09:17'),(2242,484,2,'2006-02-15 05:09:17'),(2243,485,2,'2006-02-15 05:09:17'),(2244,485,2,'2006-02-15 05:09:17'),(2245,485,2,'2006-02-15 05:09:17'),(2246,486,1,'2006-02-15 05:09:17'),(2247,486,1,'2006-02-15 05:09:17'),(2248,486,1,'2006-02-15 05:09:17'),(2249,486,1,'2006-02-15 05:09:17'),(2250,486,2,'2006-02-15 05:09:17'),(2251,486,2,'2006-02-15 05:09:17'),(2252,487,2,'2006-02-15 05:09:17'),(2253,487,2,'2006-02-15 05:09:17'),(2254,487,2,'2006-02-15 05:09:17'),(2255,488,1,'2006-02-15 05:09:17'),(2256,488,1,'2006-02-15 05:09:17'),(2257,488,2,'2006-02-15 05:09:17'),(2258,488,2,'2006-02-15 05:09:17'),(2259,488,2,'2006-02-15 05:09:17'),(2260,489,1,'2006-02-15 05:09:17'),(2261,489,1,'2006-02-15 05:09:17'),(2262,489,1,'2006-02-15 05:09:17'),(2263,489,1,'2006-02-15 05:09:17'),(2264,489,2,'2006-02-15 05:09:17'),(2265,489,2,'2006-02-15 05:09:17'),(2266,489,2,'2006-02-15 05:09:17'),(2267,489,2,'2006-02-15 05:09:17'),(2268,490,1,'2006-02-15 05:09:17'),(2269,490,1,'2006-02-15 05:09:17'),(2270,491,1,'2006-02-15 05:09:17'),(2271,491,1,'2006-02-15 05:09:17'),(2272,491,2,'2006-02-15 05:09:17'),(2273,491,2,'2006-02-15 05:09:17'),(2274,491,2,'2006-02-15 05:09:17'),(2275,491,2,'2006-02-15 05:09:17'),(2276,492,1,'2006-02-15 05:09:17'),(2277,492,1,'2006-02-15 05:09:17'),(2278,493,2,'2006-02-15 05:09:17'),(2279,493,2,'2006-02-15 05:09:17'),(2280,493,2,'2006-02-15 05:09:17'),(2281,494,1,'2006-02-15 05:09:17'),(2282,494,1,'2006-02-15 05:09:17'),(2283,494,1,'2006-02-15 05:09:17'),(2284,494,1,'2006-02-15 05:09:17'),(2285,494,2,'2006-02-15 05:09:17'),(2286,494,2,'2006-02-15 05:09:17'),(2287,496,1,'2006-02-15 05:09:17'),(2288,496,1,'2006-02-15 05:09:17'),(2289,496,2,'2006-02-15 05:09:17'),(2290,496,2,'2006-02-15 05:09:17'),(2291,496,2,'2006-02-15 05:09:17'),(2292,498,1,'2006-02-15 05:09:17'),(2293,498,1,'2006-02-15 05:09:17'),(2294,499,1,'2006-02-15 05:09:17'),(2295,499,1,'2006-02-15 05:09:17'),(2296,500,1,'2006-02-15 05:09:17'),(2297,500,1,'2006-02-15 05:09:17'),(2298,500,1,'2006-02-15 05:09:17'),(2299,500,1,'2006-02-15 05:09:17'),(2300,500,2,'2006-02-15 05:09:17'),(2301,500,2,'2006-02-15 05:09:17'),(2302,500,2,'2006-02-15 05:09:17'),(2303,500,2,'2006-02-15 05:09:17'),(2304,501,1,'2006-02-15 05:09:17'),(2305,501,1,'2006-02-15 05:09:17'),(2306,501,1,'2006-02-15 05:09:17'),(2307,501,2,'2006-02-15 05:09:17'),(2308,501,2,'2006-02-15 05:09:17'),(2309,502,1,'2006-02-15 05:09:17'),(2310,502,1,'2006-02-15 05:09:17'),(2311,502,1,'2006-02-15 05:09:17'),(2312,502,1,'2006-02-15 05:09:17'),(2313,502,2,'2006-02-15 05:09:17'),(2314,502,2,'2006-02-15 05:09:17'),(2315,502,2,'2006-02-15 05:09:17'),(2316,503,1,'2006-02-15 05:09:17'),(2317,503,1,'2006-02-15 05:09:17'),(2318,503,1,'2006-02-15 05:09:17'),(2319,504,1,'2006-02-15 05:09:17'),(2320,504,1,'2006-02-15 05:09:17'),(2321,504,1,'2006-02-15 05:09:17'),(2322,504,1,'2006-02-15 05:09:17'),(2323,504,2,'2006-02-15 05:09:17'),(2324,504,2,'2006-02-15 05:09:17'),(2325,505,2,'2006-02-15 05:09:17'),(2326,505,2,'2006-02-15 05:09:17'),(2327,505,2,'2006-02-15 05:09:17'),(2328,505,2,'2006-02-15 05:09:17'),(2329,506,1,'2006-02-15 05:09:17'),(2330,506,1,'2006-02-15 05:09:17'),(2331,506,1,'2006-02-15 05:09:17'),(2332,506,1,'2006-02-15 05:09:17'),(2333,506,2,'2006-02-15 05:09:17'),(2334,506,2,'2006-02-15 05:09:17'),(2335,507,2,'2006-02-15 05:09:17'),(2336,507,2,'2006-02-15 05:09:17'),(2337,508,2,'2006-02-15 05:09:17'),(2338,508,2,'2006-02-15 05:09:17'),(2339,508,2,'2006-02-15 05:09:17'),(2340,509,2,'2006-02-15 05:09:17'),(2341,509,2,'2006-02-15 05:09:17'),(2342,509,2,'2006-02-15 05:09:17'),(2343,510,1,'2006-02-15 05:09:17'),(2344,510,1,'2006-02-15 05:09:17'),(2345,510,1,'2006-02-15 05:09:17'),(2346,510,1,'2006-02-15 05:09:17'),(2347,511,1,'2006-02-15 05:09:17'),(2348,511,1,'2006-02-15 05:09:17'),(2349,511,2,'2006-02-15 05:09:17'),(2350,511,2,'2006-02-15 05:09:17'),(2351,511,2,'2006-02-15 05:09:17'),(2352,512,1,'2006-02-15 05:09:17'),(2353,512,1,'2006-02-15 05:09:17'),(2354,512,2,'2006-02-15 05:09:17'),(2355,512,2,'2006-02-15 05:09:17'),(2356,512,2,'2006-02-15 05:09:17'),(2357,512,2,'2006-02-15 05:09:17'),(2358,513,2,'2006-02-15 05:09:17'),(2359,513,2,'2006-02-15 05:09:17'),(2360,514,1,'2006-02-15 05:09:17'),(2361,514,1,'2006-02-15 05:09:17'),(2362,514,2,'2006-02-15 05:09:17'),(2363,514,2,'2006-02-15 05:09:17'),(2364,514,2,'2006-02-15 05:09:17'),(2365,514,2,'2006-02-15 05:09:17'),(2366,515,2,'2006-02-15 05:09:17'),(2367,515,2,'2006-02-15 05:09:17'),(2368,516,2,'2006-02-15 05:09:17'),(2369,516,2,'2006-02-15 05:09:17'),(2370,516,2,'2006-02-15 05:09:17'),(2371,517,2,'2006-02-15 05:09:17'),(2372,517,2,'2006-02-15 05:09:17'),(2373,518,1,'2006-02-15 05:09:17'),(2374,518,1,'2006-02-15 05:09:17'),(2375,518,2,'2006-02-15 05:09:17'),(2376,518,2,'2006-02-15 05:09:17'),(2377,518,2,'2006-02-15 05:09:17'),(2378,518,2,'2006-02-15 05:09:17'),(2379,519,2,'2006-02-15 05:09:17'),(2380,519,2,'2006-02-15 05:09:17'),(2381,519,2,'2006-02-15 05:09:17'),(2382,519,2,'2006-02-15 05:09:17'),(2383,520,1,'2006-02-15 05:09:17'),(2384,520,1,'2006-02-15 05:09:17'),(2385,521,1,'2006-02-15 05:09:17'),(2386,521,1,'2006-02-15 05:09:17'),(2387,521,1,'2006-02-15 05:09:17'),(2388,521,1,'2006-02-15 05:09:17'),(2389,521,2,'2006-02-15 05:09:17'),(2390,521,2,'2006-02-15 05:09:17'),(2391,521,2,'2006-02-15 05:09:17'),(2392,522,2,'2006-02-15 05:09:17'),(2393,522,2,'2006-02-15 05:09:17'),(2394,523,1,'2006-02-15 05:09:17'),(2395,523,1,'2006-02-15 05:09:17'),(2396,524,1,'2006-02-15 05:09:17'),(2397,524,1,'2006-02-15 05:09:17'),(2398,524,2,'2006-02-15 05:09:17'),(2399,524,2,'2006-02-15 05:09:17'),(2400,524,2,'2006-02-15 05:09:17'),(2401,524,2,'2006-02-15 05:09:17'),(2402,525,1,'2006-02-15 05:09:17'),(2403,525,1,'2006-02-15 05:09:17'),(2404,525,1,'2006-02-15 05:09:17'),(2405,525,1,'2006-02-15 05:09:17'),(2406,525,2,'2006-02-15 05:09:17'),(2407,525,2,'2006-02-15 05:09:17'),(2408,525,2,'2006-02-15 05:09:17'),(2409,525,2,'2006-02-15 05:09:17'),(2410,526,2,'2006-02-15 05:09:17'),(2411,526,2,'2006-02-15 05:09:17'),(2412,526,2,'2006-02-15 05:09:17'),(2413,526,2,'2006-02-15 05:09:17'),(2414,527,1,'2006-02-15 05:09:17'),(2415,527,1,'2006-02-15 05:09:17'),(2416,527,2,'2006-02-15 05:09:17'),(2417,527,2,'2006-02-15 05:09:17'),(2418,527,2,'2006-02-15 05:09:17'),(2419,527,2,'2006-02-15 05:09:17'),(2420,528,1,'2006-02-15 05:09:17'),(2421,528,1,'2006-02-15 05:09:17'),(2422,528,1,'2006-02-15 05:09:17'),(2423,529,1,'2006-02-15 05:09:17'),(2424,529,1,'2006-02-15 05:09:17'),(2425,529,1,'2006-02-15 05:09:17'),(2426,529,1,'2006-02-15 05:09:17'),(2427,530,1,'2006-02-15 05:09:17'),(2428,530,1,'2006-02-15 05:09:17'),(2429,530,1,'2006-02-15 05:09:17'),(2430,531,1,'2006-02-15 05:09:17'),(2431,531,1,'2006-02-15 05:09:17'),(2432,531,1,'2006-02-15 05:09:17'),(2433,531,1,'2006-02-15 05:09:17'),(2434,531,2,'2006-02-15 05:09:17'),(2435,531,2,'2006-02-15 05:09:17'),(2436,531,2,'2006-02-15 05:09:17'),(2437,531,2,'2006-02-15 05:09:17'),(2438,532,2,'2006-02-15 05:09:17'),(2439,532,2,'2006-02-15 05:09:17'),(2440,532,2,'2006-02-15 05:09:17'),(2441,532,2,'2006-02-15 05:09:17'),(2442,533,1,'2006-02-15 05:09:17'),(2443,533,1,'2006-02-15 05:09:17'),(2444,533,1,'2006-02-15 05:09:17'),(2445,534,1,'2006-02-15 05:09:17'),(2446,534,1,'2006-02-15 05:09:17'),(2447,534,2,'2006-02-15 05:09:17'),(2448,534,2,'2006-02-15 05:09:17'),(2449,534,2,'2006-02-15 05:09:17'),(2450,535,1,'2006-02-15 05:09:17'),(2451,535,1,'2006-02-15 05:09:17'),(2452,535,1,'2006-02-15 05:09:17'),(2453,535,1,'2006-02-15 05:09:17'),(2454,536,1,'2006-02-15 05:09:17'),(2455,536,1,'2006-02-15 05:09:17'),(2456,536,1,'2006-02-15 05:09:17'),(2457,536,2,'2006-02-15 05:09:17'),(2458,536,2,'2006-02-15 05:09:17'),(2459,537,2,'2006-02-15 05:09:17'),(2460,537,2,'2006-02-15 05:09:17'),(2461,537,2,'2006-02-15 05:09:17'),(2462,538,2,'2006-02-15 05:09:17'),(2463,538,2,'2006-02-15 05:09:17'),(2464,538,2,'2006-02-15 05:09:17'),(2465,539,1,'2006-02-15 05:09:17'),(2466,539,1,'2006-02-15 05:09:17'),(2467,540,1,'2006-02-15 05:09:17'),(2468,540,1,'2006-02-15 05:09:17'),(2469,540,1,'2006-02-15 05:09:17'),(2470,541,2,'2006-02-15 05:09:17'),(2471,541,2,'2006-02-15 05:09:17'),(2472,542,1,'2006-02-15 05:09:17'),(2473,542,1,'2006-02-15 05:09:17'),(2474,542,1,'2006-02-15 05:09:17'),(2475,542,1,'2006-02-15 05:09:17'),(2476,542,2,'2006-02-15 05:09:17'),(2477,542,2,'2006-02-15 05:09:17'),(2478,543,1,'2006-02-15 05:09:17'),(2479,543,1,'2006-02-15 05:09:17'),(2480,544,1,'2006-02-15 05:09:17'),(2481,544,1,'2006-02-15 05:09:17'),(2482,544,2,'2006-02-15 05:09:17'),(2483,544,2,'2006-02-15 05:09:17'),(2484,545,1,'2006-02-15 05:09:17'),(2485,545,1,'2006-02-15 05:09:17'),(2486,545,1,'2006-02-15 05:09:17'),(2487,545,1,'2006-02-15 05:09:17'),(2488,545,2,'2006-02-15 05:09:17'),(2489,545,2,'2006-02-15 05:09:17'),(2490,546,2,'2006-02-15 05:09:17'),(2491,546,2,'2006-02-15 05:09:17'),(2492,546,2,'2006-02-15 05:09:17'),(2493,546,2,'2006-02-15 05:09:17'),(2494,547,2,'2006-02-15 05:09:17'),(2495,547,2,'2006-02-15 05:09:17'),(2496,548,1,'2006-02-15 05:09:17'),(2497,548,1,'2006-02-15 05:09:17'),(2498,549,1,'2006-02-15 05:09:17'),(2499,549,1,'2006-02-15 05:09:17'),(2500,549,2,'2006-02-15 05:09:17'),(2501,549,2,'2006-02-15 05:09:17'),(2502,550,1,'2006-02-15 05:09:17'),(2503,550,1,'2006-02-15 05:09:17'),(2504,550,1,'2006-02-15 05:09:17'),(2505,551,1,'2006-02-15 05:09:17'),(2506,551,1,'2006-02-15 05:09:17'),(2507,551,1,'2006-02-15 05:09:17'),(2508,551,2,'2006-02-15 05:09:17'),(2509,551,2,'2006-02-15 05:09:17'),(2510,551,2,'2006-02-15 05:09:17'),(2511,552,2,'2006-02-15 05:09:17'),(2512,552,2,'2006-02-15 05:09:17'),(2513,552,2,'2006-02-15 05:09:17'),(2514,552,2,'2006-02-15 05:09:17'),(2515,553,2,'2006-02-15 05:09:17'),(2516,553,2,'2006-02-15 05:09:17'),(2517,553,2,'2006-02-15 05:09:17'),(2518,554,1,'2006-02-15 05:09:17'),(2519,554,1,'2006-02-15 05:09:17'),(2520,554,1,'2006-02-15 05:09:17'),(2521,554,1,'2006-02-15 05:09:17'),(2522,554,2,'2006-02-15 05:09:17'),(2523,554,2,'2006-02-15 05:09:17'),(2524,554,2,'2006-02-15 05:09:17'),(2525,555,1,'2006-02-15 05:09:17'),(2526,555,1,'2006-02-15 05:09:17'),(2527,555,1,'2006-02-15 05:09:17'),(2528,555,2,'2006-02-15 05:09:17'),(2529,555,2,'2006-02-15 05:09:17'),(2530,555,2,'2006-02-15 05:09:17'),(2531,555,2,'2006-02-15 05:09:17'),(2532,556,1,'2006-02-15 05:09:17'),(2533,556,1,'2006-02-15 05:09:17'),(2534,556,1,'2006-02-15 05:09:17'),(2535,556,2,'2006-02-15 05:09:17'),(2536,556,2,'2006-02-15 05:09:17'),(2537,556,2,'2006-02-15 05:09:17'),(2538,556,2,'2006-02-15 05:09:17'),(2539,557,1,'2006-02-15 05:09:17'),(2540,557,1,'2006-02-15 05:09:17'),(2541,557,2,'2006-02-15 05:09:17'),(2542,557,2,'2006-02-15 05:09:17'),(2543,557,2,'2006-02-15 05:09:17'),(2544,558,2,'2006-02-15 05:09:17'),(2545,558,2,'2006-02-15 05:09:17'),(2546,559,1,'2006-02-15 05:09:17'),(2547,559,1,'2006-02-15 05:09:17'),(2548,559,1,'2006-02-15 05:09:17'),(2549,559,1,'2006-02-15 05:09:17'),(2550,559,2,'2006-02-15 05:09:17'),(2551,559,2,'2006-02-15 05:09:17'),(2552,559,2,'2006-02-15 05:09:17'),(2553,559,2,'2006-02-15 05:09:17'),(2554,560,1,'2006-02-15 05:09:17'),(2555,560,1,'2006-02-15 05:09:17'),(2556,560,1,'2006-02-15 05:09:17'),(2557,560,2,'2006-02-15 05:09:17'),(2558,560,2,'2006-02-15 05:09:17'),(2559,561,1,'2006-02-15 05:09:17'),(2560,561,1,'2006-02-15 05:09:17'),(2561,561,1,'2006-02-15 05:09:17'),(2562,561,1,'2006-02-15 05:09:17'),(2563,562,1,'2006-02-15 05:09:17'),(2564,562,1,'2006-02-15 05:09:17'),(2565,562,1,'2006-02-15 05:09:17'),(2566,562,1,'2006-02-15 05:09:17'),(2567,562,2,'2006-02-15 05:09:17'),(2568,562,2,'2006-02-15 05:09:17'),(2569,563,1,'2006-02-15 05:09:17'),(2570,563,1,'2006-02-15 05:09:17'),(2571,563,1,'2006-02-15 05:09:17'),(2572,563,1,'2006-02-15 05:09:17'),(2573,563,2,'2006-02-15 05:09:17'),(2574,563,2,'2006-02-15 05:09:17'),(2575,563,2,'2006-02-15 05:09:17'),(2576,564,2,'2006-02-15 05:09:17'),(2577,564,2,'2006-02-15 05:09:17'),(2578,564,2,'2006-02-15 05:09:17'),(2579,565,1,'2006-02-15 05:09:17'),(2580,565,1,'2006-02-15 05:09:17'),(2581,566,1,'2006-02-15 05:09:17'),(2582,566,1,'2006-02-15 05:09:17'),(2583,567,1,'2006-02-15 05:09:17'),(2584,567,1,'2006-02-15 05:09:17'),(2585,567,2,'2006-02-15 05:09:17'),(2586,567,2,'2006-02-15 05:09:17'),(2587,568,1,'2006-02-15 05:09:17'),(2588,568,1,'2006-02-15 05:09:17'),(2589,568,2,'2006-02-15 05:09:17'),(2590,568,2,'2006-02-15 05:09:17'),(2591,569,1,'2006-02-15 05:09:17'),(2592,569,1,'2006-02-15 05:09:17'),(2593,570,1,'2006-02-15 05:09:17'),(2594,570,1,'2006-02-15 05:09:17'),(2595,570,2,'2006-02-15 05:09:17'),(2596,570,2,'2006-02-15 05:09:17'),(2597,570,2,'2006-02-15 05:09:17'),(2598,571,1,'2006-02-15 05:09:17'),(2599,571,1,'2006-02-15 05:09:17'),(2600,571,2,'2006-02-15 05:09:17'),(2601,571,2,'2006-02-15 05:09:17'),(2602,571,2,'2006-02-15 05:09:17'),(2603,571,2,'2006-02-15 05:09:17'),(2604,572,1,'2006-02-15 05:09:17'),(2605,572,1,'2006-02-15 05:09:17'),(2606,572,1,'2006-02-15 05:09:17'),(2607,572,1,'2006-02-15 05:09:17'),(2608,572,2,'2006-02-15 05:09:17'),(2609,572,2,'2006-02-15 05:09:17'),(2610,572,2,'2006-02-15 05:09:17'),(2611,572,2,'2006-02-15 05:09:17'),(2612,573,1,'2006-02-15 05:09:17'),(2613,573,1,'2006-02-15 05:09:17'),(2614,573,1,'2006-02-15 05:09:17'),(2615,573,1,'2006-02-15 05:09:17'),(2616,574,1,'2006-02-15 05:09:17'),(2617,574,1,'2006-02-15 05:09:17'),(2618,574,2,'2006-02-15 05:09:17'),(2619,574,2,'2006-02-15 05:09:17'),(2620,574,2,'2006-02-15 05:09:17'),(2621,575,1,'2006-02-15 05:09:17'),(2622,575,1,'2006-02-15 05:09:17'),(2623,575,2,'2006-02-15 05:09:17'),(2624,575,2,'2006-02-15 05:09:17'),(2625,575,2,'2006-02-15 05:09:17'),(2626,575,2,'2006-02-15 05:09:17'),(2627,576,2,'2006-02-15 05:09:17'),(2628,576,2,'2006-02-15 05:09:17'),(2629,576,2,'2006-02-15 05:09:17'),(2630,577,1,'2006-02-15 05:09:17'),(2631,577,1,'2006-02-15 05:09:17'),(2632,577,1,'2006-02-15 05:09:17'),(2633,578,1,'2006-02-15 05:09:17'),(2634,578,1,'2006-02-15 05:09:17'),(2635,578,2,'2006-02-15 05:09:17'),(2636,578,2,'2006-02-15 05:09:17'),(2637,578,2,'2006-02-15 05:09:17'),(2638,579,1,'2006-02-15 05:09:17'),(2639,579,1,'2006-02-15 05:09:17'),(2640,579,1,'2006-02-15 05:09:17'),(2641,579,1,'2006-02-15 05:09:17'),(2642,579,2,'2006-02-15 05:09:17'),(2643,579,2,'2006-02-15 05:09:17'),(2644,579,2,'2006-02-15 05:09:17'),(2645,580,1,'2006-02-15 05:09:17'),(2646,580,1,'2006-02-15 05:09:17'),(2647,580,1,'2006-02-15 05:09:17'),(2648,580,1,'2006-02-15 05:09:17'),(2649,580,2,'2006-02-15 05:09:17'),(2650,580,2,'2006-02-15 05:09:17'),(2651,581,1,'2006-02-15 05:09:17'),(2652,581,1,'2006-02-15 05:09:17'),(2653,581,1,'2006-02-15 05:09:17'),(2654,582,2,'2006-02-15 05:09:17'),(2655,582,2,'2006-02-15 05:09:17'),(2656,583,1,'2006-02-15 05:09:17'),(2657,583,1,'2006-02-15 05:09:17'),(2658,583,1,'2006-02-15 05:09:17'),(2659,583,2,'2006-02-15 05:09:17'),(2660,583,2,'2006-02-15 05:09:17'),(2661,584,1,'2006-02-15 05:09:17'),(2662,584,1,'2006-02-15 05:09:17'),(2663,585,2,'2006-02-15 05:09:17'),(2664,585,2,'2006-02-15 05:09:17'),(2665,585,2,'2006-02-15 05:09:17'),(2666,585,2,'2006-02-15 05:09:17'),(2667,586,1,'2006-02-15 05:09:17'),(2668,586,1,'2006-02-15 05:09:17'),(2669,586,1,'2006-02-15 05:09:17'),(2670,586,1,'2006-02-15 05:09:17'),(2671,586,2,'2006-02-15 05:09:17'),(2672,586,2,'2006-02-15 05:09:17'),(2673,586,2,'2006-02-15 05:09:17'),(2674,586,2,'2006-02-15 05:09:17'),(2675,587,1,'2006-02-15 05:09:17'),(2676,587,1,'2006-02-15 05:09:17'),(2677,587,1,'2006-02-15 05:09:17'),(2678,588,2,'2006-02-15 05:09:17'),(2679,588,2,'2006-02-15 05:09:17'),(2680,588,2,'2006-02-15 05:09:17'),(2681,588,2,'2006-02-15 05:09:17'),(2682,589,2,'2006-02-15 05:09:17'),(2683,589,2,'2006-02-15 05:09:17'),(2684,589,2,'2006-02-15 05:09:17'),(2685,589,2,'2006-02-15 05:09:17'),(2686,590,1,'2006-02-15 05:09:17'),(2687,590,1,'2006-02-15 05:09:17'),(2688,590,1,'2006-02-15 05:09:17'),(2689,590,2,'2006-02-15 05:09:17'),(2690,590,2,'2006-02-15 05:09:17'),(2691,590,2,'2006-02-15 05:09:17'),(2692,590,2,'2006-02-15 05:09:17'),(2693,591,2,'2006-02-15 05:09:17'),(2694,591,2,'2006-02-15 05:09:17'),(2695,591,2,'2006-02-15 05:09:17'),(2696,592,1,'2006-02-15 05:09:17'),(2697,592,1,'2006-02-15 05:09:17'),(2698,592,2,'2006-02-15 05:09:17'),(2699,592,2,'2006-02-15 05:09:17'),(2700,593,2,'2006-02-15 05:09:17'),(2701,593,2,'2006-02-15 05:09:17'),(2702,593,2,'2006-02-15 05:09:17'),(2703,593,2,'2006-02-15 05:09:17'),(2704,594,1,'2006-02-15 05:09:17'),(2705,594,1,'2006-02-15 05:09:17'),(2706,594,1,'2006-02-15 05:09:17'),(2707,595,1,'2006-02-15 05:09:17'),(2708,595,1,'2006-02-15 05:09:17'),(2709,595,1,'2006-02-15 05:09:17'),(2710,595,1,'2006-02-15 05:09:17'),(2711,595,2,'2006-02-15 05:09:17'),(2712,595,2,'2006-02-15 05:09:17'),(2713,595,2,'2006-02-15 05:09:17'),(2714,595,2,'2006-02-15 05:09:17'),(2715,596,1,'2006-02-15 05:09:17'),(2716,596,1,'2006-02-15 05:09:17'),(2717,596,2,'2006-02-15 05:09:17'),(2718,596,2,'2006-02-15 05:09:17'),(2719,596,2,'2006-02-15 05:09:17'),(2720,596,2,'2006-02-15 05:09:17'),(2721,597,2,'2006-02-15 05:09:17'),(2722,597,2,'2006-02-15 05:09:17'),(2723,597,2,'2006-02-15 05:09:17'),(2724,597,2,'2006-02-15 05:09:17'),(2725,598,1,'2006-02-15 05:09:17'),(2726,598,1,'2006-02-15 05:09:17'),(2727,598,1,'2006-02-15 05:09:17'),(2728,598,1,'2006-02-15 05:09:17'),(2729,599,1,'2006-02-15 05:09:17'),(2730,599,1,'2006-02-15 05:09:17'),(2731,599,1,'2006-02-15 05:09:17'),(2732,599,2,'2006-02-15 05:09:17'),(2733,599,2,'2006-02-15 05:09:17'),(2734,600,1,'2006-02-15 05:09:17'),(2735,600,1,'2006-02-15 05:09:17'),(2736,600,2,'2006-02-15 05:09:17'),(2737,600,2,'2006-02-15 05:09:17'),(2738,601,1,'2006-02-15 05:09:17'),(2739,601,1,'2006-02-15 05:09:17'),(2740,601,1,'2006-02-15 05:09:17'),(2741,601,2,'2006-02-15 05:09:17'),(2742,601,2,'2006-02-15 05:09:17'),(2743,602,1,'2006-02-15 05:09:17'),(2744,602,1,'2006-02-15 05:09:17'),(2745,602,2,'2006-02-15 05:09:17'),(2746,602,2,'2006-02-15 05:09:17'),(2747,602,2,'2006-02-15 05:09:17'),(2748,603,1,'2006-02-15 05:09:17'),(2749,603,1,'2006-02-15 05:09:17'),(2750,603,1,'2006-02-15 05:09:17'),(2751,603,1,'2006-02-15 05:09:17'),(2752,603,2,'2006-02-15 05:09:17'),(2753,603,2,'2006-02-15 05:09:17'),(2754,604,2,'2006-02-15 05:09:17'),(2755,604,2,'2006-02-15 05:09:17'),(2756,604,2,'2006-02-15 05:09:17'),(2757,605,2,'2006-02-15 05:09:17'),(2758,605,2,'2006-02-15 05:09:17'),(2759,606,1,'2006-02-15 05:09:17'),(2760,606,1,'2006-02-15 05:09:17'),(2761,606,2,'2006-02-15 05:09:17'),(2762,606,2,'2006-02-15 05:09:17'),(2763,606,2,'2006-02-15 05:09:17'),(2764,606,2,'2006-02-15 05:09:17'),(2765,608,1,'2006-02-15 05:09:17'),(2766,608,1,'2006-02-15 05:09:17'),(2767,608,2,'2006-02-15 05:09:17'),(2768,608,2,'2006-02-15 05:09:17'),(2769,608,2,'2006-02-15 05:09:17'),(2770,608,2,'2006-02-15 05:09:17'),(2771,609,1,'2006-02-15 05:09:17'),(2772,609,1,'2006-02-15 05:09:17'),(2773,609,1,'2006-02-15 05:09:17'),(2774,609,1,'2006-02-15 05:09:17'),(2775,609,2,'2006-02-15 05:09:17'),(2776,609,2,'2006-02-15 05:09:17'),(2777,609,2,'2006-02-15 05:09:17'),(2778,609,2,'2006-02-15 05:09:17'),(2779,610,1,'2006-02-15 05:09:17'),(2780,610,1,'2006-02-15 05:09:17'),(2781,610,2,'2006-02-15 05:09:17'),(2782,610,2,'2006-02-15 05:09:17'),(2783,610,2,'2006-02-15 05:09:17'),(2784,611,1,'2006-02-15 05:09:17'),(2785,611,1,'2006-02-15 05:09:17'),(2786,611,1,'2006-02-15 05:09:17'),(2787,611,1,'2006-02-15 05:09:17'),(2788,611,2,'2006-02-15 05:09:17'),(2789,611,2,'2006-02-15 05:09:17'),(2790,612,2,'2006-02-15 05:09:17'),(2791,612,2,'2006-02-15 05:09:17'),(2792,613,1,'2006-02-15 05:09:17'),(2793,613,1,'2006-02-15 05:09:17'),(2794,614,1,'2006-02-15 05:09:17'),(2795,614,1,'2006-02-15 05:09:17'),(2796,614,1,'2006-02-15 05:09:17'),(2797,614,2,'2006-02-15 05:09:17'),(2798,614,2,'2006-02-15 05:09:17'),(2799,614,2,'2006-02-15 05:09:17'),(2800,615,2,'2006-02-15 05:09:17'),(2801,615,2,'2006-02-15 05:09:17'),(2802,615,2,'2006-02-15 05:09:17'),(2803,615,2,'2006-02-15 05:09:17'),(2804,616,1,'2006-02-15 05:09:17'),(2805,616,1,'2006-02-15 05:09:17'),(2806,616,2,'2006-02-15 05:09:17'),(2807,616,2,'2006-02-15 05:09:17'),(2808,616,2,'2006-02-15 05:09:17'),(2809,616,2,'2006-02-15 05:09:17'),(2810,617,1,'2006-02-15 05:09:17'),(2811,617,1,'2006-02-15 05:09:17'),(2812,617,1,'2006-02-15 05:09:17'),(2813,618,2,'2006-02-15 05:09:17'),(2814,618,2,'2006-02-15 05:09:17'),(2815,618,2,'2006-02-15 05:09:17'),(2816,618,2,'2006-02-15 05:09:17'),(2817,619,1,'2006-02-15 05:09:17'),(2818,619,1,'2006-02-15 05:09:17'),(2819,619,2,'2006-02-15 05:09:17'),(2820,619,2,'2006-02-15 05:09:17'),(2821,619,2,'2006-02-15 05:09:17'),(2822,619,2,'2006-02-15 05:09:17'),(2823,620,1,'2006-02-15 05:09:17'),(2824,620,1,'2006-02-15 05:09:17'),(2825,620,2,'2006-02-15 05:09:17'),(2826,620,2,'2006-02-15 05:09:17'),(2827,620,2,'2006-02-15 05:09:17'),(2828,621,1,'2006-02-15 05:09:17'),(2829,621,1,'2006-02-15 05:09:17'),(2830,621,1,'2006-02-15 05:09:17'),(2831,621,1,'2006-02-15 05:09:17'),(2832,621,2,'2006-02-15 05:09:17'),(2833,621,2,'2006-02-15 05:09:17'),(2834,621,2,'2006-02-15 05:09:17'),(2835,621,2,'2006-02-15 05:09:17'),(2836,622,2,'2006-02-15 05:09:17'),(2837,622,2,'2006-02-15 05:09:17'),(2838,623,1,'2006-02-15 05:09:17'),(2839,623,1,'2006-02-15 05:09:17'),(2840,623,2,'2006-02-15 05:09:17'),(2841,623,2,'2006-02-15 05:09:17'),(2842,623,2,'2006-02-15 05:09:17'),(2843,624,1,'2006-02-15 05:09:17'),(2844,624,1,'2006-02-15 05:09:17'),(2845,624,1,'2006-02-15 05:09:17'),(2846,624,2,'2006-02-15 05:09:17'),(2847,624,2,'2006-02-15 05:09:17'),(2848,624,2,'2006-02-15 05:09:17'),(2849,624,2,'2006-02-15 05:09:17'),(2850,625,1,'2006-02-15 05:09:17'),(2851,625,1,'2006-02-15 05:09:17'),(2852,625,1,'2006-02-15 05:09:17'),(2853,625,2,'2006-02-15 05:09:17'),(2854,625,2,'2006-02-15 05:09:17'),(2855,625,2,'2006-02-15 05:09:17'),(2856,625,2,'2006-02-15 05:09:17'),(2857,626,2,'2006-02-15 05:09:17'),(2858,626,2,'2006-02-15 05:09:17'),(2859,626,2,'2006-02-15 05:09:17'),(2860,626,2,'2006-02-15 05:09:17'),(2861,627,2,'2006-02-15 05:09:17'),(2862,627,2,'2006-02-15 05:09:17'),(2863,627,2,'2006-02-15 05:09:17'),(2864,628,1,'2006-02-15 05:09:17'),(2865,628,1,'2006-02-15 05:09:17'),(2866,628,1,'2006-02-15 05:09:17'),(2867,628,2,'2006-02-15 05:09:17'),(2868,628,2,'2006-02-15 05:09:17'),(2869,629,2,'2006-02-15 05:09:17'),(2870,629,2,'2006-02-15 05:09:17'),(2871,629,2,'2006-02-15 05:09:17'),(2872,629,2,'2006-02-15 05:09:17'),(2873,630,2,'2006-02-15 05:09:17'),(2874,630,2,'2006-02-15 05:09:17'),(2875,630,2,'2006-02-15 05:09:17'),(2876,631,1,'2006-02-15 05:09:17'),(2877,631,1,'2006-02-15 05:09:17'),(2878,631,1,'2006-02-15 05:09:17'),(2879,631,2,'2006-02-15 05:09:17'),(2880,631,2,'2006-02-15 05:09:17'),(2881,632,1,'2006-02-15 05:09:17'),(2882,632,1,'2006-02-15 05:09:17'),(2883,632,1,'2006-02-15 05:09:17'),(2884,633,2,'2006-02-15 05:09:17'),(2885,633,2,'2006-02-15 05:09:17'),(2886,633,2,'2006-02-15 05:09:17'),(2887,634,2,'2006-02-15 05:09:17'),(2888,634,2,'2006-02-15 05:09:17'),(2889,634,2,'2006-02-15 05:09:17'),(2890,634,2,'2006-02-15 05:09:17'),(2891,635,2,'2006-02-15 05:09:17'),(2892,635,2,'2006-02-15 05:09:17'),(2893,636,1,'2006-02-15 05:09:17'),(2894,636,1,'2006-02-15 05:09:17'),(2895,636,1,'2006-02-15 05:09:17'),(2896,637,1,'2006-02-15 05:09:17'),(2897,637,1,'2006-02-15 05:09:17'),(2898,637,2,'2006-02-15 05:09:17'),(2899,637,2,'2006-02-15 05:09:17'),(2900,637,2,'2006-02-15 05:09:17'),(2901,638,1,'2006-02-15 05:09:17'),(2902,638,1,'2006-02-15 05:09:17'),(2903,638,1,'2006-02-15 05:09:17'),(2904,638,1,'2006-02-15 05:09:17'),(2905,638,2,'2006-02-15 05:09:17'),(2906,638,2,'2006-02-15 05:09:17'),(2907,638,2,'2006-02-15 05:09:17'),(2908,638,2,'2006-02-15 05:09:17'),(2909,639,2,'2006-02-15 05:09:17'),(2910,639,2,'2006-02-15 05:09:17'),(2911,639,2,'2006-02-15 05:09:17'),(2912,640,2,'2006-02-15 05:09:17'),(2913,640,2,'2006-02-15 05:09:17'),(2914,640,2,'2006-02-15 05:09:17'),(2915,641,1,'2006-02-15 05:09:17'),(2916,641,1,'2006-02-15 05:09:17'),(2917,641,1,'2006-02-15 05:09:17'),(2918,641,2,'2006-02-15 05:09:17'),(2919,641,2,'2006-02-15 05:09:17'),(2920,641,2,'2006-02-15 05:09:17'),(2921,641,2,'2006-02-15 05:09:17'),(2922,643,1,'2006-02-15 05:09:17'),(2923,643,1,'2006-02-15 05:09:17'),(2924,643,1,'2006-02-15 05:09:17'),(2925,643,2,'2006-02-15 05:09:17'),(2926,643,2,'2006-02-15 05:09:17'),(2927,643,2,'2006-02-15 05:09:17'),(2928,644,1,'2006-02-15 05:09:17'),(2929,644,1,'2006-02-15 05:09:17'),(2930,644,1,'2006-02-15 05:09:17'),(2931,644,2,'2006-02-15 05:09:17'),(2932,644,2,'2006-02-15 05:09:17'),(2933,644,2,'2006-02-15 05:09:17'),(2934,644,2,'2006-02-15 05:09:17'),(2935,645,1,'2006-02-15 05:09:17'),(2936,645,1,'2006-02-15 05:09:17'),(2937,645,1,'2006-02-15 05:09:17'),(2938,645,2,'2006-02-15 05:09:17'),(2939,645,2,'2006-02-15 05:09:17'),(2940,645,2,'2006-02-15 05:09:17'),(2941,646,1,'2006-02-15 05:09:17'),(2942,646,1,'2006-02-15 05:09:17'),(2943,646,1,'2006-02-15 05:09:17'),(2944,646,2,'2006-02-15 05:09:17'),(2945,646,2,'2006-02-15 05:09:17'),(2946,647,1,'2006-02-15 05:09:17'),(2947,647,1,'2006-02-15 05:09:17'),(2948,647,1,'2006-02-15 05:09:17'),(2949,647,2,'2006-02-15 05:09:17'),(2950,647,2,'2006-02-15 05:09:17'),(2951,647,2,'2006-02-15 05:09:17'),(2952,648,1,'2006-02-15 05:09:17'),(2953,648,1,'2006-02-15 05:09:17'),(2954,648,1,'2006-02-15 05:09:17'),(2955,648,1,'2006-02-15 05:09:17'),(2956,648,2,'2006-02-15 05:09:17'),(2957,648,2,'2006-02-15 05:09:17'),(2958,649,1,'2006-02-15 05:09:17'),(2959,649,1,'2006-02-15 05:09:17'),(2960,649,2,'2006-02-15 05:09:17'),(2961,649,2,'2006-02-15 05:09:17'),(2962,649,2,'2006-02-15 05:09:17'),(2963,649,2,'2006-02-15 05:09:17'),(2964,650,1,'2006-02-15 05:09:17'),(2965,650,1,'2006-02-15 05:09:17'),(2966,650,2,'2006-02-15 05:09:17'),(2967,650,2,'2006-02-15 05:09:17'),(2968,650,2,'2006-02-15 05:09:17'),(2969,650,2,'2006-02-15 05:09:17'),(2970,651,1,'2006-02-15 05:09:17'),(2971,651,1,'2006-02-15 05:09:17'),(2972,651,2,'2006-02-15 05:09:17'),(2973,651,2,'2006-02-15 05:09:17'),(2974,651,2,'2006-02-15 05:09:17'),(2975,651,2,'2006-02-15 05:09:17'),(2976,652,1,'2006-02-15 05:09:17'),(2977,652,1,'2006-02-15 05:09:17'),(2978,652,1,'2006-02-15 05:09:17'),(2979,652,1,'2006-02-15 05:09:17'),(2980,653,1,'2006-02-15 05:09:17'),(2981,653,1,'2006-02-15 05:09:17'),(2982,654,1,'2006-02-15 05:09:17'),(2983,654,1,'2006-02-15 05:09:17'),(2984,654,2,'2006-02-15 05:09:17'),(2985,654,2,'2006-02-15 05:09:17'),(2986,655,1,'2006-02-15 05:09:17'),(2987,655,1,'2006-02-15 05:09:17'),(2988,655,1,'2006-02-15 05:09:17'),(2989,655,2,'2006-02-15 05:09:17'),(2990,655,2,'2006-02-15 05:09:17'),(2991,655,2,'2006-02-15 05:09:17'),(2992,656,2,'2006-02-15 05:09:17'),(2993,656,2,'2006-02-15 05:09:17'),(2994,657,1,'2006-02-15 05:09:17'),(2995,657,1,'2006-02-15 05:09:17'),(2996,657,1,'2006-02-15 05:09:17'),(2997,657,1,'2006-02-15 05:09:17'),(2998,657,2,'2006-02-15 05:09:17'),(2999,657,2,'2006-02-15 05:09:17'),(3000,658,2,'2006-02-15 05:09:17'),(3001,658,2,'2006-02-15 05:09:17'),(3002,658,2,'2006-02-15 05:09:17'),(3003,658,2,'2006-02-15 05:09:17'),(3004,659,2,'2006-02-15 05:09:17'),(3005,659,2,'2006-02-15 05:09:17'),(3006,660,1,'2006-02-15 05:09:17'),(3007,660,1,'2006-02-15 05:09:17'),(3008,660,2,'2006-02-15 05:09:17'),(3009,660,2,'2006-02-15 05:09:17'),(3010,661,1,'2006-02-15 05:09:17'),(3011,661,1,'2006-02-15 05:09:17'),(3012,661,1,'2006-02-15 05:09:17'),(3013,661,1,'2006-02-15 05:09:17'),(3014,662,1,'2006-02-15 05:09:17'),(3015,662,1,'2006-02-15 05:09:17'),(3016,662,2,'2006-02-15 05:09:17'),(3017,662,2,'2006-02-15 05:09:17'),(3018,663,1,'2006-02-15 05:09:17'),(3019,663,1,'2006-02-15 05:09:17'),(3020,663,1,'2006-02-15 05:09:17'),(3021,663,2,'2006-02-15 05:09:17'),(3022,663,2,'2006-02-15 05:09:17'),(3023,664,1,'2006-02-15 05:09:17'),(3024,664,1,'2006-02-15 05:09:17'),(3025,664,2,'2006-02-15 05:09:17'),(3026,664,2,'2006-02-15 05:09:17'),(3027,664,2,'2006-02-15 05:09:17'),(3028,665,1,'2006-02-15 05:09:17'),(3029,665,1,'2006-02-15 05:09:17'),(3030,665,1,'2006-02-15 05:09:17'),(3031,665,1,'2006-02-15 05:09:17'),(3032,665,2,'2006-02-15 05:09:17'),(3033,665,2,'2006-02-15 05:09:17'),(3034,665,2,'2006-02-15 05:09:17'),(3035,666,1,'2006-02-15 05:09:17'),(3036,666,1,'2006-02-15 05:09:17'),(3037,666,1,'2006-02-15 05:09:17'),(3038,666,2,'2006-02-15 05:09:17'),(3039,666,2,'2006-02-15 05:09:17'),(3040,667,1,'2006-02-15 05:09:17'),(3041,667,1,'2006-02-15 05:09:17'),(3042,667,2,'2006-02-15 05:09:17'),(3043,667,2,'2006-02-15 05:09:17'),(3044,668,1,'2006-02-15 05:09:17'),(3045,668,1,'2006-02-15 05:09:17'),(3046,668,2,'2006-02-15 05:09:17'),(3047,668,2,'2006-02-15 05:09:17'),(3048,668,2,'2006-02-15 05:09:17'),(3049,670,1,'2006-02-15 05:09:17'),(3050,670,1,'2006-02-15 05:09:17'),(3051,670,1,'2006-02-15 05:09:17'),(3052,670,1,'2006-02-15 05:09:17'),(3053,670,2,'2006-02-15 05:09:17'),(3054,670,2,'2006-02-15 05:09:17'),(3055,670,2,'2006-02-15 05:09:17'),(3056,672,1,'2006-02-15 05:09:17'),(3057,672,1,'2006-02-15 05:09:17'),(3058,672,2,'2006-02-15 05:09:17'),(3059,672,2,'2006-02-15 05:09:17'),(3060,672,2,'2006-02-15 05:09:17'),(3061,672,2,'2006-02-15 05:09:17'),(3062,673,1,'2006-02-15 05:09:17'),(3063,673,1,'2006-02-15 05:09:17'),(3064,673,2,'2006-02-15 05:09:17'),(3065,673,2,'2006-02-15 05:09:17'),(3066,674,1,'2006-02-15 05:09:17'),(3067,674,1,'2006-02-15 05:09:17'),(3068,674,1,'2006-02-15 05:09:17'),(3069,675,1,'2006-02-15 05:09:17'),(3070,675,1,'2006-02-15 05:09:17'),(3071,676,1,'2006-02-15 05:09:17'),(3072,676,1,'2006-02-15 05:09:17'),(3073,676,2,'2006-02-15 05:09:17'),(3074,676,2,'2006-02-15 05:09:17'),(3075,676,2,'2006-02-15 05:09:17'),(3076,676,2,'2006-02-15 05:09:17'),(3077,677,1,'2006-02-15 05:09:17'),(3078,677,1,'2006-02-15 05:09:17'),(3079,677,1,'2006-02-15 05:09:17'),(3080,677,2,'2006-02-15 05:09:17'),(3081,677,2,'2006-02-15 05:09:17'),(3082,677,2,'2006-02-15 05:09:17'),(3083,677,2,'2006-02-15 05:09:17'),(3084,678,1,'2006-02-15 05:09:17'),(3085,678,1,'2006-02-15 05:09:17'),(3086,678,1,'2006-02-15 05:09:17'),(3087,678,1,'2006-02-15 05:09:17'),(3088,679,1,'2006-02-15 05:09:17'),(3089,679,1,'2006-02-15 05:09:17'),(3090,679,2,'2006-02-15 05:09:17'),(3091,679,2,'2006-02-15 05:09:17'),(3092,680,1,'2006-02-15 05:09:17'),(3093,680,1,'2006-02-15 05:09:17'),(3094,680,2,'2006-02-15 05:09:17'),(3095,680,2,'2006-02-15 05:09:17'),(3096,680,2,'2006-02-15 05:09:17'),(3097,680,2,'2006-02-15 05:09:17'),(3098,681,1,'2006-02-15 05:09:17'),(3099,681,1,'2006-02-15 05:09:17'),(3100,681,1,'2006-02-15 05:09:17'),(3101,681,2,'2006-02-15 05:09:17'),(3102,681,2,'2006-02-15 05:09:17'),(3103,681,2,'2006-02-15 05:09:17'),(3104,682,1,'2006-02-15 05:09:17'),(3105,682,1,'2006-02-15 05:09:17'),(3106,682,1,'2006-02-15 05:09:17'),(3107,683,1,'2006-02-15 05:09:17'),(3108,683,1,'2006-02-15 05:09:17'),(3109,683,1,'2006-02-15 05:09:17'),(3110,683,1,'2006-02-15 05:09:17'),(3111,683,2,'2006-02-15 05:09:17'),(3112,683,2,'2006-02-15 05:09:17'),(3113,683,2,'2006-02-15 05:09:17'),(3114,683,2,'2006-02-15 05:09:17'),(3115,684,2,'2006-02-15 05:09:17'),(3116,684,2,'2006-02-15 05:09:17'),(3117,685,2,'2006-02-15 05:09:17'),(3118,685,2,'2006-02-15 05:09:17'),(3119,686,1,'2006-02-15 05:09:17'),(3120,686,1,'2006-02-15 05:09:17'),(3121,686,1,'2006-02-15 05:09:17'),(3122,686,1,'2006-02-15 05:09:17'),(3123,687,1,'2006-02-15 05:09:17'),(3124,687,1,'2006-02-15 05:09:17'),(3125,687,1,'2006-02-15 05:09:17'),(3126,687,2,'2006-02-15 05:09:17'),(3127,687,2,'2006-02-15 05:09:17'),(3128,687,2,'2006-02-15 05:09:17'),(3129,687,2,'2006-02-15 05:09:17'),(3130,688,2,'2006-02-15 05:09:17'),(3131,688,2,'2006-02-15 05:09:17'),(3132,688,2,'2006-02-15 05:09:17'),(3133,688,2,'2006-02-15 05:09:17'),(3134,689,1,'2006-02-15 05:09:17'),(3135,689,1,'2006-02-15 05:09:17'),(3136,689,1,'2006-02-15 05:09:17'),(3137,689,1,'2006-02-15 05:09:17'),(3138,689,2,'2006-02-15 05:09:17'),(3139,689,2,'2006-02-15 05:09:17'),(3140,690,1,'2006-02-15 05:09:17'),(3141,690,1,'2006-02-15 05:09:17'),(3142,690,1,'2006-02-15 05:09:17'),(3143,690,1,'2006-02-15 05:09:17'),(3144,690,2,'2006-02-15 05:09:17'),(3145,690,2,'2006-02-15 05:09:17'),(3146,691,1,'2006-02-15 05:09:17'),(3147,691,1,'2006-02-15 05:09:17'),(3148,691,1,'2006-02-15 05:09:17'),(3149,691,2,'2006-02-15 05:09:17'),(3150,691,2,'2006-02-15 05:09:17'),(3151,692,2,'2006-02-15 05:09:17'),(3152,692,2,'2006-02-15 05:09:17'),(3153,692,2,'2006-02-15 05:09:17'),(3154,693,1,'2006-02-15 05:09:17'),(3155,693,1,'2006-02-15 05:09:17'),(3156,693,2,'2006-02-15 05:09:17'),(3157,693,2,'2006-02-15 05:09:17'),(3158,693,2,'2006-02-15 05:09:17'),(3159,694,1,'2006-02-15 05:09:17'),(3160,694,1,'2006-02-15 05:09:17'),(3161,694,1,'2006-02-15 05:09:17'),(3162,694,1,'2006-02-15 05:09:17'),(3163,694,2,'2006-02-15 05:09:17'),(3164,694,2,'2006-02-15 05:09:17'),(3165,695,1,'2006-02-15 05:09:17'),(3166,695,1,'2006-02-15 05:09:17'),(3167,696,1,'2006-02-15 05:09:17'),(3168,696,1,'2006-02-15 05:09:17'),(3169,696,2,'2006-02-15 05:09:17'),(3170,696,2,'2006-02-15 05:09:17'),(3171,696,2,'2006-02-15 05:09:17'),(3172,697,1,'2006-02-15 05:09:17'),(3173,697,1,'2006-02-15 05:09:17'),(3174,697,1,'2006-02-15 05:09:17'),(3175,697,1,'2006-02-15 05:09:17'),(3176,697,2,'2006-02-15 05:09:17'),(3177,697,2,'2006-02-15 05:09:17'),(3178,697,2,'2006-02-15 05:09:17'),(3179,697,2,'2006-02-15 05:09:17'),(3180,698,1,'2006-02-15 05:09:17'),(3181,698,1,'2006-02-15 05:09:17'),(3182,698,1,'2006-02-15 05:09:17'),(3183,698,1,'2006-02-15 05:09:17'),(3184,698,2,'2006-02-15 05:09:17'),(3185,698,2,'2006-02-15 05:09:17'),(3186,698,2,'2006-02-15 05:09:17'),(3187,699,1,'2006-02-15 05:09:17'),(3188,699,1,'2006-02-15 05:09:17'),(3189,700,2,'2006-02-15 05:09:17'),(3190,700,2,'2006-02-15 05:09:17'),(3191,700,2,'2006-02-15 05:09:17'),(3192,702,1,'2006-02-15 05:09:17'),(3193,702,1,'2006-02-15 05:09:17'),(3194,702,1,'2006-02-15 05:09:17'),(3195,702,1,'2006-02-15 05:09:17'),(3196,702,2,'2006-02-15 05:09:17'),(3197,702,2,'2006-02-15 05:09:17'),(3198,702,2,'2006-02-15 05:09:17'),(3199,702,2,'2006-02-15 05:09:17'),(3200,703,2,'2006-02-15 05:09:17'),(3201,703,2,'2006-02-15 05:09:17'),(3202,704,1,'2006-02-15 05:09:17'),(3203,704,1,'2006-02-15 05:09:17'),(3204,704,2,'2006-02-15 05:09:17'),(3205,704,2,'2006-02-15 05:09:17'),(3206,704,2,'2006-02-15 05:09:17'),(3207,705,1,'2006-02-15 05:09:17'),(3208,705,1,'2006-02-15 05:09:17'),(3209,705,1,'2006-02-15 05:09:17'),(3210,705,1,'2006-02-15 05:09:17'),(3211,706,1,'2006-02-15 05:09:17'),(3212,706,1,'2006-02-15 05:09:17'),(3213,706,2,'2006-02-15 05:09:17'),(3214,706,2,'2006-02-15 05:09:17'),(3215,706,2,'2006-02-15 05:09:17'),(3216,706,2,'2006-02-15 05:09:17'),(3217,707,1,'2006-02-15 05:09:17'),(3218,707,1,'2006-02-15 05:09:17'),(3219,707,2,'2006-02-15 05:09:17'),(3220,707,2,'2006-02-15 05:09:17'),(3221,707,2,'2006-02-15 05:09:17'),(3222,707,2,'2006-02-15 05:09:17'),(3223,708,1,'2006-02-15 05:09:17'),(3224,708,1,'2006-02-15 05:09:17'),(3225,708,2,'2006-02-15 05:09:17'),(3226,708,2,'2006-02-15 05:09:17'),(3227,709,1,'2006-02-15 05:09:17'),(3228,709,1,'2006-02-15 05:09:17'),(3229,709,2,'2006-02-15 05:09:17'),(3230,709,2,'2006-02-15 05:09:17'),(3231,709,2,'2006-02-15 05:09:17'),(3232,709,2,'2006-02-15 05:09:17'),(3233,710,1,'2006-02-15 05:09:17'),(3234,710,1,'2006-02-15 05:09:17'),(3235,710,1,'2006-02-15 05:09:17'),(3236,710,1,'2006-02-15 05:09:17'),(3237,710,2,'2006-02-15 05:09:17'),(3238,710,2,'2006-02-15 05:09:17'),(3239,711,2,'2006-02-15 05:09:17'),(3240,711,2,'2006-02-15 05:09:17'),(3241,711,2,'2006-02-15 05:09:17'),(3242,711,2,'2006-02-15 05:09:17'),(3243,714,2,'2006-02-15 05:09:17'),(3244,714,2,'2006-02-15 05:09:17'),(3245,714,2,'2006-02-15 05:09:17'),(3246,715,1,'2006-02-15 05:09:17'),(3247,715,1,'2006-02-15 05:09:17'),(3248,715,1,'2006-02-15 05:09:17'),(3249,715,1,'2006-02-15 05:09:17'),(3250,715,2,'2006-02-15 05:09:17'),(3251,715,2,'2006-02-15 05:09:17'),(3252,715,2,'2006-02-15 05:09:17'),(3253,716,1,'2006-02-15 05:09:17'),(3254,716,1,'2006-02-15 05:09:17'),(3255,716,2,'2006-02-15 05:09:17'),(3256,716,2,'2006-02-15 05:09:17'),(3257,716,2,'2006-02-15 05:09:17'),(3258,717,1,'2006-02-15 05:09:17'),(3259,717,1,'2006-02-15 05:09:17'),(3260,717,2,'2006-02-15 05:09:17'),(3261,717,2,'2006-02-15 05:09:17'),(3262,718,2,'2006-02-15 05:09:17'),(3263,718,2,'2006-02-15 05:09:17'),(3264,719,1,'2006-02-15 05:09:17'),(3265,719,1,'2006-02-15 05:09:17'),(3266,720,1,'2006-02-15 05:09:17'),(3267,720,1,'2006-02-15 05:09:17'),(3268,720,1,'2006-02-15 05:09:17'),(3269,720,2,'2006-02-15 05:09:17'),(3270,720,2,'2006-02-15 05:09:17'),(3271,720,2,'2006-02-15 05:09:17'),(3272,720,2,'2006-02-15 05:09:17'),(3273,721,1,'2006-02-15 05:09:17'),(3274,721,1,'2006-02-15 05:09:17'),(3275,722,1,'2006-02-15 05:09:17'),(3276,722,1,'2006-02-15 05:09:17'),(3277,722,2,'2006-02-15 05:09:17'),(3278,722,2,'2006-02-15 05:09:17'),(3279,723,1,'2006-02-15 05:09:17'),(3280,723,1,'2006-02-15 05:09:17'),(3281,723,1,'2006-02-15 05:09:17'),(3282,723,1,'2006-02-15 05:09:17'),(3283,723,2,'2006-02-15 05:09:17'),(3284,723,2,'2006-02-15 05:09:17'),(3285,723,2,'2006-02-15 05:09:17'),(3286,724,1,'2006-02-15 05:09:17'),(3287,724,1,'2006-02-15 05:09:17'),(3288,724,2,'2006-02-15 05:09:17'),(3289,724,2,'2006-02-15 05:09:17'),(3290,724,2,'2006-02-15 05:09:17'),(3291,724,2,'2006-02-15 05:09:17'),(3292,725,1,'2006-02-15 05:09:17'),(3293,725,1,'2006-02-15 05:09:17'),(3294,725,1,'2006-02-15 05:09:17'),(3295,725,2,'2006-02-15 05:09:17'),(3296,725,2,'2006-02-15 05:09:17'),(3297,725,2,'2006-02-15 05:09:17'),(3298,726,2,'2006-02-15 05:09:17'),(3299,726,2,'2006-02-15 05:09:17'),(3300,726,2,'2006-02-15 05:09:17'),(3301,727,1,'2006-02-15 05:09:17'),(3302,727,1,'2006-02-15 05:09:17'),(3303,727,2,'2006-02-15 05:09:17'),(3304,727,2,'2006-02-15 05:09:17'),(3305,727,2,'2006-02-15 05:09:17'),(3306,728,1,'2006-02-15 05:09:17'),(3307,728,1,'2006-02-15 05:09:17'),(3308,728,1,'2006-02-15 05:09:17'),(3309,728,2,'2006-02-15 05:09:17'),(3310,728,2,'2006-02-15 05:09:17'),(3311,729,2,'2006-02-15 05:09:17'),(3312,729,2,'2006-02-15 05:09:17'),(3313,729,2,'2006-02-15 05:09:17'),(3314,729,2,'2006-02-15 05:09:17'),(3315,730,1,'2006-02-15 05:09:17'),(3316,730,1,'2006-02-15 05:09:17'),(3317,730,1,'2006-02-15 05:09:17'),(3318,730,1,'2006-02-15 05:09:17'),(3319,730,2,'2006-02-15 05:09:17'),(3320,730,2,'2006-02-15 05:09:17'),(3321,730,2,'2006-02-15 05:09:17'),(3322,730,2,'2006-02-15 05:09:17'),(3323,731,2,'2006-02-15 05:09:17'),(3324,731,2,'2006-02-15 05:09:17'),(3325,731,2,'2006-02-15 05:09:17'),(3326,732,1,'2006-02-15 05:09:17'),(3327,732,1,'2006-02-15 05:09:17'),(3328,732,1,'2006-02-15 05:09:17'),(3329,732,1,'2006-02-15 05:09:17'),(3330,733,1,'2006-02-15 05:09:17'),(3331,733,1,'2006-02-15 05:09:17'),(3332,733,1,'2006-02-15 05:09:17'),(3333,733,1,'2006-02-15 05:09:17'),(3334,733,2,'2006-02-15 05:09:17'),(3335,733,2,'2006-02-15 05:09:17'),(3336,733,2,'2006-02-15 05:09:17'),(3337,734,1,'2006-02-15 05:09:17'),(3338,734,1,'2006-02-15 05:09:17'),(3339,734,2,'2006-02-15 05:09:17'),(3340,734,2,'2006-02-15 05:09:17'),(3341,734,2,'2006-02-15 05:09:17'),(3342,734,2,'2006-02-15 05:09:17'),(3343,735,1,'2006-02-15 05:09:17'),(3344,735,1,'2006-02-15 05:09:17'),(3345,735,1,'2006-02-15 05:09:17'),(3346,735,2,'2006-02-15 05:09:17'),(3347,735,2,'2006-02-15 05:09:17'),(3348,735,2,'2006-02-15 05:09:17'),(3349,735,2,'2006-02-15 05:09:17'),(3350,736,1,'2006-02-15 05:09:17'),(3351,736,1,'2006-02-15 05:09:17'),(3352,736,1,'2006-02-15 05:09:17'),(3353,736,1,'2006-02-15 05:09:17'),(3354,737,1,'2006-02-15 05:09:17'),(3355,737,1,'2006-02-15 05:09:17'),(3356,737,2,'2006-02-15 05:09:17'),(3357,737,2,'2006-02-15 05:09:17'),(3358,737,2,'2006-02-15 05:09:17'),(3359,737,2,'2006-02-15 05:09:17'),(3360,738,1,'2006-02-15 05:09:17'),(3361,738,1,'2006-02-15 05:09:17'),(3362,738,1,'2006-02-15 05:09:17'),(3363,738,1,'2006-02-15 05:09:17'),(3364,738,2,'2006-02-15 05:09:17'),(3365,738,2,'2006-02-15 05:09:17'),(3366,738,2,'2006-02-15 05:09:17'),(3367,738,2,'2006-02-15 05:09:17'),(3368,739,1,'2006-02-15 05:09:17'),(3369,739,1,'2006-02-15 05:09:17'),(3370,739,2,'2006-02-15 05:09:17'),(3371,739,2,'2006-02-15 05:09:17'),(3372,739,2,'2006-02-15 05:09:17'),(3373,740,2,'2006-02-15 05:09:17'),(3374,740,2,'2006-02-15 05:09:17'),(3375,740,2,'2006-02-15 05:09:17'),(3376,741,1,'2006-02-15 05:09:17'),(3377,741,1,'2006-02-15 05:09:17'),(3378,741,1,'2006-02-15 05:09:17'),(3379,741,1,'2006-02-15 05:09:17'),(3380,741,2,'2006-02-15 05:09:17'),(3381,741,2,'2006-02-15 05:09:17'),(3382,743,1,'2006-02-15 05:09:17'),(3383,743,1,'2006-02-15 05:09:17'),(3384,743,2,'2006-02-15 05:09:17'),(3385,743,2,'2006-02-15 05:09:17'),(3386,743,2,'2006-02-15 05:09:17'),(3387,743,2,'2006-02-15 05:09:17'),(3388,744,1,'2006-02-15 05:09:17'),(3389,744,1,'2006-02-15 05:09:17'),(3390,744,2,'2006-02-15 05:09:17'),(3391,744,2,'2006-02-15 05:09:17'),(3392,744,2,'2006-02-15 05:09:17'),(3393,745,1,'2006-02-15 05:09:17'),(3394,745,1,'2006-02-15 05:09:17'),(3395,745,1,'2006-02-15 05:09:17'),(3396,745,1,'2006-02-15 05:09:17'),(3397,745,2,'2006-02-15 05:09:17'),(3398,745,2,'2006-02-15 05:09:17'),(3399,745,2,'2006-02-15 05:09:17'),(3400,745,2,'2006-02-15 05:09:17'),(3401,746,1,'2006-02-15 05:09:17'),(3402,746,1,'2006-02-15 05:09:17'),(3403,746,2,'2006-02-15 05:09:17'),(3404,746,2,'2006-02-15 05:09:17'),(3405,746,2,'2006-02-15 05:09:17'),(3406,747,1,'2006-02-15 05:09:17'),(3407,747,1,'2006-02-15 05:09:17'),(3408,747,2,'2006-02-15 05:09:17'),(3409,747,2,'2006-02-15 05:09:17'),(3410,747,2,'2006-02-15 05:09:17'),(3411,748,1,'2006-02-15 05:09:17'),(3412,748,1,'2006-02-15 05:09:17'),(3413,748,1,'2006-02-15 05:09:17'),(3414,748,1,'2006-02-15 05:09:17'),(3415,748,2,'2006-02-15 05:09:17'),(3416,748,2,'2006-02-15 05:09:17'),(3417,748,2,'2006-02-15 05:09:17'),(3418,748,2,'2006-02-15 05:09:17'),(3419,749,1,'2006-02-15 05:09:17'),(3420,749,1,'2006-02-15 05:09:17'),(3421,749,2,'2006-02-15 05:09:17'),(3422,749,2,'2006-02-15 05:09:17'),(3423,750,1,'2006-02-15 05:09:17'),(3424,750,1,'2006-02-15 05:09:17'),(3425,750,1,'2006-02-15 05:09:17'),(3426,751,2,'2006-02-15 05:09:17'),(3427,751,2,'2006-02-15 05:09:17'),(3428,752,2,'2006-02-15 05:09:17'),(3429,752,2,'2006-02-15 05:09:17'),(3430,752,2,'2006-02-15 05:09:17'),(3431,753,1,'2006-02-15 05:09:17'),(3432,753,1,'2006-02-15 05:09:17'),(3433,753,1,'2006-02-15 05:09:17'),(3434,753,1,'2006-02-15 05:09:17'),(3435,753,2,'2006-02-15 05:09:17'),(3436,753,2,'2006-02-15 05:09:17'),(3437,753,2,'2006-02-15 05:09:17'),(3438,753,2,'2006-02-15 05:09:17'),(3439,754,2,'2006-02-15 05:09:17'),(3440,754,2,'2006-02-15 05:09:17'),(3441,755,1,'2006-02-15 05:09:17'),(3442,755,1,'2006-02-15 05:09:17'),(3443,755,1,'2006-02-15 05:09:17'),(3444,755,1,'2006-02-15 05:09:17'),(3445,755,2,'2006-02-15 05:09:17'),(3446,755,2,'2006-02-15 05:09:17'),(3447,755,2,'2006-02-15 05:09:17'),(3448,756,2,'2006-02-15 05:09:17'),(3449,756,2,'2006-02-15 05:09:17'),(3450,756,2,'2006-02-15 05:09:17'),(3451,757,1,'2006-02-15 05:09:17'),(3452,757,1,'2006-02-15 05:09:17'),(3453,757,1,'2006-02-15 05:09:17'),(3454,757,2,'2006-02-15 05:09:17'),(3455,757,2,'2006-02-15 05:09:17'),(3456,758,2,'2006-02-15 05:09:17'),(3457,758,2,'2006-02-15 05:09:17'),(3458,758,2,'2006-02-15 05:09:17'),(3459,759,1,'2006-02-15 05:09:17'),(3460,759,1,'2006-02-15 05:09:17'),(3461,759,2,'2006-02-15 05:09:17'),(3462,759,2,'2006-02-15 05:09:17'),(3463,759,2,'2006-02-15 05:09:17'),(3464,759,2,'2006-02-15 05:09:17'),(3465,760,1,'2006-02-15 05:09:17'),(3466,760,1,'2006-02-15 05:09:17'),(3467,760,1,'2006-02-15 05:09:17'),(3468,760,2,'2006-02-15 05:09:17'),(3469,760,2,'2006-02-15 05:09:17'),(3470,760,2,'2006-02-15 05:09:17'),(3471,760,2,'2006-02-15 05:09:17'),(3472,761,2,'2006-02-15 05:09:17'),(3473,761,2,'2006-02-15 05:09:17'),(3474,761,2,'2006-02-15 05:09:17'),(3475,762,2,'2006-02-15 05:09:17'),(3476,762,2,'2006-02-15 05:09:17'),(3477,762,2,'2006-02-15 05:09:17'),(3478,762,2,'2006-02-15 05:09:17'),(3479,763,1,'2006-02-15 05:09:17'),(3480,763,1,'2006-02-15 05:09:17'),(3481,763,1,'2006-02-15 05:09:17'),(3482,763,2,'2006-02-15 05:09:17'),(3483,763,2,'2006-02-15 05:09:17'),(3484,764,1,'2006-02-15 05:09:17'),(3485,764,1,'2006-02-15 05:09:17'),(3486,764,1,'2006-02-15 05:09:17'),(3487,764,1,'2006-02-15 05:09:17'),(3488,764,2,'2006-02-15 05:09:17'),(3489,764,2,'2006-02-15 05:09:17'),(3490,764,2,'2006-02-15 05:09:17'),(3491,764,2,'2006-02-15 05:09:17'),(3492,765,1,'2006-02-15 05:09:17'),(3493,765,1,'2006-02-15 05:09:17'),(3494,765,1,'2006-02-15 05:09:17'),(3495,765,1,'2006-02-15 05:09:17'),(3496,766,1,'2006-02-15 05:09:17'),(3497,766,1,'2006-02-15 05:09:17'),(3498,766,1,'2006-02-15 05:09:17'),(3499,767,1,'2006-02-15 05:09:17'),(3500,767,1,'2006-02-15 05:09:17'),(3501,767,1,'2006-02-15 05:09:17'),(3502,767,1,'2006-02-15 05:09:17'),(3503,767,2,'2006-02-15 05:09:17'),(3504,767,2,'2006-02-15 05:09:17'),(3505,767,2,'2006-02-15 05:09:17'),(3506,767,2,'2006-02-15 05:09:17'),(3507,768,1,'2006-02-15 05:09:17'),(3508,768,1,'2006-02-15 05:09:17'),(3509,768,1,'2006-02-15 05:09:17'),(3510,768,2,'2006-02-15 05:09:17'),(3511,768,2,'2006-02-15 05:09:17'),(3512,768,2,'2006-02-15 05:09:17'),(3513,769,2,'2006-02-15 05:09:17'),(3514,769,2,'2006-02-15 05:09:17'),(3515,770,2,'2006-02-15 05:09:17'),(3516,770,2,'2006-02-15 05:09:17'),(3517,770,2,'2006-02-15 05:09:17'),(3518,771,1,'2006-02-15 05:09:17'),(3519,771,1,'2006-02-15 05:09:17'),(3520,771,1,'2006-02-15 05:09:17'),(3521,771,2,'2006-02-15 05:09:17'),(3522,771,2,'2006-02-15 05:09:17'),(3523,771,2,'2006-02-15 05:09:17'),(3524,771,2,'2006-02-15 05:09:17'),(3525,772,1,'2006-02-15 05:09:17'),(3526,772,1,'2006-02-15 05:09:17'),(3527,772,1,'2006-02-15 05:09:17'),(3528,772,1,'2006-02-15 05:09:17'),(3529,772,2,'2006-02-15 05:09:17'),(3530,772,2,'2006-02-15 05:09:17'),(3531,773,1,'2006-02-15 05:09:17'),(3532,773,1,'2006-02-15 05:09:17'),(3533,773,1,'2006-02-15 05:09:17'),(3534,773,1,'2006-02-15 05:09:17'),(3535,773,2,'2006-02-15 05:09:17'),(3536,773,2,'2006-02-15 05:09:17'),(3537,773,2,'2006-02-15 05:09:17'),(3538,773,2,'2006-02-15 05:09:17'),(3539,774,1,'2006-02-15 05:09:17'),(3540,774,1,'2006-02-15 05:09:17'),(3541,774,1,'2006-02-15 05:09:17'),(3542,774,1,'2006-02-15 05:09:17'),(3543,775,1,'2006-02-15 05:09:17'),(3544,775,1,'2006-02-15 05:09:17'),(3545,775,1,'2006-02-15 05:09:17'),(3546,775,2,'2006-02-15 05:09:17'),(3547,775,2,'2006-02-15 05:09:17'),(3548,776,1,'2006-02-15 05:09:17'),(3549,776,1,'2006-02-15 05:09:17'),(3550,776,2,'2006-02-15 05:09:17'),(3551,776,2,'2006-02-15 05:09:17'),(3552,776,2,'2006-02-15 05:09:17'),(3553,777,1,'2006-02-15 05:09:17'),(3554,777,1,'2006-02-15 05:09:17'),(3555,777,1,'2006-02-15 05:09:17'),(3556,777,2,'2006-02-15 05:09:17'),(3557,777,2,'2006-02-15 05:09:17'),(3558,777,2,'2006-02-15 05:09:17'),(3559,778,1,'2006-02-15 05:09:17'),(3560,778,1,'2006-02-15 05:09:17'),(3561,778,1,'2006-02-15 05:09:17'),(3562,778,1,'2006-02-15 05:09:17'),(3563,778,2,'2006-02-15 05:09:17'),(3564,778,2,'2006-02-15 05:09:17'),(3565,779,2,'2006-02-15 05:09:17'),(3566,779,2,'2006-02-15 05:09:17'),(3567,780,2,'2006-02-15 05:09:17'),(3568,780,2,'2006-02-15 05:09:17'),(3569,780,2,'2006-02-15 05:09:17'),(3570,781,2,'2006-02-15 05:09:17'),(3571,781,2,'2006-02-15 05:09:17'),(3572,782,1,'2006-02-15 05:09:17'),(3573,782,1,'2006-02-15 05:09:17'),(3574,782,1,'2006-02-15 05:09:17'),(3575,782,2,'2006-02-15 05:09:17'),(3576,782,2,'2006-02-15 05:09:17'),(3577,782,2,'2006-02-15 05:09:17'),(3578,783,1,'2006-02-15 05:09:17'),(3579,783,1,'2006-02-15 05:09:17'),(3580,783,1,'2006-02-15 05:09:17'),(3581,783,1,'2006-02-15 05:09:17'),(3582,784,1,'2006-02-15 05:09:17'),(3583,784,1,'2006-02-15 05:09:17'),(3584,784,1,'2006-02-15 05:09:17'),(3585,784,2,'2006-02-15 05:09:17'),(3586,784,2,'2006-02-15 05:09:17'),(3587,784,2,'2006-02-15 05:09:17'),(3588,785,1,'2006-02-15 05:09:17'),(3589,785,1,'2006-02-15 05:09:17'),(3590,785,1,'2006-02-15 05:09:17'),(3591,785,1,'2006-02-15 05:09:17'),(3592,785,2,'2006-02-15 05:09:17'),(3593,785,2,'2006-02-15 05:09:17'),(3594,786,1,'2006-02-15 05:09:17'),(3595,786,1,'2006-02-15 05:09:17'),(3596,786,1,'2006-02-15 05:09:17'),(3597,786,2,'2006-02-15 05:09:17'),(3598,786,2,'2006-02-15 05:09:17'),(3599,786,2,'2006-02-15 05:09:17'),(3600,786,2,'2006-02-15 05:09:17'),(3601,787,1,'2006-02-15 05:09:17'),(3602,787,1,'2006-02-15 05:09:17'),(3603,787,1,'2006-02-15 05:09:17'),(3604,788,1,'2006-02-15 05:09:17'),(3605,788,1,'2006-02-15 05:09:17'),(3606,788,2,'2006-02-15 05:09:17'),(3607,788,2,'2006-02-15 05:09:17'),(3608,789,1,'2006-02-15 05:09:17'),(3609,789,1,'2006-02-15 05:09:17'),(3610,789,1,'2006-02-15 05:09:17'),(3611,789,1,'2006-02-15 05:09:17'),(3612,789,2,'2006-02-15 05:09:17'),(3613,789,2,'2006-02-15 05:09:17'),(3614,789,2,'2006-02-15 05:09:17'),(3615,789,2,'2006-02-15 05:09:17'),(3616,790,1,'2006-02-15 05:09:17'),(3617,790,1,'2006-02-15 05:09:17'),(3618,790,1,'2006-02-15 05:09:17'),(3619,790,1,'2006-02-15 05:09:17'),(3620,790,2,'2006-02-15 05:09:17'),(3621,790,2,'2006-02-15 05:09:17'),(3622,790,2,'2006-02-15 05:09:17'),(3623,791,1,'2006-02-15 05:09:17'),(3624,791,1,'2006-02-15 05:09:17'),(3625,791,2,'2006-02-15 05:09:17'),(3626,791,2,'2006-02-15 05:09:17'),(3627,791,2,'2006-02-15 05:09:17'),(3628,791,2,'2006-02-15 05:09:17'),(3629,792,2,'2006-02-15 05:09:17'),(3630,792,2,'2006-02-15 05:09:17'),(3631,792,2,'2006-02-15 05:09:17'),(3632,793,1,'2006-02-15 05:09:17'),(3633,793,1,'2006-02-15 05:09:17'),(3634,793,1,'2006-02-15 05:09:17'),(3635,793,1,'2006-02-15 05:09:17'),(3636,794,1,'2006-02-15 05:09:17'),(3637,794,1,'2006-02-15 05:09:17'),(3638,794,2,'2006-02-15 05:09:17'),(3639,794,2,'2006-02-15 05:09:17'),(3640,795,1,'2006-02-15 05:09:17'),(3641,795,1,'2006-02-15 05:09:17'),(3642,795,1,'2006-02-15 05:09:17'),(3643,795,1,'2006-02-15 05:09:17'),(3644,796,1,'2006-02-15 05:09:17'),(3645,796,1,'2006-02-15 05:09:17'),(3646,796,2,'2006-02-15 05:09:17'),(3647,796,2,'2006-02-15 05:09:17'),(3648,796,2,'2006-02-15 05:09:17'),(3649,797,1,'2006-02-15 05:09:17'),(3650,797,1,'2006-02-15 05:09:17'),(3651,797,2,'2006-02-15 05:09:17'),(3652,797,2,'2006-02-15 05:09:17'),(3653,797,2,'2006-02-15 05:09:17'),(3654,798,1,'2006-02-15 05:09:17'),(3655,798,1,'2006-02-15 05:09:17'),(3656,798,2,'2006-02-15 05:09:17'),(3657,798,2,'2006-02-15 05:09:17'),(3658,799,1,'2006-02-15 05:09:17'),(3659,799,1,'2006-02-15 05:09:17'),(3660,800,1,'2006-02-15 05:09:17'),(3661,800,1,'2006-02-15 05:09:17'),(3662,800,2,'2006-02-15 05:09:17'),(3663,800,2,'2006-02-15 05:09:17'),(3664,800,2,'2006-02-15 05:09:17'),(3665,800,2,'2006-02-15 05:09:17'),(3666,803,1,'2006-02-15 05:09:17'),(3667,803,1,'2006-02-15 05:09:17'),(3668,803,1,'2006-02-15 05:09:17'),(3669,803,1,'2006-02-15 05:09:17'),(3670,803,2,'2006-02-15 05:09:17'),(3671,803,2,'2006-02-15 05:09:17'),(3672,804,1,'2006-02-15 05:09:17'),(3673,804,1,'2006-02-15 05:09:17'),(3674,804,1,'2006-02-15 05:09:17'),(3675,804,1,'2006-02-15 05:09:17'),(3676,804,2,'2006-02-15 05:09:17'),(3677,804,2,'2006-02-15 05:09:17'),(3678,804,2,'2006-02-15 05:09:17'),(3679,805,1,'2006-02-15 05:09:17'),(3680,805,1,'2006-02-15 05:09:17'),(3681,805,2,'2006-02-15 05:09:17'),(3682,805,2,'2006-02-15 05:09:17'),(3683,805,2,'2006-02-15 05:09:17'),(3684,806,1,'2006-02-15 05:09:17'),(3685,806,1,'2006-02-15 05:09:17'),(3686,806,1,'2006-02-15 05:09:17'),(3687,806,2,'2006-02-15 05:09:17'),(3688,806,2,'2006-02-15 05:09:17'),(3689,807,1,'2006-02-15 05:09:17'),(3690,807,1,'2006-02-15 05:09:17'),(3691,807,1,'2006-02-15 05:09:17'),(3692,807,2,'2006-02-15 05:09:17'),(3693,807,2,'2006-02-15 05:09:17'),(3694,808,2,'2006-02-15 05:09:17'),(3695,808,2,'2006-02-15 05:09:17'),(3696,809,2,'2006-02-15 05:09:17'),(3697,809,2,'2006-02-15 05:09:17'),(3698,809,2,'2006-02-15 05:09:17'),(3699,809,2,'2006-02-15 05:09:17'),(3700,810,1,'2006-02-15 05:09:17'),(3701,810,1,'2006-02-15 05:09:17'),(3702,810,1,'2006-02-15 05:09:17'),(3703,810,1,'2006-02-15 05:09:17'),(3704,810,2,'2006-02-15 05:09:17'),(3705,810,2,'2006-02-15 05:09:17'),(3706,810,2,'2006-02-15 05:09:17'),(3707,811,1,'2006-02-15 05:09:17'),(3708,811,1,'2006-02-15 05:09:17'),(3709,811,1,'2006-02-15 05:09:17'),(3710,812,1,'2006-02-15 05:09:17'),(3711,812,1,'2006-02-15 05:09:17'),(3712,812,1,'2006-02-15 05:09:17'),(3713,812,2,'2006-02-15 05:09:17'),(3714,812,2,'2006-02-15 05:09:17'),(3715,812,2,'2006-02-15 05:09:17'),(3716,813,2,'2006-02-15 05:09:17'),(3717,813,2,'2006-02-15 05:09:17'),(3718,813,2,'2006-02-15 05:09:17'),(3719,813,2,'2006-02-15 05:09:17'),(3720,814,1,'2006-02-15 05:09:17'),(3721,814,1,'2006-02-15 05:09:17'),(3722,814,1,'2006-02-15 05:09:17'),(3723,814,2,'2006-02-15 05:09:17'),(3724,814,2,'2006-02-15 05:09:17'),(3725,814,2,'2006-02-15 05:09:17'),(3726,814,2,'2006-02-15 05:09:17'),(3727,815,1,'2006-02-15 05:09:17'),(3728,815,1,'2006-02-15 05:09:17'),(3729,815,1,'2006-02-15 05:09:17'),(3730,816,1,'2006-02-15 05:09:17'),(3731,816,1,'2006-02-15 05:09:17'),(3732,816,1,'2006-02-15 05:09:17'),(3733,816,1,'2006-02-15 05:09:17'),(3734,816,2,'2006-02-15 05:09:17'),(3735,816,2,'2006-02-15 05:09:17'),(3736,816,2,'2006-02-15 05:09:17'),(3737,817,1,'2006-02-15 05:09:17'),(3738,817,1,'2006-02-15 05:09:17'),(3739,818,1,'2006-02-15 05:09:17'),(3740,818,1,'2006-02-15 05:09:17'),(3741,818,1,'2006-02-15 05:09:17'),(3742,818,2,'2006-02-15 05:09:17'),(3743,818,2,'2006-02-15 05:09:17'),(3744,819,1,'2006-02-15 05:09:17'),(3745,819,1,'2006-02-15 05:09:17'),(3746,819,1,'2006-02-15 05:09:17'),(3747,820,1,'2006-02-15 05:09:17'),(3748,820,1,'2006-02-15 05:09:17'),(3749,820,1,'2006-02-15 05:09:17'),(3750,820,1,'2006-02-15 05:09:17'),(3751,820,2,'2006-02-15 05:09:17'),(3752,820,2,'2006-02-15 05:09:17'),(3753,821,2,'2006-02-15 05:09:17'),(3754,821,2,'2006-02-15 05:09:17'),(3755,821,2,'2006-02-15 05:09:17'),(3756,821,2,'2006-02-15 05:09:17'),(3757,822,2,'2006-02-15 05:09:17'),(3758,822,2,'2006-02-15 05:09:17'),(3759,823,1,'2006-02-15 05:09:17'),(3760,823,1,'2006-02-15 05:09:17'),(3761,823,1,'2006-02-15 05:09:17'),(3762,823,2,'2006-02-15 05:09:17'),(3763,823,2,'2006-02-15 05:09:17'),(3764,823,2,'2006-02-15 05:09:17'),(3765,823,2,'2006-02-15 05:09:17'),(3766,824,2,'2006-02-15 05:09:17'),(3767,824,2,'2006-02-15 05:09:17'),(3768,824,2,'2006-02-15 05:09:17'),(3769,824,2,'2006-02-15 05:09:17'),(3770,825,1,'2006-02-15 05:09:17'),(3771,825,1,'2006-02-15 05:09:17'),(3772,825,1,'2006-02-15 05:09:17'),(3773,826,2,'2006-02-15 05:09:17'),(3774,826,2,'2006-02-15 05:09:17'),(3775,827,1,'2006-02-15 05:09:17'),(3776,827,1,'2006-02-15 05:09:17'),(3777,827,2,'2006-02-15 05:09:17'),(3778,827,2,'2006-02-15 05:09:17'),(3779,827,2,'2006-02-15 05:09:17'),(3780,827,2,'2006-02-15 05:09:17'),(3781,828,2,'2006-02-15 05:09:17'),(3782,828,2,'2006-02-15 05:09:17'),(3783,828,2,'2006-02-15 05:09:17'),(3784,828,2,'2006-02-15 05:09:17'),(3785,829,1,'2006-02-15 05:09:17'),(3786,829,1,'2006-02-15 05:09:17'),(3787,829,2,'2006-02-15 05:09:17'),(3788,829,2,'2006-02-15 05:09:17'),(3789,829,2,'2006-02-15 05:09:17'),(3790,830,2,'2006-02-15 05:09:17'),(3791,830,2,'2006-02-15 05:09:17'),(3792,830,2,'2006-02-15 05:09:17'),(3793,830,2,'2006-02-15 05:09:17'),(3794,831,1,'2006-02-15 05:09:17'),(3795,831,1,'2006-02-15 05:09:17'),(3796,831,1,'2006-02-15 05:09:17'),(3797,832,1,'2006-02-15 05:09:17'),(3798,832,1,'2006-02-15 05:09:17'),(3799,832,1,'2006-02-15 05:09:17'),(3800,832,1,'2006-02-15 05:09:17'),(3801,833,1,'2006-02-15 05:09:17'),(3802,833,1,'2006-02-15 05:09:17'),(3803,833,1,'2006-02-15 05:09:17'),(3804,833,2,'2006-02-15 05:09:17'),(3805,833,2,'2006-02-15 05:09:17'),(3806,833,2,'2006-02-15 05:09:17'),(3807,833,2,'2006-02-15 05:09:17'),(3808,834,2,'2006-02-15 05:09:17'),(3809,834,2,'2006-02-15 05:09:17'),(3810,834,2,'2006-02-15 05:09:17'),(3811,835,1,'2006-02-15 05:09:17'),(3812,835,1,'2006-02-15 05:09:17'),(3813,835,1,'2006-02-15 05:09:17'),(3814,835,1,'2006-02-15 05:09:17'),(3815,835,2,'2006-02-15 05:09:17'),(3816,835,2,'2006-02-15 05:09:17'),(3817,835,2,'2006-02-15 05:09:17'),(3818,835,2,'2006-02-15 05:09:17'),(3819,836,1,'2006-02-15 05:09:17'),(3820,836,1,'2006-02-15 05:09:17'),(3821,836,1,'2006-02-15 05:09:17'),(3822,837,2,'2006-02-15 05:09:17'),(3823,837,2,'2006-02-15 05:09:17'),(3824,837,2,'2006-02-15 05:09:17'),(3825,838,1,'2006-02-15 05:09:17'),(3826,838,1,'2006-02-15 05:09:17'),(3827,838,2,'2006-02-15 05:09:17'),(3828,838,2,'2006-02-15 05:09:17'),(3829,838,2,'2006-02-15 05:09:17'),(3830,838,2,'2006-02-15 05:09:17'),(3831,839,2,'2006-02-15 05:09:17'),(3832,839,2,'2006-02-15 05:09:17'),(3833,840,1,'2006-02-15 05:09:17'),(3834,840,1,'2006-02-15 05:09:17'),(3835,840,1,'2006-02-15 05:09:17'),(3836,840,1,'2006-02-15 05:09:17'),(3837,841,1,'2006-02-15 05:09:17'),(3838,841,1,'2006-02-15 05:09:17'),(3839,841,1,'2006-02-15 05:09:17'),(3840,841,2,'2006-02-15 05:09:17'),(3841,841,2,'2006-02-15 05:09:17'),(3842,841,2,'2006-02-15 05:09:17'),(3843,841,2,'2006-02-15 05:09:17'),(3844,842,1,'2006-02-15 05:09:17'),(3845,842,1,'2006-02-15 05:09:17'),(3846,842,2,'2006-02-15 05:09:17'),(3847,842,2,'2006-02-15 05:09:17'),(3848,843,1,'2006-02-15 05:09:17'),(3849,843,1,'2006-02-15 05:09:17'),(3850,843,1,'2006-02-15 05:09:17'),(3851,843,1,'2006-02-15 05:09:17'),(3852,843,2,'2006-02-15 05:09:17'),(3853,843,2,'2006-02-15 05:09:17'),(3854,843,2,'2006-02-15 05:09:17'),(3855,844,1,'2006-02-15 05:09:17'),(3856,844,1,'2006-02-15 05:09:17'),(3857,844,2,'2006-02-15 05:09:17'),(3858,844,2,'2006-02-15 05:09:17'),(3859,845,1,'2006-02-15 05:09:17'),(3860,845,1,'2006-02-15 05:09:17'),(3861,845,1,'2006-02-15 05:09:17'),(3862,845,1,'2006-02-15 05:09:17'),(3863,845,2,'2006-02-15 05:09:17'),(3864,845,2,'2006-02-15 05:09:17'),(3865,845,2,'2006-02-15 05:09:17'),(3866,846,1,'2006-02-15 05:09:17'),(3867,846,1,'2006-02-15 05:09:17'),(3868,846,1,'2006-02-15 05:09:17'),(3869,846,1,'2006-02-15 05:09:17'),(3870,846,2,'2006-02-15 05:09:17'),(3871,846,2,'2006-02-15 05:09:17'),(3872,846,2,'2006-02-15 05:09:17'),(3873,846,2,'2006-02-15 05:09:17'),(3874,847,2,'2006-02-15 05:09:17'),(3875,847,2,'2006-02-15 05:09:17'),(3876,847,2,'2006-02-15 05:09:17'),(3877,847,2,'2006-02-15 05:09:17'),(3878,848,1,'2006-02-15 05:09:17'),(3879,848,1,'2006-02-15 05:09:17'),(3880,848,1,'2006-02-15 05:09:17'),(3881,849,1,'2006-02-15 05:09:17'),(3882,849,1,'2006-02-15 05:09:17'),(3883,849,1,'2006-02-15 05:09:17'),(3884,849,1,'2006-02-15 05:09:17'),(3885,849,2,'2006-02-15 05:09:17'),(3886,849,2,'2006-02-15 05:09:17'),(3887,849,2,'2006-02-15 05:09:17'),(3888,849,2,'2006-02-15 05:09:17'),(3889,850,1,'2006-02-15 05:09:17'),(3890,850,1,'2006-02-15 05:09:17'),(3891,850,1,'2006-02-15 05:09:17'),(3892,850,2,'2006-02-15 05:09:17'),(3893,850,2,'2006-02-15 05:09:17'),(3894,850,2,'2006-02-15 05:09:17'),(3895,850,2,'2006-02-15 05:09:17'),(3896,851,1,'2006-02-15 05:09:17'),(3897,851,1,'2006-02-15 05:09:17'),(3898,851,1,'2006-02-15 05:09:17'),(3899,851,2,'2006-02-15 05:09:17'),(3900,851,2,'2006-02-15 05:09:17'),(3901,851,2,'2006-02-15 05:09:17'),(3902,852,1,'2006-02-15 05:09:17'),(3903,852,1,'2006-02-15 05:09:17'),(3904,852,1,'2006-02-15 05:09:17'),(3905,852,1,'2006-02-15 05:09:17'),(3906,852,2,'2006-02-15 05:09:17'),(3907,852,2,'2006-02-15 05:09:17'),(3908,852,2,'2006-02-15 05:09:17'),(3909,853,1,'2006-02-15 05:09:17'),(3910,853,1,'2006-02-15 05:09:17'),(3911,853,1,'2006-02-15 05:09:17'),(3912,854,2,'2006-02-15 05:09:17'),(3913,854,2,'2006-02-15 05:09:17'),(3914,854,2,'2006-02-15 05:09:17'),(3915,854,2,'2006-02-15 05:09:17'),(3916,855,1,'2006-02-15 05:09:17'),(3917,855,1,'2006-02-15 05:09:17'),(3918,855,2,'2006-02-15 05:09:17'),(3919,855,2,'2006-02-15 05:09:17'),(3920,856,1,'2006-02-15 05:09:17'),(3921,856,1,'2006-02-15 05:09:17'),(3922,856,1,'2006-02-15 05:09:17'),(3923,856,1,'2006-02-15 05:09:17'),(3924,856,2,'2006-02-15 05:09:17'),(3925,856,2,'2006-02-15 05:09:17'),(3926,856,2,'2006-02-15 05:09:17'),(3927,856,2,'2006-02-15 05:09:17'),(3928,857,1,'2006-02-15 05:09:17'),(3929,857,1,'2006-02-15 05:09:17'),(3930,857,1,'2006-02-15 05:09:17'),(3931,857,2,'2006-02-15 05:09:17'),(3932,857,2,'2006-02-15 05:09:17'),(3933,857,2,'2006-02-15 05:09:17'),(3934,857,2,'2006-02-15 05:09:17'),(3935,858,2,'2006-02-15 05:09:17'),(3936,858,2,'2006-02-15 05:09:17'),(3937,858,2,'2006-02-15 05:09:17'),(3938,858,2,'2006-02-15 05:09:17'),(3939,859,1,'2006-02-15 05:09:17'),(3940,859,1,'2006-02-15 05:09:17'),(3941,859,1,'2006-02-15 05:09:17'),(3942,859,2,'2006-02-15 05:09:17'),(3943,859,2,'2006-02-15 05:09:17'),(3944,859,2,'2006-02-15 05:09:17'),(3945,861,1,'2006-02-15 05:09:17'),(3946,861,1,'2006-02-15 05:09:17'),(3947,861,1,'2006-02-15 05:09:17'),(3948,861,2,'2006-02-15 05:09:17'),(3949,861,2,'2006-02-15 05:09:17'),(3950,861,2,'2006-02-15 05:09:17'),(3951,862,1,'2006-02-15 05:09:17'),(3952,862,1,'2006-02-15 05:09:17'),(3953,862,1,'2006-02-15 05:09:17'),(3954,862,2,'2006-02-15 05:09:17'),(3955,862,2,'2006-02-15 05:09:17'),(3956,863,1,'2006-02-15 05:09:17'),(3957,863,1,'2006-02-15 05:09:17'),(3958,863,1,'2006-02-15 05:09:17'),(3959,863,1,'2006-02-15 05:09:17'),(3960,863,2,'2006-02-15 05:09:17'),(3961,863,2,'2006-02-15 05:09:17'),(3962,863,2,'2006-02-15 05:09:17'),(3963,864,1,'2006-02-15 05:09:17'),(3964,864,1,'2006-02-15 05:09:17'),(3965,864,1,'2006-02-15 05:09:17'),(3966,864,1,'2006-02-15 05:09:17'),(3967,864,2,'2006-02-15 05:09:17'),(3968,864,2,'2006-02-15 05:09:17'),(3969,865,1,'2006-02-15 05:09:17'),(3970,865,1,'2006-02-15 05:09:17'),(3971,865,1,'2006-02-15 05:09:17'),(3972,865,1,'2006-02-15 05:09:17'),(3973,865,2,'2006-02-15 05:09:17'),(3974,865,2,'2006-02-15 05:09:17'),(3975,866,2,'2006-02-15 05:09:17'),(3976,866,2,'2006-02-15 05:09:17'),(3977,867,1,'2006-02-15 05:09:17'),(3978,867,1,'2006-02-15 05:09:17'),(3979,867,1,'2006-02-15 05:09:17'),(3980,867,1,'2006-02-15 05:09:17'),(3981,868,1,'2006-02-15 05:09:17'),(3982,868,1,'2006-02-15 05:09:17'),(3983,868,1,'2006-02-15 05:09:17'),(3984,869,1,'2006-02-15 05:09:17'),(3985,869,1,'2006-02-15 05:09:17'),(3986,869,1,'2006-02-15 05:09:17'),(3987,869,1,'2006-02-15 05:09:17'),(3988,869,2,'2006-02-15 05:09:17'),(3989,869,2,'2006-02-15 05:09:17'),(3990,869,2,'2006-02-15 05:09:17'),(3991,870,1,'2006-02-15 05:09:17'),(3992,870,1,'2006-02-15 05:09:17'),(3993,870,1,'2006-02-15 05:09:17'),(3994,870,1,'2006-02-15 05:09:17'),(3995,870,2,'2006-02-15 05:09:17'),(3996,870,2,'2006-02-15 05:09:17'),(3997,870,2,'2006-02-15 05:09:17'),(3998,870,2,'2006-02-15 05:09:17'),(3999,871,1,'2006-02-15 05:09:17'),(4000,871,1,'2006-02-15 05:09:17'),(4001,871,2,'2006-02-15 05:09:17'),(4002,871,2,'2006-02-15 05:09:17'),(4003,871,2,'2006-02-15 05:09:17'),(4004,872,2,'2006-02-15 05:09:17'),(4005,872,2,'2006-02-15 05:09:17'),(4006,872,2,'2006-02-15 05:09:17'),(4007,873,1,'2006-02-15 05:09:17'),(4008,873,1,'2006-02-15 05:09:17'),(4009,873,1,'2006-02-15 05:09:17'),(4010,873,1,'2006-02-15 05:09:17'),(4011,873,2,'2006-02-15 05:09:17'),(4012,873,2,'2006-02-15 05:09:17'),(4013,873,2,'2006-02-15 05:09:17'),(4014,873,2,'2006-02-15 05:09:17'),(4015,875,1,'2006-02-15 05:09:17'),(4016,875,1,'2006-02-15 05:09:17'),(4017,875,1,'2006-02-15 05:09:17'),(4018,875,2,'2006-02-15 05:09:17'),(4019,875,2,'2006-02-15 05:09:17'),(4020,875,2,'2006-02-15 05:09:17'),(4021,875,2,'2006-02-15 05:09:17'),(4022,876,1,'2006-02-15 05:09:17'),(4023,876,1,'2006-02-15 05:09:17'),(4024,877,1,'2006-02-15 05:09:17'),(4025,877,1,'2006-02-15 05:09:17'),(4026,877,1,'2006-02-15 05:09:17'),(4027,877,2,'2006-02-15 05:09:17'),(4028,877,2,'2006-02-15 05:09:17'),(4029,878,2,'2006-02-15 05:09:17'),(4030,878,2,'2006-02-15 05:09:17'),(4031,878,2,'2006-02-15 05:09:17'),(4032,878,2,'2006-02-15 05:09:17'),(4033,879,1,'2006-02-15 05:09:17'),(4034,879,1,'2006-02-15 05:09:17'),(4035,879,1,'2006-02-15 05:09:17'),(4036,879,1,'2006-02-15 05:09:17'),(4037,879,2,'2006-02-15 05:09:17'),(4038,879,2,'2006-02-15 05:09:17'),(4039,879,2,'2006-02-15 05:09:17'),(4040,880,1,'2006-02-15 05:09:17'),(4041,880,1,'2006-02-15 05:09:17'),(4042,880,1,'2006-02-15 05:09:17'),(4043,880,1,'2006-02-15 05:09:17'),(4044,880,2,'2006-02-15 05:09:17'),(4045,880,2,'2006-02-15 05:09:17'),(4046,880,2,'2006-02-15 05:09:17'),(4047,880,2,'2006-02-15 05:09:17'),(4048,881,2,'2006-02-15 05:09:17'),(4049,881,2,'2006-02-15 05:09:17'),(4050,881,2,'2006-02-15 05:09:17'),(4051,881,2,'2006-02-15 05:09:17'),(4052,882,1,'2006-02-15 05:09:17'),(4053,882,1,'2006-02-15 05:09:17'),(4054,882,1,'2006-02-15 05:09:17'),(4055,882,1,'2006-02-15 05:09:17'),(4056,883,2,'2006-02-15 05:09:17'),(4057,883,2,'2006-02-15 05:09:17'),(4058,884,2,'2006-02-15 05:09:17'),(4059,884,2,'2006-02-15 05:09:17'),(4060,884,2,'2006-02-15 05:09:17'),(4061,885,1,'2006-02-15 05:09:17'),(4062,885,1,'2006-02-15 05:09:17'),(4063,886,1,'2006-02-15 05:09:17'),(4064,886,1,'2006-02-15 05:09:17'),(4065,886,1,'2006-02-15 05:09:17'),(4066,886,1,'2006-02-15 05:09:17'),(4067,887,1,'2006-02-15 05:09:17'),(4068,887,1,'2006-02-15 05:09:17'),(4069,887,1,'2006-02-15 05:09:17'),(4070,887,1,'2006-02-15 05:09:17'),(4071,887,2,'2006-02-15 05:09:17'),(4072,887,2,'2006-02-15 05:09:17'),(4073,888,1,'2006-02-15 05:09:17'),(4074,888,1,'2006-02-15 05:09:17'),(4075,888,1,'2006-02-15 05:09:17'),(4076,888,1,'2006-02-15 05:09:17'),(4077,889,1,'2006-02-15 05:09:17'),(4078,889,1,'2006-02-15 05:09:17'),(4079,889,1,'2006-02-15 05:09:17'),(4080,890,1,'2006-02-15 05:09:17'),(4081,890,1,'2006-02-15 05:09:17'),(4082,890,1,'2006-02-15 05:09:17'),(4083,890,2,'2006-02-15 05:09:17'),(4084,890,2,'2006-02-15 05:09:17'),(4085,890,2,'2006-02-15 05:09:17'),(4086,890,2,'2006-02-15 05:09:17'),(4087,891,1,'2006-02-15 05:09:17'),(4088,891,1,'2006-02-15 05:09:17'),(4089,891,1,'2006-02-15 05:09:17'),(4090,891,2,'2006-02-15 05:09:17'),(4091,891,2,'2006-02-15 05:09:17'),(4092,891,2,'2006-02-15 05:09:17'),(4093,891,2,'2006-02-15 05:09:17'),(4094,892,1,'2006-02-15 05:09:17'),(4095,892,1,'2006-02-15 05:09:17'),(4096,892,1,'2006-02-15 05:09:17'),(4097,892,2,'2006-02-15 05:09:17'),(4098,892,2,'2006-02-15 05:09:17'),(4099,892,2,'2006-02-15 05:09:17'),(4100,892,2,'2006-02-15 05:09:17'),(4101,893,1,'2006-02-15 05:09:17'),(4102,893,1,'2006-02-15 05:09:17'),(4103,893,1,'2006-02-15 05:09:17'),(4104,893,1,'2006-02-15 05:09:17'),(4105,893,2,'2006-02-15 05:09:17'),(4106,893,2,'2006-02-15 05:09:17'),(4107,893,2,'2006-02-15 05:09:17'),(4108,893,2,'2006-02-15 05:09:17'),(4109,894,1,'2006-02-15 05:09:17'),(4110,894,1,'2006-02-15 05:09:17'),(4111,894,1,'2006-02-15 05:09:17'),(4112,894,2,'2006-02-15 05:09:17'),(4113,894,2,'2006-02-15 05:09:17'),(4114,895,1,'2006-02-15 05:09:17'),(4115,895,1,'2006-02-15 05:09:17'),(4116,895,1,'2006-02-15 05:09:17'),(4117,895,1,'2006-02-15 05:09:17'),(4118,895,2,'2006-02-15 05:09:17'),(4119,895,2,'2006-02-15 05:09:17'),(4120,895,2,'2006-02-15 05:09:17'),(4121,896,1,'2006-02-15 05:09:17'),(4122,896,1,'2006-02-15 05:09:17'),(4123,896,2,'2006-02-15 05:09:17'),(4124,896,2,'2006-02-15 05:09:17'),(4125,897,1,'2006-02-15 05:09:17'),(4126,897,1,'2006-02-15 05:09:17'),(4127,897,1,'2006-02-15 05:09:17'),(4128,897,1,'2006-02-15 05:09:17'),(4129,897,2,'2006-02-15 05:09:17'),(4130,897,2,'2006-02-15 05:09:17'),(4131,897,2,'2006-02-15 05:09:17'),(4132,897,2,'2006-02-15 05:09:17'),(4133,898,1,'2006-02-15 05:09:17'),(4134,898,1,'2006-02-15 05:09:17'),(4135,898,1,'2006-02-15 05:09:17'),(4136,898,2,'2006-02-15 05:09:17'),(4137,898,2,'2006-02-15 05:09:17'),(4138,899,1,'2006-02-15 05:09:17'),(4139,899,1,'2006-02-15 05:09:17'),(4140,899,1,'2006-02-15 05:09:17'),(4141,900,1,'2006-02-15 05:09:17'),(4142,900,1,'2006-02-15 05:09:17'),(4143,900,2,'2006-02-15 05:09:17'),(4144,900,2,'2006-02-15 05:09:17'),(4145,901,1,'2006-02-15 05:09:17'),(4146,901,1,'2006-02-15 05:09:17'),(4147,901,1,'2006-02-15 05:09:17'),(4148,901,1,'2006-02-15 05:09:17'),(4149,901,2,'2006-02-15 05:09:17'),(4150,901,2,'2006-02-15 05:09:17'),(4151,901,2,'2006-02-15 05:09:17'),(4152,902,1,'2006-02-15 05:09:17'),(4153,902,1,'2006-02-15 05:09:17'),(4154,902,1,'2006-02-15 05:09:17'),(4155,902,1,'2006-02-15 05:09:17'),(4156,902,2,'2006-02-15 05:09:17'),(4157,902,2,'2006-02-15 05:09:17'),(4158,902,2,'2006-02-15 05:09:17'),(4159,903,2,'2006-02-15 05:09:17'),(4160,903,2,'2006-02-15 05:09:17'),(4161,904,1,'2006-02-15 05:09:17'),(4162,904,1,'2006-02-15 05:09:17'),(4163,905,1,'2006-02-15 05:09:17'),(4164,905,1,'2006-02-15 05:09:17'),(4165,905,1,'2006-02-15 05:09:17'),(4166,906,1,'2006-02-15 05:09:17'),(4167,906,1,'2006-02-15 05:09:17'),(4168,906,2,'2006-02-15 05:09:17'),(4169,906,2,'2006-02-15 05:09:17'),(4170,906,2,'2006-02-15 05:09:17'),(4171,907,1,'2006-02-15 05:09:17'),(4172,907,1,'2006-02-15 05:09:17'),(4173,907,1,'2006-02-15 05:09:17'),(4174,907,1,'2006-02-15 05:09:17'),(4175,908,1,'2006-02-15 05:09:17'),(4176,908,1,'2006-02-15 05:09:17'),(4177,908,2,'2006-02-15 05:09:17'),(4178,908,2,'2006-02-15 05:09:17'),(4179,910,2,'2006-02-15 05:09:17'),(4180,910,2,'2006-02-15 05:09:17'),(4181,911,1,'2006-02-15 05:09:17'),(4182,911,1,'2006-02-15 05:09:17'),(4183,911,1,'2006-02-15 05:09:17'),(4184,911,1,'2006-02-15 05:09:17'),(4185,911,2,'2006-02-15 05:09:17'),(4186,911,2,'2006-02-15 05:09:17'),(4187,911,2,'2006-02-15 05:09:17'),(4188,911,2,'2006-02-15 05:09:17'),(4189,912,1,'2006-02-15 05:09:17'),(4190,912,1,'2006-02-15 05:09:17'),(4191,912,1,'2006-02-15 05:09:17'),(4192,912,2,'2006-02-15 05:09:17'),(4193,912,2,'2006-02-15 05:09:17'),(4194,912,2,'2006-02-15 05:09:17'),(4195,913,1,'2006-02-15 05:09:17'),(4196,913,1,'2006-02-15 05:09:17'),(4197,913,1,'2006-02-15 05:09:17'),(4198,913,1,'2006-02-15 05:09:17'),(4199,913,2,'2006-02-15 05:09:17'),(4200,913,2,'2006-02-15 05:09:17'),(4201,914,1,'2006-02-15 05:09:17'),(4202,914,1,'2006-02-15 05:09:17'),(4203,914,2,'2006-02-15 05:09:17'),(4204,914,2,'2006-02-15 05:09:17'),(4205,914,2,'2006-02-15 05:09:17'),(4206,914,2,'2006-02-15 05:09:17'),(4207,915,1,'2006-02-15 05:09:17'),(4208,915,1,'2006-02-15 05:09:17'),(4209,915,1,'2006-02-15 05:09:17'),(4210,915,1,'2006-02-15 05:09:17'),(4211,915,2,'2006-02-15 05:09:17'),(4212,915,2,'2006-02-15 05:09:17'),(4213,916,1,'2006-02-15 05:09:17'),(4214,916,1,'2006-02-15 05:09:17'),(4215,916,2,'2006-02-15 05:09:17'),(4216,916,2,'2006-02-15 05:09:17'),(4217,917,1,'2006-02-15 05:09:17'),(4218,917,1,'2006-02-15 05:09:17'),(4219,917,1,'2006-02-15 05:09:17'),(4220,917,2,'2006-02-15 05:09:17'),(4221,917,2,'2006-02-15 05:09:17'),(4222,918,2,'2006-02-15 05:09:17'),(4223,918,2,'2006-02-15 05:09:17'),(4224,918,2,'2006-02-15 05:09:17'),(4225,918,2,'2006-02-15 05:09:17'),(4226,919,1,'2006-02-15 05:09:17'),(4227,919,1,'2006-02-15 05:09:17'),(4228,919,1,'2006-02-15 05:09:17'),(4229,919,1,'2006-02-15 05:09:17'),(4230,920,1,'2006-02-15 05:09:17'),(4231,920,1,'2006-02-15 05:09:17'),(4232,920,1,'2006-02-15 05:09:17'),(4233,920,2,'2006-02-15 05:09:17'),(4234,920,2,'2006-02-15 05:09:17'),(4235,921,1,'2006-02-15 05:09:17'),(4236,921,1,'2006-02-15 05:09:17'),(4237,921,2,'2006-02-15 05:09:17'),(4238,921,2,'2006-02-15 05:09:17'),(4239,922,1,'2006-02-15 05:09:17'),(4240,922,1,'2006-02-15 05:09:17'),(4241,922,1,'2006-02-15 05:09:17'),(4242,922,2,'2006-02-15 05:09:17'),(4243,922,2,'2006-02-15 05:09:17'),(4244,922,2,'2006-02-15 05:09:17'),(4245,922,2,'2006-02-15 05:09:17'),(4246,923,2,'2006-02-15 05:09:17'),(4247,923,2,'2006-02-15 05:09:17'),(4248,923,2,'2006-02-15 05:09:17'),(4249,924,1,'2006-02-15 05:09:17'),(4250,924,1,'2006-02-15 05:09:17'),(4251,924,2,'2006-02-15 05:09:17'),(4252,924,2,'2006-02-15 05:09:17'),(4253,924,2,'2006-02-15 05:09:17'),(4254,925,1,'2006-02-15 05:09:17'),(4255,925,1,'2006-02-15 05:09:17'),(4256,925,1,'2006-02-15 05:09:17'),(4257,925,2,'2006-02-15 05:09:17'),(4258,925,2,'2006-02-15 05:09:17'),(4259,926,2,'2006-02-15 05:09:17'),(4260,926,2,'2006-02-15 05:09:17'),(4261,927,1,'2006-02-15 05:09:17'),(4262,927,1,'2006-02-15 05:09:17'),(4263,927,1,'2006-02-15 05:09:17'),(4264,927,1,'2006-02-15 05:09:17'),(4265,928,1,'2006-02-15 05:09:17'),(4266,928,1,'2006-02-15 05:09:17'),(4267,928,1,'2006-02-15 05:09:17'),(4268,929,1,'2006-02-15 05:09:17'),(4269,929,1,'2006-02-15 05:09:17'),(4270,929,1,'2006-02-15 05:09:17'),(4271,929,1,'2006-02-15 05:09:17'),(4272,930,1,'2006-02-15 05:09:17'),(4273,930,1,'2006-02-15 05:09:17'),(4274,930,1,'2006-02-15 05:09:17'),(4275,930,2,'2006-02-15 05:09:17'),(4276,930,2,'2006-02-15 05:09:17'),(4277,930,2,'2006-02-15 05:09:17'),(4278,931,2,'2006-02-15 05:09:17'),(4279,931,2,'2006-02-15 05:09:17'),(4280,931,2,'2006-02-15 05:09:17'),(4281,932,1,'2006-02-15 05:09:17'),(4282,932,1,'2006-02-15 05:09:17'),(4283,932,2,'2006-02-15 05:09:17'),(4284,932,2,'2006-02-15 05:09:17'),(4285,933,1,'2006-02-15 05:09:17'),(4286,933,1,'2006-02-15 05:09:17'),(4287,933,1,'2006-02-15 05:09:17'),(4288,934,2,'2006-02-15 05:09:17'),(4289,934,2,'2006-02-15 05:09:17'),(4290,934,2,'2006-02-15 05:09:17'),(4291,935,2,'2006-02-15 05:09:17'),(4292,935,2,'2006-02-15 05:09:17'),(4293,936,1,'2006-02-15 05:09:17'),(4294,936,1,'2006-02-15 05:09:17'),(4295,936,2,'2006-02-15 05:09:17'),(4296,936,2,'2006-02-15 05:09:17'),(4297,936,2,'2006-02-15 05:09:17'),(4298,936,2,'2006-02-15 05:09:17'),(4299,937,1,'2006-02-15 05:09:17'),(4300,937,1,'2006-02-15 05:09:17'),(4301,937,2,'2006-02-15 05:09:17'),(4302,937,2,'2006-02-15 05:09:17'),(4303,937,2,'2006-02-15 05:09:17'),(4304,938,1,'2006-02-15 05:09:17'),(4305,938,1,'2006-02-15 05:09:17'),(4306,938,1,'2006-02-15 05:09:17'),(4307,938,1,'2006-02-15 05:09:17'),(4308,938,2,'2006-02-15 05:09:17'),(4309,938,2,'2006-02-15 05:09:17'),(4310,939,2,'2006-02-15 05:09:17'),(4311,939,2,'2006-02-15 05:09:17'),(4312,939,2,'2006-02-15 05:09:17'),(4313,939,2,'2006-02-15 05:09:17'),(4314,940,1,'2006-02-15 05:09:17'),(4315,940,1,'2006-02-15 05:09:17'),(4316,940,1,'2006-02-15 05:09:17'),(4317,941,1,'2006-02-15 05:09:17'),(4318,941,1,'2006-02-15 05:09:17'),(4319,941,1,'2006-02-15 05:09:17'),(4320,941,1,'2006-02-15 05:09:17'),(4321,941,2,'2006-02-15 05:09:17'),(4322,941,2,'2006-02-15 05:09:17'),(4323,941,2,'2006-02-15 05:09:17'),(4324,942,1,'2006-02-15 05:09:17'),(4325,942,1,'2006-02-15 05:09:17'),(4326,942,2,'2006-02-15 05:09:17'),(4327,942,2,'2006-02-15 05:09:17'),(4328,944,1,'2006-02-15 05:09:17'),(4329,944,1,'2006-02-15 05:09:17'),(4330,944,2,'2006-02-15 05:09:17'),(4331,944,2,'2006-02-15 05:09:17'),(4332,944,2,'2006-02-15 05:09:17'),(4333,945,1,'2006-02-15 05:09:17'),(4334,945,1,'2006-02-15 05:09:17'),(4335,945,1,'2006-02-15 05:09:17'),(4336,945,1,'2006-02-15 05:09:17'),(4337,945,2,'2006-02-15 05:09:17'),(4338,945,2,'2006-02-15 05:09:17'),(4339,945,2,'2006-02-15 05:09:17'),(4340,945,2,'2006-02-15 05:09:17'),(4341,946,2,'2006-02-15 05:09:17'),(4342,946,2,'2006-02-15 05:09:17'),(4343,946,2,'2006-02-15 05:09:17'),(4344,946,2,'2006-02-15 05:09:17'),(4345,947,1,'2006-02-15 05:09:17'),(4346,947,1,'2006-02-15 05:09:17'),(4347,948,1,'2006-02-15 05:09:17'),(4348,948,1,'2006-02-15 05:09:17'),(4349,948,2,'2006-02-15 05:09:17'),(4350,948,2,'2006-02-15 05:09:17'),(4351,948,2,'2006-02-15 05:09:17'),(4352,948,2,'2006-02-15 05:09:17'),(4353,949,1,'2006-02-15 05:09:17'),(4354,949,1,'2006-02-15 05:09:17'),(4355,949,1,'2006-02-15 05:09:17'),(4356,949,1,'2006-02-15 05:09:17'),(4357,949,2,'2006-02-15 05:09:17'),(4358,949,2,'2006-02-15 05:09:17'),(4359,951,1,'2006-02-15 05:09:17'),(4360,951,1,'2006-02-15 05:09:17'),(4361,951,1,'2006-02-15 05:09:17'),(4362,951,2,'2006-02-15 05:09:17'),(4363,951,2,'2006-02-15 05:09:17'),(4364,951,2,'2006-02-15 05:09:17'),(4365,951,2,'2006-02-15 05:09:17'),(4366,952,1,'2006-02-15 05:09:17'),(4367,952,1,'2006-02-15 05:09:17'),(4368,952,1,'2006-02-15 05:09:17'),(4369,953,1,'2006-02-15 05:09:17'),(4370,953,1,'2006-02-15 05:09:17'),(4371,953,1,'2006-02-15 05:09:17'),(4372,953,1,'2006-02-15 05:09:17'),(4373,953,2,'2006-02-15 05:09:17'),(4374,953,2,'2006-02-15 05:09:17'),(4375,956,1,'2006-02-15 05:09:17'),(4376,956,1,'2006-02-15 05:09:17'),(4377,956,1,'2006-02-15 05:09:17'),(4378,956,1,'2006-02-15 05:09:17'),(4379,957,1,'2006-02-15 05:09:17'),(4380,957,1,'2006-02-15 05:09:17'),(4381,957,1,'2006-02-15 05:09:17'),(4382,957,2,'2006-02-15 05:09:17'),(4383,957,2,'2006-02-15 05:09:17'),(4384,958,1,'2006-02-15 05:09:17'),(4385,958,1,'2006-02-15 05:09:17'),(4386,958,1,'2006-02-15 05:09:17'),(4387,958,2,'2006-02-15 05:09:17'),(4388,958,2,'2006-02-15 05:09:17'),(4389,958,2,'2006-02-15 05:09:17'),(4390,959,1,'2006-02-15 05:09:17'),(4391,959,1,'2006-02-15 05:09:17'),(4392,960,2,'2006-02-15 05:09:17'),(4393,960,2,'2006-02-15 05:09:17'),(4394,960,2,'2006-02-15 05:09:17'),(4395,961,1,'2006-02-15 05:09:17'),(4396,961,1,'2006-02-15 05:09:17'),(4397,961,1,'2006-02-15 05:09:17'),(4398,961,2,'2006-02-15 05:09:17'),(4399,961,2,'2006-02-15 05:09:17'),(4400,962,1,'2006-02-15 05:09:17'),(4401,962,1,'2006-02-15 05:09:17'),(4402,962,1,'2006-02-15 05:09:17'),(4403,962,1,'2006-02-15 05:09:17'),(4404,963,1,'2006-02-15 05:09:17'),(4405,963,1,'2006-02-15 05:09:17'),(4406,963,2,'2006-02-15 05:09:17'),(4407,963,2,'2006-02-15 05:09:17'),(4408,963,2,'2006-02-15 05:09:17'),(4409,964,1,'2006-02-15 05:09:17'),(4410,964,1,'2006-02-15 05:09:17'),(4411,964,1,'2006-02-15 05:09:17'),(4412,964,2,'2006-02-15 05:09:17'),(4413,964,2,'2006-02-15 05:09:17'),(4414,965,1,'2006-02-15 05:09:17'),(4415,965,1,'2006-02-15 05:09:17'),(4416,966,1,'2006-02-15 05:09:17'),(4417,966,1,'2006-02-15 05:09:17'),(4418,966,2,'2006-02-15 05:09:17'),(4419,966,2,'2006-02-15 05:09:17'),(4420,966,2,'2006-02-15 05:09:17'),(4421,966,2,'2006-02-15 05:09:17'),(4422,967,1,'2006-02-15 05:09:17'),(4423,967,1,'2006-02-15 05:09:17'),(4424,967,1,'2006-02-15 05:09:17'),(4425,967,2,'2006-02-15 05:09:17'),(4426,967,2,'2006-02-15 05:09:17'),(4427,968,1,'2006-02-15 05:09:17'),(4428,968,1,'2006-02-15 05:09:17'),(4429,968,1,'2006-02-15 05:09:17'),(4430,969,1,'2006-02-15 05:09:17'),(4431,969,1,'2006-02-15 05:09:17'),(4432,969,1,'2006-02-15 05:09:17'),(4433,969,1,'2006-02-15 05:09:17'),(4434,970,1,'2006-02-15 05:09:17'),(4435,970,1,'2006-02-15 05:09:17'),(4436,970,1,'2006-02-15 05:09:17'),(4437,970,2,'2006-02-15 05:09:17'),(4438,970,2,'2006-02-15 05:09:17'),(4439,970,2,'2006-02-15 05:09:17'),(4440,970,2,'2006-02-15 05:09:17'),(4441,971,1,'2006-02-15 05:09:17'),(4442,971,1,'2006-02-15 05:09:17'),(4443,971,1,'2006-02-15 05:09:17'),(4444,971,1,'2006-02-15 05:09:17'),(4445,972,1,'2006-02-15 05:09:17'),(4446,972,1,'2006-02-15 05:09:17'),(4447,972,1,'2006-02-15 05:09:17'),(4448,972,2,'2006-02-15 05:09:17'),(4449,972,2,'2006-02-15 05:09:17'),(4450,972,2,'2006-02-15 05:09:17'),(4451,973,1,'2006-02-15 05:09:17'),(4452,973,1,'2006-02-15 05:09:17'),(4453,973,1,'2006-02-15 05:09:17'),(4454,973,1,'2006-02-15 05:09:17'),(4455,973,2,'2006-02-15 05:09:17'),(4456,973,2,'2006-02-15 05:09:17'),(4457,973,2,'2006-02-15 05:09:17'),(4458,973,2,'2006-02-15 05:09:17'),(4459,974,1,'2006-02-15 05:09:17'),(4460,974,1,'2006-02-15 05:09:17'),(4461,975,1,'2006-02-15 05:09:17'),(4462,975,1,'2006-02-15 05:09:17'),(4463,975,2,'2006-02-15 05:09:17'),(4464,975,2,'2006-02-15 05:09:17'),(4465,975,2,'2006-02-15 05:09:17'),(4466,976,1,'2006-02-15 05:09:17'),(4467,976,1,'2006-02-15 05:09:17'),(4468,976,2,'2006-02-15 05:09:17'),(4469,976,2,'2006-02-15 05:09:17'),(4470,976,2,'2006-02-15 05:09:17'),(4471,976,2,'2006-02-15 05:09:17'),(4472,977,2,'2006-02-15 05:09:17'),(4473,977,2,'2006-02-15 05:09:17'),(4474,977,2,'2006-02-15 05:09:17'),(4475,978,1,'2006-02-15 05:09:17'),(4476,978,1,'2006-02-15 05:09:17'),(4477,978,1,'2006-02-15 05:09:17'),(4478,979,1,'2006-02-15 05:09:17'),(4479,979,1,'2006-02-15 05:09:17'),(4480,979,1,'2006-02-15 05:09:17'),(4481,979,1,'2006-02-15 05:09:17'),(4482,979,2,'2006-02-15 05:09:17'),(4483,979,2,'2006-02-15 05:09:17'),(4484,979,2,'2006-02-15 05:09:17'),(4485,980,1,'2006-02-15 05:09:17'),(4486,980,1,'2006-02-15 05:09:17'),(4487,980,1,'2006-02-15 05:09:17'),(4488,980,2,'2006-02-15 05:09:17'),(4489,980,2,'2006-02-15 05:09:17'),(4490,981,1,'2006-02-15 05:09:17'),(4491,981,1,'2006-02-15 05:09:17'),(4492,981,1,'2006-02-15 05:09:17'),(4493,981,2,'2006-02-15 05:09:17'),(4494,981,2,'2006-02-15 05:09:17'),(4495,981,2,'2006-02-15 05:09:17'),(4496,982,1,'2006-02-15 05:09:17'),(4497,982,1,'2006-02-15 05:09:17'),(4498,982,1,'2006-02-15 05:09:17'),(4499,982,2,'2006-02-15 05:09:17'),(4500,982,2,'2006-02-15 05:09:17'),(4501,982,2,'2006-02-15 05:09:17'),(4502,982,2,'2006-02-15 05:09:17'),(4503,983,1,'2006-02-15 05:09:17'),(4504,983,1,'2006-02-15 05:09:17'),(4505,983,1,'2006-02-15 05:09:17'),(4506,984,1,'2006-02-15 05:09:17'),(4507,984,1,'2006-02-15 05:09:17'),(4508,985,1,'2006-02-15 05:09:17'),(4509,985,1,'2006-02-15 05:09:17'),(4510,985,1,'2006-02-15 05:09:17'),(4511,985,1,'2006-02-15 05:09:17'),(4512,985,2,'2006-02-15 05:09:17'),(4513,985,2,'2006-02-15 05:09:17'),(4514,985,2,'2006-02-15 05:09:17'),(4515,986,1,'2006-02-15 05:09:17'),(4516,986,1,'2006-02-15 05:09:17'),(4517,986,1,'2006-02-15 05:09:17'),(4518,986,1,'2006-02-15 05:09:17'),(4519,986,2,'2006-02-15 05:09:17'),(4520,986,2,'2006-02-15 05:09:17'),(4521,987,1,'2006-02-15 05:09:17'),(4522,987,1,'2006-02-15 05:09:17'),(4523,987,2,'2006-02-15 05:09:17'),(4524,987,2,'2006-02-15 05:09:17'),(4525,988,1,'2006-02-15 05:09:17'),(4526,988,1,'2006-02-15 05:09:17'),(4527,988,1,'2006-02-15 05:09:17'),(4528,988,2,'2006-02-15 05:09:17'),(4529,988,2,'2006-02-15 05:09:17'),(4530,989,1,'2006-02-15 05:09:17'),(4531,989,1,'2006-02-15 05:09:17'),(4532,989,1,'2006-02-15 05:09:17'),(4533,989,1,'2006-02-15 05:09:17'),(4534,989,2,'2006-02-15 05:09:17'),(4535,989,2,'2006-02-15 05:09:17'),(4536,990,2,'2006-02-15 05:09:17'),(4537,990,2,'2006-02-15 05:09:17'),(4538,991,1,'2006-02-15 05:09:17'),(4539,991,1,'2006-02-15 05:09:17'),(4540,991,2,'2006-02-15 05:09:17'),(4541,991,2,'2006-02-15 05:09:17'),(4542,991,2,'2006-02-15 05:09:17'),(4543,992,2,'2006-02-15 05:09:17'),(4544,992,2,'2006-02-15 05:09:17'),(4545,992,2,'2006-02-15 05:09:17'),(4546,992,2,'2006-02-15 05:09:17'),(4547,993,1,'2006-02-15 05:09:17'),(4548,993,1,'2006-02-15 05:09:17'),(4549,993,1,'2006-02-15 05:09:17'),(4550,993,1,'2006-02-15 05:09:17'),(4551,993,2,'2006-02-15 05:09:17'),(4552,993,2,'2006-02-15 05:09:17'),(4553,993,2,'2006-02-15 05:09:17'),(4554,994,1,'2006-02-15 05:09:17'),(4555,994,1,'2006-02-15 05:09:17'),(4556,994,1,'2006-02-15 05:09:17'),(4557,995,1,'2006-02-15 05:09:17'),(4558,995,1,'2006-02-15 05:09:17'),(4559,995,1,'2006-02-15 05:09:17'),(4560,995,1,'2006-02-15 05:09:17'),(4561,995,2,'2006-02-15 05:09:17'),(4562,995,2,'2006-02-15 05:09:17'),(4563,996,1,'2006-02-15 05:09:17'),(4564,996,1,'2006-02-15 05:09:17'),(4565,997,1,'2006-02-15 05:09:17'),(4566,997,1,'2006-02-15 05:09:17'),(4567,998,2,'2006-02-15 05:09:17'),(4568,998,2,'2006-02-15 05:09:17'),(4569,999,1,'2006-02-15 05:09:17'),(4570,999,1,'2006-02-15 05:09:17'),(4571,999,2,'2006-02-15 05:09:17'),(4572,999,2,'2006-02-15 05:09:17'),(4573,999,2,'2006-02-15 05:09:17'),(4574,1000,1,'2006-02-15 05:09:17'),(4575,1000,1,'2006-02-15 05:09:17'),(4576,1000,1,'2006-02-15 05:09:17'),(4577,1000,1,'2006-02-15 05:09:17'),(4578,1000,2,'2006-02-15 05:09:17'),(4579,1000,2,'2006-02-15 05:09:17'),(4580,1000,2,'2006-02-15 05:09:17'),(4581,1000,2,'2006-02-15 05:09:17'); +COMMIT; + +-- +-- Dumping data for table language +-- + +SET AUTOCOMMIT=0; +INSERT INTO language VALUES (1,'English','2006-02-15 05:02:19'),(2,'Italian','2006-02-15 05:02:19'),(3,'Japanese','2006-02-15 05:02:19'),(4,'Mandarin','2006-02-15 05:02:19'),(5,'French','2006-02-15 05:02:19'),(6,'German','2006-02-15 05:02:19'); +COMMIT; + +-- +-- Dumping data for table payment +-- + +SET AUTOCOMMIT=0; +INSERT INTO payment VALUES (1,1,1,76,'2.99','2005-05-25 11:30:37','2006-02-15 22:12:30'),(2,1,1,573,'0.99','2005-05-28 10:35:23','2006-02-15 22:12:30'),(3,1,1,1185,'5.99','2005-06-15 00:54:12','2006-02-15 22:12:30'),(4,1,2,1422,'0.99','2005-06-15 18:02:53','2006-02-15 22:12:30'),(5,1,2,1476,'9.99','2005-06-15 21:08:46','2006-02-15 22:12:30'),(6,1,1,1725,'4.99','2005-06-16 15:18:57','2006-02-15 22:12:30'),(7,1,1,2308,'4.99','2005-06-18 08:41:48','2006-02-15 22:12:30'),(8,1,2,2363,'0.99','2005-06-18 13:33:59','2006-02-15 22:12:30'),(9,1,1,3284,'3.99','2005-06-21 06:24:45','2006-02-15 22:12:30'),(10,1,2,4526,'5.99','2005-07-08 03:17:05','2006-02-15 22:12:30'),(11,1,1,4611,'5.99','2005-07-08 07:33:56','2006-02-15 22:12:30'),(12,1,1,5244,'4.99','2005-07-09 13:24:07','2006-02-15 22:12:30'),(13,1,1,5326,'4.99','2005-07-09 16:38:01','2006-02-15 22:12:30'),(14,1,1,6163,'7.99','2005-07-11 10:13:46','2006-02-15 22:12:30'),(15,1,2,7273,'2.99','2005-07-27 11:31:22','2006-02-15 22:12:30'),(16,1,1,7841,'4.99','2005-07-28 09:04:45','2006-02-15 22:12:30'),(17,1,2,8033,'4.99','2005-07-28 16:18:23','2006-02-15 22:12:30'),(18,1,1,8074,'0.99','2005-07-28 17:33:39','2006-02-15 22:12:30'),(19,1,2,8116,'0.99','2005-07-28 19:20:07','2006-02-15 22:12:30'),(20,1,2,8326,'2.99','2005-07-29 03:58:49','2006-02-15 22:12:30'),(21,1,2,9571,'2.99','2005-07-31 02:42:18','2006-02-15 22:12:30'),(22,1,2,10437,'4.99','2005-08-01 08:51:04','2006-02-15 22:12:30'),(23,1,2,11299,'3.99','2005-08-02 15:36:52','2006-02-15 22:12:30'),(24,1,1,11367,'0.99','2005-08-02 18:01:38','2006-02-15 22:12:30'),(25,1,2,11824,'4.99','2005-08-17 12:37:54','2006-02-15 22:12:30'),(26,1,1,12250,'0.99','2005-08-18 03:57:29','2006-02-15 22:12:30'),(27,1,2,13068,'0.99','2005-08-19 09:55:16','2006-02-15 22:12:30'),(28,1,2,13176,'2.99','2005-08-19 13:56:54','2006-02-15 22:12:30'),(29,1,1,14762,'0.99','2005-08-21 23:33:57','2006-02-15 22:12:30'),(30,1,1,14825,'1.99','2005-08-22 01:27:57','2006-02-15 22:12:30'),(31,1,2,15298,'2.99','2005-08-22 19:41:37','2006-02-15 22:12:30'),(32,1,1,15315,'5.99','2005-08-22 20:03:46','2006-02-15 22:12:30'),(33,2,1,320,'4.99','2005-05-27 00:09:24','2006-02-15 22:12:30'),(34,2,1,2128,'2.99','2005-06-17 20:54:58','2006-02-15 22:12:30'),(35,2,1,5636,'2.99','2005-07-10 06:31:24','2006-02-15 22:12:30'),(36,2,1,5755,'6.99','2005-07-10 12:38:56','2006-02-15 22:12:30'),(37,2,2,7346,'4.99','2005-07-27 14:30:42','2006-02-15 22:12:30'),(38,2,1,7376,'5.99','2005-07-27 15:23:02','2006-02-15 22:12:30'),(39,2,2,7459,'5.99','2005-07-27 18:40:20','2006-02-15 22:12:30'),(40,2,2,8230,'5.99','2005-07-29 00:12:59','2006-02-15 22:12:30'),(41,2,1,8598,'2.99','2005-07-29 12:56:59','2006-02-15 22:12:30'),(42,2,2,8705,'5.99','2005-07-29 17:14:29','2006-02-15 22:12:30'),(43,2,1,9031,'4.99','2005-07-30 06:06:10','2006-02-15 22:12:30'),(44,2,2,9236,'10.99','2005-07-30 13:47:43','2006-02-15 22:12:30'),(45,2,2,9248,'0.99','2005-07-30 14:14:11','2006-02-15 22:12:30'),(46,2,2,9296,'6.99','2005-07-30 16:21:13','2006-02-15 22:12:30'),(47,2,2,9465,'6.99','2005-07-30 22:39:53','2006-02-15 22:12:30'),(48,2,1,10136,'2.99','2005-07-31 21:58:56','2006-02-15 22:12:30'),(49,2,1,10466,'0.99','2005-08-01 09:45:26','2006-02-15 22:12:30'),(50,2,1,10918,'0.99','2005-08-02 02:10:56','2006-02-15 22:12:30'),(51,2,1,11087,'5.99','2005-08-02 07:41:41','2006-02-15 22:12:30'),(52,2,1,11177,'6.99','2005-08-02 10:43:48','2006-02-15 22:12:30'),(53,2,2,11256,'2.99','2005-08-02 13:44:53','2006-02-15 22:12:30'),(54,2,1,11614,'2.99','2005-08-17 03:52:18','2006-02-15 22:12:30'),(55,2,1,12963,'2.99','2005-08-19 06:26:04','2006-02-15 22:12:30'),(56,2,1,14475,'4.99','2005-08-21 13:24:32','2006-02-15 22:12:30'),(57,2,2,14743,'5.99','2005-08-21 22:41:56','2006-02-15 22:12:30'),(58,2,2,15145,'4.99','2005-08-22 13:53:04','2006-02-15 22:12:30'),(59,2,2,15907,'4.99','2005-08-23 17:39:35','2006-02-15 22:12:30'),(60,3,1,435,'1.99','2005-05-27 17:17:09','2006-02-15 22:12:30'),(61,3,1,830,'2.99','2005-05-29 22:43:55','2006-02-15 22:12:30'),(62,3,1,1546,'8.99','2005-06-16 01:34:05','2006-02-15 22:12:30'),(63,3,1,1726,'6.99','2005-06-16 15:19:10','2006-02-15 22:12:30'),(64,3,2,1911,'6.99','2005-06-17 05:15:15','2006-02-15 22:12:30'),(65,3,1,2628,'2.99','2005-06-19 08:34:53','2006-02-15 22:12:30'),(66,3,1,4180,'4.99','2005-07-07 10:23:25','2006-02-15 22:12:30'),(67,3,1,4725,'4.99','2005-07-08 12:47:11','2006-02-15 22:12:30'),(68,3,1,7096,'5.99','2005-07-27 04:54:42','2006-02-15 22:12:30'),(69,3,2,7503,'10.99','2005-07-27 20:23:12','2006-02-15 22:12:30'),(70,3,2,7703,'7.99','2005-07-28 03:59:21','2006-02-15 22:12:30'),(71,3,2,7724,'6.99','2005-07-28 04:46:30','2006-02-15 22:12:30'),(72,3,1,7911,'4.99','2005-07-28 11:46:45','2006-02-15 22:12:30'),(73,3,2,8086,'4.99','2005-07-28 18:17:14','2006-02-15 22:12:30'),(74,3,1,8545,'2.99','2005-07-29 11:07:04','2006-02-15 22:12:30'),(75,3,1,9226,'1.99','2005-07-30 13:31:20','2006-02-15 22:12:30'),(76,3,2,9443,'3.99','2005-07-30 21:45:46','2006-02-15 22:12:30'),(77,3,1,9595,'2.99','2005-07-31 03:27:58','2006-02-15 22:12:30'),(78,3,2,9816,'4.99','2005-07-31 11:32:58','2006-02-15 22:12:30'),(79,3,2,10597,'5.99','2005-08-01 14:19:48','2006-02-15 22:12:30'),(80,3,2,12556,'4.99','2005-08-18 14:49:55','2006-02-15 22:12:30'),(81,3,1,13403,'8.99','2005-08-19 22:18:07','2006-02-15 22:12:30'),(82,3,2,13610,'2.99','2005-08-20 06:14:12','2006-02-15 22:12:30'),(83,3,2,14699,'8.99','2005-08-21 20:50:48','2006-02-15 22:12:30'),(84,3,2,15038,'0.99','2005-08-22 09:37:27','2006-02-15 22:12:30'),(85,3,1,15619,'2.99','2005-08-23 07:10:14','2006-02-15 22:12:30'),(86,4,1,1297,'4.99','2005-06-15 09:31:28','2006-02-15 22:12:30'),(87,4,1,1633,'0.99','2005-06-16 08:08:40','2006-02-15 22:12:30'),(88,4,2,1707,'2.99','2005-06-16 14:01:27','2006-02-15 22:12:30'),(89,4,2,1735,'0.99','2005-06-16 15:51:52','2006-02-15 22:12:30'),(90,4,2,2043,'0.99','2005-06-17 14:31:12','2006-02-15 22:12:30'),(91,4,1,2642,'5.99','2005-06-19 09:39:01','2006-02-15 22:12:30'),(92,4,1,7660,'2.99','2005-07-28 02:10:10','2006-02-15 22:12:30'),(93,4,2,7718,'2.99','2005-07-28 04:37:59','2006-02-15 22:12:30'),(94,4,1,8741,'3.99','2005-07-29 18:44:57','2006-02-15 22:12:30'),(95,4,1,9100,'5.99','2005-07-30 08:46:09','2006-02-15 22:12:30'),(96,4,1,9371,'5.99','2005-07-30 18:58:00','2006-02-15 22:12:30'),(97,4,2,11069,'0.99','2005-08-02 07:09:34','2006-02-15 22:12:30'),(98,4,1,11110,'2.99','2005-08-02 08:20:31','2006-02-15 22:12:30'),(99,4,2,11529,'4.99','2005-08-17 00:28:01','2006-02-15 22:12:30'),(100,4,1,12151,'2.99','2005-08-18 00:14:03','2006-02-15 22:12:30'),(101,4,2,12294,'8.99','2005-08-18 05:14:44','2006-02-15 22:12:30'),(102,4,2,12856,'1.99','2005-08-19 02:19:13','2006-02-15 22:12:30'),(103,4,1,13704,'2.99','2005-08-20 09:32:04','2006-02-15 22:12:30'),(104,4,1,13807,'6.99','2005-08-20 12:55:40','2006-02-15 22:12:30'),(105,4,2,14225,'4.99','2005-08-21 04:53:37','2006-02-15 22:12:30'),(106,4,1,15147,'2.99','2005-08-22 13:58:23','2006-02-15 22:12:30'),(107,4,2,15635,'1.99','2005-08-23 07:43:00','2006-02-15 22:12:30'),(108,5,1,731,'0.99','2005-05-29 07:25:16','2006-02-15 22:12:30'),(109,5,1,1085,'6.99','2005-05-31 11:15:43','2006-02-15 22:12:30'),(110,5,1,1142,'1.99','2005-05-31 19:46:38','2006-02-15 22:12:30'),(111,5,1,1502,'3.99','2005-06-15 22:03:14','2006-02-15 22:12:30'),(112,5,2,1631,'2.99','2005-06-16 08:01:02','2006-02-15 22:12:30'),(113,5,2,2063,'4.99','2005-06-17 15:56:53','2006-02-15 22:12:30'),(114,5,2,2570,'2.99','2005-06-19 04:20:13','2006-02-15 22:12:30'),(115,5,2,3126,'4.99','2005-06-20 18:38:22','2006-02-15 22:12:30'),(116,5,2,3677,'4.99','2005-07-06 09:11:58','2006-02-15 22:12:30'),(117,5,2,4889,'2.99','2005-07-08 20:04:43','2006-02-15 22:12:30'),(118,5,1,5016,'4.99','2005-07-09 01:57:57','2006-02-15 22:12:30'),(119,5,2,5118,'5.99','2005-07-09 07:13:52','2006-02-15 22:12:30'),(120,5,2,5156,'1.99','2005-07-09 08:51:42','2006-02-15 22:12:30'),(121,5,2,5721,'0.99','2005-07-10 11:09:35','2006-02-15 22:12:30'),(122,5,1,6042,'8.99','2005-07-11 03:17:04','2006-02-15 22:12:30'),(123,5,1,6663,'3.99','2005-07-12 11:27:35','2006-02-15 22:12:30'),(124,5,2,6685,'4.99','2005-07-12 12:16:28','2006-02-15 22:12:30'),(125,5,2,7293,'0.99','2005-07-27 12:37:28','2006-02-15 22:12:30'),(126,5,2,7652,'0.99','2005-07-28 01:50:29','2006-02-15 22:12:30'),(127,5,2,7829,'3.99','2005-07-28 08:43:39','2006-02-15 22:12:30'),(128,5,1,8263,'2.99','2005-07-29 01:11:23','2006-02-15 22:12:30'),(129,5,1,8978,'1.99','2005-07-30 04:14:28','2006-02-15 22:12:30'),(130,5,1,9493,'4.99','2005-07-30 23:52:30','2006-02-15 22:12:30'),(131,5,1,9888,'3.99','2005-07-31 14:00:53','2006-02-15 22:12:30'),(132,5,2,10609,'4.99','2005-08-01 14:48:45','2006-02-15 22:12:30'),(133,5,1,10625,'0.99','2005-08-01 15:27:10','2006-02-15 22:12:30'),(134,5,2,11001,'4.99','2005-08-02 04:56:45','2006-02-15 22:12:30'),(135,5,1,11179,'4.99','2005-08-02 10:50:06','2006-02-15 22:12:30'),(136,5,2,11930,'3.99','2005-08-17 16:28:53','2006-02-15 22:12:30'),(137,5,1,12145,'9.99','2005-08-18 00:10:04','2006-02-15 22:12:30'),(138,5,1,12797,'2.99','2005-08-19 00:24:08','2006-02-15 22:12:30'),(139,5,1,13063,'1.99','2005-08-19 09:45:41','2006-02-15 22:12:30'),(140,5,2,13877,'0.99','2005-08-20 15:16:18','2006-02-15 22:12:30'),(141,5,2,14053,'6.99','2005-08-20 22:13:59','2006-02-15 22:12:30'),(142,5,1,14430,'6.99','2005-08-21 11:31:11','2006-02-15 22:12:30'),(143,5,2,14494,'2.99','2005-08-21 14:02:50','2006-02-15 22:12:30'),(144,5,2,15232,'0.99','2005-08-22 17:37:02','2006-02-15 22:12:30'),(145,5,2,13209,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:30'),(146,6,2,57,'4.99','2005-05-25 08:43:32','2006-02-15 22:12:30'),(147,6,1,577,'2.99','2005-05-28 11:09:14','2006-02-15 22:12:30'),(148,6,2,916,'0.99','2005-05-30 11:25:01','2006-02-15 22:12:30'),(149,6,1,1575,'3.99','2005-06-16 03:41:38','2006-02-15 22:12:30'),(150,6,2,1841,'2.99','2005-06-16 23:44:13','2006-02-15 22:12:30'),(151,6,1,1966,'0.99','2005-06-17 09:19:45','2006-02-15 22:12:30'),(152,6,1,2345,'0.99','2005-06-18 12:03:23','2006-02-15 22:12:30'),(153,6,2,3983,'0.99','2005-07-06 23:14:21','2006-02-15 22:12:30'),(154,6,2,4278,'2.99','2005-07-07 14:53:24','2006-02-15 22:12:30'),(155,6,1,5553,'0.99','2005-07-10 03:03:35','2006-02-15 22:12:30'),(156,6,2,6211,'5.99','2005-07-11 12:39:01','2006-02-15 22:12:30'),(157,6,1,6248,'7.99','2005-07-11 15:01:54','2006-02-15 22:12:30'),(158,6,2,6686,'0.99','2005-07-12 12:18:38','2006-02-15 22:12:30'),(159,6,2,7099,'2.99','2005-07-27 05:03:44','2006-02-15 22:12:30'),(160,6,2,7136,'2.99','2005-07-27 06:38:25','2006-02-15 22:12:30'),(161,6,1,8101,'0.99','2005-07-28 18:47:23','2006-02-15 22:12:30'),(162,6,1,10271,'2.99','2005-08-01 03:13:39','2006-02-15 22:12:30'),(163,6,1,11023,'2.99','2005-08-02 05:36:38','2006-02-15 22:12:30'),(164,6,1,11398,'3.99','2005-08-02 18:55:15','2006-02-15 22:12:30'),(165,6,1,11591,'6.99','2005-08-17 02:29:41','2006-02-15 22:12:30'),(166,6,1,11727,'0.99','2005-08-17 08:12:20','2006-02-15 22:12:30'),(167,6,1,11853,'0.99','2005-08-17 13:39:32','2006-02-15 22:12:30'),(168,6,2,12254,'2.99','2005-08-18 04:05:29','2006-02-15 22:12:30'),(169,6,2,13451,'6.99','2005-08-20 00:18:25','2006-02-15 22:12:30'),(170,6,1,14329,'7.99','2005-08-21 08:22:56','2006-02-15 22:12:30'),(171,6,1,14377,'4.99','2005-08-21 09:49:28','2006-02-15 22:12:30'),(172,6,1,15509,'5.99','2005-08-23 02:51:24','2006-02-15 22:12:30'),(173,6,2,15603,'0.99','2005-08-23 06:41:32','2006-02-15 22:12:30'),(174,7,2,46,'5.99','2005-05-25 06:04:08','2006-02-15 22:12:30'),(175,7,2,117,'0.99','2005-05-25 19:30:46','2006-02-15 22:12:30'),(176,7,2,748,'2.99','2005-05-29 09:27:00','2006-02-15 22:12:30'),(177,7,1,975,'4.99','2005-05-30 21:07:15','2006-02-15 22:12:30'),(178,7,1,1063,'5.99','2005-05-31 08:44:29','2006-02-15 22:12:30'),(179,7,2,1810,'0.99','2005-06-16 21:06:00','2006-02-15 22:12:30'),(180,7,1,2250,'2.99','2005-06-18 05:03:36','2006-02-15 22:12:31'),(181,7,1,2709,'0.99','2005-06-19 14:00:26','2006-02-15 22:12:31'),(182,7,1,2888,'4.99','2005-06-20 01:50:56','2006-02-15 22:12:31'),(183,7,1,3007,'0.99','2005-06-20 10:11:53','2006-02-15 22:12:31'),(184,7,2,3639,'5.99','2005-07-06 07:09:17','2006-02-15 22:12:31'),(185,7,2,4238,'2.99','2005-07-07 13:22:20','2006-02-15 22:12:31'),(186,7,2,4787,'5.99','2005-07-08 16:16:04','2006-02-15 22:12:31'),(187,7,1,4856,'4.99','2005-07-08 18:47:38','2006-02-15 22:12:31'),(188,7,1,5441,'8.99','2005-07-09 21:52:05','2006-02-15 22:12:31'),(189,7,1,5921,'7.99','2005-07-10 21:35:12','2006-02-15 22:12:31'),(190,7,1,6174,'1.99','2005-07-11 10:36:28','2006-02-15 22:12:31'),(191,7,1,6295,'2.99','2005-07-11 17:30:58','2006-02-15 22:12:31'),(192,7,2,6761,'3.99','2005-07-12 15:17:42','2006-02-15 22:12:31'),(193,7,2,8422,'5.99','2005-07-29 07:02:55','2006-02-15 22:12:31'),(194,7,2,9624,'7.99','2005-07-31 04:30:03','2006-02-15 22:12:31'),(195,7,2,10330,'6.99','2005-08-01 04:57:04','2006-02-15 22:12:31'),(196,7,1,10423,'5.99','2005-08-01 08:19:53','2006-02-15 22:12:31'),(197,7,1,10514,'4.99','2005-08-01 11:39:26','2006-02-15 22:12:31'),(198,7,2,10644,'4.99','2005-08-01 15:52:00','2006-02-15 22:12:31'),(199,7,2,10989,'3.99','2005-08-02 04:40:54','2006-02-15 22:12:31'),(200,7,2,11542,'7.99','2005-08-17 00:51:32','2006-02-15 22:12:31'),(201,7,1,12367,'8.99','2005-08-18 07:57:14','2006-02-15 22:12:31'),(202,7,1,12730,'2.99','2005-08-18 21:55:01','2006-02-15 22:12:31'),(203,7,2,13373,'2.99','2005-08-19 21:23:31','2006-02-15 22:12:31'),(204,7,1,13476,'2.99','2005-08-20 01:06:04','2006-02-15 22:12:31'),(205,7,1,13594,'0.99','2005-08-20 05:53:31','2006-02-15 22:12:31'),(206,7,1,14222,'5.99','2005-08-21 04:49:48','2006-02-15 22:12:31'),(207,8,2,866,'6.99','2005-05-30 03:43:54','2006-02-15 22:12:31'),(208,8,2,1305,'2.99','2005-06-15 09:59:16','2006-02-15 22:12:31'),(209,8,1,2095,'5.99','2005-06-17 18:21:35','2006-02-15 22:12:31'),(210,8,2,3114,'4.99','2005-06-20 17:57:47','2006-02-15 22:12:31'),(211,8,1,3475,'5.99','2005-07-05 23:01:21','2006-02-15 22:12:31'),(212,8,1,4003,'0.99','2005-07-07 00:09:02','2006-02-15 22:12:31'),(213,8,2,4175,'2.99','2005-07-07 10:02:03','2006-02-15 22:12:31'),(214,8,2,4409,'3.99','2005-07-07 21:47:29','2006-02-15 22:12:31'),(215,8,1,4503,'3.99','2005-07-08 02:17:12','2006-02-15 22:12:31'),(216,8,1,5300,'2.99','2005-07-09 15:40:46','2006-02-15 22:12:31'),(217,8,2,5341,'2.99','2005-07-09 17:13:23','2006-02-15 22:12:31'),(218,8,1,6375,'4.99','2005-07-11 21:39:46','2006-02-15 22:12:31'),(219,8,1,6647,'0.99','2005-07-12 10:43:53','2006-02-15 22:12:31'),(220,8,1,8809,'1.99','2005-07-29 21:42:49','2006-02-15 22:12:31'),(221,8,2,9629,'2.99','2005-07-31 04:54:43','2006-02-15 22:12:31'),(222,8,2,10141,'0.99','2005-07-31 22:08:29','2006-02-15 22:12:31'),(223,8,2,10561,'2.99','2005-08-01 13:05:35','2006-02-15 22:12:31'),(224,8,1,11232,'9.99','2005-08-02 13:04:12','2006-02-15 22:12:31'),(225,8,2,11284,'2.99','2005-08-02 14:42:45','2006-02-15 22:12:31'),(226,8,1,12613,'2.99','2005-08-18 17:16:01','2006-02-15 22:12:31'),(227,8,1,14114,'0.99','2005-08-21 01:07:11','2006-02-15 22:12:31'),(228,8,1,15374,'7.99','2005-08-22 22:09:09','2006-02-15 22:12:31'),(229,8,1,15764,'2.99','2005-08-23 13:05:10','2006-02-15 22:12:31'),(230,8,1,15805,'4.99','2005-08-23 14:31:19','2006-02-15 22:12:31'),(231,9,2,350,'4.99','2005-05-27 05:01:28','2006-02-15 22:12:31'),(232,9,2,877,'0.99','2005-05-30 05:48:59','2006-02-15 22:12:31'),(233,9,2,1075,'4.99','2005-05-31 10:13:34','2006-02-15 22:12:31'),(234,9,2,3142,'7.99','2005-06-20 19:59:28','2006-02-15 22:12:31'),(235,9,2,3262,'4.99','2005-06-21 04:08:43','2006-02-15 22:12:31'),(236,9,1,4454,'2.99','2005-07-07 23:37:00','2006-02-15 22:12:31'),(237,9,2,4748,'0.99','2005-07-08 13:59:38','2006-02-15 22:12:31'),(238,9,1,4796,'1.99','2005-07-08 16:35:44','2006-02-15 22:12:31'),(239,9,1,5659,'2.99','2005-07-10 07:45:40','2006-02-15 22:12:31'),(240,9,2,6019,'4.99','2005-07-11 02:08:29','2006-02-15 22:12:31'),(241,9,1,6165,'5.99','2005-07-11 10:17:29','2006-02-15 22:12:31'),(242,9,2,7616,'0.99','2005-07-28 00:15:26','2006-02-15 22:12:31'),(243,9,1,7801,'2.99','2005-07-28 07:51:56','2006-02-15 22:12:31'),(244,9,1,9043,'4.99','2005-07-30 06:34:07','2006-02-15 22:12:31'),(245,9,1,10451,'0.99','2005-08-01 09:11:25','2006-02-15 22:12:31'),(246,9,1,10454,'4.99','2005-08-01 09:14:00','2006-02-15 22:12:31'),(247,9,2,11400,'5.99','2005-08-02 19:00:52','2006-02-15 22:12:31'),(248,9,1,11556,'0.99','2005-08-17 01:11:53','2006-02-15 22:12:31'),(249,9,1,12228,'2.99','2005-08-18 03:08:10','2006-02-15 22:12:31'),(250,9,1,12309,'2.99','2005-08-18 05:58:40','2006-02-15 22:12:31'),(251,9,2,12652,'4.99','2005-08-18 18:48:58','2006-02-15 22:12:31'),(252,9,2,14489,'7.99','2005-08-21 13:53:59','2006-02-15 22:12:31'),(253,9,1,15813,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:31'),(254,10,2,1140,'4.99','2005-05-31 19:36:30','2006-02-15 22:12:31'),(255,10,1,1801,'4.99','2005-06-16 20:21:53','2006-02-15 22:12:31'),(256,10,1,1995,'4.99','2005-06-17 11:11:14','2006-02-15 22:12:31'),(257,10,2,2222,'3.99','2005-06-18 03:26:23','2006-02-15 22:12:31'),(258,10,1,2814,'0.99','2005-06-19 20:01:59','2006-02-15 22:12:31'),(259,10,1,2865,'0.99','2005-06-20 00:00:55','2006-02-15 22:12:31'),(260,10,2,3790,'3.99','2005-07-06 14:13:45','2006-02-15 22:12:31'),(261,10,2,4042,'4.99','2005-07-07 03:06:40','2006-02-15 22:12:31'),(262,10,1,4255,'1.99','2005-07-07 14:14:13','2006-02-15 22:12:31'),(263,10,1,5038,'7.99','2005-07-09 03:12:52','2006-02-15 22:12:31'),(264,10,2,5068,'2.99','2005-07-09 04:53:18','2006-02-15 22:12:31'),(265,10,1,5444,'0.99','2005-07-09 21:58:57','2006-02-15 22:12:31'),(266,10,1,5905,'2.99','2005-07-10 20:41:09','2006-02-15 22:12:31'),(267,10,1,7738,'2.99','2005-07-28 05:21:42','2006-02-15 22:12:31'),(268,10,2,8001,'6.99','2005-07-28 15:10:55','2006-02-15 22:12:31'),(269,10,2,8188,'4.99','2005-07-28 22:34:12','2006-02-15 22:12:31'),(270,10,1,9935,'4.99','2005-07-31 15:27:07','2006-02-15 22:12:31'),(271,10,2,10671,'8.99','2005-08-01 17:09:59','2006-02-15 22:12:31'),(272,10,2,11289,'2.99','2005-08-02 14:55:00','2006-02-15 22:12:31'),(273,10,1,11405,'0.99','2005-08-02 19:13:39','2006-02-15 22:12:31'),(274,10,2,12031,'2.99','2005-08-17 20:11:35','2006-02-15 22:12:31'),(275,10,2,12400,'2.99','2005-08-18 09:19:12','2006-02-15 22:12:31'),(276,10,2,13316,'4.99','2005-08-19 19:23:30','2006-02-15 22:12:31'),(277,10,2,13917,'2.99','2005-08-20 16:43:28','2006-02-15 22:12:31'),(278,10,1,15370,'5.99','2005-08-22 21:59:29','2006-02-15 22:12:31'),(279,11,1,987,'6.99','2005-05-30 22:59:12','2006-02-15 22:12:31'),(280,11,1,1470,'6.99','2005-06-15 20:53:07','2006-02-15 22:12:31'),(281,11,1,1939,'7.99','2005-06-17 07:26:45','2006-02-15 22:12:31'),(282,11,1,3192,'0.99','2005-06-20 23:49:12','2006-02-15 22:12:31'),(283,11,2,4608,'2.99','2005-07-08 07:19:11','2006-02-15 22:12:31'),(284,11,1,4943,'4.99','2005-07-08 22:43:05','2006-02-15 22:12:31'),(285,11,2,5835,'5.99','2005-07-10 16:44:58','2006-02-15 22:12:31'),(286,11,2,6146,'6.99','2005-07-11 09:09:59','2006-02-15 22:12:31'),(287,11,1,7314,'4.99','2005-07-27 13:13:32','2006-02-15 22:12:31'),(288,11,1,8014,'4.99','2005-07-28 15:32:07','2006-02-15 22:12:31'),(289,11,2,8100,'2.99','2005-07-28 18:43:11','2006-02-15 22:12:31'),(290,11,2,8447,'1.99','2005-07-29 07:38:14','2006-02-15 22:12:31'),(291,11,1,8715,'0.99','2005-07-29 17:33:45','2006-02-15 22:12:31'),(292,11,1,8950,'9.99','2005-07-30 03:17:13','2006-02-15 22:12:31'),(293,11,2,9292,'6.99','2005-07-30 16:08:21','2006-02-15 22:12:31'),(294,11,1,10812,'4.99','2005-08-01 22:41:16','2006-02-15 22:12:31'),(295,11,2,11166,'6.99','2005-08-02 10:14:58','2006-02-15 22:12:31'),(296,11,2,11502,'0.99','2005-08-16 23:06:30','2006-02-15 22:12:31'),(297,11,2,12015,'5.99','2005-08-17 19:32:44','2006-02-15 22:12:31'),(298,11,2,13572,'0.99','2005-08-20 05:07:27','2006-02-15 22:12:31'),(299,11,1,13790,'4.99','2005-08-20 12:17:27','2006-02-15 22:12:31'),(300,11,1,15120,'0.99','2005-08-22 12:42:47','2006-02-15 22:12:31'),(301,11,2,15240,'2.99','2005-08-22 17:46:41','2006-02-15 22:12:31'),(302,11,1,11646,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:31'),(303,12,1,988,'4.99','2005-05-30 23:08:03','2006-02-15 22:12:31'),(304,12,1,1084,'4.99','2005-05-31 11:10:17','2006-02-15 22:12:31'),(305,12,2,1752,'5.99','2005-06-16 17:02:55','2006-02-15 22:12:31'),(306,12,2,2434,'5.99','2005-06-18 18:11:51','2006-02-15 22:12:31'),(307,12,2,2500,'5.99','2005-06-18 23:07:12','2006-02-15 22:12:31'),(308,12,2,2623,'4.99','2005-06-19 08:11:51','2006-02-15 22:12:31'),(309,12,2,3135,'2.99','2005-06-20 19:33:52','2006-02-15 22:12:31'),(310,12,1,3411,'0.99','2005-06-21 16:31:27','2006-02-15 22:12:31'),(311,12,1,3870,'3.99','2005-07-06 17:57:54','2006-02-15 22:12:31'),(312,12,1,5071,'0.99','2005-07-09 05:00:39','2006-02-15 22:12:31'),(313,12,1,5074,'0.99','2005-07-09 05:06:24','2006-02-15 22:12:31'),(314,12,2,5111,'0.99','2005-07-09 07:02:19','2006-02-15 22:12:31'),(315,12,2,5242,'3.99','2005-07-09 13:20:25','2006-02-15 22:12:31'),(316,12,1,6773,'2.99','2005-07-12 15:55:39','2006-02-15 22:12:31'),(317,12,2,7008,'0.99','2005-07-27 01:44:03','2006-02-15 22:12:31'),(318,12,2,7279,'0.99','2005-07-27 11:50:47','2006-02-15 22:12:31'),(319,12,2,8985,'0.99','2005-07-30 04:34:51','2006-02-15 22:12:31'),(320,12,2,9166,'4.99','2005-07-30 11:26:28','2006-02-15 22:12:31'),(321,12,2,9238,'5.99','2005-07-30 13:49:43','2006-02-15 22:12:31'),(322,12,1,9627,'5.99','2005-07-31 04:42:46','2006-02-15 22:12:31'),(323,12,2,9708,'5.99','2005-07-31 07:45:33','2006-02-15 22:12:31'),(324,12,2,10392,'10.99','2005-08-01 06:50:26','2006-02-15 22:12:31'),(325,12,2,11497,'0.99','2005-08-16 22:52:30','2006-02-15 22:12:31'),(326,12,1,12604,'4.99','2005-08-18 16:58:48','2006-02-15 22:12:31'),(327,12,2,13519,'0.99','2005-08-20 02:37:07','2006-02-15 22:12:31'),(328,12,2,13895,'2.99','2005-08-20 15:58:28','2006-02-15 22:12:31'),(329,12,2,14240,'4.99','2005-08-21 05:19:39','2006-02-15 22:12:31'),(330,12,1,15993,'0.99','2005-08-23 20:28:44','2006-02-15 22:12:31'),(331,13,1,1933,'2.99','2005-06-17 06:54:42','2006-02-15 22:12:31'),(332,13,1,2209,'4.99','2005-06-18 02:24:01','2006-02-15 22:12:31'),(333,13,1,2952,'2.99','2005-06-20 06:26:57','2006-02-15 22:12:31'),(334,13,1,3047,'8.99','2005-06-20 12:45:33','2006-02-15 22:12:31'),(335,13,2,3946,'2.99','2005-07-06 21:39:24','2006-02-15 22:12:31'),(336,13,1,6118,'8.99','2005-07-11 07:43:08','2006-02-15 22:12:31'),(337,13,1,6568,'2.99','2005-07-12 05:45:47','2006-02-15 22:12:31'),(338,13,1,6870,'0.99','2005-07-12 20:13:45','2006-02-15 22:12:31'),(339,13,1,6897,'2.99','2005-07-12 21:30:41','2006-02-15 22:12:31'),(340,13,1,7916,'2.99','2005-07-28 11:49:53','2006-02-15 22:12:31'),(341,13,1,8277,'2.99','2005-07-29 01:38:53','2006-02-15 22:12:31'),(342,13,2,8831,'11.99','2005-07-29 22:37:41','2006-02-15 22:12:31'),(343,13,2,9260,'9.99','2005-07-30 14:38:22','2006-02-15 22:12:31'),(344,13,2,9434,'0.99','2005-07-30 21:29:41','2006-02-15 22:12:32'),(345,13,1,9664,'0.99','2005-07-31 06:12:08','2006-02-15 22:12:32'),(346,13,1,9736,'7.99','2005-07-31 08:58:40','2006-02-15 22:12:32'),(347,13,1,10003,'4.99','2005-07-31 17:48:51','2006-02-15 22:12:32'),(348,13,1,11292,'4.99','2005-08-02 14:58:41','2006-02-15 22:12:32'),(349,13,2,11315,'0.99','2005-08-02 16:05:17','2006-02-15 22:12:32'),(350,13,2,11761,'5.99','2005-08-17 09:44:59','2006-02-15 22:12:32'),(351,13,2,12918,'7.99','2005-08-19 04:31:36','2006-02-15 22:12:32'),(352,13,2,13096,'4.99','2005-08-19 10:49:03','2006-02-15 22:12:32'),(353,13,2,13213,'0.99','2005-08-19 15:25:48','2006-02-15 22:12:32'),(354,13,1,13456,'0.99','2005-08-20 00:33:19','2006-02-15 22:12:32'),(355,13,1,14252,'9.99','2005-08-21 05:44:07','2006-02-15 22:12:32'),(356,13,2,14545,'7.99','2005-08-21 15:44:23','2006-02-15 22:12:32'),(357,13,1,15338,'4.99','2005-08-22 20:51:24','2006-02-15 22:12:32'),(358,14,1,151,'0.99','2005-05-26 00:37:28','2006-02-15 22:12:32'),(359,14,1,346,'9.99','2005-05-27 04:34:41','2006-02-15 22:12:32'),(360,14,1,525,'5.99','2005-05-28 04:25:33','2006-02-15 22:12:32'),(361,14,1,671,'2.99','2005-05-28 22:04:30','2006-02-15 22:12:32'),(362,14,2,815,'0.99','2005-05-29 20:24:28','2006-02-15 22:12:32'),(363,14,2,1360,'4.99','2005-06-15 13:32:15','2006-02-15 22:12:32'),(364,14,1,3707,'2.99','2005-07-06 10:21:49','2006-02-15 22:12:32'),(365,14,1,4952,'0.99','2005-07-08 23:00:07','2006-02-15 22:12:32'),(366,14,1,5104,'0.99','2005-07-09 06:37:07','2006-02-15 22:12:32'),(367,14,2,5317,'7.99','2005-07-09 16:10:25','2006-02-15 22:12:32'),(368,14,1,5383,'4.99','2005-07-09 19:14:32','2006-02-15 22:12:32'),(369,14,1,5565,'7.99','2005-07-10 03:29:48','2006-02-15 22:12:32'),(370,14,1,8035,'6.99','2005-07-28 16:23:01','2006-02-15 22:12:32'),(371,14,1,8042,'0.99','2005-07-28 16:45:11','2006-02-15 22:12:32'),(372,14,1,8548,'3.99','2005-07-29 11:11:33','2006-02-15 22:12:32'),(373,14,2,8836,'4.99','2005-07-29 22:46:08','2006-02-15 22:12:32'),(374,14,2,9438,'4.99','2005-07-30 21:36:15','2006-02-15 22:12:32'),(375,14,1,9592,'2.99','2005-07-31 03:21:16','2006-02-15 22:12:32'),(376,14,1,10348,'2.99','2005-08-01 05:23:00','2006-02-15 22:12:32'),(377,14,2,10526,'6.99','2005-08-01 11:55:33','2006-02-15 22:12:32'),(378,14,1,11480,'4.99','2005-08-02 22:18:24','2006-02-15 22:12:32'),(379,14,2,11528,'3.99','2005-08-17 00:27:23','2006-02-15 22:12:32'),(380,14,1,12668,'2.99','2005-08-18 19:16:47','2006-02-15 22:12:32'),(381,14,1,13757,'4.99','2005-08-20 11:20:12','2006-02-15 22:12:32'),(382,14,2,15015,'6.99','2005-08-22 08:43:50','2006-02-15 22:12:32'),(383,14,1,15373,'0.99','2005-08-22 22:08:11','2006-02-15 22:12:32'),(384,14,1,16045,'0.99','2005-08-23 22:25:26','2006-02-15 22:12:32'),(385,14,1,13780,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:32'),(386,15,1,2486,'2.99','2005-06-18 21:26:56','2006-02-15 22:12:32'),(387,15,1,2937,'5.99','2005-06-20 05:15:37','2006-02-15 22:12:32'),(388,15,2,3182,'0.99','2005-06-20 22:52:18','2006-02-15 22:12:32'),(389,15,1,3550,'7.99','2005-07-06 02:29:21','2006-02-15 22:12:32'),(390,15,1,4127,'5.99','2005-07-07 07:26:19','2006-02-15 22:12:32'),(391,15,1,5717,'2.99','2005-07-10 11:02:03','2006-02-15 22:12:32'),(392,15,2,5975,'2.99','2005-07-11 00:14:19','2006-02-15 22:12:32'),(393,15,1,7105,'4.99','2005-07-27 05:15:37','2006-02-15 22:12:32'),(394,15,1,8193,'0.99','2005-07-28 22:50:50','2006-02-15 22:12:32'),(395,15,2,8615,'6.99','2005-07-29 13:36:01','2006-02-15 22:12:32'),(396,15,2,8927,'4.99','2005-07-30 02:13:31','2006-02-15 22:12:32'),(397,15,1,9987,'2.99','2005-07-31 17:22:35','2006-02-15 22:12:32'),(398,15,1,11118,'2.99','2005-08-02 08:44:18','2006-02-15 22:12:32'),(399,15,1,11141,'2.99','2005-08-02 09:29:11','2006-02-15 22:12:32'),(400,15,2,11307,'2.99','2005-08-02 15:48:08','2006-02-15 22:12:32'),(401,15,2,11341,'2.99','2005-08-02 17:09:24','2006-02-15 22:12:32'),(402,15,1,11922,'7.99','2005-08-17 16:20:37','2006-02-15 22:12:32'),(403,15,2,12272,'2.99','2005-08-18 04:39:10','2006-02-15 22:12:32'),(404,15,2,12551,'2.99','2005-08-18 14:46:26','2006-02-15 22:12:32'),(405,15,1,12635,'2.99','2005-08-18 18:00:23','2006-02-15 22:12:32'),(406,15,2,13339,'8.99','2005-08-19 20:18:36','2006-02-15 22:12:32'),(407,15,1,13393,'5.99','2005-08-19 22:03:46','2006-02-15 22:12:32'),(408,15,2,13503,'5.99','2005-08-20 02:00:33','2006-02-15 22:12:32'),(409,15,1,13541,'4.99','2005-08-20 03:41:41','2006-02-15 22:12:32'),(410,15,2,13677,'3.99','2005-08-20 08:34:41','2006-02-15 22:12:32'),(411,15,2,14569,'0.99','2005-08-21 16:31:22','2006-02-15 22:12:32'),(412,15,2,14776,'4.99','2005-08-21 23:53:35','2006-02-15 22:12:32'),(413,15,2,14872,'8.99','2005-08-22 03:23:41','2006-02-15 22:12:32'),(414,15,1,15178,'0.99','2005-08-22 15:36:04','2006-02-15 22:12:32'),(415,15,1,15897,'4.99','2005-08-23 17:12:31','2006-02-15 22:12:32'),(416,15,1,13798,'3.98','2006-02-14 15:16:03','2006-02-15 22:12:32'),(417,15,2,13968,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:32'),(418,16,1,335,'3.99','2005-05-27 03:07:10','2006-02-15 22:12:32'),(419,16,1,593,'2.99','2005-05-28 13:33:23','2006-02-15 22:12:32'),(420,16,2,887,'0.99','2005-05-30 07:10:00','2006-02-15 22:12:32'),(421,16,1,1017,'2.99','2005-05-31 02:53:36','2006-02-15 22:12:32'),(422,16,2,1934,'6.99','2005-06-17 07:04:57','2006-02-15 22:12:32'),(423,16,1,1944,'7.99','2005-06-17 07:50:53','2006-02-15 22:12:32'),(424,16,1,NULL,'1.99','2005-06-18 04:56:12','2006-02-15 22:12:32'),(425,16,1,2960,'7.99','2005-06-20 07:10:09','2006-02-15 22:12:32'),(426,16,2,3348,'0.99','2005-06-21 11:16:42','2006-02-15 22:12:32'),(427,16,1,3548,'0.99','2005-07-06 02:23:39','2006-02-15 22:12:32'),(428,16,2,4219,'2.99','2005-07-07 12:11:22','2006-02-15 22:12:32'),(429,16,2,4263,'3.99','2005-07-07 14:24:44','2006-02-15 22:12:32'),(430,16,2,4517,'4.99','2005-07-08 02:45:19','2006-02-15 22:12:32'),(431,16,1,6100,'4.99','2005-07-11 06:40:31','2006-02-15 22:12:32'),(432,16,2,7489,'0.99','2005-07-27 19:39:38','2006-02-15 22:12:32'),(433,16,2,7552,'2.99','2005-07-27 22:03:41','2006-02-15 22:12:32'),(434,16,2,8452,'5.99','2005-07-29 07:45:00','2006-02-15 22:12:32'),(435,16,2,9158,'0.99','2005-07-30 11:12:03','2006-02-15 22:12:32'),(436,16,2,9610,'5.99','2005-07-31 03:54:05','2006-02-15 22:12:32'),(437,16,2,10687,'2.99','2005-08-01 17:53:02','2006-02-15 22:12:32'),(438,16,2,10727,'2.99','2005-08-01 19:15:08','2006-02-15 22:12:32'),(439,16,2,11308,'0.99','2005-08-02 15:50:44','2006-02-15 22:12:32'),(440,16,2,12104,'2.99','2005-08-17 22:53:00','2006-02-15 22:12:32'),(441,16,1,12358,'4.99','2005-08-18 07:41:43','2006-02-15 22:12:32'),(442,16,1,12577,'7.99','2005-08-18 15:39:46','2006-02-15 22:12:32'),(443,16,2,13151,'4.99','2005-08-19 13:08:23','2006-02-15 22:12:32'),(444,16,1,13391,'4.99','2005-08-19 22:01:42','2006-02-15 22:12:32'),(445,16,1,13480,'6.99','2005-08-20 01:10:27','2006-02-15 22:12:32'),(446,16,1,14511,'8.99','2005-08-21 14:45:34','2006-02-15 22:12:32'),(447,17,2,287,'2.99','2005-05-26 19:44:54','2006-02-15 22:12:32'),(448,17,1,580,'2.99','2005-05-28 11:19:53','2006-02-15 22:12:32'),(449,17,2,884,'4.99','2005-05-30 06:41:32','2006-02-15 22:12:32'),(450,17,2,2175,'5.99','2005-06-18 00:17:58','2006-02-15 22:12:32'),(451,17,1,2684,'8.99','2005-06-19 12:29:08','2006-02-15 22:12:32'),(452,17,2,3269,'5.99','2005-06-21 05:06:30','2006-02-15 22:12:32'),(453,17,1,5714,'3.99','2005-07-10 10:46:57','2006-02-15 22:12:32'),(454,17,1,5883,'3.99','2005-07-10 19:25:21','2006-02-15 22:12:32'),(455,17,2,6884,'1.99','2005-07-12 20:52:41','2006-02-15 22:12:32'),(456,17,2,8076,'8.99','2005-07-28 17:45:58','2006-02-15 22:12:32'),(457,17,1,8213,'2.99','2005-07-28 23:37:33','2006-02-15 22:12:32'),(458,17,2,9092,'8.99','2005-07-30 08:30:56','2006-02-15 22:12:32'),(459,17,1,9138,'2.99','2005-07-30 10:11:52','2006-02-15 22:12:32'),(460,17,2,9382,'8.99','2005-07-30 19:23:44','2006-02-15 22:12:32'),(461,17,1,9489,'0.99','2005-07-30 23:43:32','2006-02-15 22:12:32'),(462,17,2,11990,'4.99','2005-08-17 18:26:22','2006-02-15 22:12:32'),(463,17,1,13732,'2.99','2005-08-20 10:24:41','2006-02-15 22:12:32'),(464,17,1,14040,'2.99','2005-08-20 21:43:44','2006-02-15 22:12:32'),(465,17,2,14326,'2.99','2005-08-21 08:15:41','2006-02-15 22:12:32'),(466,17,1,14346,'2.99','2005-08-21 08:42:26','2006-02-15 22:12:32'),(467,17,2,15752,'5.99','2005-08-23 12:41:38','2006-02-15 22:12:32'),(468,18,1,50,'2.99','2005-05-25 06:44:53','2006-02-15 22:12:32'),(469,18,1,116,'4.99','2005-05-25 19:27:51','2006-02-15 22:12:32'),(470,18,1,692,'4.99','2005-05-29 01:32:10','2006-02-15 22:12:32'),(471,18,2,1451,'5.99','2005-06-15 19:30:18','2006-02-15 22:12:32'),(472,18,2,1783,'4.99','2005-06-16 19:23:23','2006-02-15 22:12:32'),(473,18,2,2112,'5.99','2005-06-17 19:52:42','2006-02-15 22:12:32'),(474,18,1,2990,'8.99','2005-06-20 09:02:51','2006-02-15 22:12:32'),(475,18,2,4672,'3.99','2005-07-08 10:15:38','2006-02-15 22:12:32'),(476,18,2,4724,'3.99','2005-07-08 12:46:30','2006-02-15 22:12:32'),(477,18,2,4923,'3.99','2005-07-08 21:44:39','2006-02-15 22:12:32'),(478,18,2,6128,'2.99','2005-07-11 08:15:08','2006-02-15 22:12:32'),(479,18,1,6846,'0.99','2005-07-12 19:20:45','2006-02-15 22:12:32'),(480,18,2,8122,'2.99','2005-07-28 19:27:37','2006-02-15 22:12:32'),(481,18,1,8555,'4.99','2005-07-29 11:18:01','2006-02-15 22:12:32'),(482,18,1,9036,'4.99','2005-07-30 06:18:38','2006-02-15 22:12:32'),(483,18,2,9114,'4.99','2005-07-30 09:13:21','2006-02-15 22:12:32'),(484,18,1,10682,'4.99','2005-08-01 17:32:53','2006-02-15 22:12:32'),(485,18,2,10721,'1.99','2005-08-01 19:05:18','2006-02-15 22:12:32'),(486,18,2,11094,'4.99','2005-08-02 08:03:02','2006-02-15 22:12:33'),(487,18,2,11439,'4.99','2005-08-02 20:22:45','2006-02-15 22:12:33'),(488,18,2,12333,'0.99','2005-08-18 06:51:39','2006-02-15 22:12:33'),(489,18,2,13490,'0.99','2005-08-20 01:29:29','2006-02-15 22:12:33'),(490,19,2,18,'0.99','2005-05-25 01:10:47','2006-02-15 22:12:33'),(491,19,2,110,'9.99','2005-05-25 18:43:49','2006-02-15 22:12:33'),(492,19,1,179,'6.99','2005-05-26 04:26:06','2006-02-15 22:12:33'),(493,19,1,337,'2.99','2005-05-27 03:22:30','2006-02-15 22:12:33'),(494,19,2,591,'2.99','2005-05-28 13:11:04','2006-02-15 22:12:33'),(495,19,2,696,'2.99','2005-05-29 01:59:10','2006-02-15 22:12:33'),(496,19,1,2657,'2.99','2005-06-19 10:42:59','2006-02-15 22:12:33'),(497,19,1,2848,'2.99','2005-06-19 22:55:37','2006-02-15 22:12:33'),(498,19,2,3423,'2.99','2005-06-21 17:38:02','2006-02-15 22:12:33'),(499,19,2,3549,'4.99','2005-07-06 02:24:55','2006-02-15 22:12:33'),(500,19,2,6495,'4.99','2005-07-12 02:57:02','2006-02-15 22:12:33'),(501,19,1,9157,'5.99','2005-07-30 11:06:23','2006-02-15 22:12:33'),(502,19,1,9256,'0.99','2005-07-30 14:29:29','2006-02-15 22:12:33'),(503,19,2,10077,'9.99','2005-07-31 20:01:06','2006-02-15 22:12:33'),(504,19,1,10176,'7.99','2005-07-31 23:40:35','2006-02-15 22:12:33'),(505,19,2,11508,'8.99','2005-08-16 23:27:36','2006-02-15 22:12:33'),(506,19,1,11869,'5.99','2005-08-17 14:10:22','2006-02-15 22:12:33'),(507,19,1,12211,'9.99','2005-08-18 02:31:18','2006-02-15 22:12:33'),(508,19,2,12357,'2.99','2005-08-18 07:40:52','2006-02-15 22:12:33'),(509,19,1,13718,'8.99','2005-08-20 09:53:44','2006-02-15 22:12:33'),(510,19,2,13804,'8.99','2005-08-20 12:46:32','2006-02-15 22:12:33'),(511,19,1,14101,'4.99','2005-08-21 00:33:03','2006-02-15 22:12:33'),(512,19,1,15047,'2.99','2005-08-22 09:57:16','2006-02-15 22:12:33'),(513,19,2,15529,'0.99','2005-08-23 03:46:47','2006-02-15 22:12:33'),(514,20,2,202,'2.99','2005-05-26 07:27:36','2006-02-15 22:12:33'),(515,20,2,497,'6.99','2005-05-28 00:54:39','2006-02-15 22:12:33'),(516,20,2,546,'1.99','2005-05-28 07:16:25','2006-02-15 22:12:33'),(517,20,2,1558,'0.99','2005-06-16 02:33:53','2006-02-15 22:12:33'),(518,20,2,2136,'3.99','2005-06-17 21:16:41','2006-02-15 22:12:33'),(519,20,2,2343,'4.99','2005-06-18 11:46:26','2006-02-15 22:12:33'),(520,20,1,3350,'4.99','2005-06-21 11:21:38','2006-02-15 22:12:33'),(521,20,2,4011,'3.99','2005-07-07 00:48:25','2006-02-15 22:12:33'),(522,20,1,4407,'2.99','2005-07-07 21:39:45','2006-02-15 22:12:33'),(523,20,1,5718,'2.99','2005-07-10 11:03:20','2006-02-15 22:12:33'),(524,20,1,6254,'2.99','2005-07-11 15:10:18','2006-02-15 22:12:33'),(525,20,2,6267,'6.99','2005-07-11 15:53:00','2006-02-15 22:12:33'),(526,20,2,7217,'4.99','2005-07-27 09:31:44','2006-02-15 22:12:33'),(527,20,2,7864,'5.99','2005-07-28 10:06:10','2006-02-15 22:12:33'),(528,20,2,8127,'2.99','2005-07-28 19:45:19','2006-02-15 22:12:33'),(529,20,2,9075,'4.99','2005-07-30 07:55:14','2006-02-15 22:12:33'),(530,20,2,9468,'3.99','2005-07-30 22:53:52','2006-02-15 22:12:33'),(531,20,2,10284,'4.99','2005-08-01 03:33:19','2006-02-15 22:12:33'),(532,20,1,10616,'7.99','2005-08-01 14:59:50','2006-02-15 22:12:33'),(533,20,1,10954,'1.99','2005-08-02 03:30:24','2006-02-15 22:12:33'),(534,20,1,11821,'0.99','2005-08-17 12:27:55','2006-02-15 22:12:33'),(535,20,1,12180,'0.99','2005-08-18 01:28:15','2006-02-15 22:12:33'),(536,20,2,13036,'4.99','2005-08-19 08:48:37','2006-02-15 22:12:33'),(537,20,1,13137,'4.99','2005-08-19 12:26:32','2006-02-15 22:12:33'),(538,20,2,13317,'2.99','2005-08-19 19:25:42','2006-02-15 22:12:33'),(539,20,2,14613,'2.99','2005-08-21 18:03:20','2006-02-15 22:12:33'),(540,20,2,15057,'6.99','2005-08-22 10:19:58','2006-02-15 22:12:33'),(541,20,1,15161,'1.99','2005-08-22 14:37:22','2006-02-15 22:12:33'),(542,20,2,15248,'0.99','2005-08-22 17:53:06','2006-02-15 22:12:33'),(543,20,1,15460,'2.99','2005-08-23 01:10:42','2006-02-15 22:12:33'),(544,21,1,260,'3.99','2005-05-26 15:42:20','2006-02-15 22:12:33'),(545,21,2,463,'3.99','2005-05-27 20:11:47','2006-02-15 22:12:33'),(546,21,1,570,'0.99','2005-05-28 10:15:04','2006-02-15 22:12:33'),(547,21,2,2235,'7.99','2005-06-18 04:08:50','2006-02-15 22:12:33'),(548,21,1,2268,'4.99','2005-06-18 06:13:41','2006-02-15 22:12:33'),(549,21,1,2393,'2.99','2005-06-18 15:37:55','2006-02-15 22:12:33'),(550,21,2,2830,'4.99','2005-06-19 21:14:33','2006-02-15 22:12:33'),(551,21,1,3212,'10.99','2005-06-21 01:04:35','2006-02-15 22:12:33'),(552,21,2,5107,'4.99','2005-07-09 06:42:32','2006-02-15 22:12:33'),(553,21,1,5772,'3.99','2005-07-10 13:27:40','2006-02-15 22:12:33'),(554,21,1,5961,'2.99','2005-07-10 23:43:23','2006-02-15 22:12:33'),(555,21,2,6943,'1.99','2005-07-26 23:28:13','2006-02-15 22:12:33'),(556,21,1,7994,'0.99','2005-07-28 14:56:54','2006-02-15 22:12:33'),(557,21,2,8196,'6.99','2005-07-28 22:56:11','2006-02-15 22:12:33'),(558,21,2,8862,'2.99','2005-07-29 23:49:23','2006-02-15 22:12:33'),(559,21,2,9149,'0.99','2005-07-30 10:45:12','2006-02-15 22:12:33'),(560,21,1,9699,'5.99','2005-07-31 07:29:25','2006-02-15 22:12:33'),(561,21,2,10570,'4.99','2005-08-01 13:23:06','2006-02-15 22:12:33'),(562,21,1,10734,'0.99','2005-08-01 19:28:47','2006-02-15 22:12:33'),(563,21,2,11072,'0.99','2005-08-02 07:10:57','2006-02-15 22:12:33'),(564,21,2,11970,'0.99','2005-08-17 17:53:09','2006-02-15 22:12:33'),(565,21,2,12131,'2.99','2005-08-17 23:34:16','2006-02-15 22:12:33'),(566,21,2,12660,'4.99','2005-08-18 19:07:23','2006-02-15 22:12:33'),(567,21,1,12774,'6.99','2005-08-18 23:34:22','2006-02-15 22:12:33'),(568,21,1,13381,'2.99','2005-08-19 21:37:57','2006-02-15 22:12:33'),(569,21,2,13399,'4.99','2005-08-19 22:09:28','2006-02-15 22:12:33'),(570,21,1,13411,'4.99','2005-08-19 22:43:38','2006-02-15 22:12:33'),(571,21,1,13463,'8.99','2005-08-20 00:50:54','2006-02-15 22:12:33'),(572,21,1,13699,'9.99','2005-08-20 09:26:14','2006-02-15 22:12:33'),(573,21,1,13740,'4.99','2005-08-20 10:48:43','2006-02-15 22:12:33'),(574,21,2,14077,'8.99','2005-08-20 23:24:07','2006-02-15 22:12:33'),(575,21,2,14161,'2.99','2005-08-21 02:51:59','2006-02-15 22:12:33'),(576,21,2,14446,'2.99','2005-08-21 12:10:41','2006-02-15 22:12:33'),(577,21,1,14869,'4.99','2005-08-22 03:20:26','2006-02-15 22:12:33'),(578,21,1,14933,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:33'),(579,22,1,370,'4.99','2005-05-27 07:49:43','2006-02-15 22:12:33'),(580,22,1,556,'4.99','2005-05-28 08:31:36','2006-02-15 22:12:33'),(581,22,2,820,'8.99','2005-05-29 21:07:22','2006-02-15 22:12:33'),(582,22,1,3419,'2.99','2005-06-21 17:18:01','2006-02-15 22:12:33'),(583,22,2,4215,'2.99','2005-07-07 12:00:52','2006-02-15 22:12:33'),(584,22,1,5294,'6.99','2005-07-09 15:23:42','2006-02-15 22:12:33'),(585,22,1,5815,'2.99','2005-07-10 15:48:19','2006-02-15 22:12:33'),(586,22,1,7087,'4.99','2005-07-27 04:42:08','2006-02-15 22:12:33'),(587,22,1,7705,'7.99','2005-07-28 04:02:58','2006-02-15 22:12:33'),(588,22,2,9410,'0.99','2005-07-30 20:38:05','2006-02-15 22:12:33'),(589,22,1,9580,'4.99','2005-07-31 03:01:11','2006-02-15 22:12:33'),(590,22,1,12023,'5.99','2005-08-17 19:54:54','2006-02-15 22:12:33'),(591,22,1,12124,'2.99','2005-08-17 23:22:46','2006-02-15 22:12:33'),(592,22,2,12809,'0.99','2005-08-19 00:42:24','2006-02-15 22:12:33'),(593,22,2,13060,'9.99','2005-08-19 09:43:25','2006-02-15 22:12:33'),(594,22,1,14056,'2.99','2005-08-20 22:18:53','2006-02-15 22:12:33'),(595,22,1,14564,'6.99','2005-08-21 16:24:43','2006-02-15 22:12:33'),(596,22,1,15134,'7.99','2005-08-22 13:18:25','2006-02-15 22:12:33'),(597,22,1,15589,'6.99','2005-08-23 06:03:31','2006-02-15 22:12:33'),(598,22,1,15658,'4.99','2005-08-23 08:48:43','2006-02-15 22:12:33'),(599,22,1,15793,'4.99','2005-08-23 14:06:19','2006-02-15 22:12:33'),(600,22,1,12222,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:33'),(601,23,1,129,'8.99','2005-05-25 21:20:03','2006-02-15 22:12:33'),(602,23,1,654,'2.99','2005-05-28 20:15:30','2006-02-15 22:12:33'),(603,23,2,1090,'0.99','2005-05-31 12:03:44','2006-02-15 22:12:33'),(604,23,1,2753,'1.99','2005-06-19 16:44:35','2006-02-15 22:12:33'),(605,23,1,2827,'0.99','2005-06-19 20:50:01','2006-02-15 22:12:33'),(606,23,1,3015,'5.99','2005-06-20 10:48:56','2006-02-15 22:12:33'),(607,23,1,3055,'4.99','2005-06-20 13:19:58','2006-02-15 22:12:33'),(608,23,1,3461,'2.99','2005-06-21 21:49:18','2006-02-15 22:12:34'),(609,23,2,3736,'3.99','2005-07-06 11:43:44','2006-02-15 22:12:34'),(610,23,2,3781,'2.99','2005-07-06 13:53:41','2006-02-15 22:12:34'),(611,23,2,4853,'2.99','2005-07-08 18:43:18','2006-02-15 22:12:34'),(612,23,1,6213,'2.99','2005-07-11 12:43:07','2006-02-15 22:12:34'),(613,23,1,6238,'2.99','2005-07-11 14:20:18','2006-02-15 22:12:34'),(614,23,2,6917,'5.99','2005-07-12 22:30:15','2006-02-15 22:12:34'),(615,23,1,7155,'7.99','2005-07-27 07:18:46','2006-02-15 22:12:34'),(616,23,1,8015,'2.99','2005-07-28 15:33:03','2006-02-15 22:12:34'),(617,23,2,8718,'0.99','2005-07-29 17:41:14','2006-02-15 22:12:34'),(618,23,2,9209,'5.99','2005-07-30 12:55:36','2006-02-15 22:12:34'),(619,23,2,9255,'9.99','2005-07-30 14:26:46','2006-02-15 22:12:34'),(620,23,2,9718,'3.99','2005-07-31 08:25:03','2006-02-15 22:12:34'),(621,23,1,10132,'6.99','2005-07-31 21:50:24','2006-02-15 22:12:34'),(622,23,1,10898,'2.99','2005-08-02 01:29:57','2006-02-15 22:12:34'),(623,23,2,11501,'2.99','2005-08-16 23:04:53','2006-02-15 22:12:34'),(624,23,2,13290,'2.99','2005-08-19 18:31:50','2006-02-15 22:12:34'),(625,23,2,13331,'4.99','2005-08-19 20:00:25','2006-02-15 22:12:34'),(626,23,2,13429,'6.99','2005-08-19 23:25:37','2006-02-15 22:12:34'),(627,23,2,13511,'0.99','2005-08-20 02:21:40','2006-02-15 22:12:34'),(628,23,2,13557,'0.99','2005-08-20 04:12:41','2006-02-15 22:12:34'),(629,23,2,14482,'2.99','2005-08-21 13:42:45','2006-02-15 22:12:34'),(630,23,2,15532,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:34'),(631,24,2,1007,'6.99','2005-05-31 01:02:28','2006-02-15 22:12:34'),(632,24,2,1077,'2.99','2005-05-31 10:22:54','2006-02-15 22:12:34'),(633,24,1,1716,'2.99','2005-06-16 14:39:31','2006-02-15 22:12:34'),(634,24,1,2070,'2.99','2005-06-17 16:27:51','2006-02-15 22:12:34'),(635,24,2,2116,'4.99','2005-06-17 20:16:12','2006-02-15 22:12:34'),(636,24,1,2451,'5.99','2005-06-18 19:28:02','2006-02-15 22:12:34'),(637,24,2,2963,'7.99','2005-06-20 07:33:09','2006-02-15 22:12:34'),(638,24,2,3649,'7.99','2005-07-06 07:32:42','2006-02-15 22:12:34'),(639,24,2,4378,'2.99','2005-07-07 20:29:08','2006-02-15 22:12:34'),(640,24,1,5310,'0.99','2005-07-09 16:00:34','2006-02-15 22:12:34'),(641,24,2,5648,'0.99','2005-07-10 07:09:21','2006-02-15 22:12:34'),(642,24,1,6855,'4.99','2005-07-12 19:46:29','2006-02-15 22:12:34'),(643,24,1,7266,'1.99','2005-07-27 11:22:17','2006-02-15 22:12:34'),(644,24,1,8947,'4.99','2005-07-30 03:15:37','2006-02-15 22:12:34'),(645,24,1,9723,'0.99','2005-07-31 08:31:18','2006-02-15 22:12:34'),(646,24,2,9925,'0.99','2005-07-31 15:08:47','2006-02-15 22:12:34'),(647,24,2,10491,'2.99','2005-08-01 10:38:27','2006-02-15 22:12:34'),(648,24,1,11209,'2.99','2005-08-02 12:09:45','2006-02-15 22:12:34'),(649,24,2,11546,'2.99','2005-08-17 00:57:36','2006-02-15 22:12:34'),(650,24,2,12165,'8.99','2005-08-18 00:53:37','2006-02-15 22:12:34'),(651,24,1,12745,'2.99','2005-08-18 22:22:45','2006-02-15 22:12:34'),(652,24,1,12999,'1.99','2005-08-19 07:34:53','2006-02-15 22:12:34'),(653,24,2,13058,'4.99','2005-08-19 09:40:53','2006-02-15 22:12:34'),(654,24,1,13247,'0.99','2005-08-19 16:45:59','2006-02-15 22:12:34'),(655,24,2,15357,'4.99','2005-08-22 21:28:59','2006-02-15 22:12:34'),(656,25,1,90,'7.99','2005-05-25 14:31:25','2006-02-15 22:12:34'),(657,25,2,1033,'2.99','2005-05-31 04:50:07','2006-02-15 22:12:34'),(658,25,1,1338,'4.99','2005-06-15 12:17:34','2006-02-15 22:12:34'),(659,25,1,1365,'2.99','2005-06-15 14:09:55','2006-02-15 22:12:34'),(660,25,2,1754,'6.99','2005-06-16 17:13:23','2006-02-15 22:12:34'),(661,25,2,2625,'8.99','2005-06-19 08:23:11','2006-02-15 22:12:34'),(662,25,1,2901,'4.99','2005-06-20 02:41:28','2006-02-15 22:12:34'),(663,25,1,3447,'4.99','2005-06-21 20:53:31','2006-02-15 22:12:34'),(664,25,1,4282,'2.99','2005-07-07 15:26:31','2006-02-15 22:12:34'),(665,25,1,4319,'0.99','2005-07-07 17:50:27','2006-02-15 22:12:34'),(666,25,2,4404,'2.99','2005-07-07 21:31:53','2006-02-15 22:12:34'),(667,25,1,5881,'2.99','2005-07-10 19:19:43','2006-02-15 22:12:34'),(668,25,1,6653,'4.99','2005-07-12 11:06:17','2006-02-15 22:12:34'),(669,25,2,6905,'2.99','2005-07-12 22:02:18','2006-02-15 22:12:34'),(670,25,2,8667,'2.99','2005-07-29 15:40:57','2006-02-15 22:12:34'),(671,25,2,8878,'0.99','2005-07-30 00:15:57','2006-02-15 22:12:34'),(672,25,1,9140,'8.99','2005-07-30 10:12:01','2006-02-15 22:12:34'),(673,25,2,9334,'2.99','2005-07-30 17:56:38','2006-02-15 22:12:34'),(674,25,2,9922,'2.99','2005-07-31 14:59:37','2006-02-15 22:12:34'),(675,25,2,10103,'2.99','2005-07-31 20:49:13','2006-02-15 22:12:34'),(676,25,1,10324,'5.99','2005-08-01 04:49:06','2006-02-15 22:12:34'),(677,25,2,10860,'2.99','2005-08-02 00:12:32','2006-02-15 22:12:34'),(678,25,1,10916,'2.99','2005-08-02 02:05:59','2006-02-15 22:12:34'),(679,25,1,11642,'0.99','2005-08-17 04:48:05','2006-02-15 22:12:34'),(680,25,1,12922,'0.99','2005-08-19 04:48:48','2006-02-15 22:12:34'),(681,25,1,14193,'4.99','2005-08-21 03:38:27','2006-02-15 22:12:34'),(682,25,1,14236,'4.99','2005-08-21 05:13:16','2006-02-15 22:12:34'),(683,25,1,15512,'0.99','2005-08-23 02:57:30','2006-02-15 22:12:34'),(684,25,1,15972,'5.99','2005-08-23 20:00:30','2006-02-15 22:12:34'),(685,26,1,796,'2.99','2005-05-29 16:59:44','2006-02-15 22:12:34'),(686,26,2,1105,'2.99','2005-05-31 14:33:56','2006-02-15 22:12:34'),(687,26,1,1440,'5.99','2005-06-15 18:53:14','2006-02-15 22:12:34'),(688,26,2,1706,'4.99','2005-06-16 14:01:02','2006-02-15 22:12:34'),(689,26,1,2093,'9.99','2005-06-17 18:14:08','2006-02-15 22:12:34'),(690,26,2,2416,'3.99','2005-06-18 17:07:34','2006-02-15 22:12:34'),(691,26,2,2421,'6.99','2005-06-18 17:25:05','2006-02-15 22:12:34'),(692,26,1,2532,'4.99','2005-06-19 01:27:46','2006-02-15 22:12:34'),(693,26,1,2745,'4.99','2005-06-19 16:21:19','2006-02-15 22:12:34'),(694,26,1,4065,'2.99','2005-07-07 04:32:28','2006-02-15 22:12:34'),(695,26,1,4274,'4.99','2005-07-07 14:42:04','2006-02-15 22:12:34'),(696,26,1,4382,'4.99','2005-07-07 20:41:03','2006-02-15 22:12:34'),(697,26,2,4402,'0.99','2005-07-07 21:28:46','2006-02-15 22:12:34'),(698,26,1,4431,'6.99','2005-07-07 22:39:02','2006-02-15 22:12:34'),(699,26,1,4536,'3.99','2005-07-08 03:43:22','2006-02-15 22:12:34'),(700,26,1,4641,'6.99','2005-07-08 09:09:46','2006-02-15 22:12:34'),(701,26,1,5437,'2.99','2005-07-09 21:32:29','2006-02-15 22:12:34'),(702,26,1,6149,'1.99','2005-07-11 09:19:31','2006-02-15 22:12:34'),(703,26,2,6243,'2.99','2005-07-11 14:53:25','2006-02-15 22:12:34'),(704,26,2,7328,'0.99','2005-07-27 13:55:18','2006-02-15 22:12:34'),(705,26,1,8241,'4.99','2005-07-29 00:33:36','2006-02-15 22:12:34'),(706,26,1,9484,'0.99','2005-07-30 23:31:40','2006-02-15 22:12:34'),(707,26,1,10386,'3.99','2005-08-01 06:42:20','2006-02-15 22:12:34'),(708,26,1,10996,'3.99','2005-08-02 04:48:11','2006-02-15 22:12:34'),(709,26,2,11314,'2.99','2005-08-02 16:04:08','2006-02-15 22:12:34'),(710,26,1,11338,'0.99','2005-08-02 17:00:12','2006-02-15 22:12:34'),(711,26,1,11744,'5.99','2005-08-17 08:54:30','2006-02-15 22:12:34'),(712,26,2,13111,'4.99','2005-08-19 11:25:10','2006-02-15 22:12:34'),(713,26,2,14183,'4.99','2005-08-21 03:24:29','2006-02-15 22:12:34'),(714,26,2,14192,'8.99','2005-08-21 03:37:42','2006-02-15 22:12:34'),(715,26,2,14603,'1.99','2005-08-21 17:51:06','2006-02-15 22:12:34'),(716,26,1,14677,'7.99','2005-08-21 20:12:30','2006-02-15 22:12:34'),(717,26,1,15384,'2.99','2005-08-22 22:34:44','2006-02-15 22:12:34'),(718,26,1,15722,'7.99','2005-08-23 11:16:29','2006-02-15 22:12:34'),(719,27,2,787,'2.99','2005-05-29 16:03:03','2006-02-15 22:12:34'),(720,27,1,1310,'4.99','2005-06-15 10:11:42','2006-02-15 22:12:35'),(721,27,2,1480,'4.99','2005-06-15 21:17:17','2006-02-15 22:12:35'),(722,27,2,1699,'2.99','2005-06-16 13:05:09','2006-02-15 22:12:35'),(723,27,2,1960,'3.99','2005-06-17 08:59:57','2006-02-15 22:12:35'),(724,27,2,2512,'2.99','2005-06-18 23:48:47','2006-02-15 22:12:35'),(725,27,1,2815,'4.99','2005-06-19 20:03:29','2006-02-15 22:12:35'),(726,27,1,3038,'1.99','2005-06-20 12:28:59','2006-02-15 22:12:35'),(727,27,2,3420,'3.99','2005-06-21 17:22:36','2006-02-15 22:12:35'),(728,27,2,4038,'0.99','2005-07-07 02:52:53','2006-02-15 22:12:35'),(729,27,1,4510,'5.99','2005-07-08 02:34:51','2006-02-15 22:12:35'),(730,27,1,5552,'0.99','2005-07-10 03:01:19','2006-02-15 22:12:35'),(731,27,1,5736,'4.99','2005-07-10 11:45:48','2006-02-15 22:12:35'),(732,27,2,6115,'0.99','2005-07-11 07:36:50','2006-02-15 22:12:35'),(733,27,2,6562,'5.99','2005-07-12 05:26:26','2006-02-15 22:12:35'),(734,27,2,6658,'4.99','2005-07-12 11:13:21','2006-02-15 22:12:35'),(735,27,1,7927,'1.99','2005-07-28 12:13:42','2006-02-15 22:12:35'),(736,27,2,9244,'0.99','2005-07-30 14:06:53','2006-02-15 22:12:35'),(737,27,2,9636,'5.99','2005-07-31 05:12:59','2006-02-15 22:12:35'),(738,27,1,9673,'7.99','2005-07-31 06:34:55','2006-02-15 22:12:35'),(739,27,1,9908,'4.99','2005-07-31 14:39:52','2006-02-15 22:12:35'),(740,27,1,10794,'7.99','2005-08-01 21:51:15','2006-02-15 22:12:35'),(741,27,1,10852,'4.99','2005-08-02 00:00:33','2006-02-15 22:12:35'),(742,27,1,11234,'0.99','2005-08-02 13:12:17','2006-02-15 22:12:35'),(743,27,1,11661,'8.99','2005-08-17 05:25:57','2006-02-15 22:12:35'),(744,27,2,11740,'6.99','2005-08-17 08:48:31','2006-02-15 22:12:35'),(745,27,2,12021,'5.99','2005-08-17 19:52:43','2006-02-15 22:12:35'),(746,27,2,12461,'0.99','2005-08-18 11:28:14','2006-02-15 22:12:35'),(747,27,1,12531,'2.99','2005-08-18 13:57:50','2006-02-15 22:12:35'),(748,27,2,13816,'4.99','2005-08-20 13:13:56','2006-02-15 22:12:35'),(749,27,1,15048,'0.99','2005-08-22 10:00:04','2006-02-15 22:12:35'),(750,28,2,388,'2.99','2005-05-27 10:37:27','2006-02-15 22:12:35'),(751,28,1,868,'2.99','2005-05-30 04:19:55','2006-02-15 22:12:35'),(752,28,2,1240,'2.99','2005-06-15 04:58:07','2006-02-15 22:12:35'),(753,28,1,1543,'4.99','2005-06-16 01:24:08','2006-02-15 22:12:35'),(754,28,2,2299,'3.99','2005-06-18 08:18:52','2006-02-15 22:12:35'),(755,28,2,2604,'0.99','2005-06-19 06:30:10','2006-02-15 22:12:35'),(756,28,1,3231,'0.99','2005-06-21 02:25:00','2006-02-15 22:12:35'),(757,28,1,3845,'0.99','2005-07-06 16:38:14','2006-02-15 22:12:35'),(758,28,2,4704,'0.99','2005-07-08 11:45:35','2006-02-15 22:12:35'),(759,28,2,4951,'4.99','2005-07-08 22:58:21','2006-02-15 22:12:35'),(760,28,2,5653,'2.99','2005-07-10 07:21:27','2006-02-15 22:12:35'),(761,28,1,5817,'5.99','2005-07-10 15:49:12','2006-02-15 22:12:35'),(762,28,2,6032,'0.99','2005-07-11 02:49:01','2006-02-15 22:12:35'),(763,28,2,6476,'0.99','2005-07-12 01:37:48','2006-02-15 22:12:35'),(764,28,1,7580,'9.99','2005-07-27 23:07:40','2006-02-15 22:12:35'),(765,28,1,8464,'4.99','2005-07-29 08:18:20','2006-02-15 22:12:35'),(766,28,1,8901,'2.99','2005-07-30 01:07:12','2006-02-15 22:12:35'),(767,28,2,9544,'2.99','2005-07-31 01:44:51','2006-02-15 22:12:35'),(768,28,2,9593,'4.99','2005-07-31 03:22:30','2006-02-15 22:12:35'),(769,28,2,9705,'4.99','2005-07-31 07:40:33','2006-02-15 22:12:35'),(770,28,2,10116,'2.99','2005-07-31 21:14:02','2006-02-15 22:12:35'),(771,28,2,10294,'6.99','2005-08-01 03:48:12','2006-02-15 22:12:35'),(772,28,1,11444,'2.99','2005-08-02 20:32:55','2006-02-15 22:12:35'),(773,28,1,11856,'3.99','2005-08-17 13:44:49','2006-02-15 22:12:35'),(774,28,2,12190,'2.99','2005-08-18 01:54:44','2006-02-15 22:12:35'),(775,28,1,12359,'0.99','2005-08-18 07:44:05','2006-02-15 22:12:35'),(776,28,1,12708,'2.99','2005-08-18 20:59:17','2006-02-15 22:12:35'),(777,28,2,13783,'4.99','2005-08-20 12:11:03','2006-02-15 22:12:35'),(778,28,2,14540,'2.99','2005-08-21 15:34:23','2006-02-15 22:12:35'),(779,28,1,15445,'4.99','2005-08-23 00:48:29','2006-02-15 22:12:35'),(780,28,1,15491,'2.99','2005-08-23 02:08:40','2006-02-15 22:12:35'),(781,28,2,12938,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:35'),(782,29,2,194,'1.99','2005-05-26 06:52:33','2006-02-15 22:12:35'),(783,29,1,2655,'0.99','2005-06-19 10:38:42','2006-02-15 22:12:35'),(784,29,1,2673,'0.99','2005-06-19 11:42:20','2006-02-15 22:12:35'),(785,29,1,2701,'7.99','2005-06-19 13:33:06','2006-02-15 22:12:35'),(786,29,1,2735,'2.99','2005-06-19 15:42:07','2006-02-15 22:12:35'),(787,29,2,2801,'2.99','2005-06-19 19:18:09','2006-02-15 22:12:35'),(788,29,2,2923,'2.99','2005-06-20 04:16:07','2006-02-15 22:12:35'),(789,29,1,3324,'2.99','2005-06-21 08:49:16','2006-02-15 22:12:35'),(790,29,2,4262,'6.99','2005-07-07 14:24:30','2006-02-15 22:12:35'),(791,29,1,4313,'0.99','2005-07-07 17:36:56','2006-02-15 22:12:35'),(792,29,2,4535,'0.99','2005-07-08 03:40:46','2006-02-15 22:12:35'),(793,29,2,5442,'10.99','2005-07-09 21:55:19','2006-02-15 22:12:35'),(794,29,1,5857,'1.99','2005-07-10 17:59:29','2006-02-15 22:12:35'),(795,29,2,7237,'3.99','2005-07-27 10:12:36','2006-02-15 22:12:35'),(796,29,1,7451,'6.99','2005-07-27 18:18:41','2006-02-15 22:12:35'),(797,29,1,7453,'0.99','2005-07-27 18:27:13','2006-02-15 22:12:35'),(798,29,2,8673,'2.99','2005-07-29 15:50:14','2006-02-15 22:12:35'),(799,29,2,9392,'4.99','2005-07-30 19:50:13','2006-02-15 22:12:35'),(800,29,1,9946,'4.99','2005-07-31 15:48:54','2006-02-15 22:12:35'),(801,29,1,10543,'5.99','2005-08-01 12:36:09','2006-02-15 22:12:35'),(802,29,2,10899,'1.99','2005-08-02 01:30:21','2006-02-15 22:12:35'),(803,29,1,11079,'4.99','2005-08-02 07:29:10','2006-02-15 22:12:35'),(804,29,2,11962,'2.99','2005-08-17 17:34:38','2006-02-15 22:12:35'),(805,29,1,12488,'4.99','2005-08-18 12:48:22','2006-02-15 22:12:35'),(806,29,1,12508,'2.99','2005-08-18 13:20:13','2006-02-15 22:12:35'),(807,29,2,12569,'6.99','2005-08-18 15:20:46','2006-02-15 22:12:35'),(808,29,2,12615,'6.99','2005-08-18 17:16:07','2006-02-15 22:12:35'),(809,29,2,13173,'2.99','2005-08-19 13:50:36','2006-02-15 22:12:35'),(810,29,1,13436,'0.99','2005-08-19 23:36:25','2006-02-15 22:12:35'),(811,29,2,13777,'2.99','2005-08-20 12:03:35','2006-02-15 22:12:35'),(812,29,1,13832,'3.99','2005-08-20 14:00:25','2006-02-15 22:12:35'),(813,29,1,14174,'0.99','2005-08-21 03:01:45','2006-02-15 22:12:35'),(814,29,1,14703,'4.99','2005-08-21 21:01:19','2006-02-15 22:12:35'),(815,29,1,14985,'7.99','2005-08-22 07:35:56','2006-02-15 22:12:35'),(816,29,1,14997,'5.99','2005-08-22 07:53:00','2006-02-15 22:12:35'),(817,29,2,15577,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:35'),(818,30,2,1874,'1.99','2005-06-17 02:39:20','2006-02-15 22:12:35'),(819,30,2,1895,'2.99','2005-06-17 04:25:12','2006-02-15 22:12:35'),(820,30,2,2154,'4.99','2005-06-17 22:59:42','2006-02-15 22:12:35'),(821,30,2,2730,'2.99','2005-06-19 15:10:09','2006-02-15 22:12:35'),(822,30,1,3964,'4.99','2005-07-06 22:23:02','2006-02-15 22:12:35'),(823,30,2,4471,'2.99','2005-07-08 00:21:29','2006-02-15 22:12:35'),(824,30,2,4642,'2.99','2005-07-08 09:13:28','2006-02-15 22:12:35'),(825,30,2,5028,'5.99','2005-07-09 02:34:45','2006-02-15 22:12:36'),(826,30,1,5108,'9.99','2005-07-09 06:44:30','2006-02-15 22:12:36'),(827,30,1,5289,'0.99','2005-07-09 15:14:08','2006-02-15 22:12:36'),(828,30,2,5972,'7.99','2005-07-11 00:08:54','2006-02-15 22:12:36'),(829,30,1,6249,'0.99','2005-07-11 15:02:02','2006-02-15 22:12:36'),(830,30,2,6359,'2.99','2005-07-11 21:06:17','2006-02-15 22:12:36'),(831,30,2,7394,'2.99','2005-07-27 16:03:08','2006-02-15 22:12:36'),(832,30,2,7769,'4.99','2005-07-28 06:45:23','2006-02-15 22:12:36'),(833,30,1,8030,'4.99','2005-07-28 16:12:53','2006-02-15 22:12:36'),(834,30,2,8038,'4.99','2005-07-28 16:32:55','2006-02-15 22:12:36'),(835,30,1,8083,'4.99','2005-07-28 18:09:48','2006-02-15 22:12:36'),(836,30,1,8641,'2.99','2005-07-29 14:37:30','2006-02-15 22:12:36'),(837,30,2,9309,'2.99','2005-07-30 16:55:53','2006-02-15 22:12:36'),(838,30,2,9551,'0.99','2005-07-31 02:04:58','2006-02-15 22:12:36'),(839,30,1,9641,'0.99','2005-07-31 05:33:48','2006-02-15 22:12:36'),(840,30,1,9998,'2.99','2005-07-31 17:40:35','2006-02-15 22:12:36'),(841,30,1,10235,'6.99','2005-08-01 01:57:48','2006-02-15 22:12:36'),(842,30,1,12240,'2.99','2005-08-18 03:27:11','2006-02-15 22:12:36'),(843,30,1,12546,'2.99','2005-08-18 14:29:37','2006-02-15 22:12:36'),(844,30,2,12758,'0.99','2005-08-18 22:58:34','2006-02-15 22:12:36'),(845,30,1,13435,'0.99','2005-08-19 23:35:44','2006-02-15 22:12:36'),(846,30,1,13682,'4.99','2005-08-20 08:50:39','2006-02-15 22:12:36'),(847,30,1,14339,'0.99','2005-08-21 08:37:15','2006-02-15 22:12:36'),(848,30,1,14585,'2.99','2005-08-21 17:18:33','2006-02-15 22:12:36'),(849,30,1,15063,'4.99','2005-08-22 10:39:51','2006-02-15 22:12:36'),(850,30,1,15544,'4.99','2005-08-23 04:17:56','2006-02-15 22:12:36'),(851,30,2,15829,'2.99','2005-08-23 15:17:14','2006-02-15 22:12:36'),(852,31,2,1656,'4.99','2005-06-16 10:05:40','2006-02-15 22:12:36'),(853,31,1,1838,'1.99','2005-06-16 23:20:16','2006-02-15 22:12:36'),(854,31,1,2233,'0.99','2005-06-18 03:57:36','2006-02-15 22:12:36'),(855,31,2,2341,'6.99','2005-06-18 11:35:30','2006-02-15 22:12:36'),(856,31,1,2396,'7.99','2005-06-18 15:49:48','2006-02-15 22:12:36'),(857,31,2,2438,'0.99','2005-06-18 18:34:21','2006-02-15 22:12:36'),(858,31,1,2530,'0.99','2005-06-19 01:20:00','2006-02-15 22:12:36'),(859,31,2,2648,'4.99','2005-06-19 10:06:20','2006-02-15 22:12:36'),(860,31,2,3117,'2.99','2005-06-20 18:05:15','2006-02-15 22:12:36'),(861,31,2,3172,'1.99','2005-06-20 22:19:25','2006-02-15 22:12:36'),(862,31,1,3205,'0.99','2005-06-21 00:38:47','2006-02-15 22:12:36'),(863,31,1,3701,'4.99','2005-07-06 10:12:45','2006-02-15 22:12:36'),(864,31,2,3967,'4.99','2005-07-06 22:45:10','2006-02-15 22:12:36'),(865,31,1,4122,'6.99','2005-07-07 07:15:35','2006-02-15 22:12:36'),(866,31,2,4738,'9.99','2005-07-08 13:24:58','2006-02-15 22:12:36'),(867,31,1,6208,'3.99','2005-07-11 12:34:56','2006-02-15 22:12:36'),(868,31,2,6580,'4.99','2005-07-12 06:26:10','2006-02-15 22:12:36'),(869,31,1,7000,'1.99','2005-07-27 01:23:24','2006-02-15 22:12:36'),(870,31,2,7138,'3.99','2005-07-27 06:47:13','2006-02-15 22:12:36'),(871,31,2,7178,'2.99','2005-07-27 08:09:25','2006-02-15 22:12:36'),(872,31,2,7464,'2.99','2005-07-27 18:49:42','2006-02-15 22:12:36'),(873,31,2,8997,'0.99','2005-07-30 04:53:56','2006-02-15 22:12:36'),(874,31,2,12085,'4.99','2005-08-17 22:17:09','2006-02-15 22:12:36'),(875,31,1,12377,'0.99','2005-08-18 08:26:05','2006-02-15 22:12:36'),(876,31,2,15682,'6.99','2005-08-23 09:37:34','2006-02-15 22:12:36'),(877,31,2,15816,'6.99','2005-08-23 14:58:06','2006-02-15 22:12:36'),(878,32,2,483,'4.99','2005-05-27 23:00:25','2006-02-15 22:12:36'),(879,32,2,803,'4.99','2005-05-29 17:52:30','2006-02-15 22:12:36'),(880,32,2,1067,'4.99','2005-05-31 09:12:13','2006-02-15 22:12:36'),(881,32,2,1887,'6.99','2005-06-17 03:53:18','2006-02-15 22:12:36'),(882,32,2,2160,'0.99','2005-06-17 23:39:11','2006-02-15 22:12:36'),(883,32,2,2624,'5.99','2005-06-19 08:22:09','2006-02-15 22:12:36'),(884,32,2,2891,'1.99','2005-06-20 02:02:05','2006-02-15 22:12:36'),(885,32,1,3500,'2.99','2005-07-06 00:11:13','2006-02-15 22:12:36'),(886,32,1,4434,'2.99','2005-07-07 22:48:34','2006-02-15 22:12:36'),(887,32,2,4771,'2.99','2005-07-08 15:33:32','2006-02-15 22:12:36'),(888,32,2,4899,'0.99','2005-07-08 20:37:11','2006-02-15 22:12:36'),(889,32,1,5307,'9.99','2005-07-09 15:57:15','2006-02-15 22:12:36'),(890,32,1,5767,'0.99','2005-07-10 13:13:18','2006-02-15 22:12:36'),(891,32,1,5954,'2.99','2005-07-10 23:22:01','2006-02-15 22:12:36'),(892,32,1,6122,'3.99','2005-07-11 07:58:07','2006-02-15 22:12:36'),(893,32,2,6450,'2.99','2005-07-12 00:49:05','2006-02-15 22:12:36'),(894,32,1,7084,'6.99','2005-07-27 04:34:07','2006-02-15 22:12:36'),(895,32,1,7589,'5.99','2005-07-27 23:23:36','2006-02-15 22:12:36'),(896,32,1,7793,'2.99','2005-07-28 07:26:14','2006-02-15 22:12:36'),(897,32,2,8390,'5.99','2005-07-29 05:52:26','2006-02-15 22:12:36'),(898,32,2,8453,'2.99','2005-07-29 07:46:29','2006-02-15 22:12:36'),(899,32,2,8914,'2.99','2005-07-30 01:42:03','2006-02-15 22:12:36'),(900,32,1,11135,'4.99','2005-08-02 09:22:25','2006-02-15 22:12:36'),(901,32,2,11831,'4.99','2005-08-17 12:54:47','2006-02-15 22:12:36'),(902,32,2,12414,'9.99','2005-08-18 09:50:40','2006-02-15 22:12:36'),(903,32,1,13736,'8.99','2005-08-20 10:31:23','2006-02-15 22:12:36'),(904,32,1,13931,'1.99','2005-08-20 17:16:10','2006-02-15 22:12:36'),(905,32,1,14075,'0.99','2005-08-20 23:18:54','2006-02-15 22:12:36'),(906,32,2,14570,'5.99','2005-08-21 16:32:32','2006-02-15 22:12:36'),(907,33,1,165,'2.99','2005-05-26 02:28:36','2006-02-15 22:12:36'),(908,33,1,1301,'10.99','2005-06-15 09:46:33','2006-02-15 22:12:36'),(909,33,2,3173,'8.99','2005-06-20 22:21:10','2006-02-15 22:12:36'),(910,33,1,4095,'5.99','2005-07-07 06:01:48','2006-02-15 22:12:36'),(911,33,1,5421,'0.99','2005-07-09 20:49:12','2006-02-15 22:12:36'),(912,33,1,5723,'4.99','2005-07-10 11:14:48','2006-02-15 22:12:36'),(913,33,2,6280,'0.99','2005-07-11 16:36:17','2006-02-15 22:12:36'),(914,33,1,7992,'4.99','2005-07-28 14:53:06','2006-02-15 22:12:36'),(915,33,1,9040,'4.99','2005-07-30 06:31:45','2006-02-15 22:12:36'),(916,33,2,9085,'4.99','2005-07-30 08:17:24','2006-02-15 22:12:36'),(917,33,1,9254,'1.99','2005-07-30 14:26:11','2006-02-15 22:12:36'),(918,33,2,10335,'2.99','2005-08-01 04:59:30','2006-02-15 22:12:36'),(919,33,1,10870,'4.99','2005-08-02 00:27:12','2006-02-15 22:12:36'),(920,33,1,13241,'7.99','2005-08-19 16:25:00','2006-02-15 22:12:36'),(921,33,1,13858,'2.99','2005-08-20 14:50:57','2006-02-15 22:12:36'),(922,33,1,13958,'7.99','2005-08-20 18:11:44','2006-02-15 22:12:36'),(923,33,1,14002,'0.99','2005-08-20 20:12:19','2006-02-15 22:12:36'),(924,33,1,14623,'0.99','2005-08-21 18:29:13','2006-02-15 22:12:36'),(925,33,1,15096,'5.99','2005-08-22 11:43:04','2006-02-15 22:12:36'),(926,33,2,15115,'2.99','2005-08-22 12:28:01','2006-02-15 22:12:36'),(927,33,1,12277,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:36'),(928,34,1,1900,'4.99','2005-06-17 04:29:58','2006-02-15 22:12:36'),(929,34,2,2257,'5.99','2005-06-18 05:29:52','2006-02-15 22:12:36'),(930,34,1,3150,'0.99','2005-06-20 20:35:28','2006-02-15 22:12:36'),(931,34,2,3508,'3.99','2005-07-06 00:24:25','2006-02-15 22:12:36'),(932,34,1,3911,'2.99','2005-07-06 20:09:11','2006-02-15 22:12:36'),(933,34,1,5188,'4.99','2005-07-09 10:22:31','2006-02-15 22:12:36'),(934,34,2,5643,'4.99','2005-07-10 06:49:00','2006-02-15 22:12:36'),(935,34,2,5918,'5.99','2005-07-10 21:32:06','2006-02-15 22:12:36'),(936,34,2,7015,'2.99','2005-07-27 02:15:01','2006-02-15 22:12:36'),(937,34,2,7124,'2.99','2005-07-27 06:09:30','2006-02-15 22:12:36'),(938,34,1,7532,'0.99','2005-07-27 21:20:52','2006-02-15 22:12:36'),(939,34,1,9160,'3.99','2005-07-30 11:17:33','2006-02-15 22:12:37'),(940,34,1,10523,'0.99','2005-08-01 11:52:32','2006-02-15 22:12:37'),(941,34,1,10615,'4.99','2005-08-01 14:58:14','2006-02-15 22:12:37'),(942,34,2,11096,'0.99','2005-08-02 08:05:19','2006-02-15 22:12:37'),(943,34,1,11505,'2.99','2005-08-16 23:18:47','2006-02-15 22:12:37'),(944,34,2,11701,'4.99','2005-08-17 07:15:47','2006-02-15 22:12:37'),(945,34,2,12286,'2.99','2005-08-18 04:57:59','2006-02-15 22:12:37'),(946,34,1,12599,'2.99','2005-08-18 16:42:45','2006-02-15 22:12:37'),(947,34,1,12651,'0.99','2005-08-18 18:36:16','2006-02-15 22:12:37'),(948,34,1,13371,'4.99','2005-08-19 21:21:47','2006-02-15 22:12:37'),(949,34,2,13949,'2.99','2005-08-20 17:55:13','2006-02-15 22:12:37'),(950,34,1,14686,'5.99','2005-08-21 20:32:08','2006-02-15 22:12:37'),(951,34,2,14701,'7.99','2005-08-21 20:54:32','2006-02-15 22:12:37'),(952,35,2,47,'3.99','2005-05-25 06:05:20','2006-02-15 22:12:37'),(953,35,1,424,'6.99','2005-05-27 15:34:01','2006-02-15 22:12:37'),(954,35,1,1579,'0.99','2005-06-16 04:09:08','2006-02-15 22:12:37'),(955,35,1,1989,'2.99','2005-06-17 10:47:24','2006-02-15 22:12:37'),(956,35,1,2229,'4.99','2005-06-18 03:50:18','2006-02-15 22:12:37'),(957,35,1,2231,'0.99','2005-06-18 03:52:14','2006-02-15 22:12:37'),(958,35,1,2743,'2.99','2005-06-19 16:15:56','2006-02-15 22:12:37'),(959,35,2,3112,'4.99','2005-06-20 17:53:30','2006-02-15 22:12:37'),(960,35,2,3597,'2.99','2005-07-06 05:03:59','2006-02-15 22:12:37'),(961,35,2,4098,'4.99','2005-07-07 06:14:51','2006-02-15 22:12:37'),(962,35,2,4990,'0.99','2005-07-09 00:48:49','2006-02-15 22:12:37'),(963,35,1,5013,'2.99','2005-07-09 01:46:45','2006-02-15 22:12:37'),(964,35,2,5323,'0.99','2005-07-09 16:34:07','2006-02-15 22:12:37'),(965,35,1,5916,'5.99','2005-07-10 21:26:31','2006-02-15 22:12:37'),(966,35,1,5963,'0.99','2005-07-10 23:47:08','2006-02-15 22:12:37'),(967,35,1,6147,'5.99','2005-07-11 09:13:08','2006-02-15 22:12:37'),(968,35,1,6401,'4.99','2005-07-11 22:44:34','2006-02-15 22:12:37'),(969,35,1,6565,'4.99','2005-07-12 05:39:50','2006-02-15 22:12:37'),(970,35,1,6572,'4.99','2005-07-12 05:56:38','2006-02-15 22:12:37'),(971,35,1,7140,'4.99','2005-07-27 06:54:12','2006-02-15 22:12:37'),(972,35,1,8822,'6.99','2005-07-29 22:20:21','2006-02-15 22:12:37'),(973,35,1,8971,'5.99','2005-07-30 04:03:58','2006-02-15 22:12:37'),(974,35,2,9033,'2.99','2005-07-30 06:07:42','2006-02-15 22:12:37'),(975,35,1,9579,'6.99','2005-07-31 02:59:20','2006-02-15 22:12:37'),(976,35,1,11298,'1.99','2005-08-02 15:32:32','2006-02-15 22:12:37'),(977,35,1,11452,'7.99','2005-08-02 20:59:52','2006-02-15 22:12:37'),(978,35,1,11645,'4.99','2005-08-17 04:50:56','2006-02-15 22:12:37'),(979,35,1,12055,'4.99','2005-08-17 21:02:19','2006-02-15 22:12:37'),(980,35,1,13735,'2.99','2005-08-20 10:31:01','2006-02-15 22:12:37'),(981,35,1,14110,'0.99','2005-08-21 00:53:09','2006-02-15 22:12:37'),(982,35,2,14124,'2.99','2005-08-21 01:31:51','2006-02-15 22:12:37'),(983,35,2,14735,'4.99','2005-08-21 22:25:09','2006-02-15 22:12:37'),(984,36,1,349,'0.99','2005-05-27 04:53:11','2006-02-15 22:12:37'),(985,36,1,716,'0.99','2005-05-29 04:35:29','2006-02-15 22:12:37'),(986,36,2,2741,'0.99','2005-06-19 16:05:41','2006-02-15 22:12:37'),(987,36,2,4135,'0.99','2005-07-07 08:15:03','2006-02-15 22:12:37'),(988,36,2,4560,'4.99','2005-07-08 04:58:48','2006-02-15 22:12:37'),(989,36,2,4762,'4.99','2005-07-08 14:54:42','2006-02-15 22:12:37'),(990,36,1,5403,'0.99','2005-07-09 20:07:09','2006-02-15 22:12:37'),(991,36,2,6030,'0.99','2005-07-11 02:37:51','2006-02-15 22:12:37'),(992,36,1,7205,'6.99','2005-07-27 09:06:13','2006-02-15 22:12:37'),(993,36,1,7647,'0.99','2005-07-28 01:35:17','2006-02-15 22:12:37'),(994,36,2,7919,'6.99','2005-07-28 11:59:45','2006-02-15 22:12:37'),(995,36,2,8099,'0.99','2005-07-28 18:35:12','2006-02-15 22:12:37'),(996,36,1,8391,'2.99','2005-07-29 05:52:50','2006-02-15 22:12:37'),(997,36,1,8952,'4.99','2005-07-30 03:20:38','2006-02-15 22:12:37'),(998,36,1,9369,'2.99','2005-07-30 18:52:19','2006-02-15 22:12:37'),(999,36,2,9805,'0.99','2005-07-31 11:11:10','2006-02-15 22:12:37'),(1000,36,2,10525,'2.99','2005-08-01 11:53:17','2006-02-15 22:12:37'),(1001,36,2,10761,'2.99','2005-08-01 20:25:35','2006-02-15 22:12:37'),(1002,36,1,10963,'0.99','2005-08-02 03:48:17','2006-02-15 22:12:37'),(1003,36,2,10964,'6.99','2005-08-02 03:56:23','2006-02-15 22:12:37'),(1004,36,2,11616,'4.99','2005-08-17 04:00:01','2006-02-15 22:12:37'),(1005,36,1,11813,'4.99','2005-08-17 12:06:54','2006-02-15 22:12:37'),(1006,36,2,13562,'2.99','2005-08-20 04:31:45','2006-02-15 22:12:37'),(1007,36,2,13564,'1.99','2005-08-20 04:34:46','2006-02-15 22:12:37'),(1008,36,1,13674,'4.99','2005-08-20 08:30:54','2006-02-15 22:12:37'),(1009,36,1,14647,'9.99','2005-08-21 19:15:33','2006-02-15 22:12:37'),(1010,36,2,15657,'4.99','2005-08-23 08:42:40','2006-02-15 22:12:37'),(1011,37,1,25,'0.99','2005-05-25 03:21:20','2006-02-15 22:12:37'),(1012,37,1,923,'2.99','2005-05-30 11:58:50','2006-02-15 22:12:37'),(1013,37,1,1583,'4.99','2005-06-16 04:44:23','2006-02-15 22:12:37'),(1014,37,2,1812,'1.99','2005-06-16 21:08:46','2006-02-15 22:12:37'),(1015,37,2,1854,'3.99','2005-06-17 00:43:57','2006-02-15 22:12:37'),(1016,37,2,3472,'7.99','2005-07-05 22:56:33','2006-02-15 22:12:37'),(1017,37,1,3734,'5.99','2005-07-06 11:40:27','2006-02-15 22:12:37'),(1018,37,1,5425,'5.99','2005-07-09 21:02:26','2006-02-15 22:12:37'),(1019,37,2,7939,'0.99','2005-07-28 12:45:47','2006-02-15 22:12:37'),(1020,37,1,8419,'9.99','2005-07-29 06:54:48','2006-02-15 22:12:37'),(1021,37,1,9567,'5.99','2005-07-31 02:36:11','2006-02-15 22:12:37'),(1022,37,1,10538,'2.99','2005-08-01 12:22:41','2006-02-15 22:12:37'),(1023,37,1,11176,'3.99','2005-08-02 10:39:43','2006-02-15 22:12:37'),(1024,37,1,13046,'7.99','2005-08-19 09:21:10','2006-02-15 22:12:37'),(1025,37,2,13147,'4.99','2005-08-19 12:55:09','2006-02-15 22:12:37'),(1026,37,2,13444,'0.99','2005-08-20 00:00:24','2006-02-15 22:12:37'),(1027,37,2,13493,'3.99','2005-08-20 01:33:36','2006-02-15 22:12:37'),(1028,37,2,14025,'8.99','2005-08-20 21:19:36','2006-02-15 22:12:37'),(1029,37,1,14084,'0.99','2005-08-20 23:42:46','2006-02-15 22:12:37'),(1030,37,2,14532,'2.99','2005-08-21 15:15:03','2006-02-15 22:12:37'),(1031,37,1,15028,'3.99','2005-08-22 09:03:44','2006-02-15 22:12:37'),(1032,37,1,15904,'0.99','2005-08-23 17:32:19','2006-02-15 22:12:37'),(1033,37,2,16035,'0.99','2005-08-23 22:08:04','2006-02-15 22:12:37'),(1034,38,2,1250,'2.99','2005-06-15 05:55:40','2006-02-15 22:12:37'),(1035,38,1,2550,'1.99','2005-06-19 02:49:55','2006-02-15 22:12:37'),(1036,38,2,2605,'1.99','2005-06-19 06:48:01','2006-02-15 22:12:37'),(1037,38,2,3003,'4.99','2005-06-20 10:00:51','2006-02-15 22:12:37'),(1038,38,2,3392,'3.99','2005-06-21 15:12:44','2006-02-15 22:12:37'),(1039,38,1,4202,'5.99','2005-07-07 11:23:48','2006-02-15 22:12:37'),(1040,38,2,4228,'1.99','2005-07-07 12:42:02','2006-02-15 22:12:37'),(1041,38,1,4300,'4.99','2005-07-07 16:36:16','2006-02-15 22:12:37'),(1042,38,2,4644,'4.99','2005-07-08 09:14:29','2006-02-15 22:12:37'),(1043,38,1,5273,'2.99','2005-07-09 14:31:24','2006-02-15 22:12:37'),(1044,38,2,5460,'2.99','2005-07-09 22:46:14','2006-02-15 22:12:37'),(1045,38,1,5822,'2.99','2005-07-10 16:10:39','2006-02-15 22:12:37'),(1046,38,1,6864,'5.99','2005-07-12 19:59:25','2006-02-15 22:12:38'),(1047,38,1,6961,'0.99','2005-07-27 00:10:49','2006-02-15 22:12:38'),(1048,38,2,7158,'4.99','2005-07-27 07:23:58','2006-02-15 22:12:38'),(1049,38,2,7163,'5.99','2005-07-27 07:36:11','2006-02-15 22:12:38'),(1050,38,2,7321,'5.99','2005-07-27 13:33:38','2006-02-15 22:12:38'),(1051,38,1,7795,'0.99','2005-07-28 07:28:16','2006-02-15 22:12:38'),(1052,38,2,8924,'3.99','2005-07-30 02:08:58','2006-02-15 22:12:38'),(1053,38,2,9216,'0.99','2005-07-30 13:11:19','2006-02-15 22:12:38'),(1054,38,1,9284,'0.99','2005-07-30 15:25:19','2006-02-15 22:12:38'),(1055,38,1,9621,'4.99','2005-07-31 04:21:08','2006-02-15 22:12:38'),(1056,38,2,10111,'2.99','2005-07-31 21:08:33','2006-02-15 22:12:38'),(1057,38,2,10524,'6.99','2005-08-01 11:53:12','2006-02-15 22:12:38'),(1058,38,2,11049,'3.99','2005-08-02 06:15:40','2006-02-15 22:12:38'),(1059,38,1,11344,'2.99','2005-08-02 17:13:26','2006-02-15 22:12:38'),(1060,38,1,11817,'4.99','2005-08-17 12:20:01','2006-02-15 22:12:38'),(1061,38,2,12092,'0.99','2005-08-17 22:28:15','2006-02-15 22:12:38'),(1062,38,2,12187,'1.99','2005-08-18 01:45:50','2006-02-15 22:12:38'),(1063,38,1,14554,'4.99','2005-08-21 16:03:01','2006-02-15 22:12:38'),(1064,38,2,14632,'2.99','2005-08-21 18:48:06','2006-02-15 22:12:38'),(1065,38,1,14787,'6.99','2005-08-22 00:25:59','2006-02-15 22:12:38'),(1066,38,1,15668,'2.99','2005-08-23 09:02:04','2006-02-15 22:12:38'),(1067,38,1,15738,'5.99','2005-08-23 11:55:50','2006-02-15 22:12:38'),(1068,39,1,1625,'5.99','2005-06-16 07:49:08','2006-02-15 22:12:38'),(1069,39,1,1905,'4.99','2005-06-17 04:51:43','2006-02-15 22:12:38'),(1070,39,2,2135,'0.99','2005-06-17 21:14:02','2006-02-15 22:12:38'),(1071,39,2,2439,'4.99','2005-06-18 18:35:04','2006-02-15 22:12:38'),(1072,39,1,2631,'4.99','2005-06-19 08:49:53','2006-02-15 22:12:38'),(1073,39,1,2876,'4.99','2005-06-20 01:06:34','2006-02-15 22:12:38'),(1074,39,1,4419,'5.99','2005-07-07 22:06:24','2006-02-15 22:12:38'),(1075,39,2,4695,'8.99','2005-07-08 11:07:59','2006-02-15 22:12:38'),(1076,39,2,4712,'6.99','2005-07-08 12:10:50','2006-02-15 22:12:38'),(1077,39,2,4727,'7.99','2005-07-08 12:54:15','2006-02-15 22:12:38'),(1078,39,1,5451,'4.99','2005-07-09 22:22:10','2006-02-15 22:12:38'),(1079,39,2,5515,'2.99','2005-07-10 01:12:44','2006-02-15 22:12:38'),(1080,39,1,6045,'2.99','2005-07-11 03:21:05','2006-02-15 22:12:38'),(1081,39,2,8307,'6.99','2005-07-29 03:18:34','2006-02-15 22:12:38'),(1082,39,2,8366,'1.99','2005-07-29 05:11:14','2006-02-15 22:12:38'),(1083,39,2,8723,'7.99','2005-07-29 18:03:47','2006-02-15 22:12:38'),(1084,39,1,8805,'2.99','2005-07-29 21:29:58','2006-02-15 22:12:38'),(1085,39,1,9431,'1.99','2005-07-30 21:24:22','2006-02-15 22:12:38'),(1086,39,1,9656,'4.99','2005-07-31 06:00:21','2006-02-15 22:12:38'),(1087,39,2,10052,'4.99','2005-07-31 19:15:13','2006-02-15 22:12:38'),(1088,39,1,10126,'0.99','2005-07-31 21:36:07','2006-02-15 22:12:38'),(1089,39,1,10251,'4.99','2005-08-01 02:39:12','2006-02-15 22:12:38'),(1090,39,2,10269,'4.99','2005-08-01 03:09:26','2006-02-15 22:12:38'),(1091,39,2,10630,'0.99','2005-08-01 15:34:46','2006-02-15 22:12:38'),(1092,39,1,10639,'9.99','2005-08-01 15:44:43','2006-02-15 22:12:38'),(1093,39,2,12268,'0.99','2005-08-18 04:26:54','2006-02-15 22:12:38'),(1094,39,2,12459,'4.99','2005-08-18 11:25:11','2006-02-15 22:12:38'),(1095,39,2,13101,'7.99','2005-08-19 11:01:54','2006-02-15 22:12:38'),(1096,39,2,15124,'5.99','2005-08-22 12:51:38','2006-02-15 22:12:38'),(1097,40,1,128,'4.99','2005-05-25 21:19:53','2006-02-15 22:12:38'),(1098,40,2,2470,'7.99','2005-06-18 20:28:31','2006-02-15 22:12:38'),(1099,40,2,2896,'2.99','2005-06-20 02:33:42','2006-02-15 22:12:38'),(1100,40,1,2993,'4.99','2005-06-20 09:12:12','2006-02-15 22:12:38'),(1101,40,1,3428,'0.99','2005-06-21 18:39:34','2006-02-15 22:12:38'),(1102,40,2,5001,'1.99','2005-07-09 01:17:04','2006-02-15 22:12:38'),(1103,40,2,5777,'2.99','2005-07-10 13:38:41','2006-02-15 22:12:38'),(1104,40,1,5869,'5.99','2005-07-10 18:40:09','2006-02-15 22:12:38'),(1105,40,1,6502,'0.99','2005-07-12 03:15:45','2006-02-15 22:12:38'),(1106,40,2,7684,'0.99','2005-07-28 03:11:54','2006-02-15 22:12:38'),(1107,40,2,8031,'0.99','2005-07-28 16:15:49','2006-02-15 22:12:38'),(1108,40,2,8170,'3.99','2005-07-28 21:32:29','2006-02-15 22:12:38'),(1109,40,1,9050,'8.99','2005-07-30 06:59:55','2006-02-15 22:12:38'),(1110,40,2,9700,'4.99','2005-07-31 07:29:59','2006-02-15 22:12:38'),(1111,40,2,9961,'6.99','2005-07-31 16:07:50','2006-02-15 22:12:38'),(1112,40,1,9975,'1.99','2005-07-31 16:53:43','2006-02-15 22:12:38'),(1113,40,1,10442,'2.99','2005-08-01 08:58:08','2006-02-15 22:12:38'),(1114,40,2,11919,'0.99','2005-08-17 16:08:49','2006-02-15 22:12:38'),(1115,40,2,11948,'3.99','2005-08-17 17:11:05','2006-02-15 22:12:38'),(1116,40,2,12396,'9.99','2005-08-18 09:11:23','2006-02-15 22:12:38'),(1117,40,2,12877,'2.99','2005-08-19 03:16:58','2006-02-15 22:12:38'),(1118,40,1,13149,'6.99','2005-08-19 13:07:12','2006-02-15 22:12:38'),(1119,40,1,13376,'0.99','2005-08-19 21:31:45','2006-02-15 22:12:38'),(1120,40,1,13840,'5.99','2005-08-20 14:23:20','2006-02-15 22:12:38'),(1121,40,1,13951,'2.99','2005-08-20 17:58:11','2006-02-15 22:12:38'),(1122,40,1,14260,'6.99','2005-08-21 06:01:08','2006-02-15 22:12:38'),(1123,40,1,15193,'2.99','2005-08-22 16:06:49','2006-02-15 22:12:38'),(1124,41,1,2563,'4.99','2005-06-19 03:24:17','2006-02-15 22:12:38'),(1125,41,2,3246,'7.99','2005-06-21 03:10:01','2006-02-15 22:12:38'),(1126,41,2,3827,'2.99','2005-07-06 15:52:03','2006-02-15 22:12:38'),(1127,41,2,4294,'9.99','2005-07-07 15:56:23','2006-02-15 22:12:38'),(1128,41,1,4543,'4.99','2005-07-08 04:06:55','2006-02-15 22:12:38'),(1129,41,1,4575,'2.99','2005-07-08 05:49:14','2006-02-15 22:12:38'),(1130,41,1,6976,'4.99','2005-07-27 00:40:01','2006-02-15 22:12:38'),(1131,41,2,7153,'4.99','2005-07-27 07:15:38','2006-02-15 22:12:38'),(1132,41,1,7517,'1.99','2005-07-27 20:57:07','2006-02-15 22:12:38'),(1133,41,2,8008,'6.99','2005-07-28 15:25:55','2006-02-15 22:12:38'),(1134,41,1,8098,'0.99','2005-07-28 18:34:20','2006-02-15 22:12:38'),(1135,41,1,8134,'6.99','2005-07-28 20:01:23','2006-02-15 22:12:38'),(1136,41,2,8225,'2.99','2005-07-28 23:59:29','2006-02-15 22:12:38'),(1137,41,1,8712,'2.99','2005-07-29 17:30:06','2006-02-15 22:12:38'),(1138,41,2,9313,'5.99','2005-07-30 16:59:43','2006-02-15 22:12:38'),(1139,41,1,10064,'2.99','2005-07-31 19:27:02','2006-02-15 22:12:38'),(1140,41,1,10170,'7.99','2005-07-31 23:27:31','2006-02-15 22:12:38'),(1141,41,2,10495,'4.99','2005-08-01 10:45:51','2006-02-15 22:12:38'),(1142,41,1,10853,'5.99','2005-08-02 00:00:54','2006-02-15 22:12:38'),(1143,41,2,12147,'2.99','2005-08-18 00:10:20','2006-02-15 22:12:38'),(1144,41,2,12173,'3.99','2005-08-18 01:08:34','2006-02-15 22:12:38'),(1145,41,2,12821,'0.99','2005-08-19 01:07:02','2006-02-15 22:12:38'),(1146,41,2,14539,'7.99','2005-08-21 15:29:47','2006-02-15 22:12:38'),(1147,41,2,15860,'4.99','2005-08-23 16:08:40','2006-02-15 22:12:38'),(1148,41,1,15875,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1149,42,1,635,'5.99','2005-05-28 17:46:57','2006-02-15 22:12:39'),(1150,42,2,1534,'0.99','2005-06-16 00:49:32','2006-02-15 22:12:39'),(1151,42,2,2056,'2.99','2005-06-17 15:27:33','2006-02-15 22:12:39'),(1152,42,1,2170,'3.99','2005-06-17 23:57:34','2006-02-15 22:12:39'),(1153,42,1,2302,'4.99','2005-06-18 08:27:33','2006-02-15 22:12:39'),(1154,42,2,4391,'2.99','2005-07-07 21:09:38','2006-02-15 22:12:39'),(1155,42,2,5199,'4.99','2005-07-09 10:50:56','2006-02-15 22:12:39'),(1156,42,2,5517,'5.99','2005-07-10 01:15:00','2006-02-15 22:12:39'),(1157,42,2,5652,'3.99','2005-07-10 07:18:58','2006-02-15 22:12:39'),(1158,42,1,6179,'2.99','2005-07-11 10:59:59','2006-02-15 22:12:39'),(1159,42,1,6799,'2.99','2005-07-12 16:52:13','2006-02-15 22:12:39'),(1160,42,1,6925,'0.99','2005-07-26 22:52:32','2006-02-15 22:12:39'),(1161,42,1,7405,'3.99','2005-07-27 16:25:11','2006-02-15 22:12:39'),(1162,42,1,8049,'0.99','2005-07-28 16:51:58','2006-02-15 22:12:39'),(1163,42,1,8095,'6.99','2005-07-28 18:32:40','2006-02-15 22:12:39'),(1164,42,1,8166,'2.99','2005-07-28 21:23:33','2006-02-15 22:12:39'),(1165,42,1,8499,'3.99','2005-07-29 09:10:41','2006-02-15 22:12:39'),(1166,42,2,8785,'2.99','2005-07-29 20:36:26','2006-02-15 22:12:39'),(1167,42,2,8852,'3.99','2005-07-29 23:30:03','2006-02-15 22:12:39'),(1168,42,2,8915,'3.99','2005-07-30 01:42:09','2006-02-15 22:12:39'),(1169,42,2,10060,'6.99','2005-07-31 19:23:00','2006-02-15 22:12:39'),(1170,42,2,10345,'2.99','2005-08-01 05:18:56','2006-02-15 22:12:39'),(1171,42,2,10845,'2.99','2005-08-01 23:47:03','2006-02-15 22:12:39'),(1172,42,1,10935,'5.99','2005-08-02 02:54:53','2006-02-15 22:12:39'),(1173,42,1,12478,'4.99','2005-08-18 12:25:16','2006-02-15 22:12:39'),(1174,42,2,12499,'2.99','2005-08-18 13:05:37','2006-02-15 22:12:39'),(1175,42,1,14461,'7.99','2005-08-21 12:50:33','2006-02-15 22:12:39'),(1176,42,1,15442,'2.99','2005-08-23 00:42:49','2006-02-15 22:12:39'),(1177,42,1,13351,'5.98','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1178,42,1,15407,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1179,43,2,123,'4.99','2005-05-25 20:26:42','2006-02-15 22:12:39'),(1180,43,1,652,'4.99','2005-05-28 20:08:47','2006-02-15 22:12:39'),(1181,43,2,1544,'4.99','2005-06-16 01:28:22','2006-02-15 22:12:39'),(1182,43,2,3683,'1.99','2005-07-06 09:25:56','2006-02-15 22:12:39'),(1183,43,1,4498,'2.99','2005-07-08 02:07:50','2006-02-15 22:12:39'),(1184,43,1,5162,'4.99','2005-07-09 09:00:11','2006-02-15 22:12:39'),(1185,43,1,5401,'4.99','2005-07-09 19:59:10','2006-02-15 22:12:39'),(1186,43,1,5831,'2.99','2005-07-10 16:34:02','2006-02-15 22:12:39'),(1187,43,2,5941,'4.99','2005-07-10 22:40:47','2006-02-15 22:12:39'),(1188,43,1,6474,'3.99','2005-07-12 01:36:46','2006-02-15 22:12:39'),(1189,43,2,6680,'0.99','2005-07-12 12:01:56','2006-02-15 22:12:39'),(1190,43,1,7348,'4.99','2005-07-27 14:32:32','2006-02-15 22:12:39'),(1191,43,2,7868,'4.99','2005-07-28 10:08:55','2006-02-15 22:12:39'),(1192,43,2,8376,'4.99','2005-07-29 05:25:32','2006-02-15 22:12:39'),(1193,43,1,9204,'4.99','2005-07-30 12:43:58','2006-02-15 22:12:39'),(1194,43,1,11753,'4.99','2005-08-17 09:11:52','2006-02-15 22:12:39'),(1195,43,1,14244,'2.99','2005-08-21 05:29:55','2006-02-15 22:12:39'),(1196,43,1,14649,'4.99','2005-08-21 19:19:21','2006-02-15 22:12:39'),(1197,43,2,14837,'4.99','2005-08-22 01:54:52','2006-02-15 22:12:39'),(1198,43,2,15155,'4.99','2005-08-22 14:27:46','2006-02-15 22:12:39'),(1199,43,2,15800,'6.99','2005-08-23 14:23:44','2006-02-15 22:12:39'),(1200,43,2,15945,'2.99','2005-08-23 18:51:41','2006-02-15 22:12:39'),(1201,43,2,15644,'3.98','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1202,43,1,15745,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1203,44,1,29,'0.99','2005-05-25 03:47:12','2006-02-15 22:12:39'),(1204,44,1,99,'4.99','2005-05-25 16:50:20','2006-02-15 22:12:39'),(1205,44,1,407,'2.99','2005-05-27 13:57:38','2006-02-15 22:12:39'),(1206,44,2,721,'0.99','2005-05-29 05:28:47','2006-02-15 22:12:39'),(1207,44,1,904,'2.99','2005-05-30 10:19:42','2006-02-15 22:12:39'),(1208,44,1,1497,'3.99','2005-06-15 21:56:39','2006-02-15 22:12:39'),(1209,44,1,2369,'2.99','2005-06-18 14:25:29','2006-02-15 22:12:39'),(1210,44,1,2809,'3.99','2005-06-19 19:40:27','2006-02-15 22:12:39'),(1211,44,2,2866,'4.99','2005-06-20 00:01:36','2006-02-15 22:12:39'),(1212,44,2,4390,'0.99','2005-07-07 20:59:06','2006-02-15 22:12:39'),(1213,44,2,4723,'9.99','2005-07-08 12:44:59','2006-02-15 22:12:39'),(1214,44,1,5551,'3.99','2005-07-10 03:01:09','2006-02-15 22:12:39'),(1215,44,1,5787,'8.99','2005-07-10 14:08:49','2006-02-15 22:12:39'),(1216,44,2,5849,'6.99','2005-07-10 17:32:33','2006-02-15 22:12:39'),(1217,44,2,5909,'4.99','2005-07-10 20:46:13','2006-02-15 22:12:39'),(1218,44,1,7514,'0.99','2005-07-27 20:51:49','2006-02-15 22:12:39'),(1219,44,2,7526,'6.99','2005-07-27 21:13:47','2006-02-15 22:12:39'),(1220,44,2,8775,'4.99','2005-07-29 20:05:38','2006-02-15 22:12:39'),(1221,44,1,8866,'4.99','2005-07-29 23:58:19','2006-02-15 22:12:39'),(1222,44,1,11364,'2.99','2005-08-02 17:53:36','2006-02-15 22:12:39'),(1223,44,2,12345,'3.99','2005-08-18 07:16:58','2006-02-15 22:12:39'),(1224,44,1,12504,'4.99','2005-08-18 13:17:07','2006-02-15 22:12:39'),(1225,44,1,12790,'6.99','2005-08-19 00:16:54','2006-02-15 22:12:39'),(1226,44,2,12982,'4.99','2005-08-19 07:06:34','2006-02-15 22:12:39'),(1227,44,2,15054,'2.99','2005-08-22 10:14:33','2006-02-15 22:12:39'),(1228,44,2,13428,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:39'),(1229,45,2,277,'2.99','2005-05-26 17:32:11','2006-02-15 22:12:39'),(1230,45,1,1806,'4.99','2005-06-16 20:41:57','2006-02-15 22:12:39'),(1231,45,2,1979,'2.99','2005-06-17 09:45:30','2006-02-15 22:12:39'),(1232,45,2,2722,'4.99','2005-06-19 14:55:17','2006-02-15 22:12:39'),(1233,45,1,3391,'3.99','2005-06-21 15:11:02','2006-02-15 22:12:39'),(1234,45,2,3444,'0.99','2005-06-21 20:39:39','2006-02-15 22:12:39'),(1235,45,1,4843,'0.99','2005-07-08 18:27:28','2006-02-15 22:12:39'),(1236,45,1,5181,'6.99','2005-07-09 10:07:27','2006-02-15 22:12:39'),(1237,45,1,5405,'7.99','2005-07-09 20:11:49','2006-02-15 22:12:39'),(1238,45,1,5637,'0.99','2005-07-10 06:31:37','2006-02-15 22:12:39'),(1239,45,2,6001,'0.99','2005-07-11 01:24:44','2006-02-15 22:12:39'),(1240,45,2,6002,'2.99','2005-07-11 01:27:49','2006-02-15 22:12:39'),(1241,45,1,6966,'9.99','2005-07-27 00:15:35','2006-02-15 22:12:39'),(1242,45,1,7436,'2.99','2005-07-27 17:39:12','2006-02-15 22:12:39'),(1243,45,1,7961,'3.99','2005-07-28 13:47:21','2006-02-15 22:12:39'),(1244,45,1,10507,'2.99','2005-08-01 11:22:20','2006-02-15 22:12:39'),(1245,45,2,10878,'6.99','2005-08-02 00:33:12','2006-02-15 22:12:39'),(1246,45,1,11004,'8.99','2005-08-02 05:04:18','2006-02-15 22:12:39'),(1247,45,1,11029,'4.99','2005-08-02 05:51:10','2006-02-15 22:12:40'),(1248,45,2,11483,'2.99','2005-08-02 22:28:22','2006-02-15 22:12:40'),(1249,45,2,11488,'3.99','2005-08-02 22:35:15','2006-02-15 22:12:40'),(1250,45,1,11725,'2.99','2005-08-17 08:09:00','2006-02-15 22:12:40'),(1251,45,1,13340,'3.99','2005-08-19 20:18:39','2006-02-15 22:12:40'),(1252,45,2,13394,'4.99','2005-08-19 22:05:19','2006-02-15 22:12:40'),(1253,45,1,14576,'6.99','2005-08-21 16:52:03','2006-02-15 22:12:40'),(1254,45,1,15812,'10.99','2005-08-23 14:47:26','2006-02-15 22:12:40'),(1255,45,2,16037,'7.99','2005-08-23 22:13:04','2006-02-15 22:12:40'),(1256,46,2,401,'2.99','2005-05-27 12:57:55','2006-02-15 22:12:40'),(1257,46,2,432,'4.99','2005-05-27 16:40:29','2006-02-15 22:12:40'),(1258,46,1,938,'2.99','2005-05-30 14:47:31','2006-02-15 22:12:40'),(1259,46,1,1166,'4.99','2005-06-14 23:17:03','2006-02-15 22:12:40'),(1260,46,2,1214,'4.99','2005-06-15 03:18:40','2006-02-15 22:12:40'),(1261,46,2,2144,'0.99','2005-06-17 22:05:40','2006-02-15 22:12:40'),(1262,46,1,2203,'2.99','2005-06-18 02:10:42','2006-02-15 22:12:40'),(1263,46,2,2965,'8.99','2005-06-20 07:33:38','2006-02-15 22:12:40'),(1264,46,2,2975,'4.99','2005-06-20 08:06:18','2006-02-15 22:12:40'),(1265,46,2,3439,'4.99','2005-06-21 19:36:15','2006-02-15 22:12:40'),(1266,46,2,3855,'2.99','2005-07-06 17:03:48','2006-02-15 22:12:40'),(1267,46,1,3916,'4.99','2005-07-06 20:18:50','2006-02-15 22:12:40'),(1268,46,2,5698,'4.99','2005-07-10 09:47:00','2006-02-15 22:12:40'),(1269,46,1,7336,'0.99','2005-07-27 14:11:45','2006-02-15 22:12:40'),(1270,46,2,8152,'3.99','2005-07-28 20:53:05','2006-02-15 22:12:40'),(1271,46,2,9045,'8.99','2005-07-30 06:36:57','2006-02-15 22:12:40'),(1272,46,2,9806,'2.99','2005-07-31 11:13:49','2006-02-15 22:12:40'),(1273,46,1,10088,'2.99','2005-07-31 20:16:21','2006-02-15 22:12:40'),(1274,46,2,10428,'4.99','2005-08-01 08:30:11','2006-02-15 22:12:40'),(1275,46,1,10803,'4.99','2005-08-01 22:22:07','2006-02-15 22:12:40'),(1276,46,1,10827,'5.99','2005-08-01 23:13:00','2006-02-15 22:12:40'),(1277,46,1,11721,'0.99','2005-08-17 07:49:17','2006-02-15 22:12:40'),(1278,46,2,12095,'4.99','2005-08-17 22:32:37','2006-02-15 22:12:40'),(1279,46,2,12238,'2.99','2005-08-18 03:25:08','2006-02-15 22:12:40'),(1280,46,2,12280,'4.99','2005-08-18 04:49:27','2006-02-15 22:12:40'),(1281,46,1,12298,'2.99','2005-08-18 05:30:31','2006-02-15 22:12:40'),(1282,46,2,12455,'4.99','2005-08-18 11:19:47','2006-02-15 22:12:40'),(1283,46,1,13226,'0.99','2005-08-19 16:05:36','2006-02-15 22:12:40'),(1284,46,2,14144,'4.99','2005-08-21 02:10:57','2006-02-15 22:12:40'),(1285,46,2,14528,'6.99','2005-08-21 15:08:05','2006-02-15 22:12:40'),(1286,46,1,14940,'4.99','2005-08-22 05:54:03','2006-02-15 22:12:40'),(1287,46,1,15438,'2.99','2005-08-23 00:31:57','2006-02-15 22:12:40'),(1288,46,1,15708,'0.99','2005-08-23 10:35:51','2006-02-15 22:12:40'),(1289,46,1,15758,'5.99','2005-08-23 12:47:26','2006-02-15 22:12:40'),(1290,47,2,175,'3.99','2005-05-26 03:46:26','2006-02-15 22:12:40'),(1291,47,2,207,'4.99','2005-05-26 08:04:38','2006-02-15 22:12:40'),(1292,47,1,300,'6.99','2005-05-26 20:57:00','2006-02-15 22:12:40'),(1293,47,1,1882,'4.99','2005-06-17 03:17:21','2006-02-15 22:12:40'),(1294,47,1,2307,'6.99','2005-06-18 08:34:59','2006-02-15 22:12:40'),(1295,47,2,3320,'5.99','2005-06-21 08:29:41','2006-02-15 22:12:40'),(1296,47,1,3631,'4.99','2005-07-06 06:36:53','2006-02-15 22:12:40'),(1297,47,2,4064,'5.99','2005-07-07 04:29:20','2006-02-15 22:12:40'),(1298,47,1,5174,'0.99','2005-07-09 09:31:59','2006-02-15 22:12:40'),(1299,47,2,6153,'9.99','2005-07-11 09:31:04','2006-02-15 22:12:40'),(1300,47,2,6164,'0.99','2005-07-11 10:16:23','2006-02-15 22:12:40'),(1301,47,1,6337,'3.99','2005-07-11 19:30:47','2006-02-15 22:12:40'),(1302,47,2,8159,'4.99','2005-07-28 21:09:28','2006-02-15 22:12:40'),(1303,47,2,8402,'6.99','2005-07-29 06:25:45','2006-02-15 22:12:40'),(1304,47,1,8863,'3.99','2005-07-29 23:52:01','2006-02-15 22:12:40'),(1305,47,2,9274,'4.99','2005-07-30 15:07:04','2006-02-15 22:12:40'),(1306,47,1,11126,'0.99','2005-08-02 08:59:04','2006-02-15 22:12:40'),(1307,47,2,11477,'5.99','2005-08-02 22:09:01','2006-02-15 22:12:40'),(1308,47,1,12215,'7.99','2005-08-18 02:35:39','2006-02-15 22:12:40'),(1309,47,2,12274,'7.99','2005-08-18 04:41:47','2006-02-15 22:12:40'),(1310,47,1,14397,'0.99','2005-08-21 10:25:56','2006-02-15 22:12:40'),(1311,47,2,15846,'2.99','2005-08-23 15:39:18','2006-02-15 22:12:40'),(1312,48,2,72,'0.99','2005-05-25 10:52:13','2006-02-15 22:12:40'),(1313,48,1,297,'2.99','2005-05-26 20:48:48','2006-02-15 22:12:40'),(1314,48,1,390,'4.99','2005-05-27 11:02:26','2006-02-15 22:12:40'),(1315,48,2,1689,'9.99','2005-06-16 12:18:41','2006-02-15 22:12:40'),(1316,48,2,2822,'0.99','2005-06-19 20:29:24','2006-02-15 22:12:40'),(1317,48,2,3758,'4.99','2005-07-06 12:43:11','2006-02-15 22:12:40'),(1318,48,1,4367,'2.99','2005-07-07 19:52:01','2006-02-15 22:12:40'),(1319,48,2,5148,'6.99','2005-07-09 08:22:46','2006-02-15 22:12:40'),(1320,48,2,6498,'3.99','2005-07-12 03:05:38','2006-02-15 22:12:40'),(1321,48,1,7920,'2.99','2005-07-28 12:01:19','2006-02-15 22:12:40'),(1322,48,1,8716,'6.99','2005-07-29 17:39:09','2006-02-15 22:12:40'),(1323,48,1,9402,'7.99','2005-07-30 20:18:27','2006-02-15 22:12:40'),(1324,48,2,9742,'7.99','2005-07-31 09:10:20','2006-02-15 22:12:40'),(1325,48,2,10276,'2.99','2005-08-01 03:22:23','2006-02-15 22:12:40'),(1326,48,2,14450,'1.99','2005-08-21 12:21:25','2006-02-15 22:12:40'),(1327,48,2,14536,'2.99','2005-08-21 15:22:50','2006-02-15 22:12:40'),(1328,48,1,15228,'3.99','2005-08-22 17:27:23','2006-02-15 22:12:40'),(1329,49,2,96,'1.99','2005-05-25 16:32:19','2006-02-15 22:12:40'),(1330,49,1,239,'3.99','2005-05-26 12:30:26','2006-02-15 22:12:40'),(1331,49,2,846,'2.99','2005-05-30 01:17:45','2006-02-15 22:12:40'),(1332,49,2,1010,'4.99','2005-05-31 01:57:32','2006-02-15 22:12:40'),(1333,49,1,1164,'0.99','2005-06-14 23:16:26','2006-02-15 22:12:40'),(1334,49,2,1237,'9.99','2005-06-15 04:44:10','2006-02-15 22:12:40'),(1335,49,2,1688,'0.99','2005-06-16 12:11:20','2006-02-15 22:12:40'),(1336,49,2,1777,'6.99','2005-06-16 18:52:12','2006-02-15 22:12:40'),(1337,49,2,3235,'4.99','2005-06-21 02:46:17','2006-02-15 22:12:40'),(1338,49,2,3575,'4.99','2005-07-06 03:36:19','2006-02-15 22:12:40'),(1339,49,2,3615,'0.99','2005-07-06 05:47:47','2006-02-15 22:12:40'),(1340,49,1,5491,'2.99','2005-07-10 00:09:45','2006-02-15 22:12:41'),(1341,49,1,6214,'4.99','2005-07-11 12:49:48','2006-02-15 22:12:41'),(1342,49,1,6279,'6.99','2005-07-11 16:26:07','2006-02-15 22:12:41'),(1343,49,1,6521,'7.99','2005-07-12 04:06:11','2006-02-15 22:12:41'),(1344,49,2,6759,'4.99','2005-07-12 15:14:48','2006-02-15 22:12:41'),(1345,49,2,7209,'4.99','2005-07-27 09:16:53','2006-02-15 22:12:41'),(1346,49,2,7742,'8.99','2005-07-28 05:33:16','2006-02-15 22:12:41'),(1347,49,2,8553,'10.99','2005-07-29 11:15:36','2006-02-15 22:12:41'),(1348,49,2,9006,'0.99','2005-07-30 05:06:32','2006-02-15 22:12:41'),(1349,49,1,9851,'4.99','2005-07-31 12:50:24','2006-02-15 22:12:41'),(1350,49,1,10144,'4.99','2005-07-31 22:13:52','2006-02-15 22:12:41'),(1351,49,1,10266,'0.99','2005-08-01 03:05:59','2006-02-15 22:12:41'),(1352,49,1,10588,'2.99','2005-08-01 14:10:21','2006-02-15 22:12:41'),(1353,49,1,10814,'2.99','2005-08-01 22:43:12','2006-02-15 22:12:41'),(1354,49,2,14168,'5.99','2005-08-21 03:00:03','2006-02-15 22:12:41'),(1355,49,1,14627,'6.99','2005-08-21 18:35:54','2006-02-15 22:12:41'),(1356,49,1,14676,'2.99','2005-08-21 20:02:18','2006-02-15 22:12:41'),(1357,50,1,763,'4.99','2005-05-29 11:32:15','2006-02-15 22:12:41'),(1358,50,1,794,'4.99','2005-05-29 16:44:11','2006-02-15 22:12:41'),(1359,50,1,905,'4.99','2005-05-30 10:25:00','2006-02-15 22:12:41'),(1360,50,1,1029,'4.99','2005-05-31 03:52:02','2006-02-15 22:12:41'),(1361,50,2,1136,'4.99','2005-05-31 19:19:36','2006-02-15 22:12:41'),(1362,50,1,1223,'2.99','2005-06-15 03:38:53','2006-02-15 22:12:41'),(1363,50,1,1785,'4.99','2005-06-16 19:27:12','2006-02-15 22:12:41'),(1364,50,2,3000,'0.99','2005-06-20 09:32:33','2006-02-15 22:12:41'),(1365,50,2,3169,'2.99','2005-06-20 21:55:54','2006-02-15 22:12:41'),(1366,50,2,4149,'2.99','2005-07-07 08:40:17','2006-02-15 22:12:41'),(1367,50,2,5290,'4.99','2005-07-09 15:14:47','2006-02-15 22:12:41'),(1368,50,2,5641,'4.99','2005-07-10 06:43:43','2006-02-15 22:12:41'),(1369,50,2,5681,'9.99','2005-07-10 08:48:39','2006-02-15 22:12:41'),(1370,50,1,5928,'6.99','2005-07-10 21:58:30','2006-02-15 22:12:41'),(1371,50,2,6634,'0.99','2005-07-12 09:37:18','2006-02-15 22:12:41'),(1372,50,1,6667,'8.99','2005-07-12 11:36:22','2006-02-15 22:12:41'),(1373,50,1,7383,'4.99','2005-07-27 15:46:53','2006-02-15 22:12:41'),(1374,50,1,8089,'0.99','2005-07-28 18:26:47','2006-02-15 22:12:41'),(1375,50,1,8261,'0.99','2005-07-29 01:11:05','2006-02-15 22:12:41'),(1376,50,1,8619,'5.99','2005-07-29 13:50:08','2006-02-15 22:12:41'),(1377,50,2,9179,'0.99','2005-07-30 12:02:41','2006-02-15 22:12:41'),(1378,50,1,9615,'4.99','2005-07-31 03:59:56','2006-02-15 22:12:41'),(1379,50,2,9691,'10.99','2005-07-31 07:09:55','2006-02-15 22:12:41'),(1380,50,2,10046,'2.99','2005-07-31 19:07:11','2006-02-15 22:12:41'),(1381,50,2,10165,'0.99','2005-07-31 23:21:23','2006-02-15 22:12:41'),(1382,50,2,10180,'6.99','2005-07-31 23:57:43','2006-02-15 22:12:41'),(1383,50,2,10261,'4.99','2005-08-01 02:58:27','2006-02-15 22:12:41'),(1384,50,2,10485,'7.99','2005-08-01 10:20:34','2006-02-15 22:12:41'),(1385,50,2,11053,'3.99','2005-08-02 06:27:13','2006-02-15 22:12:41'),(1386,50,1,12766,'6.99','2005-08-18 23:25:20','2006-02-15 22:12:41'),(1387,50,2,13136,'7.99','2005-08-19 12:24:23','2006-02-15 22:12:41'),(1388,50,1,14054,'4.99','2005-08-20 22:17:01','2006-02-15 22:12:41'),(1389,50,2,15138,'2.99','2005-08-22 13:36:30','2006-02-15 22:12:41'),(1390,50,2,15388,'6.99','2005-08-22 22:49:23','2006-02-15 22:12:41'),(1391,50,1,16015,'4.99','2005-08-23 21:25:03','2006-02-15 22:12:41'),(1392,51,2,119,'4.99','2005-05-25 19:37:02','2006-02-15 22:12:41'),(1393,51,1,661,'4.99','2005-05-28 21:01:25','2006-02-15 22:12:41'),(1394,51,2,1028,'4.99','2005-05-31 03:48:05','2006-02-15 22:12:41'),(1395,51,2,1373,'1.99','2005-06-15 14:48:04','2006-02-15 22:12:41'),(1396,51,1,1477,'0.99','2005-06-15 21:11:18','2006-02-15 22:12:41'),(1397,51,1,3525,'9.99','2005-07-06 01:02:39','2006-02-15 22:12:41'),(1398,51,1,5230,'2.99','2005-07-09 12:30:23','2006-02-15 22:12:41'),(1399,51,2,5304,'5.99','2005-07-09 15:48:06','2006-02-15 22:12:41'),(1400,51,1,5473,'7.99','2005-07-09 23:19:11','2006-02-15 22:12:41'),(1401,51,1,5606,'4.99','2005-07-10 05:07:55','2006-02-15 22:12:41'),(1402,51,1,7207,'5.99','2005-07-27 09:13:26','2006-02-15 22:12:41'),(1403,51,1,7398,'6.99','2005-07-27 16:07:22','2006-02-15 22:12:41'),(1404,51,1,7636,'5.99','2005-07-28 01:08:36','2006-02-15 22:12:41'),(1405,51,1,8495,'4.99','2005-07-29 09:05:06','2006-02-15 22:12:41'),(1406,51,1,8693,'0.99','2005-07-29 16:44:13','2006-02-15 22:12:41'),(1407,51,1,8880,'0.99','2005-07-30 00:16:55','2006-02-15 22:12:41'),(1408,51,2,9649,'0.99','2005-07-31 05:46:54','2006-02-15 22:12:41'),(1409,51,2,10244,'4.99','2005-08-01 02:20:01','2006-02-15 22:12:41'),(1410,51,1,10780,'2.99','2005-08-01 21:14:24','2006-02-15 22:12:41'),(1411,51,1,10894,'0.99','2005-08-02 01:12:35','2006-02-15 22:12:41'),(1412,51,1,11302,'2.99','2005-08-02 15:38:03','2006-02-15 22:12:41'),(1413,51,2,11685,'4.99','2005-08-17 06:39:16','2006-02-15 22:12:41'),(1414,51,2,11751,'6.99','2005-08-17 09:07:56','2006-02-15 22:12:41'),(1415,51,1,12184,'0.99','2005-08-18 01:36:00','2006-02-15 22:12:41'),(1416,51,1,12725,'4.99','2005-08-18 21:43:09','2006-02-15 22:12:41'),(1417,51,2,13098,'2.99','2005-08-19 10:51:59','2006-02-15 22:12:41'),(1418,51,1,13302,'2.99','2005-08-19 18:54:26','2006-02-15 22:12:41'),(1419,51,1,13868,'0.99','2005-08-20 15:06:26','2006-02-15 22:12:41'),(1420,51,2,13882,'2.99','2005-08-20 15:23:26','2006-02-15 22:12:41'),(1421,51,2,14221,'6.99','2005-08-21 04:49:41','2006-02-15 22:12:41'),(1422,51,2,14512,'4.99','2005-08-21 14:47:09','2006-02-15 22:12:41'),(1423,51,1,14617,'4.99','2005-08-21 18:07:40','2006-02-15 22:12:41'),(1424,51,1,14903,'4.99','2005-08-22 04:31:50','2006-02-15 22:12:41'),(1425,52,1,874,'0.99','2005-05-30 05:36:21','2006-02-15 22:12:41'),(1426,52,1,1196,'4.99','2005-06-15 01:38:31','2006-02-15 22:12:41'),(1427,52,2,2232,'0.99','2005-06-18 03:54:31','2006-02-15 22:12:41'),(1428,52,1,2862,'2.99','2005-06-19 23:47:24','2006-02-15 22:12:41'),(1429,52,2,3196,'4.99','2005-06-21 00:02:28','2006-02-15 22:12:42'),(1430,52,1,3997,'1.99','2005-07-06 23:46:52','2006-02-15 22:12:42'),(1431,52,1,5308,'0.99','2005-07-09 15:58:38','2006-02-15 22:12:42'),(1432,52,2,5313,'3.99','2005-07-09 16:04:45','2006-02-15 22:12:42'),(1433,52,1,5607,'2.99','2005-07-10 05:08:10','2006-02-15 22:12:42'),(1434,52,1,6394,'7.99','2005-07-11 22:29:15','2006-02-15 22:12:42'),(1435,52,2,7284,'0.99','2005-07-27 12:12:04','2006-02-15 22:12:42'),(1436,52,2,7438,'5.99','2005-07-27 17:40:40','2006-02-15 22:12:42'),(1437,52,2,7627,'4.99','2005-07-28 00:56:47','2006-02-15 22:12:42'),(1438,52,1,8686,'4.99','2005-07-29 16:17:49','2006-02-15 22:12:42'),(1439,52,1,9029,'4.99','2005-07-30 06:03:11','2006-02-15 22:12:42'),(1440,52,2,9749,'3.99','2005-07-31 09:18:33','2006-02-15 22:12:42'),(1441,52,2,9797,'4.99','2005-07-31 10:53:44','2006-02-15 22:12:42'),(1442,52,2,10591,'0.99','2005-08-01 14:12:29','2006-02-15 22:12:42'),(1443,52,1,10635,'0.99','2005-08-01 15:37:58','2006-02-15 22:12:42'),(1444,52,1,11068,'0.99','2005-08-02 07:08:07','2006-02-15 22:12:42'),(1445,52,1,11731,'3.99','2005-08-17 08:24:35','2006-02-15 22:12:42'),(1446,52,2,12200,'2.99','2005-08-18 02:12:33','2006-02-15 22:12:42'),(1447,52,2,12520,'0.99','2005-08-18 13:42:45','2006-02-15 22:12:42'),(1448,52,2,13090,'5.99','2005-08-19 10:39:54','2006-02-15 22:12:42'),(1449,52,2,14820,'2.99','2005-08-22 01:18:37','2006-02-15 22:12:42'),(1450,52,1,14822,'5.99','2005-08-22 01:21:14','2006-02-15 22:12:42'),(1451,52,2,14961,'6.99','2005-08-22 06:35:50','2006-02-15 22:12:42'),(1452,52,2,15891,'5.99','2005-08-23 17:00:12','2006-02-15 22:12:42'),(1453,52,1,12001,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1454,53,1,88,'3.99','2005-05-25 14:13:54','2006-02-15 22:12:42'),(1455,53,1,378,'2.99','2005-05-27 09:23:22','2006-02-15 22:12:42'),(1456,53,1,751,'0.99','2005-05-29 09:55:43','2006-02-15 22:12:42'),(1457,53,2,783,'5.99','2005-05-29 14:41:18','2006-02-15 22:12:42'),(1458,53,2,856,'9.99','2005-05-30 02:01:21','2006-02-15 22:12:42'),(1459,53,1,1107,'2.99','2005-05-31 15:04:05','2006-02-15 22:12:42'),(1460,53,1,1964,'0.99','2005-06-17 09:10:09','2006-02-15 22:12:42'),(1461,53,1,2388,'2.99','2005-06-18 15:26:30','2006-02-15 22:12:42'),(1462,53,1,2903,'2.99','2005-06-20 02:49:01','2006-02-15 22:12:42'),(1463,53,2,3140,'2.99','2005-06-20 19:47:12','2006-02-15 22:12:42'),(1464,53,2,3244,'0.99','2005-06-21 03:01:10','2006-02-15 22:12:42'),(1465,53,2,3591,'2.99','2005-07-06 04:37:10','2006-02-15 22:12:42'),(1466,53,2,3898,'4.99','2005-07-06 19:12:37','2006-02-15 22:12:42'),(1467,53,2,5185,'2.99','2005-07-09 10:14:39','2006-02-15 22:12:42'),(1468,53,2,7466,'2.99','2005-07-27 18:51:17','2006-02-15 22:12:42'),(1469,53,1,7699,'4.99','2005-07-28 03:52:21','2006-02-15 22:12:42'),(1470,53,1,9343,'4.99','2005-07-30 18:13:13','2006-02-15 22:12:42'),(1471,53,1,9928,'7.99','2005-07-31 15:13:57','2006-02-15 22:12:42'),(1472,53,1,10594,'3.99','2005-08-01 14:14:59','2006-02-15 22:12:42'),(1473,53,1,12054,'5.99','2005-08-17 20:59:56','2006-02-15 22:12:42'),(1474,53,1,12580,'2.99','2005-08-18 15:49:08','2006-02-15 22:12:42'),(1475,53,1,13049,'5.99','2005-08-19 09:25:40','2006-02-15 22:12:42'),(1476,53,2,13789,'2.99','2005-08-20 12:16:38','2006-02-15 22:12:42'),(1477,53,1,14061,'2.99','2005-08-20 22:32:11','2006-02-15 22:12:42'),(1478,53,2,14091,'0.99','2005-08-21 00:11:17','2006-02-15 22:12:42'),(1479,53,2,14119,'5.99','2005-08-21 01:15:59','2006-02-15 22:12:42'),(1480,53,1,14671,'4.99','2005-08-21 19:59:30','2006-02-15 22:12:42'),(1481,53,2,14811,'0.99','2005-08-22 01:09:04','2006-02-15 22:12:42'),(1482,53,2,11657,'7.98','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1483,53,1,14137,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:42'),(1484,54,2,198,'4.99','2005-05-26 07:03:49','2006-02-15 22:12:42'),(1485,54,2,441,'4.99','2005-05-27 18:11:05','2006-02-15 22:12:42'),(1486,54,2,545,'3.99','2005-05-28 07:10:20','2006-02-15 22:12:42'),(1487,54,1,1556,'4.99','2005-06-16 02:19:02','2006-02-15 22:12:42'),(1488,54,1,1571,'2.99','2005-06-16 03:22:00','2006-02-15 22:12:42'),(1489,54,2,2323,'6.99','2005-06-18 09:55:02','2006-02-15 22:12:42'),(1490,54,1,2647,'4.99','2005-06-19 09:57:56','2006-02-15 22:12:42'),(1491,54,2,4657,'4.99','2005-07-08 09:51:02','2006-02-15 22:12:42'),(1492,54,2,5055,'1.99','2005-07-09 04:05:28','2006-02-15 22:12:42'),(1493,54,1,5929,'2.99','2005-07-10 21:59:29','2006-02-15 22:12:42'),(1494,54,1,5992,'2.99','2005-07-11 01:06:21','2006-02-15 22:12:42'),(1495,54,1,6338,'7.99','2005-07-11 19:39:41','2006-02-15 22:12:42'),(1496,54,2,6560,'2.99','2005-07-12 05:22:06','2006-02-15 22:12:42'),(1497,54,1,6813,'0.99','2005-07-12 18:03:50','2006-02-15 22:12:42'),(1498,54,2,8992,'4.99','2005-07-30 04:44:18','2006-02-15 22:12:42'),(1499,54,2,10489,'5.99','2005-08-01 10:27:42','2006-02-15 22:12:42'),(1500,54,2,10882,'5.99','2005-08-02 00:47:16','2006-02-15 22:12:42'),(1501,54,1,10956,'4.99','2005-08-02 03:33:14','2006-02-15 22:12:42'),(1502,54,1,11182,'4.99','2005-08-02 10:55:14','2006-02-15 22:12:42'),(1503,54,2,11887,'2.99','2005-08-17 15:03:13','2006-02-15 22:12:42'),(1504,54,1,12526,'2.99','2005-08-18 13:48:43','2006-02-15 22:12:42'),(1505,54,2,12775,'5.99','2005-08-18 23:35:56','2006-02-15 22:12:43'),(1506,54,1,12811,'4.99','2005-08-19 00:51:28','2006-02-15 22:12:43'),(1507,54,2,12872,'0.99','2005-08-19 02:57:37','2006-02-15 22:12:43'),(1508,54,2,13315,'2.99','2005-08-19 19:16:18','2006-02-15 22:12:43'),(1509,54,1,13890,'0.99','2005-08-20 15:41:00','2006-02-15 22:12:43'),(1510,54,1,14215,'4.99','2005-08-21 04:34:11','2006-02-15 22:12:43'),(1511,54,1,15226,'10.99','2005-08-22 17:20:17','2006-02-15 22:12:43'),(1512,54,1,15567,'4.99','2005-08-23 05:20:36','2006-02-15 22:12:43'),(1513,55,1,555,'4.99','2005-05-28 08:31:14','2006-02-15 22:12:43'),(1514,55,1,1027,'9.99','2005-05-31 03:46:19','2006-02-15 22:12:43'),(1515,55,1,1048,'0.99','2005-05-31 06:49:53','2006-02-15 22:12:43'),(1516,55,2,1825,'2.99','2005-06-16 21:53:05','2006-02-15 22:12:43'),(1517,55,2,2062,'2.99','2005-06-17 15:56:43','2006-02-15 22:12:43'),(1518,55,1,2904,'2.99','2005-06-20 02:54:06','2006-02-15 22:12:43'),(1519,55,1,2976,'4.99','2005-06-20 08:09:11','2006-02-15 22:12:43'),(1520,55,1,3149,'4.99','2005-06-20 20:34:55','2006-02-15 22:12:43'),(1521,55,1,4671,'4.99','2005-07-08 10:15:32','2006-02-15 22:12:43'),(1522,55,2,6314,'7.99','2005-07-11 18:32:44','2006-02-15 22:12:43'),(1523,55,2,7050,'4.99','2005-07-27 03:33:17','2006-02-15 22:12:43'),(1524,55,2,8288,'6.99','2005-07-29 02:04:22','2006-02-15 22:12:43'),(1525,55,1,9302,'2.99','2005-07-30 16:34:57','2006-02-15 22:12:43'),(1526,55,2,9596,'5.99','2005-07-31 03:28:47','2006-02-15 22:12:43'),(1527,55,2,9798,'2.99','2005-07-31 10:55:18','2006-02-15 22:12:43'),(1528,55,2,11287,'1.99','2005-08-02 14:49:51','2006-02-15 22:12:43'),(1529,55,1,12776,'4.99','2005-08-18 23:37:33','2006-02-15 22:12:43'),(1530,55,1,12808,'4.99','2005-08-19 00:40:41','2006-02-15 22:12:43'),(1531,55,2,12972,'1.99','2005-08-19 06:43:28','2006-02-15 22:12:43'),(1532,55,1,13345,'6.99','2005-08-19 20:25:24','2006-02-15 22:12:43'),(1533,55,1,14667,'2.99','2005-08-21 19:51:11','2006-02-15 22:12:43'),(1534,55,1,15296,'4.99','2005-08-22 19:37:20','2006-02-15 22:12:43'),(1535,56,1,130,'3.99','2005-05-25 21:21:56','2006-02-15 22:12:43'),(1536,56,1,341,'5.99','2005-05-27 04:01:42','2006-02-15 22:12:43'),(1537,56,1,496,'2.99','2005-05-28 00:43:41','2006-02-15 22:12:43'),(1538,56,1,569,'6.99','2005-05-28 10:12:41','2006-02-15 22:12:43'),(1539,56,2,1795,'6.99','2005-06-16 20:09:01','2006-02-15 22:12:43'),(1540,56,1,2140,'0.99','2005-06-17 21:40:29','2006-02-15 22:12:43'),(1541,56,1,2485,'4.99','2005-06-18 21:26:03','2006-02-15 22:12:43'),(1542,56,1,2989,'0.99','2005-06-20 08:59:37','2006-02-15 22:12:43'),(1543,56,1,3718,'7.99','2005-07-06 10:57:56','2006-02-15 22:12:43'),(1544,56,2,3771,'2.99','2005-07-06 13:19:34','2006-02-15 22:12:43'),(1545,56,1,4097,'3.99','2005-07-07 06:10:55','2006-02-15 22:12:43'),(1546,56,2,4702,'4.99','2005-07-08 11:41:36','2006-02-15 22:12:43'),(1547,56,1,5142,'4.99','2005-07-09 08:05:23','2006-02-15 22:12:43'),(1548,56,1,7385,'2.99','2005-07-27 15:49:46','2006-02-15 22:12:43'),(1549,56,1,7696,'7.99','2005-07-28 03:41:35','2006-02-15 22:12:43'),(1550,56,2,7942,'0.99','2005-07-28 12:49:44','2006-02-15 22:12:43'),(1551,56,1,8285,'0.99','2005-07-29 02:00:18','2006-02-15 22:12:43'),(1552,56,2,10356,'6.99','2005-08-01 05:49:17','2006-02-15 22:12:43'),(1553,56,2,10678,'0.99','2005-08-01 17:26:24','2006-02-15 22:12:43'),(1554,56,1,10946,'4.99','2005-08-02 03:20:39','2006-02-15 22:12:43'),(1555,56,1,11358,'5.99','2005-08-02 17:45:02','2006-02-15 22:12:43'),(1556,56,1,11656,'4.99','2005-08-17 05:11:09','2006-02-15 22:12:43'),(1557,56,2,12537,'1.99','2005-08-18 14:06:39','2006-02-15 22:12:43'),(1558,56,2,12713,'4.99','2005-08-18 21:07:28','2006-02-15 22:12:43'),(1559,56,2,13560,'8.99','2005-08-20 04:17:16','2006-02-15 22:12:43'),(1560,56,1,13769,'5.99','2005-08-20 11:43:52','2006-02-15 22:12:43'),(1561,56,2,14291,'3.99','2005-08-21 07:03:05','2006-02-15 22:12:43'),(1562,56,2,14534,'0.99','2005-08-21 15:16:29','2006-02-15 22:12:43'),(1563,56,2,15702,'7.99','2005-08-23 10:23:28','2006-02-15 22:12:43'),(1564,56,2,15714,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:43'),(1565,57,2,152,'9.99','2005-05-26 00:41:10','2006-02-15 22:12:43'),(1566,57,2,943,'4.99','2005-05-30 15:20:19','2006-02-15 22:12:43'),(1567,57,1,2058,'5.99','2005-06-17 15:34:41','2006-02-15 22:12:43'),(1568,57,1,2105,'0.99','2005-06-17 19:15:45','2006-02-15 22:12:43'),(1569,57,1,2360,'4.99','2005-06-18 13:11:13','2006-02-15 22:12:43'),(1570,57,2,2910,'7.99','2005-06-20 03:31:18','2006-02-15 22:12:43'),(1571,57,1,3357,'0.99','2005-06-21 11:55:42','2006-02-15 22:12:43'),(1572,57,1,3727,'4.99','2005-07-06 11:16:43','2006-02-15 22:12:43'),(1573,57,2,4226,'4.99','2005-07-07 12:37:56','2006-02-15 22:12:43'),(1574,57,1,5060,'4.99','2005-07-09 04:28:03','2006-02-15 22:12:43'),(1575,57,1,5694,'0.99','2005-07-10 09:40:38','2006-02-15 22:12:43'),(1576,57,2,5948,'2.99','2005-07-10 23:12:08','2006-02-15 22:12:43'),(1577,57,2,6482,'4.99','2005-07-12 01:50:21','2006-02-15 22:12:43'),(1578,57,1,6494,'1.99','2005-07-12 02:42:51','2006-02-15 22:12:43'),(1579,57,2,6649,'4.99','2005-07-12 10:51:09','2006-02-15 22:12:43'),(1580,57,2,8249,'5.99','2005-07-29 00:48:44','2006-02-15 22:12:43'),(1581,57,1,9086,'0.99','2005-07-30 08:18:46','2006-02-15 22:12:43'),(1582,57,2,9136,'0.99','2005-07-30 10:07:20','2006-02-15 22:12:43'),(1583,57,1,9211,'1.99','2005-07-30 12:59:45','2006-02-15 22:12:43'),(1584,57,1,9703,'0.99','2005-07-31 07:34:52','2006-02-15 22:12:43'),(1585,57,2,9812,'2.99','2005-07-31 11:28:07','2006-02-15 22:12:43'),(1586,57,2,10169,'4.99','2005-07-31 23:27:13','2006-02-15 22:12:43'),(1587,57,2,12925,'5.99','2005-08-19 04:59:01','2006-02-15 22:12:43'),(1588,57,2,13163,'0.99','2005-08-19 13:29:46','2006-02-15 22:12:43'),(1589,57,2,13743,'0.99','2005-08-20 10:51:27','2006-02-15 22:12:44'),(1590,57,2,13929,'9.99','2005-08-20 17:13:48','2006-02-15 22:12:44'),(1591,57,2,15571,'0.99','2005-08-23 05:26:30','2006-02-15 22:12:44'),(1592,57,2,15871,'9.99','2005-08-23 16:24:24','2006-02-15 22:12:44'),(1593,58,1,230,'0.99','2005-05-26 11:31:50','2006-02-15 22:12:44'),(1594,58,2,276,'7.99','2005-05-26 17:16:07','2006-02-15 22:12:44'),(1595,58,2,761,'0.99','2005-05-29 11:09:01','2006-02-15 22:12:44'),(1596,58,1,2191,'4.99','2005-06-18 01:33:09','2006-02-15 22:12:44'),(1597,58,2,2543,'0.99','2005-06-19 02:14:11','2006-02-15 22:12:44'),(1598,58,1,2906,'0.99','2005-06-20 03:04:56','2006-02-15 22:12:44'),(1599,58,1,3685,'4.99','2005-07-06 09:30:45','2006-02-15 22:12:44'),(1600,58,2,4131,'4.99','2005-07-07 07:53:18','2006-02-15 22:12:44'),(1601,58,2,5439,'1.99','2005-07-09 21:39:35','2006-02-15 22:12:44'),(1602,58,1,7063,'9.99','2005-07-27 03:52:27','2006-02-15 22:12:44'),(1603,58,2,7487,'4.99','2005-07-27 19:32:45','2006-02-15 22:12:44'),(1604,58,1,8853,'0.99','2005-07-29 23:34:21','2006-02-15 22:12:44'),(1605,58,2,9561,'2.99','2005-07-31 02:22:13','2006-02-15 22:12:44'),(1606,58,2,10037,'2.99','2005-07-31 18:48:08','2006-02-15 22:12:44'),(1607,58,1,10068,'4.99','2005-07-31 19:39:38','2006-02-15 22:12:44'),(1608,58,2,10256,'4.99','2005-08-01 02:47:11','2006-02-15 22:12:44'),(1609,58,1,10668,'0.99','2005-08-01 17:00:27','2006-02-15 22:12:44'),(1610,58,1,11416,'6.99','2005-08-02 19:44:04','2006-02-15 22:12:44'),(1611,58,2,12292,'8.99','2005-08-18 05:08:54','2006-02-15 22:12:44'),(1612,58,1,13194,'6.99','2005-08-19 14:34:12','2006-02-15 22:12:44'),(1613,58,1,13207,'3.99','2005-08-19 15:14:38','2006-02-15 22:12:44'),(1614,58,1,13930,'2.99','2005-08-20 17:15:06','2006-02-15 22:12:44'),(1615,58,2,13973,'4.99','2005-08-20 18:52:43','2006-02-15 22:12:44'),(1616,58,2,14305,'5.99','2005-08-21 07:29:05','2006-02-15 22:12:44'),(1617,58,1,14665,'6.99','2005-08-21 19:49:46','2006-02-15 22:12:44'),(1618,58,1,14989,'4.99','2005-08-22 07:47:07','2006-02-15 22:12:44'),(1619,58,2,15326,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:44'),(1620,59,2,212,'4.99','2005-05-26 08:34:41','2006-02-15 22:12:44'),(1621,59,2,951,'2.99','2005-05-30 16:10:35','2006-02-15 22:12:44'),(1622,59,1,1154,'5.99','2005-05-31 21:42:09','2006-02-15 22:12:44'),(1623,59,1,1269,'2.99','2005-06-15 07:29:59','2006-02-15 22:12:44'),(1624,59,1,1728,'3.99','2005-06-16 15:29:29','2006-02-15 22:12:44'),(1625,59,1,2921,'3.99','2005-06-20 04:13:04','2006-02-15 22:12:44'),(1626,59,2,4148,'2.99','2005-07-07 08:36:58','2006-02-15 22:12:44'),(1627,59,1,4384,'4.99','2005-07-07 20:46:45','2006-02-15 22:12:44'),(1628,59,1,4631,'4.99','2005-07-08 08:38:22','2006-02-15 22:12:44'),(1629,59,1,4891,'3.99','2005-07-08 20:06:19','2006-02-15 22:12:44'),(1630,59,2,5195,'8.99','2005-07-09 10:39:31','2006-02-15 22:12:44'),(1631,59,1,5207,'3.99','2005-07-09 11:15:44','2006-02-15 22:12:44'),(1632,59,1,5830,'4.99','2005-07-10 16:34:00','2006-02-15 22:12:44'),(1633,59,1,7991,'4.99','2005-07-28 14:45:45','2006-02-15 22:12:44'),(1634,59,2,8643,'4.99','2005-07-29 14:45:23','2006-02-15 22:12:44'),(1635,59,1,9469,'8.99','2005-07-30 22:56:34','2006-02-15 22:12:44'),(1636,59,2,9573,'6.99','2005-07-31 02:45:38','2006-02-15 22:12:44'),(1637,59,2,11396,'4.99','2005-08-02 18:48:29','2006-02-15 22:12:44'),(1638,59,1,12833,'5.99','2005-08-19 01:42:28','2006-02-15 22:12:44'),(1639,59,2,13282,'2.99','2005-08-19 18:08:18','2006-02-15 22:12:44'),(1640,59,1,13573,'2.99','2005-08-20 05:10:14','2006-02-15 22:12:44'),(1641,59,2,13921,'4.99','2005-08-20 16:57:11','2006-02-15 22:12:44'),(1642,59,1,14135,'5.99','2005-08-21 01:53:54','2006-02-15 22:12:44'),(1643,59,1,14977,'5.99','2005-08-22 07:12:53','2006-02-15 22:12:44'),(1644,59,2,15271,'5.99','2005-08-22 18:48:48','2006-02-15 22:12:44'),(1645,59,2,15744,'4.99','2005-08-23 12:15:51','2006-02-15 22:12:44'),(1646,59,2,15905,'2.99','2005-08-23 17:33:04','2006-02-15 22:12:44'),(1647,60,1,318,'4.99','2005-05-26 23:37:39','2006-02-15 22:12:44'),(1648,60,2,706,'1.99','2005-05-29 03:05:49','2006-02-15 22:12:44'),(1649,60,2,934,'2.99','2005-05-30 13:24:46','2006-02-15 22:12:44'),(1650,60,2,1482,'4.99','2005-06-15 21:18:16','2006-02-15 22:12:44'),(1651,60,2,2394,'4.99','2005-06-18 15:42:30','2006-02-15 22:12:44'),(1652,60,2,3473,'2.99','2005-07-05 22:57:34','2006-02-15 22:12:44'),(1653,60,1,3849,'2.99','2005-07-06 16:49:43','2006-02-15 22:12:44'),(1654,60,1,6282,'5.99','2005-07-11 16:46:22','2006-02-15 22:12:44'),(1655,60,2,7067,'0.99','2005-07-27 03:55:10','2006-02-15 22:12:44'),(1656,60,1,7331,'3.99','2005-07-27 13:57:50','2006-02-15 22:12:44'),(1657,60,1,7494,'0.99','2005-07-27 19:56:31','2006-02-15 22:12:44'),(1658,60,1,9356,'4.99','2005-07-30 18:36:24','2006-02-15 22:12:44'),(1659,60,1,9761,'4.99','2005-07-31 09:31:54','2006-02-15 22:12:44'),(1660,60,2,10680,'0.99','2005-08-01 17:28:05','2006-02-15 22:12:44'),(1661,60,1,11092,'4.99','2005-08-02 07:58:50','2006-02-15 22:12:44'),(1662,60,1,11404,'8.99','2005-08-02 19:12:40','2006-02-15 22:12:44'),(1663,60,1,12084,'1.99','2005-08-17 22:16:49','2006-02-15 22:12:44'),(1664,60,2,12614,'7.99','2005-08-18 17:16:03','2006-02-15 22:12:45'),(1665,60,1,15093,'2.99','2005-08-22 11:39:03','2006-02-15 22:12:45'),(1666,60,1,15318,'2.99','2005-08-22 20:15:16','2006-02-15 22:12:45'),(1667,60,1,15618,'5.99','2005-08-23 07:07:58','2006-02-15 22:12:45'),(1668,60,1,15632,'0.99','2005-08-23 07:30:26','2006-02-15 22:12:45'),(1669,60,1,15649,'2.99','2005-08-23 08:28:03','2006-02-15 22:12:45'),(1670,60,2,12489,'9.98','2006-02-14 15:16:03','2006-02-15 22:12:45'),(1671,60,2,14741,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:45'),(1672,61,1,1157,'0.99','2005-05-31 22:47:45','2006-02-15 22:12:45'),(1673,61,1,7027,'7.99','2005-07-27 02:50:15','2006-02-15 22:12:45'),(1674,61,2,7071,'1.99','2005-07-27 04:01:15','2006-02-15 22:12:45'),(1675,61,2,8029,'6.99','2005-07-28 16:11:21','2006-02-15 22:12:45'),(1676,61,2,8075,'4.99','2005-07-28 17:37:28','2006-02-15 22:12:45'),(1677,61,1,8651,'3.99','2005-07-29 15:02:18','2006-02-15 22:12:45'),(1678,61,2,9597,'6.99','2005-07-31 03:29:07','2006-02-15 22:12:45'),(1679,61,2,10549,'0.99','2005-08-01 12:46:39','2006-02-15 22:12:45'),(1680,61,2,11379,'2.99','2005-08-02 18:16:55','2006-02-15 22:12:45'),(1681,61,1,12072,'9.99','2005-08-17 21:50:25','2006-02-15 22:12:45'),(1682,61,1,13450,'0.99','2005-08-20 00:18:15','2006-02-15 22:12:45'),(1683,61,1,13830,'0.99','2005-08-20 13:57:59','2006-02-15 22:12:45'),(1684,61,2,15089,'6.99','2005-08-22 11:34:06','2006-02-15 22:12:45'),(1685,61,1,15681,'1.99','2005-08-23 09:35:34','2006-02-15 22:12:45'),(1686,62,2,885,'0.99','2005-05-30 06:54:28','2006-02-15 22:12:45'),(1687,62,1,947,'4.99','2005-05-30 15:36:57','2006-02-15 22:12:45'),(1688,62,2,1241,'6.99','2005-06-15 04:59:43','2006-02-15 22:12:45'),(1689,62,1,1486,'0.99','2005-06-15 21:25:30','2006-02-15 22:12:45'),(1690,62,1,1587,'0.99','2005-06-16 04:52:28','2006-02-15 22:12:45'),(1691,62,2,3021,'4.99','2005-06-20 11:13:01','2006-02-15 22:12:45'),(1692,62,1,3035,'5.99','2005-06-20 12:17:03','2006-02-15 22:12:45'),(1693,62,1,3287,'0.99','2005-06-21 06:32:39','2006-02-15 22:12:45'),(1694,62,1,3327,'3.99','2005-06-21 09:04:50','2006-02-15 22:12:45'),(1695,62,2,3843,'2.99','2005-07-06 16:35:40','2006-02-15 22:12:45'),(1696,62,2,4159,'4.99','2005-07-07 09:10:57','2006-02-15 22:12:45'),(1697,62,2,5292,'2.99','2005-07-09 15:16:54','2006-02-15 22:12:45'),(1698,62,2,8360,'4.99','2005-07-29 05:08:00','2006-02-15 22:12:45'),(1699,62,2,10080,'0.99','2005-07-31 20:07:10','2006-02-15 22:12:45'),(1700,62,1,10815,'2.99','2005-08-01 22:46:21','2006-02-15 22:12:45'),(1701,62,1,11297,'5.99','2005-08-02 15:22:47','2006-02-15 22:12:45'),(1702,62,1,11988,'0.99','2005-08-17 18:23:50','2006-02-15 22:12:45'),(1703,62,2,13512,'8.99','2005-08-20 02:27:13','2006-02-15 22:12:45'),(1704,62,2,14574,'1.99','2005-08-21 16:50:34','2006-02-15 22:12:45'),(1705,62,2,14594,'2.99','2005-08-21 17:34:24','2006-02-15 22:12:45'),(1706,62,2,14821,'4.99','2005-08-22 01:20:19','2006-02-15 22:12:45'),(1707,62,1,15464,'6.99','2005-08-23 01:15:18','2006-02-15 22:12:45'),(1708,62,1,15591,'0.99','2005-08-23 06:11:52','2006-02-15 22:12:45'),(1709,63,2,1818,'0.99','2005-06-16 21:30:34','2006-02-15 22:12:45'),(1710,63,2,3923,'8.99','2005-07-06 20:34:10','2006-02-15 22:12:45'),(1711,63,1,4587,'4.99','2005-07-08 06:16:26','2006-02-15 22:12:45'),(1712,63,1,5585,'6.99','2005-07-10 04:15:43','2006-02-15 22:12:45'),(1713,63,2,5788,'4.99','2005-07-10 14:10:22','2006-02-15 22:12:45'),(1714,63,2,5832,'4.99','2005-07-10 16:34:48','2006-02-15 22:12:45'),(1715,63,2,6769,'3.99','2005-07-12 15:48:54','2006-02-15 22:12:45'),(1716,63,2,6847,'8.99','2005-07-12 19:22:37','2006-02-15 22:12:45'),(1717,63,2,8311,'5.99','2005-07-29 03:26:07','2006-02-15 22:12:45'),(1718,63,2,9007,'0.99','2005-07-30 05:09:32','2006-02-15 22:12:45'),(1719,63,1,9546,'4.99','2005-07-31 01:47:40','2006-02-15 22:12:45'),(1720,63,2,9549,'3.99','2005-07-31 01:57:04','2006-02-15 22:12:45'),(1721,63,1,9795,'0.99','2005-07-31 10:47:19','2006-02-15 22:12:45'),(1722,63,2,9938,'2.99','2005-07-31 15:28:47','2006-02-15 22:12:45'),(1723,63,2,10148,'0.99','2005-07-31 22:19:16','2006-02-15 22:12:45'),(1724,63,1,10288,'6.99','2005-08-01 03:38:42','2006-02-15 22:12:45'),(1725,63,1,11902,'4.99','2005-08-17 15:37:34','2006-02-15 22:12:45'),(1726,63,2,12342,'2.99','2005-08-18 07:12:46','2006-02-15 22:12:45'),(1727,63,2,12515,'0.99','2005-08-18 13:39:26','2006-02-15 22:12:45'),(1728,63,1,12954,'7.99','2005-08-19 06:04:34','2006-02-15 22:12:45'),(1729,63,1,13089,'0.99','2005-08-19 10:38:56','2006-02-15 22:12:45'),(1730,63,1,13624,'8.99','2005-08-20 06:51:02','2006-02-15 22:12:45'),(1731,63,1,14931,'3.99','2005-08-22 05:38:55','2006-02-15 22:12:45'),(1732,63,1,15060,'5.99','2005-08-22 10:24:32','2006-02-15 22:12:45'),(1733,63,1,15229,'2.99','2005-08-22 17:30:25','2006-02-15 22:12:45'),(1734,64,1,494,'4.99','2005-05-28 00:39:31','2006-02-15 22:12:45'),(1735,64,1,587,'0.99','2005-05-28 12:05:33','2006-02-15 22:12:45'),(1736,64,1,1001,'2.99','2005-05-31 00:46:31','2006-02-15 22:12:45'),(1737,64,2,1335,'0.99','2005-06-15 11:51:30','2006-02-15 22:12:45'),(1738,64,1,2060,'2.99','2005-06-17 15:42:42','2006-02-15 22:12:45'),(1739,64,2,3982,'0.99','2005-07-06 23:14:16','2006-02-15 22:12:45'),(1740,64,1,4288,'4.99','2005-07-07 15:38:25','2006-02-15 22:12:45'),(1741,64,1,4690,'1.99','2005-07-08 11:04:02','2006-02-15 22:12:45'),(1742,64,2,4819,'5.99','2005-07-08 17:19:15','2006-02-15 22:12:45'),(1743,64,2,4971,'5.99','2005-07-08 23:54:49','2006-02-15 22:12:45'),(1744,64,1,5114,'3.99','2005-07-09 07:07:05','2006-02-15 22:12:46'),(1745,64,2,5279,'2.99','2005-07-09 14:46:36','2006-02-15 22:12:46'),(1746,64,1,5432,'0.99','2005-07-09 21:21:25','2006-02-15 22:12:46'),(1747,64,2,6372,'2.99','2005-07-11 21:35:06','2006-02-15 22:12:46'),(1748,64,2,6457,'0.99','2005-07-12 01:06:35','2006-02-15 22:12:46'),(1749,64,2,6698,'1.99','2005-07-12 12:45:00','2006-02-15 22:12:46'),(1750,64,2,6744,'0.99','2005-07-12 14:30:28','2006-02-15 22:12:46'),(1751,64,2,7045,'0.99','2005-07-27 03:27:35','2006-02-15 22:12:46'),(1752,64,1,7082,'2.99','2005-07-27 04:27:32','2006-02-15 22:12:46'),(1753,64,1,7476,'1.99','2005-07-27 19:08:56','2006-02-15 22:12:46'),(1754,64,2,8602,'4.99','2005-07-29 13:04:27','2006-02-15 22:12:46'),(1755,64,1,9832,'2.99','2005-07-31 12:01:49','2006-02-15 22:12:46'),(1756,64,1,9880,'6.99','2005-07-31 13:49:02','2006-02-15 22:12:46'),(1757,64,1,9924,'3.99','2005-07-31 15:04:57','2006-02-15 22:12:46'),(1758,64,2,10185,'0.99','2005-08-01 00:12:11','2006-02-15 22:12:46'),(1759,64,2,10714,'4.99','2005-08-01 18:51:29','2006-02-15 22:12:46'),(1760,64,1,10889,'4.99','2005-08-02 00:54:33','2006-02-15 22:12:46'),(1761,64,1,12409,'0.99','2005-08-18 09:43:58','2006-02-15 22:12:46'),(1762,64,1,13773,'2.99','2005-08-20 11:50:14','2006-02-15 22:12:46'),(1763,64,1,13971,'0.99','2005-08-20 18:44:53','2006-02-15 22:12:46'),(1764,64,1,14167,'5.99','2005-08-21 02:59:48','2006-02-15 22:12:46'),(1765,64,2,14316,'0.99','2005-08-21 07:59:47','2006-02-15 22:12:46'),(1766,64,2,13333,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:46'),(1767,65,1,295,'4.99','2005-05-26 20:33:20','2006-02-15 22:12:46'),(1768,65,2,657,'0.99','2005-05-28 20:23:09','2006-02-15 22:12:46'),(1769,65,1,2173,'7.99','2005-06-18 00:08:20','2006-02-15 22:12:46'),(1770,65,1,3051,'4.99','2005-06-20 13:06:52','2006-02-15 22:12:46'),(1771,65,1,3535,'4.99','2005-07-06 01:32:46','2006-02-15 22:12:46'),(1772,65,1,4240,'4.99','2005-07-07 13:33:12','2006-02-15 22:12:46'),(1773,65,2,4635,'3.99','2005-07-08 08:42:40','2006-02-15 22:12:46'),(1774,65,1,5735,'3.99','2005-07-10 11:39:15','2006-02-15 22:12:46'),(1775,65,2,6527,'0.99','2005-07-12 04:23:06','2006-02-15 22:12:46'),(1776,65,1,7877,'6.99','2005-07-28 10:25:36','2006-02-15 22:12:46'),(1777,65,2,8392,'1.99','2005-07-29 06:00:27','2006-02-15 22:12:46'),(1778,65,2,8404,'5.99','2005-07-29 06:27:01','2006-02-15 22:12:46'),(1779,65,1,9293,'3.99','2005-07-30 16:12:28','2006-02-15 22:12:46'),(1780,65,2,11100,'5.99','2005-08-02 08:08:00','2006-02-15 22:12:46'),(1781,65,1,11227,'8.99','2005-08-02 12:48:05','2006-02-15 22:12:46'),(1782,65,2,11461,'4.99','2005-08-02 21:35:00','2006-02-15 22:12:46'),(1783,65,2,11845,'2.99','2005-08-17 13:16:38','2006-02-15 22:12:46'),(1784,65,1,12114,'7.99','2005-08-17 23:02:00','2006-02-15 22:12:46'),(1785,65,1,12688,'6.99','2005-08-18 19:59:54','2006-02-15 22:12:46'),(1786,65,2,13692,'0.99','2005-08-20 09:07:52','2006-02-15 22:12:46'),(1787,65,2,14140,'6.99','2005-08-21 02:04:57','2006-02-15 22:12:46'),(1788,65,1,14356,'0.99','2005-08-21 09:08:51','2006-02-15 22:12:46'),(1789,66,2,933,'4.99','2005-05-30 13:08:45','2006-02-15 22:12:46'),(1790,66,1,1236,'2.99','2005-06-15 04:34:27','2006-02-15 22:12:46'),(1791,66,1,1907,'2.99','2005-06-17 05:08:27','2006-02-15 22:12:46'),(1792,66,1,2106,'4.99','2005-06-17 19:29:03','2006-02-15 22:12:46'),(1793,66,2,2571,'2.99','2005-06-19 04:20:14','2006-02-15 22:12:46'),(1794,66,1,2577,'4.99','2005-06-19 04:36:03','2006-02-15 22:12:46'),(1795,66,1,3334,'3.99','2005-06-21 10:04:33','2006-02-15 22:12:46'),(1796,66,2,3395,'6.99','2005-06-21 15:19:19','2006-02-15 22:12:46'),(1797,66,1,3573,'4.99','2005-07-06 03:33:48','2006-02-15 22:12:46'),(1798,66,2,3757,'2.99','2005-07-06 12:42:26','2006-02-15 22:12:46'),(1799,66,2,4088,'2.99','2005-07-07 05:31:55','2006-02-15 22:12:46'),(1800,66,1,4108,'4.99','2005-07-07 06:38:31','2006-02-15 22:12:46'),(1801,66,2,4165,'6.99','2005-07-07 09:23:27','2006-02-15 22:12:46'),(1802,66,2,4911,'5.99','2005-07-08 21:20:26','2006-02-15 22:12:46'),(1803,66,2,5915,'0.99','2005-07-10 21:12:16','2006-02-15 22:12:46'),(1804,66,1,6290,'8.99','2005-07-11 17:12:42','2006-02-15 22:12:46'),(1805,66,2,6348,'5.99','2005-07-11 20:21:18','2006-02-15 22:12:46'),(1806,66,1,6402,'3.99','2005-07-11 22:46:10','2006-02-15 22:12:46'),(1807,66,1,6995,'2.99','2005-07-27 01:12:13','2006-02-15 22:12:46'),(1808,66,1,7872,'2.99','2005-07-28 10:18:16','2006-02-15 22:12:46'),(1809,66,1,9091,'5.99','2005-07-30 08:30:45','2006-02-15 22:12:46'),(1810,66,1,10419,'0.99','2005-08-01 08:13:22','2006-02-15 22:12:46'),(1811,66,2,11028,'5.99','2005-08-02 05:48:20','2006-02-15 22:12:46'),(1812,66,2,11360,'2.99','2005-08-02 17:46:04','2006-02-15 22:12:46'),(1813,66,1,11683,'5.99','2005-08-17 06:15:17','2006-02-15 22:12:46'),(1814,66,1,11935,'0.99','2005-08-17 16:42:13','2006-02-15 22:12:46'),(1815,66,1,12699,'0.99','2005-08-18 20:20:59','2006-02-15 22:12:46'),(1816,66,1,13900,'2.99','2005-08-20 16:05:41','2006-02-15 22:12:46'),(1817,66,2,14123,'2.99','2005-08-21 01:31:25','2006-02-15 22:12:46'),(1818,66,1,14217,'6.99','2005-08-21 04:37:56','2006-02-15 22:12:46'),(1819,66,2,14351,'2.99','2005-08-21 09:04:20','2006-02-15 22:12:46'),(1820,66,2,14429,'0.99','2005-08-21 11:29:43','2006-02-15 22:12:46'),(1821,66,2,15026,'4.99','2005-08-22 09:01:52','2006-02-15 22:12:47'),(1822,66,1,15598,'8.99','2005-08-23 06:23:26','2006-02-15 22:12:47'),(1823,67,2,331,'9.99','2005-05-27 02:22:26','2006-02-15 22:12:47'),(1824,67,1,767,'2.99','2005-05-29 12:20:19','2006-02-15 22:12:47'),(1825,67,1,2064,'3.99','2005-06-17 15:57:56','2006-02-15 22:12:47'),(1826,67,1,2542,'3.99','2005-06-19 02:08:39','2006-02-15 22:12:47'),(1827,67,2,2810,'0.99','2005-06-19 19:44:12','2006-02-15 22:12:47'),(1828,67,1,3359,'4.99','2005-06-21 12:08:18','2006-02-15 22:12:47'),(1829,67,2,4090,'4.99','2005-07-07 05:47:33','2006-02-15 22:12:47'),(1830,67,2,5399,'2.99','2005-07-09 19:52:44','2006-02-15 22:12:47'),(1831,67,2,5510,'2.99','2005-07-10 00:58:37','2006-02-15 22:12:47'),(1832,67,1,6137,'2.99','2005-07-11 08:34:20','2006-02-15 22:12:47'),(1833,67,2,7277,'5.99','2005-07-27 11:48:37','2006-02-15 22:12:47'),(1834,67,2,7895,'0.99','2005-07-28 10:57:15','2006-02-15 22:12:47'),(1835,67,2,8563,'1.99','2005-07-29 11:32:58','2006-02-15 22:12:47'),(1836,67,1,9640,'7.99','2005-07-31 05:33:25','2006-02-15 22:12:47'),(1837,67,1,11295,'8.99','2005-08-02 15:10:06','2006-02-15 22:12:47'),(1838,67,1,11894,'8.99','2005-08-17 15:15:01','2006-02-15 22:12:47'),(1839,67,2,13437,'4.99','2005-08-19 23:37:52','2006-02-15 22:12:47'),(1840,67,1,13652,'2.99','2005-08-20 07:52:34','2006-02-15 22:12:47'),(1841,67,2,13791,'4.99','2005-08-20 12:21:05','2006-02-15 22:12:47'),(1842,67,2,13837,'2.99','2005-08-20 14:19:03','2006-02-15 22:12:47'),(1843,67,2,14967,'4.99','2005-08-22 06:46:03','2006-02-15 22:12:47'),(1844,67,2,15085,'2.99','2005-08-22 11:19:22','2006-02-15 22:12:47'),(1845,68,2,1828,'5.99','2005-06-16 22:04:34','2006-02-15 22:12:47'),(1846,68,2,1957,'8.99','2005-06-17 08:50:58','2006-02-15 22:12:47'),(1847,68,2,2633,'2.99','2005-06-19 08:53:10','2006-02-15 22:12:47'),(1848,68,2,2662,'4.99','2005-06-19 10:53:42','2006-02-15 22:12:47'),(1849,68,1,2686,'2.99','2005-06-19 12:44:20','2006-02-15 22:12:47'),(1850,68,1,3598,'0.99','2005-07-06 05:11:04','2006-02-15 22:12:47'),(1851,68,2,3801,'4.99','2005-07-06 15:05:50','2006-02-15 22:12:47'),(1852,68,1,3864,'0.99','2005-07-06 17:41:42','2006-02-15 22:12:47'),(1853,68,2,4555,'6.99','2005-07-08 04:48:36','2006-02-15 22:12:47'),(1854,68,1,4925,'3.99','2005-07-08 21:56:00','2006-02-15 22:12:47'),(1855,68,1,6512,'4.99','2005-07-12 03:42:49','2006-02-15 22:12:47'),(1856,68,2,9339,'3.99','2005-07-30 18:03:28','2006-02-15 22:12:47'),(1857,68,1,9538,'3.99','2005-07-31 01:25:22','2006-02-15 22:12:47'),(1858,68,2,9642,'4.99','2005-07-31 05:33:57','2006-02-15 22:12:47'),(1859,68,1,10115,'7.99','2005-07-31 21:13:47','2006-02-15 22:12:47'),(1860,68,1,11277,'2.99','2005-08-02 14:28:50','2006-02-15 22:12:47'),(1861,68,2,12742,'2.99','2005-08-18 22:22:03','2006-02-15 22:12:47'),(1862,68,2,13475,'4.99','2005-08-20 01:05:05','2006-02-15 22:12:47'),(1863,68,2,14242,'0.99','2005-08-21 05:25:59','2006-02-15 22:12:47'),(1864,68,2,14455,'5.99','2005-08-21 12:36:11','2006-02-15 22:12:47'),(1865,68,1,14947,'1.99','2005-08-22 06:07:52','2006-02-15 22:12:47'),(1866,68,1,15524,'4.99','2005-08-23 03:36:26','2006-02-15 22:12:47'),(1867,69,2,584,'4.99','2005-05-28 11:49:00','2006-02-15 22:12:47'),(1868,69,2,765,'1.99','2005-05-29 11:38:34','2006-02-15 22:12:47'),(1869,69,1,1549,'2.99','2005-06-16 01:57:15','2006-02-15 22:12:47'),(1870,69,1,3358,'4.99','2005-06-21 11:56:40','2006-02-15 22:12:47'),(1871,69,1,3883,'8.99','2005-07-06 18:39:38','2006-02-15 22:12:47'),(1872,69,1,4265,'0.99','2005-07-07 14:27:51','2006-02-15 22:12:47'),(1873,69,1,4427,'0.99','2005-07-07 22:28:51','2006-02-15 22:12:47'),(1874,69,2,5569,'3.99','2005-07-10 03:38:32','2006-02-15 22:12:47'),(1875,69,2,6297,'4.99','2005-07-11 17:37:22','2006-02-15 22:12:47'),(1876,69,1,6385,'6.99','2005-07-11 22:07:32','2006-02-15 22:12:47'),(1877,69,2,6785,'6.99','2005-07-12 16:30:57','2006-02-15 22:12:47'),(1878,69,2,8649,'6.99','2005-07-29 14:57:33','2006-02-15 22:12:47'),(1879,69,2,9193,'2.99','2005-07-30 12:28:42','2006-02-15 22:12:47'),(1880,69,1,9612,'2.99','2005-07-31 03:58:31','2006-02-15 22:12:47'),(1881,69,2,10074,'0.99','2005-07-31 19:57:16','2006-02-15 22:12:47'),(1882,69,1,11943,'3.99','2005-08-17 17:00:42','2006-02-15 22:12:47'),(1883,69,1,12012,'2.99','2005-08-17 19:20:48','2006-02-15 22:12:47'),(1884,69,1,12121,'2.99','2005-08-17 23:20:40','2006-02-15 22:12:47'),(1885,69,1,12966,'5.99','2005-08-19 06:37:48','2006-02-15 22:12:47'),(1886,69,1,13023,'5.99','2005-08-19 08:13:54','2006-02-15 22:12:47'),(1887,69,2,14311,'3.99','2005-08-21 07:45:47','2006-02-15 22:12:47'),(1888,69,2,14685,'0.99','2005-08-21 20:31:25','2006-02-15 22:12:47'),(1889,69,2,14767,'2.99','2005-08-21 23:43:00','2006-02-15 22:12:47'),(1890,69,1,15547,'2.99','2005-08-23 04:25:50','2006-02-15 22:12:47'),(1891,69,2,11995,'0.99','2006-02-14 15:16:03','2006-02-15 22:12:47'),(1892,70,2,1044,'4.99','2005-05-31 06:24:44','2006-02-15 22:12:47'),(1893,70,1,2472,'4.99','2005-06-18 20:32:40','2006-02-15 22:12:47'),(1894,70,1,4061,'0.99','2005-07-07 04:13:35','2006-02-15 22:12:47'),(1895,70,1,5927,'5.99','2005-07-10 21:57:14','2006-02-15 22:12:47'),(1896,70,2,7036,'4.99','2005-07-27 03:06:12','2006-02-15 22:12:47'),(1897,70,2,7421,'7.99','2005-07-27 17:10:05','2006-02-15 22:12:47'),(1898,70,1,7714,'2.99','2005-07-28 04:32:30','2006-02-15 22:12:47'),(1899,70,2,8550,'0.99','2005-07-29 11:12:37','2006-02-15 22:12:48'),(1900,70,1,8747,'2.99','2005-07-29 19:07:57','2006-02-15 22:12:48'),(1901,70,1,11274,'9.99','2005-08-02 14:24:08','2006-02-15 22:12:48'),(1902,70,1,11901,'2.99','2005-08-17 15:35:47','2006-02-15 22:12:48'),(1903,70,1,12003,'4.99','2005-08-17 18:56:05','2006-02-15 22:12:48'),(1904,70,2,12218,'4.99','2005-08-18 02:48:14','2006-02-15 22:12:48'),(1905,70,1,12581,'6.99','2005-08-18 15:49:15','2006-02-15 22:12:48'),(1906,70,1,12951,'3.99','2005-08-19 05:56:44','2006-02-15 22:12:48'),(1907,70,2,13680,'4.99','2005-08-20 08:44:06','2006-02-15 22:12:48'),(1908,70,2,15238,'0.99','2005-08-22 17:46:12','2006-02-15 22:12:48'),(1909,70,1,15616,'3.99','2005-08-23 07:06:38','2006-02-15 22:12:48'),(1910,71,1,199,'2.99','2005-05-26 07:11:58','2006-02-15 22:12:48'),(1911,71,1,272,'9.99','2005-05-26 16:27:11','2006-02-15 22:12:48'),(1912,71,2,1873,'2.99','2005-06-17 02:38:28','2006-02-15 22:12:48'),(1913,71,1,2374,'4.99','2005-06-18 14:44:06','2006-02-15 22:12:48'),(1914,71,2,3345,'5.99','2005-06-21 11:05:07','2006-02-15 22:12:48'),(1915,71,2,4614,'4.99','2005-07-08 07:45:17','2006-02-15 22:12:48'),(1916,71,2,5281,'1.99','2005-07-09 14:55:07','2006-02-15 22:12:48'),(1917,71,2,5358,'3.99','2005-07-09 18:09:21','2006-02-15 22:12:48'),(1918,71,1,5543,'8.99','2005-07-10 02:48:03','2006-02-15 22:12:48'),(1919,71,1,5770,'4.99','2005-07-10 13:21:28','2006-02-15 22:12:48'),(1920,71,2,5814,'4.99','2005-07-10 15:46:50','2006-02-15 22:12:48'),(1921,71,2,6020,'0.99','2005-07-11 02:08:55','2006-02-15 22:12:48'),(1922,71,1,6739,'5.99','2005-07-12 14:22:08','2006-02-15 22:12:48'),(1923,71,2,7160,'0.99','2005-07-27 07:26:06','2006-02-15 22:12:48'),(1924,71,1,7550,'4.99','2005-07-27 21:55:07','2006-02-15 22:12:48'),(1925,71,2,7982,'4.99','2005-07-28 14:19:59','2006-02-15 22:12:48'),(1926,71,2,8128,'2.99','2005-07-28 19:46:06','2006-02-15 22:12:48'),(1927,71,1,8293,'2.99','2005-07-29 02:30:50','2006-02-15 22:12:48'),(1928,71,1,8574,'1.99','2005-07-29 11:51:53','2006-02-15 22:12:48'),(1929,71,1,8668,'4.99','2005-07-29 15:41:31','2006-02-15 22:12:48'),(1930,71,1,8783,'3.99','2005-07-29 20:31:28','2006-02-15 22:12:48'),(1931,71,1,8789,'4.99','2005-07-29 20:47:27','2006-02-15 22:12:48'),(1932,71,1,8956,'0.99','2005-07-30 03:32:29','2006-02-15 22:12:48'),(1933,71,1,12417,'4.99','2005-08-18 09:57:00','2006-02-15 22:12:48'),(1934,71,1,14105,'7.99','2005-08-21 00:44:34','2006-02-15 22:12:48'),(1935,71,1,14228,'3.99','2005-08-21 04:57:08','2006-02-15 22:12:48'),(1936,71,2,14781,'4.99','2005-08-22 00:15:12','2006-02-15 22:12:48'),(1937,71,2,14904,'3.99','2005-08-22 04:32:01','2006-02-15 22:12:48'),(1938,71,1,15704,'4.99','2005-08-23 10:25:45','2006-02-15 22:12:48'),(1939,71,1,16000,'0.99','2005-08-23 20:44:36','2006-02-15 22:12:48'),(1940,72,2,785,'4.99','2005-05-29 15:08:41','2006-02-15 22:12:48'),(1941,72,2,845,'4.99','2005-05-30 01:17:25','2006-02-15 22:12:48'),(1942,72,2,1047,'0.99','2005-05-31 06:45:57','2006-02-15 22:12:48'),(1943,72,2,2294,'4.99','2005-06-18 07:46:34','2006-02-15 22:12:48'),(1944,72,1,3700,'0.99','2005-07-06 10:12:19','2006-02-15 22:12:48'),(1945,72,2,5223,'4.99','2005-07-09 12:06:03','2006-02-15 22:12:48'),(1946,72,1,5302,'4.99','2005-07-09 15:42:36','2006-02-15 22:12:48'),(1947,72,1,5424,'0.99','2005-07-09 20:59:09','2006-02-15 22:12:48'),(1948,72,1,5840,'4.99','2005-07-10 17:09:09','2006-02-15 22:12:48'),(1949,72,2,6081,'0.99','2005-07-11 05:11:09','2006-02-15 22:12:48'),(1950,72,2,8228,'4.99','2005-07-29 00:08:58','2006-02-15 22:12:48'),(1951,72,1,9027,'2.99','2005-07-30 05:58:27','2006-02-15 22:12:48'),(1952,72,2,9420,'5.99','2005-07-30 21:05:18','2006-02-15 22:12:48'),(1953,72,2,9648,'4.99','2005-07-31 05:46:03','2006-02-15 22:12:48'),(1954,72,2,10267,'0.99','2005-08-01 03:07:26','2006-02-15 22:12:48'),(1955,72,2,11206,'6.99','2005-08-02 11:58:03','2006-02-15 22:12:48'),(1956,72,2,11422,'5.99','2005-08-02 19:52:08','2006-02-15 22:12:48'),(1957,72,1,11630,'2.99','2005-08-17 04:27:46','2006-02-15 22:12:48'),(1958,72,1,11679,'4.99','2005-08-17 06:08:54','2006-02-15 22:12:48'),(1959,72,1,11923,'2.99','2005-08-17 16:21:47','2006-02-15 22:12:48'),(1960,72,2,12020,'2.99','2005-08-17 19:50:33','2006-02-15 22:12:48'),(1961,72,1,12448,'0.99','2005-08-18 10:59:04','2006-02-15 22:12:48'),(1962,72,2,12593,'0.99','2005-08-18 16:17:54','2006-02-15 22:12:48'),(1963,72,1,13145,'0.99','2005-08-19 12:53:53','2006-02-15 22:12:48'),(1964,72,2,13327,'4.99','2005-08-19 19:55:45','2006-02-15 22:12:48'),(1965,72,2,13597,'0.99','2005-08-20 05:59:05','2006-02-15 22:12:48'),(1966,72,2,13660,'4.99','2005-08-20 08:05:56','2006-02-15 22:12:48'),(1967,72,1,14020,'0.99','2005-08-20 20:59:43','2006-02-15 22:12:48'),(1968,72,2,15110,'0.99','2005-08-22 12:16:46','2006-02-15 22:12:48'),(1969,72,2,15146,'2.99','2005-08-22 13:57:55','2006-02-15 22:12:48'),(1970,73,1,70,'2.99','2005-05-25 10:15:23','2006-02-15 22:12:48'),(1971,73,2,1133,'4.99','2005-05-31 19:12:21','2006-02-15 22:12:48'),(1972,73,1,1669,'0.99','2005-06-16 10:20:20','2006-02-15 22:12:48'),(1973,73,2,2940,'4.99','2005-06-20 05:20:01','2006-02-15 22:12:48'),(1974,73,2,4327,'2.99','2005-07-07 18:01:39','2006-02-15 22:12:48'),(1975,73,1,4789,'4.99','2005-07-08 16:22:01','2006-02-15 22:12:49'),(1976,73,2,5021,'4.99','2005-07-09 02:09:41','2006-02-15 22:12:49'),(1977,73,1,6514,'9.99','2005-07-12 03:47:44','2006-02-15 22:12:49'),(1978,73,1,6645,'2.99','2005-07-12 10:39:55','2006-02-15 22:12:49'),(1979,73,1,7590,'4.99','2005-07-27 23:24:24','2006-02-15 22:12:49'),(1980,73,1,7683,'4.99','2005-07-28 03:11:29','2006-02-15 22:12:49'),(1981,73,1,8377,'4.99','2005-07-29 05:27:40','2006-02-15 22:12:49'),(1982,73,1,9212,'2.99','2005-07-30 13:03:13','2006-02-15 22:12:49'),(1983,73,1,9776,'2.99','2005-07-31 10:01:03','2006-02-15 22:12:49'),(1984,73,2,10434,'4.99','2005-08-01 08:47:00','2006-02-15 22:12:49'),(1985,73,1,11102,'4.99','2005-08-02 08:08:30','2006-02-15 22:12:49'),(1986,73,2,11155,'0.99','2005-08-02 09:55:28','2006-02-15 22:12:49'),(1987,73,2,11349,'4.99','2005-08-02 17:21:49','2006-02-15 22:12:49'),(1988,73,2,11609,'3.99','2005-08-17 03:41:11','2006-02-15 22:12:49'),(1989,73,2,12291,'4.99','2005-08-18 05:08:37','2006-02-15 22:12:49'),(1990,73,1,13886,'4.99','2005-08-20 15:34:43','2006-02-15 22:12:49'),(1991,73,1,15667,'0.99','2005-08-23 09:02:03','2006-02-15 22:12:49'),(1992,73,2,16002,'2.99','2005-08-23 20:47:12','2006-02-15 22:12:49'),(1993,73,2,13108,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:49'),(1994,74,2,1121,'6.99','2005-05-31 16:37:36','2006-02-15 22:12:49'),(1995,74,1,2498,'1.99','2005-06-18 22:56:26','2006-02-15 22:12:49'),(1996,74,2,2517,'0.99','2005-06-19 00:11:26','2006-02-15 22:12:49'),(1997,74,1,3020,'1.99','2005-06-20 11:12:04','2006-02-15 22:12:49'),(1998,74,2,3445,'7.99','2005-06-21 20:40:28','2006-02-15 22:12:49'),(1999,74,2,3819,'3.99','2005-07-06 15:35:06','2006-02-15 22:12:49'),(2000,74,1,5530,'2.99','2005-07-10 02:13:49','2006-02-15 22:12:49'),(2001,74,2,5603,'2.99','2005-07-10 05:04:54','2006-02-15 22:12:49'),(2002,74,2,5917,'4.99','2005-07-10 21:30:22','2006-02-15 22:12:49'),(2003,74,1,6241,'7.99','2005-07-11 14:40:48','2006-02-15 22:12:49'),(2004,74,1,6475,'2.99','2005-07-12 01:36:57','2006-02-15 22:12:49'),(2005,74,1,7304,'6.99','2005-07-27 12:56:56','2006-02-15 22:12:49'),(2006,74,2,8796,'5.99','2005-07-29 21:09:11','2006-02-15 22:12:49'),(2007,74,2,9112,'4.99','2005-07-30 09:06:31','2006-02-15 22:12:49'),(2008,74,2,10051,'3.99','2005-07-31 19:14:20','2006-02-15 22:12:49'),(2009,74,1,10624,'0.99','2005-08-01 15:27:05','2006-02-15 22:12:49'),(2010,74,2,12374,'3.99','2005-08-18 08:07:45','2006-02-15 22:12:49'),(2011,74,2,12477,'3.99','2005-08-18 12:25:01','2006-02-15 22:12:49'),(2012,74,2,13335,'0.99','2005-08-19 20:03:18','2006-02-15 22:12:49'),(2013,74,2,13520,'0.99','2005-08-20 02:41:46','2006-02-15 22:12:49'),(2014,74,1,13583,'1.99','2005-08-20 05:29:45','2006-02-15 22:12:49'),(2015,74,2,13747,'5.99','2005-08-20 10:56:06','2006-02-15 22:12:49'),(2016,74,1,15286,'4.99','2005-08-22 19:17:56','2006-02-15 22:12:49'),(2017,74,2,15325,'4.99','2005-08-22 20:27:38','2006-02-15 22:12:49'),(2018,74,2,15500,'0.99','2005-08-23 02:39:37','2006-02-15 22:12:49'),(2019,74,2,15739,'4.99','2005-08-23 11:56:22','2006-02-15 22:12:49'),(2020,74,1,16046,'0.99','2005-08-23 22:26:47','2006-02-15 22:12:49'),(2021,75,1,180,'4.99','2005-05-26 04:46:23','2006-02-15 22:12:49'),(2022,75,2,268,'0.99','2005-05-26 16:19:08','2006-02-15 22:12:49'),(2023,75,1,1920,'4.99','2005-06-17 06:00:23','2006-02-15 22:12:49'),(2024,75,1,2161,'7.99','2005-06-17 23:39:50','2006-02-15 22:12:49'),(2025,75,2,2738,'4.99','2005-06-19 15:56:30','2006-02-15 22:12:49'),(2026,75,2,3062,'6.99','2005-06-20 13:50:00','2006-02-15 22:12:49'),(2027,75,1,3210,'4.99','2005-06-21 01:00:25','2006-02-15 22:12:49'),(2028,75,1,3711,'0.99','2005-07-06 10:46:15','2006-02-15 22:12:49'),(2029,75,2,4179,'2.99','2005-07-07 10:17:15','2006-02-15 22:12:49'),(2030,75,2,4511,'0.99','2005-07-08 02:36:21','2006-02-15 22:12:49'),(2031,75,1,4639,'5.99','2005-07-08 08:57:21','2006-02-15 22:12:49'),(2032,75,2,5260,'2.99','2005-07-09 14:05:45','2006-02-15 22:12:49'),(2033,75,2,6052,'0.99','2005-07-11 03:51:27','2006-02-15 22:12:49'),(2034,75,1,6092,'3.99','2005-07-11 05:51:31','2006-02-15 22:12:49'),(2035,75,1,6486,'0.99','2005-07-12 02:09:36','2006-02-15 22:12:49'),(2036,75,2,6530,'0.99','2005-07-12 04:33:19','2006-02-15 22:12:49'),(2037,75,2,6852,'2.99','2005-07-12 19:33:49','2006-02-15 22:12:49'),(2038,75,1,7052,'2.99','2005-07-27 03:36:38','2006-02-15 22:12:49'),(2039,75,1,7454,'4.99','2005-07-27 18:27:26','2006-02-15 22:12:49'),(2040,75,1,7843,'0.99','2005-07-28 09:10:22','2006-02-15 22:12:49'),(2041,75,2,7897,'2.99','2005-07-28 11:01:51','2006-02-15 22:12:49'),(2042,75,2,8202,'1.99','2005-07-28 23:11:45','2006-02-15 22:12:49'),(2043,75,1,8823,'6.99','2005-07-29 22:22:12','2006-02-15 22:12:49'),(2044,75,2,9168,'5.99','2005-07-30 11:31:17','2006-02-15 22:12:49'),(2045,75,2,9442,'4.99','2005-07-30 21:44:31','2006-02-15 22:12:49'),(2046,75,2,9501,'4.99','2005-07-30 23:59:21','2006-02-15 22:12:49'),(2047,75,1,9783,'9.99','2005-07-31 10:15:46','2006-02-15 22:12:49'),(2048,75,2,10653,'5.99','2005-08-01 16:28:07','2006-02-15 22:12:49'),(2049,75,1,10726,'3.99','2005-08-01 19:14:53','2006-02-15 22:12:50'),(2050,75,1,10871,'4.99','2005-08-02 00:27:24','2006-02-15 22:12:50'),(2051,75,1,11330,'0.99','2005-08-02 16:45:33','2006-02-15 22:12:50'),(2052,75,1,12002,'2.99','2005-08-17 18:56:02','2006-02-15 22:12:50'),(2053,75,2,12239,'0.99','2005-08-18 03:26:42','2006-02-15 22:12:50'),(2054,75,1,12336,'1.99','2005-08-18 06:59:41','2006-02-15 22:12:50'),(2055,75,1,12412,'5.99','2005-08-18 09:49:52','2006-02-15 22:12:50'),(2056,75,1,12426,'4.99','2005-08-18 10:24:11','2006-02-15 22:12:50'),(2057,75,1,12662,'0.99','2005-08-18 19:10:41','2006-02-15 22:12:50'),(2058,75,2,15928,'5.99','2005-08-23 18:23:24','2006-02-15 22:12:50'),(2059,75,2,13534,'8.97','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2060,75,1,14488,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2061,75,2,15191,'0.00','2006-02-14 15:16:03','2006-02-15 22:12:50'),(2062,76,2,574,'1.99','2005-05-28 10:44:28','2006-02-15 22:12:50'),(2063,76,1,926,'0.99','2005-05-30 12:15:54','2006-02-15 22:12:50'),(2064,76,2,1487,'0.99','2005-06-15 21:27:42','2006-02-15 22:12:50'),(2065,76,1,1791,'6.99','2005-06-16 20:04:28','2006-02-15 22:12:50'),(2066,76,2,2111,'0.99','2005-06-17 19:47:21','2006-02-15 22:12:50'),(2067,76,2,2397,'1.99','2005-06-18 15:51:25','2006-02-15 22:12:50'),(2068,76,1,2894,'0.99','2005-06-20 02:22:42','2006-02-15 22:12:50'),(2069,76,2,3416,'0.99','2005-06-21 17:05:29','2006-02-15 22:12:50'),(2070,76,2,4099,'4.99','2005-07-07 06:20:33','2006-02-15 22:12:50'),(2071,76,2,5571,'0.99','2005-07-10 03:48:20','2006-02-15 22:12:50'),(2072,76,2,6789,'0.99','2005-07-12 16:34:40','2006-02-15 22:12:50'),(2073,76,2,8253,'6.99','2005-07-29 00:57:06','2006-02-15 22:12:50'),(2074,76,2,8357,'2.99','2005-07-29 04:59:44','2006-02-15 22:12:50'),(2075,76,2,8405,'3.99','2005-07-29 06:28:19','2006-02-15 22:12:50'),(2076,76,1,8935,'0.99','2005-07-30 02:38:45','2006-02-15 22:12:50'),(2077,76,2,9312,'2.99','2005-07-30 16:59:17','2006-02-15 22:12:50'),(2078,76,2,10082,'0.99','2005-07-31 20:09:32','2006-02-15 22:12:50'),(2079,76,2,10795,'4.99','2005-08-01 21:56:37','2006-02-15 22:12:50'),(2080,76,2,11172,'7.99','2005-08-02 10:27:52','2006-02-15 22:12:50'),(2081,76,2,13697,'3.99','2005-08-20 09:21:08','2006-02-15 22:12:50'),(2082,76,1,14637,'2.99','2005-08-21 19:01:00','2006-02-15 22:12:50'),(2083,76,2,15169,'4.99','2005-08-22 15:21:56','2006-02-15 22:12:50'),(2084,76,1,15566,'10.99','2005-08-23 05:17:23','2006-02-15 22:12:50'),(2085,77,2,319,'2.99','2005-05-26 23:52:13','2006-02-15 22:12:50'),(2086,77,1,419,'1.99','2005-05-27 15:15:11','2006-02-15 22:12:50'),(2087,77,2,561,'2.99','2005-05-28 08:54:06','2006-02-15 22:12:50'),(2088,77,1,586,'0.99','2005-05-28 12:03:00','2006-02-15 22:12:50'),(2089,77,1,760,'5.99','2005-05-29 11:07:25','2006-02-15 22:12:50'),(2090,77,1,1710,'4.99','2005-06-16 14:11:24','2006-02-15 22:12:50'),(2091,77,1,2354,'3.99','2005-06-18 12:54:18','2006-02-15 22:12:50'),(2092,77,2,2452,'8.99','2005-06-18 19:29:21','2006-02-15 22:12:50'),(2093,77,1,3151,'2.99','2005-06-20 20:36:53','2006-02-15 22:12:50'),(2094,77,2,3238,'0.99','2005-06-21 02:48:21','2006-02-15 22:12:50'),(2095,77,2,4928,'0.99','2005-07-08 22:05:41','2006-02-15 22:12:50'),(2096,77,2,6168,'0.99','2005-07-11 10:21:38','2006-02-15 22:12:50'),(2097,77,2,6390,'2.99','2005-07-11 22:19:23','2006-02-15 22:12:50'),(2098,77,1,7406,'3.99','2005-07-27 16:25:45','2006-02-15 22:12:50'),(2099,77,1,7710,'0.99','2005-07-28 04:24:07','2006-02-15 22:12:50'),(2100,77,2,8942,'4.99','2005-07-30 03:01:07','2006-02-15 22:12:50'),(2101,77,1,9811,'0.99','2005-07-31 11:23:45','2006-02-15 22:12:50'),(2102,77,2,10184,'4.99','2005-08-01 00:09:33','2006-02-15 22:12:50'),(2103,77,1,10886,'2.99','2005-08-02 00:52:34','2006-02-15 22:12:50'),(2104,77,1,10895,'0.99','2005-08-02 01:16:59','2006-02-15 22:12:50'),(2105,77,2,10991,'0.99','2005-08-02 04:41:12','2006-02-15 22:12:50'),(2106,77,1,11469,'2.99','2005-08-02 21:48:09','2006-02-15 22:12:50'),(2107,77,2,11767,'7.99','2005-08-17 10:00:40','2006-02-15 22:12:50'),(2108,77,1,12065,'6.99','2005-08-17 21:31:46','2006-02-15 22:12:50'),(2109,77,2,12328,'1.99','2005-08-18 06:43:56','2006-02-15 22:12:50'),(2110,77,2,13752,'9.99','2005-08-20 11:17:45','2006-02-15 22:12:50'),(2111,77,2,14530,'4.99','2005-08-21 15:10:50','2006-02-15 22:12:50'),(2112,77,2,15359,'2.99','2005-08-22 21:34:00','2006-02-15 22:12:50'),(2113,78,1,2207,'2.99','2005-06-18 02:19:21','2006-02-15 22:12:50'),(2114,78,2,2949,'6.99','2005-06-20 06:05:53','2006-02-15 22:12:50'),(2115,78,2,3248,'7.99','2005-06-21 03:12:21','2006-02-15 22:12:50'),(2116,78,1,3593,'4.99','2005-07-06 04:39:52','2006-02-15 22:12:50'),(2117,78,2,4227,'5.99','2005-07-07 12:41:36','2006-02-15 22:12:50'),(2118,78,2,4627,'2.99','2005-07-08 08:24:39','2006-02-15 22:12:50'),(2119,78,2,4778,'0.99','2005-07-08 15:51:51','2006-02-15 22:12:50'),(2120,78,1,5078,'1.99','2005-07-09 05:20:24','2006-02-15 22:12:50'),(2121,78,2,5604,'0.99','2005-07-10 05:05:00','2006-02-15 22:12:51'),(2122,78,1,6005,'0.99','2005-07-11 01:36:42','2006-02-15 22:12:51'),(2123,78,1,6344,'4.99','2005-07-11 20:04:43','2006-02-15 22:12:51'),(2124,78,2,7200,'1.99','2005-07-27 08:57:38','2006-02-15 22:12:51'),(2125,78,2,7747,'4.99','2005-07-28 05:50:11','2006-02-15 22:12:51'),(2126,78,2,7926,'3.99','2005-07-28 12:13:02','2006-02-15 22:12:51'),(2127,78,1,7957,'6.99','2005-07-28 13:34:08','2006-02-15 22:12:51'),(2128,78,2,8920,'4.99','2005-07-30 01:59:24','2006-02-15 22:12:51'),(2129,78,1,9068,'5.99','2005-07-30 07:31:45','2006-02-15 22:12:51'),(2130,78,2,10350,'3.99','2005-08-01 05:30:05','2006-02-15 22:12:51'),(2131,78,1,10590,'2.99','2005-08-01 14:11:53','2006-02-15 22:12:51'),(2132,78,1,10831,'7.99','2005-08-01 23:22:45','2006-02-15 22:12:51'),(2133,78,1,10942,'10.99','2005-08-02 03:16:31','2006-02-15 22:12:51'),(2134,78,2,12474,'8.99','2005-08-18 12:10:03','2006-02-15 22:12:51'),(2135,78,2,12653,'4.99','2005-08-18 18:53:17','2006-02-15 22:12:51'),(2136,78,2,13124,'5.99','2005-08-19 11:55:59','2006-02-15 22:12:51'),(2137,78,1,13432,'0.99','2005-08-19 23:29:06','2006-02-15 22:12:51'),(2138,78,2,13792,'5.99','2005-08-20 12:21:37','2006-02-15 22:12:51'),(2139,78,2,14620,'2.99','2005-08-21 18:10:43','2006-02-15 22:12:51'),(2140,78,1,14716,'0.99','2005-08-21 21:29:55','2006-02-15 22:12:51'),(2141,78,1,14810,'2.99','2005-08-22 01:08:34','2006-02-15 22:12:51'),(2142,78,2,14862,'7.99','2005-08-22 02:51:41','2006-02-15 22:12:51'),(2143,78,2,16039,'2.99','2005-08-23 22:18:51','2006-02-15 22:12:51'),(2144,79,1,840,'4.99','2005-05-30 00:28:41','2006-02-15 22:12:51'),(2145,79,1,859,'2.99','2005-05-30 02:36:20','2006-02-15 22:12:51'),(2146,79,1,928,'2.99','2005-05-30 12:27:14','2006-02-15 22:12:51'),(2147,79,2,3096,'4.99','2005-06-20 16:17:56','2006-02-15 22:12:51'),(2148,79,2,3178,'2.99','2005-06-20 22:35:12','2006-02-15 22:12:51'),(2149,79,1,3641,'0.99','2005-07-06 07:17:09','2006-02-15 22:12:51'),(2150,79,1,3748,'2.99','2005-07-06 12:11:22','2006-02-15 22:12:51'),(2151,79,2,4049,'4.99','2005-07-07 03:34:53','2006-02-15 22:12:51'),(2152,79,1,4530,'4.99','2005-07-08 03:27:05','2006-02-15 22:12:51'),(2153,79,2,4736,'4.99','2005-07-08 13:22:55','2006-02-15 22:12:51'),(2154,79,2,5205,'2.99','2005-07-09 10:56:37','2006-02-15 22:12:51'),(2155,79,1,5555,'2.99','2005-07-10 03:08:55','2006-02-15 22:12:51'),(2156,79,2,6162,'5.99','2005-07-11 10:12:30','2006-02-15 22:12:51'),(2157,79,1,7220,'9.99','2005-07-27 09:35:54','2006-02-15 22:12:51'),(2158,79,1,8849,'2.99','2005-07-29 23:21:01','2006-02-15 22:12:51'),(2159,79,1,9814,'1.99','2005-07-31 11:29:46','2006-02-15 22:12:51'),(2160,79,2,9845,'6.99','2005-07-31 12:28:05','2006-02-15 22:12:51'),(2161,79,1,9989,'0.99','2005-07-31 17:22:39','2006-02-15 22:12:51'),(2162,79,1,10676,'2.99','2005-08-01 17:14:15','2006-02-15 22:12:51'),(2163,79,2,11641,'4.99','2005-08-17 04:45:39','2006-02-15 22:12:51'),(2164,79,2,13026,'2.99','2005-08-19 08:22:45','2006-02-15 22:12:51'),(2165,79,1,14179,'0.99','2005-08-21 03:14:27','2006-02-15 22:12:51'),(2166,80,1,2596,'2.99','2005-06-19 05:48:26','2006-02-15 22:12:51'),(2167,80,2,2805,'8.99','2005-06-19 19:29:17','2006-02-15 22:12:51'),(2168,80,1,3367,'3.99','2005-06-21 13:08:21','2006-02-15 22:12:51'),(2169,80,2,3623,'4.99','2005-07-06 06:05:23','2006-02-15 22:12:51'),(2170,80,2,4268,'8.99','2005-07-07 14:36:05','2006-02-15 22:12:51'),(2171,80,2,4299,'3.99','2005-07-07 16:33:48','2006-02-15 22:12:51'),(2172,80,1,4688,'5.99','2005-07-08 11:03:29','2006-02-15 22:12:51'),(2173,80,2,5420,'3.99','2005-07-09 20:48:42','2006-02-15 22:12:51'),(2174,80,2,5452,'4.99','2005-07-09 22:23:21','2006-02-15 22:12:51'),(2175,80,1,6199,'5.99','2005-07-11 12:16:03','2006-02-15 22:12:51'),(2176,80,2,6417,'6.99','2005-07-11 23:35:11','2006-02-15 22:12:51'),(2177,80,2,6707,'1.99','2005-07-12 13:07:55','2006-02-15 22:12:51'),(2178,80,2,7558,'0.99','2005-07-27 22:19:08','2006-02-15 22:12:51'),(2179,80,1,8509,'5.99','2005-07-29 09:38:19','2006-02-15 22:12:51'),(2180,80,1,8884,'6.99','2005-07-30 00:26:22','2006-02-15 22:12:51'),(2181,80,1,10313,'0.99','2005-08-01 04:29:29','2006-02-15 22:12:51'),(2182,80,1,10656,'6.99','2005-08-01 16:38:04','2006-02-15 22:12:51'),(2183,80,1,10690,'8.99','2005-08-01 18:05:54','2006-02-15 22:12:51'),(2184,80,2,11101,'5.99','2005-08-02 08:08:24','2006-02-15 22:12:51'),(2185,80,2,11839,'0.99','2005-08-17 13:08:45','2006-02-15 22:12:51'),(2186,80,1,11850,'1.99','2005-08-17 13:30:15','2006-02-15 22:12:51'),(2187,80,2,12468,'2.99','2005-08-18 11:41:47','2006-02-15 22:12:51'),(2188,80,1,13352,'4.99','2005-08-19 20:51:40','2006-02-15 22:12:51'),(2189,80,2,13395,'0.99','2005-08-19 22:05:40','2006-02-15 22:12:51'),(2190,80,1,13724,'4.99','2005-08-20 10:07:28','2006-02-15 22:12:51'),(2191,80,2,13851,'0.99','2005-08-20 14:44:22','2006-02-15 22:12:51'),(2192,80,1,14916,'0.99','2005-08-22 04:56:57','2006-02-15 22:12:52'),(2193,80,1,15648,'8.99','2005-08-23 08:27:57','2006-02-15 22:12:52'),(2194,80,1,16012,'5.99','2005-08-23 21:13:39','2006-02-15 22:12:52'),(2195,80,2,12457,'2.99','2006-02-14 15:16:03','2006-02-15 22:12:52'),(2196,81,1,289,'0.99','2005-05-26 20:01:09','2006-02-15 22:12:52'),(2197,81,1,2714,'1.99','2005-06-19 14:26:09','2006-02-15 22:12:52'),(2198,81,1,2854,'5.99','2005-06-19 23:11:48','2006-02-15 22:12:52'),(2199,81,1,3229,'4.99','2005-06-21 02:20:41','2006-02-15 22:12:52'),(2200,81,1,3879,'2.99','2005-07-06 18:31:20','2006-02-15 22:12:52'),(2201,81,2,4983,'9.99','2005-07-09 00:34:16','2006-02-15 22:12:52'),(2202,81,1,5468,'0.99','2005-07-09 23:06:09','2006-02-15 22:12:52'),(2203,81,2,7130,'4.99','2005-07-27 06:23:36','2006-02-15 22:12:52'),(2204,81,1,7709,'0.99','2005-07-28 04:22:14','2006-02-15 22:12:52'),(2205,81,2,9454,'3.99','2005-07-30 22:20:09','2006-02-15 22:12:52'),(2206,81,2,10456,'0.99','2005-08-01 09:17:21','2006-02-15 22:12:52'),(2207,81,1,11837,'5.99','2005-08-17 13:04:41','2006-02-15 22:12:52'),(2208,81,2,12181,'4.99','2005-08-18 01:28:18','2006-02-15 22:12:52'),(2209,81,2,13820,'5.99','2005-08-20 13:26:37','2006-02-15 22:12:52'),(2210,81,1,14128,'4.99','2005-08-21 01:35:58','2006-02-15 22:12:52'),(2211,81,1,14642,'3.99','2005-08-21 19:09:40','2006-02-15 22:12:52'),(2212,81,2,14748,'7.99','2005-08-21 23:02:02','2006-02-15 22:12:52'),(2213,81,1,15224,'5.99','2005-08-22 17:18:05','2006-02-15 22:12:52'),(2214,81,1,15602,'4.99','2005-08-23 06:41:07','2006-02-15 22:12:52'),(2215,81,1,15823,'4.99','2005-08-23 15:08:00','2006-02-15 22:12:52'),(2216,81,1,15858,'2.99','2005-08-23 16:07:15','2006-02-15 22:12:52'),(2217,81,2,15884,'1.99','2005-08-23 16:45:28','2006-02-15 22:12:52'),(2218,82,2,145,'2.99','2005-05-25 23:59:03','2006-02-15 22:12:52'),(2219,82,2,288,'8.99','2005-05-26 19:47:49','2006-02-15 22:12:52'),(2220,82,1,1438,'0.99','2005-06-15 18:38:51','2006-02-15 22:12:52'),(2221,82,2,1570,'0.99','2005-06-16 03:21:33','2006-02-15 22:12:52'),(2222,82,1,2506,'8.99','2005-06-18 23:29:53','2006-02-15 22:12:52'),(2223,82,1,2819,'8.99','2005-06-19 20:13:33','2006-02-15 22:12:52'),(2224,82,2,3332,'0.99','2005-06-21 09:55:12','2006-02-15 22:12:52'),(2225,82,1,3680,'2.99','2005-07-06 09:16:10','2006-02-15 22:12:52'),(2226,82,1,4598,'6.99','2005-07-08 06:46:26','2006-02-15 22:12:52'),(2227,82,2,5746,'4.99','2005-07-10 12:15:12','2006-02-15 22:12:52'),(2228,82,2,6082,'6.99','2005-07-11 05:12:41','2006-02-15 22:12:52'),(2229,82,2,6708,'6.99','2005-07-12 13:10:55','2006-02-15 22:12:52'),(2230,82,2,7733,'9.99','2005-07-28 05:04:47','2006-02-15 22:12:52'),(2231,82,2,7873,'0.99','2005-07-28 10:19:46','2006-02-15 22:12:52'),(2232,82,1,8487,'4.99','2005-07-29 08:53:49','2006-02-15 22:12:52'),(2233,82,2,9277,'3.99','2005-07-30 15:13:45','2006-02-15 22:12:52'),(2234,82,1,9305,'8.99','2005-07-30 16:45:56','2006-02-15 22:12:52'),(2235,82,1,9447,'6.99','2005-07-30 21:54:22','2006-02-15 22:12:52'),(2236,82,1,11093,'4.99','2005-08-02 07:59:49','2006-02-15 22:12:52'),(2237,82,2,11688,'5.99','2005-08-17 06:41:58','2006-02-15 22:12:52'),(2238,82,1,12470,'3.99','2005-08-18 11:55:42','2006-02-15 22:12:52'),(2239,82,1,13032,'0.99','2005-08-19 08:31:50','2006-02-15 22:12:52'),(2240,82,2,13847,'6.99','2005-08-20 14:33:59','2006-02-15 22:12:52'),(2241,82,2,14518,'0.99','2005-08-21 14:58:58','2006-02-15 22:12:52'),(2242,82,2,14892,'4.99','2005-08-22 04:15:05','2006-02-15 22:12:52'),(2243,82,2,15516,'3.99','2005-08-23 03:12:54','2006-02-15 22:12:52'),(2244,83,2,222,'0.99','2005-05-26 10:14:38','2006-02-15 22:12:52'),(2245,83,2,950,'0.99','2005-05-30 16:06:08','2006-02-15 22:12:52'),(2246,83,2,989,'2.99','2005-05-30 23:11:51','2006-02-15 22:12:52'),(2247,83,1,1354,'5.99','2005-06-15 13:13:49','2006-02-15 22:12:52'),(2248,83,1,1591,'5.99','2005-06-16 05:12:37','2006-02-15 22:12:52'),(2249,83,2,1617,'3.99','2005-06-16 07:06:06','2006-02-15 22:12:52'),(2250,83,2,3230,'4.99','2005-06-21 02:23:16','2006-02-15 22:12:52'),(2251,83,2,3722,'6.99','2005-07-06 11:10:27','2006-02-15 22:12:52'),(2252,83,1,3754,'2.99','2005-07-06 12:35:44','2006-02-15 22:12:52'),(2253,83,1,5218,'0.99','2005-07-09 11:57:12','2006-02-15 22:12:52'),(2254,83,2,5394,'6.99','2005-07-09 19:36:15','2006-02-15 22:12:52'),(2255,83,2,6194,'2.99','2005-07-11 11:51:00','2006-02-15 22:12:52'),(2256,83,2,6861,'2.99','2005-07-12 19:56:52','2006-02-15 22:12:52'),(2257,83,2,7721,'0.99','2005-07-28 04:42:58','2006-02-15 22:12:52'),(2258,83,2,8729,'4.99','2005-07-29 18:23:02','2006-02-15 22:12:52'),(2259,83,1,9867,'1.99','2005-07-31 13:17:04','2006-02-15 22:12:53'),(2260,83,1,11408,'0.99','2005-08-02 19:25:13','2006-02-15 22:12:53'),(2261,83,1,11565,'5.99','2005-08-17 01:28:05','2006-02-15 22:12:53'),(2262,83,2,11777,'4.99','2005-08-17 10:27:19','2006-02-15 22:12:53'),(2263,83,1,12258,'4.99','2005-08-18 04:11:13','2006-02-15 22:12:53'),(2264,83,2,12985,'5.99','2005-08-19 07:08:05','2006-02-15 22:12:53'),(2265,83,1,13875,'4.99','2005-08-20 15:13:11','2006-02-15 22:12:53'),(2266,83,2,15498,'4.99','2005-08-23 02:33:27','2006-02-15 22:12:53'),(2267,83,2,15737,'5.99','2005-08-23 11:52:18','2006-02-15 22:12:53'),(2268,83,2,11563,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:53'),(2269,84,2,408,'0.99','2005-05-27 13:57:39','2006-02-15 22:12:53'),(2270,84,1,739,'6.99','2005-05-29 08:28:18','2006-02-15 22:12:53'),(2271,84,1,834,'4.99','2005-05-29 23:24:30','2006-02-15 22:12:53'),(2272,84,2,1195,'0.99','2005-06-15 01:37:38','2006-02-15 22:12:53'),(2273,84,2,1320,'4.99','2005-06-15 10:42:13','2006-02-15 22:12:53'),(2274,84,2,1815,'0.99','2005-06-16 21:16:07','2006-02-15 22:12:53'),(2275,84,1,2012,'5.99','2005-06-17 11:57:15','2006-02-15 22:12:53'),(2276,84,2,2042,'0.99','2005-06-17 14:31:02','2006-02-15 22:12:53'),(2277,84,2,2409,'0.99','2005-06-18 16:53:33','2006-02-15 22:12:53'),(2278,84,2,4079,'6.99','2005-07-07 05:06:27','2006-02-15 22:12:53'),(2279,84,2,4838,'6.99','2005-07-08 18:11:00','2006-02-15 22:12:53'),(2280,84,1,5221,'5.99','2005-07-09 12:02:23','2006-02-15 22:12:53'),(2281,84,1,5237,'0.99','2005-07-09 12:56:58','2006-02-15 22:12:53'),(2282,84,1,5971,'5.99','2005-07-11 00:05:58','2006-02-15 22:12:53'),(2283,84,2,6259,'2.99','2005-07-11 15:25:52','2006-02-15 22:12:53'),(2284,84,2,6415,'9.99','2005-07-11 23:27:52','2006-02-15 22:12:53'),(2285,84,1,7854,'2.99','2005-07-28 09:42:31','2006-02-15 22:12:53'),(2286,84,2,8019,'4.99','2005-07-28 15:37:43','2006-02-15 22:12:53'),(2287,84,1,8654,'8.99','2005-07-29 15:04:27','2006-02-15 22:12:53'),(2288,84,2,9074,'2.99','2005-07-30 07:50:10','2006-02-15 22:12:53'),(2289,84,2,9680,'4.99','2005-07-31 06:41:46','2006-02-15 22:12:53'),(2290,84,2,10540,'0.99','2005-08-01 12:24:42','2006-02-15 22:12:53'),(2291,84,1,10872,'2.99','2005-08-02 00:27:50','2006-02-15 22:12:53'),(2292,84,2,11220,'4.99','2005-08-02 12:31:41','2006-02-15 22:12:53'),(2293,84,2,11424,'3.99','2005-08-02 19:57:42','2006-02-15 22:12:53'),(2294,84,2,11453,'7.99','2005-08-02 21:00:05','2006-02-15 22:12:53'),(2295,84,2,11899,'0.99','2005-08-17 15:29:12','2006-02-15 22:12:53'),(2296,84,2,11960,'4.99','2005-08-17 17:24:30','2006-02-15 22:12:53'),(2297,84,2,12364,'4.99','2005-08-18 07:55:09','2006-02-15 22:12:53'),(2298,84,2,13115,'2.99','2005-08-19 11:27:43','2006-02-15 22:12:53'),(2299,84,1,14330,'5.99','2005-08-21 08:29:20','2006-02-15 22:12:53'),(2300,84,1,15190,'4.99','2005-08-22 15:57:38','2006-02-15 22:12:53'),(2301,84,1,15255,'2.99','2005-08-22 18:16:50','2006-02-15 22:12:53'),(2302,85,1,690,'9.99','2005-05-29 00:54:53','2006-02-15 22:12:53'),(2303,85,2,908,'4.99','2005-05-30 10:38:37','2006-02-15 22:12:53'),(2304,85,1,1685,'1.99','2005-06-16 12:06:57','2006-02-15 22:12:53'),(2305,85,1,2131,'5.99','2005-06-17 21:02:25','2006-02-15 22:12:53'),(2306,85,2,2794,'0.99','2005-06-19 18:53:05','2006-02-15 22:12:53'),(2307,85,1,3165,'4.99','2005-06-20 21:29:17','2006-02-15 22:12:53'),(2308,85,1,3307,'1.99','2005-06-21 07:52:30','2006-02-15 22:12:53'),(2309,85,2,3418,'3.99','2005-06-21 17:06:38','2006-02-15 22:12:53'),(2310,85,2,4451,'0.99','2005-07-07 23:29:54','2006-02-15 22:12:53'),(2311,85,1,4705,'2.99','2005-07-08 11:50:38','2006-02-15 22:12:53'),(2312,85,1,5051,'4.99','2005-07-09 03:57:53','2006-02-15 22:12:53'),(2313,85,1,5519,'0.99','2005-07-10 01:18:32','2006-02-15 22:12:53'),(2314,85,2,7906,'0.99','2005-07-28 11:31:42','2006-02-15 22:12:53'),(2315,85,2,9427,'7.99','2005-07-30 21:16:33','2006-02-15 22:12:53'),(2316,85,2,9957,'4.99','2005-07-31 16:03:55','2006-02-15 22:12:53'),(2317,85,1,9985,'2.99','2005-07-31 17:14:47','2006-02-15 22:12:53'),(2318,85,1,10328,'4.99','2005-08-01 04:56:10','2006-02-15 22:12:53'),(2319,85,1,10548,'0.99','2005-08-01 12:44:32','2006-02-15 22:12:53'),(2320,85,2,11067,'8.99','2005-08-02 07:03:24','2006-02-15 22:12:53'),(2321,85,2,12036,'0.99','2005-08-17 20:19:06','2006-02-15 22:12:53'),(2322,85,1,12456,'4.99','2005-08-18 11:21:51','2006-02-15 22:12:53'),(2323,85,1,13727,'3.99','2005-08-20 10:08:53','2006-02-15 22:12:53'),(2324,85,2,13733,'0.99','2005-08-20 10:25:12','2006-02-15 22:12:53'),(2325,86,1,66,'1.99','2005-05-25 09:35:12','2006-02-15 22:12:53'),(2326,86,2,1640,'4.99','2005-06-16 08:35:39','2006-02-15 22:12:54'),(2327,86,2,1822,'0.99','2005-06-16 21:43:45','2006-02-15 22:12:54'),(2328,86,2,1924,'2.99','2005-06-17 06:13:34','2006-02-15 22:12:54'),(2329,86,1,2141,'4.99','2005-06-17 21:41:34','2006-02-15 22:12:54'),(2330,86,1,2518,'4.99','2005-06-19 00:16:23','2006-02-15 22:12:54'),(2331,86,1,3207,'0.99','2005-06-21 00:43:16','2006-02-15 22:12:54'),(2332,86,2,3270,'4.99','2005-06-21 05:07:31','2006-02-15 22:12:54'),(2333,86,1,3611,'0.99','2005-07-06 05:37:18','2006-02-15 22:12:54'),(2334,86,2,3945,'4.99','2005-07-06 21:35:00','2006-02-15 22:12:54'),(2335,86,1,4235,'2.99','2005-07-07 13:05:52','2006-02-15 22:12:54'),(2336,86,1,4571,'9.99','2005-07-08 05:34:41','2006-02-15 22:12:54'),(2337,86,2,5295,'0.99','2005-07-09 15:25:06','2006-02-15 22:12:54'),(2338,86,1,5752,'8.99','2005-07-10 12:27:38','2006-02-15 22:12:54'),(2339,86,2,6872,'7.99','2005-07-12 20:15:04','2006-02-15 22:12:54'),(2340,86,1,7231,'2.99','2005-07-27 10:01:51','2006-02-15 22:12:54'),(2341,86,1,7874,'10.99','2005-07-28 10:21:52','2006-02-15 22:12:54'),(2342,86,2,8803,'5.99','2005-07-29 21:26:24','2006-02-15 22:12:54'),(2343,86,1,8850,'2.99','2005-07-29 23:24:20','2006-02-15 22:12:54'),(2344,86,2,9376,'4.99','2005-07-30 19:11:49','2006-02-15 22:12:54'),(2345,86,2,10252,'8.99','2005-08-01 02:39:39','2006-02-15 22:12:54'),(2346,86,2,10536,'4.99','2005-08-01 12:21:53','2006-02-15 22:12:54'),(2347,86,2,10584,'6.99','2005-08-01 13:58:47','2006-02-15 22:12:54'),(2348,86,2,11916,'0.99','2005-08-17 16:05:51','2006-02-15 22:12:54'),(2349,86,1,12198,'2.99','2005-08-18 02:09:20','2006-02-15 22:12:54'),(2350,86,2,12870,'3.99','2005-08-19 02:54:38','2006-02-15 22:12:54'),(2351,86,2,13338,'4.99','2005-08-19 20:09:59','2006-02-15 22:12:54'),(2352,86,1,13535,'4.99','2005-08-20 03:30:25','2006-02-15 22:12:54'),(2353,86,1,13874,'2.99','2005-08-20 15:11:48','2006-02-15 22:12:54'),(2354,86,2,14122,'1.99','2005-08-21 01:29:01','2006-02-15 22:12:54'),(2355,86,2,15099,'4.99','2005-08-22 11:49:16','2006-02-15 22:12:54'),(2356,86,1,15715,'1.99','2005-08-23 10:57:40','2006-02-15 22:12:54'),(2357,86,2,15940,'5.99','2005-08-23 18:45:06','2006-02-15 22:12:54'),(2358,87,2,451,'4.99','2005-05-27 19:27:54','2006-02-15 22:12:54'),(2359,87,1,674,'2.99','2005-05-28 22:11:35','2006-02-15 22:12:54'),(2360,87,2,1580,'4.99','2005-06-16 04:12:25','2006-02-15 22:12:54'),(2361,87,1,1904,'2.99','2005-06-17 04:45:41','2006-02-15 22:12:54'),(2362,87,2,2408,'2.99','2005-06-18 16:50:44','2006-02-15 22:12:54'),(2363,87,1,2516,'4.99','2005-06-19 00:03:28','2006-02-15 22:12:54'),(2364,87,2,3122,'9.99','2005-06-20 18:25:57','2006-02-15 22:12:54'),(2365,87,1,5084,'7.99','2005-07-09 05:33:27','2006-02-15 22:12:54'),(2366,87,1,5628,'3.99','2005-07-10 05:56:40','2006-02-15 22:12:54'),(2367,87,2,5700,'4.99','2005-07-10 09:49:42','2006-02-15 22:12:54'),(2368,87,1,6638,'4.99','2005-07-12 09:58:02','2006-02-15 22:12:54'),(2369,87,2,7599,'2.99','2005-07-27 23:38:46','2006-02-15 22:12:54'),(2370,87,2,8187,'7.99','2005-07-28 22:33:53','2006-02-15 22:12:54'),(2371,87,1,8286,'5.99','2005-07-29 02:02:46','2006-02-15 22:12:54'),(2372,87,2,8323,'4.99','2005-07-29 03:52:59','2006-02-15 22:12:54'),(2373,87,2,9060,'0.99','2005-07-30 07:20:36','2006-02-15 22:12:54'),(2374,87,1,9348,'2.99','2005-07-30 18:17:09','2006-02-15 22:12:54'),(2375,87,2,9364,'8.99','2005-07-30 18:44:44','2006-02-15 22:12:54'),(2376,87,2,10205,'4.99','2005-08-01 00:48:24','2006-02-15 22:12:54'),(2377,87,1,10387,'4.99','2005-08-01 06:42:31','2006-02-15 22:12:54'),(2378,87,1,12232,'0.99','2005-08-18 03:14:14','2006-02-15 22:12:54'),(2379,87,1,12257,'8.99','2005-08-18 04:11:03','2006-02-15 22:12:54'),(2380,87,1,12264,'5.99','2005-08-18 04:17:33','2006-02-15 22:12:54'),(2381,87,1,13479,'0.99','2005-08-20 01:09:11','2006-02-15 22:12:54'),(2382,87,1,13906,'0.99','2005-08-20 16:16:03','2006-02-15 22:12:54'),(2383,87,2,14024,'10.99','2005-08-20 21:13:58','2006-02-15 22:12:54'),(2384,87,1,14566,'2.99','2005-08-21 16:25:05','2006-02-15 22:12:54'),(2385,87,1,15876,'2.99','2005-08-23 16:32:10','2006-02-15 22:12:54'),(2386,87,2,15890,'4.99','2005-08-23 16:58:12','2006-02-15 22:12:54'),(2387,87,2,12719,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:54'),(2388,88,2,36,'2.99','2005-05-25 04:36:26','2006-02-15 22:12:54'),(2389,88,1,1433,'2.99','2005-06-15 18:30:00','2006-02-15 22:12:54'),(2390,88,1,2483,'7.99','2005-06-18 21:22:23','2006-02-15 22:12:54'),(2391,88,1,2878,'2.99','2005-06-20 01:09:14','2006-02-15 22:12:55'),(2392,88,2,3524,'0.99','2005-07-06 01:01:51','2006-02-15 22:12:55'),(2393,88,2,3620,'0.99','2005-07-06 06:01:50','2006-02-15 22:12:55'),(2394,88,2,3673,'5.99','2005-07-06 09:02:09','2006-02-15 22:12:55'),(2395,88,1,3846,'5.99','2005-07-06 16:43:10','2006-02-15 22:12:55'),(2396,88,1,6643,'1.99','2005-07-12 10:39:22','2006-02-15 22:12:55'),(2397,88,1,6916,'4.99','2005-07-12 22:29:18','2006-02-15 22:12:55'),(2398,88,1,7088,'5.99','2005-07-27 04:42:28','2006-02-15 22:12:55'),(2399,88,1,7621,'8.99','2005-07-28 00:34:06','2006-02-15 22:12:55'),(2400,88,1,8296,'2.99','2005-07-29 02:43:25','2006-02-15 22:12:55'),(2401,88,2,8526,'2.99','2005-07-29 10:20:48','2006-02-15 22:12:55'),(2402,88,1,8692,'2.99','2005-07-29 16:43:39','2006-02-15 22:12:55'),(2403,88,1,10424,'0.99','2005-08-01 08:22:54','2006-02-15 22:12:55'),(2404,88,1,11056,'6.99','2005-08-02 06:36:27','2006-02-15 22:12:55'),(2405,88,2,14097,'2.99','2005-08-21 00:28:48','2006-02-15 22:12:55'),(2406,88,2,14827,'5.99','2005-08-22 01:32:32','2006-02-15 22:12:55'),(2407,88,2,15098,'3.99','2005-08-22 11:48:19','2006-02-15 22:12:55'),(2408,88,1,15898,'4.99','2005-08-23 17:13:01','2006-02-15 22:12:55'),(2409,89,2,141,'2.99','2005-05-25 23:34:53','2006-02-15 22:12:55'),(2410,89,2,588,'0.99','2005-05-28 12:08:37','2006-02-15 22:12:55'),(2411,89,1,740,'5.99','2005-05-29 08:30:36','2006-02-15 22:12:55'),(2412,89,1,1252,'8.99','2005-06-15 06:05:18','2006-02-15 22:12:55'),(2413,89,2,1407,'7.99','2005-06-15 16:45:07','2006-02-15 22:12:55'),(2414,89,1,1948,'4.99','2005-06-17 08:06:53','2006-02-15 22:12:55'),(2415,89,1,2523,'0.99','2005-06-19 00:45:56','2006-02-15 22:12:55'),(2416,89,1,2835,'7.99','2005-06-19 21:44:11','2006-02-15 22:12:55'),(2417,89,2,4152,'4.99','2005-07-07 08:50:33','2006-02-15 22:12:55'),(2418,89,1,4488,'0.99','2005-07-08 01:22:23','2006-02-15 22:12:55'),(2419,89,1,4764,'8.99','2005-07-08 15:01:25','2006-02-15 22:12:55'),(2420,89,2,5144,'7.99','2005-07-09 08:09:53','2006-02-15 22:12:55'),(2421,89,2,5436,'2.99','2005-07-09 21:31:11','2006-02-15 22:12:55'),(2422,89,1,5483,'2.99','2005-07-09 23:54:09','2006-02-15 22:12:55'),(2423,89,1,6772,'2.99','2005-07-12 15:55:35','2006-02-15 22:12:55'),(2424,89,2,7370,'7.99','2005-07-27 15:15:53','2006-02-15 22:12:55'),(2425,89,2,7729,'4.99','2005-07-28 04:57:57','2006-02-15 22:12:55'),(2426,89,2,7995,'4.99','2005-07-28 15:00:09','2006-02-15 22:12:55'),(2427,89,1,8003,'2.99','2005-07-28 15:11:27','2006-02-15 22:12:55'),(2428,89,2,8070,'2.99','2005-07-28 17:26:56','2006-02-15 22:12:55'),(2429,89,2,8972,'0.99','2005-07-30 04:06:25','2006-02-15 22:12:55'),(2430,89,1,9328,'2.99','2005-07-30 17:32:11','2006-02-15 22:12:55'),(2431,89,2,9646,'2.99','2005-07-31 05:43:28','2006-02-15 22:12:55'),(2432,89,2,9767,'0.99','2005-07-31 09:46:49','2006-02-15 22:12:55'),(2433,89,2,10164,'4.99','2005-07-31 23:17:57','2006-02-15 22:12:55'),(2434,89,2,10806,'4.99','2005-08-01 22:25:29','2006-02-15 22:12:55'),(2435,89,1,11090,'3.99','2005-08-02 07:56:40','2006-02-15 22:12:55'),(2436,89,1,12118,'3.99','2005-08-17 23:14:25','2006-02-15 22:12:55'),(2437,89,2,12431,'2.99','2005-08-18 10:34:59','2006-02-15 22:12:55'),(2438,89,1,12756,'2.99','2005-08-18 22:52:13','2006-02-15 22:12:55'),(2439,89,1,13823,'2.99','2005-08-20 13:42:10','2006-02-15 22:12:55'),(2440,89,1,15845,'2.99','2005-08-23 15:38:34','2006-02-15 22:12:55'),(2441,90,2,2033,'0.99','2005-06-17 13:24:43','2006-02-15 22:12:55'),(2442,90,2,2584,'6.99','2005-06-19 05:02:36','2006-02-15 22:12:55'),(2443,90,2,3132,'0.99','2005-06-20 19:09:46','2006-02-15 22:12:55'),(2444,90,2,3729,'3.99','2005-07-06 11:30:29','2006-02-15 22:12:55'),(2445,90,2,4371,'4.99','2005-07-07 20:06:45','2006-02-15 22:12:55'),(2446,90,2,5272,'0.99','2005-07-09 14:26:01','2006-02-15 22:12:55'),(2447,90,2,5539,'3.99','2005-07-10 02:42:58','2006-02-15 22:12:55'),(2448,90,2,7035,'5.99','2005-07-27 03:06:09','2006-02-15 22:12:55'),(2449,90,2,7058,'1.99','2005-07-27 03:50:46','2006-02-15 22:12:55'),(2450,90,1,7428,'5.99','2005-07-27 17:21:52','2006-02-15 22:12:55'),(2451,90,1,7946,'6.99','2005-07-28 13:01:22','2006-02-15 22:12:55'),(2452,90,1,8024,'2.99','2005-07-28 15:55:40','2006-02-15 22:12:55'),(2453,90,1,8408,'0.99','2005-07-29 06:40:40','2006-02-15 22:12:56'),(2454,90,2,8870,'9.99','2005-07-30 00:08:08','2006-02-15 22:12:56'),(2455,90,2,9337,'2.99','2005-07-30 18:02:25','2006-02-15 22:12:56'),(2456,90,2,10206,'7.99','2005-08-01 00:52:40','2006-02-15 22:12:56'),(2457,90,1,10722,'4.99','2005-08-01 19:07:08','2006-02-15 22:12:56'),(2458,90,1,10835,'4.99','2005-08-01 23:28:49','2006-02-15 22:12:56'),(2459,90,2,11231,'4.99','2005-08-02 13:02:11','2006-02-15 22:12:56'),(2460,90,1,11516,'0.99','2005-08-16 23:54:47','2006-02-15 22:12:56'),(2461,90,2,12019,'0.99','2005-08-17 19:48:55','2006-02-15 22:12:56'),(2462,90,1,12788,'2.99','2005-08-19 00:15:09','2006-02-15 22:12:56'),(2463,90,1,13051,'4.99','2005-08-19 09:31:33','2006-02-15 22:12:56'),(2464,90,1,14608,'1.99','2005-08-21 17:57:22','2006-02-15 22:12:56'),(2465,90,1,14807,'4.99','2005-08-22 00:57:43','2006-02-15 22:12:56'),(2466,90,2,15061,'0.99','2005-08-22 10:29:44','2006-02-15 22:12:56'),(2467,90,2,15217,'0.99','2005-08-22 16:58:31','2006-02-15 22:12:56'),(2468,90,1,15674,'7.99','2005-08-23 09:16:39','2006-02-15 22:12:56'),(2469,91,2,216,'5.99','2005-05-26 09:17:43','2006-02-15 22:12:56'),(2470,91,1,1299,'4.99','2005-06-15 09:34:50','2006-02-15 22:12:56'),(2471,91,1,2457,'3.99','2005-06-18 19:38:20','2006-02-15 22:12:56'),(2472,91,1,2908,'0.99','2005-06-20 03:16:52','2006-02-15 22:12:56'),(2473,91,2,3384,'2.99','2005-06-21 14:07:35','2006-02-15 22:12:56'),(2474,91,2,3802,'0.99','2005-07-06 15:06:09','2006-02-15 22:12:56'),(2475,91,2,4103,'2.99','2005-07-07 06:25:28','2006-02-15 22:12:56'),(2476,91,1,4245,'4.99','2005-07-07 13:48:33','2006-02-15 22:12:56'),(2477,91,1,4321,'4.99','2005-07-07 17:52:38','2006-02-15 22:12:56'),(2478,91,1,4673,'4.99','2005-07-08 10:16:00','2006-02-15 22:12:56'),(2479,91,2,5025,'4.99','2005-07-09 02:28:24','2006-02-15 22:12:56'),(2480,91,2,5187,'1.99','2005-07-09 10:19:51','2006-02-15 22:12:56'),(2481,91,2,5701,'0.99','2005-07-10 09:56:24','2006-02-15 22:12:56'),(2482,91,1,6078,'4.99','2005-07-11 05:06:52','2006-02-15 22:12:56'),(2483,91,1,6178,'2.99','2005-07-11 10:59:09','2006-02-15 22:12:56'),(2484,91,2,6860,'2.99','2005-07-12 19:54:17','2006-02-15 22:12:56'),(2485,91,2,7143,'0.99','2005-07-27 06:56:31','2006-02-15 22:12:56'),(2486,91,2,7637,'0.99','2005-07-28 01:12:25','2006-02-15 22:12:56'),(2487,91,1,7966,'4.99','2005-07-28 13:53:54','2006-02-15 22:12:56'),(2488,91,1,8313,'0.99','2005-07-29 03:34:21','2006-02-15 22:12:56'),(2489,91,2,8873,'0.99','2005-07-30 00:14:32','2006-02-15 22:12:56'),(2490,91,2,9228,'2.99','2005-07-30 13:36:57','2006-02-15 22:12:56'),(2491,91,2,9396,'4.99','2005-07-30 20:07:24','2006-02-15 22:12:56'),(2492,91,2,10008,'4.99','2005-07-31 17:59:36','2006-02-15 22:12:56'),(2493,91,2,11418,'0.99','2005-08-02 19:45:33','2006-02-15 22:12:56'),(2494,91,1,12847,'0.99','2005-08-19 02:04:07','2006-02-15 22:12:56'),(2495,91,2,13222,'4.99','2005-08-19 15:47:58','2006-02-15 22:12:56'),(2496,91,2,13309,'4.99','2005-08-19 19:04:00','2006-02-15 22:12:56'),(2497,91,1,14132,'0.99','2005-08-21 01:43:58','2006-02-15 22:12:56'),(2498,91,2,14888,'2.99','2005-08-22 04:09:18','2006-02-15 22:12:56'),(2499,91,1,15122,'1.99','2005-08-22 12:47:45','2006-02-15 22:12:56'),(2500,91,1,15341,'4.99','2005-08-22 20:56:31','2006-02-15 22:12:56'),(2501,91,1,15707,'1.99','2005-08-23 10:35:45','2006-02-15 22:12:56'),(2502,91,2,15886,'4.99','2005-08-23 16:50:53','2006-02-15 22:12:56'),(2503,91,1,12902,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:56'),(2504,92,1,271,'5.99','2005-05-26 16:22:01','2006-02-15 22:12:56'),(2505,92,1,456,'4.99','2005-05-27 19:50:06','2006-02-15 22:12:56'),(2506,92,2,2084,'4.99','2005-06-17 17:17:19','2006-02-15 22:12:56'),(2507,92,1,2521,'0.99','2005-06-19 00:41:08','2006-02-15 22:12:56'),(2508,92,1,2740,'8.99','2005-06-19 15:59:04','2006-02-15 22:12:56'),(2509,92,2,3595,'8.99','2005-07-06 04:59:49','2006-02-15 22:12:56'),(2510,92,2,3716,'7.99','2005-07-06 10:52:32','2006-02-15 22:12:56'),(2511,92,1,4360,'2.99','2005-07-07 19:31:12','2006-02-15 22:12:56'),(2512,92,2,4828,'4.99','2005-07-08 17:52:29','2006-02-15 22:12:56'),(2513,92,2,5497,'5.99','2005-07-10 00:23:23','2006-02-15 22:12:56'),(2514,92,2,5620,'7.99','2005-07-10 05:30:52','2006-02-15 22:12:56'),(2515,92,1,5792,'6.99','2005-07-10 14:22:19','2006-02-15 22:12:57'),(2516,92,2,5919,'2.99','2005-07-10 21:32:14','2006-02-15 22:12:57'),(2517,92,1,6158,'0.99','2005-07-11 09:50:24','2006-02-15 22:12:57'),(2518,92,2,6277,'6.99','2005-07-11 16:19:01','2006-02-15 22:12:57'),(2519,92,1,7073,'4.99','2005-07-27 04:03:26','2006-02-15 22:12:57'),(2520,92,1,7832,'1.99','2005-07-28 08:46:11','2006-02-15 22:12:57'),(2521,92,1,8494,'4.99','2005-07-29 09:04:32','2006-02-15 22:12:57'),(2522,92,1,8938,'4.99','2005-07-30 02:56:08','2006-02-15 22:12:57'),(2523,92,1,9240,'4.99','2005-07-30 13:57:54','2006-02-15 22:12:57'),(2524,92,2,11203,'4.99','2005-08-02 11:52:41','2006-02-15 22:12:57'),(2525,92,2,11245,'2.99','2005-08-02 13:33:50','2006-02-15 22:12:57'),(2526,92,1,11849,'4.99','2005-08-17 13:24:55','2006-02-15 22:12:57'),(2527,92,2,13020,'5.99','2005-08-19 08:07:50','2006-02-15 22:12:57'),(2528,92,1,13495,'0.99','2005-08-20 01:40:25','2006-02-15 22:12:57'),(2529,92,1,13620,'2.99','2005-08-20 06:41:27','2006-02-15 22:12:57'),(2530,92,1,14798,'0.99','2005-08-22 00:44:08','2006-02-15 22:12:57'),(2531,92,2,14998,'4.99','2005-08-22 07:53:14','2006-02-15 22:12:57'),(2532,93,2,113,'2.99','2005-05-25 19:07:40','2006-02-15 22:12:57'),(2533,93,2,420,'6.99','2005-05-27 15:19:38','2006-02-15 22:12:57'),(2534,93,1,1025,'4.99','2005-05-31 03:41:37','2006-02-15 22:12:57'),(2535,93,2,2256,'4.99','2005-06-18 05:21:56','2006-02-15 22:12:57'),(2536,93,1,3109,'0.99','2005-06-20 17:33:55','2006-02-15 22:12:57'),(2537,93,1,4733,'2.99','2005-07-08 13:12:07','2006-02-15 22:12:57'),(2538,93,2,5130,'4.99','2005-07-09 07:29:45','2006-02-15 22:12:57'),(2539,93,2,6287,'4.99','2005-07-11 17:00:04','2006-02-15 22:12:57'),(2540,93,1,6586,'4.99','2005-07-12 06:56:24','2006-02-15 22:12:57'),(2541,93,1,7301,'2.99','2005-07-27 12:50:23','2006-02-15 22:12:57'),(2542,93,1,8233,'0.99','2005-07-29 00:16:23','2006-02-15 22:12:57'),(2543,93,2,11271,'5.99','2005-08-02 14:18:22','2006-02-15 22:12:57'),(2544,93,1,12704,'4.99','2005-08-18 20:43:00','2006-02-15 22:12:57'),(2545,93,1,13555,'2.99','2005-08-20 04:09:50','2006-02-15 22:12:57'),(2546,93,2,13904,'2.99','2005-08-20 16:11:34','2006-02-15 22:12:57'),(2547,93,1,13950,'8.99','2005-08-20 17:58:00','2006-02-15 22:12:57'),(2548,93,1,13993,'4.99','2005-08-20 19:32:29','2006-02-15 22:12:57'),(2549,93,1,14195,'0.99','2005-08-21 03:40:35','2006-02-15 22:12:57'),(2550,93,2,14333,'4.99','2005-08-21 08:31:03','2006-02-15 22:12:57'),(2551,93,2,15324,'5.99','2005-08-22 20:23:13','2006-02-15 22:12:57'),(2552,93,2,15631,'2.99','2005-08-23 07:30:23','2006-02-15 22:12:57'),(2553,93,1,15696,'0.99','2005-08-23 10:04:17','2006-02-15 22:12:57'),(2554,93,2,15913,'1.99','2005-08-23 17:48:30','2006-02-15 22:12:57'),(2555,94,1,127,'2.99','2005-05-25 21:10:40','2006-02-15 22:12:57'),(2556,94,2,629,'4.99','2005-05-28 17:19:15','2006-02-15 22:12:57'),(2557,94,2,1213,'2.99','2005-06-15 03:14:05','2006-02-15 22:12:57'),(2558,94,1,1367,'4.99','2005-06-15 14:25:17','2006-02-15 22:12:57'),(2559,94,2,1734,'3.99','2005-06-16 15:49:30','2006-02-15 22:12:57'),(2560,94,2,2620,'4.99','2005-06-19 08:06:29','2006-02-15 22:12:57'),(2561,94,1,2816,'2.99','2005-06-19 20:04:23','2006-02-15 22:12:57'),(2562,94,2,4044,'0.99','2005-07-07 03:22:23','2006-02-15 22:12:57'),(2563,94,1,4287,'8.99','2005-07-07 15:37:31','2006-02-15 22:12:57'),(2564,94,2,5719,'4.99','2005-07-10 11:07:40','2006-02-15 22:12:57'),(2565,94,2,5970,'4.99','2005-07-11 00:04:50','2006-02-15 22:12:57'),(2566,94,2,7809,'2.99','2005-07-28 07:59:46','2006-02-15 22:12:57'),(2567,94,2,7979,'0.99','2005-07-28 14:16:30','2006-02-15 22:12:57'),(2568,94,1,9605,'4.99','2005-07-31 03:50:07','2006-02-15 22:12:57'),(2569,94,1,12316,'2.99','2005-08-18 06:16:09','2006-02-15 22:12:57'),(2570,94,1,13786,'5.99','2005-08-20 12:13:24','2006-02-15 22:12:57'),(2571,94,2,14804,'1.99','2005-08-22 00:51:25','2006-02-15 22:12:57'),(2572,94,1,14865,'4.99','2005-08-22 03:06:38','2006-02-15 22:12:57'),(2573,94,1,14978,'0.99','2005-08-22 07:13:15','2006-02-15 22:12:57'),(2574,94,1,15693,'0.99','2005-08-23 10:00:24','2006-02-15 22:12:58'),(2575,94,1,15371,'4.99','2006-02-14 15:16:03','2006-02-15 22:12:58'),(2576,95,1,490,'4.99','2005-05-28 00:09:56','2006-02-15 22:12:58'),(2577,95,2,1174,'2.99','2005-06-15 00:12:51','2006-02-15 22:12:58'),(2578,95,2,1261,'1.99','2005-06-15 06:52:57','2006-02-15 22:12:58'),(2579,95,2,3056,'2.99','2005-06-20 13:20:58','2006-02-15 22:12:58'),(2580,95,2,3426,'0.99','2005-06-21 18:12:10','2006-02-15 22:12:58'),(2581,95,1,3633,'1.99','2005-07-06 06:43:26','2006-02-15 22:12:58'),(2582,95,2,4000,'4.99','2005-07-06 23:58:37','2006-02-15 22:12:58'),(2583,95,1,4835,'5.99','2005-07-08 18:08:13','2006-02-15 22:12:58'),(2584,95,2,7245,'5.99','2005-07-27 10:29:06','2006-02-15 22:12:58'),(2585,95,1,7471,'4.99','2005-07-27 19:02:19','2006-02-15 22:12:58'),(2586,95,1,9222,'6.99','2005-07-30 13:21:08','2006-02-15 22:12:58'),(2587,95,1,9695,'6.99','2005-07-31 07:13:30','2006-02-15 22:12:58'),(2588,95,1,9951,'4.99','2005-07-31 15:51:16','2006-02-15 22:12:58'),(2589,95,1,10130,'0.99','2005-07-31 21:44:30','2006-02-15 22:12:58'),(2590,95,2,10446,'0.99','2005-08-01 09:02:17','2006-02-15 22:12:58'),(2591,95,2,12351,'5.99','2005-08-18 07:32:12','2006-02-15 22:12:58'),(2592,95,2,13516,'7.99','2005-08-20 02:32:45','2006-02-15 22:12:58'),(2593,95,2,14203,'4.99','2005-08-21 03:51:52','2006-02-15 22:12:58'),(2594,96,1,1266,'3.99','2005-06-15 07:11:39','2006-02-15 22:12:58'),(2595,96,2,1413,'7.99','2005-06-15 17:25:07','2006-02-15 22:12:58'),(2596,96,2,1437,'0.99','2005-06-15 18:37:04','2006-02-15 22:12:58'),(2597,96,1,2372,'0.99','2005-06-18 14:37:37','2006-02-15 22:12:58'),(2598,96,2,2973,'5.99','2005-06-20 07:59:27','2006-02-15 22:12:58'),(2599,96,1,3308,'0.99','2005-06-21 07:58:36','2006-02-15 22:12:58'),(2600,96,2,3463,'0.99','2005-06-21 22:00:00','2006-02-15 22:12:58'),(2601,96,1,3720,'2.99','2005-07-06 11:06:57','2006-02-15 22:12:58'),(2602,96,2,3742,'2.99','2005-07-06 12:01:38','2006-02-15 22:12:58'),(2603,96,1,4961,'4.99','2005-07-08 23:35:53','2006-02-15 22:12:58'),(2604,96,1,5558,'0.99','2005-07-10 03:12:08','2006-02-15 22:12:58'),(2605,96,1,5678,'4.99','2005-07-10 08:42:42','2006-02-15 22:12:58'),(2606,96,1,5696,'2.99','2005-07-10 09:44:32','2006-02-15 22:12:58'),(2607,96,2,8125,'4.99','2005-07-28 19:31:48','2006-02-15 22:12:58'),(2608,96,1,8437,'6.99','2005-07-29 07:23:43','2006-02-15 22:12:58'),(2609,96,2,9093,'3.99','2005-07-30 08:33:24','2006-02-15 22:12:58'),(2610,96,1,9315,'4.99','2005-07-30 17:05:29','2006-02-15 22:12:58'),(2611,96,1,9662,'3.99','2005-07-31 06:09:53','2006-02-15 22:12:58'),(2612,96,2,10031,'4.99','2005-07-31 18:40:15','2006-02-15 22:12:58'),(2613,96,2,11864,'4.99','2005-08-17 14:02:01','2006-02-15 22:12:58'),(2614,96,1,11984,'3.99','2005-08-17 18:16:30','2006-02-15 22:12:58'),(2615,96,1,12199,'4.99','2005-08-18 02:09:23','2006-02-15 22:12:58'),(2616,96,2,12525,'4.99','2005-08-18 13:48:31','2006-02-15 22:12:58'),(2617,96,1,13514,'0.99','2005-08-20 02:28:09','2006-02-15 22:12:58'),(2618,96,1,13855,'4.99','2005-08-20 14:48:55','2006-02-15 22:12:58'),(2619,96,1,14462,'3.99','2005-08-21 12:50:57','2006-02-15 22:12:58'),(2620,96,2,15989,'4.99','2005-08-23 20:24:36','2006-02-15 22:12:58'),(2621,97,2,2083,'2.99','2005-06-17 17:14:00','2006-02-15 22:12:58'),(2622,97,2,2790,'4.99','2005-06-19 18:49:45','2006-02-15 22:12:58'),(2623,97,1,3459,'0.99','2005-06-21 21:45:47','2006-02-15 22:12:59'),(2624,97,1,3540,'2.99','2005-07-06 01:47:20','2006-02-15 22:12:59'),(2625,97,2,3565,'0.99','2005-07-06 03:02:58','2006-02-15 22:12:59'),(2626,97,2,3818,'4.99','2005-07-06 15:33:31','2006-02-15 22:12:59'),(2627,97,2,4312,'4.99','2005-07-07 17:34:59','2006-02-15 22:12:59'),(2628,97,1,4508,'4.99','2005-07-08 02:28:41','2006-02-15 22:12:59'),(2629,97,2,5454,'4.99','2005-07-09 22:24:25','2006-02-15 22:12:59'),(2630,97,1,6544,'0.99','2005-07-12 04:56:15','2006-02-15 22:12:59'),(2631,97,1,6726,'0.99','2005-07-12 13:48:14','2006-02-15 22:12:59'),(2632,97,2,7182,'5.99','2005-07-27 08:15:38','2006-02-15 22:12:59'),(2633,97,2,7924,'0.99','2005-07-28 12:08:53','2006-02-15 22:12:59'),(2634,97,2,8438,'2.99','2005-07-29 07:25:42','2006-02-15 22:12:59'),(2635,97,1,9591,'4.99','2005-07-31 03:19:28','2006-02-15 22:12:59'),(2636,97,1,10820,'2.99','2005-08-01 22:53:40','2006-02-15 22:12:59'),(2637,97,2,14323,'4.99','2005-08-21 08:08:43','2006-02-15 22:12:59'),(2638,97,1,15006,'0.99','2005-08-22 08:20:15','2006-02-15 22:12:59'),(2639,98,2,214,'3.99','2005-05-26 08:48:49','2006-02-15 22:12:59'),(2640,98,1,1362,'3.99','2005-06-15 13:53:32','2006-02-15 22:12:59'),(2641,98,2,1590,'5.99','2005-06-16 05:11:41','2006-02-15 22:12:59'),(2642,98,1,2213,'4.99','2005-06-18 02:36:47','2006-02-15 22:12:59'),(2643,98,1,2445,'0.99','2005-06-18 19:02:11','2006-02-15 22:12:59'),(2644,98,2,2601,'4.99','2005-06-19 06:09:44','2006-02-15 22:12:59'),(2645,98,2,3399,'4.99','2005-06-21 15:47:48','2006-02-15 22:12:59'),(2646,98,2,3682,'7.99','2005-07-06 09:22:48','2006-02-15 22:12:59'),(2647,98,1,4549,'4.99','2005-07-08 04:25:03','2006-02-15 22:12:59'),(2648,98,2,6951,'2.99','2005-07-26 23:47:31','2006-02-15 22:12:59'),(2649,98,2,7120,'3.99','2005-07-27 05:56:39','2006-02-15 22:12:59'),(2650,98,1,7530,'0.99','2005-07-27 21:18:58','2006-02-15 22:12:59'),(2651,98,1,8324,'5.99','2005-07-29 03:56:05','2006-02-15 22:12:59'),(2652,98,2,8622,'4.99','2005-07-29 13:53:28','2006-02-15 22:12:59'),(2653,98,2,8818,'5.99','2005-07-29 22:14:04','2006-02-15 22:12:59'),(2654,98,1,9753,'2.99','2005-07-31 09:22:38','2006-02-15 22:12:59'),(2655,98,2,10694,'3.99','2005-08-01 18:15:07','2006-02-15 22:12:59'),(2656,98,1,10925,'2.99','2005-08-02 02:24:38','2006-02-15 22:12:59'),(2657,98,2,11007,'0.99','2005-08-02 05:05:53','2006-02-15 22:12:59'),(2658,98,2,11200,'2.99','2005-08-02 11:48:36','2006-02-15 22:12:59'),(2659,98,1,11635,'5.99','2005-08-17 04:33:17','2006-02-15 22:12:59'),(2660,98,1,11730,'2.99','2005-08-17 08:22:00','2006-02-15 22:12:59'),(2661,98,2,12221,'5.99','2005-08-18 02:50:51','2006-02-15 22:12:59'),(2662,98,2,14459,'1.99','2005-08-21 12:48:08','2006-02-15 22:12:59'),(2663,98,1,15536,'7.99','2005-08-23 03:58:28','2006-02-15 22:12:59'),(2664,99,2,867,'0.99','2005-05-30 03:54:43','2006-02-15 22:12:59'),(2665,99,1,1858,'4.99','2005-06-17 01:13:11','2006-02-15 22:12:59'),(2666,99,1,2368,'2.99','2005-06-18 14:10:27','2006-02-15 22:12:59'),(2667,99,2,3780,'6.99','2005-07-06 13:52:02','2006-02-15 22:12:59'),(2668,99,2,4170,'2.99','2005-07-07 09:44:36','2006-02-15 22:12:59'),(2669,99,2,4344,'4.99','2005-07-07 18:50:47','2006-02-15 22:12:59'),(2670,99,1,4589,'0.99','2005-07-08 06:26:04','2006-02-15 22:12:59'),(2671,99,2,4800,'4.99','2005-07-08 16:51:08','2006-02-15 22:12:59'),(2672,99,2,4954,'2.99','2005-07-08 23:14:16','2006-02-15 22:12:59'),(2673,99,2,5035,'2.99','2005-07-09 02:51:34','2006-02-15 22:12:59'),(2674,99,1,5748,'2.99','2005-07-10 12:19:59','2006-02-15 22:12:59'),(2675,99,1,6289,'2.99','2005-07-11 17:06:39','2006-02-15 22:12:59'),(2676,99,1,6370,'3.99','2005-07-11 21:28:32','2006-02-15 22:12:59'),(2677,99,2,6662,'4.99','2005-07-12 11:21:06','2006-02-15 22:12:59'),(2678,99,1,7039,'4.99','2005-07-27 03:11:48','2006-02-15 22:12:59'),(2679,99,1,8072,'0.99','2005-07-28 17:27:59','2006-02-15 22:12:59'),(2680,99,2,8242,'7.99','2005-07-29 00:34:27','2006-02-15 22:12:59'),(2681,99,2,8514,'0.99','2005-07-29 09:53:33','2006-02-15 22:12:59'),(2682,99,2,10388,'7.99','2005-08-01 06:42:44','2006-02-15 22:12:59'),(2683,99,1,10455,'1.99','2005-08-01 09:15:00','2006-02-15 22:13:00'),(2684,99,2,11266,'4.99','2005-08-02 14:07:35','2006-02-15 22:13:00'),(2685,99,2,12379,'0.99','2005-08-18 08:26:48','2006-02-15 22:13:00'),(2686,99,2,12869,'8.99','2005-08-19 02:50:36','2006-02-15 22:13:00'),(2687,99,1,11593,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2688,100,1,71,'0.99','2005-05-25 10:26:39','2006-02-15 22:13:00'),(2689,100,2,1216,'4.99','2005-06-15 03:23:48','2006-02-15 22:13:00'),(2690,100,1,1340,'3.99','2005-06-15 12:24:15','2006-02-15 22:13:00'),(2691,100,1,1427,'2.99','2005-06-15 18:17:28','2006-02-15 22:13:00'),(2692,100,2,3468,'6.99','2005-06-21 22:43:45','2006-02-15 22:13:00'),(2693,100,2,3602,'5.99','2005-07-06 05:23:10','2006-02-15 22:13:00'),(2694,100,1,3800,'8.99','2005-07-06 15:01:27','2006-02-15 22:13:00'),(2695,100,1,4209,'2.99','2005-07-07 11:35:08','2006-02-15 22:13:00'),(2696,100,1,4970,'8.99','2005-07-08 23:54:29','2006-02-15 22:13:00'),(2697,100,2,4980,'6.99','2005-07-09 00:26:59','2006-02-15 22:13:00'),(2698,100,2,5238,'4.99','2005-07-09 13:11:14','2006-02-15 22:13:00'),(2699,100,2,5355,'6.99','2005-07-09 18:07:17','2006-02-15 22:13:00'),(2700,100,1,6655,'4.99','2005-07-12 11:08:32','2006-02-15 22:13:00'),(2701,100,2,7819,'4.99','2005-07-28 08:27:14','2006-02-15 22:13:00'),(2702,100,1,7921,'1.99','2005-07-28 12:02:46','2006-02-15 22:13:00'),(2703,100,2,8203,'0.99','2005-07-28 23:14:56','2006-02-15 22:13:00'),(2704,100,2,9048,'5.99','2005-07-30 06:57:07','2006-02-15 22:13:00'),(2705,100,1,9271,'4.99','2005-07-30 15:04:31','2006-02-15 22:13:00'),(2706,100,1,11143,'0.99','2005-08-02 09:32:54','2006-02-15 22:13:00'),(2707,100,2,11346,'4.99','2005-08-02 17:15:38','2006-02-15 22:13:00'),(2708,100,1,12657,'0.99','2005-08-18 19:02:16','2006-02-15 22:13:00'),(2709,100,1,15163,'0.99','2005-08-22 14:43:13','2006-02-15 22:13:00'),(2710,100,2,15246,'3.99','2005-08-22 17:50:49','2006-02-15 22:13:00'),(2711,100,2,15021,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2712,101,1,468,'9.99','2005-05-27 21:13:10','2006-02-15 22:13:00'),(2713,101,1,4975,'2.99','2005-07-09 00:02:46','2006-02-15 22:13:00'),(2714,101,2,5100,'2.99','2005-07-09 06:16:03','2006-02-15 22:13:00'),(2715,101,1,5132,'5.99','2005-07-09 07:40:32','2006-02-15 22:13:00'),(2716,101,2,5198,'2.99','2005-07-09 10:49:10','2006-02-15 22:13:00'),(2717,101,1,5757,'2.99','2005-07-10 12:40:17','2006-02-15 22:13:00'),(2718,101,2,6433,'5.99','2005-07-12 00:12:02','2006-02-15 22:13:00'),(2719,101,2,7112,'5.99','2005-07-27 05:38:42','2006-02-15 22:13:00'),(2720,101,2,7866,'8.99','2005-07-28 10:08:01','2006-02-15 22:13:00'),(2721,101,1,8301,'0.99','2005-07-29 03:00:08','2006-02-15 22:13:00'),(2722,101,2,8825,'1.99','2005-07-29 22:24:16','2006-02-15 22:13:00'),(2723,101,2,8833,'4.99','2005-07-29 22:39:36','2006-02-15 22:13:00'),(2724,101,2,9965,'6.99','2005-07-31 16:19:32','2006-02-15 22:13:00'),(2725,101,2,10218,'0.99','2005-08-01 01:09:44','2006-02-15 22:13:00'),(2726,101,1,10253,'6.99','2005-08-01 02:39:49','2006-02-15 22:13:00'),(2727,101,1,10407,'0.99','2005-08-01 07:38:07','2006-02-15 22:13:00'),(2728,101,2,11959,'4.99','2005-08-17 17:23:35','2006-02-15 22:13:00'),(2729,101,2,12174,'2.99','2005-08-18 01:08:53','2006-02-15 22:13:00'),(2730,101,1,12471,'4.99','2005-08-18 11:57:00','2006-02-15 22:13:00'),(2731,101,2,13370,'1.99','2005-08-19 21:20:11','2006-02-15 22:13:00'),(2732,101,1,14476,'0.99','2005-08-21 13:31:07','2006-02-15 22:13:00'),(2733,101,2,14542,'3.99','2005-08-21 15:36:34','2006-02-15 22:13:00'),(2734,101,2,15103,'2.99','2005-08-22 12:01:06','2006-02-15 22:13:00'),(2735,101,2,12141,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:00'),(2736,102,1,247,'4.99','2005-05-26 14:01:05','2006-02-15 22:13:00'),(2737,102,1,358,'0.99','2005-05-27 06:43:59','2006-02-15 22:13:00'),(2738,102,2,562,'1.99','2005-05-28 09:01:21','2006-02-15 22:13:00'),(2739,102,2,1215,'2.99','2005-06-15 03:21:00','2006-02-15 22:13:00'),(2740,102,2,2419,'8.99','2005-06-18 17:21:24','2006-02-15 22:13:00'),(2741,102,2,3520,'1.99','2005-07-06 00:58:27','2006-02-15 22:13:00'),(2742,102,2,3630,'1.99','2005-07-06 06:27:15','2006-02-15 22:13:01'),(2743,102,2,3665,'4.99','2005-07-06 08:23:08','2006-02-15 22:13:01'),(2744,102,1,4089,'6.99','2005-07-07 05:45:59','2006-02-15 22:13:01'),(2745,102,2,4777,'3.99','2005-07-08 15:48:34','2006-02-15 22:13:01'),(2746,102,1,4997,'6.99','2005-07-09 01:06:03','2006-02-15 22:13:01'),(2747,102,1,5009,'5.99','2005-07-09 01:32:17','2006-02-15 22:13:01'),(2748,102,1,5109,'4.99','2005-07-09 06:48:49','2006-02-15 22:13:01'),(2749,102,2,5509,'5.99','2005-07-10 00:54:46','2006-02-15 22:13:01'),(2750,102,1,5716,'2.99','2005-07-10 10:59:23','2006-02-15 22:13:01'),(2751,102,2,6434,'5.99','2005-07-12 00:14:25','2006-02-15 22:13:01'),(2752,102,2,7119,'0.99','2005-07-27 05:55:32','2006-02-15 22:13:01'),(2753,102,2,7247,'0.99','2005-07-27 10:32:58','2006-02-15 22:13:01'),(2754,102,2,7439,'6.99','2005-07-27 17:42:31','2006-02-15 22:13:01'),(2755,102,1,8186,'0.99','2005-07-28 22:30:27','2006-02-15 22:13:01'),(2756,102,1,8664,'5.99','2005-07-29 15:36:27','2006-02-15 22:13:01'),(2757,102,2,9151,'3.99','2005-07-30 10:50:53','2006-02-15 22:13:01'),(2758,102,1,9192,'2.99','2005-07-30 12:26:26','2006-02-15 22:13:01'),(2759,102,2,9295,'0.99','2005-07-30 16:18:39','2006-02-15 22:13:01'),(2760,102,2,9617,'2.99','2005-07-31 04:15:38','2006-02-15 22:13:01'),(2761,102,1,9780,'4.99','2005-07-31 10:10:22','2006-02-15 22:13:01'),(2762,102,2,10841,'1.99','2005-08-01 23:39:21','2006-02-15 22:13:01'),(2763,102,2,11099,'4.99','2005-08-02 08:07:12','2006-02-15 22:13:01'),(2764,102,1,11183,'4.99','2005-08-02 11:00:32','2006-02-15 22:13:01'),(2765,102,2,12495,'4.99','2005-08-18 12:56:37','2006-02-15 22:13:01'),(2766,102,1,13420,'9.99','2005-08-19 22:57:25','2006-02-15 22:13:01'),(2767,102,1,15049,'1.99','2005-08-22 10:06:28','2006-02-15 22:13:01'),(2768,102,2,16031,'3.99','2005-08-23 21:59:26','2006-02-15 22:13:01'),(2769,103,1,240,'7.99','2005-05-26 12:40:23','2006-02-15 22:13:01'),(2770,103,1,658,'9.99','2005-05-28 20:23:23','2006-02-15 22:13:01'),(2771,103,2,1396,'4.99','2005-06-15 16:22:38','2006-02-15 22:13:01'),(2772,103,1,2118,'0.99','2005-06-17 20:28:29','2006-02-15 22:13:01'),(2773,103,1,2197,'0.99','2005-06-18 01:50:27','2006-02-15 22:13:01'),(2774,103,1,2724,'0.99','2005-06-19 14:57:54','2006-02-15 22:13:01'),(2775,103,2,3750,'6.99','2005-07-06 12:19:28','2006-02-15 22:13:01'),(2776,103,1,3850,'4.99','2005-07-06 16:51:21','2006-02-15 22:13:01'),(2777,103,2,4040,'6.99','2005-07-07 03:02:40','2006-02-15 22:13:01'),(2778,103,1,4213,'2.99','2005-07-07 11:53:49','2006-02-15 22:13:01'),(2779,103,1,4357,'1.99','2005-07-07 19:24:39','2006-02-15 22:13:01'),(2780,103,2,4872,'4.99','2005-07-08 19:23:16','2006-02-15 22:13:01'),(2781,103,2,5163,'4.99','2005-07-09 09:00:28','2006-02-15 22:13:01'),(2782,103,1,6525,'5.99','2005-07-12 04:17:15','2006-02-15 22:13:01'),(2783,103,2,6697,'6.99','2005-07-12 12:44:57','2006-02-15 22:13:01'),(2784,103,2,6949,'2.99','2005-07-26 23:44:12','2006-02-15 22:13:01'),(2785,103,1,7310,'0.99','2005-07-27 13:00:55','2006-02-15 22:13:01'),(2786,103,2,7472,'6.99','2005-07-27 19:04:19','2006-02-15 22:13:01'),(2787,103,1,8302,'0.99','2005-07-29 03:01:24','2006-02-15 22:13:01'),(2788,103,1,8520,'4.99','2005-07-29 10:10:02','2006-02-15 22:13:01'),(2789,103,2,9390,'4.99','2005-07-30 19:42:07','2006-02-15 22:13:01'),(2790,103,2,12942,'7.99','2005-08-19 05:40:36','2006-02-15 22:13:01'),(2791,103,1,13676,'0.99','2005-08-20 08:33:21','2006-02-15 22:13:01'),(2792,103,2,14064,'2.99','2005-08-20 22:39:16','2006-02-15 22:13:01'),(2793,103,2,14289,'4.99','2005-08-21 06:58:49','2006-02-15 22:13:01'),(2794,103,2,15401,'8.99','2005-08-22 23:13:10','2006-02-15 22:13:01'),(2795,103,1,15461,'5.99','2005-08-23 01:13:52','2006-02-15 22:13:01'),(2796,103,1,15467,'3.99','2005-08-23 01:22:12','2006-02-15 22:13:01'),(2797,103,1,15599,'5.99','2005-08-23 06:25:07','2006-02-15 22:13:01'),(2798,103,2,15679,'0.99','2005-08-23 09:27:29','2006-02-15 22:13:02'),(2799,103,2,16048,'8.99','2005-08-23 22:43:07','2006-02-15 22:13:02'),(2800,104,1,163,'10.99','2005-05-26 02:26:23','2006-02-15 22:13:02'),(2801,104,2,808,'3.99','2005-05-29 19:08:20','2006-02-15 22:13:02'),(2802,104,2,1287,'3.99','2005-06-15 08:41:38','2006-02-15 22:13:02'),(2803,104,1,2107,'0.99','2005-06-17 19:31:16','2006-02-15 22:13:02'),(2804,104,2,2928,'0.99','2005-06-20 04:43:45','2006-02-15 22:13:02'),(2805,104,2,3273,'2.99','2005-06-21 05:24:17','2006-02-15 22:13:02'),(2806,104,2,4012,'4.99','2005-07-07 00:56:09','2006-02-15 22:13:02'),(2807,104,2,4438,'6.99','2005-07-07 22:56:17','2006-02-15 22:13:02'),(2808,104,2,4520,'4.99','2005-07-08 02:53:46','2006-02-15 22:13:02'),(2809,104,1,4529,'7.99','2005-07-08 03:26:20','2006-02-15 22:13:02'),(2810,104,1,4917,'2.99','2005-07-08 21:32:30','2006-02-15 22:13:02'),(2811,104,1,5376,'1.99','2005-07-09 18:54:08','2006-02-15 22:13:02'),(2812,104,2,7107,'2.99','2005-07-27 05:22:04','2006-02-15 22:13:02'),(2813,104,1,8413,'1.99','2005-07-29 06:47:39','2006-02-15 22:13:02'),(2814,104,1,9090,'3.99','2005-07-30 08:24:42','2006-02-15 22:13:02'),(2815,104,2,9996,'5.99','2005-07-31 17:32:03','2006-02-15 22:13:02'),(2816,104,1,11700,'2.99','2005-08-17 07:12:31','2006-02-15 22:13:02'),(2817,104,1,12453,'3.99','2005-08-18 11:17:07','2006-02-15 22:13:02'),(2818,104,1,13005,'0.99','2005-08-19 07:45:42','2006-02-15 22:13:02'),(2819,104,1,13017,'1.99','2005-08-19 08:02:24','2006-02-15 22:13:02'),(2820,104,1,13179,'4.99','2005-08-19 13:59:53','2006-02-15 22:13:02'),(2821,104,1,13410,'3.99','2005-08-19 22:41:44','2006-02-15 22:13:02'),(2822,104,1,14218,'3.99','2005-08-21 04:43:59','2006-02-15 22:13:02'),(2823,104,2,15186,'0.99','2005-08-22 15:52:57','2006-02-15 22:13:02'),(2824,105,1,327,'8.99','2005-05-27 01:18:57','2006-02-15 22:13:02'),(2825,105,2,473,'7.99','2005-05-27 21:36:34','2006-02-15 22:13:02'),(2826,105,1,485,'2.99','2005-05-27 23:40:52','2006-02-15 22:13:02'),(2827,105,1,779,'6.99','2005-05-29 14:17:17','2006-02-15 22:13:02'),(2828,105,2,1789,'3.99','2005-06-16 19:49:18','2006-02-15 22:13:02'),(2829,105,2,1991,'3.99','2005-06-17 10:49:23','2006-02-15 22:13:02'),(2830,105,2,2635,'3.99','2005-06-19 09:08:45','2006-02-15 22:13:02'),(2831,105,2,5261,'4.99','2005-07-09 14:06:56','2006-02-15 22:13:02'),(2832,105,1,5429,'4.99','2005-07-09 21:14:03','2006-02-15 22:13:02'),(2833,105,2,5542,'2.99','2005-07-10 02:45:53','2006-02-15 22:13:02'),(2834,105,2,5677,'4.99','2005-07-10 08:41:28','2006-02-15 22:13:02'),(2835,105,2,6546,'4.99','2005-07-12 04:57:17','2006-02-15 22:13:02'),(2836,105,1,7442,'2.99','2005-07-27 17:47:00','2006-02-15 22:13:02'),(2837,105,2,8980,'2.99','2005-07-30 04:22:15','2006-02-15 22:13:02'),(2838,105,2,9124,'3.99','2005-07-30 09:43:12','2006-02-15 22:13:02'),(2839,105,2,9198,'5.99','2005-07-30 12:37:08','2006-02-15 22:13:02'),(2840,105,2,9210,'9.99','2005-07-30 12:56:44','2006-02-15 22:13:02'),(2841,105,1,10513,'4.99','2005-08-01 11:37:34','2006-02-15 22:13:02'),(2842,105,1,12217,'0.99','2005-08-18 02:44:44','2006-02-15 22:13:02'),(2843,105,2,12899,'2.99','2005-08-19 04:03:34','2006-02-15 22:13:02'),(2844,105,1,13057,'6.99','2005-08-19 09:40:05','2006-02-15 22:13:02'),(2845,105,1,13751,'2.99','2005-08-20 11:17:03','2006-02-15 22:13:02'),(2846,105,2,14048,'0.99','2005-08-20 22:03:18','2006-02-15 22:13:02'),(2847,105,2,15624,'4.99','2005-08-23 07:24:27','2006-02-15 22:13:02'),(2848,105,2,15688,'4.99','2005-08-23 09:48:45','2006-02-15 22:13:02'),(2849,105,2,15803,'2.99','2005-08-23 14:27:07','2006-02-15 22:13:02'),(2850,106,2,552,'3.99','2005-05-28 07:53:38','2006-02-15 22:13:03'),(2851,106,2,1156,'0.99','2005-05-31 22:37:34','2006-02-15 22:13:03'),(2852,106,1,2295,'4.99','2005-06-18 07:56:18','2006-02-15 22:13:03'),(2853,106,1,3023,'4.99','2005-06-20 11:18:11','2006-02-15 22:13:03'),(2854,106,1,4229,'4.99','2005-07-07 12:43:23','2006-02-15 22:13:03'),(2855,106,2,4277,'2.99','2005-07-07 14:52:12','2006-02-15 22:13:03'),(2856,106,1,4665,'3.99','2005-07-08 10:04:24','2006-02-15 22:13:03'),(2857,106,2,5453,'3.99','2005-07-09 22:24:11','2006-02-15 22:13:03'),(2858,106,2,6992,'0.99','2005-07-27 01:04:45','2006-02-15 22:13:03'),(2859,106,1,7224,'3.99','2005-07-27 09:44:26','2006-02-15 22:13:03'),(2860,106,1,7483,'4.99','2005-07-27 19:25:00','2006-02-15 22:13:03'),(2861,106,1,8115,'4.99','2005-07-28 19:14:17','2006-02-15 22:13:03'),(2862,106,2,9072,'2.99','2005-07-30 07:45:49','2006-02-15 22:13:03'),(2863,106,2,9747,'7.99','2005-07-31 09:16:57','2006-02-15 22:13:03'),(2864,106,2,10213,'8.99','2005-08-01 01:03:18','2006-02-15 22:13:03'),(2865,106,1,10228,'2.99','2005-08-01 01:43:18','2006-02-15 22:13:03'),(2866,106,1,10444,'8.99','2005-08-01 09:01:40','2006-02-15 22:13:03'),(2867,106,2,11436,'0.99','2005-08-02 20:16:06','2006-02-15 22:13:03'),(2868,106,1,12159,'7.99','2005-08-18 00:36:09','2006-02-15 22:13:03'),(2869,106,1,12845,'2.99','2005-08-19 02:02:37','2006-02-15 22:13:03'),(2870,106,2,14431,'2.99','2005-08-21 11:31:15','2006-02-15 22:13:03'),(2871,106,1,14920,'0.99','2005-08-22 05:08:58','2006-02-15 22:13:03'),(2872,106,1,15154,'6.99','2005-08-22 14:27:37','2006-02-15 22:13:03'),(2873,107,1,170,'5.99','2005-05-26 03:11:12','2006-02-15 22:13:03'),(2874,107,1,1026,'5.99','2005-05-31 03:45:26','2006-02-15 22:13:03'),(2875,107,2,1243,'2.99','2005-06-15 05:07:32','2006-02-15 22:13:03'),(2876,107,2,2693,'6.99','2005-06-19 13:11:47','2006-02-15 22:13:03'),(2877,107,2,2860,'4.99','2005-06-19 23:20:40','2006-02-15 22:13:03'),(2878,107,2,2897,'3.99','2005-06-20 02:34:23','2006-02-15 22:13:03'),(2879,107,1,3033,'3.99','2005-06-20 12:02:05','2006-02-15 22:13:03'),(2880,107,2,3120,'0.99','2005-06-20 18:19:29','2006-02-15 22:13:03'),(2881,107,2,3174,'0.99','2005-06-20 22:24:00','2006-02-15 22:13:03'),(2882,107,2,3824,'6.99','2005-07-06 15:43:15','2006-02-15 22:13:03'),(2883,107,2,5311,'4.99','2005-07-09 16:02:54','2006-02-15 22:13:03'),(2884,107,2,5575,'2.99','2005-07-10 03:55:50','2006-02-15 22:13:03'),(2885,107,2,5798,'3.99','2005-07-10 14:45:09','2006-02-15 22:13:03'),(2886,107,2,6131,'2.99','2005-07-11 08:22:05','2006-02-15 22:13:03'),(2887,107,2,6133,'0.99','2005-07-11 08:25:22','2006-02-15 22:13:03'),(2888,107,1,6811,'5.99','2005-07-12 17:54:33','2006-02-15 22:13:03'),(2889,107,2,6934,'6.99','2005-07-26 23:11:03','2006-02-15 22:13:03'),(2890,107,2,7447,'4.99','2005-07-27 18:02:08','2006-02-15 22:13:03'),(2891,107,1,7600,'7.99','2005-07-27 23:41:18','2006-02-15 22:13:03'),(2892,107,1,8162,'4.99','2005-07-28 21:11:46','2006-02-15 22:13:03'),(2893,107,2,8704,'1.99','2005-07-29 17:13:45','2006-02-15 22:13:03'),(2894,107,1,9155,'2.99','2005-07-30 11:00:00','2006-02-15 22:13:03'),(2895,107,2,9351,'2.99','2005-07-30 18:28:30','2006-02-15 22:13:03'),(2896,107,1,10226,'4.99','2005-08-01 01:40:04','2006-02-15 22:13:03'),(2897,107,2,13361,'4.99','2005-08-19 21:07:22','2006-02-15 22:13:03'),(2898,107,1,13510,'6.99','2005-08-20 02:18:30','2006-02-15 22:13:03'),(2899,107,1,14562,'4.99','2005-08-21 16:22:59','2006-02-15 22:13:03'),(2900,107,1,15560,'3.99','2005-08-23 05:01:13','2006-02-15 22:13:03'),(2901,107,1,13079,'1.98','2006-02-14 15:16:03','2006-02-15 22:13:03'),(2902,107,1,15497,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:03'),(2903,108,1,105,'4.99','2005-05-25 17:54:12','2006-02-15 22:13:03'),(2904,108,2,1055,'0.99','2005-05-31 07:47:18','2006-02-15 22:13:03'),(2905,108,2,1372,'4.99','2005-06-15 14:45:48','2006-02-15 22:13:03'),(2906,108,1,1425,'2.99','2005-06-15 18:13:46','2006-02-15 22:13:03'),(2907,108,1,2061,'8.99','2005-06-17 15:47:00','2006-02-15 22:13:03'),(2908,108,1,2210,'2.99','2005-06-18 02:27:01','2006-02-15 22:13:04'),(2909,108,2,3116,'4.99','2005-06-20 18:04:55','2006-02-15 22:13:04'),(2910,108,1,3875,'0.99','2005-07-06 18:15:39','2006-02-15 22:13:04'),(2911,108,2,4082,'2.99','2005-07-07 05:11:53','2006-02-15 22:13:04'),(2912,108,1,4303,'1.99','2005-07-07 16:57:32','2006-02-15 22:13:04'),(2913,108,1,4650,'4.99','2005-07-08 09:32:08','2006-02-15 22:13:04'),(2914,108,1,4754,'0.99','2005-07-08 14:20:01','2006-02-15 22:13:04'),(2915,108,2,5274,'6.99','2005-07-09 14:34:09','2006-02-15 22:13:04'),(2916,108,1,5661,'5.99','2005-07-10 07:53:51','2006-02-15 22:13:04'),(2917,108,2,5806,'4.99','2005-07-10 15:11:54','2006-02-15 22:13:04'),(2918,108,1,6841,'0.99','2005-07-12 19:04:24','2006-02-15 22:13:04'),(2919,108,2,8329,'5.99','2005-07-29 04:06:33','2006-02-15 22:13:04'),(2920,108,2,8587,'4.99','2005-07-29 12:18:40','2006-02-15 22:13:04'),(2921,108,1,8846,'4.99','2005-07-29 23:10:28','2006-02-15 22:13:04'),(2922,108,2,9755,'4.99','2005-07-31 09:24:55','2006-02-15 22:13:04'),(2923,108,1,11316,'5.99','2005-08-02 16:07:49','2006-02-15 22:13:04'),(2924,108,2,11445,'6.99','2005-08-02 20:33:35','2006-02-15 22:13:04'),(2925,108,2,11759,'2.99','2005-08-17 09:41:23','2006-02-15 22:13:04'),(2926,108,1,12583,'2.99','2005-08-18 15:51:36','2006-02-15 22:13:04'),(2927,108,2,12625,'6.99','2005-08-18 17:36:19','2006-02-15 22:13:04'),(2928,108,2,13754,'2.99','2005-08-20 11:18:08','2006-02-15 22:13:04'),(2929,108,2,14635,'3.99','2005-08-21 18:51:43','2006-02-15 22:13:04'),(2930,108,2,15556,'8.99','2005-08-23 04:52:16','2006-02-15 22:13:04'),(2931,108,1,16001,'2.99','2005-08-23 20:45:53','2006-02-15 22:13:04'),(2932,108,1,15294,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:04'),(2933,109,1,203,'5.99','2005-05-26 07:27:57','2006-02-15 22:13:04'),(2934,109,1,386,'0.99','2005-05-27 10:26:31','2006-02-15 22:13:04'),(2935,109,2,622,'3.99','2005-05-28 15:58:22','2006-02-15 22:13:04'),(2936,109,1,698,'0.99','2005-05-29 02:10:52','2006-02-15 22:13:04'),(2937,109,1,1061,'7.99','2005-05-31 08:27:58','2006-02-15 22:13:04'),(2938,109,1,1106,'4.99','2005-05-31 14:36:52','2006-02-15 22:13:04'),(2939,109,1,1115,'2.99','2005-05-31 16:07:09','2006-02-15 22:13:04'),(2940,109,2,1581,'2.99','2005-06-16 04:28:45','2006-02-15 22:13:04'),(2941,109,2,1891,'3.99','2005-06-17 04:16:44','2006-02-15 22:13:04'),(2942,109,2,2198,'6.99','2005-06-18 01:51:22','2006-02-15 22:13:04'),(2943,109,2,2679,'5.99','2005-06-19 12:12:30','2006-02-15 22:13:04'),(2944,109,2,3076,'5.99','2005-06-20 15:01:19','2006-02-15 22:13:04'),(2945,109,1,4921,'4.99','2005-07-08 21:43:21','2006-02-15 22:13:04'),(2946,109,1,5027,'2.99','2005-07-09 02:32:37','2006-02-15 22:13:04'),(2947,109,2,5296,'2.99','2005-07-09 15:26:27','2006-02-15 22:13:04'),(2948,109,2,6920,'6.99','2005-07-12 22:32:58','2006-02-15 22:13:04'),(2949,109,2,7145,'0.99','2005-07-27 07:01:00','2006-02-15 22:13:04'),(2950,109,1,8006,'3.99','2005-07-28 15:15:41','2006-02-15 22:13:04'),(2951,109,1,9230,'0.99','2005-07-30 13:39:42','2006-02-15 22:13:04'),(2952,109,1,9871,'2.99','2005-07-31 13:25:46','2006-02-15 22:13:04'),(2953,109,2,10240,'0.99','2005-08-01 02:09:33','2006-02-15 22:13:04'),(2954,109,2,10892,'3.99','2005-08-02 01:12:06','2006-02-15 22:13:04'),(2955,109,2,12137,'6.99','2005-08-17 23:52:26','2006-02-15 22:13:04'),(2956,109,1,13264,'3.99','2005-08-19 17:27:10','2006-02-15 22:13:04'),(2957,109,2,15398,'7.99','2005-08-22 23:10:49','2006-02-15 22:13:04'),(2958,109,2,15677,'2.99','2005-08-23 09:23:36','2006-02-15 22:13:04'),(2959,110,1,515,'7.99','2005-05-28 03:10:10','2006-02-15 22:13:04'),(2960,110,2,538,'1.99','2005-05-28 06:21:05','2006-02-15 22:13:04'),(2961,110,2,1528,'8.99','2005-06-16 00:32:52','2006-02-15 22:13:04'),(2962,110,1,3587,'4.99','2005-07-06 04:27:52','2006-02-15 22:13:04'),(2963,110,1,4317,'2.99','2005-07-07 17:44:49','2006-02-15 22:13:05'),(2964,110,2,4827,'4.99','2005-07-08 17:46:30','2006-02-15 22:13:05'),(2965,110,1,6160,'4.99','2005-07-11 10:08:13','2006-02-15 22:13:05'),(2966,110,1,7474,'0.99','2005-07-27 19:07:17','2006-02-15 22:13:05'),(2967,110,2,7542,'0.99','2005-07-27 21:43:04','2006-02-15 22:13:05'),(2968,110,1,7570,'2.99','2005-07-27 22:40:06','2006-02-15 22:13:05'),(2969,110,1,11647,'7.99','2005-08-17 04:54:14','2006-02-15 22:13:05'),(2970,110,2,12585,'3.99','2005-08-18 15:52:12','2006-02-15 22:13:05'),(2971,110,1,13723,'2.99','2005-08-20 10:05:30','2006-02-15 22:13:05'),(2972,110,2,15381,'2.99','2005-08-22 22:28:36','2006-02-15 22:13:05'),(2973,111,2,505,'2.99','2005-05-28 02:06:37','2006-02-15 22:13:05'),(2974,111,1,1593,'6.99','2005-06-16 05:14:52','2006-02-15 22:13:05'),(2975,111,2,1974,'2.99','2005-06-17 09:30:05','2006-02-15 22:13:05'),(2976,111,2,1999,'1.99','2005-06-17 11:30:08','2006-02-15 22:13:05'),(2977,111,2,2297,'4.99','2005-06-18 08:17:41','2006-02-15 22:13:05'),(2978,111,2,3087,'2.99','2005-06-20 15:53:59','2006-02-15 22:13:05'),(2979,111,2,3333,'2.99','2005-06-21 10:01:36','2006-02-15 22:13:05'),(2980,111,2,3485,'1.99','2005-07-05 23:25:54','2006-02-15 22:13:05'),(2981,111,1,3551,'3.99','2005-07-06 02:33:48','2006-02-15 22:13:05'),(2982,111,2,3963,'9.99','2005-07-06 22:19:17','2006-02-15 22:13:05'),(2983,111,1,4249,'4.99','2005-07-07 14:05:17','2006-02-15 22:13:05'),(2984,111,2,4286,'0.99','2005-07-07 15:36:44','2006-02-15 22:13:05'),(2985,111,1,6896,'2.99','2005-07-12 21:25:37','2006-02-15 22:13:05'),(2986,111,2,8525,'0.99','2005-07-29 10:20:19','2006-02-15 22:13:05'),(2987,111,2,9933,'0.99','2005-07-31 15:24:46','2006-02-15 22:13:05'),(2988,111,2,10039,'2.99','2005-07-31 18:50:40','2006-02-15 22:13:05'),(2989,111,2,10602,'4.99','2005-08-01 14:30:23','2006-02-15 22:13:05'),(2990,111,1,10952,'4.99','2005-08-02 03:28:21','2006-02-15 22:13:05'),(2991,111,2,10990,'4.99','2005-08-02 04:41:06','2006-02-15 22:13:05'),(2992,111,2,11239,'2.99','2005-08-02 13:27:11','2006-02-15 22:13:05'),(2993,111,2,12196,'3.99','2005-08-18 02:08:48','2006-02-15 22:13:05'),(2994,111,2,13251,'2.99','2005-08-19 16:48:37','2006-02-15 22:13:05'),(2995,111,2,13525,'5.99','2005-08-20 02:50:44','2006-02-15 22:13:05'),(2996,111,1,14949,'0.99','2005-08-22 06:12:16','2006-02-15 22:13:05'),(2997,111,2,15174,'6.99','2005-08-22 15:26:36','2006-02-15 22:13:05'),(2998,111,2,15542,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:05'),(2999,112,1,396,'0.99','2005-05-27 11:47:04','2006-02-15 22:13:05'),(3000,112,2,701,'2.99','2005-05-29 02:26:27','2006-02-15 22:13:05'),(3001,112,1,1835,'4.99','2005-06-16 23:05:36','2006-02-15 22:13:05'),(3002,112,2,1930,'2.99','2005-06-17 06:50:46','2006-02-15 22:13:05'),(3003,112,1,2193,'4.99','2005-06-18 01:38:45','2006-02-15 22:13:05'),(3004,112,2,3018,'2.99','2005-06-20 11:10:35','2006-02-15 22:13:05'),(3005,112,1,5351,'4.99','2005-07-09 17:40:52','2006-02-15 22:13:05'),(3006,112,1,5385,'2.99','2005-07-09 19:18:11','2006-02-15 22:13:05'),(3007,112,2,6550,'2.99','2005-07-12 05:03:14','2006-02-15 22:13:05'),(3008,112,2,7691,'4.99','2005-07-28 03:30:09','2006-02-15 22:13:05'),(3009,112,2,7761,'4.99','2005-07-28 06:31:45','2006-02-15 22:13:05'),(3010,112,1,9217,'4.99','2005-07-30 13:13:55','2006-02-15 22:13:05'),(3011,112,2,9321,'6.99','2005-07-30 17:19:44','2006-02-15 22:13:05'),(3012,112,2,9609,'4.99','2005-07-31 03:53:24','2006-02-15 22:13:05'),(3013,112,1,9830,'5.99','2005-07-31 11:59:05','2006-02-15 22:13:05'),(3014,112,2,9911,'3.99','2005-07-31 14:48:01','2006-02-15 22:13:05'),(3015,112,1,10038,'2.99','2005-07-31 18:49:12','2006-02-15 22:13:05'),(3016,112,2,10596,'5.99','2005-08-01 14:18:57','2006-02-15 22:13:06'),(3017,112,1,11019,'2.99','2005-08-02 05:29:31','2006-02-15 22:13:06'),(3018,112,1,11599,'7.99','2005-08-17 03:08:10','2006-02-15 22:13:06'),(3019,112,2,11659,'4.99','2005-08-17 05:20:45','2006-02-15 22:13:06'),(3020,112,2,11863,'3.99','2005-08-17 13:56:01','2006-02-15 22:13:06'),(3021,112,2,13611,'8.99','2005-08-20 06:20:42','2006-02-15 22:13:06'),(3022,112,2,13879,'2.99','2005-08-20 15:18:10','2006-02-15 22:13:06'),(3023,112,2,14049,'5.99','2005-08-20 22:08:55','2006-02-15 22:13:06'),(3024,112,1,14358,'0.99','2005-08-21 09:14:28','2006-02-15 22:13:06'),(3025,112,2,15304,'4.99','2005-08-22 19:45:57','2006-02-15 22:13:06'),(3026,112,1,15671,'0.99','2005-08-23 09:08:16','2006-02-15 22:13:06'),(3027,112,1,15687,'8.99','2005-08-23 09:46:33','2006-02-15 22:13:06'),(3028,112,1,15756,'2.99','2005-08-23 12:47:05','2006-02-15 22:13:06'),(3029,113,1,510,'0.99','2005-05-28 02:52:14','2006-02-15 22:13:06'),(3030,113,2,776,'0.99','2005-05-29 13:35:35','2006-02-15 22:13:06'),(3031,113,2,2077,'4.99','2005-06-17 16:46:11','2006-02-15 22:13:06'),(3032,113,1,2282,'2.99','2005-06-18 06:48:23','2006-02-15 22:13:06'),(3033,113,1,2783,'2.99','2005-06-19 18:29:10','2006-02-15 22:13:06'),(3034,113,2,3004,'0.99','2005-06-20 10:04:36','2006-02-15 22:13:06'),(3035,113,1,3124,'8.99','2005-06-20 18:28:19','2006-02-15 22:13:06'),(3036,113,1,3162,'6.99','2005-06-20 21:21:15','2006-02-15 22:13:06'),(3037,113,2,3657,'5.99','2005-07-06 07:55:30','2006-02-15 22:13:06'),(3038,113,1,4333,'2.99','2005-07-07 18:31:50','2006-02-15 22:13:06'),(3039,113,2,5189,'2.99','2005-07-09 10:23:21','2006-02-15 22:13:06'),(3040,113,2,5324,'2.99','2005-07-09 16:34:18','2006-02-15 22:13:06'),(3041,113,2,5655,'4.99','2005-07-10 07:31:06','2006-02-15 22:13:06'),(3042,113,1,5774,'5.99','2005-07-10 13:31:56','2006-02-15 22:13:06'),(3043,113,1,6025,'0.99','2005-07-11 02:18:13','2006-02-15 22:13:06'),(3044,113,1,6836,'0.99','2005-07-12 18:58:05','2006-02-15 22:13:06'),(3045,113,2,7468,'5.99','2005-07-27 18:52:27','2006-02-15 22:13:06'),(3046,113,2,7587,'2.99','2005-07-27 23:23:03','2006-02-15 22:13:06'),(3047,113,2,9221,'6.99','2005-07-30 13:20:06','2006-02-15 22:13:06'),(3048,113,2,10181,'4.99','2005-08-01 00:00:44','2006-02-15 22:13:06'),(3049,113,1,10378,'0.99','2005-08-01 06:30:04','2006-02-15 22:13:06'),(3050,113,2,10578,'1.99','2005-08-01 13:48:02','2006-02-15 22:13:06'),(3051,113,2,11655,'7.99','2005-08-17 05:11:07','2006-02-15 22:13:06'),(3052,113,1,11872,'5.99','2005-08-17 14:11:45','2006-02-15 22:13:06'),(3053,113,1,12392,'5.99','2005-08-18 08:57:58','2006-02-15 22:13:06'),(3054,113,2,12817,'3.99','2005-08-19 01:04:35','2006-02-15 22:13:06'),(3055,113,2,13406,'2.99','2005-08-19 22:22:01','2006-02-15 22:13:06'),(3056,113,1,15600,'1.99','2005-08-23 06:31:24','2006-02-15 22:13:06'),(3057,113,1,15770,'2.99','2005-08-23 13:18:16','2006-02-15 22:13:06'),(3058,114,1,205,'4.99','2005-05-26 07:59:37','2006-02-15 22:13:06'),(3059,114,1,255,'4.99','2005-05-26 14:52:15','2006-02-15 22:13:06'),(3060,114,2,889,'2.99','2005-05-30 07:14:53','2006-02-15 22:13:06'),(3061,114,1,2059,'2.99','2005-06-17 15:36:12','2006-02-15 22:13:06'),(3062,114,2,2680,'7.99','2005-06-19 12:13:37','2006-02-15 22:13:07'),(3063,114,1,3094,'2.99','2005-06-20 16:06:51','2006-02-15 22:13:07'),(3064,114,2,3144,'5.99','2005-06-20 20:14:20','2006-02-15 22:13:07'),(3065,114,1,3484,'4.99','2005-07-05 23:23:11','2006-02-15 22:13:07'),(3066,114,1,3924,'2.99','2005-07-06 20:38:02','2006-02-15 22:13:07'),(3067,114,1,4025,'0.99','2005-07-07 02:13:24','2006-02-15 22:13:07'),(3068,114,1,5418,'0.99','2005-07-09 20:41:35','2006-02-15 22:13:07'),(3069,114,2,5624,'4.99','2005-07-10 05:43:16','2006-02-15 22:13:07'),(3070,114,1,5625,'2.99','2005-07-10 05:44:02','2006-02-15 22:13:07'),(3071,114,1,6188,'2.99','2005-07-11 11:31:47','2006-02-15 22:13:07'),(3072,114,1,6754,'4.99','2005-07-12 14:59:24','2006-02-15 22:13:07'),(3073,114,2,7316,'2.99','2005-07-27 13:19:03','2006-02-15 22:13:07'),(3074,114,2,7462,'2.99','2005-07-27 18:47:47','2006-02-15 22:13:07'),(3075,114,2,7565,'2.99','2005-07-27 22:33:59','2006-02-15 22:13:07'),(3076,114,2,7938,'5.99','2005-07-28 12:39:11','2006-02-15 22:13:07'),(3077,114,2,8496,'4.99','2005-07-29 09:05:33','2006-02-15 22:13:07'),(3078,114,1,8590,'10.99','2005-07-29 12:32:20','2006-02-15 22:13:07'),(3079,114,1,9717,'4.99','2005-07-31 08:24:41','2006-02-15 22:13:07'),(3080,114,1,11547,'4.99','2005-08-17 00:59:24','2006-02-15 22:13:07'),(3081,114,2,12326,'0.99','2005-08-18 06:41:59','2006-02-15 22:13:07'),(3082,114,1,12685,'6.99','2005-08-18 19:51:29','2006-02-15 22:13:07'),(3083,114,2,13459,'6.99','2005-08-20 00:45:40','2006-02-15 22:13:07'),(3084,114,2,14158,'5.99','2005-08-21 02:43:20','2006-02-15 22:13:07'),(3085,114,1,14867,'4.99','2005-08-22 03:14:46','2006-02-15 22:13:07'),(3086,114,1,15485,'0.99','2005-08-23 02:04:57','2006-02-15 22:13:07'),(3087,114,1,15528,'2.99','2005-08-23 03:45:40','2006-02-15 22:13:07'),(3088,114,2,15646,'3.99','2005-08-23 08:19:55','2006-02-15 22:13:07'),(3089,114,1,16047,'0.99','2005-08-23 22:42:48','2006-02-15 22:13:07'),(3090,114,2,12506,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:07'),(3091,115,1,915,'0.99','2005-05-30 11:20:27','2006-02-15 22:13:07'),(3092,115,1,983,'0.99','2005-05-30 22:15:51','2006-02-15 22:13:07'),(3093,115,1,1102,'2.99','2005-05-31 14:20:29','2006-02-15 22:13:07'),(3094,115,2,1361,'0.99','2005-06-15 13:37:38','2006-02-15 22:13:07'),(3095,115,2,1515,'2.99','2005-06-15 23:07:50','2006-02-15 22:13:07'),(3096,115,1,3289,'6.99','2005-06-21 06:41:48','2006-02-15 22:13:07'),(3097,115,2,3544,'0.99','2005-07-06 02:06:32','2006-02-15 22:13:07'),(3098,115,1,3624,'0.99','2005-07-06 06:06:27','2006-02-15 22:13:07'),(3099,115,1,4780,'1.99','2005-07-08 16:06:51','2006-02-15 22:13:07'),(3100,115,1,5245,'4.99','2005-07-09 13:24:14','2006-02-15 22:13:07'),(3101,115,1,6080,'2.99','2005-07-11 05:08:11','2006-02-15 22:13:07'),(3102,115,2,6113,'2.99','2005-07-11 07:31:08','2006-02-15 22:13:07'),(3103,115,1,6373,'0.99','2005-07-11 21:35:20','2006-02-15 22:13:07'),(3104,115,1,6574,'5.99','2005-07-12 06:04:22','2006-02-15 22:13:07'),(3105,115,1,6798,'6.99','2005-07-12 16:49:11','2006-02-15 22:13:07'),(3106,115,2,7355,'1.99','2005-07-27 14:45:59','2006-02-15 22:13:07'),(3107,115,2,7465,'4.99','2005-07-27 18:50:30','2006-02-15 22:13:07'),(3108,115,1,7983,'4.99','2005-07-28 14:23:01','2006-02-15 22:13:07'),(3109,115,1,8594,'4.99','2005-07-29 12:42:13','2006-02-15 22:13:07'),(3110,115,2,9578,'0.99','2005-07-31 02:54:31','2006-02-15 22:13:07'),(3111,115,2,10022,'3.99','2005-07-31 18:25:30','2006-02-15 22:13:07'),(3112,115,2,10475,'4.99','2005-08-01 10:03:17','2006-02-15 22:13:07'),(3113,115,2,10647,'2.99','2005-08-01 16:08:46','2006-02-15 22:13:07'),(3114,115,2,10919,'0.99','2005-08-02 02:11:03','2006-02-15 22:13:07'),(3115,115,1,11891,'2.99','2005-08-17 15:11:55','2006-02-15 22:13:07'),(3116,115,2,12366,'0.99','2005-08-18 07:55:14','2006-02-15 22:13:07'),(3117,115,2,13977,'0.99','2005-08-20 19:02:34','2006-02-15 22:13:08'),(3118,115,1,15176,'6.99','2005-08-22 15:30:25','2006-02-15 22:13:08'),(3119,115,2,15452,'0.99','2005-08-23 00:57:12','2006-02-15 22:13:08'),(3120,115,2,13056,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:08'),(3121,116,1,1058,'4.99','2005-05-31 08:04:17','2006-02-15 22:13:08'),(3122,116,2,1332,'0.99','2005-06-15 11:36:01','2006-02-15 22:13:08'),(3123,116,2,1533,'0.99','2005-06-16 00:46:02','2006-02-15 22:13:08'),(3124,116,2,1762,'4.99','2005-06-16 17:50:19','2006-02-15 22:13:08'),(3125,116,2,1913,'4.99','2005-06-17 05:19:47','2006-02-15 22:13:08'),(3126,116,1,2639,'4.99','2005-06-19 09:24:02','2006-02-15 22:13:08'),(3127,116,1,2861,'3.99','2005-06-19 23:21:34','2006-02-15 22:13:08'),(3128,116,2,3908,'6.99','2005-07-06 19:47:26','2006-02-15 22:13:08'),(3129,116,2,3940,'2.99','2005-07-06 21:16:59','2006-02-15 22:13:08'),(3130,116,1,4027,'0.99','2005-07-07 02:19:01','2006-02-15 22:13:08'),(3131,116,2,4737,'4.99','2005-07-08 13:23:53','2006-02-15 22:13:08'),(3132,116,2,5169,'2.99','2005-07-09 09:22:25','2006-02-15 22:13:08'),(3133,116,1,6557,'4.99','2005-07-12 05:12:03','2006-02-15 22:13:08'),(3134,116,1,7238,'0.99','2005-07-27 10:13:41','2006-02-15 22:13:08'),(3135,116,2,7763,'5.99','2005-07-28 06:35:16','2006-02-15 22:13:08'),(3136,116,2,9245,'6.99','2005-07-30 14:07:50','2006-02-15 22:13:08'),(3137,116,1,9562,'3.99','2005-07-31 02:23:20','2006-02-15 22:13:08'),(3138,116,2,10250,'1.99','2005-08-01 02:38:42','2006-02-15 22:13:08'),(3139,116,1,10801,'1.99','2005-08-01 22:09:35','2006-02-15 22:13:08'),(3140,116,2,11016,'4.99','2005-08-02 05:19:13','2006-02-15 22:13:08'),(3141,116,2,12376,'2.99','2005-08-18 08:20:29','2006-02-15 22:13:08'),(3142,116,2,13146,'7.99','2005-08-19 12:54:42','2006-02-15 22:13:08'),(3143,116,1,13369,'0.99','2005-08-19 21:19:47','2006-02-15 22:13:08'),(3144,116,1,13474,'0.99','2005-08-20 01:04:32','2006-02-15 22:13:08'),(3145,116,1,13775,'6.99','2005-08-20 11:56:30','2006-02-15 22:13:08'),(3146,116,2,14763,'11.99','2005-08-21 23:34:00','2006-02-15 22:13:08'),(3147,116,1,14907,'2.99','2005-08-22 04:44:09','2006-02-15 22:13:08'),(3148,117,1,700,'0.99','2005-05-29 02:18:54','2006-02-15 22:13:08'),(3149,117,2,1114,'0.99','2005-05-31 16:00:33','2006-02-15 22:13:08'),(3150,117,1,1755,'2.99','2005-06-16 17:18:44','2006-02-15 22:13:08'),(3151,117,2,3218,'2.99','2005-06-21 01:38:09','2006-02-15 22:13:08'),(3152,117,2,5506,'5.99','2005-07-10 00:45:48','2006-02-15 22:13:08'),(3153,117,1,5673,'0.99','2005-07-10 08:21:54','2006-02-15 22:13:08'),(3154,117,1,6093,'9.99','2005-07-11 05:52:50','2006-02-15 22:13:08'),(3155,117,1,6449,'6.99','2005-07-12 00:48:58','2006-02-15 22:13:08'),(3156,117,1,8687,'2.99','2005-07-29 16:19:17','2006-02-15 22:13:08'),(3157,117,2,10556,'2.99','2005-08-01 12:58:42','2006-02-15 22:13:08'),(3158,117,1,10558,'4.99','2005-08-01 13:00:20','2006-02-15 22:13:08'),(3159,117,2,11467,'3.99','2005-08-02 21:47:07','2006-02-15 22:13:08'),(3160,117,1,12143,'2.99','2005-08-18 00:06:26','2006-02-15 22:13:08'),(3161,117,1,12337,'2.99','2005-08-18 07:02:24','2006-02-15 22:13:08'),(3162,117,1,12575,'6.99','2005-08-18 15:37:42','2006-02-15 22:13:08'),(3163,117,1,12618,'4.99','2005-08-18 17:24:02','2006-02-15 22:13:08'),(3164,117,1,14784,'0.99','2005-08-22 00:23:13','2006-02-15 22:13:08'),(3165,117,2,14854,'2.99','2005-08-22 02:26:47','2006-02-15 22:13:08'),(3166,117,1,15432,'2.99','2005-08-23 00:26:52','2006-02-15 22:13:09'),(3167,118,2,351,'5.99','2005-05-27 05:39:03','2006-02-15 22:13:09'),(3168,118,2,1766,'4.99','2005-06-16 17:59:37','2006-02-15 22:13:09'),(3169,118,2,2217,'0.99','2005-06-18 03:12:29','2006-02-15 22:13:09'),(3170,118,1,3263,'4.99','2005-06-21 04:15:52','2006-02-15 22:13:09'),(3171,118,1,4966,'0.99','2005-07-08 23:47:25','2006-02-15 22:13:09'),(3172,118,1,5829,'1.99','2005-07-10 16:29:41','2006-02-15 22:13:09'),(3173,118,1,6377,'0.99','2005-07-11 21:41:16','2006-02-15 22:13:09'),(3174,118,1,6507,'1.99','2005-07-12 03:33:12','2006-02-15 22:13:09'),(3175,118,1,7196,'2.99','2005-07-27 08:49:08','2006-02-15 22:13:09'),(3176,118,1,7850,'4.99','2005-07-28 09:31:13','2006-02-15 22:13:09'),(3177,118,2,7956,'4.99','2005-07-28 13:32:17','2006-02-15 22:13:09'),(3178,118,1,8314,'3.99','2005-07-29 03:35:04','2006-02-15 22:13:09'),(3179,118,2,8760,'7.99','2005-07-29 19:22:40','2006-02-15 22:13:09'),(3180,118,1,8881,'4.99','2005-07-30 00:22:31','2006-02-15 22:13:09'),(3181,118,2,10045,'1.99','2005-07-31 19:04:35','2006-02-15 22:13:09'),(3182,118,2,12538,'2.99','2005-08-18 14:09:09','2006-02-15 22:13:09'),(3183,118,2,13193,'6.99','2005-08-19 14:33:45','2006-02-15 22:13:09'),(3184,118,2,14394,'5.99','2005-08-21 10:23:10','2006-02-15 22:13:09'),(3185,118,2,14595,'7.99','2005-08-21 17:35:17','2006-02-15 22:13:09'),(3186,118,1,14924,'2.99','2005-08-22 05:15:17','2006-02-15 22:13:09'),(3187,118,1,15731,'0.99','2005-08-23 11:33:25','2006-02-15 22:13:09'),(3188,119,2,67,'0.99','2005-05-25 09:41:01','2006-02-15 22:13:09'),(3189,119,1,235,'5.99','2005-05-26 11:51:09','2006-02-15 22:13:09'),(3190,119,2,540,'6.99','2005-05-28 06:40:25','2006-02-15 22:13:09'),(3191,119,1,1179,'7.99','2005-06-15 00:36:50','2006-02-15 22:13:09'),(3192,119,2,2009,'2.99','2005-06-17 11:48:31','2006-02-15 22:13:09'),(3193,119,2,3388,'5.99','2005-06-21 14:34:51','2006-02-15 22:13:09'),(3194,119,2,4840,'8.99','2005-07-08 18:18:16','2006-02-15 22:13:09'),(3195,119,1,5176,'5.99','2005-07-09 09:39:31','2006-02-15 22:13:09'),(3196,119,1,5268,'0.99','2005-07-09 14:22:43','2006-02-15 22:13:09'),(3197,119,1,6079,'7.99','2005-07-11 05:07:14','2006-02-15 22:13:09'),(3198,119,2,6330,'0.99','2005-07-11 19:15:42','2006-02-15 22:13:09'),(3199,119,2,8140,'4.99','2005-07-28 20:17:50','2006-02-15 22:13:09'),(3200,119,1,8183,'5.99','2005-07-28 22:21:07','2006-02-15 22:13:09'),(3201,119,1,8304,'4.99','2005-07-29 03:08:30','2006-02-15 22:13:09'),(3202,119,2,9028,'2.99','2005-07-30 06:00:35','2006-02-15 22:13:09'),(3203,119,1,10101,'0.99','2005-07-31 20:47:29','2006-02-15 22:13:09'),(3204,119,1,10366,'3.99','2005-08-01 06:09:37','2006-02-15 22:13:09'),(3205,119,2,10552,'2.99','2005-08-01 12:49:44','2006-02-15 22:13:09'),(3206,119,1,10681,'4.99','2005-08-01 17:30:35','2006-02-15 22:13:09'),(3207,119,2,11377,'2.99','2005-08-02 18:16:47','2006-02-15 22:13:09'),(3208,119,1,11520,'5.99','2005-08-17 00:04:28','2006-02-15 22:13:09'),(3209,119,2,12576,'2.99','2005-08-18 15:38:31','2006-02-15 22:13:10'),(3210,119,2,12603,'3.99','2005-08-18 16:56:20','2006-02-15 22:13:10'),(3211,119,2,12842,'6.99','2005-08-19 01:57:21','2006-02-15 22:13:10'),(3212,119,1,13581,'4.99','2005-08-20 05:26:15','2006-02-15 22:13:10'),(3213,119,2,14349,'3.99','2005-08-21 08:54:53','2006-02-15 22:13:10'),(3214,119,2,14382,'2.99','2005-08-21 10:01:03','2006-02-15 22:13:10'),(3215,119,2,14643,'6.99','2005-08-21 19:11:58','2006-02-15 22:13:10'),(3216,119,2,14659,'0.99','2005-08-21 19:42:36','2006-02-15 22:13:10'),(3217,119,1,15111,'4.99','2005-08-22 12:21:43','2006-02-15 22:13:10'),(3218,119,2,15131,'3.99','2005-08-22 13:06:26','2006-02-15 22:13:10'),(3219,119,2,15171,'6.99','2005-08-22 15:23:59','2006-02-15 22:13:10'),(3220,119,1,15844,'2.99','2005-08-23 15:38:12','2006-02-15 22:13:10'),(3221,119,2,16028,'3.99','2005-08-23 21:52:56','2006-02-15 22:13:10'),(3222,120,2,68,'7.99','2005-05-25 09:47:31','2006-02-15 22:13:10'),(3223,120,2,532,'0.99','2005-05-28 05:36:58','2006-02-15 22:13:10'),(3224,120,1,1374,'3.99','2005-06-15 14:49:54','2006-02-15 22:13:10'),(3225,120,1,1820,'4.99','2005-06-16 21:34:50','2006-02-15 22:13:10'),(3226,120,2,1932,'2.99','2005-06-17 06:54:41','2006-02-15 22:13:10'),(3227,120,1,2169,'4.99','2005-06-17 23:57:23','2006-02-15 22:13:10'),(3228,120,1,2803,'9.99','2005-06-19 19:18:27','2006-02-15 22:13:10'),(3229,120,1,3133,'2.99','2005-06-20 19:18:32','2006-02-15 22:13:10'),(3230,120,1,4001,'5.99','2005-07-07 00:07:00','2006-02-15 22:13:10'),(3231,120,2,4272,'3.99','2005-07-07 14:39:20','2006-02-15 22:13:10'),(3232,120,2,4342,'0.99','2005-07-07 18:47:03','2006-02-15 22:13:10'),(3233,120,2,4666,'9.99','2005-07-08 10:05:02','2006-02-15 22:13:10'),(3234,120,1,4942,'1.99','2005-07-08 22:42:47','2006-02-15 22:13:10'),(3235,120,2,5288,'1.99','2005-07-09 15:13:07','2006-02-15 22:13:10'),(3236,120,2,6503,'0.99','2005-07-12 03:18:07','2006-02-15 22:13:10'),(3237,120,1,6989,'4.99','2005-07-27 01:00:34','2006-02-15 22:13:10'),(3238,120,2,8046,'0.99','2005-07-28 16:49:41','2006-02-15 22:13:10'),(3239,120,2,8756,'1.99','2005-07-29 19:18:57','2006-02-15 22:13:10'),(3240,120,1,8998,'6.99','2005-07-30 04:54:14','2006-02-15 22:13:10'),(3241,120,2,9907,'6.99','2005-07-31 14:39:50','2006-02-15 22:13:10'),(3242,120,2,10161,'0.99','2005-07-31 23:09:41','2006-02-15 22:13:10'),(3243,120,2,10696,'4.99','2005-08-01 18:18:13','2006-02-15 22:13:10'),(3244,120,1,10940,'3.99','2005-08-02 03:08:29','2006-02-15 22:13:10'),(3245,120,2,11133,'0.99','2005-08-02 09:15:45','2006-02-15 22:13:10'),(3246,120,2,13167,'2.99','2005-08-19 13:36:41','2006-02-15 22:13:10'),(3247,120,2,13375,'7.99','2005-08-19 21:31:31','2006-02-15 22:13:10'),(3248,120,1,14001,'2.99','2005-08-20 20:07:15','2006-02-15 22:13:10'),(3249,120,1,14153,'4.99','2005-08-21 02:24:33','2006-02-15 22:13:10'),(3250,120,1,14246,'4.99','2005-08-21 05:34:09','2006-02-15 22:13:10'),(3251,120,2,14460,'9.99','2005-08-21 12:48:48','2006-02-15 22:13:10'),(3252,120,2,14969,'6.99','2005-08-22 06:49:15','2006-02-15 22:13:10'),(3253,120,1,15780,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:10'),(3254,121,1,217,'4.99','2005-05-26 09:24:26','2006-02-15 22:13:10'),(3255,121,1,1634,'2.99','2005-06-16 08:16:05','2006-02-15 22:13:10'),(3256,121,1,1833,'1.99','2005-06-16 22:45:03','2006-02-15 22:13:10'),(3257,121,2,5670,'0.99','2005-07-10 08:14:52','2006-02-15 22:13:10'),(3258,121,2,6780,'4.99','2005-07-12 16:18:12','2006-02-15 22:13:11'),(3259,121,2,7114,'0.99','2005-07-27 05:42:13','2006-02-15 22:13:11'),(3260,121,1,7185,'0.99','2005-07-27 08:23:54','2006-02-15 22:13:11'),(3261,121,2,7298,'2.99','2005-07-27 12:45:14','2006-02-15 22:13:11'),(3262,121,1,8370,'6.99','2005-07-29 05:16:21','2006-02-15 22:13:11'),(3263,121,2,8788,'1.99','2005-07-29 20:46:44','2006-02-15 22:13:11'),(3264,121,2,8875,'2.99','2005-07-30 00:15:09','2006-02-15 22:13:11'),(3265,121,2,8969,'8.99','2005-07-30 04:00:19','2006-02-15 22:13:11'),(3266,121,2,10457,'5.99','2005-08-01 09:17:34','2006-02-15 22:13:11'),(3267,121,2,11720,'8.99','2005-08-17 07:46:54','2006-02-15 22:13:11'),(3268,121,2,12242,'1.99','2005-08-18 03:37:31','2006-02-15 22:13:11'),(3269,121,2,12428,'3.99','2005-08-18 10:24:21','2006-02-15 22:13:11'),(3270,121,2,12734,'1.99','2005-08-18 22:04:52','2006-02-15 22:13:11'),(3271,121,1,12881,'5.99','2005-08-19 03:28:13','2006-02-15 22:13:11'),(3272,121,2,12892,'0.99','2005-08-19 03:46:34','2006-02-15 22:13:11'),(3273,121,1,14138,'7.99','2005-08-21 01:59:37','2006-02-15 22:13:11'),(3274,121,1,14177,'4.99','2005-08-21 03:11:33','2006-02-15 22:13:11'),(3275,121,2,14412,'9.99','2005-08-21 11:02:09','2006-02-15 22:13:11'),(3276,121,1,14464,'2.99','2005-08-21 12:52:54','2006-02-15 22:13:11'),(3277,121,2,15114,'7.99','2005-08-22 12:24:55','2006-02-15 22:13:11'),(3278,121,1,15369,'0.99','2005-08-22 21:58:06','2006-02-15 22:13:11'),(3279,121,1,16041,'2.99','2005-08-23 22:20:26','2006-02-15 22:13:11'),(3280,122,2,853,'0.99','2005-05-30 01:43:31','2006-02-15 22:13:11'),(3281,122,2,1135,'4.99','2005-05-31 19:15:11','2006-02-15 22:13:11'),(3282,122,1,1211,'0.99','2005-06-15 03:01:20','2006-02-15 22:13:11'),(3283,122,2,1442,'7.99','2005-06-15 18:55:34','2006-02-15 22:13:11'),(3284,122,2,2240,'3.99','2005-06-18 04:28:27','2006-02-15 22:13:11'),(3285,122,1,2253,'0.99','2005-06-18 05:11:43','2006-02-15 22:13:11'),(3286,122,1,2482,'4.99','2005-06-18 21:10:44','2006-02-15 22:13:11'),(3287,122,2,2595,'4.99','2005-06-19 05:43:55','2006-02-15 22:13:11'),(3288,122,2,2834,'1.99','2005-06-19 21:41:46','2006-02-15 22:13:11'),(3289,122,1,3778,'2.99','2005-07-06 13:44:48','2006-02-15 22:13:11'),(3290,122,2,3986,'4.99','2005-07-06 23:25:13','2006-02-15 22:13:11'),(3291,122,1,4239,'7.99','2005-07-07 13:23:17','2006-02-15 22:13:11'),(3292,122,1,4568,'4.99','2005-07-08 05:23:59','2006-02-15 22:13:11'),(3293,122,2,5235,'6.99','2005-07-09 12:54:25','2006-02-15 22:13:11'),(3294,122,2,6231,'0.99','2005-07-11 14:02:36','2006-02-15 22:13:11'),(3295,122,1,6427,'0.99','2005-07-11 23:57:34','2006-02-15 22:13:11'),(3296,122,1,6436,'0.99','2005-07-12 00:18:42','2006-02-15 22:13:11'),(3297,122,2,6974,'7.99','2005-07-27 00:39:16','2006-02-15 22:13:11'),(3298,122,1,7267,'2.99','2005-07-27 11:22:55','2006-02-15 22:13:11'),(3299,122,2,7950,'4.99','2005-07-28 13:21:00','2006-02-15 22:13:11'),(3300,122,1,8077,'2.99','2005-07-28 17:54:35','2006-02-15 22:13:11'),(3301,122,2,8177,'0.99','2005-07-28 21:43:54','2006-02-15 22:13:11'),(3302,122,1,8772,'5.99','2005-07-29 19:55:25','2006-02-15 22:13:11'),(3303,122,2,9910,'4.99','2005-07-31 14:47:57','2006-02-15 22:13:11'),(3304,122,1,10626,'1.99','2005-08-01 15:32:41','2006-02-15 22:13:11'),(3305,122,2,11044,'3.99','2005-08-02 06:05:27','2006-02-15 22:13:12'),(3306,122,2,11197,'2.99','2005-08-02 11:45:07','2006-02-15 22:13:12'),(3307,122,2,12476,'4.99','2005-08-18 12:22:40','2006-02-15 22:13:12'),(3308,122,2,12711,'4.99','2005-08-18 21:03:32','2006-02-15 22:13:12'),(3309,122,1,13171,'2.99','2005-08-19 13:48:54','2006-02-15 22:13:12'),(3310,122,1,13812,'4.99','2005-08-20 13:01:43','2006-02-15 22:13:12'),(3311,122,2,14666,'5.99','2005-08-21 19:51:09','2006-02-15 22:13:12'),(3312,123,1,992,'2.99','2005-05-30 23:47:56','2006-02-15 22:13:12'),(3313,123,2,1490,'4.99','2005-06-15 21:42:17','2006-02-15 22:13:12'),(3314,123,1,1751,'0.99','2005-06-16 17:00:14','2006-02-15 22:13:12'),(3315,123,2,1775,'4.99','2005-06-16 18:28:19','2006-02-15 22:13:12'),(3316,123,2,1951,'0.99','2005-06-17 08:30:35','2006-02-15 22:13:12'),(3317,123,1,2594,'2.99','2005-06-19 05:43:43','2006-02-15 22:13:12'),(3318,123,1,4442,'3.99','2005-07-07 23:05:30','2006-02-15 22:13:12'),(3319,123,1,4860,'8.99','2005-07-08 18:54:07','2006-02-15 22:13:12'),(3320,123,2,7535,'4.99','2005-07-27 21:32:39','2006-02-15 22:13:12'),(3321,123,1,7727,'2.99','2005-07-28 04:52:43','2006-02-15 22:13:12'),(3322,123,2,7768,'0.99','2005-07-28 06:44:03','2006-02-15 22:13:12'),(3323,123,1,7852,'2.99','2005-07-28 09:34:29','2006-02-15 22:13:12'),(3324,123,1,7969,'5.99','2005-07-28 13:57:37','2006-02-15 22:13:12'),(3325,123,2,8699,'4.99','2005-07-29 16:53:00','2006-02-15 22:13:12'),(3326,123,2,9529,'4.99','2005-07-31 01:05:26','2006-02-15 22:13:12'),(3327,123,1,10066,'4.99','2005-07-31 19:30:01','2006-02-15 22:13:12'),(3328,123,2,10295,'8.99','2005-08-01 03:53:49','2006-02-15 22:13:12'),(3329,123,1,12360,'2.99','2005-08-18 07:46:35','2006-02-15 22:13:12'),(3330,123,1,12402,'3.99','2005-08-18 09:27:34','2006-02-15 22:13:12'),(3331,123,1,13668,'2.99','2005-08-20 08:26:06','2006-02-15 22:13:12'),(3332,123,2,15152,'7.99','2005-08-22 14:25:21','2006-02-15 22:13:12'),(3333,123,2,15525,'4.99','2005-08-23 03:43:32','2006-02-15 22:13:12'),(3334,123,1,15621,'1.99','2005-08-23 07:13:43','2006-02-15 22:13:12'),(3335,123,2,15787,'2.99','2005-08-23 13:51:57','2006-02-15 22:13:12'),(3336,124,1,775,'0.99','2005-05-29 13:23:26','2006-02-15 22:13:12'),(3337,124,2,1039,'4.99','2005-05-31 05:32:29','2006-02-15 22:13:12'),(3338,124,2,1057,'3.99','2005-05-31 07:58:06','2006-02-15 22:13:12'),(3339,124,2,1130,'5.99','2005-05-31 18:13:57','2006-02-15 22:13:12'),(3340,124,2,2336,'1.99','2005-06-18 11:00:05','2006-02-15 22:13:12'),(3341,124,1,4341,'7.99','2005-07-07 18:44:23','2006-02-15 22:13:12'),(3342,124,2,4709,'2.99','2005-07-08 12:04:34','2006-02-15 22:13:12'),(3343,124,1,5566,'2.99','2005-07-10 03:30:17','2006-02-15 22:13:12'),(3344,124,1,6411,'2.99','2005-07-11 23:10:50','2006-02-15 22:13:12'),(3345,124,1,7519,'6.99','2005-07-27 21:01:41','2006-02-15 22:13:12'),(3346,124,2,7700,'8.99','2005-07-28 03:54:14','2006-02-15 22:13:12'),(3347,124,2,8524,'0.99','2005-07-29 10:20:07','2006-02-15 22:13:12'),(3348,124,1,9986,'3.99','2005-07-31 17:16:50','2006-02-15 22:13:12'),(3349,124,2,11493,'5.99','2005-08-02 22:47:00','2006-02-15 22:13:12'),(3350,124,1,12835,'4.99','2005-08-19 01:47:45','2006-02-15 22:13:12'),(3351,124,2,14737,'0.99','2005-08-21 22:27:11','2006-02-15 22:13:13'),(3352,124,2,15266,'4.99','2005-08-22 18:37:24','2006-02-15 22:13:13'),(3353,124,2,16023,'0.99','2005-08-23 21:45:02','2006-02-15 22:13:13'),(3354,125,2,185,'3.99','2005-05-26 05:30:03','2006-02-15 22:13:13'),(3355,125,1,1481,'2.99','2005-06-15 21:17:58','2006-02-15 22:13:13'),(3356,125,1,2355,'3.99','2005-06-18 12:57:06','2006-02-15 22:13:13'),(3357,125,1,2826,'7.99','2005-06-19 20:41:35','2006-02-15 22:13:13'),(3358,125,1,3118,'4.99','2005-06-20 18:05:57','2006-02-15 22:13:13'),(3359,125,1,3617,'4.99','2005-07-06 05:58:06','2006-02-15 22:13:13'),(3360,125,1,5200,'2.99','2005-07-09 10:52:09','2006-02-15 22:13:13'),(3361,125,2,5523,'7.99','2005-07-10 01:47:55','2006-02-15 22:13:13'),(3362,125,1,6055,'0.99','2005-07-11 03:59:08','2006-02-15 22:13:13'),(3363,125,2,6268,'6.99','2005-07-11 15:55:34','2006-02-15 22:13:13'),(3364,125,1,7323,'4.99','2005-07-27 13:39:40','2006-02-15 22:13:13'),(3365,125,2,7879,'0.99','2005-07-28 10:27:46','2006-02-15 22:13:13'),(3366,125,2,7922,'0.99','2005-07-28 12:05:25','2006-02-15 22:13:13'),(3367,125,2,8375,'2.99','2005-07-29 05:25:30','2006-02-15 22:13:13'),(3368,125,1,8433,'2.99','2005-07-29 07:19:16','2006-02-15 22:13:13'),(3369,125,1,8832,'4.99','2005-07-29 22:37:49','2006-02-15 22:13:13'),(3370,125,1,9129,'9.99','2005-07-30 09:51:21','2006-02-15 22:13:13'),(3371,125,1,9496,'4.99','2005-07-30 23:55:20','2006-02-15 22:13:13'),(3372,125,2,9504,'0.99','2005-07-31 00:09:07','2006-02-15 22:13:13'),(3373,125,1,9722,'4.99','2005-07-31 08:29:48','2006-02-15 22:13:13'),(3374,125,2,9734,'2.99','2005-07-31 08:57:45','2006-02-15 22:13:13'),(3375,125,1,10583,'2.99','2005-08-01 13:54:35','2006-02-15 22:13:13'),(3376,125,1,10699,'2.99','2005-08-01 18:24:51','2006-02-15 22:13:13'),(3377,125,2,11279,'7.99','2005-08-02 14:30:03','2006-02-15 22:13:13'),(3378,125,1,11806,'4.99','2005-08-17 11:49:28','2006-02-15 22:13:13'),(3379,125,1,11832,'4.99','2005-08-17 12:55:31','2006-02-15 22:13:13'),(3380,125,1,11999,'0.99','2005-08-17 18:47:07','2006-02-15 22:13:13'),(3381,125,1,12075,'4.99','2005-08-17 21:54:55','2006-02-15 22:13:13'),(3382,125,2,12262,'2.99','2005-08-18 04:16:15','2006-02-15 22:13:13'),(3383,125,2,13441,'6.99','2005-08-19 23:48:23','2006-02-15 22:13:13'),(3384,125,2,14456,'2.99','2005-08-21 12:38:09','2006-02-15 22:13:13'),(3385,125,1,15055,'2.99','2005-08-22 10:14:39','2006-02-15 22:13:13'),(3386,126,1,9,'4.99','2005-05-25 00:00:40','2006-02-15 22:13:13'),(3387,126,1,752,'4.99','2005-05-29 10:14:15','2006-02-15 22:13:13'),(3388,126,2,1054,'4.99','2005-05-31 07:33:25','2006-02-15 22:13:13'),(3389,126,1,3450,'2.99','2005-06-21 21:01:57','2006-02-15 22:13:13'),(3390,126,2,3502,'5.99','2005-07-06 00:15:06','2006-02-15 22:13:13'),(3391,126,1,3725,'4.99','2005-07-06 11:15:04','2006-02-15 22:13:13'),(3392,126,1,3804,'7.99','2005-07-06 15:08:08','2006-02-15 22:13:13'),(3393,126,1,4691,'0.99','2005-07-08 11:04:53','2006-02-15 22:13:13'),(3394,126,2,4730,'2.99','2005-07-08 12:59:49','2006-02-15 22:13:13'),(3395,126,2,5137,'0.99','2005-07-09 08:00:34','2006-02-15 22:13:13'),(3396,126,1,5865,'0.99','2005-07-10 18:31:05','2006-02-15 22:13:13'),(3397,126,1,6747,'0.99','2005-07-12 14:33:21','2006-02-15 22:13:14'),(3398,126,2,6755,'6.99','2005-07-12 15:07:49','2006-02-15 22:13:14'),(3399,126,1,7962,'0.99','2005-07-28 13:48:09','2006-02-15 22:13:14'),(3400,126,1,8091,'2.99','2005-07-28 18:27:29','2006-02-15 22:13:14'),(3401,126,1,9492,'6.99','2005-07-30 23:52:21','2006-02-15 22:13:14'),(3402,126,2,10032,'4.99','2005-07-31 18:41:55','2006-02-15 22:13:14'),(3403,126,1,11196,'9.99','2005-08-02 11:42:40','2006-02-15 22:13:14'),(3404,126,2,11613,'4.99','2005-08-17 03:50:33','2006-02-15 22:13:14'),(3405,126,1,11779,'3.99','2005-08-17 10:31:58','2006-02-15 22:13:14'),(3406,126,1,11801,'0.99','2005-08-17 11:30:11','2006-02-15 22:13:14'),(3407,126,2,12991,'2.99','2005-08-19 07:21:24','2006-02-15 22:13:14'),(3408,126,2,13015,'7.99','2005-08-19 07:56:51','2006-02-15 22:13:14'),(3409,126,2,13177,'0.99','2005-08-19 13:56:58','2006-02-15 22:13:14'),(3410,126,2,14477,'2.99','2005-08-21 13:32:38','2006-02-15 22:13:14'),(3411,126,2,14577,'2.99','2005-08-21 16:52:29','2006-02-15 22:13:14'),(3412,126,2,15741,'4.99','2005-08-23 12:10:54','2006-02-15 22:13:14'),(3413,126,1,16007,'7.99','2005-08-23 21:02:43','2006-02-15 22:13:14'),(3414,127,1,452,'0.99','2005-05-27 19:30:33','2006-02-15 22:13:14'),(3415,127,1,708,'0.99','2005-05-29 03:23:47','2006-02-15 22:13:14'),(3416,127,1,1293,'4.99','2005-06-15 09:06:24','2006-02-15 22:13:14'),(3417,127,2,1803,'2.99','2005-06-16 20:32:47','2006-02-15 22:13:14'),(3418,127,2,2412,'3.99','2005-06-18 16:58:58','2006-02-15 22:13:14'),(3419,127,1,4652,'5.99','2005-07-08 09:47:51','2006-02-15 22:13:14'),(3420,127,2,4811,'5.99','2005-07-08 17:04:24','2006-02-15 22:13:14'),(3421,127,2,5499,'2.99','2005-07-10 00:27:45','2006-02-15 22:13:14'),(3422,127,2,5983,'2.99','2005-07-11 00:34:11','2006-02-15 22:13:14'),(3423,127,1,7912,'4.99','2005-07-28 11:46:58','2006-02-15 22:13:14'),(3424,127,2,8209,'6.99','2005-07-28 23:29:28','2006-02-15 22:13:14'),(3425,127,1,9859,'6.99','2005-07-31 13:02:55','2006-02-15 22:13:14'),(3426,127,1,10197,'2.99','2005-08-01 00:35:25','2006-02-15 22:13:14'),(3427,127,1,10787,'10.99','2005-08-01 21:35:01','2006-02-15 22:13:14'),(3428,127,1,10973,'7.99','2005-08-02 04:09:42','2006-02-15 22:13:14'),(3429,127,1,11235,'0.99','2005-08-02 13:13:21','2006-02-15 22:13:14'),(3430,127,2,12060,'4.99','2005-08-17 21:11:57','2006-02-15 22:13:14'),(3431,127,2,12820,'2.99','2005-08-19 01:05:08','2006-02-15 22:13:14'),(3432,127,2,13043,'4.99','2005-08-19 09:07:13','2006-02-15 22:13:14'),(3433,127,1,13091,'2.99','2005-08-19 10:40:10','2006-02-15 22:13:14'),(3434,127,2,14030,'2.99','2005-08-20 21:23:54','2006-02-15 22:13:14'),(3435,127,1,14189,'2.99','2005-08-21 03:32:17','2006-02-15 22:13:14'),(3436,127,1,15463,'5.99','2005-08-23 01:15:07','2006-02-15 22:13:14'),(3437,127,2,15736,'5.99','2005-08-23 11:40:30','2006-02-15 22:13:14'),(3438,128,2,888,'5.99','2005-05-30 07:13:14','2006-02-15 22:13:14'),(3439,128,2,1131,'2.99','2005-05-31 18:44:19','2006-02-15 22:13:14'),(3440,128,2,2519,'7.99','2005-06-19 00:19:21','2006-02-15 22:13:14'),(3441,128,1,2565,'0.99','2005-06-19 03:44:03','2006-02-15 22:13:14'),(3442,128,1,3751,'0.99','2005-07-06 12:23:41','2006-02-15 22:13:14'),(3443,128,2,3995,'5.99','2005-07-06 23:43:03','2006-02-15 22:13:14'),(3444,128,1,5270,'2.99','2005-07-09 14:23:46','2006-02-15 22:13:14'),(3445,128,1,5647,'4.99','2005-07-10 07:08:40','2006-02-15 22:13:15'),(3446,128,2,5997,'4.99','2005-07-11 01:19:50','2006-02-15 22:13:15'),(3447,128,2,6186,'2.99','2005-07-11 11:26:41','2006-02-15 22:13:15'),(3448,128,2,6481,'6.99','2005-07-12 01:50:15','2006-02-15 22:13:15'),(3449,128,2,6687,'2.99','2005-07-12 12:19:23','2006-02-15 22:13:15'),(3450,128,2,7582,'4.99','2005-07-27 23:15:14','2006-02-15 22:13:15'),(3451,128,2,8415,'2.99','2005-07-29 06:52:27','2006-02-15 22:13:15'),(3452,128,2,9215,'5.99','2005-07-30 13:11:11','2006-02-15 22:13:15'),(3453,128,2,9234,'2.99','2005-07-30 13:45:54','2006-02-15 22:13:15'),(3454,128,1,9433,'5.99','2005-07-30 21:28:17','2006-02-15 22:13:15'),(3455,128,2,9858,'2.99','2005-07-31 13:02:07','2006-02-15 22:13:15'),(3456,128,1,9952,'3.99','2005-07-31 15:52:37','2006-02-15 22:13:15'),(3457,128,1,10011,'2.99','2005-07-31 18:02:41','2006-02-15 22:13:15'),(3458,128,1,10394,'2.99','2005-08-01 06:58:17','2006-02-15 22:13:15'),(3459,128,2,12731,'2.99','2005-08-18 21:55:38','2006-02-15 22:13:15'),(3460,128,2,12843,'2.99','2005-08-19 01:58:54','2006-02-15 22:13:15'),(3461,128,2,12910,'0.99','2005-08-19 04:23:13','2006-02-15 22:13:15'),(3462,128,2,13027,'0.99','2005-08-19 08:25:16','2006-02-15 22:13:15'),(3463,128,2,13181,'5.99','2005-08-19 14:00:56','2006-02-15 22:13:15'),(3464,128,1,13509,'0.99','2005-08-20 02:14:16','2006-02-15 22:13:15'),(3465,128,2,13964,'2.99','2005-08-20 18:24:26','2006-02-15 22:13:15'),(3466,128,2,14157,'0.99','2005-08-21 02:43:15','2006-02-15 22:13:15'),(3467,128,1,14925,'8.99','2005-08-22 05:16:16','2006-02-15 22:13:15'),(3468,128,1,15220,'3.99','2005-08-22 17:02:23','2006-02-15 22:13:15'),(3469,128,1,15835,'8.99','2005-08-23 15:25:27','2006-02-15 22:13:15'),(3470,129,2,1732,'0.99','2005-06-16 15:34:41','2006-02-15 22:13:15'),(3471,129,1,2727,'3.99','2005-06-19 15:02:39','2006-02-15 22:13:15'),(3472,129,2,2768,'0.99','2005-06-19 17:46:52','2006-02-15 22:13:15'),(3473,129,2,2795,'4.99','2005-06-19 18:58:53','2006-02-15 22:13:15'),(3474,129,1,3183,'4.99','2005-06-20 22:55:55','2006-02-15 22:13:15'),(3475,129,1,3219,'3.99','2005-06-21 01:43:26','2006-02-15 22:13:15'),(3476,129,1,3689,'0.99','2005-07-06 09:43:01','2006-02-15 22:13:15'),(3477,129,2,3900,'4.99','2005-07-06 19:21:28','2006-02-15 22:13:15'),(3478,129,2,3936,'0.99','2005-07-06 21:15:03','2006-02-15 22:13:15'),(3479,129,2,4256,'2.99','2005-07-07 14:14:36','2006-02-15 22:13:15'),(3480,129,1,4602,'0.99','2005-07-08 06:52:40','2006-02-15 22:13:15'),(3481,129,1,4896,'2.99','2005-07-08 20:23:15','2006-02-15 22:13:15'),(3482,129,1,4996,'0.99','2005-07-09 00:59:46','2006-02-15 22:13:15'),(3483,129,1,5127,'0.99','2005-07-09 07:25:47','2006-02-15 22:13:15'),(3484,129,2,5350,'4.99','2005-07-09 17:39:30','2006-02-15 22:13:15'),(3485,129,1,8339,'4.99','2005-07-29 04:41:13','2006-02-15 22:13:15'),(3486,129,1,8345,'2.99','2005-07-29 04:47:37','2006-02-15 22:13:15'),(3487,129,2,9823,'4.99','2005-07-31 11:49:00','2006-02-15 22:13:15'),(3488,129,1,9983,'7.99','2005-07-31 17:09:36','2006-02-15 22:13:15'),(3489,129,1,10024,'7.99','2005-07-31 18:26:36','2006-02-15 22:13:15'),(3490,129,2,10167,'5.99','2005-07-31 23:24:31','2006-02-15 22:13:15'),(3491,129,2,10395,'2.99','2005-08-01 07:08:22','2006-02-15 22:13:15'),(3492,129,1,10468,'0.99','2005-08-01 09:48:29','2006-02-15 22:13:15'),(3493,129,1,10483,'2.99','2005-08-01 10:19:45','2006-02-15 22:13:16'),(3494,129,2,10550,'2.99','2005-08-01 12:46:52','2006-02-15 22:13:16'),(3495,129,2,10816,'4.99','2005-08-01 22:48:57','2006-02-15 22:13:16'),(3496,129,2,12612,'3.99','2005-08-18 17:10:05','2006-02-15 22:13:16'),(3497,129,2,12728,'4.99','2005-08-18 21:47:48','2006-02-15 22:13:16'),(3498,129,2,13653,'10.99','2005-08-20 07:54:54','2006-02-15 22:13:16'),(3499,129,1,13915,'4.99','2005-08-20 16:42:53','2006-02-15 22:13:16'),(3500,129,1,13919,'4.99','2005-08-20 16:47:34','2006-02-15 22:13:16'),(3501,129,1,13961,'0.99','2005-08-20 18:16:34','2006-02-15 22:13:16'),(3502,129,1,14353,'0.99','2005-08-21 09:07:50','2006-02-15 22:13:16'),(3503,129,2,14968,'1.99','2005-08-22 06:46:59','2006-02-15 22:13:16'),(3504,130,1,1,'2.99','2005-05-24 22:53:30','2006-02-15 22:13:16'),(3505,130,1,746,'2.99','2005-05-29 09:25:10','2006-02-15 22:13:16'),(3506,130,1,1630,'2.99','2005-06-16 07:55:01','2006-02-15 22:13:16'),(3507,130,2,1864,'2.99','2005-06-17 01:39:47','2006-02-15 22:13:16'),(3508,130,2,2163,'2.99','2005-06-17 23:46:16','2006-02-15 22:13:16'),(3509,130,2,2292,'2.99','2005-06-18 07:37:48','2006-02-15 22:13:16'),(3510,130,1,2535,'2.99','2005-06-19 01:39:04','2006-02-15 22:13:16'),(3511,130,1,2982,'6.99','2005-06-20 08:38:29','2006-02-15 22:13:16'),(3512,130,2,4339,'4.99','2005-07-07 18:41:42','2006-02-15 22:13:16'),(3513,130,2,4485,'4.99','2005-07-08 01:07:54','2006-02-15 22:13:16'),(3514,130,1,6353,'3.99','2005-07-11 20:48:56','2006-02-15 22:13:16'),(3515,130,1,7181,'4.99','2005-07-27 08:14:34','2006-02-15 22:13:16'),(3516,130,1,7728,'0.99','2005-07-28 04:56:33','2006-02-15 22:13:16'),(3517,130,1,9452,'0.99','2005-07-30 22:19:16','2006-02-15 22:13:16'),(3518,130,2,9637,'4.99','2005-07-31 05:18:54','2006-02-15 22:13:16'),(3519,130,2,9724,'5.99','2005-07-31 08:33:08','2006-02-15 22:13:16'),(3520,130,2,10568,'2.99','2005-08-01 13:17:28','2006-02-15 22:13:16'),(3521,130,2,10645,'5.99','2005-08-01 15:52:01','2006-02-15 22:13:16'),(3522,130,1,11811,'2.99','2005-08-17 11:59:18','2006-02-15 22:13:16'),(3523,130,1,12094,'2.99','2005-08-17 22:31:04','2006-02-15 22:13:16'),(3524,130,1,12777,'6.99','2005-08-18 23:39:22','2006-02-15 22:13:16'),(3525,130,2,14111,'0.99','2005-08-21 00:59:01','2006-02-15 22:13:16'),(3526,130,2,15574,'5.99','2005-08-23 05:29:32','2006-02-15 22:13:16'),(3527,130,1,15777,'4.99','2005-08-23 13:29:08','2006-02-15 22:13:16'),(3528,131,2,55,'2.99','2005-05-25 08:26:13','2006-02-15 22:13:16'),(3529,131,1,83,'4.99','2005-05-25 12:30:15','2006-02-15 22:13:16'),(3530,131,2,944,'7.99','2005-05-30 15:26:24','2006-02-15 22:13:16'),(3531,131,1,1646,'9.99','2005-06-16 09:12:53','2006-02-15 22:13:16'),(3532,131,2,1768,'4.99','2005-06-16 18:02:06','2006-02-15 22:13:16'),(3533,131,1,3515,'2.99','2005-07-06 00:48:55','2006-02-15 22:13:16'),(3534,131,1,5233,'4.99','2005-07-09 12:44:26','2006-02-15 22:13:16'),(3535,131,1,5395,'4.99','2005-07-09 19:42:37','2006-02-15 22:13:16'),(3536,131,1,5610,'2.99','2005-07-10 05:09:52','2006-02-15 22:13:16'),(3537,131,2,5726,'2.99','2005-07-10 11:22:08','2006-02-15 22:13:16'),(3538,131,1,5874,'3.99','2005-07-10 19:02:51','2006-02-15 22:13:16'),(3539,131,1,7557,'2.99','2005-07-27 22:18:19','2006-02-15 22:13:16'),(3540,131,2,8071,'0.99','2005-07-28 17:27:48','2006-02-15 22:13:16'),(3541,131,1,8267,'6.99','2005-07-29 01:21:02','2006-02-15 22:13:17'),(3542,131,1,8570,'8.99','2005-07-29 11:40:08','2006-02-15 22:13:17'),(3543,131,1,9323,'3.99','2005-07-30 17:21:44','2006-02-15 22:13:17'),(3544,131,1,10179,'2.99','2005-07-31 23:49:54','2006-02-15 22:13:17'),(3545,131,1,10459,'4.99','2005-08-01 09:20:09','2006-02-15 22:13:17'),(3546,131,1,10861,'1.99','2005-08-02 00:12:46','2006-02-15 22:13:17'),(3547,131,2,11971,'0.99','2005-08-17 17:53:42','2006-02-15 22:13:17'),(3548,131,1,11973,'2.99','2005-08-17 17:55:58','2006-02-15 22:13:17'),(3549,131,1,12216,'0.99','2005-08-18 02:37:07','2006-02-15 22:13:17'),(3550,131,2,12263,'0.99','2005-08-18 04:16:18','2006-02-15 22:13:17'),(3551,131,1,12372,'9.99','2005-08-18 08:04:35','2006-02-15 22:13:17'),(3552,131,2,13050,'6.99','2005-08-19 09:31:23','2006-02-15 22:13:17'),(3553,131,2,13346,'7.99','2005-08-19 20:28:21','2006-02-15 22:13:17'),(3554,131,2,13353,'2.99','2005-08-19 20:53:43','2006-02-15 22:13:17'),(3555,131,1,13407,'0.99','2005-08-19 22:26:26','2006-02-15 22:13:17'),(3556,131,2,15659,'2.99','2005-08-23 08:48:43','2006-02-15 22:13:17'),(3557,131,1,16042,'2.99','2005-08-23 22:20:40','2006-02-15 22:13:17'),(3558,132,1,1843,'0.99','2005-06-16 23:53:42','2006-02-15 22:13:17'),(3559,132,1,2208,'4.99','2005-06-18 02:22:07','2006-02-15 22:13:17'),(3560,132,1,2384,'0.99','2005-06-18 15:18:49','2006-02-15 22:13:17'),(3561,132,2,2608,'2.99','2005-06-19 07:10:36','2006-02-15 22:13:17'),(3562,132,2,2924,'4.99','2005-06-20 04:20:14','2006-02-15 22:13:17'),(3563,132,1,3121,'4.99','2005-06-20 18:23:30','2006-02-15 22:13:17'),(3564,132,1,3706,'0.99','2005-07-06 10:18:01','2006-02-15 22:13:17'),(3565,132,2,3825,'2.99','2005-07-06 15:50:03','2006-02-15 22:13:17'),(3566,132,1,4168,'4.99','2005-07-07 09:37:24','2006-02-15 22:13:17'),(3567,132,1,4534,'4.99','2005-07-08 03:36:55','2006-02-15 22:13:17'),(3568,132,1,4557,'5.99','2005-07-08 04:49:15','2006-02-15 22:13:17'),(3569,132,2,4903,'0.99','2005-07-08 20:50:05','2006-02-15 22:13:17'),(3570,132,1,5391,'2.99','2005-07-09 19:28:34','2006-02-15 22:13:17'),(3571,132,2,5684,'5.99','2005-07-10 08:59:03','2006-02-15 22:13:17'),(3572,132,1,5703,'0.99','2005-07-10 10:04:15','2006-02-15 22:13:17'),(3573,132,2,5715,'1.99','2005-07-10 10:48:03','2006-02-15 22:13:17'),(3574,132,1,6239,'6.99','2005-07-11 14:20:48','2006-02-15 22:13:17'),(3575,132,1,6978,'1.99','2005-07-27 00:47:40','2006-02-15 22:13:17'),(3576,132,2,7432,'0.99','2005-07-27 17:31:40','2006-02-15 22:13:17'),(3577,132,1,7631,'1.99','2005-07-28 01:01:15','2006-02-15 22:13:17'),(3578,132,2,10243,'4.99','2005-08-01 02:18:46','2006-02-15 22:13:17'),(3579,132,1,10400,'6.99','2005-08-01 07:18:24','2006-02-15 22:13:17'),(3580,132,2,10619,'3.99','2005-08-01 15:07:04','2006-02-15 22:13:17'),(3581,132,1,10638,'6.99','2005-08-01 15:44:20','2006-02-15 22:13:17'),(3582,132,2,11140,'0.99','2005-08-02 09:27:45','2006-02-15 22:13:17'),(3583,132,2,11812,'0.99','2005-08-17 12:00:54','2006-02-15 22:13:17'),(3584,132,2,12133,'0.99','2005-08-17 23:47:16','2006-02-15 22:13:17'),(3585,132,1,15874,'4.99','2005-08-23 16:30:55','2006-02-15 22:13:17'),(3586,133,1,275,'6.99','2005-05-26 17:09:53','2006-02-15 22:13:17'),(3587,133,2,447,'2.99','2005-05-27 18:57:02','2006-02-15 22:13:17'),(3588,133,2,1522,'3.99','2005-06-16 00:17:39','2006-02-15 22:13:17'),(3589,133,2,2665,'7.99','2005-06-19 11:12:35','2006-02-15 22:13:18'),(3590,133,1,3006,'0.99','2005-06-20 10:10:29','2006-02-15 22:13:18'),(3591,133,2,3365,'0.99','2005-06-21 12:55:48','2006-02-15 22:13:18'),(3592,133,2,4506,'6.99','2005-07-08 02:22:18','2006-02-15 22:13:18'),(3593,133,2,4566,'2.99','2005-07-08 05:18:50','2006-02-15 22:13:18'),(3594,133,1,4681,'6.99','2005-07-08 10:36:03','2006-02-15 22:13:18'),(3595,133,2,4829,'2.99','2005-07-08 17:54:18','2006-02-15 22:13:18'),(3596,133,2,5063,'2.99','2005-07-09 04:37:31','2006-02-15 22:13:18'),(3597,133,1,6157,'4.99','2005-07-11 09:48:16','2006-02-15 22:13:18'),(3598,133,1,6609,'3.99','2005-07-12 08:19:41','2006-02-15 22:13:18'),(3599,133,1,7177,'2.99','2005-07-27 08:07:39','2006-02-15 22:13:18'),(3600,133,1,7400,'0.99','2005-07-27 16:16:37','2006-02-15 22:13:18'),(3601,133,2,8389,'6.99','2005-07-29 05:50:09','2006-02-15 22:13:18'),(3602,133,2,9139,'2.99','2005-07-30 10:11:52','2006-02-15 22:13:18'),(3603,133,1,9175,'0.99','2005-07-30 11:47:48','2006-02-15 22:13:18'),(3604,133,2,9671,'0.99','2005-07-31 06:33:41','2006-02-15 22:13:18'),(3605,133,1,10665,'0.99','2005-08-01 16:56:17','2006-02-15 22:13:18'),(3606,133,1,12419,'4.99','2005-08-18 10:01:48','2006-02-15 22:13:18'),(3607,133,1,12834,'4.99','2005-08-19 01:47:30','2006-02-15 22:13:18'),(3608,133,2,13323,'2.99','2005-08-19 19:48:07','2006-02-15 22:13:18'),(3609,133,1,13455,'1.99','2005-08-20 00:32:17','2006-02-15 22:13:18'),(3610,133,2,13910,'2.99','2005-08-20 16:30:49','2006-02-15 22:13:18'),(3611,133,2,15080,'0.99','2005-08-22 11:11:51','2006-02-15 22:13:18'),(3612,133,1,16009,'6.99','2005-08-23 21:07:59','2006-02-15 22:13:18'),(3613,134,1,366,'3.99','2005-05-27 07:33:54','2006-02-15 22:13:18'),(3614,134,2,798,'0.99','2005-05-29 17:23:43','2006-02-15 22:13:18'),(3615,134,1,814,'6.99','2005-05-29 20:16:12','2006-02-15 22:13:18'),(3616,134,2,1124,'4.99','2005-05-31 16:49:34','2006-02-15 22:13:18'),(3617,134,1,1618,'9.99','2005-06-16 07:08:38','2006-02-15 22:13:18'),(3618,134,2,1784,'0.99','2005-06-16 19:25:32','2006-02-15 22:13:18'),(3619,134,2,1881,'0.99','2005-06-17 03:09:56','2006-02-15 22:13:18'),(3620,134,1,3267,'5.99','2005-06-21 04:55:21','2006-02-15 22:13:18'),(3621,134,1,5315,'4.99','2005-07-09 16:09:19','2006-02-15 22:13:18'),(3622,134,2,6226,'2.99','2005-07-11 13:48:11','2006-02-15 22:13:18'),(3623,134,1,6659,'0.99','2005-07-12 11:18:05','2006-02-15 22:13:18'),(3624,134,2,7516,'2.99','2005-07-27 20:55:28','2006-02-15 22:13:18'),(3625,134,2,7965,'4.99','2005-07-28 13:52:57','2006-02-15 22:13:18'),(3626,134,2,8650,'1.99','2005-07-29 14:59:04','2006-02-15 22:13:18'),(3627,134,1,10864,'6.99','2005-08-02 00:18:59','2006-02-15 22:13:18'),(3628,134,1,11280,'3.99','2005-08-02 14:34:33','2006-02-15 22:13:18'),(3629,134,1,11283,'4.99','2005-08-02 14:39:46','2006-02-15 22:13:18'),(3630,134,2,11482,'4.99','2005-08-02 22:24:31','2006-02-15 22:13:18'),(3631,134,1,12754,'7.99','2005-08-18 22:37:41','2006-02-15 22:13:18'),(3632,134,2,12987,'2.99','2005-08-19 07:11:44','2006-02-15 22:13:19'),(3633,134,2,13006,'2.99','2005-08-19 07:47:16','2006-02-15 22:13:19'),(3634,134,2,14265,'2.99','2005-08-21 06:20:14','2006-02-15 22:13:19'),(3635,134,2,15963,'2.99','2005-08-23 19:42:46','2006-02-15 22:13:19'),(3636,135,1,78,'5.99','2005-05-25 11:35:18','2006-02-15 22:13:19'),(3637,135,2,753,'3.99','2005-05-29 10:16:42','2006-02-15 22:13:19'),(3638,135,2,1272,'0.99','2005-06-15 07:42:58','2006-02-15 22:13:19'),(3639,135,2,1671,'1.99','2005-06-16 10:30:22','2006-02-15 22:13:19'),(3640,135,2,2941,'2.99','2005-06-20 05:22:18','2006-02-15 22:13:19'),(3641,135,1,4102,'0.99','2005-07-07 06:25:19','2006-02-15 22:13:19'),(3642,135,2,5054,'7.99','2005-07-09 04:01:02','2006-02-15 22:13:19'),(3643,135,1,5541,'0.99','2005-07-10 02:44:27','2006-02-15 22:13:19'),(3644,135,1,6117,'3.99','2005-07-11 07:39:38','2006-02-15 22:13:19'),(3645,135,1,6461,'3.99','2005-07-12 01:14:03','2006-02-15 22:13:19'),(3646,135,1,6817,'3.99','2005-07-12 18:19:57','2006-02-15 22:13:19'),(3647,135,2,7297,'4.99','2005-07-27 12:39:48','2006-02-15 22:13:19'),(3648,135,1,7437,'0.99','2005-07-27 17:39:18','2006-02-15 22:13:19'),(3649,135,1,7554,'7.99','2005-07-27 22:12:41','2006-02-15 22:13:19'),(3650,135,1,7734,'0.99','2005-07-28 05:08:44','2006-02-15 22:13:19'),(3651,135,1,8315,'0.99','2005-07-29 03:37:07','2006-02-15 22:13:19'),(3652,135,2,8885,'7.99','2005-07-30 00:36:26','2006-02-15 22:13:19'),(3653,135,1,8987,'6.99','2005-07-30 04:37:36','2006-02-15 22:13:19'),(3654,135,2,10091,'4.99','2005-07-31 20:23:13','2006-02-15 22:13:19'),(3655,135,2,10471,'0.99','2005-08-01 09:52:37','2006-02-15 22:13:19'),(3656,135,1,10611,'2.99','2005-08-01 14:53:52','2006-02-15 22:13:19'),(3657,135,1,10698,'3.99','2005-08-01 18:24:41','2006-02-15 22:13:19'),(3658,135,2,11194,'5.99','2005-08-02 11:35:53','2006-02-15 22:13:19'),(3659,135,1,11704,'7.99','2005-08-17 07:21:22','2006-02-15 22:13:19'),(3660,135,1,12249,'2.99','2005-08-18 03:53:34','2006-02-15 22:13:19'),(3661,135,1,13035,'0.99','2005-08-19 08:46:45','2006-02-15 22:13:19'),(3662,135,1,14005,'0.99','2005-08-20 20:19:05','2006-02-15 22:13:19'),(3663,135,2,14136,'5.99','2005-08-21 01:57:26','2006-02-15 22:13:19'),(3664,135,2,15908,'2.99','2005-08-23 17:42:00','2006-02-15 22:13:19'),(3665,135,1,13390,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:19'),(3666,136,2,1150,'2.99','2005-05-31 21:20:09','2006-02-15 22:13:19'),(3667,136,2,2104,'2.99','2005-06-17 19:14:30','2006-02-15 22:13:19'),(3668,136,1,4927,'0.99','2005-07-08 22:05:35','2006-02-15 22:13:19'),(3669,136,1,5627,'3.99','2005-07-10 05:51:12','2006-02-15 22:13:19'),(3670,136,2,6142,'3.99','2005-07-11 08:54:09','2006-02-15 22:13:19'),(3671,136,1,6585,'8.99','2005-07-12 06:50:52','2006-02-15 22:13:19'),(3672,136,2,9319,'0.99','2005-07-30 17:15:27','2006-02-15 22:13:19'),(3673,136,2,9764,'5.99','2005-07-31 09:42:58','2006-02-15 22:13:19'),(3674,136,2,11992,'10.99','2005-08-17 18:27:22','2006-02-15 22:13:19'),(3675,136,1,12287,'5.99','2005-08-18 04:58:06','2006-02-15 22:13:19'),(3676,136,2,12539,'0.99','2005-08-18 14:10:09','2006-02-15 22:13:19'),(3677,136,2,13992,'4.99','2005-08-20 19:30:35','2006-02-15 22:13:19'),(3678,136,2,14379,'0.99','2005-08-21 09:53:03','2006-02-15 22:13:19'),(3679,136,1,14437,'2.99','2005-08-21 11:48:32','2006-02-15 22:13:19'),(3680,136,1,15439,'4.99','2005-08-23 00:34:28','2006-02-15 22:13:20'),(3681,137,1,925,'2.99','2005-05-30 12:13:52','2006-02-15 22:13:20'),(3682,137,1,2469,'6.99','2005-06-18 20:24:23','2006-02-15 22:13:20'),(3683,137,1,2785,'2.99','2005-06-19 18:43:57','2006-02-15 22:13:20'),(3684,137,2,3058,'3.99','2005-06-20 13:28:35','2006-02-15 22:13:20'),(3685,137,1,3436,'5.99','2005-06-21 19:16:09','2006-02-15 22:13:20'),(3686,137,2,3589,'4.99','2005-07-06 04:30:18','2006-02-15 22:13:20'),(3687,137,2,3676,'5.99','2005-07-06 09:10:37','2006-02-15 22:13:20'),(3688,137,2,3874,'6.99','2005-07-06 18:06:12','2006-02-15 22:13:20'),(3689,137,1,4332,'6.99','2005-07-07 18:25:26','2006-02-15 22:13:20'),(3690,137,2,4474,'3.99','2005-07-08 00:26:56','2006-02-15 22:13:20'),(3691,137,1,5106,'2.99','2005-07-09 06:40:24','2006-02-15 22:13:20'),(3692,137,1,5443,'3.99','2005-07-09 21:56:09','2006-02-15 22:13:20'),(3693,137,1,5804,'2.99','2005-07-10 15:06:31','2006-02-15 22:13:20'),(3694,137,1,6039,'6.99','2005-07-11 03:12:19','2006-02-15 22:13:20'),(3695,137,2,6200,'0.99','2005-07-11 12:16:42','2006-02-15 22:13:20'),(3696,137,1,8028,'8.99','2005-07-28 16:11:15','2006-02-15 22:13:20'),(3697,137,1,8106,'4.99','2005-07-28 19:02:46','2006-02-15 22:13:20'),(3698,137,2,8954,'2.99','2005-07-30 03:25:51','2006-02-15 22:13:20'),(3699,137,1,9002,'4.99','2005-07-30 05:02:21','2006-02-15 22:13:20'),(3700,137,2,9200,'4.99','2005-07-30 12:39:52','2006-02-15 22:13:20'),(3701,137,2,9466,'7.99','2005-07-30 22:44:36','2006-02-15 22:13:20'),(3702,137,1,9709,'4.99','2005-07-31 08:04:55','2006-02-15 22:13:20'),(3703,137,1,9789,'2.99','2005-07-31 10:30:25','2006-02-15 22:13:20'),(3704,137,1,10175,'6.99','2005-07-31 23:40:11','2006-02-15 22:13:20'),(3705,137,2,10595,'4.99','2005-08-01 14:16:28','2006-02-15 22:13:20'),(3706,137,2,10842,'5.99','2005-08-01 23:41:24','2006-02-15 22:13:20'),(3707,137,2,11057,'4.99','2005-08-02 06:38:19','2006-02-15 22:13:20'),(3708,137,1,11281,'3.99','2005-08-02 14:35:01','2006-02-15 22:13:20'),(3709,137,2,11732,'3.99','2005-08-17 08:29:46','2006-02-15 22:13:20'),(3710,137,1,12078,'2.99','2005-08-17 22:00:22','2006-02-15 22:13:20'),(3711,137,1,13148,'0.99','2005-08-19 12:55:30','2006-02-15 22:13:20'),(3712,137,1,13472,'5.99','2005-08-20 01:03:31','2006-02-15 22:13:20'),(3713,137,1,13776,'5.99','2005-08-20 11:57:06','2006-02-15 22:13:20'),(3714,137,1,14754,'7.99','2005-08-21 23:17:26','2006-02-15 22:13:20'),(3715,137,2,15082,'7.99','2005-08-22 11:17:06','2006-02-15 22:13:20'),(3716,137,1,15133,'0.99','2005-08-22 13:17:43','2006-02-15 22:13:20'),(3717,137,2,15537,'2.99','2005-08-23 04:00:30','2006-02-15 22:13:20'),(3718,137,2,15889,'4.99','2005-08-23 16:57:43','2006-02-15 22:13:20'),(3719,137,1,16030,'9.99','2005-08-23 21:56:04','2006-02-15 22:13:20'),(3720,138,1,523,'2.99','2005-05-28 03:53:26','2006-02-15 22:13:20'),(3721,138,1,1020,'0.99','2005-05-31 03:06:08','2006-02-15 22:13:20'),(3722,138,2,1316,'0.99','2005-06-15 10:26:23','2006-02-15 22:13:20'),(3723,138,2,2038,'0.99','2005-06-17 14:00:51','2006-02-15 22:13:20'),(3724,138,1,2731,'7.99','2005-06-19 15:14:55','2006-02-15 22:13:20'),(3725,138,2,3481,'2.99','2005-07-05 23:13:07','2006-02-15 22:13:20'),(3726,138,1,5378,'0.99','2005-07-09 19:05:56','2006-02-15 22:13:20'),(3727,138,1,5600,'1.99','2005-07-10 04:55:45','2006-02-15 22:13:20'),(3728,138,1,5679,'4.99','2005-07-10 08:44:02','2006-02-15 22:13:21'),(3729,138,1,6458,'2.99','2005-07-12 01:08:52','2006-02-15 22:13:21'),(3730,138,1,6892,'0.99','2005-07-12 21:10:04','2006-02-15 22:13:21'),(3731,138,1,7208,'2.99','2005-07-27 09:16:28','2006-02-15 22:13:21'),(3732,138,1,7754,'2.99','2005-07-28 06:10:55','2006-02-15 22:13:21'),(3733,138,2,8123,'4.99','2005-07-28 19:28:23','2006-02-15 22:13:21'),(3734,138,2,8160,'3.99','2005-07-28 21:10:30','2006-02-15 22:13:21'),(3735,138,1,8424,'3.99','2005-07-29 07:06:03','2006-02-15 22:13:21'),(3736,138,2,9259,'1.99','2005-07-30 14:37:44','2006-02-15 22:13:21'),(3737,138,1,9619,'0.99','2005-07-31 04:17:02','2006-02-15 22:13:21'),(3738,138,1,9947,'9.99','2005-07-31 15:49:40','2006-02-15 22:13:21'),(3739,138,1,10110,'0.99','2005-07-31 21:06:12','2006-02-15 22:13:21'),(3740,138,2,10190,'4.99','2005-08-01 00:27:53','2006-02-15 22:13:21'),(3741,138,1,10268,'3.99','2005-08-01 03:08:56','2006-02-15 22:13:21'),(3742,138,1,10431,'5.99','2005-08-01 08:41:54','2006-02-15 22:13:21'),(3743,138,1,11015,'4.99','2005-08-02 05:13:00','2006-02-15 22:13:21'),(3744,138,1,11088,'0.99','2005-08-02 07:48:31','2006-02-15 22:13:21'),(3745,138,1,11463,'0.99','2005-08-02 21:37:36','2006-02-15 22:13:21'),(3746,138,2,12550,'2.99','2005-08-18 14:40:38','2006-02-15 22:13:21'),(3747,138,2,12873,'2.99','2005-08-19 03:05:41','2006-02-15 22:13:21'),(3748,138,1,14194,'1.99','2005-08-21 03:40:11','2006-02-15 22:13:21'),(3749,138,2,14432,'4.99','2005-08-21 11:36:15','2006-02-15 22:13:21'),(3750,138,2,14486,'4.99','2005-08-21 13:52:54','2006-02-15 22:13:21'),(3751,138,1,14987,'4.99','2005-08-22 07:41:08','2006-02-15 22:13:21'),(3752,138,1,15424,'2.99','2005-08-23 00:03:01','2006-02-15 22:13:21'),(3753,138,1,15501,'0.99','2005-08-23 02:39:56','2006-02-15 22:13:21'),(3754,139,2,1169,'2.99','2005-06-14 23:42:56','2006-02-15 22:13:21'),(3755,139,1,1736,'2.99','2005-06-16 15:52:32','2006-02-15 22:13:21'),(3756,139,1,2659,'0.99','2005-06-19 10:47:42','2006-02-15 22:13:21'),(3757,139,2,2718,'7.99','2005-06-19 14:49:42','2006-02-15 22:13:21'),(3758,139,2,4660,'0.99','2005-07-08 09:54:47','2006-02-15 22:13:21'),(3759,139,2,4663,'2.99','2005-07-08 09:59:18','2006-02-15 22:13:21'),(3760,139,2,5092,'2.99','2005-07-09 05:57:39','2006-02-15 22:13:21'),(3761,139,2,5265,'7.99','2005-07-09 14:15:01','2006-02-15 22:13:21'),(3762,139,1,5390,'6.99','2005-07-09 19:26:22','2006-02-15 22:13:21'),(3763,139,1,5494,'6.99','2005-07-10 00:15:00','2006-02-15 22:13:21'),(3764,139,1,6496,'6.99','2005-07-12 02:57:39','2006-02-15 22:13:21'),(3765,139,2,6740,'0.99','2005-07-12 14:22:08','2006-02-15 22:13:21'),(3766,139,1,7369,'0.99','2005-07-27 15:07:58','2006-02-15 22:13:21'),(3767,139,2,7767,'5.99','2005-07-28 06:42:02','2006-02-15 22:13:21'),(3768,139,2,9415,'2.99','2005-07-30 20:48:31','2006-02-15 22:13:21'),(3769,139,2,9920,'4.99','2005-07-31 14:57:13','2006-02-15 22:13:21'),(3770,139,1,10900,'2.99','2005-08-02 01:34:26','2006-02-15 22:13:21'),(3771,139,1,12859,'6.99','2005-08-19 02:23:23','2006-02-15 22:13:21'),(3772,139,2,13401,'3.99','2005-08-19 22:16:16','2006-02-15 22:13:21'),(3773,139,2,14736,'5.99','2005-08-21 22:25:53','2006-02-15 22:13:21'),(3774,139,1,14788,'2.99','2005-08-22 00:27:59','2006-02-15 22:13:21'),(3775,139,1,15024,'2.99','2005-08-22 08:57:10','2006-02-15 22:13:22'),(3776,139,2,15029,'2.99','2005-08-22 09:04:53','2006-02-15 22:13:22'),(3777,139,1,15062,'2.99','2005-08-22 10:34:39','2006-02-15 22:13:22'),(3778,139,1,15218,'9.99','2005-08-22 16:59:05','2006-02-15 22:13:22'),(3779,139,1,15471,'3.99','2005-08-23 01:38:48','2006-02-15 22:13:22'),(3780,139,1,15743,'0.99','2005-08-23 12:12:05','2006-02-15 22:13:22'),(3781,140,1,1586,'4.99','2005-06-16 04:51:18','2006-02-15 22:13:22'),(3782,140,1,1687,'2.99','2005-06-16 12:09:20','2006-02-15 22:13:22'),(3783,140,2,2332,'6.99','2005-06-18 10:53:51','2006-02-15 22:13:22'),(3784,140,2,3171,'0.99','2005-06-20 22:15:47','2006-02-15 22:13:22'),(3785,140,1,6286,'4.99','2005-07-11 16:55:35','2006-02-15 22:13:22'),(3786,140,1,6407,'9.99','2005-07-11 23:02:19','2006-02-15 22:13:22'),(3787,140,2,6571,'0.99','2005-07-12 05:51:47','2006-02-15 22:13:22'),(3788,140,1,6918,'2.99','2005-07-12 22:30:29','2006-02-15 22:13:22'),(3789,140,1,7170,'4.99','2005-07-27 07:58:26','2006-02-15 22:13:22'),(3790,140,1,9094,'4.99','2005-07-30 08:35:10','2006-02-15 22:13:22'),(3791,140,1,9404,'0.99','2005-07-30 20:21:35','2006-02-15 22:13:22'),(3792,140,1,10342,'6.99','2005-08-01 05:11:11','2006-02-15 22:13:22'),(3793,140,2,11430,'3.99','2005-08-02 20:04:36','2006-02-15 22:13:22'),(3794,140,1,12086,'4.99','2005-08-17 22:20:01','2006-02-15 22:13:22'),(3795,140,1,12675,'4.99','2005-08-18 19:34:02','2006-02-15 22:13:22'),(3796,140,2,13053,'10.99','2005-08-19 09:31:48','2006-02-15 22:13:22'),(3797,140,1,15261,'2.99','2005-08-22 18:24:34','2006-02-15 22:13:22'),(3798,140,1,15852,'2.99','2005-08-23 15:47:02','2006-02-15 22:13:22'),(3799,141,2,930,'2.99','2005-05-30 12:44:57','2006-02-15 22:13:22'),(3800,141,2,1242,'7.99','2005-06-15 05:05:07','2006-02-15 22:13:22'),(3801,141,2,2895,'7.99','2005-06-20 02:26:31','2006-02-15 22:13:22'),(3802,141,1,3434,'4.99','2005-06-21 19:08:28','2006-02-15 22:13:22'),(3803,141,1,4057,'1.99','2005-07-07 04:00:20','2006-02-15 22:13:22'),(3804,141,2,4297,'0.99','2005-07-07 16:24:09','2006-02-15 22:13:22'),(3805,141,1,4656,'5.99','2005-07-08 09:50:10','2006-02-15 22:13:22'),(3806,141,2,5062,'2.99','2005-07-09 04:36:49','2006-02-15 22:13:22'),(3807,141,1,5769,'0.99','2005-07-10 13:17:58','2006-02-15 22:13:22'),(3808,141,2,6979,'4.99','2005-07-27 00:49:53','2006-02-15 22:13:22'),(3809,141,2,7878,'2.99','2005-07-28 10:27:10','2006-02-15 22:13:22'),(3810,141,1,8434,'4.99','2005-07-29 07:20:14','2006-02-15 22:13:22'),(3811,141,2,9073,'7.99','2005-07-30 07:49:56','2006-02-15 22:13:22'),(3812,141,1,9584,'4.99','2005-07-31 03:05:48','2006-02-15 22:13:22'),(3813,141,2,9683,'2.99','2005-07-31 06:47:13','2006-02-15 22:13:22'),(3814,141,1,10287,'3.99','2005-08-01 03:37:01','2006-02-15 22:13:22'),(3815,141,1,10379,'1.99','2005-08-01 06:34:29','2006-02-15 22:13:22'),(3816,141,1,10798,'4.99','2005-08-01 22:03:10','2006-02-15 22:13:22'),(3817,141,1,11411,'2.99','2005-08-02 19:29:47','2006-02-15 22:13:22'),(3818,141,1,11412,'5.99','2005-08-02 19:32:51','2006-02-15 22:13:22'),(3819,141,1,12032,'5.99','2005-08-17 20:14:26','2006-02-15 22:13:23'),(3820,141,1,12093,'2.99','2005-08-17 22:28:40','2006-02-15 22:13:23'),(3821,141,2,12107,'3.99','2005-08-17 22:56:24','2006-02-15 22:13:23'),(3822,141,2,12353,'2.99','2005-08-18 07:33:08','2006-02-15 22:13:23'),(3823,141,1,13000,'0.99','2005-08-19 07:36:42','2006-02-15 22:13:23'),(3824,141,2,13169,'2.99','2005-08-19 13:43:35','2006-02-15 22:13:23'),(3825,141,2,13470,'4.99','2005-08-20 01:01:16','2006-02-15 22:13:23'),(3826,141,2,14059,'7.99','2005-08-20 22:24:44','2006-02-15 22:13:23'),(3827,141,1,14112,'2.99','2005-08-21 01:00:46','2006-02-15 22:13:23'),(3828,141,1,15013,'4.99','2005-08-22 08:42:45','2006-02-15 22:13:23'),(3829,141,1,15309,'0.99','2005-08-22 19:54:52','2006-02-15 22:13:23'),(3830,141,1,15964,'2.99','2005-08-23 19:45:25','2006-02-15 22:13:23'),(3831,142,2,11,'8.99','2005-05-25 00:09:02','2006-02-15 22:13:23'),(3832,142,1,148,'0.99','2005-05-26 00:25:23','2006-02-15 22:13:23'),(3833,142,1,575,'9.99','2005-05-28 10:56:09','2006-02-15 22:13:23'),(3834,142,1,1268,'1.99','2005-06-15 07:29:30','2006-02-15 22:13:23'),(3835,142,1,3214,'2.99','2005-06-21 01:08:26','2006-02-15 22:13:23'),(3836,142,2,3492,'2.99','2005-07-05 23:44:37','2006-02-15 22:13:23'),(3837,142,2,4497,'4.99','2005-07-08 01:51:32','2006-02-15 22:13:23'),(3838,142,1,4531,'4.99','2005-07-08 03:27:59','2006-02-15 22:13:23'),(3839,142,1,6522,'0.99','2005-07-12 04:11:58','2006-02-15 22:13:23'),(3840,142,1,7764,'2.99','2005-07-28 06:40:05','2006-02-15 22:13:23'),(3841,142,2,8513,'2.99','2005-07-29 09:52:59','2006-02-15 22:13:23'),(3842,142,2,8623,'4.99','2005-07-29 13:55:11','2006-02-15 22:13:23'),(3843,142,1,9020,'7.99','2005-07-30 05:31:27','2006-02-15 22:13:23'),(3844,142,1,9131,'2.99','2005-07-30 09:55:57','2006-02-15 22:13:23'),(3845,142,1,9419,'5.99','2005-07-30 21:04:59','2006-02-15 22:13:23'),(3846,142,2,10934,'5.99','2005-08-02 02:52:18','2006-02-15 22:13:23'),(3847,142,2,11244,'5.99','2005-08-02 13:33:24','2006-02-15 22:13:23'),(3848,142,1,12964,'0.99','2005-08-19 06:29:13','2006-02-15 22:13:23'),(3849,142,1,13044,'0.99','2005-08-19 09:14:31','2006-02-15 22:13:23'),(3850,142,2,13745,'0.99','2005-08-20 10:53:49','2006-02-15 22:13:23'),(3851,142,1,13959,'0.99','2005-08-20 18:16:21','2006-02-15 22:13:23'),(3852,142,2,14116,'4.99','2005-08-21 01:11:17','2006-02-15 22:13:23'),(3853,142,2,14813,'0.99','2005-08-22 01:11:37','2006-02-15 22:13:23'),(3854,142,2,15333,'2.99','2005-08-22 20:44:06','2006-02-15 22:13:23'),(3855,142,1,15477,'1.99','2005-08-23 01:46:35','2006-02-15 22:13:23'),(3856,142,1,15454,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:23'),(3857,143,1,221,'2.99','2005-05-26 10:14:09','2006-02-15 22:13:23'),(3858,143,1,312,'2.99','2005-05-26 22:52:19','2006-02-15 22:13:23'),(3859,143,2,1898,'1.99','2005-06-17 04:28:11','2006-02-15 22:13:23'),(3860,143,1,1942,'4.99','2005-06-17 07:43:39','2006-02-15 22:13:23'),(3861,143,2,2251,'3.99','2005-06-18 05:05:08','2006-02-15 22:13:24'),(3862,143,1,2574,'0.99','2005-06-19 04:23:52','2006-02-15 22:13:24'),(3863,143,1,2588,'4.99','2005-06-19 05:20:31','2006-02-15 22:13:24'),(3864,143,1,4031,'7.99','2005-07-07 02:32:07','2006-02-15 22:13:24'),(3865,143,2,4221,'0.99','2005-07-07 12:18:57','2006-02-15 22:13:24'),(3866,143,1,4585,'7.99','2005-07-08 06:11:58','2006-02-15 22:13:24'),(3867,143,2,6076,'6.99','2005-07-11 05:05:30','2006-02-15 22:13:24'),(3868,143,2,6207,'4.99','2005-07-11 12:34:24','2006-02-15 22:13:24'),(3869,143,1,8312,'0.99','2005-07-29 03:32:38','2006-02-15 22:13:24'),(3870,143,1,8335,'0.99','2005-07-29 04:18:25','2006-02-15 22:13:24'),(3871,143,2,9889,'1.99','2005-07-31 14:02:50','2006-02-15 22:13:24'),(3872,143,1,10118,'0.99','2005-07-31 21:16:31','2006-02-15 22:13:24'),(3873,143,1,11278,'6.99','2005-08-02 14:29:43','2006-02-15 22:13:24'),(3874,143,2,11651,'6.99','2005-08-17 05:02:25','2006-02-15 22:13:24'),(3875,143,1,12408,'2.99','2005-08-18 09:40:38','2006-02-15 22:13:24'),(3876,143,2,13835,'4.99','2005-08-20 14:06:33','2006-02-15 22:13:24'),(3877,143,1,15250,'5.99','2005-08-22 18:03:11','2006-02-15 22:13:24'),(3878,143,1,16029,'4.99','2005-08-23 21:54:02','2006-02-15 22:13:24'),(3879,144,1,323,'2.99','2005-05-27 00:49:27','2006-02-15 22:13:24'),(3880,144,2,345,'2.99','2005-05-27 04:32:25','2006-02-15 22:13:24'),(3881,144,1,1814,'5.99','2005-06-16 21:15:22','2006-02-15 22:13:24'),(3882,144,1,1943,'0.99','2005-06-17 07:49:17','2006-02-15 22:13:24'),(3883,144,1,2756,'4.99','2005-06-19 16:57:42','2006-02-15 22:13:24'),(3884,144,2,3019,'4.99','2005-06-20 11:11:52','2006-02-15 22:13:24'),(3885,144,1,3145,'2.99','2005-06-20 20:21:17','2006-02-15 22:13:24'),(3886,144,1,3321,'2.99','2005-06-21 08:33:26','2006-02-15 22:13:24'),(3887,144,1,4726,'6.99','2005-07-08 12:50:54','2006-02-15 22:13:24'),(3888,144,2,4818,'3.99','2005-07-08 17:18:22','2006-02-15 22:13:24'),(3889,144,2,5049,'0.99','2005-07-09 03:54:12','2006-02-15 22:13:24'),(3890,144,2,5374,'8.99','2005-07-09 18:52:08','2006-02-15 22:13:24'),(3891,144,2,5408,'7.99','2005-07-09 20:16:51','2006-02-15 22:13:24'),(3892,144,2,5526,'7.99','2005-07-10 02:04:03','2006-02-15 22:13:24'),(3893,144,2,6614,'7.99','2005-07-12 08:33:49','2006-02-15 22:13:24'),(3894,144,2,6791,'9.99','2005-07-12 16:35:07','2006-02-15 22:13:24'),(3895,144,2,7378,'5.99','2005-07-27 15:31:33','2006-02-15 22:13:24'),(3896,144,2,7566,'2.99','2005-07-27 22:34:45','2006-02-15 22:13:24'),(3897,144,1,7830,'0.99','2005-07-28 08:43:49','2006-02-15 22:13:24'),(3898,144,1,7858,'3.99','2005-07-28 09:50:18','2006-02-15 22:13:24'),(3899,144,2,8459,'5.99','2005-07-29 08:05:40','2006-02-15 22:13:24'),(3900,144,1,8983,'0.99','2005-07-30 04:31:08','2006-02-15 22:13:24'),(3901,144,1,9034,'7.99','2005-07-30 06:10:58','2006-02-15 22:13:24'),(3902,144,1,9098,'3.99','2005-07-30 08:44:21','2006-02-15 22:13:25'),(3903,144,2,9174,'4.99','2005-07-30 11:42:10','2006-02-15 22:13:25'),(3904,144,2,9714,'0.99','2005-07-31 08:15:32','2006-02-15 22:13:25'),(3905,144,1,10302,'0.99','2005-08-01 04:12:08','2006-02-15 22:13:25'),(3906,144,1,10593,'4.99','2005-08-01 14:13:19','2006-02-15 22:13:25'),(3907,144,1,10740,'5.99','2005-08-01 19:50:32','2006-02-15 22:13:25'),(3908,144,1,10951,'4.99','2005-08-02 03:26:35','2006-02-15 22:13:25'),(3909,144,1,11228,'2.99','2005-08-02 12:55:23','2006-02-15 22:13:25'),(3910,144,2,11476,'6.99','2005-08-02 22:03:47','2006-02-15 22:13:25'),(3911,144,1,11534,'7.99','2005-08-17 00:35:27','2006-02-15 22:13:25'),(3912,144,1,11859,'4.99','2005-08-17 13:51:20','2006-02-15 22:13:25'),(3913,144,2,12087,'2.99','2005-08-17 22:20:12','2006-02-15 22:13:25'),(3914,144,2,12733,'2.99','2005-08-18 21:59:00','2006-02-15 22:13:25'),(3915,144,1,12858,'3.99','2005-08-19 02:22:16','2006-02-15 22:13:25'),(3916,144,2,12980,'6.99','2005-08-19 07:03:14','2006-02-15 22:13:25'),(3917,144,2,13881,'2.99','2005-08-20 15:18:55','2006-02-15 22:13:25'),(3918,144,2,14159,'2.99','2005-08-21 02:45:58','2006-02-15 22:13:25'),(3919,144,1,15017,'1.99','2005-08-22 08:47:44','2006-02-15 22:13:25'),(3920,144,1,15753,'7.99','2005-08-23 12:43:30','2006-02-15 22:13:25'),(3921,145,1,500,'0.99','2005-05-28 01:05:25','2006-02-15 22:13:25'),(3922,145,2,2271,'4.99','2005-06-18 06:29:52','2006-02-15 22:13:25'),(3923,145,2,2614,'0.99','2005-06-19 07:28:11','2006-02-15 22:13:25'),(3924,145,1,3647,'5.99','2005-07-06 07:29:17','2006-02-15 22:13:25'),(3925,145,2,4201,'8.99','2005-07-07 11:19:51','2006-02-15 22:13:25'),(3926,145,1,4364,'4.99','2005-07-07 19:46:51','2006-02-15 22:13:25'),(3927,145,2,4405,'6.99','2005-07-07 21:33:16','2006-02-15 22:13:26'),(3928,145,1,4470,'2.99','2005-07-08 00:20:57','2006-02-15 22:13:26'),(3929,145,2,4817,'2.99','2005-07-08 17:17:31','2006-02-15 22:13:26'),(3930,145,2,6056,'2.99','2005-07-11 04:01:27','2006-02-15 22:13:26'),(3931,145,1,6339,'1.99','2005-07-11 19:45:32','2006-02-15 22:13:26'),(3932,145,2,6378,'0.99','2005-07-11 21:45:23','2006-02-15 22:13:26'),(3933,145,2,7061,'2.99','2005-07-27 03:51:10','2006-02-15 22:13:26'),(3934,145,1,7529,'7.99','2005-07-27 21:18:08','2006-02-15 22:13:26'),(3935,145,2,7954,'0.99','2005-07-28 13:25:05','2006-02-15 22:13:26'),(3936,145,1,8380,'0.99','2005-07-29 05:31:29','2006-02-15 22:13:26'),(3937,145,1,9156,'2.99','2005-07-30 11:04:55','2006-02-15 22:13:26'),(3938,145,2,9576,'0.99','2005-07-31 02:52:59','2006-02-15 22:13:26'),(3939,145,2,10799,'4.99','2005-08-01 22:03:31','2006-02-15 22:13:26'),(3940,145,2,11904,'5.99','2005-08-17 15:39:26','2006-02-15 22:13:26'),(3941,145,2,11954,'2.99','2005-08-17 17:18:36','2006-02-15 22:13:26'),(3942,145,1,12637,'2.99','2005-08-18 18:06:53','2006-02-15 22:13:26'),(3943,145,2,12785,'2.99','2005-08-19 00:05:49','2006-02-15 22:13:26'),(3944,145,2,13012,'7.99','2005-08-19 07:54:59','2006-02-15 22:13:26'),(3945,145,1,13164,'3.99','2005-08-19 13:30:55','2006-02-15 22:13:26'),(3946,145,2,13272,'0.99','2005-08-19 17:49:13','2006-02-15 22:13:26'),(3947,145,2,14044,'5.99','2005-08-20 21:48:38','2006-02-15 22:13:26'),(3948,145,2,14389,'6.99','2005-08-21 10:15:20','2006-02-15 22:13:26'),(3949,146,2,762,'7.99','2005-05-29 11:15:51','2006-02-15 22:13:26'),(3950,146,1,1073,'4.99','2005-05-31 09:55:04','2006-02-15 22:13:26'),(3951,146,2,1209,'7.99','2005-06-15 02:31:12','2006-02-15 22:13:26'),(3952,146,2,1724,'1.99','2005-06-16 15:15:43','2006-02-15 22:13:26'),(3953,146,2,2099,'2.99','2005-06-17 18:47:26','2006-02-15 22:13:26'),(3954,146,1,2242,'3.99','2005-06-18 04:32:28','2006-02-15 22:13:26'),(3955,146,1,2342,'2.99','2005-06-18 11:42:40','2006-02-15 22:13:26'),(3956,146,1,2800,'0.99','2005-06-19 19:15:56','2006-02-15 22:13:26'),(3957,146,1,3131,'4.99','2005-06-20 19:08:00','2006-02-15 22:13:26'),(3958,146,1,4849,'6.99','2005-07-08 18:34:34','2006-02-15 22:13:26'),(3959,146,2,5000,'4.99','2005-07-09 01:16:13','2006-02-15 22:13:26'),(3960,146,1,6102,'7.99','2005-07-11 06:53:09','2006-02-15 22:13:26'),(3961,146,2,6184,'6.99','2005-07-11 11:19:21','2006-02-15 22:13:26'),(3962,146,1,6327,'4.99','2005-07-11 19:07:29','2006-02-15 22:13:26'),(3963,146,1,6990,'0.99','2005-07-27 01:02:46','2006-02-15 22:13:26'),(3964,146,2,8246,'3.99','2005-07-29 00:38:41','2006-02-15 22:13:26'),(3965,146,2,11173,'7.99','2005-08-02 10:28:00','2006-02-15 22:13:26'),(3966,146,1,11221,'2.99','2005-08-02 12:32:12','2006-02-15 22:13:26'),(3967,146,2,11370,'0.99','2005-08-02 18:06:01','2006-02-15 22:13:26'),(3968,146,2,11392,'5.99','2005-08-02 18:41:11','2006-02-15 22:13:26'),(3969,146,1,11573,'4.99','2005-08-17 01:38:18','2006-02-15 22:13:27'),(3970,146,1,11857,'4.99','2005-08-17 13:48:30','2006-02-15 22:13:27'),(3971,146,1,12129,'7.99','2005-08-17 23:31:25','2006-02-15 22:13:27'),(3972,146,1,12385,'2.99','2005-08-18 08:39:33','2006-02-15 22:13:27'),(3973,146,1,12888,'4.99','2005-08-19 03:41:09','2006-02-15 22:13:27'),(3974,146,1,13606,'4.99','2005-08-20 06:07:01','2006-02-15 22:13:27'),(3975,146,2,13829,'4.99','2005-08-20 13:50:17','2006-02-15 22:13:27'),(3976,146,2,14143,'2.99','2005-08-21 02:10:32','2006-02-15 22:13:27'),(3977,146,1,15842,'6.99','2005-08-23 15:36:05','2006-02-15 22:13:27'),(3978,147,1,362,'0.99','2005-05-27 07:10:25','2006-02-15 22:13:27'),(3979,147,1,509,'0.99','2005-05-28 02:51:12','2006-02-15 22:13:27'),(3980,147,1,2171,'0.99','2005-06-18 00:06:04','2006-02-15 22:13:27'),(3981,147,1,2456,'6.99','2005-06-18 19:36:50','2006-02-15 22:13:27'),(3982,147,2,2859,'2.99','2005-06-19 23:18:42','2006-02-15 22:13:27'),(3983,147,2,3011,'5.99','2005-06-20 10:39:10','2006-02-15 22:13:27'),(3984,147,2,3919,'7.99','2005-07-06 20:26:21','2006-02-15 22:13:27'),(3985,147,2,3956,'2.99','2005-07-06 22:01:51','2006-02-15 22:13:27'),(3986,147,2,4792,'0.99','2005-07-08 16:29:38','2006-02-15 22:13:27'),(3987,147,2,5044,'0.99','2005-07-09 03:30:25','2006-02-15 22:13:27'),(3988,147,1,5567,'2.99','2005-07-10 03:36:46','2006-02-15 22:13:27'),(3989,147,1,5844,'0.99','2005-07-10 17:14:43','2006-02-15 22:13:27'),(3990,147,2,6343,'0.99','2005-07-11 19:51:35','2006-02-15 22:13:27'),(3991,147,2,6469,'4.99','2005-07-12 01:29:27','2006-02-15 22:13:27'),(3992,147,2,6753,'2.99','2005-07-12 14:55:42','2006-02-15 22:13:27'),(3993,147,2,7044,'0.99','2005-07-27 03:27:29','2006-02-15 22:13:27'),(3994,147,1,7723,'0.99','2005-07-28 04:45:37','2006-02-15 22:13:27'),(3995,147,1,8893,'2.99','2005-07-30 00:48:19','2006-02-15 22:13:27'),(3996,147,2,9772,'0.99','2005-07-31 09:56:07','2006-02-15 22:13:27'),(3997,147,1,10706,'7.99','2005-08-01 18:41:28','2006-02-15 22:13:27'),(3998,147,2,10752,'8.99','2005-08-01 20:08:49','2006-02-15 22:13:27'),(3999,147,1,12284,'4.99','2005-08-18 04:55:49','2006-02-15 22:13:27'),(4000,147,1,12757,'4.99','2005-08-18 22:57:45','2006-02-15 22:13:27'),(4001,147,2,13542,'4.99','2005-08-20 03:41:57','2006-02-15 22:13:27'),(4002,147,2,13670,'3.99','2005-08-20 08:27:01','2006-02-15 22:13:27'),(4003,147,2,14021,'4.99','2005-08-20 21:02:12','2006-02-15 22:13:27'),(4004,147,1,14156,'0.99','2005-08-21 02:35:16','2006-02-15 22:13:27'),(4005,147,2,14641,'0.99','2005-08-21 19:05:23','2006-02-15 22:13:27'),(4006,147,2,14960,'4.99','2005-08-22 06:31:36','2006-02-15 22:13:27'),(4007,147,1,15052,'2.99','2005-08-22 10:09:19','2006-02-15 22:13:27'),(4008,147,2,15331,'4.99','2005-08-22 20:37:57','2006-02-15 22:13:28'),(4009,147,2,15513,'4.99','2005-08-23 03:01:56','2006-02-15 22:13:28'),(4010,147,1,15730,'8.99','2005-08-23 11:32:35','2006-02-15 22:13:28'),(4011,147,2,16004,'6.99','2005-08-23 20:53:20','2006-02-15 22:13:28'),(4012,148,1,682,'4.99','2005-05-28 23:53:18','2006-02-15 22:13:28'),(4013,148,1,1501,'1.99','2005-06-15 22:02:35','2006-02-15 22:13:28'),(4014,148,2,1517,'6.99','2005-06-15 23:20:26','2006-02-15 22:13:28'),(4015,148,2,2751,'3.99','2005-06-19 16:39:23','2006-02-15 22:13:28'),(4016,148,2,2843,'3.99','2005-06-19 22:36:39','2006-02-15 22:13:28'),(4017,148,2,2847,'5.99','2005-06-19 22:54:01','2006-02-15 22:13:28'),(4018,148,1,3653,'0.99','2005-07-06 07:45:13','2006-02-15 22:13:28'),(4019,148,1,4080,'0.99','2005-07-07 05:09:54','2006-02-15 22:13:28'),(4020,148,1,4746,'2.99','2005-07-08 13:47:55','2006-02-15 22:13:28'),(4021,148,1,4950,'2.99','2005-07-08 22:58:07','2006-02-15 22:13:28'),(4022,148,1,5034,'4.99','2005-07-09 02:48:15','2006-02-15 22:13:28'),(4023,148,1,5372,'4.99','2005-07-09 18:48:39','2006-02-15 22:13:28'),(4024,148,1,6169,'1.99','2005-07-11 10:25:56','2006-02-15 22:13:28'),(4025,148,1,6640,'8.99','2005-07-12 10:27:19','2006-02-15 22:13:28'),(4026,148,2,6793,'10.99','2005-07-12 16:37:55','2006-02-15 22:13:28'),(4027,148,1,7656,'0.99','2005-07-28 02:07:19','2006-02-15 22:13:28'),(4028,148,2,7693,'4.99','2005-07-28 03:31:22','2006-02-15 22:13:28'),(4029,148,1,7865,'9.99','2005-07-28 10:07:04','2006-02-15 22:13:28'),(4030,148,2,8111,'4.99','2005-07-28 19:10:03','2006-02-15 22:13:28'),(4031,148,2,8331,'3.99','2005-07-29 04:13:29','2006-02-15 22:13:28'),(4032,148,1,8394,'4.99','2005-07-29 06:02:14','2006-02-15 22:13:28'),(4033,148,2,8578,'4.99','2005-07-29 11:58:14','2006-02-15 22:13:28'),(4034,148,2,8626,'4.99','2005-07-29 14:03:20','2006-02-15 22:13:28'),(4035,148,1,9023,'5.99','2005-07-30 05:36:40','2006-02-15 22:13:28'),(4036,148,1,9106,'2.99','2005-07-30 08:52:34','2006-02-15 22:13:28'),(4037,148,1,9530,'1.99','2005-07-31 01:09:06','2006-02-15 22:13:28'),(4038,148,1,9594,'4.99','2005-07-31 03:23:52','2006-02-15 22:13:28'),(4039,148,2,10067,'4.99','2005-07-31 19:37:58','2006-02-15 22:13:28'),(4040,148,2,10830,'6.99','2005-08-01 23:18:06','2006-02-15 22:13:28'),(4041,148,1,11357,'10.99','2005-08-02 17:42:49','2006-02-15 22:13:28'),(4042,148,1,12029,'2.99','2005-08-17 20:07:01','2006-02-15 22:13:28'),(4043,148,2,12038,'0.99','2005-08-17 20:28:26','2006-02-15 22:13:28'),(4044,148,2,12512,'3.99','2005-08-18 13:28:27','2006-02-15 22:13:28'),(4045,148,1,12944,'6.99','2005-08-19 05:48:12','2006-02-15 22:13:28'),(4046,148,1,12983,'6.99','2005-08-19 07:06:51','2006-02-15 22:13:29'),(4047,148,1,14055,'0.99','2005-08-20 22:18:00','2006-02-15 22:13:29'),(4048,148,1,14155,'4.99','2005-08-21 02:31:35','2006-02-15 22:13:29'),(4049,148,2,14184,'6.99','2005-08-21 03:24:50','2006-02-15 22:13:29'),(4050,148,2,14629,'2.99','2005-08-21 18:39:52','2006-02-15 22:13:29'),(4051,148,2,14713,'0.99','2005-08-21 21:27:24','2006-02-15 22:13:29'),(4052,148,2,14879,'5.99','2005-08-22 03:42:12','2006-02-15 22:13:29'),(4053,148,2,14965,'2.99','2005-08-22 06:45:53','2006-02-15 22:13:29'),(4054,148,2,15237,'4.99','2005-08-22 17:44:30','2006-02-15 22:13:29'),(4055,148,2,15379,'8.99','2005-08-22 22:26:13','2006-02-15 22:13:29'),(4056,148,1,15541,'3.99','2005-08-23 04:13:53','2006-02-15 22:13:29'),(4057,148,2,15586,'3.99','2005-08-23 05:57:04','2006-02-15 22:13:29'),(4058,149,1,764,'4.99','2005-05-29 11:37:35','2006-02-15 22:13:29'),(4059,149,2,1521,'2.99','2005-06-15 23:58:53','2006-02-15 22:13:29'),(4060,149,1,1800,'2.99','2005-06-16 20:18:46','2006-02-15 22:13:29'),(4061,149,2,1996,'6.99','2005-06-17 11:17:45','2006-02-15 22:13:29'),(4062,149,2,2194,'4.99','2005-06-18 01:41:37','2006-02-15 22:13:29'),(4063,149,1,2305,'5.99','2005-06-18 08:31:18','2006-02-15 22:13:29'),(4064,149,2,2383,'7.99','2005-06-18 15:17:59','2006-02-15 22:13:29'),(4065,149,1,2752,'0.99','2005-06-19 16:44:18','2006-02-15 22:13:29'),(4066,149,1,3894,'2.99','2005-07-06 19:01:39','2006-02-15 22:13:29'),(4067,149,1,3939,'6.99','2005-07-06 21:16:32','2006-02-15 22:13:29'),(4068,149,1,4766,'3.99','2005-07-08 15:16:04','2006-02-15 22:13:29'),(4069,149,1,4837,'0.99','2005-07-08 18:09:12','2006-02-15 22:13:29'),(4070,149,1,5091,'2.99','2005-07-09 05:52:54','2006-02-15 22:13:29'),(4071,149,1,5298,'10.99','2005-07-09 15:36:17','2006-02-15 22:13:29'),(4072,149,1,6356,'4.99','2005-07-11 20:57:48','2006-02-15 22:13:29'),(4073,149,2,6940,'5.99','2005-07-26 23:18:35','2006-02-15 22:13:29'),(4074,149,2,7559,'4.99','2005-07-27 22:20:03','2006-02-15 22:13:29'),(4075,149,1,7989,'6.99','2005-07-28 14:39:05','2006-02-15 22:13:29'),(4076,149,2,10154,'2.99','2005-07-31 22:30:49','2006-02-15 22:13:29'),(4077,149,2,10737,'7.99','2005-08-01 19:31:24','2006-02-15 22:13:29'),(4078,149,2,10967,'0.99','2005-08-02 04:02:16','2006-02-15 22:13:29'),(4079,149,1,11561,'2.99','2005-08-17 01:23:09','2006-02-15 22:13:29'),(4080,149,1,12000,'4.99','2005-08-17 18:49:44','2006-02-15 22:13:29'),(4081,149,1,14771,'3.99','2005-08-21 23:50:15','2006-02-15 22:13:29'),(4082,149,2,15479,'4.99','2005-08-23 01:50:53','2006-02-15 22:13:29'),(4083,149,2,15562,'2.99','2005-08-23 05:04:33','2006-02-15 22:13:29'),(4084,150,1,422,'3.99','2005-05-27 15:31:55','2006-02-15 22:13:29'),(4085,150,1,609,'2.99','2005-05-28 15:04:02','2006-02-15 22:13:29'),(4086,150,1,995,'3.99','2005-05-31 00:06:02','2006-02-15 22:13:29'),(4087,150,2,3187,'1.99','2005-06-20 23:06:07','2006-02-15 22:13:29'),(4088,150,1,3456,'5.99','2005-06-21 21:19:47','2006-02-15 22:13:29'),(4089,150,1,4271,'6.99','2005-07-07 14:38:52','2006-02-15 22:13:29'),(4090,150,1,6633,'2.99','2005-07-12 09:35:42','2006-02-15 22:13:29'),(4091,150,2,7690,'4.99','2005-07-28 03:26:21','2006-02-15 22:13:30'),(4092,150,1,9121,'2.99','2005-07-30 09:36:26','2006-02-15 22:13:30'),(4093,150,1,10686,'2.99','2005-08-01 17:51:21','2006-02-15 22:13:30'),(4094,150,2,11123,'2.99','2005-08-02 08:54:17','2006-02-15 22:13:30'),(4095,150,2,11789,'6.99','2005-08-17 10:59:24','2006-02-15 22:13:30'),(4096,150,2,12260,'6.99','2005-08-18 04:15:43','2006-02-15 22:13:30'),(4097,150,2,12335,'2.99','2005-08-18 06:59:15','2006-02-15 22:13:30'),(4098,150,2,12627,'2.99','2005-08-18 17:37:11','2006-02-15 22:13:30'),(4099,150,1,12887,'1.99','2005-08-19 03:38:54','2006-02-15 22:13:30'),(4100,150,2,12890,'0.99','2005-08-19 03:42:08','2006-02-15 22:13:30'),(4101,150,1,13116,'6.99','2005-08-19 11:31:41','2006-02-15 22:13:30'),(4102,150,2,13255,'8.99','2005-08-19 16:54:12','2006-02-15 22:13:30'),(4103,150,1,13372,'2.99','2005-08-19 21:23:19','2006-02-15 22:13:30'),(4104,150,2,13599,'5.99','2005-08-20 06:00:03','2006-02-15 22:13:30'),(4105,150,2,14165,'0.99','2005-08-21 02:59:17','2006-02-15 22:13:30'),(4106,150,2,14454,'2.99','2005-08-21 12:35:49','2006-02-15 22:13:30'),(4107,150,2,14520,'9.99','2005-08-21 15:00:49','2006-02-15 22:13:30'),(4108,150,1,14663,'0.99','2005-08-21 19:47:55','2006-02-15 22:13:30'),(4109,151,2,164,'4.99','2005-05-26 02:26:49','2006-02-15 22:13:30'),(4110,151,2,418,'5.99','2005-05-27 15:13:17','2006-02-15 22:13:30'),(4111,151,2,2474,'2.99','2005-06-18 20:51:34','2006-02-15 22:13:30'),(4112,151,2,2947,'2.99','2005-06-20 06:00:21','2006-02-15 22:13:30'),(4113,151,1,3017,'3.99','2005-06-20 11:08:56','2006-02-15 22:13:30'),(4114,151,2,3089,'0.99','2005-06-20 15:57:01','2006-02-15 22:13:30'),(4115,151,2,3390,'2.99','2005-06-21 15:10:50','2006-02-15 22:13:30'),(4116,151,1,4376,'2.99','2005-07-07 20:24:33','2006-02-15 22:13:30'),(4117,151,2,6720,'0.99','2005-07-12 13:41:16','2006-02-15 22:13:30'),(4118,151,2,6768,'3.99','2005-07-12 15:47:51','2006-02-15 22:13:30'),(4119,151,2,6854,'0.99','2005-07-12 19:38:57','2006-02-15 22:13:30'),(4120,151,1,7189,'0.99','2005-07-27 08:35:02','2006-02-15 22:13:30'),(4121,151,2,7332,'3.99','2005-07-27 13:58:57','2006-02-15 22:13:30'),(4122,151,1,9253,'4.99','2005-07-30 14:20:12','2006-02-15 22:13:30'),(4123,151,1,9890,'4.99','2005-07-31 14:04:44','2006-02-15 22:13:30'),(4124,151,1,9969,'2.99','2005-07-31 16:38:12','2006-02-15 22:13:30'),(4125,151,1,10078,'2.99','2005-07-31 20:02:02','2006-02-15 22:13:30'),(4126,151,1,10311,'4.99','2005-08-01 04:27:59','2006-02-15 22:13:30'),(4127,151,1,10662,'2.99','2005-08-01 16:50:57','2006-02-15 22:13:30'),(4128,151,2,11714,'2.99','2005-08-17 07:34:55','2006-02-15 22:13:30'),(4129,151,2,13230,'0.99','2005-08-19 16:12:07','2006-02-15 22:13:30'),(4130,151,1,13568,'5.99','2005-08-20 05:02:46','2006-02-15 22:13:30'),(4131,151,1,14856,'4.99','2005-08-22 02:31:51','2006-02-15 22:13:30'),(4132,151,2,14922,'3.99','2005-08-22 05:13:05','2006-02-15 22:13:30'),(4133,151,1,15227,'4.99','2005-08-22 17:22:41','2006-02-15 22:13:30'),(4134,151,1,15926,'2.99','2005-08-23 18:20:56','2006-02-15 22:13:31'),(4135,151,2,15996,'2.99','2005-08-23 20:31:38','2006-02-15 22:13:31'),(4136,152,2,359,'4.99','2005-05-27 06:48:33','2006-02-15 22:13:31'),(4137,152,1,745,'4.99','2005-05-29 09:22:57','2006-02-15 22:13:31'),(4138,152,1,2882,'4.99','2005-06-20 01:26:26','2006-02-15 22:13:31'),(4139,152,2,3577,'2.99','2005-07-06 03:40:36','2006-02-15 22:13:31'),(4140,152,1,3786,'7.99','2005-07-06 14:00:41','2006-02-15 22:13:31'),(4141,152,1,4974,'4.99','2005-07-09 00:00:36','2006-02-15 22:13:31'),(4142,152,1,6273,'0.99','2005-07-11 16:08:41','2006-02-15 22:13:31'),(4143,152,1,6612,'2.99','2005-07-12 08:28:33','2006-02-15 22:13:31'),(4144,152,1,9010,'5.99','2005-07-30 05:12:04','2006-02-15 22:13:31'),(4145,152,1,10320,'6.99','2005-08-01 04:39:26','2006-02-15 22:13:31'),(4146,152,2,11638,'6.99','2005-08-17 04:39:09','2006-02-15 22:13:31'),(4147,152,2,11783,'0.99','2005-08-17 10:39:24','2006-02-15 22:13:31'),(4148,152,1,12697,'2.99','2005-08-18 20:14:56','2006-02-15 22:13:31'),(4149,152,1,12917,'4.99','2005-08-19 04:27:11','2006-02-15 22:13:31'),(4150,152,2,12960,'1.99','2005-08-19 06:21:52','2006-02-15 22:13:31'),(4151,152,1,13204,'4.99','2005-08-19 15:02:48','2006-02-15 22:13:31'),(4152,152,2,13484,'0.99','2005-08-20 01:16:52','2006-02-15 22:13:31'),(4153,152,1,13986,'0.99','2005-08-20 19:13:23','2006-02-15 22:13:31'),(4154,152,1,14173,'0.99','2005-08-21 03:01:01','2006-02-15 22:13:31'),(4155,152,2,14668,'4.99','2005-08-21 19:51:30','2006-02-15 22:13:31'),(4156,152,2,11848,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:31'),(4157,153,1,2224,'0.99','2005-06-18 03:33:58','2006-02-15 22:13:31'),(4158,153,1,2649,'0.99','2005-06-19 10:20:09','2006-02-15 22:13:31'),(4159,153,1,2893,'4.99','2005-06-20 02:22:08','2006-02-15 22:13:31'),(4160,153,1,2945,'5.99','2005-06-20 05:49:27','2006-02-15 22:13:31'),(4161,153,1,3795,'0.99','2005-07-06 14:37:41','2006-02-15 22:13:31'),(4162,153,1,3949,'0.99','2005-07-06 21:46:36','2006-02-15 22:13:31'),(4163,153,1,4194,'5.99','2005-07-07 10:59:39','2006-02-15 22:13:31'),(4164,153,2,4670,'5.99','2005-07-08 10:14:18','2006-02-15 22:13:31'),(4165,153,2,5676,'0.99','2005-07-10 08:38:32','2006-02-15 22:13:31'),(4166,153,2,5771,'0.99','2005-07-10 13:26:45','2006-02-15 22:13:31'),(4167,153,2,6818,'9.99','2005-07-12 18:20:54','2006-02-15 22:13:31'),(4168,153,2,7824,'7.99','2005-07-28 08:34:47','2006-02-15 22:13:31'),(4169,153,2,9936,'0.99','2005-07-31 15:27:41','2006-02-15 22:13:31'),(4170,153,2,10015,'4.99','2005-07-31 18:11:17','2006-02-15 22:13:31'),(4171,153,2,11368,'4.99','2005-08-02 18:03:05','2006-02-15 22:13:31'),(4172,153,1,12103,'1.99','2005-08-17 22:49:09','2006-02-15 22:13:31'),(4173,153,1,12439,'3.99','2005-08-18 10:44:57','2006-02-15 22:13:31'),(4174,153,1,12882,'4.99','2005-08-19 03:33:46','2006-02-15 22:13:31'),(4175,153,1,14664,'4.99','2005-08-21 19:48:47','2006-02-15 22:13:31'),(4176,153,1,14747,'4.99','2005-08-21 23:00:02','2006-02-15 22:13:31'),(4177,153,1,14944,'4.99','2005-08-22 06:01:26','2006-02-15 22:13:31'),(4178,153,2,15267,'0.99','2005-08-22 18:37:48','2006-02-15 22:13:31'),(4179,153,2,15444,'7.99','2005-08-23 00:46:52','2006-02-15 22:13:32'),(4180,153,1,15593,'1.99','2005-08-23 06:15:09','2006-02-15 22:13:32'),(4181,154,1,469,'5.99','2005-05-27 21:14:26','2006-02-15 22:13:32'),(4182,154,2,865,'7.99','2005-05-30 03:39:44','2006-02-15 22:13:32'),(4183,154,2,978,'5.99','2005-05-30 21:30:52','2006-02-15 22:13:32'),(4184,154,1,1963,'0.99','2005-06-17 09:09:31','2006-02-15 22:13:32'),(4185,154,1,2886,'4.99','2005-06-20 01:38:39','2006-02-15 22:13:32'),(4186,154,1,2985,'2.99','2005-06-20 08:45:08','2006-02-15 22:13:32'),(4187,154,2,3806,'7.99','2005-07-06 15:09:41','2006-02-15 22:13:32'),(4188,154,2,3912,'0.99','2005-07-06 20:10:03','2006-02-15 22:13:32'),(4189,154,2,4132,'4.99','2005-07-07 08:06:07','2006-02-15 22:13:32'),(4190,154,1,4252,'2.99','2005-07-07 14:13:05','2006-02-15 22:13:32'),(4191,154,1,4850,'5.99','2005-07-08 18:39:31','2006-02-15 22:13:32'),(4192,154,1,5101,'0.99','2005-07-09 06:21:29','2006-02-15 22:13:32'),(4193,154,2,5760,'2.99','2005-07-10 12:44:48','2006-02-15 22:13:32'),(4194,154,1,6048,'0.99','2005-07-11 03:32:23','2006-02-15 22:13:32'),(4195,154,2,6993,'4.99','2005-07-27 01:05:24','2006-02-15 22:13:32'),(4196,154,1,7055,'4.99','2005-07-27 03:45:42','2006-02-15 22:13:32'),(4197,154,1,7156,'4.99','2005-07-27 07:19:34','2006-02-15 22:13:32'),(4198,154,2,7900,'1.99','2005-07-28 11:11:33','2006-02-15 22:13:32'),(4199,154,2,8334,'7.99','2005-07-29 04:18:25','2006-02-15 22:13:32'),(4200,154,2,9286,'2.99','2005-07-30 15:32:28','2006-02-15 22:13:32'),(4201,154,1,10278,'6.99','2005-08-01 03:25:27','2006-02-15 22:13:32'),(4202,154,1,10851,'4.99','2005-08-01 23:58:45','2006-02-15 22:13:32'),(4203,154,1,11296,'5.99','2005-08-02 15:15:27','2006-02-15 22:13:32'),(4204,154,1,12341,'0.99','2005-08-18 07:09:27','2006-02-15 22:13:32'),(4205,154,2,13861,'4.99','2005-08-20 14:56:53','2006-02-15 22:13:32'),(4206,154,2,14731,'2.99','2005-08-21 22:21:49','2006-02-15 22:13:32'),(4207,154,2,14793,'7.99','2005-08-22 00:37:57','2006-02-15 22:13:32'),(4208,154,1,14918,'6.99','2005-08-22 05:06:38','2006-02-15 22:13:32'),(4209,154,1,15351,'0.99','2005-08-22 21:15:46','2006-02-15 22:13:32'),(4210,154,1,15721,'2.99','2005-08-23 11:16:16','2006-02-15 22:13:32'),(4211,155,1,568,'2.99','2005-05-28 09:57:36','2006-02-15 22:13:32'),(4212,155,2,1519,'1.99','2005-06-15 23:55:27','2006-02-15 22:13:32'),(4213,155,1,1554,'7.99','2005-06-16 02:16:47','2006-02-15 22:13:32'),(4214,155,1,2028,'7.99','2005-06-17 13:08:08','2006-02-15 22:13:32'),(4215,155,1,2869,'4.99','2005-06-20 00:09:25','2006-02-15 22:13:32'),(4216,155,2,3405,'4.99','2005-06-21 15:58:25','2006-02-15 22:13:32'),(4217,155,1,5128,'1.99','2005-07-09 07:25:54','2006-02-15 22:13:32'),(4218,155,1,6066,'5.99','2005-07-11 04:32:42','2006-02-15 22:13:32'),(4219,155,1,6085,'4.99','2005-07-11 05:24:36','2006-02-15 22:13:32'),(4220,155,2,6087,'4.99','2005-07-11 05:29:22','2006-02-15 22:13:32'),(4221,155,1,6443,'2.99','2005-07-12 00:35:51','2006-02-15 22:13:32'),(4222,155,1,7077,'3.99','2005-07-27 04:13:02','2006-02-15 22:13:33'),(4223,155,1,7492,'2.99','2005-07-27 19:54:18','2006-02-15 22:13:33'),(4224,155,2,7730,'5.99','2005-07-28 04:59:48','2006-02-15 22:13:33'),(4225,155,2,9781,'7.99','2005-07-31 10:13:02','2006-02-15 22:13:33'),(4226,155,1,10098,'0.99','2005-07-31 20:41:17','2006-02-15 22:13:33'),(4227,155,1,11033,'4.99','2005-08-02 05:54:17','2006-02-15 22:13:33'),(4228,155,2,11951,'5.99','2005-08-17 17:14:02','2006-02-15 22:13:33'),(4229,155,1,14324,'8.99','2005-08-21 08:10:56','2006-02-15 22:13:33'),(4230,155,2,14549,'2.99','2005-08-21 15:54:21','2006-02-15 22:13:33'),(4231,155,1,14753,'2.99','2005-08-21 23:11:43','2006-02-15 22:13:33'),(4232,155,2,14909,'0.99','2005-08-22 04:48:44','2006-02-15 22:13:33'),(4233,155,1,15106,'0.99','2005-08-22 12:01:48','2006-02-15 22:13:33'),(4234,155,2,11496,'7.98','2006-02-14 15:16:03','2006-02-15 22:13:33'),(4235,155,1,12352,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:33'),(4236,156,2,899,'6.99','2005-05-30 09:29:30','2006-02-15 22:13:33'),(4237,156,1,1052,'4.99','2005-05-31 07:07:03','2006-02-15 22:13:33'),(4238,156,2,2089,'9.99','2005-06-17 17:45:09','2006-02-15 22:13:33'),(4239,156,2,2221,'0.99','2005-06-18 03:24:56','2006-02-15 22:13:33'),(4240,156,1,2658,'4.99','2005-06-19 10:43:42','2006-02-15 22:13:33'),(4241,156,1,2782,'0.99','2005-06-19 18:25:07','2006-02-15 22:13:33'),(4242,156,2,4394,'2.99','2005-07-07 21:12:45','2006-02-15 22:13:33'),(4243,156,2,5534,'4.99','2005-07-10 02:26:49','2006-02-15 22:13:33'),(4244,156,1,5828,'2.99','2005-07-10 16:27:25','2006-02-15 22:13:33'),(4245,156,2,5908,'0.99','2005-07-10 20:44:14','2006-02-15 22:13:33'),(4246,156,2,6540,'6.99','2005-07-12 04:51:13','2006-02-15 22:13:33'),(4247,156,2,7389,'2.99','2005-07-27 15:56:15','2006-02-15 22:13:33'),(4248,156,2,7822,'4.99','2005-07-28 08:31:45','2006-02-15 22:13:33'),(4249,156,1,9409,'6.99','2005-07-30 20:33:53','2006-02-15 22:13:33'),(4250,156,1,9696,'0.99','2005-07-31 07:13:46','2006-02-15 22:13:33'),(4251,156,2,10309,'6.99','2005-08-01 04:24:18','2006-02-15 22:13:33'),(4252,156,2,11490,'2.99','2005-08-02 22:36:00','2006-02-15 22:13:33'),(4253,156,1,11587,'5.99','2005-08-17 02:21:03','2006-02-15 22:13:33'),(4254,156,2,13530,'0.99','2005-08-20 03:12:43','2006-02-15 22:13:33'),(4255,156,2,13531,'2.99','2005-08-20 03:26:10','2006-02-15 22:13:33'),(4256,156,2,13802,'2.99','2005-08-20 12:44:53','2006-02-15 22:13:33'),(4257,156,1,14794,'1.99','2005-08-22 00:39:31','2006-02-15 22:13:33'),(4258,156,2,14831,'4.99','2005-08-22 01:40:49','2006-02-15 22:13:33'),(4259,156,1,14914,'0.99','2005-08-22 04:53:35','2006-02-15 22:13:33'),(4260,156,1,15408,'6.99','2005-08-22 23:26:32','2006-02-15 22:13:33'),(4261,157,2,352,'0.99','2005-05-27 05:48:19','2006-02-15 22:13:33'),(4262,157,1,642,'4.99','2005-05-28 18:49:12','2006-02-15 22:13:33'),(4263,157,2,2340,'0.99','2005-06-18 11:30:56','2006-02-15 22:13:33'),(4264,157,1,3739,'0.99','2005-07-06 11:54:18','2006-02-15 22:13:33'),(4265,157,1,4253,'5.99','2005-07-07 14:13:13','2006-02-15 22:13:33'),(4266,157,2,4435,'3.99','2005-07-07 22:51:04','2006-02-15 22:13:34'),(4267,157,1,4919,'0.99','2005-07-08 21:41:54','2006-02-15 22:13:34'),(4268,157,1,5862,'4.99','2005-07-10 18:20:48','2006-02-15 22:13:34'),(4269,157,1,7110,'2.99','2005-07-27 05:30:48','2006-02-15 22:13:34'),(4270,157,2,7195,'2.99','2005-07-27 08:47:01','2006-02-15 22:13:34'),(4271,157,2,7499,'4.99','2005-07-27 20:10:28','2006-02-15 22:13:34'),(4272,157,2,8163,'0.99','2005-07-28 21:11:48','2006-02-15 22:13:34'),(4273,157,2,8337,'0.99','2005-07-29 04:31:55','2006-02-15 22:13:34'),(4274,157,2,8347,'0.99','2005-07-29 04:49:25','2006-02-15 22:13:34'),(4275,157,2,8576,'4.99','2005-07-29 11:55:01','2006-02-15 22:13:34'),(4276,157,1,8707,'0.99','2005-07-29 17:21:58','2006-02-15 22:13:34'),(4277,157,1,8827,'4.99','2005-07-29 22:31:24','2006-02-15 22:13:34'),(4278,157,2,9237,'2.99','2005-07-30 13:48:17','2006-02-15 22:13:34'),(4279,157,2,9264,'4.99','2005-07-30 14:51:36','2006-02-15 22:13:34'),(4280,157,1,9958,'2.99','2005-07-31 16:03:56','2006-02-15 22:13:34'),(4281,157,1,10203,'4.99','2005-08-01 00:45:27','2006-02-15 22:13:34'),(4282,157,2,11249,'4.99','2005-08-02 13:35:40','2006-02-15 22:13:34'),(4283,157,2,11335,'4.99','2005-08-02 16:57:37','2006-02-15 22:13:34'),(4284,157,1,12213,'5.99','2005-08-18 02:33:55','2006-02-15 22:13:34'),(4285,157,1,12464,'6.99','2005-08-18 11:33:34','2006-02-15 22:13:34'),(4286,157,1,12916,'0.99','2005-08-19 04:27:05','2006-02-15 22:13:34'),(4287,157,1,13097,'4.99','2005-08-19 10:50:43','2006-02-15 22:13:34'),(4288,157,1,13214,'4.99','2005-08-19 15:31:06','2006-02-15 22:13:34'),(4289,157,1,13481,'6.99','2005-08-20 01:11:12','2006-02-15 22:13:34'),(4290,157,1,13728,'2.99','2005-08-20 10:11:07','2006-02-15 22:13:34'),(4291,157,2,14974,'4.99','2005-08-22 07:04:25','2006-02-15 22:13:34'),(4292,158,2,245,'4.99','2005-05-26 13:46:59','2006-02-15 22:13:34'),(4293,158,1,293,'5.99','2005-05-26 20:27:02','2006-02-15 22:13:34'),(4294,158,1,1380,'0.99','2005-06-15 15:13:10','2006-02-15 22:13:34'),(4295,158,2,1790,'4.99','2005-06-16 19:58:40','2006-02-15 22:13:34'),(4296,158,2,2035,'6.99','2005-06-17 13:45:09','2006-02-15 22:13:34'),(4297,158,2,3203,'8.99','2005-06-21 00:34:56','2006-02-15 22:13:34'),(4298,158,1,4117,'8.99','2005-07-07 06:58:14','2006-02-15 22:13:34'),(4299,158,1,5672,'2.99','2005-07-10 08:19:38','2006-02-15 22:13:34'),(4300,158,1,5988,'4.99','2005-07-11 00:55:38','2006-02-15 22:13:34'),(4301,158,1,6416,'2.99','2005-07-11 23:29:14','2006-02-15 22:13:34'),(4302,158,2,6901,'5.99','2005-07-12 21:46:33','2006-02-15 22:13:34'),(4303,158,2,7159,'2.99','2005-07-27 07:24:00','2006-02-15 22:13:34'),(4304,158,1,7732,'0.99','2005-07-28 05:03:32','2006-02-15 22:13:34'),(4305,158,2,7952,'2.99','2005-07-28 13:23:49','2006-02-15 22:13:34'),(4306,158,1,8750,'2.99','2005-07-29 19:14:21','2006-02-15 22:13:34'),(4307,158,1,8957,'1.99','2005-07-30 03:34:10','2006-02-15 22:13:34'),(4308,158,1,9393,'2.99','2005-07-30 20:04:48','2006-02-15 22:13:34'),(4309,158,1,9713,'1.99','2005-07-31 08:13:28','2006-02-15 22:13:35'),(4310,158,1,9801,'2.99','2005-07-31 11:03:13','2006-02-15 22:13:35'),(4311,158,2,11077,'4.99','2005-08-02 07:26:43','2006-02-15 22:13:35'),(4312,158,1,11103,'6.99','2005-08-02 08:09:54','2006-02-15 22:13:35'),(4313,158,1,11272,'0.99','2005-08-02 14:20:27','2006-02-15 22:13:35'),(4314,158,1,11420,'2.99','2005-08-02 19:47:56','2006-02-15 22:13:35'),(4315,158,2,12070,'1.99','2005-08-17 21:46:47','2006-02-15 22:13:35'),(4316,158,2,12421,'5.99','2005-08-18 10:04:06','2006-02-15 22:13:35'),(4317,158,2,13212,'1.99','2005-08-19 15:24:07','2006-02-15 22:13:35'),(4318,158,2,13854,'2.99','2005-08-20 14:48:42','2006-02-15 22:13:35'),(4319,158,1,13926,'2.99','2005-08-20 17:09:27','2006-02-15 22:13:35'),(4320,158,2,14028,'0.99','2005-08-20 21:23:03','2006-02-15 22:13:35'),(4321,158,1,15763,'2.99','2005-08-23 13:02:59','2006-02-15 22:13:35'),(4322,158,1,15796,'5.99','2005-08-23 14:12:22','2006-02-15 22:13:35'),(4323,158,1,15802,'5.99','2005-08-23 14:26:51','2006-02-15 22:13:35'),(4324,159,2,475,'2.99','2005-05-27 22:16:26','2006-02-15 22:13:35'),(4325,159,2,549,'1.99','2005-05-28 07:35:37','2006-02-15 22:13:35'),(4326,159,1,598,'0.99','2005-05-28 14:04:50','2006-02-15 22:13:35'),(4327,159,1,832,'3.99','2005-05-29 22:51:20','2006-02-15 22:13:35'),(4328,159,1,1695,'0.99','2005-06-16 12:40:28','2006-02-15 22:13:35'),(4329,159,1,2572,'0.99','2005-06-19 04:21:26','2006-02-15 22:13:35'),(4330,159,2,3914,'5.99','2005-07-06 20:11:10','2006-02-15 22:13:35'),(4331,159,2,4273,'4.99','2005-07-07 14:40:22','2006-02-15 22:13:35'),(4332,159,2,5656,'0.99','2005-07-10 07:31:07','2006-02-15 22:13:35'),(4333,159,2,6885,'4.99','2005-07-12 20:56:04','2006-02-15 22:13:35'),(4334,159,2,8212,'2.99','2005-07-28 23:37:23','2006-02-15 22:13:35'),(4335,159,1,8470,'0.99','2005-07-29 08:28:50','2006-02-15 22:13:35'),(4336,159,2,9022,'3.99','2005-07-30 05:34:45','2006-02-15 22:13:35'),(4337,159,2,9132,'0.99','2005-07-30 09:56:00','2006-02-15 22:13:35'),(4338,159,1,9559,'7.99','2005-07-31 02:15:53','2006-02-15 22:13:35'),(4339,159,1,9917,'4.99','2005-07-31 14:55:11','2006-02-15 22:13:35'),(4340,159,2,11225,'4.99','2005-08-02 12:43:27','2006-02-15 22:13:35'),(4341,159,2,13270,'1.99','2005-08-19 17:41:16','2006-02-15 22:13:35'),(4342,159,1,13933,'0.99','2005-08-20 17:17:07','2006-02-15 22:13:35'),(4343,159,2,14575,'8.99','2005-08-21 16:51:34','2006-02-15 22:13:35'),(4344,159,1,15197,'0.99','2005-08-22 16:14:25','2006-02-15 22:13:35'),(4345,160,2,2314,'4.99','2005-06-18 09:03:19','2006-02-15 22:13:35'),(4346,160,1,2465,'2.99','2005-06-18 20:07:02','2006-02-15 22:13:35'),(4347,160,2,2873,'2.99','2005-06-20 00:41:25','2006-02-15 22:13:35'),(4348,160,1,4842,'0.99','2005-07-08 18:21:30','2006-02-15 22:13:35'),(4349,160,1,4908,'5.99','2005-07-08 21:05:44','2006-02-15 22:13:35'),(4350,160,2,6364,'6.99','2005-07-11 21:14:48','2006-02-15 22:13:35'),(4351,160,2,6448,'1.99','2005-07-12 00:45:59','2006-02-15 22:13:36'),(4352,160,2,7500,'0.99','2005-07-27 20:16:03','2006-02-15 22:13:36'),(4353,160,1,8184,'4.99','2005-07-28 22:22:35','2006-02-15 22:13:36'),(4354,160,1,9681,'0.99','2005-07-31 06:42:09','2006-02-15 22:13:36'),(4355,160,2,9758,'2.99','2005-07-31 09:25:38','2006-02-15 22:13:36'),(4356,160,2,10089,'2.99','2005-07-31 20:17:09','2006-02-15 22:13:36'),(4357,160,1,10305,'2.99','2005-08-01 04:16:16','2006-02-15 22:13:36'),(4358,160,2,10788,'0.99','2005-08-01 21:37:10','2006-02-15 22:13:36'),(4359,160,2,10958,'4.99','2005-08-02 03:37:13','2006-02-15 22:13:36'),(4360,160,2,10979,'5.99','2005-08-02 04:16:37','2006-02-15 22:13:36'),(4361,160,2,11154,'2.99','2005-08-02 09:54:50','2006-02-15 22:13:36'),(4362,160,1,11803,'2.99','2005-08-17 11:42:08','2006-02-15 22:13:36'),(4363,160,1,11888,'7.99','2005-08-17 15:04:05','2006-02-15 22:13:36'),(4364,160,2,12334,'2.99','2005-08-18 06:52:36','2006-02-15 22:13:36'),(4365,160,1,12435,'7.99','2005-08-18 10:38:31','2006-02-15 22:13:36'),(4366,160,2,13093,'6.99','2005-08-19 10:46:16','2006-02-15 22:13:36'),(4367,160,1,14868,'4.99','2005-08-22 03:15:01','2006-02-15 22:13:36'),(4368,160,1,15112,'2.99','2005-08-22 12:21:49','2006-02-15 22:13:36'),(4369,160,2,15642,'2.99','2005-08-23 08:09:11','2006-02-15 22:13:36'),(4370,160,1,15962,'4.99','2005-08-23 19:42:04','2006-02-15 22:13:36'),(4371,160,1,16027,'3.99','2005-08-23 21:49:33','2006-02-15 22:13:36'),(4372,161,2,428,'2.99','2005-05-27 16:10:58','2006-02-15 22:13:36'),(4373,161,2,477,'3.99','2005-05-27 22:33:33','2006-02-15 22:13:36'),(4374,161,1,520,'5.99','2005-05-28 03:27:37','2006-02-15 22:13:36'),(4375,161,2,539,'0.99','2005-05-28 06:26:16','2006-02-15 22:13:36'),(4376,161,1,612,'2.99','2005-05-28 15:24:54','2006-02-15 22:13:36'),(4377,161,1,1003,'0.99','2005-05-31 00:48:20','2006-02-15 22:13:36'),(4378,161,1,1856,'2.99','2005-06-17 01:02:00','2006-02-15 22:13:36'),(4379,161,1,3075,'3.99','2005-06-20 14:52:19','2006-02-15 22:13:36'),(4380,161,1,3948,'4.99','2005-07-06 21:45:53','2006-02-15 22:13:36'),(4381,161,2,4187,'0.99','2005-07-07 10:41:31','2006-02-15 22:13:36'),(4382,161,2,4248,'6.99','2005-07-07 13:59:20','2006-02-15 22:13:36'),(4383,161,1,4490,'2.99','2005-07-08 01:26:32','2006-02-15 22:13:36'),(4384,161,2,5349,'6.99','2005-07-09 17:35:35','2006-02-15 22:13:36'),(4385,161,2,6873,'4.99','2005-07-12 20:20:50','2006-02-15 22:13:36'),(4386,161,1,7003,'2.99','2005-07-27 01:32:06','2006-02-15 22:13:36'),(4387,161,2,8774,'4.99','2005-07-29 20:05:04','2006-02-15 22:13:36'),(4388,161,1,9135,'4.99','2005-07-30 10:06:53','2006-02-15 22:13:36'),(4389,161,2,9421,'0.99','2005-07-30 21:08:32','2006-02-15 22:13:36'),(4390,161,1,10241,'5.99','2005-08-01 02:12:25','2006-02-15 22:13:36'),(4391,161,1,10355,'0.99','2005-08-01 05:47:37','2006-02-15 22:13:37'),(4392,161,1,10637,'2.99','2005-08-01 15:44:09','2006-02-15 22:13:37'),(4393,161,1,10863,'6.99','2005-08-02 00:18:07','2006-02-15 22:13:37'),(4394,161,2,10939,'0.99','2005-08-02 03:06:20','2006-02-15 22:13:37'),(4395,161,1,11838,'2.99','2005-08-17 13:06:00','2006-02-15 22:13:37'),(4396,161,2,14150,'0.99','2005-08-21 02:23:03','2006-02-15 22:13:37'),(4397,161,1,14370,'7.99','2005-08-21 09:35:14','2006-02-15 22:13:37'),(4398,161,1,15000,'0.99','2005-08-22 07:54:58','2006-02-15 22:13:37'),(4399,161,2,15045,'5.99','2005-08-22 09:53:23','2006-02-15 22:13:37'),(4400,161,2,15150,'2.99','2005-08-22 14:12:05','2006-02-15 22:13:37'),(4401,161,1,15420,'5.99','2005-08-22 23:55:51','2006-02-15 22:13:37'),(4402,162,1,285,'1.99','2005-05-26 19:41:40','2006-02-15 22:13:37'),(4403,162,1,501,'4.99','2005-05-28 01:09:36','2006-02-15 22:13:37'),(4404,162,1,688,'4.99','2005-05-29 00:45:24','2006-02-15 22:13:37'),(4405,162,2,1339,'4.99','2005-06-15 12:21:56','2006-02-15 22:13:37'),(4406,162,1,2366,'0.99','2005-06-18 13:46:39','2006-02-15 22:13:37'),(4407,162,1,2547,'4.99','2005-06-19 02:44:17','2006-02-15 22:13:37'),(4408,162,1,3040,'0.99','2005-06-20 12:34:13','2006-02-15 22:13:37'),(4409,162,2,3180,'0.99','2005-06-20 22:48:44','2006-02-15 22:13:37'),(4410,162,2,4982,'2.99','2005-07-09 00:30:52','2006-02-15 22:13:37'),(4411,162,2,8478,'4.99','2005-07-29 08:40:36','2006-02-15 22:13:37'),(4412,162,1,8582,'4.99','2005-07-29 12:03:27','2006-02-15 22:13:37'),(4413,162,2,9167,'4.99','2005-07-30 11:30:37','2006-02-15 22:13:37'),(4414,162,1,9726,'7.99','2005-07-31 08:37:07','2006-02-15 22:13:37'),(4415,162,1,9775,'0.99','2005-07-31 10:00:00','2006-02-15 22:13:37'),(4416,162,2,10093,'5.99','2005-07-31 20:30:32','2006-02-15 22:13:37'),(4417,162,2,11012,'0.99','2005-08-02 05:09:42','2006-02-15 22:13:37'),(4418,162,1,13288,'4.99','2005-08-19 18:30:10','2006-02-15 22:13:37'),(4419,162,2,14301,'1.99','2005-08-21 07:19:48','2006-02-15 22:13:37'),(4420,162,1,15332,'4.99','2005-08-22 20:41:53','2006-02-15 22:13:37'),(4421,162,1,14220,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:37'),(4422,163,2,1265,'4.99','2005-06-15 07:00:50','2006-02-15 22:13:37'),(4423,163,2,2000,'2.99','2005-06-17 11:32:30','2006-02-15 22:13:37'),(4424,163,2,2110,'7.99','2005-06-17 19:45:49','2006-02-15 22:13:37'),(4425,163,2,2536,'5.99','2005-06-19 01:41:34','2006-02-15 22:13:37'),(4426,163,1,2994,'6.99','2005-06-20 09:17:05','2006-02-15 22:13:37'),(4427,163,1,3179,'0.99','2005-06-20 22:37:59','2006-02-15 22:13:37'),(4428,163,2,3915,'3.99','2005-07-06 20:16:46','2006-02-15 22:13:37'),(4429,163,1,4126,'1.99','2005-07-07 07:24:11','2006-02-15 22:13:37'),(4430,163,2,5549,'4.99','2005-07-10 02:58:29','2006-02-15 22:13:37'),(4431,163,1,5574,'10.99','2005-07-10 03:54:38','2006-02-15 22:13:37'),(4432,163,1,6109,'0.99','2005-07-11 07:20:57','2006-02-15 22:13:37'),(4433,163,1,6831,'1.99','2005-07-12 18:44:04','2006-02-15 22:13:38'),(4434,163,1,7303,'1.99','2005-07-27 12:54:39','2006-02-15 22:13:38'),(4435,163,1,7403,'2.99','2005-07-27 16:22:09','2006-02-15 22:13:38'),(4436,163,2,8040,'0.99','2005-07-28 16:39:43','2006-02-15 22:13:38'),(4437,163,2,8063,'4.99','2005-07-28 17:15:11','2006-02-15 22:13:38'),(4438,163,2,8403,'4.99','2005-07-29 06:26:39','2006-02-15 22:13:38'),(4439,163,2,10245,'0.99','2005-08-01 02:24:09','2006-02-15 22:13:38'),(4440,163,2,11623,'2.99','2005-08-17 04:15:47','2006-02-15 22:13:38'),(4441,163,2,11940,'4.99','2005-08-17 16:56:28','2006-02-15 22:13:38'),(4442,163,1,12154,'2.99','2005-08-18 00:23:56','2006-02-15 22:13:38'),(4443,163,2,12973,'2.99','2005-08-19 06:48:11','2006-02-15 22:13:38'),(4444,163,2,13543,'7.99','2005-08-20 03:43:13','2006-02-15 22:13:38'),(4445,163,2,14275,'4.99','2005-08-21 06:30:30','2006-02-15 22:13:38'),(4446,163,2,14427,'5.99','2005-08-21 11:26:06','2006-02-15 22:13:38'),(4447,163,1,15520,'8.99','2005-08-23 03:30:45','2006-02-15 22:13:38'),(4448,163,1,15847,'0.99','2005-08-23 15:39:38','2006-02-15 22:13:38'),(4449,163,2,11754,'7.98','2006-02-14 15:16:03','2006-02-15 22:13:38'),(4450,163,1,15282,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:38'),(4451,164,2,1011,'1.99','2005-05-31 02:05:39','2006-02-15 22:13:38'),(4452,164,2,1713,'4.99','2005-06-16 14:28:33','2006-02-15 22:13:38'),(4453,164,2,2589,'2.99','2005-06-19 05:21:27','2006-02-15 22:13:38'),(4454,164,1,3082,'8.99','2005-06-20 15:32:11','2006-02-15 22:13:38'),(4455,164,2,4548,'4.99','2005-07-08 04:21:54','2006-02-15 22:13:38'),(4456,164,1,5895,'3.99','2005-07-10 20:13:19','2006-02-15 22:13:38'),(4457,164,1,6393,'0.99','2005-07-11 22:28:12','2006-02-15 22:13:38'),(4458,164,2,6558,'2.99','2005-07-12 05:16:07','2006-02-15 22:13:38'),(4459,164,1,6637,'4.99','2005-07-12 09:57:39','2006-02-15 22:13:38'),(4460,164,2,6702,'0.99','2005-07-12 12:48:03','2006-02-15 22:13:38'),(4461,164,1,6980,'3.99','2005-07-27 00:50:30','2006-02-15 22:13:38'),(4462,164,1,7227,'6.99','2005-07-27 09:53:43','2006-02-15 22:13:38'),(4463,164,2,8135,'3.99','2005-07-28 20:03:25','2006-02-15 22:13:38'),(4464,164,2,8824,'4.99','2005-07-29 22:22:58','2006-02-15 22:13:38'),(4465,164,2,11175,'2.99','2005-08-02 10:38:47','2006-02-15 22:13:38'),(4466,164,2,13453,'5.99','2005-08-20 00:30:51','2006-02-15 22:13:38'),(4467,165,2,338,'4.99','2005-05-27 03:42:52','2006-02-15 22:13:38'),(4468,165,1,2013,'3.99','2005-06-17 12:03:01','2006-02-15 22:13:38'),(4469,165,2,3195,'2.99','2005-06-21 00:02:10','2006-02-15 22:13:38'),(4470,165,2,3531,'4.99','2005-07-06 01:24:08','2006-02-15 22:13:38'),(4471,165,1,3784,'5.99','2005-07-06 13:57:56','2006-02-15 22:13:38'),(4472,165,2,4304,'0.99','2005-07-07 17:01:19','2006-02-15 22:13:38'),(4473,165,2,4945,'2.99','2005-07-08 22:45:02','2006-02-15 22:13:38'),(4474,165,1,5472,'4.99','2005-07-09 23:16:40','2006-02-15 22:13:38'),(4475,165,2,5658,'4.99','2005-07-10 07:34:08','2006-02-15 22:13:38'),(4476,165,2,5901,'6.99','2005-07-10 20:22:12','2006-02-15 22:13:39'),(4477,165,1,5973,'0.99','2005-07-11 00:09:17','2006-02-15 22:13:39'),(4478,165,1,7074,'2.99','2005-07-27 04:06:24','2006-02-15 22:13:39'),(4479,165,1,8608,'0.99','2005-07-29 13:18:52','2006-02-15 22:13:39'),(4480,165,2,9182,'7.99','2005-07-30 12:06:58','2006-02-15 22:13:39'),(4481,165,2,9685,'4.99','2005-07-31 06:49:18','2006-02-15 22:13:39'),(4482,165,1,10565,'4.99','2005-08-01 13:08:27','2006-02-15 22:13:39'),(4483,165,1,11484,'2.99','2005-08-02 22:28:23','2006-02-15 22:13:39'),(4484,165,2,12643,'4.99','2005-08-18 18:21:06','2006-02-15 22:13:39'),(4485,165,2,15007,'1.99','2005-08-22 08:21:21','2006-02-15 22:13:39'),(4486,165,1,15801,'3.99','2005-08-23 14:26:04','2006-02-15 22:13:39'),(4487,165,2,15834,'5.99','2005-08-23 15:23:50','2006-02-15 22:13:39'),(4488,166,1,662,'1.99','2005-05-28 21:09:31','2006-02-15 22:13:39'),(4489,166,2,1412,'2.99','2005-06-15 17:09:48','2006-02-15 22:13:39'),(4490,166,1,2211,'3.99','2005-06-18 02:29:10','2006-02-15 22:13:39'),(4491,166,1,2874,'5.99','2005-06-20 00:42:26','2006-02-15 22:13:39'),(4492,166,1,3085,'0.99','2005-06-20 15:42:33','2006-02-15 22:13:39'),(4493,166,2,3606,'2.99','2005-07-06 05:28:02','2006-02-15 22:13:39'),(4494,166,1,3642,'2.99','2005-07-06 07:18:20','2006-02-15 22:13:39'),(4495,166,2,4389,'6.99','2005-07-07 20:58:58','2006-02-15 22:13:39'),(4496,166,1,4658,'0.99','2005-07-08 09:51:11','2006-02-15 22:13:39'),(4497,166,1,5184,'4.99','2005-07-09 10:14:34','2006-02-15 22:13:39'),(4498,166,2,5380,'4.99','2005-07-09 19:08:44','2006-02-15 22:13:39'),(4499,166,1,5646,'2.99','2005-07-10 07:08:09','2006-02-15 22:13:39'),(4500,166,1,5855,'7.99','2005-07-10 17:54:06','2006-02-15 22:13:39'),(4501,166,2,6237,'0.99','2005-07-11 14:19:12','2006-02-15 22:13:39'),(4502,166,2,6882,'2.99','2005-07-12 20:50:39','2006-02-15 22:13:39'),(4503,166,1,7581,'2.99','2005-07-27 23:14:35','2006-02-15 22:13:39'),(4504,166,1,8052,'5.99','2005-07-28 16:57:31','2006-02-15 22:13:39'),(4505,166,1,9009,'8.99','2005-07-30 05:12:01','2006-02-15 22:13:39'),(4506,166,2,10422,'7.99','2005-08-01 08:17:11','2006-02-15 22:13:39'),(4507,166,2,12683,'4.99','2005-08-18 19:50:43','2006-02-15 22:13:39'),(4508,166,1,12968,'4.99','2005-08-19 06:38:18','2006-02-15 22:13:39'),(4509,166,2,13582,'4.99','2005-08-20 05:28:11','2006-02-15 22:13:39'),(4510,166,2,13901,'7.99','2005-08-20 16:06:53','2006-02-15 22:13:39'),(4511,166,2,14261,'5.99','2005-08-21 06:07:24','2006-02-15 22:13:39'),(4512,166,2,14281,'2.99','2005-08-21 06:40:48','2006-02-15 22:13:39'),(4513,166,1,15213,'5.99','2005-08-22 16:49:02','2006-02-15 22:13:39'),(4514,166,2,15216,'2.99','2005-08-22 16:57:02','2006-02-15 22:13:39'),(4515,166,2,15806,'1.99','2005-08-23 14:31:50','2006-02-15 22:13:39'),(4516,167,1,280,'2.99','2005-05-26 18:36:58','2006-02-15 22:13:39'),(4517,167,1,365,'2.99','2005-05-27 07:31:20','2006-02-15 22:13:39'),(4518,167,1,927,'4.99','2005-05-30 12:16:40','2006-02-15 22:13:40'),(4519,167,1,1416,'3.99','2005-06-15 17:44:57','2006-02-15 22:13:40'),(4520,167,1,1509,'5.99','2005-06-15 22:35:53','2006-02-15 22:13:40'),(4521,167,2,2381,'5.99','2005-06-18 15:00:30','2006-02-15 22:13:40'),(4522,167,2,3518,'4.99','2005-07-06 00:56:03','2006-02-15 22:13:40'),(4523,167,2,4493,'0.99','2005-07-08 01:40:24','2006-02-15 22:13:40'),(4524,167,2,5131,'0.99','2005-07-09 07:35:03','2006-02-15 22:13:40'),(4525,167,1,5178,'4.99','2005-07-09 09:59:52','2006-02-15 22:13:40'),(4526,167,1,5191,'0.99','2005-07-09 10:26:48','2006-02-15 22:13:40'),(4527,167,1,5413,'4.99','2005-07-09 20:28:42','2006-02-15 22:13:40'),(4528,167,1,5781,'2.99','2005-07-10 13:49:30','2006-02-15 22:13:40'),(4529,167,2,6269,'4.99','2005-07-11 15:58:43','2006-02-15 22:13:40'),(4530,167,1,7608,'4.99','2005-07-28 00:08:36','2006-02-15 22:13:40'),(4531,167,1,8092,'2.99','2005-07-28 18:28:07','2006-02-15 22:13:40'),(4532,167,2,8227,'4.99','2005-07-29 00:02:22','2006-02-15 22:13:40'),(4533,167,1,8318,'2.99','2005-07-29 03:44:30','2006-02-15 22:13:40'),(4534,167,1,8793,'0.99','2005-07-29 20:57:22','2006-02-15 22:13:40'),(4535,167,2,8864,'0.99','2005-07-29 23:52:12','2006-02-15 22:13:40'),(4536,167,2,9563,'4.99','2005-07-31 02:28:39','2006-02-15 22:13:40'),(4537,167,2,10285,'3.99','2005-08-01 03:35:11','2006-02-15 22:13:40'),(4538,167,1,12642,'4.99','2005-08-18 18:19:16','2006-02-15 22:13:40'),(4539,167,2,12717,'4.99','2005-08-18 21:15:40','2006-02-15 22:13:40'),(4540,167,1,12978,'4.99','2005-08-19 06:57:27','2006-02-15 22:13:40'),(4541,167,1,13825,'6.99','2005-08-20 13:43:22','2006-02-15 22:13:40'),(4542,167,1,13870,'1.99','2005-08-20 15:09:16','2006-02-15 22:13:40'),(4543,167,1,15003,'3.99','2005-08-22 08:11:24','2006-02-15 22:13:40'),(4544,167,1,15050,'0.99','2005-08-22 10:07:52','2006-02-15 22:13:40'),(4545,167,2,15478,'0.99','2005-08-23 01:50:31','2006-02-15 22:13:40'),(4546,167,2,15530,'4.99','2005-08-23 03:50:48','2006-02-15 22:13:40'),(4547,167,2,15915,'4.99','2005-08-23 17:52:01','2006-02-15 22:13:40'),(4548,168,2,404,'0.99','2005-05-27 13:31:51','2006-02-15 22:13:40'),(4549,168,1,488,'4.99','2005-05-28 00:07:50','2006-02-15 22:13:40'),(4550,168,2,1222,'4.99','2005-06-15 03:38:49','2006-02-15 22:13:40'),(4551,168,1,3530,'2.99','2005-07-06 01:22:45','2006-02-15 22:13:40'),(4552,168,1,4308,'5.99','2005-07-07 17:29:16','2006-02-15 22:13:40'),(4553,168,2,4363,'5.99','2005-07-07 19:43:28','2006-02-15 22:13:40'),(4554,168,2,4953,'2.99','2005-07-08 23:09:48','2006-02-15 22:13:40'),(4555,168,1,5459,'0.99','2005-07-09 22:43:56','2006-02-15 22:13:40'),(4556,168,1,5907,'5.99','2005-07-10 20:41:41','2006-02-15 22:13:40'),(4557,168,1,6334,'5.99','2005-07-11 19:20:44','2006-02-15 22:13:40'),(4558,168,2,6444,'0.99','2005-07-12 00:36:02','2006-02-15 22:13:40'),(4559,168,2,6809,'3.99','2005-07-12 17:51:54','2006-02-15 22:13:41'),(4560,168,2,8352,'1.99','2005-07-29 04:52:01','2006-02-15 22:13:41'),(4561,168,1,8527,'1.99','2005-07-29 10:21:00','2006-02-15 22:13:41'),(4562,168,2,8659,'6.99','2005-07-29 15:26:31','2006-02-15 22:13:41'),(4563,168,2,8883,'1.99','2005-07-30 00:24:48','2006-02-15 22:13:41'),(4564,168,2,9197,'4.99','2005-07-30 12:31:36','2006-02-15 22:13:41'),(4565,168,1,9418,'4.99','2005-07-30 21:00:52','2006-02-15 22:13:41'),(4566,168,2,9857,'6.99','2005-07-31 13:00:53','2006-02-15 22:13:41'),(4567,168,2,9899,'4.99','2005-07-31 14:12:36','2006-02-15 22:13:41'),(4568,168,2,10270,'0.99','2005-08-01 03:10:24','2006-02-15 22:13:41'),(4569,168,1,11551,'0.99','2005-08-17 01:03:49','2006-02-15 22:13:41'),(4570,168,1,11627,'10.99','2005-08-17 04:25:47','2006-02-15 22:13:41'),(4571,168,1,11631,'1.99','2005-08-17 04:28:56','2006-02-15 22:13:41'),(4572,168,1,12545,'6.99','2005-08-18 14:28:00','2006-02-15 22:13:41'),(4573,168,1,12781,'2.99','2005-08-18 23:50:24','2006-02-15 22:13:41'),(4574,168,1,13018,'8.99','2005-08-19 08:04:50','2006-02-15 22:13:41'),(4575,168,2,13532,'4.99','2005-08-20 03:29:28','2006-02-15 22:13:41'),(4576,168,2,13811,'0.99','2005-08-20 13:00:30','2006-02-15 22:13:41'),(4577,168,1,14090,'2.99','2005-08-21 00:11:16','2006-02-15 22:13:41'),(4578,168,1,15033,'3.99','2005-08-22 09:25:24','2006-02-15 22:13:41'),(4579,168,1,15165,'2.99','2005-08-22 14:59:30','2006-02-15 22:13:41'),(4580,168,2,15683,'2.99','2005-08-23 09:38:17','2006-02-15 22:13:41'),(4581,168,1,15894,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:41'),(4582,169,2,527,'3.99','2005-05-28 04:28:38','2006-02-15 22:13:41'),(4583,169,1,1087,'4.99','2005-05-31 11:18:08','2006-02-15 22:13:41'),(4584,169,1,2023,'4.99','2005-06-17 12:52:58','2006-02-15 22:13:41'),(4585,169,1,3261,'2.99','2005-06-21 04:07:41','2006-02-15 22:13:41'),(4586,169,1,3493,'8.99','2005-07-05 23:46:19','2006-02-15 22:13:41'),(4587,169,1,4687,'4.99','2005-07-08 10:54:19','2006-02-15 22:13:41'),(4588,169,1,5066,'2.99','2005-07-09 04:48:50','2006-02-15 22:13:41'),(4589,169,1,6143,'3.99','2005-07-11 09:02:37','2006-02-15 22:13:41'),(4590,169,2,6453,'4.99','2005-07-12 00:59:53','2006-02-15 22:13:41'),(4591,169,2,6488,'9.99','2005-07-12 02:20:09','2006-02-15 22:13:41'),(4592,169,2,7187,'6.99','2005-07-27 08:27:58','2006-02-15 22:13:41'),(4593,169,1,7597,'0.99','2005-07-27 23:35:49','2006-02-15 22:13:41'),(4594,169,2,8558,'4.99','2005-07-29 11:24:49','2006-02-15 22:13:41'),(4595,169,2,9203,'0.99','2005-07-30 12:43:40','2006-02-15 22:13:41'),(4596,169,2,11687,'5.99','2005-08-17 06:39:59','2006-02-15 22:13:41'),(4597,169,1,11898,'5.99','2005-08-17 15:24:12','2006-02-15 22:13:41'),(4598,169,2,13198,'2.99','2005-08-19 14:47:18','2006-02-15 22:13:41'),(4599,169,2,13237,'1.99','2005-08-19 16:18:36','2006-02-15 22:13:41'),(4600,169,2,14435,'0.99','2005-08-21 11:44:37','2006-02-15 22:13:42'),(4601,169,2,14805,'4.99','2005-08-22 00:52:01','2006-02-15 22:13:42'),(4602,169,2,15534,'0.99','2005-08-23 03:55:54','2006-02-15 22:13:42'),(4603,169,2,15680,'4.99','2005-08-23 09:33:22','2006-02-15 22:13:42'),(4604,170,1,211,'2.99','2005-05-26 08:33:10','2006-02-15 22:13:42'),(4605,170,1,377,'5.99','2005-05-27 09:04:05','2006-02-15 22:13:42'),(4606,170,2,504,'0.99','2005-05-28 02:05:34','2006-02-15 22:13:42'),(4607,170,2,2117,'0.99','2005-06-17 20:24:00','2006-02-15 22:13:42'),(4608,170,2,2413,'8.99','2005-06-18 16:59:34','2006-02-15 22:13:42'),(4609,170,2,3651,'4.99','2005-07-06 07:40:31','2006-02-15 22:13:42'),(4610,170,1,3749,'4.99','2005-07-06 12:18:03','2006-02-15 22:13:42'),(4611,170,2,4113,'4.99','2005-07-07 06:49:52','2006-02-15 22:13:42'),(4612,170,2,4468,'0.99','2005-07-08 00:17:59','2006-02-15 22:13:42'),(4613,170,2,5075,'0.99','2005-07-09 05:12:07','2006-02-15 22:13:42'),(4614,170,1,5573,'4.99','2005-07-10 03:50:47','2006-02-15 22:13:42'),(4615,170,2,5685,'7.99','2005-07-10 09:01:38','2006-02-15 22:13:42'),(4616,170,2,5808,'2.99','2005-07-10 15:17:33','2006-02-15 22:13:42'),(4617,170,1,7999,'7.99','2005-07-28 15:10:14','2006-02-15 22:13:42'),(4618,170,2,9517,'2.99','2005-07-31 00:41:23','2006-02-15 22:13:42'),(4619,170,1,9817,'2.99','2005-07-31 11:33:31','2006-02-15 22:13:42'),(4620,170,1,10102,'9.99','2005-07-31 20:49:10','2006-02-15 22:13:42'),(4621,170,2,10481,'5.99','2005-08-01 10:17:26','2006-02-15 22:13:42'),(4622,170,1,11039,'0.99','2005-08-02 06:00:53','2006-02-15 22:13:42'),(4623,170,2,12706,'3.99','2005-08-18 20:44:34','2006-02-15 22:13:42'),(4624,170,1,12967,'3.99','2005-08-19 06:37:51','2006-02-15 22:13:42'),(4625,170,1,13081,'0.99','2005-08-19 10:19:06','2006-02-15 22:13:42'),(4626,170,2,13862,'6.99','2005-08-20 14:57:01','2006-02-15 22:13:42'),(4627,170,2,14022,'8.99','2005-08-20 21:08:49','2006-02-15 22:13:42'),(4628,170,2,14675,'2.99','2005-08-21 20:01:51','2006-02-15 22:13:42'),(4629,170,1,15549,'7.99','2005-08-23 04:27:06','2006-02-15 22:13:42'),(4630,171,2,804,'9.99','2005-05-29 18:10:24','2006-02-15 22:13:42'),(4631,171,2,1676,'0.99','2005-06-16 11:06:09','2006-02-15 22:13:42'),(4632,171,2,2004,'4.99','2005-06-17 11:43:38','2006-02-15 22:13:42'),(4633,171,2,2199,'5.99','2005-06-18 01:57:56','2006-02-15 22:13:42'),(4634,171,1,2497,'4.99','2005-06-18 22:50:40','2006-02-15 22:13:42'),(4635,171,2,2599,'5.99','2005-06-19 06:06:07','2006-02-15 22:13:42'),(4636,171,2,2788,'2.99','2005-06-19 18:48:11','2006-02-15 22:13:42'),(4637,171,2,3338,'6.99','2005-06-21 10:27:31','2006-02-15 22:13:42'),(4638,171,1,3621,'0.99','2005-07-06 06:03:55','2006-02-15 22:13:42'),(4639,171,2,3745,'2.99','2005-07-06 12:10:32','2006-02-15 22:13:42'),(4640,171,1,5660,'5.99','2005-07-10 07:46:12','2006-02-15 22:13:42'),(4641,171,1,5986,'4.99','2005-07-11 00:54:56','2006-02-15 22:13:43'),(4642,171,1,6766,'2.99','2005-07-12 15:32:01','2006-02-15 22:13:43'),(4643,171,2,6774,'0.99','2005-07-12 15:56:08','2006-02-15 22:13:43'),(4644,171,1,7037,'3.99','2005-07-27 03:06:44','2006-02-15 22:13:43'),(4645,171,2,9066,'4.99','2005-07-30 07:28:54','2006-02-15 22:13:43'),(4646,171,2,9084,'5.99','2005-07-30 08:14:29','2006-02-15 22:13:43'),(4647,171,2,10622,'4.99','2005-08-01 15:12:00','2006-02-15 22:13:43'),(4648,171,1,12600,'4.99','2005-08-18 16:44:24','2006-02-15 22:13:43'),(4649,171,1,12962,'5.99','2005-08-19 06:22:48','2006-02-15 22:13:43'),(4650,171,2,13087,'6.99','2005-08-19 10:33:52','2006-02-15 22:13:43'),(4651,171,2,13292,'0.99','2005-08-19 18:35:32','2006-02-15 22:13:43'),(4652,171,2,13433,'0.99','2005-08-19 23:30:53','2006-02-15 22:13:43'),(4653,171,1,14270,'1.99','2005-08-21 06:22:18','2006-02-15 22:13:43'),(4654,171,2,14615,'9.99','2005-08-21 18:06:32','2006-02-15 22:13:43'),(4655,171,2,15810,'0.99','2005-08-23 14:43:15','2006-02-15 22:13:43'),(4656,172,2,449,'3.99','2005-05-27 19:13:15','2006-02-15 22:13:43'),(4657,172,1,685,'6.99','2005-05-29 00:17:51','2006-02-15 22:13:43'),(4658,172,1,837,'0.99','2005-05-30 00:02:08','2006-02-15 22:13:43'),(4659,172,2,1507,'0.99','2005-06-15 22:25:26','2006-02-15 22:13:43'),(4660,172,1,2052,'0.99','2005-06-17 15:14:43','2006-02-15 22:13:43'),(4661,172,2,3032,'1.99','2005-06-20 11:58:30','2006-02-15 22:13:43'),(4662,172,1,4820,'5.99','2005-07-08 17:25:23','2006-02-15 22:13:43'),(4663,172,1,4821,'4.99','2005-07-08 17:28:08','2006-02-15 22:13:43'),(4664,172,2,4878,'6.99','2005-07-08 19:33:49','2006-02-15 22:13:43'),(4665,172,2,6246,'7.99','2005-07-11 14:57:51','2006-02-15 22:13:43'),(4666,172,1,6380,'0.99','2005-07-11 21:55:40','2006-02-15 22:13:43'),(4667,172,1,6875,'5.99','2005-07-12 20:23:05','2006-02-15 22:13:43'),(4668,172,1,7122,'6.99','2005-07-27 06:03:18','2006-02-15 22:13:43'),(4669,172,1,7135,'2.99','2005-07-27 06:34:32','2006-02-15 22:13:43'),(4670,172,1,7194,'3.99','2005-07-27 08:39:58','2006-02-15 22:13:43'),(4671,172,2,7261,'2.99','2005-07-27 11:15:01','2006-02-15 22:13:43'),(4672,172,1,7638,'4.99','2005-07-28 01:13:26','2006-02-15 22:13:43'),(4673,172,2,8944,'6.99','2005-07-30 03:11:44','2006-02-15 22:13:43'),(4674,172,1,9118,'2.99','2005-07-30 09:24:18','2006-02-15 22:13:43'),(4675,172,2,9218,'5.99','2005-07-30 13:14:35','2006-02-15 22:13:43'),(4676,172,1,10312,'3.99','2005-08-01 04:29:06','2006-02-15 22:13:43'),(4677,172,2,10621,'0.99','2005-08-01 15:10:26','2006-02-15 22:13:43'),(4678,172,2,11499,'6.99','2005-08-16 22:54:12','2006-02-15 22:13:43'),(4679,172,2,12350,'4.99','2005-08-18 07:29:46','2006-02-15 22:13:43'),(4680,172,2,12638,'8.99','2005-08-18 18:11:39','2006-02-15 22:13:43'),(4681,172,2,13067,'5.99','2005-08-19 09:51:17','2006-02-15 22:13:43'),(4682,172,2,13320,'4.99','2005-08-19 19:35:33','2006-02-15 22:13:44'),(4683,172,1,13342,'0.99','2005-08-19 20:21:36','2006-02-15 22:13:44'),(4684,172,2,13937,'4.99','2005-08-20 17:22:51','2006-02-15 22:13:44'),(4685,172,1,14991,'4.99','2005-08-22 07:50:44','2006-02-15 22:13:44'),(4686,172,2,15637,'2.99','2005-08-23 07:53:38','2006-02-15 22:13:44'),(4687,172,1,15902,'3.99','2005-08-23 17:28:03','2006-02-15 22:13:44'),(4688,172,2,16038,'3.99','2005-08-23 22:14:31','2006-02-15 22:13:44'),(4689,173,2,578,'2.99','2005-05-28 11:15:48','2006-02-15 22:13:44'),(4690,173,1,628,'4.99','2005-05-28 17:05:46','2006-02-15 22:13:44'),(4691,173,2,1188,'2.99','2005-06-15 01:04:07','2006-02-15 22:13:44'),(4692,173,2,2435,'4.99','2005-06-18 18:12:26','2006-02-15 22:13:44'),(4693,173,1,2602,'2.99','2005-06-19 06:10:08','2006-02-15 22:13:44'),(4694,173,2,3224,'0.99','2005-06-21 02:11:36','2006-02-15 22:13:44'),(4695,173,1,3336,'4.99','2005-06-21 10:14:27','2006-02-15 22:13:44'),(4696,173,2,3717,'0.99','2005-07-06 10:53:34','2006-02-15 22:13:44'),(4697,173,1,4904,'7.99','2005-07-08 20:53:27','2006-02-15 22:13:44'),(4698,173,2,5430,'2.99','2005-07-09 21:19:54','2006-02-15 22:13:44'),(4699,173,2,5485,'4.99','2005-07-09 23:55:25','2006-02-15 22:13:44'),(4700,173,1,5488,'2.99','2005-07-10 00:02:06','2006-02-15 22:13:44'),(4701,173,2,5531,'2.99','2005-07-10 02:13:59','2006-02-15 22:13:44'),(4702,173,1,5615,'3.99','2005-07-10 05:18:51','2006-02-15 22:13:44'),(4703,173,2,6021,'4.99','2005-07-11 02:10:18','2006-02-15 22:13:44'),(4704,173,1,7644,'0.99','2005-07-28 01:27:33','2006-02-15 22:13:44'),(4705,173,2,8299,'2.99','2005-07-29 02:56:00','2006-02-15 22:13:44'),(4706,173,2,8808,'4.99','2005-07-29 21:39:07','2006-02-15 22:13:44'),(4707,173,2,8829,'8.99','2005-07-29 22:33:34','2006-02-15 22:13:44'),(4708,173,1,9097,'4.99','2005-07-30 08:40:35','2006-02-15 22:13:44'),(4709,173,2,9512,'2.99','2005-07-31 00:26:30','2006-02-15 22:13:44'),(4710,173,1,10351,'5.99','2005-08-01 05:32:13','2006-02-15 22:13:44'),(4711,173,2,12073,'2.99','2005-08-17 21:50:39','2006-02-15 22:13:44'),(4712,173,1,12282,'6.99','2005-08-18 04:54:20','2006-02-15 22:13:44'),(4713,173,2,12501,'4.99','2005-08-18 13:13:13','2006-02-15 22:13:44'),(4714,173,1,14654,'2.99','2005-08-21 19:36:59','2006-02-15 22:13:44'),(4715,173,2,15483,'0.99','2005-08-23 02:02:53','2006-02-15 22:13:44'),(4716,173,1,15775,'8.99','2005-08-23 13:25:44','2006-02-15 22:13:44'),(4717,173,1,16010,'2.99','2005-08-23 21:10:24','2006-02-15 22:13:44'),(4718,174,1,41,'5.99','2005-05-25 05:12:29','2006-02-15 22:13:44'),(4719,174,2,1071,'4.99','2005-05-31 09:48:56','2006-02-15 22:13:44'),(4720,174,2,1566,'7.99','2005-06-16 03:13:20','2006-02-15 22:13:44'),(4721,174,1,1609,'0.99','2005-06-16 06:34:59','2006-02-15 22:13:44'),(4722,174,1,2326,'5.99','2005-06-18 10:14:22','2006-02-15 22:13:44'),(4723,174,2,3446,'1.99','2005-06-21 20:45:51','2006-02-15 22:13:45'),(4724,174,2,4803,'1.99','2005-07-08 16:56:34','2006-02-15 22:13:45'),(4725,174,2,5414,'4.99','2005-07-09 20:29:36','2006-02-15 22:13:45'),(4726,174,1,6909,'4.99','2005-07-12 22:09:30','2006-02-15 22:13:45'),(4727,174,2,8348,'7.99','2005-07-29 04:49:26','2006-02-15 22:13:45'),(4728,174,1,8754,'4.99','2005-07-29 19:18:30','2006-02-15 22:13:45'),(4729,174,1,9301,'4.99','2005-07-30 16:34:29','2006-02-15 22:13:45'),(4730,174,1,9847,'2.99','2005-07-31 12:33:43','2006-02-15 22:13:45'),(4731,174,1,10363,'2.99','2005-08-01 06:01:52','2006-02-15 22:13:45'),(4732,174,2,10398,'4.99','2005-08-01 07:11:49','2006-02-15 22:13:45'),(4733,174,1,10559,'8.99','2005-08-01 13:02:58','2006-02-15 22:13:45'),(4734,174,1,11525,'0.99','2005-08-17 00:15:31','2006-02-15 22:13:45'),(4735,174,2,12886,'5.99','2005-08-19 03:38:32','2006-02-15 22:13:45'),(4736,174,1,13185,'0.99','2005-08-19 14:22:30','2006-02-15 22:13:45'),(4737,174,1,15892,'1.99','2005-08-23 17:01:00','2006-02-15 22:13:45'),(4738,174,1,15975,'4.99','2005-08-23 20:06:23','2006-02-15 22:13:45'),(4739,175,2,1495,'0.99','2005-06-15 21:54:31','2006-02-15 22:13:45'),(4740,175,2,3266,'4.99','2005-06-21 04:49:07','2006-02-15 22:13:45'),(4741,175,1,3625,'4.99','2005-07-06 06:12:52','2006-02-15 22:13:45'),(4742,175,2,4167,'5.99','2005-07-07 09:37:08','2006-02-15 22:13:45'),(4743,175,1,5232,'1.99','2005-07-09 12:35:08','2006-02-15 22:13:45'),(4744,175,2,6865,'7.99','2005-07-12 20:02:40','2006-02-15 22:13:45'),(4745,175,1,7448,'2.99','2005-07-27 18:06:30','2006-02-15 22:13:45'),(4746,175,1,7771,'0.99','2005-07-28 06:52:12','2006-02-15 22:13:45'),(4747,175,1,8244,'2.99','2005-07-29 00:35:34','2006-02-15 22:13:45'),(4748,175,1,8264,'4.99','2005-07-29 01:18:50','2006-02-15 22:13:45'),(4749,175,1,8440,'3.99','2005-07-29 07:31:26','2006-02-15 22:13:45'),(4750,175,1,8817,'4.99','2005-07-29 22:09:08','2006-02-15 22:13:45'),(4751,175,2,9941,'4.99','2005-07-31 15:31:25','2006-02-15 22:13:45'),(4752,175,2,10229,'7.99','2005-08-01 01:45:26','2006-02-15 22:13:45'),(4753,175,1,10875,'0.99','2005-08-02 00:31:44','2006-02-15 22:13:45'),(4754,175,2,11618,'4.99','2005-08-17 04:01:36','2006-02-15 22:13:45'),(4755,175,1,12509,'0.99','2005-08-18 13:21:52','2006-02-15 22:13:45'),(4756,175,1,13016,'4.99','2005-08-19 07:57:14','2006-02-15 22:13:45'),(4757,175,2,13833,'6.99','2005-08-20 14:00:29','2006-02-15 22:13:45'),(4758,175,2,13997,'6.99','2005-08-20 19:51:28','2006-02-15 22:13:45'),(4759,175,2,14507,'4.99','2005-08-21 14:32:45','2006-02-15 22:13:45'),(4760,175,2,14897,'2.99','2005-08-22 04:22:31','2006-02-15 22:13:45'),(4761,175,2,14060,'3.98','2006-02-14 15:16:03','2006-02-15 22:13:45'),(4762,175,2,13161,'0.00','2006-02-14 15:16:03','2006-02-15 22:13:46'),(4763,176,1,172,'0.99','2005-05-26 03:17:42','2006-02-15 22:13:46'),(4764,176,2,380,'6.99','2005-05-27 09:34:39','2006-02-15 22:13:46'),(4765,176,1,553,'3.99','2005-05-28 08:14:44','2006-02-15 22:13:46'),(4766,176,1,663,'1.99','2005-05-28 21:23:02','2006-02-15 22:13:46'),(4767,176,1,1062,'7.99','2005-05-31 08:38:20','2006-02-15 22:13:46'),(4768,176,1,1291,'5.99','2005-06-15 08:55:01','2006-02-15 22:13:46'),(4769,176,1,1741,'7.99','2005-06-16 16:31:37','2006-02-15 22:13:46'),(4770,176,1,1836,'6.99','2005-06-16 23:13:05','2006-02-15 22:13:46'),(4771,176,1,2181,'8.99','2005-06-18 00:48:31','2006-02-15 22:13:46'),(4772,176,1,2218,'2.99','2005-06-18 03:13:13','2006-02-15 22:13:46'),(4773,176,2,2427,'2.99','2005-06-18 17:45:00','2006-02-15 22:13:46'),(4774,176,2,2503,'1.99','2005-06-18 23:17:19','2006-02-15 22:13:46'),(4775,176,1,2922,'4.99','2005-06-20 04:13:47','2006-02-15 22:13:46'),(4776,176,1,3643,'4.99','2005-07-06 07:20:08','2006-02-15 22:13:46'),(4777,176,2,3931,'6.99','2005-07-06 21:03:46','2006-02-15 22:13:46'),(4778,176,2,4121,'3.99','2005-07-07 07:13:50','2006-02-15 22:13:46'),(4779,176,1,6035,'2.99','2005-07-11 03:01:45','2006-02-15 22:13:46'),(4780,176,1,6354,'6.99','2005-07-11 20:54:27','2006-02-15 22:13:46'),(4781,176,1,7017,'4.99','2005-07-27 02:16:03','2006-02-15 22:13:46'),(4782,176,1,7025,'2.99','2005-07-27 02:40:29','2006-02-15 22:13:46'),(4783,176,1,7210,'2.99','2005-07-27 09:19:05','2006-02-15 22:13:46'),(4784,176,2,7521,'2.99','2005-07-27 21:04:42','2006-02-15 22:13:46'),(4785,176,1,7751,'5.99','2005-07-28 05:56:13','2006-02-15 22:13:46'),(4786,176,1,8279,'2.99','2005-07-29 01:43:37','2006-02-15 22:13:46'),(4787,176,2,9145,'6.99','2005-07-30 10:27:55','2006-02-15 22:13:46'),(4788,176,1,10277,'2.99','2005-08-01 03:22:41','2006-02-15 22:13:46'),(4789,176,2,10441,'0.99','2005-08-01 08:55:56','2006-02-15 22:13:46'),(4790,176,1,10862,'2.99','2005-08-02 00:17:34','2006-02-15 22:13:46'),(4791,176,1,11678,'5.99','2005-08-17 06:07:39','2006-02-15 22:13:46'),(4792,176,1,12299,'2.99','2005-08-18 05:32:32','2006-02-15 22:13:46'),(4793,176,1,12718,'2.99','2005-08-18 21:21:44','2006-02-15 22:13:46'),(4794,176,1,13170,'7.99','2005-08-19 13:45:48','2006-02-15 22:13:46'),(4795,176,2,13186,'5.99','2005-08-19 14:23:19','2006-02-15 22:13:46'),(4796,176,1,14083,'7.99','2005-08-20 23:42:31','2006-02-15 22:13:46'),(4797,176,2,14232,'1.99','2005-08-21 05:07:02','2006-02-15 22:13:46'),(4798,176,2,15311,'4.99','2005-08-22 19:56:52','2006-02-15 22:13:46'),(4799,176,1,15933,'4.99','2005-08-23 18:36:44','2006-02-15 22:13:46'),(4800,177,1,1393,'2.99','2005-06-15 16:12:50','2006-02-15 22:13:46'),(4801,177,1,1524,'2.99','2005-06-16 00:25:52','2006-02-15 22:13:46'),(4802,177,2,1621,'4.99','2005-06-16 07:24:12','2006-02-15 22:13:47'),(4803,177,1,1738,'0.99','2005-06-16 16:07:27','2006-02-15 22:13:47'),(4804,177,2,2467,'2.99','2005-06-18 20:20:05','2006-02-15 22:13:47'),(4805,177,1,4760,'0.99','2005-07-08 14:48:07','2006-02-15 22:13:47'),(4806,177,2,6217,'9.99','2005-07-11 13:13:45','2006-02-15 22:13:47'),(4807,177,1,6284,'2.99','2005-07-11 16:51:39','2006-02-15 22:13:47'),(4808,177,1,7493,'3.99','2005-07-27 19:55:46','2006-02-15 22:13:47'),(4809,177,2,7674,'1.99','2005-07-28 02:54:30','2006-02-15 22:13:47'),(4810,177,1,8139,'0.99','2005-07-28 20:16:30','2006-02-15 22:13:47'),(4811,177,2,9190,'1.99','2005-07-30 12:24:17','2006-02-15 22:13:47'),(4812,177,2,10321,'4.99','2005-08-01 04:40:02','2006-02-15 22:13:47'),(4813,177,1,10661,'2.99','2005-08-01 16:48:31','2006-02-15 22:13:47'),(4814,177,1,10710,'0.99','2005-08-01 18:44:36','2006-02-15 22:13:47'),(4815,177,1,11195,'0.99','2005-08-02 11:42:23','2006-02-15 22:13:47'),(4816,177,1,11376,'5.99','2005-08-02 18:16:00','2006-02-15 22:13:47'),(4817,177,2,11662,'6.99','2005-08-17 05:27:37','2006-02-15 22:13:47'),(4818,177,1,12623,'4.99','2005-08-18 17:34:19','2006-02-15 22:13:47'),(4819,177,2,14093,'0.99','2005-08-21 00:21:29','2006-02-15 22:13:47'),(4820,177,2,14310,'0.99','2005-08-21 07:44:32','2006-02-15 22:13:47'),(4821,177,2,14849,'2.99','2005-08-22 02:15:26','2006-02-15 22:13:47'),(4822,177,2,14883,'0.99','2005-08-22 03:55:02','2006-02-15 22:13:47'),(4823,178,1,1292,'6.99','2005-06-15 09:03:52','2006-02-15 22:13:47'),(4824,178,2,1458,'6.99','2005-06-15 20:24:05','2006-02-15 22:13:47'),(4825,178,2,1568,'2.99','2005-06-16 03:14:01','2006-02-15 22:13:47'),(4826,178,2,1745,'3.99','2005-06-16 16:41:16','2006-02-15 22:13:47'),(4827,178,2,2124,'1.99','2005-06-17 20:49:14','2006-02-15 22:13:47'),(4828,178,1,2293,'4.99','2005-06-18 07:45:03','2006-02-15 22:13:47'),(4829,178,2,2844,'6.99','2005-06-19 22:40:12','2006-02-15 22:13:47'),(4830,178,1,2898,'9.99','2005-06-20 02:38:06','2006-02-15 22:13:47'),(4831,178,1,4915,'2.99','2005-07-08 21:31:22','2006-02-15 22:13:47'),(4832,178,1,5015,'2.99','2005-07-09 01:54:24','2006-02-15 22:13:47'),(4833,178,1,5057,'4.99','2005-07-09 04:20:29','2006-02-15 22:13:47'),(4834,178,1,5094,'10.99','2005-07-09 05:59:47','2006-02-15 22:13:47'),(4835,178,1,5984,'2.99','2005-07-11 00:44:36','2006-02-15 22:13:47'),(4836,178,2,6347,'4.99','2005-07-11 20:18:53','2006-02-15 22:13:48'),(4837,178,1,6554,'5.99','2005-07-12 05:07:26','2006-02-15 22:13:48'),(4838,178,1,6566,'6.99','2005-07-12 05:42:53','2006-02-15 22:13:48'),(4839,178,2,6606,'2.99','2005-07-12 08:03:40','2006-02-15 22:13:48'),(4840,178,1,7959,'4.99','2005-07-28 13:43:20','2006-02-15 22:13:48'),(4841,178,2,8069,'0.99','2005-07-28 17:23:46','2006-02-15 22:13:48'),(4842,178,1,8287,'3.99','2005-07-29 02:03:58','2006-02-15 22:13:48'),(4843,178,2,8388,'5.99','2005-07-29 05:48:15','2006-02-15 22:13:48'),(4844,178,2,8696,'4.99','2005-07-29 16:45:18','2006-02-15 22:13:48'),(4845,178,2,9004,'4.99','2005-07-30 05:04:27','2006-02-15 22:13:48'),(4846,178,1,9311,'7.99','2005-07-30 16:58:31','2006-02-15 22:13:48'),(4847,178,2,9879,'4.99','2005-07-31 13:45:32','2006-02-15 22:13:48'),(4848,178,2,10125,'0.99','2005-07-31 21:33:03','2006-02-15 22:13:48'),(4849,178,2,10562,'0.99','2005-08-01 13:05:52','2006-02-15 22:13:48'),(4850,178,1,10802,'5.99','2005-08-01 22:18:32','2006-02-15 22:13:48'),(4851,178,2,11319,'6.99','2005-08-02 16:10:09','2006-02-15 22:13:48'),(4852,178,2,11884,'6.99','2005-08-17 14:43:23','2006-02-15 22:13:48'),(4853,178,2,11927,'3.99','2005-08-17 16:25:03','2006-02-15 22:13:48'),(4854,178,2,12049,'6.99','2005-08-17 20:53:27','2006-02-15 22:13:48'),(4855,178,2,12727,'2.99','2005-08-18 21:45:15','2006-02-15 22:13:48'),(4856,178,1,13127,'2.99','2005-08-19 12:04:03','2006-02-15 22:13:48'),(4857,178,1,14104,'4.99','2005-08-21 00:37:44','2006-02-15 22:13:48'),(4858,178,1,14257,'7.99','2005-08-21 05:52:57','2006-02-15 22:13:48'),(4859,178,2,14314,'2.99','2005-08-21 07:50:14','2006-02-15 22:13:48'),(4860,178,1,15323,'4.99','2005-08-22 20:22:40','2006-02-15 22:13:48'),(4861,178,1,12897,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:48'),(4862,179,1,502,'0.99','2005-05-28 01:34:43','2006-02-15 22:13:48'),(4863,179,1,759,'6.99','2005-05-29 10:57:57','2006-02-15 22:13:48'),(4864,179,1,1046,'4.99','2005-05-31 06:42:30','2006-02-15 22:13:48'),(4865,179,2,1286,'7.99','2005-06-15 08:41:13','2006-02-15 22:13:48'),(4866,179,1,2613,'4.99','2005-06-19 07:25:50','2006-02-15 22:13:48'),(4867,179,1,3671,'6.99','2005-07-06 09:01:29','2006-02-15 22:13:48'),(4868,179,1,3844,'0.99','2005-07-06 16:37:58','2006-02-15 22:13:48'),(4869,179,1,4618,'2.99','2005-07-08 08:00:20','2006-02-15 22:13:48'),(4870,179,2,6071,'6.99','2005-07-11 04:50:03','2006-02-15 22:13:48'),(4871,179,1,6616,'7.99','2005-07-12 08:37:30','2006-02-15 22:13:48'),(4872,179,1,6806,'2.99','2005-07-12 17:31:43','2006-02-15 22:13:48'),(4873,179,1,7028,'6.99','2005-07-27 02:54:25','2006-02-15 22:13:48'),(4874,179,1,7054,'4.99','2005-07-27 03:43:28','2006-02-15 22:13:48'),(4875,179,1,7609,'4.99','2005-07-28 00:11:00','2006-02-15 22:13:48'),(4876,179,1,8573,'2.99','2005-07-29 11:51:25','2006-02-15 22:13:49'),(4877,179,1,8731,'8.99','2005-07-29 18:23:57','2006-02-15 22:13:49'),(4878,179,2,9491,'4.99','2005-07-30 23:45:23','2006-02-15 22:13:49'),(4879,179,2,9893,'0.99','2005-07-31 14:07:21','2006-02-15 22:13:49'),(4880,179,1,10156,'4.99','2005-07-31 22:36:00','2006-02-15 22:13:49'),(4881,179,1,10385,'4.99','2005-08-01 06:39:55','2006-02-15 22:13:49'),(4882,179,2,10569,'3.99','2005-08-01 13:18:23','2006-02-15 22:13:49'),(4883,179,1,11342,'0.99','2005-08-02 17:11:35','2006-02-15 22:13:49'),(4884,179,2,13240,'0.99','2005-08-19 16:22:14','2006-02-15 22:13:49'),(4885,179,1,13400,'4.99','2005-08-19 22:11:44','2006-02-15 22:13:49'),(4886,179,2,13844,'7.99','2005-08-20 14:30:26','2006-02-15 22:13:49'),(4887,179,2,13957,'0.99','2005-08-20 18:09:04','2006-02-15 22:13:49'),(4888,179,2,14082,'7.99','2005-08-20 23:42:00','2006-02-15 22:13:49'),(4889,179,1,14589,'0.99','2005-08-21 17:28:55','2006-02-15 22:13:49'),(4890,179,1,15985,'4.99','2005-08-23 20:20:23','2006-02-15 22:13:49'),(4891,180,1,1122,'2.99','2005-05-31 16:39:33','2006-02-15 22:13:49'),(4892,180,2,2700,'2.99','2005-06-19 13:31:52','2006-02-15 22:13:49'),(4893,180,1,2798,'2.99','2005-06-19 19:07:48','2006-02-15 22:13:49'),(4894,180,2,4826,'7.99','2005-07-08 17:44:25','2006-02-15 22:13:49'),(4895,180,1,4924,'9.99','2005-07-08 21:55:25','2006-02-15 22:13:49'),(4896,180,2,5384,'0.99','2005-07-09 19:17:46','2006-02-15 22:13:49'),(4897,180,2,5773,'0.99','2005-07-10 13:31:09','2006-02-15 22:13:49'),(4898,180,1,5860,'3.99','2005-07-10 18:08:49','2006-02-15 22:13:49'),(4899,180,1,7274,'2.99','2005-07-27 11:35:34','2006-02-15 22:13:49'),(4900,180,2,8540,'2.99','2005-07-29 10:52:51','2006-02-15 22:13:49'),(4901,180,2,8720,'5.99','2005-07-29 17:48:32','2006-02-15 22:13:49'),(4902,180,1,9373,'0.99','2005-07-30 19:05:36','2006-02-15 22:13:49'),(4903,180,2,9995,'3.99','2005-07-31 17:30:47','2006-02-15 22:13:49'),(4904,180,1,10576,'5.99','2005-08-01 13:46:02','2006-02-15 22:13:49'),(4905,180,1,10992,'8.99','2005-08-02 04:41:17','2006-02-15 22:13:49'),(4906,180,1,12313,'8.99','2005-08-18 06:07:31','2006-02-15 22:13:49'),(4907,180,1,13283,'2.99','2005-08-19 18:10:19','2006-02-15 22:13:49'),(4908,180,2,13842,'4.99','2005-08-20 14:29:37','2006-02-15 22:13:49'),(4909,180,1,13994,'2.99','2005-08-20 19:33:21','2006-02-15 22:13:49'),(4910,180,1,14109,'0.99','2005-08-21 00:52:58','2006-02-15 22:13:49'),(4911,180,1,14851,'2.99','2005-08-22 02:20:44','2006-02-15 22:13:49'),(4912,180,1,15039,'4.99','2005-08-22 09:37:54','2006-02-15 22:13:49'),(4913,180,1,12901,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:49'),(4914,181,2,579,'6.99','2005-05-28 11:19:23','2006-02-15 22:13:49'),(4915,181,1,1638,'2.99','2005-06-16 08:32:36','2006-02-15 22:13:50'),(4916,181,1,2645,'5.99','2005-06-19 09:50:35','2006-02-15 22:13:50'),(4917,181,2,3449,'5.99','2005-06-21 21:01:27','2006-02-15 22:13:50'),(4918,181,2,3469,'4.99','2005-06-21 22:48:59','2006-02-15 22:13:50'),(4919,181,1,3862,'6.99','2005-07-06 17:35:22','2006-02-15 22:13:50'),(4920,181,2,4428,'4.99','2005-07-07 22:29:40','2006-02-15 22:13:50'),(4921,181,2,6477,'4.99','2005-07-12 01:38:42','2006-02-15 22:13:50'),(4922,181,1,6946,'8.99','2005-07-26 23:40:07','2006-02-15 22:13:50'),(4923,181,1,7393,'0.99','2005-07-27 16:02:52','2006-02-15 22:13:50'),(4924,181,1,7632,'4.99','2005-07-28 01:02:40','2006-02-15 22:13:50'),(4925,181,1,8593,'5.99','2005-07-29 12:38:14','2006-02-15 22:13:50'),(4926,181,1,8601,'9.99','2005-07-29 13:03:31','2006-02-15 22:13:50'),(4927,181,2,9214,'4.99','2005-07-30 13:10:14','2006-02-15 22:13:50'),(4928,181,2,9235,'5.99','2005-07-30 13:47:17','2006-02-15 22:13:50'),(4929,181,1,9357,'8.99','2005-07-30 18:37:00','2006-02-15 22:13:50'),(4930,181,1,9844,'4.99','2005-07-31 12:26:31','2006-02-15 22:13:50'),(4931,181,2,10262,'4.99','2005-08-01 03:01:26','2006-02-15 22:13:50'),(4932,181,2,10362,'6.99','2005-08-01 05:55:13','2006-02-15 22:13:50'),(4933,181,2,10703,'2.99','2005-08-01 18:37:39','2006-02-15 22:13:50'),(4934,181,1,10748,'4.99','2005-08-01 20:01:24','2006-02-15 22:13:50'),(4935,181,1,10773,'6.99','2005-08-01 20:53:45','2006-02-15 22:13:50'),(4936,181,2,11224,'4.99','2005-08-02 12:40:38','2006-02-15 22:13:50'),(4937,181,1,12363,'7.99','2005-08-18 07:52:49','2006-02-15 22:13:50'),(4938,181,1,12411,'0.99','2005-08-18 09:47:57','2006-02-15 22:13:50'),(4939,181,1,12678,'2.99','2005-08-18 19:41:27','2006-02-15 22:13:50'),(4940,181,2,12939,'2.99','2005-08-19 05:38:25','2006-02-15 22:13:50'),(4941,181,2,13118,'4.99','2005-08-19 11:39:58','2006-02-15 22:13:50'),(4942,181,2,13405,'4.99','2005-08-19 22:20:49','2006-02-15 22:13:50'),(4943,181,2,13415,'2.99','2005-08-19 22:48:09','2006-02-15 22:13:50'),(4944,181,2,14406,'3.99','2005-08-21 10:46:35','2006-02-15 22:13:50'),(4945,181,2,15196,'2.99','2005-08-22 16:11:32','2006-02-15 22:13:50'),(4946,181,2,15482,'4.99','2005-08-23 02:01:20','2006-02-15 22:13:50'),(4947,181,2,13008,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:50'),(4948,182,2,161,'0.99','2005-05-26 01:51:48','2006-02-15 22:13:50'),(4949,182,2,425,'3.99','2005-05-27 15:51:30','2006-02-15 22:13:50'),(4950,182,2,1542,'3.99','2005-06-16 01:20:05','2006-02-15 22:13:50'),(4951,182,1,2049,'2.99','2005-06-17 14:58:36','2006-02-15 22:13:50'),(4952,182,2,2120,'5.99','2005-06-17 20:36:50','2006-02-15 22:13:51'),(4953,182,1,2234,'0.99','2005-06-18 04:01:28','2006-02-15 22:13:51'),(4954,182,1,3509,'2.99','2005-07-06 00:24:57','2006-02-15 22:13:51'),(4955,182,1,3697,'6.99','2005-07-06 10:07:22','2006-02-15 22:13:51'),(4956,182,1,4174,'2.99','2005-07-07 09:59:49','2006-02-15 22:13:51'),(4957,182,1,4349,'0.99','2005-07-07 19:02:37','2006-02-15 22:13:51'),(4958,182,2,4513,'1.99','2005-07-08 02:39:59','2006-02-15 22:13:51'),(4959,182,2,4591,'3.99','2005-07-08 06:29:43','2006-02-15 22:13:51'),(4960,182,2,4784,'0.99','2005-07-08 16:09:56','2006-02-15 22:13:51'),(4961,182,1,5521,'2.99','2005-07-10 01:31:22','2006-02-15 22:13:51'),(4962,182,2,7229,'0.99','2005-07-27 10:00:54','2006-02-15 22:13:51'),(4963,182,2,7863,'0.99','2005-07-28 10:05:46','2006-02-15 22:13:51'),(4964,182,2,7880,'4.99','2005-07-28 10:30:37','2006-02-15 22:13:51'),(4965,182,2,8048,'8.99','2005-07-28 16:50:26','2006-02-15 22:13:51'),(4966,182,1,11055,'4.99','2005-08-02 06:36:05','2006-02-15 22:13:51'),(4967,182,2,11785,'3.99','2005-08-17 10:54:46','2006-02-15 22:13:51'),(4968,182,1,12573,'4.99','2005-08-18 15:32:57','2006-02-15 22:13:51'),(4969,182,1,12840,'6.99','2005-08-19 01:54:11','2006-02-15 22:13:51'),(4970,182,1,13285,'2.99','2005-08-19 18:18:44','2006-02-15 22:13:51'),(4971,182,1,14586,'5.99','2005-08-21 17:19:09','2006-02-15 22:13:51'),(4972,182,1,14953,'6.99','2005-08-22 06:23:54','2006-02-15 22:13:51'),(4973,182,1,15043,'1.99','2005-08-22 09:49:32','2006-02-15 22:13:51'),(4974,183,1,382,'0.99','2005-05-27 10:12:00','2006-02-15 22:13:51'),(4975,183,1,1279,'0.99','2005-06-15 08:13:57','2006-02-15 22:13:51'),(4976,183,2,2188,'1.99','2005-06-18 01:19:04','2006-02-15 22:13:51'),(4977,183,2,2471,'5.99','2005-06-18 20:31:00','2006-02-15 22:13:51'),(4978,183,1,3381,'5.99','2005-06-21 14:02:59','2006-02-15 22:13:51'),(4979,183,1,3869,'2.99','2005-07-06 17:56:46','2006-02-15 22:13:51'),(4980,183,2,4134,'0.99','2005-07-07 08:14:24','2006-02-15 22:13:51'),(4981,183,2,4157,'2.99','2005-07-07 09:04:26','2006-02-15 22:13:51'),(4982,183,1,5069,'1.99','2005-07-09 04:56:30','2006-02-15 22:13:51'),(4983,183,2,5756,'0.99','2005-07-10 12:39:28','2006-02-15 22:13:51'),(4984,183,1,6472,'4.99','2005-07-12 01:33:25','2006-02-15 22:13:51'),(4985,183,1,6569,'4.99','2005-07-12 05:47:40','2006-02-15 22:13:51'),(4986,183,2,7359,'0.99','2005-07-27 14:51:04','2006-02-15 22:13:51'),(4987,183,2,9672,'5.99','2005-07-31 06:34:06','2006-02-15 22:13:51'),(4988,183,1,9818,'4.99','2005-07-31 11:34:32','2006-02-15 22:13:51'),(4989,183,2,9931,'2.99','2005-07-31 15:18:19','2006-02-15 22:13:52'),(4990,183,2,10620,'5.99','2005-08-01 15:09:17','2006-02-15 22:13:52'),(4991,183,2,11386,'2.99','2005-08-02 18:24:03','2006-02-15 22:13:52'),(4992,183,2,12451,'0.99','2005-08-18 11:04:42','2006-02-15 22:13:52'),(4993,183,2,12764,'3.99','2005-08-18 23:14:15','2006-02-15 22:13:52'),(4994,183,2,12831,'3.99','2005-08-19 01:40:43','2006-02-15 22:13:52'),(4995,183,1,13482,'2.99','2005-08-20 01:14:30','2006-02-15 22:13:52'),(4996,183,1,13536,'4.99','2005-08-20 03:35:16','2006-02-15 22:13:52'),(4997,184,1,196,'2.99','2005-05-26 06:55:58','2006-02-15 22:13:52'),(4998,184,2,534,'4.99','2005-05-28 06:15:25','2006-02-15 22:13:52'),(4999,184,1,567,'1.99','2005-05-28 09:56:20','2006-02-15 22:13:52'),(5000,184,2,1976,'2.99','2005-06-17 09:38:08','2006-02-15 22:13:52'),(5001,184,1,2312,'0.99','2005-06-18 08:55:46','2006-02-15 22:13:52'),(5002,184,1,4314,'0.99','2005-07-07 17:38:31','2006-02-15 22:13:52'),(5003,184,2,4882,'6.99','2005-07-08 19:42:03','2006-02-15 22:13:52'),(5004,184,1,5891,'0.99','2005-07-10 20:01:17','2006-02-15 22:13:52'),(5005,184,2,6493,'2.99','2005-07-12 02:40:41','2006-02-15 22:13:52'),(5006,184,2,6700,'6.99','2005-07-12 12:47:22','2006-02-15 22:13:52'),(5007,184,2,7051,'4.99','2005-07-27 03:34:37','2006-02-15 22:13:52'),(5008,184,2,7686,'6.99','2005-07-28 03:19:23','2006-02-15 22:13:52'),(5009,184,1,8892,'4.99','2005-07-30 00:47:03','2006-02-15 22:13:52'),(5010,184,1,9162,'0.99','2005-07-30 11:21:56','2006-02-15 22:13:52'),(5011,184,2,12166,'9.99','2005-08-18 00:57:06','2006-02-15 22:13:52'),(5012,184,2,12454,'2.99','2005-08-18 11:19:02','2006-02-15 22:13:52'),(5013,184,1,12532,'2.99','2005-08-18 13:57:58','2006-02-15 22:13:52'),(5014,184,1,13134,'0.99','2005-08-19 12:14:14','2006-02-15 22:13:52'),(5015,184,1,13262,'5.99','2005-08-19 17:20:15','2006-02-15 22:13:52'),(5016,184,1,13303,'4.99','2005-08-19 18:55:21','2006-02-15 22:13:52'),(5017,184,2,14472,'4.99','2005-08-21 13:13:57','2006-02-15 22:13:52'),(5018,184,1,14801,'5.99','2005-08-22 00:46:54','2006-02-15 22:13:53'),(5019,184,2,15611,'0.99','2005-08-23 06:56:18','2006-02-15 22:13:53'),(5020,185,2,20,'2.99','2005-05-25 01:48:41','2006-02-15 22:13:53'),(5021,185,2,154,'0.99','2005-05-26 00:55:56','2006-02-15 22:13:53'),(5022,185,1,646,'0.99','2005-05-28 19:16:14','2006-02-15 22:13:53'),(5023,185,1,2459,'4.99','2005-06-18 19:44:08','2006-02-15 22:13:53'),(5024,185,1,3314,'4.99','2005-06-21 08:17:00','2006-02-15 22:13:53'),(5025,185,1,3325,'4.99','2005-06-21 08:51:44','2006-02-15 22:13:53'),(5026,185,1,4186,'9.99','2005-07-07 10:32:25','2006-02-15 22:13:53'),(5027,185,1,4524,'2.99','2005-07-08 03:10:48','2006-02-15 22:13:53'),(5028,185,2,4822,'7.99','2005-07-08 17:28:47','2006-02-15 22:13:53'),(5029,185,2,6106,'2.99','2005-07-11 07:05:06','2006-02-15 22:13:53'),(5030,185,1,6418,'1.99','2005-07-11 23:36:27','2006-02-15 22:13:53'),(5031,185,1,6965,'2.99','2005-07-27 00:15:18','2006-02-15 22:13:53'),(5032,185,1,7066,'4.99','2005-07-27 03:53:52','2006-02-15 22:13:53'),(5033,185,1,8200,'2.99','2005-07-28 23:10:46','2006-02-15 22:13:53'),(5034,185,2,8442,'0.99','2005-07-29 07:33:07','2006-02-15 22:13:53'),(5035,185,1,8684,'8.99','2005-07-29 16:16:33','2006-02-15 22:13:53'),(5036,185,2,9246,'0.99','2005-07-30 14:12:31','2006-02-15 22:13:53'),(5037,185,2,9473,'2.99','2005-07-30 23:04:13','2006-02-15 22:13:53'),(5038,185,2,11355,'0.99','2005-08-02 17:37:43','2006-02-15 22:13:53'),(5039,185,1,12312,'2.99','2005-08-18 06:07:26','2006-02-15 22:13:53'),(5040,185,1,12674,'5.99','2005-08-18 19:24:56','2006-02-15 22:13:53'),(5041,185,1,12885,'0.99','2005-08-19 03:37:25','2006-02-15 22:13:53'),(5042,185,2,14513,'2.99','2005-08-21 14:51:35','2006-02-15 22:13:53'),(5043,186,1,581,'1.99','2005-05-28 11:20:29','2006-02-15 22:13:53'),(5044,186,2,958,'0.99','2005-05-30 17:58:03','2006-02-15 22:13:53'),(5045,186,1,1192,'4.99','2005-06-15 01:18:39','2006-02-15 22:13:53'),(5046,186,1,1300,'2.99','2005-06-15 09:36:19','2006-02-15 22:13:53'),(5047,186,1,1663,'2.99','2005-06-16 10:14:15','2006-02-15 22:13:53'),(5048,186,2,2132,'4.99','2005-06-17 21:05:06','2006-02-15 22:13:53'),(5049,186,2,2875,'4.99','2005-06-20 00:47:18','2006-02-15 22:13:53'),(5050,186,1,3039,'4.99','2005-06-20 12:32:30','2006-02-15 22:13:53'),(5051,186,2,6067,'4.99','2005-07-11 04:34:49','2006-02-15 22:13:53'),(5052,186,2,7739,'0.99','2005-07-28 05:21:51','2006-02-15 22:13:54'),(5053,186,1,7915,'3.99','2005-07-28 11:49:46','2006-02-15 22:13:54'),(5054,186,1,8483,'4.99','2005-07-29 08:50:18','2006-02-15 22:13:54'),(5055,186,2,8872,'0.99','2005-07-30 00:13:54','2006-02-15 22:13:54'),(5056,186,2,9303,'2.99','2005-07-30 16:35:59','2006-02-15 22:13:54'),(5057,186,2,9360,'5.99','2005-07-30 18:39:43','2006-02-15 22:13:54'),(5058,186,1,10104,'1.99','2005-07-31 20:49:14','2006-02-15 22:13:54'),(5059,186,1,10985,'0.99','2005-08-02 04:30:19','2006-02-15 22:13:54'),(5060,186,1,11982,'0.99','2005-08-17 18:13:07','2006-02-15 22:13:54'),(5061,186,1,12348,'5.99','2005-08-18 07:21:47','2006-02-15 22:13:54'),(5062,186,1,12438,'8.99','2005-08-18 10:42:52','2006-02-15 22:13:54'),(5063,186,1,13168,'6.99','2005-08-19 13:37:28','2006-02-15 22:13:54'),(5064,186,2,13517,'4.99','2005-08-20 02:33:17','2006-02-15 22:13:54'),(5065,186,1,13853,'3.99','2005-08-20 14:47:02','2006-02-15 22:13:54'),(5066,186,1,14006,'2.99','2005-08-20 20:21:36','2006-02-15 22:13:54'),(5067,186,2,14229,'4.99','2005-08-21 04:57:15','2006-02-15 22:13:54'),(5068,186,2,14646,'4.99','2005-08-21 19:14:48','2006-02-15 22:13:54'),(5069,186,2,14988,'3.99','2005-08-22 07:46:05','2006-02-15 22:13:54'),(5070,186,2,15001,'0.99','2005-08-22 08:00:49','2006-02-15 22:13:54'),(5071,186,2,15295,'3.99','2005-08-22 19:36:21','2006-02-15 22:13:54'),(5072,186,1,15596,'0.99','2005-08-23 06:19:51','2006-02-15 22:13:54'),(5073,186,1,14216,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:54'),(5074,187,1,252,'7.99','2005-05-26 14:39:53','2006-02-15 22:13:54'),(5075,187,2,1323,'6.99','2005-06-15 10:55:17','2006-02-15 22:13:54'),(5076,187,2,1462,'4.99','2005-06-15 20:37:40','2006-02-15 22:13:54'),(5077,187,2,1592,'0.99','2005-06-16 05:14:37','2006-02-15 22:13:54'),(5078,187,2,2127,'0.99','2005-06-17 20:54:48','2006-02-15 22:13:54'),(5079,187,2,2533,'0.99','2005-06-19 01:34:26','2006-02-15 22:13:54'),(5080,187,1,2742,'5.99','2005-06-19 16:05:47','2006-02-15 22:13:54'),(5081,187,1,3402,'2.99','2005-06-21 15:54:37','2006-02-15 22:13:54'),(5082,187,2,3709,'10.99','2005-07-06 10:26:56','2006-02-15 22:13:54'),(5083,187,1,4429,'4.99','2005-07-07 22:32:47','2006-02-15 22:13:54'),(5084,187,2,5366,'0.99','2005-07-09 18:28:37','2006-02-15 22:13:54'),(5085,187,1,5738,'8.99','2005-07-10 11:50:51','2006-02-15 22:13:54'),(5086,187,2,5833,'6.99','2005-07-10 16:39:24','2006-02-15 22:13:54'),(5087,187,1,6057,'3.99','2005-07-11 04:03:40','2006-02-15 22:13:54'),(5088,187,2,6428,'2.99','2005-07-12 00:01:51','2006-02-15 22:13:54'),(5089,187,2,7289,'4.99','2005-07-27 12:26:51','2006-02-15 22:13:55'),(5090,187,2,7844,'7.99','2005-07-28 09:16:19','2006-02-15 22:13:55'),(5091,187,2,7967,'7.99','2005-07-28 13:56:51','2006-02-15 22:13:55'),(5092,187,1,9241,'2.99','2005-07-30 13:58:41','2006-02-15 22:13:55'),(5093,187,1,11843,'2.99','2005-08-17 13:14:50','2006-02-15 22:13:55'),(5094,187,2,12307,'8.99','2005-08-18 05:48:23','2006-02-15 22:13:55'),(5095,187,2,12490,'9.99','2005-08-18 12:48:45','2006-02-15 22:13:55'),(5096,187,1,12534,'7.99','2005-08-18 14:04:41','2006-02-15 22:13:55'),(5097,187,2,13940,'8.99','2005-08-20 17:28:57','2006-02-15 22:13:55'),(5098,187,2,14855,'8.99','2005-08-22 02:27:32','2006-02-15 22:13:55'),(5099,187,2,15231,'4.99','2005-08-22 17:32:57','2006-02-15 22:13:55'),(5100,187,2,15517,'2.99','2005-08-23 03:13:01','2006-02-15 22:13:55'),(5101,187,2,15971,'7.99','2005-08-23 19:59:33','2006-02-15 22:13:55'),(5102,188,2,1527,'2.99','2005-06-16 00:31:40','2006-02-15 22:13:55'),(5103,188,2,1927,'0.99','2005-06-17 06:48:19','2006-02-15 22:13:55'),(5104,188,1,2515,'4.99','2005-06-18 23:57:31','2006-02-15 22:13:55'),(5105,188,2,2733,'4.99','2005-06-19 15:21:53','2006-02-15 22:13:55'),(5106,188,2,3848,'3.99','2005-07-06 16:47:32','2006-02-15 22:13:55'),(5107,188,2,4150,'2.99','2005-07-07 08:43:22','2006-02-15 22:13:55'),(5108,188,2,5356,'2.99','2005-07-09 18:08:28','2006-02-15 22:13:55'),(5109,188,2,5729,'5.99','2005-07-10 11:27:25','2006-02-15 22:13:55'),(5110,188,2,6555,'4.99','2005-07-12 05:08:16','2006-02-15 22:13:55'),(5111,188,2,7042,'0.99','2005-07-27 03:20:18','2006-02-15 22:13:55'),(5112,188,1,7556,'4.99','2005-07-27 22:17:17','2006-02-15 22:13:55'),(5113,188,2,9613,'4.99','2005-07-31 03:58:53','2006-02-15 22:13:55'),(5114,188,2,10453,'5.99','2005-08-01 09:13:27','2006-02-15 22:13:55'),(5115,188,1,10494,'0.99','2005-08-01 10:45:21','2006-02-15 22:13:55'),(5116,188,2,10719,'4.99','2005-08-01 19:00:28','2006-02-15 22:13:55'),(5117,188,2,10757,'4.99','2005-08-01 20:22:44','2006-02-15 22:13:55'),(5118,188,2,11378,'2.99','2005-08-02 18:16:52','2006-02-15 22:13:55'),(5119,188,1,13570,'2.99','2005-08-20 05:04:57','2006-02-15 22:13:55'),(5120,188,1,13787,'5.99','2005-08-20 12:15:23','2006-02-15 22:13:55'),(5121,188,1,14399,'2.99','2005-08-21 10:33:23','2006-02-15 22:13:55'),(5122,188,2,14809,'2.99','2005-08-22 01:00:42','2006-02-15 22:13:55'),(5123,188,2,15319,'2.99','2005-08-22 20:17:17','2006-02-15 22:13:55'),(5124,188,2,15409,'0.99','2005-08-22 23:26:32','2006-02-15 22:13:55'),(5125,188,2,15474,'4.99','2005-08-23 01:39:10','2006-02-15 22:13:55'),(5126,188,1,14503,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:56'),(5127,189,2,1117,'5.99','2005-05-31 16:15:31','2006-02-15 22:13:56'),(5128,189,1,1541,'0.99','2005-06-16 01:15:59','2006-02-15 22:13:56'),(5129,189,1,1834,'0.99','2005-06-16 22:49:08','2006-02-15 22:13:56'),(5130,189,2,2905,'1.99','2005-06-20 02:56:16','2006-02-15 22:13:56'),(5131,189,1,3108,'6.99','2005-06-20 17:28:43','2006-02-15 22:13:56'),(5132,189,1,3346,'2.99','2005-06-21 11:06:53','2006-02-15 22:13:56'),(5133,189,1,3763,'0.99','2005-07-06 12:56:31','2006-02-15 22:13:56'),(5134,189,2,3813,'4.99','2005-07-06 15:23:34','2006-02-15 22:13:56'),(5135,189,2,4203,'0.99','2005-07-07 11:24:14','2006-02-15 22:13:56'),(5136,189,1,6193,'5.99','2005-07-11 11:46:57','2006-02-15 22:13:56'),(5137,189,1,7469,'4.99','2005-07-27 18:57:40','2006-02-15 22:13:56'),(5138,189,1,7675,'4.99','2005-07-28 02:55:20','2006-02-15 22:13:56'),(5139,189,2,7790,'2.99','2005-07-28 07:22:35','2006-02-15 22:13:56'),(5140,189,2,9171,'5.99','2005-07-30 11:36:24','2006-02-15 22:13:56'),(5141,189,2,9386,'0.99','2005-07-30 19:26:21','2006-02-15 22:13:56'),(5142,189,1,9506,'4.99','2005-07-31 00:19:01','2006-02-15 22:13:56'),(5143,189,1,10247,'9.99','2005-08-01 02:34:06','2006-02-15 22:13:56'),(5144,189,2,11059,'6.99','2005-08-02 06:41:38','2006-02-15 22:13:56'),(5145,189,2,13601,'6.99','2005-08-20 06:01:15','2006-02-15 22:13:56'),(5146,189,1,13766,'3.99','2005-08-20 11:42:01','2006-02-15 22:13:56'),(5147,189,1,15773,'1.99','2005-08-23 13:24:57','2006-02-15 22:13:56'),(5148,189,1,16008,'5.99','2005-08-23 21:04:51','2006-02-15 22:13:56'),(5149,190,2,430,'4.99','2005-05-27 16:22:10','2006-02-15 22:13:56'),(5150,190,1,693,'2.99','2005-05-29 01:42:31','2006-02-15 22:13:56'),(5151,190,1,1319,'2.99','2005-06-15 10:39:05','2006-02-15 22:13:56'),(5152,190,1,1347,'2.99','2005-06-15 12:43:43','2006-02-15 22:13:56'),(5153,190,1,2057,'4.99','2005-06-17 15:31:58','2006-02-15 22:13:56'),(5154,190,1,2568,'3.99','2005-06-19 04:09:03','2006-02-15 22:13:56'),(5155,190,1,3386,'4.99','2005-06-21 14:21:06','2006-02-15 22:13:56'),(5156,190,2,4005,'5.99','2005-07-07 00:22:26','2006-02-15 22:13:56'),(5157,190,1,4140,'2.99','2005-07-07 08:19:10','2006-02-15 22:13:56'),(5158,190,2,6867,'3.99','2005-07-12 20:06:47','2006-02-15 22:13:56'),(5159,190,1,7175,'4.99','2005-07-27 08:03:22','2006-02-15 22:13:56'),(5160,190,1,7386,'5.99','2005-07-27 15:52:10','2006-02-15 22:13:56'),(5161,190,2,7404,'2.99','2005-07-27 16:24:43','2006-02-15 22:13:56'),(5162,190,1,8498,'0.99','2005-07-29 09:07:38','2006-02-15 22:13:57'),(5163,190,1,11082,'5.99','2005-08-02 07:30:19','2006-02-15 22:13:57'),(5164,190,2,11158,'6.99','2005-08-02 09:58:28','2006-02-15 22:13:57'),(5165,190,2,11276,'4.99','2005-08-02 14:28:46','2006-02-15 22:13:57'),(5166,190,2,11312,'6.99','2005-08-02 15:56:51','2006-02-15 22:13:57'),(5167,190,2,11750,'0.99','2005-08-17 09:07:00','2006-02-15 22:13:57'),(5168,190,2,11950,'9.99','2005-08-17 17:13:16','2006-02-15 22:13:57'),(5169,190,1,12270,'2.99','2005-08-18 04:32:05','2006-02-15 22:13:57'),(5170,190,2,12381,'0.99','2005-08-18 08:31:43','2006-02-15 22:13:57'),(5171,190,2,14065,'0.99','2005-08-20 22:40:47','2006-02-15 22:13:57'),(5172,190,2,14141,'4.99','2005-08-21 02:07:22','2006-02-15 22:13:57'),(5173,190,2,14166,'2.99','2005-08-21 02:59:31','2006-02-15 22:13:57'),(5174,190,2,14650,'0.99','2005-08-21 19:24:51','2006-02-15 22:13:57'),(5175,190,2,15167,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:57'),(5176,191,1,1134,'2.99','2005-05-31 19:14:15','2006-02-15 22:13:57'),(5177,191,2,1152,'4.99','2005-05-31 21:32:17','2006-02-15 22:13:57'),(5178,191,2,1173,'2.99','2005-06-14 23:54:46','2006-02-15 22:13:57'),(5179,191,1,1278,'0.99','2005-06-15 08:09:12','2006-02-15 22:13:57'),(5180,191,1,1677,'2.99','2005-06-16 11:07:11','2006-02-15 22:13:57'),(5181,191,2,1870,'2.99','2005-06-17 02:24:36','2006-02-15 22:13:57'),(5182,191,1,2051,'4.99','2005-06-17 15:10:16','2006-02-15 22:13:57'),(5183,191,2,2555,'2.99','2005-06-19 03:07:02','2006-02-15 22:13:57'),(5184,191,1,5338,'2.99','2005-07-09 17:07:07','2006-02-15 22:13:57'),(5185,191,2,5397,'5.99','2005-07-09 19:43:51','2006-02-15 22:13:57'),(5186,191,1,5924,'5.99','2005-07-10 21:41:23','2006-02-15 22:13:57'),(5187,191,1,7150,'6.99','2005-07-27 07:11:14','2006-02-15 22:13:57'),(5188,191,1,7450,'3.99','2005-07-27 18:18:35','2006-02-15 22:13:57'),(5189,191,1,7520,'2.99','2005-07-27 21:02:02','2006-02-15 22:13:57'),(5190,191,2,8583,'0.99','2005-07-29 12:04:50','2006-02-15 22:13:57'),(5191,191,1,9297,'4.99','2005-07-30 16:26:29','2006-02-15 22:13:57'),(5192,191,1,9964,'4.99','2005-07-31 16:17:39','2006-02-15 22:13:57'),(5193,191,2,10532,'2.99','2005-08-01 12:06:35','2006-02-15 22:13:57'),(5194,191,2,15375,'4.99','2005-08-22 22:12:02','2006-02-15 22:13:57'),(5195,191,1,14361,'0.99','2006-02-14 15:16:03','2006-02-15 22:13:57'),(5196,192,1,895,'1.99','2005-05-30 08:50:43','2006-02-15 22:13:57'),(5197,192,1,2760,'3.99','2005-06-19 17:16:33','2006-02-15 22:13:57'),(5198,192,1,3902,'2.99','2005-07-06 19:25:18','2006-02-15 22:13:57'),(5199,192,1,4469,'4.99','2005-07-08 00:18:32','2006-02-15 22:13:57'),(5200,192,1,5400,'2.99','2005-07-09 19:56:40','2006-02-15 22:13:58'),(5201,192,2,6223,'0.99','2005-07-11 13:27:09','2006-02-15 22:13:58'),(5202,192,2,6691,'0.99','2005-07-12 12:26:38','2006-02-15 22:13:58'),(5203,192,2,7147,'2.99','2005-07-27 07:02:34','2006-02-15 22:13:58'),(5204,192,2,8051,'0.99','2005-07-28 16:56:16','2006-02-15 22:13:58'),(5205,192,2,8292,'7.99','2005-07-29 02:29:36','2006-02-15 22:13:58'),(5206,192,1,9462,'7.99','2005-07-30 22:30:44','2006-02-15 22:13:58'),(5207,192,1,9831,'2.99','2005-07-31 11:59:32','2006-02-15 22:13:58'),(5208,192,2,10238,'0.99','2005-08-01 02:08:05','2006-02-15 22:13:58'),(5209,192,1,10843,'7.99','2005-08-01 23:43:03','2006-02-15 22:13:58'),(5210,192,1,11385,'4.99','2005-08-02 18:23:11','2006-02-15 22:13:58'),(5211,192,1,11815,'4.99','2005-08-17 12:13:26','2006-02-15 22:13:58'),(5212,192,1,13125,'5.99','2005-08-19 11:57:49','2006-02-15 22:13:58'),(5213,192,2,14146,'4.99','2005-08-21 02:13:31','2006-02-15 22:13:58'),(5214,192,2,14238,'7.99','2005-08-21 05:16:40','2006-02-15 22:13:58'),(5215,192,1,14404,'4.99','2005-08-21 10:43:04','2006-02-15 22:13:58'),(5216,192,2,14692,'6.99','2005-08-21 20:43:21','2006-02-15 22:13:58'),(5217,192,2,15855,'2.99','2005-08-23 15:59:01','2006-02-15 22:13:58'),(5218,192,1,11611,'4.99','2006-02-14 15:16:03','2006-02-15 22:13:58'),(5219,193,2,273,'2.99','2005-05-26 16:29:36','2006-02-15 22:13:58'),(5220,193,2,464,'0.99','2005-05-27 20:42:44','2006-02-15 22:13:58'),(5221,193,1,1325,'4.99','2005-06-15 11:03:24','2006-02-15 22:13:58'),(5222,193,2,2377,'6.99','2005-06-18 14:56:23','2006-02-15 22:13:58'),(5223,193,2,2841,'6.99','2005-06-19 22:21:06','2006-02-15 22:13:58'),(5224,193,2,2846,'4.99','2005-06-19 22:52:14','2006-02-15 22:13:58'),(5225,193,2,2880,'2.99','2005-06-20 01:24:54','2006-02-15 22:13:58'),(5226,193,1,3297,'8.99','2005-06-21 07:08:19','2006-02-15 22:13:58'),(5227,193,1,4892,'6.99','2005-07-08 20:06:25','2006-02-15 22:13:58'),(5228,193,1,8211,'2.99','2005-07-28 23:34:22','2006-02-15 22:13:58'),(5229,193,1,8379,'4.99','2005-07-29 05:29:40','2006-02-15 22:13:58'),(5230,193,1,8431,'4.99','2005-07-29 07:12:48','2006-02-15 22:13:58'),(5231,193,1,9079,'2.99','2005-07-30 08:02:00','2006-02-15 22:13:58'),(5232,193,1,9575,'4.99','2005-07-31 02:51:53','2006-02-15 22:13:58'),(5233,193,2,10462,'2.99','2005-08-01 09:38:28','2006-02-15 22:13:58'),(5234,193,2,12384,'0.99','2005-08-18 08:36:58','2006-02-15 22:13:58'),(5235,193,2,12658,'4.99','2005-08-18 19:05:42','2006-02-15 22:13:58'),(5236,193,1,13529,'2.99','2005-08-20 03:07:47','2006-02-15 22:13:58'),(5237,193,1,13608,'0.99','2005-08-20 06:10:44','2006-02-15 22:13:59'),(5238,193,1,14679,'2.99','2005-08-21 20:14:58','2006-02-15 22:13:59'),(5239,193,1,14927,'4.99','2005-08-22 05:31:53','2006-02-15 22:13:59'),(5240,193,2,15164,'4.99','2005-08-22 14:47:53','2006-02-15 22:13:59'),(5241,193,2,15344,'6.99','2005-08-22 21:01:48','2006-02-15 22:13:59'),(5242,193,2,15495,'5.99','2005-08-23 02:26:10','2006-02-15 22:13:59'),(5243,193,2,15729,'2.99','2006-02-14 15:16:03','2006-02-15 22:13:59'),(5244,194,2,334,'4.99','2005-05-27 03:03:07','2006-02-15 22:13:59'),(5245,194,2,677,'7.99','2005-05-28 23:00:08','2006-02-15 22:13:59'),(5246,194,1,1430,'0.99','2005-06-15 18:24:55','2006-02-15 22:13:59'),(5247,194,1,2245,'7.99','2005-06-18 04:52:59','2006-02-15 22:13:59'),(5248,194,1,2347,'2.99','2005-06-18 12:12:29','2006-02-15 22:13:59'),(5249,194,1,2463,'3.99','2005-06-18 20:01:43','2006-02-15 22:13:59'),(5250,194,1,2807,'3.99','2005-06-19 19:32:53','2006-02-15 22:13:59'),(5251,194,2,4231,'7.99','2005-07-07 12:48:19','2006-02-15 22:13:59'),(5252,194,2,5146,'2.99','2005-07-09 08:14:58','2006-02-15 22:13:59'),(5253,194,1,5291,'2.99','2005-07-09 15:15:02','2006-02-15 22:13:59'),(5254,194,2,5894,'3.99','2005-07-10 20:09:34','2006-02-15 22:13:59'),(5255,194,1,9064,'7.99','2005-07-30 07:24:55','2006-02-15 22:13:59'),(5256,194,2,11475,'5.99','2005-08-02 21:55:09','2006-02-15 22:13:59'),(5257,194,2,12851,'3.99','2005-08-19 02:12:12','2006-02-15 22:13:59'),(5258,194,1,13515,'0.99','2005-08-20 02:29:47','2006-02-15 22:13:59'),(5259,194,2,13616,'7.99','2005-08-20 06:30:33','2006-02-15 22:13:59'),(5260,194,1,14440,'4.99','2005-08-21 11:59:04','2006-02-15 22:13:59'),(5261,194,2,15937,'4.99','2005-08-23 18:43:22','2006-02-15 22:13:59'),(5262,195,1,4234,'6.99','2005-07-07 13:01:35','2006-02-15 22:13:59'),(5263,195,1,4315,'2.99','2005-07-07 17:40:26','2006-02-15 22:13:59'),(5264,195,1,5228,'4.99','2005-07-09 12:26:01','2006-02-15 22:13:59'),(5265,195,1,5536,'0.99','2005-07-10 02:29:42','2006-02-15 22:13:59'),(5266,195,2,6175,'4.99','2005-07-11 10:44:37','2006-02-15 22:13:59'),(5267,195,1,7349,'2.99','2005-07-27 14:33:00','2006-02-15 22:13:59'),(5268,195,2,8280,'4.99','2005-07-29 01:45:51','2006-02-15 22:13:59'),(5269,195,2,8479,'0.99','2005-07-29 08:42:04','2006-02-15 22:13:59'),(5270,195,2,9188,'6.99','2005-07-30 12:19:54','2006-02-15 22:13:59'),(5271,195,1,9870,'5.99','2005-07-31 13:22:51','2006-02-15 22:13:59'),(5272,195,1,9994,'4.99','2005-07-31 17:30:31','2006-02-15 22:13:59'),(5273,195,2,10911,'4.99','2005-08-02 01:58:36','2006-02-15 22:14:00'),(5274,195,1,11201,'7.99','2005-08-02 11:49:16','2006-02-15 22:14:00'),(5275,195,2,11787,'2.99','2005-08-17 10:59:00','2006-02-15 22:14:00'),(5276,195,2,12099,'0.99','2005-08-17 22:38:54','2006-02-15 22:14:00'),(5277,195,2,12941,'0.99','2005-08-19 05:39:26','2006-02-15 22:14:00'),(5278,195,2,13741,'0.99','2005-08-20 10:48:47','2006-02-15 22:14:00'),(5279,195,2,14751,'7.99','2005-08-21 23:11:23','2006-02-15 22:14:00'),(5280,195,2,16040,'11.99','2005-08-23 22:19:33','2006-02-15 22:14:00'),(5281,196,2,106,'11.99','2005-05-25 18:18:19','2006-02-15 22:14:00'),(5282,196,2,178,'5.99','2005-05-26 04:21:46','2006-02-15 22:14:00'),(5283,196,2,491,'2.99','2005-05-28 00:13:35','2006-02-15 22:14:00'),(5284,196,1,1053,'1.99','2005-05-31 07:12:44','2006-02-15 22:14:00'),(5285,196,1,1182,'5.99','2005-06-15 00:45:21','2006-02-15 22:14:00'),(5286,196,1,1348,'2.99','2005-06-15 12:45:30','2006-02-15 22:14:00'),(5287,196,2,1600,'0.99','2005-06-16 06:04:12','2006-02-15 22:14:00'),(5288,196,1,2681,'0.99','2005-06-19 12:15:27','2006-02-15 22:14:00'),(5289,196,2,2912,'4.99','2005-06-20 03:32:45','2006-02-15 22:14:00'),(5290,196,1,3104,'4.99','2005-06-20 17:06:46','2006-02-15 22:14:00'),(5291,196,2,3271,'5.99','2005-06-21 05:16:10','2006-02-15 22:14:00'),(5292,196,2,3342,'4.99','2005-06-21 10:46:36','2006-02-15 22:14:00'),(5293,196,1,4879,'2.99','2005-07-08 19:34:55','2006-02-15 22:14:00'),(5294,196,2,4999,'4.99','2005-07-09 01:12:57','2006-02-15 22:14:00'),(5295,196,2,5143,'4.99','2005-07-09 08:07:07','2006-02-15 22:14:00'),(5296,196,2,5353,'3.99','2005-07-09 18:04:29','2006-02-15 22:14:00'),(5297,196,2,5768,'4.99','2005-07-10 13:15:26','2006-02-15 22:14:00'),(5298,196,2,6857,'4.99','2005-07-12 19:53:30','2006-02-15 22:14:00'),(5299,196,2,7666,'3.99','2005-07-28 02:35:12','2006-02-15 22:14:00'),(5300,196,2,8266,'0.99','2005-07-29 01:20:16','2006-02-15 22:14:00'),(5301,196,2,8472,'1.99','2005-07-29 08:36:22','2006-02-15 22:14:00'),(5302,196,2,8700,'0.99','2005-07-29 16:56:01','2006-02-15 22:14:00'),(5303,196,1,9346,'5.99','2005-07-30 18:13:52','2006-02-15 22:14:00'),(5304,196,1,9721,'6.99','2005-07-31 08:28:46','2006-02-15 22:14:00'),(5305,196,1,9804,'4.99','2005-07-31 11:07:39','2006-02-15 22:14:00'),(5306,196,2,10122,'10.99','2005-07-31 21:29:28','2006-02-15 22:14:00'),(5307,196,1,10191,'4.99','2005-08-01 00:28:38','2006-02-15 22:14:00'),(5308,196,1,11104,'2.99','2005-08-02 08:09:58','2006-02-15 22:14:01'),(5309,196,2,12430,'0.99','2005-08-18 10:32:41','2006-02-15 22:14:01'),(5310,196,2,12684,'0.99','2005-08-18 19:51:27','2006-02-15 22:14:01'),(5311,196,2,12836,'0.99','2005-08-19 01:48:33','2006-02-15 22:14:01'),(5312,196,1,13799,'8.99','2005-08-20 12:36:42','2006-02-15 22:14:01'),(5313,196,2,14410,'5.99','2005-08-21 10:54:49','2006-02-15 22:14:01'),(5314,196,1,14698,'5.99','2005-08-21 20:49:58','2006-02-15 22:14:01'),(5315,196,2,15980,'0.99','2005-08-23 20:10:13','2006-02-15 22:14:01'),(5316,197,2,94,'2.99','2005-05-25 16:03:42','2006-02-15 22:14:01'),(5317,197,1,215,'0.99','2005-05-26 09:02:47','2006-02-15 22:14:01'),(5318,197,1,391,'2.99','2005-05-27 11:03:55','2006-02-15 22:14:01'),(5319,197,2,649,'1.99','2005-05-28 19:35:45','2006-02-15 22:14:01'),(5320,197,1,683,'2.99','2005-05-29 00:09:48','2006-02-15 22:14:01'),(5321,197,2,730,'3.99','2005-05-29 07:00:59','2006-02-15 22:14:01'),(5322,197,1,903,'3.99','2005-05-30 10:11:29','2006-02-15 22:14:01'),(5323,197,1,918,'0.99','2005-05-30 11:32:24','2006-02-15 22:14:01'),(5324,197,2,1175,'2.99','2005-06-15 00:15:15','2006-02-15 22:14:01'),(5325,197,1,1363,'0.99','2005-06-15 14:05:11','2006-02-15 22:14:01'),(5326,197,1,1503,'2.99','2005-06-15 22:07:09','2006-02-15 22:14:01'),(5327,197,2,1605,'8.99','2005-06-16 06:17:55','2006-02-15 22:14:01'),(5328,197,2,1919,'4.99','2005-06-17 05:40:52','2006-02-15 22:14:01'),(5329,197,1,2090,'2.99','2005-06-17 18:06:14','2006-02-15 22:14:01'),(5330,197,1,2750,'4.99','2005-06-19 16:37:24','2006-02-15 22:14:01'),(5331,197,2,2781,'2.99','2005-06-19 18:24:42','2006-02-15 22:14:01'),(5332,197,1,4486,'8.99','2005-07-08 01:09:09','2006-02-15 22:14:01'),(5333,197,2,4739,'4.99','2005-07-08 13:25:57','2006-02-15 22:14:01'),(5334,197,2,5182,'6.99','2005-07-09 10:08:10','2006-02-15 22:14:01'),(5335,197,2,5344,'0.99','2005-07-09 17:27:05','2006-02-15 22:14:01'),(5336,197,1,8165,'2.99','2005-07-28 21:23:06','2006-02-15 22:14:01'),(5337,197,2,9378,'4.99','2005-07-30 19:12:54','2006-02-15 22:14:01'),(5338,197,1,9476,'0.99','2005-07-30 23:06:40','2006-02-15 22:14:01'),(5339,197,2,9585,'4.99','2005-07-31 03:05:55','2006-02-15 22:14:01'),(5340,197,2,10460,'3.99','2005-08-01 09:31:00','2006-02-15 22:14:01'),(5341,197,2,10666,'0.99','2005-08-01 16:56:36','2006-02-15 22:14:01'),(5342,197,2,10739,'4.99','2005-08-01 19:46:11','2006-02-15 22:14:01'),(5343,197,1,10743,'2.99','2005-08-01 19:55:09','2006-02-15 22:14:01'),(5344,197,1,11018,'4.99','2005-08-02 05:27:53','2006-02-15 22:14:02'),(5345,197,1,11215,'4.99','2005-08-02 12:20:42','2006-02-15 22:14:02'),(5346,197,1,11311,'4.99','2005-08-02 15:53:48','2006-02-15 22:14:02'),(5347,197,1,11478,'2.99','2005-08-02 22:09:05','2006-02-15 22:14:02'),(5348,197,1,11643,'1.99','2005-08-17 04:49:35','2006-02-15 22:14:02'),(5349,197,1,12799,'0.99','2005-08-19 00:27:01','2006-02-15 22:14:02'),(5350,197,2,13913,'3.99','2005-08-20 16:37:35','2006-02-15 22:14:02'),(5351,197,1,14069,'9.99','2005-08-20 22:51:25','2006-02-15 22:14:02'),(5352,197,2,14951,'4.99','2005-08-22 06:19:37','2006-02-15 22:14:02'),(5353,197,1,15078,'2.99','2005-08-22 11:09:31','2006-02-15 22:14:02'),(5354,197,2,15233,'0.99','2005-08-22 17:41:53','2006-02-15 22:14:02'),(5355,197,1,15540,'8.99','2005-08-23 04:12:52','2006-02-15 22:14:02'),(5356,198,1,357,'0.99','2005-05-27 06:37:15','2006-02-15 22:14:02'),(5357,198,1,582,'4.99','2005-05-28 11:33:46','2006-02-15 22:14:02'),(5358,198,2,639,'2.99','2005-05-28 18:25:02','2006-02-15 22:14:02'),(5359,198,1,932,'2.99','2005-05-30 12:55:36','2006-02-15 22:14:02'),(5360,198,2,1132,'4.99','2005-05-31 18:44:53','2006-02-15 22:14:02'),(5361,198,2,2185,'0.99','2005-06-18 01:12:22','2006-02-15 22:14:02'),(5362,198,2,3770,'2.99','2005-07-06 13:14:28','2006-02-15 22:14:02'),(5363,198,2,4588,'2.99','2005-07-08 06:18:01','2006-02-15 22:14:02'),(5364,198,2,4750,'0.99','2005-07-08 14:07:03','2006-02-15 22:14:02'),(5365,198,2,5794,'4.99','2005-07-10 14:34:53','2006-02-15 22:14:02'),(5366,198,2,6567,'4.99','2005-07-12 05:43:09','2006-02-15 22:14:02'),(5367,198,1,6819,'4.99','2005-07-12 18:21:01','2006-02-15 22:14:02'),(5368,198,2,6889,'4.99','2005-07-12 21:01:22','2006-02-15 22:14:02'),(5369,198,1,7287,'0.99','2005-07-27 12:24:12','2006-02-15 22:14:02'),(5370,198,1,7441,'5.99','2005-07-27 17:46:53','2006-02-15 22:14:02'),(5371,198,1,7583,'2.99','2005-07-27 23:15:22','2006-02-15 22:14:02'),(5372,198,2,7622,'0.99','2005-07-28 00:37:34','2006-02-15 22:14:02'),(5373,198,1,8145,'5.99','2005-07-28 20:34:41','2006-02-15 22:14:02'),(5374,198,2,9389,'0.99','2005-07-30 19:27:59','2006-02-15 22:14:02'),(5375,198,1,10112,'4.99','2005-07-31 21:08:56','2006-02-15 22:14:02'),(5376,198,1,10147,'2.99','2005-07-31 22:18:43','2006-02-15 22:14:02'),(5377,198,1,10679,'0.99','2005-08-01 17:27:58','2006-02-15 22:14:02'),(5378,198,1,11351,'3.99','2005-08-02 17:28:07','2006-02-15 22:14:02'),(5379,198,1,11594,'6.99','2005-08-17 02:47:02','2006-02-15 22:14:02'),(5380,198,1,11756,'2.99','2005-08-17 09:29:22','2006-02-15 22:14:03'),(5381,198,1,11836,'4.99','2005-08-17 13:03:36','2006-02-15 22:14:03'),(5382,198,2,11949,'2.99','2005-08-17 17:12:26','2006-02-15 22:14:03'),(5383,198,1,11957,'1.99','2005-08-17 17:22:29','2006-02-15 22:14:03'),(5384,198,2,11985,'2.99','2005-08-17 18:19:44','2006-02-15 22:14:03'),(5385,198,2,12594,'4.99','2005-08-18 16:24:24','2006-02-15 22:14:03'),(5386,198,1,12862,'5.99','2005-08-19 02:31:59','2006-02-15 22:14:03'),(5387,198,1,13768,'5.99','2005-08-20 11:43:43','2006-02-15 22:14:03'),(5388,198,1,14214,'5.99','2005-08-21 04:30:49','2006-02-15 22:14:03'),(5389,198,2,14380,'2.99','2005-08-21 09:53:52','2006-02-15 22:14:03'),(5390,198,2,14990,'4.99','2005-08-22 07:48:01','2006-02-15 22:14:03'),(5391,198,1,15256,'6.99','2005-08-22 18:20:07','2006-02-15 22:14:03'),(5392,198,1,15433,'4.99','2005-08-23 00:27:18','2006-02-15 22:14:03'),(5393,199,1,499,'7.99','2005-05-28 01:05:07','2006-02-15 22:14:03'),(5394,199,1,1406,'4.99','2005-06-15 16:44:00','2006-02-15 22:14:03'),(5395,199,1,1910,'2.99','2005-06-17 05:11:27','2006-02-15 22:14:03'),(5396,199,1,3299,'0.99','2005-06-21 07:23:34','2006-02-15 22:14:03'),(5397,199,1,4499,'2.99','2005-07-08 02:08:48','2006-02-15 22:14:03'),(5398,199,2,4580,'8.99','2005-07-08 06:04:23','2006-02-15 22:14:03'),(5399,199,1,4976,'4.99','2005-07-09 00:03:30','2006-02-15 22:14:03'),(5400,199,2,5398,'2.99','2005-07-09 19:44:58','2006-02-15 22:14:03'),(5401,199,2,5680,'5.99','2005-07-10 08:47:36','2006-02-15 22:14:03'),(5402,199,2,6668,'2.99','2005-07-12 11:37:45','2006-02-15 22:14:03'),(5403,199,2,6782,'4.99','2005-07-12 16:23:25','2006-02-15 22:14:03'),(5404,199,1,7782,'4.99','2005-07-28 07:13:40','2006-02-15 22:14:03'),(5405,199,1,8709,'0.99','2005-07-29 17:25:54','2006-02-15 22:14:03'),(5406,199,1,9752,'2.99','2005-07-31 09:22:02','2006-02-15 22:14:03'),(5407,199,2,9894,'4.99','2005-07-31 14:07:44','2006-02-15 22:14:03'),(5408,199,1,9959,'4.99','2005-07-31 16:04:22','2006-02-15 22:14:03'),(5409,199,1,10196,'2.99','2005-08-01 00:34:51','2006-02-15 22:14:03'),(5410,199,2,10517,'4.99','2005-08-01 11:41:57','2006-02-15 22:14:03'),(5411,199,1,10850,'8.99','2005-08-01 23:53:45','2006-02-15 22:14:03'),(5412,199,1,11454,'2.99','2005-08-02 21:04:39','2006-02-15 22:14:03'),(5413,199,1,12386,'0.99','2005-08-18 08:45:57','2006-02-15 22:14:03'),(5414,199,2,14320,'4.99','2005-08-21 08:04:40','2006-02-15 22:14:03'),(5415,199,2,15412,'0.99','2005-08-22 23:37:11','2006-02-15 22:14:03'),(5416,199,2,15751,'3.99','2005-08-23 12:41:07','2006-02-15 22:14:04'),(5417,199,2,13952,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:04'),(5418,200,2,270,'9.99','2005-05-26 16:20:56','2006-02-15 22:14:04'),(5419,200,2,1296,'1.99','2005-06-15 09:23:59','2006-02-15 22:14:04'),(5420,200,2,1309,'4.99','2005-06-15 10:10:49','2006-02-15 22:14:04'),(5421,200,2,1899,'6.99','2005-06-17 04:29:15','2006-02-15 22:14:04'),(5422,200,1,2227,'4.99','2005-06-18 03:43:23','2006-02-15 22:14:04'),(5423,200,2,2667,'3.99','2005-06-19 11:28:46','2006-02-15 22:14:04'),(5424,200,2,2717,'4.99','2005-06-19 14:46:10','2006-02-15 22:14:04'),(5425,200,1,3190,'3.99','2005-06-20 23:27:15','2006-02-15 22:14:04'),(5426,200,1,3580,'4.99','2005-07-06 03:48:44','2006-02-15 22:14:04'),(5427,200,1,5110,'2.99','2005-07-09 06:57:25','2006-02-15 22:14:04'),(5428,200,1,6123,'0.99','2005-07-11 08:02:27','2006-02-15 22:14:04'),(5429,200,2,6167,'2.99','2005-07-11 10:21:21','2006-02-15 22:14:04'),(5430,200,1,6181,'4.99','2005-07-11 11:10:11','2006-02-15 22:14:04'),(5431,200,1,6947,'3.99','2005-07-26 23:42:03','2006-02-15 22:14:04'),(5432,200,1,7574,'2.99','2005-07-27 22:53:00','2006-02-15 22:14:04'),(5433,200,2,8368,'3.99','2005-07-29 05:15:41','2006-02-15 22:14:04'),(5434,200,2,8462,'2.99','2005-07-29 08:15:42','2006-02-15 22:14:04'),(5435,200,1,9527,'6.99','2005-07-31 01:02:24','2006-02-15 22:14:04'),(5436,200,1,10685,'2.99','2005-08-01 17:49:38','2006-02-15 22:14:04'),(5437,200,1,11356,'8.99','2005-08-02 17:42:40','2006-02-15 22:14:04'),(5438,200,1,13737,'5.99','2005-08-20 10:41:50','2006-02-15 22:14:04'),(5439,200,1,14034,'10.99','2005-08-20 21:31:52','2006-02-15 22:14:04'),(5440,200,2,14521,'6.99','2005-08-21 15:01:32','2006-02-15 22:14:04'),(5441,200,2,15691,'4.99','2005-08-23 09:53:54','2006-02-15 22:14:04'),(5442,200,2,15742,'5.99','2005-08-23 12:11:37','2006-02-15 22:14:04'),(5443,200,1,15961,'6.99','2005-08-23 19:35:42','2006-02-15 22:14:04'),(5444,200,2,11866,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:04'),(5445,201,1,311,'3.99','2005-05-26 22:51:37','2006-02-15 22:14:04'),(5446,201,1,670,'6.99','2005-05-28 22:04:03','2006-02-15 22:14:04'),(5447,201,2,756,'5.99','2005-05-29 10:28:45','2006-02-15 22:14:04'),(5448,201,1,2047,'1.99','2005-06-17 14:40:58','2006-02-15 22:14:04'),(5449,201,1,2157,'3.99','2005-06-17 23:30:52','2006-02-15 22:14:04'),(5450,201,2,2359,'6.99','2005-06-18 13:04:42','2006-02-15 22:14:04'),(5451,201,1,3106,'4.99','2005-06-20 17:18:06','2006-02-15 22:14:04'),(5452,201,1,3364,'7.99','2005-06-21 12:37:46','2006-02-15 22:14:05'),(5453,201,2,3528,'4.99','2005-07-06 01:13:27','2006-02-15 22:14:05'),(5454,201,2,3708,'6.99','2005-07-06 10:23:27','2006-02-15 22:14:05'),(5455,201,1,7106,'0.99','2005-07-27 05:21:24','2006-02-15 22:14:05'),(5456,201,2,7606,'2.99','2005-07-28 00:02:15','2006-02-15 22:14:05'),(5457,201,2,9355,'0.99','2005-07-30 18:35:25','2006-02-15 22:14:05'),(5458,201,2,10750,'5.99','2005-08-01 20:06:00','2006-02-15 22:14:05'),(5459,201,2,10865,'3.99','2005-08-02 00:22:46','2006-02-15 22:14:05'),(5460,201,1,10891,'0.99','2005-08-02 01:09:55','2006-02-15 22:14:05'),(5461,201,2,11807,'0.99','2005-08-17 11:51:15','2006-02-15 22:14:05'),(5462,201,2,13076,'4.99','2005-08-19 10:10:26','2006-02-15 22:14:05'),(5463,201,2,13613,'9.99','2005-08-20 06:23:53','2006-02-15 22:14:05'),(5464,201,2,13671,'3.99','2005-08-20 08:27:03','2006-02-15 22:14:05'),(5465,201,2,13672,'2.99','2005-08-20 08:27:27','2006-02-15 22:14:05'),(5466,201,2,14656,'2.99','2005-08-21 19:39:28','2006-02-15 22:14:05'),(5467,201,1,14973,'2.99','2005-08-22 06:59:28','2006-02-15 22:14:05'),(5468,201,1,15887,'2.99','2005-08-23 16:54:09','2006-02-15 22:14:05'),(5469,201,2,15974,'5.99','2005-08-23 20:06:04','2006-02-15 22:14:05'),(5470,202,1,1474,'2.99','2005-06-15 20:55:42','2006-02-15 22:14:05'),(5471,202,1,1535,'4.99','2005-06-16 00:52:04','2006-02-15 22:14:05'),(5472,202,1,3008,'0.99','2005-06-20 10:23:25','2006-02-15 22:14:05'),(5473,202,2,3148,'0.99','2005-06-20 20:27:18','2006-02-15 22:14:05'),(5474,202,1,3861,'8.99','2005-07-06 17:24:49','2006-02-15 22:14:05'),(5475,202,2,4567,'4.99','2005-07-08 05:20:04','2006-02-15 22:14:05'),(5476,202,2,5194,'2.99','2005-07-09 10:31:34','2006-02-15 22:14:05'),(5477,202,1,5297,'2.99','2005-07-09 15:32:29','2006-02-15 22:14:05'),(5478,202,2,5838,'2.99','2005-07-10 17:04:56','2006-02-15 22:14:05'),(5479,202,1,7613,'2.99','2005-07-28 00:13:58','2006-02-15 22:14:05'),(5480,202,1,8351,'2.99','2005-07-29 04:50:53','2006-02-15 22:14:05'),(5481,202,1,8779,'2.99','2005-07-29 20:15:00','2006-02-15 22:14:05'),(5482,202,1,8830,'2.99','2005-07-29 22:34:35','2006-02-15 22:14:05'),(5483,202,2,8930,'0.99','2005-07-30 02:28:38','2006-02-15 22:14:05'),(5484,202,2,9057,'2.99','2005-07-30 07:14:18','2006-02-15 22:14:05'),(5485,202,2,9467,'8.99','2005-07-30 22:45:34','2006-02-15 22:14:05'),(5486,202,2,9751,'4.99','2005-07-31 09:20:50','2006-02-15 22:14:05'),(5487,202,1,10375,'2.99','2005-08-01 06:26:22','2006-02-15 22:14:05'),(5488,202,1,11210,'4.99','2005-08-02 12:15:54','2006-02-15 22:14:06'),(5489,202,2,11924,'4.99','2005-08-17 16:22:05','2006-02-15 22:14:06'),(5490,202,2,12801,'8.99','2005-08-19 00:27:19','2006-02-15 22:14:06'),(5491,202,1,13196,'4.99','2005-08-19 14:40:32','2006-02-15 22:14:06'),(5492,202,1,13528,'3.99','2005-08-20 03:03:31','2006-02-15 22:14:06'),(5493,202,1,14019,'3.99','2005-08-20 20:59:15','2006-02-15 22:14:06'),(5494,202,1,15095,'0.99','2005-08-22 11:41:35','2006-02-15 22:14:06'),(5495,202,2,15772,'4.99','2005-08-23 13:22:56','2006-02-15 22:14:06'),(5496,203,1,314,'0.99','2005-05-26 23:09:41','2006-02-15 22:14:06'),(5497,203,1,1217,'4.99','2005-06-15 03:24:14','2006-02-15 22:14:06'),(5498,203,1,1715,'2.99','2005-06-16 14:37:12','2006-02-15 22:14:06'),(5499,203,2,2939,'7.99','2005-06-20 05:18:16','2006-02-15 22:14:06'),(5500,203,2,3406,'2.99','2005-06-21 16:00:18','2006-02-15 22:14:06'),(5501,203,2,4136,'2.99','2005-07-07 08:15:52','2006-02-15 22:14:06'),(5502,203,2,5579,'5.99','2005-07-10 04:04:29','2006-02-15 22:14:06'),(5503,203,2,7787,'6.99','2005-07-28 07:19:02','2006-02-15 22:14:06'),(5504,203,1,8039,'0.99','2005-07-28 16:35:16','2006-02-15 22:14:06'),(5505,203,1,8463,'4.99','2005-07-29 08:17:51','2006-02-15 22:14:06'),(5506,203,1,8792,'7.99','2005-07-29 20:56:14','2006-02-15 22:14:06'),(5507,203,2,9015,'10.99','2005-07-30 05:21:32','2006-02-15 22:14:06'),(5508,203,2,10700,'3.99','2005-08-01 18:26:31','2006-02-15 22:14:06'),(5509,203,2,10805,'2.99','2005-08-01 22:23:37','2006-02-15 22:14:06'),(5510,203,1,11712,'2.99','2005-08-17 07:32:51','2006-02-15 22:14:06'),(5511,203,1,12519,'0.99','2005-08-18 13:42:14','2006-02-15 22:14:06'),(5512,203,2,13841,'4.99','2005-08-20 14:25:18','2006-02-15 22:14:06'),(5513,203,2,14505,'5.99','2005-08-21 14:26:28','2006-02-15 22:14:06'),(5514,203,2,15798,'2.99','2005-08-23 14:23:03','2006-02-15 22:14:06'),(5515,203,2,15991,'2.99','2005-08-23 20:27:34','2006-02-15 22:14:06'),(5516,204,2,251,'0.99','2005-05-26 14:35:40','2006-02-15 22:14:06'),(5517,204,2,399,'4.99','2005-05-27 12:48:38','2006-02-15 22:14:06'),(5518,204,2,857,'4.99','2005-05-30 02:01:23','2006-02-15 22:14:06'),(5519,204,1,1016,'1.99','2005-05-31 02:49:43','2006-02-15 22:14:06'),(5520,204,1,1321,'2.99','2005-06-15 10:49:17','2006-02-15 22:14:06'),(5521,204,1,1616,'7.99','2005-06-16 07:04:52','2006-02-15 22:14:06'),(5522,204,1,1871,'4.99','2005-06-17 02:25:12','2006-02-15 22:14:06'),(5523,204,2,1894,'7.99','2005-06-17 04:18:48','2006-02-15 22:14:06'),(5524,204,2,2186,'2.99','2005-06-18 01:15:27','2006-02-15 22:14:07'),(5525,204,2,2734,'4.99','2005-06-19 15:36:27','2006-02-15 22:14:07'),(5526,204,1,4043,'0.99','2005-07-07 03:09:50','2006-02-15 22:14:07'),(5527,204,1,4979,'4.99','2005-07-09 00:24:34','2006-02-15 22:14:07'),(5528,204,2,5145,'0.99','2005-07-09 08:13:25','2006-02-15 22:14:07'),(5529,204,1,5619,'2.99','2005-07-10 05:29:33','2006-02-15 22:14:07'),(5530,204,2,6004,'4.99','2005-07-11 01:34:25','2006-02-15 22:14:07'),(5531,204,2,6225,'2.99','2005-07-11 13:45:14','2006-02-15 22:14:07'),(5532,204,2,6631,'0.99','2005-07-12 09:31:43','2006-02-15 22:14:07'),(5533,204,1,6694,'6.99','2005-07-12 12:39:23','2006-02-15 22:14:07'),(5534,204,2,6871,'2.99','2005-07-12 20:13:49','2006-02-15 22:14:07'),(5535,204,1,7392,'4.99','2005-07-27 16:01:05','2006-02-15 22:14:07'),(5536,204,2,9005,'0.99','2005-07-30 05:04:58','2006-02-15 22:14:07'),(5537,204,1,9394,'5.99','2005-07-30 20:06:24','2006-02-15 22:14:07'),(5538,204,2,9906,'4.99','2005-07-31 14:38:12','2006-02-15 22:14:07'),(5539,204,2,10042,'2.99','2005-07-31 19:01:25','2006-02-15 22:14:07'),(5540,204,2,10399,'5.99','2005-08-01 07:13:39','2006-02-15 22:14:07'),(5541,204,1,11261,'7.99','2005-08-02 13:54:26','2006-02-15 22:14:07'),(5542,204,2,11886,'0.99','2005-08-17 14:58:51','2006-02-15 22:14:07'),(5543,204,1,12737,'6.99','2005-08-18 22:11:37','2006-02-15 22:14:07'),(5544,204,1,13084,'0.99','2005-08-19 10:27:25','2006-02-15 22:14:07'),(5545,204,1,13416,'4.99','2005-08-19 22:48:48','2006-02-15 22:14:07'),(5546,204,2,13899,'2.99','2005-08-20 16:05:11','2006-02-15 22:14:07'),(5547,204,2,14163,'4.99','2005-08-21 02:56:52','2006-02-15 22:14:07'),(5548,204,1,14871,'0.99','2005-08-22 03:23:24','2006-02-15 22:14:07'),(5549,204,1,15364,'4.99','2005-08-22 21:41:41','2006-02-15 22:14:07'),(5550,204,2,15415,'11.99','2005-08-22 23:48:56','2006-02-15 22:14:07'),(5551,205,1,1238,'2.99','2005-06-15 04:49:08','2006-02-15 22:14:07'),(5552,205,1,1357,'4.99','2005-06-15 13:26:23','2006-02-15 22:14:07'),(5553,205,1,1767,'0.99','2005-06-16 18:01:36','2006-02-15 22:14:07'),(5554,205,2,2237,'5.99','2005-06-18 04:17:44','2006-02-15 22:14:07'),(5555,205,1,3601,'7.99','2005-07-06 05:20:25','2006-02-15 22:14:07'),(5556,205,2,4230,'3.99','2005-07-07 12:46:47','2006-02-15 22:14:07'),(5557,205,2,4377,'7.99','2005-07-07 20:28:57','2006-02-15 22:14:07'),(5558,205,1,4729,'4.99','2005-07-08 12:59:40','2006-02-15 22:14:07'),(5559,205,1,7736,'2.99','2005-07-28 05:12:04','2006-02-15 22:14:08'),(5560,205,2,7976,'7.99','2005-07-28 14:13:24','2006-02-15 22:14:08'),(5561,205,2,8896,'4.99','2005-07-30 00:51:21','2006-02-15 22:14:08'),(5562,205,2,10086,'4.99','2005-07-31 20:14:08','2006-02-15 22:14:08'),(5563,205,1,13935,'2.99','2005-08-20 17:20:49','2006-02-15 22:14:08'),(5564,205,1,14338,'0.99','2005-08-21 08:36:03','2006-02-15 22:14:08'),(5565,205,2,14391,'4.99','2005-08-21 10:16:27','2006-02-15 22:14:08'),(5566,205,1,14442,'2.99','2005-08-21 12:00:21','2006-02-15 22:14:08'),(5567,205,2,14490,'6.99','2005-08-21 13:54:15','2006-02-15 22:14:08'),(5568,205,2,15418,'0.99','2005-08-22 23:54:14','2006-02-15 22:14:08'),(5569,206,2,1872,'0.99','2005-06-17 02:27:03','2006-02-15 22:14:08'),(5570,206,2,2477,'5.99','2005-06-18 20:58:46','2006-02-15 22:14:08'),(5571,206,2,3012,'4.99','2005-06-20 10:43:13','2006-02-15 22:14:08'),(5572,206,1,3533,'5.99','2005-07-06 01:26:44','2006-02-15 22:14:08'),(5573,206,2,3831,'0.99','2005-07-06 16:06:35','2006-02-15 22:14:08'),(5574,206,1,3847,'4.99','2005-07-06 16:44:41','2006-02-15 22:14:08'),(5575,206,2,4068,'4.99','2005-07-07 04:34:38','2006-02-15 22:14:08'),(5576,206,2,4107,'4.99','2005-07-07 06:36:32','2006-02-15 22:14:08'),(5577,206,2,4823,'4.99','2005-07-08 17:28:54','2006-02-15 22:14:08'),(5578,206,1,6139,'3.99','2005-07-11 08:39:33','2006-02-15 22:14:08'),(5579,206,1,6420,'6.99','2005-07-11 23:38:49','2006-02-15 22:14:08'),(5580,206,1,7222,'4.99','2005-07-27 09:38:43','2006-02-15 22:14:08'),(5581,206,2,7541,'4.99','2005-07-27 21:40:05','2006-02-15 22:14:08'),(5582,206,1,8217,'5.99','2005-07-28 23:44:13','2006-02-15 22:14:08'),(5583,206,1,8549,'3.99','2005-07-29 11:12:13','2006-02-15 22:14:08'),(5584,206,2,9474,'2.99','2005-07-30 23:05:44','2006-02-15 22:14:08'),(5585,206,2,10930,'3.99','2005-08-02 02:38:07','2006-02-15 22:14:08'),(5586,206,1,11022,'2.99','2005-08-02 05:35:03','2006-02-15 22:14:08'),(5587,206,2,11634,'2.99','2005-08-17 04:31:49','2006-02-15 22:14:08'),(5588,206,1,13128,'4.99','2005-08-19 12:04:16','2006-02-15 22:14:08'),(5589,206,2,13232,'2.99','2005-08-19 16:13:32','2006-02-15 22:14:08'),(5590,206,2,13263,'10.99','2005-08-19 17:26:55','2006-02-15 22:14:08'),(5591,206,2,13550,'9.99','2005-08-20 03:58:51','2006-02-15 22:14:08'),(5592,206,2,13696,'0.99','2005-08-20 09:16:15','2006-02-15 22:14:08'),(5593,206,2,14695,'0.99','2005-08-21 20:46:47','2006-02-15 22:14:08'),(5594,206,2,15686,'7.99','2005-08-23 09:42:21','2006-02-15 22:14:09'),(5595,206,1,15709,'4.99','2005-08-23 10:36:00','2006-02-15 22:14:09'),(5596,207,1,39,'0.99','2005-05-25 04:51:46','2006-02-15 22:14:09'),(5597,207,1,44,'0.99','2005-05-25 05:53:23','2006-02-15 22:14:09'),(5598,207,1,659,'0.99','2005-05-28 20:27:53','2006-02-15 22:14:09'),(5599,207,2,826,'6.99','2005-05-29 21:56:15','2006-02-15 22:14:09'),(5600,207,2,896,'3.99','2005-05-30 09:03:52','2006-02-15 22:14:09'),(5601,207,2,1144,'3.99','2005-05-31 20:04:10','2006-02-15 22:14:09'),(5602,207,2,1945,'3.99','2005-06-17 07:51:26','2006-02-15 22:14:09'),(5603,207,2,3584,'2.99','2005-07-06 04:16:43','2006-02-15 22:14:09'),(5604,207,2,3687,'9.99','2005-07-06 09:38:33','2006-02-15 22:14:09'),(5605,207,1,4018,'2.99','2005-07-07 01:10:33','2006-02-15 22:14:09'),(5606,207,2,4713,'5.99','2005-07-08 12:12:33','2006-02-15 22:14:09'),(5607,207,1,4816,'0.99','2005-07-08 17:14:14','2006-02-15 22:14:09'),(5608,207,2,5007,'0.99','2005-07-09 01:26:22','2006-02-15 22:14:09'),(5609,207,1,5258,'0.99','2005-07-09 13:56:56','2006-02-15 22:14:09'),(5610,207,1,5259,'4.99','2005-07-09 14:02:50','2006-02-15 22:14:09'),(5611,207,2,5939,'0.99','2005-07-10 22:30:05','2006-02-15 22:14:09'),(5612,207,2,6465,'5.99','2005-07-12 01:17:11','2006-02-15 22:14:09'),(5613,207,1,6537,'0.99','2005-07-12 04:46:30','2006-02-15 22:14:09'),(5614,207,2,7306,'5.99','2005-07-27 12:57:26','2006-02-15 22:14:09'),(5615,207,1,7540,'5.99','2005-07-27 21:39:55','2006-02-15 22:14:09'),(5616,207,1,8800,'5.99','2005-07-29 21:18:59','2006-02-15 22:14:09'),(5617,207,2,9652,'2.99','2005-07-31 05:49:53','2006-02-15 22:14:09'),(5618,207,2,10234,'3.99','2005-08-01 01:56:20','2006-02-15 22:14:09'),(5619,207,2,10300,'0.99','2005-08-01 04:08:11','2006-02-15 22:14:09'),(5620,207,1,11112,'2.99','2005-08-02 08:25:14','2006-02-15 22:14:09'),(5621,207,2,11260,'0.99','2005-08-02 13:52:19','2006-02-15 22:14:09'),(5622,207,2,11286,'5.99','2005-08-02 14:44:22','2006-02-15 22:14:09'),(5623,207,1,11724,'6.99','2005-08-17 08:04:44','2006-02-15 22:14:09'),(5624,207,2,12108,'6.99','2005-08-17 22:56:39','2006-02-15 22:14:09'),(5625,207,2,13655,'2.99','2005-08-20 07:59:13','2006-02-15 22:14:09'),(5626,207,2,13809,'8.99','2005-08-20 12:56:03','2006-02-15 22:14:09'),(5627,207,2,13912,'9.99','2005-08-20 16:32:10','2006-02-15 22:14:09'),(5628,207,2,13954,'3.99','2005-08-20 18:02:41','2006-02-15 22:14:09'),(5629,207,1,15625,'1.99','2005-08-23 07:25:29','2006-02-15 22:14:10'),(5630,208,1,100,'4.99','2005-05-25 16:50:28','2006-02-15 22:14:10'),(5631,208,1,1805,'0.99','2005-06-16 20:36:00','2006-02-15 22:14:10'),(5632,208,1,1949,'5.99','2005-06-17 08:19:22','2006-02-15 22:14:10'),(5633,208,2,2592,'0.99','2005-06-19 05:36:54','2006-02-15 22:14:10'),(5634,208,1,2695,'2.99','2005-06-19 13:25:53','2006-02-15 22:14:10'),(5635,208,2,2907,'0.99','2005-06-20 03:15:09','2006-02-15 22:14:10'),(5636,208,2,3811,'2.99','2005-07-06 15:20:37','2006-02-15 22:14:10'),(5637,208,1,4354,'5.99','2005-07-07 19:21:02','2006-02-15 22:14:10'),(5638,208,2,4985,'4.99','2005-07-09 00:36:02','2006-02-15 22:14:10'),(5639,208,1,5117,'2.99','2005-07-09 07:11:22','2006-02-15 22:14:10'),(5640,208,2,5693,'2.99','2005-07-10 09:35:43','2006-02-15 22:14:10'),(5641,208,2,6306,'6.99','2005-07-11 18:04:26','2006-02-15 22:14:10'),(5642,208,1,6767,'1.99','2005-07-12 15:46:55','2006-02-15 22:14:10'),(5643,208,1,7315,'0.99','2005-07-27 13:14:56','2006-02-15 22:14:10'),(5644,208,1,7861,'2.99','2005-07-28 10:02:01','2006-02-15 22:14:10'),(5645,208,2,7984,'2.99','2005-07-28 14:27:51','2006-02-15 22:14:10'),(5646,208,1,8742,'1.99','2005-07-29 18:56:12','2006-02-15 22:14:10'),(5647,208,2,9298,'3.99','2005-07-30 16:27:53','2006-02-15 22:14:10'),(5648,208,1,9838,'4.99','2005-07-31 12:18:49','2006-02-15 22:14:10'),(5649,208,2,10762,'4.99','2005-08-01 20:28:39','2006-02-15 22:14:10'),(5650,208,2,10784,'5.99','2005-08-01 21:24:28','2006-02-15 22:14:10'),(5651,208,2,11442,'2.99','2005-08-02 20:26:19','2006-02-15 22:14:10'),(5652,208,2,11805,'6.99','2005-08-17 11:48:47','2006-02-15 22:14:10'),(5653,208,2,11819,'0.99','2005-08-17 12:25:17','2006-02-15 22:14:10'),(5654,208,1,13719,'5.98','2006-02-14 15:16:03','2006-02-15 22:14:10'),(5655,208,1,15717,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:10'),(5656,209,2,340,'9.99','2005-05-27 03:55:25','2006-02-15 22:14:10'),(5657,209,1,471,'0.99','2005-05-27 21:32:42','2006-02-15 22:14:10'),(5658,209,2,1143,'2.99','2005-05-31 19:53:03','2006-02-15 22:14:10'),(5659,209,2,1201,'4.99','2005-06-15 02:06:28','2006-02-15 22:14:10'),(5660,209,1,1657,'4.99','2005-06-16 10:06:49','2006-02-15 22:14:10'),(5661,209,1,2650,'4.99','2005-06-19 10:21:45','2006-02-15 22:14:10'),(5662,209,1,2796,'4.99','2005-06-19 19:00:37','2006-02-15 22:14:10'),(5663,209,2,3504,'2.99','2005-07-06 00:18:29','2006-02-15 22:14:10'),(5664,209,2,4071,'5.99','2005-07-07 04:37:26','2006-02-15 22:14:11'),(5665,209,1,4309,'5.99','2005-07-07 17:29:41','2006-02-15 22:14:11'),(5666,209,2,4810,'4.99','2005-07-08 17:04:06','2006-02-15 22:14:11'),(5667,209,1,4907,'4.99','2005-07-08 21:01:41','2006-02-15 22:14:11'),(5668,209,2,5170,'3.99','2005-07-09 09:24:19','2006-02-15 22:14:11'),(5669,209,2,5219,'5.99','2005-07-09 11:57:55','2006-02-15 22:14:11'),(5670,209,1,6210,'0.99','2005-07-11 12:36:43','2006-02-15 22:14:11'),(5671,209,1,7116,'6.99','2005-07-27 05:46:43','2006-02-15 22:14:11'),(5672,209,1,7269,'3.99','2005-07-27 11:23:47','2006-02-15 22:14:11'),(5673,209,1,7505,'4.99','2005-07-27 20:28:03','2006-02-15 22:14:11'),(5674,209,2,7752,'5.99','2005-07-28 06:01:00','2006-02-15 22:14:11'),(5675,209,1,8067,'4.99','2005-07-28 17:20:17','2006-02-15 22:14:11'),(5676,209,2,8759,'8.99','2005-07-29 19:22:37','2006-02-15 22:14:11'),(5677,209,2,8816,'2.99','2005-07-29 21:53:00','2006-02-15 22:14:11'),(5678,209,2,9054,'6.99','2005-07-30 07:11:44','2006-02-15 22:14:11'),(5679,209,1,9923,'0.99','2005-07-31 15:00:15','2006-02-15 22:14:11'),(5680,209,2,10554,'2.99','2005-08-01 12:56:19','2006-02-15 22:14:11'),(5681,209,1,10646,'4.99','2005-08-01 15:57:55','2006-02-15 22:14:11'),(5682,209,2,10811,'6.99','2005-08-01 22:41:15','2006-02-15 22:14:11'),(5683,209,1,12025,'0.99','2005-08-17 19:59:06','2006-02-15 22:14:11'),(5684,209,1,13796,'8.99','2005-08-20 12:32:32','2006-02-15 22:14:11'),(5685,209,2,14631,'6.99','2005-08-21 18:47:49','2006-02-15 22:14:11'),(5686,209,1,15254,'2.99','2005-08-22 18:13:07','2006-02-15 22:14:11'),(5687,209,2,15510,'9.99','2005-08-23 02:51:27','2006-02-15 22:14:11'),(5688,210,1,953,'2.99','2005-05-30 16:34:02','2006-02-15 22:14:11'),(5689,210,2,1177,'2.99','2005-06-15 00:33:04','2006-02-15 22:14:11'),(5690,210,2,2856,'0.99','2005-06-19 23:13:04','2006-02-15 22:14:11'),(5691,210,2,3563,'4.99','2005-07-06 02:57:01','2006-02-15 22:14:11'),(5692,210,2,3884,'4.99','2005-07-06 18:41:33','2006-02-15 22:14:11'),(5693,210,2,4270,'0.99','2005-07-07 14:38:41','2006-02-15 22:14:11'),(5694,210,1,4306,'2.99','2005-07-07 17:12:32','2006-02-15 22:14:11'),(5695,210,1,4334,'0.99','2005-07-07 18:32:04','2006-02-15 22:14:11'),(5696,210,2,4388,'7.99','2005-07-07 20:58:03','2006-02-15 22:14:11'),(5697,210,1,4620,'5.99','2005-07-08 08:01:44','2006-02-15 22:14:11'),(5698,210,1,4871,'6.99','2005-07-08 19:19:52','2006-02-15 22:14:12'),(5699,210,1,4893,'4.99','2005-07-08 20:19:55','2006-02-15 22:14:12'),(5700,210,1,4989,'3.99','2005-07-09 00:46:56','2006-02-15 22:14:12'),(5701,210,2,5957,'0.99','2005-07-10 23:24:02','2006-02-15 22:14:12'),(5702,210,2,6227,'4.99','2005-07-11 13:56:46','2006-02-15 22:14:12'),(5703,210,1,6564,'1.99','2005-07-12 05:34:44','2006-02-15 22:14:12'),(5704,210,1,7743,'5.99','2005-07-28 05:36:13','2006-02-15 22:14:12'),(5705,210,2,7909,'0.99','2005-07-28 11:38:08','2006-02-15 22:14:12'),(5706,210,2,8336,'8.99','2005-07-29 04:20:42','2006-02-15 22:14:12'),(5707,210,2,8678,'3.99','2005-07-29 16:04:00','2006-02-15 22:14:12'),(5708,210,2,8738,'0.99','2005-07-29 18:32:47','2006-02-15 22:14:12'),(5709,210,2,10890,'4.99','2005-08-02 00:58:46','2006-02-15 22:14:12'),(5710,210,2,12410,'8.99','2005-08-18 09:45:33','2006-02-15 22:14:12'),(5711,210,1,12879,'4.99','2005-08-19 03:22:55','2006-02-15 22:14:12'),(5712,210,2,12909,'2.99','2005-08-19 04:20:25','2006-02-15 22:14:12'),(5713,210,2,12986,'4.99','2005-08-19 07:09:36','2006-02-15 22:14:12'),(5714,210,1,14181,'7.99','2005-08-21 03:16:30','2006-02-15 22:14:12'),(5715,210,2,14639,'6.99','2005-08-21 19:01:39','2006-02-15 22:14:12'),(5716,210,2,14876,'4.99','2005-08-22 03:39:29','2006-02-15 22:14:12'),(5717,210,2,15672,'0.99','2005-08-23 09:09:18','2006-02-15 22:14:12'),(5718,210,2,15942,'8.99','2005-08-23 18:48:40','2006-02-15 22:14:12'),(5719,211,1,238,'4.99','2005-05-26 12:30:22','2006-02-15 22:14:12'),(5720,211,2,2812,'8.99','2005-06-19 19:58:16','2006-02-15 22:14:12'),(5721,211,2,3437,'6.99','2005-06-21 19:20:17','2006-02-15 22:14:12'),(5722,211,2,3937,'8.99','2005-07-06 21:15:38','2006-02-15 22:14:12'),(5723,211,2,4060,'2.99','2005-07-07 04:10:13','2006-02-15 22:14:12'),(5724,211,2,4441,'5.99','2005-07-07 23:04:23','2006-02-15 22:14:12'),(5725,211,2,4479,'2.99','2005-07-08 00:52:35','2006-02-15 22:14:12'),(5726,211,1,4857,'2.99','2005-07-08 18:52:07','2006-02-15 22:14:12'),(5727,211,1,5668,'5.99','2005-07-10 08:11:05','2006-02-15 22:14:12'),(5728,211,2,5699,'3.99','2005-07-10 09:48:04','2006-02-15 22:14:12'),(5729,211,2,5785,'4.99','2005-07-10 14:06:03','2006-02-15 22:14:12'),(5730,211,2,6438,'0.99','2005-07-12 00:23:01','2006-02-15 22:14:12'),(5731,211,1,6628,'4.99','2005-07-12 09:18:08','2006-02-15 22:14:13'),(5732,211,1,6722,'1.99','2005-07-12 13:44:03','2006-02-15 22:14:13'),(5733,211,2,7484,'0.99','2005-07-27 19:28:17','2006-02-15 22:14:13'),(5734,211,1,7975,'2.99','2005-07-28 14:12:47','2006-02-15 22:14:13'),(5735,211,2,8961,'6.99','2005-07-30 03:43:35','2006-02-15 22:14:13'),(5736,211,1,9111,'3.99','2005-07-30 09:05:44','2006-02-15 22:14:13'),(5737,211,1,9953,'0.99','2005-07-31 15:56:35','2006-02-15 22:14:13'),(5738,211,1,10445,'2.99','2005-08-01 09:02:15','2006-02-15 22:14:13'),(5739,211,2,10928,'4.99','2005-08-02 02:34:12','2006-02-15 22:14:13'),(5740,211,2,11076,'8.99','2005-08-02 07:24:47','2006-02-15 22:14:13'),(5741,211,2,11963,'3.99','2005-08-17 17:35:47','2006-02-15 22:14:13'),(5742,211,2,12311,'0.99','2005-08-18 06:07:00','2006-02-15 22:14:13'),(5743,211,2,12565,'4.99','2005-08-18 15:12:17','2006-02-15 22:14:13'),(5744,211,2,12570,'5.99','2005-08-18 15:23:31','2006-02-15 22:14:13'),(5745,211,2,13942,'2.99','2005-08-20 17:30:52','2006-02-15 22:14:13'),(5746,211,1,13979,'2.99','2005-08-20 19:03:49','2006-02-15 22:14:13'),(5747,211,2,14782,'0.99','2005-08-22 00:17:20','2006-02-15 22:14:13'),(5748,211,2,14812,'1.99','2005-08-22 01:10:32','2006-02-15 22:14:13'),(5749,211,1,15404,'7.99','2005-08-22 23:19:44','2006-02-15 22:14:13'),(5750,211,2,15538,'6.99','2005-08-23 04:07:37','2006-02-15 22:14:13'),(5751,211,2,15670,'5.99','2005-08-23 09:07:11','2006-02-15 22:14:13'),(5752,211,2,12746,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:13'),(5753,212,1,1356,'0.99','2005-06-15 13:17:01','2006-02-15 22:14:13'),(5754,212,2,1379,'0.99','2005-06-15 15:05:10','2006-02-15 22:14:13'),(5755,212,1,1637,'2.99','2005-06-16 08:29:58','2006-02-15 22:14:13'),(5756,212,2,2739,'9.99','2005-06-19 15:58:38','2006-02-15 22:14:13'),(5757,212,2,4708,'10.99','2005-07-08 11:59:19','2006-02-15 22:14:13'),(5758,212,2,4798,'3.99','2005-07-08 16:45:16','2006-02-15 22:14:13'),(5759,212,2,4916,'6.99','2005-07-08 21:32:17','2006-02-15 22:14:13'),(5760,212,1,5115,'6.99','2005-07-09 07:07:18','2006-02-15 22:14:13'),(5761,212,2,7828,'2.99','2005-07-28 08:40:46','2006-02-15 22:14:13'),(5762,212,2,8000,'4.99','2005-07-28 15:10:25','2006-02-15 22:14:13'),(5763,212,1,8940,'3.99','2005-07-30 02:57:26','2006-02-15 22:14:13'),(5764,212,2,10273,'4.99','2005-08-01 03:14:47','2006-02-15 22:14:13'),(5765,212,2,10567,'0.99','2005-08-01 13:16:01','2006-02-15 22:14:14'),(5766,212,1,12156,'7.99','2005-08-18 00:27:33','2006-02-15 22:14:14'),(5767,212,2,12467,'0.99','2005-08-18 11:40:09','2006-02-15 22:14:14'),(5768,212,2,12562,'3.99','2005-08-18 15:00:03','2006-02-15 22:14:14'),(5769,212,1,14563,'2.99','2005-08-21 16:23:53','2006-02-15 22:14:14'),(5770,212,2,14681,'5.99','2005-08-21 20:25:13','2006-02-15 22:14:14'),(5771,212,1,15872,'4.99','2005-08-23 16:27:24','2006-02-15 22:14:14'),(5772,212,2,15920,'2.99','2005-08-23 18:05:10','2006-02-15 22:14:14'),(5773,213,2,385,'0.99','2005-05-27 10:23:25','2006-02-15 22:14:14'),(5774,213,1,1489,'0.99','2005-06-15 21:41:38','2006-02-15 22:14:14'),(5775,213,2,1936,'4.99','2005-06-17 07:15:41','2006-02-15 22:14:14'),(5776,213,1,2322,'5.99','2005-06-18 09:44:21','2006-02-15 22:14:14'),(5777,213,1,2509,'0.99','2005-06-18 23:44:08','2006-02-15 22:14:14'),(5778,213,2,2569,'6.99','2005-06-19 04:19:04','2006-02-15 22:14:14'),(5779,213,1,2889,'4.99','2005-06-20 01:54:08','2006-02-15 22:14:14'),(5780,213,2,2946,'4.99','2005-06-20 05:50:40','2006-02-15 22:14:14'),(5781,213,1,3252,'2.99','2005-06-21 03:25:26','2006-02-15 22:14:14'),(5782,213,1,3313,'2.99','2005-06-21 08:11:18','2006-02-15 22:14:14'),(5783,213,2,3989,'4.99','2005-07-06 23:30:54','2006-02-15 22:14:14'),(5784,213,2,4236,'4.99','2005-07-07 13:12:07','2006-02-15 22:14:14'),(5785,213,1,4655,'8.99','2005-07-08 09:49:22','2006-02-15 22:14:14'),(5786,213,2,5159,'4.99','2005-07-09 08:55:52','2006-02-15 22:14:14'),(5787,213,1,5431,'0.99','2005-07-09 21:21:11','2006-02-15 22:14:14'),(5788,213,2,6725,'2.99','2005-07-12 13:47:17','2006-02-15 22:14:14'),(5789,213,2,7528,'0.99','2005-07-27 21:15:25','2006-02-15 22:14:14'),(5790,213,2,8444,'2.99','2005-07-29 07:36:13','2006-02-15 22:14:14'),(5791,213,2,8542,'4.99','2005-07-29 11:01:50','2006-02-15 22:14:14'),(5792,213,2,9150,'6.99','2005-07-30 10:49:32','2006-02-15 22:14:14'),(5793,213,2,9340,'2.99','2005-07-30 18:07:16','2006-02-15 22:14:14'),(5794,213,1,9477,'4.99','2005-07-30 23:07:22','2006-02-15 22:14:14'),(5795,213,1,10449,'2.99','2005-08-01 09:09:59','2006-02-15 22:14:14'),(5796,213,2,11778,'3.99','2005-08-17 10:31:40','2006-02-15 22:14:14'),(5797,213,1,13354,'4.99','2005-08-19 20:55:23','2006-02-15 22:14:14'),(5798,213,2,13426,'0.99','2005-08-19 23:15:00','2006-02-15 22:14:14'),(5799,213,1,14744,'6.99','2005-08-21 22:45:21','2006-02-15 22:14:15'),(5800,213,2,14374,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:15'),(5801,214,1,242,'1.99','2005-05-26 13:05:08','2006-02-15 22:14:15'),(5802,214,1,278,'3.99','2005-05-26 17:40:58','2006-02-15 22:14:15'),(5803,214,1,1076,'2.99','2005-05-31 10:14:31','2006-02-15 22:14:15'),(5804,214,2,1093,'2.99','2005-05-31 12:32:26','2006-02-15 22:14:15'),(5805,214,2,1112,'0.99','2005-05-31 15:51:39','2006-02-15 22:14:15'),(5806,214,2,1275,'4.99','2005-06-15 07:55:43','2006-02-15 22:14:15'),(5807,214,2,2085,'2.99','2005-06-17 17:30:56','2006-02-15 22:14:15'),(5808,214,2,2868,'2.99','2005-06-20 00:08:58','2006-02-15 22:14:15'),(5809,214,2,4211,'0.99','2005-07-07 11:50:41','2006-02-15 22:14:15'),(5810,214,1,4783,'3.99','2005-07-08 16:09:24','2006-02-15 22:14:15'),(5811,214,2,4984,'3.99','2005-07-09 00:35:31','2006-02-15 22:14:15'),(5812,214,2,5172,'2.99','2005-07-09 09:31:27','2006-02-15 22:14:15'),(5813,214,1,6602,'7.99','2005-07-12 07:50:24','2006-02-15 22:14:15'),(5814,214,2,7417,'4.99','2005-07-27 16:58:33','2006-02-15 22:14:15'),(5815,214,2,7826,'5.99','2005-07-28 08:35:51','2006-02-15 22:14:15'),(5816,214,1,8663,'4.99','2005-07-29 15:33:18','2006-02-15 22:14:15'),(5817,214,1,10563,'3.99','2005-08-01 13:06:03','2006-02-15 22:14:15'),(5818,214,2,10749,'4.99','2005-08-01 20:02:01','2006-02-15 22:14:15'),(5819,214,2,11450,'2.99','2005-08-02 20:45:54','2006-02-15 22:14:15'),(5820,214,2,11474,'4.99','2005-08-02 21:53:08','2006-02-15 22:14:15'),(5821,214,2,12463,'4.99','2005-08-18 11:31:34','2006-02-15 22:14:15'),(5822,214,2,13138,'2.99','2005-08-19 12:30:01','2006-02-15 22:14:15'),(5823,214,2,13350,'9.99','2005-08-19 20:44:00','2006-02-15 22:14:15'),(5824,214,1,13409,'2.99','2005-08-19 22:36:26','2006-02-15 22:14:15'),(5825,214,1,13565,'0.99','2005-08-20 04:38:52','2006-02-15 22:14:15'),(5826,214,1,13726,'0.99','2005-08-20 10:08:40','2006-02-15 22:14:15'),(5827,214,1,13864,'4.99','2005-08-20 14:59:55','2006-02-15 22:14:15'),(5828,214,2,14347,'4.99','2005-08-21 08:42:31','2006-02-15 22:14:15'),(5829,214,1,14567,'0.99','2005-08-21 16:27:25','2006-02-15 22:14:15'),(5830,214,2,15639,'2.99','2005-08-23 08:03:25','2006-02-15 22:14:15'),(5831,214,2,15645,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:15'),(5832,215,1,711,'4.99','2005-05-29 03:49:03','2006-02-15 22:14:16'),(5833,215,2,1080,'4.99','2005-05-31 10:55:26','2006-02-15 22:14:16'),(5834,215,2,1376,'4.99','2005-06-15 14:59:06','2006-02-15 22:14:16'),(5835,215,2,1599,'4.99','2005-06-16 06:03:33','2006-02-15 22:14:16'),(5836,215,2,1845,'4.99','2005-06-16 23:56:11','2006-02-15 22:14:16'),(5837,215,2,2006,'2.99','2005-06-17 11:47:03','2006-02-15 22:14:16'),(5838,215,2,2918,'2.99','2005-06-20 04:09:04','2006-02-15 22:14:16'),(5839,215,1,3143,'2.99','2005-06-20 20:01:52','2006-02-15 22:14:16'),(5840,215,2,4940,'8.99','2005-07-08 22:36:06','2006-02-15 22:14:16'),(5841,215,1,5886,'2.99','2005-07-10 19:36:25','2006-02-15 22:14:16'),(5842,215,2,5967,'8.99','2005-07-11 00:02:19','2006-02-15 22:14:16'),(5843,215,1,7180,'1.99','2005-07-27 08:14:34','2006-02-15 22:14:16'),(5844,215,2,9046,'2.99','2005-07-30 06:46:55','2006-02-15 22:14:16'),(5845,215,1,9518,'0.99','2005-07-31 00:43:26','2006-02-15 22:14:16'),(5846,215,2,9611,'4.99','2005-07-31 03:54:43','2006-02-15 22:14:16'),(5847,215,1,11729,'2.99','2005-08-17 08:14:41','2006-02-15 22:14:16'),(5848,215,2,12285,'2.99','2005-08-18 04:56:43','2006-02-15 22:14:16'),(5849,215,1,12380,'1.99','2005-08-18 08:27:28','2006-02-15 22:14:16'),(5850,215,2,13085,'0.99','2005-08-19 10:28:22','2006-02-15 22:14:16'),(5851,215,2,14126,'0.99','2005-08-21 01:32:17','2006-02-15 22:14:16'),(5852,215,2,14817,'4.99','2005-08-22 01:17:16','2006-02-15 22:14:16'),(5853,215,1,15583,'2.99','2005-08-23 05:47:55','2006-02-15 22:14:16'),(5854,215,2,15610,'2.99','2005-08-23 06:56:15','2006-02-15 22:14:16'),(5855,215,2,15799,'2.99','2005-08-23 14:23:23','2006-02-15 22:14:16'),(5856,215,1,15843,'0.99','2005-08-23 15:37:31','2006-02-15 22:14:16'),(5857,215,2,15862,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:16'),(5858,216,1,997,'4.99','2005-05-31 00:08:25','2006-02-15 22:14:16'),(5859,216,2,1461,'6.99','2005-06-15 20:32:08','2006-02-15 22:14:16'),(5860,216,1,1664,'0.99','2005-06-16 10:15:20','2006-02-15 22:14:16'),(5861,216,1,1672,'3.99','2005-06-16 10:37:34','2006-02-15 22:14:16'),(5862,216,2,2351,'0.99','2005-06-18 12:27:57','2006-02-15 22:14:16'),(5863,216,1,3432,'2.99','2005-06-21 19:02:03','2006-02-15 22:14:16'),(5864,216,2,4161,'2.99','2005-07-07 09:15:11','2006-02-15 22:14:16'),(5865,216,1,6008,'6.99','2005-07-11 01:51:29','2006-02-15 22:14:16'),(5866,216,2,6349,'7.99','2005-07-11 20:25:05','2006-02-15 22:14:17'),(5867,216,1,8068,'4.99','2005-07-28 17:22:28','2006-02-15 22:14:17'),(5868,216,2,8859,'8.99','2005-07-29 23:44:43','2006-02-15 22:14:17'),(5869,216,1,9096,'0.99','2005-07-30 08:39:23','2006-02-15 22:14:17'),(5870,216,1,10506,'4.99','2005-08-01 11:16:05','2006-02-15 22:14:17'),(5871,216,1,11005,'0.99','2005-08-02 05:05:23','2006-02-15 22:14:17'),(5872,216,2,11621,'7.99','2005-08-17 04:13:45','2006-02-15 22:14:17'),(5873,216,2,13424,'0.99','2005-08-19 23:10:09','2006-02-15 22:14:17'),(5874,216,2,14638,'2.99','2005-08-21 19:01:36','2006-02-15 22:14:17'),(5875,216,2,14726,'4.99','2005-08-21 22:08:52','2006-02-15 22:14:17'),(5876,216,1,15192,'4.99','2005-08-22 16:06:23','2006-02-15 22:14:17'),(5877,216,2,15199,'2.99','2005-08-22 16:17:49','2006-02-15 22:14:17'),(5878,216,2,15934,'4.99','2005-08-23 18:40:41','2006-02-15 22:14:17'),(5879,216,1,12970,'5.98','2006-02-14 15:16:03','2006-02-15 22:14:17'),(5880,216,1,11676,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:17'),(5881,217,2,828,'2.99','2005-05-29 22:14:55','2006-02-15 22:14:17'),(5882,217,2,1141,'8.99','2005-05-31 19:42:02','2006-02-15 22:14:17'),(5883,217,1,1322,'2.99','2005-06-15 10:55:09','2006-02-15 22:14:17'),(5884,217,1,2076,'6.99','2005-06-17 16:43:47','2006-02-15 22:14:17'),(5885,217,1,2842,'4.99','2005-06-19 22:34:20','2006-02-15 22:14:17'),(5886,217,2,5576,'2.99','2005-07-10 03:57:05','2006-02-15 22:14:17'),(5887,217,2,5762,'3.99','2005-07-10 12:48:01','2006-02-15 22:14:17'),(5888,217,2,6570,'4.99','2005-07-12 05:50:31','2006-02-15 22:14:17'),(5889,217,2,7104,'2.99','2005-07-27 05:15:25','2006-02-15 22:14:17'),(5890,217,2,8332,'4.99','2005-07-29 04:16:00','2006-02-15 22:14:17'),(5891,217,1,9159,'0.99','2005-07-30 11:16:37','2006-02-15 22:14:17'),(5892,217,2,9317,'2.99','2005-07-30 17:13:37','2006-02-15 22:14:17'),(5893,217,2,9632,'6.99','2005-07-31 05:02:23','2006-02-15 22:14:17'),(5894,217,2,9745,'2.99','2005-07-31 09:16:14','2006-02-15 22:14:17'),(5895,217,1,10581,'5.99','2005-08-01 13:52:30','2006-02-15 22:14:17'),(5896,217,1,10836,'6.99','2005-08-01 23:29:58','2006-02-15 22:14:17'),(5897,217,1,11347,'2.99','2005-08-02 17:18:07','2006-02-15 22:14:17'),(5898,217,1,11649,'2.99','2005-08-17 04:59:26','2006-02-15 22:14:17'),(5899,217,1,11958,'4.99','2005-08-17 17:23:20','2006-02-15 22:14:17'),(5900,217,2,12210,'4.99','2005-08-18 02:27:29','2006-02-15 22:14:18'),(5901,217,1,12871,'4.99','2005-08-19 02:55:36','2006-02-15 22:14:18'),(5902,217,2,15116,'0.99','2005-08-22 12:35:40','2006-02-15 22:14:18'),(5903,217,2,15277,'2.99','2005-08-22 19:02:48','2006-02-15 22:14:18'),(5904,218,1,1459,'2.99','2005-06-15 20:25:53','2006-02-15 22:14:18'),(5905,218,1,2262,'0.99','2005-06-18 05:49:46','2006-02-15 22:14:18'),(5906,218,1,2267,'0.99','2005-06-18 06:10:23','2006-02-15 22:14:18'),(5907,218,1,4898,'6.99','2005-07-08 20:31:43','2006-02-15 22:14:18'),(5908,218,1,5226,'0.99','2005-07-09 12:10:44','2006-02-15 22:14:18'),(5909,218,2,5737,'0.99','2005-07-10 11:50:04','2006-02-15 22:14:18'),(5910,218,2,7090,'4.99','2005-07-27 04:43:53','2006-02-15 22:14:18'),(5911,218,1,7236,'8.99','2005-07-27 10:09:39','2006-02-15 22:14:18'),(5912,218,2,9018,'6.99','2005-07-30 05:28:40','2006-02-15 22:14:18'),(5913,218,2,9902,'6.99','2005-07-31 14:24:33','2006-02-15 22:14:18'),(5914,218,1,10114,'0.99','2005-07-31 21:12:58','2006-02-15 22:14:18'),(5915,218,1,11654,'2.99','2005-08-17 05:06:19','2006-02-15 22:14:18'),(5916,218,2,12481,'2.99','2005-08-18 12:31:34','2006-02-15 22:14:18'),(5917,218,1,12974,'0.99','2005-08-19 06:51:02','2006-02-15 22:14:18'),(5918,218,2,13708,'5.99','2005-08-20 09:34:07','2006-02-15 22:14:18'),(5919,218,2,13947,'5.99','2005-08-20 17:46:06','2006-02-15 22:14:18'),(5920,218,2,14848,'4.99','2005-08-22 02:14:19','2006-02-15 22:14:18'),(5921,218,2,15575,'0.99','2005-08-23 05:30:19','2006-02-15 22:14:18'),(5922,219,1,414,'0.99','2005-05-27 14:48:20','2006-02-15 22:14:18'),(5923,219,2,2417,'3.99','2005-06-18 17:12:01','2006-02-15 22:14:18'),(5924,219,2,2580,'0.99','2005-06-19 04:44:30','2006-02-15 22:14:18'),(5925,219,2,4678,'0.99','2005-07-08 10:30:40','2006-02-15 22:14:18'),(5926,219,2,4910,'7.99','2005-07-08 21:13:56','2006-02-15 22:14:18'),(5927,219,2,5123,'0.99','2005-07-09 07:20:30','2006-02-15 22:14:18'),(5928,219,2,5416,'4.99','2005-07-09 20:33:50','2006-02-15 22:14:18'),(5929,219,2,5475,'4.99','2005-07-09 23:31:38','2006-02-15 22:14:18'),(5930,219,2,5739,'7.99','2005-07-10 11:51:50','2006-02-15 22:14:18'),(5931,219,2,6172,'4.99','2005-07-11 10:32:09','2006-02-15 22:14:18'),(5932,219,1,6209,'2.99','2005-07-11 12:36:05','2006-02-15 22:14:18'),(5933,219,2,6501,'1.99','2005-07-12 03:11:55','2006-02-15 22:14:19'),(5934,219,2,7335,'2.99','2005-07-27 14:06:50','2006-02-15 22:14:19'),(5935,219,1,7726,'5.99','2005-07-28 04:52:19','2006-02-15 22:14:19'),(5936,219,1,8430,'0.99','2005-07-29 07:12:17','2006-02-15 22:14:19'),(5937,219,2,8536,'4.99','2005-07-29 10:37:23','2006-02-15 22:14:19'),(5938,219,1,8652,'6.99','2005-07-29 15:02:54','2006-02-15 22:14:19'),(5939,219,1,9712,'4.99','2005-07-31 08:13:11','2006-02-15 22:14:19'),(5940,219,1,11328,'2.99','2005-08-02 16:42:38','2006-02-15 22:14:19'),(5941,219,2,11791,'0.99','2005-08-17 11:01:11','2006-02-15 22:14:19'),(5942,219,1,13765,'4.99','2005-08-20 11:39:00','2006-02-15 22:14:19'),(5943,219,2,14029,'0.99','2005-08-20 21:23:11','2006-02-15 22:14:19'),(5944,219,1,14588,'5.99','2005-08-21 17:25:53','2006-02-15 22:14:19'),(5945,219,1,14688,'4.99','2005-08-21 20:32:37','2006-02-15 22:14:19'),(5946,219,1,15283,'4.99','2005-08-22 19:16:04','2006-02-15 22:14:19'),(5947,219,1,11577,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:19'),(5948,220,2,409,'0.99','2005-05-27 14:10:58','2006-02-15 22:14:19'),(5949,220,1,480,'3.99','2005-05-27 22:47:39','2006-02-15 22:14:19'),(5950,220,1,1832,'0.99','2005-06-16 22:35:20','2006-02-15 22:14:19'),(5951,220,2,4918,'2.99','2005-07-08 21:37:31','2006-02-15 22:14:19'),(5952,220,2,5613,'2.99','2005-07-10 05:15:43','2006-02-15 22:14:19'),(5953,220,2,5847,'2.99','2005-07-10 17:27:42','2006-02-15 22:14:19'),(5954,220,2,5859,'0.99','2005-07-10 18:02:02','2006-02-15 22:14:19'),(5955,220,2,6412,'0.99','2005-07-11 23:19:21','2006-02-15 22:14:19'),(5956,220,2,6832,'8.99','2005-07-12 18:51:41','2006-02-15 22:14:19'),(5957,220,2,7750,'9.99','2005-07-28 05:55:30','2006-02-15 22:14:19'),(5958,220,1,8065,'2.99','2005-07-28 17:15:48','2006-02-15 22:14:19'),(5959,220,1,8398,'4.99','2005-07-29 06:12:40','2006-02-15 22:14:19'),(5960,220,2,9384,'7.99','2005-07-30 19:25:35','2006-02-15 22:14:19'),(5961,220,2,9455,'10.99','2005-07-30 22:20:29','2006-02-15 22:14:19'),(5962,220,1,10099,'2.99','2005-07-31 20:47:14','2006-02-15 22:14:19'),(5963,220,2,10778,'4.99','2005-08-01 21:11:39','2006-02-15 22:14:19'),(5964,220,1,10948,'4.99','2005-08-02 03:23:23','2006-02-15 22:14:19'),(5965,220,1,11037,'0.99','2005-08-02 05:58:12','2006-02-15 22:14:19'),(5966,220,1,11153,'3.99','2005-08-02 09:54:19','2006-02-15 22:14:20'),(5967,220,1,11622,'4.99','2005-08-17 04:15:46','2006-02-15 22:14:20'),(5968,220,2,11947,'2.99','2005-08-17 17:08:13','2006-02-15 22:14:20'),(5969,220,1,12407,'4.99','2005-08-18 09:39:26','2006-02-15 22:14:20'),(5970,220,1,12896,'4.99','2005-08-19 03:52:44','2006-02-15 22:14:20'),(5971,220,2,13123,'2.99','2005-08-19 11:55:13','2006-02-15 22:14:20'),(5972,220,1,13281,'2.99','2005-08-19 18:07:47','2006-02-15 22:14:20'),(5973,220,2,14016,'4.99','2005-08-20 20:52:03','2006-02-15 22:14:20'),(5974,220,2,15706,'4.99','2005-08-23 10:32:52','2006-02-15 22:14:20'),(5975,221,2,226,'4.99','2005-05-26 10:44:04','2006-02-15 22:14:20'),(5976,221,1,1369,'0.99','2005-06-15 14:29:14','2006-02-15 22:14:20'),(5977,221,1,2331,'2.99','2005-06-18 10:50:09','2006-02-15 22:14:20'),(5978,221,2,2473,'2.99','2005-06-18 20:42:45','2006-02-15 22:14:20'),(5979,221,1,2660,'10.99','2005-06-19 10:50:02','2006-02-15 22:14:20'),(5980,221,1,3200,'5.99','2005-06-21 00:22:47','2006-02-15 22:14:20'),(5981,221,1,4293,'4.99','2005-07-07 15:53:47','2006-02-15 22:14:20'),(5982,221,2,4649,'4.99','2005-07-08 09:32:05','2006-02-15 22:14:20'),(5983,221,1,4693,'6.99','2005-07-08 11:07:36','2006-02-15 22:14:20'),(5984,221,1,5058,'5.99','2005-07-09 04:20:35','2006-02-15 22:14:20'),(5985,221,2,5920,'5.99','2005-07-10 21:33:58','2006-02-15 22:14:20'),(5986,221,1,7101,'2.99','2005-07-27 05:06:34','2006-02-15 22:14:20'),(5987,221,1,7129,'0.99','2005-07-27 06:18:01','2006-02-15 22:14:20'),(5988,221,2,7531,'8.99','2005-07-27 21:19:34','2006-02-15 22:14:20'),(5989,221,2,8486,'0.99','2005-07-29 08:53:38','2006-02-15 22:14:20'),(5990,221,1,9320,'6.99','2005-07-30 17:16:39','2006-02-15 22:14:20'),(5991,221,1,9453,'7.99','2005-07-30 22:20:04','2006-02-15 22:14:20'),(5992,221,2,9853,'0.99','2005-07-31 12:58:20','2006-02-15 22:14:20'),(5993,221,2,11680,'4.99','2005-08-17 06:12:27','2006-02-15 22:14:20'),(5994,221,1,11693,'4.99','2005-08-17 06:56:56','2006-02-15 22:14:20'),(5995,221,1,11802,'2.99','2005-08-17 11:32:51','2006-02-15 22:14:20'),(5996,221,1,12324,'0.99','2005-08-18 06:38:20','2006-02-15 22:14:20'),(5997,221,2,12620,'3.99','2005-08-18 17:26:38','2006-02-15 22:14:20'),(5998,221,2,13434,'2.99','2005-08-19 23:34:26','2006-02-15 22:14:20'),(5999,221,2,14322,'5.99','2005-08-21 08:06:30','2006-02-15 22:14:21'),(6000,221,2,14371,'0.99','2005-08-21 09:37:16','2006-02-15 22:14:21'),(6001,221,1,14419,'7.99','2005-08-21 11:15:46','2006-02-15 22:14:21'),(6002,221,1,15125,'8.99','2005-08-22 12:53:22','2006-02-15 22:14:21'),(6003,222,1,5,'6.99','2005-05-24 23:05:21','2006-02-15 22:14:21'),(6004,222,1,134,'4.99','2005-05-25 21:48:41','2006-02-15 22:14:21'),(6005,222,2,416,'0.99','2005-05-27 15:02:10','2006-02-15 22:14:21'),(6006,222,2,809,'3.99','2005-05-29 19:10:20','2006-02-15 22:14:21'),(6007,222,2,1006,'2.99','2005-05-31 00:57:08','2006-02-15 22:14:21'),(6008,222,1,1368,'8.99','2005-06-15 14:27:47','2006-02-15 22:14:21'),(6009,222,2,2603,'6.99','2005-06-19 06:21:25','2006-02-15 22:14:21'),(6010,222,2,5209,'8.99','2005-07-09 11:22:39','2006-02-15 22:14:21'),(6011,222,1,5266,'3.99','2005-07-09 14:17:40','2006-02-15 22:14:21'),(6012,222,2,5592,'6.99','2005-07-10 04:26:13','2006-02-15 22:14:21'),(6013,222,2,5635,'5.99','2005-07-10 06:28:39','2006-02-15 22:14:21'),(6014,222,2,6129,'2.99','2005-07-11 08:15:09','2006-02-15 22:14:21'),(6015,222,1,6497,'0.99','2005-07-12 03:04:29','2006-02-15 22:14:21'),(6016,222,2,7786,'0.99','2005-07-28 07:18:26','2006-02-15 22:14:21'),(6017,222,1,8300,'1.99','2005-07-29 02:57:59','2006-02-15 22:14:21'),(6018,222,2,8597,'6.99','2005-07-29 12:55:55','2006-02-15 22:14:21'),(6019,222,1,8787,'4.99','2005-07-29 20:43:49','2006-02-15 22:14:21'),(6020,222,2,10043,'1.99','2005-07-31 19:02:07','2006-02-15 22:14:21'),(6021,222,2,12179,'2.99','2005-08-18 01:21:21','2006-02-15 22:14:21'),(6022,222,1,13477,'2.99','2005-08-20 01:07:00','2006-02-15 22:14:21'),(6023,222,2,14350,'2.99','2005-08-21 08:58:38','2006-02-15 22:14:21'),(6024,223,2,524,'2.99','2005-05-28 03:57:28','2006-02-15 22:14:21'),(6025,223,2,1839,'5.99','2005-06-16 23:22:22','2006-02-15 22:14:21'),(6026,223,1,2334,'4.99','2005-06-18 10:56:24','2006-02-15 22:14:21'),(6027,223,1,3513,'5.99','2005-07-06 00:45:57','2006-02-15 22:14:21'),(6028,223,1,3705,'0.99','2005-07-06 10:17:59','2006-02-15 22:14:21'),(6029,223,1,4874,'4.99','2005-07-08 19:23:38','2006-02-15 22:14:21'),(6030,223,2,5996,'2.99','2005-07-11 01:18:33','2006-02-15 22:14:21'),(6031,223,2,7085,'5.99','2005-07-27 04:35:44','2006-02-15 22:14:22'),(6032,223,2,8362,'3.99','2005-07-29 05:09:11','2006-02-15 22:14:22'),(6033,223,2,10053,'7.99','2005-07-31 19:15:39','2006-02-15 22:14:22'),(6034,223,2,11040,'4.99','2005-08-02 06:03:22','2006-02-15 22:14:22'),(6035,223,1,12927,'5.99','2005-08-19 05:02:46','2006-02-15 22:14:22'),(6036,223,1,13576,'0.99','2005-08-20 05:19:56','2006-02-15 22:14:22'),(6037,223,2,14496,'4.99','2005-08-21 14:07:35','2006-02-15 22:14:22'),(6038,223,1,15257,'7.99','2005-08-22 18:21:04','2006-02-15 22:14:22'),(6039,223,2,15546,'5.99','2005-08-23 04:20:38','2006-02-15 22:14:22'),(6040,223,1,15662,'2.99','2005-08-23 08:52:50','2006-02-15 22:14:22'),(6041,224,1,1424,'7.99','2005-06-15 18:08:14','2006-02-15 22:14:22'),(6042,224,1,2277,'2.99','2005-06-18 06:35:03','2006-02-15 22:14:22'),(6043,224,2,3282,'4.99','2005-06-21 06:18:42','2006-02-15 22:14:22'),(6044,224,1,4118,'2.99','2005-07-07 07:03:30','2006-02-15 22:14:22'),(6045,224,2,4411,'3.99','2005-07-07 21:54:58','2006-02-15 22:14:22'),(6046,224,1,4697,'2.99','2005-07-08 11:19:14','2006-02-15 22:14:22'),(6047,224,1,6031,'4.99','2005-07-11 02:42:14','2006-02-15 22:14:22'),(6048,224,2,6999,'2.99','2005-07-27 01:21:19','2006-02-15 22:14:22'),(6049,224,2,8255,'0.99','2005-07-29 01:02:30','2006-02-15 22:14:22'),(6050,224,2,8439,'2.99','2005-07-29 07:28:43','2006-02-15 22:14:23'),(6051,224,1,8605,'4.99','2005-07-29 13:13:34','2006-02-15 22:14:23'),(6052,224,1,9181,'0.99','2005-07-30 12:05:58','2006-02-15 22:14:23'),(6053,224,1,11816,'0.99','2005-08-17 12:14:16','2006-02-15 22:14:23'),(6054,224,1,12492,'4.99','2005-08-18 12:49:04','2006-02-15 22:14:23'),(6055,224,1,12969,'2.99','2005-08-19 06:38:59','2006-02-15 22:14:23'),(6056,224,2,13075,'4.99','2005-08-19 10:10:10','2006-02-15 22:14:23'),(6057,224,2,14099,'0.99','2005-08-21 00:31:03','2006-02-15 22:14:23'),(6058,224,2,14271,'5.99','2005-08-21 06:23:29','2006-02-15 22:14:23'),(6059,224,2,14468,'5.99','2005-08-21 13:07:10','2006-02-15 22:14:23'),(6060,224,2,14880,'2.99','2005-08-22 03:44:36','2006-02-15 22:14:23'),(6061,224,1,15225,'0.99','2005-08-22 17:18:32','2006-02-15 22:14:23'),(6062,224,1,15952,'1.99','2005-08-23 19:11:29','2006-02-15 22:14:23'),(6063,225,1,812,'4.99','2005-05-29 20:00:30','2006-02-15 22:14:23'),(6064,225,1,963,'3.99','2005-05-30 18:52:53','2006-02-15 22:14:23'),(6065,225,2,2226,'7.99','2005-06-18 03:39:56','2006-02-15 22:14:23'),(6066,225,2,3574,'4.99','2005-07-06 03:36:01','2006-02-15 22:14:23'),(6067,225,1,4345,'7.99','2005-07-07 18:52:57','2006-02-15 22:14:23'),(6068,225,1,4824,'7.99','2005-07-08 17:37:39','2006-02-15 22:14:23'),(6069,225,2,4955,'2.99','2005-07-08 23:16:21','2006-02-15 22:14:24'),(6070,225,1,5067,'4.99','2005-07-09 04:52:35','2006-02-15 22:14:24'),(6071,225,1,6159,'2.99','2005-07-11 09:55:34','2006-02-15 22:14:24'),(6072,225,1,6317,'2.99','2005-07-11 18:47:41','2006-02-15 22:14:24'),(6073,225,2,6350,'2.99','2005-07-11 20:30:15','2006-02-15 22:14:24'),(6074,225,1,6526,'3.99','2005-07-12 04:21:20','2006-02-15 22:14:24'),(6075,225,2,6532,'2.99','2005-07-12 04:38:32','2006-02-15 22:14:24'),(6076,225,2,7347,'4.99','2005-07-27 14:31:24','2006-02-15 22:14:24'),(6077,225,1,7524,'6.99','2005-07-27 21:11:44','2006-02-15 22:14:24'),(6078,225,1,8054,'7.99','2005-07-28 17:02:18','2006-02-15 22:14:25'),(6079,225,2,8110,'4.99','2005-07-28 19:07:45','2006-02-15 22:14:25'),(6080,225,1,9980,'4.99','2005-07-31 17:02:00','2006-02-15 22:14:25'),(6081,225,2,9993,'2.99','2005-07-31 17:30:20','2006-02-15 22:14:25'),(6082,225,2,10138,'2.99','2005-07-31 22:02:09','2006-02-15 22:14:25'),(6083,225,1,10793,'2.99','2005-08-01 21:48:03','2006-02-15 22:14:25'),(6084,225,2,11333,'1.99','2005-08-02 16:53:00','2006-02-15 22:14:25'),(6085,225,2,11384,'0.99','2005-08-02 18:23:01','2006-02-15 22:14:25'),(6086,225,2,11395,'5.99','2005-08-02 18:47:44','2006-02-15 22:14:25'),(6087,225,2,11437,'4.99','2005-08-02 20:20:06','2006-02-15 22:14:25'),(6088,225,2,14444,'5.99','2005-08-21 12:07:25','2006-02-15 22:14:25'),(6089,226,2,3414,'2.99','2005-06-21 16:58:50','2006-02-15 22:14:25'),(6090,226,1,3466,'4.99','2005-06-21 22:13:33','2006-02-15 22:14:25'),(6091,226,1,3721,'4.99','2005-07-06 11:10:09','2006-02-15 22:14:25'),(6092,226,1,4324,'4.99','2005-07-07 17:57:56','2006-02-15 22:14:25'),(6093,226,1,5282,'2.99','2005-07-09 15:01:23','2006-02-15 22:14:25'),(6094,226,1,5419,'2.99','2005-07-09 20:47:36','2006-02-15 22:14:25'),(6095,226,1,6712,'9.99','2005-07-12 13:24:47','2006-02-15 22:14:25'),(6096,226,2,7288,'5.99','2005-07-27 12:24:59','2006-02-15 22:14:25'),(6097,226,1,7329,'3.99','2005-07-27 13:55:34','2006-02-15 22:14:25'),(6098,226,2,8600,'2.99','2005-07-29 13:01:19','2006-02-15 22:14:25'),(6099,226,1,8627,'2.99','2005-07-29 14:05:12','2006-02-15 22:14:25'),(6100,226,1,12172,'1.99','2005-08-18 01:07:00','2006-02-15 22:14:25'),(6101,226,1,14491,'6.99','2005-08-21 13:55:39','2006-02-15 22:14:25'),(6102,226,1,14708,'4.99','2005-08-21 21:07:23','2006-02-15 22:14:26'),(6103,226,1,14712,'0.99','2005-08-21 21:22:56','2006-02-15 22:14:26'),(6104,226,2,14739,'0.99','2005-08-21 22:33:22','2006-02-15 22:14:26'),(6105,226,2,14934,'4.99','2005-08-22 05:47:15','2006-02-15 22:14:26'),(6106,226,2,15472,'2.99','2005-08-23 01:39:05','2006-02-15 22:14:26'),(6107,226,1,15901,'4.99','2005-08-23 17:19:17','2006-02-15 22:14:26'),(6108,226,1,15986,'2.99','2005-08-23 20:20:37','2006-02-15 22:14:26'),(6109,226,1,16033,'5.99','2005-08-23 22:06:15','2006-02-15 22:14:26'),(6110,227,1,111,'4.99','2005-05-25 18:45:19','2006-02-15 22:14:26'),(6111,227,1,1023,'3.99','2005-05-31 03:26:50','2006-02-15 22:14:26'),(6112,227,1,1679,'2.99','2005-06-16 11:11:01','2006-02-15 22:14:26'),(6113,227,2,2155,'1.99','2005-06-17 23:07:29','2006-02-15 22:14:26'),(6114,227,1,2164,'6.99','2005-06-17 23:46:21','2006-02-15 22:14:26'),(6115,227,2,3065,'0.99','2005-06-20 13:53:53','2006-02-15 22:14:26'),(6116,227,1,3576,'5.99','2005-07-06 03:40:01','2006-02-15 22:14:26'),(6117,227,2,4340,'2.99','2005-07-07 18:41:46','2006-02-15 22:14:26'),(6118,227,2,4459,'4.99','2005-07-07 23:48:52','2006-02-15 22:14:26'),(6119,227,1,4680,'2.99','2005-07-08 10:35:28','2006-02-15 22:14:26'),(6120,227,1,5046,'3.99','2005-07-09 03:34:57','2006-02-15 22:14:26'),(6121,227,1,7132,'7.99','2005-07-27 06:28:34','2006-02-15 22:14:26'),(6122,227,1,8219,'2.99','2005-07-28 23:46:31','2006-02-15 22:14:26'),(6123,227,1,8234,'0.99','2005-07-29 00:19:20','2006-02-15 22:14:26'),(6124,227,1,8384,'0.99','2005-07-29 05:38:43','2006-02-15 22:14:26'),(6125,227,2,8417,'4.99','2005-07-29 06:53:36','2006-02-15 22:14:26'),(6126,227,1,8936,'2.99','2005-07-30 02:47:13','2006-02-15 22:14:26'),(6127,227,2,9521,'2.99','2005-07-31 00:52:24','2006-02-15 22:14:26'),(6128,227,2,10999,'3.99','2005-08-02 04:53:13','2006-02-15 22:14:26'),(6129,227,2,11892,'0.99','2005-08-17 15:13:21','2006-02-15 22:14:26'),(6130,227,2,13379,'4.99','2005-08-19 21:33:39','2006-02-15 22:14:26'),(6131,227,2,15406,'0.99','2005-08-22 23:21:22','2006-02-15 22:14:26'),(6132,227,2,15976,'4.99','2005-08-23 20:07:08','2006-02-15 22:14:27'),(6133,227,2,13374,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:27'),(6134,228,2,492,'4.99','2005-05-28 00:24:58','2006-02-15 22:14:27'),(6135,228,2,1070,'0.99','2005-05-31 09:39:56','2006-02-15 22:14:27'),(6136,228,2,2284,'3.99','2005-06-18 06:59:51','2006-02-15 22:14:27'),(6137,228,2,2863,'2.99','2005-06-19 23:58:38','2006-02-15 22:14:27'),(6138,228,2,2934,'2.99','2005-06-20 05:05:53','2006-02-15 22:14:27'),(6139,228,2,3433,'3.99','2005-06-21 19:07:19','2006-02-15 22:14:27'),(6140,228,2,3538,'0.99','2005-07-06 01:37:07','2006-02-15 22:14:27'),(6141,228,2,3710,'8.99','2005-07-06 10:28:53','2006-02-15 22:14:27'),(6142,228,1,3715,'6.99','2005-07-06 10:51:48','2006-02-15 22:14:27'),(6143,228,2,3796,'0.99','2005-07-06 14:45:22','2006-02-15 22:14:27'),(6144,228,1,4217,'3.99','2005-07-07 12:08:59','2006-02-15 22:14:27'),(6145,228,1,4636,'4.99','2005-07-08 08:44:32','2006-02-15 22:14:27'),(6146,228,1,4909,'0.99','2005-07-08 21:07:24','2006-02-15 22:14:27'),(6147,228,1,5151,'2.99','2005-07-09 08:31:03','2006-02-15 22:14:28'),(6148,228,1,5320,'4.99','2005-07-09 16:23:32','2006-02-15 22:14:28'),(6149,228,2,5902,'0.99','2005-07-10 20:31:24','2006-02-15 22:14:28'),(6150,228,2,6141,'1.99','2005-07-11 08:52:16','2006-02-15 22:14:28'),(6151,228,1,6948,'2.99','2005-07-26 23:43:49','2006-02-15 22:14:28'),(6152,228,2,7509,'8.99','2005-07-27 20:37:19','2006-02-15 22:14:28'),(6153,228,1,7601,'0.99','2005-07-27 23:48:15','2006-02-15 22:14:28'),(6154,228,1,8147,'2.99','2005-07-28 20:37:56','2006-02-15 22:14:28'),(6155,228,1,10585,'4.99','2005-08-01 14:00:42','2006-02-15 22:14:28'),(6156,228,1,12304,'0.99','2005-08-18 05:44:29','2006-02-15 22:14:28'),(6157,228,2,12952,'2.99','2005-08-19 06:00:52','2006-02-15 22:14:28'),(6158,228,2,13458,'4.99','2005-08-20 00:35:30','2006-02-15 22:14:28'),(6159,228,2,12672,'3.98','2006-02-14 15:16:03','2006-02-15 22:14:28'),(6160,228,1,15234,'0.00','2006-02-14 15:16:03','2006-02-15 22:14:28'),(6161,229,1,2200,'4.99','2005-06-18 01:59:16','2006-02-15 22:14:28'),(6162,229,1,3208,'0.99','2005-06-21 00:50:03','2006-02-15 22:14:28'),(6163,229,1,3277,'7.99','2005-06-21 05:36:37','2006-02-15 22:14:28'),(6164,229,2,3280,'0.99','2005-06-21 06:08:12','2006-02-15 22:14:28'),(6165,229,2,3933,'4.99','2005-07-06 21:06:37','2006-02-15 22:14:28'),(6166,229,2,4458,'2.99','2005-07-07 23:47:47','2006-02-15 22:14:28'),(6167,229,1,4515,'4.99','2005-07-08 02:42:03','2006-02-15 22:14:28'),(6168,229,2,4694,'0.99','2005-07-08 11:07:37','2006-02-15 22:14:28'),(6169,229,1,5623,'2.99','2005-07-10 05:41:38','2006-02-15 22:14:29'),(6170,229,2,6155,'4.99','2005-07-11 09:45:31','2006-02-15 22:14:29'),(6171,229,2,6578,'4.99','2005-07-12 06:15:41','2006-02-15 22:14:29'),(6172,229,1,6880,'2.99','2005-07-12 20:41:35','2006-02-15 22:14:29'),(6173,229,2,7305,'0.99','2005-07-27 12:57:06','2006-02-15 22:14:29'),(6174,229,2,7308,'5.99','2005-07-27 13:00:25','2006-02-15 22:14:29'),(6175,229,2,7629,'0.99','2005-07-28 01:00:09','2006-02-15 22:14:29'),(6176,229,2,7640,'7.99','2005-07-28 01:14:49','2006-02-15 22:14:29'),(6177,229,2,9913,'3.99','2005-07-31 14:51:04','2006-02-15 22:14:29'),(6178,229,1,11521,'4.99','2005-08-17 00:04:54','2006-02-15 22:14:29'),(6179,229,1,12866,'2.99','2005-08-19 02:39:47','2006-02-15 22:14:29'),(6180,229,2,13306,'0.99','2005-08-19 18:57:29','2006-02-15 22:14:29'),(6181,229,2,13431,'4.99','2005-08-19 23:28:15','2006-02-15 22:14:29'),(6182,229,1,13679,'5.99','2005-08-20 08:39:34','2006-02-15 22:14:29'),(6183,229,1,15740,'4.99','2005-08-23 12:07:51','2006-02-15 22:14:29'),(6184,229,2,15912,'2.99','2005-08-23 17:47:40','2006-02-15 22:14:29'),(6185,229,2,13295,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:29'),(6186,230,1,32,'0.99','2005-05-25 04:06:21','2006-02-15 22:14:29'),(6187,230,1,1078,'4.99','2005-05-31 10:28:33','2006-02-15 22:14:29'),(6188,230,2,1468,'3.99','2005-06-15 20:48:22','2006-02-15 22:14:30'),(6189,230,1,1744,'4.99','2005-06-16 16:39:58','2006-02-15 22:14:30'),(6190,230,2,1793,'0.99','2005-06-16 20:07:27','2006-02-15 22:14:30'),(6191,230,2,2450,'8.99','2005-06-18 19:25:47','2006-02-15 22:14:30'),(6192,230,2,2675,'0.99','2005-06-19 11:52:15','2006-02-15 22:14:30'),(6193,230,1,2777,'0.99','2005-06-19 18:16:26','2006-02-15 22:14:30'),(6194,230,1,4509,'3.99','2005-07-08 02:32:38','2006-02-15 22:14:30'),(6195,230,1,4935,'0.99','2005-07-08 22:20:56','2006-02-15 22:14:30'),(6196,230,1,5045,'4.99','2005-07-09 03:33:32','2006-02-15 22:14:30'),(6197,230,1,5061,'0.99','2005-07-09 04:30:50','2006-02-15 22:14:30'),(6198,230,2,5269,'2.99','2005-07-09 14:23:05','2006-02-15 22:14:30'),(6199,230,2,6126,'4.99','2005-07-11 08:06:56','2006-02-15 22:14:30'),(6200,230,1,6251,'2.99','2005-07-11 15:06:20','2006-02-15 22:14:30'),(6201,230,2,7333,'4.99','2005-07-27 13:59:11','2006-02-15 22:14:30'),(6202,230,2,7390,'4.99','2005-07-27 15:59:19','2006-02-15 22:14:30'),(6203,230,2,8032,'4.99','2005-07-28 16:17:00','2006-02-15 22:14:30'),(6204,230,2,8653,'0.99','2005-07-29 15:04:23','2006-02-15 22:14:30'),(6205,230,1,8815,'2.99','2005-07-29 21:51:26','2006-02-15 22:14:30'),(6206,230,2,9778,'3.99','2005-07-31 10:02:04','2006-02-15 22:14:30'),(6207,230,2,10050,'3.99','2005-07-31 19:13:29','2006-02-15 22:14:30'),(6208,230,1,10057,'9.99','2005-07-31 19:20:18','2006-02-15 22:14:30'),(6209,230,2,10874,'2.99','2005-08-02 00:31:00','2006-02-15 22:14:30'),(6210,230,2,11148,'5.99','2005-08-02 09:47:08','2006-02-15 22:14:30'),(6211,230,1,11552,'5.99','2005-08-17 01:04:29','2006-02-15 22:14:30'),(6212,230,2,11914,'2.99','2005-08-17 16:04:42','2006-02-15 22:14:30'),(6213,230,1,12079,'1.99','2005-08-17 22:04:17','2006-02-15 22:14:30'),(6214,230,2,12523,'7.99','2005-08-18 13:45:41','2006-02-15 22:14:30'),(6215,230,2,12542,'0.99','2005-08-18 14:21:11','2006-02-15 22:14:31'),(6216,230,2,14017,'0.99','2005-08-20 20:55:32','2006-02-15 22:14:31'),(6217,230,1,14073,'5.99','2005-08-20 23:12:57','2006-02-15 22:14:31'),(6218,230,1,14340,'2.99','2005-08-21 08:38:21','2006-02-15 22:14:31'),(6219,231,1,329,'5.99','2005-05-27 01:57:14','2006-02-15 22:14:31'),(6220,231,1,479,'6.99','2005-05-27 22:39:10','2006-02-15 22:14:31'),(6221,231,1,512,'8.99','2005-05-28 03:07:50','2006-02-15 22:14:31'),(6222,231,2,2423,'0.99','2005-06-18 17:32:08','2006-02-15 22:14:31'),(6223,231,2,3561,'9.99','2005-07-06 02:54:33','2006-02-15 22:14:31'),(6224,231,1,3839,'2.99','2005-07-06 16:30:30','2006-02-15 22:14:31'),(6225,231,2,4289,'0.99','2005-07-07 15:45:58','2006-02-15 22:14:31'),(6226,231,2,4969,'0.99','2005-07-08 23:51:26','2006-02-15 22:14:31'),(6227,231,1,5096,'2.99','2005-07-09 06:08:23','2006-02-15 22:14:31'),(6228,231,1,5560,'5.99','2005-07-10 03:13:24','2006-02-15 22:14:31'),(6229,231,1,6862,'0.99','2005-07-12 19:58:09','2006-02-15 22:14:31'),(6230,231,1,6877,'1.99','2005-07-12 20:32:58','2006-02-15 22:14:31'),(6231,231,1,8556,'0.99','2005-07-29 11:18:27','2006-02-15 22:14:31'),(6232,231,2,8949,'5.99','2005-07-30 03:17:02','2006-02-15 22:14:31'),(6233,231,2,9711,'2.99','2005-07-31 08:06:41','2006-02-15 22:14:31'),(6234,231,2,11113,'2.99','2005-08-02 08:26:24','2006-02-15 22:14:31'),(6235,231,1,11202,'7.99','2005-08-02 11:51:57','2006-02-15 22:14:31'),(6236,231,1,11581,'5.99','2005-08-17 02:03:02','2006-02-15 22:14:32'),(6237,231,1,12214,'0.99','2005-08-18 02:34:22','2006-02-15 22:14:32'),(6238,231,2,12230,'8.99','2005-08-18 03:11:04','2006-02-15 22:14:32'),(6239,231,1,12231,'3.99','2005-08-18 03:11:44','2006-02-15 22:14:32'),(6240,231,2,13983,'6.99','2005-08-20 19:08:32','2006-02-15 22:14:32'),(6241,231,1,14026,'0.99','2005-08-20 21:21:08','2006-02-15 22:14:32'),(6242,231,1,14478,'4.99','2005-08-21 13:33:28','2006-02-15 22:14:32'),(6243,231,2,14806,'2.99','2005-08-22 00:53:08','2006-02-15 22:14:32'),(6244,231,1,15389,'3.99','2005-08-22 22:51:13','2006-02-15 22:14:33'),(6245,232,1,28,'4.99','2005-05-25 03:42:37','2006-02-15 22:14:33'),(6246,232,1,805,'3.99','2005-05-29 18:18:18','2006-02-15 22:14:33'),(6247,232,2,1619,'0.99','2005-06-16 07:14:13','2006-02-15 22:14:33'),(6248,232,1,2833,'8.99','2005-06-19 21:34:54','2006-02-15 22:14:33'),(6249,232,2,6234,'5.99','2005-07-11 14:16:10','2006-02-15 22:14:33'),(6250,232,1,6309,'2.99','2005-07-11 18:13:24','2006-02-15 22:14:33'),(6251,232,1,7123,'5.99','2005-07-27 06:08:48','2006-02-15 22:14:33'),(6252,232,2,7653,'4.99','2005-07-28 01:58:30','2006-02-15 22:14:33'),(6253,232,2,7707,'0.99','2005-07-28 04:07:47','2006-02-15 22:14:33'),(6254,232,1,7749,'2.99','2005-07-28 05:53:36','2006-02-15 22:14:33'),(6255,232,1,7990,'2.99','2005-07-28 14:43:08','2006-02-15 22:14:33'),(6256,232,1,8306,'2.99','2005-07-29 03:12:26','2006-02-15 22:14:33'),(6257,232,2,8401,'4.99','2005-07-29 06:25:08','2006-02-15 22:14:33'),(6258,232,2,8655,'4.99','2005-07-29 15:04:42','2006-02-15 22:14:33'),(6259,232,2,9270,'0.99','2005-07-30 15:03:16','2006-02-15 22:14:33'),(6260,232,2,9330,'10.99','2005-07-30 17:44:24','2006-02-15 22:14:33'),(6261,232,2,9365,'2.99','2005-07-30 18:46:02','2006-02-15 22:14:33'),(6262,232,2,10157,'2.99','2005-07-31 22:38:48','2006-02-15 22:14:33'),(6263,232,1,10539,'6.99','2005-08-01 12:23:00','2006-02-15 22:14:33'),(6264,232,2,11861,'0.99','2005-08-17 13:53:47','2006-02-15 22:14:33'),(6265,232,2,12853,'2.99','2005-08-19 02:15:32','2006-02-15 22:14:33'),(6266,232,2,13707,'2.99','2005-08-20 09:33:58','2006-02-15 22:14:33'),(6267,232,2,14527,'0.99','2005-08-21 15:07:42','2006-02-15 22:14:33'),(6268,232,2,14857,'0.99','2005-08-22 02:42:39','2006-02-15 22:14:33'),(6269,232,2,15553,'2.99','2005-08-23 04:33:39','2006-02-15 22:14:33'),(6270,233,2,1992,'2.99','2005-06-17 10:58:53','2006-02-15 22:14:33'),(6271,233,2,2244,'2.99','2005-06-18 04:46:33','2006-02-15 22:14:33'),(6272,233,1,2424,'2.99','2005-06-18 17:35:08','2006-02-15 22:14:33'),(6273,233,2,2443,'4.99','2005-06-18 18:52:30','2006-02-15 22:14:33'),(6274,233,1,3832,'2.99','2005-07-06 16:12:23','2006-02-15 22:14:34'),(6275,233,1,4015,'5.99','2005-07-07 00:59:46','2006-02-15 22:14:34'),(6276,233,1,4885,'4.99','2005-07-08 19:51:17','2006-02-15 22:14:34'),(6277,233,2,5267,'5.99','2005-07-09 14:21:10','2006-02-15 22:14:34'),(6278,233,1,5846,'2.99','2005-07-10 17:25:24','2006-02-15 22:14:34'),(6279,233,1,6319,'4.99','2005-07-11 18:50:45','2006-02-15 22:14:34'),(6280,233,1,6794,'2.99','2005-07-12 16:38:23','2006-02-15 22:14:34'),(6281,233,1,7056,'8.99','2005-07-27 03:46:27','2006-02-15 22:14:34'),(6282,233,2,7387,'4.99','2005-07-27 15:54:19','2006-02-15 22:14:34'),(6283,233,2,8385,'5.99','2005-07-29 05:39:16','2006-02-15 22:14:34'),(6284,233,2,8530,'2.99','2005-07-29 10:26:14','2006-02-15 22:14:34'),(6285,233,2,8596,'0.99','2005-07-29 12:48:54','2006-02-15 22:14:34'),(6286,233,1,9574,'0.99','2005-07-31 02:49:20','2006-02-15 22:14:34'),(6287,233,1,10582,'4.99','2005-08-01 13:54:22','2006-02-15 22:14:34'),(6288,233,1,12443,'5.99','2005-08-18 10:50:59','2006-02-15 22:14:34'),(6289,233,2,14357,'2.99','2005-08-21 09:13:09','2006-02-15 22:14:34'),(6290,233,2,15285,'2.99','2005-08-22 19:17:24','2006-02-15 22:14:34'),(6291,233,1,15790,'1.99','2005-08-23 14:01:07','2006-02-15 22:14:34'),(6292,233,2,15821,'0.99','2005-08-23 15:03:58','2006-02-15 22:14:34'),(6293,234,2,1125,'4.99','2005-05-31 17:23:44','2006-02-15 22:14:34'),(6294,234,2,1245,'3.99','2005-06-15 05:09:01','2006-02-15 22:14:34'),(6295,234,2,1645,'0.99','2005-06-16 09:10:06','2006-02-15 22:14:34'),(6296,234,1,1674,'2.99','2005-06-16 10:57:00','2006-02-15 22:14:34'),(6297,234,2,1993,'5.99','2005-06-17 10:59:24','2006-02-15 22:14:34'),(6298,234,1,2005,'4.99','2005-06-17 11:44:54','2006-02-15 22:14:34'),(6299,234,2,2511,'5.99','2005-06-18 23:45:30','2006-02-15 22:14:34'),(6300,234,2,3185,'6.99','2005-06-20 22:58:01','2006-02-15 22:14:34'),(6301,234,2,3199,'4.99','2005-06-21 00:12:40','2006-02-15 22:14:34'),(6302,234,2,4686,'0.99','2005-07-08 10:53:39','2006-02-15 22:14:34'),(6303,234,1,4721,'7.99','2005-07-08 12:39:31','2006-02-15 22:14:34'),(6304,234,2,10133,'5.99','2005-07-31 21:55:07','2006-02-15 22:14:34'),(6305,234,2,10541,'0.99','2005-08-01 12:24:54','2006-02-15 22:14:35'),(6306,234,2,10580,'6.99','2005-08-01 13:51:14','2006-02-15 22:14:35'),(6307,234,2,10968,'7.99','2005-08-02 04:03:13','2006-02-15 22:14:35'),(6308,234,1,11050,'4.99','2005-08-02 06:17:16','2006-02-15 22:14:35'),(6309,234,1,11073,'0.99','2005-08-02 07:13:03','2006-02-15 22:14:35'),(6310,234,1,11481,'3.99','2005-08-02 22:18:41','2006-02-15 22:14:35'),(6311,234,1,11882,'3.99','2005-08-17 14:33:41','2006-02-15 22:14:35'),(6312,234,1,12226,'0.99','2005-08-18 03:00:48','2006-02-15 22:14:35'),(6313,234,2,12863,'4.99','2005-08-19 02:35:59','2006-02-15 22:14:35'),(6314,234,1,12921,'5.99','2005-08-19 04:47:48','2006-02-15 22:14:35'),(6315,234,2,13349,'2.99','2005-08-19 20:43:16','2006-02-15 22:14:35'),(6316,234,2,15037,'5.99','2005-08-22 09:36:33','2006-02-15 22:14:35'),(6317,234,1,15129,'2.99','2005-08-22 13:03:52','2006-02-15 22:14:35'),(6318,234,1,15778,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:35'),(6319,235,2,807,'2.99','2005-05-29 18:50:50','2006-02-15 22:14:35'),(6320,235,1,1148,'0.99','2005-05-31 20:38:40','2006-02-15 22:14:35'),(6321,235,1,1493,'4.99','2005-06-15 21:50:32','2006-02-15 22:14:35'),(6322,235,2,1811,'0.99','2005-06-16 21:06:20','2006-02-15 22:14:35'),(6323,235,2,3581,'2.99','2005-07-06 03:57:35','2006-02-15 22:14:35'),(6324,235,1,3752,'6.99','2005-07-06 12:30:12','2006-02-15 22:14:35'),(6325,235,1,3968,'4.99','2005-07-06 22:47:09','2006-02-15 22:14:35'),(6326,235,2,4592,'2.99','2005-07-08 06:31:28','2006-02-15 22:14:35'),(6327,235,1,5790,'4.99','2005-07-10 14:15:21','2006-02-15 22:14:35'),(6328,235,1,6047,'2.99','2005-07-11 03:27:01','2006-02-15 22:14:35'),(6329,235,2,6352,'4.99','2005-07-11 20:34:13','2006-02-15 22:14:35'),(6330,235,2,6466,'4.99','2005-07-12 01:21:03','2006-02-15 22:14:35'),(6331,235,1,8120,'0.99','2005-07-28 19:24:24','2006-02-15 22:14:35'),(6332,235,2,8446,'6.99','2005-07-29 07:38:10','2006-02-15 22:14:35'),(6333,235,2,8781,'0.99','2005-07-29 20:20:16','2006-02-15 22:14:35'),(6334,235,1,9019,'5.99','2005-07-30 05:28:53','2006-02-15 22:14:35'),(6335,235,2,9519,'6.99','2005-07-31 00:45:57','2006-02-15 22:14:35'),(6336,235,1,9587,'3.99','2005-07-31 03:10:30','2006-02-15 22:14:36'),(6337,235,2,10155,'0.99','2005-07-31 22:31:43','2006-02-15 22:14:36'),(6338,235,2,12332,'2.99','2005-08-18 06:51:05','2006-02-15 22:14:36'),(6339,235,1,12502,'4.99','2005-08-18 13:16:31','2006-02-15 22:14:36'),(6340,235,2,13070,'0.99','2005-08-19 09:56:23','2006-02-15 22:14:36'),(6341,235,1,13469,'0.99','2005-08-20 00:59:36','2006-02-15 22:14:36'),(6342,235,2,14749,'3.99','2005-08-21 23:08:33','2006-02-15 22:14:36'),(6343,235,1,15034,'6.99','2005-08-22 09:33:08','2006-02-15 22:14:36'),(6344,236,2,262,'2.99','2005-05-26 15:46:56','2006-02-15 22:14:36'),(6345,236,2,344,'2.99','2005-05-27 04:30:22','2006-02-15 22:14:36'),(6346,236,1,1032,'2.99','2005-05-31 04:28:43','2006-02-15 22:14:36'),(6347,236,1,1262,'0.99','2005-06-15 06:54:53','2006-02-15 22:14:36'),(6348,236,2,1308,'5.99','2005-06-15 10:07:48','2006-02-15 22:14:36'),(6349,236,2,2139,'8.99','2005-06-17 21:29:34','2006-02-15 22:14:36'),(6350,236,2,2311,'6.99','2005-06-18 08:51:29','2006-02-15 22:14:36'),(6351,236,1,2630,'2.99','2005-06-19 08:47:21','2006-02-15 22:14:36'),(6352,236,2,2840,'3.99','2005-06-19 22:17:44','2006-02-15 22:14:36'),(6353,236,1,3353,'4.99','2005-06-21 11:29:23','2006-02-15 22:14:36'),(6354,236,2,3460,'2.99','2005-06-21 21:46:56','2006-02-15 22:14:36'),(6355,236,1,3645,'0.99','2005-07-06 07:22:09','2006-02-15 22:14:36'),(6356,236,2,3857,'4.99','2005-07-06 17:07:54','2006-02-15 22:14:36'),(6357,236,2,4749,'4.99','2005-07-08 14:05:58','2006-02-15 22:14:36'),(6358,236,1,4959,'0.99','2005-07-08 23:22:23','2006-02-15 22:14:36'),(6359,236,1,5404,'2.99','2005-07-09 20:10:43','2006-02-15 22:14:36'),(6360,236,1,5545,'3.99','2005-07-10 02:50:29','2006-02-15 22:14:36'),(6361,236,2,5938,'3.99','2005-07-10 22:17:42','2006-02-15 22:14:36'),(6362,236,2,6049,'0.99','2005-07-11 03:32:32','2006-02-15 22:14:36'),(6363,236,2,6281,'4.99','2005-07-11 16:38:16','2006-02-15 22:14:36'),(6364,236,1,6303,'2.99','2005-07-11 17:55:43','2006-02-15 22:14:36'),(6365,236,2,6996,'4.99','2005-07-27 01:13:45','2006-02-15 22:14:36'),(6366,236,2,7047,'4.99','2005-07-27 03:31:11','2006-02-15 22:14:36'),(6367,236,2,7253,'0.99','2005-07-27 10:46:37','2006-02-15 22:14:37'),(6368,236,1,7780,'5.99','2005-07-28 07:11:55','2006-02-15 22:14:37'),(6369,236,1,7792,'4.99','2005-07-28 07:24:02','2006-02-15 22:14:37'),(6370,236,2,7798,'2.99','2005-07-28 07:41:59','2006-02-15 22:14:37'),(6371,236,1,8657,'2.99','2005-07-29 15:09:25','2006-02-15 22:14:37'),(6372,236,1,9011,'5.99','2005-07-30 05:16:29','2006-02-15 22:14:37'),(6373,236,1,9934,'2.99','2005-07-31 15:25:26','2006-02-15 22:14:37'),(6374,236,2,10137,'4.99','2005-07-31 22:01:41','2006-02-15 22:14:37'),(6375,236,2,11139,'6.99','2005-08-02 09:27:36','2006-02-15 22:14:37'),(6376,236,2,11486,'3.99','2005-08-02 22:34:06','2006-02-15 22:14:37'),(6377,236,2,11507,'5.99','2005-08-16 23:26:43','2006-02-15 22:14:37'),(6378,236,1,11895,'4.99','2005-08-17 15:15:07','2006-02-15 22:14:37'),(6379,236,1,12975,'2.99','2005-08-19 06:51:19','2006-02-15 22:14:37'),(6380,236,1,13364,'2.99','2005-08-19 21:09:30','2006-02-15 22:14:37'),(6381,236,1,13443,'7.99','2005-08-19 23:53:42','2006-02-15 22:14:37'),(6382,236,2,14321,'4.99','2005-08-21 08:05:12','2006-02-15 22:14:37'),(6383,236,1,14364,'7.99','2005-08-21 09:25:11','2006-02-15 22:14:37'),(6384,236,2,14722,'4.99','2005-08-21 21:50:53','2006-02-15 22:14:37'),(6385,236,1,12988,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:37'),(6386,237,2,133,'0.99','2005-05-25 21:48:30','2006-02-15 22:14:37'),(6387,237,1,182,'4.99','2005-05-26 04:49:17','2006-02-15 22:14:37'),(6388,237,1,1500,'0.99','2005-06-15 22:00:45','2006-02-15 22:14:37'),(6389,237,2,1518,'0.99','2005-06-15 23:36:37','2006-02-15 22:14:37'),(6390,237,1,2156,'4.99','2005-06-17 23:08:12','2006-02-15 22:14:37'),(6391,237,1,2492,'2.99','2005-06-18 22:04:15','2006-02-15 22:14:37'),(6392,237,2,3069,'2.99','2005-06-20 14:13:00','2006-02-15 22:14:37'),(6393,237,1,4844,'4.99','2005-07-08 18:28:13','2006-02-15 22:14:37'),(6394,237,2,6053,'4.99','2005-07-11 03:51:59','2006-02-15 22:14:37'),(6395,237,1,7193,'2.99','2005-07-27 08:37:00','2006-02-15 22:14:37'),(6396,237,2,7330,'3.99','2005-07-27 13:56:46','2006-02-15 22:14:37'),(6397,237,1,7812,'4.99','2005-07-28 08:06:52','2006-02-15 22:14:37'),(6398,237,2,7951,'8.99','2005-07-28 13:21:16','2006-02-15 22:14:38'),(6399,237,2,8102,'2.99','2005-07-28 18:49:43','2006-02-15 22:14:38'),(6400,237,2,8748,'2.99','2005-07-29 19:08:37','2006-02-15 22:14:38'),(6401,237,2,8799,'6.99','2005-07-29 21:16:47','2006-02-15 22:14:38'),(6402,237,1,8835,'3.99','2005-07-29 22:44:35','2006-02-15 22:14:38'),(6403,237,1,9276,'5.99','2005-07-30 15:09:28','2006-02-15 22:14:38'),(6404,237,1,9661,'4.99','2005-07-31 06:06:37','2006-02-15 22:14:38'),(6405,237,2,9715,'1.99','2005-07-31 08:16:58','2006-02-15 22:14:38'),(6406,237,2,10056,'0.99','2005-07-31 19:19:13','2006-02-15 22:14:38'),(6407,237,2,10058,'2.99','2005-07-31 19:20:21','2006-02-15 22:14:38'),(6408,237,2,11125,'4.99','2005-08-02 08:55:35','2006-02-15 22:14:38'),(6409,237,2,11479,'11.99','2005-08-02 22:18:13','2006-02-15 22:14:38'),(6410,237,2,11772,'5.99','2005-08-17 10:18:57','2006-02-15 22:14:38'),(6411,237,1,12469,'0.99','2005-08-18 11:53:07','2006-02-15 22:14:38'),(6412,237,2,13914,'6.99','2005-08-20 16:38:57','2006-02-15 22:14:38'),(6413,237,2,13922,'6.99','2005-08-20 17:02:37','2006-02-15 22:14:38'),(6414,237,2,13969,'6.99','2005-08-20 18:42:40','2006-02-15 22:14:38'),(6415,237,2,14453,'3.99','2005-08-21 12:33:34','2006-02-15 22:14:38'),(6416,237,2,15139,'8.99','2005-08-22 13:38:11','2006-02-15 22:14:38'),(6417,237,1,15337,'0.99','2005-08-22 20:49:51','2006-02-15 22:14:38'),(6418,237,2,15931,'1.99','2005-08-23 18:28:09','2006-02-15 22:14:38'),(6419,238,2,315,'4.99','2005-05-26 23:12:55','2006-02-15 22:14:38'),(6420,238,1,842,'2.99','2005-05-30 00:32:04','2006-02-15 22:14:38'),(6421,238,1,1199,'2.99','2005-06-15 01:58:50','2006-02-15 22:14:38'),(6422,238,1,1660,'4.99','2005-06-16 10:12:55','2006-02-15 22:14:38'),(6423,238,1,3181,'2.99','2005-06-20 22:51:02','2006-02-15 22:14:38'),(6424,238,1,4143,'0.99','2005-07-07 08:22:07','2006-02-15 22:14:38'),(6425,238,1,5616,'5.99','2005-07-10 05:21:11','2006-02-15 22:14:38'),(6426,238,2,6403,'0.99','2005-07-11 22:46:25','2006-02-15 22:14:38'),(6427,238,2,7243,'4.99','2005-07-27 10:26:11','2006-02-15 22:14:38'),(6428,238,1,8310,'8.99','2005-07-29 03:25:56','2006-02-15 22:14:38'),(6429,238,1,8382,'6.99','2005-07-29 05:33:21','2006-02-15 22:14:39'),(6430,238,1,8465,'0.99','2005-07-29 08:20:49','2006-02-15 22:14:39'),(6431,238,1,9065,'4.99','2005-07-30 07:25:09','2006-02-15 22:14:39'),(6432,238,2,9841,'7.99','2005-07-31 12:24:19','2006-02-15 22:14:39'),(6433,238,1,10659,'5.99','2005-08-01 16:40:34','2006-02-15 22:14:39'),(6434,238,2,11543,'5.99','2005-08-17 00:54:28','2006-02-15 22:14:39'),(6435,238,2,11632,'2.99','2005-08-17 04:29:32','2006-02-15 22:14:39'),(6436,238,1,11897,'2.99','2005-08-17 15:24:06','2006-02-15 22:14:39'),(6437,238,1,14312,'4.99','2005-08-21 07:48:34','2006-02-15 22:14:39'),(6438,238,1,14343,'8.99','2005-08-21 08:40:21','2006-02-15 22:14:39'),(6439,238,1,15455,'0.99','2005-08-23 01:05:00','2006-02-15 22:14:39'),(6440,239,2,8,'4.99','2005-05-24 23:31:46','2006-02-15 22:14:39'),(6441,239,1,444,'2.99','2005-05-27 18:39:15','2006-02-15 22:14:39'),(6442,239,1,621,'4.99','2005-05-28 15:58:12','2006-02-15 22:14:39'),(6443,239,1,636,'6.99','2005-05-28 17:47:58','2006-02-15 22:14:39'),(6444,239,1,1022,'7.99','2005-05-31 03:16:45','2006-02-15 22:14:39'),(6445,239,2,1082,'5.99','2005-05-31 11:02:01','2006-02-15 22:14:39'),(6446,239,1,1160,'4.99','2005-06-14 23:00:34','2006-02-15 22:14:39'),(6447,239,2,1560,'4.99','2005-06-16 02:36:43','2006-02-15 22:14:39'),(6448,239,2,2215,'2.99','2005-06-18 02:48:21','2006-02-15 22:14:39'),(6449,239,1,2390,'4.99','2005-06-18 15:29:26','2006-02-15 22:14:39'),(6450,239,1,3383,'5.99','2005-06-21 14:07:19','2006-02-15 22:14:39'),(6451,239,2,3547,'0.99','2005-07-06 02:18:06','2006-02-15 22:14:39'),(6452,239,1,3552,'5.99','2005-07-06 02:34:09','2006-02-15 22:14:39'),(6453,239,2,4920,'7.99','2005-07-08 21:42:10','2006-02-15 22:14:39'),(6454,239,2,5651,'4.99','2005-07-10 07:17:13','2006-02-15 22:14:39'),(6455,239,1,5960,'0.99','2005-07-10 23:38:34','2006-02-15 22:14:39'),(6456,239,1,6573,'0.99','2005-07-12 06:03:40','2006-02-15 22:14:39'),(6457,239,2,7012,'8.99','2005-07-27 02:01:03','2006-02-15 22:14:39'),(6458,239,1,7426,'0.99','2005-07-27 17:19:46','2006-02-15 22:14:39'),(6459,239,2,7491,'2.99','2005-07-27 19:53:23','2006-02-15 22:14:39'),(6460,239,1,8457,'6.99','2005-07-29 07:59:03','2006-02-15 22:14:40'),(6461,239,2,9676,'0.99','2005-07-31 06:39:13','2006-02-15 22:14:40'),(6462,239,1,9863,'5.99','2005-07-31 13:05:29','2006-02-15 22:14:40'),(6463,239,1,10755,'0.99','2005-08-01 20:14:14','2006-02-15 22:14:40'),(6464,239,2,10923,'2.99','2005-08-02 02:15:01','2006-02-15 22:14:40'),(6465,239,1,11487,'2.99','2005-08-02 22:35:05','2006-02-15 22:14:40'),(6466,239,2,11900,'4.99','2005-08-17 15:30:44','2006-02-15 22:14:40'),(6467,239,1,11968,'0.99','2005-08-17 17:47:34','2006-02-15 22:14:40'),(6468,239,1,12340,'4.99','2005-08-18 07:07:01','2006-02-15 22:14:40'),(6469,239,1,12721,'1.99','2005-08-18 21:30:12','2006-02-15 22:14:40'),(6470,239,1,13175,'4.99','2005-08-19 13:54:53','2006-02-15 22:14:40'),(6471,239,2,13427,'4.99','2005-08-19 23:19:02','2006-02-15 22:14:40'),(6472,239,2,13999,'3.99','2005-08-20 19:53:32','2006-02-15 22:14:40'),(6473,239,2,14062,'1.99','2005-08-20 22:34:34','2006-02-15 22:14:40'),(6474,240,1,246,'2.99','2005-05-26 13:57:07','2006-02-15 22:14:40'),(6475,240,1,460,'2.99','2005-05-27 20:02:03','2006-02-15 22:14:40'),(6476,240,1,643,'4.99','2005-05-28 18:52:11','2006-02-15 22:14:40'),(6477,240,2,2196,'3.99','2005-06-18 01:47:07','2006-02-15 22:14:40'),(6478,240,1,2264,'4.99','2005-06-18 05:58:45','2006-02-15 22:14:40'),(6479,240,2,2872,'5.99','2005-06-20 00:38:21','2006-02-15 22:14:40'),(6480,240,2,4305,'4.99','2005-07-07 17:07:11','2006-02-15 22:14:40'),(6481,240,2,5262,'4.99','2005-07-09 14:08:01','2006-02-15 22:14:40'),(6482,240,1,5596,'0.99','2005-07-10 04:43:14','2006-02-15 22:14:40'),(6483,240,1,6272,'0.99','2005-07-11 16:03:49','2006-02-15 22:14:40'),(6484,240,2,6470,'0.99','2005-07-12 01:29:41','2006-02-15 22:14:40'),(6485,240,1,6956,'4.99','2005-07-26 23:55:57','2006-02-15 22:14:40'),(6486,240,1,7001,'4.99','2005-07-27 01:25:34','2006-02-15 22:14:40'),(6487,240,1,7467,'8.99','2005-07-27 18:51:54','2006-02-15 22:14:40'),(6488,240,2,7481,'4.99','2005-07-27 19:20:25','2006-02-15 22:14:40'),(6489,240,1,7870,'4.99','2005-07-28 10:16:03','2006-02-15 22:14:40'),(6490,240,2,8503,'3.99','2005-07-29 09:16:50','2006-02-15 22:14:41'),(6491,240,2,8905,'5.99','2005-07-30 01:11:11','2006-02-15 22:14:41'),(6492,240,1,10308,'7.99','2005-08-01 04:22:49','2006-02-15 22:14:41'),(6493,240,1,11745,'3.99','2005-08-17 09:00:01','2006-02-15 22:14:41'),(6494,240,2,12283,'6.99','2005-08-18 04:54:25','2006-02-15 22:14:41'),(6495,240,2,13030,'2.99','2005-08-19 08:28:11','2006-02-15 22:14:41'),(6496,240,2,13119,'4.99','2005-08-19 11:44:59','2006-02-15 22:14:41'),(6497,240,1,13663,'8.99','2005-08-20 08:12:33','2006-02-15 22:14:41'),(6498,240,2,14573,'2.99','2005-08-21 16:44:32','2006-02-15 22:14:41'),(6499,240,2,15641,'0.99','2005-08-23 08:06:49','2006-02-15 22:14:41'),(6500,241,1,627,'7.99','2005-05-28 17:04:43','2006-02-15 22:14:41'),(6501,241,1,1059,'3.99','2005-05-31 08:20:43','2006-02-15 22:14:41'),(6502,241,2,2428,'0.99','2005-06-18 17:47:34','2006-02-15 22:14:41'),(6503,241,1,2455,'0.99','2005-06-18 19:33:06','2006-02-15 22:14:41'),(6504,241,2,2478,'5.99','2005-06-18 21:01:21','2006-02-15 22:14:41'),(6505,241,2,2683,'2.99','2005-06-19 12:27:19','2006-02-15 22:14:41'),(6506,241,2,3258,'0.99','2005-06-21 03:53:58','2006-02-15 22:14:41'),(6507,241,2,3822,'0.99','2005-07-06 15:41:15','2006-02-15 22:14:41'),(6508,241,1,4731,'0.99','2005-07-08 13:08:18','2006-02-15 22:14:41'),(6509,241,2,5017,'2.99','2005-07-09 02:00:16','2006-02-15 22:14:41'),(6510,241,1,5211,'0.99','2005-07-09 11:26:50','2006-02-15 22:14:41'),(6511,241,1,5438,'4.99','2005-07-09 21:34:32','2006-02-15 22:14:41'),(6512,241,2,5525,'3.99','2005-07-10 02:03:08','2006-02-15 22:14:41'),(6513,241,1,5981,'4.99','2005-07-11 00:19:04','2006-02-15 22:14:41'),(6514,241,2,6090,'6.99','2005-07-11 05:47:08','2006-02-15 22:14:41'),(6515,241,2,6245,'2.99','2005-07-11 14:56:57','2006-02-15 22:14:41'),(6516,241,1,7320,'0.99','2005-07-27 13:33:35','2006-02-15 22:14:41'),(6517,241,1,7434,'2.99','2005-07-27 17:34:40','2006-02-15 22:14:41'),(6518,241,1,7860,'2.99','2005-07-28 09:58:02','2006-02-15 22:14:41'),(6519,241,1,9500,'6.99','2005-07-30 23:58:36','2006-02-15 22:14:41'),(6520,241,1,9528,'3.99','2005-07-31 01:05:04','2006-02-15 22:14:42'),(6521,241,1,9944,'5.99','2005-07-31 15:44:43','2006-02-15 22:14:42'),(6522,241,2,10447,'3.99','2005-08-01 09:04:58','2006-02-15 22:14:42'),(6523,241,1,10652,'2.99','2005-08-01 16:24:08','2006-02-15 22:14:42'),(6524,241,1,11423,'1.99','2005-08-02 19:57:13','2006-02-15 22:14:42'),(6525,241,2,12418,'4.99','2005-08-18 09:59:36','2006-02-15 22:14:42'),(6526,241,1,12956,'4.99','2005-08-19 06:06:26','2006-02-15 22:14:42'),(6527,241,2,13077,'2.99','2005-08-19 10:15:19','2006-02-15 22:14:42'),(6528,241,2,14269,'7.99','2005-08-21 06:22:07','2006-02-15 22:14:42'),(6529,241,2,14485,'2.99','2005-08-21 13:52:07','2006-02-15 22:14:42'),(6530,241,1,14936,'0.99','2005-08-22 05:51:26','2006-02-15 22:14:42'),(6531,241,2,15137,'2.99','2005-08-22 13:20:28','2006-02-15 22:14:42'),(6532,241,1,15429,'2.99','2005-08-23 00:20:31','2006-02-15 22:14:42'),(6533,241,1,15767,'4.99','2005-08-23 13:14:15','2006-02-15 22:14:42'),(6534,242,1,108,'2.99','2005-05-25 18:30:05','2006-02-15 22:14:42'),(6535,242,2,283,'3.99','2005-05-26 19:05:05','2006-02-15 22:14:42'),(6536,242,2,881,'4.99','2005-05-30 06:15:36','2006-02-15 22:14:42'),(6537,242,2,1304,'4.99','2005-06-15 09:56:02','2006-02-15 22:14:42'),(6538,242,1,1384,'4.99','2005-06-15 15:22:03','2006-02-15 22:14:42'),(6539,242,1,1483,'4.99','2005-06-15 21:21:58','2006-02-15 22:14:42'),(6540,242,2,1702,'4.99','2005-06-16 13:21:05','2006-02-15 22:14:42'),(6541,242,1,2691,'4.99','2005-06-19 13:06:50','2006-02-15 22:14:42'),(6542,242,2,2942,'4.99','2005-06-20 05:27:31','2006-02-15 22:14:42'),(6543,242,1,3471,'4.99','2005-07-05 22:51:44','2006-02-15 22:14:42'),(6544,242,2,3604,'0.99','2005-07-06 05:25:22','2006-02-15 22:14:42'),(6545,242,1,4426,'4.99','2005-07-07 22:28:32','2006-02-15 22:14:42'),(6546,242,2,4895,'1.99','2005-07-08 20:22:05','2006-02-15 22:14:42'),(6547,242,2,5666,'5.99','2005-07-10 08:10:29','2006-02-15 22:14:42'),(6548,242,2,7149,'3.99','2005-07-27 07:10:40','2006-02-15 22:14:42'),(6549,242,1,8491,'4.99','2005-07-29 09:02:13','2006-02-15 22:14:42'),(6550,242,1,9423,'3.99','2005-07-30 21:10:14','2006-02-15 22:14:42'),(6551,242,1,9730,'6.99','2005-07-31 08:50:08','2006-02-15 22:14:43'),(6552,242,2,10367,'0.99','2005-08-01 06:12:19','2006-02-15 22:14:43'),(6553,242,2,10382,'4.99','2005-08-01 06:36:45','2006-02-15 22:14:43'),(6554,242,2,10650,'9.99','2005-08-01 16:18:45','2006-02-15 22:14:43'),(6555,242,2,11020,'0.99','2005-08-02 05:29:48','2006-02-15 22:14:43'),(6556,242,1,11258,'4.99','2005-08-02 13:45:39','2006-02-15 22:14:43'),(6557,242,2,11607,'0.99','2005-08-17 03:36:06','2006-02-15 22:14:43'),(6558,242,1,11931,'4.99','2005-08-17 16:35:14','2006-02-15 22:14:43'),(6559,242,2,12724,'7.99','2005-08-18 21:37:20','2006-02-15 22:14:43'),(6560,242,1,12855,'4.99','2005-08-19 02:18:58','2006-02-15 22:14:43'),(6561,242,1,13271,'9.99','2005-08-19 17:42:06','2006-02-15 22:14:43'),(6562,242,2,13567,'0.99','2005-08-20 04:49:21','2006-02-15 22:14:43'),(6563,242,2,13646,'5.99','2005-08-20 07:47:08','2006-02-15 22:14:43'),(6564,242,1,14515,'0.99','2005-08-21 14:52:14','2006-02-15 22:14:43'),(6565,242,1,15002,'0.99','2005-08-22 08:06:00','2006-02-15 22:14:43'),(6566,243,1,188,'4.99','2005-05-26 05:47:12','2006-02-15 22:14:43'),(6567,243,1,1405,'5.99','2005-06-15 16:41:26','2006-02-15 22:14:43'),(6568,243,1,1452,'0.99','2005-06-15 19:32:52','2006-02-15 22:14:43'),(6569,243,2,2757,'5.99','2005-06-19 17:01:14','2006-02-15 22:14:43'),(6570,243,2,3854,'5.99','2005-07-06 17:02:33','2006-02-15 22:14:43'),(6571,243,1,3965,'4.99','2005-07-06 22:36:20','2006-02-15 22:14:43'),(6572,243,1,4831,'0.99','2005-07-08 18:00:14','2006-02-15 22:14:43'),(6573,243,1,5502,'0.99','2005-07-10 00:34:15','2006-02-15 22:14:43'),(6574,243,2,6038,'3.99','2005-07-11 03:10:37','2006-02-15 22:14:43'),(6575,243,2,6820,'2.99','2005-07-12 18:21:30','2006-02-15 22:14:43'),(6576,243,2,7022,'2.99','2005-07-27 02:31:15','2006-02-15 22:14:43'),(6577,243,2,7165,'0.99','2005-07-27 07:36:46','2006-02-15 22:14:43'),(6578,243,1,8834,'4.99','2005-07-29 22:41:48','2006-02-15 22:14:43'),(6579,243,2,9035,'2.99','2005-07-30 06:16:07','2006-02-15 22:14:43'),(6580,243,2,9514,'4.99','2005-07-31 00:29:44','2006-02-15 22:14:43'),(6581,243,2,9675,'2.99','2005-07-31 06:37:07','2006-02-15 22:14:44'),(6582,243,2,9988,'5.99','2005-07-31 17:22:36','2006-02-15 22:14:44'),(6583,243,1,12209,'2.99','2005-08-18 02:27:20','2006-02-15 22:14:44'),(6584,243,1,13291,'2.99','2005-08-19 18:32:11','2006-02-15 22:14:44'),(6585,243,1,14033,'2.99','2005-08-20 21:30:53','2006-02-15 22:14:44'),(6586,243,1,14108,'0.99','2005-08-21 00:52:45','2006-02-15 22:14:44'),(6587,243,1,14272,'3.99','2005-08-21 06:24:55','2006-02-15 22:14:44'),(6588,243,2,14581,'1.99','2005-08-21 17:07:08','2006-02-15 22:14:44'),(6589,243,2,14705,'2.99','2005-08-21 21:02:55','2006-02-15 22:14:44'),(6590,244,2,592,'4.99','2005-05-28 13:21:08','2006-02-15 22:14:44'),(6591,244,1,797,'1.99','2005-05-29 17:12:17','2006-02-15 22:14:44'),(6592,244,2,1189,'6.99','2005-06-15 01:04:22','2006-02-15 22:14:44'),(6593,244,1,1595,'5.99','2005-06-16 05:23:46','2006-02-15 22:14:44'),(6594,244,2,2955,'3.99','2005-06-20 06:46:35','2006-02-15 22:14:44'),(6595,244,1,4814,'4.99','2005-07-08 17:11:09','2006-02-15 22:14:44'),(6596,244,2,5387,'4.99','2005-07-09 19:25:14','2006-02-15 22:14:44'),(6597,244,2,5461,'0.99','2005-07-09 22:48:04','2006-02-15 22:14:44'),(6598,244,2,5692,'0.99','2005-07-10 09:32:22','2006-02-15 22:14:44'),(6599,244,1,5779,'4.99','2005-07-10 13:45:54','2006-02-15 22:14:44'),(6600,244,1,5803,'3.99','2005-07-10 15:05:42','2006-02-15 22:14:44'),(6601,244,2,6374,'4.99','2005-07-11 21:36:10','2006-02-15 22:14:44'),(6602,244,2,6608,'2.99','2005-07-12 08:16:50','2006-02-15 22:14:44'),(6603,244,2,6683,'2.99','2005-07-12 12:14:05','2006-02-15 22:14:44'),(6604,244,2,8454,'0.99','2005-07-29 07:49:04','2006-02-15 22:14:44'),(6605,244,2,8844,'5.99','2005-07-29 23:05:08','2006-02-15 22:14:44'),(6606,244,1,10001,'4.99','2005-07-31 17:46:18','2006-02-15 22:14:44'),(6607,244,2,10047,'4.99','2005-07-31 19:07:43','2006-02-15 22:14:44'),(6608,244,1,10152,'5.99','2005-07-31 22:28:05','2006-02-15 22:14:44'),(6609,244,2,10684,'6.99','2005-08-01 17:47:00','2006-02-15 22:14:44'),(6610,244,2,10969,'2.99','2005-08-02 04:04:32','2006-02-15 22:14:44'),(6611,244,2,11157,'0.99','2005-08-02 09:58:15','2006-02-15 22:14:45'),(6612,244,1,11267,'9.99','2005-08-02 14:09:08','2006-02-15 22:14:45'),(6613,244,1,11762,'9.99','2005-08-17 09:48:06','2006-02-15 22:14:45'),(6614,244,1,13630,'4.99','2005-08-20 07:05:56','2006-02-15 22:14:45'),(6615,244,2,13774,'0.99','2005-08-20 11:54:01','2006-02-15 22:14:45'),(6616,244,1,13928,'0.99','2005-08-20 17:12:28','2006-02-15 22:14:45'),(6617,244,1,14367,'0.99','2005-08-21 09:31:44','2006-02-15 22:14:45'),(6618,244,2,14657,'0.99','2005-08-21 19:39:43','2006-02-15 22:14:45'),(6619,244,1,14919,'1.99','2005-08-22 05:07:17','2006-02-15 22:14:45'),(6620,244,1,14975,'3.99','2005-08-22 07:07:50','2006-02-15 22:14:45'),(6621,244,2,12736,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:45'),(6622,245,2,79,'4.99','2005-05-25 12:11:07','2006-02-15 22:14:45'),(6623,245,1,241,'0.99','2005-05-26 12:49:01','2006-02-15 22:14:45'),(6624,245,1,519,'7.99','2005-05-28 03:22:33','2006-02-15 22:14:45'),(6625,245,1,719,'2.99','2005-05-29 05:16:05','2006-02-15 22:14:45'),(6626,245,2,725,'2.99','2005-05-29 06:03:41','2006-02-15 22:14:45'),(6627,245,2,948,'8.99','2005-05-30 15:44:27','2006-02-15 22:14:45'),(6628,245,1,1377,'2.99','2005-06-15 15:02:03','2006-02-15 22:14:45'),(6629,245,1,2122,'2.99','2005-06-17 20:48:27','2006-02-15 22:14:45'),(6630,245,1,3157,'2.99','2005-06-20 21:07:54','2006-02-15 22:14:45'),(6631,245,1,3634,'2.99','2005-07-06 06:51:14','2006-02-15 22:14:45'),(6632,245,2,5321,'2.99','2005-07-09 16:26:33','2006-02-15 22:14:45'),(6633,245,1,5764,'4.99','2005-07-10 12:58:16','2006-02-15 22:14:45'),(6634,245,2,6242,'2.99','2005-07-11 14:45:04','2006-02-15 22:14:45'),(6635,245,1,6795,'5.99','2005-07-12 16:41:00','2006-02-15 22:14:45'),(6636,245,2,6962,'0.99','2005-07-27 00:10:58','2006-02-15 22:14:45'),(6637,245,1,7230,'4.99','2005-07-27 10:01:41','2006-02-15 22:14:45'),(6638,245,2,7233,'5.99','2005-07-27 10:08:36','2006-02-15 22:14:45'),(6639,245,1,7358,'0.99','2005-07-27 14:49:44','2006-02-15 22:14:45'),(6640,245,2,7397,'4.99','2005-07-27 16:05:00','2006-02-15 22:14:45'),(6641,245,2,8701,'6.99','2005-07-29 17:02:35','2006-02-15 22:14:46'),(6642,245,1,8811,'10.99','2005-07-29 21:46:21','2006-02-15 22:14:46'),(6643,245,2,9088,'0.99','2005-07-30 08:21:02','2006-02-15 22:14:46'),(6644,245,2,9169,'4.99','2005-07-30 11:35:00','2006-02-15 22:14:46'),(6645,245,1,9813,'6.99','2005-07-31 11:29:23','2006-02-15 22:14:46'),(6646,245,1,10087,'3.99','2005-07-31 20:15:22','2006-02-15 22:14:46'),(6647,245,2,11061,'0.99','2005-08-02 06:50:18','2006-02-15 22:14:46'),(6648,245,1,11105,'0.99','2005-08-02 08:13:31','2006-02-15 22:14:46'),(6649,245,1,11211,'0.99','2005-08-02 12:16:48','2006-02-15 22:14:46'),(6650,245,1,12303,'7.99','2005-08-18 05:43:22','2006-02-15 22:14:46'),(6651,245,1,13286,'0.99','2005-08-19 18:28:07','2006-02-15 22:14:46'),(6652,245,1,15782,'6.99','2005-08-23 13:43:26','2006-02-15 22:14:46'),(6653,245,2,12682,'2.99','2006-02-14 15:16:03','2006-02-15 22:14:46'),(6654,246,1,124,'6.99','2005-05-25 20:46:11','2006-02-15 22:14:46'),(6655,246,2,421,'8.99','2005-05-27 15:30:13','2006-02-15 22:14:46'),(6656,246,2,434,'5.99','2005-05-27 16:54:27','2006-02-15 22:14:46'),(6657,246,1,699,'3.99','2005-05-29 02:11:44','2006-02-15 22:14:46'),(6658,246,1,1051,'4.99','2005-05-31 07:02:09','2006-02-15 22:14:46'),(6659,246,2,1448,'1.99','2005-06-15 19:17:16','2006-02-15 22:14:46'),(6660,246,1,1968,'2.99','2005-06-17 09:20:36','2006-02-15 22:14:46'),(6661,246,2,2704,'1.99','2005-06-19 13:50:10','2006-02-15 22:14:46'),(6662,246,1,2725,'0.99','2005-06-19 15:01:23','2006-02-15 22:14:46'),(6663,246,1,3152,'4.99','2005-06-20 20:42:41','2006-02-15 22:14:46'),(6664,246,1,4092,'7.99','2005-07-07 05:54:18','2006-02-15 22:14:46'),(6665,246,2,4905,'4.99','2005-07-08 20:56:00','2006-02-15 22:14:46'),(6666,246,2,4994,'2.99','2005-07-09 00:54:13','2006-02-15 22:14:46'),(6667,246,2,5347,'0.99','2005-07-09 17:31:32','2006-02-15 22:14:46'),(6668,246,1,6688,'4.99','2005-07-12 12:22:12','2006-02-15 22:14:46'),(6669,246,2,9525,'5.99','2005-07-31 01:02:18','2006-02-15 22:14:46'),(6670,246,2,10208,'4.99','2005-08-01 00:54:51','2006-02-15 22:14:46'),(6671,246,2,10683,'2.99','2005-08-01 17:33:03','2006-02-15 22:14:47'),(6672,246,2,13418,'5.99','2005-08-19 22:53:56','2006-02-15 22:14:47'),(6673,246,1,13750,'6.99','2005-08-20 11:11:42','2006-02-15 22:14:47'),(6674,246,1,13987,'4.99','2005-08-20 19:19:30','2006-02-15 22:14:47'),(6675,246,1,14360,'6.99','2005-08-21 09:16:40','2006-02-15 22:14:47'),(6676,246,1,15746,'2.99','2005-08-23 12:26:19','2006-02-15 22:14:47'),(6677,247,1,189,'4.99','2005-05-26 06:01:41','2006-02-15 22:14:47'),(6678,247,2,448,'3.99','2005-05-27 19:03:08','2006-02-15 22:14:47'),(6679,247,1,450,'6.99','2005-05-27 19:18:54','2006-02-15 22:14:47'),(6680,247,1,2288,'5.99','2005-06-18 07:23:17','2006-02-15 22:14:47'),(6681,247,2,3955,'2.99','2005-07-06 21:58:08','2006-02-15 22:14:47'),(6682,247,2,4198,'6.99','2005-07-07 11:08:11','2006-02-15 22:14:47'),(6683,247,1,4492,'2.99','2005-07-08 01:32:04','2006-02-15 22:14:47'),(6684,247,2,4995,'2.99','2005-07-09 00:57:46','2006-02-15 22:14:47'),(6685,247,1,5328,'6.99','2005-07-09 16:48:29','2006-02-15 22:14:47'),(6686,247,1,5842,'4.99','2005-07-10 17:11:37','2006-02-15 22:14:47'),(6687,247,1,7963,'5.99','2005-07-28 13:48:38','2006-02-15 22:14:47'),(6688,247,1,10279,'1.99','2005-08-01 03:26:44','2006-02-15 22:14:47'),(6689,247,1,10410,'6.99','2005-08-01 07:53:29','2006-02-15 22:14:47'),(6690,247,2,11204,'2.99','2005-08-02 11:56:31','2006-02-15 22:14:47'),(6691,247,2,11306,'2.99','2005-08-02 15:45:10','2006-02-15 22:14:47'),(6692,247,1,11495,'0.99','2005-08-16 22:51:20','2006-02-15 22:14:47'),(6693,247,2,12265,'4.99','2005-08-18 04:22:01','2006-02-15 22:14:47'),(6694,247,1,12482,'7.99','2005-08-18 12:37:36','2006-02-15 22:14:47'),(6695,247,1,12491,'4.99','2005-08-18 12:48:45','2006-02-15 22:14:47'),(6696,247,1,12824,'4.99','2005-08-19 01:18:00','2006-02-15 22:14:47'),(6697,247,1,14041,'4.99','2005-08-20 21:45:23','2006-02-15 22:14:47'),(6698,247,1,15783,'4.99','2005-08-23 13:45:44','2006-02-15 22:14:47'),(6699,248,2,330,'7.99','2005-05-27 02:15:30','2006-02-15 22:14:47'),(6700,248,1,618,'4.99','2005-05-28 15:50:07','2006-02-15 22:14:47'),(6701,248,1,2066,'3.99','2005-06-17 16:07:08','2006-02-15 22:14:48'),(6702,248,2,2371,'0.99','2005-06-18 14:35:29','2006-02-15 22:14:48'),(6703,248,1,3910,'0.99','2005-07-06 20:05:18','2006-02-15 22:14:48'),(6704,248,2,4541,'4.99','2005-07-08 04:04:19','2006-02-15 22:14:48'),(6705,248,1,4841,'0.99','2005-07-08 18:18:23','2006-02-15 22:14:48'),(6706,248,1,5370,'2.99','2005-07-09 18:43:19','2006-02-15 22:14:48'),(6707,248,2,6617,'2.99','2005-07-12 08:39:56','2006-02-15 22:14:48'),(6708,248,2,7778,'5.99','2005-07-28 07:10:11','2006-02-15 22:14:48'),(6709,248,2,10418,'4.99','2005-08-01 08:11:07','2006-02-15 22:14:48'),(6710,248,1,12241,'0.99','2005-08-18 03:33:17','2006-02-15 22:14:48'),(6711,248,1,13918,'0.99','2005-08-20 16:47:32','2006-02-15 22:14:48'),(6712,248,2,14704,'0.99','2005-08-21 21:02:22','2006-02-15 22:14:48'),(6713,248,2,14885,'5.99','2005-08-22 03:58:29','2006-02-15 22:14:48'),(6714,249,2,316,'4.99','2005-05-26 23:22:55','2006-02-15 22:14:48'),(6715,249,2,400,'2.99','2005-05-27 12:51:44','2006-02-15 22:14:48'),(6716,249,1,438,'6.99','2005-05-27 17:52:34','2006-02-15 22:14:48'),(6717,249,1,597,'3.99','2005-05-28 14:01:02','2006-02-15 22:14:48'),(6718,249,1,1204,'0.99','2005-06-15 02:21:46','2006-02-15 22:14:48'),(6719,249,1,1473,'5.99','2005-06-15 20:55:20','2006-02-15 22:14:48'),(6720,249,2,1753,'2.99','2005-06-16 17:08:17','2006-02-15 22:14:48'),(6721,249,2,2129,'1.99','2005-06-17 20:58:32','2006-02-15 22:14:48'),(6722,249,2,3175,'7.99','2005-06-20 22:30:23','2006-02-15 22:14:48'),(6723,249,1,4352,'9.99','2005-07-07 19:15:58','2006-02-15 22:14:48'),(6724,249,1,5011,'4.99','2005-07-09 01:44:40','2006-02-15 22:14:48'),(6725,249,1,5275,'4.99','2005-07-09 14:34:18','2006-02-15 22:14:48'),(6726,249,2,5639,'3.99','2005-07-10 06:33:39','2006-02-15 22:14:48'),(6727,249,2,6670,'7.99','2005-07-12 11:44:33','2006-02-15 22:14:48'),(6728,249,1,7544,'7.99','2005-07-27 21:47:37','2006-02-15 22:14:48'),(6729,249,1,7804,'2.99','2005-07-28 07:56:00','2006-02-15 22:14:48'),(6730,249,2,7881,'4.99','2005-07-28 10:33:22','2006-02-15 22:14:48'),(6731,249,1,11124,'1.99','2005-08-02 08:55:25','2006-02-15 22:14:49'),(6732,249,1,11159,'4.99','2005-08-02 10:00:55','2006-02-15 22:14:49'),(6733,249,2,11668,'0.99','2005-08-17 05:47:32','2006-02-15 22:14:49'),(6734,249,2,13981,'4.99','2005-08-20 19:07:20','2006-02-15 22:14:49'),(6735,249,2,14285,'0.99','2005-08-21 06:50:48','2006-02-15 22:14:49'),(6736,249,1,15160,'6.99','2005-08-22 14:33:50','2006-02-15 22:14:49'),(6737,250,1,61,'5.99','2005-05-25 09:01:57','2006-02-15 22:14:49'),(6738,250,1,176,'3.99','2005-05-26 03:47:39','2006-02-15 22:14:49'),(6739,250,1,637,'4.99','2005-05-28 18:14:29','2006-02-15 22:14:49'),(6740,250,2,687,'0.99','2005-05-29 00:32:09','2006-02-15 22:14:49'),(6741,250,1,1146,'2.99','2005-05-31 20:34:45','2006-02-15 22:14:49'),(6742,250,1,2432,'4.99','2005-06-18 17:59:18','2006-02-15 22:14:49'),(6743,250,1,3635,'4.99','2005-07-06 06:55:36','2006-02-15 22:14:49'),(6744,250,1,3951,'3.99','2005-07-06 21:50:41','2006-02-15 22:14:49'),(6745,250,1,5479,'2.99','2005-07-09 23:47:33','2006-02-15 22:14:49'),(6746,250,1,5540,'0.99','2005-07-10 02:44:21','2006-02-15 22:14:49'),(6747,250,1,5998,'2.99','2005-07-11 01:20:46','2006-02-15 22:14:49'),(6748,250,1,8579,'2.99','2005-07-29 11:59:22','2006-02-15 22:14:49'),(6749,250,2,9099,'0.99','2005-07-30 08:45:48','2006-02-15 22:14:49'),(6750,250,2,10604,'4.99','2005-08-01 14:35:08','2006-02-15 22:14:49'),(6751,250,1,12361,'0.99','2005-08-18 07:47:31','2006-02-15 22:14:49'),(6752,250,1,12810,'0.99','2005-08-19 00:44:10','2006-02-15 22:14:49'),(6753,250,2,14565,'4.99','2005-08-21 16:24:45','2006-02-15 22:14:49'),(6754,250,1,14587,'5.99','2005-08-21 17:20:55','2006-02-15 22:14:49'),(6755,250,2,14814,'4.99','2005-08-22 01:12:14','2006-02-15 22:14:49'),(6756,250,2,15247,'6.99','2005-08-22 17:52:05','2006-02-15 22:14:49'),(6757,251,1,264,'2.99','2005-05-26 16:00:49','2006-02-15 22:14:49'),(6758,251,1,309,'1.99','2005-05-26 22:38:10','2006-02-15 22:14:49'),(6759,251,2,393,'2.99','2005-05-27 11:18:25','2006-02-15 22:14:49'),(6760,251,2,1069,'3.99','2005-05-31 09:32:31','2006-02-15 22:14:49'),(6761,251,1,1091,'4.99','2005-05-31 12:11:04','2006-02-15 22:14:50'),(6762,251,2,1155,'2.99','2005-05-31 22:17:11','2006-02-15 22:14:50'),(6763,251,1,2238,'6.99','2005-06-18 04:22:06','2006-02-15 22:14:50'),(6764,251,2,3422,'7.99','2005-06-21 17:24:40','2006-02-15 22:14:50'),(6765,251,1,3464,'2.99','2005-06-21 22:08:58','2006-02-15 22:14:50'),(6766,251,1,3799,'4.99','2005-07-06 15:00:14','2006-02-15 22:14:50'),(6767,251,2,4026,'3.99','2005-07-07 02:15:48','2006-02-15 22:14:50'),(6768,251,2,4848,'2.99','2005-07-08 18:30:16','2006-02-15 22:14:50'),(6769,251,2,5012,'2.99','2005-07-09 01:45:04','2006-02-15 22:14:50'),(6770,251,2,5979,'2.99','2005-07-11 00:17:09','2006-02-15 22:14:50'),(6771,251,2,6413,'6.99','2005-07-11 23:26:11','2006-02-15 22:14:50'),(6772,251,2,7338,'8.99','2005-07-27 14:13:34','2006-02-15 22:14:50'),(6773,251,2,8443,'2.99','2005-07-29 07:33:12','2006-02-15 22:14:50'),(6774,251,2,8982,'0.99','2005-07-30 04:31:02','2006-02-15 22:14:50'),(6775,251,1,9196,'2.99','2005-07-30 12:30:19','2006-02-15 22:14:50'),(6776,251,1,9892,'0.99','2005-07-31 14:06:25','2006-02-15 22:14:50'),(6777,251,1,10575,'7.99','2005-08-01 13:41:41','2006-02-15 22:14:50'),(6778,251,1,11733,'0.99','2005-08-17 08:31:03','2006-02-15 22:14:50'),(6779,251,2,12047,'3.99','2005-08-17 20:48:32','2006-02-15 22:14:50'),(6780,251,2,12666,'4.99','2005-08-18 19:11:41','2006-02-15 22:14:50'),(6781,251,2,13121,'2.99','2005-08-19 11:51:39','2006-02-15 22:14:50'),(6782,251,1,13243,'2.99','2005-08-19 16:33:16','2006-02-15 22:14:50'),(6783,251,2,13260,'6.99','2005-08-19 17:09:22','2006-02-15 22:14:50'),(6784,251,1,14292,'0.99','2005-08-21 07:06:20','2006-02-15 22:14:50'),(6785,251,2,15647,'2.99','2005-08-23 08:23:56','2006-02-15 22:14:50'),(6786,251,2,15870,'4.99','2005-08-23 16:23:08','2006-02-15 22:14:50'),(6787,251,1,14107,'0.99','2006-02-14 15:16:03','2006-02-15 22:14:50'),(6788,252,1,707,'4.99','2005-05-29 03:18:19','2006-02-15 22:14:50'),(6789,252,1,1095,'0.99','2005-05-31 13:15:41','2006-02-15 22:14:50'),(6790,252,1,1395,'5.99','2005-06-15 16:21:04','2006-02-15 22:14:51'),(6791,252,2,2716,'4.99','2005-06-19 14:40:17','2006-02-15 22:14:51'),(6792,252,1,2968,'0.99','2005-06-20 07:41:47','2006-02-15 22:14:51'),(6793,252,2,4372,'0.99','2005-07-07 20:09:01','2006-02-15 22:14:51'),(6794,252,2,5554,'2.99','2005-07-10 03:03:38','2006-02-15 22:14:51'),(6795,252,1,6357,'0.99','2005-07-11 20:58:51','2006-02-15 22:14:51'),(6796,252,2,6369,'0.99','2005-07-11 21:23:36','2006-02-15 22:14:51'),(6797,252,1,7024,'4.99','2005-07-27 02:36:40','2006-02-15 22:14:51'),(6798,252,2,7121,'0.99','2005-07-27 05:58:32','2006-02-15 22:14:51'),(6799,252,2,7168,'0.99','2005-07-27 07:51:11','2006-02-15 22:14:51'),(6800,252,1,7670,'0.99','2005-07-28 02:44:25','2006-02-15 22:14:51'),(6801,252,1,8636,'5.99','2005-07-29 14:24:13','2006-02-15 22:14:51'),(6802,252,1,8899,'0.99','2005-07-30 01:05:30','2006-02-15 22:14:51'),(6803,252,2,10314,'0.99','2005-08-01 04:31:18','2006-02-15 22:14:51'),(6804,252,2,10834,'2.99','2005-08-01 23:28:00','2006-02-15 22:14:51'),(6805,252,2,11764,'0.99','2005-08-17 09:51:54','2006-02-15 22:14:51'),(6806,252,1,13385,'4.99','2005-08-19 21:39:35','2006-02-15 22:14:51'),(6807,252,2,13989,'5.99','2005-08-20 19:27:50','2006-02-15 22:14:51'),(6808,252,1,14774,'4.99','2005-08-21 23:52:32','2006-02-15 22:14:51'),(6809,252,2,13756,'4.99','2006-02-14 15:16:03','2006-02-15 22:14:51'),(6810,253,1,566,'6.99','2005-05-28 09:51:39','2006-02-15 22:14:51'),(6811,253,1,648,'0.99','2005-05-28 19:25:54','2006-02-15 22:14:51'),(6812,253,1,986,'2.99','2005-05-30 22:22:52','2006-02-15 22:14:51'),(6813,253,2,1378,'1.99','2005-06-15 15:03:15','2006-02-15 22:14:51'),(6814,253,2,1606,'6.99','2005-06-16 06:18:31','2006-02-15 22:14:51'),(6815,253,2,2081,'5.99','2005-06-17 17:05:02','2006-02-15 22:14:51'),(6816,253,1,2142,'4.99','2005-06-17 21:55:43','2006-02-15 22:14:51'),(6817,253,1,2454,'4.99','2005-06-18 19:32:51','2006-02-15 22:14:51'),(6818,253,2,2636,'4.99','2005-06-19 09:13:06','2006-02-15 22:14:51'),(6819,253,1,3658,'7.99','2005-07-06 08:01:08','2006-02-15 22:14:52'),(6820,253,1,5505,'2.99','2005-07-10 00:38:48','2006-02-15 22:14:52'),(6821,253,1,5602,'4.99','2005-07-10 05:02:22','2006-02-15 22:14:52'),(6822,253,2,7689,'2.99','2005-07-28 03:21:24','2006-02-15 22:14:52'),(6823,253,2,7851,'0.99','2005-07-28 09:31:58','2006-02-15 22:14:52'),(6824,253,2,7887,'2.99','2005-07-28 10:40:12','2006-02-15 22:14:52'),(6825,253,2,8752,'2.99','2005-07-29 19:15:07','2006-02-15 22:14:52'),(6826,253,2,9606,'0.99','2005-07-31 03:50:46','2006-02-15 22:14:52'),(6827,253,2,9618,'6.99','2005-07-31 04:16:14','2006-02-15 22:14:52'),(6828,253,2,10404,'4.99','2005-08-01 07:31:25','2006-02-15 22:14:52'),(6829,253,1,10660,'2.99','2005-08-01 16:48:01','2006-02-15 22:14:52'),(6830,253,2,10881,'6.99','2005-08-02 00:38:14','2006-02-15 22:14:52'),(6831,253,1,12572,'0.99','2005-08-18 15:32:54','2006-02-15 22:14:52'),(6832,253,2,12827,'5.99','2005-08-19 01:27:23','2006-02-15 22:14:52'),(6833,253,1,13126,'5.99','2005-08-19 12:00:28','2006-02-15 22:14:52'),(6834,253,2,14086,'3.99','2005-08-20 23:47:54','2006-02-15 22:14:52'),(6835,253,2,14283,'4.99','2005-08-21 06:44:14','2006-02-15 22:14:52'),(6836,253,1,14640,'7.99','2005-08-21 19:03:19','2006-02-15 22:14:52'),(6837,253,2,14655,'4.99','2005-08-21 19:37:10','2006-02-15 22:14:52'),(6838,253,2,15221,'2.99','2005-08-22 17:12:29','2006-02-15 22:14:52'),(6839,254,1,183,'2.99','2005-05-26 05:01:18','2006-02-15 22:14:52'),(6840,254,1,1108,'5.99','2005-05-31 15:05:12','2006-02-15 22:14:52'),(6841,254,1,1285,'2.99','2005-06-15 08:33:06','2006-02-15 22:14:52'),(6842,254,2,1390,'0.99','2005-06-15 16:06:29','2006-02-15 22:14:52'),(6843,254,1,2082,'2.99','2005-06-17 17:13:32','2006-02-15 22:14:52'),(6844,254,1,2138,'2.99','2005-06-17 21:28:14','2006-02-15 22:14:52'),(6845,254,2,2687,'3.99','2005-06-19 12:46:52','2006-02-15 22:14:52'),(6846,254,1,3882,'4.99','2005-07-06 18:38:21','2006-02-15 22:14:52'),(6847,254,2,5042,'2.99','2005-07-09 03:20:30','2006-02-15 22:14:52'),(6848,254,1,5072,'3.99','2005-07-09 05:01:58','2006-02-15 22:14:52'),(6849,254,2,5080,'2.99','2005-07-09 05:23:55','2006-02-15 22:14:53'),(6850,254,1,5537,'0.99','2005-07-10 02:35:41','2006-02-15 22:14:53'),(6851,254,1,5550,'5.99','2005-07-10 02:58:35','2006-02-15 22:14:53'),(6852,254,1,5826,'7.99','2005-07-10 16:21:02','2006-02-15 22:14:53'),(6853,254,2,5930,'4.99','2005-07-10 21:59:32','2006-02-15 22:14:53'),(6854,254,2,7011,'0.99','2005-07-27 01:58:34','2006-02-15 22:14:53'),(6855,254,1,7413,'4.99','2005-07-27 16:45:40','2006-02-15 22:14:53'),(6856,254,2,8216,'7.99','2005-07-28 23:43:59','2006-02-15 22:14:53'),(6857,254,2,8581,'4.99','2005-07-29 12:02:06','2006-02-15 22:14:53'),(6858,254,2,9494,'1.99','2005-07-30 23:52:46','2006-02-15 22:14:53'),(6859,254,1,10522,'4.99','2005-08-01 11:48:51','2006-02-15 22:14:53'),(6860,254,1,11190,'0.99','2005-08-02 11:21:34','2006-02-15 22:14:53'),(6861,254,1,11665,'6.99','2005-08-17 05:36:57','2006-02-15 22:14:53'),(6862,254,2,12148,'0.99','2005-08-18 00:13:15','2006-02-15 22:14:53'),(6863,254,1,12206,'0.99','2005-08-18 02:22:20','2006-02-15 22:14:53'),(6864,254,1,12247,'2.99','2005-08-18 03:51:51','2006-02-15 22:14:53'),(6865,254,1,12874,'0.99','2005-08-19 03:07:57','2006-02-15 22:14:53'),(6866,254,2,13001,'4.99','2005-08-19 07:36:44','2006-02-15 22:14:53'),(6867,254,1,13045,'4.99','2005-08-19 09:17:35','2006-02-15 22:14:53'),(6868,254,2,13130,'2.99','2005-08-19 12:06:42','2006-02-15 22:14:53'),(6869,254,2,14497,'4.99','2005-08-21 14:09:47','2006-02-15 22:14:53'),(6870,254,1,15774,'0.99','2005-08-23 13:25:08','2006-02-15 22:14:53'),(6871,255,1,1235,'2.99','2005-06-15 04:31:28','2006-02-15 22:14:53'),(6872,255,1,1420,'6.99','2005-06-15 17:56:14','2006-02-15 22:14:53'),(6873,255,2,1681,'2.99','2005-06-16 11:38:17','2006-02-15 22:14:53'),(6874,255,2,3442,'2.99','2005-06-21 20:06:51','2006-02-15 22:14:53'),(6875,255,1,4547,'0.99','2005-07-08 04:20:19','2006-02-15 22:14:53'),(6876,255,1,5706,'1.99','2005-07-10 10:21:46','2006-02-15 22:14:53'),(6877,255,1,5943,'0.99','2005-07-10 22:48:13','2006-02-15 22:14:53'),(6878,255,2,7475,'8.99','2005-07-27 19:07:43','2006-02-15 22:14:54'),(6879,255,1,7646,'2.99','2005-07-28 01:31:45','2006-02-15 22:14:54'),(6880,255,1,8562,'0.99','2005-07-29 11:32:13','2006-02-15 22:14:54'),(6881,255,1,9061,'6.99','2005-07-30 07:21:52','2006-02-15 22:14:54'),(6882,255,2,11979,'4.99','2005-08-17 18:07:13','2006-02-15 22:14:54'),(6883,255,2,12176,'7.99','2005-08-18 01:10:33','2006-02-15 22:14:54'),(6884,255,2,13154,'2.99','2005-08-19 13:09:54','2006-02-15 22:14:54'),(6885,255,1,13268,'0.99','2005-08-19 17:33:50','2006-02-15 22:14:54'),(6886,255,2,13683,'0.99','2005-08-20 08:54:55','2006-02-15 22:14:54'),(6887,255,1,13758,'8.99','2005-08-20 11:21:26','2006-02-15 22:14:54'),(6888,255,2,14600,'3.99','2005-08-21 17:45:21','2006-02-15 22:14:54'),(6889,256,1,51,'4.99','2005-05-25 06:49:10','2006-02-15 22:14:54'),(6890,256,1,232,'0.99','2005-05-26 11:38:05','2006-02-15 22:14:54'),(6891,256,2,738,'4.99','2005-05-29 08:20:08','2006-02-15 22:14:54'),(6892,256,1,935,'2.99','2005-05-30 13:29:36','2006-02-15 22:14:54'),(6893,256,1,1116,'0.99','2005-05-31 16:10:46','2006-02-15 22:14:54'),(6894,256,1,1555,'2.99','2005-06-16 02:17:07','2006-02-15 22:14:54'),(6895,256,2,1965,'0.99','2005-06-17 09:17:39','2006-02-15 22:14:54'),(6896,256,2,1973,'4.99','2005-06-17 09:26:15','2006-02-15 22:14:54'),(6897,256,2,2230,'4.99','2005-06-18 03:50:49','2006-02-15 22:14:54'),(6898,256,1,2380,'6.99','2005-06-18 15:00:04','2006-02-15 22:14:54'),(6899,256,2,2561,'4.99','2005-06-19 03:14:52','2006-02-15 22:14:54'),(6900,256,1,2839,'4.99','2005-06-19 22:07:24','2006-02-15 22:14:54'),(6901,256,1,4130,'0.99','2005-07-07 07:51:53','2006-02-15 22:14:54'),(6902,256,2,4182,'0.99','2005-07-07 10:28:00','2006-02-15 22:14:54'),(6903,256,1,5179,'2.99','2005-07-09 10:00:44','2006-02-15 22:14:54'),(6904,256,1,6298,'0.99','2005-07-11 17:42:33','2006-02-15 22:14:54'),(6905,256,1,7661,'3.99','2005-07-28 02:10:27','2006-02-15 22:14:54'),(6906,256,2,9424,'2.99','2005-07-30 21:10:56','2006-02-15 22:14:54'),(6907,256,2,10759,'4.99','2005-08-01 20:22:51','2006-02-15 22:14:55'),(6908,256,2,11011,'2.99','2005-08-02 05:07:07','2006-02-15 22:14:55'),(6909,256,2,11628,'8.99','2005-08-17 04:27:18','2006-02-15 22:14:55'),(6910,256,2,13457,'0.99','2005-08-20 00:33:22','2006-02-15 22:14:55'),(6911,256,1,13651,'0.99','2005-08-20 07:50:08','2006-02-15 22:14:55'),(6912,256,1,14003,'6.99','2005-08-20 20:16:06','2006-02-15 22:14:55'),(6913,256,2,14036,'4.99','2005-08-20 21:35:27','2006-02-15 22:14:55'),(6914,256,2,14445,'2.99','2005-08-21 12:07:42','2006-02-15 22:14:55'),(6915,256,2,14458,'3.99','2005-08-21 12:47:53','2006-02-15 22:14:55'),(6916,256,2,15609,'2.99','2005-08-23 06:56:04','2006-02-15 22:14:55'),(6917,256,2,15861,'4.99','2005-08-23 16:15:45','2006-02-15 22:14:55'),(6918,256,1,15864,'7.99','2005-08-23 16:18:12','2006-02-15 22:14:55'),(6919,257,2,139,'2.99','2005-05-25 23:00:21','2006-02-15 22:14:55'),(6920,257,2,244,'2.99','2005-05-26 13:40:40','2006-02-15 22:14:55'),(6921,257,2,705,'2.99','2005-05-29 02:48:52','2006-02-15 22:14:55'),(6922,257,1,2557,'0.99','2005-06-19 03:08:51','2006-02-15 22:14:55'),(6923,257,2,3083,'4.99','2005-06-20 15:33:47','2006-02-15 22:14:55'),(6924,257,2,4462,'6.99','2005-07-08 00:02:49','2006-02-15 22:14:55'),(6925,257,2,4574,'4.99','2005-07-08 05:39:42','2006-02-15 22:14:55'),(6926,257,1,5495,'6.99','2005-07-10 00:16:54','2006-02-15 22:14:55'),(6927,257,1,5858,'4.99','2005-07-10 18:00:07','2006-02-15 22:14:55'),(6928,257,1,6422,'5.99','2005-07-11 23:46:19','2006-02-15 22:14:55'),(6929,257,2,6711,'5.99','2005-07-12 13:23:40','2006-02-15 22:14:55'),(6930,257,2,7007,'4.99','2005-07-27 01:43:39','2006-02-15 22:14:55'),(6931,257,1,7176,'2.99','2005-07-27 08:04:28','2006-02-15 22:14:55'),(6932,257,1,7496,'1.99','2005-07-27 20:04:05','2006-02-15 22:14:55'),(6933,257,2,7510,'2.99','2005-07-27 20:37:57','2006-02-15 22:14:55'),(6934,257,2,7518,'5.99','2005-07-27 21:01:16','2006-02-15 22:14:55'),(6935,257,2,8156,'3.99','2005-07-28 20:59:04','2006-02-15 22:14:56'),(6936,257,2,8252,'2.99','2005-07-29 00:54:17','2006-02-15 22:14:56'),(6937,257,1,8344,'4.99','2005-07-29 04:45:25','2006-02-15 22:14:56'),(6938,257,1,8640,'4.99','2005-07-29 14:34:17','2006-02-15 22:14:56'),(6939,257,2,8946,'6.99','2005-07-30 03:14:53','2006-02-15 22:14:56'),(6940,257,1,9800,'4.99','2005-07-31 11:00:58','2006-02-15 22:14:56'),(6941,257,2,10142,'4.99','2005-07-31 22:10:54','2006-02-15 22:14:56'),(6942,257,1,11230,'4.99','2005-08-02 12:59:08','2006-02-15 22:14:56'),(6943,257,1,11394,'0.99','2005-08-02 18:44:45','2006-02-15 22:14:56'),(6944,257,2,11545,'6.99','2005-08-17 00:56:06','2006-02-15 22:14:56'),(6945,257,2,11860,'1.99','2005-08-17 13:52:26','2006-02-15 22:14:56'),(6946,257,2,12841,'2.99','2005-08-19 01:55:55','2006-02-15 22:14:56'),(6947,257,1,12904,'5.99','2005-08-19 04:10:50','2006-02-15 22:14:56'),(6948,257,2,13203,'7.99','2005-08-19 15:00:58','2006-02-15 22:14:56'),(6949,257,2,13218,'0.99','2005-08-19 15:39:39','2006-02-15 22:14:56'),(6950,257,1,13389,'2.99','2005-08-19 21:52:51','2006-02-15 22:14:56'),(6951,257,2,13846,'5.99','2005-08-20 14:32:31','2006-02-15 22:14:56'),(6952,257,2,14115,'0.99','2005-08-21 01:10:29','2006-02-15 22:14:56'),(6953,257,1,15025,'0.99','2005-08-22 08:57:24','2006-02-15 22:14:56'),(6954,257,1,15967,'2.99','2005-08-23 19:50:06','2006-02-15 22:14:56'),(6955,257,2,15968,'0.99','2005-08-23 19:51:29','2006-02-15 22:14:56'),(6956,258,1,1743,'2.99','2005-06-16 16:38:10','2006-02-15 22:14:56'),(6957,258,2,2678,'0.99','2005-06-19 12:12:23','2006-02-15 22:14:56'),(6958,258,2,2931,'8.99','2005-06-20 04:50:45','2006-02-15 22:14:56'),(6959,258,2,4408,'2.99','2005-07-07 21:41:06','2006-02-15 22:14:56'),(6960,258,1,4677,'5.99','2005-07-08 10:30:36','2006-02-15 22:14:56'),(6961,258,2,4897,'0.99','2005-07-08 20:25:11','2006-02-15 22:14:56'),(6962,258,2,5312,'5.99','2005-07-09 16:03:09','2006-02-15 22:14:56'),(6963,258,1,5674,'0.99','2005-07-10 08:26:26','2006-02-15 22:14:57'),(6964,258,1,5935,'9.99','2005-07-10 22:11:04','2006-02-15 22:14:57'),(6965,258,2,6012,'4.99','2005-07-11 02:00:12','2006-02-15 22:14:57'),(6966,258,1,7814,'2.99','2005-07-28 08:09:48','2006-02-15 22:14:57'),(6967,258,1,8675,'4.99','2005-07-29 15:56:18','2006-02-15 22:14:57'),(6968,258,2,9069,'4.99','2005-07-30 07:39:59','2006-02-15 22:14:57'),(6969,258,2,10293,'1.99','2005-08-01 03:44:26','2006-02-15 22:14:57'),(6970,258,2,10315,'4.99','2005-08-01 04:34:45','2006-02-15 22:14:57'),(6971,258,1,10325,'5.99','2005-08-01 04:52:12','2006-02-15 22:14:57'),(6972,258,2,10332,'6.99','2005-08-01 04:57:32','2006-02-15 22:14:57'),(6973,258,1,10393,'0.99','2005-08-01 06:52:50','2006-02-15 22:14:57'),(6974,258,1,12246,'5.99','2005-08-18 03:48:41','2006-02-15 22:14:57'),(6975,258,2,12296,'3.99','2005-08-18 05:16:28','2006-02-15 22:14:57'),(6976,258,1,13491,'4.99','2005-08-20 01:30:56','2006-02-15 22:14:57'),(6977,258,1,13695,'6.99','2005-08-20 09:13:25','2006-02-15 22:14:57'),(6978,258,2,13897,'2.99','2005-08-20 16:02:28','2006-02-15 22:14:57'),(6979,258,2,14901,'6.99','2005-08-22 04:31:37','2006-02-15 22:14:57'),(6980,259,2,722,'6.99','2005-05-29 05:30:31','2006-02-15 22:14:57'),(6981,259,2,901,'2.99','2005-05-30 09:40:40','2006-02-15 22:14:57'),(6982,259,1,1147,'5.99','2005-05-31 20:37:52','2006-02-15 22:14:57'),(6983,259,1,1641,'7.99','2005-06-16 08:46:26','2006-02-15 22:14:57'),(6984,259,2,1723,'7.99','2005-06-16 15:14:18','2006-02-15 22:14:57'),(6985,259,2,1813,'2.99','2005-06-16 21:11:00','2006-02-15 22:14:57'),(6986,259,2,2375,'5.99','2005-06-18 14:47:29','2006-02-15 22:14:57'),(6987,259,2,4199,'5.99','2005-07-07 11:13:07','2006-02-15 22:14:57'),(6988,259,2,4489,'4.99','2005-07-08 01:23:58','2006-02-15 22:14:57'),(6989,259,1,6074,'0.99','2005-07-11 04:59:56','2006-02-15 22:14:57'),(6990,259,2,6539,'3.99','2005-07-12 04:50:49','2006-02-15 22:14:57'),(6991,259,2,7188,'2.99','2005-07-27 08:32:08','2006-02-15 22:14:57'),(6992,259,2,7774,'7.99','2005-07-28 07:03:25','2006-02-15 22:14:58'),(6993,259,1,7817,'4.99','2005-07-28 08:20:55','2006-02-15 22:14:58'),(6994,259,2,9205,'6.99','2005-07-30 12:46:40','2006-02-15 22:14:58'),(6995,259,1,9282,'6.99','2005-07-30 15:17:31','2006-02-15 22:14:58'),(6996,259,1,9444,'7.99','2005-07-30 21:48:44','2006-02-15 22:14:58'),(6997,259,1,10510,'3.99','2005-08-01 11:28:30','2006-02-15 22:14:58'),(6998,259,1,10781,'2.99','2005-08-01 21:22:41','2006-02-15 22:14:58'),(6999,259,1,11184,'3.99','2005-08-02 11:01:26','2006-02-15 22:14:58'),(7000,259,2,12680,'6.99','2005-08-18 19:43:46','2006-02-15 22:14:58'),(7001,259,1,13109,'4.99','2005-08-19 11:23:20','2006-02-15 22:14:58'),(7002,259,2,13112,'2.99','2005-08-19 11:27:10','2006-02-15 22:14:58'),(7003,259,2,13366,'4.99','2005-08-19 21:14:45','2006-02-15 22:14:58'),(7004,259,1,13598,'5.99','2005-08-20 05:59:17','2006-02-15 22:14:58'),(7005,259,2,13649,'4.99','2005-08-20 07:48:38','2006-02-15 22:14:58'),(7006,259,2,14067,'6.99','2005-08-20 22:49:23','2006-02-15 22:14:58'),(7007,259,2,14170,'4.99','2005-08-21 03:00:39','2006-02-15 22:14:58'),(7008,259,2,14966,'2.99','2005-08-22 06:45:57','2006-02-15 22:14:58'),(7009,259,1,15425,'10.99','2005-08-23 00:05:57','2006-02-15 22:14:58'),(7010,259,1,15473,'2.99','2005-08-23 01:39:10','2006-02-15 22:14:58'),(7011,259,2,NULL,'1.99','2005-08-23 06:13:16','2006-02-15 22:14:58'),(7012,259,1,15689,'2.99','2005-08-23 09:52:55','2006-02-15 22:14:58'),(7013,260,1,1101,'8.99','2005-05-31 14:13:59','2006-02-15 22:14:58'),(7014,260,1,1626,'3.99','2005-06-16 07:49:47','2006-02-15 22:14:58'),(7015,260,2,2001,'2.99','2005-06-17 11:35:09','2006-02-15 22:14:58'),(7016,260,2,2040,'2.99','2005-06-17 14:18:37','2006-02-15 22:14:58'),(7017,260,1,2091,'10.99','2005-06-17 18:09:04','2006-02-15 22:14:58'),(7018,260,1,2178,'0.99','2005-06-18 00:38:35','2006-02-15 22:14:58'),(7019,260,1,2823,'7.99','2005-06-19 20:30:21','2006-02-15 22:14:58'),(7020,260,2,2958,'3.99','2005-06-20 06:56:20','2006-02-15 22:14:58'),(7021,260,1,3193,'0.99','2005-06-20 23:52:30','2006-02-15 22:14:59'),(7022,260,2,4054,'0.99','2005-07-07 03:42:07','2006-02-15 22:14:59'),(7023,260,2,4741,'6.99','2005-07-08 13:31:23','2006-02-15 22:14:59'),(7024,260,1,4870,'2.99','2005-07-08 19:14:45','2006-02-15 22:14:59'),(7025,260,2,6328,'2.99','2005-07-11 19:09:33','2006-02-15 22:14:59'),(7026,260,2,7072,'0.99','2005-07-27 04:02:33','2006-02-15 22:14:59'),(7027,260,1,7268,'1.99','2005-07-27 11:23:09','2006-02-15 22:14:59'),(7028,260,1,7885,'7.99','2005-07-28 10:37:41','2006-02-15 22:14:59'),(7029,260,1,8475,'1.99','2005-07-29 08:37:41','2006-02-15 22:14:59'),(7030,260,1,8484,'2.99','2005-07-29 08:51:59','2006-02-15 22:14:59'),(7031,260,1,8717,'0.99','2005-07-29 17:40:45','2006-02-15 22:14:59'),(7032,260,1,8933,'0.99','2005-07-30 02:36:06','2006-02-15 22:14:59'),(7033,260,2,9176,'4.99','2005-07-30 11:50:54','2006-02-15 22:14:59'),(7034,260,2,10970,'8.99','2005-08-02 04:06:46','2006-02-15 22:14:59'),(7035,260,1,12852,'0.99','2005-08-19 02:12:40','2006-02-15 22:14:59'),(7036,260,2,13440,'2.99','2005-08-19 23:42:52','2006-02-15 22:14:59'),(7037,260,1,13685,'3.99','2005-08-20 08:57:11','2006-02-15 22:14:59'),(7038,260,1,13966,'2.99','2005-08-20 18:28:28','2006-02-15 22:14:59'),(7039,260,2,13978,'0.99','2005-08-20 19:03:25','2006-02-15 22:14:59'),(7040,260,2,14035,'2.99','2005-08-20 21:31:58','2006-02-15 22:14:59'),(7041,260,2,14441,'2.99','2005-08-21 11:59:38','2006-02-15 22:14:59'),(7042,260,1,14579,'7.99','2005-08-21 16:54:47','2006-02-15 22:14:59'),(7043,260,1,14610,'6.99','2005-08-21 17:59:09','2006-02-15 22:14:59'),(7044,261,1,12,'4.99','2005-05-25 00:19:27','2006-02-15 22:14:59'),(7045,261,2,465,'3.99','2005-05-27 20:44:36','2006-02-15 22:14:59'),(7046,261,2,542,'6.99','2005-05-28 06:42:13','2006-02-15 22:14:59'),(7047,261,1,792,'0.99','2005-05-29 16:32:10','2006-02-15 22:14:59'),(7048,261,1,1760,'2.99','2005-06-16 17:48:37','2006-02-15 22:14:59'),(7049,261,1,1877,'5.99','2005-06-17 02:54:16','2006-02-15 22:15:00'),(7050,261,2,1988,'8.99','2005-06-17 10:42:34','2006-02-15 22:15:00'),(7051,261,2,2072,'3.99','2005-06-17 16:33:32','2006-02-15 22:15:00'),(7052,261,2,2392,'0.99','2005-06-18 15:34:18','2006-02-15 22:15:00'),(7053,261,1,3363,'0.99','2005-06-21 12:25:07','2006-02-15 22:15:00'),(7054,261,1,5122,'3.99','2005-07-09 07:19:35','2006-02-15 22:15:00'),(7055,261,1,5449,'5.99','2005-07-09 22:12:01','2006-02-15 22:15:00'),(7056,261,2,6515,'2.99','2005-07-12 03:50:32','2006-02-15 22:15:00'),(7057,261,1,6743,'0.99','2005-07-12 14:29:25','2006-02-15 22:15:00'),(7058,261,2,9552,'4.99','2005-07-31 02:05:32','2006-02-15 22:15:00'),(7059,261,1,9842,'4.99','2005-07-31 12:24:58','2006-02-15 22:15:00'),(7060,261,1,9869,'4.99','2005-07-31 13:21:54','2006-02-15 22:15:00'),(7061,261,2,10246,'1.99','2005-08-01 02:29:50','2006-02-15 22:15:00'),(7062,261,1,11834,'1.99','2005-08-17 13:00:40','2006-02-15 22:15:00'),(7063,261,2,11928,'2.99','2005-08-17 16:28:24','2006-02-15 22:15:00'),(7064,261,1,12327,'6.99','2005-08-18 06:43:22','2006-02-15 22:15:00'),(7065,261,2,13245,'4.99','2005-08-19 16:43:41','2006-02-15 22:15:00'),(7066,261,2,13506,'5.99','2005-08-20 02:07:06','2006-02-15 22:15:00'),(7067,261,1,13669,'2.99','2005-08-20 08:26:32','2006-02-15 22:15:00'),(7068,261,1,13849,'4.99','2005-08-20 14:42:34','2006-02-15 22:15:00'),(7069,261,2,15397,'4.99','2005-08-22 23:08:46','2006-02-15 22:15:00'),(7070,262,2,984,'4.99','2005-05-30 22:17:17','2006-02-15 22:15:00'),(7071,262,1,1563,'2.99','2005-06-16 02:46:28','2006-02-15 22:15:00'),(7072,262,1,2771,'6.99','2005-06-19 17:54:48','2006-02-15 22:15:00'),(7073,262,2,2850,'8.99','2005-06-19 23:06:28','2006-02-15 22:15:00'),(7074,262,1,2915,'1.99','2005-06-20 03:57:17','2006-02-15 22:15:00'),(7075,262,1,3521,'1.99','2005-07-06 01:00:11','2006-02-15 22:15:00'),(7076,262,1,3699,'3.99','2005-07-06 10:11:25','2006-02-15 22:15:01'),(7077,262,1,4501,'0.99','2005-07-08 02:12:00','2006-02-15 22:15:01'),(7078,262,2,5503,'0.99','2005-07-10 00:35:37','2006-02-15 22:15:01'),(7079,262,1,6291,'0.99','2005-07-11 17:16:40','2006-02-15 22:15:01'),(7080,262,2,6547,'7.99','2005-07-12 04:57:46','2006-02-15 22:15:01'),(7081,262,1,6724,'3.99','2005-07-12 13:45:15','2006-02-15 22:15:01'),(7082,262,2,6762,'7.99','2005-07-12 15:25:33','2006-02-15 22:15:01'),(7083,262,1,6805,'6.99','2005-07-12 17:23:01','2006-02-15 22:15:01'),(7084,262,1,6986,'4.99','2005-07-27 00:59:05','2006-02-15 22:15:01'),(7085,262,1,9105,'6.99','2005-07-30 08:50:25','2006-02-15 22:15:01'),(7086,262,2,10421,'0.99','2005-08-01 08:14:10','2006-02-15 22:15:01'),(7087,262,2,10770,'0.99','2005-08-01 20:45:39','2006-02-15 22:15:01'),(7088,262,2,13466,'2.99','2005-08-20 00:55:16','2006-02-15 22:15:01'),(7089,262,1,13808,'5.99','2005-08-20 12:55:43','2006-02-15 22:15:01'),(7090,262,1,14180,'4.99','2005-08-21 03:16:15','2006-02-15 22:15:01'),(7091,262,2,14465,'3.99','2005-08-21 12:54:22','2006-02-15 22:15:01'),(7092,262,2,14834,'6.99','2005-08-22 01:45:58','2006-02-15 22:15:01'),(7093,262,2,15270,'3.99','2005-08-22 18:48:42','2006-02-15 22:15:01'),(7094,262,1,15456,'0.99','2005-08-23 01:07:01','2006-02-15 22:15:01'),(7095,262,1,15640,'4.99','2005-08-23 08:04:40','2006-02-15 22:15:01'),(7096,262,2,15771,'4.99','2005-08-23 13:18:46','2006-02-15 22:15:01'),(7097,262,1,15918,'3.99','2005-08-23 17:57:35','2006-02-15 22:15:01'),(7098,263,1,97,'4.99','2005-05-25 16:34:24','2006-02-15 22:15:01'),(7099,263,1,266,'0.99','2005-05-26 16:08:05','2006-02-15 22:15:01'),(7100,263,2,2126,'8.99','2005-06-17 20:54:36','2006-02-15 22:15:01'),(7101,263,2,3257,'1.99','2005-06-21 03:47:19','2006-02-15 22:15:01'),(7102,263,1,3578,'4.99','2005-07-06 03:47:05','2006-02-15 22:15:01'),(7103,263,2,3773,'2.99','2005-07-06 13:23:34','2006-02-15 22:15:02'),(7104,263,2,4637,'0.99','2005-07-08 08:49:54','2006-02-15 22:15:02'),(7105,263,2,4682,'2.99','2005-07-08 10:38:27','2006-02-15 22:15:02'),(7106,263,2,5125,'2.99','2005-07-09 07:25:28','2006-02-15 22:15:02'),(7107,263,2,5254,'1.99','2005-07-09 13:50:11','2006-02-15 22:15:02'),(7108,263,2,6376,'4.99','2005-07-11 21:40:23','2006-02-15 22:15:02'),(7109,263,1,6483,'2.99','2005-07-12 01:59:20','2006-02-15 22:15:02'),(7110,263,1,6808,'1.99','2005-07-12 17:36:42','2006-02-15 22:15:02'),(7111,263,2,7291,'4.99','2005-07-27 12:30:47','2006-02-15 22:15:02'),(7112,263,1,7425,'4.99','2005-07-27 17:18:35','2006-02-15 22:15:02'),(7113,263,1,7706,'4.99','2005-07-28 04:03:17','2006-02-15 22:15:02'),(7114,263,2,7833,'1.99','2005-07-28 08:46:14','2006-02-15 22:15:02'),(7115,263,1,10476,'6.99','2005-08-01 10:03:20','2006-02-15 22:15:02'),(7116,263,1,10775,'2.99','2005-08-01 20:59:52','2006-02-15 22:15:02'),(7117,263,1,11339,'2.99','2005-08-02 17:02:06','2006-02-15 22:15:02'),(7118,263,1,11822,'0.99','2005-08-17 12:32:39','2006-02-15 22:15:02'),(7119,263,2,12057,'9.99','2005-08-17 21:04:35','2006-02-15 22:15:02'),(7120,263,2,12432,'5.99','2005-08-18 10:35:13','2006-02-15 22:15:02'),(7121,263,2,12919,'6.99','2005-08-19 04:32:15','2006-02-15 22:15:02'),(7122,263,1,14335,'3.99','2005-08-21 08:33:07','2006-02-15 22:15:02'),(7123,263,2,14448,'6.99','2005-08-21 12:13:10','2006-02-15 22:15:02'),(7124,263,1,15322,'4.99','2005-08-22 20:20:30','2006-02-15 22:15:02'),(7125,263,2,15922,'7.99','2005-08-23 18:07:31','2006-02-15 22:15:02'),(7126,263,1,15293,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:02'),(7127,264,2,1165,'3.99','2005-06-14 23:16:27','2006-02-15 22:15:02'),(7128,264,1,1206,'4.99','2005-06-15 02:27:07','2006-02-15 22:15:02'),(7129,264,1,3028,'0.99','2005-06-20 11:50:52','2006-02-15 22:15:02'),(7130,264,1,3403,'3.99','2005-06-21 15:55:06','2006-02-15 22:15:02'),(7131,264,1,3618,'6.99','2005-07-06 05:58:45','2006-02-15 22:15:03'),(7132,264,1,4328,'4.99','2005-07-07 18:03:17','2006-02-15 22:15:03'),(7133,264,1,4539,'0.99','2005-07-08 04:01:02','2006-02-15 22:15:03'),(7134,264,1,6340,'8.99','2005-07-11 19:46:05','2006-02-15 22:15:03'),(7135,264,2,6391,'0.99','2005-07-11 22:23:09','2006-02-15 22:15:03'),(7136,264,1,6395,'2.99','2005-07-11 22:29:29','2006-02-15 22:15:03'),(7137,264,1,6543,'0.99','2005-07-12 04:54:32','2006-02-15 22:15:03'),(7138,264,1,7006,'8.99','2005-07-27 01:42:20','2006-02-15 22:15:03'),(7139,264,2,9380,'2.99','2005-07-30 19:17:31','2006-02-15 22:15:03'),(7140,264,2,9515,'0.99','2005-07-31 00:35:05','2006-02-15 22:15:03'),(7141,264,1,9861,'5.99','2005-07-31 13:04:14','2006-02-15 22:15:03'),(7142,264,1,9932,'5.99','2005-07-31 15:19:48','2006-02-15 22:15:03'),(7143,264,2,10792,'2.99','2005-08-01 21:44:24','2006-02-15 22:15:03'),(7144,264,1,11527,'3.99','2005-08-17 00:25:06','2006-02-15 22:15:03'),(7145,264,2,11533,'0.99','2005-08-17 00:34:53','2006-02-15 22:15:03'),(7146,264,1,11539,'2.99','2005-08-17 00:45:41','2006-02-15 22:15:03'),(7147,264,1,12518,'4.99','2005-08-18 13:41:32','2006-02-15 22:15:03'),(7148,264,2,13590,'2.99','2005-08-20 05:48:59','2006-02-15 22:15:03'),(7149,264,1,13664,'5.99','2005-08-20 08:18:36','2006-02-15 22:15:03'),(7150,264,1,15595,'4.99','2005-08-23 06:19:12','2006-02-15 22:15:03'),(7151,264,2,14243,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:03'),(7152,265,2,74,'0.99','2005-05-25 11:09:48','2006-02-15 22:15:03'),(7153,265,2,2027,'7.99','2005-06-17 13:06:56','2006-02-15 22:15:03'),(7154,265,2,2562,'4.99','2005-06-19 03:15:05','2006-02-15 22:15:03'),(7155,265,1,2598,'2.99','2005-06-19 05:59:57','2006-02-15 22:15:03'),(7156,265,1,3823,'2.99','2005-07-06 15:41:27','2006-02-15 22:15:03'),(7157,265,1,4610,'0.99','2005-07-08 07:28:05','2006-02-15 22:15:03'),(7158,265,1,4797,'2.99','2005-07-08 16:39:05','2006-02-15 22:15:03'),(7159,265,2,5029,'7.99','2005-07-09 02:35:32','2006-02-15 22:15:03'),(7160,265,1,5417,'4.99','2005-07-09 20:34:09','2006-02-15 22:15:04'),(7161,265,1,5710,'9.99','2005-07-10 10:32:52','2006-02-15 22:15:04'),(7162,265,1,6068,'4.99','2005-07-11 04:41:09','2006-02-15 22:15:04'),(7163,265,2,6371,'4.99','2005-07-11 21:31:51','2006-02-15 22:15:04'),(7164,265,2,6553,'5.99','2005-07-12 05:06:39','2006-02-15 22:15:04'),(7165,265,2,6921,'6.99','2005-07-12 22:39:03','2006-02-15 22:15:04'),(7166,265,2,7414,'1.99','2005-07-27 16:46:07','2006-02-15 22:15:04'),(7167,265,1,7704,'2.99','2005-07-28 04:02:13','2006-02-15 22:15:04'),(7168,265,1,8278,'5.99','2005-07-29 01:42:55','2006-02-15 22:15:04'),(7169,265,2,8489,'2.99','2005-07-29 08:58:03','2006-02-15 22:15:04'),(7170,265,2,8665,'0.99','2005-07-29 15:39:29','2006-02-15 22:15:04'),(7171,265,1,9416,'2.99','2005-07-30 20:52:45','2006-02-15 22:15:04'),(7172,265,2,10592,'3.99','2005-08-01 14:13:00','2006-02-15 22:15:04'),(7173,265,2,11000,'3.99','2005-08-02 04:56:14','2006-02-15 22:15:04'),(7174,265,1,12207,'1.99','2005-08-18 02:24:07','2006-02-15 22:15:04'),(7175,265,2,12346,'4.99','2005-08-18 07:17:55','2006-02-15 22:15:04'),(7176,265,2,13700,'8.99','2005-08-20 09:26:17','2006-02-15 22:15:04'),(7177,265,2,14125,'4.99','2005-08-21 01:32:16','2006-02-15 22:15:04'),(7178,265,1,14547,'6.99','2005-08-21 15:51:38','2006-02-15 22:15:04'),(7179,265,2,14556,'6.99','2005-08-21 16:03:27','2006-02-15 22:15:04'),(7180,265,1,14943,'2.99','2005-08-22 05:59:59','2006-02-15 22:15:04'),(7181,266,1,86,'1.99','2005-05-25 13:36:12','2006-02-15 22:15:04'),(7182,266,2,651,'2.99','2005-05-28 19:46:50','2006-02-15 22:15:04'),(7183,266,2,1280,'5.99','2005-06-15 08:16:06','2006-02-15 22:15:04'),(7184,266,2,2065,'4.99','2005-06-17 16:03:46','2006-02-15 22:15:04'),(7185,266,2,3002,'4.99','2005-06-20 09:56:12','2006-02-15 22:15:04'),(7186,266,1,3059,'4.99','2005-06-20 13:38:41','2006-02-15 22:15:04'),(7187,266,2,3585,'0.99','2005-07-06 04:22:36','2006-02-15 22:15:04'),(7188,266,2,5362,'5.99','2005-07-09 18:16:08','2006-02-15 22:15:05'),(7189,266,1,5577,'4.99','2005-07-10 03:58:40','2006-02-15 22:15:05'),(7190,266,1,8492,'2.99','2005-07-29 09:04:17','2006-02-15 22:15:05'),(7191,266,2,9109,'5.99','2005-07-30 08:58:24','2006-02-15 22:15:05'),(7192,266,2,10747,'4.99','2005-08-01 19:59:41','2006-02-15 22:15:05'),(7193,266,2,10910,'5.99','2005-08-02 01:54:34','2006-02-15 22:15:05'),(7194,266,2,11233,'5.99','2005-08-02 13:06:11','2006-02-15 22:15:05'),(7195,266,1,11321,'4.99','2005-08-02 16:15:07','2006-02-15 22:15:05'),(7196,266,2,11626,'0.99','2005-08-17 04:25:42','2006-02-15 22:15:05'),(7197,266,1,11726,'0.99','2005-08-17 08:11:10','2006-02-15 22:15:05'),(7198,266,1,12255,'4.99','2005-08-18 04:07:20','2006-02-15 22:15:05'),(7199,266,2,12378,'0.99','2005-08-18 08:26:13','2006-02-15 22:15:05'),(7200,266,1,12405,'6.99','2005-08-18 09:37:30','2006-02-15 22:15:05'),(7201,266,1,12715,'4.99','2005-08-18 21:09:38','2006-02-15 22:15:05'),(7202,266,1,13468,'8.99','2005-08-20 00:56:44','2006-02-15 22:15:05'),(7203,266,1,13556,'6.99','2005-08-20 04:10:26','2006-02-15 22:15:05'),(7204,266,1,14080,'1.99','2005-08-20 23:29:50','2006-02-15 22:15:05'),(7205,266,1,14492,'2.99','2005-08-21 13:59:08','2006-02-15 22:15:05'),(7206,266,1,14877,'0.99','2005-08-22 03:39:56','2006-02-15 22:15:05'),(7207,266,1,15181,'2.99','2005-08-22 15:46:20','2006-02-15 22:15:05'),(7208,266,1,15346,'4.99','2005-08-22 21:06:00','2006-02-15 22:15:05'),(7209,267,2,91,'6.99','2005-05-25 14:57:22','2006-02-15 22:15:05'),(7210,267,1,436,'4.99','2005-05-27 17:21:04','2006-02-15 22:15:05'),(7211,267,2,1030,'4.99','2005-05-31 04:06:47','2006-02-15 22:15:05'),(7212,267,2,1257,'4.99','2005-06-15 06:15:36','2006-02-15 22:15:05'),(7213,267,2,1349,'4.99','2005-06-15 12:49:02','2006-02-15 22:15:05'),(7214,267,2,2265,'2.99','2005-06-18 06:03:27','2006-02-15 22:15:05'),(7215,267,2,2578,'7.99','2005-06-19 04:40:06','2006-02-15 22:15:05'),(7216,267,1,2582,'6.99','2005-06-19 04:56:27','2006-02-15 22:15:05'),(7217,267,2,2699,'2.99','2005-06-19 13:29:28','2006-02-15 22:15:06'),(7218,267,2,2754,'4.99','2005-06-19 16:55:59','2006-02-15 22:15:06'),(7219,267,1,2877,'1.99','2005-06-20 01:07:16','2006-02-15 22:15:06'),(7220,267,2,3090,'0.99','2005-06-20 16:00:19','2006-02-15 22:15:06'),(7221,267,1,3817,'2.99','2005-07-06 15:31:45','2006-02-15 22:15:06'),(7222,267,1,5340,'6.99','2005-07-09 17:11:35','2006-02-15 22:15:06'),(7223,267,1,6070,'0.99','2005-07-11 04:47:42','2006-02-15 22:15:06'),(7224,267,1,6706,'3.99','2005-07-12 12:59:16','2006-02-15 22:15:06'),(7225,267,1,8190,'4.99','2005-07-28 22:47:06','2006-02-15 22:15:06'),(7226,267,1,8572,'1.99','2005-07-29 11:51:24','2006-02-15 22:15:06'),(7227,267,2,9059,'3.99','2005-07-30 07:18:44','2006-02-15 22:15:06'),(7228,267,1,9308,'6.99','2005-07-30 16:53:21','2006-02-15 22:15:06'),(7229,267,2,9403,'4.99','2005-07-30 20:18:53','2006-02-15 22:15:06'),(7230,267,2,9807,'2.99','2005-07-31 11:13:52','2006-02-15 22:15:06'),(7231,267,2,10048,'4.99','2005-07-31 19:08:56','2006-02-15 22:15:06'),(7232,267,1,10343,'2.99','2005-08-01 05:15:47','2006-02-15 22:15:06'),(7233,267,2,11373,'0.99','2005-08-02 18:14:12','2006-02-15 22:15:06'),(7234,267,1,11690,'6.99','2005-08-17 06:44:22','2006-02-15 22:15:06'),(7235,267,1,12320,'4.99','2005-08-18 06:26:51','2006-02-15 22:15:06'),(7236,267,1,12979,'4.99','2005-08-19 07:00:35','2006-02-15 22:15:06'),(7237,267,2,13236,'9.99','2005-08-19 16:18:24','2006-02-15 22:15:06'),(7238,267,1,14131,'5.99','2005-08-21 01:43:40','2006-02-15 22:15:06'),(7239,267,2,15020,'3.99','2005-08-22 08:54:12','2006-02-15 22:15:06'),(7240,267,1,15208,'3.99','2005-08-22 16:35:47','2006-02-15 22:15:06'),(7241,267,1,15768,'0.99','2005-08-23 13:14:47','2006-02-15 22:15:06'),(7242,267,1,15903,'3.99','2005-08-23 17:30:40','2006-02-15 22:15:06'),(7243,267,2,12066,'7.98','2006-02-14 15:16:03','2006-02-15 22:15:06'),(7244,267,2,13713,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:07'),(7245,268,1,1394,'2.99','2005-06-15 16:17:21','2006-02-15 22:15:07'),(7246,268,2,1450,'4.99','2005-06-15 19:22:08','2006-02-15 22:15:07'),(7247,268,2,1551,'3.99','2005-06-16 02:01:15','2006-02-15 22:15:07'),(7248,268,1,2133,'0.99','2005-06-17 21:10:05','2006-02-15 22:15:07'),(7249,268,2,2324,'4.99','2005-06-18 10:00:33','2006-02-15 22:15:07'),(7250,268,2,2858,'2.99','2005-06-19 23:17:11','2006-02-15 22:15:07'),(7251,268,1,3066,'3.99','2005-06-20 13:55:41','2006-02-15 22:15:07'),(7252,268,1,3361,'1.99','2005-06-21 12:14:23','2006-02-15 22:15:07'),(7253,268,2,3670,'4.99','2005-07-06 08:56:43','2006-02-15 22:15:07'),(7254,268,2,4626,'4.99','2005-07-08 08:18:21','2006-02-15 22:15:07'),(7255,268,1,5039,'7.99','2005-07-09 03:14:45','2006-02-15 22:15:07'),(7256,268,2,5671,'2.99','2005-07-10 08:18:22','2006-02-15 22:15:07'),(7257,268,2,5793,'2.99','2005-07-10 14:33:00','2006-02-15 22:15:07'),(7258,268,2,5888,'6.99','2005-07-10 19:52:17','2006-02-15 22:15:07'),(7259,268,1,6120,'3.99','2005-07-11 07:49:53','2006-02-15 22:15:07'),(7260,268,2,6489,'1.99','2005-07-12 02:22:46','2006-02-15 22:15:07'),(7261,268,1,8931,'2.99','2005-07-30 02:30:07','2006-02-15 22:15:07'),(7262,268,2,9436,'7.99','2005-07-30 21:33:01','2006-02-15 22:15:07'),(7263,268,2,9531,'3.99','2005-07-31 01:11:53','2006-02-15 22:15:07'),(7264,268,1,10040,'1.99','2005-07-31 18:54:15','2006-02-15 22:15:07'),(7265,268,2,11462,'7.99','2005-08-02 21:36:46','2006-02-15 22:15:07'),(7266,268,2,11828,'6.99','2005-08-17 12:48:28','2006-02-15 22:15:07'),(7267,268,2,12007,'2.99','2005-08-17 19:10:34','2006-02-15 22:15:07'),(7268,268,2,12694,'4.99','2005-08-18 20:10:39','2006-02-15 22:15:07'),(7269,268,2,13880,'5.99','2005-08-20 15:18:20','2006-02-15 22:15:07'),(7270,268,2,14249,'4.99','2005-08-21 05:38:05','2006-02-15 22:15:07'),(7271,268,2,14373,'4.99','2005-08-21 09:44:53','2006-02-15 22:15:08'),(7272,268,1,14874,'0.99','2005-08-22 03:32:05','2006-02-15 22:15:08'),(7273,268,2,15183,'2.99','2005-08-22 15:49:54','2006-02-15 22:15:08'),(7274,269,2,7,'1.99','2005-05-24 23:11:53','2006-02-15 22:15:08'),(7275,269,1,98,'0.99','2005-05-25 16:48:24','2006-02-15 22:15:08'),(7276,269,2,678,'6.99','2005-05-28 23:15:48','2006-02-15 22:15:08'),(7277,269,2,703,'0.99','2005-05-29 02:29:36','2006-02-15 22:15:08'),(7278,269,1,750,'4.99','2005-05-29 09:41:40','2006-02-15 22:15:08'),(7279,269,2,1099,'2.99','2005-05-31 13:54:48','2006-02-15 22:15:08'),(7280,269,1,1334,'3.99','2005-06-15 11:43:09','2006-02-15 22:15:08'),(7281,269,2,1909,'2.99','2005-06-17 05:11:04','2006-02-15 22:15:08'),(7282,269,2,2493,'6.99','2005-06-18 22:12:09','2006-02-15 22:15:08'),(7283,269,1,4125,'9.99','2005-07-07 07:20:29','2006-02-15 22:15:08'),(7284,269,2,4804,'0.99','2005-07-08 16:57:30','2006-02-15 22:15:08'),(7285,269,2,4880,'6.99','2005-07-08 19:36:17','2006-02-15 22:15:08'),(7286,269,1,6440,'2.99','2005-07-12 00:25:04','2006-02-15 22:15:08'),(7287,269,1,6626,'5.99','2005-07-12 09:16:24','2006-02-15 22:15:08'),(7288,269,2,6804,'4.99','2005-07-12 17:22:06','2006-02-15 22:15:08'),(7289,269,1,7032,'4.99','2005-07-27 03:03:09','2006-02-15 22:15:08'),(7290,269,1,7537,'6.99','2005-07-27 21:36:09','2006-02-15 22:15:08'),(7291,269,1,7972,'2.99','2005-07-28 14:07:46','2006-02-15 22:15:08'),(7292,269,2,10566,'2.99','2005-08-01 13:12:11','2006-02-15 22:15:08'),(7293,269,1,10908,'4.99','2005-08-02 01:53:06','2006-02-15 22:15:08'),(7294,269,1,11014,'4.99','2005-08-02 05:12:22','2006-02-15 22:15:08'),(7295,269,1,11915,'3.99','2005-08-17 16:05:28','2006-02-15 22:15:08'),(7296,269,1,12344,'4.99','2005-08-18 07:15:19','2006-02-15 22:15:09'),(7297,269,2,13142,'5.99','2005-08-19 12:42:28','2006-02-15 22:15:09'),(7298,269,2,13759,'2.99','2005-08-20 11:24:48','2006-02-15 22:15:09'),(7299,269,1,14266,'4.99','2005-08-21 06:20:51','2006-02-15 22:15:09'),(7300,269,2,14693,'6.99','2005-08-21 20:44:19','2006-02-15 22:15:09'),(7301,269,2,15788,'2.99','2005-08-23 13:54:39','2006-02-15 22:15:09'),(7302,269,1,13025,'3.98','2006-02-14 15:16:03','2006-02-15 22:15:09'),(7303,269,2,12610,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:09'),(7304,270,1,193,'1.99','2005-05-26 06:41:48','2006-02-15 22:15:09'),(7305,270,1,1040,'4.99','2005-05-31 05:35:16','2006-02-15 22:15:09'),(7306,270,1,1345,'4.99','2005-06-15 12:32:13','2006-02-15 22:15:09'),(7307,270,1,1896,'6.99','2005-06-17 04:25:46','2006-02-15 22:15:09'),(7308,270,1,2115,'3.99','2005-06-17 20:02:16','2006-02-15 22:15:09'),(7309,270,2,3164,'5.99','2005-06-20 21:29:00','2006-02-15 22:15:09'),(7310,270,1,3501,'3.99','2005-07-06 00:11:28','2006-02-15 22:15:09'),(7311,270,1,3987,'9.99','2005-07-06 23:28:24','2006-02-15 22:15:09'),(7312,270,2,5533,'0.99','2005-07-10 02:19:28','2006-02-15 22:15:09'),(7313,270,2,6520,'4.99','2005-07-12 04:05:16','2006-02-15 22:15:09'),(7314,270,1,8355,'2.99','2005-07-29 04:57:43','2006-02-15 22:15:09'),(7315,270,2,8618,'3.99','2005-07-29 13:48:20','2006-02-15 22:15:09'),(7316,270,1,10069,'3.99','2005-07-31 19:43:18','2006-02-15 22:15:09'),(7317,270,1,10461,'7.99','2005-08-01 09:32:53','2006-02-15 22:15:09'),(7318,270,2,10579,'5.99','2005-08-01 13:48:22','2006-02-15 22:15:09'),(7319,270,2,10648,'4.99','2005-08-01 16:08:52','2006-02-15 22:15:09'),(7320,270,1,11389,'2.99','2005-08-02 18:39:12','2006-02-15 22:15:09'),(7321,270,1,11810,'0.99','2005-08-17 11:56:48','2006-02-15 22:15:09'),(7322,270,2,11841,'2.99','2005-08-17 13:12:20','2006-02-15 22:15:09'),(7323,270,1,11917,'2.99','2005-08-17 16:08:17','2006-02-15 22:15:09'),(7324,270,1,12192,'2.99','2005-08-18 02:01:40','2006-02-15 22:15:10'),(7325,270,1,12442,'2.99','2005-08-18 10:50:07','2006-02-15 22:15:10'),(7326,270,2,13945,'1.99','2005-08-20 17:43:56','2006-02-15 22:15:10'),(7327,270,1,14618,'0.99','2005-08-21 18:09:51','2006-02-15 22:15:10'),(7328,270,2,15620,'6.99','2005-08-23 07:10:22','2006-02-15 22:15:10'),(7329,271,1,1096,'8.99','2005-05-31 13:30:49','2006-02-15 22:15:10'),(7330,271,2,1852,'2.99','2005-06-17 00:38:20','2006-02-15 22:15:10'),(7331,271,1,3640,'1.99','2005-07-06 07:12:26','2006-02-15 22:15:10'),(7332,271,2,4545,'2.99','2005-07-08 04:17:47','2006-02-15 22:15:10'),(7333,271,2,5878,'1.99','2005-07-10 19:09:57','2006-02-15 22:15:10'),(7334,271,1,5922,'2.99','2005-07-10 21:36:53','2006-02-15 22:15:10'),(7335,271,1,6024,'2.99','2005-07-11 02:16:47','2006-02-15 22:15:10'),(7336,271,1,7618,'3.99','2005-07-28 00:24:14','2006-02-15 22:15:10'),(7337,271,1,8592,'0.99','2005-07-29 12:33:58','2006-02-15 22:15:10'),(7338,271,1,9821,'4.99','2005-07-31 11:47:54','2006-02-15 22:15:10'),(7339,271,2,10143,'7.99','2005-07-31 22:11:43','2006-02-15 22:15:10'),(7340,271,2,10310,'4.99','2005-08-01 04:24:47','2006-02-15 22:15:10'),(7341,271,1,10599,'3.99','2005-08-01 14:23:58','2006-02-15 22:15:10'),(7342,271,1,11431,'2.99','2005-08-02 20:05:16','2006-02-15 22:15:10'),(7343,271,1,12219,'4.99','2005-08-18 02:49:54','2006-02-15 22:15:10'),(7344,271,2,14234,'0.99','2005-08-21 05:07:12','2006-02-15 22:15:10'),(7345,271,2,14355,'4.99','2005-08-21 09:08:29','2006-02-15 22:15:10'),(7346,271,1,15244,'2.99','2005-08-22 17:48:42','2006-02-15 22:15:10'),(7347,272,1,33,'0.99','2005-05-25 04:18:51','2006-02-15 22:15:10'),(7348,272,1,405,'6.99','2005-05-27 13:32:39','2006-02-15 22:15:10'),(7349,272,1,1041,'6.99','2005-05-31 05:46:23','2006-02-15 22:15:10'),(7350,272,1,1072,'0.99','2005-05-31 09:52:50','2006-02-15 22:15:10'),(7351,272,2,1604,'4.99','2005-06-16 06:14:25','2006-02-15 22:15:10'),(7352,272,2,2546,'5.99','2005-06-19 02:39:39','2006-02-15 22:15:11'),(7353,272,1,3323,'5.99','2005-06-21 08:45:33','2006-02-15 22:15:11'),(7354,272,2,5047,'3.99','2005-07-09 03:44:15','2006-02-15 22:15:11'),(7355,272,2,5158,'2.99','2005-07-09 08:53:09','2006-02-15 22:15:11'),(7356,272,2,7300,'7.99','2005-07-27 12:50:17','2006-02-15 22:15:11'),(7357,272,2,7658,'2.99','2005-07-28 02:09:12','2006-02-15 22:15:11'),(7358,272,1,8248,'7.99','2005-07-29 00:41:56','2006-02-15 22:15:11'),(7359,272,2,9787,'10.99','2005-07-31 10:26:19','2006-02-15 22:15:11'),(7360,272,1,10736,'2.99','2005-08-01 19:30:21','2006-02-15 22:15:11'),(7361,272,2,11003,'2.99','2005-08-02 05:03:05','2006-02-15 22:15:11'),(7362,272,2,11597,'8.99','2005-08-17 03:02:56','2006-02-15 22:15:11'),(7363,272,1,11881,'0.99','2005-08-17 14:31:56','2006-02-15 22:15:11'),(7364,272,2,12006,'6.99','2005-08-17 19:09:12','2006-02-15 22:15:11'),(7365,272,2,13274,'2.99','2005-08-19 17:50:03','2006-02-15 22:15:11'),(7366,272,1,13903,'2.99','2005-08-20 16:07:55','2006-02-15 22:15:11'),(7367,273,2,122,'3.99','2005-05-25 19:46:21','2006-02-15 22:15:11'),(7368,273,2,980,'0.99','2005-05-30 21:45:19','2006-02-15 22:15:11'),(7369,273,2,1391,'6.99','2005-06-15 16:11:21','2006-02-15 22:15:11'),(7370,273,2,1747,'6.99','2005-06-16 16:53:33','2006-02-15 22:15:11'),(7371,273,2,1765,'4.99','2005-06-16 17:56:10','2006-02-15 22:15:11'),(7372,273,1,2301,'1.99','2005-06-18 08:24:03','2006-02-15 22:15:11'),(7373,273,1,3202,'0.99','2005-06-21 00:33:47','2006-02-15 22:15:11'),(7374,273,2,3556,'2.99','2005-07-06 02:46:13','2006-02-15 22:15:11'),(7375,273,1,4937,'5.99','2005-07-08 22:29:59','2006-02-15 22:15:11'),(7376,273,1,5256,'7.99','2005-07-09 13:55:45','2006-02-15 22:15:12'),(7377,273,2,5435,'7.99','2005-07-09 21:28:07','2006-02-15 22:15:12'),(7378,273,1,5605,'2.99','2005-07-10 05:06:45','2006-02-15 22:15:12'),(7379,273,1,6592,'8.99','2005-07-12 07:19:35','2006-02-15 22:15:12'),(7380,273,1,6635,'1.99','2005-07-12 09:47:58','2006-02-15 22:15:12'),(7381,273,2,6696,'2.99','2005-07-12 12:44:04','2006-02-15 22:15:12'),(7382,273,1,6717,'5.99','2005-07-12 13:35:02','2006-02-15 22:15:12'),(7383,273,1,8449,'2.99','2005-07-29 07:42:25','2006-02-15 22:15:12'),(7384,273,1,9186,'4.99','2005-07-30 12:13:48','2006-02-15 22:15:12'),(7385,273,2,9285,'5.99','2005-07-30 15:26:08','2006-02-15 22:15:12'),(7386,273,2,9391,'0.99','2005-07-30 19:48:41','2006-02-15 22:15:12'),(7387,273,2,9693,'3.99','2005-07-31 07:11:50','2006-02-15 22:15:12'),(7388,273,2,9729,'0.99','2005-07-31 08:43:43','2006-02-15 22:15:12'),(7389,273,1,10272,'8.99','2005-08-01 03:14:34','2006-02-15 22:15:12'),(7390,273,1,10753,'3.99','2005-08-01 20:09:24','2006-02-15 22:15:12'),(7391,273,1,10768,'6.99','2005-08-01 20:39:32','2006-02-15 22:15:12'),(7392,273,1,11282,'4.99','2005-08-02 14:35:03','2006-02-15 22:15:12'),(7393,273,2,11509,'4.99','2005-08-16 23:29:53','2006-02-15 22:15:12'),(7394,273,1,12692,'0.99','2005-08-18 20:09:19','2006-02-15 22:15:12'),(7395,273,2,13738,'4.99','2005-08-20 10:42:42','2006-02-15 22:15:12'),(7396,273,1,13955,'5.99','2005-08-20 18:05:12','2006-02-15 22:15:12'),(7397,273,2,14092,'4.99','2005-08-21 00:14:32','2006-02-15 22:15:12'),(7398,273,2,14558,'2.99','2005-08-21 16:10:50','2006-02-15 22:15:12'),(7399,273,2,14911,'2.99','2005-08-22 04:51:42','2006-02-15 22:15:12'),(7400,273,2,15372,'2.99','2005-08-22 21:59:51','2006-02-15 22:15:12'),(7401,273,1,15760,'6.99','2005-08-23 12:50:00','2006-02-15 22:15:12'),(7402,274,1,147,'2.99','2005-05-26 00:17:50','2006-02-15 22:15:12'),(7403,274,1,208,'4.99','2005-05-26 08:10:22','2006-02-15 22:15:13'),(7404,274,2,301,'2.99','2005-05-26 21:06:14','2006-02-15 22:15:13'),(7405,274,1,394,'5.99','2005-05-27 11:26:11','2006-02-15 22:15:13'),(7406,274,2,474,'2.99','2005-05-27 22:11:56','2006-02-15 22:15:13'),(7407,274,1,892,'4.99','2005-05-30 08:02:56','2006-02-15 22:15:13'),(7408,274,1,2098,'0.99','2005-06-17 18:42:09','2006-02-15 22:15:13'),(7409,274,2,3291,'9.99','2005-06-21 06:55:36','2006-02-15 22:15:13'),(7410,274,2,3532,'5.99','2005-07-06 01:24:38','2006-02-15 22:15:13'),(7411,274,1,4147,'2.99','2005-07-07 08:32:12','2006-02-15 22:15:13'),(7412,274,2,4582,'2.99','2005-07-08 06:09:09','2006-02-15 22:15:13'),(7413,274,2,6389,'3.99','2005-07-11 22:18:20','2006-02-15 22:15:13'),(7414,274,2,8259,'0.99','2005-07-29 01:05:16','2006-02-15 22:15:13'),(7415,274,2,8406,'5.99','2005-07-29 06:34:45','2006-02-15 22:15:13'),(7416,274,2,8517,'7.99','2005-07-29 10:00:48','2006-02-15 22:15:13'),(7417,274,1,9331,'4.99','2005-07-30 17:46:50','2006-02-15 22:15:13'),(7418,274,1,9677,'4.99','2005-07-31 06:39:45','2006-02-15 22:15:13'),(7419,274,2,10059,'4.99','2005-07-31 19:20:49','2006-02-15 22:15:13'),(7420,274,1,10790,'1.99','2005-08-01 21:38:37','2006-02-15 22:15:13'),(7421,274,2,10855,'0.99','2005-08-02 00:06:37','2006-02-15 22:15:13'),(7422,274,1,11058,'3.99','2005-08-02 06:38:44','2006-02-15 22:15:13'),(7423,274,2,11363,'2.99','2005-08-02 17:48:39','2006-02-15 22:15:13'),(7424,274,1,12321,'3.99','2005-08-18 06:27:05','2006-02-15 22:15:13'),(7425,274,1,13103,'2.99','2005-08-19 11:05:51','2006-02-15 22:15:13'),(7426,274,2,13129,'8.99','2005-08-19 12:05:04','2006-02-15 22:15:13'),(7427,274,1,13549,'8.99','2005-08-20 03:58:41','2006-02-15 22:15:13'),(7428,274,1,14012,'0.99','2005-08-20 20:42:12','2006-02-15 22:15:13'),(7429,274,1,14066,'7.99','2005-08-20 22:45:58','2006-02-15 22:15:13'),(7430,274,2,14164,'7.99','2005-08-21 02:58:02','2006-02-15 22:15:14'),(7431,274,1,14388,'4.99','2005-08-21 10:15:13','2006-02-15 22:15:14'),(7432,274,2,15143,'2.99','2005-08-22 13:46:24','2006-02-15 22:15:14'),(7433,274,1,15260,'2.99','2005-08-22 18:24:16','2006-02-15 22:15:14'),(7434,274,2,15328,'2.99','2005-08-22 20:31:38','2006-02-15 22:15:14'),(7435,274,2,15819,'3.99','2005-08-23 15:01:54','2006-02-15 22:15:14'),(7436,274,1,13486,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:14'),(7437,275,2,336,'2.99','2005-05-27 03:15:23','2006-02-15 22:15:14'),(7438,275,2,1797,'3.99','2005-06-16 20:13:03','2006-02-15 22:15:14'),(7439,275,2,2414,'0.99','2005-06-18 17:01:55','2006-02-15 22:15:14'),(7440,275,1,2646,'4.99','2005-06-19 09:56:01','2006-02-15 22:15:14'),(7441,275,1,3355,'2.99','2005-06-21 11:30:47','2006-02-15 22:15:14'),(7442,275,2,4396,'0.99','2005-07-07 21:14:19','2006-02-15 22:15:14'),(7443,275,1,4634,'0.99','2005-07-08 08:40:02','2006-02-15 22:15:14'),(7444,275,2,4912,'9.99','2005-07-08 21:26:11','2006-02-15 22:15:14'),(7445,275,2,6301,'5.99','2005-07-11 17:54:09','2006-02-15 22:15:14'),(7446,275,2,6856,'0.99','2005-07-12 19:50:16','2006-02-15 22:15:14'),(7447,275,1,7553,'2.99','2005-07-27 22:11:36','2006-02-15 22:15:14'),(7448,275,2,7596,'4.99','2005-07-27 23:33:57','2006-02-15 22:15:14'),(7449,275,1,8746,'2.99','2005-07-29 19:03:15','2006-02-15 22:15:15'),(7450,275,2,9258,'2.99','2005-07-30 14:31:31','2006-02-15 22:15:15'),(7451,275,1,10479,'6.99','2005-08-01 10:11:25','2006-02-15 22:15:15'),(7452,275,2,11309,'1.99','2005-08-02 15:50:55','2006-02-15 22:15:15'),(7453,275,1,11610,'4.99','2005-08-17 03:43:37','2006-02-15 22:15:15'),(7454,275,2,12589,'5.99','2005-08-18 16:06:31','2006-02-15 22:15:15'),(7455,275,1,12606,'1.99','2005-08-18 17:02:21','2006-02-15 22:15:15'),(7456,275,1,13037,'3.99','2005-08-19 08:53:57','2006-02-15 22:15:15'),(7457,275,2,13860,'2.99','2005-08-20 14:55:09','2006-02-15 22:15:15'),(7458,275,2,13865,'1.99','2005-08-20 15:04:09','2006-02-15 22:15:15'),(7459,275,2,13902,'0.99','2005-08-20 16:07:08','2006-02-15 22:15:15'),(7460,275,2,14063,'0.99','2005-08-20 22:36:40','2006-02-15 22:15:15'),(7461,275,1,14187,'5.99','2005-08-21 03:32:03','2006-02-15 22:15:15'),(7462,275,1,14296,'2.99','2005-08-21 07:13:23','2006-02-15 22:15:15'),(7463,275,2,14483,'5.99','2005-08-21 13:43:59','2006-02-15 22:15:15'),(7464,275,2,14727,'4.99','2005-08-21 22:12:45','2006-02-15 22:15:15'),(7465,275,2,15269,'2.99','2005-08-22 18:39:44','2006-02-15 22:15:15'),(7466,275,2,15496,'3.99','2005-08-23 02:30:23','2006-02-15 22:15:15'),(7467,276,1,736,'3.99','2005-05-29 08:10:07','2006-02-15 22:15:15'),(7468,276,1,860,'10.99','2005-05-30 02:45:16','2006-02-15 22:15:15'),(7469,276,1,1352,'0.99','2005-06-15 12:58:27','2006-02-15 22:15:15'),(7470,276,2,2763,'4.99','2005-06-19 17:23:34','2006-02-15 22:15:16'),(7471,276,2,3064,'6.99','2005-06-20 13:53:13','2006-02-15 22:15:16'),(7472,276,2,3714,'2.99','2005-07-06 10:51:28','2006-02-15 22:15:16'),(7473,276,1,4715,'0.99','2005-07-08 12:15:37','2006-02-15 22:15:16'),(7474,276,2,5186,'4.99','2005-07-09 10:18:40','2006-02-15 22:15:16'),(7475,276,2,5246,'4.99','2005-07-09 13:25:18','2006-02-15 22:15:16'),(7476,276,2,7282,'5.99','2005-07-27 12:00:19','2006-02-15 22:15:16'),(7477,276,2,7842,'2.99','2005-07-28 09:10:06','2006-02-15 22:15:16'),(7478,276,1,9070,'0.99','2005-07-30 07:40:39','2006-02-15 22:15:16'),(7479,276,1,9080,'1.99','2005-07-30 08:02:39','2006-02-15 22:15:16'),(7480,276,1,9102,'4.99','2005-07-30 08:48:20','2006-02-15 22:15:16'),(7481,276,1,9229,'8.99','2005-07-30 13:38:17','2006-02-15 22:15:16'),(7482,276,2,10149,'5.99','2005-07-31 22:20:46','2006-02-15 22:15:16'),(7483,276,2,10691,'0.99','2005-08-01 18:09:53','2006-02-15 22:15:16'),(7484,276,1,10763,'2.99','2005-08-01 20:32:27','2006-02-15 22:15:16'),(7485,276,2,11085,'2.99','2005-08-02 07:36:44','2006-02-15 22:15:16'),(7486,276,1,11636,'4.99','2005-08-17 04:36:31','2006-02-15 22:15:16'),(7487,276,2,11961,'3.99','2005-08-17 17:28:01','2006-02-15 22:15:16'),(7488,276,2,12178,'5.99','2005-08-18 01:17:32','2006-02-15 22:15:16'),(7489,276,2,12251,'4.99','2005-08-18 03:59:02','2006-02-15 22:15:16'),(7490,276,1,12650,'4.99','2005-08-18 18:33:20','2006-02-15 22:15:16'),(7491,276,1,14000,'4.99','2005-08-20 20:06:05','2006-02-15 22:15:16'),(7492,276,2,15718,'2.99','2005-08-23 11:05:17','2006-02-15 22:15:16'),(7493,276,1,15769,'3.99','2005-08-23 13:16:15','2006-02-15 22:15:16'),(7494,276,2,15923,'4.99','2005-08-23 18:08:19','2006-02-15 22:15:17'),(7495,277,2,308,'6.99','2005-05-26 22:01:39','2006-02-15 22:15:17'),(7496,277,1,1331,'2.99','2005-06-15 11:34:33','2006-02-15 22:15:17'),(7497,277,2,1717,'2.99','2005-06-16 14:47:16','2006-02-15 22:15:17'),(7498,277,2,2162,'3.99','2005-06-17 23:45:47','2006-02-15 22:15:17'),(7499,277,2,2723,'4.99','2005-06-19 14:55:23','2006-02-15 22:15:17'),(7500,277,1,3247,'5.99','2005-06-21 03:12:15','2006-02-15 22:15:17'),(7501,277,2,3274,'4.99','2005-06-21 05:30:36','2006-02-15 22:15:17'),(7502,277,1,3344,'2.99','2005-06-21 10:57:27','2006-02-15 22:15:17'),(7503,277,2,3740,'5.99','2005-07-06 11:55:35','2006-02-15 22:15:17'),(7504,277,2,3897,'2.99','2005-07-06 19:11:43','2006-02-15 22:15:17'),(7505,277,1,4290,'4.99','2005-07-07 15:47:10','2006-02-15 22:15:17'),(7506,277,2,4987,'5.99','2005-07-09 00:45:41','2006-02-15 22:15:17'),(7507,277,1,5861,'0.99','2005-07-10 18:14:22','2006-02-15 22:15:17'),(7508,277,1,5913,'2.99','2005-07-10 20:58:55','2006-02-15 22:15:17'),(7509,277,2,6455,'2.99','2005-07-12 01:01:58','2006-02-15 22:15:17'),(7510,277,1,6487,'5.99','2005-07-12 02:17:00','2006-02-15 22:15:17'),(7511,277,2,7423,'4.99','2005-07-27 17:11:47','2006-02-15 22:15:17'),(7512,277,2,8410,'2.99','2005-07-29 06:41:36','2006-02-15 22:15:17'),(7513,277,2,9669,'4.99','2005-07-31 06:31:36','2006-02-15 22:15:17'),(7514,277,1,9901,'0.99','2005-07-31 14:20:59','2006-02-15 22:15:17'),(7515,277,2,11074,'3.99','2005-08-02 07:21:43','2006-02-15 22:15:17'),(7516,277,2,11162,'4.99','2005-08-02 10:07:54','2006-02-15 22:15:17'),(7517,277,2,11574,'0.99','2005-08-17 01:38:19','2006-02-15 22:15:17'),(7518,277,2,12149,'3.99','2005-08-18 00:13:51','2006-02-15 22:15:17'),(7519,277,1,12458,'5.99','2005-08-18 11:22:53','2006-02-15 22:15:17'),(7520,277,1,13122,'4.99','2005-08-19 11:53:49','2006-02-15 22:15:17'),(7521,277,2,13526,'4.99','2005-08-20 02:58:42','2006-02-15 22:15:18'),(7522,277,1,13714,'4.99','2005-08-20 09:41:09','2006-02-15 22:15:18'),(7523,277,2,14227,'4.99','2005-08-21 04:56:31','2006-02-15 22:15:18'),(7524,277,2,14745,'4.99','2005-08-21 22:53:01','2006-02-15 22:15:18'),(7525,277,1,15008,'10.99','2005-08-22 08:24:32','2006-02-15 22:15:18'),(7526,277,1,15345,'5.99','2005-08-22 21:05:50','2006-02-15 22:15:18'),(7527,278,1,1092,'4.99','2005-05-31 12:15:57','2006-02-15 22:15:18'),(7528,278,2,1387,'0.99','2005-06-15 15:40:56','2006-02-15 22:15:18'),(7529,278,1,1978,'2.99','2005-06-17 09:42:34','2006-02-15 22:15:18'),(7530,278,2,2078,'4.99','2005-06-17 16:48:55','2006-02-15 22:15:18'),(7531,278,1,3453,'2.99','2005-06-21 21:12:11','2006-02-15 22:15:18'),(7532,278,1,3776,'2.99','2005-07-06 13:31:37','2006-02-15 22:15:18'),(7533,278,1,4430,'4.99','2005-07-07 22:35:24','2006-02-15 22:15:18'),(7534,278,2,4866,'8.99','2005-07-08 19:09:59','2006-02-15 22:15:18'),(7535,278,2,6869,'4.99','2005-07-12 20:12:06','2006-02-15 22:15:18'),(7536,278,1,7239,'0.99','2005-07-27 10:20:27','2006-02-15 22:15:18'),(7537,278,2,7834,'0.99','2005-07-28 08:46:43','2006-02-15 22:15:18'),(7538,278,2,8222,'5.99','2005-07-28 23:51:53','2006-02-15 22:15:18'),(7539,278,1,8953,'4.99','2005-07-30 03:21:05','2006-02-15 22:15:18'),(7540,278,2,9448,'2.99','2005-07-30 21:56:13','2006-02-15 22:15:18'),(7541,278,1,10649,'2.99','2005-08-01 16:11:40','2006-02-15 22:15:18'),(7542,278,1,10731,'2.99','2005-08-01 19:21:48','2006-02-15 22:15:18'),(7543,278,2,10849,'3.99','2005-08-01 23:51:00','2006-02-15 22:15:18'),(7544,278,1,11095,'5.99','2005-08-02 08:03:20','2006-02-15 22:15:18'),(7545,278,2,11531,'0.99','2005-08-17 00:30:04','2006-02-15 22:15:18'),(7546,278,1,12787,'0.99','2005-08-19 00:07:58','2006-02-15 22:15:18'),(7547,278,1,13896,'0.99','2005-08-20 15:59:56','2006-02-15 22:15:18'),(7548,278,2,13976,'0.99','2005-08-20 19:02:16','2006-02-15 22:15:19'),(7549,278,1,14268,'2.99','2005-08-21 06:21:24','2006-02-15 22:15:19'),(7550,278,2,14803,'0.99','2005-08-22 00:49:10','2006-02-15 22:15:19'),(7551,278,1,14986,'4.99','2005-08-22 07:37:24','2006-02-15 22:15:19'),(7552,278,1,16019,'4.99','2005-08-23 21:30:45','2006-02-15 22:15:19'),(7553,279,1,979,'2.99','2005-05-30 21:37:11','2006-02-15 22:15:19'),(7554,279,2,1019,'0.99','2005-05-31 03:05:07','2006-02-15 22:15:19'),(7555,279,1,1178,'2.99','2005-06-15 00:36:40','2006-02-15 22:15:19'),(7556,279,1,2147,'4.99','2005-06-17 22:28:13','2006-02-15 22:15:19'),(7557,279,1,3215,'0.99','2005-06-21 01:11:32','2006-02-15 22:15:19'),(7558,279,1,3374,'2.99','2005-06-21 13:36:30','2006-02-15 22:15:19'),(7559,279,1,3375,'4.99','2005-06-21 13:37:18','2006-02-15 22:15:19'),(7560,279,1,4476,'4.99','2005-07-08 00:34:25','2006-02-15 22:15:19'),(7561,279,1,4978,'7.99','2005-07-09 00:22:02','2006-02-15 22:15:19'),(7562,279,2,5248,'2.99','2005-07-09 13:29:44','2006-02-15 22:15:19'),(7563,279,1,5361,'9.99','2005-07-09 18:15:32','2006-02-15 22:15:19'),(7564,279,1,6176,'0.99','2005-07-11 10:48:21','2006-02-15 22:15:19'),(7565,279,1,7947,'2.99','2005-07-28 13:05:50','2006-02-15 22:15:19'),(7566,279,2,8559,'3.99','2005-07-29 11:25:54','2006-02-15 22:15:19'),(7567,279,2,9820,'5.99','2005-07-31 11:46:57','2006-02-15 22:15:19'),(7568,279,2,10177,'2.99','2005-07-31 23:42:33','2006-02-15 22:15:19'),(7569,279,2,11250,'6.99','2005-08-02 13:35:42','2006-02-15 22:15:19'),(7570,279,1,11515,'2.99','2005-08-16 23:54:34','2006-02-15 22:15:19'),(7571,279,1,11703,'4.99','2005-08-17 07:19:29','2006-02-15 22:15:19'),(7572,279,2,12935,'2.99','2005-08-19 05:20:25','2006-02-15 22:15:19'),(7573,279,1,12949,'4.99','2005-08-19 05:55:52','2006-02-15 22:15:19'),(7574,279,1,13105,'7.99','2005-08-19 11:06:16','2006-02-15 22:15:20'),(7575,279,1,13233,'2.99','2005-08-19 16:14:41','2006-02-15 22:15:20'),(7576,279,2,13588,'4.99','2005-08-20 05:47:11','2006-02-15 22:15:20'),(7577,279,2,14206,'2.99','2005-08-21 03:59:26','2006-02-15 22:15:20'),(7578,279,1,14714,'3.99','2005-08-21 21:27:43','2006-02-15 22:15:20'),(7579,279,1,14779,'5.99','2005-08-22 00:00:56','2006-02-15 22:15:20'),(7580,279,1,14789,'4.99','2005-08-22 00:29:39','2006-02-15 22:15:20'),(7581,279,2,15580,'6.99','2005-08-23 05:39:06','2006-02-15 22:15:20'),(7582,279,1,15606,'2.99','2005-08-23 06:50:27','2006-02-15 22:15:20'),(7583,279,2,13538,'4.99','2006-02-14 15:16:03','2006-02-15 22:15:20'),(7584,280,1,1014,'4.99','2005-05-31 02:39:16','2006-02-15 22:15:20'),(7585,280,1,2656,'3.99','2005-06-19 10:42:33','2006-02-15 22:15:20'),(7586,280,2,3009,'4.99','2005-06-20 10:24:44','2006-02-15 22:15:20'),(7587,280,2,3097,'0.99','2005-06-20 16:26:14','2006-02-15 22:15:20'),(7588,280,1,4616,'4.99','2005-07-08 07:48:12','2006-02-15 22:15:20'),(7589,280,2,6851,'0.99','2005-07-12 19:32:14','2006-02-15 22:15:20'),(7590,280,1,7070,'4.99','2005-07-27 04:01:08','2006-02-15 22:15:20'),(7591,280,2,7901,'0.99','2005-07-28 11:12:12','2006-02-15 22:15:20'),(7592,280,2,8319,'0.99','2005-07-29 03:44:52','2006-02-15 22:15:20'),(7593,280,1,8365,'0.99','2005-07-29 05:11:00','2006-02-15 22:15:20'),(7594,280,1,8565,'7.99','2005-07-29 11:35:23','2006-02-15 22:15:20'),(7595,280,2,8695,'6.99','2005-07-29 16:44:55','2006-02-15 22:15:21'),(7596,280,2,8744,'3.99','2005-07-29 18:58:24','2006-02-15 22:15:21'),(7597,280,1,8912,'0.99','2005-07-30 01:31:25','2006-02-15 22:15:21'),(7598,280,2,9103,'0.99','2005-07-30 08:49:26','2006-02-15 22:15:21'),(7599,280,1,10847,'9.99','2005-08-01 23:49:33','2006-02-15 22:15:21'),(7600,280,1,11366,'4.99','2005-08-02 18:01:25','2006-02-15 22:15:21'),(7601,280,1,11517,'2.99','2005-08-16 23:56:28','2006-02-15 22:15:21'),(7602,280,1,12053,'4.99','2005-08-17 20:57:27','2006-02-15 22:15:21'),(7603,280,1,12849,'5.99','2005-08-19 02:05:37','2006-02-15 22:15:21'),(7604,280,2,13231,'9.99','2005-08-19 16:12:49','2006-02-15 22:15:21'),(7605,280,1,13321,'4.99','2005-08-19 19:40:37','2006-02-15 22:15:21'),(7606,280,1,13667,'4.99','2005-08-20 08:25:34','2006-02-15 22:15:21'),(7607,280,2,15036,'2.99','2005-08-22 09:36:00','2006-02-15 22:15:21'),(7608,280,1,15312,'4.99','2005-08-22 19:58:15','2006-02-15 22:15:21'),(7609,280,2,15554,'5.99','2005-08-23 04:48:12','2006-02-15 22:15:21'),(7610,280,2,15950,'5.99','2005-08-23 19:09:39','2006-02-15 22:15:22'),(7611,281,2,650,'2.99','2005-05-28 19:45:40','2006-02-15 22:15:22'),(7612,281,2,754,'2.99','2005-05-29 10:18:59','2006-02-15 22:15:22'),(7613,281,2,1485,'5.99','2005-06-15 21:24:10','2006-02-15 22:15:22'),(7614,281,1,2254,'5.99','2005-06-18 05:15:14','2006-02-15 22:15:22'),(7615,281,1,4607,'0.99','2005-07-08 07:15:14','2006-02-15 22:15:22'),(7616,281,2,4864,'6.99','2005-07-08 19:05:34','2006-02-15 22:15:22'),(7617,281,2,5410,'5.99','2005-07-09 20:21:10','2006-02-15 22:15:22'),(7618,281,2,6825,'0.99','2005-07-12 18:28:12','2006-02-15 22:15:22'),(7619,281,2,7034,'2.99','2005-07-27 03:03:37','2006-02-15 22:15:22'),(7620,281,1,7525,'3.99','2005-07-27 21:13:28','2006-02-15 22:15:22'),(7621,281,2,8131,'0.99','2005-07-28 19:55:21','2006-02-15 22:15:22'),(7622,281,2,8180,'4.99','2005-07-28 22:05:24','2006-02-15 22:15:22'),(7623,281,1,13641,'2.99','2005-08-20 07:34:42','2006-02-15 22:15:22'),(7624,281,1,14196,'1.99','2005-08-21 03:40:40','2006-02-15 22:15:22'),(7625,282,2,48,'1.99','2005-05-25 06:20:46','2006-02-15 22:15:22'),(7626,282,2,282,'6.99','2005-05-26 18:56:26','2006-02-15 22:15:22'),(7627,282,2,564,'0.99','2005-05-28 09:12:09','2006-02-15 22:15:22'),(7628,282,1,2016,'2.99','2005-06-17 12:18:36','2006-02-15 22:15:22'),(7629,282,2,2176,'2.99','2005-06-18 00:29:51','2006-02-15 22:15:22'),(7630,282,2,3408,'4.99','2005-06-21 16:15:11','2006-02-15 22:15:22'),(7631,282,1,3417,'2.99','2005-06-21 17:06:20','2006-02-15 22:15:22'),(7632,282,2,3675,'2.99','2005-07-06 09:09:19','2006-02-15 22:15:22'),(7633,282,1,3885,'2.99','2005-07-06 18:43:43','2006-02-15 22:15:22'),(7634,282,1,4359,'2.99','2005-07-07 19:30:20','2006-02-15 22:15:22'),(7635,282,2,4412,'4.99','2005-07-07 21:56:53','2006-02-15 22:15:22'),(7636,282,1,5113,'0.99','2005-07-09 07:06:18','2006-02-15 22:15:23'),(7637,282,2,5319,'8.99','2005-07-09 16:17:44','2006-02-15 22:15:23'),(7638,282,1,5926,'6.99','2005-07-10 21:53:42','2006-02-15 22:15:23'),(7639,282,1,7433,'2.99','2005-07-27 17:32:20','2006-02-15 22:15:23'),(7640,282,2,7534,'3.99','2005-07-27 21:26:17','2006-02-15 22:15:23'),(7641,282,1,8223,'6.99','2005-07-28 23:56:01','2006-02-15 22:15:23'),(7642,282,2,8270,'4.99','2005-07-29 01:27:22','2006-02-15 22:15:23'),(7643,282,2,8468,'1.99','2005-07-29 08:26:04','2006-02-15 22:15:23'),(7644,282,2,8743,'0.99','2005-07-29 18:57:01','2006-02-15 22:15:23'),(7645,282,2,8973,'1.99','2005-07-30 04:09:13','2006-02-15 22:15:23'),(7646,282,2,9658,'9.99','2005-07-31 06:00:52','2006-02-15 22:15:23'),(7647,282,2,11226,'2.99','2005-08-02 12:47:30','2006-02-15 22:15:23'),(7648,282,1,13278,'2.99','2005-08-19 17:57:53','2006-02-15 22:15:23'),(7649,282,2,13749,'2.99','2005-08-20 11:00:37','2006-02-15 22:15:23'),(7650,282,2,15543,'4.99','2005-08-23 04:15:41','2006-02-15 22:15:23'),(7651,282,2,15430,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:23'),(7652,283,1,1749,'0.99','2005-06-16 16:56:00','2006-02-15 22:15:23'),(7653,283,2,1796,'2.99','2005-06-16 20:10:43','2006-02-15 22:15:23'),(7654,283,2,2333,'2.99','2005-06-18 10:55:54','2006-02-15 22:15:23'),(7655,283,1,2685,'2.99','2005-06-19 12:35:21','2006-02-15 22:15:23'),(7656,283,2,2849,'7.99','2005-06-19 23:06:00','2006-02-15 22:15:23'),(7657,283,1,3534,'4.99','2005-07-06 01:32:27','2006-02-15 22:15:23'),(7658,283,1,3568,'6.99','2005-07-06 03:11:57','2006-02-15 22:15:23'),(7659,283,2,3590,'4.99','2005-07-06 04:35:12','2006-02-15 22:15:23'),(7660,283,2,3672,'0.99','2005-07-06 09:01:56','2006-02-15 22:15:23'),(7661,283,2,4683,'2.99','2005-07-08 10:38:28','2006-02-15 22:15:23'),(7662,283,2,4876,'1.99','2005-07-08 19:27:50','2006-02-15 22:15:24'),(7663,283,2,5989,'2.99','2005-07-11 00:57:53','2006-02-15 22:15:24'),(7664,283,1,6075,'0.99','2005-07-11 05:03:03','2006-02-15 22:15:24'),(7665,283,1,6300,'1.99','2005-07-11 17:50:09','2006-02-15 22:15:24'),(7666,283,2,6313,'0.99','2005-07-11 18:29:52','2006-02-15 22:15:24'),(7667,283,1,6827,'4.99','2005-07-12 18:33:45','2006-02-15 22:15:24'),(7668,283,1,7504,'0.99','2005-07-27 20:24:31','2006-02-15 22:15:24'),(7669,283,1,7816,'0.99','2005-07-28 08:14:12','2006-02-15 22:15:24'),(7670,283,2,9353,'4.99','2005-07-30 18:30:37','2006-02-15 22:15:24'),(7671,283,2,9478,'2.99','2005-07-30 23:12:53','2006-02-15 22:15:24'),(7672,283,2,9572,'2.99','2005-07-31 02:44:10','2006-02-15 22:15:24'),(7673,283,2,9918,'2.99','2005-07-31 14:55:22','2006-02-15 22:15:24'),(7674,283,1,11637,'0.99','2005-08-17 04:36:39','2006-02-15 22:15:24'),(7675,283,2,11846,'2.99','2005-08-17 13:18:29','2006-02-15 22:15:24'),(7676,283,2,11966,'0.99','2005-08-17 17:40:04','2006-02-15 22:15:24'),(7677,283,1,12290,'6.99','2005-08-18 05:08:03','2006-02-15 22:15:24'),(7678,283,1,13229,'2.99','2005-08-19 16:08:33','2006-02-15 22:15:24'),(7679,283,1,15837,'2.99','2005-08-23 15:29:41','2006-02-15 22:15:24'),(7680,284,2,423,'0.99','2005-05-27 15:32:57','2006-02-15 22:15:24'),(7681,284,2,791,'0.99','2005-05-29 16:30:42','2006-02-15 22:15:24'),(7682,284,1,1145,'6.99','2005-05-31 20:13:45','2006-02-15 22:15:24'),(7683,284,1,1171,'0.99','2005-06-14 23:50:11','2006-02-15 22:15:24'),(7684,284,2,2813,'6.99','2005-06-19 20:01:47','2006-02-15 22:15:24'),(7685,284,2,3296,'0.99','2005-06-21 07:04:53','2006-02-15 22:15:24'),(7686,284,1,3572,'0.99','2005-07-06 03:33:23','2006-02-15 22:15:24'),(7687,284,2,4081,'2.99','2005-07-07 05:10:08','2006-02-15 22:15:24'),(7688,284,1,4759,'7.99','2005-07-08 14:39:22','2006-02-15 22:15:24'),(7689,284,2,4931,'7.99','2005-07-08 22:16:18','2006-02-15 22:15:25'),(7690,284,1,5161,'6.99','2005-07-09 08:57:56','2006-02-15 22:15:25'),(7691,284,1,6276,'5.99','2005-07-11 16:15:50','2006-02-15 22:15:25'),(7692,284,2,6982,'2.99','2005-07-27 00:53:41','2006-02-15 22:15:25'),(7693,284,1,7164,'6.99','2005-07-27 07:36:34','2006-02-15 22:15:25'),(7694,284,1,7463,'4.99','2005-07-27 18:48:32','2006-02-15 22:15:25'),(7695,284,2,7716,'8.99','2005-07-28 04:33:15','2006-02-15 22:15:25'),(7696,284,1,8888,'2.99','2005-07-30 00:39:36','2006-02-15 22:15:25'),(7697,284,1,9790,'0.99','2005-07-31 10:34:08','2006-02-15 22:15:25'),(7698,284,1,10396,'7.99','2005-08-01 07:08:46','2006-02-15 22:15:25'),(7699,284,1,10535,'4.99','2005-08-01 12:21:13','2006-02-15 22:15:25'),(7700,284,2,12162,'3.99','2005-08-18 00:44:30','2006-02-15 22:15:25'),(7701,284,1,14007,'5.99','2005-08-20 20:22:47','2006-02-15 22:15:25'),(7702,284,1,14648,'4.99','2005-08-21 19:18:01','2006-02-15 22:15:25'),(7703,284,2,14746,'4.99','2005-08-21 22:54:02','2006-02-15 22:15:25'),(7704,284,1,14921,'4.99','2005-08-22 05:12:24','2006-02-15 22:15:25'),(7705,284,2,15135,'3.99','2005-08-22 13:19:19','2006-02-15 22:15:25'),(7706,284,1,12064,'5.98','2006-02-14 15:16:03','2006-02-15 22:15:25'),(7707,284,2,12959,'0.00','2006-02-14 15:16:03','2006-02-15 22:15:25'),(7708,285,2,1161,'7.99','2005-06-14 23:07:08','2006-02-15 22:15:25'),(7709,285,2,1302,'3.99','2005-06-15 09:48:37','2006-02-15 22:15:25'),(7710,285,1,2249,'5.99','2005-06-18 05:03:08','2006-02-15 22:15:25'),(7711,285,2,4007,'6.99','2005-07-07 00:26:05','2006-02-15 22:15:25'),(7712,285,2,5112,'2.99','2005-07-09 07:04:04','2006-02-15 22:15:25'),(7713,285,1,5683,'9.99','2005-07-10 08:52:13','2006-02-15 22:15:25'),(7714,285,1,6010,'0.99','2005-07-11 01:52:28','2006-02-15 22:15:25'),(7715,285,2,6083,'3.99','2005-07-11 05:12:49','2006-02-15 22:15:26'),(7716,285,1,6094,'4.99','2005-07-11 05:54:42','2006-02-15 22:15:26'),(7717,285,2,6333,'4.99','2005-07-11 19:20:16','2006-02-15 22:15:26'),(7718,285,2,6644,'0.99','2005-07-12 10:39:39','2006-02-15 22:15:26'),(7719,285,1,7211,'6.99','2005-07-27 09:20:00','2006-02-15 22:15:26'),(7720,285,1,7452,'9.99','2005-07-27 18:26:39','2006-02-15 22:15:26'),(7721,285,1,7745,'9.99','2005-07-28 05:46:28','2006-02-15 22:15:26'),(7722,285,1,8154,'4.99','2005-07-28 20:56:18','2006-02-15 22:15:26'),(7723,285,2,8466,'0.99','2005-07-29 08:24:47','2006-02-15 22:15:26'),(7724,285,1,10493,'5.99','2005-08-01 10:43:12','2006-02-15 22:15:26'),(7725,285,2,10628,'2.99','2005-08-01 15:33:19','2006-02-15 22:15:26'),(7726,285,1,10641,'4.99','2005-08-01 15:44:57','2006-02-15 22:15:26'),(7727,285,1,12027,'8.99','2005-08-17 20:01:12','2006-02-15 22:15:26'),(7728,285,1,12444,'0.99','2005-08-18 10:53:12','2006-02-15 22:15:26'),(7729,285,1,12449,'0.99','2005-08-18 11:03:04','2006-02-15 22:15:26'),(7730,285,2,12687,'9.99','2005-08-18 19:57:39','2006-02-15 22:15:26'),(7731,285,2,13102,'7.99','2005-08-19 11:02:03','2006-02-15 22:15:26'),(7732,285,2,15251,'0.99','2005-08-22 18:03:57','2006-02-15 22:15:26'),(7733,285,1,15489,'4.99','2005-08-23 02:06:41','2006-02-15 22:15:26'),(7734,286,2,81,'6.99','2005-05-25 12:15:19','2006-02-15 22:15:26'),(7735,286,1,1690,'8.99','2005-06-16 12:24:18','2006-02-15 22:15:26'),(7736,286,1,2195,'4.99','2005-06-18 01:44:46','2006-02-15 22:15:26'),(7737,286,2,3592,'4.99','2005-07-06 04:38:50','2006-02-15 22:15:26'),(7738,286,2,3692,'3.99','2005-07-06 09:54:12','2006-02-15 22:15:26'),(7739,286,2,4242,'6.99','2005-07-07 13:39:01','2006-02-15 22:15:26'),(7740,286,2,4461,'9.99','2005-07-07 23:59:43','2006-02-15 22:15:26'),(7741,286,1,4707,'4.99','2005-07-08 11:57:28','2006-02-15 22:15:26'),(7742,286,1,4894,'2.99','2005-07-08 20:21:31','2006-02-15 22:15:27'),(7743,286,1,5796,'4.99','2005-07-10 14:42:54','2006-02-15 22:15:27'),(7744,286,2,6611,'2.99','2005-07-12 08:20:23','2006-02-15 22:15:27'),(7745,286,1,7254,'2.99','2005-07-27 10:48:50','2006-02-15 22:15:27'),(7746,286,1,7299,'2.99','2005-07-27 12:49:56','2006-02-15 22:15:27'),(7747,286,1,7368,'0.99','2005-07-27 15:06:05','2006-02-15 22:15:27'),(7748,286,1,7422,'2.99','2005-07-27 17:10:42','2006-02-15 22:15:27'),(7749,286,1,7719,'6.99','2005-07-28 04:39:09','2006-02-15 22:15:27'),(7750,286,2,8399,'0.99','2005-07-29 06:20:18','2006-02-15 22:15:27'),(7751,286,2,9280,'6.99','2005-07-30 15:15:38','2006-02-15 22:15:27'),(7752,286,1,9809,'3.99','2005-07-31 11:19:21','2006-02-15 22:15:27'),(7753,286,2,10105,'5.99','2005-07-31 20:54:20','2006-02-15 22:15:27'),(7754,286,2,11670,'0.99','2005-08-17 05:48:59','2006-02-15 22:15:27'),(7755,286,2,12595,'0.99','2005-08-18 16:27:08','2006-02-15 22:15:27'),(7756,286,1,12656,'0.99','2005-08-18 18:58:35','2006-02-15 22:15:27'),(7757,286,2,13635,'5.99','2005-08-20 07:17:35','2006-02-15 22:15:27'),(7758,286,1,13975,'4.99','2005-08-20 18:58:23','2006-02-15 22:15:27'),(7759,286,1,14905,'0.99','2005-08-22 04:34:22','2006-02-15 22:15:27'),(7760,286,2,15629,'4.99','2005-08-23 07:28:22','2006-02-15 22:15:27'),(7761,287,2,498,'0.99','2005-05-28 01:01:21','2006-02-15 22:15:27'),(7762,287,1,655,'2.99','2005-05-28 20:16:20','2006-02-15 22:15:27'),(7763,287,2,964,'2.99','2005-05-30 18:53:21','2006-02-15 22:15:27'),(7764,287,1,1247,'7.99','2005-06-15 05:16:40','2006-02-15 22:15:27'),(7765,287,2,1642,'2.99','2005-06-16 08:54:15','2006-02-15 22:15:27'),(7766,287,2,2286,'9.99','2005-06-18 07:02:32','2006-02-15 22:15:27'),(7767,287,2,2612,'6.99','2005-06-19 07:19:41','2006-02-15 22:15:27'),(7768,287,2,4877,'4.99','2005-07-08 19:31:02','2006-02-15 22:15:28'),(7769,287,2,5346,'1.99','2005-07-09 17:29:01','2006-02-15 22:15:28'),(7770,287,1,5593,'3.99','2005-07-10 04:33:13','2006-02-15 22:15:28'),(7771,287,2,5761,'0.99','2005-07-10 12:45:36','2006-02-15 22:15:28'),(7772,287,2,6379,'3.99','2005-07-11 21:51:25','2006-02-15 22:15:28'),(7773,287,1,6397,'2.99','2005-07-11 22:34:02','2006-02-15 22:15:28'),(7774,287,2,7402,'2.99','2005-07-27 16:19:40','2006-02-15 22:15:28'),(7775,287,2,7777,'2.99','2005-07-28 07:04:42','2006-02-15 22:15:28'),(7776,287,2,8994,'6.99','2005-07-30 04:51:32','2006-02-15 22:15:28'),(7777,287,2,9716,'1.99','2005-07-31 08:23:53','2006-02-15 22:15:28'),(7778,287,1,10027,'6.99','2005-07-31 18:33:51','2006-02-15 22:15:28'),(7779,287,2,10574,'2.99','2005-08-01 13:36:51','2006-02-15 22:15:28'),(7780,287,2,10807,'4.99','2005-08-01 22:26:10','2006-02-15 22:15:28'),(7781,287,2,11106,'4.99','2005-08-02 08:17:38','2006-02-15 22:15:28'),(7782,287,1,11716,'4.99','2005-08-17 07:40:55','2006-02-15 22:15:28'),(7783,287,2,12861,'2.99','2005-08-19 02:30:24','2006-02-15 22:15:28'),(7784,287,2,14715,'6.99','2005-08-21 21:28:18','2006-02-15 22:15:28'),(7785,287,2,15076,'1.99','2005-08-22 11:05:34','2006-02-15 22:15:28'),(7786,287,1,15084,'4.99','2005-08-22 11:17:59','2006-02-15 22:15:28'),(7787,287,2,15127,'0.99','2005-08-22 12:56:29','2006-02-15 22:15:28'),(7788,287,1,15614,'2.99','2005-08-23 07:05:15','2006-02-15 22:15:28'),(7789,287,2,14204,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:28'),(7790,288,2,93,'3.99','2005-05-25 15:54:16','2006-02-15 22:15:28'),(7791,288,2,427,'6.99','2005-05-27 16:10:04','2006-02-15 22:15:28'),(7792,288,1,503,'4.99','2005-05-28 01:35:25','2006-02-15 22:15:28'),(7793,288,2,565,'5.99','2005-05-28 09:26:31','2006-02-15 22:15:28'),(7794,288,1,1466,'5.99','2005-06-15 20:46:04','2006-02-15 22:15:29'),(7795,288,1,3958,'3.99','2005-07-06 22:07:33','2006-02-15 22:15:29'),(7796,288,1,4692,'2.99','2005-07-08 11:07:06','2006-02-15 22:15:29'),(7797,288,2,4758,'0.99','2005-07-08 14:38:02','2006-02-15 22:15:29'),(7798,288,1,6399,'2.99','2005-07-11 22:39:05','2006-02-15 22:15:29'),(7799,288,2,6518,'3.99','2005-07-12 03:59:42','2006-02-15 22:15:29'),(7800,288,2,7744,'0.99','2005-07-28 05:38:20','2006-02-15 22:15:29'),(7801,288,2,7855,'2.99','2005-07-28 09:43:02','2006-02-15 22:15:29'),(7802,288,2,9429,'2.99','2005-07-30 21:19:26','2006-02-15 22:15:29'),(7803,288,1,9732,'0.99','2005-07-31 08:56:08','2006-02-15 22:15:29'),(7804,288,1,10927,'9.99','2005-08-02 02:31:15','2006-02-15 22:15:29'),(7805,288,2,11952,'2.99','2005-08-17 17:14:57','2006-02-15 22:15:29'),(7806,288,1,12134,'1.99','2005-08-17 23:49:43','2006-02-15 22:15:29'),(7807,288,1,13219,'2.99','2005-08-19 15:40:28','2006-02-15 22:15:29'),(7808,288,1,13227,'0.99','2005-08-19 16:05:38','2006-02-15 22:15:29'),(7809,288,2,13363,'2.99','2005-08-19 21:07:59','2006-02-15 22:15:29'),(7810,288,2,14113,'0.99','2005-08-21 01:03:30','2006-02-15 22:15:29'),(7811,288,2,14756,'0.99','2005-08-21 23:21:23','2006-02-15 22:15:29'),(7812,288,2,15058,'2.99','2005-08-22 10:20:55','2006-02-15 22:15:29'),(7813,288,1,15119,'2.99','2005-08-22 12:41:33','2006-02-15 22:15:29'),(7814,289,2,1880,'4.99','2005-06-17 03:08:59','2006-02-15 22:15:29'),(7815,289,2,2316,'0.99','2005-06-18 09:04:59','2006-02-15 22:15:29'),(7816,289,1,2387,'6.99','2005-06-18 15:24:19','2006-02-15 22:15:29'),(7817,289,1,2784,'10.99','2005-06-19 18:40:29','2006-02-15 22:15:29'),(7818,289,2,2948,'6.99','2005-06-20 06:02:35','2006-02-15 22:15:29'),(7819,289,2,3123,'6.99','2005-06-20 18:26:14','2006-02-15 22:15:29'),(7820,289,1,3588,'2.99','2005-07-06 04:29:13','2006-02-15 22:15:30'),(7821,289,2,4622,'0.99','2005-07-08 08:02:42','2006-02-15 22:15:30'),(7822,289,1,5089,'4.99','2005-07-09 05:45:40','2006-02-15 22:15:30'),(7823,289,2,5342,'8.99','2005-07-09 17:20:03','2006-02-15 22:15:30'),(7824,289,2,5584,'4.99','2005-07-10 04:15:25','2006-02-15 22:15:30'),(7825,289,2,5724,'0.99','2005-07-10 11:18:12','2006-02-15 22:15:30'),(7826,289,2,6007,'3.99','2005-07-11 01:43:06','2006-02-15 22:15:30'),(7827,289,2,6536,'7.99','2005-07-12 04:44:25','2006-02-15 22:15:30'),(7828,289,1,7151,'4.99','2005-07-27 07:14:31','2006-02-15 22:15:30'),(7829,289,1,7162,'4.99','2005-07-27 07:32:45','2006-02-15 22:15:30'),(7830,289,2,7325,'0.99','2005-07-27 13:46:55','2006-02-15 22:15:30'),(7831,289,1,9498,'2.99','2005-07-30 23:56:55','2006-02-15 22:15:30'),(7832,289,2,10297,'7.99','2005-08-01 04:05:04','2006-02-15 22:15:30'),(7833,289,1,12158,'1.99','2005-08-18 00:34:20','2006-02-15 22:15:30'),(7834,289,1,12170,'0.99','2005-08-18 01:06:10','2006-02-15 22:15:30'),(7835,289,2,12558,'7.99','2005-08-18 14:52:35','2006-02-15 22:15:30'),(7836,289,2,13165,'0.99','2005-08-19 13:34:10','2006-02-15 22:15:30'),(7837,289,2,13211,'0.99','2005-08-19 15:23:41','2006-02-15 22:15:30'),(7838,289,2,13256,'9.99','2005-08-19 16:54:12','2006-02-15 22:15:30'),(7839,289,2,13336,'5.99','2005-08-19 20:03:22','2006-02-15 22:15:30'),(7840,289,2,13891,'6.99','2005-08-20 15:42:05','2006-02-15 22:15:30'),(7841,289,1,14087,'0.99','2005-08-20 23:53:40','2006-02-15 22:15:30'),(7842,289,2,14729,'4.99','2005-08-21 22:16:57','2006-02-15 22:15:30'),(7843,289,2,14917,'4.99','2005-08-22 05:03:59','2006-02-15 22:15:30'),(7844,290,1,160,'2.99','2005-05-26 01:46:20','2006-02-15 22:15:30'),(7845,290,1,1220,'6.99','2005-06-15 03:26:15','2006-02-15 22:15:30'),(7846,290,2,1336,'8.99','2005-06-15 12:01:34','2006-02-15 22:15:31'),(7847,290,2,1496,'4.99','2005-06-15 21:55:58','2006-02-15 22:15:31'),(7848,290,2,1532,'0.99','2005-06-16 00:41:31','2006-02-15 22:15:31'),(7849,290,1,3013,'3.99','2005-06-20 10:45:09','2006-02-15 22:15:31'),(7850,290,2,4039,'4.99','2005-07-07 02:57:59','2006-02-15 22:15:31'),(7851,290,1,4073,'0.99','2005-07-07 04:49:13','2006-02-15 22:15:31'),(7852,290,2,4416,'0.99','2005-07-07 22:04:36','2006-02-15 22:15:31'),(7853,290,1,5105,'2.99','2005-07-09 06:38:59','2006-02-15 22:15:31'),(7854,290,2,5214,'5.99','2005-07-09 11:43:08','2006-02-15 22:15:31'),(7855,290,2,5827,'2.99','2005-07-10 16:22:20','2006-02-15 22:15:31'),(7856,290,2,6816,'4.99','2005-07-12 18:18:50','2006-02-15 22:15:31'),(7857,290,1,6952,'4.99','2005-07-26 23:51:27','2006-02-15 22:15:31'),(7858,290,2,7265,'2.99','2005-07-27 11:19:01','2006-02-15 22:15:31'),(7859,290,1,7650,'1.99','2005-07-28 01:47:20','2006-02-15 22:15:31'),(7860,290,1,8639,'4.99','2005-07-29 14:30:31','2006-02-15 22:15:31'),(7861,290,1,9000,'7.99','2005-07-30 04:58:55','2006-02-15 22:15:31'),(7862,290,1,9413,'0.99','2005-07-30 20:44:39','2006-02-15 22:15:31'),(7863,290,2,10096,'3.99','2005-07-31 20:38:58','2006-02-15 22:15:31'),(7864,290,1,10194,'1.99','2005-08-01 00:33:52','2006-02-15 22:15:31'),(7865,290,1,10901,'2.99','2005-08-02 01:35:44','2006-02-15 22:15:31'),(7866,290,1,11596,'6.99','2005-08-17 02:53:55','2006-02-15 22:15:31'),(7867,290,2,12193,'3.99','2005-08-18 02:03:59','2006-02-15 22:15:31'),(7868,290,2,12778,'4.99','2005-08-18 23:40:23','2006-02-15 22:15:31'),(7869,290,2,13190,'1.99','2005-08-19 14:27:59','2006-02-15 22:15:31'),(7870,290,1,13367,'2.99','2005-08-19 21:19:27','2006-02-15 22:15:31'),(7871,290,2,13687,'2.99','2005-08-20 08:57:51','2006-02-15 22:15:31'),(7872,291,1,54,'4.99','2005-05-25 07:23:25','2006-02-15 22:15:32'),(7873,291,2,747,'4.99','2005-05-29 09:26:34','2006-02-15 22:15:32'),(7874,291,1,1012,'2.99','2005-05-31 02:18:05','2006-02-15 22:15:32'),(7875,291,1,1191,'2.99','2005-06-15 01:10:35','2006-02-15 22:15:32'),(7876,291,1,2300,'2.99','2005-06-18 08:22:34','2006-02-15 22:15:32'),(7877,291,2,3042,'2.99','2005-06-20 12:38:27','2006-02-15 22:15:32'),(7878,291,2,3512,'4.99','2005-07-06 00:43:06','2006-02-15 22:15:32'),(7879,291,2,4862,'3.99','2005-07-08 19:02:46','2006-02-15 22:15:32'),(7880,291,2,5754,'2.99','2005-07-10 12:32:43','2006-02-15 22:15:32'),(7881,291,2,6516,'4.99','2005-07-12 03:51:54','2006-02-15 22:15:32'),(7882,291,1,6796,'2.99','2005-07-12 16:44:16','2006-02-15 22:15:32'),(7883,291,1,7561,'5.99','2005-07-27 22:21:05','2006-02-15 22:15:32'),(7884,291,2,7564,'0.99','2005-07-27 22:31:17','2006-02-15 22:15:32'),(7885,291,1,8690,'0.99','2005-07-29 16:39:28','2006-02-15 22:15:32'),(7886,291,2,8697,'4.99','2005-07-29 16:46:07','2006-02-15 22:15:32'),(7887,291,1,9165,'5.99','2005-07-30 11:24:28','2006-02-15 22:15:32'),(7888,291,2,9201,'5.99','2005-07-30 12:42:21','2006-02-15 22:15:32'),(7889,291,2,9919,'7.99','2005-07-31 14:55:46','2006-02-15 22:15:32'),(7890,291,1,10463,'4.99','2005-08-01 09:39:43','2006-02-15 22:15:32'),(7891,291,2,11145,'0.99','2005-08-02 09:43:24','2006-02-15 22:15:32'),(7892,291,1,13665,'5.99','2005-08-20 08:19:20','2006-02-15 22:15:32'),(7893,291,2,14241,'4.99','2005-08-21 05:24:55','2006-02-15 22:15:32'),(7894,291,2,15663,'3.99','2005-08-23 08:54:26','2006-02-15 22:15:32'),(7895,292,1,324,'0.99','2005-05-27 01:00:04','2006-02-15 22:15:32'),(7896,292,1,1901,'3.99','2005-06-17 04:35:19','2006-02-15 22:15:32'),(7897,292,2,2258,'3.99','2005-06-18 05:30:36','2006-02-15 22:15:32'),(7898,292,1,2838,'3.99','2005-06-19 22:06:06','2006-02-15 22:15:33'),(7899,292,2,3328,'2.99','2005-06-21 09:08:44','2006-02-15 22:15:33'),(7900,292,2,3557,'0.99','2005-07-06 02:48:39','2006-02-15 22:15:33'),(7901,292,1,4200,'4.99','2005-07-07 11:15:11','2006-02-15 22:15:33'),(7902,292,2,5095,'4.99','2005-07-09 06:08:22','2006-02-15 22:15:33'),(7903,292,2,5257,'0.99','2005-07-09 13:56:43','2006-02-15 22:15:33'),(7904,292,1,5940,'4.99','2005-07-10 22:31:01','2006-02-15 22:15:33'),(7905,292,1,6270,'8.99','2005-07-11 15:59:10','2006-02-15 22:15:33'),(7906,292,1,6900,'6.99','2005-07-12 21:45:25','2006-02-15 22:15:33'),(7907,292,2,7199,'5.99','2005-07-27 08:53:23','2006-02-15 22:15:33'),(7908,292,1,7216,'2.99','2005-07-27 09:27:45','2006-02-15 22:15:33'),(7909,292,1,7545,'2.99','2005-07-27 21:48:03','2006-02-15 22:15:33'),(7910,292,1,7766,'4.99','2005-07-28 06:41:57','2006-02-15 22:15:33'),(7911,292,1,8047,'2.99','2005-07-28 16:49:43','2006-02-15 22:15:33'),(7912,292,2,8842,'4.99','2005-07-29 23:03:40','2006-02-15 22:15:33'),(7913,292,1,8990,'8.99','2005-07-30 04:41:42','2006-02-15 22:15:33'),(7914,292,1,9792,'5.99','2005-07-31 10:43:41','2006-02-15 22:15:33'),(7915,292,2,9819,'1.99','2005-07-31 11:39:13','2006-02-15 22:15:33'),(7916,292,1,11193,'4.99','2005-08-02 11:31:33','2006-02-15 22:15:33'),(7917,292,1,12739,'10.99','2005-08-18 22:15:18','2006-02-15 22:15:33'),(7918,292,1,13715,'2.99','2005-08-20 09:43:06','2006-02-15 22:15:33'),(7919,292,1,14499,'0.99','2005-08-21 14:11:19','2006-02-15 22:15:33'),(7920,292,2,14845,'4.99','2005-08-22 02:12:44','2006-02-15 22:15:33'),(7921,292,1,15117,'2.99','2005-08-22 12:38:20','2006-02-15 22:15:33'),(7922,293,2,445,'0.99','2005-05-27 18:42:57','2006-02-15 22:15:33'),(7923,293,1,924,'4.99','2005-05-30 12:10:59','2006-02-15 22:15:33'),(7924,293,2,1034,'8.99','2005-05-31 04:53:40','2006-02-15 22:15:34'),(7925,293,1,1589,'9.99','2005-06-16 04:58:03','2006-02-15 22:15:34'),(7926,293,1,1829,'5.99','2005-06-16 22:14:21','2006-02-15 22:15:34'),(7927,293,2,1860,'4.99','2005-06-17 01:17:12','2006-02-15 22:15:34'),(7928,293,1,2386,'4.99','2005-06-18 15:22:51','2006-02-15 22:15:34'),(7929,293,2,3025,'2.99','2005-06-20 11:46:48','2006-02-15 22:15:34'),(7930,293,1,3290,'1.99','2005-06-21 06:45:34','2006-02-15 22:15:34'),(7931,293,2,3452,'4.99','2005-06-21 21:11:27','2006-02-15 22:15:34'),(7932,293,1,3906,'3.99','2005-07-06 19:35:55','2006-02-15 22:15:34'),(7933,293,2,4343,'0.99','2005-07-07 18:48:54','2006-02-15 22:15:34'),(7934,293,2,4542,'4.99','2005-07-08 04:06:30','2006-02-15 22:15:34'),(7935,293,2,4944,'6.99','2005-07-08 22:44:28','2006-02-15 22:15:34'),(7936,293,2,5765,'3.99','2005-07-10 13:03:02','2006-02-15 22:15:34'),(7937,293,1,6432,'9.99','2005-07-12 00:09:41','2006-02-15 22:15:34'),(7938,293,2,7607,'4.99','2005-07-28 00:05:53','2006-02-15 22:15:34'),(7939,293,1,8589,'4.99','2005-07-29 12:28:17','2006-02-15 22:15:34'),(7940,293,1,8745,'2.99','2005-07-29 19:03:05','2006-02-15 22:15:34'),(7941,293,2,9123,'2.99','2005-07-30 09:39:15','2006-02-15 22:15:34'),(7942,293,2,11131,'1.99','2005-08-02 09:10:04','2006-02-15 22:15:34'),(7943,293,1,11576,'2.99','2005-08-17 01:53:20','2006-02-15 22:15:34'),(7944,293,2,13013,'6.99','2005-08-19 07:55:51','2006-02-15 22:15:34'),(7945,293,1,13029,'2.99','2005-08-19 08:28:04','2006-02-15 22:15:34'),(7946,293,2,13504,'5.99','2005-08-20 02:01:48','2006-02-15 22:15:34'),(7947,293,1,13817,'4.99','2005-08-20 13:15:30','2006-02-15 22:15:34'),(7948,293,1,14248,'6.99','2005-08-21 05:35:57','2006-02-15 22:15:34'),(7949,293,1,15258,'4.99','2005-08-22 18:22:44','2006-02-15 22:15:35'),(7950,293,1,15402,'8.99','2005-08-22 23:17:41','2006-02-15 22:15:35'),(7951,293,1,15508,'7.99','2005-08-23 02:49:04','2006-02-15 22:15:35'),(7952,293,2,15675,'5.99','2005-08-23 09:18:52','2006-02-15 22:15:35'),(7953,294,1,595,'1.99','2005-05-28 13:59:54','2006-02-15 22:15:35'),(7954,294,1,2900,'2.99','2005-06-20 02:40:04','2006-02-15 22:15:35'),(7955,294,2,3330,'2.99','2005-06-21 09:22:37','2006-02-15 22:15:35'),(7956,294,1,3681,'4.99','2005-07-06 09:19:30','2006-02-15 22:15:35'),(7957,294,2,4019,'4.99','2005-07-07 01:27:44','2006-02-15 22:15:35'),(7958,294,1,4786,'7.99','2005-07-08 16:13:05','2006-02-15 22:15:35'),(7959,294,2,6185,'5.99','2005-07-11 11:25:09','2006-02-15 22:15:35'),(7960,294,2,7415,'6.99','2005-07-27 16:50:59','2006-02-15 22:15:35'),(7961,294,1,7765,'4.99','2005-07-28 06:40:33','2006-02-15 22:15:35'),(7962,294,2,8843,'4.99','2005-07-29 23:04:25','2006-02-15 22:15:35'),(7963,294,2,9194,'2.99','2005-07-30 12:28:45','2006-02-15 22:15:35'),(7964,294,1,9522,'2.99','2005-07-31 00:55:11','2006-02-15 22:15:35'),(7965,294,2,9607,'0.99','2005-07-31 03:51:06','2006-02-15 22:15:35'),(7966,294,2,10186,'0.99','2005-08-01 00:12:36','2006-02-15 22:15:35'),(7967,294,2,10220,'4.99','2005-08-01 01:13:22','2006-02-15 22:15:35'),(7968,294,1,10551,'6.99','2005-08-01 12:48:55','2006-02-15 22:15:35'),(7969,294,2,10600,'2.99','2005-08-01 14:25:21','2006-02-15 22:15:35'),(7970,294,2,10642,'4.99','2005-08-01 15:45:11','2006-02-15 22:15:35'),(7971,294,2,11071,'2.99','2005-08-02 07:10:53','2006-02-15 22:15:35'),(7972,294,1,11390,'2.99','2005-08-02 18:39:16','2006-02-15 22:15:35'),(7973,294,2,11875,'4.99','2005-08-17 14:16:48','2006-02-15 22:15:35'),(7974,294,2,11981,'2.99','2005-08-17 18:10:40','2006-02-15 22:15:35'),(7975,294,1,12278,'5.99','2005-08-18 04:46:45','2006-02-15 22:15:36'),(7976,294,1,14474,'2.99','2005-08-21 13:22:48','2006-02-15 22:15:36'),(7977,294,2,14630,'7.99','2005-08-21 18:43:44','2006-02-15 22:15:36'),(7978,294,1,15839,'5.99','2005-08-23 15:34:46','2006-02-15 22:15:36'),(7979,295,2,371,'3.99','2005-05-27 08:08:18','2006-02-15 22:15:36'),(7980,295,1,1184,'5.99','2005-06-15 00:49:36','2006-02-15 22:15:36'),(7981,295,1,1328,'2.99','2005-06-15 11:23:27','2006-02-15 22:15:36'),(7982,295,2,1935,'2.99','2005-06-17 07:14:15','2006-02-15 22:15:36'),(7983,295,1,2054,'2.99','2005-06-17 15:26:37','2006-02-15 22:15:36'),(7984,295,1,2431,'1.99','2005-06-18 17:53:03','2006-02-15 22:15:36'),(7985,295,1,2638,'1.99','2005-06-19 09:23:30','2006-02-15 22:15:36'),(7986,295,1,2999,'2.99','2005-06-20 09:30:34','2006-02-15 22:15:36'),(7987,295,1,3198,'1.99','2005-06-21 00:08:54','2006-02-15 22:15:36'),(7988,295,2,3394,'8.99','2005-06-21 15:17:39','2006-02-15 22:15:36'),(7989,295,2,3496,'1.99','2005-07-05 23:59:15','2006-02-15 22:15:36'),(7990,295,1,3876,'9.99','2005-07-06 18:21:13','2006-02-15 22:15:36'),(7991,295,1,4164,'1.99','2005-07-07 09:20:11','2006-02-15 22:15:36'),(7992,295,1,4432,'1.99','2005-07-07 22:40:02','2006-02-15 22:15:36'),(7993,295,1,5019,'2.99','2005-07-09 02:04:32','2006-02-15 22:15:36'),(7994,295,2,5053,'4.99','2005-07-09 03:59:46','2006-02-15 22:15:36'),(7995,295,2,5283,'2.99','2005-07-09 15:07:17','2006-02-15 22:15:36'),(7996,295,2,5994,'4.99','2005-07-11 01:14:10','2006-02-15 22:15:36'),(7997,295,1,6252,'2.99','2005-07-11 15:06:29','2006-02-15 22:15:36'),(7998,295,2,6331,'3.99','2005-07-11 19:17:21','2006-02-15 22:15:36'),(7999,295,2,8087,'0.99','2005-07-28 18:21:16','2006-02-15 22:15:36'),(8000,295,1,8108,'7.99','2005-07-28 19:07:38','2006-02-15 22:15:36'),(8001,295,1,8840,'9.99','2005-07-29 22:55:38','2006-02-15 22:15:37'),(8002,295,2,8932,'2.99','2005-07-30 02:31:26','2006-02-15 22:15:37'),(8003,295,1,9425,'7.99','2005-07-30 21:11:21','2006-02-15 22:15:37'),(8004,295,2,9692,'8.99','2005-07-31 07:11:04','2006-02-15 22:15:37'),(8005,295,2,9793,'4.99','2005-07-31 10:45:11','2006-02-15 22:15:37'),(8006,295,2,10160,'4.99','2005-07-31 23:07:40','2006-02-15 22:15:37'),(8007,295,2,10222,'0.99','2005-08-01 01:17:42','2006-02-15 22:15:37'),(8008,295,1,10349,'3.99','2005-08-01 05:27:13','2006-02-15 22:15:37'),(8009,295,2,11083,'4.99','2005-08-02 07:32:01','2006-02-15 22:15:37'),(8010,295,2,11913,'5.99','2005-08-17 15:53:17','2006-02-15 22:15:37'),(8011,295,2,12041,'4.99','2005-08-17 20:34:33','2006-02-15 22:15:37'),(8012,295,1,12383,'0.99','2005-08-18 08:36:03','2006-02-15 22:15:37'),(8013,295,1,14264,'0.99','2005-08-21 06:18:22','2006-02-15 22:15:37'),(8014,295,1,14387,'6.99','2005-08-21 10:10:01','2006-02-15 22:15:37'),(8015,295,1,14514,'6.99','2005-08-21 14:51:52','2006-02-15 22:15:37'),(8016,295,2,15735,'0.99','2006-02-14 15:16:03','2006-02-15 22:15:37'),(8017,296,2,162,'4.99','2005-05-26 02:02:05','2006-02-15 22:15:37'),(8018,296,1,511,'5.99','2005-05-28 03:04:04','2006-02-15 22:15:37'),(8019,296,1,869,'4.99','2005-05-30 04:22:06','2006-02-15 22:15:37'),(8020,296,2,956,'2.99','2005-05-30 17:30:28','2006-02-15 22:15:37'),(8021,296,2,1659,'4.99','2005-06-16 10:11:46','2006-02-15 22:15:37'),(8022,296,1,3034,'0.99','2005-06-20 12:15:50','2006-02-15 22:15:37'),(8023,296,2,3119,'0.99','2005-06-20 18:11:44','2006-02-15 22:15:37'),(8024,296,2,3486,'7.99','2005-07-05 23:29:55','2006-02-15 22:15:37'),(8025,296,1,3810,'2.99','2005-07-06 15:18:44','2006-02-15 22:15:37'),(8026,296,1,4480,'4.99','2005-07-08 00:56:30','2006-02-15 22:15:38'),(8027,296,2,5090,'0.99','2005-07-09 05:48:22','2006-02-15 22:15:38'),(8028,296,1,5589,'4.99','2005-07-10 04:22:58','2006-02-15 22:15:38'),(8029,296,2,6016,'4.99','2005-07-11 02:04:45','2006-02-15 22:15:38'),(8030,296,1,6398,'5.99','2005-07-11 22:34:49','2006-02-15 22:15:38'),(8031,296,1,6967,'6.99','2005-07-27 00:16:31','2006-02-15 22:15:38'),(8032,296,2,7568,'4.99','2005-07-27 22:38:53','2006-02-15 22:15:38'),(8033,296,2,8171,'0.99','2005-07-28 21:32:57','2006-02-15 22:15:38'),(8034,296,1,9249,'5.99','2005-07-30 14:15:02','2006-02-15 22:15:38'),(8035,296,1,9304,'2.99','2005-07-30 16:41:34','2006-02-15 22:15:38'),(8036,296,2,11571,'4.99','2005-08-17 01:37:51','2006-02-15 22:15:38'),(8037,296,2,11825,'4.99','2005-08-17 12:43:30','2006-02-15 22:15:38'),(8038,296,2,12689,'3.99','2005-08-18 20:06:34','2006-02-15 22:15:38'),(8039,296,2,13471,'2.99','2005-08-20 01:02:26','2006-02-15 22:15:38'),(8040,296,1,13702,'2.99','2005-08-20 09:27:20','2006-02-15 22:15:38'),(8041,296,1,13819,'4.99','2005-08-20 13:23:15','2006-02-15 22:15:38'),(8042,296,1,13991,'1.99','2005-08-20 19:29:44','2006-02-15 22:15:38'),(8043,296,2,14571,'7.99','2005-08-21 16:40:26','2006-02-15 22:15:38'),(8044,296,2,15023,'2.99','2005-08-22 08:56:48','2006-02-15 22:15:38'),(8045,296,2,15866,'7.99','2005-08-23 16:19:02','2006-02-15 22:15:38'),(8046,296,1,12009,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:38'),(8047,297,2,143,'0.99','2005-05-25 23:45:52','2006-02-15 22:15:38'),(8048,297,1,954,'3.99','2005-05-30 16:57:29','2006-02-15 22:15:38'),(8049,297,1,1409,'3.99','2005-06-15 16:58:12','2006-02-15 22:15:38'),(8050,297,1,2067,'2.99','2005-06-17 16:11:08','2006-02-15 22:15:38'),(8051,297,1,2202,'8.99','2005-06-18 02:09:24','2006-02-15 22:15:38'),(8052,297,1,2260,'2.99','2005-06-18 05:38:36','2006-02-15 22:15:39'),(8053,297,2,2339,'4.99','2005-06-18 11:29:22','2006-02-15 22:15:39'),(8054,297,1,3582,'0.99','2005-07-06 04:10:35','2006-02-15 22:15:39'),(8055,297,2,4621,'2.99','2005-07-08 08:02:18','2006-02-15 22:15:39'),(8056,297,1,4929,'5.99','2005-07-08 22:06:18','2006-02-15 22:15:39'),(8057,297,1,5743,'8.99','2005-07-10 11:57:38','2006-02-15 22:15:39'),(8058,297,2,6036,'2.99','2005-07-11 03:02:28','2006-02-15 22:15:39'),(8059,297,1,6064,'6.99','2005-07-11 04:23:18','2006-02-15 22:15:39'),(8060,297,1,6156,'4.99','2005-07-11 09:45:48','2006-02-15 22:15:39'),(8061,297,1,6984,'2.99','2005-07-27 00:56:30','2006-02-15 22:15:39'),(8062,297,2,7867,'0.99','2005-07-28 10:08:54','2006-02-15 22:15:39'),(8063,297,1,7933,'0.99','2005-07-28 12:27:27','2006-02-15 22:15:39'),(8064,297,2,9014,'2.99','2005-07-30 05:19:27','2006-02-15 22:15:39'),(8065,297,2,9674,'5.99','2005-07-31 06:36:53','2006-02-15 22:15:39'),(8066,297,1,10153,'0.99','2005-07-31 22:30:10','2006-02-15 22:15:39'),(8067,297,2,10264,'4.99','2005-08-01 03:03:12','2006-02-15 22:15:39'),(8068,297,2,11269,'0.99','2005-08-02 14:11:41','2006-02-15 22:15:39'),(8069,297,2,11413,'0.99','2005-08-02 19:35:19','2006-02-15 22:15:39'),(8070,297,2,11585,'4.99','2005-08-17 02:14:36','2006-02-15 22:15:39'),(8071,297,1,11780,'2.99','2005-08-17 10:34:24','2006-02-15 22:15:39'),(8072,297,1,11784,'0.99','2005-08-17 10:48:05','2006-02-15 22:15:39'),(8073,297,1,12472,'10.99','2005-08-18 11:58:48','2006-02-15 22:15:39'),(8074,297,1,13330,'2.99','2005-08-19 19:59:21','2006-02-15 22:15:39'),(8075,297,2,13721,'4.99','2005-08-20 10:02:59','2006-02-15 22:15:39'),(8076,297,1,13888,'1.99','2005-08-20 15:39:42','2006-02-15 22:15:39'),(8077,297,1,14403,'5.99','2005-08-21 10:40:34','2006-02-15 22:15:40'),(8078,297,2,15582,'2.99','2005-08-23 05:45:44','2006-02-15 22:15:40'),(8079,297,1,15711,'4.99','2005-08-23 10:43:00','2006-02-15 22:15:40'),(8080,298,1,383,'3.99','2005-05-27 10:12:20','2006-02-15 22:15:40'),(8081,298,2,1454,'4.99','2005-06-15 19:49:41','2006-02-15 22:15:40'),(8082,298,2,2385,'3.99','2005-06-18 15:22:40','2006-02-15 22:15:40'),(8083,298,2,3095,'4.99','2005-06-20 16:16:53','2006-02-15 22:15:40'),(8084,298,2,3400,'4.99','2005-06-21 15:50:30','2006-02-15 22:15:40'),(8085,298,2,3479,'0.99','2005-07-05 23:08:53','2006-02-15 22:15:40'),(8086,298,1,3728,'2.99','2005-07-06 11:29:00','2006-02-15 22:15:40'),(8087,298,2,4291,'2.99','2005-07-07 15:47:47','2006-02-15 22:15:40'),(8088,298,1,4936,'3.99','2005-07-08 22:24:50','2006-02-15 22:15:40'),(8089,298,2,5166,'2.99','2005-07-09 09:15:48','2006-02-15 22:15:40'),(8090,298,1,5247,'2.99','2005-07-09 13:26:28','2006-02-15 22:15:40'),(8091,298,2,6802,'0.99','2005-07-12 17:14:17','2006-02-15 22:15:40'),(8092,298,2,7802,'0.99','2005-07-28 07:51:57','2006-02-15 22:15:40'),(8093,298,1,7869,'7.99','2005-07-28 10:13:15','2006-02-15 22:15:40'),(8094,298,2,8737,'5.99','2005-07-29 18:32:13','2006-02-15 22:15:40'),(8095,298,2,10248,'6.99','2005-08-01 02:35:28','2006-02-15 22:15:40'),(8096,298,1,11070,'0.99','2005-08-02 07:10:39','2006-02-15 22:15:40'),(8097,298,2,11288,'6.99','2005-08-02 14:54:08','2006-02-15 22:15:40'),(8098,298,2,12076,'0.99','2005-08-17 21:58:19','2006-02-15 22:15:40'),(8099,298,1,12765,'8.99','2005-08-18 23:21:50','2006-02-15 22:15:40'),(8100,298,1,13172,'0.99','2005-08-19 13:49:07','2006-02-15 22:15:40'),(8101,298,1,13244,'4.99','2005-08-19 16:43:04','2006-02-15 22:15:40'),(8102,298,2,14473,'0.99','2005-08-21 13:19:03','2006-02-15 22:15:41'),(8103,298,1,15245,'3.99','2005-08-22 17:49:35','2006-02-15 22:15:41'),(8104,298,2,15262,'4.99','2005-08-22 18:25:21','2006-02-15 22:15:41'),(8105,298,1,15643,'4.99','2005-08-23 08:13:26','2006-02-15 22:15:41'),(8106,299,1,332,'5.99','2005-05-27 02:27:10','2006-02-15 22:15:41'),(8107,299,2,606,'8.99','2005-05-28 14:48:39','2006-02-15 22:15:41'),(8108,299,1,1650,'8.99','2005-06-16 09:23:20','2006-02-15 22:15:41'),(8109,299,2,2664,'4.99','2005-06-19 11:11:23','2006-02-15 22:15:41'),(8110,299,1,2774,'2.99','2005-06-19 18:05:11','2006-02-15 22:15:41'),(8111,299,2,2791,'4.99','2005-06-19 18:51:27','2006-02-15 22:15:41'),(8112,299,1,3074,'0.99','2005-06-20 14:41:41','2006-02-15 22:15:41'),(8113,299,2,3223,'2.99','2005-06-21 02:06:45','2006-02-15 22:15:41'),(8114,299,1,3288,'5.99','2005-06-21 06:36:59','2006-02-15 22:15:41'),(8115,299,2,3497,'0.99','2005-07-06 00:00:03','2006-02-15 22:15:41'),(8116,299,2,4153,'5.99','2005-07-07 08:53:08','2006-02-15 22:15:41'),(8117,299,1,4350,'2.99','2005-07-07 19:02:41','2006-02-15 22:15:41'),(8118,299,2,5033,'1.99','2005-07-09 02:42:01','2006-02-15 22:15:41'),(8119,299,1,5642,'2.99','2005-07-10 06:46:08','2006-02-15 22:15:41'),(8120,299,2,6732,'0.99','2005-07-12 13:58:51','2006-02-15 22:15:41'),(8121,299,1,6853,'7.99','2005-07-12 19:38:11','2006-02-15 22:15:41'),(8122,299,1,7264,'4.99','2005-07-27 11:18:58','2006-02-15 22:15:41'),(8123,299,1,7746,'2.99','2005-07-28 05:48:56','2006-02-15 22:15:41'),(8124,299,2,7862,'9.99','2005-07-28 10:02:25','2006-02-15 22:15:41'),(8125,299,1,9520,'2.99','2005-07-31 00:50:54','2006-02-15 22:15:41'),(8126,299,1,10201,'0.99','2005-08-01 00:42:18','2006-02-15 22:15:41'),(8127,299,2,10440,'2.99','2005-08-01 08:54:32','2006-02-15 22:15:41'),(8128,299,1,11629,'6.99','2005-08-17 04:27:24','2006-02-15 22:15:42'),(8129,299,1,11746,'5.99','2005-08-17 09:03:24','2006-02-15 22:15:42'),(8130,299,1,11998,'0.99','2005-08-17 18:46:21','2006-02-15 22:15:42'),(8131,299,1,13069,'4.99','2005-08-19 09:55:20','2006-02-15 22:15:42'),(8132,299,2,14208,'0.99','2005-08-21 04:09:18','2006-02-15 22:15:42'),(8133,299,1,14548,'3.99','2005-08-21 15:53:52','2006-02-15 22:15:42'),(8134,299,2,14889,'4.99','2005-08-22 04:10:10','2006-02-15 22:15:42'),(8135,299,2,14898,'6.99','2005-08-22 04:26:34','2006-02-15 22:15:42'),(8136,300,2,457,'0.99','2005-05-27 19:52:29','2006-02-15 22:15:42'),(8137,300,1,780,'3.99','2005-05-29 14:18:32','2006-02-15 22:15:42'),(8138,300,1,1111,'4.99','2005-05-31 15:24:19','2006-02-15 22:15:42'),(8139,300,2,1381,'0.99','2005-06-15 15:17:21','2006-02-15 22:15:42'),(8140,300,1,3177,'2.99','2005-06-20 22:32:44','2006-02-15 22:15:42'),(8141,300,1,3775,'0.99','2005-07-06 13:27:33','2006-02-15 22:15:42'),(8142,300,1,4030,'0.99','2005-07-07 02:25:42','2006-02-15 22:15:42'),(8143,300,2,5562,'2.99','2005-07-10 03:17:42','2006-02-15 22:15:42'),(8144,300,1,5705,'10.99','2005-07-10 10:09:17','2006-02-15 22:15:42'),(8145,300,2,6111,'4.99','2005-07-11 07:26:57','2006-02-15 22:15:42'),(8146,300,1,6822,'5.99','2005-07-12 18:23:39','2006-02-15 22:15:42'),(8147,300,1,6998,'4.99','2005-07-27 01:16:29','2006-02-15 22:15:42'),(8148,300,1,7815,'4.99','2005-07-28 08:14:11','2006-02-15 22:15:42'),(8149,300,1,8117,'6.99','2005-07-28 19:20:16','2006-02-15 22:15:42'),(8150,300,1,8210,'6.99','2005-07-28 23:31:05','2006-02-15 22:15:42'),(8151,300,1,8283,'3.99','2005-07-29 01:52:22','2006-02-15 22:15:42'),(8152,300,1,9078,'0.99','2005-07-30 08:01:00','2006-02-15 22:15:42'),(8153,300,2,9127,'2.99','2005-07-30 09:46:36','2006-02-15 22:15:43'),(8154,300,2,9791,'0.99','2005-07-31 10:35:22','2006-02-15 22:15:43'),(8155,300,1,10977,'4.99','2005-08-02 04:12:17','2006-02-15 22:15:43'),(8156,300,2,12484,'2.99','2005-08-18 12:39:37','2006-02-15 22:15:43'),(8157,300,2,12644,'5.99','2005-08-18 18:22:27','2006-02-15 22:15:43'),(8158,300,2,13257,'3.99','2005-08-19 17:01:20','2006-02-15 22:15:43'),(8159,300,1,13296,'0.99','2005-08-19 18:43:53','2006-02-15 22:15:43'),(8160,300,2,13499,'6.99','2005-08-20 01:52:30','2006-02-15 22:15:43'),(8161,300,1,13717,'5.99','2005-08-20 09:50:52','2006-02-15 22:15:43'),(8162,300,1,14674,'7.99','2005-08-21 20:01:34','2006-02-15 22:15:43'),(8163,300,1,14709,'9.99','2005-08-21 21:07:59','2006-02-15 22:15:43'),(8164,300,2,15051,'2.99','2005-08-22 10:08:50','2006-02-15 22:15:43'),(8165,300,2,15811,'5.99','2005-08-23 14:43:46','2006-02-15 22:15:43'),(8166,300,1,15695,'4.99','2006-02-14 15:16:03','2006-02-15 22:15:43'),(8167,301,2,27,'4.99','2005-05-25 03:41:50','2006-02-15 22:15:43'),(8168,301,2,227,'5.99','2005-05-26 10:51:46','2006-02-15 22:15:43'),(8169,301,1,955,'0.99','2005-05-30 16:59:03','2006-02-15 22:15:43'),(8170,301,1,1853,'0.99','2005-06-17 00:39:54','2006-02-15 22:15:43'),(8171,301,1,2611,'4.99','2005-06-19 07:18:17','2006-02-15 22:15:43'),(8172,301,2,2925,'2.99','2005-06-20 04:23:49','2006-02-15 22:15:43'),(8173,301,2,4316,'4.99','2005-07-07 17:44:22','2006-02-15 22:15:43'),(8174,301,2,4834,'3.99','2005-07-08 18:07:45','2006-02-15 22:15:43'),(8175,301,1,5119,'6.99','2005-07-09 07:14:18','2006-02-15 22:15:43'),(8176,301,2,5511,'4.99','2005-07-10 01:00:00','2006-02-15 22:15:43'),(8177,301,2,5730,'2.99','2005-07-10 11:28:32','2006-02-15 22:15:43'),(8178,301,2,5807,'2.99','2005-07-10 15:16:30','2006-02-15 22:15:43'),(8179,301,2,6833,'6.99','2005-07-12 18:53:34','2006-02-15 22:15:44'),(8180,301,2,7318,'4.99','2005-07-27 13:25:31','2006-02-15 22:15:44'),(8181,301,2,7818,'4.99','2005-07-28 08:25:00','2006-02-15 22:15:44'),(8182,301,2,9435,'4.99','2005-07-30 21:31:02','2006-02-15 22:15:44'),(8183,301,1,10883,'0.99','2005-08-02 00:47:19','2006-02-15 22:15:44'),(8184,301,2,13183,'5.99','2005-08-19 14:09:26','2006-02-15 22:15:44'),(8185,301,2,13633,'2.99','2005-08-20 07:13:47','2006-02-15 22:15:44'),(8186,301,1,15201,'10.99','2005-08-22 16:24:42','2006-02-15 22:15:44'),(8187,301,1,15268,'1.99','2005-08-22 18:39:11','2006-02-15 22:15:44'),(8188,302,2,38,'4.99','2005-05-25 04:47:44','2006-02-15 22:15:44'),(8189,302,2,92,'5.99','2005-05-25 15:38:46','2006-02-15 22:15:44'),(8190,302,1,1231,'2.99','2005-06-15 04:04:41','2006-02-15 22:15:44'),(8191,302,2,4676,'4.99','2005-07-08 10:26:02','2006-02-15 22:15:44'),(8192,302,2,5498,'0.99','2005-07-10 00:27:21','2006-02-15 22:15:44'),(8193,302,2,5682,'2.99','2005-07-10 08:51:39','2006-02-15 22:15:44'),(8194,302,2,5709,'0.99','2005-07-10 10:31:52','2006-02-15 22:15:44'),(8195,302,2,5821,'4.99','2005-07-10 16:07:16','2006-02-15 22:15:44'),(8196,302,2,6623,'7.99','2005-07-12 09:05:34','2006-02-15 22:15:44'),(8197,302,1,7183,'0.99','2005-07-27 08:18:38','2006-02-15 22:15:44'),(8198,302,1,7411,'6.99','2005-07-27 16:42:30','2006-02-15 22:15:44'),(8199,302,1,8363,'6.99','2005-07-29 05:10:08','2006-02-15 22:15:44'),(8200,302,2,8646,'0.99','2005-07-29 14:48:48','2006-02-15 22:15:44'),(8201,302,1,8795,'2.99','2005-07-29 21:04:14','2006-02-15 22:15:44'),(8202,302,1,9146,'7.99','2005-07-30 10:32:08','2006-02-15 22:15:44'),(8203,302,2,9358,'2.99','2005-07-30 18:37:24','2006-02-15 22:15:44'),(8204,302,1,9374,'8.99','2005-07-30 19:10:03','2006-02-15 22:15:45'),(8205,302,2,9581,'5.99','2005-07-31 03:03:07','2006-02-15 22:15:45'),(8206,302,2,10329,'0.99','2005-08-01 04:56:13','2006-02-15 22:15:45'),(8207,302,1,12126,'7.99','2005-08-17 23:25:21','2006-02-15 22:15:45'),(8208,302,2,12516,'4.99','2005-08-18 13:39:53','2006-02-15 22:15:45'),(8209,302,1,12903,'2.99','2005-08-19 04:09:38','2006-02-15 22:15:45'),(8210,302,1,13916,'2.99','2005-08-20 16:43:02','2006-02-15 22:15:45'),(8211,302,1,14120,'4.99','2005-08-21 01:25:00','2006-02-15 22:15:45'),(8212,302,2,14247,'3.99','2005-08-21 05:35:17','2006-02-15 22:15:45'),(8213,302,2,15578,'2.99','2005-08-23 05:37:13','2006-02-15 22:15:45'),(8214,302,1,15622,'5.99','2005-08-23 07:22:02','2006-02-15 22:15:45'),(8215,302,2,15734,'0.99','2005-08-23 11:40:08','2006-02-15 22:15:45'),(8216,302,2,15987,'6.99','2005-08-23 20:22:17','2006-02-15 22:15:45'),(8217,303,1,265,'0.99','2005-05-26 16:07:38','2006-02-15 22:15:45'),(8218,303,1,871,'2.99','2005-05-30 05:01:30','2006-02-15 22:15:45'),(8219,303,2,1050,'4.99','2005-05-31 07:01:27','2006-02-15 22:15:45'),(8220,303,2,1970,'4.99','2005-06-17 09:23:16','2006-02-15 22:15:45'),(8221,303,1,2223,'8.99','2005-06-18 03:27:03','2006-02-15 22:15:45'),(8222,303,1,3077,'3.99','2005-06-20 15:05:18','2006-02-15 22:15:45'),(8223,303,1,3107,'2.99','2005-06-20 17:26:05','2006-02-15 22:15:45'),(8224,303,1,5140,'4.99','2005-07-09 08:04:59','2006-02-15 22:15:45'),(8225,303,1,6205,'4.99','2005-07-11 12:31:24','2006-02-15 22:15:45'),(8226,303,2,6219,'4.99','2005-07-11 13:18:37','2006-02-15 22:15:45'),(8227,303,1,6464,'4.99','2005-07-12 01:16:40','2006-02-15 22:15:45'),(8228,303,1,7023,'4.99','2005-07-27 02:32:44','2006-02-15 22:15:45'),(8229,303,2,7502,'2.99','2005-07-27 20:19:08','2006-02-15 22:15:46'),(8230,303,1,8409,'0.99','2005-07-29 06:41:22','2006-02-15 22:15:46'),(8231,303,2,8734,'6.99','2005-07-29 18:28:15','2006-02-15 22:15:46'),(8232,303,2,8764,'0.99','2005-07-29 19:39:04','2006-02-15 22:15:46'),(8233,303,2,10209,'2.99','2005-08-01 00:56:47','2006-02-15 22:15:46'),(8234,303,1,11253,'4.99','2005-08-02 13:42:44','2006-02-15 22:15:46'),(8235,303,2,11673,'2.99','2005-08-17 05:54:15','2006-02-15 22:15:46'),(8236,303,2,11993,'2.99','2005-08-17 18:27:49','2006-02-15 22:15:46'),(8237,303,2,12117,'0.99','2005-08-17 23:11:12','2006-02-15 22:15:46'),(8238,303,1,12365,'0.99','2005-08-18 07:55:09','2006-02-15 22:15:46'),(8239,303,2,12473,'2.99','2005-08-18 11:59:44','2006-02-15 22:15:46'),(8240,303,1,14750,'5.99','2005-08-21 23:09:32','2006-02-15 22:15:46'),(8241,303,2,14795,'4.99','2005-08-22 00:40:22','2006-02-15 22:15:46'),(8242,303,1,15511,'3.99','2005-08-23 02:55:42','2006-02-15 22:15:46'),(8243,304,1,135,'10.99','2005-05-25 21:58:58','2006-02-15 22:15:46'),(8244,304,1,415,'0.99','2005-05-27 14:51:45','2006-02-15 22:15:46'),(8245,304,2,937,'2.99','2005-05-30 14:47:31','2006-02-15 22:15:46'),(8246,304,1,1414,'6.99','2005-06-15 17:26:32','2006-02-15 22:15:46'),(8247,304,2,1525,'4.99','2005-06-16 00:26:07','2006-02-15 22:15:46'),(8248,304,1,2039,'3.99','2005-06-17 14:03:43','2006-02-15 22:15:46'),(8249,304,2,2902,'4.99','2005-06-20 02:45:35','2006-02-15 22:15:46'),(8250,304,1,4466,'6.99','2005-07-08 00:12:53','2006-02-15 22:15:46'),(8251,304,2,4812,'8.99','2005-07-08 17:07:11','2006-02-15 22:15:46'),(8252,304,1,5411,'2.99','2005-07-09 20:23:38','2006-02-15 22:15:46'),(8253,304,1,5712,'4.99','2005-07-10 10:40:32','2006-02-15 22:15:46'),(8254,304,2,5749,'3.99','2005-07-10 12:20:36','2006-02-15 22:15:47'),(8255,304,2,5795,'0.99','2005-07-10 14:36:29','2006-02-15 22:15:47'),(8256,304,2,6107,'0.99','2005-07-11 07:07:09','2006-02-15 22:15:47'),(8257,304,1,6737,'4.99','2005-07-12 14:16:52','2006-02-15 22:15:47'),(8258,304,2,7551,'4.99','2005-07-27 21:59:15','2006-02-15 22:15:47'),(8259,304,2,8055,'4.99','2005-07-28 17:02:32','2006-02-15 22:15:47'),(8260,304,1,9930,'0.99','2005-07-31 15:18:03','2006-02-15 22:15:47'),(8261,304,1,9992,'6.99','2005-07-31 17:29:48','2006-02-15 22:15:47'),(8262,304,1,10631,'0.99','2005-08-01 15:35:14','2006-02-15 22:15:47'),(8263,304,2,11983,'4.99','2005-08-17 18:13:55','2006-02-15 22:15:47'),(8264,304,1,12540,'5.99','2005-08-18 14:17:30','2006-02-15 22:15:47'),(8265,304,2,13911,'3.99','2005-08-20 16:31:33','2006-02-15 22:15:47'),(8266,304,1,14023,'0.99','2005-08-20 21:10:32','2006-02-15 22:15:47'),(8267,304,1,14899,'4.99','2005-08-22 04:26:38','2006-02-15 22:15:47'),(8268,304,1,14945,'4.99','2005-08-22 06:05:38','2006-02-15 22:15:47'),(8269,305,2,69,'2.99','2005-05-25 10:10:14','2006-02-15 22:15:47'),(8270,305,1,1574,'4.99','2005-06-16 03:39:56','2006-02-15 22:15:47'),(8271,305,2,1884,'0.99','2005-06-17 03:19:20','2006-02-15 22:15:47'),(8272,305,1,2166,'11.99','2005-06-17 23:51:21','2006-02-15 22:15:47'),(8273,305,1,3387,'0.99','2005-06-21 14:21:49','2006-02-15 22:15:47'),(8274,305,2,4260,'4.99','2005-07-07 14:22:45','2006-02-15 22:15:47'),(8275,305,1,4638,'2.99','2005-07-08 08:57:20','2006-02-15 22:15:47'),(8276,305,2,5041,'0.99','2005-07-09 03:18:51','2006-02-15 22:15:47'),(8277,305,1,5052,'2.99','2005-07-09 03:59:43','2006-02-15 22:15:47'),(8278,305,2,5582,'4.99','2005-07-10 04:08:25','2006-02-15 22:15:47'),(8279,305,1,5745,'8.99','2005-07-10 12:10:11','2006-02-15 22:15:47'),(8280,305,1,6134,'7.99','2005-07-11 08:28:19','2006-02-15 22:15:48'),(8281,305,2,6619,'0.99','2005-07-12 08:50:48','2006-02-15 22:15:48'),(8282,305,2,8865,'4.99','2005-07-29 23:54:54','2006-02-15 22:15:48'),(8283,305,2,9119,'4.99','2005-07-30 09:25:56','2006-02-15 22:15:48'),(8284,305,2,10426,'4.99','2005-08-01 08:26:08','2006-02-15 22:15:48'),(8285,305,2,10929,'4.99','2005-08-02 02:35:44','2006-02-15 22:15:48'),(8286,305,1,10981,'2.99','2005-08-02 04:17:53','2006-02-15 22:15:48'),(8287,305,2,11035,'5.99','2005-08-02 05:55:39','2006-02-15 22:15:48'),(8288,305,2,11809,'3.99','2005-08-17 11:51:39','2006-02-15 22:15:48'),(8289,305,2,12592,'3.99','2005-08-18 16:17:50','2006-02-15 22:15:48'),(8290,305,2,12846,'0.99','2005-08-19 02:03:26','2006-02-15 22:15:48'),(8291,305,1,13782,'4.99','2005-08-20 12:09:26','2006-02-15 22:15:48'),(8292,305,2,15417,'2.99','2005-08-22 23:54:04','2006-02-15 22:15:48'),(8293,305,1,15612,'6.99','2005-08-23 06:59:07','2006-02-15 22:15:48'),(8294,306,2,375,'3.99','2005-05-27 08:49:21','2006-02-15 22:15:48'),(8295,306,2,672,'6.99','2005-05-28 22:05:29','2006-02-15 22:15:48'),(8296,306,2,1172,'0.99','2005-06-14 23:54:34','2006-02-15 22:15:48'),(8297,306,2,2836,'6.99','2005-06-19 21:58:21','2006-02-15 22:15:48'),(8298,306,1,3814,'6.99','2005-07-06 15:23:56','2006-02-15 22:15:48'),(8299,306,2,4484,'5.99','2005-07-08 01:05:57','2006-02-15 22:15:48'),(8300,306,2,4596,'1.99','2005-07-08 06:41:25','2006-02-15 22:15:48'),(8301,306,2,5581,'2.99','2005-07-10 04:06:06','2006-02-15 22:15:48'),(8302,306,2,6868,'2.99','2005-07-12 20:10:17','2006-02-15 22:15:48'),(8303,306,1,6953,'4.99','2005-07-26 23:52:47','2006-02-15 22:15:48'),(8304,306,1,7225,'6.99','2005-07-27 09:47:12','2006-02-15 22:15:49'),(8305,306,1,7232,'4.99','2005-07-27 10:04:19','2006-02-15 22:15:49'),(8306,306,2,7701,'2.99','2005-07-28 03:54:28','2006-02-15 22:15:49'),(8307,306,2,8620,'0.99','2005-07-29 13:51:20','2006-02-15 22:15:49'),(8308,306,1,8702,'0.99','2005-07-29 17:04:37','2006-02-15 22:15:49'),(8309,306,2,9242,'4.99','2005-07-30 14:03:58','2006-02-15 22:15:49'),(8310,306,2,9395,'4.99','2005-07-30 20:07:06','2006-02-15 22:15:49'),(8311,306,1,9774,'0.99','2005-07-31 09:57:51','2006-02-15 22:15:49'),(8312,306,1,10202,'6.99','2005-08-01 00:43:18','2006-02-15 22:15:49'),(8313,306,2,10893,'5.99','2005-08-02 01:12:13','2006-02-15 22:15:49'),(8314,306,2,11142,'4.99','2005-08-02 09:30:11','2006-02-15 22:15:49'),(8315,306,1,11440,'0.99','2005-08-02 20:24:02','2006-02-15 22:15:49'),(8316,306,2,11674,'6.99','2005-08-17 05:56:27','2006-02-15 22:15:49'),(8317,306,2,11776,'0.99','2005-08-17 10:27:19','2006-02-15 22:15:49'),(8318,306,1,12225,'7.99','2005-08-18 03:00:11','2006-02-15 22:15:49'),(8319,306,1,12989,'2.99','2005-08-19 07:19:04','2006-02-15 22:15:49'),(8320,306,1,13686,'4.99','2005-08-20 08:57:28','2006-02-15 22:15:49'),(8321,306,2,13725,'5.99','2005-08-20 10:08:27','2006-02-15 22:15:49'),(8322,306,1,13873,'0.99','2005-08-20 15:11:11','2006-02-15 22:15:49'),(8323,306,1,13996,'4.99','2005-08-20 19:45:43','2006-02-15 22:15:49'),(8324,306,1,15457,'2.99','2005-08-23 01:07:37','2006-02-15 22:15:49'),(8325,306,2,15868,'7.99','2005-08-23 16:19:14','2006-02-15 22:15:49'),(8326,307,2,413,'4.99','2005-05-27 14:45:37','2006-02-15 22:15:49'),(8327,307,1,535,'4.99','2005-05-28 06:16:32','2006-02-15 22:15:49'),(8328,307,1,614,'1.99','2005-05-28 15:33:28','2006-02-15 22:15:49'),(8329,307,1,970,'6.99','2005-05-30 19:50:28','2006-02-15 22:15:50'),(8330,307,2,2152,'2.99','2005-06-17 22:53:27','2006-02-15 22:15:50'),(8331,307,1,2167,'0.99','2005-06-17 23:51:28','2006-02-15 22:15:50'),(8332,307,1,2787,'4.99','2005-06-19 18:47:00','2006-02-15 22:15:50'),(8333,307,1,2881,'2.99','2005-06-20 01:26:18','2006-02-15 22:15:50'),(8334,307,2,3057,'5.99','2005-06-20 13:22:48','2006-02-15 22:15:50'),(8335,307,1,3209,'4.99','2005-06-21 00:51:06','2006-02-15 22:15:50'),(8336,307,1,3962,'6.99','2005-07-06 22:13:45','2006-02-15 22:15:50'),(8337,307,1,3985,'4.99','2005-07-06 23:24:03','2006-02-15 22:15:50'),(8338,307,1,4522,'2.99','2005-07-08 03:03:12','2006-02-15 22:15:50'),(8339,307,1,4868,'4.99','2005-07-08 19:13:50','2006-02-15 22:15:50'),(8340,307,1,5871,'3.99','2005-07-10 18:46:08','2006-02-15 22:15:50'),(8341,307,2,6125,'6.99','2005-07-11 08:03:35','2006-02-15 22:15:50'),(8342,307,1,6256,'0.99','2005-07-11 15:19:22','2006-02-15 22:15:50'),(8343,307,1,6991,'10.99','2005-07-27 01:03:06','2006-02-15 22:15:50'),(8344,307,1,7536,'2.99','2005-07-27 21:34:09','2006-02-15 22:15:50'),(8345,307,1,7760,'3.99','2005-07-28 06:29:45','2006-02-15 22:15:50'),(8346,307,1,7929,'0.99','2005-07-28 12:16:40','2006-02-15 22:15:50'),(8347,307,1,8647,'6.99','2005-07-29 14:52:59','2006-02-15 22:15:50'),(8348,307,1,10135,'4.99','2005-07-31 21:57:32','2006-02-15 22:15:50'),(8349,307,1,10374,'0.99','2005-08-01 06:25:27','2006-02-15 22:15:50'),(8350,307,1,10745,'2.99','2005-08-01 19:57:06','2006-02-15 22:15:50'),(8351,307,1,11491,'7.99','2005-08-02 22:44:50','2006-02-15 22:15:50'),(8352,307,2,12391,'4.99','2005-08-18 08:52:53','2006-02-15 22:15:50'),(8353,307,2,13365,'6.99','2005-08-19 21:12:37','2006-02-15 22:15:51'),(8354,307,1,14231,'0.99','2005-08-21 05:04:34','2006-02-15 22:15:51'),(8355,307,2,15515,'4.99','2005-08-23 03:03:53','2006-02-15 22:15:51'),(8356,308,2,589,'3.99','2005-05-28 12:27:50','2006-02-15 22:15:51'),(8357,308,1,2037,'0.99','2005-06-17 13:54:20','2006-02-15 22:15:51'),(8358,308,1,2094,'0.99','2005-06-17 18:18:56','2006-02-15 22:15:51'),(8359,308,2,2168,'4.99','2005-06-17 23:53:24','2006-02-15 22:15:51'),(8360,308,1,2346,'7.99','2005-06-18 12:08:16','2006-02-15 22:15:51'),(8361,308,2,2448,'4.99','2005-06-18 19:13:45','2006-02-15 22:15:51'),(8362,308,1,4002,'3.99','2005-07-07 00:08:18','2006-02-15 22:15:51'),(8363,308,1,4285,'8.99','2005-07-07 15:34:35','2006-02-15 22:15:51'),(8364,308,1,5946,'2.99','2005-07-10 22:57:29','2006-02-15 22:15:51'),(8365,308,2,8869,'0.99','2005-07-30 00:06:32','2006-02-15 22:15:51'),(8366,308,1,9479,'2.99','2005-07-30 23:22:09','2006-02-15 22:15:51'),(8367,308,1,9746,'7.99','2005-07-31 09:16:48','2006-02-15 22:15:51'),(8368,308,1,10571,'2.99','2005-08-01 13:25:30','2006-02-15 22:15:51'),(8369,308,2,10797,'0.99','2005-08-01 22:02:51','2006-02-15 22:15:51'),(8370,308,1,10819,'4.99','2005-08-01 22:52:57','2006-02-15 22:15:51'),(8371,308,1,11765,'2.99','2005-08-17 09:55:28','2006-02-15 22:15:51'),(8372,308,1,11972,'4.99','2005-08-17 17:55:46','2006-02-15 22:15:51'),(8373,308,2,12567,'3.99','2005-08-18 15:14:36','2006-02-15 22:15:51'),(8374,308,1,12590,'6.99','2005-08-18 16:11:35','2006-02-15 22:15:51'),(8375,308,2,12838,'6.99','2005-08-19 01:51:50','2006-02-15 22:15:51'),(8376,308,1,13843,'2.99','2005-08-20 14:30:01','2006-02-15 22:15:51'),(8377,308,2,14946,'2.99','2005-08-22 06:07:10','2006-02-15 22:15:51'),(8378,308,1,15243,'4.99','2005-08-22 17:48:28','2006-02-15 22:15:52'),(8379,308,2,15493,'4.99','2005-08-23 02:20:53','2006-02-15 22:15:52'),(8380,308,2,15820,'2.99','2005-08-23 15:03:13','2006-02-15 22:15:52'),(8381,309,2,218,'6.99','2005-05-26 09:27:09','2006-02-15 22:15:52'),(8382,309,2,723,'0.99','2005-05-29 05:34:44','2006-02-15 22:15:52'),(8383,309,1,1837,'4.99','2005-06-16 23:16:15','2006-02-15 22:15:52'),(8384,309,2,2560,'9.99','2005-06-19 03:12:42','2006-02-15 22:15:52'),(8385,309,2,2644,'3.99','2005-06-19 09:42:30','2006-02-15 22:15:52'),(8386,309,2,2688,'6.99','2005-06-19 12:50:56','2006-02-15 22:15:52'),(8387,309,2,3837,'4.99','2005-07-06 16:27:43','2006-02-15 22:15:52'),(8388,309,2,3896,'7.99','2005-07-06 19:09:15','2006-02-15 22:15:52'),(8389,309,2,4172,'4.99','2005-07-07 09:49:09','2006-02-15 22:15:52'),(8390,309,1,4540,'4.99','2005-07-08 04:03:28','2006-02-15 22:15:52'),(8391,309,2,5305,'8.99','2005-07-09 15:55:36','2006-02-15 22:15:52'),(8392,309,1,5980,'4.99','2005-07-11 00:18:21','2006-02-15 22:15:52'),(8393,309,2,6480,'4.99','2005-07-12 01:49:29','2006-02-15 22:15:52'),(8394,309,2,7214,'5.99','2005-07-27 09:23:33','2006-02-15 22:15:52'),(8395,309,2,7722,'4.99','2005-07-28 04:44:58','2006-02-15 22:15:52'),(8396,309,1,7846,'5.99','2005-07-28 09:21:18','2006-02-15 22:15:52'),(8397,309,1,8341,'4.99','2005-07-29 04:42:01','2006-02-15 22:15:52'),(8398,309,1,8501,'2.99','2005-07-29 09:12:51','2006-02-15 22:15:52'),(8399,309,1,8681,'2.99','2005-07-29 16:12:01','2006-02-15 22:15:52'),(8400,309,1,8917,'2.99','2005-07-30 01:47:02','2006-02-15 22:15:52'),(8401,309,2,9945,'2.99','2005-07-31 15:47:51','2006-02-15 22:15:52'),(8402,309,1,9949,'0.99','2005-07-31 15:50:10','2006-02-15 22:15:53'),(8403,309,1,10458,'2.99','2005-08-01 09:19:48','2006-02-15 22:15:53'),(8404,309,1,10728,'0.99','2005-08-01 19:15:09','2006-02-15 22:15:53'),(8405,309,1,10818,'2.99','2005-08-01 22:52:45','2006-02-15 22:15:53'),(8406,309,2,11964,'6.99','2005-08-17 17:37:03','2006-02-15 22:15:53'),(8407,309,2,13021,'5.99','2005-08-19 08:08:04','2006-02-15 22:15:53'),(8408,309,2,13502,'0.99','2005-08-20 01:58:15','2006-02-15 22:15:53'),(8409,309,2,13909,'4.99','2005-08-20 16:26:36','2006-02-15 22:15:53'),(8410,309,2,14846,'5.99','2005-08-22 02:13:48','2006-02-15 22:15:53'),(8411,309,2,15422,'4.99','2005-08-22 23:58:09','2006-02-15 22:15:53'),(8412,310,2,104,'0.99','2005-05-25 17:46:33','2006-02-15 22:15:53'),(8413,310,2,1162,'4.99','2005-06-14 23:09:38','2006-02-15 22:15:53'),(8414,310,2,1333,'2.99','2005-06-15 11:37:08','2006-02-15 22:15:53'),(8415,310,2,1918,'3.99','2005-06-17 05:40:14','2006-02-15 22:15:53'),(8416,310,2,2088,'6.99','2005-06-17 17:35:30','2006-02-15 22:15:53'),(8417,310,1,2480,'5.99','2005-06-18 21:04:09','2006-02-15 22:15:53'),(8418,310,1,2618,'2.99','2005-06-19 08:03:01','2006-02-15 22:15:53'),(8419,310,2,3830,'10.99','2005-07-06 16:01:16','2006-02-15 22:15:53'),(8420,310,1,4072,'0.99','2005-07-07 04:48:02','2006-02-15 22:15:53'),(8421,310,1,5621,'5.99','2005-07-10 05:34:10','2006-02-15 22:15:53'),(8422,310,2,5836,'0.99','2005-07-10 16:49:02','2006-02-15 22:15:53'),(8423,310,1,7648,'5.99','2005-07-28 01:35:33','2006-02-15 22:15:53'),(8424,310,2,8637,'5.99','2005-07-29 14:30:11','2006-02-15 22:15:53'),(8425,310,1,8981,'7.99','2005-07-30 04:25:30','2006-02-15 22:15:53'),(8426,310,1,9536,'2.99','2005-07-31 01:19:02','2006-02-15 22:15:53'),(8427,310,2,11137,'2.99','2005-08-02 09:25:31','2006-02-15 22:15:54'),(8428,310,2,12500,'4.99','2005-08-18 13:05:51','2006-02-15 22:15:54'),(8429,310,2,12710,'7.99','2005-08-18 21:02:50','2006-02-15 22:15:54'),(8430,310,1,12929,'4.99','2005-08-19 05:05:23','2006-02-15 22:15:54'),(8431,310,1,14972,'5.99','2005-08-22 06:53:21','2006-02-15 22:15:54'),(8432,311,2,274,'5.99','2005-05-26 16:48:51','2006-02-15 22:15:54'),(8433,311,2,544,'6.99','2005-05-28 07:03:00','2006-02-15 22:15:54'),(8434,311,1,952,'2.99','2005-05-30 16:28:07','2006-02-15 22:15:54'),(8435,311,2,990,'3.99','2005-05-30 23:25:14','2006-02-15 22:15:54'),(8436,311,2,1128,'6.99','2005-05-31 17:49:26','2006-02-15 22:15:54'),(8437,311,1,1622,'4.99','2005-06-16 07:33:18','2006-02-15 22:15:54'),(8438,311,2,1955,'0.99','2005-06-17 08:40:22','2006-02-15 22:15:54'),(8439,311,2,2967,'6.99','2005-06-20 07:40:35','2006-02-15 22:15:54'),(8440,311,2,4836,'3.99','2005-07-08 18:09:08','2006-02-15 22:15:54'),(8441,311,2,5224,'5.99','2005-07-09 12:07:27','2006-02-15 22:15:54'),(8442,311,2,6419,'4.99','2005-07-11 23:36:38','2006-02-15 22:15:54'),(8443,311,2,8167,'6.99','2005-07-28 21:25:45','2006-02-15 22:15:54'),(8444,311,1,8473,'2.99','2005-07-29 08:36:53','2006-02-15 22:15:54'),(8445,311,1,9503,'6.99','2005-07-31 00:02:38','2006-02-15 22:15:54'),(8446,311,2,9882,'8.99','2005-07-31 13:53:33','2006-02-15 22:15:54'),(8447,311,1,10134,'4.99','2005-07-31 21:56:10','2006-02-15 22:15:54'),(8448,311,2,10448,'4.99','2005-08-01 09:09:31','2006-02-15 22:15:54'),(8449,311,1,12997,'2.99','2005-08-19 07:31:46','2006-02-15 22:15:54'),(8450,311,2,13310,'0.99','2005-08-19 19:05:16','2006-02-15 22:15:54'),(8451,311,2,13423,'1.99','2005-08-19 23:07:42','2006-02-15 22:15:55'),(8452,311,2,14517,'4.99','2005-08-21 14:57:03','2006-02-15 22:15:55'),(8453,311,2,15826,'9.99','2005-08-23 15:15:02','2006-02-15 22:15:55'),(8454,311,1,16020,'8.99','2005-08-23 21:34:33','2006-02-15 22:15:55'),(8455,312,2,229,'4.99','2005-05-26 11:19:20','2006-02-15 22:15:55'),(8456,312,1,530,'0.99','2005-05-28 05:13:01','2006-02-15 22:15:55'),(8457,312,2,1049,'4.99','2005-05-31 06:57:04','2006-02-15 22:15:55'),(8458,312,2,1079,'6.99','2005-05-31 10:48:17','2006-02-15 22:15:55'),(8459,312,2,1419,'0.99','2005-06-15 17:54:50','2006-02-15 22:15:55'),(8460,312,2,3457,'3.99','2005-06-21 21:42:33','2006-02-15 22:15:55'),(8461,312,1,3766,'2.99','2005-07-06 13:04:35','2006-02-15 22:15:55'),(8462,312,1,3792,'1.99','2005-07-06 14:26:38','2006-02-15 22:15:55'),(8463,312,1,4647,'3.99','2005-07-08 09:27:36','2006-02-15 22:15:55'),(8464,312,1,5031,'5.99','2005-07-09 02:36:37','2006-02-15 22:15:55'),(8465,312,2,6751,'2.99','2005-07-12 14:50:34','2006-02-15 22:15:55'),(8466,312,1,6866,'2.99','2005-07-12 20:03:44','2006-02-15 22:15:55'),(8467,312,1,8137,'4.99','2005-07-28 20:07:18','2006-02-15 22:15:55'),(8468,312,1,8412,'6.99','2005-07-29 06:44:50','2006-02-15 22:15:55'),(8469,312,1,8721,'4.99','2005-07-29 17:56:21','2006-02-15 22:15:55'),(8470,312,1,9016,'6.99','2005-07-30 05:26:13','2006-02-15 22:15:55'),(8471,312,1,9154,'3.99','2005-07-30 10:59:54','2006-02-15 22:15:55'),(8472,312,2,10858,'2.99','2005-08-02 00:08:39','2006-02-15 22:15:55'),(8473,312,2,11248,'0.99','2005-08-02 13:35:34','2006-02-15 22:15:55'),(8474,312,2,11879,'5.99','2005-08-17 14:25:09','2006-02-15 22:15:55'),(8475,312,1,12186,'2.99','2005-08-18 01:43:36','2006-02-15 22:15:56'),(8476,312,1,12945,'0.99','2005-08-19 05:51:46','2006-02-15 22:15:56'),(8477,312,2,14362,'2.99','2005-08-21 09:19:49','2006-02-15 22:15:56'),(8478,312,1,14504,'3.99','2005-08-21 14:23:01','2006-02-15 22:15:56'),(8479,312,1,15100,'4.99','2005-08-22 11:55:03','2006-02-15 22:15:56'),(8480,312,1,15882,'6.99','2005-08-23 16:44:31','2006-02-15 22:15:56'),(8481,313,2,669,'4.99','2005-05-28 22:03:25','2006-02-15 22:15:56'),(8482,313,2,712,'2.99','2005-05-29 04:02:24','2006-02-15 22:15:56'),(8483,313,2,781,'0.99','2005-05-29 14:23:58','2006-02-15 22:15:56'),(8484,313,2,843,'0.99','2005-05-30 00:44:24','2006-02-15 22:15:56'),(8485,313,2,1312,'2.99','2005-06-15 10:16:27','2006-02-15 22:15:56'),(8486,313,1,2617,'7.99','2005-06-19 07:48:31','2006-02-15 22:15:56'),(8487,313,2,2711,'4.99','2005-06-19 14:12:22','2006-02-15 22:15:56'),(8488,313,2,4552,'2.99','2005-07-08 04:36:35','2006-02-15 22:15:56'),(8489,313,1,5255,'5.99','2005-07-09 13:51:08','2006-02-15 22:15:56'),(8490,313,1,6384,'2.99','2005-07-11 22:07:26','2006-02-15 22:15:56'),(8491,313,2,7294,'0.99','2005-07-27 12:38:14','2006-02-15 22:15:56'),(8492,313,2,8381,'4.99','2005-07-29 05:31:44','2006-02-15 22:15:56'),(8493,313,1,8970,'3.99','2005-07-30 04:02:05','2006-02-15 22:15:56'),(8494,313,2,9836,'2.99','2005-07-31 12:12:00','2006-02-15 22:15:56'),(8495,313,2,10237,'5.99','2005-08-01 02:07:32','2006-02-15 22:15:56'),(8496,313,2,10933,'7.99','2005-08-02 02:50:49','2006-02-15 22:15:56'),(8497,313,2,11854,'2.99','2005-08-17 13:42:52','2006-02-15 22:15:56'),(8498,313,2,12011,'2.99','2005-08-17 19:19:44','2006-02-15 22:15:56'),(8499,313,2,14250,'2.99','2005-08-21 05:39:35','2006-02-15 22:15:56'),(8500,313,1,14325,'4.99','2005-08-21 08:15:38','2006-02-15 22:15:57'),(8501,313,2,15081,'2.99','2005-08-22 11:14:31','2006-02-15 22:15:57'),(8502,313,1,15340,'0.99','2005-08-22 20:55:56','2006-02-15 22:15:57'),(8503,313,2,15569,'6.99','2005-08-23 05:24:29','2006-02-15 22:15:57'),(8504,314,1,80,'5.99','2005-05-25 12:12:07','2006-02-15 22:15:57'),(8505,314,1,440,'4.99','2005-05-27 18:00:35','2006-02-15 22:15:57'),(8506,314,1,1598,'3.99','2005-06-16 06:02:39','2006-02-15 22:15:57'),(8507,314,1,1624,'2.99','2005-06-16 07:48:57','2006-02-15 22:15:57'),(8508,314,1,3517,'0.99','2005-07-06 00:52:35','2006-02-15 22:15:57'),(8509,314,1,3656,'2.99','2005-07-06 07:55:22','2006-02-15 22:15:57'),(8510,314,1,3808,'0.99','2005-07-06 15:15:35','2006-02-15 22:15:57'),(8511,314,2,4386,'0.99','2005-07-07 20:55:19','2006-02-15 22:15:57'),(8512,314,2,5241,'4.99','2005-07-09 13:19:14','2006-02-15 22:15:57'),(8513,314,2,5856,'0.99','2005-07-10 17:57:32','2006-02-15 22:15:57'),(8514,314,1,6192,'5.99','2005-07-11 11:44:41','2006-02-15 22:15:57'),(8515,314,1,6666,'2.99','2005-07-12 11:32:15','2006-02-15 22:15:57'),(8516,314,1,6763,'3.99','2005-07-12 15:26:34','2006-02-15 22:15:57'),(8517,314,2,7004,'4.99','2005-07-27 01:36:05','2006-02-15 22:15:57'),(8518,314,1,7276,'2.99','2005-07-27 11:41:57','2006-02-15 22:15:57'),(8519,314,2,8022,'6.99','2005-07-28 15:48:56','2006-02-15 22:15:57'),(8520,314,1,8073,'3.99','2005-07-28 17:29:02','2006-02-15 22:15:57'),(8521,314,2,8105,'0.99','2005-07-28 18:59:46','2006-02-15 22:15:57'),(8522,314,2,8328,'6.99','2005-07-29 04:06:24','2006-02-15 22:15:57'),(8523,314,2,8644,'4.99','2005-07-29 14:45:45','2006-02-15 22:15:57'),(8524,314,2,9191,'3.99','2005-07-30 12:25:51','2006-02-15 22:15:58'),(8525,314,2,9318,'6.99','2005-07-30 17:14:30','2006-02-15 22:15:58'),(8526,314,2,11908,'3.99','2005-08-17 15:43:09','2006-02-15 22:15:58'),(8527,314,1,12434,'0.99','2005-08-18 10:38:08','2006-02-15 22:15:58'),(8528,314,2,13120,'3.99','2005-08-19 11:47:38','2006-02-15 22:15:58'),(8529,314,1,13265,'2.99','2005-08-19 17:29:00','2006-02-15 22:15:58'),(8530,314,2,13553,'3.99','2005-08-20 04:07:21','2006-02-15 22:15:58'),(8531,314,2,14145,'4.99','2005-08-21 02:11:38','2006-02-15 22:15:58'),(8532,314,1,14409,'4.99','2005-08-21 10:53:35','2006-02-15 22:15:58'),(8533,314,2,14682,'4.99','2005-08-21 20:25:57','2006-02-15 22:15:58'),(8534,314,2,14815,'4.99','2005-08-22 01:12:44','2006-02-15 22:15:58'),(8535,314,2,14873,'5.99','2005-08-22 03:31:06','2006-02-15 22:15:58'),(8536,314,2,16021,'3.99','2005-08-23 21:37:59','2006-02-15 22:15:58'),(8537,315,1,537,'8.99','2005-05-28 06:20:55','2006-02-15 22:15:58'),(8538,315,1,551,'4.99','2005-05-28 07:44:18','2006-02-15 22:15:58'),(8539,315,1,1701,'2.99','2005-06-16 13:18:48','2006-02-15 22:15:58'),(8540,315,1,4021,'2.99','2005-07-07 01:46:44','2006-02-15 22:15:58'),(8541,315,1,4992,'4.99','2005-07-09 00:49:37','2006-02-15 22:15:58'),(8542,315,2,5126,'6.99','2005-07-09 07:25:35','2006-02-15 22:15:58'),(8543,315,1,6661,'4.99','2005-07-12 11:20:39','2006-02-15 22:15:58'),(8544,315,1,6894,'4.99','2005-07-12 21:20:50','2006-02-15 22:15:58'),(8545,315,1,8416,'5.99','2005-07-29 06:52:54','2006-02-15 22:15:58'),(8546,315,2,8677,'6.99','2005-07-29 16:01:13','2006-02-15 22:15:58'),(8547,315,2,9735,'9.99','2005-07-31 08:57:49','2006-02-15 22:15:58'),(8548,315,2,11254,'0.99','2005-08-02 13:43:49','2006-02-15 22:15:59'),(8549,315,2,12155,'2.99','2005-08-18 00:24:30','2006-02-15 22:15:59'),(8550,315,1,14106,'2.99','2005-08-21 00:46:01','2006-02-15 22:15:59'),(8551,315,2,14162,'2.99','2005-08-21 02:55:34','2006-02-15 22:15:59'),(8552,315,1,15504,'6.99','2005-08-23 02:45:21','2006-02-15 22:15:59'),(8553,315,2,14426,'2.99','2006-02-14 15:16:03','2006-02-15 22:15:59'),(8554,316,1,16,'4.99','2005-05-25 00:43:11','2006-02-15 22:15:59'),(8555,316,1,644,'8.99','2005-05-28 18:59:12','2006-02-15 22:15:59'),(8556,316,1,1065,'1.99','2005-05-31 08:54:56','2006-02-15 22:15:59'),(8557,316,1,1317,'4.99','2005-06-15 10:30:19','2006-02-15 22:15:59'),(8558,316,2,1350,'4.99','2005-06-15 12:50:25','2006-02-15 22:15:59'),(8559,316,1,2032,'4.99','2005-06-17 13:24:07','2006-02-15 22:15:59'),(8560,316,2,2338,'4.99','2005-06-18 11:24:54','2006-02-15 22:15:59'),(8561,316,2,2491,'1.99','2005-06-18 22:01:31','2006-02-15 22:15:59'),(8562,316,1,2820,'4.99','2005-06-19 20:20:33','2006-02-15 22:15:59'),(8563,316,2,3373,'8.99','2005-06-21 13:35:32','2006-02-15 22:15:59'),(8564,316,1,4379,'2.99','2005-07-07 20:32:30','2006-02-15 22:15:59'),(8565,316,2,5102,'3.99','2005-07-09 06:25:48','2006-02-15 22:15:59'),(8566,316,2,5544,'7.99','2005-07-10 02:48:07','2006-02-15 22:15:59'),(8567,316,1,5618,'5.99','2005-07-10 05:28:58','2006-02-15 22:15:59'),(8568,316,2,6988,'4.99','2005-07-27 01:00:08','2006-02-15 22:15:59'),(8569,316,2,7339,'2.99','2005-07-27 14:17:48','2006-02-15 22:15:59'),(8570,316,2,7586,'2.99','2005-07-27 23:19:29','2006-02-15 22:15:59'),(8571,316,1,7592,'4.99','2005-07-27 23:26:04','2006-02-15 22:15:59'),(8572,316,1,7945,'1.99','2005-07-28 12:53:58','2006-02-15 22:15:59'),(8573,316,1,8564,'4.99','2005-07-29 11:33:00','2006-02-15 22:16:00'),(8574,316,1,9508,'4.99','2005-07-31 00:22:39','2006-02-15 22:16:00'),(8575,316,2,9903,'6.99','2005-07-31 14:31:44','2006-02-15 22:16:00'),(8576,316,1,10438,'7.99','2005-08-01 08:53:04','2006-02-15 22:16:00'),(8577,316,1,12028,'0.99','2005-08-17 20:03:47','2006-02-15 22:16:00'),(8578,316,2,12191,'0.99','2005-08-18 01:57:11','2006-02-15 22:16:00'),(8579,316,2,12823,'2.99','2005-08-19 01:15:47','2006-02-15 22:16:00'),(8580,316,2,13277,'5.99','2005-08-19 17:57:35','2006-02-15 22:16:00'),(8581,316,1,14226,'2.99','2005-08-21 04:55:37','2006-02-15 22:16:00'),(8582,316,2,15840,'2.99','2005-08-23 15:34:49','2006-02-15 22:16:00'),(8583,317,1,107,'6.99','2005-05-25 18:28:09','2006-02-15 22:16:00'),(8584,317,2,2287,'6.99','2005-06-18 07:04:36','2006-02-15 22:16:00'),(8585,317,2,3029,'2.99','2005-06-20 11:51:30','2006-02-15 22:16:00'),(8586,317,1,3251,'0.99','2005-06-21 03:20:37','2006-02-15 22:16:00'),(8587,317,1,4138,'0.99','2005-07-07 08:17:13','2006-02-15 22:16:00'),(8588,317,1,4177,'8.99','2005-07-07 10:12:36','2006-02-15 22:16:00'),(8589,317,2,4700,'0.99','2005-07-08 11:37:21','2006-02-15 22:16:00'),(8590,317,1,5548,'0.99','2005-07-10 02:56:45','2006-02-15 22:16:00'),(8591,317,2,5942,'7.99','2005-07-10 22:47:17','2006-02-15 22:16:00'),(8592,317,1,7309,'2.99','2005-07-27 13:00:29','2006-02-15 22:16:00'),(8593,317,2,8062,'2.99','2005-07-28 17:15:06','2006-02-15 22:16:00'),(8594,317,1,8327,'2.99','2005-07-29 04:00:52','2006-02-15 22:16:00'),(8595,317,1,8458,'4.99','2005-07-29 08:05:09','2006-02-15 22:16:00'),(8596,317,1,9110,'2.99','2005-07-30 09:05:42','2006-02-15 22:16:01'),(8597,317,2,9513,'4.99','2005-07-31 00:28:30','2006-02-15 22:16:01'),(8598,317,1,9770,'8.99','2005-07-31 09:52:40','2006-02-15 22:16:01'),(8599,317,1,10364,'2.99','2005-08-01 06:06:49','2006-02-15 22:16:01'),(8600,317,2,12111,'2.99','2005-08-17 22:59:55','2006-02-15 22:16:01'),(8601,317,2,12138,'7.99','2005-08-17 23:55:54','2006-02-15 22:16:01'),(8602,317,2,12301,'2.99','2005-08-18 05:36:20','2006-02-15 22:16:01'),(8603,317,1,13388,'4.99','2005-08-19 21:46:49','2006-02-15 22:16:01'),(8604,317,1,14032,'5.99','2005-08-20 21:26:55','2006-02-15 22:16:01'),(8605,317,2,14385,'0.99','2005-08-21 10:02:55','2006-02-15 22:16:01'),(8606,317,2,14669,'2.99','2005-08-21 19:54:06','2006-02-15 22:16:01'),(8607,317,1,14791,'4.99','2005-08-22 00:35:55','2006-02-15 22:16:01'),(8608,317,1,15204,'2.99','2005-08-22 16:30:43','2006-02-15 22:16:01'),(8609,317,1,15280,'4.99','2005-08-22 19:09:52','2006-02-15 22:16:01'),(8610,317,1,12574,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:01'),(8611,318,1,224,'9.99','2005-05-26 10:18:27','2006-02-15 22:16:01'),(8612,318,1,2634,'2.99','2005-06-19 08:55:17','2006-02-15 22:16:01'),(8613,318,1,2643,'2.99','2005-06-19 09:39:27','2006-02-15 22:16:01'),(8614,318,2,3337,'0.99','2005-06-21 10:24:35','2006-02-15 22:16:01'),(8615,318,2,3376,'7.99','2005-06-21 13:43:02','2006-02-15 22:16:01'),(8616,318,1,3732,'4.99','2005-07-06 11:33:37','2006-02-15 22:16:01'),(8617,318,2,3974,'2.99','2005-07-06 22:59:16','2006-02-15 22:16:01'),(8618,318,1,4356,'8.99','2005-07-07 19:21:22','2006-02-15 22:16:01'),(8619,318,1,7649,'0.99','2005-07-28 01:37:26','2006-02-15 22:16:01'),(8620,318,2,7853,'0.99','2005-07-28 09:36:38','2006-02-15 22:16:02'),(8621,318,2,10023,'5.99','2005-07-31 18:25:51','2006-02-15 22:16:02'),(8622,318,1,14276,'2.99','2005-08-21 06:34:05','2006-02-15 22:16:02'),(8623,319,1,15,'9.99','2005-05-25 00:39:22','2006-02-15 22:16:02'),(8624,319,1,149,'3.99','2005-05-26 00:28:05','2006-02-15 22:16:02'),(8625,319,1,439,'2.99','2005-05-27 17:54:48','2006-02-15 22:16:02'),(8626,319,1,1632,'2.99','2005-06-16 08:03:42','2006-02-15 22:16:02'),(8627,319,1,1892,'4.99','2005-06-17 04:17:33','2006-02-15 22:16:02'),(8628,319,2,2021,'3.99','2005-06-17 12:41:18','2006-02-15 22:16:02'),(8629,319,2,2703,'4.99','2005-06-19 13:36:06','2006-02-15 22:16:02'),(8630,319,2,2884,'0.99','2005-06-20 01:31:16','2006-02-15 22:16:02'),(8631,319,2,3256,'3.99','2005-06-21 03:45:42','2006-02-15 22:16:02'),(8632,319,2,4119,'3.99','2005-07-07 07:06:03','2006-02-15 22:16:02'),(8633,319,2,4295,'2.99','2005-07-07 16:08:51','2006-02-15 22:16:02'),(8634,319,1,4630,'4.99','2005-07-08 08:33:38','2006-02-15 22:16:02'),(8635,319,1,5791,'8.99','2005-07-10 14:16:22','2006-02-15 22:16:02'),(8636,319,1,5882,'2.99','2005-07-10 19:20:34','2006-02-15 22:16:02'),(8637,319,2,6132,'2.99','2005-07-11 08:24:44','2006-02-15 22:16:02'),(8638,319,1,6195,'4.99','2005-07-11 12:00:32','2006-02-15 22:16:02'),(8639,319,1,6255,'4.99','2005-07-11 15:11:33','2006-02-15 22:16:02'),(8640,319,1,6485,'6.99','2005-07-12 02:07:59','2006-02-15 22:16:02'),(8641,319,2,7953,'2.99','2005-07-28 13:24:32','2006-02-15 22:16:02'),(8642,319,2,9017,'4.99','2005-07-30 05:26:20','2006-02-15 22:16:02'),(8643,319,2,9044,'0.99','2005-07-30 06:35:21','2006-02-15 22:16:02'),(8644,319,1,11575,'0.99','2005-08-17 01:50:26','2006-02-15 22:16:03'),(8645,319,2,11598,'0.99','2005-08-17 03:03:07','2006-02-15 22:16:03'),(8646,319,1,11955,'6.99','2005-08-17 17:21:35','2006-02-15 22:16:03'),(8647,319,2,11994,'2.99','2005-08-17 18:29:35','2006-02-15 22:16:03'),(8648,319,1,12018,'4.99','2005-08-17 19:44:46','2006-02-15 22:16:03'),(8649,319,2,12424,'8.99','2005-08-18 10:16:57','2006-02-15 22:16:03'),(8650,319,1,13548,'3.99','2005-08-20 03:53:20','2006-02-15 22:16:03'),(8651,319,2,14828,'4.99','2005-08-22 01:34:05','2006-02-15 22:16:03'),(8652,319,2,15396,'5.99','2005-08-22 23:07:57','2006-02-15 22:16:03'),(8653,320,2,1258,'4.99','2005-06-15 06:21:30','2006-02-15 22:16:03'),(8654,320,2,1484,'3.99','2005-06-15 21:22:35','2006-02-15 22:16:03'),(8655,320,2,1567,'1.99','2005-06-16 03:13:30','2006-02-15 22:16:03'),(8656,320,1,2216,'4.99','2005-06-18 03:08:17','2006-02-15 22:16:03'),(8657,320,2,2883,'7.99','2005-06-20 01:29:10','2006-02-15 22:16:03'),(8658,320,2,3519,'0.99','2005-07-06 00:57:29','2006-02-15 22:16:03'),(8659,320,2,3756,'4.99','2005-07-06 12:40:38','2006-02-15 22:16:03'),(8660,320,2,4173,'2.99','2005-07-07 09:57:26','2006-02-15 22:16:03'),(8661,320,2,7057,'4.99','2005-07-27 03:50:03','2006-02-15 22:16:03'),(8662,320,2,7064,'3.99','2005-07-27 03:53:29','2006-02-15 22:16:03'),(8663,320,2,7930,'4.99','2005-07-28 12:21:08','2006-02-15 22:16:03'),(8664,320,2,8144,'4.99','2005-07-28 20:30:55','2006-02-15 22:16:03'),(8665,320,2,8235,'4.99','2005-07-29 00:22:56','2006-02-15 22:16:03'),(8666,320,1,8238,'0.99','2005-07-29 00:30:06','2006-02-15 22:16:03'),(8667,320,2,8794,'4.99','2005-07-29 20:59:38','2006-02-15 22:16:03'),(8668,320,1,9509,'0.99','2005-07-31 00:22:42','2006-02-15 22:16:04'),(8669,320,1,11208,'0.99','2005-08-02 12:02:37','2006-02-15 22:16:04'),(8670,320,2,11560,'2.99','2005-08-17 01:20:30','2006-02-15 22:16:04'),(8671,320,2,14171,'0.99','2005-08-21 03:00:42','2006-02-15 22:16:04'),(8672,320,1,15302,'2.99','2005-08-22 19:44:53','2006-02-15 22:16:04'),(8673,321,2,200,'4.99','2005-05-26 07:12:21','2006-02-15 22:16:04'),(8674,321,1,620,'5.99','2005-05-28 15:54:45','2006-02-15 22:16:04'),(8675,321,2,818,'4.99','2005-05-29 20:47:53','2006-02-15 22:16:04'),(8676,321,2,1750,'5.99','2005-06-16 16:57:36','2006-02-15 22:16:04'),(8677,321,1,3410,'0.99','2005-06-21 16:20:47','2006-02-15 22:16:04'),(8678,321,2,3901,'5.99','2005-07-06 19:24:55','2006-02-15 22:16:04'),(8679,321,1,3920,'4.99','2005-07-06 20:26:40','2006-02-15 22:16:04'),(8680,321,2,4281,'4.99','2005-07-07 15:17:50','2006-02-15 22:16:04'),(8681,321,1,4318,'5.99','2005-07-07 17:47:50','2006-02-15 22:16:04'),(8682,321,2,5202,'2.99','2005-07-09 10:53:48','2006-02-15 22:16:04'),(8683,321,2,5867,'8.99','2005-07-10 18:39:01','2006-02-15 22:16:04'),(8684,321,2,6190,'2.99','2005-07-11 11:36:18','2006-02-15 22:16:04'),(8685,321,1,6859,'5.99','2005-07-12 19:53:57','2006-02-15 22:16:04'),(8686,321,2,8685,'6.99','2005-07-29 16:17:05','2006-02-15 22:16:04'),(8687,321,1,9981,'0.99','2005-07-31 17:08:31','2006-02-15 22:16:04'),(8688,321,1,11722,'2.99','2005-08-17 07:53:03','2006-02-15 22:16:04'),(8689,321,1,12033,'6.99','2005-08-17 20:14:34','2006-02-15 22:16:04'),(8690,321,2,12034,'7.99','2005-08-17 20:15:31','2006-02-15 22:16:04'),(8691,321,1,12398,'4.99','2005-08-18 09:13:24','2006-02-15 22:16:04'),(8692,321,2,13623,'6.99','2005-08-20 06:49:46','2006-02-15 22:16:05'),(8693,321,1,15673,'6.99','2005-08-23 09:12:50','2006-02-15 22:16:05'),(8694,321,2,15888,'5.99','2005-08-23 16:56:14','2006-02-15 22:16:05'),(8695,322,2,166,'0.99','2005-05-26 02:49:11','2006-02-15 22:16:05'),(8696,322,1,269,'4.99','2005-05-26 16:19:46','2006-02-15 22:16:05'),(8697,322,1,1386,'2.99','2005-06-15 15:38:58','2006-02-15 22:16:05'),(8698,322,1,1588,'8.99','2005-06-16 04:53:21','2006-02-15 22:16:05'),(8699,322,2,2481,'4.99','2005-06-18 21:08:30','2006-02-15 22:16:05'),(8700,322,1,2554,'0.99','2005-06-19 03:05:38','2006-02-15 22:16:05'),(8701,322,1,2983,'7.99','2005-06-20 08:41:42','2006-02-15 22:16:05'),(8702,322,2,3054,'5.99','2005-06-20 13:16:41','2006-02-15 22:16:05'),(8703,322,2,3413,'8.99','2005-06-21 16:57:07','2006-02-15 22:16:05'),(8704,322,1,3478,'0.99','2005-07-05 23:05:44','2006-02-15 22:16:05'),(8705,322,2,3627,'1.99','2005-07-06 06:19:25','2006-02-15 22:16:05'),(8706,322,1,3646,'4.99','2005-07-06 07:28:59','2006-02-15 22:16:05'),(8707,322,2,6033,'2.99','2005-07-11 02:59:34','2006-02-15 22:16:05'),(8708,322,1,6511,'3.99','2005-07-12 03:39:29','2006-02-15 22:16:05'),(8709,322,2,6673,'0.99','2005-07-12 11:50:56','2006-02-15 22:16:05'),(8710,322,2,6709,'4.99','2005-07-12 13:20:41','2006-02-15 22:16:05'),(8711,322,1,7091,'4.99','2005-07-27 04:44:10','2006-02-15 22:16:05'),(8712,322,2,8142,'4.99','2005-07-28 20:21:54','2006-02-15 22:16:05'),(8713,322,1,9104,'7.99','2005-07-30 08:49:55','2006-02-15 22:16:05'),(8714,322,1,9115,'4.99','2005-07-30 09:13:55','2006-02-15 22:16:05'),(8715,322,1,9252,'1.99','2005-07-30 14:19:59','2006-02-15 22:16:05'),(8716,322,2,11120,'4.99','2005-08-02 08:47:04','2006-02-15 22:16:06'),(8717,322,2,11456,'0.99','2005-08-02 21:14:04','2006-02-15 22:16:06'),(8718,322,2,13180,'4.99','2005-08-19 14:00:38','2006-02-15 22:16:06'),(8719,322,1,13650,'9.99','2005-08-20 07:49:06','2006-02-15 22:16:06'),(8720,322,2,14042,'4.99','2005-08-20 21:45:51','2006-02-15 22:16:06'),(8721,322,1,15450,'0.99','2005-08-23 00:56:01','2006-02-15 22:16:06'),(8722,322,2,15703,'8.99','2005-08-23 10:23:48','2006-02-15 22:16:06'),(8723,323,1,58,'4.99','2005-05-25 08:53:14','2006-02-15 22:16:06'),(8724,323,2,729,'2.99','2005-05-29 06:35:13','2006-02-15 22:16:06'),(8725,323,1,878,'5.99','2005-05-30 05:49:13','2006-02-15 22:16:06'),(8726,323,2,1167,'0.99','2005-06-14 23:25:58','2006-02-15 22:16:06'),(8727,323,2,1786,'2.99','2005-06-16 19:30:54','2006-02-15 22:16:06'),(8728,323,1,2933,'4.99','2005-06-20 04:52:23','2006-02-15 22:16:06'),(8729,323,2,3704,'6.99','2005-07-06 10:16:45','2006-02-15 22:16:06'),(8730,323,2,4572,'1.99','2005-07-08 05:36:59','2006-02-15 22:16:06'),(8731,323,2,5669,'4.99','2005-07-10 08:12:53','2006-02-15 22:16:06'),(8732,323,2,5906,'1.99','2005-07-10 20:41:41','2006-02-15 22:16:06'),(8733,323,1,6840,'3.99','2005-07-12 19:03:22','2006-02-15 22:16:06'),(8734,323,2,7146,'7.99','2005-07-27 07:02:30','2006-02-15 22:16:06'),(8735,323,2,7275,'2.99','2005-07-27 11:39:08','2006-02-15 22:16:06'),(8736,323,2,7695,'5.99','2005-07-28 03:41:13','2006-02-15 22:16:06'),(8737,323,1,7847,'1.99','2005-07-28 09:23:14','2006-02-15 22:16:06'),(8738,323,2,7937,'4.99','2005-07-28 12:38:22','2006-02-15 22:16:06'),(8739,323,2,8474,'0.99','2005-07-29 08:36:56','2006-02-15 22:16:07'),(8740,323,1,8790,'0.99','2005-07-29 20:51:41','2006-02-15 22:16:07'),(8741,323,1,9363,'2.99','2005-07-30 18:44:23','2006-02-15 22:16:07'),(8742,323,2,10002,'4.99','2005-07-31 17:48:16','2006-02-15 22:16:07'),(8743,323,1,10028,'4.99','2005-07-31 18:35:54','2006-02-15 22:16:07'),(8744,323,1,10298,'0.99','2005-08-01 04:06:03','2006-02-15 22:16:07'),(8745,323,1,10994,'3.99','2005-08-02 04:46:53','2006-02-15 22:16:07'),(8746,323,2,11548,'0.99','2005-08-17 00:59:47','2006-02-15 22:16:07'),(8747,323,1,12120,'4.99','2005-08-17 23:16:46','2006-02-15 22:16:07'),(8748,323,1,12169,'2.99','2005-08-18 01:05:54','2006-02-15 22:16:07'),(8749,323,1,13140,'5.99','2005-08-19 12:35:56','2006-02-15 22:16:07'),(8750,323,1,14224,'2.99','2005-08-21 04:53:08','2006-02-15 22:16:07'),(8751,323,1,14957,'3.99','2005-08-22 06:29:34','2006-02-15 22:16:07'),(8752,323,1,15387,'4.99','2005-08-22 22:49:13','2006-02-15 22:16:07'),(8753,323,1,15728,'0.99','2005-08-23 11:30:32','2006-02-15 22:16:07'),(8754,324,2,563,'3.99','2005-05-28 09:10:49','2006-02-15 22:16:07'),(8755,324,1,1740,'0.99','2005-06-16 16:29:00','2006-02-15 22:16:07'),(8756,324,2,2590,'2.99','2005-06-19 05:31:40','2006-02-15 22:16:07'),(8757,324,1,3947,'4.99','2005-07-06 21:42:21','2006-02-15 22:16:07'),(8758,324,1,4197,'0.99','2005-07-07 11:07:52','2006-02-15 22:16:07'),(8759,324,2,4368,'4.99','2005-07-07 19:55:19','2006-02-15 22:16:07'),(8760,324,2,5702,'2.99','2005-07-10 10:00:01','2006-02-15 22:16:07'),(8761,324,1,5778,'0.99','2005-07-10 13:41:37','2006-02-15 22:16:07'),(8762,324,1,6034,'2.99','2005-07-11 03:00:50','2006-02-15 22:16:07'),(8763,324,2,6299,'4.99','2005-07-11 17:45:08','2006-02-15 22:16:08'),(8764,324,2,7240,'3.99','2005-07-27 10:21:15','2006-02-15 22:16:08'),(8765,324,1,7263,'7.99','2005-07-27 11:17:22','2006-02-15 22:16:08'),(8766,324,2,7960,'6.99','2005-07-28 13:47:08','2006-02-15 22:16:08'),(8767,324,1,8698,'3.99','2005-07-29 16:52:17','2006-02-15 22:16:08'),(8768,324,1,9651,'4.99','2005-07-31 05:48:49','2006-02-15 22:16:08'),(8769,324,2,10212,'2.99','2005-08-01 01:01:35','2006-02-15 22:16:08'),(8770,324,1,11617,'2.99','2005-08-17 04:00:40','2006-02-15 22:16:08'),(8771,324,1,11771,'6.99','2005-08-17 10:17:09','2006-02-15 22:16:08'),(8772,324,2,12543,'2.99','2005-08-18 14:23:55','2006-02-15 22:16:08'),(8773,324,2,13356,'0.99','2005-08-19 21:02:21','2006-02-15 22:16:08'),(8774,324,1,13386,'2.99','2005-08-19 21:43:58','2006-02-15 22:16:08'),(8775,324,1,14262,'8.99','2005-08-21 06:08:13','2006-02-15 22:16:08'),(8776,324,2,14479,'7.99','2005-08-21 13:35:54','2006-02-15 22:16:08'),(8777,324,1,15263,'4.99','2005-08-22 18:27:33','2006-02-15 22:16:08'),(8778,324,2,13965,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:08'),(8779,325,1,131,'5.99','2005-05-25 21:42:46','2006-02-15 22:16:08'),(8780,325,2,2502,'4.99','2005-06-18 23:12:13','2006-02-15 22:16:08'),(8781,325,2,2507,'4.99','2005-06-18 23:39:22','2006-02-15 22:16:08'),(8782,325,2,2808,'2.99','2005-06-19 19:34:45','2006-02-15 22:16:08'),(8783,325,1,5470,'5.99','2005-07-09 23:10:49','2006-02-15 22:16:08'),(8784,325,2,5740,'2.99','2005-07-10 11:51:58','2006-02-15 22:16:08'),(8785,325,1,5775,'4.99','2005-07-10 13:34:26','2006-02-15 22:16:08'),(8786,325,2,6135,'4.99','2005-07-11 08:32:23','2006-02-15 22:16:08'),(8787,325,2,6622,'0.99','2005-07-12 09:04:11','2006-02-15 22:16:09'),(8788,325,2,7223,'9.99','2005-07-27 09:42:27','2006-02-15 22:16:09'),(8789,325,2,7687,'2.99','2005-07-28 03:20:26','2006-02-15 22:16:09'),(8790,325,2,8539,'0.99','2005-07-29 10:48:24','2006-02-15 22:16:09'),(8791,325,2,10030,'2.99','2005-07-31 18:39:36','2006-02-15 22:16:09'),(8792,325,1,10070,'4.99','2005-07-31 19:46:29','2006-02-15 22:16:09'),(8793,325,2,10326,'4.99','2005-08-01 04:55:34','2006-02-15 22:16:09'),(8794,325,1,10412,'0.99','2005-08-01 07:57:16','2006-02-15 22:16:09'),(8795,325,2,12097,'4.99','2005-08-17 22:35:24','2006-02-15 22:16:09'),(8796,325,1,12779,'3.99','2005-08-18 23:44:00','2006-02-15 22:16:09'),(8797,325,2,13054,'4.99','2005-08-19 09:34:02','2006-02-15 22:16:09'),(8798,325,2,14452,'3.99','2005-08-21 12:23:20','2006-02-15 22:16:09'),(8799,325,1,14672,'5.99','2005-08-21 19:59:33','2006-02-15 22:16:09'),(8800,325,2,15009,'0.99','2005-08-22 08:27:27','2006-02-15 22:16:09'),(8801,326,1,875,'6.99','2005-05-30 05:38:24','2006-02-15 22:16:09'),(8802,326,2,981,'4.99','2005-05-30 21:52:42','2006-02-15 22:16:09'),(8803,326,2,1149,'3.99','2005-05-31 21:03:17','2006-02-15 22:16:09'),(8804,326,1,1311,'4.99','2005-06-15 10:11:59','2006-02-15 22:16:09'),(8805,326,2,2086,'0.99','2005-06-17 17:32:07','2006-02-15 22:16:09'),(8806,326,2,2317,'4.99','2005-06-18 09:12:18','2006-02-15 22:16:09'),(8807,326,1,3441,'4.99','2005-06-21 20:00:12','2006-02-15 22:16:09'),(8808,326,2,3886,'0.99','2005-07-06 18:44:24','2006-02-15 22:16:09'),(8809,326,1,4160,'7.99','2005-07-07 09:13:17','2006-02-15 22:16:09'),(8810,326,1,5147,'5.99','2005-07-09 08:17:41','2006-02-15 22:16:09'),(8811,326,1,7117,'2.99','2005-07-27 05:48:36','2006-02-15 22:16:10'),(8812,326,2,7725,'2.99','2005-07-28 04:47:14','2006-02-15 22:16:10'),(8813,326,2,7931,'4.99','2005-07-28 12:23:41','2006-02-15 22:16:10'),(8814,326,1,8467,'5.99','2005-07-29 08:25:35','2006-02-15 22:16:10'),(8815,326,1,8604,'4.99','2005-07-29 13:07:13','2006-02-15 22:16:10'),(8816,326,2,8739,'2.99','2005-07-29 18:34:33','2006-02-15 22:16:10'),(8817,326,2,9855,'0.99','2005-07-31 13:00:33','2006-02-15 22:16:10'),(8818,326,1,10108,'0.99','2005-07-31 21:02:14','2006-02-15 22:16:10'),(8819,326,2,10173,'4.99','2005-07-31 23:36:59','2006-02-15 22:16:10'),(8820,326,2,10720,'0.99','2005-08-01 19:04:33','2006-02-15 22:16:10'),(8821,326,2,10976,'4.99','2005-08-02 04:11:48','2006-02-15 22:16:10'),(8822,326,2,11010,'0.99','2005-08-02 05:06:27','2006-02-15 22:16:10'),(8823,326,2,11428,'2.99','2005-08-02 20:03:10','2006-02-15 22:16:10'),(8824,326,2,11485,'4.99','2005-08-02 22:33:25','2006-02-15 22:16:10'),(8825,326,2,12829,'2.99','2005-08-19 01:38:18','2006-02-15 22:16:10'),(8826,327,1,653,'6.99','2005-05-28 20:12:20','2006-02-15 22:16:10'),(8827,327,1,1294,'4.99','2005-06-15 09:09:27','2006-02-15 22:16:10'),(8828,327,2,1577,'3.99','2005-06-16 04:03:28','2006-02-15 22:16:10'),(8829,327,2,1929,'6.99','2005-06-17 06:49:30','2006-02-15 22:16:10'),(8830,327,1,2273,'4.99','2005-06-18 06:30:02','2006-02-15 22:16:10'),(8831,327,2,2304,'5.99','2005-06-18 08:30:15','2006-02-15 22:16:10'),(8832,327,2,2637,'3.99','2005-06-19 09:20:56','2006-02-15 22:16:10'),(8833,327,1,4445,'4.99','2005-07-07 23:08:22','2006-02-15 22:16:10'),(8834,327,1,4521,'0.99','2005-07-08 02:57:56','2006-02-15 22:16:11'),(8835,327,1,6618,'2.99','2005-07-12 08:41:42','2006-02-15 22:16:11'),(8836,327,2,7458,'1.99','2005-07-27 18:36:17','2006-02-15 22:16:11'),(8837,327,2,7808,'1.99','2005-07-28 07:58:56','2006-02-15 22:16:11'),(8838,327,1,10371,'0.99','2005-08-01 06:20:29','2006-02-15 22:16:11'),(8839,327,1,11372,'4.99','2005-08-02 18:10:50','2006-02-15 22:16:11'),(8840,327,2,11929,'6.99','2005-08-17 16:28:51','2006-02-15 22:16:11'),(8841,327,1,12016,'0.99','2005-08-17 19:33:24','2006-02-15 22:16:11'),(8842,327,2,13158,'2.99','2005-08-19 13:18:10','2006-02-15 22:16:11'),(8843,327,1,13360,'4.99','2005-08-19 21:05:11','2006-02-15 22:16:11'),(8844,327,1,13448,'0.99','2005-08-20 00:12:43','2006-02-15 22:16:11'),(8845,327,1,14847,'4.99','2005-08-22 02:13:51','2006-02-15 22:16:11'),(8846,327,2,15365,'3.99','2005-08-22 21:42:17','2006-02-15 22:16:11'),(8847,327,1,15386,'2.99','2005-08-22 22:41:14','2006-02-15 22:16:11'),(8848,327,1,15828,'5.99','2005-08-23 15:16:32','2006-02-15 22:16:11'),(8849,327,1,15916,'9.99','2005-08-23 17:56:01','2006-02-15 22:16:11'),(8850,327,2,15969,'7.99','2005-08-23 19:51:30','2006-02-15 22:16:11'),(8851,327,1,15297,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:11'),(8852,328,2,862,'2.99','2005-05-30 03:09:11','2006-02-15 22:16:11'),(8853,328,2,1670,'2.99','2005-06-16 10:26:33','2006-02-15 22:16:11'),(8854,328,2,1980,'6.99','2005-06-17 09:48:05','2006-02-15 22:16:11'),(8855,328,2,2243,'5.99','2005-06-18 04:33:03','2006-02-15 22:16:11'),(8856,328,1,3024,'4.99','2005-06-20 11:29:17','2006-02-15 22:16:11'),(8857,328,1,3239,'0.99','2005-06-21 02:48:40','2006-02-15 22:16:11'),(8858,328,1,5450,'4.99','2005-07-09 22:13:25','2006-02-15 22:16:12'),(8859,328,1,8017,'1.99','2005-07-28 15:35:41','2006-02-15 22:16:12'),(8860,328,1,8577,'6.99','2005-07-29 11:56:30','2006-02-15 22:16:12'),(8861,328,2,8780,'4.99','2005-07-29 20:19:45','2006-02-15 22:16:12'),(8862,328,2,9557,'2.99','2005-07-31 02:14:01','2006-02-15 22:16:12'),(8863,328,1,9835,'2.99','2005-07-31 12:07:35','2006-02-15 22:16:12'),(8864,328,1,11174,'2.99','2005-08-02 10:32:11','2006-02-15 22:16:12'),(8865,328,1,12175,'4.99','2005-08-18 01:10:17','2006-02-15 22:16:12'),(8866,328,2,12825,'0.99','2005-08-19 01:23:58','2006-02-15 22:16:12'),(8867,328,1,13609,'2.99','2005-08-20 06:11:51','2006-02-15 22:16:12'),(8868,328,2,13681,'7.99','2005-08-20 08:47:37','2006-02-15 22:16:12'),(8869,328,1,13907,'3.99','2005-08-20 16:17:27','2006-02-15 22:16:12'),(8870,328,2,14307,'3.99','2005-08-21 07:34:52','2006-02-15 22:16:12'),(8871,328,1,14755,'3.99','2005-08-21 23:18:08','2006-02-15 22:16:12'),(8872,328,2,14939,'2.99','2005-08-22 05:53:52','2006-02-15 22:16:12'),(8873,328,1,15179,'4.99','2005-08-22 15:36:22','2006-02-15 22:16:12'),(8874,328,1,15863,'0.99','2005-08-23 16:17:09','2006-02-15 22:16:12'),(8875,329,1,1183,'2.99','2005-06-15 00:49:19','2006-02-15 22:16:12'),(8876,329,1,2010,'5.99','2005-06-17 11:54:15','2006-02-15 22:16:12'),(8877,329,2,2024,'0.99','2005-06-17 13:00:51','2006-02-15 22:16:12'),(8878,329,1,2151,'0.99','2005-06-17 22:52:37','2006-02-15 22:16:12'),(8879,329,1,2303,'2.99','2005-06-18 08:27:59','2006-02-15 22:16:12'),(8880,329,2,2702,'2.99','2005-06-19 13:35:56','2006-02-15 22:16:12'),(8881,329,1,3052,'5.99','2005-06-20 13:09:19','2006-02-15 22:16:13'),(8882,329,2,3053,'0.99','2005-06-20 13:10:30','2006-02-15 22:16:13'),(8883,329,2,3268,'4.99','2005-06-21 04:55:49','2006-02-15 22:16:13'),(8884,329,2,3976,'2.99','2005-07-06 23:00:20','2006-02-15 22:16:13'),(8885,329,2,4076,'4.99','2005-07-07 04:52:15','2006-02-15 22:16:13'),(8886,329,1,4415,'4.99','2005-07-07 22:01:43','2006-02-15 22:16:13'),(8887,329,1,4465,'1.99','2005-07-08 00:07:45','2006-02-15 22:16:13'),(8888,329,2,4674,'2.99','2005-07-08 10:19:28','2006-02-15 22:16:13'),(8889,329,1,7980,'4.99','2005-07-28 14:16:49','2006-02-15 22:16:13'),(8890,329,2,8172,'7.99','2005-07-28 21:34:36','2006-02-15 22:16:13'),(8891,329,1,8460,'6.99','2005-07-29 08:08:03','2006-02-15 22:16:13'),(8892,329,2,8941,'0.99','2005-07-30 02:59:21','2006-02-15 22:16:13'),(8893,329,2,9024,'4.99','2005-07-30 05:44:42','2006-02-15 22:16:13'),(8894,329,2,9219,'0.99','2005-07-30 13:15:21','2006-02-15 22:16:13'),(8895,329,1,9381,'0.99','2005-07-30 19:23:04','2006-02-15 22:16:13'),(8896,329,1,9827,'6.99','2005-07-31 11:56:55','2006-02-15 22:16:13'),(8897,329,1,10473,'7.99','2005-08-01 09:56:24','2006-02-15 22:16:13'),(8898,329,2,10490,'0.99','2005-08-01 10:37:11','2006-02-15 22:16:13'),(8899,329,1,11130,'2.99','2005-08-02 09:08:59','2006-02-15 22:16:13'),(8900,329,2,11169,'3.99','2005-08-02 10:19:42','2006-02-15 22:16:13'),(8901,329,2,11697,'0.99','2005-08-17 07:09:19','2006-02-15 22:16:13'),(8902,329,1,12659,'6.99','2005-08-18 19:05:49','2006-02-15 22:16:13'),(8903,329,1,13627,'8.99','2005-08-20 06:59:00','2006-02-15 22:16:13'),(8904,329,1,14900,'4.99','2005-08-22 04:27:48','2006-02-15 22:16:13'),(8905,329,2,15011,'4.99','2005-08-22 08:31:07','2006-02-15 22:16:14'),(8906,329,1,15308,'2.99','2005-08-22 19:54:31','2006-02-15 22:16:14'),(8907,330,1,704,'3.99','2005-05-29 02:44:43','2006-02-15 22:16:14'),(8908,330,2,967,'7.99','2005-05-30 19:12:06','2006-02-15 22:16:14'),(8909,330,1,1219,'6.99','2005-06-15 03:25:59','2006-02-15 22:16:14'),(8910,330,2,1511,'5.99','2005-06-15 22:45:06','2006-02-15 22:16:14'),(8911,330,2,2885,'0.99','2005-06-20 01:33:42','2006-02-15 22:16:14'),(8912,330,1,2936,'4.99','2005-06-20 05:09:27','2006-02-15 22:16:14'),(8913,330,2,3061,'2.99','2005-06-20 13:48:21','2006-02-15 22:16:14'),(8914,330,2,3603,'4.99','2005-07-06 05:25:03','2006-02-15 22:16:14'),(8915,330,2,3659,'2.99','2005-07-06 08:03:14','2006-02-15 22:16:14'),(8916,330,2,3760,'2.99','2005-07-06 12:49:28','2006-02-15 22:16:14'),(8917,330,1,4124,'1.99','2005-07-07 07:19:54','2006-02-15 22:16:14'),(8918,330,2,5149,'2.99','2005-07-09 08:28:23','2006-02-15 22:16:14'),(8919,330,1,5750,'5.99','2005-07-10 12:20:41','2006-02-15 22:16:14'),(8920,330,1,6656,'0.99','2005-07-12 11:09:47','2006-02-15 22:16:14'),(8921,330,2,6678,'2.99','2005-07-12 11:58:36','2006-02-15 22:16:14'),(8922,330,1,6719,'2.99','2005-07-12 13:40:37','2006-02-15 22:16:14'),(8923,330,2,7894,'2.99','2005-07-28 10:53:58','2006-02-15 22:16:14'),(8924,330,1,8680,'4.99','2005-07-29 16:08:03','2006-02-15 22:16:14'),(8925,330,2,10100,'4.99','2005-07-31 20:47:18','2006-02-15 22:16:14'),(8926,330,2,11259,'3.99','2005-08-02 13:46:30','2006-02-15 22:16:14'),(8927,330,1,12062,'2.99','2005-08-17 21:24:47','2006-02-15 22:16:14'),(8928,330,1,12394,'2.99','2005-08-18 09:05:15','2006-02-15 22:16:15'),(8929,330,1,12740,'4.99','2005-08-18 22:17:04','2006-02-15 22:16:15'),(8930,330,1,12867,'0.99','2005-08-19 02:40:11','2006-02-15 22:16:15'),(8931,330,2,11709,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:15'),(8932,331,2,87,'0.99','2005-05-25 13:52:43','2006-02-15 22:16:15'),(8933,331,1,996,'2.99','2005-05-31 00:06:20','2006-02-15 22:16:15'),(8934,331,1,1415,'2.99','2005-06-15 17:31:57','2006-02-15 22:16:15'),(8935,331,2,2528,'6.99','2005-06-19 01:14:12','2006-02-15 22:16:15'),(8936,331,1,2587,'2.99','2005-06-19 05:06:14','2006-02-15 22:16:15'),(8937,331,1,3505,'4.99','2005-07-06 00:19:32','2006-02-15 22:16:15'),(8938,331,1,3613,'4.99','2005-07-06 05:45:53','2006-02-15 22:16:15'),(8939,331,2,3871,'8.99','2005-07-06 17:58:51','2006-02-15 22:16:15'),(8940,331,1,4051,'4.99','2005-07-07 03:37:28','2006-02-15 22:16:15'),(8941,331,2,4063,'5.99','2005-07-07 04:23:57','2006-02-15 22:16:15'),(8942,331,1,4326,'10.99','2005-07-07 18:01:22','2006-02-15 22:16:15'),(8943,331,1,5152,'2.99','2005-07-09 08:34:44','2006-02-15 22:16:15'),(8944,331,1,5885,'1.99','2005-07-10 19:33:50','2006-02-15 22:16:15'),(8945,331,1,5947,'5.99','2005-07-10 23:07:42','2006-02-15 22:16:15'),(8946,331,1,8231,'0.99','2005-07-29 00:14:37','2006-02-15 22:16:15'),(8947,331,2,8995,'4.99','2005-07-30 04:53:11','2006-02-15 22:16:15'),(8948,331,1,9401,'5.99','2005-07-30 20:18:19','2006-02-15 22:16:15'),(8949,331,2,10188,'6.99','2005-08-01 00:19:41','2006-02-15 22:16:16'),(8950,331,1,11052,'5.99','2005-08-02 06:26:19','2006-02-15 22:16:16'),(8951,331,1,11362,'2.99','2005-08-02 17:47:25','2006-02-15 22:16:16'),(8952,331,2,12533,'4.99','2005-08-18 14:01:40','2006-02-15 22:16:16'),(8953,331,1,13795,'0.99','2005-08-20 12:32:09','2006-02-15 22:16:16'),(8954,331,1,14256,'7.99','2005-08-21 05:52:27','2006-02-15 22:16:16'),(8955,331,1,14628,'1.99','2005-08-21 18:37:24','2006-02-15 22:16:16'),(8956,331,1,15339,'2.99','2005-08-22 20:52:12','2006-02-15 22:16:16'),(8957,331,2,15447,'3.99','2005-08-23 00:53:57','2006-02-15 22:16:16'),(8958,331,1,15521,'2.99','2005-08-23 03:30:51','2006-02-15 22:16:16'),(8959,332,2,600,'3.99','2005-05-28 14:08:19','2006-02-15 22:16:16'),(8960,332,1,1000,'6.99','2005-05-31 00:25:56','2006-02-15 22:16:16'),(8961,332,1,4100,'6.99','2005-07-07 06:20:52','2006-02-15 22:16:16'),(8962,332,1,4302,'6.99','2005-07-07 16:47:53','2006-02-15 22:16:16'),(8963,332,2,5116,'2.99','2005-07-09 07:10:12','2006-02-15 22:16:16'),(8964,332,1,5277,'1.99','2005-07-09 14:40:42','2006-02-15 22:16:16'),(8965,332,2,5381,'2.99','2005-07-09 19:11:11','2006-02-15 22:16:16'),(8966,332,2,5388,'0.99','2005-07-09 19:25:25','2006-02-15 22:16:16'),(8967,332,1,5440,'0.99','2005-07-09 21:45:17','2006-02-15 22:16:16'),(8968,332,2,7049,'7.99','2005-07-27 03:32:41','2006-02-15 22:16:16'),(8969,332,2,7418,'2.99','2005-07-27 16:59:09','2006-02-15 22:16:16'),(8970,332,2,7577,'8.99','2005-07-27 22:56:07','2006-02-15 22:16:16'),(8971,332,2,7578,'4.99','2005-07-27 22:58:17','2006-02-15 22:16:17'),(8972,332,2,7934,'8.99','2005-07-28 12:33:10','2006-02-15 22:16:17'),(8973,332,2,8173,'6.99','2005-07-28 21:35:44','2006-02-15 22:16:17'),(8974,332,1,9324,'1.99','2005-07-30 17:28:52','2006-02-15 22:16:17'),(8975,332,1,9388,'5.99','2005-07-30 19:27:22','2006-02-15 22:16:17'),(8976,332,1,9921,'0.99','2005-07-31 14:59:21','2006-02-15 22:16:17'),(8977,332,1,10026,'4.99','2005-07-31 18:31:51','2006-02-15 22:16:17'),(8978,332,1,10307,'0.99','2005-08-01 04:21:54','2006-02-15 22:16:17'),(8979,332,2,10439,'0.99','2005-08-01 08:54:26','2006-02-15 22:16:17'),(8980,332,1,11229,'5.99','2005-08-02 12:56:37','2006-02-15 22:16:17'),(8981,332,2,11564,'2.99','2005-08-17 01:27:49','2006-02-15 22:16:17'),(8982,332,2,12318,'4.99','2005-08-18 06:21:56','2006-02-15 22:16:17'),(8983,332,2,13673,'2.99','2005-08-20 08:27:30','2006-02-15 22:16:17'),(8984,332,2,14783,'4.99','2005-08-22 00:21:57','2006-02-15 22:16:17'),(8985,332,2,15194,'0.99','2005-08-22 16:07:34','2006-02-15 22:16:17'),(8986,332,1,15210,'3.99','2005-08-22 16:37:36','2006-02-15 22:16:17'),(8987,333,1,4,'4.99','2005-05-24 23:04:41','2006-02-15 22:16:17'),(8988,333,1,1667,'2.99','2005-06-16 10:18:59','2006-02-15 22:16:17'),(8989,333,1,2149,'6.99','2005-06-17 22:50:00','2006-02-15 22:16:17'),(8990,333,1,2929,'1.99','2005-06-20 04:47:39','2006-02-15 22:16:17'),(8991,333,1,3110,'2.99','2005-06-20 17:40:12','2006-02-15 22:16:17'),(8992,333,2,5032,'0.99','2005-07-09 02:39:47','2006-02-15 22:16:17'),(8993,333,1,5645,'1.99','2005-07-10 06:58:21','2006-02-15 22:16:17'),(8994,333,2,5892,'4.99','2005-07-10 20:02:42','2006-02-15 22:16:17'),(8995,333,2,6275,'0.99','2005-07-11 16:12:11','2006-02-15 22:16:18'),(8996,333,2,6931,'4.99','2005-07-26 23:02:57','2006-02-15 22:16:18'),(8997,333,2,6958,'0.99','2005-07-27 00:02:41','2006-02-15 22:16:18'),(8998,333,2,7076,'6.99','2005-07-27 04:12:14','2006-02-15 22:16:18'),(8999,333,2,7246,'0.99','2005-07-27 10:30:41','2006-02-15 22:16:18'),(9000,333,1,8719,'4.99','2005-07-29 17:45:45','2006-02-15 22:16:18'),(9001,333,2,9148,'4.99','2005-07-30 10:39:10','2006-02-15 22:16:18'),(9002,333,2,9338,'10.99','2005-07-30 18:03:13','2006-02-15 22:16:18'),(9003,333,2,10035,'4.99','2005-07-31 18:46:46','2006-02-15 22:16:18'),(9004,333,1,10062,'2.99','2005-07-31 19:24:55','2006-02-15 22:16:18'),(9005,333,2,10844,'4.99','2005-08-01 23:46:58','2006-02-15 22:16:18'),(9006,333,1,12427,'6.99','2005-08-18 10:24:17','2006-02-15 22:16:18'),(9007,333,2,12661,'0.99','2005-08-18 19:10:10','2006-02-15 22:16:18'),(9008,333,1,13579,'3.99','2005-08-20 05:22:06','2006-02-15 22:16:18'),(9009,333,2,13710,'4.99','2005-08-20 09:35:20','2006-02-15 22:16:18'),(9010,333,1,14057,'4.99','2005-08-20 22:22:59','2006-02-15 22:16:18'),(9011,333,1,14740,'2.99','2005-08-21 22:35:33','2006-02-15 22:16:18'),(9012,333,2,15253,'2.99','2005-08-22 18:05:21','2006-02-15 22:16:18'),(9013,333,1,15313,'4.99','2005-08-22 19:59:42','2006-02-15 22:16:18'),(9014,334,1,13,'6.99','2005-05-25 00:22:55','2006-02-15 22:16:18'),(9015,334,1,431,'8.99','2005-05-27 16:31:05','2006-02-15 22:16:18'),(9016,334,2,1187,'4.99','2005-06-15 00:58:50','2006-02-15 22:16:18'),(9017,334,1,1298,'4.99','2005-06-15 09:32:53','2006-02-15 22:16:19'),(9018,334,2,2476,'0.99','2005-06-18 20:57:12','2006-02-15 22:16:19'),(9019,334,1,3662,'4.99','2005-07-06 08:11:48','2006-02-15 22:16:19'),(9020,334,1,4603,'6.99','2005-07-08 06:57:07','2006-02-15 22:16:19'),(9021,334,2,5014,'4.99','2005-07-09 01:51:49','2006-02-15 22:16:19'),(9022,334,2,5434,'0.99','2005-07-09 21:25:20','2006-02-15 22:16:19'),(9023,334,2,5818,'5.99','2005-07-10 15:51:12','2006-02-15 22:16:19'),(9024,334,1,5845,'4.99','2005-07-10 17:23:14','2006-02-15 22:16:19'),(9025,334,2,6641,'5.99','2005-07-12 10:33:14','2006-02-15 22:16:19'),(9026,334,2,6749,'4.99','2005-07-12 14:43:05','2006-02-15 22:16:19'),(9027,334,1,6987,'2.99','2005-07-27 00:59:50','2006-02-15 22:16:19'),(9028,334,1,8977,'7.99','2005-07-30 04:14:07','2006-02-15 22:16:19'),(9029,334,1,9633,'2.99','2005-07-31 05:04:08','2006-02-15 22:16:19'),(9030,334,1,10207,'3.99','2005-08-01 00:53:01','2006-02-15 22:16:19'),(9031,334,1,10408,'4.99','2005-08-01 07:42:10','2006-02-15 22:16:19'),(9032,334,1,10492,'2.99','2005-08-01 10:42:28','2006-02-15 22:16:19'),(9033,334,1,10879,'1.99','2005-08-02 00:33:20','2006-02-15 22:16:19'),(9034,334,2,10997,'7.99','2005-08-02 04:49:02','2006-02-15 22:16:19'),(9035,334,2,12677,'4.99','2005-08-18 19:36:05','2006-02-15 22:16:19'),(9036,334,2,13325,'4.99','2005-08-19 19:52:02','2006-02-15 22:16:19'),(9037,334,1,13876,'2.99','2005-08-20 15:15:28','2006-02-15 22:16:19'),(9038,334,1,14645,'0.99','2005-08-21 19:12:47','2006-02-15 22:16:19'),(9039,334,1,14984,'7.99','2005-08-22 07:35:31','2006-02-15 22:16:19'),(9040,334,2,15548,'0.99','2005-08-23 04:26:20','2006-02-15 22:16:20'),(9041,334,2,15656,'4.99','2005-08-23 08:38:58','2006-02-15 22:16:20'),(9042,334,1,15669,'3.99','2005-08-23 09:06:17','2006-02-15 22:16:20'),(9043,334,1,14219,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:20'),(9044,335,1,3329,'4.99','2005-06-21 09:20:31','2006-02-15 22:16:20'),(9045,335,1,3607,'0.99','2005-07-06 05:30:09','2006-02-15 22:16:20'),(9046,335,2,4016,'0.99','2005-07-07 01:05:50','2006-02-15 22:16:20'),(9047,335,2,4032,'2.99','2005-07-07 02:34:13','2006-02-15 22:16:20'),(9048,335,1,4279,'4.99','2005-07-07 15:01:53','2006-02-15 22:16:20'),(9049,335,1,4387,'8.99','2005-07-07 20:56:47','2006-02-15 22:16:20'),(9050,335,1,5024,'4.99','2005-07-09 02:25:12','2006-02-15 22:16:20'),(9051,335,1,5252,'0.99','2005-07-09 13:40:44','2006-02-15 22:16:20'),(9052,335,2,5728,'2.99','2005-07-10 11:26:14','2006-02-15 22:16:20'),(9053,335,1,6624,'7.99','2005-07-12 09:05:50','2006-02-15 22:16:20'),(9054,335,1,6906,'0.99','2005-07-12 22:03:02','2006-02-15 22:16:20'),(9055,335,2,8634,'3.99','2005-07-29 14:19:57','2006-02-15 22:16:20'),(9056,335,1,8855,'2.99','2005-07-29 23:40:10','2006-02-15 22:16:20'),(9057,335,1,9125,'5.99','2005-07-30 09:43:39','2006-02-15 22:16:20'),(9058,335,2,9361,'4.99','2005-07-30 18:43:49','2006-02-15 22:16:20'),(9059,335,1,9428,'0.99','2005-07-30 21:18:37','2006-02-15 22:16:20'),(9060,335,2,10606,'4.99','2005-08-01 14:39:15','2006-02-15 22:16:21'),(9061,335,2,13267,'0.99','2005-08-19 17:31:36','2006-02-15 22:16:21'),(9062,335,1,13622,'1.99','2005-08-20 06:45:32','2006-02-15 22:16:21'),(9063,335,1,14014,'2.99','2005-08-20 20:47:09','2006-02-15 22:16:21'),(9064,335,2,15005,'4.99','2005-08-22 08:15:44','2006-02-15 22:16:21'),(9065,335,2,15101,'0.99','2005-08-22 11:56:02','2006-02-15 22:16:21'),(9066,335,2,11541,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:21'),(9067,336,1,1478,'2.99','2005-06-15 21:12:13','2006-02-15 22:16:21'),(9068,336,2,2212,'2.99','2005-06-18 02:36:10','2006-02-15 22:16:21'),(9069,336,2,2475,'2.99','2005-06-18 20:52:46','2006-02-15 22:16:21'),(9070,336,1,2575,'2.99','2005-06-19 04:32:52','2006-02-15 22:16:21'),(9071,336,2,2719,'4.99','2005-06-19 14:50:19','2006-02-15 22:16:21'),(9072,336,1,2954,'2.99','2005-06-20 06:45:00','2006-02-15 22:16:21'),(9073,336,2,3204,'4.99','2005-06-21 00:37:50','2006-02-15 22:16:21'),(9074,336,2,3349,'0.99','2005-06-21 11:17:35','2006-02-15 22:16:21'),(9075,336,2,4323,'5.99','2005-07-07 17:55:53','2006-02-15 22:16:21'),(9076,336,1,4595,'2.99','2005-07-08 06:40:25','2006-02-15 22:16:21'),(9077,336,2,5649,'2.99','2005-07-10 07:15:07','2006-02-15 22:16:21'),(9078,336,2,5667,'0.99','2005-07-10 08:11:03','2006-02-15 22:16:21'),(9079,336,2,6263,'4.99','2005-07-11 15:33:50','2006-02-15 22:16:22'),(9080,336,2,6382,'6.99','2005-07-11 21:58:53','2006-02-15 22:16:22'),(9081,336,2,8275,'4.99','2005-07-29 01:35:47','2006-02-15 22:16:22'),(9082,336,1,8407,'6.99','2005-07-29 06:37:02','2006-02-15 22:16:22'),(9083,336,2,8607,'4.99','2005-07-29 13:18:00','2006-02-15 22:16:22'),(9084,336,2,8951,'8.99','2005-07-30 03:18:24','2006-02-15 22:16:22'),(9085,336,2,9306,'0.99','2005-07-30 16:47:17','2006-02-15 22:16:22'),(9086,336,1,10055,'0.99','2005-07-31 19:15:58','2006-02-15 22:16:22'),(9087,336,2,11743,'2.99','2005-08-17 08:49:05','2006-02-15 22:16:22'),(9088,336,1,12323,'8.99','2005-08-18 06:36:22','2006-02-15 22:16:22'),(9089,336,2,12794,'0.99','2005-08-19 00:20:37','2006-02-15 22:16:22'),(9090,336,2,12926,'3.99','2005-08-19 05:00:16','2006-02-15 22:16:22'),(9091,336,2,13066,'0.99','2005-08-19 09:50:39','2006-02-15 22:16:22'),(9092,336,2,13689,'4.99','2005-08-20 09:04:30','2006-02-15 22:16:22'),(9093,336,1,14295,'2.99','2005-08-21 07:09:27','2006-02-15 22:16:22'),(9094,336,1,15073,'10.99','2005-08-22 11:01:15','2006-02-15 22:16:22'),(9095,336,2,15848,'2.99','2005-08-23 15:41:12','2006-02-15 22:16:22'),(9096,336,1,13022,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:22'),(9097,337,1,374,'6.99','2005-05-27 08:26:30','2006-02-15 22:16:23'),(9098,337,1,572,'4.99','2005-05-28 10:30:13','2006-02-15 22:16:23'),(9099,337,1,839,'8.99','2005-05-30 00:28:12','2006-02-15 22:16:23'),(9100,337,2,1969,'4.99','2005-06-17 09:22:22','2006-02-15 22:16:23'),(9101,337,1,2014,'5.99','2005-06-17 12:03:28','2006-02-15 22:16:23'),(9102,337,1,3626,'5.99','2005-07-06 06:15:35','2006-02-15 22:16:23'),(9103,337,1,4091,'6.99','2005-07-07 05:53:38','2006-02-15 22:16:23'),(9104,337,2,4093,'4.99','2005-07-07 05:54:50','2006-02-15 22:16:23'),(9105,337,2,4855,'4.99','2005-07-08 18:45:50','2006-02-15 22:16:23'),(9106,337,1,5050,'2.99','2005-07-09 03:54:38','2006-02-15 22:16:23'),(9107,337,1,6212,'0.99','2005-07-11 12:40:48','2006-02-15 22:16:23'),(9108,337,2,6305,'7.99','2005-07-11 18:02:25','2006-02-15 22:16:23'),(9109,337,1,6620,'2.99','2005-07-12 08:51:03','2006-02-15 22:16:23'),(9110,337,1,7410,'4.99','2005-07-27 16:41:59','2006-02-15 22:16:23'),(9111,337,1,8516,'4.99','2005-07-29 10:00:03','2006-02-15 22:16:23'),(9112,337,2,8919,'8.99','2005-07-30 01:57:03','2006-02-15 22:16:24'),(9113,337,2,9051,'5.99','2005-07-30 07:05:54','2006-02-15 22:16:24'),(9114,337,1,10664,'0.99','2005-08-01 16:51:15','2006-02-15 22:16:24'),(9115,337,2,10765,'0.99','2005-08-01 20:34:51','2006-02-15 22:16:24'),(9116,337,2,11252,'2.99','2005-08-02 13:42:13','2006-02-15 22:16:24'),(9117,337,1,11734,'3.99','2005-08-17 08:34:22','2006-02-15 22:16:24'),(9118,337,1,12369,'6.99','2005-08-18 07:57:43','2006-02-15 22:16:24'),(9119,337,2,13305,'6.99','2005-08-19 18:57:05','2006-02-15 22:16:24'),(9120,337,1,13678,'4.99','2005-08-20 08:38:24','2006-02-15 22:16:24'),(9121,337,2,13892,'3.99','2005-08-20 15:50:17','2006-02-15 22:16:24'),(9122,337,2,14118,'5.99','2005-08-21 01:13:37','2006-02-15 22:16:24'),(9123,337,2,15241,'4.99','2005-08-22 17:47:40','2006-02-15 22:16:24'),(9124,337,1,15292,'4.99','2005-08-22 19:28:56','2006-02-15 22:16:24'),(9125,337,2,11847,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:24'),(9126,338,1,675,'0.99','2005-05-28 22:22:44','2006-02-15 22:16:24'),(9127,338,2,1510,'4.99','2005-06-15 22:39:34','2006-02-15 22:16:24'),(9128,338,1,1807,'5.99','2005-06-16 20:58:59','2006-02-15 22:16:24'),(9129,338,2,1952,'4.99','2005-06-17 08:33:02','2006-02-15 22:16:24'),(9130,338,1,2148,'6.99','2005-06-17 22:44:35','2006-02-15 22:16:24'),(9131,338,1,2179,'0.99','2005-06-18 00:41:36','2006-02-15 22:16:24'),(9132,338,1,2495,'4.99','2005-06-18 22:15:42','2006-02-15 22:16:24'),(9133,338,1,3458,'5.99','2005-06-21 21:42:49','2006-02-15 22:16:25'),(9134,338,1,3516,'0.99','2005-07-06 00:50:30','2006-02-15 22:16:25'),(9135,338,2,3772,'2.99','2005-07-06 13:22:53','2006-02-15 22:16:25'),(9136,338,2,4104,'5.99','2005-07-07 06:25:41','2006-02-15 22:16:25'),(9137,338,2,4779,'4.99','2005-07-08 15:53:41','2006-02-15 22:16:25'),(9138,338,1,5309,'4.99','2005-07-09 16:00:16','2006-02-15 22:16:25'),(9139,338,1,6236,'2.99','2005-07-11 14:18:17','2006-02-15 22:16:25'),(9140,338,1,6360,'4.99','2005-07-11 21:07:40','2006-02-15 22:16:25'),(9141,338,2,7584,'3.99','2005-07-27 23:15:46','2006-02-15 22:16:25'),(9142,338,1,8766,'0.99','2005-07-29 19:41:04','2006-02-15 22:16:25'),(9143,338,1,9485,'7.99','2005-07-30 23:32:40','2006-02-15 22:16:25'),(9144,338,2,10791,'2.99','2005-08-01 21:41:52','2006-02-15 22:16:25'),(9145,338,1,10897,'0.99','2005-08-02 01:23:42','2006-02-15 22:16:25'),(9146,338,2,11064,'4.99','2005-08-02 06:55:17','2006-02-15 22:16:25'),(9147,338,2,11671,'4.99','2005-08-17 05:50:21','2006-02-15 22:16:25'),(9148,338,2,11719,'5.99','2005-08-17 07:46:05','2006-02-15 22:16:25'),(9149,338,1,12167,'2.99','2005-08-18 01:00:02','2006-02-15 22:16:25'),(9150,338,1,13284,'3.99','2005-08-19 18:12:31','2006-02-15 22:16:25'),(9151,338,1,14619,'2.99','2005-08-21 18:10:03','2006-02-15 22:16:26'),(9152,338,2,15105,'0.99','2005-08-22 12:01:33','2006-02-15 22:16:26'),(9153,338,2,15173,'6.99','2005-08-22 15:26:29','2006-02-15 22:16:26'),(9154,339,1,876,'5.99','2005-05-30 05:41:22','2006-02-15 22:16:26'),(9155,339,2,1432,'3.99','2005-06-15 18:27:24','2006-02-15 22:16:26'),(9156,339,1,1536,'4.99','2005-06-16 00:52:22','2006-02-15 22:16:26'),(9157,339,2,1629,'4.99','2005-06-16 07:53:47','2006-02-15 22:16:26'),(9158,339,1,3146,'6.99','2005-06-20 20:21:48','2006-02-15 22:16:26'),(9159,339,1,3335,'4.99','2005-06-21 10:09:08','2006-02-15 22:16:26'),(9160,339,2,3536,'2.99','2005-07-06 01:36:11','2006-02-15 22:16:26'),(9161,339,1,4243,'4.99','2005-07-07 13:39:58','2006-02-15 22:16:26'),(9162,339,1,4467,'0.99','2005-07-08 00:13:52','2006-02-15 22:16:26'),(9163,339,2,4967,'3.99','2005-07-08 23:48:03','2006-02-15 22:16:26'),(9164,339,1,5720,'3.99','2005-07-10 11:09:12','2006-02-15 22:16:26'),(9165,339,1,6072,'6.99','2005-07-11 04:52:40','2006-02-15 22:16:26'),(9166,339,1,6425,'0.99','2005-07-11 23:54:52','2006-02-15 22:16:26'),(9167,339,2,6682,'7.99','2005-07-12 12:12:43','2006-02-15 22:16:26'),(9168,339,2,7244,'2.99','2005-07-27 10:27:33','2006-02-15 22:16:26'),(9169,339,2,7973,'4.99','2005-07-28 14:10:06','2006-02-15 22:16:27'),(9170,339,1,8968,'0.99','2005-07-30 03:57:32','2006-02-15 22:16:27'),(9171,339,2,9208,'5.99','2005-07-30 12:54:03','2006-02-15 22:16:27'),(9172,339,1,9663,'4.99','2005-07-31 06:10:48','2006-02-15 22:16:27'),(9173,339,2,10338,'3.99','2005-08-01 05:03:03','2006-02-15 22:16:27'),(9174,339,2,11171,'4.99','2005-08-02 10:23:41','2006-02-15 22:16:27'),(9175,339,1,11550,'2.99','2005-08-17 01:02:06','2006-02-15 22:16:27'),(9176,339,2,11582,'3.99','2005-08-17 02:03:49','2006-02-15 22:16:27'),(9177,339,2,11699,'5.99','2005-08-17 07:11:58','2006-02-15 22:16:27'),(9178,339,1,12631,'0.99','2005-08-18 17:52:51','2006-02-15 22:16:27'),(9179,339,1,13199,'3.99','2005-08-19 14:53:22','2006-02-15 22:16:27'),(9180,339,1,13575,'5.99','2005-08-20 05:15:20','2006-02-15 22:16:27'),(9181,339,1,13985,'0.99','2005-08-20 19:13:06','2006-02-15 22:16:27'),(9182,339,1,14636,'4.99','2005-08-21 18:59:17','2006-02-15 22:16:27'),(9183,339,2,14758,'3.99','2005-08-21 23:24:52','2006-02-15 22:16:27'),(9184,340,2,1205,'4.99','2005-06-15 02:25:56','2006-02-15 22:16:27'),(9185,340,1,1697,'3.99','2005-06-16 12:55:20','2006-02-15 22:16:27'),(9186,340,1,2177,'5.99','2005-06-18 00:34:45','2006-02-15 22:16:27'),(9187,340,2,2183,'4.99','2005-06-18 01:06:01','2006-02-15 22:16:28'),(9188,340,2,2607,'5.99','2005-06-19 06:55:01','2006-02-15 22:16:28'),(9189,340,1,2653,'5.99','2005-06-19 10:36:53','2006-02-15 22:16:28'),(9190,340,1,3264,'0.99','2005-06-21 04:19:03','2006-02-15 22:16:28'),(9191,340,1,3455,'2.99','2005-06-21 21:17:51','2006-02-15 22:16:28'),(9192,340,2,4475,'2.99','2005-07-08 00:27:30','2006-02-15 22:16:28'),(9193,340,1,4742,'0.99','2005-07-08 13:35:23','2006-02-15 22:16:28'),(9194,340,2,6381,'4.99','2005-07-11 21:58:48','2006-02-15 22:16:28'),(9195,340,2,7617,'2.99','2005-07-28 00:18:40','2006-02-15 22:16:28'),(9196,340,2,8274,'4.99','2005-07-29 01:34:32','2006-02-15 22:16:28'),(9197,340,1,8541,'0.99','2005-07-29 10:55:01','2006-02-15 22:16:28'),(9198,340,2,8551,'4.99','2005-07-29 11:13:11','2006-02-15 22:16:28'),(9199,340,1,8606,'4.99','2005-07-29 13:14:24','2006-02-15 22:16:28'),(9200,340,1,9834,'2.99','2005-07-31 12:05:42','2006-02-15 22:16:28'),(9201,340,1,10292,'2.99','2005-08-01 03:42:40','2006-02-15 22:16:28'),(9202,340,1,10667,'8.99','2005-08-01 16:58:22','2006-02-15 22:16:28'),(9203,340,2,10674,'3.99','2005-08-01 17:11:52','2006-02-15 22:16:28'),(9204,340,1,10809,'0.99','2005-08-01 22:39:27','2006-02-15 22:16:28'),(9205,340,1,10995,'0.99','2005-08-02 04:48:00','2006-02-15 22:16:28'),(9206,340,2,12598,'4.99','2005-08-18 16:34:03','2006-02-15 22:16:29'),(9207,340,2,12908,'1.99','2005-08-19 04:19:05','2006-02-15 22:16:29'),(9208,340,2,12940,'2.99','2005-08-19 05:38:29','2006-02-15 22:16:29'),(9209,340,1,13425,'2.99','2005-08-19 23:11:44','2006-02-15 22:16:29'),(9210,340,1,14457,'4.99','2005-08-21 12:47:38','2006-02-15 22:16:29'),(9211,340,2,14718,'0.99','2005-08-21 21:39:25','2006-02-15 22:16:29'),(9212,340,1,14895,'2.99','2005-08-22 04:19:23','2006-02-15 22:16:29'),(9213,340,2,15306,'2.99','2005-08-22 19:46:36','2006-02-15 22:16:29'),(9214,340,1,15378,'9.99','2005-08-22 22:25:17','2006-02-15 22:16:29'),(9215,341,1,1318,'2.99','2005-06-15 10:34:26','2006-02-15 22:16:29'),(9216,341,2,1520,'7.99','2005-06-15 23:57:20','2006-02-15 22:16:29'),(9217,341,1,1778,'1.99','2005-06-16 18:54:48','2006-02-15 22:16:29'),(9218,341,1,1849,'7.99','2005-06-17 00:13:19','2006-02-15 22:16:29'),(9219,341,2,2829,'2.99','2005-06-19 21:11:30','2006-02-15 22:16:29'),(9220,341,2,3130,'7.99','2005-06-20 19:03:22','2006-02-15 22:16:29'),(9221,341,1,3382,'5.99','2005-06-21 14:05:23','2006-02-15 22:16:29'),(9222,341,2,3938,'4.99','2005-07-06 21:15:45','2006-02-15 22:16:29'),(9223,341,1,4624,'2.99','2005-07-08 08:12:17','2006-02-15 22:16:29'),(9224,341,2,5487,'4.99','2005-07-10 00:01:50','2006-02-15 22:16:30'),(9225,341,2,5931,'0.99','2005-07-10 22:04:19','2006-02-15 22:16:30'),(9226,341,2,7473,'2.99','2005-07-27 19:05:40','2006-02-15 22:16:30'),(9227,341,1,8661,'2.99','2005-07-29 15:28:24','2006-02-15 22:16:30'),(9228,341,1,8728,'9.99','2005-07-29 18:12:49','2006-02-15 22:16:30'),(9229,341,2,10605,'0.99','2005-08-01 14:36:26','2006-02-15 22:16:30'),(9230,341,1,11305,'6.99','2005-08-02 15:44:55','2006-02-15 22:16:30'),(9231,341,1,11723,'2.99','2005-08-17 07:56:22','2006-02-15 22:16:30'),(9232,341,2,13059,'0.99','2005-08-19 09:42:01','2006-02-15 22:16:30'),(9233,341,2,13074,'8.99','2005-08-19 10:06:53','2006-02-15 22:16:30'),(9234,341,2,13806,'4.99','2005-08-20 12:53:46','2006-02-15 22:16:30'),(9235,341,2,14344,'4.99','2005-08-21 08:40:56','2006-02-15 22:16:30'),(9236,341,2,15030,'0.99','2005-08-22 09:10:21','2006-02-15 22:16:30'),(9237,341,2,15938,'6.99','2005-08-23 18:43:31','2006-02-15 22:16:30'),(9238,342,2,2190,'5.99','2005-06-18 01:29:51','2006-02-15 22:16:30'),(9239,342,1,2914,'5.99','2005-06-20 03:43:18','2006-02-15 22:16:30'),(9240,342,1,3081,'2.99','2005-06-20 15:29:13','2006-02-15 22:16:30'),(9241,342,1,5617,'0.99','2005-07-10 05:28:50','2006-02-15 22:16:30'),(9242,342,2,6060,'4.99','2005-07-11 04:06:17','2006-02-15 22:16:31'),(9243,342,2,6429,'8.99','2005-07-12 00:02:50','2006-02-15 22:16:31'),(9244,342,1,6736,'2.99','2005-07-12 14:16:50','2006-02-15 22:16:31'),(9245,342,2,6787,'7.99','2005-07-12 16:33:28','2006-02-15 22:16:31'),(9246,342,2,6997,'0.99','2005-07-27 01:14:02','2006-02-15 22:16:31'),(9247,342,2,7280,'2.99','2005-07-27 11:50:52','2006-02-15 22:16:31'),(9248,342,1,9164,'2.99','2005-07-30 11:24:14','2006-02-15 22:16:31'),(9249,342,1,9526,'0.99','2005-07-31 01:02:22','2006-02-15 22:16:31'),(9250,342,2,9948,'5.99','2005-07-31 15:49:41','2006-02-15 22:16:31'),(9251,342,1,9955,'0.99','2005-07-31 16:01:26','2006-02-15 22:16:32'),(9252,342,2,9956,'4.99','2005-07-31 16:03:47','2006-02-15 22:16:32'),(9253,342,1,10242,'4.99','2005-08-01 02:18:12','2006-02-15 22:16:32'),(9254,342,2,11178,'2.99','2005-08-02 10:48:10','2006-02-15 22:16:32'),(9255,342,2,11446,'0.99','2005-08-02 20:33:37','2006-02-15 22:16:32'),(9256,342,1,11568,'0.99','2005-08-17 01:30:01','2006-02-15 22:16:32'),(9257,342,1,12139,'6.99','2005-08-17 23:57:13','2006-02-15 22:16:32'),(9258,342,1,12404,'4.99','2005-08-18 09:36:34','2006-02-15 22:16:32'),(9259,342,1,12522,'2.99','2005-08-18 13:45:40','2006-02-15 22:16:32'),(9260,342,2,12816,'4.99','2005-08-19 01:04:05','2006-02-15 22:16:32'),(9261,342,2,13368,'4.99','2005-08-19 21:19:35','2006-02-15 22:16:32'),(9262,342,2,13637,'4.99','2005-08-20 07:21:15','2006-02-15 22:16:32'),(9263,342,1,13755,'2.99','2005-08-20 11:18:53','2006-02-15 22:16:32'),(9264,342,2,13827,'4.99','2005-08-20 13:47:19','2006-02-15 22:16:32'),(9265,342,2,14096,'2.99','2005-08-21 00:27:46','2006-02-15 22:16:32'),(9266,342,2,14299,'0.99','2005-08-21 07:18:57','2006-02-15 22:16:32'),(9267,342,2,14683,'8.99','2005-08-21 20:27:44','2006-02-15 22:16:32'),(9268,342,1,15484,'4.99','2005-08-23 02:04:49','2006-02-15 22:16:32'),(9269,342,1,15895,'3.99','2005-08-23 17:09:31','2006-02-15 22:16:32'),(9270,343,2,102,'3.99','2005-05-25 17:22:10','2006-02-15 22:16:32'),(9271,343,1,455,'3.99','2005-05-27 19:43:29','2006-02-15 22:16:32'),(9272,343,2,1547,'4.99','2005-06-16 01:42:24','2006-02-15 22:16:33'),(9273,343,1,1564,'6.99','2005-06-16 02:47:07','2006-02-15 22:16:33'),(9274,343,2,1879,'0.99','2005-06-17 02:57:34','2006-02-15 22:16:33'),(9275,343,2,1922,'0.99','2005-06-17 06:04:25','2006-02-15 22:16:33'),(9276,343,2,2461,'6.99','2005-06-18 19:58:12','2006-02-15 22:16:33'),(9277,343,1,2980,'8.99','2005-06-20 08:35:03','2006-02-15 22:16:33'),(9278,343,1,3407,'0.99','2005-06-21 16:14:02','2006-02-15 22:16:33'),(9279,343,1,3978,'5.99','2005-07-06 23:04:33','2006-02-15 22:16:33'),(9280,343,1,4472,'7.99','2005-07-08 00:22:06','2006-02-15 22:16:33'),(9281,343,2,5097,'4.99','2005-07-09 06:09:51','2006-02-15 22:16:33'),(9282,343,1,5337,'3.99','2005-07-09 17:03:50','2006-02-15 22:16:33'),(9283,343,1,7069,'6.99','2005-07-27 03:59:35','2006-02-15 22:16:33'),(9284,343,2,8012,'5.99','2005-07-28 15:29:00','2006-02-15 22:16:33'),(9285,343,2,8088,'9.99','2005-07-28 18:23:49','2006-02-15 22:16:33'),(9286,343,2,9458,'5.99','2005-07-30 22:24:34','2006-02-15 22:16:33'),(9287,343,2,9739,'2.99','2005-07-31 09:08:03','2006-02-15 22:16:33'),(9288,343,1,10822,'0.99','2005-08-01 22:54:28','2006-02-15 22:16:33'),(9289,343,1,11212,'0.99','2005-08-02 12:18:29','2006-02-15 22:16:33'),(9290,343,2,11570,'2.99','2005-08-17 01:34:32','2006-02-15 22:16:33'),(9291,343,2,13279,'4.99','2005-08-19 18:02:18','2006-02-15 22:16:33'),(9292,343,2,13522,'3.99','2005-08-20 02:44:06','2006-02-15 22:16:33'),(9293,343,2,13866,'0.99','2005-08-20 15:05:29','2006-02-15 22:16:33'),(9294,343,2,15973,'5.99','2005-08-23 20:04:41','2006-02-15 22:16:34'),(9295,344,2,157,'2.99','2005-05-26 01:25:21','2006-02-15 22:16:34'),(9296,344,2,813,'5.99','2005-05-29 20:14:34','2006-02-15 22:16:34'),(9297,344,1,1341,'3.99','2005-06-15 12:26:18','2006-02-15 22:16:34'),(9298,344,2,1475,'4.99','2005-06-15 21:08:01','2006-02-15 22:16:34'),(9299,344,1,1731,'0.99','2005-06-16 15:32:12','2006-02-15 22:16:34'),(9300,344,2,4028,'5.99','2005-07-07 02:19:14','2006-02-15 22:16:34'),(9301,344,2,4347,'3.99','2005-07-07 18:58:57','2006-02-15 22:16:34'),(9302,344,2,6363,'5.99','2005-07-11 21:13:19','2006-02-15 22:16:34'),(9303,344,2,7480,'4.99','2005-07-27 19:19:53','2006-02-15 22:16:34'),(9304,344,2,8561,'2.99','2005-07-29 11:29:12','2006-02-15 22:16:34'),(9305,344,2,9788,'4.99','2005-07-31 10:28:21','2006-02-15 22:16:34'),(9306,344,2,11116,'5.99','2005-08-02 08:34:40','2006-02-15 22:16:34'),(9307,344,2,12183,'5.99','2005-08-18 01:34:13','2006-02-15 22:16:34'),(9308,344,2,13014,'4.99','2005-08-19 07:56:08','2006-02-15 22:16:34'),(9309,344,1,13033,'3.99','2005-08-19 08:34:39','2006-02-15 22:16:34'),(9310,344,1,14621,'0.99','2005-08-21 18:17:59','2006-02-15 22:16:34'),(9311,344,2,14624,'0.99','2005-08-21 18:32:42','2006-02-15 22:16:34'),(9312,344,1,15215,'2.99','2005-08-22 16:55:26','2006-02-15 22:16:34'),(9313,345,1,206,'0.99','2005-05-26 08:01:54','2006-02-15 22:16:34'),(9314,345,1,363,'0.99','2005-05-27 07:14:00','2006-02-15 22:16:34'),(9315,345,2,1210,'0.99','2005-06-15 02:57:51','2006-02-15 22:16:34'),(9316,345,1,1457,'4.99','2005-06-15 20:05:49','2006-02-15 22:16:34'),(9317,345,2,1550,'0.99','2005-06-16 01:58:35','2006-02-15 22:16:35'),(9318,345,2,2766,'4.99','2005-06-19 17:45:15','2006-02-15 22:16:35'),(9319,345,2,4422,'2.99','2005-07-07 22:09:45','2006-02-15 22:16:35'),(9320,345,1,4425,'2.99','2005-07-07 22:22:44','2006-02-15 22:16:35'),(9321,345,2,4450,'4.99','2005-07-07 23:20:05','2006-02-15 22:16:35'),(9322,345,2,5508,'3.99','2005-07-10 00:50:01','2006-02-15 22:16:35'),(9323,345,1,6307,'7.99','2005-07-11 18:04:29','2006-02-15 22:16:35'),(9324,345,1,7092,'6.99','2005-07-27 04:46:00','2006-02-15 22:16:35'),(9325,345,2,8129,'2.99','2005-07-28 19:47:02','2006-02-15 22:16:35'),(9326,345,2,8694,'8.99','2005-07-29 16:44:48','2006-02-15 22:16:35'),(9327,345,1,9163,'4.99','2005-07-30 11:23:22','2006-02-15 22:16:35'),(9328,345,2,9207,'2.99','2005-07-30 12:49:57','2006-02-15 22:16:35'),(9329,345,2,10215,'8.99','2005-08-01 01:04:28','2006-02-15 22:16:35'),(9330,345,2,10982,'4.99','2005-08-02 04:19:11','2006-02-15 22:16:35'),(9331,345,1,11865,'2.99','2005-08-17 14:03:46','2006-02-15 22:16:35'),(9332,345,1,12485,'4.99','2005-08-18 12:41:41','2006-02-15 22:16:35'),(9333,345,2,12805,'4.99','2005-08-19 00:36:34','2006-02-15 22:16:35'),(9334,345,1,14702,'10.99','2005-08-21 21:00:03','2006-02-15 22:16:35'),(9335,345,1,15551,'4.99','2005-08-23 04:28:25','2006-02-15 22:16:35'),(9336,346,1,65,'4.99','2005-05-25 09:32:03','2006-02-15 22:16:35'),(9337,346,1,810,'4.99','2005-05-29 19:12:04','2006-02-15 22:16:35'),(9338,346,1,1994,'5.99','2005-06-17 11:07:06','2006-02-15 22:16:35'),(9339,346,2,3372,'2.99','2005-06-21 13:34:19','2006-02-15 22:16:36'),(9340,346,1,3421,'2.99','2005-06-21 17:22:58','2006-02-15 22:16:36'),(9341,346,2,4420,'4.99','2005-07-07 22:07:31','2006-02-15 22:16:36'),(9342,346,1,4958,'8.99','2005-07-08 23:19:52','2006-02-15 22:16:36'),(9343,346,1,5428,'4.99','2005-07-09 21:12:50','2006-02-15 22:16:36'),(9344,346,2,5557,'4.99','2005-07-10 03:10:21','2006-02-15 22:16:36'),(9345,346,2,6136,'4.99','2005-07-11 08:34:09','2006-02-15 22:16:36'),(9346,346,2,6323,'2.99','2005-07-11 19:02:19','2006-02-15 22:16:36'),(9347,346,2,6881,'8.99','2005-07-12 20:46:35','2006-02-15 22:16:36'),(9348,346,2,7943,'6.99','2005-07-28 12:50:55','2006-02-15 22:16:36'),(9349,346,2,8272,'5.99','2005-07-29 01:29:51','2006-02-15 22:16:36'),(9350,346,1,8505,'6.99','2005-07-29 09:22:52','2006-02-15 22:16:36'),(9351,346,2,8543,'0.99','2005-07-29 11:01:57','2006-02-15 22:16:36'),(9352,346,2,8732,'8.99','2005-07-29 18:25:03','2006-02-15 22:16:36'),(9353,346,2,9566,'4.99','2005-07-31 02:32:10','2006-02-15 22:16:36'),(9354,346,1,9848,'4.99','2005-07-31 12:44:33','2006-02-15 22:16:36'),(9355,346,1,9927,'2.99','2005-07-31 15:12:13','2006-02-15 22:16:36'),(9356,346,1,10304,'5.99','2005-08-01 04:14:12','2006-02-15 22:16:36'),(9357,346,2,10389,'3.99','2005-08-01 06:46:43','2006-02-15 22:16:36'),(9358,346,2,10521,'0.99','2005-08-01 11:46:17','2006-02-15 22:16:36'),(9359,346,2,11062,'4.99','2005-08-02 06:52:54','2006-02-15 22:16:36'),(9360,346,1,11375,'4.99','2005-08-02 18:14:56','2006-02-15 22:16:36'),(9361,346,2,11470,'2.99','2005-08-02 21:48:28','2006-02-15 22:16:37'),(9362,346,1,14890,'5.99','2005-08-22 04:10:49','2006-02-15 22:16:37'),(9363,346,2,15459,'2.99','2005-08-23 01:09:48','2006-02-15 22:16:37'),(9364,346,1,15535,'0.99','2005-08-23 03:58:02','2006-02-15 22:16:37'),(9365,346,1,15661,'8.99','2005-08-23 08:52:03','2006-02-15 22:16:37'),(9366,346,2,15825,'5.99','2005-08-23 15:10:42','2006-02-15 22:16:37'),(9367,346,1,15827,'0.99','2005-08-23 15:15:19','2006-02-15 22:16:37'),(9368,347,2,1711,'8.99','2005-06-16 14:11:52','2006-02-15 22:16:37'),(9369,347,2,2274,'0.99','2005-06-18 06:31:15','2006-02-15 22:16:37'),(9370,347,1,3026,'4.99','2005-06-20 11:48:00','2006-02-15 22:16:37'),(9371,347,1,3092,'8.99','2005-06-20 16:04:42','2006-02-15 22:16:37'),(9372,347,1,3326,'7.99','2005-06-21 09:04:50','2006-02-15 22:16:37'),(9373,347,2,3605,'0.99','2005-07-06 05:27:15','2006-02-15 22:16:37'),(9374,347,2,3666,'4.99','2005-07-06 08:27:43','2006-02-15 22:16:37'),(9375,347,1,4232,'5.99','2005-07-07 12:49:12','2006-02-15 22:16:37'),(9376,347,1,4523,'6.99','2005-07-08 03:06:59','2006-02-15 22:16:37'),(9377,347,2,5471,'0.99','2005-07-09 23:11:52','2006-02-15 22:16:37'),(9378,347,1,5819,'2.99','2005-07-10 15:56:20','2006-02-15 22:16:37'),(9379,347,2,6121,'1.99','2005-07-11 07:55:27','2006-02-15 22:16:37'),(9380,347,1,7811,'0.99','2005-07-28 08:06:01','2006-02-15 22:16:37'),(9381,347,2,8148,'4.99','2005-07-28 20:39:47','2006-02-15 22:16:37'),(9382,347,2,8153,'4.99','2005-07-28 20:55:49','2006-02-15 22:16:37'),(9383,347,2,8176,'4.99','2005-07-28 21:42:08','2006-02-15 22:16:37'),(9384,347,2,8378,'4.99','2005-07-29 05:28:35','2006-02-15 22:16:38'),(9385,347,2,8771,'2.99','2005-07-29 19:54:41','2006-02-15 22:16:38'),(9386,347,1,9013,'4.99','2005-07-30 05:19:20','2006-02-15 22:16:38'),(9387,347,1,9582,'4.99','2005-07-31 03:05:19','2006-02-15 22:16:38'),(9388,347,1,9856,'3.99','2005-07-31 13:00:35','2006-02-15 22:16:38'),(9389,347,1,9876,'2.99','2005-07-31 13:37:51','2006-02-15 22:16:38'),(9390,347,2,11738,'8.99','2005-08-17 08:45:55','2006-02-15 22:16:38'),(9391,347,1,12195,'2.99','2005-08-18 02:07:49','2006-02-15 22:16:38'),(9392,347,2,12399,'10.99','2005-08-18 09:13:42','2006-02-15 22:16:38'),(9393,347,2,13314,'5.99','2005-08-19 19:12:43','2006-02-15 22:16:38'),(9394,347,2,14894,'4.99','2005-08-22 04:16:56','2006-02-15 22:16:38'),(9395,347,2,14958,'2.99','2005-08-22 06:30:10','2006-02-15 22:16:38'),(9396,347,2,15426,'2.99','2005-08-23 00:07:19','2006-02-15 22:16:38'),(9397,347,2,15555,'4.99','2005-08-23 04:51:52','2006-02-15 22:16:38'),(9398,348,2,153,'0.99','2005-05-26 00:47:47','2006-02-15 22:16:38'),(9399,348,2,821,'0.99','2005-05-29 21:31:12','2006-02-15 22:16:38'),(9400,348,1,1654,'2.99','2005-06-16 09:42:48','2006-02-15 22:16:38'),(9401,348,1,2041,'8.99','2005-06-17 14:19:00','2006-02-15 22:16:38'),(9402,348,2,2499,'0.99','2005-06-18 23:01:36','2006-02-15 22:16:38'),(9403,348,2,3494,'4.99','2005-07-05 23:47:30','2006-02-15 22:16:38'),(9404,348,2,3610,'4.99','2005-07-06 05:36:59','2006-02-15 22:16:38'),(9405,348,2,4556,'9.99','2005-07-08 04:48:41','2006-02-15 22:16:38'),(9406,348,2,4633,'0.99','2005-07-08 08:39:39','2006-02-15 22:16:39'),(9407,348,1,4699,'0.99','2005-07-08 11:36:56','2006-02-15 22:16:39'),(9408,348,1,4807,'8.99','2005-07-08 17:01:48','2006-02-15 22:16:39'),(9409,348,1,5345,'4.99','2005-07-09 17:28:18','2006-02-15 22:16:39'),(9410,348,2,5965,'0.99','2005-07-10 23:51:52','2006-02-15 22:16:39'),(9411,348,2,6776,'2.99','2005-07-12 16:02:09','2006-02-15 22:16:39'),(9412,348,2,7380,'2.99','2005-07-27 15:37:01','2006-02-15 22:16:39'),(9413,348,1,7482,'6.99','2005-07-27 19:24:16','2006-02-15 22:16:39'),(9414,348,2,7825,'4.99','2005-07-28 08:34:57','2006-02-15 22:16:39'),(9415,348,1,8500,'2.99','2005-07-29 09:12:01','2006-02-15 22:16:39'),(9416,348,1,8569,'4.99','2005-07-29 11:39:17','2006-02-15 22:16:39'),(9417,348,2,8682,'4.99','2005-07-29 16:15:26','2006-02-15 22:16:39'),(9418,348,2,9482,'2.99','2005-07-30 23:29:16','2006-02-15 22:16:39'),(9419,348,1,10769,'2.99','2005-08-01 20:43:02','2006-02-15 22:16:39'),(9420,348,2,10972,'2.99','2005-08-02 04:08:25','2006-02-15 22:16:39'),(9421,348,1,11262,'2.99','2005-08-02 13:58:55','2006-02-15 22:16:39'),(9422,348,1,11429,'7.99','2005-08-02 20:03:52','2006-02-15 22:16:39'),(9423,348,2,12564,'2.99','2005-08-18 15:11:35','2006-02-15 22:16:39'),(9424,348,2,12884,'5.99','2005-08-19 03:34:04','2006-02-15 22:16:39'),(9425,348,2,12937,'4.99','2005-08-19 05:25:30','2006-02-15 22:16:39'),(9426,348,2,13238,'2.99','2005-08-19 16:20:56','2006-02-15 22:16:39'),(9427,348,2,13602,'5.99','2005-08-20 06:02:02','2006-02-15 22:16:39'),(9428,348,2,13684,'0.99','2005-08-20 08:55:53','2006-02-15 22:16:40'),(9429,348,1,13962,'1.99','2005-08-20 18:18:06','2006-02-15 22:16:40'),(9430,348,2,14079,'3.99','2005-08-20 23:29:25','2006-02-15 22:16:40'),(9431,348,2,14937,'7.99','2005-08-22 05:51:59','2006-02-15 22:16:40'),(9432,348,2,15817,'0.99','2005-08-23 14:59:51','2006-02-15 22:16:40'),(9433,348,1,15944,'4.99','2005-08-23 18:50:54','2006-02-15 22:16:40'),(9434,349,1,890,'4.99','2005-05-30 07:43:04','2006-02-15 22:16:40'),(9435,349,1,1197,'2.99','2005-06-15 01:42:46','2006-02-15 22:16:40'),(9436,349,1,1523,'0.99','2005-06-16 00:18:40','2006-02-15 22:16:40'),(9437,349,2,2987,'6.99','2005-06-20 08:55:50','2006-02-15 22:16:40'),(9438,349,1,3067,'8.99','2005-06-20 13:59:21','2006-02-15 22:16:40'),(9439,349,2,3488,'3.99','2005-07-05 23:32:49','2006-02-15 22:16:40'),(9440,349,1,4190,'2.99','2005-07-07 10:52:39','2006-02-15 22:16:40'),(9441,349,2,4494,'5.99','2005-07-08 01:42:45','2006-02-15 22:16:40'),(9442,349,1,4881,'0.99','2005-07-08 19:40:34','2006-02-15 22:16:40'),(9443,349,1,5433,'4.99','2005-07-09 21:22:00','2006-02-15 22:16:40'),(9444,349,1,7002,'4.99','2005-07-27 01:26:14','2006-02-15 22:16:40'),(9445,349,1,7046,'4.99','2005-07-27 03:27:56','2006-02-15 22:16:40'),(9446,349,2,7702,'2.99','2005-07-28 03:56:05','2006-02-15 22:16:40'),(9447,349,2,8297,'4.99','2005-07-29 02:45:46','2006-02-15 22:16:40'),(9448,349,1,9262,'1.99','2005-07-30 14:45:02','2006-02-15 22:16:40'),(9449,349,1,9670,'5.99','2005-07-31 06:33:33','2006-02-15 22:16:40'),(9450,349,1,9731,'0.99','2005-07-31 08:54:47','2006-02-15 22:16:41'),(9451,349,1,10987,'4.99','2005-08-02 04:36:52','2006-02-15 22:16:41'),(9452,349,2,11192,'4.99','2005-08-02 11:29:41','2006-02-15 22:16:41'),(9453,349,2,11492,'8.99','2005-08-02 22:46:47','2006-02-15 22:16:41'),(9454,349,1,11905,'3.99','2005-08-17 15:40:18','2006-02-15 22:16:41'),(9455,349,1,13258,'4.99','2005-08-19 17:05:37','2006-02-15 22:16:41'),(9456,349,2,13636,'4.99','2005-08-20 07:20:09','2006-02-15 22:16:41'),(9457,349,2,14200,'6.99','2005-08-21 03:51:27','2006-02-15 22:16:41'),(9458,349,2,14721,'6.99','2005-08-21 21:50:51','2006-02-15 22:16:41'),(9459,349,2,14908,'4.99','2005-08-22 04:44:10','2006-02-15 22:16:41'),(9460,349,1,15833,'6.99','2005-08-23 15:22:15','2006-02-15 22:16:41'),(9461,349,1,15955,'5.99','2005-08-23 19:19:06','2006-02-15 22:16:41'),(9462,349,1,14915,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:41'),(9463,350,1,24,'4.99','2005-05-25 02:53:02','2006-02-15 22:16:41'),(9464,350,1,802,'4.99','2005-05-29 17:38:59','2006-02-15 22:16:41'),(9465,350,2,2011,'3.99','2005-06-17 11:56:09','2006-02-15 22:16:41'),(9466,350,1,2619,'0.99','2005-06-19 08:03:12','2006-02-15 22:16:41'),(9467,350,1,3079,'2.99','2005-06-20 15:13:40','2006-02-15 22:16:41'),(9468,350,2,3206,'0.99','2005-06-21 00:39:39','2006-02-15 22:16:41'),(9469,350,1,3529,'0.99','2005-07-06 01:15:26','2006-02-15 22:16:41'),(9470,350,1,3893,'5.99','2005-07-06 18:59:31','2006-02-15 22:16:41'),(9471,350,1,4767,'2.99','2005-07-08 15:18:53','2006-02-15 22:16:41'),(9472,350,1,5240,'0.99','2005-07-09 13:14:48','2006-02-15 22:16:42'),(9473,350,1,5303,'2.99','2005-07-09 15:44:09','2006-02-15 22:16:42'),(9474,350,1,5786,'1.99','2005-07-10 14:06:44','2006-02-15 22:16:42'),(9475,350,2,6408,'3.99','2005-07-11 23:03:02','2006-02-15 22:16:42'),(9476,350,2,7416,'4.99','2005-07-27 16:55:25','2006-02-15 22:16:42'),(9477,350,2,11504,'0.99','2005-08-16 23:16:46','2006-02-15 22:16:42'),(9478,350,2,11595,'6.99','2005-08-17 02:53:14','2006-02-15 22:16:42'),(9479,350,2,11692,'6.99','2005-08-17 06:52:41','2006-02-15 22:16:42'),(9480,350,1,11800,'0.99','2005-08-17 11:29:52','2006-02-15 22:16:42'),(9481,350,2,12252,'6.99','2005-08-18 03:59:51','2006-02-15 22:16:42'),(9482,350,2,12445,'2.99','2005-08-18 10:56:20','2006-02-15 22:16:42'),(9483,350,2,13086,'0.99','2005-08-19 10:32:28','2006-02-15 22:16:42'),(9484,350,2,15789,'1.99','2005-08-23 13:56:40','2006-02-15 22:16:42'),(9485,350,1,15807,'0.99','2005-08-23 14:35:10','2006-02-15 22:16:42'),(9486,351,1,1137,'1.99','2005-05-31 19:20:14','2006-02-15 22:16:42'),(9487,351,2,1792,'5.99','2005-06-16 20:04:50','2006-02-15 22:16:42'),(9488,351,1,1869,'0.99','2005-06-17 02:08:00','2006-02-15 22:16:42'),(9489,351,1,2759,'2.99','2005-06-19 17:10:24','2006-02-15 22:16:42'),(9490,351,1,3836,'2.99','2005-07-06 16:26:04','2006-02-15 22:16:42'),(9491,351,1,4544,'0.99','2005-07-08 04:11:04','2006-02-15 22:16:42'),(9492,351,1,4756,'1.99','2005-07-08 14:24:00','2006-02-15 22:16:42'),(9493,351,2,4761,'5.99','2005-07-08 14:51:45','2006-02-15 22:16:42'),(9494,351,1,5280,'0.99','2005-07-09 14:55:07','2006-02-15 22:16:43'),(9495,351,1,5912,'3.99','2005-07-10 20:58:22','2006-02-15 22:16:43'),(9496,351,2,6180,'3.99','2005-07-11 11:06:50','2006-02-15 22:16:43'),(9497,351,1,6664,'4.99','2005-07-12 11:28:22','2006-02-15 22:16:43'),(9498,351,2,6777,'5.99','2005-07-12 16:04:40','2006-02-15 22:16:43'),(9499,351,2,7630,'4.99','2005-07-28 01:01:03','2006-02-15 22:16:43'),(9500,351,2,8512,'4.99','2005-07-29 09:48:03','2006-02-15 22:16:43'),(9501,351,1,9707,'7.99','2005-07-31 07:44:18','2006-02-15 22:16:43'),(9502,351,2,10119,'0.99','2005-07-31 21:20:59','2006-02-15 22:16:43'),(9503,351,2,10501,'2.99','2005-08-01 11:04:46','2006-02-15 22:16:43'),(9504,351,2,11127,'0.99','2005-08-02 09:00:59','2006-02-15 22:16:43'),(9505,351,1,14368,'6.99','2005-08-21 09:31:47','2006-02-15 22:16:43'),(9506,351,2,15142,'4.99','2005-08-22 13:44:32','2006-02-15 22:16:43'),(9507,351,1,15664,'4.99','2005-08-23 08:57:11','2006-02-15 22:16:43'),(9508,351,2,15712,'2.99','2005-08-23 10:43:56','2006-02-15 22:16:43'),(9509,351,1,15762,'2.99','2005-08-23 13:01:43','2006-02-15 22:16:43'),(9510,352,1,784,'2.99','2005-05-29 14:44:22','2006-02-15 22:16:43'),(9511,352,1,1498,'0.99','2005-06-15 21:58:00','2006-02-15 22:16:43'),(9512,352,1,1649,'4.99','2005-06-16 09:20:33','2006-02-15 22:16:43'),(9513,352,1,1678,'4.99','2005-06-16 11:08:28','2006-02-15 22:16:43'),(9514,352,1,1780,'4.99','2005-06-16 19:11:45','2006-02-15 22:16:43'),(9515,352,2,3331,'4.99','2005-06-21 09:37:53','2006-02-15 22:16:43'),(9516,352,2,4116,'4.99','2005-07-07 06:56:13','2006-02-15 22:16:44'),(9517,352,2,6329,'5.99','2005-07-11 19:10:38','2006-02-15 22:16:44'),(9518,352,1,7033,'2.99','2005-07-27 03:03:25','2006-02-15 22:16:44'),(9519,352,1,7419,'7.99','2005-07-27 17:04:15','2006-02-15 22:16:44'),(9520,352,2,7512,'6.99','2005-07-27 20:40:40','2006-02-15 22:16:44'),(9521,352,1,7579,'4.99','2005-07-27 23:06:41','2006-02-15 22:16:44'),(9522,352,1,7845,'5.99','2005-07-28 09:18:07','2006-02-15 22:16:44'),(9523,352,1,7886,'2.99','2005-07-28 10:37:55','2006-02-15 22:16:44'),(9524,352,1,9463,'0.99','2005-07-30 22:30:57','2006-02-15 22:16:44'),(9525,352,1,11793,'5.99','2005-08-17 11:05:53','2006-02-15 22:16:44'),(9526,352,1,11823,'6.99','2005-08-17 12:36:37','2006-02-15 22:16:44'),(9527,352,2,11986,'0.99','2005-08-17 18:21:58','2006-02-15 22:16:44'),(9528,352,2,12234,'5.99','2005-08-18 03:17:33','2006-02-15 22:16:44'),(9529,352,1,12751,'2.99','2005-08-18 22:33:22','2006-02-15 22:16:44'),(9530,352,1,14130,'4.99','2005-08-21 01:43:11','2006-02-15 22:16:44'),(9531,352,2,14852,'0.99','2005-08-22 02:25:53','2006-02-15 22:16:44'),(9532,352,2,13578,'2.99','2006-02-14 15:16:03','2006-02-15 22:16:44'),(9533,353,2,1103,'6.99','2005-05-31 14:24:18','2006-02-15 22:16:44'),(9534,353,2,1359,'2.99','2005-06-15 13:30:30','2006-02-15 22:16:44'),(9535,353,2,1928,'7.99','2005-06-17 06:48:31','2006-02-15 22:16:44'),(9536,353,2,3233,'6.99','2005-06-21 02:39:31','2006-02-15 22:16:44'),(9537,353,2,4380,'5.99','2005-07-07 20:35:00','2006-02-15 22:16:44'),(9538,353,2,6559,'1.99','2005-07-12 05:20:35','2006-02-15 22:16:45'),(9539,353,1,6610,'3.99','2005-07-12 08:20:02','2006-02-15 22:16:45'),(9540,353,2,7993,'3.99','2005-07-28 14:56:41','2006-02-15 22:16:45'),(9541,353,2,10071,'2.99','2005-07-31 19:49:35','2006-02-15 22:16:45'),(9542,353,1,11186,'0.99','2005-08-02 11:12:08','2006-02-15 22:16:45'),(9543,353,2,11414,'4.99','2005-08-02 19:43:07','2006-02-15 22:16:45'),(9544,353,2,11698,'4.99','2005-08-17 07:09:59','2006-02-15 22:16:45'),(9545,353,1,12928,'5.99','2005-08-19 05:04:09','2006-02-15 22:16:45'),(9546,353,2,13604,'0.99','2005-08-20 06:03:33','2006-02-15 22:16:45'),(9547,353,1,14396,'4.99','2005-08-21 10:24:54','2006-02-15 22:16:45'),(9548,353,1,15564,'1.99','2005-08-23 05:10:42','2006-02-15 22:16:45'),(9549,353,2,15650,'0.99','2005-08-23 08:29:53','2006-02-15 22:16:45'),(9550,353,2,15676,'2.99','2005-08-23 09:23:08','2006-02-15 22:16:45'),(9551,354,1,140,'0.99','2005-05-25 23:34:22','2006-02-15 22:16:45'),(9552,354,2,158,'1.99','2005-05-26 01:27:11','2006-02-15 22:16:45'),(9553,354,2,402,'0.99','2005-05-27 13:17:18','2006-02-15 22:16:45'),(9554,354,1,1491,'0.99','2005-06-15 21:48:18','2006-02-15 22:16:45'),(9555,354,1,2275,'4.99','2005-06-18 06:31:29','2006-02-15 22:16:45'),(9556,354,1,2769,'6.99','2005-06-19 17:52:14','2006-02-15 22:16:45'),(9557,354,1,3139,'2.99','2005-06-20 19:44:45','2006-02-15 22:16:45'),(9558,354,2,3821,'2.99','2005-07-06 15:36:20','2006-02-15 22:16:45'),(9559,354,2,4034,'0.99','2005-07-07 02:36:33','2006-02-15 22:16:45'),(9560,354,1,4449,'5.99','2005-07-07 23:18:58','2006-02-15 22:16:46'),(9561,354,2,4745,'2.99','2005-07-08 13:45:09','2006-02-15 22:16:46'),(9562,354,1,5354,'4.99','2005-07-09 18:04:33','2006-02-15 22:16:46'),(9563,354,2,5556,'4.99','2005-07-10 03:10:17','2006-02-15 22:16:46'),(9564,354,1,5873,'3.99','2005-07-10 19:02:10','2006-02-15 22:16:46'),(9565,354,1,6054,'0.99','2005-07-11 03:58:39','2006-02-15 22:16:46'),(9566,354,1,6838,'4.99','2005-07-12 19:01:30','2006-02-15 22:16:46'),(9567,354,1,6926,'0.99','2005-07-26 22:52:45','2006-02-15 22:16:46'),(9568,354,1,6939,'5.99','2005-07-26 23:17:51','2006-02-15 22:16:46'),(9569,354,2,7148,'0.99','2005-07-27 07:04:09','2006-02-15 22:16:46'),(9570,354,2,7235,'2.99','2005-07-27 10:09:30','2006-02-15 22:16:46'),(9571,354,2,7241,'0.99','2005-07-27 10:25:49','2006-02-15 22:16:46'),(9572,354,2,8321,'4.99','2005-07-29 03:50:54','2006-02-15 22:16:46'),(9573,354,2,8477,'8.99','2005-07-29 08:40:36','2006-02-15 22:16:46'),(9574,354,1,8609,'4.99','2005-07-29 13:19:25','2006-02-15 22:16:46'),(9575,354,2,8921,'0.99','2005-07-30 02:04:02','2006-02-15 22:16:46'),(9576,354,1,9130,'2.99','2005-07-30 09:55:10','2006-02-15 22:16:46'),(9577,354,1,10420,'6.99','2005-08-01 08:13:53','2006-02-15 22:16:46'),(9578,354,2,12243,'6.99','2005-08-18 03:38:54','2006-02-15 22:16:46'),(9579,354,1,12544,'3.99','2005-08-18 14:25:51','2006-02-15 22:16:46'),(9580,354,1,12998,'4.99','2005-08-19 07:32:16','2006-02-15 22:16:46'),(9581,354,2,14212,'2.99','2005-08-21 04:29:26','2006-02-15 22:16:47'),(9582,354,2,14245,'0.99','2005-08-21 05:30:54','2006-02-15 22:16:47'),(9583,354,1,14840,'5.99','2005-08-22 01:58:42','2006-02-15 22:16:47'),(9584,354,2,15956,'0.99','2005-08-23 19:19:21','2006-02-15 22:16:47'),(9585,354,1,12759,'7.98','2006-02-14 15:16:03','2006-02-15 22:16:47'),(9586,354,1,11782,'0.00','2006-02-14 15:16:03','2006-02-15 22:16:47'),(9587,355,1,1110,'3.99','2005-05-31 15:22:51','2006-02-15 22:16:47'),(9588,355,2,1488,'0.99','2005-06-15 21:39:54','2006-02-15 22:16:47'),(9589,355,1,1612,'2.99','2005-06-16 06:52:05','2006-02-15 22:16:47'),(9590,355,1,3567,'5.99','2005-07-06 03:09:36','2006-02-15 22:16:47'),(9591,355,1,3730,'6.99','2005-07-06 11:31:24','2006-02-15 22:16:47'),(9592,355,1,5210,'4.99','2005-07-09 11:24:19','2006-02-15 22:16:47'),(9593,355,1,5564,'5.99','2005-07-10 03:23:05','2006-02-15 22:16:47'),(9594,355,1,6127,'0.99','2005-07-11 08:06:59','2006-02-15 22:16:47'),(9595,355,2,6262,'6.99','2005-07-11 15:33:24','2006-02-15 22:16:47'),(9596,355,1,6437,'2.99','2005-07-12 00:20:29','2006-02-15 22:16:47'),(9597,355,2,6669,'4.99','2005-07-12 11:39:55','2006-02-15 22:16:47'),(9598,355,2,7108,'4.99','2005-07-27 05:28:32','2006-02-15 22:16:47'),(9599,355,2,7477,'5.99','2005-07-27 19:11:03','2006-02-15 22:16:47'),(9600,355,2,8418,'1.99','2005-07-29 06:54:21','2006-02-15 22:16:47'),(9601,355,1,10498,'0.99','2005-08-01 10:56:48','2006-02-15 22:16:47'),(9602,355,2,11471,'0.99','2005-08-02 21:49:03','2006-02-15 22:16:47'),(9603,355,2,13821,'1.99','2005-08-20 13:33:47','2006-02-15 22:16:48'),(9604,355,1,15367,'3.99','2005-08-22 21:47:53','2006-02-15 22:16:48'),(9605,355,2,15531,'2.99','2005-08-23 03:52:36','2006-02-15 22:16:48'),(9606,355,1,14760,'0.99','2006-02-14 15:16:03','2006-02-15 22:16:48'),(9607,356,2,1088,'4.99','2005-05-31 11:35:13','2006-02-15 22:16:48'),(9608,356,1,1410,'0.99','2005-06-15 16:59:46','2006-02-15 22:16:48'),(9609,356,1,2405,'2.99','2005-06-18 16:36:38','2006-02-15 22:16:48'),(9610,356,1,2433,'4.99','2005-06-18 18:10:17','2006-02-15 22:16:48'),(9611,356,2,3829,'6.99','2005-07-06 15:59:40','2006-02-15 22:16:48'),(9612,356,2,4599,'4.99','2005-07-08 06:48:26','2006-02-15 22:16:48'),(9613,356,1,5513,'0.99','2005-07-10 01:05:41','2006-02-15 22:16:48'),(9614,356,1,6593,'4.99','2005-07-12 07:21:17','2006-02-15 22:16:48'),(9615,356,1,6648,'0.99','2005-07-12 10:46:30','2006-02-15 22:16:48'),(9616,356,1,7079,'2.99','2005-07-27 04:21:58','2006-02-15 22:16:48'),(9617,356,1,7758,'1.99','2005-07-28 06:23:41','2006-02-15 22:16:48'),(9618,356,1,7902,'0.99','2005-07-28 11:14:19','2006-02-15 22:16:48'),(9619,356,1,8198,'3.99','2005-07-28 23:08:05','2006-02-15 22:16:48'),(9620,356,1,8975,'5.99','2005-07-30 04:10:18','2006-02-15 22:16:48'),(9621,356,2,9037,'4.99','2005-07-30 06:23:14','2006-02-15 22:16:48'),(9622,356,2,9523,'3.99','2005-07-31 00:56:09','2006-02-15 22:16:48'),(9623,356,2,9883,'6.99','2005-07-31 13:53:37','2006-02-15 22:16:48'),(9624,356,1,10427,'3.99','2005-08-01 08:30:11','2006-02-15 22:16:48'),(9625,356,1,10854,'4.99','2005-08-02 00:02:06','2006-02-15 22:16:49'),(9626,356,1,11535,'3.99','2005-08-17 00:39:54','2006-02-15 22:16:49'),(9627,356,2,11579,'2.99','2005-08-17 01:57:49','2006-02-15 22:16:49'),(9628,356,2,12037,'4.99','2005-08-17 20:21:35','2006-02-15 22:16:49'),(9629,356,2,12876,'2.99','2005-08-19 03:12:19','2006-02-15 22:16:49'),(9630,356,1,12913,'0.99','2005-08-19 04:25:39','2006-02-15 22:16:49'),(9631,356,2,13107,'4.99','2005-08-19 11:13:58','2006-02-15 22:16:49'),(9632,356,2,13442,'5.99','2005-08-19 23:50:45','2006-02-15 22:16:49'),(9633,356,2,13703,'6.99','2005-08-20 09:29:35','2006-02-15 22:16:49'),(9634,356,1,15705,'4.99','2005-08-23 10:32:52','2006-02-15 22:16:49'),(9635,356,2,15754,'5.99','2005-08-23 12:43:42','2006-02-15 22:16:49'),(9636,356,1,15757,'2.99','2005-08-23 12:47:16','2006-02-15 22:16:49'),(9637,357,1,144,'2.99','2005-05-25 23:49:56','2006-02-15 22:16:49'),(9638,357,1,824,'4.99','2005-05-29 21:45:32','2006-02-15 22:16:49'),(9639,357,2,945,'0.99','2005-05-30 15:33:17','2006-02-15 22:16:49'),(9640,357,2,1246,'5.99','2005-06-15 05:11:19','2006-02-15 22:16:49'),(9641,357,1,1788,'1.99','2005-06-16 19:47:18','2006-02-15 22:16:49'),(9642,357,2,1971,'1.99','2005-06-17 09:23:59','2006-02-15 22:16:49'),(9643,357,2,2153,'6.99','2005-06-17 22:58:04','2006-02-15 22:16:49'),(9644,357,1,3865,'3.99','2005-07-06 17:46:57','2006-02-15 22:16:49'),(9645,357,1,4478,'0.99','2005-07-08 00:39:08','2006-02-15 22:16:49'),(9646,357,1,5896,'0.99','2005-07-10 20:15:56','2006-02-15 22:16:49'),(9647,357,1,6288,'8.99','2005-07-11 17:01:52','2006-02-15 22:16:50'),(9648,357,2,6367,'4.99','2005-07-11 21:18:29','2006-02-15 22:16:50'),(9649,357,2,6405,'2.99','2005-07-11 22:53:12','2006-02-15 22:16:50'),(9650,357,1,6839,'0.99','2005-07-12 19:03:19','2006-02-15 22:16:50'),(9651,357,1,7353,'2.99','2005-07-27 14:38:39','2006-02-15 22:16:50'),(9652,357,1,7366,'5.99','2005-07-27 15:01:17','2006-02-15 22:16:50'),(9653,357,2,8041,'2.99','2005-07-28 16:39:56','2006-02-15 22:16:50'),(9654,357,1,8124,'2.99','2005-07-28 19:28:58','2006-02-15 22:16:50'),(9655,357,2,9233,'3.99','2005-07-30 13:44:15','2006-02-15 22:16:50'),(9656,357,2,10391,'2.99','2005-08-01 06:49:05','2006-02-15 22:16:50'),(9657,357,1,10502,'2.99','2005-08-01 11:06:39','2006-02-15 22:16:50'),(9658,357,1,10503,'6.99','2005-08-01 11:07:44','2006-02-15 22:16:50'),(9659,357,2,10764,'0.99','2005-08-01 20:32:42','2006-02-15 22:16:50'),(9660,357,2,11065,'2.99','2005-08-02 06:57:55','2006-02-15 22:16:50'),(9661,357,1,14926,'0.99','2005-08-22 05:18:44','2006-02-15 22:16:50'),(9662,357,2,15869,'2.99','2005-08-23 16:22:20','2006-02-15 22:16:50'),(9663,358,2,858,'4.99','2005-05-30 02:10:32','2006-02-15 22:16:50'),(9664,358,1,1455,'2.99','2005-06-15 19:51:06','2006-02-15 22:16:50'),(9665,358,2,1908,'0.99','2005-06-17 05:10:36','2006-02-15 22:16:50'),(9666,358,1,2114,'5.99','2005-06-17 20:00:25','2006-02-15 22:16:50'),(9667,358,1,2721,'2.99','2005-06-19 14:53:24','2006-02-15 22:16:50'),(9668,358,1,2749,'2.99','2005-06-19 16:27:35','2006-02-15 22:16:51'),(9669,358,1,3245,'2.99','2005-06-21 03:06:11','2006-02-15 22:16:51'),(9670,358,1,3753,'2.99','2005-07-06 12:34:06','2006-02-15 22:16:51'),(9671,358,1,3809,'2.99','2005-07-06 15:16:37','2006-02-15 22:16:51'),(9672,358,2,5023,'5.99','2005-07-09 02:23:16','2006-02-15 22:16:51'),(9673,358,1,6362,'2.99','2005-07-11 21:09:31','2006-02-15 22:16:51'),(9674,358,1,8621,'2.99','2005-07-29 13:52:42','2006-02-15 22:16:51'),(9675,358,2,9062,'0.99','2005-07-30 07:23:17','2006-02-15 22:16:51'),(9676,358,1,9568,'0.99','2005-07-31 02:37:44','2006-02-15 22:16:51'),(9677,358,1,10193,'2.99','2005-08-01 00:33:27','2006-02-15 22:16:51'),(9678,358,1,10482,'4.99','2005-08-01 10:17:47','2006-02-15 22:16:51'),(9679,358,2,11149,'5.99','2005-08-02 09:51:43','2006-02-15 22:16:51'),(9680,358,2,11653,'4.99','2005-08-17 05:06:10','2006-02-15 22:16:51'),(9681,358,1,12452,'6.99','2005-08-18 11:14:35','2006-02-15 22:16:51'),(9682,358,1,13197,'2.99','2005-08-19 14:44:03','2006-02-15 22:16:51'),(9683,358,1,14004,'7.99','2005-08-20 20:16:35','2006-02-15 22:16:51'),(9684,359,1,284,'8.99','2005-05-26 19:21:44','2006-02-15 22:16:51'),(9685,359,2,392,'2.99','2005-05-27 11:14:42','2006-02-15 22:16:51'),(9686,359,1,528,'3.99','2005-05-28 04:30:05','2006-02-15 22:16:51'),(9687,359,2,1329,'4.99','2005-06-15 11:25:06','2006-02-15 22:16:51'),(9688,359,2,1770,'1.99','2005-06-16 18:07:55','2006-02-15 22:16:51'),(9689,359,1,2401,'0.99','2005-06-18 16:22:03','2006-02-15 22:16:51'),(9690,359,1,2736,'4.99','2005-06-19 15:43:20','2006-02-15 22:16:52'),(9691,359,2,4830,'7.99','2005-07-08 17:56:23','2006-02-15 22:16:52'),(9692,359,2,6424,'9.99','2005-07-11 23:49:37','2006-02-15 22:16:52'),(9693,359,1,6542,'2.99','2005-07-12 04:53:49','2006-02-15 22:16:52'),(9694,359,2,6741,'0.99','2005-07-12 14:24:16','2006-02-15 22:16:52'),(9695,359,2,7098,'0.99','2005-07-27 05:01:08','2006-02-15 22:16:52'),(9696,359,1,7115,'0.99','2005-07-27 05:42:58','2006-02-15 22:16:52'),(9697,359,1,8174,'4.99','2005-07-28 21:36:52','2006-02-15 22:16:52'),(9698,359,1,9898,'4.99','2005-07-31 14:12:03','2006-02-15 22:16:52'),(9699,359,2,10174,'5.99','2005-07-31 23:40:08','2006-02-15 22:16:52'),(9700,359,1,11032,'4.99','2005-08-02 05:53:35','2006-02-15 22:16:52'),(9701,359,1,12611,'1.99','2005-08-18 17:09:42','2006-02-15 22:16:52'),(9702,359,2,13297,'2.99','2005-08-19 18:45:49','2006-02-15 22:16:52'),(9703,359,1,14258,'1.99','2005-08-21 05:56:36','2006-02-15 22:16:52'),(9704,359,2,14598,'5.99','2005-08-21 17:40:05','2006-02-15 22:16:52'),(9705,359,1,15104,'2.99','2005-08-22 12:01:16','2006-02-15 22:16:52'),(9706,359,1,15148,'4.99','2005-08-22 13:59:19','2006-02-15 22:16:52'),(9707,359,1,15453,'1.99','2005-08-23 01:01:01','2006-02-15 22:16:52'),(9708,359,2,15655,'4.99','2006-02-14 15:16:03','2006-02-15 22:16:52'),(9709,360,1,633,'0.99','2005-05-28 17:37:59','2006-02-15 22:16:52'),(9710,360,2,777,'4.99','2005-05-29 14:07:58','2006-02-15 22:16:52'),(9711,360,2,1492,'0.99','2005-06-15 21:48:35','2006-02-15 22:16:53'),(9712,360,2,2402,'6.99','2005-06-18 16:24:45','2006-02-15 22:16:53'),(9713,360,2,2541,'3.99','2005-06-19 02:08:10','2006-02-15 22:16:53'),(9714,360,2,2780,'6.99','2005-06-19 18:19:33','2006-02-15 22:16:53'),(9715,360,1,4056,'4.99','2005-07-07 03:57:36','2006-02-15 22:16:53'),(9716,360,1,4487,'7.99','2005-07-08 01:20:22','2006-02-15 22:16:53'),(9717,360,2,5456,'2.99','2005-07-09 22:31:45','2006-02-15 22:16:53'),(9718,360,1,5834,'1.99','2005-07-10 16:44:12','2006-02-15 22:16:53'),(9719,360,1,5995,'3.99','2005-07-11 01:15:39','2006-02-15 22:16:53'),(9720,360,1,6442,'0.99','2005-07-12 00:29:45','2006-02-15 22:16:53'),(9721,360,2,6770,'5.99','2005-07-12 15:49:40','2006-02-15 22:16:53'),(9722,360,1,7251,'2.99','2005-07-27 10:44:55','2006-02-15 22:16:53'),(9723,360,2,7588,'9.99','2005-07-27 23:23:31','2006-02-15 22:16:53'),(9724,360,1,7654,'4.99','2005-07-28 02:00:14','2006-02-15 22:16:53'),(9725,360,2,7908,'3.99','2005-07-28 11:32:57','2006-02-15 22:16:53'),(9726,360,1,8220,'2.99','2005-07-28 23:46:41','2006-02-15 22:16:53'),(9727,360,2,8361,'2.99','2005-07-29 05:08:57','2006-02-15 22:16:53'),(9728,360,1,9283,'4.99','2005-07-30 15:25:19','2006-02-15 22:16:53'),(9729,360,2,9352,'0.99','2005-07-30 18:29:26','2006-02-15 22:16:53'),(9730,360,1,9623,'2.99','2005-07-31 04:30:02','2006-02-15 22:16:53'),(9731,360,2,9659,'3.99','2005-07-31 06:02:14','2006-02-15 22:16:53'),(9732,360,2,10857,'2.99','2005-08-02 00:07:20','2006-02-15 22:16:54'),(9733,360,2,11264,'6.99','2005-08-02 14:05:18','2006-02-15 22:16:54'),(9734,360,2,11553,'4.99','2005-08-17 01:04:31','2006-02-15 22:16:54'),(9735,360,2,12088,'5.99','2005-08-17 22:20:16','2006-02-15 22:16:54'),(9736,360,1,12773,'5.99','2005-08-18 23:32:19','2006-02-15 22:16:54'),(9737,360,2,12795,'0.99','2005-08-19 00:21:52','2006-02-15 22:16:54'),(9738,360,1,12839,'6.99','2005-08-19 01:53:43','2006-02-15 22:16:54'),(9739,360,1,12990,'4.99','2005-08-19 07:20:39','2006-02-15 22:16:54'),(9740,360,2,13894,'7.99','2005-08-20 15:55:20','2006-02-15 22:16:54'),(9741,360,1,14700,'4.99','2005-08-21 20:53:40','2006-02-15 22:16:54'),(9742,360,1,15310,'2.99','2005-08-22 19:56:41','2006-02-15 22:16:54'),(9743,361,1,368,'5.99','2005-05-27 07:42:29','2006-02-15 22:16:54'),(9744,361,2,1120,'4.99','2005-05-31 16:37:14','2006-02-15 22:16:54'),(9745,361,2,2353,'4.99','2005-06-18 12:53:25','2006-02-15 22:16:54'),(9746,361,2,2558,'1.99','2005-06-19 03:09:16','2006-02-15 22:16:54'),(9747,361,1,2851,'2.99','2005-06-19 23:07:03','2006-02-15 22:16:54'),(9748,361,2,3303,'2.99','2005-06-21 07:34:14','2006-02-15 22:16:54'),(9749,361,2,5154,'2.99','2005-07-09 08:46:18','2006-02-15 22:16:54'),(9750,361,1,6152,'0.99','2005-07-11 09:25:52','2006-02-15 22:16:54'),(9751,361,2,6829,'4.99','2005-07-12 18:38:59','2006-02-15 22:16:54'),(9752,361,2,6911,'0.99','2005-07-12 22:14:34','2006-02-15 22:16:54'),(9753,361,1,6914,'1.99','2005-07-12 22:26:56','2006-02-15 22:16:55'),(9754,361,1,7538,'2.99','2005-07-27 21:38:04','2006-02-15 22:16:55'),(9755,361,2,7712,'2.99','2005-07-28 04:29:53','2006-02-15 22:16:55'),(9756,361,2,8189,'4.99','2005-07-28 22:36:26','2006-02-15 22:16:55'),(9757,361,1,10145,'1.99','2005-07-31 22:15:13','2006-02-15 22:16:55'),(9758,361,1,10151,'4.99','2005-07-31 22:22:37','2006-02-15 22:16:55'),(9759,361,1,10414,'0.99','2005-08-01 08:03:55','2006-02-15 22:16:55'),(9760,361,2,10975,'0.99','2005-08-02 04:11:25','2006-02-15 22:16:55'),(9761,361,2,11031,'5.99','2005-08-02 05:52:58','2006-02-15 22:16:55'),(9762,361,2,11243,'5.99','2005-08-02 13:32:48','2006-02-15 22:16:55'),(9763,361,1,11327,'2.99','2005-08-02 16:40:47','2006-02-15 22:16:55'),(9764,361,1,11991,'3.99','2005-08-17 18:27:08','2006-02-15 22:16:55'),(9765,361,2,12626,'5.99','2005-08-18 17:36:45','2006-02-15 22:16:55'),(9766,361,2,12690,'2.99','2005-08-18 20:06:57','2006-02-15 22:16:55'),(9767,361,1,13135,'0.99','2005-08-19 12:22:52','2006-02-15 22:16:55'),(9768,361,2,14031,'0.99','2005-08-20 21:24:24','2006-02-15 22:16:55'),(9769,361,1,14422,'0.99','2005-08-21 11:21:46','2006-02-15 22:16:55'),(9770,361,1,15759,'6.99','2005-08-23 12:47:37','2006-02-15 22:16:55'),(9771,361,2,15935,'2.99','2005-08-23 18:41:11','2006-02-15 22:16:55'),(9772,361,1,13298,'3.98','2006-02-14 15:16:03','2006-02-15 22:16:55'),(9773,361,1,14769,'0.00','2006-02-14 15:16:03','2006-02-15 22:16:55'),(9774,362,2,1035,'4.99','2005-05-31 05:01:09','2006-02-15 22:16:56'),(9775,362,1,1429,'2.99','2005-06-15 18:24:10','2006-02-15 22:16:56'),(9776,362,1,1529,'2.99','2005-06-16 00:37:35','2006-02-15 22:16:56'),(9777,362,1,1615,'2.99','2005-06-16 07:00:28','2006-02-15 22:16:56'),(9778,362,2,3197,'2.99','2005-06-21 00:07:23','2006-02-15 22:16:56'),(9779,362,2,3393,'2.99','2005-06-21 15:14:27','2006-02-15 22:16:56'),(9780,362,2,4646,'8.99','2005-07-08 09:23:26','2006-02-15 22:16:56'),(9781,362,1,5227,'4.99','2005-07-09 12:16:39','2006-02-15 22:16:56'),(9782,362,2,5563,'1.99','2005-07-10 03:21:02','2006-02-15 22:16:56'),(9783,362,2,5690,'5.99','2005-07-10 09:26:49','2006-02-15 22:16:56'),(9784,362,1,6204,'4.99','2005-07-11 12:29:22','2006-02-15 22:16:56'),(9785,362,2,6576,'4.99','2005-07-12 06:13:41','2006-02-15 22:16:56'),(9786,362,1,6981,'4.99','2005-07-27 00:51:38','2006-02-15 22:16:56'),(9787,362,1,7172,'1.99','2005-07-27 07:59:16','2006-02-15 22:16:56'),(9788,362,1,7485,'2.99','2005-07-27 19:29:09','2006-02-15 22:16:56'),(9789,362,1,8081,'2.99','2005-07-28 18:06:46','2006-02-15 22:16:56'),(9790,362,2,8325,'2.99','2005-07-29 03:57:27','2006-02-15 22:16:56'),(9791,362,2,8364,'4.99','2005-07-29 05:10:31','2006-02-15 22:16:56'),(9792,362,1,8662,'0.99','2005-07-29 15:31:33','2006-02-15 22:16:56'),(9793,362,1,8714,'2.99','2005-07-29 17:31:40','2006-02-15 22:16:56'),(9794,362,1,9784,'4.99','2005-07-31 10:21:32','2006-02-15 22:16:56'),(9795,362,2,10546,'3.99','2005-08-01 12:44:17','2006-02-15 22:16:56'),(9796,362,2,12244,'4.99','2005-08-18 03:39:11','2006-02-15 22:16:57'),(9797,362,1,12854,'6.99','2005-08-19 02:18:51','2006-02-15 22:16:57'),(9798,362,1,13603,'6.99','2005-08-20 06:02:48','2006-02-15 22:16:57'),(9799,362,2,14051,'6.99','2005-08-20 22:09:51','2006-02-15 22:16:57'),(9800,362,2,14129,'2.99','2005-08-21 01:42:15','2006-02-15 22:16:57'),(9801,362,2,14336,'4.99','2005-08-21 08:33:42','2006-02-15 22:16:57'),(9802,362,1,14752,'5.99','2005-08-21 23:11:42','2006-02-15 22:16:57'),(9803,362,1,14759,'11.99','2005-08-21 23:28:58','2006-02-15 22:16:57'),(9804,362,1,14808,'4.99','2005-08-22 00:58:35','2006-02-15 22:16:57'),(9805,362,1,14950,'2.99','2005-08-22 06:17:12','2006-02-15 22:16:57'),(9806,363,1,733,'3.99','2005-05-29 07:35:21','2006-02-15 22:16:57'),(9807,363,2,1426,'4.99','2005-06-15 18:16:24','2006-02-15 22:16:57'),(9808,363,2,1569,'4.99','2005-06-16 03:19:09','2006-02-15 22:16:57'),(9809,363,1,1847,'4.99','2005-06-17 00:05:22','2006-02-15 22:16:57'),(9810,363,1,2540,'4.99','2005-06-19 02:04:48','2006-02-15 22:16:57'),(9811,363,2,3281,'2.99','2005-06-21 06:08:47','2006-02-15 22:16:57'),(9812,363,1,3726,'3.99','2005-07-06 11:15:49','2006-02-15 22:16:57'),(9813,363,2,5687,'3.99','2005-07-10 09:07:19','2006-02-15 22:16:57'),(9814,363,1,5758,'6.99','2005-07-10 12:42:43','2006-02-15 22:16:57'),(9815,363,2,6140,'4.99','2005-07-11 08:40:47','2006-02-15 22:16:57'),(9816,363,2,6705,'4.99','2005-07-12 12:53:11','2006-02-15 22:16:58'),(9817,363,2,6821,'2.99','2005-07-12 18:22:10','2006-02-15 22:16:58'),(9818,363,2,6878,'4.99','2005-07-12 20:37:13','2006-02-15 22:16:58'),(9819,363,1,7256,'2.99','2005-07-27 10:58:32','2006-02-15 22:16:58'),(9820,363,2,7708,'4.99','2005-07-28 04:19:15','2006-02-15 22:16:58'),(9821,363,2,8121,'2.99','2005-07-28 19:25:45','2006-02-15 22:16:58'),(9822,363,2,8522,'3.99','2005-07-29 10:16:19','2006-02-15 22:16:58'),(9823,363,2,8804,'2.99','2005-07-29 21:28:19','2006-02-15 22:16:58'),(9824,363,2,8841,'4.99','2005-07-29 22:56:07','2006-02-15 22:16:58'),(9825,363,1,9968,'4.99','2005-07-31 16:32:16','2006-02-15 22:16:58'),(9826,363,1,9977,'8.99','2005-07-31 16:58:42','2006-02-15 22:16:58'),(9827,363,1,10339,'6.99','2005-08-01 05:05:50','2006-02-15 22:16:58'),(9828,363,2,12189,'5.99','2005-08-18 01:51:44','2006-02-15 22:16:58'),(9829,363,2,12760,'4.99','2005-08-18 23:03:19','2006-02-15 22:16:58'),(9830,363,1,13706,'9.99','2005-08-20 09:32:56','2006-02-15 22:16:58'),(9831,363,1,14694,'2.99','2005-08-21 20:46:42','2006-02-15 22:16:58'),(9832,363,1,14983,'5.99','2005-08-22 07:32:23','2006-02-15 22:16:58'),(9833,363,2,15279,'4.99','2005-08-22 19:08:49','2006-02-15 22:16:58'),(9834,363,1,15335,'4.99','2005-08-22 20:44:55','2006-02-15 22:16:58'),(9835,364,1,462,'5.99','2005-05-27 20:10:36','2006-02-15 22:16:58'),(9836,364,1,1722,'2.99','2005-06-16 15:12:52','2006-02-15 22:16:59'),(9837,364,2,2442,'2.99','2005-06-18 18:49:18','2006-02-15 22:16:59'),(9838,364,2,2606,'4.99','2005-06-19 06:51:32','2006-02-15 22:16:59'),(9839,364,2,2857,'4.99','2005-06-19 23:15:15','2006-02-15 22:16:59'),(9840,364,2,2962,'3.99','2005-06-20 07:31:55','2006-02-15 22:16:59'),(9841,364,1,3678,'4.99','2005-07-06 09:15:15','2006-02-15 22:16:59'),(9842,364,2,3961,'4.99','2005-07-06 22:11:43','2006-02-15 22:16:59'),(9843,364,1,4047,'0.99','2005-07-07 03:28:49','2006-02-15 22:16:59'),(9844,364,2,4689,'4.99','2005-07-08 11:03:47','2006-02-15 22:16:59'),(9845,364,1,5872,'10.99','2005-07-10 18:54:05','2006-02-15 22:16:59'),(9846,364,1,7272,'2.99','2005-07-27 11:30:20','2006-02-15 22:16:59'),(9847,364,2,9266,'4.99','2005-07-30 14:59:01','2006-02-15 22:16:59'),(9848,364,1,10092,'0.99','2005-07-31 20:28:09','2006-02-15 22:16:59'),(9849,364,2,10290,'5.99','2005-08-01 03:39:50','2006-02-15 22:16:59'),(9850,364,2,11932,'4.99','2005-08-17 16:36:12','2006-02-15 22:16:59'),(9851,364,1,12557,'4.99','2005-08-18 14:51:03','2006-02-15 22:16:59'),(9852,364,1,12761,'1.99','2005-08-18 23:05:22','2006-02-15 22:16:59'),(9853,364,2,12912,'3.99','2005-08-19 04:24:35','2006-02-15 22:16:59'),(9854,364,1,13698,'4.99','2005-08-20 09:24:26','2006-02-15 22:16:59'),(9855,364,2,13936,'0.99','2005-08-20 17:22:35','2006-02-15 22:17:00'),(9856,364,2,14293,'4.99','2005-08-21 07:06:47','2006-02-15 22:17:00'),(9857,364,1,15242,'0.99','2005-08-22 17:48:10','2006-02-15 22:17:00'),(9858,365,2,120,'5.99','2005-05-25 19:37:47','2006-02-15 22:17:00'),(9859,365,1,231,'4.99','2005-05-26 11:31:59','2006-02-15 22:17:00'),(9860,365,1,1303,'1.99','2005-06-15 09:55:57','2006-02-15 22:17:00'),(9861,365,1,1578,'6.99','2005-06-16 04:08:16','2006-02-15 22:17:00'),(9862,365,1,1983,'4.99','2005-06-17 10:22:13','2006-02-15 22:17:00'),(9863,365,1,2525,'2.99','2005-06-19 00:48:22','2006-02-15 22:17:00'),(9864,365,2,3156,'0.99','2005-06-20 21:03:46','2006-02-15 22:17:00'),(9865,365,1,4583,'1.99','2005-07-08 06:09:44','2006-02-15 22:17:00'),(9866,365,1,6604,'4.99','2005-07-12 07:57:45','2006-02-15 22:17:00'),(9867,365,1,7488,'7.99','2005-07-27 19:36:15','2006-02-15 22:17:00'),(9868,365,2,7634,'4.99','2005-07-28 01:07:01','2006-02-15 22:17:00'),(9869,365,1,8168,'4.99','2005-07-28 21:28:32','2006-02-15 22:17:00'),(9870,365,2,8782,'4.99','2005-07-29 20:29:34','2006-02-15 22:17:00'),(9871,365,1,8856,'3.99','2005-07-29 23:42:00','2006-02-15 22:17:00'),(9872,365,1,9122,'2.99','2005-07-30 09:36:52','2006-02-15 22:17:00'),(9873,365,2,9184,'4.99','2005-07-30 12:10:19','2006-02-15 22:17:00'),(9874,365,2,9540,'2.99','2005-07-31 01:40:06','2006-02-15 22:17:01'),(9875,365,2,10717,'2.99','2005-08-01 18:53:53','2006-02-15 22:17:01'),(9876,365,2,12322,'2.99','2005-08-18 06:35:28','2006-02-15 22:17:01'),(9877,365,2,12375,'4.99','2005-08-18 08:20:08','2006-02-15 22:17:01'),(9878,365,1,12804,'8.99','2005-08-19 00:33:15','2006-02-15 22:17:01'),(9879,365,1,13619,'2.99','2005-08-20 06:39:26','2006-02-15 22:17:01'),(9880,365,2,14463,'6.99','2005-08-21 12:51:49','2006-02-15 22:17:01'),(9881,366,2,911,'6.99','2005-05-30 10:50:22','2006-02-15 22:17:01'),(9882,366,2,1401,'1.99','2005-06-15 16:30:22','2006-02-15 22:17:01'),(9883,366,2,2214,'0.99','2005-06-18 02:44:37','2006-02-15 22:17:01'),(9884,366,2,3632,'4.99','2005-07-06 06:38:21','2006-02-15 22:17:01'),(9885,366,1,3834,'2.99','2005-07-06 16:19:56','2006-02-15 22:17:01'),(9886,366,2,4276,'2.99','2005-07-07 14:50:59','2006-02-15 22:17:01'),(9887,366,1,4569,'5.99','2005-07-08 05:30:51','2006-02-15 22:17:01'),(9888,366,2,5364,'0.99','2005-07-09 18:24:48','2006-02-15 22:17:01'),(9889,366,1,6112,'6.99','2005-07-11 07:28:05','2006-02-15 22:17:01'),(9890,366,1,6366,'4.99','2005-07-11 21:18:16','2006-02-15 22:17:01'),(9891,366,2,6533,'6.99','2005-07-12 04:39:38','2006-02-15 22:17:01'),(9892,366,2,6738,'5.99','2005-07-12 14:17:55','2006-02-15 22:17:01'),(9893,366,1,6842,'0.99','2005-07-12 19:07:55','2006-02-15 22:17:02'),(9894,366,2,6971,'4.99','2005-07-27 00:26:17','2006-02-15 22:17:02'),(9895,366,1,7344,'1.99','2005-07-27 14:29:28','2006-02-15 22:17:02'),(9896,366,1,7562,'2.99','2005-07-27 22:25:15','2006-02-15 22:17:02'),(9897,366,2,7602,'4.99','2005-07-27 23:48:35','2006-02-15 22:17:02'),(9898,366,1,7805,'6.99','2005-07-28 07:56:41','2006-02-15 22:17:02'),(9899,366,2,8169,'4.99','2005-07-28 21:29:46','2006-02-15 22:17:02'),(9900,366,2,8260,'1.99','2005-07-29 01:11:00','2006-02-15 22:17:02'),(9901,366,2,8928,'2.99','2005-07-30 02:18:19','2006-02-15 22:17:02'),(9902,366,1,9316,'6.99','2005-07-30 17:11:58','2006-02-15 22:17:02'),(9903,366,1,10198,'2.99','2005-08-01 00:36:15','2006-02-15 22:17:02'),(9904,366,1,10384,'4.99','2005-08-01 06:39:14','2006-02-15 22:17:02'),(9905,366,2,11337,'2.99','2005-08-02 16:59:09','2006-02-15 22:17:02'),(9906,366,2,11340,'5.99','2005-08-02 17:05:43','2006-02-15 22:17:02'),(9907,366,2,12413,'2.99','2005-08-18 09:50:34','2006-02-15 22:17:02'),(9908,366,1,12608,'4.99','2005-08-18 17:05:15','2006-02-15 22:17:02'),(9909,366,2,13563,'0.99','2005-08-20 04:33:31','2006-02-15 22:17:02'),(9910,366,1,13857,'2.99','2005-08-20 14:50:06','2006-02-15 22:17:02'),(9911,366,1,14147,'4.99','2005-08-21 02:14:03','2006-02-15 22:17:02'),(9912,366,1,14290,'4.99','2005-08-21 07:02:59','2006-02-15 22:17:02'),(9913,366,1,14390,'2.99','2005-08-21 10:15:38','2006-02-15 22:17:02'),(9914,366,1,14717,'2.99','2005-08-21 21:30:39','2006-02-15 22:17:03'),(9915,366,1,14906,'6.99','2005-08-22 04:38:18','2006-02-15 22:17:03'),(9916,366,1,15514,'2.99','2005-08-23 03:03:40','2006-02-15 22:17:03'),(9917,366,1,13421,'4.99','2006-02-14 15:16:03','2006-02-15 22:17:03'),(9918,367,1,939,'0.99','2005-05-30 14:49:34','2006-02-15 22:17:03'),(9919,367,1,1089,'2.99','2005-05-31 11:38:29','2006-02-15 22:17:03'),(9920,367,1,3078,'0.99','2005-06-20 15:09:48','2006-02-15 22:17:03'),(9921,367,1,4251,'8.99','2005-07-07 14:11:55','2006-02-15 22:17:03'),(9922,367,2,5490,'4.99','2005-07-10 00:09:11','2006-02-15 22:17:03'),(9923,367,2,5538,'4.99','2005-07-10 02:39:40','2006-02-15 22:17:03'),(9924,367,2,5839,'2.99','2005-07-10 17:08:30','2006-02-15 22:17:03'),(9925,367,2,6228,'2.99','2005-07-11 13:58:36','2006-02-15 22:17:03'),(9926,367,1,6716,'0.99','2005-07-12 13:34:58','2006-02-15 22:17:03'),(9927,367,2,6835,'5.99','2005-07-12 18:58:03','2006-02-15 22:17:03'),(9928,367,2,8490,'0.99','2005-07-29 08:59:25','2006-02-15 22:17:03'),(9929,367,1,9030,'3.99','2005-07-30 06:05:38','2006-02-15 22:17:03'),(9930,367,1,9430,'4.99','2005-07-30 21:20:13','2006-02-15 22:17:03'),(9931,367,1,9912,'4.99','2005-07-31 14:49:04','2006-02-15 22:17:03'),(9932,367,2,10344,'4.99','2005-08-01 05:18:23','2006-02-15 22:17:03'),(9933,367,1,12152,'4.99','2005-08-18 00:21:35','2006-02-15 22:17:03'),(9934,367,2,12362,'0.99','2005-08-18 07:48:05','2006-02-15 22:17:03'),(9935,367,2,12373,'8.99','2005-08-18 08:07:25','2006-02-15 22:17:04'),(9936,367,2,12911,'6.99','2005-08-19 04:24:10','2006-02-15 22:17:04'),(9937,367,2,13235,'4.99','2005-08-19 16:17:53','2006-02-15 22:17:04'),(9938,367,1,14413,'6.99','2005-08-21 11:06:33','2006-02-15 22:17:04'),(9939,367,1,14481,'10.99','2005-08-21 13:41:14','2006-02-15 22:17:04'),(9940,368,1,64,'5.99','2005-05-25 09:21:29','2006-02-15 22:17:04'),(9941,368,1,125,'5.99','2005-05-25 20:48:50','2006-02-15 22:17:04'),(9942,368,1,836,'2.99','2005-05-29 23:56:42','2006-02-15 22:17:04'),(9943,368,1,949,'2.99','2005-05-30 15:50:39','2006-02-15 22:17:04'),(9944,368,1,1186,'0.99','2005-06-15 00:56:45','2006-02-15 22:17:04'),(9945,368,1,1513,'9.99','2005-06-15 22:53:30','2006-02-15 22:17:04'),(9946,368,1,2531,'4.99','2005-06-19 01:20:49','2006-02-15 22:17:04'),(9947,368,1,2694,'4.99','2005-06-19 13:17:21','2006-02-15 22:17:04'),(9948,368,1,2744,'4.99','2005-06-19 16:20:40','2006-02-15 22:17:04'),(9949,368,2,3275,'4.99','2005-06-21 05:33:04','2006-02-15 22:17:04'),(9950,368,2,3608,'4.99','2005-07-06 05:35:39','2006-02-15 22:17:04'),(9951,368,2,4066,'0.99','2005-07-07 04:34:09','2006-02-15 22:17:04'),(9952,368,1,4584,'0.99','2005-07-08 06:11:02','2006-02-15 22:17:04'),(9953,368,2,4913,'8.99','2005-07-08 21:27:48','2006-02-15 22:17:04'),(9954,368,1,6124,'4.99','2005-07-11 08:02:32','2006-02-15 22:17:04'),(9955,368,1,6154,'5.99','2005-07-11 09:32:19','2006-02-15 22:17:04'),(9956,368,1,6681,'2.99','2005-07-12 12:04:12','2006-02-15 22:17:04'),(9957,368,2,7571,'4.99','2005-07-27 22:43:42','2006-02-15 22:17:05'),(9958,368,1,8045,'0.99','2005-07-28 16:49:38','2006-02-15 22:17:05'),(9959,368,2,8226,'2.99','2005-07-29 00:01:04','2006-02-15 22:17:05'),(9960,368,1,9400,'5.99','2005-07-30 20:15:58','2006-02-15 22:17:05'),(9961,368,1,9833,'6.99','2005-07-31 12:05:01','2006-02-15 22:17:05'),(9962,368,2,10730,'8.99','2005-08-01 19:21:42','2006-02-15 22:17:05'),(9963,368,2,10848,'1.99','2005-08-01 23:50:22','2006-02-15 22:17:05'),(9964,368,1,11844,'0.99','2005-08-17 13:16:04','2006-02-15 22:17:05'),(9965,368,2,12319,'2.99','2005-08-18 06:26:45','2006-02-15 22:17:05'),(9966,368,1,12796,'4.99','2005-08-19 00:22:24','2006-02-15 22:17:05'),(9967,368,2,13189,'8.99','2005-08-19 14:27:16','2006-02-15 22:17:05'),(9968,368,2,13280,'2.99','2005-08-19 18:02:51','2006-02-15 22:17:05'),(9969,368,2,13378,'0.99','2005-08-19 21:33:35','2006-02-15 22:17:05'),(9970,368,2,13781,'7.99','2005-08-20 12:06:45','2006-02-15 22:17:05'),(9971,368,2,13963,'1.99','2005-08-20 18:20:18','2006-02-15 22:17:05'),(9972,368,1,14393,'7.99','2005-08-21 10:22:51','2006-02-15 22:17:05'),(9973,368,1,15353,'2.99','2005-08-22 21:18:08','2006-02-15 22:17:05'),(9974,368,1,15437,'2.99','2005-08-23 00:31:09','2006-02-15 22:17:05'),(9975,369,1,31,'4.99','2005-05-25 04:05:17','2006-02-15 22:17:05'),(9976,369,1,294,'4.99','2005-05-26 20:29:57','2006-02-15 22:17:05'),(9977,369,2,854,'0.99','2005-05-30 01:56:11','2006-02-15 22:17:05'),(9978,369,2,913,'7.99','2005-05-30 11:04:58','2006-02-15 22:17:06'),(9979,369,1,1224,'0.99','2005-06-15 03:44:25','2006-02-15 22:17:06'),(9980,369,1,3490,'6.99','2005-07-05 23:37:13','2006-02-15 22:17:06'),(9981,369,2,3903,'2.99','2005-07-06 19:27:32','2006-02-15 22:17:06'),(9982,369,2,4859,'4.99','2005-07-08 18:54:04','2006-02-15 22:17:06'),(9983,369,1,5043,'1.99','2005-07-09 03:25:18','2006-02-15 22:17:06'),(9984,369,2,5496,'7.99','2005-07-10 00:20:23','2006-02-15 22:17:06'),(9985,369,2,5561,'2.99','2005-07-10 03:15:24','2006-02-15 22:17:06'),(9986,369,1,8236,'2.99','2005-07-29 00:27:04','2006-02-15 22:17:06'),(9987,369,2,8826,'2.99','2005-07-29 22:30:16','2006-02-15 22:17:06'),(9988,369,2,9032,'4.99','2005-07-30 06:06:54','2006-02-15 22:17:06'),(9989,369,1,9089,'0.99','2005-07-30 08:23:39','2006-02-15 22:17:06'),(9990,369,2,9543,'0.99','2005-07-31 01:43:34','2006-02-15 22:17:06'),(9991,369,1,9973,'4.99','2005-07-31 16:49:31','2006-02-15 22:17:06'),(9992,369,1,10299,'0.99','2005-08-01 04:08:04','2006-02-15 22:17:06'),(9993,369,2,10359,'3.99','2005-08-01 05:52:21','2006-02-15 22:17:06'),(9994,369,2,10713,'2.99','2005-08-01 18:50:05','2006-02-15 22:17:06'),(9995,369,1,11084,'4.99','2005-08-02 07:34:19','2006-02-15 22:17:06'),(9996,369,2,11388,'1.99','2005-08-02 18:35:55','2006-02-15 22:17:06'),(9997,369,1,12521,'0.99','2005-08-18 13:43:07','2006-02-15 22:17:06'),(9998,369,2,14684,'5.99','2005-08-21 20:28:26','2006-02-15 22:17:06'),(9999,369,1,13898,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:07'),(10000,370,2,1190,'6.99','2005-06-15 01:05:32','2006-02-15 22:17:07'),(10001,370,2,4400,'7.99','2005-07-07 21:22:26','2006-02-15 22:17:07'),(10002,370,2,6714,'0.99','2005-07-12 13:29:06','2006-02-15 22:17:07'),(10003,370,1,6968,'0.99','2005-07-27 00:16:45','2006-02-15 22:17:07'),(10004,370,2,7152,'7.99','2005-07-27 07:15:01','2006-02-15 22:17:07'),(10005,370,1,7226,'6.99','2005-07-27 09:47:53','2006-02-15 22:17:07'),(10006,370,2,7797,'0.99','2005-07-28 07:41:07','2006-02-15 22:17:07'),(10007,370,2,8258,'0.99','2005-07-29 01:03:42','2006-02-15 22:17:07'),(10008,370,2,10095,'0.99','2005-07-31 20:38:35','2006-02-15 22:17:07'),(10009,370,1,10336,'4.99','2005-08-01 04:59:53','2006-02-15 22:17:07'),(10010,370,1,11540,'1.99','2005-08-17 00:48:03','2006-02-15 22:17:07'),(10011,370,2,11925,'0.99','2005-08-17 16:23:04','2006-02-15 22:17:07'),(10012,370,1,12339,'4.99','2005-08-18 07:05:06','2006-02-15 22:17:07'),(10013,370,1,13039,'0.99','2005-08-19 08:55:19','2006-02-15 22:17:07'),(10014,370,1,14602,'3.99','2005-08-21 17:48:49','2006-02-15 22:17:07'),(10015,370,2,14786,'2.99','2005-08-22 00:24:42','2006-02-15 22:17:07'),(10016,370,2,15368,'3.99','2005-08-22 21:57:15','2006-02-15 22:17:07'),(10017,370,1,15626,'4.99','2005-08-23 07:25:34','2006-02-15 22:17:07'),(10018,370,1,15982,'5.99','2005-08-23 20:13:31','2006-02-15 22:17:08'),(10019,371,1,26,'3.99','2005-05-25 03:36:50','2006-02-15 22:17:08'),(10020,371,2,286,'6.99','2005-05-26 19:44:51','2006-02-15 22:17:08'),(10021,371,2,381,'4.99','2005-05-27 09:43:25','2006-02-15 22:17:08'),(10022,371,1,384,'5.99','2005-05-27 10:18:20','2006-02-15 22:17:08'),(10023,371,1,825,'0.99','2005-05-29 21:49:41','2006-02-15 22:17:08'),(10024,371,1,829,'2.99','2005-05-29 22:16:42','2006-02-15 22:17:08'),(10025,371,2,1212,'2.99','2005-06-15 03:03:33','2006-02-15 22:17:08'),(10026,371,1,1218,'1.99','2005-06-15 03:24:44','2006-02-15 22:17:08'),(10027,371,1,1573,'6.99','2005-06-16 03:31:39','2006-02-15 22:17:08'),(10028,371,2,1675,'5.99','2005-06-16 11:04:47','2006-02-15 22:17:08'),(10029,371,2,2837,'0.99','2005-06-19 22:03:50','2006-02-15 22:17:08'),(10030,371,1,3176,'3.99','2005-06-20 22:31:54','2006-02-15 22:17:08'),(10031,371,2,3396,'0.99','2005-06-21 15:23:08','2006-02-15 22:17:08'),(10032,371,2,4115,'8.99','2005-07-07 06:52:23','2006-02-15 22:17:08'),(10033,371,1,4612,'1.99','2005-07-08 07:40:44','2006-02-15 22:17:08'),(10034,371,1,5171,'4.99','2005-07-09 09:26:55','2006-02-15 22:17:08'),(10035,371,2,5614,'0.99','2005-07-10 05:16:56','2006-02-15 22:17:08'),(10036,371,1,6000,'2.99','2005-07-11 01:23:06','2006-02-15 22:17:08'),(10037,371,1,6460,'1.99','2005-07-12 01:13:44','2006-02-15 22:17:08'),(10038,371,1,6922,'0.99','2005-07-12 22:39:48','2006-02-15 22:17:08'),(10039,371,1,7408,'3.99','2005-07-27 16:31:40','2006-02-15 22:17:09'),(10040,371,1,8138,'4.99','2005-07-28 20:12:17','2006-02-15 22:17:09'),(10041,371,1,9008,'4.99','2005-07-30 05:10:26','2006-02-15 22:17:09'),(10042,371,1,9117,'8.99','2005-07-30 09:20:59','2006-02-15 22:17:09'),(10043,371,1,9635,'0.99','2005-07-31 05:12:27','2006-02-15 22:17:09'),(10044,371,1,11086,'10.99','2005-08-02 07:38:44','2006-02-15 22:17:09'),(10045,371,2,12397,'9.99','2005-08-18 09:12:52','2006-02-15 22:17:09'),(10046,371,2,12584,'7.99','2005-08-18 15:51:36','2006-02-15 22:17:09'),(10047,371,1,13028,'2.99','2005-08-19 08:27:23','2006-02-15 22:17:09'),(10048,371,2,13143,'3.99','2005-08-19 12:44:38','2006-02-15 22:17:09'),(10049,371,1,13191,'4.99','2005-08-19 14:28:48','2006-02-15 22:17:09'),(10050,371,2,13953,'4.99','2005-08-20 18:00:37','2006-02-15 22:17:09'),(10051,371,1,14384,'2.99','2005-08-21 10:02:37','2006-02-15 22:17:09'),(10052,371,1,15786,'0.99','2005-08-23 13:48:34','2006-02-15 22:17:09'),(10053,371,1,15824,'2.99','2005-08-23 15:09:17','2006-02-15 22:17:09'),(10054,372,1,617,'2.99','2005-05-28 15:49:14','2006-02-15 22:17:09'),(10055,372,1,638,'2.99','2005-05-28 18:24:43','2006-02-15 22:17:09'),(10056,372,1,2315,'2.99','2005-06-18 09:03:39','2006-02-15 22:17:09'),(10057,372,1,2959,'4.99','2005-06-20 07:07:54','2006-02-15 22:17:09'),(10058,372,1,3283,'3.99','2005-06-21 06:19:07','2006-02-15 22:17:09'),(10059,372,1,5229,'4.99','2005-07-09 12:30:18','2006-02-15 22:17:09'),(10060,372,1,5314,'2.99','2005-07-09 16:05:28','2006-02-15 22:17:10'),(10061,372,1,5352,'2.99','2005-07-09 17:54:58','2006-02-15 22:17:10'),(10062,372,1,5501,'6.99','2005-07-10 00:33:48','2006-02-15 22:17:10'),(10063,372,2,5914,'7.99','2005-07-10 21:01:12','2006-02-15 22:17:10'),(10064,372,2,6692,'4.99','2005-07-12 12:35:39','2006-02-15 22:17:10'),(10065,372,1,7190,'4.99','2005-07-27 08:36:01','2006-02-15 22:17:10'),(10066,372,2,7234,'5.99','2005-07-27 10:08:45','2006-02-15 22:17:10'),(10067,372,2,7735,'4.99','2005-07-28 05:09:56','2006-02-15 22:17:10'),(10068,372,2,8009,'7.99','2005-07-28 15:25:58','2006-02-15 22:17:10'),(10069,372,1,8059,'2.99','2005-07-28 17:09:59','2006-02-15 22:17:10'),(10070,372,1,8358,'0.99','2005-07-29 05:00:58','2006-02-15 22:17:10'),(10071,372,1,8724,'0.99','2005-07-29 18:05:21','2006-02-15 22:17:10'),(10072,372,1,8755,'2.99','2005-07-29 19:18:31','2006-02-15 22:17:10'),(10073,372,2,8837,'8.99','2005-07-29 22:49:00','2006-02-15 22:17:10'),(10074,372,1,9128,'5.99','2005-07-30 09:51:14','2006-02-15 22:17:10'),(10075,372,2,11134,'10.99','2005-08-02 09:19:22','2006-02-15 22:17:10'),(10076,372,2,11438,'3.99','2005-08-02 20:21:08','2006-02-15 22:17:10'),(10077,372,2,11555,'4.99','2005-08-17 01:08:59','2006-02-15 22:17:10'),(10078,372,1,12224,'0.99','2005-08-18 02:59:09','2006-02-15 22:17:10'),(10079,372,1,12714,'3.99','2005-08-18 21:08:01','2006-02-15 22:17:10'),(10080,372,2,13402,'4.99','2005-08-19 22:16:53','2006-02-15 22:17:11'),(10081,372,2,13871,'8.99','2005-08-20 15:10:13','2006-02-15 22:17:11'),(10082,372,2,14037,'9.99','2005-08-20 21:35:58','2006-02-15 22:17:11'),(10083,372,1,14211,'4.99','2005-08-21 04:29:11','2006-02-15 22:17:11'),(10084,372,1,14331,'2.99','2005-08-21 08:29:38','2006-02-15 22:17:11'),(10085,372,1,14770,'1.99','2005-08-21 23:47:16','2006-02-15 22:17:11'),(10086,372,2,15041,'0.99','2005-08-22 09:43:18','2006-02-15 22:17:11'),(10087,372,1,15563,'2.99','2005-08-23 05:08:58','2006-02-15 22:17:11'),(10088,373,2,257,'4.99','2005-05-26 15:27:05','2006-02-15 22:17:11'),(10089,373,1,1472,'6.99','2005-06-15 20:54:55','2006-02-15 22:17:11'),(10090,373,1,3161,'2.99','2005-06-20 21:21:01','2006-02-15 22:17:11'),(10091,373,2,3609,'2.99','2005-07-06 05:36:22','2006-02-15 22:17:11'),(10092,373,2,3667,'4.99','2005-07-06 08:36:34','2006-02-15 22:17:11'),(10093,373,1,4325,'7.99','2005-07-07 17:59:24','2006-02-15 22:17:11'),(10094,373,1,5120,'5.99','2005-07-09 07:14:23','2006-02-15 22:17:11'),(10095,373,1,6202,'3.99','2005-07-11 12:24:25','2006-02-15 22:17:11'),(10096,373,2,6311,'0.99','2005-07-11 18:18:52','2006-02-15 22:17:11'),(10097,373,1,6944,'4.99','2005-07-26 23:34:02','2006-02-15 22:17:11'),(10098,373,1,7094,'0.99','2005-07-27 04:47:33','2006-02-15 22:17:11'),(10099,373,2,7206,'3.99','2005-07-27 09:07:05','2006-02-15 22:17:11'),(10100,373,1,7615,'0.99','2005-07-28 00:15:24','2006-02-15 22:17:11'),(10101,373,1,8611,'3.99','2005-07-29 13:26:21','2006-02-15 22:17:12'),(10102,373,2,9327,'8.99','2005-07-30 17:31:03','2006-02-15 22:17:12'),(10103,373,1,9397,'4.99','2005-07-30 20:07:29','2006-02-15 22:17:12'),(10104,373,2,9480,'0.99','2005-07-30 23:26:03','2006-02-15 22:17:12'),(10105,373,1,9966,'4.99','2005-07-31 16:26:46','2006-02-15 22:17:12'),(10106,373,1,10010,'6.99','2005-07-31 18:01:36','2006-02-15 22:17:12'),(10107,373,1,10221,'4.99','2005-08-01 01:16:50','2006-02-15 22:17:12'),(10108,373,1,10758,'5.99','2005-08-01 20:22:51','2006-02-15 22:17:12'),(10109,373,2,11066,'7.99','2005-08-02 06:58:32','2006-02-15 22:17:12'),(10110,373,2,11512,'7.99','2005-08-16 23:51:06','2006-02-15 22:17:12'),(10111,373,2,11663,'3.99','2005-08-17 05:30:19','2006-02-15 22:17:12'),(10112,373,2,11976,'3.99','2005-08-17 17:59:19','2006-02-15 22:17:12'),(10113,373,1,12142,'5.99','2005-08-18 00:04:12','2006-02-15 22:17:12'),(10114,373,2,12536,'5.99','2005-08-18 14:06:06','2006-02-15 22:17:12'),(10115,373,1,12748,'7.99','2005-08-18 22:29:05','2006-02-15 22:17:12'),(10116,373,2,12780,'0.99','2005-08-18 23:48:16','2006-02-15 22:17:12'),(10117,373,2,13299,'2.99','2005-08-19 18:46:33','2006-02-15 22:17:12'),(10118,373,1,13329,'3.99','2005-08-19 19:56:55','2006-02-15 22:17:12'),(10119,373,2,13467,'2.99','2005-08-20 00:56:44','2006-02-15 22:17:12'),(10120,373,2,15014,'6.99','2005-08-22 08:43:11','2006-02-15 22:17:12'),(10121,373,1,15068,'3.99','2005-08-22 10:50:13','2006-02-15 22:17:13'),(10122,373,1,11739,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:13'),(10123,374,1,521,'0.99','2005-05-28 03:32:22','2006-02-15 22:17:13'),(10124,374,2,910,'2.99','2005-05-30 10:46:16','2006-02-15 22:17:13'),(10125,374,2,919,'0.99','2005-05-30 11:35:06','2006-02-15 22:17:13'),(10126,374,1,1548,'1.99','2005-06-16 01:43:33','2006-02-15 22:17:13'),(10127,374,2,2046,'1.99','2005-06-17 14:39:50','2006-02-15 22:17:13'),(10128,374,2,2487,'4.99','2005-06-18 21:32:54','2006-02-15 22:17:13'),(10129,374,2,2641,'2.99','2005-06-19 09:38:33','2006-02-15 22:17:13'),(10130,374,1,3797,'1.99','2005-07-06 14:54:52','2006-02-15 22:17:13'),(10131,374,1,5463,'4.99','2005-07-09 22:57:02','2006-02-15 22:17:13'),(10132,374,1,5570,'6.99','2005-07-10 03:46:47','2006-02-15 22:17:13'),(10133,374,2,5591,'3.99','2005-07-10 04:25:03','2006-02-15 22:17:13'),(10134,374,2,5945,'2.99','2005-07-10 22:52:42','2006-02-15 22:17:13'),(10135,374,2,6315,'0.99','2005-07-11 18:42:49','2006-02-15 22:17:13'),(10136,374,2,7837,'0.99','2005-07-28 08:58:32','2006-02-15 22:17:13'),(10137,374,2,8586,'7.99','2005-07-29 12:16:34','2006-02-15 22:17:13'),(10138,374,2,9113,'0.99','2005-07-30 09:09:03','2006-02-15 22:17:13'),(10139,374,1,9866,'6.99','2005-07-31 13:13:50','2006-02-15 22:17:13'),(10140,374,1,10695,'2.99','2005-08-01 18:16:20','2006-02-15 22:17:13'),(10141,374,1,11619,'0.99','2005-08-17 04:03:26','2006-02-15 22:17:13'),(10142,374,2,12696,'2.99','2005-08-18 20:13:08','2006-02-15 22:17:14'),(10143,374,1,13337,'2.99','2005-08-19 20:06:57','2006-02-15 22:17:14'),(10144,374,2,13734,'4.99','2005-08-20 10:29:57','2006-02-15 22:17:14'),(10145,374,2,14524,'8.99','2005-08-21 15:05:27','2006-02-15 22:17:14'),(10146,374,2,15053,'5.99','2005-08-22 10:13:09','2006-02-15 22:17:14'),(10147,374,1,15200,'2.99','2005-08-22 16:22:53','2006-02-15 22:17:14'),(10148,374,2,15202,'4.99','2005-08-22 16:26:53','2006-02-15 22:17:14'),(10149,374,2,15366,'6.99','2005-08-22 21:45:57','2006-02-15 22:17:14'),(10150,374,2,15966,'2.99','2006-02-14 15:16:03','2006-02-15 22:17:14'),(10151,375,2,307,'8.99','2005-05-26 21:48:13','2006-02-15 22:17:14'),(10152,375,1,412,'4.99','2005-05-27 14:17:23','2006-02-15 22:17:14'),(10153,375,2,749,'4.99','2005-05-29 09:33:33','2006-02-15 22:17:14'),(10154,375,1,873,'2.99','2005-05-30 05:15:20','2006-02-15 22:17:14'),(10155,375,2,1404,'2.99','2005-06-15 16:38:53','2006-02-15 22:17:14'),(10156,375,1,1499,'5.99','2005-06-15 21:58:07','2006-02-15 22:17:14'),(10157,375,1,2236,'4.99','2005-06-18 04:12:33','2006-02-15 22:17:14'),(10158,375,1,3981,'6.99','2005-07-06 23:12:12','2006-02-15 22:17:14'),(10159,375,2,4335,'4.99','2005-07-07 18:33:57','2006-02-15 22:17:14'),(10160,375,2,5474,'2.99','2005-07-09 23:23:57','2006-02-15 22:17:14'),(10161,375,1,7856,'4.99','2005-07-28 09:48:24','2006-02-15 22:17:14'),(10162,375,2,8900,'2.99','2005-07-30 01:07:03','2006-02-15 22:17:14'),(10163,375,1,10274,'0.99','2005-08-01 03:16:51','2006-02-15 22:17:15'),(10164,375,2,10589,'1.99','2005-08-01 14:11:09','2006-02-15 22:17:15'),(10165,375,1,10640,'0.99','2005-08-01 15:44:51','2006-02-15 22:17:15'),(10166,375,1,10672,'4.99','2005-08-01 17:10:54','2006-02-15 22:17:15'),(10167,375,1,10859,'5.99','2005-08-02 00:11:39','2006-02-15 22:17:15'),(10168,375,1,10961,'6.99','2005-08-02 03:47:55','2006-02-15 22:17:15'),(10169,375,2,11008,'5.99','2005-08-02 05:06:17','2006-02-15 22:17:15'),(10170,375,2,12122,'9.99','2005-08-17 23:20:45','2006-02-15 22:17:15'),(10171,375,2,12663,'0.99','2005-08-18 19:10:52','2006-02-15 22:17:15'),(10172,375,1,13836,'4.99','2005-08-20 14:18:16','2006-02-15 22:17:15'),(10173,375,1,15004,'2.99','2005-08-22 08:15:21','2006-02-15 22:17:15'),(10174,375,1,15505,'4.99','2005-08-23 02:46:13','2006-02-15 22:17:15'),(10175,376,1,554,'0.99','2005-05-28 08:23:16','2006-02-15 22:17:15'),(10176,376,2,1208,'0.99','2005-06-15 02:30:03','2006-02-15 22:17:15'),(10177,376,1,2779,'0.99','2005-06-19 18:19:07','2006-02-15 22:17:15'),(10178,376,2,3719,'2.99','2005-07-06 11:05:55','2006-02-15 22:17:15'),(10179,376,1,4163,'0.99','2005-07-07 09:19:28','2006-02-15 22:17:15'),(10180,376,2,4166,'8.99','2005-07-07 09:33:30','2006-02-15 22:17:15'),(10181,376,1,4320,'3.99','2005-07-07 17:51:59','2006-02-15 22:17:15'),(10182,376,1,4554,'5.99','2005-07-08 04:48:03','2006-02-15 22:17:15'),(10183,376,1,4869,'4.99','2005-07-08 19:14:05','2006-02-15 22:17:16'),(10184,376,1,5675,'4.99','2005-07-10 08:31:06','2006-02-15 22:17:16'),(10185,376,1,6524,'6.99','2005-07-12 04:14:35','2006-02-15 22:17:16'),(10186,376,1,6545,'8.99','2005-07-12 04:56:30','2006-02-15 22:17:16'),(10187,376,2,6807,'2.99','2005-07-12 17:33:53','2006-02-15 22:17:16'),(10188,376,1,8269,'2.99','2005-07-29 01:26:54','2006-02-15 22:17:16'),(10189,376,1,8420,'5.99','2005-07-29 07:00:45','2006-02-15 22:17:16'),(10190,376,1,9773,'4.99','2005-07-31 09:56:56','2006-02-15 22:17:16'),(10191,376,1,9828,'2.99','2005-07-31 11:56:57','2006-02-15 22:17:16'),(10192,376,1,9872,'0.99','2005-07-31 13:27:55','2006-02-15 22:17:16'),(10193,376,2,10413,'3.99','2005-08-01 07:59:39','2006-02-15 22:17:16'),(10194,376,1,10810,'3.99','2005-08-01 22:40:39','2006-02-15 22:17:16'),(10195,376,1,11144,'4.99','2005-08-02 09:39:17','2006-02-15 22:17:16'),(10196,376,2,11792,'4.99','2005-08-17 11:03:53','2006-02-15 22:17:16'),(10197,376,1,11851,'4.99','2005-08-17 13:30:27','2006-02-15 22:17:16'),(10198,376,1,13009,'0.99','2005-08-19 07:50:35','2006-02-15 22:17:16'),(10199,376,1,13141,'0.99','2005-08-19 12:41:41','2006-02-15 22:17:16'),(10200,376,2,13761,'4.99','2005-08-20 11:28:50','2006-02-15 22:17:16'),(10201,376,1,15107,'4.99','2005-08-22 12:05:02','2006-02-15 22:17:16'),(10202,376,1,15382,'2.99','2005-08-22 22:30:50','2006-02-15 22:17:16'),(10203,377,2,2556,'3.99','2005-06-19 03:07:32','2006-02-15 22:17:16'),(10204,377,1,3080,'1.99','2005-06-20 15:22:32','2006-02-15 22:17:17'),(10205,377,2,3086,'0.99','2005-06-20 15:42:40','2006-02-15 22:17:17'),(10206,377,2,3136,'2.99','2005-06-20 19:39:08','2006-02-15 22:17:17'),(10207,377,2,3443,'4.99','2005-06-21 20:19:00','2006-02-15 22:17:17'),(10208,377,1,3858,'2.99','2005-07-06 17:17:57','2006-02-15 22:17:17'),(10209,377,2,4053,'0.99','2005-07-07 03:39:22','2006-02-15 22:17:17'),(10210,377,1,4077,'0.99','2005-07-07 04:53:40','2006-02-15 22:17:17'),(10211,377,1,4225,'0.99','2005-07-07 12:24:37','2006-02-15 22:17:17'),(10212,377,2,6893,'7.99','2005-07-12 21:20:11','2006-02-15 22:17:17'),(10213,377,1,7697,'1.99','2005-07-28 03:43:45','2006-02-15 22:17:17'),(10214,377,2,8018,'10.99','2005-07-28 15:36:48','2006-02-15 22:17:17'),(10215,377,2,8916,'4.99','2005-07-30 01:42:21','2006-02-15 22:17:17'),(10216,377,2,9461,'3.99','2005-07-30 22:29:13','2006-02-15 22:17:17'),(10217,377,1,9564,'0.99','2005-07-31 02:31:37','2006-02-15 22:17:17'),(10218,377,1,10013,'4.99','2005-07-31 18:08:21','2006-02-15 22:17:17'),(10219,377,1,10183,'8.99','2005-08-01 00:08:01','2006-02-15 22:17:17'),(10220,377,1,10738,'3.99','2005-08-01 19:39:08','2006-02-15 22:17:17'),(10221,377,1,10943,'2.99','2005-08-02 03:17:29','2006-02-15 22:17:17'),(10222,377,1,12390,'1.99','2005-08-18 08:51:42','2006-02-15 22:17:17'),(10223,377,1,12549,'4.99','2005-08-18 14:38:07','2006-02-15 22:17:17'),(10224,377,1,13249,'2.99','2005-08-19 16:47:41','2006-02-15 22:17:17'),(10225,377,1,13275,'0.99','2005-08-19 17:53:38','2006-02-15 22:17:18'),(10226,377,2,15088,'0.99','2005-08-22 11:28:26','2006-02-15 22:17:18'),(10227,377,1,15995,'0.99','2005-08-23 20:29:56','2006-02-15 22:17:18'),(10228,377,1,15999,'7.99','2005-08-23 20:44:10','2006-02-15 22:17:18'),(10229,378,1,347,'0.99','2005-05-27 04:40:33','2006-02-15 22:17:18'),(10230,378,2,1623,'4.99','2005-06-16 07:48:50','2006-02-15 22:17:18'),(10231,378,1,1662,'5.99','2005-06-16 10:13:35','2006-02-15 22:17:18'),(10232,378,2,2134,'7.99','2005-06-17 21:13:44','2006-02-15 22:17:18'),(10233,378,2,2713,'4.99','2005-06-19 14:23:09','2006-02-15 22:17:18'),(10234,378,1,3759,'4.99','2005-07-06 12:46:38','2006-02-15 22:17:18'),(10235,378,2,4755,'0.99','2005-07-08 14:23:41','2006-02-15 22:17:18'),(10236,378,1,5578,'1.99','2005-07-10 04:00:31','2006-02-15 22:17:18'),(10237,378,2,6233,'1.99','2005-07-11 14:10:47','2006-02-15 22:17:18'),(10238,378,1,7888,'0.99','2005-07-28 10:40:24','2006-02-15 22:17:18'),(10239,378,2,8740,'2.99','2005-07-29 18:41:31','2006-02-15 22:17:18'),(10240,378,2,9668,'3.99','2005-07-31 06:31:03','2006-02-15 22:17:18'),(10241,378,1,9868,'2.99','2005-07-31 13:20:08','2006-02-15 22:17:18'),(10242,378,1,10917,'4.99','2005-08-02 02:06:18','2006-02-15 22:17:18'),(10243,378,1,11111,'4.99','2005-08-02 08:21:27','2006-02-15 22:17:18'),(10244,378,1,12596,'2.99','2005-08-18 16:29:35','2006-02-15 22:17:18'),(10245,378,1,12828,'4.99','2005-08-19 01:37:47','2006-02-15 22:17:19'),(10246,378,2,14502,'4.99','2005-08-21 14:22:28','2006-02-15 22:17:19'),(10247,378,1,14971,'2.99','2005-08-22 06:52:49','2006-02-15 22:17:19'),(10248,379,2,209,'4.99','2005-05-26 08:14:01','2006-02-15 22:17:19'),(10249,379,1,863,'4.99','2005-05-30 03:14:59','2006-02-15 22:17:19'),(10250,379,1,1383,'8.99','2005-06-15 15:20:06','2006-02-15 22:17:19'),(10251,379,1,2313,'5.99','2005-06-18 08:56:45','2006-02-15 22:17:19'),(10252,379,1,2926,'2.99','2005-06-20 04:37:45','2006-02-15 22:17:19'),(10253,379,1,3788,'4.99','2005-07-06 14:02:02','2006-02-15 22:17:19'),(10254,379,2,4740,'2.99','2005-07-08 13:30:35','2006-02-15 22:17:19'),(10255,379,1,5402,'4.99','2005-07-09 20:01:58','2006-02-15 22:17:19'),(10256,379,1,6235,'7.99','2005-07-11 14:17:51','2006-02-15 22:17:19'),(10257,379,2,7041,'4.99','2005-07-27 03:18:32','2006-02-15 22:17:19'),(10258,379,1,10041,'4.99','2005-07-31 19:01:02','2006-02-15 22:17:19'),(10259,379,2,11457,'3.99','2005-08-02 21:14:16','2006-02-15 22:17:19'),(10260,379,1,12503,'4.99','2005-08-18 13:16:46','2006-02-15 22:17:19'),(10261,379,1,13334,'0.99','2005-08-19 20:02:33','2006-02-15 22:17:19'),(10262,379,2,13397,'7.99','2005-08-19 22:06:35','2006-02-15 22:17:19'),(10263,379,1,13485,'0.99','2005-08-20 01:20:14','2006-02-15 22:17:19'),(10264,379,1,14011,'5.99','2005-08-20 20:32:56','2006-02-15 22:17:19'),(10265,379,2,14152,'2.99','2005-08-21 02:23:50','2006-02-15 22:17:19'),(10266,379,1,14470,'0.99','2005-08-21 13:09:41','2006-02-15 22:17:20'),(10267,379,1,14886,'4.99','2005-08-22 03:59:01','2006-02-15 22:17:20'),(10268,379,2,15399,'4.99','2005-08-22 23:11:59','2006-02-15 22:17:20'),(10269,379,1,15446,'4.99','2005-08-23 00:49:24','2006-02-15 22:17:20'),(10270,379,2,15930,'3.99','2005-08-23 18:26:51','2006-02-15 22:17:20'),(10271,380,1,847,'3.99','2005-05-30 01:18:15','2006-02-15 22:17:20'),(10272,380,1,1868,'3.99','2005-06-17 02:03:22','2006-02-15 22:17:20'),(10273,380,1,1984,'2.99','2005-06-17 10:25:28','2006-02-15 22:17:20'),(10274,380,1,2018,'3.99','2005-06-17 12:35:58','2006-02-15 22:17:20'),(10275,380,1,2440,'2.99','2005-06-18 18:41:09','2006-02-15 22:17:20'),(10276,380,1,2464,'4.99','2005-06-18 20:06:05','2006-02-15 22:17:20'),(10277,380,2,2998,'1.99','2005-06-20 09:30:22','2006-02-15 22:17:20'),(10278,380,2,3099,'1.99','2005-06-20 16:44:33','2006-02-15 22:17:20'),(10279,380,1,3260,'4.99','2005-06-21 03:59:13','2006-02-15 22:17:20'),(10280,380,1,3637,'2.99','2005-07-06 07:06:31','2006-02-15 22:17:20'),(10281,380,1,3688,'4.99','2005-07-06 09:41:53','2006-02-15 22:17:20'),(10282,380,1,4675,'2.99','2005-07-08 10:24:22','2006-02-15 22:17:20'),(10283,380,2,4706,'4.99','2005-07-08 11:51:41','2006-02-15 22:17:20'),(10284,380,2,5339,'0.99','2005-07-09 17:09:17','2006-02-15 22:17:20'),(10285,380,2,7021,'8.99','2005-07-27 02:26:38','2006-02-15 22:17:20'),(10286,380,2,7167,'2.99','2005-07-27 07:37:26','2006-02-15 22:17:20'),(10287,380,2,7435,'0.99','2005-07-27 17:38:44','2006-02-15 22:17:21'),(10288,380,2,7443,'2.99','2005-07-27 17:47:43','2006-02-15 22:17:21'),(10289,380,1,7773,'2.99','2005-07-28 07:02:17','2006-02-15 22:17:21'),(10290,380,1,7974,'3.99','2005-07-28 14:11:57','2006-02-15 22:17:21'),(10291,380,1,9056,'0.99','2005-07-30 07:13:20','2006-02-15 22:17:21'),(10292,380,1,9261,'6.99','2005-07-30 14:39:35','2006-02-15 22:17:21'),(10293,380,1,9710,'10.99','2005-07-31 08:05:31','2006-02-15 22:17:21'),(10294,380,2,10450,'1.99','2005-08-01 09:10:03','2006-02-15 22:17:21'),(10295,380,1,10983,'3.99','2005-08-02 04:24:23','2006-02-15 22:17:21'),(10296,380,1,11936,'0.99','2005-08-17 16:45:34','2006-02-15 22:17:21'),(10297,380,2,11945,'0.99','2005-08-17 17:05:33','2006-02-15 22:17:21'),(10298,380,1,12636,'3.99','2005-08-18 18:00:29','2006-02-15 22:17:21'),(10299,380,1,12996,'6.99','2005-08-19 07:31:32','2006-02-15 22:17:21'),(10300,380,1,14529,'6.99','2005-08-21 15:08:31','2006-02-15 22:17:21'),(10301,380,1,14935,'1.99','2005-08-22 05:47:31','2006-02-15 22:17:21'),(10302,380,2,15175,'5.99','2005-08-22 15:29:15','2006-02-15 22:17:21'),(10303,380,1,15361,'2.99','2005-08-22 21:39:45','2006-02-15 22:17:21'),(10304,380,2,15636,'2.99','2005-08-23 07:50:46','2006-02-15 22:17:21'),(10305,380,1,15697,'2.99','2005-08-23 10:04:36','2006-02-15 22:17:21'),(10306,380,2,15748,'2.99','2005-08-23 12:33:00','2006-02-15 22:17:21'),(10307,381,2,169,'0.99','2005-05-26 03:09:30','2006-02-15 22:17:22'),(10308,381,2,406,'2.99','2005-05-27 13:46:46','2006-02-15 22:17:22'),(10309,381,1,835,'2.99','2005-05-29 23:37:00','2006-02-15 22:17:22'),(10310,381,1,1402,'3.99','2005-06-15 16:31:08','2006-02-15 22:17:22'),(10311,381,1,1878,'1.99','2005-06-17 02:55:32','2006-02-15 22:17:22'),(10312,381,2,2410,'2.99','2005-06-18 16:55:08','2006-02-15 22:17:22'),(10313,381,1,2418,'4.99','2005-06-18 17:14:42','2006-02-15 22:17:22'),(10314,381,2,3425,'2.99','2005-06-21 18:07:07','2006-02-15 22:17:22'),(10315,381,2,3812,'0.99','2005-07-06 15:22:19','2006-02-15 22:17:22'),(10316,381,2,3970,'2.99','2005-07-06 22:48:17','2006-02-15 22:17:22'),(10317,381,1,4735,'0.99','2005-07-08 13:12:27','2006-02-15 22:17:22'),(10318,381,2,5689,'0.99','2005-07-10 09:24:17','2006-02-15 22:17:22'),(10319,381,2,6116,'2.99','2005-07-11 07:37:38','2006-02-15 22:17:22'),(10320,381,2,6451,'4.99','2005-07-12 00:52:19','2006-02-15 22:17:22'),(10321,381,2,6778,'2.99','2005-07-12 16:06:00','2006-02-15 22:17:22'),(10322,381,1,7375,'2.99','2005-07-27 15:22:33','2006-02-15 22:17:22'),(10323,381,1,7645,'2.99','2005-07-28 01:27:42','2006-02-15 22:17:22'),(10324,381,2,8688,'0.99','2005-07-29 16:31:32','2006-02-15 22:17:22'),(10325,381,2,9144,'0.99','2005-07-30 10:22:15','2006-02-15 22:17:22'),(10326,381,2,9173,'4.99','2005-07-30 11:40:10','2006-02-15 22:17:22'),(10327,381,1,9822,'2.99','2005-07-31 11:48:25','2006-02-15 22:17:22'),(10328,381,2,10033,'4.99','2005-07-31 18:44:29','2006-02-15 22:17:23'),(10329,381,1,10608,'0.99','2005-08-01 14:48:41','2006-02-15 22:17:23'),(10330,381,2,10705,'0.99','2005-08-01 18:38:54','2006-02-15 22:17:23'),(10331,381,1,11519,'2.99','2005-08-17 00:01:27','2006-02-15 22:17:23'),(10332,381,2,12135,'2.99','2005-08-17 23:50:24','2006-02-15 22:17:23'),(10333,381,2,12237,'4.99','2005-08-18 03:24:38','2006-02-15 22:17:23'),(10334,381,2,12632,'2.99','2005-08-18 17:54:21','2006-02-15 22:17:23'),(10335,381,2,13202,'8.99','2005-08-19 14:58:30','2006-02-15 22:17:23'),(10336,381,2,13430,'0.99','2005-08-19 23:25:43','2006-02-15 22:17:23'),(10337,381,1,13614,'0.99','2005-08-20 06:28:37','2006-02-15 22:17:23'),(10338,381,2,13995,'2.99','2005-08-20 19:34:43','2006-02-15 22:17:23'),(10339,381,1,14198,'4.99','2005-08-21 03:48:31','2006-02-15 22:17:23'),(10340,381,2,15299,'4.99','2005-08-22 19:42:57','2006-02-15 22:17:23'),(10341,381,1,15747,'4.99','2005-08-23 12:29:24','2006-02-15 22:17:23'),(10342,382,2,356,'2.99','2005-05-27 06:32:30','2006-02-15 22:17:23'),(10343,382,1,522,'2.99','2005-05-28 03:33:20','2006-02-15 22:17:23'),(10344,382,1,2389,'0.99','2005-06-18 15:27:47','2006-02-15 22:17:23'),(10345,382,1,2468,'4.99','2005-06-18 20:23:52','2006-02-15 22:17:23'),(10346,382,1,2489,'1.99','2005-06-18 22:00:44','2006-02-15 22:17:23'),(10347,382,1,2514,'2.99','2005-06-18 23:56:44','2006-02-15 22:17:23'),(10348,382,2,3125,'4.99','2005-06-20 18:31:58','2006-02-15 22:17:24'),(10349,382,2,3480,'3.99','2005-07-05 23:11:43','2006-02-15 22:17:24'),(10350,382,2,4351,'4.99','2005-07-07 19:04:24','2006-02-15 22:17:24'),(10351,382,1,5004,'4.99','2005-07-09 01:20:50','2006-02-15 22:17:24'),(10352,382,1,5816,'0.99','2005-07-10 15:48:47','2006-02-15 22:17:24'),(10353,382,2,7625,'0.99','2005-07-28 00:47:56','2006-02-15 22:17:24'),(10354,382,2,8777,'0.99','2005-07-29 20:10:21','2006-02-15 22:17:24'),(10355,382,1,8871,'9.99','2005-07-30 00:12:41','2006-02-15 22:17:24'),(10356,382,1,8993,'4.99','2005-07-30 04:51:25','2006-02-15 22:17:24'),(10357,382,1,9067,'6.99','2005-07-30 07:31:01','2006-02-15 22:17:24'),(10358,382,2,9555,'0.99','2005-07-31 02:11:16','2006-02-15 22:17:24'),(10359,382,2,10327,'3.99','2005-08-01 04:55:35','2006-02-15 22:17:24'),(10360,382,2,12229,'0.99','2005-08-18 03:08:23','2006-02-15 22:17:24'),(10361,382,2,12529,'0.99','2005-08-18 13:53:36','2006-02-15 22:17:24'),(10362,382,1,14009,'4.99','2005-08-20 20:26:53','2006-02-15 22:17:24'),(10363,382,2,14300,'4.99','2005-08-21 07:19:37','2006-02-15 22:17:24'),(10364,382,2,14354,'5.99','2005-08-21 09:08:14','2006-02-15 22:17:24'),(10365,382,2,15939,'7.99','2005-08-23 18:44:21','2006-02-15 22:17:24'),(10366,383,2,63,'0.99','2005-05-25 09:19:16','2006-02-15 22:17:24'),(10367,383,1,766,'8.99','2005-05-29 11:47:02','2006-02-15 22:17:24'),(10368,383,1,1831,'7.99','2005-06-16 22:22:17','2006-02-15 22:17:25'),(10369,383,2,2228,'2.99','2005-06-18 03:44:50','2006-02-15 22:17:25'),(10370,383,1,2252,'2.99','2005-06-18 05:05:18','2006-02-15 22:17:25'),(10371,383,2,2318,'2.99','2005-06-18 09:13:54','2006-02-15 22:17:25'),(10372,383,1,2609,'7.99','2005-06-19 07:13:12','2006-02-15 22:17:25'),(10373,383,1,3091,'2.99','2005-06-20 16:02:59','2006-02-15 22:17:25'),(10374,383,2,4747,'5.99','2005-07-08 13:53:01','2006-02-15 22:17:25'),(10375,383,2,6091,'4.99','2005-07-11 05:49:18','2006-02-15 22:17:25'),(10376,383,2,6244,'0.99','2005-07-11 14:53:38','2006-02-15 22:17:25'),(10377,383,1,6775,'4.99','2005-07-12 16:01:44','2006-02-15 22:17:25'),(10378,383,1,7367,'3.99','2005-07-27 15:05:45','2006-02-15 22:17:25'),(10379,383,2,8367,'2.99','2005-07-29 05:11:19','2006-02-15 22:17:25'),(10380,383,1,8635,'0.99','2005-07-29 14:22:48','2006-02-15 22:17:25'),(10381,383,1,9653,'0.99','2005-07-31 05:55:38','2006-02-15 22:17:25'),(10382,383,1,9678,'0.99','2005-07-31 06:40:47','2006-02-15 22:17:25'),(10383,383,2,10515,'4.99','2005-08-01 11:41:33','2006-02-15 22:17:25'),(10384,383,1,10971,'4.99','2005-08-02 04:08:17','2006-02-15 22:17:25'),(10385,383,2,10993,'0.99','2005-08-02 04:45:01','2006-02-15 22:17:25'),(10386,383,2,11122,'0.99','2005-08-02 08:49:09','2006-02-15 22:17:25'),(10387,383,1,11592,'2.99','2005-08-17 02:36:04','2006-02-15 22:17:25'),(10388,383,1,12735,'4.99','2005-08-18 22:04:54','2006-02-15 22:17:25'),(10389,383,2,14039,'4.99','2005-08-20 21:39:43','2006-02-15 22:17:26'),(10390,383,2,14678,'4.99','2005-08-21 20:12:43','2006-02-15 22:17:26'),(10391,383,1,15416,'1.99','2005-08-22 23:51:23','2006-02-15 22:17:26'),(10392,383,1,15881,'6.99','2005-08-23 16:44:25','2006-02-15 22:17:26'),(10393,384,2,103,'4.99','2005-05-25 17:30:42','2006-02-15 22:17:26'),(10394,384,2,279,'2.99','2005-05-26 18:02:50','2006-02-15 22:17:26'),(10395,384,1,898,'0.99','2005-05-30 09:26:19','2006-02-15 22:17:26'),(10396,384,2,1013,'2.99','2005-05-31 02:37:00','2006-02-15 22:17:26'),(10397,384,1,1961,'0.99','2005-06-17 09:02:58','2006-02-15 22:17:26'),(10398,384,2,2020,'0.99','2005-06-17 12:39:50','2006-02-15 22:17:26'),(10399,384,1,2378,'7.99','2005-06-18 14:57:49','2006-02-15 22:17:26'),(10400,384,2,2510,'5.99','2005-06-18 23:44:21','2006-02-15 22:17:26'),(10401,384,2,2935,'3.99','2005-06-20 05:07:24','2006-02-15 22:17:26'),(10402,384,1,3088,'9.99','2005-06-20 15:56:05','2006-02-15 22:17:26'),(10403,384,2,3101,'4.99','2005-06-20 16:48:58','2006-02-15 22:17:26'),(10404,384,2,4424,'0.99','2005-07-07 22:14:43','2006-02-15 22:17:26'),(10405,384,2,5250,'0.99','2005-07-09 13:35:32','2006-02-15 22:17:26'),(10406,384,1,5608,'4.99','2005-07-10 05:08:26','2006-02-15 22:17:26'),(10407,384,2,5797,'4.99','2005-07-10 14:43:52','2006-02-15 22:17:26'),(10408,384,2,5966,'2.99','2005-07-10 23:59:27','2006-02-15 22:17:26'),(10409,384,2,6387,'0.99','2005-07-11 22:15:56','2006-02-15 22:17:27'),(10410,384,2,7799,'0.99','2005-07-28 07:42:09','2006-02-15 22:17:27'),(10411,384,1,8445,'1.99','2005-07-29 07:37:48','2006-02-15 22:17:27'),(10412,384,2,11773,'5.99','2005-08-17 10:19:51','2006-02-15 22:17:27'),(10413,384,2,13521,'2.99','2005-08-20 02:42:28','2006-02-15 22:17:27'),(10414,384,2,14416,'2.99','2005-08-21 11:11:46','2006-02-15 22:17:27'),(10415,384,1,14841,'0.99','2005-08-22 02:03:30','2006-02-15 22:17:27'),(10416,384,1,14963,'5.99','2005-08-22 06:38:10','2006-02-15 22:17:27'),(10417,384,2,15321,'4.99','2005-08-22 20:20:04','2006-02-15 22:17:27'),(10418,385,1,917,'2.99','2005-05-30 11:27:06','2006-02-15 22:17:27'),(10419,385,2,1038,'4.99','2005-05-31 05:23:47','2006-02-15 22:17:27'),(10420,385,1,1746,'2.99','2005-06-16 16:41:19','2006-02-15 22:17:27'),(10421,385,1,1937,'0.99','2005-06-17 07:16:46','2006-02-15 22:17:27'),(10422,385,1,3105,'0.99','2005-06-20 17:11:46','2006-02-15 22:17:27'),(10423,385,2,3878,'8.99','2005-07-06 18:27:09','2006-02-15 22:17:27'),(10424,385,2,3953,'0.99','2005-07-06 21:54:55','2006-02-15 22:17:27'),(10425,385,1,4714,'6.99','2005-07-08 12:12:48','2006-02-15 22:17:27'),(10426,385,1,5783,'2.99','2005-07-10 13:55:33','2006-02-15 22:17:27'),(10427,385,1,6445,'4.99','2005-07-12 00:37:02','2006-02-15 22:17:27'),(10428,385,2,6933,'4.99','2005-07-26 23:09:23','2006-02-15 22:17:27'),(10429,385,2,7776,'0.99','2005-07-28 07:04:36','2006-02-15 22:17:28'),(10430,385,1,8346,'2.99','2005-07-29 04:48:22','2006-02-15 22:17:28'),(10431,385,1,8518,'2.99','2005-07-29 10:05:27','2006-02-15 22:17:28'),(10432,385,1,9570,'2.99','2005-07-31 02:40:37','2006-02-15 22:17:28'),(10433,385,1,9704,'4.99','2005-07-31 07:39:32','2006-02-15 22:17:28'),(10434,385,1,10557,'0.99','2005-08-01 12:59:24','2006-02-15 22:17:28'),(10435,385,1,10636,'3.99','2005-08-01 15:40:35','2006-02-15 22:17:28'),(10436,385,1,10655,'4.99','2005-08-01 16:33:27','2006-02-15 22:17:28'),(10437,385,1,11021,'2.99','2005-08-02 05:30:11','2006-02-15 22:17:28'),(10438,385,1,11559,'2.99','2005-08-17 01:20:26','2006-02-15 22:17:28'),(10439,385,2,12310,'2.99','2005-08-18 06:02:34','2006-02-15 22:17:28'),(10440,385,2,12686,'8.99','2005-08-18 19:55:09','2006-02-15 22:17:28'),(10441,385,2,13062,'7.99','2005-08-19 09:44:17','2006-02-15 22:17:28'),(10442,385,1,13117,'0.99','2005-08-19 11:33:20','2006-02-15 22:17:28'),(10443,385,1,15488,'6.99','2005-08-23 02:06:01','2006-02-15 22:17:28'),(10444,386,1,583,'7.99','2005-05-28 11:48:55','2006-02-15 22:17:28'),(10445,386,2,1585,'3.99','2005-06-16 04:51:13','2006-02-15 22:17:28'),(10446,386,1,1608,'2.99','2005-06-16 06:28:57','2006-02-15 22:17:28'),(10447,386,2,1819,'5.99','2005-06-16 21:32:50','2006-02-15 22:17:28'),(10448,386,1,2732,'0.99','2005-06-19 15:19:39','2006-02-15 22:17:28'),(10449,386,1,3351,'2.99','2005-06-21 11:21:39','2006-02-15 22:17:29'),(10450,386,2,3783,'6.99','2005-07-06 13:57:31','2006-02-15 22:17:29'),(10451,386,1,4189,'8.99','2005-07-07 10:51:07','2006-02-15 22:17:29'),(10452,386,1,5524,'0.99','2005-07-10 01:49:24','2006-02-15 22:17:29'),(10453,386,1,5953,'2.99','2005-07-10 23:21:35','2006-02-15 22:17:29'),(10454,386,1,6037,'4.99','2005-07-11 03:06:54','2006-02-15 22:17:29'),(10455,386,1,6222,'2.99','2005-07-11 13:25:49','2006-02-15 22:17:29'),(10456,386,2,6261,'2.99','2005-07-11 15:28:34','2006-02-15 22:17:29'),(10457,386,1,6324,'3.99','2005-07-11 19:02:34','2006-02-15 22:17:29'),(10458,386,2,6715,'4.99','2005-07-12 13:32:28','2006-02-15 22:17:29'),(10459,386,2,8340,'4.99','2005-07-29 04:41:44','2006-02-15 22:17:29'),(10460,386,1,8751,'2.99','2005-07-29 19:14:39','2006-02-15 22:17:29'),(10461,386,2,9602,'0.99','2005-07-31 03:42:51','2006-02-15 22:17:29'),(10462,386,1,9686,'5.99','2005-07-31 06:50:06','2006-02-15 22:17:29'),(10463,386,1,10572,'4.99','2005-08-01 13:26:53','2006-02-15 22:17:29'),(10464,386,2,10618,'3.99','2005-08-01 15:06:38','2006-02-15 22:17:29'),(10465,386,1,10715,'2.99','2005-08-01 18:51:48','2006-02-15 22:17:29'),(10466,386,2,11128,'2.99','2005-08-02 09:03:25','2006-02-15 22:17:30'),(10467,386,2,11695,'4.99','2005-08-17 07:01:08','2006-02-15 22:17:30'),(10468,386,2,12961,'2.99','2005-08-19 06:22:37','2006-02-15 22:17:30'),(10469,386,1,13716,'3.99','2005-08-20 09:48:32','2006-02-15 22:17:30'),(10470,386,1,13764,'2.99','2005-08-20 11:38:16','2006-02-15 22:17:30'),(10471,386,2,13869,'6.99','2005-08-20 15:08:57','2006-02-15 22:17:30'),(10472,386,1,15949,'0.99','2005-08-23 19:06:04','2006-02-15 22:17:30'),(10473,387,2,302,'4.99','2005-05-26 21:13:46','2006-02-15 22:17:30'),(10474,387,1,697,'7.99','2005-05-29 02:04:04','2006-02-15 22:17:30'),(10475,387,1,841,'4.99','2005-05-30 00:31:17','2006-02-15 22:17:30'),(10476,387,1,1127,'3.99','2005-05-31 17:45:49','2006-02-15 22:17:30'),(10477,387,1,1464,'0.99','2005-06-15 20:38:14','2006-02-15 22:17:30'),(10478,387,2,1465,'0.99','2005-06-15 20:43:08','2006-02-15 22:17:30'),(10479,387,1,2068,'0.99','2005-06-17 16:11:46','2006-02-15 22:17:30'),(10480,387,2,2100,'0.99','2005-06-17 18:53:21','2006-02-15 22:17:30'),(10481,387,2,2981,'5.99','2005-06-20 08:35:17','2006-02-15 22:17:30'),(10482,387,2,3378,'4.99','2005-06-21 13:51:28','2006-02-15 22:17:30'),(10483,387,2,6216,'4.99','2005-07-11 12:57:05','2006-02-15 22:17:30'),(10484,387,2,6456,'6.99','2005-07-12 01:05:11','2006-02-15 22:17:31'),(10485,387,1,6517,'5.99','2005-07-12 03:52:39','2006-02-15 22:17:31'),(10486,387,1,7497,'0.99','2005-07-27 20:05:27','2006-02-15 22:17:31'),(10487,387,1,8090,'2.99','2005-07-28 18:27:29','2006-02-15 22:17:31'),(10488,387,1,10564,'0.99','2005-08-01 13:07:34','2006-02-15 22:17:31'),(10489,387,1,10838,'4.99','2005-08-01 23:36:10','2006-02-15 22:17:31'),(10490,387,2,11682,'2.99','2005-08-17 06:13:40','2006-02-15 22:17:31'),(10491,387,2,12153,'4.99','2005-08-18 00:22:30','2006-02-15 22:17:31'),(10492,387,1,12936,'6.99','2005-08-19 05:25:06','2006-02-15 22:17:31'),(10493,387,2,13034,'2.99','2005-08-19 08:41:29','2006-02-15 22:17:31'),(10494,387,1,13082,'5.99','2005-08-19 10:19:19','2006-02-15 22:17:31'),(10495,387,2,13645,'0.99','2005-08-20 07:47:05','2006-02-15 22:17:31'),(10496,387,2,13772,'4.99','2005-08-20 11:47:52','2006-02-15 22:17:31'),(10497,387,2,14279,'5.99','2005-08-21 06:39:08','2006-02-15 22:17:31'),(10498,387,2,14979,'0.99','2005-08-22 07:16:36','2006-02-15 22:17:31'),(10499,388,2,21,'4.99','2005-05-25 01:59:46','2006-02-15 22:17:31'),(10500,388,2,411,'4.99','2005-05-27 14:14:14','2006-02-15 22:17:31'),(10501,388,2,1276,'6.99','2005-06-15 08:00:13','2006-02-15 22:17:31'),(10502,388,1,2145,'0.99','2005-06-17 22:10:36','2006-02-15 22:17:31'),(10503,388,1,2537,'5.99','2005-06-19 01:52:21','2006-02-15 22:17:32'),(10504,388,1,2692,'4.99','2005-06-19 13:08:19','2006-02-15 22:17:32'),(10505,388,2,3159,'7.99','2005-06-20 21:11:50','2006-02-15 22:17:32'),(10506,388,2,4947,'5.99','2005-07-08 22:49:37','2006-02-15 22:17:32'),(10507,388,2,5899,'2.99','2005-07-10 20:21:52','2006-02-15 22:17:32'),(10508,388,2,6321,'2.99','2005-07-11 18:51:02','2006-02-15 22:17:32'),(10509,388,1,6452,'2.99','2005-07-12 00:57:31','2006-02-15 22:17:32'),(10510,388,2,7985,'5.99','2005-07-28 14:29:01','2006-02-15 22:17:32'),(10511,388,2,8456,'3.99','2005-07-29 07:58:31','2006-02-15 22:17:32'),(10512,388,2,9213,'0.99','2005-07-30 13:07:11','2006-02-15 22:17:32'),(10513,388,2,9368,'2.99','2005-07-30 18:50:53','2006-02-15 22:17:32'),(10514,388,2,9840,'2.99','2005-07-31 12:23:18','2006-02-15 22:17:32'),(10515,388,2,9940,'0.99','2005-07-31 15:29:06','2006-02-15 22:17:32'),(10516,388,2,10044,'2.99','2005-07-31 19:02:33','2006-02-15 22:17:32'),(10517,388,2,11604,'0.99','2005-08-17 03:28:27','2006-02-15 22:17:32'),(10518,388,2,12044,'0.99','2005-08-17 20:39:37','2006-02-15 22:17:32'),(10519,388,1,12068,'2.99','2005-08-17 21:37:08','2006-02-15 22:17:32'),(10520,388,2,12267,'6.99','2005-08-18 04:24:30','2006-02-15 22:17:32'),(10521,388,2,12497,'4.99','2005-08-18 12:58:40','2006-02-15 22:17:32'),(10522,388,2,12646,'2.99','2005-08-18 18:25:06','2006-02-15 22:17:32'),(10523,388,1,12749,'2.99','2005-08-18 22:31:21','2006-02-15 22:17:33'),(10524,388,1,12977,'4.99','2005-08-19 06:55:33','2006-02-15 22:17:33'),(10525,388,1,14273,'10.99','2005-08-21 06:26:48','2006-02-15 22:17:33'),(10526,388,2,14853,'5.99','2005-08-22 02:26:33','2006-02-15 22:17:33'),(10527,388,2,15660,'5.99','2005-08-23 08:51:21','2006-02-15 22:17:33'),(10528,388,1,12891,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:33'),(10529,389,1,998,'4.99','2005-05-31 00:16:57','2006-02-15 22:17:33'),(10530,389,1,1763,'4.99','2005-06-16 17:51:01','2006-02-15 22:17:33'),(10531,389,1,1946,'4.99','2005-06-17 07:58:39','2006-02-15 22:17:33'),(10532,389,1,2552,'3.99','2005-06-19 03:01:29','2006-02-15 22:17:33'),(10533,389,2,3527,'0.99','2005-07-06 01:11:08','2006-02-15 22:17:33'),(10534,389,1,4443,'6.99','2005-07-07 23:05:53','2006-02-15 22:17:33'),(10535,389,1,5249,'0.99','2005-07-09 13:33:53','2006-02-15 22:17:33'),(10536,389,2,5626,'3.99','2005-07-10 05:49:35','2006-02-15 22:17:33'),(10537,389,2,6104,'2.99','2005-07-11 07:01:35','2006-02-15 22:17:33'),(10538,389,1,6600,'3.99','2005-07-12 07:41:48','2006-02-15 22:17:33'),(10539,389,1,7029,'4.99','2005-07-27 02:57:43','2006-02-15 22:17:33'),(10540,389,1,7896,'8.99','2005-07-28 11:00:58','2006-02-15 22:17:33'),(10541,389,2,7977,'4.99','2005-07-28 14:15:54','2006-02-15 22:17:33'),(10542,389,1,8338,'6.99','2005-07-29 04:40:39','2006-02-15 22:17:34'),(10543,389,1,8887,'4.99','2005-07-30 00:36:54','2006-02-15 22:17:34'),(10544,389,1,10217,'4.99','2005-08-01 01:07:27','2006-02-15 22:17:34'),(10545,389,1,10949,'2.99','2005-08-02 03:24:04','2006-02-15 22:17:34'),(10546,389,2,11348,'4.99','2005-08-02 17:18:38','2006-02-15 22:17:34'),(10547,389,2,11441,'2.99','2005-08-02 20:25:41','2006-02-15 22:17:34'),(10548,389,2,11944,'3.99','2005-08-17 17:02:42','2006-02-15 22:17:34'),(10549,389,2,12069,'4.99','2005-08-17 21:39:40','2006-02-15 22:17:34'),(10550,389,2,14493,'7.99','2005-08-21 14:01:44','2006-02-15 22:17:34'),(10551,389,1,14578,'2.99','2005-08-21 16:53:38','2006-02-15 22:17:34'),(10552,389,1,14777,'2.99','2005-08-21 23:55:50','2006-02-15 22:17:34'),(10553,389,1,15462,'5.99','2005-08-23 01:14:01','2006-02-15 22:17:34'),(10554,389,2,16011,'9.99','2005-08-23 21:11:33','2006-02-15 22:17:34'),(10555,390,1,254,'4.99','2005-05-26 14:43:48','2006-02-15 22:17:34'),(10556,390,2,912,'4.99','2005-05-30 10:58:33','2006-02-15 22:17:34'),(10557,390,2,1539,'5.99','2005-06-16 01:11:25','2006-02-15 22:17:34'),(10558,390,2,1730,'2.99','2005-06-16 15:30:01','2006-02-15 22:17:34'),(10559,390,2,1893,'2.99','2005-06-17 04:18:37','2006-02-15 22:17:34'),(10560,390,1,2330,'7.99','2005-06-18 10:41:19','2006-02-15 22:17:34'),(10561,390,1,3147,'5.99','2005-06-20 20:25:17','2006-02-15 22:17:34'),(10562,390,1,3999,'2.99','2005-07-06 23:50:54','2006-02-15 22:17:35'),(10563,390,1,4022,'4.99','2005-07-07 01:50:06','2006-02-15 22:17:35'),(10564,390,2,4191,'3.99','2005-07-07 10:56:14','2006-02-15 22:17:35'),(10565,390,2,4310,'2.99','2005-07-07 17:30:56','2006-02-15 22:17:35'),(10566,390,1,4968,'5.99','2005-07-08 23:49:19','2006-02-15 22:17:35'),(10567,390,1,6215,'4.99','2005-07-11 12:52:36','2006-02-15 22:17:35'),(10568,390,1,6430,'0.99','2005-07-12 00:03:34','2006-02-15 22:17:35'),(10569,390,2,7515,'3.99','2005-07-27 20:52:37','2006-02-15 22:17:35'),(10570,390,1,7595,'5.99','2005-07-27 23:32:23','2006-02-15 22:17:35'),(10571,390,1,8493,'0.99','2005-07-29 09:04:31','2006-02-15 22:17:35'),(10572,390,1,9251,'5.99','2005-07-30 14:19:25','2006-02-15 22:17:35'),(10573,390,2,9314,'2.99','2005-07-30 17:05:19','2006-02-15 22:17:35'),(10574,390,1,9825,'4.99','2005-07-31 11:50:51','2006-02-15 22:17:35'),(10575,390,1,10061,'4.99','2005-07-31 19:23:25','2006-02-15 22:17:35'),(10576,390,1,12105,'5.99','2005-08-17 22:54:45','2006-02-15 22:17:35'),(10577,390,2,12803,'2.99','2005-08-19 00:28:21','2006-02-15 22:17:35'),(10578,390,1,13413,'3.99','2005-08-19 22:46:46','2006-02-15 22:17:35'),(10579,390,1,13473,'4.99','2005-08-20 01:03:50','2006-02-15 22:17:35'),(10580,390,1,13501,'0.99','2005-08-20 01:56:20','2006-02-15 22:17:35'),(10581,390,2,13546,'3.99','2005-08-20 03:50:24','2006-02-15 22:17:36'),(10582,390,2,13591,'3.99','2005-08-20 05:50:05','2006-02-15 22:17:36'),(10583,390,2,13618,'7.99','2005-08-20 06:36:46','2006-02-15 22:17:36'),(10584,390,2,13893,'5.99','2005-08-20 15:52:52','2006-02-15 22:17:36'),(10585,390,2,15222,'4.99','2005-08-22 17:12:30','2006-02-15 22:17:36'),(10586,390,2,15303,'8.99','2005-08-22 19:44:59','2006-02-15 22:17:36'),(10587,390,2,15376,'4.99','2005-08-22 22:21:35','2006-02-15 22:17:36'),(10588,391,2,73,'4.99','2005-05-25 11:00:07','2006-02-15 22:17:36'),(10589,391,1,210,'2.99','2005-05-26 08:14:15','2006-02-15 22:17:36'),(10590,391,1,317,'5.99','2005-05-26 23:23:56','2006-02-15 22:17:36'),(10591,391,2,870,'2.99','2005-05-30 04:25:47','2006-02-15 22:17:36'),(10592,391,1,891,'7.99','2005-05-30 07:43:12','2006-02-15 22:17:36'),(10593,391,2,1232,'0.99','2005-06-15 04:18:10','2006-02-15 22:17:36'),(10594,391,2,1931,'0.99','2005-06-17 06:51:56','2006-02-15 22:17:36'),(10595,391,1,2045,'2.99','2005-06-17 14:38:11','2006-02-15 22:17:36'),(10596,391,1,2690,'2.99','2005-06-19 13:00:02','2006-02-15 22:17:36'),(10597,391,2,3163,'2.99','2005-06-20 21:22:13','2006-02-15 22:17:36'),(10598,391,1,4188,'5.99','2005-07-07 10:45:29','2006-02-15 22:17:36'),(10599,391,1,4716,'0.99','2005-07-08 12:18:51','2006-02-15 22:17:36'),(10600,391,2,4753,'0.99','2005-07-08 14:18:41','2006-02-15 22:17:37'),(10601,391,2,5583,'7.99','2005-07-10 04:08:48','2006-02-15 22:17:37'),(10602,391,1,5599,'4.99','2005-07-10 04:52:04','2006-02-15 22:17:37'),(10603,391,1,6302,'3.99','2005-07-11 17:55:38','2006-02-15 22:17:37'),(10604,391,1,6463,'2.99','2005-07-12 01:16:11','2006-02-15 22:17:37'),(10605,391,2,8016,'0.99','2005-07-28 15:35:41','2006-02-15 22:17:37'),(10606,391,1,8908,'0.99','2005-07-30 01:26:05','2006-02-15 22:17:37'),(10607,391,2,8913,'6.99','2005-07-30 01:35:01','2006-02-15 22:17:37'),(10608,391,1,9225,'0.99','2005-07-30 13:29:47','2006-02-15 22:17:37'),(10609,391,1,10210,'7.99','2005-08-01 00:58:52','2006-02-15 22:17:37'),(10610,391,2,10406,'2.99','2005-08-01 07:37:05','2006-02-15 22:17:37'),(10611,391,1,11151,'4.99','2005-08-02 09:52:44','2006-02-15 22:17:37'),(10612,391,2,11434,'2.99','2005-08-02 20:13:14','2006-02-15 22:17:37'),(10613,391,1,11602,'4.99','2005-08-17 03:21:19','2006-02-15 22:17:37'),(10614,391,1,12090,'0.99','2005-08-17 22:21:43','2006-02-15 22:17:37'),(10615,391,1,12100,'1.99','2005-08-17 22:41:10','2006-02-15 22:17:37'),(10616,391,1,13980,'2.99','2005-08-20 19:04:40','2006-02-15 22:17:37'),(10617,391,1,14381,'0.99','2005-08-21 09:55:47','2006-02-15 22:17:37'),(10618,392,2,1530,'6.99','2005-06-16 00:38:07','2006-02-15 22:17:37'),(10619,392,2,1764,'2.99','2005-06-16 17:51:54','2006-02-15 22:17:38'),(10620,392,2,2289,'2.99','2005-06-18 07:29:43','2006-02-15 22:17:38'),(10621,392,2,2890,'4.99','2005-06-20 02:00:45','2006-02-15 22:17:38'),(10622,392,1,3566,'2.99','2005-07-06 03:08:51','2006-02-15 22:17:38'),(10623,392,2,6061,'0.99','2005-07-11 04:06:25','2006-02-15 22:17:38'),(10624,392,2,6406,'2.99','2005-07-11 22:55:27','2006-02-15 22:17:38'),(10625,392,1,7692,'2.99','2005-07-28 03:30:21','2006-02-15 22:17:38'),(10626,392,1,7981,'1.99','2005-07-28 14:18:25','2006-02-15 22:17:38'),(10627,392,1,8254,'0.99','2005-07-29 00:59:31','2006-02-15 22:17:38'),(10628,392,2,8612,'9.99','2005-07-29 13:28:20','2006-02-15 22:17:38'),(10629,392,2,10085,'0.99','2005-07-31 20:12:02','2006-02-15 22:17:38'),(10630,392,1,10435,'4.99','2005-08-01 08:50:51','2006-02-15 22:17:38'),(10631,392,1,11459,'0.99','2005-08-02 21:25:25','2006-02-15 22:17:38'),(10632,392,1,11686,'2.99','2005-08-17 06:39:30','2006-02-15 22:17:38'),(10633,392,2,12102,'6.99','2005-08-17 22:45:26','2006-02-15 22:17:38'),(10634,392,1,12368,'6.99','2005-08-18 07:57:38','2006-02-15 22:17:38'),(10635,392,2,12561,'0.99','2005-08-18 14:58:51','2006-02-15 22:17:38'),(10636,392,1,13629,'4.99','2005-08-20 07:04:07','2006-02-15 22:17:38'),(10637,392,2,14081,'7.99','2005-08-20 23:35:13','2006-02-15 22:17:38'),(10638,392,1,14223,'5.99','2005-08-21 04:51:51','2006-02-15 22:17:39'),(10639,392,2,14369,'0.99','2005-08-21 09:33:44','2006-02-15 22:17:39'),(10640,392,2,14438,'5.99','2005-08-21 11:51:10','2006-02-15 22:17:39'),(10641,393,1,599,'4.99','2005-05-28 14:05:57','2006-02-15 22:17:39'),(10642,393,2,886,'0.99','2005-05-30 06:54:51','2006-02-15 22:17:39'),(10643,393,1,1611,'6.99','2005-06-16 06:41:35','2006-02-15 22:17:39'),(10644,393,2,1915,'1.99','2005-06-17 05:28:28','2006-02-15 22:17:39'),(10645,393,2,2219,'2.99','2005-06-18 03:16:54','2006-02-15 22:17:39'),(10646,393,1,2319,'4.99','2005-06-18 09:24:22','2006-02-15 22:17:39'),(10647,393,2,3001,'2.99','2005-06-20 09:50:16','2006-02-15 22:17:39'),(10648,393,2,4275,'2.99','2005-07-07 14:43:51','2006-02-15 22:17:39'),(10649,393,2,4546,'8.99','2005-07-08 04:18:36','2006-02-15 22:17:39'),(10650,393,2,4632,'5.99','2005-07-08 08:38:57','2006-02-15 22:17:39'),(10651,393,2,4791,'7.99','2005-07-08 16:27:24','2006-02-15 22:17:39'),(10652,393,1,5099,'4.99','2005-07-09 06:14:30','2006-02-15 22:17:39'),(10653,393,1,6221,'2.99','2005-07-11 13:24:27','2006-02-15 22:17:39'),(10654,393,2,6513,'0.99','2005-07-12 03:44:43','2006-02-15 22:17:39'),(10655,393,1,6930,'8.99','2005-07-26 23:00:01','2006-02-15 22:17:39'),(10656,393,2,7486,'0.99','2005-07-27 19:29:24','2006-02-15 22:17:39'),(10657,393,2,8004,'4.99','2005-07-28 15:14:07','2006-02-15 22:17:39'),(10658,393,2,8448,'0.99','2005-07-29 07:41:54','2006-02-15 22:17:40'),(10659,393,2,9763,'7.99','2005-07-31 09:34:03','2006-02-15 22:17:40'),(10660,393,1,10158,'1.99','2005-07-31 22:40:31','2006-02-15 22:17:40'),(10661,393,2,12059,'2.99','2005-08-17 21:09:23','2006-02-15 22:17:40'),(10662,393,1,12113,'1.99','2005-08-17 23:01:00','2006-02-15 22:17:40'),(10663,393,1,12563,'4.99','2005-08-18 15:08:29','2006-02-15 22:17:40'),(10664,393,1,12676,'0.99','2005-08-18 19:34:40','2006-02-15 22:17:40'),(10665,393,1,13184,'4.99','2005-08-19 14:16:18','2006-02-15 22:17:40'),(10666,393,2,13357,'4.99','2005-08-19 21:02:59','2006-02-15 22:17:40'),(10667,393,2,13788,'1.99','2005-08-20 12:15:41','2006-02-15 22:17:40'),(10668,393,1,15132,'2.99','2005-08-22 13:11:25','2006-02-15 22:17:40'),(10669,393,2,15284,'3.99','2005-08-22 19:17:08','2006-02-15 22:17:40'),(10670,393,2,15527,'0.99','2005-08-23 03:44:51','2006-02-15 22:17:40'),(10671,393,2,16049,'3.99','2005-08-23 22:50:12','2006-02-15 22:17:40'),(10672,394,1,213,'3.99','2005-05-26 08:44:08','2006-02-15 22:17:40'),(10673,394,1,977,'2.99','2005-05-30 21:22:26','2006-02-15 22:17:40'),(10674,394,2,1324,'4.99','2005-06-15 11:02:45','2006-02-15 22:17:40'),(10675,394,2,3543,'0.99','2005-07-06 02:01:08','2006-02-15 22:17:40'),(10676,394,1,3873,'6.99','2005-07-06 18:03:16','2006-02-15 22:17:40'),(10677,394,2,4009,'2.99','2005-07-07 00:28:55','2006-02-15 22:17:41'),(10678,394,1,4307,'6.99','2005-07-07 17:20:39','2006-02-15 22:17:41'),(10679,394,2,5183,'4.99','2005-07-09 10:13:45','2006-02-15 22:17:41'),(10680,394,1,5535,'4.99','2005-07-10 02:27:42','2006-02-15 22:17:41'),(10681,394,2,6059,'4.99','2005-07-11 04:03:54','2006-02-15 22:17:41'),(10682,394,2,7445,'3.99','2005-07-27 17:57:15','2006-02-15 22:17:41'),(10683,394,1,9147,'0.99','2005-07-30 10:38:59','2006-02-15 22:17:41'),(10684,394,2,9864,'0.99','2005-07-31 13:06:54','2006-02-15 22:17:41'),(10685,394,1,10319,'4.99','2005-08-01 04:37:19','2006-02-15 22:17:41'),(10686,394,1,10603,'0.99','2005-08-01 14:30:35','2006-02-15 22:17:41'),(10687,394,1,10718,'0.99','2005-08-01 18:55:38','2006-02-15 22:17:41'),(10688,394,1,12080,'4.99','2005-08-17 22:08:04','2006-02-15 22:17:41'),(10689,394,1,12389,'4.99','2005-08-18 08:48:36','2006-02-15 22:17:41'),(10690,394,2,12510,'9.99','2005-08-18 13:22:25','2006-02-15 22:17:41'),(10691,394,2,13047,'0.99','2005-08-19 09:24:49','2006-02-15 22:17:41'),(10692,394,1,14605,'0.99','2005-08-21 17:56:06','2006-02-15 22:17:41'),(10693,394,2,13178,'4.99','2006-02-14 15:16:03','2006-02-15 22:17:41'),(10694,395,1,1270,'0.99','2005-06-15 07:30:22','2006-02-15 22:17:41'),(10695,395,1,1562,'0.99','2005-06-16 02:46:27','2006-02-15 22:17:41'),(10696,395,2,1603,'0.99','2005-06-16 06:14:03','2006-02-15 22:17:42'),(10697,395,1,3030,'4.99','2005-06-20 11:51:59','2006-02-15 22:17:42'),(10698,395,1,3310,'0.99','2005-06-21 08:04:51','2006-02-15 22:17:42'),(10699,395,1,3389,'6.99','2005-06-21 14:37:55','2006-02-15 22:17:42'),(10700,395,2,3684,'0.99','2005-07-06 09:29:22','2006-02-15 22:17:42'),(10701,395,1,4185,'5.99','2005-07-07 10:31:05','2006-02-15 22:17:42'),(10702,395,1,4393,'4.99','2005-07-07 21:12:36','2006-02-15 22:17:42'),(10703,395,1,5087,'0.99','2005-07-09 05:44:28','2006-02-15 22:17:42'),(10704,395,2,5136,'0.99','2005-07-09 07:55:01','2006-02-15 22:17:42'),(10705,395,1,7740,'2.99','2005-07-28 05:23:36','2006-02-15 22:17:42'),(10706,395,2,7986,'7.99','2005-07-28 14:30:13','2006-02-15 22:17:42'),(10707,395,1,11889,'0.99','2005-08-17 15:08:27','2006-02-15 22:17:42'),(10708,395,1,14471,'5.99','2005-08-21 13:10:40','2006-02-15 22:17:42'),(10709,395,2,14720,'0.99','2005-08-21 21:43:53','2006-02-15 22:17:42'),(10710,395,1,15698,'2.99','2005-08-23 10:11:40','2006-02-15 22:17:42'),(10711,395,1,15856,'0.99','2005-08-23 15:59:12','2006-02-15 22:17:42'),(10712,395,1,15970,'4.99','2005-08-23 19:54:24','2006-02-15 22:17:42'),(10713,396,2,641,'5.99','2005-05-28 18:45:47','2006-02-15 22:17:42'),(10714,396,2,1370,'1.99','2005-06-15 14:31:05','2006-02-15 22:17:42'),(10715,396,2,1385,'4.99','2005-06-15 15:28:23','2006-02-15 22:17:43'),(10716,396,2,1408,'6.99','2005-06-15 16:57:58','2006-02-15 22:17:43'),(10717,396,2,3909,'6.99','2005-07-06 19:54:41','2006-02-15 22:17:43'),(10718,396,1,5059,'1.99','2005-07-09 04:28:01','2006-02-15 22:17:43'),(10719,396,2,6335,'2.99','2005-07-11 19:25:15','2006-02-15 22:17:43'),(10720,396,2,6764,'4.99','2005-07-12 15:29:27','2006-02-15 22:17:43'),(10721,396,2,6771,'2.99','2005-07-12 15:54:40','2006-02-15 22:17:43'),(10722,396,2,7142,'0.99','2005-07-27 06:55:39','2006-02-15 22:17:43'),(10723,396,2,7313,'2.99','2005-07-27 13:11:57','2006-02-15 22:17:43'),(10724,396,2,8371,'2.99','2005-07-29 05:16:35','2006-02-15 22:17:43'),(10725,396,2,8807,'2.99','2005-07-29 21:36:59','2006-02-15 22:17:43'),(10726,396,1,9344,'5.99','2005-07-30 18:13:45','2006-02-15 22:17:43'),(10727,396,2,10120,'2.99','2005-07-31 21:24:24','2006-02-15 22:17:43'),(10728,396,2,10124,'0.99','2005-07-31 21:31:49','2006-02-15 22:17:43'),(10729,396,2,10195,'6.99','2005-08-01 00:34:42','2006-02-15 22:17:43'),(10730,396,2,10610,'0.99','2005-08-01 14:49:41','2006-02-15 22:17:43'),(10731,396,2,12393,'5.99','2005-08-18 09:02:41','2006-02-15 22:17:43'),(10732,396,1,12895,'4.99','2005-08-19 03:50:48','2006-02-15 22:17:43'),(10733,396,2,13355,'4.99','2005-08-19 20:59:19','2006-02-15 22:17:43'),(10734,396,1,14078,'3.99','2005-08-20 23:26:40','2006-02-15 22:17:44'),(10735,396,1,14169,'4.99','2005-08-21 03:00:31','2006-02-15 22:17:44'),(10736,396,1,14508,'2.99','2005-08-21 14:33:58','2006-02-15 22:17:44'),(10737,396,2,14778,'5.99','2005-08-21 23:56:30','2006-02-15 22:17:44'),(10738,396,1,14792,'1.99','2005-08-22 00:36:41','2006-02-15 22:17:44'),(10739,396,2,15198,'7.99','2005-08-22 16:15:33','2006-02-15 22:17:44'),(10740,397,2,1002,'0.99','2005-05-31 00:47:56','2006-02-15 22:17:44'),(10741,397,1,1769,'5.99','2005-06-16 18:07:48','2006-02-15 22:17:44'),(10742,397,2,3027,'1.99','2005-06-20 11:50:30','2006-02-15 22:17:44'),(10743,397,1,3489,'5.99','2005-07-05 23:33:40','2006-02-15 22:17:44'),(10744,397,1,4036,'0.99','2005-07-07 02:48:00','2006-02-15 22:17:44'),(10745,397,2,5103,'4.99','2005-07-09 06:34:40','2006-02-15 22:17:44'),(10746,397,2,5598,'4.99','2005-07-10 04:48:29','2006-02-15 22:17:44'),(10747,397,2,5763,'4.99','2005-07-10 12:58:12','2006-02-15 22:17:44'),(10748,397,2,6014,'2.99','2005-07-11 02:02:55','2006-02-15 22:17:44'),(10749,397,2,6266,'2.99','2005-07-11 15:45:39','2006-02-15 22:17:44'),(10750,397,1,6471,'4.99','2005-07-12 01:31:06','2006-02-15 22:17:44'),(10751,397,2,7356,'2.99','2005-07-27 14:47:35','2006-02-15 22:17:44'),(10752,397,2,7892,'4.99','2005-07-28 10:46:58','2006-02-15 22:17:44'),(10753,397,1,8103,'6.99','2005-07-28 18:50:14','2006-02-15 22:17:44'),(10754,397,1,9495,'0.99','2005-07-30 23:54:26','2006-02-15 22:17:45'),(10755,397,2,9608,'1.99','2005-07-31 03:51:52','2006-02-15 22:17:45'),(10756,397,1,10534,'0.99','2005-08-01 12:15:11','2006-02-15 22:17:45'),(10757,397,2,10598,'4.99','2005-08-01 14:23:36','2006-02-15 22:17:45'),(10758,397,1,10785,'1.99','2005-08-01 21:24:55','2006-02-15 22:17:45'),(10759,397,2,11511,'4.99','2005-08-16 23:39:59','2006-02-15 22:17:45'),(10760,397,2,12223,'2.99','2005-08-18 02:58:40','2006-02-15 22:17:45'),(10761,397,1,12276,'0.99','2005-08-18 04:43:22','2006-02-15 22:17:45'),(10762,397,2,12329,'1.99','2005-08-18 06:44:30','2006-02-15 22:17:45'),(10763,397,2,12700,'0.99','2005-08-18 20:24:46','2006-02-15 22:17:45'),(10764,397,2,12726,'2.99','2005-08-18 21:44:46','2006-02-15 22:17:45'),(10765,397,1,12772,'4.99','2005-08-18 23:29:25','2006-02-15 22:17:45'),(10766,397,2,14100,'3.99','2005-08-21 00:31:07','2006-02-15 22:17:45'),(10767,397,1,14790,'6.99','2005-08-22 00:34:17','2006-02-15 22:17:45'),(10768,397,1,15083,'6.99','2005-08-22 11:17:37','2006-02-15 22:17:45'),(10769,398,1,486,'4.99','2005-05-27 23:51:12','2006-02-15 22:17:45'),(10770,398,2,1228,'2.99','2005-06-15 03:50:36','2006-02-15 22:17:45'),(10771,398,1,2087,'6.99','2005-06-17 17:35:10','2006-02-15 22:17:45'),(10772,398,2,3141,'9.99','2005-06-20 19:55:47','2006-02-15 22:17:45'),(10773,398,2,5234,'5.99','2005-07-09 12:44:47','2006-02-15 22:17:46'),(10774,398,2,8119,'3.99','2005-07-28 19:23:15','2006-02-15 22:17:46'),(10775,398,2,8204,'4.99','2005-07-28 23:18:29','2006-02-15 22:17:46'),(10776,398,1,8428,'7.99','2005-07-29 07:10:14','2006-02-15 22:17:46'),(10777,398,1,9042,'2.99','2005-07-30 06:33:55','2006-02-15 22:17:46'),(10778,398,2,9281,'5.99','2005-07-30 15:15:51','2006-02-15 22:17:46'),(10779,398,1,9771,'1.99','2005-07-31 09:55:36','2006-02-15 22:17:46'),(10780,398,1,10230,'2.99','2005-08-01 01:49:36','2006-02-15 22:17:46'),(10781,398,2,11132,'4.99','2005-08-02 09:14:09','2006-02-15 22:17:46'),(10782,398,2,12528,'2.99','2005-08-18 13:52:41','2006-02-15 22:17:46'),(10783,398,2,13643,'4.99','2005-08-20 07:42:24','2006-02-15 22:17:46'),(10784,398,1,15189,'3.99','2005-08-22 15:56:42','2006-02-15 22:17:46'),(10785,399,2,10,'5.99','2005-05-25 00:02:21','2006-02-15 22:17:46'),(10786,399,2,694,'6.99','2005-05-29 01:49:43','2006-02-15 22:17:46'),(10787,399,2,883,'4.99','2005-05-30 06:21:05','2006-02-15 22:17:46'),(10788,399,2,2961,'2.99','2005-06-20 07:29:15','2006-02-15 22:17:46'),(10789,399,1,3036,'5.99','2005-06-20 12:18:31','2006-02-15 22:17:46'),(10790,399,2,4957,'0.99','2005-07-08 23:18:48','2006-02-15 22:17:46'),(10791,399,2,4981,'4.99','2005-07-09 00:29:29','2006-02-15 22:17:46'),(10792,399,1,5507,'0.99','2005-07-10 00:49:04','2006-02-15 22:17:47'),(10793,399,2,6006,'2.99','2005-07-11 01:38:42','2006-02-15 22:17:47'),(10794,399,2,6229,'6.99','2005-07-11 13:59:50','2006-02-15 22:17:47'),(10795,399,2,6674,'4.99','2005-07-12 11:51:54','2006-02-15 22:17:47'),(10796,399,2,8461,'5.99','2005-07-29 08:11:31','2006-02-15 22:17:47'),(10797,399,2,9728,'2.99','2005-07-31 08:40:54','2006-02-15 22:17:47'),(10798,399,2,10654,'2.99','2005-08-01 16:31:35','2006-02-15 22:17:47'),(10799,399,2,10960,'5.99','2005-08-02 03:46:18','2006-02-15 22:17:47'),(10800,399,1,11329,'4.99','2005-08-02 16:42:52','2006-02-15 22:17:47'),(10801,399,1,11953,'3.99','2005-08-17 17:16:42','2006-02-15 22:17:47'),(10802,399,1,13253,'4.99','2005-08-19 16:53:56','2006-02-15 22:17:47'),(10803,399,2,13293,'4.99','2005-08-19 18:35:52','2006-02-15 22:17:47'),(10804,399,1,15300,'0.99','2005-08-22 19:44:00','2006-02-15 22:17:47'),(10805,399,1,15468,'4.99','2005-08-23 01:25:30','2006-02-15 22:17:47'),(10806,400,1,95,'3.99','2005-05-25 16:12:52','2006-02-15 22:17:47'),(10807,400,2,171,'6.99','2005-05-26 03:14:15','2006-02-15 22:17:47'),(10808,400,2,516,'1.99','2005-05-28 03:11:47','2006-02-15 22:17:47'),(10809,400,2,894,'5.99','2005-05-30 08:31:31','2006-02-15 22:17:48'),(10810,400,2,1364,'0.99','2005-06-15 14:05:32','2006-02-15 22:17:48'),(10811,400,1,1917,'3.99','2005-06-17 05:36:07','2006-02-15 22:17:48'),(10812,400,2,1923,'6.99','2005-06-17 06:06:10','2006-02-15 22:17:48'),(10813,400,1,4573,'6.99','2005-07-08 05:38:46','2006-02-15 22:17:48'),(10814,400,1,4645,'2.99','2005-07-08 09:20:09','2006-02-15 22:17:48'),(10815,400,2,5212,'6.99','2005-07-09 11:37:47','2006-02-15 22:17:48'),(10816,400,2,5222,'5.99','2005-07-09 12:05:45','2006-02-15 22:17:48'),(10817,400,2,6790,'5.99','2005-07-12 16:34:59','2006-02-15 22:17:48'),(10818,400,2,6994,'2.99','2005-07-27 01:08:26','2006-02-15 22:17:48'),(10819,400,2,7296,'2.99','2005-07-27 12:39:48','2006-02-15 22:17:48'),(10820,400,1,7682,'5.99','2005-07-28 03:07:29','2006-02-15 22:17:48'),(10821,400,2,9177,'5.99','2005-07-30 11:52:40','2006-02-15 22:17:48'),(10822,400,2,9756,'4.99','2005-07-31 09:25:00','2006-02-15 22:17:48'),(10823,400,1,10187,'2.99','2005-08-01 00:15:49','2006-02-15 22:17:48'),(10824,400,2,10484,'2.99','2005-08-01 10:19:53','2006-02-15 22:17:48'),(10825,400,1,10711,'0.99','2005-08-01 18:45:09','2006-02-15 22:17:48'),(10826,400,2,11510,'6.99','2005-08-16 23:30:07','2006-02-15 22:17:49'),(10827,400,2,11530,'2.99','2005-08-17 00:29:00','2006-02-15 22:17:49'),(10828,400,1,11600,'5.99','2005-08-17 03:12:04','2006-02-15 22:17:49'),(10829,400,1,12514,'2.99','2005-08-18 13:33:55','2006-02-15 22:17:49'),(10830,400,2,13449,'2.99','2005-08-20 00:17:01','2006-02-15 22:17:49'),(10831,400,1,14775,'2.99','2005-08-21 23:53:07','2006-02-15 22:17:49'),(10832,400,2,15533,'4.99','2005-08-23 03:54:39','2006-02-15 22:17:49'),(10833,400,2,15988,'4.99','2005-08-23 20:23:08','2006-02-15 22:17:49'),(10834,401,2,167,'4.99','2005-05-26 02:50:31','2006-02-15 22:17:49'),(10835,401,2,446,'4.99','2005-05-27 18:48:41','2006-02-15 22:17:49'),(10836,401,2,811,'1.99','2005-05-29 19:30:42','2006-02-15 22:17:49'),(10837,401,1,4059,'0.99','2005-07-07 04:04:26','2006-02-15 22:17:49'),(10838,401,2,4292,'7.99','2005-07-07 15:48:38','2006-02-15 22:17:49'),(10839,401,2,5923,'0.99','2005-07-10 21:40:06','2006-02-15 22:17:49'),(10840,401,1,NULL,'0.99','2005-07-12 06:26:10','2006-02-15 22:17:49'),(10841,401,2,7651,'4.99','2005-07-28 01:48:32','2006-02-15 22:17:49'),(10842,401,1,8450,'2.99','2005-07-29 07:44:05','2006-02-15 22:17:49'),(10843,401,2,8669,'2.99','2005-07-29 15:44:55','2006-02-15 22:17:49'),(10844,401,1,8722,'8.99','2005-07-29 17:58:58','2006-02-15 22:17:50'),(10845,401,2,9701,'4.99','2005-07-31 07:32:21','2006-02-15 22:17:50'),(10846,401,2,10171,'0.99','2005-07-31 23:29:05','2006-02-15 22:17:50'),(10847,401,1,11820,'2.99','2005-08-17 12:25:33','2006-02-15 22:17:50'),(10848,401,1,12475,'4.99','2005-08-18 12:14:21','2006-02-15 22:17:50'),(10849,401,2,12479,'4.99','2005-08-18 12:26:37','2006-02-15 22:17:50'),(10850,401,1,12906,'2.99','2005-08-19 04:13:43','2006-02-15 22:17:50'),(10851,401,1,13024,'4.99','2005-08-19 08:19:21','2006-02-15 22:17:50'),(10852,401,1,14359,'0.99','2005-08-21 09:16:19','2006-02-15 22:17:50'),(10853,401,2,14433,'1.99','2005-08-21 11:36:34','2006-02-15 22:17:50'),(10854,401,1,15831,'0.99','2005-08-23 15:21:19','2006-02-15 22:17:50'),(10855,401,1,15927,'0.99','2005-08-23 18:23:11','2006-02-15 22:17:50'),(10856,402,2,801,'1.99','2005-05-29 17:35:50','2006-02-15 22:17:50'),(10857,402,2,1194,'4.99','2005-06-15 01:25:08','2006-02-15 22:17:50'),(10858,402,2,2490,'4.99','2005-06-18 22:00:50','2006-02-15 22:17:50'),(10859,402,2,2913,'2.99','2005-06-20 03:42:27','2006-02-15 22:17:50'),(10860,402,2,3564,'6.99','2005-07-06 03:02:13','2006-02-15 22:17:50'),(10861,402,2,3612,'3.99','2005-07-06 05:37:26','2006-02-15 22:17:50'),(10862,402,2,3755,'5.99','2005-07-06 12:37:16','2006-02-15 22:17:51'),(10863,402,1,4399,'2.99','2005-07-07 21:20:28','2006-02-15 22:17:51'),(10864,402,2,4604,'3.99','2005-07-08 06:58:43','2006-02-15 22:17:51'),(10865,402,2,5329,'4.99','2005-07-09 16:49:46','2006-02-15 22:17:51'),(10866,402,2,6183,'2.99','2005-07-11 11:14:35','2006-02-15 22:17:51'),(10867,402,1,6283,'3.99','2005-07-11 16:47:32','2006-02-15 22:17:51'),(10868,402,1,7633,'0.99','2005-07-28 01:03:41','2006-02-15 22:17:51'),(10869,402,2,8521,'7.99','2005-07-29 10:12:45','2006-02-15 22:17:51'),(10870,402,1,9657,'6.99','2005-07-31 06:00:41','2006-02-15 22:17:51'),(10871,402,2,9779,'0.99','2005-07-31 10:08:33','2006-02-15 22:17:51'),(10872,402,2,11045,'0.99','2005-08-02 06:07:54','2006-02-15 22:17:51'),(10873,402,2,11549,'4.99','2005-08-17 01:01:48','2006-02-15 22:17:51'),(10874,402,2,11920,'0.99','2005-08-17 16:10:19','2006-02-15 22:17:51'),(10875,402,1,15428,'4.99','2005-08-23 00:11:52','2006-02-15 22:17:52'),(10876,403,1,442,'2.99','2005-05-27 18:12:13','2006-02-15 22:17:52'),(10877,403,1,517,'0.99','2005-05-28 03:17:57','2006-02-15 22:17:52'),(10878,403,2,1221,'4.99','2005-06-15 03:35:16','2006-02-15 22:17:52'),(10879,403,1,1249,'8.99','2005-06-15 05:38:09','2006-02-15 22:17:52'),(10880,403,2,2488,'3.99','2005-06-18 21:38:26','2006-02-15 22:17:52'),(10881,403,1,2927,'4.99','2005-06-20 04:41:41','2006-02-15 22:17:52'),(10882,403,2,3049,'6.99','2005-06-20 12:51:01','2006-02-15 22:17:52'),(10883,403,1,3356,'5.99','2005-06-21 11:38:45','2006-02-15 22:17:52'),(10884,403,1,3644,'6.99','2005-07-06 07:20:11','2006-02-15 22:17:52'),(10885,403,2,3737,'3.99','2005-07-06 11:45:53','2006-02-15 22:17:52'),(10886,403,2,4096,'4.99','2005-07-07 06:09:11','2006-02-15 22:17:52'),(10887,403,1,5982,'4.99','2005-07-11 00:24:44','2006-02-15 22:17:52'),(10888,403,2,6322,'2.99','2005-07-11 18:58:20','2006-02-15 22:17:52'),(10889,403,1,6342,'4.99','2005-07-11 19:48:24','2006-02-15 22:17:52'),(10890,403,1,7103,'4.99','2005-07-27 05:08:59','2006-02-15 22:17:52'),(10891,403,2,8013,'5.99','2005-07-28 15:30:26','2006-02-15 22:17:52'),(10892,403,1,9058,'2.99','2005-07-30 07:15:45','2006-02-15 22:17:52'),(10893,403,2,9486,'7.99','2005-07-30 23:35:42','2006-02-15 22:17:52'),(10894,403,2,9794,'4.99','2005-07-31 10:47:01','2006-02-15 22:17:53'),(10895,403,2,10109,'5.99','2005-07-31 21:04:49','2006-02-15 22:17:53'),(10896,403,1,10443,'2.99','2005-08-01 09:01:04','2006-02-15 22:17:53'),(10897,403,1,10547,'6.99','2005-08-01 12:44:17','2006-02-15 22:17:53'),(10898,403,2,10789,'2.99','2005-08-01 21:37:55','2006-02-15 22:17:53'),(10899,403,1,11038,'7.99','2005-08-02 05:59:42','2006-02-15 22:17:53'),(10900,403,2,11391,'9.99','2005-08-02 18:40:12','2006-02-15 22:17:53'),(10901,403,2,11427,'2.99','2005-08-02 20:02:39','2006-02-15 22:17:53'),(10902,403,2,11460,'0.99','2005-08-02 21:28:03','2006-02-15 22:17:53'),(10903,403,2,11558,'0.99','2005-08-17 01:19:52','2006-02-15 22:17:53'),(10904,403,2,12005,'5.99','2005-08-17 18:56:55','2006-02-15 22:17:53'),(10905,403,1,12132,'2.99','2005-08-17 23:37:03','2006-02-15 22:17:53'),(10906,403,1,12793,'5.99','2005-08-19 00:20:36','2006-02-15 22:17:53'),(10907,403,1,14519,'2.99','2005-08-21 14:59:29','2006-02-15 22:17:53'),(10908,403,1,14662,'0.99','2005-08-21 19:45:27','2006-02-15 22:17:53'),(10909,403,2,14725,'4.99','2005-08-21 22:02:08','2006-02-15 22:17:53'),(10910,403,1,15410,'4.99','2005-08-22 23:27:43','2006-02-15 22:17:53'),(10911,404,2,1081,'5.99','2005-05-31 10:56:32','2006-02-15 22:17:53'),(10912,404,2,1506,'2.99','2005-06-15 22:19:37','2006-02-15 22:17:53'),(10913,404,2,1840,'4.99','2005-06-16 23:39:34','2006-02-15 22:17:54'),(10914,404,1,2715,'4.99','2005-06-19 14:29:35','2006-02-15 22:17:54'),(10915,404,1,2951,'2.99','2005-06-20 06:23:01','2006-02-15 22:17:54'),(10916,404,1,3927,'2.99','2005-07-06 20:48:14','2006-02-15 22:17:54'),(10917,404,1,4495,'2.99','2005-07-08 01:43:46','2006-02-15 22:17:54'),(10918,404,2,4615,'8.99','2005-07-08 07:46:53','2006-02-15 22:17:54'),(10919,404,1,4653,'4.99','2005-07-08 09:48:01','2006-02-15 22:17:54'),(10920,404,1,4963,'4.99','2005-07-08 23:38:40','2006-02-15 22:17:54'),(10921,404,1,5632,'3.99','2005-07-10 06:17:06','2006-02-15 22:17:54'),(10922,404,1,6114,'1.99','2005-07-11 07:33:48','2006-02-15 22:17:54'),(10923,404,2,6779,'0.99','2005-07-12 16:10:50','2006-02-15 22:17:54'),(10924,404,1,6964,'4.99','2005-07-27 00:15:04','2006-02-15 22:17:54'),(10925,404,1,8058,'5.99','2005-07-28 17:07:49','2006-02-15 22:17:54'),(10926,404,1,8455,'3.99','2005-07-29 07:53:06','2006-02-15 22:17:54'),(10927,404,1,9206,'4.99','2005-07-30 12:46:59','2006-02-15 22:17:54'),(10928,404,1,9472,'4.99','2005-07-30 23:03:32','2006-02-15 22:17:54'),(10929,404,2,9824,'2.99','2005-07-31 11:49:55','2006-02-15 22:17:54'),(10930,404,1,10651,'2.99','2005-08-01 16:20:22','2006-02-15 22:17:54'),(10931,404,1,12325,'5.99','2005-08-18 06:41:30','2006-02-15 22:17:54'),(10932,404,1,12554,'8.99','2005-08-18 14:47:28','2006-02-15 22:17:54'),(10933,404,2,13412,'5.99','2005-08-19 22:46:35','2006-02-15 22:17:55'),(10934,404,1,13422,'4.99','2005-08-19 23:07:24','2006-02-15 22:17:55'),(10935,404,1,14691,'0.99','2005-08-21 20:42:29','2006-02-15 22:17:55'),(10936,404,2,14835,'5.99','2005-08-22 01:49:07','2006-02-15 22:17:55'),(10937,404,2,14838,'4.99','2005-08-22 01:57:34','2006-02-15 22:17:55'),(10938,404,2,14912,'4.99','2005-08-22 04:51:42','2006-02-15 22:17:55'),(10939,404,2,15087,'0.99','2005-08-22 11:24:09','2006-02-15 22:17:55'),(10940,404,2,15290,'10.99','2005-08-22 19:28:02','2006-02-15 22:17:55'),(10941,405,1,121,'2.99','2005-05-25 19:41:29','2006-02-15 22:17:55'),(10942,405,2,770,'4.99','2005-05-29 12:56:50','2006-02-15 22:17:55'),(10943,405,2,1315,'4.99','2005-06-15 10:23:08','2006-02-15 22:17:55'),(10944,405,1,1888,'0.99','2005-06-17 03:58:36','2006-02-15 22:17:55'),(10945,405,2,1953,'5.99','2005-06-17 08:34:57','2006-02-15 22:17:55'),(10946,405,2,2654,'3.99','2005-06-19 10:37:54','2006-02-15 22:17:55'),(10947,405,1,3240,'4.99','2005-06-21 02:53:17','2006-02-15 22:17:55'),(10948,405,1,3253,'5.99','2005-06-21 03:25:37','2006-02-15 22:17:55'),(10949,405,2,4223,'0.99','2005-07-07 12:23:54','2006-02-15 22:17:55'),(10950,405,2,4401,'0.99','2005-07-07 21:26:27','2006-02-15 22:17:55'),(10951,405,2,5040,'7.99','2005-07-09 03:16:34','2006-02-15 22:17:55'),(10952,405,1,5231,'0.99','2005-07-09 12:35:02','2006-02-15 22:17:56'),(10953,405,2,5512,'1.99','2005-07-10 01:05:38','2006-02-15 22:17:56'),(10954,405,1,6110,'2.99','2005-07-11 07:23:47','2006-02-15 22:17:56'),(10955,405,1,7455,'2.99','2005-07-27 18:34:41','2006-02-15 22:17:56'),(10956,405,1,7759,'0.99','2005-07-28 06:28:45','2006-02-15 22:17:56'),(10957,405,2,8482,'2.99','2005-07-29 08:46:33','2006-02-15 22:17:56'),(10958,405,1,8955,'5.99','2005-07-30 03:28:27','2006-02-15 22:17:56'),(10959,405,1,9569,'0.99','2005-07-31 02:39:38','2006-02-15 22:17:56'),(10960,405,1,10472,'4.99','2005-08-01 09:54:41','2006-02-15 22:17:56'),(10961,405,2,10823,'4.99','2005-08-01 22:59:10','2006-02-15 22:17:56'),(10962,405,1,11345,'7.99','2005-08-02 17:14:19','2006-02-15 22:17:56'),(10963,405,1,12050,'0.99','2005-08-17 20:55:25','2006-02-15 22:17:56'),(10964,405,2,12425,'5.99','2005-08-18 10:18:06','2006-02-15 22:17:56'),(10965,405,1,13304,'1.99','2005-08-19 18:56:32','2006-02-15 22:17:56'),(10966,405,1,13398,'0.99','2005-08-19 22:08:48','2006-02-15 22:17:56'),(10967,405,1,14274,'4.99','2005-08-21 06:29:20','2006-02-15 22:17:56'),(10968,405,2,14537,'0.99','2005-08-21 15:24:24','2006-02-15 22:17:56'),(10969,405,1,15072,'1.99','2005-08-22 10:58:45','2006-02-15 22:17:56'),(10970,405,2,15383,'2.99','2005-08-22 22:31:20','2006-02-15 22:17:57'),(10971,405,1,15932,'4.99','2005-08-23 18:31:40','2006-02-15 22:17:57'),(10972,405,1,12792,'0.99','2006-02-14 15:16:03','2006-02-15 22:17:57'),(10973,406,1,855,'0.99','2005-05-30 02:00:28','2006-02-15 22:17:57'),(10974,406,1,2113,'4.99','2005-06-17 19:57:46','2006-02-15 22:17:57'),(10975,406,2,2150,'3.99','2005-06-17 22:50:36','2006-02-15 22:17:57'),(10976,406,1,2241,'2.99','2005-06-18 04:31:41','2006-02-15 22:17:57'),(10977,406,2,2325,'0.99','2005-06-18 10:08:07','2006-02-15 22:17:57'),(10978,406,2,2585,'0.99','2005-06-19 05:05:03','2006-02-15 22:17:57'),(10979,406,1,3186,'7.99','2005-06-20 23:04:20','2006-02-15 22:17:57'),(10980,406,1,3306,'4.99','2005-06-21 07:46:58','2006-02-15 22:17:57'),(10981,406,2,4264,'4.99','2005-07-07 14:25:28','2006-02-15 22:17:57'),(10982,406,2,5098,'4.99','2005-07-09 06:13:54','2006-02-15 22:17:57'),(10983,406,2,5263,'0.99','2005-07-09 14:10:36','2006-02-15 22:17:57'),(10984,406,1,5766,'0.99','2005-07-10 13:07:31','2006-02-15 22:17:57'),(10985,406,2,6439,'2.99','2005-07-12 00:23:48','2006-02-15 22:17:57'),(10986,406,2,7109,'5.99','2005-07-27 05:28:57','2006-02-15 22:17:57'),(10987,406,1,7171,'4.99','2005-07-27 07:58:35','2006-02-15 22:17:57'),(10988,406,1,7259,'4.99','2005-07-27 11:06:00','2006-02-15 22:17:58'),(10989,406,2,7604,'7.99','2005-07-27 23:54:52','2006-02-15 22:17:58'),(10990,406,2,8080,'4.99','2005-07-28 18:05:06','2006-02-15 22:17:58'),(10991,406,2,8295,'2.99','2005-07-29 02:42:14','2006-02-15 22:17:58'),(10992,406,2,8630,'0.99','2005-07-29 14:07:59','2006-02-15 22:17:58'),(10993,406,1,8903,'0.99','2005-07-30 01:08:06','2006-02-15 22:17:58'),(10994,406,2,8962,'1.99','2005-07-30 03:43:45','2006-02-15 22:17:58'),(10995,406,2,9224,'0.99','2005-07-30 13:25:37','2006-02-15 22:17:58'),(10996,406,1,9291,'4.99','2005-07-30 16:03:39','2006-02-15 22:17:58'),(10997,406,2,9487,'2.99','2005-07-30 23:40:22','2006-02-15 22:17:58'),(10998,406,1,9660,'8.99','2005-07-31 06:03:17','2006-02-15 22:17:58'),(10999,406,1,10632,'1.99','2005-08-01 15:36:56','2006-02-15 22:17:58'),(11000,406,1,11603,'4.99','2005-08-17 03:22:10','2006-02-15 22:17:58'),(11001,406,2,12505,'5.99','2005-08-18 13:17:30','2006-02-15 22:17:58'),(11002,406,2,14205,'6.99','2005-08-21 03:57:15','2006-02-15 22:17:58'),(11003,406,2,14421,'2.99','2005-08-21 11:20:21','2006-02-15 22:17:58'),(11004,406,2,14601,'2.99','2005-08-21 17:45:52','2006-02-15 22:17:58'),(11005,407,1,619,'7.99','2005-05-28 15:52:26','2006-02-15 22:17:58'),(11006,407,1,1698,'2.99','2005-06-16 13:04:42','2006-02-15 22:17:59'),(11007,407,2,2597,'0.99','2005-06-19 05:53:46','2006-02-15 22:17:59'),(11008,407,1,4296,'0.99','2005-07-07 16:16:03','2006-02-15 22:17:59'),(11009,407,1,5070,'4.99','2005-07-09 04:58:26','2006-02-15 22:17:59'),(11010,407,2,5590,'9.99','2005-07-10 04:23:11','2006-02-15 22:17:59'),(11011,407,1,6727,'0.99','2005-07-12 13:54:25','2006-02-15 22:17:59'),(11012,407,1,7363,'5.99','2005-07-27 14:58:29','2006-02-15 22:17:59'),(11013,407,2,7643,'4.99','2005-07-28 01:19:44','2006-02-15 22:17:59'),(11014,407,1,8078,'2.99','2005-07-28 17:54:42','2006-02-15 22:17:59'),(11015,407,1,8109,'4.99','2005-07-28 19:07:44','2006-02-15 22:17:59'),(11016,407,1,8197,'9.99','2005-07-28 23:04:10','2006-02-15 22:17:59'),(11017,407,2,8571,'0.99','2005-07-29 11:48:39','2006-02-15 22:17:59'),(11018,407,1,8802,'2.99','2005-07-29 21:25:51','2006-02-15 22:17:59'),(11019,407,2,10774,'4.99','2005-08-01 20:54:33','2006-02-15 22:17:59'),(11020,407,1,11214,'8.99','2005-08-02 12:19:50','2006-02-15 22:17:59'),(11021,407,1,11222,'2.99','2005-08-02 12:32:28','2006-02-15 22:18:00'),(11022,407,2,11382,'5.99','2005-08-02 18:20:52','2006-02-15 22:18:00'),(11023,407,2,11518,'4.99','2005-08-16 23:59:49','2006-02-15 22:18:00'),(11024,407,1,11677,'0.99','2005-08-17 06:06:26','2006-02-15 22:18:00'),(11025,407,2,12566,'0.99','2005-08-18 15:13:04','2006-02-15 22:18:00'),(11026,407,2,12931,'2.99','2005-08-19 05:11:47','2006-02-15 22:18:00'),(11027,407,1,13800,'0.99','2005-08-20 12:40:48','2006-02-15 22:18:00'),(11028,407,2,13856,'6.99','2005-08-20 14:49:32','2006-02-15 22:18:00'),(11029,407,2,14401,'6.99','2005-08-21 10:36:20','2006-02-15 22:18:00'),(11030,407,2,15320,'0.99','2005-08-22 20:17:49','2006-02-15 22:18:00'),(11031,407,2,15334,'1.99','2005-08-22 20:44:35','2006-02-15 22:18:00'),(11032,408,2,3,'3.99','2005-05-24 23:03:39','2006-02-15 22:18:00'),(11033,408,2,59,'5.99','2005-05-25 08:56:42','2006-02-15 22:18:00'),(11034,408,1,526,'2.99','2005-05-28 04:27:37','2006-02-15 22:18:01'),(11035,408,2,2479,'4.99','2005-06-18 21:03:08','2006-02-15 22:18:01'),(11036,408,1,2564,'2.99','2005-06-19 03:41:10','2006-02-15 22:18:01'),(11037,408,2,2728,'2.99','2005-06-19 15:04:04','2006-02-15 22:18:01'),(11038,408,2,4330,'3.99','2005-07-07 18:09:41','2006-02-15 22:18:01'),(11039,408,2,5073,'0.99','2005-07-09 05:02:35','2006-02-15 22:18:01'),(11040,408,1,6062,'0.99','2005-07-11 04:11:58','2006-02-15 22:18:01'),(11041,408,2,6203,'4.99','2005-07-11 12:28:57','2006-02-15 22:18:01'),(11042,408,2,6826,'2.99','2005-07-12 18:32:02','2006-02-15 22:18:01'),(11043,408,1,7053,'4.99','2005-07-27 03:38:54','2006-02-15 22:18:01'),(11044,408,2,7996,'4.99','2005-07-28 15:00:49','2006-02-15 22:18:01'),(11045,408,2,8251,'4.99','2005-07-29 00:50:14','2006-02-15 22:18:01'),(11046,408,2,8469,'3.99','2005-07-29 08:26:27','2006-02-15 22:18:01'),(11047,408,2,8902,'6.99','2005-07-30 01:08:06','2006-02-15 22:18:01'),(11048,408,1,9052,'0.99','2005-07-30 07:06:08','2006-02-15 22:18:01'),(11049,408,2,9757,'4.99','2005-07-31 09:25:14','2006-02-15 22:18:01'),(11050,408,2,11115,'2.99','2005-08-02 08:31:06','2006-02-15 22:18:01'),(11051,408,1,12140,'2.99','2005-08-17 23:57:55','2006-02-15 22:18:01'),(11052,408,1,12338,'4.99','2005-08-18 07:04:24','2006-02-15 22:18:01'),(11053,408,1,12498,'2.99','2005-08-18 13:01:08','2006-02-15 22:18:02'),(11054,408,2,12900,'0.99','2005-08-19 04:03:49','2006-02-15 22:18:02'),(11055,408,1,13508,'7.99','2005-08-20 02:12:54','2006-02-15 22:18:02'),(11056,408,2,13744,'3.99','2005-08-20 10:51:45','2006-02-15 22:18:02'),(11057,408,1,13944,'2.99','2005-08-20 17:41:16','2006-02-15 22:18:02'),(11058,408,2,14733,'4.99','2005-08-21 22:22:33','2006-02-15 22:18:02'),(11059,408,1,15628,'2.99','2005-08-23 07:28:04','2006-02-15 22:18:02'),(11060,408,2,15716,'1.99','2005-08-23 11:02:00','2006-02-15 22:18:02'),(11061,408,1,15765,'6.99','2005-08-23 13:06:19','2006-02-15 22:18:03'),(11062,409,1,310,'6.99','2005-05-26 22:41:07','2006-02-15 22:18:03'),(11063,409,2,1226,'5.99','2005-06-15 03:46:10','2006-02-15 22:18:03'),(11064,409,2,2310,'8.99','2005-06-18 08:45:59','2006-02-15 22:18:03'),(11065,409,1,3866,'5.99','2005-07-06 17:47:20','2006-02-15 22:18:03'),(11066,409,2,4550,'4.99','2005-07-08 04:34:00','2006-02-15 22:18:03'),(11067,409,1,5175,'3.99','2005-07-09 09:34:28','2006-02-15 22:18:03'),(11068,409,2,5306,'5.99','2005-07-09 15:56:45','2006-02-15 22:18:03'),(11069,409,1,5422,'0.99','2005-07-09 20:55:47','2006-02-15 22:18:03'),(11070,409,1,5848,'2.99','2005-07-10 17:28:14','2006-02-15 22:18:04'),(11071,409,1,5955,'7.99','2005-07-10 23:22:10','2006-02-15 22:18:04'),(11072,409,2,6026,'4.99','2005-07-11 02:21:43','2006-02-15 22:18:04'),(11073,409,1,6596,'2.99','2005-07-12 07:32:59','2006-02-15 22:18:04'),(11074,409,2,7673,'2.99','2005-07-28 02:53:53','2006-02-15 22:18:04'),(11075,409,2,7940,'0.99','2005-07-28 12:46:47','2006-02-15 22:18:04'),(11076,409,1,8037,'4.99','2005-07-28 16:31:20','2006-02-15 22:18:04'),(11077,409,2,8265,'5.99','2005-07-29 01:20:15','2006-02-15 22:18:04'),(11078,409,1,8726,'1.99','2005-07-29 18:09:22','2006-02-15 22:18:04'),(11079,409,2,9267,'0.99','2005-07-30 14:59:05','2006-02-15 22:18:04'),(11080,409,2,12830,'0.99','2005-08-19 01:40:25','2006-02-15 22:18:04'),(11081,409,1,13392,'8.99','2005-08-19 22:03:22','2006-02-15 22:18:04'),(11082,409,2,13632,'6.99','2005-08-20 07:10:52','2006-02-15 22:18:04'),(11083,409,1,14103,'1.99','2005-08-21 00:37:00','2006-02-15 22:18:04'),(11084,409,1,14697,'4.99','2005-08-21 20:49:21','2006-02-15 22:18:05'),(11085,410,1,1514,'2.99','2005-06-15 22:57:34','2006-02-15 22:18:05'),(11086,410,1,2073,'2.99','2005-06-17 16:33:59','2006-02-15 22:18:05'),(11087,410,1,2255,'4.99','2005-06-18 05:21:12','2006-02-15 22:18:05'),(11088,410,2,2400,'5.99','2005-06-18 16:10:46','2006-02-15 22:18:05'),(11089,410,2,2971,'0.99','2005-06-20 07:56:00','2006-02-15 22:18:05'),(11090,410,1,3249,'4.99','2005-06-21 03:13:19','2006-02-15 22:18:05'),(11091,410,2,4062,'0.99','2005-07-07 04:22:27','2006-02-15 22:18:05'),(11092,410,1,4267,'0.99','2005-07-07 14:35:30','2006-02-15 22:18:05'),(11093,410,1,5150,'3.99','2005-07-09 08:28:40','2006-02-15 22:18:05'),(11094,410,1,5192,'4.99','2005-07-09 10:27:09','2006-02-15 22:18:05'),(11095,410,2,5330,'5.99','2005-07-09 16:53:57','2006-02-15 22:18:05'),(11096,410,1,5336,'2.99','2005-07-09 17:01:08','2006-02-15 22:18:05'),(11097,410,1,6148,'4.99','2005-07-11 09:14:22','2006-02-15 22:18:05'),(11098,410,2,6218,'5.99','2005-07-11 13:14:58','2006-02-15 22:18:05'),(11099,410,2,7350,'4.99','2005-07-27 14:34:14','2006-02-15 22:18:05'),(11100,410,2,7407,'5.99','2005-07-27 16:29:04','2006-02-15 22:18:05'),(11101,410,1,7523,'4.99','2005-07-27 21:11:23','2006-02-15 22:18:06'),(11102,410,2,8625,'3.99','2005-07-29 13:59:13','2006-02-15 22:18:06'),(11103,410,1,8882,'0.99','2005-07-30 00:24:05','2006-02-15 22:18:06'),(11104,410,1,9263,'2.99','2005-07-30 14:48:24','2006-02-15 22:18:06'),(11105,410,1,10402,'4.99','2005-08-01 07:27:19','2006-02-15 22:18:06'),(11106,410,1,10837,'2.99','2005-08-01 23:30:22','2006-02-15 22:18:06'),(11107,410,1,11107,'0.99','2005-08-02 08:19:38','2006-02-15 22:18:06'),(11108,410,1,11187,'10.99','2005-08-02 11:16:19','2006-02-15 22:18:06'),(11109,410,1,11472,'6.99','2005-08-02 21:49:06','2006-02-15 22:18:06'),(11110,410,1,11694,'6.99','2005-08-17 06:57:30','2006-02-15 22:18:06'),(11111,410,2,12955,'8.99','2005-08-19 06:05:58','2006-02-15 22:18:06'),(11112,410,1,13460,'4.99','2005-08-20 00:48:24','2006-02-15 22:18:06'),(11113,410,2,13748,'2.99','2005-08-20 10:59:54','2006-02-15 22:18:06'),(11114,410,2,13948,'6.99','2005-08-20 17:50:48','2006-02-15 22:18:06'),(11115,410,1,14237,'3.99','2005-08-21 05:15:00','2006-02-15 22:18:07'),(11116,410,2,14298,'4.99','2005-08-21 07:17:10','2006-02-15 22:18:07'),(11117,410,1,14319,'4.99','2005-08-21 08:00:55','2006-02-15 22:18:07'),(11118,410,2,14819,'2.99','2005-08-22 01:17:19','2006-02-15 22:18:07'),(11119,410,1,15211,'2.99','2005-08-22 16:40:21','2006-02-15 22:18:07'),(11120,410,2,15392,'3.99','2005-08-22 23:02:15','2006-02-15 22:18:07'),(11121,410,1,15518,'4.99','2005-08-23 03:19:34','2006-02-15 22:18:07'),(11122,410,1,12665,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:08'),(11123,411,2,686,'4.99','2005-05-29 00:27:10','2006-02-15 22:18:08'),(11124,411,2,972,'1.99','2005-05-30 20:21:07','2006-02-15 22:18:08'),(11125,411,1,1985,'0.99','2005-06-17 10:31:37','2006-02-15 22:18:08'),(11126,411,2,1997,'2.99','2005-06-17 11:19:43','2006-02-15 22:18:08'),(11127,411,2,2712,'0.99','2005-06-19 14:20:13','2006-02-15 22:18:08'),(11128,411,1,3928,'2.99','2005-07-06 20:52:09','2006-02-15 22:18:08'),(11129,411,2,4146,'0.99','2005-07-07 08:30:16','2006-02-15 22:18:08'),(11130,411,1,4246,'2.99','2005-07-07 13:49:03','2006-02-15 22:18:08'),(11131,411,2,5357,'5.99','2005-07-09 18:08:59','2006-02-15 22:18:08'),(11132,411,1,5800,'2.99','2005-07-10 14:58:36','2006-02-15 22:18:08'),(11133,411,1,7102,'1.99','2005-07-27 05:07:21','2006-02-15 22:18:08'),(11134,411,2,7395,'0.99','2005-07-27 16:03:11','2006-02-15 22:18:08'),(11135,411,1,7513,'2.99','2005-07-27 20:51:04','2006-02-15 22:18:08'),(11136,411,1,7813,'2.99','2005-07-28 08:08:27','2006-02-15 22:18:08'),(11137,411,1,8023,'0.99','2005-07-28 15:53:29','2006-02-15 22:18:08'),(11138,411,2,8613,'5.99','2005-07-29 13:30:58','2006-02-15 22:18:09'),(11139,411,2,9622,'0.99','2005-07-31 04:21:45','2006-02-15 22:18:09'),(11140,411,2,11294,'2.99','2005-08-02 15:08:27','2006-02-15 22:18:09'),(11141,411,1,11997,'5.99','2005-08-17 18:34:38','2006-02-15 22:18:09'),(11142,411,2,13634,'0.99','2005-08-20 07:16:45','2006-02-15 22:18:09'),(11143,411,2,13656,'7.99','2005-08-20 08:01:07','2006-02-15 22:18:09'),(11144,411,2,14480,'2.99','2005-08-21 13:36:40','2006-02-15 22:18:09'),(11145,411,1,14772,'5.99','2005-08-21 23:50:39','2006-02-15 22:18:09'),(11146,411,2,14996,'2.99','2005-08-22 07:52:41','2006-02-15 22:18:09'),(11147,411,1,15936,'0.99','2005-08-23 18:43:11','2006-02-15 22:18:09'),(11148,411,2,13246,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:09'),(11149,412,2,191,'0.99','2005-05-26 06:14:06','2006-02-15 22:18:09'),(11150,412,1,333,'4.99','2005-05-27 02:52:21','2006-02-15 22:18:09'),(11151,412,1,717,'0.99','2005-05-29 04:37:44','2006-02-15 22:18:09'),(11152,412,2,1043,'3.99','2005-05-31 06:11:40','2006-02-15 22:18:09'),(11153,412,1,3292,'2.99','2005-06-21 06:59:11','2006-02-15 22:18:09'),(11154,412,2,3888,'0.99','2005-07-06 18:54:20','2006-02-15 22:18:09'),(11155,412,2,4074,'0.99','2005-07-07 04:49:49','2006-02-15 22:18:09'),(11156,412,1,8036,'0.99','2005-07-28 16:27:43','2006-02-15 22:18:09'),(11157,412,2,8330,'8.99','2005-07-29 04:09:07','2006-02-15 22:18:10'),(11158,412,1,8411,'8.99','2005-07-29 06:44:23','2006-02-15 22:18:10'),(11159,412,1,8674,'0.99','2005-07-29 15:54:22','2006-02-15 22:18:10'),(11160,412,1,9881,'4.99','2005-07-31 13:50:38','2006-02-15 22:18:10'),(11161,412,2,10381,'2.99','2005-08-01 06:36:37','2006-02-15 22:18:10'),(11162,412,1,10467,'5.99','2005-08-01 09:45:58','2006-02-15 22:18:10'),(11163,412,2,11027,'4.99','2005-08-02 05:47:10','2006-02-15 22:18:10'),(11164,412,1,14068,'3.99','2005-08-20 22:50:59','2006-02-15 22:18:10'),(11165,412,1,14535,'6.99','2005-08-21 15:22:37','2006-02-15 22:18:10'),(11166,412,2,15354,'4.99','2005-08-22 21:18:59','2006-02-15 22:18:10'),(11167,412,2,15732,'4.99','2005-08-23 11:35:12','2006-02-15 22:18:10'),(11168,412,1,15781,'8.99','2005-08-23 13:41:05','2006-02-15 22:18:10'),(11169,412,1,15314,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:10'),(11170,413,1,40,'4.99','2005-05-25 05:09:04','2006-02-15 22:18:10'),(11171,413,1,999,'4.99','2005-05-31 00:25:10','2006-02-15 22:18:10'),(11172,413,2,2130,'5.99','2005-06-17 21:00:44','2006-02-15 22:18:10'),(11173,413,2,2545,'4.99','2005-06-19 02:23:36','2006-02-15 22:18:10'),(11174,413,1,3762,'4.99','2005-07-06 12:52:49','2006-02-15 22:18:10'),(11175,413,2,4491,'0.99','2005-07-08 01:30:46','2006-02-15 22:18:10'),(11176,413,1,5897,'7.99','2005-07-10 20:16:14','2006-02-15 22:18:11'),(11177,413,2,7100,'4.99','2005-07-27 05:05:01','2006-02-15 22:18:11'),(11178,413,1,7635,'0.99','2005-07-28 01:08:11','2006-02-15 22:18:11'),(11179,413,2,7731,'0.99','2005-07-28 05:01:18','2006-02-15 22:18:11'),(11180,413,1,10909,'2.99','2005-08-02 01:53:59','2006-02-15 22:18:11'),(11181,413,2,11304,'2.99','2005-08-02 15:40:10','2006-02-15 22:18:11'),(11182,413,1,11468,'0.99','2005-08-02 21:47:26','2006-02-15 22:18:11'),(11183,413,1,11532,'0.99','2005-08-17 00:34:14','2006-02-15 22:18:11'),(11184,413,2,12552,'2.99','2005-08-18 14:46:34','2006-02-15 22:18:11'),(11185,413,1,13010,'3.99','2005-08-19 07:52:21','2006-02-15 22:18:11'),(11186,413,1,13318,'2.99','2005-08-19 19:33:57','2006-02-15 22:18:11'),(11187,413,2,13824,'4.99','2005-08-20 13:43:12','2006-02-15 22:18:11'),(11188,413,2,13887,'4.99','2005-08-20 15:39:00','2006-02-15 22:18:11'),(11189,413,1,14773,'2.99','2005-08-21 23:50:57','2006-02-15 22:18:11'),(11190,413,1,15678,'2.99','2005-08-23 09:23:45','2006-02-15 22:18:11'),(11191,414,1,85,'4.99','2005-05-25 13:05:34','2006-02-15 22:18:11'),(11192,414,1,261,'3.99','2005-05-26 15:44:23','2006-02-15 22:18:11'),(11193,414,1,2246,'4.99','2005-06-18 04:54:29','2006-02-15 22:18:11'),(11194,414,1,2559,'9.99','2005-06-19 03:09:46','2006-02-15 22:18:12'),(11195,414,1,3318,'5.99','2005-06-21 08:23:05','2006-02-15 22:18:12'),(11196,414,1,3957,'10.99','2005-07-06 22:05:47','2006-02-15 22:18:12'),(11197,414,1,4437,'3.99','2005-07-07 22:55:41','2006-02-15 22:18:12'),(11198,414,2,6462,'7.99','2005-07-12 01:15:24','2006-02-15 22:18:12'),(11199,414,2,6728,'0.99','2005-07-12 13:56:48','2006-02-15 22:18:12'),(11200,414,2,6845,'0.99','2005-07-12 19:20:41','2006-02-15 22:18:12'),(11201,414,1,7009,'0.99','2005-07-27 01:45:44','2006-02-15 22:18:12'),(11202,414,1,7779,'2.99','2005-07-28 07:11:11','2006-02-15 22:18:12'),(11203,414,1,9650,'2.99','2005-07-31 05:47:32','2006-02-15 22:18:12'),(11204,414,2,9991,'2.99','2005-07-31 17:26:27','2006-02-15 22:18:12'),(11205,414,2,10107,'5.99','2005-07-31 21:01:46','2006-02-15 22:18:12'),(11206,414,1,11706,'0.99','2005-08-17 07:23:46','2006-02-15 22:18:12'),(11207,414,2,12930,'4.99','2005-08-19 05:11:32','2006-02-15 22:18:12'),(11208,414,1,13042,'0.99','2005-08-19 09:06:08','2006-02-15 22:18:12'),(11209,414,1,13242,'2.99','2005-08-19 16:28:47','2006-02-15 22:18:12'),(11210,414,1,13308,'7.99','2005-08-19 18:59:42','2006-02-15 22:18:12'),(11211,414,1,13404,'0.99','2005-08-19 22:18:42','2006-02-15 22:18:12'),(11212,414,2,13494,'2.99','2005-08-20 01:36:34','2006-02-15 22:18:12'),(11213,414,2,13657,'4.99','2005-08-20 08:01:39','2006-02-15 22:18:12'),(11214,414,1,15140,'6.99','2005-08-22 13:39:20','2006-02-15 22:18:13'),(11215,414,2,15481,'0.99','2005-08-23 01:59:14','2006-02-15 22:18:13'),(11216,415,2,665,'4.99','2005-05-28 21:38:39','2006-02-15 22:18:13'),(11217,415,2,1867,'4.99','2005-06-17 02:01:37','2006-02-15 22:18:13'),(11218,415,1,3211,'2.99','2005-06-21 01:01:29','2006-02-15 22:18:13'),(11219,415,2,4926,'8.99','2005-07-08 22:01:48','2006-02-15 22:18:13'),(11220,415,2,5665,'0.99','2005-07-10 08:10:08','2006-02-15 22:18:13'),(11221,415,2,5733,'0.99','2005-07-10 11:37:24','2006-02-15 22:18:13'),(11222,415,2,6491,'5.99','2005-07-12 02:28:31','2006-02-15 22:18:13'),(11223,415,1,6505,'3.99','2005-07-12 03:27:37','2006-02-15 22:18:13'),(11224,415,1,7379,'4.99','2005-07-27 15:36:43','2006-02-15 22:18:13'),(11225,415,2,7624,'0.99','2005-07-28 00:37:44','2006-02-15 22:18:13'),(11226,415,1,7748,'4.99','2005-07-28 05:52:23','2006-02-15 22:18:13'),(11227,415,2,8317,'2.99','2005-07-29 03:39:07','2006-02-15 22:18:13'),(11228,415,2,9586,'2.99','2005-07-31 03:07:16','2006-02-15 22:18:13'),(11229,415,1,9852,'2.99','2005-07-31 12:52:17','2006-02-15 22:18:13'),(11230,415,1,10263,'5.99','2005-08-01 03:02:48','2006-02-15 22:18:13'),(11231,415,1,10553,'2.99','2005-08-01 12:54:06','2006-02-15 22:18:13'),(11232,415,2,11310,'1.99','2005-08-02 15:51:58','2006-02-15 22:18:13'),(11233,415,2,12128,'5.99','2005-08-17 23:31:09','2006-02-15 22:18:14'),(11234,415,2,12588,'2.99','2005-08-18 16:04:45','2006-02-15 22:18:14'),(11235,415,2,13729,'8.99','2005-08-20 10:17:08','2006-02-15 22:18:14'),(11236,415,1,14992,'4.99','2005-08-22 07:51:47','2006-02-15 22:18:14'),(11237,415,2,15121,'4.99','2005-08-22 12:46:37','2006-02-15 22:18:14'),(11238,415,1,15959,'0.99','2005-08-23 19:27:04','2006-02-15 22:18:14'),(11239,416,2,253,'0.99','2005-05-26 14:43:14','2006-02-15 22:18:14'),(11240,416,2,724,'3.99','2005-05-29 05:53:23','2006-02-15 22:18:14'),(11241,416,2,1031,'2.99','2005-05-31 04:23:01','2006-02-15 22:18:14'),(11242,416,2,1158,'2.99','2005-06-14 22:53:33','2006-02-15 22:18:14'),(11243,416,1,1343,'4.99','2005-06-15 12:27:19','2006-02-15 22:18:14'),(11244,416,2,1553,'0.99','2005-06-16 02:02:44','2006-02-15 22:18:14'),(11245,416,2,1596,'2.99','2005-06-16 05:30:58','2006-02-15 22:18:14'),(11246,416,2,1771,'0.99','2005-06-16 18:12:17','2006-02-15 22:18:14'),(11247,416,1,3833,'3.99','2005-07-06 16:18:28','2006-02-15 22:18:14'),(11248,416,1,3868,'2.99','2005-07-06 17:54:13','2006-02-15 22:18:14'),(11249,416,1,6097,'2.99','2005-07-11 06:21:43','2006-02-15 22:18:14'),(11250,416,1,6879,'7.99','2005-07-12 20:37:37','2006-02-15 22:18:14'),(11251,416,1,7889,'0.99','2005-07-28 10:43:21','2006-02-15 22:18:14'),(11252,416,1,7917,'2.99','2005-07-28 11:56:57','2006-02-15 22:18:15'),(11253,416,2,8349,'5.99','2005-07-29 04:50:22','2006-02-15 22:18:15'),(11254,416,2,8588,'2.99','2005-07-29 12:22:20','2006-02-15 22:18:15'),(11255,416,2,8648,'2.99','2005-07-29 14:56:21','2006-02-15 22:18:15'),(11256,416,2,9383,'2.99','2005-07-30 19:24:50','2006-02-15 22:18:15'),(11257,416,1,10254,'3.99','2005-08-01 02:42:03','2006-02-15 22:18:15'),(11258,416,1,10354,'2.99','2005-08-01 05:47:10','2006-02-15 22:18:15'),(11259,416,1,10742,'6.99','2005-08-01 19:53:13','2006-02-15 22:18:15'),(11260,416,1,10937,'6.99','2005-08-02 03:00:18','2006-02-15 22:18:15'),(11261,416,2,11047,'5.99','2005-08-02 06:09:20','2006-02-15 22:18:15'),(11262,416,1,11557,'6.99','2005-08-17 01:19:20','2006-02-15 22:18:15'),(11263,416,1,12722,'8.99','2005-08-18 21:33:53','2006-02-15 22:18:15'),(11264,416,1,12932,'4.99','2005-08-19 05:17:30','2006-02-15 22:18:15'),(11265,416,1,14239,'4.99','2005-08-21 05:18:57','2006-02-15 22:18:15'),(11266,416,1,15235,'1.99','2005-08-22 17:43:12','2006-02-15 22:18:15'),(11267,416,2,15470,'4.99','2005-08-23 01:35:12','2006-02-15 22:18:15'),(11268,416,1,15727,'2.99','2005-08-23 11:28:49','2006-02-15 22:18:15'),(11269,416,2,15761,'0.99','2005-08-23 12:55:51','2006-02-15 22:18:15'),(11270,417,1,267,'4.99','2005-05-26 16:16:21','2006-02-15 22:18:15'),(11271,417,2,630,'8.99','2005-05-28 17:24:51','2006-02-15 22:18:16'),(11272,417,2,833,'4.99','2005-05-29 23:21:56','2006-02-15 22:18:16'),(11273,417,1,1921,'3.99','2005-06-17 06:04:16','2006-02-15 22:18:16'),(11274,417,1,3952,'4.99','2005-07-06 21:51:31','2006-02-15 22:18:16'),(11275,417,1,4418,'2.99','2005-07-07 22:05:30','2006-02-15 22:18:16'),(11276,417,1,4421,'9.99','2005-07-07 22:07:55','2006-02-15 22:18:16'),(11277,417,2,6258,'6.99','2005-07-11 15:24:32','2006-02-15 22:18:16'),(11278,417,1,6312,'4.99','2005-07-11 18:19:02','2006-02-15 22:18:16'),(11279,417,1,8877,'2.99','2005-07-30 00:15:22','2006-02-15 22:18:16'),(11280,417,2,9049,'2.99','2005-07-30 06:57:28','2006-02-15 22:18:16'),(11281,417,1,10478,'0.99','2005-08-01 10:09:06','2006-02-15 22:18:16'),(11282,417,1,11217,'7.99','2005-08-02 12:26:31','2006-02-15 22:18:16'),(11283,417,1,11291,'6.99','2005-08-02 14:57:58','2006-02-15 22:18:16'),(11284,417,2,11303,'0.99','2005-08-02 15:39:18','2006-02-15 22:18:16'),(11285,417,2,12074,'0.99','2005-08-17 21:50:57','2006-02-15 22:18:16'),(11286,417,2,12281,'4.99','2005-08-18 04:50:32','2006-02-15 22:18:16'),(11287,417,1,13545,'4.99','2005-08-20 03:50:15','2006-02-15 22:18:16'),(11288,417,1,13927,'1.99','2005-08-20 17:11:58','2006-02-15 22:18:16'),(11289,417,2,14121,'4.99','2005-08-21 01:26:33','2006-02-15 22:18:16'),(11290,417,1,14304,'6.99','2005-08-21 07:23:10','2006-02-15 22:18:17'),(11291,417,1,14607,'2.99','2005-08-21 17:56:50','2006-02-15 22:18:17'),(11292,417,2,14882,'2.99','2005-08-22 03:52:21','2006-02-15 22:18:17'),(11293,417,1,15795,'0.99','2005-08-23 14:07:56','2006-02-15 22:18:17'),(11294,417,2,13261,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:17'),(11295,418,1,2825,'2.99','2005-06-19 20:32:19','2006-02-15 22:18:17'),(11296,418,2,2943,'2.99','2005-06-20 05:43:05','2006-02-15 22:18:17'),(11297,418,2,2969,'2.99','2005-06-20 07:44:27','2006-02-15 22:18:17'),(11298,418,1,3805,'0.99','2005-07-06 15:08:42','2006-02-15 22:18:17'),(11299,418,2,4852,'7.99','2005-07-08 18:43:15','2006-02-15 22:18:17'),(11300,418,1,4865,'2.99','2005-07-08 19:09:04','2006-02-15 22:18:17'),(11301,418,1,4938,'0.99','2005-07-08 22:32:53','2006-02-15 22:18:17'),(11302,418,1,6150,'4.99','2005-07-11 09:23:56','2006-02-15 22:18:17'),(11303,418,1,6970,'4.99','2005-07-27 00:26:14','2006-02-15 22:18:17'),(11304,418,2,8546,'5.99','2005-07-29 11:08:48','2006-02-15 22:18:17'),(11305,418,2,8591,'0.99','2005-07-29 12:32:33','2006-02-15 22:18:17'),(11306,418,2,8886,'10.99','2005-07-30 00:36:31','2006-02-15 22:18:17'),(11307,418,1,9558,'4.99','2005-07-31 02:14:35','2006-02-15 22:18:17'),(11308,418,2,10537,'5.99','2005-08-01 12:22:28','2006-02-15 22:18:17'),(11309,418,1,10709,'0.99','2005-08-01 18:43:57','2006-02-15 22:18:18'),(11310,418,2,10915,'2.99','2005-08-02 02:05:04','2006-02-15 22:18:18'),(11311,418,1,11270,'2.99','2005-08-02 14:18:07','2006-02-15 22:18:18'),(11312,418,2,11322,'3.99','2005-08-02 16:23:17','2006-02-15 22:18:18'),(11313,418,2,11409,'1.99','2005-08-02 19:26:51','2006-02-15 22:18:18'),(11314,418,1,11650,'4.99','2005-08-17 05:00:03','2006-02-15 22:18:18'),(11315,418,1,11769,'2.99','2005-08-17 10:04:49','2006-02-15 22:18:18'),(11316,418,1,11910,'0.99','2005-08-17 15:44:37','2006-02-15 22:18:18'),(11317,418,2,13312,'0.99','2005-08-19 19:09:14','2006-02-15 22:18:18'),(11318,418,1,13537,'2.99','2005-08-20 03:39:15','2006-02-15 22:18:18'),(11319,418,1,13970,'0.99','2005-08-20 18:43:34','2006-02-15 22:18:18'),(11320,418,1,14484,'0.99','2005-08-21 13:47:29','2006-02-15 22:18:18'),(11321,418,1,14836,'4.99','2005-08-22 01:52:26','2006-02-15 22:18:18'),(11322,418,2,14860,'2.99','2005-08-22 02:47:07','2006-02-15 22:18:18'),(11323,418,1,15466,'4.99','2005-08-23 01:16:55','2006-02-15 22:18:18'),(11324,418,2,15957,'5.99','2005-08-23 19:21:22','2006-02-15 22:18:18'),(11325,419,1,62,'2.99','2005-05-25 09:18:52','2006-02-15 22:18:18'),(11326,419,2,2793,'2.99','2005-06-19 18:52:37','2006-02-15 22:18:18'),(11327,419,1,3596,'0.99','2005-07-06 05:03:11','2006-02-15 22:18:18'),(11328,419,1,3694,'4.99','2005-07-06 10:01:23','2006-02-15 22:18:19'),(11329,419,1,4224,'0.99','2005-07-07 12:24:21','2006-02-15 22:18:19'),(11330,419,2,5333,'5.99','2005-07-09 16:59:38','2006-02-15 22:18:19'),(11331,419,2,5863,'0.99','2005-07-10 18:25:23','2006-02-15 22:18:19'),(11332,419,1,5900,'3.99','2005-07-10 20:21:54','2006-02-15 22:18:19'),(11333,419,2,5933,'0.99','2005-07-10 22:06:48','2006-02-15 22:18:19'),(11334,419,2,6173,'0.99','2005-07-11 10:33:11','2006-02-15 22:18:19'),(11335,419,2,6587,'3.99','2005-07-12 06:56:26','2006-02-15 22:18:19'),(11336,419,1,7362,'4.99','2005-07-27 14:58:27','2006-02-15 22:18:19'),(11337,419,1,7619,'2.99','2005-07-28 00:25:41','2006-02-15 22:18:19'),(11338,419,1,7796,'4.99','2005-07-28 07:39:39','2006-02-15 22:18:19'),(11339,419,1,10150,'2.99','2005-07-31 22:22:00','2006-02-15 22:18:19'),(11340,419,1,10372,'2.99','2005-08-01 06:23:48','2006-02-15 22:18:19'),(11341,419,2,11025,'4.99','2005-08-02 05:39:12','2006-02-15 22:18:19'),(11342,419,1,11313,'2.99','2005-08-02 16:02:51','2006-02-15 22:18:19'),(11343,419,2,11323,'2.99','2005-08-02 16:29:57','2006-02-15 22:18:19'),(11344,419,1,11425,'2.99','2005-08-02 19:58:48','2006-02-15 22:18:19'),(11345,419,2,11689,'6.99','2005-08-17 06:42:08','2006-02-15 22:18:19'),(11346,419,1,12460,'7.99','2005-08-18 11:25:13','2006-02-15 22:18:19'),(11347,419,1,12720,'5.99','2005-08-18 21:28:42','2006-02-15 22:18:20'),(11348,419,2,14308,'0.99','2005-08-21 07:43:21','2006-02-15 22:18:20'),(11349,419,2,15779,'4.99','2005-08-23 13:33:46','2006-02-15 22:18:20'),(11350,420,2,744,'4.99','2005-05-29 09:13:08','2006-02-15 22:18:20'),(11351,420,2,2672,'3.99','2005-06-19 11:42:04','2006-02-15 22:18:20'),(11352,420,1,2698,'0.99','2005-06-19 13:29:11','2006-02-15 22:18:20'),(11353,420,1,2726,'0.99','2005-06-19 15:02:20','2006-02-15 22:18:20'),(11354,420,1,4176,'4.99','2005-07-07 10:03:34','2006-02-15 22:18:20'),(11355,420,2,5081,'4.99','2005-07-09 05:25:20','2006-02-15 22:18:20'),(11356,420,1,5168,'4.99','2005-07-09 09:20:01','2006-02-15 22:18:20'),(11357,420,2,5911,'0.99','2005-07-10 20:51:42','2006-02-15 22:18:20'),(11358,420,2,6086,'3.99','2005-07-11 05:29:03','2006-02-15 22:18:20'),(11359,420,2,6096,'4.99','2005-07-11 06:18:04','2006-02-15 22:18:20'),(11360,420,2,6582,'4.99','2005-07-12 06:28:12','2006-02-15 22:18:20'),(11361,420,1,6588,'4.99','2005-07-12 06:57:40','2006-02-15 22:18:20'),(11362,420,2,7081,'2.99','2005-07-27 04:25:59','2006-02-15 22:18:20'),(11363,420,2,8485,'0.99','2005-07-29 08:53:09','2006-02-15 22:18:20'),(11364,420,1,9362,'0.99','2005-07-30 18:44:16','2006-02-15 22:18:20'),(11365,420,2,10291,'4.99','2005-08-01 03:39:57','2006-02-15 22:18:20'),(11366,420,2,10601,'10.99','2005-08-01 14:25:40','2006-02-15 22:18:21'),(11367,420,1,10766,'4.99','2005-08-01 20:36:29','2006-02-15 22:18:21'),(11368,420,2,11236,'5.99','2005-08-02 13:17:21','2006-02-15 22:18:21'),(11369,420,2,14525,'0.99','2005-08-21 15:06:49','2006-02-15 22:18:21'),(11370,420,2,15597,'0.99','2005-08-23 06:21:20','2006-02-15 22:18:21'),(11371,421,1,507,'0.99','2005-05-28 02:31:19','2006-02-15 22:18:21'),(11372,421,1,931,'0.99','2005-05-30 12:53:01','2006-02-15 22:18:21'),(11373,421,1,1693,'4.99','2005-06-16 12:39:51','2006-02-15 22:18:21'),(11374,421,2,2407,'2.99','2005-06-18 16:50:41','2006-02-15 22:18:21'),(11375,421,1,3170,'4.99','2005-06-20 22:02:54','2006-02-15 22:18:21'),(11376,421,1,3491,'7.99','2005-07-05 23:41:08','2006-02-15 22:18:21'),(11377,421,2,3703,'5.99','2005-07-06 10:15:26','2006-02-15 22:18:21'),(11378,421,1,3988,'8.99','2005-07-06 23:30:42','2006-02-15 22:18:21'),(11379,421,2,4456,'5.99','2005-07-07 23:45:21','2006-02-15 22:18:21'),(11380,421,1,6220,'0.99','2005-07-11 13:22:06','2006-02-15 22:18:21'),(11381,421,2,6960,'3.99','2005-07-27 00:08:33','2006-02-15 22:18:21'),(11382,421,2,7449,'4.99','2005-07-27 18:17:41','2006-02-15 22:18:21'),(11383,421,2,8025,'2.99','2005-07-28 16:03:27','2006-02-15 22:18:21'),(11384,421,1,8268,'4.99','2005-07-29 01:23:23','2006-02-15 22:18:21'),(11385,421,1,8725,'4.99','2005-07-29 18:08:42','2006-02-15 22:18:22'),(11386,421,2,9377,'4.99','2005-07-30 19:12:18','2006-02-15 22:18:22'),(11387,421,2,9875,'0.99','2005-07-31 13:37:41','2006-02-15 22:18:22'),(11388,421,1,10200,'4.99','2005-08-01 00:39:05','2006-02-15 22:18:22'),(11389,421,2,11089,'2.99','2005-08-02 07:52:20','2006-02-15 22:18:22'),(11390,421,1,11263,'4.99','2005-08-02 14:02:19','2006-02-15 22:18:22'),(11391,421,1,11523,'3.99','2005-08-17 00:10:10','2006-02-15 22:18:22'),(11392,421,1,12279,'4.99','2005-08-18 04:47:30','2006-02-15 22:18:22'),(11393,421,2,13461,'9.99','2005-08-20 00:49:04','2006-02-15 22:18:22'),(11394,421,1,13872,'4.99','2005-08-20 15:10:30','2006-02-15 22:18:22'),(11395,421,1,14742,'4.99','2005-08-21 22:39:01','2006-02-15 22:18:22'),(11396,421,1,14887,'3.99','2005-08-22 04:04:31','2006-02-15 22:18:22'),(11397,421,2,15710,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:22'),(11398,422,1,398,'0.99','2005-05-27 12:44:03','2006-02-15 22:18:22'),(11399,422,1,1846,'0.99','2005-06-17 00:02:44','2006-02-15 22:18:22'),(11400,422,1,1897,'4.99','2005-06-17 04:26:23','2006-02-15 22:18:22'),(11401,422,2,2747,'2.99','2005-06-19 16:22:07','2006-02-15 22:18:22'),(11402,422,1,2778,'5.99','2005-06-19 18:18:12','2006-02-15 22:18:22'),(11403,422,1,3553,'4.99','2005-07-06 02:35:41','2006-02-15 22:18:22'),(11404,422,2,4463,'2.99','2005-07-08 00:04:59','2006-02-15 22:18:23'),(11405,422,2,4504,'0.99','2005-07-08 02:19:27','2006-02-15 22:18:23'),(11406,422,1,5784,'1.99','2005-07-10 14:03:28','2006-02-15 22:18:23'),(11407,422,2,7827,'0.99','2005-07-28 08:37:22','2006-02-15 22:18:23'),(11408,422,2,8206,'4.99','2005-07-28 23:20:31','2006-02-15 22:18:23'),(11409,422,2,9541,'4.99','2005-07-31 01:40:14','2006-02-15 22:18:23'),(11410,422,2,10833,'6.99','2005-08-01 23:25:55','2006-02-15 22:18:23'),(11411,422,2,11325,'6.99','2005-08-02 16:33:11','2006-02-15 22:18:23'),(11412,422,1,11658,'2.99','2005-08-17 05:19:17','2006-02-15 22:18:23'),(11413,422,1,11842,'4.99','2005-08-17 13:13:37','2006-02-15 22:18:23'),(11414,422,1,12907,'9.99','2005-08-19 04:16:13','2006-02-15 22:18:23'),(11415,422,2,13216,'1.99','2005-08-19 15:36:05','2006-02-15 22:18:23'),(11416,422,2,13625,'1.99','2005-08-20 06:52:03','2006-02-15 22:18:23'),(11417,422,2,13709,'0.99','2005-08-20 09:34:51','2006-02-15 22:18:23'),(11418,422,2,13722,'4.99','2005-08-20 10:03:45','2006-02-15 22:18:23'),(11419,422,1,14861,'4.99','2005-08-22 02:48:05','2006-02-15 22:18:23'),(11420,422,1,15272,'3.99','2005-08-22 18:49:40','2006-02-15 22:18:23'),(11421,422,1,15273,'2.99','2005-08-22 18:53:28','2006-02-15 22:18:23'),(11422,422,2,15316,'2.99','2005-08-22 20:07:03','2006-02-15 22:18:23'),(11423,422,2,15441,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:24'),(11424,423,1,1504,'3.99','2005-06-15 22:08:06','2006-02-15 22:18:24'),(11425,423,2,1827,'0.99','2005-06-16 21:54:40','2006-02-15 22:18:24'),(11426,423,1,2600,'6.99','2005-06-19 06:07:25','2006-02-15 22:18:24'),(11427,423,2,2758,'6.99','2005-06-19 17:04:35','2006-02-15 22:18:24'),(11428,423,1,3072,'8.99','2005-06-20 14:21:31','2006-02-15 22:18:24'),(11429,423,2,4105,'0.99','2005-07-07 06:31:00','2006-02-15 22:18:24'),(11430,423,1,4250,'0.99','2005-07-07 14:08:11','2006-02-15 22:18:24'),(11431,423,1,4679,'2.99','2005-07-08 10:33:14','2006-02-15 22:18:24'),(11432,423,1,6506,'1.99','2005-07-12 03:28:22','2006-02-15 22:18:24'),(11433,423,1,7016,'5.99','2005-07-27 02:15:16','2006-02-15 22:18:24'),(11434,423,2,7141,'2.99','2005-07-27 06:55:27','2006-02-15 22:18:24'),(11435,423,1,7157,'4.99','2005-07-27 07:20:28','2006-02-15 22:18:24'),(11436,423,1,7290,'0.99','2005-07-27 12:28:45','2006-02-15 22:18:24'),(11437,423,2,7539,'9.99','2005-07-27 21:39:42','2006-02-15 22:18:24'),(11438,423,1,7849,'9.99','2005-07-28 09:30:02','2006-02-15 22:18:24'),(11439,423,2,8082,'3.99','2005-07-28 18:08:02','2006-02-15 22:18:24'),(11440,423,2,8595,'9.99','2005-07-29 12:47:43','2006-02-15 22:18:24'),(11441,423,2,9026,'2.99','2005-07-30 05:55:31','2006-02-15 22:18:24'),(11442,423,1,10488,'2.99','2005-08-01 10:27:27','2006-02-15 22:18:25'),(11443,423,1,11091,'2.99','2005-08-02 07:56:41','2006-02-15 22:18:25'),(11444,423,2,11514,'4.99','2005-08-16 23:53:10','2006-02-15 22:18:25'),(11445,423,2,12806,'4.99','2005-08-19 00:37:26','2006-02-15 22:18:25'),(11446,423,2,14191,'6.99','2005-08-21 03:35:58','2006-02-15 22:18:25'),(11447,423,2,14902,'4.99','2005-08-22 04:31:50','2006-02-15 22:18:25'),(11448,423,1,15380,'0.99','2005-08-22 22:28:15','2006-02-15 22:18:25'),(11449,423,1,15755,'4.99','2005-08-23 12:46:38','2006-02-15 22:18:25'),(11450,424,2,403,'0.99','2005-05-27 13:28:52','2006-02-15 22:18:25'),(11451,424,2,3044,'4.99','2005-06-20 12:38:49','2006-02-15 22:18:25'),(11452,424,1,3166,'6.99','2005-06-20 21:32:32','2006-02-15 22:18:25'),(11453,424,2,3404,'0.99','2005-06-21 15:57:52','2006-02-15 22:18:25'),(11454,424,2,3746,'0.99','2005-07-06 12:10:51','2006-02-15 22:18:25'),(11455,424,2,4512,'0.99','2005-07-08 02:38:56','2006-02-15 22:18:25'),(11456,424,2,4559,'0.99','2005-07-08 04:56:49','2006-02-15 22:18:25'),(11457,424,2,4696,'5.99','2005-07-08 11:12:27','2006-02-15 22:18:25'),(11458,424,1,5568,'0.99','2005-07-10 03:36:56','2006-02-15 22:18:25'),(11459,424,1,5611,'3.99','2005-07-10 05:13:43','2006-02-15 22:18:25'),(11460,424,1,6589,'2.99','2005-07-12 07:06:29','2006-02-15 22:18:25'),(11461,424,1,7594,'2.99','2005-07-27 23:30:41','2006-02-15 22:18:26'),(11462,424,2,8194,'2.99','2005-07-28 22:51:44','2006-02-15 22:18:26'),(11463,424,1,8918,'4.99','2005-07-30 01:56:22','2006-02-15 22:18:26'),(11464,424,2,8964,'1.99','2005-07-30 03:49:35','2006-02-15 22:18:26'),(11465,424,2,8999,'2.99','2005-07-30 04:55:46','2006-02-15 22:18:26'),(11466,424,1,9471,'4.99','2005-07-30 23:02:36','2006-02-15 22:18:26'),(11467,424,1,9516,'8.99','2005-07-31 00:40:58','2006-02-15 22:18:26'),(11468,424,2,9878,'4.99','2005-07-31 13:42:02','2006-02-15 22:18:26'),(11469,424,1,10017,'6.99','2005-07-31 18:13:22','2006-02-15 22:18:26'),(11470,424,2,10369,'4.99','2005-08-01 06:13:44','2006-02-15 22:18:26'),(11471,424,1,10866,'2.99','2005-08-02 00:22:49','2006-02-15 22:18:26'),(11472,424,2,11374,'2.99','2005-08-02 18:14:54','2006-02-15 22:18:26'),(11473,424,2,11562,'6.99','2005-08-17 01:23:39','2006-02-15 22:18:26'),(11474,424,2,11833,'2.99','2005-08-17 13:00:33','2006-02-15 22:18:26'),(11475,424,2,12729,'0.99','2005-08-18 21:52:59','2006-02-15 22:18:26'),(11476,424,2,13793,'3.99','2005-08-20 12:22:04','2006-02-15 22:18:26'),(11477,424,2,15113,'0.99','2005-08-22 12:23:59','2006-02-15 22:18:26'),(11478,424,2,15941,'9.99','2005-08-23 18:46:44','2006-02-15 22:18:26'),(11479,424,1,15094,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:27'),(11480,425,2,1098,'5.99','2005-05-31 13:51:48','2006-02-15 22:18:27'),(11481,425,1,3276,'6.99','2005-06-21 05:35:52','2006-02-15 22:18:27'),(11482,425,1,3807,'4.99','2005-07-06 15:11:44','2006-02-15 22:18:27'),(11483,425,2,4361,'2.99','2005-07-07 19:33:23','2006-02-15 22:18:27'),(11484,425,2,4362,'5.99','2005-07-07 19:35:30','2006-02-15 22:18:27'),(11485,425,2,4483,'8.99','2005-07-08 01:03:12','2006-02-15 22:18:27'),(11486,425,1,4659,'2.99','2005-07-08 09:53:28','2006-02-15 22:18:27'),(11487,425,1,4884,'7.99','2005-07-08 19:49:17','2006-02-15 22:18:27'),(11488,425,1,4939,'7.99','2005-07-08 22:35:30','2006-02-15 22:18:27'),(11489,425,2,5363,'2.99','2005-07-09 18:18:49','2006-02-15 22:18:27'),(11490,425,1,5371,'4.99','2005-07-09 18:47:48','2006-02-15 22:18:27'),(11491,425,2,6318,'2.99','2005-07-11 18:48:22','2006-02-15 22:18:27'),(11492,425,1,6603,'2.99','2005-07-12 07:52:55','2006-02-15 22:18:27'),(11493,425,1,7249,'4.99','2005-07-27 10:39:53','2006-02-15 22:18:27'),(11494,425,1,8974,'0.99','2005-07-30 04:09:16','2006-02-15 22:18:27'),(11495,425,1,9170,'0.99','2005-07-30 11:35:24','2006-02-15 22:18:27'),(11496,425,2,9682,'2.99','2005-07-31 06:47:10','2006-02-15 22:18:27'),(11497,425,1,10121,'0.99','2005-07-31 21:24:53','2006-02-15 22:18:27'),(11498,425,2,10163,'0.99','2005-07-31 23:12:34','2006-02-15 22:18:28'),(11499,425,1,10545,'0.99','2005-08-01 12:37:46','2006-02-15 22:18:28'),(11500,425,2,13040,'0.99','2005-08-19 09:04:24','2006-02-15 22:18:28'),(11501,425,2,14089,'5.99','2005-08-20 23:59:02','2006-02-15 22:18:28'),(11502,425,2,14881,'4.99','2005-08-22 03:47:39','2006-02-15 22:18:28'),(11503,425,1,15064,'0.99','2005-08-22 10:41:58','2006-02-15 22:18:28'),(11504,425,2,15784,'6.99','2005-08-23 13:46:00','2006-02-15 22:18:28'),(11505,425,2,16036,'2.99','2005-08-23 22:12:44','2006-02-15 22:18:28'),(11506,426,2,604,'0.99','2005-05-28 14:37:07','2006-02-15 22:18:28'),(11507,426,1,1709,'6.99','2005-06-16 14:10:15','2006-02-15 22:18:28'),(11508,426,1,1842,'7.99','2005-06-16 23:45:59','2006-02-15 22:18:28'),(11509,426,1,2204,'2.99','2005-06-18 02:11:38','2006-02-15 22:18:28'),(11510,426,1,2804,'0.99','2005-06-19 19:24:54','2006-02-15 22:18:28'),(11511,426,1,3243,'0.99','2005-06-21 03:00:11','2006-02-15 22:18:28'),(11512,426,2,4114,'2.99','2005-07-07 06:51:12','2006-02-15 22:18:28'),(11513,426,2,4398,'4.99','2005-07-07 21:18:44','2006-02-15 22:18:28'),(11514,426,1,4900,'4.99','2005-07-08 20:38:06','2006-02-15 22:18:28'),(11515,426,1,5725,'3.99','2005-07-10 11:21:21','2006-02-15 22:18:28'),(11516,426,1,7495,'4.99','2005-07-27 20:01:20','2006-02-15 22:18:28'),(11517,426,1,7527,'10.99','2005-07-27 21:14:28','2006-02-15 22:18:29'),(11518,426,1,7711,'4.99','2005-07-28 04:26:42','2006-02-15 22:18:29'),(11519,426,1,7789,'5.99','2005-07-28 07:22:07','2006-02-15 22:18:29'),(11520,426,1,9185,'5.99','2005-07-30 12:10:40','2006-02-15 22:18:29'),(11521,426,2,9247,'4.99','2005-07-30 14:13:56','2006-02-15 22:18:29'),(11522,426,2,10172,'10.99','2005-07-31 23:29:51','2006-02-15 22:18:29'),(11523,426,1,10505,'1.99','2005-08-01 11:13:59','2006-02-15 22:18:29'),(11524,426,2,11237,'0.99','2005-08-02 13:24:01','2006-02-15 22:18:29'),(11525,426,2,11876,'0.99','2005-08-17 14:18:21','2006-02-15 22:18:29'),(11526,426,2,11938,'6.99','2005-08-17 16:54:54','2006-02-15 22:18:29'),(11527,426,2,12548,'5.99','2005-08-18 14:35:26','2006-02-15 22:18:29'),(11528,426,2,12707,'4.99','2005-08-18 20:52:02','2006-02-15 22:18:29'),(11529,426,1,12822,'4.99','2005-08-19 01:15:24','2006-02-15 22:18:29'),(11530,426,2,13834,'2.99','2005-08-20 14:03:08','2006-02-15 22:18:29'),(11531,426,2,14151,'6.99','2005-08-21 02:23:25','2006-02-15 22:18:29'),(11532,426,2,14826,'2.99','2005-08-22 01:32:14','2006-02-15 22:18:29'),(11533,427,2,82,'6.99','2005-05-25 12:17:46','2006-02-15 22:18:29'),(11534,427,1,1342,'5.99','2005-06-15 12:26:21','2006-02-15 22:18:29'),(11535,427,2,1628,'3.99','2005-06-16 07:52:55','2006-02-15 22:18:30'),(11536,427,1,1648,'5.99','2005-06-16 09:17:07','2006-02-15 22:18:30'),(11537,427,1,1857,'1.99','2005-06-17 01:12:58','2006-02-15 22:18:30'),(11538,427,2,2466,'0.99','2005-06-18 20:18:42','2006-02-15 22:18:30'),(11539,427,1,4793,'3.99','2005-07-08 16:30:01','2006-02-15 22:18:30'),(11540,427,2,5476,'2.99','2005-07-09 23:37:09','2006-02-15 22:18:30'),(11541,427,2,5586,'5.99','2005-07-10 04:17:06','2006-02-15 22:18:30'),(11542,427,1,6423,'6.99','2005-07-11 23:47:31','2006-02-15 22:18:30'),(11543,427,1,6509,'2.99','2005-07-12 03:35:01','2006-02-15 22:18:30'),(11544,427,2,6938,'7.99','2005-07-26 23:16:04','2006-02-15 22:18:30'),(11545,427,2,8182,'3.99','2005-07-28 22:19:12','2006-02-15 22:18:30'),(11546,427,1,8531,'5.99','2005-07-29 10:26:15','2006-02-15 22:18:30'),(11547,427,2,8658,'5.99','2005-07-29 15:16:37','2006-02-15 22:18:30'),(11548,427,2,9978,'2.99','2005-07-31 16:59:51','2006-02-15 22:18:30'),(11549,427,1,10417,'4.99','2005-08-01 08:10:36','2006-02-15 22:18:30'),(11550,427,1,10464,'5.99','2005-08-01 09:43:14','2006-02-15 22:18:30'),(11551,427,2,10560,'4.99','2005-08-01 13:04:57','2006-02-15 22:18:30'),(11552,427,1,11024,'5.99','2005-08-02 05:38:31','2006-02-15 22:18:30'),(11553,427,1,13720,'1.99','2005-08-20 10:01:39','2006-02-15 22:18:30'),(11554,427,2,14201,'6.99','2005-08-21 03:51:34','2006-02-15 22:18:31'),(11555,427,1,14287,'3.99','2005-08-21 06:53:59','2006-02-15 22:18:31'),(11556,427,1,15330,'3.99','2005-08-22 20:35:30','2006-02-15 22:18:31'),(11557,428,2,634,'4.99','2005-05-28 17:40:35','2006-02-15 22:18:31'),(11558,428,1,1227,'3.99','2005-06-15 03:50:03','2006-02-15 22:18:31'),(11559,428,2,1471,'2.99','2005-06-15 20:53:26','2006-02-15 22:18:31'),(11560,428,1,1601,'3.99','2005-06-16 06:11:13','2006-02-15 22:18:31'),(11561,428,1,2677,'2.99','2005-06-19 12:01:59','2006-02-15 22:18:31'),(11562,428,2,3377,'0.99','2005-06-21 13:51:12','2006-02-15 22:18:31'),(11563,428,1,3702,'2.99','2005-07-06 10:13:56','2006-02-15 22:18:31'),(11564,428,1,3925,'5.99','2005-07-06 20:41:44','2006-02-15 22:18:31'),(11565,428,1,4151,'0.99','2005-07-07 08:49:02','2006-02-15 22:18:31'),(11566,428,1,5373,'4.99','2005-07-09 18:48:57','2006-02-15 22:18:31'),(11567,428,1,6735,'5.99','2005-07-12 14:08:20','2006-02-15 22:18:31'),(11568,428,1,7823,'6.99','2005-07-28 08:32:53','2006-02-15 22:18:31'),(11569,428,1,8155,'2.99','2005-07-28 20:57:06','2006-02-15 22:18:31'),(11570,428,2,8387,'4.99','2005-07-29 05:47:27','2006-02-15 22:18:31'),(11571,428,2,8528,'4.99','2005-07-29 10:24:22','2006-02-15 22:18:31'),(11572,428,1,9904,'5.99','2005-07-31 14:34:17','2006-02-15 22:18:31'),(11573,428,2,9982,'2.99','2005-07-31 17:09:02','2006-02-15 22:18:32'),(11574,428,2,10577,'4.99','2005-08-01 13:46:38','2006-02-15 22:18:32'),(11575,428,2,10888,'2.99','2005-08-02 00:52:45','2006-02-15 22:18:32'),(11576,428,2,11536,'0.99','2005-08-17 00:40:03','2006-02-15 22:18:32'),(11577,429,2,150,'5.99','2005-05-26 00:28:39','2006-02-15 22:18:32'),(11578,429,2,290,'2.99','2005-05-26 20:08:33','2006-02-15 22:18:32'),(11579,429,2,601,'7.99','2005-05-28 14:08:22','2006-02-15 22:18:32'),(11580,429,2,799,'4.99','2005-05-29 17:24:48','2006-02-15 22:18:32'),(11581,429,2,844,'4.99','2005-05-30 00:58:20','2006-02-15 22:18:32'),(11582,429,2,1781,'5.99','2005-06-16 19:20:24','2006-02-15 22:18:32'),(11583,429,2,1798,'2.99','2005-06-16 20:16:15','2006-02-15 22:18:32'),(11584,429,2,1916,'7.99','2005-06-17 05:29:59','2006-02-15 22:18:32'),(11585,429,1,3409,'2.99','2005-06-21 16:17:38','2006-02-15 22:18:32'),(11586,429,2,5868,'4.99','2005-07-10 18:39:16','2006-02-15 22:18:32'),(11587,429,2,6196,'7.99','2005-07-11 12:05:46','2006-02-15 22:18:32'),(11588,429,2,6886,'6.99','2005-07-12 20:58:04','2006-02-15 22:18:32'),(11589,429,1,6977,'6.99','2005-07-27 00:40:50','2006-02-15 22:18:32'),(11590,429,2,7352,'4.99','2005-07-27 14:38:29','2006-02-15 22:18:32'),(11591,429,2,8136,'1.99','2005-07-28 20:05:48','2006-02-15 22:18:33'),(11592,429,2,8143,'2.99','2005-07-28 20:23:11','2006-02-15 22:18:33'),(11593,429,2,8175,'7.99','2005-07-28 21:38:16','2006-02-15 22:18:33'),(11594,429,1,9849,'0.99','2005-07-31 12:44:34','2006-02-15 22:18:33'),(11595,429,1,12259,'2.99','2005-08-18 04:14:35','2006-02-15 22:18:33'),(11596,429,1,12953,'4.99','2005-08-19 06:04:07','2006-02-15 22:18:33'),(11597,429,2,14495,'4.99','2005-08-21 14:04:39','2006-02-15 22:18:33'),(11598,430,2,30,'2.99','2005-05-25 04:01:32','2006-02-15 22:18:33'),(11599,430,1,364,'4.99','2005-05-27 07:20:12','2006-02-15 22:18:33'),(11600,430,2,1207,'0.99','2005-06-15 02:27:08','2006-02-15 22:18:33'),(11601,430,1,1274,'2.99','2005-06-15 07:52:52','2006-02-15 22:18:33'),(11602,430,1,1538,'2.99','2005-06-16 01:05:50','2006-02-15 22:18:33'),(11603,430,1,1759,'6.99','2005-06-16 17:46:37','2006-02-15 22:18:33'),(11604,430,2,2892,'0.99','2005-06-20 02:06:39','2006-02-15 22:18:33'),(11605,430,2,3153,'0.99','2005-06-20 20:44:15','2006-02-15 22:18:33'),(11606,430,1,5002,'4.99','2005-07-09 01:17:08','2006-02-15 22:18:33'),(11607,430,1,5217,'5.99','2005-07-09 11:56:50','2006-02-15 22:18:33'),(11608,430,2,5879,'6.99','2005-07-10 19:12:47','2006-02-15 22:18:33'),(11609,430,1,5958,'6.99','2005-07-10 23:31:51','2006-02-15 22:18:33'),(11610,430,2,6043,'0.99','2005-07-11 03:18:10','2006-02-15 22:18:34'),(11611,430,1,8560,'4.99','2005-07-29 11:27:27','2006-02-15 22:18:34'),(11612,430,2,9450,'2.99','2005-07-30 22:04:04','2006-02-15 22:18:34'),(11613,430,1,12723,'0.99','2005-08-18 21:34:16','2006-02-15 22:18:34'),(11614,430,1,12965,'4.99','2005-08-19 06:33:00','2006-02-15 22:18:34'),(11615,430,1,13007,'0.99','2005-08-19 07:47:43','2006-02-15 22:18:34'),(11616,430,2,13452,'0.99','2005-08-20 00:20:07','2006-02-15 22:18:34'),(11617,430,2,13454,'2.99','2005-08-20 00:30:52','2006-02-15 22:18:34'),(11618,430,1,14058,'5.99','2005-08-20 22:24:35','2006-02-15 22:18:34'),(11619,430,1,15031,'4.99','2005-08-22 09:11:48','2006-02-15 22:18:34'),(11620,431,2,1126,'2.99','2005-05-31 17:27:45','2006-02-15 22:18:34'),(11621,431,2,1561,'2.99','2005-06-16 02:41:30','2006-02-15 22:18:34'),(11622,431,1,2096,'4.99','2005-06-17 18:33:04','2006-02-15 22:18:34'),(11623,431,1,2269,'3.99','2005-06-18 06:20:54','2006-02-15 22:18:34'),(11624,431,2,2281,'4.99','2005-06-18 06:47:29','2006-02-15 22:18:34'),(11625,431,2,2761,'2.99','2005-06-19 17:22:17','2006-02-15 22:18:34'),(11626,431,2,3304,'6.99','2005-06-21 07:43:40','2006-02-15 22:18:34'),(11627,431,2,3369,'8.99','2005-06-21 13:20:31','2006-02-15 22:18:34'),(11628,431,1,4144,'3.99','2005-07-07 08:25:44','2006-02-15 22:18:35'),(11629,431,1,4801,'2.99','2005-07-08 16:51:36','2006-02-15 22:18:35'),(11630,431,1,4863,'0.99','2005-07-08 19:03:15','2006-02-15 22:18:35'),(11631,431,2,7978,'4.99','2005-07-28 14:16:14','2006-02-15 22:18:35'),(11632,431,2,8810,'4.99','2005-07-29 21:45:19','2006-02-15 22:18:35'),(11633,431,2,10508,'0.99','2005-08-01 11:23:27','2006-02-15 22:18:35'),(11634,431,1,10527,'4.99','2005-08-01 11:55:54','2006-02-15 22:18:35'),(11635,431,2,10959,'6.99','2005-08-02 03:39:39','2006-02-15 22:18:35'),(11636,431,2,11538,'2.99','2005-08-17 00:44:04','2006-02-15 22:18:35'),(11637,431,1,12273,'6.99','2005-08-18 04:40:50','2006-02-15 22:18:35'),(11638,431,2,13153,'1.99','2005-08-19 13:09:47','2006-02-15 22:18:35'),(11639,431,1,13784,'4.99','2005-08-20 12:11:28','2006-02-15 22:18:35'),(11640,431,1,15809,'2.99','2005-08-23 14:42:07','2006-02-15 22:18:35'),(11641,431,1,15960,'2.99','2005-08-23 19:35:42','2006-02-15 22:18:35'),(11642,431,2,13587,'2.99','2006-02-14 15:16:03','2006-02-15 22:18:35'),(11643,432,2,326,'7.99','2005-05-27 01:10:11','2006-02-15 22:18:35'),(11644,432,1,550,'5.99','2005-05-28 07:39:16','2006-02-15 22:18:35'),(11645,432,1,897,'8.99','2005-05-30 09:10:01','2006-02-15 22:18:35'),(11646,432,2,1180,'5.99','2005-06-15 00:39:01','2006-02-15 22:18:35'),(11647,432,2,1597,'2.99','2005-06-16 05:47:03','2006-02-15 22:18:36'),(11648,432,2,3194,'4.99','2005-06-20 23:59:57','2006-02-15 22:18:36'),(11649,432,1,4965,'5.99','2005-07-08 23:46:57','2006-02-15 22:18:36'),(11650,432,1,4973,'4.99','2005-07-08 23:58:18','2006-02-15 22:18:36'),(11651,432,1,5204,'2.99','2005-07-09 10:54:14','2006-02-15 22:18:36'),(11652,432,1,5322,'6.99','2005-07-09 16:28:13','2006-02-15 22:18:36'),(11653,432,1,5944,'4.99','2005-07-10 22:51:44','2006-02-15 22:18:36'),(11654,432,1,5990,'4.99','2005-07-11 01:03:14','2006-02-15 22:18:36'),(11655,432,2,7326,'4.99','2005-07-27 13:50:40','2006-02-15 22:18:36'),(11656,432,2,7681,'0.99','2005-07-28 03:07:09','2006-02-15 22:18:36'),(11657,432,2,8079,'4.99','2005-07-28 17:58:36','2006-02-15 22:18:36'),(11658,432,2,8094,'6.99','2005-07-28 18:30:28','2006-02-15 22:18:36'),(11659,432,2,9916,'4.99','2005-07-31 14:54:52','2006-02-15 22:18:36'),(11660,432,2,9984,'2.99','2005-07-31 17:12:23','2006-02-15 22:18:36'),(11661,432,2,11870,'0.99','2005-08-17 14:11:28','2006-02-15 22:18:36'),(11662,432,1,12767,'6.99','2005-08-18 23:25:49','2006-02-15 22:18:36'),(11663,432,1,14027,'2.99','2005-08-20 21:21:34','2006-02-15 22:18:36'),(11664,432,1,15523,'4.99','2005-08-23 03:32:36','2006-02-15 22:18:36'),(11665,432,1,15713,'6.99','2005-08-23 10:56:15','2006-02-15 22:18:36'),(11666,433,2,146,'8.99','2005-05-26 00:07:11','2006-02-15 22:18:37'),(11667,433,1,691,'10.99','2005-05-29 01:01:26','2006-02-15 22:18:37'),(11668,433,2,4087,'6.99','2005-07-07 05:30:56','2006-02-15 22:18:37'),(11669,433,2,4158,'0.99','2005-07-07 09:05:42','2006-02-15 22:18:37'),(11670,433,2,4988,'7.99','2005-07-09 00:46:14','2006-02-15 22:18:37'),(11671,433,2,5457,'0.99','2005-07-09 22:33:14','2006-02-15 22:18:37'),(11672,433,1,5969,'8.99','2005-07-11 00:03:22','2006-02-15 22:18:37'),(11673,433,1,6765,'5.99','2005-07-12 15:30:47','2006-02-15 22:18:37'),(11674,433,1,6848,'0.99','2005-07-12 19:24:07','2006-02-15 22:18:37'),(11675,433,1,6850,'4.99','2005-07-12 19:30:42','2006-02-15 22:18:37'),(11676,433,1,7821,'4.99','2005-07-28 08:31:23','2006-02-15 22:18:37'),(11677,433,2,7907,'4.99','2005-07-28 11:32:00','2006-02-15 22:18:37'),(11678,433,1,8414,'5.99','2005-07-29 06:48:35','2006-02-15 22:18:37'),(11679,433,1,8713,'2.99','2005-07-29 17:31:19','2006-02-15 22:18:37'),(11680,433,2,9161,'4.99','2005-07-30 11:19:18','2006-02-15 22:18:37'),(11681,433,1,9294,'3.99','2005-07-30 16:14:37','2006-02-15 22:18:37'),(11682,433,1,10663,'4.99','2005-08-01 16:51:08','2006-02-15 22:18:37'),(11683,433,1,11664,'2.99','2005-08-17 05:35:52','2006-02-15 22:18:37'),(11684,433,2,12669,'6.99','2005-08-18 19:17:47','2006-02-15 22:18:38'),(11685,433,2,13273,'4.99','2005-08-19 17:49:13','2006-02-15 22:18:38'),(11686,433,1,13801,'4.99','2005-08-20 12:40:53','2006-02-15 22:18:38'),(11687,433,2,14523,'4.99','2005-08-21 15:03:45','2006-02-15 22:18:38'),(11688,433,1,14559,'6.99','2005-08-21 16:11:35','2006-02-15 22:18:38'),(11689,433,2,15476,'4.99','2005-08-23 01:45:07','2006-02-15 22:18:38'),(11690,433,1,15502,'5.99','2005-08-23 02:40:04','2006-02-15 22:18:38'),(11691,434,2,508,'5.99','2005-05-28 02:40:50','2006-02-15 22:18:38'),(11692,434,1,1225,'0.99','2005-06-15 03:45:35','2006-02-15 22:18:38'),(11693,434,2,1584,'5.99','2005-06-16 04:50:50','2006-02-15 22:18:38'),(11694,434,2,2415,'7.99','2005-06-18 17:02:42','2006-02-15 22:18:38'),(11695,434,1,2430,'3.99','2005-06-18 17:51:46','2006-02-15 22:18:38'),(11696,434,1,2494,'3.99','2005-06-18 22:15:09','2006-02-15 22:18:38'),(11697,434,1,3014,'2.99','2005-06-20 10:45:20','2006-02-15 22:18:38'),(11698,434,2,3037,'2.99','2005-06-20 12:28:03','2006-02-15 22:18:38'),(11699,434,1,4414,'2.99','2005-07-07 22:00:21','2006-02-15 22:18:38'),(11700,434,2,4654,'6.99','2005-07-08 09:48:03','2006-02-15 22:18:38'),(11701,434,2,4960,'10.99','2005-07-08 23:27:16','2006-02-15 22:18:38'),(11702,434,2,5464,'2.99','2005-07-09 22:58:14','2006-02-15 22:18:39'),(11703,434,2,6972,'0.99','2005-07-27 00:31:25','2006-02-15 22:18:39'),(11704,434,1,7260,'6.99','2005-07-27 11:09:28','2006-02-15 22:18:39'),(11705,434,2,7479,'2.99','2005-07-27 19:18:17','2006-02-15 22:18:39'),(11706,434,1,8205,'0.99','2005-07-28 23:18:48','2006-02-15 22:18:39'),(11707,434,1,9350,'4.99','2005-07-30 18:24:30','2006-02-15 22:18:39'),(11708,434,1,11242,'3.99','2005-08-02 13:32:00','2006-02-15 22:18:39'),(11709,434,1,11867,'2.99','2005-08-17 14:04:28','2006-02-15 22:18:39'),(11710,434,2,12030,'2.99','2005-08-17 20:10:48','2006-02-15 22:18:39'),(11711,434,2,12146,'2.99','2005-08-18 00:10:04','2006-02-15 22:18:39'),(11712,434,2,12624,'7.99','2005-08-18 17:35:00','2006-02-15 22:18:39'),(11713,434,2,13359,'9.99','2005-08-19 21:04:49','2006-02-15 22:18:39'),(11714,434,1,13383,'7.99','2005-08-19 21:38:44','2006-02-15 22:18:39'),(11715,434,2,14553,'4.99','2005-08-21 15:59:40','2006-02-15 22:18:39'),(11716,434,2,15016,'3.99','2005-08-22 08:47:35','2006-02-15 22:18:39'),(11717,434,2,15385,'4.99','2005-08-22 22:37:34','2006-02-15 22:18:39'),(11718,435,1,757,'7.99','2005-05-29 10:29:47','2006-02-15 22:18:39'),(11719,435,1,806,'4.99','2005-05-29 18:31:30','2006-02-15 22:18:39'),(11720,435,2,1443,'0.99','2005-06-15 18:57:51','2006-02-15 22:18:39'),(11721,435,1,2984,'0.99','2005-06-20 08:43:44','2006-02-15 22:18:40'),(11722,435,1,3690,'0.99','2005-07-06 09:46:03','2006-02-15 22:18:40'),(11723,435,1,3918,'8.99','2005-07-06 20:26:15','2006-02-15 22:18:40'),(11724,435,2,5220,'4.99','2005-07-09 11:59:04','2006-02-15 22:18:40'),(11725,435,2,6051,'4.99','2005-07-11 03:46:41','2006-02-15 22:18:40'),(11726,435,1,6935,'2.99','2005-07-26 23:13:10','2006-02-15 22:18:40'),(11727,435,1,8386,'5.99','2005-07-29 05:45:30','2006-02-15 22:18:40'),(11728,435,2,8891,'4.99','2005-07-30 00:46:55','2006-02-15 22:18:40'),(11729,435,2,9269,'0.99','2005-07-30 15:02:33','2006-02-15 22:18:40'),(11730,435,1,9655,'3.99','2005-07-31 05:57:54','2006-02-15 22:18:40'),(11731,435,2,9829,'4.99','2005-07-31 11:58:38','2006-02-15 22:18:40'),(11732,435,1,10998,'6.99','2005-08-02 04:50:55','2006-02-15 22:18:40'),(11733,435,1,11041,'2.99','2005-08-02 06:03:53','2006-02-15 22:18:40'),(11734,435,1,11786,'3.99','2005-08-17 10:57:40','2006-02-15 22:18:40'),(11735,435,1,11796,'0.99','2005-08-17 11:16:47','2006-02-15 22:18:40'),(11736,435,2,12046,'0.99','2005-08-17 20:47:46','2006-02-15 22:18:40'),(11737,435,1,12741,'4.99','2005-08-18 22:17:05','2006-02-15 22:18:40'),(11738,435,2,13208,'0.99','2005-08-19 15:18:55','2006-02-15 22:18:40'),(11739,435,1,14696,'4.99','2005-08-21 20:48:05','2006-02-15 22:18:41'),(11740,435,1,14765,'1.99','2005-08-21 23:40:28','2006-02-15 22:18:41'),(11741,435,1,14850,'0.99','2005-08-22 02:16:55','2006-02-15 22:18:41'),(11742,435,1,15136,'2.99','2005-08-22 13:19:25','2006-02-15 22:18:41'),(11743,436,1,45,'7.99','2005-05-25 05:59:39','2006-02-15 22:18:41'),(11744,436,1,256,'3.99','2005-05-26 15:20:58','2006-02-15 22:18:41'),(11745,436,1,848,'5.99','2005-05-30 01:19:53','2006-02-15 22:18:41'),(11746,436,1,2291,'9.99','2005-06-18 07:36:46','2006-02-15 22:18:41'),(11747,436,2,3851,'1.99','2005-07-06 16:54:12','2006-02-15 22:18:41'),(11748,436,2,3944,'2.99','2005-07-06 21:34:11','2006-02-15 22:18:41'),(11749,436,2,4643,'0.99','2005-07-08 09:13:56','2006-02-15 22:18:41'),(11750,436,2,4751,'2.99','2005-07-08 14:07:52','2006-02-15 22:18:41'),(11751,436,1,4782,'4.99','2005-07-08 16:08:51','2006-02-15 22:18:41'),(11752,436,1,5959,'0.99','2005-07-10 23:35:36','2006-02-15 22:18:41'),(11753,436,1,7593,'4.99','2005-07-27 23:28:47','2006-02-15 22:18:41'),(11754,436,2,8027,'5.99','2005-07-28 16:09:57','2006-02-15 22:18:41'),(11755,436,2,8097,'9.99','2005-07-28 18:32:49','2006-02-15 22:18:41'),(11756,436,1,9345,'9.99','2005-07-30 18:13:51','2006-02-15 22:18:41'),(11757,436,1,9539,'0.99','2005-07-31 01:36:19','2006-02-15 22:18:42'),(11758,436,1,9638,'5.99','2005-07-31 05:30:27','2006-02-15 22:18:42'),(11759,436,2,10216,'3.99','2005-08-01 01:06:27','2006-02-15 22:18:42'),(11760,436,2,11160,'0.99','2005-08-02 10:05:30','2006-02-15 22:18:42'),(11761,436,1,11580,'2.99','2005-08-17 01:59:07','2006-02-15 22:18:42'),(11762,436,2,11615,'4.99','2005-08-17 03:54:35','2006-02-15 22:18:42'),(11763,436,2,11896,'5.99','2005-08-17 15:19:54','2006-02-15 22:18:42'),(11764,436,2,12297,'0.99','2005-08-18 05:19:57','2006-02-15 22:18:42'),(11765,436,2,12429,'6.99','2005-08-18 10:26:46','2006-02-15 22:18:42'),(11766,436,2,13099,'9.99','2005-08-19 10:55:19','2006-02-15 22:18:42'),(11767,436,2,13382,'7.99','2005-08-19 21:38:41','2006-02-15 22:18:42'),(11768,436,1,13533,'3.99','2005-08-20 03:30:00','2006-02-15 22:18:42'),(11769,436,1,13760,'5.99','2005-08-20 11:26:33','2006-02-15 22:18:42'),(11770,436,1,13814,'0.99','2005-08-20 13:07:23','2006-02-15 22:18:42'),(11771,436,2,13826,'2.99','2005-08-20 13:46:38','2006-02-15 22:18:42'),(11772,436,2,15766,'4.99','2005-08-23 13:10:16','2006-02-15 22:18:42'),(11773,437,1,192,'2.99','2005-05-26 06:20:37','2006-02-15 22:18:42'),(11774,437,2,656,'4.99','2005-05-28 20:18:24','2006-02-15 22:18:42'),(11775,437,1,666,'5.99','2005-05-28 21:48:51','2006-02-15 22:18:42'),(11776,437,2,2239,'5.99','2005-06-18 04:23:54','2006-02-15 22:18:43'),(11777,437,1,2792,'2.99','2005-06-19 18:52:25','2006-02-15 22:18:43'),(11778,437,2,3265,'2.99','2005-06-21 04:23:13','2006-02-15 22:18:43'),(11779,437,1,3747,'4.99','2005-07-06 12:11:14','2006-02-15 22:18:43'),(11780,437,2,4765,'4.99','2005-07-08 15:08:45','2006-02-15 22:18:43'),(11781,437,2,5085,'4.99','2005-07-09 05:36:49','2006-02-15 22:18:43'),(11782,437,1,5167,'1.99','2005-07-09 09:18:43','2006-02-15 22:18:43'),(11783,437,2,5744,'2.99','2005-07-10 12:08:33','2006-02-15 22:18:43'),(11784,437,2,5864,'6.99','2005-07-10 18:29:57','2006-02-15 22:18:43'),(11785,437,2,8215,'2.99','2005-07-28 23:43:56','2006-02-15 22:18:43'),(11786,437,2,9172,'2.99','2005-07-30 11:36:38','2006-02-15 22:18:43'),(11787,437,2,9333,'2.99','2005-07-30 17:53:45','2006-02-15 22:18:43'),(11788,437,2,10009,'8.99','2005-07-31 18:00:28','2006-02-15 22:18:43'),(11789,437,2,10249,'0.99','2005-08-01 02:35:39','2006-02-15 22:18:43'),(11790,437,2,11417,'3.99','2005-08-02 19:44:46','2006-02-15 22:18:43'),(11791,437,1,12205,'8.99','2005-08-18 02:21:08','2006-02-15 22:18:43'),(11792,437,2,13838,'7.99','2005-08-20 14:22:46','2006-02-15 22:18:43'),(11793,437,1,13839,'2.99','2005-08-20 14:23:16','2006-02-15 22:18:43'),(11794,437,1,13905,'1.99','2005-08-20 16:12:48','2006-02-15 22:18:44'),(11795,437,1,14993,'1.99','2005-08-22 07:52:18','2006-02-15 22:18:44'),(11796,438,2,23,'4.99','2005-05-25 02:40:21','2006-02-15 22:18:44'),(11797,438,2,1036,'0.99','2005-05-31 05:21:10','2006-02-15 22:18:44'),(11798,438,1,1138,'6.99','2005-05-31 19:30:27','2006-02-15 22:18:44'),(11799,438,1,1431,'4.99','2005-06-15 18:26:29','2006-02-15 22:18:44'),(11800,438,2,1779,'0.99','2005-06-16 18:55:11','2006-02-15 22:18:44'),(11801,438,2,2206,'0.99','2005-06-18 02:14:45','2006-02-15 22:18:44'),(11802,438,1,2591,'4.99','2005-06-19 05:32:22','2006-02-15 22:18:44'),(11803,438,1,3315,'4.99','2005-06-21 08:17:04','2006-02-15 22:18:44'),(11804,438,2,3368,'0.99','2005-06-21 13:18:38','2006-02-15 22:18:44'),(11805,438,1,4355,'4.99','2005-07-07 19:21:19','2006-02-15 22:18:44'),(11806,438,2,4446,'2.99','2005-07-07 23:12:16','2006-02-15 22:18:44'),(11807,438,2,5316,'4.99','2005-07-09 16:09:42','2006-02-15 22:18:44'),(11808,438,2,5426,'4.99','2005-07-09 21:04:47','2006-02-15 22:18:44'),(11809,438,1,5870,'2.99','2005-07-10 18:40:25','2006-02-15 22:18:44'),(11810,438,2,6138,'4.99','2005-07-11 08:36:04','2006-02-15 22:18:44'),(11811,438,1,6563,'3.99','2005-07-12 05:34:09','2006-02-15 22:18:44'),(11812,438,2,6615,'4.99','2005-07-12 08:36:22','2006-02-15 22:18:45'),(11813,438,2,7357,'1.99','2005-07-27 14:48:31','2006-02-15 22:18:45'),(11814,438,2,7374,'8.99','2005-07-27 15:20:57','2006-02-15 22:18:45'),(11815,438,1,7598,'0.99','2005-07-27 23:36:01','2006-02-15 22:18:45'),(11816,438,2,8547,'2.99','2005-07-29 11:10:15','2006-02-15 22:18:45'),(11817,438,1,9082,'3.99','2005-07-30 08:11:22','2006-02-15 22:18:45'),(11818,438,2,9782,'0.99','2005-07-31 10:14:26','2006-02-15 22:18:45'),(11819,438,1,10512,'6.99','2005-08-01 11:36:19','2006-02-15 22:18:45'),(11820,438,1,10607,'4.99','2005-08-01 14:44:43','2006-02-15 22:18:45'),(11821,438,2,11644,'4.99','2005-08-17 04:49:46','2006-02-15 22:18:45'),(11822,438,2,11933,'4.99','2005-08-17 16:38:20','2006-02-15 22:18:45'),(11823,438,2,12654,'0.99','2005-08-18 18:56:40','2006-02-15 22:18:45'),(11824,438,2,13319,'7.99','2005-08-19 19:35:13','2006-02-15 22:18:45'),(11825,438,1,13414,'4.99','2005-08-19 22:47:34','2006-02-15 22:18:45'),(11826,438,2,14582,'5.99','2005-08-21 17:08:33','2006-02-15 22:18:45'),(11827,438,2,15893,'5.99','2005-08-23 17:02:00','2006-02-15 22:18:45'),(11828,438,2,12524,'0.99','2006-02-14 15:16:03','2006-02-15 22:18:45'),(11829,439,1,126,'2.99','2005-05-25 21:07:59','2006-02-15 22:18:45'),(11830,439,2,367,'0.99','2005-05-27 07:37:02','2006-02-15 22:18:46'),(11831,439,1,786,'9.99','2005-05-29 15:17:28','2006-02-15 22:18:46'),(11832,439,1,1264,'4.99','2005-06-15 06:59:39','2006-02-15 22:18:46'),(11833,439,2,1557,'0.99','2005-06-16 02:28:35','2006-02-15 22:18:46'),(11834,439,2,2097,'4.99','2005-06-17 18:40:04','2006-02-15 22:18:46'),(11835,439,1,2621,'2.99','2005-06-19 08:07:31','2006-02-15 22:18:46'),(11836,439,1,2992,'2.99','2005-06-20 09:11:51','2006-02-15 22:18:46'),(11837,439,1,3294,'6.99','2005-06-21 07:03:23','2006-02-15 22:18:46'),(11838,439,2,3774,'5.99','2005-07-06 13:25:07','2006-02-15 22:18:46'),(11839,439,1,4528,'2.99','2005-07-08 03:24:54','2006-02-15 22:18:46'),(11840,439,1,4813,'4.99','2005-07-08 17:09:56','2006-02-15 22:18:46'),(11841,439,2,5801,'5.99','2005-07-10 14:59:05','2006-02-15 22:18:46'),(11842,439,1,5893,'2.99','2005-07-10 20:05:30','2006-02-15 22:18:46'),(11843,439,1,6577,'2.99','2005-07-12 06:15:05','2006-02-15 22:18:46'),(11844,439,2,6672,'2.99','2005-07-12 11:49:16','2006-02-15 22:18:46'),(11845,439,1,8343,'2.99','2005-07-29 04:45:16','2006-02-15 22:18:46'),(11846,439,1,8624,'2.99','2005-07-29 13:55:36','2006-02-15 22:18:46'),(11847,439,2,8703,'2.99','2005-07-29 17:12:44','2006-02-15 22:18:46'),(11848,439,1,9275,'0.99','2005-07-30 15:09:15','2006-02-15 22:18:46'),(11849,439,1,9322,'6.99','2005-07-30 17:21:39','2006-02-15 22:18:47'),(11850,439,2,10744,'1.99','2005-08-01 19:56:49','2006-02-15 22:18:47'),(11851,439,1,10905,'2.99','2005-08-02 01:45:59','2006-02-15 22:18:47'),(11852,439,2,11042,'6.99','2005-08-02 06:04:33','2006-02-15 22:18:47'),(11853,439,2,11544,'5.99','2005-08-17 00:55:07','2006-02-15 22:18:47'),(11854,439,1,11989,'2.99','2005-08-17 18:23:58','2006-02-15 22:18:47'),(11855,439,1,12621,'2.99','2005-08-18 17:31:36','2006-02-15 22:18:47'),(11856,439,2,12755,'5.99','2005-08-18 22:38:47','2006-02-15 22:18:47'),(11857,439,2,12826,'3.99','2005-08-19 01:25:11','2006-02-15 22:18:47'),(11858,439,2,13358,'4.99','2005-08-19 21:04:20','2006-02-15 22:18:47'),(11859,439,2,14730,'5.99','2005-08-21 22:21:11','2006-02-15 22:18:47'),(11860,439,2,15044,'9.99','2005-08-22 09:51:54','2006-02-15 22:18:47'),(11861,439,2,15162,'4.99','2005-08-22 14:41:05','2006-02-15 22:18:47'),(11862,439,2,15653,'4.99','2005-08-23 08:34:42','2006-02-15 22:18:47'),(11863,439,1,15818,'1.99','2005-08-23 14:59:58','2006-02-15 22:18:47'),(11864,439,1,16018,'0.99','2005-08-23 21:27:35','2006-02-15 22:18:47'),(11865,440,2,957,'4.99','2005-05-30 17:53:29','2006-02-15 22:18:47'),(11866,440,1,4301,'2.99','2005-07-07 16:37:23','2006-02-15 22:18:47'),(11867,440,1,4946,'7.99','2005-07-08 22:46:23','2006-02-15 22:18:48'),(11868,440,2,5423,'2.99','2005-07-09 20:56:48','2006-02-15 22:18:48'),(11869,440,2,5594,'0.99','2005-07-10 04:33:36','2006-02-15 22:18:48'),(11870,440,2,5731,'2.99','2005-07-10 11:31:52','2006-02-15 22:18:48'),(11871,440,2,5782,'0.99','2005-07-10 13:52:56','2006-02-15 22:18:48'),(11872,440,2,7585,'4.99','2005-07-27 23:18:22','2006-02-15 22:18:48'),(11873,440,1,7614,'0.99','2005-07-28 00:14:38','2006-02-15 22:18:48'),(11874,440,1,7806,'9.99','2005-07-28 07:58:17','2006-02-15 22:18:48'),(11875,440,1,9001,'4.99','2005-07-30 04:59:41','2006-02-15 22:18:48'),(11876,440,1,9195,'2.99','2005-07-30 12:29:43','2006-02-15 22:18:48'),(11877,440,1,9547,'4.99','2005-07-31 01:52:34','2006-02-15 22:18:48'),(11878,440,2,12403,'6.99','2005-08-18 09:31:05','2006-02-15 22:18:48'),(11879,440,1,12850,'0.99','2005-08-19 02:08:06','2006-02-15 22:18:48'),(11880,440,2,13384,'4.99','2005-08-19 21:38:51','2006-02-15 22:18:48'),(11881,440,2,13779,'2.99','2005-08-20 12:03:54','2006-02-15 22:18:48'),(11882,440,1,14555,'0.99','2005-08-21 16:03:02','2006-02-15 22:18:48'),(11883,440,2,14863,'7.99','2005-08-22 02:57:04','2006-02-15 22:18:48'),(11884,440,2,15264,'0.99','2005-08-22 18:27:38','2006-02-15 22:18:48'),(11885,440,1,15925,'4.99','2005-08-23 18:15:06','2006-02-15 22:18:49'),(11886,440,1,13106,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:49'),(11887,441,1,823,'4.99','2005-05-29 21:39:37','2006-02-15 22:18:49'),(11888,441,1,1602,'4.99','2005-06-16 06:12:40','2006-02-15 22:18:49'),(11889,441,2,2328,'4.99','2005-06-18 10:17:21','2006-02-15 22:18:49'),(11890,441,2,3629,'0.99','2005-07-06 06:23:22','2006-02-15 22:18:49'),(11891,441,2,3695,'2.99','2005-07-06 10:02:08','2006-02-15 22:18:49'),(11892,441,1,4084,'8.99','2005-07-07 05:16:00','2006-02-15 22:18:49'),(11893,441,2,4208,'0.99','2005-07-07 11:34:22','2006-02-15 22:18:49'),(11894,441,2,5129,'2.99','2005-07-09 07:28:33','2006-02-15 22:18:49'),(11895,441,1,5811,'0.99','2005-07-10 15:27:04','2006-02-15 22:18:49'),(11896,441,2,6636,'2.99','2005-07-12 09:49:46','2006-02-15 22:18:49'),(11897,441,1,6642,'4.99','2005-07-12 10:37:52','2006-02-15 22:18:49'),(11898,441,1,6941,'5.99','2005-07-26 23:18:49','2006-02-15 22:18:49'),(11899,441,2,8237,'2.99','2005-07-29 00:29:56','2006-02-15 22:18:49'),(11900,441,1,8281,'0.99','2005-07-29 01:46:00','2006-02-15 22:18:49'),(11901,441,1,8427,'4.99','2005-07-29 07:08:36','2006-02-15 22:18:49'),(11902,441,1,8575,'4.99','2005-07-29 11:52:47','2006-02-15 22:18:49'),(11903,441,2,8617,'4.99','2005-07-29 13:46:14','2006-02-15 22:18:49'),(11904,441,2,9644,'10.99','2005-07-31 05:40:35','2006-02-15 22:18:50'),(11905,441,2,9854,'2.99','2005-07-31 12:59:34','2006-02-15 22:18:50'),(11906,441,2,10139,'1.99','2005-07-31 22:02:20','2006-02-15 22:18:50'),(11907,441,1,10846,'1.99','2005-08-01 23:47:54','2006-02-15 22:18:50'),(11908,441,2,11247,'1.99','2005-08-02 13:34:08','2006-02-15 22:18:50'),(11909,441,2,13483,'2.99','2005-08-20 01:16:38','2006-02-15 22:18:50'),(11910,441,2,13739,'4.99','2005-08-20 10:45:10','2006-02-15 22:18:50'),(11911,441,1,13932,'4.99','2005-08-20 17:17:00','2006-02-15 22:18:50'),(11912,441,2,14796,'4.99','2005-08-22 00:40:49','2006-02-15 22:18:50'),(11913,441,2,15070,'3.99','2005-08-22 10:55:45','2006-02-15 22:18:50'),(11914,441,1,14878,'4.99','2006-02-14 15:16:03','2006-02-15 22:18:50'),(11915,442,2,466,'0.99','2005-05-27 20:57:07','2006-02-15 22:18:50'),(11916,442,2,558,'6.99','2005-05-28 08:38:43','2006-02-15 22:18:50'),(11917,442,1,632,'5.99','2005-05-28 17:37:50','2006-02-15 22:18:50'),(11918,442,1,1251,'5.99','2005-06-15 05:58:55','2006-02-15 22:18:50'),(11919,442,2,1358,'0.99','2005-06-15 13:28:48','2006-02-15 22:18:50'),(11920,442,2,1576,'8.99','2005-06-16 03:54:39','2006-02-15 22:18:50'),(11921,442,1,1774,'2.99','2005-06-16 18:27:52','2006-02-15 22:18:51'),(11922,442,2,3545,'4.99','2005-07-06 02:16:17','2006-02-15 22:18:51'),(11923,442,1,3661,'2.99','2005-07-06 08:10:02','2006-02-15 22:18:51'),(11924,442,1,4052,'5.99','2005-07-07 03:38:22','2006-02-15 22:18:51'),(11925,442,1,4058,'2.99','2005-07-07 04:02:50','2006-02-15 22:18:51'),(11926,442,2,4365,'2.99','2005-07-07 19:47:46','2006-02-15 22:18:51'),(11927,442,2,4577,'3.99','2005-07-08 05:59:00','2006-02-15 22:18:51'),(11928,442,2,6590,'4.99','2005-07-12 07:08:21','2006-02-15 22:18:51'),(11929,442,2,6632,'2.99','2005-07-12 09:33:10','2006-02-15 22:18:51'),(11930,442,2,7427,'2.99','2005-07-27 17:20:16','2006-02-15 22:18:51'),(11931,442,1,7460,'0.99','2005-07-27 18:41:35','2006-02-15 22:18:51'),(11932,442,1,7671,'2.99','2005-07-28 02:48:31','2006-02-15 22:18:51'),(11933,442,1,8044,'2.99','2005-07-28 16:49:12','2006-02-15 22:18:51'),(11934,442,1,8758,'4.99','2005-07-29 19:20:49','2006-02-15 22:18:51'),(11935,442,1,9180,'4.99','2005-07-30 12:03:15','2006-02-15 22:18:51'),(11936,442,2,9873,'5.99','2005-07-31 13:32:18','2006-02-15 22:18:51'),(11937,442,1,10034,'2.99','2005-07-31 18:45:30','2006-02-15 22:18:51'),(11938,442,2,10365,'6.99','2005-08-01 06:08:44','2006-02-15 22:18:51'),(11939,442,2,10452,'0.99','2005-08-01 09:11:36','2006-02-15 22:18:51'),(11940,442,1,12948,'0.99','2005-08-19 05:55:14','2006-02-15 22:18:52'),(11941,442,2,13004,'0.99','2005-08-19 07:40:08','2006-02-15 22:18:52'),(11942,442,1,13155,'7.99','2005-08-19 13:10:23','2006-02-15 22:18:52'),(11943,442,2,14199,'0.99','2005-08-21 03:48:43','2006-02-15 22:18:52'),(11944,442,1,14418,'1.99','2005-08-21 11:14:26','2006-02-15 22:18:52'),(11945,442,1,14466,'0.99','2005-08-21 13:03:13','2006-02-15 22:18:52'),(11946,442,2,15207,'2.99','2005-08-22 16:35:25','2006-02-15 22:18:52'),(11947,443,2,1068,'4.99','2005-05-31 09:32:15','2006-02-15 22:18:52'),(11948,443,1,2871,'2.99','2005-06-20 00:27:49','2006-02-15 22:18:52'),(11949,443,2,3510,'5.99','2005-07-06 00:27:41','2006-02-15 22:18:52'),(11950,443,2,6625,'5.99','2005-07-12 09:06:40','2006-02-15 22:18:52'),(11951,443,1,6913,'4.99','2005-07-12 22:18:12','2006-02-15 22:18:52'),(11952,443,2,6983,'2.99','2005-07-27 00:55:03','2006-02-15 22:18:52'),(11953,443,1,7317,'2.99','2005-07-27 13:19:41','2006-02-15 22:18:52'),(11954,443,1,7667,'8.99','2005-07-28 02:37:22','2006-02-15 22:18:52'),(11955,443,1,7987,'9.99','2005-07-28 14:36:52','2006-02-15 22:18:52'),(11956,443,2,9740,'1.99','2005-07-31 09:08:03','2006-02-15 22:18:52'),(11957,443,1,10014,'4.99','2005-07-31 18:10:56','2006-02-15 22:18:52'),(11958,443,2,10081,'5.99','2005-07-31 20:07:44','2006-02-15 22:18:53'),(11959,443,2,10360,'0.99','2005-08-01 05:52:53','2006-02-15 22:18:53'),(11960,443,1,11449,'4.99','2005-08-02 20:44:43','2006-02-15 22:18:53'),(11961,443,1,12415,'4.99','2005-08-18 09:54:01','2006-02-15 22:18:53'),(11962,443,2,12857,'4.99','2005-08-19 02:20:13','2006-02-15 22:18:53'),(11963,443,1,13489,'2.99','2005-08-20 01:29:06','2006-02-15 22:18:53'),(11964,443,1,14561,'2.99','2005-08-21 16:20:43','2006-02-15 22:18:53'),(11965,443,2,14611,'6.99','2005-08-21 18:01:41','2006-02-15 22:18:53'),(11966,443,1,15182,'0.99','2005-08-22 15:47:05','2006-02-15 22:18:53'),(11967,443,2,15393,'4.99','2005-08-22 23:04:09','2006-02-15 22:18:53'),(11968,443,1,15519,'0.99','2005-08-23 03:23:32','2006-02-15 22:18:53'),(11969,444,1,201,'8.99','2005-05-26 07:13:45','2006-02-15 22:18:53'),(11970,444,1,557,'0.99','2005-05-28 08:36:22','2006-02-15 22:18:53'),(11971,444,1,1239,'0.99','2005-06-15 04:53:01','2006-02-15 22:18:53'),(11972,444,2,1397,'3.99','2005-06-15 16:25:26','2006-02-15 22:18:53'),(11973,444,2,1441,'1.99','2005-06-15 18:54:21','2006-02-15 22:18:53'),(11974,444,1,2551,'4.99','2005-06-19 02:51:04','2006-02-15 22:18:53'),(11975,444,2,3301,'7.99','2005-06-21 07:32:25','2006-02-15 22:18:53'),(11976,444,2,3415,'5.99','2005-06-21 16:59:49','2006-02-15 22:18:54'),(11977,444,2,3498,'4.99','2005-07-06 00:02:08','2006-02-15 22:18:54'),(11978,444,1,3539,'0.99','2005-07-06 01:39:08','2006-02-15 22:18:54'),(11979,444,2,4648,'6.99','2005-07-08 09:31:27','2006-02-15 22:18:54'),(11980,444,1,5753,'2.99','2005-07-10 12:29:43','2006-02-15 22:18:54'),(11981,444,2,5825,'2.99','2005-07-10 16:20:30','2006-02-15 22:18:54'),(11982,444,2,6285,'2.99','2005-07-11 16:52:07','2006-02-15 22:18:54'),(11983,444,2,7679,'3.99','2005-07-28 02:58:39','2006-02-15 22:18:54'),(11984,444,2,9634,'1.99','2005-07-31 05:06:02','2006-02-15 22:18:54'),(11985,444,1,10529,'4.99','2005-08-01 12:00:02','2006-02-15 22:18:54'),(11986,444,1,10693,'4.99','2005-08-01 18:14:14','2006-02-15 22:18:54'),(11987,444,2,11353,'0.99','2005-08-02 17:34:45','2006-02-15 22:18:54'),(11988,444,2,11419,'6.99','2005-08-02 19:46:38','2006-02-15 22:18:54'),(11989,444,1,11728,'4.99','2005-08-17 08:12:26','2006-02-15 22:18:54'),(11990,444,1,12161,'6.99','2005-08-18 00:41:46','2006-02-15 22:18:54'),(11991,444,2,12712,'2.99','2005-08-18 21:04:13','2006-02-15 22:18:54'),(11992,444,2,12946,'2.99','2005-08-19 05:53:34','2006-02-15 22:18:54'),(11993,444,1,13488,'0.99','2005-08-20 01:28:42','2006-02-15 22:18:54'),(11994,444,2,13559,'2.99','2005-08-20 04:16:07','2006-02-15 22:18:55'),(11995,444,1,13924,'0.99','2005-08-20 17:05:18','2006-02-15 22:18:55'),(11996,444,1,15249,'4.99','2005-08-22 17:58:27','2006-02-15 22:18:55'),(11997,444,1,15557,'0.99','2005-08-23 04:52:17','2006-02-15 22:18:55'),(11998,444,2,15815,'4.99','2005-08-23 14:55:47','2006-02-15 22:18:55'),(11999,445,1,481,'2.99','2005-05-27 22:49:27','2006-02-15 22:18:55'),(12000,445,1,960,'2.99','2005-05-30 18:13:23','2006-02-15 22:18:55'),(12001,445,1,4041,'0.99','2005-07-07 03:03:33','2006-02-15 22:18:55'),(12002,445,1,4193,'0.99','2005-07-07 10:57:21','2006-02-15 22:18:55'),(12003,445,2,5225,'2.99','2005-07-09 12:10:16','2006-02-15 22:18:55'),(12004,445,1,6346,'0.99','2005-07-11 20:08:34','2006-02-15 22:18:55'),(12005,445,2,7351,'2.99','2005-07-27 14:37:36','2006-02-15 22:18:55'),(12006,445,2,7971,'4.99','2005-07-28 14:00:47','2006-02-15 22:18:55'),(12007,445,1,8851,'8.99','2005-07-29 23:26:19','2006-02-15 22:18:55'),(12008,445,2,8911,'0.99','2005-07-30 01:30:57','2006-02-15 22:18:55'),(12009,445,2,9625,'4.99','2005-07-31 04:30:48','2006-02-15 22:18:55'),(12010,445,1,10007,'0.99','2005-07-31 17:54:58','2006-02-15 22:18:55'),(12011,445,2,10334,'1.99','2005-08-01 04:58:42','2006-02-15 22:18:56'),(12012,445,2,10341,'0.99','2005-08-01 05:10:02','2006-02-15 22:18:56'),(12013,445,2,10936,'9.99','2005-08-02 02:55:04','2006-02-15 22:18:56'),(12014,445,1,11383,'7.99','2005-08-02 18:22:05','2006-02-15 22:18:56'),(12015,445,1,11868,'4.99','2005-08-17 14:05:34','2006-02-15 22:18:56'),(12016,445,1,11877,'3.99','2005-08-17 14:21:11','2006-02-15 22:18:56'),(12017,445,2,13586,'0.99','2005-08-20 05:40:33','2006-02-15 22:18:56'),(12018,445,1,14612,'6.99','2005-08-21 18:03:15','2006-02-15 22:18:56'),(12019,445,2,14673,'2.99','2005-08-21 20:01:18','2006-02-15 22:18:56'),(12020,445,1,14866,'6.99','2005-08-22 03:11:35','2006-02-15 22:18:56'),(12021,445,1,14955,'4.99','2005-08-22 06:25:52','2006-02-15 22:18:56'),(12022,445,1,15123,'3.99','2005-08-22 12:48:44','2006-02-15 22:18:56'),(12023,445,1,15791,'6.99','2005-08-23 14:02:13','2006-02-15 22:18:56'),(12024,445,2,15906,'2.99','2005-08-23 17:36:00','2006-02-15 22:18:56'),(12025,446,2,14,'0.99','2005-05-25 00:31:15','2006-02-15 22:18:56'),(12026,446,1,236,'0.99','2005-05-26 11:53:49','2006-02-15 22:18:56'),(12027,446,1,355,'4.99','2005-05-27 06:15:33','2006-02-15 22:18:56'),(12028,446,1,2248,'4.99','2005-06-18 04:59:48','2006-02-15 22:18:56'),(12029,446,2,2335,'3.99','2005-06-18 10:59:36','2006-02-15 22:18:57'),(12030,446,2,2520,'6.99','2005-06-19 00:29:00','2006-02-15 22:18:57'),(12031,446,2,2710,'0.99','2005-06-19 14:03:56','2006-02-15 22:18:57'),(12032,446,1,3060,'2.99','2005-06-20 13:47:20','2006-02-15 22:18:57'),(12033,446,2,3168,'0.99','2005-06-20 21:46:01','2006-02-15 22:18:57'),(12034,446,2,4358,'4.99','2005-07-07 19:27:04','2006-02-15 22:18:57'),(12035,446,2,5393,'4.99','2005-07-09 19:35:12','2006-02-15 22:18:57'),(12036,446,2,5409,'2.99','2005-07-09 20:17:19','2006-02-15 22:18:57'),(12037,446,2,6454,'0.99','2005-07-12 01:00:12','2006-02-15 22:18:57'),(12038,446,1,6510,'4.99','2005-07-12 03:35:39','2006-02-15 22:18:57'),(12039,446,1,6535,'0.99','2005-07-12 04:43:43','2006-02-15 22:18:57'),(12040,446,1,6734,'6.99','2005-07-12 14:04:24','2006-02-15 22:18:57'),(12041,446,1,7005,'5.99','2005-07-27 01:38:36','2006-02-15 22:18:57'),(12042,446,2,7089,'0.99','2005-07-27 04:43:42','2006-02-15 22:18:57'),(12043,446,1,7576,'4.99','2005-07-27 22:54:35','2006-02-15 22:18:57'),(12044,446,2,8284,'6.99','2005-07-29 01:56:40','2006-02-15 22:18:57'),(12045,446,1,8309,'4.99','2005-07-29 03:22:20','2006-02-15 22:18:57'),(12046,446,2,8670,'4.99','2005-07-29 15:49:03','2006-02-15 22:18:57'),(12047,446,2,8691,'0.99','2005-07-29 16:41:23','2006-02-15 22:18:58'),(12048,446,2,8922,'9.99','2005-07-30 02:08:25','2006-02-15 22:18:58'),(12049,446,1,8923,'3.99','2005-07-30 02:08:49','2006-02-15 22:18:58'),(12050,446,1,9116,'0.99','2005-07-30 09:19:41','2006-02-15 22:18:58'),(12051,446,1,11051,'3.99','2005-08-02 06:23:39','2006-02-15 22:18:58'),(12052,446,2,12253,'0.99','2005-08-18 04:00:50','2006-02-15 22:18:58'),(12053,446,2,12480,'8.99','2005-08-18 12:26:43','2006-02-15 22:18:58'),(12054,446,1,15808,'1.99','2005-08-23 14:38:37','2006-02-15 22:18:58'),(12055,446,2,15951,'0.99','2005-08-23 19:10:32','2006-02-15 22:18:58'),(12056,447,1,461,'2.99','2005-05-27 20:08:55','2006-02-15 22:18:58'),(12057,447,2,732,'0.99','2005-05-29 07:32:51','2006-02-15 22:18:58'),(12058,447,2,1230,'0.99','2005-06-15 04:04:09','2006-02-15 22:18:58'),(12059,447,2,1890,'2.99','2005-06-17 04:06:13','2006-02-15 22:18:58'),(12060,447,1,2025,'4.99','2005-06-17 13:04:00','2006-02-15 22:18:58'),(12061,447,2,2285,'4.99','2005-06-18 07:00:54','2006-02-15 22:18:58'),(12062,447,2,4403,'4.99','2005-07-07 21:29:40','2006-02-15 22:18:58'),(12063,447,1,4858,'6.99','2005-07-08 18:53:24','2006-02-15 22:18:58'),(12064,447,1,5331,'4.99','2005-07-09 16:54:06','2006-02-15 22:18:58'),(12065,447,1,5734,'0.99','2005-07-10 11:37:28','2006-02-15 22:18:59'),(12066,447,2,5987,'2.99','2005-07-11 00:55:31','2006-02-15 22:18:59'),(12067,447,1,6651,'0.99','2005-07-12 10:57:28','2006-02-15 22:18:59'),(12068,447,1,6690,'1.99','2005-07-12 12:23:02','2006-02-15 22:18:59'),(12069,447,1,8537,'8.99','2005-07-29 10:44:54','2006-02-15 22:18:59'),(12070,447,2,8945,'4.99','2005-07-30 03:11:48','2006-02-15 22:18:59'),(12071,447,2,9076,'5.99','2005-07-30 07:58:12','2006-02-15 22:18:59'),(12072,447,1,9288,'6.99','2005-07-30 15:56:39','2006-02-15 22:18:59'),(12073,447,1,10425,'2.99','2005-08-01 08:23:25','2006-02-15 22:18:59'),(12074,447,2,10957,'5.99','2005-08-02 03:33:30','2006-02-15 22:18:59'),(12075,447,2,11108,'0.99','2005-08-02 08:20:01','2006-02-15 22:18:59'),(12076,447,1,11465,'5.99','2005-08-02 21:43:52','2006-02-15 22:18:59'),(12077,447,2,12511,'0.99','2005-08-18 13:23:19','2006-02-15 22:18:59'),(12078,447,1,13072,'2.99','2005-08-19 10:03:30','2006-02-15 22:18:59'),(12079,447,2,13110,'0.99','2005-08-19 11:24:37','2006-02-15 22:18:59'),(12080,447,1,13848,'4.99','2005-08-20 14:37:49','2006-02-15 22:18:59'),(12081,447,2,14443,'5.99','2005-08-21 12:06:32','2006-02-15 22:18:59'),(12082,447,1,15108,'2.99','2005-08-22 12:10:07','2006-02-15 22:18:59'),(12083,447,1,15997,'4.99','2005-08-23 20:40:31','2006-02-15 22:19:00'),(12084,447,2,16032,'4.99','2005-08-23 21:59:57','2006-02-15 22:19:00'),(12085,448,1,299,'4.99','2005-05-26 20:55:36','2006-02-15 22:19:00'),(12086,448,2,1123,'2.99','2005-05-31 16:48:43','2006-02-15 22:19:00'),(12087,448,1,1313,'5.99','2005-06-15 10:18:34','2006-02-15 22:19:00'),(12088,448,2,1823,'7.99','2005-06-16 21:48:16','2006-02-15 22:19:00'),(12089,448,2,2697,'0.99','2005-06-19 13:29:08','2006-02-15 22:19:00'),(12090,448,2,3225,'3.99','2005-06-21 02:16:55','2006-02-15 22:19:00'),(12091,448,2,3347,'5.99','2005-06-21 11:08:32','2006-02-15 22:19:00'),(12092,448,2,3959,'5.99','2005-07-06 22:07:58','2006-02-15 22:19:00'),(12093,448,2,3992,'6.99','2005-07-06 23:36:56','2006-02-15 22:19:00'),(12094,448,2,4024,'0.99','2005-07-07 02:11:23','2006-02-15 22:19:00'),(12095,448,2,4206,'2.99','2005-07-07 11:32:16','2006-02-15 22:19:00'),(12096,448,1,4406,'1.99','2005-07-07 21:35:16','2006-02-15 22:19:00'),(12097,448,2,4537,'2.99','2005-07-08 03:48:40','2006-02-15 22:19:00'),(12098,448,2,4558,'2.99','2005-07-08 04:55:26','2006-02-15 22:19:00'),(12099,448,2,6341,'2.99','2005-07-11 19:48:02','2006-02-15 22:19:00'),(12100,448,2,6985,'4.99','2005-07-27 00:57:42','2006-02-15 22:19:00'),(12101,448,1,9178,'10.99','2005-07-30 11:58:50','2006-02-15 22:19:01'),(12102,448,2,11608,'8.99','2005-08-17 03:36:52','2006-02-15 22:19:01'),(12103,448,1,11798,'9.99','2005-08-17 11:21:43','2006-02-15 22:19:01'),(12104,448,1,12446,'2.99','2005-08-18 10:56:29','2006-02-15 22:19:01'),(12105,448,1,13220,'2.99','2005-08-19 15:42:32','2006-02-15 22:19:01'),(12106,448,2,13250,'3.99','2005-08-19 16:47:55','2006-02-15 22:19:01'),(12107,448,1,13982,'3.99','2005-08-20 19:08:25','2006-02-15 22:19:01'),(12108,448,1,14580,'3.99','2005-08-21 16:56:39','2006-02-15 22:19:01'),(12109,448,1,14711,'2.99','2005-08-21 21:22:07','2006-02-15 22:19:01'),(12110,448,2,15358,'9.99','2005-08-22 21:29:14','2006-02-15 22:19:01'),(12111,448,1,15427,'4.99','2005-08-23 00:07:53','2006-02-15 22:19:01'),(12112,448,2,14734,'3.98','2006-02-14 15:16:03','2006-02-15 22:19:01'),(12113,448,1,13577,'0.00','2006-02-14 15:16:03','2006-02-15 22:19:01'),(12114,449,2,263,'4.99','2005-05-26 15:47:40','2006-02-15 22:19:01'),(12115,449,2,325,'5.99','2005-05-27 01:09:55','2006-02-15 22:19:01'),(12116,449,1,849,'7.99','2005-05-30 01:23:07','2006-02-15 22:19:01'),(12117,449,2,1295,'4.99','2005-06-15 09:17:20','2006-02-15 22:19:01'),(12118,449,1,2348,'0.99','2005-06-18 12:15:43','2006-02-15 22:19:01'),(12119,449,2,2970,'2.99','2005-06-20 07:51:51','2006-02-15 22:19:02'),(12120,449,1,3503,'0.99','2005-07-06 00:17:24','2006-02-15 22:19:02'),(12121,449,1,3977,'8.99','2005-07-06 23:00:49','2006-02-15 22:19:02'),(12122,449,2,4433,'3.99','2005-07-07 22:45:41','2006-02-15 22:19:02'),(12123,449,1,5824,'2.99','2005-07-10 16:19:53','2006-02-15 22:19:02'),(12124,449,2,7755,'6.99','2005-07-28 06:22:18','2006-02-15 22:19:02'),(12125,449,2,7803,'3.99','2005-07-28 07:52:13','2006-02-15 22:19:02'),(12126,449,2,8002,'2.99','2005-07-28 15:11:00','2006-02-15 22:19:02'),(12127,449,2,10083,'5.99','2005-07-31 20:10:19','2006-02-15 22:19:02'),(12128,449,2,10409,'2.99','2005-08-01 07:49:15','2006-02-15 22:19:02'),(12129,449,1,10416,'4.99','2005-08-01 08:08:39','2006-02-15 22:19:02'),(12130,449,1,10516,'6.99','2005-08-01 11:41:55','2006-02-15 22:19:02'),(12131,449,2,10688,'6.99','2005-08-01 17:53:43','2006-02-15 22:19:02'),(12132,449,1,12212,'4.99','2005-08-18 02:33:29','2006-02-15 22:19:02'),(12133,449,2,14962,'7.99','2005-08-22 06:37:43','2006-02-15 22:19:02'),(12134,450,2,548,'3.99','2005-05-28 07:34:56','2006-02-15 22:19:02'),(12135,450,2,1639,'4.99','2005-06-16 08:33:39','2006-02-15 22:19:02'),(12136,450,1,1739,'0.99','2005-06-16 16:09:38','2006-02-15 22:19:02'),(12137,450,2,1914,'2.99','2005-06-17 05:25:54','2006-02-15 22:19:03'),(12138,450,2,2278,'0.99','2005-06-18 06:37:57','2006-02-15 22:19:03'),(12139,450,1,2501,'4.99','2005-06-18 23:10:11','2006-02-15 22:19:03'),(12140,450,1,2626,'2.99','2005-06-19 08:28:44','2006-02-15 22:19:03'),(12141,450,1,3155,'4.99','2005-06-20 21:02:38','2006-02-15 22:19:03'),(12142,450,1,3570,'3.99','2005-07-06 03:23:43','2006-02-15 22:19:03'),(12143,450,1,5999,'7.99','2005-07-11 01:21:22','2006-02-15 22:19:03'),(12144,450,1,6028,'4.99','2005-07-11 02:31:44','2006-02-15 22:19:03'),(12145,450,2,7365,'2.99','2005-07-27 15:00:20','2006-02-15 22:19:03'),(12146,450,1,7610,'0.99','2005-07-28 00:11:35','2006-02-15 22:19:03'),(12147,450,1,7626,'0.99','2005-07-28 00:49:01','2006-02-15 22:19:03'),(12148,450,2,8733,'4.99','2005-07-29 18:26:34','2006-02-15 22:19:03'),(12149,450,2,10432,'2.99','2005-08-01 08:43:21','2006-02-15 22:19:03'),(12150,450,1,10984,'3.99','2005-08-02 04:30:02','2006-02-15 22:19:03'),(12151,450,2,12812,'0.99','2005-08-19 00:54:02','2006-02-15 22:19:03'),(12152,450,2,13731,'4.99','2005-08-20 10:22:08','2006-02-15 22:19:03'),(12153,450,1,13810,'0.99','2005-08-20 12:59:38','2006-02-15 22:19:03'),(12154,450,1,13828,'4.99','2005-08-20 13:49:52','2006-02-15 22:19:03'),(12155,450,1,14282,'4.99','2005-08-21 06:41:29','2006-02-15 22:19:04'),(12156,450,2,15019,'0.99','2005-08-22 08:52:53','2006-02-15 22:19:04'),(12157,450,1,15327,'4.99','2005-08-22 20:31:24','2006-02-15 22:19:04'),(12158,450,2,15419,'4.99','2005-08-22 23:54:36','2006-02-15 22:19:04'),(12159,450,1,14172,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:04'),(12160,451,2,77,'0.99','2005-05-25 11:31:59','2006-02-15 22:19:04'),(12161,451,2,328,'2.99','2005-05-27 01:29:31','2006-02-15 22:19:04'),(12162,451,2,1113,'2.99','2005-05-31 15:58:44','2006-02-15 22:19:04'),(12163,451,1,1202,'0.99','2005-06-15 02:08:04','2006-02-15 22:19:04'),(12164,451,1,1851,'0.99','2005-06-17 00:32:26','2006-02-15 22:19:04'),(12165,451,1,1940,'6.99','2005-06-17 07:42:22','2006-02-15 22:19:04'),(12166,451,1,2671,'1.99','2005-06-19 11:33:11','2006-02-15 22:19:04'),(12167,451,1,2909,'3.99','2005-06-20 03:19:10','2006-02-15 22:19:04'),(12168,451,2,2917,'0.99','2005-06-20 04:08:35','2006-02-15 22:19:04'),(12169,451,1,3316,'6.99','2005-06-21 08:20:18','2006-02-15 22:19:04'),(12170,451,2,3826,'4.99','2005-07-06 15:51:58','2006-02-15 22:19:04'),(12171,451,1,4538,'2.99','2005-07-08 03:56:29','2006-02-15 22:19:04'),(12172,451,1,4794,'8.99','2005-07-08 16:30:11','2006-02-15 22:19:04'),(12173,451,2,4930,'4.99','2005-07-08 22:15:48','2006-02-15 22:19:05'),(12174,451,1,5005,'3.99','2005-07-09 01:21:44','2006-02-15 22:19:05'),(12175,451,2,5518,'8.99','2005-07-10 01:15:11','2006-02-15 22:19:05'),(12176,451,1,7018,'2.99','2005-07-27 02:20:22','2006-02-15 22:19:05'),(12177,451,2,10337,'8.99','2005-08-01 05:01:46','2006-02-15 22:19:05'),(12178,451,1,10856,'2.99','2005-08-02 00:07:14','2006-02-15 22:19:05'),(12179,451,2,10950,'2.99','2005-08-02 03:25:08','2006-02-15 22:19:05'),(12180,451,2,11167,'6.99','2005-08-02 10:15:51','2006-02-15 22:19:05'),(12181,451,2,11381,'6.99','2005-08-02 18:19:29','2006-02-15 22:19:05'),(12182,451,1,11790,'2.99','2005-08-17 11:00:08','2006-02-15 22:19:05'),(12183,451,2,12371,'2.99','2005-08-18 08:02:46','2006-02-15 22:19:05'),(12184,451,1,12422,'4.99','2005-08-18 10:13:12','2006-02-15 22:19:05'),(12185,451,2,13003,'1.99','2005-08-19 07:39:29','2006-02-15 22:19:05'),(12186,451,2,13100,'2.99','2005-08-19 10:55:45','2006-02-15 22:19:05'),(12187,451,2,13252,'2.99','2005-08-19 16:50:50','2006-02-15 22:19:05'),(12188,451,2,13380,'0.99','2005-08-19 21:36:58','2006-02-15 22:19:05'),(12189,451,1,13666,'2.99','2005-08-20 08:20:19','2006-02-15 22:19:05'),(12190,451,1,13705,'2.99','2005-08-20 09:32:23','2006-02-15 22:19:06'),(12191,451,2,14500,'0.99','2005-08-21 14:11:30','2006-02-15 22:19:06'),(12192,451,1,15651,'4.99','2005-08-23 08:31:49','2006-02-15 22:19:06'),(12193,452,1,354,'2.99','2005-05-27 06:12:26','2006-02-15 22:19:06'),(12194,452,2,714,'2.99','2005-05-29 04:15:21','2006-02-15 22:19:06'),(12195,452,1,726,'1.99','2005-05-29 06:05:29','2006-02-15 22:19:06'),(12196,452,2,1203,'4.99','2005-06-15 02:09:02','2006-02-15 22:19:06'),(12197,452,1,1512,'5.99','2005-06-15 22:53:03','2006-02-15 22:19:06'),(12198,452,1,1794,'3.99','2005-06-16 20:08:37','2006-02-15 22:19:06'),(12199,452,1,2263,'0.99','2005-06-18 05:57:47','2006-02-15 22:19:06'),(12200,452,2,2266,'4.99','2005-06-18 06:05:02','2006-02-15 22:19:06'),(12201,452,1,2504,'0.99','2005-06-18 23:19:53','2006-02-15 22:19:06'),(12202,452,2,2661,'0.99','2005-06-19 10:50:52','2006-02-15 22:19:06'),(12203,452,2,3638,'3.99','2005-07-06 07:08:17','2006-02-15 22:19:06'),(12204,452,1,3791,'2.99','2005-07-06 14:24:56','2006-02-15 22:19:06'),(12205,452,2,3907,'6.99','2005-07-06 19:39:14','2006-02-15 22:19:06'),(12206,452,1,4348,'0.99','2005-07-07 19:02:05','2006-02-15 22:19:06'),(12207,452,2,4353,'4.99','2005-07-07 19:19:05','2006-02-15 22:19:06'),(12208,452,2,4417,'2.99','2005-07-07 22:05:05','2006-02-15 22:19:07'),(12209,452,1,4720,'0.99','2005-07-08 12:34:34','2006-02-15 22:19:07'),(12210,452,1,5177,'1.99','2005-07-09 09:43:21','2006-02-15 22:19:07'),(12211,452,2,5480,'0.99','2005-07-09 23:49:07','2006-02-15 22:19:07'),(12212,452,2,6959,'2.99','2005-07-27 00:07:51','2006-02-15 22:19:07'),(12213,452,2,7899,'6.99','2005-07-28 11:10:12','2006-02-15 22:19:07'),(12214,452,1,8898,'1.99','2005-07-30 01:02:20','2006-02-15 22:19:07'),(12215,452,2,9379,'6.99','2005-07-30 19:13:01','2006-02-15 22:19:07'),(12216,452,2,11715,'4.99','2005-08-17 07:40:55','2006-02-15 22:19:07'),(12217,452,1,11735,'3.99','2005-08-17 08:35:42','2006-02-15 22:19:07'),(12218,452,1,12355,'0.99','2005-08-18 07:36:23','2006-02-15 22:19:07'),(12219,452,1,12630,'4.99','2005-08-18 17:49:28','2006-02-15 22:19:07'),(12220,452,1,13080,'4.99','2005-08-19 10:18:00','2006-02-15 22:19:07'),(12221,452,1,13642,'3.99','2005-08-20 07:42:17','2006-02-15 22:19:07'),(12222,452,1,14660,'0.99','2005-08-21 19:43:21','2006-02-15 22:19:07'),(12223,452,1,15909,'0.99','2005-08-23 17:42:42','2006-02-15 22:19:07'),(12224,452,1,14175,'4.99','2006-02-14 15:16:03','2006-02-15 22:19:07'),(12225,453,2,2852,'5.99','2005-06-19 23:08:50','2006-02-15 22:19:07'),(12226,453,1,2853,'7.99','2005-06-19 23:09:41','2006-02-15 22:19:08'),(12227,453,2,2887,'4.99','2005-06-20 01:39:43','2006-02-15 22:19:08'),(12228,453,2,3929,'0.99','2005-07-06 20:52:39','2006-02-15 22:19:08'),(12229,453,2,4033,'8.99','2005-07-07 02:35:46','2006-02-15 22:19:08'),(12230,453,1,4717,'4.99','2005-07-08 12:22:43','2006-02-15 22:19:08'),(12231,453,2,4805,'2.99','2005-07-08 16:59:12','2006-02-15 22:19:08'),(12232,453,2,5359,'6.99','2005-07-09 18:10:52','2006-02-15 22:19:08'),(12233,453,1,6752,'4.99','2005-07-12 14:53:15','2006-02-15 22:19:08'),(12234,453,1,7563,'0.99','2005-07-27 22:25:36','2006-02-15 22:19:08'),(12235,453,2,9289,'6.99','2005-07-30 15:57:04','2006-02-15 22:19:08'),(12236,453,2,9406,'6.99','2005-07-30 20:24:00','2006-02-15 22:19:08'),(12237,453,2,9900,'1.99','2005-07-31 14:15:05','2006-02-15 22:19:08'),(12238,453,1,11794,'4.99','2005-08-17 11:08:48','2006-02-15 22:19:08'),(12239,453,1,12703,'2.99','2005-08-18 20:37:13','2006-02-15 22:19:08'),(12240,453,1,13711,'7.99','2005-08-20 09:35:20','2006-02-15 22:19:08'),(12241,453,1,13785,'4.99','2005-08-20 12:11:46','2006-02-15 22:19:08'),(12242,453,1,14133,'2.99','2005-08-21 01:44:14','2006-02-15 22:19:08'),(12243,453,2,14306,'5.99','2005-08-21 07:32:35','2006-02-15 22:19:09'),(12244,453,2,14644,'4.99','2005-08-21 19:12:12','2006-02-15 22:19:09'),(12245,453,1,14652,'4.99','2005-08-21 19:32:05','2006-02-15 22:19:09'),(12246,453,1,15252,'0.99','2005-08-22 18:04:22','2006-02-15 22:19:09'),(12247,453,2,15627,'4.99','2005-08-23 07:25:38','2006-02-15 22:19:09'),(12248,454,1,735,'7.99','2005-05-29 08:08:13','2006-02-15 22:19:09'),(12249,454,2,1647,'4.99','2005-06-16 09:14:58','2006-02-15 22:19:09'),(12250,454,2,1844,'7.99','2005-06-16 23:53:53','2006-02-15 22:19:09'),(12251,454,1,1861,'1.99','2005-06-17 01:17:31','2006-02-15 22:19:09'),(12252,454,1,1938,'4.99','2005-06-17 07:18:36','2006-02-15 22:19:09'),(12253,454,2,2048,'5.99','2005-06-17 14:55:29','2006-02-15 22:19:09'),(12254,454,2,2182,'5.99','2005-06-18 00:56:18','2006-02-15 22:19:09'),(12255,454,1,2437,'2.99','2005-06-18 18:30:26','2006-02-15 22:19:09'),(12256,454,2,2666,'9.99','2005-06-19 11:17:12','2006-02-15 22:19:09'),(12257,454,1,3221,'2.99','2005-06-21 01:49:47','2006-02-15 22:19:09'),(12258,454,1,3362,'4.99','2005-06-21 12:19:54','2006-02-15 22:19:09'),(12259,454,1,3622,'7.99','2005-07-06 06:05:04','2006-02-15 22:19:09'),(12260,454,2,4562,'4.99','2005-07-08 05:08:32','2006-02-15 22:19:09'),(12261,454,2,5088,'4.99','2005-07-09 05:45:16','2006-02-15 22:19:10'),(12262,454,2,5446,'2.99','2005-07-09 21:59:55','2006-02-15 22:19:10'),(12263,454,2,6260,'4.99','2005-07-11 15:26:29','2006-02-15 22:19:10'),(12264,454,2,6701,'0.99','2005-07-12 12:47:59','2006-02-15 22:19:10'),(12265,454,2,8481,'2.99','2005-07-29 08:45:57','2006-02-15 22:19:10'),(12266,454,1,8806,'0.99','2005-07-29 21:36:34','2006-02-15 22:19:10'),(12267,454,2,9041,'0.99','2005-07-30 06:32:36','2006-02-15 22:19:10'),(12268,454,1,9372,'9.99','2005-07-30 19:04:30','2006-02-15 22:19:10'),(12269,454,1,10005,'3.99','2005-07-31 17:53:51','2006-02-15 22:19:10'),(12270,454,2,12347,'0.99','2005-08-18 07:18:10','2006-02-15 22:19:10'),(12271,454,1,12553,'0.99','2005-08-18 14:46:54','2006-02-15 22:19:10'),(12272,454,2,13496,'8.99','2005-08-20 01:42:29','2006-02-15 22:19:10'),(12273,454,2,13513,'2.99','2005-08-20 02:27:53','2006-02-15 22:19:10'),(12274,454,2,13694,'8.99','2005-08-20 09:13:23','2006-02-15 22:19:10'),(12275,454,1,13805,'6.99','2005-08-20 12:53:12','2006-02-15 22:19:10'),(12276,454,1,14799,'0.99','2005-08-22 00:44:57','2006-02-15 22:19:10'),(12277,454,2,14843,'2.99','2005-08-22 02:05:25','2006-02-15 22:19:10'),(12278,454,2,15012,'4.99','2005-08-22 08:42:32','2006-02-15 22:19:10'),(12279,454,1,15301,'3.99','2005-08-22 19:44:16','2006-02-15 22:19:11'),(12280,454,2,15608,'1.99','2005-08-23 06:55:26','2006-02-15 22:19:11'),(12281,455,2,115,'0.99','2005-05-25 19:13:25','2006-02-15 22:19:11'),(12282,455,2,343,'0.99','2005-05-27 04:13:41','2006-02-15 22:19:11'),(12283,455,2,1382,'1.99','2005-06-15 15:18:08','2006-02-15 22:19:11'),(12284,455,1,1802,'1.99','2005-06-16 20:23:30','2006-02-15 22:19:11'),(12285,455,1,1906,'2.99','2005-06-17 04:53:35','2006-02-15 22:19:11'),(12286,455,2,2356,'0.99','2005-06-18 12:59:23','2006-02-15 22:19:11'),(12287,455,2,4195,'2.99','2005-07-07 11:00:02','2006-02-15 22:19:11'),(12288,455,1,4861,'8.99','2005-07-08 18:57:30','2006-02-15 22:19:11'),(12289,455,1,4964,'2.99','2005-07-08 23:46:38','2006-02-15 22:19:11'),(12290,455,1,5504,'6.99','2005-07-10 00:36:38','2006-02-15 22:19:11'),(12291,455,2,6729,'4.99','2005-07-12 13:58:23','2006-02-15 22:19:11'),(12292,455,1,7388,'4.99','2005-07-27 15:54:19','2006-02-15 22:19:11'),(12293,455,2,7498,'4.99','2005-07-27 20:09:31','2006-02-15 22:19:11'),(12294,455,2,7905,'5.99','2005-07-28 11:26:57','2006-02-15 22:19:11'),(12295,455,2,8291,'2.99','2005-07-29 02:28:25','2006-02-15 22:19:11'),(12296,455,1,10436,'0.99','2005-08-01 08:50:59','2006-02-15 22:19:11'),(12297,455,1,11605,'4.99','2005-08-17 03:30:57','2006-02-15 22:19:12'),(12298,455,1,12163,'2.99','2005-08-18 00:46:01','2006-02-15 22:19:12'),(12299,455,1,12314,'4.99','2005-08-18 06:10:02','2006-02-15 22:19:12'),(12300,455,2,13083,'2.99','2005-08-19 10:26:45','2006-02-15 22:19:12'),(12301,455,2,13813,'4.99','2005-08-20 13:03:26','2006-02-15 22:19:12'),(12302,455,1,14294,'2.99','2005-08-21 07:07:26','2006-02-15 22:19:12'),(12303,455,2,14583,'4.99','2005-08-21 17:11:47','2006-02-15 22:19:12'),(12304,455,1,15494,'1.99','2005-08-23 02:25:09','2006-02-15 22:19:12'),(12305,456,2,19,'4.99','2005-05-25 01:17:24','2006-02-15 22:19:12'),(12306,456,1,1288,'2.99','2005-06-15 08:41:52','2006-02-15 22:19:12'),(12307,456,1,1700,'0.99','2005-06-16 13:18:23','2006-02-15 22:19:12'),(12308,456,2,2103,'5.99','2005-06-17 19:13:10','2006-02-15 22:19:12'),(12309,456,2,2146,'6.99','2005-06-17 22:26:23','2006-02-15 22:19:12'),(12310,456,1,2192,'4.99','2005-06-18 01:35:47','2006-02-15 22:19:12'),(12311,456,1,2404,'0.99','2005-06-18 16:33:48','2006-02-15 22:19:12'),(12312,456,1,2581,'2.99','2005-06-19 04:54:13','2006-02-15 22:19:12'),(12313,456,1,3743,'7.99','2005-07-06 12:03:54','2006-02-15 22:19:12'),(12314,456,2,3881,'2.99','2005-07-06 18:35:37','2006-02-15 22:19:13'),(12315,456,1,4141,'3.99','2005-07-07 08:19:20','2006-02-15 22:19:13'),(12316,456,2,5964,'0.99','2005-07-10 23:47:18','2006-02-15 22:19:13'),(12317,456,2,6023,'0.99','2005-07-11 02:15:57','2006-02-15 22:19:13'),(12318,456,2,7248,'2.99','2005-07-27 10:37:45','2006-02-15 22:19:13'),(12319,456,1,8749,'4.99','2005-07-29 19:13:15','2006-02-15 22:19:13'),(12320,456,2,10519,'5.99','2005-08-01 11:44:13','2006-02-15 22:19:13'),(12321,456,1,10813,'2.99','2005-08-01 22:43:00','2006-02-15 22:19:13'),(12322,456,1,12188,'4.99','2005-08-18 01:51:43','2006-02-15 22:19:13'),(12323,456,1,13144,'8.99','2005-08-19 12:45:55','2006-02-15 22:19:13'),(12324,456,1,13348,'4.99','2005-08-19 20:31:48','2006-02-15 22:19:13'),(12325,456,1,13547,'4.99','2005-08-20 03:53:16','2006-02-15 22:19:13'),(12326,456,2,14253,'2.99','2005-08-21 05:47:52','2006-02-15 22:19:13'),(12327,456,2,14690,'1.99','2005-08-21 20:42:25','2006-02-15 22:19:13'),(12328,456,1,15720,'3.99','2005-08-23 11:15:20','2006-02-15 22:19:13'),(12329,456,1,15910,'2.99','2005-08-23 17:43:16','2006-02-15 22:19:13'),(12330,457,2,1024,'7.99','2005-05-31 03:30:19','2006-02-15 22:19:13'),(12331,457,2,1453,'4.99','2005-06-15 19:36:39','2006-02-15 22:19:13'),(12332,457,2,1727,'0.99','2005-06-16 15:21:47','2006-02-15 22:19:14'),(12333,457,1,2030,'0.99','2005-06-17 13:13:27','2006-02-15 22:19:14'),(12334,457,1,2172,'7.99','2005-06-18 00:06:16','2006-02-15 22:19:14'),(12335,457,1,2670,'4.99','2005-06-19 11:30:16','2006-02-15 22:19:14'),(12336,457,1,2762,'3.99','2005-06-19 17:22:31','2006-02-15 22:19:14'),(12337,457,1,2811,'0.99','2005-06-19 19:53:30','2006-02-15 22:19:14'),(12338,457,2,3115,'2.99','2005-06-20 17:59:05','2006-02-15 22:19:14'),(12339,457,2,3184,'2.99','2005-06-20 22:57:44','2006-02-15 22:19:14'),(12340,457,2,4600,'5.99','2005-07-08 06:48:37','2006-02-15 22:19:14'),(12341,457,1,5500,'0.99','2005-07-10 00:28:17','2006-02-15 22:19:14'),(12342,457,1,6467,'7.99','2005-07-12 01:22:03','2006-02-15 22:19:14'),(12343,457,1,7184,'1.99','2005-07-27 08:22:26','2006-02-15 22:19:14'),(12344,457,2,8373,'4.99','2005-07-29 05:19:53','2006-02-15 22:19:14'),(12345,457,1,8502,'2.99','2005-07-29 09:15:41','2006-02-15 22:19:14'),(12346,457,1,10049,'2.99','2005-07-31 19:11:11','2006-02-15 22:19:14'),(12347,457,2,11956,'6.99','2005-08-17 17:22:05','2006-02-15 22:19:14'),(12348,457,1,12115,'4.99','2005-08-17 23:04:15','2006-02-15 22:19:14'),(12349,457,1,12171,'4.99','2005-08-18 01:06:13','2006-02-15 22:19:15'),(12350,457,1,13088,'0.99','2005-08-19 10:36:11','2006-02-15 22:19:15'),(12351,457,1,13150,'2.99','2005-08-19 13:08:19','2006-02-15 22:19:15'),(12352,457,2,13934,'0.99','2005-08-20 17:18:48','2006-02-15 22:19:15'),(12353,457,2,14327,'10.99','2005-08-21 08:18:18','2006-02-15 22:19:15'),(12354,457,1,14365,'6.99','2005-08-21 09:25:13','2006-02-15 22:19:15'),(12355,457,1,15128,'3.99','2005-08-22 12:57:26','2006-02-15 22:19:15'),(12356,457,1,12645,'3.98','2006-02-14 15:16:03','2006-02-15 22:19:15'),(12357,457,2,14516,'0.00','2006-02-14 15:16:03','2006-02-15 22:19:15'),(12358,458,2,2629,'5.99','2005-06-19 08:42:12','2006-02-15 22:19:15'),(12359,458,2,3322,'0.99','2005-06-21 08:42:37','2006-02-15 22:19:15'),(12360,458,2,4525,'2.99','2005-07-08 03:15:00','2006-02-15 22:19:15'),(12361,458,1,5412,'2.99','2005-07-09 20:23:52','2006-02-15 22:19:15'),(12362,458,1,5572,'0.99','2005-07-10 03:49:00','2006-02-15 22:19:15'),(12363,458,2,6250,'3.99','2005-07-11 15:02:04','2006-02-15 22:19:15'),(12364,458,1,6431,'5.99','2005-07-12 00:03:57','2006-02-15 22:19:15'),(12365,458,2,6595,'7.99','2005-07-12 07:25:48','2006-02-15 22:19:15'),(12366,458,1,6654,'1.99','2005-07-12 11:06:28','2006-02-15 22:19:15'),(12367,458,2,7923,'3.99','2005-07-28 12:08:29','2006-02-15 22:19:16'),(12368,458,1,8158,'0.99','2005-07-28 21:08:46','2006-02-15 22:19:16'),(12369,458,2,11138,'2.99','2005-08-02 09:26:16','2006-02-15 22:19:16'),(12370,458,2,11975,'2.99','2005-08-17 17:58:39','2006-02-15 22:19:16'),(12371,458,2,12768,'0.99','2005-08-18 23:26:11','2006-02-15 22:19:16'),(12372,458,2,13259,'2.99','2005-08-19 17:08:53','2006-02-15 22:19:16'),(12373,458,2,13487,'2.99','2005-08-20 01:27:05','2006-02-15 22:19:16'),(12374,458,2,13571,'4.99','2005-08-20 05:05:14','2006-02-15 22:19:16'),(12375,458,2,14428,'4.99','2005-08-21 11:27:07','2006-02-15 22:19:16'),(12376,458,1,15604,'4.99','2005-08-23 06:44:19','2006-02-15 22:19:16'),(12377,459,2,2,'2.99','2005-05-24 22:54:33','2006-02-15 22:19:16'),(12378,459,2,1876,'0.99','2005-06-17 02:50:51','2006-02-15 22:19:16'),(12379,459,2,1977,'2.99','2005-06-17 09:38:22','2006-02-15 22:19:16'),(12380,459,2,2075,'4.99','2005-06-17 16:40:33','2006-02-15 22:19:16'),(12381,459,1,2899,'0.99','2005-06-20 02:39:21','2006-02-15 22:19:16'),(12382,459,2,3041,'4.99','2005-06-20 12:35:44','2006-02-15 22:19:16'),(12383,459,2,3045,'0.99','2005-06-20 12:42:00','2006-02-15 22:19:16'),(12384,459,2,3234,'9.99','2005-06-21 02:39:44','2006-02-15 22:19:16'),(12385,459,1,3506,'2.99','2005-07-06 00:22:29','2006-02-15 22:19:17'),(12386,459,2,4519,'2.99','2005-07-08 02:51:23','2006-02-15 22:19:17'),(12387,459,1,5301,'3.99','2005-07-09 15:42:10','2006-02-15 22:19:17'),(12388,459,1,5695,'0.99','2005-07-10 09:43:40','2006-02-15 22:19:17'),(12389,459,1,6206,'0.99','2005-07-11 12:32:14','2006-02-15 22:19:17'),(12390,459,2,6750,'3.99','2005-07-12 14:49:39','2006-02-15 22:19:17'),(12391,459,1,7623,'6.99','2005-07-28 00:37:41','2006-02-15 22:19:17'),(12392,459,2,7639,'4.99','2005-07-28 01:14:36','2006-02-15 22:19:17'),(12393,459,1,7717,'4.99','2005-07-28 04:33:54','2006-02-15 22:19:17'),(12394,459,1,7820,'5.99','2005-07-28 08:28:51','2006-02-15 22:19:17'),(12395,459,1,7913,'6.99','2005-07-28 11:47:23','2006-02-15 22:19:17'),(12396,459,1,8289,'9.99','2005-07-29 02:23:24','2006-02-15 22:19:17'),(12397,459,2,8557,'10.99','2005-07-29 11:19:59','2006-02-15 22:19:17'),(12398,459,1,8897,'2.99','2005-07-30 01:00:17','2006-02-15 22:19:17'),(12399,459,1,9137,'6.99','2005-07-30 10:09:24','2006-02-15 22:19:17'),(12400,459,2,9639,'2.99','2005-07-31 05:32:10','2006-02-15 22:19:17'),(12401,459,1,9744,'4.99','2005-07-31 09:15:38','2006-02-15 22:19:17'),(12402,459,2,10117,'4.99','2005-07-31 21:14:31','2006-02-15 22:19:18'),(12403,459,1,10233,'6.99','2005-08-01 01:54:23','2006-02-15 22:19:18'),(12404,459,2,10255,'4.99','2005-08-01 02:46:13','2006-02-15 22:19:18'),(12405,459,1,10499,'7.99','2005-08-01 11:00:20','2006-02-15 22:19:18'),(12406,459,1,10531,'2.99','2005-08-01 12:06:30','2006-02-15 22:19:18'),(12407,459,1,12527,'6.99','2005-08-18 13:48:46','2006-02-15 22:19:18'),(12408,459,1,12629,'7.99','2005-08-18 17:40:33','2006-02-15 22:19:18'),(12409,459,2,13960,'10.99','2005-08-20 18:16:26','2006-02-15 22:19:18'),(12410,459,1,13967,'4.99','2005-08-20 18:28:46','2006-02-15 22:19:18'),(12411,459,1,14315,'3.99','2005-08-21 07:56:39','2006-02-15 22:19:18'),(12412,459,1,15126,'5.99','2005-08-22 12:53:58','2006-02-15 22:19:18'),(12413,459,2,15342,'2.99','2005-08-22 20:56:41','2006-02-15 22:19:18'),(12414,459,1,15814,'0.99','2005-08-23 14:52:50','2006-02-15 22:19:18'),(12415,460,1,223,'4.99','2005-05-26 10:15:23','2006-02-15 22:19:18'),(12416,460,2,298,'0.99','2005-05-26 20:52:26','2006-02-15 22:19:18'),(12417,460,1,880,'0.99','2005-05-30 06:12:33','2006-02-15 22:19:18'),(12418,460,2,1064,'4.99','2005-05-31 08:50:07','2006-02-15 22:19:18'),(12419,460,2,1392,'0.99','2005-06-15 16:12:27','2006-02-15 22:19:19'),(12420,460,2,3820,'4.99','2005-07-06 15:35:26','2006-02-15 22:19:19'),(12421,460,1,4452,'7.99','2005-07-07 23:31:54','2006-02-15 22:19:19'),(12422,460,2,5482,'3.99','2005-07-09 23:53:04','2006-02-15 22:19:19'),(12423,460,1,6613,'4.99','2005-07-12 08:30:07','2006-02-15 22:19:19'),(12424,460,1,6788,'5.99','2005-07-12 16:33:44','2006-02-15 22:19:19'),(12425,460,1,7125,'6.99','2005-07-27 06:11:00','2006-02-15 22:19:19'),(12426,460,1,7785,'3.99','2005-07-28 07:16:11','2006-02-15 22:19:19'),(12427,460,2,8656,'2.99','2005-07-29 15:05:52','2006-02-15 22:19:19'),(12428,460,2,10754,'10.99','2005-08-01 20:12:33','2006-02-15 22:19:19'),(12429,460,1,10926,'1.99','2005-08-02 02:26:37','2006-02-15 22:19:19'),(12430,460,2,11554,'2.99','2005-08-17 01:05:17','2006-02-15 22:19:19'),(12431,460,1,12056,'5.99','2005-08-17 21:03:48','2006-02-15 22:19:19'),(12432,460,2,12586,'4.99','2005-08-18 15:54:39','2006-02-15 22:19:19'),(12433,460,1,12865,'0.99','2005-08-19 02:38:50','2006-02-15 22:19:19'),(12434,460,2,13215,'8.99','2005-08-19 15:35:38','2006-02-15 22:19:19'),(12435,460,1,13341,'3.99','2005-08-19 20:18:53','2006-02-15 22:19:19'),(12436,460,2,13920,'5.99','2005-08-20 16:51:18','2006-02-15 22:19:19'),(12437,460,2,14864,'0.99','2005-08-22 02:57:06','2006-02-15 22:19:20'),(12438,460,1,14923,'3.99','2005-08-22 05:13:33','2006-02-15 22:19:20'),(12439,460,2,15954,'2.99','2005-08-23 19:14:07','2006-02-15 22:19:20'),(12440,461,1,684,'6.99','2005-05-29 00:13:15','2006-02-15 22:19:20'),(12441,461,2,3127,'5.99','2005-06-20 18:39:43','2006-02-15 22:19:20'),(12442,461,2,3319,'4.99','2005-06-21 08:25:46','2006-02-15 22:19:20'),(12443,461,2,3698,'0.99','2005-07-06 10:09:20','2006-02-15 22:19:20'),(12444,461,2,4586,'2.99','2005-07-08 06:12:33','2006-02-15 22:19:20'),(12445,461,1,5650,'0.99','2005-07-10 07:17:01','2006-02-15 22:19:20'),(12446,461,1,5809,'2.99','2005-07-10 15:19:30','2006-02-15 22:19:20'),(12447,461,2,7334,'2.99','2005-07-27 13:59:58','2006-02-15 22:19:20'),(12448,461,2,7664,'2.99','2005-07-28 02:24:23','2006-02-15 22:19:20'),(12449,461,2,8133,'0.99','2005-07-28 20:01:06','2006-02-15 22:19:20'),(12450,461,2,8164,'0.99','2005-07-28 21:17:19','2006-02-15 22:19:20'),(12451,461,2,9499,'4.99','2005-07-30 23:58:30','2006-02-15 22:19:20'),(12452,461,1,9885,'0.99','2005-07-31 13:59:32','2006-02-15 22:19:20'),(12453,461,2,10113,'4.99','2005-07-31 21:10:03','2006-02-15 22:19:20'),(12454,461,1,10260,'2.99','2005-08-01 02:58:07','2006-02-15 22:19:21'),(12455,461,2,11063,'0.99','2005-08-02 06:53:48','2006-02-15 22:19:21'),(12456,461,2,11219,'0.99','2005-08-02 12:30:20','2006-02-15 22:19:21'),(12457,461,2,12022,'2.99','2005-08-17 19:52:45','2006-02-15 22:19:21'),(12458,461,1,13223,'2.99','2005-08-19 15:52:04','2006-02-15 22:19:21'),(12459,461,1,13269,'2.99','2005-08-19 17:34:00','2006-02-15 22:19:21'),(12460,461,1,14186,'4.99','2005-08-21 03:31:07','2006-02-15 22:19:21'),(12461,461,1,14893,'4.99','2005-08-22 04:15:48','2006-02-15 22:19:21'),(12462,461,1,15067,'2.99','2005-08-22 10:49:21','2006-02-15 22:19:21'),(12463,461,2,15187,'4.99','2005-08-22 15:53:32','2006-02-15 22:19:21'),(12464,461,1,15336,'6.99','2005-08-22 20:47:48','2006-02-15 22:19:21'),(12465,461,2,15411,'2.99','2005-08-22 23:35:41','2006-02-15 22:19:21'),(12466,461,2,15449,'2.99','2005-08-23 00:55:43','2006-02-15 22:19:21'),(12467,461,2,15613,'7.99','2005-08-23 07:03:19','2006-02-15 22:19:21'),(12468,462,2,156,'2.99','2005-05-26 01:19:05','2006-02-15 22:19:21'),(12469,462,2,590,'3.99','2005-05-28 13:06:50','2006-02-15 22:19:21'),(12470,462,2,1773,'5.99','2005-06-16 18:13:43','2006-02-15 22:19:21'),(12471,462,2,1926,'9.99','2005-06-17 06:24:30','2006-02-15 22:19:21'),(12472,462,1,3279,'4.99','2005-06-21 06:05:53','2006-02-15 22:19:22'),(12473,462,1,4500,'4.99','2005-07-08 02:10:01','2006-02-15 22:19:22'),(12474,462,2,4728,'3.99','2005-07-08 12:59:01','2006-02-15 22:19:22'),(12475,462,1,6583,'4.99','2005-07-12 06:42:31','2006-02-15 22:19:22'),(12476,462,1,6630,'0.99','2005-07-12 09:30:05','2006-02-15 22:19:22'),(12477,462,1,6710,'7.99','2005-07-12 13:23:09','2006-02-15 22:19:22'),(12478,462,1,6721,'6.99','2005-07-12 13:42:58','2006-02-15 22:19:22'),(12479,462,2,7295,'8.99','2005-07-27 12:38:47','2006-02-15 22:19:22'),(12480,462,1,7324,'6.99','2005-07-27 13:42:39','2006-02-15 22:19:22'),(12481,462,1,7762,'8.99','2005-07-28 06:34:23','2006-02-15 22:19:22'),(12482,462,1,7932,'4.99','2005-07-28 12:24:54','2006-02-15 22:19:22'),(12483,462,2,7935,'2.99','2005-07-28 12:33:17','2006-02-15 22:19:22'),(12484,462,1,8066,'2.99','2005-07-28 17:20:09','2006-02-15 22:19:22'),(12485,462,1,8282,'0.99','2005-07-29 01:49:04','2006-02-15 22:19:22'),(12486,462,1,8290,'3.99','2005-07-29 02:24:08','2006-02-15 22:19:22'),(12487,462,2,8757,'2.99','2005-07-29 19:19:10','2006-02-15 22:19:22'),(12488,462,1,9891,'0.99','2005-07-31 14:05:44','2006-02-15 22:19:22'),(12489,462,1,10283,'2.99','2005-08-01 03:29:45','2006-02-15 22:19:23'),(12490,462,2,11639,'6.99','2005-08-17 04:43:29','2006-02-15 22:19:23'),(12491,462,1,11808,'2.99','2005-08-17 11:51:16','2006-02-15 22:19:23'),(12492,462,1,12466,'4.99','2005-08-18 11:36:55','2006-02-15 22:19:23'),(12493,462,2,12582,'0.99','2005-08-18 15:51:12','2006-02-15 22:19:23'),(12494,462,1,12802,'8.99','2005-08-19 00:27:41','2006-02-15 22:19:23'),(12495,462,2,13041,'8.99','2005-08-19 09:05:38','2006-02-15 22:19:23'),(12496,462,1,13328,'4.99','2005-08-19 19:56:01','2006-02-15 22:19:23'),(12497,462,1,13492,'7.99','2005-08-20 01:32:04','2006-02-15 22:19:23'),(12498,462,2,15581,'2.99','2005-08-23 05:42:13','2006-02-15 22:19:23'),(12499,462,1,15943,'2.99','2005-08-23 18:49:32','2006-02-15 22:19:23'),(12500,462,1,16013,'0.99','2005-08-23 21:17:17','2006-02-15 22:19:23'),(12501,463,1,560,'1.99','2005-05-28 08:53:02','2006-02-15 22:19:23'),(12502,463,1,1284,'2.99','2005-06-15 08:27:33','2006-02-15 22:19:23'),(12503,463,2,2527,'4.99','2005-06-19 01:10:31','2006-02-15 22:19:23'),(12504,463,1,3217,'2.99','2005-06-21 01:28:12','2006-02-15 22:19:23'),(12505,463,1,3309,'4.99','2005-06-21 08:00:49','2006-02-15 22:19:23'),(12506,463,1,5026,'2.99','2005-07-09 02:32:34','2006-02-15 22:19:24'),(12507,463,1,5157,'2.99','2005-07-09 08:52:12','2006-02-15 22:19:24'),(12508,463,1,5448,'0.99','2005-07-09 22:11:14','2006-02-15 22:19:24'),(12509,463,2,6294,'0.99','2005-07-11 17:25:55','2006-02-15 22:19:24'),(12510,463,1,6932,'6.99','2005-07-26 23:08:04','2006-02-15 22:19:24'),(12511,463,1,7013,'0.99','2005-07-27 02:03:21','2006-02-15 22:19:24'),(12512,463,1,7361,'0.99','2005-07-27 14:53:55','2006-02-15 22:19:24'),(12513,463,1,8762,'2.99','2005-07-29 19:30:02','2006-02-15 22:19:24'),(12514,463,2,9405,'7.99','2005-07-30 20:22:17','2006-02-15 22:19:24'),(12515,463,1,9954,'2.99','2005-07-31 15:57:07','2006-02-15 22:19:24'),(12516,463,1,10275,'3.99','2005-08-01 03:20:08','2006-02-15 22:19:24'),(12517,463,2,10405,'0.99','2005-08-01 07:35:25','2006-02-15 22:19:24'),(12518,463,2,10906,'2.99','2005-08-02 01:47:04','2006-02-15 22:19:24'),(12519,463,2,12096,'7.99','2005-08-17 22:32:50','2006-02-15 22:19:24'),(12520,463,2,12679,'6.99','2005-08-18 19:42:11','2006-02-15 22:19:24'),(12521,463,1,12950,'2.99','2005-08-19 05:55:58','2006-02-15 22:19:24'),(12522,463,2,13938,'4.99','2005-08-20 17:24:45','2006-02-15 22:19:24'),(12523,463,1,14689,'0.99','2005-08-21 20:33:00','2006-02-15 22:19:24'),(12524,463,1,14859,'2.99','2005-08-22 02:46:35','2006-02-15 22:19:25'),(12525,463,2,15151,'7.99','2005-08-22 14:23:11','2006-02-15 22:19:25'),(12526,464,1,305,'3.99','2005-05-26 21:22:07','2006-02-15 22:19:25'),(12527,464,2,373,'1.99','2005-05-27 08:16:25','2006-02-15 22:19:25'),(12528,464,2,1277,'4.99','2005-06-15 08:01:29','2006-02-15 22:19:25'),(12529,464,1,3167,'2.99','2005-06-20 21:42:29','2006-02-15 22:19:25'),(12530,464,1,3761,'4.99','2005-07-06 12:52:44','2006-02-15 22:19:25'),(12531,464,1,4337,'5.99','2005-07-07 18:36:37','2006-02-15 22:19:25'),(12532,464,2,5455,'6.99','2005-07-09 22:28:45','2006-02-15 22:19:25'),(12533,464,1,5910,'4.99','2005-07-10 20:51:34','2006-02-15 22:19:25'),(12534,464,2,6601,'3.99','2005-07-12 07:44:49','2006-02-15 22:19:25'),(12535,464,1,9600,'5.99','2005-07-31 03:35:34','2006-02-15 22:19:25'),(12536,464,2,11275,'1.99','2005-08-02 14:25:58','2006-02-15 22:19:25'),(12537,464,1,13644,'8.99','2005-08-20 07:46:30','2006-02-15 22:19:25'),(12538,464,2,13943,'2.99','2005-08-20 17:31:18','2006-02-15 22:19:25'),(12539,464,1,15092,'6.99','2005-08-22 11:36:16','2006-02-15 22:19:25'),(12540,464,2,15854,'0.99','2005-08-23 15:58:05','2006-02-15 22:19:25'),(12541,464,1,15983,'4.99','2005-08-23 20:13:38','2006-02-15 22:19:26'),(12542,465,2,640,'0.99','2005-05-28 18:43:26','2006-02-15 22:19:26'),(12543,465,1,1337,'2.99','2005-06-15 12:12:42','2006-02-15 22:19:26'),(12544,465,1,2079,'4.99','2005-06-17 16:49:45','2006-02-15 22:19:26'),(12545,465,1,2159,'8.99','2005-06-17 23:37:29','2006-02-15 22:19:26'),(12546,465,2,2524,'0.99','2005-06-19 00:48:11','2006-02-15 22:19:26'),(12547,465,1,4763,'0.99','2005-07-08 14:57:32','2006-02-15 22:19:26'),(12548,465,2,6904,'3.99','2005-07-12 22:02:09','2006-02-15 22:19:26'),(12549,465,2,7508,'2.99','2005-07-27 20:33:08','2006-02-15 22:19:26'),(12550,465,1,10542,'3.99','2005-08-01 12:32:23','2006-02-15 22:19:26'),(12551,465,1,11156,'2.99','2005-08-02 09:56:06','2006-02-15 22:19:26'),(12552,465,1,11586,'4.99','2005-08-17 02:20:42','2006-02-15 22:19:26'),(12553,465,2,11648,'6.99','2005-08-17 04:56:16','2006-02-15 22:19:26'),(12554,465,2,12106,'4.99','2005-08-17 22:55:32','2006-02-15 22:19:26'),(12555,465,1,12814,'4.99','2005-08-19 00:58:24','2006-02-15 22:19:26'),(12556,465,1,12864,'4.99','2005-08-19 02:38:26','2006-02-15 22:19:26'),(12557,465,1,15550,'3.99','2005-08-23 04:27:54','2006-02-15 22:19:26'),(12558,465,2,15859,'4.99','2005-08-23 16:08:15','2006-02-15 22:19:27'),(12559,466,2,1104,'2.99','2005-05-31 14:30:01','2006-02-15 22:19:27'),(12560,466,2,1808,'7.99','2005-06-16 20:59:35','2006-02-15 22:19:27'),(12561,466,2,2446,'8.99','2005-06-18 19:04:41','2006-02-15 22:19:27'),(12562,466,1,3022,'3.99','2005-06-20 11:17:20','2006-02-15 22:19:27'),(12563,466,2,3237,'4.99','2005-06-21 02:47:56','2006-02-15 22:19:27'),(12564,466,2,3343,'2.99','2005-06-21 10:56:59','2006-02-15 22:19:27'),(12565,466,2,5048,'0.99','2005-07-09 03:46:33','2006-02-15 22:19:27'),(12566,466,1,5691,'4.99','2005-07-10 09:29:49','2006-02-15 22:19:27'),(12567,466,1,6073,'6.99','2005-07-11 04:54:31','2006-02-15 22:19:27'),(12568,466,2,7080,'2.99','2005-07-27 04:25:25','2006-02-15 22:19:27'),(12569,466,2,8276,'0.99','2005-07-29 01:38:43','2006-02-15 22:19:27'),(12570,466,1,9202,'3.99','2005-07-30 12:43:24','2006-02-15 22:19:27'),(12571,466,1,9257,'2.99','2005-07-30 14:30:38','2006-02-15 22:19:27'),(12572,466,1,10469,'4.99','2005-08-01 09:51:11','2006-02-15 22:19:27'),(12573,466,2,11343,'0.99','2005-08-02 17:12:30','2006-02-15 22:19:27'),(12574,466,1,11359,'4.99','2005-08-02 17:45:55','2006-02-15 22:19:27'),(12575,466,1,12048,'7.99','2005-08-17 20:49:24','2006-02-15 22:19:27'),(12576,466,1,13478,'2.99','2005-08-20 01:07:14','2006-02-15 22:19:28'),(12577,466,1,13884,'5.99','2005-08-20 15:30:51','2006-02-15 22:19:28'),(12578,466,1,13988,'4.99','2005-08-20 19:21:28','2006-02-15 22:19:28'),(12579,466,2,14546,'2.99','2005-08-21 15:50:50','2006-02-15 22:19:28'),(12580,466,2,15230,'4.99','2005-08-22 17:31:41','2006-02-15 22:19:28'),(12581,466,1,16005,'7.99','2005-08-23 21:00:22','2006-02-15 22:19:28'),(12582,467,2,225,'4.99','2005-05-26 10:27:50','2006-02-15 22:19:28'),(12583,467,1,1737,'8.99','2005-06-16 15:59:44','2006-02-15 22:19:28'),(12584,467,2,2121,'4.99','2005-06-17 20:38:54','2006-02-15 22:19:28'),(12585,467,2,2870,'9.99','2005-06-20 00:17:46','2006-02-15 22:19:28'),(12586,467,1,3250,'6.99','2005-06-21 03:16:36','2006-02-15 22:19:28'),(12587,467,1,4216,'0.99','2005-07-07 12:01:34','2006-02-15 22:19:28'),(12588,467,2,4222,'4.99','2005-07-07 12:20:21','2006-02-15 22:19:28'),(12589,467,1,4259,'4.99','2005-07-07 14:22:18','2006-02-15 22:19:28'),(12590,467,2,5160,'4.99','2005-07-09 08:57:07','2006-02-15 22:19:28'),(12591,467,2,6271,'6.99','2005-07-11 16:01:35','2006-02-15 22:19:28'),(12592,467,2,7360,'2.99','2005-07-27 14:52:06','2006-02-15 22:19:28'),(12593,467,2,7573,'5.99','2005-07-27 22:46:20','2006-02-15 22:19:29'),(12594,467,1,7611,'2.99','2005-07-28 00:11:47','2006-02-15 22:19:29'),(12595,467,1,8010,'7.99','2005-07-28 15:26:20','2006-02-15 22:19:29'),(12596,467,2,8061,'6.99','2005-07-28 17:12:53','2006-02-15 22:19:29'),(12597,467,2,8224,'2.99','2005-07-28 23:59:02','2006-02-15 22:19:29'),(12598,467,2,8480,'8.99','2005-07-29 08:44:46','2006-02-15 22:19:29'),(12599,467,1,8767,'4.99','2005-07-29 19:42:33','2006-02-15 22:19:29'),(12600,467,2,10239,'0.99','2005-08-01 02:09:22','2006-02-15 22:19:29'),(12601,467,2,11332,'2.99','2005-08-02 16:52:57','2006-02-15 22:19:29'),(12602,467,1,11874,'4.99','2005-08-17 14:16:40','2006-02-15 22:19:29'),(12603,467,1,12266,'2.99','2005-08-18 04:22:31','2006-02-15 22:19:29'),(12604,467,1,12437,'9.99','2005-08-18 10:42:43','2006-02-15 22:19:29'),(12605,467,1,12641,'2.99','2005-08-18 18:18:08','2006-02-15 22:19:29'),(12606,467,1,14402,'2.99','2005-08-21 10:38:17','2006-02-15 22:19:29'),(12607,467,1,14451,'0.99','2005-08-21 12:21:44','2006-02-15 22:19:29'),(12608,467,1,14842,'3.99','2005-08-22 02:04:38','2006-02-15 22:19:29'),(12609,467,1,15032,'0.99','2005-08-22 09:14:09','2006-02-15 22:19:29'),(12610,467,2,15830,'2.99','2005-08-23 15:19:15','2006-02-15 22:19:30'),(12611,468,2,101,'6.99','2005-05-25 17:17:04','2006-02-15 22:19:30'),(12612,468,1,186,'4.99','2005-05-26 05:32:52','2006-02-15 22:19:30'),(12613,468,2,296,'6.99','2005-05-26 20:35:19','2006-02-15 22:19:30'),(12614,468,2,459,'0.99','2005-05-27 20:00:04','2006-02-15 22:19:30'),(12615,468,1,673,'0.99','2005-05-28 22:07:30','2006-02-15 22:19:30'),(12616,468,2,1229,'2.99','2005-06-15 03:53:13','2006-02-15 22:19:30'),(12617,468,1,1627,'8.99','2005-06-16 07:51:09','2006-02-15 22:19:30'),(12618,468,1,1821,'2.99','2005-06-16 21:42:49','2006-02-15 22:19:30'),(12619,468,1,1975,'2.99','2005-06-17 09:32:10','2006-02-15 22:19:30'),(12620,468,2,2462,'4.99','2005-06-18 20:00:15','2006-02-15 22:19:30'),(12621,468,1,2831,'0.99','2005-06-19 21:17:06','2006-02-15 22:19:30'),(12622,468,2,3724,'2.99','2005-07-06 11:12:48','2006-02-15 22:19:30'),(12623,468,1,3840,'5.99','2005-07-06 16:30:59','2006-02-15 22:19:30'),(12624,468,2,4184,'3.99','2005-07-07 10:30:08','2006-02-15 22:19:30'),(12625,468,2,4527,'3.99','2005-07-08 03:20:10','2006-02-15 22:19:30'),(12626,468,1,5285,'2.99','2005-07-09 15:10:44','2006-02-15 22:19:30'),(12627,468,1,6392,'0.99','2005-07-11 22:25:19','2006-02-15 22:19:31'),(12628,468,1,6581,'4.99','2005-07-12 06:26:49','2006-02-15 22:19:31'),(12629,468,2,6815,'5.99','2005-07-12 18:14:10','2006-02-15 22:19:31'),(12630,468,2,7292,'4.99','2005-07-27 12:34:14','2006-02-15 22:19:31'),(12631,468,1,7685,'0.99','2005-07-28 03:13:00','2006-02-15 22:19:31'),(12632,468,2,8423,'5.99','2005-07-29 07:02:57','2006-02-15 22:19:31'),(12633,468,2,8768,'6.99','2005-07-29 19:43:02','2006-02-15 22:19:31'),(12634,468,1,9598,'0.99','2005-07-31 03:30:41','2006-02-15 22:19:31'),(12635,468,1,9690,'6.99','2005-07-31 07:06:29','2006-02-15 22:19:31'),(12636,468,2,11257,'10.99','2005-08-02 13:45:05','2006-02-15 22:19:31'),(12637,468,2,11633,'4.99','2005-08-17 04:30:09','2006-02-15 22:19:31'),(12638,468,2,12026,'6.99','2005-08-17 20:00:10','2006-02-15 22:19:31'),(12639,468,2,13221,'3.99','2005-08-19 15:45:47','2006-02-15 22:19:31'),(12640,468,1,13417,'0.99','2005-08-19 22:51:39','2006-02-15 22:19:31'),(12641,468,2,14154,'4.99','2005-08-21 02:30:00','2006-02-15 22:19:31'),(12642,468,2,14210,'4.99','2005-08-21 04:28:02','2006-02-15 22:19:31'),(12643,468,1,14309,'9.99','2005-08-21 07:44:17','2006-02-15 22:19:31'),(12644,468,1,14313,'2.99','2005-08-21 07:49:53','2006-02-15 22:19:32'),(12645,468,1,14614,'9.99','2005-08-21 18:03:51','2006-02-15 22:19:32'),(12646,468,2,15435,'4.99','2005-08-23 00:28:19','2006-02-15 22:19:32'),(12647,468,1,15522,'1.99','2005-08-23 03:32:31','2006-02-15 22:19:32'),(12648,468,1,15836,'2.99','2005-08-23 15:29:17','2006-02-15 22:19:32'),(12649,468,2,16044,'0.99','2005-08-23 22:24:39','2006-02-15 22:19:32'),(12650,469,1,168,'0.99','2005-05-26 03:07:43','2006-02-15 22:19:32'),(12651,469,2,506,'7.99','2005-05-28 02:09:19','2006-02-15 22:19:32'),(12652,469,2,529,'4.99','2005-05-28 04:34:17','2006-02-15 22:19:32'),(12653,469,2,936,'1.99','2005-05-30 13:52:49','2006-02-15 22:19:32'),(12654,469,1,1119,'2.99','2005-05-31 16:34:27','2006-02-15 22:19:32'),(12655,469,2,1399,'0.99','2005-06-15 16:29:51','2006-02-15 22:19:32'),(12656,469,1,1680,'9.99','2005-06-16 11:17:22','2006-02-15 22:19:32'),(12657,469,2,3522,'4.99','2005-07-06 01:00:21','2006-02-15 22:19:32'),(12658,469,1,3526,'10.99','2005-07-06 01:03:29','2006-02-15 22:19:32'),(12659,469,2,4067,'3.99','2005-07-07 04:34:23','2006-02-15 22:19:32'),(12660,469,2,4123,'0.99','2005-07-07 07:16:19','2006-02-15 22:19:32'),(12661,469,1,5133,'0.99','2005-07-09 07:43:22','2006-02-15 22:19:33'),(12662,469,1,5299,'3.99','2005-07-09 15:38:09','2006-02-15 22:19:33'),(12663,469,2,5664,'6.99','2005-07-10 08:04:41','2006-02-15 22:19:33'),(12664,469,2,6022,'0.99','2005-07-11 02:15:53','2006-02-15 22:19:33'),(12665,469,2,6099,'4.99','2005-07-11 06:24:44','2006-02-15 22:19:33'),(12666,469,1,6797,'4.99','2005-07-12 16:47:06','2006-02-15 22:19:33'),(12667,469,1,6955,'3.99','2005-07-26 23:55:48','2006-02-15 22:19:33'),(12668,469,2,7062,'6.99','2005-07-27 03:52:01','2006-02-15 22:19:33'),(12669,469,2,7271,'6.99','2005-07-27 11:29:11','2006-02-15 22:19:33'),(12670,469,2,7756,'4.99','2005-07-28 06:22:52','2006-02-15 22:19:33'),(12671,469,1,7914,'4.99','2005-07-28 11:48:08','2006-02-15 22:19:33'),(12672,469,2,8791,'0.99','2005-07-29 20:53:23','2006-02-15 22:19:33'),(12673,469,1,9187,'2.99','2005-07-30 12:14:03','2006-02-15 22:19:33'),(12674,469,2,10075,'4.99','2005-07-31 19:58:42','2006-02-15 22:19:33'),(12675,469,1,10258,'4.99','2005-08-01 02:51:09','2006-02-15 22:19:33'),(12676,469,1,10316,'4.99','2005-08-01 04:34:57','2006-02-15 22:19:33'),(12677,469,1,10658,'2.99','2005-08-01 16:39:18','2006-02-15 22:19:33'),(12678,469,1,10741,'2.99','2005-08-01 19:52:52','2006-02-15 22:19:34'),(12679,469,2,11185,'0.99','2005-08-02 11:04:35','2006-02-15 22:19:34'),(12680,469,2,12035,'0.99','2005-08-17 20:18:06','2006-02-15 22:19:34'),(12681,469,1,12447,'4.99','2005-08-18 10:57:01','2006-02-15 22:19:34'),(12682,469,1,12633,'6.99','2005-08-18 17:55:38','2006-02-15 22:19:34'),(12683,469,1,13654,'4.99','2005-08-20 07:58:21','2006-02-15 22:19:34'),(12684,469,1,13763,'2.99','2005-08-20 11:37:56','2006-02-15 22:19:34'),(12685,469,2,14197,'7.99','2005-08-21 03:47:25','2006-02-15 22:19:34'),(12686,469,2,14661,'2.99','2005-08-21 19:44:21','2006-02-15 22:19:34'),(12687,469,1,15487,'4.99','2005-08-23 02:05:51','2006-02-15 22:19:34'),(12688,469,1,15561,'9.99','2005-08-23 05:02:31','2006-02-15 22:19:34'),(12689,469,1,15851,'2.99','2005-08-23 15:46:33','2006-02-15 22:19:34'),(12690,470,2,60,'2.99','2005-05-25 08:58:25','2006-02-15 22:19:34'),(12691,470,2,1256,'0.99','2005-06-15 06:13:57','2006-02-15 22:19:34'),(12692,470,1,1283,'0.99','2005-06-15 08:27:30','2006-02-15 22:19:34'),(12693,470,2,1594,'7.99','2005-06-16 05:15:12','2006-02-15 22:19:34'),(12694,470,1,3764,'5.99','2005-07-06 13:01:03','2006-02-15 22:19:34'),(12695,470,1,3841,'4.99','2005-07-06 16:34:00','2006-02-15 22:19:35'),(12696,470,1,3922,'4.99','2005-07-06 20:32:27','2006-02-15 22:19:35'),(12697,470,1,4373,'4.99','2005-07-07 20:10:59','2006-02-15 22:19:35'),(12698,470,2,4502,'6.99','2005-07-08 02:12:04','2006-02-15 22:19:35'),(12699,470,2,5082,'4.99','2005-07-09 05:28:38','2006-02-15 22:19:35'),(12700,470,1,6009,'3.99','2005-07-11 01:51:58','2006-02-15 22:19:35'),(12701,470,1,6198,'2.99','2005-07-11 12:12:17','2006-02-15 22:19:35'),(12702,470,2,6703,'4.99','2005-07-12 12:50:19','2006-02-15 22:19:35'),(12703,470,1,6927,'10.99','2005-07-26 22:56:00','2006-02-15 22:19:35'),(12704,470,1,6942,'5.99','2005-07-26 23:27:40','2006-02-15 22:19:35'),(12705,470,1,7663,'4.99','2005-07-28 02:19:48','2006-02-15 22:19:35'),(12706,470,2,8476,'8.99','2005-07-29 08:39:12','2006-02-15 22:19:35'),(12707,470,1,8890,'6.99','2005-07-30 00:42:06','2006-02-15 22:19:35'),(12708,470,1,9422,'5.99','2005-07-30 21:08:41','2006-02-15 22:19:35'),(12709,470,1,9687,'2.99','2005-07-31 06:52:54','2006-02-15 22:19:35'),(12710,470,1,10006,'4.99','2005-07-31 17:54:35','2006-02-15 22:19:35'),(12711,470,1,10236,'0.99','2005-08-01 02:05:34','2006-02-15 22:19:35'),(12712,470,2,10944,'4.99','2005-08-02 03:20:03','2006-02-15 22:19:36'),(12713,470,2,11397,'1.99','2005-08-02 18:53:14','2006-02-15 22:19:36'),(12714,470,2,11711,'2.99','2005-08-17 07:30:55','2006-02-15 22:19:36'),(12715,470,1,11742,'0.99','2005-08-17 08:48:43','2006-02-15 22:19:36'),(12716,470,2,12177,'3.99','2005-08-18 01:15:47','2006-02-15 22:19:36'),(12717,470,2,12423,'8.99','2005-08-18 10:14:52','2006-02-15 22:19:36'),(12718,470,1,12753,'10.99','2005-08-18 22:37:39','2006-02-15 22:19:36'),(12719,470,2,13585,'4.99','2005-08-20 05:32:23','2006-02-15 22:19:36'),(12720,470,1,13592,'4.99','2005-08-20 05:50:35','2006-02-15 22:19:36'),(12721,470,2,14405,'4.99','2005-08-21 10:45:01','2006-02-15 22:19:36'),(12722,471,1,616,'2.99','2005-05-28 15:45:39','2006-02-15 22:19:36'),(12723,471,1,1447,'4.99','2005-06-15 19:13:51','2006-02-15 22:19:36'),(12724,471,2,1449,'2.99','2005-06-15 19:19:16','2006-02-15 22:19:36'),(12725,471,2,2165,'2.99','2005-06-17 23:51:10','2006-02-15 22:19:36'),(12726,471,2,2350,'4.99','2005-06-18 12:25:29','2006-02-15 22:19:36'),(12727,471,2,3073,'4.99','2005-06-20 14:33:26','2006-02-15 22:19:36'),(12728,471,1,3917,'0.99','2005-07-06 20:19:29','2006-02-15 22:19:36'),(12729,471,1,4020,'2.99','2005-07-07 01:42:22','2006-02-15 22:19:37'),(12730,471,2,6293,'2.99','2005-07-11 17:24:57','2006-02-15 22:19:37'),(12731,471,1,6336,'8.99','2005-07-11 19:30:13','2006-02-15 22:19:37'),(12732,471,1,6912,'5.99','2005-07-12 22:17:16','2006-02-15 22:19:37'),(12733,471,1,8199,'0.99','2005-07-28 23:10:25','2006-02-15 22:19:37'),(12734,471,1,9077,'2.99','2005-07-30 08:00:19','2006-02-15 22:19:37'),(12735,471,1,9502,'0.99','2005-07-31 00:02:10','2006-02-15 22:19:37'),(12736,471,2,9560,'2.99','2005-07-31 02:17:27','2006-02-15 22:19:37'),(12737,471,1,10430,'2.99','2005-08-01 08:37:06','2006-02-15 22:19:37'),(12738,471,2,10828,'3.99','2005-08-01 23:16:10','2006-02-15 22:19:37'),(12739,471,2,11601,'4.99','2005-08-17 03:14:47','2006-02-15 22:19:37'),(12740,471,1,12271,'4.99','2005-08-18 04:33:11','2006-02-15 22:19:37'),(12741,471,1,13661,'5.99','2005-08-20 08:05:59','2006-02-15 22:19:37'),(12742,471,1,14085,'7.99','2005-08-20 23:46:24','2006-02-15 22:19:37'),(12743,471,1,14094,'4.99','2005-08-21 00:21:35','2006-02-15 22:19:37'),(12744,471,1,14317,'5.99','2005-08-21 08:00:40','2006-02-15 22:19:37'),(12745,471,2,14538,'2.99','2005-08-21 15:28:15','2006-02-15 22:19:37'),(12746,471,2,14942,'7.99','2005-08-22 05:58:27','2006-02-15 22:19:38'),(12747,471,2,15184,'0.99','2005-08-22 15:51:12','2006-02-15 22:19:38'),(12748,471,1,15654,'1.99','2005-08-23 08:34:53','2006-02-15 22:19:38'),(12749,472,2,142,'0.99','2005-05-25 23:43:47','2006-02-15 22:19:38'),(12750,472,2,249,'2.99','2005-05-26 14:19:09','2006-02-15 22:19:38'),(12751,472,2,800,'0.99','2005-05-29 17:28:12','2006-02-15 22:19:38'),(12752,472,2,994,'4.99','2005-05-30 23:55:36','2006-02-15 22:19:38'),(12753,472,1,1389,'4.99','2005-06-15 15:49:01','2006-02-15 22:19:38'),(12754,472,2,1776,'6.99','2005-06-16 18:46:58','2006-02-15 22:19:38'),(12755,472,1,2538,'5.99','2005-06-19 01:56:59','2006-02-15 22:19:38'),(12756,472,1,2974,'0.99','2005-06-20 08:00:24','2006-02-15 22:19:38'),(12757,472,1,2991,'4.99','2005-06-20 09:10:43','2006-02-15 22:19:38'),(12758,472,1,3254,'0.99','2005-06-21 03:27:10','2006-02-15 22:19:38'),(12759,472,2,3815,'6.99','2005-07-06 15:26:36','2006-02-15 22:19:38'),(12760,472,2,5318,'2.99','2005-07-09 16:11:33','2006-02-15 22:19:38'),(12761,472,1,5612,'3.99','2005-07-10 05:15:12','2006-02-15 22:19:38'),(12762,472,1,6119,'6.99','2005-07-11 07:44:46','2006-02-15 22:19:38'),(12763,472,2,6274,'5.99','2005-07-11 16:09:42','2006-02-15 22:19:38'),(12764,472,1,6308,'5.99','2005-07-11 18:08:41','2006-02-15 22:19:39'),(12765,472,1,6584,'2.99','2005-07-12 06:43:36','2006-02-15 22:19:39'),(12766,472,2,8929,'5.99','2005-07-30 02:28:22','2006-02-15 22:19:39'),(12767,472,2,9926,'6.99','2005-07-31 15:11:51','2006-02-15 22:19:39'),(12768,472,1,10282,'6.99','2005-08-01 03:29:10','2006-02-15 22:19:39'),(12769,472,1,10627,'0.99','2005-08-01 15:33:03','2006-02-15 22:19:39'),(12770,472,1,11911,'6.99','2005-08-17 15:51:35','2006-02-15 22:19:39'),(12771,472,2,12763,'4.99','2005-08-18 23:07:01','2006-02-15 22:19:39'),(12772,472,2,13188,'8.99','2005-08-19 14:27:03','2006-02-15 22:19:39'),(12773,472,1,14209,'4.99','2005-08-21 04:17:56','2006-02-15 22:19:39'),(12774,472,2,14596,'4.99','2005-08-21 17:38:37','2006-02-15 22:19:39'),(12775,472,1,14597,'4.99','2005-08-21 17:39:41','2006-02-15 22:19:39'),(12776,472,2,15185,'5.99','2005-08-22 15:52:50','2006-02-15 22:19:39'),(12777,472,2,15278,'2.99','2005-08-22 19:06:47','2006-02-15 22:19:39'),(12778,472,2,14928,'4.99','2006-02-14 15:16:03','2006-02-15 22:19:39'),(12779,473,1,348,'4.99','2005-05-27 04:50:56','2006-02-15 22:19:39'),(12780,473,2,942,'2.99','2005-05-30 15:05:47','2006-02-15 22:19:39'),(12781,473,2,973,'3.99','2005-05-30 20:27:45','2006-02-15 22:19:40'),(12782,473,2,1748,'0.99','2005-06-16 16:54:03','2006-02-15 22:19:40'),(12783,473,1,2125,'2.99','2005-06-17 20:53:42','2006-02-15 22:19:40'),(12784,473,2,2553,'4.99','2005-06-19 03:04:59','2006-02-15 22:19:40'),(12785,473,2,2748,'4.99','2005-06-19 16:22:26','2006-02-15 22:19:40'),(12786,473,1,3971,'0.99','2005-07-06 22:50:40','2006-02-15 22:19:40'),(12787,473,2,4006,'4.99','2005-07-07 00:25:29','2006-02-15 22:19:40'),(12788,473,2,4625,'4.99','2005-07-08 08:14:26','2006-02-15 22:19:40'),(12789,473,1,4873,'0.99','2005-07-08 19:23:32','2006-02-15 22:19:40'),(12790,473,2,5447,'5.99','2005-07-09 22:09:28','2006-02-15 22:19:40'),(12791,473,1,6446,'2.99','2005-07-12 00:44:08','2006-02-15 22:19:40'),(12792,473,2,6890,'4.99','2005-07-12 21:03:03','2006-02-15 22:19:40'),(12793,473,1,7111,'4.99','2005-07-27 05:38:16','2006-02-15 22:19:40'),(12794,473,1,7215,'2.99','2005-07-27 09:24:00','2006-02-15 22:19:40'),(12795,473,2,7918,'1.99','2005-07-28 11:58:53','2006-02-15 22:19:40'),(12796,473,2,7928,'7.99','2005-07-28 12:15:51','2006-02-15 22:19:40'),(12797,473,1,9025,'4.99','2005-07-30 05:50:08','2006-02-15 22:19:40'),(12798,473,2,9120,'8.99','2005-07-30 09:26:08','2006-02-15 22:19:41'),(12799,473,1,10867,'2.99','2005-08-02 00:24:15','2006-02-15 22:19:41'),(12800,473,2,11006,'2.99','2005-08-02 05:05:52','2006-02-15 22:19:41'),(12801,473,1,11216,'4.99','2005-08-02 12:23:43','2006-02-15 22:19:41'),(12802,473,1,11336,'0.99','2005-08-02 16:58:56','2006-02-15 22:19:41'),(12803,473,2,11421,'7.99','2005-08-02 19:51:53','2006-02-15 22:19:41'),(12804,473,1,11741,'0.99','2005-08-17 08:48:39','2006-02-15 22:19:41'),(12805,473,2,13984,'4.99','2005-08-20 19:12:30','2006-02-15 22:19:41'),(12806,473,2,14202,'0.99','2005-08-21 03:51:52','2006-02-15 22:19:41'),(12807,473,2,14550,'0.99','2005-08-21 15:56:39','2006-02-15 22:19:41'),(12808,473,2,14658,'4.99','2005-08-21 19:41:50','2006-02-15 22:19:41'),(12809,473,2,14757,'4.99','2005-08-21 23:23:37','2006-02-15 22:19:41'),(12810,473,1,15118,'4.99','2005-08-22 12:38:37','2006-02-15 22:19:41'),(12811,473,2,15400,'2.99','2005-08-22 23:13:03','2006-02-15 22:19:41'),(12812,473,2,16024,'4.99','2005-08-23 21:46:47','2006-02-15 22:19:41'),(12813,474,1,816,'7.99','2005-05-29 20:26:39','2006-02-15 22:19:41'),(12814,474,1,1758,'8.99','2005-06-16 17:39:39','2006-02-15 22:19:41'),(12815,474,2,2944,'7.99','2005-06-20 05:43:42','2006-02-15 22:19:42'),(12816,474,2,3787,'4.99','2005-07-06 14:02:01','2006-02-15 22:19:42'),(12817,474,2,4048,'1.99','2005-07-07 03:30:52','2006-02-15 22:19:42'),(12818,474,1,4481,'2.99','2005-07-08 00:58:15','2006-02-15 22:19:42'),(12819,474,1,4533,'0.99','2005-07-08 03:32:01','2006-02-15 22:19:42'),(12820,474,2,4785,'0.99','2005-07-08 16:10:19','2006-02-15 22:19:42'),(12821,474,1,4809,'2.99','2005-07-08 17:03:22','2006-02-15 22:19:42'),(12822,474,2,4886,'4.99','2005-07-08 19:53:22','2006-02-15 22:19:42'),(12823,474,1,5251,'0.99','2005-07-09 13:36:10','2006-02-15 22:19:42'),(12824,474,1,6499,'7.99','2005-07-12 03:11:18','2006-02-15 22:19:42'),(12825,474,1,8991,'2.99','2005-07-30 04:42:54','2006-02-15 22:19:42'),(12826,474,2,10376,'5.99','2005-08-01 06:27:13','2006-02-15 22:19:42'),(12827,474,2,11117,'0.99','2005-08-02 08:36:03','2006-02-15 22:19:42'),(12828,474,1,11489,'2.99','2005-08-02 22:35:28','2006-02-15 22:19:42'),(12829,474,2,11537,'2.99','2005-08-17 00:41:08','2006-02-15 22:19:42'),(12830,474,1,12083,'2.99','2005-08-17 22:13:37','2006-02-15 22:19:42'),(12831,474,1,12236,'4.99','2005-08-18 03:19:29','2006-02-15 22:19:43'),(12832,474,1,12440,'0.99','2005-08-18 10:47:35','2006-02-15 22:19:43'),(12833,474,2,12597,'2.99','2005-08-18 16:34:02','2006-02-15 22:19:43'),(12834,474,1,12702,'4.99','2005-08-18 20:30:33','2006-02-15 22:19:43'),(12835,474,1,14728,'0.99','2005-08-21 22:15:36','2006-02-15 22:19:43'),(12836,474,2,15046,'4.99','2005-08-22 09:54:54','2006-02-15 22:19:43'),(12837,474,1,15558,'6.99','2005-08-23 04:52:22','2006-02-15 22:19:43'),(12838,474,1,11909,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:43'),(12839,475,2,417,'4.99','2005-05-27 15:07:27','2006-02-15 22:19:43'),(12840,475,1,702,'0.99','2005-05-29 02:27:30','2006-02-15 22:19:43'),(12841,475,2,3980,'5.99','2005-07-06 23:11:11','2006-02-15 22:19:43'),(12842,475,1,4013,'6.99','2005-07-07 00:58:00','2006-02-15 22:19:43'),(12843,475,1,4617,'4.99','2005-07-08 07:55:08','2006-02-15 22:19:43'),(12844,475,2,5379,'0.99','2005-07-09 19:08:03','2006-02-15 22:19:43'),(12845,475,1,5407,'0.99','2005-07-09 20:16:07','2006-02-15 22:19:43'),(12846,475,2,5415,'9.99','2005-07-09 20:30:03','2006-02-15 22:19:43'),(12847,475,2,5469,'2.99','2005-07-09 23:08:07','2006-02-15 22:19:43'),(12848,475,1,6224,'4.99','2005-07-11 13:42:18','2006-02-15 22:19:44'),(12849,475,1,7641,'7.99','2005-07-28 01:15:45','2006-02-15 22:19:44'),(12850,475,1,7775,'1.99','2005-07-28 07:04:36','2006-02-15 22:19:44'),(12851,475,2,8207,'5.99','2005-07-28 23:26:31','2006-02-15 22:19:44'),(12852,475,1,9183,'7.99','2005-07-30 12:09:56','2006-02-15 22:19:44'),(12853,475,1,9647,'2.99','2005-07-31 05:45:15','2006-02-15 22:19:44'),(12854,475,1,9737,'2.99','2005-07-31 08:59:18','2006-02-15 22:19:44'),(12855,475,2,10162,'3.99','2005-07-31 23:11:01','2006-02-15 22:19:44'),(12856,475,1,10357,'0.99','2005-08-01 05:49:49','2006-02-15 22:19:44'),(12857,475,1,10633,'3.99','2005-08-01 15:37:17','2006-02-15 22:19:44'),(12858,475,1,11293,'5.99','2005-08-02 15:00:43','2006-02-15 22:19:44'),(12859,475,1,11770,'4.99','2005-08-17 10:05:05','2006-02-15 22:19:44'),(12860,475,2,14303,'2.99','2005-08-21 07:22:43','2006-02-15 22:19:44'),(12861,475,1,15097,'1.99','2005-08-22 11:43:42','2006-02-15 22:19:44'),(12862,475,1,15288,'4.99','2005-08-22 19:23:58','2006-02-15 22:19:44'),(12863,476,1,489,'4.99','2005-05-28 00:09:12','2006-02-15 22:19:44'),(12864,476,1,771,'2.99','2005-05-29 12:59:14','2006-02-15 22:19:44'),(12865,476,1,1682,'3.99','2005-06-16 11:54:25','2006-02-15 22:19:44'),(12866,476,1,2080,'0.99','2005-06-17 16:59:40','2006-02-15 22:19:45'),(12867,476,2,2508,'4.99','2005-06-18 23:43:58','2006-02-15 22:19:45'),(12868,476,2,3448,'2.99','2005-06-21 20:59:20','2006-02-15 22:19:45'),(12869,476,2,3477,'7.99','2005-07-05 23:05:17','2006-02-15 22:19:45'),(12870,476,1,4010,'5.99','2005-07-07 00:47:00','2006-02-15 22:19:45'),(12871,476,2,4171,'4.99','2005-07-07 09:49:04','2006-02-15 22:19:45'),(12872,476,2,5644,'4.99','2005-07-10 06:57:44','2006-02-15 22:19:45'),(12873,476,1,6151,'2.99','2005-07-11 09:25:17','2006-02-15 22:19:45'),(12874,476,1,7461,'0.99','2005-07-27 18:45:15','2006-02-15 22:19:45'),(12875,476,1,8146,'0.99','2005-07-28 20:37:36','2006-02-15 22:19:45'),(12876,476,2,9325,'6.99','2005-07-30 17:29:19','2006-02-15 22:19:45'),(12877,476,2,9743,'3.99','2005-07-31 09:12:42','2006-02-15 22:19:45'),(12878,476,1,10346,'4.99','2005-08-01 05:19:23','2006-02-15 22:19:45'),(12879,476,1,10617,'9.99','2005-08-01 15:05:52','2006-02-15 22:19:45'),(12880,476,1,10826,'6.99','2005-08-01 23:07:56','2006-02-15 22:19:45'),(12881,476,1,12616,'4.99','2005-08-18 17:22:41','2006-02-15 22:19:45'),(12882,476,2,12709,'5.99','2005-08-18 20:59:51','2006-02-15 22:19:46'),(12883,476,1,15413,'0.99','2005-08-22 23:38:01','2006-02-15 22:19:46'),(12884,476,1,13941,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:46'),(12885,477,1,882,'2.99','2005-05-30 06:16:06','2006-02-15 22:19:46'),(12886,477,1,1714,'6.99','2005-06-16 14:29:59','2006-02-15 22:19:46'),(12887,477,1,2187,'2.99','2005-06-18 01:17:27','2006-02-15 22:19:46'),(12888,477,1,2306,'10.99','2005-06-18 08:33:23','2006-02-15 22:19:46'),(12889,477,2,2676,'4.99','2005-06-19 11:54:57','2006-02-15 22:19:46'),(12890,477,2,4237,'5.99','2005-07-07 13:16:55','2006-02-15 22:19:46'),(12891,477,1,4283,'2.99','2005-07-07 15:29:35','2006-02-15 22:19:46'),(12892,477,2,4956,'7.99','2005-07-08 23:17:10','2006-02-15 22:19:46'),(12893,477,2,6265,'2.99','2005-07-11 15:43:51','2006-02-15 22:19:46'),(12894,477,2,7302,'2.99','2005-07-27 12:52:13','2006-02-15 22:19:46'),(12895,477,2,7904,'10.99','2005-07-28 11:25:39','2006-02-15 22:19:46'),(12896,477,1,8515,'6.99','2005-07-29 09:55:20','2006-02-15 22:19:46'),(12897,477,1,8821,'5.99','2005-07-29 22:18:12','2006-02-15 22:19:46'),(12898,477,2,8857,'2.99','2005-07-29 23:44:22','2006-02-15 22:19:46'),(12899,477,2,9446,'8.99','2005-07-30 21:53:01','2006-02-15 22:19:46'),(12900,477,1,10500,'4.99','2005-08-01 11:01:01','2006-02-15 22:19:47'),(12901,477,2,10912,'0.99','2005-08-02 02:00:03','2006-02-15 22:19:47'),(12902,477,2,12420,'4.99','2005-08-18 10:01:50','2006-02-15 22:19:47'),(12903,477,1,13002,'0.99','2005-08-19 07:37:58','2006-02-15 22:19:47'),(12904,477,2,14552,'3.99','2005-08-21 15:59:27','2006-02-15 22:19:47'),(12905,477,2,15091,'2.99','2005-08-22 11:34:43','2006-02-15 22:19:47'),(12906,477,1,15929,'2.99','2005-08-23 18:23:30','2006-02-15 22:19:47'),(12907,478,1,1708,'0.99','2005-06-16 14:08:44','2006-02-15 22:19:47'),(12908,478,2,2358,'4.99','2005-06-18 13:00:51','2006-02-15 22:19:47'),(12909,478,1,2529,'6.99','2005-06-19 01:18:27','2006-02-15 22:19:47'),(12910,478,2,2616,'8.99','2005-06-19 07:33:00','2006-02-15 22:19:47'),(12911,478,2,2765,'4.99','2005-06-19 17:34:39','2006-02-15 22:19:47'),(12912,478,2,3259,'4.99','2005-06-21 03:57:15','2006-02-15 22:19:47'),(12913,478,1,3691,'4.99','2005-07-06 09:46:12','2006-02-15 22:19:47'),(12914,478,1,5837,'4.99','2005-07-10 16:57:50','2006-02-15 22:19:47'),(12915,478,1,7522,'2.99','2005-07-27 21:11:03','2006-02-15 22:19:47'),(12916,478,2,8488,'4.99','2005-07-29 08:57:38','2006-02-15 22:19:48'),(12917,478,1,9665,'4.99','2005-07-31 06:17:33','2006-02-15 22:19:48'),(12918,478,2,10016,'4.99','2005-07-31 18:13:06','2006-02-15 22:19:48'),(12919,478,2,10127,'0.99','2005-07-31 21:39:48','2006-02-15 22:19:48'),(12920,478,1,11906,'2.99','2005-08-17 15:40:46','2006-02-15 22:19:48'),(12921,478,2,13162,'2.99','2005-08-19 13:28:26','2006-02-15 22:19:48'),(12922,478,2,13507,'4.99','2005-08-20 02:10:27','2006-02-15 22:19:48'),(12923,478,1,15027,'4.99','2005-08-22 09:03:04','2006-02-15 22:19:48'),(12924,478,2,15188,'4.99','2005-08-22 15:55:48','2006-02-15 22:19:48'),(12925,478,1,15724,'4.99','2005-08-23 11:22:09','2006-02-15 22:19:48'),(12926,479,2,132,'3.99','2005-05-25 21:46:54','2006-02-15 22:19:48'),(12927,479,1,709,'7.99','2005-05-29 03:48:01','2006-02-15 22:19:48'),(12928,479,1,1902,'2.99','2005-06-17 04:35:52','2006-02-15 22:19:48'),(12929,479,2,1947,'3.99','2005-06-17 08:02:20','2006-02-15 22:19:48'),(12930,479,2,1987,'2.99','2005-06-17 10:40:36','2006-02-15 22:19:48'),(12931,479,2,2071,'3.99','2005-06-17 16:33:17','2006-02-15 22:19:48'),(12932,479,2,2376,'2.99','2005-06-18 14:55:30','2006-02-15 22:19:48'),(12933,479,2,2764,'6.99','2005-06-19 17:27:25','2006-02-15 22:19:49'),(12934,479,2,3537,'6.99','2005-07-06 01:36:53','2006-02-15 22:19:49'),(12935,479,1,3798,'0.99','2005-07-06 14:57:53','2006-02-15 22:19:49'),(12936,479,2,4183,'8.99','2005-07-07 10:28:33','2006-02-15 22:19:49'),(12937,479,1,5481,'0.99','2005-07-09 23:51:57','2006-02-15 22:19:49'),(12938,479,1,5751,'4.99','2005-07-10 12:25:11','2006-02-15 22:19:49'),(12939,479,2,6084,'7.99','2005-07-11 05:16:20','2006-02-15 22:19:49'),(12940,479,1,6421,'1.99','2005-07-11 23:45:25','2006-02-15 22:19:49'),(12941,479,1,6597,'0.99','2005-07-12 07:37:02','2006-02-15 22:19:49'),(12942,479,2,6849,'8.99','2005-07-12 19:29:19','2006-02-15 22:19:49'),(12943,479,1,7060,'7.99','2005-07-27 03:51:04','2006-02-15 22:19:49'),(12944,479,2,7893,'2.99','2005-07-28 10:49:27','2006-02-15 22:19:49'),(12945,479,1,9347,'5.99','2005-07-30 18:16:03','2006-02-15 22:19:49'),(12946,479,1,9439,'8.99','2005-07-30 21:38:12','2006-02-15 22:19:49'),(12947,479,2,9697,'2.99','2005-07-31 07:23:11','2006-02-15 22:19:49'),(12948,479,2,9754,'7.99','2005-07-31 09:23:43','2006-02-15 22:19:49'),(12949,479,2,10303,'4.99','2005-08-01 04:13:33','2006-02-15 22:19:49'),(12950,479,2,11109,'4.99','2005-08-02 08:20:29','2006-02-15 22:19:50'),(12951,479,2,11584,'1.99','2005-08-17 02:13:26','2006-02-15 22:19:50'),(12952,479,2,11835,'4.99','2005-08-17 13:03:13','2006-02-15 22:19:50'),(12953,479,2,12401,'0.99','2005-08-18 09:20:51','2006-02-15 22:19:50'),(12954,479,2,13078,'8.99','2005-08-19 10:16:43','2006-02-15 22:19:50'),(12955,479,1,13974,'2.99','2005-08-20 18:54:59','2006-02-15 22:19:50'),(12956,479,1,12101,'0.99','2006-02-14 15:16:03','2006-02-15 22:19:50'),(12957,480,1,518,'0.99','2005-05-28 03:18:02','2006-02-15 22:19:50'),(12958,480,1,720,'6.99','2005-05-29 05:17:30','2006-02-15 22:19:50'),(12959,480,2,822,'9.99','2005-05-29 21:36:00','2006-02-15 22:19:50'),(12960,480,1,1353,'0.99','2005-06-15 13:13:36','2006-02-15 22:19:50'),(12961,480,1,1733,'0.99','2005-06-16 15:37:07','2006-02-15 22:19:50'),(12962,480,2,3507,'7.99','2005-07-06 00:23:43','2006-02-15 22:19:50'),(12963,480,2,5633,'2.99','2005-07-10 06:22:24','2006-02-15 22:19:50'),(12964,480,1,6191,'2.99','2005-07-11 11:37:52','2006-02-15 22:19:50'),(12965,480,1,7257,'2.99','2005-07-27 11:04:17','2006-02-15 22:19:50'),(12966,480,2,7910,'9.99','2005-07-28 11:44:56','2006-02-15 22:19:50'),(12967,480,2,8847,'4.99','2005-07-29 23:13:41','2006-02-15 22:19:51'),(12968,480,1,8967,'6.99','2005-07-30 03:56:55','2006-02-15 22:19:51'),(12969,480,2,9332,'4.99','2005-07-30 17:53:39','2006-02-15 22:19:51'),(12970,480,2,10808,'1.99','2005-08-01 22:37:11','2006-02-15 22:19:51'),(12971,480,2,11017,'0.99','2005-08-02 05:19:51','2006-02-15 22:19:51'),(12972,480,1,11369,'5.99','2005-08-02 18:04:41','2006-02-15 22:19:51'),(12973,480,2,12905,'4.99','2005-08-19 04:13:37','2006-02-15 22:19:51'),(12974,480,2,13092,'0.99','2005-08-19 10:41:09','2006-02-15 22:19:51'),(12975,480,2,13131,'9.99','2005-08-19 12:08:13','2006-02-15 22:19:51'),(12976,480,1,13831,'4.99','2005-08-20 13:59:35','2006-02-15 22:19:51'),(12977,480,2,15363,'2.99','2005-08-22 21:41:40','2006-02-15 22:19:51'),(12978,480,2,15579,'4.99','2005-08-23 05:38:41','2006-02-15 22:19:51'),(12979,481,2,1109,'5.99','2005-05-31 15:12:15','2006-02-15 22:19:51'),(12980,481,2,1168,'2.99','2005-06-14 23:35:09','2006-02-15 22:19:51'),(12981,481,2,2296,'4.99','2005-06-18 08:10:42','2006-02-15 22:19:51'),(12982,481,2,3285,'4.99','2005-06-21 06:30:13','2006-02-15 22:19:51'),(12983,481,2,3293,'0.99','2005-06-21 06:59:33','2006-02-15 22:19:51'),(12984,481,1,3863,'0.99','2005-07-06 17:40:18','2006-02-15 22:19:52'),(12985,481,1,4473,'2.99','2005-07-08 00:22:10','2006-02-15 22:19:52'),(12986,481,1,4505,'1.99','2005-07-08 02:20:04','2006-02-15 22:19:52'),(12987,481,1,4532,'0.99','2005-07-08 03:30:39','2006-02-15 22:19:52'),(12988,481,1,4668,'10.99','2005-07-08 10:11:45','2006-02-15 22:19:52'),(12989,481,2,5711,'2.99','2005-07-10 10:37:20','2006-02-15 22:19:52'),(12990,481,1,6044,'0.99','2005-07-11 03:18:39','2006-02-15 22:19:52'),(12991,481,1,7228,'4.99','2005-07-27 09:55:33','2006-02-15 22:19:52'),(12992,481,2,7836,'7.99','2005-07-28 08:55:27','2006-02-15 22:19:52'),(12993,481,1,8243,'6.99','2005-07-29 00:35:33','2006-02-15 22:19:52'),(12994,481,2,8271,'6.99','2005-07-29 01:27:44','2006-02-15 22:19:52'),(12995,481,1,9481,'4.99','2005-07-30 23:26:05','2006-02-15 22:19:52'),(12996,481,1,10018,'3.99','2005-07-31 18:15:14','2006-02-15 22:19:52'),(12997,481,2,11207,'0.99','2005-08-02 12:01:30','2006-02-15 22:19:52'),(12998,481,2,11387,'2.99','2005-08-02 18:32:38','2006-02-15 22:19:52'),(12999,481,1,11752,'4.99','2005-08-17 09:10:55','2006-02-15 22:19:52'),(13000,481,1,11885,'4.99','2005-08-17 14:53:53','2006-02-15 22:19:53'),(13001,481,2,12160,'2.99','2005-08-18 00:37:59','2006-02-15 22:19:53'),(13002,481,1,12981,'4.99','2005-08-19 07:04:00','2006-02-15 22:19:53'),(13003,481,2,13497,'2.99','2005-08-20 01:46:38','2006-02-15 22:19:53'),(13004,481,2,13878,'4.99','2005-08-20 15:17:38','2006-02-15 22:19:53'),(13005,481,1,13990,'1.99','2005-08-20 19:29:23','2006-02-15 22:19:53'),(13006,481,2,14280,'4.99','2005-08-21 06:39:58','2006-02-15 22:19:53'),(13007,481,2,14584,'0.99','2005-08-21 17:15:33','2006-02-15 22:19:53'),(13008,482,1,259,'8.99','2005-05-26 15:32:46','2006-02-15 22:19:53'),(13009,482,2,680,'2.99','2005-05-28 23:27:26','2006-02-15 22:19:53'),(13010,482,2,879,'0.99','2005-05-30 05:49:42','2006-02-15 22:19:53'),(13011,482,2,3048,'2.99','2005-06-20 12:49:55','2006-02-15 22:19:53'),(13012,482,2,3255,'0.99','2005-06-21 03:39:52','2006-02-15 22:19:53'),(13013,482,2,3650,'2.99','2005-07-06 07:34:15','2006-02-15 22:19:53'),(13014,482,1,4768,'4.99','2005-07-08 15:28:20','2006-02-15 22:19:53'),(13015,482,1,5334,'4.99','2005-07-09 17:00:13','2006-02-15 22:19:53'),(13016,482,1,5466,'4.99','2005-07-09 23:03:21','2006-02-15 22:19:53'),(13017,482,2,5810,'8.99','2005-07-10 15:22:04','2006-02-15 22:19:54'),(13018,482,2,5880,'2.99','2005-07-10 19:14:58','2006-02-15 22:19:54'),(13019,482,1,6355,'8.99','2005-07-11 20:56:29','2006-02-15 22:19:54'),(13020,482,2,6447,'7.99','2005-07-12 00:45:17','2006-02-15 22:19:54'),(13021,482,2,6844,'5.99','2005-07-12 19:14:53','2006-02-15 22:19:54'),(13022,482,2,7840,'6.99','2005-07-28 09:03:02','2006-02-15 22:19:54'),(13023,482,2,8584,'2.99','2005-07-29 12:07:53','2006-02-15 22:19:54'),(13024,482,2,9874,'6.99','2005-07-31 13:32:31','2006-02-15 22:19:54'),(13025,482,2,10824,'4.99','2005-08-01 23:00:22','2006-02-15 22:19:54'),(13026,482,2,10839,'2.99','2005-08-01 23:37:39','2006-02-15 22:19:54'),(13027,482,2,11498,'6.99','2005-08-16 22:52:54','2006-02-15 22:19:54'),(13028,482,1,13174,'4.99','2005-08-19 13:52:50','2006-02-15 22:19:54'),(13029,482,2,14383,'4.99','2005-08-21 10:02:05','2006-02-15 22:19:54'),(13030,482,2,14732,'0.99','2005-08-21 22:22:29','2006-02-15 22:19:54'),(13031,482,2,14891,'6.99','2005-08-22 04:11:02','2006-02-15 22:19:54'),(13032,482,2,14995,'4.99','2005-08-22 07:52:31','2006-02-15 22:19:54'),(13033,482,1,15391,'0.99','2005-08-22 23:01:45','2006-02-15 22:19:54'),(13034,482,1,15849,'5.99','2005-08-23 15:41:20','2006-02-15 22:19:55'),(13035,482,2,15865,'2.99','2005-08-23 16:18:25','2006-02-15 22:19:55'),(13036,482,1,15879,'3.99','2005-08-23 16:42:53','2006-02-15 22:19:55'),(13037,483,2,742,'6.99','2005-05-29 08:36:30','2006-02-15 22:19:55'),(13038,483,1,2855,'4.99','2005-06-19 23:11:49','2006-02-15 22:19:55'),(13039,483,2,2867,'0.99','2005-06-20 00:08:38','2006-02-15 22:19:55'),(13040,483,1,3380,'8.99','2005-06-21 13:58:46','2006-02-15 22:19:55'),(13041,483,2,3559,'4.99','2005-07-06 02:49:42','2006-02-15 22:19:55'),(13042,483,1,5823,'4.99','2005-07-10 16:19:52','2006-02-15 22:19:55'),(13043,483,2,6478,'4.99','2005-07-12 01:41:44','2006-02-15 22:19:55'),(13044,483,2,6899,'9.99','2005-07-12 21:44:16','2006-02-15 22:19:55'),(13045,483,2,7137,'0.99','2005-07-27 06:40:41','2006-02-15 22:19:55'),(13046,483,1,7381,'4.99','2005-07-27 15:40:26','2006-02-15 22:19:55'),(13047,483,1,7669,'4.99','2005-07-28 02:44:07','2006-02-15 22:19:55'),(13048,483,1,8057,'7.99','2005-07-28 17:07:13','2006-02-15 22:19:55'),(13049,483,1,8356,'4.99','2005-07-29 04:58:56','2006-02-15 22:19:55'),(13050,483,2,10677,'0.99','2005-08-01 17:24:35','2006-02-15 22:19:55'),(13051,483,1,10953,'6.99','2005-08-02 03:28:38','2006-02-15 22:19:56'),(13052,483,2,12331,'3.99','2005-08-18 06:47:19','2006-02-15 22:19:56'),(13053,483,2,12695,'2.99','2005-08-18 20:11:35','2006-02-15 22:19:56'),(13054,483,2,12875,'2.99','2005-08-19 03:10:21','2006-02-15 22:19:56'),(13055,484,2,35,'4.99','2005-05-25 04:24:36','2006-02-15 22:19:56'),(13056,484,2,668,'2.99','2005-05-28 21:54:45','2006-02-15 22:19:56'),(13057,484,2,727,'2.99','2005-05-29 06:08:15','2006-02-15 22:19:56'),(13058,484,1,1351,'3.99','2005-06-15 12:51:03','2006-02-15 22:19:56'),(13059,484,2,1643,'3.99','2005-06-16 08:55:35','2006-02-15 22:19:56'),(13060,484,1,2015,'4.99','2005-06-17 12:16:29','2006-02-15 22:19:56'),(13061,484,1,2044,'5.99','2005-06-17 14:37:57','2006-02-15 22:19:56'),(13062,484,1,4214,'4.99','2005-07-07 11:54:33','2006-02-15 22:19:56'),(13063,484,1,5389,'2.99','2005-07-09 19:25:45','2006-02-15 22:19:56'),(13064,484,2,5708,'6.99','2005-07-10 10:29:19','2006-02-15 22:19:56'),(13065,484,1,5852,'0.99','2005-07-10 17:43:30','2006-02-15 22:19:56'),(13066,484,2,5866,'6.99','2005-07-10 18:35:14','2006-02-15 22:19:56'),(13067,484,2,5977,'5.99','2005-07-11 00:16:38','2006-02-15 22:19:56'),(13068,484,2,6296,'2.99','2005-07-11 17:34:04','2006-02-15 22:19:57'),(13069,484,1,6863,'6.99','2005-07-12 19:58:34','2006-02-15 22:19:57'),(13070,484,2,7440,'4.99','2005-07-27 17:43:27','2006-02-15 22:19:57'),(13071,484,2,7548,'2.99','2005-07-27 21:53:18','2006-02-15 22:19:57'),(13072,484,2,8508,'0.99','2005-07-29 09:34:38','2006-02-15 22:19:57'),(13073,484,2,9141,'5.99','2005-07-30 10:16:04','2006-02-15 22:19:57'),(13074,484,2,9414,'9.99','2005-07-30 20:46:02','2006-02-15 22:19:57'),(13075,484,1,9769,'4.99','2005-07-31 09:52:16','2006-02-15 22:19:57'),(13076,484,2,10166,'8.99','2005-07-31 23:22:20','2006-02-15 22:19:57'),(13077,484,2,11871,'4.99','2005-08-17 14:11:44','2006-02-15 22:19:57'),(13078,484,1,12024,'0.99','2005-08-17 19:57:34','2006-02-15 22:19:57'),(13079,484,1,12771,'4.99','2005-08-18 23:29:23','2006-02-15 22:19:57'),(13080,484,1,12993,'7.99','2005-08-19 07:24:03','2006-02-15 22:19:57'),(13081,484,2,13160,'0.99','2005-08-19 13:21:04','2006-02-15 22:19:57'),(13082,484,2,13956,'3.99','2005-08-20 18:08:19','2006-02-15 22:19:57'),(13083,484,1,15607,'2.99','2005-08-23 06:54:06','2006-02-15 22:19:57'),(13084,484,1,16026,'4.99','2005-08-23 21:49:22','2006-02-15 22:19:58'),(13085,485,1,1009,'2.99','2005-05-31 01:47:35','2006-02-15 22:19:58'),(13086,485,2,1684,'2.99','2005-06-16 11:57:34','2006-02-15 22:19:58'),(13087,485,1,1721,'8.99','2005-06-16 15:01:36','2006-02-15 22:19:58'),(13088,485,2,3579,'0.99','2005-07-06 03:47:47','2006-02-15 22:19:58'),(13089,485,1,3899,'1.99','2005-07-06 19:12:40','2006-02-15 22:19:58'),(13090,485,1,3904,'0.99','2005-07-06 19:30:57','2006-02-15 22:19:58'),(13091,485,2,4137,'3.99','2005-07-07 08:17:06','2006-02-15 22:19:58'),(13092,485,2,4667,'2.99','2005-07-08 10:06:26','2006-02-15 22:19:58'),(13093,485,1,5193,'2.99','2005-07-09 10:28:18','2006-02-15 22:19:58'),(13094,485,1,5343,'3.99','2005-07-09 17:23:43','2006-02-15 22:19:58'),(13095,485,1,5367,'3.99','2005-07-09 18:39:15','2006-02-15 22:19:58'),(13096,485,1,5820,'4.99','2005-07-10 16:04:59','2006-02-15 22:19:58'),(13097,485,2,6810,'4.99','2005-07-12 17:54:19','2006-02-15 22:19:58'),(13098,485,2,6902,'4.99','2005-07-12 21:57:16','2006-02-15 22:19:58'),(13099,485,1,7144,'4.99','2005-07-27 07:00:37','2006-02-15 22:19:58'),(13100,485,2,8984,'6.99','2005-07-30 04:31:50','2006-02-15 22:19:58'),(13101,485,2,9039,'2.99','2005-07-30 06:24:28','2006-02-15 22:19:59'),(13102,485,1,9053,'4.99','2005-07-30 07:07:39','2006-02-15 22:19:59'),(13103,485,2,9189,'2.99','2005-07-30 12:20:59','2006-02-15 22:19:59'),(13104,485,1,9535,'2.99','2005-07-31 01:18:53','2006-02-15 22:19:59'),(13105,485,1,9565,'0.99','2005-07-31 02:32:00','2006-02-15 22:19:59'),(13106,485,1,10771,'4.99','2005-08-01 20:49:35','2006-02-15 22:19:59'),(13107,485,2,10772,'6.99','2005-08-01 20:51:10','2006-02-15 22:19:59'),(13108,485,2,11188,'3.99','2005-08-02 11:17:11','2006-02-15 22:19:59'),(13109,485,1,11921,'4.99','2005-08-17 16:12:27','2006-02-15 22:19:59'),(13110,485,1,11974,'2.99','2005-08-17 17:56:48','2006-02-15 22:19:59'),(13111,485,2,12261,'8.99','2005-08-18 04:16:06','2006-02-15 22:19:59'),(13112,485,2,12487,'0.99','2005-08-18 12:45:24','2006-02-15 22:19:59'),(13113,485,2,13055,'2.99','2005-08-19 09:36:28','2006-02-15 22:19:59'),(13114,486,1,909,'8.99','2005-05-30 10:43:38','2006-02-15 22:19:59'),(13115,486,2,946,'2.99','2005-05-30 15:35:08','2006-02-15 22:19:59'),(13116,486,2,1129,'0.99','2005-05-31 18:00:48','2006-02-15 22:19:59'),(13117,486,1,2036,'4.99','2005-06-17 13:46:52','2006-02-15 22:20:00'),(13118,486,1,2102,'5.99','2005-06-17 19:05:22','2006-02-15 22:20:00'),(13119,486,2,2566,'2.99','2005-06-19 03:45:39','2006-02-15 22:20:00'),(13120,486,2,2797,'2.99','2005-06-19 19:04:32','2006-02-15 22:20:00'),(13121,486,1,3835,'4.99','2005-07-06 16:22:45','2006-02-15 22:20:00'),(13122,486,2,4110,'4.99','2005-07-07 06:44:27','2006-02-15 22:20:00'),(13123,486,1,4205,'4.99','2005-07-07 11:25:39','2006-02-15 22:20:00'),(13124,486,1,4381,'2.99','2005-07-07 20:37:53','2006-02-15 22:20:00'),(13125,486,1,4772,'7.99','2005-07-08 15:41:11','2006-02-15 22:20:00'),(13126,486,2,5006,'4.99','2005-07-09 01:24:07','2006-02-15 22:20:00'),(13127,486,2,6383,'4.99','2005-07-11 22:06:53','2006-02-15 22:20:00'),(13128,486,2,7127,'4.99','2005-07-27 06:13:48','2006-02-15 22:20:00'),(13129,486,2,7446,'4.99','2005-07-27 18:00:24','2006-02-15 22:20:00'),(13130,486,2,8425,'8.99','2005-07-29 07:06:21','2006-02-15 22:20:00'),(13131,486,2,9142,'0.99','2005-07-30 10:21:03','2006-02-15 22:20:00'),(13132,486,1,10079,'2.99','2005-07-31 20:05:45','2006-02-15 22:20:00'),(13133,486,2,10902,'4.99','2005-08-02 01:35:46','2006-02-15 22:20:00'),(13134,486,1,12465,'0.99','2005-08-18 11:35:02','2006-02-15 22:20:01'),(13135,486,2,12609,'2.99','2005-08-18 17:06:22','2006-02-15 22:20:01'),(13136,486,1,13048,'4.99','2005-08-19 09:25:06','2006-02-15 22:20:01'),(13137,486,2,13803,'0.99','2005-08-20 12:46:17','2006-02-15 22:20:01'),(13138,486,2,14251,'4.99','2005-08-21 05:42:20','2006-02-15 22:20:01'),(13139,486,2,14284,'4.99','2005-08-21 06:44:37','2006-02-15 22:20:01'),(13140,487,2,3100,'3.99','2005-06-20 16:47:57','2006-02-15 22:20:01'),(13141,487,2,3994,'1.99','2005-07-06 23:39:01','2006-02-15 22:20:01'),(13142,487,2,4854,'2.99','2005-07-08 18:44:44','2006-02-15 22:20:01'),(13143,487,1,5634,'3.99','2005-07-10 06:25:48','2006-02-15 22:20:01'),(13144,487,1,6928,'2.99','2005-07-26 22:56:21','2006-02-15 22:20:01'),(13145,487,1,7097,'2.99','2005-07-27 04:56:09','2006-02-15 22:20:01'),(13146,487,1,7788,'0.99','2005-07-28 07:21:55','2006-02-15 22:20:01'),(13147,487,2,7949,'4.99','2005-07-28 13:07:24','2006-02-15 22:20:01'),(13148,487,2,8510,'1.99','2005-07-29 09:41:38','2006-02-15 22:20:01'),(13149,487,2,8689,'2.99','2005-07-29 16:38:58','2006-02-15 22:20:01'),(13150,487,1,8814,'4.99','2005-07-29 21:49:43','2006-02-15 22:20:01'),(13151,487,1,8988,'7.99','2005-07-30 04:38:49','2006-02-15 22:20:02'),(13152,487,2,9457,'2.99','2005-07-30 22:23:05','2006-02-15 22:20:02'),(13153,487,1,9490,'3.99','2005-07-30 23:45:09','2006-02-15 22:20:02'),(13154,487,2,10123,'0.99','2005-07-31 21:30:46','2006-02-15 22:20:02'),(13155,487,2,10511,'2.99','2005-08-01 11:32:16','2006-02-15 22:20:02'),(13156,487,2,10555,'6.99','2005-08-01 12:56:38','2006-02-15 22:20:02'),(13157,487,1,10832,'6.99','2005-08-01 23:24:53','2006-02-15 22:20:02'),(13158,487,2,10877,'5.99','2005-08-02 00:32:04','2006-02-15 22:20:02'),(13159,487,1,10978,'9.99','2005-08-02 04:12:27','2006-02-15 22:20:02'),(13160,487,1,11669,'5.99','2005-08-17 05:48:51','2006-02-15 22:20:02'),(13161,487,2,11890,'5.99','2005-08-17 15:08:43','2006-02-15 22:20:02'),(13162,487,1,12493,'7.99','2005-08-18 12:53:38','2006-02-15 22:20:02'),(13163,487,2,13210,'4.99','2005-08-19 15:23:38','2006-02-15 22:20:02'),(13164,487,1,13658,'7.99','2005-08-20 08:02:22','2006-02-15 22:20:02'),(13165,487,2,15665,'2.99','2005-08-23 08:59:12','2006-02-15 22:20:02'),(13166,488,2,1655,'3.99','2005-06-16 09:51:39','2006-02-15 22:20:02'),(13167,488,2,1704,'5.99','2005-06-16 13:45:56','2006-02-15 22:20:02'),(13168,488,2,4133,'6.99','2005-07-07 08:12:26','2006-02-15 22:20:03'),(13169,488,2,4233,'5.99','2005-07-07 13:00:20','2006-02-15 22:20:03'),(13170,488,1,5141,'8.99','2005-07-09 08:05:14','2006-02-15 22:20:03'),(13171,488,2,6548,'5.99','2005-07-12 05:00:46','2006-02-15 22:20:03'),(13172,488,1,7373,'5.99','2005-07-27 15:19:33','2006-02-15 22:20:03'),(13173,488,1,8005,'2.99','2005-07-28 15:15:11','2006-02-15 22:20:03'),(13174,488,2,8050,'0.99','2005-07-28 16:55:47','2006-02-15 22:20:03'),(13175,488,2,8064,'2.99','2005-07-28 17:15:38','2006-02-15 22:20:03'),(13176,488,2,9083,'5.99','2005-07-30 08:14:27','2006-02-15 22:20:03'),(13177,488,1,9532,'2.99','2005-07-31 01:16:51','2006-02-15 22:20:03'),(13178,488,1,9537,'0.99','2005-07-31 01:23:00','2006-02-15 22:20:03'),(13179,488,2,10474,'5.99','2005-08-01 10:01:42','2006-02-15 22:20:03'),(13180,488,1,10767,'0.99','2005-08-01 20:37:23','2006-02-15 22:20:03'),(13181,488,1,11774,'3.99','2005-08-17 10:20:39','2006-02-15 22:20:03'),(13182,488,2,12483,'5.99','2005-08-18 12:38:37','2006-02-15 22:20:03'),(13183,488,2,13446,'4.99','2005-08-20 00:06:13','2006-02-15 22:20:03'),(13184,488,2,14948,'5.99','2005-08-22 06:10:53','2006-02-15 22:20:04'),(13185,488,2,15259,'0.99','2005-08-22 18:23:23','2006-02-15 22:20:04'),(13186,488,1,15350,'2.99','2005-08-22 21:15:29','2006-02-15 22:20:04'),(13187,488,2,15499,'2.99','2005-08-23 02:37:19','2006-02-15 22:20:04'),(13188,489,1,219,'4.99','2005-05-26 09:41:45','2006-02-15 22:20:04'),(13189,489,2,513,'2.99','2005-05-28 03:08:10','2006-02-15 22:20:04'),(13190,489,2,1614,'3.99','2005-06-16 06:58:02','2006-02-15 22:20:04'),(13191,489,1,2201,'0.99','2005-06-18 02:08:27','2006-02-15 22:20:04'),(13192,489,1,2370,'7.99','2005-06-18 14:29:54','2006-02-15 22:20:04'),(13193,489,1,2802,'4.99','2005-06-19 19:18:17','2006-02-15 22:20:04'),(13194,489,2,3816,'2.99','2005-07-06 15:27:04','2006-02-15 22:20:04'),(13195,489,1,4774,'3.99','2005-07-08 15:42:28','2006-02-15 22:20:04'),(13196,489,1,6963,'4.99','2005-07-27 00:13:02','2006-02-15 22:20:04'),(13197,489,2,9231,'0.99','2005-07-30 13:42:15','2006-02-15 22:20:04'),(13198,489,1,9459,'4.99','2005-07-30 22:24:46','2006-02-15 22:20:04'),(13199,489,2,11119,'9.99','2005-08-02 08:44:44','2006-02-15 22:20:04'),(13200,489,1,11705,'4.99','2005-08-17 07:22:25','2006-02-15 22:20:04'),(13201,489,1,12496,'6.99','2005-08-18 12:58:25','2006-02-15 22:20:05'),(13202,489,2,12701,'6.99','2005-08-18 20:26:47','2006-02-15 22:20:05'),(13203,489,1,13462,'4.99','2005-08-20 00:49:19','2006-02-15 22:20:05'),(13204,489,2,14095,'5.99','2005-08-21 00:25:45','2006-02-15 22:20:05'),(13205,489,2,14328,'2.99','2005-08-21 08:18:20','2006-02-15 22:20:05'),(13206,489,2,14424,'6.99','2005-08-21 11:24:11','2006-02-15 22:20:05'),(13207,489,1,15205,'0.99','2005-08-22 16:32:23','2006-02-15 22:20:05'),(13208,489,1,15981,'4.99','2005-08-23 20:12:17','2006-02-15 22:20:05'),(13209,490,2,585,'6.99','2005-05-28 11:50:45','2006-02-15 22:20:05'),(13210,490,2,676,'4.99','2005-05-28 22:27:51','2006-02-15 22:20:05'),(13211,490,1,1665,'3.99','2005-06-16 10:16:02','2006-02-15 22:20:05'),(13212,490,1,3476,'4.99','2005-07-05 23:02:37','2006-02-15 22:20:05'),(13213,490,2,3932,'4.99','2005-07-06 21:06:17','2006-02-15 22:20:05'),(13214,490,1,4083,'2.99','2005-07-07 05:13:15','2006-02-15 22:20:05'),(13215,490,1,4906,'5.99','2005-07-08 20:59:13','2006-02-15 22:20:05'),(13216,490,2,5173,'7.99','2005-07-09 09:31:44','2006-02-15 22:20:05'),(13217,490,2,5489,'0.99','2005-07-10 00:07:03','2006-02-15 22:20:06'),(13218,490,1,5654,'4.99','2005-07-10 07:24:46','2006-02-15 22:20:06'),(13219,490,2,6230,'2.99','2005-07-11 14:02:19','2006-02-15 22:20:06'),(13220,490,1,6803,'4.99','2005-07-12 17:21:49','2006-02-15 22:20:06'),(13221,490,2,6888,'2.99','2005-07-12 21:01:11','2006-02-15 22:20:06'),(13222,490,2,6923,'8.99','2005-07-12 22:40:48','2006-02-15 22:20:06'),(13223,490,1,8552,'5.99','2005-07-29 11:14:02','2006-02-15 22:20:06'),(13224,490,2,9108,'4.99','2005-07-30 08:56:36','2006-02-15 22:20:06'),(13225,490,1,9554,'0.99','2005-07-31 02:06:49','2006-02-15 22:20:06'),(13226,490,1,10786,'7.99','2005-08-01 21:29:34','2006-02-15 22:20:06'),(13227,490,1,10955,'7.99','2005-08-02 03:32:34','2006-02-15 22:20:06'),(13228,490,2,11965,'2.99','2005-08-17 17:39:45','2006-02-15 22:20:06'),(13229,490,2,14557,'4.99','2005-08-21 16:05:11','2006-02-15 22:20:06'),(13230,490,2,14761,'6.99','2005-08-21 23:30:28','2006-02-15 22:20:06'),(13231,490,2,15276,'2.99','2005-08-22 18:59:01','2006-02-15 22:20:06'),(13232,490,1,15448,'2.99','2005-08-23 00:55:24','2006-02-15 22:20:06'),(13233,491,1,484,'2.99','2005-05-27 23:26:45','2006-02-15 22:20:06'),(13234,491,2,1097,'0.99','2005-05-31 13:38:42','2006-02-15 22:20:07'),(13235,491,2,1198,'2.99','2005-06-15 01:48:58','2006-02-15 22:20:07'),(13236,491,1,1371,'4.99','2005-06-15 14:38:15','2006-02-15 22:20:07'),(13237,491,2,2026,'4.99','2005-06-17 13:05:38','2006-02-15 22:20:07'),(13238,491,1,2259,'4.99','2005-06-18 05:37:45','2006-02-15 22:20:07'),(13239,491,2,2391,'4.99','2005-06-18 15:33:30','2006-02-15 22:20:07'),(13240,491,2,3031,'4.99','2005-06-20 11:52:49','2006-02-15 22:20:07'),(13241,491,1,3440,'3.99','2005-06-21 19:58:18','2006-02-15 22:20:07'),(13242,491,1,4046,'8.99','2005-07-07 03:27:59','2006-02-15 22:20:07'),(13243,491,1,4392,'2.99','2005-07-07 21:11:02','2006-02-15 22:20:07'),(13244,491,2,5134,'6.99','2005-07-09 07:53:12','2006-02-15 22:20:07'),(13245,491,1,5889,'4.99','2005-07-10 19:54:41','2006-02-15 22:20:07'),(13246,491,2,6171,'2.99','2005-07-11 10:29:35','2006-02-15 22:20:07'),(13247,491,2,7019,'3.99','2005-07-27 02:20:26','2006-02-15 22:20:07'),(13248,491,2,7281,'6.99','2005-07-27 11:59:20','2006-02-15 22:20:07'),(13249,491,2,7688,'7.99','2005-07-28 03:20:47','2006-02-15 22:20:07'),(13250,491,1,7871,'6.99','2005-07-28 10:16:37','2006-02-15 22:20:08'),(13251,491,2,10036,'2.99','2005-07-31 18:47:20','2006-02-15 22:20:08'),(13252,491,2,10178,'4.99','2005-07-31 23:43:04','2006-02-15 22:20:08'),(13253,491,2,10974,'6.99','2005-08-02 04:10:52','2006-02-15 22:20:08'),(13254,491,1,11048,'4.99','2005-08-02 06:15:07','2006-02-15 22:20:08'),(13255,491,1,11590,'0.99','2005-08-17 02:28:33','2006-02-15 22:20:08'),(13256,491,1,11840,'4.99','2005-08-17 13:09:01','2006-02-15 22:20:08'),(13257,491,2,13607,'2.99','2005-08-20 06:08:42','2006-02-15 22:20:08'),(13258,491,1,14780,'0.99','2005-08-22 00:06:33','2006-02-15 22:20:08'),(13259,491,2,15685,'5.99','2005-08-23 09:41:28','2006-02-15 22:20:08'),(13260,492,1,84,'2.99','2005-05-25 12:36:30','2006-02-15 22:20:08'),(13261,492,2,1691,'1.99','2005-06-16 12:24:28','2006-02-15 22:20:08'),(13262,492,2,1855,'4.99','2005-06-17 00:54:58','2006-02-15 22:20:08'),(13263,492,2,1956,'4.99','2005-06-17 08:43:32','2006-02-15 22:20:08'),(13264,492,1,3298,'9.99','2005-06-21 07:09:44','2006-02-15 22:20:08'),(13265,492,2,4128,'8.99','2005-07-07 07:35:25','2006-02-15 22:20:08'),(13266,492,1,4142,'2.99','2005-07-07 08:19:45','2006-02-15 22:20:08'),(13267,492,2,4258,'6.99','2005-07-07 14:20:59','2006-02-15 22:20:09'),(13268,492,2,5325,'0.99','2005-07-09 16:35:47','2006-02-15 22:20:09'),(13269,492,1,5609,'0.99','2005-07-10 05:09:46','2006-02-15 22:20:09'),(13270,492,1,6257,'2.99','2005-07-11 15:23:46','2006-02-15 22:20:09'),(13271,492,2,7203,'2.99','2005-07-27 09:01:23','2006-02-15 22:20:09'),(13272,492,2,12971,'4.99','2005-08-19 06:42:43','2006-02-15 22:20:09'),(13273,492,1,14255,'2.99','2005-08-21 05:51:37','2006-02-15 22:20:09'),(13274,492,2,15822,'0.99','2005-08-23 15:05:59','2006-02-15 22:20:09'),(13275,492,1,15958,'4.99','2005-08-23 19:22:36','2006-02-15 22:20:09'),(13276,493,1,543,'7.99','2005-05-28 06:43:34','2006-02-15 22:20:09'),(13277,493,2,2109,'3.99','2005-06-17 19:41:42','2006-02-15 22:20:09'),(13278,493,1,2365,'4.99','2005-06-18 13:45:34','2006-02-15 22:20:09'),(13279,493,1,2579,'0.99','2005-06-19 04:40:44','2006-02-15 22:20:09'),(13280,493,1,2864,'2.99','2005-06-20 00:00:52','2006-02-15 22:20:09'),(13281,493,2,3586,'4.99','2005-07-06 04:24:42','2006-02-15 22:20:09'),(13282,493,1,3655,'5.99','2005-07-06 07:52:54','2006-02-15 22:20:09'),(13283,493,1,6549,'7.99','2005-07-12 05:02:01','2006-02-15 22:20:10'),(13284,493,1,6552,'4.99','2005-07-12 05:05:06','2006-02-15 22:20:10'),(13285,493,1,7026,'2.99','2005-07-27 02:48:58','2006-02-15 22:20:10'),(13286,493,2,7043,'7.99','2005-07-27 03:24:23','2006-02-15 22:20:10'),(13287,493,1,8298,'4.99','2005-07-29 02:47:36','2006-02-15 22:20:10'),(13288,493,1,8616,'2.99','2005-07-29 13:39:09','2006-02-15 22:20:10'),(13289,493,1,10777,'6.99','2005-08-01 21:03:50','2006-02-15 22:20:10'),(13290,493,2,10885,'7.99','2005-08-02 00:51:37','2006-02-15 22:20:10'),(13291,493,1,13638,'2.99','2005-08-20 07:21:15','2006-02-15 22:20:10'),(13292,493,2,13675,'6.99','2005-08-20 08:32:51','2006-02-15 22:20:10'),(13293,493,1,14117,'4.99','2005-08-21 01:11:59','2006-02-15 22:20:10'),(13294,493,2,15177,'4.99','2005-08-22 15:34:49','2006-02-15 22:20:10'),(13295,493,1,15355,'0.99','2005-08-22 21:19:24','2006-02-15 22:20:10'),(13296,493,1,15490,'6.99','2005-08-23 02:08:18','2006-02-15 22:20:10'),(13297,493,2,15878,'2.99','2005-08-23 16:34:31','2006-02-15 22:20:10'),(13298,493,2,14160,'2.99','2006-02-14 15:16:03','2006-02-15 22:20:10'),(13299,494,1,608,'4.99','2005-05-28 15:03:44','2006-02-15 22:20:10'),(13300,494,1,1683,'2.99','2005-06-16 11:54:55','2006-02-15 22:20:11'),(13301,494,1,3511,'0.99','2005-07-06 00:42:01','2006-02-15 22:20:11'),(13302,494,2,3803,'2.99','2005-07-06 15:06:55','2006-02-15 22:20:11'),(13303,494,2,3913,'0.99','2005-07-06 20:11:00','2006-02-15 22:20:11'),(13304,494,1,4086,'3.99','2005-07-07 05:26:06','2006-02-15 22:20:11'),(13305,494,2,4397,'5.99','2005-07-07 21:14:54','2006-02-15 22:20:11'),(13306,494,2,4551,'7.99','2005-07-08 04:36:21','2006-02-15 22:20:11'),(13307,494,2,5083,'4.99','2005-07-09 05:30:32','2006-02-15 22:20:11'),(13308,494,1,5180,'2.99','2005-07-09 10:06:53','2006-02-15 22:20:11'),(13309,494,2,7258,'3.99','2005-07-27 11:05:54','2006-02-15 22:20:11'),(13310,494,2,7546,'8.99','2005-07-27 21:50:09','2006-02-15 22:20:11'),(13311,494,2,7737,'1.99','2005-07-28 05:15:03','2006-02-15 22:20:11'),(13312,494,2,8333,'2.99','2005-07-29 04:16:40','2006-02-15 22:20:11'),(13313,494,2,8895,'2.99','2005-07-30 00:49:17','2006-02-15 22:20:11'),(13314,494,1,8934,'4.99','2005-07-30 02:37:05','2006-02-15 22:20:11'),(13315,494,2,9012,'4.99','2005-07-30 05:18:57','2006-02-15 22:20:11'),(13316,494,2,9510,'7.99','2005-07-31 00:24:17','2006-02-15 22:20:12'),(13317,494,1,9799,'2.99','2005-07-31 10:58:32','2006-02-15 22:20:12'),(13318,494,2,9943,'7.99','2005-07-31 15:37:29','2006-02-15 22:20:12'),(13319,494,1,10403,'0.99','2005-08-01 07:30:45','2006-02-15 22:20:12'),(13320,494,1,10623,'2.99','2005-08-01 15:22:38','2006-02-15 22:20:12'),(13321,494,2,11152,'3.99','2005-08-02 09:53:36','2006-02-15 22:20:12'),(13322,494,1,11987,'5.99','2005-08-17 18:21:59','2006-02-15 22:20:12'),(13323,494,2,13094,'0.99','2005-08-19 10:47:58','2006-02-15 22:20:12'),(13324,494,2,13301,'3.99','2005-08-19 18:53:15','2006-02-15 22:20:12'),(13325,494,2,14634,'5.99','2005-08-21 18:51:28','2006-02-15 22:20:12'),(13326,494,1,14832,'4.99','2005-08-22 01:43:29','2006-02-15 22:20:12'),(13327,494,1,15086,'6.99','2005-08-22 11:21:08','2006-02-15 22:20:12'),(13328,494,2,15156,'9.99','2005-08-22 14:29:11','2006-02-15 22:20:12'),(13329,494,2,15291,'4.99','2005-08-22 19:28:04','2006-02-15 22:20:12'),(13330,495,2,623,'4.99','2005-05-28 16:01:28','2006-02-15 22:20:12'),(13331,495,2,741,'4.99','2005-05-29 08:35:49','2006-02-15 22:20:12'),(13332,495,2,2074,'2.99','2005-06-17 16:40:03','2006-02-15 22:20:13'),(13333,495,1,2349,'4.99','2005-06-18 12:25:14','2006-02-15 22:20:13'),(13334,495,1,2549,'7.99','2005-06-19 02:46:39','2006-02-15 22:20:13'),(13335,495,1,3129,'3.99','2005-06-20 18:57:48','2006-02-15 22:20:13'),(13336,495,2,3966,'2.99','2005-07-06 22:38:49','2006-02-15 22:20:13'),(13337,495,2,5484,'7.99','2005-07-09 23:54:37','2006-02-15 22:20:13'),(13338,495,2,6426,'7.99','2005-07-11 23:56:38','2006-02-15 22:20:13'),(13339,495,2,7191,'2.99','2005-07-27 08:36:15','2006-02-15 22:20:13'),(13340,495,1,8151,'0.99','2005-07-28 20:50:52','2006-02-15 22:20:13'),(13341,495,1,8383,'1.99','2005-07-29 05:36:47','2006-02-15 22:20:13'),(13342,495,1,8451,'5.99','2005-07-29 07:44:56','2006-02-15 22:20:13'),(13343,495,1,8672,'5.99','2005-07-29 15:49:48','2006-02-15 22:20:13'),(13344,495,1,9387,'9.99','2005-07-30 19:27:05','2006-02-15 22:20:13'),(13345,495,1,9741,'4.99','2005-07-31 09:09:22','2006-02-15 22:20:13'),(13346,495,2,10065,'4.99','2005-07-31 19:27:34','2006-02-15 22:20:13'),(13347,495,2,10643,'5.99','2005-08-01 15:48:33','2006-02-15 22:20:13'),(13348,495,1,10783,'4.99','2005-08-01 21:23:37','2006-02-15 22:20:13'),(13349,495,1,12782,'5.99','2005-08-18 23:56:23','2006-02-15 22:20:14'),(13350,495,2,12837,'0.99','2005-08-19 01:51:09','2006-02-15 22:20:14'),(13351,495,2,13205,'3.99','2005-08-19 15:05:26','2006-02-15 22:20:14'),(13352,495,2,13445,'2.99','2005-08-20 00:05:33','2006-02-15 22:20:14'),(13353,495,2,13818,'4.99','2005-08-20 13:20:09','2006-02-15 22:20:14'),(13354,495,1,15984,'2.99','2005-08-23 20:16:27','2006-02-15 22:20:14'),(13355,495,2,13753,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:14'),(13356,496,2,322,'4.99','2005-05-27 00:47:35','2006-02-15 22:20:14'),(13357,496,2,966,'0.99','2005-05-30 19:00:37','2006-02-15 22:20:14'),(13358,496,1,2567,'2.99','2005-06-19 04:04:46','2006-02-15 22:20:14'),(13359,496,2,3569,'3.99','2005-07-06 03:17:23','2006-02-15 22:20:14'),(13360,496,1,4070,'2.99','2005-07-07 04:37:09','2006-02-15 22:20:14'),(13361,496,1,4261,'4.99','2005-07-07 14:23:56','2006-02-15 22:20:14'),(13362,496,1,4269,'0.99','2005-07-07 14:38:33','2006-02-15 22:20:14'),(13363,496,1,5559,'5.99','2005-07-10 03:13:07','2006-02-15 22:20:14'),(13364,496,2,5949,'4.99','2005-07-10 23:13:00','2006-02-15 22:20:14'),(13365,496,1,7133,'2.99','2005-07-27 06:29:23','2006-02-15 22:20:15'),(13366,496,2,8221,'2.99','2005-07-28 23:47:19','2006-02-15 22:20:15'),(13367,496,1,11060,'7.99','2005-08-02 06:48:18','2006-02-15 22:20:15'),(13368,496,2,11448,'4.99','2005-08-02 20:44:33','2006-02-15 22:20:15'),(13369,496,1,11893,'3.99','2005-08-17 15:13:29','2006-02-15 22:20:15'),(13370,496,2,12605,'4.99','2005-08-18 16:59:37','2006-02-15 22:20:15'),(13371,496,1,13569,'5.99','2005-08-20 05:02:59','2006-02-15 22:20:15'),(13372,496,2,14013,'6.99','2005-08-20 20:42:50','2006-02-15 22:20:15'),(13373,496,1,14332,'7.99','2005-08-21 08:30:43','2006-02-15 22:20:15'),(13374,496,1,14348,'0.99','2005-08-21 08:54:26','2006-02-15 22:20:15'),(13375,496,2,15750,'2.99','2005-08-23 12:36:05','2006-02-15 22:20:15'),(13376,496,1,13182,'2.99','2006-02-14 15:16:03','2006-02-15 22:20:15'),(13377,497,1,1100,'7.99','2005-05-31 14:03:21','2006-02-15 22:20:15'),(13378,497,2,2180,'8.99','2005-06-18 00:47:43','2006-02-15 22:20:15'),(13379,497,1,2298,'5.99','2005-06-18 08:18:29','2006-02-15 22:20:15'),(13380,497,1,2406,'2.99','2005-06-18 16:39:37','2006-02-15 22:20:15'),(13381,497,2,2818,'4.99','2005-06-19 20:05:52','2006-02-15 22:20:16'),(13382,497,1,3696,'2.99','2005-07-06 10:04:55','2006-02-15 22:20:16'),(13383,497,2,4218,'7.99','2005-07-07 12:10:24','2006-02-15 22:20:16'),(13384,497,1,4516,'4.99','2005-07-08 02:43:41','2006-02-15 22:20:16'),(13385,497,1,4578,'0.99','2005-07-08 06:00:17','2006-02-15 22:20:16'),(13386,497,2,4795,'0.99','2005-07-08 16:32:54','2006-02-15 22:20:16'),(13387,497,1,5030,'4.99','2005-07-09 02:35:43','2006-02-15 22:20:16'),(13388,497,1,5239,'4.99','2005-07-09 13:12:35','2006-02-15 22:20:16'),(13389,497,2,7603,'2.99','2005-07-27 23:54:44','2006-02-15 22:20:16'),(13390,497,2,8011,'2.99','2005-07-28 15:26:39','2006-02-15 22:20:16'),(13391,497,1,8150,'6.99','2005-07-28 20:50:41','2006-02-15 22:20:16'),(13392,497,2,8813,'6.99','2005-07-29 21:47:55','2006-02-15 22:20:16'),(13393,497,2,8867,'4.99','2005-07-30 00:02:18','2006-02-15 22:20:16'),(13394,497,1,9273,'9.99','2005-07-30 15:05:36','2006-02-15 22:20:16'),(13395,497,2,9850,'4.99','2005-07-31 12:46:52','2006-02-15 22:20:16'),(13396,497,2,10760,'7.99','2005-08-01 20:25:20','2006-02-15 22:20:16'),(13397,497,1,12123,'0.99','2005-08-17 23:22:18','2006-02-15 22:20:16'),(13398,497,1,13159,'4.99','2005-08-19 13:19:59','2006-02-15 22:20:17'),(13399,497,1,13289,'2.99','2005-08-19 18:31:30','2006-02-15 22:20:17'),(13400,497,2,14134,'0.99','2005-08-21 01:45:54','2006-02-15 22:20:17'),(13401,497,1,15362,'5.99','2005-08-22 21:40:20','2006-02-15 22:20:17'),(13402,497,2,15633,'0.99','2005-08-23 07:31:10','2006-02-15 22:20:17'),(13403,497,1,15919,'0.99','2005-08-23 18:01:31','2006-02-15 22:20:17'),(13404,497,1,12698,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:17'),(13405,498,2,49,'2.99','2005-05-25 06:39:35','2006-02-15 22:20:17'),(13406,498,1,429,'8.99','2005-05-27 16:21:26','2006-02-15 22:20:17'),(13407,498,2,718,'2.99','2005-05-29 04:52:23','2006-02-15 22:20:17'),(13408,498,1,1253,'6.99','2005-06-15 06:06:33','2006-02-15 22:20:17'),(13409,498,1,1782,'2.99','2005-06-16 19:21:12','2006-02-15 22:20:17'),(13410,498,1,2344,'2.99','2005-06-18 12:01:47','2006-02-15 22:20:17'),(13411,498,1,2449,'4.99','2005-06-18 19:18:36','2006-02-15 22:20:17'),(13412,498,1,3098,'0.99','2005-06-20 16:37:01','2006-02-15 22:20:17'),(13413,498,2,3360,'0.99','2005-06-21 12:12:41','2006-02-15 22:20:17'),(13414,498,2,3828,'0.99','2005-07-06 15:57:30','2006-02-15 22:20:18'),(13415,498,2,3856,'2.99','2005-07-06 17:04:46','2006-02-15 22:20:18'),(13416,498,1,4311,'4.99','2005-07-07 17:31:14','2006-02-15 22:20:18'),(13417,498,2,4972,'2.99','2005-07-08 23:56:09','2006-02-15 22:20:18'),(13418,498,1,5286,'2.99','2005-07-09 15:11:41','2006-02-15 22:20:18'),(13419,498,2,5884,'0.99','2005-07-10 19:31:38','2006-02-15 22:20:18'),(13420,498,1,6058,'2.99','2005-07-11 04:03:51','2006-02-15 22:20:18'),(13421,498,1,6088,'1.99','2005-07-11 05:40:35','2006-02-15 22:20:18'),(13422,498,1,7285,'4.99','2005-07-27 12:14:06','2006-02-15 22:20:18'),(13423,498,1,7286,'6.99','2005-07-27 12:23:49','2006-02-15 22:20:18'),(13424,498,1,7341,'4.99','2005-07-27 14:23:55','2006-02-15 22:20:18'),(13425,498,2,8020,'4.99','2005-07-28 15:43:32','2006-02-15 22:20:18'),(13426,498,1,8229,'2.99','2005-07-29 00:09:08','2006-02-15 22:20:18'),(13427,498,2,9021,'0.99','2005-07-30 05:34:24','2006-02-15 22:20:18'),(13428,498,2,9689,'4.99','2005-07-31 07:00:08','2006-02-15 22:20:18'),(13429,498,1,10225,'0.99','2005-08-01 01:38:40','2006-02-15 22:20:18'),(13430,498,1,11455,'6.99','2005-08-02 21:07:06','2006-02-15 22:20:18'),(13431,498,1,12893,'2.99','2005-08-19 03:46:43','2006-02-15 22:20:19'),(13432,499,2,89,'2.99','2005-05-25 14:28:29','2006-02-15 22:20:19'),(13433,499,1,1355,'2.99','2005-06-15 13:13:59','2006-02-15 22:20:19'),(13434,499,2,1526,'4.99','2005-06-16 00:27:51','2006-02-15 22:20:19'),(13435,499,2,1830,'4.99','2005-06-16 22:18:43','2006-02-15 22:20:19'),(13436,499,2,3241,'1.99','2005-06-21 02:54:32','2006-02-15 22:20:19'),(13437,499,1,3794,'4.99','2005-07-06 14:35:26','2006-02-15 22:20:19'),(13438,499,1,5022,'2.99','2005-07-09 02:10:54','2006-02-15 22:20:19'),(13439,499,2,5392,'2.99','2005-07-09 19:32:30','2006-02-15 22:20:19'),(13440,499,2,5427,'3.99','2005-07-09 21:12:26','2006-02-15 22:20:19'),(13441,499,1,5956,'4.99','2005-07-10 23:23:08','2006-02-15 22:20:19'),(13442,499,2,6723,'4.99','2005-07-12 13:44:57','2006-02-15 22:20:19'),(13443,499,1,7800,'0.99','2005-07-28 07:50:59','2006-02-15 22:20:19'),(13444,499,1,7831,'0.99','2005-07-28 08:44:21','2006-02-15 22:20:19'),(13445,499,1,7898,'6.99','2005-07-28 11:08:22','2006-02-15 22:20:19'),(13446,499,2,8130,'4.99','2005-07-28 19:48:15','2006-02-15 22:20:19'),(13447,499,1,8770,'3.99','2005-07-29 19:53:50','2006-02-15 22:20:20'),(13448,499,1,9588,'0.99','2005-07-31 03:13:13','2006-02-15 22:20:20'),(13449,499,2,10333,'0.99','2005-08-01 04:58:32','2006-02-15 22:20:20'),(13450,499,2,10497,'2.99','2005-08-01 10:55:59','2006-02-15 22:20:20'),(13451,499,1,11513,'7.99','2005-08-16 23:51:33','2006-02-15 22:20:20'),(13452,499,2,11606,'0.99','2005-08-17 03:32:43','2006-02-15 22:20:20'),(13453,499,2,11978,'4.99','2005-08-17 18:02:10','2006-02-15 22:20:20'),(13454,499,1,12004,'8.99','2005-08-17 18:56:53','2006-02-15 22:20:20'),(13455,499,1,12354,'7.99','2005-08-18 07:34:07','2006-02-15 22:20:20'),(13456,499,1,12436,'3.99','2005-08-18 10:41:05','2006-02-15 22:20:20'),(13457,499,1,12587,'1.99','2005-08-18 16:03:13','2006-02-15 22:20:20'),(13458,499,2,12947,'4.99','2005-08-19 05:54:21','2006-02-15 22:20:20'),(13459,499,2,13822,'3.99','2005-08-20 13:39:28','2006-02-15 22:20:20'),(13460,499,1,14858,'3.99','2005-08-22 02:46:18','2006-02-15 22:20:20'),(13461,499,1,15587,'7.99','2005-08-23 06:00:28','2006-02-15 22:20:20'),(13462,500,1,112,'8.99','2005-05-25 18:57:24','2006-02-15 22:20:20'),(13463,500,1,389,'8.99','2005-05-27 10:45:41','2006-02-15 22:20:21'),(13464,500,1,610,'0.99','2005-05-28 15:15:25','2006-02-15 22:20:21'),(13465,500,1,1375,'5.99','2005-06-15 14:54:56','2006-02-15 22:20:21'),(13466,500,2,1388,'5.99','2005-06-15 15:48:41','2006-02-15 22:20:21'),(13467,500,2,2189,'3.99','2005-06-18 01:20:26','2006-02-15 22:20:21'),(13468,500,2,2526,'6.99','2005-06-19 01:03:07','2006-02-15 22:20:21'),(13469,500,1,2996,'2.99','2005-06-20 09:20:29','2006-02-15 22:20:21'),(13470,500,2,3926,'4.99','2005-07-06 20:42:35','2006-02-15 22:20:21'),(13471,500,1,4561,'0.99','2005-07-08 05:02:43','2006-02-15 22:20:21'),(13472,500,2,4790,'4.99','2005-07-08 16:25:27','2006-02-15 22:20:21'),(13473,500,2,6018,'4.99','2005-07-11 02:06:36','2006-02-15 22:20:21'),(13474,500,2,6187,'2.99','2005-07-11 11:28:51','2006-02-15 22:20:21'),(13475,500,2,6801,'3.99','2005-07-12 17:09:08','2006-02-15 22:20:21'),(13476,500,1,7857,'0.99','2005-07-28 09:49:40','2006-02-15 22:20:21'),(13477,500,1,7925,'2.99','2005-07-28 12:10:02','2006-02-15 22:20:21'),(13478,500,1,8538,'6.99','2005-07-29 10:45:17','2006-02-15 22:20:21'),(13479,500,1,8925,'0.99','2005-07-30 02:09:14','2006-02-15 22:20:22'),(13480,500,2,9290,'3.99','2005-07-30 15:59:08','2006-02-15 22:20:22'),(13481,500,1,10947,'6.99','2005-08-02 03:23:17','2006-02-15 22:20:22'),(13482,500,2,11218,'1.99','2005-08-02 12:29:12','2006-02-15 22:20:22'),(13483,500,1,12639,'2.99','2005-08-18 18:13:05','2006-02-15 22:20:22'),(13484,500,2,12813,'2.99','2005-08-19 00:54:22','2006-02-15 22:20:22'),(13485,500,2,13628,'4.99','2005-08-20 07:03:53','2006-02-15 22:20:22'),(13486,500,1,14407,'0.99','2005-08-21 10:46:51','2006-02-15 22:20:22'),(13487,500,1,14964,'4.99','2005-08-22 06:39:24','2006-02-15 22:20:22'),(13488,500,1,15584,'2.99','2005-08-23 05:49:21','2006-02-15 22:20:22'),(13489,500,1,15853,'2.99','2005-08-23 15:54:20','2006-02-15 22:20:22'),(13490,501,1,493,'0.99','2005-05-28 00:34:11','2006-02-15 22:20:22'),(13491,501,1,605,'1.99','2005-05-28 14:39:10','2006-02-15 22:20:22'),(13492,501,2,3222,'5.99','2005-06-21 01:50:29','2006-02-15 22:20:22'),(13493,501,1,3412,'7.99','2005-06-21 16:44:31','2006-02-15 22:20:22'),(13494,501,2,3541,'6.99','2005-07-06 01:50:11','2006-02-15 22:20:22'),(13495,501,2,3723,'6.99','2005-07-06 11:12:02','2006-02-15 22:20:22'),(13496,501,2,4769,'2.99','2005-07-08 15:29:16','2006-02-15 22:20:23'),(13497,501,2,5520,'1.99','2005-07-10 01:30:41','2006-02-15 22:20:23'),(13498,501,2,6095,'7.99','2005-07-11 06:06:41','2006-02-15 22:20:23'),(13499,501,1,7456,'0.99','2005-07-27 18:34:53','2006-02-15 22:20:23'),(13500,501,1,8021,'2.99','2005-07-28 15:45:24','2006-02-15 22:20:23'),(13501,501,2,8529,'2.99','2005-07-29 10:24:31','2006-02-15 22:20:23'),(13502,501,1,9359,'2.99','2005-07-30 18:39:28','2006-02-15 22:20:23'),(13503,501,1,10817,'4.99','2005-08-01 22:51:08','2006-02-15 22:20:23'),(13504,501,2,11393,'4.99','2005-08-02 18:44:29','2006-02-15 22:20:23'),(13505,501,1,11640,'1.99','2005-08-17 04:44:33','2006-02-15 22:20:23'),(13506,501,2,11799,'6.99','2005-08-17 11:25:25','2006-02-15 22:20:23'),(13507,501,1,12914,'4.99','2005-08-19 04:25:59','2006-02-15 22:20:23'),(13508,501,2,13889,'0.99','2005-08-20 15:40:06','2006-02-15 22:20:23'),(13509,501,1,15239,'4.99','2005-08-22 17:46:17','2006-02-15 22:20:23'),(13510,501,1,15699,'5.99','2005-08-23 10:20:35','2006-02-15 22:20:23'),(13511,502,2,258,'2.99','2005-05-26 15:28:14','2006-02-15 22:20:23'),(13512,502,1,861,'0.99','2005-05-30 02:48:32','2006-02-15 22:20:24'),(13513,502,1,893,'2.99','2005-05-30 08:06:59','2006-02-15 22:20:24'),(13514,502,2,965,'0.99','2005-05-30 19:00:14','2006-02-15 22:20:24'),(13515,502,2,1696,'7.99','2005-06-16 12:50:01','2006-02-15 22:20:24'),(13516,502,2,2420,'0.99','2005-06-18 17:22:28','2006-02-15 22:20:24'),(13517,502,1,2911,'0.99','2005-06-20 03:32:37','2006-02-15 22:20:24'),(13518,502,2,3614,'2.99','2005-07-06 05:46:05','2006-02-15 22:20:24'),(13519,502,1,4606,'2.99','2005-07-08 07:05:50','2006-02-15 22:20:24'),(13520,502,2,5368,'5.99','2005-07-09 18:41:59','2006-02-15 22:20:24'),(13521,502,2,5662,'2.99','2005-07-10 07:59:24','2006-02-15 22:20:24'),(13522,502,2,6414,'7.99','2005-07-11 23:26:13','2006-02-15 22:20:24'),(13523,502,1,6760,'8.99','2005-07-12 15:16:00','2006-02-15 22:20:24'),(13524,502,2,6828,'2.99','2005-07-12 18:38:51','2006-02-15 22:20:24'),(13525,502,2,6924,'8.99','2005-07-26 22:51:53','2006-02-15 22:20:24'),(13526,502,2,7213,'3.99','2005-07-27 09:22:29','2006-02-15 22:20:24'),(13527,502,1,7255,'4.99','2005-07-27 10:49:54','2006-02-15 22:20:24'),(13528,502,1,7757,'4.99','2005-07-28 06:23:00','2006-02-15 22:20:25'),(13529,502,1,7884,'4.99','2005-07-28 10:37:24','2006-02-15 22:20:25'),(13530,502,2,8034,'4.99','2005-07-28 16:20:26','2006-02-15 22:20:25'),(13531,502,2,9232,'0.99','2005-07-30 13:43:00','2006-02-15 22:20:25'),(13532,502,1,9599,'4.99','2005-07-31 03:32:06','2006-02-15 22:20:25'),(13533,502,2,10390,'4.99','2005-08-01 06:46:48','2006-02-15 22:20:25'),(13534,502,1,10938,'0.99','2005-08-02 03:05:22','2006-02-15 22:20:25'),(13535,502,2,11036,'4.99','2005-08-02 05:56:29','2006-02-15 22:20:25'),(13536,502,1,11301,'0.99','2005-08-02 15:37:59','2006-02-15 22:20:25'),(13537,502,1,11317,'4.99','2005-08-02 16:08:52','2006-02-15 22:20:25'),(13538,502,1,11435,'0.99','2005-08-02 20:14:23','2006-02-15 22:20:25'),(13539,502,1,11620,'0.99','2005-08-17 04:06:22','2006-02-15 22:20:25'),(13540,502,1,12762,'4.99','2005-08-18 23:06:54','2006-02-15 22:20:25'),(13541,502,1,13052,'9.99','2005-08-19 09:31:42','2006-02-15 22:20:25'),(13542,502,1,14411,'4.99','2005-08-21 10:54:57','2006-02-15 22:20:25'),(13543,502,1,15486,'3.99','2005-08-23 02:05:20','2006-02-15 22:20:25'),(13544,502,1,16034,'3.99','2005-08-23 22:06:34','2006-02-15 22:20:26'),(13545,503,2,109,'1.99','2005-05-25 18:40:20','2006-02-15 22:20:26'),(13546,503,1,353,'5.99','2005-05-27 06:03:39','2006-02-15 22:20:26'),(13547,503,1,631,'2.99','2005-05-28 17:36:32','2006-02-15 22:20:26'),(13548,503,1,1074,'4.99','2005-05-31 10:04:42','2006-02-15 22:20:26'),(13549,503,2,2108,'4.99','2005-06-17 19:35:26','2006-02-15 22:20:26'),(13550,503,1,2225,'2.99','2005-06-18 03:35:40','2006-02-15 22:20:26'),(13551,503,2,3430,'0.99','2005-06-21 18:46:08','2006-02-15 22:20:26'),(13552,503,2,3935,'6.99','2005-07-06 21:08:29','2006-02-15 22:20:26'),(13553,503,2,4570,'2.99','2005-07-08 05:33:59','2006-02-15 22:20:26'),(13554,503,2,5465,'2.99','2005-07-09 23:01:13','2006-02-15 22:20:26'),(13555,503,1,5925,'6.99','2005-07-10 21:41:27','2006-02-15 22:20:26'),(13556,503,1,6166,'4.99','2005-07-11 10:19:05','2006-02-15 22:20:26'),(13557,503,1,6529,'2.99','2005-07-12 04:31:04','2006-02-15 22:20:26'),(13558,503,2,6950,'4.99','2005-07-26 23:45:33','2006-02-15 22:20:26'),(13559,503,1,8178,'2.99','2005-07-28 21:54:31','2006-02-15 22:20:26'),(13560,503,2,9725,'0.99','2005-07-31 08:35:18','2006-02-15 22:20:27'),(13561,503,1,9974,'4.99','2005-07-31 16:51:11','2006-02-15 22:20:27'),(13562,503,2,11075,'2.99','2005-08-02 07:24:23','2006-02-15 22:20:27'),(13563,503,1,11161,'1.99','2005-08-02 10:05:57','2006-02-15 22:20:27'),(13564,503,1,11858,'4.99','2005-08-17 13:50:31','2006-02-15 22:20:27'),(13565,503,2,12370,'2.99','2005-08-18 07:57:47','2006-02-15 22:20:27'),(13566,503,2,12783,'4.99','2005-08-19 00:01:14','2006-02-15 22:20:27'),(13567,503,1,13332,'2.99','2005-08-19 20:00:51','2006-02-15 22:20:27'),(13568,503,1,13551,'2.99','2005-08-20 04:00:30','2006-02-15 22:20:27'),(13569,503,1,14823,'0.99','2005-08-22 01:24:42','2006-02-15 22:20:27'),(13570,503,1,14913,'2.99','2005-08-22 04:52:13','2006-02-15 22:20:27'),(13571,503,2,15056,'4.99','2005-08-22 10:15:54','2006-02-15 22:20:27'),(13572,503,2,15077,'2.99','2005-08-22 11:09:18','2006-02-15 22:20:27'),(13573,503,1,15588,'3.99','2005-08-23 06:02:35','2006-02-15 22:20:27'),(13574,503,1,15692,'4.99','2005-08-23 10:00:02','2006-02-15 22:20:27'),(13575,503,1,15726,'2.99','2005-08-23 11:28:26','2006-02-15 22:20:27'),(13576,503,1,15797,'0.99','2005-08-23 14:13:47','2006-02-15 22:20:28'),(13577,504,2,136,'5.99','2005-05-25 22:02:30','2006-02-15 22:20:28'),(13578,504,2,470,'4.99','2005-05-27 21:17:08','2006-02-15 22:20:28'),(13579,504,1,838,'4.99','2005-05-30 00:27:57','2006-02-15 22:20:28'),(13580,504,1,2720,'1.99','2005-06-19 14:51:55','2006-02-15 22:20:28'),(13581,504,1,2938,'6.99','2005-06-20 05:17:22','2006-02-15 22:20:28'),(13582,504,2,3712,'9.99','2005-07-06 10:47:35','2006-02-15 22:20:28'),(13583,504,1,3713,'6.99','2005-07-06 10:49:30','2006-02-15 22:20:28'),(13584,504,1,4329,'5.99','2005-07-07 18:04:16','2006-02-15 22:20:28'),(13585,504,1,4757,'0.99','2005-07-08 14:36:51','2006-02-15 22:20:28'),(13586,504,2,5153,'6.99','2005-07-09 08:35:05','2006-02-15 22:20:28'),(13587,504,2,7342,'3.99','2005-07-27 14:25:17','2006-02-15 22:20:28'),(13588,504,1,7567,'2.99','2005-07-27 22:38:05','2006-02-15 22:20:28'),(13589,504,2,7807,'2.99','2005-07-28 07:58:27','2006-02-15 22:20:28'),(13590,504,2,7875,'1.99','2005-07-28 10:23:48','2006-02-15 22:20:28'),(13591,504,2,7944,'4.99','2005-07-28 12:51:22','2006-02-15 22:20:28'),(13592,504,1,8393,'9.99','2005-07-29 06:02:11','2006-02-15 22:20:28'),(13593,504,2,10397,'0.99','2005-08-01 07:11:27','2006-02-15 22:20:29'),(13594,504,2,10509,'3.99','2005-08-01 11:25:28','2006-02-15 22:20:29'),(13595,504,2,11569,'2.99','2005-08-17 01:31:04','2006-02-15 22:20:29'),(13596,504,1,12769,'1.99','2005-08-18 23:26:40','2006-02-15 22:20:29'),(13597,504,1,13166,'2.99','2005-08-19 13:36:28','2006-02-15 22:20:29'),(13598,504,2,13206,'2.99','2005-08-19 15:05:34','2006-02-15 22:20:29'),(13599,504,2,13387,'2.99','2005-08-19 21:46:10','2006-02-15 22:20:29'),(13600,504,2,13859,'5.99','2005-08-20 14:53:43','2006-02-15 22:20:29'),(13601,504,2,15018,'4.99','2005-08-22 08:52:38','2006-02-15 22:20:29'),(13602,504,1,15166,'6.99','2005-08-22 15:05:37','2006-02-15 22:20:29'),(13603,504,1,15723,'8.99','2005-08-23 11:17:26','2006-02-15 22:20:29'),(13604,504,2,16022,'4.99','2005-08-23 21:44:27','2006-02-15 22:20:29'),(13605,505,1,159,'2.99','2005-05-26 01:34:28','2006-02-15 22:20:29'),(13606,505,1,645,'2.99','2005-05-28 19:14:09','2006-02-15 22:20:29'),(13607,505,2,1799,'5.99','2005-06-16 20:17:20','2006-02-15 22:20:29'),(13608,505,2,1886,'4.99','2005-06-17 03:36:02','2006-02-15 22:20:29'),(13609,505,1,2773,'7.99','2005-06-19 18:04:18','2006-02-15 22:20:30'),(13610,505,1,3137,'5.99','2005-06-20 19:41:28','2006-02-15 22:20:30'),(13611,505,2,4008,'5.99','2005-07-07 00:26:43','2006-02-15 22:20:30'),(13612,505,1,4507,'6.99','2005-07-08 02:22:45','2006-02-15 22:20:30'),(13613,505,2,5976,'9.99','2005-07-11 00:16:35','2006-02-15 22:20:30'),(13614,505,2,6292,'4.99','2005-07-11 17:23:33','2006-02-15 22:20:30'),(13615,505,1,6441,'0.99','2005-07-12 00:27:08','2006-02-15 22:20:30'),(13616,505,1,7784,'4.99','2005-07-28 07:15:32','2006-02-15 22:20:30'),(13617,505,2,10219,'5.99','2005-08-01 01:10:33','2006-02-15 22:20:30'),(13618,505,1,10896,'2.99','2005-08-02 01:19:33','2006-02-15 22:20:30'),(13619,505,1,11163,'0.99','2005-08-02 10:08:40','2006-02-15 22:20:30'),(13620,505,1,11907,'2.99','2005-08-17 15:40:47','2006-02-15 22:20:30'),(13621,505,2,13612,'3.99','2005-08-20 06:22:08','2006-02-15 22:20:30'),(13622,505,1,14398,'2.99','2005-08-21 10:27:21','2006-02-15 22:20:30'),(13623,505,1,14802,'2.99','2005-08-22 00:48:23','2006-02-15 22:20:30'),(13624,505,1,15436,'4.99','2005-08-23 00:30:26','2006-02-15 22:20:30'),(13625,505,2,15867,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:31'),(13626,506,1,114,'3.99','2005-05-25 19:12:42','2006-02-15 22:20:31'),(13627,506,2,387,'2.99','2005-05-27 10:35:27','2006-02-15 22:20:31'),(13628,506,2,410,'3.99','2005-05-27 14:11:22','2006-02-15 22:20:31'),(13629,506,1,547,'8.99','2005-05-28 07:24:28','2006-02-15 22:20:31'),(13630,506,2,907,'0.99','2005-05-30 10:37:27','2006-02-15 22:20:31'),(13631,506,1,1042,'2.99','2005-05-31 05:53:00','2006-02-15 22:20:31'),(13632,506,2,1153,'4.99','2005-05-31 21:36:44','2006-02-15 22:20:31'),(13633,506,1,1446,'6.99','2005-06-15 19:13:45','2006-02-15 22:20:31'),(13634,506,1,1467,'2.99','2005-06-15 20:47:10','2006-02-15 22:20:31'),(13635,506,2,1565,'0.99','2005-06-16 03:13:09','2006-02-15 22:20:31'),(13636,506,1,2755,'9.99','2005-06-19 16:56:31','2006-02-15 22:20:31'),(13637,506,2,2824,'6.99','2005-06-19 20:31:45','2006-02-15 22:20:31'),(13638,506,2,4594,'7.99','2005-07-08 06:40:06','2006-02-15 22:20:31'),(13639,506,2,4640,'6.99','2005-07-08 08:59:34','2006-02-15 22:20:31'),(13640,506,2,4806,'8.99','2005-07-08 17:01:02','2006-02-15 22:20:31'),(13641,506,2,5985,'0.99','2005-07-11 00:51:58','2006-02-15 22:20:32'),(13642,506,1,6783,'2.99','2005-07-12 16:27:56','2006-02-15 22:20:32'),(13643,506,1,7020,'0.99','2005-07-27 02:24:27','2006-02-15 22:20:32'),(13644,506,2,8096,'9.99','2005-07-28 18:32:46','2006-02-15 22:20:32'),(13645,506,2,8506,'0.99','2005-07-29 09:23:52','2006-02-15 22:20:32'),(13646,506,2,9654,'3.99','2005-07-31 05:57:42','2006-02-15 22:20:32'),(13647,506,2,9972,'2.99','2005-07-31 16:42:43','2006-02-15 22:20:32'),(13648,506,1,10477,'2.99','2005-08-01 10:04:17','2006-02-15 22:20:32'),(13649,506,1,10873,'4.99','2005-08-02 00:30:34','2006-02-15 22:20:32'),(13650,506,2,11238,'0.99','2005-08-02 13:25:50','2006-02-15 22:20:32'),(13651,506,2,11781,'4.99','2005-08-17 10:37:00','2006-02-15 22:20:32'),(13652,506,1,12994,'0.99','2005-08-19 07:26:10','2006-02-15 22:20:32'),(13653,506,2,13073,'2.99','2005-08-19 10:05:38','2006-02-15 22:20:32'),(13654,506,2,13767,'0.99','2005-08-20 11:43:36','2006-02-15 22:20:32'),(13655,506,1,14074,'1.99','2005-08-20 23:16:07','2006-02-15 22:20:32'),(13656,506,1,14337,'2.99','2005-08-21 08:34:26','2006-02-15 22:20:32'),(13657,506,2,14395,'6.99','2005-08-21 10:24:00','2006-02-15 22:20:33'),(13658,506,2,15022,'5.99','2005-08-22 08:55:43','2006-02-15 22:20:33'),(13659,506,2,15572,'1.99','2005-08-23 05:28:01','2006-02-15 22:20:33'),(13660,506,1,15694,'9.99','2005-08-23 10:02:46','2006-02-15 22:20:33'),(13661,507,1,52,'0.99','2005-05-25 06:51:29','2006-02-15 22:20:33'),(13662,507,2,713,'4.99','2005-05-29 04:10:17','2006-02-15 22:20:33'),(13663,507,2,1307,'4.99','2005-06-15 10:06:15','2006-02-15 22:20:33'),(13664,507,1,2143,'4.99','2005-06-17 21:58:13','2006-02-15 22:20:33'),(13665,507,2,2283,'4.99','2005-06-18 06:56:06','2006-02-15 22:20:33'),(13666,507,1,3660,'4.99','2005-07-06 08:07:29','2006-02-15 22:20:33'),(13667,507,1,3880,'2.99','2005-07-06 18:32:49','2006-02-15 22:20:33'),(13668,507,2,4440,'0.99','2005-07-07 23:00:58','2006-02-15 22:20:33'),(13669,507,2,4455,'2.99','2005-07-07 23:43:46','2006-02-15 22:20:33'),(13670,507,2,4744,'0.99','2005-07-08 13:43:57','2006-02-15 22:20:33'),(13671,507,2,4901,'2.99','2005-07-08 20:44:51','2006-02-15 22:20:33'),(13672,507,1,5962,'0.99','2005-07-10 23:45:22','2006-02-15 22:20:33'),(13673,507,1,6351,'6.99','2005-07-11 20:31:44','2006-02-15 22:20:34'),(13674,507,1,6396,'1.99','2005-07-11 22:31:08','2006-02-15 22:20:34'),(13675,507,1,6891,'2.99','2005-07-12 21:07:35','2006-02-15 22:20:34'),(13676,507,2,7770,'5.99','2005-07-28 06:49:35','2006-02-15 22:20:34'),(13677,507,1,7970,'5.99','2005-07-28 13:58:38','2006-02-15 22:20:34'),(13678,507,2,8369,'2.99','2005-07-29 05:15:42','2006-02-15 22:20:34'),(13679,507,2,8976,'2.99','2005-07-30 04:12:32','2006-02-15 22:20:34'),(13680,507,1,9003,'2.99','2005-07-30 05:02:52','2006-02-15 22:20:34'),(13681,507,2,12071,'6.99','2005-08-17 21:49:14','2006-02-15 22:20:34'),(13682,507,2,12275,'4.99','2005-08-18 04:42:02','2006-02-15 22:20:34'),(13683,507,1,12343,'4.99','2005-08-18 07:15:13','2006-02-15 22:20:34'),(13684,507,2,14625,'4.99','2005-08-21 18:34:21','2006-02-15 22:20:34'),(13685,507,1,15394,'2.99','2005-08-22 23:04:21','2006-02-15 22:20:34'),(13686,508,1,369,'2.99','2005-05-27 07:46:49','2006-02-15 22:20:34'),(13687,508,2,921,'2.99','2005-05-30 11:53:09','2006-02-15 22:20:34'),(13688,508,2,1661,'4.99','2005-06-16 10:12:57','2006-02-15 22:20:34'),(13689,508,2,5657,'9.99','2005-07-10 07:33:43','2006-02-15 22:20:35'),(13690,508,2,5978,'6.99','2005-07-11 00:16:54','2006-02-15 22:20:35'),(13691,508,1,6101,'4.99','2005-07-11 06:50:33','2006-02-15 22:20:35'),(13692,508,2,6646,'0.99','2005-07-12 10:41:34','2006-02-15 22:20:35'),(13693,508,2,6929,'8.99','2005-07-26 22:59:19','2006-02-15 22:20:35'),(13694,508,1,7283,'5.99','2005-07-27 12:02:41','2006-02-15 22:20:35'),(13695,508,2,7322,'3.99','2005-07-27 13:37:26','2006-02-15 22:20:35'),(13696,508,2,7327,'7.99','2005-07-27 13:53:26','2006-02-15 22:20:35'),(13697,508,2,7668,'2.99','2005-07-28 02:41:31','2006-02-15 22:20:35'),(13698,508,2,7676,'4.99','2005-07-28 02:55:27','2006-02-15 22:20:35'),(13699,508,2,8191,'4.99','2005-07-28 22:47:14','2006-02-15 22:20:35'),(13700,508,2,9694,'5.99','2005-07-31 07:13:16','2006-02-15 22:20:35'),(13701,508,1,9706,'2.99','2005-07-31 07:43:19','2006-02-15 22:20:35'),(13702,508,2,10128,'2.99','2005-07-31 21:40:04','2006-02-15 22:20:35'),(13703,508,1,10746,'8.99','2005-08-01 19:58:49','2006-02-15 22:20:35'),(13704,508,1,11365,'2.99','2005-08-02 18:00:09','2006-02-15 22:20:35'),(13705,508,2,11447,'6.99','2005-08-02 20:36:25','2006-02-15 22:20:36'),(13706,508,1,13095,'6.99','2005-08-19 10:48:10','2006-02-15 22:20:36'),(13707,508,2,13201,'2.99','2005-08-19 14:56:05','2006-02-15 22:20:36'),(13708,508,1,15010,'6.99','2005-08-22 08:30:17','2006-02-15 22:20:36'),(13709,508,1,15195,'4.99','2005-08-22 16:08:23','2006-02-15 22:20:36'),(13710,508,1,14318,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:36'),(13711,509,1,22,'4.99','2005-05-25 02:19:23','2006-02-15 22:20:36'),(13712,509,1,831,'8.99','2005-05-29 22:50:25','2006-02-15 22:20:36'),(13713,509,1,1267,'2.99','2005-06-15 07:21:21','2006-02-15 22:20:36'),(13714,509,2,2919,'4.99','2005-06-20 04:10:16','2006-02-15 22:20:36'),(13715,509,2,4139,'1.99','2005-07-07 08:17:35','2006-02-15 22:20:36'),(13716,509,2,4266,'4.99','2005-07-07 14:34:50','2006-02-15 22:20:36'),(13717,509,2,4832,'2.99','2005-07-08 18:07:05','2006-02-15 22:20:36'),(13718,509,2,5008,'2.99','2005-07-09 01:31:42','2006-02-15 22:20:36'),(13719,509,1,6591,'5.99','2005-07-12 07:13:46','2006-02-15 22:20:36'),(13720,509,1,7848,'6.99','2005-07-28 09:24:31','2006-02-15 22:20:36'),(13721,509,1,8114,'8.99','2005-07-28 19:14:06','2006-02-15 22:20:37'),(13722,509,1,8214,'5.99','2005-07-28 23:37:57','2006-02-15 22:20:37'),(13723,509,2,8240,'0.99','2005-07-29 00:33:32','2006-02-15 22:20:37'),(13724,509,1,10189,'4.99','2005-08-01 00:25:00','2006-02-15 22:20:37'),(13725,509,2,10988,'5.99','2005-08-02 04:38:17','2006-02-15 22:20:37'),(13726,509,1,11814,'6.99','2005-08-17 12:09:20','2006-02-15 22:20:37'),(13727,509,2,12109,'4.99','2005-08-17 22:58:35','2006-02-15 22:20:37'),(13728,509,2,14045,'4.99','2005-08-20 21:50:11','2006-02-15 22:20:37'),(13729,509,2,14994,'5.99','2005-08-22 07:52:24','2006-02-15 22:20:37'),(13730,509,1,15965,'2.99','2005-08-23 19:46:39','2006-02-15 22:20:37'),(13731,510,1,75,'8.99','2005-05-25 11:13:34','2006-02-15 22:20:37'),(13732,510,1,372,'5.99','2005-05-27 08:13:58','2006-02-15 22:20:37'),(13733,510,2,1118,'4.99','2005-05-31 16:23:02','2006-02-15 22:20:37'),(13734,510,2,1435,'5.99','2005-06-15 18:32:30','2006-02-15 22:20:37'),(13735,510,2,1757,'0.99','2005-06-16 17:32:24','2006-02-15 22:20:37'),(13736,510,2,1925,'0.99','2005-06-17 06:16:47','2006-02-15 22:20:37'),(13737,510,1,2729,'8.99','2005-06-19 15:06:15','2006-02-15 22:20:38'),(13738,510,2,2806,'0.99','2005-06-19 19:30:48','2006-02-15 22:20:38'),(13739,510,2,2817,'0.99','2005-06-19 20:05:22','2006-02-15 22:20:38'),(13740,510,2,3352,'8.99','2005-06-21 11:26:29','2006-02-15 22:20:38'),(13741,510,2,3465,'5.99','2005-06-21 22:10:01','2006-02-15 22:20:38'),(13742,510,2,3744,'2.99','2005-07-06 12:10:02','2006-02-15 22:20:38'),(13743,510,1,4014,'4.99','2005-07-07 00:58:54','2006-02-15 22:20:38'),(13744,510,2,5851,'4.99','2005-07-10 17:40:47','2006-02-15 22:20:38'),(13745,510,1,6531,'1.99','2005-07-12 04:35:24','2006-02-15 22:20:38'),(13746,510,1,7457,'2.99','2005-07-27 18:35:17','2006-02-15 22:20:38'),(13747,510,1,7678,'8.99','2005-07-28 02:58:16','2006-02-15 22:20:38'),(13748,510,2,7794,'9.99','2005-07-28 07:28:03','2006-02-15 22:20:38'),(13749,510,2,8763,'3.99','2005-07-29 19:38:24','2006-02-15 22:20:38'),(13750,510,1,8926,'4.99','2005-07-30 02:10:31','2006-02-15 22:20:38'),(13751,510,1,10131,'0.99','2005-07-31 21:45:28','2006-02-15 22:20:38'),(13752,510,2,10265,'7.99','2005-08-01 03:05:04','2006-02-15 22:20:38'),(13753,510,2,11996,'4.99','2005-08-17 18:34:37','2006-02-15 22:20:39'),(13754,510,1,12317,'0.99','2005-08-18 06:17:06','2006-02-15 22:20:39'),(13755,510,2,12406,'2.99','2005-08-18 09:38:02','2006-02-15 22:20:39'),(13756,510,1,15065,'4.99','2005-08-22 10:46:44','2006-02-15 22:20:39'),(13757,511,1,56,'2.99','2005-05-25 08:28:11','2006-02-15 22:20:39'),(13758,511,1,819,'3.99','2005-05-29 21:00:32','2006-02-15 22:20:39'),(13759,511,2,1281,'2.99','2005-06-15 08:21:39','2006-02-15 22:20:39'),(13760,511,1,1508,'2.99','2005-06-15 22:33:24','2006-02-15 22:20:39'),(13761,511,2,2966,'10.99','2005-06-20 07:39:33','2006-02-15 22:20:39'),(13762,511,2,3366,'4.99','2005-06-21 13:03:37','2006-02-15 22:20:39'),(13763,511,2,3600,'4.99','2005-07-06 05:19:42','2006-02-15 22:20:39'),(13764,511,1,3852,'0.99','2005-07-06 16:57:49','2006-02-15 22:20:39'),(13765,511,1,4482,'4.99','2005-07-08 01:01:18','2006-02-15 22:20:39'),(13766,511,2,5164,'3.99','2005-07-09 09:03:14','2006-02-15 22:20:39'),(13767,511,1,5601,'0.99','2005-07-10 04:56:55','2006-02-15 22:20:39'),(13768,511,2,6040,'0.99','2005-07-11 03:14:26','2006-02-15 22:20:39'),(13769,511,1,6320,'0.99','2005-07-11 18:50:55','2006-02-15 22:20:40'),(13770,511,1,8026,'4.99','2005-07-28 16:05:38','2006-02-15 22:20:40'),(13771,511,1,9095,'0.99','2005-07-30 08:38:36','2006-02-15 22:20:40'),(13772,511,1,9143,'6.99','2005-07-30 10:22:11','2006-02-15 22:20:40'),(13773,511,1,9760,'4.99','2005-07-31 09:29:33','2006-02-15 22:20:40'),(13774,511,1,10231,'2.99','2005-08-01 01:50:49','2006-02-15 22:20:40'),(13775,511,2,10429,'2.99','2005-08-01 08:34:18','2006-02-15 22:20:40'),(13776,511,2,12110,'6.99','2005-08-17 22:59:46','2006-02-15 22:20:40'),(13777,511,1,12920,'4.99','2005-08-19 04:32:32','2006-02-15 22:20:40'),(13778,511,1,14213,'4.99','2005-08-21 04:30:47','2006-02-15 22:20:40'),(13779,511,1,14302,'6.99','2005-08-21 07:19:57','2006-02-15 22:20:40'),(13780,511,1,15172,'4.99','2005-08-22 15:25:33','2006-02-15 22:20:40'),(13781,512,1,1176,'6.99','2005-06-15 00:28:37','2006-02-15 22:20:40'),(13782,512,2,2029,'4.99','2005-06-17 13:10:59','2006-02-15 22:20:40'),(13783,512,1,2364,'2.99','2005-06-18 13:37:32','2006-02-15 22:20:40'),(13784,512,1,4752,'5.99','2005-07-08 14:15:20','2006-02-15 22:20:40'),(13785,512,1,4799,'0.99','2005-07-08 16:49:27','2006-02-15 22:20:41'),(13786,512,1,5064,'6.99','2005-07-09 04:38:51','2006-02-15 22:20:41'),(13787,512,2,5813,'3.99','2005-07-10 15:34:37','2006-02-15 22:20:41'),(13788,512,1,7219,'2.99','2005-07-27 09:35:36','2006-02-15 22:20:41'),(13789,512,1,7507,'0.99','2005-07-27 20:31:48','2006-02-15 22:20:41'),(13790,512,1,7715,'6.99','2005-07-28 04:32:38','2006-02-15 22:20:41'),(13791,512,2,8868,'4.99','2005-07-30 00:02:26','2006-02-15 22:20:41'),(13792,512,1,9055,'2.99','2005-07-30 07:13:07','2006-02-15 22:20:41'),(13793,512,2,10232,'4.99','2005-08-01 01:50:55','2006-02-15 22:20:41'),(13794,512,2,10670,'3.99','2005-08-01 17:07:16','2006-02-15 22:20:41'),(13795,512,2,11818,'9.99','2005-08-17 12:22:04','2006-02-15 22:20:41'),(13796,512,2,12957,'8.99','2005-08-19 06:12:44','2006-02-15 22:20:41'),(13797,512,2,13156,'4.99','2005-08-19 13:10:42','2006-02-15 22:20:41'),(13798,512,2,13771,'0.99','2005-08-20 11:47:21','2006-02-15 22:20:41'),(13799,512,1,14288,'4.99','2005-08-21 06:57:34','2006-02-15 22:20:41'),(13800,512,1,14870,'2.99','2005-08-22 03:23:20','2006-02-15 22:20:41'),(13801,512,1,15153,'2.99','2005-08-22 14:26:01','2006-02-15 22:20:42'),(13802,512,2,15265,'3.99','2005-08-22 18:35:59','2006-02-15 22:20:42'),(13803,512,1,15317,'3.99','2005-08-22 20:14:13','2006-02-15 22:20:42'),(13804,512,2,15733,'4.99','2005-08-23 11:37:32','2006-02-15 22:20:42'),(13805,512,2,15990,'4.99','2005-08-23 20:25:11','2006-02-15 22:20:42'),(13806,512,1,12786,'0.99','2006-02-14 15:16:03','2006-02-15 22:20:42'),(13807,513,2,993,'4.99','2005-05-30 23:54:19','2006-02-15 22:20:42'),(13808,513,1,1607,'2.99','2005-06-16 06:25:35','2006-02-15 22:20:42'),(13809,513,2,2290,'7.99','2005-06-18 07:34:37','2006-02-15 22:20:42'),(13810,513,2,2737,'1.99','2005-06-19 15:48:33','2006-02-15 22:20:42'),(13811,513,2,3872,'0.99','2005-07-06 18:00:19','2006-02-15 22:20:42'),(13812,513,2,4055,'2.99','2005-07-07 03:49:13','2006-02-15 22:20:42'),(13813,513,2,4178,'4.99','2005-07-07 10:14:31','2006-02-15 22:20:42'),(13814,513,2,4220,'4.99','2005-07-07 12:12:36','2006-02-15 22:20:42'),(13815,513,1,5741,'7.99','2005-07-10 11:55:40','2006-02-15 22:20:42'),(13816,513,1,6027,'4.99','2005-07-11 02:26:29','2006-02-15 22:20:42'),(13817,513,1,7655,'0.99','2005-07-28 02:01:11','2006-02-15 22:20:43'),(13818,513,2,8320,'4.99','2005-07-29 03:49:58','2006-02-15 22:20:43'),(13819,513,1,8350,'4.99','2005-07-29 04:50:39','2006-02-15 22:20:43'),(13820,513,2,8683,'9.99','2005-07-29 16:15:43','2006-02-15 22:20:43'),(13821,513,1,8798,'5.99','2005-07-29 21:15:38','2006-02-15 22:20:43'),(13822,513,2,9862,'2.99','2005-07-31 13:05:03','2006-02-15 22:20:43'),(13823,513,1,10012,'3.99','2005-07-31 18:06:06','2006-02-15 22:20:43'),(13824,513,2,11081,'2.99','2005-08-02 07:30:14','2006-02-15 22:20:43'),(13825,513,1,11165,'2.99','2005-08-02 10:12:17','2006-02-15 22:20:43'),(13826,513,1,11407,'3.99','2005-08-02 19:18:43','2006-02-15 22:20:43'),(13827,513,1,11755,'3.99','2005-08-17 09:15:35','2006-02-15 22:20:43'),(13828,513,1,12559,'5.99','2005-08-18 14:53:58','2006-02-15 22:20:43'),(13829,513,2,12784,'2.99','2005-08-19 00:02:46','2006-02-15 22:20:43'),(13830,513,2,12807,'4.99','2005-08-19 00:38:46','2006-02-15 22:20:43'),(13831,513,1,13596,'5.99','2005-08-20 05:58:58','2006-02-15 22:20:43'),(13832,513,1,13690,'4.99','2005-08-20 09:07:27','2006-02-15 22:20:43'),(13833,513,2,14844,'7.99','2005-08-22 02:09:12','2006-02-15 22:20:44'),(13834,513,1,14875,'4.99','2005-08-22 03:34:39','2006-02-15 22:20:44'),(13835,513,1,15035,'4.99','2005-08-22 09:34:32','2006-02-15 22:20:44'),(13836,513,2,15289,'6.99','2005-08-22 19:27:24','2006-02-15 22:20:44'),(13837,513,2,15545,'5.99','2005-08-23 04:20:16','2006-02-15 22:20:44'),(13838,514,2,536,'4.99','2005-05-28 06:17:33','2006-02-15 22:20:44'),(13839,514,2,1692,'4.99','2005-06-16 12:30:19','2006-02-15 22:20:44'),(13840,514,1,2002,'3.99','2005-06-17 11:39:58','2006-02-15 22:20:44'),(13841,514,2,2362,'0.99','2005-06-18 13:31:15','2006-02-15 22:20:44'),(13842,514,1,2789,'0.99','2005-06-19 18:48:21','2006-02-15 22:20:44'),(13843,514,2,3084,'2.99','2005-06-20 15:35:24','2006-02-15 22:20:44'),(13844,514,1,3385,'0.99','2005-06-21 14:16:48','2006-02-15 22:20:44'),(13845,514,2,3668,'5.99','2005-07-06 08:36:48','2006-02-15 22:20:44'),(13846,514,2,3860,'2.99','2005-07-06 17:20:24','2006-02-15 22:20:44'),(13847,514,1,7791,'4.99','2005-07-28 07:22:51','2006-02-15 22:20:44'),(13848,514,1,9038,'3.99','2005-07-30 06:23:35','2006-02-15 22:20:45'),(13849,514,1,11675,'1.99','2005-08-17 05:57:54','2006-02-15 22:20:45'),(13850,514,2,12067,'4.99','2005-08-17 21:36:47','2006-02-15 22:20:45'),(13851,514,1,12293,'4.99','2005-08-18 05:13:36','2006-02-15 22:20:45'),(13852,514,1,12302,'4.99','2005-08-18 05:41:39','2006-02-15 22:20:45'),(13853,514,2,12578,'0.99','2005-08-18 15:47:11','2006-02-15 22:20:45'),(13854,514,1,12752,'2.99','2005-08-18 22:33:36','2006-02-15 22:20:45'),(13855,514,2,13344,'3.99','2005-08-19 20:22:44','2006-02-15 22:20:45'),(13856,514,1,14052,'0.99','2005-08-20 22:11:46','2006-02-15 22:20:45'),(13857,514,1,14386,'1.99','2005-08-21 10:06:34','2006-02-15 22:20:45'),(13858,514,1,15451,'2.99','2005-08-23 00:56:27','2006-02-15 22:20:45'),(13859,514,1,15776,'5.99','2005-08-23 13:26:01','2006-02-15 22:20:45'),(13860,515,2,187,'8.99','2005-05-26 05:42:37','2006-02-15 22:20:45'),(13861,515,2,292,'6.99','2005-05-26 20:22:12','2006-02-15 22:20:45'),(13862,515,1,1244,'4.99','2005-06-15 05:08:40','2006-02-15 22:20:45'),(13863,515,2,1531,'5.99','2005-06-16 00:40:34','2006-02-15 22:20:45'),(13864,515,2,2003,'4.99','2005-06-17 11:40:35','2006-02-15 22:20:46'),(13865,515,2,2484,'4.99','2005-06-18 21:25:23','2006-02-15 22:20:46'),(13866,515,2,2513,'0.99','2005-06-18 23:53:15','2006-02-15 22:20:46'),(13867,515,2,3063,'3.99','2005-06-20 13:52:03','2006-02-15 22:20:46'),(13868,515,2,3782,'0.99','2005-07-06 13:57:03','2006-02-15 22:20:46'),(13869,515,2,4111,'6.99','2005-07-07 06:47:56','2006-02-15 22:20:46'),(13870,515,2,5216,'0.99','2005-07-09 11:54:58','2006-02-15 22:20:46'),(13871,515,2,5546,'2.99','2005-07-10 02:50:37','2006-02-15 22:20:46'),(13872,515,2,5697,'4.99','2005-07-10 09:44:44','2006-02-15 22:20:46'),(13873,515,2,7429,'3.99','2005-07-27 17:24:50','2006-02-15 22:20:46'),(13874,515,1,8706,'4.99','2005-07-29 17:19:15','2006-02-15 22:20:46'),(13875,515,1,10159,'4.99','2005-07-31 22:54:30','2006-02-15 22:20:46'),(13876,515,2,10716,'0.99','2005-08-01 18:53:48','2006-02-15 22:20:46'),(13877,515,1,11451,'3.99','2005-08-02 20:45:56','2006-02-15 22:20:46'),(13878,515,2,11572,'4.99','2005-08-17 01:37:55','2006-02-15 22:20:46'),(13879,515,1,11691,'3.99','2005-08-17 06:51:05','2006-02-15 22:20:47'),(13880,515,2,11937,'6.99','2005-08-17 16:48:36','2006-02-15 22:20:47'),(13881,515,2,12416,'2.99','2005-08-18 09:56:48','2006-02-15 22:20:47'),(13882,515,1,12486,'8.99','2005-08-18 12:42:50','2006-02-15 22:20:47'),(13883,515,1,12889,'5.99','2005-08-19 03:41:31','2006-02-15 22:20:47'),(13884,515,2,14072,'4.99','2005-08-20 23:07:10','2006-02-15 22:20:47'),(13885,515,2,14378,'3.99','2005-08-21 09:50:02','2006-02-15 22:20:47'),(13886,515,2,14414,'0.99','2005-08-21 11:08:17','2006-02-15 22:20:47'),(13887,515,2,15274,'4.99','2005-08-22 18:55:52','2006-02-15 22:20:47'),(13888,516,2,339,'3.99','2005-05-27 03:47:18','2006-02-15 22:20:47'),(13889,516,1,571,'1.99','2005-05-28 10:17:41','2006-02-15 22:20:47'),(13890,516,2,1159,'4.99','2005-06-14 22:55:13','2006-02-15 22:20:47'),(13891,516,1,1200,'1.99','2005-06-15 01:59:51','2006-02-15 22:20:47'),(13892,516,1,1718,'10.99','2005-06-16 14:52:02','2006-02-15 22:20:47'),(13893,516,1,2017,'0.99','2005-06-17 12:33:30','2006-02-15 22:20:47'),(13894,516,2,3068,'0.99','2005-06-20 14:02:22','2006-02-15 22:20:47'),(13895,516,1,3431,'2.99','2005-06-21 18:46:48','2006-02-15 22:20:48'),(13896,516,2,5780,'3.99','2005-07-10 13:46:23','2006-02-15 22:20:48'),(13897,516,2,6677,'6.99','2005-07-12 11:58:14','2006-02-15 22:20:48'),(13898,516,1,6858,'6.99','2005-07-12 19:53:51','2006-02-15 22:20:48'),(13899,516,1,7628,'4.99','2005-07-28 00:58:04','2006-02-15 22:20:48'),(13900,516,1,7882,'4.99','2005-07-28 10:33:42','2006-02-15 22:20:48'),(13901,516,2,8396,'4.99','2005-07-29 06:07:00','2006-02-15 22:20:48'),(13902,516,2,8534,'5.99','2005-07-29 10:30:13','2006-02-15 22:20:48'),(13903,516,2,8585,'2.99','2005-07-29 12:14:18','2006-02-15 22:20:48'),(13904,516,2,9243,'4.99','2005-07-30 14:06:27','2006-02-15 22:20:48'),(13905,516,2,11926,'0.99','2005-08-17 16:25:02','2006-02-15 22:20:48'),(13906,516,2,11939,'1.99','2005-08-17 16:55:57','2006-02-15 22:20:48'),(13907,516,1,12535,'1.99','2005-08-18 14:05:22','2006-02-15 22:20:48'),(13908,516,1,13276,'8.99','2005-08-19 17:53:42','2006-02-15 22:20:48'),(13909,516,1,14932,'0.99','2005-08-22 05:40:39','2006-02-15 22:20:48'),(13910,516,1,15526,'0.99','2005-08-23 03:44:30','2006-02-15 22:20:48'),(13911,516,1,15701,'0.99','2005-08-23 10:22:21','2006-02-15 22:20:49'),(13912,516,1,12130,'5.98','2006-02-14 15:16:03','2006-02-15 22:20:49'),(13913,516,1,12915,'0.00','2006-02-14 15:16:03','2006-02-15 22:20:49'),(13914,517,2,850,'4.99','2005-05-30 01:35:12','2006-02-15 22:20:49'),(13915,517,2,1653,'4.99','2005-06-16 09:34:45','2006-02-15 22:20:49'),(13916,517,1,1809,'8.99','2005-06-16 21:00:20','2006-02-15 22:20:49'),(13917,517,1,1850,'4.99','2005-06-17 00:31:35','2006-02-15 22:20:49'),(13918,517,2,2534,'2.99','2005-06-19 01:38:39','2006-02-15 22:20:49'),(13919,517,1,3113,'0.99','2005-06-20 17:56:40','2006-02-15 22:20:49'),(13920,517,2,4094,'2.99','2005-07-07 06:00:21','2006-02-15 22:20:49'),(13921,517,1,4109,'4.99','2005-07-07 06:39:43','2006-02-15 22:20:49'),(13922,517,1,4369,'4.99','2005-07-07 20:01:38','2006-02-15 22:20:49'),(13923,517,2,4374,'4.99','2005-07-07 20:13:58','2006-02-15 22:20:49'),(13924,517,2,4934,'0.99','2005-07-08 22:18:42','2006-02-15 22:20:49'),(13925,517,1,4993,'2.99','2005-07-09 00:49:47','2006-02-15 22:20:49'),(13926,517,1,5206,'7.99','2005-07-09 11:11:01','2006-02-15 22:20:49'),(13927,517,2,5974,'5.99','2005-07-11 00:10:37','2006-02-15 22:20:50'),(13928,517,2,6594,'4.99','2005-07-12 07:25:43','2006-02-15 22:20:50'),(13929,517,2,6903,'0.99','2005-07-12 21:58:15','2006-02-15 22:20:50'),(13930,517,2,7988,'3.99','2005-07-28 14:37:18','2006-02-15 22:20:50'),(13931,517,1,10063,'4.99','2005-07-31 19:25:13','2006-02-15 22:20:50'),(13932,517,2,10358,'4.99','2005-08-01 05:50:07','2006-02-15 22:20:50'),(13933,517,2,10433,'4.99','2005-08-01 08:45:56','2006-02-15 22:20:50'),(13934,517,1,11684,'3.99','2005-08-17 06:27:15','2006-02-15 22:20:50'),(13935,517,2,12705,'0.99','2005-08-18 20:44:14','2006-02-15 22:20:50'),(13936,517,1,13396,'0.99','2005-08-19 22:06:09','2006-02-15 22:20:50'),(13937,517,2,14190,'4.99','2005-08-21 03:35:21','2006-02-15 22:20:50'),(13938,517,1,15559,'5.99','2005-08-23 04:55:05','2006-02-15 22:20:50'),(13939,518,1,710,'2.99','2005-05-29 03:48:36','2006-02-15 22:20:50'),(13940,518,2,1552,'5.99','2005-06-16 02:01:37','2006-02-15 22:20:50'),(13941,518,2,3311,'0.99','2005-06-21 08:05:27','2006-02-15 22:20:50'),(13942,518,1,3652,'0.99','2005-07-06 07:44:30','2006-02-15 22:20:51'),(13943,518,2,4029,'7.99','2005-07-07 02:19:44','2006-02-15 22:20:51'),(13944,518,2,4661,'4.99','2005-07-08 09:55:06','2006-02-15 22:20:51'),(13945,518,2,4948,'6.99','2005-07-08 22:54:21','2006-02-15 22:20:51'),(13946,518,1,6652,'2.99','2005-07-12 10:59:38','2006-02-15 22:20:51'),(13947,518,1,6957,'2.99','2005-07-27 00:00:00','2006-02-15 22:20:51'),(13948,518,2,7038,'3.99','2005-07-27 03:07:29','2006-02-15 22:20:51'),(13949,518,2,7154,'4.99','2005-07-27 07:16:17','2006-02-15 22:20:51'),(13950,518,2,7382,'2.99','2005-07-27 15:43:15','2006-02-15 22:20:51'),(13951,518,1,7657,'2.99','2005-07-28 02:09:00','2006-02-15 22:20:51'),(13952,518,2,7839,'6.99','2005-07-28 09:01:13','2006-02-15 22:20:51'),(13953,518,1,8107,'3.99','2005-07-28 19:03:16','2006-02-15 22:20:51'),(13954,518,1,8397,'2.99','2005-07-29 06:09:35','2006-02-15 22:20:51'),(13955,518,1,10751,'5.99','2005-08-01 20:06:10','2006-02-15 22:20:51'),(13956,518,2,11433,'3.99','2005-08-02 20:13:10','2006-02-15 22:20:51'),(13957,518,2,12450,'2.99','2005-08-18 11:04:04','2006-02-15 22:20:51'),(13958,518,2,12681,'2.99','2005-08-18 19:48:06','2006-02-15 22:20:52'),(13959,518,1,13065,'4.99','2005-08-19 09:48:52','2006-02-15 22:20:52'),(13960,518,1,13539,'6.99','2005-08-20 03:40:27','2006-02-15 22:20:52'),(13961,518,1,14088,'6.99','2005-08-20 23:57:24','2006-02-15 22:20:52'),(13962,518,1,14149,'4.99','2005-08-21 02:22:47','2006-02-15 22:20:52'),(13963,518,2,14980,'0.99','2005-08-22 07:16:45','2006-02-15 22:20:52'),(13964,518,2,15434,'4.99','2005-08-23 00:28:16','2006-02-15 22:20:52'),(13965,519,1,1056,'3.99','2005-05-31 07:48:07','2006-02-15 22:20:52'),(13966,519,1,1941,'2.99','2005-06-17 07:42:45','2006-02-15 22:20:52'),(13967,519,2,2505,'8.99','2005-06-18 23:28:27','2006-02-15 22:20:52'),(13968,519,2,2997,'5.99','2005-06-20 09:23:45','2006-02-15 22:20:52'),(13969,519,2,4564,'0.99','2005-07-08 05:09:38','2006-02-15 22:20:52'),(13970,519,2,4773,'2.99','2005-07-08 15:41:39','2006-02-15 22:20:52'),(13971,519,2,5236,'0.99','2005-07-09 12:56:29','2006-02-15 22:20:52'),(13972,519,2,5547,'5.99','2005-07-10 02:52:47','2006-02-15 22:20:52'),(13973,519,2,6063,'0.99','2005-07-11 04:16:51','2006-02-15 22:20:52'),(13974,519,1,6599,'3.99','2005-07-12 07:41:14','2006-02-15 22:20:53'),(13975,519,1,9417,'6.99','2005-07-30 20:54:55','2006-02-15 22:20:53'),(13976,519,2,9441,'4.99','2005-07-30 21:43:28','2006-02-15 22:20:53'),(13977,519,2,9534,'7.99','2005-07-31 01:18:27','2006-02-15 22:20:53'),(13978,519,2,9645,'0.99','2005-07-31 05:42:49','2006-02-15 22:20:53'),(13979,519,2,9886,'7.99','2005-07-31 14:00:13','2006-02-15 22:20:53'),(13980,519,1,9905,'0.99','2005-07-31 14:37:03','2006-02-15 22:20:53'),(13981,519,1,10097,'5.99','2005-07-31 20:39:38','2006-02-15 22:20:53'),(13982,519,2,10697,'4.99','2005-08-01 18:20:23','2006-02-15 22:20:53'),(13983,519,2,12648,'7.99','2005-08-18 18:30:21','2006-02-15 22:20:53'),(13984,519,2,12924,'2.99','2005-08-19 04:51:47','2006-02-15 22:20:53'),(13985,519,1,13647,'7.99','2005-08-20 07:48:07','2006-02-15 22:20:53'),(13986,519,1,14182,'2.99','2005-08-21 03:17:10','2006-02-15 22:20:53'),(13987,519,2,15347,'2.99','2005-08-22 21:12:19','2006-02-15 22:20:53'),(13988,520,1,962,'6.99','2005-05-30 18:45:17','2006-02-15 22:20:53'),(13989,520,1,1411,'0.99','2005-06-15 17:05:36','2006-02-15 22:20:54'),(13990,520,2,2174,'6.99','2005-06-18 00:09:01','2006-02-15 22:20:54'),(13991,520,1,2772,'4.99','2005-06-19 17:59:27','2006-02-15 22:20:54'),(13992,520,2,3482,'4.99','2005-07-05 23:13:22','2006-02-15 22:20:54'),(13993,520,1,3499,'7.99','2005-07-06 00:04:20','2006-02-15 22:20:54'),(13994,520,2,4346,'2.99','2005-07-07 18:58:45','2006-02-15 22:20:54'),(13995,520,2,5799,'4.99','2005-07-10 14:53:35','2006-02-15 22:20:54'),(13996,520,1,5802,'10.99','2005-07-10 15:02:17','2006-02-15 22:20:54'),(13997,520,1,5853,'3.99','2005-07-10 17:45:13','2006-02-15 22:20:54'),(13998,520,1,6029,'2.99','2005-07-11 02:36:46','2006-02-15 22:20:54'),(13999,520,2,7198,'5.99','2005-07-27 08:50:07','2006-02-15 22:20:54'),(14000,520,1,7720,'4.99','2005-07-28 04:41:44','2006-02-15 22:20:54'),(14001,520,1,7936,'0.99','2005-07-28 12:33:21','2006-02-15 22:20:54'),(14002,520,1,8294,'2.99','2005-07-29 02:32:41','2006-02-15 22:20:54'),(14003,520,2,8435,'2.99','2005-07-29 07:20:16','2006-02-15 22:20:54'),(14004,520,1,9803,'2.99','2005-07-31 11:06:02','2006-02-15 22:20:54'),(14005,520,1,10072,'0.99','2005-07-31 19:50:37','2006-02-15 22:20:55'),(14006,520,2,10530,'4.99','2005-08-01 12:01:17','2006-02-15 22:20:55'),(14007,520,1,11566,'0.99','2005-08-17 01:28:35','2006-02-15 22:20:55'),(14008,520,1,12517,'4.99','2005-08-18 13:40:20','2006-02-15 22:20:55'),(14009,520,1,12628,'5.99','2005-08-18 17:40:25','2006-02-15 22:20:55'),(14010,520,1,12647,'5.99','2005-08-18 18:29:51','2006-02-15 22:20:55'),(14011,520,1,13311,'0.99','2005-08-19 19:07:09','2006-02-15 22:20:55'),(14012,520,2,13438,'2.99','2005-08-19 23:38:02','2006-02-15 22:20:55'),(14013,520,2,13659,'2.99','2005-08-20 08:05:52','2006-02-15 22:20:55'),(14014,520,2,13746,'5.99','2005-08-20 10:55:28','2006-02-15 22:20:55'),(14015,520,1,14372,'4.99','2005-08-21 09:39:50','2006-02-15 22:20:55'),(14016,520,1,14509,'0.99','2005-08-21 14:39:58','2006-02-15 22:20:55'),(14017,520,1,15465,'0.99','2005-08-23 01:16:33','2006-02-15 22:20:55'),(14018,520,2,15492,'2.99','2005-08-23 02:13:46','2006-02-15 22:20:55'),(14019,520,1,15948,'7.99','2005-08-23 18:59:33','2006-02-15 22:20:55'),(14020,521,1,1761,'0.99','2005-06-16 17:49:57','2006-02-15 22:20:55'),(14021,521,2,2053,'0.99','2005-06-17 15:19:34','2006-02-15 22:20:56'),(14022,521,2,4284,'0.99','2005-07-07 15:31:57','2006-02-15 22:20:56'),(14023,521,2,4439,'2.99','2005-07-07 22:57:30','2006-02-15 22:20:56'),(14024,521,1,5276,'2.99','2005-07-09 14:35:13','2006-02-15 22:20:56'),(14025,521,2,5458,'4.99','2005-07-09 22:35:49','2006-02-15 22:20:56'),(14026,521,2,5580,'6.99','2005-07-10 04:05:49','2006-02-15 22:20:56'),(14027,521,2,5686,'0.99','2005-07-10 09:06:03','2006-02-15 22:20:56'),(14028,521,1,7478,'1.99','2005-07-27 19:16:02','2006-02-15 22:20:56'),(14029,521,1,9556,'7.99','2005-07-31 02:13:30','2006-02-15 22:20:56'),(14030,521,2,9937,'1.99','2005-07-31 15:28:10','2006-02-15 22:20:56'),(14031,521,1,10587,'2.99','2005-08-01 14:03:38','2006-02-15 22:20:56'),(14032,521,2,11625,'2.99','2005-08-17 04:18:52','2006-02-15 22:20:56'),(14033,521,1,11967,'3.99','2005-08-17 17:45:00','2006-02-15 22:20:56'),(14034,521,2,12082,'4.99','2005-08-17 22:13:15','2006-02-15 22:20:56'),(14035,521,1,12530,'4.99','2005-08-18 13:54:48','2006-02-15 22:20:56'),(14036,521,1,13527,'2.99','2005-08-20 03:00:47','2006-02-15 22:20:57'),(14037,521,1,14423,'0.99','2005-08-21 11:23:59','2006-02-15 22:20:57'),(14038,521,2,14551,'3.99','2005-08-21 15:57:25','2006-02-15 22:20:57'),(14039,521,2,14738,'5.99','2005-08-21 22:29:13','2006-02-15 22:20:57'),(14040,521,2,15170,'4.99','2005-08-22 15:22:15','2006-02-15 22:20:57'),(14041,521,2,15329,'2.99','2005-08-22 20:32:39','2006-02-15 22:20:57'),(14042,521,2,11672,'4.99','2006-02-14 15:16:03','2006-02-15 22:20:57'),(14043,522,2,426,'5.99','2005-05-27 15:56:57','2006-02-15 22:20:57'),(14044,522,1,1289,'3.99','2005-06-15 08:44:09','2006-02-15 22:20:57'),(14045,522,2,3102,'8.99','2005-06-20 16:55:55','2006-02-15 22:20:57'),(14046,522,1,3188,'2.99','2005-06-20 23:10:27','2006-02-15 22:20:57'),(14047,522,2,3191,'0.99','2005-06-20 23:46:39','2006-02-15 22:20:57'),(14048,522,1,3594,'0.99','2005-07-06 04:42:47','2006-02-15 22:20:57'),(14049,522,2,4078,'4.99','2005-07-07 05:05:05','2006-02-15 22:20:57'),(14050,522,2,4563,'9.99','2005-07-08 05:08:55','2006-02-15 22:20:57'),(14051,522,2,4701,'4.99','2005-07-08 11:38:48','2006-02-15 22:20:57'),(14052,522,2,5271,'6.99','2005-07-09 14:25:01','2006-02-15 22:20:58'),(14053,522,2,5514,'6.99','2005-07-10 01:09:42','2006-02-15 22:20:58'),(14054,522,2,5532,'4.99','2005-07-10 02:17:31','2006-02-15 22:20:58'),(14055,522,2,5936,'0.99','2005-07-10 22:14:30','2006-02-15 22:20:58'),(14056,522,2,7262,'4.99','2005-07-27 11:15:36','2006-02-15 22:20:58'),(14057,522,1,7955,'2.99','2005-07-28 13:31:36','2006-02-15 22:20:58'),(14058,522,2,8181,'4.99','2005-07-28 22:18:38','2006-02-15 22:20:58'),(14059,522,1,8642,'6.99','2005-07-29 14:38:17','2006-02-15 22:20:58'),(14060,522,1,8966,'2.99','2005-07-30 03:54:12','2006-02-15 22:20:58'),(14061,522,1,9047,'7.99','2005-07-30 06:56:33','2006-02-15 22:20:58'),(14062,522,2,9227,'7.99','2005-07-30 13:36:13','2006-02-15 22:20:58'),(14063,522,1,9335,'4.99','2005-07-30 18:00:53','2006-02-15 22:20:58'),(14064,522,1,9412,'5.99','2005-07-30 20:44:10','2006-02-15 22:20:58'),(14065,522,2,9533,'5.99','2005-07-31 01:18:10','2006-02-15 22:20:58'),(14066,522,2,10223,'0.99','2005-08-01 01:23:15','2006-02-15 22:20:58'),(14067,522,1,10411,'3.99','2005-08-01 07:56:32','2006-02-15 22:20:59'),(14068,522,1,10675,'7.99','2005-08-01 17:11:57','2006-02-15 22:20:59'),(14069,522,2,10821,'5.99','2005-08-01 22:54:27','2006-02-15 22:20:59'),(14070,522,2,11696,'2.99','2005-08-17 07:01:09','2006-02-15 22:20:59'),(14071,522,2,11830,'1.99','2005-08-17 12:53:15','2006-02-15 22:20:59'),(14072,522,2,12494,'6.99','2005-08-18 12:53:49','2006-02-15 22:20:59'),(14073,522,2,13605,'6.99','2005-08-20 06:06:17','2006-02-15 22:20:59'),(14074,522,2,14467,'2.99','2005-08-21 13:03:33','2006-02-15 22:20:59'),(14075,522,1,15921,'6.99','2005-08-23 18:06:54','2006-02-15 22:20:59'),(14076,523,1,42,'4.99','2005-05-25 05:24:58','2006-02-15 22:20:59'),(14077,523,2,664,'0.99','2005-05-28 21:31:08','2006-02-15 22:20:59'),(14078,523,2,1729,'6.99','2005-06-16 15:29:47','2006-02-15 22:20:59'),(14079,523,1,2447,'8.99','2005-06-18 19:10:55','2006-02-15 22:20:59'),(14080,523,1,2583,'7.99','2005-06-19 05:01:40','2006-02-15 22:20:59'),(14081,523,2,2669,'0.99','2005-06-19 11:28:52','2006-02-15 22:20:59'),(14082,523,1,4605,'4.99','2005-07-08 07:00:14','2006-02-15 22:20:59'),(14083,523,2,5155,'2.99','2005-07-09 08:46:54','2006-02-15 22:21:00'),(14084,523,1,5287,'6.99','2005-07-09 15:11:54','2006-02-15 22:21:00'),(14085,523,2,5932,'2.99','2005-07-10 22:05:15','2006-02-15 22:21:00'),(14086,523,2,6675,'4.99','2005-07-12 11:53:06','2006-02-15 22:21:00'),(14087,523,2,7642,'1.99','2005-07-28 01:16:51','2006-02-15 22:21:00'),(14088,523,2,8141,'0.99','2005-07-28 20:21:19','2006-02-15 22:21:00'),(14089,523,1,8372,'5.99','2005-07-29 05:18:08','2006-02-15 22:21:00'),(14090,523,1,9071,'2.99','2005-07-30 07:40:58','2006-02-15 22:21:00'),(14091,523,2,9667,'6.99','2005-07-31 06:23:52','2006-02-15 22:21:00'),(14092,523,2,10470,'1.99','2005-08-01 09:52:26','2006-02-15 22:21:00'),(14093,523,1,11827,'4.99','2005-08-17 12:44:27','2006-02-15 22:21:00'),(14094,523,1,12288,'2.99','2005-08-18 05:01:20','2006-02-15 22:21:00'),(14095,523,1,13133,'2.99','2005-08-19 12:11:03','2006-02-15 22:21:00'),(14096,523,1,14766,'4.99','2005-08-21 23:42:20','2006-02-15 22:21:00'),(14097,523,1,15040,'2.99','2005-08-22 09:41:09','2006-02-15 22:21:00'),(14098,524,2,118,'0.99','2005-05-25 19:31:18','2006-02-15 22:21:00'),(14099,524,1,982,'4.99','2005-05-30 22:15:24','2006-02-15 22:21:01'),(14100,524,1,1306,'1.99','2005-06-15 09:59:24','2006-02-15 22:21:01'),(14101,524,2,1651,'4.99','2005-06-16 09:24:38','2006-02-15 22:21:01'),(14102,524,2,3454,'2.99','2005-06-21 21:12:13','2006-02-15 22:21:01'),(14103,524,1,4366,'5.99','2005-07-07 19:48:36','2006-02-15 22:21:01'),(14104,524,2,5037,'4.99','2005-07-09 02:59:10','2006-02-15 22:21:01'),(14105,524,2,6161,'4.99','2005-07-11 10:11:54','2006-02-15 22:21:01'),(14106,524,1,6240,'6.99','2005-07-11 14:32:41','2006-02-15 22:21:01'),(14107,524,2,6745,'4.99','2005-07-12 14:30:51','2006-02-15 22:21:01'),(14108,524,2,7014,'8.99','2005-07-27 02:14:40','2006-02-15 22:21:01'),(14109,524,1,7040,'4.99','2005-07-27 03:17:19','2006-02-15 22:21:01'),(14110,524,1,8507,'6.99','2005-07-29 09:29:44','2006-02-15 22:21:01'),(14111,524,2,13626,'2.99','2005-08-20 06:55:24','2006-02-15 22:21:01'),(14112,524,2,14046,'4.99','2005-08-20 21:53:21','2006-02-15 22:21:01'),(14113,524,1,14178,'2.99','2005-08-21 03:13:45','2006-02-15 22:21:01'),(14114,524,1,14366,'2.99','2005-08-21 09:31:39','2006-02-15 22:21:02'),(14115,524,2,14680,'1.99','2005-08-21 20:19:52','2006-02-15 22:21:02'),(14116,524,2,15206,'6.99','2005-08-22 16:33:39','2006-02-15 22:21:02'),(14117,525,1,437,'5.99','2005-05-27 17:47:22','2006-02-15 22:21:02'),(14118,525,2,1772,'2.99','2005-06-16 18:12:54','2006-02-15 22:21:02'),(14119,525,1,3993,'6.99','2005-07-06 23:37:06','2006-02-15 22:21:02'),(14120,525,1,5841,'2.99','2005-07-10 17:11:31','2006-02-15 22:21:02'),(14121,525,2,6098,'7.99','2005-07-11 06:23:28','2006-02-15 22:21:02'),(14122,525,2,6388,'6.99','2005-07-11 22:17:16','2006-02-15 22:21:02'),(14123,525,1,6689,'1.99','2005-07-12 12:22:13','2006-02-15 22:21:02'),(14124,525,2,7337,'4.99','2005-07-27 14:12:04','2006-02-15 22:21:02'),(14125,525,2,7591,'4.99','2005-07-27 23:25:54','2006-02-15 22:21:02'),(14126,525,1,8007,'0.99','2005-07-28 15:22:27','2006-02-15 22:21:02'),(14127,525,1,8960,'4.99','2005-07-30 03:36:31','2006-02-15 22:21:02'),(14128,525,2,9507,'5.99','2005-07-31 00:22:29','2006-02-15 22:21:02'),(14129,525,1,9702,'0.99','2005-07-31 07:34:07','2006-02-15 22:21:02'),(14130,525,1,10496,'2.99','2005-08-01 10:53:16','2006-02-15 22:21:03'),(14131,525,2,11406,'2.99','2005-08-02 19:16:10','2006-02-15 22:21:03'),(14132,525,1,11660,'1.99','2005-08-17 05:22:42','2006-02-15 22:21:03'),(14133,525,1,15159,'0.99','2005-08-22 14:32:25','2006-02-15 22:21:03'),(14134,525,2,15623,'3.99','2005-08-23 07:23:29','2006-02-15 22:21:03'),(14135,525,1,14954,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:03'),(14136,526,1,495,'4.99','2005-05-28 00:40:48','2006-02-15 22:21:03'),(14137,526,2,679,'4.99','2005-05-28 23:24:57','2006-02-15 22:21:03'),(14138,526,2,1015,'2.99','2005-05-31 02:44:57','2006-02-15 22:21:03'),(14139,526,1,1255,'4.99','2005-06-15 06:13:45','2006-02-15 22:21:03'),(14140,526,2,1848,'0.99','2005-06-17 00:07:07','2006-02-15 22:21:03'),(14141,526,2,1865,'7.99','2005-06-17 01:49:36','2006-02-15 22:21:03'),(14142,526,2,1972,'2.99','2005-06-17 09:25:49','2006-02-15 22:21:03'),(14143,526,1,1981,'2.99','2005-06-17 10:03:34','2006-02-15 22:21:03'),(14144,526,2,2398,'4.99','2005-06-18 15:56:53','2006-02-15 22:21:03'),(14145,526,1,2828,'2.99','2005-06-19 20:51:33','2006-02-15 22:21:04'),(14146,526,2,2932,'6.99','2005-06-20 04:51:19','2006-02-15 22:21:04'),(14147,526,1,3339,'6.99','2005-06-21 10:37:11','2006-02-15 22:21:04'),(14148,526,1,3619,'1.99','2005-07-06 05:59:44','2006-02-15 22:21:04'),(14149,526,2,3905,'5.99','2005-07-06 19:33:34','2006-02-15 22:21:04'),(14150,526,1,4423,'6.99','2005-07-07 22:11:28','2006-02-15 22:21:04'),(14151,526,2,5056,'2.99','2005-07-09 04:13:45','2006-02-15 22:21:04'),(14152,526,2,5121,'3.99','2005-07-09 07:18:31','2006-02-15 22:21:04'),(14153,526,1,6316,'7.99','2005-07-11 18:44:52','2006-02-15 22:21:04'),(14154,526,1,6404,'4.99','2005-07-11 22:49:50','2006-02-15 22:21:04'),(14155,526,2,6650,'2.99','2005-07-12 10:57:10','2006-02-15 22:21:04'),(14156,526,1,6671,'3.99','2005-07-12 11:48:48','2006-02-15 22:21:04'),(14157,526,2,7270,'7.99','2005-07-27 11:29:02','2006-02-15 22:21:04'),(14158,526,2,7343,'0.99','2005-07-27 14:27:13','2006-02-15 22:21:04'),(14159,526,2,7399,'1.99','2005-07-27 16:16:02','2006-02-15 22:21:04'),(14160,526,2,7543,'5.99','2005-07-27 21:44:28','2006-02-15 22:21:04'),(14161,526,2,7883,'2.99','2005-07-28 10:37:20','2006-02-15 22:21:05'),(14162,526,1,8053,'4.99','2005-07-28 16:59:41','2006-02-15 22:21:05'),(14163,526,1,8232,'4.99','2005-07-29 00:14:37','2006-02-15 22:21:05'),(14164,526,1,8441,'2.99','2005-07-29 07:33:05','2006-02-15 22:21:05'),(14165,526,2,9577,'6.99','2005-07-31 02:53:33','2006-02-15 22:21:05'),(14166,526,2,10020,'4.99','2005-07-31 18:21:08','2006-02-15 22:21:05'),(14167,526,2,10199,'2.99','2005-08-01 00:38:55','2006-02-15 22:21:05'),(14168,526,2,11046,'4.99','2005-08-02 06:08:34','2006-02-15 22:21:05'),(14169,526,1,11503,'10.99','2005-08-16 23:10:34','2006-02-15 22:21:05'),(14170,526,1,11612,'2.99','2005-08-17 03:48:51','2006-02-15 22:21:05'),(14171,526,2,11702,'4.99','2005-08-17 07:18:56','2006-02-15 22:21:05'),(14172,526,1,12607,'0.99','2005-08-18 17:03:49','2006-02-15 22:21:05'),(14173,526,2,13224,'8.99','2005-08-19 15:52:13','2006-02-15 22:21:05'),(14174,526,2,13580,'0.99','2005-08-20 05:23:34','2006-02-15 22:21:05'),(14175,526,1,13617,'8.99','2005-08-20 06:35:30','2006-02-15 22:21:05'),(14176,526,2,14487,'6.99','2005-08-21 13:53:33','2006-02-15 22:21:06'),(14177,526,1,14590,'7.99','2005-08-21 17:29:10','2006-02-15 22:21:06'),(14178,526,1,15168,'2.99','2005-08-22 15:14:20','2006-02-15 22:21:06'),(14179,526,1,15395,'4.99','2005-08-22 23:06:25','2006-02-15 22:21:06'),(14180,526,1,16043,'9.99','2005-08-23 22:21:03','2006-02-15 22:21:06'),(14181,527,1,1398,'2.99','2005-06-15 16:28:42','2006-02-15 22:21:06'),(14182,527,1,2422,'0.99','2005-06-18 17:28:57','2006-02-15 22:21:06'),(14183,527,2,2496,'0.99','2005-06-18 22:20:11','2006-02-15 22:21:06'),(14184,527,1,2539,'2.99','2005-06-19 01:58:39','2006-02-15 22:21:06'),(14185,527,1,4888,'0.99','2005-07-08 20:04:27','2006-02-15 22:21:06'),(14186,527,1,5365,'0.99','2005-07-09 18:27:00','2006-02-15 22:21:06'),(14187,527,2,6003,'3.99','2005-07-11 01:28:33','2006-02-15 22:21:06'),(14188,527,2,6011,'4.99','2005-07-11 01:54:48','2006-02-15 22:21:06'),(14189,527,1,6050,'2.99','2005-07-11 03:34:29','2006-02-15 22:21:06'),(14190,527,2,6975,'1.99','2005-07-27 00:39:54','2006-02-15 22:21:06'),(14191,527,1,7506,'8.99','2005-07-27 20:28:34','2006-02-15 22:21:06'),(14192,527,1,8854,'0.99','2005-07-29 23:40:07','2006-02-15 22:21:07'),(14193,527,2,9750,'0.99','2005-07-31 09:19:46','2006-02-15 22:21:07'),(14194,527,2,10486,'3.99','2005-08-01 10:23:43','2006-02-15 22:21:07'),(14195,527,2,10613,'0.99','2005-08-01 14:56:14','2006-02-15 22:21:07'),(14196,527,1,11013,'5.99','2005-08-02 05:10:54','2006-02-15 22:21:07'),(14197,527,1,11150,'2.99','2005-08-02 09:51:46','2006-02-15 22:21:07'),(14198,527,1,11624,'0.99','2005-08-17 04:17:42','2006-02-15 22:21:07'),(14199,527,1,12136,'7.99','2005-08-17 23:51:30','2006-02-15 22:21:07'),(14200,527,1,12513,'6.99','2005-08-18 13:31:45','2006-02-15 22:21:07'),(14201,527,1,14352,'6.99','2005-08-21 09:06:29','2006-02-15 22:21:07'),(14202,527,1,15144,'2.99','2005-08-22 13:49:18','2006-02-15 22:21:07'),(14203,527,1,15552,'3.99','2005-08-23 04:33:23','2006-02-15 22:21:07'),(14204,527,1,14267,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:07'),(14205,528,1,204,'0.99','2005-05-26 07:30:37','2006-02-15 22:21:07'),(14206,528,2,472,'0.99','2005-05-27 21:36:15','2006-02-15 22:21:07'),(14207,528,1,533,'5.99','2005-05-28 06:14:46','2006-02-15 22:21:08'),(14208,528,2,695,'3.99','2005-05-29 01:50:53','2006-02-15 22:21:08'),(14209,528,2,793,'5.99','2005-05-29 16:44:08','2006-02-15 22:21:08'),(14210,528,2,1875,'2.99','2005-06-17 02:45:10','2006-02-15 22:21:08'),(14211,528,1,2019,'4.99','2005-06-17 12:38:44','2006-02-15 22:21:08'),(14212,528,2,3654,'4.99','2005-07-06 07:45:31','2006-02-15 22:21:08'),(14213,528,1,3664,'0.99','2005-07-06 08:15:57','2006-02-15 22:21:08'),(14214,528,2,4050,'9.99','2005-07-07 03:35:33','2006-02-15 22:21:08'),(14215,528,1,4593,'5.99','2005-07-08 06:38:12','2006-02-15 22:21:08'),(14216,528,2,5215,'3.99','2005-07-09 11:47:58','2006-02-15 22:21:08'),(14217,528,2,6561,'0.99','2005-07-12 05:24:02','2006-02-15 22:21:08'),(14218,528,1,7569,'7.99','2005-07-27 22:38:53','2006-02-15 22:21:08'),(14219,528,2,8112,'4.99','2005-07-28 19:11:07','2006-02-15 22:21:08'),(14220,528,1,8727,'3.99','2005-07-29 18:09:57','2006-02-15 22:21:08'),(14221,528,2,9488,'8.99','2005-07-30 23:42:42','2006-02-15 22:21:08'),(14222,528,1,10084,'3.99','2005-07-31 20:11:29','2006-02-15 22:21:08'),(14223,528,1,10673,'0.99','2005-08-01 17:11:51','2006-02-15 22:21:09'),(14224,528,1,10880,'2.99','2005-08-02 00:34:12','2006-02-15 22:21:09'),(14225,528,1,12818,'3.99','2005-08-19 01:04:59','2006-02-15 22:21:09'),(14226,528,2,13518,'2.99','2005-08-20 02:36:17','2006-02-15 22:21:09'),(14227,528,1,13600,'7.99','2005-08-20 06:00:25','2006-02-15 22:21:09'),(14228,528,2,14148,'2.99','2005-08-21 02:17:49','2006-02-15 22:21:09'),(14229,528,2,15880,'6.99','2005-08-23 16:43:54','2006-02-15 22:21:09'),(14230,529,1,453,'2.99','2005-05-27 19:31:16','2006-02-15 22:21:09'),(14231,529,1,1234,'1.99','2005-06-15 04:21:52','2006-02-15 22:21:09'),(14232,529,2,1686,'0.99','2005-06-16 12:08:20','2006-02-15 22:21:09'),(14233,529,2,3354,'0.99','2005-06-21 11:29:49','2006-02-15 22:21:09'),(14234,529,2,4045,'0.99','2005-07-07 03:26:14','2006-02-15 22:21:09'),(14235,529,2,4254,'0.99','2005-07-07 14:13:52','2006-02-15 22:21:09'),(14236,529,2,4444,'5.99','2005-07-07 23:07:44','2006-02-15 22:21:09'),(14237,529,1,4553,'0.99','2005-07-08 04:43:41','2006-02-15 22:21:09'),(14238,529,1,5993,'4.99','2005-07-11 01:06:41','2006-02-15 22:21:10'),(14239,529,2,6538,'6.99','2005-07-12 04:50:26','2006-02-15 22:21:10'),(14240,529,2,6541,'5.99','2005-07-12 04:53:41','2006-02-15 22:21:10'),(14241,529,1,6908,'7.99','2005-07-12 22:08:46','2006-02-15 22:21:10'),(14242,529,1,7128,'3.99','2005-07-27 06:14:36','2006-02-15 22:21:10'),(14243,529,2,8708,'2.99','2005-07-29 17:24:13','2006-02-15 22:21:10'),(14244,529,1,8979,'5.99','2005-07-30 04:20:25','2006-02-15 22:21:10'),(14245,529,2,9310,'4.99','2005-07-30 16:57:09','2006-02-15 22:21:10'),(14246,529,2,9375,'0.99','2005-07-30 19:10:17','2006-02-15 22:21:10'),(14247,529,2,10361,'10.99','2005-08-01 05:53:49','2006-02-15 22:21:10'),(14248,529,1,11862,'2.99','2005-08-17 13:54:53','2006-02-15 22:21:10'),(14249,529,2,12356,'2.99','2005-08-18 07:37:05','2006-02-15 22:21:10'),(14250,529,1,12622,'3.99','2005-08-18 17:34:11','2006-02-15 22:21:10'),(14251,529,1,13011,'4.99','2005-08-19 07:53:58','2006-02-15 22:21:10'),(14252,529,2,13132,'3.99','2005-08-19 12:10:57','2006-02-15 22:21:10'),(14253,529,1,13797,'2.99','2005-08-20 12:33:36','2006-02-15 22:21:11'),(14254,529,2,13946,'9.99','2005-08-20 17:44:32','2006-02-15 22:21:11'),(14255,529,2,14449,'4.99','2005-08-21 12:13:18','2006-02-15 22:21:11'),(14256,529,2,14764,'0.99','2005-08-21 23:37:47','2006-02-15 22:21:11'),(14257,529,1,14970,'5.99','2005-08-22 06:49:29','2006-02-15 22:21:11'),(14258,529,2,15305,'2.99','2005-08-22 19:46:05','2006-02-15 22:21:11'),(14259,530,1,851,'0.99','2005-05-30 01:35:15','2006-02-15 22:21:11'),(14260,530,2,1273,'1.99','2005-06-15 07:52:35','2006-02-15 22:21:11'),(14261,530,1,1516,'0.99','2005-06-15 23:11:10','2006-02-15 22:21:11'),(14262,530,1,2158,'2.99','2005-06-17 23:36:27','2006-02-15 22:21:11'),(14263,530,2,3669,'2.99','2005-07-06 08:38:29','2006-02-15 22:21:11'),(14264,530,2,3887,'4.99','2005-07-06 18:46:34','2006-02-15 22:21:11'),(14265,530,2,5663,'0.99','2005-07-10 08:01:33','2006-02-15 22:21:11'),(14266,530,1,7031,'3.99','2005-07-27 03:02:07','2006-02-15 22:21:11'),(14267,530,2,7075,'1.99','2005-07-27 04:11:40','2006-02-15 22:21:11'),(14268,530,1,7218,'4.99','2005-07-27 09:34:24','2006-02-15 22:21:11'),(14269,530,2,8208,'4.99','2005-07-28 23:26:35','2006-02-15 22:21:12'),(14270,530,1,8736,'0.99','2005-07-29 18:31:15','2006-02-15 22:21:12'),(14271,530,1,9914,'4.99','2005-07-31 14:51:19','2006-02-15 22:21:12'),(14272,530,2,10211,'3.99','2005-08-01 01:01:16','2006-02-15 22:21:12'),(14273,530,2,10504,'4.99','2005-08-01 11:10:55','2006-02-15 22:21:12'),(14274,530,1,11326,'0.99','2005-08-02 16:34:29','2006-02-15 22:21:12'),(14275,530,1,12220,'4.99','2005-08-18 02:50:02','2006-02-15 22:21:12'),(14276,530,1,12387,'2.99','2005-08-18 08:46:24','2006-02-15 22:21:12'),(14277,530,1,12649,'4.99','2005-08-18 18:31:47','2006-02-15 22:21:12'),(14278,530,1,13998,'5.99','2005-08-20 19:52:38','2006-02-15 22:21:12'),(14279,530,2,14707,'5.99','2005-08-21 21:06:29','2006-02-15 22:21:12'),(14280,530,2,15066,'0.99','2005-08-22 10:49:06','2006-02-15 22:21:12'),(14281,530,1,13561,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:12'),(14282,531,1,233,'4.99','2005-05-26 11:43:44','2006-02-15 22:21:12'),(14283,531,1,681,'2.99','2005-05-28 23:39:44','2006-02-15 22:21:12'),(14284,531,2,2972,'2.99','2005-06-20 07:57:54','2006-02-15 22:21:13'),(14285,531,2,3921,'5.99','2005-07-06 20:29:48','2006-02-15 22:21:13'),(14286,531,1,5587,'5.99','2005-07-10 04:17:25','2006-02-15 22:21:13'),(14287,531,2,5850,'0.99','2005-07-10 17:36:27','2006-02-15 22:21:13'),(14288,531,2,5904,'4.99','2005-07-10 20:39:44','2006-02-15 22:21:13'),(14289,531,1,6756,'4.99','2005-07-12 15:08:28','2006-02-15 22:21:13'),(14290,531,1,6876,'4.99','2005-07-12 20:32:50','2006-02-15 22:21:13'),(14291,531,2,7204,'2.99','2005-07-27 09:02:31','2006-02-15 22:21:13'),(14292,531,1,7391,'6.99','2005-07-27 16:00:00','2006-02-15 22:21:13'),(14293,531,2,7444,'2.99','2005-07-27 17:49:16','2006-02-15 22:21:13'),(14294,531,2,7753,'6.99','2005-07-28 06:09:19','2006-02-15 22:21:13'),(14295,531,2,8359,'5.99','2005-07-29 05:02:12','2006-02-15 22:21:13'),(14296,531,2,8860,'4.99','2005-07-29 23:45:57','2006-02-15 22:21:13'),(14297,531,2,8943,'0.99','2005-07-30 03:06:48','2006-02-15 22:21:13'),(14298,531,2,9107,'4.99','2005-07-30 08:52:45','2006-02-15 22:21:13'),(14299,531,2,10920,'4.99','2005-08-02 02:14:10','2006-02-15 22:21:14'),(14300,531,1,10941,'5.99','2005-08-02 03:11:33','2006-02-15 22:21:14'),(14301,531,2,11026,'4.99','2005-08-02 05:46:05','2006-02-15 22:21:14'),(14302,531,1,11265,'10.99','2005-08-02 14:05:42','2006-02-15 22:21:14'),(14303,531,1,11666,'2.99','2005-08-17 05:45:10','2006-02-15 22:21:14'),(14304,531,1,12923,'2.99','2005-08-19 04:50:20','2006-02-15 22:21:14'),(14305,531,2,13300,'8.99','2005-08-19 18:46:56','2006-02-15 22:21:14'),(14306,531,2,15360,'0.99','2005-08-22 21:36:51','2006-02-15 22:21:14'),(14307,532,1,43,'2.99','2005-05-25 05:39:25','2006-02-15 22:21:14'),(14308,532,1,1694,'4.99','2005-06-16 12:40:23','2006-02-15 22:21:14'),(14309,532,2,2821,'3.99','2005-06-19 20:26:52','2006-02-15 22:21:14'),(14310,532,1,4336,'2.99','2005-07-07 18:34:36','2006-02-15 22:21:14'),(14311,532,2,4962,'4.99','2005-07-08 23:36:13','2006-02-15 22:21:14'),(14312,532,2,5190,'2.99','2005-07-09 10:25:24','2006-02-15 22:21:14'),(14313,532,1,5253,'7.99','2005-07-09 13:41:17','2006-02-15 22:21:14'),(14314,532,2,5278,'4.99','2005-07-09 14:44:23','2006-02-15 22:21:14'),(14315,532,2,5805,'8.99','2005-07-10 15:08:41','2006-02-15 22:21:15'),(14316,532,1,5887,'2.99','2005-07-10 19:45:47','2006-02-15 22:21:15'),(14317,532,2,6345,'7.99','2005-07-11 20:05:18','2006-02-15 22:21:15'),(14318,532,2,6598,'4.99','2005-07-12 07:38:25','2006-02-15 22:21:15'),(14319,532,1,6730,'3.99','2005-07-12 13:58:25','2006-02-15 22:21:15'),(14320,532,1,7192,'4.99','2005-07-27 08:36:55','2006-02-15 22:21:15'),(14321,532,2,7572,'2.99','2005-07-27 22:44:29','2006-02-15 22:21:15'),(14322,532,1,8273,'5.99','2005-07-29 01:33:16','2006-02-15 22:21:15'),(14323,532,1,9843,'2.99','2005-07-31 12:25:28','2006-02-15 22:21:15'),(14324,532,2,10286,'6.99','2005-08-01 03:35:58','2006-02-15 22:21:15'),(14325,532,2,10712,'5.99','2005-08-01 18:47:56','2006-02-15 22:21:15'),(14326,532,1,10945,'5.99','2005-08-02 03:20:23','2006-02-15 22:21:15'),(14327,532,2,11251,'2.99','2005-08-02 13:40:49','2006-02-15 22:21:15'),(14328,532,2,11318,'4.99','2005-08-02 16:09:11','2006-02-15 22:21:15'),(14329,532,2,12061,'3.99','2005-08-17 21:13:35','2006-02-15 22:21:15'),(14330,532,2,12295,'5.99','2005-08-18 05:15:46','2006-02-15 22:21:16'),(14331,532,2,13038,'4.99','2005-08-19 08:55:16','2006-02-15 22:21:16'),(14332,532,1,13192,'8.99','2005-08-19 14:30:06','2006-02-15 22:21:16'),(14333,532,1,13254,'4.99','2005-08-19 16:54:01','2006-02-15 22:21:16'),(14334,532,1,13908,'4.99','2005-08-20 16:21:40','2006-02-15 22:21:16'),(14335,532,2,15180,'0.99','2005-08-22 15:42:57','2006-02-15 22:21:16'),(14336,532,2,15414,'1.99','2005-08-22 23:43:54','2006-02-15 22:21:16'),(14337,532,1,16014,'5.99','2005-08-23 21:18:31','2006-02-15 22:21:16'),(14338,532,1,14616,'0.99','2006-02-14 15:16:03','2006-02-15 22:21:16'),(14339,533,1,173,'0.99','2005-05-26 03:42:10','2006-02-15 22:21:16'),(14340,533,2,190,'1.99','2005-05-26 06:11:28','2006-02-15 22:21:16'),(14341,533,1,615,'5.99','2005-05-28 15:35:52','2006-02-15 22:21:16'),(14342,533,1,1421,'5.99','2005-06-15 17:57:04','2006-02-15 22:21:16'),(14343,533,1,1652,'0.99','2005-06-16 09:31:37','2006-02-15 22:21:16'),(14344,533,1,1859,'0.99','2005-06-17 01:13:38','2006-02-15 22:21:16'),(14345,533,1,1954,'2.99','2005-06-17 08:37:55','2006-02-15 22:21:17'),(14346,533,2,2770,'6.99','2005-06-19 17:54:22','2006-02-15 22:21:17'),(14347,533,1,2956,'0.99','2005-06-20 06:47:23','2006-02-15 22:21:17'),(14348,533,1,4112,'8.99','2005-07-07 06:49:09','2006-02-15 22:21:17'),(14349,533,1,4788,'4.99','2005-07-08 16:17:35','2006-02-15 22:21:17'),(14350,533,2,6781,'2.99','2005-07-12 16:21:47','2006-02-15 22:21:17'),(14351,533,2,6834,'0.99','2005-07-12 18:53:37','2006-02-15 22:21:17'),(14352,533,2,6837,'9.99','2005-07-12 18:59:45','2006-02-15 22:21:17'),(14353,533,2,7555,'4.99','2005-07-27 22:17:05','2006-02-15 22:21:17'),(14354,533,1,8093,'8.99','2005-07-28 18:29:16','2006-02-15 22:21:17'),(14355,533,2,8104,'2.99','2005-07-28 18:59:36','2006-02-15 22:21:17'),(14356,533,2,8250,'2.99','2005-07-29 00:49:15','2006-02-15 22:21:17'),(14357,533,1,8471,'2.99','2005-07-29 08:32:11','2006-02-15 22:21:17'),(14358,533,1,8676,'1.99','2005-07-29 15:59:06','2006-02-15 22:21:17'),(14359,533,2,8786,'1.99','2005-07-29 20:39:49','2006-02-15 22:21:17'),(14360,533,2,10090,'3.99','2005-07-31 20:22:01','2006-02-15 22:21:17'),(14361,533,1,10380,'2.99','2005-08-01 06:34:36','2006-02-15 22:21:18'),(14362,533,1,10614,'6.99','2005-08-01 14:57:00','2006-02-15 22:21:18'),(14363,533,2,11524,'7.99','2005-08-17 00:10:55','2006-02-15 22:21:18'),(14364,533,1,11758,'8.99','2005-08-17 09:33:02','2006-02-15 22:21:18'),(14365,533,1,11918,'2.99','2005-08-17 16:08:42','2006-02-15 22:21:18'),(14366,533,1,12602,'0.99','2005-08-18 16:49:50','2006-02-15 22:21:18'),(14367,533,1,12655,'6.99','2005-08-18 18:57:44','2006-02-15 22:21:18'),(14368,533,1,14263,'7.99','2005-08-21 06:08:15','2006-02-15 22:21:18'),(14369,533,1,14800,'4.99','2005-08-22 00:46:18','2006-02-15 22:21:18'),(14370,533,2,16006,'0.99','2005-08-23 21:01:09','2006-02-15 22:21:18'),(14371,533,2,14018,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:18'),(14372,534,2,304,'5.99','2005-05-26 21:21:28','2006-02-15 22:21:18'),(14373,534,2,940,'0.99','2005-05-30 15:01:02','2006-02-15 22:21:18'),(14374,534,1,1610,'4.99','2005-06-16 06:36:33','2006-02-15 22:21:18'),(14375,534,1,1673,'2.99','2005-06-16 10:40:17','2006-02-15 22:21:18'),(14376,534,1,2436,'0.99','2005-06-18 18:13:32','2006-02-15 22:21:19'),(14377,534,2,3213,'1.99','2005-06-21 01:05:19','2006-02-15 22:21:19'),(14378,534,1,3216,'4.99','2005-06-21 01:19:37','2006-02-15 22:21:19'),(14379,534,1,3735,'2.99','2005-07-06 11:42:04','2006-02-15 22:21:19'),(14380,534,2,4998,'4.99','2005-07-09 01:07:21','2006-02-15 22:21:19'),(14381,534,2,7113,'2.99','2005-07-27 05:41:20','2006-02-15 22:21:19'),(14382,534,1,7662,'2.99','2005-07-28 02:16:08','2006-02-15 22:21:19'),(14383,534,2,8633,'0.99','2005-07-29 14:19:53','2006-02-15 22:21:19'),(14384,534,1,9456,'5.99','2005-07-30 22:22:16','2006-02-15 22:21:19'),(14385,534,2,9464,'4.99','2005-07-30 22:31:31','2006-02-15 22:21:19'),(14386,534,2,10465,'5.99','2005-08-01 09:45:25','2006-02-15 22:21:19'),(14387,534,2,10725,'6.99','2005-08-01 19:11:04','2006-02-15 22:21:19'),(14388,534,1,10796,'0.99','2005-08-01 21:56:41','2006-02-15 22:21:19'),(14389,534,2,11180,'5.99','2005-08-02 10:54:30','2006-02-15 22:21:19'),(14390,534,2,12305,'2.99','2005-08-18 05:46:29','2006-02-15 22:21:19'),(14391,534,1,12691,'5.99','2005-08-18 20:07:46','2006-02-15 22:21:20'),(14392,534,2,12798,'4.99','2005-08-19 00:24:33','2006-02-15 22:21:20'),(14393,534,2,13294,'0.99','2005-08-19 18:36:35','2006-02-15 22:21:20'),(14394,534,2,14816,'1.99','2005-08-22 01:15:51','2006-02-15 22:21:20'),(14395,534,1,14526,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:20'),(14396,535,1,37,'0.99','2005-05-25 04:44:31','2006-02-15 22:21:20'),(14397,535,2,541,'2.99','2005-05-28 06:41:58','2006-02-15 22:21:20'),(14398,535,1,778,'3.99','2005-05-29 14:09:53','2006-02-15 22:21:20'),(14399,535,2,959,'4.99','2005-05-30 18:07:00','2006-02-15 22:21:20'),(14400,535,1,1712,'4.99','2005-06-16 14:25:09','2006-02-15 22:21:20'),(14401,535,1,3228,'4.99','2005-06-21 02:20:24','2006-02-15 22:21:20'),(14402,535,1,4331,'4.99','2005-07-07 18:22:30','2006-02-15 22:21:20'),(14403,535,1,4718,'6.99','2005-07-08 12:32:08','2006-02-15 22:21:20'),(14404,535,1,4743,'2.99','2005-07-08 13:42:36','2006-02-15 22:21:20'),(14405,535,2,4914,'6.99','2005-07-08 21:30:53','2006-02-15 22:21:20'),(14406,535,1,5588,'0.99','2005-07-10 04:21:10','2006-02-15 22:21:21'),(14407,535,2,5890,'8.99','2005-07-10 20:00:25','2006-02-15 22:21:21'),(14408,535,1,6504,'2.99','2005-07-12 03:19:14','2006-02-15 22:21:21'),(14409,535,1,8395,'2.99','2005-07-29 06:03:30','2006-02-15 22:21:21'),(14410,535,1,8645,'4.99','2005-07-29 14:47:45','2006-02-15 22:21:21'),(14411,535,2,9440,'0.99','2005-07-30 21:40:15','2006-02-15 22:21:21'),(14412,535,1,9524,'4.99','2005-07-31 01:01:06','2006-02-15 22:21:21'),(14413,535,2,10322,'5.99','2005-08-01 04:44:13','2006-02-15 22:21:21'),(14414,535,2,10353,'3.99','2005-08-01 05:46:33','2006-02-15 22:21:21'),(14415,535,2,11736,'8.99','2005-08-17 08:40:55','2006-02-15 22:21:21'),(14416,535,1,11855,'7.99','2005-08-17 13:43:07','2006-02-15 22:21:21'),(14417,535,2,12168,'2.99','2005-08-18 01:03:52','2006-02-15 22:21:21'),(14418,535,1,12233,'0.99','2005-08-18 03:16:54','2006-02-15 22:21:21'),(14419,535,2,12673,'4.99','2005-08-18 19:21:56','2006-02-15 22:21:21'),(14420,535,1,12732,'0.99','2005-08-18 21:57:50','2006-02-15 22:21:21'),(14421,535,2,12750,'1.99','2005-08-18 22:32:39','2006-02-15 22:21:21'),(14422,535,1,13631,'4.99','2005-08-20 07:07:37','2006-02-15 22:21:22'),(14423,535,1,13852,'0.99','2005-08-20 14:45:23','2006-02-15 22:21:22'),(14424,535,1,14522,'4.99','2005-08-21 15:01:34','2006-02-15 22:21:22'),(14425,535,2,15075,'5.99','2005-08-22 11:04:52','2006-02-15 22:21:22'),(14426,535,1,15287,'6.99','2005-08-22 19:19:37','2006-02-15 22:21:22'),(14427,535,1,16017,'0.99','2005-08-23 21:27:11','2006-02-15 22:21:22'),(14428,536,1,237,'0.99','2005-05-26 12:15:13','2006-02-15 22:21:22'),(14429,536,1,929,'6.99','2005-05-30 12:32:39','2006-02-15 22:21:22'),(14430,536,1,1582,'4.99','2005-06-16 04:31:57','2006-02-15 22:21:22'),(14431,536,2,1962,'2.99','2005-06-17 09:08:58','2006-02-15 22:21:22'),(14432,536,2,2403,'2.99','2005-06-18 16:33:22','2006-02-15 22:21:22'),(14433,536,1,3483,'4.99','2005-07-05 23:13:51','2006-02-15 22:21:22'),(14434,536,1,3514,'0.99','2005-07-06 00:46:54','2006-02-15 22:21:22'),(14435,536,1,4448,'2.99','2005-07-07 23:17:12','2006-02-15 22:21:22'),(14436,536,2,5196,'0.99','2005-07-09 10:43:34','2006-02-15 22:21:22'),(14437,536,1,6400,'5.99','2005-07-11 22:43:44','2006-02-15 22:21:23'),(14438,536,1,7065,'4.99','2005-07-27 03:53:43','2006-02-15 22:21:23'),(14439,536,2,8535,'4.99','2005-07-29 10:32:33','2006-02-15 22:21:23'),(14440,536,1,8679,'4.99','2005-07-29 16:07:47','2006-02-15 22:21:23'),(14441,536,1,8958,'2.99','2005-07-30 03:34:26','2006-02-15 22:21:23'),(14442,536,1,9411,'8.99','2005-07-30 20:38:22','2006-02-15 22:21:23'),(14443,536,1,9727,'4.99','2005-07-31 08:39:13','2006-02-15 22:21:23'),(14444,536,2,10019,'3.99','2005-07-31 18:20:56','2006-02-15 22:21:23'),(14445,536,1,11473,'6.99','2005-08-02 21:52:03','2006-02-15 22:21:23'),(14446,536,1,11826,'2.99','2005-08-17 12:43:46','2006-02-15 22:21:23'),(14447,536,2,11977,'4.99','2005-08-17 18:01:15','2006-02-15 22:21:23'),(14448,536,2,12052,'8.99','2005-08-17 20:57:02','2006-02-15 22:21:23'),(14449,536,2,13505,'4.99','2005-08-20 02:05:57','2006-02-15 22:21:23'),(14450,536,1,15130,'7.99','2005-08-22 13:04:32','2006-02-15 22:21:23'),(14451,536,1,15978,'8.99','2005-08-23 20:08:18','2006-02-15 22:21:23'),(14452,536,1,15979,'0.99','2005-08-23 20:08:26','2006-02-15 22:21:24'),(14453,537,2,603,'4.99','2005-05-28 14:27:51','2006-02-15 22:21:24'),(14454,537,1,1445,'2.99','2005-06-15 19:10:07','2006-02-15 22:21:24'),(14455,537,2,2184,'2.99','2005-06-18 01:10:36','2006-02-15 22:21:24'),(14456,537,1,2586,'8.99','2005-06-19 05:05:11','2006-02-15 22:21:24'),(14457,537,2,3134,'8.99','2005-06-20 19:29:09','2006-02-15 22:21:24'),(14458,537,1,3555,'0.99','2005-07-06 02:45:35','2006-02-15 22:21:24'),(14459,537,2,3853,'0.99','2005-07-06 16:59:20','2006-02-15 22:21:24'),(14460,537,1,5630,'2.99','2005-07-10 06:08:14','2006-02-15 22:21:24'),(14461,537,2,5877,'5.99','2005-07-10 19:08:51','2006-02-15 22:21:24'),(14462,537,2,6310,'2.99','2005-07-11 18:14:05','2006-02-15 22:21:24'),(14463,537,1,6409,'4.99','2005-07-11 23:05:49','2006-02-15 22:21:24'),(14464,537,1,6746,'0.99','2005-07-12 14:33:01','2006-02-15 22:21:24'),(14465,537,1,7179,'2.99','2005-07-27 08:10:29','2006-02-15 22:21:24'),(14466,537,2,7810,'4.99','2005-07-28 08:00:38','2006-02-15 22:21:24'),(14467,537,2,8126,'4.99','2005-07-28 19:32:41','2006-02-15 22:21:25'),(14468,537,2,8256,'4.99','2005-07-29 01:02:42','2006-02-15 22:21:25'),(14469,537,1,9967,'2.99','2005-07-31 16:31:17','2006-02-15 22:21:25'),(14470,537,2,12984,'4.99','2005-08-19 07:06:51','2006-02-15 22:21:25'),(14471,537,2,13885,'4.99','2005-08-20 15:32:09','2006-02-15 22:21:25'),(14472,537,1,14010,'4.99','2005-08-20 20:29:46','2006-02-15 22:21:25'),(14473,537,2,14506,'0.99','2005-08-21 14:32:27','2006-02-15 22:21:25'),(14474,537,1,14670,'0.99','2005-08-21 19:54:11','2006-02-15 22:21:25'),(14475,537,1,15149,'2.99','2005-08-22 14:08:06','2006-02-15 22:21:25'),(14476,537,1,15832,'8.99','2005-08-23 15:21:35','2006-02-15 22:21:25'),(14477,537,1,13419,'4.99','2006-02-14 15:16:03','2006-02-15 22:21:25'),(14478,538,2,594,'2.99','2005-05-28 13:41:56','2006-02-15 22:21:25'),(14479,538,2,734,'4.99','2005-05-29 07:38:52','2006-02-15 22:21:25'),(14480,538,1,1314,'5.99','2005-06-15 10:21:45','2006-02-15 22:21:25'),(14481,538,1,1912,'4.99','2005-06-17 05:18:32','2006-02-15 22:21:25'),(14482,538,1,2682,'4.99','2005-06-19 12:18:17','2006-02-15 22:21:26'),(14483,538,2,3189,'2.99','2005-06-20 23:19:33','2006-02-15 22:21:26'),(14484,538,2,3554,'4.99','2005-07-06 02:37:10','2006-02-15 22:21:26'),(14485,538,2,5135,'8.99','2005-07-09 07:53:22','2006-02-15 22:21:26'),(14486,538,1,5369,'4.99','2005-07-09 18:42:16','2006-02-15 22:21:26'),(14487,538,1,5486,'2.99','2005-07-09 23:57:44','2006-02-15 22:21:26'),(14488,538,1,5898,'2.99','2005-07-10 20:18:09','2006-02-15 22:21:26'),(14489,538,2,6130,'2.99','2005-07-11 08:19:56','2006-02-15 22:21:26'),(14490,538,1,6332,'0.99','2005-07-11 19:19:06','2006-02-15 22:21:26'),(14491,538,2,6936,'0.99','2005-07-26 23:13:34','2006-02-15 22:21:26'),(14492,538,1,7694,'0.99','2005-07-28 03:39:25','2006-02-15 22:21:26'),(14493,538,1,8765,'0.99','2005-07-29 19:40:08','2006-02-15 22:21:26'),(14494,538,1,9307,'0.99','2005-07-30 16:52:43','2006-02-15 22:21:26'),(14495,538,1,9643,'4.99','2005-07-31 05:35:48','2006-02-15 22:21:26'),(14496,538,2,9897,'4.99','2005-07-31 14:11:57','2006-02-15 22:21:26'),(14497,538,2,9939,'8.99','2005-07-31 15:29:00','2006-02-15 22:21:27'),(14498,538,2,10701,'3.99','2005-08-01 18:28:17','2006-02-15 22:21:27'),(14499,538,1,10732,'5.99','2005-08-01 19:25:18','2006-02-15 22:21:27'),(14500,538,1,10962,'4.99','2005-08-02 03:48:13','2006-02-15 22:21:27'),(14501,538,2,12089,'5.99','2005-08-17 22:20:29','2006-02-15 22:21:27'),(14502,538,1,13544,'1.99','2005-08-20 03:44:26','2006-02-15 22:21:27'),(14503,538,2,13770,'4.99','2005-08-20 11:45:54','2006-02-15 22:21:27'),(14504,538,2,14572,'2.99','2005-08-21 16:44:31','2006-02-15 22:21:27'),(14505,538,1,14591,'0.99','2005-08-21 17:30:09','2006-02-15 22:21:27'),(14506,538,1,15343,'6.99','2005-08-22 21:01:25','2006-02-15 22:21:27'),(14507,539,2,250,'4.99','2005-05-26 14:30:24','2006-02-15 22:21:27'),(14508,539,1,342,'0.99','2005-05-27 04:11:04','2006-02-15 22:21:27'),(14509,539,2,1282,'3.99','2005-06-15 08:25:33','2006-02-15 22:21:27'),(14510,539,1,1327,'0.99','2005-06-15 11:11:39','2006-02-15 22:21:27'),(14511,539,2,1444,'4.99','2005-06-15 19:08:16','2006-02-15 22:21:27'),(14512,539,1,4035,'2.99','2005-07-07 02:45:02','2006-02-15 22:21:27'),(14513,539,1,4247,'0.99','2005-07-07 13:51:54','2006-02-15 22:21:28'),(14514,539,2,5086,'4.99','2005-07-09 05:40:04','2006-02-15 22:21:28'),(14515,539,2,5139,'7.99','2005-07-09 08:01:51','2006-02-15 22:21:28'),(14516,539,2,5493,'2.99','2005-07-10 00:11:44','2006-02-15 22:21:28'),(14517,539,2,6874,'5.99','2005-07-12 20:20:53','2006-02-15 22:21:28'),(14518,539,1,7781,'2.99','2005-07-28 07:13:20','2006-02-15 22:21:28'),(14519,539,2,8247,'6.99','2005-07-29 00:41:38','2006-02-15 22:21:28'),(14520,539,2,8761,'5.99','2005-07-29 19:26:47','2006-02-15 22:21:28'),(14521,539,2,9250,'0.99','2005-07-30 14:18:16','2006-02-15 22:21:28'),(14522,539,1,9777,'7.99','2005-07-31 10:01:06','2006-02-15 22:21:28'),(14523,539,1,9796,'4.99','2005-07-31 10:52:43','2006-02-15 22:21:28'),(14524,539,2,10922,'3.99','2005-08-02 02:14:40','2006-02-15 22:21:28'),(14525,539,1,12848,'2.99','2005-08-19 02:05:11','2006-02-15 22:21:28'),(14526,539,2,13615,'2.99','2005-08-20 06:28:53','2006-02-15 22:21:28'),(14527,539,2,13778,'5.99','2005-08-20 12:03:44','2006-02-15 22:21:28'),(14528,539,1,15356,'2.99','2005-08-22 21:24:19','2006-02-15 22:21:29'),(14529,540,2,1263,'2.99','2005-06-15 06:56:39','2006-02-15 22:21:29'),(14530,540,2,1290,'4.99','2005-06-15 08:52:44','2006-02-15 22:21:29'),(14531,540,2,2640,'2.99','2005-06-19 09:26:13','2006-02-15 22:21:29'),(14532,540,1,2953,'3.99','2005-06-20 06:39:11','2006-02-15 22:21:29'),(14533,540,1,3340,'3.99','2005-06-21 10:37:23','2006-02-15 22:21:29'),(14534,540,2,4628,'4.99','2005-07-08 08:25:52','2006-02-15 22:21:29'),(14535,540,2,4991,'4.99','2005-07-09 00:49:03','2006-02-15 22:21:29'),(14536,540,1,6103,'2.99','2005-07-11 06:59:55','2006-02-15 22:21:29'),(14537,540,2,6145,'7.99','2005-07-11 09:07:01','2006-02-15 22:21:29'),(14538,540,2,6182,'2.99','2005-07-11 11:11:38','2006-02-15 22:21:29'),(14539,540,1,6748,'6.99','2005-07-12 14:39:27','2006-02-15 22:21:29'),(14540,540,1,6919,'0.99','2005-07-12 22:32:17','2006-02-15 22:21:29'),(14541,540,2,9762,'4.99','2005-07-31 09:32:54','2006-02-15 22:21:29'),(14542,540,2,9815,'2.99','2005-07-31 11:30:51','2006-02-15 22:21:29'),(14543,540,1,10924,'8.99','2005-08-02 02:20:19','2006-02-15 22:21:30'),(14544,540,1,11198,'3.99','2005-08-02 11:45:15','2006-02-15 22:21:30'),(14545,540,2,11324,'4.99','2005-08-02 16:31:17','2006-02-15 22:21:30'),(14546,540,2,11432,'6.99','2005-08-02 20:10:01','2006-02-15 22:21:30'),(14547,540,2,12058,'8.99','2005-08-17 21:07:41','2006-02-15 22:21:30'),(14548,540,2,12201,'4.99','2005-08-18 02:14:06','2006-02-15 22:21:30'),(14549,540,1,12300,'6.99','2005-08-18 05:36:14','2006-02-15 22:21:30'),(14550,540,2,14910,'0.99','2005-08-22 04:50:52','2006-02-15 22:21:30'),(14551,540,2,15079,'2.99','2005-08-22 11:09:56','2006-02-15 22:21:30'),(14552,540,2,15953,'3.99','2005-08-23 19:13:46','2006-02-15 22:21:30'),(14553,541,1,1021,'7.99','2005-05-31 03:16:15','2006-02-15 22:21:30'),(14554,541,1,1066,'4.99','2005-05-31 09:07:33','2006-02-15 22:21:30'),(14555,541,2,1986,'2.99','2005-06-17 10:34:59','2006-02-15 22:21:30'),(14556,541,1,2708,'6.99','2005-06-19 13:59:05','2006-02-15 22:21:30'),(14557,541,1,5018,'2.99','2005-07-09 02:01:05','2006-02-15 22:21:30'),(14558,541,2,5197,'4.99','2005-07-09 10:43:54','2006-02-15 22:21:31'),(14559,541,2,6468,'7.99','2005-07-12 01:27:09','2006-02-15 22:21:31'),(14560,541,2,6718,'2.99','2005-07-12 13:38:06','2006-02-15 22:21:31'),(14561,541,1,8113,'8.99','2005-07-28 19:14:00','2006-02-15 22:21:31'),(14562,541,1,8322,'4.99','2005-07-29 03:52:49','2006-02-15 22:21:31'),(14563,541,2,9603,'0.99','2005-07-31 03:43:43','2006-02-15 22:21:31'),(14564,541,1,10306,'5.99','2005-08-01 04:19:18','2006-02-15 22:21:31'),(14565,541,2,11273,'0.99','2005-08-02 14:20:55','2006-02-15 22:21:31'),(14566,541,1,12306,'4.99','2005-08-18 05:47:55','2006-02-15 22:21:31'),(14567,541,2,12395,'4.99','2005-08-18 09:06:30','2006-02-15 22:21:31'),(14568,541,1,12894,'7.99','2005-08-19 03:49:28','2006-02-15 22:21:31'),(14569,541,2,13239,'4.99','2005-08-19 16:22:13','2006-02-15 22:21:31'),(14570,541,2,13640,'0.99','2005-08-20 07:22:53','2006-02-15 22:21:31'),(14571,541,2,14938,'6.99','2005-08-22 05:52:39','2006-02-15 22:21:31'),(14572,541,1,15071,'4.99','2005-08-22 10:58:43','2006-02-15 22:21:31'),(14573,541,2,15141,'3.99','2005-08-22 13:41:49','2006-02-15 22:21:32'),(14574,541,1,15223,'1.99','2005-08-22 17:13:39','2006-02-15 22:21:32'),(14575,541,1,15421,'0.99','2005-08-22 23:56:37','2006-02-15 22:21:32'),(14576,541,2,15924,'1.99','2005-08-23 18:08:59','2006-02-15 22:21:32'),(14577,542,1,220,'4.99','2005-05-26 10:06:49','2006-02-15 22:21:32'),(14578,542,2,376,'4.99','2005-05-27 08:58:15','2006-02-15 22:21:32'),(14579,542,1,2610,'4.99','2005-06-19 07:16:20','2006-02-15 22:21:32'),(14580,542,2,2957,'10.99','2005-06-20 06:53:47','2006-02-15 22:21:32'),(14581,542,2,5293,'0.99','2005-07-09 15:17:23','2006-02-15 22:21:32'),(14582,542,1,5477,'6.99','2005-07-09 23:43:49','2006-02-15 22:21:32'),(14583,542,2,6077,'5.99','2005-07-11 05:06:08','2006-02-15 22:21:32'),(14584,542,2,6325,'5.99','2005-07-11 19:06:01','2006-02-15 22:21:32'),(14585,542,1,6887,'9.99','2005-07-12 21:00:23','2006-02-15 22:21:32'),(14586,542,2,7672,'8.99','2005-07-28 02:49:41','2006-02-15 22:21:32'),(14587,542,1,8533,'4.99','2005-07-29 10:29:16','2006-02-15 22:21:32'),(14588,542,2,8544,'3.99','2005-07-29 11:02:08','2006-02-15 22:21:33'),(14589,542,1,10280,'4.99','2005-08-01 03:27:15','2006-02-15 22:21:33'),(14590,542,2,11583,'0.99','2005-08-17 02:08:13','2006-02-15 22:21:33'),(14591,542,2,11903,'2.99','2005-08-17 15:37:45','2006-02-15 22:21:33'),(14592,542,1,12819,'0.99','2005-08-19 01:05:05','2006-02-15 22:21:33'),(14593,542,1,13447,'0.99','2005-08-20 00:09:36','2006-02-15 22:21:33'),(14594,542,2,14982,'9.99','2005-08-22 07:20:55','2006-02-15 22:21:33'),(14595,543,1,243,'6.99','2005-05-26 13:06:05','2006-02-15 22:21:33'),(14596,543,2,476,'1.99','2005-05-27 22:31:36','2006-02-15 22:21:33'),(14597,543,2,1720,'4.99','2005-06-16 15:00:14','2006-02-15 22:21:33'),(14598,543,1,2426,'2.99','2005-06-18 17:40:44','2006-02-15 22:21:33'),(14599,543,2,3070,'4.99','2005-06-20 14:15:39','2006-02-15 22:21:33'),(14600,543,1,3128,'2.99','2005-06-20 18:41:47','2006-02-15 22:21:33'),(14601,543,2,3467,'5.99','2005-06-21 22:19:25','2006-02-15 22:21:33'),(14602,543,1,4887,'2.99','2005-07-08 19:59:14','2006-02-15 22:21:33'),(14603,543,2,5467,'4.99','2005-07-09 23:05:47','2006-02-15 22:21:34'),(14604,543,2,6013,'4.99','2005-07-11 02:02:03','2006-02-15 22:21:34'),(14605,543,2,7312,'2.99','2005-07-27 13:03:14','2006-02-15 22:21:34'),(14606,543,1,8580,'2.99','2005-07-29 12:00:27','2006-02-15 22:21:34'),(14607,543,2,8845,'4.99','2005-07-29 23:06:13','2006-02-15 22:21:34'),(14608,543,1,9505,'2.99','2005-07-31 00:11:19','2006-02-15 22:21:34'),(14609,543,1,9999,'0.99','2005-07-31 17:40:53','2006-02-15 22:21:34'),(14610,543,2,10257,'0.99','2005-08-01 02:49:43','2006-02-15 22:21:34'),(14611,543,1,10520,'4.99','2005-08-01 11:45:58','2006-02-15 22:21:34'),(14612,543,2,11241,'9.99','2005-08-02 13:29:24','2006-02-15 22:21:34'),(14613,543,1,11681,'2.99','2005-08-17 06:13:30','2006-02-15 22:21:34'),(14614,543,1,13187,'0.99','2005-08-19 14:24:48','2006-02-15 22:21:34'),(14615,543,2,15281,'1.99','2005-08-22 19:10:26','2006-02-15 22:21:34'),(14616,543,1,15785,'1.99','2005-08-23 13:46:27','2006-02-15 22:21:34'),(14617,544,1,397,'2.99','2005-05-27 12:29:02','2006-02-15 22:21:34'),(14618,544,1,864,'2.99','2005-05-30 03:27:17','2006-02-15 22:21:35'),(14619,544,1,1248,'1.99','2005-06-15 05:33:52','2006-02-15 22:21:35'),(14620,544,2,1434,'10.99','2005-06-15 18:30:46','2006-02-15 22:21:35'),(14621,544,1,2373,'0.99','2005-06-18 14:37:57','2006-02-15 22:21:35'),(14622,544,1,2395,'2.99','2005-06-18 15:45:15','2006-02-15 22:21:35'),(14623,544,1,4395,'0.99','2005-07-07 21:13:22','2006-02-15 22:21:35'),(14624,544,1,4703,'2.99','2005-07-08 11:44:56','2006-02-15 22:21:35'),(14625,544,2,4847,'6.99','2005-07-08 18:29:13','2006-02-15 22:21:35'),(14626,544,2,8566,'2.99','2005-07-29 11:35:46','2006-02-15 22:21:35'),(14627,544,1,8937,'5.99','2005-07-30 02:53:21','2006-02-15 22:21:35'),(14628,544,1,8963,'9.99','2005-07-30 03:46:26','2006-02-15 22:21:35'),(14629,544,1,10735,'0.99','2005-08-01 19:29:45','2006-02-15 22:21:35'),(14630,544,1,11401,'3.99','2005-08-02 19:05:06','2006-02-15 22:21:35'),(14631,544,2,11766,'2.99','2005-08-17 09:58:40','2006-02-15 22:21:35'),(14632,544,2,12640,'3.99','2005-08-18 18:14:49','2006-02-15 22:21:36'),(14633,544,2,14142,'4.99','2005-08-21 02:07:43','2006-02-15 22:21:36'),(14634,544,1,14498,'4.99','2005-08-21 14:10:44','2006-02-15 22:21:36'),(14635,544,2,14651,'8.99','2005-08-21 19:31:09','2006-02-15 22:21:36'),(14636,544,1,14981,'2.99','2005-08-22 07:19:05','2006-02-15 22:21:36'),(14637,544,1,15219,'6.99','2005-08-22 17:00:31','2006-02-15 22:21:36'),(14638,544,1,15605,'4.99','2005-08-23 06:48:47','2006-02-15 22:21:36'),(14639,545,2,248,'0.99','2005-05-26 14:07:58','2006-02-15 22:21:36'),(14640,545,2,715,'3.99','2005-05-29 04:22:41','2006-02-15 22:21:36'),(14641,545,1,2123,'2.99','2005-06-17 20:48:30','2006-02-15 22:21:36'),(14642,545,2,3693,'8.99','2005-07-06 09:56:09','2006-02-15 22:21:36'),(14643,545,1,3975,'5.99','2005-07-06 23:00:09','2006-02-15 22:21:36'),(14644,545,1,4597,'5.99','2005-07-08 06:43:42','2006-02-15 22:21:36'),(14645,545,1,5264,'0.99','2005-07-09 14:11:28','2006-02-15 22:21:36'),(14646,545,1,7078,'5.99','2005-07-27 04:16:37','2006-02-15 22:21:36'),(14647,545,2,8599,'3.99','2005-07-29 12:58:52','2006-02-15 22:21:37'),(14648,545,2,8848,'2.99','2005-07-29 23:20:58','2006-02-15 22:21:37'),(14649,545,2,9810,'2.99','2005-07-31 11:22:41','2006-02-15 22:21:37'),(14650,545,2,9942,'4.99','2005-07-31 15:35:43','2006-02-15 22:21:37'),(14651,545,2,10931,'2.99','2005-08-02 02:44:59','2006-02-15 22:21:37'),(14652,545,2,11760,'2.99','2005-08-17 09:44:22','2006-02-15 22:21:37'),(14653,545,1,12098,'4.99','2005-08-17 22:38:31','2006-02-15 22:21:37'),(14654,545,1,12349,'2.99','2005-08-18 07:23:42','2006-02-15 22:21:37'),(14655,545,2,12667,'10.99','2005-08-18 19:11:45','2006-02-15 22:21:37'),(14656,545,1,12800,'2.99','2005-08-19 00:27:11','2006-02-15 22:21:37'),(14657,545,1,13595,'4.99','2005-08-20 05:54:27','2006-02-15 22:21:37'),(14658,545,1,15585,'0.99','2005-08-23 05:55:22','2006-02-15 22:21:37'),(14659,545,2,15998,'4.99','2005-08-23 20:41:09','2006-02-15 22:21:37'),(14660,546,1,197,'5.99','2005-05-26 06:59:21','2006-02-15 22:21:37'),(14661,546,1,482,'6.99','2005-05-27 22:53:02','2006-02-15 22:21:37'),(14662,546,1,1181,'1.99','2005-06-15 00:42:17','2006-02-15 22:21:38'),(14663,546,2,1403,'0.99','2005-06-15 16:31:59','2006-02-15 22:21:38'),(14664,546,1,1787,'3.99','2005-06-16 19:30:59','2006-02-15 22:21:38'),(14665,546,1,2361,'5.99','2005-06-18 13:19:05','2006-02-15 22:21:38'),(14666,546,1,3738,'4.99','2005-07-06 11:50:57','2006-02-15 22:21:38'),(14667,546,2,4664,'0.99','2005-07-08 10:01:28','2006-02-15 22:21:38'),(14668,546,1,4734,'0.99','2005-07-08 13:12:12','2006-02-15 22:21:38'),(14669,546,1,5629,'0.99','2005-07-10 06:02:25','2006-02-15 22:21:38'),(14670,546,2,6758,'9.99','2005-07-12 15:13:49','2006-02-15 22:21:38'),(14671,546,1,6786,'2.99','2005-07-12 16:32:33','2006-02-15 22:21:38'),(14672,546,2,6910,'6.99','2005-07-12 22:11:21','2006-02-15 22:21:38'),(14673,546,1,8532,'4.99','2005-07-29 10:26:56','2006-02-15 22:21:38'),(14674,546,1,9087,'4.99','2005-07-30 08:19:47','2006-02-15 22:21:38'),(14675,546,1,NULL,'3.99','2005-07-30 21:16:20','2006-02-15 22:21:38'),(14676,546,2,9626,'1.99','2005-07-31 04:37:41','2006-02-15 22:21:38'),(14677,546,2,10370,'0.99','2005-08-01 06:18:04','2006-02-15 22:21:39'),(14678,546,2,11352,'5.99','2005-08-02 17:29:39','2006-02-15 22:21:39'),(14679,546,1,11797,'4.99','2005-08-17 11:17:21','2006-02-15 22:21:39'),(14680,546,2,12591,'2.99','2005-08-18 16:16:41','2006-02-15 22:21:39'),(14681,546,2,13850,'5.99','2005-08-20 14:43:03','2006-02-15 22:21:39'),(14682,546,1,14797,'4.99','2005-08-22 00:41:24','2006-02-15 22:21:39'),(14683,546,1,14829,'2.99','2005-08-22 01:35:37','2006-02-15 22:21:39'),(14684,546,1,14929,'3.99','2005-08-22 05:32:38','2006-02-15 22:21:39'),(14685,546,2,15565,'4.99','2005-08-23 05:13:09','2006-02-15 22:21:39'),(14686,547,1,306,'0.99','2005-05-26 21:31:57','2006-02-15 22:21:39'),(14687,547,2,443,'8.99','2005-05-27 18:35:20','2006-02-15 22:21:39'),(14688,547,2,1094,'1.99','2005-05-31 13:03:49','2006-02-15 22:21:39'),(14689,547,2,2022,'8.99','2005-06-17 12:44:39','2006-02-15 22:21:39'),(14690,547,2,3679,'4.99','2005-07-06 09:15:57','2006-02-15 22:21:39'),(14691,547,1,3765,'4.99','2005-07-06 13:01:47','2006-02-15 22:21:40'),(14692,547,2,5327,'4.99','2005-07-09 16:39:49','2006-02-15 22:21:40'),(14693,547,2,5854,'4.99','2005-07-10 17:47:34','2006-02-15 22:21:40'),(14694,547,1,6605,'0.99','2005-07-12 08:01:07','2006-02-15 22:21:40'),(14695,547,2,7420,'4.99','2005-07-27 17:09:39','2006-02-15 22:21:40'),(14696,547,2,7547,'3.99','2005-07-27 21:51:48','2006-02-15 22:21:40'),(14697,547,1,7835,'4.99','2005-07-28 08:49:39','2006-02-15 22:21:40'),(14698,547,1,7859,'3.99','2005-07-28 09:57:17','2006-02-15 22:21:40'),(14699,547,1,8828,'2.99','2005-07-29 22:32:54','2006-02-15 22:21:40'),(14700,547,1,10903,'2.99','2005-08-02 01:41:59','2006-02-15 22:21:40'),(14701,547,1,10980,'4.99','2005-08-02 04:17:32','2006-02-15 22:21:40'),(14702,547,2,11170,'5.99','2005-08-02 10:21:53','2006-02-15 22:21:40'),(14703,547,2,11361,'0.99','2005-08-02 17:46:34','2006-02-15 22:21:40'),(14704,547,1,12579,'0.99','2005-08-18 15:47:49','2006-02-15 22:21:40'),(14705,547,2,12943,'2.99','2005-08-19 05:46:26','2006-02-15 22:21:40'),(14706,547,2,13307,'2.99','2005-08-19 18:58:44','2006-02-15 22:21:41'),(14707,547,1,14510,'9.99','2005-08-21 14:44:41','2006-02-15 22:21:41'),(14708,547,2,14884,'4.99','2005-08-22 03:57:08','2006-02-15 22:21:41'),(14709,548,2,177,'6.99','2005-05-26 04:14:29','2006-02-15 22:21:41'),(14710,548,1,743,'4.99','2005-05-29 08:39:02','2006-02-15 22:21:41'),(14711,548,2,872,'3.99','2005-05-30 05:03:04','2006-02-15 22:21:41'),(14712,548,1,1326,'1.99','2005-06-15 11:07:39','2006-02-15 22:21:41'),(14713,548,1,2280,'2.99','2005-06-18 06:46:54','2006-02-15 22:21:41'),(14714,548,2,2978,'0.99','2005-06-20 08:25:16','2006-02-15 22:21:41'),(14715,548,1,3686,'2.99','2005-07-06 09:37:50','2006-02-15 22:21:41'),(14716,548,2,3777,'2.99','2005-07-06 13:36:48','2006-02-15 22:21:41'),(14717,548,1,4155,'7.99','2005-07-07 09:00:49','2006-02-15 22:21:41'),(14718,548,2,5138,'4.99','2005-07-09 08:00:46','2006-02-15 22:21:41'),(14719,548,2,6490,'4.99','2005-07-12 02:28:03','2006-02-15 22:21:41'),(14720,548,1,9614,'5.99','2005-07-31 03:59:31','2006-02-15 22:21:41'),(14721,548,2,10318,'0.99','2005-08-01 04:36:53','2006-02-15 22:21:42'),(14722,548,1,12860,'5.99','2005-08-19 02:24:41','2006-02-15 22:21:42'),(14723,548,1,13691,'3.99','2005-08-20 09:07:39','2006-02-15 22:21:42'),(14724,548,2,13730,'7.99','2005-08-20 10:17:09','2006-02-15 22:21:42'),(14725,548,2,14188,'0.99','2005-08-21 03:32:04','2006-02-15 22:21:42'),(14726,548,2,14723,'6.99','2005-08-21 21:52:32','2006-02-15 22:21:42'),(14727,548,1,13584,'0.99','2006-02-14 15:16:03','2006-02-15 22:21:42'),(14728,549,1,6,'0.99','2005-05-24 23:08:07','2006-02-15 22:21:42'),(14729,549,2,852,'4.99','2005-05-30 01:36:57','2006-02-15 22:21:42'),(14730,549,1,906,'3.99','2005-05-30 10:30:38','2006-02-15 22:21:42'),(14731,549,2,1086,'4.99','2005-05-31 11:17:37','2006-02-15 22:21:42'),(14732,549,1,2050,'2.99','2005-06-17 15:07:30','2006-02-15 22:21:42'),(14733,549,2,3523,'2.99','2005-07-06 01:01:38','2006-02-15 22:21:42'),(14734,549,2,3892,'4.99','2005-07-06 18:58:58','2006-02-15 22:21:42'),(14735,549,1,4447,'0.99','2005-07-07 23:15:28','2006-02-15 22:21:42'),(14736,549,1,7252,'7.99','2005-07-27 10:45:28','2006-02-15 22:21:43'),(14737,549,2,8239,'0.99','2005-07-29 00:31:39','2006-02-15 22:21:43'),(14738,549,1,8316,'4.99','2005-07-29 03:38:49','2006-02-15 22:21:43'),(14739,549,2,9445,'7.99','2005-07-30 21:50:42','2006-02-15 22:21:43'),(14740,549,2,9511,'9.99','2005-07-31 00:25:05','2006-02-15 22:21:43'),(14741,549,2,9887,'0.99','2005-07-31 14:00:32','2006-02-15 22:21:43'),(14742,549,2,10281,'0.99','2005-08-01 03:28:33','2006-02-15 22:21:43'),(14743,549,2,11737,'4.99','2005-08-17 08:42:08','2006-02-15 22:21:43'),(14744,549,2,11878,'2.99','2005-08-17 14:23:52','2006-02-15 22:21:43'),(14745,549,2,12634,'2.99','2005-08-18 17:58:14','2006-02-15 22:21:43'),(14746,549,2,12747,'4.99','2005-08-18 22:28:22','2006-02-15 22:21:43'),(14747,549,1,14434,'0.99','2005-08-21 11:40:46','2006-02-15 22:21:43'),(14748,550,2,922,'7.99','2005-05-30 11:55:55','2006-02-15 22:21:43'),(14749,550,1,1233,'6.99','2005-06-15 04:18:37','2006-02-15 22:21:43'),(14750,550,1,1863,'3.99','2005-06-17 01:31:46','2006-02-15 22:21:43'),(14751,550,2,1883,'4.99','2005-06-17 03:18:51','2006-02-15 22:21:44'),(14752,550,1,3154,'2.99','2005-06-20 20:44:40','2006-02-15 22:21:44'),(14753,550,2,3236,'9.99','2005-06-21 02:47:43','2006-02-15 22:21:44'),(14754,550,1,3272,'10.99','2005-06-21 05:18:27','2006-02-15 22:21:44'),(14755,550,1,3979,'4.99','2005-07-06 23:04:35','2006-02-15 22:21:44'),(14756,550,1,5727,'4.99','2005-07-10 11:25:28','2006-02-15 22:21:44'),(14757,550,1,6695,'2.99','2005-07-12 12:39:39','2006-02-15 22:21:44'),(14758,550,1,7030,'0.99','2005-07-27 03:01:40','2006-02-15 22:21:44'),(14759,550,2,7838,'2.99','2005-07-28 09:00:21','2006-02-15 22:21:44'),(14760,550,1,8628,'6.99','2005-07-29 14:06:24','2006-02-15 22:21:44'),(14761,550,2,8838,'2.99','2005-07-29 22:52:23','2006-02-15 22:21:44'),(14762,550,1,8959,'8.99','2005-07-30 03:35:49','2006-02-15 22:21:44'),(14763,550,1,9616,'2.99','2005-07-31 04:05:01','2006-02-15 22:21:44'),(14764,550,1,9748,'0.99','2005-07-31 09:17:56','2006-02-15 22:21:44'),(14765,550,2,10140,'4.99','2005-07-31 22:03:20','2006-02-15 22:21:44'),(14766,550,1,11246,'2.99','2005-08-02 13:33:56','2006-02-15 22:21:45'),(14767,550,2,11320,'0.99','2005-08-02 16:13:28','2006-02-15 22:21:45'),(14768,550,1,11969,'4.99','2005-08-17 17:49:37','2006-02-15 22:21:45'),(14769,550,1,12063,'2.99','2005-08-17 21:24:48','2006-02-15 22:21:45'),(14770,550,2,12077,'4.99','2005-08-17 21:59:14','2006-02-15 22:21:45'),(14771,550,1,13114,'10.99','2005-08-19 11:27:32','2006-02-15 22:21:45'),(14772,550,2,14071,'2.99','2005-08-20 23:01:56','2006-02-15 22:21:45'),(14773,550,2,14127,'4.99','2005-08-21 01:33:32','2006-02-15 22:21:45'),(14774,550,2,14375,'6.99','2005-08-21 09:46:35','2006-02-15 22:21:45'),(14775,550,1,14687,'4.99','2005-08-21 20:32:16','2006-02-15 22:21:45'),(14776,550,2,15431,'9.99','2005-08-23 00:26:47','2006-02-15 22:21:45'),(14777,550,1,15883,'0.99','2005-08-23 16:44:56','2006-02-15 22:21:45'),(14778,550,2,15977,'4.99','2005-08-23 20:07:10','2006-02-15 22:21:45'),(14779,550,2,11757,'2.99','2006-02-14 15:16:03','2006-02-15 22:21:45'),(14780,551,2,155,'7.99','2005-05-26 01:15:05','2006-02-15 22:21:45'),(14781,551,1,728,'2.99','2005-05-29 06:12:38','2006-02-15 22:21:46'),(14782,551,1,795,'0.99','2005-05-29 16:57:39','2006-02-15 22:21:46'),(14783,551,2,969,'4.99','2005-05-30 19:23:48','2006-02-15 22:21:46'),(14784,551,2,1005,'3.99','2005-05-31 00:53:25','2006-02-15 22:21:46'),(14785,551,2,2069,'4.99','2005-06-17 16:19:39','2006-02-15 22:21:46'),(14786,551,1,2776,'3.99','2005-06-19 18:16:24','2006-02-15 22:21:46'),(14787,551,2,3996,'5.99','2005-07-06 23:46:43','2006-02-15 22:21:46'),(14788,551,1,5201,'1.99','2005-07-09 10:52:53','2006-02-15 22:21:46'),(14789,551,2,5528,'0.99','2005-07-10 02:09:21','2006-02-15 22:21:46'),(14790,551,1,6041,'0.99','2005-07-11 03:14:58','2006-02-15 22:21:46'),(14791,551,2,7095,'9.99','2005-07-27 04:51:15','2006-02-15 22:21:46'),(14792,551,1,8986,'0.99','2005-07-30 04:37:20','2006-02-15 22:21:46'),(14793,551,1,9287,'2.99','2005-07-30 15:35:39','2006-02-15 22:21:46'),(14794,551,2,9765,'4.99','2005-07-31 09:44:40','2006-02-15 22:21:46'),(14795,551,2,11380,'0.99','2005-08-02 18:17:32','2006-02-15 22:21:46'),(14796,551,2,11883,'2.99','2005-08-17 14:41:28','2006-02-15 22:21:47'),(14797,551,2,12208,'4.99','2005-08-18 02:25:25','2006-02-15 22:21:47'),(14798,551,2,12868,'0.99','2005-08-19 02:47:19','2006-02-15 22:21:47'),(14799,551,1,13439,'3.99','2005-08-19 23:42:16','2006-02-15 22:21:47'),(14800,551,1,14420,'0.99','2005-08-21 11:16:15','2006-02-15 22:21:47'),(14801,551,2,14609,'4.99','2005-08-21 17:57:26','2006-02-15 22:21:47'),(14802,551,2,14633,'2.99','2005-08-21 18:51:10','2006-02-15 22:21:47'),(14803,551,1,14833,'2.99','2005-08-22 01:45:18','2006-02-15 22:21:47'),(14804,551,1,15377,'4.99','2005-08-22 22:22:33','2006-02-15 22:21:47'),(14805,551,2,15390,'6.99','2005-08-22 22:57:25','2006-02-15 22:21:47'),(14806,552,2,174,'0.99','2005-05-26 03:44:10','2006-02-15 22:21:47'),(14807,552,2,2320,'0.99','2005-06-18 09:24:50','2006-02-15 22:21:47'),(14808,552,2,3397,'4.99','2005-06-21 15:30:11','2006-02-15 22:21:47'),(14809,552,1,4477,'6.99','2005-07-08 00:38:24','2006-02-15 22:21:47'),(14810,552,1,5213,'7.99','2005-07-09 11:39:43','2006-02-15 22:21:48'),(14811,552,2,6189,'4.99','2005-07-11 11:36:03','2006-02-15 22:21:48'),(14812,552,1,7772,'2.99','2005-07-28 06:59:09','2006-02-15 22:21:48'),(14813,552,1,8085,'2.99','2005-07-28 18:13:15','2006-02-15 22:21:48'),(14814,552,2,8192,'2.99','2005-07-28 22:49:11','2006-02-15 22:21:48'),(14815,552,2,8614,'5.99','2005-07-29 13:32:05','2006-02-15 22:21:48'),(14816,552,2,8894,'4.99','2005-07-30 00:48:31','2006-02-15 22:21:48'),(14817,552,1,9342,'8.99','2005-07-30 18:09:56','2006-02-15 22:21:48'),(14818,552,1,11146,'1.99','2005-08-02 09:45:32','2006-02-15 22:21:48'),(14819,552,2,11205,'4.99','2005-08-02 11:56:54','2006-02-15 22:21:48'),(14820,552,2,11300,'7.99','2005-08-02 15:37:42','2006-02-15 22:21:48'),(14821,552,2,12433,'4.99','2005-08-18 10:37:49','2006-02-15 22:21:48'),(14822,552,2,12880,'2.99','2005-08-19 03:27:17','2006-02-15 22:21:48'),(14823,552,2,13574,'2.99','2005-08-20 05:10:39','2006-02-15 22:21:48'),(14824,552,1,13693,'0.99','2005-08-20 09:11:42','2006-02-15 22:21:48'),(14825,552,2,14724,'4.99','2005-08-21 21:53:47','2006-02-15 22:21:49'),(14826,552,2,15700,'2.99','2005-08-23 10:21:21','2006-02-15 22:21:49'),(14827,553,2,789,'4.99','2005-05-29 16:17:07','2006-02-15 22:21:49'),(14828,553,2,1862,'3.99','2005-06-17 01:29:30','2006-02-15 22:21:49'),(14829,553,1,2460,'8.99','2005-06-18 19:54:13','2006-02-15 22:21:49'),(14830,553,2,3103,'6.99','2005-06-20 16:58:19','2006-02-15 22:21:49'),(14831,553,1,3495,'6.99','2005-07-05 23:50:04','2006-02-15 22:21:49'),(14832,553,2,3793,'4.99','2005-07-06 14:32:44','2006-02-15 22:21:49'),(14833,553,2,3859,'2.99','2005-07-06 17:18:15','2006-02-15 22:21:49'),(14834,553,1,3890,'4.99','2005-07-06 18:58:15','2006-02-15 22:21:49'),(14835,553,2,3891,'4.99','2005-07-06 18:58:25','2006-02-15 22:21:49'),(14836,553,2,3942,'4.99','2005-07-06 21:21:34','2006-02-15 22:21:49'),(14837,553,1,4257,'4.99','2005-07-07 14:18:41','2006-02-15 22:21:49'),(14838,553,2,4662,'0.99','2005-07-08 09:58:54','2006-02-15 22:21:49'),(14839,553,2,4845,'4.99','2005-07-08 18:28:20','2006-02-15 22:21:49'),(14840,553,2,4941,'3.99','2005-07-08 22:39:10','2006-02-15 22:21:50'),(14841,553,1,6069,'2.99','2005-07-11 04:44:59','2006-02-15 22:21:50'),(14842,553,2,6657,'0.99','2005-07-12 11:11:36','2006-02-15 22:21:50'),(14843,553,1,6812,'6.99','2005-07-12 18:03:25','2006-02-15 22:21:50'),(14844,553,1,7890,'4.99','2005-07-28 10:43:40','2006-02-15 22:21:50'),(14845,553,2,9272,'4.99','2005-07-30 15:05:22','2006-02-15 22:21:50'),(14846,553,2,9601,'2.99','2005-07-31 03:42:17','2006-02-15 22:21:50'),(14847,553,2,11710,'4.99','2005-08-17 07:29:44','2006-02-15 22:21:50'),(14848,553,1,13972,'2.99','2005-08-20 18:52:17','2006-02-15 22:21:50'),(14849,553,1,15042,'4.99','2005-08-22 09:47:37','2006-02-15 22:21:50'),(14850,553,1,15506,'0.99','2005-08-23 02:48:24','2006-02-15 22:21:50'),(14851,554,1,607,'2.99','2005-05-28 15:02:41','2006-02-15 22:21:50'),(14852,554,1,817,'2.99','2005-05-29 20:39:14','2006-02-15 22:21:50'),(14853,554,1,1959,'4.99','2005-06-17 08:54:10','2006-02-15 22:21:50'),(14854,554,1,2279,'6.99','2005-06-18 06:38:22','2006-02-15 22:21:50'),(14855,554,2,3278,'2.99','2005-06-21 05:41:30','2006-02-15 22:21:51'),(14856,554,1,3312,'6.99','2005-06-21 08:05:32','2006-02-15 22:21:51'),(14857,554,2,4902,'4.99','2005-07-08 20:49:30','2006-02-15 22:21:51'),(14858,554,1,5527,'2.99','2005-07-10 02:06:01','2006-02-15 22:21:51'),(14859,554,1,5968,'5.99','2005-07-11 00:03:11','2006-02-15 22:21:51'),(14860,554,1,6144,'2.99','2005-07-11 09:02:53','2006-02-15 22:21:51'),(14861,554,1,10612,'6.99','2005-08-01 14:55:31','2006-02-15 22:21:51'),(14862,554,2,10829,'7.99','2005-08-01 23:17:06','2006-02-15 22:21:51'),(14863,554,2,11589,'9.99','2005-08-17 02:28:22','2006-02-15 22:21:51'),(14864,554,1,11873,'0.99','2005-08-17 14:14:39','2006-02-15 22:21:51'),(14865,554,1,12010,'8.99','2005-08-17 19:17:54','2006-02-15 22:21:51'),(14866,554,1,12014,'0.99','2005-08-17 19:29:44','2006-02-15 22:21:51'),(14867,554,2,13139,'4.99','2005-08-19 12:32:10','2006-02-15 22:21:51'),(14868,554,2,14015,'2.99','2005-08-20 20:47:43','2006-02-15 22:21:51'),(14869,554,1,14098,'3.99','2005-08-21 00:30:32','2006-02-15 22:21:51'),(14870,554,1,14469,'0.99','2005-08-21 13:07:24','2006-02-15 22:21:52'),(14871,554,1,14626,'2.99','2005-08-21 18:35:44','2006-02-15 22:21:52'),(14872,554,2,15690,'4.99','2005-08-23 09:53:30','2006-02-15 22:21:52'),(14873,555,2,3232,'1.99','2005-06-21 02:30:37','2006-02-15 22:21:52'),(14874,555,2,4875,'2.99','2005-07-08 19:24:17','2006-02-15 22:21:52'),(14875,555,1,8161,'0.99','2005-07-28 21:11:00','2006-02-15 22:21:52'),(14876,555,1,8245,'3.99','2005-07-29 00:37:09','2006-02-15 22:21:52'),(14877,555,1,9299,'5.99','2005-07-30 16:32:51','2006-02-15 22:21:52'),(14878,555,2,9990,'7.99','2005-07-31 17:24:21','2006-02-15 22:21:52'),(14879,555,2,10076,'7.99','2005-07-31 20:00:34','2006-02-15 22:21:52'),(14880,555,1,10921,'3.99','2005-08-02 02:14:33','2006-02-15 22:21:52'),(14881,555,1,11168,'4.99','2005-08-02 10:19:42','2006-02-15 22:21:52'),(14882,555,1,11718,'4.99','2005-08-17 07:44:42','2006-02-15 22:21:52'),(14883,555,2,11747,'2.99','2005-08-17 09:03:31','2006-02-15 22:21:52'),(14884,555,2,12091,'4.99','2005-08-17 22:22:50','2006-02-15 22:21:52'),(14885,555,2,12150,'2.99','2005-08-18 00:13:55','2006-02-15 22:21:53'); +INSERT INTO payment VALUES (14886,555,2,12182,'2.99','2005-08-18 01:30:19','2006-02-15 22:21:53'),(14887,555,1,12388,'2.99','2005-08-18 08:48:09','2006-02-15 22:21:53'),(14888,555,1,12883,'4.99','2005-08-19 03:33:47','2006-02-15 22:21:53'),(14889,555,2,15102,'6.99','2005-08-22 11:58:58','2006-02-15 22:21:53'),(14890,556,1,184,'0.99','2005-05-26 05:29:49','2006-02-15 22:21:53'),(14891,556,2,772,'5.99','2005-05-29 13:08:06','2006-02-15 22:21:53'),(14892,556,1,1083,'3.99','2005-05-31 11:04:48','2006-02-15 22:21:53'),(14893,556,1,2092,'6.99','2005-06-17 18:12:16','2006-02-15 22:21:53'),(14894,556,2,2593,'5.99','2005-06-19 05:40:11','2006-02-15 22:21:53'),(14895,556,2,2986,'0.99','2005-06-20 08:50:28','2006-02-15 22:21:53'),(14896,556,1,3093,'4.99','2005-06-20 16:06:14','2006-02-15 22:21:53'),(14897,556,2,3438,'6.99','2005-06-21 19:31:40','2006-02-15 22:21:53'),(14898,556,2,4719,'2.99','2005-07-08 12:33:00','2006-02-15 22:21:53'),(14899,556,2,4839,'3.99','2005-07-08 18:13:10','2006-02-15 22:21:54'),(14900,556,1,4846,'0.99','2005-07-08 18:29:05','2006-02-15 22:21:54'),(14901,556,2,5722,'0.99','2005-07-10 11:10:04','2006-02-15 22:21:54'),(14902,556,2,6484,'2.99','2005-07-12 02:04:10','2006-02-15 22:21:54'),(14903,556,1,8909,'5.99','2005-07-30 01:28:03','2006-02-15 22:21:54'),(14904,556,2,10106,'4.99','2005-07-31 21:00:47','2006-02-15 22:21:54'),(14905,556,2,10518,'6.99','2005-08-01 11:44:08','2006-02-15 22:21:54'),(14906,556,1,11466,'1.99','2005-08-02 21:46:46','2006-02-15 22:21:54'),(14907,556,2,11804,'3.99','2005-08-17 11:42:45','2006-02-15 22:21:54'),(14908,556,1,12045,'4.99','2005-08-17 20:40:46','2006-02-15 22:21:54'),(14909,556,1,14176,'2.99','2005-08-21 03:09:23','2006-02-15 22:21:54'),(14910,556,1,15568,'2.99','2005-08-23 05:24:09','2006-02-15 22:21:54'),(14911,557,2,467,'4.99','2005-05-27 21:10:03','2006-02-15 22:21:54'),(14912,557,1,478,'4.99','2005-05-27 22:38:20','2006-02-15 22:21:54'),(14913,557,1,1666,'0.99','2005-06-16 10:17:19','2006-02-15 22:21:54'),(14914,557,2,2988,'6.99','2005-06-20 08:59:08','2006-02-15 22:21:55'),(14915,557,1,3050,'3.99','2005-06-20 13:03:03','2006-02-15 22:21:55'),(14916,557,1,4651,'0.99','2005-07-08 09:39:39','2006-02-15 22:21:55'),(14917,557,1,4851,'1.99','2005-07-08 18:40:05','2006-02-15 22:21:55'),(14918,557,1,6459,'0.99','2005-07-12 01:12:03','2006-02-15 22:21:55'),(14919,557,2,6713,'3.99','2005-07-12 13:27:36','2006-02-15 22:21:55'),(14920,557,2,6823,'4.99','2005-07-12 18:24:31','2006-02-15 22:21:55'),(14921,557,2,6898,'0.99','2005-07-12 21:39:04','2006-02-15 22:21:55'),(14922,557,1,9336,'0.99','2005-07-30 18:01:15','2006-02-15 22:21:55'),(14923,557,1,9341,'2.99','2005-07-30 18:07:58','2006-02-15 22:21:55'),(14924,557,2,9366,'1.99','2005-07-30 18:48:57','2006-02-15 22:21:55'),(14925,557,2,9367,'6.99','2005-07-30 18:49:58','2006-02-15 22:21:55'),(14926,557,1,11181,'0.99','2005-08-02 10:55:03','2006-02-15 22:21:55'),(14927,557,1,12555,'1.99','2005-08-18 14:49:22','2006-02-15 22:21:55'),(14928,557,1,12789,'2.99','2005-08-19 00:16:19','2006-02-15 22:21:55'),(14929,557,1,13540,'2.99','2005-08-20 03:41:23','2006-02-15 22:21:56'),(14930,557,2,13794,'2.99','2005-08-20 12:25:32','2006-02-15 22:21:56'),(14931,557,2,15236,'0.99','2005-08-22 17:44:27','2006-02-15 22:21:56'),(14932,557,2,15570,'5.99','2005-08-23 05:24:55','2006-02-15 22:21:56'),(14933,557,2,15914,'0.99','2005-08-23 17:49:26','2006-02-15 22:21:56'),(14934,557,1,14278,'4.99','2006-02-14 15:16:03','2006-02-15 22:21:56'),(14935,558,2,1967,'4.99','2005-06-17 09:19:52','2006-02-15 22:21:56'),(14936,558,1,2411,'1.99','2005-06-18 16:55:54','2006-02-15 22:21:56'),(14937,558,2,2544,'4.99','2005-06-19 02:16:17','2006-02-15 22:21:56'),(14938,558,2,3016,'4.99','2005-06-20 10:55:08','2006-02-15 22:21:56'),(14939,558,2,3451,'10.99','2005-06-21 21:10:39','2006-02-15 22:21:56'),(14940,558,1,3731,'9.99','2005-07-06 11:33:36','2006-02-15 22:21:56'),(14941,558,1,3954,'0.99','2005-07-06 21:57:44','2006-02-15 22:21:56'),(14942,558,1,3990,'3.99','2005-07-06 23:32:44','2006-02-15 22:21:56'),(14943,558,1,4192,'5.99','2005-07-07 10:57:06','2006-02-15 22:21:57'),(14944,558,1,4932,'2.99','2005-07-08 22:17:40','2006-02-15 22:21:57'),(14945,558,2,5375,'6.99','2005-07-09 18:52:55','2006-02-15 22:21:57'),(14946,558,1,5492,'3.99','2005-07-10 00:11:09','2006-02-15 22:21:57'),(14947,558,2,6278,'7.99','2005-07-11 16:20:02','2006-02-15 22:21:57'),(14948,558,2,6479,'9.99','2005-07-12 01:49:00','2006-02-15 22:21:57'),(14949,558,2,6742,'4.99','2005-07-12 14:25:31','2006-02-15 22:21:57'),(14950,558,1,6757,'0.99','2005-07-12 15:09:48','2006-02-15 22:21:57'),(14951,558,1,7424,'0.99','2005-07-27 17:14:19','2006-02-15 22:21:57'),(14952,558,1,8523,'2.99','2005-07-29 10:18:27','2006-02-15 22:21:57'),(14953,558,1,8858,'4.99','2005-07-29 23:44:35','2006-02-15 22:21:57'),(14954,558,1,8889,'2.99','2005-07-30 00:39:43','2006-02-15 22:21:57'),(14955,558,2,10707,'0.99','2005-08-01 18:41:34','2006-02-15 22:21:57'),(14956,558,1,11268,'0.99','2005-08-02 14:10:39','2006-02-15 22:21:57'),(14957,558,2,11567,'5.99','2005-08-17 01:28:43','2006-02-15 22:21:57'),(14958,558,2,12040,'6.99','2005-08-17 20:29:56','2006-02-15 22:21:58'),(14959,558,1,12194,'1.99','2005-08-18 02:04:47','2006-02-15 22:21:58'),(14960,558,2,13566,'5.99','2005-08-20 04:45:32','2006-02-15 22:21:58'),(14961,558,2,14235,'7.99','2005-08-21 05:08:42','2006-02-15 22:21:58'),(14962,558,1,14286,'5.99','2005-08-21 06:53:53','2006-02-15 22:21:58'),(14963,559,2,2576,'4.99','2005-06-19 04:34:15','2006-02-15 22:21:58'),(14964,559,1,2706,'0.99','2005-06-19 13:56:51','2006-02-15 22:21:58'),(14965,559,2,3046,'4.99','2005-06-20 12:42:59','2006-02-15 22:21:58'),(14966,559,1,3370,'1.99','2005-06-21 13:27:01','2006-02-15 22:21:58'),(14967,559,1,3674,'5.99','2005-07-06 09:03:13','2006-02-15 22:21:58'),(14968,559,1,4120,'4.99','2005-07-07 07:07:03','2006-02-15 22:21:58'),(14969,559,1,4370,'7.99','2005-07-07 20:05:36','2006-02-15 22:21:58'),(14970,559,2,5396,'1.99','2005-07-09 19:42:52','2006-02-15 22:21:58'),(14971,559,1,6201,'4.99','2005-07-11 12:18:07','2006-02-15 22:21:58'),(14972,559,1,6915,'2.99','2005-07-12 22:28:09','2006-02-15 22:21:58'),(14973,559,1,7169,'1.99','2005-07-27 07:51:39','2006-02-15 22:21:59'),(14974,559,1,7680,'1.99','2005-07-28 02:59:08','2006-02-15 22:21:59'),(14975,559,1,8631,'1.99','2005-07-29 14:08:06','2006-02-15 22:21:59'),(14976,559,2,9134,'0.99','2005-07-30 10:00:21','2006-02-15 22:21:59'),(14977,559,1,9877,'2.99','2005-07-31 13:41:57','2006-02-15 22:21:59'),(14978,559,2,10146,'2.99','2005-07-31 22:17:56','2006-02-15 22:21:59'),(14979,559,1,10377,'3.99','2005-08-01 06:28:28','2006-02-15 22:21:59'),(14980,559,1,10669,'8.99','2005-08-01 17:03:28','2006-02-15 22:21:59'),(14981,559,2,10876,'0.99','2005-08-02 00:31:58','2006-02-15 22:21:59'),(14982,559,2,11136,'1.99','2005-08-02 09:22:57','2006-02-15 22:21:59'),(14983,559,1,13234,'1.99','2005-08-19 16:17:15','2006-02-15 22:21:59'),(14984,559,2,13248,'6.99','2005-08-19 16:47:41','2006-02-15 22:21:59'),(14985,559,2,13322,'4.99','2005-08-19 19:43:08','2006-02-15 22:21:59'),(14986,559,1,13845,'5.99','2005-08-20 14:31:21','2006-02-15 22:21:59'),(14987,559,1,14342,'4.99','2005-08-21 08:39:26','2006-02-15 22:22:00'),(14988,559,2,14622,'4.99','2005-08-21 18:25:59','2006-02-15 22:22:00'),(14989,559,2,15440,'4.99','2005-08-23 00:37:21','2006-02-15 22:22:00'),(14990,559,1,15877,'4.99','2005-08-23 16:33:33','2006-02-15 22:22:00'),(14991,560,1,137,'2.99','2005-05-25 22:25:18','2006-02-15 22:22:00'),(14992,560,1,1271,'4.99','2005-06-15 07:32:24','2006-02-15 22:22:00'),(14993,560,2,1572,'1.99','2005-06-16 03:23:22','2006-02-15 22:22:00'),(14994,560,1,3941,'4.99','2005-07-06 21:20:37','2006-02-15 22:22:00'),(14995,560,1,4298,'2.99','2005-07-07 16:27:25','2006-02-15 22:22:00'),(14996,560,2,4375,'9.99','2005-07-07 20:20:29','2006-02-15 22:22:00'),(14997,560,1,4453,'0.99','2005-07-07 23:32:39','2006-02-15 22:22:00'),(14998,560,2,5208,'2.99','2005-07-09 11:16:56','2006-02-15 22:22:00'),(14999,560,1,6410,'4.99','2005-07-11 23:08:06','2006-02-15 22:22:00'),(15000,560,1,6945,'2.99','2005-07-26 23:35:29','2006-02-15 22:22:00'),(15001,560,2,7202,'4.99','2005-07-27 09:00:20','2006-02-15 22:22:00'),(15002,560,1,7891,'3.99','2005-07-28 10:43:56','2006-02-15 22:22:01'),(15003,560,1,8753,'2.99','2005-07-29 19:15:50','2006-02-15 22:22:01'),(15004,560,2,8861,'5.99','2005-07-29 23:47:29','2006-02-15 22:22:01'),(15005,560,2,8906,'4.99','2005-07-30 01:21:39','2006-02-15 22:22:01'),(15006,560,1,9265,'0.99','2005-07-30 14:55:25','2006-02-15 22:22:01'),(15007,560,2,9895,'5.99','2005-07-31 14:07:56','2006-02-15 22:22:01'),(15008,560,2,10480,'4.99','2005-08-01 10:13:41','2006-02-15 22:22:01'),(15009,560,1,10702,'4.99','2005-08-01 18:34:59','2006-02-15 22:22:01'),(15010,560,1,10733,'7.99','2005-08-01 19:28:01','2006-02-15 22:22:01'),(15011,560,1,11334,'7.99','2005-08-02 16:53:20','2006-02-15 22:22:01'),(15012,560,1,11788,'4.99','2005-08-17 10:59:18','2006-02-15 22:22:01'),(15013,560,2,14008,'5.99','2005-08-20 20:26:00','2006-02-15 22:22:01'),(15014,560,1,14341,'1.99','2005-08-21 08:38:24','2006-02-15 22:22:01'),(15015,560,2,14363,'4.99','2005-08-21 09:20:03','2006-02-15 22:22:01'),(15016,560,1,14436,'2.99','2005-08-21 11:48:27','2006-02-15 22:22:01'),(15017,560,2,14785,'2.99','2005-08-22 00:24:37','2006-02-15 22:22:02'),(15018,560,1,15352,'6.99','2005-08-22 21:16:54','2006-02-15 22:22:02'),(15019,560,2,12116,'5.98','2006-02-14 15:16:03','2006-02-15 22:22:02'),(15020,560,2,14425,'0.00','2006-02-14 15:16:03','2006-02-15 22:22:02'),(15021,561,1,902,'4.99','2005-05-30 09:53:36','2006-02-15 22:22:02'),(15022,561,2,971,'4.99','2005-05-30 20:10:52','2006-02-15 22:22:02'),(15023,561,2,1193,'2.99','2005-06-15 01:24:20','2006-02-15 22:22:02'),(15024,561,2,1505,'2.99','2005-06-15 22:12:50','2006-02-15 22:22:02'),(15025,561,2,1620,'4.99','2005-06-16 07:21:30','2006-02-15 22:22:02'),(15026,561,1,2119,'4.99','2005-06-17 20:34:42','2006-02-15 22:22:02'),(15027,561,1,2357,'5.99','2005-06-18 12:59:41','2006-02-15 22:22:02'),(15028,561,1,2548,'0.99','2005-06-19 02:45:35','2006-02-15 22:22:02'),(15029,561,1,2950,'4.99','2005-06-20 06:08:36','2006-02-15 22:22:02'),(15030,561,1,3160,'4.99','2005-06-20 21:20:51','2006-02-15 22:22:02'),(15031,561,1,3427,'0.99','2005-06-21 18:31:09','2006-02-15 22:22:03'),(15032,561,2,6361,'2.99','2005-07-11 21:09:14','2006-02-15 22:22:03'),(15033,561,1,6435,'0.99','2005-07-12 00:16:19','2006-02-15 22:22:03'),(15034,561,1,6621,'0.99','2005-07-12 08:57:30','2006-02-15 22:22:03'),(15035,561,1,6843,'4.99','2005-07-12 19:14:05','2006-02-15 22:22:03'),(15036,561,1,7698,'0.99','2005-07-28 03:44:14','2006-02-15 22:22:03'),(15037,561,1,8504,'10.99','2005-07-29 09:20:16','2006-02-15 22:22:03'),(15038,561,2,9839,'7.99','2005-07-31 12:21:16','2006-02-15 22:22:03'),(15039,561,2,10317,'2.99','2005-08-01 04:35:34','2006-02-15 22:22:03'),(15040,561,1,10907,'4.99','2005-08-02 01:51:48','2006-02-15 22:22:03'),(15041,561,1,11371,'2.99','2005-08-02 18:07:36','2006-02-15 22:22:03'),(15042,561,2,11402,'2.99','2005-08-02 19:07:21','2006-02-15 22:22:03'),(15043,561,2,12441,'2.99','2005-08-18 10:47:57','2006-02-15 22:22:03'),(15044,561,2,14139,'0.99','2005-08-21 02:04:33','2006-02-15 22:22:03'),(15045,561,1,15573,'0.99','2005-08-23 05:28:36','2006-02-15 22:22:03'),(15046,561,1,15946,'2.99','2005-08-23 18:54:07','2006-02-15 22:22:04'),(15047,561,1,14415,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:04'),(15048,562,2,788,'2.99','2005-05-29 16:13:55','2006-02-15 22:22:04'),(15049,562,1,941,'2.99','2005-05-30 15:02:25','2006-02-15 22:22:04'),(15050,562,1,1139,'5.99','2005-05-31 19:34:52','2006-02-15 22:22:04'),(15051,562,1,1998,'3.99','2005-06-17 11:24:57','2006-02-15 22:22:04'),(15052,562,1,2705,'4.99','2005-06-19 13:54:30','2006-02-15 22:22:04'),(15053,562,1,2746,'3.99','2005-06-19 16:21:40','2006-02-15 22:22:04'),(15054,562,2,3242,'4.99','2005-06-21 02:56:24','2006-02-15 22:22:04'),(15055,562,2,4732,'5.99','2005-07-08 13:09:45','2006-02-15 22:22:04'),(15056,562,1,4802,'4.99','2005-07-08 16:55:17','2006-02-15 22:22:04'),(15057,562,2,5360,'0.99','2005-07-09 18:14:03','2006-02-15 22:22:04'),(15058,562,2,6065,'6.99','2005-07-11 04:25:51','2006-02-15 22:22:04'),(15059,562,1,6607,'8.99','2005-07-12 08:08:50','2006-02-15 22:22:04'),(15060,562,2,7166,'3.99','2005-07-27 07:36:56','2006-02-15 22:22:04'),(15061,562,1,7430,'2.99','2005-07-27 17:26:14','2006-02-15 22:22:05'),(15062,562,2,7560,'2.99','2005-07-27 22:20:17','2006-02-15 22:22:05'),(15063,562,2,8132,'0.99','2005-07-28 19:57:31','2006-02-15 22:22:05'),(15064,562,2,10868,'6.99','2005-08-02 00:25:15','2006-02-15 22:22:05'),(15065,562,2,12008,'4.99','2005-08-17 19:16:18','2006-02-15 22:22:05'),(15066,562,1,12248,'5.99','2005-08-18 03:53:18','2006-02-15 22:22:05'),(15067,562,2,13225,'2.99','2005-08-19 15:54:33','2006-02-15 22:22:05'),(15068,562,2,13347,'10.99','2005-08-19 20:28:48','2006-02-15 22:22:05'),(15069,562,2,13639,'0.99','2005-08-20 07:22:07','2006-02-15 22:22:05'),(15070,562,1,15212,'2.99','2005-08-22 16:44:26','2006-02-15 22:22:05'),(15071,562,2,15475,'2.99','2005-08-23 01:44:43','2006-02-15 22:22:05'),(15072,562,1,15900,'1.99','2005-08-23 17:16:30','2006-02-15 22:22:05'),(15073,563,1,758,'4.99','2005-05-29 10:31:56','2006-02-15 22:22:05'),(15074,563,2,773,'5.99','2005-05-29 13:18:05','2006-02-15 22:22:05'),(15075,563,2,1545,'4.99','2005-06-16 01:31:23','2006-02-15 22:22:06'),(15076,563,2,2573,'0.99','2005-06-19 04:23:18','2006-02-15 22:22:06'),(15077,563,1,4106,'1.99','2005-07-07 06:33:35','2006-02-15 22:22:06'),(15078,563,2,4436,'0.99','2005-07-07 22:52:04','2006-02-15 22:22:06'),(15079,563,1,4565,'3.99','2005-07-08 05:12:28','2006-02-15 22:22:06'),(15080,563,2,4629,'6.99','2005-07-08 08:31:26','2006-02-15 22:22:06'),(15081,563,2,4711,'2.99','2005-07-08 12:06:58','2006-02-15 22:22:06'),(15082,563,2,4776,'5.99','2005-07-08 15:44:20','2006-02-15 22:22:06'),(15083,563,2,4808,'3.99','2005-07-08 17:02:49','2006-02-15 22:22:06'),(15084,563,2,4825,'4.99','2005-07-08 17:43:01','2006-02-15 22:22:06'),(15085,563,1,4883,'0.99','2005-07-08 19:46:58','2006-02-15 22:22:06'),(15086,563,1,5406,'0.99','2005-07-09 20:13:23','2006-02-15 22:22:06'),(15087,563,2,6326,'2.99','2005-07-11 19:06:55','2006-02-15 22:22:06'),(15088,563,2,7612,'0.99','2005-07-28 00:11:55','2006-02-15 22:22:06'),(15089,563,1,8262,'1.99','2005-07-29 01:11:18','2006-02-15 22:22:06'),(15090,563,1,8610,'5.99','2005-07-29 13:25:02','2006-02-15 22:22:07'),(15091,563,2,8632,'6.99','2005-07-29 14:11:25','2006-02-15 22:22:07'),(15092,563,2,8812,'7.99','2005-07-29 21:47:40','2006-02-15 22:22:07'),(15093,563,2,11829,'0.99','2005-08-17 12:52:04','2006-02-15 22:22:07'),(15094,563,1,12039,'1.99','2005-08-17 20:29:08','2006-02-15 22:22:07'),(15095,563,1,12202,'1.99','2005-08-18 02:14:08','2006-02-15 22:22:07'),(15096,563,1,12832,'2.99','2005-08-19 01:41:44','2006-02-15 22:22:07'),(15097,563,2,13863,'9.99','2005-08-20 14:57:50','2006-02-15 22:22:07'),(15098,563,2,14592,'4.99','2005-08-21 17:30:17','2006-02-15 22:22:07'),(15099,563,2,15507,'0.99','2005-08-23 02:48:26','2006-02-15 22:22:07'),(15100,563,2,15638,'3.99','2005-08-23 07:54:54','2006-02-15 22:22:07'),(15101,563,1,15850,'4.99','2005-08-23 15:45:42','2006-02-15 22:22:07'),(15102,564,2,195,'5.99','2005-05-26 06:52:36','2006-02-15 22:22:07'),(15103,564,1,985,'2.99','2005-05-30 22:18:35','2006-02-15 22:22:07'),(15104,564,2,1705,'2.99','2005-06-16 13:59:42','2006-02-15 22:22:07'),(15105,564,1,4196,'2.99','2005-07-07 11:06:33','2006-02-15 22:22:08'),(15106,564,2,4385,'0.99','2005-07-07 20:48:38','2006-02-15 22:22:08'),(15107,564,1,6973,'2.99','2005-07-27 00:32:04','2006-02-15 22:22:08'),(15108,564,2,7470,'10.99','2005-07-27 19:01:03','2006-02-15 22:22:08'),(15109,564,2,8426,'4.99','2005-07-29 07:07:48','2006-02-15 22:22:08'),(15110,564,1,8874,'0.99','2005-07-30 00:14:45','2006-02-15 22:22:08'),(15111,564,2,9063,'3.99','2005-07-30 07:24:34','2006-02-15 22:22:08'),(15112,564,2,9929,'2.99','2005-07-31 15:17:24','2006-02-15 22:22:08'),(15113,564,1,10129,'6.99','2005-07-31 21:41:35','2006-02-15 22:22:08'),(15114,564,2,10352,'1.99','2005-08-01 05:44:36','2006-02-15 22:22:08'),(15115,564,2,10401,'4.99','2005-08-01 07:27:09','2006-02-15 22:22:08'),(15116,564,1,10528,'2.99','2005-08-01 11:56:22','2006-02-15 22:22:08'),(15117,564,2,11768,'2.99','2005-08-17 10:02:29','2006-02-15 22:22:08'),(15118,564,2,12197,'6.99','2005-08-18 02:08:58','2006-02-15 22:22:08'),(15119,564,2,12617,'2.99','2005-08-18 17:22:48','2006-02-15 22:22:09'),(15120,564,2,13324,'0.99','2005-08-19 19:51:00','2006-02-15 22:22:09'),(15121,564,2,13558,'0.99','2005-08-20 04:13:17','2006-02-15 22:22:09'),(15122,564,1,13701,'0.99','2005-08-20 09:27:05','2006-02-15 22:22:09'),(15123,564,2,14439,'5.99','2005-08-21 11:52:41','2006-02-15 22:22:09'),(15124,564,1,14593,'0.99','2005-08-21 17:33:18','2006-02-15 22:22:09'),(15125,564,2,15059,'8.99','2005-08-22 10:22:00','2006-02-15 22:22:09'),(15126,565,1,458,'6.99','2005-05-27 19:58:36','2006-02-15 22:22:09'),(15127,565,1,1004,'0.99','2005-05-31 00:48:36','2006-02-15 22:22:09'),(15128,565,2,1460,'4.99','2005-06-15 20:27:02','2006-02-15 22:22:09'),(15129,565,1,2321,'5.99','2005-06-18 09:42:42','2006-02-15 22:22:09'),(15130,565,1,3300,'5.99','2005-06-21 07:25:01','2006-02-15 22:22:09'),(15131,565,2,3470,'0.99','2005-07-05 22:49:24','2006-02-15 22:22:09'),(15132,565,1,3838,'2.99','2005-07-06 16:29:43','2006-02-15 22:22:09'),(15133,565,1,4413,'2.99','2005-07-07 22:00:04','2006-02-15 22:22:09'),(15134,565,2,5020,'0.99','2005-07-09 02:07:56','2006-02-15 22:22:10'),(15135,565,1,5124,'4.99','2005-07-09 07:25:19','2006-02-15 22:22:10'),(15136,565,1,6264,'2.99','2005-07-11 15:42:35','2006-02-15 22:22:10'),(15137,565,1,6627,'2.99','2005-07-12 09:16:46','2006-02-15 22:22:10'),(15138,565,1,6699,'0.99','2005-07-12 12:45:21','2006-02-15 22:22:10'),(15139,565,2,7242,'5.99','2005-07-27 10:25:51','2006-02-15 22:22:10'),(15140,565,1,9628,'2.99','2005-07-31 04:51:11','2006-02-15 22:22:10'),(15141,565,1,10025,'5.99','2005-07-31 18:29:09','2006-02-15 22:22:10'),(15142,565,2,10776,'10.99','2005-08-01 20:59:58','2006-02-15 22:22:10'),(15143,565,2,10913,'3.99','2005-08-02 02:04:03','2006-02-15 22:22:10'),(15144,565,2,11189,'6.99','2005-08-02 11:17:23','2006-02-15 22:22:10'),(15145,565,1,11399,'3.99','2005-08-02 18:56:28','2006-02-15 22:22:10'),(15146,565,2,11506,'4.99','2005-08-16 23:25:48','2006-02-15 22:22:10'),(15147,565,1,11588,'3.99','2005-08-17 02:26:23','2006-02-15 22:22:10'),(15148,565,1,11795,'2.99','2005-08-17 11:13:38','2006-02-15 22:22:10'),(15149,565,2,12743,'5.99','2005-08-18 22:22:31','2006-02-15 22:22:11'),(15150,565,2,13195,'4.99','2005-08-19 14:39:14','2006-02-15 22:22:11'),(15151,565,2,13217,'4.99','2005-08-19 15:38:39','2006-02-15 22:22:11'),(15152,565,1,13362,'0.99','2005-08-19 21:07:54','2006-02-15 22:22:11'),(15153,565,1,13925,'8.99','2005-08-20 17:05:34','2006-02-15 22:22:11'),(15154,565,1,15885,'2.99','2005-08-23 16:50:43','2006-02-15 22:22:11'),(15155,566,2,234,'5.99','2005-05-26 11:47:20','2006-02-15 22:22:11'),(15156,566,2,768,'4.99','2005-05-29 12:30:46','2006-02-15 22:22:11'),(15157,566,1,1635,'5.99','2005-06-16 08:26:56','2006-02-15 22:22:11'),(15158,566,2,1982,'4.99','2005-06-17 10:12:15','2006-02-15 22:22:11'),(15159,566,1,2367,'0.99','2005-06-18 14:00:31','2006-02-15 22:22:11'),(15160,566,1,3379,'4.99','2005-06-21 13:54:58','2006-02-15 22:22:11'),(15161,566,2,3663,'4.99','2005-07-06 08:15:47','2006-02-15 22:22:11'),(15162,566,1,3943,'0.99','2005-07-06 21:22:17','2006-02-15 22:22:11'),(15163,566,1,3998,'3.99','2005-07-06 23:49:20','2006-02-15 22:22:12'),(15164,566,1,5079,'9.99','2005-07-09 05:20:40','2006-02-15 22:22:12'),(15165,566,2,6365,'2.99','2005-07-11 21:17:40','2006-02-15 22:22:12'),(15166,566,1,7677,'2.99','2005-07-28 02:56:37','2006-02-15 22:22:12'),(15167,566,2,7941,'0.99','2005-07-28 12:47:20','2006-02-15 22:22:12'),(15168,566,2,8118,'2.99','2005-07-28 19:22:22','2006-02-15 22:22:12'),(15169,566,1,8157,'6.99','2005-07-28 21:06:45','2006-02-15 22:22:12'),(15170,566,1,8257,'2.99','2005-07-29 01:03:20','2006-02-15 22:22:12'),(15171,566,2,8305,'1.99','2005-07-29 03:08:47','2006-02-15 22:22:12'),(15172,566,2,8660,'6.99','2005-07-29 15:26:59','2006-02-15 22:22:12'),(15173,566,1,8710,'0.99','2005-07-29 17:26:03','2006-02-15 22:22:12'),(15174,566,1,8797,'4.99','2005-07-29 21:10:37','2006-02-15 22:22:12'),(15175,566,2,9101,'4.99','2005-07-30 08:47:13','2006-02-15 22:22:12'),(15176,566,2,9470,'4.99','2005-07-30 23:01:31','2006-02-15 22:22:12'),(15177,566,1,9688,'3.99','2005-07-31 06:56:08','2006-02-15 22:22:12'),(15178,566,2,9915,'2.99','2005-07-31 14:52:26','2006-02-15 22:22:13'),(15179,566,2,10259,'2.99','2005-08-01 02:52:05','2006-02-15 22:22:13'),(15180,566,2,10289,'6.99','2005-08-01 03:39:48','2006-02-15 22:22:13'),(15181,566,2,11129,'2.99','2005-08-02 09:08:44','2006-02-15 22:22:13'),(15182,566,1,11717,'0.99','2005-08-17 07:44:09','2006-02-15 22:22:13'),(15183,566,1,11941,'1.99','2005-08-17 16:56:57','2006-02-15 22:22:13'),(15184,566,2,12382,'8.99','2005-08-18 08:32:33','2006-02-15 22:22:13'),(15185,566,2,12995,'4.99','2005-08-19 07:26:30','2006-02-15 22:22:13'),(15186,566,2,13762,'4.99','2005-08-20 11:29:32','2006-02-15 22:22:13'),(15187,566,1,14277,'3.99','2005-08-21 06:34:41','2006-02-15 22:22:13'),(15188,566,1,14297,'2.99','2005-08-21 07:13:46','2006-02-15 22:22:13'),(15189,567,2,2689,'4.99','2005-06-19 12:58:53','2006-02-15 22:22:13'),(15190,567,1,3010,'2.99','2005-06-20 10:29:59','2006-02-15 22:22:13'),(15191,567,1,3769,'5.99','2005-07-06 13:11:33','2006-02-15 22:22:13'),(15192,567,2,4457,'0.99','2005-07-07 23:45:38','2006-02-15 22:22:14'),(15193,567,2,4576,'0.99','2005-07-08 05:51:19','2006-02-15 22:22:14'),(15194,567,1,4949,'4.99','2005-07-08 22:57:10','2006-02-15 22:22:14'),(15195,567,2,6358,'2.99','2005-07-11 21:03:12','2006-02-15 22:22:14'),(15196,567,2,6551,'0.99','2005-07-12 05:03:43','2006-02-15 22:22:14'),(15197,567,2,7340,'2.99','2005-07-27 14:18:10','2006-02-15 22:22:14'),(15198,567,1,8201,'2.99','2005-07-28 23:10:48','2006-02-15 22:22:14'),(15199,567,1,8629,'2.99','2005-07-29 14:06:35','2006-02-15 22:22:14'),(15200,567,1,9279,'7.99','2005-07-30 15:15:21','2006-02-15 22:22:14'),(15201,567,1,9475,'6.99','2005-07-30 23:06:33','2006-02-15 22:22:14'),(15202,567,2,10708,'7.99','2005-08-01 18:43:28','2006-02-15 22:22:14'),(15203,567,2,11749,'2.99','2005-08-17 09:04:03','2006-02-15 22:22:14'),(15204,567,1,12119,'2.99','2005-08-17 23:16:44','2006-02-15 22:22:14'),(15205,567,2,13031,'2.99','2005-08-19 08:30:04','2006-02-15 22:22:14'),(15206,567,2,14839,'2.99','2005-08-22 01:58:15','2006-02-15 22:22:14'),(15207,567,2,15074,'5.99','2005-08-22 11:02:52','2006-02-15 22:22:15'),(15208,567,2,15594,'10.99','2005-08-23 06:18:43','2006-02-15 22:22:15'),(15209,568,2,1658,'4.99','2005-06-16 10:07:10','2006-02-15 22:22:15'),(15210,568,2,2382,'4.99','2005-06-18 15:03:52','2006-02-15 22:22:15'),(15211,568,2,2668,'0.99','2005-06-19 11:28:47','2006-02-15 22:22:15'),(15212,568,1,3227,'4.99','2005-06-21 02:18:25','2006-02-15 22:22:15'),(15213,568,2,3462,'1.99','2005-06-21 21:52:52','2006-02-15 22:22:15'),(15214,568,1,4322,'2.99','2005-07-07 17:54:37','2006-02-15 22:22:15'),(15215,568,2,5332,'2.99','2005-07-09 16:59:23','2006-02-15 22:22:15'),(15216,568,1,5622,'0.99','2005-07-10 05:39:37','2006-02-15 22:22:15'),(15217,568,1,5776,'4.99','2005-07-10 13:35:22','2006-02-15 22:22:15'),(15218,568,2,7068,'2.99','2005-07-27 03:57:50','2006-02-15 22:22:15'),(15219,568,2,8185,'0.99','2005-07-28 22:23:49','2006-02-15 22:22:15'),(15220,568,2,9583,'6.99','2005-07-31 03:05:21','2006-02-15 22:22:15'),(15221,568,1,9738,'0.99','2005-07-31 09:04:14','2006-02-15 22:22:16'),(15222,568,1,10340,'2.99','2005-08-01 05:07:03','2006-02-15 22:22:16'),(15223,568,2,10689,'0.99','2005-08-01 18:04:18','2006-02-15 22:22:16'),(15224,568,2,10869,'0.99','2005-08-02 00:26:54','2006-02-15 22:22:16'),(15225,568,1,11331,'2.99','2005-08-02 16:49:01','2006-02-15 22:22:16'),(15226,568,1,13883,'4.99','2005-08-20 15:28:53','2006-02-15 22:22:16'),(15227,568,2,15069,'5.99','2005-08-22 10:55:42','2006-02-15 22:22:16'),(15228,568,1,15203,'2.99','2005-08-22 16:28:00','2006-02-15 22:22:16'),(15229,568,2,14531,'2.99','2006-02-14 15:16:03','2006-02-15 22:22:16'),(15230,569,2,53,'4.99','2005-05-25 07:19:16','2006-02-15 22:22:16'),(15231,569,1,487,'4.99','2005-05-28 00:00:30','2006-02-15 22:22:16'),(15232,569,1,624,'4.99','2005-05-28 16:13:22','2006-02-15 22:22:16'),(15233,569,1,647,'1.99','2005-05-28 19:22:52','2006-02-15 22:22:16'),(15234,569,2,1037,'3.99','2005-05-31 05:22:25','2006-02-15 22:22:16'),(15235,569,1,1463,'6.99','2005-06-15 20:37:51','2006-02-15 22:22:16'),(15236,569,2,1668,'5.99','2005-06-16 10:19:52','2006-02-15 22:22:17'),(15237,569,1,4204,'5.99','2005-07-07 11:24:18','2006-02-15 22:22:17'),(15238,569,2,5003,'0.99','2005-07-09 01:19:03','2006-02-15 22:22:17'),(15239,569,2,6046,'5.99','2005-07-11 03:21:49','2006-02-15 22:22:17'),(15240,569,1,8910,'2.99','2005-07-30 01:29:48','2006-02-15 22:22:17'),(15241,569,2,9220,'1.99','2005-07-30 13:17:27','2006-02-15 22:22:17'),(15242,569,1,9399,'4.99','2005-07-30 20:14:50','2006-02-15 22:22:17'),(15243,569,2,9960,'1.99','2005-07-31 16:05:52','2006-02-15 22:22:17'),(15244,569,2,10192,'2.99','2005-08-01 00:33:00','2006-02-15 22:22:17'),(15245,569,2,10884,'0.99','2005-08-02 00:47:33','2006-02-15 22:22:17'),(15246,569,1,11030,'1.99','2005-08-02 05:51:20','2006-02-15 22:22:17'),(15247,569,2,11255,'4.99','2005-08-02 13:44:30','2006-02-15 22:22:17'),(15248,569,1,11354,'6.99','2005-08-02 17:35:10','2006-02-15 22:22:17'),(15249,569,1,11946,'4.99','2005-08-17 17:05:53','2006-02-15 22:22:17'),(15250,569,1,12157,'2.99','2005-08-18 00:33:45','2006-02-15 22:22:18'),(15251,569,2,12308,'0.99','2005-08-18 05:48:53','2006-02-15 22:22:18'),(15252,569,1,12568,'3.99','2005-08-18 15:15:44','2006-02-15 22:22:18'),(15253,569,2,12958,'2.99','2005-08-19 06:19:21','2006-02-15 22:22:18'),(15254,569,1,13287,'7.99','2005-08-19 18:28:24','2006-02-15 22:22:18'),(15255,569,2,13554,'9.99','2005-08-20 04:08:39','2006-02-15 22:22:18'),(15256,569,2,14207,'4.99','2005-08-21 04:08:19','2006-02-15 22:22:18'),(15257,569,2,14400,'0.99','2005-08-21 10:33:45','2006-02-15 22:22:18'),(15258,569,1,14896,'8.99','2005-08-22 04:20:55','2006-02-15 22:22:18'),(15259,569,1,14959,'2.99','2005-08-22 06:30:28','2006-02-15 22:22:18'),(15260,569,2,15617,'0.99','2005-08-23 07:07:22','2006-02-15 22:22:18'),(15261,569,2,16025,'4.99','2005-08-23 21:48:54','2006-02-15 22:22:18'),(15262,570,2,1060,'7.99','2005-05-31 08:21:43','2006-02-15 22:22:18'),(15263,570,1,1259,'4.99','2005-06-15 06:37:55','2006-02-15 22:22:18'),(15264,570,2,1417,'4.99','2005-06-15 17:45:51','2006-02-15 22:22:18'),(15265,570,2,1804,'2.99','2005-06-16 20:33:15','2006-02-15 22:22:19'),(15266,570,2,2008,'5.99','2005-06-17 11:48:05','2006-02-15 22:22:19'),(15267,570,2,2031,'6.99','2005-06-17 13:14:03','2006-02-15 22:22:19'),(15268,570,2,2261,'3.99','2005-06-18 05:46:15','2006-02-15 22:22:19'),(15269,570,2,3138,'2.99','2005-06-20 19:43:45','2006-02-15 22:22:19'),(15270,570,2,3984,'0.99','2005-07-06 23:22:36','2006-02-15 22:22:19'),(15271,570,1,4069,'0.99','2005-07-07 04:35:06','2006-02-15 22:22:19'),(15272,570,1,4698,'0.99','2005-07-08 11:19:31','2006-02-15 22:22:19'),(15273,570,2,5638,'4.99','2005-07-10 06:32:49','2006-02-15 22:22:19'),(15274,570,1,6253,'4.99','2005-07-11 15:07:19','2006-02-15 22:22:19'),(15275,570,1,6556,'0.99','2005-07-12 05:10:16','2006-02-15 22:22:19'),(15276,570,2,7174,'4.99','2005-07-27 08:00:36','2006-02-15 22:22:19'),(15277,570,2,8735,'4.99','2005-07-29 18:28:54','2006-02-15 22:22:19'),(15278,570,1,9385,'7.99','2005-07-30 19:25:49','2006-02-15 22:22:19'),(15279,570,1,9398,'0.99','2005-07-30 20:09:00','2006-02-15 22:22:20'),(15280,570,2,9432,'2.99','2005-07-30 21:26:18','2006-02-15 22:22:20'),(15281,570,1,9766,'4.99','2005-07-31 09:46:29','2006-02-15 22:22:20'),(15282,570,1,10004,'0.99','2005-07-31 17:51:23','2006-02-15 22:22:20'),(15283,570,2,10168,'2.99','2005-07-31 23:25:24','2006-02-15 22:22:20'),(15284,570,1,11098,'3.99','2005-08-02 08:06:18','2006-02-15 22:22:20'),(15285,570,2,12042,'4.99','2005-08-17 20:36:37','2006-02-15 22:22:20'),(15286,570,2,14768,'3.99','2005-08-21 23:44:53','2006-02-15 22:22:20'),(15287,570,1,12716,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:20'),(15288,571,1,228,'9.99','2005-05-26 10:54:28','2006-02-15 22:22:20'),(15289,571,2,689,'3.99','2005-05-29 00:46:53','2006-02-15 22:22:20'),(15290,571,1,1254,'4.99','2005-06-15 06:11:16','2006-02-15 22:22:20'),(15291,571,2,1400,'3.99','2005-06-15 16:29:56','2006-02-15 22:22:20'),(15292,571,1,1756,'4.99','2005-06-16 17:22:33','2006-02-15 22:22:20'),(15293,571,2,1990,'4.99','2005-06-17 10:48:44','2006-02-15 22:22:20'),(15294,571,1,2327,'2.99','2005-06-18 10:16:40','2006-02-15 22:22:21'),(15295,571,1,2977,'10.99','2005-06-20 08:15:27','2006-02-15 22:22:21'),(15296,571,2,3616,'2.99','2005-07-06 05:52:13','2006-02-15 22:22:21'),(15297,571,1,4162,'4.99','2005-07-07 09:17:26','2006-02-15 22:22:21'),(15298,571,2,5789,'4.99','2005-07-10 14:11:26','2006-02-15 22:22:21'),(15299,571,2,6676,'8.99','2005-07-12 11:53:40','2006-02-15 22:22:21'),(15300,571,1,6792,'8.99','2005-07-12 16:37:28','2006-02-15 22:22:21'),(15301,571,1,8084,'5.99','2005-07-28 18:11:58','2006-02-15 22:22:21'),(15302,571,1,8638,'4.99','2005-07-29 14:30:23','2006-02-15 22:22:21'),(15303,571,2,9300,'1.99','2005-07-30 16:33:12','2006-02-15 22:22:21'),(15304,571,1,9408,'4.99','2005-07-30 20:32:09','2006-02-15 22:22:21'),(15305,571,1,10227,'2.99','2005-08-01 01:42:22','2006-02-15 22:22:21'),(15306,571,2,11080,'2.99','2005-08-02 07:29:56','2006-02-15 22:22:21'),(15307,571,2,11191,'7.99','2005-08-02 11:24:07','2006-02-15 22:22:21'),(15308,571,1,13228,'2.99','2005-08-19 16:08:16','2006-02-15 22:22:22'),(15309,571,2,13266,'2.99','2005-08-19 17:31:20','2006-02-15 22:22:22'),(15310,571,1,14956,'0.99','2005-08-22 06:26:16','2006-02-15 22:22:22'),(15311,571,1,15841,'4.99','2005-08-23 15:35:59','2006-02-15 22:22:22'),(15312,572,2,559,'7.99','2005-05-28 08:39:02','2006-02-15 22:22:22'),(15313,572,2,1889,'10.99','2005-06-17 04:05:12','2006-02-15 22:22:22'),(15314,572,1,2007,'0.99','2005-06-17 11:47:17','2006-02-15 22:22:22'),(15315,572,1,2458,'0.99','2005-06-18 19:39:05','2006-02-15 22:22:22'),(15316,572,1,4601,'2.99','2005-07-08 06:49:10','2006-02-15 22:22:22'),(15317,572,1,5595,'4.99','2005-07-10 04:33:45','2006-02-15 22:22:22'),(15318,572,1,5713,'6.99','2005-07-10 10:46:15','2006-02-15 22:22:22'),(15319,572,2,6108,'2.99','2005-07-11 07:19:24','2006-02-15 22:22:22'),(15320,572,1,7161,'4.99','2005-07-27 07:26:32','2006-02-15 22:22:22'),(15321,572,1,7345,'4.99','2005-07-27 14:29:53','2006-02-15 22:22:22'),(15322,572,2,7713,'6.99','2005-07-28 04:32:14','2006-02-15 22:22:23'),(15323,572,2,8342,'0.99','2005-07-29 04:45:05','2006-02-15 22:22:23'),(15324,572,1,8432,'0.99','2005-07-29 07:13:33','2006-02-15 22:22:23'),(15325,572,1,9081,'3.99','2005-07-30 08:09:58','2006-02-15 22:22:23'),(15326,572,2,9950,'5.99','2005-07-31 15:50:22','2006-02-15 22:22:23'),(15327,572,2,10204,'4.99','2005-08-01 00:47:39','2006-02-15 22:22:23'),(15328,572,1,11114,'0.99','2005-08-02 08:26:45','2006-02-15 22:22:23'),(15329,572,1,11121,'4.99','2005-08-02 08:48:31','2006-02-15 22:22:23'),(15330,572,2,11415,'2.99','2005-08-02 19:43:38','2006-02-15 22:22:23'),(15331,572,1,11426,'4.99','2005-08-02 20:00:09','2006-02-15 22:22:23'),(15332,572,1,11526,'4.99','2005-08-17 00:17:38','2006-02-15 22:22:23'),(15333,572,1,12256,'1.99','2005-08-18 04:09:39','2006-02-15 22:22:23'),(15334,572,2,13377,'1.99','2005-08-19 21:32:23','2006-02-15 22:22:23'),(15335,572,2,13523,'6.99','2005-08-20 02:47:03','2006-02-15 22:22:23'),(15336,572,1,13688,'5.99','2005-08-20 08:59:38','2006-02-15 22:22:23'),(15337,573,2,827,'2.99','2005-05-29 21:58:43','2006-02-15 22:22:24'),(15338,573,1,1613,'4.99','2005-06-16 06:55:10','2006-02-15 22:22:24'),(15339,573,2,2622,'5.99','2005-06-19 08:10:41','2006-02-15 22:22:24'),(15340,573,1,2995,'1.99','2005-06-20 09:18:22','2006-02-15 22:22:24'),(15341,573,1,3295,'7.99','2005-06-21 07:04:17','2006-02-15 22:22:24'),(15342,573,2,3768,'0.99','2005-07-06 13:07:30','2006-02-15 22:22:24'),(15343,573,1,3930,'2.99','2005-07-06 20:54:07','2006-02-15 22:22:24'),(15344,573,2,4023,'4.99','2005-07-07 01:55:25','2006-02-15 22:22:24'),(15345,573,1,4085,'0.99','2005-07-07 05:25:39','2006-02-15 22:22:24'),(15346,573,1,4609,'0.99','2005-07-08 07:22:29','2006-02-15 22:22:24'),(15347,573,1,4770,'2.99','2005-07-08 15:29:46','2006-02-15 22:22:24'),(15348,573,1,5036,'5.99','2005-07-09 02:58:41','2006-02-15 22:22:24'),(15349,573,2,5522,'9.99','2005-07-10 01:46:29','2006-02-15 22:22:24'),(15350,573,2,5903,'2.99','2005-07-10 20:39:04','2006-02-15 22:22:24'),(15351,573,1,6693,'7.99','2005-07-12 12:37:00','2006-02-15 22:22:25'),(15352,573,1,8400,'4.99','2005-07-29 06:23:56','2006-02-15 22:22:25'),(15353,573,2,9837,'10.99','2005-07-31 12:14:19','2006-02-15 22:22:25'),(15354,573,2,9846,'4.99','2005-07-31 12:30:12','2006-02-15 22:22:25'),(15355,573,2,9963,'2.99','2005-07-31 16:16:46','2006-02-15 22:22:25'),(15356,573,2,9971,'5.99','2005-07-31 16:42:16','2006-02-15 22:22:25'),(15357,573,1,10296,'0.99','2005-08-01 04:04:37','2006-02-15 22:22:25'),(15358,573,1,10887,'2.99','2005-08-02 00:52:35','2006-02-15 22:22:25'),(15359,573,1,11043,'0.99','2005-08-02 06:04:44','2006-02-15 22:22:25'),(15360,573,2,11912,'5.99','2005-08-17 15:51:49','2006-02-15 22:22:25'),(15361,573,1,12017,'1.99','2005-08-17 19:33:49','2006-02-15 22:22:25'),(15362,573,1,12125,'1.99','2005-08-17 23:24:25','2006-02-15 22:22:25'),(15363,573,1,12269,'6.99','2005-08-18 04:27:54','2006-02-15 22:22:25'),(15364,573,1,12791,'0.99','2005-08-19 00:17:09','2006-02-15 22:22:25'),(15365,573,2,13113,'2.99','2005-08-19 11:27:20','2006-02-15 22:22:25'),(15366,574,2,433,'0.99','2005-05-27 16:40:40','2006-02-15 22:22:26'),(15367,574,1,1559,'0.99','2005-06-16 02:35:03','2006-02-15 22:22:26'),(15368,574,2,1636,'5.99','2005-06-16 08:28:54','2006-02-15 22:22:26'),(15369,574,1,1817,'0.99','2005-06-16 21:20:52','2006-02-15 22:22:26'),(15370,574,1,2632,'0.99','2005-06-19 08:51:47','2006-02-15 22:22:26'),(15371,574,1,3220,'6.99','2005-06-21 01:46:25','2006-02-15 22:22:26'),(15372,574,1,3583,'7.99','2005-07-06 04:10:43','2006-02-15 22:22:26'),(15373,574,1,4004,'4.99','2005-07-07 00:20:51','2006-02-15 22:22:26'),(15374,574,1,4212,'4.99','2005-07-07 11:53:14','2006-02-15 22:22:26'),(15375,574,2,4890,'2.99','2005-07-08 20:05:38','2006-02-15 22:22:26'),(15376,574,2,5010,'4.99','2005-07-09 01:33:23','2006-02-15 22:22:26'),(15377,574,1,5076,'3.99','2005-07-09 05:13:22','2006-02-15 22:22:26'),(15378,574,1,5077,'3.99','2005-07-09 05:18:01','2006-02-15 22:22:26'),(15379,574,1,5640,'2.99','2005-07-10 06:38:00','2006-02-15 22:22:26'),(15380,574,1,6523,'2.99','2005-07-12 04:14:19','2006-02-15 22:22:27'),(15381,574,1,7093,'1.99','2005-07-27 04:47:00','2006-02-15 22:22:27'),(15382,574,1,7134,'2.99','2005-07-27 06:33:06','2006-02-15 22:22:27'),(15383,574,1,7964,'2.99','2005-07-28 13:49:58','2006-02-15 22:22:27'),(15384,574,1,8303,'4.99','2005-07-29 03:05:56','2006-02-15 22:22:27'),(15385,574,1,9589,'7.99','2005-07-31 03:13:29','2006-02-15 22:22:27'),(15386,574,1,9759,'3.99','2005-07-31 09:25:57','2006-02-15 22:22:27'),(15387,574,1,10347,'4.99','2005-08-01 05:20:03','2006-02-15 22:22:27'),(15388,574,2,11775,'3.99','2005-08-17 10:25:53','2006-02-15 22:22:27'),(15389,574,1,12462,'2.99','2005-08-18 11:28:55','2006-02-15 22:22:27'),(15390,574,1,13589,'4.99','2005-08-20 05:47:25','2006-02-15 22:22:27'),(15391,574,1,14076,'4.99','2005-08-20 23:20:10','2006-02-15 22:22:27'),(15392,574,2,14941,'2.99','2005-08-22 05:58:23','2006-02-15 22:22:27'),(15393,574,2,15214,'2.99','2005-08-22 16:53:29','2006-02-15 22:22:27'),(15394,575,1,17,'2.99','2005-05-25 01:06:36','2006-02-15 22:22:27'),(15395,575,1,395,'0.99','2005-05-27 11:45:49','2006-02-15 22:22:28'),(15396,575,2,454,'4.99','2005-05-27 19:31:36','2006-02-15 22:22:28'),(15397,575,2,769,'2.99','2005-05-29 12:51:44','2006-02-15 22:22:28'),(15398,575,1,774,'4.99','2005-05-29 13:19:43','2006-02-15 22:22:28'),(15399,575,2,1494,'2.99','2005-06-15 21:54:20','2006-02-15 22:22:28'),(15400,575,1,1824,'2.99','2005-06-16 21:51:04','2006-02-15 22:22:28'),(15401,575,2,1866,'4.99','2005-06-17 01:53:19','2006-02-15 22:22:28'),(15402,575,1,3558,'6.99','2005-07-06 02:49:06','2006-02-15 22:22:28'),(15403,575,2,5875,'8.99','2005-07-10 19:06:47','2006-02-15 22:22:28'),(15404,575,2,6907,'2.99','2005-07-12 22:03:49','2006-02-15 22:22:28'),(15405,575,1,7083,'0.99','2005-07-27 04:28:39','2006-02-15 22:22:28'),(15406,575,1,7139,'2.99','2005-07-27 06:52:21','2006-02-15 22:22:28'),(15407,575,2,8711,'2.99','2005-07-29 17:27:15','2006-02-15 22:22:28'),(15408,575,2,8904,'0.99','2005-07-30 01:08:33','2006-02-15 22:22:28'),(15409,575,2,8989,'4.99','2005-07-30 04:39:19','2006-02-15 22:22:29'),(15410,575,1,9733,'4.99','2005-07-31 08:57:35','2006-02-15 22:22:29'),(15411,575,1,10331,'4.99','2005-08-01 04:57:14','2006-02-15 22:22:29'),(15412,575,2,10629,'7.99','2005-08-01 15:33:32','2006-02-15 22:22:29'),(15413,575,1,11097,'3.99','2005-08-02 08:05:46','2006-02-15 22:22:29'),(15414,575,1,11458,'4.99','2005-08-02 21:24:02','2006-02-15 22:22:29'),(15415,575,1,12204,'7.99','2005-08-18 02:20:35','2006-02-15 22:22:29'),(15416,575,2,12289,'8.99','2005-08-18 05:05:28','2006-02-15 22:22:29'),(15417,575,2,12770,'5.99','2005-08-18 23:29:00','2006-02-15 22:22:29'),(15418,575,2,13408,'4.99','2005-08-19 22:34:51','2006-02-15 22:22:29'),(15419,575,2,13465,'2.99','2005-08-20 00:54:14','2006-02-15 22:22:29'),(15420,575,2,14952,'2.99','2005-08-22 06:20:07','2006-02-15 22:22:29'),(15421,575,2,15749,'4.99','2005-08-23 12:33:41','2006-02-15 22:22:29'),(15422,575,2,15857,'0.99','2005-08-23 15:59:51','2006-02-15 22:22:29'),(15423,576,2,755,'2.99','2005-05-29 10:26:29','2006-02-15 22:22:30'),(15424,576,1,968,'0.99','2005-05-30 19:20:03','2006-02-15 22:22:30'),(15425,576,1,1366,'4.99','2005-06-15 14:21:00','2006-02-15 22:22:30'),(15426,576,2,1742,'2.99','2005-06-16 16:37:48','2006-02-15 22:22:30'),(15427,576,1,2309,'0.99','2005-06-18 08:43:24','2006-02-15 22:22:30'),(15428,576,2,2444,'8.99','2005-06-18 18:58:12','2006-02-15 22:22:30'),(15429,576,1,2651,'3.99','2005-06-19 10:22:56','2006-02-15 22:22:30'),(15430,576,2,2799,'4.99','2005-06-19 19:15:21','2006-02-15 22:22:30'),(15431,576,2,3226,'6.99','2005-06-21 02:18:14','2006-02-15 22:22:30'),(15432,576,1,3877,'4.99','2005-07-06 18:22:10','2006-02-15 22:22:30'),(15433,576,2,3889,'0.99','2005-07-06 18:56:25','2006-02-15 22:22:30'),(15434,576,2,3934,'4.99','2005-07-06 21:07:23','2006-02-15 22:22:30'),(15435,576,1,4514,'4.99','2005-07-08 02:41:25','2006-02-15 22:22:30'),(15436,576,2,5597,'3.99','2005-07-10 04:47:57','2006-02-15 22:22:30'),(15437,576,1,5934,'4.99','2005-07-10 22:07:59','2006-02-15 22:22:30'),(15438,576,2,7319,'1.99','2005-07-27 13:31:25','2006-02-15 22:22:31'),(15439,576,1,7605,'3.99','2005-07-27 23:57:01','2006-02-15 22:22:31'),(15440,576,1,8907,'4.99','2005-07-30 01:25:03','2006-02-15 22:22:31'),(15441,576,1,9133,'5.99','2005-07-30 09:59:00','2006-02-15 22:22:31'),(15442,576,2,9548,'5.99','2005-07-31 01:54:19','2006-02-15 22:22:31'),(15443,576,2,9620,'8.99','2005-07-31 04:19:18','2006-02-15 22:22:31'),(15444,576,2,9962,'0.99','2005-07-31 16:10:36','2006-02-15 22:22:31'),(15445,576,1,9979,'2.99','2005-07-31 17:00:07','2006-02-15 22:22:31'),(15446,576,1,10000,'2.99','2005-07-31 17:41:05','2006-02-15 22:22:31'),(15447,576,2,10724,'3.99','2005-08-01 19:10:59','2006-02-15 22:22:31'),(15448,576,2,12112,'5.99','2005-08-17 23:00:31','2006-02-15 22:22:31'),(15449,576,1,12245,'4.99','2005-08-18 03:46:40','2006-02-15 22:22:31'),(15450,576,1,13061,'4.99','2005-08-19 09:43:39','2006-02-15 22:22:31'),(15451,576,1,13326,'4.99','2005-08-19 19:52:52','2006-02-15 22:22:31'),(15452,576,1,14501,'4.99','2005-08-21 14:14:38','2006-02-15 22:22:32'),(15453,576,1,14541,'0.99','2005-08-21 15:34:32','2006-02-15 22:22:32'),(15454,576,1,15634,'0.99','2005-08-23 07:34:18','2006-02-15 22:22:32'),(15455,576,2,11942,'5.98','2006-02-14 15:16:03','2006-02-15 22:22:32'),(15456,576,1,13464,'0.00','2006-02-14 15:16:03','2006-02-15 22:22:32'),(15457,577,2,291,'5.99','2005-05-26 20:20:47','2006-02-15 22:22:32'),(15458,577,2,NULL,'0.99','2005-05-27 00:46:39','2006-02-15 22:22:32'),(15459,577,2,2399,'3.99','2005-06-18 16:06:14','2006-02-15 22:22:32'),(15460,577,2,3286,'2.99','2005-06-21 06:31:29','2006-02-15 22:22:32'),(15461,577,2,3401,'6.99','2005-06-21 15:52:43','2006-02-15 22:22:32'),(15462,577,2,3599,'0.99','2005-07-06 05:16:36','2006-02-15 22:22:32'),(15463,577,1,3785,'7.99','2005-07-06 14:00:13','2006-02-15 22:22:32'),(15464,577,1,4922,'2.99','2005-07-08 21:44:00','2006-02-15 22:22:32'),(15465,577,1,6500,'2.99','2005-07-12 03:11:23','2006-02-15 22:22:32'),(15466,577,2,6534,'2.99','2005-07-12 04:39:43','2006-02-15 22:22:33'),(15467,577,2,7197,'0.99','2005-07-27 08:49:32','2006-02-15 22:22:33'),(15468,577,1,7371,'4.99','2005-07-27 15:18:42','2006-02-15 22:22:33'),(15469,577,2,7876,'8.99','2005-07-28 10:24:22','2006-02-15 22:22:33'),(15470,577,1,8043,'5.99','2005-07-28 16:45:44','2006-02-15 22:22:33'),(15471,577,1,8060,'6.99','2005-07-28 17:10:02','2006-02-15 22:22:33'),(15472,577,2,8671,'6.99','2005-07-29 15:49:37','2006-02-15 22:22:33'),(15473,577,2,10323,'4.99','2005-08-01 04:44:58','2006-02-15 22:22:33'),(15474,577,1,10487,'0.99','2005-08-01 10:26:34','2006-02-15 22:22:33'),(15475,577,1,10782,'4.99','2005-08-01 21:23:25','2006-02-15 22:22:33'),(15476,577,1,11054,'7.99','2005-08-02 06:33:07','2006-02-15 22:22:33'),(15477,577,2,11464,'0.99','2005-08-02 21:42:07','2006-02-15 22:22:33'),(15478,577,1,12664,'4.99','2005-08-18 19:10:54','2006-02-15 22:22:33'),(15479,577,2,12671,'0.99','2005-08-18 19:19:59','2006-02-15 22:22:33'),(15480,577,2,13200,'3.99','2005-08-19 14:55:58','2006-02-15 22:22:33'),(15481,577,2,13500,'3.99','2005-08-20 01:54:39','2006-02-15 22:22:34'),(15482,577,2,15480,'2.99','2005-08-23 01:57:20','2006-02-15 22:22:34'),(15483,577,2,15873,'2.99','2005-08-23 16:27:59','2006-02-15 22:22:34'),(15484,577,2,16003,'4.99','2005-08-23 20:47:28','2006-02-15 22:22:34'),(15485,578,2,660,'0.99','2005-05-28 20:53:31','2006-02-15 22:22:34'),(15486,578,2,1826,'6.99','2005-06-16 21:53:52','2006-02-15 22:22:34'),(15487,578,2,2615,'4.99','2005-06-19 07:29:13','2006-02-15 22:22:34'),(15488,578,1,3305,'2.99','2005-06-21 07:46:57','2006-02-15 22:22:34'),(15489,578,2,4496,'4.99','2005-07-08 01:44:19','2006-02-15 22:22:34'),(15490,578,1,5377,'4.99','2005-07-09 19:04:30','2006-02-15 22:22:34'),(15491,578,1,5445,'0.99','2005-07-09 21:59:41','2006-02-15 22:22:34'),(15492,578,2,5876,'4.99','2005-07-10 19:07:15','2006-02-15 22:22:34'),(15493,578,1,6784,'4.99','2005-07-12 16:28:49','2006-02-15 22:22:34'),(15494,578,1,6830,'0.99','2005-07-12 18:42:55','2006-02-15 22:22:34'),(15495,578,2,7059,'5.99','2005-07-27 03:51:02','2006-02-15 22:22:35'),(15496,578,1,8179,'2.99','2005-07-28 22:05:13','2006-02-15 22:22:35'),(15497,578,1,8218,'2.99','2005-07-28 23:45:41','2006-02-15 22:22:35'),(15498,578,2,9970,'4.99','2005-07-31 16:38:24','2006-02-15 22:22:35'),(15499,578,1,10029,'6.99','2005-07-31 18:37:47','2006-02-15 22:22:35'),(15500,578,2,10182,'2.99','2005-08-01 00:08:01','2006-02-15 22:22:35'),(15501,578,1,10779,'7.99','2005-08-01 21:11:54','2006-02-15 22:22:35'),(15502,578,1,11199,'7.99','2005-08-02 11:47:40','2006-02-15 22:22:35'),(15503,578,2,13071,'5.99','2005-08-19 10:01:07','2006-02-15 22:22:35'),(15504,578,2,13498,'5.99','2005-08-20 01:51:23','2006-02-15 22:22:35'),(15505,578,2,13552,'2.99','2005-08-20 04:03:51','2006-02-15 22:22:35'),(15506,578,1,15652,'0.99','2005-08-23 08:34:10','2006-02-15 22:22:35'),(15507,579,2,2425,'5.99','2005-06-18 17:37:45','2006-02-15 22:22:35'),(15508,579,1,2522,'3.99','2005-06-19 00:43:42','2006-02-15 22:22:35'),(15509,579,1,3111,'2.99','2005-06-20 17:46:47','2006-02-15 22:22:36'),(15510,579,1,4619,'9.99','2005-07-08 08:01:09','2006-02-15 22:22:36'),(15511,579,1,4933,'2.99','2005-07-08 22:18:29','2006-02-15 22:22:36'),(15512,579,1,6304,'4.99','2005-07-11 18:02:16','2006-02-15 22:22:36'),(15513,579,2,6814,'1.99','2005-07-12 18:11:58','2006-02-15 22:22:36'),(15514,579,2,6824,'6.99','2005-07-12 18:26:46','2006-02-15 22:22:36'),(15515,579,2,6969,'8.99','2005-07-27 00:23:54','2006-02-15 22:22:36'),(15516,579,2,7221,'2.99','2005-07-27 09:37:35','2006-02-15 22:22:36'),(15517,579,1,8354,'0.99','2005-07-29 04:56:26','2006-02-15 22:22:36'),(15518,579,1,8876,'0.99','2005-07-30 00:15:09','2006-02-15 22:22:36'),(15519,579,1,8996,'0.99','2005-07-30 04:53:23','2006-02-15 22:22:36'),(15520,579,2,9349,'9.99','2005-07-30 18:20:08','2006-02-15 22:22:36'),(15521,579,2,9553,'5.99','2005-07-31 02:06:34','2006-02-15 22:22:36'),(15522,579,2,9976,'2.99','2005-07-31 16:57:49','2006-02-15 22:22:36'),(15523,579,2,9997,'4.99','2005-07-31 17:37:30','2006-02-15 22:22:37'),(15524,579,1,11494,'3.99','2005-08-02 22:51:23','2006-02-15 22:22:37'),(15525,579,2,12051,'6.99','2005-08-17 20:56:15','2006-02-15 22:22:37'),(15526,579,2,12315,'5.99','2005-08-18 06:15:06','2006-02-15 22:22:37'),(15527,579,2,14047,'2.99','2005-08-20 22:00:43','2006-02-15 22:22:37'),(15528,579,1,14185,'0.99','2005-08-21 03:28:37','2006-02-15 22:22:37'),(15529,579,1,14543,'1.99','2005-08-21 15:39:01','2006-02-15 22:22:37'),(15530,579,2,14560,'2.99','2005-08-21 16:13:47','2006-02-15 22:22:37'),(15531,579,2,15601,'0.99','2005-08-23 06:33:26','2006-02-15 22:22:37'),(15532,579,1,15838,'4.99','2005-08-23 15:30:48','2006-02-15 22:22:37'),(15533,579,2,15794,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:37'),(15534,580,1,611,'0.99','2005-05-28 15:18:18','2006-02-15 22:22:37'),(15535,580,1,1469,'0.99','2005-06-15 20:52:36','2006-02-15 22:22:37'),(15536,580,2,3571,'1.99','2005-07-06 03:32:31','2006-02-15 22:22:37'),(15537,580,2,3867,'1.99','2005-07-06 17:52:19','2006-02-15 22:22:38'),(15538,580,2,4169,'1.99','2005-07-07 09:39:18','2006-02-15 22:22:38'),(15539,580,2,4590,'3.99','2005-07-08 06:27:48','2006-02-15 22:22:38'),(15540,580,1,5937,'6.99','2005-07-10 22:16:08','2006-02-15 22:22:38'),(15541,580,1,6089,'2.99','2005-07-11 05:45:59','2006-02-15 22:22:38'),(15542,580,2,6170,'2.99','2005-07-11 10:29:21','2006-02-15 22:22:38'),(15543,580,1,7620,'0.99','2005-07-28 00:27:17','2006-02-15 22:22:38'),(15544,580,2,8784,'4.99','2005-07-29 20:35:37','2006-02-15 22:22:38'),(15545,580,1,8839,'3.99','2005-07-29 22:52:34','2006-02-15 22:22:38'),(15546,580,1,9199,'0.99','2005-07-30 12:38:00','2006-02-15 22:22:38'),(15547,580,1,9239,'3.99','2005-07-30 13:50:52','2006-02-15 22:22:38'),(15548,580,1,9460,'5.99','2005-07-30 22:25:39','2006-02-15 22:22:38'),(15549,580,2,9604,'4.99','2005-07-31 03:47:12','2006-02-15 22:22:38'),(15550,580,2,9865,'0.99','2005-07-31 13:10:45','2006-02-15 22:22:38'),(15551,580,1,10723,'3.99','2005-08-01 19:10:49','2006-02-15 22:22:38'),(15552,580,2,10965,'3.99','2005-08-02 04:00:19','2006-02-15 22:22:39'),(15553,580,1,11164,'8.99','2005-08-02 10:10:56','2006-02-15 22:22:39'),(15554,580,2,12670,'2.99','2005-08-18 19:17:58','2006-02-15 22:22:39'),(15555,580,2,13313,'2.99','2005-08-19 19:11:41','2006-02-15 22:22:39'),(15556,580,2,13742,'2.99','2005-08-20 10:49:15','2006-02-15 22:22:39'),(15557,580,2,14818,'2.99','2005-08-22 01:17:18','2006-02-15 22:22:39'),(15558,580,1,15157,'6.99','2005-08-22 14:30:09','2006-02-15 22:22:39'),(15559,580,1,15630,'6.99','2005-08-23 07:29:13','2006-02-15 22:22:39'),(15560,580,1,15947,'4.99','2005-08-23 18:54:32','2006-02-15 22:22:39'),(15561,581,1,976,'4.99','2005-05-30 21:11:19','2006-02-15 22:22:39'),(15562,581,1,1151,'4.99','2005-05-31 21:29:00','2006-02-15 22:22:39'),(15563,581,2,1958,'3.99','2005-06-17 08:52:01','2006-02-15 22:22:39'),(15564,581,2,2101,'2.99','2005-06-17 18:57:02','2006-02-15 22:22:39'),(15565,581,1,2137,'4.99','2005-06-17 21:18:28','2006-02-15 22:22:39'),(15566,581,2,4210,'2.99','2005-07-07 11:36:20','2006-02-15 22:22:40'),(15567,581,2,4244,'2.99','2005-07-07 13:41:58','2006-02-15 22:22:40'),(15568,581,1,4338,'4.99','2005-07-07 18:39:56','2006-02-15 22:22:40'),(15569,581,2,4613,'0.99','2005-07-08 07:44:49','2006-02-15 22:22:40'),(15570,581,1,4669,'5.99','2005-07-08 10:13:08','2006-02-15 22:22:40'),(15571,581,1,4815,'8.99','2005-07-08 17:12:51','2006-02-15 22:22:40'),(15572,581,1,4833,'1.99','2005-07-08 18:07:35','2006-02-15 22:22:40'),(15573,581,1,5516,'4.99','2005-07-10 01:13:52','2006-02-15 22:22:40'),(15574,581,1,5707,'4.99','2005-07-10 10:26:14','2006-02-15 22:22:40'),(15575,581,2,5812,'2.99','2005-07-10 15:27:56','2006-02-15 22:22:40'),(15576,581,2,7048,'7.99','2005-07-27 03:31:48','2006-02-15 22:22:40'),(15577,581,1,7783,'2.99','2005-07-28 07:14:43','2006-02-15 22:22:40'),(15578,581,1,9278,'2.99','2005-07-30 15:15:19','2006-02-15 22:22:40'),(15579,581,1,9449,'1.99','2005-07-30 22:02:34','2006-02-15 22:22:40'),(15580,581,2,11443,'2.99','2005-08-02 20:29:30','2006-02-15 22:22:41'),(15581,581,2,11707,'2.99','2005-08-17 07:24:59','2006-02-15 22:22:41'),(15582,581,2,13621,'0.99','2005-08-20 06:43:44','2006-02-15 22:22:41'),(15583,581,2,13712,'2.99','2005-08-20 09:38:04','2006-02-15 22:22:41'),(15584,581,2,14070,'8.99','2005-08-20 22:56:34','2006-02-15 22:22:41'),(15585,581,1,14976,'2.99','2005-08-22 07:10:26','2006-02-15 22:22:41'),(15586,581,1,15403,'0.99','2005-08-22 23:18:10','2006-02-15 22:22:41'),(15587,581,2,15792,'4.99','2005-08-23 14:05:37','2006-02-15 22:22:41'),(15588,582,1,281,'0.99','2005-05-26 18:49:35','2006-02-15 22:22:41'),(15589,582,1,1719,'2.99','2005-06-16 14:55:53','2006-02-15 22:22:41'),(15590,582,1,2337,'7.99','2005-06-18 11:15:27','2006-02-15 22:22:41'),(15591,582,2,3071,'0.99','2005-06-20 14:20:42','2006-02-15 22:22:41'),(15592,582,1,3767,'0.99','2005-07-06 13:07:27','2006-02-15 22:22:41'),(15593,582,2,6629,'5.99','2005-07-12 09:18:35','2006-02-15 22:22:41'),(15594,582,2,7126,'4.99','2005-07-27 06:13:13','2006-02-15 22:22:42'),(15595,582,2,7311,'6.99','2005-07-27 13:02:54','2006-02-15 22:22:42'),(15596,582,2,7412,'5.99','2005-07-27 16:44:34','2006-02-15 22:22:42'),(15597,582,1,7575,'2.99','2005-07-27 22:53:52','2006-02-15 22:22:42'),(15598,582,2,8308,'5.99','2005-07-29 03:22:15','2006-02-15 22:22:42'),(15599,582,1,8554,'2.99','2005-07-29 11:16:29','2006-02-15 22:22:42'),(15600,582,1,8778,'6.99','2005-07-29 20:14:25','2006-02-15 22:22:42'),(15601,582,1,9768,'9.99','2005-07-31 09:48:41','2006-02-15 22:22:42'),(15602,582,2,11290,'7.99','2005-08-02 14:57:44','2006-02-15 22:22:42'),(15603,582,1,11667,'5.99','2005-08-17 05:46:55','2006-02-15 22:22:42'),(15604,582,1,11708,'2.99','2005-08-17 07:26:47','2006-02-15 22:22:42'),(15605,582,2,13815,'5.99','2005-08-20 13:08:53','2006-02-15 22:22:42'),(15606,582,1,14376,'4.99','2005-08-21 09:48:56','2006-02-15 22:22:42'),(15607,582,1,14568,'0.99','2005-08-21 16:30:48','2006-02-15 22:22:42'),(15608,582,1,15090,'5.99','2005-08-22 11:34:33','2006-02-15 22:22:43'),(15609,582,1,15503,'2.99','2005-08-23 02:44:49','2006-02-15 22:22:43'),(15610,582,1,15539,'0.99','2005-08-23 04:09:03','2006-02-15 22:22:43'),(15611,582,2,15911,'4.99','2005-08-23 17:44:53','2006-02-15 22:22:43'),(15612,582,2,12127,'2.99','2006-02-14 15:16:03','2006-02-15 22:22:43'),(15613,583,1,1428,'3.99','2005-06-15 18:19:30','2006-02-15 22:22:43'),(15614,583,1,2429,'9.99','2005-06-18 17:48:28','2006-02-15 22:22:43'),(15615,583,2,2663,'4.99','2005-06-19 10:54:00','2006-02-15 22:22:43'),(15616,583,2,2845,'5.99','2005-06-19 22:46:37','2006-02-15 22:22:43'),(15617,583,2,2879,'3.99','2005-06-20 01:24:10','2006-02-15 22:22:43'),(15618,583,1,3424,'0.99','2005-06-21 17:42:51','2006-02-15 22:22:43'),(15619,583,1,3779,'2.99','2005-07-06 13:46:36','2006-02-15 22:22:43'),(15620,583,1,3842,'4.99','2005-07-06 16:34:32','2006-02-15 22:22:43'),(15621,583,2,3991,'9.99','2005-07-06 23:33:41','2006-02-15 22:22:43'),(15622,583,1,4464,'4.99','2005-07-08 00:07:18','2006-02-15 22:22:43'),(15623,583,1,5462,'0.99','2005-07-09 22:56:53','2006-02-15 22:22:44'),(15624,583,1,5478,'5.99','2005-07-09 23:45:15','2006-02-15 22:22:44'),(15625,583,2,5747,'7.99','2005-07-10 12:15:33','2006-02-15 22:22:44'),(15626,583,2,6684,'6.99','2005-07-12 12:14:42','2006-02-15 22:22:44'),(15627,583,1,7401,'5.99','2005-07-27 16:17:55','2006-02-15 22:22:44'),(15628,583,2,8568,'7.99','2005-07-29 11:38:22','2006-02-15 22:22:44'),(15629,583,1,9550,'7.99','2005-07-31 01:57:34','2006-02-15 22:22:44'),(15630,583,2,9808,'1.99','2005-07-31 11:17:22','2006-02-15 22:22:44'),(15631,583,2,10301,'4.99','2005-08-01 04:09:37','2006-02-15 22:22:44'),(15632,583,2,10586,'2.99','2005-08-01 14:00:59','2006-02-15 22:22:44'),(15633,583,2,10800,'4.99','2005-08-01 22:07:44','2006-02-15 22:22:44'),(15634,583,2,11002,'4.99','2005-08-02 05:02:56','2006-02-15 22:22:44'),(15635,583,1,14259,'0.99','2005-08-21 06:00:22','2006-02-15 22:22:44'),(15636,584,2,379,'4.99','2005-05-27 09:25:32','2006-02-15 22:22:44'),(15637,584,1,626,'4.99','2005-05-28 16:58:09','2006-02-15 22:22:45'),(15638,584,1,920,'4.99','2005-05-30 11:44:01','2006-02-15 22:22:45'),(15639,584,2,1436,'3.99','2005-06-15 18:35:40','2006-02-15 22:22:45'),(15640,584,2,3317,'6.99','2005-06-21 08:22:32','2006-02-15 22:22:45'),(15641,584,2,3741,'2.99','2005-07-06 12:00:18','2006-02-15 22:22:45'),(15642,584,2,3895,'7.99','2005-07-06 19:04:24','2006-02-15 22:22:45'),(15643,584,1,4410,'0.99','2005-07-07 21:48:16','2006-02-15 22:22:45'),(15644,584,1,4977,'0.99','2005-07-09 00:15:50','2006-02-15 22:22:45'),(15645,584,2,6954,'0.99','2005-07-26 23:55:13','2006-02-15 22:22:45'),(15646,584,1,7186,'2.99','2005-07-27 08:26:12','2006-02-15 22:22:45'),(15647,584,1,7372,'4.99','2005-07-27 15:18:42','2006-02-15 22:22:45'),(15648,584,1,7659,'4.99','2005-07-28 02:09:45','2006-02-15 22:22:45'),(15649,584,2,8879,'4.99','2005-07-30 00:16:02','2006-02-15 22:22:45'),(15650,584,2,9451,'3.99','2005-07-30 22:10:17','2006-02-15 22:22:45'),(15651,584,1,9719,'5.99','2005-07-31 08:25:13','2006-02-15 22:22:46'),(15652,584,2,10073,'2.99','2005-07-31 19:53:15','2006-02-15 22:22:46'),(15653,584,1,10914,'4.99','2005-08-02 02:04:43','2006-02-15 22:22:46'),(15654,584,2,10966,'0.99','2005-08-02 04:00:47','2006-02-15 22:22:46'),(15655,584,1,11213,'4.99','2005-08-02 12:18:35','2006-02-15 22:22:46'),(15656,584,2,11500,'6.99','2005-08-16 23:01:22','2006-02-15 22:22:46'),(15657,584,2,12507,'8.99','2005-08-18 13:19:13','2006-02-15 22:22:46'),(15658,584,2,12541,'2.99','2005-08-18 14:18:30','2006-02-15 22:22:46'),(15659,584,2,12693,'5.99','2005-08-18 20:10:19','2006-02-15 22:22:46'),(15660,584,1,12844,'2.99','2005-08-19 01:59:08','2006-02-15 22:22:46'),(15661,584,2,14102,'5.99','2005-08-21 00:35:21','2006-02-15 22:22:46'),(15662,584,2,14230,'5.99','2005-08-21 04:57:29','2006-02-15 22:22:46'),(15663,584,2,14447,'4.99','2005-08-21 12:12:05','2006-02-15 22:22:46'),(15664,584,1,14930,'1.99','2005-08-22 05:38:32','2006-02-15 22:22:46'),(15665,584,1,15615,'0.99','2005-08-23 07:06:00','2006-02-15 22:22:47'),(15666,585,1,1344,'0.99','2005-06-15 12:29:41','2006-02-15 22:22:47'),(15667,585,2,1346,'7.99','2005-06-15 12:39:52','2006-02-15 22:22:47'),(15668,585,1,2674,'0.99','2005-06-19 11:47:59','2006-02-15 22:22:47'),(15669,585,1,2930,'3.99','2005-06-20 04:50:29','2006-02-15 22:22:47'),(15670,585,2,4156,'4.99','2005-07-07 09:03:51','2006-02-15 22:22:47'),(15671,585,2,4579,'4.99','2005-07-08 06:01:56','2006-02-15 22:22:47'),(15672,585,1,4684,'9.99','2005-07-08 10:41:06','2006-02-15 22:22:47'),(15673,585,2,5284,'2.99','2005-07-09 15:08:21','2006-02-15 22:22:47'),(15674,585,2,5950,'4.99','2005-07-10 23:13:45','2006-02-15 22:22:47'),(15675,585,2,6733,'6.99','2005-07-12 14:04:01','2006-02-15 22:22:47'),(15676,585,1,7131,'2.99','2005-07-27 06:25:06','2006-02-15 22:22:47'),(15677,585,1,7384,'4.99','2005-07-27 15:49:45','2006-02-15 22:22:47'),(15678,585,2,7409,'4.99','2005-07-27 16:38:24','2006-02-15 22:22:47'),(15679,585,2,8353,'2.99','2005-07-29 04:52:10','2006-02-15 22:22:48'),(15680,585,2,9407,'8.99','2005-07-30 20:25:24','2006-02-15 22:22:48'),(15681,585,1,9590,'3.99','2005-07-31 03:17:16','2006-02-15 22:22:48'),(15682,585,1,9860,'6.99','2005-07-31 13:03:24','2006-02-15 22:22:48'),(15683,585,2,10573,'0.99','2005-08-01 13:27:24','2006-02-15 22:22:48'),(15684,585,1,11285,'9.99','2005-08-02 14:44:02','2006-02-15 22:22:48'),(15685,585,2,13593,'3.99','2005-08-20 05:50:52','2006-02-15 22:22:48'),(15686,585,2,13939,'0.99','2005-08-20 17:28:01','2006-02-15 22:22:48'),(15687,585,1,15804,'4.99','2005-08-23 14:29:16','2006-02-15 22:22:48'),(15688,585,1,15896,'6.99','2005-08-23 17:09:56','2006-02-15 22:22:48'),(15689,585,2,14604,'4.99','2006-02-14 15:16:03','2006-02-15 22:22:48'),(15690,586,1,138,'4.99','2005-05-25 22:48:22','2006-02-15 22:22:48'),(15691,586,1,900,'8.99','2005-05-30 09:38:41','2006-02-15 22:22:48'),(15692,586,1,1260,'2.99','2005-06-15 06:42:25','2006-02-15 22:22:48'),(15693,586,2,1540,'0.99','2005-06-16 01:14:56','2006-02-15 22:22:49'),(15694,586,2,3487,'6.99','2005-07-05 23:30:36','2006-02-15 22:22:49'),(15695,586,2,3733,'4.99','2005-07-06 11:33:55','2006-02-15 22:22:49'),(15696,586,2,5382,'2.99','2005-07-09 19:12:57','2006-02-15 22:22:49'),(15697,586,1,6679,'2.99','2005-07-12 12:01:07','2006-02-15 22:22:49'),(15698,586,2,9786,'2.99','2005-07-31 10:25:21','2006-02-15 22:22:49'),(15699,586,2,9896,'2.99','2005-07-31 14:09:48','2006-02-15 22:22:49'),(15700,586,1,11034,'2.99','2005-08-02 05:54:53','2006-02-15 22:22:49'),(15701,586,1,11763,'0.99','2005-08-17 09:51:39','2006-02-15 22:22:49'),(15702,586,1,12013,'4.99','2005-08-17 19:23:02','2006-02-15 22:22:49'),(15703,586,1,12898,'0.99','2005-08-19 03:54:34','2006-02-15 22:22:50'),(15704,586,2,14043,'2.99','2005-08-20 21:46:43','2006-02-15 22:22:50'),(15705,586,1,14392,'1.99','2005-08-21 10:19:25','2006-02-15 22:22:50'),(15706,586,2,14533,'2.99','2005-08-21 15:15:19','2006-02-15 22:22:50'),(15707,586,1,15666,'3.99','2005-08-23 09:01:10','2006-02-15 22:22:51'),(15708,586,2,15684,'0.99','2005-08-23 09:40:04','2006-02-15 22:22:51'),(15709,587,1,181,'4.99','2005-05-26 04:47:06','2006-02-15 22:22:51'),(15710,587,1,361,'0.99','2005-05-27 07:03:28','2006-02-15 22:22:51'),(15711,587,2,1330,'2.99','2005-06-15 11:29:17','2006-02-15 22:22:52'),(15712,587,2,2034,'4.99','2005-06-17 13:27:16','2006-02-15 22:22:52'),(15713,587,1,2220,'2.99','2005-06-18 03:21:36','2006-02-15 22:22:52'),(15714,587,1,2329,'4.99','2005-06-18 10:22:52','2006-02-15 22:22:52'),(15715,587,2,3562,'2.99','2005-07-06 02:54:36','2006-02-15 22:22:53'),(15716,587,2,3969,'0.99','2005-07-06 22:47:59','2006-02-15 22:22:53'),(15717,587,2,5243,'3.99','2005-07-09 13:22:08','2006-02-15 22:22:53'),(15718,587,1,6639,'0.99','2005-07-12 10:00:44','2006-02-15 22:22:53'),(15719,587,2,6665,'6.99','2005-07-12 11:29:14','2006-02-15 22:22:53'),(15720,587,1,7501,'8.99','2005-07-27 20:16:59','2006-02-15 22:22:54'),(15721,587,2,8776,'5.99','2005-07-29 20:07:06','2006-02-15 22:22:54'),(15722,587,2,9720,'6.99','2005-07-31 08:25:21','2006-02-15 22:22:54'),(15723,587,2,9785,'4.99','2005-07-31 10:22:15','2006-02-15 22:22:54'),(15724,587,2,9909,'5.99','2005-07-31 14:43:34','2006-02-15 22:22:55'),(15725,587,2,10224,'4.99','2005-08-01 01:31:56','2006-02-15 22:22:55'),(15726,587,1,10825,'2.99','2005-08-01 23:05:33','2006-02-15 22:22:55'),(15727,587,1,11078,'2.99','2005-08-02 07:26:58','2006-02-15 22:22:55'),(15728,587,2,11403,'4.99','2005-08-02 19:10:21','2006-02-15 22:22:56'),(15729,587,2,12164,'4.99','2005-08-18 00:46:38','2006-02-15 22:22:56'),(15730,587,2,12330,'6.99','2005-08-18 06:46:33','2006-02-15 22:22:56'),(15731,587,2,14710,'4.99','2005-08-21 21:15:23','2006-02-15 22:22:56'),(15732,587,2,15348,'2.99','2005-08-22 21:13:46','2006-02-15 22:22:57'),(15733,587,2,15349,'0.99','2005-08-22 21:13:51','2006-02-15 22:22:57'),(15734,587,1,12144,'0.99','2006-02-14 15:16:03','2006-02-15 22:22:57'),(15735,588,1,576,'2.99','2005-05-28 10:56:10','2006-02-15 22:22:57'),(15736,588,1,961,'4.99','2005-05-30 18:16:44','2006-02-15 22:22:58'),(15737,588,2,1885,'2.99','2005-06-17 03:35:59','2006-02-15 22:22:58'),(15738,588,2,1903,'6.99','2005-06-17 04:37:20','2006-02-15 22:22:58'),(15739,588,2,2270,'7.99','2005-06-18 06:29:01','2006-02-15 22:22:58'),(15740,588,1,2453,'2.99','2005-06-18 19:30:53','2006-02-15 22:22:59'),(15741,588,2,2920,'3.99','2005-06-20 04:12:46','2006-02-15 22:22:59'),(15742,588,1,3628,'4.99','2005-07-06 06:19:43','2006-02-15 22:22:59'),(15743,588,1,4101,'0.99','2005-07-07 06:25:11','2006-02-15 22:22:59'),(15744,588,2,4207,'5.99','2005-07-07 11:32:45','2006-02-15 22:23:00'),(15745,588,2,5203,'2.99','2005-07-09 10:53:59','2006-02-15 22:23:00'),(15746,588,1,5335,'4.99','2005-07-09 17:00:49','2006-02-15 22:23:00'),(15747,588,1,6368,'4.99','2005-07-11 21:19:01','2006-02-15 22:23:00'),(15748,588,2,7377,'2.99','2005-07-27 15:31:28','2006-02-15 22:23:01'),(15749,588,2,7903,'2.99','2005-07-28 11:20:36','2006-02-15 22:23:01'),(15750,588,1,8421,'4.99','2005-07-29 07:00:47','2006-02-15 22:23:01'),(15751,588,1,8429,'2.99','2005-07-29 07:11:49','2006-02-15 22:23:01'),(15752,588,2,8519,'2.99','2005-07-29 10:09:43','2006-02-15 22:23:02'),(15753,588,1,8769,'2.99','2005-07-29 19:45:33','2006-02-15 22:23:02'),(15754,588,2,9326,'2.99','2005-07-30 17:30:03','2006-02-15 22:23:02'),(15755,588,2,9370,'4.99','2005-07-30 18:57:29','2006-02-15 22:23:02'),(15756,588,2,10373,'4.99','2005-08-01 06:24:26','2006-02-15 22:23:02'),(15757,588,1,12185,'2.99','2005-08-18 01:40:14','2006-02-15 22:23:03'),(15758,588,2,12815,'4.99','2005-08-19 00:59:42','2006-02-15 22:23:03'),(15759,588,1,13064,'4.99','2005-08-19 09:46:53','2006-02-15 22:23:03'),(15760,588,1,13923,'1.99','2005-08-20 17:05:02','2006-02-15 22:23:03'),(15761,588,1,15109,'1.99','2005-08-22 12:12:58','2006-02-15 22:23:04'),(15762,588,1,15158,'2.99','2005-08-22 14:30:39','2006-02-15 22:23:04'),(15763,588,1,15209,'4.99','2005-08-22 16:37:32','2006-02-15 22:23:04'),(15764,589,1,531,'0.99','2005-05-28 05:23:38','2006-02-15 22:23:04'),(15765,589,1,596,'4.99','2005-05-28 14:00:03','2006-02-15 22:23:05'),(15766,589,1,737,'4.99','2005-05-29 08:11:31','2006-02-15 22:23:05'),(15767,589,1,1439,'4.99','2005-06-15 18:45:32','2006-02-15 22:23:05'),(15768,589,2,1703,'4.99','2005-06-16 13:28:44','2006-02-15 22:23:05'),(15769,589,2,2652,'8.99','2005-06-19 10:35:26','2006-02-15 22:23:06'),(15770,589,1,2707,'8.99','2005-06-19 13:57:08','2006-02-15 22:23:06'),(15771,589,1,2979,'2.99','2005-06-20 08:31:05','2006-02-15 22:23:06'),(15772,589,2,4986,'2.99','2005-07-09 00:44:33','2006-02-15 22:23:06'),(15773,589,1,5951,'0.99','2005-07-10 23:14:29','2006-02-15 22:23:07'),(15774,589,2,6177,'4.99','2005-07-11 10:53:49','2006-02-15 22:23:07'),(15775,589,2,6247,'3.99','2005-07-11 15:00:05','2006-02-15 22:23:07'),(15776,589,2,7250,'0.99','2005-07-27 10:44:09','2006-02-15 22:23:07'),(15777,589,2,7431,'3.99','2005-07-27 17:27:27','2006-02-15 22:23:08'),(15778,589,2,7948,'9.99','2005-07-28 13:06:16','2006-02-15 22:23:08'),(15779,589,2,8056,'0.99','2005-07-28 17:04:15','2006-02-15 22:23:08'),(15780,589,1,8374,'3.99','2005-07-29 05:24:02','2006-02-15 22:23:08'),(15781,589,1,9153,'4.99','2005-07-30 10:58:16','2006-02-15 22:23:09'),(15782,589,2,10544,'4.99','2005-08-01 12:36:21','2006-02-15 22:23:09'),(15783,589,1,11980,'4.99','2005-08-17 18:10:18','2006-02-15 22:23:09'),(15784,589,1,12738,'7.99','2005-08-18 22:11:47','2006-02-15 22:23:09'),(15785,589,2,12933,'8.99','2005-08-19 05:18:20','2006-02-15 22:23:10'),(15786,589,1,14038,'6.99','2005-08-20 21:39:23','2006-02-15 22:23:10'),(15787,589,1,14254,'6.99','2005-08-21 05:51:28','2006-02-15 22:23:10'),(15788,589,1,14544,'0.99','2005-08-21 15:41:01','2006-02-15 22:23:10'),(15789,589,2,14706,'0.99','2005-08-21 21:04:42','2006-02-15 22:23:10'),(15790,589,2,15917,'5.99','2005-08-23 17:57:28','2006-02-15 22:23:11'),(15791,589,2,15992,'0.99','2005-08-23 20:28:32','2006-02-15 22:23:11'),(15792,590,1,602,'3.99','2005-05-28 14:15:54','2006-02-15 22:23:11'),(15793,590,2,1456,'7.99','2005-06-15 20:00:11','2006-02-15 22:23:11'),(15794,590,2,2352,'2.99','2005-06-18 12:40:15','2006-02-15 22:23:12'),(15795,590,2,2775,'2.99','2005-06-19 18:14:20','2006-02-15 22:23:12'),(15796,590,1,2916,'6.99','2005-06-20 04:01:04','2006-02-15 22:23:12'),(15797,590,1,2964,'9.99','2005-06-20 07:33:29','2006-02-15 22:23:12'),(15798,590,2,4685,'4.99','2005-07-08 10:45:13','2006-02-15 22:23:13'),(15799,590,1,4710,'2.99','2005-07-08 12:04:53','2006-02-15 22:23:13'),(15800,590,2,4722,'4.99','2005-07-08 12:42:27','2006-02-15 22:23:13'),(15801,590,1,5165,'0.99','2005-07-09 09:08:53','2006-02-15 22:23:13'),(15802,590,1,5529,'2.99','2005-07-10 02:11:13','2006-02-15 22:23:14'),(15803,590,1,5991,'4.99','2005-07-11 01:03:38','2006-02-15 22:23:14'),(15804,590,2,6232,'4.99','2005-07-11 14:08:27','2006-02-15 22:23:14'),(15805,590,2,6492,'4.99','2005-07-12 02:28:40','2006-02-15 22:23:14'),(15806,590,1,7010,'4.99','2005-07-27 01:56:01','2006-02-15 22:23:15'),(15807,590,2,7665,'2.99','2005-07-28 02:28:30','2006-02-15 22:23:15'),(15808,590,1,8195,'5.99','2005-07-28 22:52:58','2006-02-15 22:23:15'),(15809,590,1,8801,'4.99','2005-07-29 21:25:22','2006-02-15 22:23:15'),(15810,590,2,9126,'0.99','2005-07-30 09:44:15','2006-02-15 22:23:16'),(15811,590,1,9884,'4.99','2005-07-31 13:56:24','2006-02-15 22:23:16'),(15812,590,1,10657,'4.99','2005-08-01 16:38:44','2006-02-15 22:23:16'),(15813,590,2,11578,'5.99','2005-08-17 01:54:13','2006-02-15 22:23:16'),(15814,590,2,11713,'3.99','2005-08-17 07:34:05','2006-02-15 22:23:17'),(15815,590,1,14830,'2.99','2005-08-22 01:37:19','2006-02-15 22:23:17'),(15816,590,2,15458,'2.99','2006-02-14 15:16:03','2006-02-15 22:23:17'),(15817,591,1,1418,'0.99','2005-06-15 17:51:27','2006-02-15 22:23:17'),(15818,591,2,3341,'2.99','2005-06-21 10:37:25','2006-02-15 22:23:17'),(15819,591,2,3435,'4.99','2005-06-21 19:14:58','2006-02-15 22:23:18'),(15820,591,1,3636,'0.99','2005-07-06 07:03:52','2006-02-15 22:23:18'),(15821,591,2,4383,'11.99','2005-07-07 20:45:51','2006-02-15 22:23:18'),(15822,591,1,4581,'6.99','2005-07-08 06:05:06','2006-02-15 22:23:18'),(15823,591,1,5704,'5.99','2005-07-10 10:06:29','2006-02-15 22:23:19'),(15824,591,1,5759,'6.99','2005-07-10 12:43:22','2006-02-15 22:23:19'),(15825,591,1,7118,'8.99','2005-07-27 05:53:50','2006-02-15 22:23:19'),(15826,591,1,7212,'2.99','2005-07-27 09:21:22','2006-02-15 22:23:19'),(15827,591,2,7511,'4.99','2005-07-27 20:38:40','2006-02-15 22:23:20'),(15828,591,1,7549,'3.99','2005-07-27 21:53:21','2006-02-15 22:23:20'),(15829,591,2,7741,'0.99','2005-07-28 05:25:55','2006-02-15 22:23:20'),(15830,591,1,7997,'4.99','2005-07-28 15:02:25','2006-02-15 22:23:20'),(15831,591,1,8149,'3.99','2005-07-28 20:48:12','2006-02-15 22:23:21'),(15832,591,2,8666,'5.99','2005-07-29 15:39:38','2006-02-15 22:23:21'),(15833,591,2,8819,'4.99','2005-07-29 22:14:26','2006-02-15 22:23:21'),(15834,591,1,9684,'0.99','2005-07-31 06:48:33','2006-02-15 22:23:21'),(15835,591,1,10415,'4.99','2005-08-01 08:05:59','2006-02-15 22:23:22'),(15836,591,2,12203,'5.99','2005-08-18 02:18:52','2006-02-15 22:23:22'),(15837,591,2,12227,'4.99','2005-08-18 03:04:28','2006-02-15 22:23:22'),(15838,591,1,12547,'4.99','2005-08-18 14:29:39','2006-02-15 22:23:22'),(15839,591,1,12571,'5.99','2005-08-18 15:31:18','2006-02-15 22:23:23'),(15840,591,1,12934,'5.99','2005-08-19 05:18:42','2006-02-15 22:23:23'),(15841,591,2,13104,'2.99','2005-08-19 11:06:06','2006-02-15 22:23:23'),(15842,591,2,13343,'3.99','2005-08-19 20:22:08','2006-02-15 22:23:23'),(15843,591,1,13867,'9.99','2005-08-20 15:05:42','2006-02-15 22:23:23'),(15844,592,2,1163,'6.99','2005-06-14 23:12:46','2006-02-15 22:23:24'),(15845,592,2,1423,'5.99','2005-06-15 18:08:12','2006-02-15 22:23:24'),(15846,592,1,1479,'2.99','2005-06-15 21:13:38','2006-02-15 22:23:24'),(15847,592,1,2627,'0.99','2005-06-19 08:32:00','2006-02-15 22:23:24'),(15848,592,1,3158,'7.99','2005-06-20 21:08:19','2006-02-15 22:23:25'),(15849,592,2,3560,'2.99','2005-07-06 02:51:37','2006-02-15 22:23:25'),(15850,592,1,3973,'11.99','2005-07-06 22:58:31','2006-02-15 22:23:25'),(15851,592,1,4129,'1.99','2005-07-07 07:37:03','2006-02-15 22:23:25'),(15852,592,1,4145,'9.99','2005-07-07 08:26:39','2006-02-15 22:23:26'),(15853,592,1,4460,'0.99','2005-07-07 23:50:14','2006-02-15 22:23:26'),(15854,592,1,4518,'2.99','2005-07-08 02:48:36','2006-02-15 22:23:26'),(15855,592,1,6937,'0.99','2005-07-26 23:15:50','2006-02-15 22:23:26'),(15856,592,2,7173,'0.99','2005-07-27 07:59:24','2006-02-15 22:23:27'),(15857,592,1,7278,'3.99','2005-07-27 11:50:34','2006-02-15 22:23:27'),(15858,592,2,7364,'4.99','2005-07-27 14:58:40','2006-02-15 22:23:27'),(15859,592,1,8730,'2.99','2005-07-29 18:23:34','2006-02-15 22:23:27'),(15860,592,2,8773,'0.99','2005-07-29 19:55:34','2006-02-15 22:23:28'),(15861,592,1,9268,'4.99','2005-07-30 15:02:30','2006-02-15 22:23:28'),(15862,592,1,9437,'3.99','2005-07-30 21:36:04','2006-02-15 22:23:28'),(15863,592,2,9666,'6.99','2005-07-31 06:20:58','2006-02-15 22:23:28'),(15864,592,2,10383,'0.99','2005-08-01 06:37:16','2006-02-15 22:23:29'),(15865,592,2,10634,'2.99','2005-08-01 15:37:48','2006-02-15 22:23:29'),(15866,592,1,11410,'8.99','2005-08-02 19:29:01','2006-02-15 22:23:29'),(15867,592,2,12043,'0.99','2005-08-17 20:38:21','2006-02-15 22:23:29'),(15868,592,2,12619,'0.99','2005-08-18 17:24:15','2006-02-15 22:23:30'),(15869,592,1,12976,'1.99','2005-08-19 06:52:58','2006-02-15 22:23:30'),(15870,592,1,13157,'2.99','2005-08-19 13:12:28','2006-02-15 22:23:30'),(15871,592,2,13662,'3.99','2005-08-20 08:11:58','2006-02-15 22:23:30'),(15872,592,2,14606,'0.99','2006-02-14 15:16:03','2006-02-15 22:23:30'),(15873,593,1,790,'2.99','2005-05-29 16:19:29','2006-02-15 22:23:31'),(15874,593,1,991,'8.99','2005-05-30 23:29:22','2006-02-15 22:23:31'),(15875,593,2,2055,'5.99','2005-06-17 15:27:03','2006-02-15 22:23:31'),(15876,593,2,2205,'4.99','2005-06-18 02:14:34','2006-02-15 22:23:31'),(15877,593,1,2441,'4.99','2005-06-18 18:45:11','2006-02-15 22:23:32'),(15878,593,1,2832,'4.99','2005-06-19 21:21:53','2006-02-15 22:23:32'),(15879,593,2,3542,'2.99','2005-07-06 01:51:42','2006-02-15 22:23:32'),(15880,593,2,4075,'2.99','2005-07-07 04:51:44','2006-02-15 22:23:32'),(15881,593,2,4280,'3.99','2005-07-07 15:09:31','2006-02-15 22:23:33'),(15882,593,2,4623,'0.99','2005-07-08 08:03:22','2006-02-15 22:23:33'),(15883,593,2,4781,'4.99','2005-07-08 16:06:55','2006-02-15 22:23:33'),(15884,593,2,4867,'0.99','2005-07-08 19:10:52','2006-02-15 22:23:33'),(15885,593,1,6386,'2.99','2005-07-11 22:14:57','2006-02-15 22:23:34'),(15886,593,1,6731,'2.99','2005-07-12 13:58:27','2006-02-15 22:23:34'),(15887,593,2,7958,'4.99','2005-07-28 13:34:34','2006-02-15 22:23:34'),(15888,593,1,8497,'2.99','2005-07-29 09:07:03','2006-02-15 22:23:34'),(15889,593,2,9329,'6.99','2005-07-30 17:42:38','2006-02-15 22:23:35'),(15890,593,1,9483,'6.99','2005-07-30 23:31:31','2006-02-15 22:23:35'),(15891,593,1,10368,'3.99','2005-08-01 06:13:38','2006-02-15 22:23:35'),(15892,593,2,10533,'3.99','2005-08-01 12:14:16','2006-02-15 22:23:35'),(15893,593,1,10840,'5.99','2005-08-01 23:38:34','2006-02-15 22:23:36'),(15894,593,2,10904,'4.99','2005-08-02 01:43:02','2006-02-15 22:23:36'),(15895,593,2,12744,'2.99','2005-08-18 22:22:36','2006-02-15 22:23:36'),(15896,593,1,13524,'6.99','2005-08-20 02:48:43','2006-02-15 22:23:36'),(15897,593,1,14408,'5.99','2005-08-21 10:47:24','2006-02-15 22:23:36'),(15898,593,1,14653,'0.99','2005-08-21 19:35:59','2006-02-15 22:23:37'),(15899,594,1,313,'4.99','2005-05-26 22:56:19','2006-02-15 22:23:37'),(15900,594,1,360,'8.99','2005-05-27 06:51:14','2006-02-15 22:23:37'),(15901,594,2,1018,'0.99','2005-05-31 02:53:42','2006-02-15 22:23:37'),(15902,594,1,1045,'6.99','2005-05-31 06:29:01','2006-02-15 22:23:38'),(15903,594,2,1537,'5.99','2005-06-16 00:52:51','2006-02-15 22:23:38'),(15904,594,1,1816,'4.99','2005-06-16 21:20:41','2006-02-15 22:23:38'),(15905,594,1,1950,'2.99','2005-06-17 08:26:52','2006-02-15 22:23:38'),(15906,594,1,2276,'6.99','2005-06-18 06:33:48','2006-02-15 22:23:39'),(15907,594,2,2786,'0.99','2005-06-19 18:46:43','2006-02-15 22:23:39'),(15908,594,2,3302,'1.99','2005-06-21 07:33:40','2006-02-15 22:23:39'),(15909,594,2,3474,'0.99','2005-07-05 22:59:53','2006-02-15 22:23:39'),(15910,594,1,3546,'4.99','2005-07-06 02:17:54','2006-02-15 22:23:40'),(15911,594,2,3960,'2.99','2005-07-06 22:08:53','2006-02-15 22:23:40'),(15912,594,1,4037,'5.99','2005-07-07 02:52:52','2006-02-15 22:23:40'),(15913,594,1,4154,'3.99','2005-07-07 08:58:23','2006-02-15 22:23:40'),(15914,594,2,5386,'2.99','2005-07-09 19:19:09','2006-02-15 22:23:41'),(15915,594,1,6473,'6.99','2005-07-12 01:35:40','2006-02-15 22:23:41'),(15916,594,1,7533,'8.99','2005-07-27 21:24:33','2006-02-15 22:23:41'),(15917,594,1,8567,'1.99','2005-07-29 11:37:30','2006-02-15 22:23:41'),(15918,594,1,8603,'2.99','2005-07-29 13:07:07','2006-02-15 22:23:42'),(15919,594,2,8820,'5.99','2005-07-29 22:14:56','2006-02-15 22:23:42'),(15920,594,1,9545,'7.99','2005-07-31 01:46:24','2006-02-15 22:23:42'),(15921,594,1,9698,'3.99','2005-07-31 07:24:35','2006-02-15 22:23:42'),(15922,594,2,9802,'4.99','2005-07-31 11:04:20','2006-02-15 22:23:42'),(15923,594,2,10704,'8.99','2005-08-01 18:38:02','2006-02-15 22:23:43'),(15924,594,2,14824,'4.99','2005-08-22 01:27:51','2006-02-15 22:23:43'),(15925,594,1,14999,'4.99','2005-08-22 07:54:47','2006-02-15 22:23:43'),(15926,595,1,613,'6.99','2005-05-28 15:27:22','2006-02-15 22:23:43'),(15927,595,2,1170,'2.99','2005-06-14 23:47:35','2006-02-15 22:23:44'),(15928,595,2,3371,'4.99','2005-06-21 13:27:22','2006-02-15 22:23:44'),(15929,595,1,3789,'9.99','2005-07-06 14:02:26','2006-02-15 22:23:44'),(15930,595,1,4017,'4.99','2005-07-07 01:08:18','2006-02-15 22:23:44'),(15931,595,1,4241,'4.99','2005-07-07 13:39:00','2006-02-15 22:23:45'),(15932,595,2,4775,'2.99','2005-07-08 15:44:05','2006-02-15 22:23:45'),(15933,595,1,5631,'1.99','2005-07-10 06:15:45','2006-02-15 22:23:45'),(15934,595,1,5952,'1.99','2005-07-10 23:18:20','2006-02-15 22:23:45'),(15935,595,1,6105,'6.99','2005-07-11 07:03:19','2006-02-15 22:23:46'),(15936,595,1,6704,'6.99','2005-07-12 12:50:24','2006-02-15 22:23:46'),(15937,595,1,7086,'4.99','2005-07-27 04:39:46','2006-02-15 22:23:46'),(15938,595,2,7307,'0.99','2005-07-27 12:59:10','2006-02-15 22:23:46'),(15939,595,1,7396,'4.99','2005-07-27 16:03:53','2006-02-15 22:23:47'),(15940,595,2,7490,'3.99','2005-07-27 19:48:12','2006-02-15 22:23:47'),(15941,595,1,9152,'2.99','2005-07-30 10:51:27','2006-02-15 22:23:47'),(15942,595,2,9223,'2.99','2005-07-30 13:23:20','2006-02-15 22:23:47'),(15943,595,1,9354,'4.99','2005-07-30 18:32:51','2006-02-15 22:23:48'),(15944,595,2,9497,'0.99','2005-07-30 23:56:54','2006-02-15 22:23:48'),(15945,595,2,9542,'4.99','2005-07-31 01:41:48','2006-02-15 22:23:48'),(15946,595,1,9631,'2.99','2005-07-31 05:02:00','2006-02-15 22:23:48'),(15947,595,2,9826,'10.99','2005-07-31 11:51:46','2006-02-15 22:23:48'),(15948,595,1,10729,'2.99','2005-08-01 19:21:11','2006-02-15 22:23:49'),(15949,595,1,10932,'2.99','2005-08-02 02:46:22','2006-02-15 22:23:49'),(15950,595,2,11748,'0.99','2005-08-17 09:04:02','2006-02-15 22:23:49'),(15951,595,1,12235,'0.99','2005-08-18 03:17:50','2006-02-15 22:23:49'),(15952,595,1,14334,'0.99','2005-08-21 08:32:32','2006-02-15 22:23:50'),(15953,595,2,15576,'2.99','2005-08-23 05:32:03','2006-02-15 22:23:50'),(15954,595,2,15994,'0.99','2005-08-23 20:29:10','2006-02-15 22:23:50'),(15955,595,2,16016,'2.99','2005-08-23 21:26:35','2006-02-15 22:23:50'),(15956,596,2,303,'4.99','2005-05-26 21:16:52','2006-02-15 22:23:51'),(15957,596,2,625,'0.99','2005-05-28 16:35:46','2006-02-15 22:23:51'),(15958,596,2,667,'4.99','2005-05-28 21:49:02','2006-02-15 22:23:51'),(15959,596,2,782,'1.99','2005-05-29 14:38:57','2006-02-15 22:23:51'),(15960,596,1,914,'2.99','2005-05-30 11:06:00','2006-02-15 22:23:52'),(15961,596,1,974,'6.99','2005-05-30 20:28:42','2006-02-15 22:23:52'),(15962,596,1,1644,'1.99','2005-06-16 08:58:18','2006-02-15 22:23:52'),(15963,596,1,2767,'1.99','2005-06-19 17:46:35','2006-02-15 22:23:52'),(15964,596,2,5742,'3.99','2005-07-10 11:56:18','2006-02-15 22:23:53'),(15965,596,1,6015,'2.99','2005-07-11 02:04:12','2006-02-15 22:23:53'),(15966,596,1,6017,'0.99','2005-07-11 02:05:32','2006-02-15 22:23:53'),(15967,596,1,6197,'4.99','2005-07-11 12:09:51','2006-02-15 22:23:53'),(15968,596,2,6883,'4.99','2005-07-12 20:50:48','2006-02-15 22:23:53'),(15969,596,1,10094,'3.99','2005-07-31 20:31:18','2006-02-15 22:23:54'),(15970,596,2,10692,'4.99','2005-08-01 18:12:35','2006-02-15 22:23:54'),(15971,596,1,10756,'2.99','2005-08-01 20:17:03','2006-02-15 22:23:54'),(15972,596,2,10804,'0.99','2005-08-01 22:22:11','2006-02-15 22:23:54'),(15973,596,2,11009,'4.99','2005-08-02 05:06:23','2006-02-15 22:23:55'),(15974,596,2,11852,'3.99','2005-08-17 13:38:27','2006-02-15 22:23:55'),(15975,596,1,11934,'0.99','2005-08-17 16:40:00','2006-02-15 22:23:55'),(15976,596,2,12560,'4.99','2005-08-18 14:54:19','2006-02-15 22:23:55'),(15977,596,1,12878,'4.99','2005-08-19 03:17:08','2006-02-15 22:23:56'),(15978,596,1,13648,'4.99','2005-08-20 07:48:10','2006-02-15 22:23:56'),(15979,596,1,14050,'3.99','2005-08-20 22:09:04','2006-02-15 22:23:56'),(15980,596,1,14417,'0.99','2005-08-21 11:13:35','2006-02-15 22:23:56'),(15981,596,1,15405,'0.99','2005-08-22 23:20:41','2006-02-15 22:23:57'),(15982,596,1,15899,'6.99','2005-08-23 17:16:28','2006-02-15 22:23:57'),(15983,596,1,15423,'0.99','2006-02-14 15:16:03','2006-02-15 22:23:57'),(15984,597,2,34,'2.99','2005-05-25 04:19:28','2006-02-15 22:23:57'),(15985,597,2,514,'8.99','2005-05-28 03:09:28','2006-02-15 22:23:58'),(15986,597,1,2379,'0.99','2005-06-18 14:59:39','2006-02-15 22:23:58'),(15987,597,1,2696,'4.99','2005-06-19 13:28:42','2006-02-15 22:23:58'),(15988,597,1,3201,'1.99','2005-06-21 00:30:26','2006-02-15 22:23:58'),(15989,597,1,5093,'0.99','2005-07-09 05:59:12','2006-02-15 22:23:59'),(15990,597,1,5348,'4.99','2005-07-09 17:34:11','2006-02-15 22:23:59'),(15991,597,2,5732,'2.99','2005-07-10 11:36:32','2006-02-15 22:23:59'),(15992,597,1,6508,'2.99','2005-07-12 03:34:50','2006-02-15 22:23:59'),(15993,597,2,7968,'4.99','2005-07-28 13:57:35','2006-02-15 22:23:59'),(15994,597,2,8948,'4.99','2005-07-30 03:16:18','2006-02-15 22:24:00'),(15995,597,2,10021,'4.99','2005-07-31 18:24:39','2006-02-15 22:24:00'),(15996,597,1,10214,'0.99','2005-08-01 01:04:15','2006-02-15 22:24:00'),(15997,597,2,10986,'5.99','2005-08-02 04:35:24','2006-02-15 22:24:00'),(15998,597,2,11147,'4.99','2005-08-02 09:45:54','2006-02-15 22:24:01'),(15999,597,2,11223,'2.99','2005-08-02 12:34:27','2006-02-15 22:24:01'),(16000,597,1,11240,'2.99','2005-08-02 13:28:30','2006-02-15 22:24:01'),(16001,597,1,11880,'5.99','2005-08-17 14:28:28','2006-02-15 22:24:01'),(16002,597,1,12081,'4.99','2005-08-17 22:10:46','2006-02-15 22:24:02'),(16003,597,1,12992,'0.99','2005-08-19 07:23:06','2006-02-15 22:24:02'),(16004,597,2,13019,'2.99','2005-08-19 08:07:43','2006-02-15 22:24:02'),(16005,597,1,13152,'6.99','2005-08-19 13:09:32','2006-02-15 22:24:02'),(16006,597,2,15275,'2.99','2005-08-22 18:57:39','2006-02-15 22:24:03'),(16007,597,1,15469,'4.99','2005-08-23 01:29:59','2006-02-15 22:24:03'),(16008,597,1,11652,'4.99','2006-02-14 15:16:03','2006-02-15 22:24:03'),(16009,598,1,3005,'2.99','2005-06-20 10:10:29','2006-02-15 22:24:03'),(16010,598,1,3648,'0.99','2005-07-06 07:30:41','2006-02-15 22:24:04'),(16011,598,2,3950,'6.99','2005-07-06 21:48:44','2006-02-15 22:24:04'),(16012,598,1,3972,'4.99','2005-07-06 22:53:57','2006-02-15 22:24:04'),(16013,598,1,4181,'4.99','2005-07-07 10:27:54','2006-02-15 22:24:04'),(16014,598,2,5688,'5.99','2005-07-10 09:16:08','2006-02-15 22:24:04'),(16015,598,1,6519,'4.99','2005-07-12 04:00:36','2006-02-15 22:24:05'),(16016,598,2,6528,'4.99','2005-07-12 04:29:44','2006-02-15 22:24:05'),(16017,598,2,6575,'0.99','2005-07-12 06:12:53','2006-02-15 22:24:05'),(16018,598,2,6660,'3.99','2005-07-12 11:20:12','2006-02-15 22:24:05'),(16019,598,2,7201,'6.99','2005-07-27 08:57:40','2006-02-15 22:24:06'),(16020,598,2,7354,'0.99','2005-07-27 14:42:11','2006-02-15 22:24:06'),(16021,598,1,7998,'0.99','2005-07-28 15:08:48','2006-02-15 22:24:06'),(16022,598,2,8436,'0.99','2005-07-29 07:21:20','2006-02-15 22:24:06'),(16023,598,1,8511,'5.99','2005-07-29 09:42:42','2006-02-15 22:24:07'),(16024,598,1,8939,'4.99','2005-07-30 02:56:53','2006-02-15 22:24:07'),(16025,598,1,10054,'4.99','2005-07-31 19:15:52','2006-02-15 22:24:07'),(16026,598,2,11350,'0.99','2005-08-02 17:22:59','2006-02-15 22:24:07'),(16027,598,2,12601,'2.99','2005-08-18 16:47:52','2006-02-15 22:24:08'),(16028,598,2,14345,'0.99','2005-08-21 08:41:15','2006-02-15 22:24:08'),(16029,598,2,15307,'2.99','2005-08-22 19:54:26','2006-02-15 22:24:08'),(16030,598,1,15443,'7.99','2005-08-23 00:44:15','2006-02-15 22:24:08'),(16031,599,2,1008,'4.99','2005-05-31 01:18:56','2006-02-15 22:24:09'),(16032,599,1,2272,'1.99','2005-06-18 06:29:53','2006-02-15 22:24:09'),(16033,599,2,3043,'6.99','2005-06-20 12:38:35','2006-02-15 22:24:09'),(16034,599,2,3398,'4.99','2005-06-21 15:34:38','2006-02-15 22:24:09'),(16035,599,1,3429,'6.99','2005-06-21 18:46:05','2006-02-15 22:24:09'),(16036,599,1,5065,'0.99','2005-07-09 04:42:00','2006-02-15 22:24:10'),(16037,599,1,5843,'2.99','2005-07-10 17:14:27','2006-02-15 22:24:10'),(16038,599,2,6800,'9.99','2005-07-12 17:03:56','2006-02-15 22:24:10'),(16039,599,2,6895,'2.99','2005-07-12 21:23:59','2006-02-15 22:24:10'),(16040,599,1,8965,'6.99','2005-07-30 03:52:37','2006-02-15 22:24:11'),(16041,599,2,9630,'2.99','2005-07-31 04:57:07','2006-02-15 22:24:11'),(16042,599,2,9679,'2.99','2005-07-31 06:41:19','2006-02-15 22:24:11'),(16043,599,2,11522,'3.99','2005-08-17 00:05:05','2006-02-15 22:24:11'),(16044,599,1,14233,'1.99','2005-08-21 05:07:08','2006-02-15 22:24:12'),(16045,599,1,14599,'4.99','2005-08-21 17:43:42','2006-02-15 22:24:12'),(16046,599,1,14719,'1.99','2005-08-21 21:41:57','2006-02-15 22:24:12'),(16047,599,2,15590,'8.99','2005-08-23 06:09:44','2006-02-15 22:24:12'),(16048,599,2,15719,'2.99','2005-08-23 11:08:46','2006-02-15 22:24:13'),(16049,599,2,15725,'2.99','2005-08-23 11:25:00','2006-02-15 22:24:13'); +COMMIT; + +-- +-- Trigger to enforce payment_date during INSERT +-- + +CREATE TRIGGER payment_date BEFORE INSERT ON payment FOR EACH ROW SET NEW.payment_date = NOW(); + +-- +-- Dumping data for table rental +-- + +SET AUTOCOMMIT=0; +INSERT INTO rental VALUES (1,'2005-05-24 22:53:30',367,130,'2005-05-26 22:04:30',1,'2006-02-15 21:30:53'),(2,'2005-05-24 22:54:33',1525,459,'2005-05-28 19:40:33',1,'2006-02-15 21:30:53'),(3,'2005-05-24 23:03:39',1711,408,'2005-06-01 22:12:39',1,'2006-02-15 21:30:53'),(4,'2005-05-24 23:04:41',2452,333,'2005-06-03 01:43:41',2,'2006-02-15 21:30:53'),(5,'2005-05-24 23:05:21',2079,222,'2005-06-02 04:33:21',1,'2006-02-15 21:30:53'),(6,'2005-05-24 23:08:07',2792,549,'2005-05-27 01:32:07',1,'2006-02-15 21:30:53'),(7,'2005-05-24 23:11:53',3995,269,'2005-05-29 20:34:53',2,'2006-02-15 21:30:53'),(8,'2005-05-24 23:31:46',2346,239,'2005-05-27 23:33:46',2,'2006-02-15 21:30:53'),(9,'2005-05-25 00:00:40',2580,126,'2005-05-28 00:22:40',1,'2006-02-15 21:30:53'),(10,'2005-05-25 00:02:21',1824,399,'2005-05-31 22:44:21',2,'2006-02-15 21:30:53'),(11,'2005-05-25 00:09:02',4443,142,'2005-06-02 20:56:02',2,'2006-02-15 21:30:53'),(12,'2005-05-25 00:19:27',1584,261,'2005-05-30 05:44:27',2,'2006-02-15 21:30:53'),(13,'2005-05-25 00:22:55',2294,334,'2005-05-30 04:28:55',1,'2006-02-15 21:30:53'),(14,'2005-05-25 00:31:15',2701,446,'2005-05-26 02:56:15',1,'2006-02-15 21:30:53'),(15,'2005-05-25 00:39:22',3049,319,'2005-06-03 03:30:22',1,'2006-02-15 21:30:53'),(16,'2005-05-25 00:43:11',389,316,'2005-05-26 04:42:11',2,'2006-02-15 21:30:53'),(17,'2005-05-25 01:06:36',830,575,'2005-05-27 00:43:36',1,'2006-02-15 21:30:53'),(18,'2005-05-25 01:10:47',3376,19,'2005-05-31 06:35:47',2,'2006-02-15 21:30:53'),(19,'2005-05-25 01:17:24',1941,456,'2005-05-31 06:00:24',1,'2006-02-15 21:30:53'),(20,'2005-05-25 01:48:41',3517,185,'2005-05-27 02:20:41',2,'2006-02-15 21:30:53'),(21,'2005-05-25 01:59:46',146,388,'2005-05-26 01:01:46',2,'2006-02-15 21:30:53'),(22,'2005-05-25 02:19:23',727,509,'2005-05-26 04:52:23',2,'2006-02-15 21:30:53'),(23,'2005-05-25 02:40:21',4441,438,'2005-05-29 06:34:21',1,'2006-02-15 21:30:53'),(24,'2005-05-25 02:53:02',3273,350,'2005-05-27 01:15:02',1,'2006-02-15 21:30:53'),(25,'2005-05-25 03:21:20',3961,37,'2005-05-27 21:25:20',2,'2006-02-15 21:30:53'),(26,'2005-05-25 03:36:50',4371,371,'2005-05-31 00:34:50',1,'2006-02-15 21:30:53'),(27,'2005-05-25 03:41:50',1225,301,'2005-05-30 01:13:50',2,'2006-02-15 21:30:53'),(28,'2005-05-25 03:42:37',4068,232,'2005-05-26 09:26:37',2,'2006-02-15 21:30:53'),(29,'2005-05-25 03:47:12',611,44,'2005-05-30 00:31:12',2,'2006-02-15 21:30:53'),(30,'2005-05-25 04:01:32',3744,430,'2005-05-30 03:12:32',1,'2006-02-15 21:30:53'),(31,'2005-05-25 04:05:17',4482,369,'2005-05-30 07:15:17',1,'2006-02-15 21:30:53'),(32,'2005-05-25 04:06:21',3832,230,'2005-05-25 23:55:21',1,'2006-02-15 21:30:53'),(33,'2005-05-25 04:18:51',1681,272,'2005-05-27 03:58:51',1,'2006-02-15 21:30:53'),(34,'2005-05-25 04:19:28',2613,597,'2005-05-29 00:10:28',2,'2006-02-15 21:30:53'),(35,'2005-05-25 04:24:36',1286,484,'2005-05-27 07:02:36',2,'2006-02-15 21:30:53'),(36,'2005-05-25 04:36:26',1308,88,'2005-05-29 00:31:26',1,'2006-02-15 21:30:53'),(37,'2005-05-25 04:44:31',403,535,'2005-05-29 01:03:31',1,'2006-02-15 21:30:53'),(38,'2005-05-25 04:47:44',2540,302,'2005-06-01 00:58:44',1,'2006-02-15 21:30:53'),(39,'2005-05-25 04:51:46',4466,207,'2005-05-31 03:14:46',2,'2006-02-15 21:30:53'),(40,'2005-05-25 05:09:04',2638,413,'2005-05-27 23:12:04',1,'2006-02-15 21:30:53'),(41,'2005-05-25 05:12:29',1761,174,'2005-06-02 00:28:29',1,'2006-02-15 21:30:53'),(42,'2005-05-25 05:24:58',380,523,'2005-05-31 02:47:58',2,'2006-02-15 21:30:53'),(43,'2005-05-25 05:39:25',2578,532,'2005-05-26 06:54:25',2,'2006-02-15 21:30:53'),(44,'2005-05-25 05:53:23',3098,207,'2005-05-29 10:56:23',2,'2006-02-15 21:30:53'),(45,'2005-05-25 05:59:39',1853,436,'2005-06-02 09:56:39',2,'2006-02-15 21:30:53'),(46,'2005-05-25 06:04:08',3318,7,'2005-06-02 08:18:08',2,'2006-02-15 21:30:53'),(47,'2005-05-25 06:05:20',2211,35,'2005-05-30 03:04:20',1,'2006-02-15 21:30:53'),(48,'2005-05-25 06:20:46',1780,282,'2005-06-02 05:42:46',1,'2006-02-15 21:30:53'),(49,'2005-05-25 06:39:35',2965,498,'2005-05-30 10:12:35',2,'2006-02-15 21:30:53'),(50,'2005-05-25 06:44:53',1983,18,'2005-05-28 11:28:53',2,'2006-02-15 21:30:53'),(51,'2005-05-25 06:49:10',1257,256,'2005-05-26 06:42:10',1,'2006-02-15 21:30:53'),(52,'2005-05-25 06:51:29',4017,507,'2005-05-31 01:27:29',2,'2006-02-15 21:30:53'),(53,'2005-05-25 07:19:16',1255,569,'2005-05-27 05:19:16',2,'2006-02-15 21:30:53'),(54,'2005-05-25 07:23:25',2787,291,'2005-06-01 05:05:25',2,'2006-02-15 21:30:53'),(55,'2005-05-25 08:26:13',1139,131,'2005-05-30 10:57:13',1,'2006-02-15 21:30:53'),(56,'2005-05-25 08:28:11',1352,511,'2005-05-26 14:21:11',1,'2006-02-15 21:30:53'),(57,'2005-05-25 08:43:32',3938,6,'2005-05-29 06:42:32',2,'2006-02-15 21:30:53'),(58,'2005-05-25 08:53:14',3050,323,'2005-05-28 14:40:14',1,'2006-02-15 21:30:53'),(59,'2005-05-25 08:56:42',2884,408,'2005-06-01 09:52:42',1,'2006-02-15 21:30:53'),(60,'2005-05-25 08:58:25',330,470,'2005-05-30 14:14:25',1,'2006-02-15 21:30:53'),(61,'2005-05-25 09:01:57',4210,250,'2005-06-02 07:22:57',2,'2006-02-15 21:30:53'),(62,'2005-05-25 09:18:52',261,419,'2005-05-30 10:55:52',1,'2006-02-15 21:30:53'),(63,'2005-05-25 09:19:16',4008,383,'2005-05-27 04:24:16',1,'2006-02-15 21:30:53'),(64,'2005-05-25 09:21:29',79,368,'2005-06-03 11:31:29',1,'2006-02-15 21:30:53'),(65,'2005-05-25 09:32:03',3552,346,'2005-05-29 14:21:03',1,'2006-02-15 21:30:53'),(66,'2005-05-25 09:35:12',1162,86,'2005-05-29 04:16:12',2,'2006-02-15 21:30:53'),(67,'2005-05-25 09:41:01',239,119,'2005-05-27 13:46:01',2,'2006-02-15 21:30:53'),(68,'2005-05-25 09:47:31',4029,120,'2005-05-31 10:20:31',2,'2006-02-15 21:30:53'),(69,'2005-05-25 10:10:14',3207,305,'2005-05-27 14:02:14',2,'2006-02-15 21:30:53'),(70,'2005-05-25 10:15:23',2168,73,'2005-05-27 05:56:23',2,'2006-02-15 21:30:53'),(71,'2005-05-25 10:26:39',2408,100,'2005-05-28 04:59:39',1,'2006-02-15 21:30:53'),(72,'2005-05-25 10:52:13',2260,48,'2005-05-28 05:52:13',2,'2006-02-15 21:30:53'),(73,'2005-05-25 11:00:07',517,391,'2005-06-01 13:56:07',2,'2006-02-15 21:30:53'),(74,'2005-05-25 11:09:48',1744,265,'2005-05-26 12:23:48',2,'2006-02-15 21:30:53'),(75,'2005-05-25 11:13:34',3393,510,'2005-06-03 12:58:34',1,'2006-02-15 21:30:53'),(76,'2005-05-25 11:30:37',3021,1,'2005-06-03 12:00:37',2,'2006-02-15 21:30:53'),(77,'2005-05-25 11:31:59',1303,451,'2005-05-26 16:53:59',2,'2006-02-15 21:30:53'),(78,'2005-05-25 11:35:18',4067,135,'2005-05-31 12:48:18',2,'2006-02-15 21:30:53'),(79,'2005-05-25 12:11:07',3299,245,'2005-06-03 10:54:07',2,'2006-02-15 21:30:53'),(80,'2005-05-25 12:12:07',2478,314,'2005-05-31 17:46:07',2,'2006-02-15 21:30:53'),(81,'2005-05-25 12:15:19',2610,286,'2005-06-02 14:08:19',2,'2006-02-15 21:30:53'),(82,'2005-05-25 12:17:46',1388,427,'2005-06-01 10:48:46',1,'2006-02-15 21:30:53'),(83,'2005-05-25 12:30:15',466,131,'2005-05-27 15:40:15',1,'2006-02-15 21:30:53'),(84,'2005-05-25 12:36:30',1829,492,'2005-05-29 18:33:30',1,'2006-02-15 21:30:53'),(85,'2005-05-25 13:05:34',470,414,'2005-05-29 16:53:34',1,'2006-02-15 21:30:53'),(86,'2005-05-25 13:36:12',2275,266,'2005-05-30 14:53:12',1,'2006-02-15 21:30:53'),(87,'2005-05-25 13:52:43',1586,331,'2005-05-29 11:12:43',2,'2006-02-15 21:30:53'),(88,'2005-05-25 14:13:54',2221,53,'2005-05-29 09:32:54',2,'2006-02-15 21:30:53'),(89,'2005-05-25 14:28:29',2181,499,'2005-05-29 14:33:29',1,'2006-02-15 21:30:53'),(90,'2005-05-25 14:31:25',2984,25,'2005-06-01 10:07:25',1,'2006-02-15 21:30:53'),(91,'2005-05-25 14:57:22',139,267,'2005-06-01 18:32:22',1,'2006-02-15 21:30:53'),(92,'2005-05-25 15:38:46',775,302,'2005-05-31 13:40:46',2,'2006-02-15 21:30:53'),(93,'2005-05-25 15:54:16',4360,288,'2005-06-03 20:18:16',1,'2006-02-15 21:30:53'),(94,'2005-05-25 16:03:42',1675,197,'2005-05-30 14:23:42',1,'2006-02-15 21:30:53'),(95,'2005-05-25 16:12:52',178,400,'2005-06-02 18:55:52',2,'2006-02-15 21:30:53'),(96,'2005-05-25 16:32:19',3418,49,'2005-05-30 10:47:19',2,'2006-02-15 21:30:53'),(97,'2005-05-25 16:34:24',1283,263,'2005-05-28 12:13:24',2,'2006-02-15 21:30:53'),(98,'2005-05-25 16:48:24',2970,269,'2005-05-27 11:29:24',2,'2006-02-15 21:30:53'),(99,'2005-05-25 16:50:20',535,44,'2005-05-28 18:52:20',1,'2006-02-15 21:30:53'),(100,'2005-05-25 16:50:28',2599,208,'2005-06-02 22:11:28',1,'2006-02-15 21:30:53'),(101,'2005-05-25 17:17:04',617,468,'2005-05-31 19:47:04',1,'2006-02-15 21:30:53'),(102,'2005-05-25 17:22:10',373,343,'2005-05-31 19:47:10',1,'2006-02-15 21:30:53'),(103,'2005-05-25 17:30:42',3343,384,'2005-06-03 22:36:42',1,'2006-02-15 21:30:53'),(104,'2005-05-25 17:46:33',4281,310,'2005-05-27 15:20:33',1,'2006-02-15 21:30:53'),(105,'2005-05-25 17:54:12',794,108,'2005-05-30 12:03:12',2,'2006-02-15 21:30:53'),(106,'2005-05-25 18:18:19',3627,196,'2005-06-04 00:01:19',2,'2006-02-15 21:30:53'),(107,'2005-05-25 18:28:09',2833,317,'2005-06-03 22:46:09',2,'2006-02-15 21:30:53'),(108,'2005-05-25 18:30:05',3289,242,'2005-05-30 19:40:05',1,'2006-02-15 21:30:53'),(109,'2005-05-25 18:40:20',1044,503,'2005-05-29 20:39:20',2,'2006-02-15 21:30:53'),(110,'2005-05-25 18:43:49',4108,19,'2005-06-03 18:13:49',2,'2006-02-15 21:30:53'),(111,'2005-05-25 18:45:19',3725,227,'2005-05-28 17:18:19',1,'2006-02-15 21:30:53'),(112,'2005-05-25 18:57:24',2153,500,'2005-06-02 20:44:24',1,'2006-02-15 21:30:53'),(113,'2005-05-25 19:07:40',2963,93,'2005-05-27 22:16:40',2,'2006-02-15 21:30:53'),(114,'2005-05-25 19:12:42',4502,506,'2005-06-01 23:10:42',1,'2006-02-15 21:30:53'),(115,'2005-05-25 19:13:25',749,455,'2005-05-29 20:17:25',1,'2006-02-15 21:30:53'),(116,'2005-05-25 19:27:51',4453,18,'2005-05-26 16:23:51',1,'2006-02-15 21:30:53'),(117,'2005-05-25 19:30:46',4278,7,'2005-05-31 23:59:46',2,'2006-02-15 21:30:53'),(118,'2005-05-25 19:31:18',872,524,'2005-05-31 15:00:18',1,'2006-02-15 21:30:53'),(119,'2005-05-25 19:37:02',1359,51,'2005-05-29 23:51:02',2,'2006-02-15 21:30:53'),(120,'2005-05-25 19:37:47',37,365,'2005-06-01 23:29:47',2,'2006-02-15 21:30:53'),(121,'2005-05-25 19:41:29',1053,405,'2005-05-29 21:31:29',1,'2006-02-15 21:30:53'),(122,'2005-05-25 19:46:21',2908,273,'2005-06-02 19:07:21',1,'2006-02-15 21:30:53'),(123,'2005-05-25 20:26:42',1795,43,'2005-05-26 19:41:42',1,'2006-02-15 21:30:53'),(124,'2005-05-25 20:46:11',212,246,'2005-05-30 00:47:11',2,'2006-02-15 21:30:53'),(125,'2005-05-25 20:48:50',952,368,'2005-06-02 21:39:50',1,'2006-02-15 21:30:53'),(126,'2005-05-25 21:07:59',2047,439,'2005-05-28 18:51:59',1,'2006-02-15 21:30:53'),(127,'2005-05-25 21:10:40',2026,94,'2005-06-02 21:38:40',1,'2006-02-15 21:30:53'),(128,'2005-05-25 21:19:53',4322,40,'2005-05-29 23:34:53',1,'2006-02-15 21:30:53'),(129,'2005-05-25 21:20:03',4154,23,'2005-06-04 01:25:03',2,'2006-02-15 21:30:53'),(130,'2005-05-25 21:21:56',3990,56,'2005-05-30 22:41:56',2,'2006-02-15 21:30:53'),(131,'2005-05-25 21:42:46',815,325,'2005-05-30 23:25:46',2,'2006-02-15 21:30:53'),(132,'2005-05-25 21:46:54',3367,479,'2005-05-31 21:02:54',1,'2006-02-15 21:30:53'),(133,'2005-05-25 21:48:30',399,237,'2005-05-30 00:26:30',2,'2006-02-15 21:30:53'),(134,'2005-05-25 21:48:41',2272,222,'2005-06-02 18:28:41',1,'2006-02-15 21:30:53'),(135,'2005-05-25 21:58:58',103,304,'2005-06-03 17:50:58',1,'2006-02-15 21:30:53'),(136,'2005-05-25 22:02:30',2296,504,'2005-05-31 18:06:30',1,'2006-02-15 21:30:53'),(137,'2005-05-25 22:25:18',2591,560,'2005-06-01 02:30:18',2,'2006-02-15 21:30:53'),(138,'2005-05-25 22:48:22',4134,586,'2005-05-29 20:21:22',2,'2006-02-15 21:30:53'),(139,'2005-05-25 23:00:21',327,257,'2005-05-29 17:12:21',1,'2006-02-15 21:30:53'),(140,'2005-05-25 23:34:22',655,354,'2005-05-27 01:10:22',1,'2006-02-15 21:30:53'),(141,'2005-05-25 23:34:53',811,89,'2005-06-02 01:57:53',1,'2006-02-15 21:30:53'),(142,'2005-05-25 23:43:47',4407,472,'2005-05-29 00:46:47',2,'2006-02-15 21:30:53'),(143,'2005-05-25 23:45:52',847,297,'2005-05-27 21:41:52',2,'2006-02-15 21:30:53'),(144,'2005-05-25 23:49:56',1689,357,'2005-06-01 21:41:56',2,'2006-02-15 21:30:53'),(145,'2005-05-25 23:59:03',3905,82,'2005-05-31 02:56:03',1,'2006-02-15 21:30:53'),(146,'2005-05-26 00:07:11',1431,433,'2005-06-04 00:20:11',2,'2006-02-15 21:30:53'),(147,'2005-05-26 00:17:50',633,274,'2005-05-29 23:21:50',2,'2006-02-15 21:30:53'),(148,'2005-05-26 00:25:23',4252,142,'2005-06-01 19:29:23',2,'2006-02-15 21:30:53'),(149,'2005-05-26 00:28:05',1084,319,'2005-06-02 21:30:05',2,'2006-02-15 21:30:53'),(150,'2005-05-26 00:28:39',909,429,'2005-06-01 02:10:39',2,'2006-02-15 21:30:53'),(151,'2005-05-26 00:37:28',2942,14,'2005-05-30 06:28:28',1,'2006-02-15 21:30:53'),(152,'2005-05-26 00:41:10',2622,57,'2005-06-03 06:05:10',1,'2006-02-15 21:30:53'),(153,'2005-05-26 00:47:47',3888,348,'2005-05-27 21:28:47',1,'2006-02-15 21:30:53'),(154,'2005-05-26 00:55:56',1354,185,'2005-05-29 23:18:56',2,'2006-02-15 21:30:53'),(155,'2005-05-26 01:15:05',288,551,'2005-06-01 00:03:05',1,'2006-02-15 21:30:53'),(156,'2005-05-26 01:19:05',3193,462,'2005-05-27 23:43:05',1,'2006-02-15 21:30:53'),(157,'2005-05-26 01:25:21',887,344,'2005-05-26 21:17:21',2,'2006-02-15 21:30:53'),(158,'2005-05-26 01:27:11',2395,354,'2005-06-03 00:30:11',2,'2006-02-15 21:30:53'),(159,'2005-05-26 01:34:28',3453,505,'2005-05-29 04:00:28',1,'2006-02-15 21:30:53'),(160,'2005-05-26 01:46:20',1885,290,'2005-06-01 05:45:20',1,'2006-02-15 21:30:53'),(161,'2005-05-26 01:51:48',2941,182,'2005-05-27 05:42:48',1,'2006-02-15 21:30:53'),(162,'2005-05-26 02:02:05',1229,296,'2005-05-27 03:38:05',2,'2006-02-15 21:30:53'),(163,'2005-05-26 02:26:23',2306,104,'2005-06-04 06:36:23',1,'2006-02-15 21:30:53'),(164,'2005-05-26 02:26:49',1070,151,'2005-05-28 00:32:49',1,'2006-02-15 21:30:53'),(165,'2005-05-26 02:28:36',2735,33,'2005-06-02 03:21:36',1,'2006-02-15 21:30:53'),(166,'2005-05-26 02:49:11',3894,322,'2005-05-31 01:28:11',1,'2006-02-15 21:30:53'),(167,'2005-05-26 02:50:31',865,401,'2005-05-27 03:07:31',1,'2006-02-15 21:30:53'),(168,'2005-05-26 03:07:43',2714,469,'2005-06-02 02:09:43',2,'2006-02-15 21:30:53'),(169,'2005-05-26 03:09:30',1758,381,'2005-05-27 01:37:30',2,'2006-02-15 21:30:53'),(170,'2005-05-26 03:11:12',3688,107,'2005-06-02 03:53:12',1,'2006-02-15 21:30:53'),(171,'2005-05-26 03:14:15',4483,400,'2005-06-03 00:24:15',2,'2006-02-15 21:30:53'),(172,'2005-05-26 03:17:42',2873,176,'2005-05-29 04:11:42',2,'2006-02-15 21:30:53'),(173,'2005-05-26 03:42:10',3596,533,'2005-05-28 01:37:10',2,'2006-02-15 21:30:53'),(174,'2005-05-26 03:44:10',3954,552,'2005-05-28 07:13:10',2,'2006-02-15 21:30:53'),(175,'2005-05-26 03:46:26',4346,47,'2005-06-03 06:01:26',2,'2006-02-15 21:30:53'),(176,'2005-05-26 03:47:39',851,250,'2005-06-01 02:36:39',2,'2006-02-15 21:30:53'),(177,'2005-05-26 04:14:29',3545,548,'2005-06-01 08:16:29',2,'2006-02-15 21:30:53'),(178,'2005-05-26 04:21:46',1489,196,'2005-06-04 07:09:46',2,'2006-02-15 21:30:53'),(179,'2005-05-26 04:26:06',2575,19,'2005-06-03 10:06:06',1,'2006-02-15 21:30:53'),(180,'2005-05-26 04:46:23',2752,75,'2005-06-01 09:58:23',1,'2006-02-15 21:30:53'),(181,'2005-05-26 04:47:06',2417,587,'2005-05-29 06:34:06',2,'2006-02-15 21:30:53'),(182,'2005-05-26 04:49:17',4396,237,'2005-06-01 05:43:17',2,'2006-02-15 21:30:53'),(183,'2005-05-26 05:01:18',2877,254,'2005-06-01 09:04:18',1,'2006-02-15 21:30:53'),(184,'2005-05-26 05:29:49',1970,556,'2005-05-28 10:10:49',1,'2006-02-15 21:30:53'),(185,'2005-05-26 05:30:03',2598,125,'2005-06-02 09:48:03',2,'2006-02-15 21:30:53'),(186,'2005-05-26 05:32:52',1799,468,'2005-06-03 07:19:52',2,'2006-02-15 21:30:53'),(187,'2005-05-26 05:42:37',4004,515,'2005-06-04 00:38:37',1,'2006-02-15 21:30:53'),(188,'2005-05-26 05:47:12',3342,243,'2005-05-26 23:48:12',1,'2006-02-15 21:30:53'),(189,'2005-05-26 06:01:41',984,247,'2005-05-27 06:11:41',1,'2006-02-15 21:30:53'),(190,'2005-05-26 06:11:28',3962,533,'2005-06-01 09:44:28',1,'2006-02-15 21:30:53'),(191,'2005-05-26 06:14:06',4365,412,'2005-05-28 05:33:06',1,'2006-02-15 21:30:53'),(192,'2005-05-26 06:20:37',1897,437,'2005-06-02 10:57:37',1,'2006-02-15 21:30:53'),(193,'2005-05-26 06:41:48',3900,270,'2005-05-30 06:21:48',2,'2006-02-15 21:30:53'),(194,'2005-05-26 06:52:33',1337,29,'2005-05-30 04:08:33',2,'2006-02-15 21:30:53'),(195,'2005-05-26 06:52:36',506,564,'2005-05-31 02:47:36',2,'2006-02-15 21:30:53'),(196,'2005-05-26 06:55:58',190,184,'2005-05-27 10:54:58',1,'2006-02-15 21:30:53'),(197,'2005-05-26 06:59:21',4212,546,'2005-06-03 05:04:21',2,'2006-02-15 21:30:53'),(198,'2005-05-26 07:03:49',1789,54,'2005-06-04 11:45:49',1,'2006-02-15 21:30:53'),(199,'2005-05-26 07:11:58',2135,71,'2005-05-28 09:06:58',1,'2006-02-15 21:30:53'),(200,'2005-05-26 07:12:21',3926,321,'2005-05-31 12:07:21',1,'2006-02-15 21:30:53'),(201,'2005-05-26 07:13:45',776,444,'2005-06-04 02:02:45',2,'2006-02-15 21:30:53'),(202,'2005-05-26 07:27:36',674,20,'2005-06-02 03:52:36',1,'2006-02-15 21:30:53'),(203,'2005-05-26 07:27:57',3374,109,'2005-06-03 12:52:57',1,'2006-02-15 21:30:53'),(204,'2005-05-26 07:30:37',1842,528,'2005-05-30 08:11:37',1,'2006-02-15 21:30:53'),(205,'2005-05-26 07:59:37',303,114,'2005-05-29 09:43:37',2,'2006-02-15 21:30:53'),(206,'2005-05-26 08:01:54',1717,345,'2005-05-27 06:26:54',1,'2006-02-15 21:30:53'),(207,'2005-05-26 08:04:38',102,47,'2005-05-27 09:32:38',2,'2006-02-15 21:30:53'),(208,'2005-05-26 08:10:22',3669,274,'2005-05-27 03:55:22',1,'2006-02-15 21:30:53'),(209,'2005-05-26 08:14:01',729,379,'2005-05-27 09:00:01',1,'2006-02-15 21:30:53'),(210,'2005-05-26 08:14:15',1801,391,'2005-05-27 12:12:15',2,'2006-02-15 21:30:53'),(211,'2005-05-26 08:33:10',4005,170,'2005-05-28 14:09:10',1,'2006-02-15 21:30:53'),(212,'2005-05-26 08:34:41',764,59,'2005-05-30 12:46:41',2,'2006-02-15 21:30:53'),(213,'2005-05-26 08:44:08',1505,394,'2005-05-31 12:33:08',2,'2006-02-15 21:30:53'),(214,'2005-05-26 08:48:49',1453,98,'2005-05-31 04:06:49',2,'2006-02-15 21:30:53'),(215,'2005-05-26 09:02:47',679,197,'2005-05-28 09:45:47',2,'2006-02-15 21:30:53'),(216,'2005-05-26 09:17:43',1398,91,'2005-06-03 08:21:43',1,'2006-02-15 21:30:53'),(217,'2005-05-26 09:24:26',4395,121,'2005-05-31 03:24:26',2,'2006-02-15 21:30:53'),(218,'2005-05-26 09:27:09',2291,309,'2005-06-04 11:53:09',2,'2006-02-15 21:30:53'),(219,'2005-05-26 09:41:45',3074,489,'2005-05-28 04:40:45',1,'2006-02-15 21:30:53'),(220,'2005-05-26 10:06:49',1259,542,'2005-06-01 07:43:49',1,'2006-02-15 21:30:53'),(221,'2005-05-26 10:14:09',3578,143,'2005-05-29 05:57:09',1,'2006-02-15 21:30:53'),(222,'2005-05-26 10:14:38',2745,83,'2005-05-31 08:36:38',2,'2006-02-15 21:30:53'),(223,'2005-05-26 10:15:23',3121,460,'2005-05-30 11:43:23',1,'2006-02-15 21:30:53'),(224,'2005-05-26 10:18:27',4285,318,'2005-06-04 06:59:27',1,'2006-02-15 21:30:53'),(225,'2005-05-26 10:27:50',651,467,'2005-06-01 07:01:50',2,'2006-02-15 21:30:53'),(226,'2005-05-26 10:44:04',4181,221,'2005-05-31 13:26:04',2,'2006-02-15 21:30:53'),(227,'2005-05-26 10:51:46',214,301,'2005-05-30 07:24:46',1,'2006-02-15 21:30:53'),(228,'2005-05-26 10:54:28',511,571,'2005-06-04 09:39:28',1,'2006-02-15 21:30:53'),(229,'2005-05-26 11:19:20',1131,312,'2005-05-31 11:56:20',2,'2006-02-15 21:30:53'),(230,'2005-05-26 11:31:50',1085,58,'2005-05-30 15:22:50',1,'2006-02-15 21:30:53'),(231,'2005-05-26 11:31:59',4032,365,'2005-05-27 07:27:59',1,'2006-02-15 21:30:53'),(232,'2005-05-26 11:38:05',2945,256,'2005-05-27 08:42:05',2,'2006-02-15 21:30:53'),(233,'2005-05-26 11:43:44',715,531,'2005-05-28 17:28:44',2,'2006-02-15 21:30:53'),(234,'2005-05-26 11:47:20',1321,566,'2005-06-03 10:39:20',2,'2006-02-15 21:30:53'),(235,'2005-05-26 11:51:09',3537,119,'2005-06-04 09:36:09',1,'2006-02-15 21:30:53'),(236,'2005-05-26 11:53:49',1265,446,'2005-05-28 13:55:49',1,'2006-02-15 21:30:53'),(237,'2005-05-26 12:15:13',241,536,'2005-05-29 18:10:13',1,'2006-02-15 21:30:53'),(238,'2005-05-26 12:30:22',503,211,'2005-05-27 06:49:22',1,'2006-02-15 21:30:53'),(239,'2005-05-26 12:30:26',131,49,'2005-06-01 13:26:26',2,'2006-02-15 21:30:53'),(240,'2005-05-26 12:40:23',3420,103,'2005-06-04 07:22:23',1,'2006-02-15 21:30:53'),(241,'2005-05-26 12:49:01',4438,245,'2005-05-28 11:43:01',2,'2006-02-15 21:30:53'),(242,'2005-05-26 13:05:08',2095,214,'2005-06-02 15:26:08',1,'2006-02-15 21:30:53'),(243,'2005-05-26 13:06:05',1721,543,'2005-06-03 17:28:05',2,'2006-02-15 21:30:53'),(244,'2005-05-26 13:40:40',1041,257,'2005-05-31 11:58:40',1,'2006-02-15 21:30:53'),(245,'2005-05-26 13:46:59',3045,158,'2005-05-27 09:58:59',2,'2006-02-15 21:30:53'),(246,'2005-05-26 13:57:07',2829,240,'2005-05-29 10:12:07',2,'2006-02-15 21:30:53'),(247,'2005-05-26 14:01:05',4095,102,'2005-05-28 13:38:05',2,'2006-02-15 21:30:53'),(248,'2005-05-26 14:07:58',1913,545,'2005-05-31 14:03:58',2,'2006-02-15 21:30:53'),(249,'2005-05-26 14:19:09',2428,472,'2005-05-28 17:47:09',2,'2006-02-15 21:30:53'),(250,'2005-05-26 14:30:24',368,539,'2005-05-27 08:50:24',1,'2006-02-15 21:30:53'),(251,'2005-05-26 14:35:40',4352,204,'2005-05-29 17:17:40',1,'2006-02-15 21:30:53'),(252,'2005-05-26 14:39:53',1203,187,'2005-06-02 14:48:53',1,'2006-02-15 21:30:53'),(253,'2005-05-26 14:43:14',2969,416,'2005-05-27 12:21:14',1,'2006-02-15 21:30:53'),(254,'2005-05-26 14:43:48',1835,390,'2005-05-31 09:19:48',2,'2006-02-15 21:30:53'),(255,'2005-05-26 14:52:15',3264,114,'2005-05-27 12:45:15',1,'2006-02-15 21:30:53'),(256,'2005-05-26 15:20:58',3194,436,'2005-05-31 15:58:58',1,'2006-02-15 21:30:53'),(257,'2005-05-26 15:27:05',2570,373,'2005-05-29 16:25:05',2,'2006-02-15 21:30:53'),(258,'2005-05-26 15:28:14',3534,502,'2005-05-30 18:38:14',2,'2006-02-15 21:30:53'),(259,'2005-05-26 15:32:46',30,482,'2005-06-04 15:27:46',2,'2006-02-15 21:30:53'),(260,'2005-05-26 15:42:20',435,21,'2005-05-31 13:21:20',2,'2006-02-15 21:30:53'),(261,'2005-05-26 15:44:23',1369,414,'2005-06-02 09:47:23',2,'2006-02-15 21:30:53'),(262,'2005-05-26 15:46:56',4261,236,'2005-05-28 15:49:56',2,'2006-02-15 21:30:53'),(263,'2005-05-26 15:47:40',1160,449,'2005-05-30 10:07:40',2,'2006-02-15 21:30:53'),(264,'2005-05-26 16:00:49',2069,251,'2005-05-27 10:12:49',2,'2006-02-15 21:30:53'),(265,'2005-05-26 16:07:38',2276,303,'2005-06-01 14:20:38',1,'2006-02-15 21:30:53'),(266,'2005-05-26 16:08:05',3303,263,'2005-05-27 10:55:05',2,'2006-02-15 21:30:53'),(267,'2005-05-26 16:16:21',1206,417,'2005-05-30 16:53:21',2,'2006-02-15 21:30:53'),(268,'2005-05-26 16:19:08',1714,75,'2005-05-27 14:35:08',1,'2006-02-15 21:30:53'),(269,'2005-05-26 16:19:46',3501,322,'2005-05-27 15:59:46',2,'2006-02-15 21:30:53'),(270,'2005-05-26 16:20:56',207,200,'2005-06-03 12:40:56',2,'2006-02-15 21:30:53'),(271,'2005-05-26 16:22:01',2388,92,'2005-06-03 17:30:01',2,'2006-02-15 21:30:53'),(272,'2005-05-26 16:27:11',971,71,'2005-06-03 13:10:11',2,'2006-02-15 21:30:53'),(273,'2005-05-26 16:29:36',1590,193,'2005-05-29 18:49:36',2,'2006-02-15 21:30:53'),(274,'2005-05-26 16:48:51',656,311,'2005-06-03 18:17:51',1,'2006-02-15 21:30:53'),(275,'2005-05-26 17:09:53',1718,133,'2005-06-04 22:35:53',1,'2006-02-15 21:30:53'),(276,'2005-05-26 17:16:07',1221,58,'2005-06-03 12:59:07',1,'2006-02-15 21:30:53'),(277,'2005-05-26 17:32:11',1409,45,'2005-05-28 22:54:11',1,'2006-02-15 21:30:53'),(278,'2005-05-26 17:40:58',182,214,'2005-06-02 16:43:58',2,'2006-02-15 21:30:53'),(279,'2005-05-26 18:02:50',661,384,'2005-06-03 18:48:50',2,'2006-02-15 21:30:53'),(280,'2005-05-26 18:36:58',1896,167,'2005-05-27 23:42:58',1,'2006-02-15 21:30:53'),(281,'2005-05-26 18:49:35',1208,582,'2005-05-27 18:11:35',2,'2006-02-15 21:30:53'),(282,'2005-05-26 18:56:26',4486,282,'2005-06-01 16:32:26',2,'2006-02-15 21:30:53'),(283,'2005-05-26 19:05:05',3530,242,'2005-05-31 19:19:05',1,'2006-02-15 21:30:53'),(284,'2005-05-26 19:21:44',350,359,'2005-06-04 14:18:44',2,'2006-02-15 21:30:53'),(285,'2005-05-26 19:41:40',2486,162,'2005-05-31 16:58:40',2,'2006-02-15 21:30:53'),(286,'2005-05-26 19:44:51',314,371,'2005-06-04 18:00:51',2,'2006-02-15 21:30:53'),(287,'2005-05-26 19:44:54',3631,17,'2005-06-02 01:10:54',1,'2006-02-15 21:30:53'),(288,'2005-05-26 19:47:49',3546,82,'2005-06-03 20:53:49',2,'2006-02-15 21:30:53'),(289,'2005-05-26 20:01:09',2449,81,'2005-05-28 15:09:09',1,'2006-02-15 21:30:53'),(290,'2005-05-26 20:08:33',2776,429,'2005-05-30 00:32:33',1,'2006-02-15 21:30:53'),(291,'2005-05-26 20:20:47',485,577,'2005-06-03 02:06:47',2,'2006-02-15 21:30:53'),(292,'2005-05-26 20:22:12',4264,515,'2005-06-05 00:58:12',1,'2006-02-15 21:30:53'),(293,'2005-05-26 20:27:02',1828,158,'2005-06-03 16:45:02',2,'2006-02-15 21:30:53'),(294,'2005-05-26 20:29:57',2751,369,'2005-05-28 17:20:57',1,'2006-02-15 21:30:53'),(295,'2005-05-26 20:33:20',4030,65,'2005-05-27 18:23:20',2,'2006-02-15 21:30:53'),(296,'2005-05-26 20:35:19',3878,468,'2005-06-04 02:31:19',2,'2006-02-15 21:30:53'),(297,'2005-05-26 20:48:48',1594,48,'2005-05-27 19:52:48',2,'2006-02-15 21:30:53'),(298,'2005-05-26 20:52:26',1083,460,'2005-05-29 22:08:26',2,'2006-02-15 21:30:53'),(299,'2005-05-26 20:55:36',4376,448,'2005-05-28 00:25:36',2,'2006-02-15 21:30:53'),(300,'2005-05-26 20:57:00',249,47,'2005-06-05 01:34:00',2,'2006-02-15 21:30:53'),(301,'2005-05-26 21:06:14',3448,274,'2005-06-01 01:54:14',2,'2006-02-15 21:30:53'),(302,'2005-05-26 21:13:46',2921,387,'2005-06-03 15:49:46',2,'2006-02-15 21:30:53'),(303,'2005-05-26 21:16:52',1111,596,'2005-05-27 23:41:52',2,'2006-02-15 21:30:53'),(304,'2005-05-26 21:21:28',1701,534,'2005-06-02 00:05:28',1,'2006-02-15 21:30:53'),(305,'2005-05-26 21:22:07',2665,464,'2005-06-02 22:33:07',2,'2006-02-15 21:30:53'),(306,'2005-05-26 21:31:57',2781,547,'2005-05-28 19:37:57',1,'2006-02-15 21:30:53'),(307,'2005-05-26 21:48:13',1097,375,'2005-06-04 22:24:13',1,'2006-02-15 21:30:53'),(308,'2005-05-26 22:01:39',187,277,'2005-06-04 20:24:39',2,'2006-02-15 21:30:53'),(309,'2005-05-26 22:38:10',1946,251,'2005-06-02 03:10:10',2,'2006-02-15 21:30:53'),(310,'2005-05-26 22:41:07',593,409,'2005-06-02 04:09:07',1,'2006-02-15 21:30:53'),(311,'2005-05-26 22:51:37',2830,201,'2005-06-01 00:02:37',1,'2006-02-15 21:30:53'),(312,'2005-05-26 22:52:19',2008,143,'2005-06-02 18:14:19',2,'2006-02-15 21:30:53'),(313,'2005-05-26 22:56:19',4156,594,'2005-05-29 01:29:19',2,'2006-02-15 21:30:53'),(314,'2005-05-26 23:09:41',2851,203,'2005-05-28 22:49:41',2,'2006-02-15 21:30:53'),(315,'2005-05-26 23:12:55',2847,238,'2005-05-29 23:33:55',1,'2006-02-15 21:30:53'),(316,'2005-05-26 23:22:55',3828,249,'2005-05-29 23:25:55',2,'2006-02-15 21:30:53'),(317,'2005-05-26 23:23:56',26,391,'2005-06-01 19:56:56',2,'2006-02-15 21:30:53'),(318,'2005-05-26 23:37:39',2559,60,'2005-06-03 04:31:39',2,'2006-02-15 21:30:53'),(319,'2005-05-26 23:52:13',3024,77,'2005-05-30 18:55:13',1,'2006-02-15 21:30:53'),(320,'2005-05-27 00:09:24',1090,2,'2005-05-28 04:30:24',2,'2006-02-15 21:30:53'),(322,'2005-05-27 00:47:35',4556,496,'2005-06-02 00:32:35',1,'2006-02-15 21:30:53'),(323,'2005-05-27 00:49:27',2362,144,'2005-05-30 03:12:27',1,'2006-02-15 21:30:53'),(324,'2005-05-27 01:00:04',3364,292,'2005-05-30 04:27:04',1,'2006-02-15 21:30:53'),(325,'2005-05-27 01:09:55',2510,449,'2005-05-31 07:01:55',2,'2006-02-15 21:30:53'),(326,'2005-05-27 01:10:11',3979,432,'2005-06-04 20:25:11',2,'2006-02-15 21:30:53'),(327,'2005-05-27 01:18:57',2678,105,'2005-06-04 04:06:57',1,'2006-02-15 21:30:53'),(328,'2005-05-27 01:29:31',2524,451,'2005-06-01 02:27:31',1,'2006-02-15 21:30:53'),(329,'2005-05-27 01:57:14',2659,231,'2005-05-31 04:19:14',2,'2006-02-15 21:30:53'),(330,'2005-05-27 02:15:30',1536,248,'2005-06-04 05:09:30',2,'2006-02-15 21:30:53'),(331,'2005-05-27 02:22:26',1872,67,'2005-06-05 00:25:26',1,'2006-02-15 21:30:53'),(332,'2005-05-27 02:27:10',1529,299,'2005-06-03 01:26:10',2,'2006-02-15 21:30:53'),(333,'2005-05-27 02:52:21',4001,412,'2005-06-01 00:55:21',2,'2006-02-15 21:30:53'),(334,'2005-05-27 03:03:07',3973,194,'2005-05-29 03:54:07',1,'2006-02-15 21:30:53'),(335,'2005-05-27 03:07:10',1411,16,'2005-06-05 00:15:10',2,'2006-02-15 21:30:53'),(336,'2005-05-27 03:15:23',1811,275,'2005-05-29 22:43:23',1,'2006-02-15 21:30:53'),(337,'2005-05-27 03:22:30',751,19,'2005-06-02 03:27:30',1,'2006-02-15 21:30:53'),(338,'2005-05-27 03:42:52',2596,165,'2005-06-01 05:23:52',2,'2006-02-15 21:30:53'),(339,'2005-05-27 03:47:18',2410,516,'2005-06-04 05:46:18',2,'2006-02-15 21:30:53'),(340,'2005-05-27 03:55:25',946,209,'2005-06-04 07:57:25',2,'2006-02-15 21:30:53'),(341,'2005-05-27 04:01:42',4168,56,'2005-06-05 08:51:42',1,'2006-02-15 21:30:53'),(342,'2005-05-27 04:11:04',4019,539,'2005-05-29 01:28:04',2,'2006-02-15 21:30:53'),(343,'2005-05-27 04:13:41',3301,455,'2005-05-28 08:34:41',1,'2006-02-15 21:30:53'),(344,'2005-05-27 04:30:22',2327,236,'2005-05-29 10:13:22',2,'2006-02-15 21:30:53'),(345,'2005-05-27 04:32:25',1396,144,'2005-05-31 09:50:25',1,'2006-02-15 21:30:53'),(346,'2005-05-27 04:34:41',4319,14,'2005-06-05 04:24:41',2,'2006-02-15 21:30:53'),(347,'2005-05-27 04:40:33',1625,378,'2005-05-28 09:56:33',2,'2006-02-15 21:30:53'),(348,'2005-05-27 04:50:56',1825,473,'2005-06-01 04:43:56',1,'2006-02-15 21:30:53'),(349,'2005-05-27 04:53:11',2920,36,'2005-05-28 06:33:11',2,'2006-02-15 21:30:53'),(350,'2005-05-27 05:01:28',2756,9,'2005-06-04 05:01:28',2,'2006-02-15 21:30:53'),(351,'2005-05-27 05:39:03',3371,118,'2005-06-01 11:10:03',1,'2006-02-15 21:30:53'),(352,'2005-05-27 05:48:19',4369,157,'2005-05-29 09:05:19',1,'2006-02-15 21:30:53'),(353,'2005-05-27 06:03:39',3989,503,'2005-06-03 04:39:39',2,'2006-02-15 21:30:53'),(354,'2005-05-27 06:12:26',2058,452,'2005-06-01 06:48:26',1,'2006-02-15 21:30:53'),(355,'2005-05-27 06:15:33',141,446,'2005-06-01 02:50:33',2,'2006-02-15 21:30:53'),(356,'2005-05-27 06:32:30',2868,382,'2005-05-30 06:24:30',2,'2006-02-15 21:30:53'),(357,'2005-05-27 06:37:15',4417,198,'2005-05-30 07:04:15',2,'2006-02-15 21:30:53'),(358,'2005-05-27 06:43:59',1925,102,'2005-05-29 11:28:59',2,'2006-02-15 21:30:53'),(359,'2005-05-27 06:48:33',1156,152,'2005-05-29 03:55:33',1,'2006-02-15 21:30:53'),(360,'2005-05-27 06:51:14',3489,594,'2005-06-03 01:58:14',1,'2006-02-15 21:30:53'),(361,'2005-05-27 07:03:28',6,587,'2005-05-31 08:01:28',1,'2006-02-15 21:30:53'),(362,'2005-05-27 07:10:25',2324,147,'2005-06-01 08:34:25',1,'2006-02-15 21:30:53'),(363,'2005-05-27 07:14:00',4282,345,'2005-05-28 12:22:00',2,'2006-02-15 21:30:53'),(364,'2005-05-27 07:20:12',833,430,'2005-05-31 10:44:12',2,'2006-02-15 21:30:53'),(365,'2005-05-27 07:31:20',2887,167,'2005-06-04 04:46:20',1,'2006-02-15 21:30:53'),(366,'2005-05-27 07:33:54',360,134,'2005-06-04 01:55:54',2,'2006-02-15 21:30:53'),(367,'2005-05-27 07:37:02',3437,439,'2005-05-30 05:43:02',2,'2006-02-15 21:30:53'),(368,'2005-05-27 07:42:29',1247,361,'2005-06-04 11:20:29',2,'2006-02-15 21:30:53'),(369,'2005-05-27 07:46:49',944,508,'2005-06-01 06:20:49',2,'2006-02-15 21:30:53'),(370,'2005-05-27 07:49:43',3347,22,'2005-06-05 06:39:43',2,'2006-02-15 21:30:53'),(371,'2005-05-27 08:08:18',1235,295,'2005-06-05 03:05:18',2,'2006-02-15 21:30:53'),(372,'2005-05-27 08:13:58',4089,510,'2005-06-04 03:50:58',2,'2006-02-15 21:30:53'),(373,'2005-05-27 08:16:25',1649,464,'2005-06-01 11:41:25',1,'2006-02-15 21:30:53'),(374,'2005-05-27 08:26:30',4420,337,'2005-06-05 07:13:30',1,'2006-02-15 21:30:53'),(375,'2005-05-27 08:49:21',1815,306,'2005-06-04 14:11:21',1,'2006-02-15 21:30:53'),(376,'2005-05-27 08:58:15',3197,542,'2005-06-02 04:48:15',1,'2006-02-15 21:30:53'),(377,'2005-05-27 09:04:05',3012,170,'2005-06-02 03:36:05',2,'2006-02-15 21:30:53'),(378,'2005-05-27 09:23:22',2242,53,'2005-05-29 15:20:22',1,'2006-02-15 21:30:53'),(379,'2005-05-27 09:25:32',3462,584,'2005-06-02 06:19:32',1,'2006-02-15 21:30:53'),(380,'2005-05-27 09:34:39',1777,176,'2005-06-04 11:45:39',1,'2006-02-15 21:30:53'),(381,'2005-05-27 09:43:25',2748,371,'2005-05-31 12:00:25',1,'2006-02-15 21:30:53'),(382,'2005-05-27 10:12:00',4358,183,'2005-05-31 15:03:00',1,'2006-02-15 21:30:53'),(383,'2005-05-27 10:12:20',955,298,'2005-06-03 10:37:20',1,'2006-02-15 21:30:53'),(384,'2005-05-27 10:18:20',910,371,'2005-06-02 09:21:20',2,'2006-02-15 21:30:53'),(385,'2005-05-27 10:23:25',1565,213,'2005-05-30 15:27:25',2,'2006-02-15 21:30:53'),(386,'2005-05-27 10:26:31',1288,109,'2005-05-30 08:32:31',1,'2006-02-15 21:30:53'),(387,'2005-05-27 10:35:27',2684,506,'2005-06-01 13:37:27',2,'2006-02-15 21:30:53'),(388,'2005-05-27 10:37:27',434,28,'2005-05-30 05:45:27',1,'2006-02-15 21:30:53'),(389,'2005-05-27 10:45:41',691,500,'2005-06-05 06:22:41',2,'2006-02-15 21:30:53'),(390,'2005-05-27 11:02:26',3759,48,'2005-06-02 16:09:26',2,'2006-02-15 21:30:53'),(391,'2005-05-27 11:03:55',2193,197,'2005-06-01 11:59:55',2,'2006-02-15 21:30:53'),(392,'2005-05-27 11:14:42',263,359,'2005-06-01 14:28:42',2,'2006-02-15 21:30:53'),(393,'2005-05-27 11:18:25',145,251,'2005-05-28 07:10:25',2,'2006-02-15 21:30:53'),(394,'2005-05-27 11:26:11',1890,274,'2005-06-03 16:44:11',2,'2006-02-15 21:30:53'),(395,'2005-05-27 11:45:49',752,575,'2005-05-31 13:42:49',1,'2006-02-15 21:30:53'),(396,'2005-05-27 11:47:04',1020,112,'2005-05-29 10:14:04',1,'2006-02-15 21:30:53'),(397,'2005-05-27 12:29:02',4193,544,'2005-05-28 17:36:02',2,'2006-02-15 21:30:53'),(398,'2005-05-27 12:44:03',1686,422,'2005-06-02 08:19:03',1,'2006-02-15 21:30:53'),(399,'2005-05-27 12:48:38',553,204,'2005-05-29 15:27:38',1,'2006-02-15 21:30:53'),(400,'2005-05-27 12:51:44',258,249,'2005-05-31 08:34:44',2,'2006-02-15 21:30:53'),(401,'2005-05-27 12:57:55',2179,46,'2005-05-29 17:55:55',2,'2006-02-15 21:30:53'),(402,'2005-05-27 13:17:18',461,354,'2005-05-30 08:53:18',2,'2006-02-15 21:30:53'),(403,'2005-05-27 13:28:52',3983,424,'2005-05-29 11:47:52',2,'2006-02-15 21:30:53'),(404,'2005-05-27 13:31:51',1293,168,'2005-05-30 16:58:51',1,'2006-02-15 21:30:53'),(405,'2005-05-27 13:32:39',4090,272,'2005-06-05 18:53:39',2,'2006-02-15 21:30:53'),(406,'2005-05-27 13:46:46',2136,381,'2005-05-30 12:43:46',1,'2006-02-15 21:30:53'),(407,'2005-05-27 13:57:38',1077,44,'2005-05-31 18:23:38',1,'2006-02-15 21:30:53'),(408,'2005-05-27 13:57:39',1438,84,'2005-05-28 11:57:39',1,'2006-02-15 21:30:53'),(409,'2005-05-27 14:10:58',3652,220,'2005-06-02 10:40:58',2,'2006-02-15 21:30:53'),(410,'2005-05-27 14:11:22',4010,506,'2005-06-02 20:06:22',2,'2006-02-15 21:30:53'),(411,'2005-05-27 14:14:14',1434,388,'2005-06-03 17:39:14',1,'2006-02-15 21:30:53'),(412,'2005-05-27 14:17:23',1400,375,'2005-05-29 15:07:23',2,'2006-02-15 21:30:53'),(413,'2005-05-27 14:45:37',3516,307,'2005-06-03 11:11:37',1,'2006-02-15 21:30:53'),(414,'2005-05-27 14:48:20',1019,219,'2005-05-31 14:39:20',2,'2006-02-15 21:30:53'),(415,'2005-05-27 14:51:45',3698,304,'2005-05-28 19:07:45',2,'2006-02-15 21:30:53'),(416,'2005-05-27 15:02:10',2371,222,'2005-05-29 10:34:10',2,'2006-02-15 21:30:53'),(417,'2005-05-27 15:07:27',2253,475,'2005-05-29 20:01:27',2,'2006-02-15 21:30:53'),(418,'2005-05-27 15:13:17',3063,151,'2005-06-04 12:05:17',2,'2006-02-15 21:30:53'),(419,'2005-05-27 15:15:11',2514,77,'2005-06-02 11:53:11',1,'2006-02-15 21:30:53'),(420,'2005-05-27 15:19:38',619,93,'2005-06-03 15:07:38',2,'2006-02-15 21:30:53'),(421,'2005-05-27 15:30:13',2985,246,'2005-06-04 13:19:13',2,'2006-02-15 21:30:53'),(422,'2005-05-27 15:31:55',1152,150,'2005-06-01 11:47:55',2,'2006-02-15 21:30:53'),(423,'2005-05-27 15:32:57',1783,284,'2005-06-02 19:03:57',1,'2006-02-15 21:30:53'),(424,'2005-05-27 15:34:01',2815,35,'2005-06-05 09:44:01',1,'2006-02-15 21:30:53'),(425,'2005-05-27 15:51:30',1518,182,'2005-06-03 16:52:30',2,'2006-02-15 21:30:53'),(426,'2005-05-27 15:56:57',1103,522,'2005-06-05 11:45:57',1,'2006-02-15 21:30:53'),(427,'2005-05-27 16:10:04',1677,288,'2005-06-05 13:22:04',2,'2006-02-15 21:30:53'),(428,'2005-05-27 16:10:58',3349,161,'2005-05-31 17:24:58',2,'2006-02-15 21:30:53'),(429,'2005-05-27 16:21:26',129,498,'2005-06-05 20:23:26',2,'2006-02-15 21:30:53'),(430,'2005-05-27 16:22:10',1920,190,'2005-06-05 13:10:10',1,'2006-02-15 21:30:53'),(431,'2005-05-27 16:31:05',4507,334,'2005-06-05 11:29:05',1,'2006-02-15 21:30:53'),(432,'2005-05-27 16:40:29',1119,46,'2005-05-29 16:20:29',1,'2006-02-15 21:30:53'),(433,'2005-05-27 16:40:40',4364,574,'2005-05-30 19:55:40',2,'2006-02-15 21:30:53'),(434,'2005-05-27 16:54:27',3360,246,'2005-06-04 22:26:27',1,'2006-02-15 21:30:53'),(435,'2005-05-27 17:17:09',3328,3,'2005-06-02 11:20:09',2,'2006-02-15 21:30:53'),(436,'2005-05-27 17:21:04',4317,267,'2005-05-30 21:26:04',2,'2006-02-15 21:30:53'),(437,'2005-05-27 17:47:22',1800,525,'2005-06-05 14:22:22',2,'2006-02-15 21:30:53'),(438,'2005-05-27 17:52:34',4260,249,'2005-06-05 22:23:34',2,'2006-02-15 21:30:53'),(439,'2005-05-27 17:54:48',354,319,'2005-06-02 23:01:48',2,'2006-02-15 21:30:53'),(440,'2005-05-27 18:00:35',4452,314,'2005-05-29 16:15:35',1,'2006-02-15 21:30:53'),(441,'2005-05-27 18:11:05',1578,54,'2005-05-30 22:45:05',1,'2006-02-15 21:30:53'),(442,'2005-05-27 18:12:13',1457,403,'2005-05-30 12:30:13',2,'2006-02-15 21:30:53'),(443,'2005-05-27 18:35:20',2021,547,'2005-06-04 18:58:20',1,'2006-02-15 21:30:53'),(444,'2005-05-27 18:39:15',723,239,'2005-06-01 15:56:15',1,'2006-02-15 21:30:53'),(445,'2005-05-27 18:42:57',1757,293,'2005-05-30 22:35:57',2,'2006-02-15 21:30:53'),(446,'2005-05-27 18:48:41',1955,401,'2005-06-03 16:42:41',2,'2006-02-15 21:30:53'),(447,'2005-05-27 18:57:02',3890,133,'2005-06-05 18:38:02',1,'2006-02-15 21:30:53'),(448,'2005-05-27 19:03:08',2671,247,'2005-06-03 20:28:08',2,'2006-02-15 21:30:53'),(449,'2005-05-27 19:13:15',2469,172,'2005-06-04 01:08:15',2,'2006-02-15 21:30:53'),(450,'2005-05-27 19:18:54',1343,247,'2005-06-05 23:52:54',1,'2006-02-15 21:30:53'),(451,'2005-05-27 19:27:54',205,87,'2005-05-29 01:07:54',2,'2006-02-15 21:30:53'),(452,'2005-05-27 19:30:33',2993,127,'2005-05-30 20:53:33',2,'2006-02-15 21:30:53'),(453,'2005-05-27 19:31:16',4425,529,'2005-05-29 23:06:16',1,'2006-02-15 21:30:53'),(454,'2005-05-27 19:31:36',3499,575,'2005-05-30 15:46:36',1,'2006-02-15 21:30:53'),(455,'2005-05-27 19:43:29',3344,343,'2005-06-04 23:40:29',2,'2006-02-15 21:30:53'),(456,'2005-05-27 19:50:06',1699,92,'2005-06-02 22:14:06',1,'2006-02-15 21:30:53'),(457,'2005-05-27 19:52:29',2368,300,'2005-06-02 17:17:29',2,'2006-02-15 21:30:53'),(458,'2005-05-27 19:58:36',3350,565,'2005-06-06 00:51:36',1,'2006-02-15 21:30:53'),(459,'2005-05-27 20:00:04',597,468,'2005-05-29 22:47:04',1,'2006-02-15 21:30:53'),(460,'2005-05-27 20:02:03',4238,240,'2005-05-28 16:14:03',1,'2006-02-15 21:30:53'),(461,'2005-05-27 20:08:55',2077,447,'2005-06-01 14:32:55',1,'2006-02-15 21:30:53'),(462,'2005-05-27 20:10:36',2314,364,'2005-06-03 21:12:36',2,'2006-02-15 21:30:53'),(463,'2005-05-27 20:11:47',826,21,'2005-06-04 21:18:47',1,'2006-02-15 21:30:53'),(464,'2005-05-27 20:42:44',1313,193,'2005-05-30 00:49:44',2,'2006-02-15 21:30:53'),(465,'2005-05-27 20:44:36',20,261,'2005-06-02 02:43:36',1,'2006-02-15 21:30:53'),(466,'2005-05-27 20:57:07',1786,442,'2005-05-29 15:52:07',1,'2006-02-15 21:30:53'),(467,'2005-05-27 21:10:03',339,557,'2005-06-01 16:08:03',1,'2006-02-15 21:30:53'),(468,'2005-05-27 21:13:10',2656,101,'2005-06-04 15:26:10',2,'2006-02-15 21:30:53'),(469,'2005-05-27 21:14:26',4463,154,'2005-06-05 21:51:26',1,'2006-02-15 21:30:53'),(470,'2005-05-27 21:17:08',1613,504,'2005-06-04 17:47:08',1,'2006-02-15 21:30:53'),(471,'2005-05-27 21:32:42',2872,209,'2005-05-31 00:39:42',2,'2006-02-15 21:30:53'),(472,'2005-05-27 21:36:15',1338,528,'2005-05-29 21:07:15',1,'2006-02-15 21:30:53'),(473,'2005-05-27 21:36:34',802,105,'2005-06-05 17:02:34',1,'2006-02-15 21:30:53'),(474,'2005-05-27 22:11:56',1474,274,'2005-05-31 19:07:56',1,'2006-02-15 21:30:53'),(475,'2005-05-27 22:16:26',2520,159,'2005-05-28 19:58:26',1,'2006-02-15 21:30:53'),(476,'2005-05-27 22:31:36',2451,543,'2005-06-03 19:12:36',1,'2006-02-15 21:30:53'),(477,'2005-05-27 22:33:33',2437,161,'2005-06-02 18:35:33',2,'2006-02-15 21:30:53'),(478,'2005-05-27 22:38:20',424,557,'2005-05-31 18:39:20',2,'2006-02-15 21:30:53'),(479,'2005-05-27 22:39:10',2060,231,'2005-06-05 22:46:10',2,'2006-02-15 21:30:53'),(480,'2005-05-27 22:47:39',2108,220,'2005-06-04 21:17:39',2,'2006-02-15 21:30:53'),(481,'2005-05-27 22:49:27',72,445,'2005-05-30 17:46:27',2,'2006-02-15 21:30:53'),(482,'2005-05-27 22:53:02',4178,546,'2005-06-01 22:53:02',2,'2006-02-15 21:30:53'),(483,'2005-05-27 23:00:25',1510,32,'2005-05-28 21:30:25',1,'2006-02-15 21:30:53'),(484,'2005-05-27 23:26:45',3115,491,'2005-05-29 21:16:45',2,'2006-02-15 21:30:53'),(485,'2005-05-27 23:40:52',2392,105,'2005-05-28 22:40:52',2,'2006-02-15 21:30:53'),(486,'2005-05-27 23:51:12',1822,398,'2005-05-28 20:26:12',1,'2006-02-15 21:30:53'),(487,'2005-05-28 00:00:30',3774,569,'2005-05-28 19:18:30',2,'2006-02-15 21:30:53'),(488,'2005-05-28 00:07:50',393,168,'2005-06-03 22:30:50',2,'2006-02-15 21:30:53'),(489,'2005-05-28 00:09:12',1940,476,'2005-05-31 04:44:12',2,'2006-02-15 21:30:53'),(490,'2005-05-28 00:09:56',3524,95,'2005-05-30 22:32:56',2,'2006-02-15 21:30:53'),(491,'2005-05-28 00:13:35',1326,196,'2005-05-29 00:11:35',2,'2006-02-15 21:30:53'),(492,'2005-05-28 00:24:58',1999,228,'2005-05-28 22:34:58',1,'2006-02-15 21:30:53'),(493,'2005-05-28 00:34:11',184,501,'2005-05-30 18:40:11',1,'2006-02-15 21:30:53'),(494,'2005-05-28 00:39:31',1850,64,'2005-06-02 19:35:31',1,'2006-02-15 21:30:53'),(495,'2005-05-28 00:40:48',1007,526,'2005-05-29 06:07:48',1,'2006-02-15 21:30:53'),(496,'2005-05-28 00:43:41',1785,56,'2005-06-04 03:56:41',1,'2006-02-15 21:30:53'),(497,'2005-05-28 00:54:39',2636,20,'2005-06-03 20:47:39',2,'2006-02-15 21:30:53'),(498,'2005-05-28 01:01:21',458,287,'2005-05-30 21:20:21',2,'2006-02-15 21:30:53'),(499,'2005-05-28 01:05:07',2381,199,'2005-06-05 19:54:07',2,'2006-02-15 21:30:53'),(500,'2005-05-28 01:05:25',4500,145,'2005-05-31 20:04:25',1,'2006-02-15 21:30:53'),(501,'2005-05-28 01:09:36',601,162,'2005-05-30 06:14:36',2,'2006-02-15 21:30:53'),(502,'2005-05-28 01:34:43',3131,179,'2005-05-31 01:02:43',2,'2006-02-15 21:30:53'),(503,'2005-05-28 01:35:25',3005,288,'2005-05-28 22:12:25',2,'2006-02-15 21:30:53'),(504,'2005-05-28 02:05:34',2086,170,'2005-05-30 23:03:34',1,'2006-02-15 21:30:53'),(505,'2005-05-28 02:06:37',71,111,'2005-05-29 06:57:37',1,'2006-02-15 21:30:53'),(506,'2005-05-28 02:09:19',667,469,'2005-06-05 20:34:19',1,'2006-02-15 21:30:53'),(507,'2005-05-28 02:31:19',3621,421,'2005-06-02 05:07:19',2,'2006-02-15 21:30:53'),(508,'2005-05-28 02:40:50',4179,434,'2005-06-05 03:05:50',1,'2006-02-15 21:30:53'),(509,'2005-05-28 02:51:12',3416,147,'2005-05-31 06:27:12',1,'2006-02-15 21:30:53'),(510,'2005-05-28 02:52:14',4338,113,'2005-05-30 21:20:14',2,'2006-02-15 21:30:53'),(511,'2005-05-28 03:04:04',3827,296,'2005-06-03 04:58:04',1,'2006-02-15 21:30:53'),(512,'2005-05-28 03:07:50',2176,231,'2005-06-05 02:12:50',2,'2006-02-15 21:30:53'),(513,'2005-05-28 03:08:10',225,489,'2005-05-29 07:22:10',1,'2006-02-15 21:30:53'),(514,'2005-05-28 03:09:28',1697,597,'2005-06-05 00:49:28',2,'2006-02-15 21:30:53'),(515,'2005-05-28 03:10:10',3369,110,'2005-06-04 02:18:10',2,'2006-02-15 21:30:53'),(516,'2005-05-28 03:11:47',4357,400,'2005-06-04 02:19:47',1,'2006-02-15 21:30:53'),(517,'2005-05-28 03:17:57',234,403,'2005-05-29 06:33:57',1,'2006-02-15 21:30:53'),(518,'2005-05-28 03:18:02',4087,480,'2005-05-30 05:32:02',1,'2006-02-15 21:30:53'),(519,'2005-05-28 03:22:33',3564,245,'2005-06-03 05:06:33',1,'2006-02-15 21:30:53'),(520,'2005-05-28 03:27:37',3845,161,'2005-06-04 05:47:37',1,'2006-02-15 21:30:53'),(521,'2005-05-28 03:32:22',2397,374,'2005-05-28 22:37:22',1,'2006-02-15 21:30:53'),(522,'2005-05-28 03:33:20',3195,382,'2005-05-31 04:23:20',1,'2006-02-15 21:30:53'),(523,'2005-05-28 03:53:26',1905,138,'2005-05-31 05:58:26',2,'2006-02-15 21:30:53'),(524,'2005-05-28 03:57:28',1962,223,'2005-05-31 05:20:28',1,'2006-02-15 21:30:53'),(525,'2005-05-28 04:25:33',1817,14,'2005-06-06 04:18:33',1,'2006-02-15 21:30:53'),(526,'2005-05-28 04:27:37',1387,408,'2005-05-30 07:52:37',1,'2006-02-15 21:30:53'),(527,'2005-05-28 04:28:38',266,169,'2005-06-02 08:19:38',1,'2006-02-15 21:30:53'),(528,'2005-05-28 04:30:05',1655,359,'2005-06-03 10:01:05',2,'2006-02-15 21:30:53'),(529,'2005-05-28 04:34:17',2624,469,'2005-05-30 00:35:17',1,'2006-02-15 21:30:53'),(530,'2005-05-28 05:13:01',3332,312,'2005-06-01 10:21:01',2,'2006-02-15 21:30:53'),(531,'2005-05-28 05:23:38',1113,589,'2005-05-29 08:00:38',2,'2006-02-15 21:30:53'),(532,'2005-05-28 05:36:58',2793,120,'2005-06-02 01:50:58',1,'2006-02-15 21:30:53'),(533,'2005-05-28 06:14:46',4306,528,'2005-06-01 06:26:46',2,'2006-02-15 21:30:53'),(534,'2005-05-28 06:15:25',992,184,'2005-06-06 07:51:25',1,'2006-02-15 21:30:53'),(535,'2005-05-28 06:16:32',4209,307,'2005-05-31 02:48:32',1,'2006-02-15 21:30:53'),(536,'2005-05-28 06:17:33',2962,514,'2005-06-03 10:02:33',2,'2006-02-15 21:30:53'),(537,'2005-05-28 06:20:55',3095,315,'2005-06-05 11:48:55',2,'2006-02-15 21:30:53'),(538,'2005-05-28 06:21:05',2262,110,'2005-06-02 01:22:05',2,'2006-02-15 21:30:53'),(539,'2005-05-28 06:26:16',3427,161,'2005-05-30 02:02:16',1,'2006-02-15 21:30:53'),(540,'2005-05-28 06:40:25',3321,119,'2005-06-06 00:47:25',1,'2006-02-15 21:30:53'),(541,'2005-05-28 06:41:58',1662,535,'2005-06-02 09:12:58',2,'2006-02-15 21:30:53'),(542,'2005-05-28 06:42:13',4444,261,'2005-06-03 09:05:13',1,'2006-02-15 21:30:53'),(543,'2005-05-28 06:43:34',530,493,'2005-06-06 07:16:34',2,'2006-02-15 21:30:53'),(544,'2005-05-28 07:03:00',2964,311,'2005-06-06 06:23:00',1,'2006-02-15 21:30:53'),(545,'2005-05-28 07:10:20',1086,54,'2005-06-04 01:47:20',2,'2006-02-15 21:30:53'),(546,'2005-05-28 07:16:25',487,20,'2005-06-01 08:36:25',1,'2006-02-15 21:30:53'),(547,'2005-05-28 07:24:28',2065,506,'2005-06-06 01:31:28',2,'2006-02-15 21:30:53'),(548,'2005-05-28 07:34:56',3704,450,'2005-06-05 03:14:56',2,'2006-02-15 21:30:53'),(549,'2005-05-28 07:35:37',1818,159,'2005-06-02 09:08:37',1,'2006-02-15 21:30:53'),(550,'2005-05-28 07:39:16',3632,432,'2005-06-06 12:20:16',2,'2006-02-15 21:30:53'),(551,'2005-05-28 07:44:18',3119,315,'2005-06-02 12:55:18',2,'2006-02-15 21:30:53'),(552,'2005-05-28 07:53:38',23,106,'2005-06-04 12:45:38',2,'2006-02-15 21:30:53'),(553,'2005-05-28 08:14:44',1349,176,'2005-06-02 03:01:44',2,'2006-02-15 21:30:53'),(554,'2005-05-28 08:23:16',1951,376,'2005-05-31 03:29:16',2,'2006-02-15 21:30:53'),(555,'2005-05-28 08:31:14',4397,55,'2005-05-30 07:34:14',2,'2006-02-15 21:30:53'),(556,'2005-05-28 08:31:36',1814,22,'2005-06-06 07:29:36',2,'2006-02-15 21:30:53'),(557,'2005-05-28 08:36:22',158,444,'2005-06-03 10:42:22',2,'2006-02-15 21:30:53'),(558,'2005-05-28 08:38:43',4163,442,'2005-06-06 13:52:43',1,'2006-02-15 21:30:53'),(559,'2005-05-28 08:39:02',1227,572,'2005-06-05 08:38:02',2,'2006-02-15 21:30:53'),(560,'2005-05-28 08:53:02',644,463,'2005-06-04 12:27:02',2,'2006-02-15 21:30:53'),(561,'2005-05-28 08:54:06',928,77,'2005-06-05 05:54:06',1,'2006-02-15 21:30:53'),(562,'2005-05-28 09:01:21',3390,102,'2005-06-02 05:26:21',2,'2006-02-15 21:30:53'),(563,'2005-05-28 09:10:49',53,324,'2005-06-06 11:32:49',1,'2006-02-15 21:30:53'),(564,'2005-05-28 09:12:09',2973,282,'2005-05-29 05:07:09',1,'2006-02-15 21:30:53'),(565,'2005-05-28 09:26:31',1494,288,'2005-06-01 07:28:31',1,'2006-02-15 21:30:53'),(566,'2005-05-28 09:51:39',4330,253,'2005-06-05 09:35:39',1,'2006-02-15 21:30:53'),(567,'2005-05-28 09:56:20',3308,184,'2005-06-01 06:41:20',2,'2006-02-15 21:30:53'),(568,'2005-05-28 09:57:36',2232,155,'2005-05-31 15:44:36',1,'2006-02-15 21:30:53'),(569,'2005-05-28 10:12:41',4534,56,'2005-06-03 10:08:41',2,'2006-02-15 21:30:53'),(570,'2005-05-28 10:15:04',1122,21,'2005-05-30 08:32:04',1,'2006-02-15 21:30:53'),(571,'2005-05-28 10:17:41',4250,516,'2005-06-05 07:56:41',1,'2006-02-15 21:30:53'),(572,'2005-05-28 10:30:13',1899,337,'2005-06-02 05:04:13',2,'2006-02-15 21:30:53'),(573,'2005-05-28 10:35:23',4020,1,'2005-06-03 06:32:23',1,'2006-02-15 21:30:53'),(574,'2005-05-28 10:44:28',3883,76,'2005-06-04 11:42:28',1,'2006-02-15 21:30:53'),(575,'2005-05-28 10:56:09',4451,142,'2005-06-05 15:39:09',1,'2006-02-15 21:30:53'),(576,'2005-05-28 10:56:10',1866,588,'2005-06-04 13:15:10',2,'2006-02-15 21:30:53'),(577,'2005-05-28 11:09:14',375,6,'2005-06-01 13:27:14',2,'2006-02-15 21:30:53'),(578,'2005-05-28 11:15:48',2938,173,'2005-06-02 09:59:48',1,'2006-02-15 21:30:53'),(579,'2005-05-28 11:19:23',3481,181,'2005-06-02 13:51:23',1,'2006-02-15 21:30:53'),(580,'2005-05-28 11:19:53',3515,17,'2005-06-01 10:44:53',2,'2006-02-15 21:30:53'),(581,'2005-05-28 11:20:29',1380,186,'2005-06-04 12:37:29',2,'2006-02-15 21:30:53'),(582,'2005-05-28 11:33:46',4579,198,'2005-05-29 08:33:46',1,'2006-02-15 21:30:53'),(583,'2005-05-28 11:48:55',2679,386,'2005-06-04 07:09:55',2,'2006-02-15 21:30:53'),(584,'2005-05-28 11:49:00',1833,69,'2005-06-01 11:54:00',1,'2006-02-15 21:30:53'),(585,'2005-05-28 11:50:45',3544,490,'2005-06-03 15:35:45',2,'2006-02-15 21:30:53'),(586,'2005-05-28 12:03:00',898,77,'2005-05-29 13:16:00',1,'2006-02-15 21:30:53'),(587,'2005-05-28 12:05:33',1413,64,'2005-05-30 13:45:33',2,'2006-02-15 21:30:53'),(588,'2005-05-28 12:08:37',95,89,'2005-05-29 16:25:37',2,'2006-02-15 21:30:53'),(589,'2005-05-28 12:27:50',4231,308,'2005-06-03 07:15:50',2,'2006-02-15 21:30:53'),(590,'2005-05-28 13:06:50',473,462,'2005-06-02 09:18:50',1,'2006-02-15 21:30:53'),(591,'2005-05-28 13:11:04',377,19,'2005-05-29 17:20:04',2,'2006-02-15 21:30:53'),(592,'2005-05-28 13:21:08',638,244,'2005-05-29 16:55:08',1,'2006-02-15 21:30:53'),(593,'2005-05-28 13:33:23',1810,16,'2005-05-30 17:10:23',2,'2006-02-15 21:30:53'),(594,'2005-05-28 13:41:56',2766,538,'2005-05-30 12:00:56',1,'2006-02-15 21:30:53'),(595,'2005-05-28 13:59:54',595,294,'2005-06-05 15:16:54',1,'2006-02-15 21:30:53'),(596,'2005-05-28 14:00:03',821,589,'2005-05-29 17:10:03',1,'2006-02-15 21:30:53'),(597,'2005-05-28 14:01:02',4469,249,'2005-06-06 19:06:02',2,'2006-02-15 21:30:53'),(598,'2005-05-28 14:04:50',599,159,'2005-06-03 18:00:50',2,'2006-02-15 21:30:53'),(599,'2005-05-28 14:05:57',4136,393,'2005-06-01 16:41:57',2,'2006-02-15 21:30:53'),(600,'2005-05-28 14:08:19',1567,332,'2005-06-03 11:57:19',2,'2006-02-15 21:30:53'),(601,'2005-05-28 14:08:22',3225,429,'2005-06-04 10:50:22',1,'2006-02-15 21:30:53'),(602,'2005-05-28 14:15:54',1300,590,'2005-06-05 15:16:54',2,'2006-02-15 21:30:53'),(603,'2005-05-28 14:27:51',3248,537,'2005-05-29 13:13:51',1,'2006-02-15 21:30:53'),(604,'2005-05-28 14:37:07',1585,426,'2005-06-03 11:03:07',2,'2006-02-15 21:30:53'),(605,'2005-05-28 14:39:10',4232,501,'2005-06-01 09:28:10',2,'2006-02-15 21:30:53'),(606,'2005-05-28 14:48:39',3509,299,'2005-06-04 09:44:39',2,'2006-02-15 21:30:53'),(607,'2005-05-28 15:02:41',2561,554,'2005-05-30 12:54:41',2,'2006-02-15 21:30:53'),(608,'2005-05-28 15:03:44',4254,494,'2005-06-04 17:14:44',2,'2006-02-15 21:30:53'),(609,'2005-05-28 15:04:02',2944,150,'2005-06-05 14:47:02',2,'2006-02-15 21:30:53'),(610,'2005-05-28 15:15:25',3642,500,'2005-06-02 12:30:25',2,'2006-02-15 21:30:53'),(611,'2005-05-28 15:18:18',1230,580,'2005-05-31 20:15:18',2,'2006-02-15 21:30:53'),(612,'2005-05-28 15:24:54',2180,161,'2005-05-30 14:22:54',2,'2006-02-15 21:30:53'),(613,'2005-05-28 15:27:22',270,595,'2005-06-02 20:01:22',1,'2006-02-15 21:30:53'),(614,'2005-05-28 15:33:28',280,307,'2005-06-04 12:27:28',2,'2006-02-15 21:30:53'),(615,'2005-05-28 15:35:52',3397,533,'2005-06-03 17:35:52',2,'2006-02-15 21:30:53'),(616,'2005-05-28 15:45:39',989,471,'2005-06-02 09:55:39',1,'2006-02-15 21:30:53'),(617,'2005-05-28 15:49:14',4142,372,'2005-05-31 14:29:14',2,'2006-02-15 21:30:53'),(618,'2005-05-28 15:50:07',4445,248,'2005-06-01 19:45:07',1,'2006-02-15 21:30:53'),(619,'2005-05-28 15:52:26',2482,407,'2005-06-06 17:55:26',2,'2006-02-15 21:30:53'),(620,'2005-05-28 15:54:45',2444,321,'2005-06-04 20:26:45',1,'2006-02-15 21:30:53'),(621,'2005-05-28 15:58:12',1144,239,'2005-05-30 21:54:12',1,'2006-02-15 21:30:53'),(622,'2005-05-28 15:58:22',2363,109,'2005-06-04 10:13:22',1,'2006-02-15 21:30:53'),(623,'2005-05-28 16:01:28',1222,495,'2005-05-30 11:19:28',1,'2006-02-15 21:30:53'),(624,'2005-05-28 16:13:22',3660,569,'2005-06-06 20:35:22',1,'2006-02-15 21:30:53'),(625,'2005-05-28 16:35:46',2889,596,'2005-06-01 14:19:46',1,'2006-02-15 21:30:53'),(626,'2005-05-28 16:58:09',452,584,'2005-06-01 14:02:09',2,'2006-02-15 21:30:53'),(627,'2005-05-28 17:04:43',425,241,'2005-06-04 19:58:43',2,'2006-02-15 21:30:53'),(628,'2005-05-28 17:05:46',2513,173,'2005-06-06 16:29:46',2,'2006-02-15 21:30:53'),(629,'2005-05-28 17:19:15',1527,94,'2005-06-02 20:01:15',2,'2006-02-15 21:30:53'),(630,'2005-05-28 17:24:51',1254,417,'2005-06-05 20:05:51',2,'2006-02-15 21:30:53'),(631,'2005-05-28 17:36:32',2465,503,'2005-06-03 14:56:32',2,'2006-02-15 21:30:53'),(632,'2005-05-28 17:37:50',1287,442,'2005-06-03 16:04:50',1,'2006-02-15 21:30:53'),(633,'2005-05-28 17:37:59',58,360,'2005-06-03 22:49:59',2,'2006-02-15 21:30:53'),(634,'2005-05-28 17:40:35',2630,428,'2005-06-05 16:18:35',2,'2006-02-15 21:30:53'),(635,'2005-05-28 17:46:57',1648,42,'2005-06-06 18:24:57',1,'2006-02-15 21:30:53'),(636,'2005-05-28 17:47:58',4213,239,'2005-06-04 16:32:58',1,'2006-02-15 21:30:53'),(637,'2005-05-28 18:14:29',1581,250,'2005-05-29 23:48:29',2,'2006-02-15 21:30:53'),(638,'2005-05-28 18:24:43',2685,372,'2005-06-02 19:03:43',2,'2006-02-15 21:30:53'),(639,'2005-05-28 18:25:02',4204,198,'2005-05-29 18:22:02',1,'2006-02-15 21:30:53'),(640,'2005-05-28 18:43:26',495,465,'2005-05-30 13:39:26',1,'2006-02-15 21:30:53'),(641,'2005-05-28 18:45:47',3548,396,'2005-06-04 15:24:47',1,'2006-02-15 21:30:53'),(642,'2005-05-28 18:49:12',140,157,'2005-06-01 20:50:12',2,'2006-02-15 21:30:53'),(643,'2005-05-28 18:52:11',3105,240,'2005-05-31 15:15:11',2,'2006-02-15 21:30:53'),(644,'2005-05-28 18:59:12',4304,316,'2005-06-04 18:06:12',1,'2006-02-15 21:30:53'),(645,'2005-05-28 19:14:09',3128,505,'2005-06-05 14:01:09',1,'2006-02-15 21:30:53'),(646,'2005-05-28 19:16:14',1922,185,'2005-05-31 16:50:14',2,'2006-02-15 21:30:53'),(647,'2005-05-28 19:22:52',3435,569,'2005-06-01 00:10:52',1,'2006-02-15 21:30:53'),(648,'2005-05-28 19:25:54',3476,253,'2005-06-03 15:57:54',2,'2006-02-15 21:30:53'),(649,'2005-05-28 19:35:45',1781,197,'2005-06-05 16:00:45',1,'2006-02-15 21:30:53'),(650,'2005-05-28 19:45:40',4384,281,'2005-05-29 21:02:40',1,'2006-02-15 21:30:53'),(651,'2005-05-28 19:46:50',739,266,'2005-05-30 16:29:50',1,'2006-02-15 21:30:53'),(652,'2005-05-28 20:08:47',1201,43,'2005-05-29 14:57:47',2,'2006-02-15 21:30:53'),(653,'2005-05-28 20:12:20',126,327,'2005-06-04 14:44:20',2,'2006-02-15 21:30:53'),(654,'2005-05-28 20:15:30',2312,23,'2005-05-30 22:02:30',2,'2006-02-15 21:30:53'),(655,'2005-05-28 20:16:20',331,287,'2005-05-31 16:46:20',2,'2006-02-15 21:30:53'),(656,'2005-05-28 20:18:24',2846,437,'2005-05-30 16:19:24',1,'2006-02-15 21:30:53'),(657,'2005-05-28 20:23:09',848,65,'2005-06-01 02:11:09',1,'2006-02-15 21:30:53'),(658,'2005-05-28 20:23:23',3226,103,'2005-06-06 19:31:23',2,'2006-02-15 21:30:53'),(659,'2005-05-28 20:27:53',1382,207,'2005-05-31 01:36:53',2,'2006-02-15 21:30:53'),(660,'2005-05-28 20:53:31',1414,578,'2005-05-30 15:26:31',1,'2006-02-15 21:30:53'),(661,'2005-05-28 21:01:25',2247,51,'2005-06-02 01:22:25',2,'2006-02-15 21:30:53'),(662,'2005-05-28 21:09:31',2968,166,'2005-06-01 19:00:31',2,'2006-02-15 21:30:53'),(663,'2005-05-28 21:23:02',3997,176,'2005-06-02 17:39:02',2,'2006-02-15 21:30:53'),(664,'2005-05-28 21:31:08',87,523,'2005-06-02 20:56:08',2,'2006-02-15 21:30:53'),(665,'2005-05-28 21:38:39',1012,415,'2005-05-29 21:37:39',1,'2006-02-15 21:30:53'),(666,'2005-05-28 21:48:51',3075,437,'2005-06-05 16:45:51',2,'2006-02-15 21:30:53'),(667,'2005-05-28 21:49:02',797,596,'2005-05-31 03:07:02',1,'2006-02-15 21:30:53'),(668,'2005-05-28 21:54:45',3528,484,'2005-05-29 22:32:45',1,'2006-02-15 21:30:53'),(669,'2005-05-28 22:03:25',3677,313,'2005-06-03 03:39:25',1,'2006-02-15 21:30:53'),(670,'2005-05-28 22:04:03',227,201,'2005-06-06 22:43:03',2,'2006-02-15 21:30:53'),(671,'2005-05-28 22:04:30',1027,14,'2005-06-03 01:21:30',2,'2006-02-15 21:30:53'),(672,'2005-05-28 22:05:29',697,306,'2005-06-06 02:10:29',2,'2006-02-15 21:30:53'),(673,'2005-05-28 22:07:30',1769,468,'2005-06-01 23:42:30',1,'2006-02-15 21:30:53'),(674,'2005-05-28 22:11:35',1150,87,'2005-06-01 23:58:35',2,'2006-02-15 21:30:53'),(675,'2005-05-28 22:22:44',1273,338,'2005-06-01 02:57:44',2,'2006-02-15 21:30:53'),(676,'2005-05-28 22:27:51',2329,490,'2005-05-29 20:36:51',2,'2006-02-15 21:30:53'),(677,'2005-05-28 23:00:08',4558,194,'2005-06-05 19:11:08',2,'2006-02-15 21:30:53'),(678,'2005-05-28 23:15:48',3741,269,'2005-06-03 04:43:48',2,'2006-02-15 21:30:53'),(679,'2005-05-28 23:24:57',907,526,'2005-06-06 21:59:57',2,'2006-02-15 21:30:53'),(680,'2005-05-28 23:27:26',4147,482,'2005-06-02 02:28:26',2,'2006-02-15 21:30:53'),(681,'2005-05-28 23:39:44',3346,531,'2005-06-01 01:42:44',1,'2006-02-15 21:30:53'),(682,'2005-05-28 23:53:18',3160,148,'2005-05-29 19:14:18',2,'2006-02-15 21:30:53'),(683,'2005-05-29 00:09:48',2038,197,'2005-06-02 04:27:48',1,'2006-02-15 21:30:53'),(684,'2005-05-29 00:13:15',3242,461,'2005-06-04 21:26:15',2,'2006-02-15 21:30:53'),(685,'2005-05-29 00:17:51',1385,172,'2005-06-05 05:32:51',2,'2006-02-15 21:30:53'),(686,'2005-05-29 00:27:10',2441,411,'2005-05-30 02:29:10',1,'2006-02-15 21:30:53'),(687,'2005-05-29 00:32:09',1731,250,'2005-05-31 23:53:09',1,'2006-02-15 21:30:53'),(688,'2005-05-29 00:45:24',4135,162,'2005-06-02 01:30:24',1,'2006-02-15 21:30:53'),(689,'2005-05-29 00:46:53',742,571,'2005-06-03 23:48:53',2,'2006-02-15 21:30:53'),(690,'2005-05-29 00:54:53',2646,85,'2005-06-06 00:45:53',1,'2006-02-15 21:30:53'),(691,'2005-05-29 01:01:26',4034,433,'2005-06-07 06:21:26',1,'2006-02-15 21:30:53'),(692,'2005-05-29 01:32:10',800,18,'2005-06-02 03:54:10',2,'2006-02-15 21:30:53'),(693,'2005-05-29 01:42:31',635,190,'2005-06-03 02:29:31',2,'2006-02-15 21:30:53'),(694,'2005-05-29 01:49:43',592,399,'2005-06-05 06:52:43',1,'2006-02-15 21:30:53'),(695,'2005-05-29 01:50:53',4276,528,'2005-06-03 02:28:53',1,'2006-02-15 21:30:53'),(696,'2005-05-29 01:59:10',2076,19,'2005-06-01 02:45:10',1,'2006-02-15 21:30:53'),(697,'2005-05-29 02:04:04',3949,387,'2005-06-04 00:47:04',2,'2006-02-15 21:30:53'),(698,'2005-05-29 02:10:52',1412,109,'2005-06-01 21:52:52',1,'2006-02-15 21:30:53'),(699,'2005-05-29 02:11:44',130,246,'2005-06-04 20:23:44',2,'2006-02-15 21:30:53'),(700,'2005-05-29 02:18:54',500,117,'2005-05-30 05:54:54',1,'2006-02-15 21:30:53'),(701,'2005-05-29 02:26:27',372,112,'2005-06-03 04:59:27',1,'2006-02-15 21:30:53'),(702,'2005-05-29 02:27:30',2556,475,'2005-05-30 01:52:30',2,'2006-02-15 21:30:53'),(703,'2005-05-29 02:29:36',1123,269,'2005-06-03 04:54:36',2,'2006-02-15 21:30:53'),(704,'2005-05-29 02:44:43',2628,330,'2005-06-06 01:51:43',2,'2006-02-15 21:30:53'),(705,'2005-05-29 02:48:52',2809,257,'2005-05-30 06:21:52',1,'2006-02-15 21:30:53'),(706,'2005-05-29 03:05:49',2278,60,'2005-06-04 22:48:49',1,'2006-02-15 21:30:53'),(707,'2005-05-29 03:18:19',819,252,'2005-05-30 02:45:19',1,'2006-02-15 21:30:53'),(708,'2005-05-29 03:23:47',3133,127,'2005-05-31 21:27:47',2,'2006-02-15 21:30:53'),(709,'2005-05-29 03:48:01',2459,479,'2005-06-06 05:21:01',1,'2006-02-15 21:30:53'),(710,'2005-05-29 03:48:36',194,518,'2005-06-03 05:03:36',1,'2006-02-15 21:30:53'),(711,'2005-05-29 03:49:03',4581,215,'2005-05-31 08:29:03',2,'2006-02-15 21:30:53'),(712,'2005-05-29 04:02:24',4191,313,'2005-05-30 03:09:24',2,'2006-02-15 21:30:53'),(713,'2005-05-29 04:10:17',3664,507,'2005-06-07 07:13:17',1,'2006-02-15 21:30:53'),(714,'2005-05-29 04:15:21',2010,452,'2005-06-01 23:05:21',2,'2006-02-15 21:30:53'),(715,'2005-05-29 04:22:41',2030,545,'2005-06-05 09:28:41',1,'2006-02-15 21:30:53'),(716,'2005-05-29 04:35:29',85,36,'2005-06-01 07:42:29',2,'2006-02-15 21:30:53'),(717,'2005-05-29 04:37:44',1383,412,'2005-05-30 05:48:44',2,'2006-02-15 21:30:53'),(718,'2005-05-29 04:52:23',1736,498,'2005-06-02 02:27:23',1,'2006-02-15 21:30:53'),(719,'2005-05-29 05:16:05',267,245,'2005-06-01 07:53:05',2,'2006-02-15 21:30:53'),(720,'2005-05-29 05:17:30',3687,480,'2005-06-06 02:47:30',2,'2006-02-15 21:30:53'),(721,'2005-05-29 05:28:47',1116,44,'2005-05-31 11:24:47',1,'2006-02-15 21:30:53'),(722,'2005-05-29 05:30:31',4540,259,'2005-06-06 04:51:31',1,'2006-02-15 21:30:53'),(723,'2005-05-29 05:34:44',3407,309,'2005-05-30 05:50:44',1,'2006-02-15 21:30:53'),(724,'2005-05-29 05:53:23',3770,416,'2005-06-05 04:01:23',2,'2006-02-15 21:30:53'),(725,'2005-05-29 06:03:41',4088,245,'2005-06-03 08:52:41',2,'2006-02-15 21:30:53'),(726,'2005-05-29 06:05:29',933,452,'2005-06-05 04:40:29',2,'2006-02-15 21:30:53'),(727,'2005-05-29 06:08:15',1629,484,'2005-05-30 07:16:15',1,'2006-02-15 21:30:53'),(728,'2005-05-29 06:12:38',242,551,'2005-06-03 07:41:38',1,'2006-02-15 21:30:53'),(729,'2005-05-29 06:35:13',1688,323,'2005-06-04 03:23:13',2,'2006-02-15 21:30:53'),(730,'2005-05-29 07:00:59',3473,197,'2005-06-06 01:17:59',1,'2006-02-15 21:30:53'),(731,'2005-05-29 07:25:16',4124,5,'2005-05-30 05:21:16',1,'2006-02-15 21:30:53'),(732,'2005-05-29 07:32:51',2530,447,'2005-05-30 10:08:51',2,'2006-02-15 21:30:53'),(733,'2005-05-29 07:35:21',2951,363,'2005-06-05 09:14:21',1,'2006-02-15 21:30:53'),(734,'2005-05-29 07:38:52',3084,538,'2005-06-03 10:17:52',2,'2006-02-15 21:30:53'),(735,'2005-05-29 08:08:13',3421,454,'2005-06-07 13:35:13',1,'2006-02-15 21:30:53'),(736,'2005-05-29 08:10:07',3689,276,'2005-06-05 10:21:07',2,'2006-02-15 21:30:53'),(737,'2005-05-29 08:11:31',769,589,'2005-06-04 11:18:31',2,'2006-02-15 21:30:53'),(738,'2005-05-29 08:20:08',2284,256,'2005-06-06 08:59:08',2,'2006-02-15 21:30:53'),(739,'2005-05-29 08:28:18',1183,84,'2005-06-06 09:21:18',2,'2006-02-15 21:30:53'),(740,'2005-05-29 08:30:36',600,89,'2005-06-04 12:47:36',2,'2006-02-15 21:30:53'),(741,'2005-05-29 08:35:49',3189,495,'2005-06-04 11:55:49',1,'2006-02-15 21:30:53'),(742,'2005-05-29 08:36:30',273,483,'2005-06-05 11:30:30',1,'2006-02-15 21:30:53'),(743,'2005-05-29 08:39:02',2528,548,'2005-06-06 08:42:02',2,'2006-02-15 21:30:53'),(744,'2005-05-29 09:13:08',3722,420,'2005-06-01 07:05:08',2,'2006-02-15 21:30:53'),(745,'2005-05-29 09:22:57',581,152,'2005-06-01 09:10:57',1,'2006-02-15 21:30:53'),(746,'2005-05-29 09:25:10',4272,130,'2005-06-02 04:20:10',2,'2006-02-15 21:30:53'),(747,'2005-05-29 09:26:34',1993,291,'2005-06-05 07:28:34',1,'2006-02-15 21:30:53'),(748,'2005-05-29 09:27:00',2803,7,'2005-06-03 04:25:00',1,'2006-02-15 21:30:53'),(749,'2005-05-29 09:33:33',1146,375,'2005-05-31 11:45:33',2,'2006-02-15 21:30:53'),(750,'2005-05-29 09:41:40',730,269,'2005-05-30 13:31:40',1,'2006-02-15 21:30:53'),(751,'2005-05-29 09:55:43',2711,53,'2005-06-02 04:54:43',1,'2006-02-15 21:30:53'),(752,'2005-05-29 10:14:15',1720,126,'2005-06-04 06:30:15',1,'2006-02-15 21:30:53'),(753,'2005-05-29 10:16:42',1021,135,'2005-06-05 08:52:42',2,'2006-02-15 21:30:53'),(754,'2005-05-29 10:18:59',734,281,'2005-06-04 05:03:59',2,'2006-02-15 21:30:53'),(755,'2005-05-29 10:26:29',3090,576,'2005-06-01 10:25:29',2,'2006-02-15 21:30:53'),(756,'2005-05-29 10:28:45',3152,201,'2005-06-04 12:50:45',1,'2006-02-15 21:30:53'),(757,'2005-05-29 10:29:47',1067,435,'2005-06-07 15:27:47',1,'2006-02-15 21:30:53'),(758,'2005-05-29 10:31:56',1191,563,'2005-06-01 14:53:56',2,'2006-02-15 21:30:53'),(759,'2005-05-29 10:57:57',2367,179,'2005-06-07 16:23:57',2,'2006-02-15 21:30:53'),(760,'2005-05-29 11:07:25',3250,77,'2005-06-02 14:16:25',1,'2006-02-15 21:30:53'),(761,'2005-05-29 11:09:01',2342,58,'2005-06-03 16:18:01',2,'2006-02-15 21:30:53'),(762,'2005-05-29 11:15:51',3683,146,'2005-06-06 07:48:51',1,'2006-02-15 21:30:53'),(763,'2005-05-29 11:32:15',2022,50,'2005-05-31 17:31:15',1,'2006-02-15 21:30:53'),(764,'2005-05-29 11:37:35',1069,149,'2005-05-31 16:47:35',1,'2006-02-15 21:30:53'),(765,'2005-05-29 11:38:34',515,69,'2005-06-02 17:04:34',1,'2006-02-15 21:30:53'),(766,'2005-05-29 11:47:02',2154,383,'2005-06-06 07:14:02',1,'2006-02-15 21:30:53'),(767,'2005-05-29 12:20:19',687,67,'2005-06-02 14:15:19',2,'2006-02-15 21:30:53'),(768,'2005-05-29 12:30:46',2895,566,'2005-06-07 09:00:46',2,'2006-02-15 21:30:53'),(769,'2005-05-29 12:51:44',1523,575,'2005-06-01 17:43:44',1,'2006-02-15 21:30:53'),(770,'2005-05-29 12:56:50',2491,405,'2005-06-07 15:54:50',2,'2006-02-15 21:30:53'),(771,'2005-05-29 12:59:14',353,476,'2005-06-01 16:05:14',2,'2006-02-15 21:30:53'),(772,'2005-05-29 13:08:06',3319,556,'2005-06-06 08:19:06',1,'2006-02-15 21:30:53'),(773,'2005-05-29 13:18:05',245,563,'2005-06-07 17:22:05',1,'2006-02-15 21:30:53'),(774,'2005-05-29 13:19:43',1188,575,'2005-06-01 18:51:43',1,'2006-02-15 21:30:53'),(775,'2005-05-29 13:23:26',1197,124,'2005-05-30 07:53:26',2,'2006-02-15 21:30:53'),(776,'2005-05-29 13:35:35',4339,113,'2005-06-03 17:33:35',1,'2006-02-15 21:30:53'),(777,'2005-05-29 14:07:58',451,360,'2005-06-03 08:41:58',2,'2006-02-15 21:30:53'),(778,'2005-05-29 14:09:53',1816,535,'2005-06-05 20:05:53',1,'2006-02-15 21:30:53'),(779,'2005-05-29 14:17:17',533,105,'2005-06-06 16:46:17',1,'2006-02-15 21:30:53'),(780,'2005-05-29 14:18:32',1919,300,'2005-06-06 20:14:32',1,'2006-02-15 21:30:53'),(781,'2005-05-29 14:23:58',88,313,'2005-05-30 17:44:58',1,'2006-02-15 21:30:53'),(782,'2005-05-29 14:38:57',2255,596,'2005-06-02 13:18:57',2,'2006-02-15 21:30:53'),(783,'2005-05-29 14:41:18',3046,53,'2005-06-06 10:39:18',2,'2006-02-15 21:30:53'),(784,'2005-05-29 14:44:22',2936,352,'2005-06-01 17:28:22',2,'2006-02-15 21:30:53'),(785,'2005-05-29 15:08:41',39,72,'2005-05-30 15:51:41',1,'2006-02-15 21:30:53'),(786,'2005-05-29 15:17:28',2637,439,'2005-06-07 10:07:28',2,'2006-02-15 21:30:53'),(787,'2005-05-29 16:03:03',3919,27,'2005-06-07 11:07:03',2,'2006-02-15 21:30:53'),(788,'2005-05-29 16:13:55',763,562,'2005-05-31 16:40:55',1,'2006-02-15 21:30:53'),(789,'2005-05-29 16:17:07',708,553,'2005-06-06 18:15:07',1,'2006-02-15 21:30:53'),(790,'2005-05-29 16:19:29',2858,593,'2005-06-02 17:22:29',2,'2006-02-15 21:30:53'),(791,'2005-05-29 16:30:42',1554,284,'2005-06-01 19:11:42',1,'2006-02-15 21:30:53'),(792,'2005-05-29 16:32:10',2841,261,'2005-05-31 18:01:10',1,'2006-02-15 21:30:53'),(793,'2005-05-29 16:44:08',379,528,'2005-06-06 19:21:08',2,'2006-02-15 21:30:53'),(794,'2005-05-29 16:44:11',1995,50,'2005-06-05 16:11:11',1,'2006-02-15 21:30:53'),(795,'2005-05-29 16:57:39',609,551,'2005-06-01 11:33:39',2,'2006-02-15 21:30:53'),(796,'2005-05-29 16:59:44',2697,26,'2005-06-03 16:22:44',2,'2006-02-15 21:30:53'),(797,'2005-05-29 17:12:17',1446,244,'2005-06-03 16:06:17',1,'2006-02-15 21:30:53'),(798,'2005-05-29 17:23:43',1102,134,'2005-06-01 13:06:43',2,'2006-02-15 21:30:53'),(799,'2005-05-29 17:24:48',1713,429,'2005-06-05 12:25:48',1,'2006-02-15 21:30:53'),(800,'2005-05-29 17:28:12',441,472,'2005-05-30 14:59:12',1,'2006-02-15 21:30:53'),(801,'2005-05-29 17:35:50',1642,402,'2005-06-04 17:05:50',2,'2006-02-15 21:30:53'),(802,'2005-05-29 17:38:59',785,350,'2005-05-31 22:42:59',2,'2006-02-15 21:30:53'),(803,'2005-05-29 17:52:30',1602,32,'2005-05-30 14:35:30',2,'2006-02-15 21:30:53'),(804,'2005-05-29 18:10:24',3909,171,'2005-06-06 22:53:24',1,'2006-02-15 21:30:53'),(805,'2005-05-29 18:18:18',3132,232,'2005-06-07 15:11:18',2,'2006-02-15 21:30:53'),(806,'2005-05-29 18:31:30',2386,435,'2005-05-31 00:18:30',2,'2006-02-15 21:30:53'),(807,'2005-05-29 18:50:50',2195,235,'2005-06-03 18:36:50',2,'2006-02-15 21:30:53'),(808,'2005-05-29 19:08:20',1928,104,'2005-06-06 20:32:20',2,'2006-02-15 21:30:53'),(809,'2005-05-29 19:10:20',2114,222,'2005-06-05 19:05:20',2,'2006-02-15 21:30:53'),(810,'2005-05-29 19:12:04',2533,346,'2005-06-04 21:12:04',2,'2006-02-15 21:30:53'),(811,'2005-05-29 19:30:42',4419,401,'2005-06-02 16:19:42',2,'2006-02-15 21:30:53'),(812,'2005-05-29 20:00:30',1099,225,'2005-05-30 19:43:30',2,'2006-02-15 21:30:53'),(813,'2005-05-29 20:14:34',4554,344,'2005-06-05 20:56:34',1,'2006-02-15 21:30:53'),(814,'2005-05-29 20:16:12',1572,134,'2005-06-07 17:47:12',1,'2006-02-15 21:30:53'),(815,'2005-05-29 20:24:28',3757,14,'2005-06-03 15:32:28',1,'2006-02-15 21:30:53'),(816,'2005-05-29 20:26:39',630,474,'2005-06-06 22:31:39',2,'2006-02-15 21:30:53'),(817,'2005-05-29 20:39:14',186,554,'2005-05-31 18:24:14',1,'2006-02-15 21:30:53'),(818,'2005-05-29 20:47:53',4106,321,'2005-06-02 23:18:53',2,'2006-02-15 21:30:53'),(819,'2005-05-29 21:00:32',623,511,'2005-06-02 15:15:32',2,'2006-02-15 21:30:53'),(820,'2005-05-29 21:07:22',2584,22,'2005-06-07 00:22:22',2,'2006-02-15 21:30:53'),(821,'2005-05-29 21:31:12',3380,348,'2005-06-04 22:49:12',1,'2006-02-15 21:30:53'),(822,'2005-05-29 21:36:00',2634,480,'2005-06-07 17:24:00',1,'2006-02-15 21:30:53'),(823,'2005-05-29 21:39:37',3249,441,'2005-05-30 22:06:37',1,'2006-02-15 21:30:53'),(824,'2005-05-29 21:45:32',3518,357,'2005-05-31 19:01:32',1,'2006-02-15 21:30:53'),(825,'2005-05-29 21:49:41',712,371,'2005-06-04 20:27:41',2,'2006-02-15 21:30:53'),(826,'2005-05-29 21:56:15',2263,207,'2005-06-08 03:18:15',1,'2006-02-15 21:30:53'),(827,'2005-05-29 21:58:43',62,573,'2005-06-06 00:54:43',1,'2006-02-15 21:30:53'),(828,'2005-05-29 22:14:55',2468,217,'2005-05-30 17:22:55',1,'2006-02-15 21:30:53'),(829,'2005-05-29 22:16:42',1684,371,'2005-06-06 01:38:42',1,'2006-02-15 21:30:53'),(830,'2005-05-29 22:43:55',3464,3,'2005-06-01 17:43:55',1,'2006-02-15 21:30:53'),(831,'2005-05-29 22:50:25',3912,509,'2005-06-06 02:27:25',1,'2006-02-15 21:30:53'),(832,'2005-05-29 22:51:20',1381,159,'2005-06-07 17:37:20',2,'2006-02-15 21:30:53'),(833,'2005-05-29 23:21:56',2898,417,'2005-06-02 18:40:56',1,'2006-02-15 21:30:53'),(834,'2005-05-29 23:24:30',3628,84,'2005-05-30 22:00:30',2,'2006-02-15 21:30:53'),(835,'2005-05-29 23:37:00',299,381,'2005-06-02 23:38:00',1,'2006-02-15 21:30:53'),(836,'2005-05-29 23:56:42',3140,368,'2005-05-31 04:11:42',2,'2006-02-15 21:30:53'),(837,'2005-05-30 00:02:08',977,172,'2005-06-02 05:31:08',2,'2006-02-15 21:30:53'),(838,'2005-05-30 00:27:57',2859,504,'2005-06-06 22:19:57',2,'2006-02-15 21:30:53'),(839,'2005-05-30 00:28:12',1886,337,'2005-06-08 02:43:12',1,'2006-02-15 21:30:53'),(840,'2005-05-30 00:28:41',4049,79,'2005-05-31 20:39:41',2,'2006-02-15 21:30:53'),(841,'2005-05-30 00:31:17',4318,387,'2005-06-02 19:14:17',1,'2006-02-15 21:30:53'),(842,'2005-05-30 00:32:04',2328,238,'2005-06-01 02:21:04',1,'2006-02-15 21:30:53'),(843,'2005-05-30 00:44:24',2214,313,'2005-05-31 00:58:24',2,'2006-02-15 21:30:53'),(844,'2005-05-30 00:58:20',536,429,'2005-06-01 00:38:20',1,'2006-02-15 21:30:53'),(845,'2005-05-30 01:17:25',2001,72,'2005-06-07 02:00:25',1,'2006-02-15 21:30:53'),(846,'2005-05-30 01:17:45',938,49,'2005-06-01 00:56:45',2,'2006-02-15 21:30:53'),(847,'2005-05-30 01:18:15',4387,380,'2005-06-06 20:20:15',2,'2006-02-15 21:30:53'),(848,'2005-05-30 01:19:53',1363,436,'2005-06-05 23:40:53',1,'2006-02-15 21:30:53'),(849,'2005-05-30 01:23:07',2424,449,'2005-06-07 01:50:07',1,'2006-02-15 21:30:53'),(850,'2005-05-30 01:35:12',2390,517,'2005-05-31 01:51:12',1,'2006-02-15 21:30:53'),(851,'2005-05-30 01:35:15',2780,530,'2005-06-06 07:27:15',1,'2006-02-15 21:30:53'),(852,'2005-05-30 01:36:57',1622,549,'2005-06-01 22:44:57',1,'2006-02-15 21:30:53'),(853,'2005-05-30 01:43:31',3693,122,'2005-06-01 02:05:31',1,'2006-02-15 21:30:53'),(854,'2005-05-30 01:56:11',921,369,'2005-06-01 06:34:11',2,'2006-02-15 21:30:53'),(855,'2005-05-30 02:00:28',2527,406,'2005-06-03 20:16:28',2,'2006-02-15 21:30:53'),(856,'2005-05-30 02:01:21',3969,53,'2005-06-07 03:25:21',1,'2006-02-15 21:30:53'),(857,'2005-05-30 02:01:23',2569,204,'2005-06-02 06:07:23',2,'2006-02-15 21:30:53'),(858,'2005-05-30 02:10:32',1258,358,'2005-06-01 04:42:32',1,'2006-02-15 21:30:53'),(859,'2005-05-30 02:36:20',3032,79,'2005-06-02 07:49:20',2,'2006-02-15 21:30:53'),(860,'2005-05-30 02:45:16',578,276,'2005-06-08 07:28:16',1,'2006-02-15 21:30:53'),(861,'2005-05-30 02:48:32',3711,502,'2005-06-06 05:43:32',1,'2006-02-15 21:30:53'),(862,'2005-05-30 03:09:11',1186,328,'2005-06-03 21:27:11',1,'2006-02-15 21:30:53'),(863,'2005-05-30 03:14:59',3999,379,'2005-06-05 04:34:59',2,'2006-02-15 21:30:53'),(864,'2005-05-30 03:27:17',2777,544,'2005-06-06 08:28:17',1,'2006-02-15 21:30:53'),(865,'2005-05-30 03:39:44',3183,154,'2005-06-07 08:10:44',2,'2006-02-15 21:30:53'),(866,'2005-05-30 03:43:54',2867,8,'2005-06-08 04:28:54',1,'2006-02-15 21:30:53'),(867,'2005-05-30 03:54:43',3389,99,'2005-06-01 22:59:43',1,'2006-02-15 21:30:53'),(868,'2005-05-30 04:19:55',3604,28,'2005-05-31 02:28:55',1,'2006-02-15 21:30:53'),(869,'2005-05-30 04:22:06',3399,296,'2005-06-03 09:18:06',2,'2006-02-15 21:30:53'),(870,'2005-05-30 04:25:47',2903,391,'2005-06-06 04:32:47',1,'2006-02-15 21:30:53'),(871,'2005-05-30 05:01:30',4573,303,'2005-06-04 06:22:30',2,'2006-02-15 21:30:53'),(872,'2005-05-30 05:03:04',3904,548,'2005-06-06 10:35:04',1,'2006-02-15 21:30:53'),(873,'2005-05-30 05:15:20',4568,375,'2005-06-07 00:49:20',2,'2006-02-15 21:30:53'),(874,'2005-05-30 05:36:21',363,52,'2005-06-01 09:32:21',1,'2006-02-15 21:30:53'),(875,'2005-05-30 05:38:24',1428,326,'2005-06-06 00:34:24',2,'2006-02-15 21:30:53'),(876,'2005-05-30 05:41:22',1471,339,'2005-06-07 09:06:22',2,'2006-02-15 21:30:53'),(877,'2005-05-30 05:48:59',886,9,'2005-06-02 09:30:59',1,'2006-02-15 21:30:53'),(878,'2005-05-30 05:49:13',4265,323,'2005-06-07 04:35:13',1,'2006-02-15 21:30:53'),(879,'2005-05-30 05:49:42',4021,482,'2005-06-05 01:45:42',2,'2006-02-15 21:30:53'),(880,'2005-05-30 06:12:33',1819,460,'2005-06-02 04:35:33',2,'2006-02-15 21:30:53'),(881,'2005-05-30 06:15:36',602,242,'2005-06-02 10:21:36',1,'2006-02-15 21:30:53'),(882,'2005-05-30 06:16:06',3841,477,'2005-06-02 11:57:06',1,'2006-02-15 21:30:53'),(883,'2005-05-30 06:21:05',2271,399,'2005-06-07 04:50:05',2,'2006-02-15 21:30:53'),(884,'2005-05-30 06:41:32',4079,17,'2005-05-31 07:39:32',1,'2006-02-15 21:30:53'),(885,'2005-05-30 06:54:28',646,62,'2005-06-03 07:03:28',2,'2006-02-15 21:30:53'),(886,'2005-05-30 06:54:51',4356,393,'2005-06-01 06:04:51',2,'2006-02-15 21:30:53'),(887,'2005-05-30 07:10:00',2727,16,'2005-06-01 06:48:00',2,'2006-02-15 21:30:53'),(888,'2005-05-30 07:13:14',387,128,'2005-06-06 09:50:14',1,'2006-02-15 21:30:53'),(889,'2005-05-30 07:14:53',1299,114,'2005-05-31 07:56:53',2,'2006-02-15 21:30:53'),(890,'2005-05-30 07:43:04',1464,349,'2005-06-01 11:26:04',1,'2006-02-15 21:30:53'),(891,'2005-05-30 07:43:12',2611,391,'2005-06-08 09:21:12',1,'2006-02-15 21:30:53'),(892,'2005-05-30 08:02:56',471,274,'2005-06-05 12:51:56',1,'2006-02-15 21:30:53'),(893,'2005-05-30 08:06:59',3260,502,'2005-06-07 08:23:59',2,'2006-02-15 21:30:53'),(894,'2005-05-30 08:31:31',1118,400,'2005-06-07 12:39:31',1,'2006-02-15 21:30:53'),(895,'2005-05-30 08:50:43',2744,192,'2005-06-05 10:58:43',1,'2006-02-15 21:30:53'),(896,'2005-05-30 09:03:52',2817,207,'2005-06-05 07:37:52',2,'2006-02-15 21:30:53'),(897,'2005-05-30 09:10:01',1334,432,'2005-06-08 03:43:01',1,'2006-02-15 21:30:53'),(898,'2005-05-30 09:26:19',3497,384,'2005-06-01 10:45:19',2,'2006-02-15 21:30:53'),(899,'2005-05-30 09:29:30',1096,156,'2005-06-06 12:39:30',2,'2006-02-15 21:30:53'),(900,'2005-05-30 09:38:41',3543,586,'2005-06-07 11:54:41',1,'2006-02-15 21:30:53'),(901,'2005-05-30 09:40:40',760,259,'2005-06-02 10:32:40',1,'2006-02-15 21:30:53'),(902,'2005-05-30 09:53:36',1514,561,'2005-06-07 12:10:36',1,'2006-02-15 21:30:53'),(903,'2005-05-30 10:11:29',2423,197,'2005-06-03 09:33:29',1,'2006-02-15 21:30:53'),(904,'2005-05-30 10:19:42',2466,44,'2005-06-05 04:58:42',2,'2006-02-15 21:30:53'),(905,'2005-05-30 10:25:00',4372,50,'2005-06-06 06:23:00',1,'2006-02-15 21:30:53'),(906,'2005-05-30 10:30:38',1862,549,'2005-06-07 06:44:38',2,'2006-02-15 21:30:53'),(907,'2005-05-30 10:37:27',3320,506,'2005-06-02 09:51:27',1,'2006-02-15 21:30:53'),(908,'2005-05-30 10:38:37',4427,85,'2005-06-03 09:56:37',1,'2006-02-15 21:30:53'),(909,'2005-05-30 10:43:38',3775,486,'2005-06-08 12:07:38',1,'2006-02-15 21:30:53'),(910,'2005-05-30 10:46:16',2601,374,'2005-06-04 13:32:16',1,'2006-02-15 21:30:53'),(911,'2005-05-30 10:50:22',1404,366,'2005-06-07 12:26:22',2,'2006-02-15 21:30:53'),(912,'2005-05-30 10:58:33',3200,390,'2005-05-31 09:31:33',2,'2006-02-15 21:30:53'),(913,'2005-05-30 11:04:58',3213,369,'2005-06-07 13:22:58',2,'2006-02-15 21:30:53'),(914,'2005-05-30 11:06:00',1393,596,'2005-06-04 06:07:00',2,'2006-02-15 21:30:53'),(915,'2005-05-30 11:20:27',1859,115,'2005-06-02 11:55:27',1,'2006-02-15 21:30:53'),(916,'2005-05-30 11:25:01',1290,6,'2005-05-31 09:06:01',1,'2006-02-15 21:30:53'),(917,'2005-05-30 11:27:06',3629,385,'2005-06-02 08:31:06',1,'2006-02-15 21:30:53'),(918,'2005-05-30 11:32:24',818,197,'2005-05-31 07:55:24',2,'2006-02-15 21:30:53'),(919,'2005-05-30 11:35:06',4052,374,'2005-06-02 13:16:06',2,'2006-02-15 21:30:53'),(920,'2005-05-30 11:44:01',3860,584,'2005-06-02 08:19:01',2,'2006-02-15 21:30:53'),(921,'2005-05-30 11:53:09',1827,508,'2005-06-03 10:00:09',2,'2006-02-15 21:30:53'),(922,'2005-05-30 11:55:55',2442,550,'2005-06-08 10:12:55',2,'2006-02-15 21:30:53'),(923,'2005-05-30 11:58:50',1884,37,'2005-06-05 09:57:50',1,'2006-02-15 21:30:53'),(924,'2005-05-30 12:10:59',3279,293,'2005-06-04 17:28:59',1,'2006-02-15 21:30:53'),(925,'2005-05-30 12:13:52',3203,137,'2005-06-02 14:41:52',2,'2006-02-15 21:30:53'),(926,'2005-05-30 12:15:54',4327,76,'2005-06-01 08:53:54',2,'2006-02-15 21:30:53'),(927,'2005-05-30 12:16:40',1158,167,'2005-05-31 16:20:40',2,'2006-02-15 21:30:53'),(928,'2005-05-30 12:27:14',246,79,'2005-06-05 13:56:14',2,'2006-02-15 21:30:53'),(929,'2005-05-30 12:32:39',4296,536,'2005-06-06 12:17:39',1,'2006-02-15 21:30:53'),(930,'2005-05-30 12:44:57',2835,141,'2005-06-04 10:53:57',2,'2006-02-15 21:30:53'),(931,'2005-05-30 12:53:01',3384,421,'2005-05-31 14:28:01',1,'2006-02-15 21:30:53'),(932,'2005-05-30 12:55:36',719,198,'2005-05-31 10:30:36',2,'2006-02-15 21:30:53'),(933,'2005-05-30 13:08:45',3672,66,'2005-06-01 18:56:45',1,'2006-02-15 21:30:53'),(934,'2005-05-30 13:24:46',3595,60,'2005-06-08 16:44:46',2,'2006-02-15 21:30:53'),(935,'2005-05-30 13:29:36',2421,256,'2005-06-02 11:08:36',1,'2006-02-15 21:30:53'),(936,'2005-05-30 13:52:49',901,469,'2005-06-07 16:56:49',1,'2006-02-15 21:30:53'),(937,'2005-05-30 14:47:31',1054,304,'2005-06-05 09:53:31',2,'2006-02-15 21:30:53'),(938,'2005-05-30 14:47:31',1521,46,'2005-06-04 10:10:31',2,'2006-02-15 21:30:53'),(939,'2005-05-30 14:49:34',1314,367,'2005-06-01 19:00:34',1,'2006-02-15 21:30:53'),(940,'2005-05-30 15:01:02',1278,534,'2005-06-01 18:26:02',1,'2006-02-15 21:30:53'),(941,'2005-05-30 15:02:25',3630,562,'2005-06-01 17:19:25',1,'2006-02-15 21:30:53'),(942,'2005-05-30 15:05:47',4279,473,'2005-06-08 15:59:47',2,'2006-02-15 21:30:53'),(943,'2005-05-30 15:20:19',3737,57,'2005-06-06 18:53:19',1,'2006-02-15 21:30:53'),(944,'2005-05-30 15:26:24',151,131,'2005-06-07 18:09:24',2,'2006-02-15 21:30:53'),(945,'2005-05-30 15:33:17',1441,357,'2005-06-02 15:02:17',2,'2006-02-15 21:30:53'),(946,'2005-05-30 15:35:08',1264,486,'2005-06-08 11:38:08',1,'2006-02-15 21:30:53'),(947,'2005-05-30 15:36:57',4478,62,'2005-06-04 18:48:57',1,'2006-02-15 21:30:53'),(948,'2005-05-30 15:44:27',585,245,'2005-06-08 17:30:27',2,'2006-02-15 21:30:53'),(949,'2005-05-30 15:50:39',2202,368,'2005-06-03 14:25:39',1,'2006-02-15 21:30:53'),(950,'2005-05-30 16:06:08',491,83,'2005-06-01 11:43:08',1,'2006-02-15 21:30:53'),(951,'2005-05-30 16:10:35',1395,59,'2005-05-31 19:01:35',2,'2006-02-15 21:30:53'),(952,'2005-05-30 16:28:07',4389,311,'2005-06-02 16:12:07',2,'2006-02-15 21:30:53'),(953,'2005-05-30 16:34:02',2194,210,'2005-05-31 20:34:02',1,'2006-02-15 21:30:53'),(954,'2005-05-30 16:57:29',1231,297,'2005-06-08 13:30:29',2,'2006-02-15 21:30:53'),(955,'2005-05-30 16:59:03',4140,301,'2005-05-31 11:58:03',2,'2006-02-15 21:30:53'),(956,'2005-05-30 17:30:28',647,296,'2005-06-07 13:54:28',2,'2006-02-15 21:30:53'),(957,'2005-05-30 17:53:29',4428,440,'2005-06-03 15:31:29',2,'2006-02-15 21:30:53'),(958,'2005-05-30 17:58:03',548,186,'2005-06-01 19:17:03',2,'2006-02-15 21:30:53'),(959,'2005-05-30 18:07:00',3108,535,'2005-06-02 14:37:00',2,'2006-02-15 21:30:53'),(960,'2005-05-30 18:13:23',1966,445,'2005-06-04 00:12:23',2,'2006-02-15 21:30:53'),(961,'2005-05-30 18:16:44',3293,588,'2005-06-04 23:40:44',2,'2006-02-15 21:30:53'),(962,'2005-05-30 18:45:17',4535,520,'2005-06-05 22:47:17',1,'2006-02-15 21:30:53'),(963,'2005-05-30 18:52:53',1921,225,'2005-06-07 16:19:53',2,'2006-02-15 21:30:53'),(964,'2005-05-30 18:53:21',657,287,'2005-06-04 22:32:21',2,'2006-02-15 21:30:53'),(965,'2005-05-30 19:00:14',3363,502,'2005-05-31 17:10:14',2,'2006-02-15 21:30:53'),(966,'2005-05-30 19:00:37',1294,496,'2005-05-31 23:51:37',1,'2006-02-15 21:30:53'),(967,'2005-05-30 19:12:06',1954,330,'2005-06-09 00:02:06',2,'2006-02-15 21:30:53'),(968,'2005-05-30 19:20:03',119,576,'2005-05-31 18:17:03',2,'2006-02-15 21:30:53'),(969,'2005-05-30 19:23:48',443,551,'2005-05-31 21:14:48',1,'2006-02-15 21:30:53'),(970,'2005-05-30 19:50:28',1520,307,'2005-06-09 01:19:28',1,'2006-02-15 21:30:53'),(971,'2005-05-30 20:10:52',2911,561,'2005-06-06 20:47:52',1,'2006-02-15 21:30:53'),(972,'2005-05-30 20:21:07',2,411,'2005-06-06 00:36:07',1,'2006-02-15 21:30:53'),(973,'2005-05-30 20:27:45',1914,473,'2005-06-08 22:47:45',2,'2006-02-15 21:30:53'),(974,'2005-05-30 20:28:42',2617,596,'2005-06-08 23:45:42',2,'2006-02-15 21:30:53'),(975,'2005-05-30 21:07:15',3109,7,'2005-06-03 01:48:15',2,'2006-02-15 21:30:53'),(976,'2005-05-30 21:11:19',2290,581,'2005-06-06 02:16:19',2,'2006-02-15 21:30:53'),(977,'2005-05-30 21:22:26',2029,394,'2005-06-04 22:32:26',2,'2006-02-15 21:30:53'),(978,'2005-05-30 21:30:52',407,154,'2005-06-07 16:22:52',1,'2006-02-15 21:30:53'),(979,'2005-05-30 21:37:11',3917,279,'2005-06-08 00:24:11',2,'2006-02-15 21:30:53'),(980,'2005-05-30 21:45:19',4169,273,'2005-06-01 20:32:19',1,'2006-02-15 21:30:53'),(981,'2005-05-30 21:52:42',2913,326,'2005-06-01 03:15:42',2,'2006-02-15 21:30:53'),(982,'2005-05-30 22:15:24',3560,524,'2005-06-02 16:18:24',1,'2006-02-15 21:30:53'),(983,'2005-05-30 22:15:51',63,115,'2005-06-02 22:56:51',1,'2006-02-15 21:30:53'),(984,'2005-05-30 22:17:17',2305,262,'2005-06-01 20:15:17',2,'2006-02-15 21:30:53'),(985,'2005-05-30 22:18:35',1573,564,'2005-06-04 23:36:35',1,'2006-02-15 21:30:53'),(986,'2005-05-30 22:22:52',4045,253,'2005-06-01 02:24:52',1,'2006-02-15 21:30:53'),(987,'2005-05-30 22:59:12',390,11,'2005-06-07 20:56:12',1,'2006-02-15 21:30:53'),(988,'2005-05-30 23:08:03',1364,12,'2005-06-07 00:22:03',1,'2006-02-15 21:30:53'),(989,'2005-05-30 23:11:51',4388,83,'2005-06-03 20:36:51',2,'2006-02-15 21:30:53'),(990,'2005-05-30 23:25:14',4171,311,'2005-06-06 18:41:14',2,'2006-02-15 21:30:53'),(991,'2005-05-30 23:29:22',2863,593,'2005-06-07 23:16:22',1,'2006-02-15 21:30:53'),(992,'2005-05-30 23:47:56',3572,123,'2005-06-05 19:01:56',1,'2006-02-15 21:30:53'),(993,'2005-05-30 23:54:19',2080,513,'2005-06-04 21:27:19',1,'2006-02-15 21:30:53'),(994,'2005-05-30 23:55:36',2798,472,'2005-06-04 01:00:36',2,'2006-02-15 21:30:53'),(995,'2005-05-31 00:06:02',17,150,'2005-06-06 02:30:02',2,'2006-02-15 21:30:53'),(996,'2005-05-31 00:06:20',2075,331,'2005-05-31 21:29:20',2,'2006-02-15 21:30:53'),(997,'2005-05-31 00:08:25',4243,216,'2005-06-02 00:17:25',2,'2006-02-15 21:30:53'),(998,'2005-05-31 00:16:57',3395,389,'2005-06-01 22:41:57',1,'2006-02-15 21:30:53'),(999,'2005-05-31 00:25:10',4433,413,'2005-06-03 06:05:10',2,'2006-02-15 21:30:53'),(1000,'2005-05-31 00:25:56',1774,332,'2005-06-08 19:42:56',2,'2006-02-15 21:30:53'),(1001,'2005-05-31 00:46:31',1498,64,'2005-06-06 06:14:31',2,'2006-02-15 21:30:53'),(1002,'2005-05-31 00:47:56',709,397,'2005-06-06 19:51:56',1,'2006-02-15 21:30:53'),(1003,'2005-05-31 00:48:20',133,161,'2005-06-02 04:53:20',2,'2006-02-15 21:30:53'),(1004,'2005-05-31 00:48:36',1588,565,'2005-06-01 20:56:36',1,'2006-02-15 21:30:53'),(1005,'2005-05-31 00:53:25',4006,551,'2005-06-04 01:21:25',2,'2006-02-15 21:30:53'),(1006,'2005-05-31 00:57:08',3461,222,'2005-06-02 22:35:08',1,'2006-02-15 21:30:53'),(1007,'2005-05-31 01:02:28',3185,24,'2005-06-07 01:36:28',2,'2006-02-15 21:30:53'),(1008,'2005-05-31 01:18:56',914,599,'2005-06-01 01:24:56',2,'2006-02-15 21:30:53'),(1009,'2005-05-31 01:47:35',2523,485,'2005-06-03 20:26:35',1,'2006-02-15 21:30:53'),(1010,'2005-05-31 01:57:32',4038,49,'2005-06-01 06:50:32',2,'2006-02-15 21:30:53'),(1011,'2005-05-31 02:05:39',118,164,'2005-06-04 21:27:39',2,'2006-02-15 21:30:53'),(1012,'2005-05-31 02:18:05',688,291,'2005-06-03 06:47:05',1,'2006-02-15 21:30:53'),(1013,'2005-05-31 02:37:00',4522,384,'2005-06-02 06:39:00',2,'2006-02-15 21:30:53'),(1014,'2005-05-31 02:39:16',766,280,'2005-06-01 06:03:16',2,'2006-02-15 21:30:53'),(1015,'2005-05-31 02:44:57',3702,526,'2005-06-07 23:01:57',2,'2006-02-15 21:30:53'),(1016,'2005-05-31 02:49:43',3423,204,'2005-06-04 03:48:43',1,'2006-02-15 21:30:53'),(1017,'2005-05-31 02:53:36',1242,16,'2005-06-03 05:04:36',1,'2006-02-15 21:30:53'),(1018,'2005-05-31 02:53:42',1930,594,'2005-06-03 00:47:42',2,'2006-02-15 21:30:53'),(1019,'2005-05-31 03:05:07',3975,279,'2005-06-03 08:34:07',1,'2006-02-15 21:30:53'),(1020,'2005-05-31 03:06:08',3402,138,'2005-06-02 08:57:08',2,'2006-02-15 21:30:53'),(1021,'2005-05-31 03:16:15',2724,541,'2005-06-08 06:43:15',2,'2006-02-15 21:30:53'),(1022,'2005-05-31 03:16:45',842,239,'2005-06-08 09:04:45',1,'2006-02-15 21:30:53'),(1023,'2005-05-31 03:26:50',2483,227,'2005-06-05 08:19:50',2,'2006-02-15 21:30:53'),(1024,'2005-05-31 03:30:19',2310,457,'2005-06-09 05:52:19',2,'2006-02-15 21:30:53'),(1025,'2005-05-31 03:41:37',1618,93,'2005-06-08 07:05:37',2,'2006-02-15 21:30:53'),(1026,'2005-05-31 03:45:26',632,107,'2005-06-06 22:30:26',2,'2006-02-15 21:30:53'),(1027,'2005-05-31 03:46:19',2718,55,'2005-06-09 03:50:19',1,'2006-02-15 21:30:53'),(1028,'2005-05-31 03:48:05',4479,51,'2005-06-01 03:51:05',1,'2006-02-15 21:30:53'),(1029,'2005-05-31 03:52:02',2082,50,'2005-06-06 08:10:02',1,'2006-02-15 21:30:53'),(1030,'2005-05-31 04:06:47',3948,267,'2005-06-02 02:59:47',1,'2006-02-15 21:30:53'),(1031,'2005-05-31 04:23:01',917,416,'2005-06-06 08:35:01',1,'2006-02-15 21:30:53'),(1032,'2005-05-31 04:28:43',2937,236,'2005-06-02 02:00:43',2,'2006-02-15 21:30:53'),(1033,'2005-05-31 04:50:07',14,25,'2005-06-02 01:53:07',1,'2006-02-15 21:30:53'),(1034,'2005-05-31 04:53:40',4117,293,'2005-06-09 08:25:40',2,'2006-02-15 21:30:53'),(1035,'2005-05-31 05:01:09',949,362,'2005-06-02 03:59:09',1,'2006-02-15 21:30:53'),(1036,'2005-05-31 05:21:10',2164,438,'2005-06-04 04:19:10',1,'2006-02-15 21:30:53'),(1037,'2005-05-31 05:22:25',810,569,'2005-06-09 04:52:25',1,'2006-02-15 21:30:53'),(1038,'2005-05-31 05:23:47',1253,385,'2005-06-02 03:57:47',2,'2006-02-15 21:30:53'),(1039,'2005-05-31 05:32:29',2479,124,'2005-06-01 06:04:29',2,'2006-02-15 21:30:53'),(1040,'2005-05-31 05:35:16',2546,270,'2005-06-09 04:14:16',1,'2006-02-15 21:30:53'),(1041,'2005-05-31 05:46:23',4432,272,'2005-06-06 09:50:23',2,'2006-02-15 21:30:53'),(1042,'2005-05-31 05:53:00',3155,506,'2005-06-01 05:24:00',1,'2006-02-15 21:30:53'),(1043,'2005-05-31 06:11:40',2322,412,'2005-06-08 09:15:40',2,'2006-02-15 21:30:53'),(1044,'2005-05-31 06:24:44',2574,70,'2005-06-03 04:51:44',1,'2006-02-15 21:30:53'),(1045,'2005-05-31 06:29:01',3470,594,'2005-06-09 04:31:01',1,'2006-02-15 21:30:53'),(1046,'2005-05-31 06:42:30',468,179,'2005-06-03 04:33:30',2,'2006-02-15 21:30:53'),(1047,'2005-05-31 06:45:57',1366,72,'2005-06-04 09:49:57',2,'2006-02-15 21:30:53'),(1048,'2005-05-31 06:49:53',2811,55,'2005-06-02 11:33:53',1,'2006-02-15 21:30:53'),(1049,'2005-05-31 06:57:04',3913,312,'2005-06-02 11:32:04',2,'2006-02-15 21:30:53'),(1050,'2005-05-31 07:01:27',726,303,'2005-06-03 07:50:27',2,'2006-02-15 21:30:53'),(1051,'2005-05-31 07:02:09',1025,246,'2005-06-03 01:32:09',1,'2006-02-15 21:30:53'),(1052,'2005-05-31 07:07:03',2157,156,'2005-06-05 09:38:03',1,'2006-02-15 21:30:53'),(1053,'2005-05-31 07:12:44',3734,196,'2005-06-04 12:33:44',1,'2006-02-15 21:30:53'),(1054,'2005-05-31 07:33:25',1575,126,'2005-06-02 01:40:25',2,'2006-02-15 21:30:53'),(1055,'2005-05-31 07:47:18',1639,108,'2005-06-03 01:57:18',1,'2006-02-15 21:30:53'),(1056,'2005-05-31 07:48:07',1591,519,'2005-06-05 08:51:07',2,'2006-02-15 21:30:53'),(1057,'2005-05-31 07:58:06',497,124,'2005-06-06 03:21:06',1,'2006-02-15 21:30:53'),(1058,'2005-05-31 08:04:17',40,116,'2005-06-03 11:12:17',2,'2006-02-15 21:30:53'),(1059,'2005-05-31 08:20:43',3041,241,'2005-06-04 09:05:43',2,'2006-02-15 21:30:53'),(1060,'2005-05-31 08:21:43',2676,570,'2005-06-09 04:02:43',2,'2006-02-15 21:30:53'),(1061,'2005-05-31 08:27:58',965,109,'2005-06-07 02:34:58',1,'2006-02-15 21:30:53'),(1062,'2005-05-31 08:38:20',2223,176,'2005-06-09 08:23:20',2,'2006-02-15 21:30:53'),(1063,'2005-05-31 08:44:29',2484,7,'2005-06-09 08:00:29',1,'2006-02-15 21:30:53'),(1064,'2005-05-31 08:50:07',2373,460,'2005-06-02 14:47:07',2,'2006-02-15 21:30:53'),(1065,'2005-05-31 08:54:56',3379,316,'2005-06-08 09:21:56',1,'2006-02-15 21:30:53'),(1066,'2005-05-31 09:07:33',2383,541,'2005-06-09 05:34:33',2,'2006-02-15 21:30:53'),(1067,'2005-05-31 09:12:13',2345,32,'2005-06-01 06:15:13',1,'2006-02-15 21:30:53'),(1068,'2005-05-31 09:32:15',150,443,'2005-06-01 11:20:15',1,'2006-02-15 21:30:53'),(1069,'2005-05-31 09:32:31',3057,251,'2005-06-08 10:19:31',2,'2006-02-15 21:30:53'),(1070,'2005-05-31 09:39:56',3170,228,'2005-06-05 10:23:56',1,'2006-02-15 21:30:53'),(1071,'2005-05-31 09:48:56',469,174,'2005-06-02 03:52:56',2,'2006-02-15 21:30:53'),(1072,'2005-05-31 09:52:50',2557,272,'2005-06-05 05:39:50',1,'2006-02-15 21:30:53'),(1073,'2005-05-31 09:55:04',522,146,'2005-06-07 03:55:04',1,'2006-02-15 21:30:53'),(1074,'2005-05-31 10:04:42',2508,503,'2005-06-02 15:27:42',2,'2006-02-15 21:30:53'),(1075,'2005-05-31 10:13:34',2279,9,'2005-06-09 08:11:34',1,'2006-02-15 21:30:53'),(1076,'2005-05-31 10:14:31',2551,214,'2005-06-05 10:13:31',2,'2006-02-15 21:30:53'),(1077,'2005-05-31 10:22:54',1986,24,'2005-06-02 12:21:54',1,'2006-02-15 21:30:53'),(1078,'2005-05-31 10:28:33',3682,230,'2005-06-03 14:45:33',2,'2006-02-15 21:30:53'),(1079,'2005-05-31 10:48:17',268,312,'2005-06-08 12:30:17',1,'2006-02-15 21:30:53'),(1080,'2005-05-31 10:55:26',3491,215,'2005-06-03 13:13:26',2,'2006-02-15 21:30:53'),(1081,'2005-05-31 10:56:32',4524,404,'2005-06-06 11:31:32',1,'2006-02-15 21:30:53'),(1082,'2005-05-31 11:02:01',4510,239,'2005-06-05 08:43:01',1,'2006-02-15 21:30:53'),(1083,'2005-05-31 11:04:48',2393,556,'2005-06-05 13:32:48',1,'2006-02-15 21:30:53'),(1084,'2005-05-31 11:10:17',4577,12,'2005-06-01 11:15:17',1,'2006-02-15 21:30:53'),(1085,'2005-05-31 11:15:43',301,5,'2005-06-07 12:02:43',1,'2006-02-15 21:30:53'),(1086,'2005-05-31 11:17:37',2909,549,'2005-06-06 13:58:37',2,'2006-02-15 21:30:53'),(1087,'2005-05-31 11:18:08',431,169,'2005-06-04 08:33:08',1,'2006-02-15 21:30:53'),(1088,'2005-05-31 11:35:13',3988,356,'2005-06-06 16:01:13',2,'2006-02-15 21:30:53'),(1089,'2005-05-31 11:38:29',3784,367,'2005-06-02 08:06:29',1,'2006-02-15 21:30:53'),(1090,'2005-05-31 12:03:44',3329,23,'2005-06-02 15:54:44',2,'2006-02-15 21:30:53'),(1091,'2005-05-31 12:11:04',3853,251,'2005-06-04 11:42:04',1,'2006-02-15 21:30:53'),(1092,'2005-05-31 12:15:57',4412,278,'2005-06-03 15:39:57',2,'2006-02-15 21:30:53'),(1093,'2005-05-31 12:32:26',2189,214,'2005-06-03 07:51:26',2,'2006-02-15 21:30:53'),(1094,'2005-05-31 13:03:49',3810,547,'2005-06-05 14:30:49',2,'2006-02-15 21:30:53'),(1095,'2005-05-31 13:15:41',4546,252,'2005-06-05 12:10:41',1,'2006-02-15 21:30:53'),(1096,'2005-05-31 13:30:49',1066,271,'2005-06-09 13:53:49',1,'2006-02-15 21:30:53'),(1097,'2005-05-31 13:38:42',2285,491,'2005-06-01 13:54:42',2,'2006-02-15 21:30:53'),(1098,'2005-05-31 13:51:48',1050,425,'2005-06-09 18:42:48',2,'2006-02-15 21:30:53'),(1099,'2005-05-31 13:54:48',924,269,'2005-06-05 13:04:48',2,'2006-02-15 21:30:53'),(1100,'2005-05-31 14:03:21',316,497,'2005-06-06 16:08:21',1,'2006-02-15 21:30:53'),(1101,'2005-05-31 14:13:59',1174,260,'2005-06-07 15:49:59',1,'2006-02-15 21:30:53'),(1102,'2005-05-31 14:20:29',2052,115,'2005-06-04 17:38:29',2,'2006-02-15 21:30:53'),(1103,'2005-05-31 14:24:18',3154,353,'2005-06-09 10:27:18',1,'2006-02-15 21:30:53'),(1104,'2005-05-31 14:30:01',1619,466,'2005-06-05 12:07:01',1,'2006-02-15 21:30:53'),(1105,'2005-05-31 14:33:56',1708,26,'2005-06-07 11:30:56',1,'2006-02-15 21:30:53'),(1106,'2005-05-31 14:36:52',4185,109,'2005-06-01 14:33:52',2,'2006-02-15 21:30:53'),(1107,'2005-05-31 15:04:05',3449,53,'2005-06-07 16:42:05',2,'2006-02-15 21:30:53'),(1108,'2005-05-31 15:05:12',2562,254,'2005-06-09 19:48:12',2,'2006-02-15 21:30:53'),(1109,'2005-05-31 15:12:15',2031,481,'2005-06-09 16:21:15',1,'2006-02-15 21:30:53'),(1110,'2005-05-31 15:22:51',2085,355,'2005-06-07 14:32:51',1,'2006-02-15 21:30:53'),(1111,'2005-05-31 15:24:19',1137,300,'2005-06-08 21:18:19',1,'2006-02-15 21:30:53'),(1112,'2005-05-31 15:51:39',2453,214,'2005-06-03 14:04:39',1,'2006-02-15 21:30:53'),(1113,'2005-05-31 15:58:44',2078,451,'2005-06-05 18:05:44',2,'2006-02-15 21:30:53'),(1114,'2005-05-31 16:00:33',2287,117,'2005-06-01 19:05:33',1,'2006-02-15 21:30:53'),(1115,'2005-05-31 16:07:09',2140,109,'2005-06-04 18:51:09',1,'2006-02-15 21:30:53'),(1116,'2005-05-31 16:10:46',1356,256,'2005-06-01 20:27:46',2,'2006-02-15 21:30:53'),(1117,'2005-05-31 16:15:31',4125,189,'2005-06-04 17:20:31',1,'2006-02-15 21:30:53'),(1118,'2005-05-31 16:23:02',213,510,'2005-06-03 20:00:02',1,'2006-02-15 21:30:53'),(1119,'2005-05-31 16:34:27',4401,469,'2005-06-02 10:54:27',1,'2006-02-15 21:30:53'),(1120,'2005-05-31 16:37:14',2897,361,'2005-06-04 12:53:14',1,'2006-02-15 21:30:53'),(1121,'2005-05-31 16:37:36',1691,74,'2005-06-06 21:02:36',1,'2006-02-15 21:30:53'),(1122,'2005-05-31 16:39:33',1392,180,'2005-06-04 17:25:33',1,'2006-02-15 21:30:53'),(1123,'2005-05-31 16:48:43',142,448,'2005-06-02 19:17:43',2,'2006-02-15 21:30:53'),(1124,'2005-05-31 16:49:34',4560,134,'2005-06-04 19:32:34',2,'2006-02-15 21:30:53'),(1125,'2005-05-31 17:23:44',1172,234,'2005-06-01 15:02:44',1,'2006-02-15 21:30:53'),(1126,'2005-05-31 17:27:45',2765,431,'2005-06-04 20:06:45',2,'2006-02-15 21:30:53'),(1127,'2005-05-31 17:45:49',2412,387,'2005-06-08 22:41:49',2,'2006-02-15 21:30:53'),(1128,'2005-05-31 17:49:26',1496,311,'2005-06-05 19:51:26',2,'2006-02-15 21:30:53'),(1129,'2005-05-31 18:00:48',386,486,'2005-06-04 23:05:48',1,'2006-02-15 21:30:53'),(1130,'2005-05-31 18:13:57',3186,124,'2005-06-06 22:50:57',2,'2006-02-15 21:30:53'),(1131,'2005-05-31 18:44:19',2654,128,'2005-06-01 20:13:19',1,'2006-02-15 21:30:53'),(1132,'2005-05-31 18:44:53',1763,198,'2005-06-07 22:02:53',2,'2006-02-15 21:30:53'),(1133,'2005-05-31 19:12:21',4271,73,'2005-06-02 20:12:21',1,'2006-02-15 21:30:53'),(1134,'2005-05-31 19:14:15',143,191,'2005-06-02 17:13:15',2,'2006-02-15 21:30:53'),(1135,'2005-05-31 19:15:11',3118,122,'2005-06-01 14:44:11',2,'2006-02-15 21:30:53'),(1136,'2005-05-31 19:19:36',3963,50,'2005-06-09 16:04:36',2,'2006-02-15 21:30:53'),(1137,'2005-05-31 19:20:14',3259,351,'2005-06-07 16:10:14',1,'2006-02-15 21:30:53'),(1138,'2005-05-31 19:30:27',3944,438,'2005-06-05 21:42:27',1,'2006-02-15 21:30:53'),(1139,'2005-05-31 19:34:52',666,562,'2005-06-06 17:40:52',1,'2006-02-15 21:30:53'),(1140,'2005-05-31 19:36:30',3731,10,'2005-06-07 18:33:30',2,'2006-02-15 21:30:53'),(1141,'2005-05-31 19:42:02',4128,217,'2005-06-07 00:59:02',2,'2006-02-15 21:30:53'),(1142,'2005-05-31 19:46:38',3998,5,'2005-06-05 14:03:38',1,'2006-02-15 21:30:53'),(1143,'2005-05-31 19:53:03',2632,209,'2005-06-06 20:56:03',2,'2006-02-15 21:30:53'),(1144,'2005-05-31 20:04:10',2450,207,'2005-06-09 16:34:10',1,'2006-02-15 21:30:53'),(1145,'2005-05-31 20:13:45',1133,284,'2005-06-08 02:10:45',1,'2006-02-15 21:30:53'),(1146,'2005-05-31 20:34:45',3134,250,'2005-06-03 18:12:45',2,'2006-02-15 21:30:53'),(1147,'2005-05-31 20:37:52',622,259,'2005-06-06 19:23:52',2,'2006-02-15 21:30:53'),(1148,'2005-05-31 20:38:40',3307,235,'2005-06-02 18:35:40',2,'2006-02-15 21:30:53'),(1149,'2005-05-31 21:03:17',352,326,'2005-06-08 19:58:17',2,'2006-02-15 21:30:53'),(1150,'2005-05-31 21:20:09',1632,136,'2005-06-03 19:15:09',2,'2006-02-15 21:30:53'),(1151,'2005-05-31 21:29:00',1281,581,'2005-06-03 23:24:00',1,'2006-02-15 21:30:53'),(1152,'2005-05-31 21:32:17',210,191,'2005-06-04 21:07:17',2,'2006-02-15 21:30:53'),(1153,'2005-05-31 21:36:44',2725,506,'2005-06-10 01:26:44',2,'2006-02-15 21:30:53'),(1154,'2005-05-31 21:42:09',2732,59,'2005-06-08 16:40:09',1,'2006-02-15 21:30:53'),(1155,'2005-05-31 22:17:11',2048,251,'2005-06-04 20:27:11',2,'2006-02-15 21:30:53'),(1156,'2005-05-31 22:37:34',460,106,'2005-06-01 23:02:34',2,'2006-02-15 21:30:53'),(1157,'2005-05-31 22:47:45',1449,61,'2005-06-02 18:01:45',1,'2006-02-15 21:30:53'),(1158,'2005-06-14 22:53:33',1632,416,'2005-06-18 21:37:33',2,'2006-02-15 21:30:53'),(1159,'2005-06-14 22:55:13',4395,516,'2005-06-17 02:11:13',1,'2006-02-15 21:30:53'),(1160,'2005-06-14 23:00:34',2795,239,'2005-06-18 01:58:34',2,'2006-02-15 21:30:53'),(1161,'2005-06-14 23:07:08',1690,285,'2005-06-21 17:12:08',1,'2006-02-15 21:30:53'),(1162,'2005-06-14 23:09:38',987,310,'2005-06-23 22:00:38',1,'2006-02-15 21:30:53'),(1163,'2005-06-14 23:12:46',4209,592,'2005-06-23 21:53:46',1,'2006-02-15 21:30:53'),(1164,'2005-06-14 23:16:26',3691,49,'2005-06-16 21:00:26',1,'2006-02-15 21:30:53'),(1165,'2005-06-14 23:16:27',2855,264,'2005-06-20 02:40:27',2,'2006-02-15 21:30:53'),(1166,'2005-06-14 23:17:03',2508,46,'2005-06-15 20:43:03',1,'2006-02-15 21:30:53'),(1167,'2005-06-14 23:25:58',4021,323,'2005-06-18 05:18:58',2,'2006-02-15 21:30:53'),(1168,'2005-06-14 23:35:09',4368,481,'2005-06-19 03:20:09',1,'2006-02-15 21:30:53'),(1169,'2005-06-14 23:42:56',1062,139,'2005-06-16 04:02:56',2,'2006-02-15 21:30:53'),(1170,'2005-06-14 23:47:35',2444,595,'2005-06-17 05:28:35',2,'2006-02-15 21:30:53'),(1171,'2005-06-14 23:50:11',4082,284,'2005-06-17 21:44:11',2,'2006-02-15 21:30:53'),(1172,'2005-06-14 23:54:34',2685,306,'2005-06-16 02:26:34',1,'2006-02-15 21:30:53'),(1173,'2005-06-14 23:54:46',1050,191,'2005-06-19 23:26:46',2,'2006-02-15 21:30:53'),(1174,'2005-06-15 00:12:51',2653,95,'2005-06-21 02:10:51',2,'2006-02-15 21:30:53'),(1175,'2005-06-15 00:15:15',3255,197,'2005-06-20 19:23:15',2,'2006-02-15 21:30:53'),(1176,'2005-06-15 00:28:37',2715,512,'2005-06-21 21:42:37',1,'2006-02-15 21:30:53'),(1177,'2005-06-15 00:33:04',1897,210,'2005-06-16 03:47:04',2,'2006-02-15 21:30:53'),(1178,'2005-06-15 00:36:40',2553,279,'2005-06-21 00:27:40',2,'2006-02-15 21:30:53'),(1179,'2005-06-15 00:36:50',816,119,'2005-06-22 22:09:50',1,'2006-02-15 21:30:53'),(1180,'2005-06-15 00:39:01',3119,432,'2005-06-21 22:44:01',2,'2006-02-15 21:30:53'),(1181,'2005-06-15 00:42:17',2973,546,'2005-06-19 03:36:17',2,'2006-02-15 21:30:53'),(1182,'2005-06-15 00:45:21',1061,196,'2005-06-22 03:52:21',1,'2006-02-15 21:30:53'),(1183,'2005-06-15 00:49:19',706,329,'2005-06-20 04:33:19',1,'2006-02-15 21:30:53'),(1184,'2005-06-15 00:49:36',473,295,'2005-06-22 23:39:36',2,'2006-02-15 21:30:53'),(1185,'2005-06-15 00:54:12',2785,1,'2005-06-23 02:42:12',2,'2006-02-15 21:30:53'),(1186,'2005-06-15 00:56:45',1556,368,'2005-06-16 02:23:45',1,'2006-02-15 21:30:53'),(1187,'2005-06-15 00:58:50',1108,334,'2005-06-23 02:19:50',1,'2006-02-15 21:30:53'),(1188,'2005-06-15 01:04:07',246,173,'2005-06-19 03:48:07',1,'2006-02-15 21:30:53'),(1189,'2005-06-15 01:04:22',142,244,'2005-06-24 06:48:22',1,'2006-02-15 21:30:53'),(1190,'2005-06-15 01:05:32',2572,370,'2005-06-23 02:34:32',2,'2006-02-15 21:30:53'),(1191,'2005-06-15 01:10:35',2221,291,'2005-06-17 20:36:35',2,'2006-02-15 21:30:53'),(1192,'2005-06-15 01:18:39',4134,186,'2005-06-19 22:46:39',1,'2006-02-15 21:30:53'),(1193,'2005-06-15 01:24:20',4504,561,'2005-06-21 02:29:20',2,'2006-02-15 21:30:53'),(1194,'2005-06-15 01:25:08',3774,402,'2005-06-21 01:16:08',2,'2006-02-15 21:30:53'),(1195,'2005-06-15 01:37:38',2272,84,'2005-06-17 21:50:38',1,'2006-02-15 21:30:53'),(1196,'2005-06-15 01:38:31',994,52,'2005-06-18 06:55:31',1,'2006-02-15 21:30:53'),(1197,'2005-06-15 01:42:46',3812,349,'2005-06-20 00:22:46',1,'2006-02-15 21:30:53'),(1198,'2005-06-15 01:48:58',1138,491,'2005-06-20 01:07:58',2,'2006-02-15 21:30:53'),(1199,'2005-06-15 01:58:50',253,238,'2005-06-16 20:30:50',2,'2006-02-15 21:30:53'),(1200,'2005-06-15 01:59:51',3329,516,'2005-06-21 21:33:51',1,'2006-02-15 21:30:53'),(1201,'2005-06-15 02:06:28',2679,209,'2005-06-16 21:38:28',2,'2006-02-15 21:30:53'),(1202,'2005-06-15 02:08:04',2821,451,'2005-06-16 21:56:04',1,'2006-02-15 21:30:53'),(1203,'2005-06-15 02:09:02',2223,452,'2005-06-21 00:04:02',1,'2006-02-15 21:30:53'),(1204,'2005-06-15 02:21:46',2450,249,'2005-06-20 07:14:46',2,'2006-02-15 21:30:53'),(1205,'2005-06-15 02:25:56',470,340,'2005-06-22 23:19:56',1,'2006-02-15 21:30:53'),(1206,'2005-06-15 02:27:07',1097,264,'2005-06-18 22:46:07',2,'2006-02-15 21:30:53'),(1207,'2005-06-15 02:27:08',2277,430,'2005-06-19 08:18:08',2,'2006-02-15 21:30:53'),(1208,'2005-06-15 02:30:03',750,376,'2005-06-18 00:04:03',1,'2006-02-15 21:30:53'),(1209,'2005-06-15 02:31:12',1494,146,'2005-06-21 07:39:12',1,'2006-02-15 21:30:53'),(1210,'2005-06-15 02:57:51',7,345,'2005-06-20 01:41:51',2,'2006-02-15 21:30:53'),(1211,'2005-06-15 03:01:20',3360,122,'2005-06-18 07:52:20',2,'2006-02-15 21:30:53'),(1212,'2005-06-15 03:03:33',3611,371,'2005-06-17 06:31:33',1,'2006-02-15 21:30:53'),(1213,'2005-06-15 03:14:05',3191,94,'2005-06-15 21:41:05',2,'2006-02-15 21:30:53'),(1214,'2005-06-15 03:18:40',4482,46,'2005-06-20 07:32:40',1,'2006-02-15 21:30:53'),(1215,'2005-06-15 03:21:00',242,102,'2005-06-19 03:39:00',1,'2006-02-15 21:30:53'),(1216,'2005-06-15 03:23:48',3973,100,'2005-06-18 03:35:48',1,'2006-02-15 21:30:53'),(1217,'2005-06-15 03:24:14',600,203,'2005-06-18 22:37:14',2,'2006-02-15 21:30:53'),(1218,'2005-06-15 03:24:44',239,371,'2005-06-21 22:45:44',2,'2006-02-15 21:30:53'),(1219,'2005-06-15 03:25:59',3005,330,'2005-06-20 00:37:59',1,'2006-02-15 21:30:53'),(1220,'2005-06-15 03:26:15',1621,290,'2005-06-23 08:17:15',1,'2006-02-15 21:30:53'),(1221,'2005-06-15 03:35:16',2124,403,'2005-06-18 03:11:16',1,'2006-02-15 21:30:53'),(1222,'2005-06-15 03:38:49',2799,168,'2005-06-17 22:30:49',1,'2006-02-15 21:30:53'),(1223,'2005-06-15 03:38:53',1299,50,'2005-06-20 01:00:53',2,'2006-02-15 21:30:53'),(1224,'2005-06-15 03:44:25',1572,369,'2005-06-17 03:49:25',2,'2006-02-15 21:30:53'),(1225,'2005-06-15 03:45:35',1929,434,'2005-06-19 02:03:35',1,'2006-02-15 21:30:53'),(1226,'2005-06-15 03:46:10',2290,409,'2005-06-23 02:00:10',1,'2006-02-15 21:30:53'),(1227,'2005-06-15 03:50:03',654,428,'2005-06-21 23:48:03',2,'2006-02-15 21:30:53'),(1228,'2005-06-15 03:50:36',4473,398,'2005-06-17 22:41:36',1,'2006-02-15 21:30:53'),(1229,'2005-06-15 03:53:13',2140,468,'2005-06-18 04:09:13',1,'2006-02-15 21:30:53'),(1230,'2005-06-15 04:04:09',2324,447,'2005-06-16 02:21:09',1,'2006-02-15 21:30:53'),(1231,'2005-06-15 04:04:41',3003,302,'2005-06-20 23:52:41',2,'2006-02-15 21:30:53'),(1232,'2005-06-15 04:18:10',2743,391,'2005-06-17 06:02:10',2,'2006-02-15 21:30:53'),(1233,'2005-06-15 04:18:37',4214,550,'2005-06-22 03:36:37',1,'2006-02-15 21:30:53'),(1234,'2005-06-15 04:21:52',709,529,'2005-06-22 03:25:52',1,'2006-02-15 21:30:53'),(1235,'2005-06-15 04:31:28',1000,255,'2005-06-22 10:08:28',1,'2006-02-15 21:30:53'),(1236,'2005-06-15 04:34:27',3182,66,'2005-06-18 08:15:27',1,'2006-02-15 21:30:53'),(1237,'2005-06-15 04:44:10',3249,49,'2005-06-23 07:00:10',2,'2006-02-15 21:30:53'),(1238,'2005-06-15 04:49:08',3534,205,'2005-06-20 00:06:08',1,'2006-02-15 21:30:53'),(1239,'2005-06-15 04:53:01',3731,444,'2005-06-16 07:03:01',1,'2006-02-15 21:30:53'),(1240,'2005-06-15 04:58:07',3841,28,'2005-06-17 23:56:07',1,'2006-02-15 21:30:53'),(1241,'2005-06-15 04:59:43',4377,62,'2005-06-24 03:32:43',2,'2006-02-15 21:30:53'),(1242,'2005-06-15 05:05:07',821,141,'2005-06-22 04:57:07',1,'2006-02-15 21:30:53'),(1243,'2005-06-15 05:07:32',2629,107,'2005-06-21 08:17:32',2,'2006-02-15 21:30:53'),(1244,'2005-06-15 05:08:40',1026,515,'2005-06-20 10:41:40',1,'2006-02-15 21:30:53'),(1245,'2005-06-15 05:09:01',1314,234,'2005-06-22 06:55:01',2,'2006-02-15 21:30:53'),(1246,'2005-06-15 05:11:19',431,357,'2005-06-21 02:21:19',1,'2006-02-15 21:30:53'),(1247,'2005-06-15 05:16:40',4049,287,'2005-06-23 11:01:40',1,'2006-02-15 21:30:53'),(1248,'2005-06-15 05:33:52',3878,544,'2005-06-19 06:56:52',2,'2006-02-15 21:30:53'),(1249,'2005-06-15 05:38:09',2120,403,'2005-06-22 10:29:09',1,'2006-02-15 21:30:53'),(1250,'2005-06-15 05:55:40',4360,38,'2005-06-23 03:11:40',2,'2006-02-15 21:30:53'),(1251,'2005-06-15 05:58:55',3307,442,'2005-06-23 02:45:55',2,'2006-02-15 21:30:53'),(1252,'2005-06-15 06:05:18',1147,89,'2005-06-24 07:40:18',1,'2006-02-15 21:30:53'),(1253,'2005-06-15 06:06:33',3242,498,'2005-06-21 04:13:33',2,'2006-02-15 21:30:53'),(1254,'2005-06-15 06:11:16',3986,571,'2005-06-21 06:40:16',2,'2006-02-15 21:30:53'),(1255,'2005-06-15 06:13:45',1433,526,'2005-06-16 03:59:45',2,'2006-02-15 21:30:53'),(1256,'2005-06-15 06:13:57',1437,470,'2005-06-16 06:54:57',2,'2006-02-15 21:30:53'),(1257,'2005-06-15 06:15:36',1938,267,'2005-06-21 01:04:36',2,'2006-02-15 21:30:53'),(1258,'2005-06-15 06:21:30',4530,320,'2005-06-18 05:43:30',2,'2006-02-15 21:30:53'),(1259,'2005-06-15 06:37:55',4460,570,'2005-06-23 04:02:55',2,'2006-02-15 21:30:53'),(1260,'2005-06-15 06:42:25',330,586,'2005-06-16 10:44:25',2,'2006-02-15 21:30:53'),(1261,'2005-06-15 06:52:57',2447,95,'2005-06-21 01:47:57',2,'2006-02-15 21:30:53'),(1262,'2005-06-15 06:54:53',4495,236,'2005-06-22 08:09:53',2,'2006-02-15 21:30:53'),(1263,'2005-06-15 06:56:39',4144,540,'2005-06-16 11:08:39',1,'2006-02-15 21:30:53'),(1264,'2005-06-15 06:59:39',4176,439,'2005-06-18 08:10:39',2,'2006-02-15 21:30:53'),(1265,'2005-06-15 07:00:50',982,163,'2005-06-19 12:27:50',1,'2006-02-15 21:30:53'),(1266,'2005-06-15 07:11:39',2230,96,'2005-06-21 02:59:39',2,'2006-02-15 21:30:53'),(1267,'2005-06-15 07:21:21',4246,509,'2005-06-17 08:12:21',2,'2006-02-15 21:30:53'),(1268,'2005-06-15 07:29:30',3641,142,'2005-06-23 12:36:30',1,'2006-02-15 21:30:53'),(1269,'2005-06-15 07:29:59',108,59,'2005-06-16 13:26:59',2,'2006-02-15 21:30:53'),(1270,'2005-06-15 07:30:22',62,395,'2005-06-18 11:31:22',2,'2006-02-15 21:30:53'),(1271,'2005-06-15 07:32:24',379,560,'2005-06-21 05:12:24',1,'2006-02-15 21:30:53'),(1272,'2005-06-15 07:42:58',3128,135,'2005-06-18 12:00:58',1,'2006-02-15 21:30:53'),(1273,'2005-06-15 07:52:35',361,530,'2005-06-21 04:55:35',1,'2006-02-15 21:30:53'),(1274,'2005-06-15 07:52:52',2765,430,'2005-06-20 10:01:52',1,'2006-02-15 21:30:53'),(1275,'2005-06-15 07:55:43',950,214,'2005-06-20 06:30:43',1,'2006-02-15 21:30:53'),(1276,'2005-06-15 08:00:13',1508,388,'2005-06-24 02:55:13',2,'2006-02-15 21:30:53'),(1277,'2005-06-15 08:01:29',76,464,'2005-06-22 07:16:29',2,'2006-02-15 21:30:53'),(1278,'2005-06-15 08:09:12',4471,191,'2005-06-17 04:05:12',2,'2006-02-15 21:30:53'),(1279,'2005-06-15 08:13:57',698,183,'2005-06-18 09:36:57',2,'2006-02-15 21:30:53'),(1280,'2005-06-15 08:16:06',2597,266,'2005-06-21 04:10:06',2,'2006-02-15 21:30:53'),(1281,'2005-06-15 08:21:39',2963,511,'2005-06-17 11:03:39',1,'2006-02-15 21:30:53'),(1282,'2005-06-15 08:25:33',186,539,'2005-06-21 04:02:33',1,'2006-02-15 21:30:53'),(1283,'2005-06-15 08:27:30',3177,470,'2005-06-16 09:46:30',2,'2006-02-15 21:30:53'),(1284,'2005-06-15 08:27:33',1387,463,'2005-06-17 03:58:33',1,'2006-02-15 21:30:53'),(1285,'2005-06-15 08:33:06',1054,254,'2005-06-19 07:36:06',1,'2006-02-15 21:30:53'),(1286,'2005-06-15 08:41:13',774,179,'2005-06-23 13:13:13',2,'2006-02-15 21:30:53'),(1287,'2005-06-15 08:41:38',4204,104,'2005-06-22 14:02:38',1,'2006-02-15 21:30:53'),(1288,'2005-06-15 08:41:52',830,456,'2005-06-19 05:30:52',2,'2006-02-15 21:30:53'),(1289,'2005-06-15 08:44:09',3154,522,'2005-06-21 06:04:09',1,'2006-02-15 21:30:53'),(1290,'2005-06-15 08:52:44',1921,540,'2005-06-24 13:36:44',2,'2006-02-15 21:30:53'),(1291,'2005-06-15 08:55:01',3090,176,'2005-06-24 04:22:01',1,'2006-02-15 21:30:53'),(1292,'2005-06-15 09:03:52',4535,178,'2005-06-21 07:53:52',1,'2006-02-15 21:30:53'),(1293,'2005-06-15 09:06:24',2882,127,'2005-06-18 06:58:24',1,'2006-02-15 21:30:53'),(1294,'2005-06-15 09:09:27',339,327,'2005-06-19 04:43:27',1,'2006-02-15 21:30:53'),(1295,'2005-06-15 09:17:20',2897,449,'2005-06-18 10:14:20',2,'2006-02-15 21:30:53'),(1296,'2005-06-15 09:23:59',1760,200,'2005-06-19 03:44:59',2,'2006-02-15 21:30:53'),(1297,'2005-06-15 09:31:28',1075,4,'2005-06-19 04:33:28',1,'2006-02-15 21:30:53'),(1298,'2005-06-15 09:32:53',4163,334,'2005-06-16 12:40:53',2,'2006-02-15 21:30:53'),(1299,'2005-06-15 09:34:50',1584,91,'2005-06-21 12:07:50',1,'2006-02-15 21:30:53'),(1300,'2005-06-15 09:36:19',2524,186,'2005-06-17 13:54:19',2,'2006-02-15 21:30:53'),(1301,'2005-06-15 09:46:33',1484,33,'2005-06-24 08:56:33',2,'2006-02-15 21:30:53'),(1302,'2005-06-15 09:48:37',324,285,'2005-06-22 06:18:37',1,'2006-02-15 21:30:53'),(1303,'2005-06-15 09:55:57',2001,365,'2005-06-20 14:26:57',2,'2006-02-15 21:30:53'),(1304,'2005-06-15 09:56:02',1304,242,'2005-06-24 07:00:02',1,'2006-02-15 21:30:53'),(1305,'2005-06-15 09:59:16',187,8,'2005-06-19 09:48:16',2,'2006-02-15 21:30:53'),(1306,'2005-06-15 09:59:24',2132,524,'2005-06-19 09:37:24',2,'2006-02-15 21:30:53'),(1307,'2005-06-15 10:06:15',368,507,'2005-06-20 04:50:15',2,'2006-02-15 21:30:53'),(1308,'2005-06-15 10:07:48',220,236,'2005-06-24 15:24:48',1,'2006-02-15 21:30:53'),(1309,'2005-06-15 10:10:49',2356,200,'2005-06-16 12:44:49',1,'2006-02-15 21:30:53'),(1310,'2005-06-15 10:11:42',2045,27,'2005-06-16 15:00:42',1,'2006-02-15 21:30:53'),(1311,'2005-06-15 10:11:59',3114,326,'2005-06-17 08:44:59',2,'2006-02-15 21:30:53'),(1312,'2005-06-15 10:16:27',3608,313,'2005-06-20 06:53:27',1,'2006-02-15 21:30:53'),(1313,'2005-06-15 10:18:34',1657,448,'2005-06-23 06:25:34',1,'2006-02-15 21:30:53'),(1314,'2005-06-15 10:21:45',1359,538,'2005-06-21 14:10:45',1,'2006-02-15 21:30:53'),(1315,'2005-06-15 10:23:08',3844,405,'2005-06-21 15:06:08',1,'2006-02-15 21:30:53'),(1316,'2005-06-15 10:26:23',3891,138,'2005-06-21 09:25:23',2,'2006-02-15 21:30:53'),(1317,'2005-06-15 10:30:19',3696,316,'2005-06-24 08:18:19',1,'2006-02-15 21:30:53'),(1318,'2005-06-15 10:34:26',2760,341,'2005-06-20 16:20:26',1,'2006-02-15 21:30:53'),(1319,'2005-06-15 10:39:05',4296,190,'2005-06-18 05:25:05',1,'2006-02-15 21:30:53'),(1320,'2005-06-15 10:42:13',4484,84,'2005-06-17 13:44:13',1,'2006-02-15 21:30:53'),(1321,'2005-06-15 10:49:17',3516,204,'2005-06-16 15:30:17',1,'2006-02-15 21:30:53'),(1322,'2005-06-15 10:55:09',2076,217,'2005-06-18 15:14:09',2,'2006-02-15 21:30:53'),(1323,'2005-06-15 10:55:17',3273,187,'2005-06-24 09:51:17',1,'2006-02-15 21:30:53'),(1324,'2005-06-15 11:02:45',764,394,'2005-06-17 07:14:45',1,'2006-02-15 21:30:53'),(1325,'2005-06-15 11:03:24',52,193,'2005-06-20 10:54:24',1,'2006-02-15 21:30:53'),(1326,'2005-06-15 11:07:39',59,548,'2005-06-22 05:55:39',2,'2006-02-15 21:30:53'),(1327,'2005-06-15 11:11:39',403,539,'2005-06-22 10:45:39',1,'2006-02-15 21:30:53'),(1328,'2005-06-15 11:23:27',3665,295,'2005-06-19 12:42:27',2,'2006-02-15 21:30:53'),(1329,'2005-06-15 11:25:06',1154,359,'2005-06-17 16:10:06',2,'2006-02-15 21:30:53'),(1330,'2005-06-15 11:29:17',1219,587,'2005-06-24 13:36:17',2,'2006-02-15 21:30:53'),(1331,'2005-06-15 11:34:33',3089,277,'2005-06-21 09:46:33',1,'2006-02-15 21:30:53'),(1332,'2005-06-15 11:36:01',1412,116,'2005-06-17 14:29:01',1,'2006-02-15 21:30:53'),(1333,'2005-06-15 11:37:08',448,310,'2005-06-16 10:13:08',2,'2006-02-15 21:30:53'),(1334,'2005-06-15 11:43:09',1242,269,'2005-06-20 15:45:09',2,'2006-02-15 21:30:53'),(1335,'2005-06-15 11:51:30',1713,64,'2005-06-16 16:42:30',2,'2006-02-15 21:30:53'),(1336,'2005-06-15 12:01:34',1696,290,'2005-06-23 12:05:34',1,'2006-02-15 21:30:53'),(1337,'2005-06-15 12:12:42',4014,465,'2005-06-20 12:38:42',2,'2006-02-15 21:30:53'),(1338,'2005-06-15 12:17:34',1206,25,'2005-06-19 07:40:34',2,'2006-02-15 21:30:53'),(1339,'2005-06-15 12:21:56',424,162,'2005-06-19 07:46:56',1,'2006-02-15 21:30:53'),(1340,'2005-06-15 12:24:15',251,100,'2005-06-22 13:02:15',1,'2006-02-15 21:30:53'),(1341,'2005-06-15 12:26:18',3363,344,'2005-06-21 07:26:18',2,'2006-02-15 21:30:53'),(1342,'2005-06-15 12:26:21',4429,427,'2005-06-22 11:23:21',1,'2006-02-15 21:30:53'),(1343,'2005-06-15 12:27:19',2393,416,'2005-06-21 16:57:19',1,'2006-02-15 21:30:53'),(1344,'2005-06-15 12:29:41',1625,585,'2005-06-22 12:45:41',2,'2006-02-15 21:30:53'),(1345,'2005-06-15 12:32:13',1041,270,'2005-06-24 14:02:13',1,'2006-02-15 21:30:53'),(1346,'2005-06-15 12:39:52',4540,585,'2005-06-24 17:43:52',1,'2006-02-15 21:30:53'),(1347,'2005-06-15 12:43:43',374,190,'2005-06-16 09:55:43',1,'2006-02-15 21:30:53'),(1348,'2005-06-15 12:45:30',2078,196,'2005-06-17 17:12:30',1,'2006-02-15 21:30:53'),(1349,'2005-06-15 12:49:02',1131,267,'2005-06-17 15:20:02',1,'2006-02-15 21:30:53'),(1350,'2005-06-15 12:50:25',4261,316,'2005-06-23 11:35:25',1,'2006-02-15 21:30:53'),(1351,'2005-06-15 12:51:03',2364,484,'2005-06-22 07:23:03',1,'2006-02-15 21:30:53'),(1352,'2005-06-15 12:58:27',4352,276,'2005-06-18 10:57:27',1,'2006-02-15 21:30:53'),(1353,'2005-06-15 13:13:36',2711,480,'2005-06-21 08:46:36',2,'2006-02-15 21:30:53'),(1354,'2005-06-15 13:13:49',1294,83,'2005-06-23 13:08:49',2,'2006-02-15 21:30:53'),(1355,'2005-06-15 13:13:59',4203,499,'2005-06-20 12:23:59',1,'2006-02-15 21:30:53'),(1356,'2005-06-15 13:17:01',1318,212,'2005-06-19 16:22:01',1,'2006-02-15 21:30:53'),(1357,'2005-06-15 13:26:23',2285,205,'2005-06-23 14:12:23',1,'2006-02-15 21:30:53'),(1358,'2005-06-15 13:28:48',2025,442,'2005-06-21 13:40:48',1,'2006-02-15 21:30:53'),(1359,'2005-06-15 13:30:30',3140,353,'2005-06-17 14:55:30',1,'2006-02-15 21:30:53'),(1360,'2005-06-15 13:32:15',4107,14,'2005-06-18 10:59:15',2,'2006-02-15 21:30:53'),(1361,'2005-06-15 13:37:38',4338,115,'2005-06-19 17:08:38',1,'2006-02-15 21:30:53'),(1362,'2005-06-15 13:53:32',4524,98,'2005-06-19 16:05:32',1,'2006-02-15 21:30:53'),(1363,'2005-06-15 14:05:11',771,197,'2005-06-17 19:53:11',2,'2006-02-15 21:30:53'),(1364,'2005-06-15 14:05:32',115,400,'2005-06-16 15:31:32',1,'2006-02-15 21:30:53'),(1365,'2005-06-15 14:09:55',3813,25,'2005-06-19 18:11:55',2,'2006-02-15 21:30:53'),(1366,'2005-06-15 14:21:00',4238,576,'2005-06-24 17:36:00',1,'2006-02-15 21:30:53'),(1367,'2005-06-15 14:25:17',1505,94,'2005-06-21 19:15:17',1,'2006-02-15 21:30:53'),(1368,'2005-06-15 14:27:47',2020,222,'2005-06-23 18:07:47',2,'2006-02-15 21:30:53'),(1369,'2005-06-15 14:29:14',679,221,'2005-06-16 13:01:14',1,'2006-02-15 21:30:53'),(1370,'2005-06-15 14:31:05',644,396,'2005-06-22 19:23:05',2,'2006-02-15 21:30:53'),(1371,'2005-06-15 14:38:15',760,491,'2005-06-23 15:36:15',1,'2006-02-15 21:30:53'),(1372,'2005-06-15 14:45:48',3740,108,'2005-06-17 18:02:48',2,'2006-02-15 21:30:53'),(1373,'2005-06-15 14:48:04',284,51,'2005-06-22 09:48:04',1,'2006-02-15 21:30:53'),(1374,'2005-06-15 14:49:54',3353,120,'2005-06-22 12:30:54',1,'2006-02-15 21:30:53'),(1375,'2005-06-15 14:54:56',3555,500,'2005-06-21 14:48:56',2,'2006-02-15 21:30:53'),(1376,'2005-06-15 14:59:06',4271,215,'2005-06-19 17:34:06',1,'2006-02-15 21:30:53'),(1377,'2005-06-15 15:02:03',3410,245,'2005-06-22 14:54:03',2,'2006-02-15 21:30:53'),(1378,'2005-06-15 15:03:15',4372,253,'2005-06-19 16:50:15',1,'2006-02-15 21:30:53'),(1379,'2005-06-15 15:05:10',810,212,'2005-06-18 12:11:10',1,'2006-02-15 21:30:53'),(1380,'2005-06-15 15:13:10',3376,158,'2005-06-18 12:42:10',2,'2006-02-15 21:30:53'),(1381,'2005-06-15 15:17:21',3262,300,'2005-06-20 17:07:21',2,'2006-02-15 21:30:53'),(1382,'2005-06-15 15:18:08',3133,455,'2005-06-22 09:22:08',2,'2006-02-15 21:30:53'),(1383,'2005-06-15 15:20:06',1281,379,'2005-06-24 18:42:06',2,'2006-02-15 21:30:53'),(1384,'2005-06-15 15:22:03',4242,242,'2005-06-18 18:11:03',1,'2006-02-15 21:30:53'),(1385,'2005-06-15 15:28:23',4073,396,'2005-06-18 18:37:23',1,'2006-02-15 21:30:53'),(1386,'2005-06-15 15:38:58',1296,322,'2005-06-20 16:28:58',2,'2006-02-15 21:30:53'),(1387,'2005-06-15 15:40:56',515,278,'2005-06-17 10:39:56',1,'2006-02-15 21:30:53'),(1388,'2005-06-15 15:48:41',3987,500,'2005-06-22 17:51:41',1,'2006-02-15 21:30:53'),(1389,'2005-06-15 15:49:01',965,472,'2005-06-19 11:08:01',2,'2006-02-15 21:30:53'),(1390,'2005-06-15 16:06:29',4502,254,'2005-06-19 13:11:29',1,'2006-02-15 21:30:53'),(1391,'2005-06-15 16:11:21',4213,273,'2005-06-22 21:32:21',1,'2006-02-15 21:30:53'),(1392,'2005-06-15 16:12:27',363,460,'2005-06-16 17:30:27',2,'2006-02-15 21:30:53'),(1393,'2005-06-15 16:12:50',2767,177,'2005-06-19 10:40:50',2,'2006-02-15 21:30:53'),(1394,'2005-06-15 16:17:21',2802,268,'2005-06-21 20:44:21',2,'2006-02-15 21:30:53'),(1395,'2005-06-15 16:21:04',753,252,'2005-06-23 12:52:04',2,'2006-02-15 21:30:53'),(1396,'2005-06-15 16:22:38',1007,103,'2005-06-17 15:53:38',2,'2006-02-15 21:30:53'),(1397,'2005-06-15 16:25:26',1830,444,'2005-06-21 20:45:26',1,'2006-02-15 21:30:53'),(1398,'2005-06-15 16:28:42',4402,527,'2005-06-16 12:11:42',1,'2006-02-15 21:30:53'),(1399,'2005-06-15 16:29:51',1435,469,'2005-06-18 14:06:51',1,'2006-02-15 21:30:53'),(1400,'2005-06-15 16:29:56',230,571,'2005-06-21 14:43:56',2,'2006-02-15 21:30:53'),(1401,'2005-06-15 16:30:22',4081,366,'2005-06-21 11:07:22',2,'2006-02-15 21:30:53'),(1402,'2005-06-15 16:31:08',1951,381,'2005-06-24 19:31:08',1,'2006-02-15 21:30:53'),(1403,'2005-06-15 16:31:59',3380,546,'2005-06-22 14:23:59',2,'2006-02-15 21:30:53'),(1404,'2005-06-15 16:38:53',2776,375,'2005-06-16 20:37:53',1,'2006-02-15 21:30:53'),(1405,'2005-06-15 16:41:26',3184,243,'2005-06-21 18:16:26',1,'2006-02-15 21:30:53'),(1406,'2005-06-15 16:44:00',3118,199,'2005-06-21 11:22:00',2,'2006-02-15 21:30:53'),(1407,'2005-06-15 16:45:07',1286,89,'2005-06-23 14:01:07',1,'2006-02-15 21:30:53'),(1408,'2005-06-15 16:57:58',2655,396,'2005-06-22 21:08:58',1,'2006-02-15 21:30:53'),(1409,'2005-06-15 16:58:12',1398,297,'2005-06-21 11:21:12',2,'2006-02-15 21:30:53'),(1410,'2005-06-15 16:59:46',809,356,'2005-06-21 16:38:46',1,'2006-02-15 21:30:53'),(1411,'2005-06-15 17:05:36',2276,520,'2005-06-21 14:05:36',1,'2006-02-15 21:30:53'),(1412,'2005-06-15 17:09:48',4236,166,'2005-06-18 17:05:48',2,'2006-02-15 21:30:53'),(1413,'2005-06-15 17:25:07',3625,96,'2005-06-21 17:17:07',2,'2006-02-15 21:30:53'),(1414,'2005-06-15 17:26:32',4005,304,'2005-06-22 22:30:32',1,'2006-02-15 21:30:53'),(1415,'2005-06-15 17:31:57',1885,331,'2005-06-16 22:22:57',2,'2006-02-15 21:30:53'),(1416,'2005-06-15 17:44:57',3816,167,'2005-06-22 20:53:57',2,'2006-02-15 21:30:53'),(1417,'2005-06-15 17:45:51',1334,570,'2005-06-19 14:00:51',2,'2006-02-15 21:30:53'),(1418,'2005-06-15 17:51:27',2974,591,'2005-06-18 23:20:27',2,'2006-02-15 21:30:53'),(1419,'2005-06-15 17:54:50',1208,312,'2005-06-17 19:44:50',2,'2006-02-15 21:30:53'),(1420,'2005-06-15 17:56:14',4149,255,'2005-06-24 15:45:14',2,'2006-02-15 21:30:53'),(1421,'2005-06-15 17:57:04',2439,533,'2005-06-21 20:38:04',2,'2006-02-15 21:30:53'),(1422,'2005-06-15 18:02:53',1021,1,'2005-06-19 15:54:53',2,'2006-02-15 21:30:53'),(1423,'2005-06-15 18:08:12',1396,592,'2005-06-24 19:13:12',1,'2006-02-15 21:30:53'),(1424,'2005-06-15 18:08:14',887,224,'2005-06-24 23:16:14',2,'2006-02-15 21:30:53'),(1425,'2005-06-15 18:13:46',1308,108,'2005-06-18 22:50:46',2,'2006-02-15 21:30:53'),(1426,'2005-06-15 18:16:24',4412,363,'2005-06-18 22:15:24',2,'2006-02-15 21:30:53'),(1427,'2005-06-15 18:17:28',14,100,'2005-06-16 15:47:28',1,'2006-02-15 21:30:53'),(1428,'2005-06-15 18:19:30',3689,583,'2005-06-22 23:05:30',2,'2006-02-15 21:30:53'),(1429,'2005-06-15 18:24:10',4116,362,'2005-06-18 16:30:10',1,'2006-02-15 21:30:53'),(1430,'2005-06-15 18:24:55',3412,194,'2005-06-16 12:26:55',1,'2006-02-15 21:30:53'),(1431,'2005-06-15 18:26:29',3193,438,'2005-06-21 17:33:29',1,'2006-02-15 21:30:53'),(1432,'2005-06-15 18:27:24',523,339,'2005-06-21 14:03:24',2,'2006-02-15 21:30:53'),(1433,'2005-06-15 18:30:00',2310,88,'2005-06-16 15:14:00',1,'2006-02-15 21:30:53'),(1434,'2005-06-15 18:30:46',4228,544,'2005-06-24 17:51:46',1,'2006-02-15 21:30:53'),(1435,'2005-06-15 18:32:30',2769,510,'2005-06-24 12:44:30',2,'2006-02-15 21:30:53'),(1436,'2005-06-15 18:35:40',924,584,'2005-06-21 15:04:40',1,'2006-02-15 21:30:53'),(1437,'2005-06-15 18:37:04',3263,96,'2005-06-20 12:56:04',1,'2006-02-15 21:30:53'),(1438,'2005-06-15 18:38:51',1816,82,'2005-06-17 23:50:51',1,'2006-02-15 21:30:53'),(1439,'2005-06-15 18:45:32',3155,589,'2005-06-22 15:57:32',2,'2006-02-15 21:30:53'),(1440,'2005-06-15 18:53:14',2921,26,'2005-06-24 15:28:14',1,'2006-02-15 21:30:53'),(1441,'2005-06-15 18:54:21',2095,444,'2005-06-22 22:48:21',2,'2006-02-15 21:30:53'),(1442,'2005-06-15 18:55:34',3912,122,'2005-06-22 20:41:34',2,'2006-02-15 21:30:53'),(1443,'2005-06-15 18:57:51',2485,435,'2005-06-18 14:18:51',2,'2006-02-15 21:30:53'),(1444,'2005-06-15 19:08:16',1303,539,'2005-06-24 15:20:16',2,'2006-02-15 21:30:53'),(1445,'2005-06-15 19:10:07',3189,537,'2005-06-19 20:27:07',2,'2006-02-15 21:30:53'),(1446,'2005-06-15 19:13:45',1989,506,'2005-06-23 19:43:45',2,'2006-02-15 21:30:53'),(1447,'2005-06-15 19:13:51',984,471,'2005-06-21 22:56:51',1,'2006-02-15 21:30:53'),(1448,'2005-06-15 19:17:16',2781,246,'2005-06-23 21:56:16',2,'2006-02-15 21:30:53'),(1449,'2005-06-15 19:19:16',1525,471,'2005-06-18 15:24:16',2,'2006-02-15 21:30:53'),(1450,'2005-06-15 19:22:08',4132,268,'2005-06-16 17:53:08',2,'2006-02-15 21:30:53'),(1451,'2005-06-15 19:30:18',3560,18,'2005-06-19 19:22:18',2,'2006-02-15 21:30:53'),(1452,'2005-06-15 19:32:52',4348,243,'2005-06-16 13:45:52',1,'2006-02-15 21:30:53'),(1453,'2005-06-15 19:36:39',3274,457,'2005-06-19 00:16:39',2,'2006-02-15 21:30:53'),(1454,'2005-06-15 19:49:41',102,298,'2005-06-17 15:17:41',2,'2006-02-15 21:30:53'),(1455,'2005-06-15 19:51:06',2194,358,'2005-06-18 21:54:06',2,'2006-02-15 21:30:53'),(1456,'2005-06-15 20:00:11',632,590,'2005-06-23 18:03:11',2,'2006-02-15 21:30:53'),(1457,'2005-06-15 20:05:49',730,345,'2005-06-19 15:35:49',1,'2006-02-15 21:30:53'),(1458,'2005-06-15 20:24:05',3546,178,'2005-06-21 01:22:05',1,'2006-02-15 21:30:53'),(1459,'2005-06-15 20:25:53',1862,218,'2005-06-22 23:34:53',2,'2006-02-15 21:30:53'),(1460,'2005-06-15 20:27:02',1405,565,'2005-06-16 16:21:02',1,'2006-02-15 21:30:53'),(1461,'2005-06-15 20:32:08',4479,216,'2005-06-23 01:08:08',1,'2006-02-15 21:30:53'),(1462,'2005-06-15 20:37:40',653,187,'2005-06-18 19:36:40',2,'2006-02-15 21:30:53'),(1463,'2005-06-15 20:37:51',2984,569,'2005-06-21 16:46:51',2,'2006-02-15 21:30:53'),(1464,'2005-06-15 20:38:14',4113,387,'2005-06-17 14:52:14',2,'2006-02-15 21:30:53'),(1465,'2005-06-15 20:43:08',609,387,'2005-06-18 23:00:08',1,'2006-02-15 21:30:53'),(1466,'2005-06-15 20:46:04',1057,288,'2005-06-24 22:46:04',1,'2006-02-15 21:30:53'),(1467,'2005-06-15 20:47:10',688,506,'2005-06-22 00:30:10',1,'2006-02-15 21:30:53'),(1468,'2005-06-15 20:48:22',228,230,'2005-06-21 19:48:22',1,'2006-02-15 21:30:53'),(1469,'2005-06-15 20:52:36',2451,580,'2005-06-21 19:55:36',1,'2006-02-15 21:30:53'),(1470,'2005-06-15 20:53:07',4044,11,'2005-06-25 02:12:07',1,'2006-02-15 21:30:53'),(1471,'2005-06-15 20:53:26',565,428,'2005-06-24 18:25:26',2,'2006-02-15 21:30:53'),(1472,'2005-06-15 20:54:55',4233,373,'2005-06-24 21:52:55',2,'2006-02-15 21:30:53'),(1473,'2005-06-15 20:55:20',2377,249,'2005-06-21 16:40:20',2,'2006-02-15 21:30:53'),(1474,'2005-06-15 20:55:42',164,202,'2005-06-19 02:41:42',2,'2006-02-15 21:30:53'),(1475,'2005-06-15 21:08:01',1834,344,'2005-06-18 22:33:01',2,'2006-02-15 21:30:53'),(1476,'2005-06-15 21:08:46',1407,1,'2005-06-25 02:26:46',1,'2006-02-15 21:30:53'),(1477,'2005-06-15 21:11:18',418,51,'2005-06-19 02:05:18',1,'2006-02-15 21:30:53'),(1478,'2005-06-15 21:12:13',435,336,'2005-06-18 21:43:13',2,'2006-02-15 21:30:53'),(1479,'2005-06-15 21:13:38',172,592,'2005-06-17 01:26:38',2,'2006-02-15 21:30:53'),(1480,'2005-06-15 21:17:17',2598,27,'2005-06-23 22:01:17',1,'2006-02-15 21:30:53'),(1481,'2005-06-15 21:17:58',3041,125,'2005-06-18 17:53:58',2,'2006-02-15 21:30:53'),(1482,'2005-06-15 21:18:16',3980,60,'2005-06-16 17:07:16',1,'2006-02-15 21:30:53'),(1483,'2005-06-15 21:21:58',1926,242,'2005-06-24 00:44:58',2,'2006-02-15 21:30:53'),(1484,'2005-06-15 21:22:35',1589,320,'2005-06-20 02:27:35',2,'2006-02-15 21:30:53'),(1485,'2005-06-15 21:24:10',194,281,'2005-06-24 23:03:10',1,'2006-02-15 21:30:53'),(1486,'2005-06-15 21:25:30',847,62,'2005-06-16 16:36:30',1,'2006-02-15 21:30:53'),(1487,'2005-06-15 21:27:42',3791,76,'2005-06-22 03:09:42',2,'2006-02-15 21:30:53'),(1488,'2005-06-15 21:39:54',1081,355,'2005-06-16 20:33:54',1,'2006-02-15 21:30:53'),(1489,'2005-06-15 21:41:38',699,213,'2005-06-22 17:00:38',1,'2006-02-15 21:30:53'),(1490,'2005-06-15 21:42:17',3515,123,'2005-06-22 02:01:17',2,'2006-02-15 21:30:53'),(1491,'2005-06-15 21:48:18',848,354,'2005-06-20 16:40:18',1,'2006-02-15 21:30:53'),(1492,'2005-06-15 21:48:35',4148,360,'2005-06-17 17:18:35',1,'2006-02-15 21:30:53'),(1493,'2005-06-15 21:50:32',4581,235,'2005-06-17 01:02:32',2,'2006-02-15 21:30:53'),(1494,'2005-06-15 21:54:20',244,575,'2005-06-19 18:46:20',1,'2006-02-15 21:30:53'),(1495,'2005-06-15 21:54:31',1842,175,'2005-06-19 00:08:31',2,'2006-02-15 21:30:53'),(1496,'2005-06-15 21:55:58',3915,290,'2005-06-17 02:28:58',2,'2006-02-15 21:30:53'),(1497,'2005-06-15 21:56:39',2958,44,'2005-06-20 20:32:39',1,'2006-02-15 21:30:53'),(1498,'2005-06-15 21:58:00',3690,352,'2005-06-17 21:50:00',1,'2006-02-15 21:30:53'),(1499,'2005-06-15 21:58:07',165,375,'2005-06-22 19:37:07',2,'2006-02-15 21:30:53'),(1500,'2005-06-15 22:00:45',2652,237,'2005-06-18 16:19:45',2,'2006-02-15 21:30:53'),(1501,'2005-06-15 22:02:35',1780,148,'2005-06-23 18:59:35',1,'2006-02-15 21:30:53'),(1502,'2005-06-15 22:03:14',3277,5,'2005-06-23 18:42:14',2,'2006-02-15 21:30:53'),(1503,'2005-06-15 22:07:09',763,197,'2005-06-20 23:15:09',1,'2006-02-15 21:30:53'),(1504,'2005-06-15 22:08:06',3621,423,'2005-06-24 01:16:06',2,'2006-02-15 21:30:53'),(1505,'2005-06-15 22:12:50',2961,561,'2005-06-17 21:37:50',2,'2006-02-15 21:30:53'),(1506,'2005-06-15 22:19:37',4085,404,'2005-06-22 18:28:37',1,'2006-02-15 21:30:53'),(1507,'2005-06-15 22:25:26',2514,172,'2005-06-19 17:00:26',1,'2006-02-15 21:30:53'),(1508,'2005-06-15 22:33:24',1141,511,'2005-06-18 02:27:24',2,'2006-02-15 21:30:53'),(1509,'2005-06-15 22:35:53',655,167,'2005-06-23 17:09:53',2,'2006-02-15 21:30:53'),(1510,'2005-06-15 22:39:34',989,338,'2005-06-24 19:21:34',2,'2006-02-15 21:30:53'),(1511,'2005-06-15 22:45:06',1135,330,'2005-06-22 22:48:06',1,'2006-02-15 21:30:53'),(1512,'2005-06-15 22:53:03',1628,452,'2005-06-23 18:56:03',1,'2006-02-15 21:30:53'),(1513,'2005-06-15 22:53:30',1173,368,'2005-06-23 01:00:30',1,'2006-02-15 21:30:53'),(1514,'2005-06-15 22:57:34',2937,410,'2005-06-19 20:27:34',1,'2006-02-15 21:30:53'),(1515,'2005-06-15 23:07:50',3244,115,'2005-06-20 02:33:50',2,'2006-02-15 21:30:53'),(1516,'2005-06-15 23:11:10',3702,530,'2005-06-17 20:37:10',1,'2006-02-15 21:30:53'),(1517,'2005-06-15 23:20:26',3728,148,'2005-06-23 23:23:26',1,'2006-02-15 21:30:53'),(1518,'2005-06-15 23:36:37',4537,237,'2005-06-16 18:24:37',2,'2006-02-15 21:30:53'),(1519,'2005-06-15 23:55:27',1553,155,'2005-06-21 04:06:27',2,'2006-02-15 21:30:53'),(1520,'2005-06-15 23:57:20',3419,341,'2005-06-24 23:46:20',1,'2006-02-15 21:30:53'),(1521,'2005-06-15 23:58:53',4299,149,'2005-06-18 03:10:53',1,'2006-02-15 21:30:53'),(1522,'2005-06-16 00:17:39',235,133,'2005-06-22 05:38:39',1,'2006-02-15 21:30:53'),(1523,'2005-06-16 00:18:40',681,349,'2005-06-17 02:50:40',2,'2006-02-15 21:30:53'),(1524,'2005-06-16 00:25:52',3439,177,'2005-06-19 03:32:52',1,'2006-02-15 21:30:53'),(1525,'2005-06-16 00:26:07',1467,304,'2005-06-19 22:37:07',2,'2006-02-15 21:30:53'),(1526,'2005-06-16 00:27:51',1940,499,'2005-06-19 00:19:51',1,'2006-02-15 21:30:53'),(1527,'2005-06-16 00:31:40',296,188,'2005-06-21 05:20:40',1,'2006-02-15 21:30:53'),(1528,'2005-06-16 00:32:52',4297,110,'2005-06-25 01:07:52',2,'2006-02-15 21:30:53'),(1529,'2005-06-16 00:37:35',1688,362,'2005-06-22 18:58:35',2,'2006-02-15 21:30:53'),(1530,'2005-06-16 00:38:07',2421,392,'2005-06-24 02:45:07',2,'2006-02-15 21:30:53'),(1531,'2005-06-16 00:40:34',1388,515,'2005-06-22 02:44:34',1,'2006-02-15 21:30:53'),(1532,'2005-06-16 00:41:31',3793,290,'2005-06-20 21:36:31',1,'2006-02-15 21:30:53'),(1533,'2005-06-16 00:46:02',2452,116,'2005-06-17 20:11:02',1,'2006-02-15 21:30:53'),(1534,'2005-06-16 00:49:32',3124,42,'2005-06-18 02:41:32',1,'2006-02-15 21:30:53'),(1535,'2005-06-16 00:52:04',1096,202,'2005-06-20 22:47:04',2,'2006-02-15 21:30:53'),(1536,'2005-06-16 00:52:22',3248,339,'2005-06-17 21:43:22',1,'2006-02-15 21:30:53'),(1537,'2005-06-16 00:52:51',4577,594,'2005-06-20 19:33:51',2,'2006-02-15 21:30:53'),(1538,'2005-06-16 01:05:50',708,430,'2005-06-18 19:48:50',1,'2006-02-15 21:30:53'),(1539,'2005-06-16 01:11:25',267,390,'2005-06-23 03:43:25',2,'2006-02-15 21:30:53'),(1540,'2005-06-16 01:14:56',2707,586,'2005-06-20 23:31:56',2,'2006-02-15 21:30:53'),(1541,'2005-06-16 01:15:59',1911,189,'2005-06-22 21:26:59',2,'2006-02-15 21:30:53'),(1542,'2005-06-16 01:20:05',1714,182,'2005-06-22 03:59:05',1,'2006-02-15 21:30:53'),(1543,'2005-06-16 01:24:08',1188,28,'2005-06-18 06:24:08',2,'2006-02-15 21:30:53'),(1544,'2005-06-16 01:28:22',269,43,'2005-06-17 06:57:22',2,'2006-02-15 21:30:53'),(1545,'2005-06-16 01:31:23',762,563,'2005-06-24 05:50:23',1,'2006-02-15 21:30:53'),(1546,'2005-06-16 01:34:05',3913,3,'2005-06-24 04:27:05',1,'2006-02-15 21:30:53'),(1547,'2005-06-16 01:42:24',2909,343,'2005-06-19 01:13:24',1,'2006-02-15 21:30:53'),(1548,'2005-06-16 01:43:33',2094,374,'2005-06-23 22:04:33',2,'2006-02-15 21:30:53'),(1549,'2005-06-16 01:57:15',266,69,'2005-06-18 23:30:15',1,'2006-02-15 21:30:53'),(1550,'2005-06-16 01:58:35',2003,345,'2005-06-18 23:56:35',1,'2006-02-15 21:30:53'),(1551,'2005-06-16 02:01:15',4088,268,'2005-06-22 07:33:15',1,'2006-02-15 21:30:53'),(1552,'2005-06-16 02:01:37',819,518,'2005-06-21 00:59:37',2,'2006-02-15 21:30:53'),(1553,'2005-06-16 02:02:44',4026,416,'2005-06-19 07:50:44',1,'2006-02-15 21:30:53'),(1554,'2005-06-16 02:16:47',715,155,'2005-06-22 05:15:47',1,'2006-02-15 21:30:53'),(1555,'2005-06-16 02:17:07',4168,256,'2005-06-22 06:28:07',1,'2006-02-15 21:30:53'),(1556,'2005-06-16 02:19:02',533,54,'2005-06-17 22:36:02',2,'2006-02-15 21:30:53'),(1557,'2005-06-16 02:28:35',2617,439,'2005-06-16 22:11:35',2,'2006-02-15 21:30:53'),(1558,'2005-06-16 02:33:53',4350,20,'2005-06-19 20:50:53',2,'2006-02-15 21:30:53'),(1559,'2005-06-16 02:35:03',716,574,'2005-06-19 21:22:03',1,'2006-02-15 21:30:53'),(1560,'2005-06-16 02:36:43',3418,239,'2005-06-24 23:10:43',2,'2006-02-15 21:30:53'),(1561,'2005-06-16 02:41:30',2263,431,'2005-06-22 05:19:30',1,'2006-02-15 21:30:53'),(1562,'2005-06-16 02:46:27',595,395,'2005-06-23 00:56:27',2,'2006-02-15 21:30:53'),(1563,'2005-06-16 02:46:28',1516,262,'2005-06-18 02:37:28',1,'2006-02-15 21:30:53'),(1564,'2005-06-16 02:47:07',145,343,'2005-06-24 03:12:07',1,'2006-02-15 21:30:53'),(1565,'2005-06-16 03:13:09',3833,506,'2005-06-16 22:42:09',2,'2006-02-15 21:30:53'),(1566,'2005-06-16 03:13:20',3215,174,'2005-06-24 01:59:20',2,'2006-02-15 21:30:53'),(1567,'2005-06-16 03:13:30',3098,320,'2005-06-21 23:56:30',1,'2006-02-15 21:30:53'),(1568,'2005-06-16 03:14:01',635,178,'2005-06-19 21:17:01',2,'2006-02-15 21:30:53'),(1569,'2005-06-16 03:19:09',3927,363,'2005-06-18 21:55:09',2,'2006-02-15 21:30:53'),(1570,'2005-06-16 03:21:33',3711,82,'2005-06-22 22:03:33',2,'2006-02-15 21:30:53'),(1571,'2005-06-16 03:22:00',1019,54,'2005-06-22 23:27:00',1,'2006-02-15 21:30:53'),(1572,'2005-06-16 03:23:22',4179,560,'2005-06-20 06:03:22',2,'2006-02-15 21:30:53'),(1573,'2005-06-16 03:31:39',4536,371,'2005-06-25 04:04:39',1,'2006-02-15 21:30:53'),(1574,'2005-06-16 03:39:56',161,305,'2005-06-22 05:40:56',2,'2006-02-15 21:30:53'),(1575,'2005-06-16 03:41:38',3317,6,'2005-06-22 03:01:38',2,'2006-02-15 21:30:53'),(1576,'2005-06-16 03:54:39',1014,442,'2005-06-24 21:55:39',2,'2006-02-15 21:30:53'),(1577,'2005-06-16 04:03:28',367,327,'2005-06-24 22:40:28',2,'2006-02-15 21:30:53'),(1578,'2005-06-16 04:08:16',3397,365,'2005-06-23 07:57:16',1,'2006-02-15 21:30:53'),(1579,'2005-06-16 04:09:08',158,35,'2005-06-21 05:21:08',2,'2006-02-15 21:30:53'),(1580,'2005-06-16 04:12:25',2479,87,'2005-06-20 06:53:25',1,'2006-02-15 21:30:53'),(1581,'2005-06-16 04:28:45',4004,109,'2005-06-18 07:07:45',1,'2006-02-15 21:30:53'),(1582,'2005-06-16 04:31:57',163,536,'2005-06-22 01:25:57',1,'2006-02-15 21:30:53'),(1583,'2005-06-16 04:44:23',270,37,'2005-06-18 03:44:23',1,'2006-02-15 21:30:53'),(1584,'2005-06-16 04:50:50',3545,434,'2005-06-21 22:51:50',2,'2006-02-15 21:30:53'),(1585,'2005-06-16 04:51:13',1708,386,'2005-06-24 00:23:13',2,'2006-02-15 21:30:53'),(1586,'2005-06-16 04:51:18',769,140,'2005-06-21 06:54:18',2,'2006-02-15 21:30:53'),(1587,'2005-06-16 04:52:28',1781,62,'2005-06-23 07:36:28',1,'2006-02-15 21:30:53'),(1588,'2005-06-16 04:53:21',4472,322,'2005-06-25 07:29:21',2,'2006-02-15 21:30:53'),(1589,'2005-06-16 04:58:03',4307,293,'2005-06-24 08:36:03',1,'2006-02-15 21:30:53'),(1590,'2005-06-16 05:11:41',3685,98,'2005-06-23 10:11:41',1,'2006-02-15 21:30:53'),(1591,'2005-06-16 05:12:37',1648,83,'2005-06-25 06:28:37',2,'2006-02-15 21:30:53'),(1592,'2005-06-16 05:14:37',3798,187,'2005-06-20 10:52:37',2,'2006-02-15 21:30:53'),(1593,'2005-06-16 05:14:52',766,111,'2005-06-24 08:00:52',2,'2006-02-15 21:30:53'),(1594,'2005-06-16 05:15:12',3858,470,'2005-06-25 00:38:12',1,'2006-02-15 21:30:53'),(1595,'2005-06-16 05:23:46',1481,244,'2005-06-20 00:37:46',1,'2006-02-15 21:30:53'),(1596,'2005-06-16 05:30:58',2552,416,'2005-06-21 04:18:58',2,'2006-02-15 21:30:53'),(1597,'2005-06-16 05:47:03',743,432,'2005-06-18 04:21:03',1,'2006-02-15 21:30:53'),(1598,'2005-06-16 06:02:39',4171,314,'2005-06-23 09:09:39',1,'2006-02-15 21:30:53'),(1599,'2005-06-16 06:03:33',1476,215,'2005-06-21 07:46:33',2,'2006-02-15 21:30:53'),(1600,'2005-06-16 06:04:12',2264,196,'2005-06-19 09:39:12',2,'2006-02-15 21:30:53'),(1601,'2005-06-16 06:11:13',3115,428,'2005-06-21 08:57:13',2,'2006-02-15 21:30:53'),(1602,'2005-06-16 06:12:40',1777,441,'2005-06-19 03:50:40',2,'2006-02-15 21:30:53'),(1603,'2005-06-16 06:14:03',3308,395,'2005-06-17 06:04:03',2,'2006-02-15 21:30:53'),(1604,'2005-06-16 06:14:25',3226,272,'2005-06-17 03:53:25',2,'2006-02-15 21:30:53'),(1605,'2005-06-16 06:17:55',593,197,'2005-06-25 01:25:55',1,'2006-02-15 21:30:53'),(1606,'2005-06-16 06:18:31',4290,253,'2005-06-25 09:15:31',1,'2006-02-15 21:30:53'),(1607,'2005-06-16 06:25:35',3289,513,'2005-06-20 02:50:35',2,'2006-02-15 21:30:53'),(1608,'2005-06-16 06:28:57',2581,386,'2005-06-24 05:20:57',2,'2006-02-15 21:30:53'),(1609,'2005-06-16 06:34:59',2279,174,'2005-06-17 09:41:59',2,'2006-02-15 21:30:53'),(1610,'2005-06-16 06:36:33',3551,534,'2005-06-19 07:12:33',1,'2006-02-15 21:30:53'),(1611,'2005-06-16 06:41:35',1739,393,'2005-06-25 06:13:35',2,'2006-02-15 21:30:53'),(1612,'2005-06-16 06:52:05',3025,355,'2005-06-19 01:51:05',1,'2006-02-15 21:30:53'),(1613,'2005-06-16 06:55:10',4462,573,'2005-06-24 12:08:10',1,'2006-02-15 21:30:53'),(1614,'2005-06-16 06:58:02',23,489,'2005-06-23 11:24:02',1,'2006-02-15 21:30:53'),(1615,'2005-06-16 07:00:28',3894,362,'2005-06-25 08:53:28',1,'2006-02-15 21:30:53'),(1616,'2005-06-16 07:04:52',2296,204,'2005-06-24 04:06:52',1,'2006-02-15 21:30:53'),(1617,'2005-06-16 07:06:06',1382,83,'2005-06-25 03:35:06',1,'2006-02-15 21:30:53'),(1618,'2005-06-16 07:08:38',3741,134,'2005-06-25 05:26:38',2,'2006-02-15 21:30:53'),(1619,'2005-06-16 07:14:13',4258,232,'2005-06-19 05:50:13',2,'2006-02-15 21:30:53'),(1620,'2005-06-16 07:21:30',389,561,'2005-06-17 09:46:30',1,'2006-02-15 21:30:53'),(1621,'2005-06-16 07:24:12',3677,177,'2005-06-19 02:35:12',1,'2006-02-15 21:30:53'),(1622,'2005-06-16 07:33:18',1774,311,'2005-06-21 07:23:18',1,'2006-02-15 21:30:53'),(1623,'2005-06-16 07:48:50',4485,378,'2005-06-17 03:53:50',2,'2006-02-15 21:30:53'),(1624,'2005-06-16 07:48:57',1066,314,'2005-06-17 05:52:57',1,'2006-02-15 21:30:53'),(1625,'2005-06-16 07:49:08',3367,39,'2005-06-24 09:08:08',2,'2006-02-15 21:30:53'),(1626,'2005-06-16 07:49:47',694,260,'2005-06-22 13:32:47',2,'2006-02-15 21:30:53'),(1627,'2005-06-16 07:51:09',4135,468,'2005-06-24 02:24:09',1,'2006-02-15 21:30:53'),(1628,'2005-06-16 07:52:55',868,427,'2005-06-25 11:09:55',1,'2006-02-15 21:30:53'),(1629,'2005-06-16 07:53:47',4375,339,'2005-06-22 13:03:47',1,'2006-02-15 21:30:53'),(1630,'2005-06-16 07:55:01',2413,130,'2005-06-19 06:38:01',1,'2006-02-15 21:30:53'),(1631,'2005-06-16 08:01:02',2466,5,'2005-06-19 09:04:02',1,'2006-02-15 21:30:53'),(1632,'2005-06-16 08:03:42',1518,319,'2005-06-17 03:40:42',1,'2006-02-15 21:30:53'),(1633,'2005-06-16 08:08:40',280,4,'2005-06-17 11:12:40',1,'2006-02-15 21:30:53'),(1634,'2005-06-16 08:16:05',3990,121,'2005-06-17 04:49:05',1,'2006-02-15 21:30:53'),(1635,'2005-06-16 08:26:56',1187,566,'2005-06-25 06:17:56',2,'2006-02-15 21:30:53'),(1636,'2005-06-16 08:28:54',2052,574,'2005-06-24 09:23:54',1,'2006-02-15 21:30:53'),(1637,'2005-06-16 08:29:58',906,212,'2005-06-23 04:55:58',2,'2006-02-15 21:30:53'),(1638,'2005-06-16 08:32:36',1905,181,'2005-06-18 07:11:36',2,'2006-02-15 21:30:53'),(1639,'2005-06-16 08:33:39',176,450,'2005-06-25 07:51:39',1,'2006-02-15 21:30:53'),(1640,'2005-06-16 08:35:39',443,86,'2005-06-17 05:37:39',2,'2006-02-15 21:30:53'),(1641,'2005-06-16 08:46:26',2925,259,'2005-06-24 14:39:26',2,'2006-02-15 21:30:53'),(1642,'2005-06-16 08:54:15',3875,287,'2005-06-18 12:36:15',1,'2006-02-15 21:30:53'),(1643,'2005-06-16 08:55:35',1352,484,'2005-06-21 05:36:35',2,'2006-02-15 21:30:53'),(1644,'2005-06-16 08:58:18',749,596,'2005-06-21 06:47:18',1,'2006-02-15 21:30:53'),(1645,'2005-06-16 09:10:06',4434,234,'2005-06-23 04:36:06',2,'2006-02-15 21:30:53'),(1646,'2005-06-16 09:12:53',4037,131,'2005-06-24 08:03:53',2,'2006-02-15 21:30:53'),(1647,'2005-06-16 09:14:58',1936,454,'2005-06-17 10:46:58',1,'2006-02-15 21:30:53'),(1648,'2005-06-16 09:17:07',457,427,'2005-06-24 06:31:07',2,'2006-02-15 21:30:53'),(1649,'2005-06-16 09:20:33',390,352,'2005-06-18 13:42:33',1,'2006-02-15 21:30:53'),(1650,'2005-06-16 09:23:20',4125,299,'2005-06-23 11:25:20',1,'2006-02-15 21:30:53'),(1651,'2005-06-16 09:24:38',4444,524,'2005-06-17 09:50:38',2,'2006-02-15 21:30:53'),(1652,'2005-06-16 09:31:37',3416,533,'2005-06-19 14:02:37',2,'2006-02-15 21:30:53'),(1653,'2005-06-16 09:34:45',2294,517,'2005-06-18 09:13:45',1,'2006-02-15 21:30:53'),(1654,'2005-06-16 09:42:48',1039,348,'2005-06-20 14:28:48',2,'2006-02-15 21:30:53'),(1655,'2005-06-16 09:51:39',3693,488,'2005-06-23 14:53:39',2,'2006-02-15 21:30:53'),(1656,'2005-06-16 10:05:40',2253,31,'2005-06-22 06:26:40',1,'2006-02-15 21:30:53'),(1657,'2005-06-16 10:06:49',953,209,'2005-06-22 10:34:49',2,'2006-02-15 21:30:53'),(1658,'2005-06-16 10:07:10',272,568,'2005-06-21 09:23:10',2,'2006-02-15 21:30:53'),(1659,'2005-06-16 10:11:46',1182,296,'2005-06-20 13:51:46',1,'2006-02-15 21:30:53'),(1660,'2005-06-16 10:12:55',2374,238,'2005-06-18 05:56:55',2,'2006-02-15 21:30:53'),(1661,'2005-06-16 10:12:57',2403,508,'2005-06-24 09:23:57',2,'2006-02-15 21:30:53'),(1662,'2005-06-16 10:13:35',3552,378,'2005-06-23 13:54:35',1,'2006-02-15 21:30:53'),(1663,'2005-06-16 10:14:15',1558,186,'2005-06-23 08:34:15',2,'2006-02-15 21:30:53'),(1664,'2005-06-16 10:15:20',2464,216,'2005-06-18 12:11:20',2,'2006-02-15 21:30:53'),(1665,'2005-06-16 10:16:02',2613,490,'2005-06-23 09:32:02',1,'2006-02-15 21:30:53'),(1666,'2005-06-16 10:17:19',4019,557,'2005-06-21 05:50:19',1,'2006-02-15 21:30:53'),(1667,'2005-06-16 10:18:59',2362,333,'2005-06-22 14:45:59',2,'2006-02-15 21:30:53'),(1668,'2005-06-16 10:19:52',2483,569,'2005-06-23 12:22:52',2,'2006-02-15 21:30:53'),(1669,'2005-06-16 10:20:20',360,73,'2005-06-18 04:26:20',1,'2006-02-15 21:30:53'),(1670,'2005-06-16 10:26:33',2066,328,'2005-06-19 07:15:33',1,'2006-02-15 21:30:53'),(1671,'2005-06-16 10:30:22',3805,135,'2005-06-22 11:08:22',2,'2006-02-15 21:30:53'),(1672,'2005-06-16 10:37:34',4206,216,'2005-06-23 05:30:34',1,'2006-02-15 21:30:53'),(1673,'2005-06-16 10:40:17',907,534,'2005-06-18 16:13:17',1,'2006-02-15 21:30:53'),(1674,'2005-06-16 10:57:00',3606,234,'2005-06-18 07:31:00',2,'2006-02-15 21:30:53'),(1675,'2005-06-16 11:04:47',3048,371,'2005-06-24 06:56:47',2,'2006-02-15 21:30:53'),(1676,'2005-06-16 11:06:09',931,171,'2005-06-21 05:17:09',1,'2006-02-15 21:30:53'),(1677,'2005-06-16 11:07:11',240,191,'2005-06-23 10:50:11',1,'2006-02-15 21:30:53'),(1678,'2005-06-16 11:08:28',1856,352,'2005-06-19 15:44:28',1,'2006-02-15 21:30:53'),(1679,'2005-06-16 11:11:01',3959,227,'2005-06-23 08:11:01',1,'2006-02-15 21:30:53'),(1680,'2005-06-16 11:17:22',4441,469,'2005-06-25 15:55:22',2,'2006-02-15 21:30:53'),(1681,'2005-06-16 11:38:17',530,255,'2005-06-19 13:05:17',1,'2006-02-15 21:30:53'),(1682,'2005-06-16 11:54:25',2165,476,'2005-06-22 11:09:25',2,'2006-02-15 21:30:53'),(1683,'2005-06-16 11:54:55',2361,494,'2005-06-18 08:51:55',2,'2006-02-15 21:30:53'),(1684,'2005-06-16 11:57:34',806,485,'2005-06-19 09:12:34',1,'2006-02-15 21:30:53'),(1685,'2005-06-16 12:06:57',2754,85,'2005-06-21 16:53:57',2,'2006-02-15 21:30:53'),(1686,'2005-06-16 12:08:20',3883,529,'2005-06-20 10:59:20',1,'2006-02-15 21:30:53'),(1687,'2005-06-16 12:09:20',3686,140,'2005-06-18 06:18:20',2,'2006-02-15 21:30:53'),(1688,'2005-06-16 12:11:20',383,49,'2005-06-18 08:39:20',2,'2006-02-15 21:30:53'),(1689,'2005-06-16 12:18:41',4036,48,'2005-06-24 13:33:41',2,'2006-02-15 21:30:53'),(1690,'2005-06-16 12:24:18',1099,286,'2005-06-25 15:00:18',1,'2006-02-15 21:30:53'),(1691,'2005-06-16 12:24:28',4438,492,'2005-06-24 08:24:28',1,'2006-02-15 21:30:53'),(1692,'2005-06-16 12:30:19',3544,514,'2005-06-17 17:31:19',2,'2006-02-15 21:30:53'),(1693,'2005-06-16 12:39:51',2386,421,'2005-06-19 16:19:51',2,'2006-02-15 21:30:53'),(1694,'2005-06-16 12:40:23',147,532,'2005-06-20 09:18:23',2,'2006-02-15 21:30:53'),(1695,'2005-06-16 12:40:28',4436,159,'2005-06-22 13:41:28',1,'2006-02-15 21:30:53'),(1696,'2005-06-16 12:50:01',3928,502,'2005-06-24 12:08:01',2,'2006-02-15 21:30:53'),(1697,'2005-06-16 12:55:20',1801,340,'2005-06-23 17:41:20',2,'2006-02-15 21:30:53'),(1698,'2005-06-16 13:04:42',1474,407,'2005-06-21 15:54:42',1,'2006-02-15 21:30:53'),(1699,'2005-06-16 13:05:09',4507,27,'2005-06-17 09:53:09',2,'2006-02-15 21:30:53'),(1700,'2005-06-16 13:18:23',4251,456,'2005-06-21 16:46:23',2,'2006-02-15 21:30:53'),(1701,'2005-06-16 13:18:48',3000,315,'2005-06-22 15:00:48',1,'2006-02-15 21:30:53'),(1702,'2005-06-16 13:21:05',1822,242,'2005-06-19 10:13:05',2,'2006-02-15 21:30:53'),(1703,'2005-06-16 13:28:44',2346,589,'2005-06-17 11:03:44',1,'2006-02-15 21:30:53'),(1704,'2005-06-16 13:45:56',4425,488,'2005-06-24 18:12:56',1,'2006-02-15 21:30:53'),(1705,'2005-06-16 13:59:42',123,564,'2005-06-18 19:54:42',2,'2006-02-15 21:30:53'),(1706,'2005-06-16 14:01:02',2935,26,'2005-06-25 19:29:02',1,'2006-02-15 21:30:53'),(1707,'2005-06-16 14:01:27',185,4,'2005-06-18 09:35:27',1,'2006-02-15 21:30:53'),(1708,'2005-06-16 14:08:44',2259,478,'2005-06-19 08:35:44',1,'2006-02-15 21:30:53'),(1709,'2005-06-16 14:10:15',3501,426,'2005-06-24 16:38:15',2,'2006-02-15 21:30:53'),(1710,'2005-06-16 14:11:24',144,77,'2005-06-22 15:26:24',1,'2006-02-15 21:30:53'),(1711,'2005-06-16 14:11:52',273,347,'2005-06-25 08:49:52',1,'2006-02-15 21:30:53'),(1712,'2005-06-16 14:25:09',1363,535,'2005-06-17 17:55:09',1,'2006-02-15 21:30:53'),(1713,'2005-06-16 14:28:33',2580,164,'2005-06-18 09:02:33',1,'2006-02-15 21:30:53'),(1714,'2005-06-16 14:29:59',535,477,'2005-06-24 17:27:59',2,'2006-02-15 21:30:53'),(1715,'2005-06-16 14:37:12',1594,203,'2005-06-20 19:36:12',1,'2006-02-15 21:30:53'),(1716,'2005-06-16 14:39:31',20,24,'2005-06-19 15:37:31',1,'2006-02-15 21:30:53'),(1717,'2005-06-16 14:47:16',3007,277,'2005-06-19 10:11:16',2,'2006-02-15 21:30:53'),(1718,'2005-06-16 14:52:02',288,516,'2005-06-25 10:53:02',2,'2006-02-15 21:30:53'),(1719,'2005-06-16 14:55:53',2699,582,'2005-06-18 14:12:53',1,'2006-02-15 21:30:53'),(1720,'2005-06-16 15:00:14',3500,543,'2005-06-21 13:57:14',2,'2006-02-15 21:30:53'),(1721,'2005-06-16 15:01:36',3521,485,'2005-06-23 10:48:36',1,'2006-02-15 21:30:53'),(1722,'2005-06-16 15:12:52',2142,364,'2005-06-19 13:01:52',2,'2006-02-15 21:30:53'),(1723,'2005-06-16 15:14:18',2417,259,'2005-06-23 15:45:18',2,'2006-02-15 21:30:53'),(1724,'2005-06-16 15:15:43',61,146,'2005-06-23 10:14:43',2,'2006-02-15 21:30:53'),(1725,'2005-06-16 15:18:57',726,1,'2005-06-17 21:05:57',1,'2006-02-15 21:30:53'),(1726,'2005-06-16 15:19:10',116,3,'2005-06-25 11:39:10',2,'2006-02-15 21:30:53'),(1727,'2005-06-16 15:21:47',2951,457,'2005-06-17 14:12:47',1,'2006-02-15 21:30:53'),(1728,'2005-06-16 15:29:29',1366,59,'2005-06-23 12:47:29',1,'2006-02-15 21:30:53'),(1729,'2005-06-16 15:29:47',3364,523,'2005-06-25 20:55:47',2,'2006-02-15 21:30:53'),(1730,'2005-06-16 15:30:01',1372,390,'2005-06-19 12:56:01',1,'2006-02-15 21:30:53'),(1731,'2005-06-16 15:32:12',3698,344,'2005-06-19 18:58:12',2,'2006-02-15 21:30:53'),(1732,'2005-06-16 15:34:41',2287,129,'2005-06-18 13:05:41',1,'2006-02-15 21:30:53'),(1733,'2005-06-16 15:37:07',542,480,'2005-06-23 15:53:07',2,'2006-02-15 21:30:53'),(1734,'2005-06-16 15:49:30',1113,94,'2005-06-22 13:52:30',2,'2006-02-15 21:30:53'),(1735,'2005-06-16 15:51:52',97,4,'2005-06-20 13:27:52',1,'2006-02-15 21:30:53'),(1736,'2005-06-16 15:52:32',3771,139,'2005-06-21 14:39:32',2,'2006-02-15 21:30:53'),(1737,'2005-06-16 15:59:44',4029,467,'2005-06-23 12:22:44',1,'2006-02-15 21:30:53'),(1738,'2005-06-16 16:07:27',3260,177,'2005-06-20 15:22:27',1,'2006-02-15 21:30:53'),(1739,'2005-06-16 16:09:38',2557,450,'2005-06-22 18:04:38',2,'2006-02-15 21:30:53'),(1740,'2005-06-16 16:29:00',2282,324,'2005-06-20 14:07:00',2,'2006-02-15 21:30:53'),(1741,'2005-06-16 16:31:37',3722,176,'2005-06-25 21:38:37',1,'2006-02-15 21:30:53'),(1742,'2005-06-16 16:37:48',2772,576,'2005-06-17 19:47:48',2,'2006-02-15 21:30:53'),(1743,'2005-06-16 16:38:10',2777,258,'2005-06-17 13:13:10',1,'2006-02-15 21:30:53'),(1744,'2005-06-16 16:39:58',3075,230,'2005-06-18 19:50:58',2,'2006-02-15 21:30:53'),(1745,'2005-06-16 16:41:16',2812,178,'2005-06-23 21:02:16',2,'2006-02-15 21:30:53'),(1746,'2005-06-16 16:41:19',4272,385,'2005-06-19 11:28:19',2,'2006-02-15 21:30:53'),(1747,'2005-06-16 16:53:33',1661,273,'2005-06-25 21:48:33',2,'2006-02-15 21:30:53'),(1748,'2005-06-16 16:54:03',2434,473,'2005-06-18 20:11:03',1,'2006-02-15 21:30:53'),(1749,'2005-06-16 16:56:00',1554,283,'2005-06-21 21:02:00',2,'2006-02-15 21:30:53'),(1750,'2005-06-16 16:57:36',1103,321,'2005-06-25 21:51:36',1,'2006-02-15 21:30:53'),(1751,'2005-06-16 17:00:14',138,123,'2005-06-17 12:12:14',2,'2006-02-15 21:30:53'),(1752,'2005-06-16 17:02:55',3529,12,'2005-06-23 19:09:55',2,'2006-02-15 21:30:53'),(1753,'2005-06-16 17:08:17',3817,249,'2005-06-21 21:47:17',2,'2006-02-15 21:30:53'),(1754,'2005-06-16 17:13:23',4106,25,'2005-06-22 20:46:23',1,'2006-02-15 21:30:53'),(1755,'2005-06-16 17:18:44',1721,117,'2005-06-17 16:54:44',1,'2006-02-15 21:30:53'),(1756,'2005-06-16 17:22:33',1401,571,'2005-06-21 16:52:33',1,'2006-02-15 21:30:53'),(1757,'2005-06-16 17:32:24',4491,510,'2005-06-18 13:12:24',1,'2006-02-15 21:30:53'),(1758,'2005-06-16 17:39:39',2654,474,'2005-06-25 13:06:39',1,'2006-02-15 21:30:53'),(1759,'2005-06-16 17:46:37',1402,430,'2005-06-24 19:40:37',2,'2006-02-15 21:30:53'),(1760,'2005-06-16 17:48:37',3929,261,'2005-06-18 16:01:37',2,'2006-02-15 21:30:53'),(1761,'2005-06-16 17:49:57',1570,521,'2005-06-17 21:03:57',2,'2006-02-15 21:30:53'),(1762,'2005-06-16 17:50:19',3050,116,'2005-06-19 21:35:19',2,'2006-02-15 21:30:53'),(1763,'2005-06-16 17:51:01',1941,389,'2005-06-20 17:27:01',1,'2006-02-15 21:30:53'),(1764,'2005-06-16 17:51:54',705,392,'2005-06-21 20:36:54',2,'2006-02-15 21:30:53'),(1765,'2005-06-16 17:56:10',822,273,'2005-06-19 23:40:10',2,'2006-02-15 21:30:53'),(1766,'2005-06-16 17:59:37',2041,118,'2005-06-18 16:32:37',2,'2006-02-15 21:30:53'),(1767,'2005-06-16 18:01:36',1162,205,'2005-06-18 12:39:36',2,'2006-02-15 21:30:53'),(1768,'2005-06-16 18:02:06',2131,131,'2005-06-23 17:19:06',2,'2006-02-15 21:30:53'),(1769,'2005-06-16 18:07:48',1229,397,'2005-06-22 12:39:48',1,'2006-02-15 21:30:53'),(1770,'2005-06-16 18:07:55',1681,359,'2005-06-23 23:49:55',2,'2006-02-15 21:30:53'),(1771,'2005-06-16 18:12:17',1769,416,'2005-06-18 16:11:17',1,'2006-02-15 21:30:53'),(1772,'2005-06-16 18:12:54',1269,525,'2005-06-24 19:55:54',1,'2006-02-15 21:30:53'),(1773,'2005-06-16 18:13:43',4396,462,'2005-06-24 17:43:43',2,'2006-02-15 21:30:53'),(1774,'2005-06-16 18:27:52',3058,442,'2005-06-21 13:35:52',2,'2006-02-15 21:30:53'),(1775,'2005-06-16 18:28:19',1922,123,'2005-06-25 13:09:19',2,'2006-02-15 21:30:53'),(1776,'2005-06-16 18:46:58',1404,472,'2005-06-24 16:01:58',1,'2006-02-15 21:30:53'),(1777,'2005-06-16 18:52:12',3325,49,'2005-06-25 13:55:12',1,'2006-02-15 21:30:53'),(1778,'2005-06-16 18:54:48',2512,341,'2005-06-22 16:08:48',2,'2006-02-15 21:30:53'),(1779,'2005-06-16 18:55:11',1044,438,'2005-06-17 20:11:11',1,'2006-02-15 21:30:53'),(1780,'2005-06-16 19:11:45',146,352,'2005-06-19 15:34:45',2,'2006-02-15 21:30:53'),(1781,'2005-06-16 19:20:24',2841,429,'2005-06-25 17:02:24',2,'2006-02-15 21:30:53'),(1782,'2005-06-16 19:21:12',1820,498,'2005-06-22 16:03:12',2,'2006-02-15 21:30:53'),(1783,'2005-06-16 19:23:23',50,18,'2005-06-18 00:57:23',1,'2006-02-15 21:30:53'),(1784,'2005-06-16 19:25:32',3792,134,'2005-06-20 00:00:32',2,'2006-02-15 21:30:53'),(1785,'2005-06-16 19:27:12',3413,50,'2005-06-24 19:25:12',1,'2006-02-15 21:30:53'),(1786,'2005-06-16 19:30:54',263,323,'2005-06-19 14:24:54',1,'2006-02-15 21:30:53'),(1787,'2005-06-16 19:30:59',3823,546,'2005-06-21 18:25:59',2,'2006-02-15 21:30:53'),(1788,'2005-06-16 19:47:18',3794,357,'2005-06-22 23:10:18',1,'2006-02-15 21:30:53'),(1789,'2005-06-16 19:49:18',4264,105,'2005-06-23 17:07:18',2,'2006-02-15 21:30:53'),(1790,'2005-06-16 19:58:40',1070,158,'2005-06-17 19:31:40',2,'2006-02-15 21:30:53'),(1791,'2005-06-16 20:04:28',301,76,'2005-06-23 22:30:28',1,'2006-02-15 21:30:53'),(1792,'2005-06-16 20:04:50',3800,351,'2005-06-26 00:57:50',1,'2006-02-15 21:30:53'),(1793,'2005-06-16 20:07:27',4356,230,'2005-06-19 20:55:27',1,'2006-02-15 21:30:53'),(1794,'2005-06-16 20:08:37',497,452,'2005-06-22 01:54:37',1,'2006-02-15 21:30:53'),(1795,'2005-06-16 20:09:01',536,56,'2005-06-24 17:50:01',2,'2006-02-15 21:30:53'),(1796,'2005-06-16 20:10:43',3229,283,'2005-06-20 19:12:43',1,'2006-02-15 21:30:53'),(1797,'2005-06-16 20:13:03',3435,275,'2005-06-22 22:56:03',1,'2006-02-15 21:30:53'),(1798,'2005-06-16 20:16:15',1654,429,'2005-06-20 22:23:15',2,'2006-02-15 21:30:53'),(1799,'2005-06-16 20:17:20',2847,505,'2005-06-20 23:55:20',1,'2006-02-15 21:30:53'),(1800,'2005-06-16 20:18:46',2058,149,'2005-06-20 17:12:46',1,'2006-02-15 21:30:53'),(1801,'2005-06-16 20:21:53',1015,10,'2005-06-18 23:18:53',1,'2006-02-15 21:30:53'),(1802,'2005-06-16 20:23:30',4174,455,'2005-06-21 20:02:30',1,'2006-02-15 21:30:53'),(1803,'2005-06-16 20:32:47',3784,127,'2005-06-21 02:03:47',1,'2006-02-15 21:30:53'),(1804,'2005-06-16 20:33:15',1152,570,'2005-06-18 02:31:15',2,'2006-02-15 21:30:53'),(1805,'2005-06-16 20:36:00',3962,208,'2005-06-17 16:27:00',1,'2006-02-15 21:30:53'),(1806,'2005-06-16 20:41:57',2053,45,'2005-06-18 19:25:57',2,'2006-02-15 21:30:53'),(1807,'2005-06-16 20:58:59',1174,338,'2005-06-20 21:31:59',2,'2006-02-15 21:30:53'),(1808,'2005-06-16 20:59:35',2424,466,'2005-06-24 15:31:35',1,'2006-02-15 21:30:53'),(1809,'2005-06-16 21:00:20',1071,517,'2005-06-25 20:25:20',1,'2006-02-15 21:30:53'),(1810,'2005-06-16 21:06:00',2368,7,'2005-06-21 21:24:00',1,'2006-02-15 21:30:53'),(1811,'2005-06-16 21:06:20',3700,235,'2005-06-21 21:59:20',2,'2006-02-15 21:30:53'),(1812,'2005-06-16 21:08:46',751,37,'2005-06-21 15:44:46',2,'2006-02-15 21:30:53'),(1813,'2005-06-16 21:11:00',1236,259,'2005-06-24 15:30:00',1,'2006-02-15 21:30:53'),(1814,'2005-06-16 21:15:22',39,144,'2005-06-23 17:00:22',1,'2006-02-15 21:30:53'),(1815,'2005-06-16 21:16:07',1551,84,'2005-06-17 16:37:07',2,'2006-02-15 21:30:53'),(1816,'2005-06-16 21:20:41',2861,594,'2005-06-18 02:21:41',1,'2006-02-15 21:30:53'),(1817,'2005-06-16 21:20:52',1354,574,'2005-06-19 16:24:52',2,'2006-02-15 21:30:53'),(1818,'2005-06-16 21:30:34',1218,63,'2005-06-20 03:27:34',2,'2006-02-15 21:30:53'),(1819,'2005-06-16 21:32:50',1689,386,'2005-06-26 01:11:50',1,'2006-02-15 21:30:53'),(1820,'2005-06-16 21:34:50',3672,120,'2005-06-20 16:50:50',1,'2006-02-15 21:30:53'),(1821,'2005-06-16 21:42:49',3207,468,'2005-06-20 16:25:49',2,'2006-02-15 21:30:53'),(1822,'2005-06-16 21:43:45',674,86,'2005-06-17 21:37:45',1,'2006-02-15 21:30:53'),(1823,'2005-06-16 21:48:16',3871,448,'2005-06-22 03:09:16',1,'2006-02-15 21:30:53'),(1824,'2005-06-16 21:51:04',2269,575,'2005-06-18 18:12:04',1,'2006-02-15 21:30:53'),(1825,'2005-06-16 21:53:05',2908,55,'2005-06-20 17:22:05',2,'2006-02-15 21:30:53'),(1826,'2005-06-16 21:53:52',421,578,'2005-06-25 18:46:52',2,'2006-02-15 21:30:53'),(1827,'2005-06-16 21:54:40',3804,423,'2005-06-19 21:28:40',2,'2006-02-15 21:30:53'),(1828,'2005-06-16 22:04:34',316,68,'2005-06-20 21:07:34',2,'2006-02-15 21:30:53'),(1829,'2005-06-16 22:14:21',617,293,'2005-06-21 16:51:21',1,'2006-02-15 21:30:53'),(1830,'2005-06-16 22:18:43',4010,499,'2005-06-23 21:14:43',2,'2006-02-15 21:30:53'),(1831,'2005-06-16 22:22:17',2610,383,'2005-06-25 23:23:17',2,'2006-02-15 21:30:53'),(1832,'2005-06-16 22:35:20',500,220,'2005-06-19 03:09:20',1,'2006-02-15 21:30:53'),(1833,'2005-06-16 22:45:03',1337,121,'2005-06-20 22:02:03',2,'2006-02-15 21:30:53'),(1834,'2005-06-16 22:49:08',4018,189,'2005-06-22 21:08:08',1,'2006-02-15 21:30:53'),(1835,'2005-06-16 23:05:36',1482,112,'2005-06-19 04:46:36',1,'2006-02-15 21:30:53'),(1836,'2005-06-16 23:13:05',2753,176,'2005-06-24 01:40:05',2,'2006-02-15 21:30:53'),(1837,'2005-06-16 23:16:15',1259,309,'2005-06-21 21:54:15',1,'2006-02-15 21:30:53'),(1838,'2005-06-16 23:20:16',513,31,'2005-06-20 02:34:16',1,'2006-02-15 21:30:53'),(1839,'2005-06-16 23:22:22',2750,223,'2005-06-23 00:33:22',1,'2006-02-15 21:30:53'),(1840,'2005-06-16 23:39:34',340,404,'2005-06-21 23:36:34',1,'2006-02-15 21:30:53'),(1841,'2005-06-16 23:44:13',2363,6,'2005-06-22 04:09:13',1,'2006-02-15 21:30:53'),(1842,'2005-06-16 23:45:59',1472,426,'2005-06-26 05:31:59',1,'2006-02-15 21:30:53'),(1843,'2005-06-16 23:53:42',2714,132,'2005-06-22 18:33:42',2,'2006-02-15 21:30:53'),(1844,'2005-06-16 23:53:53',2307,454,'2005-06-22 02:19:53',2,'2006-02-15 21:30:53'),(1845,'2005-06-16 23:56:11',3395,215,'2005-06-19 01:41:11',2,'2006-02-15 21:30:53'),(1846,'2005-06-17 00:02:44',1725,422,'2005-06-18 23:47:44',2,'2006-02-15 21:30:53'),(1847,'2005-06-17 00:05:22',1189,363,'2005-06-20 21:09:22',1,'2006-02-15 21:30:53'),(1848,'2005-06-17 00:07:07',3797,526,'2005-06-21 21:41:07',2,'2006-02-15 21:30:53'),(1849,'2005-06-17 00:13:19',2507,341,'2005-06-23 18:37:19',2,'2006-02-15 21:30:53'),(1850,'2005-06-17 00:31:35',761,517,'2005-06-25 05:19:35',1,'2006-02-15 21:30:53'),(1851,'2005-06-17 00:32:26',1121,451,'2005-06-22 19:54:26',2,'2006-02-15 21:30:53'),(1852,'2005-06-17 00:38:20',4122,271,'2005-06-22 20:04:20',2,'2006-02-15 21:30:53'),(1853,'2005-06-17 00:39:54',2949,301,'2005-06-19 00:22:54',2,'2006-02-15 21:30:53'),(1854,'2005-06-17 00:43:57',119,37,'2005-06-23 05:49:57',1,'2006-02-15 21:30:53'),(1855,'2005-06-17 00:54:58',4457,492,'2005-06-20 19:29:58',1,'2006-02-15 21:30:53'),(1856,'2005-06-17 01:02:00',3034,161,'2005-06-19 21:29:00',2,'2006-02-15 21:30:53'),(1857,'2005-06-17 01:12:58',4257,427,'2005-06-21 04:49:58',1,'2006-02-15 21:30:53'),(1858,'2005-06-17 01:13:11',3200,99,'2005-06-18 21:33:11',2,'2006-02-15 21:30:53'),(1859,'2005-06-17 01:13:38',3405,533,'2005-06-18 03:13:38',1,'2006-02-15 21:30:53'),(1860,'2005-06-17 01:17:12',1853,293,'2005-06-21 22:35:12',1,'2006-02-15 21:30:53'),(1861,'2005-06-17 01:17:31',135,454,'2005-06-25 02:11:31',1,'2006-02-15 21:30:53'),(1862,'2005-06-17 01:29:30',3299,553,'2005-06-25 20:43:30',1,'2006-02-15 21:30:53'),(1863,'2005-06-17 01:31:46',4466,550,'2005-06-26 02:09:46',2,'2006-02-15 21:30:53'),(1864,'2005-06-17 01:39:47',1815,130,'2005-06-24 19:39:47',2,'2006-02-15 21:30:53'),(1865,'2005-06-17 01:49:36',2657,526,'2005-06-23 21:13:36',1,'2006-02-15 21:30:53'),(1866,'2005-06-17 01:53:19',2579,575,'2005-06-19 06:14:19',2,'2006-02-15 21:30:53'),(1867,'2005-06-17 02:01:37',3537,415,'2005-06-25 04:52:37',2,'2006-02-15 21:30:53'),(1868,'2005-06-17 02:03:22',2412,380,'2005-06-25 04:38:22',1,'2006-02-15 21:30:53'),(1869,'2005-06-17 02:08:00',871,351,'2005-06-19 21:43:00',1,'2006-02-15 21:30:53'),(1870,'2005-06-17 02:24:36',895,191,'2005-06-17 23:04:36',2,'2006-02-15 21:30:53'),(1871,'2005-06-17 02:25:12',481,204,'2005-06-23 03:16:12',2,'2006-02-15 21:30:53'),(1872,'2005-06-17 02:27:03',3596,206,'2005-06-20 22:41:03',2,'2006-02-15 21:30:53'),(1873,'2005-06-17 02:38:28',2933,71,'2005-06-23 04:39:28',1,'2006-02-15 21:30:53'),(1874,'2005-06-17 02:39:20',3884,30,'2005-06-24 04:41:20',2,'2006-02-15 21:30:53'),(1875,'2005-06-17 02:45:10',1652,528,'2005-06-22 22:54:10',2,'2006-02-15 21:30:53'),(1876,'2005-06-17 02:50:51',384,459,'2005-06-18 07:21:51',1,'2006-02-15 21:30:53'),(1877,'2005-06-17 02:54:16',3404,261,'2005-06-25 21:51:16',2,'2006-02-15 21:30:53'),(1878,'2005-06-17 02:55:32',3319,381,'2005-06-21 03:44:32',1,'2006-02-15 21:30:53'),(1879,'2005-06-17 02:57:34',3983,343,'2005-06-19 00:00:34',1,'2006-02-15 21:30:53'),(1880,'2005-06-17 03:08:59',1133,289,'2005-06-19 07:16:59',1,'2006-02-15 21:30:53'),(1881,'2005-06-17 03:09:56',159,134,'2005-06-18 01:49:56',1,'2006-02-15 21:30:53'),(1882,'2005-06-17 03:17:21',1400,47,'2005-06-19 22:23:21',2,'2006-02-15 21:30:53'),(1883,'2005-06-17 03:18:51',3504,550,'2005-06-18 05:46:51',1,'2006-02-15 21:30:53'),(1884,'2005-06-17 03:19:20',4567,305,'2005-06-21 00:19:20',1,'2006-02-15 21:30:53'),(1885,'2005-06-17 03:35:59',740,588,'2005-06-21 05:57:59',2,'2006-02-15 21:30:53'),(1886,'2005-06-17 03:36:02',2367,505,'2005-06-19 08:12:02',2,'2006-02-15 21:30:53'),(1887,'2005-06-17 03:53:18',3591,32,'2005-06-25 07:37:18',2,'2006-02-15 21:30:53'),(1888,'2005-06-17 03:58:36',2872,405,'2005-06-22 09:28:36',1,'2006-02-15 21:30:53'),(1889,'2005-06-17 04:05:12',3909,572,'2005-06-26 04:13:12',1,'2006-02-15 21:30:53'),(1890,'2005-06-17 04:06:13',1764,447,'2005-06-22 07:46:13',2,'2006-02-15 21:30:53'),(1891,'2005-06-17 04:16:44',3576,109,'2005-06-24 07:20:44',1,'2006-02-15 21:30:53'),(1892,'2005-06-17 04:17:33',139,319,'2005-06-20 00:06:33',1,'2006-02-15 21:30:53'),(1893,'2005-06-17 04:18:37',3346,390,'2005-06-23 23:35:37',2,'2006-02-15 21:30:53'),(1894,'2005-06-17 04:18:48',3707,204,'2005-06-26 00:07:48',1,'2006-02-15 21:30:53'),(1895,'2005-06-17 04:25:12',680,30,'2005-06-26 08:44:12',1,'2006-02-15 21:30:53'),(1896,'2005-06-17 04:25:46',2077,270,'2005-06-26 09:37:46',1,'2006-02-15 21:30:53'),(1897,'2005-06-17 04:26:23',4142,422,'2005-06-25 09:32:23',2,'2006-02-15 21:30:53'),(1898,'2005-06-17 04:28:11',2873,143,'2005-06-25 07:04:11',2,'2006-02-15 21:30:53'),(1899,'2005-06-17 04:29:15',858,200,'2005-06-26 08:39:15',1,'2006-02-15 21:30:53'),(1900,'2005-06-17 04:29:58',1425,34,'2005-06-21 05:58:58',1,'2006-02-15 21:30:53'),(1901,'2005-06-17 04:35:19',2469,292,'2005-06-25 06:09:19',2,'2006-02-15 21:30:53'),(1902,'2005-06-17 04:35:52',2905,479,'2005-06-20 06:52:52',2,'2006-02-15 21:30:53'),(1903,'2005-06-17 04:37:20',1939,588,'2005-06-26 09:05:20',2,'2006-02-15 21:30:53'),(1904,'2005-06-17 04:45:41',2472,87,'2005-06-17 23:56:41',2,'2006-02-15 21:30:53'),(1905,'2005-06-17 04:51:43',1043,39,'2005-06-24 09:35:43',1,'2006-02-15 21:30:53'),(1906,'2005-06-17 04:53:35',1049,455,'2005-06-21 01:16:35',2,'2006-02-15 21:30:53'),(1907,'2005-06-17 05:08:27',988,66,'2005-06-23 09:13:27',1,'2006-02-15 21:30:53'),(1908,'2005-06-17 05:10:36',399,358,'2005-06-19 03:52:36',1,'2006-02-15 21:30:53'),(1909,'2005-06-17 05:11:04',2599,269,'2005-06-19 04:33:04',2,'2006-02-15 21:30:53'),(1910,'2005-06-17 05:11:27',3903,199,'2005-06-23 23:16:27',1,'2006-02-15 21:30:53'),(1911,'2005-06-17 05:15:15',910,3,'2005-06-24 11:05:15',2,'2006-02-15 21:30:53'),(1912,'2005-06-17 05:18:32',4136,538,'2005-06-20 10:01:32',2,'2006-02-15 21:30:53'),(1913,'2005-06-17 05:19:47',1825,116,'2005-06-21 03:39:47',1,'2006-02-15 21:30:53'),(1914,'2005-06-17 05:25:54',3406,450,'2005-06-24 04:25:54',2,'2006-02-15 21:30:53'),(1915,'2005-06-17 05:28:28',2620,393,'2005-06-21 07:12:28',2,'2006-02-15 21:30:53'),(1916,'2005-06-17 05:29:59',4428,429,'2005-06-26 05:35:59',2,'2006-02-15 21:30:53'),(1917,'2005-06-17 05:36:07',2667,400,'2005-06-24 01:44:07',1,'2006-02-15 21:30:53'),(1918,'2005-06-17 05:40:14',3749,310,'2005-06-21 08:53:14',2,'2006-02-15 21:30:53'),(1919,'2005-06-17 05:40:52',3855,197,'2005-06-23 05:58:52',1,'2006-02-15 21:30:53'),(1920,'2005-06-17 06:00:23',2199,75,'2005-06-24 04:49:23',1,'2006-02-15 21:30:53'),(1921,'2005-06-17 06:04:16',4369,417,'2005-06-23 05:26:16',2,'2006-02-15 21:30:53'),(1922,'2005-06-17 06:04:25',2484,343,'2005-06-18 09:15:25',2,'2006-02-15 21:30:53'),(1923,'2005-06-17 06:06:10',691,400,'2005-06-24 04:29:10',2,'2006-02-15 21:30:53'),(1924,'2005-06-17 06:13:34',2577,86,'2005-06-18 01:51:34',1,'2006-02-15 21:30:53'),(1925,'2005-06-17 06:16:47',3995,510,'2005-06-21 06:03:47',1,'2006-02-15 21:30:53'),(1926,'2005-06-17 06:24:30',3509,462,'2005-06-25 03:39:30',2,'2006-02-15 21:30:53'),(1927,'2005-06-17 06:48:19',3304,188,'2005-06-21 03:23:19',1,'2006-02-15 21:30:53'),(1928,'2005-06-17 06:48:31',3454,353,'2005-06-26 08:17:31',1,'2006-02-15 21:30:53'),(1929,'2005-06-17 06:49:30',573,327,'2005-06-22 12:07:30',2,'2006-02-15 21:30:53'),(1930,'2005-06-17 06:50:46',79,112,'2005-06-19 08:51:46',2,'2006-02-15 21:30:53'),(1931,'2005-06-17 06:51:56',1411,391,'2005-06-22 08:27:56',1,'2006-02-15 21:30:53'),(1932,'2005-06-17 06:54:41',3185,120,'2005-06-19 05:12:41',2,'2006-02-15 21:30:53'),(1933,'2005-06-17 06:54:42',980,13,'2005-06-26 02:00:42',1,'2006-02-15 21:30:53'),(1934,'2005-06-17 07:04:57',4000,16,'2005-06-25 12:21:57',2,'2006-02-15 21:30:53'),(1935,'2005-06-17 07:14:15',1962,295,'2005-06-20 05:59:15',1,'2006-02-15 21:30:53'),(1936,'2005-06-17 07:15:41',3037,213,'2005-06-18 11:37:41',2,'2006-02-15 21:30:53'),(1937,'2005-06-17 07:16:46',1266,385,'2005-06-21 04:22:46',2,'2006-02-15 21:30:53'),(1938,'2005-06-17 07:18:36',570,454,'2005-06-19 01:43:36',2,'2006-02-15 21:30:53'),(1939,'2005-06-17 07:26:45',605,11,'2005-06-25 13:06:45',2,'2006-02-15 21:30:53'),(1940,'2005-06-17 07:42:22',105,451,'2005-06-22 11:59:22',1,'2006-02-15 21:30:53'),(1941,'2005-06-17 07:42:45',1063,519,'2005-06-20 07:12:45',1,'2006-02-15 21:30:53'),(1942,'2005-06-17 07:43:39',261,143,'2005-06-25 02:24:39',1,'2006-02-15 21:30:53'),(1943,'2005-06-17 07:49:17',4327,144,'2005-06-20 03:47:17',1,'2006-02-15 21:30:53'),(1944,'2005-06-17 07:50:53',318,16,'2005-06-23 02:52:53',2,'2006-02-15 21:30:53'),(1945,'2005-06-17 07:51:26',3366,207,'2005-06-23 13:22:26',2,'2006-02-15 21:30:53'),(1946,'2005-06-17 07:58:39',2335,389,'2005-06-25 06:49:39',2,'2006-02-15 21:30:53'),(1947,'2005-06-17 08:02:20',3344,479,'2005-06-25 10:25:20',1,'2006-02-15 21:30:53'),(1948,'2005-06-17 08:06:53',46,89,'2005-06-21 05:00:53',1,'2006-02-15 21:30:53'),(1949,'2005-06-17 08:19:22',1478,208,'2005-06-25 08:43:22',1,'2006-02-15 21:30:53'),(1950,'2005-06-17 08:26:52',723,594,'2005-06-22 08:08:52',2,'2006-02-15 21:30:53'),(1951,'2005-06-17 08:30:35',955,123,'2005-06-20 10:43:35',2,'2006-02-15 21:30:53'),(1952,'2005-06-17 08:33:02',1823,338,'2005-06-21 14:00:02',2,'2006-02-15 21:30:53'),(1953,'2005-06-17 08:34:57',3549,405,'2005-06-24 09:38:57',2,'2006-02-15 21:30:53'),(1954,'2005-06-17 08:37:55',3203,533,'2005-06-20 02:55:55',2,'2006-02-15 21:30:53'),(1955,'2005-06-17 08:40:22',811,311,'2005-06-19 10:47:22',1,'2006-02-15 21:30:53'),(1956,'2005-06-17 08:43:32',1403,492,'2005-06-21 11:08:32',1,'2006-02-15 21:30:53'),(1957,'2005-06-17 08:50:58',2496,68,'2005-06-26 13:39:58',2,'2006-02-15 21:30:53'),(1958,'2005-06-17 08:52:01',1843,581,'2005-06-23 07:55:01',2,'2006-02-15 21:30:53'),(1959,'2005-06-17 08:54:10',1464,554,'2005-06-20 05:02:10',2,'2006-02-15 21:30:53'),(1960,'2005-06-17 08:59:57',2202,27,'2005-06-23 14:38:57',2,'2006-02-15 21:30:53'),(1961,'2005-06-17 09:02:58',2851,384,'2005-06-20 03:07:58',1,'2006-02-15 21:30:53'),(1962,'2005-06-17 09:08:58',4386,536,'2005-06-23 14:55:58',1,'2006-02-15 21:30:53'),(1963,'2005-06-17 09:09:31',1943,154,'2005-06-24 13:16:31',2,'2006-02-15 21:30:53'),(1964,'2005-06-17 09:10:09',3390,53,'2005-06-21 15:08:09',1,'2006-02-15 21:30:53'),(1965,'2005-06-17 09:17:39',480,256,'2005-06-18 12:35:39',2,'2006-02-15 21:30:53'),(1966,'2005-06-17 09:19:45',2085,6,'2005-06-20 11:19:45',1,'2006-02-15 21:30:53'),(1967,'2005-06-17 09:19:52',3225,558,'2005-06-21 03:35:52',1,'2006-02-15 21:30:53'),(1968,'2005-06-17 09:20:36',1139,246,'2005-06-18 11:06:36',2,'2006-02-15 21:30:53'),(1969,'2005-06-17 09:22:22',4450,337,'2005-06-21 05:31:22',2,'2006-02-15 21:30:53'),(1970,'2005-06-17 09:23:16',1358,303,'2005-06-22 09:40:16',2,'2006-02-15 21:30:53'),(1971,'2005-06-17 09:23:59',2870,357,'2005-06-25 13:20:59',2,'2006-02-15 21:30:53'),(1972,'2005-06-17 09:25:49',2758,526,'2005-06-24 09:59:49',2,'2006-02-15 21:30:53'),(1973,'2005-06-17 09:26:15',3669,256,'2005-06-21 10:18:15',1,'2006-02-15 21:30:53'),(1974,'2005-06-17 09:30:05',1979,111,'2005-06-21 12:10:05',1,'2006-02-15 21:30:53'),(1975,'2005-06-17 09:32:10',2520,468,'2005-06-23 03:50:10',2,'2006-02-15 21:30:53'),(1976,'2005-06-17 09:38:08',3631,184,'2005-06-23 07:23:08',2,'2006-02-15 21:30:53'),(1977,'2005-06-17 09:38:22',2468,459,'2005-06-23 14:19:22',2,'2006-02-15 21:30:53'),(1978,'2005-06-17 09:42:34',1590,278,'2005-06-20 09:13:34',2,'2006-02-15 21:30:53'),(1979,'2005-06-17 09:45:30',3470,45,'2005-06-20 10:52:30',1,'2006-02-15 21:30:53'),(1980,'2005-06-17 09:48:05',2985,328,'2005-06-23 14:43:05',1,'2006-02-15 21:30:53'),(1981,'2005-06-17 10:03:34',3186,526,'2005-06-20 13:14:34',2,'2006-02-15 21:30:53'),(1982,'2005-06-17 10:12:15',1091,566,'2005-06-20 13:56:15',1,'2006-02-15 21:30:53'),(1983,'2005-06-17 10:22:13',1955,365,'2005-06-24 05:04:13',1,'2006-02-15 21:30:53'),(1984,'2005-06-17 10:25:28',3417,380,'2005-06-23 08:18:28',2,'2006-02-15 21:30:53'),(1985,'2005-06-17 10:31:37',87,411,'2005-06-22 11:17:37',1,'2006-02-15 21:30:53'),(1986,'2005-06-17 10:34:59',2894,541,'2005-06-24 04:57:59',2,'2006-02-15 21:30:53'),(1987,'2005-06-17 10:40:36',110,479,'2005-06-23 14:23:36',1,'2006-02-15 21:30:53'),(1988,'2005-06-17 10:42:34',3054,261,'2005-06-25 11:47:34',2,'2006-02-15 21:30:53'),(1989,'2005-06-17 10:47:24',634,35,'2005-06-19 05:12:24',1,'2006-02-15 21:30:53'),(1990,'2005-06-17 10:48:44',1471,571,'2005-06-24 08:11:44',1,'2006-02-15 21:30:53'),(1991,'2005-06-17 10:49:23',3963,105,'2005-06-25 10:48:23',1,'2006-02-15 21:30:53'),(1992,'2005-06-17 10:58:53',636,233,'2005-06-19 08:42:53',2,'2006-02-15 21:30:53'),(1993,'2005-06-17 10:59:24',168,234,'2005-06-23 07:30:24',2,'2006-02-15 21:30:53'),(1994,'2005-06-17 11:07:06',2203,346,'2005-06-25 08:32:06',2,'2006-02-15 21:30:53'),(1995,'2005-06-17 11:11:14',1866,10,'2005-06-26 16:37:14',1,'2006-02-15 21:30:53'),(1996,'2005-06-17 11:17:45',3074,149,'2005-06-26 09:42:45',1,'2006-02-15 21:30:53'),(1997,'2005-06-17 11:19:43',846,411,'2005-06-19 14:18:43',1,'2006-02-15 21:30:53'),(1998,'2005-06-17 11:24:57',4365,562,'2005-06-26 09:48:57',1,'2006-02-15 21:30:53'),(1999,'2005-06-17 11:30:08',3704,111,'2005-06-23 08:36:08',1,'2006-02-15 21:30:53'),(2000,'2005-06-17 11:32:30',323,163,'2005-06-22 13:37:30',1,'2006-02-15 21:30:53'),(2001,'2005-06-17 11:35:09',2069,260,'2005-06-21 14:52:09',2,'2006-02-15 21:30:53'),(2002,'2005-06-17 11:39:58',2406,514,'2005-06-24 15:41:58',2,'2006-02-15 21:30:53'),(2003,'2005-06-17 11:40:35',1581,515,'2005-06-19 08:30:35',2,'2006-02-15 21:30:53'),(2004,'2005-06-17 11:43:38',1342,171,'2005-06-24 08:05:38',2,'2006-02-15 21:30:53'),(2005,'2005-06-17 11:44:54',4177,234,'2005-06-19 10:53:54',1,'2006-02-15 21:30:53'),(2006,'2005-06-17 11:47:03',992,215,'2005-06-19 13:47:03',2,'2006-02-15 21:30:53'),(2007,'2005-06-17 11:47:17',1123,572,'2005-06-21 07:19:17',1,'2006-02-15 21:30:53'),(2008,'2005-06-17 11:48:05',2081,570,'2005-06-25 13:16:05',1,'2006-02-15 21:30:53'),(2009,'2005-06-17 11:48:31',1902,119,'2005-06-18 09:34:31',2,'2006-02-15 21:30:53'),(2010,'2005-06-17 11:54:15',2845,329,'2005-06-21 05:55:15',1,'2006-02-15 21:30:53'),(2011,'2005-06-17 11:56:09',734,350,'2005-06-24 06:47:09',2,'2006-02-15 21:30:53'),(2012,'2005-06-17 11:57:15',3588,84,'2005-06-24 17:18:15',1,'2006-02-15 21:30:53'),(2013,'2005-06-17 12:03:01',3256,165,'2005-06-24 10:04:01',1,'2006-02-15 21:30:53'),(2014,'2005-06-17 12:03:28',2969,337,'2005-06-25 16:00:28',2,'2006-02-15 21:30:53'),(2015,'2005-06-17 12:16:29',3776,484,'2005-06-18 14:40:29',2,'2006-02-15 21:30:53'),(2016,'2005-06-17 12:18:36',4265,282,'2005-06-20 12:13:36',1,'2006-02-15 21:30:53'),(2017,'2005-06-17 12:33:30',1434,516,'2005-06-19 10:08:30',2,'2006-02-15 21:30:53'),(2018,'2005-06-17 12:35:58',1278,380,'2005-06-26 13:16:58',2,'2006-02-15 21:30:53'),(2019,'2005-06-17 12:38:44',2314,528,'2005-06-23 17:38:44',2,'2006-02-15 21:30:53'),(2020,'2005-06-17 12:39:50',1914,384,'2005-06-19 14:59:50',1,'2006-02-15 21:30:53'),(2021,'2005-06-17 12:41:18',2852,319,'2005-06-23 17:17:18',2,'2006-02-15 21:30:53'),(2022,'2005-06-17 12:44:39',3053,547,'2005-06-25 12:32:39',1,'2006-02-15 21:30:53'),(2023,'2005-06-17 12:52:58',787,169,'2005-06-23 11:07:58',1,'2006-02-15 21:30:53'),(2024,'2005-06-17 13:00:51',2566,329,'2005-06-22 07:03:51',1,'2006-02-15 21:30:53'),(2025,'2005-06-17 13:04:00',1203,447,'2005-06-18 18:45:00',2,'2006-02-15 21:30:53'),(2026,'2005-06-17 13:05:38',3681,491,'2005-06-21 17:19:38',1,'2006-02-15 21:30:53'),(2027,'2005-06-17 13:06:56',4309,265,'2005-06-23 13:46:56',1,'2006-02-15 21:30:53'),(2028,'2005-06-17 13:08:08',4451,155,'2005-06-23 10:54:08',1,'2006-02-15 21:30:53'),(2029,'2005-06-17 13:10:59',914,512,'2005-06-19 18:15:59',1,'2006-02-15 21:30:53'),(2030,'2005-06-17 13:13:27',4024,457,'2005-06-19 10:44:27',1,'2006-02-15 21:30:53'),(2031,'2005-06-17 13:14:03',4275,570,'2005-06-25 10:06:03',2,'2006-02-15 21:30:53'),(2032,'2005-06-17 13:24:07',425,316,'2005-06-18 18:18:07',1,'2006-02-15 21:30:53'),(2033,'2005-06-17 13:24:43',58,90,'2005-06-20 12:34:43',1,'2006-02-15 21:30:53'),(2034,'2005-06-17 13:27:16',1512,587,'2005-06-22 08:53:16',2,'2006-02-15 21:30:53'),(2035,'2005-06-17 13:45:09',4371,158,'2005-06-26 15:30:09',2,'2006-02-15 21:30:53'),(2036,'2005-06-17 13:46:52',100,486,'2005-06-18 15:42:52',2,'2006-02-15 21:30:53'),(2037,'2005-06-17 13:54:20',2582,308,'2005-06-20 14:49:20',2,'2006-02-15 21:30:53'),(2038,'2005-06-17 14:00:51',4231,138,'2005-06-19 11:54:51',2,'2006-02-15 21:30:53'),(2039,'2005-06-17 14:03:43',1514,304,'2005-06-24 09:21:43',1,'2006-02-15 21:30:53'),(2040,'2005-06-17 14:18:37',227,260,'2005-06-22 19:08:37',1,'2006-02-15 21:30:53'),(2041,'2005-06-17 14:19:00',782,348,'2005-06-26 08:38:00',2,'2006-02-15 21:30:53'),(2042,'2005-06-17 14:31:02',3102,84,'2005-06-18 14:43:02',1,'2006-02-15 21:30:53'),(2043,'2005-06-17 14:31:12',2495,4,'2005-06-19 11:04:12',2,'2006-02-15 21:30:53'),(2044,'2005-06-17 14:37:57',2418,484,'2005-06-22 17:15:57',2,'2006-02-15 21:30:53'),(2045,'2005-06-17 14:38:11',561,391,'2005-06-26 13:44:11',2,'2006-02-15 21:30:53'),(2046,'2005-06-17 14:39:50',872,374,'2005-06-24 16:02:50',1,'2006-02-15 21:30:53'),(2047,'2005-06-17 14:40:58',2371,201,'2005-06-21 08:52:58',1,'2006-02-15 21:30:53'),(2048,'2005-06-17 14:55:29',2055,454,'2005-06-23 16:29:29',2,'2006-02-15 21:30:53'),(2049,'2005-06-17 14:58:36',1053,182,'2005-06-22 14:53:36',2,'2006-02-15 21:30:53'),(2050,'2005-06-17 15:07:30',1963,549,'2005-06-18 14:43:30',1,'2006-02-15 21:30:53'),(2051,'2005-06-17 15:10:16',2366,191,'2005-06-19 20:45:16',1,'2006-02-15 21:30:53'),(2052,'2005-06-17 15:14:43',1686,172,'2005-06-21 11:08:43',1,'2006-02-15 21:30:53'),(2053,'2005-06-17 15:19:34',4279,521,'2005-06-19 10:06:34',2,'2006-02-15 21:30:53'),(2054,'2005-06-17 15:26:37',1588,295,'2005-06-26 14:22:37',1,'2006-02-15 21:30:53'),(2055,'2005-06-17 15:27:03',1399,593,'2005-06-25 13:44:03',1,'2006-02-15 21:30:53'),(2056,'2005-06-17 15:27:33',229,42,'2005-06-20 13:04:33',2,'2006-02-15 21:30:53'),(2057,'2005-06-17 15:31:58',2803,190,'2005-06-25 09:39:58',1,'2006-02-15 21:30:53'),(2058,'2005-06-17 15:34:41',1324,57,'2005-06-25 14:50:41',1,'2006-02-15 21:30:53'),(2059,'2005-06-17 15:36:12',739,114,'2005-06-18 19:01:12',2,'2006-02-15 21:30:53'),(2060,'2005-06-17 15:42:42',1523,64,'2005-06-22 16:39:42',1,'2006-02-15 21:30:53'),(2061,'2005-06-17 15:47:00',4575,108,'2005-06-24 16:36:00',2,'2006-02-15 21:30:53'),(2062,'2005-06-17 15:56:43',1749,55,'2005-06-20 21:37:43',2,'2006-02-15 21:30:53'),(2063,'2005-06-17 15:56:53',4323,5,'2005-06-21 14:19:53',1,'2006-02-15 21:30:53'),(2064,'2005-06-17 15:57:56',1970,67,'2005-06-23 21:04:56',2,'2006-02-15 21:30:53'),(2065,'2005-06-17 16:03:46',844,266,'2005-06-22 16:41:46',2,'2006-02-15 21:30:53'),(2066,'2005-06-17 16:07:08',2561,248,'2005-06-24 15:20:08',2,'2006-02-15 21:30:53'),(2067,'2005-06-17 16:11:08',1711,297,'2005-06-22 13:01:08',2,'2006-02-15 21:30:53'),(2068,'2005-06-17 16:11:46',4252,387,'2005-06-20 11:28:46',1,'2006-02-15 21:30:53'),(2069,'2005-06-17 16:19:39',2746,551,'2005-06-26 16:48:39',1,'2006-02-15 21:30:53'),(2070,'2005-06-17 16:27:51',2609,24,'2005-06-20 20:46:51',1,'2006-02-15 21:30:53'),(2071,'2005-06-17 16:33:17',2867,479,'2005-06-23 21:51:17',1,'2006-02-15 21:30:53'),(2072,'2005-06-17 16:33:32',86,261,'2005-06-23 13:22:32',1,'2006-02-15 21:30:53'),(2073,'2005-06-17 16:33:59',3530,410,'2005-06-19 11:57:59',1,'2006-02-15 21:30:53'),(2074,'2005-06-17 16:40:03',71,495,'2005-06-20 21:34:03',1,'2006-02-15 21:30:53'),(2075,'2005-06-17 16:40:33',2415,459,'2005-06-19 13:55:33',2,'2006-02-15 21:30:53'),(2076,'2005-06-17 16:43:47',2242,217,'2005-06-24 11:12:47',1,'2006-02-15 21:30:53'),(2077,'2005-06-17 16:46:11',4478,113,'2005-06-19 15:10:11',1,'2006-02-15 21:30:53'),(2078,'2005-06-17 16:48:55',2021,278,'2005-06-19 18:01:55',1,'2006-02-15 21:30:53'),(2079,'2005-06-17 16:49:45',3853,465,'2005-06-18 18:10:45',1,'2006-02-15 21:30:53'),(2080,'2005-06-17 16:59:40',1231,476,'2005-06-21 11:28:40',2,'2006-02-15 21:30:53'),(2081,'2005-06-17 17:05:02',917,253,'2005-06-26 20:26:02',1,'2006-02-15 21:30:53'),(2082,'2005-06-17 17:13:32',434,254,'2005-06-19 16:16:32',1,'2006-02-15 21:30:53'),(2083,'2005-06-17 17:14:00',2423,97,'2005-06-18 18:31:00',2,'2006-02-15 21:30:53'),(2084,'2005-06-17 17:17:19',428,92,'2005-06-22 14:57:19',1,'2006-02-15 21:30:53'),(2085,'2005-06-17 17:30:56',2275,214,'2005-06-23 12:13:56',1,'2006-02-15 21:30:53'),(2086,'2005-06-17 17:32:07',898,326,'2005-06-21 20:19:07',2,'2006-02-15 21:30:53'),(2087,'2005-06-17 17:35:10',466,398,'2005-06-26 13:52:10',1,'2006-02-15 21:30:53'),(2088,'2005-06-17 17:35:30',506,310,'2005-06-23 20:13:30',2,'2006-02-15 21:30:53'),(2089,'2005-06-17 17:45:09',4030,156,'2005-06-25 16:41:09',1,'2006-02-15 21:30:53'),(2090,'2005-06-17 18:06:14',17,197,'2005-06-22 23:52:14',1,'2006-02-15 21:30:53'),(2091,'2005-06-17 18:09:04',4033,260,'2005-06-26 12:11:04',1,'2006-02-15 21:30:53'),(2092,'2005-06-17 18:12:16',4427,556,'2005-06-25 15:06:16',2,'2006-02-15 21:30:53'),(2093,'2005-06-17 18:14:08',814,26,'2005-06-26 18:10:08',1,'2006-02-15 21:30:53'),(2094,'2005-06-17 18:18:56',2205,308,'2005-06-18 19:36:56',1,'2006-02-15 21:30:53'),(2095,'2005-06-17 18:21:35',1907,8,'2005-06-23 23:49:35',2,'2006-02-15 21:30:53'),(2096,'2005-06-17 18:33:04',1069,431,'2005-06-21 17:29:04',2,'2006-02-15 21:30:53'),(2097,'2005-06-17 18:40:04',569,439,'2005-06-23 13:49:04',1,'2006-02-15 21:30:53'),(2098,'2005-06-17 18:42:09',3951,274,'2005-06-19 20:40:09',1,'2006-02-15 21:30:53'),(2099,'2005-06-17 18:47:26',3660,146,'2005-06-24 22:31:26',2,'2006-02-15 21:30:53'),(2100,'2005-06-17 18:53:21',2267,387,'2005-06-19 21:49:21',2,'2006-02-15 21:30:53'),(2101,'2005-06-17 18:57:02',2137,581,'2005-06-20 15:38:02',2,'2006-02-15 21:30:53'),(2102,'2005-06-17 19:05:22',2316,486,'2005-06-23 23:21:22',2,'2006-02-15 21:30:53'),(2103,'2005-06-17 19:13:10',1469,456,'2005-06-21 21:32:10',2,'2006-02-15 21:30:53'),(2104,'2005-06-17 19:14:30',3084,136,'2005-06-19 16:26:30',1,'2006-02-15 21:30:53'),(2105,'2005-06-17 19:15:45',4090,57,'2005-06-20 16:00:45',1,'2006-02-15 21:30:53'),(2106,'2005-06-17 19:29:03',643,66,'2005-06-23 18:17:03',2,'2006-02-15 21:30:53'),(2107,'2005-06-17 19:31:16',1270,104,'2005-06-18 23:33:16',1,'2006-02-15 21:30:53'),(2108,'2005-06-17 19:35:26',1395,503,'2005-06-25 15:45:26',1,'2006-02-15 21:30:53'),(2109,'2005-06-17 19:41:42',2292,493,'2005-06-25 17:03:42',2,'2006-02-15 21:30:53'),(2110,'2005-06-17 19:45:49',3592,163,'2005-06-26 18:59:49',2,'2006-02-15 21:30:53'),(2111,'2005-06-17 19:47:21',2108,76,'2005-06-19 22:46:21',2,'2006-02-15 21:30:53'),(2112,'2005-06-17 19:52:42',1629,18,'2005-06-25 00:00:42',2,'2006-02-15 21:30:53'),(2113,'2005-06-17 19:57:46',1509,406,'2005-06-24 00:22:46',1,'2006-02-15 21:30:53'),(2114,'2005-06-17 20:00:25',3541,358,'2005-06-23 18:51:25',1,'2006-02-15 21:30:53'),(2115,'2005-06-17 20:02:16',3448,270,'2005-06-25 16:56:16',2,'2006-02-15 21:30:53'),(2116,'2005-06-17 20:16:12',2373,24,'2005-06-18 17:03:12',2,'2006-02-15 21:30:53'),(2117,'2005-06-17 20:24:00',2,170,'2005-06-23 17:45:00',2,'2006-02-15 21:30:53'),(2118,'2005-06-17 20:28:29',1261,103,'2005-06-23 22:47:29',1,'2006-02-15 21:30:53'),(2119,'2005-06-17 20:34:42',2104,561,'2005-06-22 00:05:42',1,'2006-02-15 21:30:53'),(2120,'2005-06-17 20:36:50',1498,182,'2005-06-27 01:18:50',2,'2006-02-15 21:30:53'),(2121,'2005-06-17 20:38:54',141,467,'2005-06-22 23:06:54',2,'2006-02-15 21:30:53'),(2122,'2005-06-17 20:48:27',2932,245,'2005-06-23 00:58:27',2,'2006-02-15 21:30:53'),(2123,'2005-06-17 20:48:30',2497,545,'2005-06-18 19:17:30',2,'2006-02-15 21:30:53'),(2124,'2005-06-17 20:49:14',1273,178,'2005-06-23 17:44:14',1,'2006-02-15 21:30:53'),(2125,'2005-06-17 20:53:42',4303,473,'2005-06-19 01:53:42',2,'2006-02-15 21:30:53'),(2126,'2005-06-17 20:54:36',4276,263,'2005-06-27 02:16:36',1,'2006-02-15 21:30:53'),(2127,'2005-06-17 20:54:48',3757,187,'2005-06-18 16:28:48',2,'2006-02-15 21:30:53'),(2128,'2005-06-17 20:54:58',352,2,'2005-06-24 00:41:58',2,'2006-02-15 21:30:53'),(2129,'2005-06-17 20:58:32',1930,249,'2005-06-23 22:22:32',1,'2006-02-15 21:30:53'),(2130,'2005-06-17 21:00:44',1369,413,'2005-06-26 00:05:44',2,'2006-02-15 21:30:53'),(2131,'2005-06-17 21:02:25',4424,85,'2005-06-25 18:45:25',1,'2006-02-15 21:30:53'),(2132,'2005-06-17 21:05:06',2636,186,'2005-06-20 18:10:06',1,'2006-02-15 21:30:53'),(2133,'2005-06-17 21:10:05',932,268,'2005-06-23 22:41:05',1,'2006-02-15 21:30:53'),(2134,'2005-06-17 21:13:44',1699,378,'2005-06-26 16:28:44',2,'2006-02-15 21:30:53'),(2135,'2005-06-17 21:14:02',4091,39,'2005-06-19 00:59:02',1,'2006-02-15 21:30:53'),(2136,'2005-06-17 21:16:41',2651,20,'2005-06-24 22:42:41',2,'2006-02-15 21:30:53'),(2137,'2005-06-17 21:18:28',1158,581,'2005-06-20 21:05:28',1,'2006-02-15 21:30:53'),(2138,'2005-06-17 21:28:14',512,254,'2005-06-22 01:16:14',2,'2006-02-15 21:30:53'),(2139,'2005-06-17 21:29:34',807,236,'2005-06-26 21:05:34',1,'2006-02-15 21:30:53'),(2140,'2005-06-17 21:40:29',2395,56,'2005-06-19 00:42:29',1,'2006-02-15 21:30:53'),(2141,'2005-06-17 21:41:34',2176,86,'2005-06-19 00:15:34',1,'2006-02-15 21:30:53'),(2142,'2005-06-17 21:55:43',1787,253,'2005-06-26 19:41:43',2,'2006-02-15 21:30:53'),(2143,'2005-06-17 21:58:13',1257,507,'2005-06-19 23:59:13',2,'2006-02-15 21:30:53'),(2144,'2005-06-17 22:05:40',3303,46,'2005-06-21 02:53:40',1,'2006-02-15 21:30:53'),(2145,'2005-06-17 22:10:36',238,388,'2005-06-18 21:07:36',2,'2006-02-15 21:30:53'),(2146,'2005-06-17 22:26:23',326,456,'2005-06-26 17:10:23',1,'2006-02-15 21:30:53'),(2147,'2005-06-17 22:28:13',2752,279,'2005-06-22 20:50:13',1,'2006-02-15 21:30:53'),(2148,'2005-06-17 22:44:35',315,338,'2005-06-26 19:43:35',1,'2006-02-15 21:30:53'),(2149,'2005-06-17 22:50:00',3365,333,'2005-06-26 18:40:00',1,'2006-02-15 21:30:53'),(2150,'2005-06-17 22:50:36',1910,406,'2005-06-21 19:33:36',1,'2006-02-15 21:30:53'),(2151,'2005-06-17 22:52:37',407,329,'2005-06-20 22:00:37',1,'2006-02-15 21:30:53'),(2152,'2005-06-17 22:53:27',2665,307,'2005-06-23 19:19:27',1,'2006-02-15 21:30:53'),(2153,'2005-06-17 22:58:04',2440,357,'2005-06-24 19:38:04',2,'2006-02-15 21:30:53'),(2154,'2005-06-17 22:59:42',1655,30,'2005-06-24 04:11:42',1,'2006-02-15 21:30:53'),(2155,'2005-06-17 23:07:29',3640,227,'2005-06-25 03:23:29',2,'2006-02-15 21:30:53'),(2156,'2005-06-17 23:08:12',623,237,'2005-06-22 19:44:12',2,'2006-02-15 21:30:53'),(2157,'2005-06-17 23:30:52',1619,201,'2005-06-24 01:56:52',2,'2006-02-15 21:30:53'),(2158,'2005-06-17 23:36:27',243,530,'2005-06-19 19:25:27',2,'2006-02-15 21:30:53'),(2159,'2005-06-17 23:37:29',3095,465,'2005-06-25 00:18:29',2,'2006-02-15 21:30:53'),(2160,'2005-06-17 23:39:11',1644,32,'2005-06-22 20:04:11',1,'2006-02-15 21:30:53'),(2161,'2005-06-17 23:39:50',3149,75,'2005-06-26 23:28:50',2,'2006-02-15 21:30:53'),(2162,'2005-06-17 23:45:47',1790,277,'2005-06-21 21:03:47',1,'2006-02-15 21:30:53'),(2163,'2005-06-17 23:46:16',2600,130,'2005-06-22 22:48:16',2,'2006-02-15 21:30:53'),(2164,'2005-06-17 23:46:21',3442,227,'2005-06-24 19:10:21',2,'2006-02-15 21:30:53'),(2165,'2005-06-17 23:51:10',2392,471,'2005-06-21 23:54:10',1,'2006-02-15 21:30:53'),(2166,'2005-06-17 23:51:21',4343,305,'2005-06-27 01:06:21',2,'2006-02-15 21:30:53'),(2167,'2005-06-17 23:51:28',3796,307,'2005-06-21 00:43:28',2,'2006-02-15 21:30:53'),(2168,'2005-06-17 23:53:24',802,308,'2005-06-20 01:11:24',1,'2006-02-15 21:30:53'),(2169,'2005-06-17 23:57:23',785,120,'2005-06-19 20:14:23',2,'2006-02-15 21:30:53'),(2170,'2005-06-17 23:57:34',3989,42,'2005-06-22 03:37:34',2,'2006-02-15 21:30:53'),(2171,'2005-06-18 00:06:04',1768,147,'2005-06-24 18:09:04',2,'2006-02-15 21:30:53'),(2172,'2005-06-18 00:06:16',2912,457,'2005-06-26 00:50:16',1,'2006-02-15 21:30:53'),(2173,'2005-06-18 00:08:20',995,65,'2005-06-25 05:30:20',1,'2006-02-15 21:30:53'),(2174,'2005-06-18 00:09:01',3279,520,'2005-06-25 23:14:01',1,'2006-02-15 21:30:53'),(2175,'2005-06-18 00:17:58',4038,17,'2005-06-22 23:18:58',2,'2006-02-15 21:30:53'),(2176,'2005-06-18 00:29:51',4201,282,'2005-06-21 01:41:51',1,'2006-02-15 21:30:53'),(2177,'2005-06-18 00:34:45',492,340,'2005-06-26 18:40:45',1,'2006-02-15 21:30:53'),(2178,'2005-06-18 00:38:35',2950,260,'2005-06-21 02:56:35',1,'2006-02-15 21:30:53'),(2179,'2005-06-18 00:41:36',4334,338,'2005-06-19 02:17:36',1,'2006-02-15 21:30:53'),(2180,'2005-06-18 00:47:43',3564,497,'2005-06-25 04:12:43',2,'2006-02-15 21:30:53'),(2181,'2005-06-18 00:48:31',3481,176,'2005-06-25 06:43:31',2,'2006-02-15 21:30:53'),(2182,'2005-06-18 00:56:18',3494,454,'2005-06-26 20:01:18',1,'2006-02-15 21:30:53'),(2183,'2005-06-18 01:06:01',1776,340,'2005-06-22 01:20:01',1,'2006-02-15 21:30:53'),(2184,'2005-06-18 01:10:36',3468,537,'2005-06-21 05:59:36',2,'2006-02-15 21:30:53'),(2185,'2005-06-18 01:12:22',4326,198,'2005-06-20 20:41:22',1,'2006-02-15 21:30:53'),(2186,'2005-06-18 01:15:27',2050,204,'2005-06-21 06:16:27',1,'2006-02-15 21:30:53'),(2187,'2005-06-18 01:17:27',1385,477,'2005-06-20 22:18:27',1,'2006-02-15 21:30:53'),(2188,'2005-06-18 01:19:04',712,183,'2005-06-25 03:59:04',2,'2006-02-15 21:30:53'),(2189,'2005-06-18 01:20:26',249,500,'2005-06-25 00:30:26',1,'2006-02-15 21:30:53'),(2190,'2005-06-18 01:29:51',4398,342,'2005-06-26 04:31:51',2,'2006-02-15 21:30:53'),(2191,'2005-06-18 01:33:09',3369,58,'2005-06-19 20:18:09',1,'2006-02-15 21:30:53'),(2192,'2005-06-18 01:35:47',1886,456,'2005-06-23 23:38:47',2,'2006-02-15 21:30:53'),(2193,'2005-06-18 01:38:45',1013,112,'2005-06-22 19:51:45',1,'2006-02-15 21:30:53'),(2194,'2005-06-18 01:41:37',1827,149,'2005-06-25 04:27:37',1,'2006-02-15 21:30:53'),(2195,'2005-06-18 01:44:46',2247,286,'2005-06-25 20:50:46',1,'2006-02-15 21:30:53'),(2196,'2005-06-18 01:47:07',1925,240,'2005-06-26 03:18:07',2,'2006-02-15 21:30:53'),(2197,'2005-06-18 01:50:27',3350,103,'2005-06-19 01:31:27',2,'2006-02-15 21:30:53'),(2198,'2005-06-18 01:51:22',1983,109,'2005-06-26 06:57:22',2,'2006-02-15 21:30:53'),(2199,'2005-06-18 01:57:56',99,171,'2005-06-23 20:34:56',2,'2006-02-15 21:30:53'),(2200,'2005-06-18 01:59:16',1085,229,'2005-06-26 23:25:16',2,'2006-02-15 21:30:53'),(2201,'2005-06-18 02:08:27',1864,489,'2005-06-23 01:40:27',1,'2006-02-15 21:30:53'),(2202,'2005-06-18 02:09:24',815,297,'2005-06-26 07:17:24',2,'2006-02-15 21:30:53'),(2203,'2005-06-18 02:10:42',1347,46,'2005-06-22 06:25:42',2,'2006-02-15 21:30:53'),(2204,'2005-06-18 02:11:38',1137,426,'2005-06-24 00:28:38',1,'2006-02-15 21:30:53'),(2205,'2005-06-18 02:14:34',1245,593,'2005-06-25 05:11:34',1,'2006-02-15 21:30:53'),(2206,'2005-06-18 02:14:45',3651,438,'2005-06-24 23:20:45',2,'2006-02-15 21:30:53'),(2207,'2005-06-18 02:19:21',182,78,'2005-06-24 02:25:21',2,'2006-02-15 21:30:53'),(2208,'2005-06-18 02:22:07',2345,132,'2005-06-23 07:24:07',2,'2006-02-15 21:30:53'),(2209,'2005-06-18 02:24:01',2441,13,'2005-06-22 04:13:01',2,'2006-02-15 21:30:53'),(2210,'2005-06-18 02:27:01',219,108,'2005-06-21 00:45:01',1,'2006-02-15 21:30:53'),(2211,'2005-06-18 02:29:10',4114,166,'2005-06-22 02:02:10',1,'2006-02-15 21:30:53'),(2212,'2005-06-18 02:36:10',2458,336,'2005-06-19 21:21:10',1,'2006-02-15 21:30:53'),(2213,'2005-06-18 02:36:47',949,98,'2005-06-23 05:02:47',1,'2006-02-15 21:30:53'),(2214,'2005-06-18 02:44:37',2430,366,'2005-06-18 23:37:37',2,'2006-02-15 21:30:53'),(2215,'2005-06-18 02:48:21',2060,239,'2005-06-22 01:03:21',2,'2006-02-15 21:30:53'),(2216,'2005-06-18 03:08:17',1428,320,'2005-06-19 08:13:17',1,'2006-02-15 21:30:53'),(2217,'2005-06-18 03:12:29',2260,118,'2005-06-20 06:08:29',1,'2006-02-15 21:30:53'),(2218,'2005-06-18 03:13:13',3577,176,'2005-06-18 21:16:13',1,'2006-02-15 21:30:53'),(2219,'2005-06-18 03:16:54',1881,393,'2005-06-22 01:29:54',1,'2006-02-15 21:30:53'),(2220,'2005-06-18 03:21:36',320,587,'2005-06-21 07:45:36',2,'2006-02-15 21:30:53'),(2221,'2005-06-18 03:24:56',3905,156,'2005-06-22 08:27:56',1,'2006-02-15 21:30:53'),(2222,'2005-06-18 03:26:23',3834,10,'2005-06-26 08:50:23',2,'2006-02-15 21:30:53'),(2223,'2005-06-18 03:27:03',4068,303,'2005-06-27 09:19:03',2,'2006-02-15 21:30:53'),(2224,'2005-06-18 03:33:58',1336,153,'2005-06-18 22:10:58',1,'2006-02-15 21:30:53'),(2225,'2005-06-18 03:35:40',2829,503,'2005-06-23 03:05:40',1,'2006-02-15 21:30:53'),(2226,'2005-06-18 03:39:56',3487,225,'2005-06-24 07:26:56',2,'2006-02-15 21:30:53'),(2227,'2005-06-18 03:43:23',3623,200,'2005-06-19 05:55:23',2,'2006-02-15 21:30:53'),(2228,'2005-06-18 03:44:50',490,383,'2005-06-23 00:28:50',1,'2006-02-15 21:30:53'),(2229,'2005-06-18 03:50:18',2840,35,'2005-06-26 07:16:18',2,'2006-02-15 21:30:53'),(2230,'2005-06-18 03:50:49',833,256,'2005-06-25 01:12:49',2,'2006-02-15 21:30:53'),(2231,'2005-06-18 03:52:14',2280,35,'2005-06-23 06:52:14',1,'2006-02-15 21:30:53'),(2232,'2005-06-18 03:54:31',2463,52,'2005-06-22 07:29:31',1,'2006-02-15 21:30:53'),(2233,'2005-06-18 03:57:36',3063,31,'2005-06-21 09:42:36',2,'2006-02-15 21:30:53'),(2234,'2005-06-18 04:01:28',234,182,'2005-06-24 04:55:28',2,'2006-02-15 21:30:53'),(2235,'2005-06-18 04:08:50',3463,21,'2005-06-27 07:58:50',1,'2006-02-15 21:30:53'),(2236,'2005-06-18 04:12:33',4001,375,'2005-06-23 04:07:33',1,'2006-02-15 21:30:53'),(2237,'2005-06-18 04:17:44',1821,205,'2005-06-27 09:08:44',1,'2006-02-15 21:30:53'),(2238,'2005-06-18 04:22:06',2859,251,'2005-06-27 03:29:06',2,'2006-02-15 21:30:53'),(2239,'2005-06-18 04:23:54',4419,437,'2005-06-26 00:12:54',2,'2006-02-15 21:30:53'),(2240,'2005-06-18 04:28:27',1409,122,'2005-06-22 07:48:27',2,'2006-02-15 21:30:53'),(2241,'2005-06-18 04:31:41',921,406,'2005-06-24 22:34:41',2,'2006-02-15 21:30:53'),(2242,'2005-06-18 04:32:28',1995,146,'2005-06-24 03:26:28',2,'2006-02-15 21:30:53'),(2243,'2005-06-18 04:33:03',1254,328,'2005-06-23 04:14:03',2,'2006-02-15 21:30:53'),(2244,'2005-06-18 04:46:33',3629,233,'2005-06-20 04:28:33',1,'2006-02-15 21:30:53'),(2245,'2005-06-18 04:52:59',1496,194,'2005-06-24 05:07:59',2,'2006-02-15 21:30:53'),(2246,'2005-06-18 04:54:29',4287,414,'2005-06-22 09:14:29',1,'2006-02-15 21:30:53'),(2248,'2005-06-18 04:59:48',1999,446,'2005-06-19 08:51:48',2,'2006-02-15 21:30:53'),(2249,'2005-06-18 05:03:08',117,285,'2005-06-26 05:43:08',2,'2006-02-15 21:30:53'),(2250,'2005-06-18 05:03:36',4042,7,'2005-06-22 02:25:36',2,'2006-02-15 21:30:53'),(2251,'2005-06-18 05:05:08',1458,143,'2005-06-23 08:34:08',1,'2006-02-15 21:30:53'),(2252,'2005-06-18 05:05:18',1987,383,'2005-06-21 08:19:18',1,'2006-02-15 21:30:53'),(2253,'2005-06-18 05:11:43',3719,122,'2005-06-25 03:30:43',2,'2006-02-15 21:30:53'),(2254,'2005-06-18 05:15:14',1084,281,'2005-06-27 04:10:14',2,'2006-02-15 21:30:53'),(2255,'2005-06-18 05:21:12',24,410,'2005-06-26 09:19:12',1,'2006-02-15 21:30:53'),(2256,'2005-06-18 05:21:56',1863,93,'2005-06-27 02:06:56',2,'2006-02-15 21:30:53'),(2257,'2005-06-18 05:29:52',2846,34,'2005-06-22 00:19:52',1,'2006-02-15 21:30:53'),(2258,'2005-06-18 05:30:36',4573,292,'2005-06-24 09:09:36',1,'2006-02-15 21:30:53'),(2259,'2005-06-18 05:37:45',4103,491,'2005-06-21 01:51:45',1,'2006-02-15 21:30:53'),(2260,'2005-06-18 05:38:36',2773,297,'2005-06-20 08:08:36',1,'2006-02-15 21:30:53'),(2261,'2005-06-18 05:46:15',1763,570,'2005-06-24 05:06:15',1,'2006-02-15 21:30:53'),(2262,'2005-06-18 05:49:46',4172,218,'2005-06-20 00:25:46',2,'2006-02-15 21:30:53'),(2263,'2005-06-18 05:57:47',3259,452,'2005-06-20 06:13:47',1,'2006-02-15 21:30:53'),(2264,'2005-06-18 05:58:45',150,240,'2005-06-19 00:57:45',1,'2006-02-15 21:30:53'),(2265,'2005-06-18 06:03:27',3069,267,'2005-06-20 01:16:27',1,'2006-02-15 21:30:53'),(2266,'2005-06-18 06:05:02',2596,452,'2005-06-20 06:54:02',1,'2006-02-15 21:30:53'),(2267,'2005-06-18 06:10:23',2086,218,'2005-06-20 00:39:23',2,'2006-02-15 21:30:53'),(2268,'2005-06-18 06:13:41',4380,21,'2005-06-22 08:53:41',2,'2006-02-15 21:30:53'),(2269,'2005-06-18 06:20:54',3088,431,'2005-06-25 04:51:54',2,'2006-02-15 21:30:53'),(2270,'2005-06-18 06:29:01',3447,588,'2005-06-26 07:21:01',2,'2006-02-15 21:30:53'),(2271,'2005-06-18 06:29:52',2416,145,'2005-06-21 09:46:52',2,'2006-02-15 21:30:53'),(2272,'2005-06-18 06:29:53',1364,599,'2005-06-23 10:58:53',1,'2006-02-15 21:30:53'),(2273,'2005-06-18 06:30:02',4456,327,'2005-06-20 07:07:02',1,'2006-02-15 21:30:53'),(2274,'2005-06-18 06:31:15',3021,347,'2005-06-21 01:24:15',2,'2006-02-15 21:30:53'),(2275,'2005-06-18 06:31:29',2805,354,'2005-06-24 10:04:29',2,'2006-02-15 21:30:53'),(2276,'2005-06-18 06:33:48',1145,594,'2005-06-25 00:50:48',2,'2006-02-15 21:30:53'),(2277,'2005-06-18 06:35:03',3770,224,'2005-06-19 01:26:03',1,'2006-02-15 21:30:53'),(2278,'2005-06-18 06:37:57',1166,450,'2005-06-22 10:57:57',1,'2006-02-15 21:30:53'),(2279,'2005-06-18 06:38:22',1953,554,'2005-06-27 07:16:22',1,'2006-02-15 21:30:53'),(2280,'2005-06-18 06:46:54',4568,548,'2005-06-26 09:48:54',2,'2006-02-15 21:30:53'),(2281,'2005-06-18 06:47:29',4212,431,'2005-06-20 10:27:29',2,'2006-02-15 21:30:53'),(2282,'2005-06-18 06:48:23',4388,113,'2005-06-24 11:04:23',2,'2006-02-15 21:30:53'),(2283,'2005-06-18 06:56:06',2056,507,'2005-06-19 05:11:06',2,'2006-02-15 21:30:53'),(2284,'2005-06-18 06:59:51',2682,228,'2005-06-24 04:58:51',2,'2006-02-15 21:30:53'),(2285,'2005-06-18 07:00:54',755,447,'2005-06-25 08:58:54',2,'2006-02-15 21:30:53'),(2286,'2005-06-18 07:02:32',618,287,'2005-06-27 12:33:32',1,'2006-02-15 21:30:53'),(2287,'2005-06-18 07:04:36',1473,317,'2005-06-27 03:00:36',2,'2006-02-15 21:30:53'),(2288,'2005-06-18 07:23:17',877,247,'2005-06-26 07:44:17',2,'2006-02-15 21:30:53'),(2289,'2005-06-18 07:29:43',2030,392,'2005-06-24 11:16:43',2,'2006-02-15 21:30:53'),(2290,'2005-06-18 07:34:37',200,513,'2005-06-26 11:45:37',1,'2006-02-15 21:30:53'),(2291,'2005-06-18 07:36:46',3949,436,'2005-06-26 04:57:46',2,'2006-02-15 21:30:53'),(2292,'2005-06-18 07:37:48',173,130,'2005-06-20 02:45:48',2,'2006-02-15 21:30:53'),(2293,'2005-06-18 07:45:03',3209,178,'2005-06-24 08:12:03',1,'2006-02-15 21:30:53'),(2294,'2005-06-18 07:46:34',2096,72,'2005-06-22 12:34:34',2,'2006-02-15 21:30:53'),(2295,'2005-06-18 07:56:18',3250,106,'2005-06-21 07:10:18',1,'2006-02-15 21:30:53'),(2296,'2005-06-18 08:10:42',4558,481,'2005-06-20 12:26:42',2,'2006-02-15 21:30:53'),(2297,'2005-06-18 08:17:41',2262,111,'2005-06-26 05:08:41',2,'2006-02-15 21:30:53'),(2298,'2005-06-18 08:18:29',1227,497,'2005-06-24 11:51:29',1,'2006-02-15 21:30:53'),(2299,'2005-06-18 08:18:52',4339,28,'2005-06-26 11:48:52',1,'2006-02-15 21:30:53'),(2300,'2005-06-18 08:22:34',1617,291,'2005-06-24 04:51:34',2,'2006-02-15 21:30:53'),(2301,'2005-06-18 08:24:03',869,273,'2005-06-25 10:31:03',2,'2006-02-15 21:30:53'),(2302,'2005-06-18 08:27:33',1852,42,'2005-06-22 02:46:33',2,'2006-02-15 21:30:53'),(2303,'2005-06-18 08:27:59',1524,329,'2005-06-22 10:58:59',1,'2006-02-15 21:30:53'),(2304,'2005-06-18 08:30:15',3543,327,'2005-06-23 06:17:15',1,'2006-02-15 21:30:53'),(2305,'2005-06-18 08:31:18',622,149,'2005-06-24 06:18:18',2,'2006-02-15 21:30:53'),(2306,'2005-06-18 08:33:23',208,477,'2005-06-27 10:01:23',2,'2006-02-15 21:30:53'),(2307,'2005-06-18 08:34:59',4576,47,'2005-06-23 04:42:59',1,'2006-02-15 21:30:53'),(2308,'2005-06-18 08:41:48',197,1,'2005-06-22 03:36:48',2,'2006-02-15 21:30:53'),(2309,'2005-06-18 08:43:24',611,576,'2005-06-20 03:56:24',1,'2006-02-15 21:30:53'),(2310,'2005-06-18 08:45:59',2590,409,'2005-06-26 05:06:59',2,'2006-02-15 21:30:53'),(2311,'2005-06-18 08:51:29',4506,236,'2005-06-25 07:51:29',1,'2006-02-15 21:30:53'),(2312,'2005-06-18 08:55:46',402,184,'2005-06-24 04:34:46',2,'2006-02-15 21:30:53'),(2313,'2005-06-18 08:56:45',3134,379,'2005-06-26 10:30:45',2,'2006-02-15 21:30:53'),(2314,'2005-06-18 09:03:19',2157,160,'2005-06-19 12:14:19',1,'2006-02-15 21:30:53'),(2315,'2005-06-18 09:03:39',2766,372,'2005-06-22 11:18:39',1,'2006-02-15 21:30:53'),(2316,'2005-06-18 09:04:59',372,289,'2005-06-20 09:39:59',2,'2006-02-15 21:30:53'),(2317,'2005-06-18 09:12:18',1602,326,'2005-06-21 05:50:18',2,'2006-02-15 21:30:53'),(2318,'2005-06-18 09:13:54',2328,383,'2005-06-23 07:19:54',1,'2006-02-15 21:30:53'),(2319,'2005-06-18 09:24:22',1521,393,'2005-06-26 14:12:22',2,'2006-02-15 21:30:53'),(2320,'2005-06-18 09:24:50',597,552,'2005-06-24 07:59:50',1,'2006-02-15 21:30:53'),(2321,'2005-06-18 09:42:42',1160,565,'2005-06-25 14:28:42',1,'2006-02-15 21:30:53'),(2322,'2005-06-18 09:44:21',1893,213,'2005-06-25 09:29:21',1,'2006-02-15 21:30:53'),(2323,'2005-06-18 09:55:02',207,54,'2005-06-23 07:19:02',1,'2006-02-15 21:30:53'),(2324,'2005-06-18 10:00:33',2987,268,'2005-06-23 14:10:33',1,'2006-02-15 21:30:53'),(2325,'2005-06-18 10:08:07',752,406,'2005-06-21 15:07:07',1,'2006-02-15 21:30:53'),(2326,'2005-06-18 10:14:22',3829,174,'2005-06-24 07:01:22',2,'2006-02-15 21:30:53'),(2327,'2005-06-18 10:16:40',1351,571,'2005-06-20 15:06:40',1,'2006-02-15 21:30:53'),(2328,'2005-06-18 10:17:21',2304,441,'2005-06-21 04:18:21',1,'2006-02-15 21:30:53'),(2329,'2005-06-18 10:22:52',4156,587,'2005-06-20 12:03:52',2,'2006-02-15 21:30:53'),(2330,'2005-06-18 10:41:19',4285,390,'2005-06-25 10:48:19',1,'2006-02-15 21:30:53'),(2331,'2005-06-18 10:50:09',1546,221,'2005-06-25 14:30:09',1,'2006-02-15 21:30:53'),(2332,'2005-06-18 10:53:51',2152,140,'2005-06-24 12:06:51',2,'2006-02-15 21:30:53'),(2333,'2005-06-18 10:55:54',2323,283,'2005-06-25 07:09:54',2,'2006-02-15 21:30:53'),(2334,'2005-06-18 10:56:24',3076,223,'2005-06-22 10:38:24',2,'2006-02-15 21:30:53'),(2335,'2005-06-18 10:59:36',3968,446,'2005-06-26 06:42:36',2,'2006-02-15 21:30:53'),(2336,'2005-06-18 11:00:05',3888,124,'2005-06-25 06:02:05',2,'2006-02-15 21:30:53'),(2337,'2005-06-18 11:15:27',4522,582,'2005-06-26 06:59:27',2,'2006-02-15 21:30:53'),(2338,'2005-06-18 11:24:54',3165,316,'2005-06-19 07:34:54',1,'2006-02-15 21:30:53'),(2339,'2005-06-18 11:29:22',313,297,'2005-06-21 10:29:22',1,'2006-02-15 21:30:53'),(2340,'2005-06-18 11:30:56',1913,157,'2005-06-23 06:00:56',1,'2006-02-15 21:30:53'),(2341,'2005-06-18 11:35:30',638,31,'2005-06-27 11:56:30',2,'2006-02-15 21:30:53'),(2342,'2005-06-18 11:42:40',2169,146,'2005-06-20 14:40:40',1,'2006-02-15 21:30:53'),(2343,'2005-06-18 11:46:26',4554,20,'2005-06-22 11:37:26',2,'2006-02-15 21:30:53'),(2344,'2005-06-18 12:01:47',2015,498,'2005-06-19 11:56:47',2,'2006-02-15 21:30:53'),(2345,'2005-06-18 12:03:23',1818,6,'2005-06-22 14:25:23',2,'2006-02-15 21:30:53'),(2346,'2005-06-18 12:08:16',2575,308,'2005-06-27 15:02:16',1,'2006-02-15 21:30:53'),(2347,'2005-06-18 12:12:29',4516,194,'2005-06-23 14:03:29',1,'2006-02-15 21:30:53'),(2348,'2005-06-18 12:15:43',3622,449,'2005-06-24 14:03:43',2,'2006-02-15 21:30:53'),(2349,'2005-06-18 12:25:14',1536,495,'2005-06-19 11:24:14',2,'2006-02-15 21:30:53'),(2350,'2005-06-18 12:25:29',1179,471,'2005-06-23 11:35:29',1,'2006-02-15 21:30:53'),(2351,'2005-06-18 12:27:57',2942,216,'2005-06-23 16:14:57',1,'2006-02-15 21:30:53'),(2352,'2005-06-18 12:40:15',2141,590,'2005-06-22 07:07:15',2,'2006-02-15 21:30:53'),(2353,'2005-06-18 12:53:25',3223,361,'2005-06-19 13:53:25',1,'2006-02-15 21:30:53'),(2354,'2005-06-18 12:54:18',2793,77,'2005-06-26 07:23:18',2,'2006-02-15 21:30:53'),(2355,'2005-06-18 12:57:06',3613,125,'2005-06-26 07:32:06',1,'2006-02-15 21:30:53'),(2356,'2005-06-18 12:59:23',2207,455,'2005-06-21 10:12:23',2,'2006-02-15 21:30:53'),(2357,'2005-06-18 12:59:41',1323,561,'2005-06-26 16:40:41',1,'2006-02-15 21:30:53'),(2358,'2005-06-18 13:00:51',1728,478,'2005-06-26 12:58:51',1,'2006-02-15 21:30:53'),(2359,'2005-06-18 13:04:42',3087,201,'2005-06-25 11:52:42',1,'2006-02-15 21:30:53'),(2360,'2005-06-18 13:11:13',37,57,'2005-06-23 15:32:13',2,'2006-02-15 21:30:53'),(2361,'2005-06-18 13:19:05',3547,546,'2005-06-23 07:59:05',1,'2006-02-15 21:30:53'),(2362,'2005-06-18 13:31:15',2815,514,'2005-06-19 12:35:15',1,'2006-02-15 21:30:53'),(2363,'2005-06-18 13:33:59',3497,1,'2005-06-19 17:40:59',1,'2006-02-15 21:30:53'),(2364,'2005-06-18 13:37:32',2856,512,'2005-06-23 14:18:32',1,'2006-02-15 21:30:53'),(2365,'2005-06-18 13:45:34',3109,493,'2005-06-21 12:12:34',2,'2006-02-15 21:30:53'),(2366,'2005-06-18 13:46:39',1413,162,'2005-06-23 18:49:39',2,'2006-02-15 21:30:53'),(2367,'2005-06-18 14:00:31',4086,566,'2005-06-22 14:45:31',2,'2006-02-15 21:30:53'),(2368,'2005-06-18 14:10:27',1058,99,'2005-06-23 10:49:27',1,'2006-02-15 21:30:53'),(2369,'2005-06-18 14:25:29',1515,44,'2005-06-23 18:45:29',2,'2006-02-15 21:30:53'),(2370,'2005-06-18 14:29:54',2656,489,'2005-06-24 10:23:54',1,'2006-02-15 21:30:53'),(2371,'2005-06-18 14:35:29',178,248,'2005-06-22 09:38:29',2,'2006-02-15 21:30:53'),(2372,'2005-06-18 14:37:37',1567,96,'2005-06-21 08:40:37',2,'2006-02-15 21:30:53'),(2373,'2005-06-18 14:37:57',2780,544,'2005-06-23 19:29:57',2,'2006-02-15 21:30:53'),(2374,'2005-06-18 14:44:06',2634,71,'2005-06-22 17:14:06',1,'2006-02-15 21:30:53'),(2375,'2005-06-18 14:47:29',2175,259,'2005-06-26 13:52:29',2,'2006-02-15 21:30:53'),(2376,'2005-06-18 14:55:30',3664,479,'2005-06-25 17:40:30',1,'2006-02-15 21:30:53'),(2377,'2005-06-18 14:56:23',3568,193,'2005-06-27 12:36:23',1,'2006-02-15 21:30:53'),(2378,'2005-06-18 14:57:49',2796,384,'2005-06-26 18:23:49',2,'2006-02-15 21:30:53'),(2379,'2005-06-18 14:59:39',2708,597,'2005-06-24 13:26:39',2,'2006-02-15 21:30:53'),(2380,'2005-06-18 15:00:04',4413,256,'2005-06-24 13:29:04',2,'2006-02-15 21:30:53'),(2381,'2005-06-18 15:00:30',1491,167,'2005-06-22 11:38:30',1,'2006-02-15 21:30:53'),(2382,'2005-06-18 15:03:52',915,568,'2005-06-20 10:16:52',2,'2006-02-15 21:30:53'),(2383,'2005-06-18 15:17:59',2459,149,'2005-06-26 18:42:59',2,'2006-02-15 21:30:53'),(2384,'2005-06-18 15:18:49',3378,132,'2005-06-21 18:10:49',1,'2006-02-15 21:30:53'),(2385,'2005-06-18 15:22:40',1641,298,'2005-06-26 10:02:40',1,'2006-02-15 21:30:53'),(2386,'2005-06-18 15:22:51',1361,293,'2005-06-22 20:01:51',1,'2006-02-15 21:30:53'),(2387,'2005-06-18 15:24:19',692,289,'2005-06-25 17:41:19',2,'2006-02-15 21:30:53'),(2388,'2005-06-18 15:26:30',2923,53,'2005-06-20 20:24:30',1,'2006-02-15 21:30:53'),(2389,'2005-06-18 15:27:47',731,382,'2005-06-21 12:26:47',1,'2006-02-15 21:30:53'),(2390,'2005-06-18 15:29:26',2748,239,'2005-06-23 17:50:26',1,'2006-02-15 21:30:53'),(2391,'2005-06-18 15:33:30',2850,491,'2005-06-25 14:30:30',1,'2006-02-15 21:30:53'),(2392,'2005-06-18 15:34:18',2213,261,'2005-06-19 16:22:18',1,'2006-02-15 21:30:53'),(2393,'2005-06-18 15:37:55',3143,21,'2005-06-25 17:11:55',1,'2006-02-15 21:30:53'),(2394,'2005-06-18 15:42:30',2669,60,'2005-06-26 16:12:30',1,'2006-02-15 21:30:53'),(2395,'2005-06-18 15:45:15',899,544,'2005-06-27 19:11:15',2,'2006-02-15 21:30:53'),(2396,'2005-06-18 15:49:48',1986,31,'2005-06-27 20:31:48',2,'2006-02-15 21:30:53'),(2397,'2005-06-18 15:51:25',2895,76,'2005-06-24 15:52:25',1,'2006-02-15 21:30:53'),(2398,'2005-06-18 15:56:53',3001,526,'2005-06-27 14:25:53',2,'2006-02-15 21:30:53'),(2399,'2005-06-18 16:06:14',2492,577,'2005-06-26 16:56:14',2,'2006-02-15 21:30:53'),(2400,'2005-06-18 16:10:46',3194,410,'2005-06-25 20:34:46',1,'2006-02-15 21:30:53'),(2401,'2005-06-18 16:22:03',85,359,'2005-06-19 13:49:03',2,'2006-02-15 21:30:53'),(2402,'2005-06-18 16:24:45',2833,360,'2005-06-27 14:39:45',1,'2006-02-15 21:30:53'),(2403,'2005-06-18 16:33:22',2697,536,'2005-06-23 19:25:22',1,'2006-02-15 21:30:53'),(2404,'2005-06-18 16:33:48',4138,456,'2005-06-23 20:39:48',2,'2006-02-15 21:30:53'),(2405,'2005-06-18 16:36:38',3604,356,'2005-06-21 19:15:38',1,'2006-02-15 21:30:53'),(2406,'2005-06-18 16:39:37',1321,497,'2005-06-23 12:04:37',1,'2006-02-15 21:30:53'),(2407,'2005-06-18 16:50:41',2547,421,'2005-06-24 15:29:41',2,'2006-02-15 21:30:53'),(2408,'2005-06-18 16:50:44',258,87,'2005-06-19 20:11:44',1,'2006-02-15 21:30:53'),(2409,'2005-06-18 16:53:33',656,84,'2005-06-20 18:23:33',1,'2006-02-15 21:30:53'),(2410,'2005-06-18 16:55:08',265,381,'2005-06-20 12:40:08',2,'2006-02-15 21:30:53'),(2411,'2005-06-18 16:55:54',3302,558,'2005-06-25 12:44:54',1,'2006-02-15 21:30:53'),(2412,'2005-06-18 16:58:58',1946,127,'2005-06-27 22:57:58',1,'2006-02-15 21:30:53'),(2413,'2005-06-18 16:59:34',1851,170,'2005-06-27 16:10:34',2,'2006-02-15 21:30:53'),(2414,'2005-06-18 17:01:55',4500,275,'2005-06-20 17:42:55',1,'2006-02-15 21:30:53'),(2415,'2005-06-18 17:02:42',3105,434,'2005-06-25 13:16:42',2,'2006-02-15 21:30:53'),(2416,'2005-06-18 17:07:34',2868,26,'2005-06-24 19:16:34',1,'2006-02-15 21:30:53'),(2417,'2005-06-18 17:12:01',1956,219,'2005-06-26 13:32:01',1,'2006-02-15 21:30:53'),(2418,'2005-06-18 17:14:42',2756,381,'2005-06-26 16:33:42',1,'2006-02-15 21:30:53'),(2419,'2005-06-18 17:21:24',1255,102,'2005-06-26 18:25:24',1,'2006-02-15 21:30:53'),(2420,'2005-06-18 17:22:28',241,502,'2005-06-23 17:45:28',1,'2006-02-15 21:30:53'),(2421,'2005-06-18 17:25:05',3524,26,'2005-06-23 21:09:05',2,'2006-02-15 21:30:53'),(2422,'2005-06-18 17:28:57',3170,527,'2005-06-23 15:22:57',1,'2006-02-15 21:30:53'),(2423,'2005-06-18 17:32:08',1744,231,'2005-06-21 11:58:08',1,'2006-02-15 21:30:53'),(2424,'2005-06-18 17:35:08',1884,233,'2005-06-23 15:33:08',1,'2006-02-15 21:30:53'),(2425,'2005-06-18 17:37:45',2630,579,'2005-06-27 18:40:45',2,'2006-02-15 21:30:53'),(2426,'2005-06-18 17:40:44',474,543,'2005-06-22 14:30:44',2,'2006-02-15 21:30:53'),(2427,'2005-06-18 17:45:00',4278,176,'2005-06-27 20:07:00',2,'2006-02-15 21:30:53'),(2428,'2005-06-18 17:47:34',3892,241,'2005-06-19 14:39:34',2,'2006-02-15 21:30:53'),(2429,'2005-06-18 17:48:28',3238,583,'2005-06-27 15:52:28',1,'2006-02-15 21:30:53'),(2430,'2005-06-18 17:51:46',1984,434,'2005-06-23 19:17:46',1,'2006-02-15 21:30:53'),(2431,'2005-06-18 17:53:03',1383,295,'2005-06-25 15:08:03',2,'2006-02-15 21:30:53'),(2432,'2005-06-18 17:59:18',4420,250,'2005-06-25 15:19:18',2,'2006-02-15 21:30:53'),(2433,'2005-06-18 18:10:17',937,356,'2005-06-23 14:46:17',2,'2006-02-15 21:30:53'),(2434,'2005-06-18 18:11:51',3739,12,'2005-06-23 12:52:51',2,'2006-02-15 21:30:53'),(2435,'2005-06-18 18:12:26',3548,173,'2005-06-22 13:43:26',2,'2006-02-15 21:30:53'),(2436,'2005-06-18 18:13:32',3328,534,'2005-06-21 13:33:32',2,'2006-02-15 21:30:53'),(2437,'2005-06-18 18:30:26',1799,454,'2005-06-21 18:36:26',1,'2006-02-15 21:30:53'),(2438,'2005-06-18 18:34:21',184,31,'2005-06-19 16:50:21',1,'2006-02-15 21:30:53'),(2439,'2005-06-18 18:35:04',909,39,'2005-06-21 19:47:04',2,'2006-02-15 21:30:53'),(2440,'2005-06-18 18:41:09',2866,380,'2005-06-22 12:46:09',1,'2006-02-15 21:30:53'),(2441,'2005-06-18 18:45:11',3148,593,'2005-06-20 00:42:11',1,'2006-02-15 21:30:53'),(2442,'2005-06-18 18:49:18',4045,364,'2005-06-22 16:18:18',1,'2006-02-15 21:30:53'),(2443,'2005-06-18 18:52:30',1622,233,'2005-06-24 21:27:30',1,'2006-02-15 21:30:53'),(2444,'2005-06-18 18:58:12',2233,576,'2005-06-27 20:48:12',1,'2006-02-15 21:30:53'),(2445,'2005-06-18 19:02:11',2887,98,'2005-06-23 22:25:11',1,'2006-02-15 21:30:53'),(2446,'2005-06-18 19:04:41',1283,466,'2005-06-27 17:10:41',2,'2006-02-15 21:30:53'),(2447,'2005-06-18 19:10:55',2353,523,'2005-06-27 16:35:55',1,'2006-02-15 21:30:53'),(2448,'2005-06-18 19:13:45',1642,308,'2005-06-27 14:43:45',1,'2006-02-15 21:30:53'),(2449,'2005-06-18 19:18:36',3630,498,'2005-06-27 23:49:36',1,'2006-02-15 21:30:53'),(2450,'2005-06-18 19:25:47',863,230,'2005-06-27 15:54:47',1,'2006-02-15 21:30:53'),(2451,'2005-06-18 19:28:02',835,24,'2005-06-23 16:41:02',1,'2006-02-15 21:30:53'),(2452,'2005-06-18 19:29:21',4318,77,'2005-06-26 22:27:21',1,'2006-02-15 21:30:53'),(2453,'2005-06-18 19:30:53',2562,588,'2005-06-20 17:22:53',1,'2006-02-15 21:30:53'),(2454,'2005-06-18 19:32:51',314,253,'2005-06-24 20:03:51',2,'2006-02-15 21:30:53'),(2455,'2005-06-18 19:33:06',870,241,'2005-06-21 15:21:06',1,'2006-02-15 21:30:53'),(2456,'2005-06-18 19:36:50',553,147,'2005-06-23 22:48:50',1,'2006-02-15 21:30:53'),(2457,'2005-06-18 19:38:20',1277,91,'2005-06-26 20:48:20',1,'2006-02-15 21:30:53'),(2458,'2005-06-18 19:39:05',599,572,'2005-06-21 13:54:05',2,'2006-02-15 21:30:53'),(2459,'2005-06-18 19:44:08',1024,185,'2005-06-23 19:14:08',2,'2006-02-15 21:30:53'),(2460,'2005-06-18 19:54:13',3933,553,'2005-06-27 22:36:13',2,'2006-02-15 21:30:53'),(2461,'2005-06-18 19:58:12',78,343,'2005-06-28 01:35:12',2,'2006-02-15 21:30:53'),(2462,'2005-06-18 20:00:15',2151,468,'2005-06-21 21:54:15',2,'2006-02-15 21:30:53'),(2463,'2005-06-18 20:01:43',1186,194,'2005-06-25 15:04:43',2,'2006-02-15 21:30:53'),(2464,'2005-06-18 20:06:05',463,380,'2005-06-20 19:22:05',1,'2006-02-15 21:30:53'),(2465,'2005-06-18 20:07:02',3783,160,'2005-06-25 20:55:02',1,'2006-02-15 21:30:53'),(2466,'2005-06-18 20:18:42',1356,427,'2005-06-20 01:32:42',1,'2006-02-15 21:30:53'),(2467,'2005-06-18 20:20:05',4387,177,'2005-06-20 17:01:05',1,'2006-02-15 21:30:53'),(2468,'2005-06-18 20:23:52',1833,382,'2005-06-23 14:34:52',1,'2006-02-15 21:30:53'),(2469,'2005-06-18 20:24:23',1993,137,'2005-06-27 15:39:23',1,'2006-02-15 21:30:53'),(2470,'2005-06-18 20:28:31',4319,40,'2005-06-25 18:48:31',1,'2006-02-15 21:30:53'),(2471,'2005-06-18 20:31:00',3399,183,'2005-06-24 18:01:00',2,'2006-02-15 21:30:53'),(2472,'2005-06-18 20:32:40',4556,70,'2005-06-20 00:40:40',2,'2006-02-15 21:30:53'),(2473,'2005-06-18 20:42:45',3876,221,'2005-06-19 20:17:45',1,'2006-02-15 21:30:53'),(2474,'2005-06-18 20:51:34',3450,151,'2005-06-25 01:39:34',1,'2006-02-15 21:30:53'),(2475,'2005-06-18 20:52:46',889,336,'2005-06-21 19:40:46',2,'2006-02-15 21:30:53'),(2476,'2005-06-18 20:57:12',3998,334,'2005-06-20 15:42:12',1,'2006-02-15 21:30:53'),(2477,'2005-06-18 20:58:46',2510,206,'2005-06-22 21:49:46',1,'2006-02-15 21:30:53'),(2478,'2005-06-18 21:01:21',2798,241,'2005-06-24 00:20:21',1,'2006-02-15 21:30:53'),(2479,'2005-06-18 21:03:08',1624,408,'2005-06-22 16:49:08',1,'2006-02-15 21:30:53'),(2480,'2005-06-18 21:04:09',4078,310,'2005-06-22 16:24:09',1,'2006-02-15 21:30:53'),(2481,'2005-06-18 21:08:30',800,322,'2005-06-23 02:35:30',2,'2006-02-15 21:30:53'),(2482,'2005-06-18 21:10:44',452,122,'2005-06-19 20:39:44',1,'2006-02-15 21:30:53'),(2483,'2005-06-18 21:22:23',4225,88,'2005-06-25 01:14:23',1,'2006-02-15 21:30:53'),(2484,'2005-06-18 21:25:23',1511,515,'2005-06-24 16:03:23',2,'2006-02-15 21:30:53'),(2485,'2005-06-18 21:26:03',1562,56,'2005-06-21 22:09:03',2,'2006-02-15 21:30:53'),(2486,'2005-06-18 21:26:56',268,15,'2005-06-22 23:42:56',1,'2006-02-15 21:30:53'),(2487,'2005-06-18 21:32:54',3683,374,'2005-06-23 21:11:54',2,'2006-02-15 21:30:53'),(2488,'2005-06-18 21:38:26',1338,403,'2005-06-24 02:08:26',2,'2006-02-15 21:30:53'),(2489,'2005-06-18 22:00:44',4012,382,'2005-06-22 02:06:44',2,'2006-02-15 21:30:53'),(2490,'2005-06-18 22:00:50',1934,402,'2005-06-19 23:45:50',2,'2006-02-15 21:30:53'),(2491,'2005-06-18 22:01:31',1779,316,'2005-06-26 02:46:31',1,'2006-02-15 21:30:53'),(2492,'2005-06-18 22:04:15',2858,237,'2005-06-23 21:58:15',1,'2006-02-15 21:30:53'),(2493,'2005-06-18 22:12:09',4121,269,'2005-06-27 23:44:09',1,'2006-02-15 21:30:53'),(2494,'2005-06-18 22:15:09',1313,434,'2005-06-25 17:23:09',1,'2006-02-15 21:30:53'),(2495,'2005-06-18 22:15:42',3826,338,'2005-06-21 23:21:42',1,'2006-02-15 21:30:53'),(2496,'2005-06-18 22:20:11',646,527,'2005-06-20 03:08:11',2,'2006-02-15 21:30:53'),(2497,'2005-06-18 22:50:40',2327,171,'2005-06-26 22:39:40',1,'2006-02-15 21:30:53'),(2498,'2005-06-18 22:56:26',2291,74,'2005-06-22 20:02:26',1,'2006-02-15 21:30:53'),(2499,'2005-06-18 23:01:36',3172,348,'2005-06-20 21:50:36',2,'2006-02-15 21:30:53'),(2500,'2005-06-18 23:07:12',4241,12,'2005-06-26 17:27:12',1,'2006-02-15 21:30:53'),(2501,'2005-06-18 23:10:11',1185,450,'2005-06-24 18:40:11',2,'2006-02-15 21:30:53'),(2502,'2005-06-18 23:12:13',2622,325,'2005-06-20 04:19:13',2,'2006-02-15 21:30:53'),(2503,'2005-06-18 23:17:19',2486,176,'2005-06-23 03:57:19',2,'2006-02-15 21:30:53'),(2504,'2005-06-18 23:19:53',1684,452,'2005-06-21 04:43:53',2,'2006-02-15 21:30:53'),(2505,'2005-06-18 23:28:27',1670,519,'2005-06-26 01:36:27',1,'2006-02-15 21:30:53'),(2506,'2005-06-18 23:29:53',2308,82,'2005-06-25 18:11:53',2,'2006-02-15 21:30:53'),(2507,'2005-06-18 23:39:22',3121,325,'2005-06-21 19:23:22',1,'2006-02-15 21:30:53'),(2508,'2005-06-18 23:43:58',4322,476,'2005-06-20 19:26:58',2,'2006-02-15 21:30:53'),(2509,'2005-06-18 23:44:08',4469,213,'2005-06-20 01:36:08',2,'2006-02-15 21:30:53'),(2510,'2005-06-18 23:44:21',3827,384,'2005-06-24 00:31:21',1,'2006-02-15 21:30:53'),(2511,'2005-06-18 23:45:30',1824,234,'2005-06-24 01:21:30',2,'2006-02-15 21:30:53'),(2512,'2005-06-18 23:48:47',4515,27,'2005-06-21 04:58:47',2,'2006-02-15 21:30:53'),(2513,'2005-06-18 23:53:15',3379,515,'2005-06-24 21:16:15',2,'2006-02-15 21:30:53'),(2514,'2005-06-18 23:56:44',2559,382,'2005-06-23 21:10:44',1,'2006-02-15 21:30:53'),(2515,'2005-06-18 23:57:31',3213,188,'2005-06-22 05:31:31',2,'2006-02-15 21:30:53'),(2516,'2005-06-19 00:03:28',2678,87,'2005-06-21 00:30:28',2,'2006-02-15 21:30:53'),(2517,'2005-06-19 00:11:26',53,74,'2005-06-25 02:19:26',1,'2006-02-15 21:30:53'),(2518,'2005-06-19 00:16:23',3503,86,'2005-06-25 19:28:23',2,'2006-02-15 21:30:53'),(2519,'2005-06-19 00:19:21',1172,128,'2005-06-25 01:46:21',1,'2006-02-15 21:30:53'),(2520,'2005-06-19 00:29:00',4181,446,'2005-06-28 04:36:00',1,'2006-02-15 21:30:53'),(2521,'2005-06-19 00:41:08',132,92,'2005-06-22 00:40:08',1,'2006-02-15 21:30:53'),(2522,'2005-06-19 00:43:42',550,579,'2005-06-28 04:26:42',1,'2006-02-15 21:30:53'),(2523,'2005-06-19 00:45:56',460,89,'2005-06-21 00:54:56',2,'2006-02-15 21:30:53'),(2524,'2005-06-19 00:48:11',441,465,'2005-06-25 01:46:11',2,'2006-02-15 21:30:53'),(2525,'2005-06-19 00:48:22',1307,365,'2005-06-24 19:10:22',2,'2006-02-15 21:30:53'),(2526,'2005-06-19 01:03:07',3309,500,'2005-06-28 06:57:07',1,'2006-02-15 21:30:53'),(2527,'2005-06-19 01:10:31',387,463,'2005-06-20 05:37:31',2,'2006-02-15 21:30:53'),(2528,'2005-06-19 01:14:12',1836,331,'2005-06-26 05:08:12',2,'2006-02-15 21:30:53'),(2529,'2005-06-19 01:18:27',2306,478,'2005-06-24 00:26:27',1,'2006-02-15 21:30:53'),(2530,'2005-06-19 01:20:00',4166,31,'2005-06-23 04:10:00',1,'2006-02-15 21:30:53'),(2531,'2005-06-19 01:20:49',768,368,'2005-06-22 01:50:49',2,'2006-02-15 21:30:53'),(2532,'2005-06-19 01:27:46',1870,26,'2005-06-20 02:15:46',1,'2006-02-15 21:30:53'),(2533,'2005-06-19 01:34:26',4564,187,'2005-06-22 20:19:26',1,'2006-02-15 21:30:53'),(2534,'2005-06-19 01:38:39',2540,517,'2005-06-23 00:16:39',1,'2006-02-15 21:30:53'),(2535,'2005-06-19 01:39:04',901,130,'2005-06-28 01:33:04',2,'2006-02-15 21:30:53'),(2536,'2005-06-19 01:41:34',4232,163,'2005-06-27 03:11:34',1,'2006-02-15 21:30:53'),(2537,'2005-06-19 01:52:21',3499,388,'2005-06-26 02:09:21',1,'2006-02-15 21:30:53'),(2538,'2005-06-19 01:56:59',1287,472,'2005-06-25 00:54:59',2,'2006-02-15 21:30:53'),(2539,'2005-06-19 01:58:39',4474,527,'2005-06-19 22:17:39',2,'2006-02-15 21:30:53'),(2540,'2005-06-19 02:04:48',4305,363,'2005-06-20 22:42:48',2,'2006-02-15 21:30:53'),(2541,'2005-06-19 02:08:10',129,360,'2005-06-23 23:32:10',1,'2006-02-15 21:30:53'),(2542,'2005-06-19 02:08:39',1446,67,'2005-06-26 20:25:39',1,'2006-02-15 21:30:53'),(2543,'2005-06-19 02:14:11',1729,58,'2005-06-21 00:40:11',2,'2006-02-15 21:30:53'),(2544,'2005-06-19 02:16:17',1465,558,'2005-06-22 21:45:17',1,'2006-02-15 21:30:53'),(2545,'2005-06-19 02:23:36',3237,413,'2005-06-20 03:17:36',2,'2006-02-15 21:30:53'),(2546,'2005-06-19 02:39:39',971,272,'2005-06-23 03:56:39',2,'2006-02-15 21:30:53'),(2547,'2005-06-19 02:44:17',4560,162,'2005-06-24 08:01:17',2,'2006-02-15 21:30:53'),(2548,'2005-06-19 02:45:35',4292,561,'2005-06-22 06:52:35',2,'2006-02-15 21:30:53'),(2549,'2005-06-19 02:46:39',3854,495,'2005-06-26 22:30:39',2,'2006-02-15 21:30:53'),(2550,'2005-06-19 02:49:55',1370,38,'2005-06-24 01:37:55',1,'2006-02-15 21:30:53'),(2551,'2005-06-19 02:51:04',2007,444,'2005-06-28 05:02:04',1,'2006-02-15 21:30:53'),(2552,'2005-06-19 03:01:29',664,389,'2005-06-28 04:13:29',1,'2006-02-15 21:30:53'),(2553,'2005-06-19 03:04:59',923,473,'2005-06-26 02:36:59',2,'2006-02-15 21:30:53'),(2554,'2005-06-19 03:05:38',3916,322,'2005-06-25 23:03:38',1,'2006-02-15 21:30:53'),(2555,'2005-06-19 03:07:02',260,191,'2005-06-25 05:25:02',2,'2006-02-15 21:30:53'),(2556,'2005-06-19 03:07:32',125,377,'2005-06-23 23:09:32',1,'2006-02-15 21:30:53'),(2557,'2005-06-19 03:08:51',4546,257,'2005-06-20 07:59:51',1,'2006-02-15 21:30:53'),(2558,'2005-06-19 03:09:16',2920,361,'2005-06-24 05:29:16',1,'2006-02-15 21:30:53'),(2559,'2005-06-19 03:09:46',4433,414,'2005-06-28 07:49:46',1,'2006-02-15 21:30:53'),(2560,'2005-06-19 03:12:42',3340,309,'2005-06-28 02:28:42',1,'2006-02-15 21:30:53'),(2561,'2005-06-19 03:14:52',4128,256,'2005-06-21 02:42:52',2,'2006-02-15 21:30:53'),(2562,'2005-06-19 03:15:05',51,265,'2005-06-21 08:26:05',2,'2006-02-15 21:30:53'),(2563,'2005-06-19 03:24:17',1935,41,'2005-06-23 04:08:17',2,'2006-02-15 21:30:53'),(2564,'2005-06-19 03:41:10',4008,408,'2005-06-24 03:10:10',1,'2006-02-15 21:30:53'),(2565,'2005-06-19 03:44:03',2347,128,'2005-06-24 01:26:03',2,'2006-02-15 21:30:53'),(2566,'2005-06-19 03:45:39',495,486,'2005-06-25 08:43:39',2,'2006-02-15 21:30:53'),(2567,'2005-06-19 04:04:46',216,496,'2005-06-19 23:39:46',2,'2006-02-15 21:30:53'),(2568,'2005-06-19 04:09:03',3032,190,'2005-06-24 23:24:03',1,'2006-02-15 21:30:53'),(2569,'2005-06-19 04:19:04',30,213,'2005-06-26 04:31:04',1,'2006-02-15 21:30:53'),(2570,'2005-06-19 04:20:13',1105,5,'2005-06-25 07:00:13',1,'2006-02-15 21:30:53'),(2571,'2005-06-19 04:20:14',1800,66,'2005-06-21 07:28:14',2,'2006-02-15 21:30:53'),(2572,'2005-06-19 04:21:26',2449,159,'2005-06-23 09:22:26',2,'2006-02-15 21:30:53'),(2573,'2005-06-19 04:23:18',3354,563,'2005-06-23 06:04:18',1,'2006-02-15 21:30:53'),(2574,'2005-06-19 04:23:52',3320,143,'2005-06-20 05:24:52',1,'2006-02-15 21:30:53'),(2575,'2005-06-19 04:32:52',354,336,'2005-06-24 09:37:52',1,'2006-02-15 21:30:53'),(2576,'2005-06-19 04:34:15',2928,559,'2005-06-28 10:02:15',2,'2006-02-15 21:30:53'),(2577,'2005-06-19 04:36:03',447,66,'2005-06-28 00:38:03',2,'2006-02-15 21:30:53'),(2578,'2005-06-19 04:40:06',1695,267,'2005-06-26 09:37:06',2,'2006-02-15 21:30:53'),(2579,'2005-06-19 04:40:44',3836,493,'2005-06-22 09:22:44',1,'2006-02-15 21:30:53'),(2580,'2005-06-19 04:44:30',2527,219,'2005-06-23 04:15:30',1,'2006-02-15 21:30:53'),(2581,'2005-06-19 04:54:13',376,456,'2005-06-23 23:28:13',2,'2006-02-15 21:30:53'),(2582,'2005-06-19 04:56:27',201,267,'2005-06-26 08:56:27',2,'2006-02-15 21:30:53'),(2583,'2005-06-19 05:01:40',3999,523,'2005-06-28 00:04:40',1,'2006-02-15 21:30:53'),(2584,'2005-06-19 05:02:36',3733,90,'2005-06-28 04:52:36',2,'2006-02-15 21:30:53'),(2585,'2005-06-19 05:05:03',91,406,'2005-06-20 09:28:03',1,'2006-02-15 21:30:53'),(2586,'2005-06-19 05:05:11',4104,537,'2005-06-27 00:23:11',1,'2006-02-15 21:30:53'),(2587,'2005-06-19 05:06:14',2188,331,'2005-06-24 10:50:14',2,'2006-02-15 21:30:53'),(2588,'2005-06-19 05:20:31',3626,143,'2005-06-22 04:20:31',2,'2006-02-15 21:30:53'),(2589,'2005-06-19 05:21:27',225,164,'2005-06-21 09:55:27',2,'2006-02-15 21:30:53'),(2590,'2005-06-19 05:31:40',3572,324,'2005-06-20 07:58:40',2,'2006-02-15 21:30:53'),(2591,'2005-06-19 05:32:22',4481,438,'2005-06-25 23:42:22',1,'2006-02-15 21:30:53'),(2592,'2005-06-19 05:36:54',282,208,'2005-06-21 08:44:54',1,'2006-02-15 21:30:53'),(2593,'2005-06-19 05:40:11',2031,556,'2005-06-28 08:11:11',1,'2006-02-15 21:30:53'),(2594,'2005-06-19 05:43:43',829,123,'2005-06-25 03:41:43',2,'2006-02-15 21:30:53'),(2595,'2005-06-19 05:43:55',3197,122,'2005-06-25 10:20:55',1,'2006-02-15 21:30:53'),(2596,'2005-06-19 05:48:26',2229,80,'2005-06-24 10:16:26',1,'2006-02-15 21:30:53'),(2597,'2005-06-19 05:53:46',2278,407,'2005-06-20 05:14:46',1,'2006-02-15 21:30:53'),(2598,'2005-06-19 05:59:57',2079,265,'2005-06-24 11:44:57',2,'2006-02-15 21:30:53'),(2599,'2005-06-19 06:06:07',461,171,'2005-06-27 01:10:07',1,'2006-02-15 21:30:53'),(2600,'2005-06-19 06:07:25',469,423,'2005-06-28 03:37:25',2,'2006-02-15 21:30:53'),(2601,'2005-06-19 06:09:44',2898,98,'2005-06-20 08:03:44',1,'2006-02-15 21:30:53'),(2602,'2005-06-19 06:10:08',4124,173,'2005-06-24 00:39:08',2,'2006-02-15 21:30:53'),(2603,'2005-06-19 06:21:25',587,222,'2005-06-26 03:19:25',1,'2006-02-15 21:30:53'),(2604,'2005-06-19 06:30:10',2889,28,'2005-06-25 11:16:10',2,'2006-02-15 21:30:53'),(2605,'2005-06-19 06:48:01',2342,38,'2005-06-25 07:00:01',1,'2006-02-15 21:30:53'),(2606,'2005-06-19 06:51:32',4133,364,'2005-06-21 03:15:32',2,'2006-02-15 21:30:53'),(2607,'2005-06-19 06:55:01',3922,340,'2005-06-25 03:21:01',2,'2006-02-15 21:30:53'),(2608,'2005-06-19 07:10:36',1618,132,'2005-06-24 13:09:36',1,'2006-02-15 21:30:53'),(2609,'2005-06-19 07:13:12',2254,383,'2005-06-28 12:30:12',2,'2006-02-15 21:30:53'),(2610,'2005-06-19 07:16:20',3845,542,'2005-06-25 09:39:20',2,'2006-02-15 21:30:53'),(2611,'2005-06-19 07:18:17',3682,301,'2005-06-21 10:19:17',1,'2006-02-15 21:30:53'),(2612,'2005-06-19 07:19:41',1691,287,'2005-06-25 11:10:41',1,'2006-02-15 21:30:53'),(2613,'2005-06-19 07:25:50',3830,179,'2005-06-21 03:04:50',1,'2006-02-15 21:30:53'),(2614,'2005-06-19 07:28:11',4147,145,'2005-06-22 12:33:11',1,'2006-02-15 21:30:53'),(2615,'2005-06-19 07:29:13',3810,578,'2005-06-27 12:50:13',1,'2006-02-15 21:30:53'),(2616,'2005-06-19 07:33:00',581,478,'2005-06-28 03:05:00',1,'2006-02-15 21:30:53'),(2617,'2005-06-19 07:48:31',204,313,'2005-06-27 11:56:31',1,'2006-02-15 21:30:53'),(2618,'2005-06-19 08:03:01',2465,310,'2005-06-24 03:23:01',2,'2006-02-15 21:30:53'),(2619,'2005-06-19 08:03:12',1848,350,'2005-06-21 05:02:12',2,'2006-02-15 21:30:53'),(2620,'2005-06-19 08:06:29',3183,94,'2005-06-24 11:42:29',1,'2006-02-15 21:30:53'),(2621,'2005-06-19 08:07:31',1746,439,'2005-06-28 05:36:31',1,'2006-02-15 21:30:53'),(2622,'2005-06-19 08:10:41',1393,573,'2005-06-28 10:44:41',2,'2006-02-15 21:30:53'),(2623,'2005-06-19 08:11:51',4477,12,'2005-06-26 12:28:51',2,'2006-02-15 21:30:53'),(2624,'2005-06-19 08:22:09',3071,32,'2005-06-27 11:13:09',1,'2006-02-15 21:30:53'),(2625,'2005-06-19 08:23:11',3946,25,'2005-06-26 09:52:11',2,'2006-02-15 21:30:53'),(2626,'2005-06-19 08:28:44',2816,450,'2005-06-24 03:58:44',1,'2006-02-15 21:30:53'),(2627,'2005-06-19 08:32:00',2779,592,'2005-06-24 04:31:00',2,'2006-02-15 21:30:53'),(2628,'2005-06-19 08:34:53',3917,3,'2005-06-28 04:19:53',2,'2006-02-15 21:30:53'),(2629,'2005-06-19 08:42:12',1810,458,'2005-06-28 03:38:12',2,'2006-02-15 21:30:53'),(2630,'2005-06-19 08:47:21',3904,236,'2005-06-25 09:31:21',1,'2006-02-15 21:30:53'),(2631,'2005-06-19 08:49:53',3471,39,'2005-06-26 03:25:53',1,'2006-02-15 21:30:53'),(2632,'2005-06-19 08:51:47',2274,574,'2005-06-23 07:13:47',2,'2006-02-15 21:30:53'),(2633,'2005-06-19 08:53:10',3462,68,'2005-06-20 07:56:10',1,'2006-02-15 21:30:53'),(2634,'2005-06-19 08:55:17',3687,318,'2005-06-20 11:44:17',2,'2006-02-15 21:30:53'),(2635,'2005-06-19 09:08:45',3332,105,'2005-06-26 09:20:45',1,'2006-02-15 21:30:53'),(2636,'2005-06-19 09:13:06',2102,253,'2005-06-25 07:47:06',2,'2006-02-15 21:30:53'),(2637,'2005-06-19 09:20:56',2736,327,'2005-06-27 10:09:56',2,'2006-02-15 21:30:53'),(2638,'2005-06-19 09:23:30',2944,295,'2005-06-26 14:56:30',1,'2006-02-15 21:30:53'),(2639,'2005-06-19 09:24:02',3971,116,'2005-06-21 14:16:02',2,'2006-02-15 21:30:53'),(2640,'2005-06-19 09:26:13',721,540,'2005-06-20 14:38:13',1,'2006-02-15 21:30:53'),(2641,'2005-06-19 09:38:33',231,374,'2005-06-22 09:55:33',1,'2006-02-15 21:30:53'),(2642,'2005-06-19 09:39:01',2065,4,'2005-06-25 08:33:01',1,'2006-02-15 21:30:53'),(2643,'2005-06-19 09:39:27',1928,318,'2005-06-26 10:27:27',2,'2006-02-15 21:30:53'),(2644,'2005-06-19 09:42:30',1923,309,'2005-06-27 07:23:30',2,'2006-02-15 21:30:53'),(2645,'2005-06-19 09:50:35',2284,181,'2005-06-28 06:47:35',2,'2006-02-15 21:30:53'),(2646,'2005-06-19 09:56:01',3511,275,'2005-06-21 04:15:01',2,'2006-02-15 21:30:53'),(2647,'2005-06-19 09:57:56',1954,54,'2005-06-22 15:55:56',1,'2006-02-15 21:30:53'),(2648,'2005-06-19 10:06:20',1620,31,'2005-06-21 04:30:20',2,'2006-02-15 21:30:53'),(2649,'2005-06-19 10:20:09',98,153,'2005-06-21 10:05:09',1,'2006-02-15 21:30:53'),(2650,'2005-06-19 10:21:45',4211,209,'2005-06-21 08:01:45',1,'2006-02-15 21:30:53'),(2651,'2005-06-19 10:22:56',2181,576,'2005-06-27 13:37:56',1,'2006-02-15 21:30:53'),(2652,'2005-06-19 10:35:26',3108,589,'2005-06-28 08:03:26',1,'2006-02-15 21:30:53'),(2653,'2005-06-19 10:36:53',3528,340,'2005-06-26 15:15:53',1,'2006-02-15 21:30:53'),(2654,'2005-06-19 10:37:54',3697,405,'2005-06-27 11:44:54',2,'2006-02-15 21:30:53'),(2655,'2005-06-19 10:38:42',1649,29,'2005-06-23 14:20:42',1,'2006-02-15 21:30:53'),(2656,'2005-06-19 10:42:33',559,280,'2005-06-24 08:31:33',2,'2006-02-15 21:30:53'),(2657,'2005-06-19 10:42:59',3595,19,'2005-06-28 12:37:59',1,'2006-02-15 21:30:53'),(2658,'2005-06-19 10:43:42',3281,156,'2005-06-24 16:23:42',1,'2006-02-15 21:30:53'),(2659,'2005-06-19 10:47:42',66,139,'2005-06-23 14:03:42',1,'2006-02-15 21:30:53'),(2660,'2005-06-19 10:50:02',4341,221,'2005-06-28 12:49:02',1,'2006-02-15 21:30:53'),(2661,'2005-06-19 10:50:52',3652,452,'2005-06-25 08:44:52',2,'2006-02-15 21:30:53'),(2662,'2005-06-19 10:53:42',3936,68,'2005-06-20 11:41:42',1,'2006-02-15 21:30:53'),(2663,'2005-06-19 10:54:00',1012,583,'2005-06-20 16:48:00',1,'2006-02-15 21:30:53'),(2664,'2005-06-19 11:11:23',3496,299,'2005-06-28 08:30:23',2,'2006-02-15 21:30:53'),(2665,'2005-06-19 11:12:35',4531,133,'2005-06-26 11:55:35',2,'2006-02-15 21:30:53'),(2666,'2005-06-19 11:17:12',1872,454,'2005-06-28 12:47:12',1,'2006-02-15 21:30:53'),(2667,'2005-06-19 11:28:46',1028,200,'2005-06-27 11:48:46',2,'2006-02-15 21:30:53'),(2668,'2005-06-19 11:28:47',3127,568,'2005-06-24 10:12:47',2,'2006-02-15 21:30:53'),(2669,'2005-06-19 11:28:52',2734,523,'2005-06-20 16:43:52',1,'2006-02-15 21:30:53'),(2670,'2005-06-19 11:30:16',3518,457,'2005-06-21 17:25:16',2,'2006-02-15 21:30:53'),(2671,'2005-06-19 11:33:11',2164,451,'2005-06-26 14:30:11',2,'2006-02-15 21:30:53'),(2672,'2005-06-19 11:42:04',1164,420,'2005-06-25 09:14:04',2,'2006-02-15 21:30:53'),(2673,'2005-06-19 11:42:20',2487,29,'2005-06-23 07:16:20',1,'2006-02-15 21:30:53'),(2674,'2005-06-19 11:47:59',3744,585,'2005-06-20 08:09:59',1,'2006-02-15 21:30:53'),(2675,'2005-06-19 11:52:15',3078,230,'2005-06-23 16:45:15',1,'2006-02-15 21:30:53'),(2676,'2005-06-19 11:54:57',3938,477,'2005-06-24 15:34:57',2,'2006-02-15 21:30:53'),(2677,'2005-06-19 12:01:59',4384,428,'2005-06-21 06:15:59',2,'2006-02-15 21:30:53'),(2678,'2005-06-19 12:12:23',4230,258,'2005-06-21 16:28:23',2,'2006-02-15 21:30:53'),(2679,'2005-06-19 12:12:30',1994,109,'2005-06-27 08:27:30',1,'2006-02-15 21:30:53'),(2680,'2005-06-19 12:13:37',865,114,'2005-06-27 15:15:37',1,'2006-02-15 21:30:53'),(2681,'2005-06-19 12:15:27',2704,196,'2005-06-21 16:48:27',2,'2006-02-15 21:30:53'),(2682,'2005-06-19 12:18:17',3609,538,'2005-06-28 14:09:17',1,'2006-02-15 21:30:53'),(2683,'2005-06-19 12:27:19',2860,241,'2005-06-21 16:26:19',2,'2006-02-15 21:30:53'),(2684,'2005-06-19 12:29:08',1225,17,'2005-06-28 08:50:08',2,'2006-02-15 21:30:53'),(2685,'2005-06-19 12:35:21',1170,283,'2005-06-22 16:58:21',1,'2006-02-15 21:30:53'),(2686,'2005-06-19 12:44:20',2686,68,'2005-06-20 16:00:20',1,'2006-02-15 21:30:53'),(2687,'2005-06-19 12:46:52',3152,254,'2005-06-23 06:58:52',2,'2006-02-15 21:30:53'),(2688,'2005-06-19 12:50:56',4281,309,'2005-06-28 17:58:56',2,'2006-02-15 21:30:53'),(2689,'2005-06-19 12:58:53',2478,567,'2005-06-24 17:35:53',1,'2006-02-15 21:30:53'),(2690,'2005-06-19 13:00:02',1381,391,'2005-06-27 14:29:02',1,'2006-02-15 21:30:53'),(2691,'2005-06-19 13:06:50',3469,242,'2005-06-26 15:56:50',1,'2006-02-15 21:30:53'),(2692,'2005-06-19 13:08:19',3162,388,'2005-06-21 16:45:19',1,'2006-02-15 21:30:53'),(2693,'2005-06-19 13:11:47',2570,107,'2005-06-27 11:17:47',1,'2006-02-15 21:30:53'),(2694,'2005-06-19 13:17:21',380,368,'2005-06-24 15:09:21',1,'2006-02-15 21:30:53'),(2695,'2005-06-19 13:25:53',190,208,'2005-06-24 17:12:53',2,'2006-02-15 21:30:53'),(2696,'2005-06-19 13:28:42',2110,597,'2005-06-28 14:06:42',2,'2006-02-15 21:30:53'),(2697,'2005-06-19 13:29:08',2271,448,'2005-06-23 13:21:08',1,'2006-02-15 21:30:53'),(2698,'2005-06-19 13:29:11',3900,420,'2005-06-20 07:31:11',2,'2006-02-15 21:30:53'),(2699,'2005-06-19 13:29:28',72,267,'2005-06-24 11:15:28',2,'2006-02-15 21:30:53'),(2700,'2005-06-19 13:31:52',928,180,'2005-06-27 19:30:52',1,'2006-02-15 21:30:53'),(2701,'2005-06-19 13:33:06',1623,29,'2005-06-28 15:11:06',2,'2006-02-15 21:30:53'),(2702,'2005-06-19 13:35:56',1736,329,'2005-06-20 14:07:56',2,'2006-02-15 21:30:53'),(2703,'2005-06-19 13:36:06',4080,319,'2005-06-28 08:26:06',2,'2006-02-15 21:30:53'),(2704,'2005-06-19 13:50:10',2026,246,'2005-06-26 18:25:10',2,'2006-02-15 21:30:53'),(2705,'2005-06-19 13:54:30',1191,562,'2005-06-20 12:31:30',1,'2006-02-15 21:30:53'),(2706,'2005-06-19 13:56:51',373,559,'2005-06-21 17:23:51',2,'2006-02-15 21:30:53'),(2707,'2005-06-19 13:57:08',4486,589,'2005-06-27 11:09:08',2,'2006-02-15 21:30:53'),(2708,'2005-06-19 13:59:05',2659,541,'2005-06-24 10:02:05',2,'2006-02-15 21:30:53'),(2709,'2005-06-19 14:00:26',2877,7,'2005-06-23 14:56:26',2,'2006-02-15 21:30:53'),(2710,'2005-06-19 14:03:56',2965,446,'2005-06-21 16:15:56',1,'2006-02-15 21:30:53'),(2711,'2005-06-19 14:12:22',3944,313,'2005-06-21 09:29:22',1,'2006-02-15 21:30:53'),(2712,'2005-06-19 14:20:13',3132,411,'2005-06-22 19:08:13',1,'2006-02-15 21:30:53'),(2713,'2005-06-19 14:23:09',3979,378,'2005-06-20 17:55:09',1,'2006-02-15 21:30:53'),(2714,'2005-06-19 14:26:09',2853,81,'2005-06-23 17:24:09',2,'2006-02-15 21:30:53'),(2715,'2005-06-19 14:29:35',2082,404,'2005-06-26 08:44:35',2,'2006-02-15 21:30:53'),(2716,'2005-06-19 14:40:17',944,252,'2005-06-27 17:45:17',2,'2006-02-15 21:30:53'),(2717,'2005-06-19 14:46:10',140,200,'2005-06-22 20:17:10',1,'2006-02-15 21:30:53'),(2718,'2005-06-19 14:49:42',4443,139,'2005-06-26 19:37:42',1,'2006-02-15 21:30:53'),(2719,'2005-06-19 14:50:19',1200,336,'2005-06-20 14:33:19',2,'2006-02-15 21:30:53'),(2720,'2005-06-19 14:51:55',3597,504,'2005-06-27 13:06:55',1,'2006-02-15 21:30:53'),(2721,'2005-06-19 14:53:24',3786,358,'2005-06-21 18:22:24',2,'2006-02-15 21:30:53'),(2722,'2005-06-19 14:55:17',952,45,'2005-06-25 13:11:17',2,'2006-02-15 21:30:53'),(2723,'2005-06-19 14:55:23',4317,277,'2005-06-20 14:28:23',1,'2006-02-15 21:30:53'),(2724,'2005-06-19 14:57:54',3879,103,'2005-06-22 16:31:54',2,'2006-02-15 21:30:53'),(2725,'2005-06-19 15:01:23',63,246,'2005-06-22 09:08:23',1,'2006-02-15 21:30:53'),(2726,'2005-06-19 15:02:20',2970,420,'2005-06-21 15:38:20',1,'2006-02-15 21:30:53'),(2727,'2005-06-19 15:02:39',3261,129,'2005-06-28 17:49:39',1,'2006-02-15 21:30:53'),(2728,'2005-06-19 15:04:04',775,408,'2005-06-22 12:22:04',2,'2006-02-15 21:30:53'),(2729,'2005-06-19 15:06:15',4449,510,'2005-06-27 17:58:15',2,'2006-02-15 21:30:53'),(2730,'2005-06-19 15:10:09',1264,30,'2005-06-28 13:05:09',1,'2006-02-15 21:30:53'),(2731,'2005-06-19 15:14:55',4218,138,'2005-06-27 14:30:55',2,'2006-02-15 21:30:53'),(2732,'2005-06-19 15:19:39',610,386,'2005-06-25 19:39:39',2,'2006-02-15 21:30:53'),(2733,'2005-06-19 15:21:53',1535,188,'2005-06-23 11:58:53',2,'2006-02-15 21:30:53'),(2734,'2005-06-19 15:36:27',794,204,'2005-06-20 13:44:27',2,'2006-02-15 21:30:53'),(2735,'2005-06-19 15:42:07',4550,29,'2005-06-22 17:28:07',1,'2006-02-15 21:30:53'),(2736,'2005-06-19 15:43:20',4510,359,'2005-06-21 13:03:20',1,'2006-02-15 21:30:53'),(2737,'2005-06-19 15:48:33',3131,513,'2005-06-26 18:44:33',2,'2006-02-15 21:30:53'),(2738,'2005-06-19 15:56:30',350,75,'2005-06-20 16:14:30',2,'2006-02-15 21:30:53'),(2739,'2005-06-19 15:58:38',213,212,'2005-06-27 15:01:38',2,'2006-02-15 21:30:53'),(2740,'2005-06-19 15:59:04',1534,92,'2005-06-28 12:18:04',2,'2006-02-15 21:30:53'),(2741,'2005-06-19 16:05:41',1662,36,'2005-06-20 20:48:41',1,'2006-02-15 21:30:53'),(2742,'2005-06-19 16:05:47',4154,187,'2005-06-26 21:34:47',1,'2006-02-15 21:30:53'),(2743,'2005-06-19 16:15:56',2611,35,'2005-06-23 12:30:56',1,'2006-02-15 21:30:53'),(2744,'2005-06-19 16:20:40',4511,368,'2005-06-22 11:44:40',2,'2006-02-15 21:30:53'),(2745,'2005-06-19 16:21:19',1253,26,'2005-06-21 22:07:19',2,'2006-02-15 21:30:53'),(2746,'2005-06-19 16:21:40',933,562,'2005-06-28 11:56:40',2,'2006-02-15 21:30:53'),(2747,'2005-06-19 16:22:07',1374,422,'2005-06-24 19:28:07',1,'2006-02-15 21:30:53'),(2748,'2005-06-19 16:22:26',511,473,'2005-06-21 21:55:26',1,'2006-02-15 21:30:53'),(2749,'2005-06-19 16:27:35',1540,358,'2005-06-25 21:06:35',2,'2006-02-15 21:30:53'),(2750,'2005-06-19 16:37:24',3775,197,'2005-06-20 13:55:24',2,'2006-02-15 21:30:53'),(2751,'2005-06-19 16:39:23',1291,148,'2005-06-25 13:57:23',1,'2006-02-15 21:30:53'),(2752,'2005-06-19 16:44:18',386,149,'2005-06-22 12:40:18',2,'2006-02-15 21:30:53'),(2753,'2005-06-19 16:44:35',2408,23,'2005-06-24 13:45:35',1,'2006-02-15 21:30:53'),(2754,'2005-06-19 16:55:59',1761,267,'2005-06-26 18:11:59',1,'2006-02-15 21:30:53'),(2755,'2005-06-19 16:56:31',946,506,'2005-06-27 12:02:31',2,'2006-02-15 21:30:53'),(2756,'2005-06-19 16:57:42',3264,144,'2005-06-26 15:30:42',2,'2006-02-15 21:30:53'),(2757,'2005-06-19 17:01:14',3814,243,'2005-06-28 11:38:14',1,'2006-02-15 21:30:53'),(2758,'2005-06-19 17:04:35',3558,423,'2005-06-26 14:45:35',2,'2006-02-15 21:30:53'),(2759,'2005-06-19 17:10:24',687,351,'2005-06-24 21:56:24',2,'2006-02-15 21:30:53'),(2760,'2005-06-19 17:16:33',2602,192,'2005-06-26 14:58:33',1,'2006-02-15 21:30:53'),(2761,'2005-06-19 17:22:17',2134,431,'2005-06-20 20:20:17',2,'2006-02-15 21:30:53'),(2762,'2005-06-19 17:22:31',3431,457,'2005-06-25 22:43:31',2,'2006-02-15 21:30:53'),(2763,'2005-06-19 17:23:34',3096,276,'2005-06-21 21:37:34',2,'2006-02-15 21:30:53'),(2764,'2005-06-19 17:27:25',1718,479,'2005-06-28 17:18:25',2,'2006-02-15 21:30:53'),(2765,'2005-06-19 17:34:39',1017,478,'2005-06-27 23:26:39',1,'2006-02-15 21:30:53'),(2766,'2005-06-19 17:45:15',3421,345,'2005-06-23 20:11:15',2,'2006-02-15 21:30:53'),(2767,'2005-06-19 17:46:35',4052,596,'2005-06-24 22:42:35',1,'2006-02-15 21:30:53'),(2768,'2005-06-19 17:46:52',3018,129,'2005-06-25 21:49:52',1,'2006-02-15 21:30:53'),(2769,'2005-06-19 17:52:14',1222,354,'2005-06-26 20:30:14',2,'2006-02-15 21:30:53'),(2770,'2005-06-19 17:54:22',3042,533,'2005-06-26 23:09:22',2,'2006-02-15 21:30:53'),(2771,'2005-06-19 17:54:48',40,262,'2005-06-27 17:14:48',1,'2006-02-15 21:30:53'),(2772,'2005-06-19 17:59:27',1221,520,'2005-06-23 17:52:27',1,'2006-02-15 21:30:53'),(2773,'2005-06-19 18:04:18',4155,505,'2005-06-28 23:52:18',1,'2006-02-15 21:30:53'),(2774,'2005-06-19 18:05:11',2809,299,'2005-06-21 16:21:11',2,'2006-02-15 21:30:53'),(2775,'2005-06-19 18:14:20',672,590,'2005-06-26 19:52:20',1,'2006-02-15 21:30:53'),(2776,'2005-06-19 18:16:24',1726,551,'2005-06-26 14:43:24',2,'2006-02-15 21:30:53'),(2777,'2005-06-19 18:16:26',4092,230,'2005-06-20 13:43:26',2,'2006-02-15 21:30:53'),(2778,'2005-06-19 18:18:12',3357,422,'2005-06-28 21:43:12',1,'2006-02-15 21:30:53'),(2779,'2005-06-19 18:19:07',1020,376,'2005-06-23 18:25:07',2,'2006-02-15 21:30:53'),(2780,'2005-06-19 18:19:33',1513,360,'2005-06-28 22:29:33',1,'2006-02-15 21:30:53'),(2781,'2005-06-19 18:24:42',1230,197,'2005-06-27 17:02:42',2,'2006-02-15 21:30:53'),(2782,'2005-06-19 18:25:07',3644,156,'2005-06-22 14:10:07',1,'2006-02-15 21:30:53'),(2783,'2005-06-19 18:29:10',2778,113,'2005-06-21 22:09:10',1,'2006-02-15 21:30:53'),(2784,'2005-06-19 18:40:29',2305,289,'2005-06-28 15:27:29',1,'2006-02-15 21:30:53'),(2785,'2005-06-19 18:43:57',826,137,'2005-06-24 15:36:57',2,'2006-02-15 21:30:53'),(2786,'2005-06-19 18:46:43',2255,594,'2005-06-22 16:52:43',1,'2006-02-15 21:30:53'),(2787,'2005-06-19 18:47:00',3371,307,'2005-06-22 20:22:00',2,'2006-02-15 21:30:53'),(2788,'2005-06-19 18:48:11',1457,171,'2005-06-21 13:32:11',1,'2006-02-15 21:30:53'),(2789,'2005-06-19 18:48:21',2398,514,'2005-06-21 21:50:21',1,'2006-02-15 21:30:53'),(2790,'2005-06-19 18:49:45',202,97,'2005-06-21 00:13:45',1,'2006-02-15 21:30:53'),(2791,'2005-06-19 18:51:27',2174,299,'2005-06-22 19:35:27',2,'2006-02-15 21:30:53'),(2792,'2005-06-19 18:52:25',3057,437,'2005-06-23 17:39:25',1,'2006-02-15 21:30:53'),(2793,'2005-06-19 18:52:37',732,419,'2005-06-25 19:45:37',2,'2006-02-15 21:30:53'),(2794,'2005-06-19 18:53:05',1957,85,'2005-06-22 13:15:05',1,'2006-02-15 21:30:53'),(2795,'2005-06-19 18:58:53',3694,129,'2005-06-28 18:56:53',1,'2006-02-15 21:30:53'),(2796,'2005-06-19 19:00:37',2337,209,'2005-06-25 17:18:37',2,'2006-02-15 21:30:53'),(2797,'2005-06-19 19:04:32',3222,486,'2005-06-20 22:43:32',1,'2006-02-15 21:30:53'),(2798,'2005-06-19 19:07:48',1343,180,'2005-06-23 00:09:48',2,'2006-02-15 21:30:53'),(2799,'2005-06-19 19:15:21',4579,576,'2005-06-21 21:35:21',1,'2006-02-15 21:30:53'),(2800,'2005-06-19 19:15:56',183,146,'2005-06-23 00:15:56',1,'2006-02-15 21:30:53'),(2801,'2005-06-19 19:18:09',4572,29,'2005-06-20 20:11:09',2,'2006-02-15 21:30:53'),(2802,'2005-06-19 19:18:17',4067,489,'2005-06-21 17:58:17',2,'2006-02-15 21:30:53'),(2803,'2005-06-19 19:18:27',103,120,'2005-06-27 21:48:27',1,'2006-02-15 21:30:53'),(2804,'2005-06-19 19:24:54',88,426,'2005-06-25 01:19:54',2,'2006-02-15 21:30:53'),(2805,'2005-06-19 19:29:17',2153,80,'2005-06-27 23:14:17',2,'2006-02-15 21:30:53'),(2806,'2005-06-19 19:30:48',2114,510,'2005-06-20 19:42:48',2,'2006-02-15 21:30:53'),(2807,'2005-06-19 19:32:53',2825,194,'2005-06-25 00:30:53',2,'2006-02-15 21:30:53'),(2808,'2005-06-19 19:34:45',65,325,'2005-06-27 14:49:45',1,'2006-02-15 21:30:53'),(2809,'2005-06-19 19:40:27',1786,44,'2005-06-27 15:28:27',2,'2006-02-15 21:30:53'),(2810,'2005-06-19 19:44:12',2558,67,'2005-06-20 19:41:12',2,'2006-02-15 21:30:53'),(2811,'2005-06-19 19:53:30',3890,457,'2005-06-22 23:21:30',2,'2006-02-15 21:30:53'),(2812,'2005-06-19 19:58:16',3016,211,'2005-06-26 15:26:16',1,'2006-02-15 21:30:53'),(2813,'2005-06-19 20:01:47',3420,284,'2005-06-27 01:51:47',1,'2006-02-15 21:30:53'),(2814,'2005-06-19 20:01:59',1783,10,'2005-06-26 01:28:59',2,'2006-02-15 21:30:53'),(2815,'2005-06-19 20:03:29',3046,27,'2005-06-25 22:50:29',2,'2006-02-15 21:30:53'),(2816,'2005-06-19 20:04:23',2180,94,'2005-06-20 21:09:23',2,'2006-02-15 21:30:53'),(2817,'2005-06-19 20:05:22',3476,510,'2005-06-24 23:29:22',1,'2006-02-15 21:30:53'),(2818,'2005-06-19 20:05:52',2376,497,'2005-06-22 01:01:52',2,'2006-02-15 21:30:53'),(2819,'2005-06-19 20:13:33',4100,82,'2005-06-26 16:44:33',1,'2006-02-15 21:30:53'),(2820,'2005-06-19 20:20:33',851,316,'2005-06-26 20:32:33',1,'2006-02-15 21:30:53'),(2821,'2005-06-19 20:26:52',2551,532,'2005-06-27 23:48:52',1,'2006-02-15 21:30:53'),(2822,'2005-06-19 20:29:24',3599,48,'2005-06-23 02:21:24',1,'2006-02-15 21:30:53'),(2823,'2005-06-19 20:30:21',3566,260,'2005-06-26 17:58:21',1,'2006-02-15 21:30:53'),(2824,'2005-06-19 20:31:45',2878,506,'2005-06-29 00:40:45',2,'2006-02-15 21:30:53'),(2825,'2005-06-19 20:32:19',2601,418,'2005-06-22 22:32:19',1,'2006-02-15 21:30:53'),(2826,'2005-06-19 20:41:35',2980,125,'2005-06-25 17:23:35',1,'2006-02-15 21:30:53'),(2827,'2005-06-19 20:50:01',2745,23,'2005-06-20 18:54:01',2,'2006-02-15 21:30:53'),(2828,'2005-06-19 20:51:33',3230,526,'2005-06-25 17:38:33',1,'2006-02-15 21:30:53'),(2829,'2005-06-19 21:11:30',2047,341,'2005-06-24 18:10:30',1,'2006-02-15 21:30:53'),(2830,'2005-06-19 21:14:33',2080,21,'2005-06-21 17:46:33',1,'2006-02-15 21:30:53'),(2831,'2005-06-19 21:17:06',4089,468,'2005-06-22 16:56:06',2,'2006-02-15 21:30:53'),(2832,'2005-06-19 21:21:53',828,593,'2005-06-28 23:00:53',1,'2006-02-15 21:30:53'),(2833,'2005-06-19 21:34:54',1976,232,'2005-06-28 16:21:54',1,'2006-02-15 21:30:53'),(2834,'2005-06-19 21:41:46',2876,122,'2005-06-24 20:47:46',1,'2006-02-15 21:30:53'),(2835,'2005-06-19 21:44:11',4411,89,'2005-06-26 16:46:11',2,'2006-02-15 21:30:53'),(2836,'2005-06-19 21:58:21',1453,306,'2005-06-27 00:41:21',2,'2006-02-15 21:30:53'),(2837,'2005-06-19 22:03:50',417,371,'2005-06-20 21:24:50',1,'2006-02-15 21:30:53'),(2838,'2005-06-19 22:06:06',143,292,'2005-06-25 22:30:06',1,'2006-02-15 21:30:53'),(2839,'2005-06-19 22:07:24',3856,256,'2005-06-23 16:37:24',2,'2006-02-15 21:30:53'),(2840,'2005-06-19 22:17:44',1102,236,'2005-06-26 00:36:44',2,'2006-02-15 21:30:53'),(2841,'2005-06-19 22:21:06',614,193,'2005-06-28 00:56:06',1,'2006-02-15 21:30:53'),(2842,'2005-06-19 22:34:20',4183,217,'2005-06-22 03:46:20',2,'2006-02-15 21:30:53'),(2843,'2005-06-19 22:36:39',1520,148,'2005-06-26 22:33:39',2,'2006-02-15 21:30:53'),(2844,'2005-06-19 22:40:12',4452,178,'2005-06-24 03:58:12',2,'2006-02-15 21:30:53'),(2845,'2005-06-19 22:46:37',3948,583,'2005-06-23 03:31:37',1,'2006-02-15 21:30:53'),(2846,'2005-06-19 22:52:14',651,193,'2005-06-22 17:12:14',1,'2006-02-15 21:30:53'),(2847,'2005-06-19 22:54:01',1247,148,'2005-06-27 23:05:01',2,'2006-02-15 21:30:53'),(2848,'2005-06-19 22:55:37',3449,19,'2005-06-25 23:10:37',1,'2006-02-15 21:30:53'),(2849,'2005-06-19 23:06:00',3628,283,'2005-06-25 18:36:00',1,'2006-02-15 21:30:53'),(2850,'2005-06-19 23:06:28',206,262,'2005-06-28 03:30:28',2,'2006-02-15 21:30:53'),(2851,'2005-06-19 23:07:03',2168,361,'2005-06-22 17:26:03',1,'2006-02-15 21:30:53'),(2852,'2005-06-19 23:08:50',2695,453,'2005-06-26 04:00:50',1,'2006-02-15 21:30:53'),(2853,'2005-06-19 23:09:41',2578,453,'2005-06-28 00:51:41',2,'2006-02-15 21:30:53'),(2854,'2005-06-19 23:11:48',4453,81,'2005-06-23 19:37:48',2,'2006-02-15 21:30:53'),(2855,'2005-06-19 23:11:49',3495,483,'2005-06-26 21:52:49',1,'2006-02-15 21:30:53'),(2856,'2005-06-19 23:13:04',1859,210,'2005-06-23 22:47:04',1,'2006-02-15 21:30:53'),(2857,'2005-06-19 23:15:15',2886,364,'2005-06-25 04:24:15',2,'2006-02-15 21:30:53'),(2858,'2005-06-19 23:17:11',2628,268,'2005-06-21 19:07:11',1,'2006-02-15 21:30:53'),(2859,'2005-06-19 23:18:42',126,147,'2005-06-20 22:38:42',1,'2006-02-15 21:30:53'),(2860,'2005-06-19 23:20:40',3045,107,'2005-06-21 04:59:40',1,'2006-02-15 21:30:53'),(2861,'2005-06-19 23:21:34',1489,116,'2005-06-26 17:32:34',1,'2006-02-15 21:30:53'),(2862,'2005-06-19 23:47:24',4260,52,'2005-06-23 03:39:24',2,'2006-02-15 21:30:53'),(2863,'2005-06-19 23:58:38',2410,228,'2005-06-23 23:27:38',2,'2006-02-15 21:30:53'),(2864,'2005-06-20 00:00:52',1056,493,'2005-06-26 04:21:52',2,'2006-02-15 21:30:53'),(2865,'2005-06-20 00:00:55',1569,10,'2005-06-21 02:20:55',1,'2006-02-15 21:30:53'),(2866,'2005-06-20 00:01:36',2718,44,'2005-06-20 21:39:36',1,'2006-02-15 21:30:53'),(2867,'2005-06-20 00:08:38',95,483,'2005-06-23 19:35:38',1,'2006-02-15 21:30:53'),(2868,'2005-06-20 00:08:58',1213,214,'2005-06-25 21:23:58',2,'2006-02-15 21:30:53'),(2869,'2005-06-20 00:09:25',1331,155,'2005-06-24 04:40:25',2,'2006-02-15 21:30:53'),(2870,'2005-06-20 00:17:46',214,467,'2005-06-28 20:21:46',1,'2006-02-15 21:30:53'),(2871,'2005-06-20 00:27:49',1731,443,'2005-06-29 01:36:49',1,'2006-02-15 21:30:53'),(2872,'2005-06-20 00:38:21',3779,240,'2005-06-26 19:56:21',1,'2006-02-15 21:30:53'),(2873,'2005-06-20 00:41:25',3321,160,'2005-06-25 02:06:25',1,'2006-02-15 21:30:53'),(2874,'2005-06-20 00:42:26',331,166,'2005-06-28 01:37:26',2,'2006-02-15 21:30:53'),(2875,'2005-06-20 00:47:18',3012,186,'2005-06-25 18:54:18',2,'2006-02-15 21:30:53'),(2876,'2005-06-20 01:06:34',3117,39,'2005-06-23 04:55:34',1,'2006-02-15 21:30:53'),(2877,'2005-06-20 01:07:16',485,267,'2005-06-24 01:05:16',1,'2006-02-15 21:30:53'),(2878,'2005-06-20 01:09:14',4120,88,'2005-06-21 21:40:14',2,'2006-02-15 21:30:53'),(2879,'2005-06-20 01:24:10',1920,583,'2005-06-28 20:12:10',2,'2006-02-15 21:30:53'),(2880,'2005-06-20 01:24:54',1700,193,'2005-06-23 02:42:54',2,'2006-02-15 21:30:53'),(2881,'2005-06-20 01:26:18',1391,307,'2005-06-26 23:42:18',1,'2006-02-15 21:30:53'),(2882,'2005-06-20 01:26:26',205,152,'2005-06-21 19:33:26',1,'2006-02-15 21:30:53'),(2883,'2005-06-20 01:29:10',585,320,'2005-06-28 06:12:10',1,'2006-02-15 21:30:53'),(2884,'2005-06-20 01:31:16',3384,319,'2005-06-21 04:03:16',2,'2006-02-15 21:30:53'),(2885,'2005-06-20 01:33:42',2701,330,'2005-06-22 22:23:42',1,'2006-02-15 21:30:53'),(2886,'2005-06-20 01:38:39',1755,154,'2005-06-23 04:28:39',2,'2006-02-15 21:30:53'),(2887,'2005-06-20 01:39:43',1073,453,'2005-06-25 05:22:43',2,'2006-02-15 21:30:53'),(2888,'2005-06-20 01:50:56',468,7,'2005-06-22 05:05:56',2,'2006-02-15 21:30:53'),(2889,'2005-06-20 01:54:08',151,213,'2005-06-23 06:33:08',1,'2006-02-15 21:30:53'),(2890,'2005-06-20 02:00:45',3437,392,'2005-06-27 21:12:45',1,'2006-02-15 21:30:53'),(2891,'2005-06-20 02:02:05',343,32,'2005-06-25 02:45:05',1,'2006-02-15 21:30:53'),(2892,'2005-06-20 02:06:39',2993,430,'2005-06-21 02:50:39',2,'2006-02-15 21:30:53'),(2893,'2005-06-20 02:22:08',397,153,'2005-06-26 21:01:08',2,'2006-02-15 21:30:53'),(2894,'2005-06-20 02:22:42',4316,76,'2005-06-22 00:38:42',1,'2006-02-15 21:30:53'),(2895,'2005-06-20 02:26:31',4445,141,'2005-06-27 23:42:31',2,'2006-02-15 21:30:53'),(2896,'2005-06-20 02:33:42',1086,40,'2005-06-26 05:29:42',2,'2006-02-15 21:30:53'),(2897,'2005-06-20 02:34:23',3464,107,'2005-06-25 05:29:23',1,'2006-02-15 21:30:53'),(2898,'2005-06-20 02:38:06',3106,178,'2005-06-29 08:18:06',2,'2006-02-15 21:30:53'),(2899,'2005-06-20 02:39:21',1919,459,'2005-06-23 06:47:21',1,'2006-02-15 21:30:53'),(2900,'2005-06-20 02:40:04',3407,294,'2005-06-27 20:47:04',2,'2006-02-15 21:30:53'),(2901,'2005-06-20 02:41:28',667,25,'2005-06-23 04:43:28',2,'2006-02-15 21:30:53'),(2902,'2005-06-20 02:45:35',2787,304,'2005-06-26 07:51:35',1,'2006-02-15 21:30:53'),(2903,'2005-06-20 02:49:01',3580,53,'2005-06-25 05:03:01',2,'2006-02-15 21:30:53'),(2904,'2005-06-20 02:54:06',2195,55,'2005-06-21 06:57:06',2,'2006-02-15 21:30:53'),(2905,'2005-06-20 02:56:16',3898,189,'2005-06-24 23:51:16',2,'2006-02-15 21:30:53'),(2906,'2005-06-20 03:04:56',1087,58,'2005-06-23 05:57:56',2,'2006-02-15 21:30:53'),(2907,'2005-06-20 03:15:09',2516,208,'2005-06-20 21:56:09',2,'2006-02-15 21:30:53'),(2908,'2005-06-20 03:16:52',517,91,'2005-06-22 08:46:52',1,'2006-02-15 21:30:53'),(2909,'2005-06-20 03:19:10',1701,451,'2005-06-25 06:06:10',2,'2006-02-15 21:30:53'),(2910,'2005-06-20 03:31:18',630,57,'2005-06-28 00:35:18',1,'2006-02-15 21:30:53'),(2911,'2005-06-20 03:32:37',3645,502,'2005-06-22 22:06:37',1,'2006-02-15 21:30:53'),(2912,'2005-06-20 03:32:45',1076,196,'2005-06-21 23:32:45',1,'2006-02-15 21:30:53'),(2913,'2005-06-20 03:42:27',3456,402,'2005-06-23 04:47:27',1,'2006-02-15 21:30:53'),(2914,'2005-06-20 03:43:18',2419,342,'2005-06-25 03:44:18',2,'2006-02-15 21:30:53'),(2915,'2005-06-20 03:57:17',1293,262,'2005-06-24 05:59:17',2,'2006-02-15 21:30:53'),(2916,'2005-06-20 04:01:04',3086,590,'2005-06-27 22:40:04',2,'2006-02-15 21:30:53'),(2917,'2005-06-20 04:08:35',647,451,'2005-06-24 01:17:35',1,'2006-02-15 21:30:53'),(2918,'2005-06-20 04:09:04',1985,215,'2005-06-21 10:07:04',1,'2006-02-15 21:30:53'),(2919,'2005-06-20 04:10:16',2835,509,'2005-06-27 06:34:16',1,'2006-02-15 21:30:53'),(2920,'2005-06-20 04:12:46',487,588,'2005-06-26 23:34:46',2,'2006-02-15 21:30:53'),(2921,'2005-06-20 04:13:04',1785,59,'2005-06-28 01:28:04',1,'2006-02-15 21:30:53'),(2922,'2005-06-20 04:13:47',1671,176,'2005-06-22 04:38:47',2,'2006-02-15 21:30:53'),(2923,'2005-06-20 04:16:07',109,29,'2005-06-21 05:04:07',1,'2006-02-15 21:30:53'),(2924,'2005-06-20 04:20:14',580,132,'2005-06-21 01:13:14',1,'2006-02-15 21:30:53'),(2925,'2005-06-20 04:23:49',804,301,'2005-06-22 04:37:49',2,'2006-02-15 21:30:53'),(2926,'2005-06-20 04:37:45',1055,379,'2005-06-26 02:17:45',1,'2006-02-15 21:30:53'),(2927,'2005-06-20 04:41:41',393,403,'2005-06-23 01:59:41',1,'2006-02-15 21:30:53'),(2928,'2005-06-20 04:43:45',1265,104,'2005-06-21 06:58:45',2,'2006-02-15 21:30:53'),(2929,'2005-06-20 04:47:39',3389,333,'2005-06-25 23:16:39',2,'2006-02-15 21:30:53'),(2930,'2005-06-20 04:50:29',3615,585,'2005-06-28 06:00:29',2,'2006-02-15 21:30:53'),(2931,'2005-06-20 04:50:45',3122,258,'2005-06-29 09:18:45',1,'2006-02-15 21:30:53'),(2932,'2005-06-20 04:51:19',4418,526,'2005-06-29 08:31:19',1,'2006-02-15 21:30:53'),(2933,'2005-06-20 04:52:23',4483,323,'2005-06-26 07:12:23',2,'2006-02-15 21:30:53'),(2934,'2005-06-20 05:05:53',697,228,'2005-06-22 02:44:53',1,'2006-02-15 21:30:53'),(2935,'2005-06-20 05:07:24',2735,384,'2005-06-28 09:17:24',2,'2006-02-15 21:30:53'),(2936,'2005-06-20 05:09:27',2675,330,'2005-06-26 10:16:27',2,'2006-02-15 21:30:53'),(2937,'2005-06-20 05:15:37',1998,15,'2005-06-27 02:45:37',1,'2006-02-15 21:30:53'),(2938,'2005-06-20 05:17:22',1795,504,'2005-06-26 09:38:22',1,'2006-02-15 21:30:53'),(2939,'2005-06-20 05:18:16',2638,203,'2005-06-26 06:56:16',1,'2006-02-15 21:30:53'),(2940,'2005-06-20 05:20:01',2504,73,'2005-06-28 06:11:01',2,'2006-02-15 21:30:53'),(2941,'2005-06-20 05:22:18',3632,135,'2005-06-26 07:40:18',2,'2006-02-15 21:30:53'),(2942,'2005-06-20 05:27:31',999,242,'2005-06-29 00:35:31',1,'2006-02-15 21:30:53'),(2943,'2005-06-20 05:43:05',2591,418,'2005-06-25 04:31:05',1,'2006-02-15 21:30:53'),(2944,'2005-06-20 05:43:42',1550,474,'2005-06-29 09:40:42',2,'2006-02-15 21:30:53'),(2945,'2005-06-20 05:49:27',4193,153,'2005-06-26 09:48:27',1,'2006-02-15 21:30:53'),(2946,'2005-06-20 05:50:40',3737,213,'2005-06-21 00:42:40',2,'2006-02-15 21:30:53'),(2947,'2005-06-20 06:00:21',4302,151,'2005-06-23 10:04:21',2,'2006-02-15 21:30:53'),(2948,'2005-06-20 06:02:35',4254,289,'2005-06-29 09:12:35',2,'2006-02-15 21:30:53'),(2949,'2005-06-20 06:05:53',375,78,'2005-06-29 03:19:53',2,'2006-02-15 21:30:53'),(2950,'2005-06-20 06:08:36',1438,561,'2005-06-27 07:45:36',2,'2006-02-15 21:30:53'),(2951,'2005-06-20 06:23:01',2903,404,'2005-06-24 00:26:01',2,'2006-02-15 21:30:53'),(2952,'2005-06-20 06:26:57',3759,13,'2005-06-22 11:51:57',1,'2006-02-15 21:30:53'),(2953,'2005-06-20 06:39:11',1829,540,'2005-06-26 06:19:11',1,'2006-02-15 21:30:53'),(2954,'2005-06-20 06:45:00',377,336,'2005-06-23 11:43:00',1,'2006-02-15 21:30:53'),(2955,'2005-06-20 06:46:35',2312,244,'2005-06-25 05:34:35',2,'2006-02-15 21:30:53'),(2956,'2005-06-20 06:47:23',2684,533,'2005-06-22 07:24:23',2,'2006-02-15 21:30:53'),(2957,'2005-06-20 06:53:47',4034,542,'2005-06-29 09:21:47',2,'2006-02-15 21:30:53'),(2958,'2005-06-20 06:56:20',1380,260,'2005-06-29 02:33:20',2,'2006-02-15 21:30:53'),(2959,'2005-06-20 07:07:54',4185,372,'2005-06-27 03:31:54',1,'2006-02-15 21:30:53'),(2960,'2005-06-20 07:10:09',3970,16,'2005-06-26 08:14:09',2,'2006-02-15 21:30:53'),(2961,'2005-06-20 07:29:15',4539,399,'2005-06-24 08:05:15',1,'2006-02-15 21:30:53'),(2962,'2005-06-20 07:31:55',2978,364,'2005-06-26 04:43:55',1,'2006-02-15 21:30:53'),(2963,'2005-06-20 07:33:09',1444,24,'2005-06-28 09:23:09',1,'2006-02-15 21:30:53'),(2964,'2005-06-20 07:33:29',1201,590,'2005-06-29 12:48:29',1,'2006-02-15 21:30:53'),(2965,'2005-06-20 07:33:38',27,46,'2005-06-29 11:45:38',1,'2006-02-15 21:30:53'),(2966,'2005-06-20 07:39:33',3483,511,'2005-06-29 07:48:33',1,'2006-02-15 21:30:53'),(2967,'2005-06-20 07:40:35',4243,311,'2005-06-29 05:50:35',2,'2006-02-15 21:30:53'),(2968,'2005-06-20 07:41:47',4415,252,'2005-06-23 04:27:47',1,'2006-02-15 21:30:53'),(2969,'2005-06-20 07:44:27',1748,418,'2005-06-22 06:12:27',2,'2006-02-15 21:30:53'),(2970,'2005-06-20 07:51:51',1167,449,'2005-06-28 10:14:51',2,'2006-02-15 21:30:53'),(2971,'2005-06-20 07:56:00',1585,410,'2005-06-27 11:38:00',2,'2006-02-15 21:30:53'),(2972,'2005-06-20 07:57:54',2232,531,'2005-06-21 12:48:54',1,'2006-02-15 21:30:53'),(2973,'2005-06-20 07:59:27',2626,96,'2005-06-24 12:31:27',1,'2006-02-15 21:30:53'),(2974,'2005-06-20 08:00:24',2322,472,'2005-06-25 05:10:24',2,'2006-02-15 21:30:53'),(2975,'2005-06-20 08:06:18',4534,46,'2005-06-21 08:01:18',1,'2006-02-15 21:30:53'),(2976,'2005-06-20 08:09:11',4210,55,'2005-06-21 10:45:11',1,'2006-02-15 21:30:53'),(2977,'2005-06-20 08:15:27',2645,571,'2005-06-29 04:30:27',2,'2006-02-15 21:30:53'),(2978,'2005-06-20 08:25:16',4364,548,'2005-06-23 05:42:16',1,'2006-02-15 21:30:53'),(2979,'2005-06-20 08:31:05',3961,589,'2005-06-27 12:25:05',1,'2006-02-15 21:30:53'),(2980,'2005-06-20 08:35:03',310,343,'2005-06-29 07:57:03',2,'2006-02-15 21:30:53'),(2981,'2005-06-20 08:35:17',522,387,'2005-06-28 09:14:17',1,'2006-02-15 21:30:53'),(2982,'2005-06-20 08:38:29',2574,130,'2005-06-28 13:21:29',1,'2006-02-15 21:30:53'),(2983,'2005-06-20 08:41:42',1349,322,'2005-06-29 04:02:42',2,'2006-02-15 21:30:53'),(2984,'2005-06-20 08:43:44',1819,435,'2005-06-22 03:08:44',2,'2006-02-15 21:30:53'),(2985,'2005-06-20 08:45:08',122,154,'2005-06-22 04:26:08',2,'2006-02-15 21:30:53'),(2986,'2005-06-20 08:50:28',478,556,'2005-06-26 05:24:28',2,'2006-02-15 21:30:53'),(2987,'2005-06-20 08:55:50',1531,349,'2005-06-28 13:02:50',2,'2006-02-15 21:30:53'),(2988,'2005-06-20 08:59:08',3160,557,'2005-06-28 04:31:08',2,'2006-02-15 21:30:53'),(2989,'2005-06-20 08:59:37',1586,56,'2005-06-22 03:27:37',2,'2006-02-15 21:30:53'),(2990,'2005-06-20 09:02:51',4559,18,'2005-06-29 13:19:51',2,'2006-02-15 21:30:53'),(2991,'2005-06-20 09:10:43',4308,472,'2005-06-23 13:04:43',1,'2006-02-15 21:30:53'),(2992,'2005-06-20 09:11:51',3347,439,'2005-06-24 05:59:51',1,'2006-02-15 21:30:53'),(2993,'2005-06-20 09:12:12',1527,40,'2005-06-22 13:36:12',2,'2006-02-15 21:30:53'),(2994,'2005-06-20 09:17:05',1290,163,'2005-06-29 04:41:05',1,'2006-02-15 21:30:53'),(2995,'2005-06-20 09:18:22',4544,573,'2005-06-26 14:31:22',1,'2006-02-15 21:30:53'),(2996,'2005-06-20 09:20:29',4064,500,'2005-06-27 09:18:29',1,'2006-02-15 21:30:53'),(2997,'2005-06-20 09:23:45',1449,519,'2005-06-29 08:15:45',1,'2006-02-15 21:30:53'),(2998,'2005-06-20 09:30:22',1288,380,'2005-06-24 06:31:22',2,'2006-02-15 21:30:53'),(2999,'2005-06-20 09:30:34',735,295,'2005-06-26 05:51:34',2,'2006-02-15 21:30:53'),(3000,'2005-06-20 09:32:33',549,50,'2005-06-22 07:45:33',1,'2006-02-15 21:30:53'),(3001,'2005-06-20 09:50:16',2941,393,'2005-06-28 05:13:16',2,'2006-02-15 21:30:53'),(3002,'2005-06-20 09:56:12',2749,266,'2005-06-24 12:15:12',2,'2006-02-15 21:30:53'),(3003,'2005-06-20 10:00:51',616,38,'2005-06-22 06:28:51',2,'2006-02-15 21:30:53'),(3004,'2005-06-20 10:04:36',2836,113,'2005-06-23 07:38:36',2,'2006-02-15 21:30:53'),(3005,'2005-06-20 10:10:29',286,598,'2005-06-28 15:48:29',2,'2006-02-15 21:30:53'),(3006,'2005-06-20 10:10:29',1677,133,'2005-06-22 07:26:29',2,'2006-02-15 21:30:53'),(3007,'2005-06-20 10:11:53',1950,7,'2005-06-25 04:51:53',2,'2006-02-15 21:30:53'),(3008,'2005-06-20 10:23:25',3383,202,'2005-06-26 11:00:25',2,'2006-02-15 21:30:53'),(3009,'2005-06-20 10:24:44',2721,280,'2005-06-23 13:39:44',1,'2006-02-15 21:30:53'),(3010,'2005-06-20 10:29:59',1298,567,'2005-06-27 06:52:59',1,'2006-02-15 21:30:53'),(3011,'2005-06-20 10:39:10',4376,147,'2005-06-28 07:02:10',2,'2006-02-15 21:30:53'),(3012,'2005-06-20 10:43:13',1392,206,'2005-06-28 10:07:13',2,'2006-02-15 21:30:53'),(3013,'2005-06-20 10:45:09',4146,290,'2005-06-26 04:55:09',1,'2006-02-15 21:30:53'),(3014,'2005-06-20 10:45:20',2179,434,'2005-06-23 06:29:20',1,'2006-02-15 21:30:53'),(3015,'2005-06-20 10:48:56',1311,23,'2005-06-26 11:30:56',2,'2006-02-15 21:30:53'),(3016,'2005-06-20 10:55:08',3514,558,'2005-06-24 14:05:08',1,'2006-02-15 21:30:53'),(3017,'2005-06-20 11:08:56',2513,151,'2005-06-28 16:26:56',1,'2006-02-15 21:30:53'),(3018,'2005-06-20 11:10:35',4150,112,'2005-06-25 07:17:35',2,'2006-02-15 21:30:53'),(3019,'2005-06-20 11:11:52',491,144,'2005-06-27 08:30:52',2,'2006-02-15 21:30:53'),(3020,'2005-06-20 11:12:04',4363,74,'2005-06-27 07:31:04',2,'2006-02-15 21:30:53'),(3021,'2005-06-20 11:13:01',120,62,'2005-06-28 16:15:01',2,'2006-02-15 21:30:53'),(3022,'2005-06-20 11:17:20',3745,466,'2005-06-26 13:15:20',2,'2006-02-15 21:30:53'),(3023,'2005-06-20 11:18:11',4304,106,'2005-06-21 12:43:11',1,'2006-02-15 21:30:53'),(3024,'2005-06-20 11:29:17',1966,328,'2005-06-27 12:51:17',2,'2006-02-15 21:30:53'),(3025,'2005-06-20 11:46:48',1309,293,'2005-06-22 08:43:48',1,'2006-02-15 21:30:53'),(3026,'2005-06-20 11:48:00',4032,347,'2005-06-21 12:51:00',2,'2006-02-15 21:30:53'),(3027,'2005-06-20 11:50:30',4028,397,'2005-06-25 15:58:30',2,'2006-02-15 21:30:53'),(3028,'2005-06-20 11:50:52',886,264,'2005-06-21 11:05:52',2,'2006-02-15 21:30:53'),(3029,'2005-06-20 11:51:30',327,317,'2005-06-25 16:42:30',1,'2006-02-15 21:30:53'),(3030,'2005-06-20 11:51:59',1543,395,'2005-06-24 10:51:59',1,'2006-02-15 21:30:53'),(3031,'2005-06-20 11:52:49',1184,491,'2005-06-22 07:00:49',1,'2006-02-15 21:30:53'),(3032,'2005-06-20 11:58:30',3734,172,'2005-06-24 09:49:30',1,'2006-02-15 21:30:53'),(3033,'2005-06-20 12:02:05',4422,107,'2005-06-26 15:58:05',1,'2006-02-15 21:30:53'),(3034,'2005-06-20 12:15:50',2755,296,'2005-06-24 06:21:50',2,'2006-02-15 21:30:53'),(3035,'2005-06-20 12:17:03',1223,62,'2005-06-26 17:42:03',2,'2006-02-15 21:30:53'),(3036,'2005-06-20 12:18:31',4463,399,'2005-06-29 09:52:31',1,'2006-02-15 21:30:53'),(3037,'2005-06-20 12:28:03',2033,434,'2005-06-21 08:21:03',1,'2006-02-15 21:30:53'),(3038,'2005-06-20 12:28:59',2919,27,'2005-06-25 07:48:59',1,'2006-02-15 21:30:53'),(3039,'2005-06-20 12:32:30',4098,186,'2005-06-21 07:38:30',1,'2006-02-15 21:30:53'),(3040,'2005-06-20 12:34:13',2568,162,'2005-06-21 12:33:13',1,'2006-02-15 21:30:53'),(3041,'2005-06-20 12:35:44',2676,459,'2005-06-23 18:28:44',2,'2006-02-15 21:30:53'),(3042,'2005-06-20 12:38:27',3103,291,'2005-06-26 11:18:27',1,'2006-02-15 21:30:53'),(3043,'2005-06-20 12:38:35',633,599,'2005-06-29 14:16:35',2,'2006-02-15 21:30:53'),(3044,'2005-06-20 12:38:49',3216,424,'2005-06-25 07:49:49',1,'2006-02-15 21:30:53'),(3045,'2005-06-20 12:42:00',3065,459,'2005-06-23 10:49:00',2,'2006-02-15 21:30:53'),(3046,'2005-06-20 12:42:59',471,559,'2005-06-26 17:40:59',2,'2006-02-15 21:30:53'),(3047,'2005-06-20 12:45:33',624,13,'2005-06-29 13:09:33',2,'2006-02-15 21:30:53'),(3048,'2005-06-20 12:49:55',4389,482,'2005-06-26 11:06:55',1,'2006-02-15 21:30:53'),(3049,'2005-06-20 12:51:01',518,403,'2005-06-29 10:53:01',1,'2006-02-15 21:30:53'),(3050,'2005-06-20 13:03:03',2397,557,'2005-06-29 07:22:03',1,'2006-02-15 21:30:53'),(3051,'2005-06-20 13:06:52',1408,65,'2005-06-25 13:03:52',2,'2006-02-15 21:30:53'),(3052,'2005-06-20 13:09:19',2359,329,'2005-06-29 11:55:19',2,'2006-02-15 21:30:53'),(3053,'2005-06-20 13:10:30',818,329,'2005-06-25 17:22:30',2,'2006-02-15 21:30:53'),(3054,'2005-06-20 13:16:41',2817,322,'2005-06-28 13:45:41',2,'2006-02-15 21:30:53'),(3055,'2005-06-20 13:19:58',1510,23,'2005-06-27 14:54:58',1,'2006-02-15 21:30:53'),(3056,'2005-06-20 13:20:58',2010,95,'2005-06-26 08:35:58',2,'2006-02-15 21:30:53'),(3057,'2005-06-20 13:22:48',1101,307,'2005-06-26 17:22:48',2,'2006-02-15 21:30:53'),(3058,'2005-06-20 13:28:35',938,137,'2005-06-28 13:57:35',2,'2006-02-15 21:30:53'),(3059,'2005-06-20 13:38:41',2911,266,'2005-06-21 10:13:41',2,'2006-02-15 21:30:53'),(3060,'2005-06-20 13:47:20',2075,446,'2005-06-25 16:00:20',2,'2006-02-15 21:30:53'),(3061,'2005-06-20 13:48:21',4202,330,'2005-06-22 17:36:21',2,'2006-02-15 21:30:53'),(3062,'2005-06-20 13:50:00',591,75,'2005-06-27 08:18:00',1,'2006-02-15 21:30:53'),(3063,'2005-06-20 13:52:03',3954,515,'2005-06-28 13:36:03',2,'2006-02-15 21:30:53'),(3064,'2005-06-20 13:53:13',2624,276,'2005-06-25 16:33:13',2,'2006-02-15 21:30:53'),(3065,'2005-06-20 13:53:53',1687,227,'2005-06-24 11:31:53',1,'2006-02-15 21:30:53'),(3066,'2005-06-20 13:55:41',1116,268,'2005-06-26 09:38:41',2,'2006-02-15 21:30:53'),(3067,'2005-06-20 13:59:21',3094,349,'2005-06-28 19:09:21',2,'2006-02-15 21:30:53'),(3068,'2005-06-20 14:02:22',1958,516,'2005-06-22 12:52:22',2,'2006-02-15 21:30:53'),(3069,'2005-06-20 14:13:00',1952,237,'2005-06-28 10:57:00',1,'2006-02-15 21:30:53'),(3070,'2005-06-20 14:15:39',3860,543,'2005-06-25 12:52:39',2,'2006-02-15 21:30:53'),(3071,'2005-06-20 14:20:42',1198,582,'2005-06-24 19:01:42',1,'2006-02-15 21:30:53'),(3072,'2005-06-20 14:21:31',4131,423,'2005-06-27 18:46:31',2,'2006-02-15 21:30:53'),(3073,'2005-06-20 14:33:26',3164,471,'2005-06-26 08:42:26',2,'2006-02-15 21:30:53'),(3074,'2005-06-20 14:41:41',1441,299,'2005-06-21 15:56:41',1,'2006-02-15 21:30:53'),(3075,'2005-06-20 14:52:19',4346,161,'2005-06-28 18:48:19',2,'2006-02-15 21:30:53'),(3076,'2005-06-20 15:01:19',1344,109,'2005-06-28 16:53:19',2,'2006-02-15 21:30:53'),(3077,'2005-06-20 15:05:18',1675,303,'2005-06-26 20:52:18',2,'2006-02-15 21:30:53'),(3078,'2005-06-20 15:09:48',3642,367,'2005-06-24 16:54:48',1,'2006-02-15 21:30:53'),(3079,'2005-06-20 15:13:40',2135,350,'2005-06-21 12:03:40',1,'2006-02-15 21:30:53'),(3080,'2005-06-20 15:22:32',118,377,'2005-06-24 11:08:32',1,'2006-02-15 21:30:53'),(3081,'2005-06-20 15:29:13',2071,342,'2005-06-24 21:00:13',2,'2006-02-15 21:30:53'),(3082,'2005-06-20 15:32:11',4431,164,'2005-06-28 13:08:11',1,'2006-02-15 21:30:53'),(3083,'2005-06-20 15:33:47',2896,257,'2005-06-26 16:14:47',2,'2006-02-15 21:30:53'),(3084,'2005-06-20 15:35:24',3578,514,'2005-06-23 19:11:24',1,'2006-02-15 21:30:53'),(3085,'2005-06-20 15:42:33',4282,166,'2005-06-21 16:51:33',2,'2006-02-15 21:30:53'),(3086,'2005-06-20 15:42:40',4437,377,'2005-06-25 19:21:40',1,'2006-02-15 21:30:53'),(3087,'2005-06-20 15:53:59',1305,111,'2005-06-27 10:54:59',2,'2006-02-15 21:30:53'),(3088,'2005-06-20 15:56:05',3049,384,'2005-06-29 13:02:05',1,'2006-02-15 21:30:53'),(3089,'2005-06-20 15:57:01',539,151,'2005-06-25 13:15:01',2,'2006-02-15 21:30:53'),(3090,'2005-06-20 16:00:19',3301,267,'2005-06-23 14:55:19',1,'2006-02-15 21:30:53'),(3091,'2005-06-20 16:02:59',854,383,'2005-06-22 21:30:59',2,'2006-02-15 21:30:53'),(3092,'2005-06-20 16:04:42',4344,347,'2005-06-27 19:54:42',1,'2006-02-15 21:30:53'),(3093,'2005-06-20 16:06:14',2534,556,'2005-06-22 13:22:14',2,'2006-02-15 21:30:53'),(3094,'2005-06-20 16:06:51',2048,114,'2005-06-24 13:23:51',1,'2006-02-15 21:30:53'),(3095,'2005-06-20 16:16:53',3937,298,'2005-06-22 10:35:53',2,'2006-02-15 21:30:53'),(3096,'2005-06-20 16:17:56',3851,79,'2005-06-24 10:17:56',2,'2006-02-15 21:30:53'),(3097,'2005-06-20 16:26:14',4337,280,'2005-06-23 14:46:14',1,'2006-02-15 21:30:53'),(3098,'2005-06-20 16:37:01',3409,498,'2005-06-22 22:24:01',1,'2006-02-15 21:30:53'),(3099,'2005-06-20 16:44:33',3756,380,'2005-06-27 12:17:33',2,'2006-02-15 21:30:53'),(3100,'2005-06-20 16:47:57',2428,487,'2005-06-26 16:59:57',1,'2006-02-15 21:30:53'),(3101,'2005-06-20 16:48:58',1738,384,'2005-06-27 18:13:58',2,'2006-02-15 21:30:53'),(3102,'2005-06-20 16:55:55',1144,522,'2005-06-29 13:49:55',1,'2006-02-15 21:30:53'),(3103,'2005-06-20 16:58:19',1877,553,'2005-06-25 21:18:19',1,'2006-02-15 21:30:53'),(3104,'2005-06-20 17:06:46',1490,196,'2005-06-28 13:18:46',2,'2006-02-15 21:30:53'),(3105,'2005-06-20 17:11:46',130,385,'2005-06-21 11:48:46',2,'2006-02-15 21:30:53'),(3106,'2005-06-20 17:18:06',2637,201,'2005-06-24 14:50:06',2,'2006-02-15 21:30:53'),(3107,'2005-06-20 17:26:05',4527,303,'2005-06-25 12:36:05',1,'2006-02-15 21:30:53'),(3108,'2005-06-20 17:28:43',2218,189,'2005-06-27 21:23:43',1,'2006-02-15 21:30:53'),(3109,'2005-06-20 17:33:55',977,93,'2005-06-22 23:09:55',1,'2006-02-15 21:30:53'),(3110,'2005-06-20 17:40:12',2008,333,'2005-06-24 17:09:12',1,'2006-02-15 21:30:53'),(3111,'2005-06-20 17:46:47',4494,579,'2005-06-29 19:45:47',1,'2006-02-15 21:30:53'),(3112,'2005-06-20 17:53:30',3725,35,'2005-06-26 16:03:30',1,'2006-02-15 21:30:53'),(3113,'2005-06-20 17:56:40',3620,517,'2005-06-23 14:45:40',1,'2006-02-15 21:30:53'),(3114,'2005-06-20 17:57:47',2388,8,'2005-06-21 19:18:47',2,'2006-02-15 21:30:53'),(3115,'2005-06-20 17:59:05',2193,457,'2005-06-26 13:28:05',1,'2006-02-15 21:30:53'),(3116,'2005-06-20 18:04:55',276,108,'2005-06-21 12:12:55',2,'2006-02-15 21:30:53'),(3117,'2005-06-20 18:05:15',2184,31,'2005-06-26 17:28:15',1,'2006-02-15 21:30:53'),(3118,'2005-06-20 18:05:57',1258,125,'2005-06-23 23:01:57',1,'2006-02-15 21:30:53'),(3119,'2005-06-20 18:11:44',683,296,'2005-06-27 16:14:44',2,'2006-02-15 21:30:53'),(3120,'2005-06-20 18:19:29',2530,107,'2005-06-23 23:40:29',1,'2006-02-15 21:30:53'),(3121,'2005-06-20 18:23:30',797,132,'2005-06-21 20:36:30',1,'2006-02-15 21:30:53'),(3122,'2005-06-20 18:25:57',2720,87,'2005-06-29 16:08:57',1,'2006-02-15 21:30:53'),(3123,'2005-06-20 18:26:14',1656,289,'2005-06-29 17:17:14',1,'2006-02-15 21:30:53'),(3124,'2005-06-20 18:28:19',3342,113,'2005-06-28 21:08:19',1,'2006-02-15 21:30:53'),(3125,'2005-06-20 18:31:58',3293,382,'2005-06-21 15:03:58',1,'2006-02-15 21:30:53'),(3126,'2005-06-20 18:38:22',1183,5,'2005-06-26 00:00:22',1,'2006-02-15 21:30:53'),(3127,'2005-06-20 18:39:43',1292,461,'2005-06-28 17:55:43',1,'2006-02-15 21:30:53'),(3128,'2005-06-20 18:41:47',189,543,'2005-06-24 20:54:47',2,'2006-02-15 21:30:53'),(3129,'2005-06-20 18:57:48',1789,495,'2005-06-28 13:45:48',1,'2006-02-15 21:30:53'),(3130,'2005-06-20 19:03:22',2569,341,'2005-06-29 18:05:22',2,'2006-02-15 21:30:53'),(3131,'2005-06-20 19:08:00',3678,146,'2005-06-24 20:59:00',2,'2006-02-15 21:30:53'),(3132,'2005-06-20 19:09:46',711,90,'2005-06-24 19:42:46',1,'2006-02-15 21:30:53'),(3133,'2005-06-20 19:18:32',4529,120,'2005-06-26 17:54:32',2,'2006-02-15 21:30:53'),(3134,'2005-06-20 19:29:09',1389,537,'2005-06-29 19:31:09',2,'2006-02-15 21:30:53'),(3135,'2005-06-20 19:33:52',1122,12,'2005-06-29 18:20:52',1,'2006-02-15 21:30:53'),(3136,'2005-06-20 19:39:08',3349,377,'2005-06-22 23:35:08',2,'2006-02-15 21:30:53'),(3137,'2005-06-20 19:41:28',786,505,'2005-06-28 00:32:28',1,'2006-02-15 21:30:53'),(3138,'2005-06-20 19:43:45',2265,570,'2005-06-26 20:41:45',1,'2006-02-15 21:30:53'),(3139,'2005-06-20 19:44:45',3474,354,'2005-06-23 16:24:45',1,'2006-02-15 21:30:53'),(3140,'2005-06-20 19:47:12',2936,53,'2005-06-24 23:24:12',1,'2006-02-15 21:30:53'),(3141,'2005-06-20 19:55:47',1806,398,'2005-06-30 00:31:47',1,'2006-02-15 21:30:53'),(3142,'2005-06-20 19:59:28',3926,9,'2005-06-28 19:51:28',2,'2006-02-15 21:30:53'),(3143,'2005-06-20 20:01:52',1355,215,'2005-06-26 19:26:52',2,'2006-02-15 21:30:53'),(3144,'2005-06-20 20:14:20',1300,114,'2005-06-30 01:46:20',1,'2006-02-15 21:30:53'),(3145,'2005-06-20 20:21:17',2211,144,'2005-06-22 14:44:17',1,'2006-02-15 21:30:53'),(3146,'2005-06-20 20:21:48',2249,339,'2005-06-29 22:57:48',2,'2006-02-15 21:30:53'),(3147,'2005-06-20 20:25:17',615,390,'2005-06-28 20:22:17',2,'2006-02-15 21:30:53'),(3148,'2005-06-20 20:27:18',4490,202,'2005-06-24 20:30:18',2,'2006-02-15 21:30:53'),(3149,'2005-06-20 20:34:55',3295,55,'2005-06-21 18:51:55',1,'2006-02-15 21:30:53'),(3150,'2005-06-20 20:35:28',94,34,'2005-06-26 01:01:28',1,'2006-02-15 21:30:53'),(3151,'2005-06-20 20:36:53',2976,77,'2005-06-25 18:56:53',1,'2006-02-15 21:30:53'),(3152,'2005-06-20 20:42:41',1022,246,'2005-06-28 21:12:41',1,'2006-02-15 21:30:53'),(3153,'2005-06-20 20:44:15',659,430,'2005-06-23 16:04:15',1,'2006-02-15 21:30:53'),(3154,'2005-06-20 20:44:40',3195,550,'2005-06-23 19:10:40',1,'2006-02-15 21:30:53'),(3155,'2005-06-20 21:02:38',458,450,'2005-06-27 19:34:38',1,'2006-02-15 21:30:53'),(3156,'2005-06-20 21:03:46',2217,365,'2005-06-21 23:32:46',2,'2006-02-15 21:30:53'),(3157,'2005-06-20 21:07:54',1899,245,'2005-06-23 16:01:54',1,'2006-02-15 21:30:53'),(3158,'2005-06-20 21:08:19',3461,592,'2005-06-29 18:59:19',1,'2006-02-15 21:30:53'),(3159,'2005-06-20 21:11:50',33,388,'2005-06-29 19:35:50',2,'2006-02-15 21:30:53'),(3160,'2005-06-20 21:20:51',4333,561,'2005-06-29 18:06:51',2,'2006-02-15 21:30:53'),(3161,'2005-06-20 21:21:01',1326,373,'2005-06-21 18:22:01',2,'2006-02-15 21:30:53'),(3162,'2005-06-20 21:21:15',3220,113,'2005-06-29 18:42:15',1,'2006-02-15 21:30:53'),(3163,'2005-06-20 21:22:13',2632,391,'2005-06-26 15:22:13',2,'2006-02-15 21:30:53'),(3164,'2005-06-20 21:29:00',155,270,'2005-06-27 15:50:00',1,'2006-02-15 21:30:53'),(3165,'2005-06-20 21:29:17',796,85,'2005-06-22 18:03:17',1,'2006-02-15 21:30:53'),(3166,'2005-06-20 21:32:32',1850,424,'2005-06-27 20:29:32',1,'2006-02-15 21:30:53'),(3167,'2005-06-20 21:42:29',353,464,'2005-06-22 00:36:29',2,'2006-02-15 21:30:53'),(3168,'2005-06-20 21:46:01',2407,446,'2005-06-22 20:40:01',1,'2006-02-15 21:30:53'),(3169,'2005-06-20 21:55:54',2437,50,'2005-06-25 19:45:54',1,'2006-02-15 21:30:53'),(3170,'2005-06-20 22:02:54',1306,421,'2005-06-29 00:41:54',2,'2006-02-15 21:30:53'),(3171,'2005-06-20 22:15:47',2838,140,'2005-06-24 18:14:47',1,'2006-02-15 21:30:53'),(3172,'2005-06-20 22:19:25',1758,31,'2005-06-24 17:18:25',2,'2006-02-15 21:30:53'),(3173,'2005-06-20 22:21:10',4306,33,'2005-06-27 19:41:10',2,'2006-02-15 21:30:53'),(3174,'2005-06-20 22:24:00',3331,107,'2005-06-22 21:22:00',2,'2006-02-15 21:30:53'),(3175,'2005-06-20 22:30:23',4093,249,'2005-06-30 03:28:23',2,'2006-02-15 21:30:53'),(3176,'2005-06-20 22:31:54',1982,371,'2005-06-25 02:58:54',1,'2006-02-15 21:30:53'),(3177,'2005-06-20 22:32:44',2546,300,'2005-06-22 23:01:44',1,'2006-02-15 21:30:53'),(3178,'2005-06-20 22:35:12',3517,79,'2005-06-23 19:39:12',1,'2006-02-15 21:30:53'),(3179,'2005-06-20 22:37:59',2214,163,'2005-06-26 22:26:59',2,'2006-02-15 21:30:53'),(3180,'2005-06-20 22:48:44',3997,162,'2005-06-21 21:25:44',1,'2006-02-15 21:30:53'),(3181,'2005-06-20 22:51:02',3473,238,'2005-06-27 21:21:02',1,'2006-02-15 21:30:53'),(3182,'2005-06-20 22:52:18',4017,15,'2005-06-21 21:00:18',2,'2006-02-15 21:30:53'),(3183,'2005-06-20 22:55:55',4397,129,'2005-06-23 17:22:55',1,'2006-02-15 21:30:53'),(3184,'2005-06-20 22:57:44',3179,457,'2005-06-29 20:57:44',1,'2006-02-15 21:30:53'),(3185,'2005-06-20 22:58:01',601,234,'2005-06-27 00:26:01',1,'2006-02-15 21:30:53'),(3186,'2005-06-20 23:04:20',3198,406,'2005-06-29 02:56:20',2,'2006-02-15 21:30:53'),(3187,'2005-06-20 23:06:07',4357,150,'2005-06-27 01:14:07',2,'2006-02-15 21:30:53'),(3188,'2005-06-20 23:10:27',2471,522,'2005-06-25 19:37:27',2,'2006-02-15 21:30:53'),(3189,'2005-06-20 23:19:33',1502,538,'2005-06-24 17:46:33',1,'2006-02-15 21:30:53'),(3190,'2005-06-20 23:27:15',351,200,'2005-06-28 01:22:15',2,'2006-02-15 21:30:53'),(3191,'2005-06-20 23:46:39',4358,522,'2005-06-25 03:21:39',2,'2006-02-15 21:30:53'),(3192,'2005-06-20 23:49:12',3713,11,'2005-06-24 03:00:12',1,'2006-02-15 21:30:53'),(3193,'2005-06-20 23:52:30',3176,260,'2005-06-22 21:21:30',1,'2006-02-15 21:30:53'),(3194,'2005-06-20 23:59:57',1835,432,'2005-06-24 19:21:57',1,'2006-02-15 21:30:53'),(3195,'2005-06-21 00:02:10',2383,165,'2005-06-21 23:11:10',2,'2006-02-15 21:30:53'),(3196,'2005-06-21 00:02:28',1575,52,'2005-06-22 23:08:28',1,'2006-02-15 21:30:53'),(3197,'2005-06-21 00:07:23',1811,362,'2005-06-23 00:53:23',2,'2006-02-15 21:30:53'),(3198,'2005-06-21 00:08:54',1626,295,'2005-06-29 02:11:54',2,'2006-02-15 21:30:53'),(3199,'2005-06-21 00:12:40',3824,234,'2005-06-27 23:26:40',1,'2006-02-15 21:30:53'),(3200,'2005-06-21 00:22:47',4117,221,'2005-06-27 05:52:47',2,'2006-02-15 21:30:53'),(3201,'2005-06-21 00:30:26',6,597,'2005-06-28 03:42:26',1,'2006-02-15 21:30:53'),(3202,'2005-06-21 00:33:47',2725,273,'2005-06-24 04:05:47',2,'2006-02-15 21:30:53'),(3203,'2005-06-21 00:34:56',442,158,'2005-06-29 23:30:56',1,'2006-02-15 21:30:53'),(3204,'2005-06-21 00:37:50',2848,336,'2005-06-22 23:46:50',1,'2006-02-15 21:30:53'),(3205,'2005-06-21 00:38:47',2964,31,'2005-06-21 22:49:47',1,'2006-02-15 21:30:53'),(3206,'2005-06-21 00:39:39',2196,350,'2005-06-22 05:12:39',1,'2006-02-15 21:30:53'),(3207,'2005-06-21 00:43:16',4020,86,'2005-06-24 22:13:16',1,'2006-02-15 21:30:53'),(3208,'2005-06-21 00:50:03',3169,229,'2005-06-24 06:15:03',2,'2006-02-15 21:30:53'),(3209,'2005-06-21 00:51:06',287,307,'2005-06-22 21:49:06',2,'2006-02-15 21:30:53'),(3210,'2005-06-21 01:00:25',467,75,'2005-06-23 06:10:25',2,'2006-02-15 21:30:53'),(3211,'2005-06-21 01:01:29',1150,415,'2005-06-23 04:05:29',1,'2006-02-15 21:30:53'),(3212,'2005-06-21 01:04:35',4178,21,'2005-06-30 00:10:35',2,'2006-02-15 21:30:53'),(3213,'2005-06-21 01:05:19',3832,534,'2005-06-27 21:55:19',2,'2006-02-15 21:30:53'),(3214,'2005-06-21 01:08:26',776,142,'2005-06-23 03:24:26',2,'2006-02-15 21:30:53'),(3215,'2005-06-21 01:11:32',4140,279,'2005-06-26 19:42:32',1,'2006-02-15 21:30:53'),(3216,'2005-06-21 01:19:37',719,534,'2005-06-29 06:45:37',2,'2006-02-15 21:30:53'),(3217,'2005-06-21 01:28:12',1027,463,'2005-06-25 02:51:12',2,'2006-02-15 21:30:53'),(3218,'2005-06-21 01:38:09',1828,117,'2005-06-23 02:00:09',1,'2006-02-15 21:30:53'),(3219,'2005-06-21 01:43:26',3024,129,'2005-06-28 23:50:26',2,'2006-02-15 21:30:53'),(3220,'2005-06-21 01:46:25',1880,574,'2005-06-26 07:44:25',2,'2006-02-15 21:30:53'),(3221,'2005-06-21 01:49:47',245,454,'2005-06-25 06:31:47',1,'2006-02-15 21:30:53'),(3222,'2005-06-21 01:50:29',4023,501,'2005-06-27 00:52:29',2,'2006-02-15 21:30:53'),(3223,'2005-06-21 02:06:45',1033,299,'2005-06-22 07:16:45',2,'2006-02-15 21:30:53'),(3224,'2005-06-21 02:11:36',3318,173,'2005-06-23 21:17:36',1,'2006-02-15 21:30:53'),(3225,'2005-06-21 02:16:55',1003,448,'2005-06-27 05:39:55',2,'2006-02-15 21:30:53'),(3226,'2005-06-21 02:18:14',4079,576,'2005-06-26 22:32:14',2,'2006-02-15 21:30:53'),(3227,'2005-06-21 02:18:25',1156,568,'2005-06-27 00:59:25',1,'2006-02-15 21:30:53'),(3228,'2005-06-21 02:20:24',2489,535,'2005-06-29 00:50:24',2,'2006-02-15 21:30:53'),(3229,'2005-06-21 02:20:41',2301,81,'2005-06-26 00:39:41',1,'2006-02-15 21:30:53'),(3230,'2005-06-21 02:23:16',215,83,'2005-06-22 01:37:16',2,'2006-02-15 21:30:53'),(3231,'2005-06-21 02:25:00',237,28,'2005-06-23 05:46:00',2,'2006-02-15 21:30:53'),(3232,'2005-06-21 02:30:37',1972,555,'2005-06-29 03:10:37',1,'2006-02-15 21:30:53'),(3233,'2005-06-21 02:39:31',3542,353,'2005-06-28 05:23:31',2,'2006-02-15 21:30:53'),(3234,'2005-06-21 02:39:44',3252,459,'2005-06-29 07:27:44',1,'2006-02-15 21:30:53'),(3235,'2005-06-21 02:46:17',212,49,'2005-06-22 20:58:17',1,'2006-02-15 21:30:53'),(3236,'2005-06-21 02:47:43',1492,550,'2005-06-29 08:04:43',2,'2006-02-15 21:30:53'),(3237,'2005-06-21 02:47:56',4399,466,'2005-06-27 03:16:56',2,'2006-02-15 21:30:53'),(3238,'2005-06-21 02:48:21',2732,77,'2005-06-23 04:43:21',1,'2006-02-15 21:30:53'),(3239,'2005-06-21 02:48:40',3402,328,'2005-06-22 02:49:40',2,'2006-02-15 21:30:53'),(3240,'2005-06-21 02:53:17',2938,405,'2005-06-30 03:25:17',2,'2006-02-15 21:30:53'),(3241,'2005-06-21 02:54:32',1442,499,'2005-06-26 21:56:32',2,'2006-02-15 21:30:53'),(3242,'2005-06-21 02:56:24',1421,562,'2005-06-29 21:41:24',2,'2006-02-15 21:30:53'),(3243,'2005-06-21 03:00:11',2556,426,'2005-06-25 21:53:11',1,'2006-02-15 21:30:53'),(3244,'2005-06-21 03:01:10',291,53,'2005-06-24 06:59:10',2,'2006-02-15 21:30:53'),(3245,'2005-06-21 03:06:11',2057,358,'2005-06-25 08:06:11',2,'2006-02-15 21:30:53'),(3246,'2005-06-21 03:10:01',4432,41,'2005-06-28 00:46:01',1,'2006-02-15 21:30:53'),(3247,'2005-06-21 03:12:15',1406,277,'2005-06-27 00:44:15',1,'2006-02-15 21:30:53'),(3248,'2005-06-21 03:12:21',3656,78,'2005-06-28 03:54:21',2,'2006-02-15 21:30:53'),(3249,'2005-06-21 03:13:19',703,410,'2005-06-29 04:04:19',2,'2006-02-15 21:30:53'),(3250,'2005-06-21 03:16:36',736,467,'2005-06-29 00:53:36',2,'2006-02-15 21:30:53'),(3251,'2005-06-21 03:20:37',1414,317,'2005-06-23 04:54:37',2,'2006-02-15 21:30:53'),(3252,'2005-06-21 03:25:26',2009,213,'2005-06-24 00:38:26',2,'2006-02-15 21:30:53'),(3253,'2005-06-21 03:25:37',1906,405,'2005-06-27 02:46:37',2,'2006-02-15 21:30:53'),(3254,'2005-06-21 03:27:10',3893,472,'2005-06-22 22:01:10',2,'2006-02-15 21:30:53'),(3255,'2005-06-21 03:39:52',2564,482,'2005-06-24 04:02:52',1,'2006-02-15 21:30:53'),(3256,'2005-06-21 03:45:42',1235,319,'2005-06-30 02:51:42',2,'2006-02-15 21:30:53'),(3257,'2005-06-21 03:47:19',3975,263,'2005-06-28 01:24:19',2,'2006-02-15 21:30:53'),(3258,'2005-06-21 03:53:58',4417,241,'2005-06-22 22:49:58',2,'2006-02-15 21:30:53'),(3259,'2005-06-21 03:57:15',2751,478,'2005-06-24 03:32:15',1,'2006-02-15 21:30:53'),(3260,'2005-06-21 03:59:13',3627,380,'2005-06-23 03:29:13',1,'2006-02-15 21:30:53'),(3261,'2005-06-21 04:07:41',2029,169,'2005-06-24 06:25:41',2,'2006-02-15 21:30:53'),(3262,'2005-06-21 04:08:43',3773,9,'2005-06-28 02:55:43',1,'2006-02-15 21:30:53'),(3263,'2005-06-21 04:15:52',3491,118,'2005-06-24 02:19:52',2,'2006-02-15 21:30:53'),(3264,'2005-06-21 04:19:03',1666,340,'2005-06-23 01:29:03',1,'2006-02-15 21:30:53'),(3265,'2005-06-21 04:23:13',3637,437,'2005-06-28 03:37:13',1,'2006-02-15 21:30:53'),(3266,'2005-06-21 04:49:07',2533,175,'2005-06-26 05:19:07',2,'2006-02-15 21:30:53'),(3267,'2005-06-21 04:55:21',1118,134,'2005-06-29 23:46:21',1,'2006-02-15 21:30:53'),(3268,'2005-06-21 04:55:49',4366,329,'2005-06-30 00:23:49',2,'2006-02-15 21:30:53'),(3269,'2005-06-21 05:06:30',3828,17,'2005-06-27 09:26:30',2,'2006-02-15 21:30:53'),(3270,'2005-06-21 05:07:31',1578,86,'2005-06-22 07:45:31',2,'2006-02-15 21:30:53'),(3271,'2005-06-21 05:16:10',4191,196,'2005-06-27 10:46:10',1,'2006-02-15 21:30:53'),(3272,'2005-06-21 05:18:27',1090,550,'2005-06-30 02:51:27',1,'2006-02-15 21:30:53'),(3273,'2005-06-21 05:24:17',3538,104,'2005-06-23 01:21:17',2,'2006-02-15 21:30:53'),(3274,'2005-06-21 05:30:36',2156,277,'2005-06-24 05:12:36',1,'2006-02-15 21:30:53'),(3275,'2005-06-21 05:33:04',2320,368,'2005-06-30 00:37:04',2,'2006-02-15 21:30:53'),(3276,'2005-06-21 05:35:52',1890,425,'2005-06-29 03:26:52',2,'2006-02-15 21:30:53'),(3277,'2005-06-21 05:36:37',1330,229,'2005-06-29 10:54:37',1,'2006-02-15 21:30:53'),(3278,'2005-06-21 05:41:30',2832,554,'2005-06-22 03:43:30',1,'2006-02-15 21:30:53'),(3279,'2005-06-21 06:05:53',1672,462,'2005-06-25 09:40:53',1,'2006-02-15 21:30:53'),(3280,'2005-06-21 06:08:12',661,229,'2005-06-24 09:34:12',1,'2006-02-15 21:30:53'),(3281,'2005-06-21 06:08:47',4006,363,'2005-06-24 11:22:47',1,'2006-02-15 21:30:53'),(3282,'2005-06-21 06:18:42',1676,224,'2005-06-28 09:18:42',1,'2006-02-15 21:30:53'),(3283,'2005-06-21 06:19:07',3988,372,'2005-06-26 10:59:07',2,'2006-02-15 21:30:53'),(3284,'2005-06-21 06:24:45',4566,1,'2005-06-28 03:28:45',1,'2006-02-15 21:30:53'),(3285,'2005-06-21 06:30:13',948,481,'2005-06-23 10:31:13',2,'2006-02-15 21:30:53'),(3286,'2005-06-21 06:31:29',742,577,'2005-06-25 00:46:29',2,'2006-02-15 21:30:53'),(3287,'2005-06-21 06:32:39',4406,62,'2005-06-24 09:29:39',2,'2006-02-15 21:30:53'),(3288,'2005-06-21 06:36:59',1961,299,'2005-06-30 06:50:59',1,'2006-02-15 21:30:53'),(3289,'2005-06-21 06:41:48',2248,115,'2005-06-30 00:54:48',1,'2006-02-15 21:30:53'),(3290,'2005-06-21 06:45:34',2727,293,'2005-06-28 09:44:34',1,'2006-02-15 21:30:53'),(3291,'2005-06-21 06:55:36',3866,274,'2005-06-29 03:41:36',1,'2006-02-15 21:30:53'),(3292,'2005-06-21 06:59:11',3288,412,'2005-06-23 07:11:11',1,'2006-02-15 21:30:53'),(3293,'2005-06-21 06:59:33',4407,481,'2005-06-25 06:54:33',2,'2006-02-15 21:30:53'),(3294,'2005-06-21 07:03:23',2390,439,'2005-06-30 02:22:23',2,'2006-02-15 21:30:53'),(3295,'2005-06-21 07:04:17',1703,573,'2005-06-29 01:52:17',1,'2006-02-15 21:30:53'),(3296,'2005-06-21 07:04:53',2453,284,'2005-06-25 08:36:53',1,'2006-02-15 21:30:53'),(3297,'2005-06-21 07:08:19',3969,193,'2005-06-28 11:53:19',2,'2006-02-15 21:30:53'),(3298,'2005-06-21 07:09:44',444,492,'2005-06-30 11:26:44',2,'2006-02-15 21:30:53'),(3299,'2005-06-21 07:23:34',3427,199,'2005-06-27 04:02:34',1,'2006-02-15 21:30:53'),(3300,'2005-06-21 07:25:01',2505,565,'2005-06-25 01:47:01',1,'2006-02-15 21:30:53'),(3301,'2005-06-21 07:32:25',503,444,'2005-06-28 06:26:25',2,'2006-02-15 21:30:53'),(3302,'2005-06-21 07:33:40',562,594,'2005-06-29 06:02:40',1,'2006-02-15 21:30:53'),(3303,'2005-06-21 07:34:14',1565,361,'2005-06-26 13:18:14',2,'2006-02-15 21:30:53'),(3304,'2005-06-21 07:43:40',2154,431,'2005-06-27 08:06:40',2,'2006-02-15 21:30:53'),(3305,'2005-06-21 07:46:57',2811,578,'2005-06-27 06:16:57',1,'2006-02-15 21:30:53'),(3306,'2005-06-21 07:46:58',1669,406,'2005-06-26 11:22:58',2,'2006-02-15 21:30:53'),(3307,'2005-06-21 07:52:30',462,85,'2005-06-25 02:36:30',2,'2006-02-15 21:30:53'),(3308,'2005-06-21 07:58:36',3129,96,'2005-06-23 05:23:36',2,'2006-02-15 21:30:53'),(3309,'2005-06-21 08:00:49',248,463,'2005-06-29 04:11:49',2,'2006-02-15 21:30:53'),(3310,'2005-06-21 08:04:51',1717,395,'2005-06-22 04:20:51',2,'2006-02-15 21:30:53'),(3311,'2005-06-21 08:05:27',3438,518,'2005-06-22 06:51:27',2,'2006-02-15 21:30:53'),(3312,'2005-06-21 08:05:32',1008,554,'2005-06-27 03:34:32',2,'2006-02-15 21:30:53'),(3313,'2005-06-21 08:11:18',4267,213,'2005-06-23 04:28:18',2,'2006-02-15 21:30:53'),(3314,'2005-06-21 08:17:00',4332,185,'2005-06-22 06:00:00',2,'2006-02-15 21:30:53'),(3315,'2005-06-21 08:17:04',4108,438,'2005-06-24 11:04:04',1,'2006-02-15 21:30:53'),(3316,'2005-06-21 08:20:18',3271,451,'2005-06-28 07:44:18',1,'2006-02-15 21:30:53'),(3317,'2005-06-21 08:22:32',4095,584,'2005-06-26 14:18:32',2,'2006-02-15 21:30:53'),(3318,'2005-06-21 08:23:05',1111,414,'2005-06-27 14:07:05',2,'2006-02-15 21:30:53'),(3319,'2005-06-21 08:25:46',2482,461,'2005-06-27 03:54:46',2,'2006-02-15 21:30:53'),(3320,'2005-06-21 08:29:41',860,47,'2005-06-29 13:54:41',2,'2006-02-15 21:30:53'),(3321,'2005-06-21 08:33:26',1750,144,'2005-06-24 10:09:26',2,'2006-02-15 21:30:53'),(3322,'2005-06-21 08:42:37',4324,458,'2005-06-22 13:17:37',1,'2006-02-15 21:30:53'),(3323,'2005-06-21 08:45:33',2252,272,'2005-06-28 08:17:33',2,'2006-02-15 21:30:53'),(3324,'2005-06-21 08:49:16',2830,29,'2005-06-22 12:31:16',1,'2006-02-15 21:30:53'),(3325,'2005-06-21 08:51:44',1720,185,'2005-06-27 06:16:44',1,'2006-02-15 21:30:53'),(3326,'2005-06-21 09:04:50',1025,347,'2005-06-30 12:10:50',2,'2006-02-15 21:30:53'),(3327,'2005-06-21 09:04:50',3083,62,'2005-06-30 05:45:50',1,'2006-02-15 21:30:53'),(3328,'2005-06-21 09:08:44',2462,292,'2005-06-30 12:28:44',1,'2006-02-15 21:30:53'),(3329,'2005-06-21 09:20:31',3506,335,'2005-06-22 10:00:31',2,'2006-02-15 21:30:53'),(3330,'2005-06-21 09:22:37',299,294,'2005-06-23 07:16:37',2,'2006-02-15 21:30:53'),(3331,'2005-06-21 09:37:53',2913,352,'2005-06-26 04:01:53',2,'2006-02-15 21:30:53'),(3332,'2005-06-21 09:55:12',1975,82,'2005-06-25 08:32:12',2,'2006-02-15 21:30:53'),(3333,'2005-06-21 10:01:36',3688,111,'2005-06-25 10:27:36',2,'2006-02-15 21:30:53'),(3334,'2005-06-21 10:04:33',2491,66,'2005-06-29 06:09:33',2,'2006-02-15 21:30:53'),(3335,'2005-06-21 10:09:08',3033,339,'2005-06-27 11:33:08',1,'2006-02-15 21:30:53'),(3336,'2005-06-21 10:14:27',2122,173,'2005-06-22 09:29:27',1,'2006-02-15 21:30:53'),(3337,'2005-06-21 10:24:35',1176,318,'2005-06-22 13:51:35',1,'2006-02-15 21:30:53'),(3338,'2005-06-21 10:27:31',2097,171,'2005-06-30 14:15:31',2,'2006-02-15 21:30:53'),(3339,'2005-06-21 10:37:11',312,526,'2005-06-30 05:04:11',2,'2006-02-15 21:30:53'),(3340,'2005-06-21 10:37:23',2962,540,'2005-06-26 07:21:23',2,'2006-02-15 21:30:53'),(3341,'2005-06-21 10:37:25',2189,591,'2005-06-26 15:38:25',1,'2006-02-15 21:30:53'),(3342,'2005-06-21 10:46:36',2884,196,'2005-06-23 09:46:36',2,'2006-02-15 21:30:53'),(3343,'2005-06-21 10:56:59',2038,466,'2005-06-25 16:41:59',1,'2006-02-15 21:30:53'),(3344,'2005-06-21 10:57:27',4401,277,'2005-06-28 10:53:27',1,'2006-02-15 21:30:53'),(3345,'2005-06-21 11:05:07',4442,71,'2005-06-26 15:14:07',2,'2006-02-15 21:30:53'),(3346,'2005-06-21 11:06:53',4393,189,'2005-06-22 15:19:53',2,'2006-02-15 21:30:53'),(3347,'2005-06-21 11:08:32',4330,448,'2005-06-28 09:59:32',1,'2006-02-15 21:30:53'),(3348,'2005-06-21 11:16:42',2945,16,'2005-06-27 13:50:42',2,'2006-02-15 21:30:53'),(3349,'2005-06-21 11:17:35',3885,336,'2005-06-22 12:51:35',2,'2006-02-15 21:30:53'),(3350,'2005-06-21 11:21:38',3221,20,'2005-06-28 15:37:38',2,'2006-02-15 21:30:53'),(3351,'2005-06-21 11:21:39',1591,386,'2005-06-23 07:23:39',2,'2006-02-15 21:30:53'),(3352,'2005-06-21 11:26:29',578,510,'2005-06-28 07:26:29',1,'2006-02-15 21:30:53'),(3353,'2005-06-21 11:29:23',3984,236,'2005-06-27 15:06:23',1,'2006-02-15 21:30:53'),(3354,'2005-06-21 11:29:49',1083,529,'2005-06-25 07:39:49',2,'2006-02-15 21:30:53'),(3355,'2005-06-21 11:30:47',1960,275,'2005-06-23 06:04:47',1,'2006-02-15 21:30:53'),(3356,'2005-06-21 11:38:45',4532,403,'2005-06-26 17:18:45',1,'2006-02-15 21:30:53'),(3357,'2005-06-21 11:55:42',2528,57,'2005-06-22 07:19:42',2,'2006-02-15 21:30:53'),(3358,'2005-06-21 11:56:40',1772,69,'2005-06-26 08:28:40',2,'2006-02-15 21:30:53'),(3359,'2005-06-21 12:08:18',3825,67,'2005-06-25 16:35:18',2,'2006-02-15 21:30:53'),(3360,'2005-06-21 12:12:41',2792,498,'2005-06-26 06:32:41',1,'2006-02-15 21:30:53'),(3361,'2005-06-21 12:14:23',2671,268,'2005-06-26 10:01:23',2,'2006-02-15 21:30:53'),(3362,'2005-06-21 12:19:54',1284,454,'2005-06-23 06:59:54',2,'2006-02-15 21:30:53'),(3363,'2005-06-21 12:25:07',538,261,'2005-06-27 11:52:07',2,'2006-02-15 21:30:53'),(3364,'2005-06-21 12:37:46',2329,201,'2005-06-28 07:18:46',2,'2006-02-15 21:30:53'),(3365,'2005-06-21 12:55:48',657,133,'2005-06-23 13:38:48',2,'2006-02-15 21:30:53'),(3366,'2005-06-21 13:03:37',2584,511,'2005-06-26 16:29:37',1,'2006-02-15 21:30:53'),(3367,'2005-06-21 13:08:21',2442,80,'2005-06-26 08:43:21',2,'2006-02-15 21:30:53'),(3368,'2005-06-21 13:18:38',548,438,'2005-06-23 11:13:38',1,'2006-02-15 21:30:53'),(3369,'2005-06-21 13:20:31',303,431,'2005-06-30 13:45:31',2,'2006-02-15 21:30:53'),(3370,'2005-06-21 13:27:01',1573,559,'2005-06-25 09:27:01',1,'2006-02-15 21:30:53'),(3371,'2005-06-21 13:27:22',2526,595,'2005-06-29 14:04:22',2,'2006-02-15 21:30:53'),(3372,'2005-06-21 13:34:19',4169,346,'2005-06-27 08:41:19',2,'2006-02-15 21:30:53'),(3373,'2005-06-21 13:35:32',2219,316,'2005-06-30 12:03:32',1,'2006-02-15 21:30:53'),(3374,'2005-06-21 13:36:30',1067,279,'2005-06-23 15:10:30',2,'2006-02-15 21:30:53'),(3375,'2005-06-21 13:37:18',912,279,'2005-06-22 11:26:18',2,'2006-02-15 21:30:53'),(3376,'2005-06-21 13:43:02',3055,318,'2005-06-28 18:07:02',1,'2006-02-15 21:30:53'),(3377,'2005-06-21 13:51:12',1845,428,'2005-06-22 18:16:12',1,'2006-02-15 21:30:53'),(3378,'2005-06-21 13:51:28',35,387,'2005-06-25 09:21:28',1,'2006-02-15 21:30:53'),(3379,'2005-06-21 13:54:58',2022,566,'2005-06-23 13:43:58',2,'2006-02-15 21:30:53'),(3380,'2005-06-21 13:58:46',3212,483,'2005-06-30 09:29:46',1,'2006-02-15 21:30:53'),(3381,'2005-06-21 14:02:59',1373,183,'2005-06-29 18:11:59',2,'2006-02-15 21:30:53'),(3382,'2005-06-21 14:05:23',131,341,'2005-06-29 19:13:23',2,'2006-02-15 21:30:53'),(3383,'2005-06-21 14:07:19',2968,239,'2005-06-29 17:00:19',2,'2006-02-15 21:30:53'),(3384,'2005-06-21 14:07:35',409,91,'2005-06-26 16:34:35',1,'2006-02-15 21:30:53'),(3385,'2005-06-21 14:16:48',2810,514,'2005-06-24 10:32:48',2,'2006-02-15 21:30:53'),(3386,'2005-06-21 14:21:06',1224,190,'2005-06-24 08:32:06',2,'2006-02-15 21:30:53'),(3387,'2005-06-21 14:21:49',2709,305,'2005-06-24 16:46:49',2,'2006-02-15 21:30:53'),(3388,'2005-06-21 14:34:51',556,119,'2005-06-28 18:19:51',1,'2006-02-15 21:30:53'),(3389,'2005-06-21 14:37:55',727,395,'2005-06-28 18:13:55',1,'2006-02-15 21:30:53'),(3390,'2005-06-21 15:10:50',2034,151,'2005-06-26 12:38:50',1,'2006-02-15 21:30:53'),(3391,'2005-06-21 15:11:02',26,45,'2005-06-25 14:12:02',1,'2006-02-15 21:30:53'),(3392,'2005-06-21 15:12:44',3343,38,'2005-06-29 18:19:44',1,'2006-02-15 21:30:53'),(3393,'2005-06-21 15:14:27',1631,362,'2005-06-25 19:54:27',2,'2006-02-15 21:30:53'),(3394,'2005-06-21 15:17:39',3393,295,'2005-06-30 13:55:39',2,'2006-02-15 21:30:53'),(3395,'2005-06-21 15:19:19',3764,66,'2005-06-29 14:23:19',2,'2006-02-15 21:30:53'),(3396,'2005-06-21 15:23:08',2744,371,'2005-06-23 10:25:08',1,'2006-02-15 21:30:53'),(3397,'2005-06-21 15:30:11',602,552,'2005-06-22 21:12:11',1,'2006-02-15 21:30:53'),(3398,'2005-06-21 15:34:38',221,599,'2005-06-29 11:23:38',1,'2006-02-15 21:30:53'),(3399,'2005-06-21 15:47:48',619,98,'2005-06-26 13:46:48',1,'2006-02-15 21:30:53'),(3400,'2005-06-21 15:50:30',1697,298,'2005-06-25 18:07:30',1,'2006-02-15 21:30:53'),(3401,'2005-06-21 15:52:43',3423,577,'2005-06-30 21:09:43',2,'2006-02-15 21:30:53'),(3402,'2005-06-21 15:54:37',596,187,'2005-06-30 13:43:37',1,'2006-02-15 21:30:53'),(3403,'2005-06-21 15:55:06',1741,264,'2005-06-27 12:34:06',1,'2006-02-15 21:30:53'),(3404,'2005-06-21 15:57:52',2005,424,'2005-06-24 20:58:52',2,'2006-02-15 21:30:53'),(3405,'2005-06-21 15:58:25',2344,155,'2005-06-23 10:58:25',1,'2006-02-15 21:30:53'),(3406,'2005-06-21 16:00:18',2049,203,'2005-06-23 18:25:18',1,'2006-02-15 21:30:53'),(3407,'2005-06-21 16:14:02',3919,343,'2005-06-24 15:38:02',2,'2006-02-15 21:30:53'),(3408,'2005-06-21 16:15:11',3453,282,'2005-06-27 14:55:11',1,'2006-02-15 21:30:53'),(3409,'2005-06-21 16:17:38',3374,429,'2005-06-22 14:16:38',1,'2006-02-15 21:30:53'),(3410,'2005-06-21 16:20:47',1197,321,'2005-06-24 19:09:47',2,'2006-02-15 21:30:53'),(3411,'2005-06-21 16:31:27',4250,12,'2005-06-28 12:27:27',2,'2006-02-15 21:30:53'),(3412,'2005-06-21 16:44:31',3036,501,'2005-06-28 16:15:31',2,'2006-02-15 21:30:53'),(3413,'2005-06-21 16:57:07',666,322,'2005-06-30 12:03:07',2,'2006-02-15 21:30:53'),(3414,'2005-06-21 16:58:50',2929,226,'2005-06-24 17:26:50',1,'2006-02-15 21:30:53'),(3415,'2005-06-21 16:59:49',3540,444,'2005-06-27 17:19:49',1,'2006-02-15 21:30:53'),(3416,'2005-06-21 17:05:29',1215,76,'2005-06-23 17:58:29',2,'2006-02-15 21:30:53'),(3417,'2005-06-21 17:06:20',874,282,'2005-06-23 17:00:20',2,'2006-02-15 21:30:53'),(3418,'2005-06-21 17:06:38',4115,85,'2005-06-25 19:43:38',1,'2006-02-15 21:30:53'),(3419,'2005-06-21 17:18:01',4022,22,'2005-06-22 15:08:01',1,'2006-02-15 21:30:53'),(3420,'2005-06-21 17:22:36',2523,27,'2005-06-28 12:34:36',1,'2006-02-15 21:30:53'),(3421,'2005-06-21 17:22:58',3930,346,'2005-06-24 18:57:58',1,'2006-02-15 21:30:53'),(3422,'2005-06-21 17:24:40',2724,251,'2005-06-29 13:59:40',2,'2006-02-15 21:30:53'),(3423,'2005-06-21 17:38:02',3612,19,'2005-06-23 19:47:02',1,'2006-02-15 21:30:53'),(3424,'2005-06-21 17:42:51',1279,583,'2005-06-24 23:22:51',2,'2006-02-15 21:30:53'),(3425,'2005-06-21 18:07:07',4548,381,'2005-06-27 22:59:07',2,'2006-02-15 21:30:53'),(3426,'2005-06-21 18:12:10',3019,95,'2005-06-23 18:22:10',1,'2006-02-15 21:30:53'),(3427,'2005-06-21 18:31:09',560,561,'2005-06-22 14:18:09',2,'2006-02-15 21:30:53'),(3428,'2005-06-21 18:39:34',1959,40,'2005-06-22 18:23:34',2,'2006-02-15 21:30:53'),(3429,'2005-06-21 18:46:05',456,599,'2005-06-30 17:28:05',1,'2006-02-15 21:30:53'),(3430,'2005-06-21 18:46:08',1613,503,'2005-06-22 13:49:08',2,'2006-02-15 21:30:53'),(3431,'2005-06-21 18:46:48',133,516,'2005-06-26 23:08:48',1,'2006-02-15 21:30:53'),(3432,'2005-06-21 19:02:03',1814,216,'2005-06-25 00:57:03',2,'2006-02-15 21:30:53'),(3433,'2005-06-21 19:07:19',1077,228,'2005-06-29 18:01:19',2,'2006-02-15 21:30:53'),(3434,'2005-06-21 19:08:28',2295,141,'2005-06-23 14:25:28',1,'2006-02-15 21:30:53'),(3435,'2005-06-21 19:14:58',451,591,'2005-06-24 19:58:58',1,'2006-02-15 21:30:53'),(3436,'2005-06-21 19:16:09',2740,137,'2005-06-30 13:58:09',2,'2006-02-15 21:30:53'),(3437,'2005-06-21 19:20:17',1798,211,'2005-07-01 01:09:17',2,'2006-02-15 21:30:53'),(3438,'2005-06-21 19:31:40',1757,556,'2005-06-30 19:08:40',1,'2006-02-15 21:30:53'),(3439,'2005-06-21 19:36:15',1529,46,'2005-06-23 14:54:15',2,'2006-02-15 21:30:53'),(3440,'2005-06-21 19:58:18',853,491,'2005-06-27 22:08:18',1,'2006-02-15 21:30:53'),(3441,'2005-06-21 20:00:12',2863,326,'2005-06-24 00:24:12',2,'2006-02-15 21:30:53'),(3442,'2005-06-21 20:06:51',1896,255,'2005-06-25 17:35:51',2,'2006-02-15 21:30:53'),(3443,'2005-06-21 20:19:00',1639,377,'2005-06-30 15:39:00',1,'2006-02-15 21:30:53'),(3444,'2005-06-21 20:39:39',493,45,'2005-06-25 23:44:39',2,'2006-02-15 21:30:53'),(3445,'2005-06-21 20:40:28',2381,74,'2005-06-29 00:47:28',2,'2006-02-15 21:30:53'),(3446,'2005-06-21 20:45:51',1817,174,'2005-06-26 17:02:51',1,'2006-02-15 21:30:53'),(3447,'2005-06-21 20:53:31',1146,25,'2005-06-24 02:20:31',2,'2006-02-15 21:30:53'),(3448,'2005-06-21 20:59:20',592,476,'2005-06-24 15:40:20',1,'2006-02-15 21:30:53'),(3449,'2005-06-21 21:01:27',210,181,'2005-06-27 21:20:27',1,'2006-02-15 21:30:53'),(3450,'2005-06-21 21:01:57',2268,126,'2005-06-25 23:57:57',1,'2006-02-15 21:30:53'),(3451,'2005-06-21 21:10:39',3489,558,'2005-06-30 19:03:39',2,'2006-02-15 21:30:53'),(3452,'2005-06-21 21:11:27',2646,293,'2005-06-24 16:31:27',1,'2006-02-15 21:30:53'),(3453,'2005-06-21 21:12:11',842,278,'2005-06-23 17:39:11',2,'2006-02-15 21:30:53'),(3454,'2005-06-21 21:12:13',3009,524,'2005-06-25 23:23:13',1,'2006-02-15 21:30:53'),(3455,'2005-06-21 21:17:51',4403,340,'2005-06-23 17:22:51',1,'2006-02-15 21:30:53'),(3456,'2005-06-21 21:19:47',1119,150,'2005-06-28 18:18:47',2,'2006-02-15 21:30:53'),(3457,'2005-06-21 21:42:33',883,312,'2005-06-30 19:54:33',2,'2006-02-15 21:30:53'),(3458,'2005-06-21 21:42:49',2136,338,'2005-06-29 01:26:49',1,'2006-02-15 21:30:53'),(3459,'2005-06-21 21:45:47',3080,97,'2005-06-25 00:46:47',1,'2006-02-15 21:30:53'),(3460,'2005-06-21 21:46:56',1765,236,'2005-06-29 20:08:56',1,'2006-02-15 21:30:53'),(3461,'2005-06-21 21:49:18',1715,23,'2005-06-26 19:51:18',1,'2006-02-15 21:30:53'),(3462,'2005-06-21 21:52:52',547,568,'2005-06-28 21:41:52',1,'2006-02-15 21:30:53'),(3463,'2005-06-21 22:00:00',3436,96,'2005-06-22 19:22:00',2,'2006-02-15 21:30:53'),(3464,'2005-06-21 22:08:58',2698,251,'2005-06-26 16:23:58',2,'2006-02-15 21:30:53'),(3465,'2005-06-21 22:10:01',1488,510,'2005-06-30 21:35:01',1,'2006-02-15 21:30:53'),(3466,'2005-06-21 22:13:33',371,226,'2005-06-25 21:01:33',2,'2006-02-15 21:30:53'),(3467,'2005-06-21 22:19:25',729,543,'2005-06-27 00:03:25',2,'2006-02-15 21:30:53'),(3468,'2005-06-21 22:43:45',2899,100,'2005-06-30 01:49:45',1,'2006-02-15 21:30:53'),(3469,'2005-06-21 22:48:59',4087,181,'2005-06-28 19:32:59',1,'2006-02-15 21:30:53'),(3470,'2005-07-05 22:49:24',883,565,'2005-07-07 19:36:24',1,'2006-02-15 21:30:53'),(3471,'2005-07-05 22:51:44',1724,242,'2005-07-13 01:38:44',2,'2006-02-15 21:30:53'),(3472,'2005-07-05 22:56:33',841,37,'2005-07-13 17:18:33',2,'2006-02-15 21:30:53'),(3473,'2005-07-05 22:57:34',2735,60,'2005-07-12 23:53:34',1,'2006-02-15 21:30:53'),(3474,'2005-07-05 22:59:53',97,594,'2005-07-08 20:32:53',1,'2006-02-15 21:30:53'),(3475,'2005-07-05 23:01:21',2189,8,'2005-07-13 23:07:21',2,'2006-02-15 21:30:53'),(3476,'2005-07-05 23:02:37',3011,490,'2005-07-10 22:17:37',2,'2006-02-15 21:30:53'),(3477,'2005-07-05 23:05:17',4289,476,'2005-07-15 02:20:17',2,'2006-02-15 21:30:53'),(3478,'2005-07-05 23:05:44',2528,322,'2005-07-07 00:14:44',2,'2006-02-15 21:30:53'),(3479,'2005-07-05 23:08:53',2277,298,'2005-07-11 21:42:53',1,'2006-02-15 21:30:53'),(3480,'2005-07-05 23:11:43',1488,382,'2005-07-12 02:01:43',2,'2006-02-15 21:30:53'),(3481,'2005-07-05 23:13:07',3575,138,'2005-07-07 20:36:07',2,'2006-02-15 21:30:53'),(3482,'2005-07-05 23:13:22',1291,520,'2005-07-12 19:02:22',2,'2006-02-15 21:30:53'),(3483,'2005-07-05 23:13:51',79,536,'2005-07-13 18:31:51',1,'2006-02-15 21:30:53'),(3484,'2005-07-05 23:23:11',1934,114,'2005-07-11 00:27:11',2,'2006-02-15 21:30:53'),(3485,'2005-07-05 23:25:54',117,111,'2005-07-09 17:38:54',1,'2006-02-15 21:30:53'),(3486,'2005-07-05 23:29:55',4067,296,'2005-07-13 19:54:55',1,'2006-02-15 21:30:53'),(3487,'2005-07-05 23:30:36',1575,586,'2005-07-11 04:00:36',1,'2006-02-15 21:30:53'),(3488,'2005-07-05 23:32:49',898,349,'2005-07-15 02:01:49',2,'2006-02-15 21:30:53'),(3489,'2005-07-05 23:33:40',2936,397,'2005-07-15 02:15:40',2,'2006-02-15 21:30:53'),(3490,'2005-07-05 23:37:13',3041,369,'2005-07-12 22:07:13',1,'2006-02-15 21:30:53'),(3491,'2005-07-05 23:41:08',1835,421,'2005-07-13 21:53:08',1,'2006-02-15 21:30:53'),(3492,'2005-07-05 23:44:37',980,142,'2005-07-14 03:54:37',1,'2006-02-15 21:30:53'),(3493,'2005-07-05 23:46:19',473,169,'2005-07-15 02:31:19',1,'2006-02-15 21:30:53'),(3494,'2005-07-05 23:47:30',3149,348,'2005-07-11 18:10:30',1,'2006-02-15 21:30:53'),(3495,'2005-07-05 23:50:04',2306,553,'2005-07-10 01:06:04',1,'2006-02-15 21:30:53'),(3496,'2005-07-05 23:59:15',2430,295,'2005-07-09 19:39:15',2,'2006-02-15 21:30:53'),(3497,'2005-07-06 00:00:03',1970,299,'2005-07-09 01:27:03',1,'2006-02-15 21:30:53'),(3498,'2005-07-06 00:02:08',1869,444,'2005-07-10 00:19:08',1,'2006-02-15 21:30:53'),(3499,'2005-07-06 00:04:20',1850,520,'2005-07-14 21:12:20',2,'2006-02-15 21:30:53'),(3500,'2005-07-06 00:11:13',2447,32,'2005-07-13 19:01:13',2,'2006-02-15 21:30:53'),(3501,'2005-07-06 00:11:28',2219,270,'2005-07-10 20:32:28',2,'2006-02-15 21:30:53'),(3502,'2005-07-06 00:15:06',1026,126,'2005-07-13 01:35:06',1,'2006-02-15 21:30:53'),(3503,'2005-07-06 00:17:24',2944,449,'2005-07-08 03:47:24',1,'2006-02-15 21:30:53'),(3504,'2005-07-06 00:18:29',268,209,'2005-07-10 00:24:29',2,'2006-02-15 21:30:53'),(3505,'2005-07-06 00:19:32',2630,331,'2005-07-14 20:14:32',2,'2006-02-15 21:30:53'),(3506,'2005-07-06 00:22:29',19,459,'2005-07-07 22:15:29',1,'2006-02-15 21:30:53'),(3507,'2005-07-06 00:23:43',166,480,'2005-07-15 04:19:43',1,'2006-02-15 21:30:53'),(3508,'2005-07-06 00:24:25',2381,34,'2005-07-10 05:38:25',2,'2006-02-15 21:30:53'),(3509,'2005-07-06 00:24:57',4394,182,'2005-07-09 18:48:57',2,'2006-02-15 21:30:53'),(3510,'2005-07-06 00:27:41',2250,443,'2005-07-14 23:20:41',2,'2006-02-15 21:30:53'),(3511,'2005-07-06 00:42:01',2128,494,'2005-07-09 23:08:01',1,'2006-02-15 21:30:53'),(3512,'2005-07-06 00:43:06',371,291,'2005-07-12 06:18:06',2,'2006-02-15 21:30:53'),(3513,'2005-07-06 00:45:57',4225,223,'2005-07-11 19:04:57',2,'2006-02-15 21:30:53'),(3514,'2005-07-06 00:46:54',4546,536,'2005-07-09 05:47:54',1,'2006-02-15 21:30:53'),(3515,'2005-07-06 00:48:55',3220,131,'2005-07-09 00:15:55',1,'2006-02-15 21:30:53'),(3516,'2005-07-06 00:50:30',385,338,'2005-07-09 19:12:30',2,'2006-02-15 21:30:53'),(3517,'2005-07-06 00:52:35',2762,314,'2005-07-08 20:10:35',2,'2006-02-15 21:30:53'),(3518,'2005-07-06 00:56:03',2502,167,'2005-07-14 02:27:03',1,'2006-02-15 21:30:53'),(3519,'2005-07-06 00:57:29',4314,320,'2005-07-10 21:12:29',2,'2006-02-15 21:30:53'),(3520,'2005-07-06 00:58:27',2872,102,'2005-07-14 05:56:27',1,'2006-02-15 21:30:53'),(3521,'2005-07-06 01:00:11',1440,262,'2005-07-11 19:15:11',2,'2006-02-15 21:30:53'),(3522,'2005-07-06 01:00:21',4522,469,'2005-07-11 01:18:21',1,'2006-02-15 21:30:53'),(3523,'2005-07-06 01:01:38',2171,549,'2005-07-10 20:24:38',2,'2006-02-15 21:30:53'),(3524,'2005-07-06 01:01:51',1626,88,'2005-07-11 19:52:51',2,'2006-02-15 21:30:53'),(3525,'2005-07-06 01:02:39',208,51,'2005-07-14 02:27:39',1,'2006-02-15 21:30:53'),(3526,'2005-07-06 01:03:29',3871,469,'2005-07-15 01:22:29',2,'2006-02-15 21:30:53'),(3527,'2005-07-06 01:11:08',4537,389,'2005-07-08 01:21:08',1,'2006-02-15 21:30:53'),(3528,'2005-07-06 01:13:27',1954,201,'2005-07-06 23:45:27',2,'2006-02-15 21:30:53'),(3529,'2005-07-06 01:15:26',4316,350,'2005-07-07 04:28:26',1,'2006-02-15 21:30:53'),(3530,'2005-07-06 01:22:45',4542,168,'2005-07-10 03:23:45',1,'2006-02-15 21:30:53'),(3531,'2005-07-06 01:24:08',1890,165,'2005-07-11 22:00:08',2,'2006-02-15 21:30:53'),(3532,'2005-07-06 01:24:38',2635,274,'2005-07-11 06:42:38',2,'2006-02-15 21:30:53'),(3533,'2005-07-06 01:26:44',2028,206,'2005-07-14 21:37:44',1,'2006-02-15 21:30:53'),(3534,'2005-07-06 01:32:27',2055,283,'2005-07-08 23:14:27',1,'2006-02-15 21:30:53'),(3535,'2005-07-06 01:32:46',4214,65,'2005-07-11 03:15:46',1,'2006-02-15 21:30:53'),(3536,'2005-07-06 01:36:11',2328,339,'2005-07-12 20:00:11',2,'2006-02-15 21:30:53'),(3537,'2005-07-06 01:36:53',4220,479,'2005-07-13 07:01:53',2,'2006-02-15 21:30:53'),(3538,'2005-07-06 01:37:07',4361,228,'2005-07-11 06:02:07',2,'2006-02-15 21:30:53'),(3539,'2005-07-06 01:39:08',4081,444,'2005-07-07 05:38:08',1,'2006-02-15 21:30:53'),(3540,'2005-07-06 01:47:20',1295,97,'2005-07-08 23:48:20',2,'2006-02-15 21:30:53'),(3541,'2005-07-06 01:50:11',1204,501,'2005-07-12 03:24:11',1,'2006-02-15 21:30:53'),(3542,'2005-07-06 01:51:42',4391,593,'2005-07-11 03:29:42',1,'2006-02-15 21:30:53'),(3543,'2005-07-06 02:01:08',3997,394,'2005-07-07 03:14:08',1,'2006-02-15 21:30:53'),(3544,'2005-07-06 02:06:32',3098,115,'2005-07-09 04:35:32',2,'2006-02-15 21:30:53'),(3545,'2005-07-06 02:16:17',3924,442,'2005-07-11 00:54:17',1,'2006-02-15 21:30:53'),(3546,'2005-07-06 02:17:54',959,594,'2005-07-07 00:19:54',1,'2006-02-15 21:30:53'),(3547,'2005-07-06 02:18:06',2730,239,'2005-07-08 05:24:06',1,'2006-02-15 21:30:53'),(3548,'2005-07-06 02:23:39',4498,16,'2005-07-08 07:53:39',2,'2006-02-15 21:30:53'),(3549,'2005-07-06 02:24:55',3921,19,'2005-07-06 21:40:55',2,'2006-02-15 21:30:53'),(3550,'2005-07-06 02:29:21',2417,15,'2005-07-13 05:26:21',2,'2006-02-15 21:30:53'),(3551,'2005-07-06 02:33:48',3602,111,'2005-07-13 04:38:48',1,'2006-02-15 21:30:53'),(3552,'2005-07-06 02:34:09',1099,239,'2005-07-12 05:31:09',1,'2006-02-15 21:30:53'),(3553,'2005-07-06 02:35:41',4510,422,'2005-07-08 06:38:41',2,'2006-02-15 21:30:53'),(3554,'2005-07-06 02:37:10',793,538,'2005-07-09 01:58:10',1,'2006-02-15 21:30:53'),(3555,'2005-07-06 02:45:35',869,537,'2005-07-10 07:17:35',1,'2006-02-15 21:30:53'),(3556,'2005-07-06 02:46:13',3142,273,'2005-07-06 22:08:13',1,'2006-02-15 21:30:53'),(3557,'2005-07-06 02:48:39',3832,292,'2005-07-08 22:52:39',2,'2006-02-15 21:30:53'),(3558,'2005-07-06 02:49:06',1742,575,'2005-07-15 01:38:06',2,'2006-02-15 21:30:53'),(3559,'2005-07-06 02:49:42',2211,483,'2005-07-12 04:44:42',1,'2006-02-15 21:30:53'),(3560,'2005-07-06 02:51:37',888,592,'2005-07-10 01:35:37',2,'2006-02-15 21:30:53'),(3561,'2005-07-06 02:54:33',213,231,'2005-07-14 07:44:33',2,'2006-02-15 21:30:53'),(3562,'2005-07-06 02:54:36',1660,587,'2005-07-11 05:48:36',1,'2006-02-15 21:30:53'),(3563,'2005-07-06 02:57:01',4261,210,'2005-07-14 02:25:01',2,'2006-02-15 21:30:53'),(3564,'2005-07-06 03:02:13',1096,402,'2005-07-13 01:41:13',2,'2006-02-15 21:30:53'),(3565,'2005-07-06 03:02:58',599,97,'2005-07-13 21:31:58',2,'2006-02-15 21:30:53'),(3566,'2005-07-06 03:08:51',2774,392,'2005-07-12 05:04:51',1,'2006-02-15 21:30:53'),(3567,'2005-07-06 03:09:36',27,355,'2005-07-12 02:15:36',1,'2006-02-15 21:30:53'),(3568,'2005-07-06 03:11:57',2084,283,'2005-07-15 03:14:57',1,'2006-02-15 21:30:53'),(3569,'2005-07-06 03:17:23',1929,496,'2005-07-14 03:58:23',1,'2006-02-15 21:30:53'),(3570,'2005-07-06 03:23:43',1300,450,'2005-07-14 07:28:43',2,'2006-02-15 21:30:53'),(3571,'2005-07-06 03:32:31',4166,580,'2005-07-11 06:15:31',1,'2006-02-15 21:30:53'),(3572,'2005-07-06 03:33:23',1915,284,'2005-07-08 07:54:23',1,'2006-02-15 21:30:53'),(3573,'2005-07-06 03:33:48',146,66,'2005-07-07 22:39:48',1,'2006-02-15 21:30:53'),(3574,'2005-07-06 03:36:01',2799,225,'2005-07-10 01:29:01',2,'2006-02-15 21:30:53'),(3575,'2005-07-06 03:36:19',3234,49,'2005-07-08 06:21:19',1,'2006-02-15 21:30:53'),(3576,'2005-07-06 03:40:01',324,227,'2005-07-15 07:22:01',1,'2006-02-15 21:30:53'),(3577,'2005-07-06 03:40:36',4390,152,'2005-07-10 05:54:36',2,'2006-02-15 21:30:53'),(3578,'2005-07-06 03:47:05',2954,263,'2005-07-08 02:26:05',1,'2006-02-15 21:30:53'),(3579,'2005-07-06 03:47:47',3309,485,'2005-07-08 02:16:47',2,'2006-02-15 21:30:53'),(3580,'2005-07-06 03:48:44',3837,200,'2005-07-13 01:15:44',2,'2006-02-15 21:30:53'),(3581,'2005-07-06 03:57:35',4520,235,'2005-07-07 08:07:35',2,'2006-02-15 21:30:53'),(3582,'2005-07-06 04:10:35',1866,297,'2005-07-11 01:29:35',2,'2006-02-15 21:30:53'),(3583,'2005-07-06 04:10:43',204,574,'2005-07-14 22:17:43',2,'2006-02-15 21:30:53'),(3584,'2005-07-06 04:16:43',367,207,'2005-07-13 07:08:43',1,'2006-02-15 21:30:53'),(3585,'2005-07-06 04:22:36',2726,266,'2005-07-09 06:16:36',2,'2006-02-15 21:30:53'),(3586,'2005-07-06 04:24:42',616,493,'2005-07-09 02:37:42',1,'2006-02-15 21:30:53'),(3587,'2005-07-06 04:27:52',462,110,'2005-07-13 08:19:52',1,'2006-02-15 21:30:53'),(3588,'2005-07-06 04:29:13',3154,289,'2005-07-07 23:49:13',1,'2006-02-15 21:30:53'),(3589,'2005-07-06 04:30:18',3740,137,'2005-07-10 09:18:18',1,'2006-02-15 21:30:53'),(3590,'2005-07-06 04:35:12',1510,283,'2005-07-10 05:14:12',2,'2006-02-15 21:30:53'),(3591,'2005-07-06 04:37:10',1241,53,'2005-07-09 23:32:10',1,'2006-02-15 21:30:53'),(3592,'2005-07-06 04:38:50',1272,286,'2005-07-15 06:36:50',2,'2006-02-15 21:30:53'),(3593,'2005-07-06 04:39:52',619,78,'2005-07-11 23:20:52',2,'2006-02-15 21:30:53'),(3594,'2005-07-06 04:42:47',4566,522,'2005-07-10 00:49:47',1,'2006-02-15 21:30:53'),(3595,'2005-07-06 04:59:49',1431,92,'2005-07-15 06:26:49',2,'2006-02-15 21:30:53'),(3596,'2005-07-06 05:03:11',594,419,'2005-07-07 05:30:11',2,'2006-02-15 21:30:53'),(3597,'2005-07-06 05:03:59',4080,35,'2005-07-13 06:49:59',2,'2006-02-15 21:30:53'),(3598,'2005-07-06 05:11:04',1317,68,'2005-07-09 02:03:04',2,'2006-02-15 21:30:53'),(3599,'2005-07-06 05:16:36',3262,577,'2005-07-13 07:14:36',2,'2006-02-15 21:30:53'),(3600,'2005-07-06 05:19:42',2748,511,'2005-07-11 00:34:42',2,'2006-02-15 21:30:53'),(3601,'2005-07-06 05:20:25',2806,205,'2005-07-15 03:13:25',1,'2006-02-15 21:30:53'),(3602,'2005-07-06 05:23:10',2192,100,'2005-07-15 03:22:10',2,'2006-02-15 21:30:53'),(3603,'2005-07-06 05:25:03',2442,330,'2005-07-12 08:14:03',1,'2006-02-15 21:30:53'),(3604,'2005-07-06 05:25:22',1380,242,'2005-07-07 23:52:22',1,'2006-02-15 21:30:53'),(3605,'2005-07-06 05:27:15',384,347,'2005-07-10 00:05:15',2,'2006-02-15 21:30:53'),(3606,'2005-07-06 05:28:02',1737,166,'2005-07-10 04:51:02',1,'2006-02-15 21:30:53'),(3607,'2005-07-06 05:30:09',542,335,'2005-07-08 01:36:09',2,'2006-02-15 21:30:53'),(3608,'2005-07-06 05:35:39',3095,368,'2005-07-10 07:46:39',2,'2006-02-15 21:30:53'),(3609,'2005-07-06 05:36:22',1064,373,'2005-07-10 05:55:22',1,'2006-02-15 21:30:53'),(3610,'2005-07-06 05:36:59',1509,348,'2005-07-13 07:07:59',1,'2006-02-15 21:30:53'),(3611,'2005-07-06 05:37:18',4502,86,'2005-07-10 05:14:18',1,'2006-02-15 21:30:53'),(3612,'2005-07-06 05:37:26',2465,402,'2005-07-14 01:51:26',1,'2006-02-15 21:30:53'),(3613,'2005-07-06 05:45:53',3776,331,'2005-07-07 10:02:53',1,'2006-02-15 21:30:53'),(3614,'2005-07-06 05:46:05',853,502,'2005-07-11 01:24:05',2,'2006-02-15 21:30:53'),(3615,'2005-07-06 05:47:47',711,49,'2005-07-11 05:01:47',1,'2006-02-15 21:30:53'),(3616,'2005-07-06 05:52:13',557,571,'2005-07-10 10:24:13',1,'2006-02-15 21:30:53'),(3617,'2005-07-06 05:58:06',1337,125,'2005-07-13 02:10:06',1,'2006-02-15 21:30:53'),(3618,'2005-07-06 05:58:45',330,264,'2005-07-15 09:13:45',2,'2006-02-15 21:30:53'),(3619,'2005-07-06 05:59:44',3350,526,'2005-07-11 08:58:44',2,'2006-02-15 21:30:53'),(3620,'2005-07-06 06:01:50',1661,88,'2005-07-08 05:04:50',1,'2006-02-15 21:30:53'),(3621,'2005-07-06 06:03:55',3132,171,'2005-07-11 09:25:55',2,'2006-02-15 21:30:53'),(3622,'2005-07-06 06:05:04',3489,454,'2005-07-12 03:14:04',2,'2006-02-15 21:30:53'),(3623,'2005-07-06 06:05:23',430,80,'2005-07-07 05:59:23',1,'2006-02-15 21:30:53'),(3624,'2005-07-06 06:06:27',1778,115,'2005-07-13 08:30:27',2,'2006-02-15 21:30:53'),(3625,'2005-07-06 06:12:52',1133,175,'2005-07-12 07:37:52',1,'2006-02-15 21:30:53'),(3626,'2005-07-06 06:15:35',1599,337,'2005-07-10 10:18:35',2,'2006-02-15 21:30:53'),(3627,'2005-07-06 06:19:25',1087,322,'2005-07-11 05:53:25',1,'2006-02-15 21:30:53'),(3628,'2005-07-06 06:19:43',3509,588,'2005-07-07 02:23:43',1,'2006-02-15 21:30:53'),(3629,'2005-07-06 06:23:22',4019,441,'2005-07-08 09:32:22',2,'2006-02-15 21:30:53'),(3630,'2005-07-06 06:27:15',2448,102,'2005-07-12 10:36:15',1,'2006-02-15 21:30:53'),(3631,'2005-07-06 06:36:53',4068,47,'2005-07-07 10:32:53',1,'2006-02-15 21:30:53'),(3632,'2005-07-06 06:38:21',2583,366,'2005-07-11 03:19:21',1,'2006-02-15 21:30:53'),(3633,'2005-07-06 06:43:26',2978,95,'2005-07-10 04:54:26',1,'2006-02-15 21:30:53'),(3634,'2005-07-06 06:51:14',3688,245,'2005-07-10 02:30:14',1,'2006-02-15 21:30:53'),(3635,'2005-07-06 06:55:36',421,250,'2005-07-09 07:57:36',2,'2006-02-15 21:30:53'),(3636,'2005-07-06 07:03:52',3379,591,'2005-07-08 03:14:52',2,'2006-02-15 21:30:53'),(3637,'2005-07-06 07:06:31',3823,380,'2005-07-10 02:11:31',2,'2006-02-15 21:30:53'),(3638,'2005-07-06 07:08:17',190,452,'2005-07-13 12:30:17',1,'2006-02-15 21:30:53'),(3639,'2005-07-06 07:09:17',2812,7,'2005-07-15 05:12:17',2,'2006-02-15 21:30:53'),(3640,'2005-07-06 07:12:26',3432,271,'2005-07-10 04:54:26',2,'2006-02-15 21:30:53'),(3641,'2005-07-06 07:17:09',3834,79,'2005-07-11 07:25:09',1,'2006-02-15 21:30:53'),(3642,'2005-07-06 07:18:20',4204,166,'2005-07-09 01:37:20',1,'2006-02-15 21:30:53'),(3643,'2005-07-06 07:20:08',845,176,'2005-07-11 07:01:08',1,'2006-02-15 21:30:53'),(3644,'2005-07-06 07:20:11',4309,403,'2005-07-11 10:26:11',2,'2006-02-15 21:30:53'),(3645,'2005-07-06 07:22:09',3390,236,'2005-07-10 11:45:09',1,'2006-02-15 21:30:53'),(3646,'2005-07-06 07:28:59',3591,322,'2005-07-11 05:19:59',1,'2006-02-15 21:30:53'),(3647,'2005-07-06 07:29:17',3762,145,'2005-07-13 08:32:17',1,'2006-02-15 21:30:53'),(3648,'2005-07-06 07:30:41',2810,598,'2005-07-10 06:00:41',2,'2006-02-15 21:30:53'),(3649,'2005-07-06 07:32:42',3564,24,'2005-07-12 09:37:42',1,'2006-02-15 21:30:53'),(3650,'2005-07-06 07:34:15',3606,482,'2005-07-08 01:50:15',2,'2006-02-15 21:30:53'),(3651,'2005-07-06 07:40:31',3323,170,'2005-07-08 03:39:31',2,'2006-02-15 21:30:53'),(3652,'2005-07-06 07:44:30',1231,518,'2005-07-08 04:41:30',1,'2006-02-15 21:30:53'),(3653,'2005-07-06 07:45:13',2513,148,'2005-07-10 11:51:13',2,'2006-02-15 21:30:53'),(3654,'2005-07-06 07:45:31',1621,528,'2005-07-12 09:59:31',2,'2006-02-15 21:30:53'),(3655,'2005-07-06 07:52:54',1540,493,'2005-07-15 10:49:54',2,'2006-02-15 21:30:53'),(3656,'2005-07-06 07:55:22',4544,314,'2005-07-13 10:36:22',2,'2006-02-15 21:30:53'),(3657,'2005-07-06 07:55:30',4134,113,'2005-07-11 07:18:30',1,'2006-02-15 21:30:53'),(3658,'2005-07-06 08:01:08',3453,253,'2005-07-15 06:36:08',1,'2006-02-15 21:30:53'),(3659,'2005-07-06 08:03:14',2271,330,'2005-07-12 09:50:14',1,'2006-02-15 21:30:53'),(3660,'2005-07-06 08:07:29',1129,507,'2005-07-14 08:46:29',1,'2006-02-15 21:30:53'),(3661,'2005-07-06 08:10:02',2600,442,'2005-07-10 10:17:02',1,'2006-02-15 21:30:53'),(3662,'2005-07-06 08:11:48',3827,334,'2005-07-09 12:25:48',2,'2006-02-15 21:30:53'),(3663,'2005-07-06 08:15:47',2646,566,'2005-07-07 08:57:47',1,'2006-02-15 21:30:53'),(3664,'2005-07-06 08:15:57',3366,528,'2005-07-08 06:11:57',1,'2006-02-15 21:30:53'),(3665,'2005-07-06 08:23:08',922,102,'2005-07-13 13:38:08',2,'2006-02-15 21:30:53'),(3666,'2005-07-06 08:27:43',4212,347,'2005-07-09 07:37:43',2,'2006-02-15 21:30:53'),(3667,'2005-07-06 08:36:34',447,373,'2005-07-15 04:25:34',2,'2006-02-15 21:30:53'),(3668,'2005-07-06 08:36:48',269,514,'2005-07-10 11:31:48',1,'2006-02-15 21:30:53'),(3669,'2005-07-06 08:38:29',1299,530,'2005-07-10 05:28:29',1,'2006-02-15 21:30:53'),(3670,'2005-07-06 08:56:43',4271,268,'2005-07-11 09:11:43',1,'2006-02-15 21:30:53'),(3671,'2005-07-06 09:01:29',2821,179,'2005-07-15 08:08:29',1,'2006-02-15 21:30:53'),(3672,'2005-07-06 09:01:56',3883,283,'2005-07-11 14:18:56',1,'2006-02-15 21:30:53'),(3673,'2005-07-06 09:02:09',1837,88,'2005-07-15 06:45:09',2,'2006-02-15 21:30:53'),(3674,'2005-07-06 09:03:13',3686,559,'2005-07-13 08:43:13',1,'2006-02-15 21:30:53'),(3675,'2005-07-06 09:09:19',3662,282,'2005-07-12 08:51:19',1,'2006-02-15 21:30:53'),(3676,'2005-07-06 09:10:37',1967,137,'2005-07-14 08:24:37',1,'2006-02-15 21:30:53'),(3677,'2005-07-06 09:11:58',600,5,'2005-07-08 10:50:58',2,'2006-02-15 21:30:53'),(3678,'2005-07-06 09:15:15',3861,364,'2005-07-10 05:01:15',1,'2006-02-15 21:30:53'),(3679,'2005-07-06 09:15:57',2186,547,'2005-07-08 03:20:57',1,'2006-02-15 21:30:53'),(3680,'2005-07-06 09:16:10',2427,82,'2005-07-08 07:52:10',2,'2006-02-15 21:30:53'),(3681,'2005-07-06 09:19:30',3325,294,'2005-07-11 09:40:30',1,'2006-02-15 21:30:53'),(3682,'2005-07-06 09:22:48',2597,98,'2005-07-14 11:17:48',2,'2006-02-15 21:30:53'),(3683,'2005-07-06 09:25:56',3020,43,'2005-07-14 12:10:56',1,'2006-02-15 21:30:53'),(3684,'2005-07-06 09:29:22',3261,395,'2005-07-12 08:19:22',1,'2006-02-15 21:30:53'),(3685,'2005-07-06 09:30:45',2015,58,'2005-07-11 15:16:45',2,'2006-02-15 21:30:53'),(3686,'2005-07-06 09:37:50',376,548,'2005-07-09 10:15:50',2,'2006-02-15 21:30:53'),(3687,'2005-07-06 09:38:33',2040,207,'2005-07-14 07:50:33',1,'2006-02-15 21:30:53'),(3688,'2005-07-06 09:41:53',1102,380,'2005-07-14 10:30:53',2,'2006-02-15 21:30:53'),(3689,'2005-07-06 09:43:01',3168,129,'2005-07-11 09:57:01',1,'2006-02-15 21:30:53'),(3690,'2005-07-06 09:46:03',4405,435,'2005-07-07 12:12:03',1,'2006-02-15 21:30:53'),(3691,'2005-07-06 09:46:12',1937,478,'2005-07-07 14:08:12',1,'2006-02-15 21:30:53'),(3692,'2005-07-06 09:54:12',1237,286,'2005-07-11 09:42:12',2,'2006-02-15 21:30:53'),(3693,'2005-07-06 09:56:09',2989,545,'2005-07-15 06:50:09',2,'2006-02-15 21:30:53'),(3694,'2005-07-06 10:01:23',3848,419,'2005-07-08 11:44:23',2,'2006-02-15 21:30:53'),(3695,'2005-07-06 10:02:08',2823,441,'2005-07-09 15:43:08',1,'2006-02-15 21:30:53'),(3696,'2005-07-06 10:04:55',3244,497,'2005-07-11 15:58:55',2,'2006-02-15 21:30:53'),(3697,'2005-07-06 10:07:22',1223,182,'2005-07-13 14:04:22',2,'2006-02-15 21:30:53'),(3698,'2005-07-06 10:09:20',1263,461,'2005-07-08 15:49:20',1,'2006-02-15 21:30:53'),(3699,'2005-07-06 10:11:25',418,262,'2005-07-14 05:18:25',1,'2006-02-15 21:30:53'),(3700,'2005-07-06 10:12:19',343,72,'2005-07-07 14:21:19',2,'2006-02-15 21:30:53'),(3701,'2005-07-06 10:12:45',3679,31,'2005-07-09 08:52:45',1,'2006-02-15 21:30:53'),(3702,'2005-07-06 10:13:56',2204,428,'2005-07-10 08:12:56',1,'2006-02-15 21:30:53'),(3703,'2005-07-06 10:15:26',4276,421,'2005-07-13 13:00:26',1,'2006-02-15 21:30:53'),(3704,'2005-07-06 10:16:45',2687,323,'2005-07-13 12:44:45',2,'2006-02-15 21:30:53'),(3705,'2005-07-06 10:17:59',65,223,'2005-07-10 15:31:59',1,'2006-02-15 21:30:53'),(3706,'2005-07-06 10:18:01',681,132,'2005-07-09 09:07:01',2,'2006-02-15 21:30:53'),(3707,'2005-07-06 10:21:49',1080,14,'2005-07-12 05:14:49',2,'2006-02-15 21:30:53'),(3708,'2005-07-06 10:23:27',2105,201,'2005-07-14 09:26:27',1,'2006-02-15 21:30:53'),(3709,'2005-07-06 10:26:56',4033,187,'2005-07-15 13:51:56',2,'2006-02-15 21:30:53'),(3710,'2005-07-06 10:28:53',2596,228,'2005-07-15 06:17:53',2,'2006-02-15 21:30:53'),(3711,'2005-07-06 10:46:15',1914,75,'2005-07-07 09:25:15',2,'2006-02-15 21:30:53'),(3712,'2005-07-06 10:47:35',3741,504,'2005-07-15 09:39:35',1,'2006-02-15 21:30:53'),(3713,'2005-07-06 10:49:30',1823,504,'2005-07-13 10:44:30',1,'2006-02-15 21:30:53'),(3714,'2005-07-06 10:51:28',1985,276,'2005-07-09 13:57:28',2,'2006-02-15 21:30:53'),(3715,'2005-07-06 10:51:48',4456,228,'2005-07-11 06:08:48',1,'2006-02-15 21:30:53'),(3716,'2005-07-06 10:52:32',3271,92,'2005-07-14 08:45:32',2,'2006-02-15 21:30:53'),(3717,'2005-07-06 10:53:34',1677,173,'2005-07-07 13:43:34',2,'2006-02-15 21:30:53'),(3718,'2005-07-06 10:57:56',2624,56,'2005-07-12 12:54:56',1,'2006-02-15 21:30:53'),(3719,'2005-07-06 11:05:55',3573,376,'2005-07-11 08:10:55',2,'2006-02-15 21:30:53'),(3720,'2005-07-06 11:06:57',2958,96,'2005-07-09 14:16:57',1,'2006-02-15 21:30:53'),(3721,'2005-07-06 11:10:09',2654,226,'2005-07-11 07:45:09',2,'2006-02-15 21:30:53'),(3722,'2005-07-06 11:10:27',604,83,'2005-07-13 12:56:27',2,'2006-02-15 21:30:53'),(3723,'2005-07-06 11:12:02',4554,501,'2005-07-14 16:45:02',2,'2006-02-15 21:30:53'),(3724,'2005-07-06 11:12:48',3622,468,'2005-07-14 14:41:48',1,'2006-02-15 21:30:53'),(3725,'2005-07-06 11:15:04',2789,126,'2005-07-09 06:39:04',1,'2006-02-15 21:30:53'),(3726,'2005-07-06 11:15:49',742,363,'2005-07-11 05:54:49',2,'2006-02-15 21:30:53'),(3727,'2005-07-06 11:16:43',2886,57,'2005-07-07 15:39:43',1,'2006-02-15 21:30:53'),(3728,'2005-07-06 11:29:00',1798,298,'2005-07-11 06:28:00',1,'2006-02-15 21:30:53'),(3729,'2005-07-06 11:30:29',3156,90,'2005-07-12 07:18:29',1,'2006-02-15 21:30:53'),(3730,'2005-07-06 11:31:24',1665,355,'2005-07-15 06:53:24',1,'2006-02-15 21:30:53'),(3731,'2005-07-06 11:33:36',4133,558,'2005-07-15 12:23:36',2,'2006-02-15 21:30:53'),(3732,'2005-07-06 11:33:37',106,318,'2005-07-08 08:31:37',1,'2006-02-15 21:30:53'),(3733,'2005-07-06 11:33:55',3242,586,'2005-07-09 10:08:55',2,'2006-02-15 21:30:53'),(3734,'2005-07-06 11:40:27',4569,37,'2005-07-14 12:08:27',1,'2006-02-15 21:30:53'),(3735,'2005-07-06 11:42:04',2262,534,'2005-07-12 14:33:04',2,'2006-02-15 21:30:53'),(3736,'2005-07-06 11:43:44',1515,23,'2005-07-13 07:55:44',2,'2006-02-15 21:30:53'),(3737,'2005-07-06 11:45:53',123,403,'2005-07-13 15:27:53',1,'2006-02-15 21:30:53'),(3738,'2005-07-06 11:50:57',578,546,'2005-07-09 08:07:57',1,'2006-02-15 21:30:53'),(3739,'2005-07-06 11:54:18',4333,157,'2005-07-09 10:48:18',1,'2006-02-15 21:30:53'),(3740,'2005-07-06 11:55:35',1829,277,'2005-07-14 09:44:35',2,'2006-02-15 21:30:53'),(3741,'2005-07-06 12:00:18',1449,584,'2005-07-12 09:02:18',2,'2006-02-15 21:30:53'),(3742,'2005-07-06 12:01:38',2873,96,'2005-07-15 10:46:38',1,'2006-02-15 21:30:53'),(3743,'2005-07-06 12:03:54',1012,456,'2005-07-13 10:56:54',2,'2006-02-15 21:30:53'),(3744,'2005-07-06 12:10:02',3343,510,'2005-07-08 11:49:02',2,'2006-02-15 21:30:53'),(3745,'2005-07-06 12:10:32',1518,171,'2005-07-12 15:20:32',1,'2006-02-15 21:30:53'),(3746,'2005-07-06 12:10:51',3387,424,'2005-07-07 11:36:51',2,'2006-02-15 21:30:53'),(3747,'2005-07-06 12:11:14',1093,437,'2005-07-09 17:14:14',2,'2006-02-15 21:30:53'),(3748,'2005-07-06 12:11:22',2920,79,'2005-07-12 07:22:22',1,'2006-02-15 21:30:53'),(3749,'2005-07-06 12:18:03',1531,170,'2005-07-11 07:25:03',1,'2006-02-15 21:30:53'),(3750,'2005-07-06 12:19:28',2422,103,'2005-07-14 13:16:28',2,'2006-02-15 21:30:53'),(3751,'2005-07-06 12:23:41',3652,128,'2005-07-10 06:58:41',1,'2006-02-15 21:30:53'),(3752,'2005-07-06 12:30:12',4561,235,'2005-07-13 12:13:12',1,'2006-02-15 21:30:53'),(3753,'2005-07-06 12:34:06',774,358,'2005-07-07 14:19:06',2,'2006-02-15 21:30:53'),(3754,'2005-07-06 12:35:44',4042,83,'2005-07-08 16:28:44',1,'2006-02-15 21:30:53'),(3755,'2005-07-06 12:37:16',3147,402,'2005-07-13 07:22:16',1,'2006-02-15 21:30:53'),(3756,'2005-07-06 12:40:38',30,320,'2005-07-11 09:29:38',1,'2006-02-15 21:30:53'),(3757,'2005-07-06 12:42:26',2816,66,'2005-07-11 10:30:26',1,'2006-02-15 21:30:53'),(3758,'2005-07-06 12:43:11',2498,48,'2005-07-14 12:52:11',2,'2006-02-15 21:30:53'),(3759,'2005-07-06 12:46:38',4165,378,'2005-07-10 11:31:38',1,'2006-02-15 21:30:53'),(3760,'2005-07-06 12:49:28',1306,330,'2005-07-09 16:29:28',1,'2006-02-15 21:30:53'),(3761,'2005-07-06 12:52:44',4304,464,'2005-07-08 17:22:44',1,'2006-02-15 21:30:53'),(3762,'2005-07-06 12:52:49',1941,413,'2005-07-12 11:41:49',1,'2006-02-15 21:30:53'),(3763,'2005-07-06 12:56:31',1573,189,'2005-07-09 14:49:31',1,'2006-02-15 21:30:53'),(3764,'2005-07-06 13:01:03',3115,470,'2005-07-13 15:26:03',1,'2006-02-15 21:30:53'),(3765,'2005-07-06 13:01:47',1805,547,'2005-07-09 07:10:47',1,'2006-02-15 21:30:53'),(3766,'2005-07-06 13:04:35',4504,312,'2005-07-07 15:46:35',1,'2006-02-15 21:30:53'),(3767,'2005-07-06 13:07:27',923,582,'2005-07-08 18:48:27',1,'2006-02-15 21:30:53'),(3768,'2005-07-06 13:07:30',3995,573,'2005-07-09 16:26:30',2,'2006-02-15 21:30:53'),(3769,'2005-07-06 13:11:33',467,567,'2005-07-14 17:54:33',2,'2006-02-15 21:30:53'),(3770,'2005-07-06 13:14:28',3836,198,'2005-07-13 09:23:28',1,'2006-02-15 21:30:53'),(3771,'2005-07-06 13:19:34',1373,56,'2005-07-10 10:27:34',2,'2006-02-15 21:30:53'),(3772,'2005-07-06 13:22:53',434,338,'2005-07-10 11:54:53',2,'2006-02-15 21:30:53'),(3773,'2005-07-06 13:23:34',2034,263,'2005-07-08 17:23:34',2,'2006-02-15 21:30:53'),(3774,'2005-07-06 13:25:07',4044,439,'2005-07-15 12:56:07',2,'2006-02-15 21:30:53'),(3775,'2005-07-06 13:27:33',3696,300,'2005-07-09 10:27:33',1,'2006-02-15 21:30:53'),(3776,'2005-07-06 13:31:37',4387,278,'2005-07-10 10:53:37',2,'2006-02-15 21:30:53'),(3777,'2005-07-06 13:36:48',2470,548,'2005-07-11 14:26:48',1,'2006-02-15 21:30:53'),(3778,'2005-07-06 13:44:48',2181,122,'2005-07-13 09:31:48',2,'2006-02-15 21:30:53'),(3779,'2005-07-06 13:46:36',634,583,'2005-07-10 15:49:36',2,'2006-02-15 21:30:53'),(3780,'2005-07-06 13:52:02',1209,99,'2005-07-15 08:41:02',2,'2006-02-15 21:30:53'),(3781,'2005-07-06 13:53:41',3894,23,'2005-07-15 10:03:41',1,'2006-02-15 21:30:53'),(3782,'2005-07-06 13:57:03',3365,515,'2005-07-09 11:13:03',2,'2006-02-15 21:30:53'),(3783,'2005-07-06 13:57:31',2345,386,'2005-07-14 10:44:31',2,'2006-02-15 21:30:53'),(3784,'2005-07-06 13:57:56',2287,165,'2005-07-14 17:24:56',2,'2006-02-15 21:30:53'),(3785,'2005-07-06 14:00:13',3279,577,'2005-07-14 10:13:13',2,'2006-02-15 21:30:53'),(3786,'2005-07-06 14:00:41',4508,152,'2005-07-13 16:49:41',1,'2006-02-15 21:30:53'),(3787,'2005-07-06 14:02:01',288,474,'2005-07-09 19:09:01',2,'2006-02-15 21:30:53'),(3788,'2005-07-06 14:02:02',1363,379,'2005-07-10 18:24:02',1,'2006-02-15 21:30:53'),(3789,'2005-07-06 14:02:26',3560,595,'2005-07-14 18:13:26',1,'2006-02-15 21:30:53'),(3790,'2005-07-06 14:13:45',1711,10,'2005-07-14 13:35:45',1,'2006-02-15 21:30:53'),(3791,'2005-07-06 14:24:56',3426,452,'2005-07-14 11:06:56',2,'2006-02-15 21:30:53'),(3792,'2005-07-06 14:26:38',2651,312,'2005-07-11 16:34:38',1,'2006-02-15 21:30:53'),(3793,'2005-07-06 14:32:44',4558,553,'2005-07-08 13:55:44',1,'2006-02-15 21:30:53'),(3794,'2005-07-06 14:35:26',584,499,'2005-07-11 14:40:26',2,'2006-02-15 21:30:53'),(3795,'2005-07-06 14:37:41',240,153,'2005-07-11 20:27:41',2,'2006-02-15 21:30:53'),(3796,'2005-07-06 14:45:22',1649,228,'2005-07-07 11:01:22',2,'2006-02-15 21:30:53'),(3797,'2005-07-06 14:54:52',1047,374,'2005-07-10 09:50:52',2,'2006-02-15 21:30:53'),(3798,'2005-07-06 14:57:53',1942,479,'2005-07-07 10:48:53',2,'2006-02-15 21:30:53'),(3799,'2005-07-06 15:00:14',4532,251,'2005-07-10 15:39:14',1,'2006-02-15 21:30:53'),(3800,'2005-07-06 15:01:27',4004,100,'2005-07-15 11:12:27',2,'2006-02-15 21:30:53'),(3801,'2005-07-06 15:05:50',4209,68,'2005-07-12 12:56:50',1,'2006-02-15 21:30:53'),(3802,'2005-07-06 15:06:09',1017,91,'2005-07-08 09:33:09',2,'2006-02-15 21:30:53'),(3803,'2005-07-06 15:06:55',2062,494,'2005-07-08 18:53:55',1,'2006-02-15 21:30:53'),(3804,'2005-07-06 15:08:08',537,126,'2005-07-15 14:01:08',2,'2006-02-15 21:30:53'),(3805,'2005-07-06 15:08:42',1716,418,'2005-07-07 14:34:42',1,'2006-02-15 21:30:53'),(3806,'2005-07-06 15:09:41',3555,154,'2005-07-14 09:14:41',2,'2006-02-15 21:30:53'),(3807,'2005-07-06 15:11:44',39,425,'2005-07-10 09:20:44',1,'2006-02-15 21:30:53'),(3808,'2005-07-06 15:15:35',4339,314,'2005-07-07 16:10:35',1,'2006-02-15 21:30:53'),(3809,'2005-07-06 15:16:37',2932,358,'2005-07-09 14:45:37',1,'2006-02-15 21:30:53'),(3810,'2005-07-06 15:18:44',342,296,'2005-07-12 09:52:44',2,'2006-02-15 21:30:53'),(3811,'2005-07-06 15:20:37',695,208,'2005-07-08 16:26:37',2,'2006-02-15 21:30:53'),(3812,'2005-07-06 15:22:19',4490,381,'2005-07-08 13:04:19',1,'2006-02-15 21:30:53'),(3813,'2005-07-06 15:23:34',4100,189,'2005-07-08 19:03:34',1,'2006-02-15 21:30:53'),(3814,'2005-07-06 15:23:56',3826,306,'2005-07-13 20:51:56',2,'2006-02-15 21:30:53'),(3815,'2005-07-06 15:26:36',4038,472,'2005-07-11 17:07:36',2,'2006-02-15 21:30:53'),(3816,'2005-07-06 15:27:04',2941,489,'2005-07-14 13:12:04',1,'2006-02-15 21:30:53'),(3817,'2005-07-06 15:31:45',2933,267,'2005-07-11 17:11:45',1,'2006-02-15 21:30:53'),(3818,'2005-07-06 15:33:31',653,97,'2005-07-11 16:35:31',1,'2006-02-15 21:30:53'),(3819,'2005-07-06 15:35:06',1814,74,'2005-07-14 19:08:06',1,'2006-02-15 21:30:53'),(3820,'2005-07-06 15:35:26',4192,460,'2005-07-11 12:22:26',2,'2006-02-15 21:30:53'),(3821,'2005-07-06 15:36:20',4385,354,'2005-07-11 20:04:20',1,'2006-02-15 21:30:53'),(3822,'2005-07-06 15:41:15',1314,241,'2005-07-07 16:41:15',1,'2006-02-15 21:30:53'),(3823,'2005-07-06 15:41:27',124,265,'2005-07-09 09:48:27',1,'2006-02-15 21:30:53'),(3824,'2005-07-06 15:43:15',3107,107,'2005-07-13 16:05:15',2,'2006-02-15 21:30:53'),(3825,'2005-07-06 15:50:03',630,132,'2005-07-09 19:20:03',1,'2006-02-15 21:30:53'),(3826,'2005-07-06 15:51:58',73,451,'2005-07-13 12:35:58',1,'2006-02-15 21:30:53'),(3827,'2005-07-06 15:52:03',2072,41,'2005-07-08 21:43:03',2,'2006-02-15 21:30:53'),(3828,'2005-07-06 15:57:30',4493,498,'2005-07-10 12:17:30',2,'2006-02-15 21:30:53'),(3829,'2005-07-06 15:59:40',4126,356,'2005-07-11 10:29:40',1,'2006-02-15 21:30:53'),(3830,'2005-07-06 16:01:16',553,310,'2005-07-15 19:35:16',2,'2006-02-15 21:30:53'),(3831,'2005-07-06 16:06:35',1338,206,'2005-07-08 15:14:35',2,'2006-02-15 21:30:53'),(3832,'2005-07-06 16:12:23',4499,233,'2005-07-12 21:29:23',1,'2006-02-15 21:30:53'),(3833,'2005-07-06 16:18:28',3232,416,'2005-07-14 20:09:28',2,'2006-02-15 21:30:53'),(3834,'2005-07-06 16:19:56',3001,366,'2005-07-13 11:38:56',2,'2006-02-15 21:30:53'),(3835,'2005-07-06 16:22:45',935,486,'2005-07-11 17:04:45',2,'2006-02-15 21:30:53'),(3836,'2005-07-06 16:26:04',1148,351,'2005-07-10 15:08:04',1,'2006-02-15 21:30:53'),(3837,'2005-07-06 16:27:43',3166,309,'2005-07-07 18:02:43',1,'2006-02-15 21:30:53'),(3838,'2005-07-06 16:29:43',3404,565,'2005-07-11 20:50:43',1,'2006-02-15 21:30:53'),(3839,'2005-07-06 16:30:30',3230,231,'2005-07-11 19:00:30',1,'2006-02-15 21:30:53'),(3840,'2005-07-06 16:30:59',4384,468,'2005-07-15 22:08:59',2,'2006-02-15 21:30:53'),(3841,'2005-07-06 16:34:00',4228,470,'2005-07-08 15:12:00',2,'2006-02-15 21:30:53'),(3842,'2005-07-06 16:34:32',3119,583,'2005-07-08 11:55:32',2,'2006-02-15 21:30:53'),(3843,'2005-07-06 16:35:40',3844,62,'2005-07-07 18:29:40',1,'2006-02-15 21:30:53'),(3844,'2005-07-06 16:37:58',2814,179,'2005-07-09 19:54:58',2,'2006-02-15 21:30:53'),(3845,'2005-07-06 16:38:14',4495,28,'2005-07-09 14:59:14',2,'2006-02-15 21:30:53'),(3846,'2005-07-06 16:43:10',2829,88,'2005-07-14 11:09:10',2,'2006-02-15 21:30:53'),(3847,'2005-07-06 16:44:41',782,206,'2005-07-07 21:54:41',2,'2006-02-15 21:30:53'),(3848,'2005-07-06 16:47:32',2906,188,'2005-07-14 15:00:32',1,'2006-02-15 21:30:53'),(3849,'2005-07-06 16:49:43',3660,60,'2005-07-12 17:20:43',1,'2006-02-15 21:30:53'),(3850,'2005-07-06 16:51:21',1700,103,'2005-07-12 13:58:21',1,'2006-02-15 21:30:53'),(3851,'2005-07-06 16:54:12',493,436,'2005-07-11 22:49:12',1,'2006-02-15 21:30:53'),(3852,'2005-07-06 16:57:49',3329,511,'2005-07-11 17:11:49',1,'2006-02-15 21:30:53'),(3853,'2005-07-06 16:59:20',1411,537,'2005-07-07 12:30:20',2,'2006-02-15 21:30:53'),(3854,'2005-07-06 17:02:33',2054,243,'2005-07-12 17:32:33',2,'2006-02-15 21:30:53'),(3855,'2005-07-06 17:03:48',2931,46,'2005-07-12 14:32:48',1,'2006-02-15 21:30:53'),(3856,'2005-07-06 17:04:46',3083,498,'2005-07-14 19:23:46',2,'2006-02-15 21:30:53'),(3857,'2005-07-06 17:07:54',1135,236,'2005-07-07 13:28:54',1,'2006-02-15 21:30:53'),(3858,'2005-07-06 17:17:57',829,377,'2005-07-10 23:10:57',2,'2006-02-15 21:30:53'),(3859,'2005-07-06 17:18:15',2548,553,'2005-07-09 16:48:15',1,'2006-02-15 21:30:53'),(3860,'2005-07-06 17:20:24',144,514,'2005-07-09 22:33:24',1,'2006-02-15 21:30:53'),(3861,'2005-07-06 17:24:49',4506,202,'2005-07-15 22:19:49',2,'2006-02-15 21:30:53'),(3862,'2005-07-06 17:35:22',471,181,'2005-07-15 17:13:22',1,'2006-02-15 21:30:53'),(3863,'2005-07-06 17:40:18',363,481,'2005-07-07 17:58:18',2,'2006-02-15 21:30:53'),(3864,'2005-07-06 17:41:42',2811,68,'2005-07-08 14:17:42',1,'2006-02-15 21:30:53'),(3865,'2005-07-06 17:46:57',3579,357,'2005-07-12 12:20:57',1,'2006-02-15 21:30:53'),(3866,'2005-07-06 17:47:20',194,409,'2005-07-15 18:12:20',1,'2006-02-15 21:30:53'),(3867,'2005-07-06 17:52:19',3620,580,'2005-07-13 21:48:19',1,'2006-02-15 21:30:53'),(3868,'2005-07-06 17:54:13',1606,416,'2005-07-10 14:51:13',1,'2006-02-15 21:30:53'),(3869,'2005-07-06 17:56:46',2540,183,'2005-07-10 20:44:46',1,'2006-02-15 21:30:53'),(3870,'2005-07-06 17:57:54',3357,12,'2005-07-13 12:30:54',1,'2006-02-15 21:30:53'),(3871,'2005-07-06 17:58:51',3114,331,'2005-07-15 22:18:51',2,'2006-02-15 21:30:53'),(3872,'2005-07-06 18:00:19',1785,513,'2005-07-07 17:26:19',1,'2006-02-15 21:30:53'),(3873,'2005-07-06 18:03:16',4148,394,'2005-07-15 23:58:16',2,'2006-02-15 21:30:53'),(3874,'2005-07-06 18:06:12',1870,137,'2005-07-12 16:55:12',1,'2006-02-15 21:30:53'),(3875,'2005-07-06 18:15:39',712,108,'2005-07-11 17:34:39',1,'2006-02-15 21:30:53'),(3876,'2005-07-06 18:21:13',4039,295,'2005-07-14 16:57:13',2,'2006-02-15 21:30:53'),(3877,'2005-07-06 18:22:10',2796,576,'2005-07-07 23:38:10',1,'2006-02-15 21:30:53'),(3878,'2005-07-06 18:27:09',4022,385,'2005-07-15 20:13:09',2,'2006-02-15 21:30:53'),(3879,'2005-07-06 18:31:20',1376,81,'2005-07-09 19:03:20',2,'2006-02-15 21:30:53'),(3880,'2005-07-06 18:32:49',42,507,'2005-07-07 20:46:49',2,'2006-02-15 21:30:53'),(3881,'2005-07-06 18:35:37',143,456,'2005-07-10 00:06:37',2,'2006-02-15 21:30:53'),(3882,'2005-07-06 18:38:21',788,254,'2005-07-09 14:55:21',1,'2006-02-15 21:30:53'),(3883,'2005-07-06 18:39:38',3238,69,'2005-07-14 15:59:38',2,'2006-02-15 21:30:53'),(3884,'2005-07-06 18:41:33',1806,210,'2005-07-07 22:06:33',1,'2006-02-15 21:30:53'),(3885,'2005-07-06 18:43:43',1820,282,'2005-07-12 19:48:43',2,'2006-02-15 21:30:53'),(3886,'2005-07-06 18:44:24',2368,326,'2005-07-08 15:11:24',1,'2006-02-15 21:30:53'),(3887,'2005-07-06 18:46:34',1695,530,'2005-07-07 13:15:34',1,'2006-02-15 21:30:53'),(3888,'2005-07-06 18:54:20',1945,412,'2005-07-12 17:13:20',2,'2006-02-15 21:30:53'),(3889,'2005-07-06 18:56:25',2005,576,'2005-07-08 21:22:25',2,'2006-02-15 21:30:53'),(3890,'2005-07-06 18:58:15',2570,553,'2005-07-10 18:51:15',1,'2006-02-15 21:30:53'),(3891,'2005-07-06 18:58:25',3216,553,'2005-07-09 23:20:25',2,'2006-02-15 21:30:53'),(3892,'2005-07-06 18:58:58',778,549,'2005-07-10 19:29:58',1,'2006-02-15 21:30:53'),(3893,'2005-07-06 18:59:31',1281,350,'2005-07-12 19:21:31',1,'2006-02-15 21:30:53'),(3894,'2005-07-06 19:01:39',2087,149,'2005-07-12 21:35:39',2,'2006-02-15 21:30:53'),(3895,'2005-07-06 19:04:24',145,584,'2005-07-15 17:48:24',2,'2006-02-15 21:30:53'),(3896,'2005-07-06 19:09:15',1755,309,'2005-07-16 00:52:15',2,'2006-02-15 21:30:53'),(3897,'2005-07-06 19:11:43',14,277,'2005-07-11 21:50:43',2,'2006-02-15 21:30:53'),(3898,'2005-07-06 19:12:37',3858,53,'2005-07-11 15:50:37',1,'2006-02-15 21:30:53'),(3899,'2005-07-06 19:12:40',4020,485,'2005-07-13 23:41:40',1,'2006-02-15 21:30:53'),(3900,'2005-07-06 19:21:28',1497,129,'2005-07-15 21:06:28',2,'2006-02-15 21:30:53'),(3901,'2005-07-06 19:24:55',3367,321,'2005-07-14 20:30:55',2,'2006-02-15 21:30:53'),(3902,'2005-07-06 19:25:18',2868,192,'2005-07-10 17:42:18',2,'2006-02-15 21:30:53'),(3903,'2005-07-06 19:27:32',3614,369,'2005-07-08 23:27:32',1,'2006-02-15 21:30:53'),(3904,'2005-07-06 19:30:57',3600,485,'2005-07-11 18:47:57',2,'2006-02-15 21:30:53'),(3905,'2005-07-06 19:33:34',3817,526,'2005-07-15 17:55:34',1,'2006-02-15 21:30:53'),(3906,'2005-07-06 19:35:55',1383,293,'2005-07-15 22:35:55',1,'2006-02-15 21:30:53'),(3907,'2005-07-06 19:39:14',2507,452,'2005-07-11 17:45:14',1,'2006-02-15 21:30:53'),(3908,'2005-07-06 19:47:26',3980,116,'2005-07-13 19:59:26',1,'2006-02-15 21:30:53'),(3909,'2005-07-06 19:54:41',3423,396,'2005-07-15 18:11:41',2,'2006-02-15 21:30:53'),(3910,'2005-07-06 20:05:18',2085,248,'2005-07-10 18:51:18',1,'2006-02-15 21:30:53'),(3911,'2005-07-06 20:09:11',4548,34,'2005-07-08 23:53:11',1,'2006-02-15 21:30:53'),(3912,'2005-07-06 20:10:03',2449,154,'2005-07-08 18:39:03',2,'2006-02-15 21:30:53'),(3913,'2005-07-06 20:11:00',752,494,'2005-07-08 14:42:00',1,'2006-02-15 21:30:53'),(3914,'2005-07-06 20:11:10',4092,159,'2005-07-14 14:42:10',2,'2006-02-15 21:30:53'),(3915,'2005-07-06 20:16:46',125,163,'2005-07-10 17:24:46',1,'2006-02-15 21:30:53'),(3916,'2005-07-06 20:18:50',3198,46,'2005-07-12 21:56:50',1,'2006-02-15 21:30:53'),(3917,'2005-07-06 20:19:29',2747,471,'2005-07-11 00:49:29',1,'2006-02-15 21:30:53'),(3918,'2005-07-06 20:26:15',1111,435,'2005-07-15 20:32:15',1,'2006-02-15 21:30:53'),(3919,'2005-07-06 20:26:21',2695,147,'2005-07-15 00:13:21',1,'2006-02-15 21:30:53'),(3920,'2005-07-06 20:26:40',1551,321,'2005-07-15 15:00:40',2,'2006-02-15 21:30:53'),(3921,'2005-07-06 20:29:48',949,531,'2005-07-14 01:44:48',1,'2006-02-15 21:30:53'),(3922,'2005-07-06 20:32:27',2878,470,'2005-07-14 19:00:27',1,'2006-02-15 21:30:53'),(3923,'2005-07-06 20:34:10',2039,63,'2005-07-13 19:20:10',1,'2006-02-15 21:30:53'),(3924,'2005-07-06 20:38:02',187,114,'2005-07-11 23:35:02',2,'2006-02-15 21:30:53'),(3925,'2005-07-06 20:41:44',2653,428,'2005-07-15 21:05:44',2,'2006-02-15 21:30:53'),(3926,'2005-07-06 20:42:35',4241,500,'2005-07-09 16:30:35',2,'2006-02-15 21:30:53'),(3927,'2005-07-06 20:48:14',2194,404,'2005-07-10 15:37:14',1,'2006-02-15 21:30:53'),(3928,'2005-07-06 20:52:09',1960,411,'2005-07-08 18:51:09',1,'2006-02-15 21:30:53'),(3929,'2005-07-06 20:52:39',1235,453,'2005-07-12 00:27:39',2,'2006-02-15 21:30:53'),(3930,'2005-07-06 20:54:07',165,573,'2005-07-10 18:31:07',1,'2006-02-15 21:30:53'),(3931,'2005-07-06 21:03:46',182,176,'2005-07-16 01:32:46',1,'2006-02-15 21:30:53'),(3932,'2005-07-06 21:06:17',4396,490,'2005-07-07 19:25:17',2,'2006-02-15 21:30:53'),(3933,'2005-07-06 21:06:37',1202,229,'2005-07-08 20:23:37',1,'2006-02-15 21:30:53'),(3934,'2005-07-06 21:07:23',3187,576,'2005-07-10 18:20:23',2,'2006-02-15 21:30:53'),(3935,'2005-07-06 21:08:29',3402,503,'2005-07-15 23:28:29',2,'2006-02-15 21:30:53'),(3936,'2005-07-06 21:15:03',4258,129,'2005-07-08 17:45:03',2,'2006-02-15 21:30:53'),(3937,'2005-07-06 21:15:38',2091,211,'2005-07-15 00:01:38',2,'2006-02-15 21:30:53'),(3938,'2005-07-06 21:15:45',1991,341,'2005-07-13 20:02:45',2,'2006-02-15 21:30:53'),(3939,'2005-07-06 21:16:32',3627,149,'2005-07-11 03:12:32',2,'2006-02-15 21:30:53'),(3940,'2005-07-06 21:16:59',1502,116,'2005-07-07 19:17:59',2,'2006-02-15 21:30:53'),(3941,'2005-07-06 21:20:37',382,560,'2005-07-09 01:35:37',2,'2006-02-15 21:30:53'),(3942,'2005-07-06 21:21:34',677,553,'2005-07-15 02:34:34',1,'2006-02-15 21:30:53'),(3943,'2005-07-06 21:22:17',1816,566,'2005-07-07 21:26:17',1,'2006-02-15 21:30:53'),(3944,'2005-07-06 21:34:11',4213,436,'2005-07-08 23:46:11',2,'2006-02-15 21:30:53'),(3945,'2005-07-06 21:35:00',754,86,'2005-07-08 00:31:00',2,'2006-02-15 21:30:53'),(3946,'2005-07-06 21:39:24',294,13,'2005-07-11 16:10:24',1,'2006-02-15 21:30:53'),(3947,'2005-07-06 21:42:21',4188,324,'2005-07-08 19:37:21',1,'2006-02-15 21:30:53'),(3948,'2005-07-06 21:45:53',2254,161,'2005-07-08 19:24:53',2,'2006-02-15 21:30:53'),(3949,'2005-07-06 21:46:36',1765,153,'2005-07-11 03:18:36',1,'2006-02-15 21:30:53'),(3950,'2005-07-06 21:48:44',4153,598,'2005-07-14 02:25:44',1,'2006-02-15 21:30:53'),(3951,'2005-07-06 21:50:41',2288,250,'2005-07-12 02:09:41',2,'2006-02-15 21:30:53'),(3952,'2005-07-06 21:51:31',1719,417,'2005-07-13 15:54:31',1,'2006-02-15 21:30:53'),(3953,'2005-07-06 21:54:55',3879,385,'2005-07-09 18:52:55',1,'2006-02-15 21:30:53'),(3954,'2005-07-06 21:57:44',4250,558,'2005-07-08 02:37:44',2,'2006-02-15 21:30:53'),(3955,'2005-07-06 21:58:08',2523,247,'2005-07-08 03:43:08',1,'2006-02-15 21:30:53'),(3956,'2005-07-06 22:01:51',15,147,'2005-07-12 21:35:51',2,'2006-02-15 21:30:53'),(3957,'2005-07-06 22:05:47',443,414,'2005-07-16 01:08:47',1,'2006-02-15 21:30:53'),(3958,'2005-07-06 22:07:33',4117,288,'2005-07-10 19:31:33',2,'2006-02-15 21:30:53'),(3959,'2005-07-06 22:07:58',40,448,'2005-07-13 02:30:58',1,'2006-02-15 21:30:53'),(3960,'2005-07-06 22:08:53',2090,594,'2005-07-07 23:21:53',2,'2006-02-15 21:30:53'),(3961,'2005-07-06 22:11:43',4320,364,'2005-07-09 03:14:43',1,'2006-02-15 21:30:53'),(3962,'2005-07-06 22:13:45',379,307,'2005-07-15 00:22:45',2,'2006-02-15 21:30:53'),(3963,'2005-07-06 22:19:17',3912,111,'2005-07-15 01:22:17',2,'2006-02-15 21:30:53'),(3964,'2005-07-06 22:23:02',1853,30,'2005-07-07 22:21:02',1,'2006-02-15 21:30:53'),(3965,'2005-07-06 22:36:20',2863,243,'2005-07-09 17:45:20',1,'2006-02-15 21:30:53'),(3966,'2005-07-06 22:38:49',556,495,'2005-07-07 23:33:49',1,'2006-02-15 21:30:53'),(3967,'2005-07-06 22:45:10',2510,31,'2005-07-09 23:54:10',2,'2006-02-15 21:30:53'),(3968,'2005-07-06 22:47:09',558,235,'2005-07-12 21:01:09',1,'2006-02-15 21:30:53'),(3969,'2005-07-06 22:47:59',383,587,'2005-07-08 02:11:59',1,'2006-02-15 21:30:53'),(3970,'2005-07-06 22:48:17',701,381,'2005-07-15 19:07:17',1,'2006-02-15 21:30:53'),(3971,'2005-07-06 22:50:40',4415,473,'2005-07-08 01:02:40',1,'2006-02-15 21:30:53'),(3972,'2005-07-06 22:53:57',1895,598,'2005-07-11 01:32:57',1,'2006-02-15 21:30:53'),(3973,'2005-07-06 22:58:31',2625,592,'2005-07-16 03:27:31',2,'2006-02-15 21:30:53'),(3974,'2005-07-06 22:59:16',4282,318,'2005-07-11 22:30:16',1,'2006-02-15 21:30:53'),(3975,'2005-07-06 23:00:09',4343,545,'2005-07-10 01:39:09',2,'2006-02-15 21:30:53'),(3976,'2005-07-06 23:00:20',2424,329,'2005-07-07 21:51:20',2,'2006-02-15 21:30:53'),(3977,'2005-07-06 23:00:49',1284,449,'2005-07-15 00:41:49',1,'2006-02-15 21:30:53'),(3978,'2005-07-06 23:04:33',4341,343,'2005-07-10 17:45:33',2,'2006-02-15 21:30:53'),(3979,'2005-07-06 23:04:35',794,550,'2005-07-13 01:38:35',2,'2006-02-15 21:30:53'),(3980,'2005-07-06 23:11:11',1845,475,'2005-07-14 18:22:11',1,'2006-02-15 21:30:53'),(3981,'2005-07-06 23:12:12',842,375,'2005-07-13 01:47:12',2,'2006-02-15 21:30:53'),(3982,'2005-07-06 23:14:16',4327,64,'2005-07-08 21:21:16',2,'2006-02-15 21:30:53'),(3983,'2005-07-06 23:14:21',1261,6,'2005-07-12 17:55:21',2,'2006-02-15 21:30:53'),(3984,'2005-07-06 23:22:36',2205,570,'2005-07-08 21:40:36',2,'2006-02-15 21:30:53'),(3985,'2005-07-06 23:24:03',2096,307,'2005-07-10 00:20:03',2,'2006-02-15 21:30:53'),(3986,'2005-07-06 23:25:13',3737,122,'2005-07-09 21:26:13',2,'2006-02-15 21:30:53'),(3987,'2005-07-06 23:28:24',3104,270,'2005-07-15 00:52:24',1,'2006-02-15 21:30:53'),(3988,'2005-07-06 23:30:42',2981,421,'2005-07-13 03:06:42',2,'2006-02-15 21:30:53'),(3989,'2005-07-06 23:30:54',2366,213,'2005-07-12 01:28:54',1,'2006-02-15 21:30:53'),(3990,'2005-07-06 23:32:44',2009,558,'2005-07-14 01:35:44',2,'2006-02-15 21:30:53'),(3991,'2005-07-06 23:33:41',587,583,'2005-07-16 01:31:41',1,'2006-02-15 21:30:53'),(3992,'2005-07-06 23:36:56',3219,448,'2005-07-15 03:13:56',1,'2006-02-15 21:30:53'),(3993,'2005-07-06 23:37:06',1061,525,'2005-07-14 19:31:06',1,'2006-02-15 21:30:53'),(3994,'2005-07-06 23:39:01',902,487,'2005-07-14 00:33:01',1,'2006-02-15 21:30:53'),(3995,'2005-07-06 23:43:03',3990,128,'2005-07-13 04:13:03',2,'2006-02-15 21:30:53'),(3996,'2005-07-06 23:46:43',2857,551,'2005-07-14 22:34:43',2,'2006-02-15 21:30:53'),(3997,'2005-07-06 23:46:52',3895,52,'2005-07-14 05:39:52',2,'2006-02-15 21:30:53'),(3998,'2005-07-06 23:49:20',1245,566,'2005-07-12 20:39:20',1,'2006-02-15 21:30:53'),(3999,'2005-07-06 23:50:54',707,390,'2005-07-09 22:09:54',1,'2006-02-15 21:30:53'),(4000,'2005-07-06 23:58:37',2122,95,'2005-07-08 21:43:37',1,'2006-02-15 21:30:53'),(4001,'2005-07-07 00:07:00',864,120,'2005-07-13 21:27:00',2,'2006-02-15 21:30:53'),(4002,'2005-07-07 00:08:18',2790,308,'2005-07-14 01:29:18',2,'2006-02-15 21:30:53'),(4003,'2005-07-07 00:09:02',4054,8,'2005-07-08 04:27:02',1,'2006-02-15 21:30:53'),(4004,'2005-07-07 00:20:51',667,574,'2005-07-11 18:55:51',2,'2006-02-15 21:30:53'),(4005,'2005-07-07 00:22:26',3677,190,'2005-07-15 04:34:26',2,'2006-02-15 21:30:53'),(4006,'2005-07-07 00:25:29',397,473,'2005-07-08 05:30:29',2,'2006-02-15 21:30:53'),(4007,'2005-07-07 00:26:05',2071,285,'2005-07-15 19:53:05',1,'2006-02-15 21:30:53'),(4008,'2005-07-07 00:26:43',1107,505,'2005-07-16 03:58:43',2,'2006-02-15 21:30:53'),(4009,'2005-07-07 00:28:55',3607,394,'2005-07-10 00:37:55',1,'2006-02-15 21:30:53'),(4010,'2005-07-07 00:47:00',4509,476,'2005-07-12 06:23:00',2,'2006-02-15 21:30:53'),(4011,'2005-07-07 00:48:25',2052,20,'2005-07-13 06:30:25',2,'2006-02-15 21:30:53'),(4012,'2005-07-07 00:56:09',1400,104,'2005-07-10 21:49:09',1,'2006-02-15 21:30:53'),(4013,'2005-07-07 00:58:00',2344,475,'2005-07-15 19:42:00',2,'2006-02-15 21:30:53'),(4014,'2005-07-07 00:58:54',583,510,'2005-07-12 02:40:54',1,'2006-02-15 21:30:53'),(4015,'2005-07-07 00:59:46',3032,233,'2005-07-14 03:16:46',2,'2006-02-15 21:30:53'),(4016,'2005-07-07 01:05:50',3318,335,'2005-07-09 05:59:50',1,'2006-02-15 21:30:53'),(4017,'2005-07-07 01:08:18',3117,595,'2005-07-09 01:47:18',2,'2006-02-15 21:30:53'),(4018,'2005-07-07 01:10:33',906,207,'2005-07-12 20:54:33',2,'2006-02-15 21:30:53'),(4019,'2005-07-07 01:27:44',3200,294,'2005-07-10 21:30:44',1,'2006-02-15 21:30:53'),(4020,'2005-07-07 01:42:22',3760,471,'2005-07-10 00:53:22',1,'2006-02-15 21:30:53'),(4021,'2005-07-07 01:46:44',1676,315,'2005-07-12 00:16:44',2,'2006-02-15 21:30:53'),(4022,'2005-07-07 01:50:06',3914,390,'2005-07-09 21:47:06',2,'2006-02-15 21:30:53'),(4023,'2005-07-07 01:55:25',274,573,'2005-07-08 02:43:25',2,'2006-02-15 21:30:53'),(4024,'2005-07-07 02:11:23',3976,448,'2005-07-11 02:00:23',1,'2006-02-15 21:30:53'),(4025,'2005-07-07 02:13:24',3908,114,'2005-07-08 00:47:24',1,'2006-02-15 21:30:53'),(4026,'2005-07-07 02:15:48',4142,251,'2005-07-14 04:15:48',2,'2006-02-15 21:30:53'),(4027,'2005-07-07 02:19:01',56,116,'2005-07-10 01:12:01',1,'2006-02-15 21:30:53'),(4028,'2005-07-07 02:19:14',1651,344,'2005-07-15 08:09:14',2,'2006-02-15 21:30:53'),(4029,'2005-07-07 02:19:44',4075,518,'2005-07-15 02:30:44',2,'2006-02-15 21:30:53'),(4030,'2005-07-07 02:25:42',1734,300,'2005-07-08 22:53:42',2,'2006-02-15 21:30:53'),(4031,'2005-07-07 02:32:07',3094,143,'2005-07-14 06:01:07',2,'2006-02-15 21:30:53'),(4032,'2005-07-07 02:34:13',2628,335,'2005-07-14 22:43:13',1,'2006-02-15 21:30:53'),(4033,'2005-07-07 02:35:46',203,453,'2005-07-16 01:12:46',1,'2006-02-15 21:30:53'),(4034,'2005-07-07 02:36:33',1666,354,'2005-07-09 08:32:33',2,'2006-02-15 21:30:53'),(4035,'2005-07-07 02:45:02',3611,539,'2005-07-14 01:41:02',1,'2006-02-15 21:30:53'),(4036,'2005-07-07 02:48:00',500,397,'2005-07-07 22:46:00',1,'2006-02-15 21:30:53'),(4037,'2005-07-07 02:52:52',3903,594,'2005-07-16 00:09:52',1,'2006-02-15 21:30:53'),(4038,'2005-07-07 02:52:53',1264,27,'2005-07-11 22:32:53',2,'2006-02-15 21:30:53'),(4039,'2005-07-07 02:57:59',4050,290,'2005-07-12 03:44:59',2,'2006-02-15 21:30:53'),(4040,'2005-07-07 03:02:40',3046,103,'2005-07-16 06:05:40',2,'2006-02-15 21:30:53'),(4041,'2005-07-07 03:03:33',2217,445,'2005-07-09 07:57:33',2,'2006-02-15 21:30:53'),(4042,'2005-07-07 03:06:40',50,10,'2005-07-10 02:37:40',1,'2006-02-15 21:30:53'),(4043,'2005-07-07 03:09:50',3427,204,'2005-07-10 07:49:50',2,'2006-02-15 21:30:53'),(4044,'2005-07-07 03:22:23',3263,94,'2005-07-13 03:23:23',1,'2006-02-15 21:30:53'),(4045,'2005-07-07 03:26:14',1422,529,'2005-07-11 06:52:14',1,'2006-02-15 21:30:53'),(4046,'2005-07-07 03:27:59',3518,491,'2005-07-14 01:14:59',1,'2006-02-15 21:30:53'),(4047,'2005-07-07 03:28:49',3475,364,'2005-07-09 02:42:49',2,'2006-02-15 21:30:53'),(4048,'2005-07-07 03:30:52',659,474,'2005-07-14 05:05:52',2,'2006-02-15 21:30:53'),(4049,'2005-07-07 03:34:53',4172,79,'2005-07-15 04:10:53',2,'2006-02-15 21:30:53'),(4050,'2005-07-07 03:35:33',104,528,'2005-07-15 03:11:33',1,'2006-02-15 21:30:53'),(4051,'2005-07-07 03:37:28',2715,331,'2005-07-09 01:40:28',1,'2006-02-15 21:30:53'),(4052,'2005-07-07 03:38:22',206,442,'2005-07-13 02:56:22',2,'2006-02-15 21:30:53'),(4053,'2005-07-07 03:39:22',2889,377,'2005-07-09 22:32:22',1,'2006-02-15 21:30:53'),(4054,'2005-07-07 03:42:07',3885,260,'2005-07-10 03:22:07',1,'2006-02-15 21:30:53'),(4055,'2005-07-07 03:49:13',2561,513,'2005-07-11 03:15:13',2,'2006-02-15 21:30:53'),(4056,'2005-07-07 03:57:36',4211,360,'2005-07-09 08:53:36',2,'2006-02-15 21:30:53'),(4057,'2005-07-07 04:00:20',2838,141,'2005-07-12 08:14:20',1,'2006-02-15 21:30:53'),(4058,'2005-07-07 04:02:50',3877,442,'2005-07-10 04:30:50',2,'2006-02-15 21:30:53'),(4059,'2005-07-07 04:04:26',292,401,'2005-07-10 22:35:26',1,'2006-02-15 21:30:53'),(4060,'2005-07-07 04:10:13',2697,211,'2005-07-13 07:44:13',1,'2006-02-15 21:30:53'),(4061,'2005-07-07 04:13:35',62,70,'2005-07-10 23:58:35',2,'2006-02-15 21:30:53'),(4062,'2005-07-07 04:22:27',1323,410,'2005-07-09 03:27:27',1,'2006-02-15 21:30:53'),(4063,'2005-07-07 04:23:57',1452,331,'2005-07-14 23:35:57',2,'2006-02-15 21:30:53'),(4064,'2005-07-07 04:29:20',1402,47,'2005-07-14 05:48:20',2,'2006-02-15 21:30:53'),(4065,'2005-07-07 04:32:28',1339,26,'2005-07-12 08:30:28',1,'2006-02-15 21:30:53'),(4066,'2005-07-07 04:34:09',1975,368,'2005-07-10 23:54:09',1,'2006-02-15 21:30:53'),(4067,'2005-07-07 04:34:23',2945,469,'2005-07-16 04:04:23',1,'2006-02-15 21:30:53'),(4068,'2005-07-07 04:34:38',4152,206,'2005-07-11 09:16:38',2,'2006-02-15 21:30:53'),(4069,'2005-07-07 04:35:06',3361,570,'2005-07-10 23:59:06',2,'2006-02-15 21:30:53'),(4070,'2005-07-07 04:37:09',2926,496,'2005-07-08 04:19:09',2,'2006-02-15 21:30:53'),(4071,'2005-07-07 04:37:26',2883,209,'2005-07-13 06:45:26',2,'2006-02-15 21:30:53'),(4072,'2005-07-07 04:48:02',3130,310,'2005-07-12 10:32:02',2,'2006-02-15 21:30:53'),(4073,'2005-07-07 04:49:13',647,290,'2005-07-10 03:20:13',2,'2006-02-15 21:30:53'),(4074,'2005-07-07 04:49:49',2347,412,'2005-07-12 04:51:49',2,'2006-02-15 21:30:53'),(4075,'2005-07-07 04:51:44',1989,593,'2005-07-09 03:07:44',2,'2006-02-15 21:30:53'),(4076,'2005-07-07 04:52:15',3148,329,'2005-07-13 23:22:15',1,'2006-02-15 21:30:53'),(4077,'2005-07-07 04:53:40',2445,377,'2005-07-09 09:56:40',2,'2006-02-15 21:30:53'),(4078,'2005-07-07 05:05:05',1671,522,'2005-07-10 05:39:05',1,'2006-02-15 21:30:53'),(4079,'2005-07-07 05:06:27',2202,84,'2005-07-16 08:46:27',1,'2006-02-15 21:30:53'),(4080,'2005-07-07 05:09:54',1364,148,'2005-07-11 23:58:54',1,'2006-02-15 21:30:53'),(4081,'2005-07-07 05:10:08',1138,284,'2005-07-12 00:47:08',1,'2006-02-15 21:30:53'),(4082,'2005-07-07 05:11:53',2904,108,'2005-07-12 00:55:53',1,'2006-02-15 21:30:53'),(4083,'2005-07-07 05:13:15',3454,490,'2005-07-08 09:11:15',1,'2006-02-15 21:30:53'),(4084,'2005-07-07 05:16:00',2588,441,'2005-07-15 09:23:00',1,'2006-02-15 21:30:53'),(4085,'2005-07-07 05:25:39',1683,573,'2005-07-12 04:30:39',1,'2006-02-15 21:30:53'),(4086,'2005-07-07 05:26:06',253,494,'2005-07-12 00:45:06',2,'2006-02-15 21:30:53'),(4087,'2005-07-07 05:30:56',3066,433,'2005-07-16 10:20:56',1,'2006-02-15 21:30:53'),(4088,'2005-07-07 05:31:55',234,66,'2005-07-15 07:35:55',1,'2006-02-15 21:30:53'),(4089,'2005-07-07 05:45:59',3431,102,'2005-07-16 07:34:59',2,'2006-02-15 21:30:53'),(4090,'2005-07-07 05:47:33',3096,67,'2005-07-08 04:25:33',2,'2006-02-15 21:30:53'),(4091,'2005-07-07 05:53:38',3928,337,'2005-07-14 03:12:38',2,'2006-02-15 21:30:53'),(4092,'2005-07-07 05:54:18',1721,246,'2005-07-16 09:14:18',1,'2006-02-15 21:30:53'),(4093,'2005-07-07 05:54:50',1534,337,'2005-07-12 00:34:50',1,'2006-02-15 21:30:53'),(4094,'2005-07-07 06:00:21',2412,517,'2005-07-10 03:24:21',2,'2006-02-15 21:30:53'),(4095,'2005-07-07 06:01:48',2900,33,'2005-07-15 02:52:48',2,'2006-02-15 21:30:53'),(4096,'2005-07-07 06:09:11',3911,403,'2005-07-08 09:17:11',2,'2006-02-15 21:30:53'),(4097,'2005-07-07 06:10:55',2454,56,'2005-07-11 02:45:55',1,'2006-02-15 21:30:53'),(4098,'2005-07-07 06:14:51',2865,35,'2005-07-14 06:51:51',2,'2006-02-15 21:30:53'),(4099,'2005-07-07 06:20:33',1930,76,'2005-07-16 08:39:33',1,'2006-02-15 21:30:53'),(4100,'2005-07-07 06:20:52',2346,332,'2005-07-15 05:58:52',2,'2006-02-15 21:30:53'),(4101,'2005-07-07 06:25:11',2891,588,'2005-07-12 07:44:11',2,'2006-02-15 21:30:53'),(4102,'2005-07-07 06:25:19',3998,135,'2005-07-11 00:50:19',2,'2006-02-15 21:30:53'),(4103,'2005-07-07 06:25:28',3632,91,'2005-07-12 11:18:28',1,'2006-02-15 21:30:53'),(4104,'2005-07-07 06:25:41',1066,338,'2005-07-13 04:18:41',2,'2006-02-15 21:30:53'),(4105,'2005-07-07 06:31:00',439,423,'2005-07-09 03:52:00',1,'2006-02-15 21:30:53'),(4106,'2005-07-07 06:33:35',4083,563,'2005-07-13 04:03:35',1,'2006-02-15 21:30:53'),(4107,'2005-07-07 06:36:32',4232,206,'2005-07-14 03:36:32',1,'2006-02-15 21:30:53'),(4108,'2005-07-07 06:38:31',4535,66,'2005-07-08 10:44:31',1,'2006-02-15 21:30:53'),(4109,'2005-07-07 06:39:43',532,517,'2005-07-10 06:30:43',1,'2006-02-15 21:30:53'),(4110,'2005-07-07 06:44:27',226,486,'2005-07-12 05:43:27',2,'2006-02-15 21:30:53'),(4111,'2005-07-07 06:47:56',1009,515,'2005-07-13 02:13:56',1,'2006-02-15 21:30:53'),(4112,'2005-07-07 06:49:09',3284,533,'2005-07-16 06:53:09',2,'2006-02-15 21:30:53'),(4113,'2005-07-07 06:49:52',915,170,'2005-07-12 04:00:52',1,'2006-02-15 21:30:53'),(4114,'2005-07-07 06:51:12',4109,426,'2005-07-15 01:36:12',1,'2006-02-15 21:30:53'),(4115,'2005-07-07 06:52:23',102,371,'2005-07-14 06:12:23',2,'2006-02-15 21:30:53'),(4116,'2005-07-07 06:56:13',666,352,'2005-07-11 11:13:13',2,'2006-02-15 21:30:53'),(4117,'2005-07-07 06:58:14',780,158,'2005-07-16 05:28:14',1,'2006-02-15 21:30:53'),(4118,'2005-07-07 07:03:30',355,224,'2005-07-08 09:20:30',1,'2006-02-15 21:30:53'),(4119,'2005-07-07 07:06:03',2078,319,'2005-07-13 01:56:03',2,'2006-02-15 21:30:53'),(4120,'2005-07-07 07:07:03',987,559,'2005-07-16 04:07:03',1,'2006-02-15 21:30:53'),(4121,'2005-07-07 07:13:50',2429,176,'2005-07-13 04:32:50',2,'2006-02-15 21:30:53'),(4122,'2005-07-07 07:15:35',273,31,'2005-07-14 12:10:35',1,'2006-02-15 21:30:53'),(4123,'2005-07-07 07:16:19',2707,469,'2005-07-10 05:23:19',1,'2006-02-15 21:30:53'),(4124,'2005-07-07 07:19:54',2856,330,'2005-07-11 05:54:54',1,'2006-02-15 21:30:53'),(4125,'2005-07-07 07:20:29',4131,269,'2005-07-15 06:41:29',2,'2006-02-15 21:30:53'),(4126,'2005-07-07 07:24:11',3018,163,'2005-07-15 07:31:11',1,'2006-02-15 21:30:53'),(4127,'2005-07-07 07:26:19',1774,15,'2005-07-14 07:50:19',2,'2006-02-15 21:30:53'),(4128,'2005-07-07 07:35:25',3563,492,'2005-07-14 08:13:25',1,'2006-02-15 21:30:53'),(4129,'2005-07-07 07:37:03',1413,592,'2005-07-14 13:31:03',1,'2006-02-15 21:30:53'),(4130,'2005-07-07 07:51:53',4170,256,'2005-07-11 12:41:53',2,'2006-02-15 21:30:53'),(4131,'2005-07-07 07:53:18',2621,58,'2005-07-08 04:48:18',1,'2006-02-15 21:30:53'),(4132,'2005-07-07 08:06:07',993,154,'2005-07-10 14:04:07',1,'2006-02-15 21:30:53'),(4133,'2005-07-07 08:12:26',3672,488,'2005-07-16 03:43:26',1,'2006-02-15 21:30:53'),(4134,'2005-07-07 08:14:24',2917,183,'2005-07-09 10:42:24',1,'2006-02-15 21:30:53'),(4135,'2005-07-07 08:15:03',3384,36,'2005-07-11 10:56:03',1,'2006-02-15 21:30:53'),(4136,'2005-07-07 08:15:52',3461,203,'2005-07-10 04:22:52',2,'2006-02-15 21:30:53'),(4137,'2005-07-07 08:17:06',2065,485,'2005-07-11 10:52:06',2,'2006-02-15 21:30:53'),(4138,'2005-07-07 08:17:13',1588,317,'2005-07-14 05:18:13',2,'2006-02-15 21:30:53'),(4139,'2005-07-07 08:17:35',2094,509,'2005-07-14 14:01:35',2,'2006-02-15 21:30:53'),(4140,'2005-07-07 08:19:10',1897,190,'2005-07-14 07:27:10',2,'2006-02-15 21:30:53'),(4141,'2005-07-07 08:19:20',1904,456,'2005-07-11 06:54:20',1,'2006-02-15 21:30:53'),(4142,'2005-07-07 08:19:45',4045,492,'2005-07-08 13:55:45',1,'2006-02-15 21:30:53'),(4143,'2005-07-07 08:22:07',597,238,'2005-07-13 11:42:07',1,'2006-02-15 21:30:53'),(4144,'2005-07-07 08:25:44',550,431,'2005-07-16 13:10:44',2,'2006-02-15 21:30:53'),(4145,'2005-07-07 08:26:39',3050,592,'2005-07-16 12:54:39',2,'2006-02-15 21:30:53'),(4146,'2005-07-07 08:30:16',176,411,'2005-07-12 07:52:16',1,'2006-02-15 21:30:53'),(4147,'2005-07-07 08:32:12',2776,274,'2005-07-12 10:10:12',2,'2006-02-15 21:30:53'),(4148,'2005-07-07 08:36:58',260,59,'2005-07-09 05:51:58',1,'2006-02-15 21:30:53'),(4149,'2005-07-07 08:40:17',3028,50,'2005-07-10 02:58:17',2,'2006-02-15 21:30:53'),(4150,'2005-07-07 08:43:22',4424,188,'2005-07-08 05:21:22',2,'2006-02-15 21:30:53'),(4151,'2005-07-07 08:49:02',4564,428,'2005-07-11 05:19:02',1,'2006-02-15 21:30:53'),(4152,'2005-07-07 08:50:33',1761,89,'2005-07-14 10:56:33',2,'2006-02-15 21:30:53'),(4153,'2005-07-07 08:53:08',2185,299,'2005-07-11 05:09:08',2,'2006-02-15 21:30:53'),(4154,'2005-07-07 08:58:23',191,594,'2005-07-14 03:16:23',2,'2006-02-15 21:30:53'),(4155,'2005-07-07 09:00:49',212,548,'2005-07-13 10:59:49',2,'2006-02-15 21:30:53'),(4156,'2005-07-07 09:03:51',1259,585,'2005-07-12 09:46:51',2,'2006-02-15 21:30:53'),(4157,'2005-07-07 09:04:26',304,183,'2005-07-08 09:55:26',1,'2006-02-15 21:30:53'),(4158,'2005-07-07 09:05:42',291,433,'2005-07-09 04:28:42',1,'2006-02-15 21:30:53'),(4159,'2005-07-07 09:10:57',3625,62,'2005-07-09 10:19:57',2,'2006-02-15 21:30:53'),(4160,'2005-07-07 09:13:17',1909,326,'2005-07-15 11:50:17',2,'2006-02-15 21:30:53'),(4161,'2005-07-07 09:15:11',4021,216,'2005-07-15 06:59:11',1,'2006-02-15 21:30:53'),(4162,'2005-07-07 09:17:26',745,571,'2005-07-15 10:15:26',2,'2006-02-15 21:30:53'),(4163,'2005-07-07 09:19:28',3176,376,'2005-07-10 06:47:28',2,'2006-02-15 21:30:53'),(4164,'2005-07-07 09:20:11',3133,295,'2005-07-14 09:35:11',1,'2006-02-15 21:30:53'),(4165,'2005-07-07 09:23:27',3845,66,'2005-07-15 06:00:27',1,'2006-02-15 21:30:53'),(4166,'2005-07-07 09:33:30',3267,376,'2005-07-16 06:06:30',1,'2006-02-15 21:30:53'),(4167,'2005-07-07 09:37:08',3771,175,'2005-07-16 06:16:08',2,'2006-02-15 21:30:53'),(4168,'2005-07-07 09:37:24',1872,132,'2005-07-09 14:32:24',2,'2006-02-15 21:30:53'),(4169,'2005-07-07 09:39:18',3360,580,'2005-07-11 13:43:18',1,'2006-02-15 21:30:53'),(4170,'2005-07-07 09:44:36',2665,99,'2005-07-13 14:10:36',1,'2006-02-15 21:30:53'),(4171,'2005-07-07 09:49:04',4199,476,'2005-07-14 03:58:04',2,'2006-02-15 21:30:53'),(4172,'2005-07-07 09:49:09',1158,309,'2005-07-11 15:14:09',2,'2006-02-15 21:30:53'),(4173,'2005-07-07 09:57:26',4272,320,'2005-07-10 04:05:26',1,'2006-02-15 21:30:53'),(4174,'2005-07-07 09:59:49',3814,182,'2005-07-11 13:34:49',1,'2006-02-15 21:30:53'),(4175,'2005-07-07 10:02:03',1979,8,'2005-07-10 06:09:03',2,'2006-02-15 21:30:53'),(4176,'2005-07-07 10:03:34',2745,420,'2005-07-16 08:43:34',1,'2006-02-15 21:30:53'),(4177,'2005-07-07 10:12:36',4106,317,'2005-07-15 15:48:36',2,'2006-02-15 21:30:53'),(4178,'2005-07-07 10:14:31',2898,513,'2005-07-12 09:38:31',2,'2006-02-15 21:30:53'),(4179,'2005-07-07 10:17:15',559,75,'2005-07-10 05:12:15',2,'2006-02-15 21:30:53'),(4180,'2005-07-07 10:23:25',1704,3,'2005-07-10 13:18:25',1,'2006-02-15 21:30:53'),(4181,'2005-07-07 10:27:54',3725,598,'2005-07-13 06:09:54',1,'2006-02-15 21:30:53'),(4182,'2005-07-07 10:28:00',3080,256,'2005-07-08 12:50:00',1,'2006-02-15 21:30:53'),(4183,'2005-07-07 10:28:33',3342,479,'2005-07-15 12:29:33',1,'2006-02-15 21:30:53'),(4184,'2005-07-07 10:30:08',1022,468,'2005-07-14 12:56:08',1,'2006-02-15 21:30:53'),(4185,'2005-07-07 10:31:05',2425,395,'2005-07-13 05:30:05',2,'2006-02-15 21:30:53'),(4186,'2005-07-07 10:32:25',3910,185,'2005-07-15 06:22:25',1,'2006-02-15 21:30:53'),(4187,'2005-07-07 10:41:31',2,161,'2005-07-11 06:25:31',1,'2006-02-15 21:30:53'),(4188,'2005-07-07 10:45:29',3243,391,'2005-07-16 09:39:29',1,'2006-02-15 21:30:53'),(4189,'2005-07-07 10:51:07',1492,386,'2005-07-14 14:46:07',2,'2006-02-15 21:30:53'),(4190,'2005-07-07 10:52:39',826,349,'2005-07-11 13:19:39',1,'2006-02-15 21:30:53'),(4191,'2005-07-07 10:56:14',2475,390,'2005-07-11 09:56:14',1,'2006-02-15 21:30:53'),(4192,'2005-07-07 10:57:06',624,558,'2005-07-13 16:30:06',1,'2006-02-15 21:30:53'),(4193,'2005-07-07 10:57:21',3791,445,'2005-07-09 07:33:21',2,'2006-02-15 21:30:53'),(4194,'2005-07-07 10:59:39',1753,153,'2005-07-15 09:34:39',1,'2006-02-15 21:30:53'),(4195,'2005-07-07 11:00:02',450,455,'2005-07-14 16:54:02',1,'2006-02-15 21:30:53'),(4196,'2005-07-07 11:06:33',3407,564,'2005-07-14 13:46:33',1,'2006-02-15 21:30:53'),(4197,'2005-07-07 11:07:52',2515,324,'2005-07-10 10:19:52',1,'2006-02-15 21:30:53'),(4198,'2005-07-07 11:08:11',333,247,'2005-07-16 15:29:11',1,'2006-02-15 21:30:53'),(4199,'2005-07-07 11:13:07',2120,259,'2005-07-11 07:17:07',1,'2006-02-15 21:30:53'),(4200,'2005-07-07 11:15:11',1097,292,'2005-07-11 11:46:11',2,'2006-02-15 21:30:53'),(4201,'2005-07-07 11:19:51',3682,145,'2005-07-16 08:48:51',1,'2006-02-15 21:30:53'),(4202,'2005-07-07 11:23:48',2274,38,'2005-07-16 16:32:48',1,'2006-02-15 21:30:53'),(4203,'2005-07-07 11:24:14',2743,189,'2005-07-11 16:26:14',1,'2006-02-15 21:30:53'),(4204,'2005-07-07 11:24:18',1513,569,'2005-07-15 12:42:18',1,'2006-02-15 21:30:53'),(4205,'2005-07-07 11:25:39',3922,486,'2005-07-11 06:12:39',1,'2006-02-15 21:30:53'),(4206,'2005-07-07 11:32:16',1557,448,'2005-07-14 13:07:16',2,'2006-02-15 21:30:53'),(4207,'2005-07-07 11:32:45',1119,588,'2005-07-14 05:49:45',2,'2006-02-15 21:30:53'),(4208,'2005-07-07 11:34:22',3617,441,'2005-07-09 08:25:22',1,'2006-02-15 21:30:53'),(4209,'2005-07-07 11:35:08',2010,100,'2005-07-10 10:58:08',1,'2006-02-15 21:30:53'),(4210,'2005-07-07 11:36:20',1972,581,'2005-07-16 12:38:20',1,'2006-02-15 21:30:53'),(4211,'2005-07-07 11:50:41',2001,214,'2005-07-09 13:58:41',2,'2006-02-15 21:30:53'),(4212,'2005-07-07 11:53:14',1825,574,'2005-07-09 07:12:14',1,'2006-02-15 21:30:53'),(4213,'2005-07-07 11:53:49',705,103,'2005-07-13 07:51:49',1,'2006-02-15 21:30:53'),(4214,'2005-07-07 11:54:33',2534,484,'2005-07-08 10:49:33',2,'2006-02-15 21:30:53'),(4215,'2005-07-07 12:00:52',1239,22,'2005-07-11 15:14:52',2,'2006-02-15 21:30:53'),(4216,'2005-07-07 12:01:34',1216,467,'2005-07-08 09:59:34',1,'2006-02-15 21:30:53'),(4217,'2005-07-07 12:08:59',3186,228,'2005-07-11 15:07:59',2,'2006-02-15 21:30:53'),(4218,'2005-07-07 12:10:24',152,497,'2005-07-15 16:09:24',1,'2006-02-15 21:30:53'),(4219,'2005-07-07 12:11:22',2800,16,'2005-07-11 11:05:22',1,'2006-02-15 21:30:53'),(4220,'2005-07-07 12:12:36',821,513,'2005-07-10 13:37:36',1,'2006-02-15 21:30:53'),(4221,'2005-07-07 12:18:57',4567,143,'2005-07-12 09:47:57',2,'2006-02-15 21:30:53'),(4222,'2005-07-07 12:20:21',2053,467,'2005-07-11 11:09:21',2,'2006-02-15 21:30:53'),(4223,'2005-07-07 12:23:54',2407,405,'2005-07-10 14:46:54',2,'2006-02-15 21:30:53'),(4224,'2005-07-07 12:24:21',3659,419,'2005-07-10 11:48:21',1,'2006-02-15 21:30:53'),(4225,'2005-07-07 12:24:37',1766,377,'2005-07-12 06:47:37',2,'2006-02-15 21:30:53'),(4226,'2005-07-07 12:37:56',1692,57,'2005-07-09 08:48:56',2,'2006-02-15 21:30:53'),(4227,'2005-07-07 12:41:36',4186,78,'2005-07-15 12:33:36',1,'2006-02-15 21:30:53'),(4228,'2005-07-07 12:42:02',1020,38,'2005-07-12 10:52:02',1,'2006-02-15 21:30:53'),(4229,'2005-07-07 12:43:23',953,106,'2005-07-13 15:00:23',2,'2006-02-15 21:30:53'),(4230,'2005-07-07 12:46:47',353,205,'2005-07-15 06:52:47',1,'2006-02-15 21:30:53'),(4231,'2005-07-07 12:48:19',3522,194,'2005-07-13 18:45:19',1,'2006-02-15 21:30:53'),(4232,'2005-07-07 12:49:12',3841,347,'2005-07-15 16:45:12',1,'2006-02-15 21:30:53'),(4233,'2005-07-07 13:00:20',1849,488,'2005-07-13 16:37:20',1,'2006-02-15 21:30:53'),(4234,'2005-07-07 13:01:35',1179,195,'2005-07-15 13:05:35',1,'2006-02-15 21:30:53'),(4235,'2005-07-07 13:05:52',3525,86,'2005-07-10 12:17:52',2,'2006-02-15 21:30:53'),(4236,'2005-07-07 13:12:07',642,213,'2005-07-08 15:00:07',2,'2006-02-15 21:30:53'),(4237,'2005-07-07 13:16:55',3773,477,'2005-07-15 16:33:55',1,'2006-02-15 21:30:53'),(4238,'2005-07-07 13:22:20',3024,7,'2005-07-10 07:44:20',2,'2006-02-15 21:30:53'),(4239,'2005-07-07 13:23:17',3866,122,'2005-07-13 17:49:17',1,'2006-02-15 21:30:53'),(4240,'2005-07-07 13:33:12',1024,65,'2005-07-13 12:28:12',1,'2006-02-15 21:30:53'),(4241,'2005-07-07 13:39:00',4154,595,'2005-07-12 17:49:00',2,'2006-02-15 21:30:53'),(4242,'2005-07-07 13:39:01',3626,286,'2005-07-12 18:29:01',1,'2006-02-15 21:30:53'),(4243,'2005-07-07 13:39:58',4559,339,'2005-07-12 19:27:58',1,'2006-02-15 21:30:53'),(4244,'2005-07-07 13:41:58',592,581,'2005-07-09 15:32:58',2,'2006-02-15 21:30:53'),(4245,'2005-07-07 13:48:33',3743,91,'2005-07-10 09:54:33',1,'2006-02-15 21:30:53'),(4246,'2005-07-07 13:49:03',1141,411,'2005-07-09 13:01:03',1,'2006-02-15 21:30:53'),(4247,'2005-07-07 13:51:54',808,539,'2005-07-10 09:43:54',2,'2006-02-15 21:30:53'),(4248,'2005-07-07 13:59:20',773,161,'2005-07-14 15:18:20',2,'2006-02-15 21:30:53'),(4249,'2005-07-07 14:05:17',4185,111,'2005-07-10 09:21:17',2,'2006-02-15 21:30:53'),(4250,'2005-07-07 14:08:11',2556,423,'2005-07-13 08:09:11',2,'2006-02-15 21:30:53'),(4251,'2005-07-07 14:11:55',3541,367,'2005-07-16 14:01:55',2,'2006-02-15 21:30:53'),(4252,'2005-07-07 14:13:05',474,154,'2005-07-09 14:17:05',1,'2006-02-15 21:30:53'),(4253,'2005-07-07 14:13:13',3355,157,'2005-07-16 18:55:13',2,'2006-02-15 21:30:53'),(4254,'2005-07-07 14:13:52',3957,529,'2005-07-12 10:39:52',2,'2006-02-15 21:30:53'),(4255,'2005-07-07 14:14:13',749,10,'2005-07-12 18:32:13',1,'2006-02-15 21:30:53'),(4256,'2005-07-07 14:14:36',1386,129,'2005-07-10 09:41:36',1,'2006-02-15 21:30:53'),(4257,'2005-07-07 14:18:41',3927,553,'2005-07-08 14:58:41',1,'2006-02-15 21:30:53'),(4258,'2005-07-07 14:20:59',1562,492,'2005-07-16 10:03:59',1,'2006-02-15 21:30:53'),(4259,'2005-07-07 14:22:18',4378,467,'2005-07-11 19:38:18',1,'2006-02-15 21:30:53'),(4260,'2005-07-07 14:22:45',4575,305,'2005-07-08 15:10:45',2,'2006-02-15 21:30:53'),(4261,'2005-07-07 14:23:56',1405,496,'2005-07-13 15:26:56',1,'2006-02-15 21:30:53'),(4262,'2005-07-07 14:24:30',3122,29,'2005-07-14 13:12:30',1,'2006-02-15 21:30:53'),(4263,'2005-07-07 14:24:44',2975,16,'2005-07-13 18:22:44',1,'2006-02-15 21:30:53'),(4264,'2005-07-07 14:25:28',3499,406,'2005-07-08 08:49:28',2,'2006-02-15 21:30:53'),(4265,'2005-07-07 14:27:51',1685,69,'2005-07-12 19:55:51',2,'2006-02-15 21:30:53'),(4266,'2005-07-07 14:34:50',1578,509,'2005-07-08 09:23:50',2,'2006-02-15 21:30:53'),(4267,'2005-07-07 14:35:30',136,410,'2005-07-11 10:41:30',1,'2006-02-15 21:30:53'),(4268,'2005-07-07 14:36:05',432,80,'2005-07-16 14:36:05',1,'2006-02-15 21:30:53'),(4269,'2005-07-07 14:38:33',415,496,'2005-07-09 10:27:33',1,'2006-02-15 21:30:53'),(4270,'2005-07-07 14:38:41',183,210,'2005-07-10 19:07:41',2,'2006-02-15 21:30:53'),(4271,'2005-07-07 14:38:52',533,150,'2005-07-15 12:05:52',1,'2006-02-15 21:30:53'),(4272,'2005-07-07 14:39:20',488,120,'2005-07-13 08:57:20',2,'2006-02-15 21:30:53'),(4273,'2005-07-07 14:40:22',4163,159,'2005-07-13 09:58:22',2,'2006-02-15 21:30:53'),(4274,'2005-07-07 14:42:04',787,26,'2005-07-13 20:23:04',1,'2006-02-15 21:30:53'),(4275,'2005-07-07 14:43:51',1167,393,'2005-07-15 18:04:51',2,'2006-02-15 21:30:53'),(4276,'2005-07-07 14:50:59',221,366,'2005-07-09 15:42:59',2,'2006-02-15 21:30:53'),(4277,'2005-07-07 14:52:12',1983,106,'2005-07-09 13:10:12',1,'2006-02-15 21:30:53'),(4278,'2005-07-07 14:53:24',3693,6,'2005-07-13 14:21:24',2,'2006-02-15 21:30:53'),(4279,'2005-07-07 15:01:53',581,335,'2005-07-08 09:43:53',1,'2006-02-15 21:30:53'),(4280,'2005-07-07 15:09:31',1115,593,'2005-07-13 14:47:31',1,'2006-02-15 21:30:53'),(4281,'2005-07-07 15:17:50',1182,321,'2005-07-08 11:42:50',2,'2006-02-15 21:30:53'),(4282,'2005-07-07 15:26:31',3134,25,'2005-07-11 14:27:31',1,'2006-02-15 21:30:53'),(4283,'2005-07-07 15:29:35',2807,477,'2005-07-11 17:12:35',1,'2006-02-15 21:30:53'),(4284,'2005-07-07 15:31:57',1313,521,'2005-07-09 10:20:57',2,'2006-02-15 21:30:53'),(4285,'2005-07-07 15:34:35',511,308,'2005-07-15 09:43:35',2,'2006-02-15 21:30:53'),(4286,'2005-07-07 15:36:44',4496,111,'2005-07-11 13:04:44',2,'2006-02-15 21:30:53'),(4287,'2005-07-07 15:37:31',3558,94,'2005-07-16 19:59:31',2,'2006-02-15 21:30:53'),(4288,'2005-07-07 15:38:25',1508,64,'2005-07-13 16:23:25',2,'2006-02-15 21:30:53'),(4289,'2005-07-07 15:45:58',3172,231,'2005-07-09 11:11:58',2,'2006-02-15 21:30:53'),(4290,'2005-07-07 15:47:10',4174,277,'2005-07-15 15:03:10',1,'2006-02-15 21:30:53'),(4291,'2005-07-07 15:47:47',2074,298,'2005-07-10 11:45:47',1,'2006-02-15 21:30:53'),(4292,'2005-07-07 15:48:38',3084,401,'2005-07-15 17:53:38',1,'2006-02-15 21:30:53'),(4293,'2005-07-07 15:53:47',984,221,'2005-07-10 18:11:47',1,'2006-02-15 21:30:53'),(4294,'2005-07-07 15:56:23',2845,41,'2005-07-15 14:50:23',2,'2006-02-15 21:30:53'),(4295,'2005-07-07 16:08:51',2490,319,'2005-07-13 13:06:51',2,'2006-02-15 21:30:53'),(4296,'2005-07-07 16:16:03',977,407,'2005-07-08 20:16:03',2,'2006-02-15 21:30:53'),(4297,'2005-07-07 16:24:09',882,141,'2005-07-13 15:08:09',2,'2006-02-15 21:30:53'),(4298,'2005-07-07 16:27:25',1055,560,'2005-07-12 18:20:25',1,'2006-02-15 21:30:53'),(4299,'2005-07-07 16:33:48',870,80,'2005-07-16 11:48:48',1,'2006-02-15 21:30:53'),(4300,'2005-07-07 16:36:16',1189,38,'2005-07-10 13:59:16',2,'2006-02-15 21:30:53'),(4301,'2005-07-07 16:37:23',1630,440,'2005-07-11 18:05:23',2,'2006-02-15 21:30:53'),(4302,'2005-07-07 16:47:53',3669,332,'2005-07-16 22:22:53',2,'2006-02-15 21:30:53'),(4303,'2005-07-07 16:57:32',818,108,'2005-07-14 17:42:32',2,'2006-02-15 21:30:53'),(4304,'2005-07-07 17:01:19',3382,165,'2005-07-12 22:47:19',2,'2006-02-15 21:30:53'),(4305,'2005-07-07 17:07:11',3926,240,'2005-07-08 16:15:11',2,'2006-02-15 21:30:53'),(4306,'2005-07-07 17:12:32',1219,210,'2005-07-16 11:24:32',2,'2006-02-15 21:30:53'),(4307,'2005-07-07 17:20:39',2827,394,'2005-07-16 14:42:39',1,'2006-02-15 21:30:53'),(4308,'2005-07-07 17:29:16',1482,168,'2005-07-11 21:47:16',1,'2006-02-15 21:30:53'),(4309,'2005-07-07 17:29:41',3549,209,'2005-07-14 22:22:41',2,'2006-02-15 21:30:53'),(4310,'2005-07-07 17:30:56',3842,390,'2005-07-12 13:19:56',2,'2006-02-15 21:30:53'),(4311,'2005-07-07 17:31:14',2985,498,'2005-07-11 19:21:14',2,'2006-02-15 21:30:53'),(4312,'2005-07-07 17:34:59',3870,97,'2005-07-09 17:45:59',2,'2006-02-15 21:30:53'),(4313,'2005-07-07 17:36:56',91,29,'2005-07-13 12:00:56',1,'2006-02-15 21:30:53'),(4314,'2005-07-07 17:38:31',539,184,'2005-07-09 20:24:31',1,'2006-02-15 21:30:53'),(4315,'2005-07-07 17:40:26',1472,195,'2005-07-09 22:58:26',2,'2006-02-15 21:30:53'),(4316,'2005-07-07 17:44:22',517,301,'2005-07-14 15:12:22',2,'2006-02-15 21:30:53'),(4317,'2005-07-07 17:44:49',2234,110,'2005-07-08 21:48:49',2,'2006-02-15 21:30:53'),(4318,'2005-07-07 17:47:50',1607,321,'2005-07-14 12:15:50',2,'2006-02-15 21:30:53'),(4319,'2005-07-07 17:50:27',3389,25,'2005-07-10 13:53:27',2,'2006-02-15 21:30:53'),(4320,'2005-07-07 17:51:59',3437,376,'2005-07-13 18:39:59',1,'2006-02-15 21:30:53'),(4321,'2005-07-07 17:52:38',612,91,'2005-07-11 23:37:38',1,'2006-02-15 21:30:53'),(4322,'2005-07-07 17:54:37',1522,568,'2005-07-14 13:56:37',1,'2006-02-15 21:30:53'),(4323,'2005-07-07 17:55:53',1287,336,'2005-07-13 16:43:53',2,'2006-02-15 21:30:53'),(4324,'2005-07-07 17:57:56',952,226,'2005-07-13 22:34:56',1,'2006-02-15 21:30:53'),(4325,'2005-07-07 17:59:24',3728,373,'2005-07-16 17:10:24',2,'2006-02-15 21:30:53'),(4326,'2005-07-07 18:01:22',4037,331,'2005-07-16 15:45:22',1,'2006-02-15 21:30:53'),(4327,'2005-07-07 18:01:39',860,73,'2005-07-12 22:40:39',1,'2006-02-15 21:30:53'),(4328,'2005-07-07 18:03:17',2174,264,'2005-07-14 16:14:17',1,'2006-02-15 21:30:53'),(4329,'2005-07-07 18:04:16',638,504,'2005-07-15 17:58:16',2,'2006-02-15 21:30:53'),(4330,'2005-07-07 18:09:41',2408,408,'2005-07-14 22:05:41',1,'2006-02-15 21:30:53'),(4331,'2005-07-07 18:22:30',419,535,'2005-07-13 18:20:30',1,'2006-02-15 21:30:53'),(4332,'2005-07-07 18:25:26',1714,137,'2005-07-16 15:05:26',1,'2006-02-15 21:30:53'),(4333,'2005-07-07 18:31:50',76,113,'2005-07-08 21:26:50',1,'2006-02-15 21:30:53'),(4334,'2005-07-07 18:32:04',3021,210,'2005-07-08 16:19:04',1,'2006-02-15 21:30:53'),(4335,'2005-07-07 18:33:57',1332,375,'2005-07-11 13:23:57',1,'2006-02-15 21:30:53'),(4336,'2005-07-07 18:34:36',482,532,'2005-07-10 17:58:36',2,'2006-02-15 21:30:53'),(4337,'2005-07-07 18:36:37',2313,464,'2005-07-14 14:59:37',2,'2006-02-15 21:30:53'),(4338,'2005-07-07 18:39:56',3152,581,'2005-07-12 21:03:56',1,'2006-02-15 21:30:53'),(4339,'2005-07-07 18:41:42',3215,130,'2005-07-08 13:00:42',1,'2006-02-15 21:30:53'),(4340,'2005-07-07 18:41:46',3919,227,'2005-07-16 21:27:46',1,'2006-02-15 21:30:53'),(4341,'2005-07-07 18:44:23',4523,124,'2005-07-15 18:13:23',1,'2006-02-15 21:30:53'),(4342,'2005-07-07 18:47:03',1355,120,'2005-07-09 21:59:03',2,'2006-02-15 21:30:53'),(4343,'2005-07-07 18:48:54',1926,293,'2005-07-12 15:19:54',1,'2006-02-15 21:30:53'),(4344,'2005-07-07 18:50:47',1185,99,'2005-07-12 16:38:47',2,'2006-02-15 21:30:53'),(4345,'2005-07-07 18:52:57',2235,225,'2005-07-15 21:24:57',2,'2006-02-15 21:30:53'),(4346,'2005-07-07 18:58:45',1906,520,'2005-07-10 16:37:45',1,'2006-02-15 21:30:53'),(4347,'2005-07-07 18:58:57',1964,344,'2005-07-14 16:35:57',2,'2006-02-15 21:30:53'),(4348,'2005-07-07 19:02:05',1948,452,'2005-07-09 20:51:05',2,'2006-02-15 21:30:53'),(4349,'2005-07-07 19:02:37',3430,182,'2005-07-09 17:25:37',2,'2006-02-15 21:30:53'),(4350,'2005-07-07 19:02:41',2223,299,'2005-07-09 15:27:41',1,'2006-02-15 21:30:53'),(4351,'2005-07-07 19:04:24',3567,382,'2005-07-14 00:03:24',2,'2006-02-15 21:30:53'),(4352,'2005-07-07 19:15:58',2636,249,'2005-07-16 20:22:58',2,'2006-02-15 21:30:53'),(4353,'2005-07-07 19:19:05',368,452,'2005-07-13 13:40:05',1,'2006-02-15 21:30:53'),(4354,'2005-07-07 19:21:02',4423,208,'2005-07-15 17:03:02',2,'2006-02-15 21:30:53'),(4355,'2005-07-07 19:21:19',4557,438,'2005-07-09 00:55:19',2,'2006-02-15 21:30:53'),(4356,'2005-07-07 19:21:22',1907,318,'2005-07-16 15:57:22',1,'2006-02-15 21:30:53'),(4357,'2005-07-07 19:24:39',3413,103,'2005-07-12 00:11:39',1,'2006-02-15 21:30:53'),(4358,'2005-07-07 19:27:04',3136,446,'2005-07-14 23:46:04',1,'2006-02-15 21:30:53'),(4359,'2005-07-07 19:30:20',3222,282,'2005-07-09 13:34:20',1,'2006-02-15 21:30:53'),(4360,'2005-07-07 19:31:12',1811,92,'2005-07-10 23:11:12',2,'2006-02-15 21:30:53'),(4361,'2005-07-07 19:33:23',116,425,'2005-07-12 22:36:23',1,'2006-02-15 21:30:53'),(4362,'2005-07-07 19:35:30',3759,425,'2005-07-14 14:59:30',1,'2006-02-15 21:30:53'),(4363,'2005-07-07 19:43:28',3202,168,'2005-07-13 00:15:28',2,'2006-02-15 21:30:53'),(4364,'2005-07-07 19:46:51',10,145,'2005-07-08 21:55:51',1,'2006-02-15 21:30:53'),(4365,'2005-07-07 19:47:46',3207,442,'2005-07-08 23:21:46',2,'2006-02-15 21:30:53'),(4366,'2005-07-07 19:48:36',2961,524,'2005-07-14 01:14:36',1,'2006-02-15 21:30:53'),(4367,'2005-07-07 19:52:01',4529,48,'2005-07-13 19:41:01',2,'2006-02-15 21:30:53'),(4368,'2005-07-07 19:55:19',736,324,'2005-07-09 00:11:19',1,'2006-02-15 21:30:53'),(4369,'2005-07-07 20:01:38',3552,517,'2005-07-13 01:19:38',2,'2006-02-15 21:30:53'),(4370,'2005-07-07 20:05:36',1591,559,'2005-07-16 23:58:36',1,'2006-02-15 21:30:53'),(4371,'2005-07-07 20:06:45',2533,90,'2005-07-08 18:50:45',1,'2006-02-15 21:30:53'),(4372,'2005-07-07 20:09:01',2207,252,'2005-07-09 18:24:01',1,'2006-02-15 21:30:53'),(4373,'2005-07-07 20:10:59',3593,470,'2005-07-12 21:30:59',2,'2006-02-15 21:30:53'),(4374,'2005-07-07 20:13:58',4377,517,'2005-07-11 18:11:58',2,'2006-02-15 21:30:53'),(4375,'2005-07-07 20:20:29',3035,560,'2005-07-16 19:29:29',2,'2006-02-15 21:30:53'),(4376,'2005-07-07 20:24:33',1344,151,'2005-07-11 18:32:33',1,'2006-02-15 21:30:53'),(4377,'2005-07-07 20:28:57',3294,205,'2005-07-16 02:13:57',2,'2006-02-15 21:30:53'),(4378,'2005-07-07 20:29:08',1244,24,'2005-07-12 19:17:08',2,'2006-02-15 21:30:53'),(4379,'2005-07-07 20:32:30',2773,316,'2005-07-11 20:40:30',2,'2006-02-15 21:30:53'),(4380,'2005-07-07 20:35:00',3164,353,'2005-07-14 17:06:00',1,'2006-02-15 21:30:53'),(4381,'2005-07-07 20:37:53',3727,486,'2005-07-10 16:54:53',1,'2006-02-15 21:30:53'),(4382,'2005-07-07 20:41:03',657,26,'2005-07-14 15:15:03',1,'2006-02-15 21:30:53'),(4383,'2005-07-07 20:45:51',2649,591,'2005-07-17 00:52:51',2,'2006-02-15 21:30:53'),(4384,'2005-07-07 20:46:45',1178,59,'2005-07-16 21:54:45',1,'2006-02-15 21:30:53'),(4385,'2005-07-07 20:48:38',849,564,'2005-07-11 17:03:38',2,'2006-02-15 21:30:53'),(4386,'2005-07-07 20:55:19',499,314,'2005-07-10 21:51:19',1,'2006-02-15 21:30:53'),(4387,'2005-07-07 20:56:47',591,335,'2005-07-16 00:51:47',1,'2006-02-15 21:30:53'),(4388,'2005-07-07 20:58:03',3150,210,'2005-07-16 20:05:03',2,'2006-02-15 21:30:53'),(4389,'2005-07-07 20:58:58',1672,166,'2005-07-13 19:57:58',2,'2006-02-15 21:30:53'),(4390,'2005-07-07 20:59:06',6,44,'2005-07-09 00:04:06',2,'2006-02-15 21:30:53'),(4391,'2005-07-07 21:09:38',2135,42,'2005-07-09 17:35:38',1,'2006-02-15 21:30:53'),(4392,'2005-07-07 21:11:02',4236,491,'2005-07-13 21:52:02',1,'2006-02-15 21:30:53'),(4393,'2005-07-07 21:12:36',4034,395,'2005-07-09 22:41:36',2,'2006-02-15 21:30:53'),(4394,'2005-07-07 21:12:45',563,156,'2005-07-16 18:24:45',2,'2006-02-15 21:30:53'),(4395,'2005-07-07 21:13:22',360,544,'2005-07-08 22:59:22',2,'2006-02-15 21:30:53'),(4396,'2005-07-07 21:14:19',750,275,'2005-07-10 19:22:19',1,'2006-02-15 21:30:53'),(4397,'2005-07-07 21:14:54',3085,494,'2005-07-13 19:24:54',2,'2006-02-15 21:30:53'),(4398,'2005-07-07 21:18:44',3628,426,'2005-07-10 22:45:44',1,'2006-02-15 21:30:53'),(4399,'2005-07-07 21:20:28',4515,402,'2005-07-12 20:57:28',2,'2006-02-15 21:30:53'),(4400,'2005-07-07 21:22:26',49,370,'2005-07-16 00:59:26',2,'2006-02-15 21:30:53'),(4401,'2005-07-07 21:26:27',2725,405,'2005-07-12 17:18:27',2,'2006-02-15 21:30:53'),(4402,'2005-07-07 21:28:46',1198,26,'2005-07-08 17:04:46',1,'2006-02-15 21:30:53'),(4403,'2005-07-07 21:29:40',3973,447,'2005-07-09 17:58:40',1,'2006-02-15 21:30:53'),(4404,'2005-07-07 21:31:53',944,25,'2005-07-13 19:00:53',1,'2006-02-15 21:30:53'),(4405,'2005-07-07 21:33:16',2102,145,'2005-07-15 00:33:16',2,'2006-02-15 21:30:53'),(4406,'2005-07-07 21:35:16',438,448,'2005-07-15 16:13:16',2,'2006-02-15 21:30:53'),(4407,'2005-07-07 21:39:45',267,20,'2005-07-11 23:40:45',1,'2006-02-15 21:30:53'),(4408,'2005-07-07 21:41:06',2482,258,'2005-07-11 00:32:06',1,'2006-02-15 21:30:53'),(4409,'2005-07-07 21:47:29',3153,8,'2005-07-11 20:14:29',2,'2006-02-15 21:30:53'),(4410,'2005-07-07 21:48:16',2754,584,'2005-07-09 03:15:16',1,'2006-02-15 21:30:53'),(4411,'2005-07-07 21:54:58',320,224,'2005-07-14 16:14:58',2,'2006-02-15 21:30:53'),(4412,'2005-07-07 21:56:53',1181,282,'2005-07-11 19:28:53',1,'2006-02-15 21:30:53'),(4413,'2005-07-07 22:00:04',1062,565,'2005-07-10 18:20:04',2,'2006-02-15 21:30:53'),(4414,'2005-07-07 22:00:21',991,434,'2005-07-12 02:51:21',1,'2006-02-15 21:30:53'),(4415,'2005-07-07 22:01:43',1403,329,'2005-07-13 03:09:43',2,'2006-02-15 21:30:53'),(4416,'2005-07-07 22:04:36',1247,290,'2005-07-09 02:44:36',2,'2006-02-15 21:30:53'),(4417,'2005-07-07 22:05:05',743,452,'2005-07-09 16:16:05',2,'2006-02-15 21:30:53'),(4418,'2005-07-07 22:05:30',4368,417,'2005-07-11 18:42:30',1,'2006-02-15 21:30:53'),(4419,'2005-07-07 22:06:24',783,39,'2005-07-15 23:59:24',1,'2006-02-15 21:30:53'),(4420,'2005-07-07 22:07:31',4427,346,'2005-07-12 19:14:31',2,'2006-02-15 21:30:53'),(4421,'2005-07-07 22:07:55',4103,417,'2005-07-16 20:21:55',1,'2006-02-15 21:30:53'),(4422,'2005-07-07 22:09:45',1741,345,'2005-07-10 01:43:45',1,'2006-02-15 21:30:53'),(4423,'2005-07-07 22:11:28',2721,526,'2005-07-14 18:49:28',2,'2006-02-15 21:30:53'),(4424,'2005-07-07 22:14:43',662,384,'2005-07-11 01:17:43',1,'2006-02-15 21:30:53'),(4425,'2005-07-07 22:22:44',877,345,'2005-07-08 22:23:44',2,'2006-02-15 21:30:53'),(4426,'2005-07-07 22:28:32',364,242,'2005-07-16 02:04:32',1,'2006-02-15 21:30:53'),(4427,'2005-07-07 22:28:51',1021,69,'2005-07-11 21:37:51',2,'2006-02-15 21:30:53'),(4428,'2005-07-07 22:29:40',2575,181,'2005-07-11 02:46:40',2,'2006-02-15 21:30:53'),(4429,'2005-07-07 22:32:47',2949,187,'2005-07-15 03:10:47',2,'2006-02-15 21:30:53'),(4430,'2005-07-07 22:35:24',3436,278,'2005-07-14 23:49:24',1,'2006-02-15 21:30:53'),(4431,'2005-07-07 22:39:02',936,26,'2005-07-16 19:24:02',1,'2006-02-15 21:30:53'),(4432,'2005-07-07 22:40:02',2779,295,'2005-07-15 01:46:02',1,'2006-02-15 21:30:53'),(4433,'2005-07-07 22:45:41',88,449,'2005-07-16 23:30:41',2,'2006-02-15 21:30:53'),(4434,'2005-07-07 22:48:34',1801,32,'2005-07-09 18:55:34',1,'2006-02-15 21:30:53'),(4435,'2005-07-07 22:51:04',3815,157,'2005-07-14 23:15:04',2,'2006-02-15 21:30:53'),(4436,'2005-07-07 22:52:04',4326,563,'2005-07-10 04:51:04',1,'2006-02-15 21:30:53'),(4437,'2005-07-07 22:55:41',3578,414,'2005-07-13 19:40:41',1,'2006-02-15 21:30:53'),(4438,'2005-07-07 22:56:17',4371,104,'2005-07-16 17:28:17',1,'2006-02-15 21:30:53'),(4439,'2005-07-07 22:57:30',2393,521,'2005-07-10 18:28:30',1,'2006-02-15 21:30:53'),(4440,'2005-07-07 23:00:58',1236,507,'2005-07-08 21:31:58',2,'2006-02-15 21:30:53'),(4441,'2005-07-07 23:04:23',3680,211,'2005-07-13 19:07:23',1,'2006-02-15 21:30:53'),(4442,'2005-07-07 23:05:30',461,123,'2005-07-13 22:20:30',2,'2006-02-15 21:30:53'),(4443,'2005-07-07 23:05:53',72,389,'2005-07-16 01:46:53',1,'2006-02-15 21:30:53'),(4444,'2005-07-07 23:07:44',764,529,'2005-07-14 02:51:44',2,'2006-02-15 21:30:53'),(4445,'2005-07-07 23:08:22',3328,327,'2005-07-16 03:49:22',1,'2006-02-15 21:30:53'),(4446,'2005-07-07 23:12:16',2629,438,'2005-07-13 19:42:16',1,'2006-02-15 21:30:53'),(4447,'2005-07-07 23:15:28',404,549,'2005-07-14 22:53:28',2,'2006-02-15 21:30:53'),(4448,'2005-07-07 23:17:12',2768,536,'2005-07-13 18:26:12',1,'2006-02-15 21:30:53'),(4449,'2005-07-07 23:18:58',2813,354,'2005-07-15 20:40:58',2,'2006-02-15 21:30:53'),(4450,'2005-07-07 23:20:05',1252,345,'2005-07-13 19:50:05',2,'2006-02-15 21:30:53'),(4451,'2005-07-07 23:29:54',179,85,'2005-07-10 23:29:54',2,'2006-02-15 21:30:53'),(4452,'2005-07-07 23:31:54',2414,460,'2005-07-14 04:05:54',1,'2006-02-15 21:30:53'),(4453,'2005-07-07 23:32:39',89,560,'2005-07-12 01:38:39',2,'2006-02-15 21:30:53'),(4454,'2005-07-07 23:37:00',1395,9,'2005-07-11 02:30:00',1,'2006-02-15 21:30:53'),(4455,'2005-07-07 23:43:46',1396,507,'2005-07-08 21:34:46',2,'2006-02-15 21:30:53'),(4456,'2005-07-07 23:45:21',3395,421,'2005-07-13 23:03:21',2,'2006-02-15 21:30:53'),(4457,'2005-07-07 23:45:38',407,567,'2005-07-09 20:02:38',1,'2006-02-15 21:30:53'),(4458,'2005-07-07 23:47:47',1307,229,'2005-07-09 19:17:47',2,'2006-02-15 21:30:53'),(4459,'2005-07-07 23:48:52',3987,227,'2005-07-13 19:37:52',2,'2006-02-15 21:30:53'),(4460,'2005-07-07 23:50:14',4121,592,'2005-07-09 21:55:14',1,'2006-02-15 21:30:53'),(4461,'2005-07-07 23:59:43',3656,286,'2005-07-16 19:44:43',2,'2006-02-15 21:30:53'),(4462,'2005-07-08 00:02:49',4120,257,'2005-07-15 20:48:49',2,'2006-02-15 21:30:53'),(4463,'2005-07-08 00:04:59',4356,422,'2005-07-16 01:19:59',1,'2006-02-15 21:30:53'),(4464,'2005-07-08 00:07:18',4484,583,'2005-07-08 22:14:18',2,'2006-02-15 21:30:53'),(4465,'2005-07-08 00:07:45',2877,329,'2005-07-13 18:08:45',2,'2006-02-15 21:30:53'),(4466,'2005-07-08 00:12:53',3320,304,'2005-07-17 03:49:53',2,'2006-02-15 21:30:53'),(4467,'2005-07-08 00:13:52',4466,339,'2005-07-09 00:52:52',1,'2006-02-15 21:30:53'),(4468,'2005-07-08 00:17:59',3302,170,'2005-07-12 05:51:59',2,'2006-02-15 21:30:53'),(4469,'2005-07-08 00:18:32',2173,192,'2005-07-12 21:17:32',2,'2006-02-15 21:30:53'),(4470,'2005-07-08 00:20:57',3605,145,'2005-07-10 02:31:57',1,'2006-02-15 21:30:53'),(4471,'2005-07-08 00:21:29',263,30,'2005-07-11 18:48:29',2,'2006-02-15 21:30:53'),(4472,'2005-07-08 00:22:06',2089,343,'2005-07-16 20:16:06',1,'2006-02-15 21:30:53'),(4473,'2005-07-08 00:22:10',1387,481,'2005-07-09 21:11:10',1,'2006-02-15 21:30:53'),(4474,'2005-07-08 00:26:56',4474,137,'2005-07-12 23:07:56',1,'2006-02-15 21:30:53'),(4475,'2005-07-08 00:27:30',3466,340,'2005-07-09 05:39:30',1,'2006-02-15 21:30:53'),(4476,'2005-07-08 00:34:25',395,279,'2005-07-08 22:55:25',1,'2006-02-15 21:30:53'),(4477,'2005-07-08 00:38:24',1602,552,'2005-07-13 05:14:24',1,'2006-02-15 21:30:53'),(4478,'2005-07-08 00:39:08',1764,357,'2005-07-11 21:57:08',2,'2006-02-15 21:30:53'),(4479,'2005-07-08 00:52:35',3516,211,'2005-07-09 20:19:35',2,'2006-02-15 21:30:53'),(4480,'2005-07-08 00:56:30',4457,296,'2005-07-10 20:52:30',2,'2006-02-15 21:30:53'),(4481,'2005-07-08 00:58:15',1669,474,'2005-07-11 23:22:15',2,'2006-02-15 21:30:53'),(4482,'2005-07-08 01:01:18',3500,511,'2005-07-11 01:18:18',1,'2006-02-15 21:30:53'),(4483,'2005-07-08 01:03:12',1222,425,'2005-07-17 00:20:12',1,'2006-02-15 21:30:53'),(4484,'2005-07-08 01:05:57',2867,306,'2005-07-16 00:41:57',2,'2006-02-15 21:30:53'),(4485,'2005-07-08 01:07:54',2614,130,'2005-07-16 03:19:54',2,'2006-02-15 21:30:53'),(4486,'2005-07-08 01:09:09',837,197,'2005-07-16 23:40:09',1,'2006-02-15 21:30:53'),(4487,'2005-07-08 01:20:22',2220,360,'2005-07-16 21:23:22',2,'2006-02-15 21:30:53'),(4488,'2005-07-08 01:22:23',2108,89,'2005-07-13 21:17:23',1,'2006-02-15 21:30:53'),(4489,'2005-07-08 01:23:58',4306,259,'2005-07-09 01:35:58',2,'2006-02-15 21:30:53'),(4490,'2005-07-08 01:26:32',2690,161,'2005-07-09 01:13:32',1,'2006-02-15 21:30:53'),(4491,'2005-07-08 01:30:46',1168,413,'2005-07-11 03:12:46',1,'2006-02-15 21:30:53'),(4492,'2005-07-08 01:32:04',1152,247,'2005-07-10 22:11:04',1,'2006-02-15 21:30:53'),(4493,'2005-07-08 01:40:24',1369,167,'2005-07-09 02:17:24',2,'2006-02-15 21:30:53'),(4494,'2005-07-08 01:42:45',1655,349,'2005-07-16 22:29:45',2,'2006-02-15 21:30:53'),(4495,'2005-07-08 01:43:46',3515,404,'2005-07-10 07:38:46',1,'2006-02-15 21:30:53'),(4496,'2005-07-08 01:44:19',150,578,'2005-07-08 20:34:19',2,'2006-02-15 21:30:53'),(4497,'2005-07-08 01:51:32',1995,142,'2005-07-15 22:56:32',1,'2006-02-15 21:30:53'),(4498,'2005-07-08 02:07:50',4299,43,'2005-07-12 23:54:50',2,'2006-02-15 21:30:53'),(4499,'2005-07-08 02:08:48',851,199,'2005-07-10 07:06:48',2,'2006-02-15 21:30:53'),(4500,'2005-07-08 02:10:01',398,462,'2005-07-15 05:49:01',2,'2006-02-15 21:30:53'),(4501,'2005-07-08 02:12:00',1412,262,'2005-07-10 02:16:00',2,'2006-02-15 21:30:53'),(4502,'2005-07-08 02:12:04',225,470,'2005-07-15 02:19:04',2,'2006-02-15 21:30:53'),(4503,'2005-07-08 02:17:12',1503,8,'2005-07-13 08:12:12',1,'2006-02-15 21:30:53'),(4504,'2005-07-08 02:19:27',361,422,'2005-07-12 21:15:27',1,'2006-02-15 21:30:53'),(4505,'2005-07-08 02:20:04',1864,481,'2005-07-14 20:28:04',2,'2006-02-15 21:30:53'),(4506,'2005-07-08 02:22:18',1484,133,'2005-07-13 04:54:18',2,'2006-02-15 21:30:53'),(4507,'2005-07-08 02:22:45',819,505,'2005-07-14 20:53:45',1,'2006-02-15 21:30:53'),(4508,'2005-07-08 02:28:41',3996,97,'2005-07-16 23:59:41',1,'2006-02-15 21:30:53'),(4509,'2005-07-08 02:32:38',1760,230,'2005-07-14 01:05:38',2,'2006-02-15 21:30:53'),(4510,'2005-07-08 02:34:51',1085,27,'2005-07-17 06:03:51',2,'2006-02-15 21:30:53'),(4511,'2005-07-08 02:36:21',4438,75,'2005-07-15 06:01:21',1,'2006-02-15 21:30:53'),(4512,'2005-07-08 02:38:56',1569,424,'2005-07-10 20:46:56',1,'2006-02-15 21:30:53'),(4513,'2005-07-08 02:39:59',3704,182,'2005-07-14 07:48:59',2,'2006-02-15 21:30:53'),(4514,'2005-07-08 02:41:25',1938,576,'2005-07-15 06:17:25',1,'2006-02-15 21:30:53'),(4515,'2005-07-08 02:42:03',1998,229,'2005-07-10 07:22:03',2,'2006-02-15 21:30:53'),(4516,'2005-07-08 02:43:41',2314,497,'2005-07-14 02:20:41',1,'2006-02-15 21:30:53'),(4517,'2005-07-08 02:45:19',453,16,'2005-07-12 03:04:19',2,'2006-02-15 21:30:53'),(4518,'2005-07-08 02:48:36',697,592,'2005-07-13 04:53:36',2,'2006-02-15 21:30:53'),(4519,'2005-07-08 02:51:23',4425,459,'2005-07-12 06:52:23',2,'2006-02-15 21:30:53'),(4520,'2005-07-08 02:53:46',3505,104,'2005-07-08 22:27:46',2,'2006-02-15 21:30:53'),(4521,'2005-07-08 02:57:56',2652,327,'2005-07-11 22:49:56',2,'2006-02-15 21:30:53'),(4522,'2005-07-08 03:03:12',4114,307,'2005-07-10 04:49:12',1,'2006-02-15 21:30:53'),(4523,'2005-07-08 03:06:59',2785,347,'2005-07-17 04:44:59',1,'2006-02-15 21:30:53'),(4524,'2005-07-08 03:10:48',2218,185,'2005-07-09 07:49:48',2,'2006-02-15 21:30:53'),(4525,'2005-07-08 03:15:00',3631,458,'2005-07-11 04:53:00',1,'2006-02-15 21:30:53'),(4526,'2005-07-08 03:17:05',1443,1,'2005-07-14 01:19:05',2,'2006-02-15 21:30:53'),(4527,'2005-07-08 03:20:10',2263,468,'2005-07-15 02:21:10',1,'2006-02-15 21:30:53'),(4528,'2005-07-08 03:24:54',3209,439,'2005-07-09 03:50:54',2,'2006-02-15 21:30:53'),(4529,'2005-07-08 03:26:20',1361,104,'2005-07-16 05:04:20',1,'2006-02-15 21:30:53'),(4530,'2005-07-08 03:27:05',3775,79,'2005-07-11 07:44:05',1,'2006-02-15 21:30:53'),(4531,'2005-07-08 03:27:59',3108,142,'2005-07-10 22:48:59',1,'2006-02-15 21:30:53'),(4532,'2005-07-08 03:30:39',4012,481,'2005-07-11 21:49:39',1,'2006-02-15 21:30:53'),(4533,'2005-07-08 03:32:01',1105,474,'2005-07-10 21:57:01',1,'2006-02-15 21:30:53'),(4534,'2005-07-08 03:36:55',2518,132,'2005-07-16 00:49:55',2,'2006-02-15 21:30:53'),(4535,'2005-07-08 03:40:46',561,29,'2005-07-13 06:53:46',2,'2006-02-15 21:30:53'),(4536,'2005-07-08 03:43:22',220,26,'2005-07-15 08:44:22',1,'2006-02-15 21:30:53'),(4537,'2005-07-08 03:48:40',1305,448,'2005-07-13 22:54:40',2,'2006-02-15 21:30:53'),(4538,'2005-07-08 03:56:29',3638,451,'2005-07-15 08:24:29',1,'2006-02-15 21:30:53'),(4539,'2005-07-08 04:01:02',2450,264,'2005-07-14 22:32:02',1,'2006-02-15 21:30:53'),(4540,'2005-07-08 04:03:28',4160,309,'2005-07-13 03:31:28',2,'2006-02-15 21:30:53'),(4541,'2005-07-08 04:04:19',1976,248,'2005-07-13 07:27:19',2,'2006-02-15 21:30:53'),(4542,'2005-07-08 04:06:30',4169,293,'2005-07-16 06:54:30',2,'2006-02-15 21:30:53'),(4543,'2005-07-08 04:06:55',913,41,'2005-07-12 23:17:55',2,'2006-02-15 21:30:53'),(4544,'2005-07-08 04:11:04',4471,351,'2005-07-09 22:48:04',1,'2006-02-15 21:30:53'),(4545,'2005-07-08 04:17:47',3658,271,'2005-07-13 07:19:47',1,'2006-02-15 21:30:53'),(4546,'2005-07-08 04:18:36',4507,393,'2005-07-17 08:23:36',1,'2006-02-15 21:30:53'),(4547,'2005-07-08 04:20:19',3386,255,'2005-07-09 00:28:19',2,'2006-02-15 21:30:53'),(4548,'2005-07-08 04:21:54',765,164,'2005-07-14 23:16:54',2,'2006-02-15 21:30:53'),(4549,'2005-07-08 04:25:03',2797,98,'2005-07-10 09:01:03',2,'2006-02-15 21:30:53'),(4550,'2005-07-08 04:34:00',615,409,'2005-07-14 23:45:00',2,'2006-02-15 21:30:53'),(4551,'2005-07-08 04:36:21',1160,494,'2005-07-17 10:23:21',2,'2006-02-15 21:30:53'),(4552,'2005-07-08 04:36:35',2549,313,'2005-07-14 05:48:35',2,'2006-02-15 21:30:53'),(4553,'2005-07-08 04:43:41',2114,529,'2005-07-09 23:55:41',1,'2006-02-15 21:30:53'),(4554,'2005-07-08 04:48:03',3878,376,'2005-07-16 04:34:03',1,'2006-02-15 21:30:53'),(4555,'2005-07-08 04:48:36',1757,68,'2005-07-17 07:57:36',1,'2006-02-15 21:30:53'),(4556,'2005-07-08 04:48:41',4099,348,'2005-07-16 08:51:41',2,'2006-02-15 21:30:53'),(4557,'2005-07-08 04:49:15',1191,132,'2005-07-14 00:00:15',2,'2006-02-15 21:30:53'),(4558,'2005-07-08 04:55:26',828,448,'2005-07-09 10:53:26',2,'2006-02-15 21:30:53'),(4559,'2005-07-08 04:56:49',1911,424,'2005-07-12 08:56:49',2,'2006-02-15 21:30:53'),(4560,'2005-07-08 04:58:48',303,36,'2005-07-10 04:27:48',1,'2006-02-15 21:30:53'),(4561,'2005-07-08 05:02:43',1643,500,'2005-07-11 04:56:43',1,'2006-02-15 21:30:53'),(4562,'2005-07-08 05:08:32',963,454,'2005-07-12 08:16:32',2,'2006-02-15 21:30:53'),(4563,'2005-07-08 05:08:55',287,522,'2005-07-16 05:44:55',2,'2006-02-15 21:30:53'),(4564,'2005-07-08 05:09:38',2494,519,'2005-07-11 05:37:38',2,'2006-02-15 21:30:53'),(4565,'2005-07-08 05:12:28',3755,563,'2005-07-17 03:38:28',2,'2006-02-15 21:30:53'),(4566,'2005-07-08 05:18:50',4302,133,'2005-07-15 01:53:50',1,'2006-02-15 21:30:53'),(4567,'2005-07-08 05:20:04',4073,202,'2005-07-10 01:35:04',1,'2006-02-15 21:30:53'),(4568,'2005-07-08 05:23:59',2626,122,'2005-07-09 06:07:59',1,'2006-02-15 21:30:53'),(4569,'2005-07-08 05:30:51',2925,366,'2005-07-14 04:14:51',2,'2006-02-15 21:30:53'),(4570,'2005-07-08 05:33:59',2612,503,'2005-07-14 09:27:59',1,'2006-02-15 21:30:53'),(4571,'2005-07-08 05:34:41',2416,86,'2005-07-17 02:15:41',1,'2006-02-15 21:30:53'),(4572,'2005-07-08 05:36:59',1324,323,'2005-07-12 04:46:59',2,'2006-02-15 21:30:53'),(4573,'2005-07-08 05:38:46',2478,400,'2005-07-15 07:07:46',1,'2006-02-15 21:30:53'),(4574,'2005-07-08 05:39:42',536,257,'2005-07-08 23:44:42',2,'2006-02-15 21:30:53'),(4575,'2005-07-08 05:49:14',231,41,'2005-07-11 04:08:14',2,'2006-02-15 21:30:53'),(4576,'2005-07-08 05:51:19',1920,567,'2005-07-10 11:36:19',1,'2006-02-15 21:30:53'),(4577,'2005-07-08 05:59:00',1688,442,'2005-07-16 06:23:00',2,'2006-02-15 21:30:53'),(4578,'2005-07-08 06:00:17',1533,497,'2005-07-10 06:58:17',2,'2006-02-15 21:30:53'),(4579,'2005-07-08 06:01:56',4290,585,'2005-07-13 11:24:56',1,'2006-02-15 21:30:53'),(4580,'2005-07-08 06:04:23',3512,199,'2005-07-15 05:42:23',2,'2006-02-15 21:30:53'),(4581,'2005-07-08 06:05:06',887,591,'2005-07-16 00:54:06',1,'2006-02-15 21:30:53'),(4582,'2005-07-08 06:09:09',688,274,'2005-07-14 02:23:09',1,'2006-02-15 21:30:53'),(4583,'2005-07-08 06:09:44',4151,365,'2005-07-12 03:44:44',1,'2006-02-15 21:30:53'),(4584,'2005-07-08 06:11:02',2322,368,'2005-07-11 05:14:02',1,'2006-02-15 21:30:53'),(4585,'2005-07-08 06:11:58',1622,143,'2005-07-17 01:58:58',1,'2006-02-15 21:30:53'),(4586,'2005-07-08 06:12:33',1374,461,'2005-07-13 11:06:33',2,'2006-02-15 21:30:53'),(4587,'2005-07-08 06:16:26',3502,63,'2005-07-13 00:59:26',1,'2006-02-15 21:30:53'),(4588,'2005-07-08 06:18:01',3629,198,'2005-07-10 08:59:01',1,'2006-02-15 21:30:53'),(4589,'2005-07-08 06:26:04',1192,99,'2005-07-09 10:31:04',2,'2006-02-15 21:30:53'),(4590,'2005-07-08 06:27:48',4233,580,'2005-07-14 07:46:48',1,'2006-02-15 21:30:53'),(4591,'2005-07-08 06:29:43',2276,182,'2005-07-17 07:20:43',1,'2006-02-15 21:30:53'),(4592,'2005-07-08 06:31:28',2141,235,'2005-07-10 06:08:28',2,'2006-02-15 21:30:53'),(4593,'2005-07-08 06:38:12',2897,528,'2005-07-16 10:48:12',2,'2006-02-15 21:30:53'),(4594,'2005-07-08 06:40:06',26,506,'2005-07-16 05:51:06',2,'2006-02-15 21:30:53'),(4595,'2005-07-08 06:40:25',760,336,'2005-07-14 08:54:25',1,'2006-02-15 21:30:53'),(4596,'2005-07-08 06:41:25',2280,306,'2005-07-14 01:36:25',1,'2006-02-15 21:30:53'),(4597,'2005-07-08 06:43:42',3767,545,'2005-07-13 01:32:42',1,'2006-02-15 21:30:53'),(4598,'2005-07-08 06:46:26',258,82,'2005-07-16 01:21:26',1,'2006-02-15 21:30:53'),(4599,'2005-07-08 06:48:26',2098,356,'2005-07-11 07:06:26',1,'2006-02-15 21:30:53'),(4600,'2005-07-08 06:48:37',1526,457,'2005-07-15 10:11:37',1,'2006-02-15 21:30:53'),(4601,'2005-07-08 06:49:10',3184,572,'2005-07-09 07:43:10',1,'2006-02-15 21:30:53'),(4602,'2005-07-08 06:52:40',3616,129,'2005-07-10 06:30:40',1,'2006-02-15 21:30:53'),(4603,'2005-07-08 06:57:07',755,334,'2005-07-17 04:32:07',1,'2006-02-15 21:30:53'),(4604,'2005-07-08 06:58:43',4230,402,'2005-07-14 06:41:43',1,'2006-02-15 21:30:53'),(4605,'2005-07-08 07:00:14',1139,523,'2005-07-16 08:38:14',1,'2006-02-15 21:30:53'),(4606,'2005-07-08 07:05:50',1946,502,'2005-07-16 09:11:50',2,'2006-02-15 21:30:53'),(4607,'2005-07-08 07:15:14',1193,281,'2005-07-11 01:32:14',1,'2006-02-15 21:30:53'),(4608,'2005-07-08 07:19:11',758,11,'2005-07-11 01:37:11',1,'2006-02-15 21:30:53'),(4609,'2005-07-08 07:22:29',3711,573,'2005-07-10 08:06:29',1,'2006-02-15 21:30:53'),(4610,'2005-07-08 07:28:05',1279,265,'2005-07-14 02:10:05',1,'2006-02-15 21:30:53'),(4611,'2005-07-08 07:33:56',3486,1,'2005-07-12 13:25:56',2,'2006-02-15 21:30:53'),(4612,'2005-07-08 07:40:44',82,371,'2005-07-12 03:48:44',1,'2006-02-15 21:30:53'),(4613,'2005-07-08 07:44:49',476,581,'2005-07-09 04:47:49',1,'2006-02-15 21:30:53'),(4614,'2005-07-08 07:45:17',2579,71,'2005-07-12 02:10:17',2,'2006-02-15 21:30:53'),(4615,'2005-07-08 07:46:53',1200,404,'2005-07-16 12:43:53',2,'2006-02-15 21:30:53'),(4616,'2005-07-08 07:48:12',2580,280,'2005-07-10 08:13:12',2,'2006-02-15 21:30:53'),(4617,'2005-07-08 07:55:08',3784,475,'2005-07-17 02:49:08',2,'2006-02-15 21:30:53'),(4618,'2005-07-08 08:00:20',3691,179,'2005-07-14 05:59:20',1,'2006-02-15 21:30:53'),(4619,'2005-07-08 08:01:09',2127,579,'2005-07-16 05:52:09',2,'2006-02-15 21:30:53'),(4620,'2005-07-08 08:01:44',3467,210,'2005-07-16 07:43:44',2,'2006-02-15 21:30:53'),(4621,'2005-07-08 08:02:18',1594,297,'2005-07-12 08:53:18',2,'2006-02-15 21:30:53'),(4622,'2005-07-08 08:02:42',2710,289,'2005-07-10 07:46:42',2,'2006-02-15 21:30:53'),(4623,'2005-07-08 08:03:22',4171,593,'2005-07-12 09:11:22',2,'2006-02-15 21:30:53'),(4624,'2005-07-08 08:12:17',1548,341,'2005-07-15 12:24:17',2,'2006-02-15 21:30:53'),(4625,'2005-07-08 08:14:26',318,473,'2005-07-09 03:45:26',1,'2006-02-15 21:30:53'),(4626,'2005-07-08 08:18:21',37,268,'2005-07-10 11:36:21',1,'2006-02-15 21:30:53'),(4627,'2005-07-08 08:24:39',2383,78,'2005-07-13 11:04:39',2,'2006-02-15 21:30:53'),(4628,'2005-07-08 08:25:52',1888,540,'2005-07-10 11:22:52',1,'2006-02-15 21:30:53'),(4629,'2005-07-08 08:31:26',228,563,'2005-07-17 12:07:26',1,'2006-02-15 21:30:53'),(4630,'2005-07-08 08:33:38',3446,319,'2005-07-09 13:09:38',2,'2006-02-15 21:30:53'),(4631,'2005-07-08 08:38:22',470,59,'2005-07-11 03:33:22',2,'2006-02-15 21:30:53'),(4632,'2005-07-08 08:38:57',4330,393,'2005-07-15 09:33:57',1,'2006-02-15 21:30:53'),(4633,'2005-07-08 08:39:39',3178,348,'2005-07-15 10:23:39',1,'2006-02-15 21:30:53'),(4634,'2005-07-08 08:40:02',811,275,'2005-07-12 04:45:02',2,'2006-02-15 21:30:53'),(4635,'2005-07-08 08:42:40',2434,65,'2005-07-14 10:31:40',1,'2006-02-15 21:30:53'),(4636,'2005-07-08 08:44:32',1858,228,'2005-07-10 08:59:32',2,'2006-02-15 21:30:53'),(4637,'2005-07-08 08:49:54',1917,263,'2005-07-11 13:12:54',2,'2006-02-15 21:30:53'),(4638,'2005-07-08 08:57:20',2240,305,'2005-07-10 05:08:20',2,'2006-02-15 21:30:53'),(4639,'2005-07-08 08:57:21',2459,75,'2005-07-14 11:22:21',2,'2006-02-15 21:30:53'),(4640,'2005-07-08 08:59:34',1147,506,'2005-07-15 03:31:34',1,'2006-02-15 21:30:53'),(4641,'2005-07-08 09:09:46',2436,26,'2005-07-17 03:54:46',2,'2006-02-15 21:30:53'),(4642,'2005-07-08 09:13:28',1962,30,'2005-07-10 06:17:28',2,'2006-02-15 21:30:53'),(4643,'2005-07-08 09:13:56',239,436,'2005-07-10 12:09:56',2,'2006-02-15 21:30:53'),(4644,'2005-07-08 09:14:29',3239,38,'2005-07-10 07:20:29',2,'2006-02-15 21:30:53'),(4645,'2005-07-08 09:20:09',687,400,'2005-07-09 06:07:09',2,'2006-02-15 21:30:53'),(4646,'2005-07-08 09:23:26',618,362,'2005-07-16 04:03:26',1,'2006-02-15 21:30:53'),(4647,'2005-07-08 09:27:36',674,312,'2005-07-16 14:56:36',2,'2006-02-15 21:30:53'),(4648,'2005-07-08 09:31:27',3490,444,'2005-07-13 03:55:27',2,'2006-02-15 21:30:53'),(4649,'2005-07-08 09:32:05',1116,221,'2005-07-15 08:37:05',2,'2006-02-15 21:30:53'),(4650,'2005-07-08 09:32:08',2850,108,'2005-07-15 15:20:08',1,'2006-02-15 21:30:53'),(4651,'2005-07-08 09:39:39',4064,557,'2005-07-09 12:14:39',2,'2006-02-15 21:30:53'),(4652,'2005-07-08 09:47:51',4198,127,'2005-07-16 04:09:51',2,'2006-02-15 21:30:53'),(4653,'2005-07-08 09:48:01',2511,404,'2005-07-17 05:18:01',1,'2006-02-15 21:30:53'),(4654,'2005-07-08 09:48:03',4210,434,'2005-07-17 13:17:03',1,'2006-02-15 21:30:53'),(4655,'2005-07-08 09:49:22',4078,213,'2005-07-15 13:08:22',1,'2006-02-15 21:30:53'),(4656,'2005-07-08 09:50:10',839,141,'2005-07-13 15:00:10',1,'2006-02-15 21:30:53'),(4657,'2005-07-08 09:51:02',1002,54,'2005-07-09 09:29:02',2,'2006-02-15 21:30:53'),(4658,'2005-07-08 09:51:11',3131,166,'2005-07-10 12:30:11',2,'2006-02-15 21:30:53'),(4659,'2005-07-08 09:53:28',4389,425,'2005-07-14 14:56:28',2,'2006-02-15 21:30:53'),(4660,'2005-07-08 09:54:47',1208,139,'2005-07-11 15:19:47',2,'2006-02-15 21:30:53'),(4661,'2005-07-08 09:55:06',2641,518,'2005-07-11 08:26:06',1,'2006-02-15 21:30:53'),(4662,'2005-07-08 09:58:54',1370,553,'2005-07-10 12:51:54',1,'2006-02-15 21:30:53'),(4663,'2005-07-08 09:59:18',2959,139,'2005-07-10 11:25:18',1,'2006-02-15 21:30:53'),(4664,'2005-07-08 10:01:28',1318,546,'2005-07-12 10:37:28',2,'2006-02-15 21:30:53'),(4665,'2005-07-08 10:04:24',575,106,'2005-07-14 15:13:24',1,'2006-02-15 21:30:53'),(4666,'2005-07-08 10:05:02',4576,120,'2005-07-16 07:28:02',1,'2006-02-15 21:30:53'),(4667,'2005-07-08 10:06:26',3348,485,'2005-07-14 04:48:26',1,'2006-02-15 21:30:53'),(4668,'2005-07-08 10:11:45',3971,481,'2005-07-17 13:01:45',2,'2006-02-15 21:30:53'),(4669,'2005-07-08 10:13:08',3494,581,'2005-07-16 07:52:08',1,'2006-02-15 21:30:53'),(4670,'2005-07-08 10:14:18',3317,153,'2005-07-16 15:10:18',2,'2006-02-15 21:30:53'),(4671,'2005-07-08 10:15:32',2139,55,'2005-07-14 08:19:32',2,'2006-02-15 21:30:53'),(4672,'2005-07-08 10:15:38',1922,18,'2005-07-16 05:06:38',1,'2006-02-15 21:30:53'),(4673,'2005-07-08 10:16:00',2792,91,'2005-07-17 10:03:00',2,'2006-02-15 21:30:53'),(4674,'2005-07-08 10:19:28',1617,329,'2005-07-12 12:54:28',2,'2006-02-15 21:30:53'),(4675,'2005-07-08 10:24:22',1309,380,'2005-07-14 11:09:22',1,'2006-02-15 21:30:53'),(4676,'2005-07-08 10:26:02',2590,302,'2005-07-10 13:38:02',2,'2006-02-15 21:30:53'),(4677,'2005-07-08 10:30:36',1226,258,'2005-07-14 12:40:36',1,'2006-02-15 21:30:53'),(4678,'2005-07-08 10:30:40',241,219,'2005-07-13 11:08:40',1,'2006-02-15 21:30:53'),(4679,'2005-07-08 10:33:14',3610,423,'2005-07-15 14:30:14',2,'2006-02-15 21:30:53'),(4680,'2005-07-08 10:35:28',4043,227,'2005-07-14 08:42:28',1,'2006-02-15 21:30:53'),(4681,'2005-07-08 10:36:03',1025,133,'2005-07-16 09:21:03',2,'2006-02-15 21:30:53'),(4682,'2005-07-08 10:38:27',873,263,'2005-07-11 06:29:27',2,'2006-02-15 21:30:53'),(4683,'2005-07-08 10:38:28',3464,283,'2005-07-09 12:07:28',1,'2006-02-15 21:30:53'),(4684,'2005-07-08 10:41:06',503,585,'2005-07-17 10:35:06',1,'2006-02-15 21:30:53'),(4685,'2005-07-08 10:45:13',602,590,'2005-07-12 08:29:13',1,'2006-02-15 21:30:53'),(4686,'2005-07-08 10:53:39',1398,234,'2005-07-10 05:34:39',2,'2006-02-15 21:30:53'),(4687,'2005-07-08 10:54:19',1156,169,'2005-07-10 08:00:19',2,'2006-02-15 21:30:53'),(4688,'2005-07-08 11:03:29',3574,80,'2005-07-17 15:41:29',2,'2006-02-15 21:30:53'),(4689,'2005-07-08 11:03:47',2519,364,'2005-07-16 06:07:47',2,'2006-02-15 21:30:53'),(4690,'2005-07-08 11:04:02',3304,64,'2005-07-15 10:27:02',2,'2006-02-15 21:30:53'),(4691,'2005-07-08 11:04:53',596,126,'2005-07-09 07:48:53',1,'2006-02-15 21:30:53'),(4692,'2005-07-08 11:07:06',1490,288,'2005-07-09 14:08:06',1,'2006-02-15 21:30:53'),(4693,'2005-07-08 11:07:36',1694,221,'2005-07-14 08:40:36',1,'2006-02-15 21:30:53'),(4694,'2005-07-08 11:07:37',3637,229,'2005-07-12 06:53:37',2,'2006-02-15 21:30:53'),(4695,'2005-07-08 11:07:59',805,39,'2005-07-17 16:35:59',1,'2006-02-15 21:30:53'),(4696,'2005-07-08 11:12:27',1358,424,'2005-07-14 05:41:27',1,'2006-02-15 21:30:53'),(4697,'2005-07-08 11:19:14',4143,224,'2005-07-12 07:14:14',2,'2006-02-15 21:30:53'),(4698,'2005-07-08 11:19:31',3963,570,'2005-07-13 13:45:31',2,'2006-02-15 21:30:53'),(4699,'2005-07-08 11:36:56',2462,348,'2005-07-14 11:35:56',2,'2006-02-15 21:30:53'),(4700,'2005-07-08 11:37:21',3889,317,'2005-07-12 15:41:21',1,'2006-02-15 21:30:53'),(4701,'2005-07-08 11:38:48',3012,522,'2005-07-13 15:59:48',2,'2006-02-15 21:30:53'),(4702,'2005-07-08 11:41:36',2593,56,'2005-07-10 06:55:36',1,'2006-02-15 21:30:53'),(4703,'2005-07-08 11:44:56',2859,544,'2005-07-13 09:17:56',1,'2006-02-15 21:30:53'),(4704,'2005-07-08 11:45:35',2291,28,'2005-07-10 09:46:35',1,'2006-02-15 21:30:53'),(4705,'2005-07-08 11:50:38',3709,85,'2005-07-12 15:58:38',2,'2006-02-15 21:30:53'),(4706,'2005-07-08 11:51:41',2512,380,'2005-07-17 12:58:41',1,'2006-02-15 21:30:53'),(4707,'2005-07-08 11:57:28',52,286,'2005-07-10 17:47:28',1,'2006-02-15 21:30:53'),(4708,'2005-07-08 11:59:19',3249,212,'2005-07-17 07:11:19',2,'2006-02-15 21:30:53'),(4709,'2005-07-08 12:04:34',3964,124,'2005-07-15 06:48:34',1,'2006-02-15 21:30:53'),(4710,'2005-07-08 12:04:53',248,590,'2005-07-13 11:28:53',2,'2006-02-15 21:30:53'),(4711,'2005-07-08 12:06:58',2327,563,'2005-07-12 08:37:58',1,'2006-02-15 21:30:53'),(4712,'2005-07-08 12:10:50',2371,39,'2005-07-17 14:54:50',2,'2006-02-15 21:30:53'),(4713,'2005-07-08 12:12:33',1399,207,'2005-07-16 17:13:33',1,'2006-02-15 21:30:53'),(4714,'2005-07-08 12:12:48',1932,385,'2005-07-17 08:43:48',2,'2006-02-15 21:30:53'),(4715,'2005-07-08 12:15:37',4010,276,'2005-07-10 10:37:37',2,'2006-02-15 21:30:53'),(4716,'2005-07-08 12:18:51',1923,391,'2005-07-11 11:06:51',2,'2006-02-15 21:30:53'),(4717,'2005-07-08 12:22:43',1491,453,'2005-07-11 10:24:43',2,'2006-02-15 21:30:53'),(4718,'2005-07-08 12:32:08',1653,535,'2005-07-17 17:34:08',2,'2006-02-15 21:30:53'),(4719,'2005-07-08 12:33:00',1315,556,'2005-07-15 12:30:00',1,'2006-02-15 21:30:53'),(4720,'2005-07-08 12:34:34',2669,452,'2005-07-09 10:28:34',1,'2006-02-15 21:30:53'),(4721,'2005-07-08 12:39:31',3105,234,'2005-07-15 18:07:31',1,'2006-02-15 21:30:53'),(4722,'2005-07-08 12:42:27',3738,590,'2005-07-09 09:14:27',2,'2006-02-15 21:30:53'),(4723,'2005-07-08 12:44:59',965,44,'2005-07-17 07:22:59',2,'2006-02-15 21:30:53'),(4724,'2005-07-08 12:46:30',3375,18,'2005-07-14 12:39:30',1,'2006-02-15 21:30:53'),(4725,'2005-07-08 12:47:11',2058,3,'2005-07-15 09:08:11',2,'2006-02-15 21:30:53'),(4726,'2005-07-08 12:50:54',4369,144,'2005-07-17 07:09:54',2,'2006-02-15 21:30:53'),(4727,'2005-07-08 12:54:15',1251,39,'2005-07-17 14:32:15',2,'2006-02-15 21:30:53'),(4728,'2005-07-08 12:59:01',3687,462,'2005-07-13 13:00:01',1,'2006-02-15 21:30:53'),(4729,'2005-07-08 12:59:40',1429,205,'2005-07-10 13:35:40',2,'2006-02-15 21:30:53'),(4730,'2005-07-08 12:59:49',1619,126,'2005-07-14 16:15:49',2,'2006-02-15 21:30:53'),(4731,'2005-07-08 13:08:18',4124,241,'2005-07-09 13:16:18',2,'2006-02-15 21:30:53'),(4732,'2005-07-08 13:09:45',308,562,'2005-07-14 10:10:45',1,'2006-02-15 21:30:53'),(4733,'2005-07-08 13:12:07',2230,93,'2005-07-13 07:34:07',1,'2006-02-15 21:30:53'),(4734,'2005-07-08 13:12:12',1928,546,'2005-07-10 09:01:12',2,'2006-02-15 21:30:53'),(4735,'2005-07-08 13:12:27',4324,381,'2005-07-13 10:06:27',2,'2006-02-15 21:30:53'),(4736,'2005-07-08 13:22:55',3009,79,'2005-07-17 07:27:55',1,'2006-02-15 21:30:53'),(4737,'2005-07-08 13:23:53',4286,116,'2005-07-12 18:49:53',1,'2006-02-15 21:30:53'),(4738,'2005-07-08 13:24:58',2021,31,'2005-07-17 17:44:58',2,'2006-02-15 21:30:53'),(4739,'2005-07-08 13:25:57',140,197,'2005-07-11 17:36:57',1,'2006-02-15 21:30:53'),(4740,'2005-07-08 13:30:35',2559,379,'2005-07-14 18:43:35',1,'2006-02-15 21:30:53'),(4741,'2005-07-08 13:31:23',516,260,'2005-07-17 12:02:23',2,'2006-02-15 21:30:53'),(4742,'2005-07-08 13:35:23',3022,340,'2005-07-11 10:24:23',2,'2006-02-15 21:30:53'),(4743,'2005-07-08 13:42:36',80,535,'2005-07-11 18:54:36',2,'2006-02-15 21:30:53'),(4744,'2005-07-08 13:43:57',2948,507,'2005-07-12 09:21:57',2,'2006-02-15 21:30:53'),(4745,'2005-07-08 13:45:09',1351,354,'2005-07-12 18:54:09',1,'2006-02-15 21:30:53'),(4746,'2005-07-08 13:47:55',173,148,'2005-07-11 09:06:55',2,'2006-02-15 21:30:53'),(4747,'2005-07-08 13:53:01',3942,383,'2005-07-12 17:10:01',2,'2006-02-15 21:30:53'),(4748,'2005-07-08 13:59:38',4279,9,'2005-07-15 16:51:38',1,'2006-02-15 21:30:53'),(4749,'2005-07-08 14:05:58',1190,236,'2005-07-10 18:35:58',2,'2006-02-15 21:30:53'),(4750,'2005-07-08 14:07:03',3383,198,'2005-07-13 18:05:03',1,'2006-02-15 21:30:53'),(4751,'2005-07-08 14:07:52',3469,436,'2005-07-13 10:37:52',2,'2006-02-15 21:30:53'),(4752,'2005-07-08 14:15:20',3250,512,'2005-07-12 13:22:20',1,'2006-02-15 21:30:53'),(4753,'2005-07-08 14:18:41',1642,391,'2005-07-09 10:00:41',2,'2006-02-15 21:30:53'),(4754,'2005-07-08 14:20:01',3177,108,'2005-07-11 11:50:01',1,'2006-02-15 21:30:53'),(4755,'2005-07-08 14:23:41',661,378,'2005-07-10 19:35:41',1,'2006-02-15 21:30:53'),(4756,'2005-07-08 14:24:00',3068,351,'2005-07-12 16:16:00',1,'2006-02-15 21:30:53'),(4757,'2005-07-08 14:36:51',1278,504,'2005-07-12 15:28:51',1,'2006-02-15 21:30:53'),(4758,'2005-07-08 14:38:02',3698,288,'2005-07-13 12:09:02',2,'2006-02-15 21:30:53'),(4759,'2005-07-08 14:39:22',3999,284,'2005-07-17 15:02:22',2,'2006-02-15 21:30:53'),(4760,'2005-07-08 14:48:07',3718,177,'2005-07-10 12:41:07',2,'2006-02-15 21:30:53'),(4761,'2005-07-08 14:51:45',3556,351,'2005-07-14 20:28:45',1,'2006-02-15 21:30:53'),(4762,'2005-07-08 14:54:42',390,36,'2005-07-12 18:08:42',1,'2006-02-15 21:30:53'),(4763,'2005-07-08 14:57:32',899,465,'2005-07-15 10:00:32',2,'2006-02-15 21:30:53'),(4764,'2005-07-08 15:01:25',1188,89,'2005-07-17 15:16:25',1,'2006-02-15 21:30:53'),(4765,'2005-07-08 15:08:45',469,437,'2005-07-13 10:44:45',1,'2006-02-15 21:30:53'),(4766,'2005-07-08 15:16:04',1057,149,'2005-07-15 11:04:04',2,'2006-02-15 21:30:53'),(4767,'2005-07-08 15:18:53',3744,350,'2005-07-13 15:48:53',1,'2006-02-15 21:30:53'),(4768,'2005-07-08 15:28:20',2787,482,'2005-07-09 11:46:20',1,'2006-02-15 21:30:53'),(4769,'2005-07-08 15:29:16',3462,501,'2005-07-09 18:42:16',2,'2006-02-15 21:30:53'),(4770,'2005-07-08 15:29:46',2406,573,'2005-07-14 13:31:46',1,'2006-02-15 21:30:53'),(4771,'2005-07-08 15:33:32',1060,32,'2005-07-10 12:38:32',1,'2006-02-15 21:30:53'),(4772,'2005-07-08 15:41:11',2156,486,'2005-07-17 15:25:11',1,'2006-02-15 21:30:53'),(4773,'2005-07-08 15:41:39',3025,519,'2005-07-13 18:16:39',1,'2006-02-15 21:30:53'),(4774,'2005-07-08 15:42:28',673,489,'2005-07-16 18:29:28',2,'2006-02-15 21:30:53'),(4775,'2005-07-08 15:44:05',4277,595,'2005-07-11 20:39:05',2,'2006-02-15 21:30:53'),(4776,'2005-07-08 15:44:20',2598,563,'2005-07-17 10:50:20',2,'2006-02-15 21:30:53'),(4777,'2005-07-08 15:48:34',449,102,'2005-07-16 15:25:34',1,'2006-02-15 21:30:53'),(4778,'2005-07-08 15:51:51',611,78,'2005-07-12 16:58:51',2,'2006-02-15 21:30:53'),(4779,'2005-07-08 15:53:41',1321,338,'2005-07-15 20:30:41',1,'2006-02-15 21:30:53'),(4780,'2005-07-08 16:06:51',2740,115,'2005-07-13 18:34:51',1,'2006-02-15 21:30:53'),(4781,'2005-07-08 16:06:55',1818,593,'2005-07-16 11:22:55',2,'2006-02-15 21:30:53'),(4782,'2005-07-08 16:08:51',445,436,'2005-07-17 17:56:51',1,'2006-02-15 21:30:53'),(4783,'2005-07-08 16:09:24',3952,214,'2005-07-16 21:53:24',2,'2006-02-15 21:30:53'),(4784,'2005-07-08 16:09:56',549,182,'2005-07-09 20:35:56',1,'2006-02-15 21:30:53'),(4785,'2005-07-08 16:10:19',58,474,'2005-07-11 18:52:19',1,'2006-02-15 21:30:53'),(4786,'2005-07-08 16:13:05',2724,294,'2005-07-16 15:29:05',1,'2006-02-15 21:30:53'),(4787,'2005-07-08 16:16:04',3929,7,'2005-07-14 18:02:04',2,'2006-02-15 21:30:53'),(4788,'2005-07-08 16:17:35',691,533,'2005-07-11 11:56:35',2,'2006-02-15 21:30:53'),(4789,'2005-07-08 16:22:01',20,73,'2005-07-15 18:29:01',2,'2006-02-15 21:30:53'),(4790,'2005-07-08 16:25:27',100,500,'2005-07-11 11:35:27',1,'2006-02-15 21:30:53'),(4791,'2005-07-08 16:27:24',2505,393,'2005-07-14 21:50:24',2,'2006-02-15 21:30:53'),(4792,'2005-07-08 16:29:38',2132,147,'2005-07-10 16:31:38',2,'2006-02-15 21:30:53'),(4793,'2005-07-08 16:30:01',3090,427,'2005-07-15 17:56:01',1,'2006-02-15 21:30:53'),(4794,'2005-07-08 16:30:11',2497,451,'2005-07-17 12:41:11',2,'2006-02-15 21:30:53'),(4795,'2005-07-08 16:32:54',3409,497,'2005-07-09 14:15:54',1,'2006-02-15 21:30:53'),(4796,'2005-07-08 16:35:44',2484,9,'2005-07-13 11:08:44',2,'2006-02-15 21:30:53'),(4797,'2005-07-08 16:39:05',1389,265,'2005-07-09 11:41:05',1,'2006-02-15 21:30:53'),(4798,'2005-07-08 16:45:16',3874,212,'2005-07-16 13:45:16',2,'2006-02-15 21:30:53'),(4799,'2005-07-08 16:49:27',4112,512,'2005-07-12 19:58:27',2,'2006-02-15 21:30:53'),(4800,'2005-07-08 16:51:08',1940,99,'2005-07-13 14:16:08',2,'2006-02-15 21:30:53'),(4801,'2005-07-08 16:51:36',761,431,'2005-07-13 17:23:36',1,'2006-02-15 21:30:53'),(4802,'2005-07-08 16:55:17',22,562,'2005-07-15 19:34:17',1,'2006-02-15 21:30:53'),(4803,'2005-07-08 16:56:34',1786,174,'2005-07-14 20:16:34',1,'2006-02-15 21:30:53'),(4804,'2005-07-08 16:57:30',3756,269,'2005-07-10 18:25:30',1,'2006-02-15 21:30:53'),(4805,'2005-07-08 16:59:12',377,453,'2005-07-09 15:02:12',1,'2006-02-15 21:30:53'),(4806,'2005-07-08 17:01:02',214,506,'2005-07-15 21:41:02',1,'2006-02-15 21:30:53'),(4807,'2005-07-08 17:01:48',4511,348,'2005-07-16 22:33:48',2,'2006-02-15 21:30:53'),(4808,'2005-07-08 17:02:49',2544,563,'2005-07-12 22:49:49',2,'2006-02-15 21:30:53'),(4809,'2005-07-08 17:03:22',4251,474,'2005-07-17 22:39:22',1,'2006-02-15 21:30:53'),(4810,'2005-07-08 17:04:06',4056,209,'2005-07-09 13:41:06',1,'2006-02-15 21:30:53'),(4811,'2005-07-08 17:04:24',4032,127,'2005-07-12 16:41:24',2,'2006-02-15 21:30:53'),(4812,'2005-07-08 17:07:11',3281,304,'2005-07-17 21:03:11',2,'2006-02-15 21:30:53'),(4813,'2005-07-08 17:09:56',2752,439,'2005-07-09 22:29:56',1,'2006-02-15 21:30:53'),(4814,'2005-07-08 17:11:09',3497,244,'2005-07-17 12:43:09',2,'2006-02-15 21:30:53'),(4815,'2005-07-08 17:12:51',840,581,'2005-07-17 13:14:51',1,'2006-02-15 21:30:53'),(4816,'2005-07-08 17:14:14',2700,207,'2005-07-11 15:03:14',1,'2006-02-15 21:30:53'),(4817,'2005-07-08 17:17:31',1608,145,'2005-07-09 22:32:31',2,'2006-02-15 21:30:53'),(4818,'2005-07-08 17:18:22',115,144,'2005-07-14 14:40:22',1,'2006-02-15 21:30:53'),(4819,'2005-07-08 17:19:15',1342,64,'2005-07-16 14:32:15',1,'2006-02-15 21:30:53'),(4820,'2005-07-08 17:25:23',2672,172,'2005-07-17 20:32:23',2,'2006-02-15 21:30:53'),(4821,'2005-07-08 17:28:08',1690,172,'2005-07-11 17:44:08',1,'2006-02-15 21:30:53'),(4822,'2005-07-08 17:28:47',3970,185,'2005-07-14 13:06:47',1,'2006-02-15 21:30:53'),(4823,'2005-07-08 17:28:54',155,206,'2005-07-11 23:10:54',1,'2006-02-15 21:30:53'),(4824,'2005-07-08 17:37:39',1855,225,'2005-07-16 18:27:39',1,'2006-02-15 21:30:53'),(4825,'2005-07-08 17:43:01',2419,563,'2005-07-11 20:58:01',1,'2006-02-15 21:30:53'),(4826,'2005-07-08 17:44:25',911,180,'2005-07-16 20:14:25',2,'2006-02-15 21:30:53'),(4827,'2005-07-08 17:46:30',4455,110,'2005-07-11 14:12:30',2,'2006-02-15 21:30:53'),(4828,'2005-07-08 17:52:29',1100,92,'2005-07-11 14:35:29',1,'2006-02-15 21:30:53'),(4829,'2005-07-08 17:54:18',2661,133,'2005-07-11 23:41:18',1,'2006-02-15 21:30:53'),(4830,'2005-07-08 17:56:23',1150,359,'2005-07-17 21:40:23',2,'2006-02-15 21:30:53'),(4831,'2005-07-08 18:00:14',2739,243,'2005-07-12 15:54:14',2,'2006-02-15 21:30:53'),(4832,'2005-07-08 18:07:05',1838,509,'2005-07-10 19:37:05',2,'2006-02-15 21:30:53'),(4833,'2005-07-08 18:07:35',2921,581,'2005-07-13 15:29:35',2,'2006-02-15 21:30:53'),(4834,'2005-07-08 18:07:45',1288,301,'2005-07-14 15:27:45',1,'2006-02-15 21:30:53'),(4835,'2005-07-08 18:08:13',2499,95,'2005-07-17 16:51:13',2,'2006-02-15 21:30:53'),(4836,'2005-07-08 18:09:08',2756,311,'2005-07-15 20:19:08',1,'2006-02-15 21:30:53'),(4837,'2005-07-08 18:09:12',1944,149,'2005-07-11 16:40:12',1,'2006-02-15 21:30:53'),(4838,'2005-07-08 18:11:00',3733,84,'2005-07-17 12:57:00',2,'2006-02-15 21:30:53'),(4839,'2005-07-08 18:13:10',1810,556,'2005-07-15 12:49:10',1,'2006-02-15 21:30:53'),(4840,'2005-07-08 18:18:16',1670,119,'2005-07-16 14:59:16',1,'2006-02-15 21:30:53'),(4841,'2005-07-08 18:18:23',518,248,'2005-07-11 16:51:23',2,'2006-02-15 21:30:53'),(4842,'2005-07-08 18:21:30',1438,160,'2005-07-10 22:25:30',2,'2006-02-15 21:30:53'),(4843,'2005-07-08 18:27:28',3640,45,'2005-07-15 00:26:28',2,'2006-02-15 21:30:53'),(4844,'2005-07-08 18:28:13',4057,237,'2005-07-09 21:17:13',2,'2006-02-15 21:30:53'),(4845,'2005-07-08 18:28:20',2337,553,'2005-07-09 14:38:20',2,'2006-02-15 21:30:53'),(4846,'2005-07-08 18:29:05',417,556,'2005-07-10 22:33:05',2,'2006-02-15 21:30:53'),(4847,'2005-07-08 18:29:13',3397,544,'2005-07-15 18:12:13',2,'2006-02-15 21:30:53'),(4848,'2005-07-08 18:30:16',2962,251,'2005-07-12 19:53:16',2,'2006-02-15 21:30:53'),(4849,'2005-07-08 18:34:34',4323,146,'2005-07-14 20:27:34',2,'2006-02-15 21:30:53'),(4850,'2005-07-08 18:39:31',3039,154,'2005-07-13 00:18:31',2,'2006-02-15 21:30:53'),(4851,'2005-07-08 18:40:05',134,557,'2005-07-12 21:46:05',1,'2006-02-15 21:30:53'),(4852,'2005-07-08 18:43:15',3545,418,'2005-07-15 18:48:15',2,'2006-02-15 21:30:53'),(4853,'2005-07-08 18:43:18',1454,23,'2005-07-12 14:28:18',2,'2006-02-15 21:30:53'),(4854,'2005-07-08 18:44:44',3644,487,'2005-07-13 13:37:44',1,'2006-02-15 21:30:53'),(4855,'2005-07-08 18:45:50',1146,337,'2005-07-11 18:23:50',2,'2006-02-15 21:30:53'),(4856,'2005-07-08 18:47:38',2441,7,'2005-07-13 15:02:38',2,'2006-02-15 21:30:53'),(4857,'2005-07-08 18:52:07',2069,211,'2005-07-11 22:06:07',1,'2006-02-15 21:30:53'),(4858,'2005-07-08 18:53:24',3424,447,'2005-07-17 20:32:24',2,'2006-02-15 21:30:53'),(4859,'2005-07-08 18:54:04',1939,369,'2005-07-13 13:04:04',1,'2006-02-15 21:30:53'),(4860,'2005-07-08 18:54:07',428,123,'2005-07-17 15:09:07',2,'2006-02-15 21:30:53'),(4861,'2005-07-08 18:57:30',2984,455,'2005-07-16 15:12:30',2,'2006-02-15 21:30:53'),(4862,'2005-07-08 19:02:46',293,291,'2005-07-17 20:17:46',1,'2006-02-15 21:30:53'),(4863,'2005-07-08 19:03:15',1,431,'2005-07-11 21:29:15',2,'2006-02-15 21:30:53'),(4864,'2005-07-08 19:05:34',2974,281,'2005-07-17 15:05:34',2,'2006-02-15 21:30:53'),(4865,'2005-07-08 19:09:04',1614,418,'2005-07-13 21:25:04',2,'2006-02-15 21:30:53'),(4866,'2005-07-08 19:09:59',4036,278,'2005-07-15 00:51:59',2,'2006-02-15 21:30:53'),(4867,'2005-07-08 19:10:52',4090,593,'2005-07-09 21:43:52',2,'2006-02-15 21:30:53'),(4868,'2005-07-08 19:13:50',1157,307,'2005-07-14 20:59:50',2,'2006-02-15 21:30:53'),(4869,'2005-07-08 19:14:05',2860,376,'2005-07-15 22:27:05',1,'2006-02-15 21:30:53'),(4870,'2005-07-08 19:14:45',3089,260,'2005-07-12 18:58:45',2,'2006-02-15 21:30:53'),(4871,'2005-07-08 19:19:52',2509,210,'2005-07-13 20:27:52',2,'2006-02-15 21:30:53'),(4872,'2005-07-08 19:23:16',1836,103,'2005-07-10 14:17:16',2,'2006-02-15 21:30:53'),(4873,'2005-07-08 19:23:32',4500,473,'2005-07-11 15:24:32',1,'2006-02-15 21:30:53'),(4874,'2005-07-08 19:23:38',2386,223,'2005-07-13 14:39:38',2,'2006-02-15 21:30:53'),(4875,'2005-07-08 19:24:17',843,555,'2005-07-11 19:15:17',2,'2006-02-15 21:30:53'),(4876,'2005-07-08 19:27:50',1959,283,'2005-07-14 15:42:50',1,'2006-02-15 21:30:53'),(4877,'2005-07-08 19:31:02',1846,287,'2005-07-15 19:05:02',1,'2006-02-15 21:30:53'),(4878,'2005-07-08 19:33:49',4009,172,'2005-07-17 17:47:49',1,'2006-02-15 21:30:53'),(4879,'2005-07-08 19:34:55',1406,196,'2005-07-09 15:53:55',1,'2006-02-15 21:30:53'),(4880,'2005-07-08 19:36:17',4178,269,'2005-07-13 00:01:17',1,'2006-02-15 21:30:53'),(4881,'2005-07-08 19:40:34',4346,349,'2005-07-09 17:08:34',2,'2006-02-15 21:30:53'),(4882,'2005-07-08 19:42:03',4540,184,'2005-07-16 22:24:03',1,'2006-02-15 21:30:53'),(4883,'2005-07-08 19:46:58',1366,563,'2005-07-10 15:48:58',1,'2006-02-15 21:30:53'),(4884,'2005-07-08 19:49:17',3543,425,'2005-07-15 23:14:17',2,'2006-02-15 21:30:53'),(4885,'2005-07-08 19:51:17',442,233,'2005-07-12 16:02:17',2,'2006-02-15 21:30:53'),(4886,'2005-07-08 19:53:22',3393,474,'2005-07-09 17:05:22',1,'2006-02-15 21:30:53'),(4887,'2005-07-08 19:59:14',3613,543,'2005-07-15 22:53:14',1,'2006-02-15 21:30:53'),(4888,'2005-07-08 20:04:27',1220,527,'2005-07-10 14:53:27',2,'2006-02-15 21:30:53'),(4889,'2005-07-08 20:04:43',4463,5,'2005-07-13 17:57:43',2,'2006-02-15 21:30:53'),(4890,'2005-07-08 20:05:38',3576,574,'2005-07-14 14:55:38',2,'2006-02-15 21:30:53'),(4891,'2005-07-08 20:06:19',1787,59,'2005-07-16 18:52:19',1,'2006-02-15 21:30:53'),(4892,'2005-07-08 20:06:25',3566,193,'2005-07-14 20:04:25',1,'2006-02-15 21:30:53'),(4893,'2005-07-08 20:19:55',2060,210,'2005-07-15 21:28:55',2,'2006-02-15 21:30:53'),(4894,'2005-07-08 20:21:31',1028,286,'2005-07-11 01:59:31',1,'2006-02-15 21:30:53'),(4895,'2005-07-08 20:22:05',2620,242,'2005-07-12 20:49:05',1,'2006-02-15 21:30:53'),(4896,'2005-07-08 20:23:15',3006,129,'2005-07-10 15:38:15',1,'2006-02-15 21:30:53'),(4897,'2005-07-08 20:25:11',2950,258,'2005-07-09 17:16:11',1,'2006-02-15 21:30:53'),(4898,'2005-07-08 20:31:43',3212,218,'2005-07-15 15:58:43',2,'2006-02-15 21:30:53'),(4899,'2005-07-08 20:37:11',414,32,'2005-07-10 21:53:11',1,'2006-02-15 21:30:53'),(4900,'2005-07-08 20:38:06',3487,426,'2005-07-09 22:45:06',2,'2006-02-15 21:30:53'),(4901,'2005-07-08 20:44:51',2187,507,'2005-07-10 01:04:51',1,'2006-02-15 21:30:53'),(4902,'2005-07-08 20:49:30',2238,554,'2005-07-13 16:54:30',2,'2006-02-15 21:30:53'),(4903,'2005-07-08 20:50:05',1769,132,'2005-07-13 15:27:05',1,'2006-02-15 21:30:53'),(4904,'2005-07-08 20:53:27',2051,173,'2005-07-18 01:16:27',1,'2006-02-15 21:30:53'),(4905,'2005-07-08 20:56:00',4101,246,'2005-07-12 00:19:00',2,'2006-02-15 21:30:53'),(4906,'2005-07-08 20:59:13',1527,490,'2005-07-15 01:12:13',2,'2006-02-15 21:30:53'),(4907,'2005-07-08 21:01:41',1206,209,'2005-07-13 02:23:41',2,'2006-02-15 21:30:53'),(4908,'2005-07-08 21:05:44',1963,160,'2005-07-17 21:33:44',2,'2006-02-15 21:30:53'),(4909,'2005-07-08 21:07:24',1451,228,'2005-07-10 22:34:24',1,'2006-02-15 21:30:53'),(4910,'2005-07-08 21:13:56',3675,219,'2005-07-18 02:39:56',2,'2006-02-15 21:30:53'),(4911,'2005-07-08 21:20:26',4479,66,'2005-07-15 03:11:26',1,'2006-02-15 21:30:53'),(4912,'2005-07-08 21:26:11',2012,275,'2005-07-18 02:19:11',1,'2006-02-15 21:30:53'),(4913,'2005-07-08 21:27:48',982,368,'2005-07-18 02:51:48',1,'2006-02-15 21:30:53'),(4914,'2005-07-08 21:30:53',298,535,'2005-07-17 01:29:53',1,'2006-02-15 21:30:53'),(4915,'2005-07-08 21:31:22',2772,178,'2005-07-13 16:45:22',2,'2006-02-15 21:30:53'),(4916,'2005-07-08 21:32:17',2680,212,'2005-07-14 20:55:17',2,'2006-02-15 21:30:53'),(4917,'2005-07-08 21:32:30',3231,104,'2005-07-09 15:34:30',1,'2006-02-15 21:30:53'),(4918,'2005-07-08 21:37:31',3819,220,'2005-07-11 20:16:31',2,'2006-02-15 21:30:53'),(4919,'2005-07-08 21:41:54',2106,157,'2005-07-11 23:14:54',1,'2006-02-15 21:30:53'),(4920,'2005-07-08 21:42:10',4285,239,'2005-07-15 03:08:10',1,'2006-02-15 21:30:53'),(4921,'2005-07-08 21:43:21',425,109,'2005-07-10 16:06:21',2,'2006-02-15 21:30:53'),(4922,'2005-07-08 21:44:00',2928,577,'2005-07-10 02:58:00',2,'2006-02-15 21:30:53'),(4923,'2005-07-08 21:44:39',932,18,'2005-07-17 15:50:39',2,'2006-02-15 21:30:53'),(4924,'2005-07-08 21:55:25',4344,180,'2005-07-16 16:52:25',1,'2006-02-15 21:30:53'),(4925,'2005-07-08 21:56:00',2169,68,'2005-07-14 17:17:00',2,'2006-02-15 21:30:53'),(4926,'2005-07-08 22:01:48',4155,415,'2005-07-18 03:27:48',1,'2006-02-15 21:30:53'),(4927,'2005-07-08 22:05:35',2566,136,'2005-07-14 23:22:35',2,'2006-02-15 21:30:53'),(4928,'2005-07-08 22:05:41',4363,77,'2005-07-09 23:09:41',2,'2006-02-15 21:30:53'),(4929,'2005-07-08 22:06:18',734,297,'2005-07-17 18:17:18',2,'2006-02-15 21:30:53'),(4930,'2005-07-08 22:15:48',2057,451,'2005-07-15 21:02:48',2,'2006-02-15 21:30:53'),(4931,'2005-07-08 22:16:18',2750,284,'2005-07-17 03:42:18',1,'2006-02-15 21:30:53'),(4932,'2005-07-08 22:17:40',4237,558,'2005-07-15 22:13:40',2,'2006-02-15 21:30:53'),(4933,'2005-07-08 22:18:29',322,579,'2005-07-13 03:47:29',2,'2006-02-15 21:30:53'),(4934,'2005-07-08 22:18:42',1744,517,'2005-07-10 20:44:42',2,'2006-02-15 21:30:53'),(4935,'2005-07-08 22:20:56',2708,230,'2005-07-12 01:01:56',2,'2006-02-15 21:30:53'),(4936,'2005-07-08 22:24:50',2033,298,'2005-07-15 03:14:50',2,'2006-02-15 21:30:53'),(4937,'2005-07-08 22:29:59',33,273,'2005-07-15 21:51:59',2,'2006-02-15 21:30:53'),(4938,'2005-07-08 22:32:53',2164,418,'2005-07-14 16:48:53',2,'2006-02-15 21:30:53'),(4939,'2005-07-08 22:35:30',3201,425,'2005-07-17 22:05:30',1,'2006-02-15 21:30:53'),(4940,'2005-07-08 22:36:06',971,215,'2005-07-15 04:28:06',1,'2006-02-15 21:30:53'),(4941,'2005-07-08 22:39:10',3816,553,'2005-07-15 17:49:10',2,'2006-02-15 21:30:53'),(4942,'2005-07-08 22:42:47',4467,120,'2005-07-15 04:36:47',2,'2006-02-15 21:30:53'),(4943,'2005-07-08 22:43:05',2732,11,'2005-07-15 18:17:05',2,'2006-02-15 21:30:53'),(4944,'2005-07-08 22:44:28',3648,293,'2005-07-17 21:51:28',2,'2006-02-15 21:30:53'),(4945,'2005-07-08 22:45:02',2079,165,'2005-07-11 23:59:02',2,'2006-02-15 21:30:53'),(4946,'2005-07-08 22:46:23',272,440,'2005-07-16 17:19:23',1,'2006-02-15 21:30:53'),(4947,'2005-07-08 22:49:37',3905,388,'2005-07-17 21:03:37',1,'2006-02-15 21:30:53'),(4948,'2005-07-08 22:54:21',2972,518,'2005-07-17 03:52:21',2,'2006-02-15 21:30:53'),(4949,'2005-07-08 22:57:10',1184,567,'2005-07-11 01:26:10',2,'2006-02-15 21:30:53'),(4950,'2005-07-08 22:58:07',3291,148,'2005-07-09 20:41:07',2,'2006-02-15 21:30:53'),(4951,'2005-07-08 22:58:21',2766,28,'2005-07-16 18:58:21',1,'2006-02-15 21:30:53'),(4952,'2005-07-08 23:00:07',459,14,'2005-07-09 21:47:07',1,'2006-02-15 21:30:53'),(4953,'2005-07-08 23:09:48',2460,168,'2005-07-11 02:08:48',2,'2006-02-15 21:30:53'),(4954,'2005-07-08 23:14:16',627,99,'2005-07-14 23:23:16',2,'2006-02-15 21:30:53'),(4955,'2005-07-08 23:16:21',1103,225,'2005-07-14 02:09:21',2,'2006-02-15 21:30:53'),(4956,'2005-07-08 23:17:10',1512,477,'2005-07-18 00:14:10',1,'2006-02-15 21:30:53'),(4957,'2005-07-08 23:18:48',4082,399,'2005-07-09 23:13:48',1,'2006-02-15 21:30:53'),(4958,'2005-07-08 23:19:52',2354,346,'2005-07-17 20:31:52',1,'2006-02-15 21:30:53'),(4959,'2005-07-08 23:22:23',3898,236,'2005-07-10 03:17:23',2,'2006-02-15 21:30:53'),(4960,'2005-07-08 23:27:16',2176,434,'2005-07-18 02:01:16',1,'2006-02-15 21:30:53'),(4961,'2005-07-08 23:35:53',3668,96,'2005-07-14 22:46:53',2,'2006-02-15 21:30:53'),(4962,'2005-07-08 23:36:13',4399,532,'2005-07-15 03:39:13',1,'2006-02-15 21:30:53'),(4963,'2005-07-08 23:38:40',737,404,'2005-07-12 05:33:40',2,'2006-02-15 21:30:53'),(4964,'2005-07-08 23:46:38',1033,455,'2005-07-09 22:19:38',2,'2006-02-15 21:30:53'),(4965,'2005-07-08 23:46:57',535,432,'2005-07-15 18:47:57',1,'2006-02-15 21:30:53'),(4966,'2005-07-08 23:47:25',4360,118,'2005-07-14 03:35:25',1,'2006-02-15 21:30:53'),(4967,'2005-07-08 23:48:03',108,339,'2005-07-15 23:51:03',2,'2006-02-15 21:30:53'),(4968,'2005-07-08 23:49:19',3204,390,'2005-07-14 02:46:19',1,'2006-02-15 21:30:53'),(4969,'2005-07-08 23:51:26',4563,231,'2005-07-12 03:21:26',2,'2006-02-15 21:30:53'),(4970,'2005-07-08 23:54:29',2983,100,'2005-07-16 22:47:29',1,'2006-02-15 21:30:53'),(4971,'2005-07-08 23:54:49',460,64,'2005-07-16 00:15:49',1,'2006-02-15 21:30:53'),(4972,'2005-07-08 23:56:09',2451,498,'2005-07-16 19:15:09',1,'2006-02-15 21:30:53'),(4973,'2005-07-08 23:58:18',391,432,'2005-07-14 21:42:18',1,'2006-02-15 21:30:53'),(4974,'2005-07-09 00:00:36',1071,152,'2005-07-13 21:03:36',1,'2006-02-15 21:30:53'),(4975,'2005-07-09 00:02:46',3730,101,'2005-07-14 18:05:46',2,'2006-02-15 21:30:53'),(4976,'2005-07-09 00:03:30',617,199,'2005-07-10 19:05:30',1,'2006-02-15 21:30:53'),(4977,'2005-07-09 00:15:50',3310,584,'2005-07-10 00:34:50',2,'2006-02-15 21:30:53'),(4978,'2005-07-09 00:22:02',2578,279,'2005-07-18 04:37:02',1,'2006-02-15 21:30:53'),(4979,'2005-07-09 00:24:34',3447,204,'2005-07-12 20:04:34',1,'2006-02-15 21:30:53'),(4980,'2005-07-09 00:26:59',2638,100,'2005-07-14 19:42:59',1,'2006-02-15 21:30:53'),(4981,'2005-07-09 00:29:29',3363,399,'2005-07-16 19:06:29',2,'2006-02-15 21:30:53'),(4982,'2005-07-09 00:30:52',249,162,'2005-07-15 23:50:52',1,'2006-02-15 21:30:53'),(4983,'2005-07-09 00:34:16',1469,81,'2005-07-17 03:21:16',2,'2006-02-15 21:30:53'),(4984,'2005-07-09 00:35:31',1303,214,'2005-07-17 03:44:31',1,'2006-02-15 21:30:53'),(4985,'2005-07-09 00:36:02',2146,208,'2005-07-14 04:06:02',2,'2006-02-15 21:30:53'),(4986,'2005-07-09 00:44:33',3517,589,'2005-07-09 19:45:33',2,'2006-02-15 21:30:53'),(4987,'2005-07-09 00:45:41',996,277,'2005-07-14 03:32:41',2,'2006-02-15 21:30:53'),(4988,'2005-07-09 00:46:14',2718,433,'2005-07-16 01:45:14',2,'2006-02-15 21:30:53'),(4989,'2005-07-09 00:46:56',3326,210,'2005-07-17 06:24:56',1,'2006-02-15 21:30:53'),(4990,'2005-07-09 00:48:49',3305,35,'2005-07-10 06:36:49',2,'2006-02-15 21:30:53'),(4991,'2005-07-09 00:49:03',1856,540,'2005-07-13 05:02:03',1,'2006-02-15 21:30:53'),(4992,'2005-07-09 00:49:37',2081,315,'2005-07-16 02:05:37',1,'2006-02-15 21:30:53'),(4993,'2005-07-09 00:49:47',1740,517,'2005-07-11 21:19:47',1,'2006-02-15 21:30:53'),(4994,'2005-07-09 00:54:13',2546,246,'2005-07-09 21:02:13',1,'2006-02-15 21:30:53'),(4995,'2005-07-09 00:57:46',2063,247,'2005-07-13 03:32:46',1,'2006-02-15 21:30:53'),(4996,'2005-07-09 00:59:46',4440,129,'2005-07-16 01:30:46',2,'2006-02-15 21:30:53'),(4997,'2005-07-09 01:06:03',186,102,'2005-07-18 04:21:03',2,'2006-02-15 21:30:53'),(4998,'2005-07-09 01:07:21',202,534,'2005-07-10 05:48:21',2,'2006-02-15 21:30:53'),(4999,'2005-07-09 01:12:57',1797,196,'2005-07-17 00:12:57',1,'2006-02-15 21:30:53'),(5000,'2005-07-09 01:16:13',668,146,'2005-07-14 21:55:13',1,'2006-02-15 21:30:53'),(5001,'2005-07-09 01:17:04',2025,40,'2005-07-16 03:25:04',2,'2006-02-15 21:30:53'),(5002,'2005-07-09 01:17:08',2388,430,'2005-07-15 21:53:08',1,'2006-02-15 21:30:53'),(5003,'2005-07-09 01:19:03',3438,569,'2005-07-10 04:28:03',2,'2006-02-15 21:30:53'),(5004,'2005-07-09 01:20:50',2637,382,'2005-07-09 19:56:50',1,'2006-02-15 21:30:53'),(5005,'2005-07-09 01:21:44',3034,451,'2005-07-14 20:27:44',1,'2006-02-15 21:30:53'),(5006,'2005-07-09 01:24:07',1277,486,'2005-07-18 03:56:07',1,'2006-02-15 21:30:53'),(5007,'2005-07-09 01:26:22',3079,207,'2005-07-12 20:48:22',1,'2006-02-15 21:30:53'),(5008,'2005-07-09 01:31:42',824,509,'2005-07-11 22:34:42',2,'2006-02-15 21:30:53'),(5009,'2005-07-09 01:32:17',1539,102,'2005-07-18 03:39:17',2,'2006-02-15 21:30:53'),(5010,'2005-07-09 01:33:23',1999,574,'2005-07-14 04:00:23',2,'2006-02-15 21:30:53'),(5011,'2005-07-09 01:44:40',463,249,'2005-07-11 00:58:40',2,'2006-02-15 21:30:53'),(5012,'2005-07-09 01:45:04',1456,251,'2005-07-12 02:13:04',1,'2006-02-15 21:30:53'),(5013,'2005-07-09 01:46:45',3000,35,'2005-07-16 06:57:45',1,'2006-02-15 21:30:53'),(5014,'2005-07-09 01:51:49',4095,334,'2005-07-10 04:48:49',1,'2006-02-15 21:30:53'),(5015,'2005-07-09 01:54:24',1564,178,'2005-07-12 20:07:24',1,'2006-02-15 21:30:53'),(5016,'2005-07-09 01:57:57',1871,5,'2005-07-09 22:07:57',1,'2006-02-15 21:30:53'),(5017,'2005-07-09 02:00:16',3745,241,'2005-07-14 06:28:16',1,'2006-02-15 21:30:53'),(5018,'2005-07-09 02:01:05',2317,541,'2005-07-10 04:09:05',1,'2006-02-15 21:30:53'),(5019,'2005-07-09 02:04:32',3534,295,'2005-07-15 07:01:32',2,'2006-02-15 21:30:53'),(5020,'2005-07-09 02:07:56',4113,565,'2005-07-09 23:59:56',1,'2006-02-15 21:30:53'),(5021,'2005-07-09 02:09:41',3445,73,'2005-07-13 05:47:41',1,'2006-02-15 21:30:53'),(5022,'2005-07-09 02:10:54',928,499,'2005-07-17 08:07:54',2,'2006-02-15 21:30:53'),(5023,'2005-07-09 02:23:16',3206,358,'2005-07-15 20:37:16',1,'2006-02-15 21:30:53'),(5024,'2005-07-09 02:25:12',2987,335,'2005-07-12 03:15:12',1,'2006-02-15 21:30:53'),(5025,'2005-07-09 02:28:24',153,91,'2005-07-12 04:43:24',2,'2006-02-15 21:30:53'),(5026,'2005-07-09 02:32:34',989,463,'2005-07-13 04:39:34',2,'2006-02-15 21:30:53'),(5027,'2005-07-09 02:32:37',2179,109,'2005-07-16 23:13:37',1,'2006-02-15 21:30:53'),(5028,'2005-07-09 02:34:45',4531,30,'2005-07-14 20:45:45',2,'2006-02-15 21:30:53'),(5029,'2005-07-09 02:35:32',3938,265,'2005-07-17 22:46:32',1,'2006-02-15 21:30:53'),(5030,'2005-07-09 02:35:43',25,497,'2005-07-17 02:05:43',1,'2006-02-15 21:30:53'),(5031,'2005-07-09 02:36:37',4224,312,'2005-07-14 03:09:37',2,'2006-02-15 21:30:53'),(5032,'2005-07-09 02:39:47',2257,333,'2005-07-10 07:45:47',1,'2006-02-15 21:30:53'),(5033,'2005-07-09 02:42:01',2841,299,'2005-07-14 00:29:01',1,'2006-02-15 21:30:53'),(5034,'2005-07-09 02:48:15',340,148,'2005-07-11 23:13:15',2,'2006-02-15 21:30:53'),(5035,'2005-07-09 02:51:34',3699,99,'2005-07-16 21:38:34',1,'2006-02-15 21:30:53'),(5036,'2005-07-09 02:58:41',75,573,'2005-07-17 04:09:41',1,'2006-02-15 21:30:53'),(5037,'2005-07-09 02:59:10',435,524,'2005-07-15 07:54:10',2,'2006-02-15 21:30:53'),(5038,'2005-07-09 03:12:52',3086,10,'2005-07-17 22:27:52',2,'2006-02-15 21:30:53'),(5039,'2005-07-09 03:14:45',2020,268,'2005-07-16 06:57:45',2,'2006-02-15 21:30:53'),(5040,'2005-07-09 03:16:34',2479,405,'2005-07-17 01:13:34',2,'2006-02-15 21:30:53'),(5041,'2005-07-09 03:18:51',2711,305,'2005-07-13 03:08:51',1,'2006-02-15 21:30:53'),(5042,'2005-07-09 03:20:30',3609,254,'2005-07-15 07:22:30',1,'2006-02-15 21:30:53'),(5043,'2005-07-09 03:25:18',2979,369,'2005-07-13 00:57:18',2,'2006-02-15 21:30:53'),(5044,'2005-07-09 03:30:25',1625,147,'2005-07-11 02:32:25',2,'2006-02-15 21:30:53'),(5045,'2005-07-09 03:33:32',1041,230,'2005-07-18 06:15:32',1,'2006-02-15 21:30:53'),(5046,'2005-07-09 03:34:57',1639,227,'2005-07-17 22:36:57',2,'2006-02-15 21:30:53'),(5047,'2005-07-09 03:44:15',230,272,'2005-07-15 09:07:15',2,'2006-02-15 21:30:53'),(5048,'2005-07-09 03:46:33',1271,466,'2005-07-15 01:14:33',1,'2006-02-15 21:30:53'),(5049,'2005-07-09 03:54:12',3336,144,'2005-07-11 22:39:12',2,'2006-02-15 21:30:53'),(5050,'2005-07-09 03:54:38',3876,337,'2005-07-10 02:23:38',2,'2006-02-15 21:30:53'),(5051,'2005-07-09 03:57:53',4091,85,'2005-07-16 08:22:53',2,'2006-02-15 21:30:53'),(5052,'2005-07-09 03:59:43',1884,305,'2005-07-12 05:48:43',1,'2006-02-15 21:30:53'),(5053,'2005-07-09 03:59:46',570,295,'2005-07-09 23:53:46',2,'2006-02-15 21:30:53'),(5054,'2005-07-09 04:01:02',4001,135,'2005-07-18 05:16:02',2,'2006-02-15 21:30:53'),(5055,'2005-07-09 04:05:28',751,54,'2005-07-14 04:26:28',2,'2006-02-15 21:30:53'),(5056,'2005-07-09 04:13:45',2599,526,'2005-07-10 06:17:45',2,'2006-02-15 21:30:53'),(5057,'2005-07-09 04:20:29',1076,178,'2005-07-14 23:59:29',1,'2006-02-15 21:30:53'),(5058,'2005-07-09 04:20:35',917,221,'2005-07-18 08:09:35',2,'2006-02-15 21:30:53'),(5059,'2005-07-09 04:28:01',3951,396,'2005-07-15 22:57:01',1,'2006-02-15 21:30:53'),(5060,'2005-07-09 04:28:03',4317,57,'2005-07-12 07:41:03',2,'2006-02-15 21:30:53'),(5061,'2005-07-09 04:30:50',3893,230,'2005-07-12 03:24:50',1,'2006-02-15 21:30:53'),(5062,'2005-07-09 04:36:49',2190,141,'2005-07-10 06:26:49',1,'2006-02-15 21:30:53'),(5063,'2005-07-09 04:37:31',1027,133,'2005-07-13 09:56:31',2,'2006-02-15 21:30:53'),(5064,'2005-07-09 04:38:51',373,512,'2005-07-18 00:33:51',2,'2006-02-15 21:30:53'),(5065,'2005-07-09 04:42:00',1788,599,'2005-07-12 08:55:00',1,'2006-02-15 21:30:53'),(5066,'2005-07-09 04:48:50',1702,169,'2005-07-12 22:54:50',2,'2006-02-15 21:30:53'),(5067,'2005-07-09 04:52:35',1480,225,'2005-07-11 23:33:35',2,'2006-02-15 21:30:53'),(5068,'2005-07-09 04:53:18',2937,10,'2005-07-13 09:21:18',1,'2006-02-15 21:30:53'),(5069,'2005-07-09 04:56:30',4417,183,'2005-07-13 23:53:30',2,'2006-02-15 21:30:53'),(5070,'2005-07-09 04:58:26',2305,407,'2005-07-09 23:00:26',2,'2006-02-15 21:30:53'),(5071,'2005-07-09 05:00:39',4358,12,'2005-07-09 23:08:39',1,'2006-02-15 21:30:53'),(5072,'2005-07-09 05:01:58',94,254,'2005-07-18 08:17:58',2,'2006-02-15 21:30:53'),(5073,'2005-07-09 05:02:35',546,408,'2005-07-15 01:22:35',2,'2006-02-15 21:30:53'),(5074,'2005-07-09 05:06:24',1379,12,'2005-07-12 04:37:24',1,'2006-02-15 21:30:53'),(5075,'2005-07-09 05:12:07',903,170,'2005-07-12 08:29:07',1,'2006-02-15 21:30:53'),(5076,'2005-07-09 05:13:22',4388,574,'2005-07-16 09:11:22',1,'2006-02-15 21:30:53'),(5077,'2005-07-09 05:18:01',686,574,'2005-07-17 10:39:01',2,'2006-02-15 21:30:53'),(5078,'2005-07-09 05:20:24',1994,78,'2005-07-13 06:41:24',2,'2006-02-15 21:30:53'),(5079,'2005-07-09 05:20:40',3948,566,'2005-07-17 00:06:40',1,'2006-02-15 21:30:53'),(5080,'2005-07-09 05:23:55',635,254,'2005-07-11 05:56:55',2,'2006-02-15 21:30:53'),(5081,'2005-07-09 05:25:20',1953,420,'2005-07-13 23:45:20',1,'2006-02-15 21:30:53'),(5082,'2005-07-09 05:28:38',1584,470,'2005-07-10 02:46:38',2,'2006-02-15 21:30:53'),(5083,'2005-07-09 05:30:32',148,494,'2005-07-11 02:20:32',1,'2006-02-15 21:30:53'),(5084,'2005-07-09 05:33:27',3113,87,'2005-07-17 08:54:27',2,'2006-02-15 21:30:53'),(5085,'2005-07-09 05:36:49',4164,437,'2005-07-13 09:26:49',1,'2006-02-15 21:30:53'),(5086,'2005-07-09 05:40:04',3072,539,'2005-07-16 07:51:04',1,'2006-02-15 21:30:53'),(5087,'2005-07-09 05:44:28',3716,395,'2005-07-10 02:25:28',2,'2006-02-15 21:30:53'),(5088,'2005-07-09 05:45:16',3324,454,'2005-07-15 00:41:16',2,'2006-02-15 21:30:53'),(5089,'2005-07-09 05:45:40',451,289,'2005-07-15 05:31:40',1,'2006-02-15 21:30:53'),(5090,'2005-07-09 05:48:22',1728,296,'2005-07-11 06:50:22',2,'2006-02-15 21:30:53'),(5091,'2005-07-09 05:52:54',4572,149,'2005-07-10 02:49:54',1,'2006-02-15 21:30:53'),(5092,'2005-07-09 05:57:39',3256,139,'2005-07-12 00:45:39',2,'2006-02-15 21:30:53'),(5093,'2005-07-09 05:59:12',2734,597,'2005-07-10 11:45:12',2,'2006-02-15 21:30:53'),(5094,'2005-07-09 05:59:47',4451,178,'2005-07-18 05:34:47',2,'2006-02-15 21:30:53'),(5095,'2005-07-09 06:08:22',2788,292,'2005-07-11 10:52:22',1,'2006-02-15 21:30:53'),(5096,'2005-07-09 06:08:23',490,231,'2005-07-14 11:36:23',1,'2006-02-15 21:30:53'),(5097,'2005-07-09 06:09:51',3252,343,'2005-07-10 03:55:51',2,'2006-02-15 21:30:53'),(5098,'2005-07-09 06:13:54',1772,406,'2005-07-10 04:27:54',1,'2006-02-15 21:30:53'),(5099,'2005-07-09 06:14:30',768,393,'2005-07-12 08:23:30',2,'2006-02-15 21:30:53'),(5100,'2005-07-09 06:16:03',3193,101,'2005-07-10 10:21:03',1,'2006-02-15 21:30:53'),(5101,'2005-07-09 06:21:29',2737,154,'2005-07-11 02:58:29',1,'2006-02-15 21:30:53'),(5102,'2005-07-09 06:25:48',242,316,'2005-07-16 11:32:48',2,'2006-02-15 21:30:53'),(5103,'2005-07-09 06:34:40',2390,397,'2005-07-10 03:44:40',2,'2006-02-15 21:30:53'),(5104,'2005-07-09 06:37:07',2109,14,'2005-07-14 12:32:07',1,'2006-02-15 21:30:53'),(5105,'2005-07-09 06:38:59',2555,290,'2005-07-17 03:06:59',2,'2006-02-15 21:30:53'),(5106,'2005-07-09 06:40:24',110,137,'2005-07-13 10:28:24',1,'2006-02-15 21:30:53'),(5107,'2005-07-09 06:42:32',1697,21,'2005-07-10 08:21:32',2,'2006-02-15 21:30:53'),(5108,'2005-07-09 06:44:30',4229,30,'2005-07-17 04:24:30',1,'2006-02-15 21:30:53'),(5109,'2005-07-09 06:48:49',2373,102,'2005-07-14 01:17:49',1,'2006-02-15 21:30:53'),(5110,'2005-07-09 06:57:25',195,200,'2005-07-12 05:39:25',2,'2006-02-15 21:30:53'),(5111,'2005-07-09 07:02:19',2875,12,'2005-07-10 06:27:19',2,'2006-02-15 21:30:53'),(5112,'2005-07-09 07:04:04',3529,285,'2005-07-13 08:42:04',1,'2006-02-15 21:30:53'),(5113,'2005-07-09 07:06:18',3618,282,'2005-07-13 07:10:18',2,'2006-02-15 21:30:53'),(5114,'2005-07-09 07:07:05',3734,64,'2005-07-15 03:06:05',1,'2006-02-15 21:30:53'),(5115,'2005-07-09 07:07:18',2296,212,'2005-07-16 03:28:18',2,'2006-02-15 21:30:53'),(5116,'2005-07-09 07:10:12',2491,332,'2005-07-14 09:16:12',2,'2006-02-15 21:30:53'),(5117,'2005-07-09 07:11:22',2284,208,'2005-07-15 08:44:22',1,'2006-02-15 21:30:53'),(5118,'2005-07-09 07:13:52',957,5,'2005-07-18 05:18:52',2,'2006-02-15 21:30:53'),(5119,'2005-07-09 07:14:18',2996,301,'2005-07-18 04:07:18',1,'2006-02-15 21:30:53'),(5120,'2005-07-09 07:14:23',4431,373,'2005-07-14 04:00:23',2,'2006-02-15 21:30:53'),(5121,'2005-07-09 07:18:31',3321,526,'2005-07-15 01:48:31',1,'2006-02-15 21:30:53'),(5122,'2005-07-09 07:19:35',1423,261,'2005-07-16 03:04:35',2,'2006-02-15 21:30:53'),(5123,'2005-07-09 07:20:30',4278,219,'2005-07-14 05:24:30',1,'2006-02-15 21:30:53'),(5124,'2005-07-09 07:25:19',1857,565,'2005-07-15 01:51:19',1,'2006-02-15 21:30:53'),(5125,'2005-07-09 07:25:28',990,263,'2005-07-12 12:34:28',1,'2006-02-15 21:30:53'),(5126,'2005-07-09 07:25:35',3312,315,'2005-07-18 05:05:35',1,'2006-02-15 21:30:53'),(5127,'2005-07-09 07:25:47',3649,129,'2005-07-13 11:44:47',2,'2006-02-15 21:30:53'),(5128,'2005-07-09 07:25:54',3757,155,'2005-07-16 04:04:54',2,'2006-02-15 21:30:53'),(5129,'2005-07-09 07:28:33',4516,441,'2005-07-14 05:12:33',2,'2006-02-15 21:30:53'),(5130,'2005-07-09 07:29:45',3264,93,'2005-07-13 05:56:45',1,'2006-02-15 21:30:53'),(5131,'2005-07-09 07:35:03',3179,167,'2005-07-10 06:05:03',1,'2006-02-15 21:30:53'),(5132,'2005-07-09 07:40:32',4158,101,'2005-07-16 02:16:32',2,'2006-02-15 21:30:53'),(5133,'2005-07-09 07:43:22',3403,469,'2005-07-12 04:52:22',1,'2006-02-15 21:30:53'),(5134,'2005-07-09 07:53:12',149,491,'2005-07-16 05:30:12',1,'2006-02-15 21:30:53'),(5135,'2005-07-09 07:53:22',3005,538,'2005-07-16 04:50:22',2,'2006-02-15 21:30:53'),(5136,'2005-07-09 07:55:01',3498,395,'2005-07-11 05:26:01',2,'2006-02-15 21:30:53'),(5137,'2005-07-09 08:00:34',409,126,'2005-07-12 05:34:34',1,'2006-02-15 21:30:53'),(5138,'2005-07-09 08:00:46',1283,548,'2005-07-12 09:31:46',2,'2006-02-15 21:30:53'),(5139,'2005-07-09 08:01:51',51,539,'2005-07-18 09:16:51',2,'2006-02-15 21:30:53'),(5140,'2005-07-09 08:04:59',947,303,'2005-07-11 08:28:59',2,'2006-02-15 21:30:53'),(5141,'2005-07-09 08:05:14',590,488,'2005-07-18 04:36:14',1,'2006-02-15 21:30:53'),(5142,'2005-07-09 08:05:23',369,56,'2005-07-13 12:37:23',2,'2006-02-15 21:30:53'),(5143,'2005-07-09 08:07:07',3803,196,'2005-07-18 10:17:07',1,'2006-02-15 21:30:53'),(5144,'2005-07-09 08:09:53',3530,89,'2005-07-18 07:11:53',2,'2006-02-15 21:30:53'),(5145,'2005-07-09 08:13:25',2397,204,'2005-07-10 03:56:25',2,'2006-02-15 21:30:53'),(5146,'2005-07-09 08:14:58',776,194,'2005-07-11 07:04:58',1,'2006-02-15 21:30:53'),(5147,'2005-07-09 08:17:41',2270,326,'2005-07-18 09:45:41',2,'2006-02-15 21:30:53'),(5148,'2005-07-09 08:22:46',456,48,'2005-07-18 04:36:46',1,'2006-02-15 21:30:53'),(5149,'2005-07-09 08:28:23',1500,330,'2005-07-16 06:19:23',2,'2006-02-15 21:30:53'),(5150,'2005-07-09 08:28:40',1961,410,'2005-07-16 04:47:40',1,'2006-02-15 21:30:53'),(5151,'2005-07-09 08:31:03',224,228,'2005-07-10 08:18:03',2,'2006-02-15 21:30:53'),(5152,'2005-07-09 08:34:44',4005,331,'2005-07-10 05:26:44',1,'2006-02-15 21:30:53'),(5153,'2005-07-09 08:35:05',2826,504,'2005-07-18 14:21:05',1,'2006-02-15 21:30:53'),(5154,'2005-07-09 08:46:18',3785,361,'2005-07-14 03:19:18',1,'2006-02-15 21:30:53'),(5155,'2005-07-09 08:46:54',988,523,'2005-07-14 04:13:54',1,'2006-02-15 21:30:53'),(5156,'2005-07-09 08:51:42',416,5,'2005-07-15 03:59:42',2,'2006-02-15 21:30:53'),(5157,'2005-07-09 08:52:12',637,463,'2005-07-12 04:32:12',2,'2006-02-15 21:30:53'),(5158,'2005-07-09 08:53:09',2825,272,'2005-07-10 11:05:09',1,'2006-02-15 21:30:53'),(5159,'2005-07-09 08:55:52',3479,213,'2005-07-10 04:32:52',1,'2006-02-15 21:30:53'),(5160,'2005-07-09 08:57:07',1925,467,'2005-07-18 06:01:07',1,'2006-02-15 21:30:53'),(5161,'2005-07-09 08:57:56',2617,284,'2005-07-18 07:41:56',2,'2006-02-15 21:30:53'),(5162,'2005-07-09 09:00:11',2765,43,'2005-07-17 07:26:11',1,'2006-02-15 21:30:53'),(5163,'2005-07-09 09:00:28',1486,103,'2005-07-17 08:07:28',2,'2006-02-15 21:30:53'),(5164,'2005-07-09 09:03:14',1170,511,'2005-07-14 04:20:14',1,'2006-02-15 21:30:53'),(5165,'2005-07-09 09:08:53',280,590,'2005-07-14 06:01:53',1,'2006-02-15 21:30:53'),(5166,'2005-07-09 09:15:48',2771,298,'2005-07-16 06:04:48',1,'2006-02-15 21:30:53'),(5167,'2005-07-09 09:18:43',2485,437,'2005-07-14 12:59:43',2,'2006-02-15 21:30:53'),(5168,'2005-07-09 09:20:01',4096,420,'2005-07-11 14:42:01',1,'2006-02-15 21:30:53'),(5169,'2005-07-09 09:22:25',2608,116,'2005-07-10 03:48:25',1,'2006-02-15 21:30:53'),(5170,'2005-07-09 09:24:19',66,209,'2005-07-18 04:02:19',1,'2006-02-15 21:30:53'),(5171,'2005-07-09 09:26:55',2099,371,'2005-07-10 10:34:55',1,'2006-02-15 21:30:53'),(5172,'2005-07-09 09:31:27',4046,214,'2005-07-13 04:03:27',1,'2006-02-15 21:30:53'),(5173,'2005-07-09 09:31:44',2848,490,'2005-07-15 04:20:44',2,'2006-02-15 21:30:53'),(5174,'2005-07-09 09:31:59',3621,47,'2005-07-15 03:49:59',1,'2006-02-15 21:30:53'),(5175,'2005-07-09 09:34:28',1003,409,'2005-07-15 15:19:28',2,'2006-02-15 21:30:53'),(5176,'2005-07-09 09:39:31',328,119,'2005-07-17 11:56:31',2,'2006-02-15 21:30:53'),(5177,'2005-07-09 09:43:21',1675,452,'2005-07-13 07:29:21',1,'2006-02-15 21:30:53'),(5178,'2005-07-09 09:59:52',1750,167,'2005-07-18 13:01:52',2,'2006-02-15 21:30:53'),(5179,'2005-07-09 10:00:44',2995,256,'2005-07-11 06:52:44',1,'2006-02-15 21:30:53'),(5180,'2005-07-09 10:06:53',3684,494,'2005-07-12 15:25:53',1,'2006-02-15 21:30:53'),(5181,'2005-07-09 10:07:27',2569,45,'2005-07-17 10:18:27',2,'2006-02-15 21:30:53'),(5182,'2005-07-09 10:08:10',725,197,'2005-07-16 14:36:10',2,'2006-02-15 21:30:53'),(5183,'2005-07-09 10:13:45',2866,394,'2005-07-16 15:55:45',2,'2006-02-15 21:30:53'),(5184,'2005-07-09 10:14:34',1101,166,'2005-07-14 16:05:34',2,'2006-02-15 21:30:53'),(5185,'2005-07-09 10:14:39',357,53,'2005-07-10 13:31:39',1,'2006-02-15 21:30:53'),(5186,'2005-07-09 10:18:40',2415,276,'2005-07-13 05:05:40',2,'2006-02-15 21:30:53'),(5187,'2005-07-09 10:19:51',2631,91,'2005-07-14 10:35:51',1,'2006-02-15 21:30:53'),(5188,'2005-07-09 10:22:31',3265,34,'2005-07-13 04:41:31',1,'2006-02-15 21:30:53'),(5189,'2005-07-09 10:23:21',2539,113,'2005-07-14 08:06:21',1,'2006-02-15 21:30:53'),(5190,'2005-07-09 10:25:24',2213,532,'2005-07-18 04:33:24',1,'2006-02-15 21:30:53'),(5191,'2005-07-09 10:26:48',2131,167,'2005-07-10 15:52:48',2,'2006-02-15 21:30:53'),(5192,'2005-07-09 10:27:09',1225,410,'2005-07-10 12:04:09',1,'2006-02-15 21:30:53'),(5193,'2005-07-09 10:28:18',2166,485,'2005-07-12 12:18:18',1,'2006-02-15 21:30:53'),(5194,'2005-07-09 10:31:34',3809,202,'2005-07-15 08:50:34',2,'2006-02-15 21:30:53'),(5195,'2005-07-09 10:39:31',3399,59,'2005-07-18 13:54:31',1,'2006-02-15 21:30:53'),(5196,'2005-07-09 10:43:34',2278,536,'2005-07-13 12:10:34',2,'2006-02-15 21:30:53'),(5197,'2005-07-09 10:43:54',1571,541,'2005-07-16 10:19:54',1,'2006-02-15 21:30:53'),(5198,'2005-07-09 10:49:10',218,101,'2005-07-13 04:52:10',1,'2006-02-15 21:30:53'),(5199,'2005-07-09 10:50:56',349,42,'2005-07-10 06:43:56',1,'2006-02-15 21:30:53'),(5200,'2005-07-09 10:52:09',4528,125,'2005-07-13 15:12:09',1,'2006-02-15 21:30:53'),(5201,'2005-07-09 10:52:53',2453,551,'2005-07-16 12:41:53',2,'2006-02-15 21:30:53'),(5202,'2005-07-09 10:53:48',3417,321,'2005-07-15 13:31:48',1,'2006-02-15 21:30:53'),(5203,'2005-07-09 10:53:59',3661,588,'2005-07-15 09:45:59',2,'2006-02-15 21:30:53'),(5204,'2005-07-09 10:54:14',1791,432,'2005-07-12 14:29:14',2,'2006-02-15 21:30:53'),(5205,'2005-07-09 10:56:37',161,79,'2005-07-13 05:45:37',1,'2006-02-15 21:30:53'),(5206,'2005-07-09 11:11:01',692,517,'2005-07-17 07:23:01',2,'2006-02-15 21:30:53'),(5207,'2005-07-09 11:15:44',3496,59,'2005-07-17 06:00:44',1,'2006-02-15 21:30:53'),(5208,'2005-07-09 11:16:56',1881,560,'2005-07-10 07:21:56',2,'2006-02-15 21:30:53'),(5209,'2005-07-09 11:22:39',4441,222,'2005-07-17 09:31:39',1,'2006-02-15 21:30:53'),(5210,'2005-07-09 11:24:19',4514,355,'2005-07-11 06:27:19',1,'2006-02-15 21:30:53'),(5211,'2005-07-09 11:26:50',2216,241,'2005-07-16 15:30:50',1,'2006-02-15 21:30:53'),(5212,'2005-07-09 11:37:47',3240,400,'2005-07-15 14:42:47',1,'2006-02-15 21:30:53'),(5213,'2005-07-09 11:39:43',3708,552,'2005-07-18 16:20:43',2,'2006-02-15 21:30:53'),(5214,'2005-07-09 11:43:08',1657,290,'2005-07-17 08:58:08',2,'2006-02-15 21:30:53'),(5215,'2005-07-09 11:47:58',3888,528,'2005-07-18 09:58:58',1,'2006-02-15 21:30:53'),(5216,'2005-07-09 11:54:58',1644,515,'2005-07-12 09:46:58',2,'2006-02-15 21:30:53'),(5217,'2005-07-09 11:56:50',4150,430,'2005-07-17 07:10:50',1,'2006-02-15 21:30:53'),(5218,'2005-07-09 11:57:12',1121,83,'2005-07-13 06:34:12',2,'2006-02-15 21:30:53'),(5219,'2005-07-09 11:57:55',3933,209,'2005-07-15 09:43:55',2,'2006-02-15 21:30:53'),(5220,'2005-07-09 11:59:04',2577,435,'2005-07-15 06:20:04',1,'2006-02-15 21:30:53'),(5221,'2005-07-09 12:02:23',2339,84,'2005-07-16 15:43:23',1,'2006-02-15 21:30:53'),(5222,'2005-07-09 12:05:45',2508,400,'2005-07-13 12:11:45',1,'2006-02-15 21:30:53'),(5223,'2005-07-09 12:06:03',2335,72,'2005-07-17 15:50:03',1,'2006-02-15 21:30:53'),(5224,'2005-07-09 12:07:27',279,311,'2005-07-17 08:59:27',1,'2006-02-15 21:30:53'),(5225,'2005-07-09 12:10:16',703,445,'2005-07-12 09:55:16',2,'2006-02-15 21:30:53'),(5226,'2005-07-09 12:10:44',3128,218,'2005-07-11 17:32:44',2,'2006-02-15 21:30:53'),(5227,'2005-07-09 12:16:39',1862,362,'2005-07-18 15:38:39',2,'2006-02-15 21:30:53'),(5228,'2005-07-09 12:26:01',622,195,'2005-07-14 13:31:01',2,'2006-02-15 21:30:53'),(5229,'2005-07-09 12:30:18',4472,372,'2005-07-14 15:31:18',2,'2006-02-15 21:30:53'),(5230,'2005-07-09 12:30:23',3707,51,'2005-07-13 08:41:23',1,'2006-02-15 21:30:53'),(5231,'2005-07-09 12:35:02',1275,405,'2005-07-10 09:22:02',1,'2006-02-15 21:30:53'),(5232,'2005-07-09 12:35:08',3353,175,'2005-07-14 14:55:08',1,'2006-02-15 21:30:53'),(5233,'2005-07-09 12:44:26',1401,131,'2005-07-15 12:31:26',1,'2006-02-15 21:30:53'),(5234,'2005-07-09 12:44:47',4182,398,'2005-07-17 10:02:47',1,'2006-02-15 21:30:53'),(5235,'2005-07-09 12:54:25',1044,122,'2005-07-18 16:28:25',1,'2006-02-15 21:30:53'),(5236,'2005-07-09 12:56:29',1215,519,'2005-07-13 08:26:29',1,'2006-02-15 21:30:53'),(5237,'2005-07-09 12:56:58',2341,84,'2005-07-11 15:41:58',1,'2006-02-15 21:30:53'),(5238,'2005-07-09 13:11:14',3297,100,'2005-07-10 07:27:14',2,'2006-02-15 21:30:53'),(5239,'2005-07-09 13:12:35',380,497,'2005-07-10 13:37:35',1,'2006-02-15 21:30:53'),(5240,'2005-07-09 13:14:48',1378,350,'2005-07-10 18:47:48',2,'2006-02-15 21:30:53'),(5241,'2005-07-09 13:19:14',4079,314,'2005-07-11 14:32:14',1,'2006-02-15 21:30:53'),(5242,'2005-07-09 13:20:25',848,12,'2005-07-18 07:38:25',1,'2006-02-15 21:30:53'),(5243,'2005-07-09 13:22:08',122,587,'2005-07-16 09:25:08',1,'2006-02-15 21:30:53'),(5244,'2005-07-09 13:24:07',3726,1,'2005-07-14 14:01:07',2,'2006-02-15 21:30:53'),(5245,'2005-07-09 13:24:14',3547,115,'2005-07-12 11:16:14',1,'2006-02-15 21:30:53'),(5246,'2005-07-09 13:25:18',3548,276,'2005-07-13 18:38:18',1,'2006-02-15 21:30:53'),(5247,'2005-07-09 13:26:28',1186,298,'2005-07-12 14:00:28',2,'2006-02-15 21:30:53'),(5248,'2005-07-09 13:29:44',246,279,'2005-07-12 18:12:44',1,'2006-02-15 21:30:53'),(5249,'2005-07-09 13:33:53',1950,389,'2005-07-11 12:55:53',2,'2006-02-15 21:30:53'),(5250,'2005-07-09 13:35:32',2162,384,'2005-07-13 12:19:32',1,'2006-02-15 21:30:53'),(5251,'2005-07-09 13:36:10',478,474,'2005-07-15 11:40:10',1,'2006-02-15 21:30:53'),(5252,'2005-07-09 13:40:44',2581,335,'2005-07-14 09:41:44',1,'2006-02-15 21:30:53'),(5253,'2005-07-09 13:41:17',2241,532,'2005-07-17 17:09:17',1,'2006-02-15 21:30:53'),(5254,'2005-07-09 13:50:11',654,263,'2005-07-13 09:07:11',1,'2006-02-15 21:30:53'),(5255,'2005-07-09 13:51:08',4418,313,'2005-07-17 13:58:08',2,'2006-02-15 21:30:53'),(5256,'2005-07-09 13:55:45',4226,273,'2005-07-15 17:02:45',1,'2006-02-15 21:30:53'),(5257,'2005-07-09 13:56:43',286,292,'2005-07-10 14:26:43',2,'2006-02-15 21:30:53'),(5258,'2005-07-09 13:56:56',3125,207,'2005-07-11 16:01:56',2,'2006-02-15 21:30:53'),(5259,'2005-07-09 14:02:50',1310,207,'2005-07-11 19:13:50',2,'2006-02-15 21:30:53'),(5260,'2005-07-09 14:05:45',3143,75,'2005-07-14 08:41:45',2,'2006-02-15 21:30:53'),(5261,'2005-07-09 14:06:56',2899,105,'2005-07-11 14:21:56',2,'2006-02-15 21:30:53'),(5262,'2005-07-09 14:08:01',1092,240,'2005-07-12 16:48:01',1,'2006-02-15 21:30:53'),(5263,'2005-07-09 14:10:36',119,406,'2005-07-12 15:07:36',1,'2006-02-15 21:30:53'),(5264,'2005-07-09 14:11:28',3307,545,'2005-07-12 18:24:28',2,'2006-02-15 21:30:53'),(5265,'2005-07-09 14:15:01',4482,139,'2005-07-18 14:43:01',2,'2006-02-15 21:30:53'),(5266,'2005-07-09 14:17:40',2409,222,'2005-07-16 10:42:40',1,'2006-02-15 21:30:53'),(5267,'2005-07-09 14:21:10',2242,233,'2005-07-15 12:02:10',1,'2006-02-15 21:30:53'),(5268,'2005-07-09 14:22:43',1083,119,'2005-07-12 08:27:43',1,'2006-02-15 21:30:53'),(5269,'2005-07-09 14:23:05',3886,230,'2005-07-17 14:03:05',1,'2006-02-15 21:30:53'),(5270,'2005-07-09 14:23:46',1523,128,'2005-07-13 15:04:46',1,'2006-02-15 21:30:53'),(5271,'2005-07-09 14:25:01',2691,522,'2005-07-16 17:28:01',1,'2006-02-15 21:30:53'),(5272,'2005-07-09 14:26:01',1547,90,'2005-07-12 20:20:01',1,'2006-02-15 21:30:53'),(5273,'2005-07-09 14:31:24',4570,38,'2005-07-14 13:27:24',2,'2006-02-15 21:30:53'),(5274,'2005-07-09 14:34:09',4579,108,'2005-07-14 13:02:09',1,'2006-02-15 21:30:53'),(5275,'2005-07-09 14:34:18',729,249,'2005-07-13 12:56:18',2,'2006-02-15 21:30:53'),(5276,'2005-07-09 14:35:13',2524,521,'2005-07-12 14:24:13',2,'2006-02-15 21:30:53'),(5277,'2005-07-09 14:40:42',2026,332,'2005-07-16 14:18:42',2,'2006-02-15 21:30:53'),(5278,'2005-07-09 14:44:23',2573,532,'2005-07-15 10:48:23',1,'2006-02-15 21:30:53'),(5279,'2005-07-09 14:46:36',709,64,'2005-07-17 10:04:36',2,'2006-02-15 21:30:53'),(5280,'2005-07-09 14:55:07',1177,351,'2005-07-12 10:05:07',2,'2006-02-15 21:30:53'),(5281,'2005-07-09 14:55:07',1966,71,'2005-07-13 15:24:07',2,'2006-02-15 21:30:53'),(5282,'2005-07-09 15:01:23',4386,226,'2005-07-13 11:06:23',2,'2006-02-15 21:30:53'),(5283,'2005-07-09 15:07:17',644,295,'2005-07-17 09:52:17',2,'2006-02-15 21:30:53'),(5284,'2005-07-09 15:08:21',1036,585,'2005-07-16 09:53:21',2,'2006-02-15 21:30:53'),(5285,'2005-07-09 15:10:44',676,468,'2005-07-16 13:02:44',2,'2006-02-15 21:30:53'),(5286,'2005-07-09 15:11:41',483,498,'2005-07-10 19:19:41',2,'2006-02-15 21:30:53'),(5287,'2005-07-09 15:11:54',3110,523,'2005-07-16 16:05:54',2,'2006-02-15 21:30:53'),(5288,'2005-07-09 15:13:07',850,120,'2005-07-16 12:39:07',1,'2006-02-15 21:30:53'),(5289,'2005-07-09 15:14:08',4336,30,'2005-07-12 12:51:08',2,'2006-02-15 21:30:53'),(5290,'2005-07-09 15:14:47',277,50,'2005-07-11 20:30:47',2,'2006-02-15 21:30:53'),(5291,'2005-07-09 15:15:02',1367,194,'2005-07-15 10:22:02',2,'2006-02-15 21:30:53'),(5292,'2005-07-09 15:16:54',3195,62,'2005-07-11 15:21:54',1,'2006-02-15 21:30:53'),(5293,'2005-07-09 15:17:23',2880,542,'2005-07-11 11:23:23',2,'2006-02-15 21:30:53'),(5294,'2005-07-09 15:23:42',3237,22,'2005-07-15 15:28:42',2,'2006-02-15 21:30:53'),(5295,'2005-07-09 15:25:06',4460,86,'2005-07-10 12:40:06',1,'2006-02-15 21:30:53'),(5296,'2005-07-09 15:26:27',495,109,'2005-07-15 10:03:27',2,'2006-02-15 21:30:53'),(5297,'2005-07-09 15:32:29',3434,202,'2005-07-14 14:58:29',1,'2006-02-15 21:30:53'),(5298,'2005-07-09 15:36:17',3491,149,'2005-07-18 19:07:17',2,'2006-02-15 21:30:53'),(5299,'2005-07-09 15:38:09',4416,469,'2005-07-15 16:39:09',2,'2006-02-15 21:30:53'),(5300,'2005-07-09 15:40:46',2520,8,'2005-07-15 13:46:46',1,'2006-02-15 21:30:53'),(5301,'2005-07-09 15:42:10',245,459,'2005-07-16 21:27:10',2,'2006-02-15 21:30:53'),(5302,'2005-07-09 15:42:36',4270,72,'2005-07-10 21:04:36',2,'2006-02-15 21:30:53'),(5303,'2005-07-09 15:44:09',3572,350,'2005-07-15 18:09:09',2,'2006-02-15 21:30:53'),(5304,'2005-07-09 15:48:06',4411,51,'2005-07-14 19:29:06',1,'2006-02-15 21:30:53'),(5305,'2005-07-09 15:55:36',625,309,'2005-07-18 15:59:36',1,'2006-02-15 21:30:53'),(5306,'2005-07-09 15:56:45',2221,409,'2005-07-15 19:02:45',2,'2006-02-15 21:30:53'),(5307,'2005-07-09 15:57:15',2847,32,'2005-07-17 13:42:15',2,'2006-02-15 21:30:53'),(5308,'2005-07-09 15:58:38',1684,52,'2005-07-15 13:55:38',2,'2006-02-15 21:30:53'),(5309,'2005-07-09 16:00:16',4026,338,'2005-07-17 17:56:16',1,'2006-02-15 21:30:53'),(5310,'2005-07-09 16:00:34',1565,24,'2005-07-12 12:45:34',2,'2006-02-15 21:30:53'),(5311,'2005-07-09 16:02:54',986,107,'2005-07-18 10:44:54',1,'2006-02-15 21:30:53'),(5312,'2005-07-09 16:03:09',2123,258,'2005-07-13 16:41:09',2,'2006-02-15 21:30:53'),(5313,'2005-07-09 16:04:45',1885,52,'2005-07-17 18:53:45',2,'2006-02-15 21:30:53'),(5314,'2005-07-09 16:05:28',3770,372,'2005-07-10 18:18:28',1,'2006-02-15 21:30:53'),(5315,'2005-07-09 16:09:19',585,134,'2005-07-14 21:10:19',1,'2006-02-15 21:30:53'),(5316,'2005-07-09 16:09:42',3856,438,'2005-07-11 15:20:42',1,'2006-02-15 21:30:53'),(5317,'2005-07-09 16:10:25',2693,14,'2005-07-18 17:10:25',2,'2006-02-15 21:30:53'),(5318,'2005-07-09 16:11:33',1738,472,'2005-07-14 12:49:33',2,'2006-02-15 21:30:53'),(5319,'2005-07-09 16:17:44',1899,282,'2005-07-18 16:35:44',1,'2006-02-15 21:30:53'),(5320,'2005-07-09 16:23:32',3140,228,'2005-07-18 18:16:32',1,'2006-02-15 21:30:53'),(5321,'2005-07-09 16:26:33',3347,245,'2005-07-15 15:05:33',2,'2006-02-15 21:30:53'),(5322,'2005-07-09 16:28:13',4420,432,'2005-07-18 14:53:13',1,'2006-02-15 21:30:53'),(5323,'2005-07-09 16:34:07',1302,35,'2005-07-13 21:37:07',1,'2006-02-15 21:30:53'),(5324,'2005-07-09 16:34:18',4024,113,'2005-07-15 12:35:18',2,'2006-02-15 21:30:53'),(5325,'2005-07-09 16:35:47',2703,492,'2005-07-10 11:52:47',1,'2006-02-15 21:30:53'),(5326,'2005-07-09 16:38:01',797,1,'2005-07-13 18:02:01',1,'2006-02-15 21:30:53'),(5327,'2005-07-09 16:39:49',3657,547,'2005-07-12 18:47:49',2,'2006-02-15 21:30:53'),(5328,'2005-07-09 16:48:29',2444,247,'2005-07-17 20:20:29',2,'2006-02-15 21:30:53'),(5329,'2005-07-09 16:49:46',1628,402,'2005-07-16 19:05:46',1,'2006-02-15 21:30:53'),(5330,'2005-07-09 16:53:57',3812,410,'2005-07-18 19:54:57',1,'2006-02-15 21:30:53'),(5331,'2005-07-09 16:54:06',4181,447,'2005-07-10 19:04:06',1,'2006-02-15 21:30:53'),(5332,'2005-07-09 16:59:23',3269,568,'2005-07-10 16:01:23',2,'2006-02-15 21:30:53'),(5333,'2005-07-09 16:59:38',2142,419,'2005-07-16 17:23:38',2,'2006-02-15 21:30:53'),(5334,'2005-07-09 17:00:13',3852,482,'2005-07-11 15:50:13',1,'2006-02-15 21:30:53'),(5335,'2005-07-09 17:00:49',2353,588,'2005-07-12 12:21:49',2,'2006-02-15 21:30:53'),(5336,'2005-07-09 17:01:08',4144,410,'2005-07-11 19:22:08',2,'2006-02-15 21:30:53'),(5337,'2005-07-09 17:03:50',4168,343,'2005-07-16 22:25:50',2,'2006-02-15 21:30:53'),(5338,'2005-07-09 17:07:07',3449,191,'2005-07-14 11:15:07',1,'2006-02-15 21:30:53'),(5339,'2005-07-09 17:09:17',698,380,'2005-07-10 21:07:17',2,'2006-02-15 21:30:53'),(5340,'2005-07-09 17:11:35',650,267,'2005-07-17 17:59:35',2,'2006-02-15 21:30:53'),(5341,'2005-07-09 17:13:23',2522,8,'2005-07-14 18:11:23',2,'2006-02-15 21:30:53'),(5342,'2005-07-09 17:20:03',3828,289,'2005-07-18 12:44:03',2,'2006-02-15 21:30:53'),(5343,'2005-07-09 17:23:43',92,485,'2005-07-18 22:14:43',1,'2006-02-15 21:30:53'),(5344,'2005-07-09 17:27:05',159,197,'2005-07-10 15:51:05',2,'2006-02-15 21:30:53'),(5345,'2005-07-09 17:28:18',3055,348,'2005-07-11 14:30:18',2,'2006-02-15 21:30:53'),(5346,'2005-07-09 17:29:01',2488,287,'2005-07-14 12:47:01',2,'2006-02-15 21:30:53'),(5347,'2005-07-09 17:31:32',1293,246,'2005-07-10 21:06:32',2,'2006-02-15 21:30:53'),(5348,'2005-07-09 17:34:11',3495,597,'2005-07-15 18:32:11',2,'2006-02-15 21:30:53'),(5349,'2005-07-09 17:35:35',3139,161,'2005-07-18 14:05:35',1,'2006-02-15 21:30:53'),(5350,'2005-07-09 17:39:30',724,129,'2005-07-11 16:43:30',2,'2006-02-15 21:30:53'),(5351,'2005-07-09 17:40:52',3722,112,'2005-07-14 16:55:52',2,'2006-02-15 21:30:53'),(5352,'2005-07-09 17:54:58',908,372,'2005-07-15 16:20:58',1,'2006-02-15 21:30:53'),(5353,'2005-07-09 18:04:29',2994,196,'2005-07-15 17:46:29',2,'2006-02-15 21:30:53'),(5354,'2005-07-09 18:04:33',951,354,'2005-07-15 18:19:33',1,'2006-02-15 21:30:53'),(5355,'2005-07-09 18:07:17',2458,100,'2005-07-16 20:33:17',2,'2006-02-15 21:30:53'),(5356,'2005-07-09 18:08:28',2905,188,'2005-07-14 14:11:28',2,'2006-02-15 21:30:53'),(5357,'2005-07-09 18:08:59',1988,411,'2005-07-16 17:28:59',2,'2006-02-15 21:30:53'),(5358,'2005-07-09 18:09:21',3764,71,'2005-07-14 23:59:21',2,'2006-02-15 21:30:53'),(5359,'2005-07-09 18:10:52',4392,453,'2005-07-18 13:34:52',2,'2006-02-15 21:30:53'),(5360,'2005-07-09 18:14:03',679,562,'2005-07-10 15:17:03',2,'2006-02-15 21:30:53'),(5361,'2005-07-09 18:15:32',2045,279,'2005-07-17 23:32:32',2,'2006-02-15 21:30:53'),(5362,'2005-07-09 18:16:08',24,266,'2005-07-18 18:27:08',1,'2006-02-15 21:30:53'),(5363,'2005-07-09 18:18:49',2180,425,'2005-07-14 22:16:49',1,'2006-02-15 21:30:53'),(5364,'2005-07-09 18:24:48',2746,366,'2005-07-10 12:30:48',1,'2006-02-15 21:30:53'),(5365,'2005-07-09 18:27:00',4469,527,'2005-07-11 14:18:00',1,'2006-02-15 21:30:53'),(5366,'2005-07-09 18:28:37',886,187,'2005-07-13 20:45:37',1,'2006-02-15 21:30:53'),(5367,'2005-07-09 18:39:15',1446,485,'2005-07-16 14:19:15',2,'2006-02-15 21:30:53'),(5368,'2005-07-09 18:41:59',4429,502,'2005-07-16 00:32:59',2,'2006-02-15 21:30:53'),(5369,'2005-07-09 18:42:16',1550,538,'2005-07-12 18:16:16',2,'2006-02-15 21:30:53'),(5370,'2005-07-09 18:43:19',2193,248,'2005-07-15 19:59:19',1,'2006-02-15 21:30:53'),(5371,'2005-07-09 18:47:48',789,425,'2005-07-14 14:39:48',2,'2006-02-15 21:30:53'),(5372,'2005-07-09 18:48:39',3551,148,'2005-07-11 17:40:39',1,'2006-02-15 21:30:53'),(5373,'2005-07-09 18:48:57',950,428,'2005-07-10 16:34:57',1,'2006-02-15 21:30:53'),(5374,'2005-07-09 18:52:08',946,144,'2005-07-16 16:34:08',1,'2006-02-15 21:30:53'),(5375,'2005-07-09 18:52:55',1407,558,'2005-07-16 15:32:55',2,'2006-02-15 21:30:53'),(5376,'2005-07-09 18:54:08',1730,104,'2005-07-17 22:01:08',1,'2006-02-15 21:30:53'),(5377,'2005-07-09 19:04:30',3118,578,'2005-07-11 14:42:30',1,'2006-02-15 21:30:53'),(5378,'2005-07-09 19:05:56',1570,138,'2005-07-10 18:03:56',2,'2006-02-15 21:30:53'),(5379,'2005-07-09 19:08:03',2110,475,'2005-07-10 17:58:03',1,'2006-02-15 21:30:53'),(5380,'2005-07-09 19:08:44',3047,166,'2005-07-11 20:09:44',1,'2006-02-15 21:30:53'),(5381,'2005-07-09 19:11:11',3033,332,'2005-07-13 17:10:11',2,'2006-02-15 21:30:53'),(5382,'2005-07-09 19:12:57',78,586,'2005-07-14 15:44:57',1,'2006-02-15 21:30:53'),(5383,'2005-07-09 19:14:32',573,14,'2005-07-11 19:57:32',1,'2006-02-15 21:30:53'),(5384,'2005-07-09 19:17:46',1729,180,'2005-07-12 13:50:46',1,'2006-02-15 21:30:53'),(5385,'2005-07-09 19:18:11',4291,112,'2005-07-16 18:50:11',2,'2006-02-15 21:30:53'),(5386,'2005-07-09 19:19:09',721,594,'2005-07-13 00:13:09',2,'2006-02-15 21:30:53'),(5387,'2005-07-09 19:25:14',4452,244,'2005-07-11 21:00:14',1,'2006-02-15 21:30:53'),(5388,'2005-07-09 19:25:25',1546,332,'2005-07-14 19:51:25',2,'2006-02-15 21:30:53'),(5389,'2005-07-09 19:25:45',3882,484,'2005-07-17 13:31:45',1,'2006-02-15 21:30:53'),(5390,'2005-07-09 19:26:22',715,139,'2005-07-14 22:46:22',1,'2006-02-15 21:30:53'),(5391,'2005-07-09 19:28:34',402,132,'2005-07-18 01:07:34',1,'2006-02-15 21:30:53'),(5392,'2005-07-09 19:32:30',2552,499,'2005-07-16 15:01:30',1,'2006-02-15 21:30:53'),(5393,'2005-07-09 19:35:12',1417,446,'2005-07-11 14:00:12',1,'2006-02-15 21:30:53'),(5394,'2005-07-09 19:36:15',1828,83,'2005-07-18 18:10:15',2,'2006-02-15 21:30:53'),(5395,'2005-07-09 19:42:37',4428,131,'2005-07-10 15:39:37',1,'2006-02-15 21:30:53'),(5396,'2005-07-09 19:42:52',3795,559,'2005-07-15 21:45:52',1,'2006-02-15 21:30:53'),(5397,'2005-07-09 19:43:51',4376,191,'2005-07-17 00:11:51',1,'2006-02-15 21:30:53'),(5398,'2005-07-09 19:44:58',4352,199,'2005-07-17 00:56:58',1,'2006-02-15 21:30:53'),(5399,'2005-07-09 19:52:44',261,67,'2005-07-10 18:31:44',2,'2006-02-15 21:30:53'),(5400,'2005-07-09 19:56:40',3435,192,'2005-07-14 20:43:40',2,'2006-02-15 21:30:53'),(5401,'2005-07-09 19:59:10',431,43,'2005-07-11 23:21:10',2,'2006-02-15 21:30:53'),(5402,'2005-07-09 20:01:58',4450,379,'2005-07-10 14:07:58',1,'2006-02-15 21:30:53'),(5403,'2005-07-09 20:07:09',3991,36,'2005-07-12 18:33:09',1,'2006-02-15 21:30:53'),(5404,'2005-07-09 20:10:43',3685,236,'2005-07-13 15:16:43',1,'2006-02-15 21:30:53'),(5405,'2005-07-09 20:11:49',799,45,'2005-07-18 18:37:49',2,'2006-02-15 21:30:53'),(5406,'2005-07-09 20:13:23',1322,563,'2005-07-11 22:05:23',2,'2006-02-15 21:30:53'),(5407,'2005-07-09 20:16:07',3641,475,'2005-07-14 21:41:07',2,'2006-02-15 21:30:53'),(5408,'2005-07-09 20:16:51',3162,144,'2005-07-18 22:19:51',1,'2006-02-15 21:30:53'),(5409,'2005-07-09 20:17:19',3538,446,'2005-07-13 23:30:19',1,'2006-02-15 21:30:53'),(5410,'2005-07-09 20:21:10',2261,281,'2005-07-18 21:43:10',2,'2006-02-15 21:30:53'),(5411,'2005-07-09 20:23:38',4292,304,'2005-07-16 01:17:38',2,'2006-02-15 21:30:53'),(5412,'2005-07-09 20:23:52',3174,458,'2005-07-18 18:40:52',1,'2006-02-15 21:30:53'),(5413,'2005-07-09 20:28:42',2056,167,'2005-07-10 19:23:42',2,'2006-02-15 21:30:53'),(5414,'2005-07-09 20:29:36',1201,174,'2005-07-13 01:55:36',2,'2006-02-15 21:30:53'),(5415,'2005-07-09 20:30:03',4413,475,'2005-07-18 00:20:03',1,'2006-02-15 21:30:53'),(5416,'2005-07-09 20:33:50',568,219,'2005-07-14 01:50:50',2,'2006-02-15 21:30:53'),(5417,'2005-07-09 20:34:09',3569,265,'2005-07-14 00:36:09',2,'2006-02-15 21:30:53'),(5418,'2005-07-09 20:41:35',55,114,'2005-07-14 00:15:35',1,'2006-02-15 21:30:53'),(5419,'2005-07-09 20:47:36',1516,226,'2005-07-12 01:36:36',1,'2006-02-15 21:30:53'),(5420,'2005-07-09 20:48:42',1739,80,'2005-07-15 21:35:42',2,'2006-02-15 21:30:53'),(5421,'2005-07-09 20:49:12',2437,33,'2005-07-10 16:30:12',1,'2006-02-15 21:30:53'),(5422,'2005-07-09 20:55:47',436,409,'2005-07-15 15:15:47',2,'2006-02-15 21:30:53'),(5423,'2005-07-09 20:56:48',1952,440,'2005-07-17 14:58:48',2,'2006-02-15 21:30:53'),(5424,'2005-07-09 20:59:09',3694,72,'2005-07-12 00:05:09',2,'2006-02-15 21:30:53'),(5425,'2005-07-09 21:02:26',531,37,'2005-07-16 23:38:26',2,'2006-02-15 21:30:53'),(5426,'2005-07-09 21:04:47',251,438,'2005-07-17 00:55:47',1,'2006-02-15 21:30:53'),(5427,'2005-07-09 21:12:26',3197,499,'2005-07-14 01:02:26',1,'2006-02-15 21:30:53'),(5428,'2005-07-09 21:12:50',3109,346,'2005-07-14 16:25:50',2,'2006-02-15 21:30:53'),(5429,'2005-07-09 21:14:03',2467,105,'2005-07-18 01:33:03',1,'2006-02-15 21:30:53'),(5430,'2005-07-09 21:19:54',1441,173,'2005-07-15 22:53:54',1,'2006-02-15 21:30:53'),(5431,'2005-07-09 21:21:11',2780,213,'2005-07-10 21:16:11',1,'2006-02-15 21:30:53'),(5432,'2005-07-09 21:21:25',1958,64,'2005-07-14 21:34:25',2,'2006-02-15 21:30:53'),(5433,'2005-07-09 21:22:00',2679,349,'2005-07-10 21:18:00',2,'2006-02-15 21:30:53'),(5434,'2005-07-09 21:25:20',3790,334,'2005-07-15 03:12:20',2,'2006-02-15 21:30:53'),(5435,'2005-07-09 21:28:07',2884,273,'2005-07-18 21:16:07',2,'2006-02-15 21:30:53'),(5436,'2005-07-09 21:31:11',2364,89,'2005-07-13 16:59:11',2,'2006-02-15 21:30:53'),(5437,'2005-07-09 21:32:29',3532,26,'2005-07-15 00:27:29',2,'2006-02-15 21:30:53'),(5438,'2005-07-09 21:34:32',487,241,'2005-07-16 02:21:32',2,'2006-02-15 21:30:53'),(5439,'2005-07-09 21:39:35',1993,58,'2005-07-13 17:45:35',2,'2006-02-15 21:30:53'),(5440,'2005-07-09 21:45:17',138,332,'2005-07-11 22:43:17',2,'2006-02-15 21:30:53'),(5441,'2005-07-09 21:52:05',3913,7,'2005-07-17 02:54:05',1,'2006-02-15 21:30:53'),(5442,'2005-07-09 21:55:19',3093,29,'2005-07-19 01:18:19',2,'2006-02-15 21:30:53'),(5443,'2005-07-09 21:56:09',2951,137,'2005-07-16 00:33:09',2,'2006-02-15 21:30:53'),(5444,'2005-07-09 21:58:57',2968,10,'2005-07-11 03:09:57',2,'2006-02-15 21:30:53'),(5445,'2005-07-09 21:59:41',565,578,'2005-07-15 00:40:41',1,'2006-02-15 21:30:53'),(5446,'2005-07-09 21:59:55',2769,454,'2005-07-11 01:45:55',2,'2006-02-15 21:30:53'),(5447,'2005-07-09 22:09:28',2530,473,'2005-07-18 20:03:28',2,'2006-02-15 21:30:53'),(5448,'2005-07-09 22:11:14',646,463,'2005-07-15 21:08:14',2,'2006-02-15 21:30:53'),(5449,'2005-07-09 22:12:01',921,261,'2005-07-18 01:18:01',2,'2006-02-15 21:30:53'),(5450,'2005-07-09 22:13:25',2356,328,'2005-07-13 23:28:25',1,'2006-02-15 21:30:53'),(5451,'2005-07-09 22:22:10',3484,39,'2005-07-11 02:43:10',1,'2006-02-15 21:30:53'),(5452,'2005-07-09 22:23:21',2036,80,'2005-07-17 00:20:21',1,'2006-02-15 21:30:53'),(5453,'2005-07-09 22:24:11',1780,106,'2005-07-19 04:08:11',1,'2006-02-15 21:30:53'),(5454,'2005-07-09 22:24:25',3049,97,'2005-07-11 01:52:25',1,'2006-02-15 21:30:53'),(5455,'2005-07-09 22:28:45',1955,464,'2005-07-18 02:50:45',2,'2006-02-15 21:30:53'),(5456,'2005-07-09 22:31:45',3003,360,'2005-07-12 03:53:45',1,'2006-02-15 21:30:53'),(5457,'2005-07-09 22:33:14',4179,433,'2005-07-12 02:30:14',1,'2006-02-15 21:30:53'),(5458,'2005-07-09 22:35:49',2203,521,'2005-07-16 22:55:49',1,'2006-02-15 21:30:53'),(5459,'2005-07-09 22:43:56',1847,168,'2005-07-12 18:05:56',1,'2006-02-15 21:30:53'),(5460,'2005-07-09 22:46:14',2410,38,'2005-07-12 21:26:14',2,'2006-02-15 21:30:53'),(5461,'2005-07-09 22:48:04',53,244,'2005-07-10 17:56:04',2,'2006-02-15 21:30:53'),(5462,'2005-07-09 22:56:53',871,583,'2005-07-11 21:50:53',2,'2006-02-15 21:30:53'),(5463,'2005-07-09 22:57:02',601,374,'2005-07-11 03:10:02',1,'2006-02-15 21:30:53'),(5464,'2005-07-09 22:58:14',3692,434,'2005-07-15 02:48:14',1,'2006-02-15 21:30:53'),(5465,'2005-07-09 23:01:13',723,503,'2005-07-13 01:03:13',1,'2006-02-15 21:30:53'),(5466,'2005-07-09 23:03:21',2302,482,'2005-07-10 20:11:21',2,'2006-02-15 21:30:53'),(5467,'2005-07-09 23:05:47',374,543,'2005-07-16 17:06:47',2,'2006-02-15 21:30:53'),(5468,'2005-07-09 23:06:09',2196,81,'2005-07-13 00:48:09',1,'2006-02-15 21:30:53'),(5469,'2005-07-09 23:08:07',2201,475,'2005-07-13 19:13:07',1,'2006-02-15 21:30:53'),(5470,'2005-07-09 23:10:49',3254,325,'2005-07-18 04:30:49',1,'2006-02-15 21:30:53'),(5471,'2005-07-09 23:11:52',4086,347,'2005-07-13 02:08:52',2,'2006-02-15 21:30:53'),(5472,'2005-07-09 23:16:40',865,165,'2005-07-10 18:43:40',2,'2006-02-15 21:30:53'),(5473,'2005-07-09 23:19:11',4283,51,'2005-07-19 02:30:11',2,'2006-02-15 21:30:53'),(5474,'2005-07-09 23:23:57',3608,375,'2005-07-15 03:11:57',1,'2006-02-15 21:30:53'),(5475,'2005-07-09 23:31:38',726,219,'2005-07-12 03:51:38',1,'2006-02-15 21:30:53'),(5476,'2005-07-09 23:37:09',1199,427,'2005-07-15 23:57:09',1,'2006-02-15 21:30:53'),(5477,'2005-07-09 23:43:49',994,542,'2005-07-15 05:03:49',2,'2006-02-15 21:30:53'),(5478,'2005-07-09 23:45:15',3213,583,'2005-07-15 22:48:15',1,'2006-02-15 21:30:53'),(5479,'2005-07-09 23:47:33',216,250,'2005-07-13 01:09:33',1,'2006-02-15 21:30:53'),(5480,'2005-07-09 23:49:07',847,452,'2005-07-12 00:15:07',1,'2006-02-15 21:30:53'),(5481,'2005-07-09 23:51:57',562,479,'2005-07-11 05:28:57',2,'2006-02-15 21:30:53'),(5482,'2005-07-09 23:53:04',2136,460,'2005-07-15 04:59:04',1,'2006-02-15 21:30:53'),(5483,'2005-07-09 23:54:09',4362,89,'2005-07-17 23:36:09',1,'2006-02-15 21:30:53'),(5484,'2005-07-09 23:54:37',3248,495,'2005-07-15 02:05:37',1,'2006-02-15 21:30:53'),(5485,'2005-07-09 23:55:25',3930,173,'2005-07-14 04:08:25',1,'2006-02-15 21:30:53'),(5486,'2005-07-09 23:57:44',2864,538,'2005-07-14 00:23:44',1,'2006-02-15 21:30:53'),(5487,'2005-07-10 00:01:50',1144,341,'2005-07-10 20:43:50',1,'2006-02-15 21:30:53'),(5488,'2005-07-10 00:02:06',4262,173,'2005-07-15 01:45:06',2,'2006-02-15 21:30:53'),(5489,'2005-07-10 00:07:03',2319,490,'2005-07-15 19:52:03',1,'2006-02-15 21:30:53'),(5490,'2005-07-10 00:09:11',3044,367,'2005-07-14 21:23:11',1,'2006-02-15 21:30:53'),(5491,'2005-07-10 00:09:45',2007,49,'2005-07-11 02:25:45',1,'2006-02-15 21:30:53'),(5492,'2005-07-10 00:11:09',4524,558,'2005-07-14 01:27:09',1,'2006-02-15 21:30:53'),(5493,'2005-07-10 00:11:44',2037,539,'2005-07-15 19:24:44',2,'2006-02-15 21:30:53'),(5494,'2005-07-10 00:15:00',3087,139,'2005-07-17 01:12:00',2,'2006-02-15 21:30:53'),(5495,'2005-07-10 00:16:54',2199,257,'2005-07-19 01:22:54',2,'2006-02-15 21:30:53'),(5496,'2005-07-10 00:20:23',3182,369,'2005-07-18 21:10:23',2,'2006-02-15 21:30:53'),(5497,'2005-07-10 00:23:23',4473,92,'2005-07-16 03:54:23',1,'2006-02-15 21:30:53'),(5498,'2005-07-10 00:27:21',63,302,'2005-07-13 20:11:21',2,'2006-02-15 21:30:53'),(5499,'2005-07-10 00:27:45',1525,127,'2005-07-17 06:11:45',1,'2006-02-15 21:30:53'),(5500,'2005-07-10 00:28:17',3380,457,'2005-07-15 19:09:17',1,'2006-02-15 21:30:53'),(5501,'2005-07-10 00:33:48',3979,372,'2005-07-17 02:58:48',1,'2006-02-15 21:30:53'),(5502,'2005-07-10 00:34:15',3712,243,'2005-07-11 21:44:15',1,'2006-02-15 21:30:53'),(5503,'2005-07-10 00:35:37',3892,262,'2005-07-12 20:29:37',1,'2006-02-15 21:30:53'),(5504,'2005-07-10 00:36:38',3053,455,'2005-07-16 19:36:38',1,'2006-02-15 21:30:53'),(5505,'2005-07-10 00:38:48',896,253,'2005-07-12 03:12:48',2,'2006-02-15 21:30:53'),(5506,'2005-07-10 00:45:48',2432,117,'2005-07-18 20:35:48',2,'2006-02-15 21:30:53'),(5507,'2005-07-10 00:49:04',716,399,'2005-07-15 22:06:04',2,'2006-02-15 21:30:53'),(5508,'2005-07-10 00:50:01',2977,345,'2005-07-16 19:07:01',1,'2006-02-15 21:30:53'),(5509,'2005-07-10 00:54:46',1142,102,'2005-07-16 05:10:46',1,'2006-02-15 21:30:53'),(5510,'2005-07-10 00:58:37',1298,67,'2005-07-17 22:02:37',2,'2006-02-15 21:30:53'),(5511,'2005-07-10 01:00:00',3678,301,'2005-07-12 20:44:00',1,'2006-02-15 21:30:53'),(5512,'2005-07-10 01:05:38',4470,405,'2005-07-17 20:47:38',1,'2006-02-15 21:30:53'),(5513,'2005-07-10 01:05:41',2558,356,'2005-07-11 02:05:41',2,'2006-02-15 21:30:53'),(5514,'2005-07-10 01:09:42',1824,522,'2005-07-17 05:47:42',1,'2006-02-15 21:30:53'),(5515,'2005-07-10 01:12:44',3772,39,'2005-07-13 00:39:44',1,'2006-02-15 21:30:53'),(5516,'2005-07-10 01:13:52',1902,581,'2005-07-15 22:56:52',1,'2006-02-15 21:30:53'),(5517,'2005-07-10 01:15:00',3689,42,'2005-07-19 01:59:00',1,'2006-02-15 21:30:53'),(5518,'2005-07-10 01:15:11',3340,451,'2005-07-18 19:28:11',2,'2006-02-15 21:30:53'),(5519,'2005-07-10 01:18:32',1312,85,'2005-07-11 20:39:32',1,'2006-02-15 21:30:53'),(5520,'2005-07-10 01:30:41',2527,501,'2005-07-15 21:37:41',2,'2006-02-15 21:30:53'),(5521,'2005-07-10 01:31:22',1956,182,'2005-07-17 05:42:22',2,'2006-02-15 21:30:53'),(5522,'2005-07-10 01:46:29',2622,573,'2005-07-18 00:41:29',2,'2006-02-15 21:30:53'),(5523,'2005-07-10 01:47:55',2233,125,'2005-07-18 22:25:55',1,'2006-02-15 21:30:53'),(5524,'2005-07-10 01:49:24',3596,386,'2005-07-14 22:55:24',1,'2006-02-15 21:30:53'),(5525,'2005-07-10 02:03:08',3141,241,'2005-07-18 07:32:08',1,'2006-02-15 21:30:53'),(5526,'2005-07-10 02:04:03',3909,144,'2005-07-16 22:15:03',2,'2006-02-15 21:30:53'),(5527,'2005-07-10 02:06:01',4462,554,'2005-07-15 00:55:01',2,'2006-02-15 21:30:53'),(5528,'2005-07-10 02:09:21',680,551,'2005-07-17 06:22:21',2,'2006-02-15 21:30:53'),(5529,'2005-07-10 02:11:13',1652,590,'2005-07-15 06:56:13',2,'2006-02-15 21:30:53'),(5530,'2005-07-10 02:13:49',2701,74,'2005-07-18 08:01:49',2,'2006-02-15 21:30:53'),(5531,'2005-07-10 02:13:59',2992,173,'2005-07-15 00:01:59',2,'2006-02-15 21:30:53'),(5532,'2005-07-10 02:17:31',983,522,'2005-07-16 02:57:31',2,'2006-02-15 21:30:53'),(5533,'2005-07-10 02:19:28',2567,270,'2005-07-11 01:37:28',1,'2006-02-15 21:30:53'),(5534,'2005-07-10 02:26:49',3251,156,'2005-07-11 07:13:49',1,'2006-02-15 21:30:53'),(5535,'2005-07-10 02:27:42',1623,394,'2005-07-12 21:13:42',1,'2006-02-15 21:30:53'),(5536,'2005-07-10 02:29:42',1919,195,'2005-07-13 04:06:42',2,'2006-02-15 21:30:53'),(5537,'2005-07-10 02:35:41',1781,254,'2005-07-13 07:11:41',2,'2006-02-15 21:30:53'),(5538,'2005-07-10 02:39:40',2119,367,'2005-07-12 01:39:40',2,'2006-02-15 21:30:53'),(5539,'2005-07-10 02:42:58',3217,90,'2005-07-16 02:27:58',2,'2006-02-15 21:30:53'),(5540,'2005-07-10 02:44:21',132,250,'2005-07-11 07:13:21',1,'2006-02-15 21:30:53'),(5541,'2005-07-10 02:44:27',1211,135,'2005-07-13 04:13:27',2,'2006-02-15 21:30:53'),(5542,'2005-07-10 02:45:53',1713,105,'2005-07-15 23:23:53',2,'2006-02-15 21:30:53'),(5543,'2005-07-10 02:48:03',1496,71,'2005-07-17 05:49:03',2,'2006-02-15 21:30:53'),(5544,'2005-07-10 02:48:07',1014,316,'2005-07-17 01:08:07',1,'2006-02-15 21:30:53'),(5545,'2005-07-10 02:50:29',118,236,'2005-07-16 02:11:29',1,'2006-02-15 21:30:53'),(5546,'2005-07-10 02:50:37',2918,515,'2005-07-16 08:22:37',1,'2006-02-15 21:30:53'),(5547,'2005-07-10 02:52:47',1432,519,'2005-07-16 02:10:47',1,'2006-02-15 21:30:53'),(5548,'2005-07-10 02:56:45',2973,317,'2005-07-13 01:33:45',2,'2006-02-15 21:30:53'),(5549,'2005-07-10 02:58:29',2685,163,'2005-07-17 05:24:29',2,'2006-02-15 21:30:53'),(5550,'2005-07-10 02:58:35',1905,254,'2005-07-16 02:38:35',2,'2006-02-15 21:30:53'),(5551,'2005-07-10 03:01:09',4238,44,'2005-07-18 02:04:09',2,'2006-02-15 21:30:53'),(5552,'2005-07-10 03:01:19',2879,27,'2005-07-13 06:53:19',2,'2006-02-15 21:30:53'),(5553,'2005-07-10 03:03:35',1686,6,'2005-07-14 07:49:35',2,'2006-02-15 21:30:53'),(5554,'2005-07-10 03:03:38',4084,252,'2005-07-17 00:00:38',2,'2006-02-15 21:30:53'),(5555,'2005-07-10 03:08:55',2551,79,'2005-07-11 01:36:55',2,'2006-02-15 21:30:53'),(5556,'2005-07-10 03:10:17',4483,354,'2005-07-14 02:47:17',1,'2006-02-15 21:30:53'),(5557,'2005-07-10 03:10:21',1433,346,'2005-07-11 21:34:21',1,'2006-02-15 21:30:53'),(5558,'2005-07-10 03:12:08',1123,96,'2005-07-14 03:09:08',2,'2006-02-15 21:30:53'),(5559,'2005-07-10 03:13:07',4122,496,'2005-07-18 08:33:07',1,'2006-02-15 21:30:53'),(5560,'2005-07-10 03:13:24',720,231,'2005-07-19 06:03:24',2,'2006-02-15 21:30:53'),(5561,'2005-07-10 03:15:24',1048,369,'2005-07-15 06:46:24',1,'2006-02-15 21:30:53'),(5562,'2005-07-10 03:17:42',3604,300,'2005-07-12 03:26:42',1,'2006-02-15 21:30:53'),(5563,'2005-07-10 03:21:02',2258,362,'2005-07-14 07:40:02',1,'2006-02-15 21:30:53'),(5564,'2005-07-10 03:23:05',196,355,'2005-07-16 07:46:05',2,'2006-02-15 21:30:53'),(5565,'2005-07-10 03:29:48',3368,14,'2005-07-17 04:43:48',1,'2006-02-15 21:30:53'),(5566,'2005-07-10 03:30:17',1343,124,'2005-07-13 06:32:17',1,'2006-02-15 21:30:53'),(5567,'2005-07-10 03:36:46',1616,147,'2005-07-15 23:22:46',2,'2006-02-15 21:30:53'),(5568,'2005-07-10 03:36:56',1130,424,'2005-07-11 08:35:56',2,'2006-02-15 21:30:53'),(5569,'2005-07-10 03:38:32',2835,69,'2005-07-16 00:02:32',2,'2006-02-15 21:30:53'),(5570,'2005-07-10 03:46:47',2013,374,'2005-07-17 09:28:47',1,'2006-02-15 21:30:53'),(5571,'2005-07-10 03:48:20',1084,76,'2005-07-11 02:09:20',2,'2006-02-15 21:30:53'),(5572,'2005-07-10 03:49:00',2709,458,'2005-07-14 01:25:00',1,'2006-02-15 21:30:53'),(5573,'2005-07-10 03:50:47',2957,170,'2005-07-17 06:40:47',2,'2006-02-15 21:30:53'),(5574,'2005-07-10 03:54:38',2307,163,'2005-07-19 07:20:38',2,'2006-02-15 21:30:53'),(5575,'2005-07-10 03:55:50',2316,107,'2005-07-12 08:40:50',1,'2006-02-15 21:30:53'),(5576,'2005-07-10 03:57:05',1453,217,'2005-07-13 02:16:05',2,'2006-02-15 21:30:53'),(5577,'2005-07-10 03:58:40',3779,266,'2005-07-14 03:36:40',1,'2006-02-15 21:30:53'),(5578,'2005-07-10 04:00:31',4543,378,'2005-07-16 08:06:31',2,'2006-02-15 21:30:53'),(5579,'2005-07-10 04:04:29',945,203,'2005-07-14 04:31:29',1,'2006-02-15 21:30:53'),(5580,'2005-07-10 04:05:49',2753,521,'2005-07-18 22:36:49',2,'2006-02-15 21:30:53'),(5581,'2005-07-10 04:06:06',3450,306,'2005-07-15 08:31:06',2,'2006-02-15 21:30:53'),(5582,'2005-07-10 04:08:25',3341,305,'2005-07-13 06:04:25',1,'2006-02-15 21:30:53'),(5583,'2005-07-10 04:08:48',1242,391,'2005-07-19 07:59:48',1,'2006-02-15 21:30:53'),(5584,'2005-07-10 04:15:25',2606,289,'2005-07-16 22:54:25',2,'2006-02-15 21:30:53'),(5585,'2005-07-10 04:15:43',3524,63,'2005-07-15 08:24:43',1,'2006-02-15 21:30:53'),(5586,'2005-07-10 04:17:06',2965,427,'2005-07-18 07:11:06',1,'2006-02-15 21:30:53'),(5587,'2005-07-10 04:17:25',4485,531,'2005-07-15 01:41:25',1,'2006-02-15 21:30:53'),(5588,'2005-07-10 04:21:10',1166,535,'2005-07-16 02:58:10',2,'2006-02-15 21:30:53'),(5589,'2005-07-10 04:22:58',3673,296,'2005-07-10 23:13:58',1,'2006-02-15 21:30:53'),(5590,'2005-07-10 04:23:11',4442,407,'2005-07-19 09:03:11',1,'2006-02-15 21:30:53'),(5591,'2005-07-10 04:25:03',378,374,'2005-07-16 04:21:03',1,'2006-02-15 21:30:53'),(5592,'2005-07-10 04:26:13',2471,222,'2005-07-19 02:32:13',2,'2006-02-15 21:30:53'),(5593,'2005-07-10 04:33:13',702,287,'2005-07-17 08:44:13',2,'2006-02-15 21:30:53'),(5594,'2005-07-10 04:33:36',61,440,'2005-07-12 08:13:36',2,'2006-02-15 21:30:53'),(5595,'2005-07-10 04:33:45',264,572,'2005-07-16 04:04:45',1,'2006-02-15 21:30:53'),(5596,'2005-07-10 04:43:14',1662,240,'2005-07-11 22:58:14',2,'2006-02-15 21:30:53'),(5597,'2005-07-10 04:47:57',4264,576,'2005-07-17 01:54:57',2,'2006-02-15 21:30:53'),(5598,'2005-07-10 04:48:29',3412,397,'2005-07-18 10:33:29',2,'2006-02-15 21:30:53'),(5599,'2005-07-10 04:52:04',3054,391,'2005-07-13 05:19:04',1,'2006-02-15 21:30:53'),(5600,'2005-07-10 04:55:45',3713,138,'2005-07-18 03:10:45',2,'2006-02-15 21:30:53'),(5601,'2005-07-10 04:56:55',3062,511,'2005-07-11 00:14:55',1,'2006-02-15 21:30:53'),(5602,'2005-07-10 05:02:22',3544,253,'2005-07-14 23:40:22',2,'2006-02-15 21:30:53'),(5603,'2005-07-10 05:04:54',1308,74,'2005-07-12 01:54:54',2,'2006-02-15 21:30:53'),(5604,'2005-07-10 05:05:00',3702,78,'2005-07-12 08:04:00',1,'2006-02-15 21:30:53'),(5605,'2005-07-10 05:06:45',2964,273,'2005-07-15 02:51:45',2,'2006-02-15 21:30:53'),(5606,'2005-07-10 05:07:55',2896,51,'2005-07-15 00:14:55',2,'2006-02-15 21:30:53'),(5607,'2005-07-10 05:08:10',4257,52,'2005-07-15 00:40:10',2,'2006-02-15 21:30:53'),(5608,'2005-07-10 05:08:26',3854,384,'2005-07-10 23:24:26',1,'2006-02-15 21:30:53'),(5609,'2005-07-10 05:09:46',1553,492,'2005-07-12 10:38:46',1,'2006-02-15 21:30:53'),(5610,'2005-07-10 05:09:52',481,131,'2005-07-13 07:08:52',2,'2006-02-15 21:30:53'),(5611,'2005-07-10 05:13:43',2832,424,'2005-07-16 05:56:43',1,'2006-02-15 21:30:53'),(5612,'2005-07-10 05:15:12',2363,472,'2005-07-17 09:50:12',2,'2006-02-15 21:30:53'),(5613,'2005-07-10 05:15:43',4517,220,'2005-07-13 05:17:43',2,'2006-02-15 21:30:53'),(5614,'2005-07-10 05:16:56',133,371,'2005-07-13 02:03:56',1,'2006-02-15 21:30:53'),(5615,'2005-07-10 05:18:51',1521,173,'2005-07-17 11:05:51',2,'2006-02-15 21:30:53'),(5616,'2005-07-10 05:21:11',4014,238,'2005-07-18 08:42:11',2,'2006-02-15 21:30:53'),(5617,'2005-07-10 05:28:50',2324,342,'2005-07-12 00:02:50',2,'2006-02-15 21:30:53'),(5618,'2005-07-10 05:28:58',757,316,'2005-07-18 01:38:58',1,'2006-02-15 21:30:53'),(5619,'2005-07-10 05:29:33',113,204,'2005-07-15 00:40:33',1,'2006-02-15 21:30:53'),(5620,'2005-07-10 05:30:52',2980,92,'2005-07-16 04:13:52',1,'2006-02-15 21:30:53'),(5621,'2005-07-10 05:34:10',552,310,'2005-07-14 02:49:10',1,'2006-02-15 21:30:53'),(5622,'2005-07-10 05:39:37',1783,568,'2005-07-15 00:48:37',2,'2006-02-15 21:30:53'),(5623,'2005-07-10 05:41:38',4464,229,'2005-07-14 01:01:38',2,'2006-02-15 21:30:53'),(5624,'2005-07-10 05:43:16',1015,114,'2005-07-12 05:33:16',1,'2006-02-15 21:30:53'),(5625,'2005-07-10 05:44:02',1751,114,'2005-07-12 00:03:02',2,'2006-02-15 21:30:53'),(5626,'2005-07-10 05:49:35',3029,389,'2005-07-15 08:05:35',1,'2006-02-15 21:30:53'),(5627,'2005-07-10 05:51:12',244,136,'2005-07-17 09:56:12',2,'2006-02-15 21:30:53'),(5628,'2005-07-10 05:56:40',4040,87,'2005-07-17 11:13:40',1,'2006-02-15 21:30:53'),(5629,'2005-07-10 06:02:25',400,546,'2005-07-16 07:33:25',1,'2006-02-15 21:30:53'),(5630,'2005-07-10 06:08:14',1151,537,'2005-07-14 03:37:14',2,'2006-02-15 21:30:53'),(5631,'2005-07-10 06:15:45',2095,595,'2005-07-17 09:53:45',2,'2006-02-15 21:30:53'),(5632,'2005-07-10 06:17:06',2632,404,'2005-07-17 02:32:06',2,'2006-02-15 21:30:53'),(5633,'2005-07-10 06:22:24',1056,480,'2005-07-11 05:59:24',2,'2006-02-15 21:30:53'),(5634,'2005-07-10 06:25:48',323,487,'2005-07-17 09:07:48',2,'2006-02-15 21:30:53'),(5635,'2005-07-10 06:28:39',1457,222,'2005-07-17 08:35:39',2,'2006-02-15 21:30:53'),(5636,'2005-07-10 06:31:24',4116,2,'2005-07-13 02:36:24',1,'2006-02-15 21:30:53'),(5637,'2005-07-10 06:31:37',4436,45,'2005-07-17 01:16:37',1,'2006-02-15 21:30:53'),(5638,'2005-07-10 06:32:49',1528,570,'2005-07-13 04:32:49',2,'2006-02-15 21:30:53'),(5639,'2005-07-10 06:33:39',2452,249,'2005-07-19 07:47:39',1,'2006-02-15 21:30:53'),(5640,'2005-07-10 06:38:00',2706,574,'2005-07-18 08:56:00',2,'2006-02-15 21:30:53'),(5641,'2005-07-10 06:43:43',3568,50,'2005-07-15 06:33:43',1,'2006-02-15 21:30:53'),(5642,'2005-07-10 06:46:08',3630,299,'2005-07-13 10:03:08',1,'2006-02-15 21:30:53'),(5643,'2005-07-10 06:49:00',796,34,'2005-07-14 01:53:00',1,'2006-02-15 21:30:53'),(5644,'2005-07-10 06:57:44',4069,476,'2005-07-15 03:52:44',2,'2006-02-15 21:30:53'),(5645,'2005-07-10 06:58:21',1586,333,'2005-07-18 04:19:21',2,'2006-02-15 21:30:53'),(5646,'2005-07-10 07:08:09',1471,166,'2005-07-14 03:48:09',2,'2006-02-15 21:30:53'),(5647,'2005-07-10 07:08:40',1466,128,'2005-07-13 05:19:40',2,'2006-02-15 21:30:53'),(5648,'2005-07-10 07:09:21',4359,24,'2005-07-16 07:23:21',2,'2006-02-15 21:30:53'),(5649,'2005-07-10 07:15:07',1349,336,'2005-07-12 11:57:07',2,'2006-02-15 21:30:53'),(5650,'2005-07-10 07:17:01',2793,461,'2005-07-15 11:59:01',1,'2006-02-15 21:30:53'),(5651,'2005-07-10 07:17:13',301,239,'2005-07-15 12:13:13',2,'2006-02-15 21:30:53'),(5652,'2005-07-10 07:18:58',927,42,'2005-07-19 07:52:58',1,'2006-02-15 21:30:53'),(5653,'2005-07-10 07:21:27',919,28,'2005-07-16 01:58:27',1,'2006-02-15 21:30:53'),(5654,'2005-07-10 07:24:46',3419,490,'2005-07-14 07:39:46',2,'2006-02-15 21:30:53'),(5655,'2005-07-10 07:31:06',3470,113,'2005-07-17 08:22:06',1,'2006-02-15 21:30:53'),(5656,'2005-07-10 07:31:07',4138,159,'2005-07-15 04:44:07',1,'2006-02-15 21:30:53'),(5657,'2005-07-10 07:33:43',4342,508,'2005-07-18 01:55:43',2,'2006-02-15 21:30:53'),(5658,'2005-07-10 07:34:08',4402,165,'2005-07-19 04:21:08',2,'2006-02-15 21:30:53'),(5659,'2005-07-10 07:45:40',4265,9,'2005-07-15 05:20:40',1,'2006-02-15 21:30:53'),(5660,'2005-07-10 07:46:12',1404,171,'2005-07-17 07:48:12',1,'2006-02-15 21:30:53'),(5661,'2005-07-10 07:53:51',1878,108,'2005-07-14 12:57:51',2,'2006-02-15 21:30:53'),(5662,'2005-07-10 07:59:24',219,502,'2005-07-14 13:06:24',1,'2006-02-15 21:30:53'),(5663,'2005-07-10 08:01:33',3078,530,'2005-07-15 03:36:33',2,'2006-02-15 21:30:53'),(5664,'2005-07-10 08:04:41',2375,469,'2005-07-17 10:29:41',1,'2006-02-15 21:30:53'),(5665,'2005-07-10 08:10:08',1175,415,'2005-07-11 05:22:08',2,'2006-02-15 21:30:53'),(5666,'2005-07-10 08:10:29',2225,242,'2005-07-17 04:54:29',2,'2006-02-15 21:30:53'),(5667,'2005-07-10 08:11:03',683,336,'2005-07-15 08:23:03',2,'2006-02-15 21:30:53'),(5668,'2005-07-10 08:11:05',309,211,'2005-07-16 13:15:05',1,'2006-02-15 21:30:53'),(5669,'2005-07-10 08:12:53',1173,323,'2005-07-11 05:48:53',2,'2006-02-15 21:30:53'),(5670,'2005-07-10 08:14:52',610,121,'2005-07-14 04:13:52',2,'2006-02-15 21:30:53'),(5671,'2005-07-10 08:18:22',1304,268,'2005-07-11 07:03:22',2,'2006-02-15 21:30:53'),(5672,'2005-07-10 08:19:38',2326,158,'2005-07-16 06:28:38',2,'2006-02-15 21:30:53'),(5673,'2005-07-10 08:21:54',4018,117,'2005-07-11 05:54:54',2,'2006-02-15 21:30:53'),(5674,'2005-07-10 08:26:26',548,258,'2005-07-16 02:43:26',1,'2006-02-15 21:30:53'),(5675,'2005-07-10 08:31:06',2134,376,'2005-07-17 11:48:06',1,'2006-02-15 21:30:53'),(5676,'2005-07-10 08:38:32',3595,153,'2005-07-13 10:11:32',1,'2006-02-15 21:30:53'),(5677,'2005-07-10 08:41:28',2647,105,'2005-07-12 09:05:28',2,'2006-02-15 21:30:53'),(5678,'2005-07-10 08:42:42',4366,96,'2005-07-19 03:48:42',1,'2006-02-15 21:30:53'),(5679,'2005-07-10 08:44:02',389,138,'2005-07-14 05:30:02',1,'2006-02-15 21:30:53'),(5680,'2005-07-10 08:47:36',3503,199,'2005-07-17 06:10:36',1,'2006-02-15 21:30:53'),(5681,'2005-07-10 08:48:39',4176,50,'2005-07-18 07:17:39',1,'2006-02-15 21:30:53'),(5682,'2005-07-10 08:51:39',17,302,'2005-07-12 14:44:39',2,'2006-02-15 21:30:53'),(5683,'2005-07-10 08:52:13',4433,285,'2005-07-19 10:25:13',1,'2006-02-15 21:30:53'),(5684,'2005-07-10 08:59:03',99,132,'2005-07-15 07:21:03',1,'2006-02-15 21:30:53'),(5685,'2005-07-10 09:01:38',1462,170,'2005-07-17 10:58:38',1,'2006-02-15 21:30:53'),(5686,'2005-07-10 09:06:03',717,521,'2005-07-11 10:59:03',2,'2006-02-15 21:30:53'),(5687,'2005-07-10 09:07:19',2170,363,'2005-07-16 11:17:19',2,'2006-02-15 21:30:53'),(5688,'2005-07-10 09:16:08',3036,598,'2005-07-15 09:44:08',1,'2006-02-15 21:30:53'),(5689,'2005-07-10 09:24:17',1731,381,'2005-07-15 05:36:17',1,'2006-02-15 21:30:53'),(5690,'2005-07-10 09:26:49',1326,362,'2005-07-19 07:17:49',2,'2006-02-15 21:30:53'),(5691,'2005-07-10 09:29:49',3526,466,'2005-07-16 13:37:49',1,'2006-02-15 21:30:53'),(5692,'2005-07-10 09:32:22',59,244,'2005-07-15 15:20:22',2,'2006-02-15 21:30:53'),(5693,'2005-07-10 09:35:43',2167,208,'2005-07-12 08:05:43',2,'2006-02-15 21:30:53'),(5694,'2005-07-10 09:40:38',3476,57,'2005-07-14 09:16:38',1,'2006-02-15 21:30:53'),(5695,'2005-07-10 09:43:40',440,459,'2005-07-13 15:04:40',2,'2006-02-15 21:30:53'),(5696,'2005-07-10 09:44:32',128,96,'2005-07-12 13:38:32',2,'2006-02-15 21:30:53'),(5697,'2005-07-10 09:44:44',934,515,'2005-07-12 12:13:44',2,'2006-02-15 21:30:53'),(5698,'2005-07-10 09:47:00',639,46,'2005-07-16 06:26:00',1,'2006-02-15 21:30:53'),(5699,'2005-07-10 09:48:04',958,211,'2005-07-17 09:07:04',1,'2006-02-15 21:30:53'),(5700,'2005-07-10 09:49:42',3961,87,'2005-07-19 04:20:42',1,'2006-02-15 21:30:53'),(5701,'2005-07-10 09:56:24',2395,91,'2005-07-16 15:11:24',2,'2006-02-15 21:30:53'),(5702,'2005-07-10 10:00:01',3349,324,'2005-07-11 15:29:01',1,'2006-02-15 21:30:53'),(5703,'2005-07-10 10:04:15',1585,132,'2005-07-16 07:43:15',1,'2006-02-15 21:30:53'),(5704,'2005-07-10 10:06:29',2104,591,'2005-07-17 10:48:29',1,'2006-02-15 21:30:53'),(5705,'2005-07-10 10:09:17',4030,300,'2005-07-19 07:24:17',2,'2006-02-15 21:30:53'),(5706,'2005-07-10 10:21:46',3701,255,'2005-07-16 04:37:46',2,'2006-02-15 21:30:53'),(5707,'2005-07-10 10:26:14',708,581,'2005-07-18 06:19:14',1,'2006-02-15 21:30:53'),(5708,'2005-07-10 10:29:19',571,484,'2005-07-18 06:50:19',1,'2006-02-15 21:30:53'),(5709,'2005-07-10 10:31:52',732,302,'2005-07-12 10:47:52',1,'2006-02-15 21:30:53'),(5710,'2005-07-10 10:32:52',2843,265,'2005-07-18 06:28:52',1,'2006-02-15 21:30:53'),(5711,'2005-07-10 10:37:20',3988,481,'2005-07-13 11:20:20',1,'2006-02-15 21:30:53'),(5712,'2005-07-10 10:40:32',3480,304,'2005-07-12 11:45:32',1,'2006-02-15 21:30:53'),(5713,'2005-07-10 10:46:15',1213,572,'2005-07-19 14:34:15',1,'2006-02-15 21:30:53'),(5714,'2005-07-10 10:46:57',3706,17,'2005-07-18 14:07:57',1,'2006-02-15 21:30:53'),(5715,'2005-07-10 10:48:03',1638,132,'2005-07-18 11:27:03',1,'2006-02-15 21:30:53'),(5716,'2005-07-10 10:59:23',3416,102,'2005-07-16 12:25:23',2,'2006-02-15 21:30:53'),(5717,'2005-07-10 11:02:03',529,15,'2005-07-13 13:00:03',1,'2006-02-15 21:30:53'),(5718,'2005-07-10 11:03:20',3719,20,'2005-07-19 15:38:20',2,'2006-02-15 21:30:53'),(5719,'2005-07-10 11:07:40',2100,94,'2005-07-15 14:14:40',2,'2006-02-15 21:30:53'),(5720,'2005-07-10 11:09:12',576,339,'2005-07-16 07:31:12',1,'2006-02-15 21:30:53'),(5721,'2005-07-10 11:09:35',2348,5,'2005-07-17 16:41:35',2,'2006-02-15 21:30:53'),(5722,'2005-07-10 11:10:04',2890,556,'2005-07-12 16:31:04',2,'2006-02-15 21:30:53'),(5723,'2005-07-10 11:14:48',605,33,'2005-07-11 15:46:48',2,'2006-02-15 21:30:53'),(5724,'2005-07-10 11:18:12',3597,289,'2005-07-16 14:53:12',2,'2006-02-15 21:30:53'),(5725,'2005-07-10 11:21:21',4293,426,'2005-07-14 05:34:21',2,'2006-02-15 21:30:53'),(5726,'2005-07-10 11:22:08',3582,131,'2005-07-13 05:55:08',1,'2006-02-15 21:30:53'),(5727,'2005-07-10 11:25:28',3338,550,'2005-07-11 11:03:28',2,'2006-02-15 21:30:53'),(5728,'2005-07-10 11:26:14',636,335,'2005-07-15 12:55:14',1,'2006-02-15 21:30:53'),(5729,'2005-07-10 11:27:25',4137,188,'2005-07-15 06:13:25',2,'2006-02-15 21:30:53'),(5730,'2005-07-10 11:28:32',1903,301,'2005-07-11 11:45:32',2,'2006-02-15 21:30:53'),(5731,'2005-07-10 11:31:52',2960,440,'2005-07-14 11:44:52',1,'2006-02-15 21:30:53'),(5732,'2005-07-10 11:36:32',2833,597,'2005-07-12 13:09:32',2,'2006-02-15 21:30:53'),(5733,'2005-07-10 11:37:24',3806,415,'2005-07-11 12:34:24',2,'2006-02-15 21:30:53'),(5734,'2005-07-10 11:37:28',399,447,'2005-07-16 11:10:28',1,'2006-02-15 21:30:53'),(5735,'2005-07-10 11:39:15',3259,65,'2005-07-19 09:52:15',1,'2006-02-15 21:30:53'),(5736,'2005-07-10 11:45:48',1172,27,'2005-07-13 16:40:48',1,'2006-02-15 21:30:53'),(5737,'2005-07-10 11:50:04',1118,218,'2005-07-13 10:37:04',1,'2006-02-15 21:30:53'),(5738,'2005-07-10 11:50:51',200,187,'2005-07-19 17:46:51',1,'2006-02-15 21:30:53'),(5739,'2005-07-10 11:51:50',163,219,'2005-07-19 17:40:50',1,'2006-02-15 21:30:53'),(5740,'2005-07-10 11:51:58',2147,325,'2005-07-12 07:53:58',2,'2006-02-15 21:30:53'),(5741,'2005-07-10 11:55:40',2041,513,'2005-07-16 15:02:40',2,'2006-02-15 21:30:53'),(5742,'2005-07-10 11:56:18',3975,596,'2005-07-19 06:59:18',2,'2006-02-15 21:30:53'),(5743,'2005-07-10 11:57:38',593,297,'2005-07-19 15:38:38',2,'2006-02-15 21:30:53'),(5744,'2005-07-10 12:08:33',1372,437,'2005-07-14 12:34:33',2,'2006-02-15 21:30:53'),(5745,'2005-07-10 12:10:11',41,305,'2005-07-19 06:56:11',1,'2006-02-15 21:30:53'),(5746,'2005-07-10 12:15:12',3071,82,'2005-07-16 07:02:12',1,'2006-02-15 21:30:53'),(5747,'2005-07-10 12:15:33',4562,583,'2005-07-18 10:11:33',1,'2006-02-15 21:30:53'),(5748,'2005-07-10 12:19:59',1618,99,'2005-07-12 12:59:59',1,'2006-02-15 21:30:53'),(5749,'2005-07-10 12:20:36',1768,304,'2005-07-19 10:39:36',1,'2006-02-15 21:30:53'),(5750,'2005-07-10 12:20:41',3855,330,'2005-07-17 08:25:41',2,'2006-02-15 21:30:53'),(5751,'2005-07-10 12:25:11',387,479,'2005-07-11 15:23:11',1,'2006-02-15 21:30:53'),(5752,'2005-07-10 12:27:38',4444,86,'2005-07-18 09:22:38',2,'2006-02-15 21:30:53'),(5753,'2005-07-10 12:29:43',3639,444,'2005-07-17 12:50:43',2,'2006-02-15 21:30:53'),(5754,'2005-07-10 12:32:43',162,291,'2005-07-12 13:11:43',2,'2006-02-15 21:30:53'),(5755,'2005-07-10 12:38:56',2760,2,'2005-07-19 17:02:56',1,'2006-02-15 21:30:53'),(5756,'2005-07-10 12:39:28',130,183,'2005-07-11 14:08:28',2,'2006-02-15 21:30:53'),(5757,'2005-07-10 12:40:17',1827,101,'2005-07-12 14:02:17',1,'2006-02-15 21:30:53'),(5758,'2005-07-10 12:42:43',502,363,'2005-07-16 10:18:43',2,'2006-02-15 21:30:53'),(5759,'2005-07-10 12:43:22',816,591,'2005-07-16 16:42:22',1,'2006-02-15 21:30:53'),(5760,'2005-07-10 12:44:48',1050,154,'2005-07-14 12:25:48',1,'2006-02-15 21:30:53'),(5761,'2005-07-10 12:45:36',1763,287,'2005-07-13 10:05:36',2,'2006-02-15 21:30:53'),(5762,'2005-07-10 12:48:01',1815,217,'2005-07-18 16:43:01',1,'2006-02-15 21:30:53'),(5763,'2005-07-10 12:58:12',753,397,'2005-07-14 08:52:12',1,'2006-02-15 21:30:53'),(5764,'2005-07-10 12:58:16',1556,245,'2005-07-19 07:28:16',1,'2006-02-15 21:30:53'),(5765,'2005-07-10 13:03:02',2619,293,'2005-07-16 09:31:02',1,'2006-02-15 21:30:53'),(5766,'2005-07-10 13:07:31',7,406,'2005-07-16 13:03:31',1,'2006-02-15 21:30:53'),(5767,'2005-07-10 13:13:18',2871,32,'2005-07-17 14:41:18',2,'2006-02-15 21:30:53'),(5768,'2005-07-10 13:15:26',345,196,'2005-07-15 09:42:26',1,'2006-02-15 21:30:53'),(5769,'2005-07-10 13:17:58',4052,141,'2005-07-11 11:32:58',1,'2006-02-15 21:30:53'),(5770,'2005-07-10 13:21:28',914,71,'2005-07-11 08:59:28',2,'2006-02-15 21:30:53'),(5771,'2005-07-10 13:26:45',3275,153,'2005-07-14 15:43:45',1,'2006-02-15 21:30:53'),(5772,'2005-07-10 13:27:40',3635,21,'2005-07-17 08:24:40',1,'2006-02-15 21:30:53'),(5773,'2005-07-10 13:31:09',3277,180,'2005-07-15 08:21:09',2,'2006-02-15 21:30:53'),(5774,'2005-07-10 13:31:56',326,113,'2005-07-18 07:32:56',1,'2006-02-15 21:30:53'),(5775,'2005-07-10 13:34:26',2175,325,'2005-07-15 10:01:26',1,'2006-02-15 21:30:53'),(5776,'2005-07-10 13:35:22',3592,568,'2005-07-12 17:58:22',1,'2006-02-15 21:30:53'),(5777,'2005-07-10 13:38:41',3959,40,'2005-07-17 15:48:41',2,'2006-02-15 21:30:53'),(5778,'2005-07-10 13:41:37',4435,324,'2005-07-14 16:26:37',1,'2006-02-15 21:30:53'),(5779,'2005-07-10 13:45:54',3266,244,'2005-07-15 18:13:54',1,'2006-02-15 21:30:53'),(5780,'2005-07-10 13:46:23',168,516,'2005-07-14 17:19:23',2,'2006-02-15 21:30:53'),(5781,'2005-07-10 13:49:30',3191,167,'2005-07-11 12:11:30',2,'2006-02-15 21:30:53'),(5782,'2005-07-10 13:52:56',2514,440,'2005-07-15 09:32:56',2,'2006-02-15 21:30:53'),(5783,'2005-07-10 13:55:33',3331,385,'2005-07-16 12:13:33',1,'2006-02-15 21:30:53'),(5784,'2005-07-10 14:03:28',2323,422,'2005-07-16 16:22:28',1,'2006-02-15 21:30:53'),(5785,'2005-07-10 14:06:03',142,211,'2005-07-17 17:59:03',2,'2006-02-15 21:30:53'),(5786,'2005-07-10 14:06:44',2290,350,'2005-07-14 19:55:44',2,'2006-02-15 21:30:53'),(5787,'2005-07-10 14:08:49',1075,44,'2005-07-19 18:29:49',1,'2006-02-15 21:30:53'),(5788,'2005-07-10 14:10:22',1707,63,'2005-07-14 19:46:22',2,'2006-02-15 21:30:53'),(5789,'2005-07-10 14:11:26',2601,571,'2005-07-18 16:19:26',1,'2006-02-15 21:30:53'),(5790,'2005-07-10 14:15:21',1696,235,'2005-07-14 08:53:21',2,'2006-02-15 21:30:53'),(5791,'2005-07-10 14:16:22',2795,319,'2005-07-19 13:38:22',2,'2006-02-15 21:30:53'),(5792,'2005-07-10 14:22:19',4234,92,'2005-07-19 09:08:19',1,'2006-02-15 21:30:53'),(5793,'2005-07-10 14:33:00',2927,268,'2005-07-13 19:27:00',1,'2006-02-15 21:30:53'),(5794,'2005-07-10 14:34:53',1164,198,'2005-07-17 11:50:53',2,'2006-02-15 21:30:53'),(5795,'2005-07-10 14:36:29',3958,304,'2005-07-14 13:26:29',1,'2006-02-15 21:30:53'),(5796,'2005-07-10 14:42:54',1631,286,'2005-07-17 08:47:54',2,'2006-02-15 21:30:53'),(5797,'2005-07-10 14:43:52',1880,384,'2005-07-13 16:12:52',2,'2006-02-15 21:30:53'),(5798,'2005-07-10 14:45:09',331,107,'2005-07-16 13:43:09',1,'2006-02-15 21:30:53'),(5799,'2005-07-10 14:53:35',3045,520,'2005-07-14 16:18:35',2,'2006-02-15 21:30:53'),(5800,'2005-07-10 14:58:36',2466,411,'2005-07-11 19:50:36',2,'2006-02-15 21:30:53'),(5801,'2005-07-10 14:59:05',3511,439,'2005-07-14 17:55:05',2,'2006-02-15 21:30:53'),(5802,'2005-07-10 15:02:17',2295,520,'2005-07-19 15:43:17',2,'2006-02-15 21:30:53'),(5803,'2005-07-10 15:05:42',1982,244,'2005-07-15 10:19:42',1,'2006-02-15 21:30:53'),(5804,'2005-07-10 15:06:31',2168,137,'2005-07-14 11:00:31',1,'2006-02-15 21:30:53'),(5805,'2005-07-10 15:08:41',3553,532,'2005-07-19 16:35:41',2,'2006-02-15 21:30:53'),(5806,'2005-07-10 15:11:54',29,108,'2005-07-15 11:51:54',2,'2006-02-15 21:30:53'),(5807,'2005-07-10 15:16:30',2092,301,'2005-07-11 14:02:30',2,'2006-02-15 21:30:53'),(5808,'2005-07-10 15:17:33',2310,170,'2005-07-14 12:14:33',2,'2006-02-15 21:30:53'),(5809,'2005-07-10 15:19:30',1748,461,'2005-07-13 12:31:30',2,'2006-02-15 21:30:53'),(5810,'2005-07-10 15:22:04',1426,482,'2005-07-18 21:05:04',2,'2006-02-15 21:30:53'),(5811,'2005-07-10 15:27:04',4007,441,'2005-07-12 17:20:04',1,'2006-02-15 21:30:53'),(5812,'2005-07-10 15:27:56',1681,581,'2005-07-18 15:37:56',2,'2006-02-15 21:30:53'),(5813,'2005-07-10 15:34:37',942,512,'2005-07-17 16:14:37',2,'2006-02-15 21:30:53'),(5814,'2005-07-10 15:46:50',2537,71,'2005-07-13 15:28:50',2,'2006-02-15 21:30:53'),(5815,'2005-07-10 15:48:19',2934,22,'2005-07-13 12:09:19',1,'2006-02-15 21:30:53'),(5816,'2005-07-10 15:48:47',1746,382,'2005-07-13 11:51:47',2,'2006-02-15 21:30:53'),(5817,'2005-07-10 15:49:12',2993,28,'2005-07-18 19:30:12',2,'2006-02-15 21:30:53'),(5818,'2005-07-10 15:51:12',3940,334,'2005-07-14 14:10:12',2,'2006-02-15 21:30:53'),(5819,'2005-07-10 15:56:20',3439,347,'2005-07-12 19:59:20',2,'2006-02-15 21:30:53'),(5820,'2005-07-10 16:04:59',1511,485,'2005-07-16 12:10:59',1,'2006-02-15 21:30:53'),(5821,'2005-07-10 16:07:16',147,302,'2005-07-14 19:48:16',1,'2006-02-15 21:30:53'),(5822,'2005-07-10 16:10:39',1385,38,'2005-07-13 19:05:39',2,'2006-02-15 21:30:53'),(5823,'2005-07-10 16:19:52',1879,483,'2005-07-11 12:33:52',2,'2006-02-15 21:30:53'),(5824,'2005-07-10 16:19:53',1980,449,'2005-07-12 11:17:53',2,'2006-02-15 21:30:53'),(5825,'2005-07-10 16:20:30',3843,444,'2005-07-11 18:58:30',1,'2006-02-15 21:30:53'),(5826,'2005-07-10 16:21:02',4104,254,'2005-07-17 21:08:02',1,'2006-02-15 21:30:53'),(5827,'2005-07-10 16:22:20',1296,290,'2005-07-15 21:13:20',2,'2006-02-15 21:30:53'),(5828,'2005-07-10 16:27:25',2999,156,'2005-07-11 18:42:25',1,'2006-02-15 21:30:53'),(5829,'2005-07-10 16:29:41',3405,118,'2005-07-14 22:03:41',1,'2006-02-15 21:30:53'),(5830,'2005-07-10 16:34:00',2358,59,'2005-07-18 16:42:00',1,'2006-02-15 21:30:53'),(5831,'2005-07-10 16:34:02',830,43,'2005-07-11 14:27:02',2,'2006-02-15 21:30:53'),(5832,'2005-07-10 16:34:48',2387,63,'2005-07-17 17:25:48',1,'2006-02-15 21:30:53'),(5833,'2005-07-10 16:39:24',3829,187,'2005-07-17 12:52:24',1,'2006-02-15 21:30:53'),(5834,'2005-07-10 16:44:12',85,360,'2005-07-14 11:34:12',2,'2006-02-15 21:30:53'),(5835,'2005-07-10 16:44:58',800,11,'2005-07-17 16:03:58',2,'2006-02-15 21:30:53'),(5836,'2005-07-10 16:49:02',1842,310,'2005-07-11 22:35:02',2,'2006-02-15 21:30:53'),(5837,'2005-07-10 16:57:50',1648,478,'2005-07-18 14:07:50',2,'2006-02-15 21:30:53'),(5838,'2005-07-10 17:04:56',1627,202,'2005-07-11 15:15:56',1,'2006-02-15 21:30:53'),(5839,'2005-07-10 17:08:30',252,367,'2005-07-13 21:21:30',2,'2006-02-15 21:30:53'),(5840,'2005-07-10 17:09:09',1073,72,'2005-07-15 22:52:09',1,'2006-02-15 21:30:53'),(5841,'2005-07-10 17:11:31',1230,525,'2005-07-18 15:50:31',2,'2006-02-15 21:30:53'),(5842,'2005-07-10 17:11:37',139,247,'2005-07-14 21:43:37',1,'2006-02-15 21:30:53'),(5843,'2005-07-10 17:14:27',1615,599,'2005-07-15 21:18:27',2,'2006-02-15 21:30:53'),(5844,'2005-07-10 17:14:43',609,147,'2005-07-12 19:27:43',1,'2006-02-15 21:30:53'),(5845,'2005-07-10 17:23:14',2882,334,'2005-07-12 16:29:14',2,'2006-02-15 21:30:53'),(5846,'2005-07-10 17:25:24',938,233,'2005-07-12 13:41:24',2,'2006-02-15 21:30:53'),(5847,'2005-07-10 17:27:42',4403,220,'2005-07-12 14:51:42',2,'2006-02-15 21:30:53'),(5848,'2005-07-10 17:28:14',4549,409,'2005-07-14 11:54:14',1,'2006-02-15 21:30:53'),(5849,'2005-07-10 17:32:33',1632,44,'2005-07-19 22:39:33',1,'2006-02-15 21:30:53'),(5850,'2005-07-10 17:36:27',4015,531,'2005-07-15 16:44:27',2,'2006-02-15 21:30:53'),(5851,'2005-07-10 17:40:47',3944,510,'2005-07-11 19:24:47',2,'2006-02-15 21:30:53'),(5852,'2005-07-10 17:43:30',3890,484,'2005-07-15 15:05:30',2,'2006-02-15 21:30:53'),(5853,'2005-07-10 17:45:13',3026,520,'2005-07-17 21:37:13',1,'2006-02-15 21:30:53'),(5854,'2005-07-10 17:47:34',997,547,'2005-07-13 20:14:34',2,'2006-02-15 21:30:53'),(5855,'2005-07-10 17:54:06',2457,166,'2005-07-18 15:41:06',2,'2006-02-15 21:30:53'),(5856,'2005-07-10 17:57:32',497,314,'2005-07-11 13:57:32',1,'2006-02-15 21:30:53'),(5857,'2005-07-10 17:59:29',1265,29,'2005-07-18 18:13:29',1,'2006-02-15 21:30:53'),(5858,'2005-07-10 18:00:07',2913,257,'2005-07-11 20:01:07',2,'2006-02-15 21:30:53'),(5859,'2005-07-10 18:02:02',131,220,'2005-07-11 23:24:02',1,'2006-02-15 21:30:53'),(5860,'2005-07-10 18:08:49',3897,180,'2005-07-16 16:43:49',2,'2006-02-15 21:30:53'),(5861,'2005-07-10 18:14:22',3881,277,'2005-07-14 15:32:22',1,'2006-02-15 21:30:53'),(5862,'2005-07-10 18:20:48',2075,157,'2005-07-17 00:09:48',1,'2006-02-15 21:30:53'),(5863,'2005-07-10 18:25:23',2557,419,'2005-07-15 23:49:23',1,'2006-02-15 21:30:53'),(5864,'2005-07-10 18:29:57',4380,437,'2005-07-19 14:27:57',2,'2006-02-15 21:30:53'),(5865,'2005-07-10 18:31:05',1382,126,'2005-07-12 18:29:05',2,'2006-02-15 21:30:53'),(5866,'2005-07-10 18:35:14',457,484,'2005-07-19 19:41:14',2,'2006-02-15 21:30:53'),(5867,'2005-07-10 18:39:01',730,321,'2005-07-19 21:56:01',2,'2006-02-15 21:30:53'),(5868,'2005-07-10 18:39:16',452,429,'2005-07-15 21:19:16',1,'2006-02-15 21:30:53'),(5869,'2005-07-10 18:40:09',2157,40,'2005-07-17 18:42:09',1,'2006-02-15 21:30:53'),(5870,'2005-07-10 18:40:25',1524,438,'2005-07-12 15:39:25',2,'2006-02-15 21:30:53'),(5871,'2005-07-10 18:46:08',3288,307,'2005-07-16 17:32:08',1,'2006-02-15 21:30:53'),(5872,'2005-07-10 18:54:05',270,364,'2005-07-19 15:41:05',1,'2006-02-15 21:30:53'),(5873,'2005-07-10 19:02:10',3151,354,'2005-07-14 19:13:10',2,'2006-02-15 21:30:53'),(5874,'2005-07-10 19:02:51',2255,131,'2005-07-16 13:14:51',1,'2006-02-15 21:30:53'),(5875,'2005-07-10 19:06:47',964,575,'2005-07-18 17:33:47',2,'2006-02-15 21:30:53'),(5876,'2005-07-10 19:07:15',4445,578,'2005-07-14 17:29:15',2,'2006-02-15 21:30:53'),(5877,'2005-07-10 19:08:51',1520,537,'2005-07-19 19:48:51',1,'2006-02-15 21:30:53'),(5878,'2005-07-10 19:09:57',3805,271,'2005-07-16 17:22:57',1,'2006-02-15 21:30:53'),(5879,'2005-07-10 19:12:47',3851,430,'2005-07-16 16:32:47',1,'2006-02-15 21:30:53'),(5880,'2005-07-10 19:14:58',359,482,'2005-07-17 01:13:58',1,'2006-02-15 21:30:53'),(5881,'2005-07-10 19:19:43',236,25,'2005-07-12 20:11:43',1,'2006-02-15 21:30:53'),(5882,'2005-07-10 19:20:34',2830,319,'2005-07-11 18:39:34',2,'2006-02-15 21:30:53'),(5883,'2005-07-10 19:25:21',2820,17,'2005-07-16 20:50:21',2,'2006-02-15 21:30:53'),(5884,'2005-07-10 19:31:38',916,498,'2005-07-11 20:30:38',1,'2006-02-15 21:30:53'),(5885,'2005-07-10 19:33:50',3129,331,'2005-07-17 00:26:50',2,'2006-02-15 21:30:53'),(5886,'2005-07-10 19:36:25',907,215,'2005-07-11 22:24:25',2,'2006-02-15 21:30:53'),(5887,'2005-07-10 19:45:47',2602,532,'2005-07-15 22:15:47',1,'2006-02-15 21:30:53'),(5888,'2005-07-10 19:52:17',1620,268,'2005-07-18 20:32:17',2,'2006-02-15 21:30:53'),(5889,'2005-07-10 19:54:41',1706,491,'2005-07-12 20:08:41',2,'2006-02-15 21:30:53'),(5890,'2005-07-10 20:00:25',1463,535,'2005-07-18 17:57:25',2,'2006-02-15 21:30:53'),(5891,'2005-07-10 20:01:17',4355,184,'2005-07-12 00:15:17',1,'2006-02-15 21:30:53'),(5892,'2005-07-10 20:02:42',4322,333,'2005-07-11 20:02:42',1,'2006-02-15 21:30:53'),(5893,'2005-07-10 20:05:30',1689,439,'2005-07-14 23:05:30',1,'2006-02-15 21:30:53'),(5894,'2005-07-10 20:09:34',2264,194,'2005-07-17 15:39:34',1,'2006-02-15 21:30:53'),(5895,'2005-07-10 20:13:19',2272,164,'2005-07-17 17:51:19',1,'2006-02-15 21:30:53'),(5896,'2005-07-10 20:15:56',731,357,'2005-07-12 00:39:56',1,'2006-02-15 21:30:53'),(5897,'2005-07-10 20:16:14',740,413,'2005-07-19 15:49:14',2,'2006-02-15 21:30:53'),(5898,'2005-07-10 20:18:09',3257,538,'2005-07-16 14:44:09',1,'2006-02-15 21:30:53'),(5899,'2005-07-10 20:21:52',1391,388,'2005-07-13 00:46:52',1,'2006-02-15 21:30:53'),(5900,'2005-07-10 20:21:54',1081,419,'2005-07-17 00:26:54',1,'2006-02-15 21:30:53'),(5901,'2005-07-10 20:22:12',86,165,'2005-07-19 16:43:12',2,'2006-02-15 21:30:53'),(5902,'2005-07-10 20:31:24',2727,228,'2005-07-11 20:50:24',1,'2006-02-15 21:30:53'),(5903,'2005-07-10 20:39:04',1388,573,'2005-07-11 17:41:04',1,'2006-02-15 21:30:53'),(5904,'2005-07-10 20:39:44',350,531,'2005-07-13 17:57:44',2,'2006-02-15 21:30:53'),(5905,'2005-07-10 20:41:09',3891,10,'2005-07-19 14:49:09',1,'2006-02-15 21:30:53'),(5906,'2005-07-10 20:41:41',514,323,'2005-07-14 00:12:41',2,'2006-02-15 21:30:53'),(5907,'2005-07-10 20:41:41',4432,168,'2005-07-15 21:18:41',2,'2006-02-15 21:30:53'),(5908,'2005-07-10 20:44:14',810,156,'2005-07-13 15:05:14',2,'2006-02-15 21:30:53'),(5909,'2005-07-10 20:46:13',2333,44,'2005-07-14 18:01:13',2,'2006-02-15 21:30:53'),(5910,'2005-07-10 20:51:34',1039,464,'2005-07-19 14:54:34',1,'2006-02-15 21:30:53'),(5911,'2005-07-10 20:51:42',4140,420,'2005-07-14 21:58:42',2,'2006-02-15 21:30:53'),(5912,'2005-07-10 20:58:22',1187,351,'2005-07-17 01:15:22',2,'2006-02-15 21:30:53'),(5913,'2005-07-10 20:58:55',2767,277,'2005-07-13 15:18:55',1,'2006-02-15 21:30:53'),(5914,'2005-07-10 21:01:12',2639,372,'2005-07-16 18:27:12',2,'2006-02-15 21:30:53'),(5915,'2005-07-10 21:12:16',2464,66,'2005-07-15 16:59:16',2,'2006-02-15 21:30:53'),(5916,'2005-07-10 21:26:31',2267,35,'2005-07-19 20:23:31',1,'2006-02-15 21:30:53'),(5917,'2005-07-10 21:30:22',2910,74,'2005-07-12 18:54:22',2,'2006-02-15 21:30:53'),(5918,'2005-07-10 21:32:06',120,34,'2005-07-19 21:35:06',1,'2006-02-15 21:30:53'),(5919,'2005-07-10 21:32:14',164,92,'2005-07-12 16:47:14',1,'2006-02-15 21:30:53'),(5920,'2005-07-10 21:33:58',1893,221,'2005-07-17 19:41:58',2,'2006-02-15 21:30:53'),(5921,'2005-07-10 21:35:12',3920,7,'2005-07-18 19:59:12',1,'2006-02-15 21:30:53'),(5922,'2005-07-10 21:36:53',1392,271,'2005-07-16 02:51:53',1,'2006-02-15 21:30:53'),(5923,'2005-07-10 21:40:06',1817,401,'2005-07-13 00:01:06',1,'2006-02-15 21:30:53'),(5924,'2005-07-10 21:41:23',629,191,'2005-07-16 21:33:23',1,'2006-02-15 21:30:53'),(5925,'2005-07-10 21:41:27',3724,503,'2005-07-18 18:35:27',2,'2006-02-15 21:30:53'),(5926,'2005-07-10 21:53:42',2840,282,'2005-07-20 01:04:42',1,'2006-02-15 21:30:53'),(5927,'2005-07-10 21:57:14',807,70,'2005-07-16 19:32:14',1,'2006-02-15 21:30:53'),(5928,'2005-07-10 21:58:30',4132,50,'2005-07-15 19:41:30',1,'2006-02-15 21:30:53'),(5929,'2005-07-10 21:59:29',4303,54,'2005-07-14 20:20:29',2,'2006-02-15 21:30:53'),(5930,'2005-07-10 21:59:32',2338,254,'2005-07-11 18:40:32',2,'2006-02-15 21:30:53'),(5931,'2005-07-10 22:04:19',2259,341,'2005-07-13 00:45:19',2,'2006-02-15 21:30:53'),(5932,'2005-07-10 22:05:15',2269,523,'2005-07-12 17:04:15',2,'2006-02-15 21:30:53'),(5933,'2005-07-10 22:06:48',4372,419,'2005-07-12 23:58:48',2,'2006-02-15 21:30:53'),(5934,'2005-07-10 22:07:59',3825,576,'2005-07-15 21:07:59',2,'2006-02-15 21:30:53'),(5935,'2005-07-10 22:11:04',3371,258,'2005-07-19 18:12:04',2,'2006-02-15 21:30:53'),(5936,'2005-07-10 22:14:30',1951,522,'2005-07-15 01:32:30',1,'2006-02-15 21:30:53'),(5937,'2005-07-10 22:16:08',1579,580,'2005-07-16 03:08:08',2,'2006-02-15 21:30:53'),(5938,'2005-07-10 22:17:42',2834,236,'2005-07-16 22:38:42',2,'2006-02-15 21:30:53'),(5939,'2005-07-10 22:30:05',4491,207,'2005-07-14 00:02:05',2,'2006-02-15 21:30:53'),(5940,'2005-07-10 22:31:01',3295,292,'2005-07-14 00:52:01',1,'2006-02-15 21:30:53'),(5941,'2005-07-10 22:40:47',492,43,'2005-07-17 00:19:47',2,'2006-02-15 21:30:53'),(5942,'2005-07-10 22:47:17',2861,317,'2005-07-17 01:54:17',2,'2006-02-15 21:30:53'),(5943,'2005-07-10 22:48:13',3019,255,'2005-07-16 01:33:13',1,'2006-02-15 21:30:53'),(5944,'2005-07-10 22:51:44',3904,432,'2005-07-18 17:54:44',2,'2006-02-15 21:30:53'),(5945,'2005-07-10 22:52:42',427,374,'2005-07-11 21:52:42',1,'2006-02-15 21:30:53'),(5946,'2005-07-10 22:57:29',1629,308,'2005-07-12 00:08:29',1,'2006-02-15 21:30:53'),(5947,'2005-07-10 23:07:42',327,331,'2005-07-18 23:13:42',1,'2006-02-15 21:30:53'),(5948,'2005-07-10 23:12:08',3260,57,'2005-07-18 19:06:08',2,'2006-02-15 21:30:53'),(5949,'2005-07-10 23:13:00',4397,496,'2005-07-14 01:10:00',2,'2006-02-15 21:30:53'),(5950,'2005-07-10 23:13:45',4319,585,'2005-07-13 02:35:45',1,'2006-02-15 21:30:53'),(5951,'2005-07-10 23:14:29',2501,589,'2005-07-13 01:01:29',1,'2006-02-15 21:30:53'),(5952,'2005-07-10 23:18:20',3406,595,'2005-07-16 17:42:20',1,'2006-02-15 21:30:53'),(5953,'2005-07-10 23:21:35',992,386,'2005-07-14 20:48:35',2,'2006-02-15 21:30:53'),(5954,'2005-07-10 23:22:01',2627,32,'2005-07-14 04:42:01',2,'2006-02-15 21:30:53'),(5955,'2005-07-10 23:22:10',834,409,'2005-07-17 17:55:10',2,'2006-02-15 21:30:53'),(5956,'2005-07-10 23:23:08',2536,499,'2005-07-13 17:36:08',1,'2006-02-15 21:30:53'),(5957,'2005-07-10 23:24:02',2517,210,'2005-07-12 20:28:02',1,'2006-02-15 21:30:53'),(5958,'2005-07-10 23:31:51',3468,430,'2005-07-19 00:36:51',2,'2006-02-15 21:30:53'),(5959,'2005-07-10 23:35:36',3169,436,'2005-07-13 02:19:36',1,'2006-02-15 21:30:53'),(5960,'2005-07-10 23:38:34',3884,239,'2005-07-11 19:21:34',1,'2006-02-15 21:30:53'),(5961,'2005-07-10 23:43:23',3537,21,'2005-07-15 05:21:23',2,'2006-02-15 21:30:53'),(5962,'2005-07-10 23:45:22',1292,507,'2005-07-13 03:49:22',2,'2006-02-15 21:30:53'),(5963,'2005-07-10 23:47:08',4434,35,'2005-07-12 04:27:08',1,'2006-02-15 21:30:53'),(5964,'2005-07-10 23:47:18',3981,456,'2005-07-12 03:55:18',2,'2006-02-15 21:30:53'),(5965,'2005-07-10 23:51:52',4476,348,'2005-07-11 23:29:52',1,'2006-02-15 21:30:53'),(5966,'2005-07-10 23:59:27',2076,384,'2005-07-14 23:38:27',2,'2006-02-15 21:30:53'),(5967,'2005-07-11 00:02:19',2125,215,'2005-07-18 23:08:19',1,'2006-02-15 21:30:53'),(5968,'2005-07-11 00:03:11',3273,554,'2005-07-19 18:46:11',1,'2006-02-15 21:30:53'),(5969,'2005-07-11 00:03:22',4177,433,'2005-07-18 01:28:22',2,'2006-02-15 21:30:53'),(5970,'2005-07-11 00:04:50',1514,94,'2005-07-19 03:36:50',1,'2006-02-15 21:30:53'),(5971,'2005-07-11 00:05:58',2191,84,'2005-07-19 04:50:58',2,'2006-02-15 21:30:53'),(5972,'2005-07-11 00:08:54',4577,30,'2005-07-17 21:01:54',1,'2006-02-15 21:30:53'),(5973,'2005-07-11 00:09:17',1194,165,'2005-07-14 19:18:17',1,'2006-02-15 21:30:53'),(5974,'2005-07-11 00:10:37',3984,517,'2005-07-18 18:48:37',2,'2006-02-15 21:30:53'),(5975,'2005-07-11 00:14:19',2997,15,'2005-07-16 04:21:19',1,'2006-02-15 21:30:53'),(5976,'2005-07-11 00:16:35',1693,505,'2005-07-20 01:30:35',2,'2006-02-15 21:30:53'),(5977,'2005-07-11 00:16:38',4011,484,'2005-07-19 21:00:38',1,'2006-02-15 21:30:53'),(5978,'2005-07-11 00:16:54',1720,508,'2005-07-19 18:55:54',1,'2006-02-15 21:30:53'),(5979,'2005-07-11 00:17:09',1736,251,'2005-07-14 00:38:09',1,'2006-02-15 21:30:53'),(5980,'2005-07-11 00:18:21',1777,309,'2005-07-14 21:26:21',1,'2006-02-15 21:30:53'),(5981,'2005-07-11 00:19:04',2151,241,'2005-07-13 19:10:04',1,'2006-02-15 21:30:53'),(5982,'2005-07-11 00:24:44',2329,403,'2005-07-14 04:42:44',2,'2006-02-15 21:30:53'),(5983,'2005-07-11 00:34:11',351,127,'2005-07-15 05:37:11',1,'2006-02-15 21:30:53'),(5984,'2005-07-11 00:44:36',2801,178,'2005-07-15 00:04:36',1,'2006-02-15 21:30:53'),(5985,'2005-07-11 00:51:58',1108,506,'2005-07-14 22:02:58',2,'2006-02-15 21:30:53'),(5986,'2005-07-11 00:54:56',1624,171,'2005-07-13 22:52:56',2,'2006-02-15 21:30:53'),(5987,'2005-07-11 00:55:31',1000,447,'2005-07-16 06:28:31',2,'2006-02-15 21:30:53'),(5988,'2005-07-11 00:55:38',151,158,'2005-07-13 21:36:38',2,'2006-02-15 21:30:53'),(5989,'2005-07-11 00:57:53',696,283,'2005-07-15 02:24:53',1,'2006-02-15 21:30:53'),(5990,'2005-07-11 01:03:14',1561,432,'2005-07-15 19:32:14',1,'2006-02-15 21:30:53'),(5991,'2005-07-11 01:03:38',3623,590,'2005-07-12 22:32:38',2,'2006-02-15 21:30:53'),(5992,'2005-07-11 01:06:21',4216,54,'2005-07-13 19:15:21',2,'2006-02-15 21:30:53'),(5993,'2005-07-11 01:06:41',3588,529,'2005-07-14 19:19:41',1,'2006-02-15 21:30:53'),(5994,'2005-07-11 01:14:10',4287,295,'2005-07-12 00:42:10',2,'2006-02-15 21:30:53'),(5995,'2005-07-11 01:15:39',4357,360,'2005-07-20 05:01:39',2,'2006-02-15 21:30:53'),(5996,'2005-07-11 01:18:33',4263,223,'2005-07-17 04:18:33',1,'2006-02-15 21:30:53'),(5997,'2005-07-11 01:19:50',3542,128,'2005-07-16 06:29:50',1,'2006-02-15 21:30:53'),(5998,'2005-07-11 01:20:46',1458,250,'2005-07-15 21:41:46',1,'2006-02-15 21:30:53'),(5999,'2005-07-11 01:21:22',211,450,'2005-07-19 01:35:22',1,'2006-02-15 21:30:53'),(6000,'2005-07-11 01:23:06',1986,371,'2005-07-12 04:39:06',2,'2006-02-15 21:30:53'),(6001,'2005-07-11 01:24:44',1779,45,'2005-07-11 22:55:44',1,'2006-02-15 21:30:53'),(6002,'2005-07-11 01:27:49',4422,45,'2005-07-12 06:02:49',1,'2006-02-15 21:30:53'),(6003,'2005-07-11 01:28:33',296,527,'2005-07-17 21:24:33',1,'2006-02-15 21:30:53'),(6004,'2005-07-11 01:34:25',1756,204,'2005-07-18 00:48:25',2,'2006-02-15 21:30:53'),(6005,'2005-07-11 01:36:42',809,78,'2005-07-14 04:47:42',2,'2006-02-15 21:30:53'),(6006,'2005-07-11 01:38:42',4201,399,'2005-07-17 05:18:42',2,'2006-02-15 21:30:53'),(6007,'2005-07-11 01:43:06',4393,289,'2005-07-17 04:46:06',1,'2006-02-15 21:30:53'),(6008,'2005-07-11 01:51:29',1227,216,'2005-07-18 01:39:29',1,'2006-02-15 21:30:53'),(6009,'2005-07-11 01:51:58',494,470,'2005-07-18 07:12:58',2,'2006-02-15 21:30:53'),(6010,'2005-07-11 01:52:28',771,285,'2005-07-13 03:13:28',1,'2006-02-15 21:30:53'),(6011,'2005-07-11 01:54:48',3899,527,'2005-07-18 07:17:48',2,'2006-02-15 21:30:53'),(6012,'2005-07-11 02:00:12',2609,258,'2005-07-17 02:49:12',2,'2006-02-15 21:30:53'),(6013,'2005-07-11 02:02:03',3774,543,'2005-07-14 02:07:03',1,'2006-02-15 21:30:53'),(6014,'2005-07-11 02:02:55',3748,397,'2005-07-12 23:49:55',1,'2006-02-15 21:30:53'),(6015,'2005-07-11 02:04:12',295,596,'2005-07-13 02:43:12',2,'2006-02-15 21:30:53'),(6016,'2005-07-11 02:04:45',651,296,'2005-07-17 22:22:45',1,'2006-02-15 21:30:53'),(6017,'2005-07-11 02:05:32',4088,596,'2005-07-14 22:50:32',1,'2006-02-15 21:30:53'),(6018,'2005-07-11 02:06:36',4555,500,'2005-07-12 02:16:36',2,'2006-02-15 21:30:53'),(6019,'2005-07-11 02:08:29',3483,9,'2005-07-13 02:19:29',2,'2006-02-15 21:30:53'),(6020,'2005-07-11 02:08:55',1974,71,'2005-07-16 22:07:55',1,'2006-02-15 21:30:53'),(6021,'2005-07-11 02:10:18',3949,173,'2005-07-13 05:19:18',1,'2006-02-15 21:30:53'),(6022,'2005-07-11 02:15:53',2435,469,'2005-07-13 03:40:53',2,'2006-02-15 21:30:53'),(6023,'2005-07-11 02:15:57',3794,456,'2005-07-15 21:30:57',2,'2006-02-15 21:30:53'),(6024,'2005-07-11 02:16:47',2923,271,'2005-07-12 05:54:47',1,'2006-02-15 21:30:53'),(6025,'2005-07-11 02:18:13',3306,113,'2005-07-11 23:30:13',1,'2006-02-15 21:30:53'),(6026,'2005-07-11 02:21:43',3936,409,'2005-07-13 03:49:43',1,'2006-02-15 21:30:53'),(6027,'2005-07-11 02:26:29',4536,513,'2005-07-18 23:05:29',1,'2006-02-15 21:30:53'),(6028,'2005-07-11 02:31:44',784,450,'2005-07-14 03:18:44',1,'2006-02-15 21:30:53'),(6029,'2005-07-11 02:36:46',2030,520,'2005-07-14 20:51:46',2,'2006-02-15 21:30:53'),(6030,'2005-07-11 02:37:51',95,36,'2005-07-16 22:34:51',2,'2006-02-15 21:30:53'),(6031,'2005-07-11 02:42:14',1530,224,'2005-07-14 03:24:14',2,'2006-02-15 21:30:53'),(6032,'2005-07-11 02:49:01',3792,28,'2005-07-18 05:05:01',2,'2006-02-15 21:30:53'),(6033,'2005-07-11 02:59:34',2819,322,'2005-07-16 03:48:34',2,'2006-02-15 21:30:53'),(6034,'2005-07-11 03:00:50',1735,324,'2005-07-16 06:19:50',1,'2006-02-15 21:30:53'),(6035,'2005-07-11 03:01:45',3474,176,'2005-07-14 01:04:45',2,'2006-02-15 21:30:53'),(6036,'2005-07-11 03:02:28',2553,297,'2005-07-15 22:12:28',2,'2006-02-15 21:30:53'),(6037,'2005-07-11 03:06:54',1886,386,'2005-07-12 22:46:54',2,'2006-02-15 21:30:53'),(6038,'2005-07-11 03:10:37',1555,243,'2005-07-19 05:14:37',2,'2006-02-15 21:30:53'),(6039,'2005-07-11 03:12:19',1776,137,'2005-07-19 05:46:19',1,'2006-02-15 21:30:53'),(6040,'2005-07-11 03:14:26',2161,511,'2005-07-14 01:12:26',2,'2006-02-15 21:30:53'),(6041,'2005-07-11 03:14:58',2815,551,'2005-07-13 00:48:58',2,'2006-02-15 21:30:53'),(6042,'2005-07-11 03:17:04',2153,5,'2005-07-19 07:08:04',1,'2006-02-15 21:30:53'),(6043,'2005-07-11 03:18:10',3303,430,'2005-07-12 05:50:10',1,'2006-02-15 21:30:53'),(6044,'2005-07-11 03:18:39',1270,481,'2005-07-13 06:58:39',2,'2006-02-15 21:30:53'),(6045,'2005-07-11 03:21:05',2003,39,'2005-07-17 23:10:05',1,'2006-02-15 21:30:53'),(6046,'2005-07-11 03:21:49',1935,569,'2005-07-19 23:58:49',1,'2006-02-15 21:30:53'),(6047,'2005-07-11 03:27:01',4147,235,'2005-07-16 06:42:01',2,'2006-02-15 21:30:53'),(6048,'2005-07-11 03:32:23',975,154,'2005-07-14 07:39:23',1,'2006-02-15 21:30:53'),(6049,'2005-07-11 03:32:32',2582,236,'2005-07-15 06:57:32',2,'2006-02-15 21:30:53'),(6050,'2005-07-11 03:34:29',825,527,'2005-07-15 02:55:29',1,'2006-02-15 21:30:53'),(6051,'2005-07-11 03:46:41',2675,435,'2005-07-11 22:36:41',2,'2006-02-15 21:30:53'),(6052,'2005-07-11 03:51:27',881,75,'2005-07-16 02:55:27',2,'2006-02-15 21:30:53'),(6053,'2005-07-11 03:51:59',2836,237,'2005-07-19 09:13:59',2,'2006-02-15 21:30:53'),(6054,'2005-07-11 03:58:39',1176,354,'2005-07-13 23:08:39',1,'2006-02-15 21:30:53'),(6055,'2005-07-11 03:59:08',595,125,'2005-07-18 05:35:08',2,'2006-02-15 21:30:53'),(6056,'2005-07-11 04:01:27',3069,145,'2005-07-12 04:14:27',1,'2006-02-15 21:30:53'),(6057,'2005-07-11 04:03:40',1340,187,'2005-07-17 01:34:40',2,'2006-02-15 21:30:53'),(6058,'2005-07-11 04:03:51',3761,498,'2005-07-14 03:52:51',1,'2006-02-15 21:30:53'),(6059,'2005-07-11 04:03:54',1437,394,'2005-07-18 01:35:54',1,'2006-02-15 21:30:53'),(6060,'2005-07-11 04:06:17',3146,342,'2005-07-12 03:05:17',1,'2006-02-15 21:30:53'),(6061,'2005-07-11 04:06:25',1859,392,'2005-07-11 23:11:25',1,'2006-02-15 21:30:53'),(6062,'2005-07-11 04:11:58',3301,408,'2005-07-15 05:00:58',1,'2006-02-15 21:30:53'),(6063,'2005-07-11 04:16:51',1715,519,'2005-07-13 08:35:51',2,'2006-02-15 21:30:53'),(6064,'2005-07-11 04:23:18',265,297,'2005-07-19 02:21:18',1,'2006-02-15 21:30:53'),(6065,'2005-07-11 04:25:51',1007,562,'2005-07-17 08:19:51',1,'2006-02-15 21:30:53'),(6066,'2005-07-11 04:32:42',1877,155,'2005-07-15 03:56:42',2,'2006-02-15 21:30:53'),(6067,'2005-07-11 04:34:49',2097,186,'2005-07-16 09:33:49',1,'2006-02-15 21:30:53'),(6068,'2005-07-11 04:41:09',2331,265,'2005-07-14 04:45:09',1,'2006-02-15 21:30:53'),(6069,'2005-07-11 04:44:59',256,553,'2005-07-13 01:00:59',1,'2006-02-15 21:30:53'),(6070,'2005-07-11 04:47:42',1679,267,'2005-07-13 01:49:42',2,'2006-02-15 21:30:53'),(6071,'2005-07-11 04:50:03',889,179,'2005-07-19 23:52:03',1,'2006-02-15 21:30:53'),(6072,'2005-07-11 04:52:40',1790,339,'2005-07-18 01:02:40',1,'2006-02-15 21:30:53'),(6073,'2005-07-11 04:54:31',4243,466,'2005-07-20 07:23:31',1,'2006-02-15 21:30:53'),(6074,'2005-07-11 04:59:56',2876,259,'2005-07-13 23:31:56',1,'2006-02-15 21:30:53'),(6075,'2005-07-11 05:03:03',2160,283,'2005-07-12 01:28:03',1,'2006-02-15 21:30:53'),(6076,'2005-07-11 05:05:30',1792,143,'2005-07-18 04:22:30',1,'2006-02-15 21:30:53'),(6077,'2005-07-11 05:06:08',2154,542,'2005-07-16 10:29:08',1,'2006-02-15 21:30:53'),(6078,'2005-07-11 05:06:52',3985,91,'2005-07-17 06:13:52',2,'2006-02-15 21:30:53'),(6079,'2005-07-11 05:07:14',1494,119,'2005-07-17 08:45:14',1,'2006-02-15 21:30:53'),(6080,'2005-07-11 05:08:11',2682,115,'2005-07-16 09:54:11',2,'2006-02-15 21:30:53'),(6081,'2005-07-11 05:11:09',2286,72,'2005-07-13 05:33:09',2,'2006-02-15 21:30:53'),(6082,'2005-07-11 05:12:41',1091,82,'2005-07-16 03:40:41',2,'2006-02-15 21:30:53'),(6083,'2005-07-11 05:12:49',3183,285,'2005-07-15 00:46:49',2,'2006-02-15 21:30:53'),(6084,'2005-07-11 05:16:20',1334,479,'2005-07-19 01:38:20',2,'2006-02-15 21:30:53'),(6085,'2005-07-11 05:24:36',312,155,'2005-07-16 03:49:36',2,'2006-02-15 21:30:53'),(6086,'2005-07-11 05:29:03',1505,420,'2005-07-16 01:17:03',1,'2006-02-15 21:30:53'),(6087,'2005-07-11 05:29:22',198,155,'2005-07-12 23:33:22',2,'2006-02-15 21:30:53'),(6088,'2005-07-11 05:40:35',3796,498,'2005-07-17 07:14:35',2,'2006-02-15 21:30:53'),(6089,'2005-07-11 05:45:59',3298,580,'2005-07-17 11:04:59',2,'2006-02-15 21:30:53'),(6090,'2005-07-11 05:47:08',71,241,'2005-07-20 07:52:08',2,'2006-02-15 21:30:53'),(6091,'2005-07-11 05:49:18',580,383,'2005-07-15 07:26:18',1,'2006-02-15 21:30:53'),(6092,'2005-07-11 05:51:31',2129,75,'2005-07-17 03:42:31',1,'2006-02-15 21:30:53'),(6093,'2005-07-11 05:52:50',1868,117,'2005-07-20 11:45:50',1,'2006-02-15 21:30:53'),(6094,'2005-07-11 05:54:42',2684,285,'2005-07-18 08:19:42',2,'2006-02-15 21:30:53'),(6095,'2005-07-11 06:06:41',727,501,'2005-07-19 06:14:41',1,'2006-02-15 21:30:53'),(6096,'2005-07-11 06:18:04',2720,420,'2005-07-14 01:15:04',1,'2006-02-15 21:30:53'),(6097,'2005-07-11 06:21:43',297,416,'2005-07-16 10:04:43',1,'2006-02-15 21:30:53'),(6098,'2005-07-11 06:23:28',3016,525,'2005-07-17 04:05:28',1,'2006-02-15 21:30:53'),(6099,'2005-07-11 06:24:44',3865,469,'2005-07-15 08:03:44',2,'2006-02-15 21:30:53'),(6100,'2005-07-11 06:40:31',3485,16,'2005-07-14 10:59:31',2,'2006-02-15 21:30:53'),(6101,'2005-07-11 06:50:33',2618,508,'2005-07-18 01:52:33',2,'2006-02-15 21:30:53'),(6102,'2005-07-11 06:53:09',4305,146,'2005-07-17 07:05:09',1,'2006-02-15 21:30:53'),(6103,'2005-07-11 06:59:55',262,540,'2005-07-16 09:30:55',1,'2006-02-15 21:30:53'),(6104,'2005-07-11 07:01:35',3531,389,'2005-07-17 02:29:35',1,'2006-02-15 21:30:53'),(6105,'2005-07-11 07:03:19',3501,595,'2005-07-19 06:46:19',1,'2006-02-15 21:30:53'),(6106,'2005-07-11 07:05:06',2714,185,'2005-07-20 09:27:06',1,'2006-02-15 21:30:53'),(6107,'2005-07-11 07:07:09',3798,304,'2005-07-14 07:32:09',2,'2006-02-15 21:30:53'),(6108,'2005-07-11 07:19:24',4296,572,'2005-07-13 12:38:24',2,'2006-02-15 21:30:53'),(6109,'2005-07-11 07:20:57',3603,163,'2005-07-13 07:29:57',2,'2006-02-15 21:30:53'),(6110,'2005-07-11 07:23:47',541,405,'2005-07-20 03:17:47',2,'2006-02-15 21:30:53'),(6111,'2005-07-11 07:26:57',3504,300,'2005-07-13 10:43:57',2,'2006-02-15 21:30:53'),(6112,'2005-07-11 07:28:05',1311,366,'2005-07-18 07:29:05',1,'2006-02-15 21:30:53'),(6113,'2005-07-11 07:31:08',4437,115,'2005-07-20 11:01:08',2,'2006-02-15 21:30:53'),(6114,'2005-07-11 07:33:48',479,404,'2005-07-18 06:13:48',2,'2006-02-15 21:30:53'),(6115,'2005-07-11 07:36:50',3415,27,'2005-07-13 11:30:50',1,'2006-02-15 21:30:53'),(6116,'2005-07-11 07:37:38',247,381,'2005-07-14 11:53:38',2,'2006-02-15 21:30:53'),(6117,'2005-07-11 07:39:38',2613,135,'2005-07-18 12:07:38',2,'2006-02-15 21:30:53'),(6118,'2005-07-11 07:43:08',3013,13,'2005-07-20 03:17:08',1,'2006-02-15 21:30:53'),(6119,'2005-07-11 07:44:46',4281,472,'2005-07-20 04:41:46',2,'2006-02-15 21:30:53'),(6120,'2005-07-11 07:49:53',3299,268,'2005-07-19 04:56:53',2,'2006-02-15 21:30:53'),(6121,'2005-07-11 07:55:27',1613,347,'2005-07-16 03:43:27',2,'2006-02-15 21:30:53'),(6122,'2005-07-11 07:58:07',2212,32,'2005-07-16 09:52:07',1,'2006-02-15 21:30:53'),(6123,'2005-07-11 08:02:27',1354,200,'2005-07-15 08:58:27',2,'2006-02-15 21:30:53'),(6124,'2005-07-11 08:02:32',2022,368,'2005-07-12 05:58:32',2,'2006-02-15 21:30:53'),(6125,'2005-07-11 08:03:35',2439,307,'2005-07-18 12:46:35',1,'2006-02-15 21:30:53'),(6126,'2005-07-11 08:06:56',1069,230,'2005-07-16 11:42:56',1,'2006-02-15 21:30:53'),(6127,'2005-07-11 08:06:59',285,355,'2005-07-12 09:01:59',1,'2006-02-15 21:30:53'),(6128,'2005-07-11 08:15:08',2050,18,'2005-07-13 03:36:08',1,'2006-02-15 21:30:53'),(6129,'2005-07-11 08:15:09',3875,222,'2005-07-18 13:00:09',1,'2006-02-15 21:30:53'),(6130,'2005-07-11 08:19:56',2547,538,'2005-07-16 12:02:56',2,'2006-02-15 21:30:53'),(6131,'2005-07-11 08:22:05',3313,107,'2005-07-14 07:40:05',1,'2006-02-15 21:30:53'),(6132,'2005-07-11 08:24:44',3229,319,'2005-07-13 06:41:44',1,'2006-02-15 21:30:53'),(6133,'2005-07-11 08:25:22',1992,107,'2005-07-13 13:17:22',1,'2006-02-15 21:30:53'),(6134,'2005-07-11 08:28:19',3225,305,'2005-07-18 09:20:19',2,'2006-02-15 21:30:53'),(6135,'2005-07-11 08:32:23',833,325,'2005-07-17 08:43:23',1,'2006-02-15 21:30:53'),(6136,'2005-07-11 08:34:09',205,346,'2005-07-14 06:11:09',1,'2006-02-15 21:30:53'),(6137,'2005-07-11 08:34:20',2029,67,'2005-07-13 03:31:20',2,'2006-02-15 21:30:53'),(6138,'2005-07-11 08:36:04',1808,438,'2005-07-13 10:30:04',2,'2006-02-15 21:30:53'),(6139,'2005-07-11 08:39:33',3065,206,'2005-07-17 08:00:33',2,'2006-02-15 21:30:53'),(6140,'2005-07-11 08:40:47',2749,363,'2005-07-14 07:26:47',1,'2006-02-15 21:30:53'),(6141,'2005-07-11 08:52:16',2279,228,'2005-07-17 03:00:16',1,'2006-02-15 21:30:53'),(6142,'2005-07-11 08:54:09',1722,136,'2005-07-18 05:23:09',2,'2006-02-15 21:30:53'),(6143,'2005-07-11 09:02:37',1030,169,'2005-07-19 05:57:37',2,'2006-02-15 21:30:53'),(6144,'2005-07-11 09:02:53',1077,554,'2005-07-15 10:58:53',2,'2006-02-15 21:30:53'),(6145,'2005-07-11 09:07:01',1359,540,'2005-07-19 08:21:01',1,'2006-02-15 21:30:53'),(6146,'2005-07-11 09:09:59',3374,11,'2005-07-20 11:42:59',2,'2006-02-15 21:30:53'),(6147,'2005-07-11 09:13:08',910,35,'2005-07-17 03:48:08',1,'2006-02-15 21:30:53'),(6148,'2005-07-11 09:14:22',4318,410,'2005-07-12 08:01:22',1,'2006-02-15 21:30:53'),(6149,'2005-07-11 09:19:31',4337,26,'2005-07-17 14:45:31',2,'2006-02-15 21:30:53'),(6150,'2005-07-11 09:23:56',1110,418,'2005-07-15 10:56:56',2,'2006-02-15 21:30:53'),(6151,'2005-07-11 09:25:17',352,476,'2005-07-12 05:11:17',1,'2006-02-15 21:30:53'),(6152,'2005-07-11 09:25:52',560,361,'2005-07-17 07:40:52',2,'2006-02-15 21:30:53'),(6153,'2005-07-11 09:31:04',105,47,'2005-07-19 03:41:04',1,'2006-02-15 21:30:53'),(6154,'2005-07-11 09:32:19',2717,368,'2005-07-16 15:10:19',1,'2006-02-15 21:30:53'),(6155,'2005-07-11 09:45:31',785,229,'2005-07-18 08:09:31',1,'2006-02-15 21:30:53'),(6156,'2005-07-11 09:45:48',302,297,'2005-07-15 04:51:48',1,'2006-02-15 21:30:53'),(6157,'2005-07-11 09:48:16',4481,133,'2005-07-16 05:00:16',2,'2006-02-15 21:30:53'),(6158,'2005-07-11 09:50:24',3954,92,'2005-07-13 04:49:24',2,'2006-02-15 21:30:53'),(6159,'2005-07-11 09:55:34',126,225,'2005-07-13 10:01:34',2,'2006-02-15 21:30:53'),(6160,'2005-07-11 10:08:13',2716,110,'2005-07-14 08:18:13',1,'2006-02-15 21:30:53'),(6161,'2005-07-11 10:11:54',3681,524,'2005-07-15 12:12:54',2,'2006-02-15 21:30:53'),(6162,'2005-07-11 10:12:30',786,79,'2005-07-19 06:02:30',2,'2006-02-15 21:30:53'),(6163,'2005-07-11 10:13:46',1330,1,'2005-07-19 13:15:46',2,'2006-02-15 21:30:53'),(6164,'2005-07-11 10:16:23',2755,47,'2005-07-14 11:21:23',1,'2006-02-15 21:30:53'),(6165,'2005-07-11 10:17:29',3540,9,'2005-07-17 07:27:29',1,'2006-02-15 21:30:53'),(6166,'2005-07-11 10:19:05',967,503,'2005-07-12 14:30:05',1,'2006-02-15 21:30:53'),(6167,'2005-07-11 10:21:21',3255,200,'2005-07-14 15:38:21',1,'2006-02-15 21:30:53'),(6168,'2005-07-11 10:21:38',284,77,'2005-07-14 09:55:38',2,'2006-02-15 21:30:53'),(6169,'2005-07-11 10:25:56',2781,148,'2005-07-19 07:18:56',2,'2006-02-15 21:30:53'),(6170,'2005-07-11 10:29:21',278,580,'2005-07-16 05:13:21',2,'2006-02-15 21:30:53'),(6171,'2005-07-11 10:29:35',448,491,'2005-07-16 12:01:35',1,'2006-02-15 21:30:53'),(6172,'2005-07-11 10:32:09',3514,219,'2005-07-14 16:23:09',1,'2006-02-15 21:30:53'),(6173,'2005-07-11 10:33:11',4252,419,'2005-07-15 10:57:11',1,'2006-02-15 21:30:53'),(6174,'2005-07-11 10:36:28',3123,7,'2005-07-18 16:19:28',2,'2006-02-15 21:30:53'),(6175,'2005-07-11 10:44:37',3037,195,'2005-07-15 08:13:37',1,'2006-02-15 21:30:53'),(6176,'2005-07-11 10:48:21',2969,279,'2005-07-12 15:54:21',2,'2006-02-15 21:30:53'),(6177,'2005-07-11 10:53:49',313,589,'2005-07-17 14:54:49',1,'2006-02-15 21:30:53'),(6178,'2005-07-11 10:59:09',2777,91,'2005-07-16 11:19:09',2,'2006-02-15 21:30:53'),(6179,'2005-07-11 10:59:59',3665,42,'2005-07-17 06:02:59',1,'2006-02-15 21:30:53'),(6180,'2005-07-11 11:06:50',4401,351,'2005-07-19 09:03:50',2,'2006-02-15 21:30:53'),(6181,'2005-07-11 11:10:11',4398,200,'2005-07-15 09:33:11',1,'2006-02-15 21:30:53'),(6182,'2005-07-11 11:11:38',2562,540,'2005-07-17 08:33:38',2,'2006-02-15 21:30:53'),(6183,'2005-07-11 11:14:35',856,402,'2005-07-16 15:35:35',1,'2006-02-15 21:30:53'),(6184,'2005-07-11 11:19:21',1131,146,'2005-07-19 07:35:21',1,'2006-02-15 21:30:53'),(6185,'2005-07-11 11:25:09',4331,294,'2005-07-18 12:09:09',2,'2006-02-15 21:30:53'),(6186,'2005-07-11 11:26:41',2086,128,'2005-07-17 12:02:41',2,'2006-02-15 21:30:53'),(6187,'2005-07-11 11:28:51',3344,500,'2005-07-12 15:44:51',1,'2006-02-15 21:30:53'),(6188,'2005-07-11 11:31:47',189,114,'2005-07-15 09:28:47',1,'2006-02-15 21:30:53'),(6189,'2005-07-11 11:36:03',3800,552,'2005-07-20 15:33:03',2,'2006-02-15 21:30:53'),(6190,'2005-07-11 11:36:18',2564,321,'2005-07-19 17:05:18',2,'2006-02-15 21:30:53'),(6191,'2005-07-11 11:37:52',3448,480,'2005-07-17 12:45:52',1,'2006-02-15 21:30:53'),(6192,'2005-07-11 11:44:41',4573,314,'2005-07-19 10:12:41',1,'2006-02-15 21:30:53'),(6193,'2005-07-11 11:46:57',465,189,'2005-07-19 14:11:57',2,'2006-02-15 21:30:53'),(6194,'2005-07-11 11:51:00',1049,83,'2005-07-15 12:34:00',2,'2006-02-15 21:30:53'),(6195,'2005-07-11 12:00:32',4193,319,'2005-07-16 15:00:32',2,'2006-02-15 21:30:53'),(6196,'2005-07-11 12:05:46',995,429,'2005-07-18 08:27:46',2,'2006-02-15 21:30:53'),(6197,'2005-07-11 12:09:51',4156,596,'2005-07-12 06:15:51',1,'2006-02-15 21:30:53'),(6198,'2005-07-11 12:12:17',3345,470,'2005-07-18 07:40:17',2,'2006-02-15 21:30:53'),(6199,'2005-07-11 12:16:03',4329,80,'2005-07-18 15:33:03',2,'2006-02-15 21:30:53'),(6200,'2005-07-11 12:16:42',3258,137,'2005-07-17 09:27:42',2,'2006-02-15 21:30:53'),(6201,'2005-07-11 12:18:07',4530,559,'2005-07-12 12:11:07',2,'2006-02-15 21:30:53'),(6202,'2005-07-11 12:24:25',1424,373,'2005-07-18 08:13:25',1,'2006-02-15 21:30:53'),(6203,'2005-07-11 12:28:57',1001,408,'2005-07-15 14:10:57',1,'2006-02-15 21:30:53'),(6204,'2005-07-11 12:29:22',2572,362,'2005-07-13 10:41:22',2,'2006-02-15 21:30:53'),(6205,'2005-07-11 12:31:24',3442,303,'2005-07-13 11:31:24',2,'2006-02-15 21:30:53'),(6206,'2005-07-11 12:32:14',1368,459,'2005-07-15 15:01:14',2,'2006-02-15 21:30:53'),(6207,'2005-07-11 12:34:24',3226,143,'2005-07-14 10:15:24',2,'2006-02-15 21:30:53'),(6208,'2005-07-11 12:34:56',672,31,'2005-07-19 15:17:56',1,'2006-02-15 21:30:53'),(6209,'2005-07-11 12:36:05',3091,219,'2005-07-17 14:48:05',2,'2006-02-15 21:30:53'),(6210,'2005-07-11 12:36:43',931,209,'2005-07-17 17:45:43',2,'2006-02-15 21:30:53'),(6211,'2005-07-11 12:39:01',2699,6,'2005-07-20 15:59:01',2,'2006-02-15 21:30:53'),(6212,'2005-07-11 12:40:48',3962,337,'2005-07-15 17:49:48',2,'2006-02-15 21:30:53'),(6213,'2005-07-11 12:43:07',485,23,'2005-07-16 07:23:07',2,'2006-02-15 21:30:53'),(6214,'2005-07-11 12:49:48',1258,49,'2005-07-18 07:41:48',2,'2006-02-15 21:30:53'),(6215,'2005-07-11 12:52:36',316,390,'2005-07-12 08:33:36',1,'2006-02-15 21:30:53'),(6216,'2005-07-11 12:57:05',3571,387,'2005-07-13 12:31:05',1,'2006-02-15 21:30:53'),(6217,'2005-07-11 13:13:45',1090,177,'2005-07-19 16:37:45',2,'2006-02-15 21:30:53'),(6218,'2005-07-11 13:14:58',815,410,'2005-07-16 08:13:58',2,'2006-02-15 21:30:53'),(6219,'2005-07-11 13:18:37',38,303,'2005-07-13 13:18:37',2,'2006-02-15 21:30:53'),(6220,'2005-07-11 13:22:06',1717,421,'2005-07-12 17:46:06',2,'2006-02-15 21:30:53'),(6221,'2005-07-11 13:24:27',1699,393,'2005-07-15 17:51:27',1,'2006-02-15 21:30:53'),(6222,'2005-07-11 13:25:49',2066,386,'2005-07-13 14:32:49',1,'2006-02-15 21:30:53'),(6223,'2005-07-11 13:27:09',3754,192,'2005-07-12 14:02:09',1,'2006-02-15 21:30:53'),(6224,'2005-07-11 13:42:18',3274,475,'2005-07-16 09:28:18',1,'2006-02-15 21:30:53'),(6225,'2005-07-11 13:45:14',2483,204,'2005-07-14 10:23:14',1,'2006-02-15 21:30:53'),(6226,'2005-07-11 13:48:11',2758,134,'2005-07-15 17:18:11',2,'2006-02-15 21:30:53'),(6227,'2005-07-11 13:56:46',1654,210,'2005-07-18 12:53:46',1,'2006-02-15 21:30:53'),(6228,'2005-07-11 13:58:36',2281,367,'2005-07-17 19:03:36',2,'2006-02-15 21:30:53'),(6229,'2005-07-11 13:59:50',3137,399,'2005-07-20 09:26:50',1,'2006-02-15 21:30:53'),(6230,'2005-07-11 14:02:19',2260,490,'2005-07-17 08:11:19',2,'2006-02-15 21:30:53'),(6231,'2005-07-11 14:02:36',2526,122,'2005-07-13 19:04:36',2,'2006-02-15 21:30:53'),(6232,'2005-07-11 14:08:27',2492,590,'2005-07-20 19:34:27',2,'2006-02-15 21:30:53'),(6233,'2005-07-11 14:10:47',3731,378,'2005-07-15 15:13:47',2,'2006-02-15 21:30:53'),(6234,'2005-07-11 14:16:10',2911,232,'2005-07-19 19:55:10',1,'2006-02-15 21:30:53'),(6235,'2005-07-11 14:17:51',2659,379,'2005-07-17 11:14:51',2,'2006-02-15 21:30:53'),(6236,'2005-07-11 14:18:17',3813,338,'2005-07-14 08:47:17',2,'2006-02-15 21:30:53'),(6237,'2005-07-11 14:19:12',2215,166,'2005-07-15 15:05:12',1,'2006-02-15 21:30:53'),(6238,'2005-07-11 14:20:18',3749,23,'2005-07-14 18:34:18',1,'2006-02-15 21:30:53'),(6239,'2005-07-11 14:20:48',4107,132,'2005-07-17 13:41:48',2,'2006-02-15 21:30:53'),(6240,'2005-07-11 14:32:41',640,524,'2005-07-20 18:38:41',1,'2006-02-15 21:30:53'),(6241,'2005-07-11 14:40:48',4449,74,'2005-07-18 09:51:48',1,'2006-02-15 21:30:53'),(6242,'2005-07-11 14:45:04',670,245,'2005-07-12 18:34:04',2,'2006-02-15 21:30:53'),(6243,'2005-07-11 14:53:25',3456,26,'2005-07-15 09:26:25',2,'2006-02-15 21:30:53'),(6244,'2005-07-11 14:53:38',1558,383,'2005-07-12 16:42:38',1,'2006-02-15 21:30:53'),(6245,'2005-07-11 14:56:57',512,241,'2005-07-16 14:35:57',1,'2006-02-15 21:30:53'),(6246,'2005-07-11 14:57:51',2376,172,'2005-07-19 19:10:51',2,'2006-02-15 21:30:53'),(6247,'2005-07-11 15:00:05',2504,589,'2005-07-18 13:47:05',1,'2006-02-15 21:30:53'),(6248,'2005-07-11 15:01:54',2686,6,'2005-07-19 16:58:54',1,'2006-02-15 21:30:53'),(6249,'2005-07-11 15:02:02',4334,30,'2005-07-14 11:37:02',2,'2006-02-15 21:30:53'),(6250,'2005-07-11 15:02:04',4087,458,'2005-07-17 10:54:04',1,'2006-02-15 21:30:53'),(6251,'2005-07-11 15:06:20',3956,230,'2005-07-18 20:11:20',2,'2006-02-15 21:30:53'),(6252,'2005-07-11 15:06:29',1294,295,'2005-07-16 14:07:29',1,'2006-02-15 21:30:53'),(6253,'2005-07-11 15:07:19',1425,570,'2005-07-13 11:00:19',1,'2006-02-15 21:30:53'),(6254,'2005-07-11 15:10:18',2038,20,'2005-07-17 14:20:18',2,'2006-02-15 21:30:53'),(6255,'2005-07-11 15:11:33',1459,319,'2005-07-15 19:55:33',2,'2006-02-15 21:30:53'),(6256,'2005-07-11 15:19:22',480,307,'2005-07-13 12:43:22',1,'2006-02-15 21:30:53'),(6257,'2005-07-11 15:23:46',3253,492,'2005-07-14 17:26:46',2,'2006-02-15 21:30:53'),(6258,'2005-07-11 15:24:32',632,417,'2005-07-18 18:29:32',1,'2006-02-15 21:30:53'),(6259,'2005-07-11 15:25:52',3007,84,'2005-07-13 11:54:52',2,'2006-02-15 21:30:53'),(6260,'2005-07-11 15:26:29',4308,454,'2005-07-13 17:37:29',2,'2006-02-15 21:30:53'),(6261,'2005-07-11 15:28:34',694,386,'2005-07-14 17:54:34',1,'2006-02-15 21:30:53'),(6262,'2005-07-11 15:33:24',4136,355,'2005-07-17 12:40:24',1,'2006-02-15 21:30:53'),(6263,'2005-07-11 15:33:50',2391,336,'2005-07-17 12:49:50',2,'2006-02-15 21:30:53'),(6264,'2005-07-11 15:42:35',4246,565,'2005-07-12 11:29:35',2,'2006-02-15 21:30:53'),(6265,'2005-07-11 15:43:51',3931,477,'2005-07-12 12:51:51',2,'2006-02-15 21:30:53'),(6266,'2005-07-11 15:45:39',941,397,'2005-07-15 18:29:39',1,'2006-02-15 21:30:53'),(6267,'2005-07-11 15:53:00',2152,20,'2005-07-17 18:09:00',2,'2006-02-15 21:30:53'),(6268,'2005-07-11 15:55:34',1154,125,'2005-07-19 17:25:34',1,'2006-02-15 21:30:53'),(6269,'2005-07-11 15:58:43',3915,167,'2005-07-13 13:25:43',1,'2006-02-15 21:30:53'),(6270,'2005-07-11 15:59:10',2308,292,'2005-07-18 10:29:10',2,'2006-02-15 21:30:53'),(6271,'2005-07-11 16:01:35',1246,467,'2005-07-20 12:07:35',2,'2006-02-15 21:30:53'),(6272,'2005-07-11 16:03:49',3103,240,'2005-07-15 19:54:49',1,'2006-02-15 21:30:53'),(6273,'2005-07-11 16:08:41',2403,152,'2005-07-14 16:41:41',2,'2006-02-15 21:30:53'),(6274,'2005-07-11 16:09:42',2998,472,'2005-07-19 20:46:42',1,'2006-02-15 21:30:53'),(6275,'2005-07-11 16:12:11',3599,333,'2005-07-17 20:19:11',2,'2006-02-15 21:30:53'),(6276,'2005-07-11 16:15:50',1826,284,'2005-07-19 20:50:50',2,'2006-02-15 21:30:53'),(6277,'2005-07-11 16:19:01',4023,92,'2005-07-18 21:00:01',2,'2006-02-15 21:30:53'),(6278,'2005-07-11 16:20:02',2232,558,'2005-07-19 19:29:02',2,'2006-02-15 21:30:53'),(6279,'2005-07-11 16:26:07',1254,49,'2005-07-17 21:05:07',2,'2006-02-15 21:30:53'),(6280,'2005-07-11 16:36:17',4055,33,'2005-07-13 14:04:17',2,'2006-02-15 21:30:53'),(6281,'2005-07-11 16:38:16',835,236,'2005-07-13 10:57:16',2,'2006-02-15 21:30:53'),(6282,'2005-07-11 16:46:22',4453,60,'2005-07-15 13:19:22',1,'2006-02-15 21:30:53'),(6283,'2005-07-11 16:47:32',3319,402,'2005-07-17 21:46:32',1,'2006-02-15 21:30:53'),(6284,'2005-07-11 16:51:39',2938,177,'2005-07-15 19:59:39',1,'2006-02-15 21:30:53'),(6285,'2005-07-11 16:52:07',2140,444,'2005-07-13 21:33:07',2,'2006-02-15 21:30:53'),(6286,'2005-07-11 16:55:35',1070,140,'2005-07-13 22:51:35',1,'2006-02-15 21:30:53'),(6287,'2005-07-11 17:00:04',35,93,'2005-07-12 13:16:04',1,'2006-02-15 21:30:53'),(6288,'2005-07-11 17:01:52',3235,357,'2005-07-19 15:11:52',1,'2006-02-15 21:30:53'),(6289,'2005-07-11 17:06:39',3185,99,'2005-07-12 15:54:39',2,'2006-02-15 21:30:53'),(6290,'2005-07-11 17:12:42',2634,66,'2005-07-19 21:53:42',2,'2006-02-15 21:30:53'),(6291,'2005-07-11 17:16:40',3126,262,'2005-07-13 18:24:40',2,'2006-02-15 21:30:53'),(6292,'2005-07-11 17:23:33',4375,505,'2005-07-12 16:27:33',2,'2006-02-15 21:30:53'),(6293,'2005-07-11 17:24:57',4260,471,'2005-07-13 18:45:57',2,'2006-02-15 21:30:53'),(6294,'2005-07-11 17:25:55',1732,463,'2005-07-15 17:48:55',1,'2006-02-15 21:30:53'),(6295,'2005-07-11 17:30:58',1393,7,'2005-07-15 15:50:58',1,'2006-02-15 21:30:53'),(6296,'2005-07-11 17:34:04',4202,484,'2005-07-17 21:12:04',1,'2006-02-15 21:30:53'),(6297,'2005-07-11 17:37:22',2738,69,'2005-07-19 13:54:22',2,'2006-02-15 21:30:53'),(6298,'2005-07-11 17:42:33',3906,256,'2005-07-13 18:14:33',2,'2006-02-15 21:30:53'),(6299,'2005-07-11 17:45:08',4125,324,'2005-07-13 16:36:08',2,'2006-02-15 21:30:53'),(6300,'2005-07-11 17:50:09',1269,283,'2005-07-18 13:11:09',1,'2006-02-15 21:30:53'),(6301,'2005-07-11 17:54:09',3528,275,'2005-07-18 20:42:09',2,'2006-02-15 21:30:53'),(6302,'2005-07-11 17:55:38',3221,391,'2005-07-17 22:11:38',1,'2006-02-15 21:30:53'),(6303,'2005-07-11 17:55:43',846,236,'2005-07-13 12:50:43',1,'2006-02-15 21:30:53'),(6304,'2005-07-11 18:02:16',4183,579,'2005-07-14 14:01:16',1,'2006-02-15 21:30:53'),(6305,'2005-07-11 18:02:25',1544,337,'2005-07-20 13:29:25',1,'2006-02-15 21:30:53'),(6306,'2005-07-11 18:04:26',486,208,'2005-07-20 14:22:26',2,'2006-02-15 21:30:53'),(6307,'2005-07-11 18:04:29',4029,345,'2005-07-17 23:40:29',2,'2006-02-15 21:30:53'),(6308,'2005-07-11 18:08:41',3155,472,'2005-07-19 15:48:41',2,'2006-02-15 21:30:53'),(6309,'2005-07-11 18:13:24',1054,232,'2005-07-13 23:11:24',1,'2006-02-15 21:30:53'),(6310,'2005-07-11 18:14:05',3064,537,'2005-07-16 15:39:05',2,'2006-02-15 21:30:53'),(6311,'2005-07-11 18:18:52',1789,373,'2005-07-16 17:52:52',2,'2006-02-15 21:30:53'),(6312,'2005-07-11 18:19:02',2188,417,'2005-07-18 00:00:02',1,'2006-02-15 21:30:53'),(6313,'2005-07-11 18:29:52',2976,283,'2005-07-14 21:34:52',1,'2006-02-15 21:30:53'),(6314,'2005-07-11 18:32:44',4128,55,'2005-07-17 23:58:44',1,'2006-02-15 21:30:53'),(6315,'2005-07-11 18:42:49',608,374,'2005-07-12 23:19:49',2,'2006-02-15 21:30:53'),(6316,'2005-07-11 18:44:52',1910,526,'2005-07-19 23:35:52',2,'2006-02-15 21:30:53'),(6317,'2005-07-11 18:47:41',4206,225,'2005-07-14 18:18:41',1,'2006-02-15 21:30:53'),(6318,'2005-07-11 18:48:22',2048,425,'2005-07-12 13:39:22',1,'2006-02-15 21:30:53'),(6319,'2005-07-11 18:50:45',3739,233,'2005-07-12 15:26:45',1,'2006-02-15 21:30:53'),(6320,'2005-07-11 18:50:55',441,511,'2005-07-13 22:46:55',2,'2006-02-15 21:30:53'),(6321,'2005-07-11 18:51:02',2655,388,'2005-07-14 20:57:02',2,'2006-02-15 21:30:53'),(6322,'2005-07-11 18:58:20',4115,403,'2005-07-14 16:41:20',2,'2006-02-15 21:30:53'),(6323,'2005-07-11 19:02:19',1352,346,'2005-07-14 15:54:19',1,'2006-02-15 21:30:53'),(6324,'2005-07-11 19:02:34',655,386,'2005-07-17 15:57:34',1,'2006-02-15 21:30:53'),(6325,'2005-07-11 19:06:01',4556,542,'2005-07-18 18:25:01',2,'2006-02-15 21:30:53'),(6326,'2005-07-11 19:06:55',2137,563,'2005-07-12 20:41:55',1,'2006-02-15 21:30:53'),(6327,'2005-07-11 19:07:29',909,146,'2005-07-15 16:09:29',1,'2006-02-15 21:30:53'),(6328,'2005-07-11 19:09:33',999,260,'2005-07-12 20:16:33',2,'2006-02-15 21:30:53'),(6329,'2005-07-11 19:10:38',2763,352,'2005-07-19 14:46:38',2,'2006-02-15 21:30:53'),(6330,'2005-07-11 19:15:42',3917,119,'2005-07-17 19:10:42',1,'2006-02-15 21:30:53'),(6331,'2005-07-11 19:17:21',1356,295,'2005-07-18 18:35:21',2,'2006-02-15 21:30:53'),(6332,'2005-07-11 19:19:06',1733,538,'2005-07-13 13:51:06',2,'2006-02-15 21:30:53'),(6333,'2005-07-11 19:20:16',2610,285,'2005-07-17 15:33:16',1,'2006-02-15 21:30:53'),(6334,'2005-07-11 19:20:44',948,168,'2005-07-19 18:49:44',2,'2006-02-15 21:30:53'),(6335,'2005-07-11 19:25:15',2757,396,'2005-07-16 17:02:15',1,'2006-02-15 21:30:53'),(6336,'2005-07-11 19:30:13',1229,471,'2005-07-20 21:27:13',2,'2006-02-15 21:30:53'),(6337,'2005-07-11 19:30:47',3967,47,'2005-07-19 20:27:47',2,'2006-02-15 21:30:53'),(6338,'2005-07-11 19:39:41',1691,54,'2005-07-18 01:13:41',2,'2006-02-15 21:30:53'),(6339,'2005-07-11 19:45:32',2401,145,'2005-07-18 22:34:32',2,'2006-02-15 21:30:53'),(6340,'2005-07-11 19:46:05',2374,264,'2005-07-20 16:51:05',2,'2006-02-15 21:30:53'),(6341,'2005-07-11 19:48:02',3580,448,'2005-07-15 01:31:02',1,'2006-02-15 21:30:53'),(6342,'2005-07-11 19:48:24',1851,403,'2005-07-13 14:09:24',2,'2006-02-15 21:30:53'),(6343,'2005-07-11 19:51:35',513,147,'2005-07-12 19:13:35',1,'2006-02-15 21:30:53'),(6344,'2005-07-11 20:04:43',3074,78,'2005-07-18 14:35:43',2,'2006-02-15 21:30:53'),(6345,'2005-07-11 20:05:18',4332,532,'2005-07-20 17:28:18',1,'2006-02-15 21:30:53'),(6346,'2005-07-11 20:08:34',4066,445,'2005-07-16 16:35:34',2,'2006-02-15 21:30:53'),(6347,'2005-07-11 20:18:53',3160,178,'2005-07-16 20:45:53',1,'2006-02-15 21:30:53'),(6348,'2005-07-11 20:21:18',21,66,'2005-07-19 15:56:18',2,'2006-02-15 21:30:53'),(6349,'2005-07-11 20:25:05',1581,216,'2005-07-21 00:35:05',2,'2006-02-15 21:30:53'),(6350,'2005-07-11 20:30:15',2853,225,'2005-07-16 21:30:15',1,'2006-02-15 21:30:53'),(6351,'2005-07-11 20:31:44',1852,507,'2005-07-18 17:16:44',2,'2006-02-15 21:30:53'),(6352,'2005-07-11 20:34:13',1143,235,'2005-07-13 19:49:13',1,'2006-02-15 21:30:53'),(6353,'2005-07-11 20:48:56',699,130,'2005-07-21 00:11:56',1,'2006-02-15 21:30:53'),(6354,'2005-07-11 20:54:27',3203,176,'2005-07-18 23:46:27',2,'2006-02-15 21:30:53'),(6355,'2005-07-11 20:56:29',2472,482,'2005-07-20 01:50:29',2,'2006-02-15 21:30:53'),(6356,'2005-07-11 20:57:48',2645,149,'2005-07-12 22:40:48',2,'2006-02-15 21:30:53'),(6357,'2005-07-11 20:58:51',658,252,'2005-07-12 15:06:51',1,'2006-02-15 21:30:53'),(6358,'2005-07-11 21:03:12',4527,567,'2005-07-15 20:06:12',2,'2006-02-15 21:30:53'),(6359,'2005-07-11 21:06:17',1656,30,'2005-07-16 02:51:17',2,'2006-02-15 21:30:53'),(6360,'2005-07-11 21:07:40',3075,338,'2005-07-16 15:11:40',1,'2006-02-15 21:30:53'),(6361,'2005-07-11 21:09:14',2903,561,'2005-07-14 18:26:14',2,'2006-02-15 21:30:53'),(6362,'2005-07-11 21:09:31',4259,358,'2005-07-13 23:08:31',1,'2006-02-15 21:30:53'),(6363,'2005-07-11 21:13:19',4167,344,'2005-07-20 15:44:19',1,'2006-02-15 21:30:53'),(6364,'2005-07-11 21:14:48',4146,160,'2005-07-20 23:20:48',2,'2006-02-15 21:30:53'),(6365,'2005-07-11 21:17:40',4550,566,'2005-07-14 20:53:40',1,'2006-02-15 21:30:53'),(6366,'2005-07-11 21:18:16',3989,366,'2005-07-17 00:21:16',1,'2006-02-15 21:30:53'),(6367,'2005-07-11 21:18:29',1465,357,'2005-07-15 01:05:29',1,'2006-02-15 21:30:53'),(6368,'2005-07-11 21:19:01',3666,588,'2005-07-13 17:56:01',2,'2006-02-15 21:30:53'),(6369,'2005-07-11 21:23:36',1086,252,'2005-07-13 22:23:36',2,'2006-02-15 21:30:53'),(6370,'2005-07-11 21:28:32',1410,99,'2005-07-20 02:51:32',2,'2006-02-15 21:30:53'),(6371,'2005-07-11 21:31:51',4297,265,'2005-07-16 23:10:51',1,'2006-02-15 21:30:53'),(6372,'2005-07-11 21:35:06',741,64,'2005-07-15 02:30:06',2,'2006-02-15 21:30:53'),(6373,'2005-07-11 21:35:20',1042,115,'2005-07-13 23:22:20',2,'2006-02-15 21:30:53'),(6374,'2005-07-11 21:36:10',266,244,'2005-07-17 15:50:10',2,'2006-02-15 21:30:53'),(6375,'2005-07-11 21:39:46',1936,8,'2005-07-18 02:12:46',2,'2006-02-15 21:30:53'),(6376,'2005-07-11 21:40:23',1834,263,'2005-07-13 23:16:23',1,'2006-02-15 21:30:53'),(6377,'2005-07-11 21:41:16',4017,118,'2005-07-15 20:05:16',1,'2006-02-15 21:30:53'),(6378,'2005-07-11 21:45:23',3170,145,'2005-07-14 16:56:23',1,'2006-02-15 21:30:53'),(6379,'2005-07-11 21:51:25',522,287,'2005-07-17 03:38:25',2,'2006-02-15 21:30:53'),(6380,'2005-07-11 21:55:40',3378,172,'2005-07-17 20:42:40',1,'2006-02-15 21:30:53'),(6381,'2005-07-11 21:58:48',2584,340,'2005-07-16 16:18:48',1,'2006-02-15 21:30:53'),(6382,'2005-07-11 21:58:53',3223,336,'2005-07-17 21:18:53',2,'2006-02-15 21:30:53'),(6383,'2005-07-11 22:06:53',4275,486,'2005-07-17 16:09:53',1,'2006-02-15 21:30:53'),(6384,'2005-07-11 22:07:26',491,313,'2005-07-16 22:39:26',1,'2006-02-15 21:30:53'),(6385,'2005-07-11 22:07:32',1830,69,'2005-07-20 16:57:32',1,'2006-02-15 21:30:53'),(6386,'2005-07-11 22:14:57',633,593,'2005-07-15 16:41:57',2,'2006-02-15 21:30:53'),(6387,'2005-07-11 22:15:56',1726,384,'2005-07-14 20:20:56',2,'2006-02-15 21:30:53'),(6388,'2005-07-11 22:17:16',3506,525,'2005-07-19 23:50:16',2,'2006-02-15 21:30:53'),(6389,'2005-07-11 22:18:20',2268,274,'2005-07-16 16:57:20',2,'2006-02-15 21:30:53'),(6390,'2005-07-11 22:19:23',3057,77,'2005-07-15 20:10:23',2,'2006-02-15 21:30:53'),(6391,'2005-07-11 22:23:09',1745,264,'2005-07-15 23:02:09',1,'2006-02-15 21:30:53'),(6392,'2005-07-11 22:25:19',4406,468,'2005-07-16 04:24:19',1,'2006-02-15 21:30:53'),(6393,'2005-07-11 22:28:12',3802,164,'2005-07-14 18:03:12',1,'2006-02-15 21:30:53'),(6394,'2005-07-11 22:29:15',2574,52,'2005-07-20 02:19:15',2,'2006-02-15 21:30:53'),(6395,'2005-07-11 22:29:29',3058,264,'2005-07-18 00:50:29',1,'2006-02-15 21:30:53'),(6396,'2005-07-11 22:31:08',2394,507,'2005-07-19 17:19:08',2,'2006-02-15 21:30:53'),(6397,'2005-07-11 22:34:02',2423,287,'2005-07-13 23:01:02',1,'2006-02-15 21:30:53'),(6398,'2005-07-11 22:34:49',1409,296,'2005-07-17 17:58:49',2,'2006-02-15 21:30:53'),(6399,'2005-07-11 22:39:05',2031,288,'2005-07-16 01:12:05',1,'2006-02-15 21:30:53'),(6400,'2005-07-11 22:43:44',3289,536,'2005-07-19 03:58:44',2,'2006-02-15 21:30:53'),(6401,'2005-07-11 22:44:34',1427,35,'2005-07-12 22:18:34',2,'2006-02-15 21:30:53'),(6402,'2005-07-11 22:46:10',2576,66,'2005-07-16 04:02:10',1,'2006-02-15 21:30:53'),(6403,'2005-07-11 22:46:25',1019,238,'2005-07-13 22:15:25',1,'2006-02-15 21:30:53'),(6404,'2005-07-11 22:49:50',1183,526,'2005-07-14 18:29:50',2,'2006-02-15 21:30:53'),(6405,'2005-07-11 22:53:12',3983,357,'2005-07-18 23:02:12',2,'2006-02-15 21:30:53'),(6406,'2005-07-11 22:55:27',4439,392,'2005-07-20 04:50:27',2,'2006-02-15 21:30:53'),(6407,'2005-07-11 23:02:19',775,140,'2005-07-21 00:30:19',1,'2006-02-15 21:30:53'),(6408,'2005-07-11 23:03:02',2008,350,'2005-07-19 23:09:02',2,'2006-02-15 21:30:53'),(6409,'2005-07-11 23:05:49',3859,537,'2005-07-13 00:13:49',2,'2006-02-15 21:30:53'),(6410,'2005-07-11 23:08:06',1127,560,'2005-07-19 19:57:06',2,'2006-02-15 21:30:53'),(6411,'2005-07-11 23:10:50',4347,124,'2005-07-19 17:15:50',1,'2006-02-15 21:30:53'),(6412,'2005-07-11 23:19:21',3797,220,'2005-07-16 19:48:21',1,'2006-02-15 21:30:53'),(6413,'2005-07-11 23:26:11',4446,251,'2005-07-17 21:58:11',2,'2006-02-15 21:30:53'),(6414,'2005-07-11 23:26:13',814,502,'2005-07-18 17:29:13',1,'2006-02-15 21:30:53'),(6415,'2005-07-11 23:27:52',4175,84,'2005-07-19 22:29:52',2,'2006-02-15 21:30:53'),(6416,'2005-07-11 23:29:14',1063,158,'2005-07-13 20:20:14',1,'2006-02-15 21:30:53'),(6417,'2005-07-11 23:35:11',3042,80,'2005-07-18 20:00:11',2,'2006-02-15 21:30:53'),(6418,'2005-07-11 23:36:27',3101,185,'2005-07-16 18:42:27',1,'2006-02-15 21:30:53'),(6419,'2005-07-11 23:36:38',3683,311,'2005-07-13 03:23:38',1,'2006-02-15 21:30:53'),(6420,'2005-07-11 23:38:49',4443,206,'2005-07-17 17:46:49',2,'2006-02-15 21:30:53'),(6421,'2005-07-11 23:45:25',4477,479,'2005-07-15 20:45:25',2,'2006-02-15 21:30:53'),(6422,'2005-07-11 23:46:19',762,257,'2005-07-20 22:12:19',1,'2006-02-15 21:30:53'),(6423,'2005-07-11 23:47:31',892,427,'2005-07-19 18:16:31',1,'2006-02-15 21:30:53'),(6424,'2005-07-11 23:49:37',3040,359,'2005-07-21 00:53:37',1,'2006-02-15 21:30:53'),(6425,'2005-07-11 23:54:52',2487,339,'2005-07-13 18:37:52',1,'2006-02-15 21:30:53'),(6426,'2005-07-11 23:56:38',498,495,'2005-07-21 05:22:38',1,'2006-02-15 21:30:53'),(6427,'2005-07-11 23:57:34',1043,122,'2005-07-14 18:05:34',2,'2006-02-15 21:30:53'),(6428,'2005-07-12 00:01:51',4365,187,'2005-07-20 22:02:51',2,'2006-02-15 21:30:53'),(6429,'2005-07-12 00:02:50',141,342,'2005-07-21 02:08:50',1,'2006-02-15 21:30:53'),(6430,'2005-07-12 00:03:34',178,390,'2005-07-15 03:11:34',1,'2006-02-15 21:30:53'),(6431,'2005-07-12 00:03:57',3471,458,'2005-07-20 03:47:57',1,'2006-02-15 21:30:53'),(6432,'2005-07-12 00:09:41',970,293,'2005-07-20 20:06:41',1,'2006-02-15 21:30:53'),(6433,'2005-07-12 00:12:02',1357,101,'2005-07-21 04:25:02',2,'2006-02-15 21:30:53'),(6434,'2005-07-12 00:14:25',1478,102,'2005-07-20 19:54:25',2,'2006-02-15 21:30:53'),(6435,'2005-07-12 00:16:19',1957,561,'2005-07-17 19:15:19',1,'2006-02-15 21:30:53'),(6436,'2005-07-12 00:18:42',3758,122,'2005-07-13 03:57:42',2,'2006-02-15 21:30:53'),(6437,'2005-07-12 00:20:29',4539,355,'2005-07-12 22:26:29',1,'2006-02-15 21:30:53'),(6438,'2005-07-12 00:23:01',412,211,'2005-07-17 22:45:01',1,'2006-02-15 21:30:53'),(6439,'2005-07-12 00:23:48',3463,406,'2005-07-13 00:54:48',2,'2006-02-15 21:30:53'),(6440,'2005-07-12 00:25:04',2148,269,'2005-07-13 04:52:04',2,'2006-02-15 21:30:53'),(6441,'2005-07-12 00:27:08',2489,505,'2005-07-14 03:12:08',1,'2006-02-15 21:30:53'),(6442,'2005-07-12 00:29:45',1273,360,'2005-07-15 19:37:45',2,'2006-02-15 21:30:53'),(6443,'2005-07-12 00:35:51',895,155,'2005-07-16 04:50:51',1,'2006-02-15 21:30:53'),(6444,'2005-07-12 00:36:02',2214,168,'2005-07-18 05:53:02',1,'2006-02-15 21:30:53'),(6445,'2005-07-12 00:37:02',582,385,'2005-07-17 22:05:02',2,'2006-02-15 21:30:53'),(6446,'2005-07-12 00:44:08',3634,473,'2005-07-14 20:39:08',2,'2006-02-15 21:30:53'),(6447,'2005-07-12 00:45:17',3945,482,'2005-07-18 05:56:17',2,'2006-02-15 21:30:53'),(6448,'2005-07-12 00:45:59',2663,160,'2005-07-17 00:34:59',1,'2006-02-15 21:30:53'),(6449,'2005-07-12 00:48:58',4395,117,'2005-07-21 02:57:58',1,'2006-02-15 21:30:53'),(6450,'2005-07-12 00:49:05',2413,32,'2005-07-13 01:54:05',2,'2006-02-15 21:30:53'),(6451,'2005-07-12 00:52:19',1008,381,'2005-07-16 21:30:19',2,'2006-02-15 21:30:53'),(6452,'2005-07-12 00:57:31',109,388,'2005-07-14 20:41:31',1,'2006-02-15 21:30:53'),(6453,'2005-07-12 00:59:53',2506,169,'2005-07-14 19:17:53',2,'2006-02-15 21:30:53'),(6454,'2005-07-12 01:00:12',4028,446,'2005-07-16 22:12:12',1,'2006-02-15 21:30:53'),(6455,'2005-07-12 01:01:58',4267,277,'2005-07-16 02:42:58',2,'2006-02-15 21:30:53'),(6456,'2005-07-12 01:05:11',259,387,'2005-07-20 23:26:11',2,'2006-02-15 21:30:53'),(6457,'2005-07-12 01:06:35',2970,64,'2005-07-14 03:27:35',1,'2006-02-15 21:30:53'),(6458,'2005-07-12 01:08:52',2809,138,'2005-07-16 20:22:52',1,'2006-02-15 21:30:53'),(6459,'2005-07-12 01:12:03',4025,557,'2005-07-15 23:48:03',1,'2006-02-15 21:30:53'),(6460,'2005-07-12 01:13:44',2402,371,'2005-07-17 04:51:44',2,'2006-02-15 21:30:53'),(6461,'2005-07-12 01:14:03',1799,135,'2005-07-19 21:12:03',1,'2006-02-15 21:30:53'),(6462,'2005-07-12 01:15:24',4534,414,'2005-07-19 05:11:24',2,'2006-02-15 21:30:53'),(6463,'2005-07-12 01:16:11',2930,391,'2005-07-13 01:37:11',1,'2006-02-15 21:30:53'),(6464,'2005-07-12 01:16:40',3100,303,'2005-07-20 00:53:40',1,'2006-02-15 21:30:53'),(6465,'2005-07-12 01:17:11',2047,207,'2005-07-20 00:29:11',2,'2006-02-15 21:30:53'),(6466,'2005-07-12 01:21:03',3369,235,'2005-07-14 04:05:03',1,'2006-02-15 21:30:53'),(6467,'2005-07-12 01:22:03',2067,457,'2005-07-20 04:37:03',2,'2006-02-15 21:30:53'),(6468,'2005-07-12 01:27:09',4560,541,'2005-07-20 00:37:09',2,'2006-02-15 21:30:53'),(6469,'2005-07-12 01:29:27',3830,147,'2005-07-16 20:22:27',2,'2006-02-15 21:30:53'),(6470,'2005-07-12 01:29:41',1680,240,'2005-07-15 21:33:41',2,'2006-02-15 21:30:53'),(6471,'2005-07-12 01:31:06',2253,397,'2005-07-13 05:26:06',1,'2006-02-15 21:30:53'),(6472,'2005-07-12 01:33:25',3780,183,'2005-07-15 20:26:25',1,'2006-02-15 21:30:53'),(6473,'2005-07-12 01:35:40',527,594,'2005-07-20 20:11:40',1,'2006-02-15 21:30:53'),(6474,'2005-07-12 01:36:46',310,43,'2005-07-16 07:24:46',2,'2006-02-15 21:30:53'),(6475,'2005-07-12 01:36:57',2035,74,'2005-07-17 21:22:57',1,'2006-02-15 21:30:53'),(6476,'2005-07-12 01:37:48',978,28,'2005-07-12 20:21:48',2,'2006-02-15 21:30:53'),(6477,'2005-07-12 01:38:42',804,181,'2005-07-17 05:19:42',2,'2006-02-15 21:30:53'),(6478,'2005-07-12 01:41:44',2589,483,'2005-07-15 20:48:44',1,'2006-02-15 21:30:53'),(6479,'2005-07-12 01:49:00',2587,558,'2005-07-21 04:26:00',1,'2006-02-15 21:30:53'),(6480,'2005-07-12 01:49:29',3076,309,'2005-07-17 01:00:29',1,'2006-02-15 21:30:53'),(6481,'2005-07-12 01:50:15',2392,128,'2005-07-20 03:03:15',1,'2006-02-15 21:30:53'),(6482,'2005-07-12 01:50:21',4135,57,'2005-07-14 06:49:21',2,'2006-02-15 21:30:53'),(6483,'2005-07-12 01:59:20',1053,263,'2005-07-12 22:22:20',2,'2006-02-15 21:30:53'),(6484,'2005-07-12 02:04:10',4093,556,'2005-07-17 23:18:10',2,'2006-02-15 21:30:53'),(6485,'2005-07-12 02:07:59',1224,319,'2005-07-19 22:56:59',1,'2006-02-15 21:30:53'),(6486,'2005-07-12 02:09:36',4008,75,'2005-07-14 03:04:36',2,'2006-02-15 21:30:53'),(6487,'2005-07-12 02:17:00',4000,277,'2005-07-19 00:57:00',2,'2006-02-15 21:30:53'),(6488,'2005-07-12 02:20:09',3974,169,'2005-07-20 00:53:09',2,'2006-02-15 21:30:53'),(6489,'2005-07-12 02:22:46',1821,268,'2005-07-17 06:16:46',2,'2006-02-15 21:30:53'),(6490,'2005-07-12 02:28:03',2249,548,'2005-07-19 03:06:03',2,'2006-02-15 21:30:53'),(6491,'2005-07-12 02:28:31',2803,415,'2005-07-21 00:38:31',1,'2006-02-15 21:30:53'),(6492,'2005-07-12 02:28:40',466,590,'2005-07-17 05:58:40',2,'2006-02-15 21:30:53'),(6493,'2005-07-12 02:40:41',16,184,'2005-07-16 04:56:41',1,'2006-02-15 21:30:53'),(6494,'2005-07-12 02:42:51',1124,57,'2005-07-20 06:57:51',1,'2006-02-15 21:30:53'),(6495,'2005-07-12 02:57:02',2440,19,'2005-07-14 08:35:02',1,'2006-02-15 21:30:53'),(6496,'2005-07-12 02:57:39',3550,139,'2005-07-20 01:43:39',1,'2006-02-15 21:30:53'),(6497,'2005-07-12 03:04:29',933,222,'2005-07-17 21:36:29',2,'2006-02-15 21:30:53'),(6498,'2005-07-12 03:05:38',243,48,'2005-07-19 07:12:38',1,'2006-02-15 21:30:53'),(6499,'2005-07-12 03:11:18',3165,474,'2005-07-21 07:50:18',2,'2006-02-15 21:30:53'),(6500,'2005-07-12 03:11:23',4521,577,'2005-07-13 00:51:23',2,'2006-02-15 21:30:53'),(6501,'2005-07-12 03:11:55',2851,219,'2005-07-16 02:08:55',2,'2006-02-15 21:30:53'),(6502,'2005-07-12 03:15:45',1641,40,'2005-07-17 08:47:45',2,'2006-02-15 21:30:53'),(6503,'2005-07-12 03:18:07',1319,120,'2005-07-15 00:05:07',1,'2006-02-15 21:30:53'),(6504,'2005-07-12 03:19:14',3786,535,'2005-07-17 01:13:14',2,'2006-02-15 21:30:53'),(6505,'2005-07-12 03:27:37',3986,415,'2005-07-17 22:42:37',2,'2006-02-15 21:30:53'),(6506,'2005-07-12 03:28:22',386,423,'2005-07-17 22:43:22',1,'2006-02-15 21:30:53'),(6507,'2005-07-12 03:33:12',2463,118,'2005-07-20 03:56:12',1,'2006-02-15 21:30:53'),(6508,'2005-07-12 03:34:50',1474,597,'2005-07-17 02:57:50',2,'2006-02-15 21:30:53'),(6509,'2005-07-12 03:35:01',2468,427,'2005-07-13 06:50:01',2,'2006-02-15 21:30:53'),(6510,'2005-07-12 03:35:39',905,446,'2005-07-21 01:41:39',1,'2006-02-15 21:30:53'),(6511,'2005-07-12 03:39:29',1350,322,'2005-07-17 01:01:29',2,'2006-02-15 21:30:53'),(6512,'2005-07-12 03:42:49',1703,68,'2005-07-13 05:01:49',2,'2006-02-15 21:30:53'),(6513,'2005-07-12 03:44:43',2671,393,'2005-07-13 05:54:43',1,'2006-02-15 21:30:53'),(6514,'2005-07-12 03:47:44',3562,73,'2005-07-20 00:11:44',1,'2006-02-15 21:30:53'),(6515,'2005-07-12 03:50:32',706,261,'2005-07-15 03:54:32',2,'2006-02-15 21:30:53'),(6516,'2005-07-12 03:51:54',863,291,'2005-07-14 03:41:54',2,'2006-02-15 21:30:53'),(6517,'2005-07-12 03:52:39',185,387,'2005-07-20 08:00:39',1,'2006-02-15 21:30:53'),(6518,'2005-07-12 03:59:42',2698,288,'2005-07-19 22:21:42',2,'2006-02-15 21:30:53'),(6519,'2005-07-12 04:00:36',4149,598,'2005-07-19 01:15:36',1,'2006-02-15 21:30:53'),(6520,'2005-07-12 04:05:16',1535,270,'2005-07-15 08:26:16',1,'2006-02-15 21:30:53'),(6521,'2005-07-12 04:06:11',3293,49,'2005-07-21 05:50:11',1,'2006-02-15 21:30:53'),(6522,'2005-07-12 04:11:58',3916,142,'2005-07-15 08:32:58',1,'2006-02-15 21:30:53'),(6523,'2005-07-12 04:14:19',1848,574,'2005-07-17 00:38:19',1,'2006-02-15 21:30:53'),(6524,'2005-07-12 04:14:35',1467,376,'2005-07-17 03:59:35',2,'2006-02-15 21:30:53'),(6525,'2005-07-12 04:17:15',1408,103,'2005-07-18 23:11:15',1,'2006-02-15 21:30:53'),(6526,'2005-07-12 04:21:20',1718,225,'2005-07-18 23:45:20',2,'2006-02-15 21:30:53'),(6527,'2005-07-12 04:23:06',538,65,'2005-07-17 00:20:06',1,'2006-02-15 21:30:53'),(6528,'2005-07-12 04:29:44',3824,598,'2005-07-18 02:39:44',2,'2006-02-15 21:30:53'),(6529,'2005-07-12 04:31:04',1058,503,'2005-07-17 07:09:04',2,'2006-02-15 21:30:53'),(6530,'2005-07-12 04:33:19',3410,75,'2005-07-15 08:26:19',1,'2006-02-15 21:30:53'),(6531,'2005-07-12 04:35:24',4231,510,'2005-07-16 05:37:24',2,'2006-02-15 21:30:53'),(6532,'2005-07-12 04:38:32',2361,225,'2005-07-13 03:54:32',1,'2006-02-15 21:30:53'),(6533,'2005-07-12 04:39:38',3853,366,'2005-07-18 05:29:38',1,'2006-02-15 21:30:53'),(6534,'2005-07-12 04:39:43',2359,577,'2005-07-16 06:33:43',1,'2006-02-15 21:30:53'),(6535,'2005-07-12 04:43:43',1921,446,'2005-07-17 04:52:43',1,'2006-02-15 21:30:53'),(6536,'2005-07-12 04:44:25',3521,289,'2005-07-18 01:52:25',2,'2006-02-15 21:30:53'),(6537,'2005-07-12 04:46:30',3381,207,'2005-07-19 03:04:30',2,'2006-02-15 21:30:53'),(6538,'2005-07-12 04:50:26',1987,529,'2005-07-20 23:44:26',2,'2006-02-15 21:30:53'),(6539,'2005-07-12 04:50:49',2275,259,'2005-07-19 03:23:49',1,'2006-02-15 21:30:53'),(6540,'2005-07-12 04:51:13',937,156,'2005-07-21 03:38:13',1,'2006-02-15 21:30:53'),(6541,'2005-07-12 04:53:41',1795,529,'2005-07-17 23:17:41',2,'2006-02-15 21:30:53'),(6542,'2005-07-12 04:53:49',2421,359,'2005-07-13 01:48:49',1,'2006-02-15 21:30:53'),(6543,'2005-07-12 04:54:32',2568,264,'2005-07-15 09:50:32',2,'2006-02-15 21:30:53'),(6544,'2005-07-12 04:56:15',1218,97,'2005-07-17 08:28:15',1,'2006-02-15 21:30:53'),(6545,'2005-07-12 04:56:30',4447,376,'2005-07-20 05:41:30',1,'2006-02-15 21:30:53'),(6546,'2005-07-12 04:57:17',393,105,'2005-07-17 09:29:17',2,'2006-02-15 21:30:53'),(6547,'2005-07-12 04:57:46',2656,262,'2005-07-18 08:36:46',2,'2006-02-15 21:30:53'),(6548,'2005-07-12 05:00:46',2480,488,'2005-07-19 04:40:46',2,'2006-02-15 21:30:53'),(6549,'2005-07-12 05:02:01',2688,493,'2005-07-20 06:19:01',2,'2006-02-15 21:30:53'),(6550,'2005-07-12 05:03:14',2184,112,'2005-07-19 04:06:14',1,'2006-02-15 21:30:53'),(6551,'2005-07-12 05:03:43',282,567,'2005-07-13 10:44:43',1,'2006-02-15 21:30:53'),(6552,'2005-07-12 05:05:06',766,493,'2005-07-13 05:12:06',2,'2006-02-15 21:30:53'),(6553,'2005-07-12 05:06:39',1137,265,'2005-07-21 10:37:39',1,'2006-02-15 21:30:53'),(6554,'2005-07-12 05:07:26',2741,178,'2005-07-21 06:06:26',2,'2006-02-15 21:30:53'),(6555,'2005-07-12 05:08:16',1282,188,'2005-07-14 04:09:16',1,'2006-02-15 21:30:53'),(6556,'2005-07-12 05:10:16',3901,570,'2005-07-13 04:16:16',2,'2006-02-15 21:30:53'),(6557,'2005-07-12 05:12:03',1442,116,'2005-07-20 06:49:03',1,'2006-02-15 21:30:53'),(6558,'2005-07-12 05:16:07',2195,164,'2005-07-13 05:32:07',2,'2006-02-15 21:30:53'),(6559,'2005-07-12 05:20:35',458,353,'2005-07-16 08:44:35',2,'2006-02-15 21:30:53'),(6560,'2005-07-12 05:22:06',433,54,'2005-07-15 00:04:06',2,'2006-02-15 21:30:53'),(6561,'2005-07-12 05:24:02',4568,528,'2005-07-16 03:43:02',2,'2006-02-15 21:30:53'),(6562,'2005-07-12 05:26:26',3969,27,'2005-07-16 05:10:26',2,'2006-02-15 21:30:53'),(6563,'2005-07-12 05:34:09',87,438,'2005-07-21 07:37:09',1,'2006-02-15 21:30:53'),(6564,'2005-07-12 05:34:44',2320,210,'2005-07-18 06:12:44',2,'2006-02-15 21:30:53'),(6565,'2005-07-12 05:39:50',2751,35,'2005-07-13 01:07:50',2,'2006-02-15 21:30:53'),(6566,'2005-07-12 05:42:53',1822,178,'2005-07-19 01:23:53',2,'2006-02-15 21:30:53'),(6567,'2005-07-12 05:43:09',1336,198,'2005-07-19 08:18:09',2,'2006-02-15 21:30:53'),(6568,'2005-07-12 05:45:47',4203,13,'2005-07-15 05:18:47',2,'2006-02-15 21:30:53'),(6569,'2005-07-12 05:47:40',759,183,'2005-07-20 06:23:40',2,'2006-02-15 21:30:53'),(6570,'2005-07-12 05:50:31',2082,217,'2005-07-13 09:58:31',1,'2006-02-15 21:30:53'),(6571,'2005-07-12 05:51:47',3700,140,'2005-07-15 11:31:47',1,'2006-02-15 21:30:53'),(6572,'2005-07-12 05:56:38',3121,35,'2005-07-16 10:41:38',1,'2006-02-15 21:30:53'),(6573,'2005-07-12 06:03:40',3308,239,'2005-07-13 11:49:40',2,'2006-02-15 21:30:53'),(6574,'2005-07-12 06:04:22',621,115,'2005-07-18 03:19:22',2,'2006-02-15 21:30:53'),(6575,'2005-07-12 06:12:53',1414,598,'2005-07-18 07:55:53',2,'2006-02-15 21:30:53'),(6576,'2005-07-12 06:13:41',339,362,'2005-07-16 03:22:41',1,'2006-02-15 21:30:53'),(6577,'2005-07-12 06:15:05',4191,439,'2005-07-15 06:23:05',1,'2006-02-15 21:30:53'),(6578,'2005-07-12 06:15:41',2304,229,'2005-07-15 10:43:41',1,'2006-02-15 21:30:53'),(6580,'2005-07-12 06:26:10',1543,31,'2005-07-13 06:44:10',1,'2006-02-15 21:30:53'),(6581,'2005-07-12 06:26:49',2121,468,'2005-07-14 05:07:49',2,'2006-02-15 21:30:53'),(6582,'2005-07-12 06:28:12',2077,420,'2005-07-19 06:19:12',1,'2006-02-15 21:30:53'),(6583,'2005-07-12 06:42:31',2343,462,'2005-07-15 07:51:31',1,'2006-02-15 21:30:53'),(6584,'2005-07-12 06:43:36',1800,472,'2005-07-16 12:18:36',2,'2006-02-15 21:30:53'),(6585,'2005-07-12 06:50:52',2064,136,'2005-07-21 06:51:52',1,'2006-02-15 21:30:53'),(6586,'2005-07-12 06:56:24',3860,93,'2005-07-17 09:36:24',1,'2006-02-15 21:30:53'),(6587,'2005-07-12 06:56:26',238,419,'2005-07-20 05:53:26',2,'2006-02-15 21:30:53'),(6588,'2005-07-12 06:57:40',1257,420,'2005-07-16 04:27:40',1,'2006-02-15 21:30:53'),(6589,'2005-07-12 07:06:29',1595,424,'2005-07-14 12:06:29',2,'2006-02-15 21:30:53'),(6590,'2005-07-12 07:08:21',1067,442,'2005-07-18 06:16:21',2,'2006-02-15 21:30:53'),(6591,'2005-07-12 07:13:46',2846,509,'2005-07-16 05:15:46',2,'2006-02-15 21:30:53'),(6592,'2005-07-12 07:19:35',3481,273,'2005-07-19 07:15:35',1,'2006-02-15 21:30:53'),(6593,'2005-07-12 07:21:17',3441,356,'2005-07-14 02:35:17',2,'2006-02-15 21:30:53'),(6594,'2005-07-12 07:25:43',4458,517,'2005-07-13 07:59:43',1,'2006-02-15 21:30:53'),(6595,'2005-07-12 07:25:48',1286,458,'2005-07-20 02:24:48',2,'2006-02-15 21:30:53'),(6596,'2005-07-12 07:32:59',890,409,'2005-07-13 02:47:59',1,'2006-02-15 21:30:53'),(6597,'2005-07-12 07:37:02',979,479,'2005-07-16 10:24:02',2,'2006-02-15 21:30:53'),(6598,'2005-07-12 07:38:25',2049,532,'2005-07-19 07:58:25',1,'2006-02-15 21:30:53'),(6599,'2005-07-12 07:41:14',4348,519,'2005-07-21 02:45:14',2,'2006-02-15 21:30:53'),(6600,'2005-07-12 07:41:48',3315,389,'2005-07-18 12:36:48',2,'2006-02-15 21:30:53'),(6601,'2005-07-12 07:44:49',1640,464,'2005-07-20 03:22:49',2,'2006-02-15 21:30:53'),(6602,'2005-07-12 07:50:24',2382,214,'2005-07-20 03:25:24',2,'2006-02-15 21:30:53'),(6603,'2005-07-12 07:52:55',3583,425,'2005-07-16 13:19:55',2,'2006-02-15 21:30:53'),(6604,'2005-07-12 07:57:45',822,365,'2005-07-16 05:41:45',2,'2006-02-15 21:30:53'),(6605,'2005-07-12 08:01:07',2892,547,'2005-07-19 03:12:07',1,'2006-02-15 21:30:53'),(6606,'2005-07-12 08:03:40',2805,178,'2005-07-13 09:05:40',1,'2006-02-15 21:30:53'),(6607,'2005-07-12 08:08:50',337,562,'2005-07-20 09:17:50',1,'2006-02-15 21:30:53'),(6608,'2005-07-12 08:16:50',3577,244,'2005-07-18 07:08:50',2,'2006-02-15 21:30:53'),(6609,'2005-07-12 08:19:41',3332,133,'2005-07-19 08:19:41',2,'2006-02-15 21:30:53'),(6610,'2005-07-12 08:20:02',645,353,'2005-07-21 09:16:02',2,'2006-02-15 21:30:53'),(6611,'2005-07-12 08:20:23',1604,286,'2005-07-16 07:19:23',1,'2006-02-15 21:30:53'),(6612,'2005-07-12 08:28:33',235,152,'2005-07-17 06:25:33',1,'2006-02-15 21:30:53'),(6613,'2005-07-12 08:30:07',3421,460,'2005-07-14 10:25:07',2,'2006-02-15 21:30:53'),(6614,'2005-07-12 08:33:49',3004,144,'2005-07-18 07:28:49',2,'2006-02-15 21:30:53'),(6615,'2005-07-12 08:36:22',23,438,'2005-07-20 09:03:22',1,'2006-02-15 21:30:53'),(6616,'2005-07-12 08:37:30',1833,179,'2005-07-20 10:33:30',1,'2006-02-15 21:30:53'),(6617,'2005-07-12 08:39:56',2292,248,'2005-07-14 09:32:56',2,'2006-02-15 21:30:53'),(6618,'2005-07-12 08:41:42',4266,327,'2005-07-14 05:34:42',1,'2006-02-15 21:30:53'),(6619,'2005-07-12 08:50:48',4062,305,'2005-07-14 11:54:48',1,'2006-02-15 21:30:53'),(6620,'2005-07-12 08:51:03',2362,337,'2005-07-16 03:59:03',2,'2006-02-15 21:30:53'),(6621,'2005-07-12 08:57:30',2229,561,'2005-07-14 09:47:30',1,'2006-02-15 21:30:53'),(6622,'2005-07-12 09:04:11',4350,325,'2005-07-13 04:27:11',1,'2006-02-15 21:30:53'),(6623,'2005-07-12 09:05:34',4412,302,'2005-07-19 13:54:34',2,'2006-02-15 21:30:53'),(6624,'2005-07-12 09:05:50',3946,335,'2005-07-18 13:59:50',2,'2006-02-15 21:30:53'),(6625,'2005-07-12 09:06:40',735,443,'2005-07-21 04:57:40',2,'2006-02-15 21:30:53'),(6626,'2005-07-12 09:16:24',2418,269,'2005-07-17 04:06:24',2,'2006-02-15 21:30:53'),(6627,'2005-07-12 09:16:46',626,565,'2005-07-17 10:58:46',1,'2006-02-15 21:30:53'),(6628,'2005-07-12 09:18:08',2894,211,'2005-07-21 04:27:08',2,'2006-02-15 21:30:53'),(6629,'2005-07-12 09:18:35',2855,582,'2005-07-20 11:34:35',2,'2006-02-15 21:30:53'),(6630,'2005-07-12 09:30:05',1843,462,'2005-07-14 08:29:05',2,'2006-02-15 21:30:53'),(6631,'2005-07-12 09:31:43',2340,204,'2005-07-15 05:00:43',2,'2006-02-15 21:30:53'),(6632,'2005-07-12 09:33:10',2929,442,'2005-07-15 11:36:10',1,'2006-02-15 21:30:53'),(6633,'2005-07-12 09:35:42',2908,150,'2005-07-13 12:56:42',2,'2006-02-15 21:30:53'),(6634,'2005-07-12 09:37:18',2943,50,'2005-07-13 09:28:18',1,'2006-02-15 21:30:53'),(6635,'2005-07-12 09:47:58',515,273,'2005-07-16 15:43:58',1,'2006-02-15 21:30:53'),(6636,'2005-07-12 09:49:46',3270,441,'2005-07-14 12:15:46',1,'2006-02-15 21:30:53'),(6637,'2005-07-12 09:57:39',2852,164,'2005-07-19 08:40:39',1,'2006-02-15 21:30:53'),(6638,'2005-07-12 09:58:02',207,87,'2005-07-13 09:40:02',1,'2006-02-15 21:30:53'),(6639,'2005-07-12 10:00:44',3385,587,'2005-07-19 04:56:44',1,'2006-02-15 21:30:53'),(6640,'2005-07-12 10:27:19',2794,148,'2005-07-21 06:28:19',2,'2006-02-15 21:30:53'),(6641,'2005-07-12 10:33:14',2165,334,'2005-07-20 08:24:14',2,'2006-02-15 21:30:53'),(6642,'2005-07-12 10:37:52',201,441,'2005-07-13 15:13:52',1,'2006-02-15 21:30:53'),(6643,'2005-07-12 10:39:22',174,88,'2005-07-18 13:52:22',1,'2006-02-15 21:30:53'),(6644,'2005-07-12 10:39:39',2667,285,'2005-07-14 11:50:39',1,'2006-02-15 21:30:53'),(6645,'2005-07-12 10:39:55',2858,73,'2005-07-17 07:41:55',1,'2006-02-15 21:30:53'),(6646,'2005-07-12 10:41:34',4061,508,'2005-07-15 05:31:34',1,'2006-02-15 21:30:53'),(6647,'2005-07-12 10:43:53',1841,8,'2005-07-14 05:37:53',1,'2006-02-15 21:30:53'),(6648,'2005-07-12 10:46:30',718,356,'2005-07-14 16:15:30',1,'2006-02-15 21:30:53'),(6649,'2005-07-12 10:51:09',70,57,'2005-07-14 16:05:09',2,'2006-02-15 21:30:53'),(6650,'2005-07-12 10:57:10',1589,526,'2005-07-14 07:24:10',1,'2006-02-15 21:30:53'),(6651,'2005-07-12 10:57:28',98,447,'2005-07-15 06:06:28',2,'2006-02-15 21:30:53'),(6652,'2005-07-12 10:59:38',2200,518,'2005-07-13 13:52:38',1,'2006-02-15 21:30:53'),(6653,'2005-07-12 11:06:17',614,25,'2005-07-19 16:52:17',2,'2006-02-15 21:30:53'),(6654,'2005-07-12 11:06:28',2870,458,'2005-07-20 10:27:28',1,'2006-02-15 21:30:53'),(6655,'2005-07-12 11:08:32',3937,100,'2005-07-15 15:17:32',1,'2006-02-15 21:30:53'),(6656,'2005-07-12 11:09:47',2282,330,'2005-07-14 05:50:47',1,'2006-02-15 21:30:53'),(6657,'2005-07-12 11:11:36',3697,553,'2005-07-16 15:56:36',1,'2006-02-15 21:30:53'),(6658,'2005-07-12 11:13:21',172,27,'2005-07-17 09:10:21',2,'2006-02-15 21:30:53'),(6659,'2005-07-12 11:18:05',2285,134,'2005-07-16 16:45:05',2,'2006-02-15 21:30:53'),(6660,'2005-07-12 11:20:12',446,598,'2005-07-20 12:58:12',2,'2006-02-15 21:30:53'),(6661,'2005-07-12 11:20:39',2367,315,'2005-07-16 08:17:39',2,'2006-02-15 21:30:53'),(6662,'2005-07-12 11:21:06',1464,99,'2005-07-13 13:00:06',1,'2006-02-15 21:30:53'),(6663,'2005-07-12 11:27:35',4364,5,'2005-07-21 16:35:35',1,'2006-02-15 21:30:53'),(6664,'2005-07-12 11:28:22',4578,351,'2005-07-15 09:30:22',1,'2006-02-15 21:30:53'),(6665,'2005-07-12 11:29:14',2912,587,'2005-07-19 11:26:14',2,'2006-02-15 21:30:53'),(6666,'2005-07-12 11:32:15',3194,314,'2005-07-14 16:09:15',2,'2006-02-15 21:30:53'),(6667,'2005-07-12 11:36:22',215,50,'2005-07-19 12:53:22',1,'2006-02-15 21:30:53'),(6668,'2005-07-12 11:37:45',1498,199,'2005-07-14 13:28:45',2,'2006-02-15 21:30:53'),(6669,'2005-07-12 11:39:55',1420,355,'2005-07-20 05:56:55',1,'2006-02-15 21:30:53'),(6670,'2005-07-12 11:44:33',3106,249,'2005-07-19 07:54:33',2,'2006-02-15 21:30:53'),(6671,'2005-07-12 11:48:48',955,526,'2005-07-19 16:55:48',2,'2006-02-15 21:30:53'),(6672,'2005-07-12 11:49:16',375,439,'2005-07-13 07:03:16',2,'2006-02-15 21:30:53'),(6673,'2005-07-12 11:50:56',1997,322,'2005-07-13 14:27:56',1,'2006-02-15 21:30:53'),(6674,'2005-07-12 11:51:54',2385,399,'2005-07-13 16:57:54',1,'2006-02-15 21:30:53'),(6675,'2005-07-12 11:53:06',2124,523,'2005-07-13 06:09:06',1,'2006-02-15 21:30:53'),(6676,'2005-07-12 11:53:40',2294,571,'2005-07-19 09:15:40',1,'2006-02-15 21:30:53'),(6677,'2005-07-12 11:58:14',2389,516,'2005-07-21 06:05:14',2,'2006-02-15 21:30:53'),(6678,'2005-07-12 11:58:36',3473,330,'2005-07-15 17:50:36',2,'2006-02-15 21:30:53'),(6679,'2005-07-12 12:01:07',3664,586,'2005-07-14 11:36:07',1,'2006-02-15 21:30:53'),(6680,'2005-07-12 12:01:56',2887,43,'2005-07-16 17:32:56',1,'2006-02-15 21:30:53'),(6681,'2005-07-12 12:04:12',854,368,'2005-07-19 11:01:12',2,'2006-02-15 21:30:53'),(6682,'2005-07-12 12:12:43',1984,339,'2005-07-21 10:49:43',2,'2006-02-15 21:30:53'),(6683,'2005-07-12 12:14:05',3433,244,'2005-07-17 14:02:05',2,'2006-02-15 21:30:53'),(6684,'2005-07-12 12:14:42',2817,583,'2005-07-21 11:07:42',2,'2006-02-15 21:30:53'),(6685,'2005-07-12 12:16:28',1434,5,'2005-07-19 17:03:28',1,'2006-02-15 21:30:53'),(6686,'2005-07-12 12:18:38',3804,6,'2005-07-13 17:56:38',2,'2006-02-15 21:30:53'),(6687,'2005-07-12 12:19:23',2736,128,'2005-07-19 17:12:23',1,'2006-02-15 21:30:53'),(6688,'2005-07-12 12:22:12',2377,246,'2005-07-14 14:05:12',1,'2006-02-15 21:30:53'),(6689,'2005-07-12 12:22:13',1568,525,'2005-07-16 07:44:13',1,'2006-02-15 21:30:53'),(6690,'2005-07-12 12:23:02',4254,447,'2005-07-16 15:39:02',2,'2006-02-15 21:30:53'),(6691,'2005-07-12 12:26:38',403,192,'2005-07-18 13:26:38',2,'2006-02-15 21:30:53'),(6692,'2005-07-12 12:35:39',2837,372,'2005-07-20 11:20:39',2,'2006-02-15 21:30:53'),(6693,'2005-07-12 12:37:00',2014,573,'2005-07-20 09:36:00',1,'2006-02-15 21:30:53'),(6694,'2005-07-12 12:39:23',586,204,'2005-07-19 14:47:23',1,'2006-02-15 21:30:53'),(6695,'2005-07-12 12:39:39',3088,550,'2005-07-17 13:36:39',2,'2006-02-15 21:30:53'),(6696,'2005-07-12 12:44:04',299,273,'2005-07-16 14:17:04',1,'2006-02-15 21:30:53'),(6697,'2005-07-12 12:44:57',210,103,'2005-07-19 13:02:57',1,'2006-02-15 21:30:53'),(6698,'2005-07-12 12:45:00',4419,64,'2005-07-16 11:16:00',2,'2006-02-15 21:30:53'),(6699,'2005-07-12 12:45:21',3411,565,'2005-07-15 12:59:21',1,'2006-02-15 21:30:53'),(6700,'2005-07-12 12:47:22',3063,184,'2005-07-21 16:04:22',1,'2006-02-15 21:30:53'),(6701,'2005-07-12 12:47:59',3428,454,'2005-07-13 10:28:59',1,'2006-02-15 21:30:53'),(6702,'2005-07-12 12:48:03',233,164,'2005-07-13 11:55:03',1,'2006-02-15 21:30:53'),(6703,'2005-07-12 12:50:19',46,470,'2005-07-16 13:41:19',1,'2006-02-15 21:30:53'),(6704,'2005-07-12 12:50:24',1590,595,'2005-07-20 16:41:24',2,'2006-02-15 21:30:53'),(6705,'2005-07-12 12:53:11',4268,363,'2005-07-13 07:17:11',1,'2006-02-15 21:30:53'),(6706,'2005-07-12 12:59:16',4552,267,'2005-07-19 10:37:16',1,'2006-02-15 21:30:53'),(6707,'2005-07-12 13:07:55',406,80,'2005-07-16 16:26:55',2,'2006-02-15 21:30:53'),(6708,'2005-07-12 13:10:55',372,82,'2005-07-21 07:36:55',1,'2006-02-15 21:30:53'),(6709,'2005-07-12 13:20:41',4049,322,'2005-07-16 10:37:41',2,'2006-02-15 21:30:53'),(6710,'2005-07-12 13:23:09',806,462,'2005-07-20 10:10:09',2,'2006-02-15 21:30:53'),(6711,'2005-07-12 13:23:40',2247,257,'2005-07-20 11:45:40',2,'2006-02-15 21:30:53'),(6712,'2005-07-12 13:24:47',4581,226,'2005-07-20 09:35:47',2,'2006-02-15 21:30:53'),(6713,'2005-07-12 13:27:36',4218,557,'2005-07-16 11:14:36',1,'2006-02-15 21:30:53'),(6714,'2005-07-12 13:29:06',1947,370,'2005-07-18 16:02:06',2,'2006-02-15 21:30:53'),(6715,'2005-07-12 13:32:28',643,386,'2005-07-15 17:01:28',2,'2006-02-15 21:30:53'),(6716,'2005-07-12 13:34:58',2783,367,'2005-07-19 15:09:58',1,'2006-02-15 21:30:53'),(6717,'2005-07-12 13:35:02',523,273,'2005-07-20 15:03:02',1,'2006-02-15 21:30:53'),(6718,'2005-07-12 13:38:06',2283,541,'2005-07-18 09:05:06',1,'2006-02-15 21:30:53'),(6719,'2005-07-12 13:40:37',739,330,'2005-07-15 15:23:37',2,'2006-02-15 21:30:53'),(6720,'2005-07-12 13:41:16',2704,151,'2005-07-13 14:41:16',2,'2006-02-15 21:30:53'),(6721,'2005-07-12 13:42:58',2798,462,'2005-07-19 16:39:58',2,'2006-02-15 21:30:53'),(6722,'2005-07-12 13:44:03',3124,211,'2005-07-19 12:43:03',2,'2006-02-15 21:30:53'),(6723,'2005-07-12 13:44:57',2678,499,'2005-07-14 15:57:57',2,'2006-02-15 21:30:53'),(6724,'2005-07-12 13:45:15',2486,262,'2005-07-19 19:18:15',1,'2006-02-15 21:30:53'),(6725,'2005-07-12 13:47:17',831,213,'2005-07-17 13:31:17',1,'2006-02-15 21:30:53'),(6726,'2005-07-12 13:48:14',4494,97,'2005-07-16 11:11:14',1,'2006-02-15 21:30:53'),(6727,'2005-07-12 13:54:25',3793,407,'2005-07-14 17:29:25',1,'2006-02-15 21:30:53'),(6728,'2005-07-12 13:56:48',2113,414,'2005-07-15 18:49:48',1,'2006-02-15 21:30:53'),(6729,'2005-07-12 13:58:23',2495,455,'2005-07-19 09:34:23',2,'2006-02-15 21:30:53'),(6730,'2005-07-12 13:58:25',1552,532,'2005-07-20 13:01:25',1,'2006-02-15 21:30:53'),(6731,'2005-07-12 13:58:27',844,593,'2005-07-15 10:04:27',2,'2006-02-15 21:30:53'),(6732,'2005-07-12 13:58:51',1913,299,'2005-07-17 17:42:51',1,'2006-02-15 21:30:53'),(6733,'2005-07-12 14:04:01',1476,585,'2005-07-21 18:57:01',2,'2006-02-15 21:30:53'),(6734,'2005-07-12 14:04:24',2248,446,'2005-07-21 19:47:24',1,'2006-02-15 21:30:53'),(6735,'2005-07-12 14:08:20',276,428,'2005-07-18 09:41:20',2,'2006-02-15 21:30:53'),(6736,'2005-07-12 14:16:50',530,342,'2005-07-15 16:26:50',1,'2006-02-15 21:30:53'),(6737,'2005-07-12 14:16:52',315,304,'2005-07-18 19:48:52',1,'2006-02-15 21:30:53'),(6738,'2005-07-12 14:17:55',1197,366,'2005-07-21 10:11:55',2,'2006-02-15 21:30:53'),(6739,'2005-07-12 14:22:08',1221,71,'2005-07-18 16:57:08',2,'2006-02-15 21:30:53'),(6740,'2005-07-12 14:22:08',2431,139,'2005-07-14 14:35:08',1,'2006-02-15 21:30:53'),(6741,'2005-07-12 14:24:16',237,359,'2005-07-15 08:31:16',1,'2006-02-15 21:30:53'),(6742,'2005-07-12 14:25:31',4242,558,'2005-07-17 08:50:31',2,'2006-02-15 21:30:53'),(6743,'2005-07-12 14:29:25',158,261,'2005-07-13 13:13:25',1,'2006-02-15 21:30:53'),(6744,'2005-07-12 14:30:28',2565,64,'2005-07-14 16:20:28',1,'2006-02-15 21:30:53'),(6745,'2005-07-12 14:30:51',1331,524,'2005-07-13 13:42:51',2,'2006-02-15 21:30:53'),(6746,'2005-07-12 14:33:01',3127,537,'2005-07-17 19:52:01',2,'2006-02-15 21:30:53'),(6747,'2005-07-12 14:33:21',3651,126,'2005-07-13 09:59:21',2,'2006-02-15 21:30:53'),(6748,'2005-07-12 14:39:27',3655,540,'2005-07-18 13:40:27',2,'2006-02-15 21:30:53'),(6749,'2005-07-12 14:43:05',2895,334,'2005-07-21 15:13:05',2,'2006-02-15 21:30:53'),(6750,'2005-07-12 14:49:39',3838,459,'2005-07-18 18:43:39',2,'2006-02-15 21:30:53'),(6751,'2005-07-12 14:50:34',1749,312,'2005-07-15 19:39:34',2,'2006-02-15 21:30:53'),(6752,'2005-07-12 14:53:15',3392,453,'2005-07-20 09:23:15',1,'2006-02-15 21:30:53'),(6753,'2005-07-12 14:55:42',2591,147,'2005-07-18 19:16:42',1,'2006-02-15 21:30:53'),(6754,'2005-07-12 14:59:24',1460,114,'2005-07-14 11:04:24',2,'2006-02-15 21:30:53'),(6755,'2005-07-12 15:07:49',2542,126,'2005-07-21 18:43:49',2,'2006-02-15 21:30:53'),(6756,'2005-07-12 15:08:28',1174,531,'2005-07-13 14:25:28',2,'2006-02-15 21:30:53'),(6757,'2005-07-12 15:09:48',547,558,'2005-07-17 15:04:48',2,'2006-02-15 21:30:53'),(6758,'2005-07-12 15:13:49',4098,546,'2005-07-20 09:31:49',2,'2006-02-15 21:30:53'),(6759,'2005-07-12 15:14:48',3624,49,'2005-07-15 11:29:48',1,'2006-02-15 21:30:53'),(6760,'2005-07-12 15:16:00',501,502,'2005-07-20 13:20:00',2,'2006-02-15 21:30:53'),(6761,'2005-07-12 15:17:42',3645,7,'2005-07-18 17:59:42',2,'2006-02-15 21:30:53'),(6762,'2005-07-12 15:25:33',3857,262,'2005-07-21 18:57:33',1,'2006-02-15 21:30:53'),(6763,'2005-07-12 15:26:34',3364,314,'2005-07-18 16:38:34',2,'2006-02-15 21:30:53'),(6764,'2005-07-12 15:29:27',4407,396,'2005-07-21 20:00:27',2,'2006-02-15 21:30:53'),(6765,'2005-07-12 15:30:47',2571,433,'2005-07-19 14:19:47',2,'2006-02-15 21:30:53'),(6766,'2005-07-12 15:32:01',3615,171,'2005-07-18 14:03:01',2,'2006-02-15 21:30:53'),(6767,'2005-07-12 15:46:55',1819,208,'2005-07-17 17:36:55',2,'2006-02-15 21:30:53'),(6768,'2005-07-12 15:47:51',3418,151,'2005-07-19 21:17:51',2,'2006-02-15 21:30:53'),(6769,'2005-07-12 15:48:54',1687,63,'2005-07-21 14:39:54',2,'2006-02-15 21:30:53'),(6770,'2005-07-12 15:49:40',2080,360,'2005-07-20 10:14:40',2,'2006-02-15 21:30:53'),(6771,'2005-07-12 15:54:40',1113,396,'2005-07-17 15:56:40',2,'2006-02-15 21:30:53'),(6772,'2005-07-12 15:55:35',3810,89,'2005-07-18 10:47:35',1,'2006-02-15 21:30:53'),(6773,'2005-07-12 15:55:39',3346,12,'2005-07-18 17:52:39',2,'2006-02-15 21:30:53'),(6774,'2005-07-12 15:56:08',868,171,'2005-07-13 18:42:08',1,'2006-02-15 21:30:53'),(6775,'2005-07-12 16:01:44',2909,383,'2005-07-19 14:11:44',1,'2006-02-15 21:30:53'),(6776,'2005-07-12 16:02:09',2398,348,'2005-07-20 16:31:09',1,'2006-02-15 21:30:53'),(6777,'2005-07-12 16:04:40',4089,351,'2005-07-20 15:05:40',2,'2006-02-15 21:30:53'),(6778,'2005-07-12 16:06:00',4503,381,'2005-07-14 21:57:00',2,'2006-02-15 21:30:53'),(6779,'2005-07-12 16:10:50',4468,404,'2005-07-17 14:51:50',2,'2006-02-15 21:30:53'),(6780,'2005-07-12 16:18:12',1255,121,'2005-07-13 17:56:12',2,'2006-02-15 21:30:53'),(6781,'2005-07-12 16:21:47',3783,533,'2005-07-15 19:52:47',1,'2006-02-15 21:30:53'),(6782,'2005-07-12 16:23:25',2742,199,'2005-07-20 18:46:25',2,'2006-02-15 21:30:53'),(6783,'2005-07-12 16:27:56',3633,506,'2005-07-13 12:11:56',2,'2006-02-15 21:30:53'),(6784,'2005-07-12 16:28:49',197,578,'2005-07-15 17:27:49',1,'2006-02-15 21:30:53'),(6785,'2005-07-12 16:30:57',4448,69,'2005-07-18 20:46:57',1,'2006-02-15 21:30:53'),(6786,'2005-07-12 16:32:33',2011,546,'2005-07-16 12:42:33',2,'2006-02-15 21:30:53'),(6787,'2005-07-12 16:33:28',1481,342,'2005-07-18 21:48:28',2,'2006-02-15 21:30:53'),(6788,'2005-07-12 16:33:44',1162,460,'2005-07-20 15:38:44',2,'2006-02-15 21:30:53'),(6789,'2005-07-12 16:34:40',1973,76,'2005-07-14 17:02:40',2,'2006-02-15 21:30:53'),(6790,'2005-07-12 16:34:59',4486,400,'2005-07-17 21:43:59',2,'2006-02-15 21:30:53'),(6791,'2005-07-12 16:35:07',1495,144,'2005-07-20 15:32:07',2,'2006-02-15 21:30:53'),(6792,'2005-07-12 16:37:28',510,571,'2005-07-20 11:20:28',2,'2006-02-15 21:30:53'),(6793,'2005-07-12 16:37:55',103,148,'2005-07-21 16:04:55',2,'2006-02-15 21:30:53'),(6794,'2005-07-12 16:38:23',813,233,'2005-07-20 17:36:23',2,'2006-02-15 21:30:53'),(6795,'2005-07-12 16:41:00',1489,245,'2005-07-21 20:52:00',1,'2006-02-15 21:30:53'),(6796,'2005-07-12 16:44:16',227,291,'2005-07-16 14:48:16',2,'2006-02-15 21:30:53'),(6797,'2005-07-12 16:47:06',1536,469,'2005-07-14 14:38:06',2,'2006-02-15 21:30:53'),(6798,'2005-07-12 16:49:11',275,115,'2005-07-19 12:11:11',2,'2006-02-15 21:30:53'),(6799,'2005-07-12 16:52:13',2778,42,'2005-07-14 15:11:13',2,'2006-02-15 21:30:53'),(6800,'2005-07-12 17:03:56',3742,599,'2005-07-21 20:32:56',2,'2006-02-15 21:30:53'),(6801,'2005-07-12 17:09:08',872,500,'2005-07-21 22:25:08',1,'2006-02-15 21:30:53'),(6802,'2005-07-12 17:14:17',2942,298,'2005-07-17 11:54:17',2,'2006-02-15 21:30:53'),(6803,'2005-07-12 17:21:49',2676,490,'2005-07-14 18:01:49',2,'2006-02-15 21:30:53'),(6804,'2005-07-12 17:22:06',1554,269,'2005-07-21 11:37:06',1,'2006-02-15 21:30:53'),(6805,'2005-07-12 17:23:01',1758,262,'2005-07-21 19:38:01',2,'2006-02-15 21:30:53'),(6806,'2005-07-12 17:31:43',656,179,'2005-07-17 14:36:43',1,'2006-02-15 21:30:53'),(6807,'2005-07-12 17:33:53',669,376,'2005-07-18 16:28:53',2,'2006-02-15 21:30:53'),(6808,'2005-07-12 17:36:42',362,263,'2005-07-18 23:33:42',2,'2006-02-15 21:30:53'),(6809,'2005-07-12 17:51:54',3455,168,'2005-07-17 15:10:54',1,'2006-02-15 21:30:53'),(6810,'2005-07-12 17:54:19',2802,485,'2005-07-20 16:58:19',2,'2006-02-15 21:30:53'),(6811,'2005-07-12 17:54:33',1572,107,'2005-07-20 17:39:33',1,'2006-02-15 21:30:53'),(6812,'2005-07-12 18:03:25',2227,553,'2005-07-20 18:33:25',2,'2006-02-15 21:30:53'),(6813,'2005-07-12 18:03:50',135,54,'2005-07-16 16:30:50',1,'2006-02-15 21:30:53'),(6814,'2005-07-12 18:11:58',1863,579,'2005-07-18 20:37:58',2,'2006-02-15 21:30:53'),(6815,'2005-07-12 18:14:10',3236,468,'2005-07-17 14:16:10',1,'2006-02-15 21:30:53'),(6816,'2005-07-12 18:18:50',2963,290,'2005-07-18 21:09:50',2,'2006-02-15 21:30:53'),(6817,'2005-07-12 18:19:57',184,135,'2005-07-19 22:53:57',1,'2006-02-15 21:30:53'),(6818,'2005-07-12 18:20:54',1013,153,'2005-07-21 00:03:54',2,'2006-02-15 21:30:53'),(6819,'2005-07-12 18:21:01',1253,198,'2005-07-13 21:14:01',1,'2006-02-15 21:30:53'),(6820,'2005-07-12 18:21:30',223,243,'2005-07-14 15:14:30',1,'2006-02-15 21:30:53'),(6821,'2005-07-12 18:22:10',623,363,'2005-07-14 13:25:10',2,'2006-02-15 21:30:53'),(6822,'2005-07-12 18:23:39',1592,300,'2005-07-19 21:06:39',1,'2006-02-15 21:30:53'),(6823,'2005-07-12 18:24:31',795,557,'2005-07-17 23:13:31',1,'2006-02-15 21:30:53'),(6824,'2005-07-12 18:26:46',858,579,'2005-07-21 15:23:46',1,'2006-02-15 21:30:53'),(6825,'2005-07-12 18:28:12',2342,281,'2005-07-15 19:24:12',1,'2006-02-15 21:30:53'),(6826,'2005-07-12 18:32:02',1708,408,'2005-07-16 23:21:02',1,'2006-02-15 21:30:53'),(6827,'2005-07-12 18:33:45',1529,283,'2005-07-13 19:09:45',1,'2006-02-15 21:30:53'),(6828,'2005-07-12 18:38:51',874,502,'2005-07-14 20:10:51',1,'2006-02-15 21:30:53'),(6829,'2005-07-12 18:38:59',4184,361,'2005-07-16 23:25:59',1,'2006-02-15 21:30:53'),(6830,'2005-07-12 18:42:55',1943,578,'2005-07-17 17:58:55',1,'2006-02-15 21:30:53'),(6831,'2005-07-12 18:44:04',924,163,'2005-07-16 21:39:04',2,'2006-02-15 21:30:53'),(6832,'2005-07-12 18:51:41',444,220,'2005-07-20 13:29:41',2,'2006-02-15 21:30:53'),(6833,'2005-07-12 18:53:34',912,301,'2005-07-19 22:21:34',2,'2006-02-15 21:30:53'),(6834,'2005-07-12 18:53:37',897,533,'2005-07-19 13:42:37',1,'2006-02-15 21:30:53'),(6835,'2005-07-12 18:58:03',1444,367,'2005-07-18 00:41:03',1,'2006-02-15 21:30:53'),(6836,'2005-07-12 18:58:05',2744,113,'2005-07-15 17:45:05',1,'2006-02-15 21:30:53'),(6837,'2005-07-12 18:59:45',1203,533,'2005-07-21 22:47:45',2,'2006-02-15 21:30:53'),(6838,'2005-07-12 19:01:30',3492,354,'2005-07-17 23:42:30',1,'2006-02-15 21:30:53'),(6839,'2005-07-12 19:03:19',3900,357,'2005-07-15 23:48:19',1,'2006-02-15 21:30:53'),(6840,'2005-07-12 19:03:22',1381,323,'2005-07-21 18:34:22',2,'2006-02-15 21:30:53'),(6841,'2005-07-12 19:04:24',2265,108,'2005-07-14 23:58:24',1,'2006-02-15 21:30:53'),(6842,'2005-07-12 19:07:55',3376,366,'2005-07-19 22:47:55',1,'2006-02-15 21:30:53'),(6843,'2005-07-12 19:14:05',746,561,'2005-07-20 23:15:05',1,'2006-02-15 21:30:53'),(6844,'2005-07-12 19:14:53',3211,482,'2005-07-18 16:07:53',2,'2006-02-15 21:30:53'),(6845,'2005-07-12 19:20:41',3833,414,'2005-07-14 15:27:41',1,'2006-02-15 21:30:53'),(6846,'2005-07-12 19:20:45',1214,18,'2005-07-17 00:06:45',1,'2006-02-15 21:30:53'),(6847,'2005-07-12 19:22:37',346,63,'2005-07-21 18:53:37',2,'2006-02-15 21:30:53'),(6848,'2005-07-12 19:24:07',1782,433,'2005-07-14 17:03:07',1,'2006-02-15 21:30:53'),(6849,'2005-07-12 19:29:19',4307,479,'2005-07-19 22:03:19',1,'2006-02-15 21:30:53'),(6850,'2005-07-12 19:30:42',1145,433,'2005-07-17 21:26:42',2,'2006-02-15 21:30:53'),(6851,'2005-07-12 19:32:14',664,280,'2005-07-17 21:03:14',1,'2006-02-15 21:30:53'),(6852,'2005-07-12 19:33:49',2182,75,'2005-07-13 20:01:49',2,'2006-02-15 21:30:53'),(6853,'2005-07-12 19:38:11',4006,299,'2005-07-20 00:14:11',1,'2006-02-15 21:30:53'),(6854,'2005-07-12 19:38:57',3173,151,'2005-07-16 16:28:57',1,'2006-02-15 21:30:53'),(6855,'2005-07-12 19:46:29',2657,24,'2005-07-15 16:56:29',2,'2006-02-15 21:30:53'),(6856,'2005-07-12 19:50:16',4338,275,'2005-07-14 22:25:16',1,'2006-02-15 21:30:53'),(6857,'2005-07-12 19:53:30',424,196,'2005-07-13 15:22:30',1,'2006-02-15 21:30:53'),(6858,'2005-07-12 19:53:51',1095,516,'2005-07-19 14:12:51',1,'2006-02-15 21:30:53'),(6859,'2005-07-12 19:53:57',4108,321,'2005-07-17 19:48:57',2,'2006-02-15 21:30:53'),(6860,'2005-07-12 19:54:17',2907,91,'2005-07-18 13:59:17',1,'2006-02-15 21:30:53'),(6861,'2005-07-12 19:56:52',354,83,'2005-07-13 16:02:52',1,'2006-02-15 21:30:53'),(6862,'2005-07-12 19:58:09',3477,231,'2005-07-18 15:48:09',2,'2006-02-15 21:30:53'),(6863,'2005-07-12 19:58:34',229,484,'2005-07-21 16:57:34',1,'2006-02-15 21:30:53'),(6864,'2005-07-12 19:59:25',2252,38,'2005-07-19 15:52:25',2,'2006-02-15 21:30:53'),(6865,'2005-07-12 20:02:40',1428,175,'2005-07-20 00:39:40',2,'2006-02-15 21:30:53'),(6866,'2005-07-12 20:03:44',2481,312,'2005-07-15 01:55:44',1,'2006-02-15 21:30:53'),(6867,'2005-07-12 20:06:47',3354,190,'2005-07-19 16:59:47',1,'2006-02-15 21:30:53'),(6868,'2005-07-12 20:10:17',719,306,'2005-07-15 22:34:17',2,'2006-02-15 21:30:53'),(6869,'2005-07-12 20:12:06',3546,278,'2005-07-13 18:37:06',1,'2006-02-15 21:30:53'),(6870,'2005-07-12 20:13:45',3102,13,'2005-07-16 22:09:45',2,'2006-02-15 21:30:53'),(6871,'2005-07-12 20:13:49',3612,204,'2005-07-14 20:11:49',2,'2006-02-15 21:30:53'),(6872,'2005-07-12 20:15:04',3246,86,'2005-07-18 18:19:04',1,'2006-02-15 21:30:53'),(6873,'2005-07-12 20:20:50',802,161,'2005-07-17 01:51:50',1,'2006-02-15 21:30:53'),(6874,'2005-07-12 20:20:53',4478,539,'2005-07-19 19:41:53',1,'2006-02-15 21:30:53'),(6875,'2005-07-12 20:23:05',3420,172,'2005-07-19 00:09:05',2,'2006-02-15 21:30:53'),(6876,'2005-07-12 20:32:50',34,531,'2005-07-16 21:12:50',1,'2006-02-15 21:30:53'),(6877,'2005-07-12 20:32:58',3968,231,'2005-07-18 18:01:58',1,'2006-02-15 21:30:53'),(6878,'2005-07-12 20:37:13',2428,363,'2005-07-19 20:13:13',2,'2006-02-15 21:30:53'),(6879,'2005-07-12 20:37:37',1901,416,'2005-07-20 15:40:37',2,'2006-02-15 21:30:53'),(6880,'2005-07-12 20:41:35',1473,229,'2005-07-17 02:22:35',1,'2006-02-15 21:30:53'),(6881,'2005-07-12 20:46:35',2496,346,'2005-07-21 00:26:35',2,'2006-02-15 21:30:53'),(6882,'2005-07-12 20:50:39',2469,166,'2005-07-14 21:01:39',1,'2006-02-15 21:30:53'),(6883,'2005-07-12 20:50:48',468,596,'2005-07-19 16:00:48',2,'2006-02-15 21:30:53'),(6884,'2005-07-12 20:52:41',3642,17,'2005-07-20 23:13:41',1,'2006-02-15 21:30:53'),(6885,'2005-07-12 20:56:04',3972,159,'2005-07-15 19:21:04',2,'2006-02-15 21:30:53'),(6886,'2005-07-12 20:58:04',4533,429,'2005-07-18 16:56:04',2,'2006-02-15 21:30:53'),(6887,'2005-07-12 21:00:23',4487,542,'2005-07-21 17:46:23',1,'2006-02-15 21:30:53'),(6888,'2005-07-12 21:01:11',1896,490,'2005-07-17 21:49:11',2,'2006-02-15 21:30:53'),(6889,'2005-07-12 21:01:22',2919,198,'2005-07-20 20:16:22',2,'2006-02-15 21:30:53'),(6890,'2005-07-12 21:03:03',2538,473,'2005-07-14 00:47:03',1,'2006-02-15 21:30:53'),(6891,'2005-07-12 21:07:35',3189,507,'2005-07-14 16:59:35',2,'2006-02-15 21:30:53'),(6892,'2005-07-12 21:10:04',1567,138,'2005-07-13 23:03:04',2,'2006-02-15 21:30:53'),(6893,'2005-07-12 21:20:11',2611,377,'2005-07-21 18:55:11',2,'2006-02-15 21:30:53'),(6894,'2005-07-12 21:20:50',1347,315,'2005-07-20 23:42:50',2,'2006-02-15 21:30:53'),(6895,'2005-07-12 21:23:59',2935,599,'2005-07-19 20:47:59',2,'2006-02-15 21:30:53'),(6896,'2005-07-12 21:25:37',1266,111,'2005-07-20 23:51:37',1,'2006-02-15 21:30:53'),(6897,'2005-07-12 21:30:41',170,13,'2005-07-15 03:19:41',1,'2006-02-15 21:30:53'),(6898,'2005-07-12 21:39:04',1725,557,'2005-07-15 20:30:04',1,'2006-02-15 21:30:53'),(6899,'2005-07-12 21:44:16',3565,483,'2005-07-21 22:21:16',2,'2006-02-15 21:30:53'),(6900,'2005-07-12 21:45:25',129,292,'2005-07-19 21:19:25',1,'2006-02-15 21:30:53'),(6901,'2005-07-12 21:46:33',4574,158,'2005-07-16 21:36:33',1,'2006-02-15 21:30:53'),(6902,'2005-07-12 21:57:16',314,485,'2005-07-14 20:56:16',1,'2006-02-15 21:30:53'),(6903,'2005-07-12 21:58:15',3690,517,'2005-07-14 01:38:15',2,'2006-02-15 21:30:53'),(6904,'2005-07-12 22:02:09',2312,465,'2005-07-17 16:42:09',1,'2006-02-15 21:30:53'),(6905,'2005-07-12 22:02:18',763,25,'2005-07-18 23:30:18',1,'2006-02-15 21:30:53'),(6906,'2005-07-12 22:03:02',1435,335,'2005-07-15 00:35:02',1,'2006-02-15 21:30:53'),(6907,'2005-07-12 22:03:49',2516,575,'2005-07-18 19:18:49',1,'2006-02-15 21:30:53'),(6908,'2005-07-12 22:08:46',3161,529,'2005-07-21 00:21:46',2,'2006-02-15 21:30:53'),(6909,'2005-07-12 22:09:30',769,174,'2005-07-17 02:05:30',2,'2006-02-15 21:30:53'),(6910,'2005-07-12 22:11:21',1290,546,'2005-07-21 02:35:21',1,'2006-02-15 21:30:53'),(6911,'2005-07-12 22:14:34',901,361,'2005-07-18 20:17:34',1,'2006-02-15 21:30:53'),(6912,'2005-07-12 22:17:16',1701,471,'2005-07-19 18:18:16',1,'2006-02-15 21:30:53'),(6913,'2005-07-12 22:18:12',569,443,'2005-07-14 23:03:12',2,'2006-02-15 21:30:53'),(6914,'2005-07-12 22:26:56',496,361,'2005-07-17 20:03:56',1,'2006-02-15 21:30:53'),(6915,'2005-07-12 22:28:09',1243,559,'2005-07-14 00:53:09',1,'2006-02-15 21:30:53'),(6916,'2005-07-12 22:29:18',3311,88,'2005-07-19 16:46:18',1,'2006-02-15 21:30:53'),(6917,'2005-07-12 22:30:15',3048,23,'2005-07-20 03:20:15',1,'2006-02-15 21:30:53'),(6918,'2005-07-12 22:30:29',4085,140,'2005-07-19 22:51:29',1,'2006-02-15 21:30:53'),(6919,'2005-07-12 22:32:17',1122,540,'2005-07-18 20:09:17',1,'2006-02-15 21:30:53'),(6920,'2005-07-12 22:32:58',2301,109,'2005-07-19 20:29:58',2,'2006-02-15 21:30:53'),(6921,'2005-07-12 22:39:03',3322,265,'2005-07-21 18:54:03',2,'2006-02-15 21:30:53'),(6922,'2005-07-12 22:39:48',1114,371,'2005-07-14 18:35:48',1,'2006-02-15 21:30:53'),(6923,'2005-07-12 22:40:48',2642,490,'2005-07-19 23:07:48',2,'2006-02-15 21:30:53'),(6924,'2005-07-26 22:51:53',1257,502,'2005-08-03 19:04:53',2,'2006-02-15 21:30:53'),(6925,'2005-07-26 22:52:32',2919,42,'2005-07-29 21:22:32',1,'2006-02-15 21:30:53'),(6926,'2005-07-26 22:52:45',1276,354,'2005-07-28 18:32:45',1,'2006-02-15 21:30:53'),(6927,'2005-07-26 22:56:00',4511,470,'2005-08-05 03:16:00',2,'2006-02-15 21:30:53'),(6928,'2005-07-26 22:56:21',3605,487,'2005-07-30 04:46:21',1,'2006-02-15 21:30:53'),(6929,'2005-07-26 22:59:19',3339,508,'2005-08-03 22:40:19',1,'2006-02-15 21:30:53'),(6930,'2005-07-26 23:00:01',2989,393,'2005-08-04 01:57:01',2,'2006-02-15 21:30:53'),(6931,'2005-07-26 23:02:57',2794,333,'2005-07-28 04:48:57',2,'2006-02-15 21:30:53'),(6932,'2005-07-26 23:08:04',4517,463,'2005-08-05 01:35:04',1,'2006-02-15 21:30:53'),(6933,'2005-07-26 23:09:23',1334,385,'2005-07-31 20:50:23',1,'2006-02-15 21:30:53'),(6934,'2005-07-26 23:11:03',455,107,'2005-08-04 19:18:03',1,'2006-02-15 21:30:53'),(6935,'2005-07-26 23:13:10',2771,435,'2005-07-27 18:09:10',1,'2006-02-15 21:30:53'),(6936,'2005-07-26 23:13:34',60,538,'2005-07-30 19:14:34',1,'2006-02-15 21:30:53'),(6937,'2005-07-26 23:15:50',1768,592,'2005-07-27 19:14:50',1,'2006-02-15 21:30:53'),(6938,'2005-07-26 23:16:04',2058,427,'2005-08-05 00:59:04',2,'2006-02-15 21:30:53'),(6939,'2005-07-26 23:17:51',278,354,'2005-08-03 21:12:51',2,'2006-02-15 21:30:53'),(6940,'2005-07-26 23:18:35',3876,149,'2005-08-05 01:44:35',2,'2006-02-15 21:30:53'),(6941,'2005-07-26 23:18:49',1575,441,'2005-07-31 00:23:49',2,'2006-02-15 21:30:53'),(6942,'2005-07-26 23:27:40',1203,470,'2005-07-31 03:17:40',2,'2006-02-15 21:30:53'),(6943,'2005-07-26 23:28:13',2436,21,'2005-07-30 02:22:13',2,'2006-02-15 21:30:53'),(6944,'2005-07-26 23:34:02',1168,373,'2005-08-05 01:27:02',1,'2006-02-15 21:30:53'),(6945,'2005-07-26 23:35:29',1627,560,'2005-07-28 00:12:29',1,'2006-02-15 21:30:53'),(6946,'2005-07-26 23:40:07',1854,181,'2005-08-04 01:18:07',2,'2006-02-15 21:30:53'),(6947,'2005-07-26 23:42:03',760,200,'2005-08-02 05:06:03',2,'2006-02-15 21:30:53'),(6948,'2005-07-26 23:43:49',3088,228,'2005-07-27 21:24:49',2,'2006-02-15 21:30:53'),(6949,'2005-07-26 23:44:12',1594,103,'2005-07-30 05:39:12',2,'2006-02-15 21:30:53'),(6950,'2005-07-26 23:45:33',197,503,'2005-07-31 04:40:33',2,'2006-02-15 21:30:53'),(6951,'2005-07-26 23:47:31',3348,98,'2005-07-31 22:17:31',1,'2006-02-15 21:30:53'),(6952,'2005-07-26 23:51:27',4288,290,'2005-07-30 02:45:27',2,'2006-02-15 21:30:53'),(6953,'2005-07-26 23:52:47',2910,306,'2005-07-30 23:07:47',1,'2006-02-15 21:30:53'),(6954,'2005-07-26 23:55:13',1112,584,'2005-07-28 19:01:13',2,'2006-02-15 21:30:53'),(6955,'2005-07-26 23:55:48',1104,469,'2005-08-02 03:25:48',2,'2006-02-15 21:30:53'),(6956,'2005-07-26 23:55:57',2499,240,'2005-08-03 21:41:57',1,'2006-02-15 21:30:53'),(6957,'2005-07-27 00:00:00',2231,518,'2005-07-29 19:32:00',2,'2006-02-15 21:30:53'),(6958,'2005-07-27 00:02:41',657,333,'2005-07-28 00:53:41',2,'2006-02-15 21:30:53'),(6959,'2005-07-27 00:07:51',1618,452,'2005-07-27 20:45:51',2,'2006-02-15 21:30:53'),(6960,'2005-07-27 00:08:33',192,421,'2005-08-03 20:58:33',2,'2006-02-15 21:30:53'),(6961,'2005-07-27 00:10:49',2205,38,'2005-07-30 00:26:49',2,'2006-02-15 21:30:53'),(6962,'2005-07-27 00:10:58',4500,245,'2005-07-30 02:11:58',2,'2006-02-15 21:30:53'),(6963,'2005-07-27 00:13:02',4284,489,'2005-08-03 18:13:02',1,'2006-02-15 21:30:53'),(6964,'2005-07-27 00:15:04',1537,404,'2005-07-31 00:04:04',2,'2006-02-15 21:30:53'),(6965,'2005-07-27 00:15:18',74,185,'2005-07-28 04:30:18',2,'2006-02-15 21:30:53'),(6966,'2005-07-27 00:15:35',1577,45,'2005-08-05 03:04:35',2,'2006-02-15 21:30:53'),(6967,'2005-07-27 00:16:31',1145,296,'2005-08-03 22:19:31',1,'2006-02-15 21:30:53'),(6968,'2005-07-27 00:16:45',1662,370,'2005-07-30 23:16:45',2,'2006-02-15 21:30:53'),(6969,'2005-07-27 00:23:54',2650,579,'2005-08-03 04:34:54',1,'2006-02-15 21:30:53'),(6970,'2005-07-27 00:26:14',17,418,'2005-08-03 20:00:14',2,'2006-02-15 21:30:53'),(6971,'2005-07-27 00:26:17',3493,366,'2005-08-01 03:59:17',2,'2006-02-15 21:30:53'),(6972,'2005-07-27 00:31:25',1716,434,'2005-07-28 22:15:25',2,'2006-02-15 21:30:53'),(6973,'2005-07-27 00:32:04',4572,564,'2005-07-29 01:05:04',2,'2006-02-15 21:30:53'),(6974,'2005-07-27 00:39:16',2924,122,'2005-08-04 01:59:16',2,'2006-02-15 21:30:53'),(6975,'2005-07-27 00:39:54',3328,527,'2005-08-02 19:49:54',1,'2006-02-15 21:30:53'),(6976,'2005-07-27 00:40:01',3096,41,'2005-07-31 22:30:01',2,'2006-02-15 21:30:53'),(6977,'2005-07-27 00:40:50',3545,429,'2005-08-02 19:08:50',2,'2006-02-15 21:30:53'),(6978,'2005-07-27 00:47:40',3645,132,'2005-07-31 04:32:40',2,'2006-02-15 21:30:53'),(6979,'2005-07-27 00:49:53',1001,141,'2005-07-31 03:59:53',2,'2006-02-15 21:30:53'),(6980,'2005-07-27 00:50:30',1127,164,'2005-08-03 23:35:30',1,'2006-02-15 21:30:53'),(6981,'2005-07-27 00:51:38',154,362,'2005-07-28 01:06:38',2,'2006-02-15 21:30:53'),(6982,'2005-07-27 00:53:41',3843,284,'2005-07-31 06:19:41',2,'2006-02-15 21:30:53'),(6983,'2005-07-27 00:55:03',1758,443,'2005-08-01 21:19:03',2,'2006-02-15 21:30:53'),(6984,'2005-07-27 00:56:30',2407,297,'2005-08-02 01:14:30',2,'2006-02-15 21:30:53'),(6985,'2005-07-27 00:57:42',1834,448,'2005-07-31 00:53:42',1,'2006-02-15 21:30:53'),(6986,'2005-07-27 00:59:05',2104,262,'2005-07-29 00:31:05',1,'2006-02-15 21:30:53'),(6987,'2005-07-27 00:59:50',3134,334,'2005-07-28 01:47:50',1,'2006-02-15 21:30:53'),(6988,'2005-07-27 01:00:08',756,316,'2005-07-31 04:35:08',2,'2006-02-15 21:30:53'),(6989,'2005-07-27 01:00:34',4036,120,'2005-07-30 23:53:34',1,'2006-02-15 21:30:53'),(6990,'2005-07-27 01:02:46',4065,146,'2005-07-31 00:22:46',1,'2006-02-15 21:30:53'),(6991,'2005-07-27 01:03:06',319,307,'2005-08-05 04:18:06',2,'2006-02-15 21:30:53'),(6992,'2005-07-27 01:04:45',3411,106,'2005-07-28 02:34:45',2,'2006-02-15 21:30:53'),(6993,'2005-07-27 01:05:24',3114,154,'2005-07-30 06:23:24',2,'2006-02-15 21:30:53'),(6994,'2005-07-27 01:08:26',4316,400,'2005-08-04 22:58:26',2,'2006-02-15 21:30:53'),(6995,'2005-07-27 01:12:13',1630,66,'2005-07-29 21:26:13',1,'2006-02-15 21:30:53'),(6996,'2005-07-27 01:13:45',3237,236,'2005-07-28 20:43:45',1,'2006-02-15 21:30:53'),(6997,'2005-07-27 01:14:02',2130,342,'2005-07-29 01:12:02',2,'2006-02-15 21:30:53'),(6998,'2005-07-27 01:16:29',788,300,'2005-07-30 05:50:29',2,'2006-02-15 21:30:53'),(6999,'2005-07-27 01:21:19',12,224,'2005-07-29 20:33:19',2,'2006-02-15 21:30:53'),(7000,'2005-07-27 01:23:24',2024,31,'2005-08-03 02:10:24',2,'2006-02-15 21:30:53'),(7001,'2005-07-27 01:25:34',1460,240,'2005-07-31 23:30:34',2,'2006-02-15 21:30:53'),(7002,'2005-07-27 01:26:14',4157,349,'2005-08-01 20:10:14',1,'2006-02-15 21:30:53'),(7003,'2005-07-27 01:32:06',636,161,'2005-07-30 21:33:06',2,'2006-02-15 21:30:53'),(7004,'2005-07-27 01:36:05',4416,314,'2005-08-03 23:46:05',1,'2006-02-15 21:30:53'),(7005,'2005-07-27 01:38:36',2438,446,'2005-08-02 05:56:36',2,'2006-02-15 21:30:53'),(7006,'2005-07-27 01:42:20',3522,264,'2005-08-03 03:19:20',1,'2006-02-15 21:30:53'),(7007,'2005-07-27 01:43:39',4186,257,'2005-07-31 21:04:39',1,'2006-02-15 21:30:53'),(7008,'2005-07-27 01:44:03',3659,12,'2005-07-28 21:19:03',2,'2006-02-15 21:30:53'),(7009,'2005-07-27 01:45:44',1585,414,'2005-07-28 05:50:44',1,'2006-02-15 21:30:53'),(7010,'2005-07-27 01:56:01',3016,590,'2005-07-30 04:40:01',1,'2006-02-15 21:30:53'),(7011,'2005-07-27 01:58:34',4082,254,'2005-07-28 06:11:34',1,'2006-02-15 21:30:53'),(7012,'2005-07-27 02:01:03',779,239,'2005-08-05 07:34:03',2,'2006-02-15 21:30:53'),(7013,'2005-07-27 02:03:21',3919,463,'2005-07-31 22:12:21',1,'2006-02-15 21:30:53'),(7014,'2005-07-27 02:14:40',714,524,'2005-08-03 00:32:40',2,'2006-02-15 21:30:53'),(7015,'2005-07-27 02:15:01',376,34,'2005-07-28 07:46:01',2,'2006-02-15 21:30:53'),(7016,'2005-07-27 02:15:16',1425,423,'2005-08-01 23:08:16',2,'2006-02-15 21:30:53'),(7017,'2005-07-27 02:16:03',753,176,'2005-07-31 07:49:03',1,'2006-02-15 21:30:53'),(7018,'2005-07-27 02:20:22',1078,451,'2005-08-02 05:04:22',2,'2006-02-15 21:30:53'),(7019,'2005-07-27 02:20:26',3837,491,'2005-08-02 22:48:26',1,'2006-02-15 21:30:53'),(7020,'2005-07-27 02:24:27',3965,506,'2005-07-29 01:27:27',2,'2006-02-15 21:30:53'),(7021,'2005-07-27 02:26:38',2690,380,'2005-08-05 01:18:38',1,'2006-02-15 21:30:53'),(7022,'2005-07-27 02:31:15',1711,243,'2005-07-29 02:52:15',1,'2006-02-15 21:30:53'),(7023,'2005-07-27 02:32:44',4196,303,'2005-08-03 04:06:44',1,'2006-02-15 21:30:53'),(7024,'2005-07-27 02:36:40',3113,252,'2005-07-28 06:58:40',1,'2006-02-15 21:30:53'),(7025,'2005-07-27 02:40:29',3530,176,'2005-07-29 23:02:29',2,'2006-02-15 21:30:53'),(7026,'2005-07-27 02:48:58',3456,493,'2005-07-29 03:41:58',2,'2006-02-15 21:30:53'),(7027,'2005-07-27 02:50:15',3280,61,'2005-08-04 02:58:15',1,'2006-02-15 21:30:53'),(7028,'2005-07-27 02:54:25',834,179,'2005-08-02 06:16:25',2,'2006-02-15 21:30:53'),(7029,'2005-07-27 02:57:43',2862,389,'2005-07-30 08:24:43',1,'2006-02-15 21:30:53'),(7030,'2005-07-27 03:01:40',1277,550,'2005-07-31 07:01:40',1,'2006-02-15 21:30:53'),(7031,'2005-07-27 03:02:07',1435,530,'2005-08-02 07:14:07',1,'2006-02-15 21:30:53'),(7032,'2005-07-27 03:03:09',3397,269,'2005-07-28 22:57:09',1,'2006-02-15 21:30:53'),(7033,'2005-07-27 03:03:25',2803,352,'2005-07-28 01:57:25',2,'2006-02-15 21:30:53'),(7034,'2005-07-27 03:03:37',1712,281,'2005-07-28 23:18:37',1,'2006-02-15 21:30:53'),(7035,'2005-07-27 03:06:09',2439,90,'2005-08-02 21:59:09',2,'2006-02-15 21:30:53'),(7036,'2005-07-27 03:06:12',2569,70,'2005-07-28 23:26:12',2,'2006-02-15 21:30:53'),(7037,'2005-07-27 03:06:44',3155,171,'2005-08-02 04:51:44',2,'2006-02-15 21:30:53'),(7038,'2005-07-27 03:07:29',1909,518,'2005-07-31 04:55:29',2,'2006-02-15 21:30:53'),(7039,'2005-07-27 03:11:48',1906,99,'2005-08-01 23:55:48',1,'2006-02-15 21:30:53'),(7040,'2005-07-27 03:17:19',470,524,'2005-07-29 07:03:19',2,'2006-02-15 21:30:53'),(7041,'2005-07-27 03:18:32',4212,379,'2005-07-30 06:40:32',2,'2006-02-15 21:30:53'),(7042,'2005-07-27 03:20:18',399,188,'2005-08-01 02:23:18',1,'2006-02-15 21:30:53'),(7043,'2005-07-27 03:24:23',3422,493,'2005-08-05 02:55:23',2,'2006-02-15 21:30:53'),(7044,'2005-07-27 03:27:29',88,147,'2005-08-01 07:00:29',2,'2006-02-15 21:30:53'),(7045,'2005-07-27 03:27:35',1788,64,'2005-08-01 06:31:35',2,'2006-02-15 21:30:53'),(7046,'2005-07-27 03:27:56',3740,349,'2005-07-30 00:54:56',2,'2006-02-15 21:30:53'),(7047,'2005-07-27 03:31:11',2866,236,'2005-08-03 23:40:11',1,'2006-02-15 21:30:53'),(7048,'2005-07-27 03:31:48',3707,581,'2005-08-05 07:30:48',2,'2006-02-15 21:30:53'),(7049,'2005-07-27 03:32:41',3043,332,'2005-08-04 08:32:41',2,'2006-02-15 21:30:53'),(7050,'2005-07-27 03:33:17',1135,55,'2005-08-02 03:12:17',1,'2006-02-15 21:30:53'),(7051,'2005-07-27 03:34:37',1310,184,'2005-07-31 03:48:37',2,'2006-02-15 21:30:53'),(7052,'2005-07-27 03:36:38',3798,75,'2005-08-03 21:51:38',1,'2006-02-15 21:30:53'),(7053,'2005-07-27 03:38:54',149,408,'2005-07-31 01:13:54',1,'2006-02-15 21:30:53'),(7054,'2005-07-27 03:43:28',2661,179,'2005-08-04 09:15:28',1,'2006-02-15 21:30:53'),(7055,'2005-07-27 03:45:42',4305,154,'2005-07-30 05:11:42',1,'2006-02-15 21:30:53'),(7056,'2005-07-27 03:46:27',805,233,'2005-08-05 07:46:27',1,'2006-02-15 21:30:53'),(7057,'2005-07-27 03:50:03',1196,320,'2005-08-04 04:36:03',1,'2006-02-15 21:30:53'),(7058,'2005-07-27 03:50:46',716,90,'2005-08-04 07:40:46',2,'2006-02-15 21:30:53'),(7059,'2005-07-27 03:51:02',129,578,'2005-08-02 22:04:02',1,'2006-02-15 21:30:53'),(7060,'2005-07-27 03:51:04',3912,479,'2005-08-03 07:53:04',1,'2006-02-15 21:30:53'),(7061,'2005-07-27 03:51:10',880,145,'2005-07-31 05:36:10',1,'2006-02-15 21:30:53'),(7062,'2005-07-27 03:52:01',226,469,'2005-08-03 08:26:01',1,'2006-02-15 21:30:53'),(7063,'2005-07-27 03:52:27',2125,58,'2005-08-04 07:53:27',1,'2006-02-15 21:30:53'),(7064,'2005-07-27 03:53:29',4204,320,'2005-08-03 06:32:29',1,'2006-02-15 21:30:53'),(7065,'2005-07-27 03:53:43',3570,536,'2005-07-30 23:41:43',2,'2006-02-15 21:30:53'),(7066,'2005-07-27 03:53:52',1862,185,'2005-08-05 03:32:52',1,'2006-02-15 21:30:53'),(7067,'2005-07-27 03:55:10',870,60,'2005-08-01 02:56:10',1,'2006-02-15 21:30:53'),(7068,'2005-07-27 03:57:50',4465,568,'2005-07-30 04:27:50',1,'2006-02-15 21:30:53'),(7069,'2005-07-27 03:59:35',2073,343,'2005-08-05 03:33:35',1,'2006-02-15 21:30:53'),(7070,'2005-07-27 04:01:08',4182,280,'2005-07-30 08:10:08',2,'2006-02-15 21:30:53'),(7071,'2005-07-27 04:01:15',4361,61,'2005-08-03 05:18:15',2,'2006-02-15 21:30:53'),(7072,'2005-07-27 04:02:33',3899,260,'2005-07-28 09:26:33',2,'2006-02-15 21:30:53'),(7073,'2005-07-27 04:03:26',3859,92,'2005-08-03 05:50:26',1,'2006-02-15 21:30:53'),(7074,'2005-07-27 04:06:24',1390,165,'2005-07-28 02:04:24',1,'2006-02-15 21:30:53'),(7075,'2005-07-27 04:11:40',4414,530,'2005-08-03 08:16:40',2,'2006-02-15 21:30:53'),(7076,'2005-07-27 04:12:14',2821,333,'2005-08-05 00:44:14',1,'2006-02-15 21:30:53'),(7077,'2005-07-27 04:13:02',3186,155,'2005-07-31 23:15:02',1,'2006-02-15 21:30:53'),(7078,'2005-07-27 04:16:37',4518,545,'2005-08-05 02:34:37',1,'2006-02-15 21:30:53'),(7079,'2005-07-27 04:21:58',4356,356,'2005-08-04 08:08:58',1,'2006-02-15 21:30:53'),(7080,'2005-07-27 04:25:25',710,466,'2005-08-04 04:22:25',2,'2006-02-15 21:30:53'),(7081,'2005-07-27 04:25:59',462,420,'2005-08-01 00:14:59',1,'2006-02-15 21:30:53'),(7082,'2005-07-27 04:27:32',2032,64,'2005-07-30 06:06:32',2,'2006-02-15 21:30:53'),(7083,'2005-07-27 04:28:39',2663,575,'2005-07-30 04:35:39',2,'2006-02-15 21:30:53'),(7084,'2005-07-27 04:34:07',785,32,'2005-08-05 00:21:07',2,'2006-02-15 21:30:53'),(7085,'2005-07-27 04:35:44',2603,223,'2005-08-05 07:10:44',2,'2006-02-15 21:30:53'),(7086,'2005-07-27 04:39:46',2938,595,'2005-08-05 00:32:46',2,'2006-02-15 21:30:53'),(7087,'2005-07-27 04:42:08',1159,22,'2005-08-02 00:53:08',1,'2006-02-15 21:30:53'),(7088,'2005-07-27 04:42:28',373,88,'2005-08-04 07:09:28',2,'2006-02-15 21:30:53'),(7089,'2005-07-27 04:43:42',1380,446,'2005-07-30 10:04:42',1,'2006-02-15 21:30:53'),(7090,'2005-07-27 04:43:53',3495,218,'2005-07-29 07:33:53',2,'2006-02-15 21:30:53'),(7091,'2005-07-27 04:44:10',2593,322,'2005-07-31 07:14:10',1,'2006-02-15 21:30:53'),(7092,'2005-07-27 04:46:00',1433,345,'2005-08-03 07:22:00',2,'2006-02-15 21:30:53'),(7093,'2005-07-27 04:47:00',3065,574,'2005-07-31 10:15:00',1,'2006-02-15 21:30:53'),(7094,'2005-07-27 04:47:33',867,373,'2005-07-31 04:07:33',2,'2006-02-15 21:30:53'),(7095,'2005-07-27 04:51:15',1008,551,'2005-08-05 10:25:15',2,'2006-02-15 21:30:53'),(7096,'2005-07-27 04:54:42',2575,3,'2005-08-03 01:42:42',2,'2006-02-15 21:30:53'),(7097,'2005-07-27 04:56:09',258,487,'2005-07-31 05:47:09',1,'2006-02-15 21:30:53'),(7098,'2005-07-27 05:01:08',2555,359,'2005-08-02 07:49:08',2,'2006-02-15 21:30:53'),(7099,'2005-07-27 05:03:44',3136,6,'2005-07-29 00:12:44',2,'2006-02-15 21:30:53'),(7100,'2005-07-27 05:05:01',4224,413,'2005-07-28 23:12:01',2,'2006-02-15 21:30:53'),(7101,'2005-07-27 05:06:34',2006,221,'2005-07-29 06:12:34',1,'2006-02-15 21:30:53'),(7102,'2005-07-27 05:07:21',1081,411,'2005-08-01 09:41:21',2,'2006-02-15 21:30:53'),(7103,'2005-07-27 05:08:59',1697,403,'2005-07-29 03:42:59',2,'2006-02-15 21:30:53'),(7104,'2005-07-27 05:15:25',118,217,'2005-08-01 05:36:25',2,'2006-02-15 21:30:53'),(7105,'2005-07-27 05:15:37',864,15,'2005-07-28 05:49:37',2,'2006-02-15 21:30:53'),(7106,'2005-07-27 05:21:24',1415,201,'2005-08-02 01:58:24',2,'2006-02-15 21:30:53'),(7107,'2005-07-27 05:22:04',1883,104,'2005-08-02 06:38:04',1,'2006-02-15 21:30:53'),(7108,'2005-07-27 05:28:32',2720,355,'2005-07-31 07:52:32',1,'2006-02-15 21:30:53'),(7109,'2005-07-27 05:28:57',1658,406,'2005-08-04 10:41:57',2,'2006-02-15 21:30:53'),(7110,'2005-07-27 05:30:48',3289,157,'2005-07-28 01:43:48',1,'2006-02-15 21:30:53'),(7111,'2005-07-27 05:38:16',1252,473,'2005-07-29 04:28:16',2,'2006-02-15 21:30:53'),(7112,'2005-07-27 05:38:42',4056,101,'2005-08-03 05:35:42',1,'2006-02-15 21:30:53'),(7113,'2005-07-27 05:41:20',1963,534,'2005-07-30 04:50:20',1,'2006-02-15 21:30:53'),(7114,'2005-07-27 05:42:13',3892,121,'2005-07-29 01:59:13',1,'2006-02-15 21:30:53'),(7115,'2005-07-27 05:42:58',3620,359,'2005-08-02 05:35:58',2,'2006-02-15 21:30:53'),(7116,'2005-07-27 05:46:43',1755,209,'2005-08-05 05:54:43',1,'2006-02-15 21:30:53'),(7117,'2005-07-27 05:48:36',2772,326,'2005-08-01 00:33:36',1,'2006-02-15 21:30:53'),(7118,'2005-07-27 05:53:50',582,591,'2005-08-05 04:19:50',2,'2006-02-15 21:30:53'),(7119,'2005-07-27 05:55:32',1732,102,'2005-07-29 03:19:32',1,'2006-02-15 21:30:53'),(7120,'2005-07-27 05:56:39',416,98,'2005-08-04 10:57:39',1,'2006-02-15 21:30:53'),(7121,'2005-07-27 05:58:32',1264,252,'2005-07-29 06:14:32',1,'2006-02-15 21:30:53'),(7122,'2005-07-27 06:03:18',1699,172,'2005-08-04 10:43:18',2,'2006-02-15 21:30:53'),(7123,'2005-07-27 06:08:48',134,232,'2005-08-04 05:26:48',1,'2006-02-15 21:30:53'),(7124,'2005-07-27 06:09:30',3449,34,'2005-08-02 09:31:30',1,'2006-02-15 21:30:53'),(7125,'2005-07-27 06:11:00',801,460,'2005-08-04 09:41:00',2,'2006-02-15 21:30:53'),(7126,'2005-07-27 06:13:13',3240,582,'2005-07-28 08:22:13',2,'2006-02-15 21:30:53'),(7127,'2005-07-27 06:13:48',273,486,'2005-08-01 02:50:48',2,'2006-02-15 21:30:53'),(7128,'2005-07-27 06:14:36',143,529,'2005-08-02 05:18:36',1,'2006-02-15 21:30:53'),(7129,'2005-07-27 06:18:01',1930,221,'2005-07-28 02:38:01',1,'2006-02-15 21:30:53'),(7130,'2005-07-27 06:23:36',420,81,'2005-07-28 10:23:36',1,'2006-02-15 21:30:53'),(7131,'2005-07-27 06:25:06',2832,585,'2005-07-31 09:07:06',1,'2006-02-15 21:30:53'),(7132,'2005-07-27 06:28:34',3201,227,'2005-08-05 06:02:34',2,'2006-02-15 21:30:53'),(7133,'2005-07-27 06:29:23',2995,496,'2005-07-29 03:20:23',2,'2006-02-15 21:30:53'),(7134,'2005-07-27 06:33:06',1058,574,'2005-07-28 06:15:06',1,'2006-02-15 21:30:53'),(7135,'2005-07-27 06:34:32',2959,172,'2005-07-28 03:01:32',1,'2006-02-15 21:30:53'),(7136,'2005-07-27 06:38:25',1929,6,'2005-08-03 05:13:25',1,'2006-02-15 21:30:53'),(7137,'2005-07-27 06:40:41',3957,483,'2005-07-29 09:05:41',2,'2006-02-15 21:30:53'),(7138,'2005-07-27 06:47:13',1418,31,'2005-08-03 01:12:13',2,'2006-02-15 21:30:53'),(7139,'2005-07-27 06:52:21',846,575,'2005-07-30 01:45:21',1,'2006-02-15 21:30:53'),(7140,'2005-07-27 06:54:12',2028,35,'2005-08-03 10:36:12',2,'2006-02-15 21:30:53'),(7141,'2005-07-27 06:55:27',3579,423,'2005-08-01 11:10:27',1,'2006-02-15 21:30:53'),(7142,'2005-07-27 06:55:39',1743,396,'2005-07-28 01:41:39',2,'2006-02-15 21:30:53'),(7143,'2005-07-27 06:56:31',2877,91,'2005-07-31 04:38:31',2,'2006-02-15 21:30:53'),(7144,'2005-07-27 07:00:37',4506,485,'2005-08-01 06:57:37',1,'2006-02-15 21:30:53'),(7145,'2005-07-27 07:01:00',3653,109,'2005-07-31 02:31:00',1,'2006-02-15 21:30:53'),(7146,'2005-07-27 07:02:30',2245,323,'2005-08-05 10:29:30',1,'2006-02-15 21:30:53'),(7147,'2005-07-27 07:02:34',990,192,'2005-08-01 02:16:34',1,'2006-02-15 21:30:53'),(7148,'2005-07-27 07:04:09',1783,354,'2005-08-03 10:20:09',2,'2006-02-15 21:30:53'),(7149,'2005-07-27 07:10:40',3902,242,'2005-08-03 07:37:40',2,'2006-02-15 21:30:53'),(7150,'2005-07-27 07:11:14',457,191,'2005-08-05 06:55:14',2,'2006-02-15 21:30:53'),(7151,'2005-07-27 07:14:31',1259,289,'2005-08-01 01:35:31',2,'2006-02-15 21:30:53'),(7152,'2005-07-27 07:15:01',2338,370,'2005-08-05 04:50:01',1,'2006-02-15 21:30:53'),(7153,'2005-07-27 07:15:38',2657,41,'2005-07-28 09:56:38',1,'2006-02-15 21:30:53'),(7154,'2005-07-27 07:16:17',2019,518,'2005-07-28 04:04:17',2,'2006-02-15 21:30:53'),(7155,'2005-07-27 07:18:46',171,23,'2005-08-04 10:28:46',1,'2006-02-15 21:30:53'),(7156,'2005-07-27 07:19:34',34,154,'2005-07-31 04:31:34',1,'2006-02-15 21:30:53'),(7157,'2005-07-27 07:20:28',1353,423,'2005-08-02 07:19:28',1,'2006-02-15 21:30:53'),(7158,'2005-07-27 07:23:58',2432,38,'2005-08-03 06:00:58',2,'2006-02-15 21:30:53'),(7159,'2005-07-27 07:24:00',1220,158,'2005-08-05 11:13:00',1,'2006-02-15 21:30:53'),(7160,'2005-07-27 07:26:06',3905,71,'2005-07-31 04:54:06',2,'2006-02-15 21:30:53'),(7161,'2005-07-27 07:26:32',378,572,'2005-08-03 01:26:32',2,'2006-02-15 21:30:53'),(7162,'2005-07-27 07:32:45',2251,289,'2005-07-30 03:48:45',1,'2006-02-15 21:30:53'),(7163,'2005-07-27 07:36:11',3666,38,'2005-08-04 06:03:11',2,'2006-02-15 21:30:53'),(7164,'2005-07-27 07:36:34',527,284,'2005-08-04 05:05:34',2,'2006-02-15 21:30:53'),(7165,'2005-07-27 07:36:46',497,243,'2005-07-30 09:22:46',2,'2006-02-15 21:30:53'),(7166,'2005-07-27 07:36:56',1375,562,'2005-08-02 03:46:56',1,'2006-02-15 21:30:53'),(7167,'2005-07-27 07:37:26',238,380,'2005-08-03 06:39:26',1,'2006-02-15 21:30:53'),(7168,'2005-07-27 07:51:11',6,252,'2005-08-01 04:08:11',2,'2006-02-15 21:30:53'),(7169,'2005-07-27 07:51:39',735,559,'2005-08-01 06:42:39',1,'2006-02-15 21:30:53'),(7170,'2005-07-27 07:58:26',370,140,'2005-07-28 02:30:26',1,'2006-02-15 21:30:53'),(7171,'2005-07-27 07:58:35',4381,406,'2005-08-03 07:45:35',1,'2006-02-15 21:30:53'),(7172,'2005-07-27 07:59:16',2405,362,'2005-08-01 04:46:16',1,'2006-02-15 21:30:53'),(7173,'2005-07-27 07:59:24',177,592,'2005-07-28 02:23:24',2,'2006-02-15 21:30:53'),(7174,'2005-07-27 08:00:36',46,570,'2005-08-01 03:11:36',1,'2006-02-15 21:30:53'),(7175,'2005-07-27 08:03:22',568,190,'2005-08-01 02:47:22',2,'2006-02-15 21:30:53'),(7176,'2005-07-27 08:04:28',227,257,'2005-07-29 14:00:28',2,'2006-02-15 21:30:53'),(7177,'2005-07-27 08:07:39',3818,133,'2005-07-30 03:17:39',2,'2006-02-15 21:30:53'),(7178,'2005-07-27 08:09:25',1899,31,'2005-07-29 13:00:25',2,'2006-02-15 21:30:53'),(7179,'2005-07-27 08:10:29',2365,537,'2005-07-28 12:24:29',2,'2006-02-15 21:30:53'),(7180,'2005-07-27 08:14:34',460,215,'2005-07-31 05:24:34',1,'2006-02-15 21:30:53'),(7181,'2005-07-27 08:14:34',2788,130,'2005-07-28 03:09:34',1,'2006-02-15 21:30:53'),(7182,'2005-07-27 08:15:38',3209,97,'2005-08-03 12:48:38',2,'2006-02-15 21:30:53'),(7183,'2005-07-27 08:18:38',3384,302,'2005-08-01 03:24:38',1,'2006-02-15 21:30:53'),(7184,'2005-07-27 08:22:26',2324,457,'2005-08-02 09:34:26',2,'2006-02-15 21:30:53'),(7185,'2005-07-27 08:23:54',2340,121,'2005-07-30 09:50:54',1,'2006-02-15 21:30:53'),(7186,'2005-07-27 08:26:12',4005,584,'2005-07-28 12:21:12',1,'2006-02-15 21:30:53'),(7187,'2005-07-27 08:27:58',2733,169,'2005-08-05 09:05:58',1,'2006-02-15 21:30:53'),(7188,'2005-07-27 08:32:08',2199,259,'2005-07-28 08:02:08',1,'2006-02-15 21:30:53'),(7189,'2005-07-27 08:35:02',4419,151,'2005-07-30 14:00:02',2,'2006-02-15 21:30:53'),(7190,'2005-07-27 08:36:01',1330,372,'2005-07-30 08:32:01',2,'2006-02-15 21:30:53'),(7191,'2005-07-27 08:36:15',4292,495,'2005-08-03 08:54:15',1,'2006-02-15 21:30:53'),(7192,'2005-07-27 08:36:55',4329,532,'2005-07-30 11:58:55',2,'2006-02-15 21:30:53'),(7193,'2005-07-27 08:37:00',1801,237,'2005-07-30 12:51:00',2,'2006-02-15 21:30:53'),(7194,'2005-07-27 08:39:58',254,172,'2005-08-01 03:12:58',1,'2006-02-15 21:30:53'),(7195,'2005-07-27 08:47:01',721,157,'2005-07-30 08:40:01',2,'2006-02-15 21:30:53'),(7196,'2005-07-27 08:49:08',2998,118,'2005-07-29 03:54:08',1,'2006-02-15 21:30:53'),(7197,'2005-07-27 08:49:32',2109,577,'2005-07-31 13:50:32',1,'2006-02-15 21:30:53'),(7198,'2005-07-27 08:50:07',4283,520,'2005-08-04 09:46:07',2,'2006-02-15 21:30:53'),(7199,'2005-07-27 08:53:23',3685,292,'2005-08-03 10:01:23',1,'2006-02-15 21:30:53'),(7200,'2005-07-27 08:57:38',4406,78,'2005-08-02 12:29:38',2,'2006-02-15 21:30:53'),(7201,'2005-07-27 08:57:40',482,598,'2005-08-04 09:55:40',2,'2006-02-15 21:30:53'),(7202,'2005-07-27 09:00:20',109,560,'2005-08-04 03:09:20',1,'2006-02-15 21:30:53'),(7203,'2005-07-27 09:01:23',1685,492,'2005-08-04 14:14:23',1,'2006-02-15 21:30:53'),(7204,'2005-07-27 09:02:31',2512,531,'2005-08-03 08:56:31',2,'2006-02-15 21:30:53'),(7205,'2005-07-27 09:06:13',2828,36,'2005-08-05 07:11:13',1,'2006-02-15 21:30:53'),(7206,'2005-07-27 09:07:05',3752,373,'2005-07-31 03:13:05',2,'2006-02-15 21:30:53'),(7207,'2005-07-27 09:13:26',336,51,'2005-08-01 10:24:26',1,'2006-02-15 21:30:53'),(7208,'2005-07-27 09:16:28',1523,138,'2005-07-28 09:40:28',1,'2006-02-15 21:30:53'),(7209,'2005-07-27 09:16:53',3766,49,'2005-07-30 08:09:53',2,'2006-02-15 21:30:53'),(7210,'2005-07-27 09:19:05',1984,176,'2005-07-28 04:35:05',1,'2006-02-15 21:30:53'),(7211,'2005-07-27 09:20:00',4445,285,'2005-08-02 14:53:00',1,'2006-02-15 21:30:53'),(7212,'2005-07-27 09:21:22',2905,591,'2005-08-01 04:47:22',2,'2006-02-15 21:30:53'),(7213,'2005-07-27 09:22:29',2836,502,'2005-08-03 13:53:29',2,'2006-02-15 21:30:53'),(7214,'2005-07-27 09:23:33',802,309,'2005-08-03 13:14:33',2,'2006-02-15 21:30:53'),(7215,'2005-07-27 09:24:00',2713,473,'2005-08-05 07:37:00',2,'2006-02-15 21:30:53'),(7216,'2005-07-27 09:27:45',1812,292,'2005-08-03 13:08:45',1,'2006-02-15 21:30:53'),(7217,'2005-07-27 09:31:44',2646,20,'2005-07-29 10:48:44',1,'2006-02-15 21:30:53'),(7218,'2005-07-27 09:34:24',2458,530,'2005-08-01 07:00:24',1,'2006-02-15 21:30:53'),(7219,'2005-07-27 09:35:36',4046,512,'2005-07-29 04:44:36',1,'2006-02-15 21:30:53'),(7220,'2005-07-27 09:35:54',3867,79,'2005-08-04 06:00:54',2,'2006-02-15 21:30:53'),(7221,'2005-07-27 09:37:35',3820,579,'2005-07-28 11:25:35',1,'2006-02-15 21:30:53'),(7222,'2005-07-27 09:38:43',2330,206,'2005-07-28 06:25:43',1,'2006-02-15 21:30:53'),(7223,'2005-07-27 09:42:27',2623,325,'2005-08-04 04:02:27',1,'2006-02-15 21:30:53'),(7224,'2005-07-27 09:44:26',2701,106,'2005-08-05 12:46:26',2,'2006-02-15 21:30:53'),(7225,'2005-07-27 09:47:12',632,306,'2005-08-03 13:19:12',2,'2006-02-15 21:30:53'),(7226,'2005-07-27 09:47:53',3507,370,'2005-08-01 08:24:53',1,'2006-02-15 21:30:53'),(7227,'2005-07-27 09:53:43',791,164,'2005-08-05 09:36:43',2,'2006-02-15 21:30:53'),(7228,'2005-07-27 09:55:33',1693,481,'2005-07-29 04:33:33',2,'2006-02-15 21:30:53'),(7229,'2005-07-27 10:00:54',978,182,'2005-07-28 13:58:54',2,'2006-02-15 21:30:53'),(7230,'2005-07-27 10:01:41',1152,245,'2005-08-02 11:00:41',1,'2006-02-15 21:30:53'),(7231,'2005-07-27 10:01:51',1638,86,'2005-08-05 13:38:51',2,'2006-02-15 21:30:53'),(7232,'2005-07-27 10:04:19',1147,306,'2005-07-28 09:43:19',2,'2006-02-15 21:30:53'),(7233,'2005-07-27 10:08:36',213,245,'2005-07-31 16:00:36',1,'2006-02-15 21:30:53'),(7234,'2005-07-27 10:08:45',3873,372,'2005-07-31 13:58:45',1,'2006-02-15 21:30:53'),(7235,'2005-07-27 10:09:30',1261,354,'2005-08-05 11:44:30',2,'2006-02-15 21:30:53'),(7236,'2005-07-27 10:09:39',3004,218,'2005-08-03 16:05:39',1,'2006-02-15 21:30:53'),(7237,'2005-07-27 10:12:36',1904,29,'2005-07-31 08:40:36',2,'2006-02-15 21:30:53'),(7238,'2005-07-27 10:13:41',1197,116,'2005-07-29 11:07:41',1,'2006-02-15 21:30:53'),(7239,'2005-07-27 10:20:27',1786,278,'2005-07-29 10:15:27',1,'2006-02-15 21:30:53'),(7240,'2005-07-27 10:21:15',4565,324,'2005-08-03 05:04:15',1,'2006-02-15 21:30:53'),(7241,'2005-07-27 10:25:49',2433,354,'2005-07-28 05:30:49',2,'2006-02-15 21:30:53'),(7242,'2005-07-27 10:25:51',1966,565,'2005-08-04 16:02:51',2,'2006-02-15 21:30:53'),(7243,'2005-07-27 10:26:11',1287,238,'2005-07-29 11:43:11',2,'2006-02-15 21:30:53'),(7244,'2005-07-27 10:27:33',1329,339,'2005-07-30 13:09:33',1,'2006-02-15 21:30:53'),(7245,'2005-07-27 10:29:06',260,95,'2005-08-05 12:09:06',2,'2006-02-15 21:30:53'),(7246,'2005-07-27 10:30:41',2003,333,'2005-07-30 05:44:41',1,'2006-02-15 21:30:53'),(7247,'2005-07-27 10:32:58',1445,102,'2005-07-29 05:00:58',2,'2006-02-15 21:30:53'),(7248,'2005-07-27 10:37:45',4256,456,'2005-08-01 13:13:45',1,'2006-02-15 21:30:53'),(7249,'2005-07-27 10:39:53',2441,425,'2005-07-28 14:48:53',2,'2006-02-15 21:30:53'),(7250,'2005-07-27 10:44:09',3410,589,'2005-07-28 11:47:09',1,'2006-02-15 21:30:53'),(7251,'2005-07-27 10:44:55',1737,360,'2005-08-01 16:12:55',1,'2006-02-15 21:30:53'),(7252,'2005-07-27 10:45:28',3107,549,'2005-08-04 06:24:28',2,'2006-02-15 21:30:53'),(7253,'2005-07-27 10:46:37',1950,236,'2005-07-28 11:18:37',1,'2006-02-15 21:30:53'),(7254,'2005-07-27 10:48:50',2697,286,'2005-07-28 10:34:50',1,'2006-02-15 21:30:53'),(7255,'2005-07-27 10:49:54',2101,502,'2005-07-31 10:40:54',2,'2006-02-15 21:30:53'),(7256,'2005-07-27 10:58:32',4275,363,'2005-07-29 08:58:32',2,'2006-02-15 21:30:53'),(7257,'2005-07-27 11:04:17',3302,480,'2005-08-04 12:32:17',2,'2006-02-15 21:30:53'),(7258,'2005-07-27 11:05:54',2079,494,'2005-08-02 11:36:54',1,'2006-02-15 21:30:53'),(7259,'2005-07-27 11:06:00',2345,406,'2005-08-02 06:44:00',2,'2006-02-15 21:30:53'),(7260,'2005-07-27 11:09:28',3827,434,'2005-08-03 09:41:28',1,'2006-02-15 21:30:53'),(7261,'2005-07-27 11:15:01',942,172,'2005-07-28 09:42:01',2,'2006-02-15 21:30:53'),(7262,'2005-07-27 11:15:36',4097,522,'2005-07-30 10:49:36',2,'2006-02-15 21:30:53'),(7263,'2005-07-27 11:17:22',725,324,'2005-08-04 10:59:22',1,'2006-02-15 21:30:53'),(7264,'2005-07-27 11:18:58',2391,299,'2005-08-03 07:43:58',2,'2006-02-15 21:30:53'),(7265,'2005-07-27 11:19:01',3465,290,'2005-08-01 09:29:01',1,'2006-02-15 21:30:53'),(7266,'2005-07-27 11:22:17',3379,24,'2005-08-04 05:45:17',1,'2006-02-15 21:30:53'),(7267,'2005-07-27 11:22:55',3661,122,'2005-08-01 08:13:55',1,'2006-02-15 21:30:53'),(7268,'2005-07-27 11:23:09',2740,260,'2005-08-01 12:42:09',2,'2006-02-15 21:30:53'),(7269,'2005-07-27 11:23:47',2089,209,'2005-07-31 13:10:47',1,'2006-02-15 21:30:53'),(7270,'2005-07-27 11:29:02',1888,526,'2005-08-05 08:04:02',1,'2006-02-15 21:30:53'),(7271,'2005-07-27 11:29:11',858,469,'2005-08-05 15:33:11',1,'2006-02-15 21:30:53'),(7272,'2005-07-27 11:30:20',250,364,'2005-07-29 17:16:20',2,'2006-02-15 21:30:53'),(7273,'2005-07-27 11:31:22',2465,1,'2005-07-31 06:50:22',1,'2006-02-15 21:30:53'),(7274,'2005-07-27 11:35:34',4087,180,'2005-08-01 07:10:34',1,'2006-02-15 21:30:53'),(7275,'2005-07-27 11:39:08',775,323,'2005-07-30 13:37:08',2,'2006-02-15 21:30:53'),(7276,'2005-07-27 11:41:57',1665,314,'2005-08-01 10:39:57',1,'2006-02-15 21:30:53'),(7277,'2005-07-27 11:48:37',1544,67,'2005-08-03 07:20:37',1,'2006-02-15 21:30:53'),(7278,'2005-07-27 11:50:34',531,592,'2005-08-01 10:22:34',1,'2006-02-15 21:30:53'),(7279,'2005-07-27 11:50:47',1424,12,'2005-07-30 11:19:47',2,'2006-02-15 21:30:53'),(7280,'2005-07-27 11:50:52',236,342,'2005-07-30 15:53:52',2,'2006-02-15 21:30:53'),(7281,'2005-07-27 11:59:20',1350,491,'2005-08-04 12:48:20',1,'2006-02-15 21:30:53'),(7282,'2005-07-27 12:00:19',4418,276,'2005-08-04 14:48:19',2,'2006-02-15 21:30:53'),(7283,'2005-07-27 12:02:41',3101,508,'2005-08-05 07:25:41',1,'2006-02-15 21:30:53'),(7284,'2005-07-27 12:12:04',2336,52,'2005-07-31 11:17:04',2,'2006-02-15 21:30:53'),(7285,'2005-07-27 12:14:06',2855,498,'2005-08-03 14:57:06',2,'2006-02-15 21:30:53'),(7286,'2005-07-27 12:23:49',3452,498,'2005-08-04 07:57:49',1,'2006-02-15 21:30:53'),(7287,'2005-07-27 12:24:12',926,198,'2005-07-31 15:34:12',1,'2006-02-15 21:30:53'),(7288,'2005-07-27 12:24:59',45,226,'2005-08-02 15:52:59',2,'2006-02-15 21:30:53'),(7289,'2005-07-27 12:26:51',2157,187,'2005-08-02 18:20:51',2,'2006-02-15 21:30:53'),(7290,'2005-07-27 12:28:45',3652,423,'2005-08-01 16:18:45',1,'2006-02-15 21:30:53'),(7291,'2005-07-27 12:30:47',310,263,'2005-08-01 12:45:47',1,'2006-02-15 21:30:53'),(7292,'2005-07-27 12:34:14',795,468,'2005-08-01 18:16:14',2,'2006-02-15 21:30:53'),(7293,'2005-07-27 12:37:28',3333,5,'2005-07-30 15:12:28',2,'2006-02-15 21:30:53'),(7294,'2005-07-27 12:38:14',487,313,'2005-07-30 13:01:14',1,'2006-02-15 21:30:53'),(7295,'2005-07-27 12:38:47',3396,462,'2005-08-05 10:12:47',1,'2006-02-15 21:30:53'),(7296,'2005-07-27 12:39:48',1681,400,'2005-08-04 18:24:48',2,'2006-02-15 21:30:53'),(7297,'2005-07-27 12:39:48',1855,135,'2005-07-29 17:50:48',2,'2006-02-15 21:30:53'),(7298,'2005-07-27 12:45:14',1653,121,'2005-07-30 07:02:14',1,'2006-02-15 21:30:53'),(7299,'2005-07-27 12:49:56',3002,286,'2005-08-03 12:25:56',1,'2006-02-15 21:30:53'),(7300,'2005-07-27 12:50:17',4561,272,'2005-08-04 18:43:17',1,'2006-02-15 21:30:53'),(7301,'2005-07-27 12:50:23',3367,93,'2005-08-01 09:43:23',2,'2006-02-15 21:30:53'),(7302,'2005-07-27 12:52:13',4539,477,'2005-07-29 15:13:13',2,'2006-02-15 21:30:53'),(7303,'2005-07-27 12:54:39',1398,163,'2005-07-31 09:26:39',2,'2006-02-15 21:30:53'),(7304,'2005-07-27 12:56:56',1162,74,'2005-08-05 09:19:56',2,'2006-02-15 21:30:53'),(7305,'2005-07-27 12:57:06',2464,229,'2005-07-30 13:13:06',2,'2006-02-15 21:30:53'),(7306,'2005-07-27 12:57:26',2269,207,'2005-08-03 09:35:26',2,'2006-02-15 21:30:53'),(7307,'2005-07-27 12:59:10',3882,595,'2005-07-29 11:35:10',1,'2006-02-15 21:30:53'),(7308,'2005-07-27 13:00:25',1452,229,'2005-08-03 16:04:25',1,'2006-02-15 21:30:53'),(7309,'2005-07-27 13:00:29',633,317,'2005-07-29 12:15:29',2,'2006-02-15 21:30:53'),(7310,'2005-07-27 13:00:55',3711,103,'2005-07-28 17:54:55',1,'2006-02-15 21:30:53'),(7311,'2005-07-27 13:02:54',2807,582,'2005-08-04 09:52:54',1,'2006-02-15 21:30:53'),(7312,'2005-07-27 13:03:14',228,543,'2005-07-31 07:56:14',2,'2006-02-15 21:30:53'),(7313,'2005-07-27 13:11:57',1884,396,'2005-08-02 07:31:57',1,'2006-02-15 21:30:53'),(7314,'2005-07-27 13:13:32',1376,11,'2005-08-03 09:24:32',2,'2006-02-15 21:30:53'),(7315,'2005-07-27 13:14:56',974,208,'2005-08-03 08:44:56',2,'2006-02-15 21:30:53'),(7316,'2005-07-27 13:19:03',3344,114,'2005-07-28 07:43:03',2,'2006-02-15 21:30:53'),(7317,'2005-07-27 13:19:41',1518,443,'2005-07-29 16:16:41',2,'2006-02-15 21:30:53'),(7318,'2005-07-27 13:25:31',1954,301,'2005-07-31 11:44:31',2,'2006-02-15 21:30:53'),(7319,'2005-07-27 13:31:25',2370,576,'2005-08-04 07:31:25',1,'2006-02-15 21:30:53'),(7320,'2005-07-27 13:33:35',4348,241,'2005-07-31 13:22:35',2,'2006-02-15 21:30:53'),(7321,'2005-07-27 13:33:38',3525,38,'2005-08-03 07:35:38',2,'2006-02-15 21:30:53'),(7322,'2005-07-27 13:37:26',1810,508,'2005-08-03 18:00:26',2,'2006-02-15 21:30:53'),(7323,'2005-07-27 13:39:40',3830,125,'2005-07-29 08:45:40',2,'2006-02-15 21:30:53'),(7324,'2005-07-27 13:42:39',2572,462,'2005-08-04 10:33:39',2,'2006-02-15 21:30:53'),(7325,'2005-07-27 13:46:55',1727,289,'2005-07-28 14:21:55',1,'2006-02-15 21:30:53'),(7326,'2005-07-27 13:50:40',2844,432,'2005-07-30 08:16:40',1,'2006-02-15 21:30:53'),(7327,'2005-07-27 13:53:26',4074,508,'2005-08-04 17:58:26',2,'2006-02-15 21:30:53'),(7328,'2005-07-27 13:55:18',663,26,'2005-08-01 19:52:18',1,'2006-02-15 21:30:53'),(7329,'2005-07-27 13:55:34',906,226,'2005-08-04 15:15:34',1,'2006-02-15 21:30:53'),(7330,'2005-07-27 13:56:46',3705,237,'2005-08-04 07:56:46',1,'2006-02-15 21:30:53'),(7331,'2005-07-27 13:57:50',2090,60,'2005-07-31 08:59:50',1,'2006-02-15 21:30:53'),(7332,'2005-07-27 13:58:57',1761,151,'2005-08-02 12:40:57',1,'2006-02-15 21:30:53'),(7333,'2005-07-27 13:59:11',1331,230,'2005-07-30 16:04:11',1,'2006-02-15 21:30:53'),(7334,'2005-07-27 13:59:58',3006,461,'2005-07-29 11:33:58',1,'2006-02-15 21:30:53'),(7335,'2005-07-27 14:06:50',1219,219,'2005-08-05 18:27:50',2,'2006-02-15 21:30:53'),(7336,'2005-07-27 14:11:45',2706,46,'2005-07-28 11:00:45',2,'2006-02-15 21:30:53'),(7337,'2005-07-27 14:12:04',3314,525,'2005-08-03 14:57:04',2,'2006-02-15 21:30:53'),(7338,'2005-07-27 14:13:34',107,251,'2005-08-03 18:36:34',2,'2006-02-15 21:30:53'),(7339,'2005-07-27 14:17:48',3343,316,'2005-07-31 12:47:48',2,'2006-02-15 21:30:53'),(7340,'2005-07-27 14:18:10',1344,567,'2005-07-30 09:57:10',1,'2006-02-15 21:30:53'),(7341,'2005-07-27 14:23:55',3567,498,'2005-07-28 14:11:55',2,'2006-02-15 21:30:53'),(7342,'2005-07-27 14:25:17',4083,504,'2005-08-04 10:02:17',2,'2006-02-15 21:30:53'),(7343,'2005-07-27 14:27:13',1177,526,'2005-07-30 09:27:13',2,'2006-02-15 21:30:53'),(7344,'2005-07-27 14:29:28',1714,366,'2005-07-31 15:36:28',1,'2006-02-15 21:30:53'),(7345,'2005-07-27 14:29:53',2434,572,'2005-08-03 18:38:53',2,'2006-02-15 21:30:53'),(7346,'2005-07-27 14:30:42',741,2,'2005-08-02 16:48:42',1,'2006-02-15 21:30:53'),(7347,'2005-07-27 14:31:24',3779,225,'2005-07-31 16:19:24',1,'2006-02-15 21:30:53'),(7348,'2005-07-27 14:32:32',3238,43,'2005-07-28 17:05:32',1,'2006-02-15 21:30:53'),(7349,'2005-07-27 14:33:00',861,195,'2005-08-01 15:01:00',2,'2006-02-15 21:30:53'),(7350,'2005-07-27 14:34:14',737,410,'2005-08-02 19:19:14',2,'2006-02-15 21:30:53'),(7351,'2005-07-27 14:37:36',2147,445,'2005-07-30 09:58:36',2,'2006-02-15 21:30:53'),(7352,'2005-07-27 14:38:29',35,429,'2005-07-28 14:24:29',1,'2006-02-15 21:30:53'),(7353,'2005-07-27 14:38:39',1308,357,'2005-07-31 19:50:39',1,'2006-02-15 21:30:53'),(7354,'2005-07-27 14:42:11',2395,598,'2005-08-03 18:19:11',2,'2006-02-15 21:30:53'),(7355,'2005-07-27 14:45:59',3803,115,'2005-08-02 17:23:59',2,'2006-02-15 21:30:53'),(7356,'2005-07-27 14:47:35',309,397,'2005-07-28 18:10:35',2,'2006-02-15 21:30:53'),(7357,'2005-07-27 14:48:31',1917,438,'2005-08-02 18:07:31',2,'2006-02-15 21:30:53'),(7358,'2005-07-27 14:49:44',175,245,'2005-07-28 20:00:44',1,'2006-02-15 21:30:53'),(7359,'2005-07-27 14:51:04',174,183,'2005-07-31 16:03:04',2,'2006-02-15 21:30:53'),(7360,'2005-07-27 14:52:06',1312,467,'2005-08-02 12:24:06',2,'2006-02-15 21:30:53'),(7361,'2005-07-27 14:53:55',4567,463,'2005-07-31 19:48:55',2,'2006-02-15 21:30:53'),(7362,'2005-07-27 14:58:27',1902,419,'2005-08-01 11:51:27',1,'2006-02-15 21:30:53'),(7363,'2005-07-27 14:58:29',1649,407,'2005-08-05 09:02:29',1,'2006-02-15 21:30:53'),(7364,'2005-07-27 14:58:40',3046,592,'2005-08-03 09:01:40',2,'2006-02-15 21:30:53'),(7365,'2005-07-27 15:00:20',3283,450,'2005-07-30 12:58:20',1,'2006-02-15 21:30:53'),(7366,'2005-07-27 15:01:17',461,357,'2005-08-04 20:28:17',1,'2006-02-15 21:30:53'),(7367,'2005-07-27 15:05:45',1738,383,'2005-08-02 13:46:45',1,'2006-02-15 21:30:53'),(7368,'2005-07-27 15:06:05',2265,286,'2005-07-31 14:10:05',2,'2006-02-15 21:30:53'),(7369,'2005-07-27 15:07:58',3889,139,'2005-07-30 09:16:58',2,'2006-02-15 21:30:53'),(7370,'2005-07-27 15:15:53',2022,89,'2005-08-03 19:53:53',2,'2006-02-15 21:30:53'),(7371,'2005-07-27 15:18:42',1807,577,'2005-08-01 09:58:42',1,'2006-02-15 21:30:53'),(7372,'2005-07-27 15:18:42',3202,584,'2005-08-01 15:18:42',2,'2006-02-15 21:30:53'),(7373,'2005-07-27 15:19:33',3074,488,'2005-08-04 10:45:33',1,'2006-02-15 21:30:53'),(7374,'2005-07-27 15:20:57',3184,438,'2005-08-05 13:09:57',2,'2006-02-15 21:30:53'),(7375,'2005-07-27 15:22:33',2970,381,'2005-08-01 20:06:33',1,'2006-02-15 21:30:53'),(7376,'2005-07-27 15:23:02',488,2,'2005-08-04 10:35:02',2,'2006-02-15 21:30:53'),(7377,'2005-07-27 15:31:28',1369,588,'2005-08-02 19:59:28',2,'2006-02-15 21:30:53'),(7378,'2005-07-27 15:31:33',3297,144,'2005-08-03 17:15:33',2,'2006-02-15 21:30:53'),(7379,'2005-07-27 15:36:43',424,415,'2005-07-30 16:37:43',2,'2006-02-15 21:30:53'),(7380,'2005-07-27 15:37:01',988,348,'2005-08-03 19:24:01',1,'2006-02-15 21:30:53'),(7381,'2005-07-27 15:40:26',1595,483,'2005-08-02 17:26:26',2,'2006-02-15 21:30:53'),(7382,'2005-07-27 15:43:15',356,518,'2005-07-28 11:18:15',2,'2006-02-15 21:30:53'),(7383,'2005-07-27 15:46:53',3860,50,'2005-08-03 11:10:53',1,'2006-02-15 21:30:53'),(7384,'2005-07-27 15:49:45',3573,585,'2005-08-04 15:17:45',1,'2006-02-15 21:30:53'),(7385,'2005-07-27 15:49:46',2996,56,'2005-07-28 13:50:46',2,'2006-02-15 21:30:53'),(7386,'2005-07-27 15:52:10',3569,190,'2005-08-04 15:13:10',1,'2006-02-15 21:30:53'),(7387,'2005-07-27 15:54:19',3274,233,'2005-08-03 14:46:19',1,'2006-02-15 21:30:53'),(7388,'2005-07-27 15:54:19',4559,455,'2005-08-01 17:02:19',2,'2006-02-15 21:30:53'),(7389,'2005-07-27 15:56:15',3822,156,'2005-07-30 21:28:15',2,'2006-02-15 21:30:53'),(7390,'2005-07-27 15:59:19',1723,230,'2005-08-04 10:09:19',2,'2006-02-15 21:30:53'),(7391,'2005-07-27 16:00:00',1153,531,'2005-08-04 18:07:00',2,'2006-02-15 21:30:53'),(7392,'2005-07-27 16:01:05',3159,204,'2005-08-01 17:23:05',2,'2006-02-15 21:30:53'),(7393,'2005-07-27 16:02:52',2369,181,'2005-08-02 13:24:52',1,'2006-02-15 21:30:53'),(7394,'2005-07-27 16:03:08',2399,30,'2005-08-04 11:27:08',2,'2006-02-15 21:30:53'),(7395,'2005-07-27 16:03:11',2888,411,'2005-07-31 20:26:11',2,'2006-02-15 21:30:53'),(7396,'2005-07-27 16:03:53',3346,595,'2005-08-05 10:36:53',2,'2006-02-15 21:30:53'),(7397,'2005-07-27 16:05:00',4474,245,'2005-08-01 20:29:00',1,'2006-02-15 21:30:53'),(7398,'2005-07-27 16:07:22',1572,51,'2005-08-05 16:16:22',1,'2006-02-15 21:30:53'),(7399,'2005-07-27 16:16:02',1682,526,'2005-08-03 18:02:02',2,'2006-02-15 21:30:53'),(7400,'2005-07-27 16:16:37',2874,133,'2005-07-31 12:34:37',2,'2006-02-15 21:30:53'),(7401,'2005-07-27 16:17:55',2759,583,'2005-08-04 15:48:55',1,'2006-02-15 21:30:53'),(7402,'2005-07-27 16:19:40',2707,287,'2005-08-05 14:48:40',2,'2006-02-15 21:30:53'),(7403,'2005-07-27 16:22:09',2551,163,'2005-08-01 15:32:09',1,'2006-02-15 21:30:53'),(7404,'2005-07-27 16:24:43',2359,190,'2005-07-29 11:40:43',2,'2006-02-15 21:30:53'),(7405,'2005-07-27 16:25:11',2312,42,'2005-08-01 12:33:11',2,'2006-02-15 21:30:53'),(7406,'2005-07-27 16:25:45',1412,77,'2005-08-05 20:39:45',1,'2006-02-15 21:30:53'),(7407,'2005-07-27 16:29:04',3093,410,'2005-08-01 17:47:04',2,'2006-02-15 21:30:53'),(7408,'2005-07-27 16:31:40',625,371,'2005-07-31 11:56:40',2,'2006-02-15 21:30:53'),(7409,'2005-07-27 16:38:24',2352,585,'2005-07-30 18:06:24',1,'2006-02-15 21:30:53'),(7410,'2005-07-27 16:41:59',1559,337,'2005-07-29 22:11:59',1,'2006-02-15 21:30:53'),(7411,'2005-07-27 16:42:30',515,302,'2005-08-05 17:38:30',1,'2006-02-15 21:30:53'),(7412,'2005-07-27 16:44:34',950,582,'2005-08-04 15:06:34',2,'2006-02-15 21:30:53'),(7413,'2005-07-27 16:45:40',2909,254,'2005-07-31 12:02:40',1,'2006-02-15 21:30:53'),(7414,'2005-07-27 16:46:07',3276,265,'2005-08-02 20:04:07',1,'2006-02-15 21:30:53'),(7415,'2005-07-27 16:50:59',4410,294,'2005-08-02 11:21:59',1,'2006-02-15 21:30:53'),(7416,'2005-07-27 16:55:25',653,350,'2005-07-29 11:27:25',1,'2006-02-15 21:30:53'),(7417,'2005-07-27 16:58:33',2952,214,'2005-07-30 22:17:33',1,'2006-02-15 21:30:53'),(7418,'2005-07-27 16:59:09',3029,332,'2005-07-29 15:08:09',2,'2006-02-15 21:30:53'),(7419,'2005-07-27 17:04:15',3454,352,'2005-08-05 21:54:15',2,'2006-02-15 21:30:53'),(7420,'2005-07-27 17:09:39',3505,547,'2005-07-30 12:30:39',2,'2006-02-15 21:30:53'),(7421,'2005-07-27 17:10:05',3548,70,'2005-08-05 17:55:05',1,'2006-02-15 21:30:53'),(7422,'2005-07-27 17:10:42',3954,286,'2005-08-03 19:32:42',1,'2006-02-15 21:30:53'),(7423,'2005-07-27 17:11:47',666,277,'2005-07-29 12:29:47',2,'2006-02-15 21:30:53'),(7424,'2005-07-27 17:14:19',660,558,'2005-08-01 19:21:19',2,'2006-02-15 21:30:53'),(7425,'2005-07-27 17:18:35',435,263,'2005-08-02 11:18:35',1,'2006-02-15 21:30:53'),(7426,'2005-07-27 17:19:46',4420,239,'2005-07-29 21:41:46',1,'2006-02-15 21:30:53'),(7427,'2005-07-27 17:20:16',2548,442,'2005-08-03 20:38:16',2,'2006-02-15 21:30:53'),(7428,'2005-07-27 17:21:52',243,90,'2005-08-05 17:13:52',2,'2006-02-15 21:30:53'),(7429,'2005-07-27 17:24:50',2160,515,'2005-08-05 23:02:50',1,'2006-02-15 21:30:53'),(7430,'2005-07-27 17:26:14',4205,562,'2005-08-01 13:02:14',2,'2006-02-15 21:30:53'),(7431,'2005-07-27 17:27:27',3931,589,'2005-07-31 18:40:27',1,'2006-02-15 21:30:53'),(7432,'2005-07-27 17:31:40',3169,132,'2005-07-28 17:44:40',2,'2006-02-15 21:30:53'),(7433,'2005-07-27 17:32:20',1748,282,'2005-08-01 18:49:20',1,'2006-02-15 21:30:53'),(7434,'2005-07-27 17:34:40',2927,241,'2005-07-29 15:01:40',1,'2006-02-15 21:30:53'),(7435,'2005-07-27 17:38:44',1574,380,'2005-07-30 16:57:44',1,'2006-02-15 21:30:53'),(7436,'2005-07-27 17:39:12',299,45,'2005-08-01 12:40:12',2,'2006-02-15 21:30:53'),(7437,'2005-07-27 17:39:18',2617,135,'2005-07-28 18:33:18',2,'2006-02-15 21:30:53'),(7438,'2005-07-27 17:40:40',1364,52,'2005-08-05 15:25:40',1,'2006-02-15 21:30:53'),(7439,'2005-07-27 17:42:31',4091,102,'2005-08-05 16:34:31',1,'2006-02-15 21:30:53'),(7440,'2005-07-27 17:43:27',1476,484,'2005-08-03 22:12:27',1,'2006-02-15 21:30:53'),(7441,'2005-07-27 17:46:53',4039,198,'2005-07-31 23:05:53',1,'2006-02-15 21:30:53'),(7442,'2005-07-27 17:47:00',2471,105,'2005-07-28 21:37:00',1,'2006-02-15 21:30:53'),(7443,'2005-07-27 17:47:43',703,380,'2005-07-29 13:15:43',1,'2006-02-15 21:30:53'),(7444,'2005-07-27 17:49:16',120,531,'2005-07-28 15:05:16',1,'2006-02-15 21:30:53'),(7445,'2005-07-27 17:57:15',4115,394,'2005-07-31 20:24:15',1,'2006-02-15 21:30:53'),(7446,'2005-07-27 18:00:24',2337,486,'2005-07-29 13:40:24',1,'2006-02-15 21:30:53'),(7447,'2005-07-27 18:02:08',1795,107,'2005-07-29 21:15:08',1,'2006-02-15 21:30:53'),(7448,'2005-07-27 18:06:30',3584,175,'2005-07-29 15:43:30',1,'2006-02-15 21:30:53'),(7449,'2005-07-27 18:17:41',2084,421,'2005-08-01 18:52:41',1,'2006-02-15 21:30:53'),(7450,'2005-07-27 18:18:35',3496,191,'2005-08-04 15:18:35',1,'2006-02-15 21:30:53'),(7451,'2005-07-27 18:18:41',2382,29,'2005-08-03 13:55:41',2,'2006-02-15 21:30:53'),(7452,'2005-07-27 18:26:39',3482,285,'2005-08-04 17:35:39',2,'2006-02-15 21:30:53'),(7453,'2005-07-27 18:27:13',2992,29,'2005-07-29 23:52:13',1,'2006-02-15 21:30:53'),(7454,'2005-07-27 18:27:26',3248,75,'2005-07-30 23:50:26',1,'2006-02-15 21:30:53'),(7455,'2005-07-27 18:34:41',3815,405,'2005-07-31 17:32:41',1,'2006-02-15 21:30:53'),(7456,'2005-07-27 18:34:53',1959,501,'2005-07-29 17:46:53',2,'2006-02-15 21:30:53'),(7457,'2005-07-27 18:35:17',3635,510,'2005-07-30 12:41:17',2,'2006-02-15 21:30:53'),(7458,'2005-07-27 18:36:17',2964,327,'2005-07-31 22:43:17',1,'2006-02-15 21:30:53'),(7459,'2005-07-27 18:40:20',2053,2,'2005-08-02 21:07:20',2,'2006-02-15 21:30:53'),(7460,'2005-07-27 18:41:35',919,442,'2005-07-29 15:16:35',2,'2006-02-15 21:30:53'),(7461,'2005-07-27 18:45:15',1236,476,'2005-07-29 17:19:15',1,'2006-02-15 21:30:53'),(7462,'2005-07-27 18:47:47',878,114,'2005-07-29 20:46:47',2,'2006-02-15 21:30:53'),(7463,'2005-07-27 18:48:32',3676,284,'2005-07-29 23:54:32',2,'2006-02-15 21:30:53'),(7464,'2005-07-27 18:49:42',845,31,'2005-07-28 20:45:42',2,'2006-02-15 21:30:53'),(7465,'2005-07-27 18:50:30',2357,115,'2005-07-30 20:55:30',1,'2006-02-15 21:30:53'),(7466,'2005-07-27 18:51:17',2791,53,'2005-07-31 16:58:17',1,'2006-02-15 21:30:53'),(7467,'2005-07-27 18:51:54',3869,240,'2005-08-03 23:27:54',2,'2006-02-15 21:30:53'),(7468,'2005-07-27 18:52:27',3166,113,'2005-08-03 19:29:27',2,'2006-02-15 21:30:53'),(7469,'2005-07-27 18:57:40',3723,189,'2005-07-31 00:17:40',1,'2006-02-15 21:30:53'),(7470,'2005-07-27 19:01:03',289,564,'2005-08-05 19:16:03',2,'2006-02-15 21:30:53'),(7471,'2005-07-27 19:02:19',1776,95,'2005-07-30 15:12:19',1,'2006-02-15 21:30:53'),(7472,'2005-07-27 19:04:19',1535,103,'2005-08-03 00:08:19',2,'2006-02-15 21:30:53'),(7473,'2005-07-27 19:05:40',401,341,'2005-08-05 14:47:40',1,'2006-02-15 21:30:53'),(7474,'2005-07-27 19:07:17',2971,110,'2005-07-30 00:37:17',1,'2006-02-15 21:30:53'),(7475,'2005-07-27 19:07:43',1670,255,'2005-08-04 22:12:43',2,'2006-02-15 21:30:53'),(7476,'2005-07-27 19:08:56',2288,64,'2005-07-31 16:36:56',2,'2006-02-15 21:30:53'),(7477,'2005-07-27 19:11:03',2692,355,'2005-08-02 19:25:03',1,'2006-02-15 21:30:53'),(7478,'2005-07-27 19:16:02',3791,521,'2005-08-04 22:30:02',2,'2006-02-15 21:30:53'),(7479,'2005-07-27 19:18:17',218,434,'2005-07-30 18:55:17',1,'2006-02-15 21:30:53'),(7480,'2005-07-27 19:19:53',452,344,'2005-08-02 01:01:53',1,'2006-02-15 21:30:53'),(7481,'2005-07-27 19:20:25',1804,240,'2005-07-29 19:07:25',2,'2006-02-15 21:30:53'),(7482,'2005-07-27 19:24:16',485,348,'2005-08-05 18:49:16',2,'2006-02-15 21:30:53'),(7483,'2005-07-27 19:25:00',3678,106,'2005-07-29 21:19:00',2,'2006-02-15 21:30:53'),(7484,'2005-07-27 19:28:17',2746,211,'2005-07-31 20:05:17',2,'2006-02-15 21:30:53'),(7485,'2005-07-27 19:29:09',631,362,'2005-07-30 16:28:09',1,'2006-02-15 21:30:53'),(7486,'2005-07-27 19:29:24',4362,393,'2005-08-02 20:46:24',2,'2006-02-15 21:30:53'),(7487,'2005-07-27 19:32:45',4451,58,'2005-07-28 15:11:45',1,'2006-02-15 21:30:53'),(7488,'2005-07-27 19:36:15',554,365,'2005-08-05 14:14:15',1,'2006-02-15 21:30:53'),(7489,'2005-07-27 19:39:38',3732,16,'2005-07-30 23:10:38',2,'2006-02-15 21:30:53'),(7490,'2005-07-27 19:48:12',4503,595,'2005-08-04 17:15:12',1,'2006-02-15 21:30:53'),(7491,'2005-07-27 19:53:23',4261,239,'2005-07-28 23:25:23',2,'2006-02-15 21:30:53'),(7492,'2005-07-27 19:54:18',908,155,'2005-07-31 15:36:18',2,'2006-02-15 21:30:53'),(7493,'2005-07-27 19:55:46',2868,177,'2005-08-02 19:46:46',2,'2006-02-15 21:30:53'),(7494,'2005-07-27 19:56:31',2259,60,'2005-07-30 14:28:31',1,'2006-02-15 21:30:53'),(7495,'2005-07-27 20:01:20',3446,426,'2005-07-30 16:40:20',1,'2006-02-15 21:30:53'),(7496,'2005-07-27 20:04:05',2449,257,'2005-08-02 20:12:05',1,'2006-02-15 21:30:53'),(7497,'2005-07-27 20:05:27',286,387,'2005-07-30 22:47:27',1,'2006-02-15 21:30:53'),(7498,'2005-07-27 20:09:31',1144,455,'2005-07-29 23:38:31',1,'2006-02-15 21:30:53'),(7499,'2005-07-27 20:10:28',3503,157,'2005-07-30 16:24:28',1,'2006-02-15 21:30:53'),(7500,'2005-07-27 20:16:03',609,160,'2005-07-29 18:50:03',1,'2006-02-15 21:30:53'),(7501,'2005-07-27 20:16:59',1464,587,'2005-08-04 00:11:59',2,'2006-02-15 21:30:53'),(7502,'2005-07-27 20:19:08',3229,303,'2005-07-28 18:32:08',2,'2006-02-15 21:30:53'),(7503,'2005-07-27 20:23:12',579,3,'2005-08-05 18:46:12',2,'2006-02-15 21:30:53'),(7504,'2005-07-27 20:24:31',3354,283,'2005-07-30 21:25:31',2,'2006-02-15 21:30:53'),(7505,'2005-07-27 20:28:03',1342,209,'2005-08-03 17:04:03',1,'2006-02-15 21:30:53'),(7506,'2005-07-27 20:28:34',2091,527,'2005-08-05 18:14:34',1,'2006-02-15 21:30:53'),(7507,'2005-07-27 20:31:48',3618,512,'2005-08-02 17:27:48',1,'2006-02-15 21:30:53'),(7508,'2005-07-27 20:33:08',3401,465,'2005-08-01 01:29:08',1,'2006-02-15 21:30:53'),(7509,'2005-07-27 20:37:19',4134,228,'2005-08-04 19:35:19',2,'2006-02-15 21:30:53'),(7510,'2005-07-27 20:37:57',1617,257,'2005-08-01 17:14:57',2,'2006-02-15 21:30:53'),(7511,'2005-07-27 20:38:40',4044,591,'2005-08-04 22:36:40',2,'2006-02-15 21:30:53'),(7512,'2005-07-27 20:40:40',1343,352,'2005-08-05 01:44:40',1,'2006-02-15 21:30:53'),(7513,'2005-07-27 20:51:04',939,411,'2005-08-03 20:15:04',2,'2006-02-15 21:30:53'),(7514,'2005-07-27 20:51:49',400,44,'2005-07-29 18:21:49',2,'2006-02-15 21:30:53'),(7515,'2005-07-27 20:52:37',1211,390,'2005-08-02 20:17:37',2,'2006-02-15 21:30:53'),(7516,'2005-07-27 20:55:28',2178,134,'2005-07-30 00:50:28',1,'2006-02-15 21:30:53'),(7517,'2005-07-27 20:57:07',3177,41,'2005-08-04 15:08:07',1,'2006-02-15 21:30:53'),(7518,'2005-07-27 21:01:16',2676,257,'2005-08-03 15:26:16',1,'2006-02-15 21:30:53'),(7519,'2005-07-27 21:01:41',4009,124,'2005-08-05 19:15:41',1,'2006-02-15 21:30:53'),(7520,'2005-07-27 21:02:02',3875,191,'2005-07-28 18:18:02',1,'2006-02-15 21:30:53'),(7521,'2005-07-27 21:04:42',3144,176,'2005-08-03 16:06:42',1,'2006-02-15 21:30:53'),(7522,'2005-07-27 21:11:03',2038,478,'2005-08-02 16:40:03',1,'2006-02-15 21:30:53'),(7523,'2005-07-27 21:11:23',4153,410,'2005-07-28 16:37:23',1,'2006-02-15 21:30:53'),(7524,'2005-07-27 21:11:44',4295,225,'2005-08-03 02:17:44',1,'2006-02-15 21:30:53'),(7525,'2005-07-27 21:13:28',4084,281,'2005-08-04 19:44:28',2,'2006-02-15 21:30:53'),(7526,'2005-07-27 21:13:47',696,44,'2005-08-05 15:23:47',2,'2006-02-15 21:30:53'),(7527,'2005-07-27 21:14:28',2124,426,'2005-08-05 21:08:28',1,'2006-02-15 21:30:53'),(7528,'2005-07-27 21:15:25',1218,213,'2005-08-03 19:12:25',1,'2006-02-15 21:30:53'),(7529,'2005-07-27 21:18:08',3644,145,'2005-08-06 00:59:08',1,'2006-02-15 21:30:53'),(7530,'2005-07-27 21:18:58',3810,98,'2005-07-31 01:51:58',2,'2006-02-15 21:30:53'),(7531,'2005-07-27 21:19:34',2393,221,'2005-08-06 01:07:34',2,'2006-02-15 21:30:53'),(7532,'2005-07-27 21:20:52',677,34,'2005-07-30 21:38:52',1,'2006-02-15 21:30:53'),(7533,'2005-07-27 21:24:33',1791,594,'2005-08-05 16:33:33',2,'2006-02-15 21:30:53'),(7534,'2005-07-27 21:26:17',2276,282,'2005-08-05 00:23:17',2,'2006-02-15 21:30:53'),(7535,'2005-07-27 21:32:39',772,123,'2005-08-05 23:42:39',1,'2006-02-15 21:30:53'),(7536,'2005-07-27 21:34:09',3417,307,'2005-08-02 03:26:09',1,'2006-02-15 21:30:53'),(7537,'2005-07-27 21:36:09',4456,269,'2005-08-01 01:51:09',1,'2006-02-15 21:30:53'),(7538,'2005-07-27 21:38:04',2486,361,'2005-08-02 03:14:04',1,'2006-02-15 21:30:53'),(7539,'2005-07-27 21:39:42',1849,423,'2005-08-06 00:12:42',1,'2006-02-15 21:30:53'),(7540,'2005-07-27 21:39:55',2198,207,'2005-08-04 18:10:55',2,'2006-02-15 21:30:53'),(7541,'2005-07-27 21:40:05',4100,206,'2005-07-29 16:13:05',1,'2006-02-15 21:30:53'),(7542,'2005-07-27 21:43:04',1912,110,'2005-07-30 00:02:04',1,'2006-02-15 21:30:53'),(7543,'2005-07-27 21:44:28',1289,526,'2005-08-04 21:42:28',2,'2006-02-15 21:30:53'),(7544,'2005-07-27 21:47:37',766,249,'2005-08-05 02:29:37',2,'2006-02-15 21:30:53'),(7545,'2005-07-27 21:48:03',2541,292,'2005-08-01 22:23:03',2,'2006-02-15 21:30:53'),(7546,'2005-07-27 21:50:09',3683,494,'2005-08-05 03:07:09',2,'2006-02-15 21:30:53'),(7547,'2005-07-27 21:51:48',1733,547,'2005-08-06 01:05:48',2,'2006-02-15 21:30:53'),(7548,'2005-07-27 21:53:18',2194,484,'2005-08-02 17:50:18',1,'2006-02-15 21:30:53'),(7549,'2005-07-27 21:53:21',1765,591,'2005-08-05 18:53:21',1,'2006-02-15 21:30:53'),(7550,'2005-07-27 21:55:07',4488,71,'2005-07-28 23:34:07',2,'2006-02-15 21:30:53'),(7551,'2005-07-27 21:59:15',2635,304,'2005-07-31 19:54:15',2,'2006-02-15 21:30:53'),(7552,'2005-07-27 22:03:41',2166,16,'2005-07-28 22:24:41',1,'2006-02-15 21:30:53'),(7553,'2005-07-27 22:11:36',1643,275,'2005-08-03 17:52:36',1,'2006-02-15 21:30:53'),(7554,'2005-07-27 22:12:41',1805,135,'2005-08-04 01:34:41',2,'2006-02-15 21:30:53'),(7555,'2005-07-27 22:17:05',3421,533,'2005-08-02 02:50:05',2,'2006-02-15 21:30:53'),(7556,'2005-07-27 22:17:17',794,188,'2005-07-28 19:17:17',2,'2006-02-15 21:30:53'),(7557,'2005-07-27 22:18:19',3152,131,'2005-07-29 00:24:19',1,'2006-02-15 21:30:53'),(7558,'2005-07-27 22:19:08',550,80,'2005-07-30 21:31:08',1,'2006-02-15 21:30:53'),(7559,'2005-07-27 22:20:03',661,149,'2005-08-06 00:26:03',2,'2006-02-15 21:30:53'),(7560,'2005-07-27 22:20:17',3574,562,'2005-08-02 23:00:17',2,'2006-02-15 21:30:53'),(7561,'2005-07-27 22:21:05',3433,291,'2005-08-04 01:02:05',1,'2006-02-15 21:30:53'),(7562,'2005-07-27 22:25:15',4417,366,'2005-08-01 01:21:15',2,'2006-02-15 21:30:53'),(7563,'2005-07-27 22:25:36',2709,453,'2005-08-01 03:59:36',2,'2006-02-15 21:30:53'),(7564,'2005-07-27 22:31:17',2887,291,'2005-08-01 01:05:17',2,'2006-02-15 21:30:53'),(7565,'2005-07-27 22:33:59',1028,114,'2005-07-30 03:03:59',2,'2006-02-15 21:30:53'),(7566,'2005-07-27 22:34:45',1802,144,'2005-08-01 22:20:45',1,'2006-02-15 21:30:53'),(7567,'2005-07-27 22:38:05',1066,504,'2005-07-30 17:20:05',1,'2006-02-15 21:30:53'),(7568,'2005-07-27 22:38:53',1578,296,'2005-07-29 00:51:53',1,'2006-02-15 21:30:53'),(7569,'2005-07-27 22:38:53',2315,528,'2005-08-05 19:03:53',2,'2006-02-15 21:30:53'),(7570,'2005-07-27 22:40:06',3189,110,'2005-07-28 23:14:06',1,'2006-02-15 21:30:53'),(7571,'2005-07-27 22:43:42',3850,368,'2005-07-30 22:17:42',1,'2006-02-15 21:30:53'),(7572,'2005-07-27 22:44:29',3068,532,'2005-08-01 03:04:29',1,'2006-02-15 21:30:53'),(7573,'2005-07-27 22:46:20',314,467,'2005-08-04 01:55:20',1,'2006-02-15 21:30:53'),(7574,'2005-07-27 22:53:00',298,200,'2005-07-29 18:39:00',2,'2006-02-15 21:30:53'),(7575,'2005-07-27 22:53:52',702,582,'2005-07-29 02:02:52',1,'2006-02-15 21:30:53'),(7576,'2005-07-27 22:54:35',3374,446,'2005-08-03 03:53:35',2,'2006-02-15 21:30:53'),(7577,'2005-07-27 22:56:07',2723,332,'2005-08-05 21:23:07',2,'2006-02-15 21:30:53'),(7578,'2005-07-27 22:58:17',4210,332,'2005-07-29 23:14:17',1,'2006-02-15 21:30:53'),(7579,'2005-07-27 23:06:41',501,352,'2005-07-31 20:08:41',2,'2006-02-15 21:30:53'),(7580,'2005-07-27 23:07:40',338,28,'2005-08-05 02:17:40',1,'2006-02-15 21:30:53'),(7581,'2005-07-27 23:14:35',2051,166,'2005-07-29 21:30:35',1,'2006-02-15 21:30:53'),(7582,'2005-07-27 23:15:14',3941,128,'2005-07-29 03:18:14',2,'2006-02-15 21:30:53'),(7583,'2005-07-27 23:15:22',2890,198,'2005-08-04 04:39:22',2,'2006-02-15 21:30:53'),(7584,'2005-07-27 23:15:46',4390,338,'2005-08-03 02:18:46',2,'2006-02-15 21:30:53'),(7585,'2005-07-27 23:18:22',467,440,'2005-07-30 23:08:22',1,'2006-02-15 21:30:53'),(7586,'2005-07-27 23:19:29',15,316,'2005-07-29 23:04:29',1,'2006-02-15 21:30:53'),(7587,'2005-07-27 23:23:03',655,113,'2005-08-01 17:34:03',1,'2006-02-15 21:30:53'),(7588,'2005-07-27 23:23:31',4033,360,'2005-08-04 02:54:31',1,'2006-02-15 21:30:53'),(7589,'2005-07-27 23:23:36',1569,32,'2005-08-04 00:16:36',1,'2006-02-15 21:30:53'),(7590,'2005-07-27 23:24:24',2152,73,'2005-07-28 19:53:24',2,'2006-02-15 21:30:53'),(7591,'2005-07-27 23:25:54',651,525,'2005-08-02 22:54:54',1,'2006-02-15 21:30:53'),(7592,'2005-07-27 23:26:04',4105,316,'2005-07-29 23:48:04',2,'2006-02-15 21:30:53'),(7593,'2005-07-27 23:28:47',1158,436,'2005-08-02 19:51:47',1,'2006-02-15 21:30:53'),(7594,'2005-07-27 23:30:41',3230,424,'2005-08-02 04:29:41',1,'2006-02-15 21:30:53'),(7595,'2005-07-27 23:32:23',4313,390,'2005-08-03 05:28:23',1,'2006-02-15 21:30:53'),(7596,'2005-07-27 23:33:57',2097,275,'2005-08-01 20:46:57',2,'2006-02-15 21:30:53'),(7597,'2005-07-27 23:35:49',2856,169,'2005-07-30 21:38:49',1,'2006-02-15 21:30:53'),(7598,'2005-07-27 23:36:01',4545,438,'2005-07-29 23:35:01',2,'2006-02-15 21:30:53'),(7599,'2005-07-27 23:38:46',3272,87,'2005-07-28 22:52:46',1,'2006-02-15 21:30:53'),(7600,'2005-07-27 23:41:18',3492,107,'2005-08-06 04:40:18',1,'2006-02-15 21:30:53'),(7601,'2005-07-27 23:48:15',903,228,'2005-07-29 02:45:15',1,'2006-02-15 21:30:53'),(7602,'2005-07-27 23:48:35',2516,366,'2005-08-04 17:58:35',1,'2006-02-15 21:30:53'),(7603,'2005-07-27 23:54:44',124,497,'2005-07-29 01:24:44',1,'2006-02-15 21:30:53'),(7604,'2005-07-27 23:54:52',3720,406,'2005-08-05 03:04:52',2,'2006-02-15 21:30:53'),(7605,'2005-07-27 23:57:01',1391,576,'2005-08-03 04:11:01',1,'2006-02-15 21:30:53'),(7606,'2005-07-28 00:02:15',637,201,'2005-07-29 03:14:15',2,'2006-02-15 21:30:53'),(7607,'2005-07-28 00:05:53',3914,293,'2005-07-31 04:13:53',1,'2006-02-15 21:30:53'),(7608,'2005-07-28 00:08:36',1256,167,'2005-07-28 18:13:36',1,'2006-02-15 21:30:53'),(7609,'2005-07-28 00:11:00',3655,179,'2005-07-31 03:04:00',1,'2006-02-15 21:30:53'),(7610,'2005-07-28 00:11:35',1279,450,'2005-07-31 00:33:35',1,'2006-02-15 21:30:53'),(7611,'2005-07-28 00:11:47',3347,467,'2005-07-28 18:35:47',1,'2006-02-15 21:30:53'),(7612,'2005-07-28 00:11:55',1411,563,'2005-07-30 00:47:55',1,'2006-02-15 21:30:53'),(7613,'2005-07-28 00:13:58',4253,202,'2005-08-06 05:36:58',2,'2006-02-15 21:30:53'),(7614,'2005-07-28 00:14:38',3475,440,'2005-07-29 18:18:38',1,'2006-02-15 21:30:53'),(7615,'2005-07-28 00:15:24',3884,373,'2005-07-31 02:00:24',1,'2006-02-15 21:30:53'),(7616,'2005-07-28 00:15:26',3790,9,'2005-07-30 21:52:26',1,'2006-02-15 21:30:53'),(7617,'2005-07-28 00:18:40',2904,340,'2005-08-01 01:17:40',1,'2006-02-15 21:30:53'),(7618,'2005-07-28 00:24:14',774,271,'2005-08-01 04:35:14',1,'2006-02-15 21:30:53'),(7619,'2005-07-28 00:25:41',1057,419,'2005-07-30 04:35:41',2,'2006-02-15 21:30:53'),(7620,'2005-07-28 00:27:17',931,580,'2005-07-31 02:04:17',1,'2006-02-15 21:30:53'),(7621,'2005-07-28 00:34:06',1833,88,'2005-08-06 00:13:06',1,'2006-02-15 21:30:53'),(7622,'2005-07-28 00:37:34',4014,198,'2005-07-31 23:27:34',2,'2006-02-15 21:30:53'),(7623,'2005-07-28 00:37:41',1146,459,'2005-08-04 19:38:41',2,'2006-02-15 21:30:53'),(7624,'2005-07-28 00:37:44',2756,415,'2005-07-30 21:26:44',1,'2006-02-15 21:30:53'),(7625,'2005-07-28 00:47:56',3129,382,'2005-08-02 23:34:56',1,'2006-02-15 21:30:53'),(7626,'2005-07-28 00:49:01',4200,450,'2005-07-31 00:43:01',1,'2006-02-15 21:30:53'),(7627,'2005-07-28 00:56:47',782,52,'2005-08-02 04:16:47',1,'2006-02-15 21:30:53'),(7628,'2005-07-28 00:58:04',1240,516,'2005-08-03 19:16:04',1,'2006-02-15 21:30:53'),(7629,'2005-07-28 01:00:09',2453,229,'2005-07-30 06:49:09',1,'2006-02-15 21:30:53'),(7630,'2005-07-28 01:01:03',2798,351,'2005-07-31 01:08:03',2,'2006-02-15 21:30:53'),(7631,'2005-07-28 01:01:15',2437,132,'2005-08-01 06:16:15',2,'2006-02-15 21:30:53'),(7632,'2005-07-28 01:02:40',3233,181,'2005-07-30 05:31:40',2,'2006-02-15 21:30:53'),(7633,'2005-07-28 01:03:41',4171,402,'2005-08-01 23:54:41',2,'2006-02-15 21:30:53'),(7634,'2005-07-28 01:07:01',4487,365,'2005-07-31 05:00:01',1,'2006-02-15 21:30:53'),(7635,'2005-07-28 01:08:11',55,413,'2005-08-01 03:32:11',2,'2006-02-15 21:30:53'),(7636,'2005-07-28 01:08:36',202,51,'2005-08-03 21:36:36',1,'2006-02-15 21:30:53'),(7637,'2005-07-28 01:12:25',87,91,'2005-08-02 03:48:25',1,'2006-02-15 21:30:53'),(7638,'2005-07-28 01:13:26',1890,172,'2005-07-28 20:34:26',1,'2006-02-15 21:30:53'),(7639,'2005-07-28 01:14:36',767,459,'2005-07-29 00:19:36',1,'2006-02-15 21:30:53'),(7640,'2005-07-28 01:14:49',3014,229,'2005-08-03 21:50:49',1,'2006-02-15 21:30:53'),(7641,'2005-07-28 01:15:45',1868,475,'2005-08-04 23:50:45',1,'2006-02-15 21:30:53'),(7642,'2005-07-28 01:16:51',3995,523,'2005-08-02 00:45:51',2,'2006-02-15 21:30:53'),(7643,'2005-07-28 01:19:44',4369,407,'2005-08-04 21:16:44',1,'2006-02-15 21:30:53'),(7644,'2005-07-28 01:27:33',882,173,'2005-07-31 22:58:33',2,'2006-02-15 21:30:53'),(7645,'2005-07-28 01:27:42',830,381,'2005-08-03 07:16:42',2,'2006-02-15 21:30:53'),(7646,'2005-07-28 01:31:45',1615,255,'2005-07-31 07:16:45',1,'2006-02-15 21:30:53'),(7647,'2005-07-28 01:35:17',3079,36,'2005-08-01 00:14:17',1,'2006-02-15 21:30:53'),(7648,'2005-07-28 01:35:33',797,310,'2005-08-04 06:21:33',2,'2006-02-15 21:30:53'),(7649,'2005-07-28 01:37:26',2704,318,'2005-07-28 21:18:26',1,'2006-02-15 21:30:53'),(7650,'2005-07-28 01:47:20',701,290,'2005-08-05 06:00:20',2,'2006-02-15 21:30:53'),(7651,'2005-07-28 01:48:32',2753,401,'2005-08-03 03:10:32',2,'2006-02-15 21:30:53'),(7652,'2005-07-28 01:50:29',92,5,'2005-07-30 22:23:29',2,'2006-02-15 21:30:53'),(7653,'2005-07-28 01:58:30',814,232,'2005-07-28 23:32:30',2,'2006-02-15 21:30:53'),(7654,'2005-07-28 02:00:14',1009,360,'2005-07-31 20:50:14',2,'2006-02-15 21:30:53'),(7655,'2005-07-28 02:01:11',2665,513,'2005-07-30 23:12:11',2,'2006-02-15 21:30:53'),(7656,'2005-07-28 02:07:19',178,148,'2005-07-31 04:05:19',1,'2006-02-15 21:30:53'),(7657,'2005-07-28 02:09:00',2319,518,'2005-08-04 21:44:00',1,'2006-02-15 21:30:53'),(7658,'2005-07-28 02:09:12',1798,272,'2005-07-30 00:54:12',2,'2006-02-15 21:30:53'),(7659,'2005-07-28 02:09:45',1622,584,'2005-08-02 05:34:45',2,'2006-02-15 21:30:53'),(7660,'2005-07-28 02:10:10',4385,4,'2005-07-30 04:29:10',2,'2006-02-15 21:30:53'),(7661,'2005-07-28 02:10:27',3060,256,'2005-08-05 03:45:27',2,'2006-02-15 21:30:53'),(7662,'2005-07-28 02:16:08',1017,534,'2005-08-03 21:51:08',1,'2006-02-15 21:30:53'),(7663,'2005-07-28 02:19:48',832,470,'2005-07-30 21:43:48',2,'2006-02-15 21:30:53'),(7664,'2005-07-28 02:24:23',1989,461,'2005-07-29 23:01:23',1,'2006-02-15 21:30:53'),(7665,'2005-07-28 02:28:30',1455,590,'2005-07-31 20:42:30',1,'2006-02-15 21:30:53'),(7666,'2005-07-28 02:35:12',688,196,'2005-08-05 05:43:12',2,'2006-02-15 21:30:53'),(7667,'2005-07-28 02:37:22',2415,443,'2005-08-05 21:37:22',1,'2006-02-15 21:30:53'),(7668,'2005-07-28 02:41:31',3880,508,'2005-08-02 06:08:31',1,'2006-02-15 21:30:53'),(7669,'2005-07-28 02:44:07',2624,483,'2005-07-29 00:54:07',1,'2006-02-15 21:30:53'),(7670,'2005-07-28 02:44:25',1356,252,'2005-07-29 21:55:25',2,'2006-02-15 21:30:53'),(7671,'2005-07-28 02:48:31',3464,442,'2005-07-30 23:04:31',1,'2006-02-15 21:30:53'),(7672,'2005-07-28 02:49:41',573,542,'2005-08-04 02:38:41',1,'2006-02-15 21:30:53'),(7673,'2005-07-28 02:53:53',2368,409,'2005-08-06 00:07:53',1,'2006-02-15 21:30:53'),(7674,'2005-07-28 02:54:30',682,177,'2005-08-05 23:09:30',1,'2006-02-15 21:30:53'),(7675,'2005-07-28 02:55:20',153,189,'2005-07-31 05:27:20',1,'2006-02-15 21:30:53'),(7676,'2005-07-28 02:55:27',1110,508,'2005-08-01 03:50:27',2,'2006-02-15 21:30:53'),(7677,'2005-07-28 02:56:37',4464,566,'2005-07-31 02:21:37',1,'2006-02-15 21:30:53'),(7678,'2005-07-28 02:58:16',3398,510,'2005-08-06 04:22:16',1,'2006-02-15 21:30:53'),(7679,'2005-07-28 02:58:39',1063,444,'2005-08-02 04:58:39',1,'2006-02-15 21:30:53'),(7680,'2005-07-28 02:59:08',1784,559,'2005-08-03 03:37:08',2,'2006-02-15 21:30:53'),(7681,'2005-07-28 03:07:09',1176,432,'2005-07-29 08:30:09',2,'2006-02-15 21:30:53'),(7682,'2005-07-28 03:07:29',3296,400,'2005-08-04 08:48:29',2,'2006-02-15 21:30:53'),(7683,'2005-07-28 03:11:29',1760,73,'2005-08-04 00:14:29',1,'2006-02-15 21:30:53'),(7684,'2005-07-28 03:11:54',3365,40,'2005-07-31 04:40:54',2,'2006-02-15 21:30:53'),(7685,'2005-07-28 03:13:00',2213,468,'2005-08-01 00:29:00',2,'2006-02-15 21:30:53'),(7686,'2005-07-28 03:19:23',2144,184,'2005-08-04 05:17:23',2,'2006-02-15 21:30:53'),(7687,'2005-07-28 03:20:26',689,325,'2005-08-02 05:48:26',2,'2006-02-15 21:30:53'),(7688,'2005-07-28 03:20:47',1179,491,'2005-08-06 06:07:47',2,'2006-02-15 21:30:53'),(7689,'2005-07-28 03:21:24',1803,253,'2005-07-31 08:01:24',2,'2006-02-15 21:30:53'),(7690,'2005-07-28 03:26:21',1076,150,'2005-07-29 00:08:21',1,'2006-02-15 21:30:53'),(7691,'2005-07-28 03:30:09',1579,112,'2005-07-29 21:31:09',1,'2006-02-15 21:30:53'),(7692,'2005-07-28 03:30:21',267,392,'2005-07-30 22:25:21',1,'2006-02-15 21:30:53'),(7693,'2005-07-28 03:31:22',2479,148,'2005-07-31 06:42:22',2,'2006-02-15 21:30:53'),(7694,'2005-07-28 03:39:25',2892,538,'2005-07-31 05:47:25',1,'2006-02-15 21:30:53'),(7695,'2005-07-28 03:41:13',2742,323,'2005-08-06 05:06:13',2,'2006-02-15 21:30:53'),(7696,'2005-07-28 03:41:35',3463,56,'2005-08-06 05:48:35',2,'2006-02-15 21:30:53'),(7697,'2005-07-28 03:43:45',3966,377,'2005-08-03 07:55:45',2,'2006-02-15 21:30:53'),(7698,'2005-07-28 03:44:14',3650,561,'2005-08-04 03:44:14',2,'2006-02-15 21:30:53'),(7699,'2005-07-28 03:52:21',4332,53,'2005-08-01 05:00:21',2,'2006-02-15 21:30:53'),(7700,'2005-07-28 03:54:14',3546,124,'2005-08-05 06:20:14',2,'2006-02-15 21:30:53'),(7701,'2005-07-28 03:54:28',1604,306,'2005-08-01 08:39:28',2,'2006-02-15 21:30:53'),(7702,'2005-07-28 03:56:05',253,349,'2005-07-31 03:29:05',1,'2006-02-15 21:30:53'),(7703,'2005-07-28 03:59:21',2150,3,'2005-08-05 08:52:21',1,'2006-02-15 21:30:53'),(7704,'2005-07-28 04:02:13',2342,265,'2005-08-04 00:51:13',1,'2006-02-15 21:30:53'),(7705,'2005-07-28 04:02:58',1072,22,'2005-08-05 01:19:58',2,'2006-02-15 21:30:53'),(7706,'2005-07-28 04:03:17',994,263,'2005-07-29 22:16:17',2,'2006-02-15 21:30:53'),(7707,'2005-07-28 04:07:47',2563,232,'2005-07-29 02:02:47',1,'2006-02-15 21:30:53'),(7708,'2005-07-28 04:19:15',398,363,'2005-08-04 04:41:15',1,'2006-02-15 21:30:53'),(7709,'2005-07-28 04:22:14',3800,81,'2005-07-31 09:18:14',2,'2006-02-15 21:30:53'),(7710,'2005-07-28 04:24:07',3716,77,'2005-08-03 22:49:07',2,'2006-02-15 21:30:53'),(7711,'2005-07-28 04:26:42',2695,426,'2005-07-29 07:30:42',2,'2006-02-15 21:30:53'),(7712,'2005-07-28 04:29:53',3256,361,'2005-08-02 00:57:53',2,'2006-02-15 21:30:53'),(7713,'2005-07-28 04:32:14',2018,572,'2005-08-03 04:30:14',2,'2006-02-15 21:30:53'),(7714,'2005-07-28 04:32:30',940,70,'2005-08-02 07:10:30',2,'2006-02-15 21:30:53'),(7715,'2005-07-28 04:32:38',3210,512,'2005-08-05 00:37:38',2,'2006-02-15 21:30:53'),(7716,'2005-07-28 04:33:15',1493,284,'2005-08-04 00:08:15',2,'2006-02-15 21:30:53'),(7717,'2005-07-28 04:33:54',730,459,'2005-07-30 02:46:54',2,'2006-02-15 21:30:53'),(7718,'2005-07-28 04:37:59',3587,4,'2005-07-29 09:20:59',2,'2006-02-15 21:30:53'),(7719,'2005-07-28 04:39:09',2481,286,'2005-08-05 03:15:09',1,'2006-02-15 21:30:53'),(7720,'2005-07-28 04:41:44',185,520,'2005-08-04 06:51:44',2,'2006-02-15 21:30:53'),(7721,'2005-07-28 04:42:58',2228,83,'2005-07-31 07:52:58',1,'2006-02-15 21:30:53'),(7722,'2005-07-28 04:44:58',3828,309,'2005-07-30 01:29:58',1,'2006-02-15 21:30:53'),(7723,'2005-07-28 04:45:37',3263,147,'2005-07-30 09:03:37',2,'2006-02-15 21:30:53'),(7724,'2005-07-28 04:46:30',346,3,'2005-08-04 08:41:30',1,'2006-02-15 21:30:53'),(7725,'2005-07-28 04:47:14',1922,326,'2005-08-04 09:03:14',1,'2006-02-15 21:30:53'),(7726,'2005-07-28 04:52:19',2578,219,'2005-08-04 09:05:19',1,'2006-02-15 21:30:53'),(7727,'2005-07-28 04:52:43',2274,123,'2005-08-03 01:12:43',2,'2006-02-15 21:30:53'),(7728,'2005-07-28 04:56:33',492,130,'2005-07-31 07:54:33',1,'2006-02-15 21:30:53'),(7729,'2005-07-28 04:57:57',1491,89,'2005-07-30 09:38:57',1,'2006-02-15 21:30:53'),(7730,'2005-07-28 04:59:48',3118,155,'2005-08-04 04:35:48',2,'2006-02-15 21:30:53'),(7731,'2005-07-28 05:01:18',1533,413,'2005-07-29 02:22:18',1,'2006-02-15 21:30:53'),(7732,'2005-07-28 05:03:32',3597,158,'2005-07-29 10:20:32',1,'2006-02-15 21:30:53'),(7733,'2005-07-28 05:04:47',10,82,'2005-08-05 05:12:47',2,'2006-02-15 21:30:53'),(7734,'2005-07-28 05:08:44',2726,135,'2005-07-30 09:42:44',2,'2006-02-15 21:30:53'),(7735,'2005-07-28 05:09:56',3949,372,'2005-07-31 23:34:56',2,'2006-02-15 21:30:53'),(7736,'2005-07-28 05:12:04',4466,205,'2005-08-05 02:28:04',2,'2006-02-15 21:30:53'),(7737,'2005-07-28 05:15:03',1235,494,'2005-08-04 01:24:03',1,'2006-02-15 21:30:53'),(7738,'2005-07-28 05:21:42',80,10,'2005-08-03 09:46:42',2,'2006-02-15 21:30:53'),(7739,'2005-07-28 05:21:51',1554,186,'2005-07-30 02:06:51',2,'2006-02-15 21:30:53'),(7740,'2005-07-28 05:23:36',3613,395,'2005-08-01 02:20:36',2,'2006-02-15 21:30:53'),(7741,'2005-07-28 05:25:55',3917,591,'2005-08-02 02:40:55',1,'2006-02-15 21:30:53'),(7742,'2005-07-28 05:33:16',1808,49,'2005-08-06 01:04:16',2,'2006-02-15 21:30:53'),(7743,'2005-07-28 05:36:13',2883,210,'2005-08-03 11:28:13',2,'2006-02-15 21:30:53'),(7744,'2005-07-28 05:38:20',1863,288,'2005-07-31 11:00:20',1,'2006-02-15 21:30:53'),(7745,'2005-07-28 05:46:28',1014,285,'2005-08-06 07:44:28',2,'2006-02-15 21:30:53'),(7746,'2005-07-28 05:48:56',176,299,'2005-08-04 07:33:56',1,'2006-02-15 21:30:53'),(7747,'2005-07-28 05:50:11',1775,78,'2005-08-03 09:51:11',1,'2006-02-15 21:30:53'),(7748,'2005-07-28 05:52:23',3523,415,'2005-07-31 01:35:23',2,'2006-02-15 21:30:53'),(7749,'2005-07-28 05:53:36',3585,232,'2005-08-01 03:49:36',1,'2006-02-15 21:30:53'),(7750,'2005-07-28 05:55:30',820,220,'2005-08-06 04:32:30',2,'2006-02-15 21:30:53'),(7751,'2005-07-28 05:56:13',4425,176,'2005-08-05 08:08:13',1,'2006-02-15 21:30:53'),(7752,'2005-07-28 06:01:00',2218,209,'2005-08-03 06:09:00',1,'2006-02-15 21:30:53'),(7753,'2005-07-28 06:09:19',3071,531,'2005-08-06 06:17:19',1,'2006-02-15 21:30:53'),(7754,'2005-07-28 06:10:55',1981,138,'2005-07-29 02:46:55',1,'2006-02-15 21:30:53'),(7755,'2005-07-28 06:22:18',1247,449,'2005-08-06 11:38:18',2,'2006-02-15 21:30:53'),(7756,'2005-07-28 06:22:52',1611,469,'2005-08-05 11:55:52',2,'2006-02-15 21:30:53'),(7757,'2005-07-28 06:23:00',3445,502,'2005-07-30 12:02:00',1,'2006-02-15 21:30:53'),(7758,'2005-07-28 06:23:41',4333,356,'2005-08-03 06:06:41',2,'2006-02-15 21:30:53'),(7759,'2005-07-28 06:28:45',3381,405,'2005-08-03 11:38:45',1,'2006-02-15 21:30:53'),(7760,'2005-07-28 06:29:45',409,307,'2005-08-03 01:36:45',1,'2006-02-15 21:30:53'),(7761,'2005-07-28 06:31:45',3568,112,'2005-07-30 01:36:45',2,'2006-02-15 21:30:53'),(7762,'2005-07-28 06:34:23',3234,462,'2005-08-05 09:55:23',2,'2006-02-15 21:30:53'),(7763,'2005-07-28 06:35:16',2461,116,'2005-08-03 02:46:16',2,'2006-02-15 21:30:53'),(7764,'2005-07-28 06:40:05',3537,142,'2005-07-30 02:51:05',2,'2006-02-15 21:30:53'),(7765,'2005-07-28 06:40:33',4098,294,'2005-07-31 01:25:33',1,'2006-02-15 21:30:53'),(7766,'2005-07-28 06:41:57',2774,292,'2005-08-06 11:21:57',2,'2006-02-15 21:30:53'),(7767,'2005-07-28 06:42:02',329,139,'2005-08-05 11:19:02',2,'2006-02-15 21:30:53'),(7768,'2005-07-28 06:44:03',2450,123,'2005-07-29 09:46:03',1,'2006-02-15 21:30:53'),(7769,'2005-07-28 06:45:23',3250,30,'2005-07-30 12:18:23',1,'2006-02-15 21:30:53'),(7770,'2005-07-28 06:49:35',1486,507,'2005-08-06 08:16:35',1,'2006-02-15 21:30:53'),(7771,'2005-07-28 06:52:12',1003,175,'2005-07-30 12:48:12',1,'2006-02-15 21:30:53'),(7772,'2005-07-28 06:59:09',986,552,'2005-08-01 10:49:09',1,'2006-02-15 21:30:53'),(7773,'2005-07-28 07:02:17',4143,380,'2005-07-30 04:16:17',2,'2006-02-15 21:30:53'),(7774,'2005-07-28 07:03:25',3483,259,'2005-08-03 02:05:25',1,'2006-02-15 21:30:53'),(7775,'2005-07-28 07:04:36',3795,475,'2005-08-03 06:36:36',2,'2006-02-15 21:30:53'),(7776,'2005-07-28 07:04:36',4170,385,'2005-08-01 09:32:36',1,'2006-02-15 21:30:53'),(7777,'2005-07-28 07:04:42',4422,287,'2005-07-29 01:57:42',1,'2006-02-15 21:30:53'),(7778,'2005-07-28 07:10:11',1044,248,'2005-08-05 05:09:11',1,'2006-02-15 21:30:53'),(7779,'2005-07-28 07:11:11',3663,414,'2005-07-30 11:12:11',1,'2006-02-15 21:30:53'),(7780,'2005-07-28 07:11:55',3069,236,'2005-08-06 05:41:55',1,'2006-02-15 21:30:53'),(7781,'2005-07-28 07:13:20',541,539,'2005-08-06 05:43:20',2,'2006-02-15 21:30:53'),(7782,'2005-07-28 07:13:40',3770,199,'2005-08-05 06:50:40',1,'2006-02-15 21:30:53'),(7783,'2005-07-28 07:14:43',3817,581,'2005-08-01 05:03:43',2,'2006-02-15 21:30:53'),(7784,'2005-07-28 07:15:32',3611,505,'2005-08-06 05:00:32',1,'2006-02-15 21:30:53'),(7785,'2005-07-28 07:16:11',4277,460,'2005-08-02 03:43:11',1,'2006-02-15 21:30:53'),(7786,'2005-07-28 07:18:26',2285,222,'2005-07-29 03:00:26',1,'2006-02-15 21:30:53'),(7787,'2005-07-28 07:19:02',2191,203,'2005-08-06 02:38:02',2,'2006-02-15 21:30:53'),(7788,'2005-07-28 07:21:55',95,487,'2005-08-03 06:33:55',1,'2006-02-15 21:30:53'),(7789,'2005-07-28 07:22:07',2837,426,'2005-08-06 10:47:07',1,'2006-02-15 21:30:53'),(7790,'2005-07-28 07:22:35',2327,189,'2005-07-30 02:59:35',1,'2006-02-15 21:30:53'),(7791,'2005-07-28 07:22:51',822,514,'2005-07-30 03:09:51',1,'2006-02-15 21:30:53'),(7792,'2005-07-28 07:24:02',3736,236,'2005-08-04 11:13:02',1,'2006-02-15 21:30:53'),(7793,'2005-07-28 07:26:14',24,32,'2005-08-03 07:45:14',1,'2006-02-15 21:30:53'),(7794,'2005-07-28 07:28:03',4509,510,'2005-08-06 12:32:03',2,'2006-02-15 21:30:53'),(7795,'2005-07-28 07:28:16',1278,38,'2005-07-31 12:03:16',1,'2006-02-15 21:30:53'),(7796,'2005-07-28 07:39:39',622,419,'2005-08-02 05:34:39',2,'2006-02-15 21:30:53'),(7797,'2005-07-28 07:41:07',4180,370,'2005-07-31 04:13:07',1,'2006-02-15 21:30:53'),(7798,'2005-07-28 07:41:59',3281,236,'2005-07-31 12:36:59',1,'2006-02-15 21:30:53'),(7799,'2005-07-28 07:42:09',2163,384,'2005-08-02 10:02:09',2,'2006-02-15 21:30:53'),(7800,'2005-07-28 07:50:59',3386,499,'2005-07-29 07:31:59',2,'2006-02-15 21:30:53'),(7801,'2005-07-28 07:51:56',2052,9,'2005-07-30 12:18:56',1,'2006-02-15 21:30:53'),(7802,'2005-07-28 07:51:57',1108,298,'2005-07-29 09:32:57',1,'2006-02-15 21:30:53'),(7803,'2005-07-28 07:52:13',3438,449,'2005-08-03 13:35:13',1,'2006-02-15 21:30:53'),(7804,'2005-07-28 07:56:00',592,249,'2005-07-30 10:33:00',2,'2006-02-15 21:30:53'),(7805,'2005-07-28 07:56:41',3204,366,'2005-08-04 06:53:41',1,'2006-02-15 21:30:53'),(7806,'2005-07-28 07:58:17',4317,440,'2005-08-06 10:15:17',1,'2006-02-15 21:30:53'),(7807,'2005-07-28 07:58:27',2204,504,'2005-08-01 02:48:27',2,'2006-02-15 21:30:53'),(7808,'2005-07-28 07:58:56',4052,327,'2005-08-02 10:49:56',1,'2006-02-15 21:30:53'),(7809,'2005-07-28 07:59:46',4150,94,'2005-08-02 02:56:46',1,'2006-02-15 21:30:53'),(7810,'2005-07-28 08:00:38',30,537,'2005-08-02 06:14:38',2,'2006-02-15 21:30:53'),(7811,'2005-07-28 08:06:01',3891,347,'2005-07-30 10:08:01',2,'2006-02-15 21:30:53'),(7812,'2005-07-28 08:06:52',4556,237,'2005-07-31 09:57:52',2,'2006-02-15 21:30:53'),(7813,'2005-07-28 08:08:27',4216,411,'2005-07-30 03:08:27',2,'2006-02-15 21:30:53'),(7814,'2005-07-28 08:09:48',2662,258,'2005-08-01 13:14:48',2,'2006-02-15 21:30:53'),(7815,'2005-07-28 08:14:11',3551,300,'2005-07-30 02:34:11',2,'2006-02-15 21:30:53'),(7816,'2005-07-28 08:14:12',1422,283,'2005-07-30 08:00:12',2,'2006-02-15 21:30:53'),(7817,'2005-07-28 08:20:55',600,259,'2005-07-30 11:55:55',1,'2006-02-15 21:30:53'),(7818,'2005-07-28 08:25:00',1672,301,'2005-07-29 14:07:00',1,'2006-02-15 21:30:53'),(7819,'2005-07-28 08:27:14',3182,100,'2005-08-02 12:34:14',2,'2006-02-15 21:30:53'),(7820,'2005-07-28 08:28:51',4475,459,'2005-08-05 10:00:51',1,'2006-02-15 21:30:53'),(7821,'2005-07-28 08:31:23',1184,433,'2005-08-03 05:08:23',2,'2006-02-15 21:30:53'),(7822,'2005-07-28 08:31:45',1428,156,'2005-07-31 11:06:45',1,'2006-02-15 21:30:53'),(7823,'2005-07-28 08:32:53',84,428,'2005-08-06 11:59:53',1,'2006-02-15 21:30:53'),(7824,'2005-07-28 08:34:47',2241,153,'2005-08-05 09:43:47',2,'2006-02-15 21:30:53'),(7825,'2005-07-28 08:34:57',4340,348,'2005-08-06 02:45:57',1,'2006-02-15 21:30:53'),(7826,'2005-07-28 08:35:51',1473,214,'2005-08-05 07:57:51',2,'2006-02-15 21:30:53'),(7827,'2005-07-28 08:37:22',659,422,'2005-07-31 04:27:22',1,'2006-02-15 21:30:53'),(7828,'2005-07-28 08:40:46',1710,212,'2005-07-30 14:22:46',1,'2006-02-15 21:30:53'),(7829,'2005-07-28 08:43:39',111,5,'2005-08-04 14:33:39',1,'2006-02-15 21:30:53'),(7830,'2005-07-28 08:43:49',4492,144,'2005-08-04 09:30:49',2,'2006-02-15 21:30:53'),(7831,'2005-07-28 08:44:21',4436,499,'2005-07-30 03:25:21',2,'2006-02-15 21:30:53'),(7832,'2005-07-28 08:46:11',284,92,'2005-08-04 06:55:11',1,'2006-02-15 21:30:53'),(7833,'2005-07-28 08:46:14',1166,263,'2005-08-04 06:13:14',1,'2006-02-15 21:30:53'),(7834,'2005-07-28 08:46:43',4124,278,'2005-07-31 07:09:43',2,'2006-02-15 21:30:53'),(7835,'2005-07-28 08:49:39',43,547,'2005-08-02 07:16:39',2,'2006-02-15 21:30:53'),(7836,'2005-07-28 08:55:27',1770,481,'2005-08-05 09:35:27',1,'2006-02-15 21:30:53'),(7837,'2005-07-28 08:58:32',115,374,'2005-07-29 14:11:32',1,'2006-02-15 21:30:53'),(7838,'2005-07-28 09:00:21',2222,550,'2005-07-29 05:52:21',1,'2006-02-15 21:30:53'),(7839,'2005-07-28 09:01:13',914,518,'2005-08-04 11:46:13',1,'2006-02-15 21:30:53'),(7840,'2005-07-28 09:03:02',2899,482,'2005-08-06 06:15:02',1,'2006-02-15 21:30:53'),(7841,'2005-07-28 09:04:45',1092,1,'2005-07-30 12:37:45',2,'2006-02-15 21:30:53'),(7842,'2005-07-28 09:10:06',2447,276,'2005-08-04 06:52:06',2,'2006-02-15 21:30:53'),(7843,'2005-07-28 09:10:22',3962,75,'2005-08-01 11:27:22',2,'2006-02-15 21:30:53'),(7844,'2005-07-28 09:16:19',4220,187,'2005-08-05 14:06:19',2,'2006-02-15 21:30:53'),(7845,'2005-07-28 09:18:07',38,352,'2005-08-04 10:23:07',2,'2006-02-15 21:30:53'),(7846,'2005-07-28 09:21:18',4201,309,'2005-08-06 07:10:18',2,'2006-02-15 21:30:53'),(7847,'2005-07-28 09:23:14',3602,323,'2005-08-02 11:02:14',2,'2006-02-15 21:30:53'),(7848,'2005-07-28 09:24:31',162,509,'2005-08-05 05:11:31',2,'2006-02-15 21:30:53'),(7849,'2005-07-28 09:30:02',996,423,'2005-08-06 12:41:02',2,'2006-02-15 21:30:53'),(7850,'2005-07-28 09:31:13',2913,118,'2005-08-02 14:06:13',2,'2006-02-15 21:30:53'),(7851,'2005-07-28 09:31:58',3596,253,'2005-08-04 09:58:58',2,'2006-02-15 21:30:53'),(7852,'2005-07-28 09:34:29',3462,123,'2005-07-30 05:48:29',1,'2006-02-15 21:30:53'),(7853,'2005-07-28 09:36:38',4053,318,'2005-07-29 15:01:38',1,'2006-02-15 21:30:53'),(7854,'2005-07-28 09:42:31',3531,84,'2005-08-02 09:25:31',1,'2006-02-15 21:30:53'),(7855,'2005-07-28 09:43:02',2474,288,'2005-07-30 12:57:02',2,'2006-02-15 21:30:53'),(7856,'2005-07-28 09:48:24',2376,375,'2005-07-29 09:49:24',2,'2006-02-15 21:30:53'),(7857,'2005-07-28 09:49:40',4027,500,'2005-08-01 05:34:40',2,'2006-02-15 21:30:53'),(7858,'2005-07-28 09:50:18',992,144,'2005-08-05 14:33:18',1,'2006-02-15 21:30:53'),(7859,'2005-07-28 09:57:17',3392,547,'2005-08-04 06:04:17',1,'2006-02-15 21:30:53'),(7860,'2005-07-28 09:58:02',2400,241,'2005-08-05 06:04:02',1,'2006-02-15 21:30:53'),(7861,'2005-07-28 10:02:01',1781,208,'2005-08-06 13:17:01',1,'2006-02-15 21:30:53'),(7862,'2005-07-28 10:02:25',2507,299,'2005-08-05 13:10:25',1,'2006-02-15 21:30:53'),(7863,'2005-07-28 10:05:46',1212,182,'2005-07-29 14:42:46',1,'2006-02-15 21:30:53'),(7864,'2005-07-28 10:06:10',1238,20,'2005-08-04 08:38:10',1,'2006-02-15 21:30:53'),(7865,'2005-07-28 10:07:04',2334,148,'2005-08-06 08:16:04',2,'2006-02-15 21:30:53'),(7866,'2005-07-28 10:08:01',1602,101,'2005-08-04 09:29:01',2,'2006-02-15 21:30:53'),(7867,'2005-07-28 10:08:54',713,297,'2005-07-30 10:26:54',2,'2006-02-15 21:30:53'),(7868,'2005-07-28 10:08:55',3589,43,'2005-07-30 11:52:55',1,'2006-02-15 21:30:53'),(7869,'2005-07-28 10:13:15',3005,298,'2005-08-03 12:58:15',1,'2006-02-15 21:30:53'),(7870,'2005-07-28 10:16:03',970,240,'2005-07-31 16:06:03',1,'2006-02-15 21:30:53'),(7871,'2005-07-28 10:16:37',3990,491,'2005-08-05 11:24:37',2,'2006-02-15 21:30:53'),(7872,'2005-07-28 10:18:16',826,66,'2005-07-31 10:57:16',1,'2006-02-15 21:30:53'),(7873,'2005-07-28 10:19:46',2947,82,'2005-07-31 04:43:46',2,'2006-02-15 21:30:53'),(7874,'2005-07-28 10:21:52',2981,86,'2005-08-06 16:19:52',1,'2006-02-15 21:30:53'),(7875,'2005-07-28 10:23:48',3693,504,'2005-08-02 12:09:48',1,'2006-02-15 21:30:53'),(7876,'2005-07-28 10:24:22',3563,577,'2005-08-04 07:15:22',1,'2006-02-15 21:30:53'),(7877,'2005-07-28 10:25:36',2576,65,'2005-08-05 12:46:36',1,'2006-02-15 21:30:53'),(7878,'2005-07-28 10:27:10',1564,141,'2005-07-29 11:22:10',1,'2006-02-15 21:30:53'),(7879,'2005-07-28 10:27:46',1969,125,'2005-07-31 07:48:46',1,'2006-02-15 21:30:53'),(7880,'2005-07-28 10:30:37',3670,182,'2005-08-03 08:05:37',2,'2006-02-15 21:30:53'),(7881,'2005-07-28 10:33:22',533,249,'2005-08-02 12:10:22',1,'2006-02-15 21:30:53'),(7882,'2005-07-28 10:33:42',3922,516,'2005-07-29 13:49:42',1,'2006-02-15 21:30:53'),(7883,'2005-07-28 10:37:20',447,526,'2005-08-02 05:08:20',1,'2006-02-15 21:30:53'),(7884,'2005-07-28 10:37:24',3871,502,'2005-07-31 10:31:24',1,'2006-02-15 21:30:53'),(7885,'2005-07-28 10:37:41',4294,260,'2005-08-05 07:56:41',1,'2006-02-15 21:30:53'),(7886,'2005-07-28 10:37:55',237,352,'2005-08-04 13:22:55',2,'2006-02-15 21:30:53'),(7887,'2005-07-28 10:40:12',2820,253,'2005-08-02 06:09:12',1,'2006-02-15 21:30:53'),(7888,'2005-07-28 10:40:24',545,378,'2005-08-01 16:18:24',1,'2006-02-15 21:30:53'),(7889,'2005-07-28 10:43:21',3123,416,'2005-07-30 09:11:21',1,'2006-02-15 21:30:53'),(7890,'2005-07-28 10:43:40',3443,553,'2005-07-31 06:07:40',1,'2006-02-15 21:30:53'),(7891,'2005-07-28 10:43:56',3637,560,'2005-08-05 14:04:56',2,'2006-02-15 21:30:53'),(7892,'2005-07-28 10:46:58',2717,397,'2005-07-30 16:03:58',1,'2006-02-15 21:30:53'),(7893,'2005-07-28 10:49:27',3058,479,'2005-08-02 06:46:27',1,'2006-02-15 21:30:53'),(7894,'2005-07-28 10:53:58',3532,330,'2005-08-02 13:42:58',2,'2006-02-15 21:30:53'),(7895,'2005-07-28 10:57:15',900,67,'2005-08-02 15:10:15',2,'2006-02-15 21:30:53'),(7896,'2005-07-28 11:00:58',3561,389,'2005-08-04 14:30:58',2,'2006-02-15 21:30:53'),(7897,'2005-07-28 11:01:51',1396,75,'2005-07-31 13:13:51',1,'2006-02-15 21:30:53'),(7898,'2005-07-28 11:08:22',2680,499,'2005-08-03 12:28:22',1,'2006-02-15 21:30:53'),(7899,'2005-07-28 11:10:12',4130,452,'2005-08-02 13:20:12',2,'2006-02-15 21:30:53'),(7900,'2005-07-28 11:11:33',2781,154,'2005-08-05 06:29:33',2,'2006-02-15 21:30:53'),(7901,'2005-07-28 11:12:12',4435,280,'2005-08-01 08:13:12',1,'2006-02-15 21:30:53'),(7902,'2005-07-28 11:14:19',3066,356,'2005-07-30 09:01:19',2,'2006-02-15 21:30:53'),(7903,'2005-07-28 11:20:36',2767,588,'2005-07-31 09:16:36',1,'2006-02-15 21:30:53'),(7904,'2005-07-28 11:25:39',316,477,'2005-08-06 08:22:39',2,'2006-02-15 21:30:53'),(7905,'2005-07-28 11:26:57',4287,455,'2005-08-02 06:14:57',1,'2006-02-15 21:30:53'),(7906,'2005-07-28 11:31:42',1216,85,'2005-08-01 11:56:42',2,'2006-02-15 21:30:53'),(7907,'2005-07-28 11:32:00',3252,433,'2005-07-30 15:27:00',1,'2006-02-15 21:30:53'),(7908,'2005-07-28 11:32:57',3646,360,'2005-08-03 13:30:57',2,'2006-02-15 21:30:53'),(7909,'2005-07-28 11:38:08',3355,210,'2005-07-29 13:54:08',1,'2006-02-15 21:30:53'),(7910,'2005-07-28 11:44:56',2044,480,'2005-08-05 14:37:56',2,'2006-02-15 21:30:53'),(7911,'2005-07-28 11:46:45',390,3,'2005-07-29 07:19:45',1,'2006-02-15 21:30:53'),(7912,'2005-07-28 11:46:58',745,127,'2005-08-05 12:50:58',1,'2006-02-15 21:30:53'),(7913,'2005-07-28 11:47:23',4001,459,'2005-08-05 06:36:23',1,'2006-02-15 21:30:53'),(7914,'2005-07-28 11:48:08',2796,469,'2005-07-30 14:14:08',1,'2006-02-15 21:30:53'),(7915,'2005-07-28 11:49:46',2088,186,'2005-08-04 12:21:46',2,'2006-02-15 21:30:53'),(7916,'2005-07-28 11:49:53',3877,13,'2005-07-29 15:01:53',1,'2006-02-15 21:30:53'),(7917,'2005-07-28 11:56:57',2071,416,'2005-07-29 14:06:57',1,'2006-02-15 21:30:53'),(7918,'2005-07-28 11:58:53',63,473,'2005-08-04 12:08:53',2,'2006-02-15 21:30:53'),(7919,'2005-07-28 11:59:45',2138,36,'2005-08-06 11:19:45',1,'2006-02-15 21:30:53'),(7920,'2005-07-28 12:01:19',66,48,'2005-08-05 07:08:19',1,'2006-02-15 21:30:53'),(7921,'2005-07-28 12:02:46',116,100,'2005-08-01 12:08:46',2,'2006-02-15 21:30:53'),(7922,'2005-07-28 12:05:25',817,125,'2005-08-02 12:13:25',2,'2006-02-15 21:30:53'),(7923,'2005-07-28 12:08:29',2273,458,'2005-08-04 12:30:29',1,'2006-02-15 21:30:53'),(7924,'2005-07-28 12:08:53',656,97,'2005-07-30 06:45:53',2,'2006-02-15 21:30:53'),(7925,'2005-07-28 12:10:02',1763,500,'2005-08-02 15:50:02',1,'2006-02-15 21:30:53'),(7926,'2005-07-28 12:13:02',180,78,'2005-08-05 08:54:02',1,'2006-02-15 21:30:53'),(7927,'2005-07-28 12:13:42',1263,27,'2005-08-05 12:02:42',1,'2006-02-15 21:30:53'),(7928,'2005-07-28 12:15:51',912,473,'2005-08-05 06:34:51',1,'2006-02-15 21:30:53'),(7929,'2005-07-28 12:16:40',2652,307,'2005-07-31 13:09:40',2,'2006-02-15 21:30:53'),(7930,'2005-07-28 12:21:08',4181,320,'2005-07-30 11:56:08',1,'2006-02-15 21:30:53'),(7931,'2005-07-28 12:23:41',1923,326,'2005-08-06 09:49:41',2,'2006-02-15 21:30:53'),(7932,'2005-07-28 12:24:54',3738,462,'2005-07-30 11:33:54',1,'2006-02-15 21:30:53'),(7933,'2005-07-28 12:27:27',3175,297,'2005-07-29 10:34:27',2,'2006-02-15 21:30:53'),(7934,'2005-07-28 12:33:10',2642,332,'2005-08-04 07:40:10',2,'2006-02-15 21:30:53'),(7935,'2005-07-28 12:33:17',3664,462,'2005-08-04 14:40:17',2,'2006-02-15 21:30:53'),(7936,'2005-07-28 12:33:21',563,520,'2005-07-30 13:31:21',2,'2006-02-15 21:30:53'),(7937,'2005-07-28 12:38:22',3944,323,'2005-07-29 09:19:22',1,'2006-02-15 21:30:53'),(7938,'2005-07-28 12:39:11',2579,114,'2005-08-04 16:56:11',1,'2006-02-15 21:30:53'),(7939,'2005-07-28 12:45:47',2004,37,'2005-07-30 18:32:47',2,'2006-02-15 21:30:53'),(7940,'2005-07-28 12:46:47',901,409,'2005-07-29 06:46:47',2,'2006-02-15 21:30:53'),(7941,'2005-07-28 12:47:20',439,566,'2005-08-01 08:46:20',1,'2006-02-15 21:30:53'),(7942,'2005-07-28 12:49:44',1636,56,'2005-07-31 18:07:44',2,'2006-02-15 21:30:53'),(7943,'2005-07-28 12:50:55',2914,346,'2005-08-04 11:29:55',2,'2006-02-15 21:30:53'),(7944,'2005-07-28 12:51:22',3148,504,'2005-07-30 12:19:22',1,'2006-02-15 21:30:53'),(7945,'2005-07-28 12:53:58',3326,316,'2005-08-03 14:04:58',1,'2006-02-15 21:30:53'),(7946,'2005-07-28 13:01:22',99,90,'2005-08-03 15:27:22',2,'2006-02-15 21:30:53'),(7947,'2005-07-28 13:05:50',2504,279,'2005-08-02 11:16:50',2,'2006-02-15 21:30:53'),(7948,'2005-07-28 13:06:16',215,589,'2005-08-05 08:38:16',1,'2006-02-15 21:30:53'),(7949,'2005-07-28 13:07:24',2145,487,'2005-08-02 09:41:24',1,'2006-02-15 21:30:53'),(7950,'2005-07-28 13:21:00',2286,122,'2005-08-05 18:47:00',2,'2006-02-15 21:30:53'),(7951,'2005-07-28 13:21:16',3979,237,'2005-08-06 08:21:16',1,'2006-02-15 21:30:53'),(7952,'2005-07-28 13:23:49',3313,158,'2005-08-01 08:50:49',1,'2006-02-15 21:30:53'),(7953,'2005-07-28 13:24:32',4471,319,'2005-08-05 16:09:32',2,'2006-02-15 21:30:53'),(7954,'2005-07-28 13:25:05',3735,145,'2005-07-29 18:50:05',2,'2006-02-15 21:30:53'),(7955,'2005-07-28 13:31:36',1519,522,'2005-07-30 10:03:36',1,'2006-02-15 21:30:53'),(7956,'2005-07-28 13:32:17',4335,118,'2005-08-06 14:51:17',2,'2006-02-15 21:30:53'),(7957,'2005-07-28 13:34:08',1623,78,'2005-08-05 07:58:08',1,'2006-02-15 21:30:53'),(7958,'2005-07-28 13:34:34',421,593,'2005-07-29 16:03:34',1,'2006-02-15 21:30:53'),(7959,'2005-07-28 13:43:20',1549,178,'2005-08-02 12:13:20',2,'2006-02-15 21:30:53'),(7960,'2005-07-28 13:47:08',2718,324,'2005-08-03 15:17:08',1,'2006-02-15 21:30:53'),(7961,'2005-07-28 13:47:21',3284,45,'2005-08-01 09:33:21',1,'2006-02-15 21:30:53'),(7962,'2005-07-28 13:48:09',1746,126,'2005-08-03 19:21:09',1,'2006-02-15 21:30:53'),(7963,'2005-07-28 13:48:38',921,247,'2005-08-06 19:37:38',2,'2006-02-15 21:30:53'),(7964,'2005-07-28 13:49:58',2528,574,'2005-08-03 10:03:58',2,'2006-02-15 21:30:53'),(7965,'2005-07-28 13:52:57',3671,134,'2005-07-29 14:54:57',1,'2006-02-15 21:30:53'),(7966,'2005-07-28 13:53:54',2514,91,'2005-08-06 15:32:54',1,'2006-02-15 21:30:53'),(7967,'2005-07-28 13:56:51',2040,187,'2005-08-03 19:38:51',1,'2006-02-15 21:30:53'),(7968,'2005-07-28 13:57:35',3865,597,'2005-08-04 13:40:35',1,'2006-02-15 21:30:53'),(7969,'2005-07-28 13:57:37',2224,123,'2005-08-04 19:31:37',1,'2006-02-15 21:30:53'),(7970,'2005-07-28 13:58:38',998,507,'2005-08-02 12:27:38',1,'2006-02-15 21:30:53'),(7971,'2005-07-28 14:00:47',1910,445,'2005-08-02 10:01:47',1,'2006-02-15 21:30:53'),(7972,'2005-07-28 14:07:46',2930,269,'2005-08-01 11:28:46',2,'2006-02-15 21:30:53'),(7973,'2005-07-28 14:10:06',3936,339,'2005-07-29 11:26:06',2,'2006-02-15 21:30:53'),(7974,'2005-07-28 14:11:57',2442,380,'2005-08-02 19:25:57',2,'2006-02-15 21:30:53'),(7975,'2005-07-28 14:12:47',2565,211,'2005-08-05 09:18:47',1,'2006-02-15 21:30:53'),(7976,'2005-07-28 14:13:24',2296,205,'2005-08-05 09:01:24',1,'2006-02-15 21:30:53'),(7977,'2005-07-28 14:15:54',3162,389,'2005-08-01 18:58:54',2,'2006-02-15 21:30:53'),(7978,'2005-07-28 14:16:14',508,431,'2005-08-01 12:53:14',2,'2006-02-15 21:30:53'),(7979,'2005-07-28 14:16:30',3303,94,'2005-08-03 09:39:30',2,'2006-02-15 21:30:53'),(7980,'2005-07-28 14:16:49',1019,329,'2005-08-05 09:20:49',1,'2006-02-15 21:30:53'),(7981,'2005-07-28 14:18:25',90,392,'2005-08-04 15:21:25',2,'2006-02-15 21:30:53'),(7982,'2005-07-28 14:19:59',668,71,'2005-07-29 14:09:59',2,'2006-02-15 21:30:53'),(7983,'2005-07-28 14:23:01',1836,115,'2005-07-29 11:51:01',1,'2006-02-15 21:30:53'),(7984,'2005-07-28 14:27:51',2893,208,'2005-08-04 17:34:51',1,'2006-02-15 21:30:53'),(7985,'2005-07-28 14:29:01',4022,388,'2005-08-03 17:20:01',2,'2006-02-15 21:30:53'),(7986,'2005-07-28 14:30:13',1283,395,'2005-08-05 09:35:13',1,'2006-02-15 21:30:53'),(7987,'2005-07-28 14:36:52',288,443,'2005-08-05 16:49:52',2,'2006-02-15 21:30:53'),(7988,'2005-07-28 14:37:18',2906,517,'2005-08-05 10:53:18',1,'2006-02-15 21:30:53'),(7989,'2005-07-28 14:39:05',3196,149,'2005-08-05 13:58:05',2,'2006-02-15 21:30:53'),(7990,'2005-07-28 14:43:08',188,232,'2005-08-01 10:51:08',2,'2006-02-15 21:30:53'),(7991,'2005-07-28 14:45:45',1133,59,'2005-07-29 15:05:45',2,'2006-02-15 21:30:53'),(7992,'2005-07-28 14:53:06',1851,33,'2005-07-29 18:17:06',1,'2006-02-15 21:30:53'),(7993,'2005-07-28 14:56:41',2926,353,'2005-08-01 17:01:41',2,'2006-02-15 21:30:53'),(7994,'2005-07-28 14:56:54',2431,21,'2005-07-30 09:56:54',2,'2006-02-15 21:30:53'),(7995,'2005-07-28 15:00:09',536,89,'2005-08-01 12:33:09',2,'2006-02-15 21:30:53'),(7996,'2005-07-28 15:00:49',2171,408,'2005-08-04 20:58:49',2,'2006-02-15 21:30:53'),(7997,'2005-07-28 15:02:25',1845,591,'2005-08-04 14:35:25',1,'2006-02-15 21:30:53'),(7998,'2005-07-28 15:08:48',1397,598,'2005-07-31 16:14:48',2,'2006-02-15 21:30:53'),(7999,'2005-07-28 15:10:14',2750,170,'2005-08-06 17:08:14',2,'2006-02-15 21:30:53'),(8000,'2005-07-28 15:10:25',1644,212,'2005-08-06 19:15:25',1,'2006-02-15 21:30:53'),(8001,'2005-07-28 15:10:55',2570,10,'2005-08-05 18:23:55',1,'2006-02-15 21:30:53'),(8002,'2005-07-28 15:11:00',22,449,'2005-07-31 15:46:00',2,'2006-02-15 21:30:53'),(8003,'2005-07-28 15:11:27',2775,89,'2005-08-04 18:35:27',1,'2006-02-15 21:30:53'),(8004,'2005-07-28 15:14:07',4428,393,'2005-07-30 19:32:07',2,'2006-02-15 21:30:53'),(8005,'2005-07-28 15:15:11',670,488,'2005-07-29 14:54:11',1,'2006-02-15 21:30:53'),(8006,'2005-07-28 15:15:41',3959,109,'2005-08-05 19:29:41',2,'2006-02-15 21:30:53'),(8007,'2005-07-28 15:22:27',1942,525,'2005-07-30 13:06:27',2,'2006-02-15 21:30:53'),(8008,'2005-07-28 15:25:55',2093,41,'2005-08-04 13:16:55',1,'2006-02-15 21:30:53'),(8009,'2005-07-28 15:25:58',337,372,'2005-08-04 10:16:58',2,'2006-02-15 21:30:53'),(8010,'2005-07-28 15:26:20',68,467,'2005-08-04 18:39:20',2,'2006-02-15 21:30:53'),(8011,'2005-07-28 15:26:39',4274,497,'2005-07-30 13:59:39',1,'2006-02-15 21:30:53'),(8012,'2005-07-28 15:29:00',1513,343,'2005-08-05 12:28:00',2,'2006-02-15 21:30:53'),(8013,'2005-07-28 15:30:26',2074,403,'2005-08-05 16:29:26',1,'2006-02-15 21:30:53'),(8014,'2005-07-28 15:32:07',2339,11,'2005-07-31 20:52:07',1,'2006-02-15 21:30:53'),(8015,'2005-07-28 15:33:03',1814,23,'2005-07-30 15:32:03',2,'2006-02-15 21:30:53'),(8016,'2005-07-28 15:35:41',516,391,'2005-07-30 20:06:41',2,'2006-02-15 21:30:53'),(8017,'2005-07-28 15:35:41',1764,328,'2005-08-01 19:12:41',1,'2006-02-15 21:30:53'),(8018,'2005-07-28 15:36:48',4129,377,'2005-08-06 20:04:48',1,'2006-02-15 21:30:53'),(8019,'2005-07-28 15:37:43',1844,84,'2005-08-04 15:40:43',2,'2006-02-15 21:30:53'),(8020,'2005-07-28 15:43:32',4459,498,'2005-08-05 12:19:32',1,'2006-02-15 21:30:53'),(8021,'2005-07-28 15:45:24',1920,501,'2005-08-04 10:49:24',1,'2006-02-15 21:30:53'),(8022,'2005-07-28 15:48:56',294,314,'2005-08-06 13:40:56',1,'2006-02-15 21:30:53'),(8023,'2005-07-28 15:53:29',2133,411,'2005-07-31 12:26:29',1,'2006-02-15 21:30:53'),(8024,'2005-07-28 15:55:40',1735,90,'2005-08-02 09:56:40',1,'2006-02-15 21:30:53'),(8025,'2005-07-28 16:03:27',2932,421,'2005-08-03 21:58:27',2,'2006-02-15 21:30:53'),(8026,'2005-07-28 16:05:38',4225,511,'2005-07-29 21:28:38',2,'2006-02-15 21:30:53'),(8027,'2005-07-28 16:09:57',1335,436,'2005-08-05 18:17:57',1,'2006-02-15 21:30:53'),(8028,'2005-07-28 16:11:15',2715,137,'2005-08-05 15:11:15',1,'2006-02-15 21:30:53'),(8029,'2005-07-28 16:11:21',4273,61,'2005-08-05 13:52:21',1,'2006-02-15 21:30:53'),(8030,'2005-07-28 16:12:53',2633,30,'2005-07-31 17:15:53',1,'2006-02-15 21:30:53'),(8031,'2005-07-28 16:15:49',2196,40,'2005-08-02 18:27:49',2,'2006-02-15 21:30:53'),(8032,'2005-07-28 16:17:00',431,230,'2005-07-29 13:32:00',1,'2006-02-15 21:30:53'),(8033,'2005-07-28 16:18:23',4268,1,'2005-07-30 17:56:23',1,'2006-02-15 21:30:53'),(8034,'2005-07-28 16:20:26',1997,502,'2005-08-04 19:11:26',2,'2006-02-15 21:30:53'),(8035,'2005-07-28 16:23:01',1503,14,'2005-08-05 10:52:01',1,'2006-02-15 21:30:53'),(8036,'2005-07-28 16:27:43',2741,412,'2005-08-01 13:41:43',2,'2006-02-15 21:30:53'),(8037,'2005-07-28 16:31:20',3973,409,'2005-07-31 12:18:20',2,'2006-02-15 21:30:53'),(8038,'2005-07-28 16:32:55',1225,30,'2005-07-30 21:08:55',1,'2006-02-15 21:30:53'),(8039,'2005-07-28 16:35:16',1996,203,'2005-07-30 14:49:16',1,'2006-02-15 21:30:53'),(8040,'2005-07-28 16:39:43',4543,163,'2005-08-02 20:00:43',2,'2006-02-15 21:30:53'),(8041,'2005-07-28 16:39:56',763,357,'2005-07-30 18:44:56',1,'2006-02-15 21:30:53'),(8042,'2005-07-28 16:45:11',4325,14,'2005-08-04 17:16:11',2,'2006-02-15 21:30:53'),(8043,'2005-07-28 16:45:44',208,577,'2005-08-01 12:26:44',1,'2006-02-15 21:30:53'),(8044,'2005-07-28 16:49:12',879,442,'2005-08-02 22:41:12',1,'2006-02-15 21:30:53'),(8045,'2005-07-28 16:49:38',3427,368,'2005-08-03 15:42:38',1,'2006-02-15 21:30:53'),(8046,'2005-07-28 16:49:41',2873,120,'2005-07-31 21:33:41',1,'2006-02-15 21:30:53'),(8047,'2005-07-28 16:49:43',2936,292,'2005-08-03 14:48:43',2,'2006-02-15 21:30:53'),(8048,'2005-07-28 16:50:26',2721,182,'2005-08-06 19:20:26',1,'2006-02-15 21:30:53'),(8049,'2005-07-28 16:51:58',673,42,'2005-07-31 22:18:58',1,'2006-02-15 21:30:53'),(8050,'2005-07-28 16:55:47',1864,488,'2005-08-02 13:20:47',1,'2006-02-15 21:30:53'),(8051,'2005-07-28 16:56:16',4405,192,'2005-07-29 22:48:16',1,'2006-02-15 21:30:53'),(8052,'2005-07-28 16:57:31',2460,166,'2005-08-03 18:03:31',2,'2006-02-15 21:30:53'),(8053,'2005-07-28 16:59:41',1511,526,'2005-08-03 22:28:41',2,'2006-02-15 21:30:53'),(8054,'2005-07-28 17:02:18',1062,225,'2005-08-06 11:55:18',1,'2006-02-15 21:30:53'),(8055,'2005-07-28 17:02:32',4162,304,'2005-07-31 22:05:32',2,'2006-02-15 21:30:53'),(8056,'2005-07-28 17:04:15',4018,589,'2005-08-03 19:11:15',2,'2006-02-15 21:30:53'),(8057,'2005-07-28 17:07:13',4177,483,'2005-08-03 16:25:13',1,'2006-02-15 21:30:53'),(8058,'2005-07-28 17:07:49',2148,404,'2005-08-03 22:57:49',1,'2006-02-15 21:30:53'),(8059,'2005-07-28 17:09:59',2611,372,'2005-07-31 15:42:59',2,'2006-02-15 21:30:53'),(8060,'2005-07-28 17:10:02',3765,577,'2005-08-05 17:11:02',1,'2006-02-15 21:30:53'),(8061,'2005-07-28 17:12:53',650,467,'2005-08-05 13:56:53',2,'2006-02-15 21:30:53'),(8062,'2005-07-28 17:15:06',1384,317,'2005-07-30 16:56:06',2,'2006-02-15 21:30:53'),(8063,'2005-07-28 17:15:11',935,163,'2005-08-04 16:45:11',1,'2006-02-15 21:30:53'),(8064,'2005-07-28 17:15:38',3788,488,'2005-08-04 18:04:38',2,'2006-02-15 21:30:53'),(8065,'2005-07-28 17:15:48',413,220,'2005-08-04 15:49:48',2,'2006-02-15 21:30:53'),(8066,'2005-07-28 17:20:09',3208,462,'2005-07-31 18:36:09',2,'2006-02-15 21:30:53'),(8067,'2005-07-28 17:20:17',3923,209,'2005-07-29 21:55:17',1,'2006-02-15 21:30:53'),(8068,'2005-07-28 17:22:28',209,216,'2005-07-29 12:24:28',2,'2006-02-15 21:30:53'),(8069,'2005-07-28 17:23:46',2822,178,'2005-07-30 16:19:46',1,'2006-02-15 21:30:53'),(8070,'2005-07-28 17:26:56',1606,89,'2005-08-01 17:33:56',1,'2006-02-15 21:30:53'),(8071,'2005-07-28 17:27:48',2582,131,'2005-08-03 11:48:48',2,'2006-02-15 21:30:53'),(8072,'2005-07-28 17:27:59',2347,99,'2005-07-30 19:08:59',1,'2006-02-15 21:30:53'),(8073,'2005-07-28 17:29:02',630,314,'2005-08-01 22:17:02',2,'2006-02-15 21:30:53'),(8074,'2005-07-28 17:33:39',1558,1,'2005-07-29 20:17:39',1,'2006-02-15 21:30:53'),(8075,'2005-07-28 17:37:28',2175,61,'2005-07-29 11:56:28',2,'2006-02-15 21:30:53'),(8076,'2005-07-28 17:45:58',214,17,'2005-08-04 18:07:58',2,'2006-02-15 21:30:53'),(8077,'2005-07-28 17:54:35',3253,122,'2005-07-29 19:28:35',2,'2006-02-15 21:30:53'),(8078,'2005-07-28 17:54:42',3839,407,'2005-07-30 18:18:42',2,'2006-02-15 21:30:53'),(8079,'2005-07-28 17:58:36',3564,432,'2005-07-29 14:48:36',2,'2006-02-15 21:30:53'),(8080,'2005-07-28 18:05:06',3035,406,'2005-07-29 22:44:06',2,'2006-02-15 21:30:53'),(8081,'2005-07-28 18:06:46',4404,362,'2005-08-04 18:54:46',1,'2006-02-15 21:30:53'),(8082,'2005-07-28 18:08:02',3089,423,'2005-08-04 14:33:02',2,'2006-02-15 21:30:53'),(8083,'2005-07-28 18:09:48',2187,30,'2005-08-04 21:47:48',2,'2006-02-15 21:30:53'),(8084,'2005-07-28 18:11:58',911,571,'2005-08-03 23:41:58',2,'2006-02-15 21:30:53'),(8085,'2005-07-28 18:13:15',3059,552,'2005-08-04 13:45:15',2,'2006-02-15 21:30:53'),(8086,'2005-07-28 18:17:14',1182,3,'2005-07-30 18:22:14',2,'2006-02-15 21:30:53'),(8087,'2005-07-28 18:21:16',1913,295,'2005-08-03 12:38:16',2,'2006-02-15 21:30:53'),(8088,'2005-07-28 18:23:49',2590,343,'2005-08-06 23:25:49',2,'2006-02-15 21:30:53'),(8089,'2005-07-28 18:26:47',1414,50,'2005-08-03 21:28:47',1,'2006-02-15 21:30:53'),(8090,'2005-07-28 18:27:29',1336,387,'2005-08-02 14:08:29',2,'2006-02-15 21:30:53'),(8091,'2005-07-28 18:27:29',3025,126,'2005-08-01 19:45:29',2,'2006-02-15 21:30:53'),(8092,'2005-07-28 18:28:07',2034,167,'2005-07-30 19:17:07',2,'2006-02-15 21:30:53'),(8093,'2005-07-28 18:29:16',1427,533,'2005-08-05 21:49:16',1,'2006-02-15 21:30:53'),(8094,'2005-07-28 18:30:28',4276,432,'2005-08-05 17:37:28',2,'2006-02-15 21:30:53'),(8095,'2005-07-28 18:32:40',2685,42,'2005-08-06 23:45:40',1,'2006-02-15 21:30:53'),(8096,'2005-07-28 18:32:46',502,506,'2005-08-06 15:00:46',1,'2006-02-15 21:30:53'),(8097,'2005-07-28 18:32:49',2719,436,'2005-08-06 16:09:49',1,'2006-02-15 21:30:53'),(8098,'2005-07-28 18:34:20',1757,41,'2005-07-31 19:07:20',2,'2006-02-15 21:30:53'),(8099,'2005-07-28 18:35:12',3694,36,'2005-07-30 15:44:12',2,'2006-02-15 21:30:53'),(8100,'2005-07-28 18:43:11',2859,11,'2005-08-02 15:56:11',2,'2006-02-15 21:30:53'),(8101,'2005-07-28 18:47:23',731,6,'2005-07-31 16:23:23',1,'2006-02-15 21:30:53'),(8102,'2005-07-28 18:49:43',4505,237,'2005-08-03 23:04:43',2,'2006-02-15 21:30:53'),(8103,'2005-07-28 18:50:14',4472,397,'2005-08-04 16:53:14',1,'2006-02-15 21:30:53'),(8104,'2005-07-28 18:59:36',1080,533,'2005-08-03 22:05:36',2,'2006-02-15 21:30:53'),(8105,'2005-07-28 18:59:46',1316,314,'2005-07-29 22:51:46',1,'2006-02-15 21:30:53'),(8106,'2005-07-28 19:02:46',963,137,'2005-07-30 20:48:46',2,'2006-02-15 21:30:53'),(8107,'2005-07-28 19:03:16',1318,518,'2005-08-05 17:18:16',2,'2006-02-15 21:30:53'),(8108,'2005-07-28 19:07:38',1600,295,'2005-08-03 15:13:38',2,'2006-02-15 21:30:53'),(8109,'2005-07-28 19:07:44',652,407,'2005-07-31 14:59:44',1,'2006-02-15 21:30:53'),(8110,'2005-07-28 19:07:45',1244,225,'2005-08-04 22:12:45',1,'2006-02-15 21:30:53'),(8111,'2005-07-28 19:10:03',3226,148,'2005-07-29 22:25:03',1,'2006-02-15 21:30:53'),(8112,'2005-07-28 19:11:07',2444,528,'2005-08-03 18:41:07',1,'2006-02-15 21:30:53'),(8113,'2005-07-28 19:14:00',4269,541,'2005-08-06 00:05:00',2,'2006-02-15 21:30:53'),(8114,'2005-07-28 19:14:06',815,509,'2005-08-05 13:16:06',1,'2006-02-15 21:30:53'),(8115,'2005-07-28 19:14:17',2080,106,'2005-08-03 14:58:17',2,'2006-02-15 21:30:53'),(8116,'2005-07-28 19:20:07',4497,1,'2005-07-29 22:54:07',1,'2006-02-15 21:30:53'),(8117,'2005-07-28 19:20:16',1502,300,'2005-08-05 23:55:16',1,'2006-02-15 21:30:53'),(8118,'2005-07-28 19:22:22',331,566,'2005-08-01 22:13:22',1,'2006-02-15 21:30:53'),(8119,'2005-07-28 19:23:15',1542,398,'2005-08-04 15:53:15',2,'2006-02-15 21:30:53'),(8120,'2005-07-28 19:24:24',3993,235,'2005-07-31 14:31:24',2,'2006-02-15 21:30:53'),(8121,'2005-07-28 19:25:45',2229,363,'2005-08-02 13:30:45',2,'2006-02-15 21:30:53'),(8122,'2005-07-28 19:27:37',2141,18,'2005-07-29 19:48:37',2,'2006-02-15 21:30:53'),(8123,'2005-07-28 19:28:23',2256,138,'2005-08-04 19:41:23',1,'2006-02-15 21:30:53'),(8124,'2005-07-28 19:28:58',1187,357,'2005-07-31 00:45:58',1,'2006-02-15 21:30:53'),(8125,'2005-07-28 19:31:48',4330,96,'2005-07-30 01:09:48',1,'2006-02-15 21:30:53'),(8126,'2005-07-28 19:32:41',719,537,'2005-08-05 00:33:41',2,'2006-02-15 21:30:53'),(8127,'2005-07-28 19:45:19',4265,20,'2005-07-31 22:07:19',2,'2006-02-15 21:30:53'),(8128,'2005-07-28 19:46:06',2872,71,'2005-08-06 16:10:06',2,'2006-02-15 21:30:53'),(8129,'2005-07-28 19:47:02',2546,345,'2005-07-31 21:33:02',2,'2006-02-15 21:30:53'),(8130,'2005-07-28 19:48:15',4055,499,'2005-08-05 14:18:15',2,'2006-02-15 21:30:53'),(8131,'2005-07-28 19:55:21',437,281,'2005-08-02 21:52:21',2,'2006-02-15 21:30:53'),(8132,'2005-07-28 19:57:31',1303,562,'2005-08-02 22:16:31',2,'2006-02-15 21:30:53'),(8133,'2005-07-28 20:01:06',849,461,'2005-08-01 20:01:06',1,'2006-02-15 21:30:53'),(8134,'2005-07-28 20:01:23',1695,41,'2005-08-03 01:00:23',2,'2006-02-15 21:30:53'),(8135,'2005-07-28 20:03:25',1339,164,'2005-08-03 01:28:25',2,'2006-02-15 21:30:53'),(8136,'2005-07-28 20:05:48',3434,429,'2005-08-01 20:31:48',2,'2006-02-15 21:30:53'),(8137,'2005-07-28 20:07:18',3188,312,'2005-08-03 17:41:18',1,'2006-02-15 21:30:53'),(8138,'2005-07-28 20:12:17',1258,371,'2005-08-01 15:21:17',2,'2006-02-15 21:30:53'),(8139,'2005-07-28 20:16:30',3651,177,'2005-08-03 18:00:30',2,'2006-02-15 21:30:53'),(8140,'2005-07-28 20:17:50',4270,119,'2005-07-30 18:07:50',1,'2006-02-15 21:30:53'),(8141,'2005-07-28 20:21:19',361,523,'2005-07-30 19:16:19',2,'2006-02-15 21:30:53'),(8142,'2005-07-28 20:21:54',1075,322,'2005-07-31 18:39:54',2,'2006-02-15 21:30:53'),(8143,'2005-07-28 20:23:11',3629,429,'2005-08-01 18:17:11',1,'2006-02-15 21:30:53'),(8144,'2005-07-28 20:30:55',3556,320,'2005-07-31 18:10:55',2,'2006-02-15 21:30:53'),(8145,'2005-07-28 20:34:41',937,198,'2005-08-05 15:28:41',2,'2006-02-15 21:30:53'),(8146,'2005-07-28 20:37:36',2430,476,'2005-07-31 16:03:36',2,'2006-02-15 21:30:53'),(8147,'2005-07-28 20:37:56',628,228,'2005-07-30 18:26:56',1,'2006-02-15 21:30:53'),(8148,'2005-07-28 20:39:47',537,347,'2005-08-02 16:29:47',1,'2006-02-15 21:30:53'),(8149,'2005-07-28 20:48:12',1790,591,'2005-08-01 20:07:12',2,'2006-02-15 21:30:53'),(8150,'2005-07-28 20:50:41',3489,497,'2005-08-02 00:43:41',1,'2006-02-15 21:30:53'),(8151,'2005-07-28 20:50:52',4370,495,'2005-07-31 14:50:52',1,'2006-02-15 21:30:53'),(8152,'2005-07-28 20:53:05',2557,46,'2005-08-06 20:03:05',2,'2006-02-15 21:30:53'),(8153,'2005-07-28 20:55:49',2173,347,'2005-08-01 15:56:49',2,'2006-02-15 21:30:53'),(8154,'2005-07-28 20:56:18',1180,285,'2005-08-01 21:56:18',2,'2006-02-15 21:30:53'),(8155,'2005-07-28 20:57:06',3023,428,'2005-08-02 18:40:06',2,'2006-02-15 21:30:53'),(8156,'2005-07-28 20:59:04',1977,257,'2005-08-01 01:52:04',1,'2006-02-15 21:30:53'),(8157,'2005-07-28 21:06:45',915,566,'2005-08-04 16:06:45',1,'2006-02-15 21:30:53'),(8158,'2005-07-28 21:08:46',4327,458,'2005-08-01 21:50:46',2,'2006-02-15 21:30:53'),(8159,'2005-07-28 21:09:28',1118,47,'2005-08-04 15:34:28',1,'2006-02-15 21:30:53'),(8160,'2005-07-28 21:10:30',2446,138,'2005-08-05 16:52:30',2,'2006-02-15 21:30:53'),(8161,'2005-07-28 21:11:00',848,555,'2005-08-03 23:32:00',1,'2006-02-15 21:30:53'),(8162,'2005-07-28 21:11:46',4393,107,'2005-08-04 18:26:46',1,'2006-02-15 21:30:53'),(8163,'2005-07-28 21:11:48',1919,157,'2005-07-31 18:30:48',1,'2006-02-15 21:30:53'),(8164,'2005-07-28 21:17:19',1674,461,'2005-07-30 21:12:19',2,'2006-02-15 21:30:53'),(8165,'2005-07-28 21:23:06',3460,197,'2005-08-01 21:32:06',1,'2006-02-15 21:30:53'),(8166,'2005-07-28 21:23:33',3906,42,'2005-08-03 21:07:33',2,'2006-02-15 21:30:53'),(8167,'2005-07-28 21:25:45',3181,311,'2005-08-04 18:04:45',1,'2006-02-15 21:30:53'),(8168,'2005-07-28 21:28:32',1120,365,'2005-07-30 02:10:32',1,'2006-02-15 21:30:53'),(8169,'2005-07-28 21:29:46',4086,366,'2005-08-06 22:29:46',1,'2006-02-15 21:30:53'),(8170,'2005-07-28 21:32:29',2495,40,'2005-08-03 22:02:29',1,'2006-02-15 21:30:53'),(8171,'2005-07-28 21:32:57',3380,296,'2005-07-30 21:19:57',1,'2006-02-15 21:30:53'),(8172,'2005-07-28 21:34:36',1237,329,'2005-08-06 23:53:36',1,'2006-02-15 21:30:53'),(8173,'2005-07-28 21:35:44',4377,332,'2005-08-06 19:15:44',2,'2006-02-15 21:30:53'),(8174,'2005-07-28 21:36:52',465,359,'2005-08-04 00:32:52',1,'2006-02-15 21:30:53'),(8175,'2005-07-28 21:38:16',641,429,'2005-08-07 01:34:16',2,'2006-02-15 21:30:53'),(8176,'2005-07-28 21:42:08',3527,347,'2005-08-03 22:59:08',2,'2006-02-15 21:30:53'),(8177,'2005-07-28 21:43:54',3696,122,'2005-08-02 22:38:54',2,'2006-02-15 21:30:53'),(8178,'2005-07-28 21:54:31',2825,503,'2005-08-02 23:56:31',2,'2006-02-15 21:30:53'),(8179,'2005-07-28 22:05:13',2902,578,'2005-07-30 21:57:13',2,'2006-02-15 21:30:53'),(8180,'2005-07-28 22:05:24',3236,281,'2005-08-01 19:09:24',1,'2006-02-15 21:30:53'),(8181,'2005-07-28 22:18:38',357,522,'2005-08-06 02:43:38',2,'2006-02-15 21:30:53'),(8182,'2005-07-28 22:19:12',4120,427,'2005-08-01 22:40:12',2,'2006-02-15 21:30:53'),(8183,'2005-07-28 22:21:07',1545,119,'2005-08-04 19:20:07',2,'2006-02-15 21:30:53'),(8184,'2005-07-28 22:22:35',1249,160,'2005-07-31 19:30:35',1,'2006-02-15 21:30:53'),(8185,'2005-07-28 22:23:49',2452,568,'2005-07-31 00:07:49',1,'2006-02-15 21:30:53'),(8186,'2005-07-28 22:30:27',4255,102,'2005-07-31 21:08:27',1,'2006-02-15 21:30:53'),(8187,'2005-07-28 22:33:53',945,87,'2005-08-03 03:54:53',1,'2006-02-15 21:30:53'),(8188,'2005-07-28 22:34:12',3826,10,'2005-08-01 02:32:12',2,'2006-02-15 21:30:53'),(8189,'2005-07-28 22:36:26',3515,361,'2005-08-04 00:12:26',2,'2006-02-15 21:30:53'),(8190,'2005-07-28 22:47:06',2290,267,'2005-08-04 21:51:06',1,'2006-02-15 21:30:53'),(8191,'2005-07-28 22:47:14',1777,508,'2005-07-31 23:13:14',2,'2006-02-15 21:30:53'),(8192,'2005-07-28 22:49:11',255,552,'2005-07-30 04:13:11',1,'2006-02-15 21:30:53'),(8193,'2005-07-28 22:50:50',2402,15,'2005-08-01 04:14:50',2,'2006-02-15 21:30:53'),(8194,'2005-07-28 22:51:44',1148,424,'2005-07-29 17:13:44',1,'2006-02-15 21:30:53'),(8195,'2005-07-28 22:52:58',3989,590,'2005-08-04 02:12:58',1,'2006-02-15 21:30:53'),(8196,'2005-07-28 22:56:11',3435,21,'2005-08-06 04:53:11',1,'2006-02-15 21:30:53'),(8197,'2005-07-28 23:04:10',4126,407,'2005-08-05 00:06:10',2,'2006-02-15 21:30:53'),(8198,'2005-07-28 23:08:05',1767,356,'2005-08-06 00:43:05',2,'2006-02-15 21:30:53'),(8199,'2005-07-28 23:10:25',404,471,'2005-08-04 23:30:25',1,'2006-02-15 21:30:53'),(8200,'2005-07-28 23:10:46',353,185,'2005-07-29 18:35:46',1,'2006-02-15 21:30:53'),(8201,'2005-07-28 23:10:48',220,567,'2005-08-01 00:50:48',2,'2006-02-15 21:30:53'),(8202,'2005-07-28 23:11:45',3802,75,'2005-08-03 21:57:45',2,'2006-02-15 21:30:53'),(8203,'2005-07-28 23:14:56',3878,100,'2005-07-31 04:19:56',2,'2006-02-15 21:30:53'),(8204,'2005-07-28 23:18:29',2472,398,'2005-08-02 04:49:29',1,'2006-02-15 21:30:53'),(8205,'2005-07-28 23:18:48',2944,434,'2005-07-30 00:37:48',2,'2006-02-15 21:30:53'),(8206,'2005-07-28 23:20:31',2979,422,'2005-08-04 21:36:31',1,'2006-02-15 21:30:53'),(8207,'2005-07-28 23:26:31',1195,475,'2005-08-06 03:26:31',1,'2006-02-15 21:30:53'),(8208,'2005-07-28 23:26:35',1362,530,'2005-08-01 23:00:35',2,'2006-02-15 21:30:53'),(8209,'2005-07-28 23:29:28',2484,127,'2005-08-07 04:22:28',2,'2006-02-15 21:30:53'),(8210,'2005-07-28 23:31:05',3424,300,'2005-08-06 17:36:05',1,'2006-02-15 21:30:53'),(8211,'2005-07-28 23:34:22',1859,193,'2005-08-04 21:18:22',1,'2006-02-15 21:30:53'),(8212,'2005-07-28 23:37:23',1305,159,'2005-08-04 04:33:23',2,'2006-02-15 21:30:53'),(8213,'2005-07-28 23:37:33',3816,17,'2005-07-31 00:32:33',2,'2006-02-15 21:30:53'),(8214,'2005-07-28 23:37:57',352,509,'2005-08-07 00:29:57',2,'2006-02-15 21:30:53'),(8215,'2005-07-28 23:43:56',2921,437,'2005-08-03 19:30:56',2,'2006-02-15 21:30:53'),(8216,'2005-07-28 23:43:59',2211,254,'2005-08-06 05:05:59',1,'2006-02-15 21:30:53'),(8217,'2005-07-28 23:44:13',3747,206,'2005-08-03 21:27:13',2,'2006-02-15 21:30:53'),(8218,'2005-07-28 23:45:41',2769,578,'2005-08-02 00:14:41',1,'2006-02-15 21:30:53'),(8219,'2005-07-28 23:46:31',3609,227,'2005-08-03 00:11:31',2,'2006-02-15 21:30:53'),(8220,'2005-07-28 23:46:41',1061,360,'2005-07-31 22:14:41',2,'2006-02-15 21:30:53'),(8221,'2005-07-28 23:47:19',3138,496,'2005-08-02 20:42:19',1,'2006-02-15 21:30:53'),(8222,'2005-07-28 23:51:53',2999,278,'2005-08-05 22:48:53',1,'2006-02-15 21:30:53'),(8223,'2005-07-28 23:56:01',4508,282,'2005-08-03 22:27:01',1,'2006-02-15 21:30:53'),(8224,'2005-07-28 23:59:02',1995,467,'2005-08-02 04:54:02',1,'2006-02-15 21:30:53'),(8225,'2005-07-28 23:59:29',3631,41,'2005-07-30 03:27:29',2,'2006-02-15 21:30:53'),(8226,'2005-07-29 00:01:04',3541,368,'2005-08-01 19:08:04',2,'2006-02-15 21:30:53'),(8227,'2005-07-29 00:02:22',269,167,'2005-07-31 04:05:22',1,'2006-02-15 21:30:53'),(8228,'2005-07-29 00:08:58',1955,72,'2005-08-03 00:12:58',2,'2006-02-15 21:30:53'),(8229,'2005-07-29 00:09:08',4272,498,'2005-07-31 19:29:08',2,'2006-02-15 21:30:53'),(8230,'2005-07-29 00:12:59',1937,2,'2005-08-06 19:52:59',2,'2006-02-15 21:30:53'),(8231,'2005-07-29 00:14:37',1083,331,'2005-07-31 19:12:37',1,'2006-02-15 21:30:53'),(8232,'2005-07-29 00:14:37',3255,526,'2005-08-06 00:57:37',1,'2006-02-15 21:30:53'),(8233,'2005-07-29 00:16:23',1640,93,'2005-08-03 05:17:23',2,'2006-02-15 21:30:53'),(8234,'2005-07-29 00:19:20',644,227,'2005-08-03 19:16:20',2,'2006-02-15 21:30:53'),(8235,'2005-07-29 00:22:56',1581,320,'2005-08-03 04:03:56',2,'2006-02-15 21:30:53'),(8236,'2005-07-29 00:27:04',1901,369,'2005-07-31 05:02:04',2,'2006-02-15 21:30:53'),(8237,'2005-07-29 00:29:56',608,441,'2005-08-06 03:10:56',1,'2006-02-15 21:30:53'),(8238,'2005-07-29 00:30:06',2941,320,'2005-08-02 22:52:06',2,'2006-02-15 21:30:53'),(8239,'2005-07-29 00:31:39',3951,549,'2005-07-29 19:33:39',1,'2006-02-15 21:30:53'),(8240,'2005-07-29 00:33:32',1975,509,'2005-08-05 21:25:32',2,'2006-02-15 21:30:53'),(8241,'2005-07-29 00:33:36',4297,26,'2005-08-03 01:31:36',1,'2006-02-15 21:30:53'),(8242,'2005-07-29 00:34:27',509,99,'2005-08-05 23:13:27',2,'2006-02-15 21:30:53'),(8243,'2005-07-29 00:35:33',1873,481,'2005-08-04 06:02:33',2,'2006-02-15 21:30:53'),(8244,'2005-07-29 00:35:34',1552,175,'2005-08-05 04:18:34',2,'2006-02-15 21:30:53'),(8245,'2005-07-29 00:37:09',3330,555,'2005-08-05 05:48:09',2,'2006-02-15 21:30:53'),(8246,'2005-07-29 00:38:41',1724,146,'2005-08-05 06:28:41',2,'2006-02-15 21:30:53'),(8247,'2005-07-29 00:41:38',2607,539,'2005-08-06 20:29:38',2,'2006-02-15 21:30:53'),(8248,'2005-07-29 00:41:56',2017,272,'2005-08-05 18:53:56',2,'2006-02-15 21:30:53'),(8249,'2005-07-29 00:48:44',3331,57,'2005-08-07 04:25:44',2,'2006-02-15 21:30:53'),(8250,'2005-07-29 00:49:15',4519,533,'2005-08-04 02:53:15',1,'2006-02-15 21:30:53'),(8251,'2005-07-29 00:50:14',2317,408,'2005-08-03 23:52:14',2,'2006-02-15 21:30:53'),(8252,'2005-07-29 00:54:17',3312,257,'2005-07-31 20:34:17',1,'2006-02-15 21:30:53'),(8253,'2005-07-29 00:57:06',2388,76,'2005-08-07 01:46:06',1,'2006-02-15 21:30:53'),(8254,'2005-07-29 00:59:31',1787,392,'2005-08-03 23:43:31',2,'2006-02-15 21:30:53'),(8255,'2005-07-29 01:02:30',3715,224,'2005-08-01 22:39:30',1,'2006-02-15 21:30:53'),(8256,'2005-07-29 01:02:42',1483,537,'2005-07-31 22:29:42',2,'2006-02-15 21:30:53'),(8257,'2005-07-29 01:03:20',3024,566,'2005-08-04 21:54:20',1,'2006-02-15 21:30:53'),(8258,'2005-07-29 01:03:42',1379,370,'2005-08-04 22:08:42',2,'2006-02-15 21:30:53'),(8259,'2005-07-29 01:05:16',343,274,'2005-08-01 23:27:16',2,'2006-02-15 21:30:53'),(8260,'2005-07-29 01:11:00',4249,366,'2005-08-06 00:36:00',1,'2006-02-15 21:30:53'),(8261,'2005-07-29 01:11:05',1915,50,'2005-08-04 03:13:05',2,'2006-02-15 21:30:53'),(8262,'2005-07-29 01:11:18',1341,563,'2005-08-02 05:17:18',2,'2006-02-15 21:30:53'),(8263,'2005-07-29 01:11:23',28,5,'2005-07-31 01:53:23',2,'2006-02-15 21:30:53'),(8264,'2005-07-29 01:18:50',2987,175,'2005-08-03 05:31:50',2,'2006-02-15 21:30:53'),(8265,'2005-07-29 01:20:15',2389,409,'2005-08-06 19:32:15',2,'2006-02-15 21:30:53'),(8266,'2005-07-29 01:20:16',1972,196,'2005-07-30 04:31:16',1,'2006-02-15 21:30:53'),(8267,'2005-07-29 01:21:02',4107,131,'2005-08-04 19:34:02',2,'2006-02-15 21:30:53'),(8268,'2005-07-29 01:23:23',4239,421,'2005-08-05 01:36:23',1,'2006-02-15 21:30:53'),(8269,'2005-07-29 01:26:54',2778,376,'2005-08-04 22:42:54',1,'2006-02-15 21:30:53'),(8270,'2005-07-29 01:27:22',3565,282,'2005-07-29 20:55:22',1,'2006-02-15 21:30:53'),(8271,'2005-07-29 01:27:44',83,481,'2005-08-07 05:01:44',2,'2006-02-15 21:30:53'),(8272,'2005-07-29 01:29:51',70,346,'2005-08-03 21:56:51',2,'2006-02-15 21:30:53'),(8273,'2005-07-29 01:33:16',4244,532,'2005-08-06 04:26:16',2,'2006-02-15 21:30:53'),(8274,'2005-07-29 01:34:32',2634,340,'2005-08-01 20:15:32',2,'2006-02-15 21:30:53'),(8275,'2005-07-29 01:35:47',4432,336,'2005-07-30 02:16:47',1,'2006-02-15 21:30:53'),(8276,'2005-07-29 01:38:43',2451,466,'2005-08-03 23:00:43',1,'2006-02-15 21:30:53'),(8277,'2005-07-29 01:38:53',1296,13,'2005-08-04 07:09:53',2,'2006-02-15 21:30:53'),(8278,'2005-07-29 01:42:55',768,265,'2005-08-05 01:55:55',2,'2006-02-15 21:30:53'),(8279,'2005-07-29 01:43:37',3838,176,'2005-08-03 02:36:37',1,'2006-02-15 21:30:53'),(8280,'2005-07-29 01:45:51',1208,195,'2005-08-05 22:51:51',2,'2006-02-15 21:30:53'),(8281,'2005-07-29 01:46:00',899,441,'2005-08-04 23:09:00',1,'2006-02-15 21:30:53'),(8282,'2005-07-29 01:49:04',980,462,'2005-08-05 01:51:04',2,'2006-02-15 21:30:53'),(8283,'2005-07-29 01:52:22',2002,300,'2005-08-05 03:22:22',2,'2006-02-15 21:30:53'),(8284,'2005-07-29 01:56:40',4371,446,'2005-08-07 07:15:40',2,'2006-02-15 21:30:53'),(8285,'2005-07-29 02:00:18',678,56,'2005-08-03 20:43:18',2,'2006-02-15 21:30:53'),(8286,'2005-07-29 02:02:46',4092,87,'2005-08-06 06:00:46',1,'2006-02-15 21:30:53'),(8287,'2005-07-29 02:03:58',812,178,'2005-08-07 02:11:58',1,'2006-02-15 21:30:53'),(8288,'2005-07-29 02:04:22',1822,55,'2005-08-05 04:21:22',2,'2006-02-15 21:30:53'),(8289,'2005-07-29 02:23:24',4579,459,'2005-08-06 03:23:24',2,'2006-02-15 21:30:53'),(8290,'2005-07-29 02:24:08',3823,462,'2005-08-03 01:02:08',2,'2006-02-15 21:30:53'),(8291,'2005-07-29 02:28:25',2817,455,'2005-08-03 20:57:25',2,'2006-02-15 21:30:53'),(8292,'2005-07-29 02:29:36',4003,192,'2005-08-07 08:06:36',1,'2006-02-15 21:30:53'),(8293,'2005-07-29 02:30:50',831,71,'2005-08-04 03:09:50',2,'2006-02-15 21:30:53'),(8294,'2005-07-29 02:32:41',1811,520,'2005-08-02 06:28:41',1,'2006-02-15 21:30:53'),(8295,'2005-07-29 02:42:14',2065,406,'2005-07-30 22:22:14',1,'2006-02-15 21:30:53'),(8296,'2005-07-29 02:43:25',2543,88,'2005-08-01 00:23:25',1,'2006-02-15 21:30:53'),(8297,'2005-07-29 02:45:46',3774,349,'2005-07-31 20:49:46',1,'2006-02-15 21:30:53'),(8298,'2005-07-29 02:47:36',952,493,'2005-08-05 07:58:36',2,'2006-02-15 21:30:53'),(8299,'2005-07-29 02:56:00',1797,173,'2005-07-30 22:35:00',2,'2006-02-15 21:30:53'),(8300,'2005-07-29 02:57:59',4364,222,'2005-08-05 01:12:59',2,'2006-02-15 21:30:53'),(8301,'2005-07-29 03:00:08',562,101,'2005-08-01 04:26:08',2,'2006-02-15 21:30:53'),(8302,'2005-07-29 03:01:24',1314,103,'2005-07-30 01:08:24',2,'2006-02-15 21:30:53'),(8303,'2005-07-29 03:05:56',1620,574,'2005-08-04 06:13:56',1,'2006-02-15 21:30:53'),(8304,'2005-07-29 03:08:30',4431,119,'2005-08-02 03:04:30',2,'2006-02-15 21:30:53'),(8305,'2005-07-29 03:08:47',3916,566,'2005-08-06 07:49:47',2,'2006-02-15 21:30:53'),(8306,'2005-07-29 03:12:26',1708,232,'2005-08-01 23:26:26',1,'2006-02-15 21:30:53'),(8307,'2005-07-29 03:18:34',3197,39,'2005-08-06 05:51:34',2,'2006-02-15 21:30:53'),(8308,'2005-07-29 03:22:15',601,582,'2005-08-04 21:38:15',2,'2006-02-15 21:30:53'),(8309,'2005-07-29 03:22:20',2250,446,'2005-08-01 06:30:20',1,'2006-02-15 21:30:53'),(8310,'2005-07-29 03:25:56',2637,238,'2005-08-06 23:18:56',2,'2006-02-15 21:30:53'),(8311,'2005-07-29 03:26:07',3623,63,'2005-08-02 01:46:07',1,'2006-02-15 21:30:53'),(8312,'2005-07-29 03:32:38',3996,143,'2005-07-31 02:12:38',1,'2006-02-15 21:30:53'),(8313,'2005-07-29 03:34:21',2736,91,'2005-08-02 01:32:21',1,'2006-02-15 21:30:53'),(8314,'2005-07-29 03:35:04',2182,118,'2005-08-06 08:43:04',2,'2006-02-15 21:30:53'),(8315,'2005-07-29 03:37:07',1420,135,'2005-07-29 23:22:07',2,'2006-02-15 21:30:53'),(8316,'2005-07-29 03:38:49',4118,549,'2005-08-03 07:41:49',1,'2006-02-15 21:30:53'),(8317,'2005-07-29 03:39:07',3898,415,'2005-08-03 00:14:07',1,'2006-02-15 21:30:53'),(8318,'2005-07-29 03:44:30',4524,167,'2005-07-30 05:03:30',2,'2006-02-15 21:30:53'),(8319,'2005-07-29 03:44:52',747,280,'2005-08-01 00:35:52',2,'2006-02-15 21:30:53'),(8320,'2005-07-29 03:49:58',1285,513,'2005-08-03 01:00:58',1,'2006-02-15 21:30:53'),(8321,'2005-07-29 03:50:54',1875,354,'2005-08-01 02:08:54',1,'2006-02-15 21:30:53'),(8322,'2005-07-29 03:52:49',301,541,'2005-08-02 22:53:49',1,'2006-02-15 21:30:53'),(8323,'2005-07-29 03:52:59',2766,87,'2005-08-06 01:49:59',2,'2006-02-15 21:30:53'),(8324,'2005-07-29 03:56:05',1467,98,'2005-08-02 01:41:05',1,'2006-02-15 21:30:53'),(8325,'2005-07-29 03:57:27',932,362,'2005-08-06 22:30:27',1,'2006-02-15 21:30:53'),(8326,'2005-07-29 03:58:49',108,1,'2005-08-01 05:16:49',2,'2006-02-15 21:30:53'),(8327,'2005-07-29 04:00:52',2928,317,'2005-07-31 08:27:52',1,'2006-02-15 21:30:53'),(8328,'2005-07-29 04:06:24',4454,314,'2005-08-03 22:24:24',1,'2006-02-15 21:30:53'),(8329,'2005-07-29 04:06:33',3468,108,'2005-08-06 01:46:33',1,'2006-02-15 21:30:53'),(8330,'2005-07-29 04:09:07',2294,412,'2005-08-05 05:00:07',2,'2006-02-15 21:30:53'),(8331,'2005-07-29 04:13:29',18,148,'2005-08-04 07:09:29',1,'2006-02-15 21:30:53'),(8332,'2005-07-29 04:16:00',1142,217,'2005-08-03 03:34:00',1,'2006-02-15 21:30:53'),(8333,'2005-07-29 04:16:40',823,494,'2005-08-02 10:10:40',2,'2006-02-15 21:30:53'),(8334,'2005-07-29 04:18:25',982,154,'2005-08-07 07:18:25',2,'2006-02-15 21:30:53'),(8335,'2005-07-29 04:18:25',1719,143,'2005-07-31 08:12:25',2,'2006-02-15 21:30:53'),(8336,'2005-07-29 04:20:42',2120,210,'2005-08-05 10:17:42',1,'2006-02-15 21:30:53'),(8337,'2005-07-29 04:31:55',752,157,'2005-08-02 02:38:55',2,'2006-02-15 21:30:53'),(8338,'2005-07-29 04:40:39',2257,389,'2005-08-07 04:40:39',2,'2006-02-15 21:30:53'),(8339,'2005-07-29 04:41:13',1870,129,'2005-07-30 09:01:13',2,'2006-02-15 21:30:53'),(8340,'2005-07-29 04:41:44',1553,386,'2005-08-07 10:33:44',1,'2006-02-15 21:30:53'),(8341,'2005-07-29 04:42:01',4208,309,'2005-08-04 00:58:01',1,'2006-02-15 21:30:53'),(8342,'2005-07-29 04:45:05',3301,572,'2005-08-01 07:20:05',1,'2006-02-15 21:30:53'),(8343,'2005-07-29 04:45:16',4267,439,'2005-08-02 03:37:16',1,'2006-02-15 21:30:53'),(8344,'2005-07-29 04:45:25',221,257,'2005-08-06 01:53:25',1,'2006-02-15 21:30:53'),(8345,'2005-07-29 04:47:37',1034,129,'2005-08-02 07:25:37',1,'2006-02-15 21:30:53'),(8346,'2005-07-29 04:48:22',2475,385,'2005-08-01 04:22:22',1,'2006-02-15 21:30:53'),(8347,'2005-07-29 04:49:25',4407,157,'2005-07-31 00:57:25',2,'2006-02-15 21:30:53'),(8348,'2005-07-29 04:49:26',4533,174,'2005-08-05 03:26:26',2,'2006-02-15 21:30:53'),(8349,'2005-07-29 04:50:22',534,416,'2005-08-05 08:50:22',1,'2006-02-15 21:30:53'),(8350,'2005-07-29 04:50:39',3726,513,'2005-07-31 05:36:39',2,'2006-02-15 21:30:53'),(8351,'2005-07-29 04:50:53',2963,202,'2005-07-30 07:28:53',2,'2006-02-15 21:30:53'),(8352,'2005-07-29 04:52:01',2710,168,'2005-08-06 07:39:01',2,'2006-02-15 21:30:53'),(8353,'2005-07-29 04:52:10',26,585,'2005-07-30 04:01:10',1,'2006-02-15 21:30:53'),(8354,'2005-07-29 04:56:26',4476,579,'2005-08-01 08:04:26',2,'2006-02-15 21:30:53'),(8355,'2005-07-29 04:57:43',4569,270,'2005-08-03 06:25:43',1,'2006-02-15 21:30:53'),(8356,'2005-07-29 04:58:56',2951,483,'2005-08-06 03:07:56',1,'2006-02-15 21:30:53'),(8357,'2005-07-29 04:59:44',892,76,'2005-08-01 04:26:44',1,'2006-02-15 21:30:53'),(8358,'2005-07-29 05:00:58',1449,372,'2005-08-01 02:49:58',2,'2006-02-15 21:30:53'),(8359,'2005-07-29 05:02:12',140,531,'2005-08-04 08:52:12',1,'2006-02-15 21:30:53'),(8360,'2005-07-29 05:08:00',4135,62,'2005-08-02 00:40:00',1,'2006-02-15 21:30:53'),(8361,'2005-07-29 05:08:57',3404,360,'2005-08-03 02:49:57',1,'2006-02-15 21:30:53'),(8362,'2005-07-29 05:09:11',2287,223,'2005-08-04 00:08:11',2,'2006-02-15 21:30:53'),(8363,'2005-07-29 05:10:08',1607,302,'2005-08-06 00:11:08',1,'2006-02-15 21:30:53'),(8364,'2005-07-29 05:10:31',1361,362,'2005-07-30 04:02:31',2,'2006-02-15 21:30:53'),(8365,'2005-07-29 05:11:00',53,280,'2005-07-30 05:30:00',2,'2006-02-15 21:30:53'),(8366,'2005-07-29 05:11:14',479,39,'2005-08-05 01:48:14',1,'2006-02-15 21:30:53'),(8367,'2005-07-29 05:11:19',4551,383,'2005-08-02 00:35:19',1,'2006-02-15 21:30:53'),(8368,'2005-07-29 05:15:41',1410,200,'2005-08-07 01:35:41',1,'2006-02-15 21:30:53'),(8369,'2005-07-29 05:15:42',1456,507,'2005-08-01 03:36:42',2,'2006-02-15 21:30:53'),(8370,'2005-07-29 05:16:21',1206,121,'2005-08-06 23:16:21',1,'2006-02-15 21:30:53'),(8371,'2005-07-29 05:16:35',2466,396,'2005-07-31 01:49:35',1,'2006-02-15 21:30:53'),(8372,'2005-07-29 05:18:08',754,523,'2005-08-06 09:39:08',1,'2006-02-15 21:30:53'),(8373,'2005-07-29 05:19:53',2070,457,'2005-08-04 04:39:53',1,'2006-02-15 21:30:53'),(8374,'2005-07-29 05:24:02',1084,589,'2005-08-05 03:55:02',1,'2006-02-15 21:30:53'),(8375,'2005-07-29 05:25:30',3634,125,'2005-08-04 01:43:30',2,'2006-02-15 21:30:53'),(8376,'2005-07-29 05:25:32',3588,43,'2005-08-01 07:42:32',2,'2006-02-15 21:30:53'),(8377,'2005-07-29 05:27:40',270,73,'2005-07-30 02:52:40',2,'2006-02-15 21:30:53'),(8378,'2005-07-29 05:28:35',3500,347,'2005-08-02 05:55:35',1,'2006-02-15 21:30:53'),(8379,'2005-07-29 05:29:40',3907,193,'2005-08-06 05:56:40',2,'2006-02-15 21:30:53'),(8380,'2005-07-29 05:31:29',2279,145,'2005-08-02 01:27:29',1,'2006-02-15 21:30:53'),(8381,'2005-07-29 05:31:44',865,313,'2005-07-31 09:20:44',1,'2006-02-15 21:30:53'),(8382,'2005-07-29 05:33:21',317,238,'2005-08-03 03:38:21',1,'2006-02-15 21:30:53'),(8383,'2005-07-29 05:36:47',3809,495,'2005-08-03 05:53:47',2,'2006-02-15 21:30:53'),(8384,'2005-07-29 05:38:43',3807,227,'2005-08-01 07:31:43',2,'2006-02-15 21:30:53'),(8385,'2005-07-29 05:39:16',4108,233,'2005-08-03 00:30:16',1,'2006-02-15 21:30:53'),(8386,'2005-07-29 05:45:30',388,435,'2005-08-05 03:56:30',2,'2006-02-15 21:30:53'),(8387,'2005-07-29 05:47:27',910,428,'2005-07-31 06:26:27',1,'2006-02-15 21:30:53'),(8388,'2005-07-29 05:48:15',770,178,'2005-08-05 06:24:15',2,'2006-02-15 21:30:53'),(8389,'2005-07-29 05:50:09',1241,133,'2005-08-06 05:15:09',2,'2006-02-15 21:30:53'),(8390,'2005-07-29 05:52:26',581,32,'2005-08-04 08:12:26',2,'2006-02-15 21:30:53'),(8391,'2005-07-29 05:52:50',2134,36,'2005-08-03 04:45:50',2,'2006-02-15 21:30:53'),(8392,'2005-07-29 06:00:27',1323,65,'2005-08-02 00:30:27',2,'2006-02-15 21:30:53'),(8393,'2005-07-29 06:02:11',3369,504,'2005-08-07 03:23:11',1,'2006-02-15 21:30:53'),(8394,'2005-07-29 06:02:14',3933,148,'2005-08-03 08:15:14',1,'2006-02-15 21:30:53'),(8395,'2005-07-29 06:03:30',1471,535,'2005-07-31 09:08:30',2,'2006-02-15 21:30:53'),(8396,'2005-07-29 06:07:00',3911,516,'2005-07-30 05:32:00',2,'2006-02-15 21:30:53'),(8397,'2005-07-29 06:09:35',3542,518,'2005-08-01 02:08:35',1,'2006-02-15 21:30:53'),(8398,'2005-07-29 06:12:40',348,220,'2005-08-02 05:01:40',2,'2006-02-15 21:30:53'),(8399,'2005-07-29 06:20:18',233,286,'2005-08-04 01:26:18',1,'2006-02-15 21:30:53'),(8400,'2005-07-29 06:23:56',3680,573,'2005-07-31 02:41:56',2,'2006-02-15 21:30:53'),(8401,'2005-07-29 06:25:08',3121,232,'2005-08-01 06:49:08',1,'2006-02-15 21:30:53'),(8402,'2005-07-29 06:25:45',186,47,'2005-08-07 10:48:45',1,'2006-02-15 21:30:53'),(8403,'2005-07-29 06:26:39',1360,163,'2005-08-02 05:37:39',1,'2006-02-15 21:30:53'),(8404,'2005-07-29 06:27:01',2086,65,'2005-08-07 04:33:01',1,'2006-02-15 21:30:53'),(8405,'2005-07-29 06:28:19',2164,76,'2005-08-07 08:14:19',2,'2006-02-15 21:30:53'),(8406,'2005-07-29 06:34:45',2047,274,'2005-08-06 02:28:45',1,'2006-02-15 21:30:53'),(8407,'2005-07-29 06:37:02',2985,336,'2005-08-04 03:13:02',1,'2006-02-15 21:30:53'),(8408,'2005-07-29 06:40:40',1841,90,'2005-07-30 10:02:40',2,'2006-02-15 21:30:53'),(8409,'2005-07-29 06:41:22',4314,303,'2005-07-31 11:21:22',1,'2006-02-15 21:30:53'),(8410,'2005-07-29 06:41:36',3448,277,'2005-08-02 08:38:36',1,'2006-02-15 21:30:53'),(8411,'2005-07-29 06:44:23',3085,412,'2005-08-07 03:56:23',1,'2006-02-15 21:30:53'),(8412,'2005-07-29 06:44:50',743,312,'2005-08-06 05:04:50',1,'2006-02-15 21:30:53'),(8413,'2005-07-29 06:47:39',2762,104,'2005-08-02 09:15:39',2,'2006-02-15 21:30:53'),(8414,'2005-07-29 06:48:35',1337,433,'2005-08-06 10:54:35',2,'2006-02-15 21:30:53'),(8415,'2005-07-29 06:52:27',2903,128,'2005-08-02 10:40:27',1,'2006-02-15 21:30:53'),(8416,'2005-07-29 06:52:54',1999,315,'2005-08-05 09:50:54',2,'2006-02-15 21:30:53'),(8417,'2005-07-29 06:53:36',750,227,'2005-08-06 09:31:36',2,'2006-02-15 21:30:53'),(8418,'2005-07-29 06:54:21',3081,355,'2005-08-05 06:50:21',2,'2006-02-15 21:30:53'),(8419,'2005-07-29 06:54:48',4574,37,'2005-08-06 05:02:48',1,'2006-02-15 21:30:53'),(8420,'2005-07-29 07:00:45',4184,376,'2005-08-06 02:20:45',1,'2006-02-15 21:30:53'),(8421,'2005-07-29 07:00:47',3399,588,'2005-08-02 08:03:47',2,'2006-02-15 21:30:53'),(8422,'2005-07-29 07:02:55',3104,7,'2005-08-03 12:35:55',1,'2006-02-15 21:30:53'),(8423,'2005-07-29 07:02:57',187,468,'2005-08-06 04:59:57',1,'2006-02-15 21:30:53'),(8424,'2005-07-29 07:06:03',366,138,'2005-08-06 12:00:03',2,'2006-02-15 21:30:53'),(8425,'2005-07-29 07:06:21',3491,486,'2005-08-05 07:57:21',2,'2006-02-15 21:30:53'),(8426,'2005-07-29 07:07:48',1840,564,'2005-08-07 08:56:48',2,'2006-02-15 21:30:53'),(8427,'2005-07-29 07:08:36',1624,441,'2005-07-30 11:54:36',2,'2006-02-15 21:30:53'),(8428,'2005-07-29 07:10:14',2545,398,'2005-08-06 02:29:14',2,'2006-02-15 21:30:53'),(8429,'2005-07-29 07:11:49',2456,588,'2005-07-31 02:45:49',1,'2006-02-15 21:30:53'),(8430,'2005-07-29 07:12:17',3377,219,'2005-08-03 09:53:17',2,'2006-02-15 21:30:53'),(8431,'2005-07-29 07:12:48',1583,193,'2005-08-01 10:03:48',1,'2006-02-15 21:30:53'),(8432,'2005-07-29 07:13:33',3896,572,'2005-07-30 03:14:33',1,'2006-02-15 21:30:53'),(8433,'2005-07-29 07:19:16',1957,125,'2005-08-05 03:29:16',1,'2006-02-15 21:30:53'),(8434,'2005-07-29 07:20:14',40,141,'2005-07-30 08:50:14',2,'2006-02-15 21:30:53'),(8435,'2005-07-29 07:20:16',4462,520,'2005-08-02 09:54:16',2,'2006-02-15 21:30:53'),(8436,'2005-07-29 07:21:20',2702,598,'2005-07-31 12:56:20',2,'2006-02-15 21:30:53'),(8437,'2005-07-29 07:23:43',2118,96,'2005-08-04 10:52:43',1,'2006-02-15 21:30:53'),(8438,'2005-07-29 07:25:42',720,97,'2005-08-04 07:39:42',1,'2006-02-15 21:30:53'),(8439,'2005-07-29 07:28:43',182,224,'2005-08-04 11:22:43',1,'2006-02-15 21:30:53'),(8440,'2005-07-29 07:31:26',489,175,'2005-08-04 07:04:26',1,'2006-02-15 21:30:53'),(8441,'2005-07-29 07:33:05',1000,526,'2005-08-04 04:00:05',2,'2006-02-15 21:30:53'),(8442,'2005-07-29 07:33:07',4345,185,'2005-08-03 03:09:07',2,'2006-02-15 21:30:53'),(8443,'2005-07-29 07:33:12',1059,251,'2005-08-02 01:36:12',2,'2006-02-15 21:30:53'),(8444,'2005-07-29 07:36:13',3329,213,'2005-08-05 04:55:13',1,'2006-02-15 21:30:53'),(8445,'2005-07-29 07:37:48',2792,384,'2005-08-04 10:43:48',1,'2006-02-15 21:30:53'),(8446,'2005-07-29 07:38:10',1593,235,'2005-08-06 04:39:10',2,'2006-02-15 21:30:53'),(8447,'2005-07-29 07:38:14',930,11,'2005-08-05 02:27:14',2,'2006-02-15 21:30:53'),(8448,'2005-07-29 07:41:54',4349,393,'2005-08-02 13:12:54',1,'2006-02-15 21:30:53'),(8449,'2005-07-29 07:42:25',2610,273,'2005-07-30 06:07:25',2,'2006-02-15 21:30:53'),(8450,'2005-07-29 07:44:05',484,401,'2005-08-01 12:23:05',1,'2006-02-15 21:30:53'),(8451,'2005-07-29 07:44:56',3309,495,'2005-08-06 02:29:56',1,'2006-02-15 21:30:53'),(8452,'2005-07-29 07:45:00',4312,16,'2005-08-05 09:46:00',2,'2006-02-15 21:30:53'),(8453,'2005-07-29 07:46:29',2907,32,'2005-07-30 07:07:29',1,'2006-02-15 21:30:53'),(8454,'2005-07-29 07:49:04',159,244,'2005-08-03 04:43:04',2,'2006-02-15 21:30:53'),(8455,'2005-07-29 07:53:06',4043,404,'2005-08-05 05:29:06',1,'2006-02-15 21:30:53'),(8456,'2005-07-29 07:58:31',671,388,'2005-08-05 07:17:31',2,'2006-02-15 21:30:53'),(8457,'2005-07-29 07:59:03',3371,239,'2005-08-04 08:42:03',1,'2006-02-15 21:30:53'),(8458,'2005-07-29 08:05:09',3857,317,'2005-08-02 03:42:09',1,'2006-02-15 21:30:53'),(8459,'2005-07-29 08:05:40',3441,144,'2005-08-04 03:24:40',1,'2006-02-15 21:30:53'),(8460,'2005-07-29 08:08:03',2826,329,'2005-08-07 06:53:03',2,'2006-02-15 21:30:53'),(8461,'2005-07-29 08:11:31',3373,399,'2005-08-06 09:23:31',1,'2006-02-15 21:30:53'),(8462,'2005-07-29 08:15:42',3633,200,'2005-08-04 03:57:42',1,'2006-02-15 21:30:53'),(8463,'2005-07-29 08:17:51',466,203,'2005-08-03 13:41:51',1,'2006-02-15 21:30:53'),(8464,'2005-07-29 08:18:20',2343,28,'2005-08-03 04:50:20',2,'2006-02-15 21:30:53'),(8465,'2005-07-29 08:20:49',4109,238,'2005-07-31 04:02:49',2,'2006-02-15 21:30:53'),(8466,'2005-07-29 08:24:47',4010,285,'2005-07-31 03:43:47',1,'2006-02-15 21:30:53'),(8467,'2005-07-29 08:25:35',263,326,'2005-08-07 03:28:35',2,'2006-02-15 21:30:53'),(8468,'2005-07-29 08:26:04',1338,282,'2005-08-02 07:18:04',1,'2006-02-15 21:30:53'),(8469,'2005-07-29 08:26:27',2754,408,'2005-08-05 04:26:27',2,'2006-02-15 21:30:53'),(8470,'2005-07-29 08:28:50',3717,159,'2005-07-30 13:40:50',2,'2006-02-15 21:30:53'),(8471,'2005-07-29 08:32:11',1520,533,'2005-08-01 13:55:11',1,'2006-02-15 21:30:53'),(8472,'2005-07-29 08:36:22',2975,196,'2005-08-02 07:55:22',1,'2006-02-15 21:30:53'),(8473,'2005-07-29 08:36:53',4141,311,'2005-07-31 12:14:53',1,'2006-02-15 21:30:53'),(8474,'2005-07-29 08:36:56',4346,323,'2005-08-01 03:07:56',1,'2006-02-15 21:30:53'),(8475,'2005-07-29 08:37:41',3695,260,'2005-08-04 10:03:41',2,'2006-02-15 21:30:53'),(8476,'2005-07-29 08:39:12',3741,470,'2005-08-06 03:03:12',1,'2006-02-15 21:30:53'),(8477,'2005-07-29 08:40:36',3571,354,'2005-08-06 08:28:36',2,'2006-02-15 21:30:53'),(8478,'2005-07-29 08:40:36',3742,162,'2005-08-01 10:23:36',1,'2006-02-15 21:30:53'),(8479,'2005-07-29 08:42:04',1990,195,'2005-08-01 03:10:04',1,'2006-02-15 21:30:53'),(8480,'2005-07-29 08:44:46',3512,467,'2005-08-05 13:22:46',1,'2006-02-15 21:30:53'),(8481,'2005-07-29 08:45:57',1739,454,'2005-08-01 12:50:57',2,'2006-02-15 21:30:53'),(8482,'2005-07-29 08:46:33',2686,405,'2005-07-31 11:07:33',2,'2006-02-15 21:30:53'),(8483,'2005-07-29 08:50:18',2786,186,'2005-08-03 06:46:18',1,'2006-02-15 21:30:53'),(8484,'2005-07-29 08:51:59',742,260,'2005-07-30 09:07:59',1,'2006-02-15 21:30:53'),(8485,'2005-07-29 08:53:09',3172,420,'2005-07-30 11:25:09',1,'2006-02-15 21:30:53'),(8486,'2005-07-29 08:53:38',1759,221,'2005-08-01 14:12:38',2,'2006-02-15 21:30:53'),(8487,'2005-07-29 08:53:49',1893,82,'2005-07-31 09:10:49',2,'2006-02-15 21:30:53'),(8488,'2005-07-29 08:57:38',2176,478,'2005-08-02 04:16:38',1,'2006-02-15 21:30:53'),(8489,'2005-07-29 08:58:03',375,265,'2005-08-02 07:50:03',2,'2006-02-15 21:30:53'),(8490,'2005-07-29 08:59:25',1943,367,'2005-08-05 14:02:25',2,'2006-02-15 21:30:53'),(8491,'2005-07-29 09:02:13',1806,242,'2005-08-03 04:32:13',1,'2006-02-15 21:30:53'),(8492,'2005-07-29 09:04:17',4553,266,'2005-08-02 08:48:17',2,'2006-02-15 21:30:53'),(8493,'2005-07-29 09:04:31',664,390,'2005-08-04 05:17:31',2,'2006-02-15 21:30:53'),(8494,'2005-07-29 09:04:32',3524,92,'2005-07-31 10:30:32',1,'2006-02-15 21:30:53'),(8495,'2005-07-29 09:05:06',344,51,'2005-08-06 05:48:06',2,'2006-02-15 21:30:53'),(8496,'2005-07-29 09:05:33',765,114,'2005-08-02 06:32:33',1,'2006-02-15 21:30:53'),(8497,'2005-07-29 09:07:03',1837,593,'2005-08-02 09:18:03',2,'2006-02-15 21:30:53'),(8498,'2005-07-29 09:07:38',4468,190,'2005-08-04 07:01:38',1,'2006-02-15 21:30:53'),(8499,'2005-07-29 09:10:41',219,42,'2005-08-05 10:01:41',1,'2006-02-15 21:30:53'),(8500,'2005-07-29 09:12:01',4516,348,'2005-07-31 10:15:01',1,'2006-02-15 21:30:53'),(8501,'2005-07-29 09:12:51',1052,309,'2005-07-30 11:19:51',2,'2006-02-15 21:30:53'),(8502,'2005-07-29 09:15:41',2149,457,'2005-07-30 10:41:41',1,'2006-02-15 21:30:53'),(8503,'2005-07-29 09:16:50',1164,240,'2005-08-04 11:34:50',2,'2006-02-15 21:30:53'),(8504,'2005-07-29 09:20:16',2295,561,'2005-08-07 04:27:16',2,'2006-02-15 21:30:53'),(8505,'2005-07-29 09:22:52',1454,346,'2005-08-06 05:23:52',1,'2006-02-15 21:30:53'),(8506,'2005-07-29 09:23:52',3714,506,'2005-07-31 04:42:52',1,'2006-02-15 21:30:53'),(8507,'2005-07-29 09:29:44',3273,524,'2005-08-07 05:48:44',2,'2006-02-15 21:30:53'),(8508,'2005-07-29 09:34:38',4173,484,'2005-08-01 14:52:38',2,'2006-02-15 21:30:53'),(8509,'2005-07-29 09:38:19',1332,80,'2005-08-04 11:45:19',1,'2006-02-15 21:30:53'),(8510,'2005-07-29 09:41:38',7,487,'2005-08-05 05:30:38',2,'2006-02-15 21:30:53'),(8511,'2005-07-29 09:42:42',3667,598,'2005-08-06 14:22:42',2,'2006-02-15 21:30:53'),(8512,'2005-07-29 09:48:03',4132,351,'2005-07-31 13:40:03',1,'2006-02-15 21:30:53'),(8513,'2005-07-29 09:52:59',3156,142,'2005-07-31 12:05:59',1,'2006-02-15 21:30:53'),(8514,'2005-07-29 09:53:33',3755,99,'2005-07-30 06:34:33',2,'2006-02-15 21:30:53'),(8515,'2005-07-29 09:55:20',1071,477,'2005-08-05 07:08:20',2,'2006-02-15 21:30:53'),(8516,'2005-07-29 10:00:03',981,337,'2005-08-02 09:34:03',1,'2006-02-15 21:30:53'),(8517,'2005-07-29 10:00:48',2064,274,'2005-08-06 14:37:48',2,'2006-02-15 21:30:53'),(8518,'2005-07-29 10:05:27',2311,385,'2005-08-02 05:39:27',1,'2006-02-15 21:30:53'),(8519,'2005-07-29 10:09:43',1163,588,'2005-08-03 08:14:43',2,'2006-02-15 21:30:53'),(8520,'2005-07-29 10:10:02',2440,103,'2005-08-02 05:25:02',2,'2006-02-15 21:30:53'),(8521,'2005-07-29 10:12:45',2608,402,'2005-08-07 04:37:45',2,'2006-02-15 21:30:53'),(8522,'2005-07-29 10:16:19',3636,363,'2005-08-06 14:58:19',1,'2006-02-15 21:30:53'),(8523,'2005-07-29 10:18:27',3614,558,'2005-08-04 09:31:27',1,'2006-02-15 21:30:53'),(8524,'2005-07-29 10:20:07',2110,124,'2005-08-03 04:30:07',1,'2006-02-15 21:30:53'),(8525,'2005-07-29 10:20:19',1322,111,'2005-07-30 05:49:19',2,'2006-02-15 21:30:53'),(8526,'2005-07-29 10:20:48',575,88,'2005-08-03 14:15:48',1,'2006-02-15 21:30:53'),(8527,'2005-07-29 10:21:00',709,168,'2005-08-05 16:05:00',2,'2006-02-15 21:30:53'),(8528,'2005-07-29 10:24:22',2107,428,'2005-08-07 10:34:22',1,'2006-02-15 21:30:53'),(8529,'2005-07-29 10:24:31',1055,501,'2005-08-01 16:06:31',1,'2006-02-15 21:30:53'),(8530,'2005-07-29 10:26:14',4528,233,'2005-07-31 10:24:14',1,'2006-02-15 21:30:53'),(8531,'2005-07-29 10:26:15',1631,427,'2005-08-06 09:28:15',1,'2006-02-15 21:30:53'),(8532,'2005-07-29 10:26:56',3045,546,'2005-08-02 13:23:56',2,'2006-02-15 21:30:53'),(8533,'2005-07-29 10:29:16',551,542,'2005-08-01 06:52:16',1,'2006-02-15 21:30:53'),(8534,'2005-07-29 10:30:13',4029,516,'2005-08-02 04:47:13',1,'2006-02-15 21:30:53'),(8535,'2005-07-29 10:32:33',4489,536,'2005-07-31 05:46:33',1,'2006-02-15 21:30:53'),(8536,'2005-07-29 10:37:23',4510,219,'2005-07-31 07:21:23',2,'2006-02-15 21:30:53'),(8537,'2005-07-29 10:44:54',1012,447,'2005-08-06 14:55:54',2,'2006-02-15 21:30:53'),(8538,'2005-07-29 10:45:17',3768,500,'2005-08-04 15:12:17',1,'2006-02-15 21:30:53'),(8539,'2005-07-29 10:48:24',599,325,'2005-07-30 06:29:24',2,'2006-02-15 21:30:53'),(8540,'2005-07-29 10:52:51',539,180,'2005-08-07 11:44:51',2,'2006-02-15 21:30:53'),(8541,'2005-07-29 10:55:01',976,340,'2005-07-31 10:53:01',1,'2006-02-15 21:30:53'),(8542,'2005-07-29 11:01:50',792,213,'2005-07-30 08:19:50',1,'2006-02-15 21:30:53'),(8543,'2005-07-29 11:01:57',403,346,'2005-08-03 06:03:57',1,'2006-02-15 21:30:53'),(8544,'2005-07-29 11:02:08',412,542,'2005-08-06 15:06:08',2,'2006-02-15 21:30:53'),(8545,'2005-07-29 11:07:04',3261,3,'2005-08-06 13:30:04',2,'2006-02-15 21:30:53'),(8546,'2005-07-29 11:08:48',3224,418,'2005-08-03 16:50:48',2,'2006-02-15 21:30:53'),(8547,'2005-07-29 11:10:15',875,438,'2005-08-03 12:50:15',1,'2006-02-15 21:30:53'),(8548,'2005-07-29 11:11:33',3366,14,'2005-08-04 11:52:33',2,'2006-02-15 21:30:53'),(8549,'2005-07-29 11:12:13',1866,206,'2005-08-06 06:04:13',2,'2006-02-15 21:30:53'),(8550,'2005-07-29 11:12:37',1340,70,'2005-07-30 15:05:37',2,'2006-02-15 21:30:53'),(8551,'2005-07-29 11:13:11',2083,340,'2005-08-05 05:17:11',2,'2006-02-15 21:30:53'),(8552,'2005-07-29 11:14:02',1987,490,'2005-08-05 14:13:02',2,'2006-02-15 21:30:53'),(8553,'2005-07-29 11:15:36',2645,49,'2005-08-07 16:37:36',1,'2006-02-15 21:30:53'),(8554,'2005-07-29 11:16:29',1563,582,'2005-07-31 06:38:29',2,'2006-02-15 21:30:53'),(8555,'2005-07-29 11:18:01',2784,18,'2005-07-30 10:47:01',2,'2006-02-15 21:30:53'),(8556,'2005-07-29 11:18:27',2793,231,'2005-07-30 05:21:27',2,'2006-02-15 21:30:53'),(8557,'2005-07-29 11:19:59',1481,459,'2005-08-07 12:50:59',1,'2006-02-15 21:30:53'),(8558,'2005-07-29 11:24:49',1160,169,'2005-07-31 15:03:49',1,'2006-02-15 21:30:53'),(8559,'2005-07-29 11:25:54',2078,279,'2005-08-04 10:16:54',2,'2006-02-15 21:30:53'),(8560,'2005-07-29 11:27:27',3499,430,'2005-08-01 12:05:27',2,'2006-02-15 21:30:53'),(8561,'2005-07-29 11:29:12',2207,344,'2005-08-05 09:17:12',1,'2006-02-15 21:30:53'),(8562,'2005-07-29 11:32:13',3595,255,'2005-07-30 08:23:13',2,'2006-02-15 21:30:53'),(8563,'2005-07-29 11:32:58',61,67,'2005-08-05 07:21:58',2,'2006-02-15 21:30:53'),(8564,'2005-07-29 11:33:00',2830,316,'2005-08-05 15:35:00',1,'2006-02-15 21:30:53'),(8565,'2005-07-29 11:35:23',3211,280,'2005-08-06 08:28:23',1,'2006-02-15 21:30:53'),(8566,'2005-07-29 11:35:46',2011,544,'2005-07-30 13:50:46',1,'2006-02-15 21:30:53'),(8567,'2005-07-29 11:37:30',1612,594,'2005-08-03 05:58:30',2,'2006-02-15 21:30:53'),(8568,'2005-07-29 11:38:22',1599,583,'2005-08-04 13:22:22',2,'2006-02-15 21:30:53'),(8569,'2005-07-29 11:39:17',276,348,'2005-07-31 07:50:17',2,'2006-02-15 21:30:53'),(8570,'2005-07-29 11:40:08',3094,131,'2005-08-06 10:23:08',1,'2006-02-15 21:30:53'),(8571,'2005-07-29 11:48:39',1778,407,'2005-08-03 06:35:39',2,'2006-02-15 21:30:53'),(8572,'2005-07-29 11:51:24',2815,267,'2005-08-02 11:44:24',1,'2006-02-15 21:30:53'),(8573,'2005-07-29 11:51:25',1637,179,'2005-08-07 08:53:25',1,'2006-02-15 21:30:53'),(8574,'2005-07-29 11:51:53',2949,71,'2005-08-03 05:59:53',2,'2006-02-15 21:30:53'),(8575,'2005-07-29 11:52:47',1668,441,'2005-08-03 08:14:47',2,'2006-02-15 21:30:53'),(8576,'2005-07-29 11:55:01',3552,157,'2005-08-03 08:41:01',2,'2006-02-15 21:30:53'),(8577,'2005-07-29 11:56:30',520,328,'2005-08-07 15:41:30',1,'2006-02-15 21:30:53'),(8578,'2005-07-29 11:58:14',3737,148,'2005-08-03 06:25:14',1,'2006-02-15 21:30:53'),(8579,'2005-07-29 11:59:22',4045,250,'2005-07-30 11:41:22',2,'2006-02-15 21:30:53'),(8580,'2005-07-29 12:00:27',4040,543,'2005-08-04 16:39:27',1,'2006-02-15 21:30:53'),(8581,'2005-07-29 12:02:06',2102,254,'2005-08-02 10:32:06',2,'2006-02-15 21:30:53'),(8582,'2005-07-29 12:03:27',841,162,'2005-08-03 07:02:27',1,'2006-02-15 21:30:53'),(8583,'2005-07-29 12:04:50',3130,191,'2005-08-04 17:21:50',1,'2006-02-15 21:30:53'),(8584,'2005-07-29 12:07:53',1656,482,'2005-07-31 09:27:53',1,'2006-02-15 21:30:53'),(8585,'2005-07-29 12:14:18',512,516,'2005-08-03 08:31:18',2,'2006-02-15 21:30:53'),(8586,'2005-07-29 12:16:34',2752,374,'2005-08-07 06:48:34',1,'2006-02-15 21:30:53'),(8587,'2005-07-29 12:18:40',1941,108,'2005-08-03 14:01:40',1,'2006-02-15 21:30:53'),(8588,'2005-07-29 12:22:20',2858,416,'2005-07-31 10:49:20',1,'2006-02-15 21:30:53'),(8589,'2005-07-29 12:28:17',1628,293,'2005-08-05 11:40:17',1,'2006-02-15 21:30:53'),(8590,'2005-07-29 12:32:20',2505,114,'2005-08-07 08:00:20',1,'2006-02-15 21:30:53'),(8591,'2005-07-29 12:32:33',2568,418,'2005-08-01 16:19:33',2,'2006-02-15 21:30:53'),(8592,'2005-07-29 12:33:58',1952,271,'2005-08-04 07:14:58',2,'2006-02-15 21:30:53'),(8593,'2005-07-29 12:38:14',2601,181,'2005-08-07 07:04:14',1,'2006-02-15 21:30:53'),(8594,'2005-07-29 12:42:13',4155,115,'2005-08-02 07:38:13',1,'2006-02-15 21:30:53'),(8595,'2005-07-29 12:47:43',3225,423,'2005-08-07 13:51:43',2,'2006-02-15 21:30:53'),(8596,'2005-07-29 12:48:54',59,233,'2005-08-04 07:19:54',2,'2006-02-15 21:30:53'),(8597,'2005-07-29 12:55:55',4218,222,'2005-08-05 18:54:55',1,'2006-02-15 21:30:53'),(8598,'2005-07-29 12:56:59',626,2,'2005-08-01 08:39:59',2,'2006-02-15 21:30:53'),(8599,'2005-07-29 12:58:52',1169,545,'2005-08-03 08:19:52',1,'2006-02-15 21:30:53'),(8600,'2005-07-29 13:01:19',1488,226,'2005-07-31 15:40:19',2,'2006-02-15 21:30:53'),(8601,'2005-07-29 13:03:31',3247,181,'2005-08-06 16:32:31',1,'2006-02-15 21:30:53'),(8602,'2005-07-29 13:04:27',4002,64,'2005-08-03 12:21:27',2,'2006-02-15 21:30:53'),(8603,'2005-07-29 13:07:07',3007,594,'2005-08-04 18:32:07',2,'2006-02-15 21:30:53'),(8604,'2005-07-29 13:07:13',3909,326,'2005-07-31 18:00:13',2,'2006-02-15 21:30:53'),(8605,'2005-07-29 13:13:34',3805,224,'2005-08-07 08:29:34',1,'2006-02-15 21:30:53'),(8606,'2005-07-29 13:14:24',4051,340,'2005-07-30 14:52:24',1,'2006-02-15 21:30:53'),(8607,'2005-07-29 13:18:00',4290,336,'2005-07-30 18:51:00',2,'2006-02-15 21:30:53'),(8608,'2005-07-29 13:18:52',2976,165,'2005-07-30 19:01:52',2,'2006-02-15 21:30:53'),(8609,'2005-07-29 13:19:25',3997,354,'2005-08-06 08:33:25',2,'2006-02-15 21:30:53'),(8610,'2005-07-29 13:25:02',4222,563,'2005-08-03 08:10:02',2,'2006-02-15 21:30:53'),(8611,'2005-07-29 13:26:21',610,373,'2005-08-07 18:20:21',2,'2006-02-15 21:30:53'),(8612,'2005-07-29 13:28:20',3518,392,'2005-08-06 14:39:20',2,'2006-02-15 21:30:53'),(8613,'2005-07-29 13:30:58',394,411,'2005-08-05 16:21:58',2,'2006-02-15 21:30:53'),(8614,'2005-07-29 13:32:05',604,552,'2005-08-04 15:26:05',1,'2006-02-15 21:30:53'),(8615,'2005-07-29 13:36:01',4453,15,'2005-08-03 13:15:01',1,'2006-02-15 21:30:53'),(8616,'2005-07-29 13:39:09',2583,493,'2005-08-01 16:49:09',1,'2006-02-15 21:30:53'),(8617,'2005-07-29 13:46:14',385,441,'2005-08-06 13:26:14',2,'2006-02-15 21:30:53'),(8618,'2005-07-29 13:48:20',985,270,'2005-08-06 14:12:20',2,'2006-02-15 21:30:53'),(8619,'2005-07-29 13:50:08',2169,50,'2005-08-06 13:15:08',1,'2006-02-15 21:30:53'),(8620,'2005-07-29 13:51:20',3718,306,'2005-08-02 13:05:20',1,'2006-02-15 21:30:53'),(8621,'2005-07-29 13:52:42',2473,358,'2005-07-30 11:42:42',2,'2006-02-15 21:30:53'),(8622,'2005-07-29 13:53:28',4076,98,'2005-07-31 16:12:28',2,'2006-02-15 21:30:53'),(8623,'2005-07-29 13:55:11',458,142,'2005-08-05 11:16:11',1,'2006-02-15 21:30:53'),(8624,'2005-07-29 13:55:36',4402,439,'2005-08-02 12:23:36',2,'2006-02-15 21:30:53'),(8625,'2005-07-29 13:59:13',884,410,'2005-08-07 17:56:13',2,'2006-02-15 21:30:53'),(8626,'2005-07-29 14:03:20',3092,148,'2005-08-02 09:05:20',1,'2006-02-15 21:30:53'),(8627,'2005-07-29 14:05:12',4235,226,'2005-08-05 16:53:12',2,'2006-02-15 21:30:53'),(8628,'2005-07-29 14:06:24',4484,550,'2005-08-06 10:42:24',2,'2006-02-15 21:30:53'),(8629,'2005-07-29 14:06:35',853,567,'2005-08-03 16:59:35',2,'2006-02-15 21:30:53'),(8630,'2005-07-29 14:07:59',1378,406,'2005-08-03 13:18:59',2,'2006-02-15 21:30:53'),(8631,'2005-07-29 14:08:06',98,559,'2005-08-05 14:57:06',1,'2006-02-15 21:30:53'),(8632,'2005-07-29 14:11:25',1666,563,'2005-08-07 15:32:25',1,'2006-02-15 21:30:53'),(8633,'2005-07-29 14:19:53',3436,534,'2005-08-01 11:31:53',2,'2006-02-15 21:30:53'),(8634,'2005-07-29 14:19:57',2023,335,'2005-08-07 13:44:57',1,'2006-02-15 21:30:53'),(8635,'2005-07-29 14:22:48',2894,383,'2005-08-01 11:59:48',2,'2006-02-15 21:30:53'),(8636,'2005-07-29 14:24:13',4308,252,'2005-08-02 14:39:13',1,'2006-02-15 21:30:53'),(8637,'2005-07-29 14:30:11',1069,310,'2005-08-04 14:00:11',1,'2006-02-15 21:30:53'),(8638,'2005-07-29 14:30:23',4060,571,'2005-08-01 10:32:23',1,'2006-02-15 21:30:53'),(8639,'2005-07-29 14:30:31',3504,290,'2005-08-02 16:04:31',1,'2006-02-15 21:30:53'),(8640,'2005-07-29 14:34:17',1874,257,'2005-08-01 13:09:17',2,'2006-02-15 21:30:53'),(8641,'2005-07-29 14:37:30',3199,30,'2005-08-02 19:32:30',2,'2006-02-15 21:30:53'),(8642,'2005-07-29 14:38:17',3947,522,'2005-08-03 14:41:17',1,'2006-02-15 21:30:53'),(8643,'2005-07-29 14:45:23',381,59,'2005-08-04 18:42:23',1,'2006-02-15 21:30:53'),(8644,'2005-07-29 14:45:45',4507,314,'2005-08-03 20:10:45',2,'2006-02-15 21:30:53'),(8645,'2005-07-29 14:47:45',2532,535,'2005-07-30 14:56:45',2,'2006-02-15 21:30:53'),(8646,'2005-07-29 14:48:48',89,302,'2005-08-03 18:11:48',2,'2006-02-15 21:30:53'),(8647,'2005-07-29 14:52:59',556,307,'2005-08-06 11:09:59',2,'2006-02-15 21:30:53'),(8648,'2005-07-29 14:56:21',160,416,'2005-07-31 16:56:21',2,'2006-02-15 21:30:53'),(8649,'2005-07-29 14:57:33',789,69,'2005-08-07 09:43:33',2,'2006-02-15 21:30:53'),(8650,'2005-07-29 14:59:04',1272,134,'2005-08-04 13:13:04',2,'2006-02-15 21:30:53'),(8651,'2005-07-29 15:02:18',2095,61,'2005-08-07 09:34:18',2,'2006-02-15 21:30:53'),(8652,'2005-07-29 15:02:54',2729,219,'2005-08-07 17:21:54',2,'2006-02-15 21:30:53'),(8653,'2005-07-29 15:04:23',4440,230,'2005-08-02 09:39:23',2,'2006-02-15 21:30:53'),(8654,'2005-07-29 15:04:27',3925,84,'2005-08-07 18:37:27',1,'2006-02-15 21:30:53'),(8655,'2005-07-29 15:04:42',3986,232,'2005-08-04 11:26:42',1,'2006-02-15 21:30:53'),(8656,'2005-07-29 15:05:52',1385,460,'2005-07-31 20:57:52',2,'2006-02-15 21:30:53'),(8657,'2005-07-29 15:09:25',3194,236,'2005-07-31 19:10:25',1,'2006-02-15 21:30:53'),(8658,'2005-07-29 15:16:37',2033,427,'2005-08-07 20:45:37',2,'2006-02-15 21:30:53'),(8659,'2005-07-29 15:26:31',558,168,'2005-08-06 19:05:31',2,'2006-02-15 21:30:53'),(8660,'2005-07-29 15:26:59',3122,566,'2005-08-05 21:04:59',2,'2006-02-15 21:30:53'),(8661,'2005-07-29 15:28:24',3409,341,'2005-08-05 20:04:24',2,'2006-02-15 21:30:53'),(8662,'2005-07-29 15:31:33',3758,362,'2005-07-30 09:39:33',2,'2006-02-15 21:30:53'),(8663,'2005-07-29 15:33:18',1281,214,'2005-07-30 18:03:18',1,'2006-02-15 21:30:53'),(8664,'2005-07-29 15:36:27',198,102,'2005-08-04 20:11:27',1,'2006-02-15 21:30:53'),(8665,'2005-07-29 15:39:29',1113,265,'2005-08-01 10:33:29',2,'2006-02-15 21:30:53'),(8666,'2005-07-29 15:39:38',3669,591,'2005-08-06 17:12:38',1,'2006-02-15 21:30:53'),(8667,'2005-07-29 15:40:57',3439,25,'2005-07-31 20:59:57',1,'2006-02-15 21:30:53'),(8668,'2005-07-29 15:41:31',4531,71,'2005-08-01 16:20:31',2,'2006-02-15 21:30:53'),(8669,'2005-07-29 15:44:55',1667,401,'2005-08-01 14:09:55',2,'2006-02-15 21:30:53'),(8670,'2005-07-29 15:49:03',2354,446,'2005-08-01 20:19:03',2,'2006-02-15 21:30:53'),(8671,'2005-07-29 15:49:37',1431,577,'2005-08-05 18:20:37',1,'2006-02-15 21:30:53'),(8672,'2005-07-29 15:49:48',405,495,'2005-08-06 17:59:48',2,'2006-02-15 21:30:53'),(8673,'2005-07-29 15:50:14',2167,29,'2005-08-03 18:30:14',1,'2006-02-15 21:30:53'),(8674,'2005-07-29 15:54:22',1744,412,'2005-07-31 12:15:22',1,'2006-02-15 21:30:53'),(8675,'2005-07-29 15:56:18',1026,258,'2005-07-30 18:50:18',1,'2006-02-15 21:30:53'),(8676,'2005-07-29 15:59:06',283,533,'2005-08-05 19:12:06',2,'2006-02-15 21:30:53'),(8677,'2005-07-29 16:01:13',513,315,'2005-08-07 19:21:13',2,'2006-02-15 21:30:53'),(8678,'2005-07-29 16:04:00',3991,210,'2005-08-05 12:37:00',1,'2006-02-15 21:30:53'),(8679,'2005-07-29 16:07:47',3549,536,'2005-08-02 18:37:47',1,'2006-02-15 21:30:53'),(8680,'2005-07-29 16:08:03',1227,330,'2005-07-31 17:26:03',1,'2006-02-15 21:30:53'),(8681,'2005-07-29 16:12:01',4004,309,'2005-08-01 18:14:01',2,'2006-02-15 21:30:53'),(8682,'2005-07-29 16:15:26',4328,348,'2005-08-03 20:15:26',2,'2006-02-15 21:30:53'),(8683,'2005-07-29 16:15:43',3915,513,'2005-08-07 19:19:43',1,'2006-02-15 21:30:53'),(8684,'2005-07-29 16:16:33',2457,185,'2005-08-07 12:27:33',2,'2006-02-15 21:30:53'),(8685,'2005-07-29 16:17:05',1827,321,'2005-08-07 17:44:05',1,'2006-02-15 21:30:53'),(8686,'2005-07-29 16:17:49',4160,52,'2005-08-01 12:50:49',2,'2006-02-15 21:30:53'),(8687,'2005-07-29 16:19:17',222,117,'2005-08-01 15:28:17',1,'2006-02-15 21:30:53'),(8688,'2005-07-29 16:31:32',2263,381,'2005-07-30 12:39:32',1,'2006-02-15 21:30:53'),(8689,'2005-07-29 16:38:58',824,487,'2005-08-01 17:09:58',2,'2006-02-15 21:30:53'),(8690,'2005-07-29 16:39:28',1292,291,'2005-08-01 14:03:28',2,'2006-02-15 21:30:53'),(8691,'2005-07-29 16:41:23',672,446,'2005-08-02 12:32:23',2,'2006-02-15 21:30:53'),(8692,'2005-07-29 16:43:39',3192,88,'2005-08-01 15:54:39',2,'2006-02-15 21:30:53'),(8693,'2005-07-29 16:44:13',917,51,'2005-08-01 15:56:13',1,'2006-02-15 21:30:53'),(8694,'2005-07-29 16:44:48',503,345,'2005-08-06 16:28:48',1,'2006-02-15 21:30:53'),(8695,'2005-07-29 16:44:55',694,280,'2005-08-07 12:47:55',1,'2006-02-15 21:30:53'),(8696,'2005-07-29 16:45:18',2553,178,'2005-08-07 18:51:18',1,'2006-02-15 21:30:53'),(8697,'2005-07-29 16:46:07',443,291,'2005-08-02 19:27:07',2,'2006-02-15 21:30:53'),(8698,'2005-07-29 16:52:17',2973,324,'2005-08-04 13:20:17',2,'2006-02-15 21:30:53'),(8699,'2005-07-29 16:53:00',4080,123,'2005-08-07 20:31:00',1,'2006-02-15 21:30:53'),(8700,'2005-07-29 16:56:01',3710,196,'2005-07-31 16:19:01',2,'2006-02-15 21:30:53'),(8701,'2005-07-29 17:02:35',3158,245,'2005-08-07 19:55:35',2,'2006-02-15 21:30:53'),(8702,'2005-07-29 17:04:37',2215,306,'2005-08-05 15:30:37',2,'2006-02-15 21:30:53'),(8703,'2005-07-29 17:12:44',1065,439,'2005-07-30 19:38:44',1,'2006-02-15 21:30:53'),(8704,'2005-07-29 17:13:45',2117,107,'2005-08-03 20:03:45',2,'2006-02-15 21:30:53'),(8705,'2005-07-29 17:14:29',4038,2,'2005-08-02 16:01:29',1,'2006-02-15 21:30:53'),(8706,'2005-07-29 17:19:15',2886,515,'2005-08-03 22:52:15',1,'2006-02-15 21:30:53'),(8707,'2005-07-29 17:21:58',2525,157,'2005-08-02 14:47:58',2,'2006-02-15 21:30:53'),(8708,'2005-07-29 17:24:13',4054,529,'2005-08-04 13:57:13',1,'2006-02-15 21:30:53'),(8709,'2005-07-29 17:25:54',902,199,'2005-08-02 22:35:54',1,'2006-02-15 21:30:53'),(8710,'2005-07-29 17:26:03',3391,566,'2005-07-30 19:51:03',1,'2006-02-15 21:30:53'),(8711,'2005-07-29 17:27:15',3471,575,'2005-07-31 12:57:15',1,'2006-02-15 21:30:53'),(8712,'2005-07-29 17:30:06',2800,41,'2005-08-03 22:55:06',2,'2006-02-15 21:30:53'),(8713,'2005-07-29 17:31:19',473,433,'2005-08-02 16:37:19',2,'2006-02-15 21:30:53'),(8714,'2005-07-29 17:31:40',4547,362,'2005-08-04 16:12:40',2,'2006-02-15 21:30:53'),(8715,'2005-07-29 17:33:45',860,11,'2005-08-01 17:30:45',1,'2006-02-15 21:30:53'),(8716,'2005-07-29 17:39:09',2123,48,'2005-08-03 20:26:09',2,'2006-02-15 21:30:53'),(8717,'2005-07-29 17:40:45',1821,260,'2005-08-01 22:38:45',2,'2006-02-15 21:30:53'),(8718,'2005-07-29 17:41:14',137,23,'2005-08-01 18:22:14',2,'2006-02-15 21:30:53'),(8719,'2005-07-29 17:45:45',995,333,'2005-08-01 13:53:45',1,'2006-02-15 21:30:53'),(8720,'2005-07-29 17:48:32',152,180,'2005-08-04 14:30:32',2,'2006-02-15 21:30:53'),(8721,'2005-07-29 17:56:21',2416,312,'2005-08-02 21:30:21',2,'2006-02-15 21:30:53'),(8722,'2005-07-29 17:58:58',1389,401,'2005-08-07 23:40:58',1,'2006-02-15 21:30:53'),(8723,'2005-07-29 18:03:47',224,39,'2005-08-06 18:53:47',1,'2006-02-15 21:30:53'),(8724,'2005-07-29 18:05:21',898,372,'2005-08-01 15:41:21',1,'2006-02-15 21:30:53'),(8725,'2005-07-29 18:08:42',2385,421,'2005-08-04 16:01:42',2,'2006-02-15 21:30:53'),(8726,'2005-07-29 18:09:22',897,409,'2005-08-06 16:24:22',1,'2006-02-15 21:30:53'),(8727,'2005-07-29 18:09:57',3031,528,'2005-08-03 13:41:57',2,'2006-02-15 21:30:53'),(8728,'2005-07-29 18:12:49',973,341,'2005-08-06 22:45:49',1,'2006-02-15 21:30:53'),(8729,'2005-07-29 18:23:02',3342,83,'2005-07-31 16:09:02',2,'2006-02-15 21:30:53'),(8730,'2005-07-29 18:23:34',4191,592,'2005-08-01 19:56:34',1,'2006-02-15 21:30:53'),(8731,'2005-07-29 18:23:57',2638,179,'2005-08-05 19:38:57',1,'2006-02-15 21:30:53'),(8732,'2005-07-29 18:25:03',1143,346,'2005-08-07 18:56:03',2,'2006-02-15 21:30:53'),(8733,'2005-07-29 18:26:34',3187,450,'2005-08-03 15:06:34',1,'2006-02-15 21:30:53'),(8734,'2005-07-29 18:28:15',2374,303,'2005-08-05 23:38:15',1,'2006-02-15 21:30:53'),(8735,'2005-07-29 18:28:54',2881,570,'2005-08-03 12:43:54',2,'2006-02-15 21:30:53'),(8736,'2005-07-29 18:31:15',1726,530,'2005-07-30 16:24:15',2,'2006-02-15 21:30:53'),(8737,'2005-07-29 18:32:13',4154,298,'2005-08-05 21:07:13',2,'2006-02-15 21:30:53'),(8738,'2005-07-29 18:32:47',3893,210,'2005-08-02 13:05:47',2,'2006-02-15 21:30:53'),(8739,'2005-07-29 18:34:33',4310,326,'2005-08-02 16:05:33',1,'2006-02-15 21:30:53'),(8740,'2005-07-29 18:41:31',3781,378,'2005-08-01 18:38:31',1,'2006-02-15 21:30:53'),(8741,'2005-07-29 18:44:57',165,4,'2005-08-03 18:25:57',2,'2006-02-15 21:30:53'),(8742,'2005-07-29 18:56:12',918,208,'2005-08-03 16:42:12',1,'2006-02-15 21:30:53'),(8743,'2005-07-29 18:57:01',2664,282,'2005-07-31 22:09:01',2,'2006-02-15 21:30:53'),(8744,'2005-07-29 18:58:24',1086,280,'2005-08-05 17:56:24',1,'2006-02-15 21:30:53'),(8745,'2005-07-29 19:03:05',1766,293,'2005-08-06 14:06:05',2,'2006-02-15 21:30:53'),(8746,'2005-07-29 19:03:15',2179,275,'2005-07-30 17:06:15',1,'2006-02-15 21:30:53'),(8747,'2005-07-29 19:07:57',2584,70,'2005-07-30 16:01:57',1,'2006-02-15 21:30:53'),(8748,'2005-07-29 19:08:37',2184,237,'2005-08-01 16:24:37',1,'2006-02-15 21:30:53'),(8749,'2005-07-29 19:13:15',2252,456,'2005-08-01 15:02:15',1,'2006-02-15 21:30:53'),(8750,'2005-07-29 19:14:21',3157,158,'2005-07-31 17:22:21',2,'2006-02-15 21:30:53'),(8751,'2005-07-29 19:14:39',3467,386,'2005-07-31 23:11:39',1,'2006-02-15 21:30:53'),(8752,'2005-07-29 19:15:07',4202,253,'2005-07-31 13:27:07',1,'2006-02-15 21:30:53'),(8753,'2005-07-29 19:15:50',1345,560,'2005-07-31 19:13:50',2,'2006-02-15 21:30:53'),(8754,'2005-07-29 19:18:30',1678,174,'2005-08-05 18:39:30',2,'2006-02-15 21:30:53'),(8755,'2005-07-29 19:18:31',1498,372,'2005-07-31 19:20:31',2,'2006-02-15 21:30:53'),(8756,'2005-07-29 19:18:57',4146,120,'2005-08-02 20:07:57',2,'2006-02-15 21:30:53'),(8757,'2005-07-29 19:19:10',3473,462,'2005-08-02 13:47:10',2,'2006-02-15 21:30:53'),(8758,'2005-07-29 19:20:49',2816,442,'2005-08-05 21:57:49',2,'2006-02-15 21:30:53'),(8759,'2005-07-29 19:22:37',844,209,'2005-08-07 15:36:37',2,'2006-02-15 21:30:53'),(8760,'2005-07-29 19:22:40',3566,118,'2005-08-05 01:09:40',2,'2006-02-15 21:30:53'),(8761,'2005-07-29 19:26:47',1317,539,'2005-08-08 00:09:47',1,'2006-02-15 21:30:53'),(8762,'2005-07-29 19:30:02',2765,463,'2005-08-04 18:38:02',1,'2006-02-15 21:30:53'),(8763,'2005-07-29 19:38:24',374,510,'2005-08-04 16:51:24',1,'2006-02-15 21:30:53'),(8764,'2005-07-29 19:39:04',2348,303,'2005-08-01 13:52:04',1,'2006-02-15 21:30:53'),(8765,'2005-07-29 19:40:08',2631,538,'2005-07-31 14:24:08',2,'2006-02-15 21:30:53'),(8766,'2005-07-29 19:41:04',3888,338,'2005-08-02 00:41:04',2,'2006-02-15 21:30:53'),(8767,'2005-07-29 19:42:33',962,467,'2005-08-01 20:52:33',2,'2006-02-15 21:30:53'),(8768,'2005-07-29 19:43:02',1601,468,'2005-08-03 23:36:02',1,'2006-02-15 21:30:53'),(8769,'2005-07-29 19:45:33',2180,588,'2005-08-05 22:09:33',2,'2006-02-15 21:30:53'),(8770,'2005-07-29 19:53:50',4025,499,'2005-08-05 14:22:50',1,'2006-02-15 21:30:53'),(8771,'2005-07-29 19:54:41',3533,347,'2005-08-03 20:38:41',1,'2006-02-15 21:30:53'),(8772,'2005-07-29 19:55:25',3526,122,'2005-08-05 18:48:25',1,'2006-02-15 21:30:53'),(8773,'2005-07-29 19:55:34',131,592,'2005-07-30 14:11:34',1,'2006-02-15 21:30:53'),(8774,'2005-07-29 20:05:04',315,161,'2005-07-31 14:32:04',1,'2006-02-15 21:30:53'),(8775,'2005-07-29 20:05:38',1358,44,'2005-07-30 21:13:38',1,'2006-02-15 21:30:53'),(8776,'2005-07-29 20:07:06',1565,587,'2005-08-06 20:42:06',2,'2006-02-15 21:30:53'),(8777,'2005-07-29 20:10:21',2462,382,'2005-07-30 20:32:21',2,'2006-02-15 21:30:53'),(8778,'2005-07-29 20:14:25',3654,582,'2005-08-04 00:50:25',1,'2006-02-15 21:30:53'),(8779,'2005-07-29 20:15:00',3245,202,'2005-08-03 21:17:00',1,'2006-02-15 21:30:53'),(8780,'2005-07-29 20:19:45',1095,328,'2005-08-03 22:22:45',2,'2006-02-15 21:30:53'),(8781,'2005-07-29 20:20:16',3746,235,'2005-07-30 16:19:16',2,'2006-02-15 21:30:53'),(8782,'2005-07-29 20:29:34',4379,365,'2005-08-04 02:19:34',1,'2006-02-15 21:30:53'),(8783,'2005-07-29 20:31:28',2316,71,'2005-08-02 19:33:28',2,'2006-02-15 21:30:53'),(8784,'2005-07-29 20:35:37',2308,580,'2005-07-30 17:22:37',1,'2006-02-15 21:30:53'),(8785,'2005-07-29 20:36:26',216,42,'2005-07-30 15:06:26',1,'2006-02-15 21:30:53'),(8786,'2005-07-29 20:39:49',2404,533,'2005-08-03 18:08:49',1,'2006-02-15 21:30:53'),(8787,'2005-07-29 20:43:49',2366,222,'2005-07-31 15:15:49',1,'2006-02-15 21:30:53'),(8788,'2005-07-29 20:46:44',3412,121,'2005-08-03 02:25:44',2,'2006-02-15 21:30:53'),(8789,'2005-07-29 20:47:27',3062,71,'2005-08-05 18:36:27',1,'2006-02-15 21:30:53'),(8790,'2005-07-29 20:51:41',751,323,'2005-07-30 17:30:41',2,'2006-02-15 21:30:53'),(8791,'2005-07-29 20:53:23',1677,469,'2005-07-31 18:14:23',1,'2006-02-15 21:30:53'),(8792,'2005-07-29 20:56:14',3764,203,'2005-08-07 16:44:14',2,'2006-02-15 21:30:53'),(8793,'2005-07-29 20:57:22',1819,167,'2005-08-02 01:40:22',2,'2006-02-15 21:30:53'),(8794,'2005-07-29 20:59:38',3509,320,'2005-07-31 00:15:38',2,'2006-02-15 21:30:53'),(8795,'2005-07-29 21:04:14',1896,302,'2005-07-31 02:58:14',2,'2006-02-15 21:30:53'),(8796,'2005-07-29 21:09:11',2234,74,'2005-08-04 22:55:11',1,'2006-02-15 21:30:53'),(8797,'2005-07-29 21:10:37',2929,566,'2005-08-07 21:43:37',1,'2006-02-15 21:30:53'),(8798,'2005-07-29 21:15:38',800,513,'2005-08-05 02:46:38',2,'2006-02-15 21:30:53'),(8799,'2005-07-29 21:16:47',326,237,'2005-08-07 22:09:47',2,'2006-02-15 21:30:53'),(8800,'2005-07-29 21:18:59',2082,207,'2005-08-06 19:59:59',2,'2006-02-15 21:30:53'),(8801,'2005-07-29 21:25:22',1111,590,'2005-08-01 00:02:22',1,'2006-02-15 21:30:53'),(8802,'2005-07-29 21:25:51',296,407,'2005-07-30 18:15:51',2,'2006-02-15 21:30:53'),(8803,'2005-07-29 21:26:24',2814,86,'2005-08-06 18:05:24',2,'2006-02-15 21:30:53'),(8804,'2005-07-29 21:28:19',4461,363,'2005-08-01 20:15:19',2,'2006-02-15 21:30:53'),(8805,'2005-07-29 21:29:58',4041,39,'2005-08-04 23:12:58',1,'2006-02-15 21:30:53'),(8806,'2005-07-29 21:36:34',4085,454,'2005-08-02 00:58:34',1,'2006-02-15 21:30:53'),(8807,'2005-07-29 21:36:59',2612,396,'2005-08-01 17:40:59',1,'2006-02-15 21:30:53'),(8808,'2005-07-29 21:39:07',593,173,'2005-08-03 02:09:07',2,'2006-02-15 21:30:53'),(8809,'2005-07-29 21:42:49',3278,8,'2005-08-04 01:13:49',1,'2006-02-15 21:30:53'),(8810,'2005-07-29 21:45:19',1233,431,'2005-08-08 01:45:19',2,'2006-02-15 21:30:53'),(8811,'2005-07-29 21:46:21',2041,245,'2005-08-07 16:51:21',2,'2006-02-15 21:30:53'),(8812,'2005-07-29 21:47:40',1172,563,'2005-08-04 01:18:40',2,'2006-02-15 21:30:53'),(8813,'2005-07-29 21:47:55',3442,497,'2005-08-05 01:16:55',1,'2006-02-15 21:30:53'),(8814,'2005-07-29 21:49:43',1492,487,'2005-08-01 19:56:43',1,'2006-02-15 21:30:53'),(8815,'2005-07-29 21:51:26',3469,230,'2005-08-03 22:37:26',1,'2006-02-15 21:30:53'),(8816,'2005-07-29 21:53:00',3984,209,'2005-08-01 21:20:00',1,'2006-02-15 21:30:53'),(8817,'2005-07-29 22:09:08',2716,175,'2005-08-01 19:07:08',1,'2006-02-15 21:30:53'),(8818,'2005-07-29 22:14:04',3090,98,'2005-08-07 17:26:04',1,'2006-02-15 21:30:53'),(8819,'2005-07-29 22:14:26',3100,591,'2005-08-06 23:02:26',2,'2006-02-15 21:30:53'),(8820,'2005-07-29 22:14:56',481,594,'2005-08-05 23:36:56',2,'2006-02-15 21:30:53'),(8821,'2005-07-29 22:18:12',52,477,'2005-08-05 22:00:12',1,'2006-02-15 21:30:53'),(8822,'2005-07-29 22:20:21',744,35,'2005-08-06 03:00:21',2,'2006-02-15 21:30:53'),(8823,'2005-07-29 22:22:12',951,75,'2005-08-07 21:03:12',1,'2006-02-15 21:30:53'),(8824,'2005-07-29 22:22:58',3506,164,'2005-07-31 21:02:58',2,'2006-02-15 21:30:53'),(8825,'2005-07-29 22:24:16',881,101,'2005-08-05 00:27:16',2,'2006-02-15 21:30:53'),(8826,'2005-07-29 22:30:16',1800,369,'2005-07-30 19:43:16',1,'2006-02-15 21:30:53'),(8827,'2005-07-29 22:31:24',1517,157,'2005-08-06 21:05:24',2,'2006-02-15 21:30:53'),(8828,'2005-07-29 22:32:54',1608,547,'2005-07-30 20:41:54',1,'2006-02-15 21:30:53'),(8829,'2005-07-29 22:33:34',1466,173,'2005-08-05 20:23:34',2,'2006-02-15 21:30:53'),(8830,'2005-07-29 22:34:35',1751,202,'2005-08-05 20:12:35',2,'2006-02-15 21:30:53'),(8831,'2005-07-29 22:37:41',3520,13,'2005-08-08 04:28:41',1,'2006-02-15 21:30:53'),(8832,'2005-07-29 22:37:49',380,125,'2005-08-04 23:32:49',1,'2006-02-15 21:30:53'),(8833,'2005-07-29 22:39:36',1741,101,'2005-08-05 21:19:36',1,'2006-02-15 21:30:53'),(8834,'2005-07-29 22:41:48',4477,243,'2005-08-05 03:21:48',2,'2006-02-15 21:30:53'),(8835,'2005-07-29 22:44:35',2653,237,'2005-08-05 23:28:35',1,'2006-02-15 21:30:53'),(8836,'2005-07-29 22:46:08',3265,14,'2005-08-02 19:53:08',2,'2006-02-15 21:30:53'),(8837,'2005-07-29 22:49:00',42,372,'2005-08-07 21:56:00',2,'2006-02-15 21:30:53'),(8838,'2005-07-29 22:52:23',133,550,'2005-08-03 22:49:23',1,'2006-02-15 21:30:53'),(8839,'2005-07-29 22:52:34',3440,580,'2005-08-05 03:24:34',2,'2006-02-15 21:30:53'),(8840,'2005-07-29 22:55:38',1484,295,'2005-08-06 02:11:38',1,'2006-02-15 21:30:53'),(8841,'2005-07-29 22:56:07',3935,363,'2005-08-01 21:21:07',2,'2006-02-15 21:30:53'),(8842,'2005-07-29 23:03:40',4203,292,'2005-08-06 23:23:40',2,'2006-02-15 21:30:53'),(8843,'2005-07-29 23:04:25',406,294,'2005-08-05 22:12:25',1,'2006-02-15 21:30:53'),(8844,'2005-07-29 23:05:08',327,244,'2005-08-06 00:24:08',2,'2006-02-15 21:30:53'),(8845,'2005-07-29 23:06:13',3036,543,'2005-08-02 20:16:13',1,'2006-02-15 21:30:53'),(8846,'2005-07-29 23:10:28',2912,108,'2005-08-03 22:07:28',2,'2006-02-15 21:30:53'),(8847,'2005-07-29 23:13:41',4133,480,'2005-07-31 23:55:41',1,'2006-02-15 21:30:53'),(8848,'2005-07-29 23:20:58',2972,545,'2005-08-03 17:28:58',2,'2006-02-15 21:30:53'),(8849,'2005-07-29 23:21:01',4300,79,'2005-08-03 20:01:01',1,'2006-02-15 21:30:53'),(8850,'2005-07-29 23:24:20',355,86,'2005-07-31 00:43:20',2,'2006-02-15 21:30:53'),(8851,'2005-07-29 23:26:19',212,445,'2005-08-05 03:59:19',2,'2006-02-15 21:30:53'),(8852,'2005-07-29 23:30:03',1138,42,'2005-08-05 05:22:03',2,'2006-02-15 21:30:53'),(8853,'2005-07-29 23:34:21',2323,58,'2005-07-31 21:20:21',2,'2006-02-15 21:30:53'),(8854,'2005-07-29 23:40:07',1365,527,'2005-08-01 00:35:07',2,'2006-02-15 21:30:53'),(8855,'2005-07-29 23:40:10',4388,335,'2005-08-02 18:07:10',2,'2006-02-15 21:30:53'),(8856,'2005-07-29 23:42:00',2942,365,'2005-08-07 03:00:00',1,'2006-02-15 21:30:53'),(8857,'2005-07-29 23:44:22',1348,477,'2005-07-31 21:32:22',2,'2006-02-15 21:30:53'),(8858,'2005-07-29 23:44:35',2378,558,'2005-08-01 05:25:35',2,'2006-02-15 21:30:53'),(8859,'2005-07-29 23:44:43',603,216,'2005-08-07 18:14:43',2,'2006-02-15 21:30:53'),(8860,'2005-07-29 23:45:57',2841,531,'2005-08-06 02:14:57',2,'2006-02-15 21:30:53'),(8861,'2005-07-29 23:47:29',759,560,'2005-08-07 01:27:29',1,'2006-02-15 21:30:53'),(8862,'2005-07-29 23:49:23',916,21,'2005-08-04 20:11:23',1,'2006-02-15 21:30:53'),(8863,'2005-07-29 23:52:01',75,47,'2005-08-04 20:28:01',1,'2006-02-15 21:30:53'),(8864,'2005-07-29 23:52:12',2321,167,'2005-07-30 22:12:12',1,'2006-02-15 21:30:53'),(8865,'2005-07-29 23:54:54',1835,305,'2005-07-31 05:10:54',2,'2006-02-15 21:30:53'),(8866,'2005-07-29 23:58:19',1530,44,'2005-08-01 05:19:19',2,'2006-02-15 21:30:53'),(8867,'2005-07-30 00:02:18',1388,497,'2005-08-04 00:44:18',2,'2006-02-15 21:30:53'),(8868,'2005-07-30 00:02:26',1229,512,'2005-08-01 22:28:26',2,'2006-02-15 21:30:53'),(8869,'2005-07-30 00:06:32',4353,308,'2005-07-31 20:49:32',2,'2006-02-15 21:30:53'),(8870,'2005-07-30 00:08:08',4104,90,'2005-08-08 00:15:08',2,'2006-02-15 21:30:53'),(8871,'2005-07-30 00:12:41',4535,382,'2005-08-08 03:53:41',1,'2006-02-15 21:30:53'),(8872,'2005-07-30 00:13:54',2669,186,'2005-08-01 18:34:54',1,'2006-02-15 21:30:53'),(8873,'2005-07-30 00:14:32',3498,91,'2005-08-04 20:42:32',2,'2006-02-15 21:30:53'),(8874,'2005-07-30 00:14:45',459,564,'2005-08-02 22:34:45',2,'2006-02-15 21:30:53'),(8875,'2005-07-30 00:15:09',1294,121,'2005-08-04 02:54:09',2,'2006-02-15 21:30:53'),(8876,'2005-07-30 00:15:09',2394,579,'2005-08-02 23:56:09',1,'2006-02-15 21:30:53'),(8877,'2005-07-30 00:15:22',1140,417,'2005-07-31 00:53:22',1,'2006-02-15 21:30:53'),(8878,'2005-07-30 00:15:57',440,25,'2005-08-01 00:22:57',2,'2006-02-15 21:30:53'),(8879,'2005-07-30 00:16:02',2956,584,'2005-08-06 20:10:02',2,'2006-02-15 21:30:53'),(8880,'2005-07-30 00:16:55',2920,51,'2005-08-01 01:05:55',1,'2006-02-15 21:30:53'),(8881,'2005-07-30 00:22:31',2012,118,'2005-08-04 19:10:31',1,'2006-02-15 21:30:53'),(8882,'2005-07-30 00:24:05',441,410,'2005-08-03 19:48:05',2,'2006-02-15 21:30:53'),(8883,'2005-07-30 00:24:48',1421,168,'2005-08-04 00:24:48',2,'2006-02-15 21:30:53'),(8884,'2005-07-30 00:26:22',3050,80,'2005-08-05 03:24:22',1,'2006-02-15 21:30:53'),(8885,'2005-07-30 00:36:26',2984,135,'2005-08-06 03:05:26',1,'2006-02-15 21:30:53'),(8886,'2005-07-30 00:36:31',1469,418,'2005-08-08 06:18:31',1,'2006-02-15 21:30:53'),(8887,'2005-07-30 00:36:54',4119,389,'2005-08-04 19:07:54',1,'2006-02-15 21:30:53'),(8888,'2005-07-30 00:39:36',2824,284,'2005-08-01 02:28:36',2,'2006-02-15 21:30:53'),(8889,'2005-07-30 00:39:43',3457,558,'2005-08-02 23:22:43',1,'2006-02-15 21:30:53'),(8890,'2005-07-30 00:42:06',3656,470,'2005-08-05 21:04:06',1,'2006-02-15 21:30:53'),(8891,'2005-07-30 00:46:55',4093,435,'2005-08-06 23:32:55',2,'2006-02-15 21:30:53'),(8892,'2005-07-30 00:47:03',1584,184,'2005-08-06 03:23:03',2,'2006-02-15 21:30:53'),(8893,'2005-07-30 00:48:19',1048,147,'2005-08-01 03:25:19',1,'2006-02-15 21:30:53'),(8894,'2005-07-30 00:48:31',2055,552,'2005-07-31 05:49:31',1,'2006-02-15 21:30:53'),(8895,'2005-07-30 00:49:17',3217,494,'2005-07-31 01:56:17',1,'2006-02-15 21:30:53'),(8896,'2005-07-30 00:51:21',3560,205,'2005-07-31 22:33:21',1,'2006-02-15 21:30:53'),(8897,'2005-07-30 01:00:17',1964,459,'2005-08-01 03:41:17',1,'2006-02-15 21:30:53'),(8898,'2005-07-30 01:02:20',3961,452,'2005-08-05 22:02:20',2,'2006-02-15 21:30:53'),(8899,'2005-07-30 01:05:30',4148,252,'2005-08-01 23:32:30',1,'2006-02-15 21:30:53'),(8900,'2005-07-30 01:07:03',3057,375,'2005-08-06 04:07:03',1,'2006-02-15 21:30:53'),(8901,'2005-07-30 01:07:12',4392,28,'2005-08-02 06:34:12',1,'2006-02-15 21:30:53'),(8902,'2005-07-30 01:08:06',2983,408,'2005-08-05 00:00:06',2,'2006-02-15 21:30:53'),(8903,'2005-07-30 01:08:06',4546,406,'2005-07-30 21:47:06',2,'2006-02-15 21:30:53'),(8904,'2005-07-30 01:08:33',3622,575,'2005-08-04 02:33:33',1,'2006-02-15 21:30:53'),(8905,'2005-07-30 01:11:11',2154,240,'2005-08-04 22:39:11',1,'2006-02-15 21:30:53'),(8906,'2005-07-30 01:21:39',2667,560,'2005-08-07 02:14:39',2,'2006-02-15 21:30:53'),(8907,'2005-07-30 01:25:03',3239,576,'2005-08-03 05:41:03',1,'2006-02-15 21:30:53'),(8908,'2005-07-30 01:26:05',4498,391,'2005-07-31 20:39:05',1,'2006-02-15 21:30:53'),(8909,'2005-07-30 01:28:03',2606,556,'2005-08-06 04:40:03',2,'2006-02-15 21:30:53'),(8910,'2005-07-30 01:29:48',1039,569,'2005-07-31 21:33:48',2,'2006-02-15 21:30:53'),(8911,'2005-07-30 01:30:57',2159,445,'2005-08-02 20:01:57',1,'2006-02-15 21:30:53'),(8912,'2005-07-30 01:31:25',1686,280,'2005-08-02 07:14:25',2,'2006-02-15 21:30:53'),(8913,'2005-07-30 01:35:01',429,391,'2005-08-06 06:13:01',1,'2006-02-15 21:30:53'),(8914,'2005-07-30 01:42:03',1347,32,'2005-08-04 03:53:03',1,'2006-02-15 21:30:53'),(8915,'2005-07-30 01:42:09',3030,42,'2005-08-04 23:29:09',2,'2006-02-15 21:30:53'),(8916,'2005-07-30 01:42:21',3852,377,'2005-08-03 05:28:21',1,'2006-02-15 21:30:53'),(8917,'2005-07-30 01:47:02',4460,309,'2005-08-05 21:10:02',2,'2006-02-15 21:30:53'),(8918,'2005-07-30 01:56:22',2544,424,'2005-08-04 01:58:22',2,'2006-02-15 21:30:53'),(8919,'2005-07-30 01:57:03',4006,337,'2005-08-08 05:14:03',1,'2006-02-15 21:30:53'),(8920,'2005-07-30 01:59:24',4079,78,'2005-08-02 22:37:24',2,'2006-02-15 21:30:53'),(8921,'2005-07-30 02:04:02',1016,354,'2005-07-31 06:18:02',1,'2006-02-15 21:30:53'),(8922,'2005-07-30 02:08:25',1696,446,'2005-08-08 07:19:25',2,'2006-02-15 21:30:53'),(8923,'2005-07-30 02:08:49',2425,446,'2005-08-03 23:45:49',2,'2006-02-15 21:30:53'),(8924,'2005-07-30 02:08:58',2291,38,'2005-08-05 02:13:58',2,'2006-02-15 21:30:53'),(8925,'2005-07-30 02:09:14',3753,500,'2005-07-30 21:39:14',1,'2006-02-15 21:30:53'),(8926,'2005-07-30 02:10:31',3677,510,'2005-08-03 23:56:31',1,'2006-02-15 21:30:53'),(8927,'2005-07-30 02:13:31',272,15,'2005-08-01 01:34:31',1,'2006-02-15 21:30:53'),(8928,'2005-07-30 02:18:19',706,366,'2005-08-05 00:49:19',2,'2006-02-15 21:30:53'),(8929,'2005-07-30 02:28:22',3501,472,'2005-08-06 06:13:22',1,'2006-02-15 21:30:53'),(8930,'2005-07-30 02:28:38',1107,202,'2005-08-02 01:43:38',2,'2006-02-15 21:30:53'),(8931,'2005-07-30 02:30:07',16,268,'2005-08-02 08:24:07',2,'2006-02-15 21:30:53'),(8932,'2005-07-30 02:31:26',4537,295,'2005-08-04 02:17:26',2,'2006-02-15 21:30:53'),(8933,'2005-07-30 02:36:06',1664,260,'2005-08-02 23:37:06',2,'2006-02-15 21:30:53'),(8934,'2005-07-30 02:37:05',3223,494,'2005-08-01 20:42:05',1,'2006-02-15 21:30:53'),(8935,'2005-07-30 02:38:45',285,76,'2005-08-02 07:11:45',2,'2006-02-15 21:30:53'),(8936,'2005-07-30 02:47:13',1408,227,'2005-08-01 02:25:13',2,'2006-02-15 21:30:53'),(8937,'2005-07-30 02:53:21',2406,544,'2005-08-08 03:33:21',2,'2006-02-15 21:30:53'),(8938,'2005-07-30 02:56:08',4031,92,'2005-07-31 23:08:08',2,'2006-02-15 21:30:53'),(8939,'2005-07-30 02:56:53',4175,598,'2005-08-01 21:19:53',1,'2006-02-15 21:30:53'),(8940,'2005-07-30 02:57:26',1566,212,'2005-08-05 22:05:26',1,'2006-02-15 21:30:53'),(8941,'2005-07-30 02:59:21',4147,329,'2005-08-02 05:18:21',2,'2006-02-15 21:30:53'),(8942,'2005-07-30 03:01:07',4375,77,'2005-08-06 22:50:07',2,'2006-02-15 21:30:53'),(8943,'2005-07-30 03:06:48',3698,531,'2005-08-02 00:59:48',2,'2006-02-15 21:30:53'),(8944,'2005-07-30 03:11:44',3513,172,'2005-08-06 23:15:44',2,'2006-02-15 21:30:53'),(8945,'2005-07-30 03:11:48',1441,447,'2005-08-07 07:53:48',2,'2006-02-15 21:30:53'),(8946,'2005-07-30 03:14:53',3510,257,'2005-08-04 00:50:53',1,'2006-02-15 21:30:53'),(8947,'2005-07-30 03:15:37',341,24,'2005-08-04 07:10:37',2,'2006-02-15 21:30:53'),(8948,'2005-07-30 03:16:18',948,597,'2005-08-04 03:16:18',1,'2006-02-15 21:30:53'),(8949,'2005-07-30 03:17:02',2876,231,'2005-08-08 07:38:02',1,'2006-02-15 21:30:53'),(8950,'2005-07-30 03:17:13',3015,11,'2005-08-07 00:20:13',1,'2006-02-15 21:30:53'),(8951,'2005-07-30 03:18:24',127,336,'2005-08-08 08:50:24',2,'2006-02-15 21:30:53'),(8952,'2005-07-30 03:20:38',4397,36,'2005-08-02 02:54:38',1,'2006-02-15 21:30:53'),(8953,'2005-07-30 03:21:05',535,278,'2005-08-02 05:24:05',2,'2006-02-15 21:30:53'),(8954,'2005-07-30 03:25:51',991,137,'2005-08-06 05:10:51',2,'2006-02-15 21:30:53'),(8955,'2005-07-30 03:28:27',4532,405,'2005-08-04 04:56:27',2,'2006-02-15 21:30:53'),(8956,'2005-07-30 03:32:29',2129,71,'2005-08-01 03:08:29',2,'2006-02-15 21:30:53'),(8957,'2005-07-30 03:34:10',811,158,'2005-08-06 07:05:10',1,'2006-02-15 21:30:53'),(8958,'2005-07-30 03:34:26',1556,536,'2005-08-06 08:14:26',1,'2006-02-15 21:30:53'),(8959,'2005-07-30 03:35:49',3508,550,'2005-08-06 02:02:49',2,'2006-02-15 21:30:53'),(8960,'2005-07-30 03:36:31',391,525,'2005-08-01 23:46:31',2,'2006-02-15 21:30:53'),(8961,'2005-07-30 03:43:35',3679,211,'2005-08-06 07:42:35',1,'2006-02-15 21:30:53'),(8962,'2005-07-30 03:43:45',4439,406,'2005-08-07 00:33:45',1,'2006-02-15 21:30:53'),(8963,'2005-07-30 03:46:26',100,544,'2005-08-08 06:12:26',1,'2006-02-15 21:30:53'),(8964,'2005-07-30 03:49:35',280,424,'2005-08-06 23:28:35',2,'2006-02-15 21:30:53'),(8965,'2005-07-30 03:52:37',2419,599,'2005-08-05 01:28:37',2,'2006-02-15 21:30:53'),(8966,'2005-07-30 03:54:12',1903,522,'2005-07-31 04:51:12',1,'2006-02-15 21:30:53'),(8967,'2005-07-30 03:56:55',1536,480,'2005-08-06 05:25:55',2,'2006-02-15 21:30:53'),(8968,'2005-07-30 03:57:32',2280,339,'2005-07-31 00:09:32',1,'2006-02-15 21:30:53'),(8969,'2005-07-30 04:00:19',2043,121,'2005-08-06 04:39:19',1,'2006-02-15 21:30:53'),(8970,'2005-07-30 04:02:05',2940,313,'2005-08-07 03:40:05',2,'2006-02-15 21:30:53'),(8971,'2005-07-30 04:03:58',3572,35,'2005-08-08 04:16:58',2,'2006-02-15 21:30:53'),(8972,'2005-07-30 04:06:25',1974,89,'2005-08-04 22:49:25',1,'2006-02-15 21:30:53'),(8973,'2005-07-30 04:09:13',886,282,'2005-08-07 22:30:13',2,'2006-02-15 21:30:53'),(8974,'2005-07-30 04:09:16',3376,425,'2005-08-04 06:55:16',1,'2006-02-15 21:30:53'),(8975,'2005-07-30 04:10:18',3288,356,'2005-08-07 01:06:18',2,'2006-02-15 21:30:53'),(8976,'2005-07-30 04:12:32',2135,507,'2005-08-04 23:08:32',1,'2006-02-15 21:30:53'),(8977,'2005-07-30 04:14:07',4099,334,'2005-08-05 23:45:07',2,'2006-02-15 21:30:53'),(8978,'2005-07-30 04:14:28',711,5,'2005-08-06 09:08:28',1,'2006-02-15 21:30:53'),(8979,'2005-07-30 04:20:25',1394,529,'2005-08-08 03:39:25',2,'2006-02-15 21:30:53'),(8980,'2005-07-30 04:22:15',3061,105,'2005-08-04 08:16:15',1,'2006-02-15 21:30:53'),(8981,'2005-07-30 04:25:30',4413,310,'2005-08-06 02:37:30',1,'2006-02-15 21:30:53'),(8982,'2005-07-30 04:31:02',1128,251,'2005-07-31 04:22:02',1,'2006-02-15 21:30:53'),(8983,'2005-07-30 04:31:08',1861,144,'2005-07-31 09:28:08',1,'2006-02-15 21:30:53'),(8984,'2005-07-30 04:31:50',2126,485,'2005-08-04 03:24:50',1,'2006-02-15 21:30:53'),(8985,'2005-07-30 04:34:51',3179,12,'2005-08-06 00:45:51',2,'2006-02-15 21:30:53'),(8986,'2005-07-30 04:37:20',3992,551,'2005-07-31 23:54:20',1,'2006-02-15 21:30:53'),(8987,'2005-07-30 04:37:36',1434,135,'2005-08-08 10:14:36',2,'2006-02-15 21:30:53'),(8988,'2005-07-30 04:38:49',777,487,'2005-08-07 07:00:49',2,'2006-02-15 21:30:53'),(8989,'2005-07-30 04:39:19',954,575,'2005-08-06 02:11:19',1,'2006-02-15 21:30:53'),(8990,'2005-07-30 04:41:42',1869,292,'2005-08-07 22:50:42',2,'2006-02-15 21:30:53'),(8991,'2005-07-30 04:42:54',4540,474,'2005-08-01 23:51:54',1,'2006-02-15 21:30:53'),(8992,'2005-07-30 04:44:18',4478,54,'2005-08-01 00:29:18',1,'2006-02-15 21:30:53'),(8993,'2005-07-30 04:51:25',1891,382,'2005-08-01 01:04:25',1,'2006-02-15 21:30:53'),(8994,'2005-07-30 04:51:32',1527,287,'2005-08-07 09:41:32',1,'2006-02-15 21:30:53'),(8995,'2005-07-30 04:53:11',3575,331,'2005-08-07 00:24:11',1,'2006-02-15 21:30:53'),(8996,'2005-07-30 04:53:23',1970,579,'2005-07-31 06:01:23',1,'2006-02-15 21:30:53'),(8997,'2005-07-30 04:53:56',850,31,'2005-08-03 07:10:56',1,'2006-02-15 21:30:53'),(8998,'2005-07-30 04:54:14',1573,120,'2005-08-08 08:18:14',2,'2006-02-15 21:30:53'),(8999,'2005-07-30 04:55:46',3458,424,'2005-08-01 00:16:46',2,'2006-02-15 21:30:53'),(9000,'2005-07-30 04:58:55',3763,290,'2005-08-08 04:01:55',2,'2006-02-15 21:30:53'),(9001,'2005-07-30 04:59:41',3682,440,'2005-07-31 08:56:41',2,'2006-02-15 21:30:53'),(9002,'2005-07-30 05:02:21',1936,137,'2005-07-31 04:58:21',1,'2006-02-15 21:30:53'),(9003,'2005-07-30 05:02:52',1605,507,'2005-07-31 10:33:52',1,'2006-02-15 21:30:53'),(9004,'2005-07-30 05:04:27',3775,178,'2005-07-31 00:49:27',1,'2006-02-15 21:30:53'),(9005,'2005-07-30 05:04:58',157,204,'2005-08-03 07:41:58',2,'2006-02-15 21:30:53'),(9006,'2005-07-30 05:06:32',3315,49,'2005-07-31 08:24:32',1,'2006-02-15 21:30:53'),(9007,'2005-07-30 05:09:32',2813,63,'2005-08-02 06:12:32',2,'2006-02-15 21:30:53'),(9008,'2005-07-30 05:10:26',3592,371,'2005-07-31 08:13:26',1,'2006-02-15 21:30:53'),(9009,'2005-07-30 05:12:01',4136,166,'2005-08-07 10:58:01',1,'2006-02-15 21:30:53'),(9010,'2005-07-30 05:12:04',1698,152,'2005-08-06 02:54:04',2,'2006-02-15 21:30:53'),(9011,'2005-07-30 05:16:29',2799,236,'2005-08-05 06:57:29',1,'2006-02-15 21:30:53'),(9012,'2005-07-30 05:18:57',3604,494,'2005-08-06 06:21:57',1,'2006-02-15 21:30:53'),(9013,'2005-07-30 05:19:20',2367,347,'2005-08-04 01:35:20',1,'2006-02-15 21:30:53'),(9014,'2005-07-30 05:19:27',311,297,'2005-08-01 01:10:27',2,'2006-02-15 21:30:53'),(9015,'2005-07-30 05:21:32',4128,203,'2005-08-08 07:03:32',2,'2006-02-15 21:30:53'),(9016,'2005-07-30 05:26:13',4309,312,'2005-08-04 00:25:13',2,'2006-02-15 21:30:53'),(9017,'2005-07-30 05:26:20',3325,319,'2005-08-04 10:00:20',2,'2006-02-15 21:30:53'),(9018,'2005-07-30 05:28:40',1982,218,'2005-08-07 01:34:40',1,'2006-02-15 21:30:53'),(9019,'2005-07-30 05:28:53',946,235,'2005-08-03 02:16:53',2,'2006-02-15 21:30:53'),(9020,'2005-07-30 05:31:27',1700,142,'2005-08-08 06:44:27',2,'2006-02-15 21:30:53'),(9021,'2005-07-30 05:34:24',674,498,'2005-08-03 04:13:24',1,'2006-02-15 21:30:53'),(9022,'2005-07-30 05:34:45',4473,159,'2005-08-03 23:57:45',2,'2006-02-15 21:30:53'),(9023,'2005-07-30 05:36:40',2911,148,'2005-08-07 06:20:40',1,'2006-02-15 21:30:53'),(9024,'2005-07-30 05:44:42',164,329,'2005-08-05 03:15:42',2,'2006-02-15 21:30:53'),(9025,'2005-07-30 05:50:08',2244,473,'2005-07-31 09:58:08',1,'2006-02-15 21:30:53'),(9026,'2005-07-30 05:55:31',1524,423,'2005-08-01 03:19:31',1,'2006-02-15 21:30:53'),(9027,'2005-07-30 05:58:27',449,72,'2005-08-03 03:02:27',1,'2006-02-15 21:30:53'),(9028,'2005-07-30 06:00:35',2687,119,'2005-08-02 01:35:35',1,'2006-02-15 21:30:53'),(9029,'2005-07-30 06:03:11',2220,52,'2005-08-04 01:42:11',1,'2006-02-15 21:30:53'),(9030,'2005-07-30 06:05:38',2237,367,'2005-08-03 00:19:38',1,'2006-02-15 21:30:53'),(9031,'2005-07-30 06:06:10',2377,2,'2005-08-04 10:45:10',2,'2006-02-15 21:30:53'),(9032,'2005-07-30 06:06:54',4448,369,'2005-08-01 05:27:54',1,'2006-02-15 21:30:53'),(9033,'2005-07-30 06:07:42',3416,35,'2005-08-05 01:18:42',1,'2006-02-15 21:30:53'),(9034,'2005-07-30 06:10:58',3847,144,'2005-08-08 05:00:58',2,'2006-02-15 21:30:53'),(9035,'2005-07-30 06:16:07',3785,243,'2005-08-06 09:22:07',1,'2006-02-15 21:30:53'),(9036,'2005-07-30 06:18:38',790,18,'2005-07-31 01:22:38',1,'2006-02-15 21:30:53'),(9037,'2005-07-30 06:23:14',3833,356,'2005-08-08 06:25:14',1,'2006-02-15 21:30:53'),(9038,'2005-07-30 06:23:35',217,514,'2005-08-06 11:10:35',1,'2006-02-15 21:30:53'),(9039,'2005-07-30 06:24:28',4493,485,'2005-08-08 00:28:28',1,'2006-02-15 21:30:53'),(9040,'2005-07-30 06:31:45',392,33,'2005-08-03 12:20:45',1,'2006-02-15 21:30:53'),(9041,'2005-07-30 06:32:36',1103,454,'2005-08-01 10:28:36',2,'2006-02-15 21:30:53'),(9042,'2005-07-30 06:33:55',2770,398,'2005-08-04 09:31:55',2,'2006-02-15 21:30:53'),(9043,'2005-07-30 06:34:07',4127,9,'2005-08-02 01:16:07',1,'2006-02-15 21:30:53'),(9044,'2005-07-30 06:35:21',3796,319,'2005-07-31 10:27:21',1,'2006-02-15 21:30:53'),(9045,'2005-07-30 06:36:57',4521,46,'2005-08-08 01:51:57',1,'2006-02-15 21:30:53'),(9046,'2005-07-30 06:46:55',1736,215,'2005-08-01 02:21:55',2,'2006-02-15 21:30:53'),(9047,'2005-07-30 06:56:33',256,522,'2005-08-08 06:40:33',2,'2006-02-15 21:30:53'),(9048,'2005-07-30 06:57:07',3929,100,'2005-08-05 00:57:07',1,'2006-02-15 21:30:53'),(9049,'2005-07-30 06:57:28',2620,417,'2005-08-04 09:02:28',1,'2006-02-15 21:30:53'),(9050,'2005-07-30 06:59:55',106,40,'2005-08-06 06:37:55',1,'2006-02-15 21:30:53'),(9051,'2005-07-30 07:05:54',1847,337,'2005-08-07 09:12:54',2,'2006-02-15 21:30:53'),(9052,'2005-07-30 07:06:08',3351,408,'2005-08-03 10:30:08',1,'2006-02-15 21:30:53'),(9053,'2005-07-30 07:07:39',2535,485,'2005-08-01 09:22:39',2,'2006-02-15 21:30:53'),(9054,'2005-07-30 07:11:44',2860,209,'2005-08-08 01:55:44',2,'2006-02-15 21:30:53'),(9055,'2005-07-30 07:13:07',634,512,'2005-08-01 12:18:07',1,'2006-02-15 21:30:53'),(9056,'2005-07-30 07:13:20',4363,380,'2005-08-03 07:36:20',1,'2006-02-15 21:30:53'),(9057,'2005-07-30 07:14:18',3141,202,'2005-08-01 05:10:18',2,'2006-02-15 21:30:53'),(9058,'2005-07-30 07:15:45',4214,403,'2005-07-31 02:57:45',2,'2006-02-15 21:30:53'),(9059,'2005-07-30 07:18:44',480,267,'2005-08-08 08:39:44',1,'2006-02-15 21:30:53'),(9060,'2005-07-30 07:20:36',4360,87,'2005-08-03 10:51:36',1,'2006-02-15 21:30:53'),(9061,'2005-07-30 07:21:52',1933,255,'2005-08-08 10:52:52',1,'2006-02-15 21:30:53'),(9062,'2005-07-30 07:23:17',2780,358,'2005-08-02 12:07:17',1,'2006-02-15 21:30:53'),(9063,'2005-07-30 07:24:34',2851,564,'2005-08-05 01:28:34',2,'2006-02-15 21:30:53'),(9064,'2005-07-30 07:24:55',1417,194,'2005-08-07 08:44:55',2,'2006-02-15 21:30:53'),(9065,'2005-07-30 07:25:09',349,238,'2005-07-31 05:18:09',2,'2006-02-15 21:30:53'),(9066,'2005-07-30 07:28:54',196,171,'2005-08-02 05:23:54',1,'2006-02-15 21:30:53'),(9067,'2005-07-30 07:31:01',3628,382,'2005-08-04 11:44:01',2,'2006-02-15 21:30:53'),(9068,'2005-07-30 07:31:45',2264,78,'2005-08-08 06:40:45',1,'2006-02-15 21:30:53'),(9069,'2005-07-30 07:39:59',1852,258,'2005-08-02 04:10:59',1,'2006-02-15 21:30:53'),(9070,'2005-07-30 07:40:39',3690,276,'2005-08-01 04:19:39',2,'2006-02-15 21:30:53'),(9071,'2005-07-30 07:40:58',3151,523,'2005-08-01 06:59:58',2,'2006-02-15 21:30:53'),(9072,'2005-07-30 07:45:49',4536,106,'2005-08-04 10:00:49',1,'2006-02-15 21:30:53'),(9073,'2005-07-30 07:49:56',2185,141,'2005-08-05 06:25:56',2,'2006-02-15 21:30:53'),(9074,'2005-07-30 07:50:10',3244,84,'2005-08-01 11:21:10',2,'2006-02-15 21:30:53'),(9075,'2005-07-30 07:55:14',1931,20,'2005-08-02 13:49:14',1,'2006-02-15 21:30:53'),(9076,'2005-07-30 07:58:12',496,447,'2005-08-08 06:04:12',1,'2006-02-15 21:30:53'),(9077,'2005-07-30 08:00:19',4324,471,'2005-08-08 11:21:19',1,'2006-02-15 21:30:53'),(9078,'2005-07-30 08:01:00',955,300,'2005-07-31 10:39:00',1,'2006-02-15 21:30:53'),(9079,'2005-07-30 08:02:00',2143,193,'2005-07-31 04:02:00',2,'2006-02-15 21:30:53'),(9080,'2005-07-30 08:02:39',94,276,'2005-08-06 12:02:39',1,'2006-02-15 21:30:53'),(9081,'2005-07-30 08:09:58',3040,572,'2005-08-03 13:27:58',1,'2006-02-15 21:30:53'),(9082,'2005-07-30 08:11:22',4042,438,'2005-08-06 09:26:22',2,'2006-02-15 21:30:53'),(9083,'2005-07-30 08:14:27',456,488,'2005-08-07 14:02:27',1,'2006-02-15 21:30:53'),(9084,'2005-07-30 08:14:29',3950,171,'2005-08-03 11:12:29',2,'2006-02-15 21:30:53'),(9085,'2005-07-30 08:17:24',3400,33,'2005-08-03 09:35:24',2,'2006-02-15 21:30:53'),(9086,'2005-07-30 08:18:46',2779,57,'2005-08-06 06:10:46',2,'2006-02-15 21:30:53'),(9087,'2005-07-30 08:19:47',4048,546,'2005-08-02 07:15:47',1,'2006-02-15 21:30:53'),(9088,'2005-07-30 08:21:02',3407,245,'2005-08-01 09:55:02',1,'2006-02-15 21:30:53'),(9089,'2005-07-30 08:23:39',490,369,'2005-07-31 06:00:39',1,'2006-02-15 21:30:53'),(9090,'2005-07-30 08:24:42',3426,104,'2005-08-08 06:17:42',2,'2006-02-15 21:30:53'),(9091,'2005-07-30 08:30:45',2249,66,'2005-08-07 13:28:45',1,'2006-02-15 21:30:53'),(9092,'2005-07-30 08:30:56',1877,17,'2005-08-06 08:09:56',2,'2006-02-15 21:30:53'),(9093,'2005-07-30 08:33:24',2208,96,'2005-08-04 11:07:24',1,'2006-02-15 21:30:53'),(9094,'2005-07-30 08:35:10',2699,140,'2005-08-07 08:18:10',2,'2006-02-15 21:30:53'),(9095,'2005-07-30 08:38:36',3019,511,'2005-07-31 06:14:36',1,'2006-02-15 21:30:53'),(9096,'2005-07-30 08:39:23',540,216,'2005-08-01 03:33:23',1,'2006-02-15 21:30:53'),(9097,'2005-07-30 08:40:35',570,173,'2005-08-04 11:19:35',2,'2006-02-15 21:30:53'),(9098,'2005-07-30 08:44:21',1267,144,'2005-08-08 12:31:21',1,'2006-02-15 21:30:53'),(9099,'2005-07-30 08:45:48',594,250,'2005-08-01 03:18:48',2,'2006-02-15 21:30:53'),(9100,'2005-07-30 08:46:09',4117,4,'2005-08-05 10:34:09',1,'2006-02-15 21:30:53'),(9101,'2005-07-30 08:47:13',3165,566,'2005-08-02 12:52:13',1,'2006-02-15 21:30:53'),(9102,'2005-07-30 08:48:20',1154,276,'2005-08-04 10:19:20',1,'2006-02-15 21:30:53'),(9103,'2005-07-30 08:49:26',3806,280,'2005-07-31 14:15:26',1,'2006-02-15 21:30:53'),(9104,'2005-07-30 08:49:55',3372,322,'2005-08-06 12:23:55',1,'2006-02-15 21:30:53'),(9105,'2005-07-30 08:50:25',4443,262,'2005-08-05 06:08:25',1,'2006-02-15 21:30:53'),(9106,'2005-07-30 08:52:34',2935,148,'2005-08-02 07:38:34',2,'2006-02-15 21:30:53'),(9107,'2005-07-30 08:52:45',1068,531,'2005-08-05 08:39:45',2,'2006-02-15 21:30:53'),(9108,'2005-07-30 08:56:36',3977,490,'2005-08-04 11:07:36',1,'2006-02-15 21:30:53'),(9109,'2005-07-30 08:58:24',787,266,'2005-08-07 06:56:24',1,'2006-02-15 21:30:53'),(9110,'2005-07-30 09:05:42',1474,317,'2005-08-03 05:15:42',1,'2006-02-15 21:30:53'),(9111,'2005-07-30 09:05:44',166,211,'2005-08-04 14:27:44',2,'2006-02-15 21:30:53'),(9112,'2005-07-30 09:06:31',395,74,'2005-08-04 05:12:31',2,'2006-02-15 21:30:53'),(9113,'2005-07-30 09:09:03',3903,374,'2005-07-31 03:13:03',1,'2006-02-15 21:30:53'),(9114,'2005-07-30 09:13:21',893,18,'2005-08-05 06:00:21',2,'2006-02-15 21:30:53'),(9115,'2005-07-30 09:13:55',3750,322,'2005-08-04 04:02:55',2,'2006-02-15 21:30:53'),(9116,'2005-07-30 09:19:41',2917,446,'2005-08-03 08:01:41',2,'2006-02-15 21:30:53'),(9117,'2005-07-30 09:20:59',3055,371,'2005-08-07 08:47:59',1,'2006-02-15 21:30:53'),(9118,'2005-07-30 09:24:18',4538,172,'2005-08-02 14:46:18',2,'2006-02-15 21:30:53'),(9119,'2005-07-30 09:25:56',275,305,'2005-08-03 03:36:56',1,'2006-02-15 21:30:53'),(9120,'2005-07-30 09:26:08',139,473,'2005-08-08 09:52:08',1,'2006-02-15 21:30:53'),(9121,'2005-07-30 09:36:26',3098,150,'2005-08-05 15:17:26',2,'2006-02-15 21:30:53'),(9122,'2005-07-30 09:36:52',627,365,'2005-08-05 13:20:52',1,'2006-02-15 21:30:53'),(9123,'2005-07-30 09:39:15',3748,293,'2005-08-02 08:12:15',2,'2006-02-15 21:30:53'),(9124,'2005-07-30 09:43:12',4552,105,'2005-08-06 06:17:12',1,'2006-02-15 21:30:53'),(9125,'2005-07-30 09:43:39',333,335,'2005-08-07 14:02:39',1,'2006-02-15 21:30:53'),(9126,'2005-07-30 09:44:15',4495,590,'2005-08-02 11:02:15',2,'2006-02-15 21:30:53'),(9127,'2005-07-30 09:46:36',4114,300,'2005-07-31 07:43:36',1,'2006-02-15 21:30:53'),(9128,'2005-07-30 09:51:14',3647,372,'2005-08-07 06:23:14',1,'2006-02-15 21:30:53'),(9129,'2005-07-30 09:51:21',2658,125,'2005-08-07 08:50:21',2,'2006-02-15 21:30:53'),(9130,'2005-07-30 09:55:10',1715,354,'2005-08-04 08:57:10',1,'2006-02-15 21:30:53'),(9131,'2005-07-30 09:55:57',623,142,'2005-08-01 14:21:57',1,'2006-02-15 21:30:53'),(9132,'2005-07-30 09:56:00',402,159,'2005-08-02 09:22:00',1,'2006-02-15 21:30:53'),(9133,'2005-07-30 09:59:00',408,576,'2005-08-07 04:24:00',1,'2006-02-15 21:30:53'),(9134,'2005-07-30 10:00:21',3797,559,'2005-08-01 05:01:21',1,'2006-02-15 21:30:53'),(9135,'2005-07-30 10:06:53',821,161,'2005-08-03 13:57:53',2,'2006-02-15 21:30:53'),(9136,'2005-07-30 10:07:20',1734,57,'2005-07-31 08:20:20',2,'2006-02-15 21:30:53'),(9137,'2005-07-30 10:09:24',840,459,'2005-08-06 04:30:24',2,'2006-02-15 21:30:53'),(9138,'2005-07-30 10:11:52',2550,17,'2005-07-31 07:05:52',2,'2006-02-15 21:30:53'),(9139,'2005-07-30 10:11:52',2809,133,'2005-08-03 12:44:52',1,'2006-02-15 21:30:53'),(9140,'2005-07-30 10:12:01',4095,25,'2005-08-06 09:16:01',2,'2006-02-15 21:30:53'),(9141,'2005-07-30 10:16:04',3087,484,'2005-08-05 08:01:04',1,'2006-02-15 21:30:53'),(9142,'2005-07-30 10:21:03',4467,486,'2005-08-04 15:14:03',1,'2006-02-15 21:30:53'),(9143,'2005-07-30 10:22:11',2962,511,'2005-08-07 06:13:11',2,'2006-02-15 21:30:53'),(9144,'2005-07-30 10:22:15',718,381,'2005-08-05 08:14:15',1,'2006-02-15 21:30:53'),(9145,'2005-07-30 10:27:55',559,176,'2005-08-07 14:41:55',2,'2006-02-15 21:30:53'),(9146,'2005-07-30 10:32:08',483,302,'2005-08-08 14:30:08',1,'2006-02-15 21:30:53'),(9147,'2005-07-30 10:38:59',4167,394,'2005-08-02 11:45:59',2,'2006-02-15 21:30:53'),(9148,'2005-07-30 10:39:10',1407,333,'2005-08-04 07:17:10',2,'2006-02-15 21:30:53'),(9149,'2005-07-30 10:45:12',2632,21,'2005-08-01 09:40:12',1,'2006-02-15 21:30:53'),(9150,'2005-07-30 10:49:32',2834,213,'2005-08-08 15:43:32',1,'2006-02-15 21:30:53'),(9151,'2005-07-30 10:50:53',3956,102,'2005-08-07 08:19:53',1,'2006-02-15 21:30:53'),(9152,'2005-07-30 10:51:27',3607,595,'2005-07-31 06:38:27',2,'2006-02-15 21:30:53'),(9153,'2005-07-30 10:58:16',3743,589,'2005-08-03 06:16:16',2,'2006-02-15 21:30:53'),(9154,'2005-07-30 10:59:54',576,312,'2005-08-05 16:47:54',1,'2006-02-15 21:30:53'),(9155,'2005-07-30 11:00:00',3787,107,'2005-08-02 05:24:00',2,'2006-02-15 21:30:53'),(9156,'2005-07-30 11:04:55',1747,145,'2005-07-31 14:10:55',2,'2006-02-15 21:30:53'),(9157,'2005-07-30 11:06:23',146,19,'2005-08-05 05:29:23',2,'2006-02-15 21:30:53'),(9158,'2005-07-30 11:12:03',4017,16,'2005-08-02 05:55:03',2,'2006-02-15 21:30:53'),(9159,'2005-07-30 11:16:37',1234,217,'2005-08-03 10:32:37',1,'2006-02-15 21:30:53'),(9160,'2005-07-30 11:17:33',183,34,'2005-08-06 15:16:33',2,'2006-02-15 21:30:53'),(9161,'2005-07-30 11:19:18',969,433,'2005-08-02 05:32:18',1,'2006-02-15 21:30:53'),(9162,'2005-07-30 11:21:56',4198,184,'2005-08-02 15:32:56',1,'2006-02-15 21:30:53'),(9163,'2005-07-30 11:23:22',4562,345,'2005-07-31 07:34:22',2,'2006-02-15 21:30:53'),(9164,'2005-07-30 11:24:14',4434,342,'2005-08-08 16:24:14',1,'2006-02-15 21:30:53'),(9165,'2005-07-30 11:24:28',4034,291,'2005-08-03 09:38:28',1,'2006-02-15 21:30:53'),(9166,'2005-07-30 11:26:28',308,12,'2005-08-04 12:32:28',1,'2006-02-15 21:30:53'),(9167,'2005-07-30 11:30:37',1785,162,'2005-08-08 17:13:37',1,'2006-02-15 21:30:53'),(9168,'2005-07-30 11:31:17',2035,75,'2005-08-08 16:56:17',2,'2006-02-15 21:30:53'),(9169,'2005-07-30 11:35:00',1567,245,'2005-08-06 16:16:00',2,'2006-02-15 21:30:53'),(9170,'2005-07-30 11:35:24',4279,425,'2005-08-05 05:36:24',1,'2006-02-15 21:30:53'),(9171,'2005-07-30 11:36:24',1832,189,'2005-08-07 06:04:24',2,'2006-02-15 21:30:53'),(9172,'2005-07-30 11:36:38',695,437,'2005-08-04 09:39:38',1,'2006-02-15 21:30:53'),(9173,'2005-07-30 11:40:10',2103,381,'2005-08-04 05:40:10',2,'2006-02-15 21:30:53'),(9174,'2005-07-30 11:42:10',2636,144,'2005-07-31 09:52:10',1,'2006-02-15 21:30:53'),(9175,'2005-07-30 11:47:48',358,133,'2005-08-02 08:13:48',1,'2006-02-15 21:30:53'),(9176,'2005-07-30 11:50:54',2659,260,'2005-08-02 14:25:54',2,'2006-02-15 21:30:53'),(9177,'2005-07-30 11:52:40',1088,400,'2005-08-08 09:35:40',1,'2006-02-15 21:30:53'),(9178,'2005-07-30 11:58:50',2046,448,'2005-08-08 15:24:50',2,'2006-02-15 21:30:53'),(9179,'2005-07-30 12:02:41',62,50,'2005-08-05 15:23:41',2,'2006-02-15 21:30:53'),(9180,'2005-07-30 12:03:15',3479,442,'2005-08-01 14:25:15',1,'2006-02-15 21:30:53'),(9181,'2005-07-30 12:05:58',3953,224,'2005-08-02 06:22:58',1,'2006-02-15 21:30:53'),(9182,'2005-07-30 12:06:58',2533,165,'2005-08-08 11:33:58',2,'2006-02-15 21:30:53'),(9183,'2005-07-30 12:09:56',4320,475,'2005-08-06 11:50:56',2,'2006-02-15 21:30:53'),(9184,'2005-07-30 12:10:19',51,365,'2005-08-01 07:35:19',2,'2006-02-15 21:30:53'),(9185,'2005-07-30 12:10:40',2268,426,'2005-08-06 07:01:40',1,'2006-02-15 21:30:53'),(9186,'2005-07-30 12:13:48',4513,273,'2005-07-31 11:59:48',1,'2006-02-15 21:30:53'),(9187,'2005-07-30 12:14:03',4008,469,'2005-08-04 13:10:03',2,'2006-02-15 21:30:53'),(9188,'2005-07-30 12:19:54',727,195,'2005-08-06 09:12:54',2,'2006-02-15 21:30:53'),(9189,'2005-07-30 12:20:59',4529,485,'2005-08-06 16:15:59',1,'2006-02-15 21:30:53'),(9190,'2005-07-30 12:24:17',4421,177,'2005-08-03 07:41:17',2,'2006-02-15 21:30:53'),(9191,'2005-07-30 12:25:51',500,314,'2005-08-05 16:13:51',1,'2006-02-15 21:30:53'),(9192,'2005-07-30 12:26:26',2372,102,'2005-08-04 07:54:26',2,'2006-02-15 21:30:53'),(9193,'2005-07-30 12:28:42',3470,69,'2005-08-02 12:17:42',2,'2006-02-15 21:30:53'),(9194,'2005-07-30 12:28:45',2467,294,'2005-08-06 14:38:45',1,'2006-02-15 21:30:53'),(9195,'2005-07-30 12:29:43',944,440,'2005-08-04 12:35:43',1,'2006-02-15 21:30:53'),(9196,'2005-07-30 12:30:19',4298,251,'2005-07-31 18:01:19',2,'2006-02-15 21:30:53'),(9197,'2005-07-30 12:31:36',3214,168,'2005-08-03 09:05:36',1,'2006-02-15 21:30:53'),(9198,'2005-07-30 12:37:08',2371,105,'2005-08-07 16:37:08',2,'2006-02-15 21:30:53'),(9199,'2005-07-30 12:38:00',4336,580,'2005-08-01 07:09:00',1,'2006-02-15 21:30:53'),(9200,'2005-07-30 12:39:52',3277,137,'2005-08-08 09:43:52',2,'2006-02-15 21:30:53'),(9201,'2005-07-30 12:42:21',4387,291,'2005-08-08 06:50:21',1,'2006-02-15 21:30:53'),(9202,'2005-07-30 12:43:24',4525,466,'2005-08-07 10:39:24',2,'2006-02-15 21:30:53'),(9203,'2005-07-30 12:43:40',2112,169,'2005-08-01 09:31:40',2,'2006-02-15 21:30:53'),(9204,'2005-07-30 12:43:58',4378,43,'2005-08-03 16:26:58',2,'2006-02-15 21:30:53'),(9205,'2005-07-30 12:46:40',4165,259,'2005-08-08 14:58:40',1,'2006-02-15 21:30:53'),(9206,'2005-07-30 12:46:59',2021,404,'2005-08-03 14:58:59',1,'2006-02-15 21:30:53'),(9207,'2005-07-30 12:49:57',1346,345,'2005-07-31 14:32:57',2,'2006-02-15 21:30:53'),(9208,'2005-07-30 12:54:03',2751,339,'2005-08-06 17:22:03',2,'2006-02-15 21:30:53'),(9209,'2005-07-30 12:55:36',3940,23,'2005-08-03 11:31:36',2,'2006-02-15 21:30:53'),(9210,'2005-07-30 12:56:44',101,105,'2005-08-08 09:41:44',2,'2006-02-15 21:30:53'),(9211,'2005-07-30 12:59:45',595,57,'2005-08-07 18:17:45',2,'2006-02-15 21:30:53'),(9212,'2005-07-30 13:03:13',2111,73,'2005-08-06 09:48:13',1,'2006-02-15 21:30:53'),(9213,'2005-07-30 13:07:11',184,388,'2005-08-01 15:30:11',1,'2006-02-15 21:30:53'),(9214,'2005-07-30 13:10:14',2823,181,'2005-08-06 14:22:14',2,'2006-02-15 21:30:53'),(9215,'2005-07-30 13:11:11',3591,128,'2005-08-06 13:06:11',1,'2006-02-15 21:30:53'),(9216,'2005-07-30 13:11:19',2783,38,'2005-07-31 11:27:19',2,'2006-02-15 21:30:53'),(9217,'2005-07-30 13:13:55',1561,112,'2005-08-05 17:27:55',1,'2006-02-15 21:30:53'),(9218,'2005-07-30 13:14:35',119,172,'2005-08-07 18:03:35',1,'2006-02-15 21:30:53'),(9219,'2005-07-30 13:15:21',771,329,'2005-08-01 11:39:21',1,'2006-02-15 21:30:53'),(9220,'2005-07-30 13:17:27',2463,569,'2005-08-07 11:34:27',2,'2006-02-15 21:30:53'),(9221,'2005-07-30 13:20:06',2496,113,'2005-08-06 13:58:06',2,'2006-02-15 21:30:53'),(9222,'2005-07-30 13:21:08',3648,95,'2005-08-08 10:42:08',2,'2006-02-15 21:30:53'),(9223,'2005-07-30 13:23:20',3231,595,'2005-08-04 11:24:20',1,'2006-02-15 21:30:53'),(9224,'2005-07-30 13:25:37',2260,406,'2005-08-01 15:13:37',2,'2006-02-15 21:30:53'),(9225,'2005-07-30 13:29:47',1992,391,'2005-08-02 17:08:47',2,'2006-02-15 21:30:53'),(9226,'2005-07-30 13:31:20',4315,3,'2005-08-06 16:42:20',1,'2006-02-15 21:30:53'),(9227,'2005-07-30 13:36:13',2353,522,'2005-08-07 17:39:13',1,'2006-02-15 21:30:53'),(9228,'2005-07-30 13:36:57',2325,91,'2005-08-05 10:43:57',1,'2006-02-15 21:30:53'),(9229,'2005-07-30 13:38:17',3780,276,'2005-08-08 18:17:17',2,'2006-02-15 21:30:53'),(9230,'2005-07-30 13:39:42',1199,109,'2005-07-31 19:20:42',1,'2006-02-15 21:30:53'),(9231,'2005-07-30 13:42:15',1587,489,'2005-08-02 19:27:15',1,'2006-02-15 21:30:53'),(9232,'2005-07-30 13:43:00',1991,502,'2005-08-02 11:39:00',2,'2006-02-15 21:30:53'),(9233,'2005-07-30 13:44:15',2320,357,'2005-08-07 13:02:15',2,'2006-02-15 21:30:53'),(9234,'2005-07-30 13:45:54',1660,128,'2005-08-02 15:33:54',1,'2006-02-15 21:30:53'),(9235,'2005-07-30 13:47:17',984,181,'2005-08-06 17:15:17',2,'2006-02-15 21:30:53'),(9236,'2005-07-30 13:47:43',4030,2,'2005-08-08 18:52:43',1,'2006-02-15 21:30:53'),(9237,'2005-07-30 13:48:17',2777,157,'2005-07-31 13:57:17',2,'2006-02-15 21:30:53'),(9238,'2005-07-30 13:49:43',3356,12,'2005-08-08 08:25:43',2,'2006-02-15 21:30:53'),(9239,'2005-07-30 13:50:52',1728,580,'2005-08-06 16:28:52',1,'2006-02-15 21:30:53'),(9240,'2005-07-30 13:57:54',587,92,'2005-08-03 12:23:54',2,'2006-02-15 21:30:53'),(9241,'2005-07-30 13:58:41',4145,187,'2005-08-04 09:44:41',2,'2006-02-15 21:30:53'),(9242,'2005-07-30 14:03:58',755,306,'2005-08-02 18:09:58',2,'2006-02-15 21:30:53'),(9243,'2005-07-30 14:06:27',876,516,'2005-08-06 09:26:27',2,'2006-02-15 21:30:53'),(9244,'2005-07-30 14:06:53',3640,27,'2005-08-03 19:46:53',1,'2006-02-15 21:30:53'),(9245,'2005-07-30 14:07:50',2586,116,'2005-08-06 17:59:50',2,'2006-02-15 21:30:53'),(9246,'2005-07-30 14:12:31',3390,185,'2005-08-02 14:25:31',2,'2006-02-15 21:30:53'),(9247,'2005-07-30 14:13:56',4106,426,'2005-08-02 16:34:56',2,'2006-02-15 21:30:53'),(9248,'2005-07-30 14:14:11',1382,2,'2005-08-05 11:19:11',1,'2006-02-15 21:30:53'),(9249,'2005-07-30 14:15:02',2015,296,'2005-08-05 13:02:02',1,'2006-02-15 21:30:53'),(9250,'2005-07-30 14:18:16',4544,539,'2005-08-04 12:31:16',1,'2006-02-15 21:30:53'),(9251,'2005-07-30 14:19:25',2948,390,'2005-08-08 11:22:25',2,'2006-02-15 21:30:53'),(9252,'2005-07-30 14:19:59',2350,322,'2005-08-07 15:17:59',1,'2006-02-15 21:30:53'),(9253,'2005-07-30 14:20:12',4183,151,'2005-07-31 11:31:12',2,'2006-02-15 21:30:53'),(9254,'2005-07-30 14:26:11',495,33,'2005-08-04 16:12:11',1,'2006-02-15 21:30:53'),(9255,'2005-07-30 14:26:46',1596,23,'2005-08-07 18:16:46',1,'2006-02-15 21:30:53'),(9256,'2005-07-30 14:29:29',4021,19,'2005-08-05 16:59:29',1,'2006-02-15 21:30:53'),(9257,'2005-07-30 14:30:38',2615,466,'2005-08-04 17:57:38',1,'2006-02-15 21:30:53'),(9258,'2005-07-30 14:31:31',2007,275,'2005-08-05 16:29:31',2,'2006-02-15 21:30:53'),(9259,'2005-07-30 14:37:44',97,138,'2005-08-06 18:05:44',2,'2006-02-15 21:30:53'),(9260,'2005-07-30 14:38:22',3969,13,'2005-08-07 18:47:22',2,'2006-02-15 21:30:53'),(9261,'2005-07-30 14:39:35',372,380,'2005-08-08 11:26:35',1,'2006-02-15 21:30:53'),(9262,'2005-07-30 14:45:02',2322,349,'2005-08-05 15:18:02',2,'2006-02-15 21:30:53'),(9263,'2005-07-30 14:48:24',73,410,'2005-08-04 19:06:24',2,'2006-02-15 21:30:53'),(9264,'2005-07-30 14:51:36',4071,157,'2005-08-02 10:06:36',1,'2006-02-15 21:30:53'),(9265,'2005-07-30 14:55:25',3700,560,'2005-08-02 11:34:25',1,'2006-02-15 21:30:53'),(9266,'2005-07-30 14:59:01',1705,364,'2005-07-31 17:01:01',2,'2006-02-15 21:30:53'),(9267,'2005-07-30 14:59:05',645,409,'2005-08-04 10:17:05',1,'2006-02-15 21:30:53'),(9268,'2005-07-30 15:02:30',3593,592,'2005-08-05 12:50:30',1,'2006-02-15 21:30:53'),(9269,'2005-07-30 15:02:33',548,435,'2005-08-02 16:32:33',1,'2006-02-15 21:30:53'),(9270,'2005-07-30 15:03:16',700,232,'2005-07-31 16:09:16',2,'2006-02-15 21:30:53'),(9271,'2005-07-30 15:04:31',2660,100,'2005-07-31 20:33:31',1,'2006-02-15 21:30:53'),(9272,'2005-07-30 15:05:22',1352,553,'2005-08-05 10:02:22',2,'2006-02-15 21:30:53'),(9273,'2005-07-30 15:05:36',1867,497,'2005-08-08 09:07:36',1,'2006-02-15 21:30:53'),(9274,'2005-07-30 15:07:04',4424,47,'2005-08-06 11:17:04',2,'2006-02-15 21:30:53'),(9275,'2005-07-30 15:09:15',1916,439,'2005-07-31 10:23:15',2,'2006-02-15 21:30:53'),(9276,'2005-07-30 15:09:28',1528,237,'2005-08-06 19:39:28',1,'2006-02-15 21:30:53'),(9277,'2005-07-30 15:13:45',3734,82,'2005-08-05 10:25:45',2,'2006-02-15 21:30:53'),(9278,'2005-07-30 15:15:19',3782,581,'2005-08-03 20:21:19',1,'2006-02-15 21:30:53'),(9279,'2005-07-30 15:15:21',1070,567,'2005-08-07 18:46:21',1,'2006-02-15 21:30:53'),(9280,'2005-07-30 15:15:38',4103,286,'2005-08-05 19:20:38',2,'2006-02-15 21:30:53'),(9281,'2005-07-30 15:15:51',3086,398,'2005-08-05 12:58:51',1,'2006-02-15 21:30:53'),(9282,'2005-07-30 15:17:31',736,259,'2005-08-07 20:46:31',1,'2006-02-15 21:30:53'),(9283,'2005-07-30 15:25:19',1858,360,'2005-08-01 15:35:19',2,'2006-02-15 21:30:53'),(9284,'2005-07-30 15:25:19',3976,38,'2005-08-01 17:45:19',2,'2006-02-15 21:30:53'),(9285,'2005-07-30 15:26:08',3686,273,'2005-08-06 15:59:08',2,'2006-02-15 21:30:53'),(9286,'2005-07-30 15:32:28',2477,154,'2005-07-31 20:42:28',2,'2006-02-15 21:30:53'),(9287,'2005-07-30 15:35:39',2048,551,'2005-08-02 10:15:39',1,'2006-02-15 21:30:53'),(9288,'2005-07-30 15:56:39',2640,447,'2005-08-04 13:25:39',2,'2006-02-15 21:30:53'),(9289,'2005-07-30 15:57:04',389,453,'2005-08-07 18:46:04',1,'2006-02-15 21:30:53'),(9290,'2005-07-30 15:59:08',2275,500,'2005-08-06 21:49:08',2,'2006-02-15 21:30:53'),(9291,'2005-07-30 16:03:39',2884,406,'2005-08-05 11:11:39',2,'2006-02-15 21:30:53'),(9292,'2005-07-30 16:08:21',1702,11,'2005-08-07 10:38:21',2,'2006-02-15 21:30:53'),(9293,'2005-07-30 16:12:28',1676,65,'2005-08-05 18:34:28',2,'2006-02-15 21:30:53'),(9294,'2005-07-30 16:14:37',2468,433,'2005-08-07 18:49:37',1,'2006-02-15 21:30:53'),(9295,'2005-07-30 16:18:39',494,102,'2005-08-03 12:46:39',1,'2006-02-15 21:30:53'),(9296,'2005-07-30 16:21:13',4088,2,'2005-08-08 11:57:13',1,'2006-02-15 21:30:53'),(9297,'2005-07-30 16:26:29',3502,191,'2005-08-03 13:51:29',1,'2006-02-15 21:30:53'),(9298,'2005-07-30 16:27:53',2106,208,'2005-08-07 12:32:53',2,'2006-02-15 21:30:53'),(9299,'2005-07-30 16:32:51',1515,555,'2005-08-08 15:28:51',2,'2006-02-15 21:30:53'),(9300,'2005-07-30 16:33:12',1639,571,'2005-08-05 15:56:12',1,'2006-02-15 21:30:53'),(9301,'2005-07-30 16:34:29',1073,174,'2005-07-31 18:41:29',2,'2006-02-15 21:30:53'),(9302,'2005-07-30 16:34:57',2326,55,'2005-07-31 11:08:57',2,'2006-02-15 21:30:53'),(9303,'2005-07-30 16:35:59',4299,186,'2005-08-03 18:31:59',1,'2006-02-15 21:30:53'),(9304,'2005-07-30 16:41:34',2937,296,'2005-08-02 13:55:34',2,'2006-02-15 21:30:53'),(9305,'2005-07-30 16:45:56',1224,82,'2005-08-08 21:15:56',2,'2006-02-15 21:30:53'),(9306,'2005-07-30 16:47:17',3983,336,'2005-08-02 22:15:17',1,'2006-02-15 21:30:53'),(9307,'2005-07-30 16:52:43',3831,538,'2005-08-01 11:58:43',1,'2006-02-15 21:30:53'),(9308,'2005-07-30 16:53:21',2202,267,'2005-08-08 15:33:21',2,'2006-02-15 21:30:53'),(9309,'2005-07-30 16:55:53',3616,30,'2005-08-07 11:23:53',1,'2006-02-15 21:30:53'),(9310,'2005-07-30 16:57:09',2957,529,'2005-08-03 18:14:09',1,'2006-02-15 21:30:53'),(9311,'2005-07-30 16:58:31',1432,178,'2005-08-07 15:23:31',1,'2006-02-15 21:30:53'),(9312,'2005-07-30 16:59:17',2483,76,'2005-08-03 17:24:17',2,'2006-02-15 21:30:53'),(9313,'2005-07-30 16:59:43',4070,41,'2005-08-05 14:06:43',2,'2006-02-15 21:30:53'),(9314,'2005-07-30 17:05:19',2358,390,'2005-07-31 12:19:19',1,'2006-02-15 21:30:53'),(9315,'2005-07-30 17:05:29',444,96,'2005-08-01 12:47:29',1,'2006-02-15 21:30:53'),(9316,'2005-07-30 17:11:58',4409,366,'2005-08-05 14:36:58',1,'2006-02-15 21:30:53'),(9317,'2005-07-30 17:13:37',4138,217,'2005-08-08 11:33:37',1,'2006-02-15 21:30:53'),(9318,'2005-07-30 17:14:30',2426,314,'2005-08-06 16:53:30',1,'2006-02-15 21:30:53'),(9319,'2005-07-30 17:15:27',4066,136,'2005-08-03 14:03:27',1,'2006-02-15 21:30:53'),(9320,'2005-07-30 17:16:39',909,221,'2005-08-06 18:43:39',2,'2006-02-15 21:30:53'),(9321,'2005-07-30 17:19:44',3558,112,'2005-08-06 22:42:44',2,'2006-02-15 21:30:53'),(9322,'2005-07-30 17:21:39',223,439,'2005-08-06 16:58:39',2,'2006-02-15 21:30:53'),(9323,'2005-07-30 17:21:44',3749,131,'2005-08-03 16:28:44',1,'2006-02-15 21:30:53'),(9324,'2005-07-30 17:28:52',1231,332,'2005-08-06 19:02:52',1,'2006-02-15 21:30:53'),(9325,'2005-07-30 17:29:19',1938,476,'2005-08-08 12:55:19',2,'2006-02-15 21:30:53'),(9326,'2005-07-30 17:30:03',3772,588,'2005-08-01 13:41:03',2,'2006-02-15 21:30:53'),(9327,'2005-07-30 17:31:03',345,373,'2005-08-08 19:16:03',1,'2006-02-15 21:30:53'),(9328,'2005-07-30 17:32:11',1087,89,'2005-08-05 13:36:11',1,'2006-02-15 21:30:53'),(9329,'2005-07-30 17:42:38',1293,593,'2005-08-08 23:17:38',1,'2006-02-15 21:30:53'),(9330,'2005-07-30 17:44:24',4227,232,'2005-08-08 17:39:24',1,'2006-02-15 21:30:53'),(9331,'2005-07-30 17:46:50',2248,274,'2005-08-01 19:03:50',1,'2006-02-15 21:30:53'),(9332,'2005-07-30 17:53:39',1156,480,'2005-08-02 12:25:39',1,'2006-02-15 21:30:53'),(9333,'2005-07-30 17:53:45',1377,437,'2005-07-31 22:35:45',2,'2006-02-15 21:30:53'),(9334,'2005-07-30 17:56:38',1499,25,'2005-08-03 21:27:38',1,'2006-02-15 21:30:53'),(9335,'2005-07-30 18:00:53',1006,522,'2005-08-01 16:05:53',1,'2006-02-15 21:30:53'),(9336,'2005-07-30 18:01:15',1911,557,'2005-08-05 23:10:15',1,'2006-02-15 21:30:53'),(9337,'2005-07-30 18:02:25',2363,90,'2005-07-31 12:30:25',2,'2006-02-15 21:30:53'),(9338,'2005-07-30 18:03:13',1482,333,'2005-08-08 23:57:13',2,'2006-02-15 21:30:53'),(9339,'2005-07-30 18:03:28',3171,68,'2005-08-08 19:45:28',2,'2006-02-15 21:30:53'),(9340,'2005-07-30 18:07:16',3228,213,'2005-08-04 14:33:16',2,'2006-02-15 21:30:53'),(9341,'2005-07-30 18:07:58',894,557,'2005-08-01 17:43:58',1,'2006-02-15 21:30:53'),(9342,'2005-07-30 18:09:56',2318,552,'2005-08-08 13:54:56',2,'2006-02-15 21:30:53'),(9343,'2005-07-30 18:13:13',3521,53,'2005-08-02 13:48:13',1,'2006-02-15 21:30:53'),(9344,'2005-07-30 18:13:45',1005,396,'2005-08-07 15:23:45',2,'2006-02-15 21:30:53'),(9345,'2005-07-30 18:13:51',2042,436,'2005-08-07 13:45:51',2,'2006-02-15 21:30:53'),(9346,'2005-07-30 18:13:52',2845,196,'2005-08-03 17:58:52',1,'2006-02-15 21:30:53'),(9347,'2005-07-30 18:16:03',3557,479,'2005-08-05 18:35:03',1,'2006-02-15 21:30:53'),(9348,'2005-07-30 18:17:09',3128,87,'2005-08-07 15:25:09',1,'2006-02-15 21:30:53'),(9349,'2005-07-30 18:20:08',3739,579,'2005-08-08 22:06:08',1,'2006-02-15 21:30:53'),(9350,'2005-07-30 18:24:30',798,434,'2005-08-02 15:34:30',2,'2006-02-15 21:30:53'),(9351,'2005-07-30 18:28:30',2063,107,'2005-08-02 17:26:30',1,'2006-02-15 21:30:53'),(9352,'2005-07-30 18:29:26',2619,360,'2005-07-31 19:43:26',1,'2006-02-15 21:30:53'),(9353,'2005-07-30 18:30:37',3581,283,'2005-08-06 22:32:37',2,'2006-02-15 21:30:53'),(9354,'2005-07-30 18:32:51',510,595,'2005-08-02 21:28:51',2,'2006-02-15 21:30:53'),(9355,'2005-07-30 18:35:25',1122,201,'2005-08-03 20:33:25',2,'2006-02-15 21:30:53'),(9356,'2005-07-30 18:36:24',4188,60,'2005-08-03 14:10:24',1,'2006-02-15 21:30:53'),(9357,'2005-07-30 18:37:00',3927,181,'2005-08-08 19:57:00',2,'2006-02-15 21:30:53'),(9358,'2005-07-30 18:37:24',712,302,'2005-08-07 23:34:24',2,'2006-02-15 21:30:53'),(9359,'2005-07-30 18:39:28',21,501,'2005-07-31 15:39:28',1,'2006-02-15 21:30:53'),(9360,'2005-07-30 18:39:43',2119,186,'2005-08-04 22:41:43',2,'2006-02-15 21:30:53'),(9361,'2005-07-30 18:43:49',4163,335,'2005-08-06 21:24:49',1,'2006-02-15 21:30:53'),(9362,'2005-07-30 18:44:16',3357,420,'2005-08-01 20:14:16',1,'2006-02-15 21:30:53'),(9363,'2005-07-30 18:44:23',873,323,'2005-08-04 15:03:23',1,'2006-02-15 21:30:53'),(9364,'2005-07-30 18:44:44',306,87,'2005-08-08 23:55:44',2,'2006-02-15 21:30:53'),(9365,'2005-07-30 18:46:02',1539,232,'2005-08-03 20:15:02',1,'2006-02-15 21:30:53'),(9366,'2005-07-30 18:48:57',4013,557,'2005-08-03 15:17:57',2,'2006-02-15 21:30:53'),(9367,'2005-07-30 18:49:58',793,557,'2005-08-08 22:04:58',1,'2006-02-15 21:30:53'),(9368,'2005-07-30 18:50:53',3026,388,'2005-08-05 17:56:53',2,'2006-02-15 21:30:53'),(9369,'2005-07-30 18:52:19',3538,36,'2005-08-01 12:53:19',1,'2006-02-15 21:30:53'),(9370,'2005-07-30 18:57:29',4433,588,'2005-08-01 21:35:29',2,'2006-02-15 21:30:53'),(9371,'2005-07-30 18:58:00',2980,4,'2005-08-03 15:14:00',1,'2006-02-15 21:30:53'),(9372,'2005-07-30 19:04:30',4075,454,'2005-08-09 00:18:30',2,'2006-02-15 21:30:53'),(9373,'2005-07-30 19:05:36',3478,180,'2005-08-05 16:16:36',2,'2006-02-15 21:30:53'),(9374,'2005-07-30 19:10:03',103,302,'2005-08-06 21:54:03',2,'2006-02-15 21:30:53'),(9375,'2005-07-30 19:10:17',3063,529,'2005-08-02 23:00:17',1,'2006-02-15 21:30:53'),(9376,'2005-07-30 19:11:49',451,86,'2005-08-04 18:14:49',1,'2006-02-15 21:30:53'),(9377,'2005-07-30 19:12:18',4164,421,'2005-08-05 19:38:18',1,'2006-02-15 21:30:53'),(9378,'2005-07-30 19:12:54',2209,197,'2005-08-05 18:16:54',1,'2006-02-15 21:30:53'),(9379,'2005-07-30 19:13:01',3855,452,'2005-08-07 19:18:01',2,'2006-02-15 21:30:53'),(9380,'2005-07-30 19:17:31',4403,264,'2005-08-01 20:46:31',1,'2006-02-15 21:30:53'),(9381,'2005-07-30 19:23:04',4064,329,'2005-07-31 23:37:04',2,'2006-02-15 21:30:53'),(9382,'2005-07-30 19:23:44',2127,17,'2005-08-06 16:20:44',2,'2006-02-15 21:30:53'),(9383,'2005-07-30 19:24:50',2806,416,'2005-08-01 21:41:50',2,'2006-02-15 21:30:53'),(9384,'2005-07-30 19:25:35',2313,220,'2005-08-08 21:50:35',1,'2006-02-15 21:30:53'),(9385,'2005-07-30 19:25:49',3453,570,'2005-08-08 17:08:49',2,'2006-02-15 21:30:53'),(9386,'2005-07-30 19:26:21',1123,189,'2005-08-05 21:00:21',2,'2006-02-15 21:30:53'),(9387,'2005-07-30 19:27:05',577,495,'2005-08-07 21:19:05',2,'2006-02-15 21:30:53'),(9388,'2005-07-30 19:27:22',2116,332,'2005-08-08 15:31:22',2,'2006-02-15 21:30:53'),(9389,'2005-07-30 19:27:59',3124,198,'2005-08-04 18:25:59',2,'2006-02-15 21:30:53'),(9390,'2005-07-30 19:42:07',1794,103,'2005-08-01 23:17:07',1,'2006-02-15 21:30:53'),(9391,'2005-07-30 19:48:41',665,273,'2005-08-04 15:27:41',1,'2006-02-15 21:30:53'),(9392,'2005-07-30 19:50:13',2797,29,'2005-08-03 22:38:13',2,'2006-02-15 21:30:53'),(9393,'2005-07-30 20:04:48',843,158,'2005-08-02 15:52:48',2,'2006-02-15 21:30:53'),(9394,'2005-07-30 20:06:24',161,204,'2005-08-06 22:36:24',1,'2006-02-15 21:30:53'),(9395,'2005-07-30 20:07:06',1298,306,'2005-08-08 21:21:06',1,'2006-02-15 21:30:53'),(9396,'2005-07-30 20:07:24',1250,91,'2005-08-03 21:20:24',2,'2006-02-15 21:30:53'),(9397,'2005-07-30 20:07:29',1550,373,'2005-08-05 00:36:29',1,'2006-02-15 21:30:53'),(9398,'2005-07-30 20:09:00',1175,570,'2005-08-01 23:35:00',2,'2006-02-15 21:30:53'),(9399,'2005-07-30 20:14:50',3668,569,'2005-08-03 17:30:50',1,'2006-02-15 21:30:53'),(9400,'2005-07-30 20:15:58',3910,368,'2005-08-03 21:21:58',1,'2006-02-15 21:30:53'),(9401,'2005-07-30 20:18:19',2057,331,'2005-08-07 15:46:19',1,'2006-02-15 21:30:53'),(9402,'2005-07-30 20:18:27',2424,48,'2005-08-07 21:29:27',2,'2006-02-15 21:30:53'),(9403,'2005-07-30 20:18:53',3466,267,'2005-08-06 19:54:53',1,'2006-02-15 21:30:53'),(9404,'2005-07-30 20:21:35',3832,140,'2005-08-02 15:52:35',1,'2006-02-15 21:30:53'),(9405,'2005-07-30 20:22:17',1983,463,'2005-08-08 16:55:17',1,'2006-02-15 21:30:53'),(9406,'2005-07-30 20:24:00',3419,453,'2005-08-07 19:50:00',1,'2006-02-15 21:30:53'),(9407,'2005-07-30 20:25:24',2594,585,'2005-08-08 22:51:24',2,'2006-02-15 21:30:53'),(9408,'2005-07-30 20:32:09',4383,571,'2005-08-04 20:14:09',2,'2006-02-15 21:30:53'),(9409,'2005-07-30 20:33:53',3053,156,'2005-08-05 18:32:53',2,'2006-02-15 21:30:53'),(9410,'2005-07-30 20:38:05',1789,22,'2005-07-31 19:57:05',2,'2006-02-15 21:30:53'),(9411,'2005-07-30 20:38:22',3484,536,'2005-08-06 01:23:22',2,'2006-02-15 21:30:53'),(9412,'2005-07-30 20:44:10',2482,522,'2005-08-06 21:13:10',2,'2006-02-15 21:30:53'),(9413,'2005-07-30 20:44:39',2618,290,'2005-08-01 01:56:39',2,'2006-02-15 21:30:53'),(9414,'2005-07-30 20:46:02',578,484,'2005-08-07 21:23:02',2,'2006-02-15 21:30:53'),(9415,'2005-07-30 20:48:31',3336,139,'2005-08-05 19:45:31',2,'2006-02-15 21:30:53'),(9416,'2005-07-30 20:52:45',1470,265,'2005-08-02 17:38:45',2,'2006-02-15 21:30:53'),(9417,'2005-07-30 20:54:55',2509,519,'2005-08-04 00:54:55',2,'2006-02-15 21:30:53'),(9418,'2005-07-30 21:00:52',241,168,'2005-08-08 15:56:52',2,'2006-02-15 21:30:53'),(9419,'2005-07-30 21:04:59',4427,142,'2005-08-06 15:47:59',2,'2006-02-15 21:30:53'),(9420,'2005-07-30 21:05:18',147,72,'2005-08-05 23:52:18',2,'2006-02-15 21:30:53'),(9421,'2005-07-30 21:08:32',2206,161,'2005-08-02 00:43:32',1,'2006-02-15 21:30:53'),(9422,'2005-07-30 21:08:41',1843,470,'2005-08-07 15:55:41',1,'2006-02-15 21:30:53'),(9423,'2005-07-30 21:10:14',3145,242,'2005-08-07 16:34:14',2,'2006-02-15 21:30:53'),(9424,'2005-07-30 21:10:56',4499,256,'2005-08-05 00:01:56',1,'2006-02-15 21:30:53'),(9425,'2005-07-30 21:11:21',271,295,'2005-08-05 19:00:21',1,'2006-02-15 21:30:53'),(9427,'2005-07-30 21:16:33',1494,85,'2005-08-05 17:23:33',2,'2006-02-15 21:30:53'),(9428,'2005-07-30 21:18:37',1948,335,'2005-08-05 16:09:37',1,'2006-02-15 21:30:53'),(9429,'2005-07-30 21:19:26',1769,288,'2005-08-07 18:39:26',1,'2006-02-15 21:30:53'),(9430,'2005-07-30 21:20:13',1529,367,'2005-08-04 21:45:13',2,'2006-02-15 21:30:53'),(9431,'2005-07-30 21:24:22',3364,39,'2005-08-03 01:22:22',2,'2006-02-15 21:30:53'),(9432,'2005-07-30 21:26:18',2489,570,'2005-08-05 00:23:18',1,'2006-02-15 21:30:53'),(9433,'2005-07-30 21:28:17',1082,128,'2005-08-08 18:20:17',2,'2006-02-15 21:30:53'),(9434,'2005-07-30 21:29:41',3792,13,'2005-08-01 16:30:41',2,'2006-02-15 21:30:53'),(9435,'2005-07-30 21:31:02',3116,301,'2005-08-05 22:34:02',1,'2006-02-15 21:30:53'),(9436,'2005-07-30 21:33:01',2329,268,'2005-08-06 17:38:01',1,'2006-02-15 21:30:53'),(9437,'2005-07-30 21:36:04',1230,592,'2005-08-08 01:26:04',1,'2006-02-15 21:30:53'),(9438,'2005-07-30 21:36:15',121,14,'2005-08-07 16:54:15',2,'2006-02-15 21:30:53'),(9439,'2005-07-30 21:38:12',290,479,'2005-08-06 00:03:12',1,'2006-02-15 21:30:53'),(9440,'2005-07-30 21:40:15',414,535,'2005-08-04 15:45:15',2,'2006-02-15 21:30:53'),(9441,'2005-07-30 21:43:28',3982,519,'2005-08-08 16:57:28',1,'2006-02-15 21:30:53'),(9442,'2005-07-30 21:44:31',44,75,'2005-08-04 01:29:31',1,'2006-02-15 21:30:53'),(9443,'2005-07-30 21:45:46',1675,3,'2005-08-05 21:22:46',1,'2006-02-15 21:30:53'),(9444,'2005-07-30 21:48:44',1134,259,'2005-08-08 22:36:44',2,'2006-02-15 21:30:53'),(9445,'2005-07-30 21:50:42',1480,549,'2005-08-05 18:34:42',2,'2006-02-15 21:30:53'),(9446,'2005-07-30 21:53:01',1880,477,'2005-08-06 19:00:01',2,'2006-02-15 21:30:53'),(9447,'2005-07-30 21:54:22',1053,82,'2005-08-09 01:07:22',2,'2006-02-15 21:30:53'),(9448,'2005-07-30 21:56:13',1213,278,'2005-08-04 18:03:13',1,'2006-02-15 21:30:53'),(9449,'2005-07-30 22:02:34',2,581,'2005-08-06 02:09:34',1,'2006-02-15 21:30:53'),(9450,'2005-07-30 22:04:04',1371,430,'2005-08-05 18:39:04',2,'2006-02-15 21:30:53'),(9451,'2005-07-30 22:10:17',685,584,'2005-08-07 02:53:17',2,'2006-02-15 21:30:53'),(9452,'2005-07-30 22:19:16',3178,130,'2005-08-04 19:26:16',1,'2006-02-15 21:30:53'),(9453,'2005-07-30 22:20:04',1988,221,'2005-08-08 02:27:04',1,'2006-02-15 21:30:53'),(9454,'2005-07-30 22:20:09',3028,81,'2005-08-04 01:33:09',2,'2006-02-15 21:30:53'),(9455,'2005-07-30 22:20:29',2647,220,'2005-08-08 20:08:29',1,'2006-02-15 21:30:53'),(9456,'2005-07-30 22:22:16',2068,534,'2005-08-05 18:56:16',2,'2006-02-15 21:30:53'),(9457,'2005-07-30 22:23:05',2172,487,'2005-07-31 23:07:05',2,'2006-02-15 21:30:53'),(9458,'2005-07-30 22:24:34',3105,343,'2005-08-04 21:26:34',2,'2006-02-15 21:30:53'),(9459,'2005-07-30 22:24:46',1132,489,'2005-08-02 00:44:46',2,'2006-02-15 21:30:53'),(9460,'2005-07-30 22:25:39',4463,580,'2005-08-08 20:56:39',2,'2006-02-15 21:30:53'),(9461,'2005-07-30 22:29:13',1679,377,'2005-08-05 20:55:13',2,'2006-02-15 21:30:53'),(9462,'2005-07-30 22:30:44',4090,192,'2005-08-09 03:54:44',2,'2006-02-15 21:30:53'),(9463,'2005-07-30 22:30:57',883,352,'2005-08-03 22:53:57',1,'2006-02-15 21:30:53'),(9464,'2005-07-30 22:31:31',3904,534,'2005-08-07 01:10:31',2,'2006-02-15 21:30:53'),(9465,'2005-07-30 22:39:53',3084,2,'2005-08-06 16:43:53',2,'2006-02-15 21:30:53'),(9466,'2005-07-30 22:44:36',2595,137,'2005-08-07 02:35:36',2,'2006-02-15 21:30:53'),(9467,'2005-07-30 22:45:34',1905,202,'2005-08-08 00:58:34',2,'2006-02-15 21:30:53'),(9468,'2005-07-30 22:53:52',4366,20,'2005-08-07 00:22:52',2,'2006-02-15 21:30:53'),(9469,'2005-07-30 22:56:34',967,59,'2005-08-07 03:16:34',2,'2006-02-15 21:30:53'),(9470,'2005-07-30 23:01:31',3908,566,'2005-08-07 01:35:31',2,'2006-02-15 21:30:53'),(9471,'2005-07-30 23:02:36',2390,424,'2005-08-04 17:49:36',1,'2006-02-15 21:30:53'),(9472,'2005-07-30 23:03:32',4178,404,'2005-08-01 18:02:32',1,'2006-02-15 21:30:53'),(9473,'2005-07-30 23:04:13',1717,185,'2005-08-04 21:48:13',2,'2006-02-15 21:30:53'),(9474,'2005-07-30 23:05:44',3771,206,'2005-08-05 23:46:44',1,'2006-02-15 21:30:53'),(9475,'2005-07-30 23:06:33',2186,567,'2005-08-04 23:23:33',1,'2006-02-15 21:30:53'),(9476,'2005-07-30 23:06:40',3599,197,'2005-08-04 22:52:40',2,'2006-02-15 21:30:53'),(9477,'2005-07-30 23:07:22',1932,213,'2005-08-04 20:54:22',1,'2006-02-15 21:30:53'),(9478,'2005-07-30 23:12:53',1139,283,'2005-08-04 02:41:53',1,'2006-02-15 21:30:53'),(9479,'2005-07-30 23:22:09',3461,308,'2005-07-31 22:26:09',2,'2006-02-15 21:30:53'),(9480,'2005-07-30 23:26:03',597,373,'2005-08-04 21:18:03',2,'2006-02-15 21:30:53'),(9481,'2005-07-30 23:26:05',613,481,'2005-08-04 17:46:05',1,'2006-02-15 21:30:53'),(9482,'2005-07-30 23:29:16',2421,348,'2005-08-02 20:37:16',2,'2006-02-15 21:30:53'),(9483,'2005-07-30 23:31:31',1136,593,'2005-08-09 04:29:31',2,'2006-02-15 21:30:53'),(9484,'2005-07-30 23:31:40',3389,26,'2005-08-02 18:25:40',1,'2006-02-15 21:30:53'),(9485,'2005-07-30 23:32:40',3722,338,'2005-08-08 17:44:40',1,'2006-02-15 21:30:53'),(9486,'2005-07-30 23:35:42',2787,403,'2005-08-09 02:08:42',2,'2006-02-15 21:30:53'),(9487,'2005-07-30 23:40:22',2165,406,'2005-08-01 22:29:22',1,'2006-02-15 21:30:53'),(9488,'2005-07-30 23:42:42',4221,528,'2005-08-08 22:15:42',1,'2006-02-15 21:30:53'),(9489,'2005-07-30 23:43:32',4011,17,'2005-07-31 20:45:32',2,'2006-02-15 21:30:53'),(9490,'2005-07-30 23:45:09',1302,487,'2005-08-07 18:50:09',1,'2006-02-15 21:30:53'),(9491,'2005-07-30 23:45:23',3624,179,'2005-08-01 00:33:23',2,'2006-02-15 21:30:53'),(9492,'2005-07-30 23:52:21',639,126,'2005-08-08 20:50:21',2,'2006-02-15 21:30:53'),(9493,'2005-07-30 23:52:30',1522,5,'2005-08-08 05:22:30',1,'2006-02-15 21:30:53'),(9494,'2005-07-30 23:52:46',3799,254,'2005-08-05 23:13:46',2,'2006-02-15 21:30:53'),(9495,'2005-07-30 23:54:26',2128,397,'2005-08-01 22:02:26',2,'2006-02-15 21:30:53'),(9496,'2005-07-30 23:55:20',453,125,'2005-08-02 02:47:20',2,'2006-02-15 21:30:53'),(9497,'2005-07-30 23:56:54',933,595,'2005-08-04 19:52:54',1,'2006-02-15 21:30:53'),(9498,'2005-07-30 23:56:55',1035,289,'2005-08-03 18:34:55',2,'2006-02-15 21:30:53'),(9499,'2005-07-30 23:58:30',602,461,'2005-08-01 00:55:30',2,'2006-02-15 21:30:53'),(9500,'2005-07-30 23:58:36',2808,241,'2005-08-07 21:08:36',2,'2006-02-15 21:30:53'),(9501,'2005-07-30 23:59:21',4398,75,'2005-08-05 19:50:21',2,'2006-02-15 21:30:53'),(9502,'2005-07-31 00:02:10',2700,471,'2005-08-01 19:47:10',1,'2006-02-15 21:30:53'),(9503,'2005-07-31 00:02:38',1013,311,'2005-08-06 06:01:38',1,'2006-02-15 21:30:53'),(9504,'2005-07-31 00:09:07',91,125,'2005-08-02 05:44:07',1,'2006-02-15 21:30:53'),(9505,'2005-07-31 00:11:19',4047,543,'2005-08-05 18:24:19',2,'2006-02-15 21:30:53'),(9506,'2005-07-31 00:19:01',3872,189,'2005-08-02 00:20:01',1,'2006-02-15 21:30:53'),(9507,'2005-07-31 00:22:29',387,525,'2005-08-07 05:59:29',2,'2006-02-15 21:30:53'),(9508,'2005-07-31 00:22:39',1204,316,'2005-08-04 05:40:39',1,'2006-02-15 21:30:53'),(9509,'2005-07-31 00:22:42',818,320,'2005-08-03 23:24:42',1,'2006-02-15 21:30:53'),(9510,'2005-07-31 00:24:17',2301,494,'2005-08-08 18:47:17',2,'2006-02-15 21:30:53'),(9511,'2005-07-31 00:25:05',964,549,'2005-08-09 02:46:05',1,'2006-02-15 21:30:53'),(9512,'2005-07-31 00:26:30',3786,173,'2005-08-04 23:43:30',2,'2006-02-15 21:30:53'),(9513,'2005-07-31 00:28:30',396,317,'2005-08-01 00:22:30',2,'2006-02-15 21:30:53'),(9514,'2005-07-31 00:29:44',1892,243,'2005-08-02 23:49:44',1,'2006-02-15 21:30:53'),(9515,'2005-07-31 00:35:05',3099,264,'2005-08-02 23:35:05',2,'2006-02-15 21:30:53'),(9516,'2005-07-31 00:40:58',3519,424,'2005-08-07 02:13:58',2,'2006-02-15 21:30:53'),(9517,'2005-07-31 00:41:23',3299,170,'2005-08-02 23:08:23',1,'2006-02-15 21:30:53'),(9518,'2005-07-31 00:43:26',2714,215,'2005-08-04 19:12:26',2,'2006-02-15 21:30:53'),(9519,'2005-07-31 00:45:57',3767,235,'2005-08-06 00:59:57',2,'2006-02-15 21:30:53'),(9520,'2005-07-31 00:50:54',1306,299,'2005-08-04 20:05:54',1,'2006-02-15 21:30:53'),(9521,'2005-07-31 00:52:24',1423,227,'2005-08-06 03:33:24',2,'2006-02-15 21:30:53'),(9522,'2005-07-31 00:55:11',4266,294,'2005-08-03 06:41:11',2,'2006-02-15 21:30:53'),(9523,'2005-07-31 00:56:09',891,356,'2005-08-05 05:44:09',2,'2006-02-15 21:30:53'),(9524,'2005-07-31 01:01:06',1796,535,'2005-08-04 04:06:06',2,'2006-02-15 21:30:53'),(9525,'2005-07-31 01:02:18',2990,246,'2005-08-06 21:31:18',1,'2006-02-15 21:30:53'),(9526,'2005-07-31 01:02:22',417,342,'2005-08-04 03:00:22',1,'2006-02-15 21:30:53'),(9527,'2005-07-31 01:02:24',2539,200,'2005-08-09 02:08:24',2,'2006-02-15 21:30:53'),(9528,'2005-07-31 01:05:04',193,241,'2005-08-07 01:16:04',1,'2006-02-15 21:30:53'),(9529,'2005-07-31 01:05:26',816,123,'2005-08-02 22:30:26',2,'2006-02-15 21:30:53'),(9530,'2005-07-31 01:09:06',1718,148,'2005-08-04 23:47:06',2,'2006-02-15 21:30:53'),(9531,'2005-07-31 01:11:53',4550,268,'2005-08-07 02:49:53',1,'2006-02-15 21:30:53'),(9532,'2005-07-31 01:16:51',1309,488,'2005-08-01 20:23:51',1,'2006-02-15 21:30:53'),(9533,'2005-07-31 01:18:10',4156,522,'2005-08-07 19:58:10',1,'2006-02-15 21:30:53'),(9534,'2005-07-31 01:18:27',4457,519,'2005-08-06 00:28:27',1,'2006-02-15 21:30:53'),(9535,'2005-07-31 01:18:53',2413,485,'2005-08-04 03:04:53',2,'2006-02-15 21:30:53'),(9536,'2005-07-31 01:19:02',2547,310,'2005-08-02 19:38:02',1,'2006-02-15 21:30:53'),(9537,'2005-07-31 01:23:00',546,488,'2005-08-01 01:16:00',2,'2006-02-15 21:30:53'),(9538,'2005-07-31 01:25:22',3402,68,'2005-08-06 00:10:22',2,'2006-02-15 21:30:53'),(9539,'2005-07-31 01:36:19',3793,436,'2005-08-04 23:47:19',1,'2006-02-15 21:30:53'),(9540,'2005-07-31 01:40:06',2200,365,'2005-08-01 01:09:06',1,'2006-02-15 21:30:53'),(9541,'2005-07-31 01:40:14',1774,422,'2005-08-05 06:34:14',2,'2006-02-15 21:30:53'),(9542,'2005-07-31 01:41:48',2243,595,'2005-08-01 00:49:48',2,'2006-02-15 21:30:53'),(9543,'2005-07-31 01:43:34',956,369,'2005-08-01 06:49:34',1,'2006-02-15 21:30:53'),(9544,'2005-07-31 01:44:51',2383,28,'2005-08-05 05:25:51',2,'2006-02-15 21:30:53'),(9545,'2005-07-31 01:46:24',3451,594,'2005-08-09 06:11:24',1,'2006-02-15 21:30:53'),(9546,'2005-07-31 01:47:40',211,63,'2005-08-02 07:25:40',2,'2006-02-15 21:30:53'),(9547,'2005-07-31 01:52:34',2414,440,'2005-08-03 23:12:34',2,'2006-02-15 21:30:53'),(9548,'2005-07-31 01:54:19',3038,576,'2005-08-05 00:50:19',2,'2006-02-15 21:30:53'),(9549,'2005-07-31 01:57:04',2409,63,'2005-08-07 21:00:04',2,'2006-02-15 21:30:53'),(9550,'2005-07-31 01:57:34',2233,583,'2005-08-08 23:33:34',1,'2006-02-15 21:30:53'),(9551,'2005-07-31 02:04:58',1260,30,'2005-08-06 04:07:58',2,'2006-02-15 21:30:53'),(9552,'2005-07-31 02:05:32',3544,261,'2005-08-01 06:59:32',1,'2006-02-15 21:30:53'),(9553,'2005-07-31 02:06:34',4187,579,'2005-08-08 02:20:34',1,'2006-02-15 21:30:53'),(9554,'2005-07-31 02:06:49',2581,490,'2005-08-01 22:27:49',1,'2006-02-15 21:30:53'),(9555,'2005-07-31 02:11:16',2108,382,'2005-08-03 06:58:16',2,'2006-02-15 21:30:53'),(9556,'2005-07-31 02:13:30',3269,521,'2005-08-08 06:46:30',1,'2006-02-15 21:30:53'),(9557,'2005-07-31 02:14:01',708,328,'2005-08-05 23:55:01',1,'2006-02-15 21:30:53'),(9558,'2005-07-31 02:14:35',1161,418,'2005-08-06 03:00:35',1,'2006-02-15 21:30:53'),(9559,'2005-07-31 02:15:53',2882,159,'2005-08-08 02:38:53',1,'2006-02-15 21:30:53'),(9560,'2005-07-31 02:17:27',4236,471,'2005-08-07 03:33:27',1,'2006-02-15 21:30:53'),(9561,'2005-07-31 02:22:13',1079,58,'2005-08-03 07:00:13',2,'2006-02-15 21:30:53'),(9562,'2005-07-31 02:23:20',1571,116,'2005-08-06 21:01:20',2,'2006-02-15 21:30:53'),(9563,'2005-07-31 02:28:39',3858,167,'2005-08-05 22:10:39',1,'2006-02-15 21:30:53'),(9564,'2005-07-31 02:31:37',383,377,'2005-08-03 22:57:37',2,'2006-02-15 21:30:53'),(9565,'2005-07-31 02:32:00',3621,485,'2005-08-04 05:45:00',1,'2006-02-15 21:30:53'),(9566,'2005-07-31 02:32:10',643,346,'2005-08-02 23:54:10',2,'2006-02-15 21:30:53'),(9567,'2005-07-31 02:36:11',3688,37,'2005-08-07 01:19:11',2,'2006-02-15 21:30:53'),(9568,'2005-07-31 02:37:44',1248,358,'2005-08-02 07:07:44',2,'2006-02-15 21:30:53'),(9569,'2005-07-31 02:39:38',813,405,'2005-08-02 05:09:38',2,'2006-02-15 21:30:53'),(9570,'2005-07-31 02:40:37',591,385,'2005-08-01 01:59:37',1,'2006-02-15 21:30:53'),(9571,'2005-07-31 02:42:18',2219,1,'2005-08-02 23:26:18',2,'2006-02-15 21:30:53'),(9572,'2005-07-31 02:44:10',1453,283,'2005-08-01 03:30:10',2,'2006-02-15 21:30:53'),(9573,'2005-07-31 02:45:38',3745,59,'2005-08-09 04:31:38',2,'2006-02-15 21:30:53'),(9574,'2005-07-31 02:49:20',2782,233,'2005-08-05 02:36:20',2,'2006-02-15 21:30:53'),(9575,'2005-07-31 02:51:53',3971,193,'2005-08-03 20:54:53',2,'2006-02-15 21:30:53'),(9576,'2005-07-31 02:52:59',3327,145,'2005-08-05 23:35:59',2,'2006-02-15 21:30:53'),(9577,'2005-07-31 02:53:33',2423,526,'2005-08-07 05:56:33',1,'2006-02-15 21:30:53'),(9578,'2005-07-31 02:54:31',2965,115,'2005-08-02 02:48:31',1,'2006-02-15 21:30:53'),(9579,'2005-07-31 02:59:20',3547,35,'2005-08-06 03:52:20',2,'2006-02-15 21:30:53'),(9580,'2005-07-31 03:01:11',532,22,'2005-08-05 06:01:11',1,'2006-02-15 21:30:53'),(9581,'2005-07-31 03:03:07',2588,302,'2005-08-05 23:01:07',1,'2006-02-15 21:30:53'),(9582,'2005-07-31 03:05:19',3913,347,'2005-08-04 07:26:19',1,'2006-02-15 21:30:53'),(9583,'2005-07-31 03:05:21',3543,568,'2005-08-06 00:14:21',2,'2006-02-15 21:30:53'),(9584,'2005-07-31 03:05:48',419,141,'2005-08-01 05:50:48',2,'2006-02-15 21:30:53'),(9585,'2005-07-31 03:05:55',3249,197,'2005-08-02 23:54:55',2,'2006-02-15 21:30:53'),(9586,'2005-07-31 03:07:16',3987,415,'2005-08-04 00:39:16',1,'2006-02-15 21:30:53'),(9587,'2005-07-31 03:10:30',2966,235,'2005-08-06 06:54:30',2,'2006-02-15 21:30:53'),(9588,'2005-07-31 03:13:13',1368,499,'2005-08-02 04:06:13',1,'2006-02-15 21:30:53'),(9589,'2005-07-31 03:13:29',2604,574,'2005-08-09 01:51:29',2,'2006-02-15 21:30:53'),(9590,'2005-07-31 03:17:16',2293,585,'2005-08-08 04:24:16',1,'2006-02-15 21:30:53'),(9591,'2005-07-31 03:19:28',504,97,'2005-08-01 07:30:28',1,'2006-02-15 21:30:53'),(9592,'2005-07-31 03:21:16',1828,14,'2005-08-05 08:32:16',1,'2006-02-15 21:30:53'),(9593,'2005-07-31 03:22:30',1223,28,'2005-08-05 08:23:30',1,'2006-02-15 21:30:53'),(9594,'2005-07-31 03:23:52',4382,148,'2005-08-04 23:06:52',1,'2006-02-15 21:30:53'),(9595,'2005-07-31 03:27:58',2829,3,'2005-08-03 05:58:58',1,'2006-02-15 21:30:53'),(9596,'2005-07-31 03:28:47',2847,55,'2005-08-04 03:43:47',2,'2006-02-15 21:30:53'),(9597,'2005-07-31 03:29:07',3317,61,'2005-08-09 03:33:07',2,'2006-02-15 21:30:53'),(9598,'2005-07-31 03:30:41',1105,468,'2005-08-04 03:54:41',1,'2006-02-15 21:30:53'),(9599,'2005-07-31 03:32:06',3164,502,'2005-08-04 07:47:06',2,'2006-02-15 21:30:53'),(9600,'2005-07-31 03:35:34',3731,464,'2005-08-08 22:50:34',1,'2006-02-15 21:30:53'),(9601,'2005-07-31 03:42:17',1592,553,'2005-08-04 02:02:17',2,'2006-02-15 21:30:53'),(9602,'2005-07-31 03:42:51',3173,386,'2005-08-01 08:39:51',1,'2006-02-15 21:30:53'),(9603,'2005-07-31 03:43:43',2266,541,'2005-08-02 00:11:43',2,'2006-02-15 21:30:53'),(9604,'2005-07-31 03:47:12',4342,580,'2005-08-03 06:48:12',1,'2006-02-15 21:30:53'),(9605,'2005-07-31 03:50:07',1477,94,'2005-08-07 09:15:07',2,'2006-02-15 21:30:53'),(9606,'2005-07-31 03:50:46',1357,253,'2005-08-01 05:29:46',2,'2006-02-15 21:30:53'),(9607,'2005-07-31 03:51:06',3414,294,'2005-08-02 00:18:06',2,'2006-02-15 21:30:53'),(9608,'2005-07-31 03:51:52',363,397,'2005-08-06 05:38:52',2,'2006-02-15 21:30:53'),(9609,'2005-07-31 03:53:24',693,112,'2005-08-05 08:32:24',2,'2006-02-15 21:30:53'),(9610,'2005-07-31 03:54:05',3110,16,'2005-08-06 23:11:05',1,'2006-02-15 21:30:53'),(9611,'2005-07-31 03:54:43',1976,215,'2005-08-05 03:54:43',2,'2006-02-15 21:30:53'),(9612,'2005-07-31 03:58:31',2142,69,'2005-08-04 07:34:31',2,'2006-02-15 21:30:53'),(9613,'2005-07-31 03:58:53',3251,188,'2005-08-02 00:10:53',1,'2006-02-15 21:30:53'),(9614,'2005-07-31 03:59:31',2955,548,'2005-08-08 04:19:31',1,'2006-02-15 21:30:53'),(9615,'2005-07-31 03:59:56',3370,50,'2005-08-02 00:46:56',2,'2006-02-15 21:30:53'),(9616,'2005-07-31 04:05:01',1210,550,'2005-08-05 00:10:01',1,'2006-02-15 21:30:53'),(9617,'2005-07-31 04:15:38',529,102,'2005-08-02 04:24:38',1,'2006-02-15 21:30:53'),(9618,'2005-07-31 04:16:14',2688,253,'2005-08-07 02:43:14',2,'2006-02-15 21:30:53'),(9619,'2005-07-31 04:17:02',1730,138,'2005-08-05 06:36:02',2,'2006-02-15 21:30:53'),(9620,'2005-07-31 04:19:18',2177,576,'2005-08-08 09:20:18',1,'2006-02-15 21:30:53'),(9621,'2005-07-31 04:21:08',325,38,'2005-08-08 03:50:08',2,'2006-02-15 21:30:53'),(9622,'2005-07-31 04:21:45',2255,411,'2005-08-02 09:20:45',1,'2006-02-15 21:30:53'),(9623,'2005-07-31 04:30:02',113,360,'2005-08-06 23:34:02',1,'2006-02-15 21:30:53'),(9624,'2005-07-31 04:30:03',3480,7,'2005-08-06 09:13:03',1,'2006-02-15 21:30:53'),(9625,'2005-07-31 04:30:48',1703,445,'2005-08-03 01:12:48',1,'2006-02-15 21:30:53'),(9626,'2005-07-31 04:37:41',2216,546,'2005-08-08 04:00:41',1,'2006-02-15 21:30:53'),(9627,'2005-07-31 04:42:46',471,12,'2005-08-08 00:42:46',2,'2006-02-15 21:30:53'),(9628,'2005-07-31 04:51:11',1387,565,'2005-07-31 23:11:11',2,'2006-02-15 21:30:53'),(9629,'2005-07-31 04:54:43',2773,8,'2005-08-02 08:36:43',1,'2006-02-15 21:30:53'),(9630,'2005-07-31 04:57:07',2008,599,'2005-08-07 10:55:07',2,'2006-02-15 21:30:53'),(9631,'2005-07-31 05:02:00',321,595,'2005-08-02 02:04:00',2,'2006-02-15 21:30:53'),(9632,'2005-07-31 05:02:23',3368,217,'2005-08-06 04:49:23',2,'2006-02-15 21:30:53'),(9633,'2005-07-31 05:04:08',1141,334,'2005-08-06 00:52:08',2,'2006-02-15 21:30:53'),(9634,'2005-07-31 05:06:02',924,444,'2005-08-04 06:53:02',1,'2006-02-15 21:30:53'),(9635,'2005-07-31 05:12:27',1687,371,'2005-08-02 00:24:27',2,'2006-02-15 21:30:53'),(9636,'2005-07-31 05:12:59',1725,27,'2005-08-09 07:31:59',2,'2006-02-15 21:30:53'),(9637,'2005-07-31 05:18:54',3013,130,'2005-08-03 01:23:54',2,'2006-02-15 21:30:53'),(9638,'2005-07-31 05:30:27',1616,436,'2005-08-09 02:04:27',1,'2006-02-15 21:30:53'),(9639,'2005-07-31 05:32:10',1373,459,'2005-08-03 07:04:10',2,'2006-02-15 21:30:53'),(9640,'2005-07-31 05:33:25',1067,67,'2005-08-09 09:41:25',1,'2006-02-15 21:30:53'),(9641,'2005-07-31 05:33:48',1085,30,'2005-08-04 07:43:48',1,'2006-02-15 21:30:53'),(9642,'2005-07-31 05:33:57',3550,68,'2005-08-05 04:54:57',1,'2006-02-15 21:30:53'),(9643,'2005-07-31 05:35:48',3576,538,'2005-08-08 04:28:48',2,'2006-02-15 21:30:53'),(9644,'2005-07-31 05:40:35',4577,441,'2005-08-09 08:18:35',1,'2006-02-15 21:30:53'),(9645,'2005-07-31 05:42:49',3413,519,'2005-08-04 00:08:49',1,'2006-02-15 21:30:53'),(9646,'2005-07-31 05:43:28',3756,89,'2005-08-08 04:00:28',1,'2006-02-15 21:30:53'),(9647,'2005-07-31 05:45:15',3415,475,'2005-08-06 08:54:15',1,'2006-02-15 21:30:53'),(9648,'2005-07-31 05:46:03',4063,72,'2005-08-09 04:36:03',2,'2006-02-15 21:30:53'),(9649,'2005-07-31 05:46:54',1588,51,'2005-08-04 08:42:54',2,'2006-02-15 21:30:53'),(9650,'2005-07-31 05:47:32',2997,414,'2005-08-04 00:50:32',2,'2006-02-15 21:30:53'),(9651,'2005-07-31 05:48:49',4059,324,'2005-08-04 06:53:49',1,'2006-02-15 21:30:53'),(9652,'2005-07-31 05:49:53',448,207,'2005-08-06 07:38:53',2,'2006-02-15 21:30:53'),(9653,'2005-07-31 05:55:38',1451,383,'2005-08-03 09:35:38',2,'2006-02-15 21:30:53'),(9654,'2005-07-31 05:57:42',3286,506,'2005-08-06 04:19:42',1,'2006-02-15 21:30:53'),(9655,'2005-07-31 05:57:54',3403,435,'2005-08-06 02:00:54',1,'2006-02-15 21:30:53'),(9656,'2005-07-31 06:00:21',4215,39,'2005-08-05 04:36:21',1,'2006-02-15 21:30:53'),(9657,'2005-07-31 06:00:41',2681,402,'2005-08-06 06:51:41',2,'2006-02-15 21:30:53'),(9658,'2005-07-31 06:00:52',2332,282,'2005-08-09 04:47:52',2,'2006-02-15 21:30:53'),(9659,'2005-07-31 06:02:14',4262,360,'2005-08-07 00:54:14',2,'2006-02-15 21:30:53'),(9660,'2005-07-31 06:03:17',1090,406,'2005-08-07 06:59:17',2,'2006-02-15 21:30:53'),(9661,'2005-07-31 06:06:37',2693,237,'2005-08-04 07:37:37',1,'2006-02-15 21:30:53'),(9662,'2005-07-31 06:09:53',2757,96,'2005-08-08 00:50:53',2,'2006-02-15 21:30:53'),(9663,'2005-07-31 06:10:48',2099,339,'2005-08-01 11:40:48',2,'2006-02-15 21:30:53'),(9664,'2005-07-31 06:12:08',360,13,'2005-08-04 02:19:08',2,'2006-02-15 21:30:53'),(9665,'2005-07-31 06:17:33',2863,478,'2005-08-04 08:53:33',1,'2006-02-15 21:30:53'),(9666,'2005-07-31 06:20:58',4318,592,'2005-08-06 06:09:58',2,'2006-02-15 21:30:53'),(9667,'2005-07-31 06:23:52',4289,523,'2005-08-09 09:12:52',1,'2006-02-15 21:30:53'),(9668,'2005-07-31 06:31:03',1647,378,'2005-08-07 06:19:03',2,'2006-02-15 21:30:53'),(9669,'2005-07-31 06:31:36',4496,277,'2005-08-08 03:05:36',2,'2006-02-15 21:30:53'),(9670,'2005-07-31 06:33:33',3709,349,'2005-08-07 04:51:33',1,'2006-02-15 21:30:53'),(9671,'2005-07-31 06:33:41',920,133,'2005-08-02 07:50:41',1,'2006-02-15 21:30:53'),(9672,'2005-07-31 06:34:06',4394,183,'2005-08-08 10:29:06',2,'2006-02-15 21:30:53'),(9673,'2005-07-31 06:34:55',339,27,'2005-08-09 09:15:55',2,'2006-02-15 21:30:53'),(9674,'2005-07-31 06:36:53',3213,297,'2005-08-06 02:50:53',2,'2006-02-15 21:30:53'),(9675,'2005-07-31 06:37:07',2523,243,'2005-08-03 07:03:07',1,'2006-02-15 21:30:53'),(9676,'2005-07-31 06:39:13',681,239,'2005-08-05 09:31:13',2,'2006-02-15 21:30:53'),(9677,'2005-07-31 06:39:45',3200,274,'2005-08-01 02:37:45',2,'2006-02-15 21:30:53'),(9678,'2005-07-31 06:40:47',3430,383,'2005-08-02 00:57:47',2,'2006-02-15 21:30:53'),(9679,'2005-07-31 06:41:19',3819,599,'2005-08-02 07:23:19',1,'2006-02-15 21:30:53'),(9680,'2005-07-31 06:41:46',3010,84,'2005-08-01 11:02:46',2,'2006-02-15 21:30:53'),(9681,'2005-07-31 06:42:09',64,160,'2005-08-06 08:21:09',1,'2006-02-15 21:30:53'),(9682,'2005-07-31 06:47:10',2427,425,'2005-08-04 09:07:10',1,'2006-02-15 21:30:53'),(9683,'2005-07-31 06:47:13',856,141,'2005-08-04 05:52:13',2,'2006-02-15 21:30:53'),(9684,'2005-07-31 06:48:33',362,591,'2005-08-01 07:07:33',2,'2006-02-15 21:30:53'),(9685,'2005-07-31 06:49:18',3097,165,'2005-08-04 03:19:18',1,'2006-02-15 21:30:53'),(9686,'2005-07-31 06:50:06',3825,386,'2005-08-06 08:41:06',1,'2006-02-15 21:30:53'),(9687,'2005-07-31 06:52:54',3540,470,'2005-08-01 03:40:54',2,'2006-02-15 21:30:53'),(9688,'2005-07-31 06:56:08',1304,566,'2005-08-08 03:31:08',2,'2006-02-15 21:30:53'),(9689,'2005-07-31 07:00:08',819,498,'2005-08-04 03:33:08',2,'2006-02-15 21:30:53'),(9690,'2005-07-31 07:06:29',4449,468,'2005-08-06 09:45:29',2,'2006-02-15 21:30:53'),(9691,'2005-07-31 07:09:55',2626,50,'2005-08-09 02:29:55',1,'2006-02-15 21:30:53'),(9692,'2005-07-31 07:11:04',3481,295,'2005-08-07 06:34:04',2,'2006-02-15 21:30:53'),(9693,'2005-07-31 07:11:50',1031,273,'2005-08-08 09:55:50',1,'2006-02-15 21:30:53'),(9694,'2005-07-31 07:13:16',3447,508,'2005-08-06 09:12:16',2,'2006-02-15 21:30:53'),(9695,'2005-07-31 07:13:30',726,95,'2005-08-07 05:38:30',2,'2006-02-15 21:30:53'),(9696,'2005-07-31 07:13:46',2703,156,'2005-08-03 10:49:46',2,'2006-02-15 21:30:53'),(9697,'2005-07-31 07:23:11',762,479,'2005-08-05 08:04:11',2,'2006-02-15 21:30:53'),(9698,'2005-07-31 07:24:35',3477,594,'2005-08-09 04:52:35',2,'2006-02-15 21:30:53'),(9699,'2005-07-31 07:29:25',199,21,'2005-08-06 01:35:25',1,'2006-02-15 21:30:53'),(9700,'2005-07-31 07:29:59',2678,40,'2005-08-02 09:53:59',1,'2006-02-15 21:30:53'),(9701,'2005-07-31 07:32:21',4581,401,'2005-08-01 05:07:21',2,'2006-02-15 21:30:53'),(9702,'2005-07-31 07:34:07',3353,525,'2005-08-02 06:13:07',2,'2006-02-15 21:30:53'),(9703,'2005-07-31 07:34:52',2708,57,'2005-08-03 13:33:52',2,'2006-02-15 21:30:53'),(9704,'2005-07-31 07:39:32',1402,385,'2005-08-06 01:50:32',2,'2006-02-15 21:30:53'),(9705,'2005-07-31 07:40:33',4158,28,'2005-08-01 03:50:33',2,'2006-02-15 21:30:53'),(9706,'2005-07-31 07:43:19',142,508,'2005-08-05 11:11:19',1,'2006-02-15 21:30:53'),(9707,'2005-07-31 07:44:18',203,351,'2005-08-08 12:45:18',1,'2006-02-15 21:30:53'),(9708,'2005-07-31 07:45:33',3264,12,'2005-08-08 08:56:33',1,'2006-02-15 21:30:53'),(9709,'2005-07-31 08:04:55',2096,137,'2005-08-07 08:58:55',1,'2006-02-15 21:30:53'),(9710,'2005-07-31 08:05:31',3486,380,'2005-08-09 03:29:31',2,'2006-02-15 21:30:53'),(9711,'2005-07-31 08:06:41',1525,231,'2005-08-02 10:30:41',2,'2006-02-15 21:30:53'),(9712,'2005-07-31 08:13:11',2487,219,'2005-08-08 12:40:11',2,'2006-02-15 21:30:53'),(9713,'2005-07-31 08:13:28',929,158,'2005-08-07 10:11:28',1,'2006-02-15 21:30:53'),(9714,'2005-07-31 08:15:32',1532,144,'2005-08-03 08:33:32',2,'2006-02-15 21:30:53'),(9715,'2005-07-31 08:16:58',3319,237,'2005-08-04 11:13:58',1,'2006-02-15 21:30:53'),(9716,'2005-07-31 08:23:53',3385,287,'2005-08-08 12:03:53',2,'2006-02-15 21:30:53'),(9717,'2005-07-31 08:24:41',4207,114,'2005-08-04 02:51:41',1,'2006-02-15 21:30:53'),(9718,'2005-07-31 08:25:03',2747,23,'2005-08-08 04:16:03',2,'2006-02-15 21:30:53'),(9719,'2005-07-31 08:25:13',335,584,'2005-08-05 08:22:13',1,'2006-02-15 21:30:53'),(9720,'2005-07-31 08:25:21',1282,587,'2005-08-07 11:30:21',2,'2006-02-15 21:30:53'),(9721,'2005-07-31 08:28:46',3942,196,'2005-08-05 14:03:46',1,'2006-02-15 21:30:53'),(9722,'2005-07-31 08:29:48',4260,125,'2005-08-07 07:52:48',2,'2006-02-15 21:30:53'),(9723,'2005-07-31 08:31:18',3968,24,'2005-08-03 10:25:18',1,'2006-02-15 21:30:53'),(9724,'2005-07-31 08:33:08',518,130,'2005-08-08 04:50:08',1,'2006-02-15 21:30:53'),(9725,'2005-07-31 08:35:18',3960,503,'2005-08-03 03:46:18',2,'2006-02-15 21:30:53'),(9726,'2005-07-31 08:37:07',1701,162,'2005-08-09 06:09:07',1,'2006-02-15 21:30:53'),(9727,'2005-07-31 08:39:13',3076,536,'2005-08-03 07:54:13',1,'2006-02-15 21:30:53'),(9728,'2005-07-31 08:40:54',3630,399,'2005-08-03 04:14:54',2,'2006-02-15 21:30:53'),(9729,'2005-07-31 08:43:43',4199,273,'2005-08-01 13:25:43',2,'2006-02-15 21:30:53'),(9730,'2005-07-31 08:50:08',2605,242,'2005-08-08 12:21:08',2,'2006-02-15 21:30:53'),(9731,'2005-07-31 08:54:47',3713,349,'2005-08-05 03:47:47',1,'2006-02-15 21:30:53'),(9732,'2005-07-31 08:56:08',3262,288,'2005-08-07 11:05:08',2,'2006-02-15 21:30:53'),(9733,'2005-07-31 08:57:35',1255,575,'2005-08-04 04:47:35',1,'2006-02-15 21:30:53'),(9734,'2005-07-31 08:57:45',3320,125,'2005-08-05 11:57:45',1,'2006-02-15 21:30:53'),(9735,'2005-07-31 08:57:49',4228,315,'2005-08-08 13:51:49',2,'2006-02-15 21:30:53'),(9736,'2005-07-31 08:58:40',2072,13,'2005-08-09 08:34:40',2,'2006-02-15 21:30:53'),(9737,'2005-07-31 08:59:18',1720,475,'2005-08-03 12:19:18',2,'2006-02-15 21:30:53'),(9738,'2005-07-31 09:04:14',2278,568,'2005-08-05 14:40:14',2,'2006-02-15 21:30:53'),(9739,'2005-07-31 09:08:03',1328,343,'2005-08-04 13:57:03',1,'2006-02-15 21:30:53'),(9740,'2005-07-31 09:08:03',3497,443,'2005-08-06 04:48:03',2,'2006-02-15 21:30:53'),(9741,'2005-07-31 09:09:22',1971,495,'2005-08-07 10:01:22',1,'2006-02-15 21:30:53'),(9742,'2005-07-31 09:10:20',4058,48,'2005-08-08 10:07:20',1,'2006-02-15 21:30:53'),(9743,'2005-07-31 09:12:42',1740,476,'2005-08-06 11:57:42',2,'2006-02-15 21:30:53'),(9744,'2005-07-31 09:15:38',839,459,'2005-08-03 10:31:38',2,'2006-02-15 21:30:53'),(9745,'2005-07-31 09:16:14',3610,217,'2005-08-07 12:11:14',1,'2006-02-15 21:30:53'),(9746,'2005-07-31 09:16:48',1459,308,'2005-08-07 06:36:48',2,'2006-02-15 21:30:53'),(9747,'2005-07-31 09:16:57',2455,106,'2005-08-08 06:47:57',2,'2006-02-15 21:30:53'),(9748,'2005-07-31 09:17:56',3308,550,'2005-08-02 14:54:56',1,'2006-02-15 21:30:53'),(9749,'2005-07-31 09:18:33',658,52,'2005-08-06 07:41:33',1,'2006-02-15 21:30:53'),(9750,'2005-07-31 09:19:46',3174,527,'2005-08-06 08:07:46',1,'2006-02-15 21:30:53'),(9751,'2005-07-31 09:20:50',36,202,'2005-08-01 05:34:50',2,'2006-02-15 21:30:53'),(9752,'2005-07-31 09:22:02',249,199,'2005-08-02 14:34:02',1,'2006-02-15 21:30:53'),(9753,'2005-07-31 09:22:38',3529,98,'2005-08-01 08:45:38',1,'2006-02-15 21:30:53'),(9754,'2005-07-31 09:23:43',3751,479,'2005-08-08 06:04:43',1,'2006-02-15 21:30:53'),(9755,'2005-07-31 09:24:55',86,108,'2005-08-07 06:00:55',2,'2006-02-15 21:30:53'),(9756,'2005-07-31 09:25:00',207,400,'2005-08-02 05:11:00',1,'2006-02-15 21:30:53'),(9757,'2005-07-31 09:25:14',2596,408,'2005-08-01 14:43:14',2,'2006-02-15 21:30:53'),(9758,'2005-07-31 09:25:38',1307,160,'2005-08-03 14:16:38',1,'2006-02-15 21:30:53'),(9759,'2005-07-31 09:25:57',2950,574,'2005-08-07 12:56:57',2,'2006-02-15 21:30:53'),(9760,'2005-07-31 09:29:33',426,511,'2005-08-09 07:32:33',2,'2006-02-15 21:30:53'),(9761,'2005-07-31 09:31:54',3778,60,'2005-08-03 11:02:54',2,'2006-02-15 21:30:53'),(9762,'2005-07-31 09:32:54',155,540,'2005-08-05 04:55:54',1,'2006-02-15 21:30:53'),(9763,'2005-07-31 09:34:03',126,393,'2005-08-08 05:30:03',1,'2006-02-15 21:30:53'),(9764,'2005-07-31 09:42:58',3761,136,'2005-08-07 07:22:58',2,'2006-02-15 21:30:53'),(9765,'2005-07-31 09:44:40',472,551,'2005-08-05 10:57:40',1,'2006-02-15 21:30:53'),(9766,'2005-07-31 09:46:29',4049,570,'2005-08-01 05:08:29',1,'2006-02-15 21:30:53'),(9767,'2005-07-31 09:46:49',3432,89,'2005-08-03 11:20:49',1,'2006-02-15 21:30:53'),(9768,'2005-07-31 09:48:41',2656,582,'2005-08-08 11:40:41',2,'2006-02-15 21:30:53'),(9769,'2005-07-31 09:52:16',2958,484,'2005-08-06 09:26:16',1,'2006-02-15 21:30:53'),(9770,'2005-07-31 09:52:40',1226,317,'2005-08-09 06:44:40',1,'2006-02-15 21:30:53'),(9771,'2005-07-31 09:55:36',4123,398,'2005-08-04 10:11:36',2,'2006-02-15 21:30:53'),(9772,'2005-07-31 09:56:07',3639,147,'2005-08-01 13:50:07',2,'2006-02-15 21:30:53'),(9773,'2005-07-31 09:56:56',4555,376,'2005-08-04 09:38:56',1,'2006-02-15 21:30:53'),(9774,'2005-07-31 09:57:51',4174,306,'2005-08-02 09:08:51',2,'2006-02-15 21:30:53'),(9775,'2005-07-31 10:00:00',2818,162,'2005-08-01 08:57:00',2,'2006-02-15 21:30:53'),(9776,'2005-07-31 10:01:03',2524,73,'2005-08-03 07:20:03',2,'2006-02-15 21:30:53'),(9777,'2005-07-31 10:01:06',225,539,'2005-08-08 04:44:06',2,'2006-02-15 21:30:53'),(9778,'2005-07-31 10:02:04',304,230,'2005-08-04 07:44:04',2,'2006-02-15 21:30:53'),(9779,'2005-07-31 10:08:33',1280,402,'2005-08-03 14:56:33',1,'2006-02-15 21:30:53'),(9780,'2005-07-31 10:10:22',3241,102,'2005-08-02 11:43:22',1,'2006-02-15 21:30:53'),(9781,'2005-07-31 10:13:02',2310,155,'2005-08-09 14:46:02',1,'2006-02-15 21:30:53'),(9782,'2005-07-31 10:14:26',2397,438,'2005-08-06 16:11:26',1,'2006-02-15 21:30:53'),(9783,'2005-07-31 10:15:46',836,75,'2005-08-09 13:22:46',2,'2006-02-15 21:30:53'),(9784,'2005-07-31 10:21:32',2761,362,'2005-08-07 09:20:32',2,'2006-02-15 21:30:53'),(9785,'2005-07-31 10:22:15',4101,587,'2005-08-02 10:02:15',1,'2006-02-15 21:30:53'),(9786,'2005-07-31 10:25:21',2560,586,'2005-08-03 04:28:21',1,'2006-02-15 21:30:53'),(9787,'2005-07-31 10:26:19',3559,272,'2005-08-09 09:02:19',1,'2006-02-15 21:30:53'),(9788,'2005-07-31 10:28:21',4367,344,'2005-08-09 13:45:21',1,'2006-02-15 21:30:53'),(9789,'2005-07-31 10:30:25',619,137,'2005-08-03 14:58:25',1,'2006-02-15 21:30:53'),(9790,'2005-07-31 10:34:08',3643,284,'2005-08-04 11:19:08',2,'2006-02-15 21:30:53'),(9791,'2005-07-31 10:35:22',3642,300,'2005-08-03 05:34:22',1,'2006-02-15 21:30:53'),(9792,'2005-07-31 10:43:41',3163,292,'2005-08-07 10:18:41',1,'2006-02-15 21:30:53'),(9793,'2005-07-31 10:45:11',4576,295,'2005-08-03 14:29:11',1,'2006-02-15 21:30:53'),(9794,'2005-07-31 10:47:01',1771,403,'2005-08-02 06:52:01',2,'2006-02-15 21:30:53'),(9795,'2005-07-31 10:47:19',2005,63,'2005-08-04 09:32:19',2,'2006-02-15 21:30:53'),(9796,'2005-07-31 10:52:43',1038,539,'2005-08-09 06:08:43',1,'2006-02-15 21:30:53'),(9797,'2005-07-31 10:53:44',687,52,'2005-08-09 05:51:44',1,'2006-02-15 21:30:53'),(9798,'2005-07-31 10:55:18',3759,55,'2005-08-01 07:37:18',2,'2006-02-15 21:30:53'),(9799,'2005-07-31 10:58:32',3008,494,'2005-08-01 12:08:32',1,'2006-02-15 21:30:53'),(9800,'2005-07-31 11:00:58',2153,257,'2005-08-02 10:13:58',2,'2006-02-15 21:30:53'),(9801,'2005-07-31 11:03:13',3033,158,'2005-08-04 10:55:13',2,'2006-02-15 21:30:53'),(9802,'2005-07-31 11:04:20',2156,594,'2005-08-03 05:28:20',1,'2006-02-15 21:30:53'),(9803,'2005-07-31 11:06:02',3783,520,'2005-08-01 06:25:02',1,'2006-02-15 21:30:53'),(9804,'2005-07-31 11:07:39',2490,196,'2005-08-09 11:57:39',1,'2006-02-15 21:30:53'),(9805,'2005-07-31 11:11:10',4179,36,'2005-08-03 07:36:10',2,'2006-02-15 21:30:53'),(9806,'2005-07-31 11:13:49',245,46,'2005-08-04 06:18:49',1,'2006-02-15 21:30:53'),(9807,'2005-07-31 11:13:52',2137,267,'2005-08-02 07:34:52',1,'2006-02-15 21:30:53'),(9808,'2005-07-31 11:17:22',3259,583,'2005-08-07 15:54:22',1,'2006-02-15 21:30:53'),(9809,'2005-07-31 11:19:21',359,286,'2005-08-08 12:43:21',2,'2006-02-15 21:30:53'),(9810,'2005-07-31 11:22:41',2066,545,'2005-08-01 09:40:41',2,'2006-02-15 21:30:53'),(9811,'2005-07-31 11:23:45',3305,77,'2005-08-06 15:51:45',1,'2006-02-15 21:30:53'),(9812,'2005-07-31 11:28:07',1540,57,'2005-08-01 12:35:07',2,'2006-02-15 21:30:53'),(9813,'2005-07-31 11:29:23',1706,245,'2005-08-07 08:01:23',2,'2006-02-15 21:30:53'),(9814,'2005-07-31 11:29:46',136,79,'2005-08-08 15:49:46',1,'2006-02-15 21:30:53'),(9815,'2005-07-31 11:30:51',2728,540,'2005-08-08 12:52:51',1,'2006-02-15 21:30:53'),(9816,'2005-07-31 11:32:58',4560,3,'2005-08-04 17:12:58',2,'2006-02-15 21:30:53'),(9817,'2005-07-31 11:33:31',4019,170,'2005-08-08 14:49:31',2,'2006-02-15 21:30:53'),(9818,'2005-07-31 11:34:32',1254,183,'2005-08-04 08:20:32',1,'2006-02-15 21:30:53'),(9819,'2005-07-31 11:39:13',1927,292,'2005-08-06 09:11:13',2,'2006-02-15 21:30:53'),(9820,'2005-07-31 11:46:57',499,279,'2005-08-08 13:35:57',1,'2006-02-15 21:30:53'),(9821,'2005-07-31 11:47:54',386,271,'2005-08-08 06:21:54',2,'2006-02-15 21:30:53'),(9822,'2005-07-31 11:48:25',2469,381,'2005-08-05 15:52:25',2,'2006-02-15 21:30:53'),(9823,'2005-07-31 11:49:00',4423,129,'2005-08-07 09:06:00',2,'2006-02-15 21:30:53'),(9824,'2005-07-31 11:49:55',4368,404,'2005-08-07 16:54:55',2,'2006-02-15 21:30:53'),(9825,'2005-07-31 11:50:51',4322,390,'2005-08-02 07:18:51',1,'2006-02-15 21:30:53'),(9826,'2005-07-31 11:51:46',2649,595,'2005-08-09 17:18:46',1,'2006-02-15 21:30:53'),(9827,'2005-07-31 11:56:55',3840,329,'2005-08-09 16:29:55',1,'2006-02-15 21:30:53'),(9828,'2005-07-31 11:56:57',3845,376,'2005-08-02 17:05:57',1,'2006-02-15 21:30:53'),(9829,'2005-07-31 11:58:38',231,435,'2005-08-07 08:11:38',2,'2006-02-15 21:30:53'),(9830,'2005-07-31 11:59:05',170,112,'2005-08-06 10:38:05',1,'2006-02-15 21:30:53'),(9831,'2005-07-31 11:59:32',1961,192,'2005-08-04 07:14:32',1,'2006-02-15 21:30:53'),(9832,'2005-07-31 12:01:49',3126,64,'2005-08-08 09:21:49',1,'2006-02-15 21:30:53'),(9833,'2005-07-31 12:05:01',4243,368,'2005-08-09 09:25:01',2,'2006-02-15 21:30:53'),(9834,'2005-07-31 12:05:42',2292,340,'2005-08-07 15:26:42',1,'2006-02-15 21:30:53'),(9835,'2005-07-31 12:07:35',1051,328,'2005-08-04 07:32:35',2,'2006-02-15 21:30:53'),(9836,'2005-07-31 12:12:00',2870,313,'2005-08-09 06:53:00',1,'2006-02-15 21:30:53'),(9837,'2005-07-31 12:14:19',3488,573,'2005-08-09 17:08:19',1,'2006-02-15 21:30:53'),(9838,'2005-07-31 12:18:49',3866,208,'2005-08-03 16:49:49',2,'2006-02-15 21:30:53'),(9839,'2005-07-31 12:21:16',1591,561,'2005-08-09 13:41:16',2,'2006-02-15 21:30:53'),(9840,'2005-07-31 12:23:18',364,388,'2005-08-06 15:59:18',1,'2006-02-15 21:30:53'),(9841,'2005-07-31 12:24:19',4554,238,'2005-08-09 15:31:19',1,'2006-02-15 21:30:53'),(9842,'2005-07-31 12:24:58',2896,261,'2005-08-02 11:01:58',2,'2006-02-15 21:30:53'),(9843,'2005-07-31 12:25:28',2923,532,'2005-08-01 09:51:28',2,'2006-02-15 21:30:53'),(9844,'2005-07-31 12:26:31',3930,181,'2005-08-05 13:58:31',1,'2006-02-15 21:30:53'),(9845,'2005-07-31 12:28:05',2417,79,'2005-08-06 06:47:05',1,'2006-02-15 21:30:53'),(9846,'2005-07-31 12:30:12',4240,573,'2005-08-05 08:24:12',2,'2006-02-15 21:30:53'),(9847,'2005-07-31 12:33:43',1137,174,'2005-08-04 14:15:43',2,'2006-02-15 21:30:53'),(9848,'2005-07-31 12:44:33',3290,346,'2005-08-07 13:49:33',2,'2006-02-15 21:30:53'),(9849,'2005-07-31 12:44:34',2230,429,'2005-08-02 16:49:34',1,'2006-02-15 21:30:53'),(9850,'2005-07-31 12:46:52',1461,497,'2005-08-04 10:52:52',2,'2006-02-15 21:30:53'),(9851,'2005-07-31 12:50:24',25,49,'2005-08-08 08:30:24',2,'2006-02-15 21:30:53'),(9852,'2005-07-31 12:52:17',4257,415,'2005-08-05 07:59:17',2,'2006-02-15 21:30:53'),(9853,'2005-07-31 12:58:20',1782,221,'2005-08-04 10:47:20',1,'2006-02-15 21:30:53'),(9854,'2005-07-31 12:59:34',1049,441,'2005-08-03 07:20:34',2,'2006-02-15 21:30:53'),(9855,'2005-07-31 13:00:33',1246,326,'2005-08-03 16:18:33',2,'2006-02-15 21:30:53'),(9856,'2005-07-31 13:00:35',723,347,'2005-08-07 18:07:35',1,'2006-02-15 21:30:53'),(9857,'2005-07-31 13:00:53',3316,168,'2005-08-09 15:56:53',1,'2006-02-15 21:30:53'),(9858,'2005-07-31 13:02:07',252,128,'2005-08-03 15:14:07',2,'2006-02-15 21:30:53'),(9859,'2005-07-31 13:02:55',4094,127,'2005-08-05 11:04:55',1,'2006-02-15 21:30:53'),(9860,'2005-07-31 13:03:24',3266,585,'2005-08-07 07:28:24',2,'2006-02-15 21:30:53'),(9861,'2005-07-31 13:04:14',1050,264,'2005-08-09 15:22:14',1,'2006-02-15 21:30:53'),(9862,'2005-07-31 13:05:03',474,513,'2005-08-01 09:05:03',2,'2006-02-15 21:30:53'),(9863,'2005-07-31 13:05:29',19,239,'2005-08-08 12:33:29',1,'2006-02-15 21:30:53'),(9864,'2005-07-31 13:06:54',3619,394,'2005-08-02 11:47:54',2,'2006-02-15 21:30:53'),(9865,'2005-07-31 13:10:45',1355,580,'2005-08-02 09:19:45',2,'2006-02-15 21:30:53'),(9866,'2005-07-31 13:13:50',3555,374,'2005-08-07 15:11:50',1,'2006-02-15 21:30:53'),(9867,'2005-07-31 13:17:04',2485,83,'2005-08-05 07:17:04',2,'2006-02-15 21:30:53'),(9868,'2005-07-31 13:20:08',266,378,'2005-08-01 18:17:08',2,'2006-02-15 21:30:53'),(9869,'2005-07-31 13:21:54',783,261,'2005-08-07 09:09:54',1,'2006-02-15 21:30:53'),(9870,'2005-07-31 13:22:51',442,195,'2005-08-05 16:04:51',1,'2006-02-15 21:30:53'),(9871,'2005-07-31 13:25:46',194,109,'2005-08-01 13:12:46',2,'2006-02-15 21:30:53'),(9872,'2005-07-31 13:27:55',1021,376,'2005-08-04 14:33:55',1,'2006-02-15 21:30:53'),(9873,'2005-07-31 13:32:18',667,442,'2005-08-06 11:15:18',2,'2006-02-15 21:30:53'),(9874,'2005-07-31 13:32:31',2476,482,'2005-08-07 09:50:31',2,'2006-02-15 21:30:53'),(9875,'2005-07-31 13:37:41',2878,421,'2005-08-03 15:17:41',2,'2006-02-15 21:30:53'),(9876,'2005-07-31 13:37:51',828,347,'2005-08-07 18:05:51',2,'2006-02-15 21:30:53'),(9877,'2005-07-31 13:41:57',1299,559,'2005-08-06 15:27:57',2,'2006-02-15 21:30:53'),(9878,'2005-07-31 13:42:02',1753,424,'2005-08-05 10:15:02',2,'2006-02-15 21:30:53'),(9879,'2005-07-31 13:45:32',1935,178,'2005-08-07 17:12:32',1,'2006-02-15 21:30:53'),(9880,'2005-07-31 13:49:02',3590,64,'2005-08-08 10:31:02',2,'2006-02-15 21:30:53'),(9881,'2005-07-31 13:50:38',4209,412,'2005-08-06 08:58:38',1,'2006-02-15 21:30:53'),(9882,'2005-07-31 13:53:33',1429,311,'2005-08-09 15:55:33',1,'2006-02-15 21:30:53'),(9883,'2005-07-31 13:53:37',4286,356,'2005-08-06 15:45:37',1,'2006-02-15 21:30:53'),(9884,'2005-07-31 13:56:24',511,590,'2005-08-01 16:59:24',1,'2006-02-15 21:30:53'),(9885,'2005-07-31 13:59:32',3600,461,'2005-08-07 12:30:32',2,'2006-02-15 21:30:53'),(9886,'2005-07-31 14:00:13',1386,519,'2005-08-08 19:30:13',1,'2006-02-15 21:30:53'),(9887,'2005-07-31 14:00:32',436,549,'2005-08-05 19:16:32',1,'2006-02-15 21:30:53'),(9888,'2005-07-31 14:00:53',4400,5,'2005-08-08 18:51:53',2,'2006-02-15 21:30:53'),(9889,'2005-07-31 14:02:50',2842,143,'2005-08-05 12:09:50',2,'2006-02-15 21:30:53'),(9890,'2005-07-31 14:04:44',1024,151,'2005-08-01 11:24:44',1,'2006-02-15 21:30:53'),(9891,'2005-07-31 14:05:44',3359,462,'2005-08-02 16:21:44',2,'2006-02-15 21:30:53'),(9892,'2005-07-31 14:06:25',1045,251,'2005-08-03 18:11:25',2,'2006-02-15 21:30:53'),(9893,'2005-07-31 14:07:21',2445,179,'2005-08-01 09:20:21',2,'2006-02-15 21:30:53'),(9894,'2005-07-31 14:07:44',3724,199,'2005-08-05 18:01:44',2,'2006-02-15 21:30:53'),(9895,'2005-07-31 14:07:56',835,560,'2005-08-05 14:56:56',1,'2006-02-15 21:30:53'),(9896,'2005-07-31 14:09:48',2591,586,'2005-08-01 20:02:48',1,'2006-02-15 21:30:53'),(9897,'2005-07-31 14:11:57',3945,538,'2005-08-02 12:20:57',1,'2006-02-15 21:30:53'),(9898,'2005-07-31 14:12:03',2151,359,'2005-08-01 12:27:03',1,'2006-02-15 21:30:53'),(9899,'2005-07-31 14:12:36',3352,168,'2005-08-08 08:59:36',1,'2006-02-15 21:30:53'),(9900,'2005-07-31 14:15:05',3132,453,'2005-08-07 11:58:05',2,'2006-02-15 21:30:53'),(9901,'2005-07-31 14:20:59',3332,277,'2005-08-03 09:30:59',1,'2006-02-15 21:30:53'),(9902,'2005-07-31 14:24:33',486,218,'2005-08-09 11:11:33',2,'2006-02-15 21:30:53'),(9903,'2005-07-31 14:31:44',1621,316,'2005-08-08 20:03:44',1,'2006-02-15 21:30:53'),(9904,'2005-07-31 14:34:17',4089,428,'2005-08-08 17:19:17',1,'2006-02-15 21:30:53'),(9905,'2005-07-31 14:37:03',2839,519,'2005-08-01 15:55:03',2,'2006-02-15 21:30:53'),(9906,'2005-07-31 14:38:12',4241,204,'2005-08-01 13:56:12',1,'2006-02-15 21:30:53'),(9907,'2005-07-31 14:39:50',4282,120,'2005-08-09 09:39:50',1,'2006-02-15 21:30:53'),(9908,'2005-07-31 14:39:52',4408,27,'2005-08-09 09:46:52',2,'2006-02-15 21:30:53'),(9909,'2005-07-31 14:43:34',2600,587,'2005-08-09 15:31:34',1,'2006-02-15 21:30:53'),(9910,'2005-07-31 14:47:57',368,122,'2005-08-05 18:20:57',1,'2006-02-15 21:30:53'),(9911,'2005-07-31 14:48:01',3879,112,'2005-08-06 11:55:01',1,'2006-02-15 21:30:53'),(9912,'2005-07-31 14:49:04',3119,367,'2005-08-03 15:40:04',1,'2006-02-15 21:30:53'),(9913,'2005-07-31 14:51:04',3744,229,'2005-08-06 12:12:04',1,'2006-02-15 21:30:53'),(9914,'2005-07-31 14:51:19',3147,530,'2005-08-05 09:51:19',1,'2006-02-15 21:30:53'),(9915,'2005-07-31 14:52:26',2933,566,'2005-08-03 11:53:26',1,'2006-02-15 21:30:53'),(9916,'2005-07-31 14:54:52',949,432,'2005-08-07 13:18:52',1,'2006-02-15 21:30:53'),(9917,'2005-07-31 14:55:11',3829,159,'2005-08-02 13:58:11',2,'2006-02-15 21:30:53'),(9918,'2005-07-31 14:55:22',2519,283,'2005-08-04 09:02:22',2,'2006-02-15 21:30:53'),(9919,'2005-07-31 14:55:46',3205,291,'2005-08-08 11:43:46',2,'2006-02-15 21:30:53'),(9920,'2005-07-31 14:57:13',3108,139,'2005-08-03 18:58:13',2,'2006-02-15 21:30:53'),(9921,'2005-07-31 14:59:21',1004,332,'2005-08-01 12:40:21',2,'2006-02-15 21:30:53'),(9922,'2005-07-31 14:59:37',3615,25,'2005-08-06 14:05:37',1,'2006-02-15 21:30:53'),(9923,'2005-07-31 15:00:15',1635,209,'2005-08-05 11:09:15',2,'2006-02-15 21:30:53'),(9924,'2005-07-31 15:04:57',1986,64,'2005-08-05 20:07:57',2,'2006-02-15 21:30:53'),(9925,'2005-07-31 15:08:47',2351,24,'2005-08-02 20:27:47',1,'2006-02-15 21:30:53'),(9926,'2005-07-31 15:11:51',3733,472,'2005-08-09 18:26:51',1,'2006-02-15 21:30:53'),(9927,'2005-07-31 15:12:13',999,346,'2005-08-01 11:37:13',1,'2006-02-15 21:30:53'),(9928,'2005-07-31 15:13:57',3627,53,'2005-08-06 20:39:57',1,'2006-02-15 21:30:53'),(9929,'2005-07-31 15:17:24',2521,564,'2005-08-03 17:27:24',1,'2006-02-15 21:30:53'),(9930,'2005-07-31 15:18:03',4491,304,'2005-08-01 12:36:03',2,'2006-02-15 21:30:53'),(9931,'2005-07-31 15:18:19',3455,183,'2005-08-04 14:23:19',2,'2006-02-15 21:30:53'),(9932,'2005-07-31 15:19:48',1691,264,'2005-08-05 21:09:48',1,'2006-02-15 21:30:53'),(9933,'2005-07-31 15:24:46',2349,111,'2005-08-01 10:00:46',1,'2006-02-15 21:30:53'),(9934,'2005-07-31 15:25:26',2492,236,'2005-08-05 17:13:26',1,'2006-02-15 21:30:53'),(9935,'2005-07-31 15:27:07',2247,10,'2005-08-05 11:23:07',1,'2006-02-15 21:30:53'),(9936,'2005-07-31 15:27:41',979,153,'2005-08-06 16:25:41',1,'2006-02-15 21:30:53'),(9937,'2005-07-31 15:28:10',3697,521,'2005-08-06 21:20:10',2,'2006-02-15 21:30:53'),(9938,'2005-07-31 15:28:47',2871,63,'2005-08-09 21:24:47',2,'2006-02-15 21:30:53'),(9939,'2005-07-31 15:29:00',3049,538,'2005-08-08 11:09:00',1,'2006-02-15 21:30:53'),(9940,'2005-07-31 15:29:06',3975,388,'2005-08-06 14:26:06',2,'2006-02-15 21:30:53'),(9941,'2005-07-31 15:31:25',1756,175,'2005-08-05 17:23:25',1,'2006-02-15 21:30:53'),(9942,'2005-07-31 15:35:43',4573,545,'2005-08-07 17:37:43',2,'2006-02-15 21:30:53'),(9943,'2005-07-31 15:37:29',887,494,'2005-08-09 18:25:29',1,'2006-02-15 21:30:53'),(9944,'2005-07-31 15:44:43',2540,241,'2005-08-08 10:30:43',1,'2006-02-15 21:30:53'),(9945,'2005-07-31 15:47:51',2075,309,'2005-08-02 19:06:51',1,'2006-02-15 21:30:53'),(9946,'2005-07-31 15:48:54',2100,29,'2005-08-03 12:42:54',2,'2006-02-15 21:30:53'),(9947,'2005-07-31 15:49:40',1173,138,'2005-08-08 11:11:40',1,'2006-02-15 21:30:53'),(9948,'2005-07-31 15:49:41',806,342,'2005-08-06 12:36:41',1,'2006-02-15 21:30:53'),(9949,'2005-07-31 15:50:10',3258,309,'2005-08-01 17:53:10',2,'2006-02-15 21:30:53'),(9950,'2005-07-31 15:50:22',1657,572,'2005-08-08 19:10:22',2,'2006-02-15 21:30:53'),(9951,'2005-07-31 15:51:16',4412,95,'2005-08-03 14:54:16',1,'2006-02-15 21:30:53'),(9952,'2005-07-31 15:52:37',1634,128,'2005-08-06 10:50:37',2,'2006-02-15 21:30:53'),(9953,'2005-07-31 15:56:35',1646,211,'2005-08-02 12:01:35',2,'2006-02-15 21:30:53'),(9954,'2005-07-31 15:57:07',1830,463,'2005-08-05 12:04:07',2,'2006-02-15 21:30:53'),(9955,'2005-07-31 16:01:26',1745,342,'2005-08-04 11:15:26',2,'2006-02-15 21:30:53'),(9956,'2005-07-31 16:03:47',4485,342,'2005-08-01 16:40:47',2,'2006-02-15 21:30:53'),(9957,'2005-07-31 16:03:55',1857,85,'2005-08-04 15:16:55',2,'2006-02-15 21:30:53'),(9958,'2005-07-31 16:03:56',4142,157,'2005-08-04 15:21:56',2,'2006-02-15 21:30:53'),(9959,'2005-07-31 16:04:22',340,199,'2005-08-03 21:51:22',2,'2006-02-15 21:30:53'),(9960,'2005-07-31 16:05:52',1022,569,'2005-08-05 14:15:52',2,'2006-02-15 21:30:53'),(9961,'2005-07-31 16:07:50',1856,40,'2005-08-07 18:37:50',2,'2006-02-15 21:30:53'),(9962,'2005-07-31 16:10:36',1951,576,'2005-08-02 17:09:36',1,'2006-02-15 21:30:53'),(9963,'2005-07-31 16:16:46',1609,573,'2005-08-02 22:00:46',1,'2006-02-15 21:30:53'),(9964,'2005-07-31 16:17:39',3149,191,'2005-08-03 15:03:39',1,'2006-02-15 21:30:53'),(9965,'2005-07-31 16:19:32',3946,101,'2005-08-05 20:18:32',2,'2006-02-15 21:30:53'),(9966,'2005-07-31 16:26:46',4137,373,'2005-08-03 14:29:46',1,'2006-02-15 21:30:53'),(9967,'2005-07-31 16:31:17',958,537,'2005-08-06 13:52:17',1,'2006-02-15 21:30:53'),(9968,'2005-07-31 16:32:16',2666,363,'2005-08-08 12:23:16',1,'2006-02-15 21:30:53'),(9969,'2005-07-31 16:38:12',938,151,'2005-08-05 11:45:12',2,'2006-02-15 21:30:53'),(9970,'2005-07-31 16:38:24',2846,578,'2005-08-02 12:59:24',2,'2006-02-15 21:30:53'),(9971,'2005-07-31 16:42:16',2674,573,'2005-08-09 18:08:16',2,'2006-02-15 21:30:53'),(9972,'2005-07-31 16:42:43',190,506,'2005-08-02 11:05:43',2,'2006-02-15 21:30:53'),(9973,'2005-07-31 16:49:31',1850,369,'2005-08-03 22:03:31',2,'2006-02-15 21:30:53'),(9974,'2005-07-31 16:51:11',430,503,'2005-08-05 16:04:11',1,'2006-02-15 21:30:53'),(9975,'2005-07-31 16:53:43',2564,40,'2005-08-07 20:13:43',2,'2006-02-15 21:30:53'),(9976,'2005-07-31 16:57:49',4219,579,'2005-08-03 16:33:49',2,'2006-02-15 21:30:53'),(9977,'2005-07-31 16:58:42',2300,363,'2005-08-09 13:34:42',1,'2006-02-15 21:30:53'),(9978,'2005-07-31 16:59:51',2812,427,'2005-08-06 16:48:51',2,'2006-02-15 21:30:53'),(9979,'2005-07-31 17:00:07',646,576,'2005-08-08 20:40:07',1,'2006-02-15 21:30:53'),(9980,'2005-07-31 17:02:00',122,225,'2005-08-08 11:11:00',2,'2006-02-15 21:30:53'),(9981,'2005-07-31 17:08:31',1354,321,'2005-08-01 22:46:31',2,'2006-02-15 21:30:53'),(9982,'2005-07-31 17:09:02',2698,428,'2005-08-02 13:02:02',2,'2006-02-15 21:30:53'),(9983,'2005-07-31 17:09:36',350,129,'2005-08-08 20:26:36',1,'2006-02-15 21:30:53'),(9984,'2005-07-31 17:12:23',433,432,'2005-08-01 21:04:23',2,'2006-02-15 21:30:53'),(9985,'2005-07-31 17:14:47',1831,85,'2005-08-01 12:11:47',2,'2006-02-15 21:30:53'),(9986,'2005-07-31 17:16:50',1242,124,'2005-08-05 18:34:50',2,'2006-02-15 21:30:53'),(9987,'2005-07-31 17:22:35',1619,15,'2005-08-01 21:19:35',2,'2006-02-15 21:30:53'),(9988,'2005-07-31 17:22:36',3844,243,'2005-08-07 18:35:36',2,'2006-02-15 21:30:53'),(9989,'2005-07-31 17:22:39',1713,79,'2005-08-01 18:55:39',1,'2006-02-15 21:30:53'),(9990,'2005-07-31 17:24:21',4481,555,'2005-08-09 17:14:21',2,'2006-02-15 21:30:53'),(9991,'2005-07-31 17:26:27',3662,414,'2005-08-03 17:36:27',1,'2006-02-15 21:30:53'),(9992,'2005-07-31 17:29:48',4242,304,'2005-08-09 13:02:48',2,'2006-02-15 21:30:53'),(9993,'2005-07-31 17:30:20',2503,225,'2005-08-01 20:53:20',2,'2006-02-15 21:30:53'),(9994,'2005-07-31 17:30:31',2155,195,'2005-08-01 11:35:31',1,'2006-02-15 21:30:53'),(9995,'2005-07-31 17:30:47',1978,180,'2005-08-04 12:20:47',2,'2006-02-15 21:30:53'),(9996,'2005-07-31 17:32:03',3271,104,'2005-08-06 16:17:03',2,'2006-02-15 21:30:53'),(9997,'2005-07-31 17:37:30',640,579,'2005-08-02 14:49:30',1,'2006-02-15 21:30:53'),(9998,'2005-07-31 17:40:35',2549,30,'2005-08-04 18:15:35',1,'2006-02-15 21:30:53'),(9999,'2005-07-31 17:40:53',1438,543,'2005-08-01 14:25:53',1,'2006-02-15 21:30:53'),(10000,'2005-07-31 17:41:05',3221,576,'2005-08-02 20:51:05',1,'2006-02-15 21:30:53'),(10001,'2005-07-31 17:46:18',2188,244,'2005-08-07 20:38:18',1,'2006-02-15 21:30:53'),(10002,'2005-07-31 17:48:16',1002,323,'2005-08-06 16:15:16',1,'2006-02-15 21:30:53'),(10003,'2005-07-31 17:48:51',1603,13,'2005-08-02 14:23:51',1,'2006-02-15 21:30:53'),(10004,'2005-07-31 17:51:23',2396,570,'2005-08-03 19:12:23',1,'2006-02-15 21:30:53'),(10005,'2005-07-31 17:53:51',928,454,'2005-08-09 21:39:51',1,'2006-02-15 21:30:53'),(10006,'2005-07-31 17:54:35',2538,470,'2005-08-02 20:40:35',2,'2006-02-15 21:30:53'),(10007,'2005-07-31 17:54:58',293,445,'2005-08-05 17:24:58',2,'2006-02-15 21:30:53'),(10008,'2005-07-31 17:59:36',2589,91,'2005-08-03 22:43:36',2,'2006-02-15 21:30:53'),(10009,'2005-07-31 18:00:28',4441,437,'2005-08-08 22:24:28',2,'2006-02-15 21:30:53'),(10010,'2005-07-31 18:01:36',2655,373,'2005-08-07 20:27:36',2,'2006-02-15 21:30:53'),(10011,'2005-07-31 18:02:41',606,128,'2005-08-08 17:04:41',1,'2006-02-15 21:30:53'),(10012,'2005-07-31 18:06:06',2554,513,'2005-08-09 16:47:06',2,'2006-02-15 21:30:53'),(10013,'2005-07-31 18:08:21',2364,377,'2005-08-08 13:22:21',2,'2006-02-15 21:30:53'),(10014,'2005-07-31 18:10:56',2344,443,'2005-08-02 23:36:56',1,'2006-02-15 21:30:53'),(10015,'2005-07-31 18:11:17',67,153,'2005-08-03 15:48:17',2,'2006-02-15 21:30:53'),(10016,'2005-07-31 18:13:06',2183,478,'2005-08-09 22:11:06',1,'2006-02-15 21:30:53'),(10017,'2005-07-31 18:13:22',1495,424,'2005-08-05 16:03:22',1,'2006-02-15 21:30:53'),(10018,'2005-07-31 18:15:14',3708,481,'2005-08-05 14:44:14',2,'2006-02-15 21:30:53'),(10019,'2005-07-31 18:20:56',2114,536,'2005-08-07 14:25:56',1,'2006-02-15 21:30:53'),(10020,'2005-07-31 18:21:08',302,526,'2005-08-02 14:03:08',2,'2006-02-15 21:30:53'),(10021,'2005-07-31 18:24:39',3235,597,'2005-08-01 19:16:39',1,'2006-02-15 21:30:53'),(10022,'2005-07-31 18:25:30',1900,115,'2005-08-04 13:35:30',1,'2006-02-15 21:30:53'),(10023,'2005-07-31 18:25:51',384,318,'2005-08-09 18:00:51',1,'2006-02-15 21:30:53'),(10024,'2005-07-31 18:26:36',265,129,'2005-08-09 16:16:36',1,'2006-02-15 21:30:53'),(10025,'2005-07-31 18:29:09',475,565,'2005-08-07 14:20:09',2,'2006-02-15 21:30:53'),(10026,'2005-07-31 18:31:51',39,332,'2005-08-03 21:14:51',2,'2006-02-15 21:30:53'),(10027,'2005-07-31 18:33:51',525,287,'2005-08-09 18:40:51',1,'2006-02-15 21:30:53'),(10028,'2005-07-31 18:35:54',2305,323,'2005-08-01 13:01:54',2,'2006-02-15 21:30:53'),(10029,'2005-07-31 18:37:47',505,578,'2005-08-06 14:58:47',2,'2006-02-15 21:30:53'),(10030,'2005-07-31 18:39:36',1392,325,'2005-08-03 15:29:36',2,'2006-02-15 21:30:53'),(10031,'2005-07-31 18:40:15',3048,96,'2005-08-03 14:38:15',1,'2006-02-15 21:30:53'),(10032,'2005-07-31 18:41:55',2331,126,'2005-08-04 22:45:55',1,'2006-02-15 21:30:53'),(10033,'2005-07-31 18:44:29',4480,381,'2005-08-04 19:52:29',1,'2006-02-15 21:30:53'),(10034,'2005-07-31 18:45:30',354,442,'2005-08-04 21:13:30',2,'2006-02-15 21:30:53'),(10035,'2005-07-31 18:46:46',2694,333,'2005-08-04 20:33:46',1,'2006-02-15 21:30:53'),(10036,'2005-07-31 18:47:20',41,491,'2005-08-03 22:53:20',1,'2006-02-15 21:30:53'),(10037,'2005-07-31 18:48:08',438,58,'2005-08-09 19:11:08',2,'2006-02-15 21:30:53'),(10038,'2005-07-31 18:49:12',3727,112,'2005-08-01 18:02:12',1,'2006-02-15 21:30:53'),(10039,'2005-07-31 18:50:40',4391,111,'2005-08-01 18:49:40',2,'2006-02-15 21:30:53'),(10040,'2005-07-31 18:54:15',2281,268,'2005-08-05 17:33:15',2,'2006-02-15 21:30:53'),(10041,'2005-07-31 19:01:02',2994,379,'2005-08-07 21:32:02',1,'2006-02-15 21:30:53'),(10042,'2005-07-31 19:01:25',123,204,'2005-08-06 14:21:25',1,'2006-02-15 21:30:53'),(10043,'2005-07-31 19:02:07',2558,222,'2005-08-07 17:58:07',1,'2006-02-15 21:30:53'),(10044,'2005-07-31 19:02:33',3349,388,'2005-08-05 13:24:33',2,'2006-02-15 21:30:53'),(10045,'2005-07-31 19:04:35',58,118,'2005-08-07 16:53:35',1,'2006-02-15 21:30:53'),(10046,'2005-07-31 19:07:11',4302,50,'2005-08-03 13:25:11',1,'2006-02-15 21:30:53'),(10047,'2005-07-31 19:07:43',4195,244,'2005-08-07 00:20:43',2,'2006-02-15 21:30:53'),(10048,'2005-07-31 19:08:56',3821,267,'2005-08-05 20:15:56',2,'2006-02-15 21:30:53'),(10049,'2005-07-31 19:11:11',854,457,'2005-08-03 22:15:11',1,'2006-02-15 21:30:53'),(10050,'2005-07-31 19:13:29',295,230,'2005-08-06 15:44:29',1,'2006-02-15 21:30:53'),(10051,'2005-07-31 19:14:20',163,74,'2005-08-05 19:45:20',1,'2006-02-15 21:30:53'),(10052,'2005-07-31 19:15:13',3307,39,'2005-08-07 22:47:13',2,'2006-02-15 21:30:53'),(10053,'2005-07-31 19:15:39',4102,223,'2005-08-07 22:32:39',1,'2006-02-15 21:30:53'),(10054,'2005-07-31 19:15:52',2303,598,'2005-08-04 19:54:52',1,'2006-02-15 21:30:53'),(10055,'2005-07-31 19:15:58',2725,336,'2005-08-05 20:23:58',1,'2006-02-15 21:30:53'),(10056,'2005-07-31 19:19:13',281,237,'2005-08-01 16:09:13',2,'2006-02-15 21:30:53'),(10057,'2005-07-31 19:20:18',3485,230,'2005-08-08 17:59:18',2,'2006-02-15 21:30:53'),(10058,'2005-07-31 19:20:21',758,237,'2005-08-04 00:41:21',2,'2006-02-15 21:30:53'),(10059,'2005-07-31 19:20:49',2020,274,'2005-08-03 14:39:49',1,'2006-02-15 21:30:53'),(10060,'2005-07-31 19:23:00',1979,42,'2005-08-08 19:07:00',1,'2006-02-15 21:30:53'),(10061,'2005-07-31 19:23:25',1401,390,'2005-08-04 19:38:25',1,'2006-02-15 21:30:53'),(10062,'2005-07-31 19:24:55',1815,333,'2005-08-03 22:51:55',2,'2006-02-15 21:30:53'),(10063,'2005-07-31 19:25:13',3003,517,'2005-08-09 15:55:13',1,'2006-02-15 21:30:53'),(10064,'2005-07-31 19:27:02',3140,41,'2005-08-06 21:15:02',1,'2006-02-15 21:30:53'),(10065,'2005-07-31 19:27:34',1426,495,'2005-08-01 13:45:34',2,'2006-02-15 21:30:53'),(10066,'2005-07-31 19:30:01',4285,123,'2005-08-01 14:45:01',2,'2006-02-15 21:30:53'),(10067,'2005-07-31 19:37:58',1940,148,'2005-08-04 17:32:58',2,'2006-02-15 21:30:53'),(10068,'2005-07-31 19:39:38',4000,58,'2005-08-05 22:49:38',1,'2006-02-15 21:30:53'),(10069,'2005-07-31 19:43:18',2168,270,'2005-08-06 19:40:18',2,'2006-02-15 21:30:53'),(10070,'2005-07-31 19:46:29',1010,325,'2005-08-03 22:21:29',1,'2006-02-15 21:30:53'),(10071,'2005-07-31 19:49:35',2360,353,'2005-08-03 00:00:35',2,'2006-02-15 21:30:53'),(10072,'2005-07-31 19:50:37',3963,520,'2005-08-03 00:25:37',2,'2006-02-15 21:30:53'),(10073,'2005-07-31 19:53:15',4246,584,'2005-08-05 23:12:15',2,'2006-02-15 21:30:53'),(10074,'2005-07-31 19:57:16',1268,69,'2005-08-04 00:54:16',1,'2006-02-15 21:30:53'),(10075,'2005-07-31 19:58:42',2037,469,'2005-08-08 19:49:42',1,'2006-02-15 21:30:53'),(10076,'2005-07-31 20:00:34',1117,555,'2005-08-10 00:37:34',2,'2006-02-15 21:30:53'),(10077,'2005-07-31 20:01:06',2333,19,'2005-08-09 16:07:06',1,'2006-02-15 21:30:53'),(10078,'2005-07-31 20:02:02',3198,151,'2005-08-04 00:45:02',1,'2006-02-15 21:30:53'),(10079,'2005-07-31 20:05:45',4541,486,'2005-08-04 16:25:45',2,'2006-02-15 21:30:53'),(10080,'2005-07-31 20:07:10',4355,62,'2005-08-04 23:07:10',2,'2006-02-15 21:30:53'),(10081,'2005-07-31 20:07:44',3183,443,'2005-08-06 20:04:44',1,'2006-02-15 21:30:53'),(10082,'2005-07-31 20:09:32',1275,76,'2005-08-01 15:41:32',2,'2006-02-15 21:30:53'),(10083,'2005-07-31 20:10:19',2585,449,'2005-08-06 23:18:19',1,'2006-02-15 21:30:53'),(10084,'2005-07-31 20:11:29',524,528,'2005-08-06 22:28:29',2,'2006-02-15 21:30:53'),(10085,'2005-07-31 20:12:02',2556,392,'2005-08-03 00:03:02',2,'2006-02-15 21:30:53'),(10086,'2005-07-31 20:14:08',2853,205,'2005-08-07 01:33:08',2,'2006-02-15 21:30:53'),(10087,'2005-07-31 20:15:22',1393,245,'2005-08-07 01:33:22',1,'2006-02-15 21:30:53'),(10088,'2005-07-31 20:16:21',4293,46,'2005-08-01 22:47:21',2,'2006-02-15 21:30:53'),(10089,'2005-07-31 20:17:09',248,160,'2005-08-01 19:14:09',2,'2006-02-15 21:30:53'),(10090,'2005-07-31 20:22:01',4023,533,'2005-08-04 17:30:01',1,'2006-02-15 21:30:53'),(10091,'2005-07-31 20:23:13',1878,135,'2005-08-02 21:58:13',2,'2006-02-15 21:30:53'),(10092,'2005-07-31 20:28:09',4151,364,'2005-08-01 21:37:09',1,'2006-02-15 21:30:53'),(10093,'2005-07-31 20:30:32',3943,162,'2005-08-04 00:04:32',2,'2006-02-15 21:30:53'),(10094,'2005-07-31 20:31:18',2865,596,'2005-08-06 18:31:18',2,'2006-02-15 21:30:53'),(10095,'2005-07-31 20:38:35',4062,370,'2005-08-02 02:33:35',1,'2006-02-15 21:30:53'),(10096,'2005-07-31 20:38:58',3606,290,'2005-08-06 02:34:58',1,'2006-02-15 21:30:53'),(10097,'2005-07-31 20:39:38',784,519,'2005-08-08 22:22:38',1,'2006-02-15 21:30:53'),(10098,'2005-07-31 20:41:17',1324,155,'2005-08-02 00:06:17',2,'2006-02-15 21:30:53'),(10099,'2005-07-31 20:47:14',1960,220,'2005-08-02 17:25:14',1,'2006-02-15 21:30:53'),(10100,'2005-07-31 20:47:18',4050,330,'2005-08-03 16:58:18',2,'2006-02-15 21:30:53'),(10101,'2005-07-31 20:47:29',2513,119,'2005-08-04 21:28:29',1,'2006-02-15 21:30:53'),(10102,'2005-07-31 20:49:10',4078,170,'2005-08-08 20:15:10',1,'2006-02-15 21:30:53'),(10103,'2005-07-31 20:49:13',77,25,'2005-08-05 15:55:13',2,'2006-02-15 21:30:53'),(10104,'2005-07-31 20:49:14',3358,186,'2005-08-05 01:11:14',2,'2006-02-15 21:30:53'),(10105,'2005-07-31 20:54:20',112,286,'2005-08-09 17:45:20',1,'2006-02-15 21:30:53'),(10106,'2005-07-31 21:00:47',3444,556,'2005-08-02 20:11:47',2,'2006-02-15 21:30:53'),(10107,'2005-07-31 21:01:46',1326,414,'2005-08-09 01:33:46',2,'2006-02-15 21:30:53'),(10108,'2005-07-31 21:02:14',3703,326,'2005-08-01 18:28:14',1,'2006-02-15 21:30:53'),(10109,'2005-07-31 21:04:49',2852,403,'2005-08-08 19:25:49',1,'2006-02-15 21:30:53'),(10110,'2005-07-31 21:06:12',4081,138,'2005-08-03 02:03:12',2,'2006-02-15 21:30:53'),(10111,'2005-07-31 21:08:33',3474,38,'2005-08-06 02:58:33',2,'2006-02-15 21:30:53'),(10112,'2005-07-31 21:08:56',2643,198,'2005-08-01 23:35:56',2,'2006-02-15 21:30:53'),(10113,'2005-07-31 21:10:03',3974,461,'2005-08-02 21:13:03',2,'2006-02-15 21:30:53'),(10114,'2005-07-31 21:12:58',3881,218,'2005-08-02 19:45:58',2,'2006-02-15 21:30:53'),(10115,'2005-07-31 21:13:47',2731,68,'2005-08-10 00:44:47',1,'2006-02-15 21:30:53'),(10116,'2005-07-31 21:14:02',738,28,'2005-08-03 01:48:02',2,'2006-02-15 21:30:53'),(10117,'2005-07-31 21:14:31',1894,459,'2005-08-01 15:59:31',2,'2006-02-15 21:30:53'),(10118,'2005-07-31 21:16:31',1209,143,'2005-08-03 02:32:31',1,'2006-02-15 21:30:53'),(10119,'2005-07-31 21:20:59',54,351,'2005-08-02 23:14:59',2,'2006-02-15 21:30:53'),(10120,'2005-07-31 21:24:24',1709,396,'2005-08-03 17:44:24',2,'2006-02-15 21:30:53'),(10121,'2005-07-31 21:24:53',2969,425,'2005-08-03 22:24:53',1,'2006-02-15 21:30:53'),(10122,'2005-07-31 21:29:28',4229,196,'2005-08-09 00:04:28',1,'2006-02-15 21:30:53'),(10123,'2005-07-31 21:30:46',4564,487,'2005-08-06 16:28:46',1,'2006-02-15 21:30:53'),(10124,'2005-07-31 21:31:49',1956,396,'2005-08-04 00:06:49',1,'2006-02-15 21:30:53'),(10125,'2005-07-31 21:33:03',493,178,'2005-08-01 19:10:03',1,'2006-02-15 21:30:53'),(10126,'2005-07-31 21:36:07',3,39,'2005-08-03 23:59:07',1,'2006-02-15 21:30:53'),(10127,'2005-07-31 21:39:48',717,478,'2005-08-06 00:10:48',1,'2006-02-15 21:30:53'),(10128,'2005-07-31 21:40:04',2559,508,'2005-08-02 02:21:04',1,'2006-02-15 21:30:53'),(10129,'2005-07-31 21:41:35',2848,564,'2005-08-05 17:05:35',1,'2006-02-15 21:30:53'),(10130,'2005-07-31 21:44:30',3964,95,'2005-08-04 17:06:30',1,'2006-02-15 21:30:53'),(10131,'2005-07-31 21:45:28',4169,510,'2005-08-04 00:19:28',2,'2006-02-15 21:30:53'),(10132,'2005-07-31 21:50:24',3934,23,'2005-08-07 23:37:24',2,'2006-02-15 21:30:53'),(10133,'2005-07-31 21:55:07',614,234,'2005-08-08 23:04:07',1,'2006-02-15 21:30:53'),(10134,'2005-07-31 21:56:10',4483,311,'2005-08-06 21:20:10',1,'2006-02-15 21:30:53'),(10135,'2005-07-31 21:57:32',4193,307,'2005-08-05 22:23:32',1,'2006-02-15 21:30:53'),(10136,'2005-07-31 21:58:56',3142,2,'2005-08-03 19:44:56',1,'2006-02-15 21:30:53'),(10137,'2005-07-31 22:01:41',612,236,'2005-08-07 22:24:41',1,'2006-02-15 21:30:53'),(10138,'2005-07-31 22:02:09',179,225,'2005-08-07 20:46:09',2,'2006-02-15 21:30:53'),(10139,'2005-07-31 22:02:20',407,441,'2005-08-04 02:09:20',1,'2006-02-15 21:30:53'),(10140,'2005-07-31 22:03:20',2494,550,'2005-08-07 23:15:20',2,'2006-02-15 21:30:53'),(10141,'2005-07-31 22:08:29',8,8,'2005-08-06 16:59:29',1,'2006-02-15 21:30:53'),(10142,'2005-07-31 22:10:54',1839,257,'2005-08-09 19:04:54',2,'2006-02-15 21:30:53'),(10143,'2005-07-31 22:11:43',2139,271,'2005-08-09 17:48:43',2,'2006-02-15 21:30:53'),(10144,'2005-07-31 22:13:52',3011,49,'2005-08-05 19:27:52',1,'2006-02-15 21:30:53'),(10145,'2005-07-31 22:15:13',2511,361,'2005-08-06 23:26:13',1,'2006-02-15 21:30:53'),(10146,'2005-07-31 22:17:56',1721,559,'2005-08-02 21:27:56',1,'2006-02-15 21:30:53'),(10147,'2005-07-31 22:18:43',1351,198,'2005-08-02 23:08:43',2,'2006-02-15 21:30:53'),(10148,'2005-07-31 22:19:16',1381,63,'2005-08-05 00:15:16',2,'2006-02-15 21:30:53'),(10149,'2005-07-31 22:20:46',890,276,'2005-08-07 23:12:46',2,'2006-02-15 21:30:53'),(10150,'2005-07-31 22:22:00',2328,419,'2005-08-05 01:17:00',2,'2006-02-15 21:30:53'),(10151,'2005-07-31 22:22:37',4442,361,'2005-08-01 22:20:37',1,'2006-02-15 21:30:53'),(10152,'2005-07-31 22:28:05',1114,244,'2005-08-08 22:39:05',2,'2006-02-15 21:30:53'),(10153,'2005-07-31 22:30:10',2945,297,'2005-08-06 02:32:10',2,'2006-02-15 21:30:53'),(10154,'2005-07-31 22:30:49',2745,149,'2005-08-07 03:05:49',2,'2006-02-15 21:30:53'),(10155,'2005-07-31 22:31:43',3176,235,'2005-08-07 02:43:43',1,'2006-02-15 21:30:53'),(10156,'2005-07-31 22:36:00',141,179,'2005-08-02 00:03:00',2,'2006-02-15 21:30:53'),(10157,'2005-07-31 22:38:48',2960,232,'2005-08-01 21:38:48',1,'2006-02-15 21:30:53'),(10158,'2005-07-31 22:40:31',1626,393,'2005-08-08 18:25:31',2,'2006-02-15 21:30:53'),(10159,'2005-07-31 22:54:30',1174,515,'2005-08-03 00:43:30',2,'2006-02-15 21:30:53'),(10160,'2005-07-31 23:07:40',863,295,'2005-08-05 23:34:40',1,'2006-02-15 21:30:53'),(10161,'2005-07-31 23:09:41',2651,120,'2005-08-02 20:46:41',2,'2006-02-15 21:30:53'),(10162,'2005-07-31 23:11:01',1327,475,'2005-08-07 01:52:01',2,'2006-02-15 21:30:53'),(10163,'2005-07-31 23:12:34',2811,425,'2005-08-01 22:47:34',2,'2006-02-15 21:30:53'),(10164,'2005-07-31 23:17:57',1405,89,'2005-08-05 19:43:57',1,'2006-02-15 21:30:53'),(10165,'2005-07-31 23:21:23',3476,50,'2005-08-06 18:06:23',1,'2006-02-15 21:30:53'),(10166,'2005-07-31 23:22:20',4304,484,'2005-08-07 18:06:20',2,'2006-02-15 21:30:53'),(10167,'2005-07-31 23:24:31',1222,129,'2005-08-06 17:42:31',2,'2006-02-15 21:30:53'),(10168,'2005-07-31 23:25:24',4548,570,'2005-08-02 19:03:24',1,'2006-02-15 21:30:53'),(10169,'2005-07-31 23:27:13',2675,57,'2005-08-05 20:32:13',2,'2006-02-15 21:30:53'),(10170,'2005-07-31 23:27:31',804,41,'2005-08-08 04:53:31',2,'2006-02-15 21:30:53'),(10171,'2005-07-31 23:29:05',1367,401,'2005-08-03 19:39:05',1,'2006-02-15 21:30:53'),(10172,'2005-07-31 23:29:51',2506,426,'2005-08-09 01:57:51',1,'2006-02-15 21:30:53'),(10173,'2005-07-31 23:36:59',2527,326,'2005-08-08 20:20:59',2,'2006-02-15 21:30:53'),(10174,'2005-07-31 23:40:08',2459,359,'2005-08-06 21:08:08',2,'2006-02-15 21:30:53'),(10175,'2005-07-31 23:40:11',3672,137,'2005-08-09 02:22:11',1,'2006-02-15 21:30:53'),(10176,'2005-07-31 23:40:35',1181,19,'2005-08-09 00:46:35',2,'2006-02-15 21:30:53'),(10177,'2005-07-31 23:42:33',2242,279,'2005-08-03 01:30:33',2,'2006-02-15 21:30:53'),(10178,'2005-07-31 23:43:04',1582,491,'2005-08-03 00:43:04',1,'2006-02-15 21:30:53'),(10179,'2005-07-31 23:49:54',2136,131,'2005-08-01 20:46:54',2,'2006-02-15 21:30:53'),(10180,'2005-07-31 23:57:43',757,50,'2005-08-09 04:04:43',2,'2006-02-15 21:30:53'),(10181,'2005-08-01 00:00:44',3111,113,'2005-08-04 19:33:44',1,'2006-02-15 21:30:53'),(10182,'2005-08-01 00:08:01',4112,578,'2005-08-09 18:14:01',2,'2006-02-15 21:30:53'),(10183,'2005-08-01 00:08:01',4319,377,'2005-08-09 20:41:01',1,'2006-02-15 21:30:53'),(10184,'2005-08-01 00:09:33',2785,77,'2005-08-05 04:12:33',2,'2006-02-15 21:30:53'),(10185,'2005-08-01 00:12:11',1266,64,'2005-08-03 03:03:11',1,'2006-02-15 21:30:53'),(10186,'2005-08-01 00:12:36',4563,294,'2005-08-07 05:08:36',1,'2006-02-15 21:30:53'),(10187,'2005-08-01 00:15:49',1629,400,'2005-08-05 01:00:49',2,'2006-02-15 21:30:53'),(10188,'2005-08-01 00:19:41',1221,331,'2005-08-08 00:19:41',2,'2006-02-15 21:30:53'),(10189,'2005-08-01 00:25:00',616,509,'2005-08-03 06:01:00',2,'2006-02-15 21:30:53'),(10190,'2005-08-01 00:27:53',4411,138,'2005-08-01 20:32:53',2,'2006-02-15 21:30:53'),(10191,'2005-08-01 00:28:38',1131,196,'2005-08-06 02:23:38',1,'2006-02-15 21:30:53'),(10192,'2005-08-01 00:33:00',1632,569,'2005-08-05 03:37:00',2,'2006-02-15 21:30:53'),(10193,'2005-08-01 00:33:27',2036,358,'2005-08-07 20:15:27',1,'2006-02-15 21:30:53'),(10194,'2005-08-01 00:33:52',1447,290,'2005-08-06 04:50:52',2,'2006-02-15 21:30:53'),(10195,'2005-08-01 00:34:42',2691,396,'2005-08-08 05:04:42',2,'2006-02-15 21:30:53'),(10196,'2005-08-01 00:34:51',3070,199,'2005-08-05 03:43:51',1,'2006-02-15 21:30:53'),(10197,'2005-08-01 00:35:25',1186,127,'2005-08-07 06:04:25',2,'2006-02-15 21:30:53'),(10198,'2005-08-01 00:36:15',1297,366,'2005-08-07 06:18:15',2,'2006-02-15 21:30:53'),(10199,'2005-08-01 00:38:55',3665,526,'2005-08-05 03:41:55',1,'2006-02-15 21:30:53'),(10200,'2005-08-01 00:39:05',580,421,'2005-08-05 01:07:05',1,'2006-02-15 21:30:53'),(10201,'2005-08-01 00:42:18',3649,299,'2005-08-08 20:49:18',2,'2006-02-15 21:30:53'),(10202,'2005-08-01 00:43:18',1099,306,'2005-08-08 23:26:18',1,'2006-02-15 21:30:53'),(10203,'2005-08-01 00:45:27',1096,157,'2005-08-04 22:45:27',2,'2006-02-15 21:30:53'),(10204,'2005-08-01 00:47:39',764,572,'2005-08-05 01:11:39',1,'2006-02-15 21:30:53'),(10205,'2005-08-01 00:48:24',33,87,'2005-08-06 23:53:24',1,'2006-02-15 21:30:53'),(10206,'2005-08-01 00:52:40',4479,90,'2005-08-10 02:36:40',2,'2006-02-15 21:30:53'),(10207,'2005-08-01 00:53:01',2925,334,'2005-08-05 05:51:01',2,'2006-02-15 21:30:53'),(10208,'2005-08-01 00:54:51',3324,246,'2005-08-04 22:39:51',2,'2006-02-15 21:30:53'),(10209,'2005-08-01 00:56:47',2429,303,'2005-08-03 19:58:47',2,'2006-02-15 21:30:53'),(10210,'2005-08-01 00:58:52',49,391,'2005-08-10 01:16:52',1,'2006-02-15 21:30:53'),(10211,'2005-08-01 01:01:16',810,530,'2005-08-10 01:31:16',1,'2006-02-15 21:30:53'),(10212,'2005-08-01 01:01:35',3728,324,'2005-08-02 23:02:35',1,'2006-02-15 21:30:53'),(10213,'2005-08-01 01:03:18',1462,106,'2005-08-09 20:07:18',1,'2006-02-15 21:30:53'),(10214,'2005-08-01 01:04:15',648,597,'2005-08-01 19:31:15',2,'2006-02-15 21:30:53'),(10215,'2005-08-01 01:04:28',838,345,'2005-08-09 21:43:28',2,'2006-02-15 21:30:53'),(10216,'2005-08-01 01:06:27',3603,436,'2005-08-08 22:41:27',2,'2006-02-15 21:30:53'),(10217,'2005-08-01 01:07:27',1193,389,'2005-08-09 00:42:27',1,'2006-02-15 21:30:53'),(10218,'2005-08-01 01:09:44',3886,101,'2005-08-05 20:08:44',1,'2006-02-15 21:30:53'),(10219,'2005-08-01 01:10:33',2262,505,'2005-08-10 02:45:33',2,'2006-02-15 21:30:53'),(10220,'2005-08-01 01:13:22',3920,294,'2005-08-04 22:57:22',2,'2006-02-15 21:30:53'),(10221,'2005-08-01 01:16:50',3051,373,'2005-08-03 05:35:50',2,'2006-02-15 21:30:53'),(10222,'2005-08-01 01:17:42',1214,295,'2005-08-08 02:45:42',1,'2006-02-15 21:30:53'),(10223,'2005-08-01 01:23:15',1370,522,'2005-08-02 19:39:15',1,'2006-02-15 21:30:53'),(10224,'2005-08-01 01:31:56',1443,587,'2005-08-05 21:21:56',2,'2006-02-15 21:30:53'),(10225,'2005-08-01 01:38:40',3131,498,'2005-08-06 20:00:40',1,'2006-02-15 21:30:53'),(10226,'2005-08-01 01:40:04',3067,107,'2005-08-08 01:02:04',1,'2006-02-15 21:30:53'),(10227,'2005-08-01 01:42:22',872,571,'2005-08-09 23:45:22',2,'2006-02-15 21:30:53'),(10228,'2005-08-01 01:43:18',1742,106,'2005-08-06 22:10:18',2,'2006-02-15 21:30:53'),(10229,'2005-08-01 01:45:26',3459,175,'2005-08-10 06:21:26',1,'2006-02-15 21:30:53'),(10230,'2005-08-01 01:49:36',76,398,'2005-08-05 01:29:36',2,'2006-02-15 21:30:53'),(10231,'2005-08-01 01:50:49',1056,511,'2005-08-06 03:12:49',1,'2006-02-15 21:30:53'),(10232,'2005-08-01 01:50:55',586,512,'2005-08-03 04:12:55',1,'2006-02-15 21:30:53'),(10233,'2005-08-01 01:54:23',4571,459,'2005-08-10 00:23:23',2,'2006-02-15 21:30:53'),(10234,'2005-08-01 01:56:20',1641,207,'2005-08-09 01:51:20',2,'2006-02-15 21:30:53'),(10235,'2005-08-01 01:57:48',2850,30,'2005-08-10 07:38:48',2,'2006-02-15 21:30:53'),(10236,'2005-08-01 02:05:34',3754,470,'2005-08-01 23:40:34',1,'2006-02-15 21:30:53'),(10237,'2005-08-01 02:07:32',432,313,'2005-08-07 03:54:32',1,'2006-02-15 21:30:53'),(10238,'2005-08-01 02:08:05',561,192,'2005-08-02 01:52:05',1,'2006-02-15 21:30:53'),(10239,'2005-08-01 02:09:22',1232,467,'2005-08-04 01:35:22',2,'2006-02-15 21:30:53'),(10240,'2005-08-01 02:09:33',4494,109,'2005-08-07 02:22:33',2,'2006-02-15 21:30:53'),(10241,'2005-08-01 02:12:25',1526,161,'2005-08-08 00:37:25',1,'2006-02-15 21:30:53'),(10242,'2005-08-01 02:18:12',1825,342,'2005-08-02 22:32:12',2,'2006-02-15 21:30:53'),(10243,'2005-08-01 02:18:46',2236,132,'2005-08-06 21:45:46',1,'2006-02-15 21:30:53'),(10244,'2005-08-01 02:20:01',567,51,'2005-08-06 23:06:01',2,'2006-02-15 21:30:53'),(10245,'2005-08-01 02:24:09',2880,163,'2005-08-02 02:31:09',1,'2006-02-15 21:30:53'),(10246,'2005-08-01 02:29:50',3598,261,'2005-08-09 01:17:50',2,'2006-02-15 21:30:53'),(10247,'2005-08-01 02:34:06',4035,189,'2005-08-09 02:33:06',1,'2006-02-15 21:30:53'),(10248,'2005-08-01 02:35:28',2146,298,'2005-08-08 02:24:28',2,'2006-02-15 21:30:53'),(10249,'2005-08-01 02:35:39',135,437,'2005-08-06 06:50:39',1,'2006-02-15 21:30:53'),(10250,'2005-08-01 02:38:42',3706,116,'2005-08-07 03:59:42',2,'2006-02-15 21:30:53'),(10251,'2005-08-01 02:39:12',2986,39,'2005-08-06 03:51:12',1,'2006-02-15 21:30:53'),(10252,'2005-08-01 02:39:39',2380,86,'2005-08-10 00:40:39',2,'2006-02-15 21:30:53'),(10253,'2005-08-01 02:39:49',1406,101,'2005-08-08 04:28:49',2,'2006-02-15 21:30:53'),(10254,'2005-08-01 02:42:03',2238,416,'2005-08-05 23:31:03',1,'2006-02-15 21:30:53'),(10255,'2005-08-01 02:46:13',4558,459,'2005-08-03 05:54:13',1,'2006-02-15 21:30:53'),(10256,'2005-08-01 02:47:11',780,58,'2005-08-05 05:21:11',2,'2006-02-15 21:30:53'),(10257,'2005-08-01 02:49:43',2403,543,'2005-08-04 04:45:43',2,'2006-02-15 21:30:53'),(10258,'2005-08-01 02:51:09',2062,469,'2005-08-08 23:57:09',2,'2006-02-15 21:30:53'),(10259,'2005-08-01 02:52:05',1881,566,'2005-08-03 20:54:05',1,'2006-02-15 21:30:53'),(10260,'2005-08-01 02:58:07',2864,461,'2005-08-05 02:06:07',2,'2006-02-15 21:30:53'),(10261,'2005-08-01 02:58:27',2346,50,'2005-08-01 21:55:27',2,'2006-02-15 21:30:53'),(10262,'2005-08-01 03:01:26',3842,181,'2005-08-08 08:03:26',2,'2006-02-15 21:30:53'),(10263,'2005-08-01 03:02:48',2420,415,'2005-08-08 02:16:48',2,'2006-02-15 21:30:53'),(10264,'2005-08-01 03:03:12',1374,297,'2005-08-08 00:34:12',2,'2006-02-15 21:30:53'),(10265,'2005-08-01 03:05:04',3338,510,'2005-08-08 08:09:04',1,'2006-02-15 21:30:53'),(10266,'2005-08-01 03:05:59',476,49,'2005-08-06 06:23:59',1,'2006-02-15 21:30:53'),(10267,'2005-08-01 03:07:26',3883,72,'2005-08-07 22:49:26',1,'2006-02-15 21:30:53'),(10268,'2005-08-01 03:08:56',2755,138,'2005-08-08 02:41:56',1,'2006-02-15 21:30:53'),(10269,'2005-08-01 03:09:26',2537,39,'2005-08-02 00:01:26',1,'2006-02-15 21:30:53'),(10270,'2005-08-01 03:10:24',2025,168,'2005-08-07 03:04:24',2,'2006-02-15 21:30:53'),(10271,'2005-08-01 03:13:39',3692,6,'2005-08-07 23:40:39',1,'2006-02-15 21:30:53'),(10272,'2005-08-01 03:14:34',128,273,'2005-08-10 05:56:34',2,'2006-02-15 21:30:53'),(10273,'2005-08-01 03:14:47',1458,212,'2005-08-07 03:59:47',1,'2006-02-15 21:30:53'),(10274,'2005-08-01 03:16:51',2916,375,'2005-08-04 22:22:51',2,'2006-02-15 21:30:53'),(10275,'2005-08-01 03:20:08',669,463,'2005-08-08 06:48:08',1,'2006-02-15 21:30:53'),(10276,'2005-08-01 03:22:23',2201,48,'2005-08-03 07:59:23',1,'2006-02-15 21:30:53'),(10277,'2005-08-01 03:22:41',1472,176,'2005-08-05 05:07:41',1,'2006-02-15 21:30:53'),(10278,'2005-08-01 03:25:27',2497,154,'2005-08-08 07:52:27',1,'2006-02-15 21:30:53'),(10279,'2005-08-01 03:26:44',3794,247,'2005-08-07 22:35:44',2,'2006-02-15 21:30:53'),(10280,'2005-08-01 03:27:15',1457,542,'2005-08-07 23:01:15',2,'2006-02-15 21:30:53'),(10281,'2005-08-01 03:28:33',1047,549,'2005-08-02 05:06:33',1,'2006-02-15 21:30:53'),(10282,'2005-08-01 03:29:10',617,472,'2005-08-07 06:16:10',1,'2006-02-15 21:30:53'),(10283,'2005-08-01 03:29:45',4237,462,'2005-08-07 04:19:45',1,'2006-02-15 21:30:53'),(10284,'2005-08-01 03:33:19',2879,20,'2005-08-09 07:58:19',1,'2006-02-15 21:30:53'),(10285,'2005-08-01 03:35:11',4523,167,'2005-08-05 03:55:11',2,'2006-02-15 21:30:53'),(10286,'2005-08-01 03:35:58',498,532,'2005-08-10 05:17:58',2,'2006-02-15 21:30:53'),(10287,'2005-08-01 03:37:01',125,141,'2005-08-05 23:03:01',2,'2006-02-15 21:30:53'),(10288,'2005-08-01 03:38:42',572,63,'2005-08-06 04:34:42',1,'2006-02-15 21:30:53'),(10289,'2005-08-01 03:39:48',3153,566,'2005-08-08 02:56:48',1,'2006-02-15 21:30:53'),(10290,'2005-08-01 03:39:50',4542,364,'2005-08-08 22:29:50',2,'2006-02-15 21:30:53'),(10291,'2005-08-01 03:39:57',2056,420,'2005-08-05 02:05:57',2,'2006-02-15 21:30:53'),(10292,'2005-08-01 03:42:40',2562,340,'2005-08-01 23:36:40',2,'2006-02-15 21:30:53'),(10293,'2005-08-01 03:44:26',1570,258,'2005-08-05 04:16:26',2,'2006-02-15 21:30:53'),(10294,'2005-08-01 03:48:12',528,28,'2005-08-09 01:19:12',2,'2006-02-15 21:30:53'),(10295,'2005-08-01 03:53:49',2355,123,'2005-08-10 03:56:49',1,'2006-02-15 21:30:53'),(10296,'2005-08-01 04:04:37',1958,573,'2005-08-01 23:59:37',1,'2006-02-15 21:30:53'),(10297,'2005-08-01 04:05:04',2795,289,'2005-08-09 06:08:04',1,'2006-02-15 21:30:53'),(10298,'2005-08-01 04:06:03',1383,323,'2005-08-05 05:59:03',2,'2006-02-15 21:30:53'),(10299,'2005-08-01 04:08:04',1125,369,'2005-08-04 08:11:04',1,'2006-02-15 21:30:53'),(10300,'2005-08-01 04:08:11',4334,207,'2005-08-04 00:24:11',1,'2006-02-15 21:30:53'),(10301,'2005-08-01 04:09:37',3072,583,'2005-08-04 23:14:37',2,'2006-02-15 21:30:53'),(10302,'2005-08-01 04:12:08',1043,144,'2005-08-01 22:12:08',2,'2006-02-15 21:30:53'),(10303,'2005-08-01 04:13:33',936,479,'2005-08-06 02:16:33',2,'2006-02-15 21:30:53'),(10304,'2005-08-01 04:14:12',1538,346,'2005-08-07 22:38:12',1,'2006-02-15 21:30:53'),(10305,'2005-08-01 04:16:16',2946,160,'2005-08-07 23:47:16',1,'2006-02-15 21:30:53'),(10306,'2005-08-01 04:19:18',2819,541,'2005-08-09 02:16:18',1,'2006-02-15 21:30:53'),(10307,'2005-08-01 04:21:54',975,332,'2005-08-04 09:24:54',2,'2006-02-15 21:30:53'),(10308,'2005-08-01 04:22:49',588,240,'2005-08-09 04:39:49',2,'2006-02-15 21:30:53'),(10309,'2005-08-01 04:24:18',1505,156,'2005-08-09 08:32:18',2,'2006-02-15 21:30:53'),(10310,'2005-08-01 04:24:47',9,271,'2005-08-04 05:36:47',2,'2006-02-15 21:30:53'),(10311,'2005-08-01 04:27:59',4211,151,'2005-08-02 08:51:59',1,'2006-02-15 21:30:53'),(10312,'2005-08-01 04:29:06',4389,172,'2005-08-08 04:52:06',2,'2006-02-15 21:30:53'),(10313,'2005-08-01 04:29:29',1194,80,'2005-08-04 08:12:29',2,'2006-02-15 21:30:53'),(10314,'2005-08-01 04:31:18',1548,252,'2005-08-06 01:49:18',2,'2006-02-15 21:30:53'),(10315,'2005-08-01 04:34:45',895,258,'2005-08-07 05:27:45',1,'2006-02-15 21:30:53'),(10316,'2005-08-01 04:34:57',1907,469,'2005-08-06 02:34:57',2,'2006-02-15 21:30:53'),(10317,'2005-08-01 04:35:34',110,561,'2005-08-06 02:27:34',2,'2006-02-15 21:30:53'),(10318,'2005-08-01 04:36:53',885,548,'2005-08-04 00:54:53',1,'2006-02-15 21:30:53'),(10319,'2005-08-01 04:37:19',3120,394,'2005-08-05 03:18:19',2,'2006-02-15 21:30:53'),(10320,'2005-08-01 04:39:26',2298,152,'2005-08-08 06:01:26',1,'2006-02-15 21:30:53'),(10321,'2005-08-01 04:40:02',4512,177,'2005-08-03 04:18:02',1,'2006-02-15 21:30:53'),(10322,'2005-08-01 04:44:13',1543,535,'2005-08-08 00:20:13',2,'2006-02-15 21:30:53'),(10323,'2005-08-01 04:44:58',3539,577,'2005-08-06 07:56:58',1,'2006-02-15 21:30:53'),(10324,'2005-08-01 04:49:06',523,25,'2005-08-09 08:04:06',2,'2006-02-15 21:30:53'),(10325,'2005-08-01 04:52:12',2749,258,'2005-08-08 09:31:12',1,'2006-02-15 21:30:53'),(10326,'2005-08-01 04:55:34',3856,325,'2005-08-02 05:18:34',1,'2006-02-15 21:30:53'),(10327,'2005-08-01 04:55:35',328,382,'2005-08-07 08:17:35',2,'2006-02-15 21:30:53'),(10328,'2005-08-01 04:56:10',1191,85,'2005-08-01 23:22:10',2,'2006-02-15 21:30:53'),(10329,'2005-08-01 04:56:13',2289,302,'2005-08-03 03:54:13',1,'2006-02-15 21:30:53'),(10330,'2005-08-01 04:57:04',1580,7,'2005-08-07 23:00:04',2,'2006-02-15 21:30:53'),(10331,'2005-08-01 04:57:14',4152,575,'2005-08-07 06:46:14',1,'2006-02-15 21:30:53'),(10332,'2005-08-01 04:57:32',642,258,'2005-08-10 02:42:32',2,'2006-02-15 21:30:53'),(10333,'2005-08-01 04:58:32',3955,499,'2005-08-04 00:51:32',2,'2006-02-15 21:30:53'),(10334,'2005-08-01 04:58:42',3387,445,'2005-08-09 02:00:42',1,'2006-02-15 21:30:53'),(10335,'2005-08-01 04:59:30',323,33,'2005-08-05 02:26:30',1,'2006-02-15 21:30:53'),(10336,'2005-08-01 04:59:53',1091,370,'2005-08-03 08:05:53',2,'2006-02-15 21:30:53'),(10337,'2005-08-01 05:01:46',307,451,'2005-08-10 02:41:46',1,'2006-02-15 21:30:53'),(10338,'2005-08-01 05:03:03',1295,339,'2005-08-09 05:13:03',2,'2006-02-15 21:30:53'),(10339,'2005-08-01 05:05:50',615,363,'2005-08-10 07:15:50',2,'2006-02-15 21:30:53'),(10340,'2005-08-01 05:07:03',3608,568,'2005-08-06 01:03:03',1,'2006-02-15 21:30:53'),(10341,'2005-08-01 05:10:02',3304,445,'2005-08-07 11:01:02',1,'2006-02-15 21:30:53'),(10342,'2005-08-01 05:11:11',332,140,'2005-08-10 00:27:11',1,'2006-02-15 21:30:53'),(10343,'2005-08-01 05:15:47',2627,267,'2005-08-02 04:48:47',2,'2006-02-15 21:30:53'),(10344,'2005-08-01 05:18:23',3673,367,'2005-08-06 05:20:23',1,'2006-02-15 21:30:53'),(10345,'2005-08-01 05:18:56',3985,42,'2005-08-04 01:34:56',2,'2006-02-15 21:30:53'),(10346,'2005-08-01 05:19:23',4192,476,'2005-08-06 01:00:23',1,'2006-02-15 21:30:53'),(10347,'2005-08-01 05:20:03',953,574,'2005-08-04 10:03:03',1,'2006-02-15 21:30:53'),(10348,'2005-08-01 05:23:00',2076,14,'2005-08-04 01:12:00',2,'2006-02-15 21:30:53'),(10349,'2005-08-01 05:27:13',114,295,'2005-08-08 10:15:13',1,'2006-02-15 21:30:53'),(10350,'2005-08-01 05:30:05',2067,78,'2005-08-05 09:59:05',1,'2006-02-15 21:30:53'),(10351,'2005-08-01 05:32:13',3725,173,'2005-08-08 09:48:13',1,'2006-02-15 21:30:53'),(10352,'2005-08-01 05:44:36',1288,564,'2005-08-05 07:15:36',2,'2006-02-15 21:30:53'),(10353,'2005-08-01 05:46:33',1446,535,'2005-08-08 09:14:33',1,'2006-02-15 21:30:53'),(10354,'2005-08-01 05:47:10',1680,416,'2005-08-06 09:04:10',1,'2006-02-15 21:30:53'),(10355,'2005-08-01 05:47:37',2158,161,'2005-08-02 09:28:37',2,'2006-02-15 21:30:53'),(10356,'2005-08-01 05:49:17',313,56,'2005-08-10 05:57:17',1,'2006-02-15 21:30:53'),(10357,'2005-08-01 05:49:49',3102,475,'2005-08-04 02:34:49',2,'2006-02-15 21:30:53'),(10358,'2005-08-01 05:50:07',3039,517,'2005-08-03 08:18:07',1,'2006-02-15 21:30:53'),(10359,'2005-08-01 05:52:21',259,369,'2005-08-06 05:52:21',2,'2006-02-15 21:30:53'),(10360,'2005-08-01 05:52:53',1129,443,'2005-08-05 10:55:53',1,'2006-02-15 21:30:53'),(10361,'2005-08-01 05:53:49',318,529,'2005-08-10 00:42:49',2,'2006-02-15 21:30:53'),(10362,'2005-08-01 05:55:13',72,181,'2005-08-10 10:23:13',2,'2006-02-15 21:30:53'),(10363,'2005-08-01 06:01:52',320,174,'2005-08-05 03:56:52',1,'2006-02-15 21:30:53'),(10364,'2005-08-01 06:06:49',1842,317,'2005-08-09 06:05:49',2,'2006-02-15 21:30:53'),(10365,'2005-08-01 06:08:44',4032,442,'2005-08-06 02:07:44',1,'2006-02-15 21:30:53'),(10366,'2005-08-01 06:09:37',2654,119,'2005-08-05 03:19:37',1,'2006-02-15 21:30:53'),(10367,'2005-08-01 06:12:19',3408,242,'2005-08-04 12:11:19',2,'2006-02-15 21:30:53'),(10368,'2005-08-01 06:13:38',3535,593,'2005-08-08 04:40:38',2,'2006-02-15 21:30:53'),(10369,'2005-08-01 06:13:44',2534,424,'2005-08-07 09:46:44',1,'2006-02-15 21:30:53'),(10370,'2005-08-01 06:18:04',4358,546,'2005-08-05 01:41:04',2,'2006-02-15 21:30:53'),(10371,'2005-08-01 06:20:29',923,327,'2005-08-04 00:31:29',2,'2006-02-15 21:30:53'),(10372,'2005-08-01 06:23:48',635,419,'2005-08-06 03:47:48',1,'2006-02-15 21:30:53'),(10373,'2005-08-01 06:24:26',1754,588,'2005-08-02 12:07:26',1,'2006-02-15 21:30:53'),(10374,'2005-08-01 06:25:27',4351,307,'2005-08-07 05:44:27',2,'2006-02-15 21:30:53'),(10375,'2005-08-01 06:26:22',857,202,'2005-08-06 02:51:22',2,'2006-02-15 21:30:53'),(10376,'2005-08-01 06:27:13',4194,474,'2005-08-07 06:11:13',2,'2006-02-15 21:30:53'),(10377,'2005-08-01 06:28:28',2401,559,'2005-08-10 05:45:28',2,'2006-02-15 21:30:53'),(10378,'2005-08-01 06:30:04',4110,113,'2005-08-06 09:10:04',1,'2006-02-15 21:30:53'),(10379,'2005-08-01 06:34:29',3103,141,'2005-08-06 07:49:29',1,'2006-02-15 21:30:53'),(10380,'2005-08-01 06:34:36',2225,533,'2005-08-02 09:08:36',1,'2006-02-15 21:30:53'),(10381,'2005-08-01 06:36:37',522,412,'2005-08-05 11:17:37',1,'2006-02-15 21:30:53'),(10382,'2005-08-01 06:36:45',4455,242,'2005-08-02 06:06:45',1,'2006-02-15 21:30:53'),(10383,'2005-08-01 06:37:16',4166,592,'2005-08-03 07:36:16',2,'2006-02-15 21:30:53'),(10384,'2005-08-01 06:39:14',2622,366,'2005-08-02 03:06:14',1,'2006-02-15 21:30:53'),(10385,'2005-08-01 06:39:55',778,179,'2005-08-06 02:16:55',1,'2006-02-15 21:30:53'),(10386,'2005-08-01 06:42:20',1568,26,'2005-08-07 06:12:20',2,'2006-02-15 21:30:53'),(10387,'2005-08-01 06:42:31',1651,87,'2005-08-08 07:44:31',1,'2006-02-15 21:30:53'),(10388,'2005-08-01 06:42:44',3180,99,'2005-08-09 11:43:44',2,'2006-02-15 21:30:53'),(10389,'2005-08-01 06:46:43',3534,346,'2005-08-08 07:07:43',2,'2006-02-15 21:30:53'),(10390,'2005-08-01 06:46:48',1489,502,'2005-08-09 02:55:48',2,'2006-02-15 21:30:53'),(10391,'2005-08-01 06:49:05',2203,357,'2005-08-04 01:51:05',2,'2006-02-15 21:30:53'),(10392,'2005-08-01 06:50:26',3017,12,'2005-08-10 10:52:26',1,'2006-02-15 21:30:53'),(10393,'2005-08-01 06:52:50',808,258,'2005-08-05 08:45:50',1,'2006-02-15 21:30:53'),(10394,'2005-08-01 06:58:17',1655,128,'2005-08-05 02:09:17',1,'2006-02-15 21:30:53'),(10395,'2005-08-01 07:08:22',279,129,'2005-08-05 08:00:22',2,'2006-02-15 21:30:53'),(10396,'2005-08-01 07:08:46',2982,284,'2005-08-08 03:47:46',1,'2006-02-15 21:30:53'),(10397,'2005-08-01 07:11:27',4168,504,'2005-08-03 07:51:27',1,'2006-02-15 21:30:53'),(10398,'2005-08-01 07:11:49',4306,174,'2005-08-04 05:54:49',1,'2006-02-15 21:30:53'),(10399,'2005-08-01 07:13:39',2515,204,'2005-08-10 06:56:39',1,'2006-02-15 21:30:53'),(10400,'2005-08-01 07:18:24',3897,132,'2005-08-10 08:38:24',1,'2006-02-15 21:30:53'),(10401,'2005-08-01 07:27:09',1560,564,'2005-08-02 01:38:09',1,'2006-02-15 21:30:53'),(10402,'2005-08-01 07:27:19',274,410,'2005-08-04 12:30:19',1,'2006-02-15 21:30:53'),(10403,'2005-08-01 07:30:45',1968,494,'2005-08-03 03:03:45',2,'2006-02-15 21:30:53'),(10404,'2005-08-01 07:31:25',2580,253,'2005-08-07 09:23:25',1,'2006-02-15 21:30:53'),(10405,'2005-08-01 07:35:25',3641,463,'2005-08-05 05:38:25',2,'2006-02-15 21:30:53'),(10406,'2005-08-01 07:37:05',2614,391,'2005-08-02 06:11:05',1,'2006-02-15 21:30:53'),(10407,'2005-08-01 07:38:07',543,101,'2005-08-02 05:38:07',2,'2006-02-15 21:30:53'),(10408,'2005-08-01 07:42:10',4144,334,'2005-08-09 02:29:10',2,'2006-02-15 21:30:53'),(10409,'2005-08-01 07:49:15',2804,449,'2005-08-02 13:42:15',2,'2006-02-15 21:30:53'),(10410,'2005-08-01 07:53:29',3901,247,'2005-08-10 08:56:29',1,'2006-02-15 21:30:53'),(10411,'2005-08-01 07:56:32',1946,522,'2005-08-10 04:58:32',2,'2006-02-15 21:30:53'),(10412,'2005-08-01 07:57:16',1555,325,'2005-08-04 11:44:16',2,'2006-02-15 21:30:53'),(10413,'2005-08-01 07:59:39',1018,376,'2005-08-08 03:55:39',1,'2006-02-15 21:30:53'),(10414,'2005-08-01 08:03:55',1271,361,'2005-08-04 08:44:55',2,'2006-02-15 21:30:53'),(10415,'2005-08-01 08:05:59',2597,591,'2005-08-04 13:46:59',1,'2006-02-15 21:30:53'),(10416,'2005-08-01 08:08:39',2629,449,'2005-08-10 09:26:39',2,'2006-02-15 21:30:53'),(10417,'2005-08-01 08:10:36',3675,427,'2005-08-02 03:42:36',2,'2006-02-15 21:30:53'),(10418,'2005-08-01 08:11:07',1692,248,'2005-08-04 11:12:07',2,'2006-02-15 21:30:53'),(10419,'2005-08-01 08:13:22',415,66,'2005-08-06 04:45:22',2,'2006-02-15 21:30:53'),(10420,'2005-08-01 08:13:53',3490,354,'2005-08-06 08:05:53',2,'2006-02-15 21:30:53'),(10421,'2005-08-01 08:14:10',925,262,'2005-08-03 05:56:10',2,'2006-02-15 21:30:53'),(10422,'2005-08-01 08:17:11',37,166,'2005-08-10 10:08:11',2,'2006-02-15 21:30:53'),(10423,'2005-08-01 08:19:53',739,7,'2005-08-08 10:25:53',1,'2006-02-15 21:30:53'),(10424,'2005-08-01 08:22:54',1921,88,'2005-08-06 13:44:54',1,'2006-02-15 21:30:53'),(10425,'2005-08-01 08:23:25',322,447,'2005-08-05 04:29:25',1,'2006-02-15 21:30:53'),(10426,'2005-08-01 08:26:08',1325,305,'2005-08-09 04:09:08',1,'2006-02-15 21:30:53'),(10427,'2005-08-01 08:30:11',2978,356,'2005-08-07 06:18:11',2,'2006-02-15 21:30:53'),(10428,'2005-08-01 08:30:11',4245,46,'2005-08-02 09:30:11',2,'2006-02-15 21:30:53'),(10429,'2005-08-01 08:34:18',3894,511,'2005-08-10 12:38:18',1,'2006-02-15 21:30:53'),(10430,'2005-08-01 08:37:06',1150,471,'2005-08-03 07:25:06',1,'2006-02-15 21:30:53'),(10431,'2005-08-01 08:41:54',1074,138,'2005-08-07 09:44:54',2,'2006-02-15 21:30:53'),(10432,'2005-08-01 08:43:21',4238,450,'2005-08-08 13:09:21',2,'2006-02-15 21:30:53'),(10433,'2005-08-01 08:45:56',1508,517,'2005-08-05 09:46:56',2,'2006-02-15 21:30:53'),(10434,'2005-08-01 08:47:00',4073,73,'2005-08-06 08:34:00',1,'2006-02-15 21:30:53'),(10435,'2005-08-01 08:50:51',1934,392,'2005-08-08 12:23:51',1,'2006-02-15 21:30:53'),(10436,'2005-08-01 08:50:59',4026,455,'2005-08-04 05:23:59',1,'2006-02-15 21:30:53'),(10437,'2005-08-01 08:51:04',14,1,'2005-08-10 12:12:04',1,'2006-02-15 21:30:53'),(10438,'2005-08-01 08:53:04',4217,316,'2005-08-09 06:39:04',2,'2006-02-15 21:30:53'),(10439,'2005-08-01 08:54:26',2711,332,'2005-08-08 14:04:26',1,'2006-02-15 21:30:53'),(10440,'2005-08-01 08:54:32',842,299,'2005-08-02 10:59:32',2,'2006-02-15 21:30:53'),(10441,'2005-08-01 08:55:56',4122,176,'2005-08-03 10:26:56',2,'2006-02-15 21:30:53'),(10442,'2005-08-01 08:58:08',4570,40,'2005-08-05 09:07:08',2,'2006-02-15 21:30:53'),(10443,'2005-08-01 09:01:04',1965,403,'2005-08-04 09:07:04',2,'2006-02-15 21:30:53'),(10444,'2005-08-01 09:01:40',3242,106,'2005-08-09 11:31:40',1,'2006-02-15 21:30:53'),(10445,'2005-08-01 09:02:15',3582,211,'2005-08-08 10:26:15',2,'2006-02-15 21:30:53'),(10446,'2005-08-01 09:02:17',2671,95,'2005-08-04 10:00:17',2,'2006-02-15 21:30:53'),(10447,'2005-08-01 09:04:58',1198,241,'2005-08-08 06:24:58',1,'2006-02-15 21:30:53'),(10448,'2005-08-01 09:09:31',2254,311,'2005-08-02 09:55:31',2,'2006-02-15 21:30:53'),(10449,'2005-08-01 09:09:59',1395,213,'2005-08-05 11:25:59',1,'2006-02-15 21:30:53'),(10450,'2005-08-01 09:10:03',234,380,'2005-08-08 12:34:03',1,'2006-02-15 21:30:53'),(10451,'2005-08-01 09:11:25',2435,9,'2005-08-03 12:37:25',2,'2006-02-15 21:30:53'),(10452,'2005-08-01 09:11:36',1973,442,'2005-08-04 13:28:36',2,'2006-02-15 21:30:53'),(10453,'2005-08-01 09:13:27',1531,188,'2005-08-08 11:34:27',2,'2006-02-15 21:30:53'),(10454,'2005-08-01 09:14:00',397,9,'2005-08-04 04:52:00',2,'2006-02-15 21:30:53'),(10455,'2005-08-01 09:15:00',4197,99,'2005-08-05 13:35:00',1,'2006-02-15 21:30:53'),(10456,'2005-08-01 09:17:21',4339,81,'2005-08-06 10:30:21',1,'2006-02-15 21:30:53'),(10457,'2005-08-01 09:17:34',3052,121,'2005-08-06 07:28:34',2,'2006-02-15 21:30:53'),(10458,'2005-08-01 09:19:48',1500,309,'2005-08-02 10:16:48',1,'2006-02-15 21:30:53'),(10459,'2005-08-01 09:20:09',201,131,'2005-08-03 11:36:09',1,'2006-02-15 21:30:53'),(10460,'2005-08-01 09:31:00',4504,197,'2005-08-09 09:28:00',1,'2006-02-15 21:30:53'),(10461,'2005-08-01 09:32:53',3212,270,'2005-08-09 10:19:53',1,'2006-02-15 21:30:53'),(10462,'2005-08-01 09:38:28',4526,193,'2005-08-02 09:52:28',2,'2006-02-15 21:30:53'),(10463,'2005-08-01 09:39:43',1301,291,'2005-08-10 03:42:43',1,'2006-02-15 21:30:53'),(10464,'2005-08-01 09:43:14',464,427,'2005-08-06 09:01:14',1,'2006-02-15 21:30:53'),(10465,'2005-08-01 09:45:25',4384,534,'2005-08-10 09:08:25',2,'2006-02-15 21:30:53'),(10466,'2005-08-01 09:45:26',138,2,'2005-08-06 06:28:26',1,'2006-02-15 21:30:53'),(10467,'2005-08-01 09:45:58',3773,412,'2005-08-09 10:17:58',2,'2006-02-15 21:30:53'),(10468,'2005-08-01 09:48:29',2115,129,'2005-08-05 09:58:29',2,'2006-02-15 21:30:53'),(10469,'2005-08-01 09:51:11',3054,466,'2005-08-05 06:53:11',2,'2006-02-15 21:30:53'),(10470,'2005-08-01 09:52:26',82,523,'2005-08-05 06:52:26',1,'2006-02-15 21:30:53'),(10471,'2005-08-01 09:52:37',1684,135,'2005-08-07 09:40:37',2,'2006-02-15 21:30:53'),(10472,'2005-08-01 09:54:41',506,405,'2005-08-04 13:31:41',1,'2006-02-15 21:30:53'),(10473,'2005-08-01 09:56:24',3034,329,'2005-08-10 12:36:24',2,'2006-02-15 21:30:53'),(10474,'2005-08-01 10:01:42',4482,488,'2005-08-08 12:32:42',1,'2006-02-15 21:30:53'),(10475,'2005-08-01 10:03:17',2931,115,'2005-08-10 15:50:17',2,'2006-02-15 21:30:53'),(10476,'2005-08-01 10:03:20',1993,263,'2005-08-10 06:52:20',1,'2006-02-15 21:30:53'),(10477,'2005-08-01 10:04:17',235,506,'2005-08-06 11:32:17',2,'2006-02-15 21:30:53'),(10478,'2005-08-01 10:09:06',3885,417,'2005-08-06 05:05:06',1,'2006-02-15 21:30:53'),(10479,'2005-08-01 10:11:25',4580,275,'2005-08-06 04:52:25',1,'2006-02-15 21:30:53'),(10480,'2005-08-01 10:13:41',553,560,'2005-08-03 10:27:41',1,'2006-02-15 21:30:53'),(10481,'2005-08-01 10:17:26',229,170,'2005-08-09 08:50:26',1,'2006-02-15 21:30:53'),(10482,'2005-08-01 10:17:47',48,358,'2005-08-02 15:04:47',2,'2006-02-15 21:30:53'),(10483,'2005-08-01 10:19:45',1521,129,'2005-08-04 09:29:45',1,'2006-02-15 21:30:53'),(10484,'2005-08-01 10:19:53',1908,400,'2005-08-03 05:36:53',1,'2006-02-15 21:30:53'),(10485,'2005-08-01 10:20:34',29,50,'2005-08-09 09:20:34',1,'2006-02-15 21:30:53'),(10486,'2005-08-01 10:23:43',2454,527,'2005-08-05 07:11:43',2,'2006-02-15 21:30:53'),(10487,'2005-08-01 10:26:34',1121,577,'2005-08-07 16:11:34',1,'2006-02-15 21:30:53'),(10488,'2005-08-01 10:27:27',297,423,'2005-08-02 11:05:27',2,'2006-02-15 21:30:53'),(10489,'2005-08-01 10:27:42',4067,54,'2005-08-07 12:56:42',1,'2006-02-15 21:30:53'),(10490,'2005-08-01 10:37:11',4365,329,'2005-08-03 10:01:11',2,'2006-02-15 21:30:53'),(10491,'2005-08-01 10:38:27',3091,24,'2005-08-04 04:55:27',2,'2006-02-15 21:30:53'),(10492,'2005-08-01 10:42:28',1669,334,'2005-08-02 07:05:28',1,'2006-02-15 21:30:53'),(10493,'2005-08-01 10:43:12',2375,285,'2005-08-07 08:13:12',2,'2006-02-15 21:30:53'),(10494,'2005-08-01 10:45:21',847,188,'2005-08-02 12:34:21',1,'2006-02-15 21:30:53'),(10495,'2005-08-01 10:45:51',2232,41,'2005-08-06 08:11:51',1,'2006-02-15 21:30:53'),(10496,'2005-08-01 10:53:16',411,525,'2005-08-08 10:34:16',2,'2006-02-15 21:30:53'),(10497,'2005-08-01 10:55:59',1060,499,'2005-08-07 11:15:59',1,'2006-02-15 21:30:53'),(10498,'2005-08-01 10:56:48',2672,355,'2005-08-03 15:46:48',2,'2006-02-15 21:30:53'),(10499,'2005-08-01 11:00:20',3293,459,'2005-08-10 11:52:20',2,'2006-02-15 21:30:53'),(10500,'2005-08-01 11:01:01',469,477,'2005-08-06 08:59:01',2,'2006-02-15 21:30:53'),(10501,'2005-08-01 11:04:46',1792,351,'2005-08-02 12:10:46',2,'2006-02-15 21:30:53'),(10502,'2005-08-01 11:06:39',3193,357,'2005-08-05 07:11:39',1,'2006-02-15 21:30:53'),(10503,'2005-08-01 11:07:44',1823,357,'2005-08-08 08:22:44',1,'2006-02-15 21:30:53'),(10504,'2005-08-01 11:10:55',3345,530,'2005-08-10 10:16:55',1,'2006-02-15 21:30:53'),(10505,'2005-08-01 11:13:59',2977,426,'2005-08-05 07:20:59',2,'2006-02-15 21:30:53'),(10506,'2005-08-01 11:16:05',1171,216,'2005-08-03 05:37:05',2,'2006-02-15 21:30:53'),(10507,'2005-08-01 11:22:20',367,45,'2005-08-04 13:18:20',2,'2006-02-15 21:30:53'),(10508,'2005-08-01 11:23:27',3890,431,'2005-08-02 10:17:27',1,'2006-02-15 21:30:53'),(10509,'2005-08-01 11:25:28',96,504,'2005-08-10 09:19:28',2,'2006-02-15 21:30:53'),(10510,'2005-08-01 11:28:30',410,259,'2005-08-07 11:37:30',1,'2006-02-15 21:30:53'),(10511,'2005-08-01 11:32:16',3874,487,'2005-08-04 09:38:16',1,'2006-02-15 21:30:53'),(10512,'2005-08-01 11:36:19',3294,438,'2005-08-09 06:52:19',2,'2006-02-15 21:30:53'),(10513,'2005-08-01 11:37:34',4057,105,'2005-08-02 17:15:34',2,'2006-02-15 21:30:53'),(10514,'2005-08-01 11:39:26',1512,7,'2005-08-03 07:53:26',2,'2006-02-15 21:30:53'),(10515,'2005-08-01 11:41:33',874,383,'2005-08-08 06:23:33',2,'2006-02-15 21:30:53'),(10516,'2005-08-01 11:41:55',3924,449,'2005-08-08 17:16:55',1,'2006-02-15 21:30:53'),(10517,'2005-08-01 11:41:57',2299,199,'2005-08-05 06:14:57',1,'2006-02-15 21:30:53'),(10518,'2005-08-01 11:44:08',4444,556,'2005-08-07 07:58:08',2,'2006-02-15 21:30:53'),(10519,'2005-08-01 11:44:13',1967,456,'2005-08-09 16:57:13',1,'2006-02-15 21:30:53'),(10520,'2005-08-01 11:45:58',4396,543,'2005-08-06 17:28:58',2,'2006-02-15 21:30:53'),(10521,'2005-08-01 11:46:17',662,346,'2005-08-05 11:06:17',2,'2006-02-15 21:30:53'),(10522,'2005-08-01 11:48:51',4159,254,'2005-08-05 12:40:51',1,'2006-02-15 21:30:53'),(10523,'2005-08-01 11:52:32',2408,34,'2005-08-02 10:47:32',1,'2006-02-15 21:30:53'),(10524,'2005-08-01 11:53:12',4116,38,'2005-08-08 10:40:12',2,'2006-02-15 21:30:53'),(10525,'2005-08-01 11:53:17',3811,36,'2005-08-07 07:24:17',1,'2006-02-15 21:30:53'),(10526,'2005-08-01 11:55:33',27,14,'2005-08-08 16:42:33',1,'2006-02-15 21:30:53'),(10527,'2005-08-01 11:55:54',4530,431,'2005-08-05 15:56:54',2,'2006-02-15 21:30:53'),(10528,'2005-08-01 11:56:22',4401,564,'2005-08-07 07:13:22',1,'2006-02-15 21:30:53'),(10529,'2005-08-01 12:00:02',851,444,'2005-08-08 16:18:02',1,'2006-02-15 21:30:53'),(10530,'2005-08-01 12:01:17',3216,520,'2005-08-06 09:55:17',2,'2006-02-15 21:30:53'),(10531,'2005-08-01 12:06:30',3846,459,'2005-08-04 10:23:30',2,'2006-02-15 21:30:53'),(10532,'2005-08-01 12:06:35',746,191,'2005-08-07 16:04:35',2,'2006-02-15 21:30:53'),(10533,'2005-08-01 12:14:16',1924,593,'2005-08-09 17:13:16',2,'2006-02-15 21:30:53'),(10534,'2005-08-01 12:15:11',4354,397,'2005-08-04 17:06:11',1,'2006-02-15 21:30:53'),(10535,'2005-08-01 12:21:13',1838,284,'2005-08-09 08:58:13',1,'2006-02-15 21:30:53'),(10536,'2005-08-01 12:21:53',1251,86,'2005-08-04 13:08:53',2,'2006-02-15 21:30:53'),(10537,'2005-08-01 12:22:28',2140,418,'2005-08-08 07:27:28',1,'2006-02-15 21:30:53'),(10538,'2005-08-01 12:22:41',686,37,'2005-08-02 10:31:41',2,'2006-02-15 21:30:53'),(10539,'2005-08-01 12:23:00',3341,232,'2005-08-07 10:25:00',2,'2006-02-15 21:30:53'),(10540,'2005-08-01 12:24:42',4121,84,'2005-08-03 08:39:42',2,'2006-02-15 21:30:53'),(10541,'2005-08-01 12:24:54',1413,234,'2005-08-03 16:18:54',1,'2006-02-15 21:30:53'),(10542,'2005-08-01 12:32:23',1102,465,'2005-08-08 16:26:23',1,'2006-02-15 21:30:53'),(10543,'2005-08-01 12:36:09',624,29,'2005-08-07 07:42:09',1,'2006-02-15 21:30:53'),(10544,'2005-08-01 12:36:21',3195,589,'2005-08-07 12:25:21',2,'2006-02-15 21:30:53'),(10545,'2005-08-01 12:37:46',4230,425,'2005-08-04 16:02:46',2,'2006-02-15 21:30:53'),(10546,'2005-08-01 12:44:17',1589,362,'2005-08-06 16:26:17',2,'2006-02-15 21:30:53'),(10547,'2005-08-01 12:44:17',1707,403,'2005-08-08 06:53:17',1,'2006-02-15 21:30:53'),(10548,'2005-08-01 12:44:32',1914,85,'2005-08-07 09:17:32',1,'2006-02-15 21:30:53'),(10549,'2005-08-01 12:46:39',3719,61,'2005-08-06 17:17:39',1,'2006-02-15 21:30:53'),(10550,'2005-08-01 12:46:52',1980,129,'2005-08-05 16:48:52',2,'2006-02-15 21:30:53'),(10551,'2005-08-01 12:48:55',2974,294,'2005-08-10 16:11:55',1,'2006-02-15 21:30:53'),(10552,'2005-08-01 12:49:44',4263,119,'2005-08-04 16:20:44',2,'2006-02-15 21:30:53'),(10553,'2005-08-01 12:54:06',2768,415,'2005-08-06 15:27:06',1,'2006-02-15 21:30:53'),(10554,'2005-08-01 12:56:19',3220,209,'2005-08-03 09:44:19',2,'2006-02-15 21:30:53'),(10555,'2005-08-01 12:56:38',377,487,'2005-08-10 18:19:38',1,'2006-02-15 21:30:53'),(10556,'2005-08-01 12:58:42',144,117,'2005-08-03 07:18:42',2,'2006-02-15 21:30:53'),(10557,'2005-08-01 12:59:24',240,385,'2005-08-04 17:08:24',2,'2006-02-15 21:30:53'),(10558,'2005-08-01 13:00:20',4399,117,'2005-08-05 16:31:20',1,'2006-02-15 21:30:53'),(10559,'2005-08-01 13:02:58',2861,174,'2005-08-09 10:03:58',2,'2006-02-15 21:30:53'),(10560,'2005-08-01 13:04:57',1534,427,'2005-08-05 18:25:57',2,'2006-02-15 21:30:53'),(10561,'2005-08-01 13:05:35',2195,8,'2005-08-04 08:34:35',2,'2006-02-15 21:30:53'),(10562,'2005-08-01 13:05:52',1947,178,'2005-08-02 17:05:52',1,'2006-02-15 21:30:53'),(10563,'2005-08-01 13:06:03',1885,214,'2005-08-09 08:39:03',2,'2006-02-15 21:30:53'),(10564,'2005-08-01 13:07:34',4469,387,'2005-08-06 15:14:34',2,'2006-02-15 21:30:53'),(10565,'2005-08-01 13:08:27',347,165,'2005-08-02 10:30:27',1,'2006-02-15 21:30:53'),(10566,'2005-08-01 13:12:11',3988,269,'2005-08-05 11:16:11',2,'2006-02-15 21:30:53'),(10567,'2005-08-01 13:16:01',2744,212,'2005-08-05 14:59:01',1,'2006-02-15 21:30:53'),(10568,'2005-08-01 13:17:28',3009,130,'2005-08-08 17:04:28',1,'2006-02-15 21:30:53'),(10569,'2005-08-01 13:18:23',611,179,'2005-08-10 13:33:23',1,'2006-02-15 21:30:53'),(10570,'2005-08-01 13:23:06',369,21,'2005-08-05 15:30:06',2,'2006-02-15 21:30:53'),(10571,'2005-08-01 13:25:30',3660,308,'2005-08-02 16:43:30',2,'2006-02-15 21:30:53'),(10572,'2005-08-01 13:26:53',1239,386,'2005-08-07 18:47:53',2,'2006-02-15 21:30:53'),(10573,'2005-08-01 13:27:24',4252,585,'2005-08-04 15:09:24',2,'2006-02-15 21:30:53'),(10574,'2005-08-01 13:36:51',679,287,'2005-08-10 13:25:51',2,'2006-02-15 21:30:53'),(10575,'2005-08-01 13:41:41',4447,251,'2005-08-08 11:30:41',1,'2006-02-15 21:30:53'),(10576,'2005-08-01 13:46:02',1876,180,'2005-08-05 10:19:02',1,'2006-02-15 21:30:53'),(10577,'2005-08-01 13:46:38',2240,428,'2005-08-06 11:35:38',2,'2006-02-15 21:30:53'),(10578,'2005-08-01 13:48:02',3704,113,'2005-08-07 13:40:02',1,'2006-02-15 21:30:53'),(10579,'2005-08-01 13:48:22',4068,270,'2005-08-07 11:51:22',1,'2006-02-15 21:30:53'),(10580,'2005-08-01 13:51:14',590,234,'2005-08-08 11:49:14',2,'2006-02-15 21:30:53'),(10581,'2005-08-01 13:52:30',2801,217,'2005-08-10 19:11:30',1,'2006-02-15 21:30:53'),(10582,'2005-08-01 13:54:22',2536,233,'2005-08-05 16:46:22',2,'2006-02-15 21:30:53'),(10583,'2005-08-01 13:54:35',704,125,'2005-08-03 18:21:35',1,'2006-02-15 21:30:53'),(10584,'2005-08-01 13:58:47',715,86,'2005-08-06 13:38:47',2,'2006-02-15 21:30:53'),(10585,'2005-08-01 14:00:42',2670,228,'2005-08-09 11:42:42',2,'2006-02-15 21:30:53'),(10586,'2005-08-01 14:00:59',3306,583,'2005-08-06 10:00:59',2,'2006-02-15 21:30:53'),(10587,'2005-08-01 14:03:38',3000,521,'2005-08-08 19:59:38',2,'2006-02-15 21:30:53'),(10588,'2005-08-01 14:10:21',2384,49,'2005-08-03 13:47:21',2,'2006-02-15 21:30:53'),(10589,'2005-08-01 14:11:09',4280,375,'2005-08-09 09:28:09',2,'2006-02-15 21:30:53'),(10590,'2005-08-01 14:11:53',740,78,'2005-08-04 20:04:53',1,'2006-02-15 21:30:53'),(10591,'2005-08-01 14:12:29',3360,52,'2005-08-04 08:46:29',2,'2006-02-15 21:30:53'),(10592,'2005-08-01 14:13:00',829,265,'2005-08-09 13:03:00',2,'2006-02-15 21:30:53'),(10593,'2005-08-01 14:13:19',1886,144,'2005-08-06 08:48:19',2,'2006-02-15 21:30:53'),(10594,'2005-08-01 14:14:59',1826,53,'2005-08-07 10:48:59',2,'2006-02-15 21:30:53'),(10595,'2005-08-01 14:16:28',966,137,'2005-08-03 10:37:28',1,'2006-02-15 21:30:53'),(10596,'2005-08-01 14:18:57',803,112,'2005-08-07 14:59:57',2,'2006-02-15 21:30:53'),(10597,'2005-08-01 14:19:48',3292,3,'2005-08-08 20:01:48',1,'2006-02-15 21:30:53'),(10598,'2005-08-01 14:23:36',2341,397,'2005-08-10 14:07:36',2,'2006-02-15 21:30:53'),(10599,'2005-08-01 14:23:58',2422,271,'2005-08-06 10:45:58',2,'2006-02-15 21:30:53'),(10600,'2005-08-01 14:25:21',3900,294,'2005-08-06 18:00:21',1,'2006-02-15 21:30:53'),(10601,'2005-08-01 14:25:40',2843,420,'2005-08-10 09:07:40',1,'2006-02-15 21:30:53'),(10602,'2005-08-01 14:30:23',1506,111,'2005-08-07 15:20:23',1,'2006-02-15 21:30:53'),(10603,'2005-08-01 14:30:35',4024,394,'2005-08-05 11:13:35',2,'2006-02-15 21:30:53'),(10604,'2005-08-01 14:35:08',2833,250,'2005-08-08 10:19:08',2,'2006-02-15 21:30:53'),(10605,'2005-08-01 14:36:26',680,341,'2005-08-06 12:04:26',2,'2006-02-15 21:30:53'),(10606,'2005-08-01 14:39:15',81,335,'2005-08-08 11:31:15',1,'2006-02-15 21:30:53'),(10607,'2005-08-01 14:44:43',3999,438,'2005-08-02 16:39:43',2,'2006-02-15 21:30:53'),(10608,'2005-08-01 14:48:41',3835,381,'2005-08-04 17:32:41',2,'2006-02-15 21:30:53'),(10609,'2005-08-01 14:48:45',2587,5,'2005-08-04 13:41:45',2,'2006-02-15 21:30:53'),(10610,'2005-08-01 14:49:41',1865,396,'2005-08-03 13:07:41',1,'2006-02-15 21:30:53'),(10611,'2005-08-01 14:53:52',957,135,'2005-08-07 09:15:52',2,'2006-02-15 21:30:53'),(10612,'2005-08-01 14:55:31',287,554,'2005-08-06 19:01:31',1,'2006-02-15 21:30:53'),(10613,'2005-08-01 14:56:14',4357,527,'2005-08-07 09:33:14',1,'2006-02-15 21:30:53'),(10614,'2005-08-01 14:57:00',232,533,'2005-08-10 09:31:00',2,'2006-02-15 21:30:53'),(10615,'2005-08-01 14:58:14',2639,34,'2005-08-02 13:38:14',1,'2006-02-15 21:30:53'),(10616,'2005-08-01 14:59:50',1094,20,'2005-08-07 11:38:50',2,'2006-02-15 21:30:53'),(10617,'2005-08-01 15:05:52',4344,476,'2005-08-09 18:54:52',1,'2006-02-15 21:30:53'),(10618,'2005-08-01 15:06:38',3729,386,'2005-08-06 15:52:38',2,'2006-02-15 21:30:53'),(10619,'2005-08-01 15:07:04',2189,132,'2005-08-07 11:42:04',2,'2006-02-15 21:30:53'),(10620,'2005-08-01 15:09:17',3064,183,'2005-08-09 13:58:17',1,'2006-02-15 21:30:53'),(10621,'2005-08-01 15:10:26',1650,172,'2005-08-04 10:58:26',1,'2006-02-15 21:30:53'),(10622,'2005-08-01 15:12:00',3044,171,'2005-08-08 14:09:00',1,'2006-02-15 21:30:53'),(10623,'2005-08-01 15:22:38',4426,494,'2005-08-03 11:03:38',2,'2006-02-15 21:30:53'),(10624,'2005-08-01 15:27:05',3801,74,'2005-08-05 19:50:05',1,'2006-02-15 21:30:53'),(10625,'2005-08-01 15:27:10',3022,5,'2005-08-02 13:16:10',1,'2006-02-15 21:30:53'),(10626,'2005-08-01 15:32:41',1042,122,'2005-08-05 18:08:41',1,'2006-02-15 21:30:53'),(10627,'2005-08-01 15:33:03',2026,472,'2005-08-02 21:26:03',1,'2006-02-15 21:30:53'),(10628,'2005-08-01 15:33:19',427,285,'2005-08-05 17:27:19',1,'2006-02-15 21:30:53'),(10629,'2005-08-01 15:33:32',997,575,'2005-08-08 12:40:32',2,'2006-02-15 21:30:53'),(10630,'2005-08-01 15:34:46',2335,39,'2005-08-03 10:50:46',1,'2006-02-15 21:30:53'),(10631,'2005-08-01 15:35:14',2712,304,'2005-08-03 10:48:14',1,'2006-02-15 21:30:53'),(10632,'2005-08-01 15:36:56',1290,406,'2005-08-05 17:32:56',1,'2006-02-15 21:30:53'),(10633,'2005-08-01 15:37:17',3125,475,'2005-08-10 14:30:17',2,'2006-02-15 21:30:53'),(10634,'2005-08-01 15:37:48',445,592,'2005-08-02 12:11:48',2,'2006-02-15 21:30:53'),(10635,'2005-08-01 15:37:58',547,52,'2005-08-07 11:15:58',2,'2006-02-15 21:30:53'),(10636,'2005-08-01 15:40:35',621,385,'2005-08-05 18:46:35',1,'2006-02-15 21:30:53'),(10637,'2005-08-01 15:44:09',1243,161,'2005-08-04 14:42:09',1,'2006-02-15 21:30:53'),(10638,'2005-08-01 15:44:20',2239,132,'2005-08-08 16:05:20',2,'2006-02-15 21:30:53'),(10639,'2005-08-01 15:44:43',1015,39,'2005-08-10 13:51:43',1,'2006-02-15 21:30:53'),(10640,'2005-08-01 15:44:51',3020,375,'2005-08-06 15:52:51',1,'2006-02-15 21:30:53'),(10641,'2005-08-01 15:44:57',972,285,'2005-08-04 18:15:57',2,'2006-02-15 21:30:53'),(10642,'2005-08-01 15:45:11',2573,294,'2005-08-02 20:13:11',1,'2006-02-15 21:30:53'),(10643,'2005-08-01 15:48:33',3853,495,'2005-08-06 20:24:33',2,'2006-02-15 21:30:53'),(10644,'2005-08-01 15:52:00',4374,7,'2005-08-08 16:08:00',1,'2006-02-15 21:30:53'),(10645,'2005-08-01 15:52:01',3864,130,'2005-08-09 18:58:01',1,'2006-02-15 21:30:53'),(10646,'2005-08-01 15:57:55',1752,209,'2005-08-02 19:08:55',1,'2006-02-15 21:30:53'),(10647,'2005-08-01 16:08:46',3137,115,'2005-08-06 20:37:46',2,'2006-02-15 21:30:53'),(10648,'2005-08-01 16:08:52',691,270,'2005-08-05 20:17:52',1,'2006-02-15 21:30:53'),(10649,'2005-08-01 16:11:40',1032,278,'2005-08-06 14:09:40',2,'2006-02-15 21:30:53'),(10650,'2005-08-01 16:18:45',2306,242,'2005-08-09 16:29:45',1,'2006-02-15 21:30:53'),(10651,'2005-08-01 16:20:22',1541,404,'2005-08-03 15:53:22',1,'2006-02-15 21:30:53'),(10652,'2005-08-01 16:24:08',1633,241,'2005-08-03 16:00:08',2,'2006-02-15 21:30:53'),(10653,'2005-08-01 16:28:07',1190,75,'2005-08-07 21:22:07',2,'2006-02-15 21:30:53'),(10654,'2005-08-01 16:31:35',2522,399,'2005-08-05 12:04:35',2,'2006-02-15 21:30:53'),(10655,'2005-08-01 16:33:27',1399,385,'2005-08-08 17:17:27',2,'2006-02-15 21:30:53'),(10656,'2005-08-01 16:38:04',2571,80,'2005-08-09 19:37:04',2,'2006-02-15 21:30:53'),(10657,'2005-08-01 16:38:44',3075,590,'2005-08-06 16:05:44',2,'2006-02-15 21:30:53'),(10658,'2005-08-01 16:39:18',2943,469,'2005-08-09 18:17:18',2,'2006-02-15 21:30:53'),(10659,'2005-08-01 16:40:34',786,238,'2005-08-09 21:00:34',2,'2006-02-15 21:30:53'),(10660,'2005-08-01 16:48:01',2518,253,'2005-08-07 14:42:01',2,'2006-02-15 21:30:53'),(10661,'2005-08-01 16:48:31',3311,177,'2005-08-02 21:02:31',1,'2006-02-15 21:30:53'),(10662,'2005-08-01 16:50:57',2857,151,'2005-08-03 17:19:57',1,'2006-02-15 21:30:53'),(10663,'2005-08-01 16:51:08',4258,433,'2005-08-08 21:17:08',2,'2006-02-15 21:30:53'),(10664,'2005-08-01 16:51:15',3167,337,'2005-08-04 19:14:15',2,'2006-02-15 21:30:53'),(10665,'2005-08-01 16:56:17',3594,133,'2005-08-03 18:58:17',1,'2006-02-15 21:30:53'),(10666,'2005-08-01 16:56:36',1945,197,'2005-08-07 22:23:36',2,'2006-02-15 21:30:53'),(10667,'2005-08-01 16:58:22',3937,340,'2005-08-10 15:41:22',1,'2006-02-15 21:30:53'),(10668,'2005-08-01 17:00:27',2085,58,'2005-08-02 14:49:27',2,'2006-02-15 21:30:53'),(10669,'2005-08-01 17:03:28',2121,559,'2005-08-08 21:34:28',2,'2006-02-15 21:30:53'),(10670,'2005-08-01 17:07:16',156,512,'2005-08-10 11:46:16',2,'2006-02-15 21:30:53'),(10671,'2005-08-01 17:09:59',4430,10,'2005-08-09 21:36:59',1,'2006-02-15 21:30:53'),(10672,'2005-08-01 17:10:54',3674,375,'2005-08-07 12:19:54',2,'2006-02-15 21:30:53'),(10673,'2005-08-01 17:11:51',2735,528,'2005-08-03 13:32:51',1,'2006-02-15 21:30:53'),(10674,'2005-08-01 17:11:52',1962,340,'2005-08-08 19:34:52',1,'2006-02-15 21:30:53'),(10675,'2005-08-01 17:11:57',649,522,'2005-08-10 17:18:57',1,'2006-02-15 21:30:53'),(10676,'2005-08-01 17:14:15',629,79,'2005-08-04 12:34:15',1,'2006-02-15 21:30:53'),(10677,'2005-08-01 17:24:35',4350,483,'2005-08-04 20:03:35',1,'2006-02-15 21:30:53'),(10678,'2005-08-01 17:26:24',4438,56,'2005-08-05 22:55:24',1,'2006-02-15 21:30:53'),(10679,'2005-08-01 17:27:58',4437,198,'2005-08-08 16:06:58',1,'2006-02-15 21:30:53'),(10680,'2005-08-01 17:28:05',2498,60,'2005-08-04 19:34:05',1,'2006-02-15 21:30:53'),(10681,'2005-08-01 17:30:35',1468,119,'2005-08-02 14:48:35',2,'2006-02-15 21:30:53'),(10682,'2005-08-01 17:32:53',4557,18,'2005-08-06 15:49:53',2,'2006-02-15 21:30:53'),(10683,'2005-08-01 17:33:03',244,246,'2005-08-04 23:12:03',1,'2006-02-15 21:30:53'),(10684,'2005-08-01 17:47:00',1985,244,'2005-08-09 15:00:00',2,'2006-02-15 21:30:53'),(10685,'2005-08-01 17:49:38',2029,200,'2005-08-07 21:04:38',2,'2006-02-15 21:30:53'),(10686,'2005-08-01 17:51:21',2542,150,'2005-08-03 19:01:21',1,'2006-02-15 21:30:53'),(10687,'2005-08-01 17:53:02',3191,16,'2005-08-05 19:16:02',2,'2006-02-15 21:30:53'),(10688,'2005-08-01 17:53:43',3161,449,'2005-08-09 21:50:43',1,'2006-02-15 21:30:53'),(10689,'2005-08-01 18:04:18',1442,568,'2005-08-05 21:17:18',2,'2006-02-15 21:30:53'),(10690,'2005-08-01 18:05:54',807,80,'2005-08-10 21:43:54',2,'2006-02-15 21:30:53'),(10691,'2005-08-01 18:09:53',4281,276,'2005-08-03 16:32:53',1,'2006-02-15 21:30:53'),(10692,'2005-08-01 18:12:35',371,596,'2005-08-07 13:06:35',1,'2006-02-15 21:30:53'),(10693,'2005-08-01 18:14:14',2387,444,'2005-08-03 22:00:14',2,'2006-02-15 21:30:53'),(10694,'2005-08-01 18:15:07',3429,98,'2005-08-10 15:38:07',1,'2006-02-15 21:30:53'),(10695,'2005-08-01 18:16:20',3612,374,'2005-08-03 12:21:20',2,'2006-02-15 21:30:53'),(10696,'2005-08-01 18:18:13',47,120,'2005-08-04 14:09:13',1,'2006-02-15 21:30:53'),(10697,'2005-08-01 18:20:23',3115,519,'2005-08-07 21:18:23',1,'2006-02-15 21:30:53'),(10698,'2005-08-01 18:24:41',2738,135,'2005-08-08 18:59:41',2,'2006-02-15 21:30:53'),(10699,'2005-08-01 18:24:51',1029,125,'2005-08-06 20:18:51',1,'2006-02-15 21:30:53'),(10700,'2005-08-01 18:26:31',4259,203,'2005-08-07 19:51:31',2,'2006-02-15 21:30:53'),(10701,'2005-08-01 18:28:17',3958,538,'2005-08-09 21:51:17',1,'2006-02-15 21:30:53'),(10702,'2005-08-01 18:34:59',2802,560,'2005-08-09 23:44:59',2,'2006-02-15 21:30:53'),(10703,'2005-08-01 18:37:39',1818,181,'2005-08-07 23:50:39',2,'2006-02-15 21:30:53'),(10704,'2005-08-01 18:38:02',960,594,'2005-08-08 20:19:02',1,'2006-02-15 21:30:53'),(10705,'2005-08-01 18:38:54',4338,381,'2005-08-04 18:00:54',1,'2006-02-15 21:30:53'),(10706,'2005-08-01 18:41:28',1183,147,'2005-08-10 14:30:28',1,'2006-02-15 21:30:53'),(10707,'2005-08-01 18:41:34',1165,558,'2005-08-06 12:41:34',1,'2006-02-15 21:30:53'),(10708,'2005-08-01 18:43:28',3978,567,'2005-08-09 15:24:28',1,'2006-02-15 21:30:53'),(10709,'2005-08-01 18:43:57',282,418,'2005-08-06 13:17:57',2,'2006-02-15 21:30:53'),(10710,'2005-08-01 18:44:36',3082,177,'2005-08-03 13:17:36',1,'2006-02-15 21:30:53'),(10711,'2005-08-01 18:45:09',4278,400,'2005-08-02 19:47:09',2,'2006-02-15 21:30:53'),(10712,'2005-08-01 18:47:56',1188,532,'2005-08-07 19:26:56',2,'2006-02-15 21:30:53'),(10713,'2005-08-01 18:50:05',2030,369,'2005-08-05 00:43:05',2,'2006-02-15 21:30:53'),(10714,'2005-08-01 18:51:29',1465,64,'2005-08-04 18:49:29',2,'2006-02-15 21:30:53'),(10715,'2005-08-01 18:51:48',1054,386,'2005-08-06 14:44:48',1,'2006-02-15 21:30:53'),(10716,'2005-08-01 18:53:48',3405,515,'2005-08-04 13:49:48',1,'2006-02-15 21:30:53'),(10717,'2005-08-01 18:53:53',2934,365,'2005-08-05 21:28:53',1,'2006-02-15 21:30:53'),(10718,'2005-08-01 18:55:38',2763,394,'2005-08-04 14:45:38',1,'2006-02-15 21:30:53'),(10719,'2005-08-01 19:00:28',3861,188,'2005-08-07 17:04:28',1,'2006-02-15 21:30:53'),(10720,'2005-08-01 19:04:33',3712,326,'2005-08-06 23:12:33',2,'2006-02-15 21:30:53'),(10721,'2005-08-01 19:05:18',904,18,'2005-08-09 20:45:18',2,'2006-02-15 21:30:53'),(10722,'2005-08-01 19:07:08',2849,90,'2005-08-04 14:09:08',2,'2006-02-15 21:30:53'),(10723,'2005-08-01 19:10:49',2526,580,'2005-08-08 19:21:49',2,'2006-02-15 21:30:53'),(10724,'2005-08-01 19:10:59',3425,576,'2005-08-07 18:44:59',1,'2006-02-15 21:30:53'),(10725,'2005-08-01 19:11:04',4486,534,'2005-08-07 18:16:04',2,'2006-02-15 21:30:53'),(10726,'2005-08-01 19:14:53',749,75,'2005-08-08 23:56:53',2,'2006-02-15 21:30:53'),(10727,'2005-08-01 19:15:08',2049,16,'2005-08-03 13:52:08',1,'2006-02-15 21:30:53'),(10728,'2005-08-01 19:15:09',3133,309,'2005-08-04 19:35:09',1,'2006-02-15 21:30:53'),(10729,'2005-08-01 19:21:11',2918,595,'2005-08-07 21:20:11',2,'2006-02-15 21:30:53'),(10730,'2005-08-01 19:21:42',1793,368,'2005-08-10 21:18:42',1,'2006-02-15 21:30:53'),(10731,'2005-08-01 19:21:48',4248,278,'2005-08-08 22:01:48',2,'2006-02-15 21:30:53'),(10732,'2005-08-01 19:25:18',2810,538,'2005-08-10 22:26:18',1,'2006-02-15 21:30:53'),(10733,'2005-08-01 19:28:01',3980,560,'2005-08-09 18:41:01',1,'2006-02-15 21:30:53'),(10734,'2005-08-01 19:28:47',1130,21,'2005-08-03 00:41:47',2,'2006-02-15 21:30:53'),(10735,'2005-08-01 19:29:45',4061,544,'2005-08-02 19:50:45',2,'2006-02-15 21:30:53'),(10736,'2005-08-01 19:30:21',2227,272,'2005-08-02 22:37:21',1,'2006-02-15 21:30:53'),(10737,'2005-08-01 19:31:24',1773,149,'2005-08-10 19:17:24',1,'2006-02-15 21:30:53'),(10738,'2005-08-01 19:39:08',544,377,'2005-08-10 20:37:08',1,'2006-02-15 21:30:53'),(10739,'2005-08-01 19:46:11',3160,197,'2005-08-06 21:08:11',2,'2006-02-15 21:30:53'),(10740,'2005-08-01 19:50:32',3215,144,'2005-08-07 23:25:32',1,'2006-02-15 21:30:53'),(10741,'2005-08-01 19:52:52',3300,469,'2005-08-04 19:58:52',1,'2006-02-15 21:30:53'),(10742,'2005-08-01 19:53:13',3658,416,'2005-08-10 15:05:13',1,'2006-02-15 21:30:53'),(10743,'2005-08-01 19:55:09',4206,197,'2005-08-03 19:29:09',1,'2006-02-15 21:30:53'),(10744,'2005-08-01 19:56:49',565,439,'2005-08-09 16:33:49',2,'2006-02-15 21:30:53'),(10745,'2005-08-01 19:57:06',446,307,'2005-08-07 18:04:06',1,'2006-02-15 21:30:53'),(10746,'2005-08-01 19:58:49',305,508,'2005-08-10 19:00:49',2,'2006-02-15 21:30:53'),(10747,'2005-08-01 19:59:41',4527,266,'2005-08-10 00:00:41',2,'2006-02-15 21:30:53'),(10748,'2005-08-01 20:01:24',3769,181,'2005-08-05 19:55:24',1,'2006-02-15 21:30:53'),(10749,'2005-08-01 20:02:01',2953,214,'2005-08-03 14:20:01',1,'2006-02-15 21:30:53'),(10750,'2005-08-01 20:06:00',3206,201,'2005-08-07 15:48:00',1,'2006-02-15 21:30:53'),(10751,'2005-08-01 20:06:10',3257,518,'2005-08-10 22:36:10',2,'2006-02-15 21:30:53'),(10752,'2005-08-01 20:08:49',3203,147,'2005-08-10 15:41:49',2,'2006-02-15 21:30:53'),(10753,'2005-08-01 20:09:24',1557,273,'2005-08-09 19:31:24',1,'2006-02-15 21:30:53'),(10754,'2005-08-01 20:12:33',2122,460,'2005-08-10 01:07:33',2,'2006-02-15 21:30:53'),(10755,'2005-08-01 20:14:14',1217,239,'2005-08-07 01:04:14',1,'2006-02-15 21:30:53'),(10756,'2005-08-01 20:17:03',4247,596,'2005-08-08 18:31:03',2,'2006-02-15 21:30:53'),(10757,'2005-08-01 20:22:44',102,188,'2005-08-04 19:48:44',2,'2006-02-15 21:30:53'),(10758,'2005-08-01 20:22:51',191,373,'2005-08-10 16:11:51',1,'2006-02-15 21:30:53'),(10759,'2005-08-01 20:22:51',3528,256,'2005-08-07 22:07:51',1,'2006-02-15 21:30:53'),(10760,'2005-08-01 20:25:20',1311,497,'2005-08-09 16:57:20',1,'2006-02-15 21:30:53'),(10761,'2005-08-01 20:25:35',3967,36,'2005-08-08 15:20:35',2,'2006-02-15 21:30:53'),(10762,'2005-08-01 20:28:39',1363,208,'2005-08-05 17:36:39',1,'2006-02-15 21:30:53'),(10763,'2005-08-01 20:32:27',987,276,'2005-08-05 01:24:27',2,'2006-02-15 21:30:53'),(10764,'2005-08-01 20:32:42',3808,357,'2005-08-03 22:14:42',2,'2006-02-15 21:30:53'),(10765,'2005-08-01 20:34:51',566,337,'2005-08-04 00:02:51',1,'2006-02-15 21:30:53'),(10766,'2005-08-01 20:36:29',947,420,'2005-08-04 00:30:29',1,'2006-02-15 21:30:53'),(10767,'2005-08-01 20:37:23',2875,488,'2005-08-04 23:15:23',2,'2006-02-15 21:30:53'),(10768,'2005-08-01 20:39:32',454,273,'2005-08-10 19:41:32',1,'2006-02-15 21:30:53'),(10769,'2005-08-01 20:43:02',3222,348,'2005-08-05 02:32:02',1,'2006-02-15 21:30:53'),(10770,'2005-08-01 20:45:39',2567,262,'2005-08-04 19:21:39',1,'2006-02-15 21:30:53'),(10771,'2005-08-01 20:49:35',1274,485,'2005-08-10 16:58:35',1,'2006-02-15 21:30:53'),(10772,'2005-08-01 20:51:10',132,485,'2005-08-10 15:50:10',1,'2006-02-15 21:30:53'),(10773,'2005-08-01 20:53:45',3854,181,'2005-08-07 00:16:45',1,'2006-02-15 21:30:53'),(10774,'2005-08-01 20:54:33',4231,407,'2005-08-08 20:59:33',2,'2006-02-15 21:30:53'),(10775,'2005-08-01 20:59:52',4190,263,'2005-08-04 19:31:52',2,'2006-02-15 21:30:53'),(10776,'2005-08-01 20:59:58',1598,565,'2005-08-10 20:33:58',2,'2006-02-15 21:30:53'),(10777,'2005-08-01 21:03:50',3487,493,'2005-08-06 19:29:50',1,'2006-02-15 21:30:53'),(10778,'2005-08-01 21:11:39',1939,220,'2005-08-02 22:59:39',2,'2006-02-15 21:30:53'),(10779,'2005-08-01 21:11:54',2092,578,'2005-08-09 21:00:54',2,'2006-02-15 21:30:53'),(10780,'2005-08-01 21:14:24',1450,51,'2005-08-07 16:32:24',2,'2006-02-15 21:30:53'),(10781,'2005-08-01 21:22:41',1321,259,'2005-08-06 01:02:41',1,'2006-02-15 21:30:53'),(10782,'2005-08-01 21:23:25',1507,577,'2005-08-03 20:15:25',2,'2006-02-15 21:30:53'),(10783,'2005-08-01 21:23:37',1192,495,'2005-08-09 20:18:37',1,'2006-02-15 21:30:53'),(10784,'2005-08-01 21:24:28',3494,208,'2005-08-09 19:23:28',1,'2006-02-15 21:30:53'),(10785,'2005-08-01 21:24:55',2282,397,'2005-08-06 17:47:55',1,'2006-02-15 21:30:53'),(10786,'2005-08-01 21:29:34',50,490,'2005-08-10 17:27:34',1,'2006-02-15 21:30:53'),(10787,'2005-08-01 21:35:01',3246,127,'2005-08-10 23:30:01',1,'2006-02-15 21:30:53'),(10788,'2005-08-01 21:37:10',3350,160,'2005-08-03 01:33:10',1,'2006-02-15 21:30:53'),(10789,'2005-08-01 21:37:55',3298,403,'2005-08-07 17:01:55',2,'2006-02-15 21:30:53'),(10790,'2005-08-01 21:38:37',3080,274,'2005-08-08 17:20:37',2,'2006-02-15 21:30:53'),(10791,'2005-08-01 21:41:52',2061,338,'2005-08-04 03:28:52',2,'2006-02-15 21:30:53'),(10792,'2005-08-01 21:44:24',1037,264,'2005-08-02 19:48:24',2,'2006-02-15 21:30:53'),(10793,'2005-08-01 21:48:03',3018,225,'2005-08-10 19:16:03',1,'2006-02-15 21:30:53'),(10794,'2005-08-01 21:51:15',889,27,'2005-08-10 18:51:15',2,'2006-02-15 21:30:53'),(10795,'2005-08-01 21:56:37',2748,76,'2005-08-03 01:36:37',1,'2006-02-15 21:30:53'),(10796,'2005-08-01 21:56:41',2113,534,'2005-08-05 01:09:41',1,'2006-02-15 21:30:53'),(10797,'2005-08-01 22:02:51',1731,308,'2005-08-03 23:07:51',1,'2006-02-15 21:30:53'),(10798,'2005-08-01 22:03:10',382,141,'2005-08-08 01:34:10',1,'2006-02-15 21:30:53'),(10799,'2005-08-01 22:03:31',3282,145,'2005-08-06 20:19:31',2,'2006-02-15 21:30:53'),(10800,'2005-08-01 22:07:44',507,583,'2005-08-05 22:45:44',1,'2006-02-15 21:30:53'),(10801,'2005-08-01 22:09:35',3757,116,'2005-08-08 22:23:35',1,'2006-02-15 21:30:53'),(10802,'2005-08-01 22:18:32',3998,178,'2005-08-10 18:41:32',2,'2006-02-15 21:30:53'),(10803,'2005-08-01 22:22:07',3318,46,'2005-08-08 02:37:07',2,'2006-02-15 21:30:53'),(10804,'2005-08-01 22:22:11',2915,596,'2005-08-03 03:42:11',2,'2006-02-15 21:30:53'),(10805,'2005-08-01 22:23:37',557,203,'2005-08-05 01:22:37',2,'2006-02-15 21:30:53'),(10806,'2005-08-01 22:25:29',3553,89,'2005-08-04 18:46:29',2,'2006-02-15 21:30:53'),(10807,'2005-08-01 22:26:10',1673,287,'2005-08-05 21:55:10',1,'2006-02-15 21:30:53'),(10808,'2005-08-01 22:37:11',596,480,'2005-08-09 02:37:11',1,'2006-02-15 21:30:53'),(10809,'2005-08-01 22:39:27',1167,340,'2005-08-03 03:44:27',2,'2006-02-15 21:30:53'),(10810,'2005-08-01 22:40:39',2314,376,'2005-08-06 19:47:39',1,'2006-02-15 21:30:53'),(10811,'2005-08-01 22:41:15',4012,209,'2005-08-10 00:10:15',1,'2006-02-15 21:30:53'),(10812,'2005-08-01 22:41:16',3762,11,'2005-08-07 00:50:16',1,'2006-02-15 21:30:53'),(10813,'2005-08-01 22:43:00',3580,456,'2005-08-03 21:43:00',1,'2006-02-15 21:30:53'),(10814,'2005-08-01 22:43:12',2758,49,'2005-08-05 02:35:12',2,'2006-02-15 21:30:53'),(10815,'2005-08-01 22:46:21',877,62,'2005-08-03 02:43:21',2,'2006-02-15 21:30:53'),(10816,'2005-08-01 22:48:57',905,129,'2005-08-10 04:39:57',2,'2006-02-15 21:30:53'),(10817,'2005-08-01 22:51:08',3056,501,'2005-08-10 16:55:08',2,'2006-02-15 21:30:53'),(10818,'2005-08-01 22:52:45',4549,309,'2005-08-06 04:07:45',1,'2006-02-15 21:30:53'),(10819,'2005-08-01 22:52:57',983,308,'2005-08-06 00:08:57',1,'2006-02-15 21:30:53'),(10820,'2005-08-01 22:53:40',1487,97,'2005-08-02 17:59:40',2,'2006-02-15 21:30:53'),(10821,'2005-08-01 22:54:27',2016,522,'2005-08-07 02:15:27',2,'2006-02-15 21:30:53'),(10822,'2005-08-01 22:54:28',3895,343,'2005-08-02 17:19:28',1,'2006-02-15 21:30:53'),(10823,'2005-08-01 22:59:10',3322,405,'2005-08-08 23:44:10',1,'2006-02-15 21:30:53'),(10824,'2005-08-01 23:00:22',3948,482,'2005-08-04 04:14:22',2,'2006-02-15 21:30:53'),(10825,'2005-08-01 23:05:33',4386,587,'2005-08-04 04:33:33',1,'2006-02-15 21:30:53'),(10826,'2005-08-01 23:07:56',1228,476,'2005-08-08 04:10:56',2,'2006-02-15 21:30:53'),(10827,'2005-08-01 23:13:00',1590,46,'2005-08-08 02:51:00',1,'2006-02-15 21:30:53'),(10828,'2005-08-01 23:16:10',2448,471,'2005-08-09 21:17:10',1,'2006-02-15 21:30:53'),(10829,'2005-08-01 23:17:06',168,554,'2005-08-09 17:22:06',2,'2006-02-15 21:30:53'),(10830,'2005-08-01 23:18:06',4176,148,'2005-08-06 23:15:06',2,'2006-02-15 21:30:53'),(10831,'2005-08-01 23:22:45',1496,78,'2005-08-07 01:05:45',2,'2006-02-15 21:30:53'),(10832,'2005-08-01 23:24:53',4096,487,'2005-08-06 23:18:53',1,'2006-02-15 21:30:53'),(10833,'2005-08-01 23:25:55',4380,422,'2005-08-10 18:01:55',1,'2006-02-15 21:30:53'),(10834,'2005-08-01 23:28:00',2270,252,'2005-08-07 01:21:00',1,'2006-02-15 21:30:53'),(10835,'2005-08-01 23:28:49',351,90,'2005-08-10 21:28:49',2,'2006-02-15 21:30:53'),(10836,'2005-08-01 23:29:58',4534,217,'2005-08-07 23:03:58',2,'2006-02-15 21:30:53'),(10837,'2005-08-01 23:30:22',1816,410,'2005-08-07 23:02:22',1,'2006-02-15 21:30:53'),(10838,'2005-08-01 23:36:10',69,387,'2005-08-05 04:55:10',2,'2006-02-15 21:30:53'),(10839,'2005-08-01 23:37:39',2867,482,'2005-08-02 20:18:39',1,'2006-02-15 21:30:53'),(10840,'2005-08-01 23:38:34',583,593,'2005-08-07 02:36:34',2,'2006-02-15 21:30:53'),(10841,'2005-08-01 23:39:21',4337,102,'2005-08-07 20:47:21',1,'2006-02-15 21:30:53'),(10842,'2005-08-01 23:41:24',1300,137,'2005-08-11 03:48:24',1,'2006-02-15 21:30:53'),(10843,'2005-08-01 23:43:03',1286,192,'2005-08-09 23:49:03',2,'2006-02-15 21:30:53'),(10844,'2005-08-01 23:46:58',1516,333,'2005-08-09 19:42:58',2,'2006-02-15 21:30:53'),(10845,'2005-08-01 23:47:03',2737,42,'2005-08-08 01:57:03',1,'2006-02-15 21:30:53'),(10846,'2005-08-01 23:47:54',2277,441,'2005-08-08 01:10:54',1,'2006-02-15 21:30:53'),(10847,'2005-08-01 23:49:33',1200,280,'2005-08-10 05:37:33',2,'2006-02-15 21:30:53'),(10848,'2005-08-01 23:50:22',2630,368,'2005-08-06 00:52:22',1,'2006-02-15 21:30:53'),(10849,'2005-08-01 23:51:00',1683,278,'2005-08-10 19:59:00',2,'2006-02-15 21:30:53'),(10850,'2005-08-01 23:53:45',1853,199,'2005-08-10 21:11:45',1,'2006-02-15 21:30:53'),(10851,'2005-08-01 23:58:45',1359,154,'2005-08-04 00:59:45',1,'2006-02-15 21:30:53'),(10852,'2005-08-02 00:00:33',3862,27,'2005-08-03 23:09:33',1,'2006-02-15 21:30:53'),(10853,'2005-08-02 00:00:54',2682,41,'2005-08-10 05:37:54',2,'2006-02-15 21:30:53'),(10854,'2005-08-02 00:02:06',3295,356,'2005-08-02 21:55:06',2,'2006-02-15 21:30:53'),(10855,'2005-08-02 00:06:37',1366,274,'2005-08-03 00:39:37',1,'2006-02-15 21:30:53'),(10856,'2005-08-02 00:07:14',2010,451,'2005-08-04 02:48:14',2,'2006-02-15 21:30:53'),(10857,'2005-08-02 00:07:20',2961,360,'2005-08-04 02:35:20',1,'2006-02-15 21:30:53'),(10858,'2005-08-02 00:08:39',852,312,'2005-08-05 00:58:39',2,'2006-02-15 21:30:53'),(10859,'2005-08-02 00:11:39',277,375,'2005-08-08 19:52:39',1,'2006-02-15 21:30:53'),(10860,'2005-08-02 00:12:32',2827,25,'2005-08-04 03:50:32',1,'2006-02-15 21:30:53'),(10861,'2005-08-02 00:12:46',2162,131,'2005-08-09 04:09:46',2,'2006-02-15 21:30:53'),(10862,'2005-08-02 00:17:34',1077,176,'2005-08-08 00:31:34',2,'2006-02-15 21:30:53'),(10863,'2005-08-02 00:18:07',1170,161,'2005-08-10 06:16:07',2,'2006-02-15 21:30:53'),(10864,'2005-08-02 00:18:59',1694,134,'2005-08-08 22:20:59',1,'2006-02-15 21:30:53'),(10865,'2005-08-02 00:22:46',1485,201,'2005-08-09 05:08:46',2,'2006-02-15 21:30:53'),(10866,'2005-08-02 00:22:49',117,424,'2005-08-07 04:38:49',1,'2006-02-15 21:30:53'),(10867,'2005-08-02 00:24:15',2577,473,'2005-08-05 21:09:15',1,'2006-02-15 21:30:53'),(10868,'2005-08-02 00:25:15',2443,562,'2005-08-10 02:31:15',2,'2006-02-15 21:30:53'),(10869,'2005-08-02 00:26:54',2967,568,'2005-08-04 03:40:54',2,'2006-02-15 21:30:53'),(10870,'2005-08-02 00:27:12',1509,33,'2005-08-02 20:00:12',2,'2006-02-15 21:30:53'),(10871,'2005-08-02 00:27:24',104,75,'2005-08-05 06:25:24',1,'2006-02-15 21:30:53'),(10872,'2005-08-02 00:27:50',2470,84,'2005-08-06 20:34:50',2,'2006-02-15 21:30:53'),(10873,'2005-08-02 00:30:34',169,506,'2005-08-07 00:16:34',2,'2006-02-15 21:30:53'),(10874,'2005-08-02 00:31:00',2552,230,'2005-08-07 05:04:00',1,'2006-02-15 21:30:53'),(10875,'2005-08-02 00:31:44',862,175,'2005-08-05 22:24:44',2,'2006-02-15 21:30:53'),(10876,'2005-08-02 00:31:58',2161,559,'2005-08-05 21:45:58',1,'2006-02-15 21:30:53'),(10877,'2005-08-02 00:32:04',3337,487,'2005-08-07 19:44:04',2,'2006-02-15 21:30:53'),(10878,'2005-08-02 00:33:12',3511,45,'2005-08-07 06:02:12',1,'2006-02-15 21:30:53'),(10879,'2005-08-02 00:33:20',4415,334,'2005-08-09 04:13:20',2,'2006-02-15 21:30:53'),(10880,'2005-08-02 00:34:12',450,528,'2005-08-06 21:15:12',2,'2006-02-15 21:30:53'),(10881,'2005-08-02 00:38:14',781,253,'2005-08-09 22:02:14',2,'2006-02-15 21:30:53'),(10882,'2005-08-02 00:47:16',1349,54,'2005-08-09 22:11:16',1,'2006-02-15 21:30:53'),(10883,'2005-08-02 00:47:19',4,301,'2005-08-03 00:02:19',1,'2006-02-15 21:30:53'),(10884,'2005-08-02 00:47:33',3702,569,'2005-08-03 04:38:33',1,'2006-02-15 21:30:53'),(10885,'2005-08-02 00:51:37',4223,493,'2005-08-09 20:49:37',2,'2006-02-15 21:30:53'),(10886,'2005-08-02 00:52:34',943,77,'2005-08-08 00:30:34',1,'2006-02-15 21:30:53'),(10887,'2005-08-02 00:52:35',3450,573,'2005-08-03 05:37:35',1,'2006-02-15 21:30:53'),(10888,'2005-08-02 00:52:45',2412,428,'2005-08-03 03:07:45',1,'2006-02-15 21:30:53'),(10889,'2005-08-02 00:54:33',2098,64,'2005-08-07 19:42:33',1,'2006-02-15 21:30:53'),(10890,'2005-08-02 00:58:46',78,210,'2005-08-10 02:13:46',1,'2006-02-15 21:30:53'),(10891,'2005-08-02 01:09:55',1269,201,'2005-08-05 05:03:55',2,'2006-02-15 21:30:53'),(10892,'2005-08-02 01:12:06',3243,109,'2005-08-09 23:53:06',1,'2006-02-15 21:30:53'),(10893,'2005-08-02 01:12:13',2529,306,'2005-08-11 05:53:13',2,'2006-02-15 21:30:53'),(10894,'2005-08-02 01:12:35',598,51,'2005-08-09 22:55:35',1,'2006-02-15 21:30:53'),(10895,'2005-08-02 01:16:59',93,77,'2005-08-03 02:41:59',2,'2006-02-15 21:30:53'),(10896,'2005-08-02 01:19:33',2283,505,'2005-08-08 06:54:33',1,'2006-02-15 21:30:53'),(10897,'2005-08-02 01:23:42',291,338,'2005-08-03 23:27:42',1,'2006-02-15 21:30:53'),(10898,'2005-08-02 01:29:57',3814,23,'2005-08-06 00:07:57',2,'2006-02-15 21:30:53'),(10899,'2005-08-02 01:30:21',859,29,'2005-08-06 05:01:21',2,'2006-02-15 21:30:53'),(10900,'2005-08-02 01:34:26',1749,139,'2005-08-07 00:52:26',2,'2006-02-15 21:30:53'),(10901,'2005-08-02 01:35:44',3813,290,'2005-08-04 21:20:44',2,'2006-02-15 21:30:53'),(10902,'2005-08-02 01:35:46',3863,486,'2005-08-09 01:59:46',1,'2006-02-15 21:30:53'),(10903,'2005-08-02 01:41:59',2696,547,'2005-08-06 23:03:59',1,'2006-02-15 21:30:53'),(10904,'2005-08-02 01:43:02',3681,593,'2005-08-04 04:34:02',1,'2006-02-15 21:30:53'),(10905,'2005-08-02 01:45:59',2835,439,'2005-08-04 22:28:59',1,'2006-02-15 21:30:53'),(10906,'2005-08-02 01:47:04',3139,463,'2005-08-07 20:41:04',2,'2006-02-15 21:30:53'),(10907,'2005-08-02 01:51:48',1430,561,'2005-08-02 19:53:48',1,'2006-02-15 21:30:53'),(10908,'2005-08-02 01:53:06',1284,269,'2005-08-04 02:46:06',2,'2006-02-15 21:30:53'),(10909,'2005-08-02 01:53:59',3516,413,'2005-08-03 04:36:59',2,'2006-02-15 21:30:53'),(10910,'2005-08-02 01:54:34',2428,266,'2005-08-10 04:04:34',2,'2006-02-15 21:30:53'),(10911,'2005-08-02 01:58:36',769,195,'2005-08-08 07:37:36',2,'2006-02-15 21:30:53'),(10912,'2005-08-02 02:00:03',732,477,'2005-08-06 05:55:03',1,'2006-02-15 21:30:53'),(10913,'2005-08-02 02:04:03',3388,565,'2005-08-09 03:21:03',1,'2006-02-15 21:30:53'),(10914,'2005-08-02 02:04:43',585,584,'2005-08-06 03:00:43',1,'2006-02-15 21:30:53'),(10915,'2005-08-02 02:05:04',4568,418,'2005-08-10 21:58:04',2,'2006-02-15 21:30:53'),(10916,'2005-08-02 02:05:59',3841,25,'2005-08-06 03:46:59',2,'2006-02-15 21:30:53'),(10917,'2005-08-02 02:06:18',3146,378,'2005-08-03 22:42:18',1,'2006-02-15 21:30:53'),(10918,'2005-08-02 02:10:56',3418,2,'2005-08-02 21:23:56',1,'2006-02-15 21:30:53'),(10919,'2005-08-02 02:11:03',868,115,'2005-08-04 01:49:03',1,'2006-02-15 21:30:53'),(10920,'2005-08-02 02:14:10',3106,531,'2005-08-06 23:36:10',1,'2006-02-15 21:30:53'),(10921,'2005-08-02 02:14:33',1820,555,'2005-08-09 20:58:33',2,'2006-02-15 21:30:53'),(10922,'2005-08-02 02:14:40',4522,539,'2005-08-06 06:04:40',1,'2006-02-15 21:30:53'),(10923,'2005-08-02 02:15:01',2602,239,'2005-08-03 04:18:01',1,'2006-02-15 21:30:53'),(10924,'2005-08-02 02:20:19',589,540,'2005-08-11 05:50:19',2,'2006-02-15 21:30:53'),(10925,'2005-08-02 02:24:38',1475,98,'2005-08-03 05:06:38',1,'2006-02-15 21:30:53'),(10926,'2005-08-02 02:26:37',4016,460,'2005-08-09 20:55:37',1,'2006-02-15 21:30:53'),(10927,'2005-08-02 02:31:15',4125,288,'2005-08-10 20:41:15',1,'2006-02-15 21:30:53'),(10928,'2005-08-02 02:34:12',2885,211,'2005-08-07 21:13:12',1,'2006-02-15 21:30:53'),(10929,'2005-08-02 02:35:44',913,305,'2005-08-05 03:52:44',1,'2006-02-15 21:30:53'),(10930,'2005-08-02 02:38:07',2027,206,'2005-08-08 05:15:07',2,'2006-02-15 21:30:53'),(10931,'2005-08-02 02:44:59',3268,545,'2005-08-04 02:02:59',1,'2006-02-15 21:30:53'),(10932,'2005-08-02 02:46:22',1688,595,'2005-08-06 01:49:22',2,'2006-02-15 21:30:53'),(10933,'2005-08-02 02:50:49',3970,313,'2005-08-08 04:39:49',1,'2006-02-15 21:30:53'),(10934,'2005-08-02 02:52:18',4458,142,'2005-08-06 01:23:18',2,'2006-02-15 21:30:53'),(10935,'2005-08-02 02:54:53',4373,42,'2005-08-10 00:07:53',2,'2006-02-15 21:30:53'),(10936,'2005-08-02 02:55:04',463,445,'2005-08-11 07:56:04',1,'2006-02-15 21:30:53'),(10937,'2005-08-02 03:00:18',1320,416,'2005-08-11 03:44:18',2,'2006-02-15 21:30:53'),(10938,'2005-08-02 03:05:22',3918,502,'2005-08-05 08:31:22',1,'2006-02-15 21:30:53'),(10939,'2005-08-02 03:06:20',2131,161,'2005-08-04 01:22:20',2,'2006-02-15 21:30:53'),(10940,'2005-08-02 03:08:29',3760,120,'2005-08-07 21:28:29',2,'2006-02-15 21:30:53'),(10941,'2005-08-02 03:11:33',2132,531,'2005-08-10 07:31:33',1,'2006-02-15 21:30:53'),(10942,'2005-08-02 03:16:31',2304,78,'2005-08-11 02:46:31',2,'2006-02-15 21:30:53'),(10943,'2005-08-02 03:17:29',1036,377,'2005-08-03 00:50:29',2,'2006-02-15 21:30:53'),(10944,'2005-08-02 03:20:03',2373,470,'2005-08-04 04:13:03',2,'2006-02-15 21:30:53'),(10945,'2005-08-02 03:20:23',3684,532,'2005-08-09 03:23:23',1,'2006-02-15 21:30:53'),(10946,'2005-08-02 03:20:39',4271,56,'2005-08-05 02:59:39',1,'2006-02-15 21:30:53'),(10947,'2005-08-02 03:23:17',2510,500,'2005-08-07 05:25:17',1,'2006-02-15 21:30:53'),(10948,'2005-08-02 03:23:23',4429,220,'2005-08-05 23:18:23',1,'2006-02-15 21:30:53'),(10949,'2005-08-02 03:24:04',2309,389,'2005-08-06 08:36:04',2,'2006-02-15 21:30:53'),(10950,'2005-08-02 03:25:08',707,451,'2005-08-07 23:11:08',2,'2006-02-15 21:30:53'),(10951,'2005-08-02 03:26:35',173,144,'2005-08-07 22:03:35',1,'2006-02-15 21:30:53'),(10952,'2005-08-02 03:28:21',3218,111,'2005-08-09 01:41:21',1,'2006-02-15 21:30:53'),(10953,'2005-08-02 03:28:38',1510,483,'2005-08-11 03:53:38',1,'2006-02-15 21:30:53'),(10954,'2005-08-02 03:30:24',3406,20,'2005-08-08 05:52:24',2,'2006-02-15 21:30:53'),(10955,'2005-08-02 03:32:34',618,490,'2005-08-09 21:53:34',2,'2006-02-15 21:30:53'),(10956,'2005-08-02 03:33:14',4372,54,'2005-08-09 09:20:14',2,'2006-02-15 21:30:53'),(10957,'2005-08-02 03:33:30',1652,447,'2005-08-10 06:19:30',2,'2006-02-15 21:30:53'),(10958,'2005-08-02 03:37:13',2174,160,'2005-08-04 23:28:13',2,'2006-02-15 21:30:53'),(10959,'2005-08-02 03:39:39',4233,431,'2005-08-11 07:20:39',1,'2006-02-15 21:30:53'),(10960,'2005-08-02 03:46:18',3536,399,'2005-08-11 01:29:18',1,'2006-02-15 21:30:53'),(10961,'2005-08-02 03:47:55',1416,375,'2005-08-09 02:03:55',1,'2006-02-15 21:30:53'),(10962,'2005-08-02 03:48:13',1953,538,'2005-08-07 00:04:13',1,'2006-02-15 21:30:53'),(10963,'2005-08-02 03:48:17',4501,36,'2005-08-02 22:15:17',1,'2006-02-15 21:30:53'),(10964,'2005-08-02 03:56:23',2356,36,'2005-08-09 23:11:23',2,'2006-02-15 21:30:53'),(10965,'2005-08-02 04:00:19',2192,580,'2005-08-09 03:27:19',1,'2006-02-15 21:30:53'),(10966,'2005-08-02 04:00:47',478,584,'2005-08-08 01:58:47',2,'2006-02-15 21:30:53'),(10967,'2005-08-02 04:02:16',683,149,'2005-08-09 07:57:16',1,'2006-02-15 21:30:53'),(10968,'2005-08-02 04:03:13',888,234,'2005-08-11 08:36:13',1,'2006-02-15 21:30:53'),(10969,'2005-08-02 04:04:32',1898,244,'2005-08-09 23:18:32',1,'2006-02-15 21:30:53'),(10970,'2005-08-02 04:06:46',1202,260,'2005-08-10 04:27:46',1,'2006-02-15 21:30:53'),(10971,'2005-08-02 04:08:17',2789,383,'2005-08-09 00:02:17',1,'2006-02-15 21:30:53'),(10972,'2005-08-02 04:08:25',1928,348,'2005-08-09 23:25:25',1,'2006-02-15 21:30:53'),(10973,'2005-08-02 04:09:42',3562,127,'2005-08-08 05:24:42',2,'2006-02-15 21:30:53'),(10974,'2005-08-02 04:10:52',690,491,'2005-08-09 08:26:52',1,'2006-02-15 21:30:53'),(10975,'2005-08-02 04:11:25',2616,361,'2005-08-04 04:39:25',2,'2006-02-15 21:30:53'),(10976,'2005-08-02 04:11:48',2418,326,'2005-08-06 06:30:48',2,'2006-02-15 21:30:53'),(10977,'2005-08-02 04:12:17',2302,300,'2005-08-06 06:52:17',2,'2006-02-15 21:30:53'),(10978,'2005-08-02 04:12:27',1597,487,'2005-08-10 08:19:27',2,'2006-02-15 21:30:53'),(10979,'2005-08-02 04:16:37',2625,160,'2005-08-06 00:01:37',2,'2006-02-15 21:30:53'),(10980,'2005-08-02 04:17:32',150,547,'2005-08-04 05:12:32',1,'2006-02-15 21:30:53'),(10981,'2005-08-02 04:17:53',3699,305,'2005-08-09 03:45:53',2,'2006-02-15 21:30:53'),(10982,'2005-08-02 04:19:11',2508,345,'2005-08-04 00:20:11',2,'2006-02-15 21:30:53'),(10983,'2005-08-02 04:24:23',4502,380,'2005-08-09 08:05:23',2,'2006-02-15 21:30:53'),(10984,'2005-08-02 04:30:02',1813,450,'2005-08-10 02:51:02',1,'2006-02-15 21:30:53'),(10985,'2005-08-02 04:30:19',2734,186,'2005-08-03 05:18:19',1,'2006-02-15 21:30:53'),(10986,'2005-08-02 04:35:24',555,597,'2005-08-09 07:34:24',2,'2006-02-15 21:30:53'),(10987,'2005-08-02 04:36:52',968,349,'2005-08-04 00:03:52',1,'2006-02-15 21:30:53'),(10988,'2005-08-02 04:38:17',1157,509,'2005-08-09 00:09:17',1,'2006-02-15 21:30:53'),(10989,'2005-08-02 04:40:54',2272,7,'2005-08-09 03:39:54',2,'2006-02-15 21:30:53'),(10990,'2005-08-02 04:41:06',262,111,'2005-08-10 05:02:06',2,'2006-02-15 21:30:53'),(10991,'2005-08-02 04:41:12',2854,77,'2005-08-05 05:36:12',2,'2006-02-15 21:30:53'),(10992,'2005-08-02 04:41:17',11,180,'2005-08-09 02:13:17',1,'2006-02-15 21:30:53'),(10993,'2005-08-02 04:45:01',292,383,'2005-08-04 03:32:01',1,'2006-02-15 21:30:53'),(10994,'2005-08-02 04:46:53',647,323,'2005-08-11 10:30:53',1,'2006-02-15 21:30:53'),(10995,'2005-08-02 04:48:00',2891,340,'2005-08-07 05:00:00',1,'2006-02-15 21:30:53'),(10996,'2005-08-02 04:48:11',2235,26,'2005-08-06 08:00:11',1,'2006-02-15 21:30:53'),(10997,'2005-08-02 04:49:02',300,334,'2005-08-10 08:13:02',2,'2006-02-15 21:30:53'),(10998,'2005-08-02 04:50:55',1479,435,'2005-08-11 03:43:55',1,'2006-02-15 21:30:53'),(10999,'2005-08-02 04:53:13',2013,227,'2005-08-06 04:36:13',2,'2006-02-15 21:30:53'),(11000,'2005-08-02 04:56:14',264,265,'2005-08-07 01:39:14',2,'2006-02-15 21:30:53'),(11001,'2005-08-02 04:56:45',3701,5,'2005-08-11 08:04:45',1,'2006-02-15 21:30:53'),(11002,'2005-08-02 05:02:56',3073,583,'2005-08-05 07:04:56',2,'2006-02-15 21:30:53'),(11003,'2005-08-02 05:03:05',4301,272,'2005-08-05 10:48:05',2,'2006-02-15 21:30:53'),(11004,'2005-08-02 05:04:18',200,45,'2005-08-11 00:03:18',2,'2006-02-15 21:30:53'),(11005,'2005-08-02 05:05:23',1547,216,'2005-08-07 23:28:23',2,'2006-02-15 21:30:53'),(11006,'2005-08-02 05:05:52',2776,473,'2005-08-05 03:33:52',1,'2006-02-15 21:30:53'),(11007,'2005-08-02 05:05:53',4172,98,'2005-08-05 01:56:53',2,'2006-02-15 21:30:53'),(11008,'2005-08-02 05:06:17',2831,375,'2005-08-10 01:22:17',2,'2006-02-15 21:30:53'),(11009,'2005-08-02 05:06:23',2574,596,'2005-08-08 03:02:23',1,'2006-02-15 21:30:53'),(11010,'2005-08-02 05:06:27',869,326,'2005-08-03 23:47:27',2,'2006-02-15 21:30:53'),(11011,'2005-08-02 05:07:07',3981,256,'2005-08-09 07:16:07',1,'2006-02-15 21:30:53'),(11012,'2005-08-02 05:09:42',542,162,'2005-08-05 07:22:42',2,'2006-02-15 21:30:53'),(11013,'2005-08-02 05:10:54',2993,527,'2005-08-10 08:59:54',1,'2006-02-15 21:30:53'),(11014,'2005-08-02 05:12:22',393,269,'2005-08-07 09:33:22',1,'2006-02-15 21:30:53'),(11015,'2005-08-02 05:13:00',4331,138,'2005-08-08 04:18:00',2,'2006-02-15 21:30:53'),(11016,'2005-08-02 05:19:13',4446,116,'2005-08-05 05:31:13',1,'2006-02-15 21:30:53'),(11017,'2005-08-02 05:19:51',4140,480,'2005-08-09 00:36:51',2,'2006-02-15 21:30:53'),(11018,'2005-08-02 05:27:53',2988,197,'2005-08-07 10:48:53',1,'2006-02-15 21:30:53'),(11019,'2005-08-02 05:29:31',3227,112,'2005-08-04 00:42:31',1,'2006-02-15 21:30:53'),(11020,'2005-08-02 05:29:48',1645,242,'2005-08-06 05:36:48',2,'2006-02-15 21:30:53'),(11021,'2005-08-02 05:30:11',2069,385,'2005-08-05 05:50:11',2,'2006-02-15 21:30:53'),(11022,'2005-08-02 05:35:03',827,206,'2005-08-09 10:20:03',2,'2006-02-15 21:30:53'),(11023,'2005-08-02 05:36:38',3617,6,'2005-08-10 05:39:38',1,'2006-02-15 21:30:53'),(11024,'2005-08-02 05:38:31',2284,427,'2005-08-11 04:47:31',1,'2006-02-15 21:30:53'),(11025,'2005-08-02 05:39:12',2253,419,'2005-08-08 00:09:12',2,'2006-02-15 21:30:53'),(11026,'2005-08-02 05:46:05',3554,531,'2005-08-07 06:27:05',2,'2006-02-15 21:30:53'),(11027,'2005-08-02 05:47:10',571,412,'2005-08-05 23:51:10',1,'2006-02-15 21:30:53'),(11028,'2005-08-02 05:48:20',2764,66,'2005-08-10 11:21:20',1,'2006-02-15 21:30:53'),(11029,'2005-08-02 05:51:10',1023,45,'2005-08-05 04:15:10',1,'2006-02-15 21:30:53'),(11030,'2005-08-02 05:51:20',1437,569,'2005-08-06 04:20:20',1,'2006-02-15 21:30:53'),(11031,'2005-08-02 05:52:58',1205,361,'2005-08-07 07:14:58',2,'2006-02-15 21:30:53'),(11032,'2005-08-02 05:53:35',1119,359,'2005-08-05 02:58:35',2,'2006-02-15 21:30:53'),(11033,'2005-08-02 05:54:17',3323,155,'2005-08-09 10:50:17',2,'2006-02-15 21:30:53'),(11034,'2005-08-02 05:54:53',2939,586,'2005-08-09 04:14:53',1,'2006-02-15 21:30:53'),(11035,'2005-08-02 05:55:39',3776,305,'2005-08-08 06:46:39',2,'2006-02-15 21:30:53'),(11036,'2005-08-02 05:56:29',2054,502,'2005-08-05 05:00:29',2,'2006-02-15 21:30:53'),(11037,'2005-08-02 05:58:12',4291,220,'2005-08-07 11:26:12',1,'2006-02-15 21:30:53'),(11038,'2005-08-02 05:59:42',4452,403,'2005-08-08 04:37:42',2,'2006-02-15 21:30:53'),(11039,'2005-08-02 06:00:53',549,170,'2005-08-05 06:19:53',2,'2006-02-15 21:30:53'),(11040,'2005-08-02 06:03:22',2297,223,'2005-08-03 07:58:22',1,'2006-02-15 21:30:53'),(11041,'2005-08-02 06:03:53',1897,435,'2005-08-03 11:57:53',1,'2006-02-15 21:30:53'),(11042,'2005-08-02 06:04:33',4149,439,'2005-08-11 01:30:33',1,'2006-02-15 21:30:53'),(11043,'2005-08-02 06:04:44',65,573,'2005-08-06 11:37:44',1,'2006-02-15 21:30:53'),(11044,'2005-08-02 06:05:27',2922,122,'2005-08-06 05:15:27',1,'2006-02-15 21:30:53'),(11045,'2005-08-02 06:07:54',2214,402,'2005-08-08 00:37:54',1,'2006-02-15 21:30:53'),(11046,'2005-08-02 06:08:34',2105,526,'2005-08-06 08:45:34',2,'2006-02-15 21:30:53'),(11047,'2005-08-02 06:09:20',2267,416,'2005-08-11 08:36:20',1,'2006-02-15 21:30:53'),(11048,'2005-08-02 06:15:07',206,491,'2005-08-04 02:47:07',2,'2006-02-15 21:30:53'),(11049,'2005-08-02 06:15:40',4352,38,'2005-08-11 10:09:40',2,'2006-02-15 21:30:53'),(11050,'2005-08-02 06:17:16',2077,234,'2005-08-09 05:58:16',1,'2006-02-15 21:30:53'),(11051,'2005-08-02 06:23:39',4189,446,'2005-08-06 06:46:39',2,'2006-02-15 21:30:53'),(11052,'2005-08-02 06:26:19',1089,331,'2005-08-06 04:20:19',2,'2006-02-15 21:30:53'),(11053,'2005-08-02 06:27:13',2599,50,'2005-08-09 11:24:13',2,'2006-02-15 21:30:53'),(11054,'2005-08-02 06:33:07',728,577,'2005-08-10 02:52:07',2,'2006-02-15 21:30:53'),(11055,'2005-08-02 06:36:05',3851,182,'2005-08-06 00:36:05',1,'2006-02-15 21:30:53'),(11056,'2005-08-02 06:36:27',1404,88,'2005-08-10 06:02:27',1,'2006-02-15 21:30:53'),(11057,'2005-08-02 06:38:19',3143,137,'2005-08-11 03:43:19',1,'2006-02-15 21:30:53'),(11058,'2005-08-02 06:38:44',3270,274,'2005-08-06 06:45:44',1,'2006-02-15 21:30:53'),(11059,'2005-08-02 06:41:38',428,189,'2005-08-09 04:34:38',1,'2006-02-15 21:30:53'),(11060,'2005-08-02 06:48:18',3395,496,'2005-08-10 11:49:18',1,'2006-02-15 21:30:53'),(11061,'2005-08-02 06:50:18',809,245,'2005-08-07 07:41:18',2,'2006-02-15 21:30:53'),(11062,'2005-08-02 06:52:54',2014,346,'2005-08-07 10:59:54',1,'2006-02-15 21:30:53'),(11063,'2005-08-02 06:53:48',2261,461,'2005-08-05 03:38:48',2,'2006-02-15 21:30:53'),(11064,'2005-08-02 06:55:17',3012,338,'2005-08-06 03:29:17',1,'2006-02-15 21:30:53'),(11065,'2005-08-02 06:57:55',2226,357,'2005-08-06 01:31:55',2,'2006-02-15 21:30:53'),(11066,'2005-08-02 06:58:32',4213,373,'2005-08-10 01:27:32',2,'2006-02-15 21:30:53'),(11067,'2005-08-02 07:03:24',965,85,'2005-08-10 08:59:24',2,'2006-02-15 21:30:53'),(11068,'2005-08-02 07:08:07',1262,52,'2005-08-09 11:15:07',2,'2006-02-15 21:30:53'),(11069,'2005-08-02 07:09:34',57,4,'2005-08-08 08:39:34',1,'2006-02-15 21:30:53'),(11070,'2005-08-02 07:10:39',4020,298,'2005-08-03 07:43:39',1,'2006-02-15 21:30:53'),(11071,'2005-08-02 07:10:53',4264,294,'2005-08-07 09:58:53',1,'2006-02-15 21:30:53'),(11072,'2005-08-02 07:10:57',3078,21,'2005-08-04 07:42:57',1,'2006-02-15 21:30:53'),(11073,'2005-08-02 07:13:03',4232,234,'2005-08-03 05:46:03',1,'2006-02-15 21:30:53'),(11074,'2005-08-02 07:21:43',1439,277,'2005-08-08 05:18:43',1,'2006-02-15 21:30:53'),(11075,'2005-08-02 07:24:23',3027,503,'2005-08-08 04:55:23',1,'2006-02-15 21:30:53'),(11076,'2005-08-02 07:24:47',837,211,'2005-08-10 09:16:47',1,'2006-02-15 21:30:53'),(11077,'2005-08-02 07:26:43',4254,158,'2005-08-09 10:34:43',2,'2006-02-15 21:30:53'),(11078,'2005-08-02 07:26:58',2362,587,'2005-08-07 01:59:58',2,'2006-02-15 21:30:53'),(11079,'2005-08-02 07:29:10',3185,29,'2005-08-07 01:59:10',2,'2006-02-15 21:30:53'),(11080,'2005-08-02 07:29:56',4303,571,'2005-08-08 05:58:56',1,'2006-02-15 21:30:53'),(11081,'2005-08-02 07:30:14',3804,513,'2005-08-09 08:50:14',1,'2006-02-15 21:30:53'),(11082,'2005-08-02 07:30:19',3037,190,'2005-08-07 05:20:19',2,'2006-02-15 21:30:53'),(11083,'2005-08-02 07:32:01',4395,295,'2005-08-08 02:23:01',1,'2006-02-15 21:30:53'),(11084,'2005-08-02 07:34:19',32,369,'2005-08-07 09:30:19',1,'2006-02-15 21:30:53'),(11085,'2005-08-02 07:36:44',3207,276,'2005-08-04 03:32:44',1,'2006-02-15 21:30:53'),(11086,'2005-08-02 07:38:44',552,371,'2005-08-11 06:30:44',1,'2006-02-15 21:30:53'),(11087,'2005-08-02 07:41:41',654,2,'2005-08-10 10:37:41',2,'2006-02-15 21:30:53'),(11088,'2005-08-02 07:48:31',2739,138,'2005-08-05 08:09:31',2,'2006-02-15 21:30:53'),(11089,'2005-08-02 07:52:20',825,421,'2005-08-07 07:24:20',1,'2006-02-15 21:30:53'),(11090,'2005-08-02 07:56:40',2743,89,'2005-08-10 07:58:40',1,'2006-02-15 21:30:53'),(11091,'2005-08-02 07:56:41',1659,423,'2005-08-07 05:35:41',2,'2006-02-15 21:30:53'),(11092,'2005-08-02 07:58:50',569,60,'2005-08-04 03:23:50',2,'2006-02-15 21:30:53'),(11093,'2005-08-02 07:59:49',239,82,'2005-08-11 06:01:49',1,'2006-02-15 21:30:53'),(11094,'2005-08-02 08:03:02',3095,18,'2005-08-03 11:34:02',1,'2006-02-15 21:30:53'),(11095,'2005-08-02 08:03:20',3517,278,'2005-08-10 05:20:20',1,'2006-02-15 21:30:53'),(11096,'2005-08-02 08:05:19',1436,34,'2005-08-04 07:28:19',2,'2006-02-15 21:30:53'),(11097,'2005-08-02 08:05:46',2493,575,'2005-08-10 12:00:46',2,'2006-02-15 21:30:53'),(11098,'2005-08-02 08:06:18',158,570,'2005-08-11 04:50:18',2,'2006-02-15 21:30:53'),(11099,'2005-08-02 08:07:12',1444,102,'2005-08-07 12:11:12',2,'2006-02-15 21:30:53'),(11100,'2005-08-02 08:08:00',3047,65,'2005-08-10 07:19:00',1,'2006-02-15 21:30:53'),(11101,'2005-08-02 08:08:24',2621,80,'2005-08-06 05:55:24',1,'2006-02-15 21:30:53'),(11102,'2005-08-02 08:08:30',3112,73,'2005-08-04 09:16:30',1,'2006-02-15 21:30:53'),(11103,'2005-08-02 08:09:54',1879,158,'2005-08-07 12:05:54',1,'2006-02-15 21:30:53'),(11104,'2005-08-02 08:09:58',3042,196,'2005-08-05 11:55:58',1,'2006-02-15 21:30:53'),(11105,'2005-08-02 08:13:31',3170,245,'2005-08-03 11:08:31',1,'2006-02-15 21:30:53'),(11106,'2005-08-02 08:17:38',2307,287,'2005-08-03 07:54:38',1,'2006-02-15 21:30:53'),(11107,'2005-08-02 08:19:38',2217,410,'2005-08-07 08:46:38',2,'2006-02-15 21:30:53'),(11108,'2005-08-02 08:20:01',560,447,'2005-08-03 13:22:01',2,'2006-02-15 21:30:53'),(11109,'2005-08-02 08:20:29',2683,479,'2005-08-09 11:35:29',2,'2006-02-15 21:30:53'),(11110,'2005-08-02 08:20:31',4311,4,'2005-08-04 05:06:31',2,'2006-02-15 21:30:53'),(11111,'2005-08-02 08:21:27',334,378,'2005-08-06 07:48:27',2,'2006-02-15 21:30:53'),(11112,'2005-08-02 08:25:14',526,207,'2005-08-03 08:41:14',1,'2006-02-15 21:30:53'),(11113,'2005-08-02 08:26:24',1654,231,'2005-08-07 09:24:24',2,'2006-02-15 21:30:53'),(11114,'2005-08-02 08:26:45',1273,572,'2005-08-03 08:41:45',2,'2006-02-15 21:30:53'),(11115,'2005-08-02 08:31:06',3812,408,'2005-08-04 02:36:06',2,'2006-02-15 21:30:53'),(11116,'2005-08-02 08:34:40',434,344,'2005-08-09 04:56:40',1,'2006-02-15 21:30:53'),(11117,'2005-08-02 08:36:03',1613,474,'2005-08-05 06:56:03',2,'2006-02-15 21:30:53'),(11118,'2005-08-02 08:44:18',2411,15,'2005-08-05 08:08:18',2,'2006-02-15 21:30:53'),(11119,'2005-08-02 08:44:44',4307,489,'2005-08-10 11:32:44',2,'2006-02-15 21:30:53'),(11120,'2005-08-02 08:47:04',4185,322,'2005-08-05 05:33:04',1,'2006-02-15 21:30:53'),(11121,'2005-08-02 08:48:31',1025,572,'2005-08-04 05:08:31',2,'2006-02-15 21:30:53'),(11122,'2005-08-02 08:49:09',3021,383,'2005-08-08 04:33:09',1,'2006-02-15 21:30:53'),(11123,'2005-08-02 08:54:17',1926,150,'2005-08-09 11:11:17',2,'2006-02-15 21:30:53'),(11124,'2005-08-02 08:55:25',698,249,'2005-08-10 10:59:25',1,'2006-02-15 21:30:53'),(11125,'2005-08-02 08:55:35',2081,237,'2005-08-03 09:12:35',1,'2006-02-15 21:30:53'),(11126,'2005-08-02 08:59:04',3310,47,'2005-08-04 11:00:04',1,'2006-02-15 21:30:53'),(11127,'2005-08-02 09:00:59',1106,351,'2005-08-05 11:54:59',2,'2006-02-15 21:30:53'),(11128,'2005-08-02 09:03:25',3472,386,'2005-08-09 04:36:25',1,'2006-02-15 21:30:53'),(11129,'2005-08-02 09:08:44',23,566,'2005-08-04 04:00:44',1,'2006-02-15 21:30:53'),(11130,'2005-08-02 09:08:59',684,329,'2005-08-09 07:50:59',2,'2006-02-15 21:30:53'),(11131,'2005-08-02 09:10:04',1860,293,'2005-08-08 09:59:04',2,'2006-02-15 21:30:53'),(11132,'2005-08-02 09:14:09',2212,398,'2005-08-08 06:39:09',1,'2006-02-15 21:30:53'),(11133,'2005-08-02 09:15:45',675,120,'2005-08-04 10:39:45',1,'2006-02-15 21:30:53'),(11134,'2005-08-02 09:19:22',2641,372,'2005-08-11 03:56:22',1,'2006-02-15 21:30:53'),(11135,'2005-08-02 09:22:25',799,32,'2005-08-04 14:30:25',2,'2006-02-15 21:30:53'),(11136,'2005-08-02 09:22:57',1315,559,'2005-08-08 14:12:57',2,'2006-02-15 21:30:53'),(11137,'2005-08-02 09:25:31',2500,310,'2005-08-08 08:10:31',1,'2006-02-15 21:30:53'),(11138,'2005-08-02 09:26:16',4250,458,'2005-08-11 07:50:16',2,'2006-02-15 21:30:53'),(11139,'2005-08-02 09:27:36',1011,236,'2005-08-08 14:07:36',2,'2006-02-15 21:30:53'),(11140,'2005-08-02 09:27:45',3836,132,'2005-08-05 04:10:45',1,'2006-02-15 21:30:53'),(11141,'2005-08-02 09:29:11',1614,15,'2005-08-04 07:50:11',1,'2006-02-15 21:30:53'),(11142,'2005-08-02 09:30:11',2954,306,'2005-08-05 06:52:11',1,'2006-02-15 21:30:53'),(11143,'2005-08-02 09:32:54',3382,100,'2005-08-05 12:04:54',2,'2006-02-15 21:30:53'),(11144,'2005-08-02 09:39:17',2724,376,'2005-08-03 11:53:17',2,'2006-02-15 21:30:53'),(11145,'2005-08-02 09:43:24',1270,291,'2005-08-05 15:29:24',1,'2006-02-15 21:30:53'),(11146,'2005-08-02 09:45:32',2488,552,'2005-08-07 07:33:32',1,'2006-02-15 21:30:53'),(11147,'2005-08-02 09:45:54',1562,597,'2005-08-07 07:28:54',1,'2006-02-15 21:30:53'),(11148,'2005-08-02 09:47:08',2991,230,'2005-08-08 10:57:08',1,'2006-02-15 21:30:53'),(11149,'2005-08-02 09:51:43',3254,358,'2005-08-11 09:40:43',2,'2006-02-15 21:30:53'),(11150,'2005-08-02 09:51:46',2193,527,'2005-08-05 09:03:46',2,'2006-02-15 21:30:53'),(11151,'2005-08-02 09:52:44',3939,391,'2005-08-05 06:29:44',2,'2006-02-15 21:30:53'),(11152,'2005-08-02 09:53:36',3887,494,'2005-08-11 14:58:36',1,'2006-02-15 21:30:53'),(11153,'2005-08-02 09:54:19',1546,220,'2005-08-10 14:57:19',1,'2006-02-15 21:30:53'),(11154,'2005-08-02 09:54:50',697,160,'2005-08-06 14:48:50',2,'2006-02-15 21:30:53'),(11155,'2005-08-02 09:55:28',2001,73,'2005-08-03 06:00:28',2,'2006-02-15 21:30:53'),(11156,'2005-08-02 09:56:06',907,465,'2005-08-04 13:36:06',2,'2006-02-15 21:30:53'),(11157,'2005-08-02 09:58:15',1313,244,'2005-08-06 04:23:15',2,'2006-02-15 21:30:53'),(11158,'2005-08-02 09:58:28',530,190,'2005-08-10 13:54:28',2,'2006-02-15 21:30:53'),(11159,'2005-08-02 10:00:55',4575,249,'2005-08-05 10:38:55',1,'2006-02-15 21:30:53'),(11160,'2005-08-02 10:05:30',3260,436,'2005-08-07 08:30:30',1,'2006-02-15 21:30:53'),(11161,'2005-08-02 10:05:57',3321,503,'2005-08-06 05:05:57',2,'2006-02-15 21:30:53'),(11162,'2005-08-02 10:07:54',1809,277,'2005-08-05 11:35:54',2,'2006-02-15 21:30:53'),(11163,'2005-08-02 10:08:40',1925,505,'2005-08-05 14:59:40',1,'2006-02-15 21:30:53'),(11164,'2005-08-02 10:10:56',4450,580,'2005-08-10 11:20:56',2,'2006-02-15 21:30:53'),(11165,'2005-08-02 10:12:17',2059,513,'2005-08-04 11:09:17',1,'2006-02-15 21:30:53'),(11166,'2005-08-02 10:14:58',638,11,'2005-08-11 11:43:58',1,'2006-02-15 21:30:53'),(11167,'2005-08-02 10:15:51',148,451,'2005-08-09 09:18:51',1,'2006-02-15 21:30:53'),(11168,'2005-08-02 10:19:42',468,555,'2005-08-04 08:42:42',1,'2006-02-15 21:30:53'),(11169,'2005-08-02 10:19:42',2392,329,'2005-08-07 05:45:42',1,'2006-02-15 21:30:53'),(11170,'2005-08-02 10:21:53',1333,547,'2005-08-08 11:08:53',1,'2006-02-15 21:30:53'),(11171,'2005-08-02 10:23:41',3117,339,'2005-08-04 14:22:41',2,'2006-02-15 21:30:53'),(11172,'2005-08-02 10:27:52',1207,76,'2005-08-11 12:47:52',1,'2006-02-15 21:30:53'),(11173,'2005-08-02 10:28:00',4296,146,'2005-08-10 14:53:00',1,'2006-02-15 21:30:53'),(11174,'2005-08-02 10:32:11',1551,328,'2005-08-09 12:30:11',1,'2006-02-15 21:30:53'),(11175,'2005-08-02 10:38:47',85,164,'2005-08-07 07:11:47',2,'2006-02-15 21:30:53'),(11176,'2005-08-02 10:39:43',1448,37,'2005-08-09 14:42:43',2,'2006-02-15 21:30:53'),(11177,'2005-08-02 10:43:48',1149,2,'2005-08-10 10:55:48',2,'2006-02-15 21:30:53'),(11178,'2005-08-02 10:48:10',2613,342,'2005-08-06 06:07:10',1,'2006-02-15 21:30:53'),(11179,'2005-08-02 10:50:06',4376,5,'2005-08-04 05:24:06',1,'2006-02-15 21:30:53'),(11180,'2005-08-02 10:54:30',3632,534,'2005-08-11 15:55:30',1,'2006-02-15 21:30:53'),(11181,'2005-08-02 10:55:03',3127,557,'2005-08-07 10:43:03',1,'2006-02-15 21:30:53'),(11182,'2005-08-02 10:55:14',605,54,'2005-08-06 05:58:14',1,'2006-02-15 21:30:53'),(11183,'2005-08-02 11:00:32',833,102,'2005-08-04 08:59:32',2,'2006-02-15 21:30:53'),(11184,'2005-08-02 11:01:26',871,259,'2005-08-11 06:29:26',1,'2006-02-15 21:30:53'),(11185,'2005-08-02 11:04:35',1215,469,'2005-08-05 13:48:35',2,'2006-02-15 21:30:53'),(11186,'2005-08-02 11:12:08',733,353,'2005-08-03 10:46:08',1,'2006-02-15 21:30:53'),(11187,'2005-08-02 11:16:19',3626,410,'2005-08-11 06:11:19',1,'2006-02-15 21:30:53'),(11188,'2005-08-02 11:17:11',1372,485,'2005-08-08 16:46:11',2,'2006-02-15 21:30:53'),(11189,'2005-08-02 11:17:23',729,565,'2005-08-09 16:30:23',2,'2006-02-15 21:30:53'),(11190,'2005-08-02 11:21:34',922,254,'2005-08-05 05:23:34',1,'2006-02-15 21:30:53'),(11191,'2005-08-02 11:24:07',1097,571,'2005-08-10 10:39:07',1,'2006-02-15 21:30:53'),(11192,'2005-08-02 11:29:41',1998,349,'2005-08-07 06:01:41',2,'2006-02-15 21:30:53'),(11193,'2005-08-02 11:31:33',2246,292,'2005-08-04 14:00:33',1,'2006-02-15 21:30:53'),(11194,'2005-08-02 11:35:53',2732,135,'2005-08-10 11:28:53',1,'2006-02-15 21:30:53'),(11195,'2005-08-02 11:42:23',4359,177,'2005-08-03 08:29:23',1,'2006-02-15 21:30:53'),(11196,'2005-08-02 11:42:40',2648,126,'2005-08-10 11:58:40',2,'2006-02-15 21:30:53'),(11197,'2005-08-02 11:45:07',3041,122,'2005-08-03 09:07:07',1,'2006-02-15 21:30:53'),(11198,'2005-08-02 11:45:15',2908,540,'2005-08-10 11:42:15',2,'2006-02-15 21:30:53'),(11199,'2005-08-02 11:47:40',3926,578,'2005-08-10 06:52:40',2,'2006-02-15 21:30:53'),(11200,'2005-08-02 11:48:36',2730,98,'2005-08-07 08:35:36',2,'2006-02-15 21:30:53'),(11201,'2005-08-02 11:49:16',1501,195,'2005-08-11 08:39:16',1,'2006-02-15 21:30:53'),(11202,'2005-08-02 11:51:57',3625,231,'2005-08-08 09:41:57',1,'2006-02-15 21:30:53'),(11203,'2005-08-02 11:52:41',4520,92,'2005-08-10 15:52:41',2,'2006-02-15 21:30:53'),(11204,'2005-08-02 11:56:31',3578,247,'2005-08-06 14:16:31',2,'2006-02-15 21:30:53'),(11205,'2005-08-02 11:56:54',4321,552,'2005-08-05 08:24:54',1,'2006-02-15 21:30:53'),(11206,'2005-08-02 11:58:03',4131,72,'2005-08-07 12:36:03',2,'2006-02-15 21:30:53'),(11207,'2005-08-02 12:01:30',4470,481,'2005-08-05 07:56:30',1,'2006-02-15 21:30:53'),(11208,'2005-08-02 12:02:37',4566,320,'2005-08-05 10:56:37',1,'2006-02-15 21:30:53'),(11209,'2005-08-02 12:09:45',3219,24,'2005-08-07 08:52:45',1,'2006-02-15 21:30:53'),(11210,'2005-08-02 12:15:54',422,202,'2005-08-04 16:18:54',2,'2006-02-15 21:30:53'),(11211,'2005-08-02 12:16:48',1722,245,'2005-08-03 10:40:48',1,'2006-02-15 21:30:53'),(11212,'2005-08-02 12:18:29',4007,343,'2005-08-05 16:05:29',2,'2006-02-15 21:30:53'),(11213,'2005-08-02 12:18:35',1007,584,'2005-08-05 08:44:35',2,'2006-02-15 21:30:53'),(11214,'2005-08-02 12:19:50',2722,407,'2005-08-11 06:38:50',1,'2006-02-15 21:30:53'),(11215,'2005-08-02 12:20:42',379,197,'2005-08-06 14:01:42',1,'2006-02-15 21:30:53'),(11216,'2005-08-02 12:23:43',1109,473,'2005-08-03 13:19:43',1,'2006-02-15 21:30:53'),(11217,'2005-08-02 12:26:31',1201,417,'2005-08-09 09:53:31',2,'2006-02-15 21:30:53'),(11218,'2005-08-02 12:29:12',1126,500,'2005-08-10 16:13:12',2,'2006-02-15 21:30:53'),(11219,'2005-08-02 12:30:20',2889,461,'2005-08-08 13:42:20',2,'2006-02-15 21:30:53'),(11220,'2005-08-02 12:31:41',3777,84,'2005-08-05 08:23:41',2,'2006-02-15 21:30:53'),(11221,'2005-08-02 12:32:12',1689,146,'2005-08-03 17:13:12',1,'2006-02-15 21:30:53'),(11222,'2005-08-02 12:32:28',1780,407,'2005-08-11 18:15:28',2,'2006-02-15 21:30:53'),(11223,'2005-08-02 12:34:27',1994,597,'2005-08-07 14:21:27',1,'2006-02-15 21:30:53'),(11224,'2005-08-02 12:40:38',3938,181,'2005-08-04 10:02:38',2,'2006-02-15 21:30:53'),(11225,'2005-08-02 12:43:27',3721,159,'2005-08-04 18:41:27',2,'2006-02-15 21:30:53'),(11226,'2005-08-02 12:47:30',79,282,'2005-08-06 11:24:30',1,'2006-02-15 21:30:53'),(11227,'2005-08-02 12:48:05',1101,65,'2005-08-11 14:08:05',1,'2006-02-15 21:30:53'),(11228,'2005-08-02 12:55:23',2561,144,'2005-08-08 12:31:23',1,'2006-02-15 21:30:53'),(11229,'2005-08-02 12:56:37',941,332,'2005-08-11 11:13:37',2,'2006-02-15 21:30:53'),(11230,'2005-08-02 12:59:08',1463,257,'2005-08-04 13:42:08',1,'2006-02-15 21:30:53'),(11231,'2005-08-02 13:02:11',1100,90,'2005-08-07 10:05:11',2,'2006-02-15 21:30:53'),(11232,'2005-08-02 13:04:12',971,8,'2005-08-10 15:39:12',1,'2006-02-15 21:30:53'),(11233,'2005-08-02 13:06:11',2221,266,'2005-08-08 15:02:11',1,'2006-02-15 21:30:53'),(11234,'2005-08-02 13:12:17',1020,27,'2005-08-05 17:37:17',1,'2006-02-15 21:30:53'),(11235,'2005-08-02 13:13:21',2501,127,'2005-08-03 07:17:21',1,'2006-02-15 21:30:53'),(11236,'2005-08-02 13:17:21',145,420,'2005-08-09 09:53:21',2,'2006-02-15 21:30:53'),(11237,'2005-08-02 13:24:01',2668,426,'2005-08-05 11:41:01',2,'2006-02-15 21:30:53'),(11238,'2005-08-02 13:25:50',2705,506,'2005-08-08 19:12:50',2,'2006-02-15 21:30:53'),(11239,'2005-08-02 13:27:11',189,111,'2005-08-03 14:36:11',1,'2006-02-15 21:30:53'),(11240,'2005-08-02 13:28:30',2170,597,'2005-08-05 11:40:30',1,'2006-02-15 21:30:53'),(11241,'2005-08-02 13:29:24',3657,543,'2005-08-11 11:36:24',2,'2006-02-15 21:30:53'),(11242,'2005-08-02 13:32:00',1041,434,'2005-08-10 19:24:00',2,'2006-02-15 21:30:53'),(11243,'2005-08-02 13:32:48',2517,361,'2005-08-11 18:55:48',1,'2006-02-15 21:30:53'),(11244,'2005-08-02 13:33:24',3423,142,'2005-08-10 10:18:24',2,'2006-02-15 21:30:53'),(11245,'2005-08-02 13:33:50',2609,92,'2005-08-04 10:20:50',2,'2006-02-15 21:30:53'),(11246,'2005-08-02 13:33:56',3577,550,'2005-08-03 08:52:56',2,'2006-02-15 21:30:53'),(11247,'2005-08-02 13:34:08',1661,441,'2005-08-06 16:23:08',2,'2006-02-15 21:30:53'),(11248,'2005-08-02 13:35:34',4139,312,'2005-08-03 10:37:34',1,'2006-02-15 21:30:53'),(11249,'2005-08-02 13:35:40',3394,157,'2005-08-07 11:22:40',1,'2006-02-15 21:30:53'),(11250,'2005-08-02 13:35:42',2223,279,'2005-08-10 12:32:42',2,'2006-02-15 21:30:53'),(11251,'2005-08-02 13:40:49',2181,532,'2005-08-09 14:16:49',2,'2006-02-15 21:30:53'),(11252,'2005-08-02 13:42:13',2410,337,'2005-08-06 19:04:13',2,'2006-02-15 21:30:53'),(11253,'2005-08-02 13:42:44',2898,303,'2005-08-09 17:06:44',2,'2006-02-15 21:30:53'),(11254,'2005-08-02 13:43:49',56,315,'2005-08-08 13:16:49',1,'2006-02-15 21:30:53'),(11255,'2005-08-02 13:44:30',3393,569,'2005-08-03 12:00:30',1,'2006-02-15 21:30:53'),(11256,'2005-08-02 13:44:53',2060,2,'2005-08-04 16:39:53',1,'2006-02-15 21:30:53'),(11257,'2005-08-02 13:45:05',105,468,'2005-08-11 16:37:05',1,'2006-02-15 21:30:53'),(11258,'2005-08-02 13:45:39',1576,242,'2005-08-06 07:57:39',1,'2006-02-15 21:30:53'),(11259,'2005-08-02 13:46:30',896,330,'2005-08-07 14:03:30',1,'2006-02-15 21:30:53'),(11260,'2005-08-02 13:52:19',4015,207,'2005-08-06 08:13:19',2,'2006-02-15 21:30:53'),(11261,'2005-08-02 13:54:26',31,204,'2005-08-10 19:04:26',2,'2006-02-15 21:30:53'),(11262,'2005-08-02 13:58:55',71,348,'2005-08-05 18:09:55',2,'2006-02-15 21:30:53'),(11263,'2005-08-02 14:02:19',1189,421,'2005-08-07 14:03:19',2,'2006-02-15 21:30:53'),(11264,'2005-08-02 14:05:18',3420,360,'2005-08-10 08:46:18',2,'2006-02-15 21:30:53'),(11265,'2005-08-02 14:05:42',3870,531,'2005-08-11 15:27:42',2,'2006-02-15 21:30:53'),(11266,'2005-08-02 14:07:35',3972,99,'2005-08-04 13:31:35',1,'2006-02-15 21:30:53'),(11267,'2005-08-02 14:09:08',2045,244,'2005-08-10 12:33:08',1,'2006-02-15 21:30:53'),(11268,'2005-08-02 14:10:39',3275,558,'2005-08-04 14:35:39',1,'2006-02-15 21:30:53'),(11269,'2005-08-02 14:11:41',2398,297,'2005-08-08 18:53:41',1,'2006-02-15 21:30:53'),(11270,'2005-08-02 14:18:07',1882,418,'2005-08-03 08:20:07',1,'2006-02-15 21:30:53'),(11271,'2005-08-02 14:18:22',4323,93,'2005-08-07 09:35:22',2,'2006-02-15 21:30:53'),(11272,'2005-08-02 14:20:27',4111,158,'2005-08-07 12:24:27',2,'2006-02-15 21:30:53'),(11273,'2005-08-02 14:20:55',3383,541,'2005-08-07 12:57:55',1,'2006-02-15 21:30:53'),(11274,'2005-08-02 14:24:08',1253,70,'2005-08-11 14:56:08',1,'2006-02-15 21:30:53'),(11275,'2005-08-02 14:25:58',2838,464,'2005-08-07 11:20:58',1,'2006-02-15 21:30:53'),(11276,'2005-08-02 14:28:46',4226,190,'2005-08-04 14:00:46',1,'2006-02-15 21:30:53'),(11277,'2005-08-02 14:28:50',2050,68,'2005-08-04 13:50:50',1,'2006-02-15 21:30:53'),(11278,'2005-08-02 14:29:43',961,143,'2005-08-07 10:13:43',1,'2006-02-15 21:30:53'),(11279,'2005-08-02 14:30:03',151,125,'2005-08-10 09:49:03',2,'2006-02-15 21:30:53'),(11280,'2005-08-02 14:34:33',1846,134,'2005-08-08 15:40:33',2,'2006-02-15 21:30:53'),(11281,'2005-08-02 14:35:01',2210,137,'2005-08-07 17:28:01',1,'2006-02-15 21:30:53'),(11282,'2005-08-02 14:35:03',1824,273,'2005-08-03 16:02:03',2,'2006-02-15 21:30:53'),(11283,'2005-08-02 14:39:46',312,134,'2005-08-05 10:19:46',2,'2006-02-15 21:30:53'),(11284,'2005-08-02 14:42:45',172,8,'2005-08-04 11:55:45',2,'2006-02-15 21:30:53'),(11285,'2005-08-02 14:44:02',3849,585,'2005-08-11 16:45:02',2,'2006-02-15 21:30:53'),(11286,'2005-08-02 14:44:22',1319,207,'2005-08-10 09:01:22',2,'2006-02-15 21:30:53'),(11287,'2005-08-02 14:49:51',927,55,'2005-08-09 09:19:51',2,'2006-02-15 21:30:53'),(11288,'2005-08-02 14:54:08',1478,298,'2005-08-11 12:22:08',1,'2006-02-15 21:30:53'),(11289,'2005-08-02 14:55:00',2869,10,'2005-08-11 13:57:00',1,'2006-02-15 21:30:53'),(11290,'2005-08-02 14:57:44',425,582,'2005-08-09 19:36:44',2,'2006-02-15 21:30:53'),(11291,'2005-08-02 14:57:58',491,417,'2005-08-11 09:04:58',2,'2006-02-15 21:30:53'),(11292,'2005-08-02 14:58:41',210,13,'2005-08-06 14:38:41',2,'2006-02-15 21:30:53'),(11293,'2005-08-02 15:00:43',1514,475,'2005-08-11 17:49:43',1,'2006-02-15 21:30:53'),(11294,'2005-08-02 15:08:27',855,411,'2005-08-03 18:28:27',1,'2006-02-15 21:30:53'),(11295,'2005-08-02 15:10:06',423,67,'2005-08-10 09:52:06',1,'2006-02-15 21:30:53'),(11296,'2005-08-02 15:15:27',247,154,'2005-08-11 16:12:27',1,'2006-02-15 21:30:53'),(11297,'2005-08-02 15:22:47',2531,62,'2005-08-11 18:45:47',1,'2006-02-15 21:30:53'),(11298,'2005-08-02 15:32:32',1663,35,'2005-08-06 20:22:32',1,'2006-02-15 21:30:53'),(11299,'2005-08-02 15:36:52',3232,1,'2005-08-10 16:40:52',2,'2006-02-15 21:30:53'),(11300,'2005-08-02 15:37:42',3032,552,'2005-08-11 14:25:42',1,'2006-02-15 21:30:53'),(11301,'2005-08-02 15:37:59',676,502,'2005-08-04 10:57:59',2,'2006-02-15 21:30:53'),(11302,'2005-08-02 15:38:03',1918,51,'2005-08-09 10:33:03',2,'2006-02-15 21:30:53'),(11303,'2005-08-02 15:39:18',1817,417,'2005-08-05 10:59:18',1,'2006-02-15 21:30:53'),(11304,'2005-08-02 15:40:10',2592,413,'2005-08-06 16:12:10',2,'2006-02-15 21:30:53'),(11305,'2005-08-02 15:44:55',1690,341,'2005-08-08 16:42:55',2,'2006-02-15 21:30:53'),(11306,'2005-08-02 15:45:10',13,247,'2005-08-03 21:14:10',2,'2006-02-15 21:30:53'),(11307,'2005-08-02 15:48:08',1490,15,'2005-08-06 20:33:08',2,'2006-02-15 21:30:53'),(11308,'2005-08-02 15:50:44',699,16,'2005-08-05 11:38:44',2,'2006-02-15 21:30:53'),(11309,'2005-08-02 15:50:55',607,275,'2005-08-09 18:28:55',1,'2006-02-15 21:30:53'),(11310,'2005-08-02 15:51:58',3601,415,'2005-08-07 12:34:58',1,'2006-02-15 21:30:53'),(11311,'2005-08-02 15:53:48',204,197,'2005-08-03 16:32:48',1,'2006-02-15 21:30:53'),(11312,'2005-08-02 15:56:51',1093,190,'2005-08-07 20:56:51',2,'2006-02-15 21:30:53'),(11313,'2005-08-02 16:02:51',2689,419,'2005-08-03 14:54:51',1,'2006-02-15 21:30:53'),(11314,'2005-08-02 16:04:08',2790,26,'2005-08-04 18:47:08',1,'2006-02-15 21:30:53'),(11315,'2005-08-02 16:05:17',1116,13,'2005-08-05 16:33:17',1,'2006-02-15 21:30:53'),(11316,'2005-08-02 16:07:49',521,108,'2005-08-10 13:22:49',1,'2006-02-15 21:30:53'),(11317,'2005-08-02 16:08:52',1889,502,'2005-08-08 21:12:52',1,'2006-02-15 21:30:53'),(11318,'2005-08-02 16:09:11',2386,532,'2005-08-07 11:28:11',2,'2006-02-15 21:30:53'),(11319,'2005-08-02 16:10:09',4069,178,'2005-08-09 11:21:09',2,'2006-02-15 21:30:53'),(11320,'2005-08-02 16:13:28',3362,550,'2005-08-05 21:23:28',1,'2006-02-15 21:30:53'),(11321,'2005-08-02 16:15:07',205,266,'2005-08-04 20:35:07',2,'2006-02-15 21:30:53'),(11322,'2005-08-02 16:23:17',761,418,'2005-08-09 19:55:17',2,'2006-02-15 21:30:53'),(11323,'2005-08-02 16:29:57',3784,419,'2005-08-06 16:01:57',1,'2006-02-15 21:30:53'),(11324,'2005-08-02 16:31:17',2900,540,'2005-08-08 15:38:17',2,'2006-02-15 21:30:53'),(11325,'2005-08-02 16:33:11',4514,422,'2005-08-08 13:42:11',1,'2006-02-15 21:30:53'),(11326,'2005-08-02 16:34:29',1762,530,'2005-08-03 17:40:29',2,'2006-02-15 21:30:53'),(11327,'2005-08-02 16:40:47',773,361,'2005-08-03 22:13:47',1,'2006-02-15 21:30:53'),(11328,'2005-08-02 16:42:38',2031,219,'2005-08-04 21:02:38',1,'2006-02-15 21:30:53'),(11329,'2005-08-02 16:42:52',2677,399,'2005-08-08 16:45:52',1,'2006-02-15 21:30:53'),(11330,'2005-08-02 16:45:33',4326,75,'2005-08-04 15:15:33',2,'2006-02-15 21:30:53'),(11331,'2005-08-02 16:49:01',3789,568,'2005-08-09 19:15:01',1,'2006-02-15 21:30:53'),(11332,'2005-08-02 16:52:57',2381,467,'2005-08-04 14:13:57',1,'2006-02-15 21:30:53'),(11333,'2005-08-02 16:53:00',3335,225,'2005-08-07 20:49:00',2,'2006-02-15 21:30:53'),(11334,'2005-08-02 16:53:20',1504,560,'2005-08-11 20:47:20',1,'2006-02-15 21:30:53'),(11335,'2005-08-02 16:57:37',2968,157,'2005-08-09 19:43:37',1,'2006-02-15 21:30:53'),(11336,'2005-08-02 16:58:56',1949,473,'2005-08-06 16:56:56',1,'2006-02-15 21:30:53'),(11337,'2005-08-02 16:59:09',3428,366,'2005-08-10 20:41:09',2,'2006-02-15 21:30:53'),(11338,'2005-08-02 17:00:12',3689,26,'2005-08-03 18:54:12',1,'2006-02-15 21:30:53'),(11339,'2005-08-02 17:02:06',705,263,'2005-08-08 21:12:06',1,'2006-02-15 21:30:53'),(11340,'2005-08-02 17:05:43',1403,366,'2005-08-09 13:25:43',1,'2006-02-15 21:30:53'),(11341,'2005-08-02 17:09:24',3586,15,'2005-08-09 19:48:24',2,'2006-02-15 21:30:53'),(11342,'2005-08-02 17:11:35',4251,179,'2005-08-07 15:04:35',1,'2006-02-15 21:30:53'),(11343,'2005-08-02 17:12:30',564,466,'2005-08-09 12:08:30',1,'2006-02-15 21:30:53'),(11344,'2005-08-02 17:13:26',365,38,'2005-08-07 16:44:26',1,'2006-02-15 21:30:53'),(11345,'2005-08-02 17:14:19',1895,405,'2005-08-11 14:02:19',2,'2006-02-15 21:30:53'),(11346,'2005-08-02 17:15:38',584,100,'2005-08-04 13:31:38',2,'2006-02-15 21:30:53'),(11347,'2005-08-02 17:18:07',195,217,'2005-08-05 12:30:07',1,'2006-02-15 21:30:53'),(11348,'2005-08-02 17:18:38',1704,389,'2005-08-06 16:11:38',2,'2006-02-15 21:30:53'),(11349,'2005-08-02 17:21:49',1871,73,'2005-08-06 18:40:49',1,'2006-02-15 21:30:53'),(11350,'2005-08-02 17:22:59',1265,598,'2005-08-09 19:56:59',2,'2006-02-15 21:30:53'),(11351,'2005-08-02 17:28:07',242,198,'2005-08-09 21:55:07',1,'2006-02-15 21:30:53'),(11352,'2005-08-02 17:29:39',2760,546,'2005-08-10 15:31:39',1,'2006-02-15 21:30:53'),(11353,'2005-08-02 17:34:45',1729,444,'2005-08-09 16:01:45',1,'2006-02-15 21:30:53'),(11354,'2005-08-02 17:35:10',1887,569,'2005-08-09 12:07:10',2,'2006-02-15 21:30:53'),(11355,'2005-08-02 17:37:43',2673,185,'2005-08-05 19:59:43',1,'2006-02-15 21:30:53'),(11356,'2005-08-02 17:42:40',303,200,'2005-08-11 23:29:40',1,'2006-02-15 21:30:53'),(11357,'2005-08-02 17:42:49',2644,148,'2005-08-11 18:14:49',1,'2006-02-15 21:30:53'),(11358,'2005-08-02 17:45:02',2361,56,'2005-08-11 18:16:02',1,'2006-02-15 21:30:53'),(11359,'2005-08-02 17:45:55',1648,466,'2005-08-10 20:53:55',2,'2006-02-15 21:30:53'),(11360,'2005-08-02 17:46:04',1750,66,'2005-08-04 21:02:04',2,'2006-02-15 21:30:53'),(11361,'2005-08-02 17:46:34',1124,547,'2005-08-03 15:21:34',1,'2006-02-15 21:30:53'),(11362,'2005-08-02 17:47:25',2628,331,'2005-08-07 20:14:25',1,'2006-02-15 21:30:53'),(11363,'2005-08-02 17:48:39',3190,274,'2005-08-05 17:20:39',1,'2006-02-15 21:30:53'),(11364,'2005-08-02 17:53:36',4515,44,'2005-08-03 14:16:36',1,'2006-02-15 21:30:53'),(11365,'2005-08-02 18:00:09',1151,508,'2005-08-04 13:40:09',2,'2006-02-15 21:30:53'),(11366,'2005-08-02 18:01:25',3583,280,'2005-08-11 15:02:25',1,'2006-02-15 21:30:53'),(11367,'2005-08-02 18:01:38',1440,1,'2005-08-04 13:19:38',1,'2006-02-15 21:30:53'),(11368,'2005-08-02 18:03:05',866,153,'2005-08-07 20:40:05',1,'2006-02-15 21:30:53'),(11369,'2005-08-02 18:04:41',2480,480,'2005-08-09 18:41:41',1,'2006-02-15 21:30:53'),(11370,'2005-08-02 18:06:01',3077,146,'2005-08-04 15:10:01',1,'2006-02-15 21:30:53'),(11371,'2005-08-02 18:07:36',324,561,'2005-08-06 17:52:36',1,'2006-02-15 21:30:53'),(11372,'2005-08-02 18:10:50',796,327,'2005-08-07 17:58:50',1,'2006-02-15 21:30:53'),(11373,'2005-08-02 18:14:12',181,267,'2005-08-06 23:37:12',1,'2006-02-15 21:30:53'),(11374,'2005-08-02 18:14:54',2805,424,'2005-08-04 18:22:54',1,'2006-02-15 21:30:53'),(11375,'2005-08-02 18:14:56',1064,346,'2005-08-08 23:29:56',1,'2006-02-15 21:30:53'),(11376,'2005-08-02 18:16:00',2530,177,'2005-08-11 23:38:00',2,'2006-02-15 21:30:53'),(11377,'2005-08-02 18:16:47',3334,119,'2005-08-08 13:46:47',1,'2006-02-15 21:30:53'),(11378,'2005-08-02 18:16:52',3824,188,'2005-08-03 14:25:52',1,'2006-02-15 21:30:53'),(11379,'2005-08-02 18:16:55',251,61,'2005-08-07 18:12:55',1,'2006-02-15 21:30:53'),(11380,'2005-08-02 18:17:32',1046,551,'2005-08-03 19:26:32',2,'2006-02-15 21:30:53'),(11381,'2005-08-02 18:19:29',993,451,'2005-08-08 20:39:29',2,'2006-02-15 21:30:53'),(11382,'2005-08-02 18:20:52',3848,407,'2005-08-07 17:06:52',1,'2006-02-15 21:30:53'),(11383,'2005-08-02 18:22:05',257,445,'2005-08-11 17:18:05',1,'2006-02-15 21:30:53'),(11384,'2005-08-02 18:23:01',2840,225,'2005-08-05 17:59:01',1,'2006-02-15 21:30:53'),(11385,'2005-08-02 18:23:11',2478,192,'2005-08-06 12:37:11',1,'2006-02-15 21:30:53'),(11386,'2005-08-02 18:24:03',519,183,'2005-08-06 21:22:03',1,'2006-02-15 21:30:53'),(11387,'2005-08-02 18:32:38',2491,481,'2005-08-07 19:08:38',2,'2006-02-15 21:30:53'),(11388,'2005-08-02 18:35:55',477,369,'2005-08-09 21:56:55',1,'2006-02-15 21:30:53'),(11389,'2005-08-02 18:39:12',3267,270,'2005-08-03 23:23:12',2,'2006-02-15 21:30:53'),(11390,'2005-08-02 18:39:16',3135,294,'2005-08-04 21:43:16',1,'2006-02-15 21:30:53'),(11391,'2005-08-02 18:40:12',2039,403,'2005-08-10 15:55:12',1,'2006-02-15 21:30:53'),(11392,'2005-08-02 18:41:11',261,146,'2005-08-11 21:41:11',1,'2006-02-15 21:30:53'),(11393,'2005-08-02 18:44:29',1033,501,'2005-08-11 23:58:29',1,'2006-02-15 21:30:53'),(11394,'2005-08-02 18:44:45',2087,257,'2005-08-06 22:51:45',2,'2006-02-15 21:30:53'),(11395,'2005-08-02 18:47:44',4234,225,'2005-08-10 17:07:44',2,'2006-02-15 21:30:53'),(11396,'2005-08-02 18:48:29',1155,59,'2005-08-04 16:05:29',2,'2006-02-15 21:30:53'),(11397,'2005-08-02 18:53:14',2566,470,'2005-08-09 18:09:14',1,'2006-02-15 21:30:53'),(11398,'2005-08-02 18:55:15',3952,6,'2005-08-10 19:50:15',2,'2006-02-15 21:30:53'),(11399,'2005-08-02 18:56:28',2094,565,'2005-08-11 23:19:28',1,'2006-02-15 21:30:53'),(11400,'2005-08-02 19:00:52',3150,9,'2005-08-09 19:45:52',2,'2006-02-15 21:30:53'),(11401,'2005-08-02 19:05:06',1799,544,'2005-08-09 22:34:06',1,'2006-02-15 21:30:53'),(11402,'2005-08-02 19:07:21',3291,561,'2005-08-07 20:59:21',1,'2006-02-15 21:30:53'),(11403,'2005-08-02 19:10:21',4072,587,'2005-08-04 00:44:21',2,'2006-02-15 21:30:53'),(11404,'2005-08-02 19:12:40',3285,60,'2005-08-11 22:38:40',2,'2006-02-15 21:30:53'),(11405,'2005-08-02 19:13:39',418,10,'2005-08-07 19:19:39',2,'2006-02-15 21:30:53'),(11406,'2005-08-02 19:16:10',2502,525,'2005-08-04 20:51:10',2,'2006-02-15 21:30:53'),(11407,'2005-08-02 19:18:43',3437,513,'2005-08-08 16:15:43',2,'2006-02-15 21:30:53'),(11408,'2005-08-02 19:25:13',1779,83,'2005-08-06 17:12:13',1,'2006-02-15 21:30:53'),(11409,'2005-08-02 19:26:51',3691,418,'2005-08-07 19:55:51',1,'2006-02-15 21:30:53'),(11410,'2005-08-02 19:29:01',692,592,'2005-08-11 16:50:01',1,'2006-02-15 21:30:53'),(11411,'2005-08-02 19:29:47',1497,141,'2005-08-09 16:27:47',2,'2006-02-15 21:30:53'),(11412,'2005-08-02 19:32:51',2271,141,'2005-08-11 22:16:51',1,'2006-02-15 21:30:53'),(11413,'2005-08-02 19:35:19',1115,297,'2005-08-05 21:33:19',2,'2006-02-15 21:30:53'),(11414,'2005-08-02 19:43:07',1772,353,'2005-08-07 15:22:07',2,'2006-02-15 21:30:53'),(11415,'2005-08-02 19:43:38',2197,572,'2005-08-10 15:13:38',1,'2006-02-15 21:30:53'),(11416,'2005-08-02 19:44:04',1848,58,'2005-08-11 15:30:04',1,'2006-02-15 21:30:53'),(11417,'2005-08-02 19:44:46',3083,437,'2005-08-11 21:43:46',2,'2006-02-15 21:30:53'),(11418,'2005-08-02 19:45:33',4490,91,'2005-08-06 17:40:33',1,'2006-02-15 21:30:53'),(11419,'2005-08-02 19:46:38',514,444,'2005-08-11 14:49:38',1,'2006-02-15 21:30:53'),(11420,'2005-08-02 19:47:56',3928,158,'2005-08-05 21:48:56',2,'2006-02-15 21:30:53'),(11421,'2005-08-02 19:51:53',3361,473,'2005-08-12 00:50:53',2,'2006-02-15 21:30:53'),(11422,'2005-08-02 19:52:08',342,72,'2005-08-11 18:40:08',2,'2006-02-15 21:30:53'),(11423,'2005-08-02 19:57:13',3431,241,'2005-08-06 00:54:13',2,'2006-02-15 21:30:53'),(11424,'2005-08-02 19:57:42',1030,84,'2005-08-10 16:57:42',2,'2006-02-15 21:30:53'),(11425,'2005-08-02 19:58:48',989,419,'2005-08-03 19:30:48',2,'2006-02-15 21:30:53'),(11426,'2005-08-02 20:00:09',130,572,'2005-08-09 01:30:09',2,'2006-02-15 21:30:53'),(11427,'2005-08-02 20:02:39',3287,403,'2005-08-04 22:26:39',2,'2006-02-15 21:30:53'),(11428,'2005-08-02 20:03:10',722,326,'2005-08-04 01:55:10',1,'2006-02-15 21:30:53'),(11429,'2005-08-02 20:03:52',1098,348,'2005-08-10 16:38:52',2,'2006-02-15 21:30:53'),(11430,'2005-08-02 20:04:36',2258,140,'2005-08-08 19:43:36',1,'2006-02-15 21:30:53'),(11431,'2005-08-02 20:05:16',1409,271,'2005-08-04 00:05:16',2,'2006-02-15 21:30:53'),(11432,'2005-08-02 20:10:01',959,540,'2005-08-07 01:28:01',1,'2006-02-15 21:30:53'),(11433,'2005-08-02 20:13:10',1,518,'2005-08-11 21:35:10',1,'2006-02-15 21:30:53'),(11434,'2005-08-02 20:13:14',3154,391,'2005-08-05 15:01:14',1,'2006-02-15 21:30:53'),(11435,'2005-08-02 20:14:23',1625,502,'2005-08-05 20:40:23',1,'2006-02-15 21:30:53'),(11436,'2005-08-02 20:16:06',3834,106,'2005-08-05 20:40:06',2,'2006-02-15 21:30:53'),(11437,'2005-08-02 20:20:06',2679,225,'2005-08-05 22:17:06',2,'2006-02-15 21:30:53'),(11438,'2005-08-02 20:21:08',1040,372,'2005-08-10 22:12:08',1,'2006-02-15 21:30:53'),(11439,'2005-08-02 20:22:45',2897,18,'2005-08-04 18:30:45',1,'2006-02-15 21:30:53'),(11440,'2005-08-02 20:24:02',2727,306,'2005-08-07 16:42:02',2,'2006-02-15 21:30:53'),(11441,'2005-08-02 20:25:41',1027,389,'2005-08-05 00:05:41',2,'2006-02-15 21:30:53'),(11442,'2005-08-02 20:26:19',2598,208,'2005-08-07 00:33:19',2,'2006-02-15 21:30:53'),(11443,'2005-08-02 20:29:30',1291,581,'2005-08-07 01:08:30',2,'2006-02-15 21:30:53'),(11444,'2005-08-02 20:32:55',1419,28,'2005-08-08 23:21:55',2,'2006-02-15 21:30:53'),(11445,'2005-08-02 20:33:35',3340,108,'2005-08-08 16:02:35',2,'2006-02-15 21:30:53'),(11446,'2005-08-02 20:33:37',748,342,'2005-08-03 18:22:37',1,'2006-02-15 21:30:53'),(11447,'2005-08-02 20:36:25',3868,508,'2005-08-07 18:52:25',1,'2006-02-15 21:30:53'),(11448,'2005-08-02 20:44:33',1185,496,'2005-08-05 22:58:33',2,'2006-02-15 21:30:53'),(11449,'2005-08-02 20:44:43',3279,443,'2005-08-07 23:47:43',2,'2006-02-15 21:30:53'),(11450,'2005-08-02 20:45:54',2009,214,'2005-08-08 17:17:54',2,'2006-02-15 21:30:53'),(11451,'2005-08-02 20:45:56',776,515,'2005-08-06 21:42:56',2,'2006-02-15 21:30:53'),(11452,'2005-08-02 20:59:52',1245,35,'2005-08-12 01:16:52',1,'2006-02-15 21:30:53'),(11453,'2005-08-02 21:00:05',4578,84,'2005-08-08 22:03:05',2,'2006-02-15 21:30:53'),(11454,'2005-08-02 21:04:39',2901,199,'2005-08-05 19:03:39',1,'2006-02-15 21:30:53'),(11455,'2005-08-02 21:07:06',2000,498,'2005-08-12 01:21:06',1,'2006-02-15 21:30:53'),(11456,'2005-08-02 21:14:04',3638,322,'2005-08-07 19:49:04',2,'2006-02-15 21:30:53'),(11457,'2005-08-02 21:14:16',1642,379,'2005-08-10 02:39:16',2,'2006-02-15 21:30:53'),(11458,'2005-08-02 21:24:02',3514,575,'2005-08-04 01:32:02',2,'2006-02-15 21:30:53'),(11459,'2005-08-02 21:25:25',3730,392,'2005-08-04 19:57:25',2,'2006-02-15 21:30:53'),(11460,'2005-08-02 21:28:03',4113,403,'2005-08-08 18:24:03',1,'2006-02-15 21:30:53'),(11461,'2005-08-02 21:35:00',4343,65,'2005-08-05 01:34:00',1,'2006-02-15 21:30:53'),(11462,'2005-08-02 21:36:46',167,268,'2005-08-10 01:48:46',1,'2006-02-15 21:30:53'),(11463,'2005-08-02 21:37:36',1944,138,'2005-08-08 03:11:36',2,'2006-02-15 21:30:53'),(11464,'2005-08-02 21:42:07',538,577,'2005-08-03 21:44:07',2,'2006-02-15 21:30:53'),(11465,'2005-08-02 21:43:52',2190,447,'2005-08-10 22:24:52',1,'2006-02-15 21:30:53'),(11466,'2005-08-02 21:46:46',3363,556,'2005-08-06 01:42:46',1,'2006-02-15 21:30:53'),(11467,'2005-08-02 21:47:07',246,117,'2005-08-09 00:50:07',1,'2006-02-15 21:30:53'),(11468,'2005-08-02 21:47:26',3168,413,'2005-08-05 02:30:26',2,'2006-02-15 21:30:53'),(11469,'2005-08-02 21:48:09',230,77,'2005-08-06 18:37:09',1,'2006-02-15 21:30:53'),(11470,'2005-08-02 21:48:28',2379,346,'2005-08-05 23:58:28',2,'2006-02-15 21:30:53'),(11471,'2005-08-02 21:49:03',3378,355,'2005-08-08 00:17:03',1,'2006-02-15 21:30:53'),(11472,'2005-08-02 21:49:06',1829,410,'2005-08-11 20:17:06',1,'2006-02-15 21:30:53'),(11473,'2005-08-02 21:52:03',620,536,'2005-08-09 02:01:03',1,'2006-02-15 21:30:53'),(11474,'2005-08-02 21:53:08',574,214,'2005-08-05 22:36:08',1,'2006-02-15 21:30:53'),(11475,'2005-08-02 21:55:09',3687,194,'2005-08-09 20:28:09',2,'2006-02-15 21:30:53'),(11476,'2005-08-02 22:03:47',724,144,'2005-08-09 02:19:47',1,'2006-02-15 21:30:53'),(11477,'2005-08-02 22:09:01',1671,47,'2005-08-07 03:46:01',2,'2006-02-15 21:30:53'),(11478,'2005-08-02 22:09:05',3932,197,'2005-08-04 18:02:05',1,'2006-02-15 21:30:53'),(11479,'2005-08-02 22:18:13',4077,237,'2005-08-12 00:43:13',1,'2006-02-15 21:30:53'),(11480,'2005-08-02 22:18:24',4161,14,'2005-08-04 21:22:24',2,'2006-02-15 21:30:53'),(11481,'2005-08-02 22:18:41',4028,234,'2005-08-09 23:43:41',2,'2006-02-15 21:30:53'),(11482,'2005-08-02 22:24:31',1400,134,'2005-08-04 01:48:31',1,'2006-02-15 21:30:53'),(11483,'2005-08-02 22:28:22',1586,45,'2005-08-11 18:06:22',1,'2006-02-15 21:30:53'),(11484,'2005-08-02 22:28:23',330,165,'2005-08-04 20:51:23',2,'2006-02-15 21:30:53'),(11485,'2005-08-02 22:33:25',1872,326,'2005-08-04 23:26:25',2,'2006-02-15 21:30:53'),(11486,'2005-08-02 22:34:06',1610,236,'2005-08-09 00:46:06',2,'2006-02-15 21:30:53'),(11487,'2005-08-02 22:35:05',734,239,'2005-08-08 00:54:05',2,'2006-02-15 21:30:53'),(11488,'2005-08-02 22:35:15',2520,45,'2005-08-09 00:28:15',2,'2006-02-15 21:30:53'),(11489,'2005-08-02 22:35:28',3001,474,'2005-08-04 00:29:28',2,'2006-02-15 21:30:53'),(11490,'2005-08-02 22:36:00',1178,156,'2005-08-09 16:36:00',1,'2006-02-15 21:30:53'),(11491,'2005-08-02 22:44:50',268,307,'2005-08-11 01:55:50',2,'2006-02-15 21:30:53'),(11492,'2005-08-02 22:46:47',4037,349,'2005-08-09 19:54:47',2,'2006-02-15 21:30:53'),(11493,'2005-08-02 22:47:00',3375,124,'2005-08-10 20:53:00',2,'2006-02-15 21:30:53'),(11494,'2005-08-02 22:51:23',3994,579,'2005-08-09 01:52:23',1,'2006-02-15 21:30:53'),(11495,'2005-08-16 22:51:20',1265,247,'2005-08-23 00:44:20',1,'2006-02-15 21:30:53'),(11496,'2006-02-14 15:16:03',2047,155,NULL,1,'2006-02-15 21:30:53'),(11497,'2005-08-16 22:52:30',436,12,'2005-08-21 19:52:30',1,'2006-02-15 21:30:53'),(11498,'2005-08-16 22:52:54',487,482,'2005-08-25 03:27:54',2,'2006-02-15 21:30:53'),(11499,'2005-08-16 22:54:12',3857,172,'2005-08-24 03:37:12',2,'2006-02-15 21:30:53'),(11500,'2005-08-16 23:01:22',4003,584,'2005-08-24 22:54:22',1,'2006-02-15 21:30:53'),(11501,'2005-08-16 23:04:53',2147,23,'2005-08-19 20:57:53',2,'2006-02-15 21:30:53'),(11502,'2005-08-16 23:06:30',4470,11,'2005-08-19 03:49:30',1,'2006-02-15 21:30:53'),(11503,'2005-08-16 23:10:34',1496,526,'2005-08-25 03:55:34',1,'2006-02-15 21:30:53'),(11504,'2005-08-16 23:16:46',2132,350,'2005-08-18 20:49:46',2,'2006-02-15 21:30:53'),(11505,'2005-08-16 23:18:47',3344,34,'2005-08-23 19:52:47',2,'2006-02-15 21:30:53'),(11506,'2005-08-16 23:25:48',1529,565,'2005-08-22 18:17:48',1,'2006-02-15 21:30:53'),(11507,'2005-08-16 23:26:43',4197,236,'2005-08-24 22:48:43',2,'2006-02-15 21:30:53'),(11508,'2005-08-16 23:27:36',2688,19,'2005-08-25 01:34:36',2,'2006-02-15 21:30:53'),(11509,'2005-08-16 23:29:53',2750,273,'2005-08-19 02:09:53',1,'2006-02-15 21:30:53'),(11510,'2005-08-16 23:30:07',2997,400,'2005-08-25 17:35:07',1,'2006-02-15 21:30:53'),(11511,'2005-08-16 23:39:59',2127,397,'2005-08-18 18:04:59',1,'2006-02-15 21:30:53'),(11512,'2005-08-16 23:51:06',1248,373,'2005-08-26 02:06:06',2,'2006-02-15 21:30:53'),(11513,'2005-08-16 23:51:33',4473,499,'2005-08-24 01:37:33',2,'2006-02-15 21:30:53'),(11514,'2005-08-16 23:53:10',4240,423,'2005-08-23 22:04:10',1,'2006-02-15 21:30:53'),(11515,'2005-08-16 23:54:34',1053,279,'2005-08-21 19:00:34',1,'2006-02-15 21:30:53'),(11516,'2005-08-16 23:54:47',1860,90,'2005-08-17 20:05:47',1,'2006-02-15 21:30:53'),(11517,'2005-08-16 23:56:28',4266,280,'2005-08-21 22:40:28',1,'2006-02-15 21:30:53'),(11518,'2005-08-16 23:59:49',3297,407,'2005-08-17 22:51:49',2,'2006-02-15 21:30:53'),(11519,'2005-08-17 00:01:27',1034,381,'2005-08-19 04:54:27',2,'2006-02-15 21:30:53'),(11520,'2005-08-17 00:04:28',3536,119,'2005-08-26 02:03:28',1,'2006-02-15 21:30:53'),(11521,'2005-08-17 00:04:54',463,229,'2005-08-21 00:57:54',1,'2006-02-15 21:30:53'),(11522,'2005-08-17 00:05:05',2033,599,'2005-08-24 04:56:05',1,'2006-02-15 21:30:53'),(11523,'2005-08-17 00:10:10',1329,421,'2005-08-24 22:39:10',1,'2006-02-15 21:30:53'),(11524,'2005-08-17 00:10:55',317,533,'2005-08-23 05:30:55',1,'2006-02-15 21:30:53'),(11525,'2005-08-17 00:15:31',1107,174,'2005-08-20 21:14:31',1,'2006-02-15 21:30:53'),(11526,'2005-08-17 00:17:38',2419,572,'2005-08-18 03:59:38',2,'2006-02-15 21:30:53'),(11527,'2005-08-17 00:25:06',162,264,'2005-08-22 21:13:06',1,'2006-02-15 21:30:53'),(11528,'2005-08-17 00:27:23',893,14,'2005-08-22 06:12:23',2,'2006-02-15 21:30:53'),(11529,'2005-08-17 00:28:01',3071,4,'2005-08-19 04:47:01',2,'2006-02-15 21:30:53'),(11530,'2005-08-17 00:29:00',365,400,'2005-08-22 03:22:00',1,'2006-02-15 21:30:53'),(11531,'2005-08-17 00:30:04',1817,278,'2005-08-20 01:12:04',2,'2006-02-15 21:30:53'),(11532,'2005-08-17 00:34:14',1947,413,'2005-08-22 19:37:14',2,'2006-02-15 21:30:53'),(11533,'2005-08-17 00:34:53',4252,264,'2005-08-22 06:10:53',1,'2006-02-15 21:30:53'),(11534,'2005-08-17 00:35:27',2414,144,'2005-08-24 01:36:27',1,'2006-02-15 21:30:53'),(11535,'2005-08-17 00:39:54',1649,356,'2005-08-24 20:46:54',2,'2006-02-15 21:30:53'),(11536,'2005-08-17 00:40:03',2735,428,'2005-08-21 19:11:03',1,'2006-02-15 21:30:53'),(11537,'2005-08-17 00:41:08',190,474,'2005-08-19 00:25:08',2,'2006-02-15 21:30:53'),(11538,'2005-08-17 00:44:04',554,431,'2005-08-18 03:43:04',2,'2006-02-15 21:30:53'),(11539,'2005-08-17 00:45:41',2064,264,'2005-08-19 06:03:41',1,'2006-02-15 21:30:53'),(11540,'2005-08-17 00:48:03',3385,370,'2005-08-25 03:46:03',1,'2006-02-15 21:30:53'),(11541,'2006-02-14 15:16:03',2026,335,NULL,1,'2006-02-15 21:30:53'),(11542,'2005-08-17 00:51:32',2155,7,'2005-08-24 20:29:32',2,'2006-02-15 21:30:53'),(11543,'2005-08-17 00:54:28',2860,238,'2005-08-25 04:31:28',2,'2006-02-15 21:30:53'),(11544,'2005-08-17 00:55:07',836,439,'2005-08-22 19:25:07',1,'2006-02-15 21:30:53'),(11545,'2005-08-17 00:56:06',3198,257,'2005-08-25 22:47:06',1,'2006-02-15 21:30:53'),(11546,'2005-08-17 00:57:36',2522,24,'2005-08-18 23:16:36',1,'2006-02-15 21:30:53'),(11547,'2005-08-17 00:59:24',737,114,'2005-08-20 04:03:24',2,'2006-02-15 21:30:53'),(11548,'2005-08-17 00:59:47',480,323,'2005-08-22 05:09:47',1,'2006-02-15 21:30:53'),(11549,'2005-08-17 01:01:48',945,402,'2005-08-19 21:24:48',2,'2006-02-15 21:30:53'),(11550,'2005-08-17 01:02:06',2972,339,'2005-08-22 21:44:06',1,'2006-02-15 21:30:53'),(11551,'2005-08-17 01:03:49',3356,168,'2005-08-18 22:31:49',1,'2006-02-15 21:30:53'),(11552,'2005-08-17 01:04:29',1143,230,'2005-08-23 23:07:29',1,'2006-02-15 21:30:53'),(11553,'2005-08-17 01:04:31',3317,360,'2005-08-24 00:44:31',1,'2006-02-15 21:30:53'),(11554,'2005-08-17 01:05:17',2212,460,'2005-08-20 06:20:17',2,'2006-02-15 21:30:53'),(11555,'2005-08-17 01:08:59',2569,372,'2005-08-18 06:09:59',2,'2006-02-15 21:30:53'),(11556,'2005-08-17 01:11:53',373,9,'2005-08-18 23:41:53',1,'2006-02-15 21:30:53'),(11557,'2005-08-17 01:19:20',2376,416,'2005-08-24 02:25:20',1,'2006-02-15 21:30:53'),(11558,'2005-08-17 01:19:52',1681,403,'2005-08-19 00:47:52',2,'2006-02-15 21:30:53'),(11559,'2005-08-17 01:20:26',1812,385,'2005-08-24 03:11:26',1,'2006-02-15 21:30:53'),(11560,'2005-08-17 01:20:30',2316,320,'2005-08-18 04:29:30',2,'2006-02-15 21:30:53'),(11561,'2005-08-17 01:23:09',189,149,'2005-08-23 21:02:09',2,'2006-02-15 21:30:53'),(11562,'2005-08-17 01:23:39',2992,424,'2005-08-26 06:16:39',1,'2006-02-15 21:30:53'),(11563,'2006-02-14 15:16:03',1545,83,NULL,1,'2006-02-15 21:30:53'),(11564,'2005-08-17 01:27:49',2237,332,'2005-08-19 22:07:49',1,'2006-02-15 21:30:53'),(11565,'2005-08-17 01:28:05',173,83,'2005-08-23 23:33:05',2,'2006-02-15 21:30:53'),(11566,'2005-08-17 01:28:35',4020,520,'2005-08-20 22:42:35',1,'2006-02-15 21:30:53'),(11567,'2005-08-17 01:28:43',567,558,'2005-08-24 20:20:43',2,'2006-02-15 21:30:53'),(11568,'2005-08-17 01:30:01',183,342,'2005-08-18 22:21:01',2,'2006-02-15 21:30:53'),(11569,'2005-08-17 01:31:04',2592,504,'2005-08-24 03:36:04',2,'2006-02-15 21:30:53'),(11570,'2005-08-17 01:34:32',2466,343,'2005-08-24 05:47:32',1,'2006-02-15 21:30:53'),(11571,'2005-08-17 01:37:51',203,296,'2005-08-17 20:30:51',1,'2006-02-15 21:30:53'),(11572,'2005-08-17 01:37:55',3512,515,'2005-08-19 06:22:55',2,'2006-02-15 21:30:53'),(11573,'2005-08-17 01:38:18',639,146,'2005-08-19 05:06:18',2,'2006-02-15 21:30:53'),(11574,'2005-08-17 01:38:19',3596,277,'2005-08-18 20:30:19',2,'2006-02-15 21:30:53'),(11575,'2005-08-17 01:50:26',1725,319,'2005-08-18 00:43:26',1,'2006-02-15 21:30:53'),(11576,'2005-08-17 01:53:20',327,293,'2005-08-19 00:15:20',1,'2006-02-15 21:30:53'),(11577,'2006-02-14 15:16:03',4106,219,NULL,2,'2006-02-15 21:30:53'),(11578,'2005-08-17 01:54:13',192,590,'2005-08-26 02:00:13',2,'2006-02-15 21:30:53'),(11579,'2005-08-17 01:57:49',4256,356,'2005-08-22 02:42:49',1,'2006-02-15 21:30:53'),(11580,'2005-08-17 01:59:07',1346,436,'2005-08-21 06:18:07',2,'2006-02-15 21:30:53'),(11581,'2005-08-17 02:03:02',1249,231,'2005-08-24 03:53:02',2,'2006-02-15 21:30:53'),(11582,'2005-08-17 02:03:49',2115,339,'2005-08-24 03:29:49',1,'2006-02-15 21:30:53'),(11583,'2005-08-17 02:08:13',133,542,'2005-08-20 23:13:13',2,'2006-02-15 21:30:53'),(11584,'2005-08-17 02:13:26',3906,479,'2005-08-22 01:24:26',2,'2006-02-15 21:30:53'),(11585,'2005-08-17 02:14:36',753,297,'2005-08-20 07:37:36',2,'2006-02-15 21:30:53'),(11586,'2005-08-17 02:20:42',3140,465,'2005-08-26 05:01:42',1,'2006-02-15 21:30:53'),(11587,'2005-08-17 02:21:03',1319,156,'2005-08-25 21:02:03',2,'2006-02-15 21:30:53'),(11588,'2005-08-17 02:26:23',2480,565,'2005-08-22 02:32:23',1,'2006-02-15 21:30:53'),(11589,'2005-08-17 02:28:22',3480,554,'2005-08-25 00:08:22',1,'2006-02-15 21:30:53'),(11590,'2005-08-17 02:28:33',3600,491,'2005-08-20 03:13:33',1,'2006-02-15 21:30:53'),(11591,'2005-08-17 02:29:41',1670,6,'2005-08-23 20:47:41',1,'2006-02-15 21:30:53'),(11592,'2005-08-17 02:36:04',720,383,'2005-08-19 00:31:04',1,'2006-02-15 21:30:53'),(11593,'2006-02-14 15:16:03',817,99,NULL,1,'2006-02-15 21:30:53'),(11594,'2005-08-17 02:47:02',319,198,'2005-08-22 05:14:02',2,'2006-02-15 21:30:53'),(11595,'2005-08-17 02:53:14',466,350,'2005-08-26 02:05:14',1,'2006-02-15 21:30:53'),(11596,'2005-08-17 02:53:55',1674,290,'2005-08-26 02:19:55',1,'2006-02-15 21:30:53'),(11597,'2005-08-17 03:02:56',4073,272,'2005-08-26 04:47:56',1,'2006-02-15 21:30:53'),(11598,'2005-08-17 03:03:07',1949,319,'2005-08-22 21:05:07',2,'2006-02-15 21:30:53'),(11599,'2005-08-17 03:08:10',3749,112,'2005-08-25 05:01:10',2,'2006-02-15 21:30:53'),(11600,'2005-08-17 03:12:04',1978,400,'2005-08-23 07:10:04',1,'2006-02-15 21:30:53'),(11601,'2005-08-17 03:14:47',1098,471,'2005-08-20 00:21:47',2,'2006-02-15 21:30:53'),(11602,'2005-08-17 03:21:19',2082,391,'2005-08-19 05:23:19',1,'2006-02-15 21:30:53'),(11603,'2005-08-17 03:22:10',3910,406,'2005-08-18 06:48:10',1,'2006-02-15 21:30:53'),(11604,'2005-08-17 03:28:27',1820,388,'2005-08-19 05:38:27',2,'2006-02-15 21:30:53'),(11605,'2005-08-17 03:30:57',1292,455,'2005-08-24 07:02:57',2,'2006-02-15 21:30:53'),(11606,'2005-08-17 03:32:43',4138,499,'2005-08-18 04:30:43',1,'2006-02-15 21:30:53'),(11607,'2005-08-17 03:36:06',4345,242,'2005-08-20 01:06:06',1,'2006-02-15 21:30:53'),(11608,'2005-08-17 03:36:52',1673,448,'2005-08-25 07:17:52',2,'2006-02-15 21:30:53'),(11609,'2005-08-17 03:41:11',351,73,'2005-08-25 01:30:11',2,'2006-02-15 21:30:53'),(11610,'2005-08-17 03:43:37',3048,275,'2005-08-20 22:14:37',1,'2006-02-15 21:30:53'),(11611,'2006-02-14 15:16:03',1857,192,NULL,2,'2006-02-15 21:30:53'),(11612,'2005-08-17 03:48:51',375,526,'2005-08-20 03:03:51',1,'2006-02-15 21:30:53'),(11613,'2005-08-17 03:50:33',2486,126,'2005-08-25 00:37:33',2,'2006-02-15 21:30:53'),(11614,'2005-08-17 03:52:18',805,2,'2005-08-20 07:04:18',1,'2006-02-15 21:30:53'),(11615,'2005-08-17 03:54:35',4331,436,'2005-08-23 06:54:35',2,'2006-02-15 21:30:53'),(11616,'2005-08-17 04:00:01',2588,36,'2005-08-20 23:03:01',2,'2006-02-15 21:30:53'),(11617,'2005-08-17 04:00:40',1898,324,'2005-08-18 00:36:40',1,'2006-02-15 21:30:53'),(11618,'2005-08-17 04:01:36',954,175,'2005-08-23 01:02:36',1,'2006-02-15 21:30:53'),(11619,'2005-08-17 04:03:26',3652,374,'2005-08-22 03:07:26',1,'2006-02-15 21:30:53'),(11620,'2005-08-17 04:06:22',3801,502,'2005-08-17 23:53:22',1,'2006-02-15 21:30:53'),(11621,'2005-08-17 04:13:45',3708,216,'2005-08-26 01:00:45',1,'2006-02-15 21:30:53'),(11622,'2005-08-17 04:15:46',499,220,'2005-08-24 04:48:46',1,'2006-02-15 21:30:53'),(11623,'2005-08-17 04:15:47',759,163,'2005-08-19 04:11:47',2,'2006-02-15 21:30:53'),(11624,'2005-08-17 04:17:42',606,527,'2005-08-18 02:46:42',1,'2006-02-15 21:30:53'),(11625,'2005-08-17 04:18:52',712,521,'2005-08-25 03:05:52',2,'2006-02-15 21:30:53'),(11626,'2005-08-17 04:25:42',4279,266,'2005-08-23 05:46:42',1,'2006-02-15 21:30:53'),(11627,'2005-08-17 04:25:47',3945,168,'2005-08-26 02:54:47',2,'2006-02-15 21:30:53'),(11628,'2005-08-17 04:27:18',3656,256,'2005-08-25 01:12:18',2,'2006-02-15 21:30:53'),(11629,'2005-08-17 04:27:24',786,299,'2005-08-26 10:25:24',2,'2006-02-15 21:30:53'),(11630,'2005-08-17 04:27:46',688,72,'2005-08-19 09:58:46',2,'2006-02-15 21:30:53'),(11631,'2005-08-17 04:28:56',59,168,'2005-08-24 00:42:56',2,'2006-02-15 21:30:53'),(11632,'2005-08-17 04:29:32',2551,238,'2005-08-22 03:44:32',1,'2006-02-15 21:30:53'),(11633,'2005-08-17 04:30:09',1706,468,'2005-08-20 06:56:09',1,'2006-02-15 21:30:53'),(11634,'2005-08-17 04:31:49',2576,206,'2005-08-21 02:51:49',1,'2006-02-15 21:30:53'),(11635,'2005-08-17 04:33:17',2642,98,'2005-08-21 07:50:17',2,'2006-02-15 21:30:53'),(11636,'2005-08-17 04:36:31',791,276,'2005-08-24 00:03:31',2,'2006-02-15 21:30:53'),(11637,'2005-08-17 04:36:39',479,283,'2005-08-18 02:17:39',1,'2006-02-15 21:30:53'),(11638,'2005-08-17 04:39:09',3421,152,'2005-08-25 06:42:09',2,'2006-02-15 21:30:53'),(11639,'2005-08-17 04:43:29',3985,462,'2005-08-25 01:04:29',2,'2006-02-15 21:30:53'),(11640,'2005-08-17 04:44:33',1718,501,'2005-08-21 09:29:33',2,'2006-02-15 21:30:53'),(11641,'2005-08-17 04:45:39',2717,79,'2005-08-20 10:38:39',1,'2006-02-15 21:30:53'),(11642,'2005-08-17 04:48:05',3790,25,'2005-08-18 01:53:05',2,'2006-02-15 21:30:53'),(11643,'2005-08-17 04:49:35',1378,197,'2005-08-24 07:05:35',1,'2006-02-15 21:30:53'),(11644,'2005-08-17 04:49:46',1760,438,'2005-08-24 08:49:46',1,'2006-02-15 21:30:53'),(11645,'2005-08-17 04:50:56',4261,35,'2005-08-25 23:03:56',1,'2006-02-15 21:30:53'),(11646,'2006-02-14 15:16:03',478,11,NULL,2,'2006-02-15 21:30:53'),(11647,'2005-08-17 04:54:14',3016,110,'2005-08-23 04:16:14',2,'2006-02-15 21:30:53'),(11648,'2005-08-17 04:56:16',3362,465,'2005-08-26 00:53:16',2,'2006-02-15 21:30:53'),(11649,'2005-08-17 04:59:26',3222,217,'2005-08-20 04:02:26',2,'2006-02-15 21:30:53'),(11650,'2005-08-17 05:00:03',3979,418,'2005-08-22 01:45:03',2,'2006-02-15 21:30:53'),(11651,'2005-08-17 05:02:25',3681,143,'2005-08-24 08:15:25',2,'2006-02-15 21:30:53'),(11652,'2006-02-14 15:16:03',1622,597,NULL,2,'2006-02-15 21:30:53'),(11653,'2005-08-17 05:06:10',4475,358,'2005-08-24 03:09:10',2,'2006-02-15 21:30:53'),(11654,'2005-08-17 05:06:19',1048,218,'2005-08-18 04:32:19',2,'2006-02-15 21:30:53'),(11655,'2005-08-17 05:11:07',1699,113,'2005-08-26 10:18:07',1,'2006-02-15 21:30:53'),(11656,'2005-08-17 05:11:09',1451,56,'2005-08-25 07:51:09',1,'2006-02-15 21:30:53'),(11657,'2006-02-14 15:16:03',3043,53,NULL,2,'2006-02-15 21:30:53'),(11658,'2005-08-17 05:19:17',2008,422,'2005-08-24 07:03:17',2,'2006-02-15 21:30:53'),(11659,'2005-08-17 05:20:45',2881,112,'2005-08-22 10:18:45',1,'2006-02-15 21:30:53'),(11660,'2005-08-17 05:22:42',4081,525,'2005-08-23 01:03:42',1,'2006-02-15 21:30:53'),(11661,'2005-08-17 05:25:57',1008,27,'2005-08-25 04:37:57',1,'2006-02-15 21:30:53'),(11662,'2005-08-17 05:27:37',2730,177,'2005-08-26 09:56:37',2,'2006-02-15 21:30:53'),(11663,'2005-08-17 05:30:19',3798,373,'2005-08-25 08:14:19',1,'2006-02-15 21:30:53'),(11664,'2005-08-17 05:35:52',1343,433,'2005-08-18 02:40:52',1,'2006-02-15 21:30:53'),(11665,'2005-08-17 05:36:57',334,254,'2005-08-23 01:38:57',1,'2006-02-15 21:30:53'),(11666,'2005-08-17 05:45:10',250,531,'2005-08-19 06:47:10',2,'2006-02-15 21:30:53'),(11667,'2005-08-17 05:46:55',1516,582,'2005-08-26 08:19:55',1,'2006-02-15 21:30:53'),(11668,'2005-08-17 05:47:32',2162,249,'2005-08-20 03:11:32',1,'2006-02-15 21:30:53'),(11669,'2005-08-17 05:48:51',3224,487,'2005-08-22 01:22:51',1,'2006-02-15 21:30:53'),(11670,'2005-08-17 05:48:59',4437,286,'2005-08-19 08:51:59',1,'2006-02-15 21:30:53'),(11671,'2005-08-17 05:50:21',3569,338,'2005-08-20 03:43:21',1,'2006-02-15 21:30:53'),(11672,'2006-02-14 15:16:03',3947,521,NULL,2,'2006-02-15 21:30:53'),(11673,'2005-08-17 05:54:15',823,303,'2005-08-21 08:12:15',2,'2006-02-15 21:30:53'),(11674,'2005-08-17 05:56:27',582,306,'2005-08-24 08:50:27',2,'2006-02-15 21:30:53'),(11675,'2005-08-17 05:57:54',1322,514,'2005-08-21 23:57:54',1,'2006-02-15 21:30:53'),(11676,'2006-02-14 15:16:03',4496,216,NULL,2,'2006-02-15 21:30:53'),(11677,'2005-08-17 06:06:26',2206,407,'2005-08-20 04:35:26',2,'2006-02-15 21:30:53'),(11678,'2005-08-17 06:07:39',3511,176,'2005-08-21 10:51:39',2,'2006-02-15 21:30:53'),(11679,'2005-08-17 06:08:54',3337,72,'2005-08-21 07:50:54',1,'2006-02-15 21:30:53'),(11680,'2005-08-17 06:12:27',4538,221,'2005-08-23 08:54:27',1,'2006-02-15 21:30:53'),(11681,'2005-08-17 06:13:30',1260,543,'2005-08-26 01:29:30',2,'2006-02-15 21:30:53'),(11682,'2005-08-17 06:13:40',2544,387,'2005-08-18 06:11:40',1,'2006-02-15 21:30:53'),(11683,'2005-08-17 06:15:17',2603,66,'2005-08-26 05:33:17',1,'2006-02-15 21:30:53'),(11684,'2005-08-17 06:27:15',4277,517,'2005-08-22 02:11:15',2,'2006-02-15 21:30:53'),(11685,'2005-08-17 06:39:16',3552,51,'2005-08-22 04:20:16',2,'2006-02-15 21:30:53'),(11686,'2005-08-17 06:39:30',1393,392,'2005-08-21 10:19:30',2,'2006-02-15 21:30:53'),(11687,'2005-08-17 06:39:59',1977,169,'2005-08-23 04:53:59',1,'2006-02-15 21:30:53'),(11688,'2005-08-17 06:41:58',2229,82,'2005-08-25 04:38:58',1,'2006-02-15 21:30:53'),(11689,'2005-08-17 06:42:08',2390,419,'2005-08-26 06:09:08',1,'2006-02-15 21:30:53'),(11690,'2005-08-17 06:44:22',3934,267,'2005-08-24 03:49:22',1,'2006-02-15 21:30:53'),(11691,'2005-08-17 06:51:05',2529,515,'2005-08-24 09:53:05',1,'2006-02-15 21:30:53'),(11692,'2005-08-17 06:52:41',1222,350,'2005-08-24 12:17:41',2,'2006-02-15 21:30:53'),(11693,'2005-08-17 06:56:56',793,221,'2005-08-24 06:20:56',2,'2006-02-15 21:30:53'),(11694,'2005-08-17 06:57:30',3540,410,'2005-08-24 07:52:30',1,'2006-02-15 21:30:53'),(11695,'2005-08-17 07:01:08',1110,386,'2005-08-21 09:21:08',1,'2006-02-15 21:30:53'),(11696,'2005-08-17 07:01:09',3816,522,'2005-08-21 09:12:09',2,'2006-02-15 21:30:53'),(11697,'2005-08-17 07:09:19',383,329,'2005-08-19 02:02:19',1,'2006-02-15 21:30:53'),(11698,'2005-08-17 07:09:59',3946,353,'2005-08-19 04:31:59',1,'2006-02-15 21:30:53'),(11699,'2005-08-17 07:11:58',3997,339,'2005-08-26 12:08:58',1,'2006-02-15 21:30:53'),(11700,'2005-08-17 07:12:31',2365,104,'2005-08-18 04:21:31',2,'2006-02-15 21:30:53'),(11701,'2005-08-17 07:15:47',993,34,'2005-08-19 01:44:47',2,'2006-02-15 21:30:53'),(11702,'2005-08-17 07:18:56',3286,526,'2005-08-24 06:33:56',1,'2006-02-15 21:30:53'),(11703,'2005-08-17 07:19:29',1692,279,'2005-08-20 09:35:29',2,'2006-02-15 21:30:53'),(11704,'2005-08-17 07:21:22',1099,135,'2005-08-25 06:06:22',1,'2006-02-15 21:30:53'),(11705,'2005-08-17 07:22:25',4242,489,'2005-08-18 06:42:25',1,'2006-02-15 21:30:53'),(11706,'2005-08-17 07:23:46',4234,414,'2005-08-18 10:13:46',2,'2006-02-15 21:30:53'),(11707,'2005-08-17 07:24:59',1030,581,'2005-08-24 10:40:59',1,'2006-02-15 21:30:53'),(11708,'2005-08-17 07:26:47',76,582,'2005-08-22 04:11:47',1,'2006-02-15 21:30:53'),(11709,'2006-02-14 15:16:03',1720,330,NULL,1,'2006-02-15 21:30:53'),(11710,'2005-08-17 07:29:44',613,553,'2005-08-19 02:06:44',2,'2006-02-15 21:30:53'),(11711,'2005-08-17 07:30:55',1503,470,'2005-08-18 09:21:55',1,'2006-02-15 21:30:53'),(11712,'2005-08-17 07:32:51',3607,203,'2005-08-21 09:18:51',2,'2006-02-15 21:30:53'),(11713,'2005-08-17 07:34:05',1919,590,'2005-08-25 07:49:05',1,'2006-02-15 21:30:53'),(11714,'2005-08-17 07:34:55',17,151,'2005-08-18 04:07:55',1,'2006-02-15 21:30:53'),(11715,'2005-08-17 07:40:55',1615,452,'2005-08-25 11:19:55',1,'2006-02-15 21:30:53'),(11716,'2005-08-17 07:40:55',3054,287,'2005-08-21 05:56:55',1,'2006-02-15 21:30:53'),(11717,'2005-08-17 07:44:09',1371,566,'2005-08-20 09:39:09',2,'2006-02-15 21:30:53'),(11718,'2005-08-17 07:44:42',3673,555,'2005-08-23 03:02:42',2,'2006-02-15 21:30:53'),(11719,'2005-08-17 07:46:05',2054,338,'2005-08-23 08:52:05',1,'2006-02-15 21:30:53'),(11720,'2005-08-17 07:46:54',1707,121,'2005-08-26 04:19:54',2,'2006-02-15 21:30:53'),(11721,'2005-08-17 07:49:17',1923,46,'2005-08-18 04:08:17',1,'2006-02-15 21:30:53'),(11722,'2005-08-17 07:53:03',2430,321,'2005-08-22 06:56:03',2,'2006-02-15 21:30:53'),(11723,'2005-08-17 07:56:22',1665,341,'2005-08-22 03:49:22',1,'2006-02-15 21:30:53'),(11724,'2005-08-17 08:04:44',4484,207,'2005-08-25 03:25:44',2,'2006-02-15 21:30:53'),(11725,'2005-08-17 08:09:00',519,45,'2005-08-18 09:50:00',1,'2006-02-15 21:30:53'),(11726,'2005-08-17 08:11:10',4438,266,'2005-08-22 05:45:10',1,'2006-02-15 21:30:53'),(11727,'2005-08-17 08:12:20',98,6,'2005-08-19 12:45:20',1,'2006-02-15 21:30:53'),(11728,'2005-08-17 08:12:26',726,444,'2005-08-18 03:26:26',1,'2006-02-15 21:30:53'),(11729,'2005-08-17 08:14:41',2819,215,'2005-08-22 02:54:41',1,'2006-02-15 21:30:53'),(11730,'2005-08-17 08:22:00',3817,98,'2005-08-22 05:43:00',2,'2006-02-15 21:30:53'),(11731,'2005-08-17 08:24:35',917,52,'2005-08-24 02:54:35',2,'2006-02-15 21:30:53'),(11732,'2005-08-17 08:29:46',460,137,'2005-08-23 14:21:46',2,'2006-02-15 21:30:53'),(11733,'2005-08-17 08:31:03',439,251,'2005-08-21 05:44:03',2,'2006-02-15 21:30:53'),(11734,'2005-08-17 08:34:22',4063,337,'2005-08-25 11:56:22',2,'2006-02-15 21:30:53'),(11735,'2005-08-17 08:35:42',2555,452,'2005-08-26 11:04:42',1,'2006-02-15 21:30:53'),(11736,'2005-08-17 08:40:55',4217,535,'2005-08-26 09:03:55',1,'2006-02-15 21:30:53'),(11737,'2005-08-17 08:42:08',4128,549,'2005-08-19 08:14:08',1,'2006-02-15 21:30:53'),(11738,'2005-08-17 08:45:55',3042,347,'2005-08-26 07:09:55',1,'2006-02-15 21:30:53'),(11739,'2006-02-14 15:16:03',4568,373,NULL,2,'2006-02-15 21:30:53'),(11740,'2005-08-17 08:48:31',2441,27,'2005-08-24 07:47:31',2,'2006-02-15 21:30:53'),(11741,'2005-08-17 08:48:39',1819,473,'2005-08-20 07:37:39',1,'2006-02-15 21:30:53'),(11742,'2005-08-17 08:48:43',596,470,'2005-08-23 07:18:43',2,'2006-02-15 21:30:53'),(11743,'2005-08-17 08:49:05',294,336,'2005-08-22 08:53:05',2,'2006-02-15 21:30:53'),(11744,'2005-08-17 08:54:30',297,26,'2005-08-25 03:28:30',1,'2006-02-15 21:30:53'),(11745,'2005-08-17 09:00:01',4018,240,'2005-08-26 14:29:01',2,'2006-02-15 21:30:53'),(11746,'2005-08-17 09:03:24',4571,299,'2005-08-25 06:08:24',2,'2006-02-15 21:30:53'),(11747,'2005-08-17 09:03:31',1041,555,'2005-08-19 08:23:31',2,'2006-02-15 21:30:53'),(11748,'2005-08-17 09:04:02',1175,595,'2005-08-21 12:22:02',2,'2006-02-15 21:30:53'),(11749,'2005-08-17 09:04:03',4141,567,'2005-08-19 09:32:03',2,'2006-02-15 21:30:53'),(11750,'2005-08-17 09:07:00',665,190,'2005-08-23 08:16:00',2,'2006-02-15 21:30:53'),(11751,'2005-08-17 09:07:56',3309,51,'2005-08-26 13:16:56',1,'2006-02-15 21:30:53'),(11752,'2005-08-17 09:10:55',1833,481,'2005-08-18 06:22:55',1,'2006-02-15 21:30:53'),(11753,'2005-08-17 09:11:52',2599,43,'2005-08-25 05:03:52',2,'2006-02-15 21:30:53'),(11754,'2006-02-14 15:16:03',3747,163,NULL,2,'2006-02-15 21:30:53'),(11755,'2005-08-17 09:15:35',3457,513,'2005-08-23 06:28:35',2,'2006-02-15 21:30:53'),(11756,'2005-08-17 09:29:22',1798,198,'2005-08-21 12:17:22',1,'2006-02-15 21:30:53'),(11757,'2006-02-14 15:16:03',1295,550,NULL,2,'2006-02-15 21:30:53'),(11758,'2005-08-17 09:33:02',11,533,'2005-08-24 05:03:02',2,'2006-02-15 21:30:53'),(11759,'2005-08-17 09:41:23',2655,108,'2005-08-19 11:58:23',2,'2006-02-15 21:30:53'),(11760,'2005-08-17 09:44:22',626,545,'2005-08-24 14:39:22',2,'2006-02-15 21:30:53'),(11761,'2005-08-17 09:44:59',2230,13,'2005-08-25 07:46:59',1,'2006-02-15 21:30:53'),(11762,'2005-08-17 09:48:06',1204,244,'2005-08-26 13:12:06',2,'2006-02-15 21:30:53'),(11763,'2005-08-17 09:51:39',872,586,'2005-08-21 10:15:39',2,'2006-02-15 21:30:53'),(11764,'2005-08-17 09:51:54',4502,252,'2005-08-20 07:11:54',1,'2006-02-15 21:30:53'),(11765,'2005-08-17 09:55:28',4311,308,'2005-08-19 15:53:28',2,'2006-02-15 21:30:53'),(11766,'2005-08-17 09:58:40',2999,544,'2005-08-21 04:59:40',1,'2006-02-15 21:30:53'),(11767,'2005-08-17 10:00:40',2374,77,'2005-08-25 04:14:40',2,'2006-02-15 21:30:53'),(11768,'2005-08-17 10:02:29',1307,564,'2005-08-23 10:26:29',1,'2006-02-15 21:30:53'),(11769,'2005-08-17 10:04:49',1406,418,'2005-08-20 09:22:49',1,'2006-02-15 21:30:53'),(11770,'2005-08-17 10:05:05',2862,475,'2005-08-20 15:59:05',1,'2006-02-15 21:30:53'),(11771,'2005-08-17 10:17:09',2575,324,'2005-08-25 10:58:09',1,'2006-02-15 21:30:53'),(11772,'2005-08-17 10:18:57',1021,237,'2005-08-26 12:48:57',2,'2006-02-15 21:30:53'),(11773,'2005-08-17 10:19:51',1886,384,'2005-08-23 04:30:51',1,'2006-02-15 21:30:53'),(11774,'2005-08-17 10:20:39',1679,488,'2005-08-23 13:37:39',1,'2006-02-15 21:30:53'),(11775,'2005-08-17 10:25:53',256,574,'2005-08-22 08:37:53',2,'2006-02-15 21:30:53'),(11776,'2005-08-17 10:27:19',2400,306,'2005-08-20 14:02:19',2,'2006-02-15 21:30:53'),(11777,'2005-08-17 10:27:19',4065,83,'2005-08-26 13:10:19',1,'2006-02-15 21:30:53'),(11778,'2005-08-17 10:31:40',1306,213,'2005-08-25 13:53:40',2,'2006-02-15 21:30:53'),(11779,'2005-08-17 10:31:58',181,126,'2005-08-24 15:28:58',2,'2006-02-15 21:30:53'),(11780,'2005-08-17 10:34:24',2268,297,'2005-08-21 04:55:24',1,'2006-02-15 21:30:53'),(11781,'2005-08-17 10:37:00',1853,506,'2005-08-21 12:03:00',2,'2006-02-15 21:30:53'),(11782,'2006-02-14 15:16:03',4098,354,NULL,1,'2006-02-15 21:30:53'),(11783,'2005-08-17 10:39:24',979,152,'2005-08-21 12:43:24',2,'2006-02-15 21:30:53'),(11784,'2005-08-17 10:48:05',3101,297,'2005-08-19 06:47:05',1,'2006-02-15 21:30:53'),(11785,'2005-08-17 10:54:46',2760,182,'2005-08-23 14:15:46',2,'2006-02-15 21:30:53'),(11786,'2005-08-17 10:57:40',1487,435,'2005-08-24 06:48:40',2,'2006-02-15 21:30:53'),(11787,'2005-08-17 10:59:00',1980,195,'2005-08-19 05:56:00',1,'2006-02-15 21:30:53'),(11788,'2005-08-17 10:59:18',1310,560,'2005-08-22 11:12:18',1,'2006-02-15 21:30:53'),(11789,'2005-08-17 10:59:24',851,150,'2005-08-26 16:17:24',1,'2006-02-15 21:30:53'),(11790,'2005-08-17 11:00:08',2384,451,'2005-08-20 05:15:08',2,'2006-02-15 21:30:53'),(11791,'2005-08-17 11:01:11',3640,219,'2005-08-22 06:31:11',2,'2006-02-15 21:30:53'),(11792,'2005-08-17 11:03:53',3703,376,'2005-08-26 06:34:53',1,'2006-02-15 21:30:53'),(11793,'2005-08-17 11:05:53',1955,352,'2005-08-25 12:25:53',1,'2006-02-15 21:30:53'),(11794,'2005-08-17 11:08:48',3486,453,'2005-08-20 13:36:48',2,'2006-02-15 21:30:53'),(11795,'2005-08-17 11:13:38',2220,565,'2005-08-19 14:20:38',2,'2006-02-15 21:30:53'),(11796,'2005-08-17 11:16:47',3983,435,'2005-08-18 16:55:47',2,'2006-02-15 21:30:53'),(11797,'2005-08-17 11:17:21',1142,546,'2005-08-18 09:14:21',2,'2006-02-15 21:30:53'),(11798,'2005-08-17 11:21:43',3974,448,'2005-08-25 07:43:43',2,'2006-02-15 21:30:53'),(11799,'2005-08-17 11:25:25',40,501,'2005-08-25 13:03:25',2,'2006-02-15 21:30:53'),(11800,'2005-08-17 11:29:52',2284,350,'2005-08-21 08:37:52',1,'2006-02-15 21:30:53'),(11801,'2005-08-17 11:30:11',659,126,'2005-08-23 09:54:11',1,'2006-02-15 21:30:53'),(11802,'2005-08-17 11:32:51',2815,221,'2005-08-22 10:56:51',1,'2006-02-15 21:30:53'),(11803,'2005-08-17 11:42:08',3648,160,'2005-08-22 07:45:08',2,'2006-02-15 21:30:53'),(11804,'2005-08-17 11:42:45',1040,556,'2005-08-25 07:11:45',1,'2006-02-15 21:30:53'),(11805,'2005-08-17 11:48:47',1208,208,'2005-08-26 11:06:47',2,'2006-02-15 21:30:53'),(11806,'2005-08-17 11:49:28',3203,125,'2005-08-22 15:42:28',1,'2006-02-15 21:30:53'),(11807,'2005-08-17 11:51:15',4052,201,'2005-08-21 11:47:15',2,'2006-02-15 21:30:53'),(11808,'2005-08-17 11:51:16',4042,462,'2005-08-18 14:01:16',2,'2006-02-15 21:30:53'),(11809,'2005-08-17 11:51:39',1136,305,'2005-08-24 17:14:39',1,'2006-02-15 21:30:53'),(11810,'2005-08-17 11:56:48',1548,270,'2005-08-20 17:39:48',1,'2006-02-15 21:30:53'),(11811,'2005-08-17 11:59:18',195,130,'2005-08-18 09:13:18',2,'2006-02-15 21:30:53'),(11812,'2005-08-17 12:00:54',119,132,'2005-08-18 16:08:54',1,'2006-02-15 21:30:53'),(11813,'2005-08-17 12:06:54',1074,36,'2005-08-21 17:52:54',2,'2006-02-15 21:30:53'),(11814,'2005-08-17 12:09:20',3462,509,'2005-08-25 16:56:20',2,'2006-02-15 21:30:53'),(11815,'2005-08-17 12:13:26',272,192,'2005-08-22 17:15:26',2,'2006-02-15 21:30:53'),(11816,'2005-08-17 12:14:16',3897,224,'2005-08-19 06:15:16',2,'2006-02-15 21:30:53'),(11817,'2005-08-17 12:20:01',2297,38,'2005-08-19 18:06:01',1,'2006-02-15 21:30:53'),(11818,'2005-08-17 12:22:04',213,512,'2005-08-25 15:59:04',2,'2006-02-15 21:30:53'),(11819,'2005-08-17 12:25:17',656,208,'2005-08-19 16:12:17',1,'2006-02-15 21:30:53'),(11820,'2005-08-17 12:25:33',2801,401,'2005-08-19 07:04:33',2,'2006-02-15 21:30:53'),(11821,'2005-08-17 12:27:55',2711,20,'2005-08-18 07:07:55',1,'2006-02-15 21:30:53'),(11822,'2005-08-17 12:32:39',1317,263,'2005-08-18 12:30:39',2,'2006-02-15 21:30:53'),(11823,'2005-08-17 12:36:37',2626,352,'2005-08-22 11:10:37',2,'2006-02-15 21:30:53'),(11824,'2005-08-17 12:37:54',2639,1,'2005-08-19 10:11:54',2,'2006-02-15 21:30:53'),(11825,'2005-08-17 12:43:30',2656,296,'2005-08-20 15:25:30',1,'2006-02-15 21:30:53'),(11826,'2005-08-17 12:43:46',1837,536,'2005-08-19 16:59:46',2,'2006-02-15 21:30:53'),(11827,'2005-08-17 12:44:27',3064,523,'2005-08-24 13:31:27',1,'2006-02-15 21:30:53'),(11828,'2005-08-17 12:48:28',2593,268,'2005-08-24 09:24:28',2,'2006-02-15 21:30:53'),(11829,'2005-08-17 12:52:04',2207,563,'2005-08-19 10:50:04',2,'2006-02-15 21:30:53'),(11830,'2005-08-17 12:53:15',3713,522,'2005-08-25 08:08:15',1,'2006-02-15 21:30:53'),(11831,'2005-08-17 12:54:47',4562,32,'2005-08-21 11:21:47',1,'2006-02-15 21:30:53'),(11832,'2005-08-17 12:55:31',2331,125,'2005-08-19 08:31:31',1,'2006-02-15 21:30:53'),(11833,'2005-08-17 13:00:33',3728,424,'2005-08-18 13:45:33',2,'2006-02-15 21:30:53'),(11834,'2005-08-17 13:00:40',2407,261,'2005-08-22 12:50:40',1,'2006-02-15 21:30:53'),(11835,'2005-08-17 13:03:13',2796,479,'2005-08-19 10:50:13',1,'2006-02-15 21:30:53'),(11836,'2005-08-17 13:03:36',2253,198,'2005-08-19 17:15:36',1,'2006-02-15 21:30:53'),(11837,'2005-08-17 13:04:41',1085,81,'2005-08-26 14:19:41',1,'2006-02-15 21:30:53'),(11838,'2005-08-17 13:06:00',3576,161,'2005-08-20 11:44:00',1,'2006-02-15 21:30:53'),(11839,'2005-08-17 13:08:45',2282,80,'2005-08-18 15:05:45',2,'2006-02-15 21:30:53'),(11840,'2005-08-17 13:09:01',1824,491,'2005-08-19 17:42:01',1,'2006-02-15 21:30:53'),(11841,'2005-08-17 13:12:20',1524,270,'2005-08-21 11:16:20',2,'2006-02-15 21:30:53'),(11842,'2005-08-17 13:13:37',2680,422,'2005-08-20 08:32:37',1,'2006-02-15 21:30:53'),(11843,'2005-08-17 13:14:50',3091,187,'2005-08-22 11:31:50',2,'2006-02-15 21:30:53'),(11844,'2005-08-17 13:16:04',3791,368,'2005-08-18 10:16:04',1,'2006-02-15 21:30:53'),(11845,'2005-08-17 13:16:38',14,65,'2005-08-18 11:21:38',1,'2006-02-15 21:30:53'),(11846,'2005-08-17 13:18:29',3306,283,'2005-08-22 18:05:29',2,'2006-02-15 21:30:53'),(11847,'2006-02-14 15:16:03',1784,337,NULL,1,'2006-02-15 21:30:53'),(11848,'2006-02-14 15:16:03',3680,152,NULL,1,'2006-02-15 21:30:53'),(11849,'2005-08-17 13:24:55',1191,92,'2005-08-22 12:50:55',2,'2006-02-15 21:30:53'),(11850,'2005-08-17 13:30:15',1437,80,'2005-08-21 17:24:15',1,'2006-02-15 21:30:53'),(11851,'2005-08-17 13:30:27',3225,376,'2005-08-20 15:34:27',2,'2006-02-15 21:30:53'),(11852,'2005-08-17 13:38:27',2358,596,'2005-08-24 08:50:27',1,'2006-02-15 21:30:53'),(11853,'2005-08-17 13:39:32',3888,6,'2005-08-23 18:44:32',2,'2006-02-15 21:30:53'),(11854,'2005-08-17 13:42:52',137,313,'2005-08-26 14:04:52',1,'2006-02-15 21:30:53'),(11855,'2005-08-17 13:43:07',1062,535,'2005-08-26 08:07:07',1,'2006-02-15 21:30:53'),(11856,'2005-08-17 13:44:49',305,28,'2005-08-21 17:20:49',1,'2006-02-15 21:30:53'),(11857,'2005-08-17 13:48:30',101,146,'2005-08-18 15:55:30',1,'2006-02-15 21:30:53'),(11858,'2005-08-17 13:50:31',3483,503,'2005-08-19 08:45:31',2,'2006-02-15 21:30:53'),(11859,'2005-08-17 13:51:20',423,144,'2005-08-21 13:47:20',2,'2006-02-15 21:30:53'),(11860,'2005-08-17 13:52:26',4354,257,'2005-08-24 14:47:26',1,'2006-02-15 21:30:53'),(11861,'2005-08-17 13:53:47',2674,232,'2005-08-21 16:07:47',1,'2006-02-15 21:30:53'),(11862,'2005-08-17 13:54:53',2604,529,'2005-08-19 10:48:53',1,'2006-02-15 21:30:53'),(11863,'2005-08-17 13:56:01',1003,112,'2005-08-23 18:38:01',1,'2006-02-15 21:30:53'),(11864,'2005-08-17 14:02:01',2985,96,'2005-08-21 19:54:01',1,'2006-02-15 21:30:53'),(11865,'2005-08-17 14:03:46',2577,345,'2005-08-19 08:39:46',1,'2006-02-15 21:30:53'),(11866,'2006-02-14 15:16:03',2758,200,NULL,2,'2006-02-15 21:30:53'),(11867,'2005-08-17 14:04:28',938,434,'2005-08-21 10:08:28',1,'2006-02-15 21:30:53'),(11868,'2005-08-17 14:05:34',2909,445,'2005-08-19 15:47:34',1,'2006-02-15 21:30:53'),(11869,'2005-08-17 14:10:22',3453,19,'2005-08-24 18:39:22',1,'2006-02-15 21:30:53'),(11870,'2005-08-17 14:11:28',4251,432,'2005-08-24 16:43:28',1,'2006-02-15 21:30:53'),(11871,'2005-08-17 14:11:44',3013,484,'2005-08-18 17:50:44',1,'2006-02-15 21:30:53'),(11872,'2005-08-17 14:11:45',4306,113,'2005-08-21 17:02:45',2,'2006-02-15 21:30:53'),(11873,'2005-08-17 14:14:39',4021,554,'2005-08-18 17:20:39',2,'2006-02-15 21:30:53'),(11874,'2005-08-17 14:16:40',2637,467,'2005-08-18 15:51:40',2,'2006-02-15 21:30:53'),(11875,'2005-08-17 14:16:48',1787,294,'2005-08-26 14:20:48',1,'2006-02-15 21:30:53'),(11876,'2005-08-17 14:18:21',3982,426,'2005-08-20 19:48:21',1,'2006-02-15 21:30:53'),(11877,'2005-08-17 14:21:11',4528,445,'2005-08-25 19:46:11',1,'2006-02-15 21:30:53'),(11878,'2005-08-17 14:23:52',255,549,'2005-08-21 14:23:52',1,'2006-02-15 21:30:53'),(11879,'2005-08-17 14:25:09',2500,312,'2005-08-26 09:19:09',1,'2006-02-15 21:30:53'),(11880,'2005-08-17 14:28:28',1539,597,'2005-08-26 12:32:28',2,'2006-02-15 21:30:53'),(11881,'2005-08-17 14:31:56',3124,272,'2005-08-21 11:05:56',1,'2006-02-15 21:30:53'),(11882,'2005-08-17 14:33:41',2401,234,'2005-08-26 17:25:41',2,'2006-02-15 21:30:53'),(11883,'2005-08-17 14:41:28',221,551,'2005-08-19 09:54:28',1,'2006-02-15 21:30:53'),(11884,'2005-08-17 14:43:23',797,178,'2005-08-25 15:38:23',1,'2006-02-15 21:30:53'),(11885,'2005-08-17 14:53:53',3931,481,'2005-08-22 10:59:53',1,'2006-02-15 21:30:53'),(11886,'2005-08-17 14:58:51',608,204,'2005-08-19 16:07:51',2,'2006-02-15 21:30:53'),(11887,'2005-08-17 15:03:13',3290,54,'2005-08-19 09:49:13',1,'2006-02-15 21:30:53'),(11888,'2005-08-17 15:04:05',1100,160,'2005-08-25 18:52:05',2,'2006-02-15 21:30:53'),(11889,'2005-08-17 15:08:27',293,395,'2005-08-18 17:10:27',1,'2006-02-15 21:30:53'),(11890,'2005-08-17 15:08:43',3023,487,'2005-08-26 14:56:43',2,'2006-02-15 21:30:53'),(11891,'2005-08-17 15:11:55',2619,115,'2005-08-22 11:11:55',2,'2006-02-15 21:30:53'),(11892,'2005-08-17 15:13:21',746,227,'2005-08-21 09:19:21',2,'2006-02-15 21:30:53'),(11893,'2005-08-17 15:13:29',2321,496,'2005-08-25 11:09:29',1,'2006-02-15 21:30:53'),(11894,'2005-08-17 15:15:01',1223,67,'2005-08-26 13:49:01',1,'2006-02-15 21:30:53'),(11895,'2005-08-17 15:15:07',2156,236,'2005-08-18 11:00:07',2,'2006-02-15 21:30:53'),(11896,'2005-08-17 15:19:54',259,436,'2005-08-24 18:22:54',2,'2006-02-15 21:30:53'),(11897,'2005-08-17 15:24:06',3904,238,'2005-08-23 11:50:06',2,'2006-02-15 21:30:53'),(11898,'2005-08-17 15:24:12',3163,169,'2005-08-24 13:36:12',2,'2006-02-15 21:30:53'),(11899,'2005-08-17 15:29:12',3179,84,'2005-08-24 17:41:12',1,'2006-02-15 21:30:53'),(11900,'2005-08-17 15:30:44',1931,239,'2005-08-19 16:12:44',1,'2006-02-15 21:30:53'),(11901,'2005-08-17 15:35:47',4274,70,'2005-08-20 10:33:47',2,'2006-02-15 21:30:53'),(11902,'2005-08-17 15:37:34',1387,63,'2005-08-22 17:28:34',2,'2006-02-15 21:30:53'),(11903,'2005-08-17 15:37:45',1196,542,'2005-08-23 18:31:45',2,'2006-02-15 21:30:53'),(11904,'2005-08-17 15:39:26',2846,145,'2005-08-21 18:24:26',2,'2006-02-15 21:30:53'),(11905,'2005-08-17 15:40:18',2725,349,'2005-08-26 15:14:18',2,'2006-02-15 21:30:53'),(11906,'2005-08-17 15:40:46',325,478,'2005-08-20 15:20:46',2,'2006-02-15 21:30:53'),(11907,'2005-08-17 15:40:47',3928,505,'2005-08-20 19:55:47',2,'2006-02-15 21:30:53'),(11908,'2005-08-17 15:43:09',3390,314,'2005-08-24 14:32:09',2,'2006-02-15 21:30:53'),(11909,'2006-02-14 15:16:03',871,474,NULL,1,'2006-02-15 21:30:53'),(11910,'2005-08-17 15:44:37',4254,418,'2005-08-19 10:58:37',2,'2006-02-15 21:30:53'),(11911,'2005-08-17 15:51:35',3578,472,'2005-08-26 20:26:35',2,'2006-02-15 21:30:53'),(11912,'2005-08-17 15:51:49',744,573,'2005-08-24 18:48:49',1,'2006-02-15 21:30:53'),(11913,'2005-08-17 15:53:17',741,295,'2005-08-24 18:50:17',2,'2006-02-15 21:30:53'),(11914,'2005-08-17 16:04:42',1634,230,'2005-08-22 19:29:42',1,'2006-02-15 21:30:53'),(11915,'2005-08-17 16:05:28',1557,269,'2005-08-25 19:53:28',2,'2006-02-15 21:30:53'),(11916,'2005-08-17 16:05:51',2631,86,'2005-08-20 10:23:51',1,'2006-02-15 21:30:53'),(11917,'2005-08-17 16:08:17',1608,270,'2005-08-20 20:01:17',1,'2006-02-15 21:30:53'),(11918,'2005-08-17 16:08:42',2169,533,'2005-08-20 20:12:42',1,'2006-02-15 21:30:53'),(11919,'2005-08-17 16:08:49',4497,40,'2005-08-20 16:59:49',2,'2006-02-15 21:30:53'),(11920,'2005-08-17 16:10:19',4253,402,'2005-08-20 13:54:19',2,'2006-02-15 21:30:53'),(11921,'2005-08-17 16:12:27',494,485,'2005-08-25 22:07:27',1,'2006-02-15 21:30:53'),(11922,'2005-08-17 16:20:37',3707,15,'2005-08-26 16:53:37',2,'2006-02-15 21:30:53'),(11923,'2005-08-17 16:21:47',1907,72,'2005-08-18 14:26:47',2,'2006-02-15 21:30:53'),(11924,'2005-08-17 16:22:05',1711,202,'2005-08-26 12:34:05',1,'2006-02-15 21:30:53'),(11925,'2005-08-17 16:23:04',1441,370,'2005-08-21 11:38:04',1,'2006-02-15 21:30:53'),(11926,'2005-08-17 16:25:02',2111,516,'2005-08-22 11:36:02',1,'2006-02-15 21:30:53'),(11927,'2005-08-17 16:25:03',3134,178,'2005-08-23 16:41:03',1,'2006-02-15 21:30:53'),(11928,'2005-08-17 16:28:24',79,261,'2005-08-23 17:50:24',2,'2006-02-15 21:30:53'),(11929,'2005-08-17 16:28:51',3765,327,'2005-08-25 19:36:51',1,'2006-02-15 21:30:53'),(11930,'2005-08-17 16:28:53',1299,5,'2005-08-25 10:31:53',1,'2006-02-15 21:30:53'),(11931,'2005-08-17 16:35:14',2022,242,'2005-08-19 19:16:14',1,'2006-02-15 21:30:53'),(11932,'2005-08-17 16:36:12',151,364,'2005-08-18 19:34:12',2,'2006-02-15 21:30:53'),(11933,'2005-08-17 16:38:20',2574,438,'2005-08-22 14:31:20',1,'2006-02-15 21:30:53'),(11934,'2005-08-17 16:40:00',1230,596,'2005-08-20 20:13:00',2,'2006-02-15 21:30:53'),(11935,'2005-08-17 16:42:13',1640,66,'2005-08-22 20:38:13',2,'2006-02-15 21:30:53'),(11936,'2005-08-17 16:45:34',1127,380,'2005-08-21 13:33:34',2,'2006-02-15 21:30:53'),(11937,'2005-08-17 16:48:36',2926,515,'2005-08-24 19:01:36',1,'2006-02-15 21:30:53'),(11938,'2005-08-17 16:54:54',3927,426,'2005-08-24 19:18:54',1,'2006-02-15 21:30:53'),(11939,'2005-08-17 16:55:57',3305,516,'2005-08-24 21:36:57',1,'2006-02-15 21:30:53'),(11940,'2005-08-17 16:56:28',1188,163,'2005-08-18 15:09:28',1,'2006-02-15 21:30:53'),(11941,'2005-08-17 16:56:57',159,566,'2005-08-24 16:29:57',1,'2006-02-15 21:30:53'),(11942,'2006-02-14 15:16:03',4094,576,NULL,2,'2006-02-15 21:30:53'),(11943,'2005-08-17 17:00:42',4466,69,'2005-08-26 22:07:42',1,'2006-02-15 21:30:53'),(11944,'2005-08-17 17:02:42',27,389,'2005-08-21 16:40:42',2,'2006-02-15 21:30:53'),(11945,'2005-08-17 17:05:33',1108,380,'2005-08-20 18:37:33',2,'2006-02-15 21:30:53'),(11946,'2005-08-17 17:05:53',2953,569,'2005-08-19 13:56:53',1,'2006-02-15 21:30:53'),(11947,'2005-08-17 17:08:13',2928,220,'2005-08-23 21:53:13',1,'2006-02-15 21:30:53'),(11948,'2005-08-17 17:11:05',3329,40,'2005-08-25 21:16:05',2,'2006-02-15 21:30:53'),(11949,'2005-08-17 17:12:26',854,198,'2005-08-23 20:48:26',1,'2006-02-15 21:30:53'),(11950,'2005-08-17 17:13:16',4412,190,'2005-08-26 21:25:16',1,'2006-02-15 21:30:53'),(11951,'2005-08-17 17:14:02',1394,155,'2005-08-26 12:04:02',2,'2006-02-15 21:30:53'),(11952,'2005-08-17 17:14:57',2411,288,'2005-08-19 19:15:57',1,'2006-02-15 21:30:53'),(11953,'2005-08-17 17:16:42',2993,399,'2005-08-23 18:28:42',1,'2006-02-15 21:30:53'),(11954,'2005-08-17 17:18:36',220,145,'2005-08-18 19:49:36',1,'2006-02-15 21:30:53'),(11955,'2005-08-17 17:21:35',1221,319,'2005-08-24 22:06:35',1,'2006-02-15 21:30:53'),(11956,'2005-08-17 17:22:05',2533,457,'2005-08-25 22:19:05',2,'2006-02-15 21:30:53'),(11957,'2005-08-17 17:22:29',1924,198,'2005-08-23 21:47:29',2,'2006-02-15 21:30:53'),(11958,'2005-08-17 17:23:20',2061,217,'2005-08-24 14:47:20',2,'2006-02-15 21:30:53'),(11959,'2005-08-17 17:23:35',2694,101,'2005-08-20 20:57:35',1,'2006-02-15 21:30:53'),(11960,'2005-08-17 17:24:30',3924,84,'2005-08-18 14:28:30',1,'2006-02-15 21:30:53'),(11961,'2005-08-17 17:28:01',2015,276,'2005-08-21 20:43:01',1,'2006-02-15 21:30:53'),(11962,'2005-08-17 17:34:38',4384,29,'2005-08-21 12:59:38',2,'2006-02-15 21:30:53'),(11963,'2005-08-17 17:35:47',232,211,'2005-08-23 16:19:47',2,'2006-02-15 21:30:53'),(11964,'2005-08-17 17:37:03',2225,309,'2005-08-25 11:55:03',2,'2006-02-15 21:30:53'),(11965,'2005-08-17 17:39:45',194,490,'2005-08-19 12:05:45',1,'2006-02-15 21:30:53'),(11966,'2005-08-17 17:40:04',3702,283,'2005-08-20 15:45:04',1,'2006-02-15 21:30:53'),(11967,'2005-08-17 17:45:00',1151,521,'2005-08-22 13:03:00',1,'2006-02-15 21:30:53'),(11968,'2005-08-17 17:47:34',698,239,'2005-08-18 19:40:34',1,'2006-02-15 21:30:53'),(11969,'2005-08-17 17:49:37',668,550,'2005-08-19 19:45:37',2,'2006-02-15 21:30:53'),(11970,'2005-08-17 17:53:09',1779,21,'2005-08-24 14:41:09',1,'2006-02-15 21:30:53'),(11971,'2005-08-17 17:53:42',2756,131,'2005-08-18 12:11:42',2,'2006-02-15 21:30:53'),(11972,'2005-08-17 17:55:46',1282,308,'2005-08-22 15:31:46',2,'2006-02-15 21:30:53'),(11973,'2005-08-17 17:55:58',1472,131,'2005-08-21 19:55:58',2,'2006-02-15 21:30:53'),(11974,'2005-08-17 17:56:48',1609,485,'2005-08-21 19:14:48',2,'2006-02-15 21:30:53'),(11975,'2005-08-17 17:58:39',3843,458,'2005-08-20 19:11:39',2,'2006-02-15 21:30:53'),(11976,'2005-08-17 17:59:19',498,373,'2005-08-23 14:51:19',2,'2006-02-15 21:30:53'),(11977,'2005-08-17 18:01:15',1528,536,'2005-08-23 23:03:15',1,'2006-02-15 21:30:53'),(11978,'2005-08-17 18:02:10',4380,499,'2005-08-18 20:40:10',2,'2006-02-15 21:30:53'),(11979,'2005-08-17 18:07:13',568,255,'2005-08-19 23:12:13',1,'2006-02-15 21:30:53'),(11980,'2005-08-17 18:10:18',4165,589,'2005-08-20 13:28:18',1,'2006-02-15 21:30:53'),(11981,'2005-08-17 18:10:40',3228,294,'2005-08-20 16:56:40',1,'2006-02-15 21:30:53'),(11982,'2005-08-17 18:13:07',118,186,'2005-08-18 19:06:07',1,'2006-02-15 21:30:53'),(11983,'2005-08-17 18:13:55',2580,304,'2005-08-23 18:27:55',2,'2006-02-15 21:30:53'),(11984,'2005-08-17 18:16:30',3577,96,'2005-08-24 21:09:30',2,'2006-02-15 21:30:53'),(11985,'2005-08-17 18:19:44',2208,198,'2005-08-18 19:14:44',2,'2006-02-15 21:30:53'),(11986,'2005-08-17 18:21:58',1610,352,'2005-08-18 13:05:58',1,'2006-02-15 21:30:53'),(11987,'2005-08-17 18:21:59',1478,494,'2005-08-25 19:20:59',1,'2006-02-15 21:30:53'),(11988,'2005-08-17 18:23:50',3429,62,'2005-08-18 22:30:50',2,'2006-02-15 21:30:53'),(11989,'2005-08-17 18:23:58',3686,439,'2005-08-20 20:31:58',2,'2006-02-15 21:30:53'),(11990,'2005-08-17 18:26:22',3012,17,'2005-08-19 14:34:22',2,'2006-02-15 21:30:53'),(11991,'2005-08-17 18:27:08',940,361,'2005-08-25 14:07:08',1,'2006-02-15 21:30:53'),(11992,'2005-08-17 18:27:22',4132,136,'2005-08-26 22:38:22',2,'2006-02-15 21:30:53'),(11993,'2005-08-17 18:27:49',295,303,'2005-08-21 00:04:49',1,'2006-02-15 21:30:53'),(11994,'2005-08-17 18:29:35',3428,319,'2005-08-25 23:39:35',1,'2006-02-15 21:30:53'),(11995,'2006-02-14 15:16:03',3953,69,NULL,1,'2006-02-15 21:30:53'),(11996,'2005-08-17 18:34:37',2720,510,'2005-08-20 22:25:37',2,'2006-02-15 21:30:53'),(11997,'2005-08-17 18:34:38',2193,411,'2005-08-26 00:12:38',2,'2006-02-15 21:30:53'),(11998,'2005-08-17 18:46:21',4258,299,'2005-08-18 20:29:21',1,'2006-02-15 21:30:53'),(11999,'2005-08-17 18:47:07',4333,125,'2005-08-20 23:26:07',2,'2006-02-15 21:30:53'),(12000,'2005-08-17 18:49:44',2256,149,'2005-08-24 16:34:44',2,'2006-02-15 21:30:53'),(12001,'2006-02-14 15:16:03',4158,52,NULL,2,'2006-02-15 21:30:53'),(12002,'2005-08-17 18:56:02',1386,75,'2005-08-20 17:36:02',1,'2006-02-15 21:30:53'),(12003,'2005-08-17 18:56:05',3868,70,'2005-08-18 23:52:05',1,'2006-02-15 21:30:53'),(12004,'2005-08-17 18:56:53',2690,499,'2005-08-26 14:56:53',1,'2006-02-15 21:30:53'),(12005,'2005-08-17 18:56:55',2062,403,'2005-08-25 20:23:55',2,'2006-02-15 21:30:53'),(12006,'2005-08-17 19:09:12',4072,272,'2005-08-24 13:50:12',1,'2006-02-15 21:30:53'),(12007,'2005-08-17 19:10:34',3007,268,'2005-08-24 14:09:34',1,'2006-02-15 21:30:53'),(12008,'2005-08-17 19:16:18',865,562,'2005-08-18 14:24:18',2,'2006-02-15 21:30:53'),(12009,'2006-02-14 15:16:03',2134,296,NULL,2,'2006-02-15 21:30:53'),(12010,'2005-08-17 19:17:54',1076,554,'2005-08-26 00:41:54',1,'2006-02-15 21:30:53'),(12011,'2005-08-17 19:19:44',495,313,'2005-08-23 00:56:44',2,'2006-02-15 21:30:53'),(12012,'2005-08-17 19:20:48',2698,69,'2005-08-22 16:50:48',1,'2006-02-15 21:30:53'),(12013,'2005-08-17 19:23:02',3530,586,'2005-08-23 00:31:02',2,'2006-02-15 21:30:53'),(12014,'2005-08-17 19:29:44',1778,554,'2005-08-23 20:40:44',1,'2006-02-15 21:30:53'),(12015,'2005-08-17 19:32:44',593,11,'2005-08-23 13:36:44',2,'2006-02-15 21:30:53'),(12016,'2005-08-17 19:33:24',2109,327,'2005-08-21 19:59:24',2,'2006-02-15 21:30:53'),(12017,'2005-08-17 19:33:49',344,573,'2005-08-22 01:16:49',2,'2006-02-15 21:30:53'),(12018,'2005-08-17 19:44:46',1921,319,'2005-08-26 20:24:46',1,'2006-02-15 21:30:53'),(12019,'2005-08-17 19:48:55',2566,90,'2005-08-21 18:20:55',1,'2006-02-15 21:30:53'),(12020,'2005-08-17 19:50:33',3258,72,'2005-08-25 17:54:33',1,'2006-02-15 21:30:53'),(12021,'2005-08-17 19:52:43',3977,27,'2005-08-23 21:49:43',1,'2006-02-15 21:30:53'),(12022,'2005-08-17 19:52:45',2067,461,'2005-08-18 18:26:45',2,'2006-02-15 21:30:53'),(12023,'2005-08-17 19:54:54',247,22,'2005-08-26 23:03:54',1,'2006-02-15 21:30:53'),(12024,'2005-08-17 19:57:34',2398,484,'2005-08-21 23:00:34',2,'2006-02-15 21:30:53'),(12025,'2005-08-17 19:59:06',4019,209,'2005-08-23 14:39:06',2,'2006-02-15 21:30:53'),(12026,'2005-08-17 20:00:10',1568,468,'2005-08-26 01:54:10',1,'2006-02-15 21:30:53'),(12027,'2005-08-17 20:01:12',45,285,'2005-08-26 21:08:12',2,'2006-02-15 21:30:53'),(12028,'2005-08-17 20:03:47',607,316,'2005-08-23 17:09:47',2,'2006-02-15 21:30:53'),(12029,'2005-08-17 20:07:01',3516,148,'2005-08-19 19:36:01',2,'2006-02-15 21:30:53'),(12030,'2005-08-17 20:10:48',449,434,'2005-08-19 00:32:48',1,'2006-02-15 21:30:53'),(12031,'2005-08-17 20:11:35',2793,10,'2005-08-24 23:48:35',2,'2006-02-15 21:30:53'),(12032,'2005-08-17 20:14:26',1106,141,'2005-08-26 16:01:26',1,'2006-02-15 21:30:53'),(12033,'2005-08-17 20:14:34',2731,321,'2005-08-26 00:22:34',2,'2006-02-15 21:30:53'),(12034,'2005-08-17 20:15:31',834,321,'2005-08-24 15:46:31',2,'2006-02-15 21:30:53'),(12035,'2005-08-17 20:18:06',2335,469,'2005-08-21 16:41:06',2,'2006-02-15 21:30:53'),(12036,'2005-08-17 20:19:06',3620,85,'2005-08-18 19:57:06',2,'2006-02-15 21:30:53'),(12037,'2005-08-17 20:21:35',766,356,'2005-08-22 17:16:35',2,'2006-02-15 21:30:53'),(12038,'2005-08-17 20:28:26',3794,148,'2005-08-20 23:09:26',2,'2006-02-15 21:30:53'),(12039,'2005-08-17 20:29:08',4404,563,'2005-08-23 21:20:08',2,'2006-02-15 21:30:53'),(12040,'2005-08-17 20:29:56',1288,558,'2005-08-26 22:17:56',1,'2006-02-15 21:30:53'),(12041,'2005-08-17 20:34:33',2389,295,'2005-08-19 00:47:33',1,'2006-02-15 21:30:53'),(12042,'2005-08-17 20:36:37',1772,570,'2005-08-21 15:03:37',1,'2006-02-15 21:30:53'),(12043,'2005-08-17 20:38:21',3706,592,'2005-08-22 16:52:21',2,'2006-02-15 21:30:53'),(12044,'2005-08-17 20:39:37',3377,388,'2005-08-19 18:34:37',1,'2006-02-15 21:30:53'),(12045,'2005-08-17 20:40:46',469,556,'2005-08-20 18:18:46',2,'2006-02-15 21:30:53'),(12046,'2005-08-17 20:47:46',3895,435,'2005-08-19 16:09:46',2,'2006-02-15 21:30:53'),(12047,'2005-08-17 20:48:32',3886,251,'2005-08-26 00:07:32',1,'2006-02-15 21:30:53'),(12048,'2005-08-17 20:49:24',3773,466,'2005-08-27 02:01:24',2,'2006-02-15 21:30:53'),(12049,'2005-08-17 20:53:27',2433,178,'2005-08-26 19:45:27',2,'2006-02-15 21:30:53'),(12050,'2005-08-17 20:55:25',2348,405,'2005-08-22 20:31:25',2,'2006-02-15 21:30:53'),(12051,'2005-08-17 20:56:15',4001,579,'2005-08-25 19:08:15',1,'2006-02-15 21:30:53'),(12052,'2005-08-17 20:57:02',99,536,'2005-08-25 19:04:02',1,'2006-02-15 21:30:53'),(12053,'2005-08-17 20:57:27',4448,280,'2005-08-20 19:51:27',1,'2006-02-15 21:30:53'),(12054,'2005-08-17 20:59:56',3780,53,'2005-08-23 19:57:56',1,'2006-02-15 21:30:53'),(12055,'2005-08-17 21:02:19',1481,35,'2005-08-18 15:24:19',1,'2006-02-15 21:30:53'),(12056,'2005-08-17 21:03:48',1091,460,'2005-08-21 22:42:48',2,'2006-02-15 21:30:53'),(12057,'2005-08-17 21:04:35',1878,263,'2005-08-25 00:17:35',1,'2006-02-15 21:30:53'),(12058,'2005-08-17 21:07:41',2438,540,'2005-08-26 16:07:41',1,'2006-02-15 21:30:53'),(12059,'2005-08-17 21:09:23',4111,393,'2005-08-25 23:09:23',1,'2006-02-15 21:30:53'),(12060,'2005-08-17 21:11:57',2373,127,'2005-08-21 01:42:57',1,'2006-02-15 21:30:53'),(12061,'2005-08-17 21:13:35',144,532,'2005-08-22 19:18:35',1,'2006-02-15 21:30:53'),(12062,'2005-08-17 21:24:47',1791,330,'2005-08-20 20:35:47',2,'2006-02-15 21:30:53'),(12063,'2005-08-17 21:24:48',1141,550,'2005-08-23 22:10:48',2,'2006-02-15 21:30:53'),(12064,'2006-02-14 15:16:03',298,284,NULL,1,'2006-02-15 21:30:53'),(12065,'2005-08-17 21:31:46',3644,77,'2005-08-26 02:26:46',2,'2006-02-15 21:30:53'),(12066,'2006-02-14 15:16:03',2474,267,NULL,2,'2006-02-15 21:30:53'),(12067,'2005-08-17 21:36:47',2013,514,'2005-08-22 01:10:47',2,'2006-02-15 21:30:53'),(12068,'2005-08-17 21:37:08',4327,388,'2005-08-26 00:10:08',1,'2006-02-15 21:30:53'),(12069,'2005-08-17 21:39:40',631,389,'2005-08-22 01:12:40',2,'2006-02-15 21:30:53'),(12070,'2005-08-17 21:46:47',1357,158,'2005-08-22 22:59:47',1,'2006-02-15 21:30:53'),(12071,'2005-08-17 21:49:14',1874,507,'2005-08-22 18:20:14',1,'2006-02-15 21:30:53'),(12072,'2005-08-17 21:50:25',209,61,'2005-08-25 22:36:25',2,'2006-02-15 21:30:53'),(12073,'2005-08-17 21:50:39',2939,173,'2005-08-21 02:59:39',1,'2006-02-15 21:30:53'),(12074,'2005-08-17 21:50:57',711,417,'2005-08-20 00:58:57',2,'2006-02-15 21:30:53'),(12075,'2005-08-17 21:54:55',3147,125,'2005-08-23 23:04:55',1,'2006-02-15 21:30:53'),(12076,'2005-08-17 21:58:19',4278,298,'2005-08-20 22:10:19',1,'2006-02-15 21:30:53'),(12077,'2005-08-17 21:59:14',3589,550,'2005-08-22 03:23:14',1,'2006-02-15 21:30:53'),(12078,'2005-08-17 22:00:22',684,137,'2005-08-24 02:54:22',2,'2006-02-15 21:30:53'),(12079,'2005-08-17 22:04:17',646,230,'2005-08-24 20:22:17',2,'2006-02-15 21:30:53'),(12080,'2005-08-17 22:08:04',1491,394,'2005-08-19 22:55:04',2,'2006-02-15 21:30:53'),(12081,'2005-08-17 22:10:46',620,597,'2005-08-22 22:37:46',1,'2006-02-15 21:30:53'),(12082,'2005-08-17 22:13:15',3435,521,'2005-08-24 18:30:15',1,'2006-02-15 21:30:53'),(12083,'2005-08-17 22:13:37',1985,474,'2005-08-19 19:01:37',2,'2006-02-15 21:30:53'),(12084,'2005-08-17 22:16:49',2706,60,'2005-08-24 17:42:49',2,'2006-02-15 21:30:53'),(12085,'2005-08-17 22:17:09',600,31,'2005-08-21 01:45:09',1,'2006-02-15 21:30:53'),(12086,'2005-08-17 22:20:01',3963,140,'2005-08-26 02:14:01',1,'2006-02-15 21:30:53'),(12087,'2005-08-17 22:20:12',324,144,'2005-08-20 02:11:12',2,'2006-02-15 21:30:53'),(12088,'2005-08-17 22:20:16',1754,360,'2005-08-25 23:30:16',2,'2006-02-15 21:30:53'),(12089,'2005-08-17 22:20:29',651,538,'2005-08-24 02:12:29',1,'2006-02-15 21:30:53'),(12090,'2005-08-17 22:21:43',3392,391,'2005-08-20 23:53:43',2,'2006-02-15 21:30:53'),(12091,'2005-08-17 22:22:50',2161,555,'2005-08-27 03:55:50',1,'2006-02-15 21:30:53'),(12092,'2005-08-17 22:28:15',3964,38,'2005-08-18 16:46:15',2,'2006-02-15 21:30:53'),(12093,'2005-08-17 22:28:40',216,141,'2005-08-22 02:05:40',1,'2006-02-15 21:30:53'),(12094,'2005-08-17 22:31:04',1050,130,'2005-08-23 22:45:04',1,'2006-02-15 21:30:53'),(12095,'2005-08-17 22:32:37',1089,46,'2005-08-20 04:00:37',1,'2006-02-15 21:30:53'),(12096,'2005-08-17 22:32:50',44,463,'2005-08-25 03:33:50',1,'2006-02-15 21:30:53'),(12097,'2005-08-17 22:35:24',4135,325,'2005-08-18 20:31:24',2,'2006-02-15 21:30:53'),(12098,'2005-08-17 22:38:31',534,545,'2005-08-20 01:56:31',1,'2006-02-15 21:30:53'),(12099,'2005-08-17 22:38:54',1743,195,'2005-08-18 21:29:54',2,'2006-02-15 21:30:53'),(12100,'2005-08-17 22:41:10',4365,391,'2005-08-24 21:31:10',2,'2006-02-15 21:30:53'),(12101,'2006-02-14 15:16:03',1556,479,NULL,1,'2006-02-15 21:30:53'),(12102,'2005-08-17 22:45:26',4268,392,'2005-08-24 01:47:26',2,'2006-02-15 21:30:53'),(12103,'2005-08-17 22:49:09',4363,153,'2005-08-24 21:53:09',1,'2006-02-15 21:30:53'),(12104,'2005-08-17 22:53:00',4551,16,'2005-08-23 19:49:00',1,'2006-02-15 21:30:53'),(12105,'2005-08-17 22:54:45',2848,390,'2005-08-21 00:33:45',2,'2006-02-15 21:30:53'),(12106,'2005-08-17 22:55:32',3234,465,'2005-08-19 23:55:32',2,'2006-02-15 21:30:53'),(12107,'2005-08-17 22:56:24',1060,141,'2005-08-24 19:36:24',1,'2006-02-15 21:30:53'),(12108,'2005-08-17 22:56:39',1675,207,'2005-08-26 19:37:39',1,'2006-02-15 21:30:53'),(12109,'2005-08-17 22:58:35',1423,509,'2005-08-25 19:44:35',2,'2006-02-15 21:30:53'),(12110,'2005-08-17 22:59:46',2984,511,'2005-08-23 17:51:46',1,'2006-02-15 21:30:53'),(12111,'2005-08-17 22:59:55',2905,317,'2005-08-22 19:33:55',2,'2006-02-15 21:30:53'),(12112,'2005-08-17 23:00:31',4290,576,'2005-08-25 02:05:31',1,'2006-02-15 21:30:53'),(12113,'2005-08-17 23:01:00',2707,393,'2005-08-25 03:57:00',2,'2006-02-15 21:30:53'),(12114,'2005-08-17 23:02:00',1405,65,'2005-08-26 18:02:00',1,'2006-02-15 21:30:53'),(12115,'2005-08-17 23:04:15',1228,457,'2005-08-20 22:25:15',2,'2006-02-15 21:30:53'),(12116,'2006-02-14 15:16:03',3082,560,NULL,2,'2006-02-15 21:30:53'),(12117,'2005-08-17 23:11:12',4140,303,'2005-08-22 23:56:12',1,'2006-02-15 21:30:53'),(12118,'2005-08-17 23:14:25',158,89,'2005-08-26 22:26:25',1,'2006-02-15 21:30:53'),(12119,'2005-08-17 23:16:44',4298,567,'2005-08-20 02:13:44',2,'2006-02-15 21:30:53'),(12120,'2005-08-17 23:16:46',2912,323,'2005-08-19 00:11:46',2,'2006-02-15 21:30:53'),(12121,'2005-08-17 23:20:40',3423,69,'2005-08-22 21:30:40',2,'2006-02-15 21:30:53'),(12122,'2005-08-17 23:20:45',4030,375,'2005-08-25 04:23:45',2,'2006-02-15 21:30:53'),(12123,'2005-08-17 23:22:18',361,497,'2005-08-19 23:36:18',2,'2006-02-15 21:30:53'),(12124,'2005-08-17 23:22:46',2036,22,'2005-08-21 01:40:46',1,'2006-02-15 21:30:53'),(12125,'2005-08-17 23:24:25',136,573,'2005-08-25 03:08:25',2,'2006-02-15 21:30:53'),(12126,'2005-08-17 23:25:21',2304,302,'2005-08-23 21:51:21',1,'2006-02-15 21:30:53'),(12127,'2006-02-14 15:16:03',4218,582,NULL,2,'2006-02-15 21:30:53'),(12128,'2005-08-17 23:31:09',2252,415,'2005-08-24 05:07:09',2,'2006-02-15 21:30:53'),(12129,'2005-08-17 23:31:25',891,146,'2005-08-26 19:10:25',2,'2006-02-15 21:30:53'),(12130,'2006-02-14 15:16:03',1358,516,NULL,2,'2006-02-15 21:30:53'),(12131,'2005-08-17 23:34:16',3380,21,'2005-08-26 01:18:16',1,'2006-02-15 21:30:53'),(12132,'2005-08-17 23:37:03',2600,403,'2005-08-22 04:53:03',2,'2006-02-15 21:30:53'),(12133,'2005-08-17 23:47:16',1958,132,'2005-08-19 03:46:16',2,'2006-02-15 21:30:53'),(12134,'2005-08-17 23:49:43',2682,288,'2005-08-21 21:00:43',1,'2006-02-15 21:30:53'),(12135,'2005-08-17 23:50:24',1019,381,'2005-08-23 18:01:24',2,'2006-02-15 21:30:53'),(12136,'2005-08-17 23:51:30',3944,527,'2005-08-23 01:35:30',1,'2006-02-15 21:30:53'),(12137,'2005-08-17 23:52:26',3632,109,'2005-08-27 00:19:26',1,'2006-02-15 21:30:53'),(12138,'2005-08-17 23:55:54',388,317,'2005-08-26 23:32:54',1,'2006-02-15 21:30:53'),(12139,'2005-08-17 23:57:13',1537,342,'2005-08-24 19:13:13',1,'2006-02-15 21:30:53'),(12140,'2005-08-17 23:57:55',322,408,'2005-08-21 20:09:55',2,'2006-02-15 21:30:53'),(12141,'2006-02-14 15:16:03',731,101,NULL,1,'2006-02-15 21:30:53'),(12142,'2005-08-18 00:04:12',3748,373,'2005-08-24 01:24:12',2,'2006-02-15 21:30:53'),(12143,'2005-08-18 00:06:26',2876,117,'2005-08-24 02:45:26',2,'2006-02-15 21:30:53'),(12144,'2006-02-14 15:16:03',512,587,NULL,1,'2006-02-15 21:30:53'),(12145,'2005-08-18 00:10:04',3482,5,'2005-08-26 00:51:04',1,'2006-02-15 21:30:53'),(12146,'2005-08-18 00:10:04',3833,434,'2005-08-25 19:18:04',2,'2006-02-15 21:30:53'),(12147,'2005-08-18 00:10:20',705,41,'2005-08-23 20:36:20',2,'2006-02-15 21:30:53'),(12148,'2005-08-18 00:13:15',2409,254,'2005-08-20 01:27:15',2,'2006-02-15 21:30:53'),(12149,'2005-08-18 00:13:51',3696,277,'2005-08-26 19:47:51',1,'2006-02-15 21:30:53'),(12150,'2005-08-18 00:13:55',3781,555,'2005-08-20 23:35:55',2,'2006-02-15 21:30:53'),(12151,'2005-08-18 00:14:03',1976,4,'2005-08-18 23:52:03',2,'2006-02-15 21:30:53'),(12152,'2005-08-18 00:21:35',2797,367,'2005-08-22 02:51:35',1,'2006-02-15 21:30:53'),(12153,'2005-08-18 00:22:30',3929,387,'2005-08-23 04:13:30',2,'2006-02-15 21:30:53'),(12154,'2005-08-18 00:23:56',2491,163,'2005-08-21 00:31:56',2,'2006-02-15 21:30:53'),(12155,'2005-08-18 00:24:30',2065,315,'2005-08-18 19:12:30',2,'2006-02-15 21:30:53'),(12156,'2005-08-18 00:27:33',3270,212,'2005-08-26 01:43:33',1,'2006-02-15 21:30:53'),(12157,'2005-08-18 00:33:45',2311,569,'2005-08-22 19:33:45',1,'2006-02-15 21:30:53'),(12158,'2005-08-18 00:34:20',4121,289,'2005-08-22 20:10:20',2,'2006-02-15 21:30:53'),(12159,'2005-08-18 00:36:09',2243,106,'2005-08-27 06:31:09',1,'2006-02-15 21:30:53'),(12160,'2005-08-18 00:37:59',1328,481,'2005-08-19 20:51:59',1,'2006-02-15 21:30:53'),(12161,'2005-08-18 00:41:46',2420,444,'2005-08-26 22:59:46',2,'2006-02-15 21:30:53'),(12162,'2005-08-18 00:44:30',2697,284,'2005-08-25 03:34:30',1,'2006-02-15 21:30:53'),(12163,'2005-08-18 00:46:01',1349,455,'2005-08-22 06:16:01',1,'2006-02-15 21:30:53'),(12164,'2005-08-18 00:46:38',3849,587,'2005-08-19 04:38:38',2,'2006-02-15 21:30:53'),(12165,'2005-08-18 00:53:37',4215,24,'2005-08-27 00:09:37',2,'2006-02-15 21:30:53'),(12166,'2005-08-18 00:57:06',3627,184,'2005-08-26 03:13:06',2,'2006-02-15 21:30:53'),(12167,'2005-08-18 01:00:02',3085,338,'2005-08-21 00:04:02',2,'2006-02-15 21:30:53'),(12168,'2005-08-18 01:03:52',2859,535,'2005-08-18 20:19:52',1,'2006-02-15 21:30:53'),(12169,'2005-08-18 01:05:54',2281,323,'2005-08-24 02:16:54',2,'2006-02-15 21:30:53'),(12170,'2005-08-18 01:06:10',1125,289,'2005-08-25 02:40:10',2,'2006-02-15 21:30:53'),(12171,'2005-08-18 01:06:13',454,457,'2005-08-22 19:39:13',2,'2006-02-15 21:30:53'),(12172,'2005-08-18 01:07:00',1162,226,'2005-08-22 21:01:00',2,'2006-02-15 21:30:53'),(12173,'2005-08-18 01:08:34',2830,41,'2005-08-24 20:52:34',1,'2006-02-15 21:30:53'),(12174,'2005-08-18 01:08:53',1458,101,'2005-08-20 03:28:53',1,'2006-02-15 21:30:53'),(12175,'2005-08-18 01:10:17',4558,328,'2005-08-19 05:25:17',2,'2006-02-15 21:30:53'),(12176,'2005-08-18 01:10:33',3873,255,'2005-08-24 02:45:33',2,'2006-02-15 21:30:53'),(12177,'2005-08-18 01:15:47',522,470,'2005-08-24 23:23:47',2,'2006-02-15 21:30:53'),(12178,'2005-08-18 01:17:32',1152,276,'2005-08-25 19:32:32',1,'2006-02-15 21:30:53'),(12179,'2005-08-18 01:21:21',1499,222,'2005-08-19 00:59:21',1,'2006-02-15 21:30:53'),(12180,'2005-08-18 01:28:15',2276,20,'2005-08-20 20:52:15',2,'2006-02-15 21:30:53'),(12181,'2005-08-18 01:28:18',532,81,'2005-08-23 21:17:18',2,'2006-02-15 21:30:53'),(12182,'2005-08-18 01:30:19',296,555,'2005-08-21 05:52:19',1,'2006-02-15 21:30:53'),(12183,'2005-08-18 01:34:13',3153,344,'2005-08-24 04:38:13',1,'2006-02-15 21:30:53'),(12184,'2005-08-18 01:36:00',1723,51,'2005-08-21 01:59:00',1,'2006-02-15 21:30:53'),(12185,'2005-08-18 01:40:14',1558,588,'2005-08-25 05:04:14',1,'2006-02-15 21:30:53'),(12186,'2005-08-18 01:43:36',1342,312,'2005-08-23 07:13:36',1,'2006-02-15 21:30:53'),(12187,'2005-08-18 01:45:50',3360,38,'2005-08-22 20:12:50',1,'2006-02-15 21:30:53'),(12188,'2005-08-18 01:51:43',2989,456,'2005-08-18 22:23:43',1,'2006-02-15 21:30:53'),(12189,'2005-08-18 01:51:44',1764,363,'2005-08-26 01:01:44',1,'2006-02-15 21:30:53'),(12190,'2005-08-18 01:54:44',2464,28,'2005-08-27 04:32:44',1,'2006-02-15 21:30:53'),(12191,'2005-08-18 01:57:11',2667,316,'2005-08-22 22:53:11',2,'2006-02-15 21:30:53'),(12192,'2005-08-18 02:01:40',3450,270,'2005-08-21 05:45:40',1,'2006-02-15 21:30:53'),(12193,'2005-08-18 02:03:59',1086,290,'2005-08-25 05:32:59',2,'2006-02-15 21:30:53'),(12194,'2005-08-18 02:04:47',292,558,'2005-08-25 20:45:47',2,'2006-02-15 21:30:53'),(12195,'2005-08-18 02:07:49',943,347,'2005-08-19 23:54:49',2,'2006-02-15 21:30:53'),(12196,'2005-08-18 02:08:48',4302,111,'2005-08-26 00:39:48',1,'2006-02-15 21:30:53'),(12197,'2005-08-18 02:08:58',3687,564,'2005-08-26 21:54:58',2,'2006-02-15 21:30:53'),(12198,'2005-08-18 02:09:20',1628,86,'2005-08-21 21:28:20',2,'2006-02-15 21:30:53'),(12199,'2005-08-18 02:09:23',424,96,'2005-08-22 20:33:23',1,'2006-02-15 21:30:53'),(12200,'2005-08-18 02:12:33',840,52,'2005-08-18 20:47:33',2,'2006-02-15 21:30:53'),(12201,'2005-08-18 02:14:06',3676,540,'2005-08-23 04:44:06',1,'2006-02-15 21:30:53'),(12202,'2005-08-18 02:14:08',672,563,'2005-08-24 04:35:08',1,'2006-02-15 21:30:53'),(12203,'2005-08-18 02:18:52',4228,591,'2005-08-22 21:01:52',1,'2006-02-15 21:30:53'),(12204,'2005-08-18 02:20:35',304,575,'2005-08-26 01:27:35',2,'2006-02-15 21:30:53'),(12205,'2005-08-18 02:21:08',774,437,'2005-08-27 00:08:08',2,'2006-02-15 21:30:53'),(12206,'2005-08-18 02:22:20',3275,254,'2005-08-23 05:36:20',1,'2006-02-15 21:30:53'),(12207,'2005-08-18 02:24:07',3745,265,'2005-08-22 07:53:07',1,'2006-02-15 21:30:53'),(12208,'2005-08-18 02:25:25',2039,551,'2005-08-20 04:53:25',2,'2006-02-15 21:30:53'),(12209,'2005-08-18 02:27:20',279,243,'2005-08-21 00:41:20',2,'2006-02-15 21:30:53'),(12210,'2005-08-18 02:27:29',3035,217,'2005-08-20 23:32:29',2,'2006-02-15 21:30:53'),(12211,'2005-08-18 02:31:18',1484,19,'2005-08-26 02:36:18',1,'2006-02-15 21:30:53'),(12212,'2005-08-18 02:33:29',3898,449,'2005-08-25 07:10:29',2,'2006-02-15 21:30:53'),(12213,'2005-08-18 02:33:55',4058,157,'2005-08-24 03:14:55',1,'2006-02-15 21:30:53'),(12214,'2005-08-18 02:34:22',2094,231,'2005-08-21 07:48:22',2,'2006-02-15 21:30:53'),(12215,'2005-08-18 02:35:39',4095,47,'2005-08-24 00:36:39',1,'2006-02-15 21:30:53'),(12216,'2005-08-18 02:37:07',4139,131,'2005-08-19 02:09:07',2,'2006-02-15 21:30:53'),(12217,'2005-08-18 02:44:44',2556,105,'2005-08-24 03:27:44',1,'2006-02-15 21:30:53'),(12218,'2005-08-18 02:48:14',1933,70,'2005-08-21 01:52:14',2,'2006-02-15 21:30:53'),(12219,'2005-08-18 02:49:54',2249,271,'2005-08-23 07:52:54',1,'2006-02-15 21:30:53'),(12220,'2005-08-18 02:50:02',982,530,'2005-08-22 00:20:02',1,'2006-02-15 21:30:53'),(12221,'2005-08-18 02:50:51',2488,98,'2005-08-27 06:22:51',2,'2006-02-15 21:30:53'),(12222,'2006-02-14 15:16:03',3949,22,NULL,1,'2006-02-15 21:30:53'),(12223,'2005-08-18 02:58:40',4142,397,'2005-08-23 23:30:40',2,'2006-02-15 21:30:53'),(12224,'2005-08-18 02:59:09',1781,372,'2005-08-19 06:22:09',1,'2006-02-15 21:30:53'),(12225,'2005-08-18 03:00:11',1876,306,'2005-08-24 05:01:11',1,'2006-02-15 21:30:53'),(12226,'2005-08-18 03:00:48',682,234,'2005-08-25 00:43:48',2,'2006-02-15 21:30:53'),(12227,'2005-08-18 03:04:28',3671,591,'2005-08-21 08:52:28',2,'2006-02-15 21:30:53'),(12228,'2005-08-18 03:08:10',2772,9,'2005-08-20 02:48:10',1,'2006-02-15 21:30:53'),(12229,'2005-08-18 03:08:23',1123,382,'2005-08-22 03:42:23',1,'2006-02-15 21:30:53'),(12230,'2005-08-18 03:11:04',1910,231,'2005-08-27 04:06:04',1,'2006-02-15 21:30:53'),(12231,'2005-08-18 03:11:44',1115,231,'2005-08-24 03:26:44',1,'2006-02-15 21:30:53'),(12232,'2005-08-18 03:14:14',2399,87,'2005-08-19 05:44:14',2,'2006-02-15 21:30:53'),(12233,'2005-08-18 03:16:54',174,535,'2005-08-22 04:48:54',2,'2006-02-15 21:30:53'),(12234,'2005-08-18 03:17:33',3823,352,'2005-08-25 04:44:33',2,'2006-02-15 21:30:53'),(12235,'2005-08-18 03:17:50',957,595,'2005-08-20 02:49:50',1,'2006-02-15 21:30:53'),(12236,'2005-08-18 03:19:29',1190,474,'2005-08-23 07:39:29',2,'2006-02-15 21:30:53'),(12237,'2005-08-18 03:24:38',4422,381,'2005-08-25 09:05:38',1,'2006-02-15 21:30:53'),(12238,'2005-08-18 03:25:08',4043,46,'2005-08-20 02:41:08',2,'2006-02-15 21:30:53'),(12239,'2005-08-18 03:26:42',1948,75,'2005-08-24 23:48:42',1,'2006-02-15 21:30:53'),(12240,'2005-08-18 03:27:11',1168,30,'2005-08-26 04:34:11',2,'2006-02-15 21:30:53'),(12241,'2005-08-18 03:33:17',1261,248,'2005-08-21 03:13:17',2,'2006-02-15 21:30:53'),(12242,'2005-08-18 03:37:31',2095,121,'2005-08-25 06:50:31',1,'2006-02-15 21:30:53'),(12243,'2005-08-18 03:38:54',1829,354,'2005-08-27 06:56:54',2,'2006-02-15 21:30:53'),(12244,'2005-08-18 03:39:11',4441,362,'2005-08-21 02:57:11',2,'2006-02-15 21:30:53'),(12245,'2005-08-18 03:46:40',2960,576,'2005-08-24 22:27:40',2,'2006-02-15 21:30:53'),(12246,'2005-08-18 03:48:41',3199,258,'2005-08-25 05:12:41',1,'2006-02-15 21:30:53'),(12247,'2005-08-18 03:51:51',2264,254,'2005-08-24 05:36:51',2,'2006-02-15 21:30:53'),(12248,'2005-08-18 03:53:18',2120,562,'2005-08-22 04:53:18',1,'2006-02-15 21:30:53'),(12249,'2005-08-18 03:53:34',3586,135,'2005-08-21 01:14:34',1,'2006-02-15 21:30:53'),(12250,'2005-08-18 03:57:29',921,1,'2005-08-22 23:05:29',1,'2006-02-15 21:30:53'),(12251,'2005-08-18 03:59:02',3044,276,'2005-08-19 02:38:02',1,'2006-02-15 21:30:53'),(12252,'2005-08-18 03:59:51',127,350,'2005-08-25 08:54:51',2,'2006-02-15 21:30:53'),(12253,'2005-08-18 04:00:50',566,446,'2005-08-19 04:43:50',1,'2006-02-15 21:30:53'),(12254,'2005-08-18 04:05:29',2858,6,'2005-08-23 04:17:29',1,'2006-02-15 21:30:53'),(12255,'2005-08-18 04:07:20',2100,266,'2005-08-21 22:19:20',1,'2006-02-15 21:30:53'),(12256,'2005-08-18 04:09:39',2975,572,'2005-08-22 01:53:39',2,'2006-02-15 21:30:53'),(12257,'2005-08-18 04:11:03',269,87,'2005-08-25 01:20:03',2,'2006-02-15 21:30:53'),(12258,'2005-08-18 04:11:13',2861,83,'2005-08-21 23:40:13',2,'2006-02-15 21:30:53'),(12259,'2005-08-18 04:14:35',2904,429,'2005-08-18 22:30:35',2,'2006-02-15 21:30:53'),(12260,'2005-08-18 04:15:43',1352,150,'2005-08-26 23:31:43',1,'2006-02-15 21:30:53'),(12261,'2005-08-18 04:16:06',4076,485,'2005-08-27 08:04:06',1,'2006-02-15 21:30:53'),(12262,'2005-08-18 04:16:15',591,125,'2005-08-20 09:16:15',1,'2006-02-15 21:30:53'),(12263,'2005-08-18 04:16:18',4053,131,'2005-08-21 07:22:18',1,'2006-02-15 21:30:53'),(12264,'2005-08-18 04:17:33',3073,87,'2005-08-26 08:07:33',1,'2006-02-15 21:30:53'),(12265,'2005-08-18 04:22:01',537,247,'2005-08-20 03:22:01',1,'2006-02-15 21:30:53'),(12266,'2005-08-18 04:22:31',2192,467,'2005-08-19 04:25:31',2,'2006-02-15 21:30:53'),(12267,'2005-08-18 04:24:30',652,388,'2005-08-26 03:01:30',2,'2006-02-15 21:30:53'),(12268,'2005-08-18 04:26:54',93,39,'2005-08-23 06:40:54',2,'2006-02-15 21:30:53'),(12269,'2005-08-18 04:27:54',724,573,'2005-08-25 07:03:54',1,'2006-02-15 21:30:53'),(12270,'2005-08-18 04:32:05',2456,190,'2005-08-21 01:37:05',2,'2006-02-15 21:30:53'),(12271,'2005-08-18 04:33:11',3866,471,'2005-08-20 23:10:11',1,'2006-02-15 21:30:53'),(12272,'2005-08-18 04:39:10',1964,15,'2005-08-24 09:41:10',1,'2006-02-15 21:30:53'),(12273,'2005-08-18 04:40:50',3539,431,'2005-08-25 01:44:50',2,'2006-02-15 21:30:53'),(12274,'2005-08-18 04:41:47',265,47,'2005-08-27 07:00:47',1,'2006-02-15 21:30:53'),(12275,'2005-08-18 04:42:02',1474,507,'2005-08-25 00:50:02',1,'2006-02-15 21:30:53'),(12276,'2005-08-18 04:43:22',4491,397,'2005-08-22 01:49:22',2,'2006-02-15 21:30:53'),(12277,'2006-02-14 15:16:03',407,33,NULL,2,'2006-02-15 21:30:53'),(12278,'2005-08-18 04:46:45',3205,294,'2005-08-24 08:59:45',2,'2006-02-15 21:30:53'),(12279,'2005-08-18 04:47:30',4159,421,'2005-08-19 09:47:30',2,'2006-02-15 21:30:53'),(12280,'2005-08-18 04:49:27',4032,46,'2005-08-21 03:39:27',2,'2006-02-15 21:30:53'),(12281,'2005-08-18 04:50:32',4576,417,'2005-08-21 00:14:32',2,'2006-02-15 21:30:53'),(12282,'2005-08-18 04:54:20',3623,173,'2005-08-23 05:28:20',2,'2006-02-15 21:30:53'),(12283,'2005-08-18 04:54:25',574,240,'2005-08-23 04:02:25',1,'2006-02-15 21:30:53'),(12284,'2005-08-18 04:55:49',3162,147,'2005-08-22 08:45:49',2,'2006-02-15 21:30:53'),(12285,'2005-08-18 04:56:43',3531,215,'2005-08-19 23:32:43',2,'2006-02-15 21:30:53'),(12286,'2005-08-18 04:57:59',3729,34,'2005-08-18 23:20:59',2,'2006-02-15 21:30:53'),(12287,'2005-08-18 04:58:06',2238,136,'2005-08-24 00:06:06',1,'2006-02-15 21:30:53'),(12288,'2005-08-18 05:01:20',4401,523,'2005-08-25 09:51:20',2,'2006-02-15 21:30:53'),(12289,'2005-08-18 05:05:28',443,575,'2005-08-26 09:02:28',1,'2006-02-15 21:30:53'),(12290,'2005-08-18 05:08:03',4100,283,'2005-08-23 08:10:03',2,'2006-02-15 21:30:53'),(12291,'2005-08-18 05:08:37',4270,73,'2005-08-23 09:01:37',1,'2006-02-15 21:30:53'),(12292,'2005-08-18 05:08:54',1417,58,'2005-08-27 02:51:54',1,'2006-02-15 21:30:53'),(12293,'2005-08-18 05:13:36',614,514,'2005-08-25 04:00:36',2,'2006-02-15 21:30:53'),(12294,'2005-08-18 05:14:44',2479,4,'2005-08-27 01:32:44',2,'2006-02-15 21:30:53'),(12295,'2005-08-18 05:15:46',1651,532,'2005-08-26 02:23:46',2,'2006-02-15 21:30:53'),(12296,'2005-08-18 05:16:28',2091,258,'2005-08-22 10:32:28',1,'2006-02-15 21:30:53'),(12297,'2005-08-18 05:19:57',903,436,'2005-08-21 00:53:57',1,'2006-02-15 21:30:53'),(12298,'2005-08-18 05:30:31',904,46,'2005-08-27 07:33:31',1,'2006-02-15 21:30:53'),(12299,'2005-08-18 05:32:32',892,176,'2005-08-22 08:14:32',2,'2006-02-15 21:30:53'),(12300,'2005-08-18 05:36:14',3213,540,'2005-08-25 00:20:14',2,'2006-02-15 21:30:53'),(12301,'2005-08-18 05:36:20',2293,317,'2005-08-23 03:15:20',1,'2006-02-15 21:30:53'),(12302,'2005-08-18 05:41:39',765,514,'2005-08-22 06:02:39',1,'2006-02-15 21:30:53'),(12303,'2005-08-18 05:43:22',1604,245,'2005-08-27 08:54:22',2,'2006-02-15 21:30:53'),(12304,'2005-08-18 05:44:29',1381,228,'2005-08-24 04:31:29',1,'2006-02-15 21:30:53'),(12305,'2005-08-18 05:46:29',4463,534,'2005-08-22 11:14:29',2,'2006-02-15 21:30:53'),(12306,'2005-08-18 05:47:55',3853,541,'2005-08-21 01:56:55',1,'2006-02-15 21:30:53'),(12307,'2005-08-18 05:48:23',2679,187,'2005-08-26 02:32:23',1,'2006-02-15 21:30:53'),(12308,'2005-08-18 05:48:53',2877,569,'2005-08-22 09:03:53',1,'2006-02-15 21:30:53'),(12309,'2005-08-18 05:58:40',762,9,'2005-08-20 02:20:40',2,'2006-02-15 21:30:53'),(12310,'2005-08-18 06:02:34',3814,385,'2005-08-24 01:08:34',2,'2006-02-15 21:30:53'),(12311,'2005-08-18 06:07:00',1650,211,'2005-08-21 07:54:00',2,'2006-02-15 21:30:53'),(12312,'2005-08-18 06:07:26',80,185,'2005-08-21 02:07:26',2,'2006-02-15 21:30:53'),(12313,'2005-08-18 06:07:31',2053,180,'2005-08-27 00:20:31',1,'2006-02-15 21:30:53'),(12314,'2005-08-18 06:10:02',2204,455,'2005-08-25 02:48:02',1,'2006-02-15 21:30:53'),(12315,'2005-08-18 06:15:06',2012,579,'2005-08-24 07:45:06',2,'2006-02-15 21:30:53'),(12316,'2005-08-18 06:16:09',4325,94,'2005-08-27 05:54:09',2,'2006-02-15 21:30:53'),(12317,'2005-08-18 06:17:06',90,510,'2005-08-22 08:56:06',1,'2006-02-15 21:30:53'),(12318,'2005-08-18 06:21:56',3694,332,'2005-08-27 06:07:56',1,'2006-02-15 21:30:53'),(12319,'2005-08-18 06:26:45',999,368,'2005-08-23 01:35:45',1,'2006-02-15 21:30:53'),(12320,'2005-08-18 06:26:51',3248,267,'2005-08-20 04:00:51',1,'2006-02-15 21:30:53'),(12321,'2005-08-18 06:27:05',516,274,'2005-08-24 02:26:05',1,'2006-02-15 21:30:53'),(12322,'2005-08-18 06:35:28',4235,365,'2005-08-23 07:34:28',1,'2006-02-15 21:30:53'),(12323,'2005-08-18 06:36:22',4107,336,'2005-08-26 11:36:22',1,'2006-02-15 21:30:53'),(12324,'2005-08-18 06:38:20',2436,221,'2005-08-20 02:28:20',2,'2006-02-15 21:30:53'),(12325,'2005-08-18 06:41:30',1844,404,'2005-08-26 02:49:30',1,'2006-02-15 21:30:53'),(12326,'2005-08-18 06:41:59',1865,114,'2005-08-19 10:16:59',2,'2006-02-15 21:30:53'),(12327,'2005-08-18 06:43:22',2425,261,'2005-08-25 10:50:22',2,'2006-02-15 21:30:53'),(12328,'2005-08-18 06:43:56',1355,77,'2005-08-23 10:19:56',2,'2006-02-15 21:30:53'),(12329,'2005-08-18 06:44:30',3127,397,'2005-08-25 04:05:30',1,'2006-02-15 21:30:53'),(12330,'2005-08-18 06:46:33',889,587,'2005-08-26 11:35:33',2,'2006-02-15 21:30:53'),(12331,'2005-08-18 06:47:19',4565,483,'2005-08-25 05:51:19',2,'2006-02-15 21:30:53'),(12332,'2005-08-18 06:51:05',627,235,'2005-08-20 04:28:05',2,'2006-02-15 21:30:53'),(12333,'2005-08-18 06:51:39',4370,18,'2005-08-21 01:44:39',2,'2006-02-15 21:30:53'),(12334,'2005-08-18 06:52:36',2629,160,'2005-08-25 12:06:36',1,'2006-02-15 21:30:53'),(12335,'2005-08-18 06:59:15',2776,150,'2005-08-20 06:47:15',1,'2006-02-15 21:30:53'),(12336,'2005-08-18 06:59:41',2484,75,'2005-08-23 01:36:41',1,'2006-02-15 21:30:53'),(12337,'2005-08-18 07:02:24',4221,117,'2005-08-20 10:11:24',1,'2006-02-15 21:30:53'),(12338,'2005-08-18 07:04:24',274,408,'2005-08-19 08:36:24',2,'2006-02-15 21:30:53'),(12339,'2005-08-18 07:05:06',1600,370,'2005-08-19 02:27:06',2,'2006-02-15 21:30:53'),(12340,'2005-08-18 07:07:01',3561,239,'2005-08-20 05:06:01',1,'2006-02-15 21:30:53'),(12341,'2005-08-18 07:09:27',130,154,'2005-08-21 03:44:27',1,'2006-02-15 21:30:53'),(12342,'2005-08-18 07:12:46',1408,63,'2005-08-21 07:44:46',1,'2006-02-15 21:30:53'),(12343,'2005-08-18 07:15:13',448,507,'2005-08-27 11:07:13',1,'2006-02-15 21:30:53'),(12344,'2005-08-18 07:15:19',3675,269,'2005-08-24 04:58:19',2,'2006-02-15 21:30:53'),(12345,'2005-08-18 07:16:58',2359,44,'2005-08-25 05:50:58',1,'2006-02-15 21:30:53'),(12346,'2005-08-18 07:17:55',1200,265,'2005-08-21 11:35:55',2,'2006-02-15 21:30:53'),(12347,'2005-08-18 07:18:10',1788,454,'2005-08-19 05:49:10',1,'2006-02-15 21:30:53'),(12348,'2005-08-18 07:21:47',434,186,'2005-08-25 04:41:47',2,'2006-02-15 21:30:53'),(12349,'2005-08-18 07:23:42',4191,545,'2005-08-19 04:25:42',1,'2006-02-15 21:30:53'),(12350,'2005-08-18 07:29:46',1333,172,'2005-08-21 12:50:46',1,'2006-02-15 21:30:53'),(12351,'2005-08-18 07:32:12',2299,95,'2005-08-24 04:29:12',2,'2006-02-15 21:30:53'),(12352,'2006-02-14 15:16:03',643,155,NULL,1,'2006-02-15 21:30:53'),(12353,'2005-08-18 07:33:08',1594,141,'2005-08-21 03:42:08',2,'2006-02-15 21:30:53'),(12354,'2005-08-18 07:34:07',2913,499,'2005-08-26 05:56:07',1,'2006-02-15 21:30:53'),(12355,'2005-08-18 07:36:23',4112,452,'2005-08-20 08:59:23',1,'2006-02-15 21:30:53'),(12356,'2005-08-18 07:37:05',493,529,'2005-08-24 10:49:05',1,'2006-02-15 21:30:53'),(12357,'2005-08-18 07:40:52',166,19,'2005-08-22 02:51:52',1,'2006-02-15 21:30:53'),(12358,'2005-08-18 07:41:43',504,16,'2005-08-20 03:46:43',1,'2006-02-15 21:30:53'),(12359,'2005-08-18 07:44:05',4172,28,'2005-08-19 02:26:05',1,'2006-02-15 21:30:53'),(12360,'2005-08-18 07:46:35',929,123,'2005-08-26 12:01:35',1,'2006-02-15 21:30:53'),(12361,'2005-08-18 07:47:31',1418,250,'2005-08-22 12:08:31',2,'2006-02-15 21:30:53'),(12362,'2005-08-18 07:48:05',3131,367,'2005-08-20 05:16:05',2,'2006-02-15 21:30:53'),(12363,'2005-08-18 07:52:49',3447,181,'2005-08-26 03:20:49',2,'2006-02-15 21:30:53'),(12364,'2005-08-18 07:55:09',3398,84,'2005-08-19 05:29:09',2,'2006-02-15 21:30:53'),(12365,'2005-08-18 07:55:09',4350,303,'2005-08-24 05:42:09',1,'2006-02-15 21:30:53'),(12366,'2005-08-18 07:55:14',3799,115,'2005-08-22 06:12:14',1,'2006-02-15 21:30:53'),(12367,'2005-08-18 07:57:14',1822,7,'2005-08-27 07:07:14',2,'2006-02-15 21:30:53'),(12368,'2005-08-18 07:57:38',3777,392,'2005-08-25 05:49:38',2,'2006-02-15 21:30:53'),(12369,'2005-08-18 07:57:43',484,337,'2005-08-26 09:36:43',1,'2006-02-15 21:30:53'),(12370,'2005-08-18 07:57:47',3343,503,'2005-08-22 11:32:47',1,'2006-02-15 21:30:53'),(12371,'2005-08-18 08:02:46',622,451,'2005-08-19 02:50:46',2,'2006-02-15 21:30:53'),(12372,'2005-08-18 08:04:35',2982,131,'2005-08-27 08:13:35',2,'2006-02-15 21:30:53'),(12373,'2005-08-18 08:07:25',777,367,'2005-08-27 03:41:25',1,'2006-02-15 21:30:53'),(12374,'2005-08-18 08:07:45',939,74,'2005-08-26 10:42:45',2,'2006-02-15 21:30:53'),(12375,'2005-08-18 08:20:08',3508,365,'2005-08-21 08:50:08',2,'2006-02-15 21:30:53'),(12376,'2005-08-18 08:20:29',852,116,'2005-08-20 13:20:29',1,'2006-02-15 21:30:53'),(12377,'2005-08-18 08:26:05',4564,31,'2005-08-23 02:51:05',2,'2006-02-15 21:30:53'),(12378,'2005-08-18 08:26:13',4418,266,'2005-08-19 07:21:13',1,'2006-02-15 21:30:53'),(12379,'2005-08-18 08:26:48',2879,99,'2005-08-19 10:08:48',2,'2006-02-15 21:30:53'),(12380,'2005-08-18 08:27:28',55,215,'2005-08-25 02:58:28',2,'2006-02-15 21:30:53'),(12381,'2005-08-18 08:31:43',3651,190,'2005-08-23 12:24:43',2,'2006-02-15 21:30:53'); +INSERT INTO rental VALUES (12382,'2005-08-18 08:32:33',3049,566,'2005-08-26 03:45:33',2,'2006-02-15 21:30:53'),(12383,'2005-08-18 08:36:03',1641,295,'2005-08-23 03:30:03',2,'2006-02-15 21:30:53'),(12384,'2005-08-18 08:36:58',2557,193,'2005-08-23 05:08:58',1,'2006-02-15 21:30:53'),(12385,'2005-08-18 08:39:33',3143,146,'2005-08-21 14:22:33',1,'2006-02-15 21:30:53'),(12386,'2005-08-18 08:45:57',3303,199,'2005-08-24 04:50:57',2,'2006-02-15 21:30:53'),(12387,'2005-08-18 08:46:24',3604,530,'2005-08-21 02:56:24',2,'2006-02-15 21:30:53'),(12388,'2005-08-18 08:48:09',4016,555,'2005-08-26 09:05:09',2,'2006-02-15 21:30:53'),(12389,'2005-08-18 08:48:36',1891,394,'2005-08-22 08:59:36',2,'2006-02-15 21:30:53'),(12390,'2005-08-18 08:51:42',3603,377,'2005-08-23 13:06:42',1,'2006-02-15 21:30:53'),(12391,'2005-08-18 08:52:53',1507,307,'2005-08-22 12:15:53',2,'2006-02-15 21:30:53'),(12392,'2005-08-18 08:57:58',2695,113,'2005-08-25 05:20:58',2,'2006-02-15 21:30:53'),(12393,'2005-08-18 09:02:41',2435,396,'2005-08-26 12:47:41',1,'2006-02-15 21:30:53'),(12394,'2005-08-18 09:05:15',3605,330,'2005-08-23 11:10:15',1,'2006-02-15 21:30:53'),(12395,'2005-08-18 09:06:30',2020,541,'2005-08-21 12:09:30',2,'2006-02-15 21:30:53'),(12396,'2005-08-18 09:11:23',3624,40,'2005-08-26 05:35:23',2,'2006-02-15 21:30:53'),(12397,'2005-08-18 09:12:52',1872,371,'2005-08-27 10:44:52',2,'2006-02-15 21:30:53'),(12398,'2005-08-18 09:13:24',4247,321,'2005-08-27 14:58:24',1,'2006-02-15 21:30:53'),(12399,'2005-08-18 09:13:42',3950,347,'2005-08-27 11:44:42',1,'2006-02-15 21:30:53'),(12400,'2005-08-18 09:19:12',1767,10,'2005-08-26 06:52:12',1,'2006-02-15 21:30:53'),(12401,'2005-08-18 09:20:51',4314,479,'2005-08-21 05:50:51',2,'2006-02-15 21:30:53'),(12402,'2005-08-18 09:27:34',385,123,'2005-08-25 13:10:34',2,'2006-02-15 21:30:53'),(12403,'2005-08-18 09:31:05',2124,440,'2005-08-23 09:54:05',2,'2006-02-15 21:30:53'),(12404,'2005-08-18 09:36:34',1097,342,'2005-08-23 10:12:34',2,'2006-02-15 21:30:53'),(12405,'2005-08-18 09:37:30',228,266,'2005-08-27 13:11:30',2,'2006-02-15 21:30:53'),(12406,'2005-08-18 09:38:02',4368,510,'2005-08-22 12:56:02',1,'2006-02-15 21:30:53'),(12407,'2005-08-18 09:39:26',391,220,'2005-08-24 05:19:26',2,'2006-02-15 21:30:53'),(12408,'2005-08-18 09:40:38',2360,143,'2005-08-19 04:45:38',1,'2006-02-15 21:30:53'),(12409,'2005-08-18 09:43:58',2568,64,'2005-08-19 15:02:58',2,'2006-02-15 21:30:53'),(12410,'2005-08-18 09:45:33',1904,210,'2005-08-27 08:50:33',1,'2006-02-15 21:30:53'),(12411,'2005-08-18 09:47:57',1234,181,'2005-08-21 05:54:57',2,'2006-02-15 21:30:53'),(12412,'2005-08-18 09:49:52',1578,75,'2005-08-23 12:32:52',2,'2006-02-15 21:30:53'),(12413,'2005-08-18 09:50:34',3466,366,'2005-08-23 05:57:34',2,'2006-02-15 21:30:53'),(12414,'2005-08-18 09:50:40',4454,32,'2005-08-26 06:45:40',2,'2006-02-15 21:30:53'),(12415,'2005-08-18 09:54:01',392,443,'2005-08-24 15:41:01',1,'2006-02-15 21:30:53'),(12416,'2005-08-18 09:56:48',3784,515,'2005-08-22 12:34:48',1,'2006-02-15 21:30:53'),(12417,'2005-08-18 09:57:00',3500,71,'2005-08-19 08:56:00',1,'2006-02-15 21:30:53'),(12418,'2005-08-18 09:59:36',4186,241,'2005-08-19 11:35:36',2,'2006-02-15 21:30:53'),(12419,'2005-08-18 10:01:48',3111,133,'2005-08-19 13:40:48',1,'2006-02-15 21:30:53'),(12420,'2005-08-18 10:01:50',452,477,'2005-08-22 08:14:50',1,'2006-02-15 21:30:53'),(12421,'2005-08-18 10:04:06',4067,158,'2005-08-24 08:45:06',2,'2006-02-15 21:30:53'),(12422,'2005-08-18 10:13:12',1855,451,'2005-08-20 14:36:12',2,'2006-02-15 21:30:53'),(12423,'2005-08-18 10:14:52',1014,470,'2005-08-26 13:16:52',2,'2006-02-15 21:30:53'),(12424,'2005-08-18 10:16:57',2055,319,'2005-08-27 04:41:57',1,'2006-02-15 21:30:53'),(12425,'2005-08-18 10:18:06',2000,405,'2005-08-27 08:16:06',2,'2006-02-15 21:30:53'),(12426,'2005-08-18 10:24:11',799,75,'2005-08-22 15:34:11',2,'2006-02-15 21:30:53'),(12427,'2005-08-18 10:24:17',1759,333,'2005-08-27 14:22:17',1,'2006-02-15 21:30:53'),(12428,'2005-08-18 10:24:21',3735,121,'2005-08-24 05:12:21',1,'2006-02-15 21:30:53'),(12429,'2005-08-18 10:26:46',2994,436,'2005-08-27 13:23:46',1,'2006-02-15 21:30:53'),(12430,'2005-08-18 10:32:41',2840,196,'2005-08-22 16:16:41',1,'2006-02-15 21:30:53'),(12431,'2005-08-18 10:34:59',4461,89,'2005-08-22 14:42:59',1,'2006-02-15 21:30:53'),(12432,'2005-08-18 10:35:13',2543,263,'2005-08-26 08:20:13',2,'2006-02-15 21:30:53'),(12433,'2005-08-18 10:37:49',1776,552,'2005-08-19 08:00:49',1,'2006-02-15 21:30:53'),(12434,'2005-08-18 10:38:08',3078,314,'2005-08-22 16:14:08',2,'2006-02-15 21:30:53'),(12435,'2005-08-18 10:38:31',3211,160,'2005-08-26 15:18:31',1,'2006-02-15 21:30:53'),(12436,'2005-08-18 10:41:05',3761,499,'2005-08-23 07:36:05',2,'2006-02-15 21:30:53'),(12437,'2005-08-18 10:42:43',4036,467,'2005-08-26 11:58:43',2,'2006-02-15 21:30:53'),(12438,'2005-08-18 10:42:52',2043,186,'2005-08-25 11:42:52',1,'2006-02-15 21:30:53'),(12439,'2005-08-18 10:44:57',3204,153,'2005-08-22 06:51:57',1,'2006-02-15 21:30:53'),(12440,'2005-08-18 10:47:35',2779,474,'2005-08-21 11:10:35',2,'2006-02-15 21:30:53'),(12441,'2005-08-18 10:47:57',2163,561,'2005-08-26 07:11:57',2,'2006-02-15 21:30:53'),(12442,'2005-08-18 10:50:07',78,270,'2005-08-21 08:06:07',1,'2006-02-15 21:30:53'),(12443,'2005-08-18 10:50:59',2048,233,'2005-08-26 07:48:59',2,'2006-02-15 21:30:53'),(12444,'2005-08-18 10:53:12',1639,285,'2005-08-19 13:54:12',2,'2006-02-15 21:30:53'),(12445,'2005-08-18 10:56:20',3347,350,'2005-08-21 16:46:20',1,'2006-02-15 21:30:53'),(12446,'2005-08-18 10:56:29',2138,448,'2005-08-23 05:30:29',1,'2006-02-15 21:30:53'),(12447,'2005-08-18 10:57:01',4084,469,'2005-08-27 06:05:01',1,'2006-02-15 21:30:53'),(12448,'2005-08-18 10:59:04',3889,72,'2005-08-21 06:45:04',2,'2006-02-15 21:30:53'),(12449,'2005-08-18 11:03:04',663,285,'2005-08-19 07:34:04',1,'2006-02-15 21:30:53'),(12450,'2005-08-18 11:04:04',3439,518,'2005-08-22 07:24:04',1,'2006-02-15 21:30:53'),(12451,'2005-08-18 11:04:42',2780,183,'2005-08-20 08:20:42',1,'2006-02-15 21:30:53'),(12452,'2005-08-18 11:14:35',4260,358,'2005-08-27 09:09:35',1,'2006-02-15 21:30:53'),(12453,'2005-08-18 11:17:07',2487,104,'2005-08-25 12:34:07',1,'2006-02-15 21:30:53'),(12454,'2005-08-18 11:19:02',4219,184,'2005-08-19 12:00:02',2,'2006-02-15 21:30:53'),(12455,'2005-08-18 11:19:47',4478,46,'2005-08-22 16:08:47',2,'2006-02-15 21:30:53'),(12456,'2005-08-18 11:21:51',4578,85,'2005-08-21 13:28:51',1,'2006-02-15 21:30:53'),(12457,'2006-02-14 15:16:03',2145,80,NULL,2,'2006-02-15 21:30:53'),(12458,'2005-08-18 11:22:53',4579,277,'2005-08-22 14:30:53',2,'2006-02-15 21:30:53'),(12459,'2005-08-18 11:25:11',421,39,'2005-08-22 06:13:11',1,'2006-02-15 21:30:53'),(12460,'2005-08-18 11:25:13',3550,419,'2005-08-27 06:27:13',2,'2006-02-15 21:30:53'),(12461,'2005-08-18 11:28:14',1569,27,'2005-08-21 09:47:14',1,'2006-02-15 21:30:53'),(12462,'2005-08-18 11:28:55',890,574,'2005-08-20 12:06:55',2,'2006-02-15 21:30:53'),(12463,'2005-08-18 11:31:34',30,214,'2005-08-23 12:04:34',1,'2006-02-15 21:30:53'),(12464,'2005-08-18 11:33:34',1954,157,'2005-08-27 14:33:34',1,'2006-02-15 21:30:53'),(12465,'2005-08-18 11:35:02',1733,486,'2005-08-21 11:52:02',2,'2006-02-15 21:30:53'),(12466,'2005-08-18 11:36:55',2686,462,'2005-08-23 13:46:55',1,'2006-02-15 21:30:53'),(12467,'2005-08-18 11:40:09',1414,212,'2005-08-19 13:33:09',2,'2006-02-15 21:30:53'),(12468,'2005-08-18 11:41:47',1689,80,'2005-08-24 16:43:47',2,'2006-02-15 21:30:53'),(12469,'2005-08-18 11:53:07',2395,237,'2005-08-24 16:00:07',1,'2006-02-15 21:30:53'),(12470,'2005-08-18 11:55:42',1290,82,'2005-08-24 08:27:42',2,'2006-02-15 21:30:53'),(12471,'2005-08-18 11:57:00',242,101,'2005-08-26 13:17:00',2,'2006-02-15 21:30:53'),(12472,'2005-08-18 11:58:48',4458,297,'2005-08-27 16:37:48',2,'2006-02-15 21:30:53'),(12473,'2005-08-18 11:59:44',1237,303,'2005-08-21 13:38:44',1,'2006-02-15 21:30:53'),(12474,'2005-08-18 12:10:03',2240,78,'2005-08-27 17:05:03',1,'2006-02-15 21:30:53'),(12475,'2005-08-18 12:14:21',3118,401,'2005-08-24 14:43:21',2,'2006-02-15 21:30:53'),(12476,'2005-08-18 12:22:40',2784,122,'2005-08-20 17:29:40',2,'2006-02-15 21:30:53'),(12477,'2005-08-18 12:25:01',4516,74,'2005-08-25 17:25:01',2,'2006-02-15 21:30:53'),(12478,'2005-08-18 12:25:16',4512,42,'2005-08-22 06:27:16',2,'2006-02-15 21:30:53'),(12479,'2005-08-18 12:26:37',1119,401,'2005-08-21 18:08:37',2,'2006-02-15 21:30:53'),(12480,'2005-08-18 12:26:43',3339,446,'2005-08-26 13:23:43',1,'2006-02-15 21:30:53'),(12481,'2005-08-18 12:31:34',2424,218,'2005-08-21 16:08:34',2,'2006-02-15 21:30:53'),(12482,'2005-08-18 12:37:36',3778,247,'2005-08-26 09:53:36',1,'2006-02-15 21:30:53'),(12483,'2005-08-18 12:38:37',1805,488,'2005-08-24 13:26:37',1,'2006-02-15 21:30:53'),(12484,'2005-08-18 12:39:37',3690,300,'2005-08-24 08:47:37',2,'2006-02-15 21:30:53'),(12485,'2005-08-18 12:41:41',422,345,'2005-08-22 16:38:41',2,'2006-02-15 21:30:53'),(12486,'2005-08-18 12:42:50',2991,515,'2005-08-27 13:41:50',2,'2006-02-15 21:30:53'),(12487,'2005-08-18 12:45:24',2554,485,'2005-08-22 12:39:24',1,'2006-02-15 21:30:53'),(12488,'2005-08-18 12:48:22',3323,29,'2005-08-19 16:19:22',1,'2006-02-15 21:30:53'),(12489,'2006-02-14 15:16:03',387,60,NULL,2,'2006-02-15 21:30:53'),(12490,'2005-08-18 12:48:45',1577,187,'2005-08-27 15:53:45',1,'2006-02-15 21:30:53'),(12491,'2005-08-18 12:48:45',2354,247,'2005-08-22 12:40:45',2,'2006-02-15 21:30:53'),(12492,'2005-08-18 12:49:04',2839,224,'2005-08-26 17:55:04',1,'2006-02-15 21:30:53'),(12493,'2005-08-18 12:53:38',3029,487,'2005-08-27 13:15:38',2,'2006-02-15 21:30:53'),(12494,'2005-08-18 12:53:49',3845,522,'2005-08-26 15:52:49',1,'2006-02-15 21:30:53'),(12495,'2005-08-18 12:56:37',1225,102,'2005-08-22 06:58:37',1,'2006-02-15 21:30:53'),(12496,'2005-08-18 12:58:25',456,489,'2005-08-27 18:43:25',2,'2006-02-15 21:30:53'),(12497,'2005-08-18 12:58:40',824,388,'2005-08-24 08:24:40',1,'2006-02-15 21:30:53'),(12498,'2005-08-18 13:01:08',1063,408,'2005-08-21 13:12:08',1,'2006-02-15 21:30:53'),(12499,'2005-08-18 13:05:37',2611,42,'2005-08-19 07:41:37',1,'2006-02-15 21:30:53'),(12500,'2005-08-18 13:05:51',36,310,'2005-08-19 14:54:51',2,'2006-02-15 21:30:53'),(12501,'2005-08-18 13:13:13',728,173,'2005-08-23 07:24:13',2,'2006-02-15 21:30:53'),(12502,'2005-08-18 13:16:31',2153,235,'2005-08-19 17:47:31',1,'2006-02-15 21:30:53'),(12503,'2005-08-18 13:16:46',3548,379,'2005-08-19 10:24:46',2,'2006-02-15 21:30:53'),(12504,'2005-08-18 13:17:07',4429,44,'2005-08-24 09:13:07',2,'2006-02-15 21:30:53'),(12505,'2005-08-18 13:17:30',3741,406,'2005-08-23 18:03:30',1,'2006-02-15 21:30:53'),(12506,'2006-02-14 15:16:03',1132,114,NULL,2,'2006-02-15 21:30:53'),(12507,'2005-08-18 13:19:13',199,584,'2005-08-27 11:48:13',2,'2006-02-15 21:30:53'),(12508,'2005-08-18 13:20:13',1059,29,'2005-08-22 12:55:13',1,'2006-02-15 21:30:53'),(12509,'2005-08-18 13:21:52',2462,175,'2005-08-20 12:14:52',2,'2006-02-15 21:30:53'),(12510,'2005-08-18 13:22:25',3051,394,'2005-08-27 17:38:25',2,'2006-02-15 21:30:53'),(12511,'2005-08-18 13:23:19',919,447,'2005-08-22 11:43:19',2,'2006-02-15 21:30:53'),(12512,'2005-08-18 13:28:27',3959,148,'2005-08-26 19:08:27',2,'2006-02-15 21:30:53'),(12513,'2005-08-18 13:31:45',29,527,'2005-08-25 08:26:45',1,'2006-02-15 21:30:53'),(12514,'2005-08-18 13:33:55',3310,400,'2005-08-23 12:50:55',2,'2006-02-15 21:30:53'),(12515,'2005-08-18 13:39:26',2703,63,'2005-08-22 09:05:26',1,'2006-02-15 21:30:53'),(12516,'2005-08-18 13:39:53',1332,302,'2005-08-20 08:33:53',1,'2006-02-15 21:30:53'),(12517,'2005-08-18 13:40:20',2908,520,'2005-08-27 14:04:20',1,'2006-02-15 21:30:53'),(12518,'2005-08-18 13:41:32',3860,264,'2005-08-23 13:01:32',1,'2006-02-15 21:30:53'),(12519,'2005-08-18 13:42:14',2394,203,'2005-08-24 16:44:14',1,'2006-02-15 21:30:53'),(12520,'2005-08-18 13:42:45',681,52,'2005-08-23 12:54:45',2,'2006-02-15 21:30:53'),(12521,'2005-08-18 13:43:07',1022,369,'2005-08-21 07:53:07',1,'2006-02-15 21:30:53'),(12522,'2005-08-18 13:45:40',4435,342,'2005-08-27 17:05:40',1,'2006-02-15 21:30:53'),(12523,'2005-08-18 13:45:41',888,230,'2005-08-27 10:46:41',1,'2006-02-15 21:30:53'),(12524,'2006-02-14 15:16:03',857,438,NULL,1,'2006-02-15 21:30:53'),(12525,'2005-08-18 13:48:31',2357,96,'2005-08-23 13:04:31',2,'2006-02-15 21:30:53'),(12526,'2005-08-18 13:48:43',3541,54,'2005-08-19 10:05:43',1,'2006-02-15 21:30:53'),(12527,'2005-08-18 13:48:46',2536,459,'2005-08-26 13:31:46',2,'2006-02-15 21:30:53'),(12528,'2005-08-18 13:52:41',3381,398,'2005-08-27 09:09:41',2,'2006-02-15 21:30:53'),(12529,'2005-08-18 13:53:36',1956,382,'2005-08-19 18:20:36',2,'2006-02-15 21:30:53'),(12530,'2005-08-18 13:54:48',1054,521,'2005-08-26 08:58:48',2,'2006-02-15 21:30:53'),(12531,'2005-08-18 13:57:50',2771,27,'2005-08-22 09:46:50',2,'2006-02-15 21:30:53'),(12532,'2005-08-18 13:57:58',114,184,'2005-08-24 14:58:58',2,'2006-02-15 21:30:53'),(12533,'2005-08-18 14:01:40',795,331,'2005-08-20 15:32:40',1,'2006-02-15 21:30:53'),(12534,'2005-08-18 14:04:41',995,187,'2005-08-25 16:57:41',1,'2006-02-15 21:30:53'),(12535,'2005-08-18 14:05:22',2944,516,'2005-08-25 16:35:22',1,'2006-02-15 21:30:53'),(12536,'2005-08-18 14:06:06',2343,373,'2005-08-25 14:21:06',1,'2006-02-15 21:30:53'),(12537,'2005-08-18 14:06:39',57,56,'2005-08-25 09:36:39',2,'2006-02-15 21:30:53'),(12538,'2005-08-18 14:09:09',1373,118,'2005-08-23 19:12:09',1,'2006-02-15 21:30:53'),(12539,'2005-08-18 14:10:09',3259,136,'2005-08-19 19:44:09',2,'2006-02-15 21:30:53'),(12540,'2005-08-18 14:17:30',2826,304,'2005-08-26 15:33:30',2,'2006-02-15 21:30:53'),(12541,'2005-08-18 14:18:30',4357,584,'2005-08-26 10:24:30',1,'2006-02-15 21:30:53'),(12542,'2005-08-18 14:21:11',1920,230,'2005-08-20 16:06:11',2,'2006-02-15 21:30:53'),(12543,'2005-08-18 14:23:55',330,324,'2005-08-20 12:42:55',1,'2006-02-15 21:30:53'),(12544,'2005-08-18 14:25:51',3783,354,'2005-08-26 18:42:51',1,'2006-02-15 21:30:53'),(12545,'2005-08-18 14:28:00',1988,168,'2005-08-26 14:10:00',1,'2006-02-15 21:30:53'),(12546,'2005-08-18 14:29:37',610,30,'2005-08-26 09:47:37',1,'2006-02-15 21:30:53'),(12547,'2005-08-18 14:29:39',3046,591,'2005-08-22 16:52:39',2,'2006-02-15 21:30:53'),(12548,'2005-08-18 14:35:26',750,426,'2005-08-27 18:58:26',1,'2006-02-15 21:30:53'),(12549,'2005-08-18 14:38:07',1010,377,'2005-08-21 08:45:07',1,'2006-02-15 21:30:53'),(12550,'2005-08-18 14:40:38',4267,138,'2005-08-19 13:33:38',2,'2006-02-15 21:30:53'),(12551,'2005-08-18 14:46:26',2195,15,'2005-08-19 16:59:26',2,'2006-02-15 21:30:53'),(12552,'2005-08-18 14:46:34',4303,413,'2005-08-20 11:02:34',2,'2006-02-15 21:30:53'),(12553,'2005-08-18 14:46:54',2893,454,'2005-08-22 13:41:54',1,'2006-02-15 21:30:53'),(12554,'2005-08-18 14:47:28',715,404,'2005-08-25 14:34:28',2,'2006-02-15 21:30:53'),(12555,'2005-08-18 14:49:22',4434,557,'2005-08-26 14:11:22',2,'2006-02-15 21:30:53'),(12556,'2005-08-18 14:49:55',1984,3,'2005-08-24 15:20:55',2,'2006-02-15 21:30:53'),(12557,'2005-08-18 14:51:03',313,364,'2005-08-19 13:30:03',2,'2006-02-15 21:30:53'),(12558,'2005-08-18 14:52:35',167,289,'2005-08-26 09:45:35',2,'2006-02-15 21:30:53'),(12559,'2005-08-18 14:53:58',39,513,'2005-08-25 20:22:58',1,'2006-02-15 21:30:53'),(12560,'2005-08-18 14:54:19',829,596,'2005-08-27 13:39:19',1,'2006-02-15 21:30:53'),(12561,'2005-08-18 14:58:51',812,392,'2005-08-20 10:53:51',1,'2006-02-15 21:30:53'),(12562,'2005-08-18 15:00:03',529,212,'2005-08-23 12:55:03',2,'2006-02-15 21:30:53'),(12563,'2005-08-18 15:08:29',2552,393,'2005-08-27 15:15:29',1,'2006-02-15 21:30:53'),(12564,'2005-08-18 15:11:35',263,348,'2005-08-22 11:45:35',2,'2006-02-15 21:30:53'),(12565,'2005-08-18 15:12:17',1284,211,'2005-08-19 12:26:17',2,'2006-02-15 21:30:53'),(12566,'2005-08-18 15:13:04',1684,407,'2005-08-21 19:29:04',2,'2006-02-15 21:30:53'),(12567,'2005-08-18 15:14:36',2931,308,'2005-08-26 18:56:36',1,'2006-02-15 21:30:53'),(12568,'2005-08-18 15:15:44',2654,569,'2005-08-22 19:32:44',2,'2006-02-15 21:30:53'),(12569,'2005-08-18 15:20:46',1009,29,'2005-08-24 12:38:46',2,'2006-02-15 21:30:53'),(12570,'2005-08-18 15:23:31',3973,211,'2005-08-22 09:59:31',2,'2006-02-15 21:30:53'),(12571,'2005-08-18 15:31:18',1013,591,'2005-08-23 15:20:18',2,'2006-02-15 21:30:53'),(12572,'2005-08-18 15:32:54',1366,253,'2005-08-21 10:30:54',1,'2006-02-15 21:30:53'),(12573,'2005-08-18 15:32:57',1416,182,'2005-08-21 18:29:57',2,'2006-02-15 21:30:53'),(12574,'2006-02-14 15:16:03',177,317,NULL,2,'2006-02-15 21:30:53'),(12575,'2005-08-18 15:37:42',3441,117,'2005-08-25 19:17:42',1,'2006-02-15 21:30:53'),(12576,'2005-08-18 15:38:31',329,119,'2005-08-22 21:29:31',2,'2006-02-15 21:30:53'),(12577,'2005-08-18 15:39:46',4134,16,'2005-08-25 18:05:46',2,'2006-02-15 21:30:53'),(12578,'2005-08-18 15:47:11',930,514,'2005-08-21 10:55:11',1,'2006-02-15 21:30:53'),(12579,'2005-08-18 15:47:49',3021,547,'2005-08-20 18:12:49',2,'2006-02-15 21:30:53'),(12580,'2005-08-18 15:49:08',1197,53,'2005-08-24 11:03:08',2,'2006-02-15 21:30:53'),(12581,'2005-08-18 15:49:15',4309,70,'2005-08-23 20:18:15',1,'2006-02-15 21:30:53'),(12582,'2005-08-18 15:51:12',4467,462,'2005-08-20 12:05:12',1,'2006-02-15 21:30:53'),(12583,'2005-08-18 15:51:36',3090,108,'2005-08-20 18:47:36',2,'2006-02-15 21:30:53'),(12584,'2005-08-18 15:51:36',4487,371,'2005-08-25 19:21:36',1,'2006-02-15 21:30:53'),(12585,'2005-08-18 15:52:12',773,110,'2005-08-22 21:00:12',1,'2006-02-15 21:30:53'),(12586,'2005-08-18 15:54:39',4245,460,'2005-08-21 19:29:39',1,'2006-02-15 21:30:53'),(12587,'2005-08-18 16:03:13',3081,499,'2005-08-25 19:30:13',1,'2006-02-15 21:30:53'),(12588,'2005-08-18 16:04:45',694,415,'2005-08-23 20:30:45',1,'2006-02-15 21:30:53'),(12589,'2005-08-18 16:06:31',956,275,'2005-08-27 17:20:31',1,'2006-02-15 21:30:53'),(12590,'2005-08-18 16:11:35',2624,308,'2005-08-23 10:35:35',1,'2006-02-15 21:30:53'),(12591,'2005-08-18 16:16:41',723,546,'2005-08-24 10:29:41',2,'2006-02-15 21:30:53'),(12592,'2005-08-18 16:17:50',1618,305,'2005-08-25 20:20:50',1,'2006-02-15 21:30:53'),(12593,'2005-08-18 16:17:54',4092,72,'2005-08-21 18:02:54',2,'2006-02-15 21:30:53'),(12594,'2005-08-18 16:24:24',4421,198,'2005-08-25 15:45:24',1,'2006-02-15 21:30:53'),(12595,'2005-08-18 16:27:08',1662,286,'2005-08-19 14:53:08',1,'2006-02-15 21:30:53'),(12596,'2005-08-18 16:29:35',3662,378,'2005-08-24 16:48:35',1,'2006-02-15 21:30:53'),(12597,'2005-08-18 16:34:02',3804,474,'2005-08-25 17:30:02',2,'2006-02-15 21:30:53'),(12598,'2005-08-18 16:34:03',3159,340,'2005-08-22 16:44:03',1,'2006-02-15 21:30:53'),(12599,'2005-08-18 16:42:45',2032,34,'2005-08-23 18:27:45',2,'2006-02-15 21:30:53'),(12600,'2005-08-18 16:44:24',1475,171,'2005-08-25 17:28:24',1,'2006-02-15 21:30:53'),(12601,'2005-08-18 16:47:52',3099,598,'2005-08-24 11:05:52',1,'2006-02-15 21:30:53'),(12602,'2005-08-18 16:49:50',2001,533,'2005-08-21 11:13:50',2,'2006-02-15 21:30:53'),(12603,'2005-08-18 16:56:20',2769,119,'2005-08-25 11:50:20',2,'2006-02-15 21:30:53'),(12604,'2005-08-18 16:58:48',4127,12,'2005-08-19 19:36:48',1,'2006-02-15 21:30:53'),(12605,'2005-08-18 16:59:37',1359,496,'2005-08-20 18:09:37',1,'2006-02-15 21:30:53'),(12606,'2005-08-18 17:02:21',359,275,'2005-08-24 22:38:21',1,'2006-02-15 21:30:53'),(12607,'2005-08-18 17:03:49',2130,526,'2005-08-19 18:29:49',1,'2006-02-15 21:30:53'),(12608,'2005-08-18 17:05:15',624,366,'2005-08-23 17:00:15',2,'2006-02-15 21:30:53'),(12609,'2005-08-18 17:06:22',2327,486,'2005-08-20 21:30:22',1,'2006-02-15 21:30:53'),(12610,'2006-02-14 15:16:03',3181,269,NULL,1,'2006-02-15 21:30:53'),(12611,'2005-08-18 17:09:42',1925,359,'2005-08-24 11:57:42',2,'2006-02-15 21:30:53'),(12612,'2005-08-18 17:10:05',1035,129,'2005-08-26 15:55:05',2,'2006-02-15 21:30:53'),(12613,'2005-08-18 17:16:01',3877,8,'2005-08-23 18:40:01',2,'2006-02-15 21:30:53'),(12614,'2005-08-18 17:16:03',2233,60,'2005-08-26 16:56:03',2,'2006-02-15 21:30:53'),(12615,'2005-08-18 17:16:07',2191,29,'2005-08-27 12:57:07',1,'2006-02-15 21:30:53'),(12616,'2005-08-18 17:22:41',2952,476,'2005-08-25 18:52:41',2,'2006-02-15 21:30:53'),(12617,'2005-08-18 17:22:48',3573,564,'2005-08-24 17:40:48',2,'2006-02-15 21:30:53'),(12618,'2005-08-18 17:24:02',302,117,'2005-08-19 15:22:02',1,'2006-02-15 21:30:53'),(12619,'2005-08-18 17:24:15',980,592,'2005-08-21 15:56:15',1,'2006-02-15 21:30:53'),(12620,'2005-08-18 17:26:38',2663,221,'2005-08-25 13:24:38',1,'2006-02-15 21:30:53'),(12621,'2005-08-18 17:31:36',4566,439,'2005-08-24 16:43:36',2,'2006-02-15 21:30:53'),(12622,'2005-08-18 17:34:11',278,529,'2005-08-24 16:10:11',1,'2006-02-15 21:30:53'),(12623,'2005-08-18 17:34:19',3670,177,'2005-08-20 21:30:19',1,'2006-02-15 21:30:53'),(12624,'2005-08-18 17:35:00',1135,434,'2005-08-27 12:18:00',2,'2006-02-15 21:30:53'),(12625,'2005-08-18 17:36:19',2645,108,'2005-08-23 11:42:19',1,'2006-02-15 21:30:53'),(12626,'2005-08-18 17:36:45',4230,361,'2005-08-26 17:12:45',1,'2006-02-15 21:30:53'),(12627,'2005-08-18 17:37:11',3760,150,'2005-08-19 14:59:11',2,'2006-02-15 21:30:53'),(12628,'2005-08-18 17:40:25',3210,520,'2005-08-25 13:39:25',1,'2006-02-15 21:30:53'),(12629,'2005-08-18 17:40:33',1705,459,'2005-08-26 21:09:33',1,'2006-02-15 21:30:53'),(12630,'2005-08-18 17:49:28',1457,452,'2005-08-24 12:23:28',1,'2006-02-15 21:30:53'),(12631,'2005-08-18 17:52:51',2782,339,'2005-08-25 14:40:51',2,'2006-02-15 21:30:53'),(12632,'2005-08-18 17:54:21',827,381,'2005-08-22 18:58:21',1,'2006-02-15 21:30:53'),(12633,'2005-08-18 17:55:38',4341,469,'2005-08-23 17:19:38',2,'2006-02-15 21:30:53'),(12634,'2005-08-18 17:58:14',1037,549,'2005-08-19 21:08:14',2,'2006-02-15 21:30:53'),(12635,'2005-08-18 18:00:23',331,15,'2005-08-23 16:40:23',2,'2006-02-15 21:30:53'),(12636,'2005-08-18 18:00:29',1645,380,'2005-08-26 20:08:29',2,'2006-02-15 21:30:53'),(12637,'2005-08-18 18:06:53',4005,145,'2005-08-19 17:36:53',1,'2006-02-15 21:30:53'),(12638,'2005-08-18 18:11:39',2849,172,'2005-08-25 21:54:39',2,'2006-02-15 21:30:53'),(12639,'2005-08-18 18:13:05',562,500,'2005-08-27 16:00:05',2,'2006-02-15 21:30:53'),(12640,'2005-08-18 18:14:49',1715,544,'2005-08-24 21:25:49',1,'2006-02-15 21:30:53'),(12641,'2005-08-18 18:18:08',776,467,'2005-08-19 23:17:08',1,'2006-02-15 21:30:53'),(12642,'2005-08-18 18:19:16',2080,167,'2005-08-20 17:30:16',2,'2006-02-15 21:30:53'),(12643,'2005-08-18 18:21:06',2245,165,'2005-08-24 14:26:06',1,'2006-02-15 21:30:53'),(12644,'2005-08-18 18:22:27',1511,300,'2005-08-26 00:01:27',1,'2006-02-15 21:30:53'),(12645,'2006-02-14 15:16:03',1658,457,NULL,1,'2006-02-15 21:30:53'),(12646,'2005-08-18 18:25:06',3103,388,'2005-08-24 18:45:06',1,'2006-02-15 21:30:53'),(12647,'2005-08-18 18:29:51',323,520,'2005-08-27 22:51:51',1,'2006-02-15 21:30:53'),(12648,'2005-08-18 18:30:21',3545,519,'2005-08-25 19:17:21',1,'2006-02-15 21:30:53'),(12649,'2005-08-18 18:31:47',3201,530,'2005-08-22 21:07:47',2,'2006-02-15 21:30:53'),(12650,'2005-08-18 18:33:20',3237,276,'2005-08-21 17:45:20',2,'2006-02-15 21:30:53'),(12651,'2005-08-18 18:36:16',8,34,'2005-08-22 22:01:16',1,'2006-02-15 21:30:53'),(12652,'2005-08-18 18:48:58',2118,9,'2005-08-21 14:15:58',1,'2006-02-15 21:30:53'),(12653,'2005-08-18 18:53:17',3353,78,'2005-08-26 14:08:17',1,'2006-02-15 21:30:53'),(12654,'2005-08-18 18:56:40',2217,438,'2005-08-20 17:51:40',2,'2006-02-15 21:30:53'),(12655,'2005-08-18 18:57:44',859,533,'2005-08-27 22:40:44',2,'2006-02-15 21:30:53'),(12656,'2005-08-18 18:58:35',3981,286,'2005-08-21 00:41:35',1,'2006-02-15 21:30:53'),(12657,'2005-08-18 19:02:16',3621,100,'2005-08-21 14:59:16',1,'2006-02-15 21:30:53'),(12658,'2005-08-18 19:05:42',4320,193,'2005-08-19 19:08:42',1,'2006-02-15 21:30:53'),(12659,'2005-08-18 19:05:49',336,329,'2005-08-24 22:12:49',2,'2006-02-15 21:30:53'),(12660,'2005-08-18 19:07:23',414,21,'2005-08-27 17:20:23',2,'2006-02-15 21:30:53'),(12661,'2005-08-18 19:10:10',1547,333,'2005-08-22 20:30:10',1,'2006-02-15 21:30:53'),(12662,'2005-08-18 19:10:41',1412,75,'2005-08-23 16:59:41',1,'2006-02-15 21:30:53'),(12663,'2005-08-18 19:10:52',1163,375,'2005-08-19 15:46:52',1,'2006-02-15 21:30:53'),(12664,'2005-08-18 19:10:54',2732,577,'2005-08-25 19:19:54',1,'2006-02-15 21:30:53'),(12665,'2006-02-14 15:16:03',1701,410,NULL,2,'2006-02-15 21:30:53'),(12666,'2005-08-18 19:11:41',4156,251,'2005-08-21 18:04:41',2,'2006-02-15 21:30:53'),(12667,'2005-08-18 19:11:45',104,545,'2005-08-27 13:34:45',2,'2006-02-15 21:30:53'),(12668,'2005-08-18 19:16:47',1986,14,'2005-08-19 16:31:47',1,'2006-02-15 21:30:53'),(12669,'2005-08-18 19:17:47',4530,433,'2005-08-24 14:55:47',1,'2006-02-15 21:30:53'),(12670,'2005-08-18 19:17:58',1716,580,'2005-08-23 20:54:58',2,'2006-02-15 21:30:53'),(12671,'2005-08-18 19:19:59',1734,577,'2005-08-23 17:53:59',2,'2006-02-15 21:30:53'),(12672,'2006-02-14 15:16:03',1722,228,NULL,1,'2006-02-15 21:30:53'),(12673,'2005-08-18 19:21:56',4204,535,'2005-08-26 22:44:56',2,'2006-02-15 21:30:53'),(12674,'2005-08-18 19:24:56',636,185,'2005-08-26 22:16:56',2,'2006-02-15 21:30:53'),(12675,'2005-08-18 19:34:02',569,140,'2005-08-23 13:36:02',2,'2006-02-15 21:30:53'),(12676,'2005-08-18 19:34:40',2581,393,'2005-08-20 18:03:40',2,'2006-02-15 21:30:53'),(12677,'2005-08-18 19:36:05',1311,334,'2005-08-22 21:23:05',2,'2006-02-15 21:30:53'),(12678,'2005-08-18 19:41:27',2504,181,'2005-08-23 15:14:27',2,'2006-02-15 21:30:53'),(12679,'2005-08-18 19:42:11',1535,463,'2005-08-25 01:01:11',1,'2006-02-15 21:30:53'),(12680,'2005-08-18 19:43:46',833,259,'2005-08-27 00:08:46',2,'2006-02-15 21:30:53'),(12681,'2005-08-18 19:48:06',1570,518,'2005-08-23 15:05:06',2,'2006-02-15 21:30:53'),(12682,'2006-02-14 15:16:03',1148,245,NULL,2,'2006-02-15 21:30:53'),(12683,'2005-08-18 19:50:43',1802,166,'2005-08-26 00:47:43',1,'2006-02-15 21:30:53'),(12684,'2005-08-18 19:51:27',978,196,'2005-08-19 15:56:27',1,'2006-02-15 21:30:53'),(12685,'2005-08-18 19:51:29',4283,114,'2005-08-27 14:58:29',2,'2006-02-15 21:30:53'),(12686,'2005-08-18 19:55:09',501,385,'2005-08-26 14:17:09',1,'2006-02-15 21:30:53'),(12687,'2005-08-18 19:57:39',3092,285,'2005-08-27 01:36:39',2,'2006-02-15 21:30:53'),(12688,'2005-08-18 19:59:54',2315,65,'2005-08-26 18:52:54',2,'2006-02-15 21:30:53'),(12689,'2005-08-18 20:06:34',1066,296,'2005-08-22 20:11:34',2,'2006-02-15 21:30:53'),(12690,'2005-08-18 20:06:57',3574,361,'2005-08-24 20:54:57',2,'2006-02-15 21:30:53'),(12691,'2005-08-18 20:07:46',3744,534,'2005-08-26 18:49:46',2,'2006-02-15 21:30:53'),(12692,'2005-08-18 20:09:19',2781,273,'2005-08-21 00:14:19',1,'2006-02-15 21:30:53'),(12693,'2005-08-18 20:10:19',1543,584,'2005-08-25 21:11:19',1,'2006-02-15 21:30:53'),(12694,'2005-08-18 20:10:39',1741,268,'2005-08-25 20:47:39',1,'2006-02-15 21:30:53'),(12695,'2005-08-18 20:11:35',446,483,'2005-08-25 18:29:35',1,'2006-02-15 21:30:53'),(12696,'2005-08-18 20:13:08',3989,374,'2005-08-19 18:02:08',2,'2006-02-15 21:30:53'),(12697,'2005-08-18 20:14:56',2774,152,'2005-08-23 21:54:56',1,'2006-02-15 21:30:53'),(12698,'2006-02-14 15:16:03',3657,497,NULL,1,'2006-02-15 21:30:53'),(12699,'2005-08-18 20:20:59',3695,66,'2005-08-22 17:00:59',1,'2006-02-15 21:30:53'),(12700,'2005-08-18 20:24:46',540,397,'2005-08-23 21:50:46',1,'2006-02-15 21:30:53'),(12701,'2005-08-18 20:26:47',2337,489,'2005-08-26 23:36:47',2,'2006-02-15 21:30:53'),(12702,'2005-08-18 20:30:33',1884,474,'2005-08-27 01:22:33',2,'2006-02-15 21:30:53'),(12703,'2005-08-18 20:37:13',1278,453,'2005-08-26 16:13:13',1,'2006-02-15 21:30:53'),(12704,'2005-08-18 20:43:00',51,93,'2005-08-21 22:28:00',2,'2006-02-15 21:30:53'),(12705,'2005-08-18 20:44:14',2342,517,'2005-08-23 20:46:14',1,'2006-02-15 21:30:53'),(12706,'2005-08-18 20:44:34',1079,170,'2005-08-26 21:47:34',1,'2006-02-15 21:30:53'),(12707,'2005-08-18 20:52:02',1565,426,'2005-08-25 19:03:02',2,'2006-02-15 21:30:53'),(12708,'2005-08-18 20:59:17',3448,28,'2005-08-24 22:40:17',1,'2006-02-15 21:30:53'),(12709,'2005-08-18 20:59:51',3878,476,'2005-08-26 01:21:51',2,'2006-02-15 21:30:53'),(12710,'2005-08-18 21:02:50',3011,310,'2005-08-26 15:07:50',2,'2006-02-15 21:30:53'),(12711,'2005-08-18 21:03:32',2530,122,'2005-08-26 17:31:32',1,'2006-02-15 21:30:53'),(12712,'2005-08-18 21:04:13',2628,444,'2005-08-25 18:15:13',2,'2006-02-15 21:30:53'),(12713,'2005-08-18 21:07:28',1505,56,'2005-08-24 17:46:28',1,'2006-02-15 21:30:53'),(12714,'2005-08-18 21:08:01',868,372,'2005-08-27 17:09:01',2,'2006-02-15 21:30:53'),(12715,'2005-08-18 21:09:38',3768,266,'2005-08-21 20:25:38',1,'2006-02-15 21:30:53'),(12716,'2006-02-14 15:16:03',858,570,NULL,2,'2006-02-15 21:30:53'),(12717,'2005-08-18 21:15:40',3551,167,'2005-08-20 00:59:40',2,'2006-02-15 21:30:53'),(12718,'2005-08-18 21:21:44',3221,176,'2005-08-20 01:01:44',1,'2006-02-15 21:30:53'),(12719,'2006-02-14 15:16:03',1094,87,NULL,2,'2006-02-15 21:30:53'),(12720,'2005-08-18 21:28:42',2676,419,'2005-08-25 18:02:42',1,'2006-02-15 21:30:53'),(12721,'2005-08-18 21:30:12',1045,239,'2005-08-22 22:45:12',1,'2006-02-15 21:30:53'),(12722,'2005-08-18 21:33:53',913,416,'2005-08-27 23:47:53',2,'2006-02-15 21:30:53'),(12723,'2005-08-18 21:34:16',4167,430,'2005-08-22 22:37:16',1,'2006-02-15 21:30:53'),(12724,'2005-08-18 21:37:20',2224,242,'2005-08-27 21:56:20',2,'2006-02-15 21:30:53'),(12725,'2005-08-18 21:43:09',4071,51,'2005-08-23 18:50:09',1,'2006-02-15 21:30:53'),(12726,'2005-08-18 21:44:46',20,397,'2005-08-19 21:58:46',2,'2006-02-15 21:30:53'),(12727,'2005-08-18 21:45:15',15,178,'2005-08-24 15:52:15',1,'2006-02-15 21:30:53'),(12728,'2005-08-18 21:47:48',3156,129,'2005-08-25 16:13:48',1,'2006-02-15 21:30:53'),(12729,'2005-08-18 21:52:59',3711,424,'2005-08-21 00:02:59',1,'2006-02-15 21:30:53'),(12730,'2005-08-18 21:55:01',75,7,'2005-08-22 01:23:01',1,'2006-02-15 21:30:53'),(12731,'2005-08-18 21:55:38',1719,128,'2005-08-23 20:30:38',1,'2006-02-15 21:30:53'),(12732,'2005-08-18 21:57:50',3307,535,'2005-08-19 18:28:50',2,'2006-02-15 21:30:53'),(12733,'2005-08-18 21:59:00',3243,144,'2005-08-24 02:25:00',1,'2006-02-15 21:30:53'),(12734,'2005-08-18 22:04:52',3619,121,'2005-08-25 00:34:52',1,'2006-02-15 21:30:53'),(12735,'2005-08-18 22:04:54',3679,383,'2005-08-23 21:19:54',2,'2006-02-15 21:30:53'),(12736,'2006-02-14 15:16:03',3591,244,NULL,2,'2006-02-15 21:30:53'),(12737,'2005-08-18 22:11:37',736,204,'2005-08-26 04:08:37',1,'2006-02-15 21:30:53'),(12738,'2005-08-18 22:11:47',4313,589,'2005-08-27 17:55:47',2,'2006-02-15 21:30:53'),(12739,'2005-08-18 22:15:18',4129,292,'2005-08-27 00:37:18',2,'2006-02-15 21:30:53'),(12740,'2005-08-18 22:17:04',1157,330,'2005-08-23 23:42:04',1,'2006-02-15 21:30:53'),(12741,'2005-08-18 22:17:05',2084,435,'2005-08-25 20:07:05',2,'2006-02-15 21:30:53'),(12742,'2005-08-18 22:22:03',1742,68,'2005-08-22 04:01:03',1,'2006-02-15 21:30:53'),(12743,'2005-08-18 22:22:31',2630,565,'2005-08-27 00:31:31',1,'2006-02-15 21:30:53'),(12744,'2005-08-18 22:22:36',3815,593,'2005-08-24 00:26:36',1,'2006-02-15 21:30:53'),(12745,'2005-08-18 22:22:45',262,24,'2005-08-20 01:44:45',2,'2006-02-15 21:30:53'),(12746,'2006-02-14 15:16:03',1012,211,NULL,1,'2006-02-15 21:30:53'),(12747,'2005-08-18 22:28:22',4075,549,'2005-08-22 22:25:22',2,'2006-02-15 21:30:53'),(12748,'2005-08-18 22:29:05',3249,373,'2005-08-24 18:25:05',2,'2006-02-15 21:30:53'),(12749,'2005-08-18 22:31:21',828,388,'2005-08-20 22:53:21',1,'2006-02-15 21:30:53'),(12750,'2005-08-18 22:32:39',3717,535,'2005-08-26 01:54:39',1,'2006-02-15 21:30:53'),(12751,'2005-08-18 22:33:22',2791,352,'2005-08-20 20:28:22',2,'2006-02-15 21:30:53'),(12752,'2005-08-18 22:33:36',3595,514,'2005-08-27 23:55:36',1,'2006-02-15 21:30:53'),(12753,'2005-08-18 22:37:39',1494,470,'2005-08-27 00:21:39',2,'2006-02-15 21:30:53'),(12754,'2005-08-18 22:37:41',4154,134,'2005-08-27 20:17:41',2,'2006-02-15 21:30:53'),(12755,'2005-08-18 22:38:47',105,439,'2005-08-22 23:58:47',1,'2006-02-15 21:30:53'),(12756,'2005-08-18 22:52:13',1840,89,'2005-08-21 17:22:13',1,'2006-02-15 21:30:53'),(12757,'2005-08-18 22:57:45',1095,147,'2005-08-21 22:43:45',1,'2006-02-15 21:30:53'),(12758,'2005-08-18 22:58:34',2279,30,'2005-08-22 23:33:34',1,'2006-02-15 21:30:53'),(12759,'2006-02-14 15:16:03',4193,354,NULL,2,'2006-02-15 21:30:53'),(12760,'2005-08-18 23:03:19',4188,363,'2005-08-24 17:53:19',1,'2006-02-15 21:30:53'),(12761,'2005-08-18 23:05:22',2684,364,'2005-08-22 01:08:22',2,'2006-02-15 21:30:53'),(12762,'2005-08-18 23:06:54',3909,502,'2005-08-21 18:30:54',1,'2006-02-15 21:30:53'),(12763,'2005-08-18 23:07:01',393,472,'2005-08-21 18:45:01',1,'2006-02-15 21:30:53'),(12764,'2005-08-18 23:14:15',26,183,'2005-08-22 20:23:15',1,'2006-02-15 21:30:53'),(12765,'2005-08-18 23:21:50',2244,298,'2005-08-28 04:42:50',2,'2006-02-15 21:30:53'),(12766,'2005-08-18 23:25:20',3737,50,'2005-08-27 04:43:20',1,'2006-02-15 21:30:53'),(12767,'2005-08-18 23:25:49',3351,432,'2005-08-28 02:40:49',2,'2006-02-15 21:30:53'),(12768,'2005-08-18 23:26:11',1993,458,'2005-08-19 20:31:11',2,'2006-02-15 21:30:53'),(12769,'2005-08-18 23:26:40',926,504,'2005-08-25 03:03:40',1,'2006-02-15 21:30:53'),(12770,'2005-08-18 23:29:00',1654,575,'2005-08-26 20:57:00',2,'2006-02-15 21:30:53'),(12771,'2005-08-18 23:29:23',3076,484,'2005-08-22 17:31:23',2,'2006-02-15 21:30:53'),(12772,'2005-08-18 23:29:25',1179,397,'2005-08-23 20:32:25',1,'2006-02-15 21:30:53'),(12773,'2005-08-18 23:32:19',4390,360,'2005-08-27 04:40:19',1,'2006-02-15 21:30:53'),(12774,'2005-08-18 23:34:22',3601,21,'2005-08-28 05:00:22',2,'2006-02-15 21:30:53'),(12775,'2005-08-18 23:35:56',4374,54,'2005-08-26 18:37:56',1,'2006-02-15 21:30:53'),(12776,'2005-08-18 23:37:33',2345,55,'2005-08-23 03:07:33',1,'2006-02-15 21:30:53'),(12777,'2005-08-18 23:39:22',3467,130,'2005-08-27 20:28:22',1,'2006-02-15 21:30:53'),(12778,'2005-08-18 23:40:23',3626,290,'2005-08-19 18:14:23',2,'2006-02-15 21:30:53'),(12779,'2005-08-18 23:44:00',1814,325,'2005-08-26 05:27:00',2,'2006-02-15 21:30:53'),(12780,'2005-08-18 23:48:16',54,373,'2005-08-20 18:13:16',2,'2006-02-15 21:30:53'),(12781,'2005-08-18 23:50:24',1187,168,'2005-08-21 02:31:24',1,'2006-02-15 21:30:53'),(12782,'2005-08-18 23:56:23',1454,495,'2005-08-25 18:47:23',1,'2006-02-15 21:30:53'),(12783,'2005-08-19 00:01:14',1109,503,'2005-08-21 22:02:14',2,'2006-02-15 21:30:53'),(12784,'2005-08-19 00:02:46',447,513,'2005-08-20 04:39:46',1,'2006-02-15 21:30:53'),(12785,'2005-08-19 00:05:49',4190,145,'2005-08-21 04:39:49',2,'2006-02-15 21:30:53'),(12786,'2006-02-14 15:16:03',97,512,NULL,1,'2006-02-15 21:30:53'),(12787,'2005-08-19 00:07:58',2023,278,'2005-08-24 00:42:58',2,'2006-02-15 21:30:53'),(12788,'2005-08-19 00:15:09',644,90,'2005-08-27 21:54:09',1,'2006-02-15 21:30:53'),(12789,'2005-08-19 00:16:19',2412,557,'2005-08-25 00:18:19',2,'2006-02-15 21:30:53'),(12790,'2005-08-19 00:16:54',1281,44,'2005-08-26 02:00:54',1,'2006-02-15 21:30:53'),(12791,'2005-08-19 00:17:09',3594,573,'2005-08-22 23:46:09',1,'2006-02-15 21:30:53'),(12792,'2006-02-14 15:16:03',1435,405,NULL,2,'2006-02-15 21:30:53'),(12793,'2005-08-19 00:20:36',1195,403,'2005-08-28 02:43:36',1,'2006-02-15 21:30:53'),(12794,'2005-08-19 00:20:37',1586,336,'2005-08-26 01:48:37',1,'2006-02-15 21:30:53'),(12795,'2005-08-19 00:21:52',2745,360,'2005-08-22 22:13:52',2,'2006-02-15 21:30:53'),(12796,'2005-08-19 00:22:24',1285,368,'2005-08-19 22:53:24',2,'2006-02-15 21:30:53'),(12797,'2005-08-19 00:24:08',1595,5,'2005-08-21 22:53:08',2,'2006-02-15 21:30:53'),(12798,'2005-08-19 00:24:33',4244,534,'2005-08-21 23:01:33',2,'2006-02-15 21:30:53'),(12799,'2005-08-19 00:27:01',3885,197,'2005-08-22 03:30:01',2,'2006-02-15 21:30:53'),(12800,'2005-08-19 00:27:11',257,545,'2005-08-22 01:08:11',1,'2006-02-15 21:30:53'),(12801,'2005-08-19 00:27:19',960,202,'2005-08-26 03:10:19',1,'2006-02-15 21:30:53'),(12802,'2005-08-19 00:27:41',2461,462,'2005-08-28 03:24:41',1,'2006-02-15 21:30:53'),(12803,'2005-08-19 00:28:21',1058,390,'2005-08-23 02:02:21',1,'2006-02-15 21:30:53'),(12804,'2005-08-19 00:33:15',147,365,'2005-08-28 02:16:15',2,'2006-02-15 21:30:53'),(12805,'2005-08-19 00:36:34',2964,345,'2005-08-26 20:38:34',1,'2006-02-15 21:30:53'),(12806,'2005-08-19 00:37:26',4488,423,'2005-08-23 18:49:26',2,'2006-02-15 21:30:53'),(12807,'2005-08-19 00:38:46',2323,513,'2005-08-28 03:37:46',2,'2006-02-15 21:30:53'),(12808,'2005-08-19 00:40:41',3920,55,'2005-08-21 06:39:41',2,'2006-02-15 21:30:53'),(12809,'2005-08-19 00:42:24',2005,22,'2005-08-23 06:06:24',1,'2006-02-15 21:30:53'),(12810,'2005-08-19 00:44:10',1340,250,'2005-08-22 22:30:10',2,'2006-02-15 21:30:53'),(12811,'2005-08-19 00:51:28',641,54,'2005-08-24 01:57:28',2,'2006-02-15 21:30:53'),(12812,'2005-08-19 00:54:02',4024,450,'2005-08-22 20:35:02',2,'2006-02-15 21:30:53'),(12813,'2005-08-19 00:54:22',3285,500,'2005-08-19 21:17:22',2,'2006-02-15 21:30:53'),(12814,'2005-08-19 00:58:24',204,465,'2005-08-21 05:46:24',1,'2006-02-15 21:30:53'),(12815,'2005-08-19 00:59:42',435,588,'2005-08-25 21:43:42',2,'2006-02-15 21:30:53'),(12816,'2005-08-19 01:04:05',4051,342,'2005-08-24 01:25:05',1,'2006-02-15 21:30:53'),(12817,'2005-08-19 01:04:35',1246,113,'2005-08-25 21:14:35',1,'2006-02-15 21:30:53'),(12818,'2005-08-19 01:04:59',3069,528,'2005-08-26 21:39:59',2,'2006-02-15 21:30:53'),(12819,'2005-08-19 01:05:05',1117,542,'2005-08-22 05:50:05',1,'2006-02-15 21:30:53'),(12820,'2005-08-19 01:05:08',2936,127,'2005-08-21 05:37:08',2,'2006-02-15 21:30:53'),(12821,'2005-08-19 01:07:02',3418,41,'2005-08-23 01:22:02',2,'2006-02-15 21:30:53'),(12822,'2005-08-19 01:15:24',419,426,'2005-08-20 06:38:24',1,'2006-02-15 21:30:53'),(12823,'2005-08-19 01:15:47',426,316,'2005-08-22 05:32:47',2,'2006-02-15 21:30:53'),(12824,'2005-08-19 01:18:00',1875,247,'2005-08-22 01:12:00',2,'2006-02-15 21:30:53'),(12825,'2005-08-19 01:23:58',4495,328,'2005-08-20 00:19:58',2,'2006-02-15 21:30:53'),(12826,'2005-08-19 01:25:11',1277,439,'2005-08-27 01:22:11',1,'2006-02-15 21:30:53'),(12827,'2005-08-19 01:27:23',880,253,'2005-08-27 02:22:23',2,'2006-02-15 21:30:53'),(12828,'2005-08-19 01:37:47',4208,378,'2005-08-24 22:31:47',2,'2006-02-15 21:30:53'),(12829,'2005-08-19 01:38:18',1129,326,'2005-08-25 22:23:18',2,'2006-02-15 21:30:53'),(12830,'2005-08-19 01:40:25',4080,409,'2005-08-20 23:49:25',2,'2006-02-15 21:30:53'),(12831,'2005-08-19 01:40:43',1916,183,'2005-08-28 05:22:43',1,'2006-02-15 21:30:53'),(12832,'2005-08-19 01:41:44',2820,563,'2005-08-24 23:15:44',2,'2006-02-15 21:30:53'),(12833,'2005-08-19 01:42:28',3723,59,'2005-08-26 20:13:28',1,'2006-02-15 21:30:53'),(12834,'2005-08-19 01:47:30',757,133,'2005-08-24 20:08:30',1,'2006-02-15 21:30:53'),(12835,'2005-08-19 01:47:45',1477,124,'2005-08-26 00:58:45',2,'2006-02-15 21:30:53'),(12836,'2005-08-19 01:48:33',1380,196,'2005-08-23 04:46:33',1,'2006-02-15 21:30:53'),(12837,'2005-08-19 01:51:09',2288,495,'2005-08-22 07:14:09',2,'2006-02-15 21:30:53'),(12838,'2005-08-19 01:51:50',1207,308,'2005-08-27 23:12:50',1,'2006-02-15 21:30:53'),(12839,'2005-08-19 01:53:43',1970,360,'2005-08-28 02:27:43',2,'2006-02-15 21:30:53'),(12840,'2005-08-19 01:54:11',2098,182,'2005-08-28 01:11:11',2,'2006-02-15 21:30:53'),(12841,'2005-08-19 01:55:55',4233,257,'2005-08-24 02:56:55',1,'2006-02-15 21:30:53'),(12842,'2005-08-19 01:57:21',2540,119,'2005-08-28 01:10:21',1,'2006-02-15 21:30:53'),(12843,'2005-08-19 01:58:54',3279,128,'2005-08-20 00:20:54',2,'2006-02-15 21:30:53'),(12844,'2005-08-19 01:59:08',4146,584,'2005-08-24 22:21:08',1,'2006-02-15 21:30:53'),(12845,'2005-08-19 02:02:37',1698,106,'2005-08-22 01:08:37',1,'2006-02-15 21:30:53'),(12846,'2005-08-19 02:03:26',286,305,'2005-08-25 07:39:26',2,'2006-02-15 21:30:53'),(12847,'2005-08-19 02:04:07',384,91,'2005-08-23 20:13:07',2,'2006-02-15 21:30:53'),(12848,'2005-08-19 02:05:11',2833,539,'2005-08-24 05:27:11',2,'2006-02-15 21:30:53'),(12849,'2005-08-19 02:05:37',3489,280,'2005-08-23 07:00:37',1,'2006-02-15 21:30:53'),(12850,'2005-08-19 02:08:06',1816,440,'2005-08-20 21:06:06',2,'2006-02-15 21:30:53'),(12851,'2005-08-19 02:12:12',3311,194,'2005-08-25 23:51:12',1,'2006-02-15 21:30:53'),(12852,'2005-08-19 02:12:40',2446,260,'2005-08-19 23:42:40',1,'2006-02-15 21:30:53'),(12853,'2005-08-19 02:15:32',3753,232,'2005-08-27 21:26:32',2,'2006-02-15 21:30:53'),(12854,'2005-08-19 02:18:51',4577,362,'2005-08-24 04:16:51',2,'2006-02-15 21:30:53'),(12855,'2005-08-19 02:18:58',2900,242,'2005-08-19 20:50:58',1,'2006-02-15 21:30:53'),(12856,'2005-08-19 02:19:13',132,4,'2005-08-23 07:49:13',2,'2006-02-15 21:30:53'),(12857,'2005-08-19 02:20:13',4307,443,'2005-08-20 20:20:13',1,'2006-02-15 21:30:53'),(12858,'2005-08-19 02:22:16',3024,144,'2005-08-26 07:25:16',2,'2006-02-15 21:30:53'),(12859,'2005-08-19 02:23:23',2289,139,'2005-08-28 04:55:23',2,'2006-02-15 21:30:53'),(12860,'2005-08-19 02:24:41',778,548,'2005-08-25 07:43:41',1,'2006-02-15 21:30:53'),(12861,'2005-08-19 02:30:24',3115,287,'2005-08-22 08:23:24',1,'2006-02-15 21:30:53'),(12862,'2005-08-19 02:31:59',473,198,'2005-08-26 08:16:59',2,'2006-02-15 21:30:53'),(12863,'2005-08-19 02:35:59',780,234,'2005-08-21 21:13:59',1,'2006-02-15 21:30:53'),(12864,'2005-08-19 02:38:26',4481,465,'2005-08-22 21:42:26',2,'2006-02-15 21:30:53'),(12865,'2005-08-19 02:38:50',3437,460,'2005-08-21 02:33:50',1,'2006-02-15 21:30:53'),(12866,'2005-08-19 02:39:47',1766,229,'2005-08-27 02:14:47',1,'2006-02-15 21:30:53'),(12867,'2005-08-19 02:40:11',4499,330,'2005-08-20 04:01:11',1,'2006-02-15 21:30:53'),(12868,'2005-08-19 02:47:19',4054,551,'2005-08-20 00:30:19',2,'2006-02-15 21:30:53'),(12869,'2005-08-19 02:50:36',3939,99,'2005-08-26 21:38:36',2,'2006-02-15 21:30:53'),(12870,'2005-08-19 02:54:38',991,86,'2005-08-27 00:45:38',1,'2006-02-15 21:30:53'),(12871,'2005-08-19 02:55:36',2625,217,'2005-08-22 01:00:36',2,'2006-02-15 21:30:53'),(12872,'2005-08-19 02:57:37',1975,54,'2005-08-22 23:23:37',1,'2006-02-15 21:30:53'),(12873,'2005-08-19 03:05:41',2140,138,'2005-08-22 06:57:41',2,'2006-02-15 21:30:53'),(12874,'2005-08-19 03:07:57',848,254,'2005-08-22 22:42:57',2,'2006-02-15 21:30:53'),(12875,'2005-08-19 03:10:21',1708,483,'2005-08-26 01:00:21',2,'2006-02-15 21:30:53'),(12876,'2005-08-19 03:12:19',803,356,'2005-08-20 02:24:19',2,'2006-02-15 21:30:53'),(12877,'2005-08-19 03:16:58',1016,40,'2005-08-25 02:10:58',2,'2006-02-15 21:30:53'),(12878,'2005-08-19 03:17:08',1182,596,'2005-08-23 03:44:08',1,'2006-02-15 21:30:53'),(12879,'2005-08-19 03:22:55',3556,210,'2005-08-24 22:00:55',1,'2006-02-15 21:30:53'),(12880,'2005-08-19 03:27:17',3386,552,'2005-08-28 06:16:17',2,'2006-02-15 21:30:53'),(12881,'2005-08-19 03:28:13',1432,121,'2005-08-25 05:25:13',1,'2006-02-15 21:30:53'),(12882,'2005-08-19 03:33:46',911,153,'2005-08-21 22:49:46',1,'2006-02-15 21:30:53'),(12883,'2005-08-19 03:33:47',964,555,'2005-08-23 21:55:47',1,'2006-02-15 21:30:53'),(12884,'2005-08-19 03:34:04',2768,348,'2005-08-28 01:00:04',2,'2006-02-15 21:30:53'),(12885,'2005-08-19 03:37:25',883,185,'2005-08-20 22:10:25',1,'2006-02-15 21:30:53'),(12886,'2005-08-19 03:38:32',2157,174,'2005-08-26 02:17:32',1,'2006-02-15 21:30:53'),(12887,'2005-08-19 03:38:54',1214,150,'2005-08-27 08:45:54',1,'2006-02-15 21:30:53'),(12888,'2005-08-19 03:41:09',4398,146,'2005-08-24 07:09:09',2,'2006-02-15 21:30:53'),(12889,'2005-08-19 03:41:31',4376,515,'2005-08-27 00:46:31',2,'2006-02-15 21:30:53'),(12890,'2005-08-19 03:42:08',3831,150,'2005-08-19 23:08:08',1,'2006-02-15 21:30:53'),(12891,'2006-02-14 15:16:03',2764,388,NULL,2,'2006-02-15 21:30:53'),(12892,'2005-08-19 03:46:34',1044,121,'2005-08-21 05:11:34',2,'2006-02-15 21:30:53'),(12893,'2005-08-19 03:46:43',168,498,'2005-08-20 08:38:43',2,'2006-02-15 21:30:53'),(12894,'2005-08-19 03:49:28',4581,541,'2005-08-25 01:51:28',2,'2006-02-15 21:30:53'),(12895,'2005-08-19 03:50:48',4372,396,'2005-08-26 09:13:48',1,'2006-02-15 21:30:53'),(12896,'2005-08-19 03:52:44',148,220,'2005-08-24 22:27:44',1,'2006-02-15 21:30:53'),(12897,'2006-02-14 15:16:03',1512,178,NULL,2,'2006-02-15 21:30:53'),(12898,'2005-08-19 03:54:34',1555,586,'2005-08-23 08:14:34',2,'2006-02-15 21:30:53'),(12899,'2005-08-19 04:03:34',830,105,'2005-08-20 08:34:34',2,'2006-02-15 21:30:53'),(12900,'2005-08-19 04:03:49',849,408,'2005-08-24 22:11:49',2,'2006-02-15 21:30:53'),(12901,'2006-02-14 15:16:03',2799,180,NULL,2,'2006-02-15 21:30:53'),(12902,'2006-02-14 15:16:03',464,91,NULL,2,'2006-02-15 21:30:53'),(12903,'2005-08-19 04:09:38',2340,302,'2005-08-26 03:24:38',2,'2006-02-15 21:30:53'),(12904,'2005-08-19 04:10:50',459,257,'2005-08-27 23:24:50',1,'2006-02-15 21:30:53'),(12905,'2005-08-19 04:13:37',1043,480,'2005-08-26 23:52:37',1,'2006-02-15 21:30:53'),(12906,'2005-08-19 04:13:43',2060,401,'2005-08-20 04:24:43',1,'2006-02-15 21:30:53'),(12907,'2005-08-19 04:16:13',2844,422,'2005-08-27 02:43:13',1,'2006-02-15 21:30:53'),(12908,'2005-08-19 04:19:05',175,340,'2005-08-25 09:50:05',1,'2006-02-15 21:30:53'),(12909,'2005-08-19 04:20:25',4300,210,'2005-08-24 06:40:25',2,'2006-02-15 21:30:53'),(12910,'2005-08-19 04:23:13',3968,128,'2005-08-20 22:27:13',1,'2006-02-15 21:30:53'),(12911,'2005-08-19 04:24:10',1770,367,'2005-08-26 00:35:10',2,'2006-02-15 21:30:53'),(12912,'2005-08-19 04:24:35',1747,364,'2005-08-27 07:13:35',2,'2006-02-15 21:30:53'),(12913,'2005-08-19 04:25:39',3719,356,'2005-08-25 07:23:39',1,'2006-02-15 21:30:53'),(12914,'2005-08-19 04:25:59',4396,501,'2005-08-23 08:04:59',2,'2006-02-15 21:30:53'),(12915,'2006-02-14 15:16:03',2651,516,NULL,1,'2006-02-15 21:30:53'),(12916,'2005-08-19 04:27:05',2277,157,'2005-08-21 02:33:05',2,'2006-02-15 21:30:53'),(12917,'2005-08-19 04:27:11',107,152,'2005-08-20 03:04:11',2,'2006-02-15 21:30:53'),(12918,'2005-08-19 04:31:36',972,13,'2005-08-25 05:50:36',1,'2006-02-15 21:30:53'),(12919,'2005-08-19 04:32:15',2121,263,'2005-08-24 05:56:15',2,'2006-02-15 21:30:53'),(12920,'2005-08-19 04:32:32',2516,511,'2005-08-27 00:44:32',2,'2006-02-15 21:30:53'),(12921,'2005-08-19 04:47:48',781,234,'2005-08-25 00:07:48',2,'2006-02-15 21:30:53'),(12922,'2005-08-19 04:48:48',342,25,'2005-08-23 23:32:48',1,'2006-02-15 21:30:53'),(12923,'2005-08-19 04:50:20',1390,531,'2005-08-22 10:42:20',1,'2006-02-15 21:30:53'),(12924,'2005-08-19 04:51:47',3807,519,'2005-08-26 07:50:47',1,'2006-02-15 21:30:53'),(12925,'2005-08-19 04:59:01',3361,57,'2005-08-27 02:03:01',2,'2006-02-15 21:30:53'),(12926,'2005-08-19 05:00:16',23,336,'2005-08-26 06:12:16',2,'2006-02-15 21:30:53'),(12927,'2005-08-19 05:02:46',1171,223,'2005-08-23 01:08:46',1,'2006-02-15 21:30:53'),(12928,'2005-08-19 05:04:09',4531,353,'2005-08-24 09:09:09',2,'2006-02-15 21:30:53'),(12929,'2005-08-19 05:05:23',1531,310,'2005-08-25 04:37:23',1,'2006-02-15 21:30:53'),(12930,'2005-08-19 05:11:32',4410,414,'2005-08-22 02:20:32',2,'2006-02-15 21:30:53'),(12931,'2005-08-19 05:11:47',3070,407,'2005-08-21 00:59:47',1,'2006-02-15 21:30:53'),(12932,'2005-08-19 05:17:30',2295,416,'2005-08-21 09:24:30',1,'2006-02-15 21:30:53'),(12933,'2005-08-19 05:18:20',4103,589,'2005-08-27 00:13:20',1,'2006-02-15 21:30:53'),(12934,'2005-08-19 05:18:42',3242,591,'2005-08-24 10:42:42',1,'2006-02-15 21:30:53'),(12935,'2005-08-19 05:20:25',193,279,'2005-08-21 03:10:25',2,'2006-02-15 21:30:53'),(12936,'2005-08-19 05:25:06',654,387,'2005-08-28 08:21:06',1,'2006-02-15 21:30:53'),(12937,'2005-08-19 05:25:30',3826,348,'2005-08-22 10:40:30',2,'2006-02-15 21:30:53'),(12938,'2006-02-14 15:16:03',3987,28,NULL,1,'2006-02-15 21:30:53'),(12939,'2005-08-19 05:38:25',3375,181,'2005-08-23 23:52:25',1,'2006-02-15 21:30:53'),(12940,'2005-08-19 05:38:29',2222,340,'2005-08-20 08:15:29',1,'2006-02-15 21:30:53'),(12941,'2005-08-19 05:39:26',2951,195,'2005-08-22 09:50:26',2,'2006-02-15 21:30:53'),(12942,'2005-08-19 05:40:36',3938,103,'2005-08-27 02:04:36',1,'2006-02-15 21:30:53'),(12943,'2005-08-19 05:46:26',3930,547,'2005-08-22 03:26:26',2,'2006-02-15 21:30:53'),(12944,'2005-08-19 05:48:12',2956,148,'2005-08-28 10:10:12',1,'2006-02-15 21:30:53'),(12945,'2005-08-19 05:51:46',3638,312,'2005-08-23 11:22:46',2,'2006-02-15 21:30:53'),(12946,'2005-08-19 05:53:34',2066,444,'2005-08-20 07:30:34',1,'2006-02-15 21:30:53'),(12947,'2005-08-19 05:54:21',935,499,'2005-08-22 09:17:21',1,'2006-02-15 21:30:53'),(12948,'2005-08-19 05:55:14',4173,442,'2005-08-22 01:05:14',2,'2006-02-15 21:30:53'),(12949,'2005-08-19 05:55:52',4209,279,'2005-08-23 00:01:52',1,'2006-02-15 21:30:53'),(12950,'2005-08-19 05:55:58',1064,463,'2005-08-23 08:05:58',1,'2006-02-15 21:30:53'),(12951,'2005-08-19 05:56:44',2143,70,'2005-08-24 11:28:44',2,'2006-02-15 21:30:53'),(12952,'2005-08-19 06:00:52',2460,228,'2005-08-20 02:17:52',1,'2006-02-15 21:30:53'),(12953,'2005-08-19 06:04:07',3954,429,'2005-08-28 11:05:07',1,'2006-02-15 21:30:53'),(12954,'2005-08-19 06:04:34',3592,63,'2005-08-28 02:12:34',2,'2006-02-15 21:30:53'),(12955,'2005-08-19 06:05:58',2040,410,'2005-08-26 04:24:58',2,'2006-02-15 21:30:53'),(12956,'2005-08-19 06:06:26',3613,241,'2005-08-28 08:37:26',2,'2006-02-15 21:30:53'),(12957,'2005-08-19 06:12:44',2219,512,'2005-08-28 10:49:44',2,'2006-02-15 21:30:53'),(12958,'2005-08-19 06:19:21',4214,569,'2005-08-20 02:21:21',1,'2006-02-15 21:30:53'),(12959,'2006-02-14 15:16:03',1540,284,NULL,2,'2006-02-15 21:30:53'),(12960,'2005-08-19 06:21:52',3498,152,'2005-08-25 04:16:52',1,'2006-02-15 21:30:53'),(12961,'2005-08-19 06:22:37',4529,386,'2005-08-23 00:49:37',1,'2006-02-15 21:30:53'),(12962,'2005-08-19 06:22:48',575,171,'2005-08-27 07:47:48',1,'2006-02-15 21:30:53'),(12963,'2005-08-19 06:26:04',1521,2,'2005-08-23 11:37:04',2,'2006-02-15 21:30:53'),(12964,'2005-08-19 06:29:13',2854,142,'2005-08-22 12:23:13',2,'2006-02-15 21:30:53'),(12965,'2005-08-19 06:33:00',4308,430,'2005-08-22 02:02:00',1,'2006-02-15 21:30:53'),(12966,'2005-08-19 06:37:48',3196,69,'2005-08-26 03:59:48',2,'2006-02-15 21:30:53'),(12967,'2005-08-19 06:37:51',3404,170,'2005-08-25 06:58:51',2,'2006-02-15 21:30:53'),(12968,'2005-08-19 06:38:18',3108,166,'2005-08-20 08:29:18',1,'2006-02-15 21:30:53'),(12969,'2005-08-19 06:38:59',191,224,'2005-08-25 09:09:59',2,'2006-02-15 21:30:53'),(12970,'2006-02-14 15:16:03',3999,216,NULL,1,'2006-02-15 21:30:53'),(12971,'2005-08-19 06:42:43',3504,492,'2005-08-23 10:49:43',2,'2006-02-15 21:30:53'),(12972,'2005-08-19 06:43:28',1218,55,'2005-08-27 11:30:28',1,'2006-02-15 21:30:53'),(12973,'2005-08-19 06:48:11',128,163,'2005-08-22 07:18:11',2,'2006-02-15 21:30:53'),(12974,'2005-08-19 06:51:02',3599,218,'2005-08-25 11:48:02',2,'2006-02-15 21:30:53'),(12975,'2005-08-19 06:51:19',3300,236,'2005-08-25 04:22:19',1,'2006-02-15 21:30:53'),(12976,'2005-08-19 06:52:58',66,592,'2005-08-26 11:23:58',2,'2006-02-15 21:30:53'),(12977,'2005-08-19 06:55:33',2004,388,'2005-08-27 07:38:33',2,'2006-02-15 21:30:53'),(12978,'2005-08-19 06:57:27',3252,167,'2005-08-20 09:10:27',2,'2006-02-15 21:30:53'),(12979,'2005-08-19 07:00:35',1227,267,'2005-08-21 06:12:35',2,'2006-02-15 21:30:53'),(12980,'2005-08-19 07:03:14',1854,144,'2005-08-26 05:07:14',1,'2006-02-15 21:30:53'),(12981,'2005-08-19 07:04:00',3925,481,'2005-08-21 09:17:00',1,'2006-02-15 21:30:53'),(12982,'2005-08-19 07:06:34',1258,44,'2005-08-21 06:53:34',1,'2006-02-15 21:30:53'),(12983,'2005-08-19 07:06:51',406,148,'2005-08-28 10:35:51',2,'2006-02-15 21:30:53'),(12984,'2005-08-19 07:06:51',4211,537,'2005-08-22 04:04:51',1,'2006-02-15 21:30:53'),(12985,'2005-08-19 07:08:05',4133,83,'2005-08-24 02:25:05',1,'2006-02-15 21:30:53'),(12986,'2005-08-19 07:09:36',1145,210,'2005-08-22 05:01:36',1,'2006-02-15 21:30:53'),(12987,'2005-08-19 07:11:44',3665,134,'2005-08-20 04:17:44',1,'2006-02-15 21:30:53'),(12988,'2006-02-14 15:16:03',81,236,NULL,2,'2006-02-15 21:30:53'),(12989,'2005-08-19 07:19:04',2929,306,'2005-08-21 10:58:04',1,'2006-02-15 21:30:53'),(12990,'2005-08-19 07:20:39',1825,360,'2005-08-21 12:31:39',2,'2006-02-15 21:30:53'),(12991,'2005-08-19 07:21:24',2227,126,'2005-08-21 04:31:24',2,'2006-02-15 21:30:53'),(12992,'2005-08-19 07:23:06',3022,597,'2005-08-23 06:11:06',2,'2006-02-15 21:30:53'),(12993,'2005-08-19 07:24:03',4225,484,'2005-08-26 07:15:03',2,'2006-02-15 21:30:53'),(12994,'2005-08-19 07:26:10',3809,506,'2005-08-20 07:02:10',2,'2006-02-15 21:30:53'),(12995,'2005-08-19 07:26:30',2069,566,'2005-08-25 12:47:30',2,'2006-02-15 21:30:53'),(12996,'2005-08-19 07:31:32',4445,380,'2005-08-25 11:59:32',1,'2006-02-15 21:30:53'),(12997,'2005-08-19 07:31:46',1661,311,'2005-08-24 09:20:46',2,'2006-02-15 21:30:53'),(12998,'2005-08-19 07:32:16',2301,354,'2005-08-24 01:56:16',2,'2006-02-15 21:30:53'),(12999,'2005-08-19 07:34:53',661,24,'2005-08-26 03:57:53',1,'2006-02-15 21:30:53'),(13000,'2005-08-19 07:36:42',2341,141,'2005-08-22 08:50:42',1,'2006-02-15 21:30:53'),(13001,'2005-08-19 07:36:44',2505,254,'2005-08-22 13:06:44',1,'2006-02-15 21:30:53'),(13002,'2005-08-19 07:37:58',3892,477,'2005-08-26 11:32:58',2,'2006-02-15 21:30:53'),(13003,'2005-08-19 07:39:29',3431,451,'2005-08-23 05:48:29',2,'2006-02-15 21:30:53'),(13004,'2005-08-19 07:40:08',771,442,'2005-08-20 11:49:08',1,'2006-02-15 21:30:53'),(13005,'2005-08-19 07:45:42',3417,104,'2005-08-20 12:45:42',2,'2006-02-15 21:30:53'),(13006,'2005-08-19 07:47:16',3157,134,'2005-08-21 06:17:16',1,'2006-02-15 21:30:53'),(13007,'2005-08-19 07:47:43',4280,430,'2005-08-26 02:48:43',2,'2006-02-15 21:30:53'),(13008,'2006-02-14 15:16:03',1838,181,NULL,1,'2006-02-15 21:30:53'),(13009,'2005-08-19 07:50:35',677,376,'2005-08-21 06:04:35',1,'2006-02-15 21:30:53'),(13010,'2005-08-19 07:52:21',825,413,'2005-08-27 12:51:21',1,'2006-02-15 21:30:53'),(13011,'2005-08-19 07:53:58',1998,529,'2005-08-24 12:00:58',1,'2006-02-15 21:30:53'),(13012,'2005-08-19 07:54:59',1690,145,'2005-08-26 09:50:59',2,'2006-02-15 21:30:53'),(13013,'2005-08-19 07:55:51',841,293,'2005-08-26 05:14:51',1,'2006-02-15 21:30:53'),(13014,'2005-08-19 07:56:08',3400,344,'2005-08-21 10:20:08',2,'2006-02-15 21:30:53'),(13015,'2005-08-19 07:56:51',3461,126,'2005-08-28 07:05:51',2,'2006-02-15 21:30:53'),(13016,'2005-08-19 07:57:14',3095,175,'2005-08-23 03:29:14',1,'2006-02-15 21:30:53'),(13017,'2005-08-19 08:02:24',2160,104,'2005-08-26 07:32:24',1,'2006-02-15 21:30:53'),(13018,'2005-08-19 08:04:50',2122,168,'2005-08-26 11:46:50',1,'2006-02-15 21:30:53'),(13019,'2005-08-19 08:07:43',2827,597,'2005-08-20 12:09:43',2,'2006-02-15 21:30:53'),(13020,'2005-08-19 08:07:50',4501,92,'2005-08-28 11:42:50',1,'2006-02-15 21:30:53'),(13021,'2005-08-19 08:08:04',1242,309,'2005-08-26 12:04:04',2,'2006-02-15 21:30:53'),(13022,'2006-02-14 15:16:03',2266,336,NULL,2,'2006-02-15 21:30:53'),(13023,'2005-08-19 08:13:54',1566,69,'2005-08-27 13:18:54',1,'2006-02-15 21:30:53'),(13024,'2005-08-19 08:19:21',2917,401,'2005-08-27 05:18:21',1,'2006-02-15 21:30:53'),(13025,'2006-02-14 15:16:03',4066,269,NULL,1,'2006-02-15 21:30:53'),(13026,'2005-08-19 08:22:45',3026,79,'2005-08-21 09:31:45',1,'2006-02-15 21:30:53'),(13027,'2005-08-19 08:25:16',3756,128,'2005-08-25 13:42:16',1,'2006-02-15 21:30:53'),(13028,'2005-08-19 08:27:23',2165,371,'2005-08-24 03:46:23',1,'2006-02-15 21:30:53'),(13029,'2005-08-19 08:28:04',3283,293,'2005-08-22 12:25:04',2,'2006-02-15 21:30:53'),(13030,'2005-08-19 08:28:11',2614,240,'2005-08-24 07:20:11',1,'2006-02-15 21:30:53'),(13031,'2005-08-19 08:30:04',1525,567,'2005-08-23 09:35:04',2,'2006-02-15 21:30:53'),(13032,'2005-08-19 08:31:50',3699,82,'2005-08-23 04:00:50',2,'2006-02-15 21:30:53'),(13033,'2005-08-19 08:34:39',1682,344,'2005-08-28 10:13:39',1,'2006-02-15 21:30:53'),(13034,'2005-08-19 08:41:29',990,387,'2005-08-20 07:36:29',2,'2006-02-15 21:30:53'),(13035,'2005-08-19 08:46:45',4082,135,'2005-08-22 11:42:45',1,'2006-02-15 21:30:53'),(13036,'2005-08-19 08:48:37',1469,20,'2005-08-22 04:13:37',2,'2006-02-15 21:30:53'),(13037,'2005-08-19 08:53:57',65,275,'2005-08-28 08:56:57',2,'2006-02-15 21:30:53'),(13038,'2005-08-19 08:55:16',2226,532,'2005-08-25 12:23:16',2,'2006-02-15 21:30:53'),(13039,'2005-08-19 08:55:19',1952,370,'2005-08-20 07:39:19',2,'2006-02-15 21:30:53'),(13040,'2005-08-19 09:04:24',4113,425,'2005-08-23 12:36:24',2,'2006-02-15 21:30:53'),(13041,'2005-08-19 09:05:38',1576,462,'2005-08-27 06:34:38',1,'2006-02-15 21:30:53'),(13042,'2005-08-19 09:06:08',1047,414,'2005-08-22 13:46:08',2,'2006-02-15 21:30:53'),(13043,'2005-08-19 09:07:13',24,127,'2005-08-27 07:49:13',1,'2006-02-15 21:30:53'),(13044,'2005-08-19 09:14:31',809,142,'2005-08-20 11:16:31',1,'2006-02-15 21:30:53'),(13045,'2005-08-19 09:17:35',389,254,'2005-08-23 12:04:35',1,'2006-02-15 21:30:53'),(13046,'2005-08-19 09:21:10',965,37,'2005-08-26 13:00:10',2,'2006-02-15 21:30:53'),(13047,'2005-08-19 09:24:49',2704,394,'2005-08-24 11:06:49',2,'2006-02-15 21:30:53'),(13048,'2005-08-19 09:25:06',1029,486,'2005-08-28 11:18:06',2,'2006-02-15 21:30:53'),(13049,'2005-08-19 09:25:40',4122,53,'2005-08-27 10:19:40',2,'2006-02-15 21:30:53'),(13050,'2005-08-19 09:31:23',3682,131,'2005-08-26 06:56:23',2,'2006-02-15 21:30:53'),(13051,'2005-08-19 09:31:33',4064,90,'2005-08-28 06:15:33',1,'2006-02-15 21:30:53'),(13052,'2005-08-19 09:31:42',3036,502,'2005-08-28 15:11:42',2,'2006-02-15 21:30:53'),(13053,'2005-08-19 09:31:48',2044,140,'2005-08-28 07:51:48',2,'2006-02-15 21:30:53'),(13054,'2005-08-19 09:34:02',2983,325,'2005-08-23 05:25:02',2,'2006-02-15 21:30:53'),(13055,'2005-08-19 09:36:28',3580,485,'2005-08-24 05:53:28',2,'2006-02-15 21:30:53'),(13056,'2006-02-14 15:16:03',3751,115,NULL,2,'2006-02-15 21:30:53'),(13057,'2005-08-19 09:40:05',876,105,'2005-08-28 13:22:05',2,'2006-02-15 21:30:53'),(13058,'2005-08-19 09:40:53',2437,24,'2005-08-26 05:48:53',2,'2006-02-15 21:30:53'),(13059,'2005-08-19 09:42:01',3810,341,'2005-08-21 12:07:01',1,'2006-02-15 21:30:53'),(13060,'2005-08-19 09:43:25',507,22,'2005-08-28 15:22:25',1,'2006-02-15 21:30:53'),(13061,'2005-08-19 09:43:39',730,576,'2005-08-24 10:03:39',1,'2006-02-15 21:30:53'),(13062,'2005-08-19 09:44:17',1790,385,'2005-08-27 11:42:17',1,'2006-02-15 21:30:53'),(13063,'2005-08-19 09:45:41',1192,5,'2005-08-24 09:11:41',2,'2006-02-15 21:30:53'),(13064,'2005-08-19 09:46:53',4131,588,'2005-08-21 08:29:53',1,'2006-02-15 21:30:53'),(13065,'2005-08-19 09:48:52',1887,518,'2005-08-22 07:12:52',1,'2006-02-15 21:30:53'),(13066,'2005-08-19 09:50:39',3730,336,'2005-08-22 14:01:39',1,'2006-02-15 21:30:53'),(13067,'2005-08-19 09:51:17',3825,172,'2005-08-25 09:58:17',2,'2006-02-15 21:30:53'),(13068,'2005-08-19 09:55:16',3019,1,'2005-08-20 14:44:16',2,'2006-02-15 21:30:53'),(13069,'2005-08-19 09:55:20',368,299,'2005-08-24 04:10:20',2,'2006-02-15 21:30:53'),(13070,'2005-08-19 09:56:23',2214,235,'2005-08-24 09:08:23',2,'2006-02-15 21:30:53'),(13071,'2005-08-19 10:01:07',527,578,'2005-08-26 14:26:07',1,'2006-02-15 21:30:53'),(13072,'2005-08-19 10:03:30',2313,447,'2005-08-22 14:27:30',2,'2006-02-15 21:30:53'),(13073,'2005-08-19 10:05:38',855,506,'2005-08-26 07:37:38',2,'2006-02-15 21:30:53'),(13074,'2005-08-19 10:06:53',3266,341,'2005-08-28 09:56:53',2,'2006-02-15 21:30:53'),(13075,'2005-08-19 10:10:10',4125,224,'2005-08-21 08:44:10',2,'2006-02-15 21:30:53'),(13076,'2005-08-19 10:10:26',1226,201,'2005-08-22 05:41:26',1,'2006-02-15 21:30:53'),(13077,'2005-08-19 10:15:19',433,241,'2005-08-21 06:51:19',2,'2006-02-15 21:30:53'),(13078,'2005-08-19 10:16:43',4104,479,'2005-08-27 11:35:43',2,'2006-02-15 21:30:53'),(13079,'2006-02-14 15:16:03',733,107,NULL,1,'2006-02-15 21:30:53'),(13080,'2005-08-19 10:18:00',4222,452,'2005-08-22 06:37:00',2,'2006-02-15 21:30:53'),(13081,'2005-08-19 10:19:06',3077,170,'2005-08-20 05:49:06',1,'2006-02-15 21:30:53'),(13082,'2005-08-19 10:19:19',2117,387,'2005-08-28 05:02:19',1,'2006-02-15 21:30:53'),(13083,'2005-08-19 10:26:45',3469,455,'2005-08-23 05:31:45',2,'2006-02-15 21:30:53'),(13084,'2005-08-19 10:27:25',3792,204,'2005-08-26 07:32:25',2,'2006-02-15 21:30:53'),(13085,'2005-08-19 10:28:22',360,215,'2005-08-22 07:37:22',2,'2006-02-15 21:30:53'),(13086,'2005-08-19 10:32:28',3712,350,'2005-08-26 07:57:28',2,'2006-02-15 21:30:53'),(13087,'2005-08-19 10:33:52',2693,171,'2005-08-27 09:15:52',2,'2006-02-15 21:30:53'),(13088,'2005-08-19 10:36:11',4281,457,'2005-08-21 09:12:11',1,'2006-02-15 21:30:53'),(13089,'2005-08-19 10:38:56',1783,63,'2005-08-24 12:41:56',1,'2006-02-15 21:30:53'),(13090,'2005-08-19 10:39:54',1447,52,'2005-08-28 10:31:54',1,'2006-02-15 21:30:53'),(13091,'2005-08-19 10:40:10',1815,127,'2005-08-23 09:03:10',1,'2006-02-15 21:30:53'),(13092,'2005-08-19 10:41:09',4359,480,'2005-08-25 05:11:09',2,'2006-02-15 21:30:53'),(13093,'2005-08-19 10:46:16',1667,160,'2005-08-26 08:05:16',1,'2006-02-15 21:30:53'),(13094,'2005-08-19 10:47:58',3178,494,'2005-08-21 06:20:58',1,'2006-02-15 21:30:53'),(13095,'2005-08-19 10:48:10',520,508,'2005-08-28 06:15:10',1,'2006-02-15 21:30:53'),(13096,'2005-08-19 10:49:03',420,13,'2005-08-21 05:33:03',1,'2006-02-15 21:30:53'),(13097,'2005-08-19 10:50:43',4194,157,'2005-08-24 11:10:43',2,'2006-02-15 21:30:53'),(13098,'2005-08-19 10:51:59',3770,51,'2005-08-24 11:27:59',1,'2006-02-15 21:30:53'),(13099,'2005-08-19 10:55:19',969,436,'2005-08-27 10:54:19',1,'2006-02-15 21:30:53'),(13100,'2005-08-19 10:55:45',916,451,'2005-08-25 12:28:45',1,'2006-02-15 21:30:53'),(13101,'2005-08-19 11:01:54',1804,39,'2005-08-27 16:06:54',2,'2006-02-15 21:30:53'),(13102,'2005-08-19 11:02:03',2885,285,'2005-08-28 13:05:03',2,'2006-02-15 21:30:53'),(13103,'2005-08-19 11:05:51',1751,274,'2005-08-26 09:16:51',2,'2006-02-15 21:30:53'),(13104,'2005-08-19 11:06:06',310,591,'2005-08-21 13:50:06',2,'2006-02-15 21:30:53'),(13105,'2005-08-19 11:06:16',729,279,'2005-08-27 15:21:16',1,'2006-02-15 21:30:53'),(13106,'2006-02-14 15:16:03',3212,440,NULL,1,'2006-02-15 21:30:53'),(13107,'2005-08-19 11:13:58',3870,356,'2005-08-20 15:03:58',2,'2006-02-15 21:30:53'),(13108,'2006-02-14 15:16:03',3630,73,NULL,1,'2006-02-15 21:30:53'),(13109,'2005-08-19 11:23:20',46,259,'2005-08-25 17:05:20',1,'2006-02-15 21:30:53'),(13110,'2005-08-19 11:24:37',62,447,'2005-08-21 05:48:37',1,'2006-02-15 21:30:53'),(13111,'2005-08-19 11:25:10',580,26,'2005-08-21 05:52:10',2,'2006-02-15 21:30:53'),(13112,'2005-08-19 11:27:10',2074,259,'2005-08-22 05:32:10',1,'2006-02-15 21:30:53'),(13113,'2005-08-19 11:27:20',2393,573,'2005-08-23 12:40:20',1,'2006-02-15 21:30:53'),(13114,'2005-08-19 11:27:32',4342,550,'2005-08-28 11:21:32',2,'2006-02-15 21:30:53'),(13115,'2005-08-19 11:27:43',1961,84,'2005-08-20 10:58:43',1,'2006-02-15 21:30:53'),(13116,'2005-08-19 11:31:41',1544,150,'2005-08-27 16:05:41',1,'2006-02-15 21:30:53'),(13117,'2005-08-19 11:33:20',3430,385,'2005-08-20 11:55:20',2,'2006-02-15 21:30:53'),(13118,'2005-08-19 11:39:58',470,181,'2005-08-25 14:44:58',1,'2006-02-15 21:30:53'),(13119,'2005-08-19 11:44:59',1401,240,'2005-08-20 12:30:59',2,'2006-02-15 21:30:53'),(13120,'2005-08-19 11:47:38',2273,314,'2005-08-26 08:20:38',2,'2006-02-15 21:30:53'),(13121,'2005-08-19 11:51:39',3517,251,'2005-08-22 11:50:39',2,'2006-02-15 21:30:53'),(13122,'2005-08-19 11:53:49',3319,277,'2005-08-26 16:01:49',2,'2006-02-15 21:30:53'),(13123,'2005-08-19 11:55:13',2804,220,'2005-08-21 05:55:13',2,'2006-02-15 21:30:53'),(13124,'2005-08-19 11:55:59',2105,78,'2005-08-26 06:01:59',2,'2006-02-15 21:30:53'),(13125,'2005-08-19 11:57:49',3722,192,'2005-08-26 07:53:49',1,'2006-02-15 21:30:53'),(13126,'2005-08-19 12:00:28',1392,253,'2005-08-28 17:27:28',1,'2006-02-15 21:30:53'),(13127,'2005-08-19 12:04:03',2582,178,'2005-08-27 13:56:03',1,'2006-02-15 21:30:53'),(13128,'2005-08-19 12:04:16',485,206,'2005-08-26 16:06:16',2,'2006-02-15 21:30:53'),(13129,'2005-08-19 12:05:04',4455,274,'2005-08-26 10:24:04',1,'2006-02-15 21:30:53'),(13130,'2005-08-19 12:06:42',2006,254,'2005-08-23 12:08:42',1,'2006-02-15 21:30:53'),(13131,'2005-08-19 12:08:13',1466,480,'2005-08-27 13:43:13',2,'2006-02-15 21:30:53'),(13132,'2005-08-19 12:10:57',1748,529,'2005-08-27 12:22:57',2,'2006-02-15 21:30:53'),(13133,'2005-08-19 12:11:03',1635,523,'2005-08-28 12:36:03',2,'2006-02-15 21:30:53'),(13134,'2005-08-19 12:14:14',1354,184,'2005-08-20 11:52:14',1,'2006-02-15 21:30:53'),(13135,'2005-08-19 12:22:52',1585,361,'2005-08-21 14:04:52',2,'2006-02-15 21:30:53'),(13136,'2005-08-19 12:24:23',2532,50,'2005-08-28 08:37:23',2,'2006-02-15 21:30:53'),(13137,'2005-08-19 12:26:32',4431,20,'2005-08-22 13:26:32',1,'2006-02-15 21:30:53'),(13138,'2005-08-19 12:30:01',3138,214,'2005-08-21 06:35:01',2,'2006-02-15 21:30:53'),(13139,'2005-08-19 12:32:10',2099,554,'2005-08-24 12:12:10',1,'2006-02-15 21:30:53'),(13140,'2005-08-19 12:35:56',4210,323,'2005-08-27 18:24:56',2,'2006-02-15 21:30:53'),(13141,'2005-08-19 12:41:41',4545,376,'2005-08-21 08:17:41',2,'2006-02-15 21:30:53'),(13142,'2005-08-19 12:42:28',1404,269,'2005-08-26 14:52:28',1,'2006-02-15 21:30:53'),(13143,'2005-08-19 12:44:38',1655,371,'2005-08-25 10:59:38',2,'2006-02-15 21:30:53'),(13144,'2005-08-19 12:45:55',3766,456,'2005-08-27 10:37:55',2,'2006-02-15 21:30:53'),(13145,'2005-08-19 12:53:53',1383,72,'2005-08-23 08:06:53',1,'2006-02-15 21:30:53'),(13146,'2005-08-19 12:54:42',1463,116,'2005-08-26 07:31:42',1,'2006-02-15 21:30:53'),(13147,'2005-08-19 12:55:09',3490,37,'2005-08-22 18:10:09',1,'2006-02-15 21:30:53'),(13148,'2005-08-19 12:55:30',1762,137,'2005-08-21 11:01:30',1,'2006-02-15 21:30:53'),(13149,'2005-08-19 13:07:12',1436,40,'2005-08-28 18:12:12',1,'2006-02-15 21:30:53'),(13150,'2005-08-19 13:08:19',1514,457,'2005-08-25 18:00:19',1,'2006-02-15 21:30:53'),(13151,'2005-08-19 13:08:23',3045,16,'2005-08-20 12:38:23',2,'2006-02-15 21:30:53'),(13152,'2005-08-19 13:09:32',3571,597,'2005-08-25 14:47:32',1,'2006-02-15 21:30:53'),(13153,'2005-08-19 13:09:47',3896,431,'2005-08-23 17:35:47',2,'2006-02-15 21:30:53'),(13154,'2005-08-19 13:09:54',2465,255,'2005-08-26 16:40:54',1,'2006-02-15 21:30:53'),(13155,'2005-08-19 13:10:23',290,442,'2005-08-25 19:07:23',2,'2006-02-15 21:30:53'),(13156,'2005-08-19 13:10:42',770,512,'2005-08-25 15:08:42',2,'2006-02-15 21:30:53'),(13157,'2005-08-19 13:12:28',4391,592,'2005-08-20 10:41:28',1,'2006-02-15 21:30:53'),(13158,'2005-08-19 13:18:10',944,327,'2005-08-25 09:27:10',1,'2006-02-15 21:30:53'),(13159,'2005-08-19 13:19:59',2300,497,'2005-08-21 09:22:59',2,'2006-02-15 21:30:53'),(13160,'2005-08-19 13:21:04',410,484,'2005-08-22 18:49:04',1,'2006-02-15 21:30:53'),(13161,'2006-02-14 15:16:03',986,175,NULL,1,'2006-02-15 21:30:53'),(13162,'2005-08-19 13:28:26',1845,478,'2005-08-24 17:37:26',1,'2006-02-15 21:30:53'),(13163,'2005-08-19 13:29:46',3068,57,'2005-08-22 07:48:46',2,'2006-02-15 21:30:53'),(13164,'2005-08-19 13:30:55',1104,145,'2005-08-26 10:12:55',2,'2006-02-15 21:30:53'),(13165,'2005-08-19 13:34:10',138,289,'2005-08-21 18:33:10',2,'2006-02-15 21:30:53'),(13166,'2005-08-19 13:36:28',4386,504,'2005-08-22 07:57:28',1,'2006-02-15 21:30:53'),(13167,'2005-08-19 13:36:41',557,120,'2005-08-23 15:29:41',2,'2006-02-15 21:30:53'),(13168,'2005-08-19 13:37:28',2210,186,'2005-08-27 17:54:28',2,'2006-02-15 21:30:53'),(13169,'2005-08-19 13:43:35',1709,141,'2005-08-26 09:31:35',1,'2006-02-15 21:30:53'),(13170,'2005-08-19 13:45:48',1072,176,'2005-08-27 11:00:48',2,'2006-02-15 21:30:53'),(13171,'2005-08-19 13:48:54',1765,122,'2005-08-27 18:57:54',1,'2006-02-15 21:30:53'),(13172,'2005-08-19 13:49:07',1301,298,'2005-08-20 19:39:07',2,'2006-02-15 21:30:53'),(13173,'2005-08-19 13:50:36',1304,29,'2005-08-26 12:34:36',2,'2006-02-15 21:30:53'),(13174,'2005-08-19 13:52:50',2303,482,'2005-08-22 14:43:50',2,'2006-02-15 21:30:53'),(13175,'2005-08-19 13:54:53',3187,239,'2005-08-20 16:25:53',2,'2006-02-15 21:30:53'),(13176,'2005-08-19 13:56:54',2269,1,'2005-08-23 08:50:54',2,'2006-02-15 21:30:53'),(13177,'2005-08-19 13:56:58',3172,126,'2005-08-23 13:13:58',2,'2006-02-15 21:30:53'),(13178,'2006-02-14 15:16:03',693,394,NULL,1,'2006-02-15 21:30:53'),(13179,'2005-08-19 13:59:53',1624,104,'2005-08-25 12:10:53',1,'2006-02-15 21:30:53'),(13180,'2005-08-19 14:00:38',3443,322,'2005-08-20 09:56:38',1,'2006-02-15 21:30:53'),(13181,'2005-08-19 14:00:56',1256,128,'2005-08-24 13:52:56',2,'2006-02-15 21:30:53'),(13182,'2006-02-14 15:16:03',364,496,NULL,2,'2006-02-15 21:30:53'),(13183,'2005-08-19 14:09:26',2404,301,'2005-08-28 08:44:26',2,'2006-02-15 21:30:53'),(13184,'2005-08-19 14:16:18',4395,393,'2005-08-20 08:44:18',1,'2006-02-15 21:30:53'),(13185,'2005-08-19 14:22:30',241,174,'2005-08-20 10:13:30',2,'2006-02-15 21:30:53'),(13186,'2005-08-19 14:23:19',2802,176,'2005-08-28 11:26:19',1,'2006-02-15 21:30:53'),(13187,'2005-08-19 14:24:48',1944,543,'2005-08-20 19:37:48',1,'2006-02-15 21:30:53'),(13188,'2005-08-19 14:27:03',583,472,'2005-08-28 09:15:03',2,'2006-02-15 21:30:53'),(13189,'2005-08-19 14:27:16',3444,368,'2005-08-28 10:34:16',1,'2006-02-15 21:30:53'),(13190,'2005-08-19 14:27:59',4316,290,'2005-08-26 13:45:59',1,'2006-02-15 21:30:53'),(13191,'2005-08-19 14:28:48',2753,371,'2005-08-23 12:53:48',2,'2006-02-15 21:30:53'),(13192,'2005-08-19 14:30:06',966,532,'2005-08-27 15:20:06',1,'2006-02-15 21:30:53'),(13193,'2005-08-19 14:33:45',523,118,'2005-08-28 08:46:45',2,'2006-02-15 21:30:53'),(13194,'2005-08-19 14:34:12',2473,58,'2005-08-26 10:18:12',2,'2006-02-15 21:30:53'),(13195,'2005-08-19 14:39:14',2537,565,'2005-08-24 10:30:14',2,'2006-02-15 21:30:53'),(13196,'2005-08-19 14:40:32',458,202,'2005-08-26 18:15:32',2,'2006-02-15 21:30:53'),(13197,'2005-08-19 14:44:03',3190,358,'2005-08-22 10:11:03',1,'2006-02-15 21:30:53'),(13198,'2005-08-19 14:47:18',4273,169,'2005-08-21 18:09:18',2,'2006-02-15 21:30:53'),(13199,'2005-08-19 14:53:22',4291,339,'2005-08-27 19:03:22',2,'2006-02-15 21:30:53'),(13200,'2005-08-19 14:55:58',2746,577,'2005-08-27 11:35:58',2,'2006-02-15 21:30:53'),(13201,'2005-08-19 14:56:05',111,508,'2005-08-25 14:37:05',1,'2006-02-15 21:30:53'),(13202,'2005-08-19 14:58:30',3546,381,'2005-08-27 17:10:30',1,'2006-02-15 21:30:53'),(13203,'2005-08-19 15:00:58',804,257,'2005-08-27 15:38:58',2,'2006-02-15 21:30:53'),(13204,'2005-08-19 15:02:48',4524,152,'2005-08-24 18:07:48',1,'2006-02-15 21:30:53'),(13205,'2005-08-19 15:05:26',2616,495,'2005-08-25 10:41:26',2,'2006-02-15 21:30:53'),(13206,'2005-08-19 15:05:34',2477,504,'2005-08-21 20:37:34',2,'2006-02-15 21:30:53'),(13207,'2005-08-19 15:14:38',674,58,'2005-08-27 16:09:38',1,'2006-02-15 21:30:53'),(13208,'2005-08-19 15:18:55',609,435,'2005-08-24 11:59:55',1,'2006-02-15 21:30:53'),(13209,'2006-02-14 15:16:03',1574,5,NULL,2,'2006-02-15 21:30:53'),(13210,'2005-08-19 15:23:38',2789,487,'2005-08-21 11:57:38',1,'2006-02-15 21:30:53'),(13211,'2005-08-19 15:23:41',1968,289,'2005-08-22 16:58:41',1,'2006-02-15 21:30:53'),(13212,'2005-08-19 15:24:07',3691,158,'2005-08-24 21:03:07',1,'2006-02-15 21:30:53'),(13213,'2005-08-19 15:25:48',1546,13,'2005-08-22 09:32:48',1,'2006-02-15 21:30:53'),(13214,'2005-08-19 15:31:06',2675,157,'2005-08-20 19:58:06',2,'2006-02-15 21:30:53'),(13215,'2005-08-19 15:35:38',3740,460,'2005-08-27 12:16:38',1,'2006-02-15 21:30:53'),(13216,'2005-08-19 15:36:05',4335,422,'2005-08-25 19:03:05',2,'2006-02-15 21:30:53'),(13217,'2005-08-19 15:38:39',616,565,'2005-08-21 14:33:39',1,'2006-02-15 21:30:53'),(13218,'2005-08-19 15:39:39',4148,257,'2005-08-22 17:28:39',1,'2006-02-15 21:30:53'),(13219,'2005-08-19 15:40:28',2075,288,'2005-08-22 21:20:28',2,'2006-02-15 21:30:53'),(13220,'2005-08-19 15:42:32',1017,448,'2005-08-25 13:37:32',1,'2006-02-15 21:30:53'),(13221,'2005-08-19 15:45:47',120,468,'2005-08-26 21:10:47',1,'2006-02-15 21:30:53'),(13222,'2005-08-19 15:47:58',1656,91,'2005-08-26 12:43:58',1,'2006-02-15 21:30:53'),(13223,'2005-08-19 15:52:04',332,461,'2005-08-22 16:27:04',1,'2006-02-15 21:30:53'),(13224,'2005-08-19 15:52:13',3086,526,'2005-08-28 20:53:13',2,'2006-02-15 21:30:53'),(13225,'2005-08-19 15:54:33',1420,562,'2005-08-25 16:40:33',1,'2006-02-15 21:30:53'),(13226,'2005-08-19 16:05:36',2850,46,'2005-08-21 10:07:36',2,'2006-02-15 21:30:53'),(13227,'2005-08-19 16:05:38',2759,288,'2005-08-20 21:39:38',1,'2006-02-15 21:30:53'),(13228,'2005-08-19 16:08:16',2497,571,'2005-08-20 18:55:16',1,'2006-02-15 21:30:53'),(13229,'2005-08-19 16:08:33',634,283,'2005-08-22 19:54:33',2,'2006-02-15 21:30:53'),(13230,'2005-08-19 16:12:07',3645,151,'2005-08-21 12:19:07',1,'2006-02-15 21:30:53'),(13231,'2005-08-19 16:12:49',2126,280,'2005-08-27 17:14:49',2,'2006-02-15 21:30:53'),(13232,'2005-08-19 16:13:32',2370,206,'2005-08-28 14:42:32',2,'2006-02-15 21:30:53'),(13233,'2005-08-19 16:14:41',1057,279,'2005-08-24 21:13:41',1,'2006-02-15 21:30:53'),(13234,'2005-08-19 16:17:15',976,559,'2005-08-27 12:36:15',1,'2006-02-15 21:30:53'),(13235,'2005-08-19 16:17:53',3902,367,'2005-08-27 14:57:53',1,'2006-02-15 21:30:53'),(13236,'2005-08-19 16:18:24',4574,267,'2005-08-27 17:48:24',2,'2006-02-15 21:30:53'),(13237,'2005-08-19 16:18:36',1272,169,'2005-08-25 15:22:36',2,'2006-02-15 21:30:53'),(13238,'2005-08-19 16:20:56',985,348,'2005-08-23 15:51:56',2,'2006-02-15 21:30:53'),(13239,'2005-08-19 16:22:13',3296,541,'2005-08-23 19:26:13',1,'2006-02-15 21:30:53'),(13240,'2005-08-19 16:22:14',1411,179,'2005-08-20 13:24:14',1,'2006-02-15 21:30:53'),(13241,'2005-08-19 16:25:00',3106,33,'2005-08-26 12:27:00',2,'2006-02-15 21:30:53'),(13242,'2005-08-19 16:28:47',230,414,'2005-08-24 22:13:47',2,'2006-02-15 21:30:53'),(13243,'2005-08-19 16:33:16',355,251,'2005-08-25 13:19:16',2,'2006-02-15 21:30:53'),(13244,'2005-08-19 16:43:04',3246,298,'2005-08-22 15:21:04',2,'2006-02-15 21:30:53'),(13245,'2005-08-19 16:43:41',1001,261,'2005-08-20 21:17:41',1,'2006-02-15 21:30:53'),(13246,'2006-02-14 15:16:03',1849,411,NULL,2,'2006-02-15 21:30:53'),(13247,'2005-08-19 16:45:59',1271,24,'2005-08-25 15:25:59',1,'2006-02-15 21:30:53'),(13248,'2005-08-19 16:47:41',2864,559,'2005-08-28 18:11:41',2,'2006-02-15 21:30:53'),(13249,'2005-08-19 16:47:41',3084,377,'2005-08-20 13:30:41',1,'2006-02-15 21:30:53'),(13250,'2005-08-19 16:47:55',2524,448,'2005-08-26 16:54:55',2,'2006-02-15 21:30:53'),(13251,'2005-08-19 16:48:37',4216,111,'2005-08-20 16:33:37',1,'2006-02-15 21:30:53'),(13252,'2005-08-19 16:50:50',775,451,'2005-08-22 22:09:50',2,'2006-02-15 21:30:53'),(13253,'2005-08-19 16:53:56',472,399,'2005-08-20 11:38:56',2,'2006-02-15 21:30:53'),(13254,'2005-08-19 16:54:01',3412,532,'2005-08-27 19:50:01',2,'2006-02-15 21:30:53'),(13255,'2005-08-19 16:54:12',1101,150,'2005-08-28 17:00:12',1,'2006-02-15 21:30:53'),(13256,'2005-08-19 16:54:12',2719,289,'2005-08-28 16:54:12',1,'2006-02-15 21:30:53'),(13257,'2005-08-19 17:01:20',164,300,'2005-08-24 17:26:20',1,'2006-02-15 21:30:53'),(13258,'2005-08-19 17:05:37',2246,349,'2005-08-24 17:36:37',2,'2006-02-15 21:30:53'),(13259,'2005-08-19 17:08:53',2518,458,'2005-08-23 14:14:53',1,'2006-02-15 21:30:53'),(13260,'2005-08-19 17:09:22',578,251,'2005-08-24 21:31:22',2,'2006-02-15 21:30:53'),(13261,'2006-02-14 15:16:03',3538,417,NULL,1,'2006-02-15 21:30:53'),(13262,'2005-08-19 17:20:15',4483,184,'2005-08-26 18:28:15',2,'2006-02-15 21:30:53'),(13263,'2005-08-19 17:26:55',214,206,'2005-08-28 20:07:55',2,'2006-02-15 21:30:53'),(13264,'2005-08-19 17:27:10',1881,109,'2005-08-27 16:00:10',1,'2006-02-15 21:30:53'),(13265,'2005-08-19 17:29:00',3933,314,'2005-08-20 12:59:00',2,'2006-02-15 21:30:53'),(13266,'2005-08-19 17:31:20',1326,571,'2005-08-21 11:41:20',2,'2006-02-15 21:30:53'),(13267,'2005-08-19 17:31:36',550,335,'2005-08-21 13:47:36',1,'2006-02-15 21:30:53'),(13268,'2005-08-19 17:33:50',1166,255,'2005-08-25 17:15:50',2,'2006-02-15 21:30:53'),(13269,'2005-08-19 17:34:00',2382,461,'2005-08-20 15:17:00',2,'2006-02-15 21:30:53'),(13270,'2005-08-19 17:41:16',405,159,'2005-08-23 20:22:16',2,'2006-02-15 21:30:53'),(13271,'2005-08-19 17:42:06',3872,242,'2005-08-27 18:39:06',2,'2006-02-15 21:30:53'),(13272,'2005-08-19 17:49:13',2531,145,'2005-08-23 15:49:13',2,'2006-02-15 21:30:53'),(13273,'2005-08-19 17:49:13',4181,433,'2005-08-21 14:15:13',1,'2006-02-15 21:30:53'),(13274,'2005-08-19 17:50:03',704,272,'2005-08-20 14:39:03',2,'2006-02-15 21:30:53'),(13275,'2005-08-19 17:53:38',710,377,'2005-08-23 16:29:38',2,'2006-02-15 21:30:53'),(13276,'2005-08-19 17:53:42',625,516,'2005-08-28 20:49:42',2,'2006-02-15 21:30:53'),(13277,'2005-08-19 17:57:35',3820,316,'2005-08-25 15:45:35',2,'2006-02-15 21:30:53'),(13278,'2005-08-19 17:57:53',2691,282,'2005-08-22 23:16:53',1,'2006-02-15 21:30:53'),(13279,'2005-08-19 18:02:18',2472,343,'2005-08-24 22:15:18',2,'2006-02-15 21:30:53'),(13280,'2005-08-19 18:02:51',218,368,'2005-08-21 23:17:51',2,'2006-02-15 21:30:53'),(13281,'2005-08-19 18:07:47',113,220,'2005-08-20 21:51:47',2,'2006-02-15 21:30:53'),(13282,'2005-08-19 18:08:18',4373,59,'2005-08-24 14:08:18',1,'2006-02-15 21:30:53'),(13283,'2005-08-19 18:10:19',2602,180,'2005-08-23 16:09:19',2,'2006-02-15 21:30:53'),(13284,'2005-08-19 18:12:31',2128,338,'2005-08-25 21:26:31',2,'2006-02-15 21:30:53'),(13285,'2005-08-19 18:18:44',2139,182,'2005-08-20 12:33:44',1,'2006-02-15 21:30:53'),(13286,'2005-08-19 18:28:07',2685,245,'2005-08-22 17:23:07',2,'2006-02-15 21:30:53'),(13287,'2005-08-19 18:28:24',2716,569,'2005-08-26 20:13:24',2,'2006-02-15 21:30:53'),(13288,'2005-08-19 18:30:10',3558,162,'2005-08-20 19:20:10',2,'2006-02-15 21:30:53'),(13289,'2005-08-19 18:31:30',3527,497,'2005-08-20 13:43:30',1,'2006-02-15 21:30:53'),(13290,'2005-08-19 18:31:50',4174,23,'2005-08-25 15:49:50',2,'2006-02-15 21:30:53'),(13291,'2005-08-19 18:32:11',1631,243,'2005-08-20 18:22:11',2,'2006-02-15 21:30:53'),(13292,'2005-08-19 18:35:32',1336,171,'2005-08-22 00:27:32',1,'2006-02-15 21:30:53'),(13293,'2005-08-19 18:35:52',380,399,'2005-08-23 17:18:52',2,'2006-02-15 21:30:53'),(13294,'2005-08-19 18:36:35',156,534,'2005-08-20 13:57:35',1,'2006-02-15 21:30:53'),(13295,'2006-02-14 15:16:03',2408,229,NULL,1,'2006-02-15 21:30:53'),(13296,'2005-08-19 18:43:53',1728,300,'2005-08-21 23:30:53',2,'2006-02-15 21:30:53'),(13297,'2005-08-19 18:45:49',3818,359,'2005-08-22 14:58:49',2,'2006-02-15 21:30:53'),(13298,'2006-02-14 15:16:03',2133,361,NULL,2,'2006-02-15 21:30:53'),(13299,'2005-08-19 18:46:33',4385,373,'2005-08-22 20:45:33',1,'2006-02-15 21:30:53'),(13300,'2005-08-19 18:46:56',842,531,'2005-08-28 20:23:56',2,'2006-02-15 21:30:53'),(13301,'2005-08-19 18:53:15',2261,494,'2005-08-26 21:37:15',1,'2006-02-15 21:30:53'),(13302,'2005-08-19 18:54:26',4041,51,'2005-08-21 23:01:26',1,'2006-02-15 21:30:53'),(13303,'2005-08-19 18:55:21',34,184,'2005-08-23 18:49:21',2,'2006-02-15 21:30:53'),(13304,'2005-08-19 18:56:32',2979,405,'2005-08-23 20:04:32',2,'2006-02-15 21:30:53'),(13305,'2005-08-19 18:57:05',2386,337,'2005-08-28 22:28:05',1,'2006-02-15 21:30:53'),(13306,'2005-08-19 18:57:29',2742,229,'2005-08-20 20:09:29',2,'2006-02-15 21:30:53'),(13307,'2005-08-19 18:58:44',2242,547,'2005-08-22 00:15:44',1,'2006-02-15 21:30:53'),(13308,'2005-08-19 18:59:42',3189,414,'2005-08-28 13:21:42',2,'2006-02-15 21:30:53'),(13309,'2005-08-19 19:04:00',2108,91,'2005-08-28 23:08:00',2,'2006-02-15 21:30:53'),(13310,'2005-08-19 19:05:16',2563,311,'2005-08-23 22:47:16',1,'2006-02-15 21:30:53'),(13311,'2005-08-19 19:07:09',3890,520,'2005-08-20 23:07:09',1,'2006-02-15 21:30:53'),(13312,'2005-08-19 19:09:14',2891,418,'2005-08-23 00:50:14',2,'2006-02-15 21:30:53'),(13313,'2005-08-19 19:11:41',3709,580,'2005-08-21 23:53:41',2,'2006-02-15 21:30:53'),(13314,'2005-08-19 19:12:43',2899,347,'2005-08-27 00:20:43',2,'2006-02-15 21:30:53'),(13315,'2005-08-19 19:16:18',3151,54,'2005-08-21 20:58:18',1,'2006-02-15 21:30:53'),(13316,'2005-08-19 19:23:30',4450,10,'2005-08-22 23:37:30',1,'2006-02-15 21:30:53'),(13317,'2005-08-19 19:25:42',3349,20,'2005-08-20 20:57:42',2,'2006-02-15 21:30:53'),(13318,'2005-08-19 19:33:57',1389,413,'2005-08-21 17:52:57',2,'2006-02-15 21:30:53'),(13319,'2005-08-19 19:35:13',2496,438,'2005-08-27 17:59:13',1,'2006-02-15 21:30:53'),(13320,'2005-08-19 19:35:33',4522,172,'2005-08-24 20:09:33',2,'2006-02-15 21:30:53'),(13321,'2005-08-19 19:40:37',4183,280,'2005-08-21 19:09:37',2,'2006-02-15 21:30:53'),(13322,'2005-08-19 19:43:08',2149,559,'2005-08-24 16:30:08',2,'2006-02-15 21:30:53'),(13323,'2005-08-19 19:48:07',1055,133,'2005-08-23 15:28:07',1,'2006-02-15 21:30:53'),(13324,'2005-08-19 19:51:00',4349,564,'2005-08-20 20:26:00',1,'2006-02-15 21:30:53'),(13325,'2005-08-19 19:52:02',2388,334,'2005-08-22 21:14:02',1,'2006-02-15 21:30:53'),(13326,'2005-08-19 19:52:52',429,576,'2005-08-20 18:56:52',1,'2006-02-15 21:30:53'),(13327,'2005-08-19 19:55:45',1808,72,'2005-08-22 15:05:45',2,'2006-02-15 21:30:53'),(13328,'2005-08-19 19:56:01',605,462,'2005-08-20 22:16:01',2,'2006-02-15 21:30:53'),(13329,'2005-08-19 19:56:55',3136,373,'2005-08-25 01:19:55',2,'2006-02-15 21:30:53'),(13330,'2005-08-19 19:59:21',4276,297,'2005-08-20 15:34:21',2,'2006-02-15 21:30:53'),(13331,'2005-08-19 20:00:25',3867,23,'2005-08-21 17:03:25',1,'2006-02-15 21:30:53'),(13332,'2005-08-19 20:00:51',3144,503,'2005-08-25 14:30:51',1,'2006-02-15 21:30:53'),(13333,'2006-02-14 15:16:03',1092,64,NULL,2,'2006-02-15 21:30:53'),(13334,'2005-08-19 20:02:33',461,379,'2005-08-22 00:45:33',1,'2006-02-15 21:30:53'),(13335,'2005-08-19 20:03:18',1861,74,'2005-08-24 20:09:18',2,'2006-02-15 21:30:53'),(13336,'2005-08-19 20:03:22',1011,289,'2005-08-24 23:42:22',1,'2006-02-15 21:30:53'),(13337,'2005-08-19 20:06:57',3584,374,'2005-08-20 16:31:57',1,'2006-02-15 21:30:53'),(13338,'2005-08-19 20:09:59',3739,86,'2005-08-23 22:59:59',2,'2006-02-15 21:30:53'),(13339,'2005-08-19 20:18:36',1428,15,'2005-08-28 21:34:36',1,'2006-02-15 21:30:53'),(13340,'2005-08-19 20:18:39',4358,45,'2005-08-28 21:06:39',2,'2006-02-15 21:30:53'),(13341,'2005-08-19 20:18:53',1749,460,'2005-08-27 14:36:53',1,'2006-02-15 21:30:53'),(13342,'2005-08-19 20:21:36',3476,172,'2005-08-21 16:26:36',1,'2006-02-15 21:30:53'),(13343,'2005-08-19 20:22:08',1032,591,'2005-08-27 17:21:08',1,'2006-02-15 21:30:53'),(13344,'2005-08-19 20:22:44',4392,514,'2005-08-25 18:39:44',1,'2006-02-15 21:30:53'),(13345,'2005-08-19 20:25:24',47,55,'2005-08-27 20:38:24',1,'2006-02-15 21:30:53'),(13346,'2005-08-19 20:28:21',4541,131,'2005-08-28 00:28:21',2,'2006-02-15 21:30:53'),(13347,'2005-08-19 20:28:48',4038,562,'2005-08-28 19:33:48',2,'2006-02-15 21:30:53'),(13348,'2005-08-19 20:31:48',275,456,'2005-08-21 21:01:48',1,'2006-02-15 21:30:53'),(13349,'2005-08-19 20:43:16',4262,234,'2005-08-20 16:21:16',1,'2006-02-15 21:30:53'),(13350,'2005-08-19 20:44:00',3523,214,'2005-08-27 01:23:00',2,'2006-02-15 21:30:53'),(13351,'2006-02-14 15:16:03',4130,42,NULL,2,'2006-02-15 21:30:53'),(13352,'2005-08-19 20:51:40',2689,80,'2005-08-24 01:22:40',1,'2006-02-15 21:30:53'),(13353,'2005-08-19 20:53:43',2790,131,'2005-08-25 01:25:43',1,'2006-02-15 21:30:53'),(13354,'2005-08-19 20:55:23',1356,213,'2005-08-27 20:09:23',2,'2006-02-15 21:30:53'),(13355,'2005-08-19 20:59:19',585,396,'2005-08-23 21:44:19',1,'2006-02-15 21:30:53'),(13356,'2005-08-19 21:02:21',2713,324,'2005-08-24 00:31:21',1,'2006-02-15 21:30:53'),(13357,'2005-08-19 21:02:59',3295,393,'2005-08-25 23:46:59',2,'2006-02-15 21:30:53'),(13358,'2005-08-19 21:04:20',1510,439,'2005-08-24 20:49:20',2,'2006-02-15 21:30:53'),(13359,'2005-08-19 21:04:49',4175,434,'2005-08-27 01:46:49',1,'2006-02-15 21:30:53'),(13360,'2005-08-19 21:05:11',3396,327,'2005-08-24 16:05:11',2,'2006-02-15 21:30:53'),(13361,'2005-08-19 21:07:22',4289,107,'2005-08-21 21:26:22',2,'2006-02-15 21:30:53'),(13362,'2005-08-19 21:07:54',869,565,'2005-08-20 17:29:54',2,'2006-02-15 21:30:53'),(13363,'2005-08-19 21:07:59',588,288,'2005-08-21 17:08:59',1,'2006-02-15 21:30:53'),(13364,'2005-08-19 21:09:30',2773,236,'2005-08-25 18:37:30',1,'2006-02-15 21:30:53'),(13365,'2005-08-19 21:12:37',4136,307,'2005-08-25 19:56:37',2,'2006-02-15 21:30:53'),(13366,'2005-08-19 21:14:45',602,259,'2005-08-21 03:06:45',1,'2006-02-15 21:30:53'),(13367,'2005-08-19 21:19:27',4569,290,'2005-08-24 15:22:27',2,'2006-02-15 21:30:53'),(13368,'2005-08-19 21:19:35',1073,342,'2005-08-21 16:12:35',2,'2006-02-15 21:30:53'),(13369,'2005-08-19 21:19:47',2728,116,'2005-08-24 23:25:47',1,'2006-02-15 21:30:53'),(13370,'2005-08-19 21:20:11',239,101,'2005-08-25 22:51:11',1,'2006-02-15 21:30:53'),(13371,'2005-08-19 21:21:47',3401,34,'2005-08-26 16:17:47',2,'2006-02-15 21:30:53'),(13372,'2005-08-19 21:23:19',3366,150,'2005-08-24 22:12:19',1,'2006-02-15 21:30:53'),(13373,'2005-08-19 21:23:31',4045,7,'2005-08-25 22:38:31',1,'2006-02-15 21:30:53'),(13374,'2006-02-14 15:16:03',2721,227,NULL,1,'2006-02-15 21:30:53'),(13375,'2005-08-19 21:31:31',949,120,'2005-08-29 00:17:31',1,'2006-02-15 21:30:53'),(13376,'2005-08-19 21:31:45',898,40,'2005-08-22 01:14:45',2,'2006-02-15 21:30:53'),(13377,'2005-08-19 21:32:23',1316,572,'2005-08-25 22:24:23',1,'2006-02-15 21:30:53'),(13378,'2005-08-19 21:33:35',2708,368,'2005-08-20 22:47:35',1,'2006-02-15 21:30:53'),(13379,'2005-08-19 21:33:39',1623,227,'2005-08-22 21:00:39',1,'2006-02-15 21:30:53'),(13380,'2005-08-19 21:36:58',4250,451,'2005-08-22 23:55:58',1,'2006-02-15 21:30:53'),(13381,'2005-08-19 21:37:57',2823,21,'2005-08-21 18:07:57',2,'2006-02-15 21:30:53'),(13382,'2005-08-19 21:38:41',3720,436,'2005-08-28 15:49:41',1,'2006-02-15 21:30:53'),(13383,'2005-08-19 21:38:44',3193,434,'2005-08-28 23:22:44',2,'2006-02-15 21:30:53'),(13384,'2005-08-19 21:38:51',1462,440,'2005-08-23 17:55:51',1,'2006-02-15 21:30:53'),(13385,'2005-08-19 21:39:35',4323,252,'2005-08-22 22:38:35',2,'2006-02-15 21:30:53'),(13386,'2005-08-19 21:43:58',4476,324,'2005-08-24 20:29:58',2,'2006-02-15 21:30:53'),(13387,'2005-08-19 21:46:10',123,504,'2005-08-24 01:16:10',1,'2006-02-15 21:30:53'),(13388,'2005-08-19 21:46:49',942,317,'2005-08-27 16:18:49',1,'2006-02-15 21:30:53'),(13389,'2005-08-19 21:52:51',3352,257,'2005-08-25 02:38:51',1,'2006-02-15 21:30:53'),(13390,'2006-02-14 15:16:03',2855,135,NULL,1,'2006-02-15 21:30:53'),(13391,'2005-08-19 22:01:42',4220,16,'2005-08-24 22:20:42',2,'2006-02-15 21:30:53'),(13392,'2005-08-19 22:03:22',692,409,'2005-08-28 19:27:22',1,'2006-02-15 21:30:53'),(13393,'2005-08-19 22:03:46',958,15,'2005-08-28 19:19:46',2,'2006-02-15 21:30:53'),(13394,'2005-08-19 22:05:19',2597,45,'2005-08-21 23:53:19',1,'2006-02-15 21:30:53'),(13395,'2005-08-19 22:05:40',53,80,'2005-08-22 01:31:40',2,'2006-02-15 21:30:53'),(13396,'2005-08-19 22:06:09',4169,517,'2005-08-23 23:26:09',2,'2006-02-15 21:30:53'),(13397,'2005-08-19 22:06:35',3863,379,'2005-08-29 01:11:35',2,'2006-02-15 21:30:53'),(13398,'2005-08-19 22:08:48',3376,405,'2005-08-23 03:24:48',1,'2006-02-15 21:30:53'),(13399,'2005-08-19 22:09:28',2309,21,'2005-08-25 20:25:28',2,'2006-02-15 21:30:53'),(13400,'2005-08-19 22:11:44',2173,179,'2005-08-20 23:27:44',2,'2006-02-15 21:30:53'),(13401,'2005-08-19 22:16:16',488,139,'2005-08-25 19:01:16',2,'2006-02-15 21:30:53'),(13402,'2005-08-19 22:16:53',3264,372,'2005-08-22 22:28:53',1,'2006-02-15 21:30:53'),(13403,'2005-08-19 22:18:07',3241,3,'2005-08-27 19:23:07',1,'2006-02-15 21:30:53'),(13404,'2005-08-19 22:18:42',416,414,'2005-08-23 16:29:42',2,'2006-02-15 21:30:53'),(13405,'2005-08-19 22:20:49',1554,181,'2005-08-28 21:21:49',1,'2006-02-15 21:30:53'),(13406,'2005-08-19 22:22:01',3031,113,'2005-08-22 18:16:01',1,'2006-02-15 21:30:53'),(13407,'2005-08-19 22:26:26',2512,131,'2005-08-22 16:34:26',1,'2006-02-15 21:30:53'),(13408,'2005-08-19 22:34:51',2795,575,'2005-08-21 03:30:51',1,'2006-02-15 21:30:53'),(13409,'2005-08-19 22:36:26',873,214,'2005-08-22 01:52:26',2,'2006-02-15 21:30:53'),(13410,'2005-08-19 22:41:44',1421,104,'2005-08-26 18:05:44',2,'2006-02-15 21:30:53'),(13411,'2005-08-19 22:43:38',4425,21,'2005-08-26 18:29:38',2,'2006-02-15 21:30:53'),(13412,'2005-08-19 22:46:35',2806,404,'2005-08-26 18:06:35',1,'2006-02-15 21:30:53'),(13413,'2005-08-19 22:46:46',1501,390,'2005-08-24 22:52:46',1,'2006-02-15 21:30:53'),(13414,'2005-08-19 22:47:34',4126,438,'2005-08-21 02:50:34',1,'2006-02-15 21:30:53'),(13415,'2005-08-19 22:48:09',1105,181,'2005-08-25 02:09:09',1,'2006-02-15 21:30:53'),(13416,'2005-08-19 22:48:48',1075,204,'2005-08-21 22:09:48',2,'2006-02-15 21:30:53'),(13417,'2005-08-19 22:51:39',92,468,'2005-08-23 03:34:39',1,'2006-02-15 21:30:53'),(13418,'2005-08-19 22:53:56',2113,246,'2005-08-28 02:05:56',2,'2006-02-15 21:30:53'),(13419,'2006-02-14 15:16:03',3507,537,NULL,1,'2006-02-15 21:30:53'),(13420,'2005-08-19 22:57:25',1796,102,'2005-08-28 22:46:25',1,'2006-02-15 21:30:53'),(13421,'2006-02-14 15:16:03',9,366,NULL,1,'2006-02-15 21:30:53'),(13422,'2005-08-19 23:07:24',3835,404,'2005-08-28 04:12:24',2,'2006-02-15 21:30:53'),(13423,'2005-08-19 23:07:42',546,311,'2005-08-26 20:45:42',1,'2006-02-15 21:30:53'),(13424,'2005-08-19 23:10:09',4340,216,'2005-08-23 02:25:09',1,'2006-02-15 21:30:53'),(13425,'2005-08-19 23:11:44',2274,340,'2005-08-25 21:19:44',2,'2006-02-15 21:30:53'),(13426,'2005-08-19 23:15:00',3409,213,'2005-08-21 01:53:00',2,'2006-02-15 21:30:53'),(13427,'2005-08-19 23:19:02',3120,239,'2005-08-21 18:30:02',1,'2006-02-15 21:30:53'),(13428,'2006-02-14 15:16:03',106,44,NULL,2,'2006-02-15 21:30:53'),(13429,'2005-08-19 23:25:37',3677,23,'2005-08-28 01:04:37',2,'2006-02-15 21:30:53'),(13430,'2005-08-19 23:25:43',2852,381,'2005-08-22 18:41:43',1,'2006-02-15 21:30:53'),(13431,'2005-08-19 23:28:15',1700,229,'2005-08-25 04:44:15',1,'2006-02-15 21:30:53'),(13432,'2005-08-19 23:29:06',2216,78,'2005-08-23 00:57:06',1,'2006-02-15 21:30:53'),(13433,'2005-08-19 23:30:53',1647,171,'2005-08-22 05:18:53',2,'2006-02-15 21:30:53'),(13434,'2005-08-19 23:34:26',2073,221,'2005-08-23 18:33:26',1,'2006-02-15 21:30:53'),(13435,'2005-08-19 23:35:44',3919,30,'2005-08-24 18:14:44',2,'2006-02-15 21:30:53'),(13436,'2005-08-19 23:36:25',2499,29,'2005-08-23 18:38:25',1,'2006-02-15 21:30:53'),(13437,'2005-08-19 23:37:52',2292,67,'2005-08-28 22:17:52',1,'2006-02-15 21:30:53'),(13438,'2005-08-19 23:38:02',1750,520,'2005-08-26 21:36:02',1,'2006-02-15 21:30:53'),(13439,'2005-08-19 23:42:16',3535,551,'2005-08-26 21:24:16',2,'2006-02-15 21:30:53'),(13440,'2005-08-19 23:42:52',2842,260,'2005-08-25 19:19:52',1,'2006-02-15 21:30:53'),(13441,'2005-08-19 23:48:23',3188,125,'2005-08-28 23:47:23',1,'2006-02-15 21:30:53'),(13442,'2005-08-19 23:50:45',2432,356,'2005-08-27 22:01:45',2,'2006-02-15 21:30:53'),(13443,'2005-08-19 23:53:42',3161,236,'2005-08-28 05:37:42',1,'2006-02-15 21:30:53'),(13444,'2005-08-20 00:00:24',2564,37,'2005-08-21 05:59:24',2,'2006-02-15 21:30:53'),(13445,'2005-08-20 00:05:33',1630,495,'2005-08-21 21:20:33',1,'2006-02-15 21:30:53'),(13446,'2005-08-20 00:06:13',3226,488,'2005-08-22 19:56:13',1,'2006-02-15 21:30:53'),(13447,'2005-08-20 00:09:36',285,542,'2005-08-25 01:22:36',1,'2006-02-15 21:30:53'),(13448,'2005-08-20 00:12:43',2870,327,'2005-08-25 02:33:43',1,'2006-02-15 21:30:53'),(13449,'2005-08-20 00:17:01',1297,400,'2005-08-23 20:42:01',2,'2006-02-15 21:30:53'),(13450,'2005-08-20 00:18:15',135,61,'2005-08-24 19:36:15',1,'2006-02-15 21:30:53'),(13451,'2005-08-20 00:18:25',3837,6,'2005-08-29 01:08:25',1,'2006-02-15 21:30:53'),(13452,'2005-08-20 00:20:07',2449,430,'2005-08-25 05:43:07',1,'2006-02-15 21:30:53'),(13453,'2005-08-20 00:30:51',2203,164,'2005-08-28 18:43:51',2,'2006-02-15 21:30:53'),(13454,'2005-08-20 00:30:52',1553,430,'2005-08-27 19:45:52',2,'2006-02-15 21:30:53'),(13455,'2005-08-20 00:32:17',1315,133,'2005-08-26 19:33:17',1,'2006-02-15 21:30:53'),(13456,'2005-08-20 00:33:19',1644,13,'2005-08-22 01:47:19',1,'2006-02-15 21:30:53'),(13457,'2005-08-20 00:33:22',1220,256,'2005-08-26 21:37:22',2,'2006-02-15 21:30:53'),(13458,'2005-08-20 00:35:30',4223,228,'2005-08-21 20:51:30',1,'2006-02-15 21:30:53'),(13459,'2005-08-20 00:45:40',3666,114,'2005-08-29 02:53:40',2,'2006-02-15 21:30:53'),(13460,'2005-08-20 00:48:24',244,410,'2005-08-28 04:13:24',2,'2006-02-15 21:30:53'),(13461,'2005-08-20 00:49:04',2621,421,'2005-08-28 02:49:04',2,'2006-02-15 21:30:53'),(13462,'2005-08-20 00:49:19',3865,489,'2005-08-26 06:21:19',2,'2006-02-15 21:30:53'),(13463,'2005-08-20 00:50:54',510,21,'2005-08-28 23:00:54',1,'2006-02-15 21:30:53'),(13464,'2006-02-14 15:16:03',4292,576,NULL,1,'2006-02-15 21:30:53'),(13465,'2005-08-20 00:54:14',1305,575,'2005-08-21 20:55:14',2,'2006-02-15 21:30:53'),(13466,'2005-08-20 00:55:16',3088,262,'2005-08-22 22:48:16',1,'2006-02-15 21:30:53'),(13467,'2005-08-20 00:56:44',696,373,'2005-08-20 20:16:44',1,'2006-02-15 21:30:53'),(13468,'2005-08-20 00:56:44',1851,266,'2005-08-29 06:26:44',1,'2006-02-15 21:30:53'),(13469,'2005-08-20 00:59:36',1410,235,'2005-08-24 22:41:36',1,'2006-02-15 21:30:53'),(13470,'2005-08-20 01:01:16',3097,141,'2005-08-21 03:19:16',1,'2006-02-15 21:30:53'),(13471,'2005-08-20 01:02:26',1391,296,'2005-08-25 06:37:26',2,'2006-02-15 21:30:53'),(13472,'2005-08-20 01:03:31',3074,137,'2005-08-28 02:54:31',1,'2006-02-15 21:30:53'),(13473,'2005-08-20 01:03:50',381,390,'2005-08-22 02:33:50',2,'2006-02-15 21:30:53'),(13474,'2005-08-20 01:04:32',1209,116,'2005-08-21 20:26:32',2,'2006-02-15 21:30:53'),(13475,'2005-08-20 01:05:05',3214,68,'2005-08-20 20:22:05',2,'2006-02-15 21:30:53'),(13476,'2005-08-20 01:06:04',2866,7,'2005-08-24 23:56:04',1,'2006-02-15 21:30:53'),(13477,'2005-08-20 01:07:00',1442,222,'2005-08-26 02:47:00',1,'2006-02-15 21:30:53'),(13478,'2005-08-20 01:07:14',2190,466,'2005-08-22 03:41:14',1,'2006-02-15 21:30:53'),(13479,'2005-08-20 01:09:11',1262,87,'2005-08-26 05:35:11',2,'2006-02-15 21:30:53'),(13480,'2005-08-20 01:10:27',206,16,'2005-08-27 22:18:27',2,'2006-02-15 21:30:53'),(13481,'2005-08-20 01:11:12',2678,157,'2005-08-26 23:07:12',2,'2006-02-15 21:30:53'),(13482,'2005-08-20 01:14:30',1627,183,'2005-08-24 04:57:30',1,'2006-02-15 21:30:53'),(13483,'2005-08-20 01:16:38',2550,441,'2005-08-21 20:43:38',2,'2006-02-15 21:30:53'),(13484,'2005-08-20 01:16:52',1533,152,'2005-08-22 23:47:52',2,'2006-02-15 21:30:53'),(13485,'2005-08-20 01:20:14',3802,379,'2005-08-22 01:28:14',2,'2006-02-15 21:30:53'),(13486,'2006-02-14 15:16:03',4460,274,NULL,1,'2006-02-15 21:30:53'),(13487,'2005-08-20 01:27:05',2609,458,'2005-08-24 00:41:05',2,'2006-02-15 21:30:53'),(13488,'2005-08-20 01:28:42',867,444,'2005-08-25 06:17:42',2,'2006-02-15 21:30:53'),(13489,'2005-08-20 01:29:06',2934,443,'2005-08-27 21:11:06',1,'2006-02-15 21:30:53'),(13490,'2005-08-20 01:29:29',238,18,'2005-08-21 22:36:29',2,'2006-02-15 21:30:53'),(13491,'2005-08-20 01:30:56',2503,258,'2005-08-28 23:26:56',2,'2006-02-15 21:30:53'),(13492,'2005-08-20 01:32:04',1155,462,'2005-08-29 02:14:04',2,'2006-02-15 21:30:53'),(13493,'2005-08-20 01:33:36',2927,37,'2005-08-24 06:32:36',1,'2006-02-15 21:30:53'),(13494,'2005-08-20 01:36:34',1632,414,'2005-08-21 06:52:34',1,'2006-02-15 21:30:53'),(13495,'2005-08-20 01:40:25',3881,92,'2005-08-23 06:32:25',2,'2006-02-15 21:30:53'),(13496,'2005-08-20 01:42:29',3040,454,'2005-08-29 06:47:29',2,'2006-02-15 21:30:53'),(13497,'2005-08-20 01:46:38',1296,481,'2005-08-26 05:37:38',2,'2006-02-15 21:30:53'),(13498,'2005-08-20 01:51:23',1603,578,'2005-08-24 05:32:23',1,'2006-02-15 21:30:53'),(13499,'2005-08-20 01:52:30',1893,300,'2005-08-28 04:57:30',1,'2006-02-15 21:30:53'),(13500,'2005-08-20 01:54:39',1353,577,'2005-08-25 21:23:39',1,'2006-02-15 21:30:53'),(13501,'2005-08-20 01:56:20',4369,390,'2005-08-22 23:07:20',2,'2006-02-15 21:30:53'),(13502,'2005-08-20 01:58:15',1324,309,'2005-08-21 20:21:15',1,'2006-02-15 21:30:53'),(13503,'2005-08-20 02:00:33',453,15,'2005-08-28 21:03:33',1,'2006-02-15 21:30:53'),(13504,'2005-08-20 02:01:48',4322,293,'2005-08-25 21:52:48',2,'2006-02-15 21:30:53'),(13505,'2005-08-20 02:05:57',914,536,'2005-08-23 05:52:57',1,'2006-02-15 21:30:53'),(13506,'2005-08-20 02:07:06',1334,261,'2005-08-26 08:06:06',1,'2006-02-15 21:30:53'),(13507,'2005-08-20 02:10:27',3324,478,'2005-08-23 04:03:27',2,'2006-02-15 21:30:53'),(13508,'2005-08-20 02:12:54',4120,408,'2005-08-28 21:47:54',2,'2006-02-15 21:30:53'),(13509,'2005-08-20 02:14:16',3698,128,'2005-08-22 06:36:16',2,'2006-02-15 21:30:53'),(13510,'2005-08-20 02:18:30',691,107,'2005-08-27 01:33:30',1,'2006-02-15 21:30:53'),(13511,'2005-08-20 02:21:40',2973,23,'2005-08-21 03:26:40',1,'2006-02-15 21:30:53'),(13512,'2005-08-20 02:27:13',4508,62,'2005-08-28 04:40:13',2,'2006-02-15 21:30:53'),(13513,'2005-08-20 02:27:53',1653,454,'2005-08-22 06:10:53',1,'2006-02-15 21:30:53'),(13514,'2005-08-20 02:28:09',3407,96,'2005-08-25 00:41:09',1,'2006-02-15 21:30:53'),(13515,'2005-08-20 02:29:47',3438,194,'2005-08-23 08:12:47',2,'2006-02-15 21:30:53'),(13516,'2005-08-20 02:32:45',4286,95,'2005-08-27 04:38:45',1,'2006-02-15 21:30:53'),(13517,'2005-08-20 02:33:17',533,186,'2005-08-23 22:40:17',2,'2006-02-15 21:30:53'),(13518,'2005-08-20 02:36:17',352,528,'2005-08-24 08:06:17',1,'2006-02-15 21:30:53'),(13519,'2005-08-20 02:37:07',182,12,'2005-08-23 01:26:07',2,'2006-02-15 21:30:53'),(13520,'2005-08-20 02:41:46',3326,74,'2005-08-22 01:53:46',1,'2006-02-15 21:30:53'),(13521,'2005-08-20 02:42:28',2586,384,'2005-08-22 06:12:28',1,'2006-02-15 21:30:53'),(13522,'2005-08-20 02:44:06',2940,343,'2005-08-28 05:30:06',1,'2006-02-15 21:30:53'),(13523,'2005-08-20 02:47:03',163,572,'2005-08-28 07:43:03',1,'2006-02-15 21:30:53'),(13524,'2005-08-20 02:48:43',4557,593,'2005-08-27 03:14:43',2,'2006-02-15 21:30:53'),(13525,'2005-08-20 02:50:44',3514,111,'2005-08-26 22:58:44',2,'2006-02-15 21:30:53'),(13526,'2005-08-20 02:58:42',1966,277,'2005-08-27 22:36:42',2,'2006-02-15 21:30:53'),(13527,'2005-08-20 03:00:47',4424,521,'2005-08-25 01:03:47',1,'2006-02-15 21:30:53'),(13528,'2005-08-20 03:03:31',1847,202,'2005-08-26 03:09:31',1,'2006-02-15 21:30:53'),(13529,'2005-08-20 03:07:47',1979,193,'2005-08-21 21:50:47',1,'2006-02-15 21:30:53'),(13530,'2005-08-20 03:12:43',597,156,'2005-08-23 09:01:43',2,'2006-02-15 21:30:53'),(13531,'2005-08-20 03:26:10',2778,156,'2005-08-25 03:41:10',1,'2006-02-15 21:30:53'),(13532,'2005-08-20 03:29:28',1433,168,'2005-08-23 22:53:28',2,'2006-02-15 21:30:53'),(13533,'2005-08-20 03:30:00',1801,436,'2005-08-27 05:53:00',1,'2006-02-15 21:30:53'),(13534,'2006-02-14 15:16:03',2476,75,NULL,1,'2006-02-15 21:30:53'),(13535,'2005-08-20 03:30:25',1563,86,'2005-08-28 04:35:25',1,'2006-02-15 21:30:53'),(13536,'2005-08-20 03:35:16',667,183,'2005-08-25 04:06:16',2,'2006-02-15 21:30:53'),(13537,'2005-08-20 03:39:15',2521,418,'2005-08-23 22:03:15',2,'2006-02-15 21:30:53'),(13538,'2006-02-14 15:16:03',581,279,NULL,1,'2006-02-15 21:30:53'),(13539,'2005-08-20 03:40:27',3110,518,'2005-08-27 07:15:27',1,'2006-02-15 21:30:53'),(13540,'2005-08-20 03:41:23',3785,557,'2005-08-27 09:09:23',2,'2006-02-15 21:30:53'),(13541,'2005-08-20 03:41:41',1363,15,'2005-08-24 23:14:41',1,'2006-02-15 21:30:53'),(13542,'2005-08-20 03:41:57',4543,147,'2005-08-29 03:21:57',2,'2006-02-15 21:30:53'),(13543,'2005-08-20 03:43:13',2142,163,'2005-08-29 07:14:13',2,'2006-02-15 21:30:53'),(13544,'2005-08-20 03:44:26',58,538,'2005-08-27 22:11:26',1,'2006-02-15 21:30:53'),(13545,'2005-08-20 03:50:15',615,417,'2005-08-27 22:24:15',1,'2006-02-15 21:30:53'),(13546,'2005-08-20 03:50:24',2492,390,'2005-08-28 03:04:24',2,'2006-02-15 21:30:53'),(13547,'2005-08-20 03:53:16',3122,456,'2005-08-25 04:02:16',1,'2006-02-15 21:30:53'),(13548,'2005-08-20 03:53:20',4389,319,'2005-08-27 21:54:20',1,'2006-02-15 21:30:53'),(13549,'2005-08-20 03:58:41',508,274,'2005-08-28 22:49:41',1,'2006-02-15 21:30:53'),(13550,'2005-08-20 03:58:51',208,206,'2005-08-28 00:45:51',2,'2006-02-15 21:30:53'),(13551,'2005-08-20 04:00:30',1049,503,'2005-08-21 06:26:30',2,'2006-02-15 21:30:53'),(13552,'2005-08-20 04:03:51',758,578,'2005-08-23 02:48:51',2,'2006-02-15 21:30:53'),(13553,'2005-08-20 04:07:21',4407,314,'2005-08-28 09:55:21',1,'2006-02-15 21:30:53'),(13554,'2005-08-20 04:08:39',2648,569,'2005-08-28 07:11:39',2,'2006-02-15 21:30:53'),(13555,'2005-08-20 04:09:50',3176,93,'2005-08-29 05:20:50',1,'2006-02-15 21:30:53'),(13556,'2005-08-20 04:10:26',3914,266,'2005-08-26 06:45:26',2,'2006-02-15 21:30:53'),(13557,'2005-08-20 04:12:41',2290,23,'2005-08-21 02:33:41',2,'2006-02-15 21:30:53'),(13558,'2005-08-20 04:13:17',1551,564,'2005-08-24 06:38:17',1,'2006-02-15 21:30:53'),(13559,'2005-08-20 04:16:07',2413,444,'2005-08-24 23:23:07',1,'2006-02-15 21:30:53'),(13560,'2005-08-20 04:17:16',820,56,'2005-08-28 08:38:16',1,'2006-02-15 21:30:53'),(13561,'2006-02-14 15:16:03',3202,530,NULL,1,'2006-02-15 21:30:53'),(13562,'2005-08-20 04:31:45',4547,36,'2005-08-25 09:59:45',1,'2006-02-15 21:30:53'),(13563,'2005-08-20 04:33:31',599,366,'2005-08-24 07:08:31',2,'2006-02-15 21:30:53'),(13564,'2005-08-20 04:34:46',678,36,'2005-08-28 23:18:46',2,'2006-02-15 21:30:53'),(13565,'2005-08-20 04:38:52',3378,214,'2005-08-27 07:17:52',1,'2006-02-15 21:30:53'),(13566,'2005-08-20 04:45:32',4397,558,'2005-08-28 02:12:32',2,'2006-02-15 21:30:53'),(13567,'2005-08-20 04:49:21',543,242,'2005-08-26 10:27:21',1,'2006-02-15 21:30:53'),(13568,'2005-08-20 05:02:46',1243,151,'2005-08-27 03:12:46',2,'2006-02-15 21:30:53'),(13569,'2005-08-20 05:02:59',1934,496,'2005-08-28 00:51:59',1,'2006-02-15 21:30:53'),(13570,'2005-08-20 05:04:57',2808,188,'2005-08-24 06:19:57',2,'2006-02-15 21:30:53'),(13571,'2005-08-20 05:05:14',1251,458,'2005-08-25 03:59:14',2,'2006-02-15 21:30:53'),(13572,'2005-08-20 05:07:27',660,11,'2005-08-23 23:33:27',1,'2006-02-15 21:30:53'),(13573,'2005-08-20 05:10:14',3032,59,'2005-08-22 00:59:14',1,'2006-02-15 21:30:53'),(13574,'2005-08-20 05:10:39',2383,552,'2005-08-21 02:21:39',2,'2006-02-15 21:30:53'),(13575,'2005-08-20 05:15:20',2729,339,'2005-08-28 07:36:20',2,'2006-02-15 21:30:53'),(13576,'2005-08-20 05:19:56',2669,223,'2005-08-22 09:08:56',2,'2006-02-15 21:30:53'),(13577,'2006-02-14 15:16:03',3844,448,NULL,2,'2006-02-15 21:30:53'),(13578,'2006-02-14 15:16:03',4301,352,NULL,2,'2006-02-15 21:30:53'),(13579,'2005-08-20 05:22:06',4237,333,'2005-08-28 02:33:06',2,'2006-02-15 21:30:53'),(13580,'2005-08-20 05:23:34',4419,526,'2005-08-23 02:45:34',1,'2006-02-15 21:30:53'),(13581,'2005-08-20 05:26:15',1753,119,'2005-08-21 11:07:15',2,'2006-02-15 21:30:53'),(13582,'2005-08-20 05:28:11',211,166,'2005-08-23 02:06:11',2,'2006-02-15 21:30:53'),(13583,'2005-08-20 05:29:45',176,74,'2005-08-26 06:49:45',1,'2006-02-15 21:30:53'),(13584,'2006-02-14 15:16:03',3966,548,NULL,2,'2006-02-15 21:30:53'),(13585,'2005-08-20 05:32:23',3314,470,'2005-08-27 23:36:23',1,'2006-02-15 21:30:53'),(13586,'2005-08-20 05:40:33',4544,445,'2005-08-25 01:32:33',2,'2006-02-15 21:30:53'),(13587,'2006-02-14 15:16:03',2455,431,NULL,2,'2006-02-15 21:30:53'),(13588,'2005-08-20 05:47:11',702,279,'2005-08-28 02:45:11',2,'2006-02-15 21:30:53'),(13589,'2005-08-20 05:47:25',3216,574,'2005-08-23 01:29:25',2,'2006-02-15 21:30:53'),(13590,'2005-08-20 05:48:59',4417,264,'2005-08-25 00:44:59',2,'2006-02-15 21:30:53'),(13591,'2005-08-20 05:50:05',3089,390,'2005-08-27 08:43:05',2,'2006-02-15 21:30:53'),(13592,'2005-08-20 05:50:35',1509,470,'2005-08-23 04:52:35',1,'2006-02-15 21:30:53'),(13593,'2005-08-20 05:50:52',261,585,'2005-08-27 05:28:52',2,'2006-02-15 21:30:53'),(13594,'2005-08-20 05:53:31',3424,7,'2005-08-23 09:01:31',1,'2006-02-15 21:30:53'),(13595,'2005-08-20 05:54:27',673,545,'2005-08-29 01:25:27',1,'2006-02-15 21:30:53'),(13596,'2005-08-20 05:58:58',482,513,'2005-08-27 08:35:58',1,'2006-02-15 21:30:53'),(13597,'2005-08-20 05:59:05',3697,72,'2005-08-24 05:38:05',2,'2006-02-15 21:30:53'),(13598,'2005-08-20 05:59:17',2803,259,'2005-08-29 01:02:17',1,'2006-02-15 21:30:53'),(13599,'2005-08-20 06:00:03',3333,150,'2005-08-29 07:56:03',1,'2006-02-15 21:30:53'),(13600,'2005-08-20 06:00:25',431,528,'2005-08-28 02:39:25',1,'2006-02-15 21:30:53'),(13601,'2005-08-20 06:01:15',2166,189,'2005-08-29 06:14:15',2,'2006-02-15 21:30:53'),(13602,'2005-08-20 06:02:02',2805,348,'2005-08-27 04:51:02',1,'2006-02-15 21:30:53'),(13603,'2005-08-20 06:02:48',937,362,'2005-08-29 09:39:48',1,'2006-02-15 21:30:53'),(13604,'2005-08-20 06:03:33',4352,353,'2005-08-21 07:06:33',1,'2006-02-15 21:30:53'),(13605,'2005-08-20 06:06:17',4446,522,'2005-08-26 00:53:17',2,'2006-02-15 21:30:53'),(13606,'2005-08-20 06:07:01',83,146,'2005-08-27 04:59:01',2,'2006-02-15 21:30:53'),(13607,'2005-08-20 06:08:42',2692,491,'2005-08-21 01:59:42',2,'2006-02-15 21:30:53'),(13608,'2005-08-20 06:10:44',4110,193,'2005-08-24 07:08:44',1,'2006-02-15 21:30:53'),(13609,'2005-08-20 06:11:51',299,328,'2005-08-23 04:13:51',2,'2006-02-15 21:30:53'),(13610,'2005-08-20 06:14:12',2526,3,'2005-08-26 00:44:12',2,'2006-02-15 21:30:53'),(13611,'2005-08-20 06:20:42',1460,112,'2005-08-28 10:07:42',1,'2006-02-15 21:30:53'),(13612,'2005-08-20 06:22:08',675,505,'2005-08-28 02:22:08',1,'2006-02-15 21:30:53'),(13613,'2005-08-20 06:23:53',2415,201,'2005-08-29 11:40:53',2,'2006-02-15 21:30:53'),(13614,'2005-08-20 06:28:37',3736,381,'2005-08-22 07:54:37',2,'2006-02-15 21:30:53'),(13615,'2005-08-20 06:28:53',1864,539,'2005-08-27 11:40:53',2,'2006-02-15 21:30:53'),(13616,'2005-08-20 06:30:33',1694,194,'2005-08-27 09:29:33',2,'2006-02-15 21:30:53'),(13617,'2005-08-20 06:35:30',4059,526,'2005-08-29 09:03:30',1,'2006-02-15 21:30:53'),(13618,'2005-08-20 06:36:46',390,390,'2005-08-29 05:17:46',2,'2006-02-15 21:30:53'),(13619,'2005-08-20 06:39:26',1068,365,'2005-08-23 05:22:26',2,'2006-02-15 21:30:53'),(13620,'2005-08-20 06:41:27',2361,92,'2005-08-24 11:02:27',1,'2006-02-15 21:30:53'),(13621,'2005-08-20 06:43:44',3754,581,'2005-08-23 06:25:44',2,'2006-02-15 21:30:53'),(13622,'2005-08-20 06:45:32',3355,335,'2005-08-25 02:40:32',1,'2006-02-15 21:30:53'),(13623,'2005-08-20 06:49:46',3948,321,'2005-08-25 05:19:46',2,'2006-02-15 21:30:53'),(13624,'2005-08-20 06:51:02',430,63,'2005-08-29 02:39:02',1,'2006-02-15 21:30:53'),(13625,'2005-08-20 06:52:03',60,422,'2005-08-27 07:43:03',1,'2006-02-15 21:30:53'),(13626,'2005-08-20 06:55:24',594,524,'2005-08-29 12:32:24',1,'2006-02-15 21:30:53'),(13627,'2005-08-20 06:59:00',603,329,'2005-08-29 11:43:00',2,'2006-02-15 21:30:53'),(13628,'2005-08-20 07:03:53',1006,500,'2005-08-22 11:27:53',2,'2006-02-15 21:30:53'),(13629,'2005-08-20 07:04:07',1834,392,'2005-08-25 12:36:07',1,'2006-02-15 21:30:53'),(13630,'2005-08-20 07:05:56',3346,244,'2005-08-29 04:15:56',1,'2006-02-15 21:30:53'),(13631,'2005-08-20 07:07:37',1015,535,'2005-08-22 04:01:37',1,'2006-02-15 21:30:53'),(13632,'2005-08-20 07:10:52',4008,409,'2005-08-29 10:19:52',2,'2006-02-15 21:30:53'),(13633,'2005-08-20 07:13:47',3227,301,'2005-08-24 11:25:47',1,'2006-02-15 21:30:53'),(13634,'2005-08-20 07:16:45',850,411,'2005-08-22 03:38:45',1,'2006-02-15 21:30:53'),(13635,'2005-08-20 07:17:35',669,286,'2005-08-29 06:27:35',1,'2006-02-15 21:30:53'),(13636,'2005-08-20 07:20:09',1467,349,'2005-08-23 09:58:09',1,'2006-02-15 21:30:53'),(13637,'2005-08-20 07:21:15',2298,342,'2005-08-24 10:13:15',2,'2006-02-15 21:30:53'),(13638,'2005-08-20 07:21:15',3255,493,'2005-08-23 11:09:15',2,'2006-02-15 21:30:53'),(13639,'2005-08-20 07:22:07',2489,562,'2005-08-23 11:24:07',2,'2006-02-15 21:30:53'),(13640,'2005-08-20 07:22:53',3427,541,'2005-08-21 11:54:53',2,'2006-02-15 21:30:53'),(13641,'2005-08-20 07:34:42',367,281,'2005-08-26 05:18:42',1,'2006-02-15 21:30:53'),(13642,'2005-08-20 07:42:17',4415,452,'2005-08-29 10:49:17',1,'2006-02-15 21:30:53'),(13643,'2005-08-20 07:42:24',2443,398,'2005-08-26 09:13:24',2,'2006-02-15 21:30:53'),(13644,'2005-08-20 07:46:30',970,464,'2005-08-27 01:54:30',1,'2006-02-15 21:30:53'),(13645,'2005-08-20 07:47:05',157,387,'2005-08-23 02:58:05',1,'2006-02-15 21:30:53'),(13646,'2005-08-20 07:47:08',1347,242,'2005-08-29 08:33:08',1,'2006-02-15 21:30:53'),(13647,'2005-08-20 07:48:07',3269,519,'2005-08-28 07:56:07',2,'2006-02-15 21:30:53'),(13648,'2005-08-20 07:48:10',3921,596,'2005-08-22 12:15:10',2,'2006-02-15 21:30:53'),(13649,'2005-08-20 07:48:38',1495,259,'2005-08-23 07:43:38',2,'2006-02-15 21:30:53'),(13650,'2005-08-20 07:49:06',2644,322,'2005-08-28 10:11:06',1,'2006-02-15 21:30:53'),(13651,'2005-08-20 07:50:08',1082,256,'2005-08-21 07:11:08',1,'2006-02-15 21:30:53'),(13652,'2005-08-20 07:52:34',2548,67,'2005-08-23 08:58:34',2,'2006-02-15 21:30:53'),(13653,'2005-08-20 07:54:54',4029,129,'2005-08-29 06:43:54',1,'2006-02-15 21:30:53'),(13654,'2005-08-20 07:58:21',1582,469,'2005-08-21 09:40:21',2,'2006-02-15 21:30:53'),(13655,'2005-08-20 07:59:13',4294,207,'2005-08-22 12:04:13',1,'2006-02-15 21:30:53'),(13656,'2005-08-20 08:01:07',3180,411,'2005-08-28 13:16:07',2,'2006-02-15 21:30:53'),(13657,'2005-08-20 08:01:39',1752,414,'2005-08-23 07:31:39',1,'2006-02-15 21:30:53'),(13658,'2005-08-20 08:02:22',3827,487,'2005-08-28 06:00:22',1,'2006-02-15 21:30:53'),(13659,'2005-08-20 08:05:52',3610,520,'2005-08-24 12:38:52',1,'2006-02-15 21:30:53'),(13660,'2005-08-20 08:05:56',3972,72,'2005-08-22 13:22:56',1,'2006-02-15 21:30:53'),(13661,'2005-08-20 08:05:59',3996,471,'2005-08-29 12:15:59',1,'2006-02-15 21:30:53'),(13662,'2005-08-20 08:11:58',3880,592,'2005-08-26 13:34:58',1,'2006-02-15 21:30:53'),(13663,'2005-08-20 08:12:33',3969,240,'2005-08-27 03:23:33',2,'2006-02-15 21:30:53'),(13664,'2005-08-20 08:18:36',3750,264,'2005-08-26 11:04:36',1,'2006-02-15 21:30:53'),(13665,'2005-08-20 08:19:20',117,291,'2005-08-28 06:26:20',1,'2006-02-15 21:30:53'),(13666,'2005-08-20 08:20:19',2007,451,'2005-08-22 03:22:19',1,'2006-02-15 21:30:53'),(13667,'2005-08-20 08:25:34',3856,280,'2005-08-24 07:04:34',2,'2006-02-15 21:30:53'),(13668,'2005-08-20 08:26:06',3659,123,'2005-08-25 05:52:06',2,'2006-02-15 21:30:53'),(13669,'2005-08-20 08:26:32',4504,261,'2005-08-27 08:10:32',2,'2006-02-15 21:30:53'),(13670,'2005-08-20 08:27:01',1951,147,'2005-08-29 05:59:01',2,'2006-02-15 21:30:53'),(13671,'2005-08-20 08:27:03',1473,201,'2005-08-26 03:56:03',1,'2006-02-15 21:30:53'),(13672,'2005-08-20 08:27:27',2068,201,'2005-08-22 06:15:27',2,'2006-02-15 21:30:53'),(13673,'2005-08-20 08:27:30',343,332,'2005-08-26 05:14:30',1,'2006-02-15 21:30:53'),(13674,'2005-08-20 08:30:54',3397,36,'2005-08-22 02:59:54',1,'2006-02-15 21:30:53'),(13675,'2005-08-20 08:32:51',350,493,'2005-08-27 03:52:51',2,'2006-02-15 21:30:53'),(13676,'2005-08-20 08:33:21',3170,103,'2005-08-25 02:51:21',1,'2006-02-15 21:30:53'),(13677,'2005-08-20 08:34:41',4013,15,'2005-08-26 11:51:41',2,'2006-02-15 21:30:53'),(13678,'2005-08-20 08:38:24',1118,337,'2005-08-27 13:54:24',2,'2006-02-15 21:30:53'),(13679,'2005-08-20 08:39:34',2878,229,'2005-08-29 10:06:34',2,'2006-02-15 21:30:53'),(13680,'2005-08-20 08:44:06',2822,70,'2005-08-27 09:58:06',2,'2006-02-15 21:30:53'),(13681,'2005-08-20 08:47:37',3039,328,'2005-08-27 09:47:37',1,'2006-02-15 21:30:53'),(13682,'2005-08-20 08:50:39',287,30,'2005-08-21 09:05:39',2,'2006-02-15 21:30:53'),(13683,'2005-08-20 08:54:55',1729,255,'2005-08-24 14:10:55',2,'2006-02-15 21:30:53'),(13684,'2005-08-20 08:55:53',2213,348,'2005-08-25 08:11:53',1,'2006-02-15 21:30:53'),(13685,'2005-08-20 08:57:11',3336,260,'2005-08-27 07:26:11',1,'2006-02-15 21:30:53'),(13686,'2005-08-20 08:57:28',666,306,'2005-08-24 07:21:28',2,'2006-02-15 21:30:53'),(13687,'2005-08-20 08:57:51',3629,290,'2005-08-22 07:02:51',2,'2006-02-15 21:30:53'),(13688,'2005-08-20 08:59:38',1116,572,'2005-08-28 04:54:38',2,'2006-02-15 21:30:53'),(13689,'2005-08-20 09:04:30',819,336,'2005-08-22 05:38:30',2,'2006-02-15 21:30:53'),(13690,'2005-08-20 09:07:27',3721,513,'2005-08-23 08:03:27',2,'2006-02-15 21:30:53'),(13691,'2005-08-20 09:07:39',676,548,'2005-08-28 15:03:39',1,'2006-02-15 21:30:53'),(13692,'2005-08-20 09:07:52',1928,65,'2005-08-21 05:17:52',1,'2006-02-15 21:30:53'),(13693,'2005-08-20 09:11:42',933,552,'2005-08-24 15:00:42',2,'2006-02-15 21:30:53'),(13694,'2005-08-20 09:13:23',3654,454,'2005-08-28 06:10:23',1,'2006-02-15 21:30:53'),(13695,'2005-08-20 09:13:25',3114,258,'2005-08-27 11:51:25',2,'2006-02-15 21:30:53'),(13696,'2005-08-20 09:16:15',1279,206,'2005-08-21 03:33:15',1,'2006-02-15 21:30:53'),(13697,'2005-08-20 09:21:08',291,76,'2005-08-29 12:33:08',1,'2006-02-15 21:30:53'),(13698,'2005-08-20 09:24:26',3829,364,'2005-08-22 05:04:26',2,'2006-02-15 21:30:53'),(13699,'2005-08-20 09:26:14',3913,21,'2005-08-29 08:16:14',2,'2006-02-15 21:30:53'),(13700,'2005-08-20 09:26:17',4229,265,'2005-08-27 05:49:17',2,'2006-02-15 21:30:53'),(13701,'2005-08-20 09:27:05',1643,564,'2005-08-21 14:54:05',1,'2006-02-15 21:30:53'),(13702,'2005-08-20 09:27:20',700,296,'2005-08-29 15:04:20',2,'2006-02-15 21:30:53'),(13703,'2005-08-20 09:29:35',2296,356,'2005-08-27 08:03:35',2,'2006-02-15 21:30:53'),(13704,'2005-08-20 09:32:04',3373,4,'2005-08-23 14:29:04',2,'2006-02-15 21:30:53'),(13705,'2005-08-20 09:32:23',3663,451,'2005-08-21 13:51:23',1,'2006-02-15 21:30:53'),(13706,'2005-08-20 09:32:56',3005,363,'2005-08-28 05:22:56',2,'2006-02-15 21:30:53'),(13707,'2005-08-20 09:33:58',826,232,'2005-08-23 07:44:58',2,'2006-02-15 21:30:53'),(13708,'2005-08-20 09:34:07',2236,218,'2005-08-26 10:17:07',1,'2006-02-15 21:30:53'),(13709,'2005-08-20 09:34:51',4089,422,'2005-08-23 04:13:51',1,'2006-02-15 21:30:53'),(13710,'2005-08-20 09:35:20',756,333,'2005-08-21 05:29:20',2,'2006-02-15 21:30:53'),(13711,'2005-08-20 09:35:20',2318,453,'2005-08-28 09:06:20',2,'2006-02-15 21:30:53'),(13712,'2005-08-20 09:38:04',1039,581,'2005-08-21 06:10:04',1,'2006-02-15 21:30:53'),(13713,'2006-02-14 15:16:03',3075,267,NULL,1,'2006-02-15 21:30:53'),(13714,'2005-08-20 09:41:09',2659,277,'2005-08-22 06:28:09',1,'2006-02-15 21:30:53'),(13715,'2005-08-20 09:43:06',1028,292,'2005-08-27 10:22:06',1,'2006-02-15 21:30:53'),(13716,'2005-08-20 09:48:32',86,386,'2005-08-26 07:20:32',2,'2006-02-15 21:30:53'),(13717,'2005-08-20 09:50:52',1629,300,'2005-08-28 11:32:52',2,'2006-02-15 21:30:53'),(13718,'2005-08-20 09:53:44',205,19,'2005-08-29 13:46:44',2,'2006-02-15 21:30:53'),(13719,'2006-02-14 15:16:03',3547,208,NULL,1,'2006-02-15 21:30:53'),(13720,'2005-08-20 10:01:39',813,427,'2005-08-27 08:26:39',1,'2006-02-15 21:30:53'),(13721,'2005-08-20 10:02:59',1444,297,'2005-08-24 07:02:59',2,'2006-02-15 21:30:53'),(13722,'2005-08-20 10:03:45',1581,422,'2005-08-25 04:26:45',1,'2006-02-15 21:30:53'),(13723,'2005-08-20 10:05:30',411,110,'2005-08-27 07:43:30',2,'2006-02-15 21:30:53'),(13724,'2005-08-20 10:07:28',200,80,'2005-08-24 07:47:28',2,'2006-02-15 21:30:53'),(13725,'2005-08-20 10:08:27',3861,306,'2005-08-28 06:52:27',2,'2006-02-15 21:30:53'),(13726,'2005-08-20 10:08:40',2258,214,'2005-08-23 14:58:40',1,'2006-02-15 21:30:53'),(13727,'2005-08-20 10:08:53',4201,85,'2005-08-27 09:30:53',1,'2006-02-15 21:30:53'),(13728,'2005-08-20 10:11:07',1962,157,'2005-08-23 10:32:07',1,'2006-02-15 21:30:53'),(13729,'2005-08-20 10:17:08',4108,415,'2005-08-28 15:35:08',1,'2006-02-15 21:30:53'),(13730,'2005-08-20 10:17:09',1330,548,'2005-08-28 10:45:09',1,'2006-02-15 21:30:53'),(13731,'2005-08-20 10:22:08',1133,450,'2005-08-21 12:04:08',2,'2006-02-15 21:30:53'),(13732,'2005-08-20 10:24:41',1138,17,'2005-08-22 04:44:41',1,'2006-02-15 21:30:53'),(13733,'2005-08-20 10:25:12',3994,85,'2005-08-21 10:49:12',2,'2006-02-15 21:30:53'),(13734,'2005-08-20 10:29:57',4561,374,'2005-08-25 14:41:57',2,'2006-02-15 21:30:53'),(13735,'2005-08-20 10:31:01',1813,35,'2005-08-26 05:00:01',1,'2006-02-15 21:30:53'),(13736,'2005-08-20 10:31:23',3369,32,'2005-08-28 06:51:23',1,'2006-02-15 21:30:53'),(13737,'2005-08-20 10:41:50',4319,200,'2005-08-25 14:33:50',2,'2006-02-15 21:30:53'),(13738,'2005-08-20 10:42:42',2748,273,'2005-08-25 09:32:42',1,'2006-02-15 21:30:53'),(13739,'2005-08-20 10:45:10',3027,441,'2005-08-28 08:46:10',2,'2006-02-15 21:30:53'),(13740,'2005-08-20 10:48:43',4366,21,'2005-08-29 15:30:43',1,'2006-02-15 21:30:53'),(13741,'2005-08-20 10:48:47',3887,195,'2005-08-21 11:19:47',1,'2006-02-15 21:30:53'),(13742,'2005-08-20 10:49:15',1377,580,'2005-08-21 11:05:15',2,'2006-02-15 21:30:53'),(13743,'2005-08-20 10:51:27',3693,57,'2005-08-24 15:54:27',1,'2006-02-15 21:30:53'),(13744,'2005-08-20 10:51:45',2962,408,'2005-08-25 06:42:45',2,'2006-02-15 21:30:53'),(13745,'2005-08-20 10:53:49',1264,142,'2005-08-25 13:25:49',1,'2006-02-15 21:30:53'),(13746,'2005-08-20 10:55:28',3742,520,'2005-08-25 07:48:28',2,'2006-02-15 21:30:53'),(13747,'2005-08-20 10:56:06',3332,74,'2005-08-29 10:29:06',1,'2006-02-15 21:30:53'),(13748,'2005-08-20 10:59:54',2198,410,'2005-08-23 12:33:54',1,'2006-02-15 21:30:53'),(13749,'2005-08-20 11:00:37',2811,282,'2005-08-26 12:04:37',1,'2006-02-15 21:30:53'),(13750,'2005-08-20 11:11:42',3363,246,'2005-08-29 16:16:42',2,'2006-02-15 21:30:53'),(13751,'2005-08-20 11:17:03',185,105,'2005-08-22 14:12:03',2,'2006-02-15 21:30:53'),(13752,'2005-08-20 11:17:45',1794,77,'2005-08-29 13:25:45',2,'2006-02-15 21:30:53'),(13753,'2006-02-14 15:16:03',3746,495,NULL,1,'2006-02-15 21:30:53'),(13754,'2005-08-20 11:18:08',1740,108,'2005-08-22 11:55:08',1,'2006-02-15 21:30:53'),(13755,'2005-08-20 11:18:53',1927,342,'2005-08-27 06:51:53',2,'2006-02-15 21:30:53'),(13756,'2006-02-14 15:16:03',1146,252,NULL,2,'2006-02-15 21:30:53'),(13757,'2005-08-20 11:20:12',1147,14,'2005-08-23 10:14:12',2,'2006-02-15 21:30:53'),(13758,'2005-08-20 11:21:26',864,255,'2005-08-29 14:37:26',2,'2006-02-15 21:30:53'),(13759,'2005-08-20 11:24:48',595,269,'2005-08-29 10:29:48',1,'2006-02-15 21:30:53'),(13760,'2005-08-20 11:26:33',3459,436,'2005-08-27 11:12:33',2,'2006-02-15 21:30:53'),(13761,'2005-08-20 11:28:50',3149,376,'2005-08-21 12:05:50',2,'2006-02-15 21:30:53'),(13762,'2005-08-20 11:29:32',451,566,'2005-08-23 17:25:32',1,'2006-02-15 21:30:53'),(13763,'2005-08-20 11:37:56',4171,469,'2005-08-26 13:12:56',1,'2006-02-15 21:30:53'),(13764,'2005-08-20 11:38:16',989,386,'2005-08-27 08:01:16',1,'2006-02-15 21:30:53'),(13765,'2005-08-20 11:39:00',2104,219,'2005-08-21 06:05:00',1,'2006-02-15 21:30:53'),(13766,'2005-08-20 11:42:01',1313,189,'2005-08-27 13:44:01',2,'2006-02-15 21:30:53'),(13767,'2005-08-20 11:43:36',2739,506,'2005-08-22 17:10:36',1,'2006-02-15 21:30:53'),(13768,'2005-08-20 11:43:43',3847,198,'2005-08-27 07:56:43',2,'2006-02-15 21:30:53'),(13769,'2005-08-20 11:43:52',2868,56,'2005-08-28 13:19:52',1,'2006-02-15 21:30:53'),(13770,'2005-08-20 11:45:54',998,538,'2005-08-22 17:08:54',1,'2006-02-15 21:30:53'),(13771,'2005-08-20 11:47:21',2278,512,'2005-08-22 17:09:21',1,'2006-02-15 21:30:53'),(13772,'2005-08-20 11:47:52',2038,387,'2005-08-28 05:50:52',2,'2006-02-15 21:30:53'),(13773,'2005-08-20 11:50:14',3389,64,'2005-08-26 12:35:14',1,'2006-02-15 21:30:53'),(13774,'2005-08-20 11:54:01',735,244,'2005-08-22 13:25:01',2,'2006-02-15 21:30:53'),(13775,'2005-08-20 11:56:30',1858,116,'2005-08-28 12:48:30',2,'2006-02-15 21:30:53'),(13776,'2005-08-20 11:57:06',2439,137,'2005-08-26 10:55:06',1,'2006-02-15 21:30:53'),(13777,'2005-08-20 12:03:35',3587,29,'2005-08-27 10:13:35',1,'2006-02-15 21:30:53'),(13778,'2005-08-20 12:03:44',2385,539,'2005-08-28 12:09:44',1,'2006-02-15 21:30:53'),(13779,'2005-08-20 12:03:54',63,440,'2005-08-28 15:24:54',2,'2006-02-15 21:30:53'),(13780,'2006-02-14 15:16:03',1775,14,NULL,2,'2006-02-15 21:30:53'),(13781,'2005-08-20 12:06:45',971,368,'2005-08-26 06:50:45',2,'2006-02-15 21:30:53'),(13782,'2005-08-20 12:09:26',577,305,'2005-08-23 08:31:26',2,'2006-02-15 21:30:53'),(13783,'2005-08-20 12:11:03',2643,28,'2005-08-21 15:53:03',2,'2006-02-15 21:30:53'),(13784,'2005-08-20 12:11:28',3087,431,'2005-08-25 08:11:28',1,'2006-02-15 21:30:53'),(13785,'2005-08-20 12:11:46',379,453,'2005-08-21 06:39:46',1,'2006-02-15 21:30:53'),(13786,'2005-08-20 12:13:24',515,94,'2005-08-28 07:24:24',2,'2006-02-15 21:30:53'),(13787,'2005-08-20 12:15:23',253,188,'2005-08-27 06:24:23',2,'2006-02-15 21:30:53'),(13788,'2005-08-20 12:15:41',3177,393,'2005-08-28 16:28:41',2,'2006-02-15 21:30:53'),(13789,'2005-08-20 12:16:38',2523,53,'2005-08-25 07:29:38',1,'2006-02-15 21:30:53'),(13790,'2005-08-20 12:17:27',1385,11,'2005-08-25 12:20:27',1,'2006-02-15 21:30:53'),(13791,'2005-08-20 12:21:05',1890,67,'2005-08-22 17:58:05',1,'2006-02-15 21:30:53'),(13792,'2005-08-20 12:21:37',4157,78,'2005-08-27 14:28:37',1,'2006-02-15 21:30:53'),(13793,'2005-08-20 12:22:04',2598,424,'2005-08-27 09:51:04',2,'2006-02-15 21:30:53'),(13794,'2005-08-20 12:25:32',2148,557,'2005-08-23 06:38:32',2,'2006-02-15 21:30:53'),(13795,'2005-08-20 12:32:09',2837,331,'2005-08-21 17:28:09',1,'2006-02-15 21:30:53'),(13796,'2005-08-20 12:32:32',28,209,'2005-08-29 10:48:32',2,'2006-02-15 21:30:53'),(13797,'2005-08-20 12:33:36',2857,529,'2005-08-25 18:03:36',1,'2006-02-15 21:30:53'),(13798,'2006-02-14 15:16:03',526,15,NULL,2,'2006-02-15 21:30:53'),(13799,'2005-08-20 12:36:42',4413,196,'2005-08-28 08:47:42',1,'2006-02-15 21:30:53'),(13800,'2005-08-20 12:40:48',1552,407,'2005-08-22 15:06:48',1,'2006-02-15 21:30:53'),(13801,'2005-08-20 12:40:53',1464,433,'2005-08-21 16:29:53',1,'2006-02-15 21:30:53'),(13802,'2005-08-20 12:44:53',2079,156,'2005-08-22 09:18:53',2,'2006-02-15 21:30:53'),(13803,'2005-08-20 12:46:17',1084,486,'2005-08-24 15:44:17',2,'2006-02-15 21:30:53'),(13804,'2005-08-20 12:46:32',2232,19,'2005-08-29 14:04:32',2,'2006-02-15 21:30:53'),(13805,'2005-08-20 12:53:12',349,454,'2005-08-27 15:21:12',1,'2006-02-15 21:30:53'),(13806,'2005-08-20 12:53:46',444,341,'2005-08-21 10:36:46',1,'2006-02-15 21:30:53'),(13807,'2005-08-20 12:55:40',3822,4,'2005-08-28 09:06:40',2,'2006-02-15 21:30:53'),(13808,'2005-08-20 12:55:43',3689,262,'2005-08-29 11:01:43',2,'2006-02-15 21:30:53'),(13809,'2005-08-20 12:56:03',1597,207,'2005-08-27 11:58:03',1,'2006-02-15 21:30:53'),(13810,'2005-08-20 12:59:38',2228,450,'2005-08-21 17:40:38',1,'2006-02-15 21:30:53'),(13811,'2005-08-20 13:00:30',1235,168,'2005-08-24 10:18:30',1,'2006-02-15 21:30:53'),(13812,'2005-08-20 13:01:43',2788,122,'2005-08-22 16:32:43',2,'2006-02-15 21:30:53'),(13813,'2005-08-20 13:03:26',601,455,'2005-08-25 08:42:26',1,'2006-02-15 21:30:53'),(13814,'2005-08-20 13:07:23',2129,436,'2005-08-22 16:23:23',2,'2006-02-15 21:30:53'),(13815,'2005-08-20 13:08:53',3388,582,'2005-08-29 13:11:53',2,'2006-02-15 21:30:53'),(13816,'2005-08-20 13:13:56',273,27,'2005-08-25 09:46:56',1,'2006-02-15 21:30:53'),(13817,'2005-08-20 13:15:30',1935,293,'2005-08-22 18:48:30',2,'2006-02-15 21:30:53'),(13818,'2005-08-20 13:20:09',1283,495,'2005-08-21 18:41:09',1,'2006-02-15 21:30:53'),(13819,'2005-08-20 13:23:15',1459,296,'2005-08-22 16:02:15',2,'2006-02-15 21:30:53'),(13820,'2005-08-20 13:26:37',3191,81,'2005-08-27 14:05:37',1,'2006-02-15 21:30:53'),(13821,'2005-08-20 13:33:47',2402,355,'2005-08-25 18:09:47',1,'2006-02-15 21:30:53'),(13822,'2005-08-20 13:39:28',807,499,'2005-08-24 07:40:28',1,'2006-02-15 21:30:53'),(13823,'2005-08-20 13:42:10',3875,89,'2005-08-22 18:45:10',1,'2006-02-15 21:30:53'),(13824,'2005-08-20 13:43:12',2845,413,'2005-08-22 17:26:12',1,'2006-02-15 21:30:53'),(13825,'2005-08-20 13:43:22',2135,167,'2005-08-29 19:13:22',1,'2006-02-15 21:30:53'),(13826,'2005-08-20 13:46:38',401,436,'2005-08-29 13:07:38',1,'2006-02-15 21:30:53'),(13827,'2005-08-20 13:47:19',1103,342,'2005-08-28 09:13:19',1,'2006-02-15 21:30:53'),(13828,'2005-08-20 13:49:52',2391,450,'2005-08-25 07:49:52',2,'2006-02-15 21:30:53'),(13829,'2005-08-20 13:50:17',3980,146,'2005-08-24 11:30:17',2,'2006-02-15 21:30:53'),(13830,'2005-08-20 13:57:59',2874,61,'2005-08-25 11:29:59',1,'2006-02-15 21:30:53'),(13831,'2005-08-20 13:59:35',570,480,'2005-08-24 12:50:35',1,'2006-02-15 21:30:53'),(13832,'2005-08-20 14:00:25',3299,29,'2005-08-28 10:11:25',1,'2006-02-15 21:30:53'),(13833,'2005-08-20 14:00:29',792,175,'2005-08-29 12:01:29',2,'2006-02-15 21:30:53'),(13834,'2005-08-20 14:03:08',875,426,'2005-08-22 10:12:08',1,'2006-02-15 21:30:53'),(13835,'2005-08-20 14:06:33',3738,143,'2005-08-26 12:15:33',2,'2006-02-15 21:30:53'),(13836,'2005-08-20 14:18:16',4271,375,'2005-08-21 18:13:16',2,'2006-02-15 21:30:53'),(13837,'2005-08-20 14:19:03',3220,67,'2005-08-22 16:25:03',2,'2006-02-15 21:30:53'),(13838,'2005-08-20 14:22:46',1134,437,'2005-08-29 12:28:46',2,'2006-02-15 21:30:53'),(13839,'2005-08-20 14:23:16',1056,437,'2005-08-26 19:11:16',2,'2006-02-15 21:30:53'),(13840,'2005-08-20 14:23:20',1211,40,'2005-08-28 11:53:20',1,'2006-02-15 21:30:53'),(13841,'2005-08-20 14:25:18',3277,203,'2005-08-29 15:49:18',1,'2006-02-15 21:30:53'),(13842,'2005-08-20 14:29:37',4337,180,'2005-08-29 18:19:37',1,'2006-02-15 21:30:53'),(13843,'2005-08-20 14:30:01',3058,308,'2005-08-27 10:06:01',2,'2006-02-15 21:30:53'),(13844,'2005-08-20 14:30:26',983,179,'2005-08-29 17:08:26',1,'2006-02-15 21:30:53'),(13845,'2005-08-20 14:31:21',3993,559,'2005-08-29 18:29:21',1,'2006-02-15 21:30:53'),(13846,'2005-08-20 14:32:31',3289,257,'2005-08-28 16:58:31',1,'2006-02-15 21:30:53'),(13847,'2005-08-20 14:33:59',2647,82,'2005-08-25 08:49:59',1,'2006-02-15 21:30:53'),(13848,'2005-08-20 14:37:49',802,447,'2005-08-25 13:15:49',1,'2006-02-15 21:30:53'),(13849,'2005-08-20 14:42:34',3774,261,'2005-08-24 13:09:34',2,'2006-02-15 21:30:53'),(13850,'2005-08-20 14:43:03',3030,546,'2005-08-27 11:41:03',2,'2006-02-15 21:30:53'),(13851,'2005-08-20 14:44:22',3278,80,'2005-08-22 18:10:22',1,'2006-02-15 21:30:53'),(13852,'2005-08-20 14:45:23',85,535,'2005-08-22 16:47:23',2,'2006-02-15 21:30:53'),(13853,'2005-08-20 14:47:02',1680,186,'2005-08-26 20:32:02',1,'2006-02-15 21:30:53'),(13854,'2005-08-20 14:48:42',4192,158,'2005-08-21 14:55:42',2,'2006-02-15 21:30:53'),(13855,'2005-08-20 14:48:55',1617,96,'2005-08-28 14:45:55',1,'2006-02-15 21:30:53'),(13856,'2005-08-20 14:49:32',4196,407,'2005-08-29 12:37:32',2,'2006-02-15 21:30:53'),(13857,'2005-08-20 14:50:06',2542,366,'2005-08-24 10:38:06',2,'2006-02-15 21:30:53'),(13858,'2005-08-20 14:50:57',2167,33,'2005-08-23 12:10:57',2,'2006-02-15 21:30:53'),(13859,'2005-08-20 14:53:43',4381,504,'2005-08-28 09:50:43',1,'2006-02-15 21:30:53'),(13860,'2005-08-20 14:55:09',558,275,'2005-08-22 20:42:09',1,'2006-02-15 21:30:53'),(13861,'2005-08-20 14:56:53',303,154,'2005-08-22 18:13:53',2,'2006-02-15 21:30:53'),(13862,'2005-08-20 14:57:01',3271,170,'2005-08-27 10:48:01',2,'2006-02-15 21:30:53'),(13863,'2005-08-20 14:57:50',2417,563,'2005-08-29 15:36:50',2,'2006-02-15 21:30:53'),(13864,'2005-08-20 14:59:55',3935,214,'2005-08-22 09:30:55',2,'2006-02-15 21:30:53'),(13865,'2005-08-20 15:04:09',3647,275,'2005-08-24 10:06:09',2,'2006-02-15 21:30:53'),(13866,'2005-08-20 15:05:29',3432,343,'2005-08-23 11:27:29',2,'2006-02-15 21:30:53'),(13867,'2005-08-20 15:05:42',4514,591,'2005-08-29 10:48:42',2,'2006-02-15 21:30:53'),(13868,'2005-08-20 15:06:26',3173,51,'2005-08-22 19:08:26',2,'2006-02-15 21:30:53'),(13869,'2005-08-20 15:08:57',1990,386,'2005-08-29 13:13:57',2,'2006-02-15 21:30:53'),(13870,'2005-08-20 15:09:16',563,167,'2005-08-28 10:00:16',2,'2006-02-15 21:30:53'),(13871,'2005-08-20 15:10:13',3206,372,'2005-08-29 19:43:13',2,'2006-02-15 21:30:53'),(13872,'2005-08-20 15:10:30',2416,421,'2005-08-24 10:14:30',2,'2006-02-15 21:30:53'),(13873,'2005-08-20 15:11:11',1683,306,'2005-08-22 20:13:11',2,'2006-02-15 21:30:53'),(13874,'2005-08-20 15:11:48',72,86,'2005-08-21 18:26:48',2,'2006-02-15 21:30:53'),(13875,'2005-08-20 15:13:11',348,83,'2005-08-21 13:11:11',1,'2006-02-15 21:30:53'),(13876,'2005-08-20 15:15:28',3137,334,'2005-08-23 12:42:28',2,'2006-02-15 21:30:53'),(13877,'2005-08-20 15:16:18',3387,5,'2005-08-22 18:20:18',1,'2006-02-15 21:30:53'),(13878,'2005-08-20 15:17:38',49,481,'2005-08-21 21:11:38',2,'2006-02-15 21:30:53'),(13879,'2005-08-20 15:18:10',4022,112,'2005-08-22 19:23:10',2,'2006-02-15 21:30:53'),(13880,'2005-08-20 15:18:20',3911,268,'2005-08-24 18:03:20',2,'2006-02-15 21:30:53'),(13881,'2005-08-20 15:18:55',2831,144,'2005-08-25 11:25:55',1,'2006-02-15 21:30:53'),(13882,'2005-08-20 15:23:26',3245,51,'2005-08-22 13:03:26',1,'2006-02-15 21:30:53'),(13883,'2005-08-20 15:28:53',584,568,'2005-08-21 13:11:53',1,'2006-02-15 21:30:53'),(13884,'2005-08-20 15:30:51',3182,466,'2005-08-26 13:34:51',1,'2006-02-15 21:30:53'),(13885,'2005-08-20 15:32:09',3195,537,'2005-08-26 15:54:09',1,'2006-02-15 21:30:53'),(13886,'2005-08-20 15:34:43',2248,73,'2005-08-26 11:48:43',2,'2006-02-15 21:30:53'),(13887,'2005-08-20 15:39:00',4002,413,'2005-08-24 16:17:00',2,'2006-02-15 21:30:53'),(13888,'2005-08-20 15:39:42',1943,297,'2005-08-28 13:41:42',1,'2006-02-15 21:30:53'),(13889,'2005-08-20 15:40:06',4406,501,'2005-08-22 14:09:06',2,'2006-02-15 21:30:53'),(13890,'2005-08-20 15:41:00',2965,54,'2005-08-22 16:00:00',1,'2006-02-15 21:30:53'),(13891,'2005-08-20 15:42:05',2042,289,'2005-08-25 13:26:05',1,'2006-02-15 21:30:53'),(13892,'2005-08-20 15:50:17',1236,337,'2005-08-29 13:33:17',2,'2006-02-15 21:30:53'),(13893,'2005-08-20 15:52:52',3503,390,'2005-08-27 16:21:52',2,'2006-02-15 21:30:53'),(13894,'2005-08-20 15:55:20',2649,360,'2005-08-26 17:26:20',2,'2006-02-15 21:30:53'),(13895,'2005-08-20 15:58:28',3060,12,'2005-08-26 15:07:28',2,'2006-02-15 21:30:53'),(13896,'2005-08-20 15:59:56',1338,278,'2005-08-21 20:14:56',2,'2006-02-15 21:30:53'),(13897,'2005-08-20 16:02:28',628,258,'2005-08-23 14:29:28',1,'2006-02-15 21:30:53'),(13898,'2006-02-14 15:16:03',4007,369,NULL,2,'2006-02-15 21:30:53'),(13899,'2005-08-20 16:05:11',427,204,'2005-08-23 15:14:11',2,'2006-02-15 21:30:53'),(13900,'2005-08-20 16:05:41',1140,66,'2005-08-22 15:13:41',1,'2006-02-15 21:30:53'),(13901,'2005-08-20 16:06:53',3281,166,'2005-08-28 11:30:53',1,'2006-02-15 21:30:53'),(13902,'2005-08-20 16:07:08',1165,275,'2005-08-24 16:43:08',2,'2006-02-15 21:30:53'),(13903,'2005-08-20 16:07:55',1676,272,'2005-08-25 18:26:55',1,'2006-02-15 21:30:53'),(13904,'2005-08-20 16:11:34',721,93,'2005-08-26 12:46:34',1,'2006-02-15 21:30:53'),(13905,'2005-08-20 16:12:48',2714,437,'2005-08-28 16:05:48',1,'2006-02-15 21:30:53'),(13906,'2005-08-20 16:16:03',3960,87,'2005-08-21 13:29:03',2,'2006-02-15 21:30:53'),(13907,'2005-08-20 16:17:27',806,328,'2005-08-24 20:14:27',2,'2006-02-15 21:30:53'),(13908,'2005-08-20 16:21:40',3661,532,'2005-08-29 21:16:40',1,'2006-02-15 21:30:53'),(13909,'2005-08-20 16:26:36',1508,309,'2005-08-21 20:59:36',2,'2006-02-15 21:30:53'),(13910,'2005-08-20 16:30:49',252,133,'2005-08-24 13:30:49',2,'2006-02-15 21:30:53'),(13911,'2005-08-20 16:31:33',4400,304,'2005-08-28 19:26:33',2,'2006-02-15 21:30:53'),(13912,'2005-08-20 16:32:10',968,207,'2005-08-29 17:37:10',2,'2006-02-15 21:30:53'),(13913,'2005-08-20 16:37:35',4259,197,'2005-08-26 13:12:35',2,'2006-02-15 21:30:53'),(13914,'2005-08-20 16:38:57',3037,237,'2005-08-26 14:53:57',2,'2006-02-15 21:30:53'),(13915,'2005-08-20 16:42:53',1180,129,'2005-08-23 20:30:53',2,'2006-02-15 21:30:53'),(13916,'2005-08-20 16:43:02',2971,302,'2005-08-25 19:21:02',1,'2006-02-15 21:30:53'),(13917,'2005-08-20 16:43:28',4326,10,'2005-08-29 16:44:28',2,'2006-02-15 21:30:53'),(13918,'2005-08-20 16:47:32',3301,248,'2005-08-21 12:00:32',2,'2006-02-15 21:30:53'),(13919,'2005-08-20 16:47:34',909,129,'2005-08-23 21:27:34',2,'2006-02-15 21:30:53'),(13920,'2005-08-20 16:51:18',3200,460,'2005-08-27 16:05:18',2,'2006-02-15 21:30:53'),(13921,'2005-08-20 16:57:11',3943,59,'2005-08-22 19:25:11',2,'2006-02-15 21:30:53'),(13922,'2005-08-20 17:02:37',1398,237,'2005-08-29 19:28:37',1,'2006-02-15 21:30:53'),(13923,'2005-08-20 17:05:02',3129,588,'2005-08-27 11:22:02',2,'2006-02-15 21:30:53'),(13924,'2005-08-20 17:05:18',3066,444,'2005-08-23 16:54:18',2,'2006-02-15 21:30:53'),(13925,'2005-08-20 17:05:34',4034,565,'2005-08-27 15:32:34',2,'2006-02-15 21:30:53'),(13926,'2005-08-20 17:09:27',932,158,'2005-08-28 13:42:27',2,'2006-02-15 21:30:53'),(13927,'2005-08-20 17:11:58',4284,417,'2005-08-24 12:44:58',1,'2006-02-15 21:30:53'),(13928,'2005-08-20 17:12:28',1121,244,'2005-08-21 13:33:28',1,'2006-02-15 21:30:53'),(13929,'2005-08-20 17:13:48',946,57,'2005-08-28 15:19:48',1,'2006-02-15 21:30:53'),(13930,'2005-08-20 17:15:06',3585,58,'2005-08-21 14:29:06',1,'2006-02-15 21:30:53'),(13931,'2005-08-20 17:16:10',3884,32,'2005-08-27 12:03:10',2,'2006-02-15 21:30:53'),(13932,'2005-08-20 17:17:00',471,441,'2005-08-24 14:06:00',1,'2006-02-15 21:30:53'),(13933,'2005-08-20 17:17:07',647,159,'2005-08-22 18:10:07',2,'2006-02-15 21:30:53'),(13934,'2005-08-20 17:18:48',4567,457,'2005-08-26 15:31:48',1,'2006-02-15 21:30:53'),(13935,'2005-08-20 17:20:49',4426,205,'2005-08-24 16:52:49',2,'2006-02-15 21:30:53'),(13936,'2005-08-20 17:22:35',1731,364,'2005-08-23 20:07:35',2,'2006-02-15 21:30:53'),(13937,'2005-08-20 17:22:51',1755,172,'2005-08-27 15:51:51',1,'2006-02-15 21:30:53'),(13938,'2005-08-20 17:24:45',3743,463,'2005-08-21 18:39:45',1,'2006-02-15 21:30:53'),(13939,'2005-08-20 17:28:01',2700,585,'2005-08-23 14:40:01',2,'2006-02-15 21:30:53'),(13940,'2005-08-20 17:28:57',2638,187,'2005-08-27 22:07:57',1,'2006-02-15 21:30:53'),(13941,'2006-02-14 15:16:03',2727,476,NULL,2,'2006-02-15 21:30:53'),(13942,'2005-08-20 17:30:52',4403,211,'2005-08-25 13:46:52',2,'2006-02-15 21:30:53'),(13943,'2005-08-20 17:31:18',22,464,'2005-08-24 11:33:18',1,'2006-02-15 21:30:53'),(13944,'2005-08-20 17:41:16',3685,408,'2005-08-23 12:02:16',1,'2006-02-15 21:30:53'),(13945,'2005-08-20 17:43:56',3328,270,'2005-08-26 19:19:56',1,'2006-02-15 21:30:53'),(13946,'2005-08-20 17:44:32',3564,529,'2005-08-28 19:19:32',1,'2006-02-15 21:30:53'),(13947,'2005-08-20 17:46:06',2562,218,'2005-08-29 23:44:06',2,'2006-02-15 21:30:53'),(13948,'2005-08-20 17:50:48',4033,410,'2005-08-25 20:56:48',2,'2006-02-15 21:30:53'),(13949,'2005-08-20 17:55:13',1518,34,'2005-08-22 20:49:13',1,'2006-02-15 21:30:53'),(13950,'2005-08-20 17:58:00',3978,93,'2005-08-29 23:23:00',1,'2006-02-15 21:30:53'),(13951,'2005-08-20 17:58:11',2034,40,'2005-08-26 14:50:11',2,'2006-02-15 21:30:53'),(13952,'2006-02-14 15:16:03',224,199,NULL,2,'2006-02-15 21:30:53'),(13953,'2005-08-20 18:00:37',1818,371,'2005-08-28 14:52:37',1,'2006-02-15 21:30:53'),(13954,'2005-08-20 18:02:41',3812,207,'2005-08-27 21:52:41',2,'2006-02-15 21:30:53'),(13955,'2005-08-20 18:05:12',2613,273,'2005-08-29 18:25:12',1,'2006-02-15 21:30:53'),(13956,'2005-08-20 18:08:19',3757,484,'2005-08-29 17:03:19',1,'2006-02-15 21:30:53'),(13957,'2005-08-20 18:09:04',2889,179,'2005-08-23 16:52:04',1,'2006-02-15 21:30:53'),(13958,'2005-08-20 18:11:44',2380,33,'2005-08-28 14:59:44',1,'2006-02-15 21:30:53'),(13959,'2005-08-20 18:16:21',2283,142,'2005-08-22 13:56:21',2,'2006-02-15 21:30:53'),(13960,'2005-08-20 18:16:26',4177,459,'2005-08-29 14:06:26',1,'2006-02-15 21:30:53'),(13961,'2005-08-20 18:16:34',2271,129,'2005-08-21 16:14:34',1,'2006-02-15 21:30:53'),(13962,'2005-08-20 18:18:06',1434,348,'2005-08-24 22:16:06',2,'2006-02-15 21:30:53'),(13963,'2005-08-20 18:20:18',4145,368,'2005-08-24 21:26:18',1,'2006-02-15 21:30:53'),(13964,'2005-08-20 18:24:26',108,128,'2005-08-21 21:19:26',2,'2006-02-15 21:30:53'),(13965,'2006-02-14 15:16:03',670,324,NULL,2,'2006-02-15 21:30:53'),(13966,'2005-08-20 18:28:28',4520,260,'2005-08-22 16:49:28',2,'2006-02-15 21:30:53'),(13967,'2005-08-20 18:28:46',2751,459,'2005-08-26 17:37:46',2,'2006-02-15 21:30:53'),(13968,'2006-02-14 15:16:03',3715,15,NULL,2,'2006-02-15 21:30:53'),(13969,'2005-08-20 18:42:40',1836,237,'2005-08-27 17:33:40',2,'2006-02-15 21:30:53'),(13970,'2005-08-20 18:43:34',1942,418,'2005-08-22 15:17:34',2,'2006-02-15 21:30:53'),(13971,'2005-08-20 18:44:53',1678,64,'2005-08-22 16:25:53',2,'2006-02-15 21:30:53'),(13972,'2005-08-20 18:52:17',1687,553,'2005-08-28 15:19:17',1,'2006-02-15 21:30:53'),(13973,'2005-08-20 18:52:43',1181,58,'2005-08-21 19:11:43',1,'2006-02-15 21:30:53'),(13974,'2005-08-20 18:54:59',1912,479,'2005-08-28 13:02:59',1,'2006-02-15 21:30:53'),(13975,'2005-08-20 18:58:23',3821,286,'2005-08-25 20:58:23',1,'2006-02-15 21:30:53'),(13976,'2005-08-20 19:02:16',1785,278,'2005-08-25 17:58:16',2,'2006-02-15 21:30:53'),(13977,'2005-08-20 19:02:34',1126,115,'2005-08-24 14:14:34',1,'2006-02-15 21:30:53'),(13978,'2005-08-20 19:03:25',1263,260,'2005-08-27 18:02:25',2,'2006-02-15 21:30:53'),(13979,'2005-08-20 19:03:49',2998,211,'2005-08-24 21:23:49',1,'2006-02-15 21:30:53'),(13980,'2005-08-20 19:04:40',1067,391,'2005-08-21 18:36:40',2,'2006-02-15 21:30:53'),(13981,'2005-08-20 19:07:20',3342,249,'2005-08-23 15:13:20',1,'2006-02-15 21:30:53'),(13982,'2005-08-20 19:08:25',2901,448,'2005-08-28 15:59:25',2,'2006-02-15 21:30:53'),(13983,'2005-08-20 19:08:32',457,231,'2005-08-29 23:45:32',1,'2006-02-15 21:30:53'),(13984,'2005-08-20 19:12:30',2183,473,'2005-08-29 22:04:30',1,'2006-02-15 21:30:53'),(13985,'2005-08-20 19:13:06',1081,339,'2005-08-24 21:24:06',2,'2006-02-15 21:30:53'),(13986,'2005-08-20 19:13:23',3701,152,'2005-08-22 20:59:23',2,'2006-02-15 21:30:53'),(13987,'2005-08-20 19:19:30',1443,246,'2005-08-23 15:37:30',2,'2006-02-15 21:30:53'),(13988,'2005-08-20 19:21:28',3567,466,'2005-08-21 22:20:28',2,'2006-02-15 21:30:53'),(13989,'2005-08-20 19:27:50',1470,252,'2005-08-28 15:17:50',2,'2006-02-15 21:30:53'),(13990,'2005-08-20 19:29:23',2272,481,'2005-08-25 18:50:23',2,'2006-02-15 21:30:53'),(13991,'2005-08-20 19:29:44',1971,296,'2005-08-24 21:10:44',1,'2006-02-15 21:30:53'),(13992,'2005-08-20 19:30:35',2798,136,'2005-08-24 19:09:35',2,'2006-02-15 21:30:53'),(13993,'2005-08-20 19:32:29',1158,93,'2005-08-26 16:59:29',2,'2006-02-15 21:30:53'),(13994,'2005-08-20 19:33:21',142,180,'2005-08-24 20:55:21',1,'2006-02-15 21:30:53'),(13995,'2005-08-20 19:34:43',3789,381,'2005-08-25 22:25:43',2,'2006-02-15 21:30:53'),(13996,'2005-08-20 19:45:43',3341,306,'2005-08-22 16:47:43',2,'2006-02-15 21:30:53'),(13997,'2005-08-20 19:51:28',2330,175,'2005-08-26 01:29:28',2,'2006-02-15 21:30:53'),(13998,'2005-08-20 19:52:38',3936,530,'2005-08-26 14:57:38',1,'2006-02-15 21:30:53'),(13999,'2005-08-20 19:53:32',4149,239,'2005-08-26 19:01:32',1,'2006-02-15 21:30:53'),(14000,'2005-08-20 20:06:05',3907,276,'2005-08-28 17:02:05',1,'2006-02-15 21:30:53'),(14001,'2005-08-20 20:07:15',1318,120,'2005-08-27 00:50:15',2,'2006-02-15 21:30:53'),(14002,'2005-08-20 20:12:19',87,33,'2005-08-23 00:23:19',1,'2006-02-15 21:30:53'),(14003,'2005-08-20 20:16:06',3165,256,'2005-08-28 14:36:06',1,'2006-02-15 21:30:53'),(14004,'2005-08-20 20:16:35',3445,358,'2005-08-28 17:23:35',2,'2006-02-15 21:30:53'),(14005,'2005-08-20 20:19:05',1415,135,'2005-08-26 01:42:05',2,'2006-02-15 21:30:53'),(14006,'2005-08-20 20:21:36',2189,186,'2005-08-21 15:26:36',1,'2006-02-15 21:30:53'),(14007,'2005-08-20 20:22:47',374,284,'2005-08-28 20:40:47',2,'2006-02-15 21:30:53'),(14008,'2005-08-20 20:26:00',2427,560,'2005-08-28 17:23:00',2,'2006-02-15 21:30:53'),(14009,'2005-08-20 20:26:53',3004,382,'2005-08-21 23:32:53',2,'2006-02-15 21:30:53'),(14010,'2005-08-20 20:29:46',934,537,'2005-08-26 17:37:46',2,'2006-02-15 21:30:53'),(14011,'2005-08-20 20:32:56',1212,379,'2005-08-28 21:44:56',1,'2006-02-15 21:30:53'),(14012,'2005-08-20 20:42:12',1866,274,'2005-08-23 23:10:12',2,'2006-02-15 21:30:53'),(14013,'2005-08-20 20:42:50',3941,496,'2005-08-25 21:37:50',2,'2006-02-15 21:30:53'),(14014,'2005-08-20 20:47:09',2188,335,'2005-08-21 22:08:09',2,'2006-02-15 21:30:53'),(14015,'2005-08-20 20:47:43',3145,554,'2005-08-26 19:37:43',1,'2006-02-15 21:30:53'),(14016,'2005-08-20 20:52:03',509,220,'2005-08-23 18:04:03',2,'2006-02-15 21:30:53'),(14017,'2005-08-20 20:55:32',920,230,'2005-08-23 16:12:32',1,'2006-02-15 21:30:53'),(14018,'2006-02-14 15:16:03',2136,533,NULL,2,'2006-02-15 21:30:53'),(14019,'2005-08-20 20:59:15',1929,202,'2005-08-28 17:29:15',2,'2006-02-15 21:30:53'),(14020,'2005-08-20 20:59:43',2257,72,'2005-08-23 17:11:43',2,'2006-02-15 21:30:53'),(14021,'2005-08-20 21:02:12',4394,147,'2005-08-27 22:15:12',1,'2006-02-15 21:30:53'),(14022,'2005-08-20 21:08:49',4068,170,'2005-08-29 21:57:49',1,'2006-02-15 21:30:53'),(14023,'2005-08-20 21:10:32',2668,304,'2005-08-23 20:57:32',1,'2006-02-15 21:30:53'),(14024,'2005-08-20 21:13:58',1492,87,'2005-08-29 23:02:58',1,'2006-02-15 21:30:53'),(14025,'2005-08-20 21:19:36',4521,37,'2005-08-29 23:39:36',1,'2006-02-15 21:30:53'),(14026,'2005-08-20 21:21:08',115,231,'2005-08-22 23:19:08',2,'2006-02-15 21:30:53'),(14027,'2005-08-20 21:21:34',284,432,'2005-08-28 17:46:34',1,'2006-02-15 21:30:53'),(14028,'2005-08-20 21:23:03',4061,158,'2005-08-25 17:29:03',2,'2006-02-15 21:30:53'),(14029,'2005-08-20 21:23:11',2653,219,'2005-08-22 18:01:11',2,'2006-02-15 21:30:53'),(14030,'2005-08-20 21:23:54',1027,127,'2005-08-27 01:19:54',1,'2006-02-15 21:30:53'),(14031,'2005-08-20 21:24:24',440,361,'2005-08-23 21:47:24',2,'2006-02-15 21:30:53'),(14032,'2005-08-20 21:26:55',3542,317,'2005-08-26 19:19:55',1,'2006-02-15 21:30:53'),(14033,'2005-08-20 21:30:53',525,243,'2005-08-23 01:45:53',2,'2006-02-15 21:30:53'),(14034,'2005-08-20 21:31:52',3484,200,'2005-08-29 00:13:52',1,'2006-02-15 21:30:53'),(14035,'2005-08-20 21:31:58',2035,260,'2005-08-22 16:28:58',1,'2006-02-15 21:30:53'),(14036,'2005-08-20 21:35:27',202,256,'2005-08-23 03:29:27',1,'2006-02-15 21:30:53'),(14037,'2005-08-20 21:35:58',3655,372,'2005-08-29 23:06:58',2,'2006-02-15 21:30:53'),(14038,'2005-08-20 21:39:23',1069,589,'2005-08-27 23:57:23',2,'2006-02-15 21:30:53'),(14039,'2005-08-20 21:39:43',4187,383,'2005-08-24 19:03:43',1,'2006-02-15 21:30:53'),(14040,'2005-08-20 21:43:44',905,17,'2005-08-25 16:30:44',1,'2006-02-15 21:30:53'),(14041,'2005-08-20 21:45:23',52,247,'2005-08-26 01:42:23',1,'2006-02-15 21:30:53'),(14042,'2005-08-20 21:45:51',505,322,'2005-08-23 19:57:51',2,'2006-02-15 21:30:53'),(14043,'2005-08-20 21:46:43',1485,586,'2005-08-21 18:27:43',2,'2006-02-15 21:30:53'),(14044,'2005-08-20 21:48:38',1422,145,'2005-08-29 02:56:38',1,'2006-02-15 21:30:53'),(14045,'2005-08-20 21:50:11',3010,509,'2005-08-25 19:03:11',2,'2006-02-15 21:30:53'),(14046,'2005-08-20 21:53:21',2352,524,'2005-08-23 17:51:21',2,'2006-02-15 21:30:53'),(14047,'2005-08-20 22:00:43',186,579,'2005-08-24 03:17:43',2,'2006-02-15 21:30:53'),(14048,'2005-08-20 22:03:18',3475,105,'2005-08-25 02:57:18',2,'2006-02-15 21:30:53'),(14049,'2005-08-20 22:08:55',1335,112,'2005-08-28 20:24:55',1,'2006-02-15 21:30:53'),(14050,'2005-08-20 22:09:04',1737,596,'2005-08-26 01:39:04',2,'2006-02-15 21:30:53'),(14051,'2005-08-20 22:09:51',4012,362,'2005-08-29 04:04:51',2,'2006-02-15 21:30:53'),(14052,'2005-08-20 22:11:46',3893,514,'2005-08-22 20:26:46',2,'2006-02-15 21:30:53'),(14053,'2005-08-20 22:13:59',2177,5,'2005-08-26 20:50:59',2,'2006-02-15 21:30:53'),(14054,'2005-08-20 22:17:01',338,50,'2005-08-21 21:34:01',1,'2006-02-15 21:30:53'),(14055,'2005-08-20 22:18:00',1571,148,'2005-08-22 02:09:00',2,'2006-02-15 21:30:53'),(14056,'2005-08-20 22:18:53',1300,22,'2005-08-27 01:05:53',2,'2006-02-15 21:30:53'),(14057,'2005-08-20 22:22:59',1526,333,'2005-08-25 16:58:59',2,'2006-02-15 21:30:53'),(14058,'2005-08-20 22:24:35',178,430,'2005-08-30 02:26:35',1,'2006-02-15 21:30:53'),(14059,'2005-08-20 22:24:44',2045,141,'2005-08-26 21:25:44',2,'2006-02-15 21:30:53'),(14060,'2006-02-14 15:16:03',3100,175,NULL,2,'2006-02-15 21:30:53'),(14061,'2005-08-20 22:32:11',73,53,'2005-08-22 19:28:11',1,'2006-02-15 21:30:53'),(14062,'2005-08-20 22:34:34',2841,239,'2005-08-25 17:11:34',2,'2006-02-15 21:30:53'),(14063,'2005-08-20 22:36:40',1215,275,'2005-08-25 00:18:40',2,'2006-02-15 21:30:53'),(14064,'2005-08-20 22:39:16',2938,103,'2005-08-22 00:45:16',2,'2006-02-15 21:30:53'),(14065,'2005-08-20 22:40:47',3758,190,'2005-08-24 01:47:47',1,'2006-02-15 21:30:53'),(14066,'2005-08-20 22:45:58',2444,274,'2005-08-29 00:23:58',2,'2006-02-15 21:30:53'),(14067,'2005-08-20 22:49:23',1376,259,'2005-08-29 22:28:23',2,'2006-02-15 21:30:53'),(14068,'2005-08-20 22:50:59',818,412,'2005-08-29 00:45:59',1,'2006-02-15 21:30:53'),(14069,'2005-08-20 22:51:25',2239,197,'2005-08-30 00:30:25',2,'2006-02-15 21:30:53'),(14070,'2005-08-20 22:56:34',846,581,'2005-08-29 22:02:34',1,'2006-02-15 21:30:53'),(14071,'2005-08-20 23:01:56',2471,550,'2005-08-22 02:14:56',1,'2006-02-15 21:30:53'),(14072,'2005-08-20 23:07:10',2387,515,'2005-08-23 03:38:10',2,'2006-02-15 21:30:53'),(14073,'2005-08-20 23:12:57',2996,230,'2005-08-28 18:47:57',2,'2006-02-15 21:30:53'),(14074,'2005-08-20 23:16:07',1303,506,'2005-08-26 04:45:07',1,'2006-02-15 21:30:53'),(14075,'2005-08-20 23:18:54',3793,32,'2005-08-26 21:59:54',2,'2006-02-15 21:30:53'),(14076,'2005-08-20 23:20:10',1070,574,'2005-08-24 04:00:10',1,'2006-02-15 21:30:53'),(14077,'2005-08-20 23:24:07',3184,21,'2005-08-29 02:53:07',1,'2006-02-15 21:30:53'),(14078,'2005-08-20 23:26:40',1642,396,'2005-08-28 02:30:40',1,'2006-02-15 21:30:53'),(14079,'2005-08-20 23:29:25',3528,348,'2005-08-25 04:16:25',2,'2006-02-15 21:30:53'),(14080,'2005-08-20 23:29:50',3962,266,'2005-08-26 00:33:50',1,'2006-02-15 21:30:53'),(14081,'2005-08-20 23:35:13',589,392,'2005-08-28 01:41:13',2,'2006-02-15 21:30:53'),(14082,'2005-08-20 23:42:00',3767,179,'2005-08-27 00:59:00',1,'2006-02-15 21:30:53'),(14083,'2005-08-20 23:42:31',1823,176,'2005-08-28 21:44:31',1,'2006-02-15 21:30:53'),(14084,'2005-08-20 23:42:46',900,37,'2005-08-24 20:06:46',1,'2006-02-15 21:30:53'),(14085,'2005-08-20 23:46:24',3506,471,'2005-08-29 02:31:24',2,'2006-02-15 21:30:53'),(14086,'2005-08-20 23:47:54',3244,253,'2005-08-27 22:49:54',1,'2006-02-15 21:30:53'),(14087,'2005-08-20 23:53:40',2368,289,'2005-08-26 20:22:40',1,'2006-02-15 21:30:53'),(14088,'2005-08-20 23:57:24',1184,518,'2005-08-28 21:49:24',1,'2006-02-15 21:30:53'),(14089,'2005-08-20 23:59:02',1400,425,'2005-08-27 00:19:02',1,'2006-02-15 21:30:53'),(14090,'2005-08-21 00:11:16',3254,168,'2005-08-23 19:48:16',2,'2006-02-15 21:30:53'),(14091,'2005-08-21 00:11:17',3304,53,'2005-08-27 18:38:17',1,'2006-02-15 21:30:53'),(14092,'2005-08-21 00:14:32',1596,273,'2005-08-24 22:22:32',2,'2006-02-15 21:30:53'),(14093,'2005-08-21 00:21:29',1176,177,'2005-08-22 04:01:29',1,'2006-02-15 21:30:53'),(14094,'2005-08-21 00:21:35',3674,471,'2005-08-23 05:27:35',2,'2006-02-15 21:30:53'),(14095,'2005-08-21 00:25:45',1550,489,'2005-08-28 23:00:45',1,'2006-02-15 21:30:53'),(14096,'2005-08-21 00:27:46',2089,342,'2005-08-22 22:53:46',1,'2006-02-15 21:30:53'),(14097,'2005-08-21 00:28:48',4351,88,'2005-08-29 22:15:48',1,'2006-02-15 21:30:53'),(14098,'2005-08-21 00:30:32',6,554,NULL,2,'2006-02-23 04:12:08'),(14099,'2005-08-21 00:31:03',2452,224,'2005-08-27 03:18:03',2,'2006-02-15 21:30:53'),(14100,'2005-08-21 00:31:07',4295,397,'2005-08-25 05:31:07',2,'2006-02-15 21:30:53'),(14101,'2005-08-21 00:33:03',1892,19,'2005-08-24 01:59:03',1,'2006-02-15 21:30:53'),(14102,'2005-08-21 00:35:21',3772,584,'2005-08-30 04:51:21',2,'2006-02-15 21:30:53'),(14103,'2005-08-21 00:37:00',1438,409,'2005-08-25 22:09:00',2,'2006-02-15 21:30:53'),(14104,'2005-08-21 00:37:44',912,178,'2005-08-21 22:55:44',2,'2006-02-15 21:30:53'),(14105,'2005-08-21 00:44:34',1111,71,'2005-08-29 19:00:34',1,'2006-02-15 21:30:53'),(14106,'2005-08-21 00:46:01',2673,315,'2005-08-27 23:44:01',1,'2006-02-15 21:30:53'),(14107,'2006-02-14 15:16:03',3998,251,NULL,1,'2006-02-15 21:30:53'),(14108,'2005-08-21 00:52:45',4339,243,'2005-08-21 19:35:45',2,'2006-02-15 21:30:53'),(14109,'2005-08-21 00:52:58',1046,180,'2005-08-22 00:09:58',2,'2006-02-15 21:30:53'),(14110,'2005-08-21 00:53:09',2709,35,'2005-08-24 05:33:09',2,'2006-02-15 21:30:53'),(14111,'2005-08-21 00:59:01',1294,130,'2005-08-22 20:43:01',2,'2006-02-15 21:30:53'),(14112,'2005-08-21 01:00:46',734,141,'2005-08-27 03:46:46',1,'2006-02-15 21:30:53'),(14113,'2005-08-21 01:03:30',931,288,'2005-08-23 06:46:30',2,'2006-02-15 21:30:53'),(14114,'2005-08-21 01:07:11',2270,8,'2005-08-24 20:33:11',1,'2006-02-15 21:30:53'),(14115,'2005-08-21 01:10:29',1945,257,'2005-08-24 01:21:29',1,'2006-02-15 21:30:53'),(14116,'2005-08-21 01:11:17',2356,142,'2005-08-24 23:45:17',2,'2006-02-15 21:30:53'),(14117,'2005-08-21 01:11:59',573,493,'2005-08-22 06:56:59',1,'2006-02-15 21:30:53'),(14118,'2005-08-21 01:13:37',2605,337,'2005-08-28 02:35:37',2,'2006-02-15 21:30:53'),(14119,'2005-08-21 01:15:59',129,53,'2005-08-27 23:36:59',2,'2006-02-15 21:30:53'),(14120,'2005-08-21 01:25:00',4069,302,'2005-08-24 23:21:00',2,'2006-02-15 21:30:53'),(14121,'2005-08-21 01:26:33',4207,417,'2005-08-28 22:47:33',2,'2006-02-15 21:30:53'),(14122,'2005-08-21 01:29:01',3955,86,'2005-08-27 05:31:01',1,'2006-02-15 21:30:53'),(14123,'2005-08-21 01:31:25',143,66,'2005-08-23 02:32:25',1,'2006-02-15 21:30:53'),(14124,'2005-08-21 01:31:51',311,35,'2005-08-24 22:20:51',2,'2006-02-15 21:30:53'),(14125,'2005-08-21 01:32:16',2174,265,'2005-08-26 00:09:16',1,'2006-02-15 21:30:53'),(14126,'2005-08-21 01:32:17',2738,215,'2005-08-23 01:02:17',1,'2006-02-15 21:30:53'),(14127,'2005-08-21 01:33:32',4532,550,'2005-08-22 02:47:32',2,'2006-02-15 21:30:53'),(14128,'2005-08-21 01:35:58',2594,81,'2005-08-21 21:23:58',2,'2006-02-15 21:30:53'),(14129,'2005-08-21 01:42:15',3572,362,'2005-08-23 20:04:15',2,'2006-02-15 21:30:53'),(14130,'2005-08-21 01:43:11',3859,352,'2005-08-27 21:16:11',2,'2006-02-15 21:30:53'),(14131,'2005-08-21 01:43:40',4382,267,'2005-08-29 02:00:40',2,'2006-02-15 21:30:53'),(14132,'2005-08-21 01:43:58',3806,91,'2005-08-26 20:16:58',2,'2006-02-15 21:30:53'),(14133,'2005-08-21 01:44:14',2463,453,'2005-08-30 02:19:14',2,'2006-02-15 21:30:53'),(14134,'2005-08-21 01:45:54',2159,497,'2005-08-24 01:36:54',1,'2006-02-15 21:30:53'),(14135,'2005-08-21 01:53:54',347,59,'2005-08-27 05:57:54',1,'2006-02-15 21:30:53'),(14136,'2005-08-21 01:57:26',268,135,'2005-08-28 01:11:26',1,'2006-02-15 21:30:53'),(14137,'2006-02-14 15:16:03',2346,53,NULL,2,'2006-02-15 21:30:53'),(14138,'2005-08-21 01:59:37',1238,121,'2005-08-30 01:17:37',2,'2006-02-15 21:30:53'),(14139,'2005-08-21 02:04:33',2280,561,'2005-08-22 04:16:33',2,'2006-02-15 21:30:53'),(14140,'2005-08-21 02:04:57',2070,65,'2005-08-29 06:41:57',2,'2006-02-15 21:30:53'),(14141,'2005-08-21 02:07:22',4527,190,'2005-08-30 07:32:22',1,'2006-02-15 21:30:53'),(14142,'2005-08-21 02:07:43',1479,544,'2005-08-23 02:37:43',2,'2006-02-15 21:30:53'),(14143,'2005-08-21 02:10:32',2549,146,'2005-08-23 23:50:32',1,'2006-02-15 21:30:53'),(14144,'2005-08-21 02:10:57',2366,46,'2005-08-28 01:02:57',1,'2006-02-15 21:30:53'),(14145,'2005-08-21 02:11:38',150,314,'2005-08-22 22:19:38',2,'2006-02-15 21:30:53'),(14146,'2005-08-21 02:13:31',2151,192,'2005-08-24 22:47:31',2,'2006-02-15 21:30:53'),(14147,'2005-08-21 02:14:03',1476,366,'2005-08-27 22:38:03',1,'2006-02-15 21:30:53'),(14148,'2005-08-21 02:17:49',1605,528,'2005-08-22 00:12:49',1,'2006-02-15 21:30:53'),(14149,'2005-08-21 02:22:47',3371,518,'2005-08-24 02:36:47',1,'2006-02-15 21:30:53'),(14150,'2005-08-21 02:23:03',2324,161,'2005-08-25 22:50:03',2,'2006-02-15 21:30:53'),(14151,'2005-08-21 02:23:25',2785,426,'2005-08-30 07:08:25',1,'2006-02-15 21:30:53'),(14152,'2005-08-21 02:23:50',2561,379,'2005-08-25 06:05:50',1,'2006-02-15 21:30:53'),(14153,'2005-08-21 02:24:33',1502,120,'2005-08-27 05:28:33',2,'2006-02-15 21:30:53'),(14154,'2005-08-21 02:30:00',951,468,'2005-08-28 01:41:00',2,'2006-02-15 21:30:53'),(14155,'2005-08-21 02:31:35',769,148,'2005-08-27 06:00:35',2,'2006-02-15 21:30:53'),(14156,'2005-08-21 02:35:16',437,147,'2005-08-27 01:32:16',2,'2006-02-15 21:30:53'),(14157,'2005-08-21 02:43:15',4471,128,'2005-08-24 02:47:15',1,'2006-02-15 21:30:53'),(14158,'2005-08-21 02:43:20',474,114,'2005-08-28 02:19:20',1,'2006-02-15 21:30:53'),(14159,'2005-08-21 02:45:58',3231,144,'2005-08-27 04:53:58',1,'2006-02-15 21:30:53'),(14160,'2006-02-14 15:16:03',2428,493,NULL,2,'2006-02-15 21:30:53'),(14161,'2005-08-21 02:51:59',2744,21,'2005-08-28 21:38:59',2,'2006-02-15 21:30:53'),(14162,'2005-08-21 02:55:34',3788,315,'2005-08-27 00:13:34',1,'2006-02-15 21:30:53'),(14163,'2005-08-21 02:56:52',1007,204,'2005-08-21 21:03:52',2,'2006-02-15 21:30:53'),(14164,'2005-08-21 02:58:02',2381,274,'2005-08-29 23:17:02',2,'2006-02-15 21:30:53'),(14165,'2005-08-21 02:59:17',4151,150,'2005-08-24 23:09:17',2,'2006-02-15 21:30:53'),(14166,'2005-08-21 02:59:31',2457,190,'2005-08-24 23:19:31',2,'2006-02-15 21:30:53'),(14167,'2005-08-21 02:59:48',1005,64,'2005-08-29 22:17:48',1,'2006-02-15 21:30:53'),(14168,'2005-08-21 03:00:03',1321,49,'2005-08-29 06:04:03',2,'2006-02-15 21:30:53'),(14169,'2005-08-21 03:00:31',3800,396,'2005-08-30 01:16:31',1,'2006-02-15 21:30:53'),(14170,'2005-08-21 03:00:39',894,259,'2005-08-27 23:07:39',1,'2006-02-15 21:30:53'),(14171,'2005-08-21 03:00:42',4179,320,'2005-08-24 00:54:42',1,'2006-02-15 21:30:53'),(14172,'2006-02-14 15:16:03',2158,450,NULL,2,'2006-02-15 21:30:53'),(14173,'2005-08-21 03:01:01',3175,152,'2005-08-22 02:40:01',1,'2006-02-15 21:30:53'),(14174,'2005-08-21 03:01:45',1862,29,'2005-08-22 07:19:45',2,'2006-02-15 21:30:53'),(14175,'2006-02-14 15:16:03',2021,452,NULL,1,'2006-02-15 21:30:53'),(14176,'2005-08-21 03:09:23',4420,556,'2005-08-26 21:26:23',1,'2006-02-15 21:30:53'),(14177,'2005-08-21 03:11:33',409,121,'2005-08-28 21:41:33',2,'2006-02-15 21:30:53'),(14178,'2005-08-21 03:13:45',2178,524,'2005-08-22 01:50:45',1,'2006-02-15 21:30:53'),(14179,'2005-08-21 03:14:27',3956,79,'2005-08-26 00:46:27',2,'2006-02-15 21:30:53'),(14180,'2005-08-21 03:16:15',796,262,'2005-08-24 22:31:15',2,'2006-02-15 21:30:53'),(14181,'2005-08-21 03:16:30',197,210,'2005-08-29 06:25:30',2,'2006-02-15 21:30:53'),(14182,'2005-08-21 03:17:10',2422,519,'2005-08-24 21:46:10',1,'2006-02-15 21:30:53'),(14183,'2005-08-21 03:24:29',1888,26,'2005-08-22 07:25:29',2,'2006-02-15 21:30:53'),(14184,'2005-08-21 03:24:50',3759,148,'2005-08-29 01:46:50',2,'2006-02-15 21:30:53'),(14185,'2005-08-21 03:28:37',3957,579,'2005-08-26 01:15:37',1,'2006-02-15 21:30:53'),(14186,'2005-08-21 03:31:07',3158,461,'2005-08-28 07:29:07',2,'2006-02-15 21:30:53'),(14187,'2005-08-21 03:32:03',4031,275,'2005-08-25 03:29:03',2,'2006-02-15 21:30:53'),(14188,'2005-08-21 03:32:04',4492,548,'2005-08-22 07:26:04',1,'2006-02-15 21:30:53'),(14189,'2005-08-21 03:32:17',2209,127,'2005-08-22 04:46:17',2,'2006-02-15 21:30:53'),(14190,'2005-08-21 03:35:21',4203,517,'2005-08-29 07:35:21',2,'2006-02-15 21:30:53'),(14191,'2005-08-21 03:35:58',301,423,'2005-08-28 00:28:58',1,'2006-02-15 21:30:53'),(14192,'2005-08-21 03:37:42',3563,26,'2005-08-28 05:31:42',2,'2006-02-15 21:30:53'),(14193,'2005-08-21 03:38:27',513,25,'2005-08-28 09:16:27',1,'2006-02-15 21:30:53'),(14194,'2005-08-21 03:40:11',2003,138,'2005-08-26 07:38:11',1,'2006-02-15 21:30:53'),(14195,'2005-08-21 03:40:35',3732,93,'2005-08-23 01:22:35',1,'2006-02-15 21:30:53'),(14196,'2005-08-21 03:40:40',4477,281,'2005-08-25 05:55:40',1,'2006-02-15 21:30:53'),(14197,'2005-08-21 03:47:25',340,469,'2005-08-30 09:15:25',2,'2006-02-15 21:30:53'),(14198,'2005-08-21 03:48:31',465,381,'2005-08-24 07:10:31',2,'2006-02-15 21:30:53'),(14199,'2005-08-21 03:48:43',658,442,'2005-08-23 04:01:43',1,'2006-02-15 21:30:53'),(14200,'2005-08-21 03:51:27',2339,349,'2005-08-29 22:00:27',1,'2006-02-15 21:30:53'),(14201,'2005-08-21 03:51:34',314,427,'2005-08-30 03:42:34',2,'2006-02-15 21:30:53'),(14202,'2005-08-21 03:51:52',1995,473,'2005-08-22 09:35:52',1,'2006-02-15 21:30:53'),(14203,'2005-08-21 03:51:52',3668,95,'2005-08-24 06:13:52',2,'2006-02-15 21:30:53'),(14204,'2006-02-14 15:16:03',4334,287,NULL,1,'2006-02-15 21:30:53'),(14205,'2005-08-21 03:57:15',315,406,'2005-08-30 08:46:15',2,'2006-02-15 21:30:53'),(14206,'2005-08-21 03:59:26',860,279,'2005-08-26 03:52:26',1,'2006-02-15 21:30:53'),(14207,'2005-08-21 04:08:19',1327,569,'2005-08-29 07:59:19',2,'2006-02-15 21:30:53'),(14208,'2005-08-21 04:09:18',4180,299,'2005-08-22 03:29:18',1,'2006-02-15 21:30:53'),(14209,'2005-08-21 04:17:56',896,472,'2005-08-27 06:57:56',1,'2006-02-15 21:30:53'),(14210,'2005-08-21 04:28:02',1867,468,'2005-08-24 02:14:02',2,'2006-02-15 21:30:53'),(14211,'2005-08-21 04:29:11',300,372,'2005-08-24 02:50:11',2,'2006-02-15 21:30:53'),(14212,'2005-08-21 04:29:26',4540,354,'2005-08-24 00:46:26',2,'2006-02-15 21:30:53'),(14213,'2005-08-21 04:30:47',382,511,'2005-08-24 23:01:47',1,'2006-02-15 21:30:53'),(14214,'2005-08-21 04:30:49',4510,198,'2005-08-26 04:42:49',1,'2006-02-15 21:30:53'),(14215,'2005-08-21 04:34:11',35,54,'2005-08-27 10:30:11',2,'2006-02-15 21:30:53'),(14216,'2006-02-14 15:16:03',3763,186,NULL,1,'2006-02-15 21:30:53'),(14217,'2005-08-21 04:37:56',2847,66,'2005-08-26 03:55:56',2,'2006-02-15 21:30:53'),(14218,'2005-08-21 04:43:59',4087,104,'2005-08-27 10:29:59',1,'2006-02-15 21:30:53'),(14219,'2006-02-14 15:16:03',3718,334,NULL,2,'2006-02-15 21:30:53'),(14220,'2006-02-14 15:16:03',2618,162,NULL,1,'2006-02-15 21:30:53'),(14221,'2005-08-21 04:49:41',3824,51,'2005-08-29 23:52:41',1,'2006-02-15 21:30:53'),(14222,'2005-08-21 04:49:48',714,7,'2005-08-25 05:34:48',2,'2006-02-15 21:30:53'),(14223,'2005-08-21 04:51:51',514,392,'2005-08-29 00:37:51',1,'2006-02-15 21:30:53'),(14224,'2005-08-21 04:53:08',3634,323,'2005-08-27 04:12:08',2,'2006-02-15 21:30:53'),(14225,'2005-08-21 04:53:37',984,4,'2005-08-25 23:39:37',2,'2006-02-15 21:30:53'),(14226,'2005-08-21 04:55:37',1793,316,'2005-08-24 04:32:37',1,'2006-02-15 21:30:53'),(14227,'2005-08-21 04:56:31',4102,277,'2005-08-22 05:04:31',2,'2006-02-15 21:30:53'),(14228,'2005-08-21 04:57:08',2016,71,'2005-08-25 00:06:08',2,'2006-02-15 21:30:53'),(14229,'2005-08-21 04:57:15',4479,186,'2005-08-26 10:00:15',1,'2006-02-15 21:30:53'),(14230,'2005-08-21 04:57:29',844,584,'2005-08-27 08:14:29',2,'2006-02-15 21:30:53'),(14231,'2005-08-21 05:04:34',1244,307,'2005-08-23 04:58:34',1,'2006-02-15 21:30:53'),(14232,'2005-08-21 05:07:02',2710,176,'2005-08-29 06:57:02',1,'2006-02-15 21:30:53'),(14233,'2005-08-21 05:07:08',2943,599,'2005-08-28 03:20:08',1,'2006-02-15 21:30:53'),(14234,'2005-08-21 05:07:12',1439,271,'2005-08-23 06:44:12',2,'2006-02-15 21:30:53'),(14235,'2005-08-21 05:08:42',125,558,'2005-08-29 23:36:42',1,'2006-02-15 21:30:53'),(14236,'2005-08-21 05:13:16',172,25,'2005-08-26 04:03:16',2,'2006-02-15 21:30:53'),(14237,'2005-08-21 05:15:00',3284,410,'2005-08-25 10:06:00',1,'2006-02-15 21:30:53'),(14238,'2005-08-21 05:16:40',3148,192,'2005-08-30 02:13:40',2,'2006-02-15 21:30:53'),(14239,'2005-08-21 05:18:57',1559,416,'2005-08-22 00:12:57',2,'2006-02-15 21:30:53'),(14240,'2005-08-21 05:19:39',3294,12,'2005-08-22 23:25:39',2,'2006-02-15 21:30:53'),(14241,'2005-08-21 05:24:55',2547,291,'2005-08-30 03:33:55',1,'2006-02-15 21:30:53'),(14242,'2005-08-21 05:25:59',1588,68,'2005-08-27 07:22:59',1,'2006-02-15 21:30:53'),(14243,'2006-02-14 15:16:03',1489,264,NULL,1,'2006-02-15 21:30:53'),(14244,'2005-08-21 05:29:55',1150,43,'2005-08-24 01:06:55',1,'2006-02-15 21:30:53'),(14245,'2005-08-21 05:30:54',975,354,'2005-08-26 07:02:54',1,'2006-02-15 21:30:53'),(14246,'2005-08-21 05:34:09',3499,120,'2005-08-26 06:12:09',1,'2006-02-15 21:30:53'),(14247,'2005-08-21 05:35:17',267,302,'2005-08-26 03:22:17',1,'2006-02-15 21:30:53'),(14248,'2005-08-21 05:35:57',725,293,'2005-08-28 05:53:57',2,'2006-02-15 21:30:53'),(14249,'2005-08-21 05:38:05',695,268,'2005-08-28 09:07:05',2,'2006-02-15 21:30:53'),(14250,'2005-08-21 05:39:35',3008,313,'2005-08-28 10:06:35',2,'2006-02-15 21:30:53'),(14251,'2005-08-21 05:42:20',139,486,'2005-08-26 06:20:20',2,'2006-02-15 21:30:53'),(14252,'2005-08-21 05:44:07',2660,13,'2005-08-29 08:53:07',1,'2006-02-15 21:30:53'),(14253,'2005-08-21 05:47:52',4246,456,'2005-08-25 04:28:52',1,'2006-02-15 21:30:53'),(14254,'2005-08-21 05:51:28',1549,589,'2005-08-29 06:05:28',2,'2006-02-15 21:30:53'),(14255,'2005-08-21 05:51:37',3125,492,'2005-08-29 10:00:37',1,'2006-02-15 21:30:53'),(14256,'2005-08-21 05:52:27',2922,331,'2005-08-29 02:10:27',2,'2006-02-15 21:30:53'),(14257,'2005-08-21 05:52:57',3830,178,'2005-08-29 03:18:57',2,'2006-02-15 21:30:53'),(14258,'2005-08-21 05:56:36',752,359,'2005-08-26 06:14:36',1,'2006-02-15 21:30:53'),(14259,'2005-08-21 06:00:22',3705,583,'2005-08-22 05:38:22',2,'2006-02-15 21:30:53'),(14260,'2005-08-21 06:01:08',2961,40,'2005-08-29 09:01:08',2,'2006-02-15 21:30:53'),(14261,'2005-08-21 06:07:24',1426,166,'2005-08-26 09:57:24',1,'2006-02-15 21:30:53'),(14262,'2005-08-21 06:08:13',1430,324,'2005-08-30 10:55:13',1,'2006-02-15 21:30:53'),(14263,'2005-08-21 06:08:15',2595,533,'2005-08-29 09:22:15',2,'2006-02-15 21:30:53'),(14264,'2005-08-21 06:18:22',3426,295,'2005-08-25 08:08:22',1,'2006-02-15 21:30:53'),(14265,'2005-08-21 06:20:14',3116,134,'2005-08-23 09:05:14',1,'2006-02-15 21:30:53'),(14266,'2005-08-21 06:20:51',3543,269,'2005-08-23 00:44:51',1,'2006-02-15 21:30:53'),(14267,'2006-02-14 15:16:03',2199,527,NULL,2,'2006-02-15 21:30:53'),(14268,'2005-08-21 06:21:24',2442,278,'2005-08-23 05:39:24',2,'2006-02-15 21:30:53'),(14269,'2005-08-21 06:22:07',531,241,'2005-08-30 00:41:07',2,'2006-02-15 21:30:53'),(14270,'2005-08-21 06:22:18',4083,171,'2005-08-27 08:04:18',1,'2006-02-15 21:30:53'),(14271,'2005-08-21 06:23:29',4506,224,'2005-08-27 04:49:29',1,'2006-02-15 21:30:53'),(14272,'2005-08-21 06:24:55',3908,243,'2005-08-28 02:25:55',1,'2006-02-15 21:30:53'),(14273,'2005-08-21 06:26:48',2640,388,'2005-08-30 10:34:48',1,'2006-02-15 21:30:53'),(14274,'2005-08-21 06:29:20',3183,405,'2005-08-26 06:25:20',2,'2006-02-15 21:30:53'),(14275,'2005-08-21 06:30:30',3238,163,'2005-08-25 12:28:30',1,'2006-02-15 21:30:53'),(14276,'2005-08-21 06:34:05',3637,318,'2005-08-28 10:13:05',2,'2006-02-15 21:30:53'),(14277,'2005-08-21 06:34:41',2652,566,'2005-08-28 10:53:41',2,'2006-02-15 21:30:53'),(14278,'2006-02-14 15:16:03',2334,557,NULL,2,'2006-02-15 21:30:53'),(14279,'2005-08-21 06:39:08',3325,387,'2005-08-29 11:01:08',2,'2006-02-15 21:30:53'),(14280,'2005-08-21 06:39:58',1561,481,'2005-08-23 04:50:58',1,'2006-02-15 21:30:53'),(14281,'2005-08-21 06:40:48',1848,166,'2005-08-26 11:42:48',2,'2006-02-15 21:30:53'),(14282,'2005-08-21 06:41:29',3107,450,'2005-08-22 12:37:29',1,'2006-02-15 21:30:53'),(14283,'2005-08-21 06:44:14',3052,253,'2005-08-24 01:01:14',1,'2006-02-15 21:30:53'),(14284,'2005-08-21 06:44:37',633,486,'2005-08-28 05:03:37',1,'2006-02-15 21:30:53'),(14285,'2005-08-21 06:50:48',402,249,'2005-08-28 11:35:48',1,'2006-02-15 21:30:53'),(14286,'2005-08-21 06:53:53',2377,558,'2005-08-27 11:37:53',2,'2006-02-15 21:30:53'),(14287,'2005-08-21 06:53:59',2426,427,'2005-08-25 03:10:59',2,'2006-02-15 21:30:53'),(14288,'2005-08-21 06:57:34',587,512,'2005-08-26 11:32:34',1,'2006-02-15 21:30:53'),(14289,'2005-08-21 06:58:49',1185,103,'2005-08-25 11:29:49',2,'2006-02-15 21:30:53'),(14290,'2005-08-21 07:02:59',790,366,'2005-08-28 02:57:59',1,'2006-02-15 21:30:53'),(14291,'2005-08-21 07:03:05',3988,56,'2005-08-26 12:56:05',2,'2006-02-15 21:30:53'),(14292,'2005-08-21 07:06:20',1959,251,'2005-08-22 01:39:20',2,'2006-02-15 21:30:53'),(14293,'2005-08-21 07:06:47',3555,364,'2005-08-22 05:07:47',2,'2006-02-15 21:30:53'),(14294,'2005-08-21 07:07:26',354,455,'2005-08-22 02:20:26',2,'2006-02-15 21:30:53'),(14295,'2005-08-21 07:09:27',2187,336,'2005-08-22 01:27:27',2,'2006-02-15 21:30:53'),(14296,'2005-08-21 07:13:23',3813,275,'2005-08-26 11:14:23',1,'2006-02-15 21:30:53'),(14297,'2005-08-21 07:13:46',1712,566,'2005-08-25 09:07:46',1,'2006-02-15 21:30:53'),(14298,'2005-08-21 07:17:10',4317,410,'2005-08-25 10:10:10',1,'2006-02-15 21:30:53'),(14299,'2005-08-21 07:18:57',4028,342,'2005-08-24 01:28:57',1,'2006-02-15 21:30:53'),(14300,'2005-08-21 07:19:37',690,382,'2005-08-25 12:06:37',2,'2006-02-15 21:30:53'),(14301,'2005-08-21 07:19:48',283,162,'2005-08-28 02:06:48',1,'2006-02-15 21:30:53'),(14302,'2005-08-21 07:19:57',1287,511,'2005-08-28 02:59:57',1,'2006-02-15 21:30:53'),(14303,'2005-08-21 07:22:43',992,475,'2005-08-24 11:52:43',1,'2006-02-15 21:30:53'),(14304,'2005-08-21 07:23:10',2650,417,'2005-08-26 11:21:10',2,'2006-02-15 21:30:53'),(14305,'2005-08-21 07:29:05',2056,58,'2005-08-27 08:18:05',1,'2006-02-15 21:30:53'),(14306,'2005-08-21 07:32:35',4027,453,'2005-08-30 05:53:35',1,'2006-02-15 21:30:53'),(14307,'2005-08-21 07:34:52',2894,328,'2005-08-29 09:45:52',1,'2006-02-15 21:30:53'),(14308,'2005-08-21 07:43:21',3478,419,'2005-08-25 02:39:21',2,'2006-02-15 21:30:53'),(14309,'2005-08-21 07:44:17',4447,468,'2005-08-30 07:23:17',2,'2006-02-15 21:30:53'),(14310,'2005-08-21 07:44:32',95,177,'2005-08-22 09:02:32',1,'2006-02-15 21:30:53'),(14311,'2005-08-21 07:45:47',1761,69,'2005-08-27 02:23:47',2,'2006-02-15 21:30:53'),(14312,'2005-08-21 07:48:34',1090,238,'2005-08-23 04:45:34',1,'2006-02-15 21:30:53'),(14313,'2005-08-21 07:49:53',3384,468,'2005-08-30 05:52:53',2,'2006-02-15 21:30:53'),(14314,'2005-08-21 07:50:14',4115,178,'2005-08-24 10:47:14',2,'2006-02-15 21:30:53'),(14315,'2005-08-21 07:56:39',1164,459,'2005-08-27 04:52:39',1,'2006-02-15 21:30:53'),(14316,'2005-08-21 07:59:47',386,64,'2005-08-23 02:20:47',2,'2006-02-15 21:30:53'),(14317,'2005-08-21 08:00:40',2090,471,'2005-08-27 06:52:40',1,'2006-02-15 21:30:53'),(14318,'2006-02-14 15:16:03',1042,508,NULL,2,'2006-02-15 21:30:53'),(14319,'2005-08-21 08:00:55',4480,410,'2005-08-26 05:04:55',1,'2006-02-15 21:30:53'),(14320,'2005-08-21 08:04:40',3121,199,'2005-08-22 02:09:40',1,'2006-02-15 21:30:53'),(14321,'2005-08-21 08:05:12',967,236,'2005-08-23 02:17:12',1,'2006-02-15 21:30:53'),(14322,'2005-08-21 08:06:30',2818,221,'2005-08-29 10:12:30',2,'2006-02-15 21:30:53'),(14323,'2005-08-21 08:08:43',1257,97,'2005-08-25 10:44:43',1,'2006-02-15 21:30:53'),(14324,'2005-08-21 08:10:56',1361,155,'2005-08-30 12:09:56',1,'2006-02-15 21:30:53'),(14325,'2005-08-21 08:15:38',4432,313,'2005-08-23 08:08:38',2,'2006-02-15 21:30:53'),(14326,'2005-08-21 08:15:41',1052,17,'2005-08-27 05:22:41',1,'2006-02-15 21:30:53'),(14327,'2005-08-21 08:18:18',553,457,'2005-08-30 02:21:18',2,'2006-02-15 21:30:53'),(14328,'2005-08-21 08:18:20',3194,489,'2005-08-25 03:05:20',2,'2006-02-15 21:30:53'),(14329,'2005-08-21 08:22:56',3544,6,'2005-08-28 02:22:56',2,'2006-02-15 21:30:53'),(14330,'2005-08-21 08:29:20',763,84,'2005-08-30 03:59:20',2,'2006-02-15 21:30:53'),(14331,'2005-08-21 08:29:38',3128,372,'2005-08-29 13:18:38',2,'2006-02-15 21:30:53'),(14332,'2005-08-21 08:30:43',1388,496,'2005-08-29 10:51:43',1,'2006-02-15 21:30:53'),(14333,'2005-08-21 08:31:03',2976,93,'2005-08-28 03:39:03',2,'2006-02-15 21:30:53'),(14334,'2005-08-21 08:32:32',1448,595,'2005-08-25 02:53:32',2,'2006-02-15 21:30:53'),(14335,'2005-08-21 08:33:07',2610,263,'2005-08-26 14:16:07',1,'2006-02-15 21:30:53'),(14336,'2005-08-21 08:33:42',3166,362,'2005-08-23 03:27:42',1,'2006-02-15 21:30:53'),(14337,'2005-08-21 08:34:26',3529,506,'2005-08-24 11:31:26',1,'2006-02-15 21:30:53'),(14338,'2005-08-21 08:36:03',1789,205,'2005-08-24 12:31:03',2,'2006-02-15 21:30:53'),(14339,'2005-08-21 08:37:15',1744,30,'2005-08-26 03:37:15',2,'2006-02-15 21:30:53'),(14340,'2005-08-21 08:38:21',2181,230,'2005-08-25 09:25:21',1,'2006-02-15 21:30:53'),(14341,'2005-08-21 08:38:24',4498,560,'2005-08-26 12:36:24',1,'2006-02-15 21:30:53'),(14342,'2005-08-21 08:39:26',2749,559,'2005-08-23 11:40:26',2,'2006-02-15 21:30:53'),(14343,'2005-08-21 08:40:21',3769,238,'2005-08-29 03:06:21',1,'2006-02-15 21:30:53'),(14344,'2005-08-21 08:40:56',1562,341,'2005-08-27 12:40:56',1,'2006-02-15 21:30:53'),(14345,'2005-08-21 08:41:15',1726,598,'2005-08-24 11:59:15',1,'2006-02-15 21:30:53'),(14346,'2005-08-21 08:42:26',109,17,'2005-08-23 09:18:26',2,'2006-02-15 21:30:53'),(14347,'2005-08-21 08:42:31',3862,214,'2005-08-25 07:11:31',2,'2006-02-15 21:30:53'),(14348,'2005-08-21 08:54:26',885,496,'2005-08-24 02:55:26',2,'2006-02-15 21:30:53'),(14349,'2005-08-21 08:54:53',96,119,'2005-08-30 14:27:53',1,'2006-02-15 21:30:53'),(14350,'2005-08-21 08:58:38',3174,222,'2005-08-30 03:29:38',2,'2006-02-15 21:30:53'),(14351,'2005-08-21 09:04:20',2037,66,'2005-08-25 05:27:20',1,'2006-02-15 21:30:53'),(14352,'2005-08-21 09:06:29',1224,527,'2005-08-28 13:36:29',1,'2006-02-15 21:30:53'),(14353,'2005-08-21 09:07:50',1612,129,'2005-08-22 10:31:50',2,'2006-02-15 21:30:53'),(14354,'2005-08-21 09:08:14',1137,382,'2005-08-30 05:27:14',1,'2006-02-15 21:30:53'),(14355,'2005-08-21 09:08:29',649,271,'2005-08-27 10:08:29',2,'2006-02-15 21:30:53'),(14356,'2005-08-21 09:08:51',3169,65,'2005-08-24 04:36:51',2,'2006-02-15 21:30:53'),(14357,'2005-08-21 09:13:09',2906,233,'2005-08-22 05:41:09',2,'2006-02-15 21:30:53'),(14358,'2005-08-21 09:14:28',861,112,'2005-08-24 05:05:28',1,'2006-02-15 21:30:53'),(14359,'2005-08-21 09:16:19',1841,401,'2005-08-22 09:28:19',1,'2006-02-15 21:30:53'),(14360,'2005-08-21 09:16:40',2677,246,'2005-08-29 11:43:40',2,'2006-02-15 21:30:53'),(14361,'2006-02-14 15:16:03',1231,191,NULL,2,'2006-02-15 21:30:53'),(14362,'2005-08-21 09:19:49',1992,312,'2005-08-26 11:06:49',1,'2006-02-15 21:30:53'),(14363,'2005-08-21 09:20:03',2579,560,'2005-08-23 14:26:03',1,'2006-02-15 21:30:53'),(14364,'2005-08-21 09:25:11',3513,236,'2005-08-29 09:04:11',1,'2006-02-15 21:30:53'),(14365,'2005-08-21 09:25:13',618,457,'2005-08-27 11:48:13',1,'2006-02-15 21:30:53'),(14366,'2005-08-21 09:31:39',4011,524,'2005-08-26 11:55:39',2,'2006-02-15 21:30:53'),(14367,'2005-08-21 09:31:44',870,244,'2005-08-26 03:54:44',2,'2006-02-15 21:30:53'),(14368,'2005-08-21 09:31:47',2063,351,'2005-08-30 04:17:47',1,'2006-02-15 21:30:53'),(14369,'2005-08-21 09:33:44',1636,392,'2005-08-25 08:56:44',1,'2006-02-15 21:30:53'),(14370,'2005-08-21 09:35:14',3520,161,'2005-08-27 05:21:14',2,'2006-02-15 21:30:53'),(14371,'2005-08-21 09:37:16',2197,221,'2005-08-27 13:50:16',2,'2006-02-15 21:30:53'),(14372,'2005-08-21 09:39:50',1953,520,'2005-08-28 13:36:50',1,'2006-02-15 21:30:53'),(14373,'2005-08-21 09:44:53',4433,268,'2005-08-25 15:37:53',1,'2006-02-15 21:30:53'),(14374,'2006-02-14 15:16:03',236,213,NULL,2,'2006-02-15 21:30:53'),(14375,'2005-08-21 09:46:35',2507,550,'2005-08-26 10:24:35',2,'2006-02-15 21:30:53'),(14376,'2005-08-21 09:48:56',1936,582,'2005-08-22 12:15:56',2,'2006-02-15 21:30:53'),(14377,'2005-08-21 09:49:28',1325,6,'2005-08-29 13:34:28',1,'2006-02-15 21:30:53'),(14378,'2005-08-21 09:50:02',810,515,'2005-08-30 09:07:02',1,'2006-02-15 21:30:53'),(14379,'2005-08-21 09:53:03',3062,136,'2005-08-24 14:32:03',1,'2006-02-15 21:30:53'),(14380,'2005-08-21 09:53:52',1523,198,'2005-08-25 05:03:52',2,'2006-02-15 21:30:53'),(14381,'2005-08-21 09:55:47',811,391,'2005-08-25 08:23:47',1,'2006-02-15 21:30:53'),(14382,'2005-08-21 10:01:03',4119,119,'2005-08-22 13:21:03',2,'2006-02-15 21:30:53'),(14383,'2005-08-21 10:02:05',1941,482,'2005-08-24 12:21:05',2,'2006-02-15 21:30:53'),(14384,'2005-08-21 10:02:37',2429,371,'2005-08-26 08:20:37',1,'2006-02-15 21:30:53'),(14385,'2005-08-21 10:02:55',4356,317,'2005-08-25 07:19:55',2,'2006-02-15 21:30:53'),(14386,'2005-08-21 10:06:34',3402,514,'2005-08-25 14:19:34',1,'2006-02-15 21:30:53'),(14387,'2005-08-21 10:10:01',1286,295,'2005-08-28 14:16:01',2,'2006-02-15 21:30:53'),(14388,'2005-08-21 10:15:13',1078,274,'2005-08-30 13:41:13',2,'2006-02-15 21:30:53'),(14389,'2005-08-21 10:15:20',2718,145,'2005-08-27 05:39:20',1,'2006-02-15 21:30:53'),(14390,'2005-08-21 10:15:38',3951,366,'2005-08-28 05:50:38',2,'2006-02-15 21:30:53'),(14391,'2005-08-21 10:16:27',3117,205,'2005-08-23 07:00:27',2,'2006-02-15 21:30:53'),(14392,'2005-08-21 10:19:25',847,586,'2005-08-28 15:57:25',2,'2006-02-15 21:30:53'),(14393,'2005-08-21 10:22:51',3937,368,'2005-08-29 08:28:51',1,'2006-02-15 21:30:53'),(14394,'2005-08-21 10:23:10',4555,118,'2005-08-28 09:33:10',1,'2006-02-15 21:30:53'),(14395,'2005-08-21 10:24:00',632,506,'2005-08-28 12:23:00',2,'2006-02-15 21:30:53'),(14396,'2005-08-21 10:24:54',3855,353,'2005-08-22 04:49:54',2,'2006-02-15 21:30:53'),(14397,'2005-08-21 10:25:56',3883,47,'2005-08-24 07:48:56',1,'2006-02-15 21:30:53'),(14398,'2005-08-21 10:27:21',357,505,'2005-08-23 10:46:21',2,'2006-02-15 21:30:53'),(14399,'2005-08-21 10:33:23',3582,188,'2005-08-27 08:00:23',1,'2006-02-15 21:30:53'),(14400,'2005-08-21 10:33:45',3891,569,'2005-08-26 12:05:45',1,'2006-02-15 21:30:53'),(14401,'2005-08-21 10:36:20',3468,407,'2005-08-30 06:45:20',1,'2006-02-15 21:30:53'),(14402,'2005-08-21 10:38:17',749,467,'2005-08-27 08:36:17',2,'2006-02-15 21:30:53'),(14403,'2005-08-21 10:40:34',3581,297,'2005-08-29 11:29:34',1,'2006-02-15 21:30:53'),(14404,'2005-08-21 10:43:04',3660,192,'2005-08-30 10:00:04',1,'2006-02-15 21:30:53'),(14405,'2005-08-21 10:45:01',2777,470,'2005-08-30 04:48:01',2,'2006-02-15 21:30:53'),(14406,'2005-08-21 10:46:35',2741,181,'2005-08-28 15:55:35',1,'2006-02-15 21:30:53'),(14407,'2005-08-21 10:46:51',2403,500,'2005-08-25 09:28:51',2,'2006-02-15 21:30:53'),(14408,'2005-08-21 10:47:24',222,593,'2005-08-27 08:18:24',1,'2006-02-15 21:30:53'),(14409,'2005-08-21 10:53:35',1161,314,'2005-08-25 10:40:35',2,'2006-02-15 21:30:53'),(14410,'2005-08-21 10:54:49',839,196,'2005-08-26 08:28:49',2,'2006-02-15 21:30:53'),(14411,'2005-08-21 10:54:57',2125,502,'2005-08-22 13:17:57',2,'2006-02-15 21:30:53'),(14412,'2005-08-21 11:02:09',212,121,'2005-08-29 06:44:09',1,'2006-02-15 21:30:53'),(14413,'2005-08-21 11:06:33',50,367,'2005-08-29 16:10:33',1,'2006-02-15 21:30:53'),(14414,'2005-08-21 11:08:17',1757,515,'2005-08-23 08:37:17',2,'2006-02-15 21:30:53'),(14415,'2006-02-14 15:16:03',2670,561,NULL,2,'2006-02-15 21:30:53'),(14416,'2005-08-21 11:11:46',3002,384,'2005-08-25 12:33:46',1,'2006-02-15 21:30:53'),(14417,'2005-08-21 11:13:35',1768,596,'2005-08-25 11:27:35',1,'2006-02-15 21:30:53'),(14418,'2005-08-21 11:14:26',89,442,'2005-08-28 08:34:26',2,'2006-02-15 21:30:53'),(14419,'2005-08-21 11:15:46',3146,221,'2005-08-30 16:37:46',1,'2006-02-15 21:30:53'),(14420,'2005-08-21 11:16:15',2495,551,'2005-08-24 06:06:15',2,'2006-02-15 21:30:53'),(14421,'2005-08-21 11:20:21',4402,406,'2005-08-24 06:26:21',1,'2006-02-15 21:30:53'),(14422,'2005-08-21 11:21:46',1382,361,'2005-08-25 13:15:46',1,'2006-02-15 21:30:53'),(14423,'2005-08-21 11:23:59',2873,521,'2005-08-26 11:52:59',2,'2006-02-15 21:30:53'),(14424,'2005-08-21 11:24:11',2535,489,'2005-08-29 13:13:11',2,'2006-02-15 21:30:53'),(14425,'2006-02-14 15:16:03',2752,560,NULL,2,'2006-02-15 21:30:53'),(14426,'2006-02-14 15:16:03',2902,315,NULL,1,'2006-02-15 21:30:53'),(14427,'2005-08-21 11:26:06',2353,163,'2005-08-27 10:39:06',1,'2006-02-15 21:30:53'),(14428,'2005-08-21 11:27:07',1614,458,'2005-08-29 09:50:07',1,'2006-02-15 21:30:53'),(14429,'2005-08-21 11:29:43',2513,66,'2005-08-24 12:05:43',1,'2006-02-15 21:30:53'),(14430,'2005-08-21 11:31:11',2623,5,'2005-08-26 06:29:11',1,'2006-02-15 21:30:53'),(14431,'2005-08-21 11:31:15',1572,106,'2005-08-26 11:22:15',2,'2006-02-15 21:30:53'),(14432,'2005-08-21 11:36:15',2294,138,'2005-08-24 08:02:15',2,'2006-02-15 21:30:53'),(14433,'2005-08-21 11:36:34',732,401,'2005-08-26 08:51:34',1,'2006-02-15 21:30:53'),(14434,'2005-08-21 11:40:46',2085,549,'2005-08-24 05:50:46',1,'2006-02-15 21:30:53'),(14435,'2005-08-21 11:44:37',2919,169,'2005-08-24 08:04:37',1,'2006-02-15 21:30:53'),(14436,'2005-08-21 11:48:27',3473,560,'2005-08-25 15:49:27',2,'2006-02-15 21:30:53'),(14437,'2005-08-21 11:48:32',1504,136,'2005-08-25 11:06:32',2,'2006-02-15 21:30:53'),(14438,'2005-08-21 11:51:10',1621,392,'2005-08-28 17:10:10',1,'2006-02-15 21:30:53'),(14439,'2005-08-21 11:52:41',3903,564,'2005-08-30 10:36:41',1,'2006-02-15 21:30:53'),(14440,'2005-08-21 11:59:04',3495,194,'2005-08-23 10:10:04',1,'2006-02-15 21:30:53'),(14441,'2005-08-21 11:59:38',1210,260,'2005-08-26 11:17:38',2,'2006-02-15 21:30:53'),(14442,'2005-08-21 12:00:21',122,205,'2005-08-23 17:00:21',2,'2006-02-15 21:30:53'),(14443,'2005-08-21 12:06:32',376,447,'2005-08-29 13:44:32',2,'2006-02-15 21:30:53'),(14444,'2005-08-21 12:07:25',2211,225,'2005-08-28 08:36:25',2,'2006-02-15 21:30:53'),(14445,'2005-08-21 12:07:42',3186,256,'2005-08-22 17:51:42',2,'2006-02-15 21:30:53'),(14446,'2005-08-21 12:10:41',4367,21,'2005-08-26 14:42:41',1,'2006-02-15 21:30:53'),(14447,'2005-08-21 12:12:05',1889,584,'2005-08-27 14:47:05',2,'2006-02-15 21:30:53'),(14448,'2005-08-21 12:13:10',1937,263,'2005-08-30 08:46:10',1,'2006-02-15 21:30:53'),(14449,'2005-08-21 12:13:18',653,529,'2005-08-27 15:41:18',2,'2006-02-15 21:30:53'),(14450,'2005-08-21 12:21:25',1194,48,'2005-08-26 14:35:25',2,'2006-02-15 21:30:53'),(14451,'2005-08-21 12:21:44',3967,467,'2005-08-22 15:07:44',2,'2006-02-15 21:30:53'),(14452,'2005-08-21 12:23:20',4231,325,'2005-08-27 06:26:20',1,'2006-02-15 21:30:53'),(14453,'2005-08-21 12:33:34',3312,237,'2005-08-27 11:10:34',1,'2006-02-15 21:30:53'),(14454,'2005-08-21 12:35:49',2475,150,'2005-08-22 16:28:49',2,'2006-02-15 21:30:53'),(14455,'2005-08-21 12:36:11',3442,68,'2005-08-27 08:12:11',2,'2006-02-15 21:30:53'),(14456,'2005-08-21 12:38:09',2520,125,'2005-08-26 08:29:09',1,'2006-02-15 21:30:53'),(14457,'2005-08-21 12:47:38',4288,340,'2005-08-25 13:07:38',1,'2006-02-15 21:30:53'),(14458,'2005-08-21 12:47:53',1769,256,'2005-08-30 17:09:53',2,'2006-02-15 21:30:53'),(14459,'2005-08-21 12:48:08',1532,98,'2005-08-27 10:50:08',2,'2006-02-15 21:30:53'),(14460,'2005-08-21 12:48:48',4137,120,'2005-08-30 16:34:48',2,'2006-02-15 21:30:53'),(14461,'2005-08-21 12:50:33',371,42,'2005-08-30 13:35:33',1,'2006-02-15 21:30:53'),(14462,'2005-08-21 12:50:57',2201,96,'2005-08-27 10:42:57',2,'2006-02-15 21:30:53'),(14463,'2005-08-21 12:51:49',1403,365,'2005-08-29 12:17:49',1,'2006-02-15 21:30:53'),(14464,'2005-08-21 12:52:54',2310,121,'2005-08-25 16:42:54',1,'2006-02-15 21:30:53'),(14465,'2005-08-21 12:54:22',4206,262,'2005-08-28 10:46:22',2,'2006-02-15 21:30:53'),(14466,'2005-08-21 13:03:13',923,442,'2005-08-22 15:19:13',2,'2006-02-15 21:30:53'),(14467,'2005-08-21 13:03:33',1498,522,'2005-08-28 15:28:33',1,'2006-02-15 21:30:53'),(14468,'2005-08-21 13:07:10',4168,224,'2005-08-30 19:05:10',2,'2006-02-15 21:30:53'),(14469,'2005-08-21 13:07:24',1957,554,'2005-08-24 10:37:24',1,'2006-02-15 21:30:53'),(14470,'2005-08-21 13:09:41',3899,379,'2005-08-23 10:20:41',2,'2006-02-15 21:30:53'),(14471,'2005-08-21 13:10:40',1254,395,'2005-08-26 16:49:40',1,'2006-02-15 21:30:53'),(14472,'2005-08-21 13:13:57',4097,184,'2005-08-23 14:04:57',2,'2006-02-15 21:30:53'),(14473,'2005-08-21 13:19:03',2747,298,'2005-08-23 15:12:03',1,'2006-02-15 21:30:53'),(14474,'2005-08-21 13:22:48',2632,294,'2005-08-27 14:13:48',2,'2006-02-15 21:30:53'),(14475,'2005-08-21 13:24:32',3164,2,'2005-08-27 08:59:32',2,'2006-02-15 21:30:53'),(14476,'2005-08-21 13:31:07',2821,101,'2005-08-23 17:06:07',1,'2006-02-15 21:30:53'),(14477,'2005-08-21 13:32:38',1564,126,'2005-08-25 18:02:38',2,'2006-02-15 21:30:53'),(14478,'2005-08-21 13:33:28',2990,231,'2005-08-25 13:33:28',2,'2006-02-15 21:30:53'),(14479,'2005-08-21 13:35:54',2235,324,'2005-08-29 12:12:54',2,'2006-02-15 21:30:53'),(14480,'2005-08-21 13:36:40',229,411,'2005-08-26 08:39:40',1,'2006-02-15 21:30:53'),(14481,'2005-08-21 13:41:14',4099,367,'2005-08-30 07:53:14',2,'2006-02-15 21:30:53'),(14482,'2005-08-21 13:42:45',2765,23,'2005-08-27 11:55:45',1,'2006-02-15 21:30:53'),(14483,'2005-08-21 13:43:59',37,275,'2005-08-28 16:38:59',2,'2006-02-15 21:30:53'),(14484,'2005-08-21 13:47:29',3714,418,'2005-08-23 18:25:29',1,'2006-02-15 21:30:53'),(14485,'2005-08-21 13:52:07',1637,241,'2005-08-30 13:06:07',2,'2006-02-15 21:30:53'),(14486,'2005-08-21 13:52:54',3119,138,'2005-08-23 07:58:54',1,'2006-02-15 21:30:53'),(14487,'2005-08-21 13:53:33',2578,526,'2005-08-29 19:32:33',1,'2006-02-15 21:30:53'),(14488,'2006-02-14 15:16:03',4202,75,NULL,2,'2006-02-15 21:30:53'),(14489,'2005-08-21 13:53:59',2312,9,'2005-08-30 15:45:59',2,'2006-02-15 21:30:53'),(14490,'2005-08-21 13:54:15',1771,205,'2005-08-28 19:08:15',2,'2006-02-15 21:30:53'),(14491,'2005-08-21 13:55:39',2072,226,'2005-08-29 17:51:39',1,'2006-02-15 21:30:53'),(14492,'2005-08-21 13:59:08',1591,266,'2005-08-23 11:09:08',1,'2006-02-15 21:30:53'),(14493,'2005-08-21 14:01:44',2590,389,'2005-08-28 17:20:44',1,'2006-02-15 21:30:53'),(14494,'2005-08-21 14:02:50',169,5,'2005-08-22 16:45:50',2,'2006-02-15 21:30:53'),(14495,'2005-08-21 14:04:39',3215,429,'2005-08-22 16:53:39',2,'2006-02-15 21:30:53'),(14496,'2005-08-21 14:07:35',2185,223,'2005-08-24 12:31:35',1,'2006-02-15 21:30:53'),(14497,'2005-08-21 14:09:47',3240,254,'2005-08-22 11:10:47',2,'2006-02-15 21:30:53'),(14498,'2005-08-21 14:10:44',3971,544,'2005-08-23 08:29:44',1,'2006-02-15 21:30:53'),(14499,'2005-08-21 14:11:19',4109,292,'2005-08-23 16:10:19',2,'2006-02-15 21:30:53'),(14500,'2005-08-21 14:11:30',2024,451,'2005-08-27 12:19:30',1,'2006-02-15 21:30:53'),(14501,'2005-08-21 14:14:38',3588,576,'2005-08-25 17:58:38',1,'2006-02-15 21:30:53'),(14502,'2005-08-21 14:22:28',2986,378,'2005-08-23 10:40:28',1,'2006-02-15 21:30:53'),(14503,'2006-02-14 15:16:03',2144,188,NULL,1,'2006-02-15 21:30:53'),(14504,'2005-08-21 14:23:01',4536,312,'2005-08-27 13:56:01',1,'2006-02-15 21:30:53'),(14505,'2005-08-21 14:26:28',2172,203,'2005-08-29 17:34:28',1,'2006-02-15 21:30:53'),(14506,'2005-08-21 14:32:27',4493,537,'2005-08-24 19:02:27',2,'2006-02-15 21:30:53'),(14507,'2005-08-21 14:32:45',1969,175,'2005-08-28 09:50:45',2,'2006-02-15 21:30:53'),(14508,'2005-08-21 14:33:58',703,396,'2005-08-27 10:45:58',2,'2006-02-15 21:30:53'),(14509,'2005-08-21 14:39:58',541,520,'2005-08-26 13:19:58',1,'2006-02-15 21:30:53'),(14510,'2005-08-21 14:44:41',1868,547,'2005-08-30 20:19:41',1,'2006-02-15 21:30:53'),(14511,'2005-08-21 14:45:34',4452,16,'2005-08-28 10:36:34',2,'2006-02-15 21:30:53'),(14512,'2005-08-21 14:47:09',579,51,'2005-08-24 18:10:09',2,'2006-02-15 21:30:53'),(14513,'2005-08-21 14:51:35',4265,185,'2005-08-24 13:24:35',2,'2006-02-15 21:30:53'),(14514,'2005-08-21 14:51:52',1259,295,'2005-08-30 10:40:52',2,'2006-02-15 21:30:53'),(14515,'2005-08-21 14:52:14',2215,242,'2005-08-27 10:27:14',1,'2006-02-15 21:30:53'),(14516,'2006-02-14 15:16:03',713,457,NULL,2,'2006-02-15 21:30:53'),(14517,'2005-08-21 14:57:03',3568,311,'2005-08-24 13:52:03',2,'2006-02-15 21:30:53'),(14518,'2005-08-21 14:58:58',2734,82,'2005-08-24 13:19:58',2,'2006-02-15 21:30:53'),(14519,'2005-08-21 14:59:29',1541,403,'2005-08-22 11:48:29',2,'2006-02-15 21:30:53'),(14520,'2005-08-21 15:00:49',4533,150,'2005-08-30 19:04:49',1,'2006-02-15 21:30:53'),(14521,'2005-08-21 15:01:32',1538,200,'2005-08-28 19:12:32',1,'2006-02-15 21:30:53'),(14522,'2005-08-21 15:01:34',2101,535,'2005-08-25 16:37:34',1,'2006-02-15 21:30:53'),(14523,'2005-08-21 15:03:45',345,433,'2005-08-22 18:06:45',2,'2006-02-15 21:30:53'),(14524,'2005-08-21 15:05:27',4409,374,'2005-08-29 12:07:27',2,'2006-02-15 21:30:53'),(14525,'2005-08-21 15:06:49',3020,420,'2005-08-22 16:30:49',1,'2006-02-15 21:30:53'),(14526,'2006-02-14 15:16:03',1799,534,NULL,1,'2006-02-15 21:30:53'),(14527,'2005-08-21 15:07:42',3496,232,'2005-08-23 12:31:42',1,'2006-02-15 21:30:53'),(14528,'2005-08-21 15:08:05',4305,46,'2005-08-26 15:58:05',2,'2006-02-15 21:30:53'),(14529,'2005-08-21 15:08:31',1774,380,'2005-08-29 17:15:31',1,'2006-02-15 21:30:53'),(14530,'2005-08-21 15:10:50',1905,77,'2005-08-26 09:20:50',2,'2006-02-15 21:30:53'),(14531,'2006-02-14 15:16:03',4296,568,NULL,2,'2006-02-15 21:30:53'),(14532,'2005-08-21 15:15:03',2057,37,'2005-08-25 17:41:03',2,'2006-02-15 21:30:53'),(14533,'2005-08-21 15:15:19',2202,586,'2005-08-26 12:47:19',1,'2006-02-15 21:30:53'),(14534,'2005-08-21 15:16:29',2514,56,'2005-08-26 16:18:29',1,'2006-02-15 21:30:53'),(14535,'2005-08-21 15:22:37',530,412,'2005-08-29 19:23:37',2,'2006-02-15 21:30:53'),(14536,'2005-08-21 15:22:50',2615,48,'2005-08-27 17:03:50',1,'2006-02-15 21:30:53'),(14537,'2005-08-21 15:24:24',3755,405,'2005-08-23 17:14:24',2,'2006-02-15 21:30:53'),(14538,'2005-08-21 15:28:15',3348,471,'2005-08-22 19:55:15',2,'2006-02-15 21:30:53'),(14539,'2005-08-21 15:29:47',3340,41,'2005-08-28 19:01:47',1,'2006-02-15 21:30:53'),(14540,'2005-08-21 15:34:23',2362,28,'2005-08-27 11:51:23',2,'2006-02-15 21:30:53'),(14541,'2005-08-21 15:34:32',1275,576,'2005-08-25 13:18:32',1,'2006-02-15 21:30:53'),(14542,'2005-08-21 15:36:34',1247,101,'2005-08-27 20:24:34',2,'2006-02-15 21:30:53'),(14543,'2005-08-21 15:39:01',709,579,'2005-08-28 09:47:01',1,'2006-02-15 21:30:53'),(14544,'2005-08-21 15:41:01',2445,589,'2005-08-24 15:20:01',1,'2006-02-15 21:30:53'),(14545,'2005-08-21 15:44:23',2459,13,'2005-08-29 20:09:23',2,'2006-02-15 21:30:53'),(14546,'2005-08-21 15:50:50',1515,466,'2005-08-23 11:37:50',2,'2006-02-15 21:30:53'),(14547,'2005-08-21 15:51:38',1172,265,'2005-08-26 15:35:38',1,'2006-02-15 21:30:53'),(14548,'2005-08-21 15:53:52',226,299,'2005-08-25 15:39:52',2,'2006-02-15 21:30:53'),(14549,'2005-08-21 15:54:21',4117,155,'2005-08-22 17:22:21',1,'2006-02-15 21:30:53'),(14550,'2005-08-21 15:56:39',2814,473,'2005-08-23 21:40:39',1,'2006-02-15 21:30:53'),(14551,'2005-08-21 15:57:25',496,521,'2005-08-28 11:10:25',2,'2006-02-15 21:30:53'),(14552,'2005-08-21 15:59:27',1991,477,'2005-08-27 11:46:27',1,'2006-02-15 21:30:53'),(14553,'2005-08-21 15:59:40',3160,434,'2005-08-23 11:54:40',2,'2006-02-15 21:30:53'),(14554,'2005-08-21 16:03:01',31,38,'2005-08-26 13:09:01',2,'2006-02-15 21:30:53'),(14555,'2005-08-21 16:03:02',1926,440,'2005-08-23 14:18:02',1,'2006-02-15 21:30:53'),(14556,'2005-08-21 16:03:27',475,265,'2005-08-29 15:49:27',1,'2006-02-15 21:30:53'),(14557,'2005-08-21 16:05:11',483,490,'2005-08-27 16:37:11',1,'2006-02-15 21:30:53'),(14558,'2005-08-21 16:10:50',3958,273,'2005-08-28 16:36:50',2,'2006-02-15 21:30:53'),(14559,'2005-08-21 16:11:35',3842,433,'2005-08-30 15:26:35',1,'2006-02-15 21:30:53'),(14560,'2005-08-21 16:13:47',1616,579,'2005-08-26 15:19:47',1,'2006-02-15 21:30:53'),(14561,'2005-08-21 16:20:43',2498,443,'2005-08-27 16:48:43',1,'2006-02-15 21:30:53'),(14562,'2005-08-21 16:22:59',3501,107,'2005-08-22 21:15:59',1,'2006-02-15 21:30:53'),(14563,'2005-08-21 16:23:53',3984,212,'2005-08-25 11:30:53',2,'2006-02-15 21:30:53'),(14564,'2005-08-21 16:24:43',3250,22,'2005-08-26 16:58:43',1,'2006-02-15 21:30:53'),(14565,'2005-08-21 16:24:45',4160,250,'2005-08-25 14:42:45',1,'2006-02-15 21:30:53'),(14566,'2005-08-21 16:25:05',84,87,'2005-08-26 10:31:05',1,'2006-02-15 21:30:53'),(14567,'2005-08-21 16:27:25',3805,214,'2005-08-26 10:47:25',1,'2006-02-15 21:30:53'),(14568,'2005-08-21 16:30:48',3331,582,'2005-08-22 13:49:48',1,'2006-02-15 21:30:53'),(14569,'2005-08-21 16:31:22',884,15,'2005-08-25 21:27:22',2,'2006-02-15 21:30:53'),(14570,'2005-08-21 16:32:32',955,32,'2005-08-30 12:03:32',2,'2006-02-15 21:30:53'),(14571,'2005-08-21 16:40:26',2218,296,'2005-08-29 17:10:26',1,'2006-02-15 21:30:53'),(14572,'2005-08-21 16:44:31',1397,538,'2005-08-26 16:35:31',2,'2006-02-15 21:30:53'),(14573,'2005-08-21 16:44:32',2423,240,'2005-08-23 14:01:32',2,'2006-02-15 21:30:53'),(14574,'2005-08-21 16:50:34',1611,62,'2005-08-26 14:24:34',2,'2006-02-15 21:30:53'),(14575,'2005-08-21 16:51:34',3752,159,'2005-08-30 20:13:34',2,'2006-02-15 21:30:53'),(14576,'2005-08-21 16:52:03',1189,45,'2005-08-28 19:43:03',2,'2006-02-15 21:30:53'),(14577,'2005-08-21 16:52:29',1965,126,'2005-08-26 12:30:29',1,'2006-02-15 21:30:53'),(14578,'2005-08-21 16:53:38',3141,389,'2005-08-28 20:36:38',2,'2006-02-15 21:30:53'),(14579,'2005-08-21 16:54:47',1205,260,'2005-08-28 12:35:47',1,'2006-02-15 21:30:53'),(14580,'2005-08-21 16:56:39',1440,448,'2005-08-28 15:25:39',1,'2006-02-15 21:30:53'),(14581,'2005-08-21 17:07:08',751,243,'2005-08-26 16:02:08',1,'2006-02-15 21:30:53'),(14582,'2005-08-21 17:08:33',1004,438,'2005-08-29 18:04:33',2,'2006-02-15 21:30:53'),(14583,'2005-08-21 17:11:47',1203,455,'2005-08-24 16:16:47',2,'2006-02-15 21:30:53'),(14584,'2005-08-21 17:15:33',2617,481,'2005-08-24 20:24:33',2,'2006-02-15 21:30:53'),(14585,'2005-08-21 17:18:33',82,30,'2005-08-26 11:36:33',1,'2006-02-15 21:30:53'),(14586,'2005-08-21 17:19:09',3094,182,'2005-08-26 17:00:09',1,'2006-02-15 21:30:53'),(14587,'2005-08-21 17:20:55',2329,250,'2005-08-26 17:17:55',1,'2006-02-15 21:30:53'),(14588,'2005-08-21 17:25:53',1350,219,'2005-08-28 21:47:53',2,'2006-02-15 21:30:53'),(14589,'2005-08-21 17:28:55',2810,179,'2005-08-22 23:06:55',1,'2006-02-15 21:30:53'),(14590,'2005-08-21 17:29:10',2633,526,'2005-08-28 20:15:10',1,'2006-02-15 21:30:53'),(14591,'2005-08-21 17:30:09',3410,538,'2005-08-24 12:27:09',1,'2006-02-15 21:30:53'),(14592,'2005-08-21 17:30:17',2681,563,'2005-08-22 20:06:17',2,'2006-02-15 21:30:53'),(14593,'2005-08-21 17:33:18',1399,564,'2005-08-24 22:11:18',1,'2006-02-15 21:30:53'),(14594,'2005-08-21 17:34:24',2978,62,'2005-08-26 22:04:24',2,'2006-02-15 21:30:53'),(14595,'2005-08-21 17:35:17',1879,118,'2005-08-27 12:11:17',1,'2006-02-15 21:30:53'),(14596,'2005-08-21 17:38:37',2010,472,'2005-08-30 20:28:37',1,'2006-02-15 21:30:53'),(14597,'2005-08-21 17:39:41',1160,472,'2005-08-25 14:07:41',1,'2006-02-15 21:30:53'),(14598,'2005-08-21 17:40:05',1113,359,'2005-08-29 18:16:05',2,'2006-02-15 21:30:53'),(14599,'2005-08-21 17:43:42',4575,599,'2005-08-22 18:53:42',1,'2006-02-15 21:30:53'),(14600,'2005-08-21 17:45:21',3532,255,'2005-08-28 19:03:21',1,'2006-02-15 21:30:53'),(14601,'2005-08-21 17:45:52',548,406,'2005-08-29 15:10:52',1,'2006-02-15 21:30:53'),(14602,'2005-08-21 17:48:49',3771,370,'2005-08-28 21:38:49',1,'2006-02-15 21:30:53'),(14603,'2005-08-21 17:51:06',94,26,'2005-08-28 15:36:06',1,'2006-02-15 21:30:53'),(14604,'2006-02-14 15:16:03',1024,585,NULL,2,'2006-02-15 21:30:53'),(14605,'2005-08-21 17:56:06',476,394,'2005-08-24 18:35:06',1,'2006-02-15 21:30:53'),(14606,'2006-02-14 15:16:03',2291,592,NULL,2,'2006-02-15 21:30:53'),(14607,'2005-08-21 17:56:50',4518,417,'2005-08-22 17:44:50',2,'2006-02-15 21:30:53'),(14608,'2005-08-21 17:57:22',3321,90,'2005-08-25 13:20:22',1,'2006-02-15 21:30:53'),(14609,'2005-08-21 17:57:26',1206,551,'2005-08-25 14:04:26',2,'2006-02-15 21:30:53'),(14610,'2005-08-21 17:59:09',1894,260,'2005-08-29 21:36:09',2,'2006-02-15 21:30:53'),(14611,'2005-08-21 18:01:41',4078,443,'2005-08-26 12:34:41',1,'2006-02-15 21:30:53'),(14612,'2005-08-21 18:03:15',4105,445,'2005-08-27 13:39:15',1,'2006-02-15 21:30:53'),(14613,'2005-08-21 18:03:20',3841,20,'2005-08-26 19:46:20',1,'2006-02-15 21:30:53'),(14614,'2005-08-21 18:03:51',3053,468,'2005-08-30 13:37:51',1,'2006-02-15 21:30:53'),(14615,'2005-08-21 18:06:32',2332,171,'2005-08-30 13:19:32',2,'2006-02-15 21:30:53'),(14616,'2006-02-14 15:16:03',4537,532,NULL,1,'2006-02-15 21:30:53'),(14617,'2005-08-21 18:07:40',3562,51,'2005-08-24 23:48:40',2,'2006-02-15 21:30:53'),(14618,'2005-08-21 18:09:51',4490,270,'2005-08-28 22:47:51',1,'2006-02-15 21:30:53'),(14619,'2005-08-21 18:10:03',1589,338,'2005-08-23 13:40:03',2,'2006-02-15 21:30:53'),(14620,'2005-08-21 18:10:43',3272,78,'2005-08-22 15:19:43',2,'2006-02-15 21:30:53'),(14621,'2005-08-21 18:17:59',3622,344,'2005-08-23 14:16:59',1,'2006-02-15 21:30:53'),(14622,'2005-08-21 18:25:59',2702,559,'2005-08-31 00:11:59',2,'2006-02-15 21:30:53'),(14623,'2005-08-21 18:29:13',901,33,'2005-08-26 20:48:13',2,'2006-02-15 21:30:53'),(14624,'2005-08-21 18:32:42',4,344,'2005-08-23 21:09:42',1,'2006-02-15 21:30:53'),(14625,'2005-08-21 18:34:21',2661,507,'2005-08-29 21:41:21',1,'2006-02-15 21:30:53'),(14626,'2005-08-21 18:35:44',1038,554,'2005-08-25 23:54:44',2,'2006-02-15 21:30:53'),(14627,'2005-08-21 18:35:54',2470,49,'2005-08-30 21:17:54',1,'2006-02-15 21:30:53'),(14628,'2005-08-21 18:37:24',3636,331,'2005-08-27 20:25:24',2,'2006-02-15 21:30:53'),(14629,'2005-08-21 18:39:52',761,148,'2005-08-25 19:14:52',2,'2006-02-15 21:30:53'),(14630,'2005-08-21 18:43:44',4049,294,'2005-08-29 17:08:44',2,'2006-02-15 21:30:53'),(14631,'2005-08-21 18:47:49',782,209,'2005-08-28 16:54:49',1,'2006-02-15 21:30:53'),(14632,'2005-08-21 18:48:06',2807,38,'2005-08-25 00:33:06',2,'2006-02-15 21:30:53'),(14633,'2005-08-21 18:51:10',2137,551,'2005-08-25 13:07:10',1,'2006-02-15 21:30:53'),(14634,'2005-08-21 18:51:28',486,494,'2005-08-29 19:30:28',2,'2006-02-15 21:30:53'),(14635,'2005-08-21 18:51:43',2171,108,'2005-08-27 16:30:43',2,'2006-02-15 21:30:53'),(14636,'2005-08-21 18:59:17',1671,339,'2005-08-23 13:19:17',2,'2006-02-15 21:30:53'),(14637,'2005-08-21 19:01:00',1846,76,'2005-08-26 23:03:00',2,'2006-02-15 21:30:53'),(14638,'2005-08-21 19:01:36',3583,216,'2005-08-22 15:09:36',2,'2006-02-15 21:30:53'),(14639,'2005-08-21 19:01:39',3510,210,'2005-08-26 14:08:39',1,'2006-02-15 21:30:53'),(14640,'2005-08-21 19:03:19',1880,253,'2005-08-27 00:37:19',2,'2006-02-15 21:30:53'),(14641,'2005-08-21 19:05:23',2205,147,'2005-08-22 22:30:23',2,'2006-02-15 21:30:53'),(14642,'2005-08-21 19:09:40',1280,81,'2005-08-30 13:25:40',2,'2006-02-15 21:30:53'),(14643,'2005-08-21 19:11:58',798,119,'2005-08-29 19:52:58',1,'2006-02-15 21:30:53'),(14644,'2005-08-21 19:12:12',3905,453,'2005-08-29 17:08:12',1,'2006-02-15 21:30:53'),(14645,'2005-08-21 19:12:47',2369,334,'2005-08-25 21:42:47',1,'2006-02-15 21:30:53'),(14646,'2005-08-21 19:14:48',948,186,'2005-08-23 17:15:48',1,'2006-02-15 21:30:53'),(14647,'2005-08-21 19:15:33',3854,36,'2005-08-30 18:58:33',2,'2006-02-15 21:30:53'),(14648,'2005-08-21 19:18:01',2250,284,'2005-08-25 14:59:01',2,'2006-02-15 21:30:53'),(14649,'2005-08-21 19:19:21',4074,43,'2005-08-22 17:23:21',1,'2006-02-15 21:30:53'),(14650,'2005-08-21 19:24:51',1274,190,'2005-08-25 13:58:51',2,'2006-02-15 21:30:53'),(14651,'2005-08-21 19:31:09',4037,544,'2005-08-28 14:26:09',2,'2006-02-15 21:30:53'),(14652,'2005-08-21 19:32:05',4163,453,'2005-08-23 23:33:05',2,'2006-02-15 21:30:53'),(14653,'2005-08-21 19:35:59',491,593,'2005-08-24 15:31:59',1,'2006-02-15 21:30:53'),(14654,'2005-08-21 19:36:59',687,173,'2005-08-23 22:03:59',2,'2006-02-15 21:30:53'),(14655,'2005-08-21 19:37:10',785,253,'2005-08-22 15:43:10',1,'2006-02-15 21:30:53'),(14656,'2005-08-21 19:39:28',4205,201,'2005-08-24 01:36:28',2,'2006-02-15 21:30:53'),(14657,'2005-08-21 19:39:43',477,244,'2005-08-26 22:39:43',2,'2006-02-15 21:30:53'),(14658,'2005-08-21 19:41:50',1465,473,'2005-08-25 16:11:50',1,'2006-02-15 21:30:53'),(14659,'2005-08-21 19:42:36',928,119,'2005-08-26 14:06:36',1,'2006-02-15 21:30:53'),(14660,'2005-08-21 19:43:21',3433,452,'2005-08-22 20:42:21',1,'2006-02-15 21:30:53'),(14661,'2005-08-21 19:44:21',745,469,'2005-08-27 14:35:21',1,'2006-02-15 21:30:53'),(14662,'2005-08-21 19:45:27',2969,403,'2005-08-23 14:44:27',2,'2006-02-15 21:30:53'),(14663,'2005-08-21 19:47:55',2351,150,'2005-08-27 17:36:55',2,'2006-02-15 21:30:53'),(14664,'2005-08-21 19:48:47',4377,153,'2005-08-27 16:47:47',1,'2006-02-15 21:30:53'),(14665,'2005-08-21 19:49:46',2896,58,'2005-08-30 18:00:46',1,'2006-02-15 21:30:53'),(14666,'2005-08-21 19:51:09',2560,122,'2005-08-30 22:42:09',2,'2006-02-15 21:30:53'),(14667,'2005-08-21 19:51:11',2608,55,'2005-08-23 17:37:11',1,'2006-02-15 21:30:53'),(14668,'2005-08-21 19:51:30',1450,152,'2005-08-29 19:38:30',2,'2006-02-15 21:30:53'),(14669,'2005-08-21 19:54:06',3154,317,'2005-08-25 23:12:06',1,'2006-02-15 21:30:53'),(14670,'2005-08-21 19:54:11',4324,537,'2005-08-27 21:42:11',2,'2006-02-15 21:30:53'),(14671,'2005-08-21 19:59:30',2622,53,'2005-08-22 19:39:30',1,'2006-02-15 21:30:53'),(14672,'2005-08-21 19:59:33',4144,325,'2005-08-30 19:40:33',1,'2006-02-15 21:30:53'),(14673,'2005-08-21 20:01:18',1827,445,'2005-08-25 18:55:18',1,'2006-02-15 21:30:53'),(14674,'2005-08-21 20:01:34',572,300,'2005-08-27 18:33:34',1,'2006-02-15 21:30:53'),(14675,'2005-08-21 20:01:51',328,170,'2005-08-26 14:30:51',2,'2006-02-15 21:30:53'),(14676,'2005-08-21 20:02:18',877,49,'2005-08-26 21:55:18',1,'2006-02-15 21:30:53'),(14677,'2005-08-21 20:12:30',4411,26,'2005-08-28 15:11:30',1,'2006-02-15 21:30:53'),(14678,'2005-08-21 20:12:43',1911,383,'2005-08-31 02:11:43',2,'2006-02-15 21:30:53'),(14679,'2005-08-21 20:14:58',1520,193,'2005-08-23 23:39:58',1,'2006-02-15 21:30:53'),(14680,'2005-08-21 20:19:52',4469,524,'2005-08-28 17:10:52',1,'2006-02-15 21:30:53'),(14681,'2005-08-21 20:25:13',1083,212,'2005-08-30 19:48:13',1,'2006-02-15 21:30:53'),(14682,'2005-08-21 20:25:57',2974,314,'2005-08-28 00:42:57',2,'2006-02-15 21:30:53'),(14683,'2005-08-21 20:27:44',3850,342,'2005-08-29 16:54:44',1,'2006-02-15 21:30:53'),(14684,'2005-08-21 20:28:26',3593,369,'2005-08-28 19:01:26',2,'2006-02-15 21:30:53'),(14685,'2005-08-21 20:31:25',1320,69,'2005-08-22 21:02:25',1,'2006-02-15 21:30:53'),(14686,'2005-08-21 20:32:08',814,34,'2005-08-26 18:07:08',1,'2006-02-15 21:30:53'),(14687,'2005-08-21 20:32:16',306,550,'2005-08-26 16:17:16',2,'2006-02-15 21:30:53'),(14688,'2005-08-21 20:32:37',2573,219,'2005-08-27 00:06:37',2,'2006-02-15 21:30:53'),(14689,'2005-08-21 20:33:00',1124,463,'2005-08-22 18:10:00',1,'2006-02-15 21:30:53'),(14690,'2005-08-21 20:42:25',3649,456,'2005-08-29 18:42:25',2,'2006-02-15 21:30:53'),(14691,'2005-08-21 20:42:29',2131,404,'2005-08-24 01:22:29',1,'2006-02-15 21:30:53'),(14692,'2005-08-21 20:43:21',1908,192,'2005-08-28 19:02:21',1,'2006-02-15 21:30:53'),(14693,'2005-08-21 20:44:19',3454,269,'2005-08-29 00:37:19',2,'2006-02-15 21:30:53'),(14694,'2005-08-21 20:46:42',2767,363,'2005-08-23 16:18:42',1,'2006-02-15 21:30:53'),(14695,'2005-08-21 20:46:47',412,206,'2005-08-22 22:25:47',2,'2006-02-15 21:30:53'),(14696,'2005-08-21 20:48:05',3776,435,'2005-08-25 14:55:05',1,'2006-02-15 21:30:53'),(14697,'2005-08-21 20:49:21',48,409,'2005-08-26 01:39:21',2,'2006-02-15 21:30:53'),(14698,'2005-08-21 20:49:58',4255,196,'2005-08-29 20:13:58',2,'2006-02-15 21:30:53'),(14699,'2005-08-21 20:50:48',1427,3,'2005-08-29 18:08:48',2,'2006-02-15 21:30:53'),(14700,'2005-08-21 20:53:40',3446,360,'2005-08-23 22:01:40',1,'2006-02-15 21:30:53'),(14701,'2005-08-21 20:54:32',3034,34,'2005-08-30 16:46:32',1,'2006-02-15 21:30:53'),(14702,'2005-08-21 21:00:03',4096,345,'2005-08-30 16:59:03',1,'2006-02-15 21:30:53'),(14703,'2005-08-21 21:01:19',4329,29,'2005-08-22 15:13:19',2,'2006-02-15 21:30:53'),(14704,'2005-08-21 21:02:22',4062,248,'2005-08-27 23:10:22',2,'2006-02-15 21:30:53'),(14705,'2005-08-21 21:02:55',2493,243,'2005-08-25 20:20:55',2,'2006-02-15 21:30:53'),(14706,'2005-08-21 21:04:42',4494,589,'2005-08-22 19:55:42',2,'2006-02-15 21:30:53'),(14707,'2005-08-21 21:06:29',2916,530,'2005-08-30 23:37:29',1,'2006-02-15 21:30:53'),(14708,'2005-08-21 21:07:23',2828,226,'2005-08-28 15:47:23',1,'2006-02-15 21:30:53'),(14709,'2005-08-21 21:07:59',1856,300,'2005-08-31 02:19:59',1,'2006-02-15 21:30:53'),(14710,'2005-08-21 21:15:23',1922,587,'2005-08-30 19:45:23',1,'2006-02-15 21:30:53'),(14711,'2005-08-21 21:22:07',1973,448,'2005-08-30 16:24:07',2,'2006-02-15 21:30:53'),(14712,'2005-08-21 21:22:56',1198,226,'2005-08-25 01:53:56',1,'2006-02-15 21:30:53'),(14713,'2005-08-21 21:27:24',3350,148,'2005-08-23 20:26:24',1,'2006-02-15 21:30:53'),(14714,'2005-08-21 21:27:43',1,279,'2005-08-30 22:26:43',1,'2006-02-15 21:30:53'),(14715,'2005-08-21 21:28:18',4453,287,'2005-08-26 22:13:18',2,'2006-02-15 21:30:53'),(14716,'2005-08-21 21:29:55',2285,78,'2005-08-23 18:34:55',2,'2006-02-15 21:30:53'),(14717,'2005-08-21 21:30:39',3839,366,'2005-08-26 16:58:39',2,'2006-02-15 21:30:53'),(14718,'2005-08-21 21:39:25',3618,340,'2005-08-26 22:07:25',2,'2006-02-15 21:30:53'),(14719,'2005-08-21 21:41:57',4091,599,'2005-08-25 20:37:57',1,'2006-02-15 21:30:53'),(14720,'2005-08-21 21:43:53',3617,395,'2005-08-25 18:21:53',1,'2006-02-15 21:30:53'),(14721,'2005-08-21 21:50:51',4257,349,'2005-08-30 19:21:51',1,'2006-02-15 21:30:53'),(14722,'2005-08-21 21:50:53',2930,236,'2005-08-30 03:13:53',1,'2006-02-15 21:30:53'),(14723,'2005-08-21 21:52:32',2755,548,'2005-08-31 00:03:32',2,'2006-02-15 21:30:53'),(14724,'2005-08-21 21:53:47',3559,552,'2005-08-23 20:14:47',2,'2006-02-15 21:30:53'),(14725,'2005-08-21 22:02:08',4427,403,'2005-08-23 03:59:08',2,'2006-02-15 21:30:53'),(14726,'2005-08-21 22:08:52',4556,216,'2005-08-22 18:28:52',1,'2006-02-15 21:30:53'),(14727,'2005-08-21 22:12:45',650,275,'2005-08-25 00:46:45',1,'2006-02-15 21:30:53'),(14728,'2005-08-21 22:15:36',2671,474,'2005-08-25 17:14:36',2,'2006-02-15 21:30:53'),(14729,'2005-08-21 22:16:57',2483,289,'2005-08-27 21:32:57',1,'2006-02-15 21:30:53'),(14730,'2005-08-21 22:21:11',2949,439,'2005-08-30 03:02:11',1,'2006-02-15 21:30:53'),(14731,'2005-08-21 22:21:49',1351,154,'2005-08-24 16:27:49',1,'2006-02-15 21:30:53'),(14732,'2005-08-21 22:22:29',1915,482,'2005-08-23 18:34:29',1,'2006-02-15 21:30:53'),(14733,'2005-08-21 22:22:33',398,408,'2005-08-26 21:01:33',1,'2006-02-15 21:30:53'),(14734,'2006-02-14 15:16:03',1369,448,NULL,2,'2006-02-15 21:30:53'),(14735,'2005-08-21 22:25:09',950,35,'2005-08-23 21:16:09',1,'2006-02-15 21:30:53'),(14736,'2005-08-21 22:25:53',207,139,'2005-08-25 19:01:53',2,'2006-02-15 21:30:53'),(14737,'2005-08-21 22:27:11',1842,124,'2005-08-25 18:51:11',2,'2006-02-15 21:30:53'),(14738,'2005-08-21 22:29:13',3315,521,'2005-08-29 21:19:13',1,'2006-02-15 21:30:53'),(14739,'2005-08-21 22:33:22',4026,226,'2005-08-22 19:45:22',1,'2006-02-15 21:30:53'),(14740,'2005-08-21 22:35:33',1717,333,'2005-08-26 17:49:33',1,'2006-02-15 21:30:53'),(14741,'2006-02-14 15:16:03',612,60,NULL,2,'2006-02-15 21:30:53'),(14742,'2005-08-21 22:39:01',2988,421,'2005-08-26 00:17:01',1,'2006-02-15 21:30:53'),(14743,'2005-08-21 22:41:56',4570,2,'2005-08-29 00:18:56',1,'2006-02-15 21:30:53'),(14744,'2005-08-21 22:45:21',800,213,'2005-08-29 23:57:21',1,'2006-02-15 21:30:53'),(14745,'2005-08-21 22:53:01',4399,277,'2005-08-23 23:22:01',1,'2006-02-15 21:30:53'),(14746,'2005-08-21 22:54:02',3197,284,'2005-08-27 17:04:02',2,'2006-02-15 21:30:53'),(14747,'2005-08-21 23:00:02',201,153,'2005-08-26 18:58:02',2,'2006-02-15 21:30:53'),(14748,'2005-08-21 23:02:02',1697,81,'2005-08-28 05:01:02',2,'2006-02-15 21:30:53'),(14749,'2005-08-21 23:08:33',831,235,'2005-08-29 20:46:33',2,'2006-02-15 21:30:53'),(14750,'2005-08-21 23:09:32',918,303,'2005-08-30 00:46:32',2,'2006-02-15 21:30:53'),(14751,'2005-08-21 23:11:23',1156,195,'2005-08-30 20:01:23',2,'2006-02-15 21:30:53'),(14752,'2005-08-21 23:11:42',1252,362,'2005-08-28 22:12:42',1,'2006-02-15 21:30:53'),(14753,'2005-08-21 23:11:43',1803,155,'2005-08-22 22:25:43',2,'2006-02-15 21:30:53'),(14754,'2005-08-21 23:17:26',2355,137,'2005-08-29 18:55:26',2,'2006-02-15 21:30:53'),(14755,'2005-08-21 23:18:08',862,328,'2005-08-27 01:06:08',2,'2006-02-15 21:30:53'),(14756,'2005-08-21 23:21:23',564,288,'2005-08-24 01:44:23',1,'2006-02-15 21:30:53'),(14757,'2005-08-21 23:23:37',1154,473,'2005-08-26 23:24:37',2,'2006-02-15 21:30:53'),(14758,'2005-08-21 23:24:52',2372,339,'2005-08-27 04:25:52',2,'2006-02-15 21:30:53'),(14759,'2005-08-21 23:28:58',3871,362,'2005-08-31 00:35:58',2,'2006-02-15 21:30:53'),(14760,'2006-02-14 15:16:03',1367,355,NULL,1,'2006-02-15 21:30:53'),(14761,'2005-08-21 23:30:28',2657,490,'2005-08-26 03:26:28',1,'2006-02-15 21:30:53'),(14762,'2005-08-21 23:33:57',4249,1,'2005-08-23 01:30:57',1,'2006-02-15 21:30:53'),(14763,'2005-08-21 23:34:00',1480,116,'2005-08-31 03:58:00',2,'2006-02-15 21:30:53'),(14764,'2005-08-21 23:37:47',1270,529,'2005-08-24 00:23:47',2,'2006-02-15 21:30:53'),(14765,'2005-08-21 23:40:28',2817,435,'2005-08-25 04:55:28',2,'2006-02-15 21:30:53'),(14766,'2005-08-21 23:42:20',768,523,'2005-08-26 03:46:20',1,'2006-02-15 21:30:53'),(14767,'2005-08-21 23:43:00',1232,69,'2005-08-29 05:26:00',1,'2006-02-15 21:30:53'),(14768,'2005-08-21 23:44:53',3465,570,'2005-08-27 20:33:53',1,'2006-02-15 21:30:53'),(14769,'2006-02-14 15:16:03',1800,361,NULL,1,'2006-02-15 21:30:53'),(14770,'2005-08-21 23:47:16',2977,372,'2005-08-25 04:48:16',1,'2006-02-15 21:30:53'),(14771,'2005-08-21 23:50:15',2665,149,'2005-08-28 22:55:15',2,'2006-02-15 21:30:53'),(14772,'2005-08-21 23:50:39',4047,411,'2005-08-30 20:44:39',2,'2006-02-15 21:30:53'),(14773,'2005-08-21 23:50:57',2541,413,'2005-08-26 04:45:57',2,'2006-02-15 21:30:53'),(14774,'2005-08-21 23:52:32',3185,252,'2005-08-26 23:42:32',2,'2006-02-15 21:30:53'),(14775,'2005-08-21 23:53:07',4044,400,'2005-08-22 18:07:07',2,'2006-02-15 21:30:53'),(14776,'2005-08-21 23:53:35',3488,15,'2005-08-24 02:00:35',2,'2006-02-15 21:30:53'),(14777,'2005-08-21 23:55:50',237,389,'2005-08-28 04:31:50',1,'2006-02-15 21:30:53'),(14778,'2005-08-21 23:56:30',2152,396,'2005-08-26 00:07:30',2,'2006-02-15 21:30:53'),(14779,'2005-08-22 00:00:56',1087,279,'2005-08-31 00:01:56',2,'2006-02-15 21:30:53'),(14780,'2005-08-22 00:06:33',3171,491,'2005-08-22 22:02:33',2,'2006-02-15 21:30:53'),(14781,'2005-08-22 00:15:12',3458,71,'2005-08-29 21:02:12',1,'2006-02-15 21:30:53'),(14782,'2005-08-22 00:17:20',1727,211,'2005-08-23 01:24:20',1,'2006-02-15 21:30:53'),(14783,'2005-08-22 00:21:57',3419,332,'2005-08-28 01:27:57',2,'2006-02-15 21:30:53'),(14784,'2005-08-22 00:23:13',441,117,'2005-08-28 03:42:13',1,'2006-02-15 21:30:53'),(14785,'2005-08-22 00:24:37',1981,560,'2005-08-25 04:15:37',1,'2006-02-15 21:30:53'),(14786,'2005-08-22 00:24:42',2959,370,'2005-08-25 19:36:42',1,'2006-02-15 21:30:53'),(14787,'2005-08-22 00:25:59',2634,38,'2005-08-28 22:30:59',2,'2006-02-15 21:30:53'),(14788,'2005-08-22 00:27:59',1917,139,'2005-08-29 23:54:59',2,'2006-02-15 21:30:53'),(14789,'2005-08-22 00:29:39',2344,279,'2005-08-25 02:25:39',1,'2006-02-15 21:30:53'),(14790,'2005-08-22 00:34:17',1002,397,'2005-08-31 02:27:17',1,'2006-02-15 21:30:53'),(14791,'2005-08-22 00:35:55',1490,317,'2005-08-30 20:23:55',1,'2006-02-15 21:30:53'),(14792,'2005-08-22 00:36:41',4436,396,'2005-08-30 18:58:41',1,'2006-02-15 21:30:53'),(14793,'2005-08-22 00:37:57',4285,154,'2005-08-29 05:44:57',2,'2006-02-15 21:30:53'),(14794,'2005-08-22 00:39:31',413,156,'2005-08-28 20:08:31',2,'2006-02-15 21:30:53'),(14795,'2005-08-22 00:40:22',1695,303,'2005-08-26 01:37:22',1,'2006-02-15 21:30:53'),(14796,'2005-08-22 00:40:49',941,441,'2005-08-30 03:59:49',1,'2006-02-15 21:30:53'),(14797,'2005-08-22 00:41:24',1131,546,'2005-08-23 18:51:24',1,'2006-02-15 21:30:53'),(14798,'2005-08-22 00:44:08',7,92,'2005-08-27 02:18:08',2,'2006-02-15 21:30:53'),(14799,'2005-08-22 00:44:57',1276,454,'2005-08-24 20:08:57',2,'2006-02-15 21:30:53'),(14800,'2005-08-22 00:46:18',3554,533,'2005-08-26 01:44:18',2,'2006-02-15 21:30:53'),(14801,'2005-08-22 00:46:54',1677,184,'2005-08-30 19:03:54',1,'2006-02-15 21:30:53'),(14802,'2005-08-22 00:48:23',707,505,'2005-08-28 01:02:23',1,'2006-02-15 21:30:53'),(14803,'2005-08-22 00:49:10',2525,278,'2005-08-22 23:44:10',2,'2006-02-15 21:30:53'),(14804,'2005-08-22 00:51:25',372,94,'2005-08-26 21:15:25',1,'2006-02-15 21:30:53'),(14805,'2005-08-22 00:52:01',783,169,'2005-08-23 03:28:01',2,'2006-02-15 21:30:53'),(14806,'2005-08-22 00:53:08',2049,231,'2005-08-23 06:26:08',2,'2006-02-15 21:30:53'),(14807,'2005-08-22 00:57:43',335,90,'2005-08-26 23:40:43',1,'2006-02-15 21:30:53'),(14808,'2005-08-22 00:58:35',1657,362,'2005-08-29 20:16:35',2,'2006-02-15 21:30:53'),(14809,'2005-08-22 01:00:42',1077,188,'2005-08-29 19:55:42',1,'2006-02-15 21:30:53'),(14810,'2005-08-22 01:08:34',1982,78,'2005-08-25 07:00:34',2,'2006-02-15 21:30:53'),(14811,'2005-08-22 01:09:04',1613,53,'2005-08-26 19:30:04',1,'2006-02-15 21:30:53'),(14812,'2005-08-22 01:10:32',4282,211,'2005-08-26 05:21:32',1,'2006-02-15 21:30:53'),(14813,'2005-08-22 01:11:37',3364,142,'2005-08-24 05:57:37',2,'2006-02-15 21:30:53'),(14814,'2005-08-22 01:12:14',3109,250,'2005-08-27 23:24:14',2,'2006-02-15 21:30:53'),(14815,'2005-08-22 01:12:44',1183,314,'2005-08-24 01:42:44',2,'2006-02-15 21:30:53'),(14816,'2005-08-22 01:15:51',4086,534,'2005-08-28 04:11:51',1,'2006-02-15 21:30:53'),(14817,'2005-08-22 01:17:16',910,215,'2005-08-27 02:43:16',1,'2006-02-15 21:30:53'),(14818,'2005-08-22 01:17:18',1619,580,'2005-08-26 05:40:18',1,'2006-02-15 21:30:53'),(14819,'2005-08-22 01:17:19',2890,410,'2005-08-30 05:54:19',1,'2006-02-15 21:30:53'),(14820,'2005-08-22 01:18:37',1409,52,'2005-08-23 19:44:37',1,'2006-02-15 21:30:53'),(14821,'2005-08-22 01:20:19',3155,62,'2005-08-29 03:06:19',2,'2006-02-15 21:30:53'),(14822,'2005-08-22 01:21:14',2835,52,'2005-08-30 03:59:14',1,'2006-02-15 21:30:53'),(14823,'2005-08-22 01:24:42',680,503,'2005-08-22 19:45:42',2,'2006-02-15 21:30:53'),(14824,'2005-08-22 01:27:51',4162,594,'2005-08-23 03:24:51',2,'2006-02-15 21:30:53'),(14825,'2005-08-22 01:27:57',1449,1,'2005-08-27 07:01:57',2,'2006-02-15 21:30:53'),(14826,'2005-08-22 01:32:14',4023,426,'2005-08-23 03:52:14',2,'2006-02-15 21:30:53'),(14827,'2005-08-22 01:32:32',2267,88,'2005-08-31 06:21:32',2,'2006-02-15 21:30:53'),(14828,'2005-08-22 01:34:05',4114,319,'2005-08-27 06:27:05',2,'2006-02-15 21:30:53'),(14829,'2005-08-22 01:35:37',3606,546,'2005-08-23 19:55:37',2,'2006-02-15 21:30:53'),(14830,'2005-08-22 01:37:19',637,590,'2005-08-27 20:10:19',1,'2006-02-15 21:30:53'),(14831,'2005-08-22 01:40:49',3370,156,'2005-08-23 02:47:49',1,'2006-02-15 21:30:53'),(14832,'2005-08-22 01:43:29',1828,494,'2005-08-29 07:19:29',2,'2006-02-15 21:30:53'),(14833,'2005-08-22 01:45:18',1960,551,'2005-08-28 21:24:18',1,'2006-02-15 21:30:53'),(14834,'2005-08-22 01:45:58',3105,262,'2005-08-28 20:52:58',1,'2006-02-15 21:30:53'),(14835,'2005-08-22 01:49:07',755,404,'2005-08-30 04:28:07',1,'2006-02-15 21:30:53'),(14836,'2005-08-22 01:52:26',4287,418,'2005-08-22 23:39:26',1,'2006-02-15 21:30:53'),(14837,'2005-08-22 01:54:52',2251,43,'2005-08-29 02:24:52',1,'2006-02-15 21:30:53'),(14838,'2005-08-22 01:57:34',506,404,'2005-08-25 06:34:34',1,'2006-02-15 21:30:53'),(14839,'2005-08-22 01:58:15',3440,567,'2005-08-24 05:24:15',2,'2006-02-15 21:30:53'),(14840,'2005-08-22 01:58:42',1240,354,'2005-08-29 22:32:42',2,'2006-02-15 21:30:53'),(14841,'2005-08-22 02:03:30',4017,384,'2005-08-28 02:08:30',2,'2006-02-15 21:30:53'),(14842,'2005-08-22 02:04:38',2511,467,'2005-08-30 06:46:38',2,'2006-02-15 21:30:53'),(14843,'2005-08-22 02:05:25',3000,454,'2005-08-28 22:11:25',1,'2006-02-15 21:30:53'),(14844,'2005-08-22 02:09:12',145,513,'2005-08-31 05:43:12',1,'2006-02-15 21:30:53'),(14845,'2005-08-22 02:12:44',69,292,'2005-08-24 02:36:44',2,'2006-02-15 21:30:53'),(14846,'2005-08-22 02:13:48',3840,309,'2005-08-30 05:39:48',1,'2006-02-15 21:30:53'),(14847,'2005-08-22 02:13:51',2995,327,'2005-08-29 03:42:51',2,'2006-02-15 21:30:53'),(14848,'2005-08-22 02:14:19',395,218,'2005-08-26 02:54:19',2,'2006-02-15 21:30:53'),(14849,'2005-08-22 02:15:26',3354,177,'2005-08-28 00:56:26',2,'2006-02-15 21:30:53'),(14850,'2005-08-22 02:16:55',2405,435,'2005-08-26 21:08:55',1,'2006-02-15 21:30:53'),(14851,'2005-08-22 02:20:44',1139,180,'2005-08-26 08:02:44',2,'2006-02-15 21:30:53'),(14852,'2005-08-22 02:25:53',2262,352,'2005-08-25 04:27:53',1,'2006-02-15 21:30:53'),(14853,'2005-08-22 02:26:33',3575,388,'2005-08-31 02:49:33',2,'2006-02-15 21:30:53'),(14854,'2005-08-22 02:26:47',1989,117,'2005-08-23 05:53:47',1,'2006-02-15 21:30:53'),(14855,'2005-08-22 02:27:32',1668,187,'2005-08-31 03:35:32',1,'2006-02-15 21:30:53'),(14856,'2005-08-22 02:31:51',3292,151,'2005-08-26 23:41:51',2,'2006-02-15 21:30:53'),(14857,'2005-08-22 02:42:39',4150,232,'2005-08-24 21:26:39',2,'2006-02-15 21:30:53'),(14858,'2005-08-22 02:46:18',366,499,'2005-08-30 08:22:18',1,'2006-02-15 21:30:53'),(14859,'2005-08-22 02:46:35',2150,463,'2005-08-24 22:37:35',2,'2006-02-15 21:30:53'),(14860,'2005-08-22 02:47:07',1368,418,'2005-08-28 00:00:07',1,'2006-02-15 21:30:53'),(14861,'2005-08-22 02:48:05',1806,422,'2005-08-27 00:50:05',1,'2006-02-15 21:30:53'),(14862,'2005-08-22 02:51:41',3479,78,'2005-08-28 06:30:41',2,'2006-02-15 21:30:53'),(14863,'2005-08-22 02:57:04',779,440,'2005-08-30 03:24:04',2,'2006-02-15 21:30:53'),(14864,'2005-08-22 02:57:06',2872,460,'2005-08-22 22:19:06',1,'2006-02-15 21:30:53'),(14865,'2005-08-22 03:06:38',3775,94,'2005-08-23 04:26:38',1,'2006-02-15 21:30:53'),(14866,'2005-08-22 03:11:35',2607,445,'2005-08-30 00:10:35',1,'2006-02-15 21:30:53'),(14867,'2005-08-22 03:14:46',271,114,'2005-08-25 03:53:46',2,'2006-02-15 21:30:53'),(14868,'2005-08-22 03:15:01',4383,160,'2005-08-25 01:24:01',1,'2006-02-15 21:30:53'),(14869,'2005-08-22 03:20:26',455,21,'2005-08-23 05:25:26',2,'2006-02-15 21:30:53'),(14870,'2005-08-22 03:23:20',2170,512,'2005-08-23 06:50:20',2,'2006-02-15 21:30:53'),(14871,'2005-08-22 03:23:24',3411,204,'2005-08-23 22:23:24',2,'2006-02-15 21:30:53'),(14872,'2005-08-22 03:23:41',962,15,'2005-08-29 23:25:41',1,'2006-02-15 21:30:53'),(14873,'2005-08-22 03:31:06',3533,314,'2005-08-31 05:34:06',1,'2006-02-15 21:30:53'),(14874,'2005-08-22 03:32:05',1782,268,'2005-08-24 07:02:05',2,'2006-02-15 21:30:53'),(14875,'2005-08-22 03:34:39',3912,513,'2005-08-26 03:40:39',1,'2006-02-15 21:30:53'),(14876,'2005-08-22 03:39:29',3669,210,'2005-08-23 06:53:29',1,'2006-02-15 21:30:53'),(14877,'2005-08-22 03:39:56',974,266,'2005-08-24 03:41:56',2,'2006-02-15 21:30:53'),(14878,'2006-02-14 15:16:03',1202,441,NULL,2,'2006-02-15 21:30:53'),(14879,'2005-08-22 03:42:12',2154,148,'2005-08-27 06:14:12',1,'2006-02-15 21:30:53'),(14880,'2005-08-22 03:44:36',3615,224,'2005-08-24 05:45:36',2,'2006-02-15 21:30:53'),(14881,'2005-08-22 03:47:39',210,425,'2005-08-26 05:58:39',2,'2006-02-15 21:30:53'),(14882,'2005-08-22 03:52:21',12,417,'2005-08-25 04:50:21',2,'2006-02-15 21:30:53'),(14883,'2005-08-22 03:55:02',1946,177,'2005-08-28 02:51:02',1,'2006-02-15 21:30:53'),(14884,'2005-08-22 03:57:08',2957,547,'2005-08-23 07:11:08',1,'2006-02-15 21:30:53'),(14885,'2005-08-22 03:58:29',2097,248,'2005-08-30 05:26:29',1,'2006-02-15 21:30:53'),(14886,'2005-08-22 03:59:01',4330,379,'2005-08-23 01:22:01',1,'2006-02-15 21:30:53'),(14887,'2005-08-22 04:04:31',56,421,'2005-08-31 02:30:31',1,'2006-02-15 21:30:53'),(14888,'2005-08-22 04:09:18',3345,91,'2005-08-23 07:34:18',2,'2006-02-15 21:30:53'),(14889,'2005-08-22 04:10:10',1579,299,'2005-08-24 06:23:10',2,'2006-02-15 21:30:53'),(14890,'2005-08-22 04:10:49',517,346,'2005-08-30 23:23:49',1,'2006-02-15 21:30:53'),(14891,'2005-08-22 04:11:02',288,482,'2005-08-27 03:22:02',1,'2006-02-15 21:30:53'),(14892,'2005-08-22 04:15:05',3061,82,'2005-08-31 06:07:05',1,'2006-02-15 21:30:53'),(14893,'2005-08-22 04:15:48',2336,461,'2005-08-30 08:05:48',1,'2006-02-15 21:30:53'),(14894,'2005-08-22 04:16:56',3494,347,'2005-08-24 00:30:56',2,'2006-02-15 21:30:53'),(14895,'2005-08-22 04:19:23',4462,340,'2005-08-27 04:02:23',1,'2006-02-15 21:30:53'),(14896,'2005-08-22 04:20:55',2508,569,'2005-08-29 05:11:55',2,'2006-02-15 21:30:53'),(14897,'2005-08-22 04:22:31',1607,175,'2005-08-26 00:09:31',1,'2006-02-15 21:30:53'),(14898,'2005-08-22 04:26:34',1736,299,'2005-08-31 10:04:34',1,'2006-02-15 21:30:53'),(14899,'2005-08-22 04:26:38',3700,304,'2005-08-31 08:36:38',2,'2006-02-15 21:30:53'),(14900,'2005-08-22 04:27:48',3420,329,'2005-08-25 03:50:48',2,'2006-02-15 21:30:53'),(14901,'2005-08-22 04:31:37',4297,258,'2005-08-29 08:24:37',1,'2006-02-15 21:30:53'),(14902,'2005-08-22 04:31:50',866,423,'2005-08-23 23:47:50',2,'2006-02-15 21:30:53'),(14903,'2005-08-22 04:31:50',1795,51,'2005-08-25 22:53:50',2,'2006-02-15 21:30:53'),(14904,'2005-08-22 04:32:01',722,71,'2005-08-29 05:21:01',1,'2006-02-15 21:30:53'),(14905,'2005-08-22 04:34:22',4166,286,'2005-08-26 04:00:22',2,'2006-02-15 21:30:53'),(14906,'2005-08-22 04:38:18',153,366,'2005-08-29 23:03:18',1,'2006-02-15 21:30:53'),(14907,'2005-08-22 04:44:09',2469,116,'2005-08-25 09:53:09',1,'2006-02-15 21:30:53'),(14908,'2005-08-22 04:44:10',102,349,'2005-08-25 05:09:10',2,'2006-02-15 21:30:53'),(14909,'2005-08-22 04:48:44',1997,155,'2005-08-25 04:59:44',1,'2006-02-15 21:30:53'),(14910,'2005-08-22 04:50:52',1266,540,'2005-08-25 04:14:52',1,'2006-02-15 21:30:53'),(14911,'2005-08-22 04:51:42',353,273,'2005-08-28 05:37:42',1,'2006-02-15 21:30:53'),(14912,'2005-08-22 04:51:42',2658,404,'2005-08-23 23:50:42',1,'2006-02-15 21:30:53'),(14913,'2005-08-22 04:52:13',3609,503,'2005-08-23 06:49:13',2,'2006-02-15 21:30:53'),(14914,'2005-08-22 04:53:35',4348,156,'2005-08-26 10:35:35',1,'2006-02-15 21:30:53'),(14915,'2006-02-14 15:16:03',112,349,NULL,1,'2006-02-15 21:30:53'),(14916,'2005-08-22 04:56:57',2110,80,'2005-08-24 06:36:57',2,'2006-02-15 21:30:53'),(14917,'2005-08-22 05:03:59',377,289,'2005-08-29 04:00:59',2,'2006-02-15 21:30:53'),(14918,'2005-08-22 05:06:38',4056,154,'2005-08-30 01:44:38',2,'2006-02-15 21:30:53'),(14919,'2005-08-22 05:07:17',1587,244,'2005-08-30 06:41:17',2,'2006-02-15 21:30:53'),(14920,'2005-08-22 05:08:58',3357,106,'2005-08-23 02:51:58',1,'2006-02-15 21:30:53'),(14921,'2005-08-22 05:12:24',3724,284,'2005-08-26 08:20:24',2,'2006-02-15 21:30:53'),(14922,'2005-08-22 05:13:05',2322,151,'2005-08-30 04:59:05',1,'2006-02-15 21:30:53'),(14923,'2005-08-22 05:13:33',3434,460,'2005-08-28 01:39:33',2,'2006-02-15 21:30:53'),(14924,'2005-08-22 05:15:17',4189,118,'2005-08-23 10:11:17',1,'2006-02-15 21:30:53'),(14925,'2005-08-22 05:16:16',442,128,'2005-08-30 02:47:16',2,'2006-02-15 21:30:53'),(14926,'2005-08-22 05:18:44',2448,357,'2005-08-26 02:18:44',1,'2006-02-15 21:30:53'),(14927,'2005-08-22 05:31:53',952,193,'2005-08-27 07:04:53',1,'2006-02-15 21:30:53'),(14928,'2006-02-14 15:16:03',4375,472,NULL,1,'2006-02-15 21:30:53'),(14929,'2005-08-22 05:32:38',4195,546,'2005-08-28 00:02:38',1,'2006-02-15 21:30:53'),(14930,'2005-08-22 05:38:32',2875,584,'2005-08-30 07:21:32',1,'2006-02-15 21:30:53'),(14931,'2005-08-22 05:38:55',657,63,'2005-08-28 04:15:55',2,'2006-02-15 21:30:53'),(14932,'2005-08-22 05:40:39',2259,516,'2005-08-23 11:02:39',2,'2006-02-15 21:30:53'),(14933,'2006-02-14 15:16:03',1186,21,NULL,2,'2006-02-15 21:30:53'),(14934,'2005-08-22 05:47:15',815,226,'2005-08-26 11:32:15',1,'2006-02-15 21:30:53'),(14935,'2005-08-22 05:47:31',2025,380,'2005-08-29 00:33:31',2,'2006-02-15 21:30:53'),(14936,'2005-08-22 05:51:26',3710,241,'2005-08-29 10:21:26',2,'2006-02-15 21:30:53'),(14937,'2005-08-22 05:51:59',1241,348,'2005-08-31 01:45:59',2,'2006-02-15 21:30:53'),(14938,'2005-08-22 05:52:39',408,541,'2005-08-31 11:43:39',1,'2006-02-15 21:30:53'),(14939,'2005-08-22 05:53:52',719,328,'2005-08-27 06:20:52',1,'2006-02-15 21:30:53'),(14940,'2005-08-22 05:54:03',2635,46,'2005-08-24 05:52:03',2,'2006-02-15 21:30:53'),(14941,'2005-08-22 05:58:23',2328,574,'2005-08-28 10:58:23',1,'2006-02-15 21:30:53'),(14942,'2005-08-22 05:58:27',32,471,'2005-08-31 10:08:27',1,'2006-02-15 21:30:53'),(14943,'2005-08-22 05:59:59',3515,265,'2005-08-26 10:31:59',2,'2006-02-15 21:30:53'),(14944,'2005-08-22 06:01:26',535,153,'2005-08-24 10:33:26',2,'2006-02-15 21:30:53'),(14945,'2005-08-22 06:05:38',1567,304,'2005-08-29 12:01:38',1,'2006-02-15 21:30:53'),(14946,'2005-08-22 06:07:10',1395,308,'2005-08-28 05:25:10',1,'2006-02-15 21:30:53'),(14947,'2005-08-22 06:07:52',3497,68,'2005-08-28 01:12:52',2,'2006-02-15 21:30:53'),(14948,'2005-08-22 06:10:53',2914,488,'2005-08-28 11:24:53',2,'2006-02-15 21:30:53'),(14949,'2005-08-22 06:12:16',2434,111,'2005-08-25 08:25:16',2,'2006-02-15 21:30:53'),(14950,'2005-08-22 06:17:12',635,362,'2005-08-27 08:48:12',2,'2006-02-15 21:30:53'),(14951,'2005-08-22 06:19:37',2800,197,'2005-08-30 05:51:37',2,'2006-02-15 21:30:53'),(14952,'2005-08-22 06:20:07',2950,575,'2005-08-28 01:18:07',1,'2006-02-15 21:30:53'),(14953,'2005-08-22 06:23:54',816,182,'2005-08-28 03:19:54',1,'2006-02-15 21:30:53'),(14954,'2006-02-14 15:16:03',3608,525,NULL,1,'2006-02-15 21:30:53'),(14955,'2005-08-22 06:25:52',1534,445,'2005-08-25 12:13:52',2,'2006-02-15 21:30:53'),(14956,'2005-08-22 06:26:16',3650,571,'2005-08-25 11:06:16',2,'2006-02-15 21:30:53'),(14957,'2005-08-22 06:29:34',1384,323,'2005-08-26 04:52:34',2,'2006-02-15 21:30:53'),(14958,'2005-08-22 06:30:10',1710,347,'2005-08-28 09:43:10',2,'2006-02-15 21:30:53'),(14959,'2005-08-22 06:30:28',2009,569,'2005-08-25 09:48:28',1,'2006-02-15 21:30:53'),(14960,'2005-08-22 06:31:36',3316,147,'2005-08-29 07:10:36',2,'2006-02-15 21:30:53'),(14961,'2005-08-22 06:35:50',3274,52,'2005-08-31 04:07:50',2,'2006-02-15 21:30:53'),(14962,'2005-08-22 06:37:43',3104,449,'2005-08-29 03:44:43',2,'2006-02-15 21:30:53'),(14963,'2005-08-22 06:38:10',2672,384,'2005-08-31 05:35:10',2,'2006-02-15 21:30:53'),(14964,'2005-08-22 06:39:24',2302,500,'2005-08-26 06:05:24',1,'2006-02-15 21:30:53'),(14965,'2005-08-22 06:45:53',1036,148,'2005-08-27 10:05:53',1,'2006-02-15 21:30:53'),(14966,'2005-08-22 06:45:57',679,259,'2005-08-31 10:02:57',1,'2006-02-15 21:30:53'),(14967,'2005-08-22 06:46:03',289,67,'2005-08-23 01:02:03',2,'2006-02-15 21:30:53'),(14968,'2005-08-22 06:46:59',3302,129,'2005-08-29 07:36:59',1,'2006-02-15 21:30:53'),(14969,'2005-08-22 06:49:15',4060,120,'2005-08-29 05:52:15',1,'2006-02-15 21:30:53'),(14970,'2005-08-22 06:49:29',536,529,'2005-08-29 08:47:29',1,'2006-02-15 21:30:53'),(14971,'2005-08-22 06:52:49',1883,378,'2005-08-28 06:27:49',2,'2006-02-15 21:30:53'),(14972,'2005-08-22 06:53:21',3422,310,'2005-08-29 02:25:21',1,'2006-02-15 21:30:53'),(14973,'2005-08-22 06:59:28',2888,201,'2005-08-30 02:28:28',1,'2006-02-15 21:30:53'),(14974,'2005-08-22 07:04:25',2596,157,'2005-08-27 12:39:25',1,'2006-02-15 21:30:53'),(14975,'2005-08-22 07:07:50',924,244,'2005-08-28 07:23:50',2,'2006-02-15 21:30:53'),(14976,'2005-08-22 07:10:26',77,581,'2005-08-28 07:22:26',1,'2006-02-15 21:30:53'),(14977,'2005-08-22 07:12:53',4093,59,'2005-08-30 08:11:53',2,'2006-02-15 21:30:53'),(14978,'2005-08-22 07:13:15',699,94,'2005-08-25 12:26:15',1,'2006-02-15 21:30:53'),(14979,'2005-08-22 07:16:36',2320,387,'2005-08-24 02:29:36',2,'2006-02-15 21:30:53'),(14980,'2005-08-22 07:16:45',2701,518,'2005-08-26 06:04:45',2,'2006-02-15 21:30:53'),(14981,'2005-08-22 07:19:05',1239,544,'2005-08-26 03:08:05',2,'2006-02-15 21:30:53'),(14982,'2005-08-22 07:20:55',2333,542,'2005-08-31 04:35:55',2,'2006-02-15 21:30:53'),(14983,'2005-08-22 07:32:23',3579,363,'2005-08-30 11:39:23',2,'2006-02-15 21:30:53'),(14984,'2005-08-22 07:35:31',1704,334,'2005-08-30 02:32:31',1,'2006-02-15 21:30:53'),(14985,'2005-08-22 07:35:56',2017,29,'2005-08-29 13:17:56',1,'2006-02-15 21:30:53'),(14986,'2005-08-22 07:37:24',1493,278,'2005-08-23 04:22:24',2,'2006-02-15 21:30:53'),(14987,'2005-08-22 07:41:08',1513,138,'2005-08-24 03:15:08',2,'2006-02-15 21:30:53'),(14988,'2005-08-22 07:46:05',2114,186,'2005-08-29 06:43:05',1,'2006-02-15 21:30:53'),(14989,'2005-08-22 07:47:07',1431,58,'2005-08-26 04:42:07',2,'2006-02-15 21:30:53'),(14990,'2005-08-22 07:48:01',4057,198,'2005-08-24 06:41:01',2,'2006-02-15 21:30:53'),(14991,'2005-08-22 07:50:44',708,172,'2005-08-30 06:32:44',2,'2006-02-15 21:30:53'),(14992,'2005-08-22 07:51:47',4430,415,'2005-08-25 08:17:47',2,'2006-02-15 21:30:53'),(14993,'2005-08-22 07:52:18',3416,437,'2005-08-27 02:13:18',1,'2006-02-15 21:30:53'),(14994,'2005-08-22 07:52:24',1601,509,'2005-08-26 09:57:24',1,'2006-02-15 21:30:53'),(14995,'2005-08-22 07:52:31',4178,482,'2005-08-24 05:16:31',1,'2006-02-15 21:30:53'),(14996,'2005-08-22 07:52:41',1178,411,'2005-08-29 02:35:41',1,'2006-02-15 21:30:53'),(14997,'2005-08-22 07:53:00',2724,29,'2005-08-28 03:47:00',2,'2006-02-15 21:30:53'),(14998,'2005-08-22 07:53:14',3852,92,'2005-08-24 03:46:14',2,'2006-02-15 21:30:53'),(14999,'2005-08-22 07:54:47',3399,594,'2005-08-23 08:39:47',1,'2006-02-15 21:30:53'),(15000,'2005-08-22 07:54:58',3080,161,'2005-08-24 12:46:58',2,'2006-02-15 21:30:53'),(15001,'2005-08-22 08:00:49',2869,186,'2005-08-27 05:53:49',2,'2006-02-15 21:30:53'),(15002,'2005-08-22 08:06:00',4198,242,'2005-08-24 10:48:00',1,'2006-02-15 21:30:53'),(15003,'2005-08-22 08:11:24',4009,167,'2005-08-28 08:49:24',1,'2006-02-15 21:30:53'),(15004,'2005-08-22 08:15:21',4464,375,'2005-08-28 10:35:21',1,'2006-02-15 21:30:53'),(15005,'2005-08-22 08:15:44',2897,335,'2005-08-24 09:52:44',2,'2006-02-15 21:30:53'),(15006,'2005-08-22 08:20:15',2967,97,'2005-08-23 11:57:15',1,'2006-02-15 21:30:53'),(15007,'2005-08-22 08:21:21',3692,165,'2005-08-27 04:44:21',2,'2006-02-15 21:30:53'),(15008,'2005-08-22 08:24:32',961,277,'2005-08-31 13:48:32',2,'2006-02-15 21:30:53'),(15009,'2005-08-22 08:27:27',4025,325,'2005-08-26 05:57:27',2,'2006-02-15 21:30:53'),(15010,'2005-08-22 08:30:17',171,508,'2005-08-29 13:24:17',2,'2006-02-15 21:30:53'),(15011,'2005-08-22 08:31:07',2722,329,'2005-08-24 04:47:07',1,'2006-02-15 21:30:53'),(15012,'2005-08-22 08:42:32',1584,454,'2005-08-28 05:04:32',1,'2006-02-15 21:30:53'),(15013,'2005-08-22 08:42:45',141,141,'2005-08-24 05:20:45',2,'2006-02-15 21:30:53'),(15014,'2005-08-22 08:43:11',3678,373,'2005-08-31 02:55:11',1,'2006-02-15 21:30:53'),(15015,'2005-08-22 08:43:50',3067,14,'2005-08-31 06:53:50',2,'2006-02-15 21:30:53'),(15016,'2005-08-22 08:47:35',879,434,'2005-08-28 14:23:35',2,'2006-02-15 21:30:53'),(15017,'2005-08-22 08:47:44',3975,144,'2005-08-29 08:16:44',1,'2006-02-15 21:30:53'),(15018,'2005-08-22 08:52:38',394,504,'2005-08-25 08:08:38',1,'2006-02-15 21:30:53'),(15019,'2005-08-22 08:52:53',3425,450,'2005-08-25 13:07:53',2,'2006-02-15 21:30:53'),(15020,'2005-08-22 08:54:12',3460,267,'2005-08-27 04:54:12',1,'2006-02-15 21:30:53'),(15021,'2006-02-14 15:16:03',418,100,NULL,2,'2006-02-15 21:30:53'),(15022,'2005-08-22 08:55:43',249,506,'2005-08-31 05:35:43',2,'2006-02-15 21:30:53'),(15023,'2005-08-22 08:56:48',358,296,'2005-08-29 08:13:48',1,'2006-02-15 21:30:53'),(15024,'2005-08-22 08:57:10',1831,139,'2005-08-24 10:39:10',1,'2006-02-15 21:30:53'),(15025,'2005-08-22 08:57:24',2107,257,'2005-08-24 06:09:24',2,'2006-02-15 21:30:53'),(15026,'2005-08-22 09:01:52',4328,66,'2005-08-28 09:21:52',1,'2006-02-15 21:30:53'),(15027,'2005-08-22 09:03:04',326,478,'2005-08-29 04:03:04',2,'2006-02-15 21:30:53'),(15028,'2005-08-22 09:03:44',4248,37,'2005-08-30 11:28:44',1,'2006-02-15 21:30:53'),(15029,'2005-08-22 09:04:53',2234,139,'2005-08-25 09:03:53',1,'2006-02-15 21:30:53'),(15030,'2005-08-22 09:10:21',3168,341,'2005-08-24 06:00:21',2,'2006-02-15 21:30:53'),(15031,'2005-08-22 09:11:48',3926,430,'2005-08-27 06:11:48',1,'2006-02-15 21:30:53'),(15032,'2005-08-22 09:14:09',3414,467,'2005-08-25 09:50:09',2,'2006-02-15 21:30:53'),(15033,'2005-08-22 09:25:24',2431,168,'2005-08-28 09:56:24',2,'2006-02-15 21:30:53'),(15034,'2005-08-22 09:33:08',1331,235,'2005-08-29 13:04:08',1,'2006-02-15 21:30:53'),(15035,'2005-08-22 09:34:32',339,513,'2005-08-28 10:23:32',1,'2006-02-15 21:30:53'),(15036,'2005-08-22 09:36:00',874,280,'2005-08-23 08:12:00',2,'2006-02-15 21:30:53'),(15037,'2005-08-22 09:36:33',4517,234,'2005-08-31 11:20:33',2,'2006-02-15 21:30:53'),(15038,'2005-08-22 09:37:27',1685,3,'2005-08-23 14:39:27',1,'2006-02-15 21:30:53'),(15039,'2005-08-22 09:37:54',895,180,'2005-08-28 12:23:54',1,'2006-02-15 21:30:53'),(15040,'2005-08-22 09:41:09',3207,523,'2005-08-23 12:49:09',2,'2006-02-15 21:30:53'),(15041,'2005-08-22 09:43:18',1913,372,'2005-08-23 11:04:18',2,'2006-02-15 21:30:53'),(15042,'2005-08-22 09:47:37',3796,553,'2005-08-31 04:42:37',1,'2006-02-15 21:30:53'),(15043,'2005-08-22 09:49:32',3797,182,'2005-08-28 13:50:32',1,'2006-02-15 21:30:53'),(15044,'2005-08-22 09:51:54',4513,439,'2005-08-31 12:45:54',1,'2006-02-15 21:30:53'),(15045,'2005-08-22 09:53:23',3485,161,'2005-08-26 10:09:23',2,'2006-02-15 21:30:53'),(15046,'2005-08-22 09:54:54',1536,474,'2005-08-26 07:34:54',1,'2006-02-15 21:30:53'),(15047,'2005-08-22 09:57:16',1309,19,'2005-08-23 11:39:16',1,'2006-02-15 21:30:53'),(15048,'2005-08-22 10:00:04',2895,27,'2005-08-26 08:26:04',1,'2006-02-15 21:30:53'),(15049,'2005-08-22 10:06:28',1573,102,'2005-08-26 15:12:28',1,'2006-02-15 21:30:53'),(15050,'2005-08-22 10:07:52',3961,167,'2005-08-23 04:45:52',1,'2006-02-15 21:30:53'),(15051,'2005-08-22 10:08:50',1419,300,'2005-08-28 10:23:50',1,'2006-02-15 21:30:53'),(15052,'2005-08-22 10:09:19',2349,147,'2005-08-31 09:27:19',2,'2006-02-15 21:30:53'),(15053,'2005-08-22 10:13:09',1065,374,'2005-08-28 12:42:09',2,'2006-02-15 21:30:53'),(15054,'2005-08-22 10:14:33',2314,44,'2005-08-25 15:07:33',1,'2006-02-15 21:30:53'),(15055,'2005-08-22 10:14:39',623,125,'2005-08-25 07:25:39',2,'2006-02-15 21:30:53'),(15056,'2005-08-22 10:15:54',1871,503,'2005-08-25 07:21:54',1,'2006-02-15 21:30:53'),(15057,'2005-08-22 10:19:58',4534,20,'2005-08-28 05:12:58',1,'2006-02-15 21:30:53'),(15058,'2005-08-22 10:20:55',3537,288,'2005-08-26 12:37:55',1,'2006-02-15 21:30:53'),(15059,'2005-08-22 10:22:00',4079,564,'2005-08-29 07:01:00',2,'2006-02-15 21:30:53'),(15060,'2005-08-22 10:24:32',2740,63,'2005-08-31 11:17:32',2,'2006-02-15 21:30:53'),(15061,'2005-08-22 10:29:44',3436,90,'2005-08-24 14:40:44',1,'2006-02-15 21:30:53'),(15062,'2005-08-22 10:34:39',4393,139,'2005-08-26 13:09:39',2,'2006-02-15 21:30:53'),(15063,'2005-08-22 10:39:51',1159,30,'2005-08-25 16:03:51',2,'2006-02-15 21:30:53'),(15064,'2005-08-22 10:41:58',1233,425,'2005-08-28 13:34:58',2,'2006-02-15 21:30:53'),(15065,'2005-08-22 10:46:44',468,510,'2005-08-27 09:40:44',2,'2006-02-15 21:30:53'),(15066,'2005-08-22 10:49:06',2712,530,'2005-08-23 10:25:06',1,'2006-02-15 21:30:53'),(15067,'2005-08-22 10:49:21',3684,461,'2005-08-24 09:01:21',1,'2006-02-15 21:30:53'),(15068,'2005-08-22 10:50:13',3268,373,'2005-08-26 05:04:13',2,'2006-02-15 21:30:53'),(15069,'2005-08-22 10:55:42',592,568,'2005-08-28 06:59:42',2,'2006-02-15 21:30:53'),(15070,'2005-08-22 10:55:45',2687,441,'2005-08-26 09:23:45',1,'2006-02-15 21:30:53'),(15071,'2005-08-22 10:58:43',417,541,'2005-08-31 14:53:43',1,'2006-02-15 21:30:53'),(15072,'2005-08-22 10:58:45',2871,405,'2005-08-30 16:18:45',1,'2006-02-15 21:30:53'),(15073,'2005-08-22 11:01:15',3970,336,'2005-08-31 09:23:15',1,'2006-02-15 21:30:53'),(15074,'2005-08-22 11:02:52',3112,567,'2005-08-28 07:59:52',2,'2006-02-15 21:30:53'),(15075,'2005-08-22 11:04:52',1938,535,'2005-08-30 05:06:52',1,'2006-02-15 21:30:53'),(15076,'2005-08-22 11:05:34',4170,287,'2005-08-27 14:40:34',1,'2006-02-15 21:30:53'),(15077,'2005-08-22 11:09:18',3142,503,'2005-08-29 08:41:18',1,'2006-02-15 21:30:53'),(15078,'2005-08-22 11:09:31',3001,197,'2005-08-25 12:16:31',1,'2006-02-15 21:30:53'),(15079,'2005-08-22 11:09:56',4552,540,'2005-08-24 15:40:56',2,'2006-02-15 21:30:53'),(15080,'2005-08-22 11:11:51',927,133,'2005-08-23 13:09:51',1,'2006-02-15 21:30:53'),(15081,'2005-08-22 11:14:31',2501,313,'2005-08-28 14:23:31',2,'2006-02-15 21:30:53'),(15082,'2005-08-22 11:17:06',2046,137,'2005-08-28 06:40:06',1,'2006-02-15 21:30:53'),(15083,'2005-08-22 11:17:37',1691,397,'2005-08-28 06:27:37',2,'2006-02-15 21:30:53'),(15084,'2005-08-22 11:17:59',821,287,'2005-08-23 09:23:59',1,'2006-02-15 21:30:53'),(15085,'2005-08-22 11:19:22',1669,67,'2005-08-25 09:04:22',2,'2006-02-15 21:30:53'),(15086,'2005-08-22 11:21:08',264,494,'2005-08-30 08:18:08',2,'2006-02-15 21:30:53'),(15087,'2005-08-22 11:24:09',233,404,'2005-08-27 16:42:09',2,'2006-02-15 21:30:53'),(15088,'2005-08-22 11:28:26',4199,377,'2005-08-24 15:46:26',2,'2006-02-15 21:30:53'),(15089,'2005-08-22 11:34:06',3288,61,'2005-08-31 12:45:06',1,'2006-02-15 21:30:53'),(15090,'2005-08-22 11:34:33',2918,582,'2005-08-31 06:09:33',2,'2006-02-15 21:30:53'),(15091,'2005-08-22 11:34:43',2092,477,'2005-08-23 16:52:43',2,'2006-02-15 21:30:53'),(15092,'2005-08-22 11:36:16',2418,464,'2005-08-28 09:49:16',2,'2006-02-15 21:30:53'),(15093,'2005-08-22 11:39:03',3534,60,'2005-08-23 06:16:03',2,'2006-02-15 21:30:53'),(15094,'2006-02-14 15:16:03',922,424,NULL,1,'2006-02-15 21:30:53'),(15095,'2005-08-22 11:41:35',489,202,'2005-08-25 16:44:35',2,'2006-02-15 21:30:53'),(15096,'2005-08-22 11:43:04',1983,33,'2005-08-29 12:16:04',2,'2006-02-15 21:30:53'),(15097,'2005-08-22 11:43:42',2838,475,'2005-08-27 10:25:42',1,'2006-02-15 21:30:53'),(15098,'2005-08-22 11:48:19',4414,88,'2005-08-31 11:07:19',2,'2006-02-15 21:30:53'),(15099,'2005-08-22 11:49:16',1940,86,'2005-08-26 06:38:16',2,'2006-02-15 21:30:53'),(15100,'2005-08-22 11:55:03',4489,312,'2005-08-25 14:55:03',1,'2006-02-15 21:30:53'),(15101,'2005-08-22 11:56:02',683,335,'2005-08-28 13:08:02',2,'2006-02-15 21:30:53'),(15102,'2005-08-22 11:58:58',2317,555,'2005-08-29 08:37:58',1,'2006-02-15 21:30:53'),(15103,'2005-08-22 12:01:06',853,101,'2005-08-25 14:40:06',2,'2006-02-15 21:30:53'),(15104,'2005-08-22 12:01:16',4550,359,'2005-08-27 17:48:16',1,'2006-02-15 21:30:53'),(15105,'2005-08-22 12:01:33',3965,338,'2005-08-26 14:29:33',2,'2006-02-15 21:30:53'),(15106,'2005-08-22 12:01:48',399,155,'2005-08-27 16:12:48',1,'2006-02-15 21:30:53'),(15107,'2005-08-22 12:05:02',2378,376,'2005-08-23 11:09:02',1,'2006-02-15 21:30:53'),(15108,'2005-08-22 12:10:07',3463,447,'2005-08-26 14:46:07',2,'2006-02-15 21:30:53'),(15109,'2005-08-22 12:12:58',565,588,'2005-08-30 07:20:58',1,'2006-02-15 21:30:53'),(15110,'2005-08-22 12:16:46',1379,72,'2005-08-26 13:36:46',1,'2006-02-15 21:30:53'),(15111,'2005-08-22 12:21:43',4101,119,'2005-08-24 09:31:43',1,'2006-02-15 21:30:53'),(15112,'2005-08-22 12:21:49',2832,160,'2005-08-27 11:03:49',1,'2006-02-15 21:30:53'),(15113,'2005-08-22 12:23:59',4338,424,'2005-08-27 09:59:59',1,'2006-02-15 21:30:53'),(15114,'2005-08-22 12:24:55',2481,121,'2005-08-31 17:06:55',1,'2006-02-15 21:30:53'),(15115,'2005-08-22 12:28:01',1739,33,'2005-08-26 16:12:01',1,'2006-02-15 21:30:53'),(15116,'2005-08-22 12:35:40',518,217,'2005-08-23 17:58:40',1,'2006-02-15 21:30:53'),(15117,'2005-08-22 12:38:20',2502,292,'2005-08-27 07:36:20',2,'2006-02-15 21:30:53'),(15118,'2005-08-22 12:38:37',2081,473,'2005-08-29 14:01:37',2,'2006-02-15 21:30:53'),(15119,'2005-08-22 12:41:33',4526,288,'2005-08-23 14:44:33',2,'2006-02-15 21:30:53'),(15120,'2005-08-22 12:42:47',3083,11,'2005-08-23 14:21:47',1,'2006-02-15 21:30:53'),(15121,'2005-08-22 12:46:37',2981,415,'2005-08-25 17:42:37',1,'2006-02-15 21:30:53'),(15122,'2005-08-22 12:47:45',1686,91,'2005-08-29 13:18:45',2,'2006-02-15 21:30:53'),(15123,'2005-08-22 12:48:44',1455,445,'2005-08-27 11:07:44',1,'2006-02-15 21:30:53'),(15124,'2005-08-22 12:51:38',1598,39,'2005-08-26 09:05:38',1,'2006-02-15 21:30:53'),(15125,'2005-08-22 12:53:22',3942,221,'2005-08-29 18:44:22',1,'2006-02-15 21:30:53'),(15126,'2005-08-22 12:53:58',1902,459,'2005-08-28 07:39:58',1,'2006-02-15 21:30:53'),(15127,'2005-08-22 12:56:29',2397,287,'2005-08-26 10:58:29',1,'2006-02-15 21:30:53'),(15128,'2005-08-22 12:57:26',3229,457,'2005-08-30 11:35:26',2,'2006-02-15 21:30:53'),(15129,'2005-08-22 13:03:52',3782,234,'2005-08-29 10:56:52',2,'2006-02-15 21:30:53'),(15130,'2005-08-22 13:04:32',2375,536,'2005-08-30 17:24:32',1,'2006-02-15 21:30:53'),(15131,'2005-08-22 13:06:26',1930,119,'2005-08-30 16:43:26',1,'2006-02-15 21:30:53'),(15132,'2005-08-22 13:11:25',3474,393,'2005-08-27 17:04:25',2,'2006-02-15 21:30:53'),(15133,'2005-08-22 13:17:43',3408,137,'2005-08-26 08:40:43',1,'2006-02-15 21:30:53'),(15134,'2005-08-22 13:18:25',4442,22,'2005-08-29 18:03:25',1,'2006-02-15 21:30:53'),(15135,'2005-08-22 13:19:19',555,284,'2005-08-27 17:09:19',2,'2006-02-15 21:30:53'),(15136,'2005-08-22 13:19:25',2606,435,'2005-08-24 07:28:25',2,'2006-02-15 21:30:53'),(15137,'2005-08-22 13:20:28',856,241,'2005-08-26 09:35:28',1,'2006-02-15 21:30:53'),(15138,'2005-08-22 13:36:30',2467,50,'2005-08-27 15:35:30',1,'2006-02-15 21:30:53'),(15139,'2005-08-22 13:38:11',2018,237,'2005-08-30 09:00:11',1,'2006-02-15 21:30:53'),(15140,'2005-08-22 13:39:20',1402,414,'2005-08-30 18:19:20',2,'2006-02-15 21:30:53'),(15141,'2005-08-22 13:41:49',227,541,'2005-08-28 15:25:49',2,'2006-02-15 21:30:53'),(15142,'2005-08-22 13:44:32',1337,351,'2005-08-29 14:19:32',1,'2006-02-15 21:30:53'),(15143,'2005-08-22 13:46:24',1519,274,'2005-08-25 09:47:24',2,'2006-02-15 21:30:53'),(15144,'2005-08-22 13:49:18',559,527,'2005-08-26 11:11:18',2,'2006-02-15 21:30:53'),(15145,'2005-08-22 13:53:04',2179,2,'2005-08-31 15:51:04',1,'2006-02-15 21:30:53'),(15146,'2005-08-22 13:57:55',3102,72,'2005-08-28 12:57:55',2,'2006-02-15 21:30:53'),(15147,'2005-08-22 13:58:23',2553,4,'2005-08-28 14:33:23',2,'2006-02-15 21:30:53'),(15148,'2005-08-22 13:59:19',3704,359,'2005-08-31 13:59:19',2,'2006-02-15 21:30:53'),(15149,'2005-08-22 14:08:06',3059,537,'2005-08-25 08:25:06',1,'2006-02-15 21:30:53'),(15150,'2005-08-22 14:12:05',1797,161,'2005-08-27 12:47:05',1,'2006-02-15 21:30:53'),(15151,'2005-08-22 14:23:11',4070,463,'2005-08-30 14:01:11',1,'2006-02-15 21:30:53'),(15152,'2005-08-22 14:25:21',739,123,'2005-08-31 14:28:21',1,'2006-02-15 21:30:53'),(15153,'2005-08-22 14:26:01',1051,512,'2005-08-27 14:17:01',2,'2006-02-15 21:30:53'),(15154,'2005-08-22 14:27:37',3395,106,'2005-08-29 20:04:37',2,'2006-02-15 21:30:53'),(15155,'2005-08-22 14:27:46',2641,43,'2005-08-23 17:46:46',2,'2006-02-15 21:30:53'),(15156,'2005-08-22 14:29:11',1174,494,'2005-08-30 17:48:11',2,'2006-02-15 21:30:53'),(15157,'2005-08-22 14:30:09',1909,580,'2005-08-29 18:28:09',1,'2006-02-15 21:30:53'),(15158,'2005-08-22 14:30:39',3614,588,'2005-08-27 15:55:39',1,'2006-02-15 21:30:53'),(15159,'2005-08-22 14:32:25',4355,525,'2005-08-24 11:19:25',2,'2006-02-15 21:30:53'),(15160,'2005-08-22 14:33:50',4321,249,'2005-08-28 11:26:50',1,'2006-02-15 21:30:53'),(15161,'2005-08-22 14:37:22',1445,20,'2005-08-27 17:40:22',1,'2006-02-15 21:30:53'),(15162,'2005-08-22 14:41:05',1756,439,'2005-08-27 20:23:05',2,'2006-02-15 21:30:53'),(15163,'2005-08-22 14:43:13',3597,100,'2005-08-26 14:26:13',1,'2006-02-15 21:30:53'),(15164,'2005-08-22 14:47:53',997,193,'2005-08-25 16:05:53',1,'2006-02-15 21:30:53'),(15165,'2005-08-22 14:59:30',3664,168,'2005-08-29 15:46:30',2,'2006-02-15 21:30:53'),(15166,'2005-08-22 15:05:37',1530,504,'2005-08-30 12:22:37',2,'2006-02-15 21:30:53'),(15167,'2006-02-14 15:16:03',973,190,NULL,2,'2006-02-15 21:30:53'),(15168,'2005-08-22 15:14:20',3218,526,'2005-08-25 20:12:20',2,'2006-02-15 21:30:53'),(15169,'2005-08-22 15:21:56',794,76,'2005-08-28 09:40:56',1,'2006-02-15 21:30:53'),(15170,'2005-08-22 15:22:15',2123,521,'2005-08-23 20:32:15',1,'2006-02-15 21:30:53'),(15171,'2005-08-22 15:23:59',1201,119,'2005-08-28 12:05:59',2,'2006-02-15 21:30:53'),(15172,'2005-08-22 15:25:33',2367,511,'2005-08-23 17:29:33',1,'2006-02-15 21:30:53'),(15173,'2005-08-22 15:26:29',2585,338,'2005-08-29 14:03:29',1,'2006-02-15 21:30:53'),(15174,'2005-08-22 15:26:36',19,111,'2005-08-31 10:47:36',2,'2006-02-15 21:30:53'),(15175,'2005-08-22 15:29:15',4318,380,'2005-08-27 15:11:15',2,'2006-02-15 21:30:53'),(15176,'2005-08-22 15:30:25',3063,115,'2005-08-31 20:00:25',1,'2006-02-15 21:30:53'),(15177,'2005-08-22 15:34:49',838,493,'2005-08-26 12:54:49',1,'2006-02-15 21:30:53'),(15178,'2005-08-22 15:36:04',1745,15,'2005-08-26 21:00:04',2,'2006-02-15 21:30:53'),(15179,'2005-08-22 15:36:22',450,328,'2005-08-31 19:57:22',1,'2006-02-15 21:30:53'),(15180,'2005-08-22 15:42:57',234,532,'2005-08-24 12:49:57',2,'2006-02-15 21:30:53'),(15181,'2005-08-22 15:46:20',3900,266,'2005-08-27 09:56:20',1,'2006-02-15 21:30:53'),(15182,'2005-08-22 15:47:05',645,443,'2005-08-25 11:55:05',1,'2006-02-15 21:30:53'),(15183,'2005-08-22 15:49:54',2696,268,'2005-08-25 12:29:54',1,'2006-02-15 21:30:53'),(15184,'2005-08-22 15:51:12',1193,471,'2005-08-24 19:23:12',2,'2006-02-15 21:30:53'),(15185,'2005-08-22 15:52:50',2948,472,'2005-08-31 20:38:50',1,'2006-02-15 21:30:53'),(15186,'2005-08-22 15:52:57',1323,104,'2005-08-24 21:12:57',1,'2006-02-15 21:30:53'),(15187,'2005-08-22 15:53:32',2338,461,'2005-08-27 14:21:32',1,'2006-02-15 21:30:53'),(15188,'2005-08-22 15:55:48',131,478,'2005-08-29 19:10:48',1,'2006-02-15 21:30:53'),(15189,'2005-08-22 15:56:42',2559,398,'2005-08-29 12:20:42',1,'2006-02-15 21:30:53'),(15190,'2005-08-22 15:57:38',2096,84,'2005-08-24 13:46:38',1,'2006-02-15 21:30:53'),(15191,'2006-02-14 15:16:03',3688,75,NULL,1,'2006-02-15 21:30:53'),(15192,'2005-08-22 16:06:23',4213,216,'2005-08-27 13:12:23',1,'2006-02-15 21:30:53'),(15193,'2005-08-22 16:06:49',1033,40,'2005-08-25 17:23:49',1,'2006-02-15 21:30:53'),(15194,'2005-08-22 16:07:34',1217,332,'2005-08-26 19:16:34',1,'2006-02-15 21:30:53'),(15195,'2005-08-22 16:08:23',1080,508,'2005-08-30 17:56:23',2,'2006-02-15 21:30:53'),(15196,'2005-08-22 16:11:32',1413,181,'2005-08-30 22:06:32',1,'2006-02-15 21:30:53'),(15197,'2005-08-22 16:14:25',2915,159,'2005-08-26 16:22:25',2,'2006-02-15 21:30:53'),(15198,'2005-08-22 16:15:33',1253,396,'2005-08-29 20:49:33',1,'2006-02-15 21:30:53'),(15199,'2005-08-22 16:17:49',18,216,'2005-08-25 20:12:49',1,'2006-02-15 21:30:53'),(15200,'2005-08-22 16:22:53',1000,374,'2005-08-24 10:25:53',2,'2006-02-15 21:30:53'),(15201,'2005-08-22 16:24:42',4456,301,'2005-08-31 17:54:42',1,'2006-02-15 21:30:53'),(15202,'2005-08-22 16:26:53',2119,374,'2005-08-23 13:49:53',2,'2006-02-15 21:30:53'),(15203,'2005-08-22 16:28:00',743,568,'2005-08-26 16:55:00',2,'2006-02-15 21:30:53'),(15204,'2005-08-22 16:30:43',1471,317,'2005-08-26 20:37:43',2,'2006-02-15 21:30:53'),(15205,'2005-08-22 16:32:23',3276,489,'2005-08-27 16:08:23',1,'2006-02-15 21:30:53'),(15206,'2005-08-22 16:33:39',3901,524,'2005-08-31 11:41:39',1,'2006-02-15 21:30:53'),(15207,'2005-08-22 16:35:25',1149,442,'2005-08-23 14:06:25',1,'2006-02-15 21:30:53'),(15208,'2005-08-22 16:35:47',4346,267,'2005-08-30 15:16:47',1,'2006-02-15 21:30:53'),(15209,'2005-08-22 16:37:32',1620,588,'2005-08-25 19:04:32',1,'2006-02-15 21:30:53'),(15210,'2005-08-22 16:37:36',3811,332,'2005-08-29 11:54:36',1,'2006-02-15 21:30:53'),(15211,'2005-08-22 16:40:21',3025,410,'2005-08-28 13:33:21',2,'2006-02-15 21:30:53'),(15212,'2005-08-22 16:44:26',2182,562,'2005-08-27 20:26:26',1,'2006-02-15 21:30:53'),(15213,'2005-08-22 16:49:02',2002,166,'2005-08-31 20:22:02',1,'2006-02-15 21:30:53'),(15214,'2005-08-22 16:53:29',1500,574,'2005-08-24 14:17:29',1,'2006-02-15 21:30:53'),(15215,'2005-08-22 16:55:26',1906,344,'2005-08-25 20:19:26',1,'2006-02-15 21:30:53'),(15216,'2005-08-22 16:57:02',1633,166,'2005-08-24 16:11:02',2,'2006-02-15 21:30:53'),(15217,'2005-08-22 16:58:31',91,90,'2005-08-23 22:33:31',1,'2006-02-15 21:30:53'),(15218,'2005-08-22 16:59:05',10,139,'2005-08-30 17:01:05',1,'2006-02-15 21:30:53'),(15219,'2005-08-22 17:00:31',3313,544,'2005-08-31 20:16:31',1,'2006-02-15 21:30:53'),(15220,'2005-08-22 17:02:23',187,128,'2005-08-28 21:02:23',1,'2006-02-15 21:30:53'),(15221,'2005-08-22 17:12:29',110,253,'2005-08-24 20:46:29',2,'2006-02-15 21:30:53'),(15222,'2005-08-22 17:12:30',1360,390,'2005-08-27 15:10:30',2,'2006-02-15 21:30:53'),(15223,'2005-08-22 17:13:39',2263,541,'2005-08-27 11:17:39',2,'2006-02-15 21:30:53'),(15224,'2005-08-22 17:18:05',33,81,'2005-08-29 14:35:05',2,'2006-02-15 21:30:53'),(15225,'2005-08-22 17:18:32',1646,224,'2005-08-24 17:25:32',1,'2006-02-15 21:30:53'),(15226,'2005-08-22 17:20:17',318,54,'2005-08-31 15:36:17',1,'2006-02-15 21:30:53'),(15227,'2005-08-22 17:22:41',2987,151,'2005-08-23 20:59:41',1,'2006-02-15 21:30:53'),(15228,'2005-08-22 17:27:23',2485,48,'2005-08-29 11:38:23',2,'2006-02-15 21:30:53'),(15229,'2005-08-22 17:30:25',320,63,'2005-08-23 14:13:25',1,'2006-02-15 21:30:53'),(15230,'2005-08-22 17:31:41',2572,466,'2005-08-25 21:57:41',2,'2006-02-15 21:30:53'),(15231,'2005-08-22 17:32:57',2980,187,'2005-08-25 13:06:57',1,'2006-02-15 21:30:53'),(15232,'2005-08-22 17:37:02',61,5,'2005-08-25 18:45:02',1,'2006-02-15 21:30:53'),(15233,'2005-08-22 17:41:53',4405,197,'2005-08-24 12:59:53',2,'2006-02-15 21:30:53'),(15234,'2006-02-14 15:16:03',908,228,NULL,2,'2006-02-15 21:30:53'),(15235,'2005-08-22 17:43:12',2726,416,'2005-08-29 23:03:12',2,'2006-02-15 21:30:53'),(15236,'2005-08-22 17:44:27',4124,557,'2005-08-24 23:25:27',1,'2006-02-15 21:30:53'),(15237,'2005-08-22 17:44:30',4485,148,'2005-08-24 12:51:30',1,'2006-02-15 21:30:53'),(15238,'2005-08-22 17:46:12',403,70,'2005-08-29 16:41:12',1,'2006-02-15 21:30:53'),(15239,'2005-08-22 17:46:17',1809,501,'2005-08-26 19:03:17',1,'2006-02-15 21:30:53'),(15240,'2005-08-22 17:46:41',2014,11,'2005-08-23 15:08:41',2,'2006-02-15 21:30:53'),(15241,'2005-08-22 17:47:40',832,337,'2005-08-29 15:28:40',2,'2006-02-15 21:30:53'),(15242,'2005-08-22 17:48:10',2106,364,'2005-08-27 23:32:10',1,'2006-02-15 21:30:53'),(15243,'2005-08-22 17:48:28',4408,308,'2005-08-31 13:22:28',1,'2006-02-15 21:30:53'),(15244,'2005-08-22 17:48:42',1486,271,'2005-08-28 13:17:42',2,'2006-02-15 21:30:53'),(15245,'2005-08-22 17:49:35',2545,298,'2005-08-26 18:25:35',2,'2006-02-15 21:30:53'),(15246,'2005-08-22 17:50:49',3786,100,'2005-08-30 22:21:49',1,'2006-02-15 21:30:53'),(15247,'2005-08-22 17:52:05',4572,250,'2005-08-31 21:37:05',1,'2006-02-15 21:30:53'),(15248,'2005-08-22 17:53:06',977,20,'2005-08-25 18:43:06',2,'2006-02-15 21:30:53'),(15249,'2005-08-22 17:58:27',121,444,'2005-08-30 14:55:27',1,'2006-02-15 21:30:53'),(15250,'2005-08-22 18:03:11',2176,143,'2005-08-27 12:19:11',2,'2006-02-15 21:30:53'),(15251,'2005-08-22 18:03:57',1994,285,'2005-08-23 20:56:57',2,'2006-02-15 21:30:53'),(15252,'2005-08-22 18:04:22',1821,453,'2005-08-25 17:14:22',2,'2006-02-15 21:30:53'),(15253,'2005-08-22 18:05:21',4143,333,'2005-08-23 18:06:21',2,'2006-02-15 21:30:53'),(15254,'2005-08-22 18:13:07',3762,209,'2005-08-24 21:55:07',1,'2006-02-15 21:30:53'),(15255,'2005-08-22 18:16:50',3415,84,'2005-08-28 14:14:50',2,'2006-02-15 21:30:53'),(15256,'2005-08-22 18:20:07',1873,198,'2005-08-28 12:57:07',1,'2006-02-15 21:30:53'),(15257,'2005-08-22 18:21:04',915,223,'2005-08-30 20:13:04',1,'2006-02-15 21:30:53'),(15258,'2005-08-22 18:22:44',788,293,'2005-08-25 16:54:44',1,'2006-02-15 21:30:53'),(15259,'2005-08-22 18:23:23',3261,488,'2005-08-27 13:06:23',1,'2006-02-15 21:30:53'),(15260,'2005-08-22 18:24:16',3135,274,'2005-08-24 21:26:16',1,'2006-02-15 21:30:53'),(15261,'2005-08-22 18:24:34',2200,140,'2005-08-27 19:53:34',1,'2006-02-15 21:30:53'),(15262,'2005-08-22 18:25:21',2534,298,'2005-08-28 22:19:21',1,'2006-02-15 21:30:53'),(15263,'2005-08-22 18:27:33',184,324,'2005-08-30 14:05:33',1,'2006-02-15 21:30:53'),(15264,'2005-08-22 18:27:38',4459,440,'2005-08-24 12:39:38',1,'2006-02-15 21:30:53'),(15265,'2005-08-22 18:35:59',1763,512,'2005-08-28 21:18:59',2,'2006-02-15 21:30:53'),(15266,'2005-08-22 18:37:24',1870,124,'2005-08-23 17:34:24',2,'2006-02-15 21:30:53'),(15267,'2005-08-22 18:37:48',2966,153,'2005-08-24 00:22:48',1,'2006-02-15 21:30:53'),(15268,'2005-08-22 18:39:11',1245,301,'2005-08-26 21:46:11',1,'2006-02-15 21:30:53'),(15269,'2005-08-22 18:39:44',524,275,'2005-08-24 17:29:44',1,'2006-02-15 21:30:53'),(15270,'2005-08-22 18:48:42',4123,262,'2005-08-28 15:38:42',2,'2006-02-15 21:30:53'),(15271,'2005-08-22 18:48:48',4232,59,'2005-08-30 00:45:48',2,'2006-02-15 21:30:53'),(15272,'2005-08-22 18:49:40',1664,422,'2005-08-28 21:22:40',1,'2006-02-15 21:30:53'),(15273,'2005-08-22 18:53:28',2558,422,'2005-08-30 18:58:28',2,'2006-02-15 21:30:53'),(15274,'2005-08-22 18:55:52',3519,515,'2005-08-23 20:02:52',1,'2006-02-15 21:30:53'),(15275,'2005-08-22 18:57:39',1522,597,'2005-08-23 19:00:39',2,'2006-02-15 21:30:53'),(15276,'2005-08-22 18:59:01',4523,490,'2005-08-23 19:49:01',2,'2006-02-15 21:30:53'),(15277,'2005-08-22 19:02:48',1780,217,'2005-08-31 18:53:48',2,'2006-02-15 21:30:53'),(15278,'2005-08-22 19:06:47',2454,472,'2005-08-25 01:00:47',2,'2006-02-15 21:30:53'),(15279,'2005-08-22 19:08:49',1088,363,'2005-08-30 00:38:49',2,'2006-02-15 21:30:53'),(15280,'2005-08-22 19:09:52',3464,317,'2005-08-28 00:39:52',1,'2006-02-15 21:30:53'),(15281,'2005-08-22 19:10:26',3992,543,'2005-08-27 21:55:26',2,'2006-02-15 21:30:53'),(15282,'2006-02-14 15:16:03',1932,163,NULL,1,'2006-02-15 21:30:53'),(15283,'2005-08-22 19:16:04',1688,219,'2005-08-31 21:05:04',1,'2006-02-15 21:30:53'),(15284,'2005-08-22 19:17:08',2265,393,'2005-08-29 13:28:08',2,'2006-02-15 21:30:53'),(15285,'2005-08-22 19:17:24',481,233,'2005-08-25 00:25:24',1,'2006-02-15 21:30:53'),(15286,'2005-08-22 19:17:56',3731,74,'2005-08-29 16:08:56',2,'2006-02-15 21:30:53'),(15287,'2005-08-22 19:19:37',308,535,'2005-08-29 16:05:37',1,'2006-02-15 21:30:53'),(15288,'2005-08-22 19:23:58',1999,475,'2005-08-26 23:28:58',1,'2006-02-15 21:30:53'),(15289,'2005-08-22 19:27:24',1026,513,'2005-08-30 22:21:24',1,'2006-02-15 21:30:53'),(15290,'2005-08-22 19:28:02',270,404,'2005-08-31 20:04:02',2,'2006-02-15 21:30:53'),(15291,'2005-08-22 19:28:04',1461,494,'2005-08-26 15:07:04',1,'2006-02-15 21:30:53'),(15292,'2005-08-22 19:28:56',3072,337,'2005-08-28 22:39:56',2,'2006-02-15 21:30:53'),(15293,'2006-02-14 15:16:03',1219,263,NULL,2,'2006-02-15 21:30:53'),(15294,'2006-02-14 15:16:03',70,108,NULL,1,'2006-02-15 21:30:53'),(15295,'2005-08-22 19:36:21',2164,186,'2005-08-31 00:07:21',2,'2006-02-15 21:30:53'),(15296,'2005-08-22 19:37:20',2715,55,'2005-08-24 15:16:20',1,'2006-02-15 21:30:53'),(15297,'2006-02-14 15:16:03',3192,327,NULL,2,'2006-02-15 21:30:53'),(15298,'2005-08-22 19:41:37',1446,1,'2005-08-28 22:49:37',1,'2006-02-15 21:30:53'),(15299,'2005-08-22 19:42:57',767,381,'2005-08-23 15:29:57',2,'2006-02-15 21:30:53'),(15300,'2005-08-22 19:44:00',2319,399,'2005-08-25 22:49:00',2,'2006-02-15 21:30:53'),(15301,'2005-08-22 19:44:16',619,454,'2005-08-26 22:57:16',2,'2006-02-15 21:30:53'),(15302,'2005-08-22 19:44:53',188,320,'2005-08-24 18:13:53',2,'2006-02-15 21:30:53'),(15303,'2005-08-22 19:44:59',1672,390,'2005-08-30 21:59:59',1,'2006-02-15 21:30:53'),(15304,'2005-08-22 19:45:57',4332,112,'2005-08-28 00:21:57',2,'2006-02-15 21:30:53'),(15305,'2005-08-22 19:46:05',671,529,'2005-08-27 19:11:05',2,'2006-02-15 21:30:53'),(15306,'2005-08-22 19:46:36',521,340,'2005-08-27 14:09:36',1,'2006-02-15 21:30:53'),(15307,'2005-08-22 19:54:26',4525,598,'2005-08-29 01:38:26',2,'2006-02-15 21:30:53'),(15308,'2005-08-22 19:54:31',987,329,'2005-08-26 23:09:31',1,'2006-02-15 21:30:53'),(15309,'2005-08-22 19:54:52',2743,141,'2005-08-24 23:00:52',2,'2006-02-15 21:30:53'),(15310,'2005-08-22 19:56:41',2546,360,'2005-08-24 16:32:41',2,'2006-02-15 21:30:53'),(15311,'2005-08-22 19:56:52',3612,176,'2005-08-31 20:15:52',2,'2006-02-15 21:30:53'),(15312,'2005-08-22 19:58:15',2509,280,'2005-08-25 19:21:15',2,'2006-02-15 21:30:53'),(15313,'2005-08-22 19:59:42',2587,333,'2005-08-24 15:03:42',2,'2006-02-15 21:30:53'),(15314,'2006-02-14 15:16:03',2754,412,NULL,1,'2006-02-15 21:30:53'),(15315,'2005-08-22 20:03:46',312,1,'2005-08-30 01:51:46',2,'2006-02-15 21:30:53'),(15316,'2005-08-22 20:07:03',1830,422,'2005-08-27 18:45:03',1,'2006-02-15 21:30:53'),(15317,'2005-08-22 20:14:13',2325,512,'2005-08-29 18:32:13',1,'2006-02-15 21:30:53'),(15318,'2005-08-22 20:15:16',1738,60,'2005-08-25 14:17:16',1,'2006-02-15 21:30:53'),(15319,'2005-08-22 20:17:17',3041,188,'2005-08-25 01:06:17',2,'2006-02-15 21:30:53'),(15320,'2005-08-22 20:17:49',648,407,'2005-08-28 17:31:49',1,'2006-02-15 21:30:53'),(15321,'2005-08-22 20:20:04',4152,384,'2005-08-24 23:26:04',2,'2006-02-15 21:30:53'),(15322,'2005-08-22 20:20:30',3553,263,'2005-08-25 01:26:30',2,'2006-02-15 21:30:53'),(15323,'2005-08-22 20:22:40',1153,178,'2005-08-26 00:35:40',1,'2006-02-15 21:30:53'),(15324,'2005-08-22 20:23:13',161,93,'2005-08-29 18:23:13',1,'2006-02-15 21:30:53'),(15325,'2005-08-22 20:27:38',3549,74,'2005-08-23 15:24:38',1,'2006-02-15 21:30:53'),(15326,'2006-02-14 15:16:03',3320,58,NULL,1,'2006-02-15 21:30:53'),(15327,'2005-08-22 20:31:24',1018,450,'2005-08-30 23:52:24',1,'2006-02-15 21:30:53'),(15328,'2005-08-22 20:31:38',4546,274,'2005-08-29 20:17:38',1,'2006-02-15 21:30:53'),(15329,'2005-08-22 20:32:39',1900,521,'2005-08-23 17:15:39',1,'2006-02-15 21:30:53'),(15330,'2005-08-22 20:35:30',689,427,'2005-08-30 21:54:30',1,'2006-02-15 21:30:53'),(15331,'2005-08-22 20:37:57',146,147,'2005-08-25 21:56:57',1,'2006-02-15 21:30:53'),(15332,'2005-08-22 20:41:53',3368,162,'2005-08-24 01:45:53',1,'2006-02-15 21:30:53'),(15333,'2005-08-22 20:44:06',1839,142,'2005-08-29 22:34:06',2,'2006-02-15 21:30:53'),(15334,'2005-08-22 20:44:35',3882,407,'2005-08-29 23:03:35',2,'2006-02-15 21:30:53'),(15335,'2005-08-22 20:44:55',1593,363,'2005-08-28 21:43:55',1,'2006-02-15 21:30:53'),(15336,'2005-08-22 20:47:48',490,461,'2005-08-31 18:17:48',2,'2006-02-15 21:30:53'),(15337,'2005-08-22 20:49:51',280,237,'2005-08-26 23:27:51',1,'2006-02-15 21:30:53'),(15338,'2005-08-22 20:51:24',502,13,'2005-08-24 23:41:24',2,'2006-02-15 21:30:53'),(15339,'2005-08-22 20:52:12',1660,331,'2005-08-26 00:36:12',2,'2006-02-15 21:30:53'),(15340,'2005-08-22 20:55:56',3653,313,'2005-08-27 18:52:56',1,'2006-02-15 21:30:53'),(15341,'2005-08-22 20:56:31',3359,91,'2005-08-30 17:25:31',1,'2006-02-15 21:30:53'),(15342,'2005-08-22 20:56:41',3287,459,'2005-08-26 22:51:41',2,'2006-02-15 21:30:53'),(15343,'2005-08-22 21:01:25',2589,538,'2005-08-28 16:15:25',1,'2006-02-15 21:30:53'),(15344,'2005-08-22 21:01:48',3560,193,'2005-08-27 15:47:48',1,'2006-02-15 21:30:53'),(15345,'2005-08-22 21:05:50',3481,277,'2005-08-26 20:30:50',1,'2006-02-15 21:30:53'),(15346,'2005-08-22 21:06:00',3525,266,'2005-08-28 22:08:00',1,'2006-02-15 21:30:53'),(15347,'2005-08-22 21:12:19',3764,519,'2005-08-24 20:12:19',1,'2006-02-15 21:30:53'),(15348,'2005-08-22 21:13:46',3846,587,'2005-08-24 17:06:46',1,'2006-02-15 21:30:53'),(15349,'2005-08-22 21:13:51',4055,587,'2005-08-23 20:55:51',1,'2006-02-15 21:30:53'),(15350,'2005-08-22 21:15:29',1170,488,'2005-08-24 02:56:29',1,'2006-02-15 21:30:53'),(15351,'2005-08-22 21:15:46',3260,154,'2005-08-23 17:38:46',1,'2006-02-15 21:30:53'),(15352,'2005-08-22 21:16:54',16,560,'2005-08-31 00:38:54',2,'2006-02-15 21:30:53'),(15353,'2005-08-22 21:18:08',3470,368,'2005-08-25 20:29:08',2,'2006-02-15 21:30:53'),(15354,'2005-08-22 21:18:59',4212,412,'2005-08-27 20:12:59',2,'2006-02-15 21:30:53'),(15355,'2005-08-22 21:19:24',3477,493,'2005-08-28 20:36:24',2,'2006-02-15 21:30:53'),(15356,'2005-08-22 21:24:19',4507,539,'2005-08-25 22:32:19',2,'2006-02-15 21:30:53'),(15357,'2005-08-22 21:28:59',727,24,'2005-08-25 17:15:59',1,'2006-02-15 21:30:53'),(15358,'2005-08-22 21:29:14',822,448,'2005-08-31 00:10:14',2,'2006-02-15 21:30:53'),(15359,'2005-08-22 21:34:00',4505,77,'2005-08-29 18:59:00',1,'2006-02-15 21:30:53'),(15360,'2005-08-22 21:36:51',1950,531,'2005-08-24 16:46:51',1,'2006-02-15 21:30:53'),(15361,'2005-08-22 21:39:45',1407,380,'2005-08-23 17:32:45',2,'2006-02-15 21:30:53'),(15362,'2005-08-22 21:40:20',1023,497,'2005-08-29 15:55:20',1,'2006-02-15 21:30:53'),(15363,'2005-08-22 21:41:40',2326,480,'2005-08-23 21:40:40',1,'2006-02-15 21:30:53'),(15364,'2005-08-22 21:41:41',4184,204,'2005-08-28 00:49:41',1,'2006-02-15 21:30:53'),(15365,'2005-08-22 21:42:17',3382,327,'2005-09-01 03:14:17',2,'2006-02-15 21:30:53'),(15366,'2005-08-22 21:45:57',1453,374,'2005-08-30 16:35:57',1,'2006-02-15 21:30:53'),(15367,'2005-08-22 21:47:53',160,355,'2005-08-27 17:54:53',2,'2006-02-15 21:30:53'),(15368,'2005-08-22 21:57:15',1130,370,'2005-08-29 16:28:15',1,'2006-02-15 21:30:53'),(15369,'2005-08-22 21:58:06',881,121,'2005-08-26 00:27:06',2,'2006-02-15 21:30:53'),(15370,'2005-08-22 21:59:29',67,10,'2005-08-27 16:32:29',1,'2006-02-15 21:30:53'),(15371,'2006-02-14 15:16:03',3672,94,NULL,2,'2006-02-15 21:30:53'),(15372,'2005-08-22 21:59:51',3876,273,'2005-08-23 17:01:51',1,'2006-02-15 21:30:53'),(15373,'2005-08-22 22:08:11',4439,14,'2005-08-24 01:05:11',2,'2006-02-15 21:30:53'),(15374,'2005-08-22 22:09:09',4275,8,'2005-08-31 01:10:09',1,'2006-02-15 21:30:53'),(15375,'2005-08-22 22:12:02',3864,191,'2005-08-24 00:50:02',2,'2006-02-15 21:30:53'),(15376,'2005-08-22 22:21:35',2963,390,'2005-08-28 20:56:35',1,'2006-02-15 21:30:53'),(15377,'2005-08-22 22:22:33',3405,551,'2005-08-29 18:41:33',1,'2006-02-15 21:30:53'),(15378,'2005-08-22 22:25:17',1483,340,'2005-08-30 17:04:17',1,'2006-02-15 21:30:53'),(15379,'2005-08-22 22:26:13',1899,148,'2005-08-31 18:19:13',1,'2006-02-15 21:30:53'),(15380,'2005-08-22 22:28:15',3642,423,'2005-08-28 23:21:15',1,'2006-02-15 21:30:53'),(15381,'2005-08-22 22:28:36',845,110,'2005-08-24 19:26:36',2,'2006-02-15 21:30:53'),(15382,'2005-08-22 22:30:50',333,376,'2005-08-24 04:07:50',2,'2006-02-15 21:30:53'),(15383,'2005-08-22 22:31:20',686,405,'2005-08-28 17:43:20',1,'2006-02-15 21:30:53'),(15384,'2005-08-22 22:34:44',3208,26,'2005-08-23 23:25:44',2,'2006-02-15 21:30:53'),(15385,'2005-08-22 22:37:34',140,434,'2005-08-26 00:36:34',2,'2006-02-15 21:30:53'),(15386,'2005-08-22 22:41:14',3056,327,'2005-08-29 22:29:14',1,'2006-02-15 21:30:53'),(15387,'2005-08-22 22:49:13',3879,323,'2005-08-29 01:49:13',2,'2006-02-15 21:30:53'),(15388,'2005-08-22 22:49:23',3995,50,'2005-09-01 03:50:23',2,'2006-02-15 21:30:53'),(15389,'2005-08-22 22:51:13',2077,231,'2005-08-28 23:46:13',1,'2006-02-15 21:30:53'),(15390,'2005-08-22 22:57:25',462,551,'2005-08-31 18:06:25',1,'2006-02-15 21:30:53'),(15391,'2005-08-22 23:01:45',3918,482,'2005-08-29 02:59:45',2,'2006-02-15 21:30:53'),(15392,'2005-08-22 23:02:15',538,410,'2005-09-01 01:14:15',2,'2006-02-15 21:30:53'),(15393,'2005-08-22 23:04:09',2924,443,'2005-08-27 02:23:09',2,'2006-02-15 21:30:53'),(15394,'2005-08-22 23:04:21',3455,507,'2005-08-25 20:53:21',2,'2006-02-15 21:30:53'),(15395,'2005-08-22 23:06:25',2880,526,'2005-08-30 19:18:25',1,'2006-02-15 21:30:53'),(15396,'2005-08-22 23:07:57',4050,319,'2005-08-28 19:39:57',2,'2006-02-15 21:30:53'),(15397,'2005-08-22 23:08:46',1482,261,'2005-08-25 20:58:46',1,'2006-02-15 21:30:53'),(15398,'2005-08-22 23:10:49',4451,109,'2005-08-28 00:49:49',2,'2006-02-15 21:30:53'),(15399,'2005-08-22 23:11:59',3858,379,'2005-08-26 22:16:59',2,'2006-02-15 21:30:53'),(15400,'2005-08-22 23:13:03',2664,473,'2005-08-28 18:34:03',1,'2006-02-15 21:30:53'),(15401,'2005-08-22 23:13:10',1721,103,'2005-09-01 03:44:10',1,'2006-02-15 21:30:53'),(15402,'2005-08-22 23:17:41',1575,293,'2005-08-30 20:07:41',2,'2006-02-15 21:30:53'),(15403,'2005-08-22 23:18:10',4315,581,'2005-08-23 18:08:10',2,'2006-02-15 21:30:53'),(15404,'2005-08-22 23:19:44',3557,211,'2005-08-30 19:58:44',2,'2006-02-15 21:30:53'),(15405,'2005-08-22 23:20:41',3263,596,'2005-08-25 23:53:41',1,'2006-02-15 21:30:53'),(15406,'2005-08-22 23:21:22',400,227,'2005-08-28 22:21:22',1,'2006-02-15 21:30:53'),(15407,'2006-02-14 15:16:03',3330,42,NULL,2,'2006-02-15 21:30:53'),(15408,'2005-08-22 23:26:32',165,156,'2005-08-30 20:22:32',1,'2006-02-15 21:30:53'),(15409,'2005-08-22 23:26:32',560,188,'2005-08-24 22:44:32',1,'2006-02-15 21:30:53'),(15410,'2005-08-22 23:27:43',2052,403,'2005-08-29 05:12:43',2,'2006-02-15 21:30:53'),(15411,'2005-08-22 23:35:41',4423,461,'2005-08-26 00:51:41',1,'2006-02-15 21:30:53'),(15412,'2005-08-22 23:37:11',1267,199,'2005-08-28 23:26:11',2,'2006-02-15 21:30:53'),(15413,'2005-08-22 23:38:01',2494,476,'2005-08-23 19:27:01',2,'2006-02-15 21:30:53'),(15414,'2005-08-22 23:43:54',718,532,'2005-08-30 18:26:54',1,'2006-02-15 21:30:53'),(15415,'2005-08-22 23:48:56',4176,204,'2005-09-01 02:05:56',1,'2006-02-15 21:30:53'),(15416,'2005-08-22 23:51:23',1167,383,'2005-08-29 20:03:23',1,'2006-02-15 21:30:53'),(15417,'2005-08-22 23:54:04',1826,305,'2005-08-26 22:25:04',1,'2006-02-15 21:30:53'),(15418,'2005-08-22 23:54:14',808,205,'2005-08-28 04:23:14',2,'2006-02-15 21:30:53'),(15419,'2005-08-22 23:54:36',1120,450,'2005-08-25 00:52:36',1,'2006-02-15 21:30:53'),(15420,'2005-08-22 23:55:51',1396,161,'2005-08-31 20:09:51',2,'2006-02-15 21:30:53'),(15421,'2005-08-22 23:56:37',3,541,'2005-08-25 18:58:37',2,'2006-02-15 21:30:53'),(15422,'2005-08-22 23:58:09',2601,309,'2005-08-30 19:03:09',2,'2006-02-15 21:30:53'),(15423,'2006-02-14 15:16:03',1786,596,NULL,1,'2006-02-15 21:30:53'),(15424,'2005-08-23 00:03:01',3452,138,'2005-08-27 23:27:01',2,'2006-02-15 21:30:53'),(15425,'2005-08-23 00:05:57',551,259,'2005-09-01 05:08:57',1,'2006-02-15 21:30:53'),(15426,'2005-08-23 00:07:19',3280,347,'2005-08-26 23:19:19',1,'2006-02-15 21:30:53'),(15427,'2005-08-23 00:07:53',2775,448,'2005-09-01 02:55:53',2,'2006-02-15 21:30:53'),(15428,'2005-08-23 00:11:52',4379,402,'2005-08-24 02:35:52',1,'2006-02-15 21:30:53'),(15429,'2005-08-23 00:20:31',740,241,'2005-08-23 20:22:31',1,'2006-02-15 21:30:53'),(15430,'2006-02-14 15:16:03',4353,282,NULL,1,'2006-02-15 21:30:53'),(15431,'2005-08-23 00:26:47',3251,550,'2005-08-31 23:26:47',2,'2006-02-15 21:30:53'),(15432,'2005-08-23 00:26:52',1896,117,'2005-08-27 06:11:52',1,'2006-02-15 21:30:53'),(15433,'2005-08-23 00:27:18',155,198,'2005-08-26 21:36:18',1,'2006-02-15 21:30:53'),(15434,'2005-08-23 00:28:16',4378,518,'2005-08-26 04:27:16',2,'2006-02-15 21:30:53'),(15435,'2005-08-23 00:28:19',2103,468,'2005-08-26 00:44:19',2,'2006-02-15 21:30:53'),(15436,'2005-08-23 00:30:26',1527,505,'2005-08-28 06:29:26',1,'2006-02-15 21:30:53'),(15437,'2005-08-23 00:31:09',4236,368,'2005-08-30 06:17:09',2,'2006-02-15 21:30:53'),(15438,'2005-08-23 00:31:57',2030,46,'2005-08-26 20:02:57',1,'2006-02-15 21:30:53'),(15439,'2005-08-23 00:34:28',3848,136,'2005-08-27 01:07:28',1,'2006-02-15 21:30:53'),(15440,'2005-08-23 00:37:21',2254,559,'2005-08-24 23:24:21',1,'2006-02-15 21:30:53'),(15441,'2006-02-14 15:16:03',258,422,NULL,2,'2006-02-15 21:30:53'),(15442,'2005-08-23 00:42:49',1452,42,'2005-08-27 00:35:49',1,'2006-02-15 21:30:53'),(15443,'2005-08-23 00:44:15',742,598,'2005-09-01 05:33:15',2,'2006-02-15 21:30:53'),(15444,'2005-08-23 00:46:52',959,153,'2005-08-29 20:37:52',2,'2006-02-15 21:30:53'),(15445,'2005-08-23 00:48:29',196,28,'2005-08-28 00:33:29',1,'2006-02-15 21:30:53'),(15446,'2005-08-23 00:49:24',503,379,'2005-08-26 02:09:24',2,'2006-02-15 21:30:53'),(15447,'2005-08-23 00:53:57',4090,331,'2005-08-29 06:19:57',2,'2006-02-15 21:30:53'),(15448,'2005-08-23 00:55:24',2903,490,'2005-08-25 02:20:24',1,'2006-02-15 21:30:53'),(15449,'2005-08-23 00:55:43',2856,461,'2005-08-28 03:41:43',1,'2006-02-15 21:30:53'),(15450,'2005-08-23 00:56:01',1102,322,'2005-08-24 01:00:01',2,'2006-02-15 21:30:53'),(15451,'2005-08-23 00:56:27',231,514,'2005-08-24 00:15:27',2,'2006-02-15 21:30:53'),(15452,'2005-08-23 00:57:12',717,115,'2005-08-28 00:19:12',1,'2006-02-15 21:30:53'),(15453,'2005-08-23 01:01:01',2,359,'2005-08-30 20:08:01',1,'2006-02-15 21:30:53'),(15454,'2006-02-14 15:16:03',2946,142,NULL,2,'2006-02-15 21:30:53'),(15455,'2005-08-23 01:05:00',3991,238,'2005-08-26 22:56:00',1,'2006-02-15 21:30:53'),(15456,'2005-08-23 01:07:01',2451,262,'2005-08-24 23:28:01',2,'2006-02-15 21:30:53'),(15457,'2005-08-23 01:07:37',4539,306,'2005-08-26 19:46:37',1,'2006-02-15 21:30:53'),(15458,'2006-02-14 15:16:03',25,590,NULL,2,'2006-02-15 21:30:53'),(15459,'2005-08-23 01:09:48',2058,346,'2005-08-24 04:52:48',1,'2006-02-15 21:30:53'),(15460,'2005-08-23 01:10:42',2907,20,'2005-08-28 20:49:42',2,'2006-02-15 21:30:53'),(15461,'2005-08-23 01:13:52',4542,103,'2005-08-30 00:44:52',1,'2006-02-15 21:30:53'),(15462,'2005-08-23 01:14:01',3267,389,'2005-08-29 19:52:01',1,'2006-02-15 21:30:53'),(15463,'2005-08-23 01:15:07',863,127,'2005-08-29 06:50:07',1,'2006-02-15 21:30:53'),(15464,'2005-08-23 01:15:18',3235,62,'2005-08-29 02:58:18',2,'2006-02-15 21:30:53'),(15465,'2005-08-23 01:16:33',362,520,'2005-08-28 20:08:33',2,'2006-02-15 21:30:53'),(15466,'2005-08-23 01:16:55',571,418,'2005-08-29 22:57:55',1,'2006-02-15 21:30:53'),(15467,'2005-08-23 01:22:12',3658,103,'2005-08-29 23:42:12',2,'2006-02-15 21:30:53'),(15468,'2005-08-23 01:25:30',2440,399,'2005-08-28 01:40:30',2,'2006-02-15 21:30:53'),(15469,'2005-08-23 01:29:59',1939,597,'2005-08-27 04:02:59',1,'2006-02-15 21:30:53'),(15470,'2005-08-23 01:35:12',3009,416,'2005-09-01 05:33:12',1,'2006-02-15 21:30:53'),(15471,'2005-08-23 01:38:48',2591,139,'2005-08-31 19:47:48',1,'2006-02-15 21:30:53'),(15472,'2005-08-23 01:39:05',4293,226,'2005-08-25 04:43:05',1,'2006-02-15 21:30:53'),(15473,'2005-08-23 01:39:10',356,259,'2005-08-25 03:48:10',1,'2006-02-15 21:30:53'),(15474,'2005-08-23 01:39:10',3015,188,'2005-08-23 21:46:10',2,'2006-02-15 21:30:53'),(15475,'2005-08-23 01:44:43',4503,562,'2005-08-23 23:53:43',2,'2006-02-15 21:30:53'),(15476,'2005-08-23 01:45:07',2478,433,'2005-08-26 21:07:07',2,'2006-02-15 21:30:53'),(15477,'2005-08-23 01:46:35',2406,142,'2005-08-28 22:12:35',1,'2006-02-15 21:30:53'),(15478,'2005-08-23 01:50:31',4563,167,'2005-08-27 21:40:31',2,'2006-02-15 21:30:53'),(15479,'2005-08-23 01:50:53',4182,149,'2005-08-29 00:53:53',1,'2006-02-15 21:30:53'),(15480,'2005-08-23 01:57:20',3298,577,'2005-08-26 04:43:20',2,'2006-02-15 21:30:53'),(15481,'2005-08-23 01:59:14',3262,414,'2005-08-27 04:38:14',1,'2006-02-15 21:30:53'),(15482,'2005-08-23 02:01:20',3923,181,'2005-08-24 03:25:20',2,'2006-02-15 21:30:53'),(15483,'2005-08-23 02:02:53',2970,173,'2005-08-26 04:13:53',1,'2006-02-15 21:30:53'),(15484,'2005-08-23 02:04:49',642,342,'2005-08-24 05:46:49',1,'2006-02-15 21:30:53'),(15485,'2005-08-23 02:04:57',281,114,'2005-08-28 07:05:57',2,'2006-02-15 21:30:53'),(15486,'2005-08-23 02:05:20',1666,502,'2005-08-29 07:52:20',2,'2006-02-15 21:30:53'),(15487,'2005-08-23 02:05:51',2636,469,'2005-08-25 04:45:51',1,'2006-02-15 21:30:53'),(15488,'2005-08-23 02:06:01',4535,385,'2005-08-29 21:35:01',2,'2006-02-15 21:30:53'),(15489,'2005-08-23 02:06:41',764,285,'2005-08-25 06:50:41',1,'2006-02-15 21:30:53'),(15490,'2005-08-23 02:08:18',3922,493,'2005-08-30 06:15:18',1,'2006-02-15 21:30:53'),(15491,'2005-08-23 02:08:40',2059,28,'2005-08-23 20:23:40',2,'2006-02-15 21:30:53'),(15492,'2005-08-23 02:13:46',1298,520,'2005-08-26 21:53:46',2,'2006-02-15 21:30:53'),(15493,'2005-08-23 02:20:53',3521,308,'2005-08-25 23:02:53',1,'2006-02-15 21:30:53'),(15494,'2005-08-23 02:25:09',2968,455,'2005-08-27 00:18:09',1,'2006-02-15 21:30:53'),(15495,'2005-08-23 02:26:10',4310,193,'2005-08-30 01:07:10',2,'2006-02-15 21:30:53'),(15496,'2005-08-23 02:30:23',1863,275,'2005-08-31 03:31:23',2,'2006-02-15 21:30:53'),(15497,'2006-02-14 15:16:03',363,107,NULL,1,'2006-02-15 21:30:53'),(15498,'2005-08-23 02:33:27',1583,83,'2005-08-23 22:30:27',1,'2006-02-15 21:30:53'),(15499,'2005-08-23 02:37:19',630,488,'2005-08-23 20:57:19',1,'2006-02-15 21:30:53'),(15500,'2005-08-23 02:39:37',886,74,'2005-08-27 06:42:37',1,'2006-02-15 21:30:53'),(15501,'2005-08-23 02:39:56',4468,138,'2005-08-25 04:39:56',1,'2006-02-15 21:30:53'),(15502,'2005-08-23 02:40:04',3219,433,'2005-08-31 00:36:04',2,'2006-02-15 21:30:53'),(15503,'2005-08-23 02:44:49',4519,582,'2005-08-27 06:33:49',2,'2006-02-15 21:30:53'),(15504,'2005-08-23 02:45:21',1967,315,'2005-09-01 03:24:21',2,'2006-02-15 21:30:53'),(15505,'2005-08-23 02:46:13',1144,375,'2005-08-26 23:34:13',2,'2006-02-15 21:30:53'),(15506,'2005-08-23 02:48:24',1914,553,'2005-08-28 04:10:24',1,'2006-02-15 21:30:53'),(15507,'2005-08-23 02:48:26',3130,563,'2005-08-27 01:32:26',1,'2006-02-15 21:30:53'),(15508,'2005-08-23 02:49:04',4035,293,'2005-08-29 00:58:04',1,'2006-02-15 21:30:53'),(15509,'2005-08-23 02:51:24',1291,6,'2005-08-31 06:21:24',2,'2006-02-15 21:30:53'),(15510,'2005-08-23 02:51:27',3239,209,'2005-09-01 02:44:27',2,'2006-02-15 21:30:53'),(15511,'2005-08-23 02:55:42',3327,303,'2005-08-31 03:14:42',2,'2006-02-15 21:30:53'),(15512,'2005-08-23 02:57:30',4336,25,'2005-08-25 01:47:30',2,'2006-02-15 21:30:53'),(15513,'2005-08-23 03:01:56',3779,147,'2005-08-24 23:46:56',2,'2006-02-15 21:30:53'),(15514,'2005-08-23 03:03:40',2824,366,'2005-08-24 01:06:40',1,'2006-02-15 21:30:53'),(15515,'2005-08-23 03:03:53',3940,307,'2005-08-25 08:27:53',2,'2006-02-15 21:30:53'),(15516,'2005-08-23 03:12:54',219,82,'2005-08-30 04:02:54',1,'2006-02-15 21:30:53'),(15517,'2005-08-23 03:13:01',2221,187,'2005-08-25 21:14:01',2,'2006-02-15 21:30:53'),(15518,'2005-08-23 03:19:34',3522,410,'2005-08-24 02:55:34',1,'2006-02-15 21:30:53'),(15519,'2005-08-23 03:23:32',542,443,'2005-08-25 03:48:32',1,'2006-02-15 21:30:53'),(15520,'2005-08-23 03:30:45',1792,163,'2005-09-01 00:20:45',1,'2006-02-15 21:30:53'),(15521,'2005-08-23 03:30:51',134,331,'2005-08-28 22:09:51',1,'2006-02-15 21:30:53'),(15522,'2005-08-23 03:32:31',2396,468,'2005-08-30 02:17:31',2,'2006-02-15 21:30:53'),(15523,'2005-08-23 03:32:36',2570,432,'2005-08-26 22:08:36',2,'2006-02-15 21:30:53'),(15524,'2005-08-23 03:36:26',2886,68,'2005-08-26 06:28:26',2,'2006-02-15 21:30:53'),(15525,'2005-08-23 03:43:32',3509,123,'2005-08-25 07:31:32',2,'2006-02-15 21:30:53'),(15526,'2005-08-23 03:44:30',2892,516,'2005-08-30 08:19:30',1,'2006-02-15 21:30:53'),(15527,'2005-08-23 03:44:51',88,393,'2005-08-25 03:09:51',1,'2006-02-15 21:30:53'),(15528,'2005-08-23 03:45:40',3033,114,'2005-08-25 01:16:40',1,'2006-02-15 21:30:53'),(15529,'2005-08-23 03:46:47',4015,19,'2005-08-24 00:59:47',1,'2006-02-15 21:30:53'),(15530,'2005-08-23 03:50:48',154,167,'2005-08-28 22:17:48',2,'2006-02-15 21:30:53'),(15531,'2005-08-23 03:52:36',2410,355,'2005-08-25 23:21:36',1,'2006-02-15 21:30:53'),(15532,'2006-02-14 15:16:03',1061,23,NULL,1,'2006-02-15 21:30:53'),(15533,'2005-08-23 03:54:39',1895,400,'2005-08-26 08:27:39',2,'2006-02-15 21:30:53'),(15534,'2005-08-23 03:55:54',544,169,'2005-08-24 03:54:54',1,'2006-02-15 21:30:53'),(15535,'2005-08-23 03:58:02',2371,346,'2005-08-25 05:06:02',2,'2006-02-15 21:30:53'),(15536,'2005-08-23 03:58:28',4004,98,'2005-08-31 03:28:28',2,'2006-02-15 21:30:53'),(15537,'2005-08-23 04:00:30',2958,137,'2005-08-24 01:45:30',2,'2006-02-15 21:30:53'),(15538,'2005-08-23 04:07:37',4226,211,'2005-08-28 07:37:37',1,'2006-02-15 21:30:53'),(15539,'2005-08-23 04:09:03',2853,582,'2005-08-26 04:01:03',1,'2006-02-15 21:30:53'),(15540,'2005-08-23 04:12:52',1696,197,'2005-08-31 04:25:52',1,'2006-02-15 21:30:53'),(15541,'2005-08-23 04:13:53',2762,148,'2005-08-29 05:51:53',1,'2006-02-15 21:30:53'),(15542,'2006-02-14 15:16:03',21,111,NULL,1,'2006-02-15 21:30:53'),(15543,'2005-08-23 04:15:41',3836,282,'2005-09-01 05:09:41',2,'2006-02-15 21:30:53'),(15544,'2005-08-23 04:17:56',1918,30,'2005-09-01 00:43:56',2,'2006-02-15 21:30:53'),(15545,'2005-08-23 04:20:16',843,513,'2005-08-29 08:22:16',1,'2006-02-15 21:30:53'),(15546,'2005-08-23 04:20:38',2087,223,'2005-09-01 09:57:38',2,'2006-02-15 21:30:53'),(15547,'2005-08-23 04:25:50',1488,69,'2005-08-26 00:57:50',1,'2006-02-15 21:30:53'),(15548,'2005-08-23 04:26:20',2350,334,'2005-08-28 01:27:20',1,'2006-02-15 21:30:53'),(15549,'2005-08-23 04:27:06',369,170,'2005-09-01 06:07:06',1,'2006-02-15 21:30:53'),(15550,'2005-08-23 04:27:54',1375,465,'2005-08-29 01:29:54',1,'2006-02-15 21:30:53'),(15551,'2005-08-23 04:28:25',3570,345,'2005-08-26 07:19:25',1,'2006-02-15 21:30:53'),(15552,'2005-08-23 04:33:23',4347,527,'2005-09-01 10:25:23',2,'2006-02-15 21:30:53'),(15553,'2005-08-23 04:33:39',1659,232,'2005-08-25 07:53:39',2,'2006-02-15 21:30:53'),(15554,'2005-08-23 04:48:12',198,280,'2005-08-29 05:11:12',1,'2006-02-15 21:30:53'),(15555,'2005-08-23 04:51:52',1869,347,'2005-08-24 01:01:52',1,'2006-02-15 21:30:53'),(15556,'2005-08-23 04:52:16',3683,108,'2005-09-01 02:05:16',2,'2006-02-15 21:30:53'),(15557,'2005-08-23 04:52:17',3641,444,'2005-08-30 02:15:17',2,'2006-02-15 21:30:53'),(15558,'2005-08-23 04:52:22',638,474,'2005-09-01 02:26:22',1,'2006-02-15 21:30:53'),(15559,'2005-08-23 04:55:05',1773,517,'2005-08-30 09:01:05',2,'2006-02-15 21:30:53'),(15560,'2005-08-23 05:01:13',3616,107,'2005-09-01 05:02:13',1,'2006-02-15 21:30:53'),(15561,'2005-08-23 05:02:31',68,469,'2005-09-01 02:51:31',1,'2006-02-15 21:30:53'),(15562,'2005-08-23 05:04:33',4238,149,'2005-08-27 09:58:33',1,'2006-02-15 21:30:53'),(15563,'2005-08-23 05:08:58',170,372,'2005-08-24 04:24:58',1,'2006-02-15 21:30:53'),(15564,'2005-08-23 05:10:42',1268,353,'2005-08-30 03:17:42',1,'2006-02-15 21:30:53'),(15565,'2005-08-23 05:13:09',71,546,'2005-08-30 08:58:09',2,'2006-02-15 21:30:53'),(15566,'2005-08-23 05:17:23',4344,76,'2005-09-01 08:09:23',2,'2006-02-15 21:30:53'),(15567,'2005-08-23 05:20:36',2506,54,'2005-08-24 10:09:36',2,'2006-02-15 21:30:53'),(15568,'2005-08-23 05:24:09',988,556,'2005-08-27 08:57:09',2,'2006-02-15 21:30:53'),(15569,'2005-08-23 05:24:29',1071,313,'2005-08-30 08:23:29',2,'2006-02-15 21:30:53'),(15570,'2005-08-23 05:24:55',4014,557,'2005-08-31 07:06:55',2,'2006-02-15 21:30:53'),(15571,'2005-08-23 05:26:30',716,57,'2005-08-29 00:54:30',2,'2006-02-15 21:30:53'),(15572,'2005-08-23 05:28:01',2816,506,'2005-08-27 00:14:01',2,'2006-02-15 21:30:53'),(15573,'2005-08-23 05:28:36',3133,561,'2005-08-27 05:37:36',2,'2006-02-15 21:30:53'),(15574,'2005-08-23 05:29:32',3253,130,'2005-09-01 01:25:32',2,'2006-02-15 21:30:53'),(15575,'2005-08-23 05:30:19',3916,218,'2005-08-27 05:19:19',2,'2006-02-15 21:30:53'),(15576,'2005-08-23 05:32:03',3257,595,'2005-08-26 02:31:03',1,'2006-02-15 21:30:53'),(15577,'2006-02-14 15:16:03',539,29,NULL,2,'2006-02-15 21:30:53'),(15578,'2005-08-23 05:37:13',2829,302,'2005-08-27 01:11:13',1,'2006-02-15 21:30:53'),(15579,'2005-08-23 05:38:41',3986,480,'2005-08-29 09:18:41',1,'2006-02-15 21:30:53'),(15580,'2005-08-23 05:39:06',754,279,'2005-09-01 01:14:06',2,'2006-02-15 21:30:53'),(15581,'2005-08-23 05:42:13',4010,462,'2005-08-28 00:03:13',1,'2006-02-15 21:30:53'),(15582,'2005-08-23 05:45:44',4264,297,'2005-08-25 07:54:44',2,'2006-02-15 21:30:53'),(15583,'2005-08-23 05:47:55',4299,215,'2005-08-26 01:46:55',1,'2006-02-15 21:30:53'),(15584,'2005-08-23 05:49:21',3526,500,'2005-08-27 04:49:21',1,'2006-02-15 21:30:53'),(15585,'2005-08-23 05:55:22',1177,545,'2005-08-24 11:45:22',2,'2006-02-15 21:30:53'),(15586,'2005-08-23 05:57:04',3232,148,'2005-08-31 01:59:04',1,'2006-02-15 21:30:53'),(15587,'2005-08-23 06:00:28',2510,499,'2005-08-29 10:15:28',1,'2006-02-15 21:30:53'),(15588,'2005-08-23 06:02:35',1810,503,'2005-08-30 04:01:35',2,'2006-02-15 21:30:53'),(15589,'2005-08-23 06:03:31',2379,22,'2005-08-30 07:44:31',2,'2006-02-15 21:30:53'),(15590,'2005-08-23 06:09:44',4048,599,'2005-09-01 06:53:44',2,'2006-02-15 21:30:53'),(15591,'2005-08-23 06:11:52',64,62,'2005-08-25 05:34:52',1,'2006-02-15 21:30:53'),(15593,'2005-08-23 06:15:09',3734,153,'2005-08-27 07:47:09',2,'2006-02-15 21:30:53'),(15594,'2005-08-23 06:18:43',4227,567,'2005-09-01 09:09:43',2,'2006-02-15 21:30:53'),(15595,'2005-08-23 06:19:12',4046,264,'2005-08-31 04:52:12',1,'2006-02-15 21:30:53'),(15596,'2005-08-23 06:19:51',3834,186,'2005-08-25 03:32:51',1,'2006-02-15 21:30:53'),(15597,'2005-08-23 06:21:20',3795,420,'2005-08-28 02:47:20',2,'2006-02-15 21:30:53'),(15598,'2005-08-23 06:23:26',2794,66,'2005-09-01 05:43:26',1,'2006-02-15 21:30:53'),(15599,'2005-08-23 06:25:07',4560,103,'2005-08-29 00:48:07',1,'2006-02-15 21:30:53'),(15600,'2005-08-23 06:31:24',2260,113,'2005-08-28 06:53:24',1,'2006-02-15 21:30:53'),(15601,'2005-08-23 06:33:26',3643,579,'2005-08-24 04:10:26',1,'2006-02-15 21:30:53'),(15602,'2005-08-23 06:41:07',1429,81,'2005-08-24 07:16:07',1,'2006-02-15 21:30:53'),(15603,'2005-08-23 06:41:32',2565,6,'2005-08-28 08:51:32',1,'2006-02-15 21:30:53'),(15604,'2005-08-23 06:44:19',4000,458,'2005-08-29 07:17:19',1,'2006-02-15 21:30:53'),(15605,'2005-08-23 06:48:47',3152,544,'2005-08-28 06:09:47',1,'2006-02-15 21:30:53'),(15606,'2005-08-23 06:50:27',1811,279,'2005-08-28 04:23:27',2,'2006-02-15 21:30:53'),(15607,'2005-08-23 06:54:06',4118,484,'2005-08-26 05:03:06',2,'2006-02-15 21:30:53'),(15608,'2005-08-23 06:55:26',2921,454,'2005-08-28 10:24:26',1,'2006-02-15 21:30:53'),(15609,'2005-08-23 06:56:04',1730,256,'2005-09-01 03:25:04',1,'2006-02-15 21:30:53'),(15610,'2005-08-23 06:56:15',2076,215,'2005-08-24 07:37:15',2,'2006-02-15 21:30:53'),(15611,'2005-08-23 06:56:18',1713,184,'2005-08-25 06:10:18',1,'2006-02-15 21:30:53'),(15612,'2005-08-23 06:59:07',3367,305,'2005-09-01 11:26:07',2,'2006-02-15 21:30:53'),(15613,'2005-08-23 07:03:19',307,461,'2005-08-31 07:50:19',2,'2006-02-15 21:30:53'),(15614,'2005-08-23 07:05:15',1216,287,'2005-09-01 11:41:15',1,'2006-02-15 21:30:53'),(15615,'2005-08-23 07:06:00',899,584,'2005-08-30 11:21:00',2,'2006-02-15 21:30:53'),(15616,'2005-08-23 07:06:38',2947,70,'2005-08-30 04:16:38',1,'2006-02-15 21:30:53'),(15617,'2005-08-23 07:07:22',4085,569,'2005-08-27 01:24:22',2,'2006-02-15 21:30:53'),(15618,'2005-08-23 07:07:58',1903,60,'2005-08-29 03:48:58',1,'2006-02-15 21:30:53'),(15619,'2005-08-23 07:10:14',2468,3,'2005-08-26 07:21:14',2,'2006-02-15 21:30:53'),(15620,'2005-08-23 07:10:22',1173,270,'2005-08-28 06:51:22',2,'2006-02-15 21:30:53'),(15621,'2005-08-23 07:13:43',3832,123,'2005-08-29 08:19:43',1,'2006-02-15 21:30:53'),(15622,'2005-08-23 07:22:02',3335,302,'2005-09-01 06:08:02',2,'2006-02-15 21:30:53'),(15623,'2005-08-23 07:23:29',3003,525,'2005-08-31 01:47:29',1,'2006-02-15 21:30:53'),(15624,'2005-08-23 07:24:27',396,105,'2005-08-29 12:36:27',2,'2006-02-15 21:30:53'),(15625,'2005-08-23 07:25:29',4200,207,'2005-08-27 13:17:29',2,'2006-02-15 21:30:53'),(15626,'2005-08-23 07:25:34',640,370,'2005-08-28 11:01:34',1,'2006-02-15 21:30:53'),(15627,'2005-08-23 07:25:38',1364,453,'2005-08-31 02:53:38',2,'2006-02-15 21:30:53'),(15628,'2005-08-23 07:28:04',1348,408,'2005-08-26 04:23:04',1,'2006-02-15 21:30:53'),(15629,'2005-08-23 07:28:22',3725,286,'2005-08-29 06:29:22',2,'2006-02-15 21:30:53'),(15630,'2005-08-23 07:29:13',3590,580,'2005-08-31 04:33:13',2,'2006-02-15 21:30:53'),(15631,'2005-08-23 07:30:23',2458,93,'2005-08-24 07:23:23',1,'2006-02-15 21:30:53'),(15632,'2005-08-23 07:30:26',2941,60,'2005-08-24 07:53:26',2,'2006-02-15 21:30:53'),(15633,'2005-08-23 07:31:10',882,497,'2005-08-26 04:35:10',2,'2006-02-15 21:30:53'),(15634,'2005-08-23 07:34:18',2517,576,'2005-08-24 12:00:18',2,'2006-02-15 21:30:53'),(15635,'2005-08-23 07:43:00',3308,4,'2005-08-27 10:47:00',1,'2006-02-15 21:30:53'),(15636,'2005-08-23 07:50:46',1169,380,'2005-08-26 07:59:46',2,'2006-02-15 21:30:53'),(15637,'2005-08-23 07:53:38',445,172,'2005-08-29 03:16:38',2,'2006-02-15 21:30:53'),(15638,'2005-08-23 07:54:54',3358,563,'2005-08-30 13:33:54',2,'2006-02-15 21:30:53'),(15639,'2005-08-23 08:03:25',42,214,'2005-08-24 10:21:25',2,'2006-02-15 21:30:53'),(15640,'2005-08-23 08:04:40',3505,262,'2005-08-24 06:38:40',1,'2006-02-15 21:30:53'),(15641,'2005-08-23 08:06:49',3126,240,'2005-08-24 13:17:49',1,'2006-02-15 21:30:53'),(15642,'2005-08-23 08:09:11',2627,160,'2005-08-28 05:57:11',1,'2006-02-15 21:30:53'),(15643,'2005-08-23 08:13:26',103,298,'2005-08-25 05:18:26',2,'2006-02-15 21:30:53'),(15644,'2006-02-14 15:16:03',3139,43,NULL,2,'2006-02-15 21:30:53'),(15645,'2006-02-14 15:16:03',3838,214,NULL,2,'2006-02-15 21:30:53'),(15646,'2005-08-23 08:19:55',3217,114,'2005-08-29 02:32:55',1,'2006-02-15 21:30:53'),(15647,'2005-08-23 08:23:56',2051,251,'2005-08-26 11:00:56',1,'2006-02-15 21:30:53'),(15648,'2005-08-23 08:27:57',4039,80,'2005-08-30 08:53:57',2,'2006-02-15 21:30:53'),(15649,'2005-08-23 08:28:03',415,60,'2005-08-30 05:11:03',1,'2006-02-15 21:30:53'),(15650,'2005-08-23 08:29:53',2447,353,'2005-08-25 07:23:53',2,'2006-02-15 21:30:53'),(15651,'2005-08-23 08:31:49',3393,451,'2005-08-26 02:57:49',1,'2006-02-15 21:30:53'),(15652,'2005-08-23 08:34:10',4440,578,'2005-08-30 12:31:10',1,'2006-02-15 21:30:53'),(15653,'2005-08-23 08:34:42',2736,439,'2005-09-01 03:07:42',1,'2006-02-15 21:30:53'),(15654,'2005-08-23 08:34:53',4360,471,'2005-08-30 04:18:53',2,'2006-02-15 21:30:53'),(15655,'2006-02-14 15:16:03',604,359,NULL,1,'2006-02-15 21:30:53'),(15656,'2005-08-23 08:38:58',4239,334,'2005-08-24 04:08:58',2,'2006-02-15 21:30:53'),(15657,'2005-08-23 08:42:40',1897,36,'2005-09-01 13:08:40',1,'2006-02-15 21:30:53'),(15658,'2005-08-23 08:48:43',3565,22,'2005-08-25 05:38:43',1,'2006-02-15 21:30:53'),(15659,'2005-08-23 08:48:43',4573,131,'2005-08-27 14:19:43',2,'2006-02-15 21:30:53'),(15660,'2005-08-23 08:51:21',3223,388,'2005-08-28 06:26:21',2,'2006-02-15 21:30:53'),(15661,'2005-08-23 08:52:03',1599,346,'2005-08-30 08:17:03',2,'2006-02-15 21:30:53'),(15662,'2005-08-23 08:52:50',3028,223,'2005-08-24 08:08:50',1,'2006-02-15 21:30:53'),(15663,'2005-08-23 08:54:26',3291,291,'2005-08-29 02:56:26',1,'2006-02-15 21:30:53'),(15664,'2005-08-23 08:57:11',2029,351,'2005-08-31 14:19:11',2,'2006-02-15 21:30:53'),(15665,'2005-08-23 08:59:12',3471,487,'2005-08-24 12:50:12',2,'2006-02-15 21:30:53'),(15666,'2005-08-23 09:01:10',3406,586,'2005-08-31 12:32:10',2,'2006-02-15 21:30:53'),(15667,'2005-08-23 09:02:03',1302,73,'2005-08-24 05:47:03',1,'2006-02-15 21:30:53'),(15668,'2005-08-23 09:02:04',1963,38,'2005-08-29 03:17:04',2,'2006-02-15 21:30:53'),(15669,'2005-08-23 09:06:17',1542,334,'2005-08-30 08:10:17',2,'2006-02-15 21:30:53'),(15670,'2005-08-23 09:07:11',2834,211,'2005-08-31 04:32:11',2,'2006-02-15 21:30:53'),(15671,'2005-08-23 09:08:16',3716,112,'2005-08-29 14:01:16',1,'2006-02-15 21:30:53'),(15672,'2005-08-23 09:09:18',701,210,'2005-08-27 06:19:18',1,'2006-02-15 21:30:53'),(15673,'2005-08-23 09:12:50',3096,321,'2005-08-29 12:45:50',2,'2006-02-15 21:30:53'),(15674,'2005-08-23 09:16:39',4482,90,'2005-09-01 11:57:39',1,'2006-02-15 21:30:53'),(15675,'2005-08-23 09:18:52',4153,293,'2005-08-30 14:59:52',2,'2006-02-15 21:30:53'),(15676,'2005-08-23 09:23:08',3874,353,'2005-08-30 06:19:08',2,'2006-02-15 21:30:53'),(15677,'2005-08-23 09:23:36',2050,109,'2005-08-27 05:01:36',1,'2006-02-15 21:30:53'),(15678,'2005-08-23 09:23:45',1345,413,'2005-08-27 11:38:45',2,'2006-02-15 21:30:53'),(15679,'2005-08-23 09:27:29',2945,103,'2005-08-28 09:14:29',1,'2006-02-15 21:30:53'),(15680,'2005-08-23 09:33:22',1370,169,'2005-08-31 13:29:22',2,'2006-02-15 21:30:53'),(15681,'2005-08-23 09:35:34',2813,61,'2005-08-27 08:33:34',1,'2006-02-15 21:30:53'),(15682,'2005-08-23 09:37:34',3293,31,'2005-08-31 06:01:34',1,'2006-02-15 21:30:53'),(15683,'2005-08-23 09:38:17',3787,168,'2005-08-30 12:31:17',2,'2006-02-15 21:30:53'),(15684,'2005-08-23 09:40:04',3976,586,'2005-08-28 15:28:04',1,'2006-02-15 21:30:53'),(15685,'2005-08-23 09:41:28',370,491,'2005-08-30 10:11:28',1,'2006-02-15 21:30:53'),(15686,'2005-08-23 09:42:21',2041,206,'2005-08-29 12:22:21',1,'2006-02-15 21:30:53'),(15687,'2005-08-23 09:46:33',276,112,'2005-09-01 06:07:33',1,'2006-02-15 21:30:53'),(15688,'2005-08-23 09:48:45',2851,105,'2005-08-30 10:28:45',2,'2006-02-15 21:30:53'),(15689,'2005-08-23 09:52:55',248,259,'2005-08-29 11:15:55',1,'2006-02-15 21:30:53'),(15690,'2005-08-23 09:53:30',2102,554,'2005-08-29 10:27:30',1,'2006-02-15 21:30:53'),(15691,'2005-08-23 09:53:54',784,200,'2005-08-27 10:14:54',1,'2006-02-15 21:30:53'),(15692,'2005-08-23 10:00:02',1852,503,'2005-08-24 05:25:02',1,'2006-02-15 21:30:53'),(15693,'2005-08-23 10:00:24',748,94,'2005-08-25 08:23:24',1,'2006-02-15 21:30:53'),(15694,'2005-08-23 10:02:46',3017,506,'2005-08-31 05:46:46',2,'2006-02-15 21:30:53'),(15695,'2006-02-14 15:16:03',2954,300,NULL,1,'2006-02-15 21:30:53'),(15696,'2005-08-23 10:04:17',2836,93,'2005-08-25 08:47:17',2,'2006-02-15 21:30:53'),(15697,'2005-08-23 10:04:36',1987,380,'2005-08-24 05:00:36',2,'2006-02-15 21:30:53'),(15698,'2005-08-23 10:11:40',4465,395,'2005-08-28 08:50:40',2,'2006-02-15 21:30:53'),(15699,'2005-08-23 10:20:35',4155,501,'2005-08-30 13:56:35',1,'2006-02-15 21:30:53'),(15700,'2005-08-23 10:21:21',2935,552,'2005-08-24 15:37:21',1,'2006-02-15 21:30:53'),(15701,'2005-08-23 10:22:21',2942,516,'2005-08-24 10:52:21',1,'2006-02-15 21:30:53'),(15702,'2005-08-23 10:23:28',1602,56,'2005-08-29 11:08:28',2,'2006-02-15 21:30:53'),(15703,'2005-08-23 10:23:48',2883,322,'2005-09-01 06:54:48',2,'2006-02-15 21:30:53'),(15704,'2005-08-23 10:25:45',738,71,'2005-08-29 16:06:45',2,'2006-02-15 21:30:53'),(15705,'2005-08-23 10:32:52',936,356,'2005-08-29 13:18:52',2,'2006-02-15 21:30:53'),(15706,'2005-08-23 10:32:52',4486,220,'2005-08-24 07:03:52',2,'2006-02-15 21:30:53'),(15707,'2005-08-23 10:35:45',3646,91,'2005-08-27 10:57:45',1,'2006-02-15 21:30:53'),(15708,'2005-08-23 10:35:51',1974,46,'2005-08-27 16:02:51',1,'2006-02-15 21:30:53'),(15709,'2005-08-23 10:36:00',346,206,'2005-08-28 06:18:00',2,'2006-02-15 21:30:53'),(15710,'2006-02-14 15:16:03',1020,421,NULL,1,'2006-02-15 21:30:53'),(15711,'2005-08-23 10:43:00',789,297,'2005-08-29 16:29:00',1,'2006-02-15 21:30:53'),(15712,'2005-08-23 10:43:56',1882,351,'2005-08-29 15:35:56',2,'2006-02-15 21:30:53'),(15713,'2005-08-23 10:56:15',337,432,'2005-08-29 09:14:15',2,'2006-02-15 21:30:53'),(15714,'2006-02-14 15:16:03',2083,56,NULL,1,'2006-02-15 21:30:53'),(15715,'2005-08-23 10:57:40',3808,86,'2005-08-28 12:40:40',1,'2006-02-15 21:30:53'),(15716,'2005-08-23 11:02:00',2812,408,'2005-08-28 14:46:00',1,'2006-02-15 21:30:53'),(15717,'2006-02-14 15:16:03',902,208,NULL,2,'2006-02-15 21:30:53'),(15718,'2005-08-23 11:05:17',2180,276,'2005-08-28 12:50:17',1,'2006-02-15 21:30:53'),(15719,'2005-08-23 11:08:46',3990,599,'2005-08-25 07:25:46',1,'2006-02-15 21:30:53'),(15720,'2005-08-23 11:15:20',2490,456,'2005-08-31 09:49:20',1,'2006-02-15 21:30:53'),(15721,'2005-08-23 11:16:16',685,154,'2005-08-28 10:21:16',1,'2006-02-15 21:30:53'),(15722,'2005-08-23 11:16:29',2809,26,'2005-09-01 13:24:29',2,'2006-02-15 21:30:53'),(15723,'2005-08-23 11:17:26',3915,504,'2005-08-31 13:58:26',2,'2006-02-15 21:30:53'),(15724,'2005-08-23 11:22:09',1025,478,'2005-08-28 12:56:09',2,'2006-02-15 21:30:53'),(15725,'2005-08-23 11:25:00',378,599,'2005-08-26 11:46:00',1,'2006-02-15 21:30:53'),(15726,'2005-08-23 11:28:26',906,503,'2005-08-28 11:23:26',2,'2006-02-15 21:30:53'),(15727,'2005-08-23 11:28:49',2184,416,'2005-08-24 06:24:49',2,'2006-02-15 21:30:53'),(15728,'2005-08-23 11:30:32',2567,323,'2005-08-28 09:52:32',2,'2006-02-15 21:30:53'),(15729,'2006-02-14 15:16:03',2699,193,NULL,2,'2006-02-15 21:30:53'),(15730,'2005-08-23 11:32:35',947,147,'2005-08-30 13:46:35',2,'2006-02-15 21:30:53'),(15731,'2005-08-23 11:33:25',3403,118,'2005-08-24 07:19:25',2,'2006-02-15 21:30:53'),(15732,'2005-08-23 11:35:12',3247,412,'2005-08-26 12:50:12',2,'2006-02-15 21:30:53'),(15733,'2005-08-23 11:37:32',4185,512,'2005-08-28 16:27:32',1,'2006-02-15 21:30:53'),(15734,'2005-08-23 11:40:08',3952,302,'2005-08-27 08:16:08',1,'2006-02-15 21:30:53'),(15735,'2006-02-14 15:16:03',3167,295,NULL,1,'2006-02-15 21:30:53'),(15736,'2005-08-23 11:40:30',4272,127,'2005-08-30 12:40:30',1,'2006-02-15 21:30:53'),(15737,'2005-08-23 11:52:18',996,83,'2005-08-28 15:28:18',1,'2006-02-15 21:30:53'),(15738,'2005-08-23 11:55:50',556,38,'2005-08-30 15:07:50',1,'2006-02-15 21:30:53'),(15739,'2005-08-23 11:56:22',266,74,'2005-08-29 16:10:22',2,'2006-02-15 21:30:53'),(15740,'2005-08-23 12:07:51',100,229,'2005-08-24 13:23:51',2,'2006-02-15 21:30:53'),(15741,'2005-08-23 12:10:54',4243,126,'2005-08-24 10:08:54',2,'2006-02-15 21:30:53'),(15742,'2005-08-23 12:11:37',1339,200,'2005-08-31 07:28:37',2,'2006-02-15 21:30:53'),(15743,'2005-08-23 12:12:05',1625,139,'2005-08-26 11:35:05',1,'2006-02-15 21:30:53'),(15744,'2005-08-23 12:15:51',2364,59,'2005-08-31 17:19:51',1,'2006-02-15 21:30:53'),(15745,'2006-02-14 15:16:03',2737,43,NULL,1,'2006-02-15 21:30:53'),(15746,'2005-08-23 12:26:19',2241,246,'2005-08-26 09:51:19',2,'2006-02-15 21:30:53'),(15747,'2005-08-23 12:29:24',1517,381,'2005-08-31 08:27:24',2,'2006-02-15 21:30:53'),(15748,'2005-08-23 12:33:00',2757,380,'2005-08-25 15:15:00',2,'2006-02-15 21:30:53'),(15749,'2005-08-23 12:33:41',4224,575,'2005-08-24 10:52:41',1,'2006-02-15 21:30:53'),(15750,'2005-08-23 12:36:05',4474,496,'2005-08-24 17:40:05',2,'2006-02-15 21:30:53'),(15751,'2005-08-23 12:41:07',697,199,'2005-08-29 07:03:07',2,'2006-02-15 21:30:53'),(15752,'2005-08-23 12:41:38',2112,17,'2005-09-01 14:06:38',1,'2006-02-15 21:30:53'),(15753,'2005-08-23 12:43:30',3451,144,'2005-09-01 09:07:30',2,'2006-02-15 21:30:53'),(15754,'2005-08-23 12:43:42',2306,356,'2005-08-27 17:45:42',2,'2006-02-15 21:30:53'),(15755,'2005-08-23 12:46:38',511,423,'2005-08-25 12:59:38',1,'2006-02-15 21:30:53'),(15756,'2005-08-23 12:47:05',878,112,'2005-08-28 08:34:05',2,'2006-02-15 21:30:53'),(15757,'2005-08-23 12:47:16',1308,356,'2005-08-29 17:19:16',1,'2006-02-15 21:30:53'),(15758,'2005-08-23 12:47:26',152,46,'2005-08-29 11:05:26',2,'2006-02-15 21:30:53'),(15759,'2005-08-23 12:47:37',1341,361,'2005-09-01 11:28:37',2,'2006-02-15 21:30:53'),(15760,'2005-08-23 12:50:00',3050,273,'2005-08-29 15:41:00',2,'2006-02-15 21:30:53'),(15761,'2005-08-23 12:55:51',4362,416,'2005-08-26 16:51:51',1,'2006-02-15 21:30:53'),(15762,'2005-08-23 13:01:43',887,351,'2005-08-26 16:35:43',1,'2006-02-15 21:30:53'),(15763,'2005-08-23 13:02:59',124,158,'2005-08-24 17:45:59',2,'2006-02-15 21:30:53'),(15764,'2005-08-23 13:05:10',2937,8,'2005-08-25 16:15:10',1,'2006-02-15 21:30:53'),(15765,'2005-08-23 13:06:19',1250,408,'2005-08-31 12:18:19',1,'2006-02-15 21:30:53'),(15766,'2005-08-23 13:10:16',1996,436,'2005-08-30 09:27:16',1,'2006-02-15 21:30:53'),(15767,'2005-08-23 13:14:15',3492,241,'2005-08-27 14:43:15',2,'2006-02-15 21:30:53'),(15768,'2005-08-23 13:14:47',662,267,'2005-08-29 14:17:47',2,'2006-02-15 21:30:53'),(15769,'2005-08-23 13:16:15',2392,276,'2005-08-28 18:31:15',1,'2006-02-15 21:30:53'),(15770,'2005-08-23 13:18:16',1424,113,'2005-08-29 11:31:16',1,'2006-02-15 21:30:53'),(15771,'2005-08-23 13:18:46',3667,262,'2005-08-26 07:29:46',1,'2006-02-15 21:30:53'),(15772,'2005-08-23 13:22:56',4343,202,'2005-08-26 10:35:56',2,'2006-02-15 21:30:53'),(15773,'2005-08-23 13:24:57',1626,189,'2005-08-31 14:16:57',2,'2006-02-15 21:30:53'),(15774,'2005-08-23 13:25:08',1273,254,'2005-08-28 10:08:08',2,'2006-02-15 21:30:53'),(15775,'2005-08-23 13:25:44',2146,173,'2005-09-01 16:56:44',1,'2006-02-15 21:30:53'),(15776,'2005-08-23 13:26:01',43,514,'2005-08-29 18:17:01',1,'2006-02-15 21:30:53'),(15777,'2005-08-23 13:29:08',4241,130,'2005-08-27 18:50:08',2,'2006-02-15 21:30:53'),(15778,'2006-02-14 15:16:03',1269,234,NULL,1,'2006-02-15 21:30:53'),(15779,'2005-08-23 13:33:46',1560,419,'2005-08-28 08:40:46',2,'2006-02-15 21:30:53'),(15780,'2006-02-14 15:16:03',2911,120,NULL,2,'2006-02-15 21:30:53'),(15781,'2005-08-23 13:41:05',4449,412,'2005-08-31 13:11:05',1,'2006-02-15 21:30:53'),(15782,'2005-08-23 13:43:26',3282,245,'2005-08-30 14:03:26',1,'2006-02-15 21:30:53'),(15783,'2005-08-23 13:45:44',397,247,'2005-08-26 09:18:44',2,'2006-02-15 21:30:53'),(15784,'2005-08-23 13:46:00',126,425,'2005-08-30 11:49:00',2,'2006-02-15 21:30:53'),(15785,'2005-08-23 13:46:27',1758,543,'2005-08-27 10:16:27',2,'2006-02-15 21:30:53'),(15786,'2005-08-23 13:48:34',3132,371,'2005-08-27 15:59:34',1,'2006-02-15 21:30:53'),(15787,'2005-08-23 13:51:57',2932,123,'2005-08-27 17:06:57',1,'2006-02-15 21:30:53'),(15788,'2005-08-23 13:54:39',13,269,'2005-08-26 10:17:39',1,'2006-02-15 21:30:53'),(15789,'2005-08-23 13:56:40',1213,350,'2005-08-27 15:25:40',1,'2006-02-15 21:30:53'),(15790,'2005-08-23 14:01:07',2887,233,'2005-08-30 10:32:07',2,'2006-02-15 21:30:53'),(15791,'2005-08-23 14:02:13',4147,445,'2005-09-01 09:03:13',2,'2006-02-15 21:30:53'),(15792,'2005-08-23 14:05:37',2175,581,'2005-08-28 10:54:37',1,'2006-02-15 21:30:53'),(15793,'2005-08-23 14:06:19',2863,22,'2005-08-24 19:59:19',2,'2006-02-15 21:30:53'),(15794,'2006-02-14 15:16:03',3917,579,NULL,2,'2006-02-15 21:30:53'),(15795,'2005-08-23 14:07:56',4371,417,'2005-08-25 12:10:56',2,'2006-02-15 21:30:53'),(15796,'2005-08-23 14:12:22',1425,158,'2005-08-28 17:03:22',2,'2006-02-15 21:30:53'),(15797,'2005-08-23 14:13:47',497,503,'2005-08-25 09:16:47',2,'2006-02-15 21:30:53'),(15798,'2005-08-23 14:23:03',3803,203,'2005-08-30 17:39:03',2,'2006-02-15 21:30:53'),(15799,'2005-08-23 14:23:23',2519,215,'2005-08-24 17:15:23',2,'2006-02-15 21:30:53'),(15800,'2005-08-23 14:23:44',963,43,'2005-08-29 17:04:44',2,'2006-02-15 21:30:53'),(15801,'2005-08-23 14:26:04',1590,165,'2005-08-28 15:04:04',1,'2006-02-15 21:30:53'),(15802,'2005-08-23 14:26:51',41,158,'2005-08-29 16:28:51',2,'2006-02-15 21:30:53'),(15803,'2005-08-23 14:27:07',500,105,'2005-08-28 12:01:07',2,'2006-02-15 21:30:53'),(15804,'2005-08-23 14:29:16',3338,585,'2005-08-26 08:41:16',1,'2006-02-15 21:30:53'),(15805,'2005-08-23 14:31:19',4511,8,'2005-08-25 19:01:19',2,'2006-02-15 21:30:53'),(15806,'2005-08-23 14:31:50',2683,166,'2005-08-27 16:08:50',2,'2006-02-15 21:30:53'),(15807,'2005-08-23 14:35:10',2705,350,'2005-08-29 19:06:10',2,'2006-02-15 21:30:53'),(15808,'2005-08-23 14:38:37',1663,446,'2005-08-27 14:45:37',2,'2006-02-15 21:30:53'),(15809,'2005-08-23 14:42:07',1885,431,'2005-08-27 15:00:07',2,'2006-02-15 21:30:53'),(15810,'2005-08-23 14:43:15',2196,171,'2005-08-25 17:41:15',1,'2006-02-15 21:30:53'),(15811,'2005-08-23 14:43:46',3487,300,'2005-08-27 16:43:46',1,'2006-02-15 21:30:53'),(15812,'2005-08-23 14:47:26',4457,45,'2005-09-01 10:51:26',2,'2006-02-15 21:30:53'),(15813,'2006-02-14 15:16:03',981,9,NULL,1,'2006-02-15 21:30:53'),(15814,'2005-08-23 14:52:50',4361,459,'2005-08-27 16:12:50',2,'2006-02-15 21:30:53'),(15815,'2005-08-23 14:55:47',316,444,'2005-08-24 12:37:47',1,'2006-02-15 21:30:53'),(15816,'2005-08-23 14:58:06',3628,31,'2005-08-28 13:30:06',1,'2006-02-15 21:30:53'),(15817,'2005-08-23 14:59:51',598,348,'2005-08-25 15:27:51',1,'2006-02-15 21:30:53'),(15818,'2005-08-23 14:59:58',2620,439,'2005-08-27 13:13:58',2,'2006-02-15 21:30:53'),(15819,'2005-08-23 15:01:54',3639,274,'2005-08-31 20:01:54',2,'2006-02-15 21:30:53'),(15820,'2005-08-23 15:03:13',4553,308,'2005-08-25 20:12:13',1,'2006-02-15 21:30:53'),(15821,'2005-08-23 15:03:58',1714,233,'2005-08-24 17:46:58',2,'2006-02-15 21:30:53'),(15822,'2005-08-23 15:05:59',3602,492,'2005-08-24 11:13:59',1,'2006-02-15 21:30:53'),(15823,'2005-08-23 15:08:00',3047,81,'2005-08-24 17:52:00',2,'2006-02-15 21:30:53'),(15824,'2005-08-23 15:09:17',2933,371,'2005-08-28 15:14:17',2,'2006-02-15 21:30:53'),(15825,'2005-08-23 15:10:42',149,346,'2005-08-29 09:28:42',2,'2006-02-15 21:30:53'),(15826,'2005-08-23 15:15:02',215,311,'2005-08-31 20:39:02',2,'2006-02-15 21:30:53'),(15827,'2005-08-23 15:15:19',1732,346,'2005-08-24 10:50:19',2,'2006-02-15 21:30:53'),(15828,'2005-08-23 15:16:32',428,327,'2005-08-29 12:20:32',1,'2006-02-15 21:30:53'),(15829,'2005-08-23 15:17:14',4387,30,'2005-08-27 13:04:14',1,'2006-02-15 21:30:53'),(15830,'2005-08-23 15:19:15',309,467,'2005-08-25 18:42:15',2,'2006-02-15 21:30:53'),(15831,'2005-08-23 15:21:19',3123,401,'2005-08-24 15:47:19',2,'2006-02-15 21:30:53'),(15832,'2005-08-23 15:21:35',1468,537,'2005-08-30 15:01:35',2,'2006-02-15 21:30:53'),(15833,'2005-08-23 15:22:15',801,349,'2005-08-31 14:54:15',1,'2006-02-15 21:30:53'),(15834,'2005-08-23 15:23:50',217,165,'2005-09-01 19:31:50',1,'2006-02-15 21:30:53'),(15835,'2005-08-23 15:25:27',1362,128,'2005-09-01 16:14:27',2,'2006-02-15 21:30:53'),(15836,'2005-08-23 15:29:17',260,468,'2005-08-26 11:44:17',2,'2006-02-15 21:30:53'),(15837,'2005-08-23 15:29:41',4388,283,'2005-08-27 18:17:41',1,'2006-02-15 21:30:53'),(15838,'2005-08-23 15:30:48',2194,579,'2005-08-31 11:20:48',2,'2006-02-15 21:30:53'),(15839,'2005-08-23 15:34:46',3726,294,'2005-08-30 21:00:46',2,'2006-02-15 21:30:53'),(15840,'2005-08-23 15:34:49',1901,316,'2005-08-24 16:54:49',1,'2006-02-15 21:30:53'),(15841,'2005-08-23 15:35:59',2865,571,'2005-08-30 19:30:59',2,'2006-02-15 21:30:53'),(15842,'2005-08-23 15:36:05',1850,146,'2005-08-30 14:05:05',2,'2006-02-15 21:30:53'),(15843,'2005-08-23 15:37:31',611,215,'2005-08-28 18:41:31',2,'2006-02-15 21:30:53'),(15844,'2005-08-23 15:38:12',2027,119,'2005-08-26 15:18:12',1,'2006-02-15 21:30:53'),(15845,'2005-08-23 15:38:34',4312,89,'2005-08-25 10:06:34',1,'2006-02-15 21:30:53'),(15846,'2005-08-23 15:39:18',3635,47,'2005-08-27 14:28:18',2,'2006-02-15 21:30:53'),(15847,'2005-08-23 15:39:38',2287,163,'2005-08-24 11:46:38',1,'2006-02-15 21:30:53'),(15848,'2005-08-23 15:41:12',2141,336,'2005-08-26 10:29:12',2,'2006-02-15 21:30:53'),(15849,'2005-08-23 15:41:20',4077,482,'2005-08-27 15:47:20',2,'2006-02-15 21:30:53'),(15850,'2005-08-23 15:45:42',586,563,'2005-08-27 19:24:42',1,'2006-02-15 21:30:53'),(15851,'2005-08-23 15:46:33',2286,469,'2005-08-29 15:52:33',1,'2006-02-15 21:30:53'),(15852,'2005-08-23 15:47:02',1506,140,'2005-08-25 19:37:02',1,'2006-02-15 21:30:53'),(15853,'2005-08-23 15:54:20',225,500,'2005-08-24 18:53:20',2,'2006-02-15 21:30:53'),(15854,'2005-08-23 15:58:05',1648,464,'2005-08-26 19:23:05',1,'2006-02-15 21:30:53'),(15855,'2005-08-23 15:59:01',2528,192,'2005-08-29 20:26:01',1,'2006-02-15 21:30:53'),(15856,'2005-08-23 15:59:12',3379,395,'2005-08-25 15:36:12',1,'2006-02-15 21:30:53'),(15857,'2005-08-23 15:59:51',2733,575,'2005-08-26 12:01:51',2,'2006-02-15 21:30:53'),(15858,'2005-08-23 16:07:15',4515,81,'2005-08-25 19:36:15',2,'2006-02-15 21:30:53'),(15859,'2005-08-23 16:08:15',4269,465,'2005-08-28 11:08:15',1,'2006-02-15 21:30:53'),(15860,'2005-08-23 16:08:40',2583,41,'2005-08-28 15:35:40',1,'2006-02-15 21:30:53'),(15861,'2005-08-23 16:15:45',1859,256,'2005-09-01 11:37:45',2,'2006-02-15 21:30:53'),(15862,'2006-02-14 15:16:03',925,215,NULL,1,'2006-02-15 21:30:53'),(15863,'2005-08-23 16:17:09',2783,328,'2005-08-28 16:10:09',2,'2006-02-15 21:30:53'),(15864,'2005-08-23 16:18:12',3014,256,'2005-08-29 17:10:12',2,'2006-02-15 21:30:53'),(15865,'2005-08-23 16:18:25',2031,482,'2005-08-26 10:57:25',2,'2006-02-15 21:30:53'),(15866,'2005-08-23 16:19:02',3828,296,'2005-08-31 12:29:02',2,'2006-02-15 21:30:53'),(15867,'2006-02-14 15:16:03',837,505,NULL,2,'2006-02-15 21:30:53'),(15868,'2005-08-23 16:19:14',2186,306,'2005-08-29 16:14:14',2,'2006-02-15 21:30:53'),(15869,'2005-08-23 16:22:20',1344,357,'2005-08-27 11:52:20',1,'2006-02-15 21:30:53'),(15870,'2005-08-23 16:23:08',590,251,'2005-08-28 20:30:08',2,'2006-02-15 21:30:53'),(15871,'2005-08-23 16:24:24',425,57,'2005-09-01 13:48:24',2,'2006-02-15 21:30:53'),(15872,'2005-08-23 16:27:24',3391,212,'2005-08-31 11:57:24',1,'2006-02-15 21:30:53'),(15873,'2005-08-23 16:27:59',4548,577,'2005-08-26 11:11:59',2,'2006-02-15 21:30:53'),(15874,'2005-08-23 16:30:55',621,132,'2005-08-28 20:57:55',1,'2006-02-15 21:30:53'),(15875,'2006-02-14 15:16:03',3611,41,NULL,1,'2006-02-15 21:30:53'),(15876,'2005-08-23 16:32:10',1735,87,'2005-08-24 18:16:10',1,'2006-02-15 21:30:53'),(15877,'2005-08-23 16:33:33',2307,559,'2005-08-26 10:36:33',2,'2006-02-15 21:30:53'),(15878,'2005-08-23 16:34:31',1592,493,'2005-08-27 21:51:31',2,'2006-02-15 21:30:53'),(15879,'2005-08-23 16:42:53',235,482,'2005-08-29 16:21:53',2,'2006-02-15 21:30:53'),(15880,'2005-08-23 16:43:54',2538,528,'2005-08-31 14:40:54',2,'2006-02-15 21:30:53'),(15881,'2005-08-23 16:44:25',617,383,'2005-08-29 13:58:25',1,'2006-02-15 21:30:53'),(15882,'2005-08-23 16:44:31',2028,312,'2005-09-01 15:44:31',2,'2006-02-15 21:30:53'),(15883,'2005-08-23 16:44:56',2792,550,'2005-08-24 22:42:56',1,'2006-02-15 21:30:53'),(15884,'2005-08-23 16:45:28',2255,81,'2005-08-27 20:18:28',1,'2006-02-15 21:30:53'),(15885,'2005-08-23 16:50:43',2116,565,'2005-08-29 20:19:43',1,'2006-02-15 21:30:53'),(15886,'2005-08-23 16:50:53',3038,91,'2005-08-26 15:38:53',2,'2006-02-15 21:30:53'),(15887,'2005-08-23 16:54:09',4263,201,'2005-08-26 13:20:09',2,'2006-02-15 21:30:53'),(15888,'2005-08-23 16:56:14',2955,321,'2005-08-31 14:32:14',1,'2006-02-15 21:30:53'),(15889,'2005-08-23 16:57:43',787,137,'2005-08-27 22:14:43',1,'2006-02-15 21:30:53'),(15890,'2005-08-23 16:58:12',3625,87,'2005-08-24 12:23:12',1,'2006-02-15 21:30:53'),(15891,'2005-08-23 17:00:12',2168,52,'2005-08-31 21:12:12',1,'2006-02-15 21:30:53'),(15892,'2005-08-23 17:01:00',1365,174,'2005-08-28 12:50:00',1,'2006-02-15 21:30:53'),(15893,'2005-08-23 17:02:00',2571,438,'2005-08-30 12:45:00',2,'2006-02-15 21:30:53'),(15894,'2006-02-14 15:16:03',4416,168,NULL,1,'2006-02-15 21:30:53'),(15895,'2005-08-23 17:09:31',2275,342,'2005-08-30 17:15:31',1,'2006-02-15 21:30:53'),(15896,'2005-08-23 17:09:56',528,585,'2005-08-31 14:51:56',2,'2006-02-15 21:30:53'),(15897,'2005-08-23 17:12:31',1652,15,'2005-08-30 17:22:31',1,'2006-02-15 21:30:53'),(15898,'2005-08-23 17:13:01',3502,88,'2005-08-29 11:22:01',2,'2006-02-15 21:30:53'),(15899,'2005-08-23 17:16:28',3851,596,'2005-08-29 21:46:28',2,'2006-02-15 21:30:53'),(15900,'2005-08-23 17:16:30',1112,562,'2005-08-27 18:02:30',1,'2006-02-15 21:30:53'),(15901,'2005-08-23 17:19:17',2761,226,'2005-08-30 14:24:17',2,'2006-02-15 21:30:53'),(15902,'2005-08-23 17:28:03',4500,172,'2005-08-30 18:36:03',1,'2006-02-15 21:30:53'),(15903,'2005-08-23 17:30:40',1289,267,'2005-08-29 14:12:40',1,'2006-02-15 21:30:53'),(15904,'2005-08-23 17:32:19',179,37,'2005-08-24 21:05:19',2,'2006-02-15 21:30:53'),(15905,'2005-08-23 17:33:04',3631,59,'2005-08-26 17:38:04',2,'2006-02-15 21:30:53'),(15906,'2005-08-23 17:36:00',3230,445,'2005-08-28 15:32:00',2,'2006-02-15 21:30:53'),(15907,'2005-08-23 17:39:35',2898,2,'2005-08-25 23:23:35',1,'2006-02-15 21:30:53'),(15908,'2005-08-23 17:42:00',2453,135,'2005-08-31 22:32:00',1,'2006-02-15 21:30:53'),(15909,'2005-08-23 17:42:42',404,452,'2005-08-26 20:25:42',1,'2006-02-15 21:30:53'),(15910,'2005-08-23 17:43:16',254,456,'2005-08-24 21:55:16',2,'2006-02-15 21:30:53'),(15911,'2005-08-23 17:44:53',3006,582,'2005-09-01 19:14:53',1,'2006-02-15 21:30:53'),(15912,'2005-08-23 17:47:40',3079,229,'2005-08-31 14:43:40',2,'2006-02-15 21:30:53'),(15913,'2005-08-23 17:48:30',3894,93,'2005-08-31 21:17:30',2,'2006-02-15 21:30:53'),(15914,'2005-08-23 17:49:26',747,557,'2005-08-24 12:20:26',1,'2006-02-15 21:30:53'),(15915,'2005-08-23 17:52:01',3566,167,'2005-08-24 20:40:01',2,'2006-02-15 21:30:53'),(15916,'2005-08-23 17:56:01',4580,327,'2005-08-31 21:49:01',2,'2006-02-15 21:30:53'),(15917,'2005-08-23 17:57:28',2093,589,'2005-08-29 20:03:28',1,'2006-02-15 21:30:53'),(15918,'2005-08-23 17:57:35',1456,262,'2005-08-28 14:16:35',2,'2006-02-15 21:30:53'),(15919,'2005-08-23 18:01:31',1746,497,'2005-08-24 16:27:31',1,'2006-02-15 21:30:53'),(15920,'2005-08-23 18:05:10',243,212,'2005-08-26 18:09:10',1,'2006-02-15 21:30:53'),(15921,'2005-08-23 18:06:54',223,522,'2005-08-30 20:19:54',2,'2006-02-15 21:30:53'),(15922,'2005-08-23 18:07:31',1702,263,'2005-09-01 22:27:31',1,'2006-02-15 21:30:53'),(15923,'2005-08-23 18:08:19',1693,276,'2005-08-26 18:06:19',2,'2006-02-15 21:30:53'),(15924,'2005-08-23 18:08:59',1114,541,'2005-08-27 12:20:59',2,'2006-02-15 21:30:53'),(15925,'2005-08-23 18:15:06',3394,440,'2005-08-26 18:09:06',2,'2006-02-15 21:30:53'),(15926,'2005-08-23 18:20:56',2231,151,'2005-08-24 18:20:56',2,'2006-02-15 21:30:53'),(15927,'2005-08-23 18:23:11',2450,401,'2005-08-24 15:09:11',1,'2006-02-15 21:30:53'),(15928,'2005-08-23 18:23:24',2086,75,'2005-09-01 23:43:24',2,'2006-02-15 21:30:53'),(15929,'2005-08-23 18:23:30',1832,477,'2005-08-27 17:04:30',1,'2006-02-15 21:30:53'),(15930,'2005-08-23 18:26:51',180,379,'2005-08-31 16:12:51',1,'2006-02-15 21:30:53'),(15931,'2005-08-23 18:28:09',1128,237,'2005-08-28 23:08:09',1,'2006-02-15 21:30:53'),(15932,'2005-08-23 18:31:40',4554,405,'2005-08-24 16:30:40',2,'2006-02-15 21:30:53'),(15933,'2005-08-23 18:36:44',3493,176,'2005-08-26 12:41:44',2,'2006-02-15 21:30:53'),(15934,'2005-08-23 18:40:41',994,216,'2005-08-25 00:18:41',2,'2006-02-15 21:30:53'),(15935,'2005-08-23 18:41:11',907,361,'2005-08-25 20:59:11',1,'2006-02-15 21:30:53'),(15936,'2005-08-23 18:43:11',1293,411,'2005-08-26 00:19:11',1,'2006-02-15 21:30:53'),(15937,'2005-08-23 18:43:22',2882,194,'2005-08-24 22:53:22',1,'2006-02-15 21:30:53'),(15938,'2005-08-23 18:43:31',2884,341,'2005-08-31 00:26:31',2,'2006-02-15 21:30:53'),(15939,'2005-08-23 18:44:21',3209,382,'2005-09-01 17:25:21',2,'2006-02-15 21:30:53'),(15940,'2005-08-23 18:45:06',1606,86,'2005-08-30 13:00:06',2,'2006-02-15 21:30:53'),(15941,'2005-08-23 18:46:44',4304,424,'2005-08-31 17:31:44',1,'2006-02-15 21:30:53'),(15942,'2005-08-23 18:48:40',1096,210,'2005-09-01 18:39:40',2,'2006-02-15 21:30:53'),(15943,'2005-08-23 18:49:32',706,462,'2005-08-27 19:20:32',1,'2006-02-15 21:30:53'),(15944,'2005-08-23 18:50:54',4559,348,'2005-08-25 18:04:54',2,'2006-02-15 21:30:53'),(15945,'2005-08-23 18:51:41',3633,43,'2005-08-28 18:42:41',1,'2006-02-15 21:30:53'),(15946,'2005-08-23 18:54:07',4549,561,'2005-08-28 21:21:07',1,'2006-02-15 21:30:53'),(15947,'2005-08-23 18:54:32',1877,580,'2005-08-24 22:39:32',2,'2006-02-15 21:30:53'),(15948,'2005-08-23 18:59:33',432,520,'2005-08-31 13:02:33',2,'2006-02-15 21:30:53'),(15949,'2005-08-23 19:06:04',1199,386,'2005-08-26 18:39:04',2,'2006-02-15 21:30:53'),(15950,'2005-08-23 19:09:39',1374,280,'2005-08-31 17:03:39',2,'2006-02-15 21:30:53'),(15951,'2005-08-23 19:10:32',3018,446,'2005-08-29 14:17:32',1,'2006-02-15 21:30:53'),(15952,'2005-08-23 19:11:29',1314,224,'2005-08-28 14:41:29',1,'2006-02-15 21:30:53'),(15953,'2005-08-23 19:13:46',3727,540,'2005-08-28 23:05:46',1,'2006-02-15 21:30:53'),(15954,'2005-08-23 19:14:07',576,460,'2005-08-24 20:21:07',1,'2006-02-15 21:30:53'),(15955,'2005-08-23 19:19:06',2247,349,'2005-08-31 23:34:06',1,'2006-02-15 21:30:53'),(15956,'2005-08-23 19:19:21',2763,354,'2005-08-25 22:15:21',2,'2006-02-15 21:30:53'),(15957,'2005-08-23 19:21:22',74,418,'2005-08-31 16:42:22',1,'2006-02-15 21:30:53'),(15958,'2005-08-23 19:22:36',4164,492,'2005-08-30 01:03:36',1,'2006-02-15 21:30:53'),(15959,'2005-08-23 19:27:04',547,415,'2005-08-24 15:24:04',1,'2006-02-15 21:30:53'),(15960,'2005-08-23 19:35:42',1497,431,'2005-08-26 17:36:42',2,'2006-02-15 21:30:53'),(15961,'2005-08-23 19:35:42',4006,200,'2005-08-30 22:52:42',1,'2006-02-15 21:30:53'),(15962,'2005-08-23 19:42:04',3491,160,'2005-08-25 23:53:04',1,'2006-02-15 21:30:53'),(15963,'2005-08-23 19:42:46',3819,134,'2005-08-25 22:12:46',1,'2006-02-15 21:30:53'),(15964,'2005-08-23 19:45:25',251,141,'2005-08-26 22:43:25',2,'2006-02-15 21:30:53'),(15965,'2005-08-23 19:46:39',3449,509,'2005-08-24 20:08:39',2,'2006-02-15 21:30:53'),(15966,'2006-02-14 15:16:03',4472,374,NULL,1,'2006-02-15 21:30:53'),(15967,'2005-08-23 19:50:06',321,257,'2005-08-29 14:51:06',1,'2006-02-15 21:30:53'),(15968,'2005-08-23 19:51:29',3598,257,'2005-08-24 15:07:29',1,'2006-02-15 21:30:53'),(15969,'2005-08-23 19:51:30',1807,327,'2005-08-31 23:50:30',1,'2006-02-15 21:30:53'),(15970,'2005-08-23 19:54:24',4509,395,'2005-08-24 18:07:24',1,'2006-02-15 21:30:53'),(15971,'2005-08-23 19:59:33',3456,187,'2005-09-02 01:28:33',1,'2006-02-15 21:30:53'),(15972,'2005-08-23 20:00:30',4428,25,'2005-08-30 00:25:30',1,'2006-02-15 21:30:53'),(15973,'2005-08-23 20:04:41',2766,343,'2005-09-01 20:08:41',2,'2006-02-15 21:30:53'),(15974,'2005-08-23 20:06:04',3518,201,'2005-08-27 17:33:04',2,'2006-02-15 21:30:53'),(15975,'2005-08-23 20:06:23',2723,174,'2005-08-27 19:52:23',1,'2006-02-15 21:30:53'),(15976,'2005-08-23 20:07:08',835,227,'2005-08-25 01:47:08',2,'2006-02-15 21:30:53'),(15977,'2005-08-23 20:07:10',1031,550,'2005-09-01 22:12:10',2,'2006-02-15 21:30:53'),(15978,'2005-08-23 20:08:18',4444,536,'2005-08-31 17:35:18',2,'2006-02-15 21:30:53'),(15979,'2005-08-23 20:08:26',3733,536,'2005-08-26 19:19:26',1,'2006-02-15 21:30:53'),(15980,'2005-08-23 20:10:13',3365,196,'2005-08-24 17:44:13',2,'2006-02-15 21:30:53'),(15981,'2005-08-23 20:12:17',2867,489,'2005-08-30 20:43:17',1,'2006-02-15 21:30:53'),(15982,'2005-08-23 20:13:31',2920,370,'2005-09-01 21:51:31',2,'2006-02-15 21:30:53'),(15983,'2005-08-23 20:13:38',3318,464,'2005-08-30 18:42:38',1,'2006-02-15 21:30:53'),(15984,'2005-08-23 20:16:27',2011,495,'2005-08-27 01:43:27',1,'2006-02-15 21:30:53'),(15985,'2005-08-23 20:20:23',2646,179,'2005-08-26 20:55:23',1,'2006-02-15 21:30:53'),(15986,'2005-08-23 20:20:37',3472,226,'2005-08-29 20:49:37',1,'2006-02-15 21:30:53'),(15987,'2005-08-23 20:22:17',3150,302,'2005-08-31 21:46:17',2,'2006-02-15 21:30:53'),(15988,'2005-08-23 20:23:08',3932,400,'2005-08-28 20:50:08',1,'2006-02-15 21:30:53'),(15989,'2005-08-23 20:24:36',38,96,'2005-08-26 20:35:36',1,'2006-02-15 21:30:53'),(15990,'2005-08-23 20:25:11',3233,512,'2005-08-25 15:01:11',2,'2006-02-15 21:30:53'),(15991,'2005-08-23 20:27:34',2078,203,'2005-08-28 16:48:34',2,'2006-02-15 21:30:53'),(15992,'2005-08-23 20:28:32',3334,589,'2005-08-24 21:35:32',1,'2006-02-15 21:30:53'),(15993,'2005-08-23 20:28:44',1638,12,'2005-08-27 16:23:44',2,'2006-02-15 21:30:53'),(15994,'2005-08-23 20:29:10',438,595,'2005-08-28 01:41:10',2,'2006-02-15 21:30:53'),(15995,'2005-08-23 20:29:56',1122,377,'2005-08-30 18:09:56',1,'2006-02-15 21:30:53'),(15996,'2005-08-23 20:31:38',3098,151,'2005-08-29 20:58:38',1,'2006-02-15 21:30:53'),(15997,'2005-08-23 20:40:31',2843,447,'2005-08-26 19:47:31',1,'2006-02-15 21:30:53'),(15998,'2005-08-23 20:41:09',1229,545,'2005-08-27 00:20:09',1,'2006-02-15 21:30:53'),(15999,'2005-08-23 20:44:10',2584,377,'2005-08-31 02:38:10',2,'2006-02-15 21:30:53'),(16000,'2005-08-23 20:44:36',282,71,'2005-08-25 02:29:36',1,'2006-02-15 21:30:53'),(16001,'2005-08-23 20:45:53',245,108,'2005-08-27 15:52:53',1,'2006-02-15 21:30:53'),(16002,'2005-08-23 20:47:12',2770,73,'2005-08-27 23:07:12',1,'2006-02-15 21:30:53'),(16003,'2005-08-23 20:47:28',3413,577,'2005-08-31 23:22:28',1,'2006-02-15 21:30:53'),(16004,'2005-08-23 20:53:20',2223,147,'2005-08-31 15:15:20',2,'2006-02-15 21:30:53'),(16005,'2005-08-23 21:00:22',3265,466,'2005-09-02 02:35:22',1,'2006-02-15 21:30:53'),(16006,'2005-08-23 21:01:09',240,533,'2005-08-25 19:33:09',1,'2006-02-15 21:30:53'),(16007,'2005-08-23 21:02:43',3236,126,'2005-08-30 23:37:43',2,'2006-02-15 21:30:53'),(16008,'2005-08-23 21:04:51',3273,189,'2005-08-31 22:09:51',1,'2006-02-15 21:30:53'),(16009,'2005-08-23 21:07:59',3055,133,'2005-08-29 16:54:59',2,'2006-02-15 21:30:53'),(16010,'2005-08-23 21:10:24',2539,173,'2005-08-25 17:58:24',1,'2006-02-15 21:30:53'),(16011,'2005-08-23 21:11:33',1093,389,'2005-08-31 17:51:33',1,'2006-02-15 21:30:53'),(16012,'2005-08-23 21:13:39',2421,80,'2005-08-30 23:52:39',2,'2006-02-15 21:30:53'),(16013,'2005-08-23 21:17:17',561,462,'2005-08-26 21:15:17',1,'2006-02-15 21:30:53'),(16014,'2005-08-23 21:18:31',3322,532,'2005-08-31 17:28:31',2,'2006-02-15 21:30:53'),(16015,'2005-08-23 21:25:03',3113,50,'2005-08-24 20:05:03',2,'2006-02-15 21:30:53'),(16016,'2005-08-23 21:26:35',3374,595,'2005-08-28 16:06:35',2,'2006-02-15 21:30:53'),(16017,'2005-08-23 21:27:11',664,535,'2005-08-24 23:22:11',1,'2006-02-15 21:30:53'),(16018,'2005-08-23 21:27:35',897,439,'2005-08-30 00:36:35',1,'2006-02-15 21:30:53'),(16019,'2005-08-23 21:30:45',3093,278,'2005-08-27 23:45:45',2,'2006-02-15 21:30:53'),(16020,'2005-08-23 21:34:33',277,311,'2005-09-01 18:17:33',1,'2006-02-15 21:30:53'),(16021,'2005-08-23 21:37:59',3057,314,'2005-08-31 01:52:59',1,'2006-02-15 21:30:53'),(16022,'2005-08-23 21:44:27',2925,504,'2005-08-28 01:52:27',1,'2006-02-15 21:30:53'),(16023,'2005-08-23 21:45:02',2347,124,'2005-08-24 21:28:02',1,'2006-02-15 21:30:53'),(16024,'2005-08-23 21:46:47',2910,473,'2005-08-27 02:06:47',1,'2006-02-15 21:30:53'),(16025,'2005-08-23 21:48:54',1777,569,'2005-08-24 22:05:54',2,'2006-02-15 21:30:53'),(16026,'2005-08-23 21:49:22',467,484,'2005-08-27 00:47:22',1,'2006-02-15 21:30:53'),(16027,'2005-08-23 21:49:33',1724,160,'2005-08-30 16:19:33',2,'2006-02-15 21:30:53'),(16028,'2005-08-23 21:52:56',2515,119,'2005-08-30 18:16:56',2,'2006-02-15 21:30:53'),(16029,'2005-08-23 21:54:02',953,143,'2005-08-29 23:55:02',1,'2006-02-15 21:30:53'),(16030,'2005-08-23 21:56:04',4161,137,'2005-08-31 01:24:04',2,'2006-02-15 21:30:53'),(16031,'2005-08-23 21:59:26',1843,102,'2005-08-29 20:15:26',1,'2006-02-15 21:30:53'),(16032,'2005-08-23 21:59:57',2527,447,'2005-08-31 22:46:57',2,'2006-02-15 21:30:53'),(16033,'2005-08-23 22:06:15',760,226,'2005-09-01 02:36:15',2,'2006-02-15 21:30:53'),(16034,'2005-08-23 22:06:34',655,502,'2005-08-29 18:44:34',1,'2006-02-15 21:30:53'),(16035,'2005-08-23 22:08:04',549,37,'2005-08-28 03:46:04',1,'2006-02-15 21:30:53'),(16036,'2005-08-23 22:12:44',1372,425,'2005-08-25 17:48:44',2,'2006-02-15 21:30:53'),(16037,'2005-08-23 22:13:04',341,45,'2005-09-01 02:48:04',2,'2006-02-15 21:30:53'),(16038,'2005-08-23 22:14:31',2612,172,'2005-08-30 03:28:31',1,'2006-02-15 21:30:53'),(16039,'2005-08-23 22:18:51',545,78,'2005-08-31 19:55:51',2,'2006-02-15 21:30:53'),(16040,'2005-08-23 22:19:33',3524,195,'2005-09-02 02:19:33',2,'2006-02-15 21:30:53'),(16041,'2005-08-23 22:20:26',4116,121,'2005-08-25 20:14:26',2,'2006-02-15 21:30:53'),(16042,'2005-08-23 22:20:40',629,131,'2005-08-24 17:54:40',1,'2006-02-15 21:30:53'),(16043,'2005-08-23 22:21:03',3869,526,'2005-08-31 03:09:03',2,'2006-02-15 21:30:53'),(16044,'2005-08-23 22:24:39',1312,468,'2005-08-25 04:08:39',1,'2006-02-15 21:30:53'),(16045,'2005-08-23 22:25:26',772,14,'2005-08-25 23:54:26',1,'2006-02-15 21:30:53'),(16046,'2005-08-23 22:26:47',4364,74,'2005-08-27 18:02:47',2,'2006-02-15 21:30:53'),(16047,'2005-08-23 22:42:48',2088,114,'2005-08-25 02:48:48',2,'2006-02-15 21:30:53'),(16048,'2005-08-23 22:43:07',2019,103,'2005-08-31 21:33:07',1,'2006-02-15 21:30:53'),(16049,'2005-08-23 22:50:12',2666,393,'2005-08-30 01:01:12',2,'2006-02-15 21:30:53'); +COMMIT; + +-- +-- Trigger to enforce rental_date on INSERT +-- + +CREATE TRIGGER rental_date BEFORE INSERT ON rental FOR EACH ROW SET NEW.rental_date = NOW(); + +-- +-- Dumping data for table staff +-- + +SET AUTOCOMMIT=0; +INSERT INTO staff VALUES (1,'Mike','Hillyer',3,NULL,'Mike.Hillyer@sakilastaff.com',1,1,'Mike','8cb2237d0679ca88db6464eac60da96345513964','2006-02-15 04:57:16'),(2,'Jon','Stephens',4,NULL,'Jon.Stephens@sakilastaff.com',2,1,'Jon','8cb2237d0679ca88db6464eac60da96345513964','2006-02-15 04:57:16'); +COMMIT; + +-- +-- Dumping data for table store +-- + +SET AUTOCOMMIT=0; +INSERT INTO store VALUES (1,1,1,'2006-02-15 04:57:12'),(2,2,2,'2006-02-15 04:57:12'); +COMMIT; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaExtractorTest.cs index f2c4e970bb..0808c17e39 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/SakilaExtractorTest.cs @@ -1,1034 +1,1034 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.02.25 - -using System; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - public class SakilaExtractorTest : Sakila - { - private DbCommand dbCommand; - private DbCommand sqlCommand; - - private Schema schema = null; - - protected struct DbCommandExecutionResult - { - public int FieldCount; - public string[] FieldNames; - public int RowCount; - - public override string ToString() - { - if (FieldNames == null) - FieldNames = new string[0]; - return string.Format("Fields: '{0}'; Rows: {1}", string.Join("', '", FieldNames), RowCount); - } - } - - #region Internals - - private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = SqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteDataReaderResult(dbCommand); - r2 = GetExecuteDataReaderResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - if (r1.FieldCount!=r2.FieldCount) - return false; - for (int i = 0; iDateTime.Now; - select.OrderBy.Add(payment["payment_date"], false); - - sqlCommand.CommandText = Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); - Assert.AreEqual(r.RowCount, 0); - } - - [Test] - public void Test007() - { - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"]); - SqlSelect select = SqlDml.Select(payment); - select.Limit = 10; - select.Columns.Add(SqlDml.Asterisk); - - sqlCommand.CommandText = Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); - Assert.AreEqual(r.RowCount, 10); - } - - [Test] - public void Test008() - { - string nativeSql = @"SELECT - t.city_id, - t.city, - c.country - FROM - city t - INNER JOIN country c ON (t.country_id = c.country_id) - ORDER BY - t.city_id"; - - SqlTableRef city = SqlDml.TableRef(schema.Tables["city"], "t"); - SqlTableRef country = SqlDml.TableRef(schema.Tables["country"], "c"); - - SqlSelect select = SqlDml.Select(city.InnerJoin(country, city["country_id"]==country["country_id"])); - - select.Columns.Add(city["city_id"]); - select.Columns.Add(city["city"]); - select.Columns.Add(country["country"]); - - select.OrderBy.Add(city["city_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test009() - { - string nativeSql = @"SELECT - c.customer_id, - c.first_name, - c.last_name, - c.email, - r.rental_date, - f.title, - f.description, - f.release_year, - r.return_date - FROM - customer c - INNER JOIN rental r ON (c.customer_id = r.customer_id) - INNER JOIN inventory i ON (r.inventory_id = i.inventory_id) - INNER JOIN film f ON (i.film_id = f.film_id)"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "e"); - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - SqlTableRef inventory = SqlDml.TableRef(schema.Tables["inventory"], "i"); - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - - - SqlSelect select = SqlDml.Select(customer.InnerJoin(rental, customer["customer_id"]==rental["customer_id"]) - .InnerJoin(inventory, inventory["inventory_id"]==rental["inventory_id"]) - .InnerJoin(film, film["film_id"]==inventory["film_id"]) - ); - select.Columns.Add(customer["customer_id"]); - select.Columns.Add(customer["first_name"]); - select.Columns.Add(customer["last_name"]); - select.Columns.Add(customer["email"]); - select.Columns.Add(rental["rental_date"]); - select.Columns.Add(film["title"]); - select.Columns.Add(film["description"]); - select.Columns.Add(film["release_year"]); - select.Columns.Add(rental["return_date"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test010() - { - string nativeSql = @"SELECT - p.payment_id, - round(p.amount * 12, 2) Rounded - FROM - payment p - WHERE p.payment_id = 12"; - - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - - SqlSelect select = SqlDml.Select(payment); - select.Columns.Add(payment["payment_id"]); - select.Columns.Add(SqlDml.Round(payment["amount"] * 12, 2), "Rounded"); - select.Where = payment["payment_id"]==12; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test011() - { - string nativeSql = @"SELECT - c.customer_id, - c.first_name, - c.last_name, - SUM(p.amount) AS Total - FROM - customer c - INNER JOIN payment p ON (c.customer_id = p.customer_id) - GROUP BY - c.customer_id, - c.first_name, - c.last_name - ORDER BY c.customer_id"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - - SqlSelect select = SqlDml.Select(customer); - select.Columns.AddRange(customer["customer_id"], customer["first_name"], customer["last_name"]); - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - SqlSelect sumOfPayment = SqlDml.Select(payment); - sumOfPayment.Columns.Add(SqlDml.Sum(payment["amount"])); - sumOfPayment.Where = customer["customer_id"]==payment["customer_id"]; - select.Columns.Add(sumOfPayment, "Total"); - - select.OrderBy.Add(customer["customer_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test012() - { - string nativeSql = @"SELECT - CASE p.staff_id - WHEN 1 THEN 'STAFF_1' - WHEN 2 THEN 'STAFF_2' - ELSE 'STAFF_OTHER' - END AS Staff, - SUM(p.amount) AS Total - FROM - payment p - GROUP BY - p.staff_id"; - - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - - SqlSelect select = SqlDml.Select(payment); - SqlCase totalPayment = SqlDml.Case(payment["staff_id"]); - totalPayment[1] = SqlDml.Literal("STAFF_1"); - totalPayment[2] = SqlDml.Literal("STAFF_2"); - totalPayment.Else = SqlDml.Literal("STAFF_OTHER"); - select.Columns.Add(totalPayment, "Staff"); - - select.Columns.Add(SqlDml.Sum(payment["amount"]), "Total"); - select.GroupBy.AddRange(payment["staff_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test013() - { - string nativeSql = @"SELECT - r.inventory_id, - r.return_date, r.rental_date - FROM - rental r - WHERE - r.return_date IS NOT NULL - ORDER BY - r.inventory_id"; - - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - SqlSelect select = SqlDml.Select(rental); - select.Columns.AddRange(rental["inventory_id"], rental["return_date"], rental["rental_date"]); - - select.Where = SqlDml.IsNotNull(rental["return_date"]); - select.OrderBy.Add(rental["inventory_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014() - { - string nativeSql = @"SELECT - r.inventory_id, - r.return_date, r.rental_date, - DATEDIFF(r.return_date, r.rental_date) Days - FROM - rental r - WHERE - r.return_date IS NOT NULL - ORDER BY - r.inventory_id"; - - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - SqlSelect select = SqlDml.Select(rental); - select.Columns.AddRange(rental["inventory_id"], rental["return_date"], rental["rental_date"]); - select.Columns.Add( - SqlDml.FunctionCall("DATEDIFF", rental["return_date"], rental["rental_date"]), - "Days" - ); - select.Where = SqlDml.IsNotNull(rental["return_date"]); - select.OrderBy.Add(rental["inventory_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test015() - { - string nativeSql = @"SELECT - r.rental_id, - DATEDIFF(CURDATE(), r.rental_date) TimeToToday - FROM - rental r - WHERE - r.return_date IS NOT NULL"; - - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - SqlSelect select = SqlDml.Select(rental); - select.Columns.AddRange(rental["rental_id"]); - select.Columns.Add( - SqlDml.FunctionCall("DATEDIFF", SqlDml.CurrentDate(), rental["rental_date"]), - "TimeToToday" - ); - select.Where = SqlDml.IsNotNull(rental["return_date"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test016() - { - string nativeSql = "SELECT SUM(p.amount) AS sum FROM payment p"; - - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - - SqlSelect select = SqlDml.Select(payment); - select.Columns.Add(SqlDml.Sum(payment["amount"]), "sum"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test017() - { - string nativeSql = "SELECT c.customer_id, CONCAT(c.first_name, CONCAT(', ', c.last_name)) as FullName FROM customer c"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["customer_id"]); - select.Columns.Add(SqlDml.Concat(customer["first_name"], SqlDml.Concat(SqlDml.Literal(", "), customer["last_name"])), - "FullName" - ); - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test018() - { - string nativeSql = @"SELECT - c.customer_id, - c.first_name, - c.last_name, - SUM(p.amount) AS Total - FROM - customer c - INNER JOIN payment p ON (c.customer_id = p.customer_id) - GROUP BY - c.customer_id, - c.first_name, - c.last_name - HAVING SUM(p.amount) > 140"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - - SqlSelect select = SqlDml.Select(customer.InnerJoin(payment, customer["customer_id"]==payment["customer_id"])); - - select.Columns.Add(customer["customer_id"]); - select.Columns.Add(customer["first_name"]); - select.Columns.Add(customer["last_name"]); - select.Columns.Add(SqlDml.Sum(payment["amount"]), "Total"); - - select.GroupBy.Add(customer["customer_id"]); - select.GroupBy.Add(customer["first_name"]); - select.GroupBy.Add(customer["last_name"]); - - select.Having = SqlDml.Sum(payment["amount"])>140; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test019() - { - string nativeSql = @"SELECT - c.customer_id, - c.first_name, - c.last_name - FROM - customer c - WHERE c.customer_id IN (SELECT r.customer_id FROM rental r WHERE r.inventory_id = 239) - GROUP BY c.customer_id, - c.first_name, - c.last_name"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - - SqlSelect innerSelect = SqlDml.Select(rental); - innerSelect.Columns.Add(rental["customer_id"]); - innerSelect.Where = rental["inventory_id"]==239; - - SqlSelect select = SqlDml.Select(customer); - - select.Columns.Add(customer["customer_id"]); - select.Columns.Add(customer["first_name"]); - select.Columns.Add(customer["last_name"]); - - select.Where = SqlDml.In(customer["customer_id"], innerSelect); - - select.GroupBy.Add(customer["customer_id"]); - select.GroupBy.Add(customer["first_name"]); - select.GroupBy.Add(customer["last_name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test020() - { - string nativeSql = @"SELECT - f.film_id, - f.title, - f.description, - f.release_year, - f.rental_rate - FROM - film f - WHERE - f.rental_duration BETWEEN 4 AND 5 - ORDER BY f.film_id"; - - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - SqlSelect select = SqlDml.Select(film); - select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rental_rate"]); - select.Where = SqlDml.Between(film["rental_duration"], 4, 5); - select.OrderBy.Add(film["film_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - - [Test] - public void Test021() - { - string nativeSql = @"SELECT - f.film_id, - f.title, - f.description, - f.release_year, - f.rating - FROM - film f - WHERE - f.rating in ('PG', 'PG-13', 'R') - ORDER BY f.film_id"; - - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - SqlSelect select = SqlDml.Select(film); - select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rating"]); - select.Where = SqlDml.In(film["rating"], SqlDml.Row("PG", "PG-13", "R")); - select.OrderBy.Add(film["film_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test022() - { - string nativeSql = @"SELECT - f.film_id, - f.title, - f.description, - f.release_year, - f.rating - FROM - film f - WHERE - f.rating LIKE 'PG%' - ORDER BY f.film_id"; - - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - SqlSelect select = SqlDml.Select(film); - select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rating"]); - select.Where = SqlDml.Like(film["rating"], "PG%"); - select.OrderBy.Add(film["film_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test023() - { - string nativeSql = @"SELECT - f.film_id, - f.title, - f.description, - f.length - FROM - film f - WHERE - (f.rating = 'PG' OR - f.rating = 'PG-13') AND - f.length < 100 - ORDER BY - f.film_id"; - - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - SqlSelect select = SqlDml.Select(film); - select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["length"]); - select.Where = (film["rating"]=="PG" || film["rating"]=="PG-13") && film["length"]<100; - select.OrderBy.Add(film["film_id"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test024() - { - string nativeSql = @"SELECT YEAR(r.rental_date) as Year, COUNT(*) Rented - FROM rental r - GROUP BY YEAR(r.rental_date)"; - - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - - SqlSelect select = SqlDml.Select(rental); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, rental["rental_date"]), "Year"); - select.Columns.Add(SqlDml.Count(), "Rented"); - - select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, rental["rental_date"])); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test025() - { - string nativeSql = @"SELECT last_name FROM customer - ORDER BY last_name - COLLATE utf8_general_ci ASC"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["last_name"]); - select.OrderBy.Add(SqlDml.Collate(customer["last_name"], schema.CreateCollation("utf8_general_ci"))); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test026() - { - string nativeSql = @"SELECT - p.customer_id, - p.amount - FROM - payment p - WHERE - p.amount = (SELECT MAX(amount) AS LowestPayment FROM payment)"; - - SqlTableRef payment1 = SqlDml.TableRef(schema.Tables["payment"], "p1"); - SqlTableRef payment2 = SqlDml.TableRef(schema.Tables["payment"], "p2"); - - SqlSelect innerSelect = SqlDml.Select(payment2); - innerSelect.Columns.Add(SqlDml.Max(payment2["amount"])); - - SqlSelect select = SqlDml.Select(payment1); - - select.Columns.Add(payment1["customer_id"]); - select.Columns.Add(payment1["amount"]); - - select.Where = SqlDml.Equals(payment1["amount"], innerSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test027() - { - string nativeSql = @"SELECT - c.customer_id, - c.first_name - FROM - customer c - WHERE EXISTS - (SELECT * FROM payment p WHERE p.amount > 11.00 AND p.customer_id = c.customer_id )"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); - - SqlSelect innerSelect = SqlDml.Select(payment); - SqlSelect select = SqlDml.Select(customer); - - innerSelect.Columns.Add(SqlDml.Asterisk); - innerSelect.Where = payment["amount"]>11.00 && payment["customer_id"]==customer["customer_id"]; - - select.Columns.Add(customer["customer_id"]); - select.Columns.Add(customer["first_name"]); - select.Where = SqlDml.Exists(innerSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test028() - { - string nativeSql = @"select * FROM customer c limit 0, 10"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"]); - SqlSelect select = SqlDml.Select(customer); - select.Limit = 10; - select.Offset = 0; - select.Columns.Add(SqlDml.Asterisk); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test029() - { - string nativeSql = "UPDATE film " - + "SET rental_rate = rental_rate * 1.1 " - + "WHERE film_id = 1;"; - - SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); - SqlUpdate update = SqlDml.Update(film); - update.Values[film["rental_rate"]] = film["rental_rate"] * 1.1; - update.Where = film["film_id"]==1; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test030() - { - string nativeSql = @"SELECT - r.rental_id, - DATEDIFF(CURDATE(), r.rental_date) TimeToToday - FROM - rental r - WHERE - r.return_date IS NOT NULL"; - - SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); - SqlSelect select = SqlDml.Select(rental); - select.Columns.AddRange(rental["rental_id"]); - select.Columns.Add( - SqlDml.FunctionCall("DATEDIFF", SqlDml.CurrentDate(), rental["rental_date"]), - "TimeToToday" - ); - select.Where = SqlDml.IsNotNull(rental["return_date"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test150() - { - SqlCreateTable create = SqlDdl.Create(schema.Tables["customer"]); - Console.Write(Compile(create)); - } - - [Test] - public void Test151() - { - SqlDropTable drop = SqlDdl.Drop(schema.Tables["customer"]); - Console.Write(Compile(drop)); - } - - [Test] - public void Test152() - { - SqlDropSchema drop = SqlDdl.Drop(schema); - Console.Write(Compile(drop)); - } - - [Test] - public void Test153() - { - SqlCreateView create = SqlDdl.Create(schema.Views["customer_list"]); - Console.Write(Compile(create)); - } - - [Test] - public void Test154() - { - SqlCreateSchema create = SqlDdl.Create(schema); - Console.Write(Compile(create)); - } - - [Test] - public void Test155() - { - SqlAlterTable alter = - SqlDdl.Alter( - schema.Tables["customer"], - SqlDdl.AddColumn(schema.Tables["customer"].TableColumns["first_name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test156() - { - SqlAlterTable alter = - SqlDdl.Alter( - schema.Tables["customer"], - SqlDdl.DropColumn(schema.Tables["customer"].TableColumns["first_name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test157() - { - var renameColumn = SqlDdl.Rename(schema.Tables["customer"].TableColumns["first_name"], "FirstName"); - - Console.Write(Compile(renameColumn)); - } - - [Test] - public void Test158() - { - var t = schema.Tables["customer"]; - Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["email"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); - - Console.Write(Compile(stmt)); - } - - [Test] - [Ignore("Works")] - public void Test159() - { - var t = Catalog.Schemas["Sakila"].Tables["customer"]; - Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["email"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(uc)); - - Console.Write(Compile(stmt)); - } - - [Test] - public void Test160() - { - var t = schema.Tables["customer"]; - Index index = t.CreateIndex("MegaIndex195"); - index.CreateIndexColumn(t.TableColumns[0]); - SqlCreateIndex create = SqlDdl.Create(index); - - Console.Write(Compile(create)); - } - - [Test] - public void Test161() - { - var t = schema.Tables["customer"]; - Index index = t.CreateIndex("MegaIndex196"); - index.CreateIndexColumn(t.TableColumns[0]); - SqlDropIndex drop = SqlDdl.Drop(index); - - Console.Write(Compile(drop)); - } - - - [Test] - public void Test200() - { - string nativeSql = - @"SELECT - c.customer_id, - c.store_id, - c.first_name, - c.last_name, - c.email - FROM - customer c - USE INDEX(idx_last_name) - WHERE c.last_name > 'JOHNSON'"; - - SqlTableRef c = SqlDml.TableRef(schema.Tables["customer"]); - SqlSelect select = SqlDml.Select(c); - select.Columns.AddRange(c["customer_id"], c["store_id"], c["first_name"], c["last_name"], c["email"]); - select.Where = c["last_name"]>"JOHNSON"; - - select.Hints.Add(SqlDml.NativeHint("idx_last_name")); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test201() - { - string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; - - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(); - SqlSelect s3 = SqlDml.Select(); - SqlSelect s4 = SqlDml.Select(); - SqlSelect select; - s1.Columns.Add(1, "f"); - s2.Columns.Add(2); - s3.Columns.Add(3); - s4.Columns.Add(4); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); - select = SqlDml.Select(qr); - select.Columns.Add(qr["f"]); - - Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select))); - } - - [Test] - [Ignore("ALTER Sequences are not supported")] - public void Test177() - { - Sequence s = schema.CreateSequence("Generator177"); - SqlDropSequence drop = SqlDdl.Drop(s); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test165() - { - var t = schema.Tables["table1"]; - var uc = t.CreatePrimaryKey(string.Empty, t.TableColumns["field1"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); - - Console.Write(Compile(stmt)); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.02.25 + +using System; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + public class SakilaExtractorTest : Sakila + { + private DbCommand dbCommand; + private DbCommand sqlCommand; + + private Schema schema = null; + + protected struct DbCommandExecutionResult + { + public int FieldCount; + public string[] FieldNames; + public int RowCount; + + public override string ToString() + { + if (FieldNames == null) + FieldNames = new string[0]; + return string.Format("Fields: '{0}'; Rows: {1}", string.Join("', '", FieldNames), RowCount); + } + } + + #region Internals + + private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = SqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteDataReaderResult(dbCommand); + r2 = GetExecuteDataReaderResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + if (r1.FieldCount!=r2.FieldCount) + return false; + for (int i = 0; iDateTime.Now; + select.OrderBy.Add(payment["payment_date"], false); + + sqlCommand.CommandText = Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); + Assert.AreEqual(r.RowCount, 0); + } + + [Test] + public void Test007() + { + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"]); + SqlSelect select = SqlDml.Select(payment); + select.Limit = 10; + select.Columns.Add(SqlDml.Asterisk); + + sqlCommand.CommandText = Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); + Assert.AreEqual(r.RowCount, 10); + } + + [Test] + public void Test008() + { + string nativeSql = @"SELECT + t.city_id, + t.city, + c.country + FROM + city t + INNER JOIN country c ON (t.country_id = c.country_id) + ORDER BY + t.city_id"; + + SqlTableRef city = SqlDml.TableRef(schema.Tables["city"], "t"); + SqlTableRef country = SqlDml.TableRef(schema.Tables["country"], "c"); + + SqlSelect select = SqlDml.Select(city.InnerJoin(country, city["country_id"]==country["country_id"])); + + select.Columns.Add(city["city_id"]); + select.Columns.Add(city["city"]); + select.Columns.Add(country["country"]); + + select.OrderBy.Add(city["city_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test009() + { + string nativeSql = @"SELECT + c.customer_id, + c.first_name, + c.last_name, + c.email, + r.rental_date, + f.title, + f.description, + f.release_year, + r.return_date + FROM + customer c + INNER JOIN rental r ON (c.customer_id = r.customer_id) + INNER JOIN inventory i ON (r.inventory_id = i.inventory_id) + INNER JOIN film f ON (i.film_id = f.film_id)"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "e"); + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + SqlTableRef inventory = SqlDml.TableRef(schema.Tables["inventory"], "i"); + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + + + SqlSelect select = SqlDml.Select(customer.InnerJoin(rental, customer["customer_id"]==rental["customer_id"]) + .InnerJoin(inventory, inventory["inventory_id"]==rental["inventory_id"]) + .InnerJoin(film, film["film_id"]==inventory["film_id"]) + ); + select.Columns.Add(customer["customer_id"]); + select.Columns.Add(customer["first_name"]); + select.Columns.Add(customer["last_name"]); + select.Columns.Add(customer["email"]); + select.Columns.Add(rental["rental_date"]); + select.Columns.Add(film["title"]); + select.Columns.Add(film["description"]); + select.Columns.Add(film["release_year"]); + select.Columns.Add(rental["return_date"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test010() + { + string nativeSql = @"SELECT + p.payment_id, + round(p.amount * 12, 2) Rounded + FROM + payment p + WHERE p.payment_id = 12"; + + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + + SqlSelect select = SqlDml.Select(payment); + select.Columns.Add(payment["payment_id"]); + select.Columns.Add(SqlDml.Round(payment["amount"] * 12, 2), "Rounded"); + select.Where = payment["payment_id"]==12; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test011() + { + string nativeSql = @"SELECT + c.customer_id, + c.first_name, + c.last_name, + SUM(p.amount) AS Total + FROM + customer c + INNER JOIN payment p ON (c.customer_id = p.customer_id) + GROUP BY + c.customer_id, + c.first_name, + c.last_name + ORDER BY c.customer_id"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + + SqlSelect select = SqlDml.Select(customer); + select.Columns.AddRange(customer["customer_id"], customer["first_name"], customer["last_name"]); + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + SqlSelect sumOfPayment = SqlDml.Select(payment); + sumOfPayment.Columns.Add(SqlDml.Sum(payment["amount"])); + sumOfPayment.Where = customer["customer_id"]==payment["customer_id"]; + select.Columns.Add(sumOfPayment, "Total"); + + select.OrderBy.Add(customer["customer_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test012() + { + string nativeSql = @"SELECT + CASE p.staff_id + WHEN 1 THEN 'STAFF_1' + WHEN 2 THEN 'STAFF_2' + ELSE 'STAFF_OTHER' + END AS Staff, + SUM(p.amount) AS Total + FROM + payment p + GROUP BY + p.staff_id"; + + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + + SqlSelect select = SqlDml.Select(payment); + SqlCase totalPayment = SqlDml.Case(payment["staff_id"]); + totalPayment[1] = SqlDml.Literal("STAFF_1"); + totalPayment[2] = SqlDml.Literal("STAFF_2"); + totalPayment.Else = SqlDml.Literal("STAFF_OTHER"); + select.Columns.Add(totalPayment, "Staff"); + + select.Columns.Add(SqlDml.Sum(payment["amount"]), "Total"); + select.GroupBy.AddRange(payment["staff_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test013() + { + string nativeSql = @"SELECT + r.inventory_id, + r.return_date, r.rental_date + FROM + rental r + WHERE + r.return_date IS NOT NULL + ORDER BY + r.inventory_id"; + + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + SqlSelect select = SqlDml.Select(rental); + select.Columns.AddRange(rental["inventory_id"], rental["return_date"], rental["rental_date"]); + + select.Where = SqlDml.IsNotNull(rental["return_date"]); + select.OrderBy.Add(rental["inventory_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014() + { + string nativeSql = @"SELECT + r.inventory_id, + r.return_date, r.rental_date, + DATEDIFF(r.return_date, r.rental_date) Days + FROM + rental r + WHERE + r.return_date IS NOT NULL + ORDER BY + r.inventory_id"; + + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + SqlSelect select = SqlDml.Select(rental); + select.Columns.AddRange(rental["inventory_id"], rental["return_date"], rental["rental_date"]); + select.Columns.Add( + SqlDml.FunctionCall("DATEDIFF", rental["return_date"], rental["rental_date"]), + "Days" + ); + select.Where = SqlDml.IsNotNull(rental["return_date"]); + select.OrderBy.Add(rental["inventory_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test015() + { + string nativeSql = @"SELECT + r.rental_id, + DATEDIFF(CURDATE(), r.rental_date) TimeToToday + FROM + rental r + WHERE + r.return_date IS NOT NULL"; + + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + SqlSelect select = SqlDml.Select(rental); + select.Columns.AddRange(rental["rental_id"]); + select.Columns.Add( + SqlDml.FunctionCall("DATEDIFF", SqlDml.CurrentDate(), rental["rental_date"]), + "TimeToToday" + ); + select.Where = SqlDml.IsNotNull(rental["return_date"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test016() + { + string nativeSql = "SELECT SUM(p.amount) AS sum FROM payment p"; + + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + + SqlSelect select = SqlDml.Select(payment); + select.Columns.Add(SqlDml.Sum(payment["amount"]), "sum"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test017() + { + string nativeSql = "SELECT c.customer_id, CONCAT(c.first_name, CONCAT(', ', c.last_name)) as FullName FROM customer c"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["customer_id"]); + select.Columns.Add(SqlDml.Concat(customer["first_name"], SqlDml.Concat(SqlDml.Literal(", "), customer["last_name"])), + "FullName" + ); + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test018() + { + string nativeSql = @"SELECT + c.customer_id, + c.first_name, + c.last_name, + SUM(p.amount) AS Total + FROM + customer c + INNER JOIN payment p ON (c.customer_id = p.customer_id) + GROUP BY + c.customer_id, + c.first_name, + c.last_name + HAVING SUM(p.amount) > 140"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + + SqlSelect select = SqlDml.Select(customer.InnerJoin(payment, customer["customer_id"]==payment["customer_id"])); + + select.Columns.Add(customer["customer_id"]); + select.Columns.Add(customer["first_name"]); + select.Columns.Add(customer["last_name"]); + select.Columns.Add(SqlDml.Sum(payment["amount"]), "Total"); + + select.GroupBy.Add(customer["customer_id"]); + select.GroupBy.Add(customer["first_name"]); + select.GroupBy.Add(customer["last_name"]); + + select.Having = SqlDml.Sum(payment["amount"])>140; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test019() + { + string nativeSql = @"SELECT + c.customer_id, + c.first_name, + c.last_name + FROM + customer c + WHERE c.customer_id IN (SELECT r.customer_id FROM rental r WHERE r.inventory_id = 239) + GROUP BY c.customer_id, + c.first_name, + c.last_name"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + + SqlSelect innerSelect = SqlDml.Select(rental); + innerSelect.Columns.Add(rental["customer_id"]); + innerSelect.Where = rental["inventory_id"]==239; + + SqlSelect select = SqlDml.Select(customer); + + select.Columns.Add(customer["customer_id"]); + select.Columns.Add(customer["first_name"]); + select.Columns.Add(customer["last_name"]); + + select.Where = SqlDml.In(customer["customer_id"], innerSelect); + + select.GroupBy.Add(customer["customer_id"]); + select.GroupBy.Add(customer["first_name"]); + select.GroupBy.Add(customer["last_name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test020() + { + string nativeSql = @"SELECT + f.film_id, + f.title, + f.description, + f.release_year, + f.rental_rate + FROM + film f + WHERE + f.rental_duration BETWEEN 4 AND 5 + ORDER BY f.film_id"; + + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + SqlSelect select = SqlDml.Select(film); + select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rental_rate"]); + select.Where = SqlDml.Between(film["rental_duration"], 4, 5); + select.OrderBy.Add(film["film_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + + [Test] + public void Test021() + { + string nativeSql = @"SELECT + f.film_id, + f.title, + f.description, + f.release_year, + f.rating + FROM + film f + WHERE + f.rating in ('PG', 'PG-13', 'R') + ORDER BY f.film_id"; + + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + SqlSelect select = SqlDml.Select(film); + select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rating"]); + select.Where = SqlDml.In(film["rating"], SqlDml.Row("PG", "PG-13", "R")); + select.OrderBy.Add(film["film_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test022() + { + string nativeSql = @"SELECT + f.film_id, + f.title, + f.description, + f.release_year, + f.rating + FROM + film f + WHERE + f.rating LIKE 'PG%' + ORDER BY f.film_id"; + + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + SqlSelect select = SqlDml.Select(film); + select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["release_year"], film["rating"]); + select.Where = SqlDml.Like(film["rating"], "PG%"); + select.OrderBy.Add(film["film_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test023() + { + string nativeSql = @"SELECT + f.film_id, + f.title, + f.description, + f.length + FROM + film f + WHERE + (f.rating = 'PG' OR + f.rating = 'PG-13') AND + f.length < 100 + ORDER BY + f.film_id"; + + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + SqlSelect select = SqlDml.Select(film); + select.Columns.AddRange(film["film_id"], film["title"], film["description"], film["length"]); + select.Where = (film["rating"]=="PG" || film["rating"]=="PG-13") && film["length"]<100; + select.OrderBy.Add(film["film_id"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test024() + { + string nativeSql = @"SELECT YEAR(r.rental_date) as Year, COUNT(*) Rented + FROM rental r + GROUP BY YEAR(r.rental_date)"; + + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + + SqlSelect select = SqlDml.Select(rental); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, rental["rental_date"]), "Year"); + select.Columns.Add(SqlDml.Count(), "Rented"); + + select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, rental["rental_date"])); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test025() + { + string nativeSql = @"SELECT last_name FROM customer + ORDER BY last_name + COLLATE utf8_general_ci ASC"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["last_name"]); + select.OrderBy.Add(SqlDml.Collate(customer["last_name"], schema.CreateCollation("utf8_general_ci"))); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test026() + { + string nativeSql = @"SELECT + p.customer_id, + p.amount + FROM + payment p + WHERE + p.amount = (SELECT MAX(amount) AS LowestPayment FROM payment)"; + + SqlTableRef payment1 = SqlDml.TableRef(schema.Tables["payment"], "p1"); + SqlTableRef payment2 = SqlDml.TableRef(schema.Tables["payment"], "p2"); + + SqlSelect innerSelect = SqlDml.Select(payment2); + innerSelect.Columns.Add(SqlDml.Max(payment2["amount"])); + + SqlSelect select = SqlDml.Select(payment1); + + select.Columns.Add(payment1["customer_id"]); + select.Columns.Add(payment1["amount"]); + + select.Where = SqlDml.Equals(payment1["amount"], innerSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test027() + { + string nativeSql = @"SELECT + c.customer_id, + c.first_name + FROM + customer c + WHERE EXISTS + (SELECT * FROM payment p WHERE p.amount > 11.00 AND p.customer_id = c.customer_id )"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef payment = SqlDml.TableRef(schema.Tables["payment"], "p"); + + SqlSelect innerSelect = SqlDml.Select(payment); + SqlSelect select = SqlDml.Select(customer); + + innerSelect.Columns.Add(SqlDml.Asterisk); + innerSelect.Where = payment["amount"]>11.00 && payment["customer_id"]==customer["customer_id"]; + + select.Columns.Add(customer["customer_id"]); + select.Columns.Add(customer["first_name"]); + select.Where = SqlDml.Exists(innerSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test028() + { + string nativeSql = @"select * FROM customer c limit 0, 10"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"]); + SqlSelect select = SqlDml.Select(customer); + select.Limit = 10; + select.Offset = 0; + select.Columns.Add(SqlDml.Asterisk); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test029() + { + string nativeSql = "UPDATE film " + + "SET rental_rate = rental_rate * 1.1 " + + "WHERE film_id = 1;"; + + SqlTableRef film = SqlDml.TableRef(schema.Tables["film"], "f"); + SqlUpdate update = SqlDml.Update(film); + update.Values[film["rental_rate"]] = film["rental_rate"] * 1.1; + update.Where = film["film_id"]==1; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test030() + { + string nativeSql = @"SELECT + r.rental_id, + DATEDIFF(CURDATE(), r.rental_date) TimeToToday + FROM + rental r + WHERE + r.return_date IS NOT NULL"; + + SqlTableRef rental = SqlDml.TableRef(schema.Tables["rental"], "r"); + SqlSelect select = SqlDml.Select(rental); + select.Columns.AddRange(rental["rental_id"]); + select.Columns.Add( + SqlDml.FunctionCall("DATEDIFF", SqlDml.CurrentDate(), rental["rental_date"]), + "TimeToToday" + ); + select.Where = SqlDml.IsNotNull(rental["return_date"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test150() + { + SqlCreateTable create = SqlDdl.Create(schema.Tables["customer"]); + Console.Write(Compile(create)); + } + + [Test] + public void Test151() + { + SqlDropTable drop = SqlDdl.Drop(schema.Tables["customer"]); + Console.Write(Compile(drop)); + } + + [Test] + public void Test152() + { + SqlDropSchema drop = SqlDdl.Drop(schema); + Console.Write(Compile(drop)); + } + + [Test] + public void Test153() + { + SqlCreateView create = SqlDdl.Create(schema.Views["customer_list"]); + Console.Write(Compile(create)); + } + + [Test] + public void Test154() + { + SqlCreateSchema create = SqlDdl.Create(schema); + Console.Write(Compile(create)); + } + + [Test] + public void Test155() + { + SqlAlterTable alter = + SqlDdl.Alter( + schema.Tables["customer"], + SqlDdl.AddColumn(schema.Tables["customer"].TableColumns["first_name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test156() + { + SqlAlterTable alter = + SqlDdl.Alter( + schema.Tables["customer"], + SqlDdl.DropColumn(schema.Tables["customer"].TableColumns["first_name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test157() + { + var renameColumn = SqlDdl.Rename(schema.Tables["customer"].TableColumns["first_name"], "FirstName"); + + Console.Write(Compile(renameColumn)); + } + + [Test] + public void Test158() + { + var t = schema.Tables["customer"]; + Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["email"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); + + Console.Write(Compile(stmt)); + } + + [Test] + [Ignore("Works")] + public void Test159() + { + var t = Catalog.Schemas["Sakila"].Tables["customer"]; + Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["email"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(uc)); + + Console.Write(Compile(stmt)); + } + + [Test] + public void Test160() + { + var t = schema.Tables["customer"]; + Index index = t.CreateIndex("MegaIndex195"); + index.CreateIndexColumn(t.TableColumns[0]); + SqlCreateIndex create = SqlDdl.Create(index); + + Console.Write(Compile(create)); + } + + [Test] + public void Test161() + { + var t = schema.Tables["customer"]; + Index index = t.CreateIndex("MegaIndex196"); + index.CreateIndexColumn(t.TableColumns[0]); + SqlDropIndex drop = SqlDdl.Drop(index); + + Console.Write(Compile(drop)); + } + + + [Test] + public void Test200() + { + string nativeSql = + @"SELECT + c.customer_id, + c.store_id, + c.first_name, + c.last_name, + c.email + FROM + customer c + USE INDEX(idx_last_name) + WHERE c.last_name > 'JOHNSON'"; + + SqlTableRef c = SqlDml.TableRef(schema.Tables["customer"]); + SqlSelect select = SqlDml.Select(c); + select.Columns.AddRange(c["customer_id"], c["store_id"], c["first_name"], c["last_name"], c["email"]); + select.Where = c["last_name"]>"JOHNSON"; + + select.Hints.Add(SqlDml.NativeHint("idx_last_name")); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test201() + { + string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; + + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(); + SqlSelect s3 = SqlDml.Select(); + SqlSelect s4 = SqlDml.Select(); + SqlSelect select; + s1.Columns.Add(1, "f"); + s2.Columns.Add(2); + s3.Columns.Add(3); + s4.Columns.Add(4); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); + select = SqlDml.Select(qr); + select.Columns.Add(qr["f"]); + + Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select))); + } + + [Test] + [Ignore("ALTER Sequences are not supported")] + public void Test177() + { + Sequence s = schema.CreateSequence("Generator177"); + SqlDropSequence drop = SqlDdl.Drop(s); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test165() + { + var t = schema.Tables["table1"]; + var uc = t.CreatePrimaryKey(string.Empty, t.TableColumns["field1"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); + + Console.Write(Compile(stmt)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/MySQL/TypeMappingTests.cs b/Orm/Xtensive.Orm.Tests.Sql/MySQL/TypeMappingTests.cs index 5e010aa12b..41792b23ae 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/MySQL/TypeMappingTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/MySQL/TypeMappingTests.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.23 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Tests.Sql; - -namespace Xtensive.Orm.Tests.Sql.MySQL -{ - [TestFixture, Explicit] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.23 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Tests.Sql; + +namespace Xtensive.Orm.Tests.Sql.MySQL +{ + [TestFixture, Explicit] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeIntervalTest.cs index c04c8b657d..9b9a2ab415 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeIntervalTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.23 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.23 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeOffsetTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeOffsetTest.cs index bd9cff0ae9..a417569cbe 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeOffsetTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/DateTimeOffsetTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.01.10 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class DateTimeOffsetTest : Sql.DateTimeOffsetTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.01.10 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class DateTimeOffsetTest : Sql.DateTimeOffsetTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExceptionTypesTest.cs index e64dae9d5f..b763ee6843 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExceptionTypesTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.27 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class ExceptionTypesTest : Sql.ExceptionTypesTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.27 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class ExceptionTypesTest : Sql.ExceptionTypesTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExtractorTest.cs index 42b22970c8..7fce21bdd4 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/ExtractorTest.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.29 - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class ExtractorTest : SqlTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - - [Test] - public void BaseTest() - { - var schema = ExtractDefaultSchema(); - } - - [Test] - public void TimeStampBasedTypes() - { - var dropTable = "DROP TABLE TableWithTimeStamps PURGE"; - try { - var dropTableCommand = Connection.CreateCommand(dropTable); - dropTableCommand.ExecuteNonQuery(); - } - catch { - - } - - var createTable = "CREATE TABLE TableWithTimeStamps" + - "( Id NUMBER (6)," + - ", DateTime TIMESTAMP" + - ", DateTimeOffset TIMESTAMP WITH TIME ZONE)"; - var command = Connection.CreateCommand(createTable); - command.ExecuteNonQuery(); - var schema = ExtractDefaultSchema(); - var table = schema.Tables["TableWithTimeStamps"]; - Assert.That(table, Is.Not.Null); - Assert.That(table.Columns.Count, Is.EqualTo(3)); - - var dateTimeColumn = table.TableColumns["DateTime"]; - Assert.That(dateTimeColumn, Is.Not.Null); - Assert.That(dateTimeColumn.DataType.Type, Is.EqualTo(SqlType.DateTime)); - - var dateTimeOffsetColumn = table.TableColumns["DateTimeOffset"]; - Assert.That(dateTimeOffsetColumn, Is.Not.Null); - Assert.That(dateTimeColumn.DataType.Type, Is.EqualTo(SqlType.DateTimeOffset)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.29 + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class ExtractorTest : SqlTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + + [Test] + public void BaseTest() + { + var schema = ExtractDefaultSchema(); + } + + [Test] + public void TimeStampBasedTypes() + { + var dropTable = "DROP TABLE TableWithTimeStamps PURGE"; + try { + var dropTableCommand = Connection.CreateCommand(dropTable); + dropTableCommand.ExecuteNonQuery(); + } + catch { + + } + + var createTable = "CREATE TABLE TableWithTimeStamps" + + "( Id NUMBER (6)," + + ", DateTime TIMESTAMP" + + ", DateTimeOffset TIMESTAMP WITH TIME ZONE)"; + var command = Connection.CreateCommand(createTable); + command.ExecuteNonQuery(); + var schema = ExtractDefaultSchema(); + var table = schema.Tables["TableWithTimeStamps"]; + Assert.That(table, Is.Not.Null); + Assert.That(table.Columns.Count, Is.EqualTo(3)); + + var dateTimeColumn = table.TableColumns["DateTime"]; + Assert.That(dateTimeColumn, Is.Not.Null); + Assert.That(dateTimeColumn.DataType.Type, Is.EqualTo(SqlType.DateTime)); + + var dateTimeOffsetColumn = table.TableColumns["DateTimeOffset"]; + Assert.That(dateTimeOffsetColumn, Is.Not.Null); + Assert.That(dateTimeColumn.DataType.Type, Is.EqualTo(SqlType.DateTimeOffset)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/SavepointsTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/SavepointsTest.cs index e58030deab..9b8fd98649 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/SavepointsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/SavepointsTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.20 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class SavepointsTest : Sql.SavepointsTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.20 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class SavepointsTest : Sql.SavepointsTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/TypeMappingTest.cs index 9be2828303..907afe70c6 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/TypeMappingTest.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.31 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckEquality(object expected, object actual) - { - var arrayValue = expected as byte[]; - var stringValue = expected as string; - var charValue = expected as char?; - - bool nullExpected = - arrayValue!=null && arrayValue.Length==0 || - stringValue!=null && stringValue.Length==0 || - charValue!=null && charValue==default(char); - - if (nullExpected) - Assert.IsNull(actual); - else - base.CheckEquality(expected, actual); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.31 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckEquality(object expected, object actual) + { + var arrayValue = expected as byte[]; + var stringValue = expected as string; + var charValue = expected as char?; + + bool nullExpected = + arrayValue!=null && arrayValue.Length==0 || + stringValue!=null && stringValue.Length==0 || + charValue!=null && charValue==default(char); + + if (nullExpected) + Assert.IsNull(actual); + else + base.CheckEquality(expected, actual); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Oracle/UberTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Oracle/UberTest.cs index e5d08c7a80..340b53b6d9 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Oracle/UberTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Oracle/UberTest.cs @@ -1,175 +1,175 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Oracle -{ - [TestFixture, Explicit] - public class UberTest : SqlTest - { - private const string BatchTestTable = "batch_test"; - private const string LobTestTable = "lob_test"; - - private int nextId; - - private Schema testSchema; - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - testSchema = ExtractDefaultSchema(); - EnsureTableNotExists(testSchema, BatchTestTable); - EnsureTableNotExists(testSchema, LobTestTable); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - } - - [Test] - public void MultipleResultsTest() - { - var select1 = SqlDml.Select(SqlDml.Literal("1")); - var select2 = SqlDml.Select(SqlDml.Literal("2")); - var query = string.Format( - "begin open :p1 for {0}; open :p2 for {1}; end;", - Driver.Compile(select1).GetCommandText(), - Driver.Compile(select2).GetCommandText()); - using (var command = Connection.CreateCommand()) { - var p1 = Connection.CreateCursorParameter(); - p1.ParameterName = "p1"; - command.Parameters.Add(p1); - var p2 = Connection.CreateCursorParameter(); - p2.ParameterName = "p2"; - command.Parameters.Add(p2); - command.CommandText = query; - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - Assert.AreEqual(reader.GetValue(0), "1"); - Assert.IsFalse(reader.Read()); - Assert.IsTrue(reader.NextResult()); - Assert.IsTrue(reader.Read()); - Assert.AreEqual(reader.GetValue(0), "2"); - Assert.IsFalse(reader.Read()); - Assert.IsFalse(reader.NextResult()); - } - } - } - - [Test] - public void BatchTest() - { - var table = testSchema.CreateTable(BatchTestTable); - CreateIdColumn(table); - ExecuteNonQuery(SqlDdl.Create(table)); - var tableRef = SqlDml.TableRef(table); - - var singleStatementBatch = SqlDml.Batch(); - singleStatementBatch.Add(CreateInsert(tableRef)); - ExecuteNonQuery(singleStatementBatch); - - var multiStatementBatch = SqlDml.Batch(); - multiStatementBatch.Add(CreateInsert(tableRef)); - multiStatementBatch.Add(CreateInsert(tableRef)); - ExecuteNonQuery(multiStatementBatch); - - var innerEmptyBatch = SqlDml.Batch(); - var innerSingleStatementBatch = SqlDml.Batch(); - innerSingleStatementBatch.Add(CreateInsert(tableRef)); - var innerMultiStatementBatch = SqlDml.Batch(); - innerMultiStatementBatch.Add(CreateInsert(tableRef)); - var outerBatch = SqlDml.Batch(); - outerBatch.Add(innerEmptyBatch); - outerBatch.Add(innerSingleStatementBatch); - outerBatch.Add(multiStatementBatch); - ExecuteNonQuery(outerBatch); - - var countQuery = SqlDml.Select(tableRef); - countQuery.Columns.Add(SqlDml.Count()); - Assert.AreEqual(6, Convert.ToInt32(ExecuteScalar(countQuery))); - } - - [Test] - public void LobTest() - { - var table = testSchema.CreateTable(LobTestTable); - CreateIdColumn(table); - table.CreateColumn("bin_lob", new SqlValueType(SqlType.VarBinaryMax)).IsNullable = true; - table.CreateColumn("char_lob", new SqlValueType(SqlType.VarCharMax)).IsNullable = true; - ExecuteNonQuery(SqlDdl.Create(table)); - - var tableRef = SqlDml.TableRef(table); - var insert = CreateInsert(tableRef); - insert.Values.Add(tableRef["bin_lob"], SqlDml.ParameterRef("p_bin")); - insert.Values.Add(tableRef["char_lob"], SqlDml.ParameterRef("p_char")); - - var charBuffer = Enumerable.Range(0, 10000) - .Select(i => (char) (i % (char.MaxValue - 1) + 1)) - .ToArray(); - var binBuffer = Enumerable.Range(0, 10000) - .Select(i => (byte) (i % byte.MaxValue)) - .ToArray(); - - using (var binLob = Connection.CreateBinaryLargeObject()) - using (var charLob = Connection.CreateCharacterLargeObject()) - using (var command = Connection.CreateCommand(insert)) { - var binParameter = command.CreateParameter(); - binParameter.ParameterName = "p_bin"; - binLob.Write(binBuffer, 0, binBuffer.Length); - binLob.BindTo(binParameter); - var charParameter = command.CreateParameter(); - charParameter.ParameterName = "p_char"; - charLob.Write(charBuffer, 0, charBuffer.Length); - charLob.BindTo(charParameter); - command.Parameters.Add(charParameter); - command.Parameters.Add(binParameter); - command.ExecuteNonQuery(); - } - - var select = SqlDml.Select(tableRef); - select.Columns.Add(tableRef["bin_lob"]); - select.Columns.Add(tableRef["char_lob"]); - select.Where = SqlDml.Native("rownum")==1; - using (var comand = Connection.CreateCommand(select)) - using (var reader = comand.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - Compare(binBuffer, (byte[]) reader[0]); - Compare(charBuffer, ((string) reader[1]).ToCharArray()); - } - } - - private void CreateIdColumn(Table table) - { - table.CreateColumn("id", new SqlValueType(SqlType.Decimal, 10, 0)); - } - - private void Compare(T[] expected, T[] actual) - { - if ((expected!=null)!=(actual!=null)) - Assert.Fail("expected: {0}; actual {1}", expected, actual); - if (expected==null) - return; - if (expected.Length!=actual.Length) - Assert.Fail("expected length: {0}; actual length {1}", expected.Length, actual.Length); - for (int i = 0; i < expected.Length; i++) - Assert.AreEqual(expected[i], actual[i]); - } - - private SqlInsert CreateInsert(SqlTableRef tableRef) - { - var insert = SqlDml.Insert(tableRef); - insert.Values.Add(tableRef["id"], nextId++); - return insert; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Oracle +{ + [TestFixture, Explicit] + public class UberTest : SqlTest + { + private const string BatchTestTable = "batch_test"; + private const string LobTestTable = "lob_test"; + + private int nextId; + + private Schema testSchema; + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + testSchema = ExtractDefaultSchema(); + EnsureTableNotExists(testSchema, BatchTestTable); + EnsureTableNotExists(testSchema, LobTestTable); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + } + + [Test] + public void MultipleResultsTest() + { + var select1 = SqlDml.Select(SqlDml.Literal("1")); + var select2 = SqlDml.Select(SqlDml.Literal("2")); + var query = string.Format( + "begin open :p1 for {0}; open :p2 for {1}; end;", + Driver.Compile(select1).GetCommandText(), + Driver.Compile(select2).GetCommandText()); + using (var command = Connection.CreateCommand()) { + var p1 = Connection.CreateCursorParameter(); + p1.ParameterName = "p1"; + command.Parameters.Add(p1); + var p2 = Connection.CreateCursorParameter(); + p2.ParameterName = "p2"; + command.Parameters.Add(p2); + command.CommandText = query; + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + Assert.AreEqual(reader.GetValue(0), "1"); + Assert.IsFalse(reader.Read()); + Assert.IsTrue(reader.NextResult()); + Assert.IsTrue(reader.Read()); + Assert.AreEqual(reader.GetValue(0), "2"); + Assert.IsFalse(reader.Read()); + Assert.IsFalse(reader.NextResult()); + } + } + } + + [Test] + public void BatchTest() + { + var table = testSchema.CreateTable(BatchTestTable); + CreateIdColumn(table); + ExecuteNonQuery(SqlDdl.Create(table)); + var tableRef = SqlDml.TableRef(table); + + var singleStatementBatch = SqlDml.Batch(); + singleStatementBatch.Add(CreateInsert(tableRef)); + ExecuteNonQuery(singleStatementBatch); + + var multiStatementBatch = SqlDml.Batch(); + multiStatementBatch.Add(CreateInsert(tableRef)); + multiStatementBatch.Add(CreateInsert(tableRef)); + ExecuteNonQuery(multiStatementBatch); + + var innerEmptyBatch = SqlDml.Batch(); + var innerSingleStatementBatch = SqlDml.Batch(); + innerSingleStatementBatch.Add(CreateInsert(tableRef)); + var innerMultiStatementBatch = SqlDml.Batch(); + innerMultiStatementBatch.Add(CreateInsert(tableRef)); + var outerBatch = SqlDml.Batch(); + outerBatch.Add(innerEmptyBatch); + outerBatch.Add(innerSingleStatementBatch); + outerBatch.Add(multiStatementBatch); + ExecuteNonQuery(outerBatch); + + var countQuery = SqlDml.Select(tableRef); + countQuery.Columns.Add(SqlDml.Count()); + Assert.AreEqual(6, Convert.ToInt32(ExecuteScalar(countQuery))); + } + + [Test] + public void LobTest() + { + var table = testSchema.CreateTable(LobTestTable); + CreateIdColumn(table); + table.CreateColumn("bin_lob", new SqlValueType(SqlType.VarBinaryMax)).IsNullable = true; + table.CreateColumn("char_lob", new SqlValueType(SqlType.VarCharMax)).IsNullable = true; + ExecuteNonQuery(SqlDdl.Create(table)); + + var tableRef = SqlDml.TableRef(table); + var insert = CreateInsert(tableRef); + insert.Values.Add(tableRef["bin_lob"], SqlDml.ParameterRef("p_bin")); + insert.Values.Add(tableRef["char_lob"], SqlDml.ParameterRef("p_char")); + + var charBuffer = Enumerable.Range(0, 10000) + .Select(i => (char) (i % (char.MaxValue - 1) + 1)) + .ToArray(); + var binBuffer = Enumerable.Range(0, 10000) + .Select(i => (byte) (i % byte.MaxValue)) + .ToArray(); + + using (var binLob = Connection.CreateBinaryLargeObject()) + using (var charLob = Connection.CreateCharacterLargeObject()) + using (var command = Connection.CreateCommand(insert)) { + var binParameter = command.CreateParameter(); + binParameter.ParameterName = "p_bin"; + binLob.Write(binBuffer, 0, binBuffer.Length); + binLob.BindTo(binParameter); + var charParameter = command.CreateParameter(); + charParameter.ParameterName = "p_char"; + charLob.Write(charBuffer, 0, charBuffer.Length); + charLob.BindTo(charParameter); + command.Parameters.Add(charParameter); + command.Parameters.Add(binParameter); + command.ExecuteNonQuery(); + } + + var select = SqlDml.Select(tableRef); + select.Columns.Add(tableRef["bin_lob"]); + select.Columns.Add(tableRef["char_lob"]); + select.Where = SqlDml.Native("rownum")==1; + using (var comand = Connection.CreateCommand(select)) + using (var reader = comand.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + Compare(binBuffer, (byte[]) reader[0]); + Compare(charBuffer, ((string) reader[1]).ToCharArray()); + } + } + + private void CreateIdColumn(Table table) + { + table.CreateColumn("id", new SqlValueType(SqlType.Decimal, 10, 0)); + } + + private void Compare(T[] expected, T[] actual) + { + if ((expected!=null)!=(actual!=null)) + Assert.Fail("expected: {0}; actual {1}", expected, actual); + if (expected==null) + return; + if (expected.Length!=actual.Length) + Assert.Fail("expected length: {0}; actual length {1}", expected.Length, actual.Length); + for (int i = 0; i < expected.Length; i++) + Assert.AreEqual(expected[i], actual[i]); + } + + private SqlInsert CreateInsert(SqlTableRef tableRef) + { + var insert = SqlDml.Insert(tableRef); + insert.Values.Add(tableRef["id"], nextId++); + return insert; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/CatalogComparer.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/CatalogComparer.cs index 6a8bd84338..1315575427 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/CatalogComparer.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/CatalogComparer.cs @@ -1,301 +1,301 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - internal class CatalogComparer - { - public CatalogComparer(SqlConnection conn) - { - connection = conn; - } - - private readonly SqlConnection connection; - - - public void CompareCatalogs(Catalog created, Catalog extracted) - { - Assert.AreEqual(created.Name, extracted.Name); - - foreach (Schema s1 in created.Schemas) { - Schema s2 = extracted.Schemas[s1.Name]; - Assert.IsNotNull(s2); - CompareSchemas(s1, s2); - } - } - - private void CompareSchemas(Schema s1, Schema s2) - { - Assert.IsNotNull(s1); - Assert.IsNotNull(s2); - Assert.IsNotNull(s1.Name); - Assert.IsNotNull(s2.Name); - Assert.AreEqual(s1.Name, s2.Name); - //The created model does not assign Owner, it is assigned by PgSql implicitly - //Assert.IsNotNull(s1.Owner); - Assert.IsNotNull(s2.Owner); - - Assert.AreEqual(s1.Domains.Count, s2.Domains.Count); - Assert.AreEqual(s1.Sequences.Count, s2.Sequences.Count); - Assert.AreEqual(s1.Tables.Count, s2.Tables.Count); - Assert.AreEqual(s1.Views.Count, s2.Views.Count); - - foreach (Xtensive.Sql.Model.Domain d1 in s1.Domains) { - Xtensive.Sql.Model.Domain d2 = s2.Domains[d1.Name]; - Assert.IsNotNull(d2); - - CompareDomains(d1, d2); - } - - foreach (Sequence sq1 in s1.Sequences) { - Sequence sq2 = s2.Sequences[sq1.Name]; - Assert.IsNotNull(sq2); - - CompareSequences(sq1, sq2); - } - - foreach (Table t1 in s1.Tables) { - Table t2 = s2.Tables[t1.Name]; - Assert.IsNotNull(t2); - - CompareTables(t1, t2); - } - - foreach (View v1 in s1.Views) { - View v2 = s2.Views[v1.Name]; - Assert.IsNotNull(v2); - - CompareViews(v1, v2); - } - } - - private void CompareDomains(Xtensive.Sql.Model.Domain d1, Xtensive.Sql.Model.Domain d2) - { - Assert.IsNotNull(d1.Name); - Assert.IsNotNull(d2.Name); - Assert.AreEqual(d1.Name, d2.Name); - CompareSqlValueTypes(d1.DataType, d2.DataType); - Assert.AreEqual(d1.Schema.Name, d2.Schema.Name); - - foreach (DomainConstraint dc1 in d1.DomainConstraints) { - DomainConstraint dc2 = d2.DomainConstraints[dc1.Name]; - Assert.IsNotNull(dc2); - CompareDomainConstraints(dc1, dc2); - } - } - - private void CompareDomainConstraints(DomainConstraint dc1, DomainConstraint dc2) - { - Assert.IsNotNull(dc1.Domain); - Assert.AreEqual(dc1.Domain, dc2.Domain); - Assert.AreEqual(dc1.IsDeferrable, dc2.IsDeferrable); - Assert.AreEqual(dc1.IsInitiallyDeferred, dc2.IsInitiallyDeferred); - Assert.IsNotNull(dc1.Owner); - Assert.AreEqual(dc1.Owner.Name, dc2.Owner.Name); - } - - private void CompareSequences(Sequence sq1, Sequence sq2) - { - Assert.IsNotNull(sq1); - Assert.IsNotNull(sq2); - Assert.IsNotNull(sq2.Name); - Assert.AreEqual(sq1.Name, sq2.Name); - Assert.AreEqual(sq1.Schema.Name, sq2.Schema.Name); - //When creating the model, these values are not specified, but gets default values by PgSql - //if(sq1.SequenceDescriptor.Increment!=null) - Assert.AreEqual(sq1.SequenceDescriptor.Increment ?? 1, sq2.SequenceDescriptor.Increment); - //if(sq1.SequenceDescriptor.IsCyclic != null) - Assert.AreEqual(sq1.SequenceDescriptor.IsCyclic ?? false, sq2.SequenceDescriptor.IsCyclic); - if (sq1.SequenceDescriptor.MaxValue!=null) - Assert.AreEqual(sq1.SequenceDescriptor.MaxValue, sq2.SequenceDescriptor.MaxValue); - if (sq1.SequenceDescriptor.MinValue!=null) - Assert.AreEqual(sq1.SequenceDescriptor.MinValue, sq2.SequenceDescriptor.MinValue); - //start value cannot be extracted - /* - if(sq1.SequenceDescriptor.StartValue != null) - Assert.AreEqual(sq1.SequenceDescriptor.StartValue, sq2.SequenceDescriptor.StartValue); - /**/ - } - - private void CompareSqlValueTypes(SqlValueType t1, SqlValueType t2) - { - Assert.IsNotNull(t1); - Assert.IsNotNull(t2); - Assert.AreEqual(t1.Type, t2.Type); - Assert.AreEqual(t1.Precision, t2.Precision); - Assert.AreEqual(t1.Scale, t2.Scale); - Assert.AreEqual(t1.Length, t2.Length); - } - - private void CompareTables(Table t1, Table t2) - { - Assert.IsNotNull(t1); - Assert.IsNotNull(t2); - Assert.AreEqual(t1.Filegroup, t2.Filegroup); - Assert.AreEqual(t1.Schema.Name, t2.Schema.Name); - Assert.AreEqual(t1.TableColumns.Count, t2.TableColumns.Count); - Assert.AreEqual(t1.TableConstraints.Count, t2.TableConstraints.Count); - - foreach (TableColumn c1 in t1.TableColumns) { - TableColumn c2 = t2.TableColumns[c1.Name]; - Assert.IsNotNull(c2); - CompareTableColumns(c1, c2); - } - - foreach (Index i1 in t1.Indexes) { - Index i2 = t2.Indexes[i1.Name]; - Assert.IsNotNull(i2); - CompareTableIndexes(i1, i2); - } - - foreach (TableConstraint tc1 in t1.TableConstraints) { - TableConstraint tc2 = t2.TableConstraints[tc1.Name]; - Assert.IsNotNull(tc2); - if (tc1 is CheckConstraint) - CompareCheckConstraints(tc1 as CheckConstraint, tc2 as CheckConstraint); - else if (tc1 is PrimaryKey) - ComparePrimaryKeys(tc1 as PrimaryKey, tc2 as PrimaryKey); - else if (tc1 is UniqueConstraint) - CompareUniqueConstraints(tc1 as UniqueConstraint, tc2 as UniqueConstraint); - else if (tc1 is ForeignKey) - CompareForeignKeys(tc1 as ForeignKey, tc2 as ForeignKey); - } - } - - private void CompareTableColumns(TableColumn c1, TableColumn c2) - { - Assert.IsNotNull(c1); - Assert.IsNotNull(c2); - Assert.AreEqual(c1.DataTable.Name, c2.DataTable.Name); - CompareSqlValueTypes(c1.DataType, c2.DataType); - Assert.IsTrue(c1.Domain==null && c2.Domain==null || c1.Domain!=null && c2.Domain!=null && c1.Domain.Name==c2.Domain.Name); - Assert.AreEqual(c1.IsNullable, c2.IsNullable); - Assert.AreEqual(c1.Table.Name, c2.Table.Name); - } - - private void CompareTableIndexes(Index i1, Index i2) - { - Assert.IsNotNull(i1); - Assert.IsNotNull(i2); - Assert.AreEqual(i1.DataTable.Name, i2.DataTable.Name); - Assert.AreEqual(i1.Filegroup, i2.Filegroup); - - Version ver = connection.Driver.CoreServerInfo.ServerVersion; - if (ver.Major * 100 + ver.Minor >= 802) { - if (i1.FillFactor!=null) - Assert.AreEqual(i1.FillFactor, i2.FillFactor); - } - Assert.AreEqual(i1.IsBitmap, i2.IsBitmap); - Assert.AreEqual(i1.IsClustered, i2.IsClustered); - Assert.AreEqual(i1.IsUnique, i2.IsUnique); - - Assert.AreEqual(i1.Columns.Count, i2.Columns.Count); - foreach (IndexColumn ic1 in i1.Columns) { - IndexColumn ic2 = i2.Columns[ic1.Name]; - Assert.IsNotNull(ic2); - CompareIndexColumns(ic1, ic2); - } - } - - private void CompareIndexColumns(IndexColumn ic1, IndexColumn ic2) - { - Assert.IsNotNull(ic1); - Assert.IsNotNull(ic2); - Assert.IsNotNull(ic2.Name); - Assert.AreEqual(ic1.Name, ic2.Name); - Assert.AreEqual(ic1.Ascending, ic2.Ascending); - Assert.AreEqual(ic1.Column.Name, ic2.Column.Name); - Assert.AreEqual(ic1.Index.Name, ic2.Index.Name); - } - - private void CompareTableConstraints(TableConstraint tc1, TableConstraint tc2) - { - //Assert.AreEqual(tc1.IsDeferrable, tc2.IsDeferrable); - //Assert.AreEqual(tc1.IsInitiallyDeferred, tc2.IsInitiallyDeferred); - Assert.AreEqual(tc1.Name, tc2.Name); - Assert.AreEqual(tc1.Owner.Name, tc2.Owner.Name); - Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); - } - - private void CompareCheckConstraints(CheckConstraint cc1, CheckConstraint cc2) - { - CompareTableConstraints(cc1, cc2); - } - - private void CompareUniqueConstraints(UniqueConstraint cc1, UniqueConstraint cc2) - { - CompareTableConstraints(cc1, cc2); - - Assert.AreEqual(cc1.Columns.Count, cc2.Columns.Count); - foreach (TableColumn tc1 in cc1.Columns) { - TableColumn tc2 = cc2.Columns[tc1.Name]; - Assert.IsNotNull(tc2); - Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); - Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); - } - } - - private void ComparePrimaryKeys(PrimaryKey pk1, PrimaryKey pk2) - { - CompareUniqueConstraints(pk1, pk2); - } - - private void CompareForeignKeys(ForeignKey fk1, ForeignKey fk2) - { - CompareTableConstraints(fk1, fk2); - Assert.AreEqual(fk1.IsDeferrable ?? false, fk2.IsDeferrable); - Assert.AreEqual(fk1.IsInitiallyDeferred ?? false, fk2.IsInitiallyDeferred); - Assert.AreEqual(fk1.MatchType, fk2.MatchType); - Assert.AreEqual(fk1.OnDelete, fk2.OnDelete); - Assert.AreEqual(fk1.OnUpdate, fk2.OnUpdate); - Assert.AreEqual(fk1.Table.Schema.Name, fk2.Table.Schema.Name); - Assert.AreEqual(fk1.Table.Name, fk2.Table.Name); - //columns - Assert.AreEqual(fk1.Columns.Count, fk2.Columns.Count); - foreach (TableColumn tc1 in fk1.Columns) { - TableColumn tc2 = fk2.Columns[tc1.Name]; - Assert.IsNotNull(tc2); - Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); - Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); - } - - Assert.AreEqual(fk1.ReferencedTable.Schema.Name, fk2.ReferencedTable.Schema.Name); - Assert.AreEqual(fk1.ReferencedTable.Name, fk2.ReferencedTable.Name); - //referenced columns - Assert.AreEqual(fk1.ReferencedColumns.Count, fk2.ReferencedColumns.Count); - foreach (TableColumn tc1 in fk1.ReferencedColumns) { - TableColumn tc2 = fk2.ReferencedColumns[tc1.Name]; - Assert.IsNotNull(tc2); - Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); - Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); - } - } - - private void CompareViews(View v1, View v2) - { - Assert.IsNotNull(v1); - Assert.IsNotNull(v2); - Assert.AreEqual(v1.Name, v2.Name); - Assert.AreEqual(v1.Schema.Name, v2.Schema.Name); - //columns - //In the created model no columns are created. - /* - //Column counts are not equal, created view has 0 columns - Assert.AreEqual(v1.ViewColumns.Count, v2.ViewColumns.Count); - foreach(ViewColumn vc1 in v1.ViewColumns) - { - ViewColumn vc2 = v2.ViewColumns[vc1.Name]; - Assert.IsNotNull(vc2); - Assert.AreEqual(vc1.DataTable.Name, vc2.DataTable.Name); - Assert.AreEqual(vc1.View.Name, vc2.View.Name); - } - /**/ - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + internal class CatalogComparer + { + public CatalogComparer(SqlConnection conn) + { + connection = conn; + } + + private readonly SqlConnection connection; + + + public void CompareCatalogs(Catalog created, Catalog extracted) + { + Assert.AreEqual(created.Name, extracted.Name); + + foreach (Schema s1 in created.Schemas) { + Schema s2 = extracted.Schemas[s1.Name]; + Assert.IsNotNull(s2); + CompareSchemas(s1, s2); + } + } + + private void CompareSchemas(Schema s1, Schema s2) + { + Assert.IsNotNull(s1); + Assert.IsNotNull(s2); + Assert.IsNotNull(s1.Name); + Assert.IsNotNull(s2.Name); + Assert.AreEqual(s1.Name, s2.Name); + //The created model does not assign Owner, it is assigned by PgSql implicitly + //Assert.IsNotNull(s1.Owner); + Assert.IsNotNull(s2.Owner); + + Assert.AreEqual(s1.Domains.Count, s2.Domains.Count); + Assert.AreEqual(s1.Sequences.Count, s2.Sequences.Count); + Assert.AreEqual(s1.Tables.Count, s2.Tables.Count); + Assert.AreEqual(s1.Views.Count, s2.Views.Count); + + foreach (Xtensive.Sql.Model.Domain d1 in s1.Domains) { + Xtensive.Sql.Model.Domain d2 = s2.Domains[d1.Name]; + Assert.IsNotNull(d2); + + CompareDomains(d1, d2); + } + + foreach (Sequence sq1 in s1.Sequences) { + Sequence sq2 = s2.Sequences[sq1.Name]; + Assert.IsNotNull(sq2); + + CompareSequences(sq1, sq2); + } + + foreach (Table t1 in s1.Tables) { + Table t2 = s2.Tables[t1.Name]; + Assert.IsNotNull(t2); + + CompareTables(t1, t2); + } + + foreach (View v1 in s1.Views) { + View v2 = s2.Views[v1.Name]; + Assert.IsNotNull(v2); + + CompareViews(v1, v2); + } + } + + private void CompareDomains(Xtensive.Sql.Model.Domain d1, Xtensive.Sql.Model.Domain d2) + { + Assert.IsNotNull(d1.Name); + Assert.IsNotNull(d2.Name); + Assert.AreEqual(d1.Name, d2.Name); + CompareSqlValueTypes(d1.DataType, d2.DataType); + Assert.AreEqual(d1.Schema.Name, d2.Schema.Name); + + foreach (DomainConstraint dc1 in d1.DomainConstraints) { + DomainConstraint dc2 = d2.DomainConstraints[dc1.Name]; + Assert.IsNotNull(dc2); + CompareDomainConstraints(dc1, dc2); + } + } + + private void CompareDomainConstraints(DomainConstraint dc1, DomainConstraint dc2) + { + Assert.IsNotNull(dc1.Domain); + Assert.AreEqual(dc1.Domain, dc2.Domain); + Assert.AreEqual(dc1.IsDeferrable, dc2.IsDeferrable); + Assert.AreEqual(dc1.IsInitiallyDeferred, dc2.IsInitiallyDeferred); + Assert.IsNotNull(dc1.Owner); + Assert.AreEqual(dc1.Owner.Name, dc2.Owner.Name); + } + + private void CompareSequences(Sequence sq1, Sequence sq2) + { + Assert.IsNotNull(sq1); + Assert.IsNotNull(sq2); + Assert.IsNotNull(sq2.Name); + Assert.AreEqual(sq1.Name, sq2.Name); + Assert.AreEqual(sq1.Schema.Name, sq2.Schema.Name); + //When creating the model, these values are not specified, but gets default values by PgSql + //if(sq1.SequenceDescriptor.Increment!=null) + Assert.AreEqual(sq1.SequenceDescriptor.Increment ?? 1, sq2.SequenceDescriptor.Increment); + //if(sq1.SequenceDescriptor.IsCyclic != null) + Assert.AreEqual(sq1.SequenceDescriptor.IsCyclic ?? false, sq2.SequenceDescriptor.IsCyclic); + if (sq1.SequenceDescriptor.MaxValue!=null) + Assert.AreEqual(sq1.SequenceDescriptor.MaxValue, sq2.SequenceDescriptor.MaxValue); + if (sq1.SequenceDescriptor.MinValue!=null) + Assert.AreEqual(sq1.SequenceDescriptor.MinValue, sq2.SequenceDescriptor.MinValue); + //start value cannot be extracted + /* + if(sq1.SequenceDescriptor.StartValue != null) + Assert.AreEqual(sq1.SequenceDescriptor.StartValue, sq2.SequenceDescriptor.StartValue); + /**/ + } + + private void CompareSqlValueTypes(SqlValueType t1, SqlValueType t2) + { + Assert.IsNotNull(t1); + Assert.IsNotNull(t2); + Assert.AreEqual(t1.Type, t2.Type); + Assert.AreEqual(t1.Precision, t2.Precision); + Assert.AreEqual(t1.Scale, t2.Scale); + Assert.AreEqual(t1.Length, t2.Length); + } + + private void CompareTables(Table t1, Table t2) + { + Assert.IsNotNull(t1); + Assert.IsNotNull(t2); + Assert.AreEqual(t1.Filegroup, t2.Filegroup); + Assert.AreEqual(t1.Schema.Name, t2.Schema.Name); + Assert.AreEqual(t1.TableColumns.Count, t2.TableColumns.Count); + Assert.AreEqual(t1.TableConstraints.Count, t2.TableConstraints.Count); + + foreach (TableColumn c1 in t1.TableColumns) { + TableColumn c2 = t2.TableColumns[c1.Name]; + Assert.IsNotNull(c2); + CompareTableColumns(c1, c2); + } + + foreach (Index i1 in t1.Indexes) { + Index i2 = t2.Indexes[i1.Name]; + Assert.IsNotNull(i2); + CompareTableIndexes(i1, i2); + } + + foreach (TableConstraint tc1 in t1.TableConstraints) { + TableConstraint tc2 = t2.TableConstraints[tc1.Name]; + Assert.IsNotNull(tc2); + if (tc1 is CheckConstraint) + CompareCheckConstraints(tc1 as CheckConstraint, tc2 as CheckConstraint); + else if (tc1 is PrimaryKey) + ComparePrimaryKeys(tc1 as PrimaryKey, tc2 as PrimaryKey); + else if (tc1 is UniqueConstraint) + CompareUniqueConstraints(tc1 as UniqueConstraint, tc2 as UniqueConstraint); + else if (tc1 is ForeignKey) + CompareForeignKeys(tc1 as ForeignKey, tc2 as ForeignKey); + } + } + + private void CompareTableColumns(TableColumn c1, TableColumn c2) + { + Assert.IsNotNull(c1); + Assert.IsNotNull(c2); + Assert.AreEqual(c1.DataTable.Name, c2.DataTable.Name); + CompareSqlValueTypes(c1.DataType, c2.DataType); + Assert.IsTrue(c1.Domain==null && c2.Domain==null || c1.Domain!=null && c2.Domain!=null && c1.Domain.Name==c2.Domain.Name); + Assert.AreEqual(c1.IsNullable, c2.IsNullable); + Assert.AreEqual(c1.Table.Name, c2.Table.Name); + } + + private void CompareTableIndexes(Index i1, Index i2) + { + Assert.IsNotNull(i1); + Assert.IsNotNull(i2); + Assert.AreEqual(i1.DataTable.Name, i2.DataTable.Name); + Assert.AreEqual(i1.Filegroup, i2.Filegroup); + + Version ver = connection.Driver.CoreServerInfo.ServerVersion; + if (ver.Major * 100 + ver.Minor >= 802) { + if (i1.FillFactor!=null) + Assert.AreEqual(i1.FillFactor, i2.FillFactor); + } + Assert.AreEqual(i1.IsBitmap, i2.IsBitmap); + Assert.AreEqual(i1.IsClustered, i2.IsClustered); + Assert.AreEqual(i1.IsUnique, i2.IsUnique); + + Assert.AreEqual(i1.Columns.Count, i2.Columns.Count); + foreach (IndexColumn ic1 in i1.Columns) { + IndexColumn ic2 = i2.Columns[ic1.Name]; + Assert.IsNotNull(ic2); + CompareIndexColumns(ic1, ic2); + } + } + + private void CompareIndexColumns(IndexColumn ic1, IndexColumn ic2) + { + Assert.IsNotNull(ic1); + Assert.IsNotNull(ic2); + Assert.IsNotNull(ic2.Name); + Assert.AreEqual(ic1.Name, ic2.Name); + Assert.AreEqual(ic1.Ascending, ic2.Ascending); + Assert.AreEqual(ic1.Column.Name, ic2.Column.Name); + Assert.AreEqual(ic1.Index.Name, ic2.Index.Name); + } + + private void CompareTableConstraints(TableConstraint tc1, TableConstraint tc2) + { + //Assert.AreEqual(tc1.IsDeferrable, tc2.IsDeferrable); + //Assert.AreEqual(tc1.IsInitiallyDeferred, tc2.IsInitiallyDeferred); + Assert.AreEqual(tc1.Name, tc2.Name); + Assert.AreEqual(tc1.Owner.Name, tc2.Owner.Name); + Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); + } + + private void CompareCheckConstraints(CheckConstraint cc1, CheckConstraint cc2) + { + CompareTableConstraints(cc1, cc2); + } + + private void CompareUniqueConstraints(UniqueConstraint cc1, UniqueConstraint cc2) + { + CompareTableConstraints(cc1, cc2); + + Assert.AreEqual(cc1.Columns.Count, cc2.Columns.Count); + foreach (TableColumn tc1 in cc1.Columns) { + TableColumn tc2 = cc2.Columns[tc1.Name]; + Assert.IsNotNull(tc2); + Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); + Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); + } + } + + private void ComparePrimaryKeys(PrimaryKey pk1, PrimaryKey pk2) + { + CompareUniqueConstraints(pk1, pk2); + } + + private void CompareForeignKeys(ForeignKey fk1, ForeignKey fk2) + { + CompareTableConstraints(fk1, fk2); + Assert.AreEqual(fk1.IsDeferrable ?? false, fk2.IsDeferrable); + Assert.AreEqual(fk1.IsInitiallyDeferred ?? false, fk2.IsInitiallyDeferred); + Assert.AreEqual(fk1.MatchType, fk2.MatchType); + Assert.AreEqual(fk1.OnDelete, fk2.OnDelete); + Assert.AreEqual(fk1.OnUpdate, fk2.OnUpdate); + Assert.AreEqual(fk1.Table.Schema.Name, fk2.Table.Schema.Name); + Assert.AreEqual(fk1.Table.Name, fk2.Table.Name); + //columns + Assert.AreEqual(fk1.Columns.Count, fk2.Columns.Count); + foreach (TableColumn tc1 in fk1.Columns) { + TableColumn tc2 = fk2.Columns[tc1.Name]; + Assert.IsNotNull(tc2); + Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); + Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); + } + + Assert.AreEqual(fk1.ReferencedTable.Schema.Name, fk2.ReferencedTable.Schema.Name); + Assert.AreEqual(fk1.ReferencedTable.Name, fk2.ReferencedTable.Name); + //referenced columns + Assert.AreEqual(fk1.ReferencedColumns.Count, fk2.ReferencedColumns.Count); + foreach (TableColumn tc1 in fk1.ReferencedColumns) { + TableColumn tc2 = fk2.ReferencedColumns[tc1.Name]; + Assert.IsNotNull(tc2); + Assert.AreEqual(tc1.Table.Schema.Name, tc2.Table.Schema.Name); + Assert.AreEqual(tc1.Table.Name, tc2.Table.Name); + } + } + + private void CompareViews(View v1, View v2) + { + Assert.IsNotNull(v1); + Assert.IsNotNull(v2); + Assert.AreEqual(v1.Name, v2.Name); + Assert.AreEqual(v1.Schema.Name, v2.Schema.Name); + //columns + //In the created model no columns are created. + /* + //Column counts are not equal, created view has 0 columns + Assert.AreEqual(v1.ViewColumns.Count, v2.ViewColumns.Count); + foreach(ViewColumn vc1 in v1.ViewColumns) + { + ViewColumn vc2 = v2.ViewColumns[vc1.Name]; + Assert.IsNotNull(vc2); + Assert.AreEqual(vc1.DataTable.Name, vc2.DataTable.Name); + Assert.AreEqual(vc1.View.Name, vc2.View.Name); + } + /**/ + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/DateTimeIntervalTest.cs index b950d408d3..fdab3332d5 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/DateTimeIntervalTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.02 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture] - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.02 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture] + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExceptionTypesTest.cs index 9795e83b17..9af9d66235 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExceptionTypesTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.08 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture] - public class ExceptionTypesTest : Sql.ExceptionTypesTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.08 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture] + public class ExceptionTypesTest : Sql.ExceptionTypesTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExtractorTest.cs index b946a0a51c..a00e1d2d5b 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/ExtractorTest.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture, Explicit] - public class ExtractorTest : SqlTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - - [Test] - public void FullTextIndexExtractorTest() - { - var schema = Driver.ExtractDefaultSchema(Connection); - } - - [Test] - public void ExpressionIndexExtractorTest() - { - string guid = Guid.NewGuid().ToString(); - string tableName = "tbl" + guid; - string indexName = "ix" + guid; - string tableCreation = "CREATE TABLE \"" + tableName + "\"(col1 text, col2 text)"; - string indexCreation = "CREATE INDEX \"" + indexName + "\" ON \"" + tableName + "\"(col1,col2,(col1||col2))"; - - Schema schema = null; - try { - Connection.BeginTransaction(); - - using (var cmd = Connection.CreateCommand(tableCreation + ";" + indexCreation)) { - cmd.ExecuteNonQuery(); - } - schema = Driver.ExtractDefaultSchema(Connection); - } - finally { - Connection.Rollback(); - } - - var table = schema.Tables[tableName]; - Assert.AreEqual(1, table.Indexes.Count); - var index = table.Indexes[indexName]; - Assert.AreEqual(3, index.Columns.Count); - Assert.AreSame(table.Columns[0], index.Columns[0].Column); - Assert.AreSame(table.Columns[1], index.Columns[1].Column); - Assert.IsNull(index.Columns[0].Expression); - Assert.IsNull(index.Columns[1].Expression); - Assert.IsNull(index.Columns[2].Column); - Assert.IsNotNull(index.Columns[2].Expression); - } - - [Test] - public void ExtractDateTimeOffsetFields() - { - var dropTableScript = "DROP TABLE IF EXISTS \"InteractionLog\""; - var createTableScript = "CREATE TABLE \"InteractionLog\" (" + - "\"ID\" bigint PRIMARY KEY NOT NULL," + - "\"PacketId\" character varying(10485760)," + - "\"SenderId\" character varying(10485760)," + - "\"ReceiverId\" character varying(10485760)," + - "\"IsTest\" boolean DEFAULT false NOT NULL," + - "\"ResultCode\" integer," + - "\"ErrorMessage\" character varying(10485760)," + - "\"ErrorDescription\" character varying(10485760)," + - "\"Description\" character varying(10485760)," + - "\"Type\" integer DEFAULT 0 NOT NULL," + - "\"FormatId\" character varying(10485760)," + - "\"DateTimeOffset0\" timestamp(0) with time zone DEFAULT '0001-01-01 00:00:00+00:00'::timestamp(0) with time zone NOT NULL," + - "\"DateTimeOffset1\" timestamp(1) with time zone DEFAULT '0001-01-01 00:00:00.0+00:00'::timestamp(1) with time zone NOT NULL," + - "\"DateTimeOffset2\" timestamp(2) with time zone DEFAULT '0001-01-01 00:00:00.00+00:00'::timestamp(2) with time zone NOT NULL," + - "\"DateTimeOffset3\" timestamp(3) with time zone DEFAULT '0001-01-01 00:00:00.000+00:00'::timestamp(3) with time zone NOT NULL," + - "\"VersionID\" integer DEFAULT 0 NOT NULL" + - ");"; - - using (var command = Connection.CreateCommand()) { - command.CommandText = dropTableScript; - command.ExecuteNonQuery(); - - command.CommandText = createTableScript; - command.ExecuteNonQuery(); - } - - var catalog = Driver.ExtractCatalog(Connection); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture, Explicit] + public class ExtractorTest : SqlTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + + [Test] + public void FullTextIndexExtractorTest() + { + var schema = Driver.ExtractDefaultSchema(Connection); + } + + [Test] + public void ExpressionIndexExtractorTest() + { + string guid = Guid.NewGuid().ToString(); + string tableName = "tbl" + guid; + string indexName = "ix" + guid; + string tableCreation = "CREATE TABLE \"" + tableName + "\"(col1 text, col2 text)"; + string indexCreation = "CREATE INDEX \"" + indexName + "\" ON \"" + tableName + "\"(col1,col2,(col1||col2))"; + + Schema schema = null; + try { + Connection.BeginTransaction(); + + using (var cmd = Connection.CreateCommand(tableCreation + ";" + indexCreation)) { + cmd.ExecuteNonQuery(); + } + schema = Driver.ExtractDefaultSchema(Connection); + } + finally { + Connection.Rollback(); + } + + var table = schema.Tables[tableName]; + Assert.AreEqual(1, table.Indexes.Count); + var index = table.Indexes[indexName]; + Assert.AreEqual(3, index.Columns.Count); + Assert.AreSame(table.Columns[0], index.Columns[0].Column); + Assert.AreSame(table.Columns[1], index.Columns[1].Column); + Assert.IsNull(index.Columns[0].Expression); + Assert.IsNull(index.Columns[1].Expression); + Assert.IsNull(index.Columns[2].Column); + Assert.IsNotNull(index.Columns[2].Expression); + } + + [Test] + public void ExtractDateTimeOffsetFields() + { + var dropTableScript = "DROP TABLE IF EXISTS \"InteractionLog\""; + var createTableScript = "CREATE TABLE \"InteractionLog\" (" + + "\"ID\" bigint PRIMARY KEY NOT NULL," + + "\"PacketId\" character varying(10485760)," + + "\"SenderId\" character varying(10485760)," + + "\"ReceiverId\" character varying(10485760)," + + "\"IsTest\" boolean DEFAULT false NOT NULL," + + "\"ResultCode\" integer," + + "\"ErrorMessage\" character varying(10485760)," + + "\"ErrorDescription\" character varying(10485760)," + + "\"Description\" character varying(10485760)," + + "\"Type\" integer DEFAULT 0 NOT NULL," + + "\"FormatId\" character varying(10485760)," + + "\"DateTimeOffset0\" timestamp(0) with time zone DEFAULT '0001-01-01 00:00:00+00:00'::timestamp(0) with time zone NOT NULL," + + "\"DateTimeOffset1\" timestamp(1) with time zone DEFAULT '0001-01-01 00:00:00.0+00:00'::timestamp(1) with time zone NOT NULL," + + "\"DateTimeOffset2\" timestamp(2) with time zone DEFAULT '0001-01-01 00:00:00.00+00:00'::timestamp(2) with time zone NOT NULL," + + "\"DateTimeOffset3\" timestamp(3) with time zone DEFAULT '0001-01-01 00:00:00.000+00:00'::timestamp(3) with time zone NOT NULL," + + "\"VersionID\" integer DEFAULT 0 NOT NULL" + + ");"; + + using (var command = Connection.CreateCommand()) { + command.CommandText = dropTableScript; + command.ExecuteNonQuery(); + + command.CommandText = createTableScript; + command.ExecuteNonQuery(); + } + + var catalog = Driver.ExtractCatalog(Connection); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/IndexTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/IndexTest.cs index 4645b9434a..1f3dc8f5e9 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/IndexTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/IndexTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - public class IndexTest : Sql.IndexTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - - protected override void CreateTable() - { - Table t; - t = schema.CreateTable(TableName); - t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); - t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); - ExecuteNonQuery(SqlDdl.Create(t)); - } - - [Test] - public override void CreateExpressionIndexTest() - { - // Creating index - var t = schema.Tables[TableName]; - var i = t.CreateIndex(ExpressionIndexName); - var tr = SqlDml.TableRef(t); - i.CreateIndexColumn(tr["first"]); - i.CreateIndexColumn(tr["second"]); - i.CreateIndexColumn(SqlDml.Concat(tr["first"], " ", tr["second"])); - i.CreateIndexColumn(SqlDml.Concat(tr["second"], " ", tr["first"])); - ExecuteNonQuery(SqlDdl.Create(i)); - - // Extracting index and checking its properties - var c2 = ExtractCatalog(); - var s2 = c2.DefaultSchema; - var t2 = s2.Tables[TableName]; - var i2 = t2.Indexes[ExpressionIndexName]; - Assert.IsNotNull(i2); - Assert.AreEqual(4, i2.Columns.Count); - - Assert.IsTrue(!i2.Columns[2].Expression.IsNullReference()); - Assert.IsTrue(!i2.Columns[3].Expression.IsNullReference()); - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + public class IndexTest : Sql.IndexTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + + protected override void CreateTable() + { + Table t; + t = schema.CreateTable(TableName); + t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); + t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); + ExecuteNonQuery(SqlDdl.Create(t)); + } + + [Test] + public override void CreateExpressionIndexTest() + { + // Creating index + var t = schema.Tables[TableName]; + var i = t.CreateIndex(ExpressionIndexName); + var tr = SqlDml.TableRef(t); + i.CreateIndexColumn(tr["first"]); + i.CreateIndexColumn(tr["second"]); + i.CreateIndexColumn(SqlDml.Concat(tr["first"], " ", tr["second"])); + i.CreateIndexColumn(SqlDml.Concat(tr["second"], " ", tr["first"])); + ExecuteNonQuery(SqlDdl.Create(i)); + + // Extracting index and checking its properties + var c2 = ExtractCatalog(); + var s2 = c2.DefaultSchema; + var t2 = s2.Tables[TableName]; + var i2 = t2.Indexes[ExpressionIndexName]; + Assert.IsNotNull(i2); + Assert.AreEqual(4, i2.Columns.Count); + + Assert.IsTrue(!i2.Columns[2].Expression.IsNullReference()); + Assert.IsTrue(!i2.Columns[3].Expression.IsNullReference()); + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/NpgsqlTypeConstructorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/NpgsqlTypeConstructorTest.cs index 074dc75293..36037d4c60 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/NpgsqlTypeConstructorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/NpgsqlTypeConstructorTest.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.14 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Providers.PostgreSql; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - public class NpgsqlTypeConstructorTest : SqlTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIs(StorageProvider.PostgreSql); - } - - [Test] - public void NpgsqlPointConstructorTest() - { - SqlExpression point = SqlDml.Native("point'(0,1)'"); - CheckInequality(PostgresqlSqlDml.NpgsqlPointConstructor(2, 3), point); - } - - [Test] - public void NpgsqlBoxConstructorTest() - { - SqlExpression box = SqlDml.Native("box'(2,3),(0,1)'"); - CheckEquality( - PostgresqlSqlDml.NpgsqlBoxConstructor( - PostgresqlSqlDml.NpgsqlPointConstructor(2, 3), - PostgresqlSqlDml.NpgsqlPointConstructor(0, 1)), - box); - - CheckEquality( - PostgresqlSqlDml.NpgsqlBoxConstructor( - SqlDml.Native("point'(2,3)'"), - SqlDml.Native("point'(0,1)'")), - box); - } - - [Test] - public void NpgsqlLSegConstructorTest() - { - SqlExpression lSeg = SqlDml.Native("lseg'[(0,1),(2,3)]'"); - CheckEquality( - PostgresqlSqlDml.NpgsqlLSegConstructor( - PostgresqlSqlDml.NpgsqlPointConstructor(0, 1), - PostgresqlSqlDml.NpgsqlPointConstructor(2, 3)), - lSeg); - - CheckEquality( - PostgresqlSqlDml.NpgsqlLSegConstructor( - SqlDml.Native("point'(0,1)'"), - SqlDml.Native("point'(2,3)'")), - lSeg); - } - - [Test] - public void NpgsqlCircleConstructorTest() - { - SqlExpression circle = SqlDml.Native("circle'<(0,1),10>'"); - - CheckEquality( - PostgresqlSqlDml.NpgsqlCircleConstructor( - PostgresqlSqlDml.NpgsqlPointConstructor(0, 1), - 10), - circle); - - CheckEquality( - PostgresqlSqlDml.NpgsqlCircleConstructor( - SqlDml.Native("point'(0,1)'"), - 10), - circle); - } - - private void CheckInequality(SqlExpression left, SqlExpression right) - { - var select = SqlDml.Select("ok"); - select.Where = left!=right; - using (var command = Connection.CreateCommand(select)) { - Console.WriteLine(command.CommandText); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - } - } - } - - private void CheckEquality(SqlExpression left, SqlExpression right) - { - var select = SqlDml.Select("ok"); - select.Where = left==right; - using (var command = Connection.CreateCommand(select)) { - Console.WriteLine(command.CommandText); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - } - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.14 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Providers.PostgreSql; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + public class NpgsqlTypeConstructorTest : SqlTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIs(StorageProvider.PostgreSql); + } + + [Test] + public void NpgsqlPointConstructorTest() + { + SqlExpression point = SqlDml.Native("point'(0,1)'"); + CheckInequality(PostgresqlSqlDml.NpgsqlPointConstructor(2, 3), point); + } + + [Test] + public void NpgsqlBoxConstructorTest() + { + SqlExpression box = SqlDml.Native("box'(2,3),(0,1)'"); + CheckEquality( + PostgresqlSqlDml.NpgsqlBoxConstructor( + PostgresqlSqlDml.NpgsqlPointConstructor(2, 3), + PostgresqlSqlDml.NpgsqlPointConstructor(0, 1)), + box); + + CheckEquality( + PostgresqlSqlDml.NpgsqlBoxConstructor( + SqlDml.Native("point'(2,3)'"), + SqlDml.Native("point'(0,1)'")), + box); + } + + [Test] + public void NpgsqlLSegConstructorTest() + { + SqlExpression lSeg = SqlDml.Native("lseg'[(0,1),(2,3)]'"); + CheckEquality( + PostgresqlSqlDml.NpgsqlLSegConstructor( + PostgresqlSqlDml.NpgsqlPointConstructor(0, 1), + PostgresqlSqlDml.NpgsqlPointConstructor(2, 3)), + lSeg); + + CheckEquality( + PostgresqlSqlDml.NpgsqlLSegConstructor( + SqlDml.Native("point'(0,1)'"), + SqlDml.Native("point'(2,3)'")), + lSeg); + } + + [Test] + public void NpgsqlCircleConstructorTest() + { + SqlExpression circle = SqlDml.Native("circle'<(0,1),10>'"); + + CheckEquality( + PostgresqlSqlDml.NpgsqlCircleConstructor( + PostgresqlSqlDml.NpgsqlPointConstructor(0, 1), + 10), + circle); + + CheckEquality( + PostgresqlSqlDml.NpgsqlCircleConstructor( + SqlDml.Native("point'(0,1)'"), + 10), + circle); + } + + private void CheckInequality(SqlExpression left, SqlExpression right) + { + var select = SqlDml.Select("ok"); + select.Where = left!=right; + using (var command = Connection.CreateCommand(select)) { + Console.WriteLine(command.CommandText); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + } + } + } + + private void CheckEquality(SqlExpression left, SqlExpression right) + { + var select = SqlDml.Select("ok"); + select.Where = left==right; + using (var command = Connection.CreateCommand(select)) { + Console.WriteLine(command.CommandText); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SavepointsTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SavepointsTest.cs index fa820a47c0..7db164cf2a 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SavepointsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SavepointsTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.20 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture] - public class SavepointsTest : Sql.SavepointsTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.20 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture] + public class SavepointsTest : Sql.SavepointsTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SqlDomTests.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SqlDomTests.cs index 1a7381c8e7..e9f9fea91c 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SqlDomTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/SqlDomTests.cs @@ -1,2165 +1,2165 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data; -using System.Data.Common; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using DataTable=System.Data.DataTable; -using UniqueConstraint=Xtensive.Sql.Model.UniqueConstraint; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture, Explicit] - public class SqlDomTests - { - protected UrlInfo ConnectionUrlInfo - { - get { return TestConnectionInfoProvider.GetConnectionInfo().ConnectionUrl; } - } - - protected string Url - { - get { return ConnectionUrlInfo.Url; } - } - - protected SqlDriver Driver { get; private set; } - - protected SqlConnection Connection { get; private set; } - - protected Catalog MyCatalog { get; private set; } - - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - - [OneTimeSetUp] - public virtual void FixtureSetup() - { - CheckRequirements(); - Driver = TestSqlDriver.Create(Url); - CreateModel(); - Connection = Driver.CreateConnection(); - try { - Connection.Open(); - } - catch (SystemException e) { - Console.WriteLine(e); - } - } - - - protected void CreateModel() - { - { - MyCatalog = new Catalog(ConnectionUrlInfo.GetDatabase()); - - ForeignKey fk; - Index idx; - - Schema sch1 = MyCatalog.CreateSchema("Sch1"); - - Sequence t1_seq = sch1.CreateSequence("T1Seq"); - - Table sch1_t1 = sch1.CreateTable("T1"); - - sch1_t1.CreateColumn("Id", new SqlValueType(SqlType.Int32)); - sch1_t1.TableColumns["Id"].DefaultValue = SqlDml.NextValue(t1_seq); - - sch1_t1.CreateColumn("Char", new SqlValueType(SqlType.Char, 1)); - sch1_t1.TableColumns["Char"].IsNullable = false; - sch1_t1.TableColumns["Char"].DefaultValue = "'"; - sch1_t1.CreateColumn("Char?", new SqlValueType(SqlType.Char, 1)); - sch1_t1.TableColumns["Char?"].IsNullable = true; - sch1_t1.CreateColumn("Char7", new SqlValueType(SqlType.Char, 7)); - sch1_t1.TableColumns["Char7"].IsNullable = false; - sch1_t1.TableColumns["Char7"].DefaultValue = "Char7"; - sch1_t1.CreateColumn("Char8?", new SqlValueType(SqlType.Char, 8)); - sch1_t1.TableColumns["Char8?"].IsNullable = true; - sch1_t1.CreateColumn("Varchar9", new SqlValueType(SqlType.VarChar, 9)); - sch1_t1.TableColumns["Varchar9"].IsNullable = false; - sch1_t1.TableColumns["Varchar9"].DefaultValue = SqlDml.Literal("Varchar9"); - sch1_t1.CreateColumn("Varchar10?", new SqlValueType(SqlType.VarChar, 10)); - sch1_t1.TableColumns["Varchar10?"].IsNullable = true; - sch1_t1.CreateColumn("Text", new SqlValueType(SqlType.VarCharMax)); - sch1_t1.TableColumns["Text"].IsNullable = false; - sch1_t1.TableColumns["Text"].DefaultValue = SqlDml.Concat(SqlDml.Literal("Text'"), SqlDml.SessionUser()); - sch1_t1.CreateColumn("Text?", new SqlValueType(SqlType.VarCharMax)); - sch1_t1.TableColumns["Text?"].IsNullable = true; - sch1_t1.CreateColumn("Bool", new SqlValueType(SqlType.Boolean)); - sch1_t1.TableColumns["Bool"].IsNullable = false; - sch1_t1.TableColumns["Bool"].DefaultValue = false; // false;// Sql.Or(Sql.Literal(true), Sql.Literal(false)); - sch1_t1.CreateColumn("Bool?", new SqlValueType(SqlType.Boolean)); - sch1_t1.TableColumns["Bool?"].IsNullable = true; - sch1_t1.CreateColumn("Int2", new SqlValueType(SqlType.Int16)); - sch1_t1.TableColumns["Int2"].IsNullable = false; - sch1_t1.TableColumns["Int2"].DefaultValue = (SqlDml.Literal(2) + 1) * 7; - sch1_t1.CreateColumn("Int2?", new SqlValueType(SqlType.Int16)); - sch1_t1.TableColumns["Int2?"].IsNullable = true; - sch1_t1.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); - sch1_t1.TableColumns["Int4"].IsNullable = false; - sch1_t1.TableColumns["Int4"].DefaultValue = 41; - sch1_t1.CreateColumn("Int4?", new SqlValueType(SqlType.Int32)); - sch1_t1.TableColumns["Int4?"].IsNullable = true; - sch1_t1.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); - sch1_t1.TableColumns["Int8"].IsNullable = false; - sch1_t1.TableColumns["Int8"].DefaultValue = SqlDml.Square(9); - sch1_t1.CreateColumn("Int8?", new SqlValueType(SqlType.Int64)); - sch1_t1.TableColumns["Int8?"].IsNullable = true; - sch1_t1.CreateColumn("Float4", new SqlValueType(SqlType.Float)); - sch1_t1.TableColumns["Float4"].IsNullable = false; - sch1_t1.TableColumns["Float4"].DefaultValue = SqlDml.Pi(); - sch1_t1.CreateColumn("Float4?", new SqlValueType(SqlType.Float)); - sch1_t1.TableColumns["Float4?"].IsNullable = true; - sch1_t1.CreateColumn("Float8", new SqlValueType(SqlType.Double)); - sch1_t1.TableColumns["Float8"].IsNullable = false; - sch1_t1.TableColumns["Float8"].DefaultValue = SqlDml.Rand(7); - sch1_t1.CreateColumn("Float8?", new SqlValueType(SqlType.Double)); - sch1_t1.TableColumns["Float8?"].IsNullable = true; - sch1_t1.CreateColumn("Decimal28_10", new SqlValueType(SqlType.Decimal, 28, 10)); - sch1_t1.TableColumns["Decimal28_10"].IsNullable = false; - sch1_t1.TableColumns["Decimal28_10"].DefaultValue = SqlDml.Tan(SqlDml.Pi() / 4); - sch1_t1.CreateColumn("Decimal28_10?", new SqlValueType(SqlType.Decimal, 28, 10)); - sch1_t1.TableColumns["Decimal28_10?"].IsNullable = true; - sch1_t1.CreateColumn("Decimal50", new SqlValueType(SqlType.Decimal, 50, 0)); - sch1_t1.TableColumns["Decimal50"].IsNullable = false; - sch1_t1.TableColumns["Decimal50"].DefaultValue = SqlDml.Power(3, 20); - sch1_t1.CreateColumn("Decimal50?", new SqlValueType(SqlType.Decimal, 50, 0)); - sch1_t1.TableColumns["Decimal50?"].IsNullable = true; - sch1_t1.CreateColumn("DateTime", new SqlValueType(SqlType.DateTime)); - sch1_t1.TableColumns["DateTime"].IsNullable = false; - sch1_t1.TableColumns["DateTime"].DefaultValue = SqlDml.CurrentDate(); - sch1_t1.CreateColumn("DateTime?", new SqlValueType(SqlType.DateTime)); - sch1_t1.TableColumns["DateTime?"].IsNullable = true; - SqlTableRef t1_ref = SqlDml.TableRef(sch1_t1); - - sch1_t1.CreatePrimaryKey("T1_pk", sch1_t1.TableColumns["Id"]); - - sch1_t1.CreateUniqueConstraint("T1_u1", sch1_t1.TableColumns["Char?"], sch1_t1.TableColumns["Char7"]); - sch1_t1.CreateUniqueConstraint("T1_u2", sch1_t1.TableColumns["Text?"]); - sch1_t1.CreateUniqueConstraint("T1_u3", sch1_t1.TableColumns["Int8"], sch1_t1.TableColumns["Int4"]); - sch1_t1.CreateUniqueConstraint("T1_u4", sch1_t1.TableColumns["Int2"], sch1_t1.TableColumns["Bool"], sch1_t1.TableColumns["Bool?"]); - sch1_t1.CreateUniqueConstraint("T1_u5", sch1_t1.TableColumns["DateTime"], sch1_t1.TableColumns["Float8"], sch1_t1.TableColumns["Decimal28_10"], sch1_t1.TableColumns["Float4"]); - - sch1_t1.CreateCheckConstraint("T1_ch1", t1_ref["Bool?"]); - sch1_t1.CreateCheckConstraint("T1_ch2", SqlDml.Between(t1_ref["Int2"], 2, 200)); - sch1_t1.CreateCheckConstraint("T1_ch3", SqlDml.Between(t1_ref["Int4"], 4, 400)); - sch1_t1.CreateCheckConstraint("T1_ch4", t1_ref["Int8"] > t1_ref["Int4"]); - sch1_t1.CreateCheckConstraint("T1_ch5", t1_ref["Decimal50"] >= t1_ref["Decimal28_10"]); - - fk = sch1_t1.CreateForeignKey("fk_Int4?_Id"); - fk.Columns.Add(sch1_t1.TableColumns["Int4?"]); - fk.ReferencedTable = sch1_t1; - fk.ReferencedColumns.Add(sch1_t1.TableColumns["Id"]); - fk.OnUpdate = ReferentialAction.SetNull; - fk.OnDelete = ReferentialAction.SetDefault; - fk.IsDeferrable = false; - - idx = sch1_t1.CreateIndex("T1_ix1"); - idx.CreateIndexColumn(sch1_t1.TableColumns["Decimal50"]); - - idx = sch1_t1.CreateIndex("T1_ix2"); - idx.CreateIndexColumn(sch1_t1.TableColumns["DateTime"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Int2"]); - idx.FillFactor = 80; - - idx = sch1_t1.CreateIndex("T1_ix3"); - idx.CreateIndexColumn(sch1_t1.TableColumns["Char7"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Bool"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Float8?"]); - idx.IsUnique = true; - - idx = sch1_t1.CreateIndex("T1_ix4"); - idx.CreateIndexColumn(sch1_t1.TableColumns["Varchar10?"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Varchar9"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Char7"]); - idx.CreateIndexColumn(sch1_t1.TableColumns["Text?"]); - - { - SqlSelect viewdef = SqlDml.Select(t1_ref); - foreach (SqlTableColumn tc in t1_ref.Columns) { - viewdef.Columns.Add(tc); - } - string cmdText = Driver.Compile(viewdef).GetCommandText(); - sch1.CreateView("T1View", SqlDml.Native(cmdText)); - } - - //t2 - - Table sch1_t2 = sch1.CreateTable("T2"); - { - sch1_t2.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); - sch1_t2.TableColumns["Int8"].IsNullable = false; - sch1_t2.TableColumns["Int8"].DefaultValue = 0; - sch1_t2.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); - sch1_t2.TableColumns["Int4"].IsNullable = false; - sch1_t2.TableColumns["Int4"].DefaultValue = 0; - - SqlTableRef t2_ref = SqlDml.TableRef(sch1_t2); - - fk = sch1_t2.CreateForeignKey("fk_t2_Int8_Int4_t1_Int8_Int4"); - fk.Columns.Add(sch1_t2.TableColumns["Int8"]); - fk.Columns.Add(sch1_t2.TableColumns["Int4"]); - fk.ReferencedTable = sch1_t1; - fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int8"]); - fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int4"]); - fk.OnUpdate = ReferentialAction.Cascade; - fk.OnDelete = ReferentialAction.Restrict; - fk.IsDeferrable = false; - } - - //sch2 - - Schema sch2 = MyCatalog.CreateSchema("Sch2"); - { - //t3 - - Table sch2_t3 = sch2.CreateTable("T3"); - - sch2_t3.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); - sch2_t3.TableColumns["Int8"].IsNullable = false; - sch2_t3.TableColumns["Int8"].DefaultValue = 0; - sch2_t3.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); - sch2_t3.TableColumns["Int4"].IsNullable = false; - sch2_t3.TableColumns["Int4"].DefaultValue = 0; - - SqlTableRef t3_ref = SqlDml.TableRef(sch2_t3); - - fk = sch2_t3.CreateForeignKey("fk_t3_Int8_Int4_t1_Int8_Int4"); - fk.Columns.Add(sch2_t3.TableColumns["Int8"]); - fk.Columns.Add(sch2_t3.TableColumns["Int4"]); - fk.ReferencedTable = sch1_t1; - fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int8"]); - fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int4"]); - fk.OnUpdate = ReferentialAction.NoAction; - fk.OnDelete = ReferentialAction.Cascade; - fk.IsDeferrable = false; - - //some sequences - Sequence sch2_seq1 = sch2.CreateSequence("Seq1"); - - Sequence sch2_seq2 = sch2.CreateSequence("Seq2"); - sch2_seq2.SequenceDescriptor.StartValue = 100; - sch2_seq2.SequenceDescriptor.Increment = 10; - sch2_seq2.SequenceDescriptor.MinValue = 1; - sch2_seq2.SequenceDescriptor.MaxValue = 1000; - sch2_seq2.SequenceDescriptor.IsCyclic = true; - } - } - - #region AdventureWorks model - - /* - { - Model model = mDbModel; - model.DefaultServer.DefaultCatalog.CreateSchema("HumanResources"); - model.DefaultServer.DefaultCatalog.CreateSchema("Person"); - model.DefaultServer.DefaultCatalog.CreateSchema("Production"); - model.DefaultServer.DefaultCatalog.CreateSchema("Purchasing"); - model.DefaultServer.DefaultCatalog.CreateSchema("Sales"); - - Table t; - View v; - TableColumn c; - IConstraint cs; - - t = MyCatalog.Schemas["Production"].CreateTable("TransactionHistoryArchive"); - t.CreateColumn("TransactionID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReferenceOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReferenceOrderLineID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TransactionDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("TransactionType", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("CreditCard"); - t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CardType", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CardNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ExpMonth", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ExpYear", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("Document"); - t.CreateColumn("DocumentID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("FileName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("FileExtension", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Revision", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ChangeNumber", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("DocumentSummary", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Document", new SqlValueType(SqlDataType.VarBinaryMax)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("Illustration"); - t.CreateColumn("IllustrationID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Diagram", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductDescription"); - t.CreateColumn("ProductDescriptionID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Description", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SpecialOffer"); - t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Description", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("DiscountPct", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Type", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Category", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("MinQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("MaxQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductPhoto"); - t.CreateColumn("ProductPhotoID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ThumbNailPhoto", new SqlValueType(SqlDataType.VarBinaryMax)); - t.CreateColumn("ThumbnailPhotoFileName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("LargePhoto", new SqlValueType(SqlDataType.VarBinaryMax)); - t.CreateColumn("LargePhotoFileName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("Customer"); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CustomerType", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("CustomerAddress"); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeeAddress"); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef ea = Sql.TableRef(t); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("VendorAddress"); - t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("ProductVendor"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AverageLeadTime", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StandardPrice", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("LastReceiptCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("LastReceiptDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("MinOrderQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("MaxOrderQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("OnOrderQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("BillOfMaterials"); - t.CreateColumn("BillOfMaterialsID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductAssemblyID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ComponentID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("BOMLevel", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("PerAssemblyQty", new SqlValueType(SqlDataType.Decimal)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("PurchaseOrderHeader"); - t.CreateColumn("PurchaseOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("RevisionNumber", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("OrderDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ShipDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("SubTotal", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("TaxAmt", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Freight", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("TotalDue", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("VendorContact"); - t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("ContactCreditCard"); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("StoreContact"); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("PurchaseOrderDetail"); - t.CreateColumn("PurchaseOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("PurchaseOrderDetailID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("DueDate", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("UnitPrice", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReceivedQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("RejectedQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StockedQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("WorkOrderRouting"); - t.CreateColumn("WorkOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("OperationSequence", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ScheduledStartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ScheduledEndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ActualStartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ActualEndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ActualResourceHrs", new SqlValueType(SqlDataType.Decimal)); - t.CreateColumn("PlannedCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("CountryRegionCurrency"); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CurrencyCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductModelProductDescriptionCulture"); - t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductDescriptionID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CultureID", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("CurrencyRate"); - t.CreateColumn("CurrencyRateID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CurrencyRateDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("FromCurrencyCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ToCurrencyCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("AverageRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("EndOfDayRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderDetail"); - t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SalesOrderDetailID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CarrierTrackingNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("UnitPrice", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("UnitPriceDiscount", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("LineTotal", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderHeaderSalesReason"); - t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SalesReasonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeeDepartmentHistory"); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("DepartmentID", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ShiftID", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductDocument"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("DocumentID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeePayHistory"); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("RateChangeDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("Rate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("PayFrequency", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesPerson"); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SalesQuota", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Bonus", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("CommissionPct", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("SalesYTD", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("SalesLastYear", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesPersonQuotaHistory"); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("QuotaDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("SalesQuota", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesTerritoryHistory"); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductModelIllustration"); - t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("IllustrationID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductInventory"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Shelf", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Bin", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("WorkOrder"); - t.CreateColumn("WorkOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StockedQty", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ScrappedQty", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("DueDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ScrapReasonID", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("TransactionHistory"); - t.CreateColumn("TransactionID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReferenceOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReferenceOrderLineID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TransactionDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("TransactionType", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("ShoppingCartItem"); - t.CreateColumn("ShoppingCartItemID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ShoppingCartID", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("DateCreated", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductListPriceHistory"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ListPrice", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SpecialOfferProduct"); - t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductCostHistory"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("StandardCost", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Person"].CreateTable("Address"); - t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AddressLine1", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("AddressLine2", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("City", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("PostalCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef a = Sql.TableRef(t); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("Vendor"); - t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CreditRating", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("PreferredVendorStatus", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("ActiveFlag", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("PurchasingWebServiceURL", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderHeader"); - t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("RevisionNumber", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("OrderDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("DueDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ShipDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("OnlineOrderFlag", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("SalesOrderNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("PurchaseOrderNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("BillToAddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ShipToAddressID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("CreditCardApprovalCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CurrencyRateID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("SubTotal", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("TaxAmt", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Freight", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("TotalDue", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Comment", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("Employee"); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("NationalIDNumber", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("LoginID", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ManagerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("BirthDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("MaritalStatus", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Gender", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("HireDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("SalariedFlag", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("VacationHours", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("SickLeaveHours", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("CurrentFlag", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef e = Sql.TableRef(t); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductProductPhoto"); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductPhotoID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Primary", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Person"].CreateTable("StateProvince"); - t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StateProvinceCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("IsOnlyStateProvinceFlag", new SqlValueType(SqlDataType.Boolean)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef sp = Sql.TableRef(t); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductModel"); - t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CatalogDescription", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("Instructions", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("Product"); - c = t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - c.SequenceDescriptor = new SequenceDescriptor(c, 1, 1); - c.IsNullable = false; - c = t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar, 50)); - c.IsNullable = false; - c = t.CreateColumn("ProductNumber", new SqlValueType(SqlDataType.VarChar, 25)); - c.IsNullable = false; - c = t.CreateColumn("MakeFlag", new SqlValueType(SqlDataType.Boolean)); - c.DefaultValue = 1; - c.IsNullable = false; - c = t.CreateColumn("FinishedGoodsFlag", new SqlValueType(SqlDataType.Boolean)); - c.DefaultValue = 1; - c.IsNullable = false; - c = t.CreateColumn("Color", new SqlValueType(SqlDataType.VarChar, 15)); - c = t.CreateColumn("SafetyStockLevel", new SqlValueType(SqlDataType.Int16)); - c.IsNullable = false; - c = t.CreateColumn("ReorderPoint", new SqlValueType(SqlDataType.Int16)); - c.IsNullable = false; - c = t.CreateColumn("StandardCost", new SqlValueType(SqlDataType.Money)); - c.IsNullable = false; - c = t.CreateColumn("ListPrice", new SqlValueType(SqlDataType.Money)); - c.IsNullable = false; - c = t.CreateColumn("Size", new SqlValueType(SqlDataType.VarChar, 5)); - c = t.CreateColumn("SizeUnitMeasureCode", new SqlValueType(SqlDataType.Char, 3)); - c = t.CreateColumn("WeightUnitMeasureCode", new SqlValueType(SqlDataType.Char, 3)); - t.CreateColumn("Weight", new SqlValueType(SqlDataType.Decimal, 8, 2)); - c = t.CreateColumn("DaysToManufacture", new SqlValueType(SqlDataType.Int32)); - c.IsNullable = false; - c = t.CreateColumn("ProductLine", new SqlValueType(SqlDataType.Char, 2)); - c = t.CreateColumn("Class", new SqlValueType(SqlDataType.Char, 2)); - c = t.CreateColumn("Style", new SqlValueType(SqlDataType.Char, 2)); - t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); - c = t.CreateColumn("SellStartDate", new SqlValueType(SqlDataType.DateTime)); - c.IsNullable = false; - t.CreateColumn("SellEndDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("DiscontinuedDate", new SqlValueType(SqlDataType.DateTime)); - c = t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - c.DefaultValue = Sql.CurrentDate(); - c.IsNullable = false; - SqlTableRef st = Sql.TableRef(t); - SqlTableColumn col; - col = st["Class"]; - t.CreateCheckConstraint("CK_Product_Class", Sql.Upper(st["Class"]) == 'H' || - Sql.Upper(st["Class"]) == 'M' || - Sql.Upper(st["Class"]) == 'L' || - Sql.IsNull(st["Class"])); - t.CreateCheckConstraint("CK_Product_DaysToManufacture", Sql.Upper(st["DaysToManufacture"]) >= 0); - t.CreateCheckConstraint("CK_Product_ListPrice", Sql.Upper(st["ListPrice"]) >= 0); - t.CreateCheckConstraint("CK_Product_ProductLine", Sql.Upper(st["ProductLine"]) == 'R' || - Sql.Upper(st["ProductLine"]) == 'M' || - Sql.Upper(st["ProductLine"]) == 'T' || - Sql.Upper(st["ProductLine"]) == 'S' || - Sql.IsNull(st["ProductLine"])); - t.CreateCheckConstraint("CK_Product_ReorderPoint", Sql.Upper(st["ReorderPoint"]) > 0); - t.CreateCheckConstraint("CK_Product_SafetyStockLevel", Sql.Upper(st["SafetyStockLevel"]) > 0); - t.CreateCheckConstraint("CK_Product_SellEndDate", Sql.Upper(st["SellEndDate"]) > st["SellStartDate"] || - Sql.IsNull(st["SellEndDate"])); - t.CreateCheckConstraint("CK_Product_StandardCost", Sql.Upper(st["StandardCost"]) >= 0); - t.CreateCheckConstraint("CK_Product_Style", Sql.Upper(st["Style"]) == 'U' || - Sql.Upper(st["Style"]) == 'M' || - Sql.Upper(st["Style"]) == 'W' || - Sql.IsNull(st["Style"])); - t.CreateCheckConstraint("CK_Product_Weight", Sql.Upper(st["Weight"]) > 0); - t.CreatePrimaryKey("PK_Product_ProductID", t.TableColumns["ProductID"]); - cs = t.CreateForeignKey("FK_Product_ProductModel_ProductModelID"); - ((ForeignKey)cs).Columns.Add(t.TableColumns["ProductModelID"]); - ((ForeignKey)cs).ReferencedColumns.Add(MyCatalog.Schemas["Production"].Tables["ProductModel"].TableColumns["ProductModelID"]); - - t = MyCatalog.Schemas["Person"].CreateTable("Contact"); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("NameStyle", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("FirstName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("MiddleName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("LastName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Suffix", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("EmailAddress", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("EmailPromotion", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Phone", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("PasswordHash", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("PasswordSalt", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("AdditionalContactInfo", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef cRef = Sql.TableRef(t); - - t = MyCatalog.Schemas["Production"].CreateTable("UnitMeasure"); - t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductReview"); - t.CreateColumn("ProductReviewID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ReviewerName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ReviewDate", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EmailAddress", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Rating", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Comments", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductSubcategory"); - t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ProductCategoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Person"].CreateTable("AddressType"); - t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesReason"); - t.CreateColumn("SalesReasonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ReasonType", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("Department"); - t.CreateColumn("DepartmentID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("GroupName", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Person"].CreateTable("CountryRegion"); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - SqlTableRef cr = Sql.TableRef(t); - - t = MyCatalog.Schemas["Production"].CreateTable("Culture"); - t.CreateColumn("CultureID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("Currency"); - t.CreateColumn("CurrencyCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Person"].CreateTable("ContactType"); - t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesTaxRate"); - t.CreateColumn("SalesTaxRateID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("TaxType", new SqlValueType(SqlDataType.Int16)); - t.CreateColumn("TaxRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("Location"); - t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CostRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("Availability", new SqlValueType(SqlDataType.Decimal)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("SalesTerritory"); - t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("Group", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("TaxRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("SalesYTD", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("SalesLastYear", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("CostYTD", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("CostLastYear", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ScrapReason"); - t.CreateColumn("ScrapReasonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("Shift"); - t.CreateColumn("ShiftID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("StartTime", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("EndTime", new SqlValueType(SqlDataType.DateTime)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Production"].CreateTable("ProductCategory"); - t.CreateColumn("ProductCategoryID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Purchasing"].CreateTable("ShipMethod"); - t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("ShipBase", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ShipRate", new SqlValueType(SqlDataType.Money)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("Store"); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Demographics", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["Sales"].CreateTable("Individual"); - t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Demographics", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - t = MyCatalog.Schemas["HumanResources"].CreateTable("JobCandidate"); - t.CreateColumn("JobCandidateID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); - t.CreateColumn("Resume", new SqlValueType(SqlDataType.Text)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); - - SqlSelect select = Sql.Select(e); - select.From.InnerJoin(cRef, cRef["ContactID"] == e["ContactID"]); - select.From.InnerJoin(ea, e["EmployeeID"] == ea["EmployeeID"]); - select.From.InnerJoin(a, ea["AddressID"] == a["AddressID"]); - select.From.InnerJoin(sp, sp["StateProvinceID"] == a["StateProvinceID"]); - select.From.InnerJoin(cr, cr["CountryRegionCode"] == sp["CountryRegionCode"]); - select.Columns.AddRange(e["EmployeeID"], cRef["Title"], cRef["FirstName"], cRef["MiddleName"], - cRef["LastName"], cRef["Suffix"]); - select.Columns.Add(e["Title"], "JobTitle"); - select.Columns.AddRange(cRef["Phone"], cRef["EmailAddress"], cRef["EmailPromotion"], - a["AddressLine1"], a["AddressLine2"], a["City"]); - select.Columns.Add(sp["Name"], "StateProvinceName"); - select.Columns.Add(a["PostalCode"]); - select.Columns.Add(cr["Name"], "CountryRegionName"); - select.Columns.Add(cRef["AdditionalContactInfo"]); - - v = MyCatalog.Schemas["HumanResources"].CreateView("vEmployee", - Sql.Native(mDriver.Compile(select).CommandText)); - } - /**/ - - #endregion - } - - [OneTimeTearDown] - public virtual void FixtureTearDown() - { - if (Connection!=null) { - if (Connection.State==ConnectionState.Open) - Connection.Close(); - } - } - - - [Test] - public void ReadServerInfoTest() - { - ServerInfo si = Driver.ServerInfo; - } - - [Test] - public virtual void ModelTest() - { - try { - Connection.BeginTransaction(); - - //Create model - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - foreach (Schema sch in MyCatalog.Schemas) { - batch.Add(SqlDdl.Create(sch)); - } - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - Console.WriteLine(cmd.CommandText); - cmd.ExecuteNonQuery(); - } - - //Extract initial model - { - var extractedCatalog = Driver.ExtractCatalog(Connection); - new CatalogComparer(Connection) - .CompareCatalogs(MyCatalog, extractedCatalog); - } - - //Alter model - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - - //Alter sequence - { - Sequence seq = MyCatalog.Schemas["Sch2"].Sequences["Seq2"]; - seq.SequenceDescriptor.Increment = 4; - seq.SequenceDescriptor.MaxValue = null; - seq.SequenceDescriptor.MinValue = null; - seq.SequenceDescriptor.StartValue = 22; - seq.SequenceDescriptor.IsCyclic = false; - SqlAlterSequence stmt = SqlDdl.Alter(seq, seq.SequenceDescriptor); - batch.Add(stmt); - } - - //Alter table - { - Table t = MyCatalog.Schemas["Sch1"].Tables["T1"]; - TableColumn col = null; - //Add column - { - col = t.CreateColumn("newCol", new SqlValueType(SqlType.Decimal, 30, 10)); - col.IsNullable = false; - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddColumn(col)); - batch.Add(stmt); - } - //Set default - { - col.DefaultValue = 543.21m; - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.SetDefault(col.DefaultValue, col)); - batch.Add(stmt); - } - - //Add check constraint - { - CheckConstraint cc = t.CreateCheckConstraint("newCheckConstraint", SqlDml.TableRef(t).Columns["newCol"] > 0); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(cc)); - batch.Add(stmt); - } - - //Add unique constraint - { - UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["newCol"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); - batch.Add(stmt); - } - - //Add foreign key - { - ForeignKey fk = t.CreateForeignKey("newForeignKey"); - fk.Columns.Add(col); - fk.ReferencedTable = t; - fk.ReferencedColumns.Add(col); - fk.MatchType = SqlMatchType.Full; - fk.OnDelete = ReferentialAction.SetDefault; - fk.OnUpdate = ReferentialAction.Cascade; - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(fk)); - batch.Add(stmt); - } - } - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - //Execute - cmd.ExecuteNonQuery(); - } - - //Extract altered model - { - var extractedCatalog = Driver.ExtractCatalog(Connection); - new CatalogComparer(Connection) - .CompareCatalogs(MyCatalog, extractedCatalog); - } - - - //Alter model again - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - - //Alter table - { - Table t = MyCatalog.Schemas["Sch1"].Tables["T1"]; - TableColumn col = t.TableColumns["newCol"]; - Assert.IsNotNull(col); - //Drop constraints - { - SqlAlterTable stmt = null; - - CheckConstraint cc = t.TableConstraints["newCheckConstraint"] as CheckConstraint; - Assert.IsNotNull(cc); - t.TableConstraints.Remove(cc); - stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(cc)); - batch.Add(stmt); - - ForeignKey fk = t.TableConstraints["newForeignKey"] as ForeignKey; - Assert.IsNotNull(fk); - t.TableConstraints.Remove(fk); - stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(fk)); - batch.Add(stmt); - - UniqueConstraint uc = t.TableConstraints["newUniqueConstraint"] as UniqueConstraint; - Assert.IsNotNull(uc); - t.TableConstraints.Remove(uc); - stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(uc)); - batch.Add(stmt); - } - - //Drop default - { - col.DefaultValue = null; - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropDefault(col)); - batch.Add(stmt); - } - - //Drop column - { - t.TableColumns.Remove(col); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropColumn(col)); - batch.Add(stmt); - } - } - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - //Execute - cmd.ExecuteNonQuery(); - } - - //Extract altered model again - { - var extractedCatalog = Driver.ExtractCatalog(Connection); - new CatalogComparer(Connection) - .CompareCatalogs(MyCatalog, extractedCatalog); - } - - //Manipulate data - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - SqlInsert insert; - SqlUpdate update; - SqlDelete delete; - SqlTableRef t1 = SqlDml.TableRef(MyCatalog.Schemas["Sch1"].Tables["T1"]); - //Should insert default values - //insert = Sql.Insert(t1); - //batch.Add(insert); - - insert = SqlDml.Insert(t1); - insert.Values.Add(t1["Text?"], SqlDml.Null); - insert.Values.Add(t1["Int8"], Int64.MaxValue); - batch.Add(insert); - - //set FK to self - update = SqlDml.Update(t1); - update.Values.Add(t1["Int4?"], SqlDml.FunctionCall("currval", @"""Sch1"".""T1Seq""")); - update.Values.Add(t1["Text?"], "new text"); - batch.Add(update); - - delete = SqlDml.Delete(t1); - batch.Add(delete); - - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - - - //Drop model - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - - foreach (Schema sch in MyCatalog.Schemas) { - batch.Add(SqlDdl.Drop(sch)); - } - - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - } - finally { - Connection.Rollback(); - } - } - - [Test] - public void ExpressionTest() - { - SqlSelect q = SqlDml.Select(); - - #region Limits - - q.Columns.Add(SqlDml.Power(SqlDml.Cast(10, SqlType.Decimal), 50)); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(DateTime.MinValue), SqlType.DateTime), "datetime min"); - //casting in the DBMS rounds to 100000101 00:00:00 somewhy (?) - //q.Columns.Add(Sql.Cast(Sql.Literal(DateTime.MaxValue), SqlDataType.DateTime, Driver.ServerInfoProvider.MaxDateTimePrecision,0), "datetime max"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int16.MinValue), SqlType.Int16), "int16 min"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int16.MaxValue), SqlType.Int16), "int16 max"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int32.MinValue), SqlType.Int32), "int32 min"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int32.MaxValue), SqlType.Int32), "int32 max"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int64.MinValue), SqlType.Int64), "int64 min"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int64.MaxValue), SqlType.Int64), "int64 max"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Decimal.MinValue), SqlType.Decimal), "decimal min"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Decimal.MaxValue), SqlType.Decimal), "decimal max"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Single.MinValue), SqlType.Float), "float min"); - q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Single.MaxValue), SqlType.Float), "float max"); - - //1.79769313486231E308 instead of 1.79769313486232E308 - //q.Columns.Add(Sql.Cast(Sql.Literal(Double.MinValue), SqlDataType.Double), "double min"); - //1.79769313486231E308 instead of 1.79769313486232E308 - //q.Columns.Add(Sql.Cast(Sql.Literal(Double.MaxValue), SqlDataType.Double), "double max"); - - q.Columns.Add(TimeSpan.MinValue, "interval min"); - q.Columns.Add(TimeSpan.MaxValue, "interval max"); - - #endregion - - #region Literal - - q.Columns.Add((byte) 5, "literal_byte"); - q.Columns.Add((sbyte) 5, "literal_sbyte"); - q.Columns.Add((short) 5, "literal_short"); - q.Columns.Add((ushort) 5, "literal_ushort"); - q.Columns.Add(5, "literal_int"); - q.Columns.Add((uint) 5, "literal_uint"); - q.Columns.Add((long) 5, "literal_long"); - q.Columns.Add((ulong) 5, "literal_ulong"); - q.Columns.Add((decimal) 5.12, "literal_decimal"); - q.Columns.Add((float) 5.12, "literal_float"); - q.Columns.Add(5.12, "literal_double"); - q.Columns.Add('\\', "literal_char"); - q.Columns.Add(@"'\", "literal_string"); - q.Columns.Add(true, "literal_bool"); - q.Columns.Add(!SqlDml.Literal(false), "not_false"); - q.Columns.Add(SqlDml.Literal(false)!=true, "false_neq_true"); - q.Columns.Add(new DateTime(2004, 10, 22, 13, 45, 32, 987), "literal_datetime"); - q.Columns.Add(TimeSpan.FromTicks(0), "literal_timespan1"); - q.Columns.Add(TimeSpan.FromTicks(-5997695706986593470L), "literal_timespan2"); - q.Columns.Add(TimeSpan.FromTicks(1626708734287608436L), "literal_timespan3"); - q.Columns.Add(Guid.NewGuid().ToByteArray(), "bytearray"); - q.Columns.Add(new byte[] {0, 1, 0, 1, 0, 143, 240, 255, 0}, "bytearray2"); - - #endregion - - #region Bit operators - - q.Columns.Add(SqlDml.BitNot(SqlDml.BitNot(5435))==5435, "bitnot"); - q.Columns.Add(SqlDml.BitAnd(6, 3)==2, "bitand1"); - q.Columns.Add(SqlDml.BitAnd(SqlDml.BitOr(3, 6), 10)==2, "bitand2"); - q.Columns.Add(SqlDml.BitXor(3, 6)==5, "bitxor1"); - - #endregion - - #region Math operations - - q.Columns.Add(SqlDml.Literal(-1234567) < -123456, "less1"); - q.Columns.Add(SqlDml.Literal(-123456.7) < -12345.6, "less2"); - q.Columns.Add(SqlDml.Literal(-123456.7m) < -12345.6m, "less3"); - q.Columns.Add(SqlDml.Literal(12) <= 12, "leq1"); - q.Columns.Add(SqlDml.Literal(12) >= 12, "geq1"); - q.Columns.Add(SqlDml.Literal(13) >= 12, "geq2"); - q.Columns.Add(SqlDml.Literal(12)==12, "eq"); - q.Columns.Add(SqlDml.Literal(12)!=13, "neq"); - q.Columns.Add(SqlDml.Literal(14) > 13, "greater"); - q.Columns.Add(SqlDml.Square(4)==16, "square"); - q.Columns.Add(SqlDml.Between(SqlDml.Rand(), 0, 1), "rand2"); - q.Columns.Add(SqlDml.Between(SqlDml.Rand(8), 0, 1), "rand"); - q.Columns.Add(SqlDml.Abs(10.3m)==10.3m, "abs1"); - q.Columns.Add(SqlDml.Abs(-140.3m)==140.3m, "abs2"); - q.Columns.Add(SqlDml.Literal(20) % 7==6, "modulo"); - q.Columns.Add(-SqlDml.Literal(5)==-5, "negate"); - q.Columns.Add(SqlDml.Literal(2) + 3 * SqlDml.Literal(4)==14, "right operation order"); - q.Columns.Add(SqlDml.Cast(3.4564, SqlType.Int16)==3, "cast"); - q.Columns.Add(SqlDml.Cast(-3.4564, SqlType.Int16)==-3, "cast2"); - q.Columns.Add(SqlDml.Cast(SqlDml.Floor(3.4786), SqlType.Int32)==3, "floor"); - q.Columns.Add(SqlDml.Ceiling(3.4564)==4, "ceiling"); - q.Columns.Add(SqlDml.Not(SqlDml.Equals(5, 6)), "not"); - q.Columns.Add(SqlDml.NotEquals(5, 6), "notequals"); - q.Columns.Add(SqlDml.Exp(0)==1, "exp"); - q.Columns.Add(SqlDml.Power(5, 3)==125, "power"); - q.Columns.Add(SqlDml.Sign(55)==1, "sign1"); - q.Columns.Add(SqlDml.Sign(-55)==-1, "sign2"); - q.Columns.Add(SqlDml.Sign(0)==0, "sign3"); - q.Columns.Add(SqlDml.Sqrt(64)==8, "sqrt"); - - #endregion - - #region String operations - - q.Columns.Add('\\'=='\\', "char_equals"); - q.Columns.Add('\\'!='\'', "char_not_equals"); - q.Columns.Add(@"'\"==@"'\", "string_equals"); - q.Columns.Add(@"'\"!=@"'\\", "string_not_equals"); - q.Columns.Add(SqlDml.CharLength('F')==1, "char_length1"); - q.Columns.Add(SqlDml.CharLength('0')==1, "charlength1"); - q.Columns.Add(SqlDml.CharLength(SqlDml.Literal('F'))==1, "char_length4"); - q.Columns.Add(SqlDml.CharLength("0123456789")==10, "charlength2"); - q.Columns.Add(SqlDml.CharLength(@"'\""""")==4, "string_length1"); - q.Columns.Add(SqlDml.CharLength(SqlDml.Literal(@"'\"""""))==4, "string_length2"); - q.Columns.Add(SqlDml.Trim(" 555 ")=="555", "trim1"); - q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Both)=="555", "trim_both"); - q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Leading)=="555 ", "trim_leading"); - q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Trailing)==" 555", "trim_trailing"); - q.Columns.Add(SqlDml.Trim("555cccc", SqlTrimType.Trailing, "c")=="555", "trim_trailing2"); - q.Columns.Add(SqlDml.Trim("555cccc", SqlTrimType.Leading, "5")=="cccc", "trim_leading2"); - q.Columns.Add(SqlDml.Like("Xtensive", "X%"), "like_%"); - q.Columns.Add(!SqlDml.Like("Xtensive", "%ee%"), "like_%ee%_1"); - q.Columns.Add(SqlDml.NotLike("Xtensive", "%ee%"), "like_%ee%_2"); - q.Columns.Add(SqlDml.Like("Xtensive", "X__n__v_"), "like_Xnv"); - q.Columns.Add(SqlDml.Substring("Xtensive", 2, 3)=="ens", "substring0"); - q.Columns.Add(SqlDml.Substring("Xtensive", 2)=="ensive", "substring with one parameter"); - q.Columns.Add(SqlDml.Position('E', "WEB")==1, "position0"); - q.Columns.Add(2 * SqlDml.Position('E', "WEB")==2, "position1"); - q.Columns.Add(2 * SqlDml.Position('E', "WEB") / 2==1, "position2"); - q.Columns.Add(SqlDml.Concat('0', SqlDml.Concat("12345", "6789"))=="0123456789", "concat"); - - #endregion - - #region Datetime, interval operations - - q.Columns.Add(SqlDml.CurrentDate()==SqlDml.FunctionCall("date_trunc", "day", SqlDml.CurrentTimeStamp()), "current_date_current_timestamp"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, new DateTime(2004, 10, 24))==2004, "extract_year"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Month, new DateTime(2004, 10, 24))==10, "extract_month"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, new DateTime(2004, 10, 24))==24, "extract_day"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, new DateTime(2004, 10, 24))==0, "extract_hour"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, new DateTime(2000, 9, 12, 23, 45, 11, 234))==45, "extract_minute"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Second, new DateTime(2000, 9, 12, 23, 45, 11, 234))==11, "extract_second"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Millisecond, new DateTime(2000, 9, 12, 23, 45, 11, 234))==234, "extract_milliseconds"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, new TimeSpan(1, -2, 200, -40, 432))==1, "interval_extract_day"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, new TimeSpan(1, -2, 200, -40, 432))==1, "interval_extract_hour"); - q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, new TimeSpan(1, -2, 200, -40, 432))==19, "interval_extract_minute"); - //8.0: small difference (7E-13), 8.2: OK - //q.Columns.Add(Sql.Extract(SqlDateTimePart.Second, new TimeSpan(1, -2, 200, -40, 432)) == 20.432m, "interval_extract_second"); - //8.0: small difference (7E-13), 8.2: OK - //q.Columns.Add(Sql.Extract(SqlDateTimePart.Millisecond, new TimeSpan(1, -2, 200, -40, 432)) == 20432, "interval_extract_millisecond"); - q.Columns.Add(!SqlDml.Overlaps(SqlDml.Row(new DateTime(2003, 10, 26), new DateTime(2003, 10, 27)), SqlDml.Row(new DateTime(2003, 10, 27), new DateTime(2003, 10, 28))), "overlaps1"); - q.Columns.Add(SqlDml.Overlaps(SqlDml.Row(new DateTime(2004, 10, 26), new DateTime(2004, 10, 27, 1, 1, 1)), SqlDml.Row(new DateTime(2004, 10, 27), new DateTime(2004, 10, 28))), "overlaps2"); - q.Columns.Add(SqlDml.Overlaps(SqlDml.Literal(new DateTime(2005, 10, 26)), new DateTime(2005, 10, 27, 1, 1, 1), new DateTime(2005, 10, 27), new DateTime(2005, 10, 28)), "overlaps3"); - q.Columns.Add(SqlDml.Overlaps(SqlDml.Literal(new DateTime(2006, 10, 26)), new TimeSpan(1, 1, 1, 1), new DateTime(2006, 10, 27), new TimeSpan(1, 0, 0, 0)), "overlaps4"); - - q.Columns.Add(SqlDml.Literal(new TimeSpan(12, 13, 14, 15))==SqlDml.Literal(new TimeSpan(12, 13, 14, 15))); - q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 20, 13, 54, 1, 527)==new TimeSpan(0), "datetime_sub_1"); - q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 13, 54, 1, 527)==new TimeSpan(18, 0, 0, 0), "datetime_sub_2"); - q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 54, 1, 527)==new TimeSpan(17, 22, 0, 0), "datetime_sub_3"); - q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 1, 527)==new TimeSpan(17, 22, 22, 0), "datetime_sub_4"); - q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 43, 527)==new TimeSpan(17, 22, 21, 18), "datetime_sub_5"); - //not equal - //q.Columns.Add(Sql.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 43, 211) == new TimeSpan(17, 22, 21, 18, 316), "datetime_sub_6"); - - #endregion - - #region Arrays - - q.Columns.Add(SqlDml.Array(true, false, true)); - q.Columns.Add(SqlDml.Array((byte) 1, (byte) 2, (byte) 3)); - q.Columns.Add(new byte[] {1, 2, 3}); - q.Columns.Add(SqlDml.Array((ushort) 1, (ushort) 2, (ushort) 3)); - q.Columns.Add(SqlDml.Array((sbyte) -1, (sbyte) -2, (sbyte) -3)); - q.Columns.Add(SqlDml.Array((short) -1, (short) -2, (short) -3)); - q.Columns.Add(SqlDml.Array(-100000, -200000, -300000)); - q.Columns.Add(SqlDml.Array(-100000000, -200000000, -300000000)); - q.Columns.Add(SqlDml.Array(-100000000000, -200000000000, -300000000000)); - q.Columns.Add(SqlDml.Array(100000000, 200000000, 300000000)); - q.Columns.Add(SqlDml.Array(100000000000, 200000000000, 300000000000)); - q.Columns.Add(SqlDml.Array("C", "#")); - q.Columns.Add(SqlDml.Array(DateTime.Now, DateTime.Now, DateTime.Now)); - q.Columns.Add(SqlDml.Array(new TimeSpan(0), new TimeSpan(97593738954343L), new TimeSpan(-99875392765867893L))); - q.Columns.Add(SqlDml.Array("123", "456", "789")); - q.Columns.Add(SqlDml.Array(1.5, 2.6, 3.7)); - q.Columns.Add(SqlDml.Array(1.5m, 2.6m, 3.7m)); - q.Columns.Add(SqlDml.Array(new string[] {})); - - #endregion - - #region In, NotIn array - - q.Columns.Add(!SqlDml.In(true, SqlDml.Array(new bool[0]))); - q.Columns.Add(SqlDml.NotIn(true, SqlDml.Array(new bool[0]))); - q.Columns.Add(SqlDml.NotIn(true, SqlDml.Array(false))); - q.Columns.Add(SqlDml.In(true, SqlDml.Array(true, false))); - q.Columns.Add(SqlDml.NotIn('T', SqlDml.Array(new char[0]))); - q.Columns.Add(SqlDml.NotIn('Z', SqlDml.Array('g', 'i'))); - q.Columns.Add(SqlDml.In('I', SqlDml.Array('u', 'I', 'K'))); - q.Columns.Add(SqlDml.NotIn("O", SqlDml.Array(new string[0]))); - q.Columns.Add(SqlDml.NotIn("Ur", SqlDml.Array("O", "i"))); - q.Columns.Add(SqlDml.In("Oz", SqlDml.Array("6gfwerw", "", "Oz"))); - q.Columns.Add(SqlDml.In("", SqlDml.Array("6gfwerw", "", "Oz"))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new byte[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new byte[] {12, 76, 45, 91}))); - q.Columns.Add(SqlDml.In(168, SqlDml.Array(new byte[] {233, 128, 168}))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new sbyte[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new sbyte[] {12, 76, 45, 91}))); - q.Columns.Add(SqlDml.In(-33, SqlDml.Array(new sbyte[] {-33, 127, 68}))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new int[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new[] {1280942, 76, -45, 1994794321}))); - q.Columns.Add(SqlDml.In(168, SqlDml.Array(new[] {2864333, -1238974228, 168}))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new uint[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new uint[] {12, 76, 45, 91}))); - q.Columns.Add(SqlDml.In(168, SqlDml.Array(new uint[] {2923733, 10702228, 168}))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new long[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new long[] {12, 76, -49328755, 91}))); - q.Columns.Add(SqlDml.In(168, SqlDml.Array(new[] {-928438632233, 128, 168}))); - q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new ulong[0]))); - q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new ulong[] {1219859843, 76, 454876485389732323, 91}))); - q.Columns.Add(SqlDml.In(233, SqlDml.Array(new ulong[] {233, 128, 15978327274368}))); - q.Columns.Add(SqlDml.NotIn(DateTime.Now, SqlDml.Array(new DateTime[0]))); - q.Columns.Add(SqlDml.NotIn(new DateTime(1974, 11, 12), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1874, 1, 3), new DateTime(2004, 12, 19)}))); - q.Columns.Add(SqlDml.In(new DateTime(1974, 11, 12, 3, 12, 45, 397), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1974, 11, 12, 3, 12, 45, 397), new DateTime(2004, 12, 19)}))); - q.Columns.Add(SqlDml.NotIn(new DateTime(1974, 11, 12, 3, 12, 45, 397), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1974, 11, 12, 3, 12, 45, 398), new DateTime(2004, 12, 19)}))); - - #endregion - - #region All, any, some - - q.Columns.Add(3 > SqlDml.All(new Func(delegate { - SqlSelect q2 = SqlDml.Select(); - q2.Columns.Add(2); - return q2; - })())); - q.Columns.Add(3 > SqlDml.Any(new Func(delegate { - SqlSelect q2 = SqlDml.Select(); - q2.Columns.Add(2); - return q2; - })())); - q.Columns.Add(3 > SqlDml.Some(new Func(delegate { - SqlSelect q2 = SqlDml.Select(); - q2.Columns.Add(2); - return q2; - })())); - - #endregion - - #region Row - - q.Columns.Add(SqlDml.Row(SqlDml.Acos(SqlDml.Literal(0.4F)), 7, 9), "arithmetic row"); - q.Columns.Add(SqlDml.Row("A", "B", "C"), "string row2"); - q.Columns.Add(SqlDml.Row(SqlDml.Concat("A", "A"), "B", "C"), "string row1"); - - #endregion - - #region Case - - q.Columns.Add(SqlDml.Case(SqlDml.Concat("s", "")).Add("s", SqlDml.Literal(true) || true)); - q.Columns.Add(SqlDml.Case(SqlDml.And(true, false)).Add(false, SqlDml.CharLength(SqlDml.Concat("abc", "def"))==6)); - - #endregion - - #region Other functions, oparators - - q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, 3)==3, "coalesce1"); - q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, SqlDml.Null + 5, 3)==3, "coalesce2"); - q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, SqlDml.Null + 5, 3, 9)==3, "coalesce3"); - q.Columns.Add(SqlDml.IsNotNull('R'), "isnotnull"); - q.Columns.Add(SqlDml.IsNull(SqlDml.Null - 7), "isnull1"); - q.Columns.Add(SqlDml.IsNull(SqlDml.NullIf(5, 5)), "isnull2"); - q.Columns.Add(SqlDml.NullIf(5, 6)==5, "nullif1"); - q.Columns.Add(SqlDml.In('E', SqlDml.Row("'J'", 'E', '\'')), "in_row"); - q.Columns.Add(SqlDml.NotIn('E', SqlDml.Row("'J'", '\\', 'Z')), "not_in_row"); - q.Columns.Add(SqlDml.NotBetween("between'", "bezier'", "lagrange'"), "not_between"); - q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast("", SqlType.VarBinaryMax))==0, "cast_bytea1"); - q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast(@"\050", SqlType.VarBinaryMax))==1, "cast_bytea2"); - q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast(@"abc\\", SqlType.VarBinaryMax))==4, "cast_bytea5"); - - #endregion - - using (var cmd = Connection.CreateCommand(q)) { - using (DbDataReader dr = cmd.ExecuteReader()) { - while (dr.Read()) { - for (int i = 0; i < dr.FieldCount; i++) { - object value = dr.GetValue(i); - if (value is bool) { - Assert.IsTrue(dr.GetBoolean(i), "'" + dr.GetName(i) + "' column is not true!"); - } - } - } - } - } - } - - [Test] - public void UniquePredicateTest() - { - Connection.BeginTransaction(); - try { - SqlBatch batch = SqlDml.Batch(); - TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("unique_pred_test"); - t.PreserveRows = false; - t.CreateColumn("id", new SqlValueType(SqlType.Int32)); - t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; - t.CreateColumn("col2", new SqlValueType(SqlType.Int32)).IsNullable = true; - batch.Add(SqlDdl.Create(t)); - SqlTableRef tref = SqlDml.TableRef(t); - - Action insert = delegate(int id, SqlExpression expr1, SqlExpression expr2) { - SqlInsert ins2 = SqlDml.Insert(tref); - ins2.Values.Add(tref["id"], id); - ins2.Values.Add(tref["col1"], expr1); - ins2.Values.Add(tref["col2"], expr2); - batch.Add(ins2); - }; - //unique part - insert(01, SqlDml.Null, SqlDml.Null); - insert(02, SqlDml.Null, SqlDml.Null); - insert(03, SqlDml.Null, 1); - insert(04, 1, SqlDml.Null); - insert(05, 2, 3); - insert(06, SqlDml.Null, 2); - insert(07, 3, SqlDml.Null); - insert(08, 3, 2); - //non-unique part - insert(10, SqlDml.Null, 2); - insert(11, 3, SqlDml.Null); - insert(12, 3, 2); - - ExecuteNonQuery(batch); - - //query - - SqlSelect initialQuery = SqlDml.Select(tref); - initialQuery.Columns.Add(tref["col1"]); - initialQuery.Columns.Add(tref["col2"]); - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(1); - q.Where = SqlDml.Unique(new Func(delegate { - SqlSelect q2 = SqlDml.Select(tref); - q2.Columns.Add(tref["col1"]); - q2.Columns.Add(tref["col2"]); - -// q2 = initialQuery.Clone() as SqlSelect; - q2.Where = tref["id"] < 10; - return q2; - })()); - AssertQueryExists(q); - } - - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(1); - q.Where = SqlDml.Unique(new Func(delegate { - SqlSelect q2 = SqlDml.Select(tref); - q2.Columns.Add(tref["col1"]); - q2.Columns.Add(tref["col2"]); - return q2; - })()); - - AssertQueryNotExists(q); - } - } - catch (Exception ex) { - Assert.Fail(ex.ToString()); - } - finally { - Connection.Rollback(); - var t = MyCatalog.DefaultSchema.Tables["unique_perd_test"]; - if (t != null) - MyCatalog.DefaultSchema.Tables.Remove(t); - } - } - - [Test] - public void MatchPredicateTest() - { - Connection.BeginTransaction(); - try { - SqlBatch batch = SqlDml.Batch(); - TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("match_pred_test"); - t.PreserveRows = false; - t.CreateColumn("id", new SqlValueType(SqlType.Int32)); - t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; - t.CreateColumn("col2", new SqlValueType(SqlType.Int32)).IsNullable = true; - batch.Add(SqlDdl.Create(t)); - SqlTableRef tref = SqlDml.TableRef(t); - - //fill - { - int id = 1; - Action insert = delegate(SqlExpression expr1, SqlExpression expr2) { - SqlInsert ins2 = SqlDml.Insert(tref); - ins2.Values.Add(tref["id"], id); - ins2.Values.Add(tref["col1"], expr1); - ins2.Values.Add(tref["col2"], expr2); - batch.Add(ins2); - id++; - }; - //unique part - insert(SqlDml.Null, SqlDml.Null); - insert(SqlDml.Null, SqlDml.Null); - insert(SqlDml.Null, 2); - insert(1, SqlDml.Null); - insert(1, 2); - insert(5, SqlDml.Null); - insert(SqlDml.Null, 6); - //non-unique part - insert(SqlDml.Null, 4); - insert(SqlDml.Null, 4); - insert(3, SqlDml.Null); - insert(3, SqlDml.Null); - insert(3, 4); - insert(3, 4); - } - - ExecuteNonQuery(batch); - - //query - SqlSelect testQuery = SqlDml.Select(tref); - testQuery.Columns.Add(tref["col1"]); - testQuery.Columns.Add(tref["col2"]); - - Action matchTesterExists - = delegate(SqlExpression col1, SqlExpression col2, bool unique, SqlMatchType matchType) { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(1); - q.Where = SqlDml.Match(SqlDml.Row(col1, col2), SqlDml.SubQuery(testQuery).Query, unique, matchType); - AssertQueryExists(q); - }; - - Action matchTesterNotExists - = delegate(SqlExpression col1, SqlExpression col2, bool unique, SqlMatchType matchType) { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(1); - q.Where = SqlDml.Match(SqlDml.Row(col1, col2), SqlDml.SubQuery(testQuery).Query, unique, matchType); - AssertQueryNotExists(q); - }; - - //match simple - { - matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.None); - matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 2, false, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 2, true, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 4, false, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 4, true, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 3, false, SqlMatchType.None); - matchTesterExists(SqlDml.Null, 3, true, SqlMatchType.None); - matchTesterExists(9, SqlDml.Null, false, SqlMatchType.None); - matchTesterExists(9, SqlDml.Null, true, SqlMatchType.None); - matchTesterExists(9, SqlDml.Null + 2, true, SqlMatchType.None); - matchTesterExists(1, 2, false, SqlMatchType.None); - matchTesterExists(1, 1 + SqlDml.Literal(1), false, SqlMatchType.None); - matchTesterExists(1, 2, true, SqlMatchType.None); - matchTesterExists(1, 3 - SqlDml.Literal(1), true, SqlMatchType.None); - matchTesterExists(3, 4, false, SqlMatchType.None); - matchTesterExists(3 + SqlDml.Literal(0), 4, false, SqlMatchType.None); - matchTesterNotExists(3, 4, true, SqlMatchType.None); - matchTesterNotExists(3, 4 + SqlDml.Literal(0), true, SqlMatchType.None); - matchTesterNotExists(3, 3, false, SqlMatchType.None); - matchTesterNotExists(3 + SqlDml.Literal(0), 3, false, SqlMatchType.None); - matchTesterNotExists(3, 3, true, SqlMatchType.None); - matchTesterNotExists(3, 3 + SqlDml.Literal(0), true, SqlMatchType.None); - matchTesterNotExists(1, 3, false, SqlMatchType.None); - matchTesterNotExists(1 - SqlDml.Literal(0), 3, false, SqlMatchType.None); - matchTesterNotExists(1, 3, true, SqlMatchType.None); - matchTesterNotExists(1 + SqlDml.Literal(0), 3, true, SqlMatchType.None); - } - - //match full - { - matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.Full); - matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 2, false, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 2, true, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 4, false, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 4, true, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 3, false, SqlMatchType.Full); - matchTesterNotExists(SqlDml.Null, 3, true, SqlMatchType.Full); - matchTesterNotExists(9, SqlDml.Null, false, SqlMatchType.Full); - matchTesterNotExists(9, SqlDml.Null, true, SqlMatchType.Full); - matchTesterExists(1, 2, false, SqlMatchType.Full); - matchTesterExists(1, 2, true, SqlMatchType.Full); - matchTesterExists(3, 4, false, SqlMatchType.Full); - matchTesterNotExists(3, 4, true, SqlMatchType.Full); - matchTesterNotExists(9, 9, false, SqlMatchType.Full); - matchTesterNotExists(9, 9, true, SqlMatchType.Full); - matchTesterNotExists(1, 9, false, SqlMatchType.Full); - matchTesterNotExists(1, 9, true, SqlMatchType.Full); - } - - //match partial - { - matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null + 1, SqlDml.Null - 2, false, SqlMatchType.Partial); - - matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null + 2, SqlDml.Null - 3, true, SqlMatchType.Partial); - - matchTesterExists(SqlDml.Null, 2, false, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null * 4, 1 + SqlDml.Literal(1), false, SqlMatchType.Partial); - - matchTesterNotExists(SqlDml.Null, 2, true, SqlMatchType.Partial); - matchTesterNotExists(SqlDml.Null * 5, 3 - SqlDml.Literal(1), true, SqlMatchType.Partial); - - matchTesterExists(SqlDml.Null, 4, false, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null - 8, SqlDml.Literal(3) + 1, false, SqlMatchType.Partial); - - matchTesterNotExists(SqlDml.Null, 4, true, SqlMatchType.Partial); - matchTesterNotExists(SqlDml.Null / 7, 4 + SqlDml.Literal(0), true, SqlMatchType.Partial); - - matchTesterNotExists(SqlDml.Null, 3, false, SqlMatchType.Partial); - matchTesterNotExists(4 * SqlDml.Null, 3, false, SqlMatchType.Partial); - - matchTesterNotExists(SqlDml.Null, 3, true, SqlMatchType.Partial); - matchTesterNotExists(SqlDml.Null - 6, 3, true, SqlMatchType.Partial); - - matchTesterExists(5, SqlDml.Null, false, SqlMatchType.Partial); - matchTesterExists(1 * SqlDml.Literal(5), SqlDml.Null, false, SqlMatchType.Partial); - - matchTesterExists(5, SqlDml.Null, true, SqlMatchType.Partial); - matchTesterExists(5, SqlDml.Null / 2, true, SqlMatchType.Partial); - - matchTesterExists(SqlDml.Null, 6, false, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null - 0, 6, false, SqlMatchType.Partial); - - matchTesterExists(SqlDml.Null, 6, true, SqlMatchType.Partial); - matchTesterExists(SqlDml.Null, SqlDml.Literal(1) + 5, true, SqlMatchType.Partial); - - matchTesterNotExists(9, SqlDml.Null, false, SqlMatchType.Partial); - matchTesterNotExists(9, SqlDml.Null, true, SqlMatchType.Partial); - - matchTesterExists(1, 2, false, SqlMatchType.Partial); - matchTesterExists(1, 1 + SqlDml.Literal(1), false, SqlMatchType.Partial); - - matchTesterExists(1, 2, true, SqlMatchType.Partial); - matchTesterExists(1, 3 - SqlDml.Literal(1), true, SqlMatchType.Partial); - - matchTesterExists(3, 4, false, SqlMatchType.Partial); - matchTesterExists(3, SqlDml.Square(2), false, SqlMatchType.Partial); - - matchTesterNotExists(3, 4, true, SqlMatchType.Partial); - matchTesterNotExists(SqlDml.Literal(4) - 1, 4, true, SqlMatchType.Partial); - - matchTesterNotExists(9, 9, false, SqlMatchType.Partial); - matchTesterNotExists(9, 3 * SqlDml.Literal(3), false, SqlMatchType.Partial); - - matchTesterNotExists(9, 9, true, SqlMatchType.Partial); - matchTesterNotExists(9, 3 * SqlDml.Literal(3), true, SqlMatchType.Partial); - - matchTesterNotExists(1, 9, false, SqlMatchType.Partial); - matchTesterNotExists(1 + SqlDml.Literal(0), 9, false, SqlMatchType.Partial); - - matchTesterNotExists(1, 9, true, SqlMatchType.Partial); - matchTesterNotExists(1 + SqlDml.Literal(0), 9, true, SqlMatchType.Partial); - } - } - catch (Exception ex) { - Assert.Fail(ex.ToString()); - } - finally { - Connection.Rollback(); - var t = MyCatalog.DefaultSchema.Tables["match_pred_test"]; - if (t!=null) - MyCatalog.DefaultSchema.Tables.Remove(t); - } - } - - [Test] - public void AggregateTest() - { - Connection.BeginTransaction(); - try { - SqlBatch batch = SqlDml.Batch(); - TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("agg_test"); - t.PreserveRows = false; - t.CreateColumn("id", new SqlValueType(SqlType.Int32)); - t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; - batch.Add(SqlDdl.Create(t)); - SqlTableRef tref = SqlDml.TableRef(t); - - Action insert = delegate(int id, SqlExpression expr1) { - SqlInsert ins2 = SqlDml.Insert(tref); - ins2.Values.Add(tref["id"], id); - ins2.Values.Add(tref["col1"], expr1); - batch.Add(ins2); - }; - //unique part - insert(01, 1); - insert(02, SqlDml.Null); - insert(03, 3); - insert(04, 4); - insert(05, 5); - insert(06, SqlDml.Null); - insert(07, 7); - insert(08, 8); - //non-unique part - insert(10, 3); - insert(11, 4); - insert(12, 7); - - ExecuteNonQuery(batch); - - //query - - { - SqlSelect q = SqlDml.Select(tref); - q.Columns.Add(SqlDml.Count(SqlDml.Asterisk)); //0 - q.Columns.Add(SqlDml.Count(tref["col1"])); //1 - q.Columns.Add(SqlDml.Count(tref["col1"], true)); //2 - q.Columns.Add(SqlDml.Min(tref["col1"])); //3 - q.Columns.Add(SqlDml.Min(tref["col1"], true)); //4 - q.Columns.Add(SqlDml.Max(tref["col1"])); //5 - q.Columns.Add(SqlDml.Max(tref["col1"], true)); //6 - q.Columns.Add(SqlDml.Sum(tref["col1"])); //7 - q.Columns.Add(SqlDml.Sum(tref["col1"], true)); //8 - q.Columns.Add(SqlDml.Cast(SqlDml.Avg(tref["col1"]), SqlType.Double)); //9 - q.Columns.Add(SqlDml.Avg(tref["col1"], true)); //10 -->decimal - - - using (DbDataReader dr = ExecuteQuery(q)) { - Assert.IsTrue(dr.Read()); - - //int32-vel nem megy at count()->int64 - Assert.AreEqual(11, dr.GetInt64(0)); //count of rows - Assert.AreEqual(9, dr.GetInt64(1)); //count of not null values - Assert.AreEqual(6, dr.GetInt64(2)); //count of unique not null values - Assert.AreEqual(1, Convert.ToInt32(dr[3])); //min - Assert.AreEqual(1, Convert.ToInt32(dr[4])); //min - Assert.AreEqual(8, Convert.ToInt32(dr[5])); //max - Assert.AreEqual(8, Convert.ToInt32(dr[6])); //max - Assert.AreEqual(42, Convert.ToInt32(dr[7])); //sum not null values - Assert.AreEqual(28, Convert.ToInt32(dr[8])); //sum not null unique values - Assert.AreEqual(Math.Round(42d / 9, 10), Math.Round(dr.GetDouble(9), 10)); //avg not null values - Assert.AreEqual(Math.Round(28d / 6, 10), Math.Round(dr.GetDecimal(10), 10)); //avg not null unique values - - Assert.IsFalse(dr.Read()); - - long l = 4; - //ez megy - int m = (int) l; - //ez nem megy: - //long n = (long)((object)m); - } - } - } - catch (Exception ex) { - Assert.Fail(ex.ToString()); - } - finally { - Connection.Rollback(); - var t = MyCatalog.DefaultSchema.Tables["agg_test"]; - if (t != null) - MyCatalog.DefaultSchema.Tables.Remove(t); - } - } - - - [Test] - public void IntOrderByTest1() - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(2, "col"); - q.OrderBy.Add(1); - using (ExecuteQuery(q)) { - } - } - - [Test] - public void IntOrderByTest2() - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(2, "col"); - q.OrderBy.Add(SqlDml.Order(1)); - using (ExecuteQuery(q)) { - } - } - - [Test] - public void SetOperationTest() - { - Func selectCreator = delegate(int n) { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(n, "col"); - return q; - }; - - ISqlCompileUnit unit; - SqlCompilationResult res; - - { - unit = SqlDml.Union(selectCreator(1), selectCreator(2)); - res = Driver.Compile(unit); - } - - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(SqlDml.In(1, SqlDml.Union(selectCreator(1), selectCreator(2)))); - using (DbDataReader dr = ExecuteQuery(q)) { - bool first = true; - while (dr.Read()) { - if (!first) - Assert.Fail(">1 row"); - Assert.AreEqual(true, dr.GetBoolean(0)); - first = false; - } - if (first) - Assert.Fail("empty result"); - } - } - } - - [Test, Ignore("SQLFIXME")] - public void UnionAndIntersectTest() - { - SqlSelect q = SqlDml.Select(SqlDml.QueryRef( - (SingleNumberSelect(1) - .Union(SingleNumberSelect(2))) - .Intersect(SingleNumberSelect(3) - .Union(SingleNumberSelect(4))))); - q.Columns.Add(1); - - AssertQueryNotExists(q); - } - - [Test] - public void UnionAndExceptTest() - { - SqlSelect q = SqlDml.Select(SqlDml.QueryRef( - (SingleNumberSelect(1) - .Union(SingleNumberSelect(2))) - .Except(SingleNumberSelect(1) - .Union(SingleNumberSelect(2))))); - q.Columns.Add(1); - AssertQueryNotExists(q); - } - - [Test] - public void UnionAllTest() - { - SqlSelect q = SqlDml.Select(SqlDml.QueryRef( - SingleNumberSelect(1).UnionAll(SingleNumberSelect(1)))); - q.Columns.Add(SqlDml.Count(SqlDml.Asterisk)); - - SqlSelect q2 = SqlDml.Select(); - q2.Where = 2==SqlDml.SubQuery(q); - q2.Columns.Add(5); - AssertQueryExists(q2); - } - - [Test] - public void UnionAllWithOrderByTest() - { - SqlSelect q1 = SingleNumberSelect(2); - - SqlSelect q2 = SingleNumberSelect(1); - q2.OrderBy.Add(q2.Columns[0]); - - SqlQueryExpression union = SqlDml.UnionAll(q1, q2); - - using (DbDataReader dr = ExecuteQuery(union)) { - int i; - for (i = 0; dr.Read(); i++) { - int value = Convert.ToInt32(dr[0]); - if (i==0) - Assert.AreEqual(2, value, "First value not 2"); - else if (i==1) - Assert.AreEqual(1, value, "Second value not 1"); - else - Assert.Fail("More than 2 rows"); - } - if (i!=2) - Assert.Fail("Not 2 rows"); - } - } - - [Test] - public void CursorTest() - { - Connection.BeginTransaction(); - try { - SqlBatch batch = SqlDml.Batch(); - TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("cursor_test"); - t.PreserveRows = false; - t.CreateColumn("id", new SqlValueType(SqlType.Int32)); - t.CreateColumn("dt", new SqlValueType(SqlType.DateTime)); - t.CreateColumn("bool", new SqlValueType(SqlType.Boolean)); - batch.Add(SqlDdl.Create(t)); - SqlTableRef tref = SqlDml.TableRef(t); - - //fill - { - int id = 1; - Action insert = delegate(SqlExpression expr1, SqlExpression expr2) { - SqlInsert ins2 = SqlDml.Insert(tref); - ins2.Values.Add(tref["id"], id); - ins2.Values.Add(tref["dt"], expr1); - ins2.Values.Add(tref["bool"], id % 2==0); - batch.Add(ins2); - id++; - }; - insert(new DateTime(2001, 1, 1, 1, 1, 1, 111), 0); - insert(new DateTime(2002, 2, 2, 2, 2, 2, 222), 0); - insert(new DateTime(2003, 3, 3, 3, 3, 3, 333), 0); - insert(new DateTime(2004, 4, 4, 4, 4, 4, 444), 0); - insert(new DateTime(2005, 5, 5, 5, 5, 5, 555), 0); - insert(new DateTime(2006, 6, 6, 6, 6, 6, 666), 0); - insert(new DateTime(2007, 7, 7, 7, 7, 7, 777), 0); - insert(new DateTime(2008, 8, 8, 8, 8, 8, 888), 0); - insert(new DateTime(2009, 9, 9, 9, 9, 9, 999), 0); - } - - ExecuteNonQuery(batch); - //query - { - SqlSelect testQuery = SqlDml.Select(tref); - testQuery.Columns.Add(SqlDml.Asterisk); - testQuery.OrderBy.Add(tref["id"]); - - SqlCursor mycursor = SqlDml.Cursor("mycursor", testQuery); - mycursor.Insensitive = true; - mycursor.WithHold = false; - mycursor.Scroll = true; - - ExecuteNonQuery(mycursor.Declare()); - - Func Execute = delegate(ISqlCompileUnit stmt) { - using (DbDataReader dr = ExecuteQuery(stmt)) { - DataTable result = new DataTable(); - result.Columns.Add("id", typeof (int)); - result.Columns.Add("dt", typeof (DateTime)); - result.Columns.Add("bool", typeof (bool)); - while (dr.Read()) { - result.Rows.Add(Convert.ToInt32(dr["id"]), dr["dt"], dr["bool"]); - } - return result; - } - }; - - - { - ExecuteNonQuery(mycursor.Open()); - { - DataTable result; - SqlFetch f; - - f = mycursor.Fetch(SqlFetchOption.Next); - result = Execute(f); //fetch first row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(1, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, 1); - result = Execute(f); //fetch second row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(2, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, -1); - result = Execute(f); //fetch first row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(1, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, 0); - result = Execute(f); //fetch same row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(1, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, 5); - result = Execute(f); //fetch 6th row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(6, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, -3); - result = Execute(f); //fetch 3th row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(3, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Last); - result = Execute(f); //fetch last row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(9, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Prior); - result = Execute(f); //fetch prior row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(8, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.Absolute, 4); - result = Execute(f); //fetch 4th row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(4, (int) result.Rows[0][0]); - - f = mycursor.Fetch(SqlFetchOption.First); - result = Execute(f); //fetch 1th row - Assert.AreEqual(1, result.Rows.Count); - Assert.AreEqual(1, (int) result.Rows[0][0]); - - /* - f = mycursor.Fetch(SqlFetchOption.Relative,3); - result = Execute(f);//fetch next 3 rows - Assert.AreEqual(3, result.Rows.Count); - Assert.AreEqual(2, (int)result.Rows[0][0]); - Assert.AreEqual(3, (int)result.Rows[1][0]); - Assert.AreEqual(4, (int)result.Rows[2][0]); - - f = mycursor.Fetch(SqlFetchOption.Relative, 6); - result = Execute(f);//fetch next 6 rows (only 5 remaining) - Assert.AreEqual(5, result.Rows.Count); - Assert.AreEqual(5, (int)result.Rows[0][0]); - Assert.AreEqual(6, (int)result.Rows[1][0]); - Assert.AreEqual(7, (int)result.Rows[2][0]); - Assert.AreEqual(8, (int)result.Rows[3][0]); - Assert.AreEqual(9, (int)result.Rows[4][0]); - /**/ - } - ExecuteNonQuery(mycursor.Close()); - - ExecuteNonQuery(mycursor.Open()); - { - } - ExecuteNonQuery(mycursor.Close()); - } - - { - } - } - } - catch (Exception ex) { - Assert.Fail(ex.ToString()); - } - finally { - Connection.Rollback(); - var t = MyCatalog.DefaultSchema.Tables["cursor_test"]; - if (t != null) - MyCatalog.DefaultSchema.Tables.Remove(t); - } - } - -/**/ - - - protected void ExecuteNonQuery(ISqlCompileUnit stmt) - { - using (var cmd = Connection.CreateCommand(stmt)) { - int result = cmd.ExecuteNonQuery(); - } - } - - protected DbDataReader ExecuteQuery(ISqlCompileUnit stmt) - { - using (var cmd = Connection.CreateCommand(stmt)) { - return cmd.ExecuteReader(); - } - } - - protected void AssertQueryExists(ISqlCompileUnit q) - { - using (var cmd = Connection.CreateCommand(q)) { - using (DbDataReader dr = cmd.ExecuteReader()) { - bool exists = false; - while (dr.Read()) { - exists = true; - break; - } - if (!exists) - Assert.Fail("Query not exists."); - } - } - } - - protected void AssertQueryNotExists(ISqlCompileUnit q) - { - using (var cmd = Connection.CreateCommand(q)) { - using (DbDataReader dr = cmd.ExecuteReader()) { - while (dr.Read()) { - Assert.Fail("Query exists."); - } - } - } - } - - protected SqlSelect SingleNumberSelect(int n) - { - SqlSelect q = SqlDml.Select(); - q.Columns.Add(n, "col"); - return q; - } - - - [Test] - public void RenameTest() - { - Schema schema = MyCatalog.CreateSchema("S1"); - Table table = schema.CreateTable("T1"); - table.CreateColumn("C1", new SqlValueType(SqlType.Int32)); - - try { - Connection.BeginTransaction(); - - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - batch.Add(SqlDdl.Create(schema)); - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - - var exModel1 = Driver.ExtractCatalog(Connection); - var exT1 = exModel1.Schemas[schema.DbName].Tables[table.DbName]; - Assert.IsNotNull(exT1); - var exC1 = exT1.TableColumns["C1"]; - Assert.IsNotNull(exC1); - - using (var cmd = Connection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - batch.Add(SqlDdl.Rename(exC1, "C2")); - batch.Add(SqlDdl.Rename(exT1, "T2")); - cmd.CommandText = Driver.Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - - var exModel2 = Driver.ExtractCatalog(Connection); - var exT2 = exModel2.Schemas[schema.DbName].Tables["T2"]; - Assert.IsNotNull(exT2); - var exC2 = exT2.TableColumns["C2"]; - Assert.IsNotNull(exC2); - - } finally { - Connection.Rollback(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data; +using System.Data.Common; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using DataTable=System.Data.DataTable; +using UniqueConstraint=Xtensive.Sql.Model.UniqueConstraint; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture, Explicit] + public class SqlDomTests + { + protected UrlInfo ConnectionUrlInfo + { + get { return TestConnectionInfoProvider.GetConnectionInfo().ConnectionUrl; } + } + + protected string Url + { + get { return ConnectionUrlInfo.Url; } + } + + protected SqlDriver Driver { get; private set; } + + protected SqlConnection Connection { get; private set; } + + protected Catalog MyCatalog { get; private set; } + + protected virtual void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + + [OneTimeSetUp] + public virtual void FixtureSetup() + { + CheckRequirements(); + Driver = TestSqlDriver.Create(Url); + CreateModel(); + Connection = Driver.CreateConnection(); + try { + Connection.Open(); + } + catch (SystemException e) { + Console.WriteLine(e); + } + } + + + protected void CreateModel() + { + { + MyCatalog = new Catalog(ConnectionUrlInfo.GetDatabase()); + + ForeignKey fk; + Index idx; + + Schema sch1 = MyCatalog.CreateSchema("Sch1"); + + Sequence t1_seq = sch1.CreateSequence("T1Seq"); + + Table sch1_t1 = sch1.CreateTable("T1"); + + sch1_t1.CreateColumn("Id", new SqlValueType(SqlType.Int32)); + sch1_t1.TableColumns["Id"].DefaultValue = SqlDml.NextValue(t1_seq); + + sch1_t1.CreateColumn("Char", new SqlValueType(SqlType.Char, 1)); + sch1_t1.TableColumns["Char"].IsNullable = false; + sch1_t1.TableColumns["Char"].DefaultValue = "'"; + sch1_t1.CreateColumn("Char?", new SqlValueType(SqlType.Char, 1)); + sch1_t1.TableColumns["Char?"].IsNullable = true; + sch1_t1.CreateColumn("Char7", new SqlValueType(SqlType.Char, 7)); + sch1_t1.TableColumns["Char7"].IsNullable = false; + sch1_t1.TableColumns["Char7"].DefaultValue = "Char7"; + sch1_t1.CreateColumn("Char8?", new SqlValueType(SqlType.Char, 8)); + sch1_t1.TableColumns["Char8?"].IsNullable = true; + sch1_t1.CreateColumn("Varchar9", new SqlValueType(SqlType.VarChar, 9)); + sch1_t1.TableColumns["Varchar9"].IsNullable = false; + sch1_t1.TableColumns["Varchar9"].DefaultValue = SqlDml.Literal("Varchar9"); + sch1_t1.CreateColumn("Varchar10?", new SqlValueType(SqlType.VarChar, 10)); + sch1_t1.TableColumns["Varchar10?"].IsNullable = true; + sch1_t1.CreateColumn("Text", new SqlValueType(SqlType.VarCharMax)); + sch1_t1.TableColumns["Text"].IsNullable = false; + sch1_t1.TableColumns["Text"].DefaultValue = SqlDml.Concat(SqlDml.Literal("Text'"), SqlDml.SessionUser()); + sch1_t1.CreateColumn("Text?", new SqlValueType(SqlType.VarCharMax)); + sch1_t1.TableColumns["Text?"].IsNullable = true; + sch1_t1.CreateColumn("Bool", new SqlValueType(SqlType.Boolean)); + sch1_t1.TableColumns["Bool"].IsNullable = false; + sch1_t1.TableColumns["Bool"].DefaultValue = false; // false;// Sql.Or(Sql.Literal(true), Sql.Literal(false)); + sch1_t1.CreateColumn("Bool?", new SqlValueType(SqlType.Boolean)); + sch1_t1.TableColumns["Bool?"].IsNullable = true; + sch1_t1.CreateColumn("Int2", new SqlValueType(SqlType.Int16)); + sch1_t1.TableColumns["Int2"].IsNullable = false; + sch1_t1.TableColumns["Int2"].DefaultValue = (SqlDml.Literal(2) + 1) * 7; + sch1_t1.CreateColumn("Int2?", new SqlValueType(SqlType.Int16)); + sch1_t1.TableColumns["Int2?"].IsNullable = true; + sch1_t1.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); + sch1_t1.TableColumns["Int4"].IsNullable = false; + sch1_t1.TableColumns["Int4"].DefaultValue = 41; + sch1_t1.CreateColumn("Int4?", new SqlValueType(SqlType.Int32)); + sch1_t1.TableColumns["Int4?"].IsNullable = true; + sch1_t1.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); + sch1_t1.TableColumns["Int8"].IsNullable = false; + sch1_t1.TableColumns["Int8"].DefaultValue = SqlDml.Square(9); + sch1_t1.CreateColumn("Int8?", new SqlValueType(SqlType.Int64)); + sch1_t1.TableColumns["Int8?"].IsNullable = true; + sch1_t1.CreateColumn("Float4", new SqlValueType(SqlType.Float)); + sch1_t1.TableColumns["Float4"].IsNullable = false; + sch1_t1.TableColumns["Float4"].DefaultValue = SqlDml.Pi(); + sch1_t1.CreateColumn("Float4?", new SqlValueType(SqlType.Float)); + sch1_t1.TableColumns["Float4?"].IsNullable = true; + sch1_t1.CreateColumn("Float8", new SqlValueType(SqlType.Double)); + sch1_t1.TableColumns["Float8"].IsNullable = false; + sch1_t1.TableColumns["Float8"].DefaultValue = SqlDml.Rand(7); + sch1_t1.CreateColumn("Float8?", new SqlValueType(SqlType.Double)); + sch1_t1.TableColumns["Float8?"].IsNullable = true; + sch1_t1.CreateColumn("Decimal28_10", new SqlValueType(SqlType.Decimal, 28, 10)); + sch1_t1.TableColumns["Decimal28_10"].IsNullable = false; + sch1_t1.TableColumns["Decimal28_10"].DefaultValue = SqlDml.Tan(SqlDml.Pi() / 4); + sch1_t1.CreateColumn("Decimal28_10?", new SqlValueType(SqlType.Decimal, 28, 10)); + sch1_t1.TableColumns["Decimal28_10?"].IsNullable = true; + sch1_t1.CreateColumn("Decimal50", new SqlValueType(SqlType.Decimal, 50, 0)); + sch1_t1.TableColumns["Decimal50"].IsNullable = false; + sch1_t1.TableColumns["Decimal50"].DefaultValue = SqlDml.Power(3, 20); + sch1_t1.CreateColumn("Decimal50?", new SqlValueType(SqlType.Decimal, 50, 0)); + sch1_t1.TableColumns["Decimal50?"].IsNullable = true; + sch1_t1.CreateColumn("DateTime", new SqlValueType(SqlType.DateTime)); + sch1_t1.TableColumns["DateTime"].IsNullable = false; + sch1_t1.TableColumns["DateTime"].DefaultValue = SqlDml.CurrentDate(); + sch1_t1.CreateColumn("DateTime?", new SqlValueType(SqlType.DateTime)); + sch1_t1.TableColumns["DateTime?"].IsNullable = true; + SqlTableRef t1_ref = SqlDml.TableRef(sch1_t1); + + sch1_t1.CreatePrimaryKey("T1_pk", sch1_t1.TableColumns["Id"]); + + sch1_t1.CreateUniqueConstraint("T1_u1", sch1_t1.TableColumns["Char?"], sch1_t1.TableColumns["Char7"]); + sch1_t1.CreateUniqueConstraint("T1_u2", sch1_t1.TableColumns["Text?"]); + sch1_t1.CreateUniqueConstraint("T1_u3", sch1_t1.TableColumns["Int8"], sch1_t1.TableColumns["Int4"]); + sch1_t1.CreateUniqueConstraint("T1_u4", sch1_t1.TableColumns["Int2"], sch1_t1.TableColumns["Bool"], sch1_t1.TableColumns["Bool?"]); + sch1_t1.CreateUniqueConstraint("T1_u5", sch1_t1.TableColumns["DateTime"], sch1_t1.TableColumns["Float8"], sch1_t1.TableColumns["Decimal28_10"], sch1_t1.TableColumns["Float4"]); + + sch1_t1.CreateCheckConstraint("T1_ch1", t1_ref["Bool?"]); + sch1_t1.CreateCheckConstraint("T1_ch2", SqlDml.Between(t1_ref["Int2"], 2, 200)); + sch1_t1.CreateCheckConstraint("T1_ch3", SqlDml.Between(t1_ref["Int4"], 4, 400)); + sch1_t1.CreateCheckConstraint("T1_ch4", t1_ref["Int8"] > t1_ref["Int4"]); + sch1_t1.CreateCheckConstraint("T1_ch5", t1_ref["Decimal50"] >= t1_ref["Decimal28_10"]); + + fk = sch1_t1.CreateForeignKey("fk_Int4?_Id"); + fk.Columns.Add(sch1_t1.TableColumns["Int4?"]); + fk.ReferencedTable = sch1_t1; + fk.ReferencedColumns.Add(sch1_t1.TableColumns["Id"]); + fk.OnUpdate = ReferentialAction.SetNull; + fk.OnDelete = ReferentialAction.SetDefault; + fk.IsDeferrable = false; + + idx = sch1_t1.CreateIndex("T1_ix1"); + idx.CreateIndexColumn(sch1_t1.TableColumns["Decimal50"]); + + idx = sch1_t1.CreateIndex("T1_ix2"); + idx.CreateIndexColumn(sch1_t1.TableColumns["DateTime"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Int2"]); + idx.FillFactor = 80; + + idx = sch1_t1.CreateIndex("T1_ix3"); + idx.CreateIndexColumn(sch1_t1.TableColumns["Char7"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Bool"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Float8?"]); + idx.IsUnique = true; + + idx = sch1_t1.CreateIndex("T1_ix4"); + idx.CreateIndexColumn(sch1_t1.TableColumns["Varchar10?"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Varchar9"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Char7"]); + idx.CreateIndexColumn(sch1_t1.TableColumns["Text?"]); + + { + SqlSelect viewdef = SqlDml.Select(t1_ref); + foreach (SqlTableColumn tc in t1_ref.Columns) { + viewdef.Columns.Add(tc); + } + string cmdText = Driver.Compile(viewdef).GetCommandText(); + sch1.CreateView("T1View", SqlDml.Native(cmdText)); + } + + //t2 + + Table sch1_t2 = sch1.CreateTable("T2"); + { + sch1_t2.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); + sch1_t2.TableColumns["Int8"].IsNullable = false; + sch1_t2.TableColumns["Int8"].DefaultValue = 0; + sch1_t2.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); + sch1_t2.TableColumns["Int4"].IsNullable = false; + sch1_t2.TableColumns["Int4"].DefaultValue = 0; + + SqlTableRef t2_ref = SqlDml.TableRef(sch1_t2); + + fk = sch1_t2.CreateForeignKey("fk_t2_Int8_Int4_t1_Int8_Int4"); + fk.Columns.Add(sch1_t2.TableColumns["Int8"]); + fk.Columns.Add(sch1_t2.TableColumns["Int4"]); + fk.ReferencedTable = sch1_t1; + fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int8"]); + fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int4"]); + fk.OnUpdate = ReferentialAction.Cascade; + fk.OnDelete = ReferentialAction.Restrict; + fk.IsDeferrable = false; + } + + //sch2 + + Schema sch2 = MyCatalog.CreateSchema("Sch2"); + { + //t3 + + Table sch2_t3 = sch2.CreateTable("T3"); + + sch2_t3.CreateColumn("Int8", new SqlValueType(SqlType.Int64)); + sch2_t3.TableColumns["Int8"].IsNullable = false; + sch2_t3.TableColumns["Int8"].DefaultValue = 0; + sch2_t3.CreateColumn("Int4", new SqlValueType(SqlType.Int32)); + sch2_t3.TableColumns["Int4"].IsNullable = false; + sch2_t3.TableColumns["Int4"].DefaultValue = 0; + + SqlTableRef t3_ref = SqlDml.TableRef(sch2_t3); + + fk = sch2_t3.CreateForeignKey("fk_t3_Int8_Int4_t1_Int8_Int4"); + fk.Columns.Add(sch2_t3.TableColumns["Int8"]); + fk.Columns.Add(sch2_t3.TableColumns["Int4"]); + fk.ReferencedTable = sch1_t1; + fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int8"]); + fk.ReferencedColumns.Add(sch1_t1.TableColumns["Int4"]); + fk.OnUpdate = ReferentialAction.NoAction; + fk.OnDelete = ReferentialAction.Cascade; + fk.IsDeferrable = false; + + //some sequences + Sequence sch2_seq1 = sch2.CreateSequence("Seq1"); + + Sequence sch2_seq2 = sch2.CreateSequence("Seq2"); + sch2_seq2.SequenceDescriptor.StartValue = 100; + sch2_seq2.SequenceDescriptor.Increment = 10; + sch2_seq2.SequenceDescriptor.MinValue = 1; + sch2_seq2.SequenceDescriptor.MaxValue = 1000; + sch2_seq2.SequenceDescriptor.IsCyclic = true; + } + } + + #region AdventureWorks model + + /* + { + Model model = mDbModel; + model.DefaultServer.DefaultCatalog.CreateSchema("HumanResources"); + model.DefaultServer.DefaultCatalog.CreateSchema("Person"); + model.DefaultServer.DefaultCatalog.CreateSchema("Production"); + model.DefaultServer.DefaultCatalog.CreateSchema("Purchasing"); + model.DefaultServer.DefaultCatalog.CreateSchema("Sales"); + + Table t; + View v; + TableColumn c; + IConstraint cs; + + t = MyCatalog.Schemas["Production"].CreateTable("TransactionHistoryArchive"); + t.CreateColumn("TransactionID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReferenceOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReferenceOrderLineID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TransactionDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("TransactionType", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("CreditCard"); + t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CardType", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CardNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ExpMonth", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ExpYear", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("Document"); + t.CreateColumn("DocumentID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("FileName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("FileExtension", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Revision", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ChangeNumber", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("DocumentSummary", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Document", new SqlValueType(SqlDataType.VarBinaryMax)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("Illustration"); + t.CreateColumn("IllustrationID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Diagram", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductDescription"); + t.CreateColumn("ProductDescriptionID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Description", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SpecialOffer"); + t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Description", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("DiscountPct", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Type", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Category", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("MinQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("MaxQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductPhoto"); + t.CreateColumn("ProductPhotoID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ThumbNailPhoto", new SqlValueType(SqlDataType.VarBinaryMax)); + t.CreateColumn("ThumbnailPhotoFileName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("LargePhoto", new SqlValueType(SqlDataType.VarBinaryMax)); + t.CreateColumn("LargePhotoFileName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("Customer"); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CustomerType", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("CustomerAddress"); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeeAddress"); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef ea = Sql.TableRef(t); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("VendorAddress"); + t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("ProductVendor"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AverageLeadTime", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StandardPrice", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("LastReceiptCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("LastReceiptDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("MinOrderQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("MaxOrderQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("OnOrderQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("BillOfMaterials"); + t.CreateColumn("BillOfMaterialsID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductAssemblyID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ComponentID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("BOMLevel", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("PerAssemblyQty", new SqlValueType(SqlDataType.Decimal)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("PurchaseOrderHeader"); + t.CreateColumn("PurchaseOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("RevisionNumber", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("OrderDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ShipDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("SubTotal", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("TaxAmt", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Freight", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("TotalDue", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("VendorContact"); + t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("ContactCreditCard"); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("StoreContact"); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("PurchaseOrderDetail"); + t.CreateColumn("PurchaseOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("PurchaseOrderDetailID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("DueDate", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("UnitPrice", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReceivedQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("RejectedQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StockedQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("WorkOrderRouting"); + t.CreateColumn("WorkOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("OperationSequence", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ScheduledStartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ScheduledEndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ActualStartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ActualEndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ActualResourceHrs", new SqlValueType(SqlDataType.Decimal)); + t.CreateColumn("PlannedCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("CountryRegionCurrency"); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CurrencyCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductModelProductDescriptionCulture"); + t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductDescriptionID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CultureID", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("CurrencyRate"); + t.CreateColumn("CurrencyRateID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CurrencyRateDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("FromCurrencyCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ToCurrencyCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("AverageRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("EndOfDayRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderDetail"); + t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SalesOrderDetailID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CarrierTrackingNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("UnitPrice", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("UnitPriceDiscount", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("LineTotal", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderHeaderSalesReason"); + t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SalesReasonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeeDepartmentHistory"); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("DepartmentID", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ShiftID", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductDocument"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("DocumentID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("EmployeePayHistory"); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("RateChangeDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("Rate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("PayFrequency", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesPerson"); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SalesQuota", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Bonus", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("CommissionPct", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("SalesYTD", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("SalesLastYear", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesPersonQuotaHistory"); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("QuotaDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("SalesQuota", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesTerritoryHistory"); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductModelIllustration"); + t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("IllustrationID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductInventory"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Shelf", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Bin", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("WorkOrder"); + t.CreateColumn("WorkOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("OrderQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StockedQty", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ScrappedQty", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("DueDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ScrapReasonID", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("TransactionHistory"); + t.CreateColumn("TransactionID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReferenceOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReferenceOrderLineID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TransactionDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("TransactionType", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ActualCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("ShoppingCartItem"); + t.CreateColumn("ShoppingCartItemID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ShoppingCartID", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Quantity", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("DateCreated", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductListPriceHistory"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ListPrice", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SpecialOfferProduct"); + t.CreateColumn("SpecialOfferID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductCostHistory"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StartDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("StandardCost", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Person"].CreateTable("Address"); + t.CreateColumn("AddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AddressLine1", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("AddressLine2", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("City", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("PostalCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef a = Sql.TableRef(t); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("Vendor"); + t.CreateColumn("VendorID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CreditRating", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("PreferredVendorStatus", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("ActiveFlag", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("PurchasingWebServiceURL", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesOrderHeader"); + t.CreateColumn("SalesOrderID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("RevisionNumber", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("OrderDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("DueDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ShipDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("Status", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("OnlineOrderFlag", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("SalesOrderNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("PurchaseOrderNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("AccountNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("BillToAddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ShipToAddressID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CreditCardID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("CreditCardApprovalCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CurrencyRateID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("SubTotal", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("TaxAmt", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Freight", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("TotalDue", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Comment", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("Employee"); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("NationalIDNumber", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("LoginID", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ManagerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("BirthDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("MaritalStatus", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Gender", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("HireDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("SalariedFlag", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("VacationHours", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("SickLeaveHours", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("CurrentFlag", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef e = Sql.TableRef(t); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductProductPhoto"); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductPhotoID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Primary", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Person"].CreateTable("StateProvince"); + t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StateProvinceCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("IsOnlyStateProvinceFlag", new SqlValueType(SqlDataType.Boolean)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef sp = Sql.TableRef(t); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductModel"); + t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CatalogDescription", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("Instructions", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("Product"); + c = t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + c.SequenceDescriptor = new SequenceDescriptor(c, 1, 1); + c.IsNullable = false; + c = t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar, 50)); + c.IsNullable = false; + c = t.CreateColumn("ProductNumber", new SqlValueType(SqlDataType.VarChar, 25)); + c.IsNullable = false; + c = t.CreateColumn("MakeFlag", new SqlValueType(SqlDataType.Boolean)); + c.DefaultValue = 1; + c.IsNullable = false; + c = t.CreateColumn("FinishedGoodsFlag", new SqlValueType(SqlDataType.Boolean)); + c.DefaultValue = 1; + c.IsNullable = false; + c = t.CreateColumn("Color", new SqlValueType(SqlDataType.VarChar, 15)); + c = t.CreateColumn("SafetyStockLevel", new SqlValueType(SqlDataType.Int16)); + c.IsNullable = false; + c = t.CreateColumn("ReorderPoint", new SqlValueType(SqlDataType.Int16)); + c.IsNullable = false; + c = t.CreateColumn("StandardCost", new SqlValueType(SqlDataType.Money)); + c.IsNullable = false; + c = t.CreateColumn("ListPrice", new SqlValueType(SqlDataType.Money)); + c.IsNullable = false; + c = t.CreateColumn("Size", new SqlValueType(SqlDataType.VarChar, 5)); + c = t.CreateColumn("SizeUnitMeasureCode", new SqlValueType(SqlDataType.Char, 3)); + c = t.CreateColumn("WeightUnitMeasureCode", new SqlValueType(SqlDataType.Char, 3)); + t.CreateColumn("Weight", new SqlValueType(SqlDataType.Decimal, 8, 2)); + c = t.CreateColumn("DaysToManufacture", new SqlValueType(SqlDataType.Int32)); + c.IsNullable = false; + c = t.CreateColumn("ProductLine", new SqlValueType(SqlDataType.Char, 2)); + c = t.CreateColumn("Class", new SqlValueType(SqlDataType.Char, 2)); + c = t.CreateColumn("Style", new SqlValueType(SqlDataType.Char, 2)); + t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductModelID", new SqlValueType(SqlDataType.Int32)); + c = t.CreateColumn("SellStartDate", new SqlValueType(SqlDataType.DateTime)); + c.IsNullable = false; + t.CreateColumn("SellEndDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("DiscontinuedDate", new SqlValueType(SqlDataType.DateTime)); + c = t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + c.DefaultValue = Sql.CurrentDate(); + c.IsNullable = false; + SqlTableRef st = Sql.TableRef(t); + SqlTableColumn col; + col = st["Class"]; + t.CreateCheckConstraint("CK_Product_Class", Sql.Upper(st["Class"]) == 'H' || + Sql.Upper(st["Class"]) == 'M' || + Sql.Upper(st["Class"]) == 'L' || + Sql.IsNull(st["Class"])); + t.CreateCheckConstraint("CK_Product_DaysToManufacture", Sql.Upper(st["DaysToManufacture"]) >= 0); + t.CreateCheckConstraint("CK_Product_ListPrice", Sql.Upper(st["ListPrice"]) >= 0); + t.CreateCheckConstraint("CK_Product_ProductLine", Sql.Upper(st["ProductLine"]) == 'R' || + Sql.Upper(st["ProductLine"]) == 'M' || + Sql.Upper(st["ProductLine"]) == 'T' || + Sql.Upper(st["ProductLine"]) == 'S' || + Sql.IsNull(st["ProductLine"])); + t.CreateCheckConstraint("CK_Product_ReorderPoint", Sql.Upper(st["ReorderPoint"]) > 0); + t.CreateCheckConstraint("CK_Product_SafetyStockLevel", Sql.Upper(st["SafetyStockLevel"]) > 0); + t.CreateCheckConstraint("CK_Product_SellEndDate", Sql.Upper(st["SellEndDate"]) > st["SellStartDate"] || + Sql.IsNull(st["SellEndDate"])); + t.CreateCheckConstraint("CK_Product_StandardCost", Sql.Upper(st["StandardCost"]) >= 0); + t.CreateCheckConstraint("CK_Product_Style", Sql.Upper(st["Style"]) == 'U' || + Sql.Upper(st["Style"]) == 'M' || + Sql.Upper(st["Style"]) == 'W' || + Sql.IsNull(st["Style"])); + t.CreateCheckConstraint("CK_Product_Weight", Sql.Upper(st["Weight"]) > 0); + t.CreatePrimaryKey("PK_Product_ProductID", t.TableColumns["ProductID"]); + cs = t.CreateForeignKey("FK_Product_ProductModel_ProductModelID"); + ((ForeignKey)cs).Columns.Add(t.TableColumns["ProductModelID"]); + ((ForeignKey)cs).ReferencedColumns.Add(MyCatalog.Schemas["Production"].Tables["ProductModel"].TableColumns["ProductModelID"]); + + t = MyCatalog.Schemas["Person"].CreateTable("Contact"); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("NameStyle", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Title", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("FirstName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("MiddleName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("LastName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Suffix", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("EmailAddress", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("EmailPromotion", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Phone", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("PasswordHash", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("PasswordSalt", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("AdditionalContactInfo", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef cRef = Sql.TableRef(t); + + t = MyCatalog.Schemas["Production"].CreateTable("UnitMeasure"); + t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductReview"); + t.CreateColumn("ProductReviewID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ReviewerName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ReviewDate", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EmailAddress", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Rating", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Comments", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductSubcategory"); + t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ProductCategoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Person"].CreateTable("AddressType"); + t.CreateColumn("AddressTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesReason"); + t.CreateColumn("SalesReasonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ReasonType", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("Department"); + t.CreateColumn("DepartmentID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("GroupName", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Person"].CreateTable("CountryRegion"); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + SqlTableRef cr = Sql.TableRef(t); + + t = MyCatalog.Schemas["Production"].CreateTable("Culture"); + t.CreateColumn("CultureID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("Currency"); + t.CreateColumn("CurrencyCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Person"].CreateTable("ContactType"); + t.CreateColumn("ContactTypeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesTaxRate"); + t.CreateColumn("SalesTaxRateID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("StateProvinceID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("TaxType", new SqlValueType(SqlDataType.Int16)); + t.CreateColumn("TaxRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("Location"); + t.CreateColumn("LocationID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CostRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("Availability", new SqlValueType(SqlDataType.Decimal)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("SalesTerritory"); + t.CreateColumn("TerritoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("Group", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("TaxRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("SalesYTD", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("SalesLastYear", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("CostYTD", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("CostLastYear", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ScrapReason"); + t.CreateColumn("ScrapReasonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("Shift"); + t.CreateColumn("ShiftID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("StartTime", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("EndTime", new SqlValueType(SqlDataType.DateTime)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Production"].CreateTable("ProductCategory"); + t.CreateColumn("ProductCategoryID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Purchasing"].CreateTable("ShipMethod"); + t.CreateColumn("ShipMethodID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("ShipBase", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ShipRate", new SqlValueType(SqlDataType.Money)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("Store"); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlDataType.VarChar)); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Demographics", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["Sales"].CreateTable("Individual"); + t.CreateColumn("CustomerID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("ContactID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Demographics", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + t = MyCatalog.Schemas["HumanResources"].CreateTable("JobCandidate"); + t.CreateColumn("JobCandidateID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("EmployeeID", new SqlValueType(SqlDataType.Int32)); + t.CreateColumn("Resume", new SqlValueType(SqlDataType.Text)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlDataType.DateTime)); + + SqlSelect select = Sql.Select(e); + select.From.InnerJoin(cRef, cRef["ContactID"] == e["ContactID"]); + select.From.InnerJoin(ea, e["EmployeeID"] == ea["EmployeeID"]); + select.From.InnerJoin(a, ea["AddressID"] == a["AddressID"]); + select.From.InnerJoin(sp, sp["StateProvinceID"] == a["StateProvinceID"]); + select.From.InnerJoin(cr, cr["CountryRegionCode"] == sp["CountryRegionCode"]); + select.Columns.AddRange(e["EmployeeID"], cRef["Title"], cRef["FirstName"], cRef["MiddleName"], + cRef["LastName"], cRef["Suffix"]); + select.Columns.Add(e["Title"], "JobTitle"); + select.Columns.AddRange(cRef["Phone"], cRef["EmailAddress"], cRef["EmailPromotion"], + a["AddressLine1"], a["AddressLine2"], a["City"]); + select.Columns.Add(sp["Name"], "StateProvinceName"); + select.Columns.Add(a["PostalCode"]); + select.Columns.Add(cr["Name"], "CountryRegionName"); + select.Columns.Add(cRef["AdditionalContactInfo"]); + + v = MyCatalog.Schemas["HumanResources"].CreateView("vEmployee", + Sql.Native(mDriver.Compile(select).CommandText)); + } + /**/ + + #endregion + } + + [OneTimeTearDown] + public virtual void FixtureTearDown() + { + if (Connection!=null) { + if (Connection.State==ConnectionState.Open) + Connection.Close(); + } + } + + + [Test] + public void ReadServerInfoTest() + { + ServerInfo si = Driver.ServerInfo; + } + + [Test] + public virtual void ModelTest() + { + try { + Connection.BeginTransaction(); + + //Create model + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + foreach (Schema sch in MyCatalog.Schemas) { + batch.Add(SqlDdl.Create(sch)); + } + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + Console.WriteLine(cmd.CommandText); + cmd.ExecuteNonQuery(); + } + + //Extract initial model + { + var extractedCatalog = Driver.ExtractCatalog(Connection); + new CatalogComparer(Connection) + .CompareCatalogs(MyCatalog, extractedCatalog); + } + + //Alter model + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + + //Alter sequence + { + Sequence seq = MyCatalog.Schemas["Sch2"].Sequences["Seq2"]; + seq.SequenceDescriptor.Increment = 4; + seq.SequenceDescriptor.MaxValue = null; + seq.SequenceDescriptor.MinValue = null; + seq.SequenceDescriptor.StartValue = 22; + seq.SequenceDescriptor.IsCyclic = false; + SqlAlterSequence stmt = SqlDdl.Alter(seq, seq.SequenceDescriptor); + batch.Add(stmt); + } + + //Alter table + { + Table t = MyCatalog.Schemas["Sch1"].Tables["T1"]; + TableColumn col = null; + //Add column + { + col = t.CreateColumn("newCol", new SqlValueType(SqlType.Decimal, 30, 10)); + col.IsNullable = false; + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddColumn(col)); + batch.Add(stmt); + } + //Set default + { + col.DefaultValue = 543.21m; + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.SetDefault(col.DefaultValue, col)); + batch.Add(stmt); + } + + //Add check constraint + { + CheckConstraint cc = t.CreateCheckConstraint("newCheckConstraint", SqlDml.TableRef(t).Columns["newCol"] > 0); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(cc)); + batch.Add(stmt); + } + + //Add unique constraint + { + UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["newCol"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); + batch.Add(stmt); + } + + //Add foreign key + { + ForeignKey fk = t.CreateForeignKey("newForeignKey"); + fk.Columns.Add(col); + fk.ReferencedTable = t; + fk.ReferencedColumns.Add(col); + fk.MatchType = SqlMatchType.Full; + fk.OnDelete = ReferentialAction.SetDefault; + fk.OnUpdate = ReferentialAction.Cascade; + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(fk)); + batch.Add(stmt); + } + } + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + //Execute + cmd.ExecuteNonQuery(); + } + + //Extract altered model + { + var extractedCatalog = Driver.ExtractCatalog(Connection); + new CatalogComparer(Connection) + .CompareCatalogs(MyCatalog, extractedCatalog); + } + + + //Alter model again + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + + //Alter table + { + Table t = MyCatalog.Schemas["Sch1"].Tables["T1"]; + TableColumn col = t.TableColumns["newCol"]; + Assert.IsNotNull(col); + //Drop constraints + { + SqlAlterTable stmt = null; + + CheckConstraint cc = t.TableConstraints["newCheckConstraint"] as CheckConstraint; + Assert.IsNotNull(cc); + t.TableConstraints.Remove(cc); + stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(cc)); + batch.Add(stmt); + + ForeignKey fk = t.TableConstraints["newForeignKey"] as ForeignKey; + Assert.IsNotNull(fk); + t.TableConstraints.Remove(fk); + stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(fk)); + batch.Add(stmt); + + UniqueConstraint uc = t.TableConstraints["newUniqueConstraint"] as UniqueConstraint; + Assert.IsNotNull(uc); + t.TableConstraints.Remove(uc); + stmt = SqlDdl.Alter(t, SqlDdl.DropConstraint(uc)); + batch.Add(stmt); + } + + //Drop default + { + col.DefaultValue = null; + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropDefault(col)); + batch.Add(stmt); + } + + //Drop column + { + t.TableColumns.Remove(col); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.DropColumn(col)); + batch.Add(stmt); + } + } + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + //Execute + cmd.ExecuteNonQuery(); + } + + //Extract altered model again + { + var extractedCatalog = Driver.ExtractCatalog(Connection); + new CatalogComparer(Connection) + .CompareCatalogs(MyCatalog, extractedCatalog); + } + + //Manipulate data + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + SqlInsert insert; + SqlUpdate update; + SqlDelete delete; + SqlTableRef t1 = SqlDml.TableRef(MyCatalog.Schemas["Sch1"].Tables["T1"]); + //Should insert default values + //insert = Sql.Insert(t1); + //batch.Add(insert); + + insert = SqlDml.Insert(t1); + insert.Values.Add(t1["Text?"], SqlDml.Null); + insert.Values.Add(t1["Int8"], Int64.MaxValue); + batch.Add(insert); + + //set FK to self + update = SqlDml.Update(t1); + update.Values.Add(t1["Int4?"], SqlDml.FunctionCall("currval", @"""Sch1"".""T1Seq""")); + update.Values.Add(t1["Text?"], "new text"); + batch.Add(update); + + delete = SqlDml.Delete(t1); + batch.Add(delete); + + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + + + //Drop model + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + + foreach (Schema sch in MyCatalog.Schemas) { + batch.Add(SqlDdl.Drop(sch)); + } + + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + } + finally { + Connection.Rollback(); + } + } + + [Test] + public void ExpressionTest() + { + SqlSelect q = SqlDml.Select(); + + #region Limits + + q.Columns.Add(SqlDml.Power(SqlDml.Cast(10, SqlType.Decimal), 50)); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(DateTime.MinValue), SqlType.DateTime), "datetime min"); + //casting in the DBMS rounds to 100000101 00:00:00 somewhy (?) + //q.Columns.Add(Sql.Cast(Sql.Literal(DateTime.MaxValue), SqlDataType.DateTime, Driver.ServerInfoProvider.MaxDateTimePrecision,0), "datetime max"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int16.MinValue), SqlType.Int16), "int16 min"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int16.MaxValue), SqlType.Int16), "int16 max"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int32.MinValue), SqlType.Int32), "int32 min"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int32.MaxValue), SqlType.Int32), "int32 max"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int64.MinValue), SqlType.Int64), "int64 min"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Int64.MaxValue), SqlType.Int64), "int64 max"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Decimal.MinValue), SqlType.Decimal), "decimal min"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Decimal.MaxValue), SqlType.Decimal), "decimal max"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Single.MinValue), SqlType.Float), "float min"); + q.Columns.Add(SqlDml.Cast(SqlDml.Literal(Single.MaxValue), SqlType.Float), "float max"); + + //1.79769313486231E308 instead of 1.79769313486232E308 + //q.Columns.Add(Sql.Cast(Sql.Literal(Double.MinValue), SqlDataType.Double), "double min"); + //1.79769313486231E308 instead of 1.79769313486232E308 + //q.Columns.Add(Sql.Cast(Sql.Literal(Double.MaxValue), SqlDataType.Double), "double max"); + + q.Columns.Add(TimeSpan.MinValue, "interval min"); + q.Columns.Add(TimeSpan.MaxValue, "interval max"); + + #endregion + + #region Literal + + q.Columns.Add((byte) 5, "literal_byte"); + q.Columns.Add((sbyte) 5, "literal_sbyte"); + q.Columns.Add((short) 5, "literal_short"); + q.Columns.Add((ushort) 5, "literal_ushort"); + q.Columns.Add(5, "literal_int"); + q.Columns.Add((uint) 5, "literal_uint"); + q.Columns.Add((long) 5, "literal_long"); + q.Columns.Add((ulong) 5, "literal_ulong"); + q.Columns.Add((decimal) 5.12, "literal_decimal"); + q.Columns.Add((float) 5.12, "literal_float"); + q.Columns.Add(5.12, "literal_double"); + q.Columns.Add('\\', "literal_char"); + q.Columns.Add(@"'\", "literal_string"); + q.Columns.Add(true, "literal_bool"); + q.Columns.Add(!SqlDml.Literal(false), "not_false"); + q.Columns.Add(SqlDml.Literal(false)!=true, "false_neq_true"); + q.Columns.Add(new DateTime(2004, 10, 22, 13, 45, 32, 987), "literal_datetime"); + q.Columns.Add(TimeSpan.FromTicks(0), "literal_timespan1"); + q.Columns.Add(TimeSpan.FromTicks(-5997695706986593470L), "literal_timespan2"); + q.Columns.Add(TimeSpan.FromTicks(1626708734287608436L), "literal_timespan3"); + q.Columns.Add(Guid.NewGuid().ToByteArray(), "bytearray"); + q.Columns.Add(new byte[] {0, 1, 0, 1, 0, 143, 240, 255, 0}, "bytearray2"); + + #endregion + + #region Bit operators + + q.Columns.Add(SqlDml.BitNot(SqlDml.BitNot(5435))==5435, "bitnot"); + q.Columns.Add(SqlDml.BitAnd(6, 3)==2, "bitand1"); + q.Columns.Add(SqlDml.BitAnd(SqlDml.BitOr(3, 6), 10)==2, "bitand2"); + q.Columns.Add(SqlDml.BitXor(3, 6)==5, "bitxor1"); + + #endregion + + #region Math operations + + q.Columns.Add(SqlDml.Literal(-1234567) < -123456, "less1"); + q.Columns.Add(SqlDml.Literal(-123456.7) < -12345.6, "less2"); + q.Columns.Add(SqlDml.Literal(-123456.7m) < -12345.6m, "less3"); + q.Columns.Add(SqlDml.Literal(12) <= 12, "leq1"); + q.Columns.Add(SqlDml.Literal(12) >= 12, "geq1"); + q.Columns.Add(SqlDml.Literal(13) >= 12, "geq2"); + q.Columns.Add(SqlDml.Literal(12)==12, "eq"); + q.Columns.Add(SqlDml.Literal(12)!=13, "neq"); + q.Columns.Add(SqlDml.Literal(14) > 13, "greater"); + q.Columns.Add(SqlDml.Square(4)==16, "square"); + q.Columns.Add(SqlDml.Between(SqlDml.Rand(), 0, 1), "rand2"); + q.Columns.Add(SqlDml.Between(SqlDml.Rand(8), 0, 1), "rand"); + q.Columns.Add(SqlDml.Abs(10.3m)==10.3m, "abs1"); + q.Columns.Add(SqlDml.Abs(-140.3m)==140.3m, "abs2"); + q.Columns.Add(SqlDml.Literal(20) % 7==6, "modulo"); + q.Columns.Add(-SqlDml.Literal(5)==-5, "negate"); + q.Columns.Add(SqlDml.Literal(2) + 3 * SqlDml.Literal(4)==14, "right operation order"); + q.Columns.Add(SqlDml.Cast(3.4564, SqlType.Int16)==3, "cast"); + q.Columns.Add(SqlDml.Cast(-3.4564, SqlType.Int16)==-3, "cast2"); + q.Columns.Add(SqlDml.Cast(SqlDml.Floor(3.4786), SqlType.Int32)==3, "floor"); + q.Columns.Add(SqlDml.Ceiling(3.4564)==4, "ceiling"); + q.Columns.Add(SqlDml.Not(SqlDml.Equals(5, 6)), "not"); + q.Columns.Add(SqlDml.NotEquals(5, 6), "notequals"); + q.Columns.Add(SqlDml.Exp(0)==1, "exp"); + q.Columns.Add(SqlDml.Power(5, 3)==125, "power"); + q.Columns.Add(SqlDml.Sign(55)==1, "sign1"); + q.Columns.Add(SqlDml.Sign(-55)==-1, "sign2"); + q.Columns.Add(SqlDml.Sign(0)==0, "sign3"); + q.Columns.Add(SqlDml.Sqrt(64)==8, "sqrt"); + + #endregion + + #region String operations + + q.Columns.Add('\\'=='\\', "char_equals"); + q.Columns.Add('\\'!='\'', "char_not_equals"); + q.Columns.Add(@"'\"==@"'\", "string_equals"); + q.Columns.Add(@"'\"!=@"'\\", "string_not_equals"); + q.Columns.Add(SqlDml.CharLength('F')==1, "char_length1"); + q.Columns.Add(SqlDml.CharLength('0')==1, "charlength1"); + q.Columns.Add(SqlDml.CharLength(SqlDml.Literal('F'))==1, "char_length4"); + q.Columns.Add(SqlDml.CharLength("0123456789")==10, "charlength2"); + q.Columns.Add(SqlDml.CharLength(@"'\""""")==4, "string_length1"); + q.Columns.Add(SqlDml.CharLength(SqlDml.Literal(@"'\"""""))==4, "string_length2"); + q.Columns.Add(SqlDml.Trim(" 555 ")=="555", "trim1"); + q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Both)=="555", "trim_both"); + q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Leading)=="555 ", "trim_leading"); + q.Columns.Add(SqlDml.Trim(" 555 ", SqlTrimType.Trailing)==" 555", "trim_trailing"); + q.Columns.Add(SqlDml.Trim("555cccc", SqlTrimType.Trailing, "c")=="555", "trim_trailing2"); + q.Columns.Add(SqlDml.Trim("555cccc", SqlTrimType.Leading, "5")=="cccc", "trim_leading2"); + q.Columns.Add(SqlDml.Like("Xtensive", "X%"), "like_%"); + q.Columns.Add(!SqlDml.Like("Xtensive", "%ee%"), "like_%ee%_1"); + q.Columns.Add(SqlDml.NotLike("Xtensive", "%ee%"), "like_%ee%_2"); + q.Columns.Add(SqlDml.Like("Xtensive", "X__n__v_"), "like_Xnv"); + q.Columns.Add(SqlDml.Substring("Xtensive", 2, 3)=="ens", "substring0"); + q.Columns.Add(SqlDml.Substring("Xtensive", 2)=="ensive", "substring with one parameter"); + q.Columns.Add(SqlDml.Position('E', "WEB")==1, "position0"); + q.Columns.Add(2 * SqlDml.Position('E', "WEB")==2, "position1"); + q.Columns.Add(2 * SqlDml.Position('E', "WEB") / 2==1, "position2"); + q.Columns.Add(SqlDml.Concat('0', SqlDml.Concat("12345", "6789"))=="0123456789", "concat"); + + #endregion + + #region Datetime, interval operations + + q.Columns.Add(SqlDml.CurrentDate()==SqlDml.FunctionCall("date_trunc", "day", SqlDml.CurrentTimeStamp()), "current_date_current_timestamp"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, new DateTime(2004, 10, 24))==2004, "extract_year"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Month, new DateTime(2004, 10, 24))==10, "extract_month"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, new DateTime(2004, 10, 24))==24, "extract_day"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, new DateTime(2004, 10, 24))==0, "extract_hour"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, new DateTime(2000, 9, 12, 23, 45, 11, 234))==45, "extract_minute"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Second, new DateTime(2000, 9, 12, 23, 45, 11, 234))==11, "extract_second"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Millisecond, new DateTime(2000, 9, 12, 23, 45, 11, 234))==234, "extract_milliseconds"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, new TimeSpan(1, -2, 200, -40, 432))==1, "interval_extract_day"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, new TimeSpan(1, -2, 200, -40, 432))==1, "interval_extract_hour"); + q.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, new TimeSpan(1, -2, 200, -40, 432))==19, "interval_extract_minute"); + //8.0: small difference (7E-13), 8.2: OK + //q.Columns.Add(Sql.Extract(SqlDateTimePart.Second, new TimeSpan(1, -2, 200, -40, 432)) == 20.432m, "interval_extract_second"); + //8.0: small difference (7E-13), 8.2: OK + //q.Columns.Add(Sql.Extract(SqlDateTimePart.Millisecond, new TimeSpan(1, -2, 200, -40, 432)) == 20432, "interval_extract_millisecond"); + q.Columns.Add(!SqlDml.Overlaps(SqlDml.Row(new DateTime(2003, 10, 26), new DateTime(2003, 10, 27)), SqlDml.Row(new DateTime(2003, 10, 27), new DateTime(2003, 10, 28))), "overlaps1"); + q.Columns.Add(SqlDml.Overlaps(SqlDml.Row(new DateTime(2004, 10, 26), new DateTime(2004, 10, 27, 1, 1, 1)), SqlDml.Row(new DateTime(2004, 10, 27), new DateTime(2004, 10, 28))), "overlaps2"); + q.Columns.Add(SqlDml.Overlaps(SqlDml.Literal(new DateTime(2005, 10, 26)), new DateTime(2005, 10, 27, 1, 1, 1), new DateTime(2005, 10, 27), new DateTime(2005, 10, 28)), "overlaps3"); + q.Columns.Add(SqlDml.Overlaps(SqlDml.Literal(new DateTime(2006, 10, 26)), new TimeSpan(1, 1, 1, 1), new DateTime(2006, 10, 27), new TimeSpan(1, 0, 0, 0)), "overlaps4"); + + q.Columns.Add(SqlDml.Literal(new TimeSpan(12, 13, 14, 15))==SqlDml.Literal(new TimeSpan(12, 13, 14, 15))); + q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 20, 13, 54, 1, 527)==new TimeSpan(0), "datetime_sub_1"); + q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 13, 54, 1, 527)==new TimeSpan(18, 0, 0, 0), "datetime_sub_2"); + q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 54, 1, 527)==new TimeSpan(17, 22, 0, 0), "datetime_sub_3"); + q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 1, 527)==new TimeSpan(17, 22, 22, 0), "datetime_sub_4"); + q.Columns.Add(SqlDml.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 43, 527)==new TimeSpan(17, 22, 21, 18), "datetime_sub_5"); + //not equal + //q.Columns.Add(Sql.Literal(new DateTime(2005, 10, 20, 13, 54, 01, 527)) - new DateTime(2005, 10, 2, 15, 32, 43, 211) == new TimeSpan(17, 22, 21, 18, 316), "datetime_sub_6"); + + #endregion + + #region Arrays + + q.Columns.Add(SqlDml.Array(true, false, true)); + q.Columns.Add(SqlDml.Array((byte) 1, (byte) 2, (byte) 3)); + q.Columns.Add(new byte[] {1, 2, 3}); + q.Columns.Add(SqlDml.Array((ushort) 1, (ushort) 2, (ushort) 3)); + q.Columns.Add(SqlDml.Array((sbyte) -1, (sbyte) -2, (sbyte) -3)); + q.Columns.Add(SqlDml.Array((short) -1, (short) -2, (short) -3)); + q.Columns.Add(SqlDml.Array(-100000, -200000, -300000)); + q.Columns.Add(SqlDml.Array(-100000000, -200000000, -300000000)); + q.Columns.Add(SqlDml.Array(-100000000000, -200000000000, -300000000000)); + q.Columns.Add(SqlDml.Array(100000000, 200000000, 300000000)); + q.Columns.Add(SqlDml.Array(100000000000, 200000000000, 300000000000)); + q.Columns.Add(SqlDml.Array("C", "#")); + q.Columns.Add(SqlDml.Array(DateTime.Now, DateTime.Now, DateTime.Now)); + q.Columns.Add(SqlDml.Array(new TimeSpan(0), new TimeSpan(97593738954343L), new TimeSpan(-99875392765867893L))); + q.Columns.Add(SqlDml.Array("123", "456", "789")); + q.Columns.Add(SqlDml.Array(1.5, 2.6, 3.7)); + q.Columns.Add(SqlDml.Array(1.5m, 2.6m, 3.7m)); + q.Columns.Add(SqlDml.Array(new string[] {})); + + #endregion + + #region In, NotIn array + + q.Columns.Add(!SqlDml.In(true, SqlDml.Array(new bool[0]))); + q.Columns.Add(SqlDml.NotIn(true, SqlDml.Array(new bool[0]))); + q.Columns.Add(SqlDml.NotIn(true, SqlDml.Array(false))); + q.Columns.Add(SqlDml.In(true, SqlDml.Array(true, false))); + q.Columns.Add(SqlDml.NotIn('T', SqlDml.Array(new char[0]))); + q.Columns.Add(SqlDml.NotIn('Z', SqlDml.Array('g', 'i'))); + q.Columns.Add(SqlDml.In('I', SqlDml.Array('u', 'I', 'K'))); + q.Columns.Add(SqlDml.NotIn("O", SqlDml.Array(new string[0]))); + q.Columns.Add(SqlDml.NotIn("Ur", SqlDml.Array("O", "i"))); + q.Columns.Add(SqlDml.In("Oz", SqlDml.Array("6gfwerw", "", "Oz"))); + q.Columns.Add(SqlDml.In("", SqlDml.Array("6gfwerw", "", "Oz"))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new byte[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new byte[] {12, 76, 45, 91}))); + q.Columns.Add(SqlDml.In(168, SqlDml.Array(new byte[] {233, 128, 168}))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new sbyte[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new sbyte[] {12, 76, 45, 91}))); + q.Columns.Add(SqlDml.In(-33, SqlDml.Array(new sbyte[] {-33, 127, 68}))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new int[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new[] {1280942, 76, -45, 1994794321}))); + q.Columns.Add(SqlDml.In(168, SqlDml.Array(new[] {2864333, -1238974228, 168}))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new uint[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new uint[] {12, 76, 45, 91}))); + q.Columns.Add(SqlDml.In(168, SqlDml.Array(new uint[] {2923733, 10702228, 168}))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new long[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new long[] {12, 76, -49328755, 91}))); + q.Columns.Add(SqlDml.In(168, SqlDml.Array(new[] {-928438632233, 128, 168}))); + q.Columns.Add(SqlDml.NotIn(35, SqlDml.Array(new ulong[0]))); + q.Columns.Add(SqlDml.NotIn(98, SqlDml.Array(new ulong[] {1219859843, 76, 454876485389732323, 91}))); + q.Columns.Add(SqlDml.In(233, SqlDml.Array(new ulong[] {233, 128, 15978327274368}))); + q.Columns.Add(SqlDml.NotIn(DateTime.Now, SqlDml.Array(new DateTime[0]))); + q.Columns.Add(SqlDml.NotIn(new DateTime(1974, 11, 12), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1874, 1, 3), new DateTime(2004, 12, 19)}))); + q.Columns.Add(SqlDml.In(new DateTime(1974, 11, 12, 3, 12, 45, 397), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1974, 11, 12, 3, 12, 45, 397), new DateTime(2004, 12, 19)}))); + q.Columns.Add(SqlDml.NotIn(new DateTime(1974, 11, 12, 3, 12, 45, 397), SqlDml.Array(new[] {new DateTime(1994, 11, 12), new DateTime(1974, 11, 12, 3, 12, 45, 398), new DateTime(2004, 12, 19)}))); + + #endregion + + #region All, any, some + + q.Columns.Add(3 > SqlDml.All(new Func(delegate { + SqlSelect q2 = SqlDml.Select(); + q2.Columns.Add(2); + return q2; + })())); + q.Columns.Add(3 > SqlDml.Any(new Func(delegate { + SqlSelect q2 = SqlDml.Select(); + q2.Columns.Add(2); + return q2; + })())); + q.Columns.Add(3 > SqlDml.Some(new Func(delegate { + SqlSelect q2 = SqlDml.Select(); + q2.Columns.Add(2); + return q2; + })())); + + #endregion + + #region Row + + q.Columns.Add(SqlDml.Row(SqlDml.Acos(SqlDml.Literal(0.4F)), 7, 9), "arithmetic row"); + q.Columns.Add(SqlDml.Row("A", "B", "C"), "string row2"); + q.Columns.Add(SqlDml.Row(SqlDml.Concat("A", "A"), "B", "C"), "string row1"); + + #endregion + + #region Case + + q.Columns.Add(SqlDml.Case(SqlDml.Concat("s", "")).Add("s", SqlDml.Literal(true) || true)); + q.Columns.Add(SqlDml.Case(SqlDml.And(true, false)).Add(false, SqlDml.CharLength(SqlDml.Concat("abc", "def"))==6)); + + #endregion + + #region Other functions, oparators + + q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, 3)==3, "coalesce1"); + q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, SqlDml.Null + 5, 3)==3, "coalesce2"); + q.Columns.Add(SqlDml.Coalesce(SqlDml.Null, SqlDml.Null + 5, 3, 9)==3, "coalesce3"); + q.Columns.Add(SqlDml.IsNotNull('R'), "isnotnull"); + q.Columns.Add(SqlDml.IsNull(SqlDml.Null - 7), "isnull1"); + q.Columns.Add(SqlDml.IsNull(SqlDml.NullIf(5, 5)), "isnull2"); + q.Columns.Add(SqlDml.NullIf(5, 6)==5, "nullif1"); + q.Columns.Add(SqlDml.In('E', SqlDml.Row("'J'", 'E', '\'')), "in_row"); + q.Columns.Add(SqlDml.NotIn('E', SqlDml.Row("'J'", '\\', 'Z')), "not_in_row"); + q.Columns.Add(SqlDml.NotBetween("between'", "bezier'", "lagrange'"), "not_between"); + q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast("", SqlType.VarBinaryMax))==0, "cast_bytea1"); + q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast(@"\050", SqlType.VarBinaryMax))==1, "cast_bytea2"); + q.Columns.Add(SqlDml.BinaryLength(SqlDml.Cast(@"abc\\", SqlType.VarBinaryMax))==4, "cast_bytea5"); + + #endregion + + using (var cmd = Connection.CreateCommand(q)) { + using (DbDataReader dr = cmd.ExecuteReader()) { + while (dr.Read()) { + for (int i = 0; i < dr.FieldCount; i++) { + object value = dr.GetValue(i); + if (value is bool) { + Assert.IsTrue(dr.GetBoolean(i), "'" + dr.GetName(i) + "' column is not true!"); + } + } + } + } + } + } + + [Test] + public void UniquePredicateTest() + { + Connection.BeginTransaction(); + try { + SqlBatch batch = SqlDml.Batch(); + TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("unique_pred_test"); + t.PreserveRows = false; + t.CreateColumn("id", new SqlValueType(SqlType.Int32)); + t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; + t.CreateColumn("col2", new SqlValueType(SqlType.Int32)).IsNullable = true; + batch.Add(SqlDdl.Create(t)); + SqlTableRef tref = SqlDml.TableRef(t); + + Action insert = delegate(int id, SqlExpression expr1, SqlExpression expr2) { + SqlInsert ins2 = SqlDml.Insert(tref); + ins2.Values.Add(tref["id"], id); + ins2.Values.Add(tref["col1"], expr1); + ins2.Values.Add(tref["col2"], expr2); + batch.Add(ins2); + }; + //unique part + insert(01, SqlDml.Null, SqlDml.Null); + insert(02, SqlDml.Null, SqlDml.Null); + insert(03, SqlDml.Null, 1); + insert(04, 1, SqlDml.Null); + insert(05, 2, 3); + insert(06, SqlDml.Null, 2); + insert(07, 3, SqlDml.Null); + insert(08, 3, 2); + //non-unique part + insert(10, SqlDml.Null, 2); + insert(11, 3, SqlDml.Null); + insert(12, 3, 2); + + ExecuteNonQuery(batch); + + //query + + SqlSelect initialQuery = SqlDml.Select(tref); + initialQuery.Columns.Add(tref["col1"]); + initialQuery.Columns.Add(tref["col2"]); + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(1); + q.Where = SqlDml.Unique(new Func(delegate { + SqlSelect q2 = SqlDml.Select(tref); + q2.Columns.Add(tref["col1"]); + q2.Columns.Add(tref["col2"]); + +// q2 = initialQuery.Clone() as SqlSelect; + q2.Where = tref["id"] < 10; + return q2; + })()); + AssertQueryExists(q); + } + + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(1); + q.Where = SqlDml.Unique(new Func(delegate { + SqlSelect q2 = SqlDml.Select(tref); + q2.Columns.Add(tref["col1"]); + q2.Columns.Add(tref["col2"]); + return q2; + })()); + + AssertQueryNotExists(q); + } + } + catch (Exception ex) { + Assert.Fail(ex.ToString()); + } + finally { + Connection.Rollback(); + var t = MyCatalog.DefaultSchema.Tables["unique_perd_test"]; + if (t != null) + MyCatalog.DefaultSchema.Tables.Remove(t); + } + } + + [Test] + public void MatchPredicateTest() + { + Connection.BeginTransaction(); + try { + SqlBatch batch = SqlDml.Batch(); + TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("match_pred_test"); + t.PreserveRows = false; + t.CreateColumn("id", new SqlValueType(SqlType.Int32)); + t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; + t.CreateColumn("col2", new SqlValueType(SqlType.Int32)).IsNullable = true; + batch.Add(SqlDdl.Create(t)); + SqlTableRef tref = SqlDml.TableRef(t); + + //fill + { + int id = 1; + Action insert = delegate(SqlExpression expr1, SqlExpression expr2) { + SqlInsert ins2 = SqlDml.Insert(tref); + ins2.Values.Add(tref["id"], id); + ins2.Values.Add(tref["col1"], expr1); + ins2.Values.Add(tref["col2"], expr2); + batch.Add(ins2); + id++; + }; + //unique part + insert(SqlDml.Null, SqlDml.Null); + insert(SqlDml.Null, SqlDml.Null); + insert(SqlDml.Null, 2); + insert(1, SqlDml.Null); + insert(1, 2); + insert(5, SqlDml.Null); + insert(SqlDml.Null, 6); + //non-unique part + insert(SqlDml.Null, 4); + insert(SqlDml.Null, 4); + insert(3, SqlDml.Null); + insert(3, SqlDml.Null); + insert(3, 4); + insert(3, 4); + } + + ExecuteNonQuery(batch); + + //query + SqlSelect testQuery = SqlDml.Select(tref); + testQuery.Columns.Add(tref["col1"]); + testQuery.Columns.Add(tref["col2"]); + + Action matchTesterExists + = delegate(SqlExpression col1, SqlExpression col2, bool unique, SqlMatchType matchType) { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(1); + q.Where = SqlDml.Match(SqlDml.Row(col1, col2), SqlDml.SubQuery(testQuery).Query, unique, matchType); + AssertQueryExists(q); + }; + + Action matchTesterNotExists + = delegate(SqlExpression col1, SqlExpression col2, bool unique, SqlMatchType matchType) { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(1); + q.Where = SqlDml.Match(SqlDml.Row(col1, col2), SqlDml.SubQuery(testQuery).Query, unique, matchType); + AssertQueryNotExists(q); + }; + + //match simple + { + matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.None); + matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 2, false, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 2, true, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 4, false, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 4, true, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 3, false, SqlMatchType.None); + matchTesterExists(SqlDml.Null, 3, true, SqlMatchType.None); + matchTesterExists(9, SqlDml.Null, false, SqlMatchType.None); + matchTesterExists(9, SqlDml.Null, true, SqlMatchType.None); + matchTesterExists(9, SqlDml.Null + 2, true, SqlMatchType.None); + matchTesterExists(1, 2, false, SqlMatchType.None); + matchTesterExists(1, 1 + SqlDml.Literal(1), false, SqlMatchType.None); + matchTesterExists(1, 2, true, SqlMatchType.None); + matchTesterExists(1, 3 - SqlDml.Literal(1), true, SqlMatchType.None); + matchTesterExists(3, 4, false, SqlMatchType.None); + matchTesterExists(3 + SqlDml.Literal(0), 4, false, SqlMatchType.None); + matchTesterNotExists(3, 4, true, SqlMatchType.None); + matchTesterNotExists(3, 4 + SqlDml.Literal(0), true, SqlMatchType.None); + matchTesterNotExists(3, 3, false, SqlMatchType.None); + matchTesterNotExists(3 + SqlDml.Literal(0), 3, false, SqlMatchType.None); + matchTesterNotExists(3, 3, true, SqlMatchType.None); + matchTesterNotExists(3, 3 + SqlDml.Literal(0), true, SqlMatchType.None); + matchTesterNotExists(1, 3, false, SqlMatchType.None); + matchTesterNotExists(1 - SqlDml.Literal(0), 3, false, SqlMatchType.None); + matchTesterNotExists(1, 3, true, SqlMatchType.None); + matchTesterNotExists(1 + SqlDml.Literal(0), 3, true, SqlMatchType.None); + } + + //match full + { + matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.Full); + matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 2, false, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 2, true, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 4, false, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 4, true, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 3, false, SqlMatchType.Full); + matchTesterNotExists(SqlDml.Null, 3, true, SqlMatchType.Full); + matchTesterNotExists(9, SqlDml.Null, false, SqlMatchType.Full); + matchTesterNotExists(9, SqlDml.Null, true, SqlMatchType.Full); + matchTesterExists(1, 2, false, SqlMatchType.Full); + matchTesterExists(1, 2, true, SqlMatchType.Full); + matchTesterExists(3, 4, false, SqlMatchType.Full); + matchTesterNotExists(3, 4, true, SqlMatchType.Full); + matchTesterNotExists(9, 9, false, SqlMatchType.Full); + matchTesterNotExists(9, 9, true, SqlMatchType.Full); + matchTesterNotExists(1, 9, false, SqlMatchType.Full); + matchTesterNotExists(1, 9, true, SqlMatchType.Full); + } + + //match partial + { + matchTesterExists(SqlDml.Null, SqlDml.Null, false, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null + 1, SqlDml.Null - 2, false, SqlMatchType.Partial); + + matchTesterExists(SqlDml.Null, SqlDml.Null, true, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null + 2, SqlDml.Null - 3, true, SqlMatchType.Partial); + + matchTesterExists(SqlDml.Null, 2, false, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null * 4, 1 + SqlDml.Literal(1), false, SqlMatchType.Partial); + + matchTesterNotExists(SqlDml.Null, 2, true, SqlMatchType.Partial); + matchTesterNotExists(SqlDml.Null * 5, 3 - SqlDml.Literal(1), true, SqlMatchType.Partial); + + matchTesterExists(SqlDml.Null, 4, false, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null - 8, SqlDml.Literal(3) + 1, false, SqlMatchType.Partial); + + matchTesterNotExists(SqlDml.Null, 4, true, SqlMatchType.Partial); + matchTesterNotExists(SqlDml.Null / 7, 4 + SqlDml.Literal(0), true, SqlMatchType.Partial); + + matchTesterNotExists(SqlDml.Null, 3, false, SqlMatchType.Partial); + matchTesterNotExists(4 * SqlDml.Null, 3, false, SqlMatchType.Partial); + + matchTesterNotExists(SqlDml.Null, 3, true, SqlMatchType.Partial); + matchTesterNotExists(SqlDml.Null - 6, 3, true, SqlMatchType.Partial); + + matchTesterExists(5, SqlDml.Null, false, SqlMatchType.Partial); + matchTesterExists(1 * SqlDml.Literal(5), SqlDml.Null, false, SqlMatchType.Partial); + + matchTesterExists(5, SqlDml.Null, true, SqlMatchType.Partial); + matchTesterExists(5, SqlDml.Null / 2, true, SqlMatchType.Partial); + + matchTesterExists(SqlDml.Null, 6, false, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null - 0, 6, false, SqlMatchType.Partial); + + matchTesterExists(SqlDml.Null, 6, true, SqlMatchType.Partial); + matchTesterExists(SqlDml.Null, SqlDml.Literal(1) + 5, true, SqlMatchType.Partial); + + matchTesterNotExists(9, SqlDml.Null, false, SqlMatchType.Partial); + matchTesterNotExists(9, SqlDml.Null, true, SqlMatchType.Partial); + + matchTesterExists(1, 2, false, SqlMatchType.Partial); + matchTesterExists(1, 1 + SqlDml.Literal(1), false, SqlMatchType.Partial); + + matchTesterExists(1, 2, true, SqlMatchType.Partial); + matchTesterExists(1, 3 - SqlDml.Literal(1), true, SqlMatchType.Partial); + + matchTesterExists(3, 4, false, SqlMatchType.Partial); + matchTesterExists(3, SqlDml.Square(2), false, SqlMatchType.Partial); + + matchTesterNotExists(3, 4, true, SqlMatchType.Partial); + matchTesterNotExists(SqlDml.Literal(4) - 1, 4, true, SqlMatchType.Partial); + + matchTesterNotExists(9, 9, false, SqlMatchType.Partial); + matchTesterNotExists(9, 3 * SqlDml.Literal(3), false, SqlMatchType.Partial); + + matchTesterNotExists(9, 9, true, SqlMatchType.Partial); + matchTesterNotExists(9, 3 * SqlDml.Literal(3), true, SqlMatchType.Partial); + + matchTesterNotExists(1, 9, false, SqlMatchType.Partial); + matchTesterNotExists(1 + SqlDml.Literal(0), 9, false, SqlMatchType.Partial); + + matchTesterNotExists(1, 9, true, SqlMatchType.Partial); + matchTesterNotExists(1 + SqlDml.Literal(0), 9, true, SqlMatchType.Partial); + } + } + catch (Exception ex) { + Assert.Fail(ex.ToString()); + } + finally { + Connection.Rollback(); + var t = MyCatalog.DefaultSchema.Tables["match_pred_test"]; + if (t!=null) + MyCatalog.DefaultSchema.Tables.Remove(t); + } + } + + [Test] + public void AggregateTest() + { + Connection.BeginTransaction(); + try { + SqlBatch batch = SqlDml.Batch(); + TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("agg_test"); + t.PreserveRows = false; + t.CreateColumn("id", new SqlValueType(SqlType.Int32)); + t.CreateColumn("col1", new SqlValueType(SqlType.Int32)).IsNullable = true; + batch.Add(SqlDdl.Create(t)); + SqlTableRef tref = SqlDml.TableRef(t); + + Action insert = delegate(int id, SqlExpression expr1) { + SqlInsert ins2 = SqlDml.Insert(tref); + ins2.Values.Add(tref["id"], id); + ins2.Values.Add(tref["col1"], expr1); + batch.Add(ins2); + }; + //unique part + insert(01, 1); + insert(02, SqlDml.Null); + insert(03, 3); + insert(04, 4); + insert(05, 5); + insert(06, SqlDml.Null); + insert(07, 7); + insert(08, 8); + //non-unique part + insert(10, 3); + insert(11, 4); + insert(12, 7); + + ExecuteNonQuery(batch); + + //query + + { + SqlSelect q = SqlDml.Select(tref); + q.Columns.Add(SqlDml.Count(SqlDml.Asterisk)); //0 + q.Columns.Add(SqlDml.Count(tref["col1"])); //1 + q.Columns.Add(SqlDml.Count(tref["col1"], true)); //2 + q.Columns.Add(SqlDml.Min(tref["col1"])); //3 + q.Columns.Add(SqlDml.Min(tref["col1"], true)); //4 + q.Columns.Add(SqlDml.Max(tref["col1"])); //5 + q.Columns.Add(SqlDml.Max(tref["col1"], true)); //6 + q.Columns.Add(SqlDml.Sum(tref["col1"])); //7 + q.Columns.Add(SqlDml.Sum(tref["col1"], true)); //8 + q.Columns.Add(SqlDml.Cast(SqlDml.Avg(tref["col1"]), SqlType.Double)); //9 + q.Columns.Add(SqlDml.Avg(tref["col1"], true)); //10 -->decimal + + + using (DbDataReader dr = ExecuteQuery(q)) { + Assert.IsTrue(dr.Read()); + + //int32-vel nem megy at count()->int64 + Assert.AreEqual(11, dr.GetInt64(0)); //count of rows + Assert.AreEqual(9, dr.GetInt64(1)); //count of not null values + Assert.AreEqual(6, dr.GetInt64(2)); //count of unique not null values + Assert.AreEqual(1, Convert.ToInt32(dr[3])); //min + Assert.AreEqual(1, Convert.ToInt32(dr[4])); //min + Assert.AreEqual(8, Convert.ToInt32(dr[5])); //max + Assert.AreEqual(8, Convert.ToInt32(dr[6])); //max + Assert.AreEqual(42, Convert.ToInt32(dr[7])); //sum not null values + Assert.AreEqual(28, Convert.ToInt32(dr[8])); //sum not null unique values + Assert.AreEqual(Math.Round(42d / 9, 10), Math.Round(dr.GetDouble(9), 10)); //avg not null values + Assert.AreEqual(Math.Round(28d / 6, 10), Math.Round(dr.GetDecimal(10), 10)); //avg not null unique values + + Assert.IsFalse(dr.Read()); + + long l = 4; + //ez megy + int m = (int) l; + //ez nem megy: + //long n = (long)((object)m); + } + } + } + catch (Exception ex) { + Assert.Fail(ex.ToString()); + } + finally { + Connection.Rollback(); + var t = MyCatalog.DefaultSchema.Tables["agg_test"]; + if (t != null) + MyCatalog.DefaultSchema.Tables.Remove(t); + } + } + + + [Test] + public void IntOrderByTest1() + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(2, "col"); + q.OrderBy.Add(1); + using (ExecuteQuery(q)) { + } + } + + [Test] + public void IntOrderByTest2() + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(2, "col"); + q.OrderBy.Add(SqlDml.Order(1)); + using (ExecuteQuery(q)) { + } + } + + [Test] + public void SetOperationTest() + { + Func selectCreator = delegate(int n) { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(n, "col"); + return q; + }; + + ISqlCompileUnit unit; + SqlCompilationResult res; + + { + unit = SqlDml.Union(selectCreator(1), selectCreator(2)); + res = Driver.Compile(unit); + } + + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(SqlDml.In(1, SqlDml.Union(selectCreator(1), selectCreator(2)))); + using (DbDataReader dr = ExecuteQuery(q)) { + bool first = true; + while (dr.Read()) { + if (!first) + Assert.Fail(">1 row"); + Assert.AreEqual(true, dr.GetBoolean(0)); + first = false; + } + if (first) + Assert.Fail("empty result"); + } + } + } + + [Test, Ignore("SQLFIXME")] + public void UnionAndIntersectTest() + { + SqlSelect q = SqlDml.Select(SqlDml.QueryRef( + (SingleNumberSelect(1) + .Union(SingleNumberSelect(2))) + .Intersect(SingleNumberSelect(3) + .Union(SingleNumberSelect(4))))); + q.Columns.Add(1); + + AssertQueryNotExists(q); + } + + [Test] + public void UnionAndExceptTest() + { + SqlSelect q = SqlDml.Select(SqlDml.QueryRef( + (SingleNumberSelect(1) + .Union(SingleNumberSelect(2))) + .Except(SingleNumberSelect(1) + .Union(SingleNumberSelect(2))))); + q.Columns.Add(1); + AssertQueryNotExists(q); + } + + [Test] + public void UnionAllTest() + { + SqlSelect q = SqlDml.Select(SqlDml.QueryRef( + SingleNumberSelect(1).UnionAll(SingleNumberSelect(1)))); + q.Columns.Add(SqlDml.Count(SqlDml.Asterisk)); + + SqlSelect q2 = SqlDml.Select(); + q2.Where = 2==SqlDml.SubQuery(q); + q2.Columns.Add(5); + AssertQueryExists(q2); + } + + [Test] + public void UnionAllWithOrderByTest() + { + SqlSelect q1 = SingleNumberSelect(2); + + SqlSelect q2 = SingleNumberSelect(1); + q2.OrderBy.Add(q2.Columns[0]); + + SqlQueryExpression union = SqlDml.UnionAll(q1, q2); + + using (DbDataReader dr = ExecuteQuery(union)) { + int i; + for (i = 0; dr.Read(); i++) { + int value = Convert.ToInt32(dr[0]); + if (i==0) + Assert.AreEqual(2, value, "First value not 2"); + else if (i==1) + Assert.AreEqual(1, value, "Second value not 1"); + else + Assert.Fail("More than 2 rows"); + } + if (i!=2) + Assert.Fail("Not 2 rows"); + } + } + + [Test] + public void CursorTest() + { + Connection.BeginTransaction(); + try { + SqlBatch batch = SqlDml.Batch(); + TemporaryTable t = MyCatalog.DefaultSchema.CreateTemporaryTable("cursor_test"); + t.PreserveRows = false; + t.CreateColumn("id", new SqlValueType(SqlType.Int32)); + t.CreateColumn("dt", new SqlValueType(SqlType.DateTime)); + t.CreateColumn("bool", new SqlValueType(SqlType.Boolean)); + batch.Add(SqlDdl.Create(t)); + SqlTableRef tref = SqlDml.TableRef(t); + + //fill + { + int id = 1; + Action insert = delegate(SqlExpression expr1, SqlExpression expr2) { + SqlInsert ins2 = SqlDml.Insert(tref); + ins2.Values.Add(tref["id"], id); + ins2.Values.Add(tref["dt"], expr1); + ins2.Values.Add(tref["bool"], id % 2==0); + batch.Add(ins2); + id++; + }; + insert(new DateTime(2001, 1, 1, 1, 1, 1, 111), 0); + insert(new DateTime(2002, 2, 2, 2, 2, 2, 222), 0); + insert(new DateTime(2003, 3, 3, 3, 3, 3, 333), 0); + insert(new DateTime(2004, 4, 4, 4, 4, 4, 444), 0); + insert(new DateTime(2005, 5, 5, 5, 5, 5, 555), 0); + insert(new DateTime(2006, 6, 6, 6, 6, 6, 666), 0); + insert(new DateTime(2007, 7, 7, 7, 7, 7, 777), 0); + insert(new DateTime(2008, 8, 8, 8, 8, 8, 888), 0); + insert(new DateTime(2009, 9, 9, 9, 9, 9, 999), 0); + } + + ExecuteNonQuery(batch); + //query + { + SqlSelect testQuery = SqlDml.Select(tref); + testQuery.Columns.Add(SqlDml.Asterisk); + testQuery.OrderBy.Add(tref["id"]); + + SqlCursor mycursor = SqlDml.Cursor("mycursor", testQuery); + mycursor.Insensitive = true; + mycursor.WithHold = false; + mycursor.Scroll = true; + + ExecuteNonQuery(mycursor.Declare()); + + Func Execute = delegate(ISqlCompileUnit stmt) { + using (DbDataReader dr = ExecuteQuery(stmt)) { + DataTable result = new DataTable(); + result.Columns.Add("id", typeof (int)); + result.Columns.Add("dt", typeof (DateTime)); + result.Columns.Add("bool", typeof (bool)); + while (dr.Read()) { + result.Rows.Add(Convert.ToInt32(dr["id"]), dr["dt"], dr["bool"]); + } + return result; + } + }; + + + { + ExecuteNonQuery(mycursor.Open()); + { + DataTable result; + SqlFetch f; + + f = mycursor.Fetch(SqlFetchOption.Next); + result = Execute(f); //fetch first row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(1, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, 1); + result = Execute(f); //fetch second row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(2, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, -1); + result = Execute(f); //fetch first row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(1, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, 0); + result = Execute(f); //fetch same row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(1, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, 5); + result = Execute(f); //fetch 6th row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(6, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, -3); + result = Execute(f); //fetch 3th row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(3, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Last); + result = Execute(f); //fetch last row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(9, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Prior); + result = Execute(f); //fetch prior row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(8, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.Absolute, 4); + result = Execute(f); //fetch 4th row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(4, (int) result.Rows[0][0]); + + f = mycursor.Fetch(SqlFetchOption.First); + result = Execute(f); //fetch 1th row + Assert.AreEqual(1, result.Rows.Count); + Assert.AreEqual(1, (int) result.Rows[0][0]); + + /* + f = mycursor.Fetch(SqlFetchOption.Relative,3); + result = Execute(f);//fetch next 3 rows + Assert.AreEqual(3, result.Rows.Count); + Assert.AreEqual(2, (int)result.Rows[0][0]); + Assert.AreEqual(3, (int)result.Rows[1][0]); + Assert.AreEqual(4, (int)result.Rows[2][0]); + + f = mycursor.Fetch(SqlFetchOption.Relative, 6); + result = Execute(f);//fetch next 6 rows (only 5 remaining) + Assert.AreEqual(5, result.Rows.Count); + Assert.AreEqual(5, (int)result.Rows[0][0]); + Assert.AreEqual(6, (int)result.Rows[1][0]); + Assert.AreEqual(7, (int)result.Rows[2][0]); + Assert.AreEqual(8, (int)result.Rows[3][0]); + Assert.AreEqual(9, (int)result.Rows[4][0]); + /**/ + } + ExecuteNonQuery(mycursor.Close()); + + ExecuteNonQuery(mycursor.Open()); + { + } + ExecuteNonQuery(mycursor.Close()); + } + + { + } + } + } + catch (Exception ex) { + Assert.Fail(ex.ToString()); + } + finally { + Connection.Rollback(); + var t = MyCatalog.DefaultSchema.Tables["cursor_test"]; + if (t != null) + MyCatalog.DefaultSchema.Tables.Remove(t); + } + } + +/**/ + + + protected void ExecuteNonQuery(ISqlCompileUnit stmt) + { + using (var cmd = Connection.CreateCommand(stmt)) { + int result = cmd.ExecuteNonQuery(); + } + } + + protected DbDataReader ExecuteQuery(ISqlCompileUnit stmt) + { + using (var cmd = Connection.CreateCommand(stmt)) { + return cmd.ExecuteReader(); + } + } + + protected void AssertQueryExists(ISqlCompileUnit q) + { + using (var cmd = Connection.CreateCommand(q)) { + using (DbDataReader dr = cmd.ExecuteReader()) { + bool exists = false; + while (dr.Read()) { + exists = true; + break; + } + if (!exists) + Assert.Fail("Query not exists."); + } + } + } + + protected void AssertQueryNotExists(ISqlCompileUnit q) + { + using (var cmd = Connection.CreateCommand(q)) { + using (DbDataReader dr = cmd.ExecuteReader()) { + while (dr.Read()) { + Assert.Fail("Query exists."); + } + } + } + } + + protected SqlSelect SingleNumberSelect(int n) + { + SqlSelect q = SqlDml.Select(); + q.Columns.Add(n, "col"); + return q; + } + + + [Test] + public void RenameTest() + { + Schema schema = MyCatalog.CreateSchema("S1"); + Table table = schema.CreateTable("T1"); + table.CreateColumn("C1", new SqlValueType(SqlType.Int32)); + + try { + Connection.BeginTransaction(); + + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + batch.Add(SqlDdl.Create(schema)); + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + + var exModel1 = Driver.ExtractCatalog(Connection); + var exT1 = exModel1.Schemas[schema.DbName].Tables[table.DbName]; + Assert.IsNotNull(exT1); + var exC1 = exT1.TableColumns["C1"]; + Assert.IsNotNull(exC1); + + using (var cmd = Connection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + batch.Add(SqlDdl.Rename(exC1, "C2")); + batch.Add(SqlDdl.Rename(exT1, "T2")); + cmd.CommandText = Driver.Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + + var exModel2 = Driver.ExtractCatalog(Connection); + var exT2 = exModel2.Schemas[schema.DbName].Tables["T2"]; + Assert.IsNotNull(exT2); + var exC2 = exT2.TableColumns["C2"]; + Assert.IsNotNull(exC2); + + } finally { + Connection.Rollback(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/TypeMappingTest.cs index d89df03ab4..00a1520f71 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/PostgreSql/TypeMappingTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.08 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.PostgreSql -{ - [TestFixture] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.08 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.PostgreSql +{ + [TestFixture] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/ReplaceTests.cs b/Orm/Xtensive.Orm.Tests.Sql/ReplaceTests.cs index 8c2d77acb2..bad15106fe 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/ReplaceTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/ReplaceTests.cs @@ -1,436 +1,436 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - [TestFixture] - public class ReplaceTests - { - private Table table1; - private Table table2; - - [OneTimeSetUp] - public void SetUp() - { - var catalog = new Catalog("test"); - Schema schema1 = catalog.CreateSchema("dbo"); - - table1 = schema1.CreateTable("table1"); - table1.CreateColumn("ID", new SqlValueType(SqlType.Int32)); - table1.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - - table2 = schema1.CreateTable("table2"); - table2.CreateColumn("ID", new SqlValueType(SqlType.Int32)); - table2.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - } - - [Test] - public void SqlAggregateReplacingTest() - { - SqlAggregate a = SqlDml.Count(); - SqlAggregate aReplacing = SqlDml.Avg(1, true); - a.ReplaceWith(aReplacing); - - bool passed = false; - try { - a.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(a, aReplacing); - Assert.AreEqual(a.NodeType, aReplacing.NodeType); - Assert.AreEqual(a.Distinct, aReplacing.Distinct); - Assert.AreEqual(a.Expression, aReplacing.Expression); - } - - [Test] - public void SqlArrayReplacingTest() - { - SqlArray a = SqlDml.Array(new int[]{1, 2, 4}); - SqlArray aReplacing = SqlDml.Array(new int[]{1, 2, 4, 8}); - a.ReplaceWith(aReplacing); - - bool passed = false; - try { - a.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(a, aReplacing); - Assert.AreEqual(a.NodeType, aReplacing.NodeType); - Assert.AreEqual(a.Values, aReplacing.Values); - } - - [Test] - public void SqlBinaryReplacingTest() - { - SqlBinary b = SqlDml.Literal(1) + 2; - SqlBinary bReplacing = SqlDml.Divide(1, 2); - b.ReplaceWith(bReplacing); - - bool passed = false; - try { - b.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(b, bReplacing); - Assert.AreEqual(b.NodeType, bReplacing.NodeType); - Assert.AreEqual(b.Left, bReplacing.Left); - Assert.AreEqual(b.Right, bReplacing.Right); - } - - [Test] - public void SqlCaseReplacingTest() - { - SqlCase c1 = SqlDml.Case(); - SqlCase c2 = SqlDml.Case(SqlDml.Literal(1)); - c2.Else = SqlDml.Null; - c2[1] = 2; - c2[2] = 3; - c2[4] = 5; - c2[6] = 7; - c1.ReplaceWith(c2); - - bool passed = false; - try { - c1.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotSame(c1, c2); - //Possibly NUnit compares items of IEnumirable - //and if they the same it sugests two objects are equals - //Assert.AreNotEqual(c1, c2); - Assert.AreEqual(c1.NodeType, c2.NodeType); - Assert.AreEqual(c1.Value, c2.Value); - Assert.AreEqual(c1.Else, c2.Else); - Assert.AreEqual(c1.Count, c2.Count); - foreach (KeyValuePair p in c1) - Assert.AreEqual(p.Value, c2[p.Key]); - } - - [Test] - public void SqlCastReplacingTest() - { - SqlCast c = SqlDml.Cast(1, SqlType.Float); - SqlCast cReplacing = SqlDml.Cast(2, SqlType.Char); - c.ReplaceWith(cReplacing); - - bool passed = false; - try { - c.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(c, cReplacing); - Assert.AreEqual(c.NodeType, cReplacing.NodeType); - Assert.AreEqual(c.Operand, cReplacing.Operand); - Assert.AreEqual(c.Type, cReplacing.Type); - } - - [Test] - public void SqlColumnReplacingTest() - { -// SqlTableColumn c = Sql.Column(1); -// SqlTable t = Sql.DataTable(table1); -// SqlTableColumn cReplacing = t[0]; -// c.ReplaceWith(cReplacing); -// -// bool passed = false; -// try { -// c.ReplaceWith(1); -// } -// catch { -// passed = true; -// } -// -// Assert.IsTrue(passed); -// Assert.AreNotEqual(c, cReplacing); -// Assert.AreEqual(c.NodeType, cReplacing.NodeType); -// Assert.AreEqual(c.Name, cReplacing.Name); -// Assert.AreEqual(c.Column, cReplacing.Column); -// Assert.AreEqual(c.Expression, cReplacing.Expression); -// Assert.AreEqual(c.SqlTable, cReplacing.SqlTable); -// -// c.Dump(Console.Write); -// Console.WriteLine(); -// cReplacing.Dump(Console.Write); - } - - [Test] - public void SqlDefaultValueReplacingTest() - { - SqlDefaultValue d = SqlDml.DefaultValue; - SqlDefaultValue dReplacing = SqlDml.DefaultValue; - d.ReplaceWith(dReplacing); - - bool passed = false; - try { - d.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreEqual(d, dReplacing); - } - - [Test] - public void SqlFunctionCallReplacingTest() - { - SqlFunctionCall fc = SqlDml.CharLength(" text "); - SqlFunctionCall fcReplacing = SqlDml.Substring("text", 0, 2); - fc.ReplaceWith(fcReplacing); - - bool passed = false; - try { - fc.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(fc, fcReplacing); - Assert.AreEqual(fc.NodeType, fcReplacing.NodeType); - Assert.AreEqual(fc.FunctionType, fcReplacing.FunctionType); - Assert.AreEqual(fc.Arguments.Count, fcReplacing.Arguments.Count); - for (int i = 0, l = fc.Arguments.Count; i l = SqlDml.Literal(1); - SqlLiteral lReplacing = SqlDml.Literal(2); - l.ReplaceWith(lReplacing); - - bool passed = false; - try { - l.ReplaceWith("string"); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(l, lReplacing); - Assert.AreEqual(l.NodeType, lReplacing.NodeType); - Assert.AreEqual(l.Value, lReplacing.Value); - } - - [Test] - public void SqlMatchReplacingTest() - { - SqlTableRef t = SqlDml.TableRef(table1); - SqlSelect s1 = SqlDml.Select(t); - s1.Columns.Add(t[0]); - s1.Columns.Add(SqlDml.Null, "ID"); - SqlSelect s2 = SqlDml.Select(t); - s2.Columns.Add(t[0]); - s2.Columns.Add(t[1]); - SqlMatch m = SqlDml.Match(SqlDml.Row(1, "name"), s1, false, SqlMatchType.Partial); - SqlMatch mReplacing = SqlDml.Match(SqlDml.Row(1, "name"), s2, true, SqlMatchType.None); - m.ReplaceWith(mReplacing); - - bool passed = false; - try { - m.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotEqual(m, mReplacing); - Assert.AreEqual(m.NodeType, mReplacing.NodeType); - Assert.AreEqual(m.MatchType, mReplacing.MatchType); - Assert.AreEqual(m.Unique, mReplacing.Unique); - Assert.AreEqual(m.Value, mReplacing.Value); - Assert.AreEqual(m.SubQuery, mReplacing.SubQuery); - } - - [Test] - public void SqlNullReplacingTest() - { - SqlNull n = SqlDml.Null; - SqlNull nReplacing = SqlDml.Null; - n.ReplaceWith(nReplacing); - - bool passed = false; - try { - n.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreEqual(n, nReplacing); - } - - [Test] - public void SqlRowReplacingTest() - { - SqlRow r = SqlDml.Row(1, 2, 4); - SqlRow rReplacing = SqlDml.Row(1, 2, 4, "text", 'c'); - r.ReplaceWith(rReplacing); - - bool passed = false; - try { - r.ReplaceWith(1); - } - catch { - passed = true; - } - - Assert.IsTrue(passed); - Assert.AreNotSame(r, rReplacing); - Assert.AreEqual(r.NodeType, rReplacing.NodeType); - Assert.AreEqual(r.Count, rReplacing.Count); - for (int i = 0, l = r.Count; i a = SqlDml.Array(new int[]{1, 2, 4}); + SqlArray aReplacing = SqlDml.Array(new int[]{1, 2, 4, 8}); + a.ReplaceWith(aReplacing); + + bool passed = false; + try { + a.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(a, aReplacing); + Assert.AreEqual(a.NodeType, aReplacing.NodeType); + Assert.AreEqual(a.Values, aReplacing.Values); + } + + [Test] + public void SqlBinaryReplacingTest() + { + SqlBinary b = SqlDml.Literal(1) + 2; + SqlBinary bReplacing = SqlDml.Divide(1, 2); + b.ReplaceWith(bReplacing); + + bool passed = false; + try { + b.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(b, bReplacing); + Assert.AreEqual(b.NodeType, bReplacing.NodeType); + Assert.AreEqual(b.Left, bReplacing.Left); + Assert.AreEqual(b.Right, bReplacing.Right); + } + + [Test] + public void SqlCaseReplacingTest() + { + SqlCase c1 = SqlDml.Case(); + SqlCase c2 = SqlDml.Case(SqlDml.Literal(1)); + c2.Else = SqlDml.Null; + c2[1] = 2; + c2[2] = 3; + c2[4] = 5; + c2[6] = 7; + c1.ReplaceWith(c2); + + bool passed = false; + try { + c1.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotSame(c1, c2); + //Possibly NUnit compares items of IEnumirable + //and if they the same it sugests two objects are equals + //Assert.AreNotEqual(c1, c2); + Assert.AreEqual(c1.NodeType, c2.NodeType); + Assert.AreEqual(c1.Value, c2.Value); + Assert.AreEqual(c1.Else, c2.Else); + Assert.AreEqual(c1.Count, c2.Count); + foreach (KeyValuePair p in c1) + Assert.AreEqual(p.Value, c2[p.Key]); + } + + [Test] + public void SqlCastReplacingTest() + { + SqlCast c = SqlDml.Cast(1, SqlType.Float); + SqlCast cReplacing = SqlDml.Cast(2, SqlType.Char); + c.ReplaceWith(cReplacing); + + bool passed = false; + try { + c.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(c, cReplacing); + Assert.AreEqual(c.NodeType, cReplacing.NodeType); + Assert.AreEqual(c.Operand, cReplacing.Operand); + Assert.AreEqual(c.Type, cReplacing.Type); + } + + [Test] + public void SqlColumnReplacingTest() + { +// SqlTableColumn c = Sql.Column(1); +// SqlTable t = Sql.DataTable(table1); +// SqlTableColumn cReplacing = t[0]; +// c.ReplaceWith(cReplacing); +// +// bool passed = false; +// try { +// c.ReplaceWith(1); +// } +// catch { +// passed = true; +// } +// +// Assert.IsTrue(passed); +// Assert.AreNotEqual(c, cReplacing); +// Assert.AreEqual(c.NodeType, cReplacing.NodeType); +// Assert.AreEqual(c.Name, cReplacing.Name); +// Assert.AreEqual(c.Column, cReplacing.Column); +// Assert.AreEqual(c.Expression, cReplacing.Expression); +// Assert.AreEqual(c.SqlTable, cReplacing.SqlTable); +// +// c.Dump(Console.Write); +// Console.WriteLine(); +// cReplacing.Dump(Console.Write); + } + + [Test] + public void SqlDefaultValueReplacingTest() + { + SqlDefaultValue d = SqlDml.DefaultValue; + SqlDefaultValue dReplacing = SqlDml.DefaultValue; + d.ReplaceWith(dReplacing); + + bool passed = false; + try { + d.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreEqual(d, dReplacing); + } + + [Test] + public void SqlFunctionCallReplacingTest() + { + SqlFunctionCall fc = SqlDml.CharLength(" text "); + SqlFunctionCall fcReplacing = SqlDml.Substring("text", 0, 2); + fc.ReplaceWith(fcReplacing); + + bool passed = false; + try { + fc.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(fc, fcReplacing); + Assert.AreEqual(fc.NodeType, fcReplacing.NodeType); + Assert.AreEqual(fc.FunctionType, fcReplacing.FunctionType); + Assert.AreEqual(fc.Arguments.Count, fcReplacing.Arguments.Count); + for (int i = 0, l = fc.Arguments.Count; i l = SqlDml.Literal(1); + SqlLiteral lReplacing = SqlDml.Literal(2); + l.ReplaceWith(lReplacing); + + bool passed = false; + try { + l.ReplaceWith("string"); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(l, lReplacing); + Assert.AreEqual(l.NodeType, lReplacing.NodeType); + Assert.AreEqual(l.Value, lReplacing.Value); + } + + [Test] + public void SqlMatchReplacingTest() + { + SqlTableRef t = SqlDml.TableRef(table1); + SqlSelect s1 = SqlDml.Select(t); + s1.Columns.Add(t[0]); + s1.Columns.Add(SqlDml.Null, "ID"); + SqlSelect s2 = SqlDml.Select(t); + s2.Columns.Add(t[0]); + s2.Columns.Add(t[1]); + SqlMatch m = SqlDml.Match(SqlDml.Row(1, "name"), s1, false, SqlMatchType.Partial); + SqlMatch mReplacing = SqlDml.Match(SqlDml.Row(1, "name"), s2, true, SqlMatchType.None); + m.ReplaceWith(mReplacing); + + bool passed = false; + try { + m.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotEqual(m, mReplacing); + Assert.AreEqual(m.NodeType, mReplacing.NodeType); + Assert.AreEqual(m.MatchType, mReplacing.MatchType); + Assert.AreEqual(m.Unique, mReplacing.Unique); + Assert.AreEqual(m.Value, mReplacing.Value); + Assert.AreEqual(m.SubQuery, mReplacing.SubQuery); + } + + [Test] + public void SqlNullReplacingTest() + { + SqlNull n = SqlDml.Null; + SqlNull nReplacing = SqlDml.Null; + n.ReplaceWith(nReplacing); + + bool passed = false; + try { + n.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreEqual(n, nReplacing); + } + + [Test] + public void SqlRowReplacingTest() + { + SqlRow r = SqlDml.Row(1, 2, 4); + SqlRow rReplacing = SqlDml.Row(1, 2, 4, "text", 'c'); + r.ReplaceWith(rReplacing); + + bool passed = false; + try { + r.ReplaceWith(1); + } + catch { + passed = true; + } + + Assert.IsTrue(passed); + Assert.AreNotSame(r, rReplacing); + Assert.AreEqual(r.NodeType, rReplacing.NodeType); + Assert.AreEqual(r.Count, rReplacing.Count); + for (int i = 0, l = r.Count; i=0); - t.CreateCheckConstraint("CK_Product_ListPrice", SqlDml.Upper(st["ListPrice"])>=0); - t.CreateCheckConstraint("CK_Product_ProductLine", SqlDml.Upper(st["ProductLine"])=='R' || - SqlDml.Upper(st["ProductLine"])=='M' || - SqlDml.Upper(st["ProductLine"])=='T' || - SqlDml.Upper(st["ProductLine"])=='S' || - SqlDml.IsNull(st["ProductLine"])); - t.CreateCheckConstraint("CK_Product_ReorderPoint", SqlDml.Upper(st["ReorderPoint"])>0); - t.CreateCheckConstraint("CK_Product_SafetyStockLevel", SqlDml.Upper(st["SafetyStockLevel"])>0); - t.CreateCheckConstraint("CK_Product_SellEndDate", SqlDml.Upper(st["SellEndDate"])>st["SellStartDate"] || - SqlDml.IsNull(st["SellEndDate"])); - t.CreateCheckConstraint("CK_Product_StandardCost", SqlDml.Upper(st["StandardCost"])>=0); - t.CreateCheckConstraint("CK_Product_Style", SqlDml.Upper(st["Style"])=='U' || - SqlDml.Upper(st["Style"])=='M' || - SqlDml.Upper(st["Style"])=='W' || - SqlDml.IsNull(st["Style"])); - t.CreateCheckConstraint("CK_Product_Weight", SqlDml.Upper(st["Weight"])>0); - t.CreatePrimaryKey("PK_Product_ProductID", t.TableColumns["ProductID"]); - cs = t.CreateForeignKey("FK_Product_ProductModel_ProductModelID"); - ((ForeignKey)cs).Columns.Add(t.TableColumns["ProductModelID"]); - ((ForeignKey)cs).ReferencedColumns.Add(Catalog.Schemas["Production"].Tables["ProductModel"].TableColumns["ProductModelID"]); - - t = Catalog.Schemas["Person"].CreateTable("Contact"); - t.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("NameStyle", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Title", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("FirstName", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("MiddleName", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("LastName", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Suffix", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("EmailAddress", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("EmailPromotion", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Phone", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("PasswordHash", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("PasswordSalt", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("AdditionalContactInfo", new SqlValueType("xml")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("UnitMeasure"); - t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("ProductReview"); - t.CreateColumn("ProductReviewID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("ProductID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("ReviewerName", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ReviewDate", new SqlValueType(SqlType.DateTime)); - t.CreateColumn("EmailAddress", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Rating", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Comments", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("ProductSubcategory"); - t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("ProductCategoryID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Person"].CreateTable("AddressType"); - t.CreateColumn("AddressTypeID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("SalesReason"); - t.CreateColumn("SalesReasonID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ReasonType", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["HumanResources"].CreateTable("Department"); - t.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("GroupName", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Person"].CreateTable("CountryRegion"); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("Culture"); - t.CreateColumn("CultureID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("Currency"); - t.CreateColumn("CurrencyCode", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Person"].CreateTable("ContactType"); - t.CreateColumn("ContactTypeID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("SalesTaxRate"); - t.CreateColumn("SalesTaxRateID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("StateProvinceID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("TaxType", new SqlValueType(SqlType.UInt8)); - t.CreateColumn("TaxRate", new SqlValueType("money")); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("Location"); - t.CreateColumn("LocationID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("CostRate", new SqlValueType("money")); - t.CreateColumn("Availability", new SqlValueType(SqlType.Decimal)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("SalesTerritory"); - t.CreateColumn("TerritoryID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("CountryRegionCode", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("Group", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("TaxRate", new SqlValueType("money")); - t.CreateColumn("SalesYTD", new SqlValueType("money")); - t.CreateColumn("SalesLastYear", new SqlValueType("money")); - t.CreateColumn("CostYTD", new SqlValueType("money")); - t.CreateColumn("CostLastYear", new SqlValueType("money")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("ScrapReason"); - t.CreateColumn("ScrapReasonID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["HumanResources"].CreateTable("Shift"); - t.CreateColumn("ShiftID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("StartTime", new SqlValueType(SqlType.DateTime)); - t.CreateColumn("EndTime", new SqlValueType(SqlType.DateTime)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Production"].CreateTable("ProductCategory"); - t.CreateColumn("ProductCategoryID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Purchasing"].CreateTable("ShipMethod"); - t.CreateColumn("ShipMethodID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("ShipBase", new SqlValueType("money")); - t.CreateColumn("ShipRate", new SqlValueType("money")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("Store"); - t.CreateColumn("CustomerID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); - t.CreateColumn("SalesPersonID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Demographics", new SqlValueType("xml")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["Sales"].CreateTable("Individual"); - t.CreateColumn("CustomerID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Demographics", new SqlValueType("xml")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - t = Catalog.Schemas["HumanResources"].CreateTable("JobCandidate"); - t.CreateColumn("JobCandidateID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Resume", new SqlValueType("xml")); - t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef cRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); - SqlTableRef ea = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeeAddress"], "ea"); - SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"], "a"); - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "sp"); - SqlTableRef cr = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "cr"); - - SqlSelect select = SqlDml.Select(e); - select.From = select.From.InnerJoin(cRef, cRef["ContactID"]==e["ContactID"]); - select.From = select.From.InnerJoin(ea, e["EmployeeID"]==ea["EmployeeID"]); - select.From = select.From.InnerJoin(a, ea["AddressID"]==a["AddressID"]); - select.From = select.From.InnerJoin(sp, sp["StateProvinceID"]==a["StateProvinceID"]); - select.From = select.From.InnerJoin(cr, cr["CountryRegionCode"]==sp["CountryRegionCode"]); - select.Columns.AddRange(e["EmployeeID"], cRef["Title"], cRef["FirstName"], cRef["MiddleName"], - cRef["LastName"], cRef["Suffix"]); - select.Columns.Add(e["Title"], "JobTitle"); - select.Columns.AddRange(cRef["Phone"], cRef["EmailAddress"], cRef["EmailPromotion"], - a["AddressLine1"], a["AddressLine2"], a["City"]); - select.Columns.Add(sp["Name"], "StateProvinceName"); - select.Columns.Add(a["PostalCode"]); - select.Columns.Add(cr["Name"], "CountryRegionName"); - select.Columns.Add(cRef["AdditionalContactInfo"]); - - //SqlDriver mssqlDriver = new MssqlDriver(new MssqlVersionInfo(new Version())); - //v = Catalog.Schemas["HumanResources"].CreateView("vEmployee", -// Sql.Native(mssqlDriver.Compile(select).CommandText)); -// bmp.Save(model); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; +using Xtensive.Sql.Dml; +using Constraint = Xtensive.Sql.Model.Constraint; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public abstract class AdventureWorks + { + protected struct DbCommandExecutionResult + { + public int FieldCount; + public string[] FieldNames; + public int RowCount; + + public override string ToString() + { + if (FieldNames==null) + FieldNames = new string[0]; + return string.Format("Fields: '{0}'; Rows: {1}", string.Join("', '", FieldNames), RowCount); + } + } + + protected static DbCommandExecutionResult GetExecuteDataReaderResult(IDbCommand cmd) + { + DbCommandExecutionResult result = new DbCommandExecutionResult(); + try { + cmd.Transaction = cmd.Connection.BeginTransaction(); + int rowCount = 0; + int fieldCount = 0; + string[] fieldNames = new string[0]; + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) { + if (rowCount==0) { + fieldCount = reader.FieldCount; + fieldNames = new string[fieldCount]; + for (int i = 0; i=0); + t.CreateCheckConstraint("CK_Product_ListPrice", SqlDml.Upper(st["ListPrice"])>=0); + t.CreateCheckConstraint("CK_Product_ProductLine", SqlDml.Upper(st["ProductLine"])=='R' || + SqlDml.Upper(st["ProductLine"])=='M' || + SqlDml.Upper(st["ProductLine"])=='T' || + SqlDml.Upper(st["ProductLine"])=='S' || + SqlDml.IsNull(st["ProductLine"])); + t.CreateCheckConstraint("CK_Product_ReorderPoint", SqlDml.Upper(st["ReorderPoint"])>0); + t.CreateCheckConstraint("CK_Product_SafetyStockLevel", SqlDml.Upper(st["SafetyStockLevel"])>0); + t.CreateCheckConstraint("CK_Product_SellEndDate", SqlDml.Upper(st["SellEndDate"])>st["SellStartDate"] || + SqlDml.IsNull(st["SellEndDate"])); + t.CreateCheckConstraint("CK_Product_StandardCost", SqlDml.Upper(st["StandardCost"])>=0); + t.CreateCheckConstraint("CK_Product_Style", SqlDml.Upper(st["Style"])=='U' || + SqlDml.Upper(st["Style"])=='M' || + SqlDml.Upper(st["Style"])=='W' || + SqlDml.IsNull(st["Style"])); + t.CreateCheckConstraint("CK_Product_Weight", SqlDml.Upper(st["Weight"])>0); + t.CreatePrimaryKey("PK_Product_ProductID", t.TableColumns["ProductID"]); + cs = t.CreateForeignKey("FK_Product_ProductModel_ProductModelID"); + ((ForeignKey)cs).Columns.Add(t.TableColumns["ProductModelID"]); + ((ForeignKey)cs).ReferencedColumns.Add(Catalog.Schemas["Production"].Tables["ProductModel"].TableColumns["ProductModelID"]); + + t = Catalog.Schemas["Person"].CreateTable("Contact"); + t.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("NameStyle", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Title", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("FirstName", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("MiddleName", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("LastName", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Suffix", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("EmailAddress", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("EmailPromotion", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Phone", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("PasswordHash", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("PasswordSalt", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("AdditionalContactInfo", new SqlValueType("xml")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("UnitMeasure"); + t.CreateColumn("UnitMeasureCode", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("ProductReview"); + t.CreateColumn("ProductReviewID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("ProductID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("ReviewerName", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ReviewDate", new SqlValueType(SqlType.DateTime)); + t.CreateColumn("EmailAddress", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Rating", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Comments", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("ProductSubcategory"); + t.CreateColumn("ProductSubcategoryID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("ProductCategoryID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Person"].CreateTable("AddressType"); + t.CreateColumn("AddressTypeID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("SalesReason"); + t.CreateColumn("SalesReasonID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ReasonType", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["HumanResources"].CreateTable("Department"); + t.CreateColumn("DepartmentID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("GroupName", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Person"].CreateTable("CountryRegion"); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("Culture"); + t.CreateColumn("CultureID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("Currency"); + t.CreateColumn("CurrencyCode", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Person"].CreateTable("ContactType"); + t.CreateColumn("ContactTypeID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("SalesTaxRate"); + t.CreateColumn("SalesTaxRateID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("StateProvinceID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("TaxType", new SqlValueType(SqlType.UInt8)); + t.CreateColumn("TaxRate", new SqlValueType("money")); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("Location"); + t.CreateColumn("LocationID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("CostRate", new SqlValueType("money")); + t.CreateColumn("Availability", new SqlValueType(SqlType.Decimal)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("SalesTerritory"); + t.CreateColumn("TerritoryID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("CountryRegionCode", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("Group", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("TaxRate", new SqlValueType("money")); + t.CreateColumn("SalesYTD", new SqlValueType("money")); + t.CreateColumn("SalesLastYear", new SqlValueType("money")); + t.CreateColumn("CostYTD", new SqlValueType("money")); + t.CreateColumn("CostLastYear", new SqlValueType("money")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("ScrapReason"); + t.CreateColumn("ScrapReasonID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["HumanResources"].CreateTable("Shift"); + t.CreateColumn("ShiftID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("StartTime", new SqlValueType(SqlType.DateTime)); + t.CreateColumn("EndTime", new SqlValueType(SqlType.DateTime)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Production"].CreateTable("ProductCategory"); + t.CreateColumn("ProductCategoryID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Purchasing"].CreateTable("ShipMethod"); + t.CreateColumn("ShipMethodID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("ShipBase", new SqlValueType("money")); + t.CreateColumn("ShipRate", new SqlValueType("money")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("Store"); + t.CreateColumn("CustomerID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Name", new SqlValueType(SqlType.VarChar)); + t.CreateColumn("SalesPersonID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Demographics", new SqlValueType("xml")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["Sales"].CreateTable("Individual"); + t.CreateColumn("CustomerID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("ContactID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Demographics", new SqlValueType("xml")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + t = Catalog.Schemas["HumanResources"].CreateTable("JobCandidate"); + t.CreateColumn("JobCandidateID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("EmployeeID", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Resume", new SqlValueType("xml")); + t.CreateColumn("ModifiedDate", new SqlValueType(SqlType.DateTime)); + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef cRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); + SqlTableRef ea = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeeAddress"], "ea"); + SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"], "a"); + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "sp"); + SqlTableRef cr = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "cr"); + + SqlSelect select = SqlDml.Select(e); + select.From = select.From.InnerJoin(cRef, cRef["ContactID"]==e["ContactID"]); + select.From = select.From.InnerJoin(ea, e["EmployeeID"]==ea["EmployeeID"]); + select.From = select.From.InnerJoin(a, ea["AddressID"]==a["AddressID"]); + select.From = select.From.InnerJoin(sp, sp["StateProvinceID"]==a["StateProvinceID"]); + select.From = select.From.InnerJoin(cr, cr["CountryRegionCode"]==sp["CountryRegionCode"]); + select.Columns.AddRange(e["EmployeeID"], cRef["Title"], cRef["FirstName"], cRef["MiddleName"], + cRef["LastName"], cRef["Suffix"]); + select.Columns.Add(e["Title"], "JobTitle"); + select.Columns.AddRange(cRef["Phone"], cRef["EmailAddress"], cRef["EmailPromotion"], + a["AddressLine1"], a["AddressLine2"], a["City"]); + select.Columns.Add(sp["Name"], "StateProvinceName"); + select.Columns.Add(a["PostalCode"]); + select.Columns.Add(cr["Name"], "CountryRegionName"); + select.Columns.Add(cRef["AdditionalContactInfo"]); + + //SqlDriver mssqlDriver = new MssqlDriver(new MssqlVersionInfo(new Version())); + //v = Catalog.Schemas["HumanResources"].CreateView("vEmployee", +// Sql.Native(mssqlDriver.Compile(select).CommandText)); +// bmp.Save(model); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTest.cs index 011ff0eac1..da8af9c6c8 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTest.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.06 - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - class CompilerTest : Sql.CompilerTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.06 + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + class CompilerTest : Sql.CompilerTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTests.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTests.cs index 58c46d31e4..006fe88e33 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/CompilerTests.cs @@ -1,198 +1,198 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; -using NUnit.Framework; -using System; -using System.Data; -using System.Data.Common; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture, Explicit] - public class CompilerTests: AdventureWorks - { - private SqlConnection sqlConnection; - private DbCommand sqlCommand; - private SqlDriver sqlDriver; - - [OneTimeSetUp] - public override void SetUp() - { - base.SetUp(); - - sqlDriver = TestSqlDriver.Create(Url); - sqlConnection = sqlDriver.CreateConnection(); - sqlCommand = sqlConnection.CreateCommand(); - try { - sqlConnection.Open(); - } - catch (SystemException e) { - Console.WriteLine(e); - } - } - - [OneTimeTearDown] - public void TearDown() - { - try { - if ((sqlConnection!=null) && (sqlConnection.State!=ConnectionState.Closed)) - sqlConnection.Close(); - } - catch (Exception ex) { - Console.WriteLine(ex.Message); - } - } - - [Test] - public void TableIsNotSetTest1() - { - SqlDelete delete = SqlDml.Delete(); - Assert.Throws(() => sqlDriver.Compile(delete)); - } - - [Test] - public void TableIsNotSetTest2() - { - SqlInsert insert = SqlDml.Insert(); - Assert.Throws(() => sqlDriver.Compile(insert)); - } - - [Test] - public void TableIsNotSetTest3() - { - SqlUpdate update = SqlDml.Update(); - Assert.Throws(() => sqlDriver.Compile(update)); - } - - [Test] - public void UnboundColumnsTest() - { - SqlTableRef t = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlTableRef t1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "Contact2"); - SqlTableRef t2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - - SqlUpdate update = SqlDml.Update(t); - update.Values[t[0]] = 123; - update.Values[t[0]] = t2[0]; - update.Values[t2[0]] = t1[0]; - update.Values[t2[0]] = SqlDml.Null; - update.Where = t[0]>2; - - Assert.Throws(() => sqlDriver.Compile(update)); - } - - [Test] - public void TableAutoAliasTest() - { - SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "a"); - SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "a"); - - SqlSelect select = SqlDml.Select(tr1.CrossJoin(tr2)); - select.Limit = 10; - select.Columns.AddRange(tr1[0], tr1[0], tr2[0]); - select.Where = tr1[0]>1 && tr2[0]>1; - - sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - GetExecuteDataReaderResult(sqlCommand); - } - - [Test] - public void VariantTest() - { - var variantId = new object(); - var select = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"])); - select.Limit = 1; - select.Columns.Add(SqlDml.Variant(variantId, 1, 2), "value"); - var result = sqlConnection.Driver.Compile(select); - using (var command = sqlConnection.CreateCommand()) { - command.CommandText = result.GetCommandText(); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - Assert.AreEqual(1, reader.GetInt32(0)); - } - var configuration = new SqlPostCompilerConfiguration {AlternativeBranches = {variantId}}; - command.CommandText = result.GetCommandText(configuration); - using (var reader = command.ExecuteReader()) { - Assert.IsTrue(reader.Read()); - Assert.AreEqual(2, reader.GetInt32(0)); - } - } - } - - [Test] - public void PlaceholderTest() - { - var placeholderId = new object(); - var select = SqlDml.Select(SqlDml.Placeholder(placeholderId)); - var result = sqlConnection.Driver.Compile(select); - using (var command = sqlConnection.CreateCommand()) { - var configuration = new SqlPostCompilerConfiguration {PlaceholderValues = {{placeholderId, "@xxx"}}}; - command.CommandText = result.GetCommandText(configuration); - var parameter = command.CreateParameter(); - parameter.ParameterName = "xxx"; - parameter.DbType = DbType.Int32; - parameter.Value = (int) 'x'; - command.Parameters.Add(parameter); - Assert.AreEqual((int) 'x', command.ExecuteScalar()); - } - using (var command = sqlConnection.CreateCommand()) { - var configuration = new SqlPostCompilerConfiguration {PlaceholderValues = {{placeholderId, "@yyy"}}}; - command.CommandText = result.GetCommandText(configuration); - var parameter = command.CreateParameter(); - parameter.ParameterName = "yyy"; - parameter.DbType = DbType.Int32; - parameter.Value = (int) 'y'; - command.Parameters.Add(parameter); - Assert.AreEqual((int) 'y', command.ExecuteScalar()); - } - } - - [Test] - public void SingleColumnDynamicFilterTest() - { - var dynamicFilterId = new object(); - var tableRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - var select = SqlDml.Select(tableRef); - select.Columns.Add(SqlDml.Count()); - var filter = SqlDml.DynamicFilter(dynamicFilterId); - select.Where = filter; - filter.Expressions.Add(tableRef["LastName"]); - var result = sqlConnection.Driver.Compile(select); - using (var command = sqlConnection.CreateCommand()) { - var values = new List {new[] {"'Achong'"}, new[] {"'Abel'"}}; - var configuration = new SqlPostCompilerConfiguration {DynamicFilterValues = {{dynamicFilterId, values}}}; - command.CommandText = result.GetCommandText(configuration); - int count = Convert.ToInt32(command.ExecuteScalar()); - Assert.AreEqual(2, count); - } - } - - [Test] - public void MultiColumnDynamicFilterTest() - { - var dynamicFilterId = new object(); - var tableRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - var select = SqlDml.Select(tableRef); - select.Columns.Add(SqlDml.Count()); - var filter = SqlDml.DynamicFilter(dynamicFilterId); - select.Where = filter; - filter.Expressions.Add(tableRef["FirstName"]); - filter.Expressions.Add(tableRef["LastName"]); - var result = sqlConnection.Driver.Compile(select); - using (var command = sqlConnection.CreateCommand()) { - var values = new List {new[] {"'Gustavo'", "'Achong'"}, new[] {"'Catherine'", "'Abel'"}}; - var configuration = new SqlPostCompilerConfiguration {DynamicFilterValues = {{dynamicFilterId, values}}}; - command.CommandText = result.GetCommandText(configuration); - int count = Convert.ToInt32(command.ExecuteScalar()); - Assert.AreEqual(2, count); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; +using NUnit.Framework; +using System; +using System.Data; +using System.Data.Common; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture, Explicit] + public class CompilerTests: AdventureWorks + { + private SqlConnection sqlConnection; + private DbCommand sqlCommand; + private SqlDriver sqlDriver; + + [OneTimeSetUp] + public override void SetUp() + { + base.SetUp(); + + sqlDriver = TestSqlDriver.Create(Url); + sqlConnection = sqlDriver.CreateConnection(); + sqlCommand = sqlConnection.CreateCommand(); + try { + sqlConnection.Open(); + } + catch (SystemException e) { + Console.WriteLine(e); + } + } + + [OneTimeTearDown] + public void TearDown() + { + try { + if ((sqlConnection!=null) && (sqlConnection.State!=ConnectionState.Closed)) + sqlConnection.Close(); + } + catch (Exception ex) { + Console.WriteLine(ex.Message); + } + } + + [Test] + public void TableIsNotSetTest1() + { + SqlDelete delete = SqlDml.Delete(); + Assert.Throws(() => sqlDriver.Compile(delete)); + } + + [Test] + public void TableIsNotSetTest2() + { + SqlInsert insert = SqlDml.Insert(); + Assert.Throws(() => sqlDriver.Compile(insert)); + } + + [Test] + public void TableIsNotSetTest3() + { + SqlUpdate update = SqlDml.Update(); + Assert.Throws(() => sqlDriver.Compile(update)); + } + + [Test] + public void UnboundColumnsTest() + { + SqlTableRef t = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlTableRef t1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "Contact2"); + SqlTableRef t2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + + SqlUpdate update = SqlDml.Update(t); + update.Values[t[0]] = 123; + update.Values[t[0]] = t2[0]; + update.Values[t2[0]] = t1[0]; + update.Values[t2[0]] = SqlDml.Null; + update.Where = t[0]>2; + + Assert.Throws(() => sqlDriver.Compile(update)); + } + + [Test] + public void TableAutoAliasTest() + { + SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "a"); + SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "a"); + + SqlSelect select = SqlDml.Select(tr1.CrossJoin(tr2)); + select.Limit = 10; + select.Columns.AddRange(tr1[0], tr1[0], tr2[0]); + select.Where = tr1[0]>1 && tr2[0]>1; + + sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + GetExecuteDataReaderResult(sqlCommand); + } + + [Test] + public void VariantTest() + { + var variantId = new object(); + var select = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"])); + select.Limit = 1; + select.Columns.Add(SqlDml.Variant(variantId, 1, 2), "value"); + var result = sqlConnection.Driver.Compile(select); + using (var command = sqlConnection.CreateCommand()) { + command.CommandText = result.GetCommandText(); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + Assert.AreEqual(1, reader.GetInt32(0)); + } + var configuration = new SqlPostCompilerConfiguration {AlternativeBranches = {variantId}}; + command.CommandText = result.GetCommandText(configuration); + using (var reader = command.ExecuteReader()) { + Assert.IsTrue(reader.Read()); + Assert.AreEqual(2, reader.GetInt32(0)); + } + } + } + + [Test] + public void PlaceholderTest() + { + var placeholderId = new object(); + var select = SqlDml.Select(SqlDml.Placeholder(placeholderId)); + var result = sqlConnection.Driver.Compile(select); + using (var command = sqlConnection.CreateCommand()) { + var configuration = new SqlPostCompilerConfiguration {PlaceholderValues = {{placeholderId, "@xxx"}}}; + command.CommandText = result.GetCommandText(configuration); + var parameter = command.CreateParameter(); + parameter.ParameterName = "xxx"; + parameter.DbType = DbType.Int32; + parameter.Value = (int) 'x'; + command.Parameters.Add(parameter); + Assert.AreEqual((int) 'x', command.ExecuteScalar()); + } + using (var command = sqlConnection.CreateCommand()) { + var configuration = new SqlPostCompilerConfiguration {PlaceholderValues = {{placeholderId, "@yyy"}}}; + command.CommandText = result.GetCommandText(configuration); + var parameter = command.CreateParameter(); + parameter.ParameterName = "yyy"; + parameter.DbType = DbType.Int32; + parameter.Value = (int) 'y'; + command.Parameters.Add(parameter); + Assert.AreEqual((int) 'y', command.ExecuteScalar()); + } + } + + [Test] + public void SingleColumnDynamicFilterTest() + { + var dynamicFilterId = new object(); + var tableRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + var select = SqlDml.Select(tableRef); + select.Columns.Add(SqlDml.Count()); + var filter = SqlDml.DynamicFilter(dynamicFilterId); + select.Where = filter; + filter.Expressions.Add(tableRef["LastName"]); + var result = sqlConnection.Driver.Compile(select); + using (var command = sqlConnection.CreateCommand()) { + var values = new List {new[] {"'Achong'"}, new[] {"'Abel'"}}; + var configuration = new SqlPostCompilerConfiguration {DynamicFilterValues = {{dynamicFilterId, values}}}; + command.CommandText = result.GetCommandText(configuration); + int count = Convert.ToInt32(command.ExecuteScalar()); + Assert.AreEqual(2, count); + } + } + + [Test] + public void MultiColumnDynamicFilterTest() + { + var dynamicFilterId = new object(); + var tableRef = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + var select = SqlDml.Select(tableRef); + select.Columns.Add(SqlDml.Count()); + var filter = SqlDml.DynamicFilter(dynamicFilterId); + select.Where = filter; + filter.Expressions.Add(tableRef["FirstName"]); + filter.Expressions.Add(tableRef["LastName"]); + var result = sqlConnection.Driver.Compile(select); + using (var command = sqlConnection.CreateCommand()) { + var values = new List {new[] {"'Gustavo'", "'Achong'"}, new[] {"'Catherine'", "'Abel'"}}; + var configuration = new SqlPostCompilerConfiguration {DynamicFilterValues = {{dynamicFilterId, values}}}; + command.CommandText = result.GetCommandText(configuration); + int count = Convert.ToInt32(command.ExecuteScalar()); + Assert.AreEqual(2, count); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ConnectionTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ConnectionTest.cs index 4adefe5092..5015b63512 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ConnectionTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ConnectionTest.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.10.30 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Building.Builders; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class ConnectionTest - { - private string provider = TestConnectionInfoProvider.GetProvider(); - protected string Url = TestConnectionInfoProvider.GetConnectionUrl(); - protected string ConnectionString = TestConnectionInfoProvider.GetConnectionString(); - - [OneTimeSetUp] - public void SetUp() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - - [Test] - [Explicit("Manual sql profiling needed")] - public void ConntectionTest() - { - var descriptor = ProviderDescriptor.Get(provider); - var factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); - - var configuration = new SqlDriverConfiguration {EnsureConnectionIsAlive = true}; - var driver = factory.GetDriver(new ConnectionInfo(Url), configuration); - - var connection = driver.CreateConnection(); - connection.Open(); - - var anotherConnection = driver.CreateConnection(); - anotherConnection.OpenAndInitialize("Use [DO-Tests-1]"); - } - } -} +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.10.30 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Building.Builders; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class ConnectionTest + { + private string provider = TestConnectionInfoProvider.GetProvider(); + protected string Url = TestConnectionInfoProvider.GetConnectionUrl(); + protected string ConnectionString = TestConnectionInfoProvider.GetConnectionString(); + + [OneTimeSetUp] + public void SetUp() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + + [Test] + [Explicit("Manual sql profiling needed")] + public void ConntectionTest() + { + var descriptor = ProviderDescriptor.Get(provider); + var factory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); + + var configuration = new SqlDriverConfiguration {EnsureConnectionIsAlive = true}; + var driver = factory.GetDriver(new ConnectionInfo(Url), configuration); + + var connection = driver.CreateConnection(); + connection.Open(); + + var anotherConnection = driver.CreateConnection(); + anotherConnection.OpenAndInitialize("Use [DO-Tests-1]"); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeIntervalTest.cs index 02b03cb9fa..57691bf786 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeIntervalTest.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.02 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - public override void DateTimeSubtractIntervalTest() - { - Assert.Ignore("MSSQL DateTime precision issue"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.02 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + public override void DateTimeSubtractIntervalTest() + { + Assert.Ignore("MSSQL DateTime precision issue"); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeOffsetTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeOffsetTest.cs index 6deb6f1baf..283e08288d 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeOffsetTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/DateTimeOffsetTest.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.12.03 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture, Explicit] - public class DateTimeOffsetTest : Sql.DateTimeOffsetTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2008); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.12.03 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture, Explicit] + public class DateTimeOffsetTest : Sql.DateTimeOffsetTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2008); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ErrorMessageParserTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ErrorMessageParserTest.cs index 0234f55443..7ed3a0297e 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ErrorMessageParserTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ErrorMessageParserTest.cs @@ -1,121 +1,121 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.28 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Sql.Drivers.SqlServer; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class ErrorMessageParserTest - { - [OneTimeSetUp] - protected virtual void SetUp() - { - CheckRequirements(); - } - - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - [Test] - public void ExtractQuotedTest() - { - Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("hello")); - Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("\"hello\"")); - Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("!!\"hello\"")); - Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("\"hello\"!!")); - Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("!!\"hello\"!!")); - Assert.AreEqual(string.Empty, ErrorMessageParser.ExtractQuotedText("\"\"!!")); - } - - [Test] - public void RealMessagesTest() - { - var parser = CreateParser(true, - "Cannot insert the value NULL into column '%.*ls', table '%.*ls'; column does not allow nulls. %ls fails.", - "The %ls statement conflicted with the %ls constraint \"%.*ls\". The conflict occurred in database \"%.*ls\", table \"%.*ls\"%ls%.*ls%ls.", - "Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'. The duplicate key value is %ls.", - "Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls."); - - const string canNotInsertNull = "Cannot insert the value NULL into column 'col', table 'DO40-Tests.dbo.Table_1'; column does not allow nulls. INSERT fails."; - var result = parser.Parse(1, canNotInsertNull); - Assert.AreEqual(3, result.Count); - Assert.AreEqual("col", result[1]); - Assert.AreEqual("Table_1", ErrorMessageParser.CutDatabaseAndSchemaPrefix(result[2])); - Assert.AreEqual("INSERT", result[3]); - - const string violationOfForeignKey = "The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_Table_2_Table_1\". The conflict occurred in database \"DO40-Tests\", table \"dbo.Table_1\", column 'col'."; - result = parser.Parse(2, violationOfForeignKey); - Assert.AreEqual(6, result.Count); - Assert.AreEqual("INSERT", result[1]); - Assert.AreEqual("FOREIGN KEY", result[2]); - Assert.AreEqual("FK_Table_2_Table_1", result[3]); - Assert.AreEqual("DO40-Tests", result[4]); - Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[5])); - Assert.AreEqual("col", ErrorMessageParser.ExtractQuotedText(result[6])); - - const string canNotInsertDuplicateKey = "Cannot insert duplicate key row in object 'dbo.Table_1' with unique index 'Test'. The duplicate key value is (1)."; - result = parser.Parse(3, canNotInsertDuplicateKey); - Assert.AreEqual(3, result.Count); - Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[1])); - Assert.AreEqual("Test", result[2]); - Assert.AreEqual("(1)", result[3]); - - const string violationOfPrimaryKey = "Violation of PRIMARY KEY constraint 'PK_Table_1'. Cannot insert duplicate key in object 'dbo.Table_1'. The duplicate key value is (1)."; - result = parser.Parse(4, violationOfPrimaryKey); - Assert.AreEqual(4, result.Count); - Assert.AreEqual("PRIMARY KEY", result[1]); - Assert.AreEqual("PK_Table_1", result[2]); - Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[3])); - Assert.AreEqual("(1)", result[4]); - } - - [Test] - public void SynteticEnglishTest() - { - var parser = CreateParser(true, "%ls", "AAA%lsBBB", "%.*lsHELLO", "BYE%ls", "A%.*lsB%.*lsC%.*ls", "%ls%ls%ls%ls"); - RunAllTests(parser); - } - - [Test] - public void SynteticNonEnglishTest() - { - var parser = CreateParser(false, "%1!", "AAA%1!BBB", "%1!HELLO", "BYE%1!", "A%1!B%2!C%3!", "%1!%2!%3!"); - RunAllTests(parser); - } - - private void RunAllTests(ErrorMessageParser parser) - { - RunTest(parser, 1, "whatever", "whatever"); - RunTest(parser, 2, "AAA??BBB", "??"); - RunTest(parser, 3, "'aaa'HELLO", "'aaa'"); - RunTest(parser, 4, "BYE123", "123"); - RunTest(parser, 5, "A1B2C3", "1", "2", "3"); - RunTest(parser, 6, "~", "~"); - } - - private void RunTest(ErrorMessageParser parser, int code, string input, params string[] expected) - { - var actual = parser.Parse(code, input); - Assert.AreEqual(expected.Length, actual.Count); - for (int i = 0; i < expected.Length; i++) { - Assert.AreEqual(expected[i], actual[i + 1]); - } - } - - private ErrorMessageParser CreateParser(bool isEnglish, params string[] templates) - { - return new ErrorMessageParser(templates.Select((template, index) => new KeyValuePair(index + 1, template)), isEnglish); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.28 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Sql.Drivers.SqlServer; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class ErrorMessageParserTest + { + [OneTimeSetUp] + protected virtual void SetUp() + { + CheckRequirements(); + } + + protected virtual void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + [Test] + public void ExtractQuotedTest() + { + Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("hello")); + Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("\"hello\"")); + Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("!!\"hello\"")); + Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("\"hello\"!!")); + Assert.AreEqual("hello", ErrorMessageParser.ExtractQuotedText("!!\"hello\"!!")); + Assert.AreEqual(string.Empty, ErrorMessageParser.ExtractQuotedText("\"\"!!")); + } + + [Test] + public void RealMessagesTest() + { + var parser = CreateParser(true, + "Cannot insert the value NULL into column '%.*ls', table '%.*ls'; column does not allow nulls. %ls fails.", + "The %ls statement conflicted with the %ls constraint \"%.*ls\". The conflict occurred in database \"%.*ls\", table \"%.*ls\"%ls%.*ls%ls.", + "Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'. The duplicate key value is %ls.", + "Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls."); + + const string canNotInsertNull = "Cannot insert the value NULL into column 'col', table 'DO40-Tests.dbo.Table_1'; column does not allow nulls. INSERT fails."; + var result = parser.Parse(1, canNotInsertNull); + Assert.AreEqual(3, result.Count); + Assert.AreEqual("col", result[1]); + Assert.AreEqual("Table_1", ErrorMessageParser.CutDatabaseAndSchemaPrefix(result[2])); + Assert.AreEqual("INSERT", result[3]); + + const string violationOfForeignKey = "The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_Table_2_Table_1\". The conflict occurred in database \"DO40-Tests\", table \"dbo.Table_1\", column 'col'."; + result = parser.Parse(2, violationOfForeignKey); + Assert.AreEqual(6, result.Count); + Assert.AreEqual("INSERT", result[1]); + Assert.AreEqual("FOREIGN KEY", result[2]); + Assert.AreEqual("FK_Table_2_Table_1", result[3]); + Assert.AreEqual("DO40-Tests", result[4]); + Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[5])); + Assert.AreEqual("col", ErrorMessageParser.ExtractQuotedText(result[6])); + + const string canNotInsertDuplicateKey = "Cannot insert duplicate key row in object 'dbo.Table_1' with unique index 'Test'. The duplicate key value is (1)."; + result = parser.Parse(3, canNotInsertDuplicateKey); + Assert.AreEqual(3, result.Count); + Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[1])); + Assert.AreEqual("Test", result[2]); + Assert.AreEqual("(1)", result[3]); + + const string violationOfPrimaryKey = "Violation of PRIMARY KEY constraint 'PK_Table_1'. Cannot insert duplicate key in object 'dbo.Table_1'. The duplicate key value is (1)."; + result = parser.Parse(4, violationOfPrimaryKey); + Assert.AreEqual(4, result.Count); + Assert.AreEqual("PRIMARY KEY", result[1]); + Assert.AreEqual("PK_Table_1", result[2]); + Assert.AreEqual("Table_1", ErrorMessageParser.CutSchemaPrefix(result[3])); + Assert.AreEqual("(1)", result[4]); + } + + [Test] + public void SynteticEnglishTest() + { + var parser = CreateParser(true, "%ls", "AAA%lsBBB", "%.*lsHELLO", "BYE%ls", "A%.*lsB%.*lsC%.*ls", "%ls%ls%ls%ls"); + RunAllTests(parser); + } + + [Test] + public void SynteticNonEnglishTest() + { + var parser = CreateParser(false, "%1!", "AAA%1!BBB", "%1!HELLO", "BYE%1!", "A%1!B%2!C%3!", "%1!%2!%3!"); + RunAllTests(parser); + } + + private void RunAllTests(ErrorMessageParser parser) + { + RunTest(parser, 1, "whatever", "whatever"); + RunTest(parser, 2, "AAA??BBB", "??"); + RunTest(parser, 3, "'aaa'HELLO", "'aaa'"); + RunTest(parser, 4, "BYE123", "123"); + RunTest(parser, 5, "A1B2C3", "1", "2", "3"); + RunTest(parser, 6, "~", "~"); + } + + private void RunTest(ErrorMessageParser parser, int code, string input, params string[] expected) + { + var actual = parser.Parse(code, input); + Assert.AreEqual(expected.Length, actual.Count); + for (int i = 0; i < expected.Length; i++) { + Assert.AreEqual(expected[i], actual[i + 1]); + } + } + + private ErrorMessageParser CreateParser(bool isEnglish, params string[] templates) + { + return new ErrorMessageParser(templates.Select((template, index) => new KeyValuePair(index + 1, template)), isEnglish); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExceptionTypesTest.cs index 0ee841b79e..7e5dabab16 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExceptionTypesTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.08 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class ExceptionTypesTest : Sql.ExceptionTypesTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.08 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class ExceptionTypesTest : Sql.ExceptionTypesTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExtractorTest.cs index dbbde6b60e..25f5eeff01 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/ExtractorTest.cs @@ -1,521 +1,521 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.16 - -// TODO: Refactor stupid MSSqlExtractorTests.cs and put all stuff here - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using System.Linq; -using Xtensive.Core; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class ExtractorTest : SqlTest - { - private List dropOperations = new List(); - - protected override void TestFixtureTearDown() - { - foreach (var dropOperation in dropOperations) { - try { - ExecuteNonQuery(dropOperation); - } - catch (Exception exception) { - Console.Write("Operation '{0}' wasn't performed correctly", dropOperation); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - [Test] - public void Extract() - { - var catalog = ExtractCatalog(); - } - - [Test] - public void ExtractIndexTypesTest1() - { - #region Preparation - - var createScript = @" - CREATE TABLE [Table1] ( - Id int NOT NULL, - IntField1 int NOT NULL, - XmlField [xml], - CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED (Id)); - - CREATE PRIMARY XML INDEX [IX_XML_Table1_XmlField] ON [Table1] (XmlField); - CREATE NONCLUSTERED INDEX [IX_Table1_IntField1] ON [Table1] (IntField1);"; - - var dropScript = "IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]"; - - RegisterDropForLater(dropScript); - ExecuteNonQuery(dropScript); - ExecuteNonQuery(createScript); - - #endregion - - Schema schema = null; - Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); - - var table = schema.Tables["Table1"]; - var tableIndexes = table.Indexes; - Assert.IsTrue(table.Indexes.Count==1); - - var nonClusteredIndex = tableIndexes["IX_Table1_IntField1"]; - Assert.IsNotNull(nonClusteredIndex); - Assert.IsFalse(nonClusteredIndex.IsClustered); - Assert.IsFalse(nonClusteredIndex.IsSpatial); - Assert.IsFalse(nonClusteredIndex.IsFullText); - Assert.IsFalse(nonClusteredIndex.IsBitmap); - Assert.IsFalse(nonClusteredIndex.IsFullText); - - var tableConstratins = table.TableConstraints; - Assert.IsTrue(table.TableConstraints.Count==1); - - var clusteredPk = tableConstratins["PK_Table1"] as PrimaryKey; - Assert.IsNotNull(clusteredPk); - Assert.IsTrue(clusteredPk.IsClustered); - } - - [Test] - public void ExtractIndexTypesTest2() - { - Require.ProviderVersionAtLeast(new Version(10, 0)); - - #region Preparation - - var createScript = @" - CREATE TABLE [Table1] ( - Id int NOT NULL, - IntField1 int NOT NULL, - XmlField xml, - GeometryField [geometry], - CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED (Id)); - - CREATE PRIMARY XML INDEX [IX_XML_Table1_XmlField] ON [Table1] (XmlField); - CREATE NONCLUSTERED INDEX [IX_Table1_IntField1] ON [Table1] (IntField1); - CREATE SPATIAL INDEX [IXS_Table1_GeometryField] ON [Table1] (GeometryField) WITH (BOUNDING_BOX = ( 0, 0, 500, 200 ));"; - - var dropScript = @"IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]"; - - RegisterDropForLater(dropScript); - ExecuteNonQuery(dropScript); - ExecuteNonQuery(createScript); - - #endregion - - Schema schema = null; - Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); - - Assert.That(schema, Is.Not.Null); - - var table = schema.Tables["Table1"]; - var tableIndexes = table.Indexes; - Assert.IsTrue(table.Indexes.Count==2); - - var nonClusteredIndex = tableIndexes["IX_Table1_IntField1"]; - Assert.IsNotNull(nonClusteredIndex); - Assert.IsFalse(nonClusteredIndex.IsClustered); - Assert.IsFalse(nonClusteredIndex.IsSpatial); - Assert.IsFalse(nonClusteredIndex.IsFullText); - Assert.IsFalse(nonClusteredIndex.IsBitmap); - Assert.IsFalse(nonClusteredIndex.IsFullText); - - var spatialIndex = tableIndexes["IXS_Table1_GeometryField"]; - Assert.IsNotNull(spatialIndex); - Assert.IsTrue(spatialIndex.IsSpatial); - Assert.IsFalse(spatialIndex.IsClustered); - Assert.IsFalse(spatialIndex.IsFullText); - Assert.IsFalse(spatialIndex.IsBitmap); - Assert.IsFalse(spatialIndex.IsFullText); - - var tableConstratins = table.TableConstraints; - Assert.IsTrue(table.TableConstraints.Count==1); - - var clusteredPk = tableConstratins["PK_Table1"] as PrimaryKey; - Assert.IsNotNull(clusteredPk); - Assert.IsTrue(clusteredPk.IsClustered); - } - - [Test] - public void ExtractIndexTypesTest3() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - - #region Preparation - - var createScript = @" - CREATE TABLE Table1 ( - [Id] uniqueidentifier NOT NULL, - [A] integer NOT NULL, - [B] integer NOT NULL, - [C] integer NOT NULL, - CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); - - CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); - CREATE NONCLUSTERED COLUMNSTORE INDEX [IXCS_Table1_C] ON [Table1] (C); - - CREATE TABLE Table2 ( - [id] integer NOT NULL, - [IntField1] integer NOT NULL, - [IntField2] integer NOT NULL, - [IntField3] integer NOT NULL, - [IntField4] integer NOT NULL, - [IntField5] integer NOT NULL); - - CREATE NONCLUSTERED COLUMNSTORE INDEX [IXCS_Table2_IntField5] ON [Table2] (IntField5); - CREATE NONCLUSTERED INDEX [IX_Table2_IntField2] ON [Table2] (IntField2); - ALTER TABLE [Table2] ADD CONSTRAINT [PK_Table2] PRIMARY KEY NONCLUSTERED ([Id]); - - CREATE CLUSTERED INDEX [IX_Table1_B] ON [Table1] (B);"; - - var dropScript = @" - IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; - IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; - - RegisterDropForLater(dropScript); - ExecuteNonQuery(dropScript); - ExecuteNonQuery(createScript); - - #endregion - - Schema schema = null; - Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); - - var table1 = schema.Tables["Table1"]; - var table1Indexes = table1.Indexes; - Assert.IsTrue(table1Indexes.Count==2); - - var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; - Assert.IsNotNull(table1NonClusteredIndex); - Assert.IsFalse(table1NonClusteredIndex.IsClustered); - Assert.IsFalse(table1NonClusteredIndex.IsSpatial); - Assert.IsFalse(table1NonClusteredIndex.IsBitmap); - Assert.IsFalse(table1NonClusteredIndex.IsFullText); - - var table1ClusteredIndex = table1Indexes["IX_Table1_B"]; - Assert.IsNotNull(table1ClusteredIndex); - Assert.IsTrue(table1ClusteredIndex.IsClustered); - Assert.IsFalse(table1ClusteredIndex.IsSpatial); - Assert.IsFalse(table1ClusteredIndex.IsBitmap); - Assert.IsFalse(table1ClusteredIndex.IsFullText); - - var table1Constratins = table1.TableConstraints; - Assert.IsTrue(table1Constratins.Count==1); - var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; - Assert.IsNotNull(table1NonClusteredPk); - Assert.IsFalse(table1NonClusteredPk.IsClustered); - - - var table2 = schema.Tables["Table2"]; - var indexes = table2.Indexes; - Assert.IsTrue(indexes.Count==1); - - var nonClusteredIndex = indexes["IX_Table2_IntField2"]; - Assert.IsNotNull(nonClusteredIndex); - Assert.IsFalse(nonClusteredIndex.IsClustered); - Assert.IsFalse(nonClusteredIndex.IsSpatial); - Assert.IsFalse(nonClusteredIndex.IsBitmap); - Assert.IsFalse(nonClusteredIndex.IsFullText); - - var table2Constraints = table2.TableConstraints; - Assert.IsTrue(table2Constraints.Count==1); - - var nonClusteredPk = table2Constraints["PK_Table2"] as PrimaryKey; - Assert.IsNotNull(nonClusteredPk); - Assert.IsFalse(nonClusteredPk.IsClustered); - } - - [Test] - public void ExtractIndexTypesTest4() - { - Require.ProviderVersionAtLeast(new Version(12, 0)); - - #region Preparation - - var createScript = @" - CREATE TABLE [Table1] ( - [Id] uniqueidentifier NOT NULL, - [A] integer NOT NULL, - CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); - - CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); - - CREATE TABLE [Table2] ( - [Id] integer NOT NULL, - [IntField1] integer NOT NULL, - [IntField2] integer NOT NULL, - [IntField3] integer NOT NULL, - [IntField4] integer NOT NULL); - - CREATE CLUSTERED COLUMNSTORE INDEX [IXSC_Table2_IntField1] ON [Table2];"; - - var dropScript = @" - IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; - IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; - - RegisterDropForLater(dropScript); - ExecuteNonQuery(dropScript); - ExecuteNonQuery(createScript); - - #endregion - - Schema schema = null; - Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); - - var table1 = schema.Tables["Table1"]; - var table1Indexes = table1.Indexes; - Assert.IsTrue(table1Indexes.Count==1); - - var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; - Assert.IsNotNull(table1NonClusteredIndex); - Assert.IsFalse(table1NonClusteredIndex.IsClustered); - Assert.IsFalse(table1NonClusteredIndex.IsSpatial); - Assert.IsFalse(table1NonClusteredIndex.IsBitmap); - Assert.IsFalse(table1NonClusteredIndex.IsFullText); - - var table1Constratins = table1.TableConstraints; - Assert.IsTrue(table1Constratins.Count==1); - - var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; - Assert.IsNotNull(table1NonClusteredPk); - Assert.IsFalse(table1NonClusteredPk.IsClustered); - - var table2 = schema.Tables["Table2"]; - var indexes = table2.Indexes; - Assert.IsTrue(indexes.Count==0); - - var tableConstratins = table2.TableConstraints; - Assert.IsTrue(tableConstratins.Count==0); - } - - [Test] - public void ExtractIndexTypesTest5() - { - Require.ProviderVersionAtLeast(new Version(13, 0)); - - #region Preparation - - var createScript = @" - CREATE TABLE [Table1] ( - [Id] uniqueidentifier NOT NULL, - [A] integer NOT NULL, - CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); - - CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); - - CREATE TABLE [Table2] ( - [Id] integer NOT NULL, - [IntField1] integer NOT NULL, - [IntField2] integer NOT NULL, - [IntField3] integer NOT NULL, - [IntField4] integer NOT NULL, - CONSTRAINT [PK_Table2] PRIMARY KEY NONCLUSTERED (Id)); - - CREATE NONCLUSTERED INDEX [IX_Table2_IntField1] ON [Table2] (IntField2); - CREATE CLUSTERED COLUMNSTORE INDEX [IXSC_Table2_IntField1] ON [Table2];"; - - var dropScript = @" - IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; - IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; - - RegisterDropForLater(dropScript); - ExecuteNonQuery(dropScript); - ExecuteNonQuery(createScript); - - #endregion - - Schema schema = null; - Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); - - var table1 = schema.Tables["Table1"]; - var table1Indexes = table1.Indexes; - Assert.IsTrue(table1Indexes.Count==1); - - var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; - Assert.IsNotNull(table1NonClusteredIndex); - Assert.IsFalse(table1NonClusteredIndex.IsClustered); - Assert.IsFalse(table1NonClusteredIndex.IsSpatial); - Assert.IsFalse(table1NonClusteredIndex.IsBitmap); - Assert.IsFalse(table1NonClusteredIndex.IsFullText); - - var table1Constratins = table1.TableConstraints; - Assert.IsTrue(table1Constratins.Count==1); - - var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; - Assert.IsNotNull(table1NonClusteredPk); - Assert.IsFalse(table1NonClusteredPk.IsClustered); - - var table2 = schema.Tables["Table2"]; - var indexes = table2.Indexes; - Assert.IsTrue(indexes.Count==1); - - var nonClusteredIndex = indexes["IX_Table2_IntField1"]; - Assert.IsNotNull(nonClusteredIndex); - Assert.IsFalse(nonClusteredIndex.IsClustered); - Assert.IsFalse(nonClusteredIndex.IsSpatial); - Assert.IsFalse(nonClusteredIndex.IsBitmap); - Assert.IsFalse(nonClusteredIndex.IsFullText); - - var tableConstratins = table2.TableConstraints; - Assert.IsTrue(tableConstratins.Count==1); - - var nonClusteredPk = tableConstratins["PK_Table2"] as PrimaryKey; - Assert.IsNotNull(nonClusteredPk); - Assert.IsFalse(nonClusteredPk.IsClustered); - } - - [Test] - public void ExtractDomainsTest() - { - string createTable = - "create table table_with_domained_columns (id int primary key, value test_type)"; - string dropTable = - "if object_id('table_with_domained_columns') is not null drop table table_with_domained_columns"; - - ExecuteNonQuery(dropTable); - DropDomain(); - CreateDomain(); - ExecuteNonQuery(createTable); - - var schema = ExtractCatalog().DefaultSchema; - var definedDomain = schema.Domains.Single(domain => domain.Name=="test_type"); - Assert.AreEqual(Driver.ServerInfo.DataTypes["bigint"].Type, definedDomain.DataType.Type); - - var columnDomain = schema.Tables["table_with_domained_columns"].TableColumns["value"].Domain; - Assert.IsNotNull(columnDomain); - Assert.AreEqual("test_type", columnDomain.Name); - } - - [Test] - public void ExtractDefaultConstraintTest() - { - string createTable = - "create table table_with_default_constraint (id int default 0)"; - string dropTable = - "if object_id('table_with_default_constraint') is not null drop table table_with_default_constraint"; - - ExecuteNonQuery(dropTable); - ExecuteNonQuery(createTable); - - var schema = ExtractCatalog().DefaultSchema; - var table = schema.Tables["table_with_default_constraint"]; - Assert.AreEqual(1, table.TableConstraints.Count); - Assert.AreEqual("id", ((DefaultConstraint) table.TableConstraints[0]).Column.Name); - } - - [Test] - public void ExtractComputedColumnTest() - { - string createTable = @" - CREATE TABLE Tmp ( [Value] [int] NOT NULL, [Sum] AS ([Value]+(1)) PERSISTED ) ON [PRIMARY] - CREATE NONCLUSTERED INDEX [IX_Sum] ON Tmp ( [Sum] ASC ) ON [PRIMARY]"; - string createView = @" - CREATE VIEW Tmp_View WITH SCHEMABINDING AS SELECT Value, Sum FROM dbo.Tmp"; - string createIndex = @" - CREATE UNIQUE CLUSTERED INDEX [x] ON Tmp_View ( [Value] ASC )"; - string drop = @" - if object_id('Tmp_View') is not null drop view Tmp_View - if object_id('Tmp') is not null drop table Tmp"; - - ExecuteNonQuery(drop); - ExecuteNonQuery(createTable); - ExecuteNonQuery(createView); - - ExtractDefaultSchema(); - ExecuteNonQuery(drop); - } - - [Test] - public void ExtractUDTTest() - { - Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2008); - string create = "CREATE TYPE GuidList AS TABLE ( Id UNIQUEIDENTIFIER NULL )"; - string drop = "if type_id('GuidList') is not null drop type GuidList"; - - ExecuteNonQuery(drop); - ExecuteNonQuery(create); - ExtractDefaultSchema(); - } - - [Test] - public void ExtractFulltextChangeTrackingTest() - { - Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2005); - var createTable = @"CREATE TABLE [FullTextTestTable] - ( - [Id] int not null, - [Auto] nvarchar(MAX), - [Manual] nvarchar(MAX), - [Off] nvarchar(MAX), - [OffNoPopulation] nvarchar(MAX), - CONSTRAINT PK_FullTextTestTable PRIMARY KEY (Id) - );"; - var dropTable = @"IF OBJECT_ID('dbo.FullTextTestTable', 'U') IS NOT NULL - DROP TABLE dbo.FullTextTestTable;"; - - var createAutoTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Auto] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING AUTO;"; - var createManualTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Manual] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING MANUAL;"; - var createOffTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Off] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING OFF;"; - var createOffNoPopulationIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([OffNoPopulation] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING OFF, NO POPULATION;"; - - var cases = new Pair[4]; - cases[0] = new Pair(createAutoTrackingIndex, ChangeTrackingMode.Auto); - cases[1] = new Pair(createManualTrackingIndex , ChangeTrackingMode.Manual); - cases[2] = new Pair(createOffTrackingIndex, ChangeTrackingMode.Off); - cases[3] = new Pair(createOffNoPopulationIndex, ChangeTrackingMode.OffWithNoPopulation); - - foreach (var @case in cases) { - ExecuteNonQuery(dropTable); - ExecuteNonQuery(createTable); - ExecuteNonQuery(@case.First); - var schema = ExtractDefaultSchema(); - var table = schema.Tables["FullTextTestTable"]; - var ftIndex = table.Indexes.OfType().FirstOrDefault(); - Assert.That(ftIndex, Is.Not.Null); - Assert.That(ftIndex.ChangeTrackingMode, Is.EqualTo(@case.Second)); - } - ExecuteNonQuery(dropTable); - } - -#region Helpers - - private void CreateDomain() - { - var schema = ExtractCatalog().DefaultSchema; - var domain = schema.CreateDomain("test_type", new SqlValueType(SqlType.Int64)); - var commandText = Driver.Compile(SqlDdl.Create(domain)).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void DropDomain() - { - var schema = ExtractCatalog().DefaultSchema; - var domain = schema.Domains["test_type"]; - if (domain==null) - return; - var commandText = Driver.Compile(SqlDdl.Drop(domain)).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void RegisterDropForLater(string dropScript) - { - dropOperations.Add(dropScript); - } - -#endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.16 + +// TODO: Refactor stupid MSSqlExtractorTests.cs and put all stuff here + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using System.Linq; +using Xtensive.Core; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class ExtractorTest : SqlTest + { + private List dropOperations = new List(); + + protected override void TestFixtureTearDown() + { + foreach (var dropOperation in dropOperations) { + try { + ExecuteNonQuery(dropOperation); + } + catch (Exception exception) { + Console.Write("Operation '{0}' wasn't performed correctly", dropOperation); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + [Test] + public void Extract() + { + var catalog = ExtractCatalog(); + } + + [Test] + public void ExtractIndexTypesTest1() + { + #region Preparation + + var createScript = @" + CREATE TABLE [Table1] ( + Id int NOT NULL, + IntField1 int NOT NULL, + XmlField [xml], + CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED (Id)); + + CREATE PRIMARY XML INDEX [IX_XML_Table1_XmlField] ON [Table1] (XmlField); + CREATE NONCLUSTERED INDEX [IX_Table1_IntField1] ON [Table1] (IntField1);"; + + var dropScript = "IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]"; + + RegisterDropForLater(dropScript); + ExecuteNonQuery(dropScript); + ExecuteNonQuery(createScript); + + #endregion + + Schema schema = null; + Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); + + var table = schema.Tables["Table1"]; + var tableIndexes = table.Indexes; + Assert.IsTrue(table.Indexes.Count==1); + + var nonClusteredIndex = tableIndexes["IX_Table1_IntField1"]; + Assert.IsNotNull(nonClusteredIndex); + Assert.IsFalse(nonClusteredIndex.IsClustered); + Assert.IsFalse(nonClusteredIndex.IsSpatial); + Assert.IsFalse(nonClusteredIndex.IsFullText); + Assert.IsFalse(nonClusteredIndex.IsBitmap); + Assert.IsFalse(nonClusteredIndex.IsFullText); + + var tableConstratins = table.TableConstraints; + Assert.IsTrue(table.TableConstraints.Count==1); + + var clusteredPk = tableConstratins["PK_Table1"] as PrimaryKey; + Assert.IsNotNull(clusteredPk); + Assert.IsTrue(clusteredPk.IsClustered); + } + + [Test] + public void ExtractIndexTypesTest2() + { + Require.ProviderVersionAtLeast(new Version(10, 0)); + + #region Preparation + + var createScript = @" + CREATE TABLE [Table1] ( + Id int NOT NULL, + IntField1 int NOT NULL, + XmlField xml, + GeometryField [geometry], + CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED (Id)); + + CREATE PRIMARY XML INDEX [IX_XML_Table1_XmlField] ON [Table1] (XmlField); + CREATE NONCLUSTERED INDEX [IX_Table1_IntField1] ON [Table1] (IntField1); + CREATE SPATIAL INDEX [IXS_Table1_GeometryField] ON [Table1] (GeometryField) WITH (BOUNDING_BOX = ( 0, 0, 500, 200 ));"; + + var dropScript = @"IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]"; + + RegisterDropForLater(dropScript); + ExecuteNonQuery(dropScript); + ExecuteNonQuery(createScript); + + #endregion + + Schema schema = null; + Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); + + Assert.That(schema, Is.Not.Null); + + var table = schema.Tables["Table1"]; + var tableIndexes = table.Indexes; + Assert.IsTrue(table.Indexes.Count==2); + + var nonClusteredIndex = tableIndexes["IX_Table1_IntField1"]; + Assert.IsNotNull(nonClusteredIndex); + Assert.IsFalse(nonClusteredIndex.IsClustered); + Assert.IsFalse(nonClusteredIndex.IsSpatial); + Assert.IsFalse(nonClusteredIndex.IsFullText); + Assert.IsFalse(nonClusteredIndex.IsBitmap); + Assert.IsFalse(nonClusteredIndex.IsFullText); + + var spatialIndex = tableIndexes["IXS_Table1_GeometryField"]; + Assert.IsNotNull(spatialIndex); + Assert.IsTrue(spatialIndex.IsSpatial); + Assert.IsFalse(spatialIndex.IsClustered); + Assert.IsFalse(spatialIndex.IsFullText); + Assert.IsFalse(spatialIndex.IsBitmap); + Assert.IsFalse(spatialIndex.IsFullText); + + var tableConstratins = table.TableConstraints; + Assert.IsTrue(table.TableConstraints.Count==1); + + var clusteredPk = tableConstratins["PK_Table1"] as PrimaryKey; + Assert.IsNotNull(clusteredPk); + Assert.IsTrue(clusteredPk.IsClustered); + } + + [Test] + public void ExtractIndexTypesTest3() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + + #region Preparation + + var createScript = @" + CREATE TABLE Table1 ( + [Id] uniqueidentifier NOT NULL, + [A] integer NOT NULL, + [B] integer NOT NULL, + [C] integer NOT NULL, + CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); + + CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); + CREATE NONCLUSTERED COLUMNSTORE INDEX [IXCS_Table1_C] ON [Table1] (C); + + CREATE TABLE Table2 ( + [id] integer NOT NULL, + [IntField1] integer NOT NULL, + [IntField2] integer NOT NULL, + [IntField3] integer NOT NULL, + [IntField4] integer NOT NULL, + [IntField5] integer NOT NULL); + + CREATE NONCLUSTERED COLUMNSTORE INDEX [IXCS_Table2_IntField5] ON [Table2] (IntField5); + CREATE NONCLUSTERED INDEX [IX_Table2_IntField2] ON [Table2] (IntField2); + ALTER TABLE [Table2] ADD CONSTRAINT [PK_Table2] PRIMARY KEY NONCLUSTERED ([Id]); + + CREATE CLUSTERED INDEX [IX_Table1_B] ON [Table1] (B);"; + + var dropScript = @" + IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; + IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; + + RegisterDropForLater(dropScript); + ExecuteNonQuery(dropScript); + ExecuteNonQuery(createScript); + + #endregion + + Schema schema = null; + Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); + + var table1 = schema.Tables["Table1"]; + var table1Indexes = table1.Indexes; + Assert.IsTrue(table1Indexes.Count==2); + + var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; + Assert.IsNotNull(table1NonClusteredIndex); + Assert.IsFalse(table1NonClusteredIndex.IsClustered); + Assert.IsFalse(table1NonClusteredIndex.IsSpatial); + Assert.IsFalse(table1NonClusteredIndex.IsBitmap); + Assert.IsFalse(table1NonClusteredIndex.IsFullText); + + var table1ClusteredIndex = table1Indexes["IX_Table1_B"]; + Assert.IsNotNull(table1ClusteredIndex); + Assert.IsTrue(table1ClusteredIndex.IsClustered); + Assert.IsFalse(table1ClusteredIndex.IsSpatial); + Assert.IsFalse(table1ClusteredIndex.IsBitmap); + Assert.IsFalse(table1ClusteredIndex.IsFullText); + + var table1Constratins = table1.TableConstraints; + Assert.IsTrue(table1Constratins.Count==1); + var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; + Assert.IsNotNull(table1NonClusteredPk); + Assert.IsFalse(table1NonClusteredPk.IsClustered); + + + var table2 = schema.Tables["Table2"]; + var indexes = table2.Indexes; + Assert.IsTrue(indexes.Count==1); + + var nonClusteredIndex = indexes["IX_Table2_IntField2"]; + Assert.IsNotNull(nonClusteredIndex); + Assert.IsFalse(nonClusteredIndex.IsClustered); + Assert.IsFalse(nonClusteredIndex.IsSpatial); + Assert.IsFalse(nonClusteredIndex.IsBitmap); + Assert.IsFalse(nonClusteredIndex.IsFullText); + + var table2Constraints = table2.TableConstraints; + Assert.IsTrue(table2Constraints.Count==1); + + var nonClusteredPk = table2Constraints["PK_Table2"] as PrimaryKey; + Assert.IsNotNull(nonClusteredPk); + Assert.IsFalse(nonClusteredPk.IsClustered); + } + + [Test] + public void ExtractIndexTypesTest4() + { + Require.ProviderVersionAtLeast(new Version(12, 0)); + + #region Preparation + + var createScript = @" + CREATE TABLE [Table1] ( + [Id] uniqueidentifier NOT NULL, + [A] integer NOT NULL, + CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); + + CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); + + CREATE TABLE [Table2] ( + [Id] integer NOT NULL, + [IntField1] integer NOT NULL, + [IntField2] integer NOT NULL, + [IntField3] integer NOT NULL, + [IntField4] integer NOT NULL); + + CREATE CLUSTERED COLUMNSTORE INDEX [IXSC_Table2_IntField1] ON [Table2];"; + + var dropScript = @" + IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; + IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; + + RegisterDropForLater(dropScript); + ExecuteNonQuery(dropScript); + ExecuteNonQuery(createScript); + + #endregion + + Schema schema = null; + Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); + + var table1 = schema.Tables["Table1"]; + var table1Indexes = table1.Indexes; + Assert.IsTrue(table1Indexes.Count==1); + + var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; + Assert.IsNotNull(table1NonClusteredIndex); + Assert.IsFalse(table1NonClusteredIndex.IsClustered); + Assert.IsFalse(table1NonClusteredIndex.IsSpatial); + Assert.IsFalse(table1NonClusteredIndex.IsBitmap); + Assert.IsFalse(table1NonClusteredIndex.IsFullText); + + var table1Constratins = table1.TableConstraints; + Assert.IsTrue(table1Constratins.Count==1); + + var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; + Assert.IsNotNull(table1NonClusteredPk); + Assert.IsFalse(table1NonClusteredPk.IsClustered); + + var table2 = schema.Tables["Table2"]; + var indexes = table2.Indexes; + Assert.IsTrue(indexes.Count==0); + + var tableConstratins = table2.TableConstraints; + Assert.IsTrue(tableConstratins.Count==0); + } + + [Test] + public void ExtractIndexTypesTest5() + { + Require.ProviderVersionAtLeast(new Version(13, 0)); + + #region Preparation + + var createScript = @" + CREATE TABLE [Table1] ( + [Id] uniqueidentifier NOT NULL, + [A] integer NOT NULL, + CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED (Id)); + + CREATE NONCLUSTERED INDEX [IX_Table1_A] ON [Table1] (A); + + CREATE TABLE [Table2] ( + [Id] integer NOT NULL, + [IntField1] integer NOT NULL, + [IntField2] integer NOT NULL, + [IntField3] integer NOT NULL, + [IntField4] integer NOT NULL, + CONSTRAINT [PK_Table2] PRIMARY KEY NONCLUSTERED (Id)); + + CREATE NONCLUSTERED INDEX [IX_Table2_IntField1] ON [Table2] (IntField2); + CREATE CLUSTERED COLUMNSTORE INDEX [IXSC_Table2_IntField1] ON [Table2];"; + + var dropScript = @" + IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE [Table1]; + IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE [Table2];"; + + RegisterDropForLater(dropScript); + ExecuteNonQuery(dropScript); + ExecuteNonQuery(createScript); + + #endregion + + Schema schema = null; + Assert.DoesNotThrow(() => { schema = ExtractCatalog().DefaultSchema; }); + + var table1 = schema.Tables["Table1"]; + var table1Indexes = table1.Indexes; + Assert.IsTrue(table1Indexes.Count==1); + + var table1NonClusteredIndex = table1Indexes["IX_Table1_A"]; + Assert.IsNotNull(table1NonClusteredIndex); + Assert.IsFalse(table1NonClusteredIndex.IsClustered); + Assert.IsFalse(table1NonClusteredIndex.IsSpatial); + Assert.IsFalse(table1NonClusteredIndex.IsBitmap); + Assert.IsFalse(table1NonClusteredIndex.IsFullText); + + var table1Constratins = table1.TableConstraints; + Assert.IsTrue(table1Constratins.Count==1); + + var table1NonClusteredPk = table1Constratins["PK_Table1"] as PrimaryKey; + Assert.IsNotNull(table1NonClusteredPk); + Assert.IsFalse(table1NonClusteredPk.IsClustered); + + var table2 = schema.Tables["Table2"]; + var indexes = table2.Indexes; + Assert.IsTrue(indexes.Count==1); + + var nonClusteredIndex = indexes["IX_Table2_IntField1"]; + Assert.IsNotNull(nonClusteredIndex); + Assert.IsFalse(nonClusteredIndex.IsClustered); + Assert.IsFalse(nonClusteredIndex.IsSpatial); + Assert.IsFalse(nonClusteredIndex.IsBitmap); + Assert.IsFalse(nonClusteredIndex.IsFullText); + + var tableConstratins = table2.TableConstraints; + Assert.IsTrue(tableConstratins.Count==1); + + var nonClusteredPk = tableConstratins["PK_Table2"] as PrimaryKey; + Assert.IsNotNull(nonClusteredPk); + Assert.IsFalse(nonClusteredPk.IsClustered); + } + + [Test] + public void ExtractDomainsTest() + { + string createTable = + "create table table_with_domained_columns (id int primary key, value test_type)"; + string dropTable = + "if object_id('table_with_domained_columns') is not null drop table table_with_domained_columns"; + + ExecuteNonQuery(dropTable); + DropDomain(); + CreateDomain(); + ExecuteNonQuery(createTable); + + var schema = ExtractCatalog().DefaultSchema; + var definedDomain = schema.Domains.Single(domain => domain.Name=="test_type"); + Assert.AreEqual(Driver.ServerInfo.DataTypes["bigint"].Type, definedDomain.DataType.Type); + + var columnDomain = schema.Tables["table_with_domained_columns"].TableColumns["value"].Domain; + Assert.IsNotNull(columnDomain); + Assert.AreEqual("test_type", columnDomain.Name); + } + + [Test] + public void ExtractDefaultConstraintTest() + { + string createTable = + "create table table_with_default_constraint (id int default 0)"; + string dropTable = + "if object_id('table_with_default_constraint') is not null drop table table_with_default_constraint"; + + ExecuteNonQuery(dropTable); + ExecuteNonQuery(createTable); + + var schema = ExtractCatalog().DefaultSchema; + var table = schema.Tables["table_with_default_constraint"]; + Assert.AreEqual(1, table.TableConstraints.Count); + Assert.AreEqual("id", ((DefaultConstraint) table.TableConstraints[0]).Column.Name); + } + + [Test] + public void ExtractComputedColumnTest() + { + string createTable = @" + CREATE TABLE Tmp ( [Value] [int] NOT NULL, [Sum] AS ([Value]+(1)) PERSISTED ) ON [PRIMARY] + CREATE NONCLUSTERED INDEX [IX_Sum] ON Tmp ( [Sum] ASC ) ON [PRIMARY]"; + string createView = @" + CREATE VIEW Tmp_View WITH SCHEMABINDING AS SELECT Value, Sum FROM dbo.Tmp"; + string createIndex = @" + CREATE UNIQUE CLUSTERED INDEX [x] ON Tmp_View ( [Value] ASC )"; + string drop = @" + if object_id('Tmp_View') is not null drop view Tmp_View + if object_id('Tmp') is not null drop table Tmp"; + + ExecuteNonQuery(drop); + ExecuteNonQuery(createTable); + ExecuteNonQuery(createView); + + ExtractDefaultSchema(); + ExecuteNonQuery(drop); + } + + [Test] + public void ExtractUDTTest() + { + Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2008); + string create = "CREATE TYPE GuidList AS TABLE ( Id UNIQUEIDENTIFIER NULL )"; + string drop = "if type_id('GuidList') is not null drop type GuidList"; + + ExecuteNonQuery(drop); + ExecuteNonQuery(create); + ExtractDefaultSchema(); + } + + [Test] + public void ExtractFulltextChangeTrackingTest() + { + Require.ProviderVersionAtLeast(StorageProviderVersion.SqlServer2005); + var createTable = @"CREATE TABLE [FullTextTestTable] + ( + [Id] int not null, + [Auto] nvarchar(MAX), + [Manual] nvarchar(MAX), + [Off] nvarchar(MAX), + [OffNoPopulation] nvarchar(MAX), + CONSTRAINT PK_FullTextTestTable PRIMARY KEY (Id) + );"; + var dropTable = @"IF OBJECT_ID('dbo.FullTextTestTable', 'U') IS NOT NULL + DROP TABLE dbo.FullTextTestTable;"; + + var createAutoTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Auto] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING AUTO;"; + var createManualTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Manual] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING MANUAL;"; + var createOffTrackingIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([Off] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING OFF;"; + var createOffNoPopulationIndex = "CREATE FULLTEXT INDEX ON [dbo].[FullTextTestTable] ([OffNoPopulation] LANGUAGE 1033) KEY INDEX PK_FullTextTestTable WITH CHANGE_TRACKING OFF, NO POPULATION;"; + + var cases = new Pair[4]; + cases[0] = new Pair(createAutoTrackingIndex, ChangeTrackingMode.Auto); + cases[1] = new Pair(createManualTrackingIndex , ChangeTrackingMode.Manual); + cases[2] = new Pair(createOffTrackingIndex, ChangeTrackingMode.Off); + cases[3] = new Pair(createOffNoPopulationIndex, ChangeTrackingMode.OffWithNoPopulation); + + foreach (var @case in cases) { + ExecuteNonQuery(dropTable); + ExecuteNonQuery(createTable); + ExecuteNonQuery(@case.First); + var schema = ExtractDefaultSchema(); + var table = schema.Tables["FullTextTestTable"]; + var ftIndex = table.Indexes.OfType().FirstOrDefault(); + Assert.That(ftIndex, Is.Not.Null); + Assert.That(ftIndex.ChangeTrackingMode, Is.EqualTo(@case.Second)); + } + ExecuteNonQuery(dropTable); + } + +#region Helpers + + private void CreateDomain() + { + var schema = ExtractCatalog().DefaultSchema; + var domain = schema.CreateDomain("test_type", new SqlValueType(SqlType.Int64)); + var commandText = Driver.Compile(SqlDdl.Create(domain)).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void DropDomain() + { + var schema = ExtractCatalog().DefaultSchema; + var domain = schema.Domains["test_type"]; + if (domain==null) + return; + var commandText = Driver.Compile(SqlDdl.Drop(domain)).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void RegisterDropForLater(string dropScript) + { + dropOperations.Add(dropScript); + } + +#endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/IndexTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/IndexTest.cs index b90d0d1dea..f7e15a907b 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/IndexTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/IndexTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [Serializable] - public class IndexTest2005 : IndexTest - { - protected override void CreateTable() - { - Table t; - t = schema.CreateTable(TableName); - t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); - t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); - var c1 =t.CreateColumn("third", new SqlValueType(SqlType.VarChar)); - var c2 =t.CreateColumn("forth", new SqlValueType(SqlType.VarChar)); - - var tr = SqlDml.TableRef(t); - c1.Expression = SqlDml.Concat(tr["first"], " ", tr["second"]); - c1.IsPersisted = false; - c1.IsNullable = true; - - c2.Expression = SqlDml.Concat(tr["second"], " ", tr["first"]); - c2.IsPersisted = false; - c2.IsNullable = true; - - ExecuteNonQuery(SqlDdl.Create(t)); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - [Test] - public override void CreateExpressionIndexTest() - { - // Creating index - var t = schema.Tables[TableName]; - var i = t.CreateIndex(ExpressionIndexName); - i.CreateIndexColumn(t.TableColumns["third"]); - i.CreateIndexColumn(t.TableColumns["forth"]); - ExecuteNonQuery(SqlDdl.Create(i)); - - // Extracting index and checking its properties - var c2 = ExtractCatalog(); - var s2 = c2.DefaultSchema; - var t2 = s2.Tables[TableName]; - var i2 = t2.Indexes[ExpressionIndexName]; - Assert.IsNotNull(i2); - Assert.AreEqual(2, i2.Columns.Count); - - Assert.IsTrue(!t2.TableColumns["third"].Expression.IsNullReference()); - Assert.IsTrue(!t2.TableColumns["forth"].Expression.IsNullReference()); - } - - public override void CreateFilteredIndexTest() - { - if (GetType() == typeof(IndexTest2005)) - Assert.Ignore("Filtered indexes are not supported."); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [Serializable] + public class IndexTest2005 : IndexTest + { + protected override void CreateTable() + { + Table t; + t = schema.CreateTable(TableName); + t.CreateColumn("first", new SqlValueType(SqlType.VarChar, 50)); + t.CreateColumn("second", new SqlValueType(SqlType.VarChar, 50)); + var c1 =t.CreateColumn("third", new SqlValueType(SqlType.VarChar)); + var c2 =t.CreateColumn("forth", new SqlValueType(SqlType.VarChar)); + + var tr = SqlDml.TableRef(t); + c1.Expression = SqlDml.Concat(tr["first"], " ", tr["second"]); + c1.IsPersisted = false; + c1.IsNullable = true; + + c2.Expression = SqlDml.Concat(tr["second"], " ", tr["first"]); + c2.IsPersisted = false; + c2.IsNullable = true; + + ExecuteNonQuery(SqlDdl.Create(t)); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + [Test] + public override void CreateExpressionIndexTest() + { + // Creating index + var t = schema.Tables[TableName]; + var i = t.CreateIndex(ExpressionIndexName); + i.CreateIndexColumn(t.TableColumns["third"]); + i.CreateIndexColumn(t.TableColumns["forth"]); + ExecuteNonQuery(SqlDdl.Create(i)); + + // Extracting index and checking its properties + var c2 = ExtractCatalog(); + var s2 = c2.DefaultSchema; + var t2 = s2.Tables[TableName]; + var i2 = t2.Indexes[ExpressionIndexName]; + Assert.IsNotNull(i2); + Assert.AreEqual(2, i2.Columns.Count); + + Assert.IsTrue(!t2.TableColumns["third"].Expression.IsNullReference()); + Assert.IsTrue(!t2.TableColumns["forth"].Expression.IsNullReference()); + } + + public override void CreateFilteredIndexTest() + { + if (GetType() == typeof(IndexTest2005)) + Assert.Ignore("Filtered indexes are not supported."); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLExtractorTests.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLExtractorTests.cs index e36276ce13..5f6335c3a4 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLExtractorTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLExtractorTests.cs @@ -1,698 +1,698 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Data.Common; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - public class AssertUtility - { - public static void AssertArraysAreEqual(Array a1, Array a2) - { - if (a1==a2) - return; - if (a1==null || a2==null) - throw new AssertionException("One of arrays is null."); - if (a1.Length!=a2.Length) - throw new AssertionException("Lengths are different."); - for (int i = 0; i < a1.Length; i++) - Assert.AreEqual(a1.GetValue(i), a2.GetValue(i)); - } - - public static void AssertCollectionsAreEqual(IEnumerable col1, IEnumerable col2) - { - if (col1==col2) - return; - if (col2==null || col1==null) - throw new AssertionException("One of arrays is null."); - IEnumerator enumerator1 = col1.GetEnumerator(); - IEnumerator enumerator2 = col2.GetEnumerator(); - enumerator1.Reset(); - enumerator2.Reset(); - while (enumerator1.MoveNext()) { - if (!enumerator2.MoveNext()) - throw new AssertionException("Different count."); - Assert.AreEqual(enumerator1.Current, enumerator2.Current); - } - if (enumerator2.MoveNext()) - throw new AssertionException("Different count."); - } - } - - public abstract class MSSQLExtractorTestBase : SqlTest - { - private bool isTestsIgnored = true; - - public virtual string CleanUpScript - { - get { return null; } - } - - protected void ExecuteQuery(string sqlQuery) - { - if (string.IsNullOrEmpty(sqlQuery)) - return; - ExecuteNonQuery(sqlQuery); - } - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - isTestsIgnored = false; - } - - protected override void TestFixtureTearDown() - { - if (!isTestsIgnored) - ExecuteQuery(CleanUpScript); - base.TestFixtureTearDown(); - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - } - - public class MSSQLExtractor_TestSchemaExtraction : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get - { - return - "\n drop table role1.table1" + - "\n drop table role2.table2" + - "\n drop table role3.table3" + - "\n drop table role3.table31" + - "\n exec sp_droprole role1" + - "\n exec sp_droprole role2" + - "\n exec sp_droprole role3"; - ; - } - } - - [Test] - public virtual void Main() - { - ExecuteQuery( - " exec sp_addrole 'role1'" + - "\n exec sp_addrole 'role2'" + - "\n exec sp_addrole 'role3'" + - "\n create table role1.table1(test int, test2 int, test3 int)" + - "\n create table role2.table2(test int, test2 int, test3 int)" + - "\n create table role3.table3(test int, test2 int, test3 int)" + - "\n create table role3.table31(test int, test2 int, test3 int)"); - - var model = ExtractCatalog(); - - // Validating. - Assert.IsNotNull(model.Schemas["role1"]); - Assert.IsNotNull(model.Schemas["role1"].Tables["table1"]); - Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["role1"].Tables.Count==1); - - Assert.IsNotNull(model.Schemas["role2"]); - Assert.IsNotNull(model.Schemas["role2"].Tables["table2"]); - Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["role2"].Tables.Count==1); - - Assert.IsNotNull(model.Schemas["role3"]); - Assert.IsNotNull(model.Schemas["role3"].Tables["table3"]); - Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["role3"].Tables.Count==2); - } - } - - public class MSSQLExtractor_TestColumnTypeExtraction : MSSQLExtractorTestBase - { - private StringComparer comparer = StringComparer.InvariantCultureIgnoreCase; - - public override string CleanUpScript - { - get { return "drop table dataTypesTestTable"; } - } - - [Test] - public void Main() - { - string createTableQuery = - "CREATE TABLE dataTypesTestTable (" + - "[int_l4] [int] NULL ," + - "[binary_l50] [binary] (50) NULL ," + - "[bit_l1] [bit] NULL , " + - "[char_10] [char] (10) COLLATE Cyrillic_General_CI_AS NULL ," + - "[datetime_l8] [datetime] NULL ," + - "[decimal_p18_s0] [decimal](18, 0) NULL ," + - "[decimal_p12_s11_l9] [decimal](12, 11) NULL ," + - "[float_p53] [float] NULL ," + - "[image_16] [image] NULL ," + - "[money_p19_s4_l8] [money] NULL ," + - "[nchar_l100] [nchar] (100) COLLATE Cyrillic_General_CI_AS NULL ," + - "[ntext] [ntext] COLLATE Cyrillic_General_CI_AS NULL ," + - "[numeric_p5_s5] [numeric](5, 5) NULL ," + - "[nvarchar_l50] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL ," + - "[real_p24_s0_l4] [real] NULL ," + - "[smalldatetime_l4] [smalldatetime] NULL ," + - "[smallint_l2] [smallint] NULL ," + - "[small_money_p10_s4_l4] [smallmoney] NULL ," + - "[sql_variant_] [sql_variant] NULL ," + - "[text_16] [text] COLLATE Cyrillic_General_CI_AS NULL ," + - "[timestamp_l8] [timestamp] NULL ," + - "[tinyint_1_p3_s0_l1] [tinyint] NULL ," + - "[uniqueidentifier_l16] [uniqueidentifier] NULL ," + - "[varbinary_l150] [varbinary] (150) NULL ," + - "[varchar_l50] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL)"; - ExecuteQuery(createTableQuery); - var model = ExtractCatalog(); - - Table table = model.DefaultSchema.Tables["dataTypesTestTable"]; - Assert.IsTrue(table.TableColumns["int_l4"].DataType.Type==SqlType.Int32); - Assert.IsTrue(table.TableColumns["binary_l50"].DataType.Length==50); - Assert.IsTrue(table.TableColumns["binary_l50"].DataType.Type==SqlType.Binary); - Assert.IsTrue(table.TableColumns["bit_l1"].DataType.Type==SqlType.Boolean); - Assert.IsTrue(table.TableColumns["char_10"].DataType.Length==5); - Assert.IsTrue(table.TableColumns["char_10"].DataType.Type==SqlType.Char); - Assert.IsTrue(table.TableColumns["datetime_l8"].DataType.Type==SqlType.DateTime); - Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Type==SqlType.Decimal); - Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Precision==18); - Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Scale==0); - Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Type==SqlType.Decimal); - Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Precision==12); - Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Scale==11); - Assert.IsTrue(table.TableColumns["float_p53"].DataType.Type==SqlType.Double); - Assert.IsTrue(table.TableColumns["float_p53"].DataType.Precision==null); - Assert.IsTrue(table.TableColumns["float_p53"].DataType.Scale==null); - Assert.IsTrue(table.TableColumns["image_16"].DataType.Type==SqlType.VarBinaryMax); - Assert.IsTrue(comparer.Compare(table.TableColumns["money_p19_s4_l8"].DataType.TypeName, "money")==0); - Assert.IsTrue(table.TableColumns["money_p19_s4_l8"].DataType.Precision==19); - Assert.IsTrue(table.TableColumns["money_p19_s4_l8"].DataType.Scale==4); - Assert.IsTrue(table.TableColumns["nchar_l100"].DataType.Type==SqlType.Char); - Assert.IsTrue(table.TableColumns["nchar_l100"].DataType.Length==100); - Assert.IsTrue(table.TableColumns["ntext"].DataType.Type==SqlType.VarCharMax); - Assert.IsTrue(table.TableColumns["numeric_p5_s5"].DataType.Type==SqlType.Decimal); - Assert.IsTrue(table.TableColumns["numeric_p5_s5"].DataType.Precision==5); - Assert.IsTrue(table.TableColumns["nvarchar_l50"].DataType.Type==SqlType.VarChar); - Assert.IsTrue(table.TableColumns["nvarchar_l50"].DataType.Length==50); - Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Type==SqlType.Float); - Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Precision==null); - Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Scale==null); - Assert.IsTrue(table.TableColumns["smalldatetime_l4"].DataType.Type==SqlType.DateTime); - Assert.IsTrue(table.TableColumns["smallint_l2"].DataType.Type==SqlType.Int16); - Assert.IsTrue(comparer.Compare(table.TableColumns["small_money_p10_s4_l4"].DataType.TypeName, "smallmoney")==0); - Assert.IsTrue(comparer.Compare(table.TableColumns["sql_variant_"].DataType.TypeName, "sql_variant")==0); - Assert.IsTrue(table.TableColumns["text_16"].DataType.Type==SqlType.VarCharMax); - Assert.IsTrue(comparer.Compare(table.TableColumns["timestamp_l8"].DataType.TypeName, "timestamp")==0); - Assert.IsTrue(table.TableColumns["tinyint_1_p3_s0_l1"].DataType.Type==SqlType.UInt8); - Assert.IsTrue(table.TableColumns["uniqueidentifier_l16"].DataType.Type==SqlType.Guid); - Assert.IsTrue(table.TableColumns["varbinary_l150"].DataType.Type==SqlType.VarBinary); - Assert.IsTrue(table.TableColumns["varbinary_l150"].DataType.Length==150); - Assert.IsTrue(table.TableColumns["varchar_l50"].DataType.Type==SqlType.VarChar); - Assert.IsTrue(table.TableColumns["varchar_l50"].DataType.Length==25); - } - } - - public class MSSQLExtractor_TestExtractingViews : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get - { - return "\n drop table role1.table1" + - "\n drop view role1.view1" + - "\n drop view role1.view2" + - "\n exec sp_droprole role1"; - } - } - - [Test] - public virtual void Main() - { - ExecuteQuery( - " EXEC sp_addrole 'role1'" + - "\n CREATE TABLE role1.table1(column1 int, column2 int)"); - - ExecuteQuery( - "CREATE VIEW role1.view1 " + - "\n as Select column1 From role1.table1"); - - ExecuteQuery( - "CREATE VIEW role1.view2 " + - "\n as Select column1, column2 From role1.table1"); - - var model = ExtractCatalog(); - Schema schema = model.Schemas["role1"]; - - Assert.IsNotNull(schema); - Assert.IsNotNull(schema.Views["view1"]); - Assert.IsNotNull(schema.Views["view2"]); - Assert.IsNotNull(schema.Views["view1"].ViewColumns["column1"]); - Assert.IsNotNull(schema.Views["view2"].ViewColumns["column1"]); - Assert.IsNotNull(schema.Views["view2"].ViewColumns["column2"]); - } - } - - public class MSSQLExtractor_TestExtractingForeignKeys : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get - { - return - " drop table A1" + - "\n drop table A2" + - "\n drop table A3" + - "\n drop table B1" + - "\n drop table B2" + - "\n drop table B3"; - } - } - - [Test] - public void Main() - { - string query = "\n create table B1 (b_id int primary key)" + - "\n create table A1 (b_id int references B1(b_id))" + - "\n create table B2 (" + - "\n b_id_1 int, " + - "\n b_id_2 int, " + - "\n CONSTRAINT [B2_PK] PRIMARY KEY CLUSTERED (b_id_1, b_id_2) ON [PRIMARY])" + - "\n create table A2 (" + - "\n b_id_1 int, " + - "\n b_id_2 int, " + - "\n constraint [A2_FK] FOREIGN KEY (b_id_1, b_id_2) " + - "\n REFERENCES B2 (b_id_1, b_id_2) ON DELETE CASCADE ON UPDATE NO ACTION)" + - "\n create table B3 (" + - "\n b_id_1 int," + - "\n b_id_2 int," + - "\n b_id_3 int," + - "\n CONSTRAINT [B3_PK] PRIMARY KEY CLUSTERED (b_id_1, b_id_2, b_id_3) ON [PRIMARY])" + - "\n create table A3 (" + - "\n A_col1 int," + - "\n b_id_3 int," + - "\n b_id_1 int," + - "\n b_id_2 int," + - "\n constraint [A3_FK] FOREIGN KEY (b_id_1, b_id_2, b_id_3) " + - "\n REFERENCES B3 (b_id_1, b_id_2, b_id_3) ON DELETE NO ACTION ON UPDATE CASCADE)"; - ExecuteQuery(query); - - - var model = ExtractCatalog(); - Schema schema = model.DefaultSchema; - - // Validating. - ForeignKey fk1 = (ForeignKey) schema.Tables["A1"].TableConstraints[0]; - Assert.IsNotNull(fk1); - Assert.IsTrue(fk1.Columns[0].Name=="b_id"); - Assert.IsTrue(fk1.ReferencedColumns[0].Name=="b_id"); - Assert.IsTrue(fk1.ReferencedColumns.Count==1); - Assert.IsTrue(fk1.Columns.Count==1); - - ForeignKey fk2 = (ForeignKey) schema.Tables["A2"].TableConstraints[0]; - Assert.IsNotNull(fk1); - Assert.IsTrue(fk2.Name=="A2_FK"); - Assert.IsTrue(fk2.Columns[0].Name=="b_id_1"); - Assert.IsTrue(fk2.ReferencedColumns[0].Name=="b_id_1"); - Assert.IsTrue(fk2.Columns[1].Name=="b_id_2"); - Assert.IsTrue(fk2.ReferencedColumns[1].Name=="b_id_2"); - Assert.IsTrue(fk2.ReferencedColumns.Count==2); - Assert.IsTrue(fk2.Columns.Count==2); - Assert.IsTrue(fk2.OnDelete==ReferentialAction.Cascade); - Assert.IsTrue(fk2.OnUpdate==ReferentialAction.NoAction); - - ForeignKey fk3 = (ForeignKey) schema.Tables["A3"].TableConstraints[0]; - Assert.IsNotNull(fk3); - Assert.IsTrue(fk3.Name=="A3_FK"); - Assert.IsTrue(fk3.Columns[0].Name=="b_id_1"); - Assert.IsTrue(fk3.ReferencedColumns[0].Name=="b_id_1"); - Assert.IsTrue(fk3.Columns[1].Name=="b_id_2"); - Assert.IsTrue(fk3.ReferencedColumns[1].Name=="b_id_2"); - Assert.IsTrue(fk3.Columns[2].Name=="b_id_3"); - Assert.IsTrue(fk3.ReferencedColumns[2].Name=="b_id_3"); - Assert.IsTrue(fk3.ReferencedColumns.Count==3); - Assert.IsTrue(fk3.Columns.Count==3); - Assert.IsTrue(fk3.OnDelete==ReferentialAction.NoAction); - Assert.IsTrue(fk3.OnUpdate==ReferentialAction.Cascade); - } - } - - public class MSSQLExtractor_TestExtractingUniqueConstraints : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get { return "drop table A"; } - } - - [Test] - public void Main() - { - ExecuteQuery( - " Create table A (" + - "\n col_11 int, col_12 int, col_13 int," + - "\n col_21 int, col_22 int, col_23 int," + - "\n CONSTRAINT A_UNIQUE_1 UNIQUE(col_11,col_12,col_13)," + - "\n CONSTRAINT A_UNIQUE_2 UNIQUE(col_21,col_22,col_23))"); - - var model = ExtractCatalog(); - Schema schema = model.DefaultSchema; - - // Validating. - UniqueConstraint A_UNIQUE_1 = (UniqueConstraint) schema.Tables["A"].TableConstraints["A_UNIQUE_1"]; - Assert.IsNotNull(A_UNIQUE_1); - Assert.IsTrue(A_UNIQUE_1.Columns[0].Name=="col_11"); - Assert.IsTrue(A_UNIQUE_1.Columns[1].Name=="col_12"); - Assert.IsTrue(A_UNIQUE_1.Columns[2].Name=="col_13"); - Assert.IsTrue(A_UNIQUE_1.Columns.Count==3); - - UniqueConstraint A_UNIQUE_2 = (UniqueConstraint) schema.Tables["A"].TableConstraints["A_UNIQUE_2"]; - Assert.IsNotNull(A_UNIQUE_2); - Assert.IsTrue(A_UNIQUE_2.Columns[0].Name=="col_21"); - Assert.IsTrue(A_UNIQUE_2.Columns[1].Name=="col_22"); - Assert.IsTrue(A_UNIQUE_2.Columns[2].Name=="col_23"); - Assert.IsTrue(A_UNIQUE_2.Columns.Count==3); - } - } - - public class MSSQLExtractor_TestIndexesExtracted : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get { return "drop table table1"; } - } - - [Test] - public virtual void Main() - { - ExecuteQuery( - " create table table1 (" + - "\n column1 int, " + - "\n column2 int) " + - "\n create index table1_index1_desc_asc on table1 (column1 desc, column2 asc)" + - "\n create unique index table1_index1_u_asc_desc on table1 (column1 asc, column2 desc)" + - "\n create unique index table1_index_with_included_columns on table1 (column1 asc)" + - "\n include (column2)"); - - var model = ExtractCatalog(); - Schema schema = model.DefaultSchema; - - Assert.IsTrue(schema.Tables["table1"]!=null); - Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index1_desc_asc"]); - Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns.Count==2); - Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[0].Name=="column1"); - Assert.IsTrue(!schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[0].Ascending); - Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[1].Ascending); - - Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"]); - Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns.Count==2); - Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns[0].Ascending); - Assert.IsTrue(!schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns[1].Ascending); - - Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index_with_included_columns"]); - Assert.AreEqual(1, schema.Tables["table1"].Indexes["table1_index_with_included_columns"].Columns.Count, - "Key columns"); - Assert.AreEqual(1, schema.Tables["table1"].Indexes["table1_index_with_included_columns"].NonkeyColumns.Count, - "Included columns"); - } - } - - public class MSSQLExtractor2005_TestSchemaExtraction : MSSQLExtractor_TestSchemaExtraction - { - public override string CleanUpScript - { - get - { - return - "\n drop table schema1.table1" + - "\n drop table schema2.table2" + - "\n drop table schema3.table3" + - "\n drop table schema3.table31" + - "\n drop schema schema1" + - "\n drop schema schema2" + - "\n drop schema schema3"; - ; - } - } - - [Test] - public override void Main() - { - ExecuteQuery(" create schema schema1"); - ExecuteQuery(" create schema schema2"); - ExecuteQuery(" create schema schema3"); - string createTablesSql = - "\n create table schema1.table1(test int, test2 int, test3 int)" + - "\n create table schema2.table2(test int, test2 int, test3 int)" + - "\n create table schema3.table3(test int, test2 int, test3 int)" + - "\n create table schema3.table31(test int, test2 int, test3 int)"; - ExecuteQuery(createTablesSql); - - var model = ExtractCatalog(); - - // Validating. - Assert.IsNotNull(model.Schemas["schema1"]); - Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"]); - Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["schema1"].Tables.Count==1); - - Assert.IsNotNull(model.Schemas["schema2"]); - Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"]); - Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["schema2"].Tables.Count==1); - - Assert.IsNotNull(model.Schemas["schema3"]); - Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"]); - Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test"]); - Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test2"]); - Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test3"]); - Assert.IsTrue(model.Schemas["schema3"].Tables.Count==2); - } - } - - public class MSSQLExtractor2005_TestColumnTypeExtraction : MSSQLExtractor_TestColumnTypeExtraction - { - /* - public override string CleanUpScript - { - get { return base.CleanUpScript + "\n drop table dataTypesTestTable2"; } - } - - public void Main2() - { - ExecuteQuery( - "create table dataTypesTestTable2(" + - "\n xml_column xml," + - "\n varbinary_max varbinary(max)," + - "\n nvarchar_max nvarchar(max)," + - "\n varchar_max varchar(max))", ConnectionString); - Model model = ExtractCatalog(ConnectionString); - - Schema schema = model.DefaultServer.DefaultCatalog.DefaultSchema; - Assert.IsNotNull(schema.Tables["dataTypesTestTable2"]); - Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["varbinary_max"].DataType.DataType == SqlDataType.VarBinaryMax); - Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["nvarchar_max"].DataType.DataType == SqlDataType.VarCharMax); - Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["varchar_max"].DataType.DataType == SqlDataType.VarCharMax); - Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["xml_column"].DataType.DataType == SqlDataType.Xml); - } - */ - } - - public class MSSQLExtractor2005_TestExtractingViews : MSSQLExtractor_TestExtractingViews - { - } - - public class MSSQLExtractor2005_TestExtractingForeignKeys : MSSQLExtractor_TestExtractingForeignKeys - { - } - - public class MSSQLExtractor2005_TestExtractingForeignKeys2 : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get - { - return - "\n Drop Table A" + - "\n Drop Table B" + - "\n Drop Table B2"; - } - } - - [Test] - public void Main() - { - ExecuteQuery( - " Create Table B (b_id int primary key)" + - "\n Create Table B2(b_id_1 int primary key)" + - "\n Create Table A(" + - "\n b_id int ," + - "\n b_id_1 int ," + - "\n Constraint [A_FK_1] Foreign key(b_id) references B(b_id) ON DELETE SET NULL ," + - "\n Constraint [A_FK_2] Foreign key(b_id_1) references B2(b_id_1) ON DELETE SET DEFAULT" + - "\n )"); - var model = ExtractCatalog(); - Schema schema = model.DefaultSchema; - Assert.IsTrue(((ForeignKey) schema.Tables["A"].TableConstraints["A_FK_1"]).OnDelete==ReferentialAction.SetNull); - Assert.IsTrue(((ForeignKey) schema.Tables["A"].TableConstraints["A_FK_2"]).OnDelete==ReferentialAction.SetDefault); - } - } - - public class MSSQLExtractor2005_TestExtractingUniqueConstraints : MSSQLExtractor_TestExtractingUniqueConstraints - { - } - - public class MSSQLExtractor2005_TestIndexesExtracted : MSSQLExtractor_TestIndexesExtracted - { - } - - public class MSSQLExtractor2005_TestPartitionsExtracted : MSSQLExtractorTestBase - { - public override string CleanUpScript - { - get - { - return "IF DB_ID (N'MSSQL2005Extr_PartitionsTest') IS NOT NULL" + - "\n DROP DATABASE MSSQL2005Extr_PartitionsTest;"; - } - } - - public void Main() - { - ExecuteQuery("USE master;"); - string createTestDatabaseSql = @"-- Get the SQL Server data path - DECLARE @data_path nvarchar(256); - SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) - FROM master.sys.master_files - WHERE database_id = 1 AND file_id = 1); - - -- execute the CREATE DATABASE statement - EXECUTE ('CREATE DATABASE MSSQL2005Extr_PartitionsTest - ON PRIMARY - ( NAME = SPri1_dat, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_P.mdf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 15% ), - ( NAME = SPri2_dat, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_S.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 15% ), - FILEGROUP MSSQL2005Extr_PartitionsTest_FG1 - ( NAME = MSSQL2005Extr_PartitionsTest_D11, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D11.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ), - ( NAME = MSSQL2005Extr_PartitionsTest_D12, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D12.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ), - FILEGROUP MSSQL2005Extr_PartitionsTest_FG2 - ( NAME = MSSQL2005Extr_PartitionsTest_D21, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D21.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ), - ( NAME = MSSQL2005Extr_PartitionsTest_D22, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D22.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ), - FILEGROUP MSSQL2005Extr_PartitionsTest_FG3 - ( NAME = MSSQL2005Extr_PartitionsTest_D31, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D31.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ), - ( NAME = MSSQL2005Extr_PartitionsTest_D32, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D32.ndf'', - SIZE = 10, - MAXSIZE = 50, - FILEGROWTH = 5 ) - LOG ON - ( NAME = Sales_log, - FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_Log.ldf'', - SIZE = 5MB, - MAXSIZE = 25MB, - FILEGROWTH = 5MB )' - );"; - ExecuteQuery(createTestDatabaseSql); - ExecuteQuery("use MSSQL2005Extr_PartitionsTest"); - - // Create partition function. - ExecuteQuery( - "CREATE PARTITION FUNCTION MSSQL2005Extr_PartitionsTest_PFA_LEFT_1_20_30_40 (int)" + - "\n AS RANGE LEFT FOR VALUES (500);"); - - // Create partition scheme. - ExecuteQuery( - "CREATE PARTITION SCHEME MSSQL2005Extr_PartitionsTest_PFA_Schema" + - "\n AS PARTITION MSSQL2005Extr_PartitionsTest_PFA_LEFT_1_20_30_40" + - "\n TO ( " + - "\n MSSQL2005Extr_PartitionsTest_FG1, " + - "\n MSSQL2005Extr_PartitionsTest_FG2);"); - - // Create partitioned tables - ExecuteQuery( - "CREATE TABLE MSSQL2005Extr_PartitionsTest_Table (col1 int, col2 char(10))" + - "\n ON MSSQL2005Extr_PartitionsTest_PFA_Schema (col1)"); - - ExecuteQuery( - "CREATE TABLE MSSQL2005Extr_PartitionsTest_Table2 (col1 int, col2 int)" + - "ON MSSQL2005Extr_PartitionsTest_PFA_Schema (col2) ;"); - - var model = ExtractCatalog(); - Schema schema = model.DefaultSchema; - - Assert.IsNotNull(schema.Tables["MSSQL2005Extr_PartitionsTest_Table"].PartitionDescriptor); - - Assert.IsTrue( - schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] - .PartitionDescriptor - .PartitionSchema.Name=="MSSQL2005Extr_PartitionsTest_PFA_Schema"); - - Assert.IsTrue( - schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] - .PartitionDescriptor - .PartitionSchema - .PartitionFunction - .BoundaryType==BoundaryType.Left); - - AssertUtility.AssertArraysAreEqual( - schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] - .PartitionDescriptor - .PartitionSchema - .PartitionFunction - .BoundaryValues, - new string[] {"0", "500"}); - - AssertUtility.AssertCollectionsAreEqual( - schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] - .PartitionDescriptor - .PartitionSchema - .Filegroups, - new string[] {"MSSQL2005Extr_PartitionsTest_FG1", "MSSQL2005Extr_PartitionsTest_FG2"}); - - Assert.IsTrue(schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] - .PartitionDescriptor - .PartitionMethod==PartitionMethod.Range); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Data.Common; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + public class AssertUtility + { + public static void AssertArraysAreEqual(Array a1, Array a2) + { + if (a1==a2) + return; + if (a1==null || a2==null) + throw new AssertionException("One of arrays is null."); + if (a1.Length!=a2.Length) + throw new AssertionException("Lengths are different."); + for (int i = 0; i < a1.Length; i++) + Assert.AreEqual(a1.GetValue(i), a2.GetValue(i)); + } + + public static void AssertCollectionsAreEqual(IEnumerable col1, IEnumerable col2) + { + if (col1==col2) + return; + if (col2==null || col1==null) + throw new AssertionException("One of arrays is null."); + IEnumerator enumerator1 = col1.GetEnumerator(); + IEnumerator enumerator2 = col2.GetEnumerator(); + enumerator1.Reset(); + enumerator2.Reset(); + while (enumerator1.MoveNext()) { + if (!enumerator2.MoveNext()) + throw new AssertionException("Different count."); + Assert.AreEqual(enumerator1.Current, enumerator2.Current); + } + if (enumerator2.MoveNext()) + throw new AssertionException("Different count."); + } + } + + public abstract class MSSQLExtractorTestBase : SqlTest + { + private bool isTestsIgnored = true; + + public virtual string CleanUpScript + { + get { return null; } + } + + protected void ExecuteQuery(string sqlQuery) + { + if (string.IsNullOrEmpty(sqlQuery)) + return; + ExecuteNonQuery(sqlQuery); + } + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + isTestsIgnored = false; + } + + protected override void TestFixtureTearDown() + { + if (!isTestsIgnored) + ExecuteQuery(CleanUpScript); + base.TestFixtureTearDown(); + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + } + + public class MSSQLExtractor_TestSchemaExtraction : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get + { + return + "\n drop table role1.table1" + + "\n drop table role2.table2" + + "\n drop table role3.table3" + + "\n drop table role3.table31" + + "\n exec sp_droprole role1" + + "\n exec sp_droprole role2" + + "\n exec sp_droprole role3"; + ; + } + } + + [Test] + public virtual void Main() + { + ExecuteQuery( + " exec sp_addrole 'role1'" + + "\n exec sp_addrole 'role2'" + + "\n exec sp_addrole 'role3'" + + "\n create table role1.table1(test int, test2 int, test3 int)" + + "\n create table role2.table2(test int, test2 int, test3 int)" + + "\n create table role3.table3(test int, test2 int, test3 int)" + + "\n create table role3.table31(test int, test2 int, test3 int)"); + + var model = ExtractCatalog(); + + // Validating. + Assert.IsNotNull(model.Schemas["role1"]); + Assert.IsNotNull(model.Schemas["role1"].Tables["table1"]); + Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["role1"].Tables["table1"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["role1"].Tables.Count==1); + + Assert.IsNotNull(model.Schemas["role2"]); + Assert.IsNotNull(model.Schemas["role2"].Tables["table2"]); + Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["role2"].Tables["table2"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["role2"].Tables.Count==1); + + Assert.IsNotNull(model.Schemas["role3"]); + Assert.IsNotNull(model.Schemas["role3"].Tables["table3"]); + Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["role3"].Tables["table3"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["role3"].Tables.Count==2); + } + } + + public class MSSQLExtractor_TestColumnTypeExtraction : MSSQLExtractorTestBase + { + private StringComparer comparer = StringComparer.InvariantCultureIgnoreCase; + + public override string CleanUpScript + { + get { return "drop table dataTypesTestTable"; } + } + + [Test] + public void Main() + { + string createTableQuery = + "CREATE TABLE dataTypesTestTable (" + + "[int_l4] [int] NULL ," + + "[binary_l50] [binary] (50) NULL ," + + "[bit_l1] [bit] NULL , " + + "[char_10] [char] (10) COLLATE Cyrillic_General_CI_AS NULL ," + + "[datetime_l8] [datetime] NULL ," + + "[decimal_p18_s0] [decimal](18, 0) NULL ," + + "[decimal_p12_s11_l9] [decimal](12, 11) NULL ," + + "[float_p53] [float] NULL ," + + "[image_16] [image] NULL ," + + "[money_p19_s4_l8] [money] NULL ," + + "[nchar_l100] [nchar] (100) COLLATE Cyrillic_General_CI_AS NULL ," + + "[ntext] [ntext] COLLATE Cyrillic_General_CI_AS NULL ," + + "[numeric_p5_s5] [numeric](5, 5) NULL ," + + "[nvarchar_l50] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL ," + + "[real_p24_s0_l4] [real] NULL ," + + "[smalldatetime_l4] [smalldatetime] NULL ," + + "[smallint_l2] [smallint] NULL ," + + "[small_money_p10_s4_l4] [smallmoney] NULL ," + + "[sql_variant_] [sql_variant] NULL ," + + "[text_16] [text] COLLATE Cyrillic_General_CI_AS NULL ," + + "[timestamp_l8] [timestamp] NULL ," + + "[tinyint_1_p3_s0_l1] [tinyint] NULL ," + + "[uniqueidentifier_l16] [uniqueidentifier] NULL ," + + "[varbinary_l150] [varbinary] (150) NULL ," + + "[varchar_l50] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL)"; + ExecuteQuery(createTableQuery); + var model = ExtractCatalog(); + + Table table = model.DefaultSchema.Tables["dataTypesTestTable"]; + Assert.IsTrue(table.TableColumns["int_l4"].DataType.Type==SqlType.Int32); + Assert.IsTrue(table.TableColumns["binary_l50"].DataType.Length==50); + Assert.IsTrue(table.TableColumns["binary_l50"].DataType.Type==SqlType.Binary); + Assert.IsTrue(table.TableColumns["bit_l1"].DataType.Type==SqlType.Boolean); + Assert.IsTrue(table.TableColumns["char_10"].DataType.Length==5); + Assert.IsTrue(table.TableColumns["char_10"].DataType.Type==SqlType.Char); + Assert.IsTrue(table.TableColumns["datetime_l8"].DataType.Type==SqlType.DateTime); + Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Type==SqlType.Decimal); + Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Precision==18); + Assert.IsTrue(table.TableColumns["decimal_p18_s0"].DataType.Scale==0); + Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Type==SqlType.Decimal); + Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Precision==12); + Assert.IsTrue(table.TableColumns["decimal_p12_s11_l9"].DataType.Scale==11); + Assert.IsTrue(table.TableColumns["float_p53"].DataType.Type==SqlType.Double); + Assert.IsTrue(table.TableColumns["float_p53"].DataType.Precision==null); + Assert.IsTrue(table.TableColumns["float_p53"].DataType.Scale==null); + Assert.IsTrue(table.TableColumns["image_16"].DataType.Type==SqlType.VarBinaryMax); + Assert.IsTrue(comparer.Compare(table.TableColumns["money_p19_s4_l8"].DataType.TypeName, "money")==0); + Assert.IsTrue(table.TableColumns["money_p19_s4_l8"].DataType.Precision==19); + Assert.IsTrue(table.TableColumns["money_p19_s4_l8"].DataType.Scale==4); + Assert.IsTrue(table.TableColumns["nchar_l100"].DataType.Type==SqlType.Char); + Assert.IsTrue(table.TableColumns["nchar_l100"].DataType.Length==100); + Assert.IsTrue(table.TableColumns["ntext"].DataType.Type==SqlType.VarCharMax); + Assert.IsTrue(table.TableColumns["numeric_p5_s5"].DataType.Type==SqlType.Decimal); + Assert.IsTrue(table.TableColumns["numeric_p5_s5"].DataType.Precision==5); + Assert.IsTrue(table.TableColumns["nvarchar_l50"].DataType.Type==SqlType.VarChar); + Assert.IsTrue(table.TableColumns["nvarchar_l50"].DataType.Length==50); + Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Type==SqlType.Float); + Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Precision==null); + Assert.IsTrue(table.TableColumns["real_p24_s0_l4"].DataType.Scale==null); + Assert.IsTrue(table.TableColumns["smalldatetime_l4"].DataType.Type==SqlType.DateTime); + Assert.IsTrue(table.TableColumns["smallint_l2"].DataType.Type==SqlType.Int16); + Assert.IsTrue(comparer.Compare(table.TableColumns["small_money_p10_s4_l4"].DataType.TypeName, "smallmoney")==0); + Assert.IsTrue(comparer.Compare(table.TableColumns["sql_variant_"].DataType.TypeName, "sql_variant")==0); + Assert.IsTrue(table.TableColumns["text_16"].DataType.Type==SqlType.VarCharMax); + Assert.IsTrue(comparer.Compare(table.TableColumns["timestamp_l8"].DataType.TypeName, "timestamp")==0); + Assert.IsTrue(table.TableColumns["tinyint_1_p3_s0_l1"].DataType.Type==SqlType.UInt8); + Assert.IsTrue(table.TableColumns["uniqueidentifier_l16"].DataType.Type==SqlType.Guid); + Assert.IsTrue(table.TableColumns["varbinary_l150"].DataType.Type==SqlType.VarBinary); + Assert.IsTrue(table.TableColumns["varbinary_l150"].DataType.Length==150); + Assert.IsTrue(table.TableColumns["varchar_l50"].DataType.Type==SqlType.VarChar); + Assert.IsTrue(table.TableColumns["varchar_l50"].DataType.Length==25); + } + } + + public class MSSQLExtractor_TestExtractingViews : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get + { + return "\n drop table role1.table1" + + "\n drop view role1.view1" + + "\n drop view role1.view2" + + "\n exec sp_droprole role1"; + } + } + + [Test] + public virtual void Main() + { + ExecuteQuery( + " EXEC sp_addrole 'role1'" + + "\n CREATE TABLE role1.table1(column1 int, column2 int)"); + + ExecuteQuery( + "CREATE VIEW role1.view1 " + + "\n as Select column1 From role1.table1"); + + ExecuteQuery( + "CREATE VIEW role1.view2 " + + "\n as Select column1, column2 From role1.table1"); + + var model = ExtractCatalog(); + Schema schema = model.Schemas["role1"]; + + Assert.IsNotNull(schema); + Assert.IsNotNull(schema.Views["view1"]); + Assert.IsNotNull(schema.Views["view2"]); + Assert.IsNotNull(schema.Views["view1"].ViewColumns["column1"]); + Assert.IsNotNull(schema.Views["view2"].ViewColumns["column1"]); + Assert.IsNotNull(schema.Views["view2"].ViewColumns["column2"]); + } + } + + public class MSSQLExtractor_TestExtractingForeignKeys : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get + { + return + " drop table A1" + + "\n drop table A2" + + "\n drop table A3" + + "\n drop table B1" + + "\n drop table B2" + + "\n drop table B3"; + } + } + + [Test] + public void Main() + { + string query = "\n create table B1 (b_id int primary key)" + + "\n create table A1 (b_id int references B1(b_id))" + + "\n create table B2 (" + + "\n b_id_1 int, " + + "\n b_id_2 int, " + + "\n CONSTRAINT [B2_PK] PRIMARY KEY CLUSTERED (b_id_1, b_id_2) ON [PRIMARY])" + + "\n create table A2 (" + + "\n b_id_1 int, " + + "\n b_id_2 int, " + + "\n constraint [A2_FK] FOREIGN KEY (b_id_1, b_id_2) " + + "\n REFERENCES B2 (b_id_1, b_id_2) ON DELETE CASCADE ON UPDATE NO ACTION)" + + "\n create table B3 (" + + "\n b_id_1 int," + + "\n b_id_2 int," + + "\n b_id_3 int," + + "\n CONSTRAINT [B3_PK] PRIMARY KEY CLUSTERED (b_id_1, b_id_2, b_id_3) ON [PRIMARY])" + + "\n create table A3 (" + + "\n A_col1 int," + + "\n b_id_3 int," + + "\n b_id_1 int," + + "\n b_id_2 int," + + "\n constraint [A3_FK] FOREIGN KEY (b_id_1, b_id_2, b_id_3) " + + "\n REFERENCES B3 (b_id_1, b_id_2, b_id_3) ON DELETE NO ACTION ON UPDATE CASCADE)"; + ExecuteQuery(query); + + + var model = ExtractCatalog(); + Schema schema = model.DefaultSchema; + + // Validating. + ForeignKey fk1 = (ForeignKey) schema.Tables["A1"].TableConstraints[0]; + Assert.IsNotNull(fk1); + Assert.IsTrue(fk1.Columns[0].Name=="b_id"); + Assert.IsTrue(fk1.ReferencedColumns[0].Name=="b_id"); + Assert.IsTrue(fk1.ReferencedColumns.Count==1); + Assert.IsTrue(fk1.Columns.Count==1); + + ForeignKey fk2 = (ForeignKey) schema.Tables["A2"].TableConstraints[0]; + Assert.IsNotNull(fk1); + Assert.IsTrue(fk2.Name=="A2_FK"); + Assert.IsTrue(fk2.Columns[0].Name=="b_id_1"); + Assert.IsTrue(fk2.ReferencedColumns[0].Name=="b_id_1"); + Assert.IsTrue(fk2.Columns[1].Name=="b_id_2"); + Assert.IsTrue(fk2.ReferencedColumns[1].Name=="b_id_2"); + Assert.IsTrue(fk2.ReferencedColumns.Count==2); + Assert.IsTrue(fk2.Columns.Count==2); + Assert.IsTrue(fk2.OnDelete==ReferentialAction.Cascade); + Assert.IsTrue(fk2.OnUpdate==ReferentialAction.NoAction); + + ForeignKey fk3 = (ForeignKey) schema.Tables["A3"].TableConstraints[0]; + Assert.IsNotNull(fk3); + Assert.IsTrue(fk3.Name=="A3_FK"); + Assert.IsTrue(fk3.Columns[0].Name=="b_id_1"); + Assert.IsTrue(fk3.ReferencedColumns[0].Name=="b_id_1"); + Assert.IsTrue(fk3.Columns[1].Name=="b_id_2"); + Assert.IsTrue(fk3.ReferencedColumns[1].Name=="b_id_2"); + Assert.IsTrue(fk3.Columns[2].Name=="b_id_3"); + Assert.IsTrue(fk3.ReferencedColumns[2].Name=="b_id_3"); + Assert.IsTrue(fk3.ReferencedColumns.Count==3); + Assert.IsTrue(fk3.Columns.Count==3); + Assert.IsTrue(fk3.OnDelete==ReferentialAction.NoAction); + Assert.IsTrue(fk3.OnUpdate==ReferentialAction.Cascade); + } + } + + public class MSSQLExtractor_TestExtractingUniqueConstraints : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get { return "drop table A"; } + } + + [Test] + public void Main() + { + ExecuteQuery( + " Create table A (" + + "\n col_11 int, col_12 int, col_13 int," + + "\n col_21 int, col_22 int, col_23 int," + + "\n CONSTRAINT A_UNIQUE_1 UNIQUE(col_11,col_12,col_13)," + + "\n CONSTRAINT A_UNIQUE_2 UNIQUE(col_21,col_22,col_23))"); + + var model = ExtractCatalog(); + Schema schema = model.DefaultSchema; + + // Validating. + UniqueConstraint A_UNIQUE_1 = (UniqueConstraint) schema.Tables["A"].TableConstraints["A_UNIQUE_1"]; + Assert.IsNotNull(A_UNIQUE_1); + Assert.IsTrue(A_UNIQUE_1.Columns[0].Name=="col_11"); + Assert.IsTrue(A_UNIQUE_1.Columns[1].Name=="col_12"); + Assert.IsTrue(A_UNIQUE_1.Columns[2].Name=="col_13"); + Assert.IsTrue(A_UNIQUE_1.Columns.Count==3); + + UniqueConstraint A_UNIQUE_2 = (UniqueConstraint) schema.Tables["A"].TableConstraints["A_UNIQUE_2"]; + Assert.IsNotNull(A_UNIQUE_2); + Assert.IsTrue(A_UNIQUE_2.Columns[0].Name=="col_21"); + Assert.IsTrue(A_UNIQUE_2.Columns[1].Name=="col_22"); + Assert.IsTrue(A_UNIQUE_2.Columns[2].Name=="col_23"); + Assert.IsTrue(A_UNIQUE_2.Columns.Count==3); + } + } + + public class MSSQLExtractor_TestIndexesExtracted : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get { return "drop table table1"; } + } + + [Test] + public virtual void Main() + { + ExecuteQuery( + " create table table1 (" + + "\n column1 int, " + + "\n column2 int) " + + "\n create index table1_index1_desc_asc on table1 (column1 desc, column2 asc)" + + "\n create unique index table1_index1_u_asc_desc on table1 (column1 asc, column2 desc)" + + "\n create unique index table1_index_with_included_columns on table1 (column1 asc)" + + "\n include (column2)"); + + var model = ExtractCatalog(); + Schema schema = model.DefaultSchema; + + Assert.IsTrue(schema.Tables["table1"]!=null); + Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index1_desc_asc"]); + Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns.Count==2); + Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[0].Name=="column1"); + Assert.IsTrue(!schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[0].Ascending); + Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_desc_asc"].Columns[1].Ascending); + + Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"]); + Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns.Count==2); + Assert.IsTrue(schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns[0].Ascending); + Assert.IsTrue(!schema.Tables["table1"].Indexes["table1_index1_u_asc_desc"].Columns[1].Ascending); + + Assert.IsNotNull(schema.Tables["table1"].Indexes["table1_index_with_included_columns"]); + Assert.AreEqual(1, schema.Tables["table1"].Indexes["table1_index_with_included_columns"].Columns.Count, + "Key columns"); + Assert.AreEqual(1, schema.Tables["table1"].Indexes["table1_index_with_included_columns"].NonkeyColumns.Count, + "Included columns"); + } + } + + public class MSSQLExtractor2005_TestSchemaExtraction : MSSQLExtractor_TestSchemaExtraction + { + public override string CleanUpScript + { + get + { + return + "\n drop table schema1.table1" + + "\n drop table schema2.table2" + + "\n drop table schema3.table3" + + "\n drop table schema3.table31" + + "\n drop schema schema1" + + "\n drop schema schema2" + + "\n drop schema schema3"; + ; + } + } + + [Test] + public override void Main() + { + ExecuteQuery(" create schema schema1"); + ExecuteQuery(" create schema schema2"); + ExecuteQuery(" create schema schema3"); + string createTablesSql = + "\n create table schema1.table1(test int, test2 int, test3 int)" + + "\n create table schema2.table2(test int, test2 int, test3 int)" + + "\n create table schema3.table3(test int, test2 int, test3 int)" + + "\n create table schema3.table31(test int, test2 int, test3 int)"; + ExecuteQuery(createTablesSql); + + var model = ExtractCatalog(); + + // Validating. + Assert.IsNotNull(model.Schemas["schema1"]); + Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"]); + Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["schema1"].Tables["table1"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["schema1"].Tables.Count==1); + + Assert.IsNotNull(model.Schemas["schema2"]); + Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"]); + Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["schema2"].Tables["table2"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["schema2"].Tables.Count==1); + + Assert.IsNotNull(model.Schemas["schema3"]); + Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"]); + Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test"]); + Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test2"]); + Assert.IsNotNull(model.Schemas["schema3"].Tables["table3"].TableColumns["test3"]); + Assert.IsTrue(model.Schemas["schema3"].Tables.Count==2); + } + } + + public class MSSQLExtractor2005_TestColumnTypeExtraction : MSSQLExtractor_TestColumnTypeExtraction + { + /* + public override string CleanUpScript + { + get { return base.CleanUpScript + "\n drop table dataTypesTestTable2"; } + } + + public void Main2() + { + ExecuteQuery( + "create table dataTypesTestTable2(" + + "\n xml_column xml," + + "\n varbinary_max varbinary(max)," + + "\n nvarchar_max nvarchar(max)," + + "\n varchar_max varchar(max))", ConnectionString); + Model model = ExtractCatalog(ConnectionString); + + Schema schema = model.DefaultServer.DefaultCatalog.DefaultSchema; + Assert.IsNotNull(schema.Tables["dataTypesTestTable2"]); + Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["varbinary_max"].DataType.DataType == SqlDataType.VarBinaryMax); + Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["nvarchar_max"].DataType.DataType == SqlDataType.VarCharMax); + Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["varchar_max"].DataType.DataType == SqlDataType.VarCharMax); + Assert.IsTrue(schema.Tables["dataTypesTestTable2"].TableColumns["xml_column"].DataType.DataType == SqlDataType.Xml); + } + */ + } + + public class MSSQLExtractor2005_TestExtractingViews : MSSQLExtractor_TestExtractingViews + { + } + + public class MSSQLExtractor2005_TestExtractingForeignKeys : MSSQLExtractor_TestExtractingForeignKeys + { + } + + public class MSSQLExtractor2005_TestExtractingForeignKeys2 : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get + { + return + "\n Drop Table A" + + "\n Drop Table B" + + "\n Drop Table B2"; + } + } + + [Test] + public void Main() + { + ExecuteQuery( + " Create Table B (b_id int primary key)" + + "\n Create Table B2(b_id_1 int primary key)" + + "\n Create Table A(" + + "\n b_id int ," + + "\n b_id_1 int ," + + "\n Constraint [A_FK_1] Foreign key(b_id) references B(b_id) ON DELETE SET NULL ," + + "\n Constraint [A_FK_2] Foreign key(b_id_1) references B2(b_id_1) ON DELETE SET DEFAULT" + + "\n )"); + var model = ExtractCatalog(); + Schema schema = model.DefaultSchema; + Assert.IsTrue(((ForeignKey) schema.Tables["A"].TableConstraints["A_FK_1"]).OnDelete==ReferentialAction.SetNull); + Assert.IsTrue(((ForeignKey) schema.Tables["A"].TableConstraints["A_FK_2"]).OnDelete==ReferentialAction.SetDefault); + } + } + + public class MSSQLExtractor2005_TestExtractingUniqueConstraints : MSSQLExtractor_TestExtractingUniqueConstraints + { + } + + public class MSSQLExtractor2005_TestIndexesExtracted : MSSQLExtractor_TestIndexesExtracted + { + } + + public class MSSQLExtractor2005_TestPartitionsExtracted : MSSQLExtractorTestBase + { + public override string CleanUpScript + { + get + { + return "IF DB_ID (N'MSSQL2005Extr_PartitionsTest') IS NOT NULL" + + "\n DROP DATABASE MSSQL2005Extr_PartitionsTest;"; + } + } + + public void Main() + { + ExecuteQuery("USE master;"); + string createTestDatabaseSql = @"-- Get the SQL Server data path + DECLARE @data_path nvarchar(256); + SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) + FROM master.sys.master_files + WHERE database_id = 1 AND file_id = 1); + + -- execute the CREATE DATABASE statement + EXECUTE ('CREATE DATABASE MSSQL2005Extr_PartitionsTest + ON PRIMARY + ( NAME = SPri1_dat, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_P.mdf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 15% ), + ( NAME = SPri2_dat, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_S.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 15% ), + FILEGROUP MSSQL2005Extr_PartitionsTest_FG1 + ( NAME = MSSQL2005Extr_PartitionsTest_D11, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D11.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ), + ( NAME = MSSQL2005Extr_PartitionsTest_D12, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D12.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ), + FILEGROUP MSSQL2005Extr_PartitionsTest_FG2 + ( NAME = MSSQL2005Extr_PartitionsTest_D21, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D21.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ), + ( NAME = MSSQL2005Extr_PartitionsTest_D22, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D22.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ), + FILEGROUP MSSQL2005Extr_PartitionsTest_FG3 + ( NAME = MSSQL2005Extr_PartitionsTest_D31, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D31.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ), + ( NAME = MSSQL2005Extr_PartitionsTest_D32, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_D32.ndf'', + SIZE = 10, + MAXSIZE = 50, + FILEGROWTH = 5 ) + LOG ON + ( NAME = Sales_log, + FILENAME = '''+ @data_path + 'MSSQL2005Extr_PartitionsTest_Log.ldf'', + SIZE = 5MB, + MAXSIZE = 25MB, + FILEGROWTH = 5MB )' + );"; + ExecuteQuery(createTestDatabaseSql); + ExecuteQuery("use MSSQL2005Extr_PartitionsTest"); + + // Create partition function. + ExecuteQuery( + "CREATE PARTITION FUNCTION MSSQL2005Extr_PartitionsTest_PFA_LEFT_1_20_30_40 (int)" + + "\n AS RANGE LEFT FOR VALUES (500);"); + + // Create partition scheme. + ExecuteQuery( + "CREATE PARTITION SCHEME MSSQL2005Extr_PartitionsTest_PFA_Schema" + + "\n AS PARTITION MSSQL2005Extr_PartitionsTest_PFA_LEFT_1_20_30_40" + + "\n TO ( " + + "\n MSSQL2005Extr_PartitionsTest_FG1, " + + "\n MSSQL2005Extr_PartitionsTest_FG2);"); + + // Create partitioned tables + ExecuteQuery( + "CREATE TABLE MSSQL2005Extr_PartitionsTest_Table (col1 int, col2 char(10))" + + "\n ON MSSQL2005Extr_PartitionsTest_PFA_Schema (col1)"); + + ExecuteQuery( + "CREATE TABLE MSSQL2005Extr_PartitionsTest_Table2 (col1 int, col2 int)" + + "ON MSSQL2005Extr_PartitionsTest_PFA_Schema (col2) ;"); + + var model = ExtractCatalog(); + Schema schema = model.DefaultSchema; + + Assert.IsNotNull(schema.Tables["MSSQL2005Extr_PartitionsTest_Table"].PartitionDescriptor); + + Assert.IsTrue( + schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] + .PartitionDescriptor + .PartitionSchema.Name=="MSSQL2005Extr_PartitionsTest_PFA_Schema"); + + Assert.IsTrue( + schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] + .PartitionDescriptor + .PartitionSchema + .PartitionFunction + .BoundaryType==BoundaryType.Left); + + AssertUtility.AssertArraysAreEqual( + schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] + .PartitionDescriptor + .PartitionSchema + .PartitionFunction + .BoundaryValues, + new string[] {"0", "500"}); + + AssertUtility.AssertCollectionsAreEqual( + schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] + .PartitionDescriptor + .PartitionSchema + .Filegroups, + new string[] {"MSSQL2005Extr_PartitionsTest_FG1", "MSSQL2005Extr_PartitionsTest_FG2"}); + + Assert.IsTrue(schema.Tables["MSSQL2005Extr_PartitionsTest_Table"] + .PartitionDescriptor + .PartitionMethod==PartitionMethod.Range); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLTests.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLTests.cs index ef44195f4f..b8294fdd18 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MSSQLTests.cs @@ -1,4177 +1,4177 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Diagnostics; -using NUnit.Framework; -using System; -using System.Data; -using System.Data.Common; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture, Explicit] - public class MSSQLTests : AdventureWorks - { - private SqlDriver sqlDriver; - private SqlConnection sqlConnection; - private DbCommand dbCommand; - private DbCommand sqlCommand; - - #region Internals - - private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteDataReaderResult(dbCommand); - r2 = GetExecuteDataReaderResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - if (r1.FieldCount!=r2.FieldCount) - return false; - for (int i = 0; iSqlDml.ParameterRef(p.ParameterName); - select.OrderBy.Add(product["ListPrice"]); - - sqlCommand.CommandText = Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); - Console.WriteLine(r); - } - - [Test] - public void Test001() - { - string nativeSql = "SELECT ProductID, Name, ListPrice " - +"FROM Production.Product " - +"WHERE ListPrice > $40 " - +"ORDER BY ListPrice ASC"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"], product["ListPrice"]); - select.Where = product["ListPrice"]>40; - select.OrderBy.Add(product["ListPrice"]); - select.OrderBy.Add(1); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test002() - { - string nativeSql = "SELECT * " - +"FROM AdventureWorks.Purchasing.ShipMethod"; - - SqlTableRef purchasing = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ShipMethod"]); - SqlSelect select = SqlDml.Select(purchasing); - select.Columns.Add(SqlDml.Asterisk); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test003() - { - string nativeSql = "SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name " - +"FROM Sales.Customer JOIN Sales.Store ON " - +"(Sales.Customer.CustomerID = Sales.Store.CustomerID) " - +"WHERE Sales.Customer.TerritoryID = 1"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); - SqlSelect select = SqlDml.Select(customer); - select.Distinct = true; - select.Columns.AddRange(customer["CustomerID"], store["Name"]); - select.From = select.From.InnerJoin(store, customer["CustomerID"]==store["CustomerID"]); - select.Where = customer["TerritoryID"]==1; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test004() - { - string nativeSql = "SELECT DISTINCT c.CustomerID, s.Name " - +"FROM Sales.Customer AS c " - +"JOIN " - +"Sales.Store AS s " - +"ON ( c.CustomerID = s.CustomerID) " - +"WHERE c.TerritoryID = 1"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"], "c"); - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); - SqlSelect select = - SqlDml.Select(customer.InnerJoin(store, customer["CustomerID"]==store["CustomerID"])); - select.Distinct = true; - select.Columns.AddRange(customer["CustomerID"], store["Name"]); - select.Where = customer["TerritoryID"]==1; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test005() - { - string nativeSql = "SELECT DISTINCT ShipToAddressID, TerritoryID " - +"FROM Sales.SalesOrderHeader " - +"ORDER BY TerritoryID"; - - SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); - SqlSelect select = SqlDml.Select(salesOrderHeader); - select.Distinct = true; - select.Columns.AddRange(salesOrderHeader["ShipToAddressID"], salesOrderHeader["TerritoryID"]); - select.OrderBy.Add(salesOrderHeader["TerritoryID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test006() - { - string nativeSql = "SELECT TOP 10 SalesOrderID, OrderDate " - +"FROM Sales.SalesOrderHeader " - +"WHERE OrderDate < '2007-01-01T01:01:01.012'" - +"ORDER BY OrderDate DESC"; - - SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); - SqlSelect select = SqlDml.Select(salesOrderHeader); - select.Limit = 10; - select.Columns.AddRange(salesOrderHeader["SalesOrderID"], salesOrderHeader["OrderDate"]); - select.Where = salesOrderHeader["OrderDate"] $100) " - +"GROUP BY OrdD1.SalesOrderID " - +"HAVING SUM(OrdD1.OrderQty) > 100"; - - SqlTableRef ordD1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD1"); - SqlTableRef ordD2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD2"); - SqlSelect subSelect = SqlDml.Select(ordD2); - subSelect.Columns.Add(ordD2["SalesOrderID"]); - subSelect.Where = ordD2["SalesOrderID"]>100; - SqlSelect select = SqlDml.Select(ordD1); - select.Columns.Add(ordD1["SalesOrderID"], "OrderID"); - select.Columns.Add(SqlDml.Sum(ordD1["OrderQty"]), "Units Sold"); - select.Columns.Add(SqlDml.Sum(ordD1["UnitPrice"]*ordD1["OrderQty"]), "Revenue"); - select.Where = SqlDml.In(ordD1["SalesOrderID"], subSelect); - select.GroupBy.Add(ordD1["SalesOrderID"]); - select.Having = SqlDml.Sum(ordD1["OrderQty"])>100; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test030() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE Class = 'H' " - +"ORDER BY ProductID"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = product["Class"]=='H'; - select.OrderBy.Add(product["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test031() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice BETWEEN 100 and 500 " - +"ORDER BY ListPrice"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = SqlDml.Between(product["ListPrice"], 100, 500); - select.OrderBy.Add(product["ListPrice"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test032() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE Color IN ('Multi', 'Silver') " - +"ORDER BY ProductID"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = SqlDml.In(product["Color"], SqlDml.Row("Multi", "Silver")); - select.OrderBy.Add(product["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test033() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE Name LIKE 'Ch%' " - +"ORDER BY ProductID"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = SqlDml.Like(product["Name"], "Ch%"); - select.OrderBy.Add(product["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test034() - { - string nativeSql = "SELECT s.Name " - +"FROM AdventureWorks.Sales.Customer c " - +"JOIN AdventureWorks.Sales.Store s " - +"ON c.CustomerID = s.CustomerID " - +"WHERE s.SalesPersonID IS NOT NULL " - +"ORDER BY s.Name"; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"], "c"); - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); - SqlSelect select = SqlDml.Select(c.InnerJoin(s, c["CustomerID"]==s["CustomerID"])); - select.Columns.Add(s["Name"]); - select.Where = SqlDml.IsNotNull(s["SalesPersonID"]); - select.OrderBy.Add(s["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test035() - { - string nativeSql = "SELECT OrdD1.SalesOrderID, OrdD1.ProductID " - +"FROM Sales.SalesOrderDetail OrdD1 " - +"WHERE OrdD1.OrderQty > ALL " - +"(SELECT OrdD2.OrderQty " - + - " FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd " - +"ON OrdD2.ProductID = Prd.ProductID " - +"WHERE Prd.Class = 'H')"; - - SqlTableRef ordD1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD1"); - SqlTableRef ordD2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD2"); - SqlTableRef prd = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd"); - SqlSelect subSelect = SqlDml.Select(ordD2.InnerJoin(prd, ordD2["ProductID"]==prd["ProductID"])); - subSelect.Columns.Add(ordD2["OrderQty"]); - subSelect.Where = prd["Class"]=='H'; - SqlSelect select = SqlDml.Select(ordD1); - select.Columns.AddRange(ordD1["SalesOrderID"], ordD1["ProductID"]); - select.Where = ordD1["OrderQty"]>SqlDml.All(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test036() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice < 500 " - +"OR (Class = 'L' AND ProductLine = 'S')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = product["ListPrice"]<500 || - (product["Class"]=='L' && product["ProductLine"]=='S'); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test037() - { - string nativeSql = "SELECT Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice > $50.00"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = product["ListPrice"]>50; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test038() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice BETWEEN 15 AND 25"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = SqlDml.Between(product["ListPrice"], 15, 25); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test039() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice = 15 OR ListPrice = 25"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = product["ListPrice"]==15 || product["ListPrice"]==25; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test040() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice > 15 AND ListPrice < 25"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = product["ListPrice"]>15 && product["ListPrice"]<25; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test041() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice NOT BETWEEN 15 AND 25"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = !SqlDml.Between(product["ListPrice"], 15, 25); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test042() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ProductSubcategoryID = 12 OR ProductSubcategoryID = 14 " - +"OR ProductSubcategoryID = 16"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = product["ProductSubcategoryID"]==12 || product["ProductSubcategoryID"]==14 || - product["ProductSubcategoryID"]==16; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test043() - { - string nativeSql = "SELECT ProductID, Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ProductSubcategoryID IN (12, 14, 16)"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"]); - select.Where = SqlDml.In(product["ProductSubcategoryID"], SqlDml.Row(12, 14, 16)); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test044() - { - string nativeSql = "SELECT DISTINCT Name " - +"FROM Production.Product " - +"WHERE ProductModelID IN " - +"(SELECT ProductModelID " - +"FROM Production.ProductModel " - +"WHERE Name = 'Long-sleeve logo jersey');"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productModel = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"]); - SqlSelect subSelect = SqlDml.Select(productModel); - subSelect.Columns.Add(productModel["ProductModelID"]); - subSelect.Where = productModel["Name"]=="Long-sleeve logo jersey"; - SqlSelect select = SqlDml.Select(product); - select.Distinct = true; - select.Columns.Add(product["Name"]); - select.Where = SqlDml.In(product["ProductModelID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test045() - { - string nativeSql = "SELECT DISTINCT Name " - +"FROM Production.Product " - +"WHERE ProductModelID NOT IN " - +"(SELECT ProductModelID " - +"FROM Production.ProductModel " - +"WHERE Name = 'Long-sleeve logo jersey');"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productModel = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"]); - SqlSelect subSelect = SqlDml.Select(productModel); - subSelect.Columns.Add(productModel["ProductModelID"]); - subSelect.Where = productModel["Name"]=="Long-sleeve logo jersey"; - SqlSelect select = SqlDml.Select(product); - select.Distinct = true; - select.Columns.Add(product["Name"]); - select.Where = SqlDml.NotIn(product["ProductModelID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test046() - { - string nativeSql = "SELECT Phone " - +"FROM AdventureWorks.Person.Contact " - +"WHERE Phone LIKE '415%'"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(contact); - select.Columns.Add(contact["Phone"]); - select.Where = SqlDml.Like(contact["Phone"], "415%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test047() - { - string nativeSql = "SELECT Phone " - +"FROM AdventureWorks.Person.Contact " - +"WHERE Phone NOT LIKE '415%'"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(contact); - select.Columns.Add(contact["Phone"]); - select.Where = !SqlDml.Like(contact["Phone"], "415%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test048() - { - string nativeSql = "SELECT Phone " - +"FROM Person.Contact " - +"WHERE Phone LIKE '415%' and Phone IS NOT NULL"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(contact); - select.Columns.Add(contact["Phone"]); - select.Where = SqlDml.Like(contact["Phone"], "415%") && SqlDml.IsNotNull(contact["Phone"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test049() - { - #region Like - - string nativeSql = "SELECT Phone " - +"FROM Person.Contact " - +"WHERE Phone LIKE '%5/%%' ESCAPE '/'"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(contact); - select.Columns.Add(contact["Phone"]); - select.Where = SqlDml.Like(contact["Phone"], "%5/%%", '/'); - - #endregion - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test050() - { - string nativeSql = "SELECT ProductID, Name, Color " - +"FROM AdventureWorks.Production.Product " - +"WHERE Color IS NULL"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["Name"], product["Color"]); - select.Where = SqlDml.IsNull(product["Color"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test051() - { - string nativeSql = "SELECT CustomerID, AccountNumber, TerritoryID " - +"FROM AdventureWorks.Sales.Customer " - +"WHERE TerritoryID IN (1, 2, 3) " - +"OR TerritoryID IS NULL"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlSelect select = SqlDml.Select(customer); - select.Columns.AddRange( - customer["CustomerID"], customer["AccountNumber"], customer["TerritoryID"]); - select.Where = SqlDml.In(customer["TerritoryID"], SqlDml.Row(1, 2, 3)) || - SqlDml.IsNull(customer["TerritoryID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test052() - { - string nativeSql = "SELECT CustomerID, AccountNumber, TerritoryID " - +"FROM AdventureWorks.Sales.Customer " - +"WHERE TerritoryID = NULL"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlSelect select = SqlDml.Select(customer); - select.Columns.AddRange( - customer["CustomerID"], customer["AccountNumber"], customer["TerritoryID"]); - select.Where = customer["TerritoryID"]==SqlDml.Null; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test053() - { - string nativeSql = "SELECT CustomerID, Name " - +"FROM AdventureWorks.Sales.Store " - +"WHERE CustomerID LIKE '1%' AND Name LIKE N'Bicycle%'"; - - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); - SqlSelect select = SqlDml.Select(store); - select.Columns.AddRange(store["CustomerID"], store["Name"]); - select.Where = SqlDml.Like(store["CustomerID"], "1%") && SqlDml.Like(store["Name"], "Bicycle%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test054() - { - string nativeSql = "SELECT CustomerID, Name " - +"FROM AdventureWorks.Sales.Store " - +"WHERE CustomerID LIKE '1%' OR Name LIKE N'Bicycle%'"; - - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); - SqlSelect select = SqlDml.Select(store); - select.Columns.AddRange(store["CustomerID"], store["Name"]); - select.Where = SqlDml.Like(store["CustomerID"], "1%") || SqlDml.Like(store["Name"], "Bicycle%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test055() - { - string nativeSql = "SELECT ProductID, ProductModelID " - +"FROM AdventureWorks.Production.Product " - +"WHERE ProductModelID = 20 OR ProductModelID = 21 " - +"AND Color = 'Red'"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); - select.Where = product["ProductModelID"]==20 || - product["ProductModelID"]==21 && product["Color"]=="RED"; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test056() - { - string nativeSql = "SELECT ProductID, ProductModelID " - +"FROM AdventureWorks.Production.Product " - +"WHERE (ProductModelID = 20 OR ProductModelID = 21) " - +"AND Color = 'Red'"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); - select.Where = (product["ProductModelID"]==20 || product["ProductModelID"]==21) && - product["Color"]=="RED"; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test057() - { - string nativeSql = "SELECT ProductID, ProductModelID " - +"FROM AdventureWorks.Production.Product " - +"WHERE ProductModelID = 20 OR (ProductModelID = 21 " - +"AND Color = 'Red')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); - select.Where = product["ProductModelID"]==20 || - (product["ProductModelID"]==21 && product["Color"]=="RED"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test058() - { - string nativeSql = "SELECT SalesOrderID, SUM(LineTotal) AS SubTotal " - +"FROM Sales.SalesOrderDetail sod " - +"GROUP BY SalesOrderID " - +"ORDER BY SalesOrderID ;"; - - SqlTableRef sod = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sod"); - SqlSelect select = SqlDml.Select(sod); - select.Columns.Add(sod["SalesOrderID"]); - select.Columns.Add(SqlDml.Sum(sod["LineTotal"]), "SubTotal"); - select.GroupBy.Add(sod["SalesOrderID"]); - select.OrderBy.Add(sod["SalesOrderID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test059() - { - string nativeSql = "SELECT DATEPART(yy, HireDate) AS Year, " - +"COUNT(*) AS NumberOfHires " - +"FROM AdventureWorks.HumanResources.Employee " - +"GROUP BY DATEPART(yy, HireDate)"; - - SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlSelect select = SqlDml.Select(employee); - select.Columns.Add( - SqlDml.Extract(SqlDateTimePart.Year, employee["HireDate"]), "Year"); - select.Columns.Add(SqlDml.Count(), "NumberOfHires"); - select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, employee["HireDate"])); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test060() - { - string nativeSql = "" - + - "SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price', " - +"SUM(LineTotal) AS SubTotal " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID, SpecialOfferID " - +"ORDER BY ProductID"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(salesOrderDetail["SpecialOfferID"]); - select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); - select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "SubTotal"); - select.GroupBy.AddRange(salesOrderDetail["ProductID"], salesOrderDetail["SpecialOfferID"]); - select.OrderBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test061() - { - string nativeSql = "" - + - "SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price', " - +"SUM(LineTotal) AS SubTotal " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID, SpecialOfferID " - +"ORDER BY ProductID"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(salesOrderDetail["SpecialOfferID"]); - select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); - select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "SubTotal"); - select.GroupBy.AddRange(salesOrderDetail["ProductID"], salesOrderDetail["SpecialOfferID"]); - select.OrderBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test062() - { - string nativeSql = "SELECT ProductModelID, AVG(ListPrice) AS 'Average List Price' " - +"FROM Production.Product " - +"WHERE ListPrice > $1000 " - +"GROUP BY ProductModelID " - +"ORDER BY ProductModelID ;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["ProductModelID"]); - select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "Average List Price"); - select.Where = product["ListPrice"]>1000; - select.GroupBy.Add(product["ProductModelID"]); - select.OrderBy.Add(product["ProductModelID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test063() - { - string nativeSql = "" - + - "SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID " - +"HAVING SUM(LineTotal) > $1000000.00 " - +"AND AVG(OrderQty) < 3 ;"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(SqlDml.Avg(salesOrderDetail["OrderQty"]), "AverageQuantity"); - select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); - select.Having = SqlDml.Sum(salesOrderDetail["LineTotal"])>1000000 && - SqlDml.Avg(salesOrderDetail["OrderQty"])<3; - select.GroupBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test064() - { - string nativeSql = "SELECT ProductID, Total = SUM(LineTotal) " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID " - +"HAVING SUM(LineTotal) > $2000000.00 ;"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); - select.Having = SqlDml.Sum(salesOrderDetail["LineTotal"])>2000000; - select.GroupBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test065() - { - string nativeSql = "SELECT ProductID, SUM(LineTotal) AS Total " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID " - +"HAVING COUNT(*) > 1500 ;"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); - select.Having = SqlDml.Count()>1500; - select.GroupBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test066() - { - string nativeSql = "SELECT ProductID " - +"FROM Sales.SalesOrderDetail " - +"GROUP BY ProductID " - +"HAVING AVG(OrderQty) > 5 " - +"ORDER BY ProductID ;"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.GroupBy.Add(salesOrderDetail["ProductID"]); - select.Having = SqlDml.Avg(salesOrderDetail["OrderQty"])>5; - select.OrderBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test067() - { - string nativeSql = "SELECT pm.Name, AVG(ListPrice) AS 'Average List Price' " - +"FROM Production.Product AS p " - +"JOIN Production.ProductModel AS pm " - +"ON p.ProductModelID = pm.ProductModelID " - +"GROUP BY pm.Name " - +"HAVING pm.Name LIKE 'Mountain%' " - +"ORDER BY pm.Name ;"; - - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef pm = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"], "pm"); - SqlSelect select = SqlDml.Select(p.InnerJoin(pm, p["ProductModelID"]==pm["ProductModelID"])); - select.Columns.Add(pm["Name"]); - select.Columns.Add(SqlDml.Avg(p["ListPrice"]), "Average List Price"); - select.GroupBy.Add(pm["Name"]); - select.Having = SqlDml.Like(pm["Name"], "Mountain%"); - select.OrderBy.Add(pm["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test068() - { - string nativeSql = "SELECT ProductID, AVG(UnitPrice) AS 'Average Price' " - +"FROM Sales.SalesOrderDetail " - +"WHERE OrderQty > 10 " - +"GROUP BY ProductID " - +"ORDER BY ProductID ;"; - - SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); - SqlSelect select = SqlDml.Select(salesOrderDetail); - select.Columns.Add(salesOrderDetail["ProductID"]); - select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); - select.Where = salesOrderDetail["OrderQty"]>10; - select.GroupBy.Add(salesOrderDetail["ProductID"]); - select.OrderBy.Add(salesOrderDetail["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test069() - { - string nativeSql = "SELECT Color, AVG (ListPrice) AS 'average list price' " - +"FROM Production.Product " - +"WHERE Color IS NOT NULL " - +"GROUP BY Color " - +"ORDER BY Color"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Color"]); - select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "average list price"); - select.Where = SqlDml.IsNotNull(product["Color"]); - select.GroupBy.Add(product["Color"]); - select.OrderBy.Add(product["Color"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test070() - { - string nativeSql = "SELECT ProductID, ProductSubcategoryID, ListPrice " - +"FROM Production.Product " - +"ORDER BY ProductSubcategoryID DESC, ListPrice"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange( - product["ProductID"], product["ProductSubcategoryID"], product["ListPrice"]); - select.OrderBy.Add(product["ProductSubcategoryID"], false); - select.OrderBy.Add(product["ListPrice"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - [Ignore("")] - public void Test071() - { - string nativeSql = "SELECT LastName FROM Person.Contact " - +"ORDER BY LastName " - +"COLLATE Traditional_Spanish_ci_ai ASC"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(contact); - select.Columns.Add(contact["LastName"]); - select.OrderBy.Add( - SqlDml.Collate(contact["LastName"], Catalog.Schemas["Person"].Collations["Traditional_Spanish_CI_AI"])); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test072() - { - string nativeSql = "SELECT Color, AVG (ListPrice) AS 'average list price' " - +"FROM Production.Product " - +"GROUP BY Color " - +"ORDER BY 'average list price'"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Color"]); - select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "average list price"); - select.GroupBy.Add(product["Color"]); - select.OrderBy.Add(select.Columns["average list price"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test073() - { - string nativeSql = "SELECT Ord.SalesOrderID, Ord.OrderDate, " - +"(SELECT MAX(OrdDet.UnitPrice) " - +"FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet " - + - " WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice " - +"FROM AdventureWorks.Sales.SalesOrderHeader AS Ord"; - - SqlTableRef ordDet = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdDet"); - SqlTableRef ord = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "Ord"); - SqlSelect subSelect = SqlDml.Select(ordDet); - subSelect.Columns.Add(SqlDml.Max(ordDet["UnitPrice"])); - subSelect.Where = ord["SalesOrderID"]==ordDet["SalesOrderID"]; - SqlSelect select = SqlDml.Select(ord); - select.Columns.AddRange(ord["SalesOrderID"], ord["OrderDate"]); - select.Columns.Add(subSelect, "MaxUnitPrice"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test074() - { - string nativeSql = "SELECT Name " - +"FROM AdventureWorks.Production.Product " - +"WHERE ListPrice = " - +"(SELECT ListPrice " - +"FROM AdventureWorks.Production.Product " - +"WHERE Name = 'Chainring Bolts' )"; - - SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(product2["ListPrice"]); - subSelect.Where = product2["Name"]=="Chainring Bolts"; - SqlSelect select = SqlDml.Select(product1); - select.Columns.AddRange(product1["Name"]); - select.Where = product1["ListPrice"]==subSelect; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test075() - { - string nativeSql = "SELECT Prd1. Name " - +"FROM AdventureWorks.Production.Product AS Prd1 " - +"JOIN AdventureWorks.Production.Product AS Prd2 " - +"ON (Prd1.ListPrice = Prd2.ListPrice) " - +"WHERE Prd2. Name = 'Chainring Bolts'"; - - SqlTableRef prd1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd1"); - SqlTableRef prd2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd2"); - SqlSelect select = SqlDml.Select(prd1.InnerJoin(prd2, prd1["ListPrice"]==prd2["ListPrice"])); - select.Columns.Add(prd1["Name"]); - select.Where = prd2["Name"]=="Chainring Bolts"; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test076() - { - string nativeSql = "SELECT Name " - +"FROM Sales.Store " - +"WHERE Sales.Store.CustomerID NOT IN " - +"(SELECT Sales.Customer.CustomerID " - +"FROM Sales.Customer " - +"WHERE TerritoryID = 5)"; - - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlSelect subSelect = SqlDml.Select(customer); - subSelect.Columns.Add(customer["CustomerID"]); - subSelect.Where = customer["TerritoryID"]==5; - SqlSelect select = SqlDml.Select(store); - select.Columns.Add(store["Name"]); - select.Where = SqlDml.NotIn(store["CustomerID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test077() - { - string nativeSql = "SELECT EmployeeID, ManagerID " - +"FROM HumanResources.Employee " - +"WHERE ManagerID IN " - +"(SELECT ManagerID " - +"FROM HumanResources.Employee " - +"WHERE EmployeeID = 12)"; - - SqlTableRef employee1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlTableRef employee2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlSelect subSelect = SqlDml.Select(employee2); - subSelect.Columns.Add(employee2["ManagerID"]); - subSelect.Where = employee2["EmployeeID"]==12; - SqlSelect select = SqlDml.Select(employee1); - select.Columns.AddRange(employee1["EmployeeID"], employee1["ManagerID"]); - select.Where = SqlDml.In(employee1["ManagerID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test078() - { - string nativeSql = "SELECT e1.EmployeeID, e1.ManagerID " - +"FROM HumanResources.Employee AS e1 " - +"INNER JOIN HumanResources.Employee AS e2 " - +"ON e1.ManagerID = e2.ManagerID " - +"AND e2.EmployeeID = 12"; - - SqlTableRef e1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e1"); - SqlTableRef e2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e2"); - SqlSelect select = - SqlDml.Select(e1.InnerJoin(e2, e1["ManagerID"]==e2["ManagerID"] && e2["EmployeeID"]==12)); - select.Columns.AddRange(e1["EmployeeID"], e1["ManagerID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test079() - { - string nativeSql = "SELECT e1.EmployeeID, e1.ManagerID " - +"FROM HumanResources.Employee AS e1 " - +"WHERE e1.ManagerID IN " - +"(SELECT e2.ManagerID " - +"FROM HumanResources.Employee AS e2 " - +"WHERE e2.EmployeeID = 12)"; - - SqlTableRef e1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e1"); - SqlTableRef e2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e2"); - SqlSelect subSelect = SqlDml.Select(e2); - subSelect.Columns.Add(e2["ManagerID"]); - subSelect.Where = e2["EmployeeID"]==12; - SqlSelect select = SqlDml.Select(e1); - select.Columns.AddRange(e1["EmployeeID"], e1["ManagerID"]); - select.Where = SqlDml.In(e1["ManagerID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test080() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID IN " - +"(SELECT ProductSubcategoryID " - +"FROM Production.ProductSubcategory " - +"WHERE Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); - subSelect.Where = productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test081() - { - string nativeSql = "SELECT p.Name, s.Name " - +"FROM Production.Product p " - +"INNER JOIN Production.ProductSubcategory s " - +"ON p.ProductSubcategoryID = s.ProductSubcategoryID " - +"AND s.Name = 'Wheels'"; - - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"], "s"); - SqlSelect select = - SqlDml.Select( - p.InnerJoin( - s, p["ProductSubcategoryID"]==s["ProductSubcategoryID"] && s["Name"]=="Wheels")); - select.Columns.AddRange(p["Name"], s["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test082() - { - string nativeSql = "SELECT Name " - +"FROM Purchasing.Vendor " - +"WHERE CreditRating = 1 " - +"AND VendorID IN " - +"(SELECT VendorID " - +"FROM Purchasing.ProductVendor " - +"WHERE MinOrderQty >= 20 " - +"AND AverageLeadTime < 16)"; - - SqlTableRef vendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); - SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); - SqlSelect subSelect = SqlDml.Select(productVendor); - subSelect.Columns.Add(productVendor["VendorID"]); - subSelect.Where = productVendor["MinOrderQty"]>=20 && productVendor["AverageLeadTime"]<16; - SqlSelect select = SqlDml.Select(vendor); - select.Columns.Add(vendor["Name"]); - select.Where = vendor["CreditRating"]==1 && - SqlDml.In(vendor["VendorID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test083() - { - string nativeSql = "SELECT DISTINCT Name " - +"FROM Purchasing.Vendor v " - +"INNER JOIN Purchasing.ProductVendor p " - +"ON v.VendorID = p.VendorID " - +"WHERE CreditRating = 1 " - +"AND MinOrderQty >= 20 " - +"AND OnOrderQty IS NULL"; - - SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p"); - SqlSelect select = SqlDml.Select(v.InnerJoin(p, v["VendorID"]==p["VendorID"])); - select.Distinct = true; - select.Columns.Add(v["Name"]); - select.Where = v["CreditRating"]==1 && p["MinOrderQty"]>=20 && SqlDml.IsNull(p["OnOrderQty"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test084() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID NOT IN " - +"(SELECT ProductSubcategoryID " - +"FROM Production.Product " - +"WHERE Name = 'Mountain Bikes' " - +"OR Name = 'Road Bikes' " - +"OR Name = 'Touring Bikes')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(product2["ProductSubcategoryID"]); - subSelect.Where = product2["Name"]=="Mountain Bikes" || product2["Name"]=="Road Bikes" || - product2["Name"]=="Touring Bikes"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = SqlDml.NotIn(product["ProductSubcategoryID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test085() - { - string nativeSql = "UPDATE Production.Product " - +"SET ListPrice = ListPrice * 2 " - +"WHERE ProductID IN " - +"(SELECT ProductID " - +"FROM Purchasing.ProductVendor " - +"WHERE VendorID = 51);"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); - SqlSelect subSelect = SqlDml.Select(productVendor); - subSelect.Columns.Add(productVendor["ProductID"]); - subSelect.Where = productVendor["VendorID"]==51; - SqlUpdate update = SqlDml.Update(product); - update.Values[product["ListPrice"]] = product["ListPrice"]*2; - update.Where = SqlDml.In(product["ProductID"], subSelect); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test086() - { - string nativeSql = "UPDATE Production.Product " - +"SET ListPrice = ListPrice * 2 " - +"FROM Production.Product AS p " - +"INNER JOIN Purchasing.ProductVendor AS pv " - +"ON p.ProductID = pv.ProductID AND pv.VendorID = 51;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); - - SqlUpdate update = SqlDml.Update(product); - update.Values[product["ListPrice"]] = p["ListPrice"]*2; - update.From = p.InnerJoin(pv, p["ProductID"]==pv["ProductID"] && pv["VendorID"]==51); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test087() - { - string nativeSql = "SELECT CustomerID " - +"FROM Sales.Customer " - +"WHERE TerritoryID = " - +"(SELECT TerritoryID " - +"FROM Sales.SalesPerson " - +"WHERE SalesPersonID = 276)"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlSelect subSelect = SqlDml.Select(salesPerson); - subSelect.Columns.Add(salesPerson["TerritoryID"]); - subSelect.Where = salesPerson["SalesPersonID"]==276; - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["CustomerID"]); - select.Where = customer["TerritoryID"]==subSelect; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test088() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ListPrice > " - +"(SELECT AVG (ListPrice) " - +"FROM Production.Product)"; - - SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(SqlDml.Avg(product2["ListPrice"])); - SqlSelect select = SqlDml.Select(product1); - select.Columns.Add(product1["Name"]); - select.Where = product1["ListPrice"]>subSelect; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test089() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ListPrice > " - +"(SELECT MIN (ListPrice) " - +"FROM Production.Product " - +"GROUP BY ProductSubcategoryID " - +"HAVING ProductSubcategoryID = 14)"; - - SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(SqlDml.Min(product2["ListPrice"])); - subSelect.GroupBy.Add(product2["ProductSubcategoryID"]); - subSelect.Having = product2["ProductSubcategoryID"]==14; - SqlSelect select = SqlDml.Select(product1); - select.Columns.Add(product1["Name"]); - select.Where = product1["ListPrice"]>subSelect; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test090() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ListPrice >= ANY " - +"(SELECT MAX (ListPrice) " - +"FROM Production.Product " - +"GROUP BY ProductSubcategoryID)"; - - SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(SqlDml.Max(product2["ListPrice"])); - subSelect.GroupBy.Add(product2["ProductSubcategoryID"]); - SqlSelect select = SqlDml.Select(product1); - select.Columns.Add(product1["Name"]); - select.Where = product1["ListPrice"]>=SqlDml.Any(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test091() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID=ANY " - +"(SELECT ProductSubcategoryID " - +"FROM Production.ProductSubcategory " - +"WHERE Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); - subSelect.Where = productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = product["ProductSubcategoryID"]==SqlDml.Any(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test092() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID IN " - +"(SELECT ProductSubcategoryID " - +"FROM Production.ProductSubcategory " - +"WHERE Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); - subSelect.Where = productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test093() - { - string nativeSql = "SELECT CustomerID " - +"FROM Sales.Customer " - +"WHERE TerritoryID <> ANY " - +"(SELECT TerritoryID " - +"FROM Sales.SalesPerson)"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlSelect subSelect = SqlDml.Select(salesPerson); - subSelect.Columns.Add(salesPerson["TerritoryID"]); - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["CustomerID"]); - select.Where = customer["TerritoryID"]!=SqlDml.Any(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test094() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE EXISTS " - +"(SELECT * " - +"FROM Production.ProductSubcategory " - +"WHERE ProductSubcategoryID = " - +"Production.Product.ProductSubcategoryID " - +"AND Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory.Asterisk); - subSelect.Where = productSubcategory["ProductSubcategoryID"]==product["ProductSubcategoryID"]; - subSelect.Where = subSelect.Where && productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = SqlDml.Exists(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test095() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID IN " - +"(SELECT ProductSubcategoryID " - +"FROM Production.ProductSubcategory " - +"WHERE Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); - subSelect.Where = productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test096() - { - string nativeSql = "SELECT Name " - +"FROM Production.Product " - +"WHERE NOT EXISTS " - +"(SELECT * " - +"FROM Production.ProductSubcategory " - +"WHERE ProductSubcategoryID = " - +"Production.Product.ProductSubcategoryID " - +"AND Name = 'Wheels')"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef productSubcategory = - SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); - SqlSelect subSelect = SqlDml.Select(productSubcategory); - subSelect.Columns.Add(productSubcategory.Asterisk); - subSelect.Where = productSubcategory["ProductSubcategoryID"]==product["ProductSubcategoryID"]; - subSelect.Where = subSelect.Where && productSubcategory["Name"]=="Wheels"; - SqlSelect select = SqlDml.Select(product); - select.Columns.Add(product["Name"]); - select.Where = !SqlDml.Exists(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test097() - { - string nativeSql = "SELECT Name, ListPrice, " - +"(SELECT AVG(ListPrice) FROM Production.Product) AS Average, " - + - " ListPrice - (SELECT AVG(ListPrice) FROM Production.Product) " - +"AS Difference " - +"FROM Production.Product " - +"WHERE ProductSubcategoryID = 1"; - - SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlSelect subSelect = SqlDml.Select(product2); - subSelect.Columns.Add(SqlDml.Avg(product2["ListPrice"])); - SqlSelect select = SqlDml.Select(product1); - select.Columns.AddRange(product1["Name"], product1["ListPrice"]); - select.Columns.Add(subSelect, "Average"); - select.Columns.Add(product1["ListPrice"]-subSelect, "Difference"); - select.Where = product1["ProductSubcategoryID"]==1; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test098() - { - string nativeSql = "SELECT LastName, FirstName " - +"FROM Person.Contact " - +"WHERE ContactID IN " - +"(SELECT ContactID " - +"FROM HumanResources.Employee " - +"WHERE EmployeeID IN " - +"(SELECT SalesPersonID " - +"FROM Sales.SalesPerson))"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlSelect subSelect2 = SqlDml.Select(salesPerson); - subSelect2.Columns.Add(salesPerson["SalesPersonID"]); - SqlSelect subSelect1 = SqlDml.Select(employee); - subSelect1.Columns.Add(employee["ContactID"]); - subSelect1.Where = SqlDml.In(employee["EmployeeID"], subSelect2); - SqlSelect select = SqlDml.Select(contact); - select.Columns.AddRange(contact["LastName"], contact["FirstName"]); - select.Where = SqlDml.In(contact["ContactID"], subSelect1); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test099() - { - string nativeSql = "SELECT LastName, FirstName " - +"FROM Person.Contact c " - +"INNER JOIN HumanResources.Employee e " - +"ON c.ContactID = e.ContactID " - +"JOIN Sales.SalesPerson s " - +"ON e.EmployeeID = s.SalesPersonID"; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "s"); - SqlSelect select = SqlDml.Select(c); - select.From = select.From.InnerJoin(e, c["ContactID"]==e["ContactID"]); - select.From = select.From.InnerJoin(s, e["EmployeeID"]==s["SalesPersonID"]); - select.Columns.AddRange(c["LastName"], c["FirstName"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test100() - { - string nativeSql = "SELECT DISTINCT c.LastName, c.FirstName " - +"FROM Person.Contact c JOIN HumanResources.Employee e " - +"ON e.ContactID = c.ContactID " - +"WHERE 5000.00 IN " - +"(SELECT Bonus " - +"FROM Sales.SalesPerson sp " - +"WHERE e.EmployeeID = sp.SalesPersonID);"; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); - SqlSelect subSelect = SqlDml.Select(sp); - subSelect.Columns.Add(sp["Bonus"]); - subSelect.Where = e["EmployeeID"]==sp["SalesPersonID"]; - SqlSelect select = SqlDml.Select(c.InnerJoin(e, c["ContactID"]==e["ContactID"])); - select.Distinct = true; - select.Columns.AddRange(c["LastName"], c["FirstName"]); - select.Where = SqlDml.In(5000.00, subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test101() - { - string nativeSql = "SELECT LastName, FirstName " - +"FROM Person.Contact c JOIN HumanResources.Employee e " - +"ON e.ContactID = c.ContactID " - +"WHERE 5000 IN (5000)"; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlSelect select = SqlDml.Select(c.InnerJoin(e, c["ContactID"]==e["ContactID"])); - select.Columns.AddRange(c["LastName"], c["FirstName"]); - select.Where = SqlDml.In(5000, SqlDml.Row(5000)); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test102() - { - string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " - +"FROM Purchasing.ProductVendor pv1 " - +"WHERE ProductID IN " - +"(SELECT pv2.ProductID " - +"FROM Purchasing.ProductVendor pv2 " - +"WHERE pv1.VendorID <> pv2.VendorID) " - +"ORDER BY pv1.VendorID"; - - SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); - SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); - SqlSelect subSelect = SqlDml.Select(pv2); - subSelect.Columns.Add(pv2["ProductID"]); - subSelect.Where = pv1["VendorID"]!=pv2["VendorID"]; - SqlSelect select = SqlDml.Select(pv1); - select.Distinct = true; - select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); - select.Where = SqlDml.In(pv1["ProductID"], subSelect); - select.OrderBy.Add(pv1["VendorID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test103() - { - string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " - +"FROM Purchasing.ProductVendor pv1 " - +"INNER JOIN Purchasing.ProductVendor pv2 " - +"ON pv1.ProductID = pv2.ProductID " - +"AND pv1.VendorID <> pv2.VendorID " - +"ORDER BY pv1.VendorID"; - - SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); - SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); - SqlSelect select = - SqlDml.Select( - pv1.InnerJoin(pv2, pv1["ProductID"]==pv2["ProductID"] && pv1["VendorID"]!=pv2["VendorID"])); - select.Distinct = true; - select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); - select.OrderBy.Add(pv1["VendorID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test104() - { - string nativeSql = "SELECT ProductID, OrderQty " - +"FROM Sales.SalesOrderDetail s1 " - +"WHERE s1.OrderQty < " - +"(SELECT AVG (s2.OrderQty) " - +"FROM Sales.SalesOrderDetail s2 " - +"WHERE s2.ProductID = s1.ProductID)"; - - SqlTableRef s1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "s1"); - SqlTableRef s2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "s2"); - SqlSelect subSelect = SqlDml.Select(s2); - subSelect.Columns.Add(SqlDml.Avg(s2["OrderQty"])); - subSelect.Where = s2["ProductID"]==s1["ProductID"]; - SqlSelect select = SqlDml.Select(s1); - select.Columns.AddRange(s1["ProductID"], s1["OrderQty"]); - select.Where = s1["OrderQty"] " - +"(SELECT AVG (p2.ListPrice) " - +"FROM Production.Product p2 " - +"WHERE p1.ProductSubcategoryID = p2.ProductSubcategoryID)"; - - SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); - SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); - SqlSelect subSelect = SqlDml.Select(p2); - subSelect.Columns.Add(SqlDml.Avg(p2["ListPrice"])); - subSelect.Where = p2["ProductSubcategoryID"]==p1["ProductSubcategoryID"]; - SqlSelect select = SqlDml.Select(p1); - select.Columns.AddRange(p1["ProductSubcategoryID"], p1["Name"]); - select.Where = p1["ListPrice"]>subSelect; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test106() - { - string nativeSql = "SELECT p1.ProductModelID " - +"FROM Production.Product p1 " - +"GROUP BY p1.ProductModelID " - +"HAVING MAX(p1.ListPrice) >= ALL " - +"(SELECT 2 * AVG(p2.ListPrice) " - +"FROM Production.Product p2 " - +"WHERE p1.ProductModelID = p2.ProductModelID) ;"; - - SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); - SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); - SqlSelect subSelect = SqlDml.Select(p2); - subSelect.Columns.Add(2*SqlDml.Avg(p2["ListPrice"])); - subSelect.Where = p2["ProductModelID"]==p1["ProductModelID"]; - SqlSelect select = SqlDml.Select(p1); - select.Columns.Add(p1["ProductModelID"]); - select.GroupBy.Add(p1["ProductModelID"]); - select.Having = SqlDml.Max(p1["ListPrice"])>=SqlDml.All(subSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test107() - { - string nativeSql = "SELECT ProductID, Purchasing.Vendor.VendorID, Name " - +"FROM Purchasing.ProductVendor JOIN Purchasing.Vendor " - + - " ON (Purchasing.ProductVendor.VendorID = Purchasing.Vendor.VendorID) " - +"WHERE StandardPrice > $10 " - +"AND Name LIKE N'F%'"; - - SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); - SqlTableRef vendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); - SqlSelect select = - SqlDml.Select(productVendor.InnerJoin(vendor, productVendor["VendorID"]==vendor["VendorID"])); - select.Columns.AddRange(productVendor["ProductID"], vendor["VendorID"], vendor["Name"]); - select.Where = productVendor["StandardPrice"]>10 && SqlDml.Like(vendor["Name"], "F%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test108() - { - string nativeSql = "SELECT pv.ProductID, v.VendorID, v.Name " - +"FROM Purchasing.ProductVendor pv JOIN Purchasing.Vendor v " - +"ON (pv.VendorID = v.VendorID) " - +"WHERE StandardPrice > $10 " - +"AND Name LIKE N'F%'"; - - SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); - SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); - SqlSelect select = SqlDml.Select(pv.InnerJoin(v, pv["VendorID"]==v["VendorID"])); - select.Columns.AddRange(pv["ProductID"], v["VendorID"], v["Name"]); - select.Where = pv["StandardPrice"]>10 && SqlDml.Like(v["Name"], "F%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test109() - { - string nativeSql = "SELECT pv.ProductID, v.VendorID, v.Name " - +"FROM Purchasing.ProductVendor pv, Purchasing.Vendor v " - +"WHERE pv.VendorID = v.VendorID " - +"AND StandardPrice > $10 " - +"AND Name LIKE N'F%'"; - - SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); - SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); - SqlSelect select = SqlDml.Select(pv.CrossJoin(v)); - select.Columns.AddRange(pv["ProductID"], v["VendorID"], v["Name"]); - select.Where = pv["VendorID"]==v["VendorID"] && pv["StandardPrice"]>10 && - SqlDml.Like(v["Name"], "F%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test110() - { - string nativeSql = "SELECT e.EmployeeID " - +"FROM HumanResources.Employee AS e " - +"INNER JOIN Sales.SalesPerson AS s " - +"ON e.EmployeeID = s.SalesPersonID"; - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "s"); - SqlSelect select = SqlDml.Select(e.InnerJoin(s, e["EmployeeID"]==s["SalesPersonID"])); - select.Columns.Add(e["EmployeeID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test111() - { - string nativeSql = "SELECT * " - +"FROM HumanResources.Employee AS e " - +"INNER JOIN Person.Contact AS c " - +"ON e.ContactID = c.ContactID " - +"ORDER BY c.LastName"; - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); - SqlSelect select = SqlDml.Select(e.InnerJoin(c, e["ContactID"]==c["ContactID"])); - select.Columns.Add(SqlDml.Asterisk); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test112() - { - string nativeSql = "" - + - "SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price' " - +"FROM Sales.SalesOrderDetail AS sd " - +"JOIN Production.Product AS p " - + - " ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice " - +"WHERE p.ProductID = 718;"; - - SqlTableRef sd = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sd"); - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlSelect select = - SqlDml.Select( - sd.InnerJoin(p, sd["ProductID"]==p["ProductID"] && sd["UnitPrice"] p2.ListPrice " - +"WHERE p1.ListPrice < $15 AND p2.ListPrice < $15 " - +"ORDER BY ProductSubcategoryID;"; - - SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); - SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); - SqlSelect select = - SqlDml.Select( - p1.InnerJoin( - p2, - p1["ProductSubcategoryID"]==p2["ProductSubcategoryID"] && - p1["ListPrice"]!=p2["ListPrice"])); - select.Distinct = true; - select.Columns.AddRange(p1["ProductSubcategoryID"], p1["ListPrice"]); - select.Where = p1["ListPrice"]<15 && p2["ListPrice"]<15; - select.OrderBy.Add(p1["ProductSubcategoryID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test114() - { - string nativeSql = "SELECT DISTINCT p1.VendorID, p1.ProductID " - +"FROM Purchasing.ProductVendor p1 " - +"INNER JOIN Purchasing.ProductVendor p2 " - +"ON p1.ProductID = p2.ProductID " - +"WHERE p1.VendorID <> p2.VendorID " - +"ORDER BY p1.VendorID"; - - SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p1"); - SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p2"); - SqlSelect select = SqlDml.Select(p1.InnerJoin(p2, p1["ProductID"]==p2["ProductID"])); - select.Distinct = true; - select.Columns.AddRange(p1["VendorID"], p1["ProductID"]); - select.Where = p1["VendorID"]!=p2["VendorID"]; - select.OrderBy.Add(p1["VendorID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test115() - { - string nativeSql = "SELECT p.Name, pr.ProductReviewID " - +"FROM Production.Product p " - +"LEFT OUTER JOIN Production.ProductReview pr " - +"ON p.ProductID = pr.ProductID"; - - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef pr = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductReview"], "pr"); - SqlSelect select = SqlDml.Select(p.LeftOuterJoin(pr, p["ProductID"]==pr["ProductID"])); - select.Columns.AddRange(p["Name"], pr["ProductReviewID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test116() - { - string nativeSql = "SELECT st.Name AS Territory, sp.SalesPersonID " - +"FROM Sales.SalesTerritory st " - +"RIGHT OUTER JOIN Sales.SalesPerson sp " - +"ON st.TerritoryID = sp.TerritoryID ;"; - - SqlTableRef st = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesTerritory"], "st"); - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); - SqlSelect select = SqlDml.Select(st.RightOuterJoin(sp, st["TerritoryID"]==sp["TerritoryID"])); - select.Columns.Add(st["Name"], "Territory"); - select.Columns.Add(sp["SalesPersonID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test117() - { - string nativeSql = "SELECT st.Name AS Territory, sp.SalesPersonID " - +"FROM Sales.SalesTerritory st " - +"RIGHT OUTER JOIN Sales.SalesPerson sp " - +"ON st.TerritoryID = sp.TerritoryID " - +"WHERE st.SalesYTD < $2000000;"; - - SqlTableRef st = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesTerritory"], "st"); - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); - SqlSelect select = SqlDml.Select(st.RightOuterJoin(sp, st["TerritoryID"]==sp["TerritoryID"])); - select.Columns.Add(st["Name"], "Territory"); - select.Columns.Add(sp["SalesPersonID"]); - select.Where = st["SalesYTD"]<2000000; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test118() - { - string nativeSql = "SELECT p.Name, sod.SalesOrderID " - +"FROM Production.Product p " - +"FULL OUTER JOIN Sales.SalesOrderDetail sod " - +"ON p.ProductID = sod.ProductID " - +"WHERE p.ProductID IS NULL " - +"OR sod.ProductID IS NULL " - +"ORDER BY p.Name ;"; - - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef sod = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sod"); - SqlSelect select = SqlDml.Select(p.FullOuterJoin(sod, p["ProductID"]==sod["ProductID"])); - select.Columns.AddRange(p["Name"], sod["SalesOrderID"]); - select.Where = SqlDml.IsNull(p["ProductID"]) || SqlDml.IsNull(sod["ProductID"]); - select.OrderBy.Add(p["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test119() - { - string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " - +"FROM HumanResources.Employee e " - +"CROSS JOIN HumanResources.Department d " - +"ORDER BY e.EmployeeID, d.Name ;"; - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); - SqlSelect select = SqlDml.Select(e.CrossJoin(d)); - select.Columns.Add(e["EmployeeID"]); - select.Columns.Add(d["Name"], "Department"); - select.OrderBy.Add(e["EmployeeID"]); - select.OrderBy.Add(d["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - [Ignore("Invalid column")] - public void Test120() - { - string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " - +"FROM HumanResources.Employee e " - +"CROSS JOIN HumanResources.Department d " - +"WHERE e.DepartmentID = d.DepartmentID " - +"ORDER BY e.EmployeeID, d.Name ;"; - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); - SqlSelect select = SqlDml.Select(e.CrossJoin(d)); - select.Columns.Add(e["EmployeeID"]); - select.Columns.Add(d["Name"], "Department"); - select.Where = e["DepartmentID"]==d["DepartmentID"]; - select.OrderBy.Add(e["EmployeeID"]); - select.OrderBy.Add(d["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - [Ignore("Invalid column")] - public void Test121() - { - string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " - +"FROM HumanResources.Employee e " - +"INNER JOIN HumanResources.Department d " - +"ON e.DepartmentID = d.DepartmentID " - +"ORDER BY e.EmployeeID, d.Name ;"; - - SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); - SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); - SqlSelect select = SqlDml.Select(e.InnerJoin(d, e["DepartmentID"]==d["DepartmentID"])); - select.Columns.Add(e["EmployeeID"]); - select.Columns.Add(d["Name"], "Department"); - select.OrderBy.Add(e["EmployeeID"]); - select.OrderBy.Add(d["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test122() - { - string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " - +"FROM Purchasing.ProductVendor pv1 " - +"INNER JOIN Purchasing.ProductVendor pv2 " - +"ON pv1.ProductID = pv2.ProductID " - +"AND pv1.VendorID <> pv2.VendorID " - +"ORDER BY pv1.ProductID"; - - SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); - SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); - SqlSelect select = - SqlDml.Select( - pv1.InnerJoin(pv2, pv1["ProductID"]==pv2["ProductID"] && pv1["VendorID"]!=pv2["VendorID"])); - select.Distinct = true; - select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); - select.OrderBy.Add(pv1["ProductID"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test123() - { - string nativeSql = "SELECT p.Name, v.Name " - +"FROM Production.Product p " - +"JOIN Purchasing.ProductVendor pv " - +"ON p.ProductID = pv.ProductID " - +"JOIN Purchasing.Vendor v " - +"ON pv.VendorID = v.VendorID " - +"WHERE ProductSubcategoryID = 15 " - +"ORDER BY v.Name"; - - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); - SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); - SqlSelect select = - SqlDml.Select( - p.InnerJoin(pv, p["ProductID"]==pv["ProductID"]).InnerJoin( - v, pv["VendorID"]==v["VendorID"])); - select.Columns.AddRange(p["Name"], v["Name"]); - select.Where = p["ProductSubcategoryID"]==15; - select.OrderBy.Add(v["Name"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test124() - { - string nativeSql = "INSERT INTO Production.UnitMeasure " - +"VALUES (N'F2', N'Square Feet', GETDATE());"; - - SqlTableRef unitMeasure = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["UnitMeasure"]); - SqlInsert insert = SqlDml.Insert(unitMeasure); - insert.Values[unitMeasure[0]] = "F2"; - insert.Values[unitMeasure[1]] = "Square Feet"; - insert.Values[unitMeasure[2]] = SqlDml.CurrentDate(); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, insert)); - } - - [Test] - public void Test125() - { - string nativeSql = "UPDATE AdventureWorks.Production.Product " - +"SET ListPrice = ListPrice * 1.1 " - +"WHERE ProductModelID = 37;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlUpdate update = SqlDml.Update(product); - update.Values[product["ListPrice"]] = product["ListPrice"]*1.1; - update.Where = product["ProductModelID"]==37; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test126() - { - string nativeSql = "UPDATE Person.Address " - +"SET PostalCode = '98000' " - +"WHERE City = 'Bothell';"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"]); - SqlUpdate update = SqlDml.Update(product); - update.Values[product["PostalCode"]] = "98000"; - update.Where = product["City"]=="Bothell"; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test127() - { - string nativeSql = "UPDATE Sales.SalesPerson " - +"SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlUpdate update = SqlDml.Update(product); - update.Values[product["Bonus"]] = 6000; - update.Values[product["CommissionPct"]] = .10; - update.Values[product["SalesQuota"]] = SqlDml.Null; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test128() - { - string nativeSql = "UPDATE Production.Product " - +"SET ListPrice = ListPrice * 2;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlUpdate update = SqlDml.Update(product); - update.Values[product["ListPrice"]] = product["ListPrice"]*2; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test129() - { - string nativeSql = "UPDATE Sales.SalesPerson " - +"SET SalesYTD = SalesYTD + " - +"(SELECT SUM(so.SubTotal) " - +"FROM Sales.SalesOrderHeader AS so " - +"WHERE so.OrderDate = (SELECT MAX(OrderDate) " - +"FROM Sales.SalesOrderHeader AS so2 " - +"WHERE so2.SalesPersonID = " - +"so.SalesPersonID) " - +"AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID " - +"GROUP BY so.SalesPersonID);"; - - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); - SqlTableRef so2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so2"); - SqlSelect subSelect = SqlDml.Select(so2); - subSelect.Columns.Add(SqlDml.Max(so2["OrderDate"])); - subSelect.Where = so2["SalesPersonID"]==so["SalesPersonID"]; - SqlSelect select = SqlDml.Select(so); - select.Columns.Add(SqlDml.Sum(so["SubTotal"])); - select.Where = so["OrderDate"]==subSelect && salesPerson["SalesPersonID"]==so["SalesPersonID"]; - select.GroupBy.Add(so["SalesPersonID"]); - SqlUpdate update = SqlDml.Update(salesPerson); - update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]+select; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test130() - { - string nativeSql = "UPDATE AdventureWorks.Sales.SalesReason " - +"SET Name = N'Unknown' " - +"WHERE Name = N'Other';"; - - SqlTableRef salesReason = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesReason"]); - SqlUpdate update = SqlDml.Update(salesReason); - update.Values[salesReason["Name"]] = "Unknown"; - update.Where = salesReason["Name"]=="Other"; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test131() - { - string nativeSql = "UPDATE Sales.SalesPerson " - +"SET SalesYTD = SalesYTD + SubTotal " - +"FROM Sales.SalesPerson AS sp " - +"JOIN Sales.SalesOrderHeader AS so " - +"ON sp.SalesPersonID = so.SalesPersonID " - +"AND so.OrderDate = (SELECT MAX(OrderDate) " - +"FROM Sales.SalesOrderHeader " - +"WHERE SalesPersonID = " - +"sp.SalesPersonID);"; - - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); - SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); - SqlSelect subSelect = SqlDml.Select(salesOrderHeader); - subSelect.Columns.Add(SqlDml.Max(salesOrderHeader["OrderDate"])); - subSelect.Where = salesOrderHeader["SalesPersonID"]==sp["SalesPersonID"]; - SqlSelect select = - SqlDml.Select( - sp.InnerJoin(so, sp["SalesPersonID"]==so["SalesPersonID"] && so["OrderDate"]==subSelect)); - SqlUpdate update = SqlDml.Update(salesPerson); - update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test132() - { - string nativeSql = "UPDATE Sales.SalesPerson " - +"SET SalesYTD = SalesYTD + " - +"(SELECT SUM(so.SubTotal) " - +"FROM Sales.SalesOrderHeader AS so " - +"WHERE so.OrderDate = (SELECT MAX(OrderDate) " - +"FROM Sales.SalesOrderHeader AS so2 " - +"WHERE so2.SalesPersonID = " - +"so.SalesPersonID) " - +"AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID " - +"GROUP BY so.SalesPersonID);"; - - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlTableRef so2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so2"); - SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); - SqlSelect subSelect = SqlDml.Select(so2); - subSelect.Columns.Add(SqlDml.Max(so2["OrderDate"])); - subSelect.Where = so2["SalesPersonID"]==so["SalesPersonID"]; - SqlSelect select = SqlDml.Select(so); - select.Columns.Add(SqlDml.Sum(so["SubTotal"])); - select.Where = so["OrderDate"]==subSelect && salesPerson["SalesPersonID"]==so["SalesPersonID"]; - select.GroupBy.Add(so["SalesPersonID"]); - SqlUpdate update = SqlDml.Update(salesPerson); - update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]+select; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test133() - { - string nativeSql = "UPDATE Sales.Store " - + "SET SalesPersonID = 276 " - + "WHERE SalesPersonID = 275;"; - - SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); - SqlUpdate update = SqlDml.Update(store); - update.Values[store["SalesPersonID"]] = 276; - update.Where = store["SalesPersonID"]==275; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test134() - { - string nativeSql = "UPDATE HumanResources.Employee " - +"SET VacationHours = VacationHours + 8 " - +"FROM (SELECT TOP 10 EmployeeID FROM HumanResources.Employee " - +"ORDER BY HireDate ASC) AS th " - +"WHERE HumanResources.Employee.EmployeeID = th.EmployeeID;"; - - SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlTableRef employee2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - - SqlSelect select = SqlDml.Select(employee); - select.Limit = 10; - select.Columns.Add(employee["EmployeeID"]); - select.OrderBy.Add(employee["HireDate"]); - SqlQueryRef th = SqlDml.QueryRef(select, "th"); - - SqlUpdate update = SqlDml.Update(employee2); - update.Values[employee2["VacationHours"]] = employee2["VacationHours"]+8; - update.From = th; - update.Where = employee2["EmployeeID"]==th["EmployeeID"]; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test135() - { - string nativeSql = "DELETE FROM Sales.SalesPersonQuotaHistory " - +"WHERE SalesPersonID IN " - +"(SELECT SalesPersonID " - +"FROM Sales.SalesPerson " - +"WHERE SalesYTD > 2500000.00);"; - - SqlTableRef salesPersonQuotaHistory = - SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPersonQuotaHistory"]); - SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlSelect subSelect = SqlDml.Select(salesPerson); - subSelect.Columns.Add(salesPerson["SalesPersonID"]); - subSelect.Where = salesPerson["SalesYTD"]>2500000.00; - SqlDelete delete = SqlDml.Delete(salesPersonQuotaHistory); - delete.Where = SqlDml.In(salesPersonQuotaHistory["SalesPersonID"], subSelect); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); - } - - [Test] - public void Test136() - { - string nativeSql = "DELETE FROM Sales.SalesPersonQuotaHistory " - +"WHERE SalesPersonID IN " - +"(SELECT SalesPersonID " - +"FROM Sales.SalesPerson " - +"WHERE SalesYTD > 2500000.00);"; - - SqlTableRef salesPersonQuotaHistory = - SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPersonQuotaHistory"]); - - SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); - SqlSelect subSelect = SqlDml.Select(sp); - subSelect.Columns.Add(sp["SalesPersonID"]); - subSelect.Where = sp["SalesYTD"]>2500000.00; - - SqlDelete delete = SqlDml.Delete(salesPersonQuotaHistory); - delete.Where = SqlDml.In(salesPersonQuotaHistory["SalesPersonID"], subSelect); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); - } - - [Test] - public void Test137() - { - string nativeSql = "DELETE FROM Purchasing.PurchaseOrderDetail " - +"WHERE PurchaseOrderDetailID IN " - +"(SELECT TOP 10 PurchaseOrderDetailID " - +"FROM Purchasing.PurchaseOrderDetail " - +"ORDER BY DueDate ASC);"; - - SqlTableRef purchaseOrderDetail1 = - SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); - SqlTableRef purchaseOrderDetail2 = - SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); - SqlSelect select = SqlDml.Select(purchaseOrderDetail2); - select.Limit = 10; - select.Columns.Add(purchaseOrderDetail2["PurchaseOrderDetailID"]); - select.OrderBy.Add(purchaseOrderDetail2["DueDate"]); - SqlDelete delete = SqlDml.Delete(purchaseOrderDetail1); - delete.Where = SqlDml.In(purchaseOrderDetail1["PurchaseOrderDetailID"], select); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); - } - - [Test] - public void Test138() - { - string nativeSql = "DECLARE @EmpIDVar int; " - +"SET @EmpIDVar = 1234; " - +"SELECT * " - +"FROM HumanResources.Employee " - +"WHERE EmployeeID = @EmpIDVar;"; - - SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); - SqlVariable empIDVar = SqlDml.Variable("EmpIDVar", SqlType.Int32); - SqlBatch batch = SqlDml.Batch(); - batch.Add(empIDVar.Declare()); - batch.Add(SqlDml.Assign(empIDVar, 1234)); - SqlSelect select = SqlDml.Select(employee); - select.Columns.Add(employee.Asterisk); - select.Where = employee["EmployeeID"]==empIDVar; - batch.Add(select); - - Console.Write(Compile(batch)); - } - - [Test] - public void Test139() - { - string nativeSql = "SELECT Name, " - +"CASE Name " - +"WHEN 'Human Resources' THEN 'HR' " - +"WHEN 'Finance' THEN 'FI' " - +"WHEN 'Information Services' THEN 'IS' " - +"WHEN 'Executive' THEN 'EX' " - +"WHEN 'Facilities and Maintenance' THEN 'FM' " - +"END AS Abbreviation " - +"FROM AdventureWorks.HumanResources.Department " - +"WHERE GroupName = 'Executive General and Administration'"; - - SqlTableRef department = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"]); - SqlCase c = SqlDml.Case(department["Name"]); - c.Add("Human Resources", "HR").Add("Finance", "FI").Add("Information Services", "IS").Add("Executive", "EX"); - c["Facilities and Maintenance"] = "FM"; - SqlSelect select = SqlDml.Select(department); - select.Columns.AddRange(department["Name"]); - select.Columns.Add(c, "Abbreviation"); - select.Where = department["GroupName"]=="Executive General and Administration"; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test140() - { - string nativeSql = "SELECT ProductNumber, Category = " - +"CASE ProductLine " - +"WHEN 'R' THEN 'Road' " - +"WHEN 'M' THEN 'Mountain' " - +"WHEN 'T' THEN 'Touring' " - +"WHEN 'S' THEN 'Other sale items' " - +"ELSE 'Not for sale' " - +"END, " - +"Name " - +"FROM Production.Product " - +"ORDER BY ProductNumber;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlCase c = SqlDml.Case(product["ProductLine"]); - c["R"] = "Road"; - c["M"] = "Mountain"; - c["T"] = "Touring"; - c["S"] = "Other sale items"; - c.Else = "Not for sale"; - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductNumber"]); - select.Columns.Add(c, "Category"); - select.Columns.Add(product["Name"]); - select.OrderBy.Add(product["ProductNumber"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test141() - { - string nativeSql = "SELECT ProductNumber, Name, 'Price Range' = " - +"CASE " - +"WHEN ListPrice = 0 THEN 'Mfg item - not for resale' " - +"WHEN ListPrice < 50 THEN 'Under $50' " - + - " WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' " - + - " WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' " - +"ELSE 'Over $1000' " - +"END " - +"FROM Production.Product " - +"ORDER BY ProductNumber ;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlCase c = SqlDml.Case(); - c[product["ListPrice"]==0] = "Mfg item - not for resale"; - c[product["ListPrice"]<50] = "Under $50"; - c[product["ListPrice"]>=50 && product["ListPrice"]<250] = "Under $250"; - c[product["ListPrice"]>=250 && product["ListPrice"]<1000] = "Under $1000"; - c.Else = "Over $1000"; - SqlSelect select = SqlDml.Select(product); - select.Columns.AddRange(product["ProductNumber"], product["Name"]); - select.Columns.Add(c, "Price Range"); - select.OrderBy.Add(product["ProductNumber"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test142() - { - string nativeSql = "DECLARE @find varchar(30); " - +"SET @find = 'Man%'; " - +"SELECT LastName, FirstName, Phone " - +"FROM Person.Contact " - +"WHERE LastName LIKE @find;"; - - SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlVariable find = SqlDml.Variable("find", new SqlValueType("varchar(30)")); - SqlBatch batch = SqlDml.Batch(); - batch.Add(find.Declare()); - batch.Add(SqlDml.Assign(find, "Man%")); - SqlSelect select = SqlDml.Select(contact); - select.Columns.AddRange(contact["LastName"], contact["FirstName"], contact["Phone"]); - select.Where = SqlDml.Like(contact["LastName"], find); - batch.Add(select); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); - } - - [Test] - public void Test143() - { - string nativeSql = "SELECT * " - +"FROM Sales.Store s " - + - "WHERE s.Name IN ('West Side Mart', 'West Wind Distributors', 'Westside IsCyclic Store')"; - - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); - SqlSelect select = SqlDml.Select(s); - select.Columns.Add(SqlDml.Asterisk); - select.Where = - SqlDml.In( - s["Name"], SqlDml.Array("West Side Mart", "West Wind Distributors", "Westside IsCyclic Store")); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test144() - { - string nativeSql = "SELECT * " - +"FROM Sales.Store s " - +"WHERE s.CustomerID IN (1, 2, 3)"; - - SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); - SqlSelect select = SqlDml.Select(s); - select.Columns.Add(SqlDml.Asterisk); - select.Where = SqlDml.In(s["CustomerID"], SqlDml.Array(1, 2, 3)); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test145() - { - string nativeSql = "DECLARE complex_cursor CURSOR FOR " - +"SELECT a.EmployeeID " - +"FROM HumanResources.EmployeePayHistory AS a " - +"WHERE RateChangeDate <> " - +"(SELECT MAX(RateChangeDate) " - +"FROM HumanResources.EmployeePayHistory AS b " - +"WHERE a.EmployeeID = b.EmployeeID); " - +"OPEN complex_cursor; " - +"FETCH FROM complex_cursor; " - +"UPDATE HumanResources.EmployeePayHistory " - +"SET PayFrequency = 2 " - +"WHERE CURRENT OF complex_cursor; " - +"CLOSE complex_cursor; " - +"DEALLOCATE complex_cursor;"; - - SqlBatch batch = SqlDml.Batch(); - SqlTableRef employeePayHistory = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"]); - SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], "a"); - SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], "b"); - SqlSelect selectInner = SqlDml.Select(b); - selectInner.Columns.Add(SqlDml.Max(b["RateChangeDate"])); - selectInner.Where = a["EmployeeID"]==b["EmployeeID"]; - SqlSelect select = SqlDml.Select(a); - select.Columns.Add(a["EmployeeID"]); - select.Where = a["RateChangeDate"]!=selectInner; - SqlCursor cursor = SqlDml.Cursor("complex_cursor", select); - batch.Add(cursor.Declare()); - batch.Add(cursor.Open()); - batch.Add(cursor.Fetch()); - SqlUpdate update = SqlDml.Update(employeePayHistory); - update.Values[employeePayHistory["PayFrequency"]] = 2; - update.Where = cursor; - batch.Add(update); - batch.Add(cursor.Close()); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); - } - - [Test] - public void Test146() - { - SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"]); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test147() - { - SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], false); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test148() - { - SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"]); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test149() - { - SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"], false); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test150() - { - SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["Production"].Tables["Product"]); - create.Table.Filegroup = "xxx"; - Console.Write(Compile(create)); - } - - [Test] - public void Test151() - { - string nativeSql = "CREATE VIEW [HumanResources].[vEmployee] " - +"AS SELECT " - +"e.[EmployeeID], " - +"c.[Title], " - +"c.[FirstName], " - +"c.[MiddleName], " - +"c.[LastName], " - +"c.[Suffix], " - +"e.[Title] AS [JobTitle], " - +"c.[Phone], " - +"c.[EmailAddress], " - +"c.[EmailPromotion], " - +"a.[AddressLine1], " - +"a.[AddressLine2], " - +"a.[City], " - +"sp.[Name] AS [StateProvinceName], " - +"a.[PostalCode], " - +"cr.[Name] AS [CountryRegionName], " - +"FROM [HumanResources].[Employee] e " - +"INNER JOIN [Person].[Contact] c " - +"ON c.[ContactID] = e.[ContactID] " - +"INNER JOIN [HumanResources].[EmployeeAddress] ea " - +"ON e.[EmployeeID] = ea.[EmployeeID] " - +"INNER JOIN [Person].[Address] a " - +"ON ea.[AddressID] = a.[AddressID] " - +"INNER JOIN [Person].[StateProvince] sp " - +"ON sp.[StateProvinceID] = a.[StateProvinceID] " - +"INNER JOIN [Person].[CountryRegion] cr " - +"ON cr.[CountryRegionCode] = sp.[CountryRegionCode]"; - SqlCreateView create = SqlDdl.Create(Catalog.Schemas["HumanResources"].Views["vEmployee"]); - - Console.Write(Compile(create)); - } - - [Test] - public void Test152() - { - Assertion assertion = - Catalog.Schemas["Production"].CreateAssertion("assertion", SqlDml.Literal(1)==1, false, false); - SqlCreateAssertion create = SqlDdl.Create(assertion); - - Console.Write(Compile(create)); - } - - [Test] - public void Test153() - { -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet(Catalog.Schemas["Production"], "characterSet", characterSetBase, (ICollation)null); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test154() - { -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet(Catalog.Schemas["Production"], "characterSet", characterSetBase, new DefaultCollation()); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test155() - { -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet( -// Catalog.Schemas["Production"], "characterSet", characterSetBase, -// new DescendingCollation(Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"])); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test156() - { -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet( -// Catalog.Schemas["Production"], "characterSet", characterSetBase, new ExternalCollation("Collation.bin")); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test157() - { -// Translation translation = new Translation(Catalog.Schemas["Production"], "tranlsation"); -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet( -// Catalog.Schemas["Production"], "characterSet", characterSetBase, new TranslationCollation(translation)); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test158() - { -// Translation translation = new Translation(Catalog.Schemas["Production"], "tranlsation"); -// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); -// CharacterSet characterSet = -// new CharacterSet( -// Catalog.Schemas["Production"], "characterSet", characterSetBase, -// new TranslationCollation( -// translation, Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"])); -// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test159() - { - Xtensive.Sql.Model.Domain domain = - Catalog.Schemas["HumanResources"].CreateDomain("domain", new SqlValueType(SqlType.Decimal, 8, 2), 1); - domain.Collation = Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"]; - domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); - SqlCreateDomain create = SqlDdl.Create(domain); - - Console.Write(Compile(create)); - } - - [Test] - public void Test160() - { -// CharacterSet characterSet = new CharacterSet(Catalog.Schemas["Production"], "characterSet"); -// Collation collation = -// new Collation( -// Catalog.Schemas["HumanResources"], "collation", characterSet, -// Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"]); -// collation.PadSpace = true; -// SqlCreateCollation create = SqlDdl.Create(collation); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test161() - { -// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); -// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); -// IdentityTranslation tranlsationSource = new IdentityTranslation(); -// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); -// translation.SourceCharacterSet = source; -// translation.TargetCharacterSet = target; -// translation.TranslationSource = tranlsationSource; -// SqlCreateTranslation create = SqlDdl.Create(translation); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test162() - { -// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); -// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); -// ExternalTranslation tranlsationSource = new ExternalTranslation("externalTranlsation"); -// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); -// translation.SourceCharacterSet = source; -// translation.TargetCharacterSet = target; -// translation.TranslationSource = tranlsationSource; -// SqlCreateTranslation create = SqlDdl.Create(translation); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test163() - { -// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); -// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); -// Translation tranlsationSource = new Translation(Catalog.Schemas["Person"], "tranlsationSource"); -// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); -// translation.SourceCharacterSet = source; -// translation.TargetCharacterSet = target; -// translation.TranslationSource = tranlsationSource; -// SqlCreateTranslation create = SqlDdl.Create(translation); -// -// Console.Write(Compile(create)); - } - - [Test] - public void Test164() - { - SqlCreateSchema create = SqlDdl.Create(Catalog.Schemas["Production"]); - - Console.Write(Compile(create)); - } - - [Test] - public void Test165() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.AddColumn(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test166() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.DropDefault(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test167() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.SetDefault("Empty", Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test168() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.DropColumn(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test169() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.AddConstraint(Catalog.Schemas["Production"].Tables["Product"].TableConstraints[0])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test170() - { - SqlAlterTable alter = - SqlDdl.Alter( - Catalog.Schemas["Production"].Tables["Product"], - SqlDdl.DropConstraint(Catalog.Schemas["Production"].Tables["Product"].TableConstraints[0])); - - Console.Write(Compile(alter)); - } - - [Test] - [Ignore("ALTER DOMAIN is not supported")] - public void Test171() - { - Xtensive.Sql.Model.Domain domain = - Catalog.Schemas["HumanResources"].CreateDomain("domain171", new SqlValueType(SqlType.Decimal, 8, 2), 1); - domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); - SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.AddConstraint(domain.DomainConstraints[0])); - - Console.Write(Compile(alter)); - } - - [Test] - [Ignore("ALTER DOMAIN is not supported")] - public void Test172() - { - Xtensive.Sql.Model.Domain domain = - Catalog.Schemas["HumanResources"].CreateDomain("domain172", new SqlValueType(SqlType.Decimal, 8, 2), 1); - domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); - SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.DropConstraint(domain.DomainConstraints[0])); - - Console.Write(Compile(alter)); - } - - [Test] - [Ignore("ALTER DOMAIN is not supported")] - public void Test173() - { - Xtensive.Sql.Model.Domain domain = - Catalog.Schemas["HumanResources"].CreateDomain("domain173", new SqlValueType(SqlType.Decimal, 8, 2), 1); - SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.SetDefault(0)); - - Console.Write(Compile(alter)); - } - - [Test] - [Ignore("ALTER DOMAIN is not supported")] - public void Test174() - { - Xtensive.Sql.Model.Domain domain = - Catalog.Schemas["HumanResources"].CreateDomain("domain174", new SqlValueType(SqlType.Decimal, 8, 2), 1); - SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.DropDefault()); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test175() - { - Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator175"); - SqlCreateSequence create = SqlDdl.Create(s); - - Console.Write(Compile(create)); - } - - [Test] - public void Test176() - { - Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator176"); - s.SequenceDescriptor.IsCyclic = true; - s.SequenceDescriptor.StartValue = 1000; - s.SequenceDescriptor.MaxValue = 1000; - s.SequenceDescriptor.MinValue = -1000; - s.SequenceDescriptor.Increment = -1; - SqlCreateSequence create = SqlDdl.Create(s); - - Console.Write(Compile(create)); - } - - [Test] - public void Test177() - { - Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator177"); - SqlDropSequence drop = SqlDdl.Drop(s); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test178() - { - Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator178"); - SqlAlterSequence alter = SqlDdl.Alter(s, new SequenceDescriptor(s, 0, 1, null, null, true)); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test179() - { - Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator179"); - SqlAlterSequence alter = SqlDdl.Alter(s, new SequenceDescriptor(s, null, null, 1000, -1000)); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test180() - { - Table table = Catalog.Schemas["Production"].Tables["Product"]; - SqlAlterIdentityInfo action = - SqlDdl.Alter(table.TableColumns["ProductID"], new SequenceDescriptor(table.TableColumns["ProductID"], 2, 3, null, null, true)); - SqlAlterTable alter = SqlDdl.Alter(table, action); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test181() - { - SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); - - Console.Write(Compile(create)); - } - - [Test] - public void Test182() - { - PartitionFunction pf = - Catalog.CreatePartitionFunction("pf182", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); - pf.BoundaryType = BoundaryType.Right; - SqlCreatePartitionFunction create = SqlDdl.Create(pf); - - Console.Write(Compile(create)); - } - - [Test] - public void Test183() - { - PartitionFunction pf = - Catalog.CreatePartitionFunction("pf183", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); - SqlDropPartitionFunction drop = SqlDdl.Drop(pf); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test184() - { - PartitionFunction pf = - Catalog.CreatePartitionFunction("pf184", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); - SqlAlterPartitionFunction alter = SqlDdl.Alter(pf, "5", SqlAlterPartitionFunctionOption.Split); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test185() - { - PartitionFunction pf = - Catalog.CreatePartitionFunction("pf185", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); - PartitionSchema ps = Catalog.CreatePartitionSchema("ps1", pf, "[PRIMARY]", "sdf", "sdf1", "sdf2"); - SqlCreatePartitionScheme create = SqlDdl.Create(ps); - - Console.Write(Compile(create)); - } - - [Test] - public void Test186() - { - PartitionFunction pf = - Catalog.CreatePartitionFunction("pf186", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); - PartitionSchema ps = Catalog.CreatePartitionSchema("ps186", pf, "[PRIMARY]"); - SqlCreatePartitionScheme create = SqlDdl.Create(ps); - - Console.Write(Compile(create)); - } - - [Test] - public void Test187() - { - PartitionSchema ps = Catalog.CreatePartitionSchema("ps187", null, "[PRIMARY]"); - SqlDropPartitionScheme drop = SqlDdl.Drop(ps); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test188() - { - PartitionSchema ps = Catalog.CreatePartitionSchema("ps188", null, "[PRIMARY]"); - SqlAlterPartitionScheme alter = SqlDdl.Alter(ps); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test189() - { - PartitionSchema ps = Catalog.CreatePartitionSchema("ps189", null, "[PRIMARY]"); - SqlAlterPartitionScheme alter = SqlDdl.Alter(ps, "sdfg"); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test190() - { - PartitionSchema ps = Catalog.CreatePartitionSchema("ps190", null, "[PRIMARY]"); - Table t = Catalog.Schemas["Production"].Tables["Product"]; - t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], ps); - SqlCreateTable create = SqlDdl.Create(t); - - Console.Write(Compile(create)); - } - - [Test] - public void Test191() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Hash, 10); - SqlCreateTable create = SqlDdl.Create(t); - - Console.Write(Compile(create)); - } - - [Test] - public void Test192() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Hash); - t.PartitionDescriptor.CreateHashPartition("ts1"); - t.PartitionDescriptor.CreateHashPartition("ts2"); - t.PartitionDescriptor.CreateHashPartition("ts3"); - SqlCreateTable create = SqlDdl.Create(t); - - Console.Write(Compile(create)); - } - - [Test] - public void Test193() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.List); - t.PartitionDescriptor.CreateListPartition("p1", "ts1", "sdf", "sdf1", "sdfg"); - t.PartitionDescriptor.CreateListPartition("p2", "ts2", "sir"); - SqlCreateTable create = SqlDdl.Create(t); - - Console.Write(Compile(create)); - } - - [Test] - public void Test194() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Range); - t.PartitionDescriptor.CreateRangePartition("ts1", new DateTime(2006, 01, 01).ToString()); - t.PartitionDescriptor.CreateRangePartition("ts2", new DateTime(2007, 01, 01).ToString()); - t.PartitionDescriptor.CreateRangePartition("ts3", "MAXVALUE"); - SqlCreateTable create = SqlDdl.Create(t); - - Console.Write(Compile(create)); - } - - [Test] - public void Test195() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - Index index = t.CreateIndex("MegaIndex195"); - index.CreateIndexColumn(t.TableColumns[0]); - index.CreateIndexColumn(t.TableColumns[1]); - index.CreateIndexColumn(t.TableColumns[2], false); - index.CreateIndexColumn(t.TableColumns[3]); - index.CreateIndexColumn(t.TableColumns[4]); - index.CreateIndexColumn(t.TableColumns[5]); - index.IsUnique = true; - index.IsClustered = true; - index.FillFactor = 80; - index.Filegroup = "\"default\""; - SqlCreateIndex create = SqlDdl.Create(index); - - Console.Write(Compile(create)); - } - - [Test] - public void Test196() - { - Table t = Catalog.Schemas["Production"].Tables["Product"]; - Index index = t.CreateIndex("MegaIndex196"); - SqlDropIndex drop = SqlDdl.Drop(index); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test197() - { - string nativeSql = "Select Top 10 * " - +"From (Person.StateProvince a " - +"inner hash join Person.CountryRegion b on a.StateProvinceCode=b.CountryRegionCode)" - +"inner loop join " - +"(Person.StateProvince c " - +"inner merge join Person.CountryRegion d on c.StateProvinceCode=d.CountryRegionCode)" - +" on a.CountryRegionCode=c.CountryRegionCode"; - - SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "a"); - SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "b"); - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "c"); - SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "d"); - - SqlJoinedTable ab = a.InnerJoin(b, a["StateProvinceCode"]==b["CountryRegionCode"]); - SqlJoinedTable cd = c.InnerJoin(d, c["StateProvinceCode"]==d["CountryRegionCode"]); - SqlJoinedTable abcd = SqlDml.Join(SqlJoinType.InnerJoin, ab, cd, a["CountryRegionCode"]==c["CountryRegionCode"]); - - SqlSelect select = SqlDml.Select(abcd); - select.Limit = 10; - select.Columns.Add(SqlDml.Asterisk); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Hash, ab)); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Merge, cd)); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Loop, abcd)); - - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test198() - { - string nativeSql = "Select Top 10 * " - +"From (Person.StateProvince a " - +"inner hash join Person.CountryRegion b on a.StateProvinceCode=b.CountryRegionCode)" - +"inner loop join " - +"(Person.StateProvince c " - +"inner merge join Person.CountryRegion d on c.StateProvinceCode=d.CountryRegionCode)" - +" on a.CountryRegionCode=c.CountryRegionCode"; - - SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "a"); - SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "b"); - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "c"); - SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "d"); - - SqlJoinedTable ab = a.InnerJoin(b, a["StateProvinceCode"]==b["CountryRegionCode"]); - SqlJoinedTable cd = c.InnerJoin(d, c["StateProvinceCode"]==d["CountryRegionCode"]); - SqlJoinedTable abcd = SqlDml.Join(SqlJoinType.InnerJoin, ab, cd, a["CountryRegionCode"]==c["CountryRegionCode"]); - - SqlSelect select = SqlDml.Select(abcd); - select.Limit = 10; - select.Columns.Add(SqlDml.Asterisk); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Hash, b)); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Merge, d)); - select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Loop, abcd)); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test199() - { - string nativeSql = - "Select Top 10 EmailAddress "+ - "From Person.Contact a "+ - "Where EmailAddress Like 'a%'"; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(c); - select.Limit = 10; - select.Columns.Add(c["EmailAddress"]); - select.Where = SqlDml.Like(c["EmailAddress"], "a%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test200() - { - string nativeSql = - "Select Top 10 EmailAddress " + - "From Person.Contact a " + - "Where EmailAddress Like 'a%' " + - "OPTION (FAST 10, KEEP PLAN, ROBUST PLAN)"; - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select = SqlDml.Select(c); - select.Limit = 10; - select.Columns.Add(c["EmailAddress"]); - select.Where = SqlDml.Like(c["EmailAddress"], "a%"); - select.Hints.Add(SqlDml.FastFirstRowsHint(10)); - select.Hints.Add(SqlDml.NativeHint("KEEP PLAN, ROBUST PLAN")); - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test201() - { - string nativeSql = "Select Top 10 EmailAddress " - +"From Person.Contact a " - +"Where EmailAddress Like 'a%' " - + "UNION ALL " - +"Select Top 10 EmailAddress " - +"From Person.Contact b " - +"Where EmailAddress Like 'b%' "; - - SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlSelect select1 = SqlDml.Select(c); - select1.Limit = 10; - select1.Columns.Add(c["EmailAddress"]); - select1.Where = SqlDml.Like(c["EmailAddress"], "a%"); - SqlSelect select2 = SqlDml.Select(c); - select2.Limit = 10; - select2.Columns.Add(c["EmailAddress"]); - select2.Where = SqlDml.Like(c["EmailAddress"], "a%"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, SqlDml.UnionAll(select1, select2))); - } - - [Test] - public void Test202() - { - string nativeSql = - "DECLARE test202cursor CURSOR FOR SELECT * FROM Purchasing.Vendor;\n" + - "OPEN test202cursor;\n" + - "FETCH NEXT FROM test202cursor;\n" + - "CLOSE test202cursor;"; - SqlBatch batch = SqlDml.Batch(); - SqlTableRef vendors = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); - SqlSelect select = SqlDml.Select(vendors); - select.Columns.Add(select.Asterisk); - SqlCursor cursor = SqlDml.Cursor("test202cursor_", select); - batch.Add(cursor.Declare()); - batch.Add(cursor.Open()); - batch.Add(cursor.Fetch()); - batch.Add(cursor.Close()); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); - } - - [Test] - public void Test203() - { - string nativeSql = "INSERT INTO Person.Contact " - +"DEFAULT VALUES;"; - - SqlTableRef unitMeasure = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlInsert insert = SqlDml.Insert(unitMeasure); - - Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, insert))); - } - - [Test] - public void Test204() - { - string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; - - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(); - SqlSelect s3 = SqlDml.Select(); - SqlSelect s4 = SqlDml.Select(); - SqlSelect select; - s1.Columns.Add(1, "f"); - s2.Columns.Add(2); - s3.Columns.Add(3); - s4.Columns.Add(4); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); - select = SqlDml.Select(qr); - select.Columns.Add(qr["f"]); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select)); - } - - [Test] - public void Test205() - { - string nativeSql = - "DECLARE test205cursor CURSOR FOR SELECT * FROM Purchasing.Vendor;\n" + - "OPEN test205cursor;\n" + - "BEGIN\n" + - " FETCH NEXT FROM test205cursor;\n" + - "END\n" + - "CLOSE test205cursor;"; - - SqlBatch batch = SqlDml.Batch(); - SqlTableRef vendors = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); - SqlSelect select = SqlDml.Select(vendors); - select.Columns.Add(select.Asterisk); - SqlCursor cursor = SqlDml.Cursor("test205cursor_", select); - batch.Add(cursor.Declare()); - batch.Add(cursor.Open()); - SqlStatementBlock block = SqlDml.StatementBlock(); - block.Add(cursor.Fetch()); - batch.Add(block); - batch.Add(cursor.Close()); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); - } - - [Test] - public void Test206() - { - string nativeSql = - "SELECT c.Name SubcategoryName, p.Name ProductName " + - "FROM Production.ProductSubcategory c " + - "CROSS APPLY (SELECT Name FROM Production.Product WHERE ProductSubcategoryID = c.ProductSubcategoryID) p " + - "ORDER BY c.Name, p.Name"; - - var subcategories = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"], "c"); - var products = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - - var innerSelect = SqlDml.Select(products); - innerSelect.Columns.Add(products.Columns["Name"]); - innerSelect.Where = products.Columns["ProductSubcategoryID"] == subcategories.Columns["ProductSubcategoryID"]; - var innerQuery = SqlDml.QueryRef(innerSelect, "p"); - - var categoryName = subcategories.Columns["Name"]; - var productName = innerQuery.Columns["Name"]; - - var outerSelect = SqlDml.Select(subcategories.CrossApply(innerQuery)); - outerSelect.Columns.Add(categoryName, "SubcategoryName"); - outerSelect.Columns.Add(productName, "ProductName"); - outerSelect.OrderBy.Add(categoryName); - outerSelect.OrderBy.Add(productName); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, outerSelect)); - } - - [Test] - public void Test207() - { - string nativeSql = - "DELETE FROM [Sales].[SpecialOfferProduct] WHERE NOT EXISTS (SELECT [ProductID] FROM [Production].[Product]" - + " WHERE [Production].[Product].[ProductID] = [Sales].[SpecialOfferProduct].[ProductID])"; - - var products = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - var specialOfferProduct = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SpecialOfferProduct"]); - - var select = SqlDml.Select(products); - select.Columns.Add(products["ProductID"]); - select.Where = products["ProductID"]==specialOfferProduct["ProductID"]; - - var delete = SqlDml.Delete(specialOfferProduct); - delete.Where = SqlDml.Not(SqlDml.Exists(select)); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); - } - - [Test] - public void RenameTest() - { - var model = new Catalog("do40-tests"); - - Schema schema = Catalog.CreateSchema("S1"); - Table table = schema.CreateTable("T1"); - table.CreateColumn("C1", new SqlValueType(SqlType.Int32)); - - try { - sqlConnection.BeginTransaction(); - - using (var cmd = sqlConnection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - batch.Add(SqlDdl.Create(schema)); - cmd.CommandText = Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - - var exModel1 = sqlDriver.ExtractCatalog(sqlConnection); - var exT1 = exModel1.Schemas[schema.DbName].Tables[table.DbName]; - Assert.IsNotNull(exT1); - var exC1 = exT1.TableColumns["C1"]; - Assert.IsNotNull(exC1); - - using (var cmd = sqlConnection.CreateCommand()) { - SqlBatch batch = SqlDml.Batch(); - batch.Add(SqlDdl.Rename(exC1, "C2")); - batch.Add(SqlDdl.Rename(exT1, "T2")); - cmd.CommandText = Compile(batch).GetCommandText(); - cmd.ExecuteNonQuery(); - } - - var exModel2 = sqlDriver.ExtractCatalog(sqlConnection); - var exT2 = exModel2.Schemas[schema.DbName].Tables["T2"]; - Assert.IsNotNull(exT2); - var exC2 = exT2.TableColumns["C2"]; - Assert.IsNotNull(exC2); - - } - finally { - sqlConnection.Rollback(); - } - } - - [Test] - public void TestDeleteFrom() - { - string nativeSql = "DELETE FROM Production.Product " - +"FROM Production.Product AS p " - +"INNER JOIN Purchasing.ProductVendor AS pv " - +"ON p.ProductID = pv.ProductID AND pv.VendorID = 0;"; - - SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); - SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); - SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); - - SqlDelete delete = SqlDml.Delete(product); - delete.From = p.InnerJoin(pv, p["ProductID"]==pv["ProductID"] && pv["VendorID"]==0); - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); - } - - /* - -SELECT EmpSSN AS "Employee Social Security Number " -FROM EmpTable - -SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5 -FROM -(SELECT PurchaseOrderID, EmployeeID, VendorID -FROM Purchasing.PurchaseOrderHeader) p -PIVOT -( -COUNT (PurchaseOrderID) -FOR EmployeeID IN -( [164], [198], [223], [231], [233] ) -) AS pvt -ORDER BY VendorID - -DECLARE complex_cursor CURSOR FOR - SELECT a.EmployeeID - FROM HumanResources.EmployeePayHistory AS a - WHERE RateChangeDate <> - (SELECT MAX(RateChangeDate) - FROM HumanResources.EmployeePayHistory AS b - WHERE a.EmployeeID = b.EmployeeID) ; -OPEN complex_cursor; -FETCH FROM complex_cursor; -DELETE FROM HumanResources.EmployeePayHistory -WHERE CURRENT OF complex_cursor; -CLOSE complex_cursor; -DEALLOCATE complex_cursor; - ---batch2 -BEGIN TRANSACTION -GO -USE AdventureWorks; -GO -CREATE TABLE dbo.mycompanies -( - id_num int IDENTITY(100, 5), - company_name nvarchar(100) -) -GO -INSERT mycompanies (company_name) - VALUES (N'A Bike Store'); -INSERT mycompanies (company_name) - VALUES (N'Progressive Sports'); -INSERT mycompanies (company_name) - VALUES (N'Modular IsCyclic Systems'); -INSERT mycompanies (company_name) - VALUES (N'Advanced Bike Components'); -INSERT mycompanies (company_name) - VALUES (N'Metropolitan Sports Supply'); -INSERT mycompanies (company_name) - VALUES (N'Aerobic Exercise Company'); -INSERT mycompanies (company_name) - VALUES (N'Associated Bikes'); -INSERT mycompanies (company_name) - VALUES (N'Exemplary Cycles'); -GO -SELECT id_num, company_name -FROM dbo.mycompanies -ORDER BY company_name ASC; -GO -COMMIT; -GO - --- Create the table. -CREATE TABLE TestTable (cola int, colb char(3)) -GO -SET NOCOUNT ON -GO --- Declare the variable to be used. -DECLARE @MyCounter int - --- Initialize the variable. -SET @MyCounter = 0 - --- Test the variable to see if the loop is finished. -WHILE (@MyCounter < 26) -BEGIN - -- Insert a row into the table. - INSERT INTO TestTable VALUES - -- Use the variable to provide the integer value - -- for cola. Also use it to generate a unique letter - -- for each row. Use the ASCII function to get the - -- integer value of 'a'. Add @MyCounter. Use CHAR to - -- convert the sum back to the character @MyCounter - -- characters after 'a'. - (@MyCounter, - CHAR( ( @MyCounter + ASCII('a') ) ) - ) - -- Increment the variable to count this iteration - -- of the loop. - SET @MyCounter = @MyCounter + 1 -END -GO -SET NOCOUNT OFF -GO - --- Create a procedure that takes one input parameter --- and returns one output parameter and a return code. -CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT, - @MaxTotal INT OUTPUT -AS --- Declare and initialize a variable to hold @@ERROR. -DECLARE @ErrorSave INT -SET @ErrorSave = 0 - --- Do a SELECT using the input parameter. -SELECT FirstName, LastName, JobTitle -FROM HumanResources.vEmployee -WHERE EmployeeID = @EmployeeIDParm - --- Save any nonzero @@ERROR value. -IF (@@ERROR <> 0) - SET @ErrorSave = @@ERROR - --- Set a value in the output parameter. -SELECT @MaxTotal = MAX(TotalDue) -FROM Sales.SalesOrderHeader; - -IF (@@ERROR <> 0) - SET @ErrorSave = @@ERROR - --- Returns 0 if neither SELECT statement had --- an error; otherwise, returns the last error. -RETURN @ErrorSave - --- Returns 0 if neither SELECT statement had --- an error; otherwise, returns the last error. -RETURN @ErrorSave -GO - - --- Declare the variables for the return code and output parameter. -DECLARE @ReturnCode INT -DECLARE @MaxTotalVariable INT - --- Execute the stored procedure and specify which variables --- are to receive the output parameter and return code values. -EXEC @ReturnCode = SampleProcedure @EmployeeIDParm = 19, - @MaxTotal = @MaxTotalVariable OUTPUT - --- Show the values returned. -PRINT ' ' -PRINT 'Return code = ' + CAST(@ReturnCode AS CHAR(10)) -PRINT 'Maximum Quantity = ' + CAST(@MaxTotalVariable AS CHAR(10)) -GO - -DECLARE @Group nvarchar(50), @Sales money; -SET @Group = N'North America'; -SET @Sales = 2000000; -SET NOCOUNT OFF; -SELECT FirstName, LastName, SalesYTD -FROM Sales.vSalesPerson -WHERE TerritoryGroup = @Group and SalesYTD >= @Sales; - - -DECLARE @MyTableVar table( - EmpID int NOT NULL, - OldVacationHours int, - NewVacationHours int, - ModifiedDate datetime); -UPDATE TOP (10) HumanResources.Employee -SET VacationHours = VacationHours * 1.25 -OUTPUT INSERTED.EmployeeID, - DELETED.VacationHours, - INSERTED.VacationHours, - INSERTED.ModifiedDate -INTO @MyTableVar; ---Display the result set of the table variable. -SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate -FROM @MyTableVar; -GO ---Display the result set of the table. ---Note that ModifiedDate reflects the value generated by an ---AFTER UPDATE trigger. -SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate -FROM HumanResources.Employee; -GO -*/ - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Diagnostics; +using NUnit.Framework; +using System; +using System.Data; +using System.Data.Common; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture, Explicit] + public class MSSQLTests : AdventureWorks + { + private SqlDriver sqlDriver; + private SqlConnection sqlConnection; + private DbCommand dbCommand; + private DbCommand sqlCommand; + + #region Internals + + private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteDataReaderResult(dbCommand); + r2 = GetExecuteDataReaderResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + if (r1.FieldCount!=r2.FieldCount) + return false; + for (int i = 0; iSqlDml.ParameterRef(p.ParameterName); + select.OrderBy.Add(product["ListPrice"]); + + sqlCommand.CommandText = Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); + Console.WriteLine(r); + } + + [Test] + public void Test001() + { + string nativeSql = "SELECT ProductID, Name, ListPrice " + +"FROM Production.Product " + +"WHERE ListPrice > $40 " + +"ORDER BY ListPrice ASC"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"], product["ListPrice"]); + select.Where = product["ListPrice"]>40; + select.OrderBy.Add(product["ListPrice"]); + select.OrderBy.Add(1); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test002() + { + string nativeSql = "SELECT * " + +"FROM AdventureWorks.Purchasing.ShipMethod"; + + SqlTableRef purchasing = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ShipMethod"]); + SqlSelect select = SqlDml.Select(purchasing); + select.Columns.Add(SqlDml.Asterisk); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test003() + { + string nativeSql = "SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name " + +"FROM Sales.Customer JOIN Sales.Store ON " + +"(Sales.Customer.CustomerID = Sales.Store.CustomerID) " + +"WHERE Sales.Customer.TerritoryID = 1"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); + SqlSelect select = SqlDml.Select(customer); + select.Distinct = true; + select.Columns.AddRange(customer["CustomerID"], store["Name"]); + select.From = select.From.InnerJoin(store, customer["CustomerID"]==store["CustomerID"]); + select.Where = customer["TerritoryID"]==1; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test004() + { + string nativeSql = "SELECT DISTINCT c.CustomerID, s.Name " + +"FROM Sales.Customer AS c " + +"JOIN " + +"Sales.Store AS s " + +"ON ( c.CustomerID = s.CustomerID) " + +"WHERE c.TerritoryID = 1"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"], "c"); + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); + SqlSelect select = + SqlDml.Select(customer.InnerJoin(store, customer["CustomerID"]==store["CustomerID"])); + select.Distinct = true; + select.Columns.AddRange(customer["CustomerID"], store["Name"]); + select.Where = customer["TerritoryID"]==1; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test005() + { + string nativeSql = "SELECT DISTINCT ShipToAddressID, TerritoryID " + +"FROM Sales.SalesOrderHeader " + +"ORDER BY TerritoryID"; + + SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); + SqlSelect select = SqlDml.Select(salesOrderHeader); + select.Distinct = true; + select.Columns.AddRange(salesOrderHeader["ShipToAddressID"], salesOrderHeader["TerritoryID"]); + select.OrderBy.Add(salesOrderHeader["TerritoryID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test006() + { + string nativeSql = "SELECT TOP 10 SalesOrderID, OrderDate " + +"FROM Sales.SalesOrderHeader " + +"WHERE OrderDate < '2007-01-01T01:01:01.012'" + +"ORDER BY OrderDate DESC"; + + SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); + SqlSelect select = SqlDml.Select(salesOrderHeader); + select.Limit = 10; + select.Columns.AddRange(salesOrderHeader["SalesOrderID"], salesOrderHeader["OrderDate"]); + select.Where = salesOrderHeader["OrderDate"] $100) " + +"GROUP BY OrdD1.SalesOrderID " + +"HAVING SUM(OrdD1.OrderQty) > 100"; + + SqlTableRef ordD1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD1"); + SqlTableRef ordD2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD2"); + SqlSelect subSelect = SqlDml.Select(ordD2); + subSelect.Columns.Add(ordD2["SalesOrderID"]); + subSelect.Where = ordD2["SalesOrderID"]>100; + SqlSelect select = SqlDml.Select(ordD1); + select.Columns.Add(ordD1["SalesOrderID"], "OrderID"); + select.Columns.Add(SqlDml.Sum(ordD1["OrderQty"]), "Units Sold"); + select.Columns.Add(SqlDml.Sum(ordD1["UnitPrice"]*ordD1["OrderQty"]), "Revenue"); + select.Where = SqlDml.In(ordD1["SalesOrderID"], subSelect); + select.GroupBy.Add(ordD1["SalesOrderID"]); + select.Having = SqlDml.Sum(ordD1["OrderQty"])>100; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test030() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE Class = 'H' " + +"ORDER BY ProductID"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = product["Class"]=='H'; + select.OrderBy.Add(product["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test031() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice BETWEEN 100 and 500 " + +"ORDER BY ListPrice"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = SqlDml.Between(product["ListPrice"], 100, 500); + select.OrderBy.Add(product["ListPrice"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test032() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE Color IN ('Multi', 'Silver') " + +"ORDER BY ProductID"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = SqlDml.In(product["Color"], SqlDml.Row("Multi", "Silver")); + select.OrderBy.Add(product["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test033() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE Name LIKE 'Ch%' " + +"ORDER BY ProductID"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = SqlDml.Like(product["Name"], "Ch%"); + select.OrderBy.Add(product["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test034() + { + string nativeSql = "SELECT s.Name " + +"FROM AdventureWorks.Sales.Customer c " + +"JOIN AdventureWorks.Sales.Store s " + +"ON c.CustomerID = s.CustomerID " + +"WHERE s.SalesPersonID IS NOT NULL " + +"ORDER BY s.Name"; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"], "c"); + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); + SqlSelect select = SqlDml.Select(c.InnerJoin(s, c["CustomerID"]==s["CustomerID"])); + select.Columns.Add(s["Name"]); + select.Where = SqlDml.IsNotNull(s["SalesPersonID"]); + select.OrderBy.Add(s["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test035() + { + string nativeSql = "SELECT OrdD1.SalesOrderID, OrdD1.ProductID " + +"FROM Sales.SalesOrderDetail OrdD1 " + +"WHERE OrdD1.OrderQty > ALL " + +"(SELECT OrdD2.OrderQty " + + + " FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd " + +"ON OrdD2.ProductID = Prd.ProductID " + +"WHERE Prd.Class = 'H')"; + + SqlTableRef ordD1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD1"); + SqlTableRef ordD2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdD2"); + SqlTableRef prd = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd"); + SqlSelect subSelect = SqlDml.Select(ordD2.InnerJoin(prd, ordD2["ProductID"]==prd["ProductID"])); + subSelect.Columns.Add(ordD2["OrderQty"]); + subSelect.Where = prd["Class"]=='H'; + SqlSelect select = SqlDml.Select(ordD1); + select.Columns.AddRange(ordD1["SalesOrderID"], ordD1["ProductID"]); + select.Where = ordD1["OrderQty"]>SqlDml.All(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test036() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice < 500 " + +"OR (Class = 'L' AND ProductLine = 'S')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = product["ListPrice"]<500 || + (product["Class"]=='L' && product["ProductLine"]=='S'); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test037() + { + string nativeSql = "SELECT Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice > $50.00"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = product["ListPrice"]>50; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test038() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice BETWEEN 15 AND 25"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = SqlDml.Between(product["ListPrice"], 15, 25); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test039() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice = 15 OR ListPrice = 25"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = product["ListPrice"]==15 || product["ListPrice"]==25; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test040() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice > 15 AND ListPrice < 25"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = product["ListPrice"]>15 && product["ListPrice"]<25; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test041() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice NOT BETWEEN 15 AND 25"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = !SqlDml.Between(product["ListPrice"], 15, 25); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test042() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ProductSubcategoryID = 12 OR ProductSubcategoryID = 14 " + +"OR ProductSubcategoryID = 16"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = product["ProductSubcategoryID"]==12 || product["ProductSubcategoryID"]==14 || + product["ProductSubcategoryID"]==16; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test043() + { + string nativeSql = "SELECT ProductID, Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ProductSubcategoryID IN (12, 14, 16)"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"]); + select.Where = SqlDml.In(product["ProductSubcategoryID"], SqlDml.Row(12, 14, 16)); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test044() + { + string nativeSql = "SELECT DISTINCT Name " + +"FROM Production.Product " + +"WHERE ProductModelID IN " + +"(SELECT ProductModelID " + +"FROM Production.ProductModel " + +"WHERE Name = 'Long-sleeve logo jersey');"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productModel = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"]); + SqlSelect subSelect = SqlDml.Select(productModel); + subSelect.Columns.Add(productModel["ProductModelID"]); + subSelect.Where = productModel["Name"]=="Long-sleeve logo jersey"; + SqlSelect select = SqlDml.Select(product); + select.Distinct = true; + select.Columns.Add(product["Name"]); + select.Where = SqlDml.In(product["ProductModelID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test045() + { + string nativeSql = "SELECT DISTINCT Name " + +"FROM Production.Product " + +"WHERE ProductModelID NOT IN " + +"(SELECT ProductModelID " + +"FROM Production.ProductModel " + +"WHERE Name = 'Long-sleeve logo jersey');"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productModel = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"]); + SqlSelect subSelect = SqlDml.Select(productModel); + subSelect.Columns.Add(productModel["ProductModelID"]); + subSelect.Where = productModel["Name"]=="Long-sleeve logo jersey"; + SqlSelect select = SqlDml.Select(product); + select.Distinct = true; + select.Columns.Add(product["Name"]); + select.Where = SqlDml.NotIn(product["ProductModelID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test046() + { + string nativeSql = "SELECT Phone " + +"FROM AdventureWorks.Person.Contact " + +"WHERE Phone LIKE '415%'"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(contact); + select.Columns.Add(contact["Phone"]); + select.Where = SqlDml.Like(contact["Phone"], "415%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test047() + { + string nativeSql = "SELECT Phone " + +"FROM AdventureWorks.Person.Contact " + +"WHERE Phone NOT LIKE '415%'"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(contact); + select.Columns.Add(contact["Phone"]); + select.Where = !SqlDml.Like(contact["Phone"], "415%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test048() + { + string nativeSql = "SELECT Phone " + +"FROM Person.Contact " + +"WHERE Phone LIKE '415%' and Phone IS NOT NULL"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(contact); + select.Columns.Add(contact["Phone"]); + select.Where = SqlDml.Like(contact["Phone"], "415%") && SqlDml.IsNotNull(contact["Phone"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test049() + { + #region Like + + string nativeSql = "SELECT Phone " + +"FROM Person.Contact " + +"WHERE Phone LIKE '%5/%%' ESCAPE '/'"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(contact); + select.Columns.Add(contact["Phone"]); + select.Where = SqlDml.Like(contact["Phone"], "%5/%%", '/'); + + #endregion + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test050() + { + string nativeSql = "SELECT ProductID, Name, Color " + +"FROM AdventureWorks.Production.Product " + +"WHERE Color IS NULL"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["Name"], product["Color"]); + select.Where = SqlDml.IsNull(product["Color"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test051() + { + string nativeSql = "SELECT CustomerID, AccountNumber, TerritoryID " + +"FROM AdventureWorks.Sales.Customer " + +"WHERE TerritoryID IN (1, 2, 3) " + +"OR TerritoryID IS NULL"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlSelect select = SqlDml.Select(customer); + select.Columns.AddRange( + customer["CustomerID"], customer["AccountNumber"], customer["TerritoryID"]); + select.Where = SqlDml.In(customer["TerritoryID"], SqlDml.Row(1, 2, 3)) || + SqlDml.IsNull(customer["TerritoryID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test052() + { + string nativeSql = "SELECT CustomerID, AccountNumber, TerritoryID " + +"FROM AdventureWorks.Sales.Customer " + +"WHERE TerritoryID = NULL"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlSelect select = SqlDml.Select(customer); + select.Columns.AddRange( + customer["CustomerID"], customer["AccountNumber"], customer["TerritoryID"]); + select.Where = customer["TerritoryID"]==SqlDml.Null; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test053() + { + string nativeSql = "SELECT CustomerID, Name " + +"FROM AdventureWorks.Sales.Store " + +"WHERE CustomerID LIKE '1%' AND Name LIKE N'Bicycle%'"; + + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); + SqlSelect select = SqlDml.Select(store); + select.Columns.AddRange(store["CustomerID"], store["Name"]); + select.Where = SqlDml.Like(store["CustomerID"], "1%") && SqlDml.Like(store["Name"], "Bicycle%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test054() + { + string nativeSql = "SELECT CustomerID, Name " + +"FROM AdventureWorks.Sales.Store " + +"WHERE CustomerID LIKE '1%' OR Name LIKE N'Bicycle%'"; + + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); + SqlSelect select = SqlDml.Select(store); + select.Columns.AddRange(store["CustomerID"], store["Name"]); + select.Where = SqlDml.Like(store["CustomerID"], "1%") || SqlDml.Like(store["Name"], "Bicycle%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test055() + { + string nativeSql = "SELECT ProductID, ProductModelID " + +"FROM AdventureWorks.Production.Product " + +"WHERE ProductModelID = 20 OR ProductModelID = 21 " + +"AND Color = 'Red'"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); + select.Where = product["ProductModelID"]==20 || + product["ProductModelID"]==21 && product["Color"]=="RED"; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test056() + { + string nativeSql = "SELECT ProductID, ProductModelID " + +"FROM AdventureWorks.Production.Product " + +"WHERE (ProductModelID = 20 OR ProductModelID = 21) " + +"AND Color = 'Red'"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); + select.Where = (product["ProductModelID"]==20 || product["ProductModelID"]==21) && + product["Color"]=="RED"; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test057() + { + string nativeSql = "SELECT ProductID, ProductModelID " + +"FROM AdventureWorks.Production.Product " + +"WHERE ProductModelID = 20 OR (ProductModelID = 21 " + +"AND Color = 'Red')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductID"], product["ProductModelID"]); + select.Where = product["ProductModelID"]==20 || + (product["ProductModelID"]==21 && product["Color"]=="RED"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test058() + { + string nativeSql = "SELECT SalesOrderID, SUM(LineTotal) AS SubTotal " + +"FROM Sales.SalesOrderDetail sod " + +"GROUP BY SalesOrderID " + +"ORDER BY SalesOrderID ;"; + + SqlTableRef sod = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sod"); + SqlSelect select = SqlDml.Select(sod); + select.Columns.Add(sod["SalesOrderID"]); + select.Columns.Add(SqlDml.Sum(sod["LineTotal"]), "SubTotal"); + select.GroupBy.Add(sod["SalesOrderID"]); + select.OrderBy.Add(sod["SalesOrderID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test059() + { + string nativeSql = "SELECT DATEPART(yy, HireDate) AS Year, " + +"COUNT(*) AS NumberOfHires " + +"FROM AdventureWorks.HumanResources.Employee " + +"GROUP BY DATEPART(yy, HireDate)"; + + SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlSelect select = SqlDml.Select(employee); + select.Columns.Add( + SqlDml.Extract(SqlDateTimePart.Year, employee["HireDate"]), "Year"); + select.Columns.Add(SqlDml.Count(), "NumberOfHires"); + select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, employee["HireDate"])); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test060() + { + string nativeSql = "" + + + "SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price', " + +"SUM(LineTotal) AS SubTotal " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID, SpecialOfferID " + +"ORDER BY ProductID"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(salesOrderDetail["SpecialOfferID"]); + select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); + select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "SubTotal"); + select.GroupBy.AddRange(salesOrderDetail["ProductID"], salesOrderDetail["SpecialOfferID"]); + select.OrderBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test061() + { + string nativeSql = "" + + + "SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price', " + +"SUM(LineTotal) AS SubTotal " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID, SpecialOfferID " + +"ORDER BY ProductID"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(salesOrderDetail["SpecialOfferID"]); + select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); + select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "SubTotal"); + select.GroupBy.AddRange(salesOrderDetail["ProductID"], salesOrderDetail["SpecialOfferID"]); + select.OrderBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test062() + { + string nativeSql = "SELECT ProductModelID, AVG(ListPrice) AS 'Average List Price' " + +"FROM Production.Product " + +"WHERE ListPrice > $1000 " + +"GROUP BY ProductModelID " + +"ORDER BY ProductModelID ;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["ProductModelID"]); + select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "Average List Price"); + select.Where = product["ListPrice"]>1000; + select.GroupBy.Add(product["ProductModelID"]); + select.OrderBy.Add(product["ProductModelID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test063() + { + string nativeSql = "" + + + "SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID " + +"HAVING SUM(LineTotal) > $1000000.00 " + +"AND AVG(OrderQty) < 3 ;"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(SqlDml.Avg(salesOrderDetail["OrderQty"]), "AverageQuantity"); + select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); + select.Having = SqlDml.Sum(salesOrderDetail["LineTotal"])>1000000 && + SqlDml.Avg(salesOrderDetail["OrderQty"])<3; + select.GroupBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test064() + { + string nativeSql = "SELECT ProductID, Total = SUM(LineTotal) " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID " + +"HAVING SUM(LineTotal) > $2000000.00 ;"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); + select.Having = SqlDml.Sum(salesOrderDetail["LineTotal"])>2000000; + select.GroupBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test065() + { + string nativeSql = "SELECT ProductID, SUM(LineTotal) AS Total " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID " + +"HAVING COUNT(*) > 1500 ;"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(SqlDml.Sum(salesOrderDetail["LineTotal"]), "Total"); + select.Having = SqlDml.Count()>1500; + select.GroupBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test066() + { + string nativeSql = "SELECT ProductID " + +"FROM Sales.SalesOrderDetail " + +"GROUP BY ProductID " + +"HAVING AVG(OrderQty) > 5 " + +"ORDER BY ProductID ;"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.GroupBy.Add(salesOrderDetail["ProductID"]); + select.Having = SqlDml.Avg(salesOrderDetail["OrderQty"])>5; + select.OrderBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test067() + { + string nativeSql = "SELECT pm.Name, AVG(ListPrice) AS 'Average List Price' " + +"FROM Production.Product AS p " + +"JOIN Production.ProductModel AS pm " + +"ON p.ProductModelID = pm.ProductModelID " + +"GROUP BY pm.Name " + +"HAVING pm.Name LIKE 'Mountain%' " + +"ORDER BY pm.Name ;"; + + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef pm = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductModel"], "pm"); + SqlSelect select = SqlDml.Select(p.InnerJoin(pm, p["ProductModelID"]==pm["ProductModelID"])); + select.Columns.Add(pm["Name"]); + select.Columns.Add(SqlDml.Avg(p["ListPrice"]), "Average List Price"); + select.GroupBy.Add(pm["Name"]); + select.Having = SqlDml.Like(pm["Name"], "Mountain%"); + select.OrderBy.Add(pm["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test068() + { + string nativeSql = "SELECT ProductID, AVG(UnitPrice) AS 'Average Price' " + +"FROM Sales.SalesOrderDetail " + +"WHERE OrderQty > 10 " + +"GROUP BY ProductID " + +"ORDER BY ProductID ;"; + + SqlTableRef salesOrderDetail = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"]); + SqlSelect select = SqlDml.Select(salesOrderDetail); + select.Columns.Add(salesOrderDetail["ProductID"]); + select.Columns.Add(SqlDml.Avg(salesOrderDetail["UnitPrice"]), "Average Price"); + select.Where = salesOrderDetail["OrderQty"]>10; + select.GroupBy.Add(salesOrderDetail["ProductID"]); + select.OrderBy.Add(salesOrderDetail["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test069() + { + string nativeSql = "SELECT Color, AVG (ListPrice) AS 'average list price' " + +"FROM Production.Product " + +"WHERE Color IS NOT NULL " + +"GROUP BY Color " + +"ORDER BY Color"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Color"]); + select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "average list price"); + select.Where = SqlDml.IsNotNull(product["Color"]); + select.GroupBy.Add(product["Color"]); + select.OrderBy.Add(product["Color"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test070() + { + string nativeSql = "SELECT ProductID, ProductSubcategoryID, ListPrice " + +"FROM Production.Product " + +"ORDER BY ProductSubcategoryID DESC, ListPrice"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange( + product["ProductID"], product["ProductSubcategoryID"], product["ListPrice"]); + select.OrderBy.Add(product["ProductSubcategoryID"], false); + select.OrderBy.Add(product["ListPrice"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + [Ignore("")] + public void Test071() + { + string nativeSql = "SELECT LastName FROM Person.Contact " + +"ORDER BY LastName " + +"COLLATE Traditional_Spanish_ci_ai ASC"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(contact); + select.Columns.Add(contact["LastName"]); + select.OrderBy.Add( + SqlDml.Collate(contact["LastName"], Catalog.Schemas["Person"].Collations["Traditional_Spanish_CI_AI"])); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test072() + { + string nativeSql = "SELECT Color, AVG (ListPrice) AS 'average list price' " + +"FROM Production.Product " + +"GROUP BY Color " + +"ORDER BY 'average list price'"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Color"]); + select.Columns.Add(SqlDml.Avg(product["ListPrice"]), "average list price"); + select.GroupBy.Add(product["Color"]); + select.OrderBy.Add(select.Columns["average list price"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test073() + { + string nativeSql = "SELECT Ord.SalesOrderID, Ord.OrderDate, " + +"(SELECT MAX(OrdDet.UnitPrice) " + +"FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet " + + + " WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice " + +"FROM AdventureWorks.Sales.SalesOrderHeader AS Ord"; + + SqlTableRef ordDet = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "OrdDet"); + SqlTableRef ord = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "Ord"); + SqlSelect subSelect = SqlDml.Select(ordDet); + subSelect.Columns.Add(SqlDml.Max(ordDet["UnitPrice"])); + subSelect.Where = ord["SalesOrderID"]==ordDet["SalesOrderID"]; + SqlSelect select = SqlDml.Select(ord); + select.Columns.AddRange(ord["SalesOrderID"], ord["OrderDate"]); + select.Columns.Add(subSelect, "MaxUnitPrice"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test074() + { + string nativeSql = "SELECT Name " + +"FROM AdventureWorks.Production.Product " + +"WHERE ListPrice = " + +"(SELECT ListPrice " + +"FROM AdventureWorks.Production.Product " + +"WHERE Name = 'Chainring Bolts' )"; + + SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(product2["ListPrice"]); + subSelect.Where = product2["Name"]=="Chainring Bolts"; + SqlSelect select = SqlDml.Select(product1); + select.Columns.AddRange(product1["Name"]); + select.Where = product1["ListPrice"]==subSelect; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test075() + { + string nativeSql = "SELECT Prd1. Name " + +"FROM AdventureWorks.Production.Product AS Prd1 " + +"JOIN AdventureWorks.Production.Product AS Prd2 " + +"ON (Prd1.ListPrice = Prd2.ListPrice) " + +"WHERE Prd2. Name = 'Chainring Bolts'"; + + SqlTableRef prd1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd1"); + SqlTableRef prd2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "Prd2"); + SqlSelect select = SqlDml.Select(prd1.InnerJoin(prd2, prd1["ListPrice"]==prd2["ListPrice"])); + select.Columns.Add(prd1["Name"]); + select.Where = prd2["Name"]=="Chainring Bolts"; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test076() + { + string nativeSql = "SELECT Name " + +"FROM Sales.Store " + +"WHERE Sales.Store.CustomerID NOT IN " + +"(SELECT Sales.Customer.CustomerID " + +"FROM Sales.Customer " + +"WHERE TerritoryID = 5)"; + + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlSelect subSelect = SqlDml.Select(customer); + subSelect.Columns.Add(customer["CustomerID"]); + subSelect.Where = customer["TerritoryID"]==5; + SqlSelect select = SqlDml.Select(store); + select.Columns.Add(store["Name"]); + select.Where = SqlDml.NotIn(store["CustomerID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test077() + { + string nativeSql = "SELECT EmployeeID, ManagerID " + +"FROM HumanResources.Employee " + +"WHERE ManagerID IN " + +"(SELECT ManagerID " + +"FROM HumanResources.Employee " + +"WHERE EmployeeID = 12)"; + + SqlTableRef employee1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlTableRef employee2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlSelect subSelect = SqlDml.Select(employee2); + subSelect.Columns.Add(employee2["ManagerID"]); + subSelect.Where = employee2["EmployeeID"]==12; + SqlSelect select = SqlDml.Select(employee1); + select.Columns.AddRange(employee1["EmployeeID"], employee1["ManagerID"]); + select.Where = SqlDml.In(employee1["ManagerID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test078() + { + string nativeSql = "SELECT e1.EmployeeID, e1.ManagerID " + +"FROM HumanResources.Employee AS e1 " + +"INNER JOIN HumanResources.Employee AS e2 " + +"ON e1.ManagerID = e2.ManagerID " + +"AND e2.EmployeeID = 12"; + + SqlTableRef e1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e1"); + SqlTableRef e2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e2"); + SqlSelect select = + SqlDml.Select(e1.InnerJoin(e2, e1["ManagerID"]==e2["ManagerID"] && e2["EmployeeID"]==12)); + select.Columns.AddRange(e1["EmployeeID"], e1["ManagerID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test079() + { + string nativeSql = "SELECT e1.EmployeeID, e1.ManagerID " + +"FROM HumanResources.Employee AS e1 " + +"WHERE e1.ManagerID IN " + +"(SELECT e2.ManagerID " + +"FROM HumanResources.Employee AS e2 " + +"WHERE e2.EmployeeID = 12)"; + + SqlTableRef e1 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e1"); + SqlTableRef e2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e2"); + SqlSelect subSelect = SqlDml.Select(e2); + subSelect.Columns.Add(e2["ManagerID"]); + subSelect.Where = e2["EmployeeID"]==12; + SqlSelect select = SqlDml.Select(e1); + select.Columns.AddRange(e1["EmployeeID"], e1["ManagerID"]); + select.Where = SqlDml.In(e1["ManagerID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test080() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID IN " + +"(SELECT ProductSubcategoryID " + +"FROM Production.ProductSubcategory " + +"WHERE Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); + subSelect.Where = productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test081() + { + string nativeSql = "SELECT p.Name, s.Name " + +"FROM Production.Product p " + +"INNER JOIN Production.ProductSubcategory s " + +"ON p.ProductSubcategoryID = s.ProductSubcategoryID " + +"AND s.Name = 'Wheels'"; + + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"], "s"); + SqlSelect select = + SqlDml.Select( + p.InnerJoin( + s, p["ProductSubcategoryID"]==s["ProductSubcategoryID"] && s["Name"]=="Wheels")); + select.Columns.AddRange(p["Name"], s["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test082() + { + string nativeSql = "SELECT Name " + +"FROM Purchasing.Vendor " + +"WHERE CreditRating = 1 " + +"AND VendorID IN " + +"(SELECT VendorID " + +"FROM Purchasing.ProductVendor " + +"WHERE MinOrderQty >= 20 " + +"AND AverageLeadTime < 16)"; + + SqlTableRef vendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); + SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); + SqlSelect subSelect = SqlDml.Select(productVendor); + subSelect.Columns.Add(productVendor["VendorID"]); + subSelect.Where = productVendor["MinOrderQty"]>=20 && productVendor["AverageLeadTime"]<16; + SqlSelect select = SqlDml.Select(vendor); + select.Columns.Add(vendor["Name"]); + select.Where = vendor["CreditRating"]==1 && + SqlDml.In(vendor["VendorID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test083() + { + string nativeSql = "SELECT DISTINCT Name " + +"FROM Purchasing.Vendor v " + +"INNER JOIN Purchasing.ProductVendor p " + +"ON v.VendorID = p.VendorID " + +"WHERE CreditRating = 1 " + +"AND MinOrderQty >= 20 " + +"AND OnOrderQty IS NULL"; + + SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p"); + SqlSelect select = SqlDml.Select(v.InnerJoin(p, v["VendorID"]==p["VendorID"])); + select.Distinct = true; + select.Columns.Add(v["Name"]); + select.Where = v["CreditRating"]==1 && p["MinOrderQty"]>=20 && SqlDml.IsNull(p["OnOrderQty"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test084() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID NOT IN " + +"(SELECT ProductSubcategoryID " + +"FROM Production.Product " + +"WHERE Name = 'Mountain Bikes' " + +"OR Name = 'Road Bikes' " + +"OR Name = 'Touring Bikes')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(product2["ProductSubcategoryID"]); + subSelect.Where = product2["Name"]=="Mountain Bikes" || product2["Name"]=="Road Bikes" || + product2["Name"]=="Touring Bikes"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = SqlDml.NotIn(product["ProductSubcategoryID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test085() + { + string nativeSql = "UPDATE Production.Product " + +"SET ListPrice = ListPrice * 2 " + +"WHERE ProductID IN " + +"(SELECT ProductID " + +"FROM Purchasing.ProductVendor " + +"WHERE VendorID = 51);"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); + SqlSelect subSelect = SqlDml.Select(productVendor); + subSelect.Columns.Add(productVendor["ProductID"]); + subSelect.Where = productVendor["VendorID"]==51; + SqlUpdate update = SqlDml.Update(product); + update.Values[product["ListPrice"]] = product["ListPrice"]*2; + update.Where = SqlDml.In(product["ProductID"], subSelect); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test086() + { + string nativeSql = "UPDATE Production.Product " + +"SET ListPrice = ListPrice * 2 " + +"FROM Production.Product AS p " + +"INNER JOIN Purchasing.ProductVendor AS pv " + +"ON p.ProductID = pv.ProductID AND pv.VendorID = 51;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); + + SqlUpdate update = SqlDml.Update(product); + update.Values[product["ListPrice"]] = p["ListPrice"]*2; + update.From = p.InnerJoin(pv, p["ProductID"]==pv["ProductID"] && pv["VendorID"]==51); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test087() + { + string nativeSql = "SELECT CustomerID " + +"FROM Sales.Customer " + +"WHERE TerritoryID = " + +"(SELECT TerritoryID " + +"FROM Sales.SalesPerson " + +"WHERE SalesPersonID = 276)"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlSelect subSelect = SqlDml.Select(salesPerson); + subSelect.Columns.Add(salesPerson["TerritoryID"]); + subSelect.Where = salesPerson["SalesPersonID"]==276; + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["CustomerID"]); + select.Where = customer["TerritoryID"]==subSelect; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test088() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ListPrice > " + +"(SELECT AVG (ListPrice) " + +"FROM Production.Product)"; + + SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(SqlDml.Avg(product2["ListPrice"])); + SqlSelect select = SqlDml.Select(product1); + select.Columns.Add(product1["Name"]); + select.Where = product1["ListPrice"]>subSelect; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test089() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ListPrice > " + +"(SELECT MIN (ListPrice) " + +"FROM Production.Product " + +"GROUP BY ProductSubcategoryID " + +"HAVING ProductSubcategoryID = 14)"; + + SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(SqlDml.Min(product2["ListPrice"])); + subSelect.GroupBy.Add(product2["ProductSubcategoryID"]); + subSelect.Having = product2["ProductSubcategoryID"]==14; + SqlSelect select = SqlDml.Select(product1); + select.Columns.Add(product1["Name"]); + select.Where = product1["ListPrice"]>subSelect; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test090() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ListPrice >= ANY " + +"(SELECT MAX (ListPrice) " + +"FROM Production.Product " + +"GROUP BY ProductSubcategoryID)"; + + SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(SqlDml.Max(product2["ListPrice"])); + subSelect.GroupBy.Add(product2["ProductSubcategoryID"]); + SqlSelect select = SqlDml.Select(product1); + select.Columns.Add(product1["Name"]); + select.Where = product1["ListPrice"]>=SqlDml.Any(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test091() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID=ANY " + +"(SELECT ProductSubcategoryID " + +"FROM Production.ProductSubcategory " + +"WHERE Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); + subSelect.Where = productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = product["ProductSubcategoryID"]==SqlDml.Any(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test092() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID IN " + +"(SELECT ProductSubcategoryID " + +"FROM Production.ProductSubcategory " + +"WHERE Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); + subSelect.Where = productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test093() + { + string nativeSql = "SELECT CustomerID " + +"FROM Sales.Customer " + +"WHERE TerritoryID <> ANY " + +"(SELECT TerritoryID " + +"FROM Sales.SalesPerson)"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Customer"]); + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlSelect subSelect = SqlDml.Select(salesPerson); + subSelect.Columns.Add(salesPerson["TerritoryID"]); + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["CustomerID"]); + select.Where = customer["TerritoryID"]!=SqlDml.Any(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test094() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE EXISTS " + +"(SELECT * " + +"FROM Production.ProductSubcategory " + +"WHERE ProductSubcategoryID = " + +"Production.Product.ProductSubcategoryID " + +"AND Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory.Asterisk); + subSelect.Where = productSubcategory["ProductSubcategoryID"]==product["ProductSubcategoryID"]; + subSelect.Where = subSelect.Where && productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = SqlDml.Exists(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test095() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID IN " + +"(SELECT ProductSubcategoryID " + +"FROM Production.ProductSubcategory " + +"WHERE Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory["ProductSubcategoryID"]); + subSelect.Where = productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = SqlDml.In(product["ProductSubcategoryID"], subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test096() + { + string nativeSql = "SELECT Name " + +"FROM Production.Product " + +"WHERE NOT EXISTS " + +"(SELECT * " + +"FROM Production.ProductSubcategory " + +"WHERE ProductSubcategoryID = " + +"Production.Product.ProductSubcategoryID " + +"AND Name = 'Wheels')"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef productSubcategory = + SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"]); + SqlSelect subSelect = SqlDml.Select(productSubcategory); + subSelect.Columns.Add(productSubcategory.Asterisk); + subSelect.Where = productSubcategory["ProductSubcategoryID"]==product["ProductSubcategoryID"]; + subSelect.Where = subSelect.Where && productSubcategory["Name"]=="Wheels"; + SqlSelect select = SqlDml.Select(product); + select.Columns.Add(product["Name"]); + select.Where = !SqlDml.Exists(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test097() + { + string nativeSql = "SELECT Name, ListPrice, " + +"(SELECT AVG(ListPrice) FROM Production.Product) AS Average, " + + + " ListPrice - (SELECT AVG(ListPrice) FROM Production.Product) " + +"AS Difference " + +"FROM Production.Product " + +"WHERE ProductSubcategoryID = 1"; + + SqlTableRef product1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef product2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlSelect subSelect = SqlDml.Select(product2); + subSelect.Columns.Add(SqlDml.Avg(product2["ListPrice"])); + SqlSelect select = SqlDml.Select(product1); + select.Columns.AddRange(product1["Name"], product1["ListPrice"]); + select.Columns.Add(subSelect, "Average"); + select.Columns.Add(product1["ListPrice"]-subSelect, "Difference"); + select.Where = product1["ProductSubcategoryID"]==1; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test098() + { + string nativeSql = "SELECT LastName, FirstName " + +"FROM Person.Contact " + +"WHERE ContactID IN " + +"(SELECT ContactID " + +"FROM HumanResources.Employee " + +"WHERE EmployeeID IN " + +"(SELECT SalesPersonID " + +"FROM Sales.SalesPerson))"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlSelect subSelect2 = SqlDml.Select(salesPerson); + subSelect2.Columns.Add(salesPerson["SalesPersonID"]); + SqlSelect subSelect1 = SqlDml.Select(employee); + subSelect1.Columns.Add(employee["ContactID"]); + subSelect1.Where = SqlDml.In(employee["EmployeeID"], subSelect2); + SqlSelect select = SqlDml.Select(contact); + select.Columns.AddRange(contact["LastName"], contact["FirstName"]); + select.Where = SqlDml.In(contact["ContactID"], subSelect1); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test099() + { + string nativeSql = "SELECT LastName, FirstName " + +"FROM Person.Contact c " + +"INNER JOIN HumanResources.Employee e " + +"ON c.ContactID = e.ContactID " + +"JOIN Sales.SalesPerson s " + +"ON e.EmployeeID = s.SalesPersonID"; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "s"); + SqlSelect select = SqlDml.Select(c); + select.From = select.From.InnerJoin(e, c["ContactID"]==e["ContactID"]); + select.From = select.From.InnerJoin(s, e["EmployeeID"]==s["SalesPersonID"]); + select.Columns.AddRange(c["LastName"], c["FirstName"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test100() + { + string nativeSql = "SELECT DISTINCT c.LastName, c.FirstName " + +"FROM Person.Contact c JOIN HumanResources.Employee e " + +"ON e.ContactID = c.ContactID " + +"WHERE 5000.00 IN " + +"(SELECT Bonus " + +"FROM Sales.SalesPerson sp " + +"WHERE e.EmployeeID = sp.SalesPersonID);"; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); + SqlSelect subSelect = SqlDml.Select(sp); + subSelect.Columns.Add(sp["Bonus"]); + subSelect.Where = e["EmployeeID"]==sp["SalesPersonID"]; + SqlSelect select = SqlDml.Select(c.InnerJoin(e, c["ContactID"]==e["ContactID"])); + select.Distinct = true; + select.Columns.AddRange(c["LastName"], c["FirstName"]); + select.Where = SqlDml.In(5000.00, subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test101() + { + string nativeSql = "SELECT LastName, FirstName " + +"FROM Person.Contact c JOIN HumanResources.Employee e " + +"ON e.ContactID = c.ContactID " + +"WHERE 5000 IN (5000)"; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlSelect select = SqlDml.Select(c.InnerJoin(e, c["ContactID"]==e["ContactID"])); + select.Columns.AddRange(c["LastName"], c["FirstName"]); + select.Where = SqlDml.In(5000, SqlDml.Row(5000)); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test102() + { + string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " + +"FROM Purchasing.ProductVendor pv1 " + +"WHERE ProductID IN " + +"(SELECT pv2.ProductID " + +"FROM Purchasing.ProductVendor pv2 " + +"WHERE pv1.VendorID <> pv2.VendorID) " + +"ORDER BY pv1.VendorID"; + + SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); + SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); + SqlSelect subSelect = SqlDml.Select(pv2); + subSelect.Columns.Add(pv2["ProductID"]); + subSelect.Where = pv1["VendorID"]!=pv2["VendorID"]; + SqlSelect select = SqlDml.Select(pv1); + select.Distinct = true; + select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); + select.Where = SqlDml.In(pv1["ProductID"], subSelect); + select.OrderBy.Add(pv1["VendorID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test103() + { + string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " + +"FROM Purchasing.ProductVendor pv1 " + +"INNER JOIN Purchasing.ProductVendor pv2 " + +"ON pv1.ProductID = pv2.ProductID " + +"AND pv1.VendorID <> pv2.VendorID " + +"ORDER BY pv1.VendorID"; + + SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); + SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); + SqlSelect select = + SqlDml.Select( + pv1.InnerJoin(pv2, pv1["ProductID"]==pv2["ProductID"] && pv1["VendorID"]!=pv2["VendorID"])); + select.Distinct = true; + select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); + select.OrderBy.Add(pv1["VendorID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test104() + { + string nativeSql = "SELECT ProductID, OrderQty " + +"FROM Sales.SalesOrderDetail s1 " + +"WHERE s1.OrderQty < " + +"(SELECT AVG (s2.OrderQty) " + +"FROM Sales.SalesOrderDetail s2 " + +"WHERE s2.ProductID = s1.ProductID)"; + + SqlTableRef s1 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "s1"); + SqlTableRef s2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "s2"); + SqlSelect subSelect = SqlDml.Select(s2); + subSelect.Columns.Add(SqlDml.Avg(s2["OrderQty"])); + subSelect.Where = s2["ProductID"]==s1["ProductID"]; + SqlSelect select = SqlDml.Select(s1); + select.Columns.AddRange(s1["ProductID"], s1["OrderQty"]); + select.Where = s1["OrderQty"] " + +"(SELECT AVG (p2.ListPrice) " + +"FROM Production.Product p2 " + +"WHERE p1.ProductSubcategoryID = p2.ProductSubcategoryID)"; + + SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); + SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); + SqlSelect subSelect = SqlDml.Select(p2); + subSelect.Columns.Add(SqlDml.Avg(p2["ListPrice"])); + subSelect.Where = p2["ProductSubcategoryID"]==p1["ProductSubcategoryID"]; + SqlSelect select = SqlDml.Select(p1); + select.Columns.AddRange(p1["ProductSubcategoryID"], p1["Name"]); + select.Where = p1["ListPrice"]>subSelect; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test106() + { + string nativeSql = "SELECT p1.ProductModelID " + +"FROM Production.Product p1 " + +"GROUP BY p1.ProductModelID " + +"HAVING MAX(p1.ListPrice) >= ALL " + +"(SELECT 2 * AVG(p2.ListPrice) " + +"FROM Production.Product p2 " + +"WHERE p1.ProductModelID = p2.ProductModelID) ;"; + + SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); + SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); + SqlSelect subSelect = SqlDml.Select(p2); + subSelect.Columns.Add(2*SqlDml.Avg(p2["ListPrice"])); + subSelect.Where = p2["ProductModelID"]==p1["ProductModelID"]; + SqlSelect select = SqlDml.Select(p1); + select.Columns.Add(p1["ProductModelID"]); + select.GroupBy.Add(p1["ProductModelID"]); + select.Having = SqlDml.Max(p1["ListPrice"])>=SqlDml.All(subSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test107() + { + string nativeSql = "SELECT ProductID, Purchasing.Vendor.VendorID, Name " + +"FROM Purchasing.ProductVendor JOIN Purchasing.Vendor " + + + " ON (Purchasing.ProductVendor.VendorID = Purchasing.Vendor.VendorID) " + +"WHERE StandardPrice > $10 " + +"AND Name LIKE N'F%'"; + + SqlTableRef productVendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"]); + SqlTableRef vendor = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); + SqlSelect select = + SqlDml.Select(productVendor.InnerJoin(vendor, productVendor["VendorID"]==vendor["VendorID"])); + select.Columns.AddRange(productVendor["ProductID"], vendor["VendorID"], vendor["Name"]); + select.Where = productVendor["StandardPrice"]>10 && SqlDml.Like(vendor["Name"], "F%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test108() + { + string nativeSql = "SELECT pv.ProductID, v.VendorID, v.Name " + +"FROM Purchasing.ProductVendor pv JOIN Purchasing.Vendor v " + +"ON (pv.VendorID = v.VendorID) " + +"WHERE StandardPrice > $10 " + +"AND Name LIKE N'F%'"; + + SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); + SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); + SqlSelect select = SqlDml.Select(pv.InnerJoin(v, pv["VendorID"]==v["VendorID"])); + select.Columns.AddRange(pv["ProductID"], v["VendorID"], v["Name"]); + select.Where = pv["StandardPrice"]>10 && SqlDml.Like(v["Name"], "F%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test109() + { + string nativeSql = "SELECT pv.ProductID, v.VendorID, v.Name " + +"FROM Purchasing.ProductVendor pv, Purchasing.Vendor v " + +"WHERE pv.VendorID = v.VendorID " + +"AND StandardPrice > $10 " + +"AND Name LIKE N'F%'"; + + SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); + SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); + SqlSelect select = SqlDml.Select(pv.CrossJoin(v)); + select.Columns.AddRange(pv["ProductID"], v["VendorID"], v["Name"]); + select.Where = pv["VendorID"]==v["VendorID"] && pv["StandardPrice"]>10 && + SqlDml.Like(v["Name"], "F%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test110() + { + string nativeSql = "SELECT e.EmployeeID " + +"FROM HumanResources.Employee AS e " + +"INNER JOIN Sales.SalesPerson AS s " + +"ON e.EmployeeID = s.SalesPersonID"; + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "s"); + SqlSelect select = SqlDml.Select(e.InnerJoin(s, e["EmployeeID"]==s["SalesPersonID"])); + select.Columns.Add(e["EmployeeID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test111() + { + string nativeSql = "SELECT * " + +"FROM HumanResources.Employee AS e " + +"INNER JOIN Person.Contact AS c " + +"ON e.ContactID = c.ContactID " + +"ORDER BY c.LastName"; + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"], "c"); + SqlSelect select = SqlDml.Select(e.InnerJoin(c, e["ContactID"]==c["ContactID"])); + select.Columns.Add(SqlDml.Asterisk); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test112() + { + string nativeSql = "" + + + "SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price' " + +"FROM Sales.SalesOrderDetail AS sd " + +"JOIN Production.Product AS p " + + + " ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice " + +"WHERE p.ProductID = 718;"; + + SqlTableRef sd = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sd"); + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlSelect select = + SqlDml.Select( + sd.InnerJoin(p, sd["ProductID"]==p["ProductID"] && sd["UnitPrice"] p2.ListPrice " + +"WHERE p1.ListPrice < $15 AND p2.ListPrice < $15 " + +"ORDER BY ProductSubcategoryID;"; + + SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p1"); + SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p2"); + SqlSelect select = + SqlDml.Select( + p1.InnerJoin( + p2, + p1["ProductSubcategoryID"]==p2["ProductSubcategoryID"] && + p1["ListPrice"]!=p2["ListPrice"])); + select.Distinct = true; + select.Columns.AddRange(p1["ProductSubcategoryID"], p1["ListPrice"]); + select.Where = p1["ListPrice"]<15 && p2["ListPrice"]<15; + select.OrderBy.Add(p1["ProductSubcategoryID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test114() + { + string nativeSql = "SELECT DISTINCT p1.VendorID, p1.ProductID " + +"FROM Purchasing.ProductVendor p1 " + +"INNER JOIN Purchasing.ProductVendor p2 " + +"ON p1.ProductID = p2.ProductID " + +"WHERE p1.VendorID <> p2.VendorID " + +"ORDER BY p1.VendorID"; + + SqlTableRef p1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p1"); + SqlTableRef p2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "p2"); + SqlSelect select = SqlDml.Select(p1.InnerJoin(p2, p1["ProductID"]==p2["ProductID"])); + select.Distinct = true; + select.Columns.AddRange(p1["VendorID"], p1["ProductID"]); + select.Where = p1["VendorID"]!=p2["VendorID"]; + select.OrderBy.Add(p1["VendorID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test115() + { + string nativeSql = "SELECT p.Name, pr.ProductReviewID " + +"FROM Production.Product p " + +"LEFT OUTER JOIN Production.ProductReview pr " + +"ON p.ProductID = pr.ProductID"; + + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef pr = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductReview"], "pr"); + SqlSelect select = SqlDml.Select(p.LeftOuterJoin(pr, p["ProductID"]==pr["ProductID"])); + select.Columns.AddRange(p["Name"], pr["ProductReviewID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test116() + { + string nativeSql = "SELECT st.Name AS Territory, sp.SalesPersonID " + +"FROM Sales.SalesTerritory st " + +"RIGHT OUTER JOIN Sales.SalesPerson sp " + +"ON st.TerritoryID = sp.TerritoryID ;"; + + SqlTableRef st = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesTerritory"], "st"); + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); + SqlSelect select = SqlDml.Select(st.RightOuterJoin(sp, st["TerritoryID"]==sp["TerritoryID"])); + select.Columns.Add(st["Name"], "Territory"); + select.Columns.Add(sp["SalesPersonID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test117() + { + string nativeSql = "SELECT st.Name AS Territory, sp.SalesPersonID " + +"FROM Sales.SalesTerritory st " + +"RIGHT OUTER JOIN Sales.SalesPerson sp " + +"ON st.TerritoryID = sp.TerritoryID " + +"WHERE st.SalesYTD < $2000000;"; + + SqlTableRef st = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesTerritory"], "st"); + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); + SqlSelect select = SqlDml.Select(st.RightOuterJoin(sp, st["TerritoryID"]==sp["TerritoryID"])); + select.Columns.Add(st["Name"], "Territory"); + select.Columns.Add(sp["SalesPersonID"]); + select.Where = st["SalesYTD"]<2000000; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test118() + { + string nativeSql = "SELECT p.Name, sod.SalesOrderID " + +"FROM Production.Product p " + +"FULL OUTER JOIN Sales.SalesOrderDetail sod " + +"ON p.ProductID = sod.ProductID " + +"WHERE p.ProductID IS NULL " + +"OR sod.ProductID IS NULL " + +"ORDER BY p.Name ;"; + + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef sod = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderDetail"], "sod"); + SqlSelect select = SqlDml.Select(p.FullOuterJoin(sod, p["ProductID"]==sod["ProductID"])); + select.Columns.AddRange(p["Name"], sod["SalesOrderID"]); + select.Where = SqlDml.IsNull(p["ProductID"]) || SqlDml.IsNull(sod["ProductID"]); + select.OrderBy.Add(p["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test119() + { + string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " + +"FROM HumanResources.Employee e " + +"CROSS JOIN HumanResources.Department d " + +"ORDER BY e.EmployeeID, d.Name ;"; + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); + SqlSelect select = SqlDml.Select(e.CrossJoin(d)); + select.Columns.Add(e["EmployeeID"]); + select.Columns.Add(d["Name"], "Department"); + select.OrderBy.Add(e["EmployeeID"]); + select.OrderBy.Add(d["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + [Ignore("Invalid column")] + public void Test120() + { + string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " + +"FROM HumanResources.Employee e " + +"CROSS JOIN HumanResources.Department d " + +"WHERE e.DepartmentID = d.DepartmentID " + +"ORDER BY e.EmployeeID, d.Name ;"; + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); + SqlSelect select = SqlDml.Select(e.CrossJoin(d)); + select.Columns.Add(e["EmployeeID"]); + select.Columns.Add(d["Name"], "Department"); + select.Where = e["DepartmentID"]==d["DepartmentID"]; + select.OrderBy.Add(e["EmployeeID"]); + select.OrderBy.Add(d["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + [Ignore("Invalid column")] + public void Test121() + { + string nativeSql = "SELECT e.EmployeeID, d.Name AS Department " + +"FROM HumanResources.Employee e " + +"INNER JOIN HumanResources.Department d " + +"ON e.DepartmentID = d.DepartmentID " + +"ORDER BY e.EmployeeID, d.Name ;"; + + SqlTableRef e = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"], "e"); + SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"], "d"); + SqlSelect select = SqlDml.Select(e.InnerJoin(d, e["DepartmentID"]==d["DepartmentID"])); + select.Columns.Add(e["EmployeeID"]); + select.Columns.Add(d["Name"], "Department"); + select.OrderBy.Add(e["EmployeeID"]); + select.OrderBy.Add(d["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test122() + { + string nativeSql = "SELECT DISTINCT pv1.ProductID, pv1.VendorID " + +"FROM Purchasing.ProductVendor pv1 " + +"INNER JOIN Purchasing.ProductVendor pv2 " + +"ON pv1.ProductID = pv2.ProductID " + +"AND pv1.VendorID <> pv2.VendorID " + +"ORDER BY pv1.ProductID"; + + SqlTableRef pv1 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv1"); + SqlTableRef pv2 = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv2"); + SqlSelect select = + SqlDml.Select( + pv1.InnerJoin(pv2, pv1["ProductID"]==pv2["ProductID"] && pv1["VendorID"]!=pv2["VendorID"])); + select.Distinct = true; + select.Columns.AddRange(pv1["ProductID"], pv1["VendorID"]); + select.OrderBy.Add(pv1["ProductID"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test123() + { + string nativeSql = "SELECT p.Name, v.Name " + +"FROM Production.Product p " + +"JOIN Purchasing.ProductVendor pv " + +"ON p.ProductID = pv.ProductID " + +"JOIN Purchasing.Vendor v " + +"ON pv.VendorID = v.VendorID " + +"WHERE ProductSubcategoryID = 15 " + +"ORDER BY v.Name"; + + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); + SqlTableRef v = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"], "v"); + SqlSelect select = + SqlDml.Select( + p.InnerJoin(pv, p["ProductID"]==pv["ProductID"]).InnerJoin( + v, pv["VendorID"]==v["VendorID"])); + select.Columns.AddRange(p["Name"], v["Name"]); + select.Where = p["ProductSubcategoryID"]==15; + select.OrderBy.Add(v["Name"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test124() + { + string nativeSql = "INSERT INTO Production.UnitMeasure " + +"VALUES (N'F2', N'Square Feet', GETDATE());"; + + SqlTableRef unitMeasure = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["UnitMeasure"]); + SqlInsert insert = SqlDml.Insert(unitMeasure); + insert.Values[unitMeasure[0]] = "F2"; + insert.Values[unitMeasure[1]] = "Square Feet"; + insert.Values[unitMeasure[2]] = SqlDml.CurrentDate(); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, insert)); + } + + [Test] + public void Test125() + { + string nativeSql = "UPDATE AdventureWorks.Production.Product " + +"SET ListPrice = ListPrice * 1.1 " + +"WHERE ProductModelID = 37;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlUpdate update = SqlDml.Update(product); + update.Values[product["ListPrice"]] = product["ListPrice"]*1.1; + update.Where = product["ProductModelID"]==37; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test126() + { + string nativeSql = "UPDATE Person.Address " + +"SET PostalCode = '98000' " + +"WHERE City = 'Bothell';"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"]); + SqlUpdate update = SqlDml.Update(product); + update.Values[product["PostalCode"]] = "98000"; + update.Where = product["City"]=="Bothell"; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test127() + { + string nativeSql = "UPDATE Sales.SalesPerson " + +"SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlUpdate update = SqlDml.Update(product); + update.Values[product["Bonus"]] = 6000; + update.Values[product["CommissionPct"]] = .10; + update.Values[product["SalesQuota"]] = SqlDml.Null; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test128() + { + string nativeSql = "UPDATE Production.Product " + +"SET ListPrice = ListPrice * 2;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlUpdate update = SqlDml.Update(product); + update.Values[product["ListPrice"]] = product["ListPrice"]*2; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test129() + { + string nativeSql = "UPDATE Sales.SalesPerson " + +"SET SalesYTD = SalesYTD + " + +"(SELECT SUM(so.SubTotal) " + +"FROM Sales.SalesOrderHeader AS so " + +"WHERE so.OrderDate = (SELECT MAX(OrderDate) " + +"FROM Sales.SalesOrderHeader AS so2 " + +"WHERE so2.SalesPersonID = " + +"so.SalesPersonID) " + +"AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID " + +"GROUP BY so.SalesPersonID);"; + + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); + SqlTableRef so2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so2"); + SqlSelect subSelect = SqlDml.Select(so2); + subSelect.Columns.Add(SqlDml.Max(so2["OrderDate"])); + subSelect.Where = so2["SalesPersonID"]==so["SalesPersonID"]; + SqlSelect select = SqlDml.Select(so); + select.Columns.Add(SqlDml.Sum(so["SubTotal"])); + select.Where = so["OrderDate"]==subSelect && salesPerson["SalesPersonID"]==so["SalesPersonID"]; + select.GroupBy.Add(so["SalesPersonID"]); + SqlUpdate update = SqlDml.Update(salesPerson); + update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]+select; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test130() + { + string nativeSql = "UPDATE AdventureWorks.Sales.SalesReason " + +"SET Name = N'Unknown' " + +"WHERE Name = N'Other';"; + + SqlTableRef salesReason = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesReason"]); + SqlUpdate update = SqlDml.Update(salesReason); + update.Values[salesReason["Name"]] = "Unknown"; + update.Where = salesReason["Name"]=="Other"; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test131() + { + string nativeSql = "UPDATE Sales.SalesPerson " + +"SET SalesYTD = SalesYTD + SubTotal " + +"FROM Sales.SalesPerson AS sp " + +"JOIN Sales.SalesOrderHeader AS so " + +"ON sp.SalesPersonID = so.SalesPersonID " + +"AND so.OrderDate = (SELECT MAX(OrderDate) " + +"FROM Sales.SalesOrderHeader " + +"WHERE SalesPersonID = " + +"sp.SalesPersonID);"; + + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlTableRef salesOrderHeader = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"]); + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"], "sp"); + SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); + SqlSelect subSelect = SqlDml.Select(salesOrderHeader); + subSelect.Columns.Add(SqlDml.Max(salesOrderHeader["OrderDate"])); + subSelect.Where = salesOrderHeader["SalesPersonID"]==sp["SalesPersonID"]; + SqlSelect select = + SqlDml.Select( + sp.InnerJoin(so, sp["SalesPersonID"]==so["SalesPersonID"] && so["OrderDate"]==subSelect)); + SqlUpdate update = SqlDml.Update(salesPerson); + update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test132() + { + string nativeSql = "UPDATE Sales.SalesPerson " + +"SET SalesYTD = SalesYTD + " + +"(SELECT SUM(so.SubTotal) " + +"FROM Sales.SalesOrderHeader AS so " + +"WHERE so.OrderDate = (SELECT MAX(OrderDate) " + +"FROM Sales.SalesOrderHeader AS so2 " + +"WHERE so2.SalesPersonID = " + +"so.SalesPersonID) " + +"AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID " + +"GROUP BY so.SalesPersonID);"; + + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlTableRef so2 = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so2"); + SqlTableRef so = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesOrderHeader"], "so"); + SqlSelect subSelect = SqlDml.Select(so2); + subSelect.Columns.Add(SqlDml.Max(so2["OrderDate"])); + subSelect.Where = so2["SalesPersonID"]==so["SalesPersonID"]; + SqlSelect select = SqlDml.Select(so); + select.Columns.Add(SqlDml.Sum(so["SubTotal"])); + select.Where = so["OrderDate"]==subSelect && salesPerson["SalesPersonID"]==so["SalesPersonID"]; + select.GroupBy.Add(so["SalesPersonID"]); + SqlUpdate update = SqlDml.Update(salesPerson); + update.Values[salesPerson["SalesYTD"]] = salesPerson["SalesYTD"]+select; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test133() + { + string nativeSql = "UPDATE Sales.Store " + + "SET SalesPersonID = 276 " + + "WHERE SalesPersonID = 275;"; + + SqlTableRef store = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"]); + SqlUpdate update = SqlDml.Update(store); + update.Values[store["SalesPersonID"]] = 276; + update.Where = store["SalesPersonID"]==275; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test134() + { + string nativeSql = "UPDATE HumanResources.Employee " + +"SET VacationHours = VacationHours + 8 " + +"FROM (SELECT TOP 10 EmployeeID FROM HumanResources.Employee " + +"ORDER BY HireDate ASC) AS th " + +"WHERE HumanResources.Employee.EmployeeID = th.EmployeeID;"; + + SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlTableRef employee2 = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + + SqlSelect select = SqlDml.Select(employee); + select.Limit = 10; + select.Columns.Add(employee["EmployeeID"]); + select.OrderBy.Add(employee["HireDate"]); + SqlQueryRef th = SqlDml.QueryRef(select, "th"); + + SqlUpdate update = SqlDml.Update(employee2); + update.Values[employee2["VacationHours"]] = employee2["VacationHours"]+8; + update.From = th; + update.Where = employee2["EmployeeID"]==th["EmployeeID"]; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test135() + { + string nativeSql = "DELETE FROM Sales.SalesPersonQuotaHistory " + +"WHERE SalesPersonID IN " + +"(SELECT SalesPersonID " + +"FROM Sales.SalesPerson " + +"WHERE SalesYTD > 2500000.00);"; + + SqlTableRef salesPersonQuotaHistory = + SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPersonQuotaHistory"]); + SqlTableRef salesPerson = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlSelect subSelect = SqlDml.Select(salesPerson); + subSelect.Columns.Add(salesPerson["SalesPersonID"]); + subSelect.Where = salesPerson["SalesYTD"]>2500000.00; + SqlDelete delete = SqlDml.Delete(salesPersonQuotaHistory); + delete.Where = SqlDml.In(salesPersonQuotaHistory["SalesPersonID"], subSelect); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); + } + + [Test] + public void Test136() + { + string nativeSql = "DELETE FROM Sales.SalesPersonQuotaHistory " + +"WHERE SalesPersonID IN " + +"(SELECT SalesPersonID " + +"FROM Sales.SalesPerson " + +"WHERE SalesYTD > 2500000.00);"; + + SqlTableRef salesPersonQuotaHistory = + SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPersonQuotaHistory"]); + + SqlTableRef sp = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SalesPerson"]); + SqlSelect subSelect = SqlDml.Select(sp); + subSelect.Columns.Add(sp["SalesPersonID"]); + subSelect.Where = sp["SalesYTD"]>2500000.00; + + SqlDelete delete = SqlDml.Delete(salesPersonQuotaHistory); + delete.Where = SqlDml.In(salesPersonQuotaHistory["SalesPersonID"], subSelect); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); + } + + [Test] + public void Test137() + { + string nativeSql = "DELETE FROM Purchasing.PurchaseOrderDetail " + +"WHERE PurchaseOrderDetailID IN " + +"(SELECT TOP 10 PurchaseOrderDetailID " + +"FROM Purchasing.PurchaseOrderDetail " + +"ORDER BY DueDate ASC);"; + + SqlTableRef purchaseOrderDetail1 = + SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); + SqlTableRef purchaseOrderDetail2 = + SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); + SqlSelect select = SqlDml.Select(purchaseOrderDetail2); + select.Limit = 10; + select.Columns.Add(purchaseOrderDetail2["PurchaseOrderDetailID"]); + select.OrderBy.Add(purchaseOrderDetail2["DueDate"]); + SqlDelete delete = SqlDml.Delete(purchaseOrderDetail1); + delete.Where = SqlDml.In(purchaseOrderDetail1["PurchaseOrderDetailID"], select); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); + } + + [Test] + public void Test138() + { + string nativeSql = "DECLARE @EmpIDVar int; " + +"SET @EmpIDVar = 1234; " + +"SELECT * " + +"FROM HumanResources.Employee " + +"WHERE EmployeeID = @EmpIDVar;"; + + SqlTableRef employee = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Employee"]); + SqlVariable empIDVar = SqlDml.Variable("EmpIDVar", SqlType.Int32); + SqlBatch batch = SqlDml.Batch(); + batch.Add(empIDVar.Declare()); + batch.Add(SqlDml.Assign(empIDVar, 1234)); + SqlSelect select = SqlDml.Select(employee); + select.Columns.Add(employee.Asterisk); + select.Where = employee["EmployeeID"]==empIDVar; + batch.Add(select); + + Console.Write(Compile(batch)); + } + + [Test] + public void Test139() + { + string nativeSql = "SELECT Name, " + +"CASE Name " + +"WHEN 'Human Resources' THEN 'HR' " + +"WHEN 'Finance' THEN 'FI' " + +"WHEN 'Information Services' THEN 'IS' " + +"WHEN 'Executive' THEN 'EX' " + +"WHEN 'Facilities and Maintenance' THEN 'FM' " + +"END AS Abbreviation " + +"FROM AdventureWorks.HumanResources.Department " + +"WHERE GroupName = 'Executive General and Administration'"; + + SqlTableRef department = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["Department"]); + SqlCase c = SqlDml.Case(department["Name"]); + c.Add("Human Resources", "HR").Add("Finance", "FI").Add("Information Services", "IS").Add("Executive", "EX"); + c["Facilities and Maintenance"] = "FM"; + SqlSelect select = SqlDml.Select(department); + select.Columns.AddRange(department["Name"]); + select.Columns.Add(c, "Abbreviation"); + select.Where = department["GroupName"]=="Executive General and Administration"; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test140() + { + string nativeSql = "SELECT ProductNumber, Category = " + +"CASE ProductLine " + +"WHEN 'R' THEN 'Road' " + +"WHEN 'M' THEN 'Mountain' " + +"WHEN 'T' THEN 'Touring' " + +"WHEN 'S' THEN 'Other sale items' " + +"ELSE 'Not for sale' " + +"END, " + +"Name " + +"FROM Production.Product " + +"ORDER BY ProductNumber;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlCase c = SqlDml.Case(product["ProductLine"]); + c["R"] = "Road"; + c["M"] = "Mountain"; + c["T"] = "Touring"; + c["S"] = "Other sale items"; + c.Else = "Not for sale"; + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductNumber"]); + select.Columns.Add(c, "Category"); + select.Columns.Add(product["Name"]); + select.OrderBy.Add(product["ProductNumber"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test141() + { + string nativeSql = "SELECT ProductNumber, Name, 'Price Range' = " + +"CASE " + +"WHEN ListPrice = 0 THEN 'Mfg item - not for resale' " + +"WHEN ListPrice < 50 THEN 'Under $50' " + + + " WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' " + + + " WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' " + +"ELSE 'Over $1000' " + +"END " + +"FROM Production.Product " + +"ORDER BY ProductNumber ;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlCase c = SqlDml.Case(); + c[product["ListPrice"]==0] = "Mfg item - not for resale"; + c[product["ListPrice"]<50] = "Under $50"; + c[product["ListPrice"]>=50 && product["ListPrice"]<250] = "Under $250"; + c[product["ListPrice"]>=250 && product["ListPrice"]<1000] = "Under $1000"; + c.Else = "Over $1000"; + SqlSelect select = SqlDml.Select(product); + select.Columns.AddRange(product["ProductNumber"], product["Name"]); + select.Columns.Add(c, "Price Range"); + select.OrderBy.Add(product["ProductNumber"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test142() + { + string nativeSql = "DECLARE @find varchar(30); " + +"SET @find = 'Man%'; " + +"SELECT LastName, FirstName, Phone " + +"FROM Person.Contact " + +"WHERE LastName LIKE @find;"; + + SqlTableRef contact = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlVariable find = SqlDml.Variable("find", new SqlValueType("varchar(30)")); + SqlBatch batch = SqlDml.Batch(); + batch.Add(find.Declare()); + batch.Add(SqlDml.Assign(find, "Man%")); + SqlSelect select = SqlDml.Select(contact); + select.Columns.AddRange(contact["LastName"], contact["FirstName"], contact["Phone"]); + select.Where = SqlDml.Like(contact["LastName"], find); + batch.Add(select); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); + } + + [Test] + public void Test143() + { + string nativeSql = "SELECT * " + +"FROM Sales.Store s " + + + "WHERE s.Name IN ('West Side Mart', 'West Wind Distributors', 'Westside IsCyclic Store')"; + + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); + SqlSelect select = SqlDml.Select(s); + select.Columns.Add(SqlDml.Asterisk); + select.Where = + SqlDml.In( + s["Name"], SqlDml.Array("West Side Mart", "West Wind Distributors", "Westside IsCyclic Store")); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test144() + { + string nativeSql = "SELECT * " + +"FROM Sales.Store s " + +"WHERE s.CustomerID IN (1, 2, 3)"; + + SqlTableRef s = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["Store"], "s"); + SqlSelect select = SqlDml.Select(s); + select.Columns.Add(SqlDml.Asterisk); + select.Where = SqlDml.In(s["CustomerID"], SqlDml.Array(1, 2, 3)); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test145() + { + string nativeSql = "DECLARE complex_cursor CURSOR FOR " + +"SELECT a.EmployeeID " + +"FROM HumanResources.EmployeePayHistory AS a " + +"WHERE RateChangeDate <> " + +"(SELECT MAX(RateChangeDate) " + +"FROM HumanResources.EmployeePayHistory AS b " + +"WHERE a.EmployeeID = b.EmployeeID); " + +"OPEN complex_cursor; " + +"FETCH FROM complex_cursor; " + +"UPDATE HumanResources.EmployeePayHistory " + +"SET PayFrequency = 2 " + +"WHERE CURRENT OF complex_cursor; " + +"CLOSE complex_cursor; " + +"DEALLOCATE complex_cursor;"; + + SqlBatch batch = SqlDml.Batch(); + SqlTableRef employeePayHistory = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"]); + SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], "a"); + SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], "b"); + SqlSelect selectInner = SqlDml.Select(b); + selectInner.Columns.Add(SqlDml.Max(b["RateChangeDate"])); + selectInner.Where = a["EmployeeID"]==b["EmployeeID"]; + SqlSelect select = SqlDml.Select(a); + select.Columns.Add(a["EmployeeID"]); + select.Where = a["RateChangeDate"]!=selectInner; + SqlCursor cursor = SqlDml.Cursor("complex_cursor", select); + batch.Add(cursor.Declare()); + batch.Add(cursor.Open()); + batch.Add(cursor.Fetch()); + SqlUpdate update = SqlDml.Update(employeePayHistory); + update.Values[employeePayHistory["PayFrequency"]] = 2; + update.Where = cursor; + batch.Add(update); + batch.Add(cursor.Close()); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); + } + + [Test] + public void Test146() + { + SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"]); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test147() + { + SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"].Tables["EmployeePayHistory"], false); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test148() + { + SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"]); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test149() + { + SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["HumanResources"], false); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test150() + { + SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["Production"].Tables["Product"]); + create.Table.Filegroup = "xxx"; + Console.Write(Compile(create)); + } + + [Test] + public void Test151() + { + string nativeSql = "CREATE VIEW [HumanResources].[vEmployee] " + +"AS SELECT " + +"e.[EmployeeID], " + +"c.[Title], " + +"c.[FirstName], " + +"c.[MiddleName], " + +"c.[LastName], " + +"c.[Suffix], " + +"e.[Title] AS [JobTitle], " + +"c.[Phone], " + +"c.[EmailAddress], " + +"c.[EmailPromotion], " + +"a.[AddressLine1], " + +"a.[AddressLine2], " + +"a.[City], " + +"sp.[Name] AS [StateProvinceName], " + +"a.[PostalCode], " + +"cr.[Name] AS [CountryRegionName], " + +"FROM [HumanResources].[Employee] e " + +"INNER JOIN [Person].[Contact] c " + +"ON c.[ContactID] = e.[ContactID] " + +"INNER JOIN [HumanResources].[EmployeeAddress] ea " + +"ON e.[EmployeeID] = ea.[EmployeeID] " + +"INNER JOIN [Person].[Address] a " + +"ON ea.[AddressID] = a.[AddressID] " + +"INNER JOIN [Person].[StateProvince] sp " + +"ON sp.[StateProvinceID] = a.[StateProvinceID] " + +"INNER JOIN [Person].[CountryRegion] cr " + +"ON cr.[CountryRegionCode] = sp.[CountryRegionCode]"; + SqlCreateView create = SqlDdl.Create(Catalog.Schemas["HumanResources"].Views["vEmployee"]); + + Console.Write(Compile(create)); + } + + [Test] + public void Test152() + { + Assertion assertion = + Catalog.Schemas["Production"].CreateAssertion("assertion", SqlDml.Literal(1)==1, false, false); + SqlCreateAssertion create = SqlDdl.Create(assertion); + + Console.Write(Compile(create)); + } + + [Test] + public void Test153() + { +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet(Catalog.Schemas["Production"], "characterSet", characterSetBase, (ICollation)null); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test154() + { +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet(Catalog.Schemas["Production"], "characterSet", characterSetBase, new DefaultCollation()); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test155() + { +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet( +// Catalog.Schemas["Production"], "characterSet", characterSetBase, +// new DescendingCollation(Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"])); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test156() + { +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet( +// Catalog.Schemas["Production"], "characterSet", characterSetBase, new ExternalCollation("Collation.bin")); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test157() + { +// Translation translation = new Translation(Catalog.Schemas["Production"], "tranlsation"); +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet( +// Catalog.Schemas["Production"], "characterSet", characterSetBase, new TranslationCollation(translation)); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test158() + { +// Translation translation = new Translation(Catalog.Schemas["Production"], "tranlsation"); +// CharacterSet characterSetBase = new CharacterSet(Catalog.Schemas["Production"], "characterSetBase"); +// CharacterSet characterSet = +// new CharacterSet( +// Catalog.Schemas["Production"], "characterSet", characterSetBase, +// new TranslationCollation( +// translation, Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"])); +// SqlCreateCharacterSet create = SqlDdl.Create(characterSet); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test159() + { + Xtensive.Sql.Model.Domain domain = + Catalog.Schemas["HumanResources"].CreateDomain("domain", new SqlValueType(SqlType.Decimal, 8, 2), 1); + domain.Collation = Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"]; + domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); + SqlCreateDomain create = SqlDdl.Create(domain); + + Console.Write(Compile(create)); + } + + [Test] + public void Test160() + { +// CharacterSet characterSet = new CharacterSet(Catalog.Schemas["Production"], "characterSet"); +// Collation collation = +// new Collation( +// Catalog.Schemas["HumanResources"], "collation", characterSet, +// Catalog.Schemas["HumanResources"].Collations["SQL_Latin1_General_CP1_CI_AS"]); +// collation.PadSpace = true; +// SqlCreateCollation create = SqlDdl.Create(collation); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test161() + { +// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); +// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); +// IdentityTranslation tranlsationSource = new IdentityTranslation(); +// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); +// translation.SourceCharacterSet = source; +// translation.TargetCharacterSet = target; +// translation.TranslationSource = tranlsationSource; +// SqlCreateTranslation create = SqlDdl.Create(translation); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test162() + { +// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); +// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); +// ExternalTranslation tranlsationSource = new ExternalTranslation("externalTranlsation"); +// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); +// translation.SourceCharacterSet = source; +// translation.TargetCharacterSet = target; +// translation.TranslationSource = tranlsationSource; +// SqlCreateTranslation create = SqlDdl.Create(translation); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test163() + { +// CharacterSet source = new CharacterSet(Catalog.Schemas["Production"], "characterSetSource"); +// CharacterSet target = new CharacterSet(Catalog.Schemas["Production"], "characterSetTarget"); +// Translation tranlsationSource = new Translation(Catalog.Schemas["Person"], "tranlsationSource"); +// Translation translation = new Translation(Catalog.Schemas["Production"], "translation"); +// translation.SourceCharacterSet = source; +// translation.TargetCharacterSet = target; +// translation.TranslationSource = tranlsationSource; +// SqlCreateTranslation create = SqlDdl.Create(translation); +// +// Console.Write(Compile(create)); + } + + [Test] + public void Test164() + { + SqlCreateSchema create = SqlDdl.Create(Catalog.Schemas["Production"]); + + Console.Write(Compile(create)); + } + + [Test] + public void Test165() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.AddColumn(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test166() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.DropDefault(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test167() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.SetDefault("Empty", Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test168() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.DropColumn(Catalog.Schemas["Production"].Tables["Product"].TableColumns["Name"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test169() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.AddConstraint(Catalog.Schemas["Production"].Tables["Product"].TableConstraints[0])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test170() + { + SqlAlterTable alter = + SqlDdl.Alter( + Catalog.Schemas["Production"].Tables["Product"], + SqlDdl.DropConstraint(Catalog.Schemas["Production"].Tables["Product"].TableConstraints[0])); + + Console.Write(Compile(alter)); + } + + [Test] + [Ignore("ALTER DOMAIN is not supported")] + public void Test171() + { + Xtensive.Sql.Model.Domain domain = + Catalog.Schemas["HumanResources"].CreateDomain("domain171", new SqlValueType(SqlType.Decimal, 8, 2), 1); + domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); + SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.AddConstraint(domain.DomainConstraints[0])); + + Console.Write(Compile(alter)); + } + + [Test] + [Ignore("ALTER DOMAIN is not supported")] + public void Test172() + { + Xtensive.Sql.Model.Domain domain = + Catalog.Schemas["HumanResources"].CreateDomain("domain172", new SqlValueType(SqlType.Decimal, 8, 2), 1); + domain.CreateConstraint("domainConstraint", SqlDml.Literal(1)==1); + SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.DropConstraint(domain.DomainConstraints[0])); + + Console.Write(Compile(alter)); + } + + [Test] + [Ignore("ALTER DOMAIN is not supported")] + public void Test173() + { + Xtensive.Sql.Model.Domain domain = + Catalog.Schemas["HumanResources"].CreateDomain("domain173", new SqlValueType(SqlType.Decimal, 8, 2), 1); + SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.SetDefault(0)); + + Console.Write(Compile(alter)); + } + + [Test] + [Ignore("ALTER DOMAIN is not supported")] + public void Test174() + { + Xtensive.Sql.Model.Domain domain = + Catalog.Schemas["HumanResources"].CreateDomain("domain174", new SqlValueType(SqlType.Decimal, 8, 2), 1); + SqlAlterDomain alter = SqlDdl.Alter(domain, SqlDdl.DropDefault()); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test175() + { + Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator175"); + SqlCreateSequence create = SqlDdl.Create(s); + + Console.Write(Compile(create)); + } + + [Test] + public void Test176() + { + Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator176"); + s.SequenceDescriptor.IsCyclic = true; + s.SequenceDescriptor.StartValue = 1000; + s.SequenceDescriptor.MaxValue = 1000; + s.SequenceDescriptor.MinValue = -1000; + s.SequenceDescriptor.Increment = -1; + SqlCreateSequence create = SqlDdl.Create(s); + + Console.Write(Compile(create)); + } + + [Test] + public void Test177() + { + Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator177"); + SqlDropSequence drop = SqlDdl.Drop(s); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test178() + { + Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator178"); + SqlAlterSequence alter = SqlDdl.Alter(s, new SequenceDescriptor(s, 0, 1, null, null, true)); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test179() + { + Sequence s = Catalog.Schemas["Production"].CreateSequence("Generator179"); + SqlAlterSequence alter = SqlDdl.Alter(s, new SequenceDescriptor(s, null, null, 1000, -1000)); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test180() + { + Table table = Catalog.Schemas["Production"].Tables["Product"]; + SqlAlterIdentityInfo action = + SqlDdl.Alter(table.TableColumns["ProductID"], new SequenceDescriptor(table.TableColumns["ProductID"], 2, 3, null, null, true)); + SqlAlterTable alter = SqlDdl.Alter(table, action); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test181() + { + SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["Purchasing"].Tables["PurchaseOrderDetail"]); + + Console.Write(Compile(create)); + } + + [Test] + public void Test182() + { + PartitionFunction pf = + Catalog.CreatePartitionFunction("pf182", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); + pf.BoundaryType = BoundaryType.Right; + SqlCreatePartitionFunction create = SqlDdl.Create(pf); + + Console.Write(Compile(create)); + } + + [Test] + public void Test183() + { + PartitionFunction pf = + Catalog.CreatePartitionFunction("pf183", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); + SqlDropPartitionFunction drop = SqlDdl.Drop(pf); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test184() + { + PartitionFunction pf = + Catalog.CreatePartitionFunction("pf184", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); + SqlAlterPartitionFunction alter = SqlDdl.Alter(pf, "5", SqlAlterPartitionFunctionOption.Split); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test185() + { + PartitionFunction pf = + Catalog.CreatePartitionFunction("pf185", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); + PartitionSchema ps = Catalog.CreatePartitionSchema("ps1", pf, "[PRIMARY]", "sdf", "sdf1", "sdf2"); + SqlCreatePartitionScheme create = SqlDdl.Create(ps); + + Console.Write(Compile(create)); + } + + [Test] + public void Test186() + { + PartitionFunction pf = + Catalog.CreatePartitionFunction("pf186", new SqlValueType(SqlType.Decimal, 5, 2), "1", "5", "10"); + PartitionSchema ps = Catalog.CreatePartitionSchema("ps186", pf, "[PRIMARY]"); + SqlCreatePartitionScheme create = SqlDdl.Create(ps); + + Console.Write(Compile(create)); + } + + [Test] + public void Test187() + { + PartitionSchema ps = Catalog.CreatePartitionSchema("ps187", null, "[PRIMARY]"); + SqlDropPartitionScheme drop = SqlDdl.Drop(ps); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test188() + { + PartitionSchema ps = Catalog.CreatePartitionSchema("ps188", null, "[PRIMARY]"); + SqlAlterPartitionScheme alter = SqlDdl.Alter(ps); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test189() + { + PartitionSchema ps = Catalog.CreatePartitionSchema("ps189", null, "[PRIMARY]"); + SqlAlterPartitionScheme alter = SqlDdl.Alter(ps, "sdfg"); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test190() + { + PartitionSchema ps = Catalog.CreatePartitionSchema("ps190", null, "[PRIMARY]"); + Table t = Catalog.Schemas["Production"].Tables["Product"]; + t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], ps); + SqlCreateTable create = SqlDdl.Create(t); + + Console.Write(Compile(create)); + } + + [Test] + public void Test191() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Hash, 10); + SqlCreateTable create = SqlDdl.Create(t); + + Console.Write(Compile(create)); + } + + [Test] + public void Test192() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Hash); + t.PartitionDescriptor.CreateHashPartition("ts1"); + t.PartitionDescriptor.CreateHashPartition("ts2"); + t.PartitionDescriptor.CreateHashPartition("ts3"); + SqlCreateTable create = SqlDdl.Create(t); + + Console.Write(Compile(create)); + } + + [Test] + public void Test193() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.List); + t.PartitionDescriptor.CreateListPartition("p1", "ts1", "sdf", "sdf1", "sdfg"); + t.PartitionDescriptor.CreateListPartition("p2", "ts2", "sir"); + SqlCreateTable create = SqlDdl.Create(t); + + Console.Write(Compile(create)); + } + + [Test] + public void Test194() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + t.PartitionDescriptor = new PartitionDescriptor(t, t.TableColumns["ProductID"], PartitionMethod.Range); + t.PartitionDescriptor.CreateRangePartition("ts1", new DateTime(2006, 01, 01).ToString()); + t.PartitionDescriptor.CreateRangePartition("ts2", new DateTime(2007, 01, 01).ToString()); + t.PartitionDescriptor.CreateRangePartition("ts3", "MAXVALUE"); + SqlCreateTable create = SqlDdl.Create(t); + + Console.Write(Compile(create)); + } + + [Test] + public void Test195() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + Index index = t.CreateIndex("MegaIndex195"); + index.CreateIndexColumn(t.TableColumns[0]); + index.CreateIndexColumn(t.TableColumns[1]); + index.CreateIndexColumn(t.TableColumns[2], false); + index.CreateIndexColumn(t.TableColumns[3]); + index.CreateIndexColumn(t.TableColumns[4]); + index.CreateIndexColumn(t.TableColumns[5]); + index.IsUnique = true; + index.IsClustered = true; + index.FillFactor = 80; + index.Filegroup = "\"default\""; + SqlCreateIndex create = SqlDdl.Create(index); + + Console.Write(Compile(create)); + } + + [Test] + public void Test196() + { + Table t = Catalog.Schemas["Production"].Tables["Product"]; + Index index = t.CreateIndex("MegaIndex196"); + SqlDropIndex drop = SqlDdl.Drop(index); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test197() + { + string nativeSql = "Select Top 10 * " + +"From (Person.StateProvince a " + +"inner hash join Person.CountryRegion b on a.StateProvinceCode=b.CountryRegionCode)" + +"inner loop join " + +"(Person.StateProvince c " + +"inner merge join Person.CountryRegion d on c.StateProvinceCode=d.CountryRegionCode)" + +" on a.CountryRegionCode=c.CountryRegionCode"; + + SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "a"); + SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "b"); + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "c"); + SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "d"); + + SqlJoinedTable ab = a.InnerJoin(b, a["StateProvinceCode"]==b["CountryRegionCode"]); + SqlJoinedTable cd = c.InnerJoin(d, c["StateProvinceCode"]==d["CountryRegionCode"]); + SqlJoinedTable abcd = SqlDml.Join(SqlJoinType.InnerJoin, ab, cd, a["CountryRegionCode"]==c["CountryRegionCode"]); + + SqlSelect select = SqlDml.Select(abcd); + select.Limit = 10; + select.Columns.Add(SqlDml.Asterisk); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Hash, ab)); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Merge, cd)); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Loop, abcd)); + + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test198() + { + string nativeSql = "Select Top 10 * " + +"From (Person.StateProvince a " + +"inner hash join Person.CountryRegion b on a.StateProvinceCode=b.CountryRegionCode)" + +"inner loop join " + +"(Person.StateProvince c " + +"inner merge join Person.CountryRegion d on c.StateProvinceCode=d.CountryRegionCode)" + +" on a.CountryRegionCode=c.CountryRegionCode"; + + SqlTableRef a = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "a"); + SqlTableRef b = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "b"); + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["StateProvince"], "c"); + SqlTableRef d = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["CountryRegion"], "d"); + + SqlJoinedTable ab = a.InnerJoin(b, a["StateProvinceCode"]==b["CountryRegionCode"]); + SqlJoinedTable cd = c.InnerJoin(d, c["StateProvinceCode"]==d["CountryRegionCode"]); + SqlJoinedTable abcd = SqlDml.Join(SqlJoinType.InnerJoin, ab, cd, a["CountryRegionCode"]==c["CountryRegionCode"]); + + SqlSelect select = SqlDml.Select(abcd); + select.Limit = 10; + select.Columns.Add(SqlDml.Asterisk); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Hash, b)); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Merge, d)); + select.Hints.Add(SqlDml.JoinHint(SqlJoinMethod.Loop, abcd)); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test199() + { + string nativeSql = + "Select Top 10 EmailAddress "+ + "From Person.Contact a "+ + "Where EmailAddress Like 'a%'"; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(c); + select.Limit = 10; + select.Columns.Add(c["EmailAddress"]); + select.Where = SqlDml.Like(c["EmailAddress"], "a%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test200() + { + string nativeSql = + "Select Top 10 EmailAddress " + + "From Person.Contact a " + + "Where EmailAddress Like 'a%' " + + "OPTION (FAST 10, KEEP PLAN, ROBUST PLAN)"; + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select = SqlDml.Select(c); + select.Limit = 10; + select.Columns.Add(c["EmailAddress"]); + select.Where = SqlDml.Like(c["EmailAddress"], "a%"); + select.Hints.Add(SqlDml.FastFirstRowsHint(10)); + select.Hints.Add(SqlDml.NativeHint("KEEP PLAN, ROBUST PLAN")); + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test201() + { + string nativeSql = "Select Top 10 EmailAddress " + +"From Person.Contact a " + +"Where EmailAddress Like 'a%' " + + "UNION ALL " + +"Select Top 10 EmailAddress " + +"From Person.Contact b " + +"Where EmailAddress Like 'b%' "; + + SqlTableRef c = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlSelect select1 = SqlDml.Select(c); + select1.Limit = 10; + select1.Columns.Add(c["EmailAddress"]); + select1.Where = SqlDml.Like(c["EmailAddress"], "a%"); + SqlSelect select2 = SqlDml.Select(c); + select2.Limit = 10; + select2.Columns.Add(c["EmailAddress"]); + select2.Where = SqlDml.Like(c["EmailAddress"], "a%"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, SqlDml.UnionAll(select1, select2))); + } + + [Test] + public void Test202() + { + string nativeSql = + "DECLARE test202cursor CURSOR FOR SELECT * FROM Purchasing.Vendor;\n" + + "OPEN test202cursor;\n" + + "FETCH NEXT FROM test202cursor;\n" + + "CLOSE test202cursor;"; + SqlBatch batch = SqlDml.Batch(); + SqlTableRef vendors = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); + SqlSelect select = SqlDml.Select(vendors); + select.Columns.Add(select.Asterisk); + SqlCursor cursor = SqlDml.Cursor("test202cursor_", select); + batch.Add(cursor.Declare()); + batch.Add(cursor.Open()); + batch.Add(cursor.Fetch()); + batch.Add(cursor.Close()); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); + } + + [Test] + public void Test203() + { + string nativeSql = "INSERT INTO Person.Contact " + +"DEFAULT VALUES;"; + + SqlTableRef unitMeasure = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlInsert insert = SqlDml.Insert(unitMeasure); + + Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, insert))); + } + + [Test] + public void Test204() + { + string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; + + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(); + SqlSelect s3 = SqlDml.Select(); + SqlSelect s4 = SqlDml.Select(); + SqlSelect select; + s1.Columns.Add(1, "f"); + s2.Columns.Add(2); + s3.Columns.Add(3); + s4.Columns.Add(4); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); + select = SqlDml.Select(qr); + select.Columns.Add(qr["f"]); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select)); + } + + [Test] + public void Test205() + { + string nativeSql = + "DECLARE test205cursor CURSOR FOR SELECT * FROM Purchasing.Vendor;\n" + + "OPEN test205cursor;\n" + + "BEGIN\n" + + " FETCH NEXT FROM test205cursor;\n" + + "END\n" + + "CLOSE test205cursor;"; + + SqlBatch batch = SqlDml.Batch(); + SqlTableRef vendors = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["Vendor"]); + SqlSelect select = SqlDml.Select(vendors); + select.Columns.Add(select.Asterisk); + SqlCursor cursor = SqlDml.Cursor("test205cursor_", select); + batch.Add(cursor.Declare()); + batch.Add(cursor.Open()); + SqlStatementBlock block = SqlDml.StatementBlock(); + block.Add(cursor.Fetch()); + batch.Add(block); + batch.Add(cursor.Close()); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, batch)); + } + + [Test] + public void Test206() + { + string nativeSql = + "SELECT c.Name SubcategoryName, p.Name ProductName " + + "FROM Production.ProductSubcategory c " + + "CROSS APPLY (SELECT Name FROM Production.Product WHERE ProductSubcategoryID = c.ProductSubcategoryID) p " + + "ORDER BY c.Name, p.Name"; + + var subcategories = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["ProductSubcategory"], "c"); + var products = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + + var innerSelect = SqlDml.Select(products); + innerSelect.Columns.Add(products.Columns["Name"]); + innerSelect.Where = products.Columns["ProductSubcategoryID"] == subcategories.Columns["ProductSubcategoryID"]; + var innerQuery = SqlDml.QueryRef(innerSelect, "p"); + + var categoryName = subcategories.Columns["Name"]; + var productName = innerQuery.Columns["Name"]; + + var outerSelect = SqlDml.Select(subcategories.CrossApply(innerQuery)); + outerSelect.Columns.Add(categoryName, "SubcategoryName"); + outerSelect.Columns.Add(productName, "ProductName"); + outerSelect.OrderBy.Add(categoryName); + outerSelect.OrderBy.Add(productName); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, outerSelect)); + } + + [Test] + public void Test207() + { + string nativeSql = + "DELETE FROM [Sales].[SpecialOfferProduct] WHERE NOT EXISTS (SELECT [ProductID] FROM [Production].[Product]" + + " WHERE [Production].[Product].[ProductID] = [Sales].[SpecialOfferProduct].[ProductID])"; + + var products = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + var specialOfferProduct = SqlDml.TableRef(Catalog.Schemas["Sales"].Tables["SpecialOfferProduct"]); + + var select = SqlDml.Select(products); + select.Columns.Add(products["ProductID"]); + select.Where = products["ProductID"]==specialOfferProduct["ProductID"]; + + var delete = SqlDml.Delete(specialOfferProduct); + delete.Where = SqlDml.Not(SqlDml.Exists(select)); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); + } + + [Test] + public void RenameTest() + { + var model = new Catalog("do40-tests"); + + Schema schema = Catalog.CreateSchema("S1"); + Table table = schema.CreateTable("T1"); + table.CreateColumn("C1", new SqlValueType(SqlType.Int32)); + + try { + sqlConnection.BeginTransaction(); + + using (var cmd = sqlConnection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + batch.Add(SqlDdl.Create(schema)); + cmd.CommandText = Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + + var exModel1 = sqlDriver.ExtractCatalog(sqlConnection); + var exT1 = exModel1.Schemas[schema.DbName].Tables[table.DbName]; + Assert.IsNotNull(exT1); + var exC1 = exT1.TableColumns["C1"]; + Assert.IsNotNull(exC1); + + using (var cmd = sqlConnection.CreateCommand()) { + SqlBatch batch = SqlDml.Batch(); + batch.Add(SqlDdl.Rename(exC1, "C2")); + batch.Add(SqlDdl.Rename(exT1, "T2")); + cmd.CommandText = Compile(batch).GetCommandText(); + cmd.ExecuteNonQuery(); + } + + var exModel2 = sqlDriver.ExtractCatalog(sqlConnection); + var exT2 = exModel2.Schemas[schema.DbName].Tables["T2"]; + Assert.IsNotNull(exT2); + var exC2 = exT2.TableColumns["C2"]; + Assert.IsNotNull(exC2); + + } + finally { + sqlConnection.Rollback(); + } + } + + [Test] + public void TestDeleteFrom() + { + string nativeSql = "DELETE FROM Production.Product " + +"FROM Production.Product AS p " + +"INNER JOIN Purchasing.ProductVendor AS pv " + +"ON p.ProductID = pv.ProductID AND pv.VendorID = 0;"; + + SqlTableRef product = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"]); + SqlTableRef p = SqlDml.TableRef(Catalog.Schemas["Production"].Tables["Product"], "p"); + SqlTableRef pv = SqlDml.TableRef(Catalog.Schemas["Purchasing"].Tables["ProductVendor"], "pv"); + + SqlDelete delete = SqlDml.Delete(product); + delete.From = p.InnerJoin(pv, p["ProductID"]==pv["ProductID"] && pv["VendorID"]==0); + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, delete)); + } + + /* + +SELECT EmpSSN AS "Employee Social Security Number " +FROM EmpTable + +SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5 +FROM +(SELECT PurchaseOrderID, EmployeeID, VendorID +FROM Purchasing.PurchaseOrderHeader) p +PIVOT +( +COUNT (PurchaseOrderID) +FOR EmployeeID IN +( [164], [198], [223], [231], [233] ) +) AS pvt +ORDER BY VendorID + +DECLARE complex_cursor CURSOR FOR + SELECT a.EmployeeID + FROM HumanResources.EmployeePayHistory AS a + WHERE RateChangeDate <> + (SELECT MAX(RateChangeDate) + FROM HumanResources.EmployeePayHistory AS b + WHERE a.EmployeeID = b.EmployeeID) ; +OPEN complex_cursor; +FETCH FROM complex_cursor; +DELETE FROM HumanResources.EmployeePayHistory +WHERE CURRENT OF complex_cursor; +CLOSE complex_cursor; +DEALLOCATE complex_cursor; + +--batch2 +BEGIN TRANSACTION +GO +USE AdventureWorks; +GO +CREATE TABLE dbo.mycompanies +( + id_num int IDENTITY(100, 5), + company_name nvarchar(100) +) +GO +INSERT mycompanies (company_name) + VALUES (N'A Bike Store'); +INSERT mycompanies (company_name) + VALUES (N'Progressive Sports'); +INSERT mycompanies (company_name) + VALUES (N'Modular IsCyclic Systems'); +INSERT mycompanies (company_name) + VALUES (N'Advanced Bike Components'); +INSERT mycompanies (company_name) + VALUES (N'Metropolitan Sports Supply'); +INSERT mycompanies (company_name) + VALUES (N'Aerobic Exercise Company'); +INSERT mycompanies (company_name) + VALUES (N'Associated Bikes'); +INSERT mycompanies (company_name) + VALUES (N'Exemplary Cycles'); +GO +SELECT id_num, company_name +FROM dbo.mycompanies +ORDER BY company_name ASC; +GO +COMMIT; +GO + +-- Create the table. +CREATE TABLE TestTable (cola int, colb char(3)) +GO +SET NOCOUNT ON +GO +-- Declare the variable to be used. +DECLARE @MyCounter int + +-- Initialize the variable. +SET @MyCounter = 0 + +-- Test the variable to see if the loop is finished. +WHILE (@MyCounter < 26) +BEGIN + -- Insert a row into the table. + INSERT INTO TestTable VALUES + -- Use the variable to provide the integer value + -- for cola. Also use it to generate a unique letter + -- for each row. Use the ASCII function to get the + -- integer value of 'a'. Add @MyCounter. Use CHAR to + -- convert the sum back to the character @MyCounter + -- characters after 'a'. + (@MyCounter, + CHAR( ( @MyCounter + ASCII('a') ) ) + ) + -- Increment the variable to count this iteration + -- of the loop. + SET @MyCounter = @MyCounter + 1 +END +GO +SET NOCOUNT OFF +GO + +-- Create a procedure that takes one input parameter +-- and returns one output parameter and a return code. +CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT, + @MaxTotal INT OUTPUT +AS +-- Declare and initialize a variable to hold @@ERROR. +DECLARE @ErrorSave INT +SET @ErrorSave = 0 + +-- Do a SELECT using the input parameter. +SELECT FirstName, LastName, JobTitle +FROM HumanResources.vEmployee +WHERE EmployeeID = @EmployeeIDParm + +-- Save any nonzero @@ERROR value. +IF (@@ERROR <> 0) + SET @ErrorSave = @@ERROR + +-- Set a value in the output parameter. +SELECT @MaxTotal = MAX(TotalDue) +FROM Sales.SalesOrderHeader; + +IF (@@ERROR <> 0) + SET @ErrorSave = @@ERROR + +-- Returns 0 if neither SELECT statement had +-- an error; otherwise, returns the last error. +RETURN @ErrorSave + +-- Returns 0 if neither SELECT statement had +-- an error; otherwise, returns the last error. +RETURN @ErrorSave +GO + + +-- Declare the variables for the return code and output parameter. +DECLARE @ReturnCode INT +DECLARE @MaxTotalVariable INT + +-- Execute the stored procedure and specify which variables +-- are to receive the output parameter and return code values. +EXEC @ReturnCode = SampleProcedure @EmployeeIDParm = 19, + @MaxTotal = @MaxTotalVariable OUTPUT + +-- Show the values returned. +PRINT ' ' +PRINT 'Return code = ' + CAST(@ReturnCode AS CHAR(10)) +PRINT 'Maximum Quantity = ' + CAST(@MaxTotalVariable AS CHAR(10)) +GO + +DECLARE @Group nvarchar(50), @Sales money; +SET @Group = N'North America'; +SET @Sales = 2000000; +SET NOCOUNT OFF; +SELECT FirstName, LastName, SalesYTD +FROM Sales.vSalesPerson +WHERE TerritoryGroup = @Group and SalesYTD >= @Sales; + + +DECLARE @MyTableVar table( + EmpID int NOT NULL, + OldVacationHours int, + NewVacationHours int, + ModifiedDate datetime); +UPDATE TOP (10) HumanResources.Employee +SET VacationHours = VacationHours * 1.25 +OUTPUT INSERTED.EmployeeID, + DELETED.VacationHours, + INSERTED.VacationHours, + INSERTED.ModifiedDate +INTO @MyTableVar; +--Display the result set of the table variable. +SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate +FROM @MyTableVar; +GO +--Display the result set of the table. +--Note that ModifiedDate reflects the value generated by an +--AFTER UPDATE trigger. +SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate +FROM HumanResources.Employee; +GO +*/ + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MiscTests.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MiscTests.cs index da195ca903..982c7f05f1 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MiscTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/MiscTests.cs @@ -1,399 +1,399 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; -using System.Data.Common; -using System.Linq; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class MiscTests: AdventureWorks - { - private SqlConnection sqlConnection; - private DbCommand sqlCommand; - private SqlDriver sqlDriver; - - [OneTimeSetUp] - public override void SetUp() - { - base.SetUp(); - sqlDriver = TestSqlDriver.Create(Url); - sqlConnection = sqlDriver.CreateConnection(); - sqlCommand = sqlConnection.CreateCommand(); - } - - [OneTimeTearDown] - public void TearDown() - { - try { - if (sqlConnection!=null && sqlConnection.State!=ConnectionState.Closed) - sqlConnection.Close(); - } - catch (Exception ex) { - Console.WriteLine(ex.Message); - } - } - - [Test] - public void BinaryExpressionTest() - { - SqlLiteral l = SqlDml.Literal(1); - bool passed = false; - if (!l.IsNullReference()) - passed = true; - Assert.IsTrue(passed); - if (l.IsNullReference()) - passed = false; - Assert.IsTrue(passed); - } - - [Test] - public void ImplicitConversionTest() - { - SqlExpression e = new byte[3]; - Assert.AreEqual(e.GetType(), typeof(SqlLiteral)); - } - - [Test] - public void ArrayTest() - { - SqlArray i = SqlDml.Array(new int[] {1, 2}); - i.Values[0] = 10; - SqlSelect select = SqlDml.Select(); - select.Where = SqlDml.In(1, i); - - MemoryStream ms = new MemoryStream(); - BinaryFormatter bf = new BinaryFormatter(); - bf.Serialize(ms, select); - - ms.Seek(0, SeekOrigin.Begin); - select = (SqlSelect)bf.Deserialize(ms); - - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TypeTest() - { - SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); - SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); - Assert.IsFalse(t1 != t2); - Assert.IsTrue(t1 == t2); - Assert.IsTrue(t1.Equals(t2)); - } - - [Test] - public void AddTest() - { - SqlLiteral l1 = SqlDml.Literal(1); - SqlLiteral l2 = SqlDml.Literal(2); - SqlBinary b = l1 + l2; - Assert.AreEqual(b.NodeType, SqlNodeType.Add); - - b = b - ~l1; - Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); - - SqlSelect s = SqlDml.Select(); - s.Columns.Add(1, "id"); - b = b/s; - Assert.AreEqual(b.NodeType, SqlNodeType.Divide); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); - - SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); - Assert.AreEqual(c.NodeType, SqlNodeType.Cast); - - SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); - b = c%l; - Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); - - b = l1*(-l2); - Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); - - SqlBatch batch = SqlDml.Batch(); - SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); - batch.Add(v1.Declare()); - batch.Add(SqlDml.Assign(v1, 1.0)); - s = SqlDml.Select(); - s.Columns.Add(b, "value"); - batch.Add(s); - } - - [Test] - public void CircularReferencesTest() - { - SqlSelect select = SqlDml.Select(); - SqlBinary b = SqlDml.Literal(1) + 2; - SqlBinary rb = b + 3; - rb.Left.ReplaceWith(rb); - select.Where = rb > 1; - Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); - } - - [Test] - public void PositionTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void SubstringTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Substring("abc", 1, 1)); - select.Columns.Add(SqlDml.Substring("Xtensive", 2)); -// select.Columns.Add(Sql.Power(2, 2)); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TrimTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Trim(" abc ")); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void ExtractTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - // [Test] - // public void SequenceTest() - // { - // SqlSelect select = Sql.Select(); - // select.Columns.Add(Sql.NextValue("myGenerator")); - // SqlDriver driver = new MSSQLDriver(new MSSQLVersionInfo(new Version("9.0"))); - // Console.WriteLine(driver.Compile(select).CommandText); - // } - - [Test] - public void ConcatTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Concat("a", "b")); - select.Columns.Add("User: " + SqlDml.SessionUser()); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void IsBooleanExpressionTest() - { - SqlExpression ex = !SqlDml.Literal(true) || true; - } - - [Test] - public void JoinTest() - { - SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - SqlTableRef tr3 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); - - SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0] == tr2[0]).InnerJoin(tr3, tr2[0] == tr3[0])); - sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - int i = 0; - SqlTableRef[] refs = new [] {tr1, tr2, tr3}; - foreach (SqlTable source in select.From) - Assert.AreSame(refs[i++], source); - } - - [Test] - public void UniqueTest() - { - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"])); - s2.Columns.Add(SqlDml.Asterisk); - s1.Columns.Add(SqlDml.Unique(s2) == true); - Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - public void TrueTest() - { - SqlSelect s1 = SqlDml.Select(); - s1.Where = true; - Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - public void UnionTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(s1.From["AddressID"]); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(s2.From["AddressID"]); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(s3.From["AddressID"]); - - Console.WriteLine(sqlDriver.Compile(s1.Union(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); - s3.Where = SqlDml.In(50.00, s1.Union(s2)); - Console.WriteLine(sqlDriver.Compile(s3).GetCommandText()); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); - Assert.Greater(qr.Columns.Count, 0); - } - - [Test] - public void UnionAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); - } - - [Test] - public void IntersectTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); - } - - [Test] - public void IntersectAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2).IntersectAll(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2.IntersectAll(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1, s1.IntersectAll(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1.IntersectAll(s2))).GetCommandText()); - } - - [Test] - public void ExceptTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.Except(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); - } - - [Test] - public void ExceptAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2).ExceptAll(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2.ExceptAll(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1, s1.ExceptAll(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1.ExceptAll(s2))).GetCommandText()); - } - - [Test] - public void FreeTextTest() - { - SqlSelect select = SqlDml.Select(); - var table = Catalog.Schemas["Person"].Tables["Address"]; - select.From = SqlDml.QueryRef(SqlDml.FreeTextTable(table, "How can I make my own beers and ales?", EnumerableUtils.One(table.Columns[0].Name).ToList(), EnumerableUtils.One(table.Columns[0].Name).ToList())); - select.Columns.Add(select.From.Asterisk); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void FreeTextTopNByRankTest() - { - SqlSelect select = SqlDml.Select(); - var table = Catalog.Schemas["Person"].Tables["Address"]; - select.From = SqlDml.QueryRef( SqlDml.FreeTextTable(table, - "How can I make my own beers", - EnumerableUtils.One(table.Columns[0].Name).ToList(), - (SqlLiteral)5)); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void FreeTextCreateTest() - { - var table = Catalog.Schemas["Person"].Tables["Address"]; - var ftindex = table.CreateFullTextIndex(string.Empty); - var ftColumn = ftindex.CreateIndexColumn(table.Columns[1]); - ftColumn.Languages.Add(new Language("English")); - ftindex.UnderlyingUniqueIndex = "PK_Address_AddressID"; - var createIndex = SqlDdl.Create(ftindex); - Console.WriteLine(sqlDriver.Compile(createIndex).GetCommandText()); - - var dropIndex = SqlDdl.Drop(ftindex); - Console.WriteLine(sqlDriver.Compile(dropIndex).GetCommandText()); - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; +using System.Data.Common; +using System.Linq; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class MiscTests: AdventureWorks + { + private SqlConnection sqlConnection; + private DbCommand sqlCommand; + private SqlDriver sqlDriver; + + [OneTimeSetUp] + public override void SetUp() + { + base.SetUp(); + sqlDriver = TestSqlDriver.Create(Url); + sqlConnection = sqlDriver.CreateConnection(); + sqlCommand = sqlConnection.CreateCommand(); + } + + [OneTimeTearDown] + public void TearDown() + { + try { + if (sqlConnection!=null && sqlConnection.State!=ConnectionState.Closed) + sqlConnection.Close(); + } + catch (Exception ex) { + Console.WriteLine(ex.Message); + } + } + + [Test] + public void BinaryExpressionTest() + { + SqlLiteral l = SqlDml.Literal(1); + bool passed = false; + if (!l.IsNullReference()) + passed = true; + Assert.IsTrue(passed); + if (l.IsNullReference()) + passed = false; + Assert.IsTrue(passed); + } + + [Test] + public void ImplicitConversionTest() + { + SqlExpression e = new byte[3]; + Assert.AreEqual(e.GetType(), typeof(SqlLiteral)); + } + + [Test] + public void ArrayTest() + { + SqlArray i = SqlDml.Array(new int[] {1, 2}); + i.Values[0] = 10; + SqlSelect select = SqlDml.Select(); + select.Where = SqlDml.In(1, i); + + MemoryStream ms = new MemoryStream(); + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(ms, select); + + ms.Seek(0, SeekOrigin.Begin); + select = (SqlSelect)bf.Deserialize(ms); + + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TypeTest() + { + SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); + SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); + Assert.IsFalse(t1 != t2); + Assert.IsTrue(t1 == t2); + Assert.IsTrue(t1.Equals(t2)); + } + + [Test] + public void AddTest() + { + SqlLiteral l1 = SqlDml.Literal(1); + SqlLiteral l2 = SqlDml.Literal(2); + SqlBinary b = l1 + l2; + Assert.AreEqual(b.NodeType, SqlNodeType.Add); + + b = b - ~l1; + Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); + + SqlSelect s = SqlDml.Select(); + s.Columns.Add(1, "id"); + b = b/s; + Assert.AreEqual(b.NodeType, SqlNodeType.Divide); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); + + SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); + Assert.AreEqual(c.NodeType, SqlNodeType.Cast); + + SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); + b = c%l; + Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); + + b = l1*(-l2); + Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); + + SqlBatch batch = SqlDml.Batch(); + SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); + batch.Add(v1.Declare()); + batch.Add(SqlDml.Assign(v1, 1.0)); + s = SqlDml.Select(); + s.Columns.Add(b, "value"); + batch.Add(s); + } + + [Test] + public void CircularReferencesTest() + { + SqlSelect select = SqlDml.Select(); + SqlBinary b = SqlDml.Literal(1) + 2; + SqlBinary rb = b + 3; + rb.Left.ReplaceWith(rb); + select.Where = rb > 1; + Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); + } + + [Test] + public void PositionTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void SubstringTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Substring("abc", 1, 1)); + select.Columns.Add(SqlDml.Substring("Xtensive", 2)); +// select.Columns.Add(Sql.Power(2, 2)); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TrimTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Trim(" abc ")); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void ExtractTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + // [Test] + // public void SequenceTest() + // { + // SqlSelect select = Sql.Select(); + // select.Columns.Add(Sql.NextValue("myGenerator")); + // SqlDriver driver = new MSSQLDriver(new MSSQLVersionInfo(new Version("9.0"))); + // Console.WriteLine(driver.Compile(select).CommandText); + // } + + [Test] + public void ConcatTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Concat("a", "b")); + select.Columns.Add("User: " + SqlDml.SessionUser()); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void IsBooleanExpressionTest() + { + SqlExpression ex = !SqlDml.Literal(true) || true; + } + + [Test] + public void JoinTest() + { + SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + SqlTableRef tr3 = SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"]); + + SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0] == tr2[0]).InnerJoin(tr3, tr2[0] == tr3[0])); + sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + int i = 0; + SqlTableRef[] refs = new [] {tr1, tr2, tr3}; + foreach (SqlTable source in select.From) + Assert.AreSame(refs[i++], source); + } + + [Test] + public void UniqueTest() + { + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Contact"])); + s2.Columns.Add(SqlDml.Asterisk); + s1.Columns.Add(SqlDml.Unique(s2) == true); + Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + public void TrueTest() + { + SqlSelect s1 = SqlDml.Select(); + s1.Where = true; + Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + public void UnionTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(s1.From["AddressID"]); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(s2.From["AddressID"]); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(s3.From["AddressID"]); + + Console.WriteLine(sqlDriver.Compile(s1.Union(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); + s3.Where = SqlDml.In(50.00, s1.Union(s2)); + Console.WriteLine(sqlDriver.Compile(s3).GetCommandText()); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); + Assert.Greater(qr.Columns.Count, 0); + } + + [Test] + public void UnionAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); + } + + [Test] + public void IntersectTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); + } + + [Test] + public void IntersectAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2).IntersectAll(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.IntersectAll(s2.IntersectAll(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1, s1.IntersectAll(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.IntersectAll(s1.IntersectAll(s2), s1.IntersectAll(s2))).GetCommandText()); + } + + [Test] + public void ExceptTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.Except(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); + } + + [Test] + public void ExceptAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["Person"].Tables["Address"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2).ExceptAll(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.ExceptAll(s2.ExceptAll(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1, s1.ExceptAll(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.ExceptAll(s1.ExceptAll(s2), s1.ExceptAll(s2))).GetCommandText()); + } + + [Test] + public void FreeTextTest() + { + SqlSelect select = SqlDml.Select(); + var table = Catalog.Schemas["Person"].Tables["Address"]; + select.From = SqlDml.QueryRef(SqlDml.FreeTextTable(table, "How can I make my own beers and ales?", EnumerableUtils.One(table.Columns[0].Name).ToList(), EnumerableUtils.One(table.Columns[0].Name).ToList())); + select.Columns.Add(select.From.Asterisk); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void FreeTextTopNByRankTest() + { + SqlSelect select = SqlDml.Select(); + var table = Catalog.Schemas["Person"].Tables["Address"]; + select.From = SqlDml.QueryRef( SqlDml.FreeTextTable(table, + "How can I make my own beers", + EnumerableUtils.One(table.Columns[0].Name).ToList(), + (SqlLiteral)5)); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void FreeTextCreateTest() + { + var table = Catalog.Schemas["Person"].Tables["Address"]; + var ftindex = table.CreateFullTextIndex(string.Empty); + var ftColumn = ftindex.CreateIndexColumn(table.Columns[1]); + ftColumn.Languages.Add(new Language("English")); + ftindex.UnderlyingUniqueIndex = "PK_Address_AddressID"; + var createIndex = SqlDdl.Create(ftindex); + Console.WriteLine(sqlDriver.Compile(createIndex).GetCommandText()); + + var dropIndex = SqlDdl.Drop(ftindex); + Console.WriteLine(sqlDriver.Compile(dropIndex).GetCommandText()); + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/SavepointsTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/SavepointsTest.cs index acb3bb64c0..cc3caafba7 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/SavepointsTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/SavepointsTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.20 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class SavepointsTest : Sql.SavepointsTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.20 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class SavepointsTest : Sql.SavepointsTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/TypeMappingTest.cs index 826b15dc1a..164b565938 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServer/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServer/TypeMappingTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.08 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServer -{ - [TestFixture] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.08 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServer +{ + [TestFixture] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/DateTimeIntervalTest.cs index a95e0286ed..568c1e39ed 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/DateTimeIntervalTest.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.02 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServerCe -{ - [TestFixture] - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServerCe); - } - - public override void DateTimeSubtractIntervalTest() - { - Assert.Ignore("MSSQL DateTime precision issue"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.02 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServerCe +{ + [TestFixture] + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServerCe); + } + + public override void DateTimeSubtractIntervalTest() + { + Assert.Ignore("MSSQL DateTime precision issue"); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExceptionTypesTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExceptionTypesTest.cs index 68e8aa45cb..2f3a17e99d 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExceptionTypesTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExceptionTypesTest.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.27 - -using NUnit.Framework; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Sql.SqlServerCe -{ - [TestFixture] - public class ExceptionTypesTest : Sql.ExceptionTypesTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServerCe); - } - - public override void CheckConstraintTest() - { - Assert.Ignore("Check constraints are not supported"); - } - - protected override void AssertExceptionType(SqlExceptionType expected, SqlExceptionType actual) - { - if (expected==SqlExceptionType.Deadlock) - expected = SqlExceptionType.OperationTimeout; - base.AssertExceptionType(expected, actual); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.27 + +using NUnit.Framework; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Sql.SqlServerCe +{ + [TestFixture] + public class ExceptionTypesTest : Sql.ExceptionTypesTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServerCe); + } + + public override void CheckConstraintTest() + { + Assert.Ignore("Check constraints are not supported"); + } + + protected override void AssertExceptionType(SqlExceptionType expected, SqlExceptionType actual) + { + if (expected==SqlExceptionType.Deadlock) + expected = SqlExceptionType.OperationTimeout; + base.AssertExceptionType(expected, actual); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExtractorTest.cs index fd28483d1f..88c2b4f828 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/ExtractorTest.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.29 - -using System; -using NUnit.Framework; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.SqlServerCe -{ - [TestFixture, Explicit] - public class ExtractorTest : SqlTest - { - [Test] - public void BaseTest() - { - var schema = ExtractDefaultSchema(); - foreach (var table in schema.Tables) { - Console.WriteLine("Table: " + table.Name); - Console.WriteLine("Columns"); - foreach (var column in table.TableColumns) { - Console.WriteLine(string.Format(" {0}, {1}, {2}, {3}", column.Name, column.DataType, column.IsNullable, column.DefaultValue)); - } - Console.WriteLine("Indexes"); - foreach (var index in table.Indexes) { - Console.WriteLine(string.Format(" {0}, {1}", index.Name, index.IsUnique)); - foreach (var column in index.Columns) { - Console.WriteLine(" "+column.Name); - } - } - Console.WriteLine("Constraints"); - foreach (var constraint in table.TableConstraints) { - var uniqueConstraint = constraint as UniqueConstraint; - if (uniqueConstraint!=null) { - Console.WriteLine(string.Format(" {0}, Primary Key", constraint.Name)); - foreach (var column in uniqueConstraint.Columns) - Console.WriteLine(" " + column.Name); - continue; - } - var foreignKey = constraint as ForeignKey; - if (foreignKey!=null) { - Console.WriteLine(string.Format(" {0}, Foreign Key, {1}, On Update = {2}, On Delete = {3}", constraint.Name, foreignKey.ReferencedTable.Name, foreignKey.OnUpdate, foreignKey.OnDelete)); - foreach (var column in foreignKey.Columns) - Console.WriteLine(" " + column.Name); - continue; - } - } - Console.WriteLine(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.29 + +using System; +using NUnit.Framework; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.SqlServerCe +{ + [TestFixture, Explicit] + public class ExtractorTest : SqlTest + { + [Test] + public void BaseTest() + { + var schema = ExtractDefaultSchema(); + foreach (var table in schema.Tables) { + Console.WriteLine("Table: " + table.Name); + Console.WriteLine("Columns"); + foreach (var column in table.TableColumns) { + Console.WriteLine(string.Format(" {0}, {1}, {2}, {3}", column.Name, column.DataType, column.IsNullable, column.DefaultValue)); + } + Console.WriteLine("Indexes"); + foreach (var index in table.Indexes) { + Console.WriteLine(string.Format(" {0}, {1}", index.Name, index.IsUnique)); + foreach (var column in index.Columns) { + Console.WriteLine(" "+column.Name); + } + } + Console.WriteLine("Constraints"); + foreach (var constraint in table.TableConstraints) { + var uniqueConstraint = constraint as UniqueConstraint; + if (uniqueConstraint!=null) { + Console.WriteLine(string.Format(" {0}, Primary Key", constraint.Name)); + foreach (var column in uniqueConstraint.Columns) + Console.WriteLine(" " + column.Name); + continue; + } + var foreignKey = constraint as ForeignKey; + if (foreignKey!=null) { + Console.WriteLine(string.Format(" {0}, Foreign Key, {1}, On Update = {2}, On Delete = {3}", constraint.Name, foreignKey.ReferencedTable.Name, foreignKey.OnUpdate, foreignKey.OnDelete)); + foreach (var column in foreignKey.Columns) + Console.WriteLine(" " + column.Name); + continue; + } + } + Console.WriteLine(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/TypeMappingTest.cs index 5e03a45d40..3759f95b24 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlServerCe/TypeMappingTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.08 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.SqlServerCe -{ - [TestFixture] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServerCe); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.08 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.SqlServerCe +{ + [TestFixture] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServerCe); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/SqlTest.cs b/Orm/Xtensive.Orm.Tests.Sql/SqlTest.cs index 60a5fee0d0..ed527bdee1 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/SqlTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/SqlTest.cs @@ -1,171 +1,171 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.21 - -using System; -using System.Data; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class SqlTest - { - protected string Url - { - get { return TestConnectionInfoProvider.GetConnectionUrl(); } - } - - protected SqlConnection Connection { get; private set; } - protected SqlDriver Driver { get; private set; } - - [OneTimeSetUp] - public void RealTestFixtureSetUp() - { - CheckRequirements(); - try { - TestFixtureSetUp(); - } - catch (Exception e) { - Console.WriteLine(Url); - Console.WriteLine(e); - throw; - } - } - - [OneTimeTearDown] - public void RealTestFixtureTearDown() - { - TestFixtureTearDown(); - } - - [SetUp] - public virtual void SetUp() - { - } - - [TearDown] - public virtual void TearDown() - { - } - - protected virtual void TestFixtureSetUp() - { - var parsedUrl = UrlInfo.Parse(Url); - Driver = TestSqlDriver.Create(parsedUrl); - Connection = Driver.CreateConnection(); - Connection.Open(); - } - - protected virtual void TestFixtureTearDown() - { - if (Connection!=null && Connection.State==ConnectionState.Open) - Connection.Close(); - } - - protected virtual void CheckRequirements() - { - } - - protected Catalog ExtractCatalog() - { - Catalog model; - try { - Connection.BeginTransaction(); - model = Driver.ExtractCatalog(Connection); - } - finally { - Connection.Rollback(); - } - return model; - } - - protected Schema ExtractSchema(string schemaName) - { - Schema schema; - try { - Connection.BeginTransaction(); - schema = Driver.ExtractSchema(Connection, schemaName); - } - finally { - Connection.Rollback(); - } - return schema; - } - - protected Schema ExtractDefaultSchema() - { - Schema schema; - try { - Connection.BeginTransaction(); - schema = Driver.ExtractDefaultSchema(Connection); - } - finally { - Connection.Rollback(); - } - return schema; - } - - protected int ExecuteNonQuery(string commandText) - { - using (var command = Connection.CreateCommand(commandText)) - return command.ExecuteNonQuery(); - } - - protected int ExecuteNonQuery(SqlConnection connection, string commandText) - { - using (var command = connection.CreateCommand(commandText)) - return command.ExecuteNonQuery(); - } - - protected int ExecuteNonQuery(ISqlCompileUnit statement) - { - using (var command = Connection.CreateCommand(statement)) - return command.ExecuteNonQuery(); - } - - protected int ExecuteNonQuery(SqlConnection connection, ISqlCompileUnit statement) - { - using (var command = connection.CreateCommand(statement)) - return command.ExecuteNonQuery(); - } - - protected object ExecuteScalar(string commandText) - { - using (var command = Connection.CreateCommand(commandText)) - return command.ExecuteScalar(); - } - - protected object ExecuteScalar(SqlConnection connection, string commandText) - { - using (var command = connection.CreateCommand(commandText)) - return command.ExecuteScalar(); - } - - protected object ExecuteScalar(ISqlCompileUnit statement) - { - using (var command = Connection.CreateCommand(statement)) - return command.ExecuteScalar(); - } - - protected object ExecuteScalar(SqlConnection connection, ISqlCompileUnit statement) - { - using (var command = connection.CreateCommand(statement)) - return command.ExecuteScalar(); - } - - protected void EnsureTableNotExists(Schema schema, string tableName) - { - var table = schema.Tables[tableName]; - if (table==null) - return; - ExecuteNonQuery(SqlDdl.Drop(table)); - schema.Tables.Remove(table); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.21 + +using System; +using System.Data; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class SqlTest + { + protected string Url + { + get { return TestConnectionInfoProvider.GetConnectionUrl(); } + } + + protected SqlConnection Connection { get; private set; } + protected SqlDriver Driver { get; private set; } + + [OneTimeSetUp] + public void RealTestFixtureSetUp() + { + CheckRequirements(); + try { + TestFixtureSetUp(); + } + catch (Exception e) { + Console.WriteLine(Url); + Console.WriteLine(e); + throw; + } + } + + [OneTimeTearDown] + public void RealTestFixtureTearDown() + { + TestFixtureTearDown(); + } + + [SetUp] + public virtual void SetUp() + { + } + + [TearDown] + public virtual void TearDown() + { + } + + protected virtual void TestFixtureSetUp() + { + var parsedUrl = UrlInfo.Parse(Url); + Driver = TestSqlDriver.Create(parsedUrl); + Connection = Driver.CreateConnection(); + Connection.Open(); + } + + protected virtual void TestFixtureTearDown() + { + if (Connection!=null && Connection.State==ConnectionState.Open) + Connection.Close(); + } + + protected virtual void CheckRequirements() + { + } + + protected Catalog ExtractCatalog() + { + Catalog model; + try { + Connection.BeginTransaction(); + model = Driver.ExtractCatalog(Connection); + } + finally { + Connection.Rollback(); + } + return model; + } + + protected Schema ExtractSchema(string schemaName) + { + Schema schema; + try { + Connection.BeginTransaction(); + schema = Driver.ExtractSchema(Connection, schemaName); + } + finally { + Connection.Rollback(); + } + return schema; + } + + protected Schema ExtractDefaultSchema() + { + Schema schema; + try { + Connection.BeginTransaction(); + schema = Driver.ExtractDefaultSchema(Connection); + } + finally { + Connection.Rollback(); + } + return schema; + } + + protected int ExecuteNonQuery(string commandText) + { + using (var command = Connection.CreateCommand(commandText)) + return command.ExecuteNonQuery(); + } + + protected int ExecuteNonQuery(SqlConnection connection, string commandText) + { + using (var command = connection.CreateCommand(commandText)) + return command.ExecuteNonQuery(); + } + + protected int ExecuteNonQuery(ISqlCompileUnit statement) + { + using (var command = Connection.CreateCommand(statement)) + return command.ExecuteNonQuery(); + } + + protected int ExecuteNonQuery(SqlConnection connection, ISqlCompileUnit statement) + { + using (var command = connection.CreateCommand(statement)) + return command.ExecuteNonQuery(); + } + + protected object ExecuteScalar(string commandText) + { + using (var command = Connection.CreateCommand(commandText)) + return command.ExecuteScalar(); + } + + protected object ExecuteScalar(SqlConnection connection, string commandText) + { + using (var command = connection.CreateCommand(commandText)) + return command.ExecuteScalar(); + } + + protected object ExecuteScalar(ISqlCompileUnit statement) + { + using (var command = Connection.CreateCommand(statement)) + return command.ExecuteScalar(); + } + + protected object ExecuteScalar(SqlConnection connection, ISqlCompileUnit statement) + { + using (var command = connection.CreateCommand(statement)) + return command.ExecuteScalar(); + } + + protected void EnsureTableNotExists(Schema schema, string tableName) + { + var table = schema.Tables[tableName]; + if (table==null) + return; + ExecuteNonQuery(SqlDdl.Drop(table)); + schema.Tables.Remove(table); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/Chinook.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/Chinook.cs index c286e5471a..7ebadefef5 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/Chinook.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/Chinook.cs @@ -1,139 +1,139 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.03.17 - -using System; -using System.Data; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - [TestFixture, Explicit] - public abstract class Chinook - { - protected struct DbCommandExecutionResult - { - public int FieldCount; - public string[] FieldNames; - public int RowCount; - - public override string ToString() - { - if (FieldNames == null) - FieldNames = new string[0]; - return string.Format("Fields: '{0}'; Rows: {1}", string.Join("', '", FieldNames), RowCount); - } - } - - protected SqlDriver sqlDriver; - protected SqlConnection sqlConnection; - - protected string Url { get { return TestConnectionInfoProvider.GetConnectionUrl(); } } - public Catalog Catalog { get; protected set; } - - [OneTimeSetUp] - public virtual void SetUp() - { - CheckRequirements(); - sqlDriver = TestSqlDriver.Create(Url); - sqlConnection = sqlDriver.CreateConnection(); - try { - sqlConnection.Open(); - } - catch (Exception exception) { - Console.WriteLine(exception); - throw; - } - try { - sqlConnection.BeginTransaction(); - Catalog = sqlDriver.ExtractCatalog(sqlConnection); - var schema = Catalog.DefaultSchema; - - var creator = new ChinookSchemaCreator(sqlDriver); - creator.DropSchemaContent(sqlConnection, schema); - creator.CreateSchemaContent(sqlConnection, schema); - - sqlConnection.Commit(); - } - catch { - sqlConnection.Rollback(); - throw; - } - } - - [OneTimeTearDown] - public void TearDown() - { - try { - if (sqlConnection!=null && sqlConnection.State!=ConnectionState.Closed) - sqlConnection.Close(); - } - catch (Exception ex) { - Console.WriteLine(ex.Message); - } - } - - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite); - } - - protected static DbCommandExecutionResult GetExecuteDataReaderResult(IDbCommand cmd) - { - DbCommandExecutionResult result = new DbCommandExecutionResult(); - try { - cmd.Transaction = cmd.Connection.BeginTransaction(); - int rowCount = 0; - int fieldCount = 0; - string[] fieldNames = new string[0]; - using (IDataReader reader = cmd.ExecuteReader()) { - while (reader.Read()) { - if (rowCount==0) { - fieldCount = reader.FieldCount; - fieldNames = new string[fieldCount]; - for (int i = 0; i < fieldCount; i++) - fieldNames[i] = reader.GetName(i); - } - rowCount++; - } - } - result.RowCount = rowCount; - result.FieldCount = fieldCount; - result.FieldNames = fieldNames; - } - // catch (Exception e) { - // Console.WriteLine(e); - // } - finally { - cmd.Transaction.Rollback(); - } - return result; - } - - protected static DbCommandExecutionResult GetExecuteNonQueryResult(IDbCommand cmd) - { - DbCommandExecutionResult result = new DbCommandExecutionResult(); - try { - cmd.Transaction = cmd.Connection.BeginTransaction(); - result.RowCount = cmd.ExecuteNonQuery(); - } - // catch (Exception e) { - // Console.WriteLine(e); - // } - finally { - cmd.Transaction.Rollback(); - } - return result; - } - - protected SqlCompilationResult Compile(ISqlCompileUnit statement) - { - return sqlDriver.Compile(statement); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.03.17 + +using System; +using System.Data; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + [TestFixture, Explicit] + public abstract class Chinook + { + protected struct DbCommandExecutionResult + { + public int FieldCount; + public string[] FieldNames; + public int RowCount; + + public override string ToString() + { + if (FieldNames == null) + FieldNames = new string[0]; + return string.Format("Fields: '{0}'; Rows: {1}", string.Join("', '", FieldNames), RowCount); + } + } + + protected SqlDriver sqlDriver; + protected SqlConnection sqlConnection; + + protected string Url { get { return TestConnectionInfoProvider.GetConnectionUrl(); } } + public Catalog Catalog { get; protected set; } + + [OneTimeSetUp] + public virtual void SetUp() + { + CheckRequirements(); + sqlDriver = TestSqlDriver.Create(Url); + sqlConnection = sqlDriver.CreateConnection(); + try { + sqlConnection.Open(); + } + catch (Exception exception) { + Console.WriteLine(exception); + throw; + } + try { + sqlConnection.BeginTransaction(); + Catalog = sqlDriver.ExtractCatalog(sqlConnection); + var schema = Catalog.DefaultSchema; + + var creator = new ChinookSchemaCreator(sqlDriver); + creator.DropSchemaContent(sqlConnection, schema); + creator.CreateSchemaContent(sqlConnection, schema); + + sqlConnection.Commit(); + } + catch { + sqlConnection.Rollback(); + throw; + } + } + + [OneTimeTearDown] + public void TearDown() + { + try { + if (sqlConnection!=null && sqlConnection.State!=ConnectionState.Closed) + sqlConnection.Close(); + } + catch (Exception ex) { + Console.WriteLine(ex.Message); + } + } + + protected virtual void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite); + } + + protected static DbCommandExecutionResult GetExecuteDataReaderResult(IDbCommand cmd) + { + DbCommandExecutionResult result = new DbCommandExecutionResult(); + try { + cmd.Transaction = cmd.Connection.BeginTransaction(); + int rowCount = 0; + int fieldCount = 0; + string[] fieldNames = new string[0]; + using (IDataReader reader = cmd.ExecuteReader()) { + while (reader.Read()) { + if (rowCount==0) { + fieldCount = reader.FieldCount; + fieldNames = new string[fieldCount]; + for (int i = 0; i < fieldCount; i++) + fieldNames[i] = reader.GetName(i); + } + rowCount++; + } + } + result.RowCount = rowCount; + result.FieldCount = fieldCount; + result.FieldNames = fieldNames; + } + // catch (Exception e) { + // Console.WriteLine(e); + // } + finally { + cmd.Transaction.Rollback(); + } + return result; + } + + protected static DbCommandExecutionResult GetExecuteNonQueryResult(IDbCommand cmd) + { + DbCommandExecutionResult result = new DbCommandExecutionResult(); + try { + cmd.Transaction = cmd.Connection.BeginTransaction(); + result.RowCount = cmd.ExecuteNonQuery(); + } + // catch (Exception e) { + // Console.WriteLine(e); + // } + finally { + cmd.Transaction.Rollback(); + } + return result; + } + + protected SqlCompilationResult Compile(ISqlCompileUnit statement) + { + return sqlDriver.Compile(statement); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookSchemaCreator.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookSchemaCreator.cs index 880f93ca4d..13e68b10bc 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookSchemaCreator.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookSchemaCreator.cs @@ -1,373 +1,373 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.03 - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Xml.Linq; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - internal class ChinookSchemaCreator - { - private class XmlTable - { - public string Name { get; set; } - public Dictionary ColumnTypes { get; set; } - public IEnumerable Rows { get; set; } - } - - private readonly SqlDriver driver; - - public void DropSchemaContent(SqlConnection connection, Schema defaultSchema) - { - DropTables(connection, defaultSchema); - } - - public void CreateSchemaContent(SqlConnection connection, Schema defaultSchema) - { - CreateTables(connection, defaultSchema); - CreateViews(connection, defaultSchema); - FillTables(connection, defaultSchema); - } - - private void DropTables(SqlConnection connection, Schema defaultSchema) - { - foreach (var tableName in GetTableNamesToDrop()) { - var existingTable = defaultSchema.Tables[tableName]; - if (existingTable==null) - continue; - ExecuteDropTable(connection, existingTable); - defaultSchema.Tables.Remove(existingTable); - } - } - - private void DropViews(SqlConnection connection, Schema defaultSchema) - { - var existingView = defaultSchema.Views["Invoice Subtotals"]; - if (existingView==null) - return; - ExecuteDropView(connection, existingView); - defaultSchema.Views.Remove(existingView); - - } - - private void CreateTables(SqlConnection connection, Schema defaultSchema) - { - var t = defaultSchema.CreateTable("Employee"); - - CreateInt32Column(t, "EmployeeId", false); - CreateStringColumn(t, "Title", true, 30); - CreateDateTimeColumn(t, "BirthDate", true); - CreateDateTimeColumn(t, "HireDate", true); - CreateInt32Column(t, "ReportsTo", true); - CreateStringColumn(t, "LastName", false, 20); - CreateStringColumn(t, "FirstName", false, 20); - CreateStringColumn(t, "StreetAddress", true, 70); - CreateStringColumn(t, "City", true, 40); - CreateStringColumn(t, "State", true, 40); - CreateStringColumn(t, "Country", true, 40); - CreateStringColumn(t, "PostalCode", true, 10); - CreateStringColumn(t, "Phone", true, 24); - CreateStringColumn(t, "Fax", true, 24); - CreateStringColumn(t, "Email", true, 60); - t.CreatePrimaryKey("PK_Employee", t.TableColumns["EmployeeId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Customer"); - CreateInt32Column(t, "CustomerId", false); - CreateInt32Column(t, "SupportRepId", false); - CreateStringColumn(t, "CompanyName", true, 80); - CreateStringColumn(t, "LastName", true, 20); - CreateStringColumn(t, "FirstName", true, 20); - CreateStringColumn(t, "StreetAddress", true, 70); - CreateStringColumn(t, "City", true, 40); - CreateStringColumn(t, "State", true, 40); - CreateStringColumn(t, "Country", true, 40); - CreateStringColumn(t, "PostalCode", true, 10); - CreateStringColumn(t, "Phone", true, 24); - CreateStringColumn(t, "Fax", true, 24); - CreateStringColumn(t, "Email", true, 60); - t.CreatePrimaryKey("PK_Customer", t.TableColumns["CustomerId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Album"); - CreateInt32Column(t, "AlbumId", false); - CreateStringColumn(t, "Title", false, 160); - CreateInt32Column(t, "ArtistId", true); - t.CreatePrimaryKey("PK_Album", t.TableColumns["AlbumId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Artist"); - CreateInt32Column(t, "ArtistId", false); - CreateStringColumn(t, "Name", false, 120); - t.CreatePrimaryKey("PK_Artist", t.TableColumns["ArtistId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Genre"); - CreateInt32Column(t, "GenreId", false); - CreateStringColumn(t, "Name", false, 120); - t.CreatePrimaryKey("PK_Genre", t.TableColumns["GenreId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Invoice"); - CreateInt32Column(t, "InvoiceId", false); - CreateDateTimeColumn(t, "InvoiceDate", false); - CreateDateTimeColumn(t, "PaymentDate", true); - CreateInt32Column(t, "Status", false); - CreateInt64Column(t, "ProcessingTime", true); - CreateStringColumn(t, "BillingStreetAddress", true, 70); - CreateStringColumn(t, "BillingCity", true, 40); - CreateStringColumn(t, "BillingState", true, 40); - CreateStringColumn(t, "BillingCountry", true, 40); - CreateStringColumn(t, "BillingPostalCode", true, 10); - CreateDecimalColumn(t, "Total", false, 38, 19); - CreateDecimalColumn(t, "Commission", true, 38, 19); - CreateInt32Column(t, "CustomerId", true); - CreateInt32Column(t, "DesignatedEmployeeId", true); - t.CreatePrimaryKey("PK_Invoice", t.TableColumns["InvoiceId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("InvoiceLine"); - CreateInt32Column(t, "InvoiceLineId", false); - CreateDecimalColumn(t, "UnitPrice", false, 38, 19); - CreateInt16Column(t, "Quantity", false); - CreateInt32Column(t, "InvoiceId", false); - CreateInt32Column(t, "TrackId", false); - - t.CreatePrimaryKey("PK_InvoiceLine", t.TableColumns["InvoiceLineId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("MediaType"); - CreateInt32Column(t, "MediaTypeId", false); - CreateStringColumn(t, "Name", false, 120); - t.CreatePrimaryKey("PK_MediaType", t.TableColumns["MediaTypeId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Playlist"); - CreateInt32Column(t, "PlaylistId", false); - CreateStringColumn(t, "Name", false, 120); - t.CreatePrimaryKey("PK_Playlist", t.TableColumns["PlaylistId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("Track"); - CreateInt32Column(t, "TrackId", false); - CreateStringColumn(t, "Name", false, 200); - CreateStringColumn(t, "Composer", true, 220); - CreateInt32Column(t, "Milliseconds", false); - CreateByteArrayColumn(t, "Bytes", true, 4000); - CreateDecimalColumn(t, "UnitPrice", true, 38, 19); - CreateInt32Column(t, "AlbumId", true); - CreateInt32Column(t, "MediaTypeId", true); - CreateInt32Column(t, "GenreId", true); - CreateInt32Column(t, "MediaFormat", true); - t.CreatePrimaryKey("PK_Track", t.TableColumns["TrackId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - - t = defaultSchema.CreateTable("PlaylistTrack"); - CreateInt32Column(t, "PlaylistId", false); - CreateInt32Column(t, "TrackId", false); - t.CreatePrimaryKey("PK_PlaylistTrack", t.TableColumns["PlaylistId"], t.TableColumns["TrackId"]).IsClustered = true; - ExecuteCreateTable(connection, t); - } - - private void CreateViews(SqlConnection connection, Schema defaultSchema) - { - var v = defaultSchema.CreateView("Invoice Subtotals"); - v.Definition = new SqlNative( - @"SELECT [InvoiceLine].InvoiceId, - Sum([InvoiceLine].UnitPrice) AS Subtotal - FROM [InvoiceLine] - GROUP BY [InvoiceLine].InvoiceID"); - - ExecuteCreateView(connection, v); - } - - private void FillTables(SqlConnection connection, Schema defaultSchema) - { - // as long as Xtensive.Orm.Tests project contains Chinook.xml we don't need separate xml file - var path = @"Chinook.xml"; - var xmlTables = ReadXml(path); - foreach (var xmlTable in xmlTables) { - var sqlTable = defaultSchema.Tables[xmlTable.Name]; - if (sqlTable==null) - continue; - foreach (var row in xmlTable.Rows) - ExecuteInsert(connection, sqlTable, GetColumnValues(row, xmlTable.ColumnTypes)); - } - } - - private static Dictionary GetColumnValues(XElement row, Dictionary columnTypes) - { - var fields = new Dictionary(); - var elements = row.Elements().ToList(); - for (int i = 0; i < elements.Count(); i++) { - var value = elements[i].Value; - object obj = null; - if (!string.IsNullOrEmpty(value)) { - obj = ConvertFieldType(columnTypes[elements[i].Name.LocalName], elements[i].Value); - } - fields.Add(elements[i].Name.LocalName, obj); - } - return fields; - } - - private static object ConvertFieldType(string columnType, string text) - { - var type = Type.GetType(columnType); - switch (columnType) { - case "System.Byte[]": - return Convert.FromBase64String(text); - case "System.Decimal": - return Decimal.Parse(text, CultureInfo.InvariantCulture); - case "System.Single": - return Single.Parse(text, CultureInfo.InvariantCulture); - case "System.DateTime": - return DateTime.Parse(text); - case "System.TimeSpan": - return TimeSpan.FromTicks(Int64.Parse(text, CultureInfo.InvariantCulture)); - default: - return Convert.ChangeType(text, type, CultureInfo.InvariantCulture); - } - } - - private static List ReadXml(string path) - { - var doc = XDocument.Load(path); - var root = doc.Element("root"); - if (root==null) - throw new Exception("Read xml error"); - var tables = root.Elements(); - var list = new List(); - - foreach (var table in tables) { - var xmlTable = new XmlTable(); - xmlTable.Name = table.Name.LocalName; - xmlTable.ColumnTypes = table.Element("Columns").Elements().ToDictionary(key => key.Name.LocalName, value => value.Value); - xmlTable.Rows = table.Element("Rows").Elements(); - list.Add(xmlTable); - } - return list; - } - - private void ExecuteCreateTable(SqlConnection connection, Table table) - { - var createTableQuery = SqlDdl.Create(table); - using (var command = connection.CreateCommand(createTableQuery)) - command.ExecuteNonQuery(); - } - - private void ExecuteCreateView(SqlConnection connection, View view) - { - var createViewQuery = SqlDdl.Create(view); - using (var command = connection.CreateCommand(createViewQuery)) - command.ExecuteNonQuery(); - } - - private void ExecuteDropTable(SqlConnection connection, Table table) - { - var createTableQuery = SqlDdl.Drop(table); - using (var command = connection.CreateCommand(createTableQuery)) - command.ExecuteNonQuery(); - } - - private void ExecuteDropView(SqlConnection connection, View view) - { - var createViewQuery = SqlDdl.Drop(view); - using (var command = connection.CreateCommand(createViewQuery)) - command.ExecuteNonQuery(); - } - - private void ExecuteInsert(SqlConnection connection, Table table, Dictionary values) - { - var tableRef = SqlDml.TableRef(table); - SqlInsert insertQuery = SqlDml.Insert(tableRef); - foreach (var nameValue in values) { - if (nameValue.Value!=null) - insertQuery.Values.Add(tableRef[nameValue.Key], SqlDml.Literal(nameValue.Value)); - else - insertQuery.Values.Add(tableRef[nameValue.Key], SqlDml.Null); - } - - using (var command = connection.CreateCommand(insertQuery)) { - Console.WriteLine(command.CommandText); - command.ExecuteNonQuery(); - } - } - - - private void CreateInt16Column(Table table, string name, bool nullable) - { - CreateTableColumn(table, name, nullable, null, null, null); - } - - private void CreateInt32Column(Table table, string name, bool nullable) - { - CreateTableColumn(table, name, nullable, null, null, null); - } - - private void CreateInt64Column(Table table, string name, bool nullable) - { - CreateTableColumn(table, name, nullable, null, null, null); - } - - private void CreateStringColumn(Table table, string name, bool nullable, int? length) - { - CreateTableColumn(table, name, nullable, length, null, null); - } - - private void CreateDateTimeColumn(Table table, string name, bool nullable) - { - CreateTableColumn(table, name, nullable, null, null, null); - } - - private void CreateByteArrayColumn(Table table, string name, bool nullable, int length) - { - CreateTableColumn(table, name, nullable, length, null, null); - } - - private void CreateDecimalColumn(Table table, string name, bool nullable, int? precision, int? scale) - { - CreateTableColumn(table, name, nullable, null, precision, scale); - } - - private TableColumn CreateTableColumn(Table table, string name, bool isNullable, int? lenght, int? precision, int? scale) - { - var type = typeof(T); - var sqlType = driver.TypeMappings.GetMapping(type).MapType(lenght, precision, scale); - var column = table.CreateColumn(name, sqlType); - column.IsNullable = isNullable; - return column; - } - - private IEnumerable GetTableNamesToDrop() - { - return new string[] { - "Album", - "Artist", - "Genre", - "InvoiceLine", - "Track", - "MediaType", - "Playlist", - "Invoice", - "Employee", - "Customer", - "Region", - "PlaylistTrack", - }; - } - - public ChinookSchemaCreator(SqlDriver driver) - { - this.driver = driver; - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.03 + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Xml.Linq; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + internal class ChinookSchemaCreator + { + private class XmlTable + { + public string Name { get; set; } + public Dictionary ColumnTypes { get; set; } + public IEnumerable Rows { get; set; } + } + + private readonly SqlDriver driver; + + public void DropSchemaContent(SqlConnection connection, Schema defaultSchema) + { + DropTables(connection, defaultSchema); + } + + public void CreateSchemaContent(SqlConnection connection, Schema defaultSchema) + { + CreateTables(connection, defaultSchema); + CreateViews(connection, defaultSchema); + FillTables(connection, defaultSchema); + } + + private void DropTables(SqlConnection connection, Schema defaultSchema) + { + foreach (var tableName in GetTableNamesToDrop()) { + var existingTable = defaultSchema.Tables[tableName]; + if (existingTable==null) + continue; + ExecuteDropTable(connection, existingTable); + defaultSchema.Tables.Remove(existingTable); + } + } + + private void DropViews(SqlConnection connection, Schema defaultSchema) + { + var existingView = defaultSchema.Views["Invoice Subtotals"]; + if (existingView==null) + return; + ExecuteDropView(connection, existingView); + defaultSchema.Views.Remove(existingView); + + } + + private void CreateTables(SqlConnection connection, Schema defaultSchema) + { + var t = defaultSchema.CreateTable("Employee"); + + CreateInt32Column(t, "EmployeeId", false); + CreateStringColumn(t, "Title", true, 30); + CreateDateTimeColumn(t, "BirthDate", true); + CreateDateTimeColumn(t, "HireDate", true); + CreateInt32Column(t, "ReportsTo", true); + CreateStringColumn(t, "LastName", false, 20); + CreateStringColumn(t, "FirstName", false, 20); + CreateStringColumn(t, "StreetAddress", true, 70); + CreateStringColumn(t, "City", true, 40); + CreateStringColumn(t, "State", true, 40); + CreateStringColumn(t, "Country", true, 40); + CreateStringColumn(t, "PostalCode", true, 10); + CreateStringColumn(t, "Phone", true, 24); + CreateStringColumn(t, "Fax", true, 24); + CreateStringColumn(t, "Email", true, 60); + t.CreatePrimaryKey("PK_Employee", t.TableColumns["EmployeeId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Customer"); + CreateInt32Column(t, "CustomerId", false); + CreateInt32Column(t, "SupportRepId", false); + CreateStringColumn(t, "CompanyName", true, 80); + CreateStringColumn(t, "LastName", true, 20); + CreateStringColumn(t, "FirstName", true, 20); + CreateStringColumn(t, "StreetAddress", true, 70); + CreateStringColumn(t, "City", true, 40); + CreateStringColumn(t, "State", true, 40); + CreateStringColumn(t, "Country", true, 40); + CreateStringColumn(t, "PostalCode", true, 10); + CreateStringColumn(t, "Phone", true, 24); + CreateStringColumn(t, "Fax", true, 24); + CreateStringColumn(t, "Email", true, 60); + t.CreatePrimaryKey("PK_Customer", t.TableColumns["CustomerId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Album"); + CreateInt32Column(t, "AlbumId", false); + CreateStringColumn(t, "Title", false, 160); + CreateInt32Column(t, "ArtistId", true); + t.CreatePrimaryKey("PK_Album", t.TableColumns["AlbumId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Artist"); + CreateInt32Column(t, "ArtistId", false); + CreateStringColumn(t, "Name", false, 120); + t.CreatePrimaryKey("PK_Artist", t.TableColumns["ArtistId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Genre"); + CreateInt32Column(t, "GenreId", false); + CreateStringColumn(t, "Name", false, 120); + t.CreatePrimaryKey("PK_Genre", t.TableColumns["GenreId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Invoice"); + CreateInt32Column(t, "InvoiceId", false); + CreateDateTimeColumn(t, "InvoiceDate", false); + CreateDateTimeColumn(t, "PaymentDate", true); + CreateInt32Column(t, "Status", false); + CreateInt64Column(t, "ProcessingTime", true); + CreateStringColumn(t, "BillingStreetAddress", true, 70); + CreateStringColumn(t, "BillingCity", true, 40); + CreateStringColumn(t, "BillingState", true, 40); + CreateStringColumn(t, "BillingCountry", true, 40); + CreateStringColumn(t, "BillingPostalCode", true, 10); + CreateDecimalColumn(t, "Total", false, 38, 19); + CreateDecimalColumn(t, "Commission", true, 38, 19); + CreateInt32Column(t, "CustomerId", true); + CreateInt32Column(t, "DesignatedEmployeeId", true); + t.CreatePrimaryKey("PK_Invoice", t.TableColumns["InvoiceId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("InvoiceLine"); + CreateInt32Column(t, "InvoiceLineId", false); + CreateDecimalColumn(t, "UnitPrice", false, 38, 19); + CreateInt16Column(t, "Quantity", false); + CreateInt32Column(t, "InvoiceId", false); + CreateInt32Column(t, "TrackId", false); + + t.CreatePrimaryKey("PK_InvoiceLine", t.TableColumns["InvoiceLineId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("MediaType"); + CreateInt32Column(t, "MediaTypeId", false); + CreateStringColumn(t, "Name", false, 120); + t.CreatePrimaryKey("PK_MediaType", t.TableColumns["MediaTypeId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Playlist"); + CreateInt32Column(t, "PlaylistId", false); + CreateStringColumn(t, "Name", false, 120); + t.CreatePrimaryKey("PK_Playlist", t.TableColumns["PlaylistId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("Track"); + CreateInt32Column(t, "TrackId", false); + CreateStringColumn(t, "Name", false, 200); + CreateStringColumn(t, "Composer", true, 220); + CreateInt32Column(t, "Milliseconds", false); + CreateByteArrayColumn(t, "Bytes", true, 4000); + CreateDecimalColumn(t, "UnitPrice", true, 38, 19); + CreateInt32Column(t, "AlbumId", true); + CreateInt32Column(t, "MediaTypeId", true); + CreateInt32Column(t, "GenreId", true); + CreateInt32Column(t, "MediaFormat", true); + t.CreatePrimaryKey("PK_Track", t.TableColumns["TrackId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + + t = defaultSchema.CreateTable("PlaylistTrack"); + CreateInt32Column(t, "PlaylistId", false); + CreateInt32Column(t, "TrackId", false); + t.CreatePrimaryKey("PK_PlaylistTrack", t.TableColumns["PlaylistId"], t.TableColumns["TrackId"]).IsClustered = true; + ExecuteCreateTable(connection, t); + } + + private void CreateViews(SqlConnection connection, Schema defaultSchema) + { + var v = defaultSchema.CreateView("Invoice Subtotals"); + v.Definition = new SqlNative( + @"SELECT [InvoiceLine].InvoiceId, + Sum([InvoiceLine].UnitPrice) AS Subtotal + FROM [InvoiceLine] + GROUP BY [InvoiceLine].InvoiceID"); + + ExecuteCreateView(connection, v); + } + + private void FillTables(SqlConnection connection, Schema defaultSchema) + { + // as long as Xtensive.Orm.Tests project contains Chinook.xml we don't need separate xml file + var path = @"Chinook.xml"; + var xmlTables = ReadXml(path); + foreach (var xmlTable in xmlTables) { + var sqlTable = defaultSchema.Tables[xmlTable.Name]; + if (sqlTable==null) + continue; + foreach (var row in xmlTable.Rows) + ExecuteInsert(connection, sqlTable, GetColumnValues(row, xmlTable.ColumnTypes)); + } + } + + private static Dictionary GetColumnValues(XElement row, Dictionary columnTypes) + { + var fields = new Dictionary(); + var elements = row.Elements().ToList(); + for (int i = 0; i < elements.Count(); i++) { + var value = elements[i].Value; + object obj = null; + if (!string.IsNullOrEmpty(value)) { + obj = ConvertFieldType(columnTypes[elements[i].Name.LocalName], elements[i].Value); + } + fields.Add(elements[i].Name.LocalName, obj); + } + return fields; + } + + private static object ConvertFieldType(string columnType, string text) + { + var type = Type.GetType(columnType); + switch (columnType) { + case "System.Byte[]": + return Convert.FromBase64String(text); + case "System.Decimal": + return Decimal.Parse(text, CultureInfo.InvariantCulture); + case "System.Single": + return Single.Parse(text, CultureInfo.InvariantCulture); + case "System.DateTime": + return DateTime.Parse(text); + case "System.TimeSpan": + return TimeSpan.FromTicks(Int64.Parse(text, CultureInfo.InvariantCulture)); + default: + return Convert.ChangeType(text, type, CultureInfo.InvariantCulture); + } + } + + private static List ReadXml(string path) + { + var doc = XDocument.Load(path); + var root = doc.Element("root"); + if (root==null) + throw new Exception("Read xml error"); + var tables = root.Elements(); + var list = new List(); + + foreach (var table in tables) { + var xmlTable = new XmlTable(); + xmlTable.Name = table.Name.LocalName; + xmlTable.ColumnTypes = table.Element("Columns").Elements().ToDictionary(key => key.Name.LocalName, value => value.Value); + xmlTable.Rows = table.Element("Rows").Elements(); + list.Add(xmlTable); + } + return list; + } + + private void ExecuteCreateTable(SqlConnection connection, Table table) + { + var createTableQuery = SqlDdl.Create(table); + using (var command = connection.CreateCommand(createTableQuery)) + command.ExecuteNonQuery(); + } + + private void ExecuteCreateView(SqlConnection connection, View view) + { + var createViewQuery = SqlDdl.Create(view); + using (var command = connection.CreateCommand(createViewQuery)) + command.ExecuteNonQuery(); + } + + private void ExecuteDropTable(SqlConnection connection, Table table) + { + var createTableQuery = SqlDdl.Drop(table); + using (var command = connection.CreateCommand(createTableQuery)) + command.ExecuteNonQuery(); + } + + private void ExecuteDropView(SqlConnection connection, View view) + { + var createViewQuery = SqlDdl.Drop(view); + using (var command = connection.CreateCommand(createViewQuery)) + command.ExecuteNonQuery(); + } + + private void ExecuteInsert(SqlConnection connection, Table table, Dictionary values) + { + var tableRef = SqlDml.TableRef(table); + SqlInsert insertQuery = SqlDml.Insert(tableRef); + foreach (var nameValue in values) { + if (nameValue.Value!=null) + insertQuery.Values.Add(tableRef[nameValue.Key], SqlDml.Literal(nameValue.Value)); + else + insertQuery.Values.Add(tableRef[nameValue.Key], SqlDml.Null); + } + + using (var command = connection.CreateCommand(insertQuery)) { + Console.WriteLine(command.CommandText); + command.ExecuteNonQuery(); + } + } + + + private void CreateInt16Column(Table table, string name, bool nullable) + { + CreateTableColumn(table, name, nullable, null, null, null); + } + + private void CreateInt32Column(Table table, string name, bool nullable) + { + CreateTableColumn(table, name, nullable, null, null, null); + } + + private void CreateInt64Column(Table table, string name, bool nullable) + { + CreateTableColumn(table, name, nullable, null, null, null); + } + + private void CreateStringColumn(Table table, string name, bool nullable, int? length) + { + CreateTableColumn(table, name, nullable, length, null, null); + } + + private void CreateDateTimeColumn(Table table, string name, bool nullable) + { + CreateTableColumn(table, name, nullable, null, null, null); + } + + private void CreateByteArrayColumn(Table table, string name, bool nullable, int length) + { + CreateTableColumn(table, name, nullable, length, null, null); + } + + private void CreateDecimalColumn(Table table, string name, bool nullable, int? precision, int? scale) + { + CreateTableColumn(table, name, nullable, null, precision, scale); + } + + private TableColumn CreateTableColumn(Table table, string name, bool isNullable, int? lenght, int? precision, int? scale) + { + var type = typeof(T); + var sqlType = driver.TypeMappings.GetMapping(type).MapType(lenght, precision, scale); + var column = table.CreateColumn(name, sqlType); + column.IsNullable = isNullable; + return column; + } + + private IEnumerable GetTableNamesToDrop() + { + return new string[] { + "Album", + "Artist", + "Genre", + "InvoiceLine", + "Track", + "MediaType", + "Playlist", + "Invoice", + "Employee", + "Customer", + "Region", + "PlaylistTrack", + }; + } + + public ChinookSchemaCreator(SqlDriver driver) + { + this.driver = driver; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookTest.cs index 3d768dfd6f..28205d682e 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ChinookTest.cs @@ -1,960 +1,960 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.06.10 - -using System; -using System.Data; -using System.Data.Common; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - public class ChinookTest : Chinook - { - private DbCommand dbCommand; - private DbCommand sqlCommand; - - private Schema schema = null; - - [OneTimeSetUp] - public override void SetUp() - { - base.SetUp(); - dbCommand = sqlConnection.CreateCommand(); - sqlCommand = sqlConnection.CreateCommand(); - - schema = Catalog.DefaultSchema; - } - - #region Internals - - private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteDataReaderResult(dbCommand); - r2 = GetExecuteDataReaderResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - if (r1.FieldCount!=r2.FieldCount) - return false; - for (int i = 0; i < r1.FieldCount; i++) { - if (r1.FieldNames[i]!=r2.FieldNames[i]) - return false; - } - return true; - } - - private bool CompareExecuteNonQuery(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteNonQueryResult(dbCommand); - r2 = GetExecuteNonQueryResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - return true; - } - - #endregion - - //SET CHARACTER SET utf8 - - [Test] - public void TestExtractCatalog() - { - Assert.GreaterOrEqual(Catalog.Schemas.Count, 1); - } - - [Test] - public void Test000() - { - string nativeSql = @"SELECT - employee.EmployeeID, - employee.FirstName, - employee.LastName, - employee.BirthDate - FROM - employee - WHERE - employee.FirstName = 'Robert' - ORDER BY - employee.LastName"; - - var p = sqlCommand.CreateParameter(); - p.ParameterName = "p1"; - p.DbType = DbType.String; - p.Value = "Robert"; - sqlCommand.Parameters.Add(p); - - SqlTableRef employees = SqlDml.TableRef(schema.Tables["employee"]); - SqlSelect select = SqlDml.Select(employees); - select.Columns.AddRange(employees["EmployeeId"], employees["FirstName"], employees["LastName"], employees["BirthDate"]); - select.Where = employees["FirstName"]==SqlDml.ParameterRef(p.ParameterName); - select.OrderBy.Add(employees["LastName"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test001() - { - string nativeSql = @"SELECT DISTINCT - employee.FirstName - FROM - employee - WHERE - employee.Title = 'IT Staff'"; - - var p = sqlCommand.CreateParameter(); - p.ParameterName = "p10"; - p.DbType = DbType.String; - p.Value = "IT Staff"; - sqlCommand.Parameters.Add(p); - - SqlTableRef employees = SqlDml.TableRef(schema.Tables["employee"]); - SqlSelect select = SqlDml.Select(employees); - select.Distinct = true; - select.Columns.AddRange(employees["FirstName"]); - select.Where = employees["Title"]==SqlDml.ParameterRef(p.ParameterName); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test002() - { - string nativeSql = "SELECT * FROM [genre] a"; - - SqlTableRef region = SqlDml.TableRef(Catalog.Schemas["main"].Tables["genre"]); - SqlSelect select = SqlDml.Select(region); - select.Columns.Add(SqlDml.Asterisk); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test003() - { - string nativeSql = "SELECT [a].[EmployeeId], [a].[FirstName], [a].[LastName] FROM [Employee] [a] WHERE ([a].[EmployeeId] < 2) ORDER BY [a].[FirstName] ASC, 3 DESC"; - - SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["main"].Tables["Employee"]); - SqlSelect select = SqlDml.Select(customer); - select.Columns.AddRange(customer["EmployeeId"], customer["FirstName"], customer["LastName"]); - select.Where = customer["EmployeeId"] < 2; - select.OrderBy.Add(customer["FirstName"]); - select.OrderBy.Add(3, false); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test006() - { - SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"]); - SqlSelect select = SqlDml.Select(orders); - select.Columns.Add(SqlDml.Asterisk); - select.Where = orders["PaymentDate"] > new DateTime(2013, 8, 1); - select.OrderBy.Add(orders["PaymentDate"], false); - - sqlCommand.CommandText = Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); - Assert.AreEqual(14, r.RowCount); - } - - [Test] - public void Test007() - { - SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"]); - SqlSelect select = SqlDml.Select(orders); - select.Limit = 10; - select.Columns.Add(SqlDml.Asterisk); - - sqlCommand.CommandText = Compile(select).GetCommandText(); - sqlCommand.Prepare(); - - DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); - Assert.AreEqual(10, r.RowCount); - } - - [Test] - public void Test008() - { - string nativeSql = @"SELECT - t.TrackId, - t.[Name], - a.[Title] - FROM - Track t - INNER JOIN Album a ON (t.AlbumId = a.AlbumId) - ORDER BY - t.TrackId"; - - SqlTableRef track = SqlDml.TableRef(schema.Tables["Track"], "t"); - SqlTableRef album = SqlDml.TableRef(schema.Tables["Album"], "a"); - - SqlSelect select = SqlDml.Select(track.InnerJoin(album, track["AlbumId"]==album["AlbumId"])); - - select.Columns.Add(track["TrackId"]); - select.Columns.Add(track["Name"]); - select.Columns.Add(album["Title"]); - - select.OrderBy.Add(track["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test009() - { - string nativeSql = @"SELECT - c.CustomerId, - c.CompanyName, - c.FirstName, - c.LastName, - i.InvoiceDate, - il.TrackId, - t.Name, - il.UnitPrice, - il.Quantity - FROM - Customer c - INNER JOIN Invoice i ON (c.CustomerId = i.CustomerId) - INNER JOIN [InvoiceLine] il ON (i.InvoiceId = il.InvoiceId) - INNER JOIN [Track] t ON (t.TrackId = il.TrackId)"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); - SqlTableRef invoiceLine = SqlDml.TableRef(schema.Tables["invoiceline"], "il"); - SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "t"); - - SqlSelect select = SqlDml.Select(customer - .InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"]) - .InnerJoin(invoiceLine, invoiceLine["InvoiceId"]==invoice["InvoiceId"]) - .InnerJoin(track, track["TrackId"]==invoiceLine["TrackId"])); - select.Columns.Add(customer["CustomerId"]); - select.Columns.Add(customer["CompanyName"]); - select.Columns.Add(customer["FirstName"]); - select.Columns.Add(customer["LastName"]); - select.Columns.Add(invoice["InvoiceDate"]); - select.Columns.Add(invoiceLine["TrackId"]); - select.Columns.Add(track["Name"]); - select.Columns.Add(invoiceLine["UnitPrice"]); - select.Columns.Add(invoiceLine["Quantity"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test010() - { - string nativeSql = @"SELECT - i.invoiceid, - round(i.Commission * 12, 1) Rounded - FROM invoice i - WHERE i.invoiceid = 412"; - - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); - - SqlSelect select = SqlDml.Select(invoice); - select.Columns.Add(invoice["InvoiceId"]); - select.Columns.Add(SqlDml.Round(invoice["Commission"] * 12, 1), "Rounded"); - select.Where = invoice["invoiceId"]==412; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test011() - { - string nativeSql = @"SELECT - c.CustomerId, - c.CompanyName, - c.LastName, - SUM(i.Commission) AS Total - FROM - Customer c - INNER JOIN invoice i ON (c.CustomerID = i.CustomerID) - GROUP BY - c.CustomerID, - c.CompanyName, - c.LastName - ORDER BY c.CustomerID"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); - - SqlSelect select = SqlDml.Select(customer.InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"])); - - select.Columns.AddRange(customer["CustomerId"], customer["CompanyName"], customer["LastName"]); - select.Columns.Add(SqlDml.Sum(invoice["Commission"]), "Total"); - select.GroupBy.AddRange(customer["CustomerId"], customer["CompanyName"], customer["LastName"]); - - select.OrderBy.Add(customer["CustomerId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test012() - { - string nativeSql = @"SELECT - CASE il.TrackId - WHEN 1 THEN 'STAFF_1' - WHEN 2 THEN 'STAFF_2' - ELSE 'STAFF_OTHER' - END AS shippers, - SUM(il.UnitPrice) AS TotalUnits - FROM [invoiceline] il - GROUP BY il.TrackId"; - - SqlTableRef invoiceLine = SqlDml.TableRef(schema.Tables["invoiceline"], "il"); - - SqlSelect select = SqlDml.Select(invoiceLine); - SqlCase totalPayment = SqlDml.Case(invoiceLine["TrackId"]); - totalPayment[1] = SqlDml.Literal("STAFF_1"); - totalPayment[2] = SqlDml.Literal("STAFF_2"); - totalPayment.Else = SqlDml.Literal("STAFF_OTHER"); - select.Columns.Add(totalPayment, "shippers"); - - select.Columns.Add(SqlDml.Sum(invoiceLine["UnitPrice"]), "TotalUnits"); - select.GroupBy.AddRange(invoiceLine["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test013() - { - string nativeSql = @"SELECT - r.InvoiceId, - r.DesignatedEmployeeId, - r.Status - FROM invoice r - WHERE r.[BillingState] IS NOT NULL - ORDER BY r.InvoiceId"; - - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); - SqlSelect select = SqlDml.Select(invoice); - select.Columns.AddRange(invoice["InvoiceId"], invoice["DesignatedEmployeeId"], invoice["Status"]); - - select.Where = SqlDml.IsNotNull(invoice["BillingState"]); - select.OrderBy.Add(invoice["InvoiceId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_1() - { - string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", 1), "Days"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_2() - { - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); - SqlSelect select = SqlDml.Select(invoice); - select.Columns.Add(SqlDml.FunctionCall("DATE", invoice["PaymentDate"], SqlDml.Native(string.Format("'{0} MONTHS'", 1 + 1))), "TimeToToday"); - select.Where = SqlDml.IsNotNull(invoice["PaymentDate"]); - - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void Test014_3() - { - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); - SqlSelect select = SqlDml.Select(invoice); - select.Columns.Add(SqlDml.DateTimeAddMonths(invoice["PaymentDate"], 1 + 1), "TimeToToday"); - select.Where = SqlDml.IsNotNull(invoice["PaymentDate"]); - - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void Test014_4() - { - string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", -15), "Days"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_5() - { - string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", 1 + 1), "Days"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_6() - { - string nativeSql = @"select strftime('%d', 'now') AS DayOfMonth "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "NOW"), "DayOfMonth"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_7() - { - string nativeSql = @"select strftime('%m', 'now') AS Month "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Month, "NOW"), "Month"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_8() - { - string nativeSql = @"select strftime('%Y', 'now') AS Year "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, "NOW"), "Year"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_9() - { - string nativeSql = @"select strftime('%H', 'now') AS Hour "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, "NOW"), "Hour"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_10() - { - string nativeSql = @"select strftime('%M', 'now') AS Minutes "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, "NOW"), "Minutes"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_11() - { - string nativeSql = @"select strftime('%S', 'now') AS Seconds "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Second, "NOW"), "Seconds"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_12() - { - string nativeSql = @"select strftime('%f', 'now') AS Milliseconds "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Millisecond, "NOW"), "Milliseconds"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test014_13() - { - string nativeSql = @"select datetime('2011-11-16') AS BirthDay "; - - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeConstruct(2011, 11, 16), "BirthDay"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - [Ignore("A close inspection needed")] - public void Test015() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.DateTimeMinusDateTime(DateTime.Now, DateTime.Now.AddDays(-4)), "FewDaysAgo"); - - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void Test016() - { - string nativeSql = "SELECT SUM(p.commission) AS sum FROM invoice p"; - - SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"], "p"); - - SqlSelect select = SqlDml.Select(orders); - select.Columns.Add(SqlDml.Sum(orders["Commission"]), "sum"); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test017_1() - { - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["CustomerId"]); - select.Columns.Add(SqlDml.RawConcat("Mr. ", customer["LastName"]), "FullName"); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void Test017() - { - string nativeSql = "SELECT c.CustomerId, c.FirstName|| ', ' || c.LastName as FullName FROM customer c"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - - SqlSelect select = SqlDml.Select(customer); - select.Columns.Add(customer["CustomerId"]); - select.Columns.Add(SqlDml.Concat(SqlDml.Concat(customer["FirstName"], SqlDml.Literal(", ")), customer["LastName"]), "FullName"); - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test018() - { - string nativeSql = @"SELECT - c.CustomerId, - c.CompanyName, - c.LastName, - SUM(i.commission) AS Total - FROM - customer c - INNER JOIN invoice i ON (c.CustomerID = i.CustomerID) - GROUP BY - c.CustomerId, - c.CompanyName, - c.LastName - HAVING SUM(i.commission) > 140"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); - SqlSelect select = SqlDml.Select(customer.InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"])); - - select.Columns.AddRange(customer["CustomerID"], customer["CompanyName"], customer["LastName"]); - select.Columns.Add(SqlDml.Sum(invoice["Commission"]), "Total"); - - select.GroupBy.AddRange(customer["CustomerID"], customer["CompanyName"], customer["LastName"]); - - select.Having = SqlDml.Sum(invoice["Commission"]) > 140; - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test019() - { - string nativeSql = @"SELECT - c.CustomerId, - c.CompanyName, - c.LastName - FROM - customer c - WHERE c.CustomerId IN (SELECT r.CustomerId FROM invoice r WHERE r.DesignatedEmployeeId = 8) - GROUP BY c.CustomerID, - c.CompanyName, - c.LastName"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); - - SqlSelect innerSelect = SqlDml.Select(invoice); - innerSelect.Columns.Add(invoice["CustomerId"]); - innerSelect.Where = invoice["DesignatedEmployeeId"] ==8; - - SqlSelect select = SqlDml.Select(customer); - - select.Columns.Add(customer["CustomerId"]); - select.Columns.Add(customer["CompanyName"]); - select.Columns.Add(customer["LastName"]); - - select.Where = SqlDml.In(customer["CustomerId"], innerSelect); - - select.GroupBy.Add(customer["CustomerID"]); - select.GroupBy.Add(customer["CompanyName"]); - select.GroupBy.Add(customer["LastName"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test020() - { - string nativeSql = @"SELECT - f.TrackId, - f.Name, - f.UnitPrice - FROM - track f - WHERE - f.Milliseconds BETWEEN 50 AND 40000 - ORDER BY f.TrackId"; - - SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); - SqlSelect select = SqlDml.Select(track); - select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"]); - select.Where = SqlDml.Between(track["Milliseconds"], 50, 40000); - select.OrderBy.Add(track["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test021() - { - string nativeSql = @"SELECT - f.TrackId, - f.Name, - f.UnitPrice, - f.AlbumId - FROM track f - WHERE f.AlbumId in (2, 8) - ORDER BY f.TrackId"; - - SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); - SqlSelect select = SqlDml.Select(track); - select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"], track["AlbumId"]); - select.Where = SqlDml.In(track["AlbumId"], SqlDml.Row(2, 8)); - select.OrderBy.Add(track["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test022() - { - string nativeSql = @"SELECT - f.TrackId, - f.Name, - f.UnitPrice, - f.AlbumId - FROM - track f - WHERE - f.Name LIKE 'R%' - ORDER BY f.TrackId"; - - SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); - SqlSelect select = SqlDml.Select(track); - select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"], track["AlbumId"]); - select.Where = SqlDml.Like(track["Name"], "R%"); - select.OrderBy.Add(track["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test023() - { - string nativeSql = @"SELECT - f.TrackId, - f.Name, - f.UnitPrice - FROM - track f - WHERE - (f.AlbumId = 3 OR - f.AlbumId = 8) AND - f.UnitPrice < 1 - ORDER BY - f.TrackId"; - - SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); - SqlSelect select = SqlDml.Select(track); - select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"]); - select.Where = (track["AlbumId"] ==3 || track["AlbumId"] ==8) && track["UnitPrice"] < 1; - select.OrderBy.Add(track["TrackId"]); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test024() - { - string nativeSql = @"SELECT - strftime('%Y', PaymentDate) as Year, - COUNT(*) Required - FROM invoice r - GROUP BY strftime('%Y', PaymentDate)"; - - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); - - SqlSelect select = SqlDml.Select(invoice); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, invoice["PaymentDate"]), "Year"); - select.Columns.Add(SqlDml.Count(), "Required"); - - select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, invoice["PaymentDate"])); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test026() - { - string nativeSql = @"SELECT - p.CustomerId, - p.Commission - FROM - invoice p - WHERE - p.Commission = (SELECT MIN(Commission) AS LowestCommission FROM invoice)"; - - SqlTableRef invoice1 = SqlDml.TableRef(schema.Tables["invoice"], "p1"); - SqlTableRef invoice2 = SqlDml.TableRef(schema.Tables["invoice"], "p2"); - - SqlSelect innerSelect = SqlDml.Select(invoice2); - innerSelect.Columns.Add(SqlDml.Min(invoice2["Commission"])); - - SqlSelect select = SqlDml.Select(invoice1); - select.Columns.Add(invoice1["CustomerId"]); - select.Columns.Add(invoice1["Commission"]); - - select.Where = SqlDml.Equals(invoice1["Commission"], innerSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test027() - { - string nativeSql = @"SELECT - c.CustomerId, - c.CompanyName - FROM - customer c - WHERE EXISTS - (SELECT * FROM invoice i WHERE i.Commission < 1.00 AND i.CustomerId = c.CustomerId )"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); - - SqlSelect innerSelect = SqlDml.Select(invoice); - SqlSelect select = SqlDml.Select(customer); - - innerSelect.Columns.Add(SqlDml.Asterisk); - innerSelect.Where = invoice["Commission"] < 11.00 && invoice["CustomerId"]==customer["CustomerId"]; - - select.Columns.Add(customer["CustomerId"]); - select.Columns.Add(customer["CompanyName"]); - select.Where = SqlDml.Exists(innerSelect); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test028() - { - string nativeSql = @"select * FROM customer c limit 0, 10"; - - SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"]); - SqlSelect select = SqlDml.Select(customer); - select.Limit = 10; - select.Offset = 0; - select.Columns.Add(SqlDml.Asterisk); - - Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); - } - - [Test] - public void Test029() - { - string nativeSql = "UPDATE invoice " + "SET Total = Total * 1 " + "WHERE InvoiceId = 10;"; - - SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"]); - SqlUpdate update = SqlDml.Update(invoice); - update.Values[invoice["Total"]] = invoice["Total"] * 1; - update.Where = invoice["InvoiceId"] ==10; - - Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); - } - - [Test] - public void Test150() - { - SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["main"].Tables["customer"]); - Console.Write(Compile(create)); - } - - [Test] - public void Test151() - { - SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["main"].Tables["customer"]); - Console.Write(Compile(drop)); - } - - [Test] - public void Test152() - { - SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["main"]); - Assert.Throws(() => Console.Write(Compile(drop))); - } - - [Test] - public void Test153() - { - SqlCreateView create = SqlDdl.Create(Catalog.Schemas["main"].Views["Invoice Subtotals"]); - Console.Write(Compile(create)); - } - - [Test] - public void Test154() - { - SqlCreateSchema create = SqlDdl.Create(Catalog.Schemas["main"]); - Console.Write(Compile(create)); - } - - [Test] - public void Test155() - { - SqlAlterTable alter = SqlDdl.Alter(Catalog.Schemas["main"].Tables["customer"], SqlDdl.AddColumn(Catalog.Schemas["main"].Tables["customer"].TableColumns["CompanyName"])); - - Console.Write(Compile(alter)); - } - - [Test] - public void Test156() - { - SqlAlterTable alter = SqlDdl.Alter(Catalog.Schemas["main"].Tables["customer"], SqlDdl.DropColumn(Catalog.Schemas["main"].Tables["customer"].TableColumns["CompanyName"])); - - Assert.Throws(() => Console.Write(Compile(alter))); - } - - [Test] - public void Test157() - { - var renameColumn = SqlDdl.Rename(Catalog.Schemas["main"].Tables["customer"].TableColumns["LastName"], "LastName1"); - - Assert.Throws(() => Console.Write(Compile(renameColumn))); - } - - [Test] - public void Test158() - { - var t = Catalog.Schemas["main"].Tables["customer"]; - Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["Phone"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); - - Assert.Throws(() => Console.Write(Compile(stmt))); - } - - [Test] - public void Test160() - { - var t = Catalog.Schemas["main"].Tables["customer"]; - Index index = t.CreateIndex("MegaIndex195"); - index.CreateIndexColumn(t.TableColumns[0]); - SqlCreateIndex create = SqlDdl.Create(index); - - Console.Write(Compile(create)); - } - - [Test] - public void Test161() - { - var t = Catalog.Schemas["main"].Tables["customer"]; - Index index = t.CreateIndex("MegaIndex196"); - index.CreateIndexColumn(t.TableColumns[0]); - SqlDropIndex drop = SqlDdl.Drop(index); - - Console.Write(Compile(drop)); - } - - [Test] - public void Test162() - { - var alter = SqlDdl.Rename(Catalog.Schemas["main"].Tables["customer"], "SomeWierdTableName"); - Console.Write(Compile(alter)); - } - - [Test] - [Ignore("Not yet prepared for tests")] - public void Test201() - { - string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; - - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(); - SqlSelect s3 = SqlDml.Select(); - SqlSelect s4 = SqlDml.Select(); - SqlSelect select; - s1.Columns.Add(1, "f"); - s2.Columns.Add(2); - s3.Columns.Add(3); - s4.Columns.Add(4); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); - select = SqlDml.Select(qr); - select.Columns.Add(qr["f"]); - - Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select))); - } - - [Test] - public void Test165() - { - var t = Catalog.Schemas["main"].CreateTable("SomeWierdTableName"); - t.CreateColumn("Field01", new SqlValueType(SqlType.Int32)); - t.CreateColumn("Field02", new SqlValueType(SqlType.Int32)); - - var uc = t.CreatePrimaryKey(string.Empty, t.TableColumns["Field02"]); - SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); - - Assert.Throws(() => Console.Write(Compile(stmt))); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.06.10 + +using System; +using System.Data; +using System.Data.Common; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + public class ChinookTest : Chinook + { + private DbCommand dbCommand; + private DbCommand sqlCommand; + + private Schema schema = null; + + [OneTimeSetUp] + public override void SetUp() + { + base.SetUp(); + dbCommand = sqlConnection.CreateCommand(); + sqlCommand = sqlConnection.CreateCommand(); + + schema = Catalog.DefaultSchema; + } + + #region Internals + + private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteDataReaderResult(dbCommand); + r2 = GetExecuteDataReaderResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + if (r1.FieldCount!=r2.FieldCount) + return false; + for (int i = 0; i < r1.FieldCount; i++) { + if (r1.FieldNames[i]!=r2.FieldNames[i]) + return false; + } + return true; + } + + private bool CompareExecuteNonQuery(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteNonQueryResult(dbCommand); + r2 = GetExecuteNonQueryResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + return true; + } + + #endregion + + //SET CHARACTER SET utf8 + + [Test] + public void TestExtractCatalog() + { + Assert.GreaterOrEqual(Catalog.Schemas.Count, 1); + } + + [Test] + public void Test000() + { + string nativeSql = @"SELECT + employee.EmployeeID, + employee.FirstName, + employee.LastName, + employee.BirthDate + FROM + employee + WHERE + employee.FirstName = 'Robert' + ORDER BY + employee.LastName"; + + var p = sqlCommand.CreateParameter(); + p.ParameterName = "p1"; + p.DbType = DbType.String; + p.Value = "Robert"; + sqlCommand.Parameters.Add(p); + + SqlTableRef employees = SqlDml.TableRef(schema.Tables["employee"]); + SqlSelect select = SqlDml.Select(employees); + select.Columns.AddRange(employees["EmployeeId"], employees["FirstName"], employees["LastName"], employees["BirthDate"]); + select.Where = employees["FirstName"]==SqlDml.ParameterRef(p.ParameterName); + select.OrderBy.Add(employees["LastName"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test001() + { + string nativeSql = @"SELECT DISTINCT + employee.FirstName + FROM + employee + WHERE + employee.Title = 'IT Staff'"; + + var p = sqlCommand.CreateParameter(); + p.ParameterName = "p10"; + p.DbType = DbType.String; + p.Value = "IT Staff"; + sqlCommand.Parameters.Add(p); + + SqlTableRef employees = SqlDml.TableRef(schema.Tables["employee"]); + SqlSelect select = SqlDml.Select(employees); + select.Distinct = true; + select.Columns.AddRange(employees["FirstName"]); + select.Where = employees["Title"]==SqlDml.ParameterRef(p.ParameterName); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test002() + { + string nativeSql = "SELECT * FROM [genre] a"; + + SqlTableRef region = SqlDml.TableRef(Catalog.Schemas["main"].Tables["genre"]); + SqlSelect select = SqlDml.Select(region); + select.Columns.Add(SqlDml.Asterisk); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test003() + { + string nativeSql = "SELECT [a].[EmployeeId], [a].[FirstName], [a].[LastName] FROM [Employee] [a] WHERE ([a].[EmployeeId] < 2) ORDER BY [a].[FirstName] ASC, 3 DESC"; + + SqlTableRef customer = SqlDml.TableRef(Catalog.Schemas["main"].Tables["Employee"]); + SqlSelect select = SqlDml.Select(customer); + select.Columns.AddRange(customer["EmployeeId"], customer["FirstName"], customer["LastName"]); + select.Where = customer["EmployeeId"] < 2; + select.OrderBy.Add(customer["FirstName"]); + select.OrderBy.Add(3, false); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test006() + { + SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"]); + SqlSelect select = SqlDml.Select(orders); + select.Columns.Add(SqlDml.Asterisk); + select.Where = orders["PaymentDate"] > new DateTime(2013, 8, 1); + select.OrderBy.Add(orders["PaymentDate"], false); + + sqlCommand.CommandText = Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); + Assert.AreEqual(14, r.RowCount); + } + + [Test] + public void Test007() + { + SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"]); + SqlSelect select = SqlDml.Select(orders); + select.Limit = 10; + select.Columns.Add(SqlDml.Asterisk); + + sqlCommand.CommandText = Compile(select).GetCommandText(); + sqlCommand.Prepare(); + + DbCommandExecutionResult r = GetExecuteDataReaderResult(sqlCommand); + Assert.AreEqual(10, r.RowCount); + } + + [Test] + public void Test008() + { + string nativeSql = @"SELECT + t.TrackId, + t.[Name], + a.[Title] + FROM + Track t + INNER JOIN Album a ON (t.AlbumId = a.AlbumId) + ORDER BY + t.TrackId"; + + SqlTableRef track = SqlDml.TableRef(schema.Tables["Track"], "t"); + SqlTableRef album = SqlDml.TableRef(schema.Tables["Album"], "a"); + + SqlSelect select = SqlDml.Select(track.InnerJoin(album, track["AlbumId"]==album["AlbumId"])); + + select.Columns.Add(track["TrackId"]); + select.Columns.Add(track["Name"]); + select.Columns.Add(album["Title"]); + + select.OrderBy.Add(track["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test009() + { + string nativeSql = @"SELECT + c.CustomerId, + c.CompanyName, + c.FirstName, + c.LastName, + i.InvoiceDate, + il.TrackId, + t.Name, + il.UnitPrice, + il.Quantity + FROM + Customer c + INNER JOIN Invoice i ON (c.CustomerId = i.CustomerId) + INNER JOIN [InvoiceLine] il ON (i.InvoiceId = il.InvoiceId) + INNER JOIN [Track] t ON (t.TrackId = il.TrackId)"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); + SqlTableRef invoiceLine = SqlDml.TableRef(schema.Tables["invoiceline"], "il"); + SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "t"); + + SqlSelect select = SqlDml.Select(customer + .InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"]) + .InnerJoin(invoiceLine, invoiceLine["InvoiceId"]==invoice["InvoiceId"]) + .InnerJoin(track, track["TrackId"]==invoiceLine["TrackId"])); + select.Columns.Add(customer["CustomerId"]); + select.Columns.Add(customer["CompanyName"]); + select.Columns.Add(customer["FirstName"]); + select.Columns.Add(customer["LastName"]); + select.Columns.Add(invoice["InvoiceDate"]); + select.Columns.Add(invoiceLine["TrackId"]); + select.Columns.Add(track["Name"]); + select.Columns.Add(invoiceLine["UnitPrice"]); + select.Columns.Add(invoiceLine["Quantity"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test010() + { + string nativeSql = @"SELECT + i.invoiceid, + round(i.Commission * 12, 1) Rounded + FROM invoice i + WHERE i.invoiceid = 412"; + + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); + + SqlSelect select = SqlDml.Select(invoice); + select.Columns.Add(invoice["InvoiceId"]); + select.Columns.Add(SqlDml.Round(invoice["Commission"] * 12, 1), "Rounded"); + select.Where = invoice["invoiceId"]==412; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test011() + { + string nativeSql = @"SELECT + c.CustomerId, + c.CompanyName, + c.LastName, + SUM(i.Commission) AS Total + FROM + Customer c + INNER JOIN invoice i ON (c.CustomerID = i.CustomerID) + GROUP BY + c.CustomerID, + c.CompanyName, + c.LastName + ORDER BY c.CustomerID"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); + + SqlSelect select = SqlDml.Select(customer.InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"])); + + select.Columns.AddRange(customer["CustomerId"], customer["CompanyName"], customer["LastName"]); + select.Columns.Add(SqlDml.Sum(invoice["Commission"]), "Total"); + select.GroupBy.AddRange(customer["CustomerId"], customer["CompanyName"], customer["LastName"]); + + select.OrderBy.Add(customer["CustomerId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test012() + { + string nativeSql = @"SELECT + CASE il.TrackId + WHEN 1 THEN 'STAFF_1' + WHEN 2 THEN 'STAFF_2' + ELSE 'STAFF_OTHER' + END AS shippers, + SUM(il.UnitPrice) AS TotalUnits + FROM [invoiceline] il + GROUP BY il.TrackId"; + + SqlTableRef invoiceLine = SqlDml.TableRef(schema.Tables["invoiceline"], "il"); + + SqlSelect select = SqlDml.Select(invoiceLine); + SqlCase totalPayment = SqlDml.Case(invoiceLine["TrackId"]); + totalPayment[1] = SqlDml.Literal("STAFF_1"); + totalPayment[2] = SqlDml.Literal("STAFF_2"); + totalPayment.Else = SqlDml.Literal("STAFF_OTHER"); + select.Columns.Add(totalPayment, "shippers"); + + select.Columns.Add(SqlDml.Sum(invoiceLine["UnitPrice"]), "TotalUnits"); + select.GroupBy.AddRange(invoiceLine["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test013() + { + string nativeSql = @"SELECT + r.InvoiceId, + r.DesignatedEmployeeId, + r.Status + FROM invoice r + WHERE r.[BillingState] IS NOT NULL + ORDER BY r.InvoiceId"; + + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); + SqlSelect select = SqlDml.Select(invoice); + select.Columns.AddRange(invoice["InvoiceId"], invoice["DesignatedEmployeeId"], invoice["Status"]); + + select.Where = SqlDml.IsNotNull(invoice["BillingState"]); + select.OrderBy.Add(invoice["InvoiceId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_1() + { + string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", 1), "Days"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_2() + { + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); + SqlSelect select = SqlDml.Select(invoice); + select.Columns.Add(SqlDml.FunctionCall("DATE", invoice["PaymentDate"], SqlDml.Native(string.Format("'{0} MONTHS'", 1 + 1))), "TimeToToday"); + select.Where = SqlDml.IsNotNull(invoice["PaymentDate"]); + + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void Test014_3() + { + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); + SqlSelect select = SqlDml.Select(invoice); + select.Columns.Add(SqlDml.DateTimeAddMonths(invoice["PaymentDate"], 1 + 1), "TimeToToday"); + select.Where = SqlDml.IsNotNull(invoice["PaymentDate"]); + + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void Test014_4() + { + string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", -15), "Days"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_5() + { + string nativeSql = @"select date('NOW', '+1 MONTHS') AS Days "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeAddMonths("NOW", 1 + 1), "Days"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_6() + { + string nativeSql = @"select strftime('%d', 'now') AS DayOfMonth "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "NOW"), "DayOfMonth"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_7() + { + string nativeSql = @"select strftime('%m', 'now') AS Month "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Month, "NOW"), "Month"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_8() + { + string nativeSql = @"select strftime('%Y', 'now') AS Year "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, "NOW"), "Year"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_9() + { + string nativeSql = @"select strftime('%H', 'now') AS Hour "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Hour, "NOW"), "Hour"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_10() + { + string nativeSql = @"select strftime('%M', 'now') AS Minutes "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Minute, "NOW"), "Minutes"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_11() + { + string nativeSql = @"select strftime('%S', 'now') AS Seconds "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Second, "NOW"), "Seconds"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_12() + { + string nativeSql = @"select strftime('%f', 'now') AS Milliseconds "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Millisecond, "NOW"), "Milliseconds"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test014_13() + { + string nativeSql = @"select datetime('2011-11-16') AS BirthDay "; + + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeConstruct(2011, 11, 16), "BirthDay"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + [Ignore("A close inspection needed")] + public void Test015() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.DateTimeMinusDateTime(DateTime.Now, DateTime.Now.AddDays(-4)), "FewDaysAgo"); + + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void Test016() + { + string nativeSql = "SELECT SUM(p.commission) AS sum FROM invoice p"; + + SqlTableRef orders = SqlDml.TableRef(schema.Tables["invoice"], "p"); + + SqlSelect select = SqlDml.Select(orders); + select.Columns.Add(SqlDml.Sum(orders["Commission"]), "sum"); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test017_1() + { + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["CustomerId"]); + select.Columns.Add(SqlDml.RawConcat("Mr. ", customer["LastName"]), "FullName"); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void Test017() + { + string nativeSql = "SELECT c.CustomerId, c.FirstName|| ', ' || c.LastName as FullName FROM customer c"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + + SqlSelect select = SqlDml.Select(customer); + select.Columns.Add(customer["CustomerId"]); + select.Columns.Add(SqlDml.Concat(SqlDml.Concat(customer["FirstName"], SqlDml.Literal(", ")), customer["LastName"]), "FullName"); + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test018() + { + string nativeSql = @"SELECT + c.CustomerId, + c.CompanyName, + c.LastName, + SUM(i.commission) AS Total + FROM + customer c + INNER JOIN invoice i ON (c.CustomerID = i.CustomerID) + GROUP BY + c.CustomerId, + c.CompanyName, + c.LastName + HAVING SUM(i.commission) > 140"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); + SqlSelect select = SqlDml.Select(customer.InnerJoin(invoice, customer["CustomerId"]==invoice["CustomerId"])); + + select.Columns.AddRange(customer["CustomerID"], customer["CompanyName"], customer["LastName"]); + select.Columns.Add(SqlDml.Sum(invoice["Commission"]), "Total"); + + select.GroupBy.AddRange(customer["CustomerID"], customer["CompanyName"], customer["LastName"]); + + select.Having = SqlDml.Sum(invoice["Commission"]) > 140; + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test019() + { + string nativeSql = @"SELECT + c.CustomerId, + c.CompanyName, + c.LastName + FROM + customer c + WHERE c.CustomerId IN (SELECT r.CustomerId FROM invoice r WHERE r.DesignatedEmployeeId = 8) + GROUP BY c.CustomerID, + c.CompanyName, + c.LastName"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); + + SqlSelect innerSelect = SqlDml.Select(invoice); + innerSelect.Columns.Add(invoice["CustomerId"]); + innerSelect.Where = invoice["DesignatedEmployeeId"] ==8; + + SqlSelect select = SqlDml.Select(customer); + + select.Columns.Add(customer["CustomerId"]); + select.Columns.Add(customer["CompanyName"]); + select.Columns.Add(customer["LastName"]); + + select.Where = SqlDml.In(customer["CustomerId"], innerSelect); + + select.GroupBy.Add(customer["CustomerID"]); + select.GroupBy.Add(customer["CompanyName"]); + select.GroupBy.Add(customer["LastName"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test020() + { + string nativeSql = @"SELECT + f.TrackId, + f.Name, + f.UnitPrice + FROM + track f + WHERE + f.Milliseconds BETWEEN 50 AND 40000 + ORDER BY f.TrackId"; + + SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); + SqlSelect select = SqlDml.Select(track); + select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"]); + select.Where = SqlDml.Between(track["Milliseconds"], 50, 40000); + select.OrderBy.Add(track["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test021() + { + string nativeSql = @"SELECT + f.TrackId, + f.Name, + f.UnitPrice, + f.AlbumId + FROM track f + WHERE f.AlbumId in (2, 8) + ORDER BY f.TrackId"; + + SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); + SqlSelect select = SqlDml.Select(track); + select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"], track["AlbumId"]); + select.Where = SqlDml.In(track["AlbumId"], SqlDml.Row(2, 8)); + select.OrderBy.Add(track["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test022() + { + string nativeSql = @"SELECT + f.TrackId, + f.Name, + f.UnitPrice, + f.AlbumId + FROM + track f + WHERE + f.Name LIKE 'R%' + ORDER BY f.TrackId"; + + SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); + SqlSelect select = SqlDml.Select(track); + select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"], track["AlbumId"]); + select.Where = SqlDml.Like(track["Name"], "R%"); + select.OrderBy.Add(track["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test023() + { + string nativeSql = @"SELECT + f.TrackId, + f.Name, + f.UnitPrice + FROM + track f + WHERE + (f.AlbumId = 3 OR + f.AlbumId = 8) AND + f.UnitPrice < 1 + ORDER BY + f.TrackId"; + + SqlTableRef track = SqlDml.TableRef(schema.Tables["track"], "f"); + SqlSelect select = SqlDml.Select(track); + select.Columns.AddRange(track["TrackId"], track["Name"], track["UnitPrice"]); + select.Where = (track["AlbumId"] ==3 || track["AlbumId"] ==8) && track["UnitPrice"] < 1; + select.OrderBy.Add(track["TrackId"]); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test024() + { + string nativeSql = @"SELECT + strftime('%Y', PaymentDate) as Year, + COUNT(*) Required + FROM invoice r + GROUP BY strftime('%Y', PaymentDate)"; + + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "r"); + + SqlSelect select = SqlDml.Select(invoice); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Year, invoice["PaymentDate"]), "Year"); + select.Columns.Add(SqlDml.Count(), "Required"); + + select.GroupBy.Add(SqlDml.Extract(SqlDateTimePart.Year, invoice["PaymentDate"])); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test026() + { + string nativeSql = @"SELECT + p.CustomerId, + p.Commission + FROM + invoice p + WHERE + p.Commission = (SELECT MIN(Commission) AS LowestCommission FROM invoice)"; + + SqlTableRef invoice1 = SqlDml.TableRef(schema.Tables["invoice"], "p1"); + SqlTableRef invoice2 = SqlDml.TableRef(schema.Tables["invoice"], "p2"); + + SqlSelect innerSelect = SqlDml.Select(invoice2); + innerSelect.Columns.Add(SqlDml.Min(invoice2["Commission"])); + + SqlSelect select = SqlDml.Select(invoice1); + select.Columns.Add(invoice1["CustomerId"]); + select.Columns.Add(invoice1["Commission"]); + + select.Where = SqlDml.Equals(invoice1["Commission"], innerSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test027() + { + string nativeSql = @"SELECT + c.CustomerId, + c.CompanyName + FROM + customer c + WHERE EXISTS + (SELECT * FROM invoice i WHERE i.Commission < 1.00 AND i.CustomerId = c.CustomerId )"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"], "c"); + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"], "i"); + + SqlSelect innerSelect = SqlDml.Select(invoice); + SqlSelect select = SqlDml.Select(customer); + + innerSelect.Columns.Add(SqlDml.Asterisk); + innerSelect.Where = invoice["Commission"] < 11.00 && invoice["CustomerId"]==customer["CustomerId"]; + + select.Columns.Add(customer["CustomerId"]); + select.Columns.Add(customer["CompanyName"]); + select.Where = SqlDml.Exists(innerSelect); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test028() + { + string nativeSql = @"select * FROM customer c limit 0, 10"; + + SqlTableRef customer = SqlDml.TableRef(schema.Tables["customer"]); + SqlSelect select = SqlDml.Select(customer); + select.Limit = 10; + select.Offset = 0; + select.Columns.Add(SqlDml.Asterisk); + + Assert.IsTrue(CompareExecuteDataReader(nativeSql, select)); + } + + [Test] + public void Test029() + { + string nativeSql = "UPDATE invoice " + "SET Total = Total * 1 " + "WHERE InvoiceId = 10;"; + + SqlTableRef invoice = SqlDml.TableRef(schema.Tables["invoice"]); + SqlUpdate update = SqlDml.Update(invoice); + update.Values[invoice["Total"]] = invoice["Total"] * 1; + update.Where = invoice["InvoiceId"] ==10; + + Assert.IsTrue(CompareExecuteNonQuery(nativeSql, update)); + } + + [Test] + public void Test150() + { + SqlCreateTable create = SqlDdl.Create(Catalog.Schemas["main"].Tables["customer"]); + Console.Write(Compile(create)); + } + + [Test] + public void Test151() + { + SqlDropTable drop = SqlDdl.Drop(Catalog.Schemas["main"].Tables["customer"]); + Console.Write(Compile(drop)); + } + + [Test] + public void Test152() + { + SqlDropSchema drop = SqlDdl.Drop(Catalog.Schemas["main"]); + Assert.Throws(() => Console.Write(Compile(drop))); + } + + [Test] + public void Test153() + { + SqlCreateView create = SqlDdl.Create(Catalog.Schemas["main"].Views["Invoice Subtotals"]); + Console.Write(Compile(create)); + } + + [Test] + public void Test154() + { + SqlCreateSchema create = SqlDdl.Create(Catalog.Schemas["main"]); + Console.Write(Compile(create)); + } + + [Test] + public void Test155() + { + SqlAlterTable alter = SqlDdl.Alter(Catalog.Schemas["main"].Tables["customer"], SqlDdl.AddColumn(Catalog.Schemas["main"].Tables["customer"].TableColumns["CompanyName"])); + + Console.Write(Compile(alter)); + } + + [Test] + public void Test156() + { + SqlAlterTable alter = SqlDdl.Alter(Catalog.Schemas["main"].Tables["customer"], SqlDdl.DropColumn(Catalog.Schemas["main"].Tables["customer"].TableColumns["CompanyName"])); + + Assert.Throws(() => Console.Write(Compile(alter))); + } + + [Test] + public void Test157() + { + var renameColumn = SqlDdl.Rename(Catalog.Schemas["main"].Tables["customer"].TableColumns["LastName"], "LastName1"); + + Assert.Throws(() => Console.Write(Compile(renameColumn))); + } + + [Test] + public void Test158() + { + var t = Catalog.Schemas["main"].Tables["customer"]; + Xtensive.Sql.Model.UniqueConstraint uc = t.CreateUniqueConstraint("newUniqueConstraint", t.TableColumns["Phone"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); + + Assert.Throws(() => Console.Write(Compile(stmt))); + } + + [Test] + public void Test160() + { + var t = Catalog.Schemas["main"].Tables["customer"]; + Index index = t.CreateIndex("MegaIndex195"); + index.CreateIndexColumn(t.TableColumns[0]); + SqlCreateIndex create = SqlDdl.Create(index); + + Console.Write(Compile(create)); + } + + [Test] + public void Test161() + { + var t = Catalog.Schemas["main"].Tables["customer"]; + Index index = t.CreateIndex("MegaIndex196"); + index.CreateIndexColumn(t.TableColumns[0]); + SqlDropIndex drop = SqlDdl.Drop(index); + + Console.Write(Compile(drop)); + } + + [Test] + public void Test162() + { + var alter = SqlDdl.Rename(Catalog.Schemas["main"].Tables["customer"], "SomeWierdTableName"); + Console.Write(Compile(alter)); + } + + [Test] + [Ignore("Not yet prepared for tests")] + public void Test201() + { + string nativeSql = "SELECT a.f FROM ((SELECT 1 as f UNION SELECT 2) EXCEPT (SELECT 3 UNION SELECT 4)) a"; + + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(); + SqlSelect s3 = SqlDml.Select(); + SqlSelect s4 = SqlDml.Select(); + SqlSelect select; + s1.Columns.Add(1, "f"); + s2.Columns.Add(2); + s3.Columns.Add(3); + s4.Columns.Add(4); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2).Except(s3.Union(s4)), "a"); + select = SqlDml.Select(qr); + select.Columns.Add(qr["f"]); + + Assert.Throws(() => Assert.IsTrue(CompareExecuteNonQuery(nativeSql, select))); + } + + [Test] + public void Test165() + { + var t = Catalog.Schemas["main"].CreateTable("SomeWierdTableName"); + t.CreateColumn("Field01", new SqlValueType(SqlType.Int32)); + t.CreateColumn("Field02", new SqlValueType(SqlType.Int32)); + + var uc = t.CreatePrimaryKey(string.Empty, t.TableColumns["Field02"]); + SqlAlterTable stmt = SqlDdl.Alter(t, SqlDdl.AddConstraint(uc)); + + Assert.Throws(() => Console.Write(Compile(stmt))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeIntervalTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeIntervalTest.cs index 6aadf5c859..7ddb154eaf 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeIntervalTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeIntervalTest.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2006.04.21 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - [TestFixture] - public class DateTimeIntervalTest : Sql.DateTimeIntervalTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite); - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2006.04.21 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + [TestFixture] + public class DateTimeIntervalTest : Sql.DateTimeIntervalTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeOffsetTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeOffsetTest.cs index 7c917c6e0e..9c0eba64b9 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeOffsetTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/DateTimeOffsetTest.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.04.26 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - [TestFixture] - public class DateTimeOffsetTest : Sql.DateTimeOffsetTest - { - protected override bool IsNanosecondSupported - { - get { return false; } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.04.26 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + [TestFixture] + public class DateTimeOffsetTest : Sql.DateTimeOffsetTest + { + protected override bool IsNanosecondSupported + { + get { return false; } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ExtractorTest.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ExtractorTest.cs index 331d7ba3d5..243788cbdd 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/ExtractorTest.cs @@ -1,51 +1,51 @@ -using System; -using NUnit.Framework; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - [TestFixture] - [Explicit] - public class ExtractorTest : SqlTest - { - [Test] - public void BaseTest() - { - var schema = ExtractDefaultSchema(); - foreach (var table in schema.Tables) { - Console.WriteLine("Table: " + table.Name); - Console.WriteLine("Columns"); - foreach (var column in table.TableColumns) - Console.WriteLine(string.Format(" {0}, {1}, {2}, {3}", column.Name, column.DataType, column.IsNullable, column.DefaultValue)); - Console.WriteLine("Indexes"); - foreach (var index in table.Indexes) { - Console.WriteLine(string.Format(" Name: {0}, Unique : {1}", index.Name, index.IsUnique)); - foreach (var column in index.Columns) - Console.WriteLine(" " + column.Name); - } - Console.WriteLine("Constraints"); - foreach (var constraint in table.TableConstraints) { - var uniqueConstraint = constraint as UniqueConstraint; - if (uniqueConstraint!=null) { - Console.WriteLine(string.Format(" {0}, Primary Key", constraint.Name)); - foreach (var column in uniqueConstraint.Columns) - Console.WriteLine(" " + column.Name); - continue; - } - var foreignKey = constraint as ForeignKey; - if (foreignKey!=null) { - Console.WriteLine(string.Format(" {0}, Foreign Key, {1}, On Update = {2}, On Delete = {3}", constraint.Name, foreignKey.ReferencedTable.Name, foreignKey.OnUpdate, foreignKey.OnDelete)); - foreach (var column in foreignKey.Columns) - Console.WriteLine(" " + column.Name); - continue; - } - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite); - } - } +using System; +using NUnit.Framework; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + [TestFixture] + [Explicit] + public class ExtractorTest : SqlTest + { + [Test] + public void BaseTest() + { + var schema = ExtractDefaultSchema(); + foreach (var table in schema.Tables) { + Console.WriteLine("Table: " + table.Name); + Console.WriteLine("Columns"); + foreach (var column in table.TableColumns) + Console.WriteLine(string.Format(" {0}, {1}, {2}, {3}", column.Name, column.DataType, column.IsNullable, column.DefaultValue)); + Console.WriteLine("Indexes"); + foreach (var index in table.Indexes) { + Console.WriteLine(string.Format(" Name: {0}, Unique : {1}", index.Name, index.IsUnique)); + foreach (var column in index.Columns) + Console.WriteLine(" " + column.Name); + } + Console.WriteLine("Constraints"); + foreach (var constraint in table.TableConstraints) { + var uniqueConstraint = constraint as UniqueConstraint; + if (uniqueConstraint!=null) { + Console.WriteLine(string.Format(" {0}, Primary Key", constraint.Name)); + foreach (var column in uniqueConstraint.Columns) + Console.WriteLine(" " + column.Name); + continue; + } + var foreignKey = constraint as ForeignKey; + if (foreignKey!=null) { + Console.WriteLine(string.Format(" {0}, Foreign Key, {1}, On Update = {2}, On Delete = {3}", constraint.Name, foreignKey.ReferencedTable.Name, foreignKey.OnUpdate, foreignKey.OnDelete)); + foreach (var column in foreignKey.Columns) + Console.WriteLine(" " + column.Name); + continue; + } + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/MiscTests.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/MiscTests.cs index 31525dcabe..b0d0a56492 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/MiscTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/MiscTests.cs @@ -1,369 +1,369 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.05.13 - -using System; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using NUnit.Framework; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - public class MiscTests : Chinook - { - private DbCommand dbCommand; - private DbCommand sqlCommand; - - private Schema schema = null; - - #region Internals - - private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteDataReaderResult(dbCommand); - r2 = GetExecuteDataReaderResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - if (r1.FieldCount!=r2.FieldCount) - return false; - for (int i = 0; i < r1.FieldCount; i++) { - if (r1.FieldNames[i]!=r2.FieldNames[i]) - return false; - } - return true; - } - - private bool CompareExecuteNonQuery(string commandText, ISqlCompileUnit statement) - { - sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); - sqlCommand.Prepare(); - Console.WriteLine(sqlCommand.CommandText); - - Console.WriteLine(commandText); - dbCommand.CommandText = commandText; - - DbCommandExecutionResult r1, r2; - r1 = GetExecuteNonQueryResult(dbCommand); - r2 = GetExecuteNonQueryResult(sqlCommand); - - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine(r1); - Console.WriteLine(r2); - - if (r1.RowCount!=r2.RowCount) - return false; - return true; - } - - private SqlCompilationResult Compile(ISqlCompileUnit statement) - { - return sqlDriver.Compile(statement); - } - - #endregion - - #region Setup and TearDown - - [OneTimeSetUp] - public override void SetUp() - { - base.SetUp(); - sqlDriver = TestSqlDriver.Create(Url); - sqlConnection = sqlDriver.CreateConnection(); - - dbCommand = sqlConnection.CreateCommand(); - sqlCommand = sqlConnection.CreateCommand(); - } - - #endregion - - [Test] - public void BinaryExpressionTest() - { - SqlLiteral l = SqlDml.Literal(1); - bool passed = false; - if (!l.IsNullReference()) - passed = true; - Assert.IsTrue(passed); - if (l.IsNullReference()) - passed = false; - Assert.IsTrue(passed); - } - - [Test] - public void ImplicitConversionTest() - { - SqlExpression e = new byte[3]; - Assert.AreEqual(e.GetType(), typeof (SqlLiteral)); - } - - [Test] - public void ArrayTest() //TODO: Find reason why this pattern is structured like this.(Malisa) - { - SqlArray i = SqlDml.Array(new int[] { - 1, 2 - }); - i.Values[0] = 10; - SqlSelect select = SqlDml.Select(); - select.Where = SqlDml.In(1, i); - - MemoryStream ms = new MemoryStream(); - BinaryFormatter bf = new BinaryFormatter(); - bf.Serialize(ms, select); - - ms.Seek(0, SeekOrigin.Begin); - select = (SqlSelect) bf.Deserialize(ms); - - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TypeTest() - { - SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); - SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); - Assert.IsFalse(t1!=t2); - Assert.IsTrue(t1==t2); - Assert.IsTrue(t1.Equals(t2)); - } - - [Test] - public void AddTest() - { - SqlLiteral l1 = SqlDml.Literal(1); - SqlLiteral l2 = SqlDml.Literal(2); - SqlBinary b = l1 + l2; - Assert.AreEqual(b.NodeType, SqlNodeType.Add); - - b = b - ~l1; - Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); - - SqlSelect s = SqlDml.Select(); - s.Columns.Add(1, "id"); - b = b / s; - Assert.AreEqual(b.NodeType, SqlNodeType.Divide); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); - - SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); - Assert.AreEqual(c.NodeType, SqlNodeType.Cast); - - SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); - b = c % l; - Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); - - b = l1 * (-l2); - Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); - Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); - - SqlBatch batch = SqlDml.Batch(); - SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); - batch.Add(v1.Declare()); - batch.Add(SqlDml.Assign(v1, 1.0)); - s = SqlDml.Select(); - s.Columns.Add(b, "value"); - batch.Add(s); - } - - [Test] - public void CircularReferencesTest() - { - SqlSelect select = SqlDml.Select(); - SqlBinary b = SqlDml.Literal(1) + 2; - SqlBinary rb = b + 3; - rb.Left.ReplaceWith(rb); - select.Where = rb > 1; - Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); - } - - [Test] - public void PositionTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); - Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); - } - - [Test] - public void SubstringTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Substring("abc", 1, 1)); - select.Columns.Add(SqlDml.Substring("Xtensive", 2)); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void TrimTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Trim(" abc ")); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); - select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void ExtractTest() //TODO: Determine how to extract. Use .NET? (Malisa) - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void ConcatTest() - { - SqlSelect select = SqlDml.Select(); - select.Columns.Add(SqlDml.Concat("a", SqlDml.Trim(" b"))); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - } - - [Test] - public void IsBooleanExpressionTest() - { - SqlExpression ex = !SqlDml.Literal(true) || true; - } - - [Test] - public void JoinTest() - { - SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); - SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); - SqlTableRef tr3 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); - - SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0]==tr2[0]).InnerJoin(tr3, tr2[0]==tr3[0])); - select.Columns.Add(SqlDml.Asterisk); - sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); - Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); - sqlCommand.Prepare(); - } - - [Test] - [Ignore("Not supported in SQLite")] - public void UniqueTest() - { - SqlSelect s1 = SqlDml.Select(); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["customer"])); - s2.Columns.Add(SqlDml.Asterisk); - s1.Columns.Add(SqlDml.Unique(s2)==true); - Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - [Ignore("Not supported in SQLite")] - public void TrueTest() - { - SqlSelect s1 = SqlDml.Select(); - s1.Where = true; - Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); - } - - [Test] - public void UnionTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s1.Columns.Add(s1.From["TrackId"]); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s2.Columns.Add(s2.From["TrackId"]); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s3.Columns.Add(s3.From["TrackId"]); - - Console.WriteLine(sqlDriver.Compile(s1.Union(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); - s3.Where = SqlDml.In(1, s1.Union(s2)); - Console.WriteLine(sqlDriver.Compile(s3).GetCommandText()); - SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); - Assert.Greater(qr.Columns.Count, 0); - } - - [Test] - public void UnionAllTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); - } - - [Test] - public void IntersectTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); - } - - [Test] - public void ExceptTest() - { - SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s1.Columns.Add(SqlDml.Asterisk); - SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s2.Columns.Add(SqlDml.Asterisk); - SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); - s3.Columns.Add(SqlDml.Asterisk); - - Console.WriteLine(sqlDriver.Compile(s1.Except(s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); - Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.05.13 + +using System; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using NUnit.Framework; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + public class MiscTests : Chinook + { + private DbCommand dbCommand; + private DbCommand sqlCommand; + + private Schema schema = null; + + #region Internals + + private bool CompareExecuteDataReader(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteDataReaderResult(dbCommand); + r2 = GetExecuteDataReaderResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + if (r1.FieldCount!=r2.FieldCount) + return false; + for (int i = 0; i < r1.FieldCount; i++) { + if (r1.FieldNames[i]!=r2.FieldNames[i]) + return false; + } + return true; + } + + private bool CompareExecuteNonQuery(string commandText, ISqlCompileUnit statement) + { + sqlCommand.CommandText = sqlDriver.Compile(statement).GetCommandText(); + sqlCommand.Prepare(); + Console.WriteLine(sqlCommand.CommandText); + + Console.WriteLine(commandText); + dbCommand.CommandText = commandText; + + DbCommandExecutionResult r1, r2; + r1 = GetExecuteNonQueryResult(dbCommand); + r2 = GetExecuteNonQueryResult(sqlCommand); + + Console.WriteLine(); + Console.WriteLine(); + Console.WriteLine(r1); + Console.WriteLine(r2); + + if (r1.RowCount!=r2.RowCount) + return false; + return true; + } + + private SqlCompilationResult Compile(ISqlCompileUnit statement) + { + return sqlDriver.Compile(statement); + } + + #endregion + + #region Setup and TearDown + + [OneTimeSetUp] + public override void SetUp() + { + base.SetUp(); + sqlDriver = TestSqlDriver.Create(Url); + sqlConnection = sqlDriver.CreateConnection(); + + dbCommand = sqlConnection.CreateCommand(); + sqlCommand = sqlConnection.CreateCommand(); + } + + #endregion + + [Test] + public void BinaryExpressionTest() + { + SqlLiteral l = SqlDml.Literal(1); + bool passed = false; + if (!l.IsNullReference()) + passed = true; + Assert.IsTrue(passed); + if (l.IsNullReference()) + passed = false; + Assert.IsTrue(passed); + } + + [Test] + public void ImplicitConversionTest() + { + SqlExpression e = new byte[3]; + Assert.AreEqual(e.GetType(), typeof (SqlLiteral)); + } + + [Test] + public void ArrayTest() //TODO: Find reason why this pattern is structured like this.(Malisa) + { + SqlArray i = SqlDml.Array(new int[] { + 1, 2 + }); + i.Values[0] = 10; + SqlSelect select = SqlDml.Select(); + select.Where = SqlDml.In(1, i); + + MemoryStream ms = new MemoryStream(); + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(ms, select); + + ms.Seek(0, SeekOrigin.Begin); + select = (SqlSelect) bf.Deserialize(ms); + + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TypeTest() + { + SqlValueType t1 = new SqlValueType(SqlType.Decimal, 6, 4); + SqlValueType t2 = new SqlValueType(SqlType.Decimal, 6, 4); + Assert.IsFalse(t1!=t2); + Assert.IsTrue(t1==t2); + Assert.IsTrue(t1.Equals(t2)); + } + + [Test] + public void AddTest() + { + SqlLiteral l1 = SqlDml.Literal(1); + SqlLiteral l2 = SqlDml.Literal(2); + SqlBinary b = l1 + l2; + Assert.AreEqual(b.NodeType, SqlNodeType.Add); + + b = b - ~l1; + Assert.AreEqual(b.NodeType, SqlNodeType.Subtract); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.BitNot); + + SqlSelect s = SqlDml.Select(); + s.Columns.Add(1, "id"); + b = b / s; + Assert.AreEqual(b.NodeType, SqlNodeType.Divide); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.SubSelect); + + SqlCast c = SqlDml.Cast(l1, SqlType.Decimal); + Assert.AreEqual(c.NodeType, SqlNodeType.Cast); + + SqlFunctionCall l = SqlDml.CharLength(SqlDml.Literal("name")); + b = c % l; + Assert.AreEqual(b.NodeType, SqlNodeType.Modulo); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.FunctionCall); + + b = l1 * (-l2); + Assert.AreEqual(b.NodeType, SqlNodeType.Multiply); + Assert.AreEqual(b.Right.NodeType, SqlNodeType.Negate); + + SqlBatch batch = SqlDml.Batch(); + SqlVariable v1 = SqlDml.Variable("v1", SqlType.Double); + batch.Add(v1.Declare()); + batch.Add(SqlDml.Assign(v1, 1.0)); + s = SqlDml.Select(); + s.Columns.Add(b, "value"); + batch.Add(s); + } + + [Test] + public void CircularReferencesTest() + { + SqlSelect select = SqlDml.Select(); + SqlBinary b = SqlDml.Literal(1) + 2; + SqlBinary rb = b + 3; + rb.Left.ReplaceWith(rb); + select.Where = rb > 1; + Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); + } + + [Test] + public void PositionTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Multiply(SqlDml.Position("b", "abc"), 4)); + Assert.Throws(() => Console.WriteLine(sqlDriver.Compile(select).GetCommandText())); + } + + [Test] + public void SubstringTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Substring("abc", 1, 1)); + select.Columns.Add(SqlDml.Substring("Xtensive", 2)); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void TrimTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Trim(" abc ")); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Leading)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Trailing)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both)); + select.Columns.Add(SqlDml.Trim(" abc ", SqlTrimType.Both, " ")); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void ExtractTest() //TODO: Determine how to extract. Use .NET? (Malisa) + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Extract(SqlDateTimePart.Day, "2006-01-23")); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void ConcatTest() + { + SqlSelect select = SqlDml.Select(); + select.Columns.Add(SqlDml.Concat("a", SqlDml.Trim(" b"))); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + } + + [Test] + public void IsBooleanExpressionTest() + { + SqlExpression ex = !SqlDml.Literal(true) || true; + } + + [Test] + public void JoinTest() + { + SqlTableRef tr1 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); + SqlTableRef tr2 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); + SqlTableRef tr3 = SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"]); + + SqlSelect select = SqlDml.Select(tr1.InnerJoin(tr2, tr1[0]==tr2[0]).InnerJoin(tr3, tr2[0]==tr3[0])); + select.Columns.Add(SqlDml.Asterisk); + sqlCommand.CommandText = sqlDriver.Compile(select).GetCommandText(); + Console.WriteLine(sqlDriver.Compile(select).GetCommandText()); + sqlCommand.Prepare(); + } + + [Test] + [Ignore("Not supported in SQLite")] + public void UniqueTest() + { + SqlSelect s1 = SqlDml.Select(); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["customer"])); + s2.Columns.Add(SqlDml.Asterisk); + s1.Columns.Add(SqlDml.Unique(s2)==true); + Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + [Ignore("Not supported in SQLite")] + public void TrueTest() + { + SqlSelect s1 = SqlDml.Select(); + s1.Where = true; + Console.WriteLine(sqlDriver.Compile(s1).GetCommandText()); + } + + [Test] + public void UnionTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s1.Columns.Add(s1.From["TrackId"]); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s2.Columns.Add(s2.From["TrackId"]); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s3.Columns.Add(s3.From["TrackId"]); + + Console.WriteLine(sqlDriver.Compile(s1.Union(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Union(s2).Union(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Union(s2.Union(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1, s1.Union(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Union(s1.Union(s2), s1.Union(s2))).GetCommandText()); + s3.Where = SqlDml.In(1, s1.Union(s2)); + Console.WriteLine(sqlDriver.Compile(s3).GetCommandText()); + SqlQueryRef qr = SqlDml.QueryRef(s1.Union(s2), "qr"); + Assert.Greater(qr.Columns.Count, 0); + } + + [Test] + public void UnionAllTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2).UnionAll(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.UnionAll(s2.UnionAll(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1, s1.UnionAll(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.UnionAll(s1.UnionAll(s2), s1.UnionAll(s2))).GetCommandText()); + } + + [Test] + public void IntersectTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2).Intersect(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Intersect(s2.Intersect(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1, s1.Intersect(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Intersect(s1.Intersect(s2), s1.Intersect(s2))).GetCommandText()); + } + + [Test] + public void ExceptTest() + { + SqlSelect s1 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s1.Columns.Add(SqlDml.Asterisk); + SqlSelect s2 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s2.Columns.Add(SqlDml.Asterisk); + SqlSelect s3 = SqlDml.Select(SqlDml.TableRef(Catalog.Schemas["main"].Tables["track"])); + s3.Columns.Add(SqlDml.Asterisk); + + Console.WriteLine(sqlDriver.Compile(s1.Except(s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Except(s2).Except(s3)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(s1.Except(s2.Except(s3))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s2)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1, s1.Except(s2))).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1)).GetCommandText()); + Console.WriteLine(sqlDriver.Compile(SqlDml.Except(s1.Except(s2), s1.Except(s2))).GetCommandText()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/TypeMappingTests.cs b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/TypeMappingTests.cs index 85f324014a..2a405d2db8 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Sqlite/TypeMappingTests.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/Sqlite/TypeMappingTests.cs @@ -1,25 +1,25 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Malisa Ncube -// Created: 2011.05.13 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Tests.Sql; - -namespace Xtensive.Orm.Tests.Sql.Sqlite -{ - [TestFixture] - [Explicit] - public class TypeMappingTest : Sql.TypeMappingTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Malisa Ncube +// Created: 2011.05.13 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Tests.Sql; + +namespace Xtensive.Orm.Tests.Sql.Sqlite +{ + [TestFixture] + [Explicit] + public class TypeMappingTest : Sql.TypeMappingTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/TestConnectionInfoProvider.cs b/Orm/Xtensive.Orm.Tests.Sql/TestConnectionInfoProvider.cs index 3f70a45325..bcf3eb745d 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/TestConnectionInfoProvider.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/TestConnectionInfoProvider.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.25 - -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Sql -{ - public sealed class TestConnectionInfoProvider - { - public static string GetConnectionUrl() - { - return GetConnectionInfo().ConnectionUrl.Url; - } - - public static string GetProvider() - { - return GetConnectionInfo().Provider; - } - - public static string GetConnectionString() - { - return GetConnectionInfo(TestConfiguration.Instance.Storage, true).ConnectionString; - } - - public static ConnectionInfo GetConnectionInfo() - { - return GetConnectionInfo(TestConfiguration.Instance.Storage, false); - } - - private static ConnectionInfo GetConnectionInfo(string storage, bool useConnectionInfo) - { - if (useConnectionInfo) - storage += "cs"; - var configuration = typeof(TestConnectionInfoProvider).Assembly.GetAssemblyConfiguration(); - var domainConnectionInfo = DomainConfiguration.Load(configuration,storage).ConnectionInfo; - var customConnectionInfo = TestConfiguration.Instance.GetConnectionInfo(storage); - return customConnectionInfo ?? domainConnectionInfo; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.25 + +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Sql +{ + public sealed class TestConnectionInfoProvider + { + public static string GetConnectionUrl() + { + return GetConnectionInfo().ConnectionUrl.Url; + } + + public static string GetProvider() + { + return GetConnectionInfo().Provider; + } + + public static string GetConnectionString() + { + return GetConnectionInfo(TestConfiguration.Instance.Storage, true).ConnectionString; + } + + public static ConnectionInfo GetConnectionInfo() + { + return GetConnectionInfo(TestConfiguration.Instance.Storage, false); + } + + private static ConnectionInfo GetConnectionInfo(string storage, bool useConnectionInfo) + { + if (useConnectionInfo) + storage += "cs"; + var configuration = typeof(TestConnectionInfoProvider).Assembly.GetAssemblyConfiguration(); + var domainConnectionInfo = DomainConfiguration.Load(configuration,storage).ConnectionInfo; + var customConnectionInfo = TestConfiguration.Instance.GetConnectionInfo(storage); + return customConnectionInfo ?? domainConnectionInfo; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests.Sql/TypeMappingTest.cs b/Orm/Xtensive.Orm.Tests.Sql/TypeMappingTest.cs index 00e854502d..93eea89ad5 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/TypeMappingTest.cs +++ b/Orm/Xtensive.Orm.Tests.Sql/TypeMappingTest.cs @@ -1,274 +1,274 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.08 - -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Linq; -using Xtensive.Sql.Dml; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Sql -{ - public abstract class TypeMappingTest : SqlTest - { - private const string IdParameterName = "PId"; - private const string IdColumnName = "Id"; - private const string TableName = "TypeMappingTest"; - - private TypeMapping[] typeMappings; - private object[][] testValues; - - protected override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - var mappings = Driver.TypeMappings.Mappings - .Select(mapping => mapping.Value) - .Where(mapping => StringComparer.InvariantCultureIgnoreCase.Compare(mapping.Type.Namespace, "System")==0); - if (Driver.ServerInfo.DataTypes.DateTimeOffset==null) - mappings = mappings.Where(mapping => mapping.Type!=typeof (DateTimeOffset)); - typeMappings = mappings.ToArray(); - testValues = typeMappings - .Select(mapping => GetTestValues(mapping.Type)) - .ToArray(); - } - - [Test] - public void InsertAndSelectTest() - { - var schema = ExtractDefaultSchema(); - EnsureTableNotExists(schema, TableName); - var table = schema.CreateTable(TableName); - var idColumnType = Driver.TypeMappings[typeof (int)].MapType(); - var idColumn = table.CreateColumn(IdColumnName, idColumnType); - table.CreatePrimaryKey("PK_" + TableName, idColumn); - for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) { - var mapping = typeMappings[columnIndex]; - var column = table.CreateColumn(GetColumnName(columnIndex), mapping.MapType()); - column.IsNullable = true; - } - ExecuteNonQuery(SqlDdl.Create(table)); - var tableRef = SqlDml.TableRef(table); - using (var insertCommand = Connection.CreateCommand()) { - var insertQuery = SqlDml.Insert(tableRef); - var idParameter = insertCommand.CreateParameter(); - idParameter.DbType = DbType.Int32; - idParameter.ParameterName = IdParameterName; - insertCommand.Parameters.Add(idParameter); - insertQuery.Values.Add(tableRef[IdColumnName], SqlDml.ParameterRef(IdParameterName)); - var parameters = new List(); - for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) { - var mapping = typeMappings[columnIndex]; - var parameterName = GetParameterName(columnIndex); - SqlExpression parameterExpression = SqlDml.ParameterRef(parameterName); - if (mapping.ParameterCastRequired) - parameterExpression = SqlDml.Cast(parameterExpression, mapping.MapType()); - insertQuery.Values.Add(tableRef[GetColumnName(columnIndex)], parameterExpression); - var parameter = insertCommand.CreateParameter(); - parameter.ParameterName = parameterName; - parameters.Add(parameter); - insertCommand.Parameters.Add(parameter); - } - var insertQueryText = Driver.Compile(insertQuery).GetCommandText(); - insertCommand.CommandText = insertQueryText; - for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { - idParameter.Value = rowIndex; - for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) - typeMappings[columnIndex].BindValue(parameters[columnIndex], testValues[columnIndex][rowIndex]); - insertCommand.ExecuteNonQuery(); - } - } - var resultQuery = SqlDml.Select(tableRef); - resultQuery.Columns.Add(SqlDml.Asterisk); - resultQuery.OrderBy.Add(tableRef[IdColumnName]); - VerifyResults(Connection.CreateCommand(resultQuery)); - } - - [Test] - public void SelectParametersTest() - { - int parameterIndex = 0; - var queries = new List(); - var command = Connection.CreateCommand(); - for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { - var query = SqlDml.Select(); - queries.Add(query); - query.Columns.Add(SqlDml.Literal(rowIndex), IdColumnName); - for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { - var mapping = typeMappings[columnIndex]; - var columnName = GetColumnName(columnIndex); - var parameterName = GetParameterName(parameterIndex++); - SqlExpression parameterExpression = SqlDml.ParameterRef(parameterName); - if (mapping.ParameterCastRequired) - parameterExpression = SqlDml.Cast(parameterExpression, mapping.MapType()); - query.Columns.Add(parameterExpression, columnName); - var parameter = command.CreateParameter(); - parameter.ParameterName = parameterName; - typeMappings[columnIndex].BindValue(parameter, testValues[columnIndex][rowIndex]); - command.Parameters.Add(parameter); - } - } - var unionQueryRef = SqlDml.QueryRef(queries.Cast().Aggregate(SqlDml.UnionAll)); - var resultQuery = SqlDml.Select(unionQueryRef); - resultQuery.Columns.Add(SqlDml.Asterisk); - resultQuery.OrderBy.Add(unionQueryRef[IdColumnName]); - command.CommandText = Driver.Compile(resultQuery).GetCommandText(); - VerifyResults(command); - } - - [Test] - public void SelectConstantsTest() - { - var queries = new List(); - var command = Connection.CreateCommand(); - for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { - var query = SqlDml.Select(); - queries.Add(query); - query.Columns.Add(SqlDml.Literal(rowIndex), IdColumnName); - for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { - var columnName = GetColumnName(columnIndex); - var value = testValues[columnIndex][rowIndex]; - var mapping = typeMappings[columnIndex]; - var valueExpression = value==null - ? (SqlExpression) SqlDml.Null - : mapping.ParameterCastRequired - ? (SqlExpression) SqlDml.Cast(SqlDml.Literal(value), mapping.MapType()) - : SqlDml.Literal(value); - query.Columns.Add(valueExpression, columnName); - } - } - var unionQueryRef = SqlDml.QueryRef(queries.Cast().Aggregate(SqlDml.UnionAll)); - var resultQuery = SqlDml.Select(unionQueryRef); - resultQuery.Columns.Add(SqlDml.Asterisk); - resultQuery.OrderBy.Add(unionQueryRef[IdColumnName]); - command.CommandText = Driver.Compile(resultQuery).GetCommandText(); - VerifyResults(command, true); - } - - protected virtual void CheckEquality(object expected, object actual) - { - Assert.AreEqual(expected, actual); - } - - protected virtual object ReadValue(TypeMapping mapping, DbDataReader reader, int index) - { - return mapping.ReadValue(reader, index); - } - - private void VerifyResults(DbCommand command) - { - VerifyResults(command, false); - } - - private void VerifyResults(DbCommand command, bool skipCheckForByteArray) - { - using (command) - using (var reader = command.ExecuteReader()) { - int rowIndex = 0; - while (reader.Read()) { - for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { - var expectedValue = testValues[columnIndex][rowIndex]; - if (expectedValue is byte[] && skipCheckForByteArray) - continue; // stupid hack for oracle - var actualValue = !reader.IsDBNull(columnIndex + 1) - ? ReadValue(typeMappings[columnIndex], reader, columnIndex + 1) - : null; - CheckEquality(expectedValue, actualValue); - } - rowIndex++; - } - Assert.AreEqual(testValues[0].Length, rowIndex); - } - } - - private static object[] GetTestValues(Type type) - { - // NOTE: there should be the same number of test values for each type - switch (Type.GetTypeCode(type)) { - case TypeCode.Boolean: - return new object[] {default(bool), false, true, null}; - case TypeCode.Char: - return new object[] {default(char), 'Y', '\n', null}; - case TypeCode.String: - return new object[] {"write code", "??????", "profit", null}; - case TypeCode.Byte: - return new object[] {default(byte), (byte) 10, (byte) 20, null}; - case TypeCode.SByte: - return new object[] {default(sbyte), (sbyte) -10, (sbyte) 10, null}; - case TypeCode.Int16: - return new object[] {default(short), (short) (sbyte.MinValue - 1), (short) (sbyte.MaxValue + 1), null}; - case TypeCode.UInt16: - return new object[] {default(ushort), (ushort) 10, (ushort) (short.MaxValue + 1), null}; - case TypeCode.Int32: - return new object[] {default(int), short.MinValue - 1, short.MaxValue + 1, null}; - case TypeCode.UInt32: - return new object[] {default(uint), (uint) 10, ((uint) int.MaxValue + 1), null}; - case TypeCode.Int64: - return new object[] {default(long), ((long) int.MinValue - 1), ((long) int.MaxValue + 1), null}; - case TypeCode.UInt64: - return new object[] {default(ulong), (ulong) 10, ((ulong) long.MaxValue + 1), null}; - case TypeCode.Single: - return new object[] {default(float), -5.55f, 0.34f, null}; - case TypeCode.Double: - return new object[] {default(double), 3.98d, -3.3333d, null}; - case TypeCode.Decimal: - return new object[] {default(decimal), 222.4444m, -0.0005m, null}; - case TypeCode.DateTime: - return new object[] - { - new DateTime(2005, 5, 5, 5, 5, 5), - new DateTime(1998, 8, 8, 8, 8, 8), - new DateTime(1856, 4, 1, 5, 6, 7), - null - }; - } - if (type==typeof(TimeSpan)) - return new object[] - { - new TimeSpan(10, 10, 10, 10), - new TimeSpan(-3, -3, -3, -3), - new TimeSpan(113, 4, 6, 8), - null - }; - if (type==typeof(Guid)) - return new object[] - { - new Guid("{13826748-1625-4934-8CDC-3B2047138DD5}"), - new Guid("{42D3CD2D-E909-4a7c-8C43-B35DE4BF4740}"), - new Guid("{EA8496CC-2034-458f-91AA-2A77BCA407DA}"), - null - }; - if (type==typeof(byte[])) - return new object[] - { - new byte[0], - new [] {(byte) 5, (byte) 6, (byte) 8}, - new [] {byte.MinValue, byte.MaxValue}, - null, - }; - if (type==typeof (DateTimeOffset)) - return new object[] { - new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(4, 10, 0)), - new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(4, 11, 0)), - new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(3, 10, 0)), - null - }; - throw new ArgumentOutOfRangeException(); - } - - private static string GetParameterName(int parameterIndex) - { - return string.Format("P{0:00}", parameterIndex); - } - - private static string GetColumnName(int columnIndex) - { - return string.Format("C{0:00}", columnIndex); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.08 + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using Xtensive.Sql.Dml; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Sql +{ + public abstract class TypeMappingTest : SqlTest + { + private const string IdParameterName = "PId"; + private const string IdColumnName = "Id"; + private const string TableName = "TypeMappingTest"; + + private TypeMapping[] typeMappings; + private object[][] testValues; + + protected override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + var mappings = Driver.TypeMappings.Mappings + .Select(mapping => mapping.Value) + .Where(mapping => StringComparer.InvariantCultureIgnoreCase.Compare(mapping.Type.Namespace, "System")==0); + if (Driver.ServerInfo.DataTypes.DateTimeOffset==null) + mappings = mappings.Where(mapping => mapping.Type!=typeof (DateTimeOffset)); + typeMappings = mappings.ToArray(); + testValues = typeMappings + .Select(mapping => GetTestValues(mapping.Type)) + .ToArray(); + } + + [Test] + public void InsertAndSelectTest() + { + var schema = ExtractDefaultSchema(); + EnsureTableNotExists(schema, TableName); + var table = schema.CreateTable(TableName); + var idColumnType = Driver.TypeMappings[typeof (int)].MapType(); + var idColumn = table.CreateColumn(IdColumnName, idColumnType); + table.CreatePrimaryKey("PK_" + TableName, idColumn); + for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) { + var mapping = typeMappings[columnIndex]; + var column = table.CreateColumn(GetColumnName(columnIndex), mapping.MapType()); + column.IsNullable = true; + } + ExecuteNonQuery(SqlDdl.Create(table)); + var tableRef = SqlDml.TableRef(table); + using (var insertCommand = Connection.CreateCommand()) { + var insertQuery = SqlDml.Insert(tableRef); + var idParameter = insertCommand.CreateParameter(); + idParameter.DbType = DbType.Int32; + idParameter.ParameterName = IdParameterName; + insertCommand.Parameters.Add(idParameter); + insertQuery.Values.Add(tableRef[IdColumnName], SqlDml.ParameterRef(IdParameterName)); + var parameters = new List(); + for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) { + var mapping = typeMappings[columnIndex]; + var parameterName = GetParameterName(columnIndex); + SqlExpression parameterExpression = SqlDml.ParameterRef(parameterName); + if (mapping.ParameterCastRequired) + parameterExpression = SqlDml.Cast(parameterExpression, mapping.MapType()); + insertQuery.Values.Add(tableRef[GetColumnName(columnIndex)], parameterExpression); + var parameter = insertCommand.CreateParameter(); + parameter.ParameterName = parameterName; + parameters.Add(parameter); + insertCommand.Parameters.Add(parameter); + } + var insertQueryText = Driver.Compile(insertQuery).GetCommandText(); + insertCommand.CommandText = insertQueryText; + for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { + idParameter.Value = rowIndex; + for (int columnIndex = 0; columnIndex < typeMappings.Length; columnIndex++) + typeMappings[columnIndex].BindValue(parameters[columnIndex], testValues[columnIndex][rowIndex]); + insertCommand.ExecuteNonQuery(); + } + } + var resultQuery = SqlDml.Select(tableRef); + resultQuery.Columns.Add(SqlDml.Asterisk); + resultQuery.OrderBy.Add(tableRef[IdColumnName]); + VerifyResults(Connection.CreateCommand(resultQuery)); + } + + [Test] + public void SelectParametersTest() + { + int parameterIndex = 0; + var queries = new List(); + var command = Connection.CreateCommand(); + for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { + var query = SqlDml.Select(); + queries.Add(query); + query.Columns.Add(SqlDml.Literal(rowIndex), IdColumnName); + for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { + var mapping = typeMappings[columnIndex]; + var columnName = GetColumnName(columnIndex); + var parameterName = GetParameterName(parameterIndex++); + SqlExpression parameterExpression = SqlDml.ParameterRef(parameterName); + if (mapping.ParameterCastRequired) + parameterExpression = SqlDml.Cast(parameterExpression, mapping.MapType()); + query.Columns.Add(parameterExpression, columnName); + var parameter = command.CreateParameter(); + parameter.ParameterName = parameterName; + typeMappings[columnIndex].BindValue(parameter, testValues[columnIndex][rowIndex]); + command.Parameters.Add(parameter); + } + } + var unionQueryRef = SqlDml.QueryRef(queries.Cast().Aggregate(SqlDml.UnionAll)); + var resultQuery = SqlDml.Select(unionQueryRef); + resultQuery.Columns.Add(SqlDml.Asterisk); + resultQuery.OrderBy.Add(unionQueryRef[IdColumnName]); + command.CommandText = Driver.Compile(resultQuery).GetCommandText(); + VerifyResults(command); + } + + [Test] + public void SelectConstantsTest() + { + var queries = new List(); + var command = Connection.CreateCommand(); + for (int rowIndex = 0; rowIndex < testValues[0].Length; rowIndex++) { + var query = SqlDml.Select(); + queries.Add(query); + query.Columns.Add(SqlDml.Literal(rowIndex), IdColumnName); + for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { + var columnName = GetColumnName(columnIndex); + var value = testValues[columnIndex][rowIndex]; + var mapping = typeMappings[columnIndex]; + var valueExpression = value==null + ? (SqlExpression) SqlDml.Null + : mapping.ParameterCastRequired + ? (SqlExpression) SqlDml.Cast(SqlDml.Literal(value), mapping.MapType()) + : SqlDml.Literal(value); + query.Columns.Add(valueExpression, columnName); + } + } + var unionQueryRef = SqlDml.QueryRef(queries.Cast().Aggregate(SqlDml.UnionAll)); + var resultQuery = SqlDml.Select(unionQueryRef); + resultQuery.Columns.Add(SqlDml.Asterisk); + resultQuery.OrderBy.Add(unionQueryRef[IdColumnName]); + command.CommandText = Driver.Compile(resultQuery).GetCommandText(); + VerifyResults(command, true); + } + + protected virtual void CheckEquality(object expected, object actual) + { + Assert.AreEqual(expected, actual); + } + + protected virtual object ReadValue(TypeMapping mapping, DbDataReader reader, int index) + { + return mapping.ReadValue(reader, index); + } + + private void VerifyResults(DbCommand command) + { + VerifyResults(command, false); + } + + private void VerifyResults(DbCommand command, bool skipCheckForByteArray) + { + using (command) + using (var reader = command.ExecuteReader()) { + int rowIndex = 0; + while (reader.Read()) { + for (int columnIndex = 0; columnIndex < testValues.Length; columnIndex++) { + var expectedValue = testValues[columnIndex][rowIndex]; + if (expectedValue is byte[] && skipCheckForByteArray) + continue; // stupid hack for oracle + var actualValue = !reader.IsDBNull(columnIndex + 1) + ? ReadValue(typeMappings[columnIndex], reader, columnIndex + 1) + : null; + CheckEquality(expectedValue, actualValue); + } + rowIndex++; + } + Assert.AreEqual(testValues[0].Length, rowIndex); + } + } + + private static object[] GetTestValues(Type type) + { + // NOTE: there should be the same number of test values for each type + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + return new object[] {default(bool), false, true, null}; + case TypeCode.Char: + return new object[] {default(char), 'Y', '\n', null}; + case TypeCode.String: + return new object[] {"write code", "??????", "profit", null}; + case TypeCode.Byte: + return new object[] {default(byte), (byte) 10, (byte) 20, null}; + case TypeCode.SByte: + return new object[] {default(sbyte), (sbyte) -10, (sbyte) 10, null}; + case TypeCode.Int16: + return new object[] {default(short), (short) (sbyte.MinValue - 1), (short) (sbyte.MaxValue + 1), null}; + case TypeCode.UInt16: + return new object[] {default(ushort), (ushort) 10, (ushort) (short.MaxValue + 1), null}; + case TypeCode.Int32: + return new object[] {default(int), short.MinValue - 1, short.MaxValue + 1, null}; + case TypeCode.UInt32: + return new object[] {default(uint), (uint) 10, ((uint) int.MaxValue + 1), null}; + case TypeCode.Int64: + return new object[] {default(long), ((long) int.MinValue - 1), ((long) int.MaxValue + 1), null}; + case TypeCode.UInt64: + return new object[] {default(ulong), (ulong) 10, ((ulong) long.MaxValue + 1), null}; + case TypeCode.Single: + return new object[] {default(float), -5.55f, 0.34f, null}; + case TypeCode.Double: + return new object[] {default(double), 3.98d, -3.3333d, null}; + case TypeCode.Decimal: + return new object[] {default(decimal), 222.4444m, -0.0005m, null}; + case TypeCode.DateTime: + return new object[] + { + new DateTime(2005, 5, 5, 5, 5, 5), + new DateTime(1998, 8, 8, 8, 8, 8), + new DateTime(1856, 4, 1, 5, 6, 7), + null + }; + } + if (type==typeof(TimeSpan)) + return new object[] + { + new TimeSpan(10, 10, 10, 10), + new TimeSpan(-3, -3, -3, -3), + new TimeSpan(113, 4, 6, 8), + null + }; + if (type==typeof(Guid)) + return new object[] + { + new Guid("{13826748-1625-4934-8CDC-3B2047138DD5}"), + new Guid("{42D3CD2D-E909-4a7c-8C43-B35DE4BF4740}"), + new Guid("{EA8496CC-2034-458f-91AA-2A77BCA407DA}"), + null + }; + if (type==typeof(byte[])) + return new object[] + { + new byte[0], + new [] {(byte) 5, (byte) 6, (byte) 8}, + new [] {byte.MinValue, byte.MaxValue}, + null, + }; + if (type==typeof (DateTimeOffset)) + return new object[] { + new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(4, 10, 0)), + new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(4, 11, 0)), + new DateTimeOffset(2001, 1, 1, 1, 1, 1, 1, new TimeSpan(3, 10, 0)), + null + }; + throw new ArgumentOutOfRangeException(); + } + + private static string GetParameterName(int parameterIndex) + { + return string.Format("P{0:00}", parameterIndex); + } + + private static string GetColumnName(int columnIndex) + { + return string.Format("C{0:00}", columnIndex); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.Sql/Xtensive.Orm.Tests.Sql.csproj b/Orm/Xtensive.Orm.Tests.Sql/Xtensive.Orm.Tests.Sql.csproj index 01c7ecc7f9..2c1aea5484 100644 --- a/Orm/Xtensive.Orm.Tests.Sql/Xtensive.Orm.Tests.Sql.csproj +++ b/Orm/Xtensive.Orm.Tests.Sql/Xtensive.Orm.Tests.Sql.csproj @@ -1,46 +1,46 @@ - - - true - false - ..\..\_Build\$(Configuration)\lib\ - - - netcoreapp2.0 - 2.0.3 - Xtensive - true - ..\Orm.snk - true - 2 - - - TRACE;DEBUG;NETCOREAPP - - - TRACE;NETCOREAPP - - - - - - - - - - - - - - - - - - Orm.config - - - - Always - - - + + + true + false + ..\..\_Build\$(Configuration)\lib\ + + + netcoreapp2.0 + 2.0.3 + Xtensive + true + ..\Orm.snk + true + 2 + + + TRACE;DEBUG;NETCOREAPP + + + TRACE;NETCOREAPP + + + + + + + + + + + + + + + + + + Orm.config + + + + Always + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/App.config b/Orm/Xtensive.Orm.Tests.VB/App.config index 9d0b93f1cb..e8316e3e0c 100644 --- a/Orm/Xtensive.Orm.Tests.VB/App.config +++ b/Orm/Xtensive.Orm.Tests.VB/App.config @@ -1,27 +1,27 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - + + + +
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests.VB/Linq/ConversionTest.vb b/Orm/Xtensive.Orm.Tests.VB/Linq/ConversionTest.vb index b227c3d33c..48a199f126 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Linq/ConversionTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Linq/ConversionTest.vb @@ -1,258 +1,258 @@ -Option Strict On - -Imports Xtensive.Orm.Tests.ObjectModel -Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO -Imports NUnit.Framework - -Namespace Linq - - Public Class ConversionTest - Inherits NorthwindDOModelTest - Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) - Get - Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) - End Get - End Property - - - Public Sub StringToBooleanTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean(customer.Id) _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean(customer.Id) _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToByteTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToCharTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToChar(customer.Id) <> "a"c _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToChar(customer.Id) <> "a"c _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToDateTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDate(customer.Id) < DateTime.Now _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDate(customer.Id) < DateTime.Now _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - - Public Sub StringToDecimalTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub BooleanToDecimalTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id <> "test") > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id <> "test") > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToDoubleTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToIntegerTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToLongTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(customer.Id) > 1L _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(customer.Id) > 1L _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToSByteTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToShortTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToShort(customer.Id) > 1S _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToShort(customer.Id) > 1S _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToSingleTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle(customer.Id) > 1S _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle(customer.Id) > 1S _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToUIntegerTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToULongTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToULong(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToULong(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub StringToUShortTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort(customer.Id) > 1 _ - Select customer) _ - .ToList() - - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort(customer.Id) > 1 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub ToStringTest() - ToStringGenericTest(Of Boolean)(True) - ToStringGenericTest(Of Byte)(1) - ToStringGenericTest(Of Char)("a"c) - ToStringGenericTest(Of Date)(Date.Now) - ToStringGenericTest(Of Decimal)(1) - ToStringGenericTest(Of Double)(1) - ToStringGenericTest(Of Short)(1) - ToStringGenericTest(Of Integer)(1) - ToStringGenericTest(Of Long)(1) - ToStringGenericTest(Of Single)(1) - ToStringGenericTest(Of UInt32)(1) - ToStringGenericTest(Of UInt64)(1) - End Sub - - Public Sub ToStringGenericTest(Of TType)(ByVal ParamArray parameter() As TType) - Dim store = Query.Store(Of TType)(parameter) - Dim result = (From customer In store _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToString(customer) <> "test" _ - Select customer) _ - .ToList() - - Dim expected = (From customer In store.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Conversions.ToString(parameter) <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - End Class +Option Strict On + +Imports Xtensive.Orm.Tests.ObjectModel +Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO +Imports NUnit.Framework + +Namespace Linq + + Public Class ConversionTest + Inherits NorthwindDOModelTest + Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) + Get + Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) + End Get + End Property + + + Public Sub StringToBooleanTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean(customer.Id) _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean(customer.Id) _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToByteTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToCharTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToChar(customer.Id) <> "a"c _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToChar(customer.Id) <> "a"c _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToDateTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDate(customer.Id) < DateTime.Now _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDate(customer.Id) < DateTime.Now _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + + Public Sub StringToDecimalTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub BooleanToDecimalTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id <> "test") > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(customer.Id <> "test") > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToDoubleTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToIntegerTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToLongTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(customer.Id) > 1L _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(customer.Id) > 1L _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToSByteTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToShortTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToShort(customer.Id) > 1S _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToShort(customer.Id) > 1S _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToSingleTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle(customer.Id) > 1S _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle(customer.Id) > 1S _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToUIntegerTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToULongTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToULong(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToULong(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub StringToUShortTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort(customer.Id) > 1 _ + Select customer) _ + .ToList() + + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort(customer.Id) > 1 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub ToStringTest() + ToStringGenericTest(Of Boolean)(True) + ToStringGenericTest(Of Byte)(1) + ToStringGenericTest(Of Char)("a"c) + ToStringGenericTest(Of Date)(Date.Now) + ToStringGenericTest(Of Decimal)(1) + ToStringGenericTest(Of Double)(1) + ToStringGenericTest(Of Short)(1) + ToStringGenericTest(Of Integer)(1) + ToStringGenericTest(Of Long)(1) + ToStringGenericTest(Of Single)(1) + ToStringGenericTest(Of UInt32)(1) + ToStringGenericTest(Of UInt64)(1) + End Sub + + Public Sub ToStringGenericTest(Of TType)(ByVal ParamArray parameter() As TType) + Dim store = Query.Store(Of TType)(parameter) + Dim result = (From customer In store _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToString(customer) <> "test" _ + Select customer) _ + .ToList() + + Dim expected = (From customer In store.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Conversions.ToString(parameter) <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + End Class End Namespace \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/Linq/DateTimeTest.vb b/Orm/Xtensive.Orm.Tests.VB/Linq/DateTimeTest.vb index e49c5940c2..7a98bb28c1 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Linq/DateTimeTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Linq/DateTimeTest.vb @@ -1,164 +1,164 @@ -Imports NUnit.Framework -Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO -Imports Xtensive.Orm.Tests.ObjectModel - -Namespace Linq - - Public Class DateTimeTest - Inherits NorthwindDOModelTest - - Public Shadows ReadOnly Property Orders As IOrderedQueryable(Of Order) - Get - Return Query.All(Of Order)().OrderBy(Function(c) c.Id) - End Get - End Property - - - - Public Sub DatePartNotSupported1Test() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.DatePart("Day", order.OrderDate) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.DatePart("Day", order.OrderDate) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - - Public Sub DatePartNotSupported2Test() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.DatePart(DateInterval.Day, order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.DatePart(DateInterval.Day, order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub NowTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Now > order.OrderDate.Value _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Now > order.OrderDate.Value _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub YearTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Year(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Year(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub MonthTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Month(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Month(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub DayTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Day(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Day(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub HourTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Hour(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Hour(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub MinuteTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Minute(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Minute(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub SecondTest() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.Second(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.Second(order.OrderDate.Value) > 0 _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - - Public Sub MonthNameNotSupported1Test() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, True) <> "test" _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, True) <> "test" _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - - Public Sub MonthNameNotSupported2Test() - Dim result = (From order In Orders _ - Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, False) <> "test" _ - Select order) _ - .ToList() - Dim expected = (From order In Orders.ToList _ - Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, False) <> "test" _ - Select order) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - End Class +Imports NUnit.Framework +Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO +Imports Xtensive.Orm.Tests.ObjectModel + +Namespace Linq + + Public Class DateTimeTest + Inherits NorthwindDOModelTest + + Public Shadows ReadOnly Property Orders As IOrderedQueryable(Of Order) + Get + Return Query.All(Of Order)().OrderBy(Function(c) c.Id) + End Get + End Property + + + + Public Sub DatePartNotSupported1Test() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.DatePart("Day", order.OrderDate) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.DatePart("Day", order.OrderDate) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + + Public Sub DatePartNotSupported2Test() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.DatePart(DateInterval.Day, order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.DatePart(DateInterval.Day, order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub NowTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Now > order.OrderDate.Value _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Now > order.OrderDate.Value _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub YearTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Year(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Year(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub MonthTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Month(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Month(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub DayTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Day(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Day(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub HourTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Hour(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Hour(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub MinuteTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Minute(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Minute(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub SecondTest() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.Second(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.Second(order.OrderDate.Value) > 0 _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + + Public Sub MonthNameNotSupported1Test() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, True) <> "test" _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, True) <> "test" _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + + Public Sub MonthNameNotSupported2Test() + Dim result = (From order In Orders _ + Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, False) <> "test" _ + Select order) _ + .ToList() + Dim expected = (From order In Orders.ToList _ + Where Microsoft.VisualBasic.DateAndTime.MonthName(order.OrderDate.Value.Month, False) <> "test" _ + Select order) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + End Class End Namespace \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/Linq/OperatorsTest.vb b/Orm/Xtensive.Orm.Tests.VB/Linq/OperatorsTest.vb index e0679d4526..0c403fea56 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Linq/OperatorsTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Linq/OperatorsTest.vb @@ -1,64 +1,64 @@ -Imports Xtensive.Orm.Tests.ObjectModel -Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO -Imports NUnit.Framework - -Namespace Linq - - Public Class OperatorsTest - Inherits NorthwindDOModelTest - - Public Shadows ReadOnly Property Orders As IOrderedQueryable(Of Order) - Get - Return Query.All(Of Order)().OrderBy(Function(c) c.Id) - End Get - End Property - - Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) - Get - Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) - End Get - End Property - - - Public Sub CompareString1Test() - Dim result = (From customer In Customers _ - Where customer.CompanyName > "test" _ - Select customer) _ - .ToList() - ' SQL compares CaseInsensitive by default - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.CompilerServices.Operators.CompareString(customer.CompanyName, "test", True) > 0 _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub CompareString2Test() - Dim result = (From customer In Customers _ - Select customer.CompanyName > "test") _ - .Where(Function(i) i > 0) _ - .ToList() - ' SQL compares CaseInsensitive by default - Dim expected = (From customer In Customers.ToList() _ - Select customer.CompanyName > "test") _ - .Where(Function(i) i > 0) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub BooleanTest() - Dim result = (From order In Orders _ - Select order.Freight > 10) _ - .Where(Function(i) i > 0) _ - .ToList() - Dim expected = (From order In Orders.ToList() _ - Select order.Freight > 10) _ - .Where(Function(i) i > 0) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - End Class +Imports Xtensive.Orm.Tests.ObjectModel +Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO +Imports NUnit.Framework + +Namespace Linq + + Public Class OperatorsTest + Inherits NorthwindDOModelTest + + Public Shadows ReadOnly Property Orders As IOrderedQueryable(Of Order) + Get + Return Query.All(Of Order)().OrderBy(Function(c) c.Id) + End Get + End Property + + Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) + Get + Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) + End Get + End Property + + + Public Sub CompareString1Test() + Dim result = (From customer In Customers _ + Where customer.CompanyName > "test" _ + Select customer) _ + .ToList() + ' SQL compares CaseInsensitive by default + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.CompilerServices.Operators.CompareString(customer.CompanyName, "test", True) > 0 _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub CompareString2Test() + Dim result = (From customer In Customers _ + Select customer.CompanyName > "test") _ + .Where(Function(i) i > 0) _ + .ToList() + ' SQL compares CaseInsensitive by default + Dim expected = (From customer In Customers.ToList() _ + Select customer.CompanyName > "test") _ + .Where(Function(i) i > 0) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub BooleanTest() + Dim result = (From order In Orders _ + Select order.Freight > 10) _ + .Where(Function(i) i > 0) _ + .ToList() + Dim expected = (From order In Orders.ToList() _ + Select order.Freight > 10) _ + .Where(Function(i) i > 0) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + End Class End Namespace \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/Linq/StringTest.vb b/Orm/Xtensive.Orm.Tests.VB/Linq/StringTest.vb index 64c8edb0ea..6f683ce38c 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Linq/StringTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Linq/StringTest.vb @@ -1,174 +1,174 @@ -Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO -Imports Xtensive.Orm.Tests.ObjectModel -Imports Xtensive.Orm.Configuration -Imports NUnit.Framework - -Namespace Linq - - Public Class StringTest - Inherits NorthwindDOModelTest - - Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) - Get - Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) - End Get - End Property - - - Public Sub TrimTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Trim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Trim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub LTrimTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.LTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.LTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub RTrimTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.RTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.RTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub LenTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ") > 0 _ - Select Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ")) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ") > 0 _ - Select Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ")) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub LeftTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Left(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Left(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - - Public Sub RightTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Right(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Right(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub Mid2Test() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub Mid3Test() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2, 1) <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2, 1) <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub UCaseStringTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.UCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.UCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub LCaseStringTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.LCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.LCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub UCaseCharTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.UCase("A"c) <> "A"c _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.UCase("A"c) <> "A"c _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - - - Public Sub LCaseCharTest() - Dim result = (From customer In Customers _ - Where Microsoft.VisualBasic.Strings.LCase("A"c) <> "A"c _ - Select customer) _ - .ToList() - Dim expected = (From customer In Customers.ToList() _ - Where Microsoft.VisualBasic.Strings.LCase("A"c) <> "A"c _ - Select customer) _ - .ToList() - Assert.IsTrue(expected.SequenceEqual(result)) - End Sub - End Class +Imports Xtensive.Orm.Tests.ObjectModel.NorthwindDO +Imports Xtensive.Orm.Tests.ObjectModel +Imports Xtensive.Orm.Configuration +Imports NUnit.Framework + +Namespace Linq + + Public Class StringTest + Inherits NorthwindDOModelTest + + Public Shadows ReadOnly Property Customers As IOrderedQueryable(Of Customer) + Get + Return Query.All(Of Customer)().OrderBy(Function(c) c.Id) + End Get + End Property + + + Public Sub TrimTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Trim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Trim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub LTrimTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.LTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.LTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub RTrimTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.RTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.RTrim(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub LenTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ") > 0 _ + Select Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ")) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ") > 0 _ + Select Microsoft.VisualBasic.Strings.Len(" prefix " + customer.CompanyName + " suffix ")) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub LeftTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Left(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Left(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + + Public Sub RightTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Right(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Right(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub Mid2Test() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2) <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub Mid3Test() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2, 1) <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.Mid(" prefix " + customer.CompanyName + " suffix ", 2, 1) <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub UCaseStringTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.UCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.UCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub LCaseStringTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.LCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.LCase(" prefix " + customer.CompanyName + " suffix ") <> "test" _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub UCaseCharTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.UCase("A"c) <> "A"c _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.UCase("A"c) <> "A"c _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + + + Public Sub LCaseCharTest() + Dim result = (From customer In Customers _ + Where Microsoft.VisualBasic.Strings.LCase("A"c) <> "A"c _ + Select customer) _ + .ToList() + Dim expected = (From customer In Customers.ToList() _ + Where Microsoft.VisualBasic.Strings.LCase("A"c) <> "A"c _ + Select customer) _ + .ToList() + Assert.IsTrue(expected.SequenceEqual(result)) + End Sub + End Class End Namespace \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/Model/Model.vb b/Orm/Xtensive.Orm.Tests.VB/Model/Model.vb index 565ab04d1e..2475bae71d 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Model/Model.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Model/Model.vb @@ -1,43 +1,43 @@ -Namespace Model - Public Class NonPersistent - Public Property Id As Integer - End Class - - - Public Class Author - Inherits Entity - - Sub New() - MyBase.New() - End Sub - - - Public Property Id As Integer - - - Public Property Name As String - - - - Public Property Books As EntitySet(Of Book) - End Class - - - Public Class Book - Inherits Entity - - Sub New() - MyBase.New() - End Sub - - - Public Property Id As Integer - - - Public Property Name As String - - - Public Property Author As Author - - End Class -End Namespace +Namespace Model + Public Class NonPersistent + Public Property Id As Integer + End Class + + + Public Class Author + Inherits Entity + + Sub New() + MyBase.New() + End Sub + + + Public Property Id As Integer + + + Public Property Name As String + + + + Public Property Books As EntitySet(Of Book) + End Class + + + Public Class Book + Inherits Entity + + Sub New() + MyBase.New() + End Sub + + + Public Property Id As Integer + + + Public Property Name As String + + + Public Property Author As Author + + End Class +End Namespace diff --git a/Orm/Xtensive.Orm.Tests.VB/Model/PersistenceTest.vb b/Orm/Xtensive.Orm.Tests.VB/Model/PersistenceTest.vb index 0ba07a74e6..8efe7f80a7 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Model/PersistenceTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Model/PersistenceTest.vb @@ -1,34 +1,34 @@ - -Imports Xtensive.Orm.Configuration -Imports NUnit.Framework - -Namespace Model - - Public Class PersistenceTest - Inherits AutoBuildTest - - Protected Overrides Function BuildConfiguration() As DomainConfiguration - Dim config = MyBase.BuildConfiguration() - config.Types.Register(GetType(Author).Assembly, GetType(Author).Namespace) - - Return config - End Function - - - - Public Sub MainTest() - Using session As Session = Domain.OpenSession() - Using scope As TransactionScope = session.OpenTransaction() - Dim author = New Author With {.Name = "Vasya"} - Dim book = New Book With {.Name = "The Book", .Author = author} - Assert.AreEqual(1, author.Books.Count) - Dim result = From c In Query.All(Of Author)() - Select c - Dim list = result.ToList() - Dim loaded = result.Single() - Assert.AreEqual("Vasya", loaded.Name) - End Using - End Using - End Sub - End Class -End Namespace + +Imports Xtensive.Orm.Configuration +Imports NUnit.Framework + +Namespace Model + + Public Class PersistenceTest + Inherits AutoBuildTest + + Protected Overrides Function BuildConfiguration() As DomainConfiguration + Dim config = MyBase.BuildConfiguration() + config.Types.Register(GetType(Author).Assembly, GetType(Author).Namespace) + + Return config + End Function + + + + Public Sub MainTest() + Using session As Session = Domain.OpenSession() + Using scope As TransactionScope = session.OpenTransaction() + Dim author = New Author With {.Name = "Vasya"} + Dim book = New Book With {.Name = "The Book", .Author = author} + Assert.AreEqual(1, author.Books.Count) + Dim result = From c In Query.All(Of Author)() + Select c + Dim list = result.ToList() + Dim loaded = result.Single() + Assert.AreEqual("Vasya", loaded.Name) + End Using + End Using + End Sub + End Class +End Namespace diff --git a/Orm/Xtensive.Orm.Tests.VB/Model/PersistentPropertyWeavingTest.vb b/Orm/Xtensive.Orm.Tests.VB/Model/PersistentPropertyWeavingTest.vb index bd71a1dbac..62fe84ea68 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Model/PersistentPropertyWeavingTest.vb +++ b/Orm/Xtensive.Orm.Tests.VB/Model/PersistentPropertyWeavingTest.vb @@ -1,292 +1,292 @@ -' Copyright (C) 2013 Xtensive LLC. -' All rights reserved. -' For conditions of distribution and use, see license. -' Created by: Alena Mikshina -' Created: 2013.11.05 -Imports System -Imports System.Linq -Imports NUnit.Framework -Imports Xtensive.Orm.Tests.VB.Model.PersistentPropertyWeavingTestModel -Imports Xtensive.Orm.Configuration - -Namespace Model - Namespace PersistentPropertyWeavingTestModel - _ - Public Class Base - Inherits Entity - _ - Public Property Id() As Long - Public Sub New() - MyBase.New() - End Sub - End Class - - ' Override virtual property - - Public Class OverrideFieldBase - Inherits Base - _ - Public Overridable Property Value() As String - End Class - - Public Class OverrideField - Inherits OverrideFieldBase - Public Overrides Property Value() As String - End Class - - Public Class GenericOverrideFieldBase(Of T) - Inherits Base - _ - Public Overridable Property Value() As T - End Class - - Public Class GenericOverrideField - Inherits GenericOverrideFieldBase(Of String) - Public Overrides Property Value() As String - End Class - - Public Class GenericOverrideField(Of T) - Inherits GenericOverrideFieldBase(Of T) - Public Overrides Property Value() As T - End Class - - ' Implement persistent interface property - - Public Interface IImplementField - Inherits IEntity - _ - Property Value() As String - End Interface - - Public Class ImplementField - Inherits Base - Implements IImplementField - Public Property Value() As String Implements IImplementField.Value - End Class - - Public Interface IGenericImplementField(Of T) - Inherits IEntity - _ - Property Value() As T - End Interface - - Public Class GenericImplementField - Inherits Base - Implements IGenericImplementField(Of String) - Public Property Value() As String Implements IGenericImplementField(Of String).Value - End Class - - Public Class GenericImplementField(Of T) - Inherits Base - Implements IGenericImplementField(Of T) - Public Property Value() As T Implements IGenericImplementField(Of T).Value - End Class - - ' Implement non-persistent interface property - - Public Interface INonPersistentImplementField - _ - Property Value() As String - End Interface - - Public Class NonPersistentImplementField - Inherits Base - Implements INonPersistentImplementField - Public Property Value() As String Implements INonPersistentImplementField.Value - End Class - - Public Interface INonPersistentGenericImplementField(Of T) - _ - Property Value() As T - End Interface - - Public Class NonPersistentGenericImplementField - Inherits Base - Implements INonPersistentGenericImplementField(Of String) - Public Property Value() As String Implements INonPersistentGenericImplementField(Of String).Value - End Class - - Public Class NonPersistentGenericImplementField(Of T) - Inherits Base - Implements INonPersistentGenericImplementField(Of T) - Public Property Value() As T Implements INonPersistentGenericImplementField(Of T).Value - End Class - - ' New property - - Public Class NewFieldBase - Inherits Base - _ - Public Property PersistentValue() As String - - _ - Public Overridable Property PersistentVirtualValue() As String - - Public Property NonPersistentValue() As String - - Public Shared Property NonPersistentStaticValue() As String - End Class - - Public Class PersistentNewField - Inherits NewFieldBase - _ - Public Shadows Property PersistentValue() As String - - _ - Public Shadows Property PersistentVirtualValue() As String - - _ - Public Shadows Property NonPersistentValue() As String - - _ - Public Shadows Property NonPersistentStaticValue() As String - - End Class - - Public Class NonPersistentNewField - Inherits NewFieldBase - Public Shadows Property PersistentValue() As String - - Public Shadows Property PersistentVirtualValue() As String - - Public Shadows Property NonPersistentValue() As String - - Public Shadows Property NonPersistentStaticValue() As String - - End Class - End Namespace - - _ - Public Class PersistentPropertyWeavingTest - Inherits AutoBuildTest - Private Const Hello As String = "Hello" - Private Const Hello1 As String = "Hello1" - Private Const Hello2 As String = "Hello2" - Private Const Hello3 As String = "Hello3" - Private Const Hello4 As String = "Hello4" - Private Const Hello5 As String = "Hello5" - Private Const Hello6 As String = "Hello6" - - Protected Overrides Function BuildConfiguration() As DomainConfiguration - Dim configuration = MyBase.BuildConfiguration() - configuration.Types.Register(GetType(Base).Assembly, GetType(Base).Namespace) - configuration.Types.Register(GetType(GenericOverrideField(Of String))) - configuration.Types.Register(GetType(GenericImplementField(Of String))) - configuration.Types.Register(GetType(NonPersistentGenericImplementField(Of String))) - Return configuration - End Function - - _ - Public Sub OverrideFieldTest() - ExecuteTest(Of OverrideField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo((Hello)))) - End Sub - - _ - Public Sub GenericOverrideFieldTest() - ExecuteTest(Of GenericOverrideField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub GenericOverrideFieldTest2() - ExecuteTest(Of GenericOverrideField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub ImplementFieldTest() - ExecuteTest(Of ImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub GenericImplementFieldTest() - ExecuteTest(Of GenericImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub GenericImplementFieldTest2() - ExecuteTest(Of GenericImplementField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub NonPersistentImplementFieldTest() - ExecuteTest(Of NonPersistentImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub NonPersistentGenericImplementFieldTest() - ExecuteTest(Of NonPersistentGenericImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub NonPersistentGenericImplementFieldTest2() - ExecuteTest(Of NonPersistentGenericImplementField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) - End Sub - - _ - Public Sub PersistentNewFieldTest() - ExecuteTest(Of PersistentNewField)( - Sub(entity) - Dim baseEntity = DirectCast(entity, NewFieldBase) - baseEntity.PersistentValue = Hello1 - baseEntity.PersistentVirtualValue = Hello2 - entity.PersistentValue = Hello3 - entity.PersistentVirtualValue = Hello4 - entity.NonPersistentValue = Hello5 - entity.NonPersistentStaticValue = Hello6 - - End Sub, - Sub(entity) - Dim baseEntity = DirectCast(entity, NewFieldBase) - Assert.That(baseEntity.PersistentValue, [Is].EqualTo(Hello1)) - Assert.That(baseEntity.PersistentVirtualValue, [Is].EqualTo(Hello2)) - Assert.That(entity.PersistentValue, [Is].EqualTo(Hello3)) - Assert.That(entity.PersistentVirtualValue, [Is].EqualTo(Hello4)) - Assert.That(entity.NonPersistentValue, [Is].EqualTo(Hello5)) - Assert.That(entity.NonPersistentStaticValue, [Is].EqualTo(Hello6)) - - End Sub) - End Sub - - _ - Public Sub NonPersistentNewFieldTest() - ExecuteTest(Of NonPersistentNewField)( - Sub(entity) - Dim baseEntity = DirectCast(entity, NewFieldBase) - baseEntity.PersistentValue = Hello1 - baseEntity.PersistentVirtualValue = Hello2 - entity.PersistentValue = Hello3 - entity.PersistentVirtualValue = Hello4 - entity.NonPersistentValue = Hello5 - entity.NonPersistentStaticValue = Hello6 - - End Sub, - Sub(entity) - Dim baseEntity = DirectCast(entity, NewFieldBase) - Assert.That(baseEntity.PersistentValue, [Is].EqualTo(Hello1)) - Assert.That(baseEntity.PersistentVirtualValue, [Is].EqualTo(Hello2)) - Assert.That(entity.PersistentValue, [Is].EqualTo(Nothing)) - Assert.That(entity.PersistentVirtualValue, [Is].EqualTo(Nothing)) - Assert.That(entity.NonPersistentValue, [Is].EqualTo(Nothing)) - Assert.That(entity.NonPersistentStaticValue, [Is].EqualTo(Nothing)) - - End Sub) - End Sub - - Private Sub ExecuteTest(Of T As {Entity, New})(ByVal initializer As Action(Of T), ByVal checker As Action(Of T)) - Using session = Domain.OpenSession() - Using tx = session.OpenTransaction() - Dim entity = New T() - initializer.Invoke(entity) - tx.Complete() - End Using - End Using - - Using session = Domain.OpenSession() - Using tx = session.OpenTransaction() - Dim entity = session.Query.All(Of T)().Single() - checker.Invoke(entity) - tx.Complete() - End Using - End Using - End Sub - End Class -End Namespace +' Copyright (C) 2013 Xtensive LLC. +' All rights reserved. +' For conditions of distribution and use, see license. +' Created by: Alena Mikshina +' Created: 2013.11.05 +Imports System +Imports System.Linq +Imports NUnit.Framework +Imports Xtensive.Orm.Tests.VB.Model.PersistentPropertyWeavingTestModel +Imports Xtensive.Orm.Configuration + +Namespace Model + Namespace PersistentPropertyWeavingTestModel + _ + Public Class Base + Inherits Entity + _ + Public Property Id() As Long + Public Sub New() + MyBase.New() + End Sub + End Class + + ' Override virtual property + + Public Class OverrideFieldBase + Inherits Base + _ + Public Overridable Property Value() As String + End Class + + Public Class OverrideField + Inherits OverrideFieldBase + Public Overrides Property Value() As String + End Class + + Public Class GenericOverrideFieldBase(Of T) + Inherits Base + _ + Public Overridable Property Value() As T + End Class + + Public Class GenericOverrideField + Inherits GenericOverrideFieldBase(Of String) + Public Overrides Property Value() As String + End Class + + Public Class GenericOverrideField(Of T) + Inherits GenericOverrideFieldBase(Of T) + Public Overrides Property Value() As T + End Class + + ' Implement persistent interface property + + Public Interface IImplementField + Inherits IEntity + _ + Property Value() As String + End Interface + + Public Class ImplementField + Inherits Base + Implements IImplementField + Public Property Value() As String Implements IImplementField.Value + End Class + + Public Interface IGenericImplementField(Of T) + Inherits IEntity + _ + Property Value() As T + End Interface + + Public Class GenericImplementField + Inherits Base + Implements IGenericImplementField(Of String) + Public Property Value() As String Implements IGenericImplementField(Of String).Value + End Class + + Public Class GenericImplementField(Of T) + Inherits Base + Implements IGenericImplementField(Of T) + Public Property Value() As T Implements IGenericImplementField(Of T).Value + End Class + + ' Implement non-persistent interface property + + Public Interface INonPersistentImplementField + _ + Property Value() As String + End Interface + + Public Class NonPersistentImplementField + Inherits Base + Implements INonPersistentImplementField + Public Property Value() As String Implements INonPersistentImplementField.Value + End Class + + Public Interface INonPersistentGenericImplementField(Of T) + _ + Property Value() As T + End Interface + + Public Class NonPersistentGenericImplementField + Inherits Base + Implements INonPersistentGenericImplementField(Of String) + Public Property Value() As String Implements INonPersistentGenericImplementField(Of String).Value + End Class + + Public Class NonPersistentGenericImplementField(Of T) + Inherits Base + Implements INonPersistentGenericImplementField(Of T) + Public Property Value() As T Implements INonPersistentGenericImplementField(Of T).Value + End Class + + ' New property + + Public Class NewFieldBase + Inherits Base + _ + Public Property PersistentValue() As String + + _ + Public Overridable Property PersistentVirtualValue() As String + + Public Property NonPersistentValue() As String + + Public Shared Property NonPersistentStaticValue() As String + End Class + + Public Class PersistentNewField + Inherits NewFieldBase + _ + Public Shadows Property PersistentValue() As String + + _ + Public Shadows Property PersistentVirtualValue() As String + + _ + Public Shadows Property NonPersistentValue() As String + + _ + Public Shadows Property NonPersistentStaticValue() As String + + End Class + + Public Class NonPersistentNewField + Inherits NewFieldBase + Public Shadows Property PersistentValue() As String + + Public Shadows Property PersistentVirtualValue() As String + + Public Shadows Property NonPersistentValue() As String + + Public Shadows Property NonPersistentStaticValue() As String + + End Class + End Namespace + + _ + Public Class PersistentPropertyWeavingTest + Inherits AutoBuildTest + Private Const Hello As String = "Hello" + Private Const Hello1 As String = "Hello1" + Private Const Hello2 As String = "Hello2" + Private Const Hello3 As String = "Hello3" + Private Const Hello4 As String = "Hello4" + Private Const Hello5 As String = "Hello5" + Private Const Hello6 As String = "Hello6" + + Protected Overrides Function BuildConfiguration() As DomainConfiguration + Dim configuration = MyBase.BuildConfiguration() + configuration.Types.Register(GetType(Base).Assembly, GetType(Base).Namespace) + configuration.Types.Register(GetType(GenericOverrideField(Of String))) + configuration.Types.Register(GetType(GenericImplementField(Of String))) + configuration.Types.Register(GetType(NonPersistentGenericImplementField(Of String))) + Return configuration + End Function + + _ + Public Sub OverrideFieldTest() + ExecuteTest(Of OverrideField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo((Hello)))) + End Sub + + _ + Public Sub GenericOverrideFieldTest() + ExecuteTest(Of GenericOverrideField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub GenericOverrideFieldTest2() + ExecuteTest(Of GenericOverrideField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub ImplementFieldTest() + ExecuteTest(Of ImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub GenericImplementFieldTest() + ExecuteTest(Of GenericImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub GenericImplementFieldTest2() + ExecuteTest(Of GenericImplementField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub NonPersistentImplementFieldTest() + ExecuteTest(Of NonPersistentImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub NonPersistentGenericImplementFieldTest() + ExecuteTest(Of NonPersistentGenericImplementField)(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub NonPersistentGenericImplementFieldTest2() + ExecuteTest(Of NonPersistentGenericImplementField(Of String))(Sub(e) e.Value = Hello, Sub(e) Assert.That(e.Value, [Is].EqualTo(Hello))) + End Sub + + _ + Public Sub PersistentNewFieldTest() + ExecuteTest(Of PersistentNewField)( + Sub(entity) + Dim baseEntity = DirectCast(entity, NewFieldBase) + baseEntity.PersistentValue = Hello1 + baseEntity.PersistentVirtualValue = Hello2 + entity.PersistentValue = Hello3 + entity.PersistentVirtualValue = Hello4 + entity.NonPersistentValue = Hello5 + entity.NonPersistentStaticValue = Hello6 + + End Sub, + Sub(entity) + Dim baseEntity = DirectCast(entity, NewFieldBase) + Assert.That(baseEntity.PersistentValue, [Is].EqualTo(Hello1)) + Assert.That(baseEntity.PersistentVirtualValue, [Is].EqualTo(Hello2)) + Assert.That(entity.PersistentValue, [Is].EqualTo(Hello3)) + Assert.That(entity.PersistentVirtualValue, [Is].EqualTo(Hello4)) + Assert.That(entity.NonPersistentValue, [Is].EqualTo(Hello5)) + Assert.That(entity.NonPersistentStaticValue, [Is].EqualTo(Hello6)) + + End Sub) + End Sub + + _ + Public Sub NonPersistentNewFieldTest() + ExecuteTest(Of NonPersistentNewField)( + Sub(entity) + Dim baseEntity = DirectCast(entity, NewFieldBase) + baseEntity.PersistentValue = Hello1 + baseEntity.PersistentVirtualValue = Hello2 + entity.PersistentValue = Hello3 + entity.PersistentVirtualValue = Hello4 + entity.NonPersistentValue = Hello5 + entity.NonPersistentStaticValue = Hello6 + + End Sub, + Sub(entity) + Dim baseEntity = DirectCast(entity, NewFieldBase) + Assert.That(baseEntity.PersistentValue, [Is].EqualTo(Hello1)) + Assert.That(baseEntity.PersistentVirtualValue, [Is].EqualTo(Hello2)) + Assert.That(entity.PersistentValue, [Is].EqualTo(Nothing)) + Assert.That(entity.PersistentVirtualValue, [Is].EqualTo(Nothing)) + Assert.That(entity.NonPersistentValue, [Is].EqualTo(Nothing)) + Assert.That(entity.NonPersistentStaticValue, [Is].EqualTo(Nothing)) + + End Sub) + End Sub + + Private Sub ExecuteTest(Of T As {Entity, New})(ByVal initializer As Action(Of T), ByVal checker As Action(Of T)) + Using session = Domain.OpenSession() + Using tx = session.OpenTransaction() + Dim entity = New T() + initializer.Invoke(entity) + tx.Complete() + End Using + End Using + + Using session = Domain.OpenSession() + Using tx = session.OpenTransaction() + Dim entity = session.Query.All(Of T)().Single() + checker.Invoke(entity) + tx.Complete() + End Using + End Using + End Sub + End Class +End Namespace diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Application.Designer.vb b/Orm/Xtensive.Orm.Tests.VB/My Project/Application.Designer.vb index 9478349ed0..82fe712640 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Application.Designer.vb +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Application.Designer.vb @@ -1,13 +1,13 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:4.0.30319.1 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Application.myapp b/Orm/Xtensive.Orm.Tests.VB/My Project/Application.myapp index 0167050e1e..758895def2 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Application.myapp +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Application.myapp @@ -1,10 +1,10 @@ - - - false - false - 0 - true - 0 - 1 - true - + + + false + false + 0 + true + 0 + 1 + true + diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/AssemblyInfo.vb b/Orm/Xtensive.Orm.Tests.VB/My Project/AssemblyInfo.vb index d4fecf13d9..cc223d0ded 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/AssemblyInfo.vb +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/AssemblyInfo.vb @@ -1,35 +1,35 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' General Information about an assembly is controlled through the following -' set of attributes. Change these attribute values to modify the information -' associated with an assembly. - -' Review the values of the assembly attributes - - - - - - - - - - -'The following GUID is for the ID of the typelib if this project is exposed to COM - - -' Version information for an assembly consists of the following four values: -' -' Major Version -' Minor Version -' Build Number -' Revision -' -' You can specify all the values or you can default the Build and Revision Numbers -' by using the '*' as shown below: -' - - - +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.Designer.vb b/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.Designer.vb index c9106ce443..b3d6d7d142 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.Designer.vb +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.Designer.vb @@ -1,63 +1,63 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:4.0.30319.1 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ''' - ''' A strongly-typed resource class, for looking up localized strings, etc. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Returns the cached ResourceManager instance used by this class. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Xtensive.Storage.Tests.VB.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Overrides the current thread's CurrentUICulture property for all - ''' resource lookups using this strongly typed resource class. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - End Module -End Namespace +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Xtensive.Storage.Tests.VB.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.resx b/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.resx index ffecec851a..af7dbebbac 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.resx +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Resources.resx @@ -1,117 +1,117 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.Designer.vb b/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.Designer.vb index ed36c4e70d..a3bd52b0cd 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.Designer.vb +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.Designer.vb @@ -1,73 +1,73 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:4.0.30319.1 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - _ - Partial Friend NotInheritable Class MySettings - Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) - -#Region "My.Settings Auto-Save Functionality" -#If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean - - Private Shared addedHandlerLockObject As New Object - - _ - Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub -#End If -#End Region - - Public Shared ReadOnly Property [Default]() As MySettings - Get - -#If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If -#End If - Return defaultInstance - End Get - End Property - End Class -End Namespace - -Namespace My - - _ - Friend Module MySettingsProperty - - _ - Friend ReadOnly Property Settings() As Global.Xtensive.Orm.Tests.VB.My.MySettings - Get - Return Global.Xtensive.Orm.Tests.VB.My.MySettings.Default - End Get - End Property - End Module -End Namespace +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.1 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.Xtensive.Orm.Tests.VB.My.MySettings + Get + Return Global.Xtensive.Orm.Tests.VB.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.settings b/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.settings index 377f56d6b1..85b890b3c6 100644 --- a/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.settings +++ b/Orm/Xtensive.Orm.Tests.VB/My Project/Settings.settings @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests.VB/Xtensive.Orm.Tests.VB.vbproj b/Orm/Xtensive.Orm.Tests.VB/Xtensive.Orm.Tests.VB.vbproj index 67a072e546..0f9d52a746 100644 --- a/Orm/Xtensive.Orm.Tests.VB/Xtensive.Orm.Tests.VB.vbproj +++ b/Orm/Xtensive.Orm.Tests.VB/Xtensive.Orm.Tests.VB.vbproj @@ -1,141 +1,141 @@ - - - - Net40-Debug - AnyCPU - - - - - {53DE0196-E6FC-4E51-8F50-C6241D50E37E} - Library - Xtensive.Orm.Tests.VB - Xtensive.Orm.Tests.VB - 512 - Windows - - - true - full - true - true - ..\..\_Build\Binaries\Debug\Lib\Net40\ - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - v4.0 - - - portable - false - true - true - ..\..\_Build\Binaries\Release\Lib\Net40\ - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - v4.0 - - - On - - - Binary - - - Off - - - On - - - - False - ..\..\Lib\NUnit\nunit.framework.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - Application.myapp - - - True - True - Resources.resx - - - True - Settings.settings - True - - - - - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - My.Resources - Designer - - - - - Designer - - - MyApplicationCodeGenerator - Application.Designer.vb - - - SettingsSingleFileGenerator - My - Settings.Designer.vb - - - - - {628737E8-3581-4793-99C8-9A4D2D83FEA0} - Xtensive.Orm - - - {F2CE47F7-8170-4FC4-B619-D32E6398D4F9} - Xtensive.Orm.Tests.Framework - - - {FF9927DD-5D2E-4C57-B81F-2CD10CEE50DC} - Xtensive.Orm.Tests - - - - - - + + + + Net40-Debug + AnyCPU + + + + + {53DE0196-E6FC-4E51-8F50-C6241D50E37E} + Library + Xtensive.Orm.Tests.VB + Xtensive.Orm.Tests.VB + 512 + Windows + + + true + full + true + true + ..\..\_Build\Binaries\Debug\Lib\Net40\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + v4.0 + + + portable + false + true + true + ..\..\_Build\Binaries\Release\Lib\Net40\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + v4.0 + + + On + + + Binary + + + Off + + + On + + + + False + ..\..\Lib\NUnit\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + Designer + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + {628737E8-3581-4793-99C8-9A4D2D83FEA0} + Xtensive.Orm + + + {F2CE47F7-8170-4FC4-B619-D32E6398D4F9} + Xtensive.Orm.Tests.Framework + + + {FF9927DD-5D2E-4C57-B81F-2CD10CEE50DC} + Xtensive.Orm.Tests + + + + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/App.config b/Orm/Xtensive.Orm.Tests/App.config index 60cc0adc32..650a3fa7fd 100644 --- a/Orm/Xtensive.Orm.Tests/App.config +++ b/Orm/Xtensive.Orm.Tests/App.config @@ -1,285 +1,285 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Orm/Xtensive.Orm.Tests/Chinook.xml b/Orm/Xtensive.Orm.Tests/Chinook.xml index 87d6f5d260..7fddf2b37c 100644 --- a/Orm/Xtensive.Orm.Tests/Chinook.xml +++ b/Orm/Xtensive.Orm.Tests/Chinook.xml @@ -1,103370 +1,103370 @@ - - - - - System.Int32 - System.String - System.Int32 - - - - 1 - For Those About To Rock We Salute You - 1 - - - 2 - Balls to the Wall - 2 - - - 3 - Restless and Wild - 2 - - - 4 - Let There Be Rock - 1 - - - 5 - Big Ones - 3 - - - 6 - Jagged Little Pill - 4 - - - 7 - Facelift - 5 - - - 8 - Warner 25 Anos - 6 - - - 9 - Plays Metallica By Four Cellos - 7 - - - 10 - Audioslave - 8 - - - 11 - Out Of Exile - 8 - - - 12 - BackBeat Soundtrack - 9 - - - 13 - The Best Of Billy Cobham - 10 - - - 14 - Alcohol Fueled Brewtality Live! (Disc 1) - 11 - - - 15 - Alcohol Fueled Brewtality Live! (Disc 2) - 11 - - - 16 - Black Sabbath - 12 - - - 17 - Black Sabbath Vol. 4 (Remaster) - 12 - - - 18 - Body Count - 13 - - - 19 - Chemical Wedding - 14 - - - 20 - The Best Of Buddy Guy - The Millenium Collection - 15 - - - 21 - Prenda Minha - 16 - - - 22 - Sozinho Remix Ao Vivo - 16 - - - 23 - Minha Historia - 17 - - - 24 - Afrociberdelia - 18 - - - 25 - Da Lama Ao Caos - 18 - - - 26 - Acústico MTV (Live) - 19 - - - 27 - Cidade Negra - Hits - 19 - - - 28 - Na Pista - 20 - - - 29 - Axé Bahia 2001 - 21 - - - 30 - BBC Sessions (Disc 1) (Live) - 22 - - - 31 - Bongo Fury - 23 - - - 32 - Carnaval 2001 - 21 - - - 33 - Chill: Brazil (Disc 1) - 24 - - - 34 - Chill: Brazil (Disc 2) - 6 - - - 35 - Garage Inc. (Disc 1) - 50 - - - 36 - Greatest Hits II - 51 - - - 37 - Greatest Kiss - 52 - - - 38 - Heart of the Night - 53 - - - 39 - International Superhits - 54 - - - 40 - Into The Light - 55 - - - 41 - Meus Momentos - 56 - - - 42 - Minha História - 57 - - - 43 - MK III The Final Concerts (Disc 1) - 58 - - - 44 - Physical Graffiti (Disc 1) - 22 - - - 45 - Sambas De Enredo 2001 - 21 - - - 46 - Supernatural - 59 - - - 47 - The Best of Ed Motta - 37 - - - 48 - The Essential Miles Davis (Disc 1) - 68 - - - 49 - The Essential Miles Davis (Disc 2) - 68 - - - 50 - The Final Concerts (Disc 2) - 58 - - - 51 - Up An' Atom - 69 - - - 52 - Vinícius De Moraes - Sem Limite - 70 - - - 53 - Vozes do MPB - 21 - - - 54 - Chronicle, Vol. 1 - 76 - - - 55 - Chronicle, Vol. 2 - 76 - - - 56 - Cássia Eller - Coleção Sem Limite (Disc 2) - 77 - - - 57 - Cássia Eller - Sem Limite (Disc 1) - 77 - - - 58 - Come Taste The Band - 58 - - - 59 - Deep Purple In Rock - 58 - - - 60 - Fireball - 58 - - - 61 - Knocking at Your Back Door: The Best Of Deep Purple in the 80's - 58 - - - 62 - Machine Head - 58 - - - 63 - Purpendicular - 58 - - - 64 - Slaves And Masters - 58 - - - 65 - Stormbringer - 58 - - - 66 - The Battle Rages On - 58 - - - 67 - Vault: Def Leppard's Greatest Hits - 78 - - - 68 - Outbreak - 79 - - - 69 - Djavan Ao Vivo - Vol. 02 - 80 - - - 70 - Djavan Ao Vivo - Vol. 1 - 80 - - - 71 - Elis Regina-Minha História - 41 - - - 72 - The Cream Of Clapton - 81 - - - 73 - Unplugged - 81 - - - 74 - Album Of The Year - 82 - - - 75 - Angel Dust - 82 - - - 76 - King For A Day Fool For A Lifetime - 82 - - - 77 - The Real Thing - 82 - - - 78 - Deixa Entrar - 83 - - - 79 - In Your Honor (Disc 1) - 84 - - - 80 - In Your Honor (Disc 2) - 84 - - - 81 - One By One - 84 - - - 82 - The Colour And The Shape - 84 - - - 83 - My Way: The Best Of Frank Sinatra (Disc 1) - 85 - - - 84 - Roda De Funk - 86 - - - 85 - As Canções de Eu Tu Eles - 27 - - - 86 - Quanta Gente Veio Ver (Live) - 27 - - - 87 - Quanta Gente Veio ver--Bônus De Carnaval - 27 - - - 88 - Faceless - 87 - - - 89 - American Idiot - 54 - - - 90 - Appetite for Destruction - 88 - - - 91 - Use Your Illusion I - 88 - - - 92 - Use Your Illusion II - 88 - - - 93 - Blue Moods - 89 - - - 94 - A Matter of Life and Death - 90 - - - 95 - A Real Dead One - 90 - - - 96 - A Real Live One - 90 - - - 97 - Brave New World - 90 - - - 98 - Dance Of Death - 90 - - - 99 - Fear Of The Dark - 90 - - - 100 - Iron Maiden - 90 - - - 101 - Killers - 90 - - - 102 - Live After Death - 90 - - - 103 - Live At Donington 1992 (Disc 1) - 90 - - - 104 - Live At Donington 1992 (Disc 2) - 90 - - - 105 - No Prayer For The Dying - 90 - - - 106 - Piece Of Mind - 90 - - - 107 - Powerslave - 90 - - - 108 - Rock In Rio (CD1) - 90 - - - 109 - Rock In Rio (CD2) - 90 - - - 110 - Seventh Son of a Seventh Son - 90 - - - 111 - Somewhere in Time - 90 - - - 112 - The Number of The Beast - 90 - - - 113 - The X Factor - 90 - - - 114 - Virtual XI - 90 - - - 115 - Sex Machine - 91 - - - 116 - Emergency On Planet Earth - 92 - - - 117 - Synkronized - 92 - - - 118 - The Return Of The Space Cowboy - 92 - - - 119 - Get Born - 93 - - - 120 - Are You Experienced? - 94 - - - 121 - Surfing with the Alien (Remastered) - 95 - - - 122 - Jorge Ben Jor 25 Anos - 46 - - - 123 - Jota Quest-1995 - 96 - - - 124 - Cafezinho - 97 - - - 125 - Living After Midnight - 98 - - - 126 - Unplugged (Live) - 52 - - - 127 - BBC Sessions (Disc 2) (Live) - 22 - - - 128 - Coda - 22 - - - 129 - Houses Of The Holy - 22 - - - 130 - In Through The Out Door - 22 - - - 131 - IV - 22 - - - 132 - Led Zeppelin I - 22 - - - 133 - Led Zeppelin II - 22 - - - 134 - Led Zeppelin III - 22 - - - 135 - Physical Graffiti (Disc 2) - 22 - - - 136 - Presence - 22 - - - 137 - The Song Remains The Same (Disc 1) - 22 - - - 138 - The Song Remains The Same (Disc 2) - 22 - - - 139 - A TempestadeTempestade Ou O Livro Dos Dias - 99 - - - 140 - Mais Do Mesmo - 99 - - - 141 - Greatest Hits - 100 - - - 142 - Lulu Santos - RCA 100 Anos De Música - Álbum 01 - 101 - - - 143 - Lulu Santos - RCA 100 Anos De Música - Álbum 02 - 101 - - - 144 - Misplaced Childhood - 102 - - - 145 - Barulhinho Bom - 103 - - - 146 - Seek And Shall Find: More Of The Best (1963-1981) - 104 - - - 147 - The Best Of Men At Work - 105 - - - 148 - Black Album - 50 - - - 149 - Garage Inc. (Disc 2) - 50 - - - 150 - Kill 'Em All - 50 - - - 151 - Load - 50 - - - 152 - Master Of Puppets - 50 - - - 153 - ReLoad - 50 - - - 154 - Ride The Lightning - 50 - - - 155 - St. Anger - 50 - - - 156 - ...And Justice For All - 50 - - - 157 - Miles Ahead - 68 - - - 158 - Milton Nascimento Ao Vivo - 42 - - - 159 - Minas - 42 - - - 160 - Ace Of Spades - 106 - - - 161 - Demorou... - 108 - - - 162 - Motley Crue Greatest Hits - 109 - - - 163 - From The Muddy Banks Of The Wishkah (Live) - 110 - - - 164 - Nevermind - 110 - - - 165 - Compositores - 111 - - - 166 - Olodum - 112 - - - 167 - Acústico MTV - 113 - - - 168 - Arquivo II - 113 - - - 169 - Arquivo Os Paralamas Do Sucesso - 113 - - - 170 - Bark at the Moon (Remastered) - 114 - - - 171 - Blizzard of Ozz - 114 - - - 172 - Diary of a Madman (Remastered) - 114 - - - 173 - No More Tears (Remastered) - 114 - - - 174 - Tribute - 114 - - - 175 - Walking Into Clarksdale - 115 - - - 176 - Original Soundtracks 1 - 116 - - - 177 - The Beast Live - 117 - - - 178 - Live On Two Legs (Live) - 118 - - - 179 - Pearl Jam - 118 - - - 180 - Riot Act - 118 - - - 181 - Ten - 118 - - - 182 - Vs. - 118 - - - 183 - Dark Side Of The Moon - 120 - - - 184 - Os Cães Ladram Mas A Caravana Não Pára - 121 - - - 185 - Greatest Hits I - 51 - - - 186 - News Of The World - 51 - - - 187 - Out Of Time - 122 - - - 188 - Green - 124 - - - 189 - New Adventures In Hi-Fi - 124 - - - 190 - The Best Of R.E.M.: The IRS Years - 124 - - - 191 - Cesta Básica - 125 - - - 192 - Raul Seixas - 126 - - - 193 - Blood Sugar Sex Magik - 127 - - - 194 - By The Way - 127 - - - 195 - Californication - 127 - - - 196 - Retrospective I (1974-1980) - 128 - - - 197 - Santana - As Years Go By - 59 - - - 198 - Santana Live - 59 - - - 199 - Maquinarama - 130 - - - 200 - O Samba Poconé - 130 - - - 201 - Judas 0: B-Sides and Rarities - 131 - - - 202 - Rotten Apples: Greatest Hits - 131 - - - 203 - A-Sides - 132 - - - 204 - Morning Dance - 53 - - - 205 - In Step - 133 - - - 206 - Core - 134 - - - 207 - Mezmerize - 135 - - - 208 - (1997) Black Light Syndrome - 136 - - - 209 - Live (Disc 1) - 137 - - - 210 - Live (Disc 2) - 137 - - - 211 - The Singles - 138 - - - 212 - Beyond Good And Evil - 139 - - - 213 - Pure Cult: The Best Of The Cult (For Rockers, Ravers, Lovers & Sinners) (UK) - 139 - - - 214 - The Doors - 140 - - - 215 - The Police Greatest Hits - 141 - - - 216 - Hot Rocks, 1964-1971 (Disc 1) - 142 - - - 217 - No Security - 142 - - - 218 - Voodoo Lounge - 142 - - - 219 - Tangents - 143 - - - 220 - Transmission - 143 - - - 221 - My Generation - The Very Best Of The Who - 144 - - - 222 - Serie Sem Limite (Disc 1) - 145 - - - 223 - Serie Sem Limite (Disc 2) - 145 - - - 224 - Acústico - 146 - - - 225 - Volume Dois - 146 - - - 226 - Battlestar Galactica: The Story So Far - 147 - - - 227 - Battlestar Galactica, Season 3 - 147 - - - 228 - Heroes, Season 1 - 148 - - - 229 - Lost, Season 3 - 149 - - - 230 - Lost, Season 1 - 149 - - - 231 - Lost, Season 2 - 149 - - - 232 - Achtung Baby - 150 - - - 233 - All That You Can't Leave Behind - 150 - - - 234 - B-Sides 1980-1990 - 150 - - - 235 - How To Dismantle An Atomic Bomb - 150 - - - 236 - Pop - 150 - - - 237 - Rattle And Hum - 150 - - - 238 - The Best Of 1980-1990 - 150 - - - 239 - War - 150 - - - 240 - Zooropa - 150 - - - 241 - UB40 The Best Of - Volume Two (UK) - 151 - - - 242 - Diver Down - 152 - - - 243 - The Best Of Van Halen, Vol. I - 152 - - - 244 - Van Halen - 152 - - - 245 - Van Halen III - 152 - - - 246 - Contraband - 153 - - - 247 - Vinicius De Moraes - 72 - - - 248 - Ao Vivo (IMPORT) - 155 - - - 249 - The Office, Season 1 - 156 - - - 250 - The Office, Season 2 - 156 - - - 251 - The Office, Season 3 - 156 - - - 252 - Un-Led-Ed - 157 - - - 253 - Battlestar Galactica (Classic), Season 1 - 158 - - - 254 - Aquaman - 159 - - - 255 - Instant Karma: The Amnesty International Campaign to Save Darfur - 150 - - - 256 - Speak of the Devil - 114 - - - 257 - 20th Century Masters - The Millennium Collection: The Best of Scorpions - 179 - - - 258 - House of Pain - 180 - - - 259 - Radio Brasil (O Som da Jovem Vanguarda) - Seleccao de Henrique Amaro - 36 - - - 260 - Cake: B-Sides and Rarities - 196 - - - 261 - LOST, Season 4 - 149 - - - 262 - Quiet Songs - 197 - - - 263 - Muso Ko - 198 - - - 264 - Realize - 199 - - - 265 - Every Kind of Light - 200 - - - 266 - Duos II - 201 - - - 267 - Worlds - 202 - - - 268 - The Best of Beethoven - 203 - - - 269 - Temple of the Dog - 204 - - - 270 - Carry On - 205 - - - 271 - Revelations - 8 - - - 272 - Adorate Deum: Gregorian Chant from the Proper of the Mass - 206 - - - 273 - Allegri: Miserere - 207 - - - 274 - Pachelbel: Canon & Gigue - 208 - - - 275 - Vivaldi: The Four Seasons - 209 - - - 276 - Bach: Violin Concertos - 210 - - - 277 - Bach: Goldberg Variations - 211 - - - 278 - Bach: The Cello Suites - 212 - - - 279 - Handel: The Messiah (Highlights) - 213 - - - 280 - The World of Classical Favourites - 214 - - - 281 - Sir Neville Marriner: A Celebration - 215 - - - 282 - Mozart: Wind Concertos - 216 - - - 283 - Haydn: Symphonies 99 - 104 - 217 - - - 284 - Beethoven: Symhonies Nos. 5 & 6 - 218 - - - 285 - A Soprano Inspired - 219 - - - 286 - Great Opera Choruses - 220 - - - 287 - Wagner: Favourite Overtures - 221 - - - 288 - Fauré: Requiem, Ravel: Pavane & Others - 222 - - - 289 - Tchaikovsky: The Nutcracker - 223 - - - 290 - The Last Night of the Proms - 224 - - - 291 - Puccini: Madama Butterfly - Highlights - 225 - - - 292 - Holst: The Planets, Op. 32 & Vaughan Williams: Fantasies - 226 - - - 293 - Pavarotti's Opera Made Easy - 227 - - - 294 - Great Performances - Barber's Adagio and Other Romantic Favorites for Strings - 228 - - - 295 - Carmina Burana - 229 - - - 296 - A Copland Celebration, Vol. I - 230 - - - 297 - Bach: Toccata & Fugue in D Minor - 231 - - - 298 - Prokofiev: Symphony No.1 - 232 - - - 299 - Scheherazade - 233 - - - 300 - Bach: The Brandenburg Concertos - 234 - - - 301 - Chopin: Piano Concertos Nos. 1 & 2 - 235 - - - 302 - Mascagni: Cavalleria Rusticana - 236 - - - 303 - Sibelius: Finlandia - 237 - - - 304 - Beethoven Piano Sonatas: Moonlight & Pastorale - 238 - - - 305 - Great Recordings of the Century - Mahler: Das Lied von der Erde - 240 - - - 306 - Elgar: Cello Concerto & Vaughan Williams: Fantasias - 241 - - - 307 - Adams, John: The Chairman Dances - 242 - - - 308 - Tchaikovsky: 1812 Festival Overture, Op.49, Capriccio Italien & Beethoven: Wellington's Victory - 243 - - - 309 - Palestrina: Missa Papae Marcelli & Allegri: Miserere - 244 - - - 310 - Prokofiev: Romeo & Juliet - 245 - - - 311 - Strauss: Waltzes - 226 - - - 312 - Berlioz: Symphonie Fantastique - 245 - - - 313 - Bizet: Carmen Highlights - 246 - - - 314 - English Renaissance - 247 - - - 315 - Handel: Music for the Royal Fireworks (Original Version 1749) - 208 - - - 316 - Grieg: Peer Gynt Suites & Sibelius: Pelléas et Mélisande - 248 - - - 317 - Mozart Gala: Famous Arias - 249 - - - 318 - SCRIABIN: Vers la flamme - 250 - - - 319 - Armada: Music from the Courts of England and Spain - 251 - - - 320 - Mozart: Symphonies Nos. 40 & 41 - 248 - - - 321 - Back to Black - 252 - - - 322 - Frank - 252 - - - 323 - Carried to Dust (Bonus Track Version) - 253 - - - 324 - Beethoven: Symphony No. 6 'Pastoral' Etc. - 254 - - - 325 - Bartok: Violin & Viola Concertos - 255 - - - 326 - Mendelssohn: A Midsummer Night's Dream - 256 - - - 327 - Bach: Orchestral Suites Nos. 1 - 4 - 257 - - - 328 - Charpentier: Divertissements, Airs & Concerts - 258 - - - 329 - South American Getaway - 259 - - - 330 - Górecki: Symphony No. 3 - 260 - - - 331 - Purcell: The Fairy Queen - 261 - - - 332 - The Ultimate Relexation Album - 262 - - - 333 - Purcell: Music for the Queen Mary - 263 - - - 334 - Weill: The Seven Deadly Sins - 264 - - - 335 - J.S. Bach: Chaconne, Suite in E Minor, Partita in E Major & Prelude, Fugue and Allegro - 265 - - - 336 - Prokofiev: Symphony No.5 & Stravinksy: Le Sacre Du Printemps - 248 - - - 337 - Szymanowski: Piano Works, Vol. 1 - 266 - - - 338 - Nielsen: The Six Symphonies - 267 - - - 339 - Great Recordings of the Century: Paganini's 24 Caprices - 268 - - - 340 - Liszt - 12 Études D'Execution Transcendante - 269 - - - 341 - Great Recordings of the Century - Shubert: Schwanengesang, 4 Lieder - 270 - - - 342 - Locatelli: Concertos for Violin, Strings and Continuo, Vol. 3 - 271 - - - 343 - Respighi:Pines of Rome - 226 - - - 344 - Schubert: The Late String Quartets & String Quintet (3 CD's) - 272 - - - 345 - Monteverdi: L'Orfeo - 273 - - - 346 - Mozart: Chamber Music - 274 - - - 347 - Koyaanisqatsi (Soundtrack from the Motion Picture) - 275 - - - - - - System.Int32 - System.String - - - - 1 - AC/DC - - - 2 - Accept - - - 3 - Aerosmith - - - 4 - Alanis Morissette - - - 5 - Alice In Chains - - - 6 - Antônio Carlos Jobim - - - 7 - Apocalyptica - - - 8 - Audioslave - - - 9 - BackBeat - - - 10 - Billy Cobham - - - 11 - Black Label Society - - - 12 - Black Sabbath - - - 13 - Body Count - - - 14 - Bruce Dickinson - - - 15 - Buddy Guy - - - 16 - Caetano Veloso - - - 17 - Chico Buarque - - - 18 - Chico Science & Nação Zumbi - - - 19 - Cidade Negra - - - 20 - Cláudio Zoli - - - 21 - Various Artists - - - 22 - Led Zeppelin - - - 23 - Frank Zappa & Captain Beefheart - - - 24 - Marcos Valle - - - 25 - Milton Nascimento & Bebeto - - - 26 - Azymuth - - - 27 - Gilberto Gil - - - 28 - João Gilberto - - - 29 - Bebel Gilberto - - - 30 - Jorge Vercilo - - - 31 - Baby Consuelo - - - 32 - Ney Matogrosso - - - 33 - Luiz Melodia - - - 34 - Nando Reis - - - 35 - Pedro Luís & A Parede - - - 36 - O Rappa - - - 37 - Ed Motta - - - 38 - Banda Black Rio - - - 39 - Fernanda Porto - - - 40 - Os Cariocas - - - 41 - Elis Regina - - - 42 - Milton Nascimento - - - 43 - A Cor Do Som - - - 44 - Kid Abelha - - - 45 - Sandra De Sá - - - 46 - Jorge Ben - - - 47 - Hermeto Pascoal - - - 48 - Barão Vermelho - - - 49 - Edson, DJ Marky & DJ Patife Featuring Fernanda Porto - - - 50 - Metallica - - - 51 - Queen - - - 52 - Kiss - - - 53 - Spyro Gyra - - - 54 - Green Day - - - 55 - David Coverdale - - - 56 - Gonzaguinha - - - 57 - Os Mutantes - - - 58 - Deep Purple - - - 59 - Santana - - - 60 - Santana Feat. Dave Matthews - - - 61 - Santana Feat. Everlast - - - 62 - Santana Feat. Rob Thomas - - - 63 - Santana Feat. Lauryn Hill & Cee-Lo - - - 64 - Santana Feat. The Project G&B - - - 65 - Santana Feat. Maná - - - 66 - Santana Feat. Eagle-Eye Cherry - - - 67 - Santana Feat. Eric Clapton - - - 68 - Miles Davis - - - 69 - Gene Krupa - - - 70 - Toquinho & Vinícius - - - 71 - Vinícius De Moraes & Baden Powell - - - 72 - Vinícius De Moraes - - - 73 - Vinícius E Qurteto Em Cy - - - 74 - Vinícius E Odette Lara - - - 75 - Vinicius, Toquinho & Quarteto Em Cy - - - 76 - Creedence Clearwater Revival - - - 77 - Cássia Eller - - - 78 - Def Leppard - - - 79 - Dennis Chambers - - - 80 - Djavan - - - 81 - Eric Clapton - - - 82 - Faith No More - - - 83 - Falamansa - - - 84 - Foo Fighters - - - 85 - Frank Sinatra - - - 86 - Funk Como Le Gusta - - - 87 - Godsmack - - - 88 - Guns N' Roses - - - 89 - Incognito - - - 90 - Iron Maiden - - - 91 - James Brown - - - 92 - Jamiroquai - - - 93 - JET - - - 94 - Jimi Hendrix - - - 95 - Joe Satriani - - - 96 - Jota Quest - - - 97 - João Suplicy - - - 98 - Judas Priest - - - 99 - Legião Urbana - - - 100 - Lenny Kravitz - - - 101 - Lulu Santos - - - 102 - Marillion - - - 103 - Marisa Monte - - - 104 - Marvin Gaye - - - 105 - Men At Work - - - 106 - Motörhead - - - 107 - Motörhead & Girlschool - - - 108 - Mônica Marianno - - - 109 - Mötley Crüe - - - 110 - Nirvana - - - 111 - O Terço - - - 112 - Olodum - - - 113 - Os Paralamas Do Sucesso - - - 114 - Ozzy Osbourne - - - 115 - Page & Plant - - - 116 - Passengers - - - 117 - Paul D'Ianno - - - 118 - Pearl Jam - - - 119 - Peter Tosh - - - 120 - Pink Floyd - - - 121 - Planet Hemp - - - 122 - R.E.M. Feat. Kate Pearson - - - 123 - R.E.M. Feat. KRS-One - - - 124 - R.E.M. - - - 125 - Raimundos - - - 126 - Raul Seixas - - - 127 - Red Hot Chili Peppers - - - 128 - Rush - - - 129 - Simply Red - - - 130 - Skank - - - 131 - Smashing Pumpkins - - - 132 - Soundgarden - - - 133 - Stevie Ray Vaughan & Double Trouble - - - 134 - Stone Temple Pilots - - - 135 - System Of A Down - - - 136 - Terry Bozzio, Tony Levin & Steve Stevens - - - 137 - The Black Crowes - - - 138 - The Clash - - - 139 - The Cult - - - 140 - The Doors - - - 141 - The Police - - - 142 - The Rolling Stones - - - 143 - The Tea Party - - - 144 - The Who - - - 145 - Tim Maia - - - 146 - Titãs - - - 147 - Battlestar Galactica - - - 148 - Heroes - - - 149 - Lost - - - 150 - U2 - - - 151 - UB40 - - - 152 - Van Halen - - - 153 - Velvet Revolver - - - 154 - Whitesnake - - - 155 - Zeca Pagodinho - - - 156 - The Office - - - 157 - Dread Zeppelin - - - 158 - Battlestar Galactica (Classic) - - - 159 - Aquaman - - - 160 - Christina Aguilera featuring BigElf - - - 161 - Aerosmith & Sierra Leone's Refugee Allstars - - - 162 - Los Lonely Boys - - - 163 - Corinne Bailey Rae - - - 164 - Dhani Harrison & Jakob Dylan - - - 165 - Jackson Browne - - - 166 - Avril Lavigne - - - 167 - Big & Rich - - - 168 - Youssou N'Dour - - - 169 - Black Eyed Peas - - - 170 - Jack Johnson - - - 171 - Ben Harper - - - 172 - Snow Patrol - - - 173 - Matisyahu - - - 174 - The Postal Service - - - 175 - Jaguares - - - 176 - The Flaming Lips - - - 177 - Jack's Mannequin & Mick Fleetwood - - - 178 - Regina Spektor - - - 179 - Scorpions - - - 180 - House Of Pain - - - 181 - Xis - - - 182 - Nega Gizza - - - 183 - Gustavo & Andres Veiga & Salazar - - - 184 - Rodox - - - 185 - Charlie Brown Jr. - - - 186 - Pedro Luís E A Parede - - - 187 - Los Hermanos - - - 188 - Mundo Livre S/A - - - 189 - Otto - - - 190 - Instituto - - - 191 - Nação Zumbi - - - 192 - DJ Dolores & Orchestra Santa Massa - - - 193 - Seu Jorge - - - 194 - Sabotage E Instituto - - - 195 - Stereo Maracana - - - 196 - Cake - - - 197 - Aisha Duo - - - 198 - Habib Koité and Bamada - - - 199 - Karsh Kale - - - 200 - The Posies - - - 201 - Luciana Souza/Romero Lubambo - - - 202 - Aaron Goldberg - - - 203 - Nicolaus Esterhazy Sinfonia - - - 204 - Temple of the Dog - - - 205 - Chris Cornell - - - 206 - Alberto Turco & Nova Schola Gregoriana - - - 207 - Richard Marlow & The Choir of Trinity College, Cambridge - - - 208 - English Concert & Trevor Pinnock - - - 209 - Anne-Sophie Mutter, Herbert Von Karajan & Wiener Philharmoniker - - - 210 - Hilary Hahn, Jeffrey Kahane, Los Angeles Chamber Orchestra & Margaret Batjer - - - 211 - Wilhelm Kempff - - - 212 - Yo-Yo Ma - - - 213 - Scholars Baroque Ensemble - - - 214 - Academy of St. Martin in the Fields & Sir Neville Marriner - - - 215 - Academy of St. Martin in the Fields Chamber Ensemble & Sir Neville Marriner - - - 216 - Berliner Philharmoniker, Claudio Abbado & Sabine Meyer - - - 217 - Royal Philharmonic Orchestra & Sir Thomas Beecham - - - 218 - Orchestre Révolutionnaire et Romantique & John Eliot Gardiner - - - 219 - Britten Sinfonia, Ivor Bolton & Lesley Garrett - - - 220 - Chicago Symphony Chorus, Chicago Symphony Orchestra & Sir Georg Solti - - - 221 - Sir Georg Solti & Wiener Philharmoniker - - - 222 - Academy of St. Martin in the Fields, John Birch, Sir Neville Marriner & Sylvia McNair - - - 223 - London Symphony Orchestra & Sir Charles Mackerras - - - 224 - Barry Wordsworth & BBC Concert Orchestra - - - 225 - Herbert Von Karajan, Mirella Freni & Wiener Philharmoniker - - - 226 - Eugene Ormandy - - - 227 - Luciano Pavarotti - - - 228 - Leonard Bernstein & New York Philharmonic - - - 229 - Boston Symphony Orchestra & Seiji Ozawa - - - 230 - Aaron Copland & London Symphony Orchestra - - - 231 - Ton Koopman - - - 232 - Sergei Prokofiev & Yuri Temirkanov - - - 233 - Chicago Symphony Orchestra & Fritz Reiner - - - 234 - Orchestra of The Age of Enlightenment - - - 235 - Emanuel Ax, Eugene Ormandy & Philadelphia Orchestra - - - 236 - James Levine - - - 237 - Berliner Philharmoniker & Hans Rosbaud - - - 238 - Maurizio Pollini - - - 239 - Academy of St. Martin in the Fields, Sir Neville Marriner & William Bennett - - - 240 - Gustav Mahler - - - 241 - Felix Schmidt, London Symphony Orchestra & Rafael Frühbeck de Burgos - - - 242 - Edo de Waart & San Francisco Symphony - - - 243 - Antal Doráti & London Symphony Orchestra - - - 244 - Choir Of Westminster Abbey & Simon Preston - - - 245 - Michael Tilson Thomas & San Francisco Symphony - - - 246 - Chor der Wiener Staatsoper, Herbert Von Karajan & Wiener Philharmoniker - - - 247 - The King's Singers - - - 248 - Berliner Philharmoniker & Herbert Von Karajan - - - 249 - Sir Georg Solti, Sumi Jo & Wiener Philharmoniker - - - 250 - Christopher O'Riley - - - 251 - Fretwork - - - 252 - Amy Winehouse - - - 253 - Calexico - - - 254 - Otto Klemperer & Philharmonia Orchestra - - - 255 - Yehudi Menuhin - - - 256 - Philharmonia Orchestra & Sir Neville Marriner - - - 257 - Academy of St. Martin in the Fields, Sir Neville Marriner & Thurston Dart - - - 258 - Les Arts Florissants & William Christie - - - 259 - The 12 Cellists of The Berlin Philharmonic - - - 260 - Adrian Leaper & Doreen de Feis - - - 261 - Roger Norrington, London Classical Players - - - 262 - Charles Dutoit & L'Orchestre Symphonique de Montréal - - - 263 - Equale Brass Ensemble, John Eliot Gardiner & Munich Monteverdi Orchestra and Choir - - - 264 - Kent Nagano and Orchestre de l'Opéra de Lyon - - - 265 - Julian Bream - - - 266 - Martin Roscoe - - - 267 - Göteborgs Symfoniker & Neeme Järvi - - - 268 - Itzhak Perlman - - - 269 - Michele Campanella - - - 270 - Gerald Moore - - - 271 - Mela Tenenbaum, Pro Musica Prague & Richard Kapp - - - 272 - Emerson String Quartet - - - 273 - C. Monteverdi, Nigel Rogers - Chiaroscuro; London Baroque; London Cornett & Sackbu - - - 274 - Nash Ensemble - - - 275 - Philip Glass Ensemble - - - - - - System.Int32 - System.String - - - - 1 - Rock - - - 2 - Jazz - - - 3 - Metal - - - 4 - Alternative & Punk - - - 5 - Rock And Roll - - - 6 - Blues - - - 7 - Latin - - - 8 - Reggae - - - 9 - Pop - - - 10 - Soundtrack - - - 11 - Bossa Nova - - - 12 - Easy Listening - - - 13 - Heavy Metal - - - 14 - R&B/Soul - - - 15 - Electronica/Dance - - - 16 - World - - - 17 - Hip Hop/Rap - - - 18 - Science Fiction - - - 19 - TV Shows - - - 20 - Sci Fi & Fantasy - - - 21 - Drama - - - 22 - Comedy - - - 23 - Alternative - - - 24 - Classical - - - 25 - Opera - - - - - - System.Int32 - System.Decimal - System.Int32 - System.Int32 - System.Int32 - - - - 1 - 0.9900000000000000000 - 1 - 1 - 2 - - - 2 - 0.9900000000000000000 - 1 - 1 - 4 - - - 3 - 0.9900000000000000000 - 1 - 2 - 6 - - - 4 - 0.9900000000000000000 - 1 - 2 - 8 - - - 5 - 0.9900000000000000000 - 1 - 2 - 10 - - - 6 - 0.9900000000000000000 - 1 - 2 - 12 - - - 7 - 0.9900000000000000000 - 1 - 3 - 16 - - - 8 - 0.9900000000000000000 - 1 - 3 - 20 - - - 9 - 0.9900000000000000000 - 1 - 3 - 24 - - - 10 - 0.9900000000000000000 - 1 - 3 - 28 - - - 11 - 0.9900000000000000000 - 1 - 3 - 32 - - - 12 - 0.9900000000000000000 - 1 - 3 - 36 - - - 13 - 0.9900000000000000000 - 1 - 4 - 42 - - - 14 - 0.9900000000000000000 - 1 - 4 - 48 - - - 15 - 0.9900000000000000000 - 1 - 4 - 54 - - - 16 - 0.9900000000000000000 - 1 - 4 - 60 - - - 17 - 0.9900000000000000000 - 1 - 4 - 66 - - - 18 - 0.9900000000000000000 - 1 - 4 - 72 - - - 19 - 0.9900000000000000000 - 1 - 4 - 78 - - - 20 - 0.9900000000000000000 - 1 - 4 - 84 - - - 21 - 0.9900000000000000000 - 1 - 4 - 90 - - - 22 - 0.9900000000000000000 - 1 - 5 - 99 - - - 23 - 0.9900000000000000000 - 1 - 5 - 108 - - - 24 - 0.9900000000000000000 - 1 - 5 - 117 - - - 25 - 0.9900000000000000000 - 1 - 5 - 126 - - - 26 - 0.9900000000000000000 - 1 - 5 - 135 - - - 27 - 0.9900000000000000000 - 1 - 5 - 144 - - - 28 - 0.9900000000000000000 - 1 - 5 - 153 - - - 29 - 0.9900000000000000000 - 1 - 5 - 162 - - - 30 - 0.9900000000000000000 - 1 - 5 - 171 - - - 31 - 0.9900000000000000000 - 1 - 5 - 180 - - - 32 - 0.9900000000000000000 - 1 - 5 - 189 - - - 33 - 0.9900000000000000000 - 1 - 5 - 198 - - - 34 - 0.9900000000000000000 - 1 - 5 - 207 - - - 35 - 0.9900000000000000000 - 1 - 5 - 216 - - - 36 - 0.9900000000000000000 - 1 - 6 - 230 - - - 37 - 0.9900000000000000000 - 1 - 7 - 231 - - - 38 - 0.9900000000000000000 - 1 - 7 - 232 - - - 39 - 0.9900000000000000000 - 1 - 8 - 234 - - - 40 - 0.9900000000000000000 - 1 - 8 - 236 - - - 41 - 0.9900000000000000000 - 1 - 9 - 238 - - - 42 - 0.9900000000000000000 - 1 - 9 - 240 - - - 43 - 0.9900000000000000000 - 1 - 9 - 242 - - - 44 - 0.9900000000000000000 - 1 - 9 - 244 - - - 45 - 0.9900000000000000000 - 1 - 10 - 248 - - - 46 - 0.9900000000000000000 - 1 - 10 - 252 - - - 47 - 0.9900000000000000000 - 1 - 10 - 256 - - - 48 - 0.9900000000000000000 - 1 - 10 - 260 - - - 49 - 0.9900000000000000000 - 1 - 10 - 264 - - - 50 - 0.9900000000000000000 - 1 - 10 - 268 - - - 51 - 0.9900000000000000000 - 1 - 11 - 274 - - - 52 - 0.9900000000000000000 - 1 - 11 - 280 - - - 53 - 0.9900000000000000000 - 1 - 11 - 286 - - - 54 - 0.9900000000000000000 - 1 - 11 - 292 - - - 55 - 0.9900000000000000000 - 1 - 11 - 298 - - - 56 - 0.9900000000000000000 - 1 - 11 - 304 - - - 57 - 0.9900000000000000000 - 1 - 11 - 310 - - - 58 - 0.9900000000000000000 - 1 - 11 - 316 - - - 59 - 0.9900000000000000000 - 1 - 11 - 322 - - - 60 - 0.9900000000000000000 - 1 - 12 - 331 - - - 61 - 0.9900000000000000000 - 1 - 12 - 340 - - - 62 - 0.9900000000000000000 - 1 - 12 - 349 - - - 63 - 0.9900000000000000000 - 1 - 12 - 358 - - - 64 - 0.9900000000000000000 - 1 - 12 - 367 - - - 65 - 0.9900000000000000000 - 1 - 12 - 376 - - - 66 - 0.9900000000000000000 - 1 - 12 - 385 - - - 67 - 0.9900000000000000000 - 1 - 12 - 394 - - - 68 - 0.9900000000000000000 - 1 - 12 - 403 - - - 69 - 0.9900000000000000000 - 1 - 12 - 412 - - - 70 - 0.9900000000000000000 - 1 - 12 - 421 - - - 71 - 0.9900000000000000000 - 1 - 12 - 430 - - - 72 - 0.9900000000000000000 - 1 - 12 - 439 - - - 73 - 0.9900000000000000000 - 1 - 12 - 448 - - - 74 - 0.9900000000000000000 - 1 - 13 - 462 - - - 75 - 0.9900000000000000000 - 1 - 14 - 463 - - - 76 - 0.9900000000000000000 - 1 - 14 - 464 - - - 77 - 0.9900000000000000000 - 1 - 15 - 466 - - - 78 - 0.9900000000000000000 - 1 - 15 - 468 - - - 79 - 0.9900000000000000000 - 1 - 16 - 470 - - - 80 - 0.9900000000000000000 - 1 - 16 - 472 - - - 81 - 0.9900000000000000000 - 1 - 16 - 474 - - - 82 - 0.9900000000000000000 - 1 - 16 - 476 - - - 83 - 0.9900000000000000000 - 1 - 17 - 480 - - - 84 - 0.9900000000000000000 - 1 - 17 - 484 - - - 85 - 0.9900000000000000000 - 1 - 17 - 488 - - - 86 - 0.9900000000000000000 - 1 - 17 - 492 - - - 87 - 0.9900000000000000000 - 1 - 17 - 496 - - - 88 - 0.9900000000000000000 - 1 - 17 - 500 - - - 89 - 0.9900000000000000000 - 1 - 18 - 506 - - - 90 - 0.9900000000000000000 - 1 - 18 - 512 - - - 91 - 0.9900000000000000000 - 1 - 18 - 518 - - - 92 - 0.9900000000000000000 - 1 - 18 - 524 - - - 93 - 0.9900000000000000000 - 1 - 18 - 530 - - - 94 - 0.9900000000000000000 - 1 - 18 - 536 - - - 95 - 0.9900000000000000000 - 1 - 18 - 542 - - - 96 - 0.9900000000000000000 - 1 - 18 - 548 - - - 97 - 0.9900000000000000000 - 1 - 18 - 554 - - - 98 - 0.9900000000000000000 - 1 - 19 - 563 - - - 99 - 0.9900000000000000000 - 1 - 19 - 572 - - - 100 - 0.9900000000000000000 - 1 - 19 - 581 - - - 101 - 0.9900000000000000000 - 1 - 19 - 590 - - - 102 - 0.9900000000000000000 - 1 - 19 - 599 - - - 103 - 0.9900000000000000000 - 1 - 19 - 608 - - - 104 - 0.9900000000000000000 - 1 - 19 - 617 - - - 105 - 0.9900000000000000000 - 1 - 19 - 626 - - - 106 - 0.9900000000000000000 - 1 - 19 - 635 - - - 107 - 0.9900000000000000000 - 1 - 19 - 644 - - - 108 - 0.9900000000000000000 - 1 - 19 - 653 - - - 109 - 0.9900000000000000000 - 1 - 19 - 662 - - - 110 - 0.9900000000000000000 - 1 - 19 - 671 - - - 111 - 0.9900000000000000000 - 1 - 19 - 680 - - - 112 - 0.9900000000000000000 - 1 - 20 - 694 - - - 113 - 0.9900000000000000000 - 1 - 21 - 695 - - - 114 - 0.9900000000000000000 - 1 - 21 - 696 - - - 115 - 0.9900000000000000000 - 1 - 22 - 698 - - - 116 - 0.9900000000000000000 - 1 - 22 - 700 - - - 117 - 0.9900000000000000000 - 1 - 23 - 702 - - - 118 - 0.9900000000000000000 - 1 - 23 - 704 - - - 119 - 0.9900000000000000000 - 1 - 23 - 706 - - - 120 - 0.9900000000000000000 - 1 - 23 - 708 - - - 121 - 0.9900000000000000000 - 1 - 24 - 712 - - - 122 - 0.9900000000000000000 - 1 - 24 - 716 - - - 123 - 0.9900000000000000000 - 1 - 24 - 720 - - - 124 - 0.9900000000000000000 - 1 - 24 - 724 - - - 125 - 0.9900000000000000000 - 1 - 24 - 728 - - - 126 - 0.9900000000000000000 - 1 - 24 - 732 - - - 127 - 0.9900000000000000000 - 1 - 25 - 738 - - - 128 - 0.9900000000000000000 - 1 - 25 - 744 - - - 129 - 0.9900000000000000000 - 1 - 25 - 750 - - - 130 - 0.9900000000000000000 - 1 - 25 - 756 - - - 131 - 0.9900000000000000000 - 1 - 25 - 762 - - - 132 - 0.9900000000000000000 - 1 - 25 - 768 - - - 133 - 0.9900000000000000000 - 1 - 25 - 774 - - - 134 - 0.9900000000000000000 - 1 - 25 - 780 - - - 135 - 0.9900000000000000000 - 1 - 25 - 786 - - - 136 - 0.9900000000000000000 - 1 - 26 - 795 - - - 137 - 0.9900000000000000000 - 1 - 26 - 804 - - - 138 - 0.9900000000000000000 - 1 - 26 - 813 - - - 139 - 0.9900000000000000000 - 1 - 26 - 822 - - - 140 - 0.9900000000000000000 - 1 - 26 - 831 - - - 141 - 0.9900000000000000000 - 1 - 26 - 840 - - - 142 - 0.9900000000000000000 - 1 - 26 - 849 - - - 143 - 0.9900000000000000000 - 1 - 26 - 858 - - - 144 - 0.9900000000000000000 - 1 - 26 - 867 - - - 145 - 0.9900000000000000000 - 1 - 26 - 876 - - - 146 - 0.9900000000000000000 - 1 - 26 - 885 - - - 147 - 0.9900000000000000000 - 1 - 26 - 894 - - - 148 - 0.9900000000000000000 - 1 - 26 - 903 - - - 149 - 0.9900000000000000000 - 1 - 26 - 912 - - - 150 - 0.9900000000000000000 - 1 - 27 - 926 - - - 151 - 0.9900000000000000000 - 1 - 28 - 927 - - - 152 - 0.9900000000000000000 - 1 - 28 - 928 - - - 153 - 0.9900000000000000000 - 1 - 29 - 930 - - - 154 - 0.9900000000000000000 - 1 - 29 - 932 - - - 155 - 0.9900000000000000000 - 1 - 30 - 934 - - - 156 - 0.9900000000000000000 - 1 - 30 - 936 - - - 157 - 0.9900000000000000000 - 1 - 30 - 938 - - - 158 - 0.9900000000000000000 - 1 - 30 - 940 - - - 159 - 0.9900000000000000000 - 1 - 31 - 944 - - - 160 - 0.9900000000000000000 - 1 - 31 - 948 - - - 161 - 0.9900000000000000000 - 1 - 31 - 952 - - - 162 - 0.9900000000000000000 - 1 - 31 - 956 - - - 163 - 0.9900000000000000000 - 1 - 31 - 960 - - - 164 - 0.9900000000000000000 - 1 - 31 - 964 - - - 165 - 0.9900000000000000000 - 1 - 32 - 970 - - - 166 - 0.9900000000000000000 - 1 - 32 - 976 - - - 167 - 0.9900000000000000000 - 1 - 32 - 982 - - - 168 - 0.9900000000000000000 - 1 - 32 - 988 - - - 169 - 0.9900000000000000000 - 1 - 32 - 994 - - - 170 - 0.9900000000000000000 - 1 - 32 - 1000 - - - 171 - 0.9900000000000000000 - 1 - 32 - 1006 - - - 172 - 0.9900000000000000000 - 1 - 32 - 1012 - - - 173 - 0.9900000000000000000 - 1 - 32 - 1018 - - - 174 - 0.9900000000000000000 - 1 - 33 - 1027 - - - 175 - 0.9900000000000000000 - 1 - 33 - 1036 - - - 176 - 0.9900000000000000000 - 1 - 33 - 1045 - - - 177 - 0.9900000000000000000 - 1 - 33 - 1054 - - - 178 - 0.9900000000000000000 - 1 - 33 - 1063 - - - 179 - 0.9900000000000000000 - 1 - 33 - 1072 - - - 180 - 0.9900000000000000000 - 1 - 33 - 1081 - - - 181 - 0.9900000000000000000 - 1 - 33 - 1090 - - - 182 - 0.9900000000000000000 - 1 - 33 - 1099 - - - 183 - 0.9900000000000000000 - 1 - 33 - 1108 - - - 184 - 0.9900000000000000000 - 1 - 33 - 1117 - - - 185 - 0.9900000000000000000 - 1 - 33 - 1126 - - - 186 - 0.9900000000000000000 - 1 - 33 - 1135 - - - 187 - 0.9900000000000000000 - 1 - 33 - 1144 - - - 188 - 0.9900000000000000000 - 1 - 34 - 1158 - - - 189 - 0.9900000000000000000 - 1 - 35 - 1159 - - - 190 - 0.9900000000000000000 - 1 - 35 - 1160 - - - 191 - 0.9900000000000000000 - 1 - 36 - 1162 - - - 192 - 0.9900000000000000000 - 1 - 36 - 1164 - - - 193 - 0.9900000000000000000 - 1 - 37 - 1166 - - - 194 - 0.9900000000000000000 - 1 - 37 - 1168 - - - 195 - 0.9900000000000000000 - 1 - 37 - 1170 - - - 196 - 0.9900000000000000000 - 1 - 37 - 1172 - - - 197 - 0.9900000000000000000 - 1 - 38 - 1176 - - - 198 - 0.9900000000000000000 - 1 - 38 - 1180 - - - 199 - 0.9900000000000000000 - 1 - 38 - 1184 - - - 200 - 0.9900000000000000000 - 1 - 38 - 1188 - - - 201 - 0.9900000000000000000 - 1 - 38 - 1192 - - - 202 - 0.9900000000000000000 - 1 - 38 - 1196 - - - 203 - 0.9900000000000000000 - 1 - 39 - 1202 - - - 204 - 0.9900000000000000000 - 1 - 39 - 1208 - - - 205 - 0.9900000000000000000 - 1 - 39 - 1214 - - - 206 - 0.9900000000000000000 - 1 - 39 - 1220 - - - 207 - 0.9900000000000000000 - 1 - 39 - 1226 - - - 208 - 0.9900000000000000000 - 1 - 39 - 1232 - - - 209 - 0.9900000000000000000 - 1 - 39 - 1238 - - - 210 - 0.9900000000000000000 - 1 - 39 - 1244 - - - 211 - 0.9900000000000000000 - 1 - 39 - 1250 - - - 212 - 0.9900000000000000000 - 1 - 40 - 1259 - - - 213 - 0.9900000000000000000 - 1 - 40 - 1268 - - - 214 - 0.9900000000000000000 - 1 - 40 - 1277 - - - 215 - 0.9900000000000000000 - 1 - 40 - 1286 - - - 216 - 0.9900000000000000000 - 1 - 40 - 1295 - - - 217 - 0.9900000000000000000 - 1 - 40 - 1304 - - - 218 - 0.9900000000000000000 - 1 - 40 - 1313 - - - 219 - 0.9900000000000000000 - 1 - 40 - 1322 - - - 220 - 0.9900000000000000000 - 1 - 40 - 1331 - - - 221 - 0.9900000000000000000 - 1 - 40 - 1340 - - - 222 - 0.9900000000000000000 - 1 - 40 - 1349 - - - 223 - 0.9900000000000000000 - 1 - 40 - 1358 - - - 224 - 0.9900000000000000000 - 1 - 40 - 1367 - - - 225 - 0.9900000000000000000 - 1 - 40 - 1376 - - - 226 - 0.9900000000000000000 - 1 - 41 - 1390 - - - 227 - 0.9900000000000000000 - 1 - 42 - 1391 - - - 228 - 0.9900000000000000000 - 1 - 42 - 1392 - - - 229 - 0.9900000000000000000 - 1 - 43 - 1394 - - - 230 - 0.9900000000000000000 - 1 - 43 - 1396 - - - 231 - 0.9900000000000000000 - 1 - 44 - 1398 - - - 232 - 0.9900000000000000000 - 1 - 44 - 1400 - - - 233 - 0.9900000000000000000 - 1 - 44 - 1402 - - - 234 - 0.9900000000000000000 - 1 - 44 - 1404 - - - 235 - 0.9900000000000000000 - 1 - 45 - 1408 - - - 236 - 0.9900000000000000000 - 1 - 45 - 1412 - - - 237 - 0.9900000000000000000 - 1 - 45 - 1416 - - - 238 - 0.9900000000000000000 - 1 - 45 - 1420 - - - 239 - 0.9900000000000000000 - 1 - 45 - 1424 - - - 240 - 0.9900000000000000000 - 1 - 45 - 1428 - - - 241 - 0.9900000000000000000 - 1 - 46 - 1434 - - - 242 - 0.9900000000000000000 - 1 - 46 - 1440 - - - 243 - 0.9900000000000000000 - 1 - 46 - 1446 - - - 244 - 0.9900000000000000000 - 1 - 46 - 1452 - - - 245 - 0.9900000000000000000 - 1 - 46 - 1458 - - - 246 - 0.9900000000000000000 - 1 - 46 - 1464 - - - 247 - 0.9900000000000000000 - 1 - 46 - 1470 - - - 248 - 0.9900000000000000000 - 1 - 46 - 1476 - - - 249 - 0.9900000000000000000 - 1 - 46 - 1482 - - - 250 - 0.9900000000000000000 - 1 - 47 - 1491 - - - 251 - 0.9900000000000000000 - 1 - 47 - 1500 - - - 252 - 0.9900000000000000000 - 1 - 47 - 1509 - - - 253 - 0.9900000000000000000 - 1 - 47 - 1518 - - - 254 - 0.9900000000000000000 - 1 - 47 - 1527 - - - 255 - 0.9900000000000000000 - 1 - 47 - 1536 - - - 256 - 0.9900000000000000000 - 1 - 47 - 1545 - - - 257 - 0.9900000000000000000 - 1 - 47 - 1554 - - - 258 - 0.9900000000000000000 - 1 - 47 - 1563 - - - 259 - 0.9900000000000000000 - 1 - 47 - 1572 - - - 260 - 0.9900000000000000000 - 1 - 47 - 1581 - - - 261 - 0.9900000000000000000 - 1 - 47 - 1590 - - - 262 - 0.9900000000000000000 - 1 - 47 - 1599 - - - 263 - 0.9900000000000000000 - 1 - 47 - 1608 - - - 264 - 0.9900000000000000000 - 1 - 48 - 1622 - - - 265 - 0.9900000000000000000 - 1 - 49 - 1623 - - - 266 - 0.9900000000000000000 - 1 - 49 - 1624 - - - 267 - 0.9900000000000000000 - 1 - 50 - 1626 - - - 268 - 0.9900000000000000000 - 1 - 50 - 1628 - - - 269 - 0.9900000000000000000 - 1 - 51 - 1630 - - - 270 - 0.9900000000000000000 - 1 - 51 - 1632 - - - 271 - 0.9900000000000000000 - 1 - 51 - 1634 - - - 272 - 0.9900000000000000000 - 1 - 51 - 1636 - - - 273 - 0.9900000000000000000 - 1 - 52 - 1640 - - - 274 - 0.9900000000000000000 - 1 - 52 - 1644 - - - 275 - 0.9900000000000000000 - 1 - 52 - 1648 - - - 276 - 0.9900000000000000000 - 1 - 52 - 1652 - - - 277 - 0.9900000000000000000 - 1 - 52 - 1656 - - - 278 - 0.9900000000000000000 - 1 - 52 - 1660 - - - 279 - 0.9900000000000000000 - 1 - 53 - 1666 - - - 280 - 0.9900000000000000000 - 1 - 53 - 1672 - - - 281 - 0.9900000000000000000 - 1 - 53 - 1678 - - - 282 - 0.9900000000000000000 - 1 - 53 - 1684 - - - 283 - 0.9900000000000000000 - 1 - 53 - 1690 - - - 284 - 0.9900000000000000000 - 1 - 53 - 1696 - - - 285 - 0.9900000000000000000 - 1 - 53 - 1702 - - - 286 - 0.9900000000000000000 - 1 - 53 - 1708 - - - 287 - 0.9900000000000000000 - 1 - 53 - 1714 - - - 288 - 0.9900000000000000000 - 1 - 54 - 1723 - - - 289 - 0.9900000000000000000 - 1 - 54 - 1732 - - - 290 - 0.9900000000000000000 - 1 - 54 - 1741 - - - 291 - 0.9900000000000000000 - 1 - 54 - 1750 - - - 292 - 0.9900000000000000000 - 1 - 54 - 1759 - - - 293 - 0.9900000000000000000 - 1 - 54 - 1768 - - - 294 - 0.9900000000000000000 - 1 - 54 - 1777 - - - 295 - 0.9900000000000000000 - 1 - 54 - 1786 - - - 296 - 0.9900000000000000000 - 1 - 54 - 1795 - - - 297 - 0.9900000000000000000 - 1 - 54 - 1804 - - - 298 - 0.9900000000000000000 - 1 - 54 - 1813 - - - 299 - 0.9900000000000000000 - 1 - 54 - 1822 - - - 300 - 0.9900000000000000000 - 1 - 54 - 1831 - - - 301 - 0.9900000000000000000 - 1 - 54 - 1840 - - - 302 - 0.9900000000000000000 - 1 - 55 - 1854 - - - 303 - 0.9900000000000000000 - 1 - 56 - 1855 - - - 304 - 0.9900000000000000000 - 1 - 56 - 1856 - - - 305 - 0.9900000000000000000 - 1 - 57 - 1858 - - - 306 - 0.9900000000000000000 - 1 - 57 - 1860 - - - 307 - 0.9900000000000000000 - 1 - 58 - 1862 - - - 308 - 0.9900000000000000000 - 1 - 58 - 1864 - - - 309 - 0.9900000000000000000 - 1 - 58 - 1866 - - - 310 - 0.9900000000000000000 - 1 - 58 - 1868 - - - 311 - 0.9900000000000000000 - 1 - 59 - 1872 - - - 312 - 0.9900000000000000000 - 1 - 59 - 1876 - - - 313 - 0.9900000000000000000 - 1 - 59 - 1880 - - - 314 - 0.9900000000000000000 - 1 - 59 - 1884 - - - 315 - 0.9900000000000000000 - 1 - 59 - 1888 - - - 316 - 0.9900000000000000000 - 1 - 59 - 1892 - - - 317 - 0.9900000000000000000 - 1 - 60 - 1898 - - - 318 - 0.9900000000000000000 - 1 - 60 - 1904 - - - 319 - 0.9900000000000000000 - 1 - 60 - 1910 - - - 320 - 0.9900000000000000000 - 1 - 60 - 1916 - - - 321 - 0.9900000000000000000 - 1 - 60 - 1922 - - - 322 - 0.9900000000000000000 - 1 - 60 - 1928 - - - 323 - 0.9900000000000000000 - 1 - 60 - 1934 - - - 324 - 0.9900000000000000000 - 1 - 60 - 1940 - - - 325 - 0.9900000000000000000 - 1 - 60 - 1946 - - - 326 - 0.9900000000000000000 - 1 - 61 - 1955 - - - 327 - 0.9900000000000000000 - 1 - 61 - 1964 - - - 328 - 0.9900000000000000000 - 1 - 61 - 1973 - - - 329 - 0.9900000000000000000 - 1 - 61 - 1982 - - - 330 - 0.9900000000000000000 - 1 - 61 - 1991 - - - 331 - 0.9900000000000000000 - 1 - 61 - 2000 - - - 332 - 0.9900000000000000000 - 1 - 61 - 2009 - - - 333 - 0.9900000000000000000 - 1 - 61 - 2018 - - - 334 - 0.9900000000000000000 - 1 - 61 - 2027 - - - 335 - 0.9900000000000000000 - 1 - 61 - 2036 - - - 336 - 0.9900000000000000000 - 1 - 61 - 2045 - - - 337 - 0.9900000000000000000 - 1 - 61 - 2054 - - - 338 - 0.9900000000000000000 - 1 - 61 - 2063 - - - 339 - 0.9900000000000000000 - 1 - 61 - 2072 - - - 340 - 0.9900000000000000000 - 1 - 62 - 2086 - - - 341 - 0.9900000000000000000 - 1 - 63 - 2087 - - - 342 - 0.9900000000000000000 - 1 - 63 - 2088 - - - 343 - 0.9900000000000000000 - 1 - 64 - 2090 - - - 344 - 0.9900000000000000000 - 1 - 64 - 2092 - - - 345 - 0.9900000000000000000 - 1 - 65 - 2094 - - - 346 - 0.9900000000000000000 - 1 - 65 - 2096 - - - 347 - 0.9900000000000000000 - 1 - 65 - 2098 - - - 348 - 0.9900000000000000000 - 1 - 65 - 2100 - - - 349 - 0.9900000000000000000 - 1 - 66 - 2104 - - - 350 - 0.9900000000000000000 - 1 - 66 - 2108 - - - 351 - 0.9900000000000000000 - 1 - 66 - 2112 - - - 352 - 0.9900000000000000000 - 1 - 66 - 2116 - - - 353 - 0.9900000000000000000 - 1 - 66 - 2120 - - - 354 - 0.9900000000000000000 - 1 - 66 - 2124 - - - 355 - 0.9900000000000000000 - 1 - 67 - 2130 - - - 356 - 0.9900000000000000000 - 1 - 67 - 2136 - - - 357 - 0.9900000000000000000 - 1 - 67 - 2142 - - - 358 - 0.9900000000000000000 - 1 - 67 - 2148 - - - 359 - 0.9900000000000000000 - 1 - 67 - 2154 - - - 360 - 0.9900000000000000000 - 1 - 67 - 2160 - - - 361 - 0.9900000000000000000 - 1 - 67 - 2166 - - - 362 - 0.9900000000000000000 - 1 - 67 - 2172 - - - 363 - 0.9900000000000000000 - 1 - 67 - 2178 - - - 364 - 0.9900000000000000000 - 1 - 68 - 2187 - - - 365 - 0.9900000000000000000 - 1 - 68 - 2196 - - - 366 - 0.9900000000000000000 - 1 - 68 - 2205 - - - 367 - 0.9900000000000000000 - 1 - 68 - 2214 - - - 368 - 0.9900000000000000000 - 1 - 68 - 2223 - - - 369 - 0.9900000000000000000 - 1 - 68 - 2232 - - - 370 - 0.9900000000000000000 - 1 - 68 - 2241 - - - 371 - 0.9900000000000000000 - 1 - 68 - 2250 - - - 372 - 0.9900000000000000000 - 1 - 68 - 2259 - - - 373 - 0.9900000000000000000 - 1 - 68 - 2268 - - - 374 - 0.9900000000000000000 - 1 - 68 - 2277 - - - 375 - 0.9900000000000000000 - 1 - 68 - 2286 - - - 376 - 0.9900000000000000000 - 1 - 68 - 2295 - - - 377 - 0.9900000000000000000 - 1 - 68 - 2304 - - - 378 - 0.9900000000000000000 - 1 - 69 - 2318 - - - 379 - 0.9900000000000000000 - 1 - 70 - 2319 - - - 380 - 0.9900000000000000000 - 1 - 70 - 2320 - - - 381 - 0.9900000000000000000 - 1 - 71 - 2322 - - - 382 - 0.9900000000000000000 - 1 - 71 - 2324 - - - 383 - 0.9900000000000000000 - 1 - 72 - 2326 - - - 384 - 0.9900000000000000000 - 1 - 72 - 2328 - - - 385 - 0.9900000000000000000 - 1 - 72 - 2330 - - - 386 - 0.9900000000000000000 - 1 - 72 - 2332 - - - 387 - 0.9900000000000000000 - 1 - 73 - 2336 - - - 388 - 0.9900000000000000000 - 1 - 73 - 2340 - - - 389 - 0.9900000000000000000 - 1 - 73 - 2344 - - - 390 - 0.9900000000000000000 - 1 - 73 - 2348 - - - 391 - 0.9900000000000000000 - 1 - 73 - 2352 - - - 392 - 0.9900000000000000000 - 1 - 73 - 2356 - - - 393 - 0.9900000000000000000 - 1 - 74 - 2362 - - - 394 - 0.9900000000000000000 - 1 - 74 - 2368 - - - 395 - 0.9900000000000000000 - 1 - 74 - 2374 - - - 396 - 0.9900000000000000000 - 1 - 74 - 2380 - - - 397 - 0.9900000000000000000 - 1 - 74 - 2386 - - - 398 - 0.9900000000000000000 - 1 - 74 - 2392 - - - 399 - 0.9900000000000000000 - 1 - 74 - 2398 - - - 400 - 0.9900000000000000000 - 1 - 74 - 2404 - - - 401 - 0.9900000000000000000 - 1 - 74 - 2410 - - - 402 - 0.9900000000000000000 - 1 - 75 - 2419 - - - 403 - 0.9900000000000000000 - 1 - 75 - 2428 - - - 404 - 0.9900000000000000000 - 1 - 75 - 2437 - - - 405 - 0.9900000000000000000 - 1 - 75 - 2446 - - - 406 - 0.9900000000000000000 - 1 - 75 - 2455 - - - 407 - 0.9900000000000000000 - 1 - 75 - 2464 - - - 408 - 0.9900000000000000000 - 1 - 75 - 2473 - - - 409 - 0.9900000000000000000 - 1 - 75 - 2482 - - - 410 - 0.9900000000000000000 - 1 - 75 - 2491 - - - 411 - 0.9900000000000000000 - 1 - 75 - 2500 - - - 412 - 0.9900000000000000000 - 1 - 75 - 2509 - - - 413 - 0.9900000000000000000 - 1 - 75 - 2518 - - - 414 - 0.9900000000000000000 - 1 - 75 - 2527 - - - 415 - 0.9900000000000000000 - 1 - 75 - 2536 - - - 416 - 0.9900000000000000000 - 1 - 76 - 2550 - - - 417 - 0.9900000000000000000 - 1 - 77 - 2551 - - - 418 - 0.9900000000000000000 - 1 - 77 - 2552 - - - 419 - 0.9900000000000000000 - 1 - 78 - 2554 - - - 420 - 0.9900000000000000000 - 1 - 78 - 2556 - - - 421 - 0.9900000000000000000 - 1 - 79 - 2558 - - - 422 - 0.9900000000000000000 - 1 - 79 - 2560 - - - 423 - 0.9900000000000000000 - 1 - 79 - 2562 - - - 424 - 0.9900000000000000000 - 1 - 79 - 2564 - - - 425 - 0.9900000000000000000 - 1 - 80 - 2568 - - - 426 - 0.9900000000000000000 - 1 - 80 - 2572 - - - 427 - 0.9900000000000000000 - 1 - 80 - 2576 - - - 428 - 0.9900000000000000000 - 1 - 80 - 2580 - - - 429 - 0.9900000000000000000 - 1 - 80 - 2584 - - - 430 - 0.9900000000000000000 - 1 - 80 - 2588 - - - 431 - 0.9900000000000000000 - 1 - 81 - 2594 - - - 432 - 0.9900000000000000000 - 1 - 81 - 2600 - - - 433 - 0.9900000000000000000 - 1 - 81 - 2606 - - - 434 - 0.9900000000000000000 - 1 - 81 - 2612 - - - 435 - 0.9900000000000000000 - 1 - 81 - 2618 - - - 436 - 0.9900000000000000000 - 1 - 81 - 2624 - - - 437 - 0.9900000000000000000 - 1 - 81 - 2630 - - - 438 - 0.9900000000000000000 - 1 - 81 - 2636 - - - 439 - 0.9900000000000000000 - 1 - 81 - 2642 - - - 440 - 0.9900000000000000000 - 1 - 82 - 2651 - - - 441 - 0.9900000000000000000 - 1 - 82 - 2660 - - - 442 - 0.9900000000000000000 - 1 - 82 - 2669 - - - 443 - 0.9900000000000000000 - 1 - 82 - 2678 - - - 444 - 0.9900000000000000000 - 1 - 82 - 2687 - - - 445 - 0.9900000000000000000 - 1 - 82 - 2696 - - - 446 - 0.9900000000000000000 - 1 - 82 - 2705 - - - 447 - 0.9900000000000000000 - 1 - 82 - 2714 - - - 448 - 0.9900000000000000000 - 1 - 82 - 2723 - - - 449 - 0.9900000000000000000 - 1 - 82 - 2732 - - - 450 - 0.9900000000000000000 - 1 - 82 - 2741 - - - 451 - 0.9900000000000000000 - 1 - 82 - 2750 - - - 452 - 0.9900000000000000000 - 1 - 82 - 2759 - - - 453 - 0.9900000000000000000 - 1 - 82 - 2768 - - - 454 - 0.9900000000000000000 - 1 - 83 - 2782 - - - 455 - 0.9900000000000000000 - 1 - 84 - 2783 - - - 456 - 0.9900000000000000000 - 1 - 84 - 2784 - - - 457 - 0.9900000000000000000 - 1 - 85 - 2786 - - - 458 - 0.9900000000000000000 - 1 - 85 - 2788 - - - 459 - 0.9900000000000000000 - 1 - 86 - 2790 - - - 460 - 0.9900000000000000000 - 1 - 86 - 2792 - - - 461 - 0.9900000000000000000 - 1 - 86 - 2794 - - - 462 - 0.9900000000000000000 - 1 - 86 - 2796 - - - 463 - 0.9900000000000000000 - 1 - 87 - 2800 - - - 464 - 0.9900000000000000000 - 1 - 87 - 2804 - - - 465 - 0.9900000000000000000 - 1 - 87 - 2808 - - - 466 - 0.9900000000000000000 - 1 - 87 - 2812 - - - 467 - 0.9900000000000000000 - 1 - 87 - 2816 - - - 468 - 1.9900000000000000000 - 1 - 87 - 2820 - - - 469 - 1.9900000000000000000 - 1 - 88 - 2826 - - - 470 - 1.9900000000000000000 - 1 - 88 - 2832 - - - 471 - 1.9900000000000000000 - 1 - 88 - 2838 - - - 472 - 1.9900000000000000000 - 1 - 88 - 2844 - - - 473 - 1.9900000000000000000 - 1 - 88 - 2850 - - - 474 - 1.9900000000000000000 - 1 - 88 - 2856 - - - 475 - 1.9900000000000000000 - 1 - 88 - 2862 - - - 476 - 1.9900000000000000000 - 1 - 88 - 2868 - - - 477 - 1.9900000000000000000 - 1 - 88 - 2874 - - - 478 - 1.9900000000000000000 - 1 - 89 - 2883 - - - 479 - 1.9900000000000000000 - 1 - 89 - 2892 - - - 480 - 1.9900000000000000000 - 1 - 89 - 2901 - - - 481 - 1.9900000000000000000 - 1 - 89 - 2910 - - - 482 - 1.9900000000000000000 - 1 - 89 - 2919 - - - 483 - 0.9900000000000000000 - 1 - 89 - 2928 - - - 484 - 0.9900000000000000000 - 1 - 89 - 2937 - - - 485 - 0.9900000000000000000 - 1 - 89 - 2946 - - - 486 - 0.9900000000000000000 - 1 - 89 - 2955 - - - 487 - 0.9900000000000000000 - 1 - 89 - 2964 - - - 488 - 0.9900000000000000000 - 1 - 89 - 2973 - - - 489 - 0.9900000000000000000 - 1 - 89 - 2982 - - - 490 - 0.9900000000000000000 - 1 - 89 - 2991 - - - 491 - 0.9900000000000000000 - 1 - 89 - 3000 - - - 492 - 0.9900000000000000000 - 1 - 90 - 3014 - - - 493 - 0.9900000000000000000 - 1 - 91 - 3015 - - - 494 - 0.9900000000000000000 - 1 - 91 - 3016 - - - 495 - 0.9900000000000000000 - 1 - 92 - 3018 - - - 496 - 0.9900000000000000000 - 1 - 92 - 3020 - - - 497 - 0.9900000000000000000 - 1 - 93 - 3022 - - - 498 - 0.9900000000000000000 - 1 - 93 - 3024 - - - 499 - 0.9900000000000000000 - 1 - 93 - 3026 - - - 500 - 0.9900000000000000000 - 1 - 93 - 3028 - - - 501 - 0.9900000000000000000 - 1 - 94 - 3032 - - - 502 - 0.9900000000000000000 - 1 - 94 - 3036 - - - 503 - 0.9900000000000000000 - 1 - 94 - 3040 - - - 504 - 0.9900000000000000000 - 1 - 94 - 3044 - - - 505 - 0.9900000000000000000 - 1 - 94 - 3048 - - - 506 - 0.9900000000000000000 - 1 - 94 - 3052 - - - 507 - 0.9900000000000000000 - 1 - 95 - 3058 - - - 508 - 0.9900000000000000000 - 1 - 95 - 3064 - - - 509 - 0.9900000000000000000 - 1 - 95 - 3070 - - - 510 - 0.9900000000000000000 - 1 - 95 - 3076 - - - 511 - 0.9900000000000000000 - 1 - 95 - 3082 - - - 512 - 0.9900000000000000000 - 1 - 95 - 3088 - - - 513 - 0.9900000000000000000 - 1 - 95 - 3094 - - - 514 - 0.9900000000000000000 - 1 - 95 - 3100 - - - 515 - 0.9900000000000000000 - 1 - 95 - 3106 - - - 516 - 0.9900000000000000000 - 1 - 96 - 3115 - - - 517 - 0.9900000000000000000 - 1 - 96 - 3124 - - - 518 - 0.9900000000000000000 - 1 - 96 - 3133 - - - 519 - 0.9900000000000000000 - 1 - 96 - 3142 - - - 520 - 0.9900000000000000000 - 1 - 96 - 3151 - - - 521 - 0.9900000000000000000 - 1 - 96 - 3160 - - - 522 - 1.9900000000000000000 - 1 - 96 - 3169 - - - 523 - 1.9900000000000000000 - 1 - 96 - 3178 - - - 524 - 1.9900000000000000000 - 1 - 96 - 3187 - - - 525 - 1.9900000000000000000 - 1 - 96 - 3196 - - - 526 - 1.9900000000000000000 - 1 - 96 - 3205 - - - 527 - 1.9900000000000000000 - 1 - 96 - 3214 - - - 528 - 1.9900000000000000000 - 1 - 96 - 3223 - - - 529 - 1.9900000000000000000 - 1 - 96 - 3232 - - - 530 - 1.9900000000000000000 - 1 - 97 - 3246 - - - 531 - 1.9900000000000000000 - 1 - 98 - 3247 - - - 532 - 1.9900000000000000000 - 1 - 98 - 3248 - - - 533 - 1.9900000000000000000 - 1 - 99 - 3250 - - - 534 - 1.9900000000000000000 - 1 - 99 - 3252 - - - 535 - 0.9900000000000000000 - 1 - 100 - 3254 - - - 536 - 0.9900000000000000000 - 1 - 100 - 3256 - - - 537 - 0.9900000000000000000 - 1 - 100 - 3258 - - - 538 - 0.9900000000000000000 - 1 - 100 - 3260 - - - 539 - 0.9900000000000000000 - 1 - 101 - 3264 - - - 540 - 0.9900000000000000000 - 1 - 101 - 3268 - - - 541 - 0.9900000000000000000 - 1 - 101 - 3272 - - - 542 - 0.9900000000000000000 - 1 - 101 - 3276 - - - 543 - 0.9900000000000000000 - 1 - 101 - 3280 - - - 544 - 0.9900000000000000000 - 1 - 101 - 3284 - - - 545 - 0.9900000000000000000 - 1 - 102 - 3290 - - - 546 - 0.9900000000000000000 - 1 - 102 - 3296 - - - 547 - 0.9900000000000000000 - 1 - 102 - 3302 - - - 548 - 0.9900000000000000000 - 1 - 102 - 3308 - - - 549 - 0.9900000000000000000 - 1 - 102 - 3314 - - - 550 - 0.9900000000000000000 - 1 - 102 - 3320 - - - 551 - 0.9900000000000000000 - 1 - 102 - 3326 - - - 552 - 0.9900000000000000000 - 1 - 102 - 3332 - - - 553 - 1.9900000000000000000 - 1 - 102 - 3338 - - - 554 - 1.9900000000000000000 - 1 - 103 - 3347 - - - 555 - 0.9900000000000000000 - 1 - 103 - 3356 - - - 556 - 0.9900000000000000000 - 1 - 103 - 3365 - - - 557 - 0.9900000000000000000 - 1 - 103 - 3374 - - - 558 - 0.9900000000000000000 - 1 - 103 - 3383 - - - 559 - 0.9900000000000000000 - 1 - 103 - 3392 - - - 560 - 0.9900000000000000000 - 1 - 103 - 3401 - - - 561 - 0.9900000000000000000 - 1 - 103 - 3410 - - - 562 - 0.9900000000000000000 - 1 - 103 - 3419 - - - 563 - 1.9900000000000000000 - 1 - 103 - 3428 - - - 564 - 0.9900000000000000000 - 1 - 103 - 3437 - - - 565 - 0.9900000000000000000 - 1 - 103 - 3446 - - - 566 - 0.9900000000000000000 - 1 - 103 - 3455 - - - 567 - 0.9900000000000000000 - 1 - 103 - 3464 - - - 568 - 0.9900000000000000000 - 1 - 104 - 3478 - - - 569 - 0.9900000000000000000 - 1 - 105 - 3479 - - - 570 - 0.9900000000000000000 - 1 - 105 - 3480 - - - 571 - 0.9900000000000000000 - 1 - 106 - 3482 - - - 572 - 0.9900000000000000000 - 1 - 106 - 3484 - - - 573 - 0.9900000000000000000 - 1 - 107 - 3486 - - - 574 - 0.9900000000000000000 - 1 - 107 - 3488 - - - 575 - 0.9900000000000000000 - 1 - 107 - 3490 - - - 576 - 0.9900000000000000000 - 1 - 107 - 3492 - - - 577 - 0.9900000000000000000 - 1 - 108 - 3496 - - - 578 - 0.9900000000000000000 - 1 - 108 - 3500 - - - 579 - 0.9900000000000000000 - 1 - 108 - 1 - - - 580 - 0.9900000000000000000 - 1 - 108 - 5 - - - 581 - 0.9900000000000000000 - 1 - 108 - 9 - - - 582 - 0.9900000000000000000 - 1 - 108 - 13 - - - 583 - 0.9900000000000000000 - 1 - 109 - 19 - - - 584 - 0.9900000000000000000 - 1 - 109 - 25 - - - 585 - 0.9900000000000000000 - 1 - 109 - 31 - - - 586 - 0.9900000000000000000 - 1 - 109 - 37 - - - 587 - 0.9900000000000000000 - 1 - 109 - 43 - - - 588 - 0.9900000000000000000 - 1 - 109 - 49 - - - 589 - 0.9900000000000000000 - 1 - 109 - 55 - - - 590 - 0.9900000000000000000 - 1 - 109 - 61 - - - 591 - 0.9900000000000000000 - 1 - 109 - 67 - - - 592 - 0.9900000000000000000 - 1 - 110 - 76 - - - 593 - 0.9900000000000000000 - 1 - 110 - 85 - - - 594 - 0.9900000000000000000 - 1 - 110 - 94 - - - 595 - 0.9900000000000000000 - 1 - 110 - 103 - - - 596 - 0.9900000000000000000 - 1 - 110 - 112 - - - 597 - 0.9900000000000000000 - 1 - 110 - 121 - - - 598 - 0.9900000000000000000 - 1 - 110 - 130 - - - 599 - 0.9900000000000000000 - 1 - 110 - 139 - - - 600 - 0.9900000000000000000 - 1 - 110 - 148 - - - 601 - 0.9900000000000000000 - 1 - 110 - 157 - - - 602 - 0.9900000000000000000 - 1 - 110 - 166 - - - 603 - 0.9900000000000000000 - 1 - 110 - 175 - - - 604 - 0.9900000000000000000 - 1 - 110 - 184 - - - 605 - 0.9900000000000000000 - 1 - 110 - 193 - - - 606 - 0.9900000000000000000 - 1 - 111 - 207 - - - 607 - 0.9900000000000000000 - 1 - 112 - 208 - - - 608 - 0.9900000000000000000 - 1 - 112 - 209 - - - 609 - 0.9900000000000000000 - 1 - 113 - 211 - - - 610 - 0.9900000000000000000 - 1 - 113 - 213 - - - 611 - 0.9900000000000000000 - 1 - 114 - 215 - - - 612 - 0.9900000000000000000 - 1 - 114 - 217 - - - 613 - 0.9900000000000000000 - 1 - 114 - 219 - - - 614 - 0.9900000000000000000 - 1 - 114 - 221 - - - 615 - 0.9900000000000000000 - 1 - 115 - 225 - - - 616 - 0.9900000000000000000 - 1 - 115 - 229 - - - 617 - 0.9900000000000000000 - 1 - 115 - 233 - - - 618 - 0.9900000000000000000 - 1 - 115 - 237 - - - 619 - 0.9900000000000000000 - 1 - 115 - 241 - - - 620 - 0.9900000000000000000 - 1 - 115 - 245 - - - 621 - 0.9900000000000000000 - 1 - 116 - 251 - - - 622 - 0.9900000000000000000 - 1 - 116 - 257 - - - 623 - 0.9900000000000000000 - 1 - 116 - 263 - - - 624 - 0.9900000000000000000 - 1 - 116 - 269 - - - 625 - 0.9900000000000000000 - 1 - 116 - 275 - - - 626 - 0.9900000000000000000 - 1 - 116 - 281 - - - 627 - 0.9900000000000000000 - 1 - 116 - 287 - - - 628 - 0.9900000000000000000 - 1 - 116 - 293 - - - 629 - 0.9900000000000000000 - 1 - 116 - 299 - - - 630 - 0.9900000000000000000 - 1 - 117 - 308 - - - 631 - 0.9900000000000000000 - 1 - 117 - 317 - - - 632 - 0.9900000000000000000 - 1 - 117 - 326 - - - 633 - 0.9900000000000000000 - 1 - 117 - 335 - - - 634 - 0.9900000000000000000 - 1 - 117 - 344 - - - 635 - 0.9900000000000000000 - 1 - 117 - 353 - - - 636 - 0.9900000000000000000 - 1 - 117 - 362 - - - 637 - 0.9900000000000000000 - 1 - 117 - 371 - - - 638 - 0.9900000000000000000 - 1 - 117 - 380 - - - 639 - 0.9900000000000000000 - 1 - 117 - 389 - - - 640 - 0.9900000000000000000 - 1 - 117 - 398 - - - 641 - 0.9900000000000000000 - 1 - 117 - 407 - - - 642 - 0.9900000000000000000 - 1 - 117 - 416 - - - 643 - 0.9900000000000000000 - 1 - 117 - 425 - - - 644 - 0.9900000000000000000 - 1 - 118 - 439 - - - 645 - 0.9900000000000000000 - 1 - 119 - 440 - - - 646 - 0.9900000000000000000 - 1 - 119 - 441 - - - 647 - 0.9900000000000000000 - 1 - 120 - 443 - - - 648 - 0.9900000000000000000 - 1 - 120 - 445 - - - 649 - 0.9900000000000000000 - 1 - 121 - 447 - - - 650 - 0.9900000000000000000 - 1 - 121 - 449 - - - 651 - 0.9900000000000000000 - 1 - 121 - 451 - - - 652 - 0.9900000000000000000 - 1 - 121 - 453 - - - 653 - 0.9900000000000000000 - 1 - 122 - 457 - - - 654 - 0.9900000000000000000 - 1 - 122 - 461 - - - 655 - 0.9900000000000000000 - 1 - 122 - 465 - - - 656 - 0.9900000000000000000 - 1 - 122 - 469 - - - 657 - 0.9900000000000000000 - 1 - 122 - 473 - - - 658 - 0.9900000000000000000 - 1 - 122 - 477 - - - 659 - 0.9900000000000000000 - 1 - 123 - 483 - - - 660 - 0.9900000000000000000 - 1 - 123 - 489 - - - 661 - 0.9900000000000000000 - 1 - 123 - 495 - - - 662 - 0.9900000000000000000 - 1 - 123 - 501 - - - 663 - 0.9900000000000000000 - 1 - 123 - 507 - - - 664 - 0.9900000000000000000 - 1 - 123 - 513 - - - 665 - 0.9900000000000000000 - 1 - 123 - 519 - - - 666 - 0.9900000000000000000 - 1 - 123 - 525 - - - 667 - 0.9900000000000000000 - 1 - 123 - 531 - - - 668 - 0.9900000000000000000 - 1 - 124 - 540 - - - 669 - 0.9900000000000000000 - 1 - 124 - 549 - - - 670 - 0.9900000000000000000 - 1 - 124 - 558 - - - 671 - 0.9900000000000000000 - 1 - 124 - 567 - - - 672 - 0.9900000000000000000 - 1 - 124 - 576 - - - 673 - 0.9900000000000000000 - 1 - 124 - 585 - - - 674 - 0.9900000000000000000 - 1 - 124 - 594 - - - 675 - 0.9900000000000000000 - 1 - 124 - 603 - - - 676 - 0.9900000000000000000 - 1 - 124 - 612 - - - 677 - 0.9900000000000000000 - 1 - 124 - 621 - - - 678 - 0.9900000000000000000 - 1 - 124 - 630 - - - 679 - 0.9900000000000000000 - 1 - 124 - 639 - - - 680 - 0.9900000000000000000 - 1 - 124 - 648 - - - 681 - 0.9900000000000000000 - 1 - 124 - 657 - - - 682 - 0.9900000000000000000 - 1 - 125 - 671 - - - 683 - 0.9900000000000000000 - 1 - 126 - 672 - - - 684 - 0.9900000000000000000 - 1 - 126 - 673 - - - 685 - 0.9900000000000000000 - 1 - 127 - 675 - - - 686 - 0.9900000000000000000 - 1 - 127 - 677 - - - 687 - 0.9900000000000000000 - 1 - 128 - 679 - - - 688 - 0.9900000000000000000 - 1 - 128 - 681 - - - 689 - 0.9900000000000000000 - 1 - 128 - 683 - - - 690 - 0.9900000000000000000 - 1 - 128 - 685 - - - 691 - 0.9900000000000000000 - 1 - 129 - 689 - - - 692 - 0.9900000000000000000 - 1 - 129 - 693 - - - 693 - 0.9900000000000000000 - 1 - 129 - 697 - - - 694 - 0.9900000000000000000 - 1 - 129 - 701 - - - 695 - 0.9900000000000000000 - 1 - 129 - 705 - - - 696 - 0.9900000000000000000 - 1 - 129 - 709 - - - 697 - 0.9900000000000000000 - 1 - 130 - 715 - - - 698 - 0.9900000000000000000 - 1 - 130 - 721 - - - 699 - 0.9900000000000000000 - 1 - 130 - 727 - - - 700 - 0.9900000000000000000 - 1 - 130 - 733 - - - 701 - 0.9900000000000000000 - 1 - 130 - 739 - - - 702 - 0.9900000000000000000 - 1 - 130 - 745 - - - 703 - 0.9900000000000000000 - 1 - 130 - 751 - - - 704 - 0.9900000000000000000 - 1 - 130 - 757 - - - 705 - 0.9900000000000000000 - 1 - 130 - 763 - - - 706 - 0.9900000000000000000 - 1 - 131 - 772 - - - 707 - 0.9900000000000000000 - 1 - 131 - 781 - - - 708 - 0.9900000000000000000 - 1 - 131 - 790 - - - 709 - 0.9900000000000000000 - 1 - 131 - 799 - - - 710 - 0.9900000000000000000 - 1 - 131 - 808 - - - 711 - 0.9900000000000000000 - 1 - 131 - 817 - - - 712 - 0.9900000000000000000 - 1 - 131 - 826 - - - 713 - 0.9900000000000000000 - 1 - 131 - 835 - - - 714 - 0.9900000000000000000 - 1 - 131 - 844 - - - 715 - 0.9900000000000000000 - 1 - 131 - 853 - - - 716 - 0.9900000000000000000 - 1 - 131 - 862 - - - 717 - 0.9900000000000000000 - 1 - 131 - 871 - - - 718 - 0.9900000000000000000 - 1 - 131 - 880 - - - 719 - 0.9900000000000000000 - 1 - 131 - 889 - - - 720 - 0.9900000000000000000 - 1 - 132 - 903 - - - 721 - 0.9900000000000000000 - 1 - 133 - 904 - - - 722 - 0.9900000000000000000 - 1 - 133 - 905 - - - 723 - 0.9900000000000000000 - 1 - 134 - 907 - - - 724 - 0.9900000000000000000 - 1 - 134 - 909 - - - 725 - 0.9900000000000000000 - 1 - 135 - 911 - - - 726 - 0.9900000000000000000 - 1 - 135 - 913 - - - 727 - 0.9900000000000000000 - 1 - 135 - 915 - - - 728 - 0.9900000000000000000 - 1 - 135 - 917 - - - 729 - 0.9900000000000000000 - 1 - 136 - 921 - - - 730 - 0.9900000000000000000 - 1 - 136 - 925 - - - 731 - 0.9900000000000000000 - 1 - 136 - 929 - - - 732 - 0.9900000000000000000 - 1 - 136 - 933 - - - 733 - 0.9900000000000000000 - 1 - 136 - 937 - - - 734 - 0.9900000000000000000 - 1 - 136 - 941 - - - 735 - 0.9900000000000000000 - 1 - 137 - 947 - - - 736 - 0.9900000000000000000 - 1 - 137 - 953 - - - 737 - 0.9900000000000000000 - 1 - 137 - 959 - - - 738 - 0.9900000000000000000 - 1 - 137 - 965 - - - 739 - 0.9900000000000000000 - 1 - 137 - 971 - - - 740 - 0.9900000000000000000 - 1 - 137 - 977 - - - 741 - 0.9900000000000000000 - 1 - 137 - 983 - - - 742 - 0.9900000000000000000 - 1 - 137 - 989 - - - 743 - 0.9900000000000000000 - 1 - 137 - 995 - - - 744 - 0.9900000000000000000 - 1 - 138 - 1004 - - - 745 - 0.9900000000000000000 - 1 - 138 - 1013 - - - 746 - 0.9900000000000000000 - 1 - 138 - 1022 - - - 747 - 0.9900000000000000000 - 1 - 138 - 1031 - - - 748 - 0.9900000000000000000 - 1 - 138 - 1040 - - - 749 - 0.9900000000000000000 - 1 - 138 - 1049 - - - 750 - 0.9900000000000000000 - 1 - 138 - 1058 - - - 751 - 0.9900000000000000000 - 1 - 138 - 1067 - - - 752 - 0.9900000000000000000 - 1 - 138 - 1076 - - - 753 - 0.9900000000000000000 - 1 - 138 - 1085 - - - 754 - 0.9900000000000000000 - 1 - 138 - 1094 - - - 755 - 0.9900000000000000000 - 1 - 138 - 1103 - - - 756 - 0.9900000000000000000 - 1 - 138 - 1112 - - - 757 - 0.9900000000000000000 - 1 - 138 - 1121 - - - 758 - 0.9900000000000000000 - 1 - 139 - 1135 - - - 759 - 0.9900000000000000000 - 1 - 140 - 1136 - - - 760 - 0.9900000000000000000 - 1 - 140 - 1137 - - - 761 - 0.9900000000000000000 - 1 - 141 - 1139 - - - 762 - 0.9900000000000000000 - 1 - 141 - 1141 - - - 763 - 0.9900000000000000000 - 1 - 142 - 1143 - - - 764 - 0.9900000000000000000 - 1 - 142 - 1145 - - - 765 - 0.9900000000000000000 - 1 - 142 - 1147 - - - 766 - 0.9900000000000000000 - 1 - 142 - 1149 - - - 767 - 0.9900000000000000000 - 1 - 143 - 1153 - - - 768 - 0.9900000000000000000 - 1 - 143 - 1157 - - - 769 - 0.9900000000000000000 - 1 - 143 - 1161 - - - 770 - 0.9900000000000000000 - 1 - 143 - 1165 - - - 771 - 0.9900000000000000000 - 1 - 143 - 1169 - - - 772 - 0.9900000000000000000 - 1 - 143 - 1173 - - - 773 - 0.9900000000000000000 - 1 - 144 - 1179 - - - 774 - 0.9900000000000000000 - 1 - 144 - 1185 - - - 775 - 0.9900000000000000000 - 1 - 144 - 1191 - - - 776 - 0.9900000000000000000 - 1 - 144 - 1197 - - - 777 - 0.9900000000000000000 - 1 - 144 - 1203 - - - 778 - 0.9900000000000000000 - 1 - 144 - 1209 - - - 779 - 0.9900000000000000000 - 1 - 144 - 1215 - - - 780 - 0.9900000000000000000 - 1 - 144 - 1221 - - - 781 - 0.9900000000000000000 - 1 - 144 - 1227 - - - 782 - 0.9900000000000000000 - 1 - 145 - 1236 - - - 783 - 0.9900000000000000000 - 1 - 145 - 1245 - - - 784 - 0.9900000000000000000 - 1 - 145 - 1254 - - - 785 - 0.9900000000000000000 - 1 - 145 - 1263 - - - 786 - 0.9900000000000000000 - 1 - 145 - 1272 - - - 787 - 0.9900000000000000000 - 1 - 145 - 1281 - - - 788 - 0.9900000000000000000 - 1 - 145 - 1290 - - - 789 - 0.9900000000000000000 - 1 - 145 - 1299 - - - 790 - 0.9900000000000000000 - 1 - 145 - 1308 - - - 791 - 0.9900000000000000000 - 1 - 145 - 1317 - - - 792 - 0.9900000000000000000 - 1 - 145 - 1326 - - - 793 - 0.9900000000000000000 - 1 - 145 - 1335 - - - 794 - 0.9900000000000000000 - 1 - 145 - 1344 - - - 795 - 0.9900000000000000000 - 1 - 145 - 1353 - - - 796 - 0.9900000000000000000 - 1 - 146 - 1367 - - - 797 - 0.9900000000000000000 - 1 - 147 - 1368 - - - 798 - 0.9900000000000000000 - 1 - 147 - 1369 - - - 799 - 0.9900000000000000000 - 1 - 148 - 1371 - - - 800 - 0.9900000000000000000 - 1 - 148 - 1373 - - - 801 - 0.9900000000000000000 - 1 - 149 - 1375 - - - 802 - 0.9900000000000000000 - 1 - 149 - 1377 - - - 803 - 0.9900000000000000000 - 1 - 149 - 1379 - - - 804 - 0.9900000000000000000 - 1 - 149 - 1381 - - - 805 - 0.9900000000000000000 - 1 - 150 - 1385 - - - 806 - 0.9900000000000000000 - 1 - 150 - 1389 - - - 807 - 0.9900000000000000000 - 1 - 150 - 1393 - - - 808 - 0.9900000000000000000 - 1 - 150 - 1397 - - - 809 - 0.9900000000000000000 - 1 - 150 - 1401 - - - 810 - 0.9900000000000000000 - 1 - 150 - 1405 - - - 811 - 0.9900000000000000000 - 1 - 151 - 1411 - - - 812 - 0.9900000000000000000 - 1 - 151 - 1417 - - - 813 - 0.9900000000000000000 - 1 - 151 - 1423 - - - 814 - 0.9900000000000000000 - 1 - 151 - 1429 - - - 815 - 0.9900000000000000000 - 1 - 151 - 1435 - - - 816 - 0.9900000000000000000 - 1 - 151 - 1441 - - - 817 - 0.9900000000000000000 - 1 - 151 - 1447 - - - 818 - 0.9900000000000000000 - 1 - 151 - 1453 - - - 819 - 0.9900000000000000000 - 1 - 151 - 1459 - - - 820 - 0.9900000000000000000 - 1 - 152 - 1468 - - - 821 - 0.9900000000000000000 - 1 - 152 - 1477 - - - 822 - 0.9900000000000000000 - 1 - 152 - 1486 - - - 823 - 0.9900000000000000000 - 1 - 152 - 1495 - - - 824 - 0.9900000000000000000 - 1 - 152 - 1504 - - - 825 - 0.9900000000000000000 - 1 - 152 - 1513 - - - 826 - 0.9900000000000000000 - 1 - 152 - 1522 - - - 827 - 0.9900000000000000000 - 1 - 152 - 1531 - - - 828 - 0.9900000000000000000 - 1 - 152 - 1540 - - - 829 - 0.9900000000000000000 - 1 - 152 - 1549 - - - 830 - 0.9900000000000000000 - 1 - 152 - 1558 - - - 831 - 0.9900000000000000000 - 1 - 152 - 1567 - - - 832 - 0.9900000000000000000 - 1 - 152 - 1576 - - - 833 - 0.9900000000000000000 - 1 - 152 - 1585 - - - 834 - 0.9900000000000000000 - 1 - 153 - 1599 - - - 835 - 0.9900000000000000000 - 1 - 154 - 1600 - - - 836 - 0.9900000000000000000 - 1 - 154 - 1601 - - - 837 - 0.9900000000000000000 - 1 - 155 - 1603 - - - 838 - 0.9900000000000000000 - 1 - 155 - 1605 - - - 839 - 0.9900000000000000000 - 1 - 156 - 1607 - - - 840 - 0.9900000000000000000 - 1 - 156 - 1609 - - - 841 - 0.9900000000000000000 - 1 - 156 - 1611 - - - 842 - 0.9900000000000000000 - 1 - 156 - 1613 - - - 843 - 0.9900000000000000000 - 1 - 157 - 1617 - - - 844 - 0.9900000000000000000 - 1 - 157 - 1621 - - - 845 - 0.9900000000000000000 - 1 - 157 - 1625 - - - 846 - 0.9900000000000000000 - 1 - 157 - 1629 - - - 847 - 0.9900000000000000000 - 1 - 157 - 1633 - - - 848 - 0.9900000000000000000 - 1 - 157 - 1637 - - - 849 - 0.9900000000000000000 - 1 - 158 - 1643 - - - 850 - 0.9900000000000000000 - 1 - 158 - 1649 - - - 851 - 0.9900000000000000000 - 1 - 158 - 1655 - - - 852 - 0.9900000000000000000 - 1 - 158 - 1661 - - - 853 - 0.9900000000000000000 - 1 - 158 - 1667 - - - 854 - 0.9900000000000000000 - 1 - 158 - 1673 - - - 855 - 0.9900000000000000000 - 1 - 158 - 1679 - - - 856 - 0.9900000000000000000 - 1 - 158 - 1685 - - - 857 - 0.9900000000000000000 - 1 - 158 - 1691 - - - 858 - 0.9900000000000000000 - 1 - 159 - 1700 - - - 859 - 0.9900000000000000000 - 1 - 159 - 1709 - - - 860 - 0.9900000000000000000 - 1 - 159 - 1718 - - - 861 - 0.9900000000000000000 - 1 - 159 - 1727 - - - 862 - 0.9900000000000000000 - 1 - 159 - 1736 - - - 863 - 0.9900000000000000000 - 1 - 159 - 1745 - - - 864 - 0.9900000000000000000 - 1 - 159 - 1754 - - - 865 - 0.9900000000000000000 - 1 - 159 - 1763 - - - 866 - 0.9900000000000000000 - 1 - 159 - 1772 - - - 867 - 0.9900000000000000000 - 1 - 159 - 1781 - - - 868 - 0.9900000000000000000 - 1 - 159 - 1790 - - - 869 - 0.9900000000000000000 - 1 - 159 - 1799 - - - 870 - 0.9900000000000000000 - 1 - 159 - 1808 - - - 871 - 0.9900000000000000000 - 1 - 159 - 1817 - - - 872 - 0.9900000000000000000 - 1 - 160 - 1831 - - - 873 - 0.9900000000000000000 - 1 - 161 - 1832 - - - 874 - 0.9900000000000000000 - 1 - 161 - 1833 - - - 875 - 0.9900000000000000000 - 1 - 162 - 1835 - - - 876 - 0.9900000000000000000 - 1 - 162 - 1837 - - - 877 - 0.9900000000000000000 - 1 - 163 - 1839 - - - 878 - 0.9900000000000000000 - 1 - 163 - 1841 - - - 879 - 0.9900000000000000000 - 1 - 163 - 1843 - - - 880 - 0.9900000000000000000 - 1 - 163 - 1845 - - - 881 - 0.9900000000000000000 - 1 - 164 - 1849 - - - 882 - 0.9900000000000000000 - 1 - 164 - 1853 - - - 883 - 0.9900000000000000000 - 1 - 164 - 1857 - - - 884 - 0.9900000000000000000 - 1 - 164 - 1861 - - - 885 - 0.9900000000000000000 - 1 - 164 - 1865 - - - 886 - 0.9900000000000000000 - 1 - 164 - 1869 - - - 887 - 0.9900000000000000000 - 1 - 165 - 1875 - - - 888 - 0.9900000000000000000 - 1 - 165 - 1881 - - - 889 - 0.9900000000000000000 - 1 - 165 - 1887 - - - 890 - 0.9900000000000000000 - 1 - 165 - 1893 - - - 891 - 0.9900000000000000000 - 1 - 165 - 1899 - - - 892 - 0.9900000000000000000 - 1 - 165 - 1905 - - - 893 - 0.9900000000000000000 - 1 - 165 - 1911 - - - 894 - 0.9900000000000000000 - 1 - 165 - 1917 - - - 895 - 0.9900000000000000000 - 1 - 165 - 1923 - - - 896 - 0.9900000000000000000 - 1 - 166 - 1932 - - - 897 - 0.9900000000000000000 - 1 - 166 - 1941 - - - 898 - 0.9900000000000000000 - 1 - 166 - 1950 - - - 899 - 0.9900000000000000000 - 1 - 166 - 1959 - - - 900 - 0.9900000000000000000 - 1 - 166 - 1968 - - - 901 - 0.9900000000000000000 - 1 - 166 - 1977 - - - 902 - 0.9900000000000000000 - 1 - 166 - 1986 - - - 903 - 0.9900000000000000000 - 1 - 166 - 1995 - - - 904 - 0.9900000000000000000 - 1 - 166 - 2004 - - - 905 - 0.9900000000000000000 - 1 - 166 - 2013 - - - 906 - 0.9900000000000000000 - 1 - 166 - 2022 - - - 907 - 0.9900000000000000000 - 1 - 166 - 2031 - - - 908 - 0.9900000000000000000 - 1 - 166 - 2040 - - - 909 - 0.9900000000000000000 - 1 - 166 - 2049 - - - 910 - 0.9900000000000000000 - 1 - 167 - 2063 - - - 911 - 0.9900000000000000000 - 1 - 168 - 2064 - - - 912 - 0.9900000000000000000 - 1 - 168 - 2065 - - - 913 - 0.9900000000000000000 - 1 - 169 - 2067 - - - 914 - 0.9900000000000000000 - 1 - 169 - 2069 - - - 915 - 0.9900000000000000000 - 1 - 170 - 2071 - - - 916 - 0.9900000000000000000 - 1 - 170 - 2073 - - - 917 - 0.9900000000000000000 - 1 - 170 - 2075 - - - 918 - 0.9900000000000000000 - 1 - 170 - 2077 - - - 919 - 0.9900000000000000000 - 1 - 171 - 2081 - - - 920 - 0.9900000000000000000 - 1 - 171 - 2085 - - - 921 - 0.9900000000000000000 - 1 - 171 - 2089 - - - 922 - 0.9900000000000000000 - 1 - 171 - 2093 - - - 923 - 0.9900000000000000000 - 1 - 171 - 2097 - - - 924 - 0.9900000000000000000 - 1 - 171 - 2101 - - - 925 - 0.9900000000000000000 - 1 - 172 - 2107 - - - 926 - 0.9900000000000000000 - 1 - 172 - 2113 - - - 927 - 0.9900000000000000000 - 1 - 172 - 2119 - - - 928 - 0.9900000000000000000 - 1 - 172 - 2125 - - - 929 - 0.9900000000000000000 - 1 - 172 - 2131 - - - 930 - 0.9900000000000000000 - 1 - 172 - 2137 - - - 931 - 0.9900000000000000000 - 1 - 172 - 2143 - - - 932 - 0.9900000000000000000 - 1 - 172 - 2149 - - - 933 - 0.9900000000000000000 - 1 - 172 - 2155 - - - 934 - 0.9900000000000000000 - 1 - 173 - 2164 - - - 935 - 0.9900000000000000000 - 1 - 173 - 2173 - - - 936 - 0.9900000000000000000 - 1 - 173 - 2182 - - - 937 - 0.9900000000000000000 - 1 - 173 - 2191 - - - 938 - 0.9900000000000000000 - 1 - 173 - 2200 - - - 939 - 0.9900000000000000000 - 1 - 173 - 2209 - - - 940 - 0.9900000000000000000 - 1 - 173 - 2218 - - - 941 - 0.9900000000000000000 - 1 - 173 - 2227 - - - 942 - 0.9900000000000000000 - 1 - 173 - 2236 - - - 943 - 0.9900000000000000000 - 1 - 173 - 2245 - - - 944 - 0.9900000000000000000 - 1 - 173 - 2254 - - - 945 - 0.9900000000000000000 - 1 - 173 - 2263 - - - 946 - 0.9900000000000000000 - 1 - 173 - 2272 - - - 947 - 0.9900000000000000000 - 1 - 173 - 2281 - - - 948 - 0.9900000000000000000 - 1 - 174 - 2295 - - - 949 - 0.9900000000000000000 - 1 - 175 - 2296 - - - 950 - 0.9900000000000000000 - 1 - 175 - 2297 - - - 951 - 0.9900000000000000000 - 1 - 176 - 2299 - - - 952 - 0.9900000000000000000 - 1 - 176 - 2301 - - - 953 - 0.9900000000000000000 - 1 - 177 - 2303 - - - 954 - 0.9900000000000000000 - 1 - 177 - 2305 - - - 955 - 0.9900000000000000000 - 1 - 177 - 2307 - - - 956 - 0.9900000000000000000 - 1 - 177 - 2309 - - - 957 - 0.9900000000000000000 - 1 - 178 - 2313 - - - 958 - 0.9900000000000000000 - 1 - 178 - 2317 - - - 959 - 0.9900000000000000000 - 1 - 178 - 2321 - - - 960 - 0.9900000000000000000 - 1 - 178 - 2325 - - - 961 - 0.9900000000000000000 - 1 - 178 - 2329 - - - 962 - 0.9900000000000000000 - 1 - 178 - 2333 - - - 963 - 0.9900000000000000000 - 1 - 179 - 2339 - - - 964 - 0.9900000000000000000 - 1 - 179 - 2345 - - - 965 - 0.9900000000000000000 - 1 - 179 - 2351 - - - 966 - 0.9900000000000000000 - 1 - 179 - 2357 - - - 967 - 0.9900000000000000000 - 1 - 179 - 2363 - - - 968 - 0.9900000000000000000 - 1 - 179 - 2369 - - - 969 - 0.9900000000000000000 - 1 - 179 - 2375 - - - 970 - 0.9900000000000000000 - 1 - 179 - 2381 - - - 971 - 0.9900000000000000000 - 1 - 179 - 2387 - - - 972 - 0.9900000000000000000 - 1 - 180 - 2396 - - - 973 - 0.9900000000000000000 - 1 - 180 - 2405 - - - 974 - 0.9900000000000000000 - 1 - 180 - 2414 - - - 975 - 0.9900000000000000000 - 1 - 180 - 2423 - - - 976 - 0.9900000000000000000 - 1 - 180 - 2432 - - - 977 - 0.9900000000000000000 - 1 - 180 - 2441 - - - 978 - 0.9900000000000000000 - 1 - 180 - 2450 - - - 979 - 0.9900000000000000000 - 1 - 180 - 2459 - - - 980 - 0.9900000000000000000 - 1 - 180 - 2468 - - - 981 - 0.9900000000000000000 - 1 - 180 - 2477 - - - 982 - 0.9900000000000000000 - 1 - 180 - 2486 - - - 983 - 0.9900000000000000000 - 1 - 180 - 2495 - - - 984 - 0.9900000000000000000 - 1 - 180 - 2504 - - - 985 - 0.9900000000000000000 - 1 - 180 - 2513 - - - 986 - 0.9900000000000000000 - 1 - 181 - 2527 - - - 987 - 0.9900000000000000000 - 1 - 182 - 2528 - - - 988 - 0.9900000000000000000 - 1 - 182 - 2529 - - - 989 - 0.9900000000000000000 - 1 - 183 - 2531 - - - 990 - 0.9900000000000000000 - 1 - 183 - 2533 - - - 991 - 0.9900000000000000000 - 1 - 184 - 2535 - - - 992 - 0.9900000000000000000 - 1 - 184 - 2537 - - - 993 - 0.9900000000000000000 - 1 - 184 - 2539 - - - 994 - 0.9900000000000000000 - 1 - 184 - 2541 - - - 995 - 0.9900000000000000000 - 1 - 185 - 2545 - - - 996 - 0.9900000000000000000 - 1 - 185 - 2549 - - - 997 - 0.9900000000000000000 - 1 - 185 - 2553 - - - 998 - 0.9900000000000000000 - 1 - 185 - 2557 - - - 999 - 0.9900000000000000000 - 1 - 185 - 2561 - - - 1000 - 0.9900000000000000000 - 1 - 185 - 2565 - - - 1001 - 0.9900000000000000000 - 1 - 186 - 2571 - - - 1002 - 0.9900000000000000000 - 1 - 186 - 2577 - - - 1003 - 0.9900000000000000000 - 1 - 186 - 2583 - - - 1004 - 0.9900000000000000000 - 1 - 186 - 2589 - - - 1005 - 0.9900000000000000000 - 1 - 186 - 2595 - - - 1006 - 0.9900000000000000000 - 1 - 186 - 2601 - - - 1007 - 0.9900000000000000000 - 1 - 186 - 2607 - - - 1008 - 0.9900000000000000000 - 1 - 186 - 2613 - - - 1009 - 0.9900000000000000000 - 1 - 186 - 2619 - - - 1010 - 0.9900000000000000000 - 1 - 187 - 2628 - - - 1011 - 0.9900000000000000000 - 1 - 187 - 2637 - - - 1012 - 0.9900000000000000000 - 1 - 187 - 2646 - - - 1013 - 0.9900000000000000000 - 1 - 187 - 2655 - - - 1014 - 0.9900000000000000000 - 1 - 187 - 2664 - - - 1015 - 0.9900000000000000000 - 1 - 187 - 2673 - - - 1016 - 0.9900000000000000000 - 1 - 187 - 2682 - - - 1017 - 0.9900000000000000000 - 1 - 187 - 2691 - - - 1018 - 0.9900000000000000000 - 1 - 187 - 2700 - - - 1019 - 0.9900000000000000000 - 1 - 187 - 2709 - - - 1020 - 0.9900000000000000000 - 1 - 187 - 2718 - - - 1021 - 0.9900000000000000000 - 1 - 187 - 2727 - - - 1022 - 0.9900000000000000000 - 1 - 187 - 2736 - - - 1023 - 0.9900000000000000000 - 1 - 187 - 2745 - - - 1024 - 0.9900000000000000000 - 1 - 188 - 2759 - - - 1025 - 0.9900000000000000000 - 1 - 189 - 2760 - - - 1026 - 0.9900000000000000000 - 1 - 189 - 2761 - - - 1027 - 0.9900000000000000000 - 1 - 190 - 2763 - - - 1028 - 0.9900000000000000000 - 1 - 190 - 2765 - - - 1029 - 0.9900000000000000000 - 1 - 191 - 2767 - - - 1030 - 0.9900000000000000000 - 1 - 191 - 2769 - - - 1031 - 0.9900000000000000000 - 1 - 191 - 2771 - - - 1032 - 0.9900000000000000000 - 1 - 191 - 2773 - - - 1033 - 0.9900000000000000000 - 1 - 192 - 2777 - - - 1034 - 0.9900000000000000000 - 1 - 192 - 2781 - - - 1035 - 0.9900000000000000000 - 1 - 192 - 2785 - - - 1036 - 0.9900000000000000000 - 1 - 192 - 2789 - - - 1037 - 0.9900000000000000000 - 1 - 192 - 2793 - - - 1038 - 0.9900000000000000000 - 1 - 192 - 2797 - - - 1039 - 0.9900000000000000000 - 1 - 193 - 2803 - - - 1040 - 0.9900000000000000000 - 1 - 193 - 2809 - - - 1041 - 0.9900000000000000000 - 1 - 193 - 2815 - - - 1042 - 1.9900000000000000000 - 1 - 193 - 2821 - - - 1043 - 1.9900000000000000000 - 1 - 193 - 2827 - - - 1044 - 1.9900000000000000000 - 1 - 193 - 2833 - - - 1045 - 1.9900000000000000000 - 1 - 193 - 2839 - - - 1046 - 1.9900000000000000000 - 1 - 193 - 2845 - - - 1047 - 1.9900000000000000000 - 1 - 193 - 2851 - - - 1048 - 1.9900000000000000000 - 1 - 194 - 2860 - - - 1049 - 1.9900000000000000000 - 1 - 194 - 2869 - - - 1050 - 1.9900000000000000000 - 1 - 194 - 2878 - - - 1051 - 1.9900000000000000000 - 1 - 194 - 2887 - - - 1052 - 1.9900000000000000000 - 1 - 194 - 2896 - - - 1053 - 1.9900000000000000000 - 1 - 194 - 2905 - - - 1054 - 1.9900000000000000000 - 1 - 194 - 2914 - - - 1055 - 1.9900000000000000000 - 1 - 194 - 2923 - - - 1056 - 0.9900000000000000000 - 1 - 194 - 2932 - - - 1057 - 0.9900000000000000000 - 1 - 194 - 2941 - - - 1058 - 0.9900000000000000000 - 1 - 194 - 2950 - - - 1059 - 0.9900000000000000000 - 1 - 194 - 2959 - - - 1060 - 0.9900000000000000000 - 1 - 194 - 2968 - - - 1061 - 0.9900000000000000000 - 1 - 194 - 2977 - - - 1062 - 0.9900000000000000000 - 1 - 195 - 2991 - - - 1063 - 0.9900000000000000000 - 1 - 196 - 2992 - - - 1064 - 0.9900000000000000000 - 1 - 196 - 2993 - - - 1065 - 0.9900000000000000000 - 1 - 197 - 2995 - - - 1066 - 0.9900000000000000000 - 1 - 197 - 2997 - - - 1067 - 0.9900000000000000000 - 1 - 198 - 2999 - - - 1068 - 0.9900000000000000000 - 1 - 198 - 3001 - - - 1069 - 0.9900000000000000000 - 1 - 198 - 3003 - - - 1070 - 0.9900000000000000000 - 1 - 198 - 3005 - - - 1071 - 0.9900000000000000000 - 1 - 199 - 3009 - - - 1072 - 0.9900000000000000000 - 1 - 199 - 3013 - - - 1073 - 0.9900000000000000000 - 1 - 199 - 3017 - - - 1074 - 0.9900000000000000000 - 1 - 199 - 3021 - - - 1075 - 0.9900000000000000000 - 1 - 199 - 3025 - - - 1076 - 0.9900000000000000000 - 1 - 199 - 3029 - - - 1077 - 0.9900000000000000000 - 1 - 200 - 3035 - - - 1078 - 0.9900000000000000000 - 1 - 200 - 3041 - - - 1079 - 0.9900000000000000000 - 1 - 200 - 3047 - - - 1080 - 0.9900000000000000000 - 1 - 200 - 3053 - - - 1081 - 0.9900000000000000000 - 1 - 200 - 3059 - - - 1082 - 0.9900000000000000000 - 1 - 200 - 3065 - - - 1083 - 0.9900000000000000000 - 1 - 200 - 3071 - - - 1084 - 0.9900000000000000000 - 1 - 200 - 3077 - - - 1085 - 0.9900000000000000000 - 1 - 200 - 3083 - - - 1086 - 0.9900000000000000000 - 1 - 201 - 3092 - - - 1087 - 0.9900000000000000000 - 1 - 201 - 3101 - - - 1088 - 0.9900000000000000000 - 1 - 201 - 3110 - - - 1089 - 0.9900000000000000000 - 1 - 201 - 3119 - - - 1090 - 0.9900000000000000000 - 1 - 201 - 3128 - - - 1091 - 0.9900000000000000000 - 1 - 201 - 3137 - - - 1092 - 0.9900000000000000000 - 1 - 201 - 3146 - - - 1093 - 0.9900000000000000000 - 1 - 201 - 3155 - - - 1094 - 0.9900000000000000000 - 1 - 201 - 3164 - - - 1095 - 1.9900000000000000000 - 1 - 201 - 3173 - - - 1096 - 1.9900000000000000000 - 1 - 201 - 3182 - - - 1097 - 1.9900000000000000000 - 1 - 201 - 3191 - - - 1098 - 1.9900000000000000000 - 1 - 201 - 3200 - - - 1099 - 1.9900000000000000000 - 1 - 201 - 3209 - - - 1100 - 1.9900000000000000000 - 1 - 202 - 3223 - - - 1101 - 1.9900000000000000000 - 1 - 203 - 3224 - - - 1102 - 0.9900000000000000000 - 1 - 203 - 3225 - - - 1103 - 1.9900000000000000000 - 1 - 204 - 3227 - - - 1104 - 1.9900000000000000000 - 1 - 204 - 3229 - - - 1105 - 1.9900000000000000000 - 1 - 205 - 3231 - - - 1106 - 1.9900000000000000000 - 1 - 205 - 3233 - - - 1107 - 1.9900000000000000000 - 1 - 205 - 3235 - - - 1108 - 1.9900000000000000000 - 1 - 205 - 3237 - - - 1109 - 1.9900000000000000000 - 1 - 206 - 3241 - - - 1110 - 1.9900000000000000000 - 1 - 206 - 3245 - - - 1111 - 1.9900000000000000000 - 1 - 206 - 3249 - - - 1112 - 0.9900000000000000000 - 1 - 206 - 3253 - - - 1113 - 0.9900000000000000000 - 1 - 206 - 3257 - - - 1114 - 0.9900000000000000000 - 1 - 206 - 3261 - - - 1115 - 0.9900000000000000000 - 1 - 207 - 3267 - - - 1116 - 0.9900000000000000000 - 1 - 207 - 3273 - - - 1117 - 0.9900000000000000000 - 1 - 207 - 3279 - - - 1118 - 0.9900000000000000000 - 1 - 207 - 3285 - - - 1119 - 0.9900000000000000000 - 1 - 207 - 3291 - - - 1120 - 0.9900000000000000000 - 1 - 207 - 3297 - - - 1121 - 0.9900000000000000000 - 1 - 207 - 3303 - - - 1122 - 0.9900000000000000000 - 1 - 207 - 3309 - - - 1123 - 0.9900000000000000000 - 1 - 207 - 3315 - - - 1124 - 0.9900000000000000000 - 1 - 208 - 3324 - - - 1125 - 0.9900000000000000000 - 1 - 208 - 3333 - - - 1126 - 1.9900000000000000000 - 1 - 208 - 3342 - - - 1127 - 0.9900000000000000000 - 1 - 208 - 3351 - - - 1128 - 1.9900000000000000000 - 1 - 208 - 3360 - - - 1129 - 0.9900000000000000000 - 1 - 208 - 3369 - - - 1130 - 0.9900000000000000000 - 1 - 208 - 3378 - - - 1131 - 0.9900000000000000000 - 1 - 208 - 3387 - - - 1132 - 0.9900000000000000000 - 1 - 208 - 3396 - - - 1133 - 0.9900000000000000000 - 1 - 208 - 3405 - - - 1134 - 0.9900000000000000000 - 1 - 208 - 3414 - - - 1135 - 0.9900000000000000000 - 1 - 208 - 3423 - - - 1136 - 0.9900000000000000000 - 1 - 208 - 3432 - - - 1137 - 0.9900000000000000000 - 1 - 208 - 3441 - - - 1138 - 0.9900000000000000000 - 1 - 209 - 3455 - - - 1139 - 0.9900000000000000000 - 1 - 210 - 3456 - - - 1140 - 0.9900000000000000000 - 1 - 210 - 3457 - - - 1141 - 0.9900000000000000000 - 1 - 211 - 3459 - - - 1142 - 0.9900000000000000000 - 1 - 211 - 3461 - - - 1143 - 0.9900000000000000000 - 1 - 212 - 3463 - - - 1144 - 0.9900000000000000000 - 1 - 212 - 3465 - - - 1145 - 0.9900000000000000000 - 1 - 212 - 3467 - - - 1146 - 0.9900000000000000000 - 1 - 212 - 3469 - - - 1147 - 0.9900000000000000000 - 1 - 213 - 3473 - - - 1148 - 0.9900000000000000000 - 1 - 213 - 3477 - - - 1149 - 0.9900000000000000000 - 1 - 213 - 3481 - - - 1150 - 0.9900000000000000000 - 1 - 213 - 3485 - - - 1151 - 0.9900000000000000000 - 1 - 213 - 3489 - - - 1152 - 0.9900000000000000000 - 1 - 213 - 3493 - - - 1153 - 0.9900000000000000000 - 1 - 214 - 3499 - - - 1154 - 0.9900000000000000000 - 1 - 214 - 2 - - - 1155 - 0.9900000000000000000 - 1 - 214 - 8 - - - 1156 - 0.9900000000000000000 - 1 - 214 - 14 - - - 1157 - 0.9900000000000000000 - 1 - 214 - 20 - - - 1158 - 0.9900000000000000000 - 1 - 214 - 26 - - - 1159 - 0.9900000000000000000 - 1 - 214 - 32 - - - 1160 - 0.9900000000000000000 - 1 - 214 - 38 - - - 1161 - 0.9900000000000000000 - 1 - 214 - 44 - - - 1162 - 0.9900000000000000000 - 1 - 215 - 53 - - - 1163 - 0.9900000000000000000 - 1 - 215 - 62 - - - 1164 - 0.9900000000000000000 - 1 - 215 - 71 - - - 1165 - 0.9900000000000000000 - 1 - 215 - 80 - - - 1166 - 0.9900000000000000000 - 1 - 215 - 89 - - - 1167 - 0.9900000000000000000 - 1 - 215 - 98 - - - 1168 - 0.9900000000000000000 - 1 - 215 - 107 - - - 1169 - 0.9900000000000000000 - 1 - 215 - 116 - - - 1170 - 0.9900000000000000000 - 1 - 215 - 125 - - - 1171 - 0.9900000000000000000 - 1 - 215 - 134 - - - 1172 - 0.9900000000000000000 - 1 - 215 - 143 - - - 1173 - 0.9900000000000000000 - 1 - 215 - 152 - - - 1174 - 0.9900000000000000000 - 1 - 215 - 161 - - - 1175 - 0.9900000000000000000 - 1 - 215 - 170 - - - 1176 - 0.9900000000000000000 - 1 - 216 - 184 - - - 1177 - 0.9900000000000000000 - 1 - 217 - 185 - - - 1178 - 0.9900000000000000000 - 1 - 217 - 186 - - - 1179 - 0.9900000000000000000 - 1 - 218 - 188 - - - 1180 - 0.9900000000000000000 - 1 - 218 - 190 - - - 1181 - 0.9900000000000000000 - 1 - 219 - 192 - - - 1182 - 0.9900000000000000000 - 1 - 219 - 194 - - - 1183 - 0.9900000000000000000 - 1 - 219 - 196 - - - 1184 - 0.9900000000000000000 - 1 - 219 - 198 - - - 1185 - 0.9900000000000000000 - 1 - 220 - 202 - - - 1186 - 0.9900000000000000000 - 1 - 220 - 206 - - - 1187 - 0.9900000000000000000 - 1 - 220 - 210 - - - 1188 - 0.9900000000000000000 - 1 - 220 - 214 - - - 1189 - 0.9900000000000000000 - 1 - 220 - 218 - - - 1190 - 0.9900000000000000000 - 1 - 220 - 222 - - - 1191 - 0.9900000000000000000 - 1 - 221 - 228 - - - 1192 - 0.9900000000000000000 - 1 - 221 - 234 - - - 1193 - 0.9900000000000000000 - 1 - 221 - 240 - - - 1194 - 0.9900000000000000000 - 1 - 221 - 246 - - - 1195 - 0.9900000000000000000 - 1 - 221 - 252 - - - 1196 - 0.9900000000000000000 - 1 - 221 - 258 - - - 1197 - 0.9900000000000000000 - 1 - 221 - 264 - - - 1198 - 0.9900000000000000000 - 1 - 221 - 270 - - - 1199 - 0.9900000000000000000 - 1 - 221 - 276 - - - 1200 - 0.9900000000000000000 - 1 - 222 - 285 - - - 1201 - 0.9900000000000000000 - 1 - 222 - 294 - - - 1202 - 0.9900000000000000000 - 1 - 222 - 303 - - - 1203 - 0.9900000000000000000 - 1 - 222 - 312 - - - 1204 - 0.9900000000000000000 - 1 - 222 - 321 - - - 1205 - 0.9900000000000000000 - 1 - 222 - 330 - - - 1206 - 0.9900000000000000000 - 1 - 222 - 339 - - - 1207 - 0.9900000000000000000 - 1 - 222 - 348 - - - 1208 - 0.9900000000000000000 - 1 - 222 - 357 - - - 1209 - 0.9900000000000000000 - 1 - 222 - 366 - - - 1210 - 0.9900000000000000000 - 1 - 222 - 375 - - - 1211 - 0.9900000000000000000 - 1 - 222 - 384 - - - 1212 - 0.9900000000000000000 - 1 - 222 - 393 - - - 1213 - 0.9900000000000000000 - 1 - 222 - 402 - - - 1214 - 0.9900000000000000000 - 1 - 223 - 416 - - - 1215 - 0.9900000000000000000 - 1 - 224 - 417 - - - 1216 - 0.9900000000000000000 - 1 - 224 - 418 - - - 1217 - 0.9900000000000000000 - 1 - 225 - 420 - - - 1218 - 0.9900000000000000000 - 1 - 225 - 422 - - - 1219 - 0.9900000000000000000 - 1 - 226 - 424 - - - 1220 - 0.9900000000000000000 - 1 - 226 - 426 - - - 1221 - 0.9900000000000000000 - 1 - 226 - 428 - - - 1222 - 0.9900000000000000000 - 1 - 226 - 430 - - - 1223 - 0.9900000000000000000 - 1 - 227 - 434 - - - 1224 - 0.9900000000000000000 - 1 - 227 - 438 - - - 1225 - 0.9900000000000000000 - 1 - 227 - 442 - - - 1226 - 0.9900000000000000000 - 1 - 227 - 446 - - - 1227 - 0.9900000000000000000 - 1 - 227 - 450 - - - 1228 - 0.9900000000000000000 - 1 - 227 - 454 - - - 1229 - 0.9900000000000000000 - 1 - 228 - 460 - - - 1230 - 0.9900000000000000000 - 1 - 228 - 466 - - - 1231 - 0.9900000000000000000 - 1 - 228 - 472 - - - 1232 - 0.9900000000000000000 - 1 - 228 - 478 - - - 1233 - 0.9900000000000000000 - 1 - 228 - 484 - - - 1234 - 0.9900000000000000000 - 1 - 228 - 490 - - - 1235 - 0.9900000000000000000 - 1 - 228 - 496 - - - 1236 - 0.9900000000000000000 - 1 - 228 - 502 - - - 1237 - 0.9900000000000000000 - 1 - 228 - 508 - - - 1238 - 0.9900000000000000000 - 1 - 229 - 517 - - - 1239 - 0.9900000000000000000 - 1 - 229 - 526 - - - 1240 - 0.9900000000000000000 - 1 - 229 - 535 - - - 1241 - 0.9900000000000000000 - 1 - 229 - 544 - - - 1242 - 0.9900000000000000000 - 1 - 229 - 553 - - - 1243 - 0.9900000000000000000 - 1 - 229 - 562 - - - 1244 - 0.9900000000000000000 - 1 - 229 - 571 - - - 1245 - 0.9900000000000000000 - 1 - 229 - 580 - - - 1246 - 0.9900000000000000000 - 1 - 229 - 589 - - - 1247 - 0.9900000000000000000 - 1 - 229 - 598 - - - 1248 - 0.9900000000000000000 - 1 - 229 - 607 - - - 1249 - 0.9900000000000000000 - 1 - 229 - 616 - - - 1250 - 0.9900000000000000000 - 1 - 229 - 625 - - - 1251 - 0.9900000000000000000 - 1 - 229 - 634 - - - 1252 - 0.9900000000000000000 - 1 - 230 - 648 - - - 1253 - 0.9900000000000000000 - 1 - 231 - 649 - - - 1254 - 0.9900000000000000000 - 1 - 231 - 650 - - - 1255 - 0.9900000000000000000 - 1 - 232 - 652 - - - 1256 - 0.9900000000000000000 - 1 - 232 - 654 - - - 1257 - 0.9900000000000000000 - 1 - 233 - 656 - - - 1258 - 0.9900000000000000000 - 1 - 233 - 658 - - - 1259 - 0.9900000000000000000 - 1 - 233 - 660 - - - 1260 - 0.9900000000000000000 - 1 - 233 - 662 - - - 1261 - 0.9900000000000000000 - 1 - 234 - 666 - - - 1262 - 0.9900000000000000000 - 1 - 234 - 670 - - - 1263 - 0.9900000000000000000 - 1 - 234 - 674 - - - 1264 - 0.9900000000000000000 - 1 - 234 - 678 - - - 1265 - 0.9900000000000000000 - 1 - 234 - 682 - - - 1266 - 0.9900000000000000000 - 1 - 234 - 686 - - - 1267 - 0.9900000000000000000 - 1 - 235 - 692 - - - 1268 - 0.9900000000000000000 - 1 - 235 - 698 - - - 1269 - 0.9900000000000000000 - 1 - 235 - 704 - - - 1270 - 0.9900000000000000000 - 1 - 235 - 710 - - - 1271 - 0.9900000000000000000 - 1 - 235 - 716 - - - 1272 - 0.9900000000000000000 - 1 - 235 - 722 - - - 1273 - 0.9900000000000000000 - 1 - 235 - 728 - - - 1274 - 0.9900000000000000000 - 1 - 235 - 734 - - - 1275 - 0.9900000000000000000 - 1 - 235 - 740 - - - 1276 - 0.9900000000000000000 - 1 - 236 - 749 - - - 1277 - 0.9900000000000000000 - 1 - 236 - 758 - - - 1278 - 0.9900000000000000000 - 1 - 236 - 767 - - - 1279 - 0.9900000000000000000 - 1 - 236 - 776 - - - 1280 - 0.9900000000000000000 - 1 - 236 - 785 - - - 1281 - 0.9900000000000000000 - 1 - 236 - 794 - - - 1282 - 0.9900000000000000000 - 1 - 236 - 803 - - - 1283 - 0.9900000000000000000 - 1 - 236 - 812 - - - 1284 - 0.9900000000000000000 - 1 - 236 - 821 - - - 1285 - 0.9900000000000000000 - 1 - 236 - 830 - - - 1286 - 0.9900000000000000000 - 1 - 236 - 839 - - - 1287 - 0.9900000000000000000 - 1 - 236 - 848 - - - 1288 - 0.9900000000000000000 - 1 - 236 - 857 - - - 1289 - 0.9900000000000000000 - 1 - 236 - 866 - - - 1290 - 0.9900000000000000000 - 1 - 237 - 880 - - - 1291 - 0.9900000000000000000 - 1 - 238 - 881 - - - 1292 - 0.9900000000000000000 - 1 - 238 - 882 - - - 1293 - 0.9900000000000000000 - 1 - 239 - 884 - - - 1294 - 0.9900000000000000000 - 1 - 239 - 886 - - - 1295 - 0.9900000000000000000 - 1 - 240 - 888 - - - 1296 - 0.9900000000000000000 - 1 - 240 - 890 - - - 1297 - 0.9900000000000000000 - 1 - 240 - 892 - - - 1298 - 0.9900000000000000000 - 1 - 240 - 894 - - - 1299 - 0.9900000000000000000 - 1 - 241 - 898 - - - 1300 - 0.9900000000000000000 - 1 - 241 - 902 - - - 1301 - 0.9900000000000000000 - 1 - 241 - 906 - - - 1302 - 0.9900000000000000000 - 1 - 241 - 910 - - - 1303 - 0.9900000000000000000 - 1 - 241 - 914 - - - 1304 - 0.9900000000000000000 - 1 - 241 - 918 - - - 1305 - 0.9900000000000000000 - 1 - 242 - 924 - - - 1306 - 0.9900000000000000000 - 1 - 242 - 930 - - - 1307 - 0.9900000000000000000 - 1 - 242 - 936 - - - 1308 - 0.9900000000000000000 - 1 - 242 - 942 - - - 1309 - 0.9900000000000000000 - 1 - 242 - 948 - - - 1310 - 0.9900000000000000000 - 1 - 242 - 954 - - - 1311 - 0.9900000000000000000 - 1 - 242 - 960 - - - 1312 - 0.9900000000000000000 - 1 - 242 - 966 - - - 1313 - 0.9900000000000000000 - 1 - 242 - 972 - - - 1314 - 0.9900000000000000000 - 1 - 243 - 981 - - - 1315 - 0.9900000000000000000 - 1 - 243 - 990 - - - 1316 - 0.9900000000000000000 - 1 - 243 - 999 - - - 1317 - 0.9900000000000000000 - 1 - 243 - 1008 - - - 1318 - 0.9900000000000000000 - 1 - 243 - 1017 - - - 1319 - 0.9900000000000000000 - 1 - 243 - 1026 - - - 1320 - 0.9900000000000000000 - 1 - 243 - 1035 - - - 1321 - 0.9900000000000000000 - 1 - 243 - 1044 - - - 1322 - 0.9900000000000000000 - 1 - 243 - 1053 - - - 1323 - 0.9900000000000000000 - 1 - 243 - 1062 - - - 1324 - 0.9900000000000000000 - 1 - 243 - 1071 - - - 1325 - 0.9900000000000000000 - 1 - 243 - 1080 - - - 1326 - 0.9900000000000000000 - 1 - 243 - 1089 - - - 1327 - 0.9900000000000000000 - 1 - 243 - 1098 - - - 1328 - 0.9900000000000000000 - 1 - 244 - 1112 - - - 1329 - 0.9900000000000000000 - 1 - 245 - 1113 - - - 1330 - 0.9900000000000000000 - 1 - 245 - 1114 - - - 1331 - 0.9900000000000000000 - 1 - 246 - 1116 - - - 1332 - 0.9900000000000000000 - 1 - 246 - 1118 - - - 1333 - 0.9900000000000000000 - 1 - 247 - 1120 - - - 1334 - 0.9900000000000000000 - 1 - 247 - 1122 - - - 1335 - 0.9900000000000000000 - 1 - 247 - 1124 - - - 1336 - 0.9900000000000000000 - 1 - 247 - 1126 - - - 1337 - 0.9900000000000000000 - 1 - 248 - 1130 - - - 1338 - 0.9900000000000000000 - 1 - 248 - 1134 - - - 1339 - 0.9900000000000000000 - 1 - 248 - 1138 - - - 1340 - 0.9900000000000000000 - 1 - 248 - 1142 - - - 1341 - 0.9900000000000000000 - 1 - 248 - 1146 - - - 1342 - 0.9900000000000000000 - 1 - 248 - 1150 - - - 1343 - 0.9900000000000000000 - 1 - 249 - 1156 - - - 1344 - 0.9900000000000000000 - 1 - 249 - 1162 - - - 1345 - 0.9900000000000000000 - 1 - 249 - 1168 - - - 1346 - 0.9900000000000000000 - 1 - 249 - 1174 - - - 1347 - 0.9900000000000000000 - 1 - 249 - 1180 - - - 1348 - 0.9900000000000000000 - 1 - 249 - 1186 - - - 1349 - 0.9900000000000000000 - 1 - 249 - 1192 - - - 1350 - 0.9900000000000000000 - 1 - 249 - 1198 - - - 1351 - 0.9900000000000000000 - 1 - 249 - 1204 - - - 1352 - 0.9900000000000000000 - 1 - 250 - 1213 - - - 1353 - 0.9900000000000000000 - 1 - 250 - 1222 - - - 1354 - 0.9900000000000000000 - 1 - 250 - 1231 - - - 1355 - 0.9900000000000000000 - 1 - 250 - 1240 - - - 1356 - 0.9900000000000000000 - 1 - 250 - 1249 - - - 1357 - 0.9900000000000000000 - 1 - 250 - 1258 - - - 1358 - 0.9900000000000000000 - 1 - 250 - 1267 - - - 1359 - 0.9900000000000000000 - 1 - 250 - 1276 - - - 1360 - 0.9900000000000000000 - 1 - 250 - 1285 - - - 1361 - 0.9900000000000000000 - 1 - 250 - 1294 - - - 1362 - 0.9900000000000000000 - 1 - 250 - 1303 - - - 1363 - 0.9900000000000000000 - 1 - 250 - 1312 - - - 1364 - 0.9900000000000000000 - 1 - 250 - 1321 - - - 1365 - 0.9900000000000000000 - 1 - 250 - 1330 - - - 1366 - 0.9900000000000000000 - 1 - 251 - 1344 - - - 1367 - 0.9900000000000000000 - 1 - 252 - 1345 - - - 1368 - 0.9900000000000000000 - 1 - 252 - 1346 - - - 1369 - 0.9900000000000000000 - 1 - 253 - 1348 - - - 1370 - 0.9900000000000000000 - 1 - 253 - 1350 - - - 1371 - 0.9900000000000000000 - 1 - 254 - 1352 - - - 1372 - 0.9900000000000000000 - 1 - 254 - 1354 - - - 1373 - 0.9900000000000000000 - 1 - 254 - 1356 - - - 1374 - 0.9900000000000000000 - 1 - 254 - 1358 - - - 1375 - 0.9900000000000000000 - 1 - 255 - 1362 - - - 1376 - 0.9900000000000000000 - 1 - 255 - 1366 - - - 1377 - 0.9900000000000000000 - 1 - 255 - 1370 - - - 1378 - 0.9900000000000000000 - 1 - 255 - 1374 - - - 1379 - 0.9900000000000000000 - 1 - 255 - 1378 - - - 1380 - 0.9900000000000000000 - 1 - 255 - 1382 - - - 1381 - 0.9900000000000000000 - 1 - 256 - 1388 - - - 1382 - 0.9900000000000000000 - 1 - 256 - 1394 - - - 1383 - 0.9900000000000000000 - 1 - 256 - 1400 - - - 1384 - 0.9900000000000000000 - 1 - 256 - 1406 - - - 1385 - 0.9900000000000000000 - 1 - 256 - 1412 - - - 1386 - 0.9900000000000000000 - 1 - 256 - 1418 - - - 1387 - 0.9900000000000000000 - 1 - 256 - 1424 - - - 1388 - 0.9900000000000000000 - 1 - 256 - 1430 - - - 1389 - 0.9900000000000000000 - 1 - 256 - 1436 - - - 1390 - 0.9900000000000000000 - 1 - 257 - 1445 - - - 1391 - 0.9900000000000000000 - 1 - 257 - 1454 - - - 1392 - 0.9900000000000000000 - 1 - 257 - 1463 - - - 1393 - 0.9900000000000000000 - 1 - 257 - 1472 - - - 1394 - 0.9900000000000000000 - 1 - 257 - 1481 - - - 1395 - 0.9900000000000000000 - 1 - 257 - 1490 - - - 1396 - 0.9900000000000000000 - 1 - 257 - 1499 - - - 1397 - 0.9900000000000000000 - 1 - 257 - 1508 - - - 1398 - 0.9900000000000000000 - 1 - 257 - 1517 - - - 1399 - 0.9900000000000000000 - 1 - 257 - 1526 - - - 1400 - 0.9900000000000000000 - 1 - 257 - 1535 - - - 1401 - 0.9900000000000000000 - 1 - 257 - 1544 - - - 1402 - 0.9900000000000000000 - 1 - 257 - 1553 - - - 1403 - 0.9900000000000000000 - 1 - 257 - 1562 - - - 1404 - 0.9900000000000000000 - 1 - 258 - 1576 - - - 1405 - 0.9900000000000000000 - 1 - 259 - 1577 - - - 1406 - 0.9900000000000000000 - 1 - 259 - 1578 - - - 1407 - 0.9900000000000000000 - 1 - 260 - 1580 - - - 1408 - 0.9900000000000000000 - 1 - 260 - 1582 - - - 1409 - 0.9900000000000000000 - 1 - 261 - 1584 - - - 1410 - 0.9900000000000000000 - 1 - 261 - 1586 - - - 1411 - 0.9900000000000000000 - 1 - 261 - 1588 - - - 1412 - 0.9900000000000000000 - 1 - 261 - 1590 - - - 1413 - 0.9900000000000000000 - 1 - 262 - 1594 - - - 1414 - 0.9900000000000000000 - 1 - 262 - 1598 - - - 1415 - 0.9900000000000000000 - 1 - 262 - 1602 - - - 1416 - 0.9900000000000000000 - 1 - 262 - 1606 - - - 1417 - 0.9900000000000000000 - 1 - 262 - 1610 - - - 1418 - 0.9900000000000000000 - 1 - 262 - 1614 - - - 1419 - 0.9900000000000000000 - 1 - 263 - 1620 - - - 1420 - 0.9900000000000000000 - 1 - 263 - 1626 - - - 1421 - 0.9900000000000000000 - 1 - 263 - 1632 - - - 1422 - 0.9900000000000000000 - 1 - 263 - 1638 - - - 1423 - 0.9900000000000000000 - 1 - 263 - 1644 - - - 1424 - 0.9900000000000000000 - 1 - 263 - 1650 - - - 1425 - 0.9900000000000000000 - 1 - 263 - 1656 - - - 1426 - 0.9900000000000000000 - 1 - 263 - 1662 - - - 1427 - 0.9900000000000000000 - 1 - 263 - 1668 - - - 1428 - 0.9900000000000000000 - 1 - 264 - 1677 - - - 1429 - 0.9900000000000000000 - 1 - 264 - 1686 - - - 1430 - 0.9900000000000000000 - 1 - 264 - 1695 - - - 1431 - 0.9900000000000000000 - 1 - 264 - 1704 - - - 1432 - 0.9900000000000000000 - 1 - 264 - 1713 - - - 1433 - 0.9900000000000000000 - 1 - 264 - 1722 - - - 1434 - 0.9900000000000000000 - 1 - 264 - 1731 - - - 1435 - 0.9900000000000000000 - 1 - 264 - 1740 - - - 1436 - 0.9900000000000000000 - 1 - 264 - 1749 - - - 1437 - 0.9900000000000000000 - 1 - 264 - 1758 - - - 1438 - 0.9900000000000000000 - 1 - 264 - 1767 - - - 1439 - 0.9900000000000000000 - 1 - 264 - 1776 - - - 1440 - 0.9900000000000000000 - 1 - 264 - 1785 - - - 1441 - 0.9900000000000000000 - 1 - 264 - 1794 - - - 1442 - 0.9900000000000000000 - 1 - 265 - 1808 - - - 1443 - 0.9900000000000000000 - 1 - 266 - 1809 - - - 1444 - 0.9900000000000000000 - 1 - 266 - 1810 - - - 1445 - 0.9900000000000000000 - 1 - 267 - 1812 - - - 1446 - 0.9900000000000000000 - 1 - 267 - 1814 - - - 1447 - 0.9900000000000000000 - 1 - 268 - 1816 - - - 1448 - 0.9900000000000000000 - 1 - 268 - 1818 - - - 1449 - 0.9900000000000000000 - 1 - 268 - 1820 - - - 1450 - 0.9900000000000000000 - 1 - 268 - 1822 - - - 1451 - 0.9900000000000000000 - 1 - 269 - 1826 - - - 1452 - 0.9900000000000000000 - 1 - 269 - 1830 - - - 1453 - 0.9900000000000000000 - 1 - 269 - 1834 - - - 1454 - 0.9900000000000000000 - 1 - 269 - 1838 - - - 1455 - 0.9900000000000000000 - 1 - 269 - 1842 - - - 1456 - 0.9900000000000000000 - 1 - 269 - 1846 - - - 1457 - 0.9900000000000000000 - 1 - 270 - 1852 - - - 1458 - 0.9900000000000000000 - 1 - 270 - 1858 - - - 1459 - 0.9900000000000000000 - 1 - 270 - 1864 - - - 1460 - 0.9900000000000000000 - 1 - 270 - 1870 - - - 1461 - 0.9900000000000000000 - 1 - 270 - 1876 - - - 1462 - 0.9900000000000000000 - 1 - 270 - 1882 - - - 1463 - 0.9900000000000000000 - 1 - 270 - 1888 - - - 1464 - 0.9900000000000000000 - 1 - 270 - 1894 - - - 1465 - 0.9900000000000000000 - 1 - 270 - 1900 - - - 1466 - 0.9900000000000000000 - 1 - 271 - 1909 - - - 1467 - 0.9900000000000000000 - 1 - 271 - 1918 - - - 1468 - 0.9900000000000000000 - 1 - 271 - 1927 - - - 1469 - 0.9900000000000000000 - 1 - 271 - 1936 - - - 1470 - 0.9900000000000000000 - 1 - 271 - 1945 - - - 1471 - 0.9900000000000000000 - 1 - 271 - 1954 - - - 1472 - 0.9900000000000000000 - 1 - 271 - 1963 - - - 1473 - 0.9900000000000000000 - 1 - 271 - 1972 - - - 1474 - 0.9900000000000000000 - 1 - 271 - 1981 - - - 1475 - 0.9900000000000000000 - 1 - 271 - 1990 - - - 1476 - 0.9900000000000000000 - 1 - 271 - 1999 - - - 1477 - 0.9900000000000000000 - 1 - 271 - 2008 - - - 1478 - 0.9900000000000000000 - 1 - 271 - 2017 - - - 1479 - 0.9900000000000000000 - 1 - 271 - 2026 - - - 1480 - 0.9900000000000000000 - 1 - 272 - 2040 - - - 1481 - 0.9900000000000000000 - 1 - 273 - 2041 - - - 1482 - 0.9900000000000000000 - 1 - 273 - 2042 - - - 1483 - 0.9900000000000000000 - 1 - 274 - 2044 - - - 1484 - 0.9900000000000000000 - 1 - 274 - 2046 - - - 1485 - 0.9900000000000000000 - 1 - 275 - 2048 - - - 1486 - 0.9900000000000000000 - 1 - 275 - 2050 - - - 1487 - 0.9900000000000000000 - 1 - 275 - 2052 - - - 1488 - 0.9900000000000000000 - 1 - 275 - 2054 - - - 1489 - 0.9900000000000000000 - 1 - 276 - 2058 - - - 1490 - 0.9900000000000000000 - 1 - 276 - 2062 - - - 1491 - 0.9900000000000000000 - 1 - 276 - 2066 - - - 1492 - 0.9900000000000000000 - 1 - 276 - 2070 - - - 1493 - 0.9900000000000000000 - 1 - 276 - 2074 - - - 1494 - 0.9900000000000000000 - 1 - 276 - 2078 - - - 1495 - 0.9900000000000000000 - 1 - 277 - 2084 - - - 1496 - 0.9900000000000000000 - 1 - 277 - 2090 - - - 1497 - 0.9900000000000000000 - 1 - 277 - 2096 - - - 1498 - 0.9900000000000000000 - 1 - 277 - 2102 - - - 1499 - 0.9900000000000000000 - 1 - 277 - 2108 - - - 1500 - 0.9900000000000000000 - 1 - 277 - 2114 - - - 1501 - 0.9900000000000000000 - 1 - 277 - 2120 - - - 1502 - 0.9900000000000000000 - 1 - 277 - 2126 - - - 1503 - 0.9900000000000000000 - 1 - 277 - 2132 - - - 1504 - 0.9900000000000000000 - 1 - 278 - 2141 - - - 1505 - 0.9900000000000000000 - 1 - 278 - 2150 - - - 1506 - 0.9900000000000000000 - 1 - 278 - 2159 - - - 1507 - 0.9900000000000000000 - 1 - 278 - 2168 - - - 1508 - 0.9900000000000000000 - 1 - 278 - 2177 - - - 1509 - 0.9900000000000000000 - 1 - 278 - 2186 - - - 1510 - 0.9900000000000000000 - 1 - 278 - 2195 - - - 1511 - 0.9900000000000000000 - 1 - 278 - 2204 - - - 1512 - 0.9900000000000000000 - 1 - 278 - 2213 - - - 1513 - 0.9900000000000000000 - 1 - 278 - 2222 - - - 1514 - 0.9900000000000000000 - 1 - 278 - 2231 - - - 1515 - 0.9900000000000000000 - 1 - 278 - 2240 - - - 1516 - 0.9900000000000000000 - 1 - 278 - 2249 - - - 1517 - 0.9900000000000000000 - 1 - 278 - 2258 - - - 1518 - 0.9900000000000000000 - 1 - 279 - 2272 - - - 1519 - 0.9900000000000000000 - 1 - 280 - 2273 - - - 1520 - 0.9900000000000000000 - 1 - 280 - 2274 - - - 1521 - 0.9900000000000000000 - 1 - 281 - 2276 - - - 1522 - 0.9900000000000000000 - 1 - 281 - 2278 - - - 1523 - 0.9900000000000000000 - 1 - 282 - 2280 - - - 1524 - 0.9900000000000000000 - 1 - 282 - 2282 - - - 1525 - 0.9900000000000000000 - 1 - 282 - 2284 - - - 1526 - 0.9900000000000000000 - 1 - 282 - 2286 - - - 1527 - 0.9900000000000000000 - 1 - 283 - 2290 - - - 1528 - 0.9900000000000000000 - 1 - 283 - 2294 - - - 1529 - 0.9900000000000000000 - 1 - 283 - 2298 - - - 1530 - 0.9900000000000000000 - 1 - 283 - 2302 - - - 1531 - 0.9900000000000000000 - 1 - 283 - 2306 - - - 1532 - 0.9900000000000000000 - 1 - 283 - 2310 - - - 1533 - 0.9900000000000000000 - 1 - 284 - 2316 - - - 1534 - 0.9900000000000000000 - 1 - 284 - 2322 - - - 1535 - 0.9900000000000000000 - 1 - 284 - 2328 - - - 1536 - 0.9900000000000000000 - 1 - 284 - 2334 - - - 1537 - 0.9900000000000000000 - 1 - 284 - 2340 - - - 1538 - 0.9900000000000000000 - 1 - 284 - 2346 - - - 1539 - 0.9900000000000000000 - 1 - 284 - 2352 - - - 1540 - 0.9900000000000000000 - 1 - 284 - 2358 - - - 1541 - 0.9900000000000000000 - 1 - 284 - 2364 - - - 1542 - 0.9900000000000000000 - 1 - 285 - 2373 - - - 1543 - 0.9900000000000000000 - 1 - 285 - 2382 - - - 1544 - 0.9900000000000000000 - 1 - 285 - 2391 - - - 1545 - 0.9900000000000000000 - 1 - 285 - 2400 - - - 1546 - 0.9900000000000000000 - 1 - 285 - 2409 - - - 1547 - 0.9900000000000000000 - 1 - 285 - 2418 - - - 1548 - 0.9900000000000000000 - 1 - 285 - 2427 - - - 1549 - 0.9900000000000000000 - 1 - 285 - 2436 - - - 1550 - 0.9900000000000000000 - 1 - 285 - 2445 - - - 1551 - 0.9900000000000000000 - 1 - 285 - 2454 - - - 1552 - 0.9900000000000000000 - 1 - 285 - 2463 - - - 1553 - 0.9900000000000000000 - 1 - 285 - 2472 - - - 1554 - 0.9900000000000000000 - 1 - 285 - 2481 - - - 1555 - 0.9900000000000000000 - 1 - 285 - 2490 - - - 1556 - 0.9900000000000000000 - 1 - 286 - 2504 - - - 1557 - 0.9900000000000000000 - 1 - 287 - 2505 - - - 1558 - 0.9900000000000000000 - 1 - 287 - 2506 - - - 1559 - 0.9900000000000000000 - 1 - 288 - 2508 - - - 1560 - 0.9900000000000000000 - 1 - 288 - 2510 - - - 1561 - 0.9900000000000000000 - 1 - 289 - 2512 - - - 1562 - 0.9900000000000000000 - 1 - 289 - 2514 - - - 1563 - 0.9900000000000000000 - 1 - 289 - 2516 - - - 1564 - 0.9900000000000000000 - 1 - 289 - 2518 - - - 1565 - 0.9900000000000000000 - 1 - 290 - 2522 - - - 1566 - 0.9900000000000000000 - 1 - 290 - 2526 - - - 1567 - 0.9900000000000000000 - 1 - 290 - 2530 - - - 1568 - 0.9900000000000000000 - 1 - 290 - 2534 - - - 1569 - 0.9900000000000000000 - 1 - 290 - 2538 - - - 1570 - 0.9900000000000000000 - 1 - 290 - 2542 - - - 1571 - 0.9900000000000000000 - 1 - 291 - 2548 - - - 1572 - 0.9900000000000000000 - 1 - 291 - 2554 - - - 1573 - 0.9900000000000000000 - 1 - 291 - 2560 - - - 1574 - 0.9900000000000000000 - 1 - 291 - 2566 - - - 1575 - 0.9900000000000000000 - 1 - 291 - 2572 - - - 1576 - 0.9900000000000000000 - 1 - 291 - 2578 - - - 1577 - 0.9900000000000000000 - 1 - 291 - 2584 - - - 1578 - 0.9900000000000000000 - 1 - 291 - 2590 - - - 1579 - 0.9900000000000000000 - 1 - 291 - 2596 - - - 1580 - 0.9900000000000000000 - 1 - 292 - 2605 - - - 1581 - 0.9900000000000000000 - 1 - 292 - 2614 - - - 1582 - 0.9900000000000000000 - 1 - 292 - 2623 - - - 1583 - 0.9900000000000000000 - 1 - 292 - 2632 - - - 1584 - 0.9900000000000000000 - 1 - 292 - 2641 - - - 1585 - 0.9900000000000000000 - 1 - 292 - 2650 - - - 1586 - 0.9900000000000000000 - 1 - 292 - 2659 - - - 1587 - 0.9900000000000000000 - 1 - 292 - 2668 - - - 1588 - 0.9900000000000000000 - 1 - 292 - 2677 - - - 1589 - 0.9900000000000000000 - 1 - 292 - 2686 - - - 1590 - 0.9900000000000000000 - 1 - 292 - 2695 - - - 1591 - 0.9900000000000000000 - 1 - 292 - 2704 - - - 1592 - 0.9900000000000000000 - 1 - 292 - 2713 - - - 1593 - 0.9900000000000000000 - 1 - 292 - 2722 - - - 1594 - 0.9900000000000000000 - 1 - 293 - 2736 - - - 1595 - 0.9900000000000000000 - 1 - 294 - 2737 - - - 1596 - 0.9900000000000000000 - 1 - 294 - 2738 - - - 1597 - 0.9900000000000000000 - 1 - 295 - 2740 - - - 1598 - 0.9900000000000000000 - 1 - 295 - 2742 - - - 1599 - 0.9900000000000000000 - 1 - 296 - 2744 - - - 1600 - 0.9900000000000000000 - 1 - 296 - 2746 - - - 1601 - 0.9900000000000000000 - 1 - 296 - 2748 - - - 1602 - 0.9900000000000000000 - 1 - 296 - 2750 - - - 1603 - 0.9900000000000000000 - 1 - 297 - 2754 - - - 1604 - 0.9900000000000000000 - 1 - 297 - 2758 - - - 1605 - 0.9900000000000000000 - 1 - 297 - 2762 - - - 1606 - 0.9900000000000000000 - 1 - 297 - 2766 - - - 1607 - 0.9900000000000000000 - 1 - 297 - 2770 - - - 1608 - 0.9900000000000000000 - 1 - 297 - 2774 - - - 1609 - 0.9900000000000000000 - 1 - 298 - 2780 - - - 1610 - 0.9900000000000000000 - 1 - 298 - 2786 - - - 1611 - 0.9900000000000000000 - 1 - 298 - 2792 - - - 1612 - 0.9900000000000000000 - 1 - 298 - 2798 - - - 1613 - 0.9900000000000000000 - 1 - 298 - 2804 - - - 1614 - 0.9900000000000000000 - 1 - 298 - 2810 - - - 1615 - 0.9900000000000000000 - 1 - 298 - 2816 - - - 1616 - 1.9900000000000000000 - 1 - 298 - 2822 - - - 1617 - 1.9900000000000000000 - 1 - 298 - 2828 - - - 1618 - 1.9900000000000000000 - 1 - 299 - 2837 - - - 1619 - 1.9900000000000000000 - 1 - 299 - 2846 - - - 1620 - 1.9900000000000000000 - 1 - 299 - 2855 - - - 1621 - 1.9900000000000000000 - 1 - 299 - 2864 - - - 1622 - 1.9900000000000000000 - 1 - 299 - 2873 - - - 1623 - 1.9900000000000000000 - 1 - 299 - 2882 - - - 1624 - 1.9900000000000000000 - 1 - 299 - 2891 - - - 1625 - 1.9900000000000000000 - 1 - 299 - 2900 - - - 1626 - 1.9900000000000000000 - 1 - 299 - 2909 - - - 1627 - 1.9900000000000000000 - 1 - 299 - 2918 - - - 1628 - 0.9900000000000000000 - 1 - 299 - 2927 - - - 1629 - 0.9900000000000000000 - 1 - 299 - 2936 - - - 1630 - 0.9900000000000000000 - 1 - 299 - 2945 - - - 1631 - 0.9900000000000000000 - 1 - 299 - 2954 - - - 1632 - 0.9900000000000000000 - 1 - 300 - 2968 - - - 1633 - 0.9900000000000000000 - 1 - 301 - 2969 - - - 1634 - 0.9900000000000000000 - 1 - 301 - 2970 - - - 1635 - 0.9900000000000000000 - 1 - 302 - 2972 - - - 1636 - 0.9900000000000000000 - 1 - 302 - 2974 - - - 1637 - 0.9900000000000000000 - 1 - 303 - 2976 - - - 1638 - 0.9900000000000000000 - 1 - 303 - 2978 - - - 1639 - 0.9900000000000000000 - 1 - 303 - 2980 - - - 1640 - 0.9900000000000000000 - 1 - 303 - 2982 - - - 1641 - 0.9900000000000000000 - 1 - 304 - 2986 - - - 1642 - 0.9900000000000000000 - 1 - 304 - 2990 - - - 1643 - 0.9900000000000000000 - 1 - 304 - 2994 - - - 1644 - 0.9900000000000000000 - 1 - 304 - 2998 - - - 1645 - 0.9900000000000000000 - 1 - 304 - 3002 - - - 1646 - 0.9900000000000000000 - 1 - 304 - 3006 - - - 1647 - 0.9900000000000000000 - 1 - 305 - 3012 - - - 1648 - 0.9900000000000000000 - 1 - 305 - 3018 - - - 1649 - 0.9900000000000000000 - 1 - 305 - 3024 - - - 1650 - 0.9900000000000000000 - 1 - 305 - 3030 - - - 1651 - 0.9900000000000000000 - 1 - 305 - 3036 - - - 1652 - 0.9900000000000000000 - 1 - 305 - 3042 - - - 1653 - 0.9900000000000000000 - 1 - 305 - 3048 - - - 1654 - 0.9900000000000000000 - 1 - 305 - 3054 - - - 1655 - 0.9900000000000000000 - 1 - 305 - 3060 - - - 1656 - 0.9900000000000000000 - 1 - 306 - 3069 - - - 1657 - 0.9900000000000000000 - 1 - 306 - 3078 - - - 1658 - 0.9900000000000000000 - 1 - 306 - 3087 - - - 1659 - 0.9900000000000000000 - 1 - 306 - 3096 - - - 1660 - 0.9900000000000000000 - 1 - 306 - 3105 - - - 1661 - 0.9900000000000000000 - 1 - 306 - 3114 - - - 1662 - 0.9900000000000000000 - 1 - 306 - 3123 - - - 1663 - 0.9900000000000000000 - 1 - 306 - 3132 - - - 1664 - 0.9900000000000000000 - 1 - 306 - 3141 - - - 1665 - 0.9900000000000000000 - 1 - 306 - 3150 - - - 1666 - 0.9900000000000000000 - 1 - 306 - 3159 - - - 1667 - 1.9900000000000000000 - 1 - 306 - 3168 - - - 1668 - 1.9900000000000000000 - 1 - 306 - 3177 - - - 1669 - 1.9900000000000000000 - 1 - 306 - 3186 - - - 1670 - 1.9900000000000000000 - 1 - 307 - 3200 - - - 1671 - 1.9900000000000000000 - 1 - 308 - 3201 - - - 1672 - 1.9900000000000000000 - 1 - 308 - 3202 - - - 1673 - 1.9900000000000000000 - 1 - 309 - 3204 - - - 1674 - 1.9900000000000000000 - 1 - 309 - 3206 - - - 1675 - 1.9900000000000000000 - 1 - 310 - 3208 - - - 1676 - 1.9900000000000000000 - 1 - 310 - 3210 - - - 1677 - 1.9900000000000000000 - 1 - 310 - 3212 - - - 1678 - 1.9900000000000000000 - 1 - 310 - 3214 - - - 1679 - 1.9900000000000000000 - 1 - 311 - 3218 - - - 1680 - 1.9900000000000000000 - 1 - 311 - 3222 - - - 1681 - 1.9900000000000000000 - 1 - 311 - 3226 - - - 1682 - 1.9900000000000000000 - 1 - 311 - 3230 - - - 1683 - 1.9900000000000000000 - 1 - 311 - 3234 - - - 1684 - 1.9900000000000000000 - 1 - 311 - 3238 - - - 1685 - 1.9900000000000000000 - 1 - 312 - 3244 - - - 1686 - 1.9900000000000000000 - 1 - 312 - 3250 - - - 1687 - 0.9900000000000000000 - 1 - 312 - 3256 - - - 1688 - 0.9900000000000000000 - 1 - 312 - 3262 - - - 1689 - 0.9900000000000000000 - 1 - 312 - 3268 - - - 1690 - 0.9900000000000000000 - 1 - 312 - 3274 - - - 1691 - 0.9900000000000000000 - 1 - 312 - 3280 - - - 1692 - 0.9900000000000000000 - 1 - 312 - 3286 - - - 1693 - 0.9900000000000000000 - 1 - 312 - 3292 - - - 1694 - 0.9900000000000000000 - 1 - 313 - 3301 - - - 1695 - 0.9900000000000000000 - 1 - 313 - 3310 - - - 1696 - 0.9900000000000000000 - 1 - 313 - 3319 - - - 1697 - 0.9900000000000000000 - 1 - 313 - 3328 - - - 1698 - 1.9900000000000000000 - 1 - 313 - 3337 - - - 1699 - 1.9900000000000000000 - 1 - 313 - 3346 - - - 1700 - 0.9900000000000000000 - 1 - 313 - 3355 - - - 1701 - 1.9900000000000000000 - 1 - 313 - 3364 - - - 1702 - 0.9900000000000000000 - 1 - 313 - 3373 - - - 1703 - 0.9900000000000000000 - 1 - 313 - 3382 - - - 1704 - 0.9900000000000000000 - 1 - 313 - 3391 - - - 1705 - 0.9900000000000000000 - 1 - 313 - 3400 - - - 1706 - 0.9900000000000000000 - 1 - 313 - 3409 - - - 1707 - 0.9900000000000000000 - 1 - 313 - 3418 - - - 1708 - 0.9900000000000000000 - 1 - 314 - 3432 - - - 1709 - 0.9900000000000000000 - 1 - 315 - 3433 - - - 1710 - 0.9900000000000000000 - 1 - 315 - 3434 - - - 1711 - 0.9900000000000000000 - 1 - 316 - 3436 - - - 1712 - 0.9900000000000000000 - 1 - 316 - 3438 - - - 1713 - 0.9900000000000000000 - 1 - 317 - 3440 - - - 1714 - 0.9900000000000000000 - 1 - 317 - 3442 - - - 1715 - 0.9900000000000000000 - 1 - 317 - 3444 - - - 1716 - 0.9900000000000000000 - 1 - 317 - 3446 - - - 1717 - 0.9900000000000000000 - 1 - 318 - 3450 - - - 1718 - 0.9900000000000000000 - 1 - 318 - 3454 - - - 1719 - 0.9900000000000000000 - 1 - 318 - 3458 - - - 1720 - 0.9900000000000000000 - 1 - 318 - 3462 - - - 1721 - 0.9900000000000000000 - 1 - 318 - 3466 - - - 1722 - 0.9900000000000000000 - 1 - 318 - 3470 - - - 1723 - 0.9900000000000000000 - 1 - 319 - 3476 - - - 1724 - 0.9900000000000000000 - 1 - 319 - 3482 - - - 1725 - 0.9900000000000000000 - 1 - 319 - 3488 - - - 1726 - 0.9900000000000000000 - 1 - 319 - 3494 - - - 1727 - 0.9900000000000000000 - 1 - 319 - 3500 - - - 1728 - 0.9900000000000000000 - 1 - 319 - 3 - - - 1729 - 0.9900000000000000000 - 1 - 319 - 9 - - - 1730 - 0.9900000000000000000 - 1 - 319 - 15 - - - 1731 - 0.9900000000000000000 - 1 - 319 - 21 - - - 1732 - 0.9900000000000000000 - 1 - 320 - 30 - - - 1733 - 0.9900000000000000000 - 1 - 320 - 39 - - - 1734 - 0.9900000000000000000 - 1 - 320 - 48 - - - 1735 - 0.9900000000000000000 - 1 - 320 - 57 - - - 1736 - 0.9900000000000000000 - 1 - 320 - 66 - - - 1737 - 0.9900000000000000000 - 1 - 320 - 75 - - - 1738 - 0.9900000000000000000 - 1 - 320 - 84 - - - 1739 - 0.9900000000000000000 - 1 - 320 - 93 - - - 1740 - 0.9900000000000000000 - 1 - 320 - 102 - - - 1741 - 0.9900000000000000000 - 1 - 320 - 111 - - - 1742 - 0.9900000000000000000 - 1 - 320 - 120 - - - 1743 - 0.9900000000000000000 - 1 - 320 - 129 - - - 1744 - 0.9900000000000000000 - 1 - 320 - 138 - - - 1745 - 0.9900000000000000000 - 1 - 320 - 147 - - - 1746 - 0.9900000000000000000 - 1 - 321 - 161 - - - 1747 - 0.9900000000000000000 - 1 - 322 - 162 - - - 1748 - 0.9900000000000000000 - 1 - 322 - 163 - - - 1749 - 0.9900000000000000000 - 1 - 323 - 165 - - - 1750 - 0.9900000000000000000 - 1 - 323 - 167 - - - 1751 - 0.9900000000000000000 - 1 - 324 - 169 - - - 1752 - 0.9900000000000000000 - 1 - 324 - 171 - - - 1753 - 0.9900000000000000000 - 1 - 324 - 173 - - - 1754 - 0.9900000000000000000 - 1 - 324 - 175 - - - 1755 - 0.9900000000000000000 - 1 - 325 - 179 - - - 1756 - 0.9900000000000000000 - 1 - 325 - 183 - - - 1757 - 0.9900000000000000000 - 1 - 325 - 187 - - - 1758 - 0.9900000000000000000 - 1 - 325 - 191 - - - 1759 - 0.9900000000000000000 - 1 - 325 - 195 - - - 1760 - 0.9900000000000000000 - 1 - 325 - 199 - - - 1761 - 0.9900000000000000000 - 1 - 326 - 205 - - - 1762 - 0.9900000000000000000 - 1 - 326 - 211 - - - 1763 - 0.9900000000000000000 - 1 - 326 - 217 - - - 1764 - 0.9900000000000000000 - 1 - 326 - 223 - - - 1765 - 0.9900000000000000000 - 1 - 326 - 229 - - - 1766 - 0.9900000000000000000 - 1 - 326 - 235 - - - 1767 - 0.9900000000000000000 - 1 - 326 - 241 - - - 1768 - 0.9900000000000000000 - 1 - 326 - 247 - - - 1769 - 0.9900000000000000000 - 1 - 326 - 253 - - - 1770 - 0.9900000000000000000 - 1 - 327 - 262 - - - 1771 - 0.9900000000000000000 - 1 - 327 - 271 - - - 1772 - 0.9900000000000000000 - 1 - 327 - 280 - - - 1773 - 0.9900000000000000000 - 1 - 327 - 289 - - - 1774 - 0.9900000000000000000 - 1 - 327 - 298 - - - 1775 - 0.9900000000000000000 - 1 - 327 - 307 - - - 1776 - 0.9900000000000000000 - 1 - 327 - 316 - - - 1777 - 0.9900000000000000000 - 1 - 327 - 325 - - - 1778 - 0.9900000000000000000 - 1 - 327 - 334 - - - 1779 - 0.9900000000000000000 - 1 - 327 - 343 - - - 1780 - 0.9900000000000000000 - 1 - 327 - 352 - - - 1781 - 0.9900000000000000000 - 1 - 327 - 361 - - - 1782 - 0.9900000000000000000 - 1 - 327 - 370 - - - 1783 - 0.9900000000000000000 - 1 - 327 - 379 - - - 1784 - 0.9900000000000000000 - 1 - 328 - 393 - - - 1785 - 0.9900000000000000000 - 1 - 329 - 394 - - - 1786 - 0.9900000000000000000 - 1 - 329 - 395 - - - 1787 - 0.9900000000000000000 - 1 - 330 - 397 - - - 1788 - 0.9900000000000000000 - 1 - 330 - 399 - - - 1789 - 0.9900000000000000000 - 1 - 331 - 401 - - - 1790 - 0.9900000000000000000 - 1 - 331 - 403 - - - 1791 - 0.9900000000000000000 - 1 - 331 - 405 - - - 1792 - 0.9900000000000000000 - 1 - 331 - 407 - - - 1793 - 0.9900000000000000000 - 1 - 332 - 411 - - - 1794 - 0.9900000000000000000 - 1 - 332 - 415 - - - 1795 - 0.9900000000000000000 - 1 - 332 - 419 - - - 1796 - 0.9900000000000000000 - 1 - 332 - 423 - - - 1797 - 0.9900000000000000000 - 1 - 332 - 427 - - - 1798 - 0.9900000000000000000 - 1 - 332 - 431 - - - 1799 - 0.9900000000000000000 - 1 - 333 - 437 - - - 1800 - 0.9900000000000000000 - 1 - 333 - 443 - - - 1801 - 0.9900000000000000000 - 1 - 333 - 449 - - - 1802 - 0.9900000000000000000 - 1 - 333 - 455 - - - 1803 - 0.9900000000000000000 - 1 - 333 - 461 - - - 1804 - 0.9900000000000000000 - 1 - 333 - 467 - - - 1805 - 0.9900000000000000000 - 1 - 333 - 473 - - - 1806 - 0.9900000000000000000 - 1 - 333 - 479 - - - 1807 - 0.9900000000000000000 - 1 - 333 - 485 - - - 1808 - 0.9900000000000000000 - 1 - 334 - 494 - - - 1809 - 0.9900000000000000000 - 1 - 334 - 503 - - - 1810 - 0.9900000000000000000 - 1 - 334 - 512 - - - 1811 - 0.9900000000000000000 - 1 - 334 - 521 - - - 1812 - 0.9900000000000000000 - 1 - 334 - 530 - - - 1813 - 0.9900000000000000000 - 1 - 334 - 539 - - - 1814 - 0.9900000000000000000 - 1 - 334 - 548 - - - 1815 - 0.9900000000000000000 - 1 - 334 - 557 - - - 1816 - 0.9900000000000000000 - 1 - 334 - 566 - - - 1817 - 0.9900000000000000000 - 1 - 334 - 575 - - - 1818 - 0.9900000000000000000 - 1 - 334 - 584 - - - 1819 - 0.9900000000000000000 - 1 - 334 - 593 - - - 1820 - 0.9900000000000000000 - 1 - 334 - 602 - - - 1821 - 0.9900000000000000000 - 1 - 334 - 611 - - - 1822 - 0.9900000000000000000 - 1 - 335 - 625 - - - 1823 - 0.9900000000000000000 - 1 - 336 - 626 - - - 1824 - 0.9900000000000000000 - 1 - 336 - 627 - - - 1825 - 0.9900000000000000000 - 1 - 337 - 629 - - - 1826 - 0.9900000000000000000 - 1 - 337 - 631 - - - 1827 - 0.9900000000000000000 - 1 - 338 - 633 - - - 1828 - 0.9900000000000000000 - 1 - 338 - 635 - - - 1829 - 0.9900000000000000000 - 1 - 338 - 637 - - - 1830 - 0.9900000000000000000 - 1 - 338 - 639 - - - 1831 - 0.9900000000000000000 - 1 - 339 - 643 - - - 1832 - 0.9900000000000000000 - 1 - 339 - 647 - - - 1833 - 0.9900000000000000000 - 1 - 339 - 651 - - - 1834 - 0.9900000000000000000 - 1 - 339 - 655 - - - 1835 - 0.9900000000000000000 - 1 - 339 - 659 - - - 1836 - 0.9900000000000000000 - 1 - 339 - 663 - - - 1837 - 0.9900000000000000000 - 1 - 340 - 669 - - - 1838 - 0.9900000000000000000 - 1 - 340 - 675 - - - 1839 - 0.9900000000000000000 - 1 - 340 - 681 - - - 1840 - 0.9900000000000000000 - 1 - 340 - 687 - - - 1841 - 0.9900000000000000000 - 1 - 340 - 693 - - - 1842 - 0.9900000000000000000 - 1 - 340 - 699 - - - 1843 - 0.9900000000000000000 - 1 - 340 - 705 - - - 1844 - 0.9900000000000000000 - 1 - 340 - 711 - - - 1845 - 0.9900000000000000000 - 1 - 340 - 717 - - - 1846 - 0.9900000000000000000 - 1 - 341 - 726 - - - 1847 - 0.9900000000000000000 - 1 - 341 - 735 - - - 1848 - 0.9900000000000000000 - 1 - 341 - 744 - - - 1849 - 0.9900000000000000000 - 1 - 341 - 753 - - - 1850 - 0.9900000000000000000 - 1 - 341 - 762 - - - 1851 - 0.9900000000000000000 - 1 - 341 - 771 - - - 1852 - 0.9900000000000000000 - 1 - 341 - 780 - - - 1853 - 0.9900000000000000000 - 1 - 341 - 789 - - - 1854 - 0.9900000000000000000 - 1 - 341 - 798 - - - 1855 - 0.9900000000000000000 - 1 - 341 - 807 - - - 1856 - 0.9900000000000000000 - 1 - 341 - 816 - - - 1857 - 0.9900000000000000000 - 1 - 341 - 825 - - - 1858 - 0.9900000000000000000 - 1 - 341 - 834 - - - 1859 - 0.9900000000000000000 - 1 - 341 - 843 - - - 1860 - 0.9900000000000000000 - 1 - 342 - 857 - - - 1861 - 0.9900000000000000000 - 1 - 343 - 858 - - - 1862 - 0.9900000000000000000 - 1 - 343 - 859 - - - 1863 - 0.9900000000000000000 - 1 - 344 - 861 - - - 1864 - 0.9900000000000000000 - 1 - 344 - 863 - - - 1865 - 0.9900000000000000000 - 1 - 345 - 865 - - - 1866 - 0.9900000000000000000 - 1 - 345 - 867 - - - 1867 - 0.9900000000000000000 - 1 - 345 - 869 - - - 1868 - 0.9900000000000000000 - 1 - 345 - 871 - - - 1869 - 0.9900000000000000000 - 1 - 346 - 875 - - - 1870 - 0.9900000000000000000 - 1 - 346 - 879 - - - 1871 - 0.9900000000000000000 - 1 - 346 - 883 - - - 1872 - 0.9900000000000000000 - 1 - 346 - 887 - - - 1873 - 0.9900000000000000000 - 1 - 346 - 891 - - - 1874 - 0.9900000000000000000 - 1 - 346 - 895 - - - 1875 - 0.9900000000000000000 - 1 - 347 - 901 - - - 1876 - 0.9900000000000000000 - 1 - 347 - 907 - - - 1877 - 0.9900000000000000000 - 1 - 347 - 913 - - - 1878 - 0.9900000000000000000 - 1 - 347 - 919 - - - 1879 - 0.9900000000000000000 - 1 - 347 - 925 - - - 1880 - 0.9900000000000000000 - 1 - 347 - 931 - - - 1881 - 0.9900000000000000000 - 1 - 347 - 937 - - - 1882 - 0.9900000000000000000 - 1 - 347 - 943 - - - 1883 - 0.9900000000000000000 - 1 - 347 - 949 - - - 1884 - 0.9900000000000000000 - 1 - 348 - 958 - - - 1885 - 0.9900000000000000000 - 1 - 348 - 967 - - - 1886 - 0.9900000000000000000 - 1 - 348 - 976 - - - 1887 - 0.9900000000000000000 - 1 - 348 - 985 - - - 1888 - 0.9900000000000000000 - 1 - 348 - 994 - - - 1889 - 0.9900000000000000000 - 1 - 348 - 1003 - - - 1890 - 0.9900000000000000000 - 1 - 348 - 1012 - - - 1891 - 0.9900000000000000000 - 1 - 348 - 1021 - - - 1892 - 0.9900000000000000000 - 1 - 348 - 1030 - - - 1893 - 0.9900000000000000000 - 1 - 348 - 1039 - - - 1894 - 0.9900000000000000000 - 1 - 348 - 1048 - - - 1895 - 0.9900000000000000000 - 1 - 348 - 1057 - - - 1896 - 0.9900000000000000000 - 1 - 348 - 1066 - - - 1897 - 0.9900000000000000000 - 1 - 348 - 1075 - - - 1898 - 0.9900000000000000000 - 1 - 349 - 1089 - - - 1899 - 0.9900000000000000000 - 1 - 350 - 1090 - - - 1900 - 0.9900000000000000000 - 1 - 350 - 1091 - - - 1901 - 0.9900000000000000000 - 1 - 351 - 1093 - - - 1902 - 0.9900000000000000000 - 1 - 351 - 1095 - - - 1903 - 0.9900000000000000000 - 1 - 352 - 1097 - - - 1904 - 0.9900000000000000000 - 1 - 352 - 1099 - - - 1905 - 0.9900000000000000000 - 1 - 352 - 1101 - - - 1906 - 0.9900000000000000000 - 1 - 352 - 1103 - - - 1907 - 0.9900000000000000000 - 1 - 353 - 1107 - - - 1908 - 0.9900000000000000000 - 1 - 353 - 1111 - - - 1909 - 0.9900000000000000000 - 1 - 353 - 1115 - - - 1910 - 0.9900000000000000000 - 1 - 353 - 1119 - - - 1911 - 0.9900000000000000000 - 1 - 353 - 1123 - - - 1912 - 0.9900000000000000000 - 1 - 353 - 1127 - - - 1913 - 0.9900000000000000000 - 1 - 354 - 1133 - - - 1914 - 0.9900000000000000000 - 1 - 354 - 1139 - - - 1915 - 0.9900000000000000000 - 1 - 354 - 1145 - - - 1916 - 0.9900000000000000000 - 1 - 354 - 1151 - - - 1917 - 0.9900000000000000000 - 1 - 354 - 1157 - - - 1918 - 0.9900000000000000000 - 1 - 354 - 1163 - - - 1919 - 0.9900000000000000000 - 1 - 354 - 1169 - - - 1920 - 0.9900000000000000000 - 1 - 354 - 1175 - - - 1921 - 0.9900000000000000000 - 1 - 354 - 1181 - - - 1922 - 0.9900000000000000000 - 1 - 355 - 1190 - - - 1923 - 0.9900000000000000000 - 1 - 355 - 1199 - - - 1924 - 0.9900000000000000000 - 1 - 355 - 1208 - - - 1925 - 0.9900000000000000000 - 1 - 355 - 1217 - - - 1926 - 0.9900000000000000000 - 1 - 355 - 1226 - - - 1927 - 0.9900000000000000000 - 1 - 355 - 1235 - - - 1928 - 0.9900000000000000000 - 1 - 355 - 1244 - - - 1929 - 0.9900000000000000000 - 1 - 355 - 1253 - - - 1930 - 0.9900000000000000000 - 1 - 355 - 1262 - - - 1931 - 0.9900000000000000000 - 1 - 355 - 1271 - - - 1932 - 0.9900000000000000000 - 1 - 355 - 1280 - - - 1933 - 0.9900000000000000000 - 1 - 355 - 1289 - - - 1934 - 0.9900000000000000000 - 1 - 355 - 1298 - - - 1935 - 0.9900000000000000000 - 1 - 355 - 1307 - - - 1936 - 0.9900000000000000000 - 1 - 356 - 1321 - - - 1937 - 0.9900000000000000000 - 1 - 357 - 1322 - - - 1938 - 0.9900000000000000000 - 1 - 357 - 1323 - - - 1939 - 0.9900000000000000000 - 1 - 358 - 1325 - - - 1940 - 0.9900000000000000000 - 1 - 358 - 1327 - - - 1941 - 0.9900000000000000000 - 1 - 359 - 1329 - - - 1942 - 0.9900000000000000000 - 1 - 359 - 1331 - - - 1943 - 0.9900000000000000000 - 1 - 359 - 1333 - - - 1944 - 0.9900000000000000000 - 1 - 359 - 1335 - - - 1945 - 0.9900000000000000000 - 1 - 360 - 1339 - - - 1946 - 0.9900000000000000000 - 1 - 360 - 1343 - - - 1947 - 0.9900000000000000000 - 1 - 360 - 1347 - - - 1948 - 0.9900000000000000000 - 1 - 360 - 1351 - - - 1949 - 0.9900000000000000000 - 1 - 360 - 1355 - - - 1950 - 0.9900000000000000000 - 1 - 360 - 1359 - - - 1951 - 0.9900000000000000000 - 1 - 361 - 1365 - - - 1952 - 0.9900000000000000000 - 1 - 361 - 1371 - - - 1953 - 0.9900000000000000000 - 1 - 361 - 1377 - - - 1954 - 0.9900000000000000000 - 1 - 361 - 1383 - - - 1955 - 0.9900000000000000000 - 1 - 361 - 1389 - - - 1956 - 0.9900000000000000000 - 1 - 361 - 1395 - - - 1957 - 0.9900000000000000000 - 1 - 361 - 1401 - - - 1958 - 0.9900000000000000000 - 1 - 361 - 1407 - - - 1959 - 0.9900000000000000000 - 1 - 361 - 1413 - - - 1960 - 0.9900000000000000000 - 1 - 362 - 1422 - - - 1961 - 0.9900000000000000000 - 1 - 362 - 1431 - - - 1962 - 0.9900000000000000000 - 1 - 362 - 1440 - - - 1963 - 0.9900000000000000000 - 1 - 362 - 1449 - - - 1964 - 0.9900000000000000000 - 1 - 362 - 1458 - - - 1965 - 0.9900000000000000000 - 1 - 362 - 1467 - - - 1966 - 0.9900000000000000000 - 1 - 362 - 1476 - - - 1967 - 0.9900000000000000000 - 1 - 362 - 1485 - - - 1968 - 0.9900000000000000000 - 1 - 362 - 1494 - - - 1969 - 0.9900000000000000000 - 1 - 362 - 1503 - - - 1970 - 0.9900000000000000000 - 1 - 362 - 1512 - - - 1971 - 0.9900000000000000000 - 1 - 362 - 1521 - - - 1972 - 0.9900000000000000000 - 1 - 362 - 1530 - - - 1973 - 0.9900000000000000000 - 1 - 362 - 1539 - - - 1974 - 0.9900000000000000000 - 1 - 363 - 1553 - - - 1975 - 0.9900000000000000000 - 1 - 364 - 1554 - - - 1976 - 0.9900000000000000000 - 1 - 364 - 1555 - - - 1977 - 0.9900000000000000000 - 1 - 365 - 1557 - - - 1978 - 0.9900000000000000000 - 1 - 365 - 1559 - - - 1979 - 0.9900000000000000000 - 1 - 366 - 1561 - - - 1980 - 0.9900000000000000000 - 1 - 366 - 1563 - - - 1981 - 0.9900000000000000000 - 1 - 366 - 1565 - - - 1982 - 0.9900000000000000000 - 1 - 366 - 1567 - - - 1983 - 0.9900000000000000000 - 1 - 367 - 1571 - - - 1984 - 0.9900000000000000000 - 1 - 367 - 1575 - - - 1985 - 0.9900000000000000000 - 1 - 367 - 1579 - - - 1986 - 0.9900000000000000000 - 1 - 367 - 1583 - - - 1987 - 0.9900000000000000000 - 1 - 367 - 1587 - - - 1988 - 0.9900000000000000000 - 1 - 367 - 1591 - - - 1989 - 0.9900000000000000000 - 1 - 368 - 1597 - - - 1990 - 0.9900000000000000000 - 1 - 368 - 1603 - - - 1991 - 0.9900000000000000000 - 1 - 368 - 1609 - - - 1992 - 0.9900000000000000000 - 1 - 368 - 1615 - - - 1993 - 0.9900000000000000000 - 1 - 368 - 1621 - - - 1994 - 0.9900000000000000000 - 1 - 368 - 1627 - - - 1995 - 0.9900000000000000000 - 1 - 368 - 1633 - - - 1996 - 0.9900000000000000000 - 1 - 368 - 1639 - - - 1997 - 0.9900000000000000000 - 1 - 368 - 1645 - - - 1998 - 0.9900000000000000000 - 1 - 369 - 1654 - - - 1999 - 0.9900000000000000000 - 1 - 369 - 1663 - - - 2000 - 0.9900000000000000000 - 1 - 369 - 1672 - - - 2001 - 0.9900000000000000000 - 1 - 369 - 1681 - - - 2002 - 0.9900000000000000000 - 1 - 369 - 1690 - - - 2003 - 0.9900000000000000000 - 1 - 369 - 1699 - - - 2004 - 0.9900000000000000000 - 1 - 369 - 1708 - - - 2005 - 0.9900000000000000000 - 1 - 369 - 1717 - - - 2006 - 0.9900000000000000000 - 1 - 369 - 1726 - - - 2007 - 0.9900000000000000000 - 1 - 369 - 1735 - - - 2008 - 0.9900000000000000000 - 1 - 369 - 1744 - - - 2009 - 0.9900000000000000000 - 1 - 369 - 1753 - - - 2010 - 0.9900000000000000000 - 1 - 369 - 1762 - - - 2011 - 0.9900000000000000000 - 1 - 369 - 1771 - - - 2012 - 0.9900000000000000000 - 1 - 370 - 1785 - - - 2013 - 0.9900000000000000000 - 1 - 371 - 1786 - - - 2014 - 0.9900000000000000000 - 1 - 371 - 1787 - - - 2015 - 0.9900000000000000000 - 1 - 372 - 1789 - - - 2016 - 0.9900000000000000000 - 1 - 372 - 1791 - - - 2017 - 0.9900000000000000000 - 1 - 373 - 1793 - - - 2018 - 0.9900000000000000000 - 1 - 373 - 1795 - - - 2019 - 0.9900000000000000000 - 1 - 373 - 1797 - - - 2020 - 0.9900000000000000000 - 1 - 373 - 1799 - - - 2021 - 0.9900000000000000000 - 1 - 374 - 1803 - - - 2022 - 0.9900000000000000000 - 1 - 374 - 1807 - - - 2023 - 0.9900000000000000000 - 1 - 374 - 1811 - - - 2024 - 0.9900000000000000000 - 1 - 374 - 1815 - - - 2025 - 0.9900000000000000000 - 1 - 374 - 1819 - - - 2026 - 0.9900000000000000000 - 1 - 374 - 1823 - - - 2027 - 0.9900000000000000000 - 1 - 375 - 1829 - - - 2028 - 0.9900000000000000000 - 1 - 375 - 1835 - - - 2029 - 0.9900000000000000000 - 1 - 375 - 1841 - - - 2030 - 0.9900000000000000000 - 1 - 375 - 1847 - - - 2031 - 0.9900000000000000000 - 1 - 375 - 1853 - - - 2032 - 0.9900000000000000000 - 1 - 375 - 1859 - - - 2033 - 0.9900000000000000000 - 1 - 375 - 1865 - - - 2034 - 0.9900000000000000000 - 1 - 375 - 1871 - - - 2035 - 0.9900000000000000000 - 1 - 375 - 1877 - - - 2036 - 0.9900000000000000000 - 1 - 376 - 1886 - - - 2037 - 0.9900000000000000000 - 1 - 376 - 1895 - - - 2038 - 0.9900000000000000000 - 1 - 376 - 1904 - - - 2039 - 0.9900000000000000000 - 1 - 376 - 1913 - - - 2040 - 0.9900000000000000000 - 1 - 376 - 1922 - - - 2041 - 0.9900000000000000000 - 1 - 376 - 1931 - - - 2042 - 0.9900000000000000000 - 1 - 376 - 1940 - - - 2043 - 0.9900000000000000000 - 1 - 376 - 1949 - - - 2044 - 0.9900000000000000000 - 1 - 376 - 1958 - - - 2045 - 0.9900000000000000000 - 1 - 376 - 1967 - - - 2046 - 0.9900000000000000000 - 1 - 376 - 1976 - - - 2047 - 0.9900000000000000000 - 1 - 376 - 1985 - - - 2048 - 0.9900000000000000000 - 1 - 376 - 1994 - - - 2049 - 0.9900000000000000000 - 1 - 376 - 2003 - - - 2050 - 0.9900000000000000000 - 1 - 377 - 2017 - - - 2051 - 0.9900000000000000000 - 1 - 378 - 2018 - - - 2052 - 0.9900000000000000000 - 1 - 378 - 2019 - - - 2053 - 0.9900000000000000000 - 1 - 379 - 2021 - - - 2054 - 0.9900000000000000000 - 1 - 379 - 2023 - - - 2055 - 0.9900000000000000000 - 1 - 380 - 2025 - - - 2056 - 0.9900000000000000000 - 1 - 380 - 2027 - - - 2057 - 0.9900000000000000000 - 1 - 380 - 2029 - - - 2058 - 0.9900000000000000000 - 1 - 380 - 2031 - - - 2059 - 0.9900000000000000000 - 1 - 381 - 2035 - - - 2060 - 0.9900000000000000000 - 1 - 381 - 2039 - - - 2061 - 0.9900000000000000000 - 1 - 381 - 2043 - - - 2062 - 0.9900000000000000000 - 1 - 381 - 2047 - - - 2063 - 0.9900000000000000000 - 1 - 381 - 2051 - - - 2064 - 0.9900000000000000000 - 1 - 381 - 2055 - - - 2065 - 0.9900000000000000000 - 1 - 382 - 2061 - - - 2066 - 0.9900000000000000000 - 1 - 382 - 2067 - - - 2067 - 0.9900000000000000000 - 1 - 382 - 2073 - - - 2068 - 0.9900000000000000000 - 1 - 382 - 2079 - - - 2069 - 0.9900000000000000000 - 1 - 382 - 2085 - - - 2070 - 0.9900000000000000000 - 1 - 382 - 2091 - - - 2071 - 0.9900000000000000000 - 1 - 382 - 2097 - - - 2072 - 0.9900000000000000000 - 1 - 382 - 2103 - - - 2073 - 0.9900000000000000000 - 1 - 382 - 2109 - - - 2074 - 0.9900000000000000000 - 1 - 383 - 2118 - - - 2075 - 0.9900000000000000000 - 1 - 383 - 2127 - - - 2076 - 0.9900000000000000000 - 1 - 383 - 2136 - - - 2077 - 0.9900000000000000000 - 1 - 383 - 2145 - - - 2078 - 0.9900000000000000000 - 1 - 383 - 2154 - - - 2079 - 0.9900000000000000000 - 1 - 383 - 2163 - - - 2080 - 0.9900000000000000000 - 1 - 383 - 2172 - - - 2081 - 0.9900000000000000000 - 1 - 383 - 2181 - - - 2082 - 0.9900000000000000000 - 1 - 383 - 2190 - - - 2083 - 0.9900000000000000000 - 1 - 383 - 2199 - - - 2084 - 0.9900000000000000000 - 1 - 383 - 2208 - - - 2085 - 0.9900000000000000000 - 1 - 383 - 2217 - - - 2086 - 0.9900000000000000000 - 1 - 383 - 2226 - - - 2087 - 0.9900000000000000000 - 1 - 383 - 2235 - - - 2088 - 0.9900000000000000000 - 1 - 384 - 2249 - - - 2089 - 0.9900000000000000000 - 1 - 385 - 2250 - - - 2090 - 0.9900000000000000000 - 1 - 385 - 2251 - - - 2091 - 0.9900000000000000000 - 1 - 386 - 2253 - - - 2092 - 0.9900000000000000000 - 1 - 386 - 2255 - - - 2093 - 0.9900000000000000000 - 1 - 387 - 2257 - - - 2094 - 0.9900000000000000000 - 1 - 387 - 2259 - - - 2095 - 0.9900000000000000000 - 1 - 387 - 2261 - - - 2096 - 0.9900000000000000000 - 1 - 387 - 2263 - - - 2097 - 0.9900000000000000000 - 1 - 388 - 2267 - - - 2098 - 0.9900000000000000000 - 1 - 388 - 2271 - - - 2099 - 0.9900000000000000000 - 1 - 388 - 2275 - - - 2100 - 0.9900000000000000000 - 1 - 388 - 2279 - - - 2101 - 0.9900000000000000000 - 1 - 388 - 2283 - - - 2102 - 0.9900000000000000000 - 1 - 388 - 2287 - - - 2103 - 0.9900000000000000000 - 1 - 389 - 2293 - - - 2104 - 0.9900000000000000000 - 1 - 389 - 2299 - - - 2105 - 0.9900000000000000000 - 1 - 389 - 2305 - - - 2106 - 0.9900000000000000000 - 1 - 389 - 2311 - - - 2107 - 0.9900000000000000000 - 1 - 389 - 2317 - - - 2108 - 0.9900000000000000000 - 1 - 389 - 2323 - - - 2109 - 0.9900000000000000000 - 1 - 389 - 2329 - - - 2110 - 0.9900000000000000000 - 1 - 389 - 2335 - - - 2111 - 0.9900000000000000000 - 1 - 389 - 2341 - - - 2112 - 0.9900000000000000000 - 1 - 390 - 2350 - - - 2113 - 0.9900000000000000000 - 1 - 390 - 2359 - - - 2114 - 0.9900000000000000000 - 1 - 390 - 2368 - - - 2115 - 0.9900000000000000000 - 1 - 390 - 2377 - - - 2116 - 0.9900000000000000000 - 1 - 390 - 2386 - - - 2117 - 0.9900000000000000000 - 1 - 390 - 2395 - - - 2118 - 0.9900000000000000000 - 1 - 390 - 2404 - - - 2119 - 0.9900000000000000000 - 1 - 390 - 2413 - - - 2120 - 0.9900000000000000000 - 1 - 390 - 2422 - - - 2121 - 0.9900000000000000000 - 1 - 390 - 2431 - - - 2122 - 0.9900000000000000000 - 1 - 390 - 2440 - - - 2123 - 0.9900000000000000000 - 1 - 390 - 2449 - - - 2124 - 0.9900000000000000000 - 1 - 390 - 2458 - - - 2125 - 0.9900000000000000000 - 1 - 390 - 2467 - - - 2126 - 0.9900000000000000000 - 1 - 391 - 2481 - - - 2127 - 0.9900000000000000000 - 1 - 392 - 2482 - - - 2128 - 0.9900000000000000000 - 1 - 392 - 2483 - - - 2129 - 0.9900000000000000000 - 1 - 393 - 2485 - - - 2130 - 0.9900000000000000000 - 1 - 393 - 2487 - - - 2131 - 0.9900000000000000000 - 1 - 394 - 2489 - - - 2132 - 0.9900000000000000000 - 1 - 394 - 2491 - - - 2133 - 0.9900000000000000000 - 1 - 394 - 2493 - - - 2134 - 0.9900000000000000000 - 1 - 394 - 2495 - - - 2135 - 0.9900000000000000000 - 1 - 395 - 2499 - - - 2136 - 0.9900000000000000000 - 1 - 395 - 2503 - - - 2137 - 0.9900000000000000000 - 1 - 395 - 2507 - - - 2138 - 0.9900000000000000000 - 1 - 395 - 2511 - - - 2139 - 0.9900000000000000000 - 1 - 395 - 2515 - - - 2140 - 0.9900000000000000000 - 1 - 395 - 2519 - - - 2141 - 0.9900000000000000000 - 1 - 396 - 2525 - - - 2142 - 0.9900000000000000000 - 1 - 396 - 2531 - - - 2143 - 0.9900000000000000000 - 1 - 396 - 2537 - - - 2144 - 0.9900000000000000000 - 1 - 396 - 2543 - - - 2145 - 0.9900000000000000000 - 1 - 396 - 2549 - - - 2146 - 0.9900000000000000000 - 1 - 396 - 2555 - - - 2147 - 0.9900000000000000000 - 1 - 396 - 2561 - - - 2148 - 0.9900000000000000000 - 1 - 396 - 2567 - - - 2149 - 0.9900000000000000000 - 1 - 396 - 2573 - - - 2150 - 0.9900000000000000000 - 1 - 397 - 2582 - - - 2151 - 0.9900000000000000000 - 1 - 397 - 2591 - - - 2152 - 0.9900000000000000000 - 1 - 397 - 2600 - - - 2153 - 0.9900000000000000000 - 1 - 397 - 2609 - - - 2154 - 0.9900000000000000000 - 1 - 397 - 2618 - - - 2155 - 0.9900000000000000000 - 1 - 397 - 2627 - - - 2156 - 0.9900000000000000000 - 1 - 397 - 2636 - - - 2157 - 0.9900000000000000000 - 1 - 397 - 2645 - - - 2158 - 0.9900000000000000000 - 1 - 397 - 2654 - - - 2159 - 0.9900000000000000000 - 1 - 397 - 2663 - - - 2160 - 0.9900000000000000000 - 1 - 397 - 2672 - - - 2161 - 0.9900000000000000000 - 1 - 397 - 2681 - - - 2162 - 0.9900000000000000000 - 1 - 397 - 2690 - - - 2163 - 0.9900000000000000000 - 1 - 397 - 2699 - - - 2164 - 0.9900000000000000000 - 1 - 398 - 2713 - - - 2165 - 0.9900000000000000000 - 1 - 399 - 2714 - - - 2166 - 0.9900000000000000000 - 1 - 399 - 2715 - - - 2167 - 0.9900000000000000000 - 1 - 400 - 2717 - - - 2168 - 0.9900000000000000000 - 1 - 400 - 2719 - - - 2169 - 0.9900000000000000000 - 1 - 401 - 2721 - - - 2170 - 0.9900000000000000000 - 1 - 401 - 2723 - - - 2171 - 0.9900000000000000000 - 1 - 401 - 2725 - - - 2172 - 0.9900000000000000000 - 1 - 401 - 2727 - - - 2173 - 0.9900000000000000000 - 1 - 402 - 2731 - - - 2174 - 0.9900000000000000000 - 1 - 402 - 2735 - - - 2175 - 0.9900000000000000000 - 1 - 402 - 2739 - - - 2176 - 0.9900000000000000000 - 1 - 402 - 2743 - - - 2177 - 0.9900000000000000000 - 1 - 402 - 2747 - - - 2178 - 0.9900000000000000000 - 1 - 402 - 2751 - - - 2179 - 0.9900000000000000000 - 1 - 403 - 2757 - - - 2180 - 0.9900000000000000000 - 1 - 403 - 2763 - - - 2181 - 0.9900000000000000000 - 1 - 403 - 2769 - - - 2182 - 0.9900000000000000000 - 1 - 403 - 2775 - - - 2183 - 0.9900000000000000000 - 1 - 403 - 2781 - - - 2184 - 0.9900000000000000000 - 1 - 403 - 2787 - - - 2185 - 0.9900000000000000000 - 1 - 403 - 2793 - - - 2186 - 0.9900000000000000000 - 1 - 403 - 2799 - - - 2187 - 0.9900000000000000000 - 1 - 403 - 2805 - - - 2188 - 0.9900000000000000000 - 1 - 404 - 2814 - - - 2189 - 1.9900000000000000000 - 1 - 404 - 2823 - - - 2190 - 1.9900000000000000000 - 1 - 404 - 2832 - - - 2191 - 1.9900000000000000000 - 1 - 404 - 2841 - - - 2192 - 1.9900000000000000000 - 1 - 404 - 2850 - - - 2193 - 1.9900000000000000000 - 1 - 404 - 2859 - - - 2194 - 1.9900000000000000000 - 1 - 404 - 2868 - - - 2195 - 1.9900000000000000000 - 1 - 404 - 2877 - - - 2196 - 1.9900000000000000000 - 1 - 404 - 2886 - - - 2197 - 1.9900000000000000000 - 1 - 404 - 2895 - - - 2198 - 1.9900000000000000000 - 1 - 404 - 2904 - - - 2199 - 1.9900000000000000000 - 1 - 404 - 2913 - - - 2200 - 1.9900000000000000000 - 1 - 404 - 2922 - - - 2201 - 0.9900000000000000000 - 1 - 404 - 2931 - - - 2202 - 0.9900000000000000000 - 1 - 405 - 2945 - - - 2203 - 0.9900000000000000000 - 1 - 406 - 2946 - - - 2204 - 0.9900000000000000000 - 1 - 406 - 2947 - - - 2205 - 0.9900000000000000000 - 1 - 407 - 2949 - - - 2206 - 0.9900000000000000000 - 1 - 407 - 2951 - - - 2207 - 0.9900000000000000000 - 1 - 408 - 2953 - - - 2208 - 0.9900000000000000000 - 1 - 408 - 2955 - - - 2209 - 0.9900000000000000000 - 1 - 408 - 2957 - - - 2210 - 0.9900000000000000000 - 1 - 408 - 2959 - - - 2211 - 0.9900000000000000000 - 1 - 409 - 2963 - - - 2212 - 0.9900000000000000000 - 1 - 409 - 2967 - - - 2213 - 0.9900000000000000000 - 1 - 409 - 2971 - - - 2214 - 0.9900000000000000000 - 1 - 409 - 2975 - - - 2215 - 0.9900000000000000000 - 1 - 409 - 2979 - - - 2216 - 0.9900000000000000000 - 1 - 409 - 2983 - - - 2217 - 0.9900000000000000000 - 1 - 410 - 2989 - - - 2218 - 0.9900000000000000000 - 1 - 410 - 2995 - - - 2219 - 0.9900000000000000000 - 1 - 410 - 3001 - - - 2220 - 0.9900000000000000000 - 1 - 410 - 3007 - - - 2221 - 0.9900000000000000000 - 1 - 410 - 3013 - - - 2222 - 0.9900000000000000000 - 1 - 410 - 3019 - - - 2223 - 0.9900000000000000000 - 1 - 410 - 3025 - - - 2224 - 0.9900000000000000000 - 1 - 410 - 3031 - - - 2225 - 0.9900000000000000000 - 1 - 410 - 3037 - - - 2226 - 0.9900000000000000000 - 1 - 411 - 3046 - - - 2227 - 0.9900000000000000000 - 1 - 411 - 3055 - - - 2228 - 0.9900000000000000000 - 1 - 411 - 3064 - - - 2229 - 0.9900000000000000000 - 1 - 411 - 3073 - - - 2230 - 0.9900000000000000000 - 1 - 411 - 3082 - - - 2231 - 0.9900000000000000000 - 1 - 411 - 3091 - - - 2232 - 0.9900000000000000000 - 1 - 411 - 3100 - - - 2233 - 0.9900000000000000000 - 1 - 411 - 3109 - - - 2234 - 0.9900000000000000000 - 1 - 411 - 3118 - - - 2235 - 0.9900000000000000000 - 1 - 411 - 3127 - - - 2236 - 0.9900000000000000000 - 1 - 411 - 3136 - - - 2237 - 0.9900000000000000000 - 1 - 411 - 3145 - - - 2238 - 0.9900000000000000000 - 1 - 411 - 3154 - - - 2239 - 0.9900000000000000000 - 1 - 411 - 3163 - - - 2240 - 1.9900000000000000000 - 1 - 412 - 3177 - - - - - - System.Int32 - System.String - System.String - System.Int32 - System.Byte[] - System.Decimal - System.Int32 - System.Int32 - System.Int32 - System.Int32 - - - - 1 - For Those About To Rock (We Salute You) - Angus Young, Malcolm Young, Brian Johnson - 343719 - 9tEMc5MWVcyg+2MUpPUQ - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 2 - Balls to the Wall - - 342562 - n96Enog8b5l0yb7ccE3D - 0.9900000000000000000 - 2 - 2 - 1 - 1 - - - 3 - Fast As a Shark - F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman - 230619 - yQatCNLpHiTFP3Q= - 0.9900000000000000000 - 3 - 2 - 1 - 1 - - - 4 - Restless and Wild - F. Baltes, R.A. Smith-Diesel, S. Kaufman, U. Dirkscneider & W. Hoffman - 252051 - 04RlslHSyGAa - 0.9900000000000000000 - 3 - 2 - 1 - 1 - - - 5 - Princess of the Dawn - Deaffy & R.A. Smith-Diesel - 375418 - 2Llic//KV3lbUzfqSp4= - 0.9900000000000000000 - 3 - 2 - 1 - 1 - - - 6 - Put The Finger On You - Angus Young, Malcolm Young, Brian Johnson - 205662 - CPu1wGDZSMeYxu9jDIqehWI= - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 7 - Let's Get It Up - Angus Young, Malcolm Young, Brian Johnson - 233926 - 9i3zpl/qUw== - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 8 - Inject The Venom - Angus Young, Malcolm Young, Brian Johnson - 210834 - TOMhn+g6x2lJ1hOgufqQ - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 9 - Snowballed - Angus Young, Malcolm Young, Brian Johnson - 203102 - ya0PZkvuvQ== - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 10 - Evil Walks - Angus Young, Malcolm Young, Brian Johnson - 263497 - 1IxUcFVim8psk4xkpfjd - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 11 - C.O.D. - Angus Young, Malcolm Young, Brian Johnson - 199836 - nKJBx3LCpPudAdyy2g== - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 12 - Breaking The Rules - Angus Young, Malcolm Young, Brian Johnson - 263288 - gV4lVMpb5VYU5jpIMyU= - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 13 - Night Of The Long Knives - Angus Young, Malcolm Young, Brian Johnson - 205688 - K0zRz1rKqKz2WxLoWNM= - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 14 - Spellbound - Angus Young, Malcolm Young, Brian Johnson - 270863 - hunwgBIuPg== - 0.9900000000000000000 - 1 - 1 - 1 - 1 - - - 15 - Go Down - AC/DC - 331180 - LYHPRY5bjSqPfo4= - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 16 - Dog Eat Dog - AC/DC - 215196 - tQrjgCHZsS/4 - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 17 - Let There Be Rock - AC/DC - 366654 - c4yDwF9RWLMTPuz7o02KhQ== - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 18 - Bad Boy Boogie - AC/DC - 267728 - UWgxgmnKYJ97BW8= - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 19 - Problem Child - AC/DC - 325041 - OX0OWHUOQ8LO+zs= - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 20 - Overdose - AC/DC - 369319 - 22pPhbpnlvWcv2DHxzUJwiIh - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 21 - Hell Ain't A Bad Place To Be - AC/DC - 254380 - S+hU2sHdoi4+R8NKVSxfp/96 - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 22 - Whole Lotta Rosie - AC/DC - 323761 - 5RRvecF5HUeQPwWA - 0.9900000000000000000 - 4 - 1 - 1 - 1 - - - 23 - Walk On Water - Steven Tyler, Joe Perry, Jack Blades, Tommy Shaw - 295680 - rRfw6YaQjacXOVeu - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 24 - Love In An Elevator - Steven Tyler, Joe Perry - 321828 - dQqaaI4KR0c8z9tuk2Gklg== - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 25 - Rag Doll - Steven Tyler, Joe Perry, Jim Vallance, Holly Knight - 264698 - 7jnHI5w9PHUgbu0zzdsYy+c= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 26 - What It Takes - Steven Tyler, Joe Perry, Desmond Child - 310622 - Eq0osPo4WHFIFHvzL+kRBUod - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 27 - Dude (Looks Like A Lady) - Steven Tyler, Joe Perry, Desmond Child - 264855 - ttjNXfJum1oTbvQ= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 28 - Janie's Got A Gun - Steven Tyler, Tom Hamilton - 330736 - oqtdkenpPj+Oyys= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 29 - Cryin' - Steven Tyler, Joe Perry, Taylor Rhodes - 309263 - J/osPwMix5D75DErRU82Ql7eRA== - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 30 - Amazing - Steven Tyler, Richie Supa - 356519 - VFHYR9JXJxwM3Q== - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 31 - Blind Man - Steven Tyler, Joe Perry, Taylor Rhodes - 240718 - 6q3YNvdBXFY= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 32 - Deuces Are Wild - Steven Tyler, Jim Vallance - 215875 - pmPIvnkxTJqy++Cvhieg1iI= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 33 - The Other Side - Steven Tyler, Jim Vallance - 244375 - bKz6q4Qdi0d+ - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 34 - Crazy - Steven Tyler, Joe Perry, Desmond Child - 316656 - GT4AAodTXA== - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 35 - Eat The Rich - Steven Tyler, Joe Perry, Jim Vallance - 251036 - iRnNoAqNaRD9qWOFN18= - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 36 - Angel - Steven Tyler, Desmond Child - 307617 - XO+q9vreqjMys9+BdPreKDLL - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 37 - Livin' On The Edge - Steven Tyler, Joe Perry, Mark Hudson - 381231 - TQkXzKFsQnQf4Q== - 0.9900000000000000000 - 5 - 1 - 1 - 1 - - - 38 - All I Really Want - Alanis Morissette & Glenn Ballard - 284891 - +DW5aaQS3A== - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 39 - You Oughta Know - Alanis Morissette & Glenn Ballard - 249234 - YhHe5ZrsKwz1FR6AMbqHEctE - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 40 - Perfect - Alanis Morissette & Glenn Ballard - 188133 - CYm4aopRT7qpxwpWzEvU - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 41 - Hand In My Pocket - Alanis Morissette & Glenn Ballard - 221570 - nm8jfN91YA== - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 42 - Right Through You - Alanis Morissette & Glenn Ballard - 176117 - XgBgsT6uqJ5f7tPUqadTk0sx - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 43 - Forgiven - Alanis Morissette & Glenn Ballard - 300355 - Reu+UjVcUeiiqMhEkylr - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 44 - You Learn - Alanis Morissette & Glenn Ballard - 239699 - ifCefPsfa/beeAC/9xs= - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 45 - Head Over Feet - Alanis Morissette & Glenn Ballard - 267493 - Ma30GmGgritV7MYF9Q== - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 46 - Mary Jane - Alanis Morissette & Glenn Ballard - 280607 - qj+rPZvJoq0= - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 47 - Ironic - Alanis Morissette & Glenn Ballard - 229825 - hiZ/yHS8XJHxhg== - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 48 - Not The Doctor - Alanis Morissette & Glenn Ballard - 227631 - l5afDgpr28VIjzQZdl80OFSB - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 49 - Wake Up - Alanis Morissette & Glenn Ballard - 293485 - UuyE+G304tc6bvlb1X8= - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 50 - You Oughta Know (Alternate) - Alanis Morissette & Glenn Ballard - 491885 - /xOfnTMw7t1kJVEMCWhAhAcP - 0.9900000000000000000 - 6 - 1 - 1 - 1 - - - 51 - We Die Young - Jerry Cantrell - 152084 - NCwSnjIaJ5OhVk80X5o= - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 52 - Man In The Box - Jerry Cantrell, Layne Staley - 286641 - XyCYt04rZA8f - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 53 - Sea Of Sorrow - Jerry Cantrell - 349831 - G+fYb/nq8Us/S7DtdG2C - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 54 - Bleed The Freak - Jerry Cantrell - 241946 - nEyHFfDxcnAIH+tQwWrQHfM= - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 55 - I Can't Remember - Jerry Cantrell, Layne Staley - 222955 - FjNOJKdrXek= - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 56 - Love, Hate, Love - Jerry Cantrell, Layne Staley - 387134 - T+hyrCo0Qo4Xhwrh - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 57 - It Ain't Like That - Jerry Cantrell, Michael Starr, Sean Kinney - 277577 - dGhm2v+hidV7k/qoV0+8eKQ= - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 58 - Sunshine - Jerry Cantrell - 284969 - twfRI4eWcsAbfts= - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 59 - Put You Down - Jerry Cantrell - 196231 - lejq7L7lvc1svF9L01V4 - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 60 - Confusion - Jerry Cantrell, Michael Starr, Layne Staley - 344163 - 0+WFFnJsU9pYUOHQZz6G - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 61 - I Know Somethin (Bout You) - Jerry Cantrell - 261955 - +cL+Eb1qkNe61677p4ZPMg== - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 62 - Real Thing - Jerry Cantrell, Layne Staley - 243879 - bu02+cRGKJUPlG4E7WUu - 0.9900000000000000000 - 7 - 1 - 1 - 1 - - - 63 - Desafinado - - 185338 - VFERV2ZGaFSuXJq9VzLRAK6y - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 64 - Garota De Ipanema - - 285048 - UVARNXzVfK7WItLNcYA= - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 65 - Samba De Uma Nota Só (One Note Samba) - - 137273 - UjU+27YnhOFKaKtq - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 66 - Por Causa De Você - - 169900 - 3MJtVTps3OVD - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 67 - Ligia - - 251977 - lYHqmJIx3I8pPZLgnMLT+9LN - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 68 - Fotografia - - 129227 - xszQaj/REw== - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 69 - Dindi (Dindi) - - 253178 - fJIFo98PGahZ - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 70 - Se Todos Fossem Iguais A Você (Instrumental) - - 134948 - jvGwbtmCLar8 - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 71 - Falando De Amor - - 219663 - q4I+mg93fE7EF6vHfg== - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 72 - Angela - - 169508 - X/wjmrPQgxl6L0M= - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 73 - Corcovado (Quiet Nights Of Quiet Stars) - - 205662 - vVfzTjyU1O4K+lNrk2c= - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 74 - Outra Vez - - 126511 - yuRBIMdzNA/cXpI= - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 75 - O Boto (Bôto) - - 366837 - K6GRBw5WNLokW3baFvI= - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 76 - Canta, Canta Mais - - 271856 - cmSouAZLPg== - 0.9900000000000000000 - 8 - 1 - 2 - 1 - - - 77 - Enter Sandman - Apocalyptica - 221701 - NTgOe2iJSBfwqg== - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 78 - Master Of Puppets - Apocalyptica - 436453 - qUx48kQUX60= - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 79 - Harvester Of Sorrow - Apocalyptica - 374543 - b21mCtXjwaozpYus - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 80 - The Unforgiven - Apocalyptica - 322925 - 6FzPANrLMNxEhQ== - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 81 - Sad But True - Apocalyptica - 288208 - eUlD+XFkpKed0UrH0QSmhcc= - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 82 - Creeping Death - Apocalyptica - 308035 - 40oe8LtkHCNEOZN8kSvoNpCM - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 83 - Wherever I May Roam - Apocalyptica - 369345 - yDnPAeQOHJ6U/fs0Rmk+YDo= - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 84 - Welcome Home (Sanitarium) - Apocalyptica - 350197 - iI3f3U4fahMhPx7fm3MZ - 0.9900000000000000000 - 9 - 1 - 3 - 1 - - - 85 - Cochise - Audioslave/Chris Cornell - 222380 - /2QTSTnin8WHJUk= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 86 - Show Me How to Live - Audioslave/Chris Cornell - 277890 - TBNSyq0jCP/A6uuwltDs3H+1Yg== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 87 - Gasoline - Audioslave/Chris Cornell - 279457 - GmFp2Uzx2Q== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 88 - What You Are - Audioslave/Chris Cornell - 249391 - 7RlVKNVlxg3tVDJ3axokFA== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 89 - Like a Stone - Audioslave/Chris Cornell - 294034 - Y7Jp9sNG0sLB6uupeQ== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 90 - Set It Off - Audioslave/Chris Cornell - 263262 - vEpiEaaVwtoxCd7uKoI= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 91 - Shadow on the Sun - Audioslave/Chris Cornell - 343457 - HAA8VGDpPm+vKtOCZRR722M= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 92 - I am the Highway - Audioslave/Chris Cornell - 334942 - 1nYtCAl+f7Y= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 93 - Exploder - Audioslave/Chris Cornell - 206053 - gV8X1BtP2KTpr1QY - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 94 - Hypnotize - Audioslave/Chris Cornell - 206628 - fdqz59ISXca2Lnp6VAy9FA== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 95 - Bring'em Back Alive - Audioslave/Chris Cornell - 329534 - vtWpYb0QmFW4Mo1wkSwPWw== - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 96 - Light My Way - Audioslave/Chris Cornell - 303595 - +FJVIqtsWcI= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 97 - Getaway Car - Audioslave/Chris Cornell - 299598 - MZxZx0Iaj/Pxf28= - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 98 - The Last Remaining Light - Audioslave/Chris Cornell - 317492 - wMoakRrg0FUkAmsf - 0.9900000000000000000 - 10 - 1 - 1 - 1 - - - 99 - Your Time Has Come - Cornell, Commerford, Morello, Wilk - 255529 - FGq/1BJpUJ7x3vz88e9y4J46 - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 100 - Out Of Exile - Cornell, Commerford, Morello, Wilk - 291291 - 6xA3iDqRkQ== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 101 - Be Yourself - Cornell, Commerford, Morello, Wilk - 279484 - iWymLzA5ti6w0B7eFR+TzusdlQ== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 102 - Doesn't Remind Me - Cornell, Commerford, Morello, Wilk - 255869 - 8F11hsfbNADc4oRDgd3GMkqv - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 103 - Drown Me Slowly - Cornell, Commerford, Morello, Wilk - 233691 - wjvBwg9/XHrM - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 104 - Heaven's Dead - Cornell, Commerford, Morello, Wilk - 276688 - aJwd+2ibK/cgaA== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 105 - The Worm - Cornell, Commerford, Morello, Wilk - 237714 - BbVRzUzbXTdYYYM8UQ== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 106 - Man Or Animal - Cornell, Commerford, Morello, Wilk - 233195 - 7S+bZQZrYWiCc0VnRxlCmjoqRw== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 107 - Yesterday To Tomorrow - Cornell, Commerford, Morello, Wilk - 273763 - vIVv9MKj/0JzHOVgyyh6bA== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 108 - Dandelion - Cornell, Commerford, Morello, Wilk - 278125 - kRn9850z3ofllEP1vSY= - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 109 - #1 Zero - Cornell, Commerford, Morello, Wilk - 299102 - 9doWaL+mo2NsHvRm - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 110 - The Curse - Cornell, Commerford, Morello, Wilk - 309786 - 5ZsentYKqRBKhB5SkQ== - 0.9900000000000000000 - 11 - 1 - 4 - 1 - - - 111 - Money - Berry Gordy, Jr./Janie Bradford - 147591 - 3A+7TbX1i2rxEhKs6u22 - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 112 - Long Tall Sally - Enotris Johnson/Little Richard/Robert "Bumps" Blackwell - 106396 - 1KjMT6JKdqQfs3xIq1X3Fi45xg== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 113 - Bad Boy - Larry Williams - 116088 - sNE/cQJ6qguMKiC7WbmvdQ== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 114 - Twist And Shout - Bert Russell/Phil Medley - 161123 - QcqSmRYtAQ== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 115 - Please Mr. Postman - Brian Holland/Freddie Gorman/Georgia Dobbins/Robert Bateman/William Garrett - 137639 - Qr+bGvx9sCdj4A== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 116 - C'Mon Everybody - Eddie Cochran/Jerry Capehart - 140199 - aVtMJ59qF/U= - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 117 - Rock 'N' Roll Music - Chuck Berry - 141923 - wO7xpYKP7W80upmjPg== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 118 - Slow Down - Larry Williams - 163265 - v7oP8ZCsb5T22KwMKvSi8w== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 119 - Roadrunner - Bo Diddley - 143595 - /jhuuFPN9Zg= - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 120 - Carol - Chuck Berry - 143830 - kEDzqEZfK2OMbQ== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 121 - Good Golly Miss Molly - Little Richard - 106266 - eIdIIyz4Gfh1ZfjNQIuaa88/aw== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 122 - 20 Flight Rock - Ned Fairchild - 107807 - GVkkHC+hTpJN4cdoNWO2dw== - 0.9900000000000000000 - 12 - 1 - 5 - 1 - - - 123 - Quadrant - Billy Cobham - 261851 - SoxbtP0iB5hzsh2r81s= - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 124 - Snoopy's search-Red baron - Billy Cobham - 456071 - IIB2H2Ms9Iqp - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 125 - Spanish moss-"A sound portrait"-Spanish moss - Billy Cobham - 248084 - q5SdkJfd1CM= - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 126 - Moon germs - Billy Cobham - 294060 - hbIQNxw2HYS87jDmWYWjR7Ts - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 127 - Stratus - Billy Cobham - 582086 - FMNWAbItUY0= - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 128 - The pleasant pheasant - Billy Cobham - 318066 - B9vVSIh31XEQSFro - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 129 - Solo-Panhandler - Billy Cobham - 246151 - qDibeKBRD/pJ4g== - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 130 - Do what cha wanna - George Duke - 274155 - PQ+4L7FdCg== - 0.9900000000000000000 - 13 - 1 - 2 - 1 - - - 131 - Intro/ Low Down - - 323683 - qLN84BnoXuGvMTZskq7NGh4= - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 132 - 13 Years Of Grief - - 246987 - OY3/fm6++A== - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 133 - Stronger Than Death - - 300747 - Cni/psCyPo8/kitX - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 134 - All For You - - 235833 - kEJwX8gSdl2P - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 135 - Super Terrorizer - - 319373 - nRBLJH3KKkS96DTd5SIIcYMu - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 136 - Phoney Smile Fake Hellos - - 273606 - bjvvxuOoSo8fpqyBiHs2 - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 137 - Lost My Better Half - - 284081 - lnSOwcQVTm5vTrJcTVZW - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 138 - Bored To Tears - - 247327 - SFkgBq5JZ3s= - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 139 - A.N.D.R.O.T.A.Z. - - 266266 - OgqeEWarYq8Acvz1bT9Z - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 140 - Born To Booze - - 282122 - gFeV9u1CyA== - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 141 - World Of Trouble - - 359157 - HTkuWy9zTA0SjokKr10JolCt - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 142 - No More Tears - - 555075 - 5FmZ2xrGGS4= - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 143 - The Begining... At Last - - 365662 - 0YVE+EFO9Cx9Bn+N - 0.9900000000000000000 - 14 - 1 - 3 - 1 - - - 144 - Heart Of Gold - - 194873 - 7+LetU49I07z - 0.9900000000000000000 - 15 - 1 - 3 - 1 - - - 145 - Snowblind - - 420022 - QPXk9oNeFJQWRVk7jUmQyGE= - 0.9900000000000000000 - 15 - 1 - 3 - 1 - - - 146 - Like A Bird - - 276532 - 3CVJLb+9arb8ZHjcCqPe3wQDXA== - 0.9900000000000000000 - 15 - 1 - 3 - 1 - - - 147 - Blood In The Wall - - 284368 - cM1ocmlIzLNVlCSF27pxzVwSNQ== - 0.9900000000000000000 - 15 - 1 - 3 - 1 - - - 148 - The Beginning...At Last - - 271960 - jMxirxs5OrVdrUWNawn4DrzWxA== - 0.9900000000000000000 - 15 - 1 - 3 - 1 - - - 149 - Black Sabbath - - 382066 - 8bZhZz/yAFA= - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 150 - The Wizard - - 264829 - EIPxzjXLpA== - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 151 - Behind The Wall Of Sleep - - 217573 - uFYwDRZVqE+XGdLC - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 152 - N.I.B. - - 368770 - EYVOvjXVa/pv - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 153 - Evil Woman - - 204930 - OOqDTSpUvjU9U6ME - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 154 - Sleeping Village - - 644571 - lGnaYLgYqNgu - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 155 - Warning - - 212062 - zv/+og8A9jhwSC33I5II - 0.9900000000000000000 - 16 - 1 - 3 - 1 - - - 156 - Wheels Of Confusion / The Straightener - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 494524 - +tjjlG6/DAS6VVp0suLHUAlctA== - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 157 - Tomorrow's Dream - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 192496 - K7KuNUcbMrtSnEVIWDodz/SaHw== - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 158 - Changes - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 286275 - 8vnnuqWCho2A3O3G3bpSSCquTQ== - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 159 - FX - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 103157 - jVGyHQ8SHHfE+FtvPaVb - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 160 - Supernaut - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 285779 - yvSPxJSkOnaufmqd6NWl - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 161 - Snowblind - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 331676 - TcuBoEfJq5NlDsiIgH4= - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 162 - Cornucopia - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 234814 - N18ffTUeiL7o - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 163 - Laguna Sunrise - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 173087 - O2+Qp36O71MVIXIkuusASA== - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 164 - St. Vitus Dance - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 149655 - X4bcsvUv9TI+yVdvJ8QMmYo= - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 165 - Under The Sun/Every Day Comes and Goes - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 350458 - Whrs5n/ZNWtdFhOk - 0.9900000000000000000 - 17 - 1 - 3 - 1 - - - 166 - Smoked Pork - - 47333 - fe0iKTgMZEY/m3RAxZjj7Vxl - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 167 - Body Count's In The House - - 204251 - MOClLg94BgJ8itI= - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 168 - Now Sports - - 4884 - H5mV2YIEm9SNJcUbfnc= - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 169 - Body Count - - 317936 - ukFRfQCxiXM= - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 170 - A Statistic - - 6373 - 174TsTIJ57xsvFWmL75h6ME= - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 171 - Bowels Of The Devil - - 223216 - /Aoaiq+Y0kvBKwzSLZU= - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 172 - The Real Problem - - 11650 - QQLD8eqihD4JrsIh/4uD75U+ - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 173 - KKK Bitch - - 173008 - jGk4TA563uZHvK+aj7+A7Q== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 174 - D Note - - 95738 - nffW73jMEdztdtLAPjt3kw0J - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 175 - Voodoo - - 300721 - CbW1dgu7PIJZEzJhfp3H - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 176 - The Winner Loses - - 392254 - nmgwFJwncCAEDA== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 177 - There Goes The Neighborhood - - 350171 - CYA4B4G2xOQG6IDLMztKuA== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 178 - Oprah - - 6635 - uxVUInbp2Svd9B/hRQ== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 179 - Evil Dick - - 239020 - cv+WMgEgC7Cqug== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 180 - Body Count Anthem - - 166426 - wGkdnPzYUg== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 181 - Momma's Gotta Die Tonight - - 371539 - pmXvtwKSl1/cpMKkAsFUDcud - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 182 - Freedom Of Speech - - 281234 - SJe9CmqaaQ== - 0.9900000000000000000 - 18 - 1 - 4 - 1 - - - 183 - King In Crimson - Roy Z - 283167 - f7uO4BvNcp4ug0eTn2rBLwvoFQ== - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 184 - Chemical Wedding - Roy Z - 246177 - /xUQ0F7PCtfoW4Q= - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 185 - The Tower - Roy Z - 285257 - mNwXpE3DptePIiWJhApp3dWN/g== - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 186 - Killing Floor - Adrian Smith - 269557 - hbO2aau9gkzDm7bT/ir6wlI= - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 187 - Book Of Thel - Eddie Casillas/Roy Z - 494393 - 4khBPibd74ZMVGYs - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 188 - Gates Of Urizen - Roy Z - 265351 - W1wDl+UmrfmPQVoU9GxSi1kQ - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 189 - Jerusalem - Roy Z - 402390 - i7irtj9Gjdh5 - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 190 - Trupets Of Jericho - Roy Z - 359131 - cS3ll5lbd/uSFZykJFIG5yo= - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 191 - Machine Men - Adrian Smith - 341655 - cZ3680TAoEmv - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 192 - The Alchemist - Roy Z - 509413 - w1FYTjTUHhN0fVoR2o/G - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 193 - Realword - Roy Z - 237531 - CeaTWbBYHFpn2yl96SX2 - 0.9900000000000000000 - 19 - 1 - 3 - 1 - - - 194 - First Time I Met The Blues - Eurreal Montgomery - 140434 - q9E4Qb1OcFA08nKt12DDay1J - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 195 - Let Me Love You Baby - Willie Dixon - 175386 - urVW9Wo0/eZYqqAp - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 196 - Stone Crazy - Buddy Guy - 433397 - hgtlCVeEPbt1QyS95m+DBg== - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 197 - Pretty Baby - Willie Dixon - 237662 - vlCgbjuaVdzODL9nGKWTyCImzA== - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 198 - When My Left Eye Jumps - Al Perkins/Willie Dixon - 235311 - uRSoDPpEcTE3g8V54D/rT4k= - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 199 - Leave My Girl Alone - Buddy Guy - 204721 - S3AQLYl3fVRcnpD0xEi3DF+q - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 200 - She Suits Me To A Tee - Buddy Guy - 136803 - lHT3KCOkSkdGh9k= - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 201 - Keep It To Myself (Aka Keep It To Yourself) - Sonny Boy Williamson (I) - 166060 - RD9B21vqjIswjqbn06BCv3zC0w== - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 202 - My Time After Awhile - Robert Geddins/Ron Badger/Sheldon Feinberg - 182491 - Qaf1bFRI7Ig+MDfMg+RMtYI= - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 203 - Too Many Ways (Alternate) - Willie Dixon - 135053 - WyHTH3cFzQ9VgmGKyoOz+Xid - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 204 - Talkin' 'Bout Women Obviously - Amos Blakemore/Buddy Guy - 589531 - 1IYT/QNM/1fZZO9UjT0= - 0.9900000000000000000 - 20 - 1 - 6 - 1 - - - 205 - Jorge Da Capadócia - Jorge Ben - 177397 - ZrIMIi/vn0TzaSezZrMZiWs= - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 206 - Prenda Minha - Tradicional - 99369 - bK3mSCPP0neu - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 207 - Meditação - Tom Jobim - Newton Mendoça - 148793 - qmUu1E27HQHs - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 208 - Terra - Caetano Veloso - 482429 - bVk1QR+T25iZpL/ag6U= - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 209 - Eclipse Oculto - Caetano Veloso - 221936 - jycdjj1Pt0Gqmo07U2aqlRic - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 210 - Texto "Verdade Tropical" - Caetano Veloso - 84088 - QRJ4pCiP8zrdCTTP4YmzvpP/cg== - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 211 - Bem Devagar - Gilberto Gil - 133172 - B7YXiqeSWIgy7w6nPm5jDheC - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 212 - Drão - Gilberto Gil - 156264 - /kkU2Td2yquyn6gWlabs - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 213 - Saudosismo - Caetano Veloso - 144326 - i/rt/ZY3awju+4yRcyWl - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 214 - Carolina - Chico Buarque - 181812 - EAtzZvLc3xTd5qboidh4 - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 215 - Sozinho - Peninha - 190589 - UWHYEyqFXcfdDA== - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 216 - Esse Cara - Caetano Veloso - 223111 - POk4OIz6AQ== - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 217 - Mel - Caetano Veloso - Waly Salomão - 294765 - ijKGG64a2B+w - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 218 - Linha Do Equador - Caetano Veloso - Djavan - 299337 - g34Wgos/EUyRfA== - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 219 - Odara - Caetano Veloso - 141270 - rayI5fGjKqStGe2H0u7Oy0Up+A== - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 220 - A Luz De Tieta - Caetano Veloso - 251742 - Za02Wo7Uul74Jj8= - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 221 - Atrás Da Verd-E-Rosa Só Não Vai Quem Já Morreu - David Corrêa - Paulinho Carvalho - Carlos Sena - Bira do Ponto - 307252 - hXvchv01vXeuewJ3 - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 222 - Vida Boa - Fausto Nilo - Armandinho - 281730 - 9kSUvHTLI5grJf92 - 0.9900000000000000000 - 21 - 1 - 7 - 1 - - - 223 - Sozinho (Hitmakers Classic Mix) - - 436636 - VxzpzKuG2YQCVg== - 0.9900000000000000000 - 22 - 1 - 7 - 1 - - - 224 - Sozinho (Hitmakers Classic Radio Edit) - - 195004 - SM4Qa4Gi6qu+xZiQJaE= - 0.9900000000000000000 - 22 - 1 - 7 - 1 - - - 225 - Sozinho (Caêdrum 'n' Bass) - - 328071 - WhzQWlbdEM7eoY4= - 0.9900000000000000000 - 22 - 1 - 7 - 1 - - - 226 - Carolina - - 163056 - z3ueEfPtgnSmuw== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 227 - Essa Moça Ta Diferente - - 167235 - F4g6VLdpv4zDKic= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 228 - Vai Passar - - 369763 - vbOoADQ4/zHK8sAbLyCzpKKjLQ== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 229 - Samba De Orly - - 162429 - n2W50huJWGU= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 230 - Bye, Bye Brasil - - 283402 - FMu3qE/hXUvsTjym - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 231 - Atras Da Porta - - 189675 - 7CTHHySXtQ== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 232 - Tatuagem - - 172120 - 6h/9SYxX+tblq+CZErYnCXLg - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 233 - O Que Será (À Flor Da Terra) - - 167288 - VVi1VfE3FQ== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 234 - Morena De Angola - - 186801 - lAr8ZMCwBCmruV7CiWN1Bw== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 235 - Apesar De Você - - 234501 - Ww13Nv2+rA== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 236 - A Banda - - 132493 - WF/BNcoMEXffZsvoRh/oDYx8Tw== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 237 - Minha Historia - - 182256 - HbXy462ylSqdQpZLTyBnUUL04A== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 238 - Com Açúcar E Com Afeto - - 175386 - TEuq/akfXDwkaqmA - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 239 - Brejo Da Cruz - - 214099 - mCajbN6HGHfn2pzPgA== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 240 - Meu Caro Amigo - - 260257 - JbeXy5ebocfS - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 241 - Geni E O Zepelim - - 317570 - 9TqOVVgFM5kV3A== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 242 - Trocando Em Miúdos - - 169717 - +sTkZG3INWU= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 243 - Vai Trabalhar Vagabundo - - 139154 - Di0phTaEjZ8S5c3RU5d3 - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 244 - Gota D'água - - 153208 - +cIe4qcDuaPiK/M= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 245 - Construção / Deus Lhe Pague - - 383059 - ZirTa2Fh/ccRCB7U - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 246 - Mateus Enter - Chico Science - 33149 - k4cwDuWnLG3BcwU= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 247 - O Cidadão Do Mundo - Chico Science - 200933 - gskKc4WjC5HaOOc= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 248 - Etnia - Chico Science - 152555 - Ym/xmq+R8aRKaRN8iZX8hMZE - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 249 - Quilombo Groove (Instrumental) - Chico Science - 151823 - ts5U35jyU4xkE0M= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 250 - Macô - Chico Science - 249600 - W58erHa1kr0vgmHNGA== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 251 - Um Passeio No Mundo Livre - Chico Science - 240091 - jurwp4fKlZMx - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 252 - Samba Do Lado - Chico Science - 227317 - DZBZqFsFjJEGzLjcauiGzg== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 253 - Maracatu Atômico - Chico Science - 284264 - h3UzbYfG4mNp - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 254 - O Encontro De Isaac Asimov Com Santos Dumont No Céu - Chico Science - 99108 - vYt4B8dt2p7lXOlhKfY= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 255 - Corpo De Lama - Chico Science - 232672 - xkz+soAHIA== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 256 - Sobremesa - Chico Science - 240091 - lg4d/taGyXZF8mrPBY7E8G4= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 257 - Manguetown - Chico Science - 194560 - SqBySiVMPZ3AeuSx6ZOc0g== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 258 - Um Satélite Na Cabeça - Chico Science - 126615 - +apvBBcb5aRuvyY= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 259 - Baião Ambiental (Instrumental) - Chico Science - 152659 - OIcOQ/C9gEZM6dHAOQ== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 260 - Sangue De Bairro - Chico Science - 132231 - T5KTCdYyMqvLRf+LMoSMpbaMFg== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 261 - Enquanto O Mundo Explode - Chico Science - 88764 - iPLWbfjVHIyWENmuyg== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 262 - Interlude Zumbi - Chico Science - 71627 - zFMQZen0l4y7yERki/u6pjI= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 263 - Criança De Domingo - Chico Science - 208222 - qmc9XLwmEQAWphW7 - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 264 - Amor De Muito - Chico Science - 175333 - UMHguDmUUaMiOvs2DSmUSiDR - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 265 - Samidarish (Instrumental) - Chico Science - 272431 - 3ZUEYxRvlupU6N3xdv9c - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 266 - Maracatu Atômico (Atomic Version) - Chico Science - 273084 - o6tDgRHhoYgsQSWu/H219dQl3g== - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 267 - Maracatu Atômico (Ragga Mix) - Chico Science - 210155 - TF7MSKKq/bpESYQ2sDXw - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 268 - Maracatu Atômico (Trip Hop) - Chico Science - 221492 - 3VDd/PR7NtJJ6O0= - 0.9900000000000000000 - 24 - 1 - 7 - 1 - - - 269 - Banditismo Por Uma Questa - - 307095 - MugcUSGGp0Xe+t9n4+ZE4rzu - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 270 - Banditismo Por Uma Questa - - 243644 - x4wWF4NI4uLQJ/k= - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 271 - Rios Pontes & Overdrives - - 286720 - urwmh1wtMxUqjQ== - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 272 - Cidade - - 216346 - wONxdhgNN1QW - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 273 - Praiera - - 183640 - 6SZKHNCYCT+j1x7l+iSr - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 274 - Samba Makossa - - 271856 - X+e1iNnTOeFWMxLR - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 275 - Da Lama Ao Caos - - 251559 - 1ZnT4qTQldxri5Qq1Ya2 - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 276 - Maracatu De Tiro Certeiro - - 88868 - 2uhMylquTw== - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 277 - Salustiano Song - - 215405 - jYEV7WjGnIY3dc4+SgNW - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 278 - Antene Se - - 248372 - FeH0XCBdA02DVHtLxQ== - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 279 - Risoflora - - 105586 - bidJNFQjuqhzpO8O81+4eELX - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 280 - Lixo Do Mangue - - 193253 - +LV5ufN9MH3IahQ= - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 281 - Computadores Fazem Arte - - 404323 - UcEwB6f0Fq4ymW1uT20= - 0.9900000000000000000 - 25 - 1 - 7 - 1 - - - 282 - Girassol - Bino Farias/Da Gama/Lazão/Pedro Luis/Toni Garrido - 249808 - aqSUCxKkuMxR9W1Wtg== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 283 - A Sombra Da Maldade - Da Gama/Toni Garrido - 230922 - pvI+XlqdTMNYEYMrKV9eSAtq - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 284 - Johnny B. Goode - Chuck Berry - 254615 - a8XYNF8Cppj03hI5 - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 285 - Soldado Da Paz - Herbert Vianna - 194220 - X4mMpy4P9c/Fp0uDh+Z6 - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 286 - Firmamento - Bino Farias/Da Gama/Henry Lawes/Lazão/Toni Garrido/Winston Foser-Vers - 222145 - bgnpAs9LX8293w== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 287 - Extra - Gilberto Gil - 304352 - swRY5EbX5Mug07YZ+3W2pR6MsQ== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 288 - O Erê - Bernardo Vilhena/Bino Farias/Da Gama/Lazão/Toni Garrido - 236382 - HCs/hdUoN84UKr7p - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 289 - Podes Crer - Bino Farias/Da Gama/Lazão/Toni Garrido - 232280 - s0HKbMMFq6Ma2oa3 - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 290 - A Estrada - Bino Farias/Da Gama/Lazão/Toni Garrido - 248842 - 7o0YpUBADAc/h8XSDh2g - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 291 - Berlim - Da Gama/Toni Garrido - 207542 - t3UUzcpHNOw5WocFNAFRuQ== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 292 - Já Foi - Bino Farias/Da Gama/Lazão/Toni Garrido - 221544 - 5jqqtm/pftxHc7k= - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 293 - Onde Você Mora? - Marisa Monte/Nando Reis - 256026 - mrToC41jZA== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 294 - Pensamento - Bino Farias/Da Gamma/Lazão/Rás Bernard - 173008 - 6iWmWSxr5rkH0z42DAQo4/Y= - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 295 - Conciliação - Da Gama/Lazão/Rás Bernardo - 257619 - R4yW8ILTeueepZ/6p50= - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 296 - Realidade Virtual - Bino Farias/Da Gama/Lazão/Toni Garrido - 195239 - R+PAk1CJAwPE1XQ1g/g= - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 297 - Mensagem - Bino Farias/Da Gama/Lazão/Rás Bernardo - 225332 - jAQULRzX2/qi095EzEAaDA== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 298 - A Cor Do Sol - Bernardo Vilhena/Da Gama/Lazão - 231392 - oEnEIGdQpdVDiQ== - 0.9900000000000000000 - 26 - 1 - 8 - 1 - - - 299 - Onde Você Mora? - Marisa Monte/Nando Reis - 298396 - Gg6e9+4JGZrleYEUa+k= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 300 - O Erê - Bernardo Vilhena/Bino/Da Gama/Lazao/Toni Garrido - 206942 - wHJENsKqyUeUOTR1JbRvV9g= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 301 - A Sombra Da Maldade - Da Gama/Toni Garrido - 285231 - CuCUNedWwyaAJrIfNVg2SY8zkA== - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 302 - A Estrada - Da Gama/Lazao/Toni Garrido - 282174 - xidQxgm+upTz5XYhqMY= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 303 - Falar A Verdade - Bino/Da Gama/Ras Bernardo - 244950 - CYmKi+5zmymilXUE2z7bJDw= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 304 - Firmamento - Harry Lawes/Winston Foster-Vers - 225488 - zIbij80rKZwvMw== - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 305 - Pensamento - Bino/Da Gama/Ras Bernardo - 192391 - sJF2bvYtwAWnopkr - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 306 - Realidade Virtual - Bino/Da Gamma/Lazao/Toni Garrido - 240300 - rjGTut5VGME5Wtw/fw== - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 307 - Doutor - Bino/Da Gama/Toni Garrido - 178155 - u19hUkNoj/ED - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 308 - Na Frente Da TV - Bino/Da Gama/Lazao/Ras Bernardo - 289750 - leQQGx+UJTJb5eCbl28= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 309 - Downtown - Cidade Negra - 239725 - 2RrZdzeaLnezBKY= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 310 - Sábado A Noite - Lulu Santos - 267363 - T1XCbbwulST5 - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 311 - A Cor Do Sol - Bernardo Vilhena/Da Gama/Lazao - 273031 - /aGkNKnjmpkfx/KVaU62eQ== - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 312 - Eu Também Quero Beijar - Fausto Nilo/Moraes Moreira/Pepeu Gomes - 211147 - Y2dtXRZ5TtXcmXcjbQI= - 0.9900000000000000000 - 27 - 1 - 8 - 1 - - - 313 - Noite Do Prazer - - 311353 - w5UdN9IC8UrdGeTeU7rsc7dD - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 314 - À Francesa - - 244532 - Mb2M5uYoVl/MSiJ1sg== - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 315 - Cada Um Cada Um (A Namoradeira) - - 253492 - p9HUMH6nynIcj0Qymvo= - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 316 - Linha Do Equador - - 244715 - 8CW/4AzRjTauNw98oyUAug== - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 317 - Amor Demais - - 254040 - Mhqr6BhDOJuXv6D9 - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 318 - Férias - - 264202 - s41bQ9skYpSl8xmbJflvKyc= - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 319 - Gostava Tanto De Você - - 230452 - G9SfAIBPM9g= - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 320 - Flor Do Futuro - - 275748 - hkV1Eu04C4OBIF9J3FgQjA== - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 321 - Felicidade Urgente - - 266605 - kUzySclwbw== - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 322 - Livre Pra Viver - - 214595 - hCkDsw0MDwNB208w4SxiGnbt - 0.9900000000000000000 - 28 - 1 - 7 - 1 - - - 323 - Dig-Dig, Lambe-Lambe (Ao Vivo) - Cassiano Costa/Cintia Maviane/J.F./Lucas Costa - 205479 - xwM/fI9zWb3m5pm91AU= - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 324 - Pererê - Augusto Conceição/Chiclete Com Banana - 198661 - aA8I0HQTT0aa - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 325 - TriboTchan - Cal Adan/Paulo Levi - 194194 - wFxFZOrX0w== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 326 - Tapa Aqui, Descobre Ali - Paulo Levi/W. Rangel - 188630 - ZqhuRaxzP7RPKR2oHnoqQcRS - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 327 - Daniela - Jorge Cardoso/Pierre Onasis - 230791 - pXn2d72lAM4= - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 328 - Bate Lata - Fábio Nolasco/Gal Sales/Ivan Brasil - 206733 - E1j8Dsbhbl0xImOUkL/EJg== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 329 - Garotas do Brasil - Garay, Ricardo Engels/Luca Predabom/Ludwig, Carlos Henrique/Maurício Vieira - 210155 - 8l1GMQSglw== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 330 - Levada do Amor (Ailoviu) - Luiz Wanderley/Paulo Levi - 190093 - LWJvMLGgrKUnofcsD+E8Cw== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 331 - Lavadeira - Do Vale, Valverde/Gal Oliveira/Luciano Pinto - 214256 - D6HvfRS5MVCUsqKI5g64ZEg= - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 332 - Reboladeira - Cal Adan/Ferrugem/Julinho Carioca/Tríona Ní Dhomhnaill - 210599 - f/8sgIK372kezfo= - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 333 - É que Nessa Encarnação Eu Nasci Manga - Lucina/Luli - 196519 - ECA6Y/X+qA== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 334 - Reggae Tchan - Cal Adan/Del Rey, Tension/Edu Casanova - 206654 - GKg94B3tCRw= - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 335 - My Love - Jauperi/Zeu Góes - 203493 - kj7Ixki9DKGO - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 336 - Latinha de Cerveja - Adriano Bernandes/Edmar Neves - 166687 - OI6rmmRWeg== - 0.9900000000000000000 - 29 - 1 - 9 - 1 - - - 337 - You Shook Me - J B Lenoir/Willie Dixon - 315951 - gk2CGbq7AIE= - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 338 - I Can't Quit You Baby - Willie Dixon - 263836 - wUtjla3SKA== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 339 - Communication Breakdown - Jimmy Page/John Bonham/John Paul Jones - 192653 - jjJTyGMtwWbfcLpsDg== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 340 - Dazed and Confused - Jimmy Page - 401920 - iaJLh86+eA== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 341 - The Girl I Love She Got Long Black Wavy Hair - Jimmy Page/John Bonham/John Estes/John Paul Jones/Robert Plant - 183327 - DMbH50pVK4mKu4MO1SQ= - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 342 - What is and Should Never Be - Jimmy Page/Robert Plant - 260675 - 2R4gwbPbS0YUx+jCwEo= - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 343 - Communication Breakdown(2) - Jimmy Page/John Bonham/John Paul Jones - 161149 - BGkTCiWNAXvibDtV - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 344 - Travelling Riverside Blues - Jimmy Page/Robert Johnson/Robert Plant - 312032 - /uj/A2V8cWiu/cU= - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 345 - Whole Lotta Love - Jimmy Page/John Bonham/John Paul Jones/Robert Plant/Willie Dixon - 373394 - wH+yH2KTaj9jthn6yw== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 346 - Somethin' Else - Bob Cochran/Sharon Sheeley - 127869 - mdijPVV3hWRHK8jlXUTZ - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 347 - Communication Breakdown(3) - Jimmy Page/John Bonham/John Paul Jones - 185260 - VWxOYGUNTg== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 348 - I Can't Quit You Baby(2) - Willie Dixon - 380551 - gNjRFoJHzwU3ZuOYxHA= - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 349 - You Shook Me(2) - J B Lenoir/Willie Dixon - 619467 - TiNbOIZXfDYlZqVhrKxqmYuJSA== - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 350 - How Many More Times - Chester Burnett/Jimmy Page/John Bonham/John Paul Jones/Robert Plant - 711836 - fKZv4v9cw632YUD55MQAPAnV - 0.9900000000000000000 - 30 - 1 - 1 - 1 - - - 351 - Debra Kadabra - Frank Zappa - 234553 - BAOiq7Dc5iJY - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 352 - Carolina Hard-Core Ecstasy - Frank Zappa - 359680 - zFcOfLQrp7R5OCqUzz/EJax85w== - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 353 - Sam With The Showing Scalp Flat Top - Don Van Vliet - 171284 - LpC2wUS52fu/ - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 354 - Poofter's Froth Wyoming Plans Ahead - Frank Zappa - 183902 - GDlq4CkJMXwwmViIj5yebw== - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 355 - 200 Years Old - Frank Zappa - 272561 - Y+aKMGo6rJ48oE04+lE= - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 356 - Cucamonga - Frank Zappa - 144483 - 9XMf8CnuFbo= - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 357 - Advance Romance - Frank Zappa - 677694 - L0tOU6UAGiM= - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 358 - Man With The Woman Head - Don Van Vliet - 88894 - hHYVNNWu/w== - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 359 - Muffin Man - Frank Zappa - 332878 - Qe1p5EQ2R6w= - 0.9900000000000000000 - 31 - 1 - 1 - 1 - - - 360 - Vai-Vai 2001 - - 276349 - HHytRkVNK5YAH+xZ+TyG - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 361 - X-9 2001 - - 273920 - ZHbal8CecfFrrCg= - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 362 - Gavioes 2001 - - 282723 - D+sVBqYT5J11jT4p6Q== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 363 - Nene 2001 - - 284969 - 1I4SZUiw4rvfv2wV0Q== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 364 - Rosas De Ouro 2001 - - 284342 - CrzamCTahhQ= - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 365 - Mocidade Alegre 2001 - - 282488 - 5bLlWOmz1jexrSLJ - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 366 - Camisa Verde 2001 - - 283454 - 3gZkd25UC1WZkUFlkrmypQQPFw== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 367 - Leandro De Itaquera 2001 - - 274808 - hC2yYlj5BwiHu2evtCjd1DStaw== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 368 - Tucuruvi 2001 - - 287921 - CbRLIKTyVvkkkqyeCg== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 369 - Aguia De Ouro 2001 - - 284160 - XrFTAR51TALN - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 370 - Ipiranga 2001 - - 248293 - KZGwatvdcVej5bbP4Q== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 371 - Morro Da Casa Verde 2001 - - 284708 - vmajDuT1Dg== - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 372 - Perola Negra 2001 - - 281626 - pavJLIEyjvbmBudt - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 373 - Sao Lucas 2001 - - 296254 - E0HrHUYhVfolUo/P - 0.9900000000000000000 - 32 - 1 - 10 - 1 - - - 374 - Guanabara - Marcos Valle - 247614 - Q7jSPh7Xz2DsBaGvXA== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 375 - Mas Que Nada - Jorge Ben - 248398 - ya3/sOd0mqok - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 376 - Vôo Sobre o Horizonte - J.r.Bertami/Parana - 225097 - 8J7Uuc6AWTlcv+/V - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 377 - A Paz - Donato/Gilberto Gil - 263183 - p+cPnZcmPA== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 378 - Wave (Vou te Contar) - Antonio Carlos Jobim - 271647 - bunijEwloadbJpiTGg== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 379 - Água de Beber - Antonio Carlos Jobim/Vinicius de Moraes - 146677 - gAMWkWysZ1OdTg== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 380 - Samba da Bençaco - Baden Powell/Vinicius de Moraes - 282200 - iVfI2NcDhOhsgbTxLQ== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 381 - Pode Parar - Jorge Vercilo/Jota Maranhao - 179408 - WreSAJhWQQk= - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 382 - Menino do Rio - Caetano Veloso - 262713 - ZwyGBrqQ4xpMk5jCztk= - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 383 - Ando Meio Desligado - Caetano Veloso - 195813 - hCMUq63MyxHpDxL01VIE+LGA/Q== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 384 - Mistério da Raça - Luiz Melodia/Ricardo Augusto - 184320 - zFD9yliJZ2g= - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 385 - All Star - Nando Reis - 176326 - lL+L3cN8dEI= - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 386 - Menina Bonita - Alexandre Brazil/Pedro Luis/Rodrigo Cabelo - 237087 - W42b+533qJsOx0eb50LQeA== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 387 - Pescador de Ilusões - Macelo Yuka/O Rappa - 245524 - MyZKUiNkY7JUT4YWEdaPthsk - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 388 - À Vontade (Live Mix) - Bombom/Ed Motta - 180636 - xdCyBiK9e58hwq18 - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 389 - Maria Fumaça - Luiz Carlos/Oberdan - 141008 - ZcBITvdEOCg4SEinIQ== - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 390 - Sambassim (dj patife remix) - Alba Carvalho/Fernando Porto - 213655 - /PG35cseYLMygSAo - 0.9900000000000000000 - 33 - 1 - 7 - 1 - - - 391 - Garota De Ipanema - Vários - 279536 - qMVB8KfTzLFQjUG+1uxHjIg= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 392 - Tim Tim Por Tim Tim - Vários - 213237 - XwA5f65q3Q== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 393 - Tarde Em Itapoã - Vários - 313704 - Xlqyjsctz6+PY/c= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 394 - Tanto Tempo - Vários - 170292 - odNU06tjdQ== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 395 - Eu Vim Da Bahia - Live - Vários - 157988 - 9TEYJqkXwSdbKBbXEsZ1cg== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 396 - Alô Alô Marciano - Vários - 238106 - wsYT7iZc5JUwyYusZdNL - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 397 - Linha Do Horizonte - Vários - 279484 - tussQYvksGyoU2c= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 398 - Only A Dream In Rio - Vários - 371356 - H0XaXuLU6Zw= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 399 - Abrir A Porta - Vários - 271960 - N87VNJF5TjZ79VXK41vaSA== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 400 - Alice - Vários - 165982 - ct0Wp0bS9Zd16u4syZHqrg== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 401 - Momentos Que Marcam - Vários - 280137 - fx1XDfprYjYsXhKCPOkA - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 402 - Um Jantar Pra Dois - Vários - 237714 - sWELhrnw+9+cG44= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 403 - Bumbo Da Mangueira - Vários - 270158 - CbFkahxQ3LzwI3hxtHEadOMVOQ== - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 404 - Mr Funk Samba - Vários - 213890 - 7RYXL98o2I4hd3A= - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 405 - Santo Antonio - Vários - 162716 - 3QIsevmnZesNQyWO - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 406 - Por Você - Vários - 205557 - mdJI1ob8h+KMcvKa - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 407 - Só Tinha De Ser Com Você - Vários - 389642 - i/R3Tpp4spmUskWfezuvTfSp - 0.9900000000000000000 - 34 - 1 - 7 - 1 - - - 408 - Free Speech For The Dumb - Molaney/Morris/Roberts/Wainwright - 155428 - iEZFVpC3m3vp+1CPOeA= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 409 - It's Electric - Harris/Tatler - 213995 - HHF0vqit3E8EHwM3C8DYlZg= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 410 - Sabbra Cadabra - Black Sabbath - 380342 - AhHuRZ3nl//9yA== - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 411 - Turn The Page - Seger - 366524 - RCILv7YfPdk1AUM= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 412 - Die Die My Darling - Danzig - 149315 - 9kA2jYCPuhFlt8c3ztY= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 413 - Loverman - Cave - 472764 - 1Iwnqa8TscD993dVoZq8Yse+ - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 414 - Mercyful Fate - Diamond/Shermann - 671712 - 9wRnWRZvQrc4jFrT8OBIaUw= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 415 - Astronomy - A.Bouchard/J.Bouchard/S.Pearlman - 397531 - V5OZRYA4lQg6GXap - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 416 - Whiskey In The Jar - Traditional - 305005 - AHhp3tJsMhA5bQ== - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 417 - Tuesday's Gone - Collins/Van Zandt - 545750 - eDSiI4d0WDFvVG8ry7I= - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 418 - The More I See - Molaney/Morris/Roberts/Wainwright - 287973 - LsQNNSlBjjZaW4YB - 0.9900000000000000000 - 35 - 1 - 3 - 1 - - - 419 - A Kind Of Magic - Roger Taylor - 262608 - /Bn9HSY9zEs= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 420 - Under Pressure - Queen & David Bowie - 236617 - cYHFwEU5AJBNnitNPm4CBEQ= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 421 - Radio GA GA - Roger Taylor - 343745 - 6v1IyABz4jRWVlEFjg== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 422 - I Want It All - Queen - 241684 - OZhSjG9o+1Q1yQ7o1Q== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 423 - I Want To Break Free - John Deacon - 259108 - vqr6GeEj4k0= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 424 - Innuendo - Queen - 387761 - qYFS3RHjqj4= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 425 - It's A Hard Life - Freddie Mercury - 249417 - EEYUpRx2lNselch/uhidunWrXA== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 426 - Breakthru - Queen - 249234 - I2oC60uoCh2K6nGLisY= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 427 - Who Wants To Live Forever - Brian May - 297691 - jxMYjoOEBQRNhc3uabUimzhOBg== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 428 - Headlong - Queen - 273057 - pUMpWXNsd1A0Izw= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 429 - The Miracle - Queen - 294974 - 9EANp1wd2LQdZrVmfQ== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 430 - I'm Going Slightly Mad - Queen - 248032 - oWdnTzk9hKE= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 431 - The Invisible Man - Queen - 238994 - S+q/GhcMtdApSNn6KA== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 432 - Hammer To Fall - Brian May - 220316 - ez4adVEGPo7C3LnKEOjk6v5vUg== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 433 - Friends Will Be Friends - Freddie Mercury & John Deacon - 248920 - wb2dA8CnaJaLHaS/eL/sEQ== - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 434 - The Show Must Go On - Queen - 263784 - xzKb870n4mBN+8zr - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 435 - One Vision - Queen - 242599 - SWmnG+a+oBc= - 0.9900000000000000000 - 36 - 1 - 1 - 1 - - - 436 - Detroit Rock City - Paul Stanley, B. Ezrin - 218880 - qp6oAqQ3+VFQ/NPMNj23GgOVug== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 437 - Black Diamond - Paul Stanley - 314148 - c6ucq0zTOhhd2S5w - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 438 - Hard Luck Woman - Paul Stanley - 216032 - E4j8S7uDq2b8q88XchM= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 439 - Sure Know Something - Paul Stanley, Vincent Poncia - 242468 - 8ADiKOV1Qf4B - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 440 - Love Gun - Paul Stanley - 196257 - tdD94fN3zg== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 441 - Deuce - Gene Simmons - 185077 - xSO0us5IEg87dwDMk9nADig= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 442 - Goin' Blind - Gene Simmons, S. Coronel - 216215 - 9gWLkdGK+04Fsq2ECDMBtK3v - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 443 - Shock Me - Ace Frehley - 227291 - NTKaFtU5yv01adwP7g== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 444 - Do You Love Me - Paul Stanley, B. Ezrin, K. Fowley - 214987 - loHI1zRSKr+AQmBht27Nyt4s - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 445 - She - Gene Simmons, S. Coronel - 248346 - l/IqW++1VwaNxeQpog== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 446 - I Was Made For Loving You - Paul Stanley, Vincent Poncia, Desmond Child - 271360 - ynGxON14nE11sVe2cw== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 447 - Shout It Out Loud - Paul Stanley, Gene Simmons, B. Ezrin - 219742 - Wy9riq8+V8drJdkh3Es= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 448 - God Of Thunder - Paul Stanley - 255791 - +psYvaLs/Bw= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 449 - Calling Dr. Love - Gene Simmons - 225332 - AbM0SXx5AzlB1KpdWlp5ZGg= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 450 - Beth - S. Penridge, Bob Ezrin, Peter Criss - 166974 - BYteu5xRsHsVPvjRll8T - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 451 - Strutter - Paul Stanley, Gene Simmons - 192496 - iPwJDUryIaDgB6A/ - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 452 - Rock And Roll All Nite - Paul Stanley, Gene Simmons - 173609 - QJ5ZOuj2kDNGF+OZAWPEQHA+Sw== - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 453 - Cold Gin - Ace Frehley - 262243 - gNJ9Wlq5E2q92pSwcNvVoJ6X - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 454 - Plaster Caster - Gene Simmons - 207333 - aIOmQuQmc0mPXGBwyVX1H24= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 455 - God Gave Rock 'n' Roll To You - Paul Stanley, Gene Simmons, Rus Ballard, Bob Ezrin - 320444 - /98v4yZ1a4M= - 0.9900000000000000000 - 37 - 1 - 1 - 1 - - - 456 - Heart of the Night - - 273737 - KSWOJKLYkOPG2pA= - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 457 - De La Luz - - 315219 - NOZvgw1daspaerxmfp63foVdMQ== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 458 - Westwood Moon - - 295627 - YfJKJAE4vZc4ci9E3g== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 459 - Midnight - - 266866 - y/i/XxgXALjY - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 460 - Playtime - - 273580 - aCelAyASXmmpuTdBnEuC - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 461 - Surrender - - 287634 - oNOS6Et3iPbT - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 462 - Valentino's - - 296124 - viVEGdWpGpu7 - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 463 - Believe - - 310778 - krp2JhTGmyRQiVt03UN3LSbvYw== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 464 - As We Sleep - - 316865 - n68wYVM4JI/k - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 465 - When Evening Falls - - 298135 - JwGQqEPmXA== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 466 - J Squared - - 288757 - 1IXbY6VJY0pHAKKogyo4yjriiQ== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 467 - Best Thing - - 274259 - 0tuhDEDCYlrkNQCR0Loa3g== - 0.9900000000000000000 - 38 - 1 - 2 - 1 - - - 468 - Maria - Billie Joe Armstrong -Words Green Day -Music - 167262 - PAnm/gnwI+w7Cvw= - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 469 - Poprocks And Coke - Billie Joe Armstrong -Words Green Day -Music - 158354 - xW1gXEiZ+ePPIuPmCGY= - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 470 - Longview - Billie Joe Armstrong -Words Green Day -Music - 234083 - ABHXyQ9atP7ZoxbJ6n4fBA== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 471 - Welcome To Paradise - Billie Joe Armstrong -Words Green Day -Music - 224208 - ZpIex6A1iCAh+kUZJv/2ot4j - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 472 - Basket Case - Billie Joe Armstrong -Words Green Day -Music - 181629 - ZEHsbhFvh7gxzw8= - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 473 - When I Come Around - Billie Joe Armstrong -Words Green Day -Music - 178364 - rx0rgHVIS2Dc - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 474 - She - Billie Joe Armstrong -Words Green Day -Music - 134164 - qO5fbuSyox8mDFpEoHZ6JA1XGQ== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 475 - J.A.R. (Jason Andrew Relva) - Mike Dirnt -Words Green Day -Music - 170997 - VlESlZb8+3+AWpLD - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 476 - Geek Stink Breath - Billie Joe Armstrong -Words Green Day -Music - 135888 - FZn9DqKL1BQSqAMKa3y1BlE69A== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 477 - Brain Stew - Billie Joe Armstrong -Words Green Day -Music - 193149 - X/hX3MnY6Lckn8x5l0WL3HwVaw== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 478 - Jaded - Billie Joe Armstrong -Words Green Day -Music - 90331 - RGdEqA6LK39GeS4= - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 479 - Walking Contradiction - Billie Joe Armstrong -Words Green Day -Music - 151170 - nnyfHUIhRcmiHPBy3IlzJQ== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 480 - Stuck With Me - Billie Joe Armstrong -Words Green Day -Music - 135523 - 2Ik8zycC+LOuzT6t - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 481 - Hitchin' A Ride - Billie Joe Armstrong -Words Green Day -Music - 171546 - capwrNoapm6ZW9Ch - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 482 - Good Riddance (Time Of Your Life) - Billie Joe Armstrong -Words Green Day -Music - 153600 - KHfRy4UXBY1t7/FPdnqmaQ== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 483 - Redundant - Billie Joe Armstrong -Words Green Day -Music - 198164 - UwYcOatFATCuWH+CPi4= - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 484 - Nice Guys Finish Last - Billie Joe Armstrong -Words Green Day -Music - 170187 - Lv7ageHjSCan2wO7f1xkoA== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 485 - Minority - Billie Joe Armstrong -Words Green Day -Music - 168803 - BAYHyYTwfDHQmta/hgou - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 486 - Warning - Billie Joe Armstrong -Words Green Day -Music - 221910 - hSF4oCWHrwvf - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 487 - Waiting - Billie Joe Armstrong -Words Green Day -Music - 192757 - XaiKgtNKuH9+OCajqQ1dTxFI - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 488 - Macy's Day Parade - Billie Joe Armstrong -Words Green Day -Music - 213420 - ZyHQ1Pr5O+v/2n1W/A== - 0.9900000000000000000 - 39 - 1 - 4 - 1 - - - 489 - Into The Light - David Coverdale - 76303 - EJPUp03HjAYGjPaa4XdrQtY= - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 490 - River Song - David Coverdale - 439510 - Z5l4U4zTkIiY - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 491 - She Give Me ... - David Coverdale - 252551 - uKUA4iq5mXqJ - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 492 - Don't You Cry - David Coverdale - 347036 - xIHlYBpE3V8Y - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 493 - Love Is Blind - David Coverdale/Earl Slick - 344999 - f70DBu5icbwGAA== - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 494 - Slave - David Coverdale/Earl Slick - 291892 - xC4sTmGLFG8= - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 495 - Cry For Love - Bossi/David Coverdale/Earl Slick - 293015 - 3vC5LbHltBc5SPUwcNU= - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 496 - Living On Love - Bossi/David Coverdale/Earl Slick - 391549 - +6H588dH3XSJkQ== - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 497 - Midnight Blue - David Coverdale/Earl Slick - 298631 - U7gSubjJ8O/kjwTWVQmuWoM= - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 498 - Too Many Tears - Adrian Vanderberg/David Coverdale - 359497 - CuZTWE1Tv5Ehp+EBfDCcspL8BQ== - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 499 - Don't Lie To Me - David Coverdale/Earl Slick - 283585 - kCxAgfBQ98uk6hntWbZ+qqz6ag== - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 500 - Wherever You May Go - David Coverdale - 239699 - +SaoSA7jEg== - 0.9900000000000000000 - 40 - 1 - 1 - 1 - - - 501 - Grito De Alerta - Gonzaga Jr. - 202213 - OaJ2sVUDLd6m0mj9XPTsN43z - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 502 - Não Dá Mais Pra Segurar (Explode Coração) - - 219768 - xrHyBpiRRoZphPhyDQ== - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 503 - Começaria Tudo Outra Vez - - 196545 - I5ICc2eXVg== - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 504 - O Que É O Que É ? - - 259291 - oATZkW1iBTlxuho= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 505 - Sangrando - Gonzaga Jr/Gonzaguinha - 169717 - SyJHnN0gDw== - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 506 - Diga Lá, Coração - - 255921 - xFmuX1u/OGHqwyZbUD4Q7iwG - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 507 - Lindo Lago Do Amor - Gonzaga Jr. - 249678 - 44AwEz1Y0fIAS2U= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 508 - Eu Apenas Queria Que Voçê Soubesse - - 155637 - R4jZxEZWejatKqNOrZS+6w0= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 509 - Com A Perna No Mundo - Gonzaga Jr. - 227448 - WHDX/Cz8k0ZwB4rMOBY= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 510 - E Vamos À Luta - - 222406 - Ld7Td3rKmLLQdrjd4Q== - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 511 - Um Homem Também Chora (Guerreiro Menino) - - 207229 - qZnl5e/y9b5LXN0wAOU= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 512 - Comportamento Geral - Gonzaga Jr - 181577 - rODyjMl/tet0kkfAvQeFcx6x - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 513 - Ponto De Interrogação - - 180950 - xm2k50gkkG8= - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 514 - Espere Por Mim, Morena - Gonzaguinha - 207072 - dplJyrI/I5XG - 0.9900000000000000000 - 41 - 1 - 7 - 1 - - - 515 - Meia-Lua Inteira - - 222093 - GOXzrXFSpzE3t8Xpvn4= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 516 - Voce e Linda - - 242938 - HwUH+alnOBAiddpJfQ5+4++s - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 517 - Um Indio - - 195944 - mfvSvzKUoPNYtw== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 518 - Podres Poderes - - 259761 - jdrKq5I6G5sd6OA= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 519 - Voce Nao Entende Nada - Cotidiano - - 421982 - 0TiWCSojuQ== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 520 - O Estrangeiro - - 374700 - 1j3w5SNMRdVlCHTfWFXoAA== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 521 - Menino Do Rio - - 147670 - 0XtDx1SO5bkmAYaci3Y= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 522 - Qualquer Coisa - - 193410 - n+T3T+rlh0b0 - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 523 - Sampa - - 185051 - NhR0AHx8UJaKWKd1C4GuCg== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 524 - Queixa - - 299676 - /Eu+ONqSpEB0XZg= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 525 - O Leaozinho - - 184398 - mUo1ToEdeXG4qoQ= - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 526 - Fora Da Ordem - - 354011 - BQAdKCrYdQ== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 527 - Terra - - 401319 - 37mK+jYNW4LPwAceuIDxDg== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 528 - Alegria, Alegria - - 169221 - JopkNJlzUg== - 0.9900000000000000000 - 23 - 1 - 7 - 1 - - - 529 - Balada Do Louco - Arnaldo Baptista - Rita Lee - 241057 - iDPadHsWnA== - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 530 - Ando Meio Desligado - Arnaldo Baptista - Rita Lee - Sérgio Dias - 287817 - 9jfgvzsYc8L3ofiiZn0= - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 531 - Top Top - Os Mutantes - Arnolpho Lima Filho - 146938 - Dg+2A00RbUVFODOt2oEOVKo= - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 532 - Baby - Caetano Veloso - 177188 - NcJIEU82DhehPfd6sGAL - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 533 - A E O Z - Mutantes - 518556 - y2XEEk7XiPGahw== - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 534 - Panis Et Circenses - Caetano Veloso - Gilberto Gil - 125152 - aphA6E1ONjC7Pf3Af/U1bzA= - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 535 - Chão De Estrelas - Orestes Barbosa-Sílvio Caldas - 284813 - yofSoi21qY+XHF45V3bH - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 536 - Vida De Cachorro - Rita Lee - Arnaldo Baptista - Sérgio Baptista - 195186 - o39hVKoseTBP - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 537 - Bat Macumba - Gilberto Gil - Caetano Veloso - 187794 - zqRFHRloWKTP/w== - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 538 - Desculpe Babe - Arnaldo Baptista - Rita Lee - 170422 - yGqKPr63GdGC5Q== - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 539 - Rita Lee - Arnaldo Baptista/Rita Lee/Sérgio Dias - 189257 - +FBRtg7bo54NolK9 - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 540 - Posso Perder Minha Mulher, Minha Mãe, Desde Que Eu Tenha O Rock And Roll - Arnaldo Baptista - Rita Lee - Arnolpho Lima Filho - 222955 - BEl5A/bgs6bI+doU1hXs - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 541 - Banho De Lua - B. de Filippi - F. Migliaci - Versão: Fred Jorge - 221831 - X17Nikes9A== - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 542 - Meu Refrigerador Não Funciona - Arnaldo Baptista - Rita Lee - Sérgio Dias - 382981 - Yll9ADHxk3Wtozp0PRY= - 0.9900000000000000000 - 42 - 1 - 4 - 1 - - - 543 - Burn - Coverdale/Lord/Paice - 453955 - oTLfL1Z3oQ== - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 544 - Stormbringer - Coverdale - 277133 - xbYprUOEMg== - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 545 - Gypsy - Coverdale/Hughes/Lord/Paice - 339173 - V1WuoJxjsnXWZmVmMtt3Nw== - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 546 - Lady Double Dealer - Coverdale - 233586 - gyxXaHyeVMAht0kIRE/wegM= - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 547 - Mistreated - Coverdale - 758648 - H491Pj6AaVnvEQ== - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 548 - Smoke On The Water - Gillan/Glover/Lord/Paice - 618031 - Bek/8WO/WNs32rc= - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 549 - You Fool No One - Coverdale/Lord/Paice - 804101 - 33uraG2SFnTrL/lYqNQ= - 0.9900000000000000000 - 43 - 1 - 1 - 1 - - - 550 - Custard Pie - Jimmy Page/Robert Plant - 253962 - 7db+I65ChRzOChbgkA== - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 551 - The Rover - Jimmy Page/Robert Plant - 337084 - n8wHaDWVw5MY/MfZnU/V8OZJ - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 552 - In My Time Of Dying - John Bonham/John Paul Jones - 666017 - eWsEOLcIFlpe3V1WsoY= - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 553 - Houses Of The Holy - Jimmy Page/Robert Plant - 242494 - TGPy8HI+glq9AVzVpTZG3Q== - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 554 - Trampled Under Foot - John Paul Jones - 336692 - zFAWLJqTT18fO2S2 - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 555 - Kashmir - John Bonham - 508604 - phRSwAJy/fXXUPc= - 0.9900000000000000000 - 44 - 1 - 1 - 1 - - - 556 - Imperatriz - Guga/Marquinho Lessa/Tuninho Professor - 339173 - RjdaM3EkF/84iWFvsLLPopFTAw== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 557 - Beija-Flor - Caruso/Cleber/Deo/Osmar - 327000 - pAJbR4LlM9TgLvX/ - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 558 - Viradouro - Dadinho/Gilbreto Gomes/Gustavo/P.C. Portugal/R. Mocoto - 344320 - G1Nc9CuuFk0= - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 559 - Mocidade - Domenil/J. Brito/Joaozinho/Rap, Marcelo Do - 261720 - ghyz4xBQog== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 560 - Unidos Da Tijuca - Douglas/Neves, Vicente Das/Silva, Gilmar L./Toninho Gentil/Wantuir - 338834 - ZIRM2mxE2xOxi/FCHw== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 561 - Salgueiro - Augusto/Craig Negoescu/Rocco Filho/Saara, Ze Carlos Da - 305920 - lGFQlF5zrWY= - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 562 - Mangueira - Bizuca/Clóvis Pê/Gilson Bernini/Marelo D'Aguia - 298318 - 7M/sgD+UntXi - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 563 - União Da Ilha - Dito/Djalma Falcao/Ilha, Almir Da/Márcio André - 330945 - hMpxs0SuD4DheSIlCph4hw== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 564 - Grande Rio - Carlos Santos/Ciro/Claudio Russo/Zé Luiz - 307252 - k3zyL6793l8Kf8Q= - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 565 - Portela - Flavio Bororo/Paulo Apparicio/Wagner Alves/Zeca Sereno - 319608 - fhO2DhGaPyM= - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 566 - Caprichosos - Gule/Jorge 101/Lequinho/Luiz Piao - 351320 - C+VP8svtgsbFVAe3QwtY - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 567 - Tradição - Adalto Magalha/Lourenco - 269165 - AtbMklM6L0vkYg== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 568 - Império Serrano - Arlindo Cruz/Carlos Sena/Elmo Caetano/Mauricao - 334942 - axf5/ThkooeWojziEFyZRCq85A== - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 569 - Tuiuti - Claudio Martins/David Lima/Kleber Rodrigues/Livre, Cesare Som - 259657 - B10eDsRykFvQtgQN - 0.9900000000000000000 - 45 - 1 - 7 - 1 - - - 570 - (Da Le) Yaleo - Santana - 353488 - hxavzFfOUqCDwk3F9Ls2ug== - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 571 - Love Of My Life - Carlos Santana & Dave Matthews - 347820 - BI4AJ14O+Q== - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 572 - Put Your Lights On - E. Shrody - 285178 - OcXUR7fgni55iUXpeNM= - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 573 - Africa Bamba - I. Toure, S. Tidiane Toure, Carlos Santana & K. Perazzo - 282827 - kpqEm9BJz7Zaodqy - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 574 - Smooth - M. Itaal Shur & Rob Thomas - 298161 - DUEpCLbhHQl+Wczh - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 575 - Do You Like The Way - L. Hill - 354899 - lnoy8NB9MKFujNlzKKFpD3ml - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 576 - Maria Maria - W. Jean, J. Duplessis, Carlos Santana, K. Perazzo & R. Rekow - 262635 - LikhOGA9M5e15BNB - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 577 - Migra - R. Taha, Carlos Santana & T. Lindsay - 329064 - uSGyVYRp0V2B1J+0Tw== - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 578 - Corazon Espinado - F. Olivera - 276114 - jj+0+gSz8LOFdQ== - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 579 - Wishing It Was - Eale-Eye Cherry, M. Simpson, J. King & M. Nishita - 292832 - 0bOd5Xu9Wks= - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 580 - El Farol - Carlos Santana & KC Porter - 291160 - uQbvFIoQ1H+sVYE= - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 581 - Primavera - KC Porter & JB Eckl - 378618 - EaelVwHqD43HBpw8E7K2NA== - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 582 - The Calling - Carlos Santana & C. Thompson - 747755 - BhdFaSzbh1Cgb/Q= - 0.9900000000000000000 - 46 - 1 - 1 - 1 - - - 583 - Solução - - 247431 - cQYw9L7AC/eO - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 584 - Manuel - - 230269 - 0ku9W7JqswDXWaAHpj48 - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 585 - Entre E Ouça - - 286302 - 5MsdBmF6Gq5W - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 586 - Um Contrato Com Deus - - 202501 - a0dU8qo86IxE+Q== - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 587 - Um Jantar Pra Dois - - 244009 - 0SkdnZ+Ymj5pXw== - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 588 - Vamos Dançar - - 226194 - uKTbP9qHGFgwDgSy/ms= - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 589 - Um Love - - 181603 - 5K9kHxn5Qm0= - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 590 - Seis Da Tarde - - 238445 - ov9pwuJ/b+ygeI6wFmph - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 591 - Baixo Rio - - 198008 - dOzIncx2HzHys+vaSkX4djY= - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 592 - Sombras Do Meu Destino - - 280685 - nNseVnWxnhg= - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 593 - Do You Have Other Loves? - - 295235 - hd37zUQCvqUNedBFK+A4zy+U - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 594 - Agora Que O Dia Acordou - - 323213 - olqAGHpNzYZCHnY= - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 595 - Já!!! - - 217782 - /rRkmVT35abXjKDr/WWD - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 596 - A Rua - - 238027 - +uWGRhwJdbcFxIB/dnx7h5dh0Q== - 0.9900000000000000000 - 47 - 1 - 7 - 1 - - - 597 - Now's The Time - Miles Davis - 197459 - x0fk10ntvRa6lRoUylyLXJc= - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 598 - Jeru - Miles Davis - 193410 - +vU+rZOPdg== - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 599 - Compulsion - Miles Davis - 345025 - L1sQGVOblPKpswGv/C9LXw== - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 600 - Tempus Fugit - Miles Davis - 231784 - cKpstRrwH+9nZg== - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 601 - Walkin' - Miles Davis - 807392 - URmzVWDjvWIFoEF/gNey11o= - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 602 - 'Round Midnight - Miles Davis - 357459 - M8up3rAj5Qo= - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 603 - Bye Bye Blackbird - Miles Davis - 476003 - FWrxKew0uKCQAA== - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 604 - New Rhumba - Miles Davis - 277968 - Thlx6VpcLyrr3WcYxA== - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 605 - Generique - Miles Davis - 168777 - NJsycmmPcFYzp/cUdlQ= - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 606 - Summertime - Miles Davis - 200437 - xzci166ZGVnAhFP0 - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 607 - So What - Miles Davis - 564009 - HtKuUSwiuJmG - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 608 - The Pan Piper - Miles Davis - 233769 - JnA89+XJ8Ubl2uAkpkRB - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 609 - Someday My Prince Will Come - Miles Davis - 544078 - bRpCce4Vm7U3 - 0.9900000000000000000 - 48 - 1 - 2 - 1 - - - 610 - My Funny Valentine (Live) - Miles Davis - 907520 - +abnVJuxQQn7Z3GhNI/OPm0Z - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 611 - E.S.P. - Miles Davis - 330684 - +ixqEBa0nlYUPxHUhr+E0Es= - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 612 - Nefertiti - Miles Davis - 473495 - kT4v45xI2aTL5bKisKiB3A== - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 613 - Petits Machins (Little Stuff) - Miles Davis - 487392 - NI+W0KD9WizK6pLr4q++g98= - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 614 - Miles Runs The Voodoo Down - Miles Davis - 843964 - 26oWjyE2cui5pA== - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 615 - Little Church (Live) - Miles Davis - 196101 - j2hTqoJPQbSN - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 616 - Black Satin - Miles Davis - 316682 - QdS30l5Huek1 - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 617 - Jean Pierre (Live) - Miles Davis - 243461 - H9DLpjEmpW1fXrdDtrk7gT5AYA== - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 618 - Time After Time - Miles Davis - 220734 - fc5R65nWX7zD7rn/g7BTvp2teQ== - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 619 - Portia - Miles Davis - 378775 - qtNVLzn9Hf2X3A== - 0.9900000000000000000 - 49 - 1 - 2 - 1 - - - 620 - Space Truckin' - Blackmore/Gillan/Glover/Lord/Paice - 1196094 - eInVdlB+4AxbxuiqcaW4wAZmfA== - 0.9900000000000000000 - 50 - 1 - 1 - 1 - - - 621 - Going Down / Highway Star - Gillan/Glover/Lord/Nix - Blackmore/Paice - 913658 - kccEtal5IrGcuGIl5uVB - 0.9900000000000000000 - 50 - 1 - 1 - 1 - - - 622 - Mistreated (Alternate Version) - Blackmore/Coverdale - 854700 - rTkCQLyhHpTBKOOKgT0= - 0.9900000000000000000 - 50 - 1 - 1 - 1 - - - 623 - You Fool No One (Alternate Version) - Blackmore/Coverdale/Lord/Paice - 763924 - lhv3d7CEIM3WXC9vog== - 0.9900000000000000000 - 50 - 1 - 1 - 1 - - - 624 - Jeepers Creepers - - 185965 - w8SLZEISzQ== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 625 - Blue Rythm Fantasy - - 348212 - OyjwqXDzgJWYL1+gzAnubpA= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 626 - Drum Boogie - - 191555 - jWws5IwxezD+ZFgmPipKMg== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 627 - Let Me Off Uptown - - 187637 - z4cGFC1MQMP/EAKXutUd01GFYQ== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 628 - Leave Us Leap - - 182726 - V5u+Lj/0Gz1x8DU= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 629 - Opus No.1 - - 179800 - mSkf5orcYB/rIIw= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 630 - Boogie Blues - - 204199 - eZhEjzpT7KTp+4gzyNjUOA== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 631 - How High The Moon - - 201430 - A1IP26v9kLY= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 632 - Disc Jockey Jump - - 193149 - SHUlQUs2D561prCMAh4EkA== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 633 - Up An' Atom - - 179565 - nqDrHrIHJ+4= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 634 - Bop Boogie - - 189596 - zn1FzZuz2QQKd3+nrw== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 635 - Lemon Drop - - 194089 - JCoiLYelAA== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 636 - Coronation Drop - - 176222 - C0s+X+/KGJY= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 637 - Overtime - - 163030 - /VNjaJFY6Av8sv4= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 638 - Imagination - - 289306 - jRDF707H84/ZoEnnm3L5jjs= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 639 - Don't Take Your Love From Me - - 282331 - D+tzCIJTTOmS0Q== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 640 - Midget - - 217025 - IYvyAR59OnhwoAIkB5Q= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 641 - I'm Coming Virginia - - 280163 - CnvNH15ZzzijE6E= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 642 - Payin' Them Dues Blues - - 198556 - jnGiZTUiVLgUVuU= - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 643 - Jungle Drums - - 199627 - 9L8VyyMNxmt0JEnRHHNy4VFTTw== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 644 - Showcase - - 201560 - fPmsB807zAKy3EizlVAqn0MEFA== - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 645 - Swedish Schnapps - - 191268 - TDUQaSjRSMKvc2bBB/YA+hMO - 0.9900000000000000000 - 51 - 1 - 2 - 1 - - - 646 - Samba Da Bênção - - 409965 - 50DEuZfblTvMSNI= - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 647 - Pot-Pourri N.º 4 - - 392437 - TT65okfpQt778wpSP3aHrJ5PLw== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 648 - Onde Anda Você - - 168437 - NAUtVYd8eI2Slnt63A== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 649 - Samba Da Volta - - 170631 - GIJNVLkR0DAC9DZxeg== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 650 - Canto De Ossanha - - 204956 - VOmdfBhGaUcRYxrK - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 651 - Pot-Pourri N.º 5 - - 219898 - tEtld5B1aV0E - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 652 - Formosa - - 137482 - SpYeuwQDOR8WAVc5qfj/ - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 653 - Como É Duro Trabalhar - - 226168 - lmzQcek57qAc5J18pQ== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 654 - Minha Namorada - - 244297 - EMNPilPl+g== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 655 - Por Que Será - - 162142 - ZETYRATIGnuibHgu3/2N - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 656 - Berimbau - - 190667 - dBCofp8gZrx5GvGT - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 657 - Deixa - - 179826 - H6UZZwsHi5mlNCWFoEIw - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 658 - Pot-Pourri N.º 2 - - 211748 - dxwTNrwVQj1760TeG8vq14aRgg== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 659 - Samba Em Prelúdio - - 212636 - X8fT9gH6zw== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 660 - Carta Ao Tom 74 - - 162560 - g/j+3jW4Av3dXQ== - 0.9900000000000000000 - 52 - 1 - 11 - 1 - - - 661 - Linha de Passe (João Bosco) - - 230948 - CWPc6yDCrX3ZSk0= - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 662 - Pela Luz dos Olhos Teus (Miúcha e Tom Jobim) - - 163970 - D79ppLBJHTXC - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 663 - Chão de Giz (Elba Ramalho) - - 274834 - ZbqD7GaoYsnt - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 664 - Marina (Dorival Caymmi) - - 172643 - KWR5Y4PbsjNUfA== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 665 - Aquarela (Toquinho) - - 259944 - kjX57x7ME1KzwChrw/0h - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 666 - Coração do Agreste (Fafá de Belém) - - 258194 - NFwEGxBcU9WqRQUh1JY= - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 667 - Dona (Roupa Nova) - - 243356 - 4EZQ04SJ/EfcTg== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 668 - Começaria Tudo Outra Vez (Maria Creuza) - - 206994 - OToB+bZlYXI= - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 669 - Caçador de Mim (Sá & Guarabyra) - - 238341 - 1k9g5TXiI0TYxg== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 670 - Romaria (Renato Teixeira) - - 244793 - fR3VRyVyKZ3eNxQozJkjGdSxjw== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 671 - As Rosas Não Falam (Beth Carvalho) - - 116767 - wGEYE5Hla56iZrduFVz5HGS6 - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 672 - Wave (Os Cariocas) - - 130063 - QzzDlEbCJw== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 673 - Garota de Ipanema (Dick Farney) - - 174367 - SxHJT5NIJw== - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 674 - Preciso Apender a Viver Só (Maysa) - - 143464 - GwTCtT8Hi/t4 - 0.9900000000000000000 - 53 - 1 - 7 - 1 - - - 675 - Susie Q - Hawkins-Lewis-Broadwater - 275565 - pRNvnwe0Gd1MY/3N0VFqUR+M - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 676 - I Put A Spell On You - Jay Hawkins - 272091 - FiQl7ivdF6EElDywyBvGHBM= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 677 - Proud Mary - J. C. Fogerty - 189022 - qwoUNrX8wzM= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 678 - Bad Moon Rising - J. C. Fogerty - 140146 - MnFL7uf+ImFbfw== - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 679 - Lodi - J. C. Fogerty - 191451 - RMLvEhVJELM0sQs= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 680 - Green River - J. C. Fogerty - 154279 - Vi10gcTgbikq94/lMLmm - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 681 - Commotion - J. C. Fogerty - 162899 - saW5a5zu3+kbAiFs7A//nA== - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 682 - Down On The Corner - J. C. Fogerty - 164858 - PPTBcnxegexW - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 683 - Fortunate Son - J. C. Fogerty - 140329 - TDIJ4lujuwGP95+Y - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 684 - Travelin' Band - J. C. Fogerty - 129358 - TYtmwb8CPRr4877z - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 685 - Who'll Stop The Rain - J. C. Fogerty - 149394 - 5OE1Rzh+RfOTthEgxQ== - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 686 - Up Around The Bend - J. C. Fogerty - 162429 - MA5vpIekjHPnFpzB - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 687 - Run Through The Jungle - J. C. Fogerty - 186044 - Gd9UP0vul77ZzEc= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 688 - Lookin' Out My Back Door - J. C. Fogerty - 152946 - IVJ0utRVofo= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 689 - Long As I Can See The Light - J. C. Fogerty - 213237 - DQyITjdPOHH5Hqt2lCwUP3c= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 690 - I Heard It Through The Grapevine - Whitfield-Strong - 664894 - MS0LVkIo5WVSF7kTwfrHsQ== - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 691 - Have You Ever Seen The Rain? - J. C. Fogerty - 160052 - 08vxFJ5fTQ== - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 692 - Hey Tonight - J. C. Fogerty - 162847 - rZxIjCVge10= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 693 - Sweet Hitch-Hiker - J. C. Fogerty - 175490 - b8wttslgaNH9ILc= - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 694 - Someday Never Comes - J. C. Fogerty - 239360 - XbCv4iBBc4Wx - 0.9900000000000000000 - 54 - 1 - 1 - 1 - - - 695 - Walking On The Water - J.C. Fogerty - 281286 - zr52lIud2Cw= - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 696 - Suzie-Q, Pt. 2 - J.C. Fogerty - 244114 - PrYxivuDVQlqiEOhPpX5Tw== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 697 - Born On The Bayou - J.C. Fogerty - 316630 - maoEHgfX3tz9b0A11Mv40Gh5 - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 698 - Good Golly Miss Molly - J.C. Fogerty - 163604 - Kya0Xss4CP1t8Y8pfESf - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 699 - Tombstone Shadow - J.C. Fogerty - 218880 - LieZNt9Trf0UFA== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 700 - Wrote A Song For Everyone - J.C. Fogerty - 296385 - lr1L0dUbyg== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 701 - Night Time Is The Right Time - J.C. Fogerty - 190119 - xeRLOeb+2g== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 702 - Cotton Fields - J.C. Fogerty - 178181 - 621GxPA0x8moz0NQ - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 703 - It Came Out Of The Sky - J.C. Fogerty - 176718 - eLZKt2RyQCIguQ0= - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 704 - Don't Look Now - J.C. Fogerty - 131918 - INof4+6yNw== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 705 - The Midnight Special - J.C. Fogerty - 253596 - 48KPzlDjYfU= - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 706 - Before You Accuse Me - J.C. Fogerty - 207804 - KAbYeUtNLgCCgoyZTcqzOBLP - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 707 - My Baby Left Me - J.C. Fogerty - 140460 - p+W6HAtL9bYnfGaAEA== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 708 - Pagan Baby - J.C. Fogerty - 385619 - oPizNTjVjPHibDCra5U= - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 709 - (Wish I Could) Hideaway - J.C. Fogerty - 228466 - 25U9FAdNnG7pzC5W - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 710 - It's Just A Thought - J.C. Fogerty - 237374 - BoQbAXtPrdIAAw== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 711 - Molina - J.C. Fogerty - 163239 - +s22Ak3sXw== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 712 - Born To Move - J.C. Fogerty - 342804 - X75L5ilrCfwEispoCX716l5RLg== - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 713 - Lookin' For A Reason - J.C. Fogerty - 209789 - HOgk25FjGjmXmSD8bE722Ls= - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 714 - Hello Mary Lou - J.C. Fogerty - 132832 - 8pVyUqhINZrQe9jMpPy+ - 0.9900000000000000000 - 55 - 1 - 1 - 1 - - - 715 - Gatas Extraordinárias - - 212506 - w3eZb1TFUc9l - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 716 - Brasil - - 243696 - ac37u4ccLsBfmL3JP9w= - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 717 - Eu Sou Neguinha (Ao Vivo) - - 251768 - 95OeYcr1JD48in4+S0gsRKI= - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 718 - Geração Coca-Cola (Ao Vivo) - - 228153 - Pt9onhTzuw== - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 719 - Lanterna Dos Afogados - - 204538 - 450lcvk4vcldMbNumnVFjr8w - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 720 - Coroné Antonio Bento - - 200437 - 3uJ4MlQb3AD8PQ== - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 721 - Você Passa, Eu Acho Graça (Ao Vivo) - - 206733 - f6qlLBKGGcmRRYA= - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 722 - Meu Mundo Fica Completo (Com Você) - - 247771 - 6/qQM1LJmQ== - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 723 - 1° De Julho - - 270262 - 3+Pq3btratFX - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 724 - Música Urbana 2 - - 194899 - OMCMBbIJyW1jvnX1n8NdYI03 - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 725 - Vida Bandida (Ao Vivo) - - 192626 - 54o3Y2R4m7/IcaYbR3J0Db/1 - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 726 - Palavras Ao Vento - - 212453 - SIdp5GbaY+pDJ39a3jMN - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 727 - Não Sei O Que Eu Quero Da Vida - - 151849 - kgBdJ4wXSQH8vKItgiu1nQ== - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 728 - Woman Is The Nigger Of The World (Ao Vivo) - - 298919 - p+88faXRiAGOV5hIF8joOgLh - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 729 - Juventude Transviada (Ao Vivo) - - 278622 - Ys1YMD5o6Kk4NWcYceLvNg== - 0.9900000000000000000 - 56 - 1 - 7 - 1 - - - 730 - Malandragem - - 247588 - 0PHsL9Um/r+wueQ= - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 731 - O Segundo Sol - - 252133 - uvN/Sak7nE6+ - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 732 - Smells Like Teen Spirit (Ao Vivo) - - 316865 - Fb0nUMsmPydm - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 733 - E.C.T. - - 227500 - kaVpEPXcjKdacY2vA7V9 - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 734 - Todo Amor Que Houver Nesta Vida - - 227160 - 587HplLohNLcLw== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 735 - Metrô. Linha 743 - - 174654 - hVvYgIhTvWMUiW9UzK4= - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 736 - Nós (Ao Vivo) - - 193828 - 801wZblx0ok+cV+/1KgglzQ= - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 737 - Na Cadência Do Samba - - 196075 - 1AdMgvEEXEZSaLh4efv3XPQ2Yg== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 738 - Admirável Gado Novo - - 274390 - dZey0ZkPKJPouvTyOo74pw== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 739 - Eleanor Rigby - - 189466 - cVxrCXIeadDF92TIeLTqNQ== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 740 - Socorro - - 258586 - UD1Ueuji28hemHTGPg== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 741 - Blues Da Piedade - - 257123 - A0+zg9r2bQJ4SQHTF8TLcAYJvQ== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 742 - Rubens - - 211853 - PrpTL4h6kEAUhg== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 743 - Não Deixe O Samba Morrer - Cassia Eller e Alcione - - 268173 - CYcMYXjEMA8+UE3FC3gUyhf97g== - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 744 - Mis Penas Lloraba Yo (Ao Vivo) Soy Gitano (Tangos) - - 188473 - agnArEj8g/pfZizu8VT3TAtj - 0.9900000000000000000 - 57 - 1 - 7 - 1 - - - 745 - Comin' Home - Bolin/Coverdale/Paice - 235781 - q9X6fizx9Ue2c7A= - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 746 - Lady Luck - Cook/Coverdale - 168202 - QyX0igDGXxh7QTaw2CNe07eByA== - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 747 - Gettin' Tighter - Bolin/Hughes - 218044 - s6pDvHCLlLtStM2Gr+3pyPzJ9w== - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 748 - Dealer - Bolin/Coverdale - 230922 - q0rXaZ5KpQmSIpA1q/HFmOI4GQ== - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 749 - I Need Love - Bolin/Coverdale - 263836 - MqTFxnSwAOs6ldbtikITaA== - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 750 - Drifter - Bolin/Coverdale - 242834 - 2R0m5ospMCOY2g== - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 751 - Love Child - Bolin/Coverdale - 188160 - J1DmxLCCUweFEfXu - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 752 - This Time Around / Owed to 'G' (Instrumental) - Bolin/Hughes/Lord - 370102 - uc78S6Orad1cxgga8o6n - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 753 - You Keep On Moving - Coverdale/Hughes - 319111 - lKLc1UHE6a8SPAc= - 0.9900000000000000000 - 58 - 1 - 1 - 1 - - - 754 - Speed King - Blackmore, Gillan, Glover, Lord, Paice - 264385 - DOPA5C/dLLws5YDsceDLit2pvQ== - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 755 - Bloodsucker - Blackmore, Gillan, Glover, Lord, Paice - 256261 - q4vwbhkYB/XlTDlno3rReAUk6w== - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 756 - Child In Time - Blackmore, Gillan, Glover, Lord, Paice - 620460 - YutOryLvZGH4X9JofhND - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 757 - Flight Of The Rat - Blackmore, Gillan, Glover, Lord, Paice - 478302 - 81LKFtU219+sGEn2D1KEuA== - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 758 - Into The Fire - Blackmore, Gillan, Glover, Lord, Paice - 210259 - qJHAPEBLKbSm/IU= - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 759 - Living Wreck - Blackmore, Gillan, Glover, Lord, Paice - 274886 - 0OiQN1CFs1nUQCsUbwMJpg== - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 760 - Hard Lovin' Man - Blackmore, Gillan, Glover, Lord, Paice - 431203 - UaXaGarWgYJDsgah - 0.9900000000000000000 - 59 - 1 - 1 - 1 - - - 761 - Fireball - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 204721 - LjpRZNswuL++ - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 762 - No No No - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 414902 - 0V7pZ2aszT1C - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 763 - Strange Kind Of Woman - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 247092 - RlRXq2AmEQ60DNKtuHIR8Q== - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 764 - Anyone's Daughter - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 284682 - CifZ7a2S2Am7wG4b1XZ1xB0b2g== - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 765 - The Mule - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 322063 - pgO1HqoKsvokpXZWdenCFWiWmQ== - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 766 - Fools - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 500427 - fqGlZaLz3pVd6JtXNw4cBnK6 - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 767 - No One Came - Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice - 385880 - o+De5RVJGKbstF9bhoIYZA== - 0.9900000000000000000 - 60 - 1 - 1 - 1 - - - 768 - Knocking At Your Back Door - Richie Blackmore, Ian Gillian, Roger Glover - 424829 - XlB7tyscnTsKHx9mzLs= - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 769 - Bad Attitude - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord - 307905 - rVP24aC8kBuKTfLh/Q== - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 770 - Child In Time (Son Of Aleric - Instrumental) - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice - 602880 - FNUeqRioIT+Ld8RBqQsq+D8f+A== - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 771 - Nobody's Home - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice - 243017 - rjKMNsRIzTTxaTk6 - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 772 - Black Night - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice - 368770 - rvVKAL20EoFuyH4dXhKE - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 773 - Perfect Strangers - Richie Blackmore, Ian Gillian, Roger Glover - 321149 - kQ3S6UHe4knn - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 774 - The Unwritten Law - Richie Blackmore, Ian Gillian, Roger Glover, Ian Paice - 295053 - z9rtTiE+iaH7FeD4gWvlOj9qDQ== - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 775 - Call Of The Wild - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord - 293851 - ZTZIQ19cZlFezxMAGdjkN5Q= - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 776 - Hush - South - 213054 - pkCTvRZuEJmLZw== - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 777 - Smoke On The Water - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice - 464378 - Bp93O81+mZKq7sXXOEM= - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 778 - Space Trucking - Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice - 341185 - At/eqYatph/DzYaoH9kyxQ== - 0.9900000000000000000 - 61 - 1 - 1 - 1 - - - 779 - Highway Star - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 368770 - /01YMJvES1k= - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 780 - Maybe I'm A Leo - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 290455 - peox4WhbeetsMbri4FVff7M= - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 781 - Pictures Of Home - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 303777 - R9Z6uHcp9djq6vtmGpNQ - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 782 - Never Before - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 239830 - CLzu4mQqLg== - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 783 - Smoke On The Water - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 340871 - bQEK7R73+LHoVgM= - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 784 - Lazy - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 442096 - 0O1yB+uPcI/vBRY= - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 785 - Space Truckin' - Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover - 272796 - kqRNopHQCQ== - 0.9900000000000000000 - 62 - 1 - 1 - 1 - - - 786 - Vavoom : Ted The Mechanic - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 257384 - p0ZKdh8HuvLxSX7EkMxrGkrm - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 787 - Loosen My Strings - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 359680 - 1bqfRGjr41t6qg== - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 788 - Soon Forgotten - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 287791 - HxdM5tyKo/zo49V+naaGUZbF - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 789 - Sometimes I Feel Like Screaming - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 451840 - M1iq2TRiBwHiizysQEibKmd4 - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 790 - Cascades : I'm Not Your Lover - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 283689 - 8OF3Tv4T/w== - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 791 - The Aviator - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 320992 - Ap7hmUyVQXf9dD4Xg9SIwHCsNw== - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 792 - Rosa's Cantina - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 312372 - NQF7H9js1Fe8CqzFNQ== - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 793 - A Castle Full Of Rascals - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 311693 - BWMA8e8W/tGetShhJhxYtt0= - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 794 - A Touch Away - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 276323 - 3GkGACLCwGA= - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 795 - Hey Cisco - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 354089 - 6bryyHjiXM4lwH+8IJZk - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 796 - Somebody Stole My Guitar - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 249443 - xvZ3xrj+BSxa6csgBUA+MI5W - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 797 - The Purpendicular Waltz - Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice - 283924 - FqvssH7JTTP1XpU= - 0.9900000000000000000 - 63 - 1 - 1 - 1 - - - 798 - King Of Dreams - Blackmore, Glover, Turner - 328385 - 06GdW8tImgfqtcVtjhY8yeQ= - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 799 - The Cut Runs Deep - Blackmore, Glover, Turner, Lord, Paice - 342752 - Ti3KgU222UX4/A== - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 800 - Fire In The Basement - Blackmore, Glover, Turner, Lord, Paice - 283977 - yxDOxS33fmfkcuf0Tg== - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 801 - Truth Hurts - Blackmore, Glover, Turner - 314827 - YeZ/ImiNg09zD2fxUg== - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 802 - Breakfast In Bed - Blackmore, Glover, Turner - 317126 - 5oKGUJ2cH6T2qGAevWH/D2c5 - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 803 - Love Conquers All - Blackmore, Glover, Turner - 227186 - VuzQWiOQb+d8nL9ePKUqgWI= - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 804 - Fortuneteller - Blackmore, Glover, Turner, Lord, Paice - 349335 - l1exCrzv1sFJzw== - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 805 - Too Much Is Not Enough - Turner, Held, Greenwood - 257724 - T2OoLXX7ZxUnYr8utKMINw== - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 806 - Wicked Ways - Blackmore, Glover, Turner, Lord, Paice - 393691 - JHmS4J0jz+HJSzA= - 0.9900000000000000000 - 64 - 1 - 1 - 1 - - - 807 - Stormbringer - D.Coverdale/R.Blackmore/Ritchie Blackmore - 246413 - g2JHn8YsORcwxqrD - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 808 - Love Don't Mean a Thing - D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore - 263862 - OonYKf1ntLg= - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 809 - Holy Man - D.Coverdale/G.Hughes/Glenn Hughes/J.Lord/John Lord - 270236 - nNA8QLJA2Eusrw== - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 810 - Hold On - D.Coverdal/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord - 306860 - NKQAeI7uds8= - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 811 - Lady Double Dealer - D.Coverdale/R.Blackmore/Ritchie Blackmore - 201482 - Gl7Pz3Vimfe4zOR8KffFdw== - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 812 - You Can't Do it Right (With the One You Love) - D.Coverdale/G.Hughes/Glenn Hughes/R.Blackmore/Ritchie Blackmore - 203755 - hXr4PuQa+ow2 - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 813 - High Ball Shooter - D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore - 267833 - iV+aDvDkmHI+AG0= - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 814 - The Gypsy - D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore - 242886 - T6bhk9/LuwusOgErafzW4TVE1Q== - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 815 - Soldier Of Fortune - D.Coverdale/R.Blackmore/Ritchie Blackmore - 193750 - P8wPlx6985eQ - 0.9900000000000000000 - 65 - 1 - 1 - 1 - - - 816 - The Battle Rages On - ian paice/jon lord - 356963 - hnb2uipSXVE6LtEr - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 817 - Lick It Up - roger glover - 240274 - T15vpfMOtzz6KyqLg5ZJdCE= - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 818 - Anya - jon lord/roger glover - 392437 - I3ons4o1rtKDg+QJpnET4sA= - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 819 - Talk About Love - roger glover - 247823 - rhj/iNlJjErM - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 820 - Time To Kill - roger glover - 351033 - p7wU3BhWrbHCm9M69g== - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 821 - Ramshackle Man - roger glover - 334445 - izNX8IW4eKDVEMYJ15ug3Q== - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 822 - A Twist In The Tail - roger glover - 257462 - QGmAKsdvCPBPxA== - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 823 - Nasty Piece Of Work - jon lord/roger glover - 276662 - HyVlcyHe/aXx - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 824 - Solitaire - roger glover - 282226 - xBO2BuYDFQ9+ERDkdA== - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 825 - One Man's Meat - roger glover - 278804 - 0Xb2w8ROADXzFoE= - 0.9900000000000000000 - 66 - 1 - 1 - 1 - - - 826 - Pour Some Sugar On Me - - 292519 - qlLo+Z776w== - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 827 - Photograph - - 248633 - e1XKJOBr8uHQs1E6sdKiq+c= - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 828 - Love Bites - - 346853 - 4aKbjyCfhTZYwyeEcxX4 - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 829 - Let's Get Rocked - - 296019 - F3yr0uJYXB9lQA== - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 830 - Two Steps Behind (Acoustic Version) - - 259787 - Rv7YrzwSZBlJ8Ow= - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 831 - Animal - - 244741 - Kp6qEi+6Sz88Qcm6 - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 832 - Heaven Is - - 214021 - /xRWiEZ8Kg== - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 833 - Rocket - - 247248 - 2z84gBPqcg77r/crR4E= - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 834 - When Love & Hate Collide - - 257280 - OEUtZBkAhwQ1Hok9/Q2Q - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 835 - Action - - 220604 - dMJTTl9ykhvP2TFBkg== - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 836 - Make Love Like A Man - - 255660 - jt5+4R5DGRcQ4FM7AmE= - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 837 - Armageddon It - - 322455 - rXQAaq2DafQy1MayEZU/ - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 838 - Have You Ever Needed Someone So Bad - - 319320 - RnJjkKu/HO9N6V2xc/okbzGR - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 839 - Rock Of Ages - - 248424 - ZDDW5E4l6UsM - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 840 - Hysteria - - 355056 - kAeC0RENyJ7R3e5XEBw= - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 841 - Bringin' On The Heartbreak - - 272457 - JbeAOK9WgX9y2g== - 0.9900000000000000000 - 67 - 1 - 1 - 1 - - - 842 - Roll Call - Jim Beard - 321358 - b40VasFzD5i8 - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 843 - Otay - John Scofield, Robert Aries, Milton Chambers and Gary Grainger - 423653 - 2+Bh7VvQYLQzDR+6ICg= - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 844 - Groovus Interruptus - Jim Beard - 319373 - aRNdAA+HD/ZznTuJ - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 845 - Paris On Mine - Jon Herington - 368875 - G3pHeF/iStce - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 846 - In Time - Sylvester Stewart - 368953 - VIYgyz/NfrVt7P1YYA== - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 847 - Plan B - Dean Brown, Dennis Chambers & Jim Beard - 272039 - l61ZzOruTyBH+pi5xada - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 848 - Outbreak - Jim Beard & Jon Herington - 659226 - 3pVKyAl67rzQKPTnzpxo - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 849 - Baltimore, DC - John Scofield - 346932 - GZXgsoh+7TD6Mz4mM4UH1lsv - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 850 - Talkin Loud and Saying Nothin - James Brown & Bobby Byrd - 360411 - Zw6YqRy+nQ== - 0.9900000000000000000 - 68 - 1 - 2 - 1 - - - 851 - Pétala - - 270080 - wflnUqqR1Z8wxqe0X6gaztU8 - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 852 - Meu Bem-Querer - - 255608 - iEohHoyejgE= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 853 - Cigano - - 304692 - gevE8+qCLDaS4Q== - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 854 - Boa Noite - - 338755 - lV3l1xCzeq4= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 855 - Fato Consumado - - 211565 - 9MnU4PYVsZ/b27MbkCEeRQK0yQ== - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 856 - Faltando Um Pedaço - - 267728 - fOM786gzKmRKDdk= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 857 - Álibi - - 213237 - 4EK/txfj/dXRjFq3LngEPMc= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 858 - Esquinas - - 280999 - Dv+w0EIRjuA4w+pMVc0CjzpOYQ== - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 859 - Se... - - 286432 - LR639AzwiITFLy7unQ== - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 860 - Eu Te Devoro - - 311614 - /9lzEP+uKTaqOQ== - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 861 - Lilás - - 274181 - hDaNtJ49ttphZO9IvMQ= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 862 - Acelerou - - 284081 - iAobCZX7r53OKBwq - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 863 - Um Amor Puro - - 327784 - sz32dH0Ih7n7zybxdxM= - 0.9900000000000000000 - 69 - 1 - 7 - 1 - - - 864 - Samurai - Djavan - 330997 - UxCRtkutJR4boQ== - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 865 - Nem Um Dia - Djavan - 337423 - 79WZvoyBE2cn - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 866 - Oceano - Djavan - 217338 - bXvKsz2YjTv0Fx3ockk= - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 867 - Açai - Djavan - 270968 - l2bfoY0e29LZGLEgPEKl3Q/r - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 868 - Serrado - Djavan - 295314 - 5pXGAg4UmOMniYYHYk8A - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 869 - Flor De Lis - Djavan - 236355 - GzTGmgSSqPGbi3hQ+E85Dfw= - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 870 - Amar É Tudo - Djavan - 211617 - YyjQY9CN9Duz - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 871 - Azul - Djavan - 253962 - UhFO0DtOialJUBNT7NVngptI - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 872 - Seduzir - Djavan - 277524 - 1094Cwjs2CO3Yzmmyd5fnoo= - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 873 - A Carta - Djavan - Gabriel, O Pensador - 347297 - qBSqxpDEq0YPO/v8 - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 874 - Sina - Djavan - 268173 - 8axQ3PnZBUXjYyrRRg+qSnU= - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 875 - Acelerou - Djavan - 284133 - Nt1E8zNAEb+0 - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 876 - Um Amor Puro - Djavan - 327105 - wt2cKLsUSPl4AmbEhA== - 0.9900000000000000000 - 70 - 1 - 7 - 1 - - - 877 - O Bêbado e a Equilibrista - - 223059 - xLGA9Eq0AfuarsUfCv4= - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 878 - O Mestre-Sala dos Mares - - 186226 - EMo5JaaDBsY= - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 879 - Atrás da Porta - - 166608 - FjHHsNJyJg== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 880 - Dois Pra Lá, Dois Pra Cá - - 263026 - WU0vgcAddf9exkPuY5wKSYBo - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 881 - Casa no Campo - - 170788 - LZ/ddL3qft4Y7VApJ4dTxrw= - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 882 - Romaria - - 242834 - 90+txCZIvA== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 883 - Alô, Alô, Marciano - - 241397 - 2J55Jn0vaTr5 - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 884 - Me Deixas Louca - - 214831 - e9lxl0I+XBINnRtmD9VNeg== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 885 - Fascinação - - 180793 - GIpoeZW3+hLfZPFvIL8= - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 886 - Saudosa Maloca - - 278125 - joBK411fDW5nFDof - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 887 - As Aparências Enganam - - 247379 - cY+k2QKmUbCQWeUh - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 888 - Madalena - - 157387 - hWLaaqLt3S/Yj4tpHQ== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 889 - Maria Rosa - - 232803 - ChsBZFuXU6BQwBhsem07/Q== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 890 - Aprendendo A Jogar - - 290664 - ZcHn2qqU/HFMQXiZ/xlv5Q== - 0.9900000000000000000 - 71 - 1 - 7 - 1 - - - 891 - Layla - Clapton/Gordon - 430733 - R5WP9IqKI+USGlI1cw== - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 892 - Badge - Clapton/Harrison - 163552 - 89toJac1T1+HBPMOVdsGUKephw== - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 893 - I Feel Free - Bruce/Clapton - 174576 - JqZtMdo3xPWXeqo82dGEvpc= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 894 - Sunshine Of Your Love - Bruce/Clapton - 252891 - x68t5w2LAXs= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 895 - Crossroads - Clapton/Robert Johnson Arr: Eric Clapton - 253335 - R97CcqiudUk= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 896 - Strange Brew - Clapton/Collins/Pappalardi - 167810 - bTZKcHFZxw1ZtzWEVke4tOI= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 897 - White Room - Bruce/Clapton - 301583 - 0D+Z4jBfA3wW - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 898 - Bell Bottom Blues - Clapton - 304744 - BwKNZIg3UWA= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 899 - Cocaine - Cale/Clapton - 215928 - Vz7THwAxSkav - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 900 - I Shot The Sheriff - Marley - 263862 - lgm+xtekCrM= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 901 - After Midnight - Clapton/J. J. Cale - 191320 - Buts9UPyBVc= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 902 - Swing Low Sweet Chariot - Clapton/Trad. Arr. Clapton - 208143 - 0Psf9lgLi5j9H5iw5Rk= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 903 - Lay Down Sally - Clapton/Levy - 231732 - in/LSDu2v36Dxlq86kiP - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 904 - Knockin On Heavens Door - Clapton/Dylan - 264411 - +togdbTRn7GyOz4= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 905 - Wonderful Tonight - Clapton - 221387 - 6hvaINEYasMnvRtzEQ== - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 906 - Let It Grow - Clapton - 297064 - mzD9T6BQbfGd1Q== - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 907 - Promises - Clapton/F.eldman/Linn - 180401 - o5+54BmV/3cY - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 908 - I Can't Stand It - Clapton - 249730 - aOs56tHezAU9vq0= - 0.9900000000000000000 - 72 - 1 - 6 - 1 - - - 909 - Signe - Eric Clapton - 193515 - NzZvs2Ob7jr5fQVbLg== - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 910 - Before You Accuse Me - Eugene McDaniel - 224339 - seMNJxz7+OkyRcRkznI= - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 911 - Hey Hey - Big Bill Broonzy - 196466 - 62AWFz9ognFlMmSJ3prr5t68 - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 912 - Tears In Heaven - Eric Clapton, Will Jennings - 274729 - LOn4FqKyaw== - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 913 - Lonely Stranger - Eric Clapton - 328724 - Aynv/8x7mQ0= - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 914 - Nobody Knows You When You're Down & Out - Jimmy Cox - 231836 - 7kPuES9yqPS3 - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 915 - Layla - Eric Clapton, Jim Gordon - 285387 - Gk9HX+WndkW380l0ZQ== - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 916 - Running On Faith - Jerry Lynn Williams - 378984 - G35HdjOYDkSMzvebzkb9dg== - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 917 - Walkin' Blues - Robert Johnson - 226429 - IetAUP28yQpXVTbhGdN53Rr2 - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 918 - Alberta - Traditional - 222406 - KjLBHmPVwnlnStk= - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 919 - San Francisco Bay Blues - Jesse Fuller - 203363 - SECjKIglgg== - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 920 - Malted Milk - Robert Johnson - 216528 - wn1r20LYY3P6fr2zUE1MHV8= - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 921 - Old Love - Eric Clapton, Robert Cray - 472920 - 3Xs6QmK/fiXtoHWq8Lg= - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 922 - Rollin' And Tumblin' - McKinley Morgenfield (Muddy Waters) - 251768 - 2O2sxubci3JP - 0.9900000000000000000 - 73 - 1 - 6 - 1 - - - 923 - Collision - Jon Hudson/Mike Patton - 204303 - 6Y0m3/v0hsi8RwfjfxurXB0= - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 924 - Stripsearch - Jon Hudson/Mike Bordin/Mike Patton - 270106 - wv5PjQQaeF+fVw== - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 925 - Last Cup Of Sorrow - Bill Gould/Mike Patton - 251663 - 8FEI68N4Mlg= - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 926 - Naked In Front Of The Computer - Mike Patton - 128757 - 8qvv4jRxkA== - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 927 - Helpless - Bill Gould/Mike Bordin/Mike Patton - 326217 - bpEair6hr1E= - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 928 - Mouth To Mouth - Bill Gould/Jon Hudson/Mike Bordin/Mike Patton - 228493 - XIgLZ5tVLk/L9f/3u6J5BNf3 - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 929 - Ashes To Ashes - Bill Gould/Jon Hudson/Mike Bordin/Mike Patton/Roddy Bottum - 217391 - Dm1Yk4qD8Q097jGwWJqVHKpN - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 930 - She Loves Me Not - Bill Gould/Mike Bordin/Mike Patton - 209867 - VlXAkmh7kf2y7qGG56mZQsED - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 931 - Got That Feeling - Mike Patton - 140852 - gOSqSPFgmUWmXSaG - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 932 - Paths Of Glory - Bill Gould/Jon Hudson/Mike Bordin/Mike Patton/Roddy Bottum - 257253 - tvigwE7a7xj5hT4fnGhKB79Y - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 933 - Home Sick Home - Mike Patton - 119040 - GLTM+qsNzzLONuqfi2fSz+4= - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 934 - Pristina - Bill Gould/Mike Patton - 232698 - 2PPmFN2HXmsoVfdPPQ== - 0.9900000000000000000 - 74 - 1 - 4 - 1 - - - 935 - Land Of Sunshine - - 223921 - BVJuGur99LM= - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 936 - Caffeine - - 267937 - qCDhDuazt8mZW/4= - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 937 - Midlife Crisis - - 263235 - ZO0D10ScQOV5On/4 - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 938 - RV - - 223242 - mjj4uOTxEyV0PfP7eXc= - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 939 - Smaller And Smaller - - 310831 - cYtd8z7/oWVqQqZg - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 940 - Everything's Ruined - - 273658 - zgVtoekKS3q+EbVq68LvrxA= - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 941 - Malpractice - - 241371 - yiSHc+7ci7k= - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 942 - Kindergarten - - 270680 - +dKNdT6QXlduz1IRbiw9snmo - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 943 - Be Aggressive - - 222432 - Uz2xtVpm2zwtWheR - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 944 - A Small Victory - - 297168 - LwZSqDCbdtmM - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 945 - Crack Hitler - - 279144 - gN+9ylz4SsF0NA== - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 946 - Jizzlobber - - 398341 - ZsZHHDMPYlQx/Fc+PQ== - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 947 - Midnight Cowboy - - 251924 - Z9mVgd0xr8bSMNadnH5D4pii - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 948 - Easy - - 185835 - EslAC4v9jBSFWm4ooYDo9B+0QA== - 0.9900000000000000000 - 75 - 1 - 4 - 1 - - - 949 - Get Out - Mike Bordin, Billy Gould, Mike Patton - 137482 - AlOf9BdGlnM= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 950 - Ricochet - Mike Bordin, Billy Gould, Mike Patton - 269400 - EE5kteEqGA== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 951 - Evidence - Mike Bordin, Billy Gould, Mike Patton, Trey Spruance - 293590 - zgqDUR0pa2MHNRyzig== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 952 - The Gentle Art Of Making Enemies - Mike Bordin, Billy Gould, Mike Patton - 209319 - LlgLWr8qS/NEZxkv - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 953 - Star A.D. - Mike Bordin, Billy Gould, Mike Patton - 203807 - DAlzv1XQzVGqvEblKQ== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 954 - Cuckoo For Caca - Mike Bordin, Billy Gould, Mike Patton, Trey Spruance - 222902 - kA8Reb9Z6yAMqodr7ds= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 955 - Caralho Voador - Mike Bordin, Billy Gould, Mike Patton, Trey Spruance - 242102 - xRw37bRfWpR1x+O904M= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 956 - Ugly In The Morning - Mike Bordin, Billy Gould, Mike Patton - 186435 - xXWW9rvjMu1Z1g== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 957 - Digging The Grave - Mike Bordin, Billy Gould, Mike Patton - 185129 - 6/3IN+ri8XbkoA73dQ== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 958 - Take This Bottle - Mike Bordin, Billy Gould, Mike Patton, Trey Spruance - 298997 - NnubstycGA== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 959 - King For A Day - Mike Bordin, Billy Gould, Mike Patton, Trey Spruance - 395859 - ceUS1PYg9g== - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 960 - What A Day - Mike Bordin, Billy Gould, Mike Patton - 158275 - Lt4XKnNczD0= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 961 - The Last To Know - Mike Bordin, Billy Gould, Mike Patton - 267833 - AMtcnvq2fSAihGiWO30= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 962 - Just A Man - Mike Bordin, Billy Gould, Mike Patton - 336666 - cE6L4iUV69A= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 963 - Absolute Zero - Mike Bordin, Billy Gould, Mike Patton - 181995 - UXEv4Epg2a9e1dvQu/52LpQ= - 0.9900000000000000000 - 76 - 1 - 1 - 1 - - - 964 - From Out Of Nowhere - Faith No More - 202527 - 1JyO/PJh3bk= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 965 - Epic - Faith No More - 294008 - 0OkYxhT73E2Ih50= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 966 - Falling To Pieces - Faith No More - 316055 - wqq4OGWhabRQFbORYRc08VU= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 967 - Surprise! You're Dead! - Faith No More - 147226 - zgOROgjGRg4= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 968 - Zombie Eaters - Faith No More - 360881 - 1d6w7af33hHx1cOMwHME1Ls1hg== - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 969 - The Real Thing - Faith No More - 493635 - /cbr+Am4mkQ= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 970 - Underwater Love - Faith No More - 231993 - ofLyVtqU1p8nDJqDBkIbkfIO - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 971 - The Morning After - Faith No More - 223764 - jGVNkL+pyQ7zuOPuXJmJUOLR - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 972 - Woodpecker From Mars - Faith No More - 340532 - 5t4uNZMp7OH2hM9mF6oKuCFUYg== - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 973 - War Pigs - Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne - 464770 - rRCG4uZDHT3pffI5wLw= - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 974 - Edge Of The World - Faith No More - 250357 - sV0wuWfSxw== - 0.9900000000000000000 - 77 - 1 - 4 - 1 - - - 975 - Deixa Entrar - - 33619 - iSNSzENS4Wf8gA== - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 976 - Falamansa Song - - 237165 - iNVXS05PC6/4eZKW - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 977 - Xote Dos Milagres - - 269557 - W4JZWvGa+2HlPPy/lHfa - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 978 - Rindo À Toa - - 222066 - CBX1uSMzUlkR - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 979 - Confidência - - 222197 - aVsiz1n3jaxxwPmHdmGE - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 980 - Forró De Tóquio - - 169273 - o5hbjLnYMcQ= - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 981 - Zeca Violeiro - - 143673 - ZJzcgicw/w== - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 982 - Avisa - - 355030 - DjCfPhXjBTHn - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 983 - Principiando/Decolagem - - 116767 - GfGAn5M054+5/oUokQ== - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 984 - Asas - - 231915 - Xt/1WrAqSZD5 - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 985 - Medo De Escuro - - 213760 - ZzHl/Y61VVvR0Rg= - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 986 - Oração - - 271072 - b8QIqJuXdwE= - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 987 - Minha Gata - - 181838 - 5Z513zXtqoA= - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 988 - Desaforo - - 174524 - vYn4QTdiT+kBBKgpVw== - 0.9900000000000000000 - 78 - 1 - 7 - 1 - - - 989 - In Your Honor - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 230191 - EoxwMFEIj7E= - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 990 - No Way Back - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 196675 - +HyCkm8eWA== - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 991 - Best Of You - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 255712 - qtoUFI/ZLo2mWLGWc1iZjt4= - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 992 - DOA - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 252186 - UsS8WHcuC3D/xbQ= - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 993 - Hell - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 117080 - 38upPP5OQquDskKjq6/dG6ag4g== - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 994 - The Last Song - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 199523 - swzLkwpRY+UIHtpp2NZ55uw2 - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 995 - Free Me - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 278700 - Sksy4J+CGa3HUQ== - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 996 - Resolve - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 288731 - yl/iwBzS/xUxrOtco2TY - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 997 - The Deepest Blues Are Black - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 238419 - ytU29i5vRQ== - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 998 - End Over End - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett - 352078 - qIAsKxDwpJuUF1R6hhe6pufX - 0.9900000000000000000 - 79 - 1 - 1 - 1 - - - 999 - Still - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 313182 - rV/vj3zHqU/XkVs= - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1000 - What If I Do? - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 302994 - WhlKGJum0wRA - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1001 - Miracle - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 209684 - UMiLD11SshuPDldplzi48bA= - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1002 - Another Round - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 265848 - Z6HMCTlV+mE8/h4A - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1003 - Friend Of A Friend - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 193280 - 0sSmDycDbGlXnbwBTGvwgRE= - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1004 - Over And Out - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 316264 - qfZvnZ86Ro42FfwVs/yP+oSl8Q== - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1005 - On The Mend - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 271908 - ke1D+w8DEAfs6gk= - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1006 - Virginia Moon - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 229198 - Kp91CaQ1JWvImA== - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1007 - Cold Day In The Sun - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 200724 - V2xC6r9yUeZLj+jOvLN0jZsq - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1008 - Razor - Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS - 293276 - oksMHeoUh4Y= - 0.9900000000000000000 - 80 - 1 - 1 - 1 - - - 1009 - All My Life - Foo Fighters - 263653 - Tn+GYPkf647NGVA= - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1010 - Low - Foo Fighters - 268120 - mgO9T0LQuFYwqIk= - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1011 - Have It All - Foo Fighters - 298057 - ifaCS05X1Tjr+5jMCYfUnMfl - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1012 - Times Like These - Foo Fighters - 266370 - gtmpB0dPzqhDzjAlpvY= - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1013 - Disenchanted Lullaby - Foo Fighters - 273528 - 1wOdn0B2Qxipn2vwRbr8 - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1014 - Tired Of You - Foo Fighters - 311353 - jkvoBmff7zr8gA== - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1015 - Halo - Foo Fighters - 306442 - kmq71fLVw6/R/yikST7BAGfc - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1016 - Lonely As You - Foo Fighters - 277185 - iO1GsaLave/e - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1017 - Overdrive - Foo Fighters - 270550 - FGKjwMexre3KeRs= - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1018 - Burn Away - Foo Fighters - 298396 - CyscZaafyKU= - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1019 - Come Back - Foo Fighters - 469968 - h16e98FLuA== - 0.9900000000000000000 - 81 - 1 - 4 - 1 - - - 1020 - Doll - Dave, Taylor, Nate, Chris - 83487 - +jXl5be8nITkgY0TEp0= - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1021 - Monkey Wrench - Dave, Taylor, Nate, Chris - 231523 - QgbiG5U8NB0nOBmM - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1022 - Hey, Johnny Park! - Dave, Taylor, Nate, Chris - 248528 - BcgGZvXUz0M1nFNuf+HB - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1023 - My Poor Brain - Dave, Taylor, Nate, Chris - 213446 - OpLM6vpb8d4vI93GFw== - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1024 - Wind Up - Dave, Taylor, Nate, Chris - 152163 - rZ4wmH8ceycePs4f - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1025 - Up In Arms - Dave, Taylor, Nate, Chris - 135732 - aY6sFVpy/uymTQ== - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1026 - My Hero - Dave, Taylor, Nate, Chris - 260101 - CanWJzbS9ggrd++1 - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1027 - See You - Dave, Taylor, Nate, Chris - 146782 - 52KloxN0jRzbTodQgw6CVA== - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1028 - Enough Space - Dave Grohl - 157387 - 0QZRjY7VRVM= - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1029 - February Stars - Dave, Taylor, Nate, Chris - 289306 - TEjF85Z62G4t+M1b2DK/hi5b - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1030 - Everlong - Dave Grohl - 250749 - 1rPEdLQSpehksQ== - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1031 - Walking After You - Dave Grohl - 303856 - jV9PIidFVue3DXcV4Io= - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1032 - New Way Home - Dave, Taylor, Nate, Chris - 342230 - vfnUkQdfefZ8 - 0.9900000000000000000 - 82 - 1 - 1 - 1 - - - 1033 - My Way - claude françois/gilles thibault/jacques revaux/paul anka - 275879 - iNMQ4PGRdLzTam0LtQp6L0c= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1034 - Strangers In The Night - berthold kaempfert/charles singleton/eddie snyder - 155794 - QV+e4+ktVasU06n6FGnT5Z8= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1035 - New York, New York - fred ebb/john kander - 206001 - RQbGfANYDB8askPKFw== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1036 - I Get A Kick Out Of You - cole porter - 194429 - F9W0HZ+k6g== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1037 - Something Stupid - carson c. parks - 158615 - i0V9oBPZVgM40GoI6UHcxQ== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1038 - Moon River - henry mancini/johnny mercer - 198922 - RtbJE6JoSbvR4j61tUX7h2J6gQ== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1039 - What Now My Love - carl sigman/gilbert becaud/pierre leroyer - 149995 - YkQzyRZ6cg== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1040 - Summer Love - hans bradtke/heinz meier/johnny mercer - 174994 - Du7W+O/BWQ== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1041 - For Once In My Life - orlando murden/ronald miller - 171154 - INDp3DPlQfYXToKLb4GHxg== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1042 - Love And Marriage - jimmy van heusen/sammy cahn - 89730 - xvkBowD8KPU= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1043 - They Can't Take That Away From Me - george gershwin/ira gershwin - 161227 - reMLRsb06y1mkZGly30= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1044 - My Kind Of Town - jimmy van heusen/sammy cahn - 188499 - PLHI9+fwjWcQnQ== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1045 - Fly Me To The Moon - bart howard - 149263 - x1gqH9PA50k3XuvRh42f - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1046 - I've Got You Under My Skin - cole porter - 210808 - GvU0tvp8/WdPNDAN+A== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1047 - The Best Is Yet To Come - carolyn leigh/cy coleman - 173583 - fPuonSyTA0c= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1048 - It Was A Very Good Year - ervin drake - 266605 - 0b2BRaVR30BqSK9ycdvnLUs= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1049 - Come Fly With Me - jimmy van heusen/sammy cahn - 190458 - wtCfkNlRF+LvKOpg - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1050 - That's Life - dean kay thompson/kelly gordon - 187010 - PtM3Y/h5NlgWb/PGxEmtCh8= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1051 - The Girl From Ipanema - antonio carlos jobim/norman gimbel/vinicius de moraes - 193750 - b+A5QHceQOMwLsJh - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1052 - The Lady Is A Tramp - lorenz hart/richard rodgers - 184111 - Vgk8cZ45eO+0FQGsYKzJFAhp1w== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1053 - Bad, Bad Leroy Brown - jim croce - 169900 - Z3p/0v1cGSI= - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1054 - Mack The Knife - bert brecht/kurt weill/marc blitzstein - 292075 - SQiVtbidvIjXDtGn0g== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1055 - Loves Been Good To Me - rod mckuen - 203964 - yzeUFnJ2zijE6w== - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1056 - L.A. Is My Lady - alan bergman/marilyn bergman/peggy lipton jones/quincy jones - 193175 - T9uJanRCH1Xa - 0.9900000000000000000 - 83 - 1 - 12 - 1 - - - 1057 - Entrando Na Sua (Intro) - - 179252 - DWv3pw4NjDBbBSiV - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1058 - Nervosa - - 229537 - tJtoRaerRSBEqg== - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1059 - Funk De Bamba (Com Fernanda Abreu) - - 237191 - acEyHmPMsVH3T77LnW9jaUL3 - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1060 - Call Me At Cleo´s - - 236617 - 5mi6HNXOC/13qZRKycHTPk3bbg== - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1061 - Olhos Coloridos (Com Sandra De Sá) - - 321332 - j1PXnW/2z8rWREIDKdvDu64= - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1062 - Zambação - - 301113 - XU9XzjqnYgX0CsowFY7TKtmS - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1063 - Funk Hum - - 244453 - Ha3f/0EmM2eRIe4= - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1064 - Forty Days (Com DJ Hum) - - 221727 - F5CofR91wBkvOmoB - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1065 - Balada Da Paula - Emerson Villani - 322821 - AKYusy/+ATEqkPd9TxaoBg== - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1066 - Dujji - - 324597 - 0eMGDbKgbRC0 - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1067 - Meu Guarda-Chuva - - 248528 - GXli40LdOkGABLNhI+zM - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1068 - Motéis - - 213498 - /7AAz18XEu9ohvq3TQXB - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1069 - Whistle Stop - - 526132 - e0jnuMettaAU1Sg= - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1070 - 16 Toneladas - - 191634 - jG/AGUHFobwQ5A== - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1071 - Divirta-Se (Saindo Da Sua) - - 74919 - AWZzerzig/N6QhDl - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1072 - Forty Days Instrumental - - 292493 - BRMlUftfuorvEGL5xeF2iGQ= - 0.9900000000000000000 - 84 - 1 - 7 - 1 - - - 1073 - Óia Eu Aqui De Novo - - 219454 - kpfy5VFUM/i9keGtvw== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1074 - Baião Da Penha - - 247928 - ieUULZ9PwLApzBJVEIH2AQ== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1075 - Esperando Na Janela - Manuca/Raimundinho DoAcordion/Targino Godim - 261041 - axU9fU7oH8HRHgOiKahCUA== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1076 - Juazeiro - Humberto Teixeira/Luiz Gonzaga - 222275 - b9/MSegVRA== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1077 - Último Pau-De-Arara - Corumbá/José Gumarães/Venancio - 200437 - biXT+0SxAbyEdZc= - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1078 - Asa Branca - Humberto Teixeira/Luiz Gonzaga - 217051 - /jv99GvOMb0O/w== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1079 - Qui Nem Jiló - Humberto Teixeira/Luiz Gonzaga - 204695 - 0AQpEhc0w4IA+Jvfwg== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1080 - Assum Preto - Humberto Teixeira/Luiz Gonzaga - 199653 - xoxsAeWkMqrO6DM= - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1081 - Pau-De-Arara - Guio De Morais E Seus "Parentes"/Luiz Gonzaga - 191660 - 2N4a5IfTbgID9xqf6ofB - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1082 - A Volta Da Asa Branca - Luiz Gonzaga/Zé Dantas - 271020 - loliWzqopUHEuyhb - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1083 - O Amor Daqui De Casa - Gilberto Gil - 148636 - JTZA3jRc5WgccMdxwEnO - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1084 - As Pegadas Do Amor - Gilberto Gil - 209136 - zBdd4z8URIbYqC842B/Lqg== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1085 - Lamento Sertanejo - Dominguinhos/Gilberto Gil - 260963 - Ed7A2sG1Kw== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1086 - Casinha Feliz - Gilberto Gil - 32287 - i3oZm+p5X9bP96TKeLER8boFjA== - 0.9900000000000000000 - 85 - 1 - 10 - 1 - - - 1087 - Introdução (Live) - - 154096 - rI/9pRxermoOlwthMg== - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1088 - Palco (Live) - - 238315 - tJor6u4u0GII - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1089 - Is This Love (Live) - - 295262 - J+CaYMzPILs= - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1090 - Stir It Up (Live) - - 282409 - /i/8fHN+i8r0yDjrQ5hx/Xc= - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1091 - Refavela (Live) - - 236695 - zxddW0qG1H48w06dPnZP - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1092 - Vendedor De Caranguejo (Live) - - 248842 - M9e4HbdsYmPcms8= - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1093 - Quanta (Live) - - 357485 - 40cpY1UJUaPM - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1094 - Estrela (Live) - - 285309 - 5XWn9ULIfA== - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1095 - Pela Internet (Live) - - 263471 - icKcDGWZRVkNY7X5 - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1096 - Cérebro Eletrônico (Live) - - 231627 - r7aYmvWa60g0JaxrkPJCdcIp - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1097 - Opachorô (Live) - - 259526 - 54UQDaDX4pAe/Pw= - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1098 - Copacabana (Live) - - 289671 - 7tIjNb4PW00= - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1099 - A Novidade (Live) - - 316969 - kQ5UnO+g1A== - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1100 - Ghandi (Live) - - 222458 - AuRLORsS+p6p+MIS - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1101 - De Ouro E Marfim (Live) - - 234971 - zUs4N72Ybb2DZmfcbFV3 - 0.9900000000000000000 - 86 - 1 - 7 - 1 - - - 1102 - Doce De Carnaval (Candy All) - - 356101 - cLA2DeobF7C0 - 0.9900000000000000000 - 87 - 1 - 2 - 1 - - - 1103 - Lamento De Carnaval - - 294530 - vyiWFRaYOiQ= - 0.9900000000000000000 - 87 - 1 - 2 - 1 - - - 1104 - Pretinha - - 265273 - whtlMQhn6H4= - 0.9900000000000000000 - 87 - 1 - 2 - 1 - - - 1105 - A Novidade - Gilberto Gil - 324780 - 5FyuvILiOEiMBR+x - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1106 - Tenho Sede - Gilberto Gil - 261616 - h4Lq2UQnbk/PokeR - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1107 - Refazenda - Gilberto Gil - 218305 - oAt+LqUBnJnMWCQCprPdzg== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1108 - Realce - Gilberto Gil - 264489 - NAQSjpTjRy8jwRAuFbln - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1109 - Esotérico - Gilberto Gil - 317779 - zkItyl5fHhWbuw== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1110 - Drão - Gilberto Gil - 301453 - xtaec5CBw21DfyYMKDf/ - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1111 - A Paz - Gilberto Gil - 293093 - P4tqt5+919dxsAOt1eb88g== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1112 - Beira Mar - Gilberto Gil - 295444 - uYBYhE5/rQ== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1113 - Sampa - Gilberto Gil - 225697 - SySrpzYFk1/c34kxA4oJ - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1114 - Parabolicamará - Gilberto Gil - 284943 - xgLgfRWXXII0M262pv3xC70= - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1115 - Tempo Rei - Gilberto Gil - 302733 - U5krMDqqcE75B3LB1S93Wr5Mnw== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1116 - Expresso 2222 - Gilberto Gil - 284760 - O7PHKXMDlty43u4= - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1117 - Aquele Abraço - Gilberto Gil - 263993 - dJ03b9OWxzYNxw== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1118 - Palco - Gilberto Gil - 270550 - VQ9yXT8+TD+kbI0qn9ECvDc= - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1119 - Toda Menina Baiana - Gilberto Gil - 278177 - k5UaGfRNOA== - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1120 - Sítio Do Pica-Pau Amarelo - Gilberto Gil - 218070 - B4YohGkidBVxGQClV55sn0kR - 0.9900000000000000000 - 73 - 1 - 7 - 1 - - - 1121 - Straight Out Of Line - Sully Erna - 259213 - c5ee0NmPInkyhA== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1122 - Faceless - Sully Erna - 216006 - GiUlRzbFFyA= - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1123 - Changes - Sully Erna; Tony Rombola - 260022 - a7WKX+i7kbz1KHrQ4g== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1124 - Make Me Believe - Sully Erna - 248607 - xF9ptk71RqhC - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1125 - I Stand Alone - Sully Erna - 246125 - Nf7bgA9np4goDnq9DT7o - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1126 - Re-Align - Sully Erna - 260884 - /mWECQlrN75g580PyCu8wnP5Kg== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1127 - I Fucking Hate You - Sully Erna - 247170 - 3xCtjYHyp9TsB1IrzTD24SQ4 - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1128 - Releasing The Demons - Sully Erna - 252760 - ysYdICiZmMD9UbdJFBT+Pu24 - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1129 - Dead And Broken - Sully Erna - 251454 - iBfEY9FYlQ== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1130 - I Am - Sully Erna - 239516 - QZc02p47cmAiwvCE9OgyqYM0vg== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1131 - The Awakening - Sully Erna - 89547 - F8/yCSkusG8FYw== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1132 - Serenity - Sully Erna; Tony Rombola - 274834 - x5L3VyjJdhkNoQ== - 0.9900000000000000000 - 88 - 1 - 3 - 1 - - - 1133 - American Idiot - Billie Joe Armstrong, Mike Dirnt, Tré Cool - 174419 - 23v8MwKf5Rs= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1134 - Jesus Of Suburbia / City Of The Damned / I Don't Care / Dearly Beloved / Tales Of Another Broken Home - Billie Joe Armstrong/Green Day - 548336 - nJpXinGlKrFviwNav3Up8vyRCg== - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1135 - Holiday - Billie Joe Armstrong, Mike Dirnt, Tré Cool - 232724 - DBqwnGP0dg31LA== - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1136 - Boulevard Of Broken Dreams - Mike Dint, Billie Joe, Tré Cool - 260858 - iumDry07beWCn8U= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1137 - Are We The Waiting - Green Day - 163004 - gp5ZHAbTQQUO2zw= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1138 - St. Jimmy - Green Day - 175307 - geq6J30uHLtCe3lwOw== - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1139 - Give Me Novacaine - Green Day - 205871 - /LaOrIc/R3At/gnY - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1140 - She's A Rebel - Green Day - 120528 - OrQmAq6tsC1CgUVoVIM= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1141 - Extraordinary Girl - Green Day - 214021 - Zwcl6OA/14t3YVP8 - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1142 - Letterbomb - Green Day - 246151 - Eby7HaW+4gc= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1143 - Wake Me Up When September Ends - Mike Dint, Billie Joe, Tré Cool - 285753 - eMrDipi5NElD - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1144 - Homecoming / The Death Of St. Jimmy / East 12th St. / Nobody Likes You / Rock And Roll Girlfriend / We're Coming Home Again - Mike Dirnt/Tré Cool - 558602 - vD0JJtkh9zFi - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1145 - Whatsername - Green Day - 252316 - r6BasCQchsYnwpU= - 0.9900000000000000000 - 89 - 1 - 4 - 1 - - - 1146 - Welcome to the Jungle - - 273552 - AkuOWyVWph5WLh4gQE4I - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1147 - It's So Easy - - 202824 - 4fyujX/dbNhvEmZ8Mm4= - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1148 - Nightrain - - 268537 - gJ0bO72Yfvs= - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1149 - Out Ta Get Me - - 263893 - ikTSgYI6cNYT8eQrFAghJN61 - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1150 - Mr. Brownstone - - 228924 - E+8p6+gNnYMkEkr9YwANAjoL6w== - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1151 - Paradise City - - 406347 - NKGQaECK9WyU+hff4g== - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1152 - My Michelle - - 219961 - 6LFgWOp05bZLw8nz - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1153 - Think About You - - 231640 - KgcG5hnyX7dxX8GrXhcw - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1154 - Sweet Child O' Mine - - 356424 - KvtrG9EYXKLi - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1155 - You're Crazy - - 197135 - d3F+VsyfTQ== - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1156 - Anything Goes - - 206400 - y2SOFP7sgtt3Up+t - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1157 - Rocket Queen - - 375349 - XLTHIche2K8Rq2ME+HvtOBuS - 0.9900000000000000000 - 90 - 2 - 1 - 1 - - - 1158 - Right Next Door to Hell - - 182321 - XVRLy2AV/H+Y9aEJAzSVGr23NA== - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1159 - Dust N' Bones - - 298374 - QXRZubkqEAZwlaJbvw== - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1160 - Live and Let Die - - 184016 - UDcR6GYLy94/uXA= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1161 - Don't Cry (Original) - - 284744 - YM9iYTCB5o3g6PqS - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1162 - Perfect Crime - - 143637 - NgX2DgNSRUmF5F4J - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1163 - You Ain't the First - - 156268 - UCk4YjWgSBg= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1164 - Bad Obsession - - 328282 - QKMPZCF1MpxnPH7VMAbU0Dw= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1165 - Back off Bitch - - 303436 - K1fa6wRXWzC8VH6zWkn6bMQ= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1166 - Double Talkin' Jive - - 203637 - /58xzxfpfSGK/yAjZJE= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1167 - November Rain - - 537540 - OR3A7lWetwnwuN0es+E128NB - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1168 - The Garden - - 322175 - 0Z01Wz/xbuPNXA== - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1169 - Garden of Eden - - 161539 - mfDsuiErOX1vtUeWQRY= - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1170 - Don't Damn Me - - 318901 - y8lAVSNc4uLA - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1171 - Bad Apples - - 268351 - BMGA/ee76qzfH+wx+MAJ - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1172 - Dead Horse - - 257600 - RtLLiQf0RQUmpKJ4OLO3DStf - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1173 - Coma - - 616511 - ariAh/pc6WH3TZnQf0uBFg8XNg== - 0.9900000000000000000 - 91 - 2 - 1 - 1 - - - 1174 - Civil War - Duff McKagan/Slash/W. Axl Rose - 461165 - EHx71kIYcnQrZ98FmQ== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1175 - 14 Years - Izzy Stradlin'/W. Axl Rose - 261355 - n+nFStEtHpJNuI3TIw== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1176 - Yesterdays - Billy/Del James/W. Axl Rose/West Arkeen - 196205 - tp2n9vUKDO09qkXh6nQ1 - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1177 - Knockin' On Heaven's Door - Bob Dylan - 336457 - bZQ33KyYUMVFCTZ9 - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1178 - Get In The Ring - Duff McKagan/Slash/W. Axl Rose - 341054 - wklv9UW9jsDoEI+WsasbBO9C - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1179 - Shotgun Blues - W. Axl Rose - 203206 - Xb5K+JxGgB1M4bHr1A== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1180 - Breakdown - W. Axl Rose - 424960 - vnpg1uyktqfOhIOnRfrtNQ== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1181 - Pretty Tied Up - Izzy Stradlin' - 287477 - VcaMH3B4UNKuxaBB3jckugby - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1182 - Locomotive - Slash/W. Axl Rose - 522396 - ui4DnvK278V09ACFMA== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1183 - So Fine - Duff McKagan - 246491 - IFwlR29OAhADPg== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1184 - Estranged - W. Axl Rose - 563800 - FmXwTV/sPgc= - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1185 - You Could Be Mine - Izzy Stradlin'/W. Axl Rose - 343875 - epJRKJppgbLb3a0/cCq+2/9zlw== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1186 - Don't Cry - Izzy Stradlin'/W. Axl Rose - 284238 - Laorxb/cUP94FQfCfnOcjgo= - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1187 - My World - W. Axl Rose - 84532 - rQXMUDQmkA== - 0.9900000000000000000 - 92 - 1 - 3 - 1 - - - 1188 - Colibri - Richard Bull - 361012 - pjsxcmB5p2KPz2eMaQ== - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1189 - Love Is The Colour - R. Carless - 251585 - GYI6xtXrwfyNL9ECxpHY - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1190 - Magnetic Ocean - Patrick Claher/Richard Bull - 321123 - dgQ0HzYVzQa0jhob5A== - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1191 - Deep Waters - Richard Bull - 396460 - J32U7+xKFm5Qpd6prQKgXrIW - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1192 - L'Arc En Ciel De Miles - Kevin Robinson/Richard Bull - 242390 - sVliWEmHA7QzEUfRphjA - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1193 - Gypsy - Kevin Robinson - 330997 - U27XpI3HBw== - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1194 - Journey Into Sunlight - Jean Paul Maunick - 249756 - j0GMZ8tlVtsDkDJzxQ== - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1195 - Sunchild - Graham Harvey - 259970 - SmfoleJcCdQ3kOz6TfDb - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1196 - Millenium - Maxton Gig Beesley Jnr. - 379167 - /OpRrcgH+pzpzrtrzRXmTUIt - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1197 - Thinking 'Bout Tomorrow - Fayyaz Virgi/Richard Bull - 355395 - b7z45Kuruwn7ew== - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1198 - Jacob's Ladder - Julian Crampton - 367647 - F2UAkZNHIRdcQ21MqxSgngY= - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1199 - She Wears Black - G Harvey/R Hope-Taylor - 528666 - qp63H81stQQ= - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1200 - Dark Side Of The Cog - Jean Paul Maunick - 377155 - pgIN/f4gGbZVajuCniw= - 0.9900000000000000000 - 93 - 1 - 2 - 1 - - - 1201 - Different World - - 258692 - 0OACb0zQCgy051HcGfeYkw== - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1202 - These Colours Don't Run - - 412152 - jkJ6FU9FbiuSXUszyqALcoxP - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1203 - Brighter Than a Thousand Suns - - 526255 - aka4NJv1WBU= - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1204 - The Pilgrim - - 307593 - RP++vddg81yx - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1205 - The Longest Day - - 467810 - gZqUQ7lzv9nqR0Vp - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1206 - Out of the Shadows - - 336896 - qKspldYN3h8= - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1207 - The Reincarnation of Benjamin Breeg - - 442106 - L8Dmkp6NXGqsrw== - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1208 - For the Greater Good of God - - 564893 - d81S1gL+wdwcbs5n2nM= - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1209 - Lord of Light - - 444614 - Eq3KHE7S9Ytq01wm1DF8f5qWqQ== - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1210 - The Legacy - - 562966 - 21hSk9dMAgOHYVkMH4g= - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1211 - Hallowed Be Thy Name (Live) (Non Album Bonus Track) - - 431262 - rqCQYe2BQec= - 0.9900000000000000000 - 94 - 2 - 1 - 1 - - - 1212 - The Number Of The Beast - Steve Harris - 294635 - pdfsqp/uM9Ax - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1213 - The Trooper - Steve Harris - 235311 - OrlaNkUC0PID - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1214 - Prowler - Steve Harris - 255634 - eVAHTLbO3wo0u5KZ - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1215 - Transylvania - Steve Harris - 265874 - T+7/X1djmC4= - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1216 - Remember Tomorrow - Paul Di'Anno/Steve Harris - 352731 - 2r9OwVRpS14djj7eiVTQ - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1217 - Where Eagles Dare - Steve Harris - 289358 - 89EOKJx2zKBICkhFoniPag== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1218 - Sanctuary - David Murray/Paul Di'Anno/Steve Harris - 293250 - 8HZH/fV5dr/Wng== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1219 - Running Free - Paul Di'Anno/Steve Harris - 228937 - W5LGmS++ZJKKBexk8614SSAFuw== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1220 - Run To The Hilss - Steve Harris - 237557 - /9MCmN6Iov5XmGk= - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1221 - 2 Minutes To Midnight - Adrian Smith/Bruce Dickinson - 337423 - 18hFtUSuFeQU/ODVBBFUUHwwVQ== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1222 - Iron Maiden - Steve Harris - 324623 - GvoEiI8tu6cbZjrxmw== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1223 - Hallowed Be Thy Name - Steve Harris - 471849 - jCtnwwRy8NePAvItlMwzUg== - 0.9900000000000000000 - 95 - 1 - 3 - 1 - - - 1224 - Be Quick Or Be Dead - Bruce Dickinson/Janick Gers - 196911 - J0Kvq93EvSUX8m3IrsLuOQ== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1225 - From Here To Eternity - Steve Harris - 259866 - hSjouSzjyUJqAZVi - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1226 - Can I Play With Madness - Adrian Smith/Bruce Dickinson/Steve Harris - 282488 - 73PJ5BOv7HqvZ6qd7A== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1227 - Wasting Love - Bruce Dickinson/Janick Gers - 347846 - gg/hQAPzt0cKacj6Xw== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1228 - Tailgunner - Bruce Dickinson/Steve Harris - 249469 - aXLDJ8J/A/r/ya4/TWLVwQ== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1229 - The Evil That Men Do - Adrian Smith/Bruce Dickinson/Steve Harris - 325929 - Gz9jRjOIwA== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1230 - Afraid To Shoot Strangers - Steve Harris - 407980 - b+GoaV8bGE8= - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1231 - Bring Your Daughter... To The Slaughter - Bruce Dickinson - 317727 - ETykg9ptfIgQFw== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1232 - Heaven Can Wait - Steve Harris - 448574 - w6VUcUgrrLv7oDXqApVT - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1233 - The Clairvoyant - Steve Harris - 269871 - WpCfrpbvSA== - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1234 - Fear Of The Dark - Steve Harris - 431333 - mB26QNHnviNwLs7KjDYgNG9d - 0.9900000000000000000 - 96 - 1 - 3 - 1 - - - 1235 - The Wicker Man - Adrian Smith/Bruce Dickinson/Steve Harris - 275539 - ZdtSoe2HzyH3cGn7 - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1236 - Ghost Of The Navigator - Bruce Dickinson/Janick Gers/Steve Harris - 410070 - XAPZK3Br6RPhEnnTxogRI3A= - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1237 - Brave New World - Bruce Dickinson/David Murray/Steve Harris - 378984 - Pzmb43VGfM25AsXGsgYz+m2IXQ== - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1238 - Blood Brothers - Steve Harris - 434442 - wwNzQIPJ2M0m/73+hgUqwjh5 - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1239 - The Mercenary - Janick Gers/Steve Harris - 282488 - kq+jsuZOGmByoMwaiMV7pw== - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1240 - Dream Of Mirrors - Janick Gers/Steve Harris - 561162 - xVtfrG2uprpEx0Cs3HHC9Pk= - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1241 - The Fallen Angel - Adrian Smith/Steve Harris - 240718 - RSBQjfFoaGUtWuQ0OApe7v3dGQ== - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1242 - The Nomad - David Murray/Steve Harris - 546115 - JAD9+KKH2rOWLwkmj/o= - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1243 - Out Of The Silent Planet - Bruce Dickinson/Janick Gers/Steve Harris - 385541 - h+s4afdDCIBL - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1244 - The Thin Line Between Love & Hate - David Murray/Steve Harris - 506801 - D441Tu1z5doXpkUiWOpqjbU= - 0.9900000000000000000 - 97 - 1 - 1 - 1 - - - 1245 - Wildest Dreams - Adrian Smith/Steve Harris - 232777 - /lC9pT3U1wPFcw== - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1246 - Rainmaker - Bruce Dickinson/David Murray/Steve Harris - 228623 - nxx/sSKS+KVlqbsk - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1247 - No More Lies - Steve Harris - 441782 - d1TxZJJN/mmNOIL7F2lQ - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1248 - Montsegur - Bruce Dickinson/Janick Gers/Steve Harris - 350484 - dumucbh3icVxNVdx6FAmQys= - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1249 - Dance Of Death - Janick Gers/Steve Harris - 516649 - LujjcnF3dbkR4w== - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1250 - Gates Of Tomorrow - Bruce Dickinson/Janick Gers/Steve Harris - 312032 - tgopp0Tuvwyzk//LLPNd - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1251 - New Frontier - Adrian Smith/Bruce Dickinson/Nicko McBrain - 304509 - jIA9Ej7PpTtnfQM= - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1252 - Paschendale - Adrian Smith/Steve Harris - 508107 - Nvz/ZqXHuysuyqNh - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1253 - Face In The Sand - Adrian Smith/Bruce Dickinson/Steve Harris - 391105 - NnjfLh23fxSC6DjU0Q== - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1254 - Age Of Innocence - David Murray/Steve Harris - 370468 - 5mXtP8fqR9W2k5kmZDcyxg== - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1255 - Journeyman - Bruce Dickinson/David Murray/Steve Harris - 427023 - 3dusCFbGDUrGg2S0Ew== - 0.9900000000000000000 - 98 - 1 - 13 - 1 - - - 1256 - Be Quick Or Be Dead - Bruce Dickinson/Janick Gers - 204512 - ktQI1MVBitw= - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1257 - From Here To Eternity - Steve Harris - 218357 - H2HBS5X3UkjiuyVb - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1258 - Afraid To Shoot Strangers - Steve Harris - 416496 - JLaPnuD1AWbiIaPMB1JbYw== - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1259 - Fear Is The Key - Bruce Dickinson/Janick Gers - 335307 - hTgAZI2nlQ== - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1260 - Childhood's End - Steve Harris - 280607 - eFNzO4L47WyZr1JEJw== - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1261 - Wasting Love - Bruce Dickinson/Janick Gers - 350981 - ldsQPD8efo2l9uR2Nu1alJcP - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1262 - The Fugitive - Steve Harris - 294112 - ImiijSpgKLVgbaIJH0QkoyRT - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1263 - Chains Of Misery - Bruce Dickinson/David Murray - 217443 - Z3b96q18VwzB/xEEF0JJBA== - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1264 - The Apparition - Janick Gers/Steve Harris - 234605 - 8k3m2xdpHR8C7cQx - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1265 - Judas Be My Guide - Bruce Dickinson/David Murray - 188786 - SjVBR6iEJX70EdNUZ7VPaYs= - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1266 - Weekend Warrior - Janick Gers/Steve Harris - 339748 - 1UArsNdtdVAN4Mqrj5LarrU= - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1267 - Fear Of The Dark - Steve Harris - 436976 - w9Caxd56/jwTh7CzzbY= - 0.9900000000000000000 - 99 - 1 - 1 - 1 - - - 1268 - 01 - Prowler - Steve Harris - 236173 - Ju7x55pe1NJYd0WzSIJAebgAcw== - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1269 - 02 - Sanctuary - David Murray/Paul Di'Anno/Steve Harris - 196284 - uywQYbGxmlntn1kSFDRoo+nHGg== - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1270 - 03 - Remember Tomorrow - Harris/Paul Di´Anno - 328620 - 7v5CTpnGtbnSDfezWRC7+t6P - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1271 - 04 - Running Free - Harris/Paul Di´Anno - 197276 - 6MN65LgdM58UGZyP8OX3 - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1272 - 05 - Phantom of the Opera - Steve Harris - 428016 - vOnCyOr74Yc= - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1273 - 06 - Transylvania - Steve Harris - 259343 - qKW4A3huxVmSMrl0GYowZSc= - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1274 - 07 - Strange World - Steve Harris - 332460 - nzV9B85iWf4QG8dL7OLzBBB3 - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1275 - 08 - Charlotte the Harlot - Murray Dave - 252708 - m5ur1zZesj1C - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1276 - 09 - Iron Maiden - Steve Harris - 216058 - X5Jiw1lBUWE= - 0.9900000000000000000 - 100 - 1 - 6 - 1 - - - 1277 - The Ides Of March - Steve Harris - 105926 - 11WqeV2qkUc= - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1278 - Wrathchild - Steve Harris - 174471 - 1oEVernqiwb0Xg== - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1279 - Murders In The Rue Morgue - Steve Harris - 258377 - qBslFluxiWWHk6Ghom6g - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1280 - Another Life - Steve Harris - 203049 - 8SFOLKQXbWfBjeTYdzdTTfIa - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1281 - Genghis Khan - Steve Harris - 187141 - uzCTHqshLL+yNd9yCxnE - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1282 - Innocent Exile - Di´Anno/Harris - 232515 - 5aUxo5CtvVXNzLDtTz8= - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1283 - Killers - Steve Harris - 300956 - r4h25PVeA6ILd1i7MuEb2Q== - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1284 - Prodigal Son - Steve Harris - 372349 - s55up8B2Zw5yPVDecD5vcuEw - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1285 - Purgatory - Steve Harris - 200150 - lTXPO+ECJis= - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1286 - Drifter - Steve Harris - 288757 - 8ot0svPwOrHRrO4RDtaCIA== - 0.9900000000000000000 - 101 - 1 - 13 - 1 - - - 1287 - Intro- Churchill S Speech - - 48013 - w5o46ElQsDFEiuM= - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1288 - Aces High - - 276375 - jKSaSy4b58md - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1289 - 2 Minutes To Midnight - Smith/Dickinson - 366550 - gAS+oDVC2IZfTBouPos= - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1290 - The Trooper - Harris - 268878 - UKg7xIGuZVZORAdUxt8= - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1291 - Revelations - Dickinson - 371826 - m1cV2Bo0Kaga - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1292 - Flight Of Icarus - Smith/Dickinson - 229982 - WL0rl0heZQ9Y3nKrBBs8Gq1w - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1293 - Rime Of The Ancient Mariner - - 789472 - Lu4Sp6SwwhhmcL0mACBWKPE= - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1294 - Powerslave - - 454974 - vgXmoUVtAEfvUvqb/4a5TA== - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1295 - The Number Of The Beast - Harris - 275121 - f0YWh+eGRf+emg== - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1296 - Hallowed Be Thy Name - Harris - 451422 - couu8kvh7mt1 - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1297 - Iron Maiden - Harris - 261955 - qaWmXcBvHspxNw== - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1298 - Run To The Hills - Harris - 231627 - szTW4tqy136goabSSNRkpAc= - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1299 - Running Free - Harris/Di Anno - 204617 - HpdO117WoXApJhY= - 0.9900000000000000000 - 102 - 1 - 3 - 1 - - - 1300 - Wrathchild - Steve Harris - 183666 - NCxjS75X2BBwLhfs1OsC - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1301 - Acacia Avenue - - 379872 - XYhbyxZ6Up8e29UAQWqJ - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1302 - Children Of The Damned - Steve Harris - 278177 - Z3lteW79FQ3M99/vgGEDc9POEg== - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1303 - Die With Your Boots On - Adrian Smith/Bruce Dickinson/Steve Harris - 314174 - yksQudnELOKB184GpWaEW30= - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1304 - Phantom Of The Opera - Steve Harris - 441155 - Y2ByTv8fm2MevNhhLXJX - 0.9900000000000000000 - 102 - 1 - 13 - 1 - - - 1305 - Be Quick Or Be Dead - - 233142 - 5hxos6Cq0DKL9CjY - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1306 - The Number Of The Beast - - 294008 - Gt2o9kpqsi18S/Aedg== - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1307 - Wrathchild - - 174106 - cAogqluvvH9o - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1308 - From Here To Eternity - - 284447 - yei5jz/DCvfCGAPfMGvi - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1309 - Can I Play With Madness - - 213106 - pLpq0HeVKQRg - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1310 - Wasting Love - - 336953 - a0rMKY2adbUsYrAj7rk= - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1311 - Tailgunner - - 247640 - +FxeopHZtMhTCg== - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1312 - The Evil That Men Do - - 478145 - FZd6NL+1LxdXwCs= - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1313 - Afraid To Shoot Strangers - - 412525 - i2hqez9/V4HMsY9/OMth - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1314 - Fear Of The Dark - - 431542 - TraCeB6LhQ== - 0.9900000000000000000 - 103 - 1 - 1 - 1 - - - 1315 - Bring Your Daughter... To The Slaughter... - - 376711 - Ovej+/PWYYDNw9I= - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1316 - The Clairvoyant - - 262426 - Jl51SPyJNWQI+/zzVGDIoT6zeg== - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1317 - Heaven Can Wait - - 440555 - 44xAR9xbjfVPDrF0+Ceo70A= - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1318 - Run To The Hills - - 235859 - e5RVINQ++6+mkw2/QhlJ - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1319 - 2 Minutes To Midnight - Adrian Smith/Bruce Dickinson - 338233 - VpkeLWug+0AU - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1320 - Iron Maiden - - 494602 - SYf7LLjYYAQ= - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1321 - Hallowed Be Thy Name - - 447791 - 5arCuAFMLbX655DL - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1322 - The Trooper - - 232672 - KiXQDtETzQ== - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1323 - Sanctuary - - 318511 - mBUM2vV0s3naNQ== - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1324 - Running Free - - 474017 - PeJkKJPhHOE+6w== - 0.9900000000000000000 - 104 - 1 - 1 - 1 - - - 1325 - Tailgunner - Bruce Dickinson/Steve Harris - 255582 - WIQusVzWXKkHTQ== - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1326 - Holy Smoke - Bruce Dickinson/Steve Harris - 229459 - XEyVtt0M2Hk7H7IwjbXG/A== - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1327 - No Prayer For The Dying - Steve Harris - 263941 - LbQxj++XvYes - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1328 - Public Enema Number One - Bruce Dickinson/David Murray - 254197 - F90dMS4RB4YYk9wEEAk= - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1329 - Fates Warning - David Murray/Steve Harris - 250853 - sOGlU6D8ltk= - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1330 - The Assassin - Steve Harris - 258768 - fFIbp2y01y8xyMCbHe6EHoYv - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1331 - Run Silent Run Deep - Bruce Dickinson/Steve Harris - 275408 - aGAopCjKP7YXNAs= - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1332 - Hooks In You - Adrian Smith/Bruce Dickinson - 247510 - gQP+tNz2Xxpju63T - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1333 - Bring Your Daughter... ...To The Slaughter - Bruce Dickinson - 284238 - SCmT8iE0Gcw= - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1334 - Mother Russia - Steve Harris - 332617 - cb5TrvPdLP7A+yWBP5geOQ== - 0.9900000000000000000 - 105 - 1 - 3 - 1 - - - 1335 - Where Eagles Dare - Steve Harris - 369554 - KCYVS6yyVVvfoA== - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1336 - Revelations - Bruce Dickinson - 408607 - w/b/8XqZkkBhLQKC - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1337 - Flight Of The Icarus - Adrian Smith/Bruce Dickinson - 230269 - ZPuyrcYJkXQ= - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1338 - Die With Your Boots On - Adrian Smith/Bruce Dickinson/Steve Harris - 325694 - eQvyt5zEDP5SEw== - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1339 - The Trooper - Steve Harris - 251454 - gDvJ+zMGpQbd2Hol - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1340 - Still Life - David Murray/Steve Harris - 294347 - KOax/6eU1g83CX3z/g== - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1341 - Quest For Fire - Steve Harris - 221309 - /c00Y9vuRmwoMbZ6wGSKluD+5g== - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1342 - Sun And Steel - Adrian Smith/Bruce Dickinson - 206367 - j7UTDFa9PSxIMUwINA== - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1343 - To Tame A Land - Steve Harris - 445283 - qDipdZ42Xru+f0kt1HGE - 0.9900000000000000000 - 106 - 1 - 3 - 1 - - - 1344 - Aces High - Harris - 269531 - KX4NsDNHuSgMHrEZI/fl - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1345 - 2 Minutes To Midnight - Smith/Dickinson - 359810 - RXy8Uu1rYK/w1PeU - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1346 - Losfer Words - Steve Harris - 252891 - KOjLp6gIzfs= - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1347 - Flash of The Blade - Dickinson - 242729 - EGB+gWiAhQ== - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1348 - Duelists - Steve Harris - 366471 - l8eamudXtTKzvh5ewF9QJWXk - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1349 - Back in the Village - Dickinson/Smith - 320548 - 5XF77hezwWxb02sC3yk= - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1350 - Powerslave - Dickinson - 407823 - PDD6KECQFnT0Sg== - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1351 - Rime of the Ancient Mariner - Harris - 816509 - nMOwEFkchEqg - 0.9900000000000000000 - 107 - 1 - 3 - 1 - - - 1352 - Intro - - 115931 - HNiC5yXrWl9Huz41FSIfKzyjpA== - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1353 - The Wicker Man - Adrian Smith/Bruce Dickinson/Steve Harris - 281782 - /IakaBb+u0t6T36UiNggWHdB - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1354 - Ghost Of The Navigator - Bruce Dickinson/Janick Gers/Steve Harris - 408607 - pbwVrY5wZ66O - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1355 - Brave New World - Bruce Dickinson/David Murray/Steve Harris - 366785 - Lt/gptHWlTMa0CcvDuX3Pao= - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1356 - Wrathchild - Steve Harris - 185808 - PALHs/uI/hLn2RX3rk8t - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1357 - 2 Minutes To Midnight - Adrian Smith/Bruce Dickinson - 386821 - S2+d7rYCiiRdcPM= - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1358 - Blood Brothers - Steve Harris - 435513 - rTC1Uca7cYspeuRYp77uvB4i - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1359 - Sign Of The Cross - Steve Harris - 649116 - 1wK0mYifu/U6d6JWi5SJZbYjxA== - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1360 - The Mercenary - Janick Gers/Steve Harris - 282697 - 892iMNGLREf3E84GOk4bcw== - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1361 - The Trooper - Steve Harris - 273528 - ly2yC8U3E4YjWcQdWQ== - 0.9900000000000000000 - 108 - 1 - 3 - 1 - - - 1362 - Dream Of Mirrors - Janick Gers/Steve Harris - 578324 - mFnwLvpgg8f9WnP+ - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1363 - The Clansman - Steve Harris - 559203 - qJwcPHkVbR/2EiY= - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1364 - The Evil That Men Do - Adrian Smith/Bruce Dickinson/Steve Harris - 280737 - po6qrTKAKZ7aNqxJICETdA== - 0.9900000000000000000 - 109 - 1 - 3 - 1 - - - 1365 - Fear Of The Dark - Steve Harris - 460695 - MFeXxg9q6QccSwg= - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1366 - Iron Maiden - Steve Harris - 351869 - GaJHyv9T0dk= - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1367 - The Number Of The Beast - Steve Harris - 300434 - y9lJX0xy8NIcVwL4 - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1368 - Hallowed Be Thy Name - Steve Harris - 443977 - xrqPZ5YjwKUVNSGywZNkfyA= - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1369 - Sanctuary - David Murray/Paul Di'Anno/Steve Harris - 317335 - QZu0ZX1NZ8P4+Q== - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1370 - Run To The Hills - Steve Harris - 292179 - //MG88nbjTuXvK4YdLWjKK0= - 0.9900000000000000000 - 109 - 1 - 1 - 1 - - - 1371 - Moonchild - Adrian Smith; Bruce Dickinson - 340767 - 3otT/InAXJphPEEA0yvGcRZC - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1372 - Infinite Dreams - Steve Harris - 369005 - vvi310SJEZOCQK/ZJbk4GW7h - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1373 - Can I Play With Madness - Adrian Smith; Bruce Dickinson; Steve Harris - 211043 - akWWLnpQ+Zbogw== - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1374 - The Evil That Men Do - Adrian Smith; Bruce Dickinson; Steve Harris - 273998 - A55hDe6SJg== - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1375 - Seventh Son of a Seventh Son - Steve Harris - 593580 - D3J3LdpasQ== - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1376 - The Prophecy - Dave Murray; Steve Harris - 305475 - HEebEliPEw== - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1377 - The Clairvoyant - Adrian Smith; Bruce Dickinson; Steve Harris - 267023 - 1CfJPYZK8ikQMD0RdxfKpfI= - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1378 - Only the Good Die Young - Bruce Dickinson; Harris - 280894 - 0ZDzGLzUye3dT01w - 0.9900000000000000000 - 110 - 1 - 3 - 1 - - - 1379 - Caught Somewhere in Time - Steve Harris - 445779 - c4uJOMfI6S3FgE0dqRyf6w== - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1380 - Wasted Years - Adrian Smith - 307565 - fPUfnb6C5Lxr9XM= - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1381 - Sea of Madness - Adrian Smith - 341995 - bKPbnzbKhu7e - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1382 - Heaven Can Wait - Steve Harris - 441417 - 3AiNDBCl+xO3KQLZ - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1383 - Stranger in a Strange Land - Adrian Smith - 344502 - WFFbtQilfFvT - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1384 - Alexander the Great - Steve Harris - 515631 - lFjccn5yUhn8JXkYFxCx - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1385 - De Ja Vu - David Murray/Steve Harris - 296176 - P8FYPkqWk9GD - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1386 - The Loneliness of the Long Dis - Steve Harris - 391314 - 2xR9SGKnCZP5tDQzfKBkDwWzWA== - 0.9900000000000000000 - 111 - 1 - 3 - 1 - - - 1387 - 22 Acacia Avenue - Adrian Smith/Steve Harris - 395572 - OUsDlma7A5Ur/cUK7jA= - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1388 - Children of the Damned - Steve Harris - 274364 - Ppy0wtEPhBf9PgxE - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1389 - Gangland - Adrian Smith/Clive Burr/Steve Harris - 228440 - 2TuR33hEFI8R5+KnpHRn - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1390 - Hallowed Be Thy Name - Steve Harris - 428669 - 7ilETAkmclHxhjC1MwZYWQ== - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1391 - Invaders - Steve Harris - 203180 - S7vvbOWSqhwH - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1392 - Run to the Hills - Steve Harris - 228884 - tdEbLZocGw4Ux/eus8g/7vETXg== - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1393 - The Number Of The Beast - Steve Harris - 293407 - Co6IMFi4d48JlpowAfm9 - 0.9900000000000000000 - 112 - 1 - 1 - 1 - - - 1394 - The Prisoner - Adrian Smith/Steve Harris - 361299 - 1VmVmRj4Q5J/nQcnLA== - 0.9900000000000000000 - 112 - 1 - 3 - 1 - - - 1395 - Sign Of The Cross - Steve Harris - 678008 - oJa9rCImSOvU4qSMBX0txg== - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1396 - Lord Of The Flies - Janick Gers/Steve Harris - 303699 - ugvAGJh+xA== - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1397 - Man On The Edge - Blaze Bayley/Janick Gers - 253413 - Ekv2sLuxUGIR9gM= - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1398 - Fortunes Of War - Steve Harris - 443977 - VdeWNumEs/WM88VkuPBNHGw= - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1399 - Look For The Truth - Blaze Bayley/Janick Gers/Steve Harris - 310230 - Bxj4aA/bUjsZMVMp84cpVFfj - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1400 - The Aftermath - Blaze Bayley/Janick Gers/Steve Harris - 380786 - iS4Uys+3H4WS98pjM/Yy - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1401 - Judgement Of Heaven - Steve Harris - 312476 - 63nsx7rkrg== - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1402 - Blood On The World's Hands - Steve Harris - 357799 - gqFi/z47ZJhpp+Kw800psQ== - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1403 - The Edge Of Darkness - Blaze Bayley/Janick Gers/Steve Harris - 399333 - Vb9DTs0gMsGYPtpr - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1404 - 2 A.M. - Blaze Bayley/Janick Gers/Steve Harris - 337658 - uaSAqUguVCBH - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1405 - The Unbeliever - Janick Gers/Steve Harris - 490422 - kjL5ixSC+51QOtZkJGobtIA= - 0.9900000000000000000 - 113 - 1 - 1 - 1 - - - 1406 - Futureal - Blaze Bayley/Steve Harris - 175777 - Pab8iixN7j0vSgX6XNAOabEc - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1407 - The Angel And The Gambler - Steve Harris - 592744 - lB4/nKCJMEVVgBWNk60k4g== - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1408 - Lightning Strikes Twice - David Murray/Steve Harris - 290377 - WQcFq53WUrCYVg== - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1409 - The Clansman - Steve Harris - 539689 - Bla7uf/h7BH+CVwB+wiYvRq8 - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1410 - When Two Worlds Collide - Blaze Bayley/David Murray/Steve Harris - 377312 - TDftbQ+pFif2SOw= - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1411 - The Educated Fool - Steve Harris - 404767 - CDJTPv7EWw== - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1412 - Don't Look To The Eyes Of A Stranger - Steve Harris - 483657 - ssET5Jj9BgmjBBk4 - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1413 - Como Estais Amigos - Blaze Bayley/Janick Gers - 330292 - JwmlGeisEA== - 0.9900000000000000000 - 114 - 1 - 1 - 1 - - - 1414 - Please Please Please - James Brown/Johnny Terry - 165067 - ufXJEh1Tz6jJmQ== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1415 - Think - Lowman Pauling - 166739 - vi6+iyQJ1RGjDYTx - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1416 - Night Train - Jimmy Forrest/Lewis C. Simpkins/Oscar Washington - 212401 - tPfhKK0lFhhLpvnLStJ6qjc= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1417 - Out Of Sight - Ted Wright - 143725 - 2WsgecVofoEPE5ts2zQDml0lcg== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1418 - Papa's Got A Brand New Bag Pt.1 - James Brown - 127399 - +6OD33OIxb8= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1419 - I Got You (I Feel Good) - James Brown - 167392 - N1pnbKyqhg07MniqKxUCfd4= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1420 - It's A Man's Man's Man's World - Betty Newsome/James Brown - 168228 - xMiwdFU3kWU250AFPaO+p9i5Mw== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1421 - Cold Sweat - Alfred Ellis/James Brown - 172408 - L4p8jCLy+fvQjYFilL0A9ynC - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1422 - Say It Loud, I'm Black And I'm Proud Pt.1 - Alfred Ellis/James Brown - 167392 - L9pGdJ/NNfXV7IM9SUndmzo= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1423 - Get Up (I Feel Like Being A) Sex Machine - Bobby Byrd/James Brown/Ron Lenhoff - 316551 - I1JiPZWVqGXecH8= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1424 - Hey America - Addie William Jones/Nat Jones - 218226 - xn4VtAQl6Bbdv+z9JA5MUDgY - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1425 - Make It Funky Pt.1 - Charles Bobbitt/James Brown - 196231 - IcasBXCh8UWxzA== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1426 - I'm A Greedy Man Pt.1 - Charles Bobbitt/James Brown - 217730 - 7sV1MiUFJ5RFt7MjbmRlZRk= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1427 - Get On The Good Foot - Fred Wesley/James Brown/Joseph Mims - 215902 - SFctxble3Bp4pBIS4DZKo9A= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1428 - Get Up Offa That Thing - Deanna Brown/Deidra Jenkins/Yamma Brown - 250723 - iPLpRiij0/9toj6h - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1429 - It's Too Funky In Here - Brad Shapiro/George Jackson/Robert Miller/Walter Shaw - 239072 - PNi+aXQMKQsXVguNgoEy133Z - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1430 - Living In America - Charlie Midnight/Dan Hartman - 282880 - lD7cJ50BLok= - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1431 - I'm Real - Full Force/James Brown - 334236 - ufA53NaZ1TkizQ== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1432 - Hot Pants Pt.1 - Fred Wesley/James Brown - 188212 - lqcbcZzduQ== - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1433 - Soul Power (Live) - James Brown - 260728 - IaAo8MlyDcxfsSBnRYI2 - 0.9900000000000000000 - 115 - 1 - 14 - 1 - - - 1434 - When You Gonna Learn (Digeridoo) - Jay Kay/Kay, Jay - 230635 - Jhwvtums+bSwAzTsImuLvw== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1435 - Too Young To Die - Smith, Toby - 365818 - iWdRkQBvacnNdYgBZZATcMpKfw== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1436 - Hooked Up - Smith, Toby - 275879 - A7x1p3NAxj4gqvQmYA== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1437 - If I Like It, I Do It - Gelder, Nick van - 293093 - vBvlwCasxewbNnCzS3IgfFgh - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1438 - Music Of The Wind - Smith, Toby - 383033 - EUTM8aodv6kqqSOBYg== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1439 - Emergency On Planet Earth - Smith, Toby - 245263 - RdT4iwkk0ugWoT82wPVTHg== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1440 - Whatever It Is, I Just Can't Stop - Jay Kay/Kay, Jay - 247222 - UdMaT9vvKTqiZgOaQw== - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1441 - Blow Your Mind - Smith, Toby - 512339 - tQ4SBZ4n8E78OCg= - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1442 - Revolution 1993 - Smith, Toby - 616829 - K7JzXMpVDAQ= - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1443 - Didgin' Out - Buchanan, Wallis - 157100 - rkdRauTPUGe9z03T - 0.9900000000000000000 - 116 - 1 - 1 - 1 - - - 1444 - Canned Heat - Jay Kay - 331964 - iiiu77X2tAPW4iatw3fH - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1445 - Planet Home - Jay Kay/Toby Smith - 284447 - m62OPiYGx8GbuVif5z9p2lo= - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1446 - Black Capricorn Day - Jay Kay - 341629 - KEqu258WUA== - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1447 - Soul Education - Jay Kay/Toby Smith - 255477 - 12UqvSFYiQ== - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1448 - Failling - Jay Kay/Toby Smith - 225227 - ISG/lIGDYexT/J0= - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1449 - Destitute Illusions - Derrick McKenzie/Jay Kay/Toby Smith - 340218 - HJZ5S1JAT3yWwA137Q== - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1450 - Supersonic - Jay Kay - 315872 - L2GW3pgAFsYdRxvGAaTpwYijeA== - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1451 - Butterfly - Jay Kay/Toby Smith - 268852 - sUDr3mrgCQw= - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1452 - Were Do We Go From Here - Jay Kay - 313626 - YRRHpihU/1Z0ZJ0= - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1453 - King For A Day - Jay Kay/Toby Smith - 221544 - VnkyMIs/qpPVN2r/ - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1454 - Deeper Underground - Toby Smith - 281808 - pu52uHO39wk7vDPTH9hQ6WsU - 0.9900000000000000000 - 117 - 1 - 14 - 1 - - - 1455 - Just Another Story - Toby Smith - 529684 - 2j1bx7mu36BeebUpqkc= - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1456 - Stillness In Time - Toby Smith - 257097 - gWWJnQCspfUavP9cbGZZqWk= - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1457 - Half The Man - Toby Smith - 289854 - KiR0Sya8CpQXmI+Gk4mL - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1458 - Light Years - Toby Smith - 354560 - VupgzROTNUhBC7pRcjkFz0sF - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1459 - Manifest Destiny - Toby Smith - 382197 - I4A2P8yTa5QNZZMp - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1460 - The Kids - Toby Smith - 309995 - 0EEQbkmbEA== - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1461 - Mr. Moon - Stuard Zender/Toby Smith - 329534 - 7ysJGwG4Id2T - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1462 - Scam - Stuart Zender - 422321 - Oo0JaKogqw== - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1463 - Journey To Arnhemland - Toby Smith/Wallis Buchanan - 322455 - Oqf+J+Ot4kSAMSk= - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1464 - Morning Glory - J. Kay/Jay Kay - 384130 - hrD16DNVLQ== - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1465 - Space Cowboy - J. Kay/Jay Kay - 385697 - y9pJt3mlWZxsaJfww7Zh - 0.9900000000000000000 - 118 - 1 - 15 - 1 - - - 1466 - Last Chance - C. Cester/C. Muncey - 112352 - mMdIWzm9OPCz/Tk= - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1467 - Are You Gonna Be My Girl - C. Muncey/N. Cester - 213890 - lyE1VfKIyF9dRq49VEbYGJo50g== - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1468 - Rollover D.J. - C. Cester/N. Cester - 196702 - T41PawzR6g2i - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1469 - Look What You've Done - N. Cester - 230974 - BHtrzwRLM0L9O+0CClI= - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1470 - Get What You Need - C. Cester/C. Muncey/N. Cester - 247719 - Cgfz5SBVeSpp - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1471 - Move On - C. Cester/N. Cester - 260623 - CtHJSCGdurwEQjLShEGM5Vg= - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1472 - Radio Song - C. Cester/C. Muncey/N. Cester - 272117 - l+JMgv1SAsn3KIIDilAB - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1473 - Get Me Outta Here - C. Cester/N. Cester - 176274 - +nlp+dudM0UGD+Y3grE= - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1474 - Cold Hard Bitch - C. Cester/C. Muncey/N. Cester - 243278 - O/09kofth9R2RQ== - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1475 - Come Around Again - C. Muncey/N. Cester - 270497 - ppE6ALjh0PBHE3teYfquB3zt - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1476 - Take It Or Leave It - C. Muncey/N. Cester - 142889 - ykZF0EYGTb56pg== - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1477 - Lazy Gun - C. Cester/N. Cester - 282174 - pPK0g/ahCg== - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1478 - Timothy - C. Cester - 270341 - VwRnkmpEv57bmNjmCuY= - 0.9900000000000000000 - 119 - 1 - 4 - 1 - - - 1479 - Foxy Lady - Jimi Hendrix - 199340 - ehFgwfT6aiNVSdRuiKo= - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1480 - Manic Depression - Jimi Hendrix - 222302 - Aw39d5ZnY7Tbi4dn - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1481 - Red House - Jimi Hendrix - 224130 - JaLAaL7oOXKW4BYL - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1482 - Can You See Me - Jimi Hendrix - 153077 - 4BFJltU29P6UyuiTUKIX - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1483 - Love Or Confusion - Jimi Hendrix - 193123 - hTVskvn9sog= - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1484 - I Don't Live Today - Jimi Hendrix - 235311 - sKBwam0s52uphlFqRbZQcw== - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1485 - May This Be Love - Jimi Hendrix - 191216 - kdfX1W1FIRURqql58+JfwCok - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1486 - Fire - Jimi Hendrix - 164989 - g5MmnQEnphvG8j8= - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1487 - Third Stone From The Sun - Jimi Hendrix - 404453 - HB+GbNqwlkJbTlVcgj0= - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1488 - Remember - Jimi Hendrix - 168150 - tqTyqRuRuu/fajnWrccp - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1489 - Are You Experienced? - Jimi Hendrix - 254537 - I9ErjVlsdoQPk+I7ND7K - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1490 - Hey Joe - Billy Roberts - 210259 - xDTvd9NIJO5iL6cBoNrpew== - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1491 - Stone Free - Jimi Hendrix - 216293 - 8zKKV6+YSS1umoeu - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1492 - Purple Haze - Jimi Hendrix - 171572 - u6CfHhF417GH2qw8KyrFdOM1 - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1493 - 51st Anniversary - Jimi Hendrix - 196388 - ZglBDD/EFJymSmWu - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1494 - The Wind Cries Mary - Jimi Hendrix - 200463 - P+N0BmKCyHCjf2tX3hqEboS4iw== - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1495 - Highway Chile - Jimi Hendrix - 212453 - 3Uh1eZRgWQ== - 0.9900000000000000000 - 120 - 1 - 1 - 1 - - - 1496 - Surfing with the Alien - - 263707 - 3DFnIiwP/Ui2vhI= - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1497 - Ice 9 - - 239721 - bDnCitW0YaqPLiGR - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1498 - Crushing Day - - 314768 - Sb/3bvpxASnLlHIX - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1499 - Always With Me, Always With You - - 202035 - K84dPLfFpir4ow== - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1500 - Satch Boogie - - 193560 - 6qPg/q9trg/WR+JQBdo= - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1501 - Hill of the Skull - J. Satriani - 108435 - TRA3oKVQcoyIk4xTdlzr - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1502 - Circles - - 209071 - UBxxg1aRA3le5mNBAUh9 - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1503 - Lords of Karma - J. Satriani - 288227 - Yvx4lfNY/TV4F1drIhk= - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1504 - Midnight - J. Satriani - 102630 - suuYkjOUVg== - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1505 - Echo - J. Satriani - 337570 - uw29Qr/sMItAFXXxeeRVvPgePA== - 0.9900000000000000000 - 121 - 2 - 1 - 1 - - - 1506 - Engenho De Dentro - - 310073 - PzmXV0SusFZptg== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1507 - Alcohol - - 355239 - gwuXvIg1FT5IRw== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1508 - Mama Africa - - 283062 - F1WsKL7OlduaFVc= - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1509 - Salve Simpatia - - 343484 - JYJ1Zv0RPNohisvx5g== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1510 - W/Brasil (Chama O Síndico) - - 317100 - KMyG4t/zxLIhQaoc7w== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1511 - País Tropical - - 452519 - wI0bNSu/cTkSzw== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1512 - Os Alquimistas Estão Chegando - - 367281 - LQxsao2KukHbpshVuDVkh3JhMw== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1513 - Charles Anjo 45 - - 389276 - 4SFaGZRulcYmcO66tsqy5w== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1514 - Selassiê - - 326321 - SJO279oUO/c= - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1515 - Menina Sarará - - 191477 - Y//HOP7Y3xM2DLJT1h/09Bs= - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1516 - Que Maravilha - - 338076 - tw6e7YJ8MCrNfMwGDR4iXAqW - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1517 - Santa Clara Clareou - - 380081 - 7nEV26KTpjUEcnTB+r+phOg= - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1518 - Filho Maravilha - - 227526 - dX1KB9QLYkcv/5QweRRe9Sz4oQ== - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1519 - Taj Mahal - - 289750 - /FncRyy4WLrRR2OaOcOU - 0.9900000000000000000 - 122 - 1 - 7 - 1 - - - 1520 - Rapidamente - - 252238 - tOadCnhbZKc= - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1521 - As Dores do Mundo - Hyldon - 255477 - 0/hgYwSSsOK1nBygA9scsqd2 - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1522 - Vou Pra Ai - - 300878 - m/r3tn9FQQ== - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1523 - My Brother - - 253231 - W5e6oPU1plm/ - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1524 - Há Quanto Tempo - - 270027 - V8y0s7eDJnh4sAuBWNHk - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1525 - Vício - - 269897 - C6bbQuAdw0xUSvo= - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1526 - Encontrar Alguém - Marco Tulio Lara/Rogerio Flausino - 224078 - Jmpcgly5T6kz50J0jwbNkDvZ - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1527 - Dance Enquanto é Tempo - - 229093 - 6bx4Kf9+fRg6CWhebYkq - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1528 - A Tarde - - 266919 - DVSIJZ6BOkkjZGez2VAyEQ== - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1529 - Always Be All Right - - 128078 - DBA/rUFcBN6h - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1530 - Sem Sentido - - 250462 - oMqJ1epktb88srQ= - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1531 - Onibusfobia - - 315977 - aIEvBpsWyj7q11bjYHjro8w= - 0.9900000000000000000 - 123 - 1 - 7 - 1 - - - 1532 - Pura Elegancia - João Suplicy - 284107 - hEf9bJp+mo98TiSR9V7GbA== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1533 - Choramingando - João Suplicy - 190484 - vn46we0TYivJc6Z0cnkR8kQubQ== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1534 - Por Merecer - João Suplicy - 230582 - ++axawyafBpZ4fgc9A== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1535 - No Futuro - João Suplicy - 182308 - LCWRNpczmkHRCg== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1536 - Voce Inteira - João Suplicy - 241084 - GgnVEp6wMFnJ - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1537 - Cuando A Noite Vai Chegando - João Suplicy - 270628 - 18zPtFKXSNI= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1538 - Naquele Dia - João Suplicy - 251768 - e4mAo0zrYA6XOQi6Fad38Q== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1539 - Equinocio - João Suplicy - 269008 - pwe6McfCKg== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1540 - Papelão - João Suplicy - 213263 - VFnCgkSbUW4= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1541 - Cuando Eu For Pro Ceu - João Suplicy - 118804 - jmqaZogmPqKZIME= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1542 - Do Nosso Amor - João Suplicy - 203415 - wiRXw8HwQRe2tMc= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1543 - Borogodo - João Suplicy - 208457 - gfiSnoxSnbZLLBkNVyoe4A== - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1544 - Cafezinho - João Suplicy - 180924 - ji2iaC+SNGq/gqs= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1545 - Enquanto O Dia Não Vem - João Suplicy - 220891 - VzLao0TlkJSgFkaCC6Y= - 0.9900000000000000000 - 124 - 1 - 16 - 1 - - - 1546 - The Green Manalishi - - 205792 - C0prltFgmyeGJO1RZV4zzdA= - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1547 - Living After Midnight - - 213289 - pfT5P2kSRY5M3HjmIF2J - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1548 - Breaking The Law (Live) - - 144195 - KB9T69mwvApTfleTKjVsSXaP - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1549 - Hot Rockin' - - 197328 - sZzM4VlRQxO/r6AE - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1550 - Heading Out To The Highway (Live) - - 276427 - x2g1E3rkGfU= - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1551 - The Hellion - - 41900 - 7uvrurFjFm8vb5D312A= - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1552 - Electric Eye - - 222197 - Pvmalpz8W7N5x8vC/w== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1553 - You've Got Another Thing Comin' - - 305162 - zpF2b3mt4fWfn9/9T38wdJjw - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1554 - Turbo Lover - - 335542 - 2tWASoNZO5I4cvPmoRYWYA== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1555 - Freewheel Burning - - 265952 - GYdes3pJWvq2n63cggQv27olgw== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1556 - Some Heads Are Gonna Roll - - 249939 - R/MWPRqog6y5 - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1557 - Metal Meltdown - - 290664 - 5jgeUloQklRgiyZPzLk= - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1558 - Ram It Down - - 292179 - trVtxArm8ZI= - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1559 - Diamonds And Rust (Live) - - 219350 - liZxIJjSxa5Bd7l0vQ== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1560 - Victim Of Change (Live) - - 430942 - qh5JZsX3J/cmXa9j8g== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1561 - Tyrant (Live) - - 282253 - 565Y9KUMuzOfcbuOxg== - 0.9900000000000000000 - 125 - 1 - 3 - 1 - - - 1562 - Comin' Home - Paul Stanley, Ace Frehley - 172068 - DlQAGfmFwqXBgCub6g== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1563 - Plaster Caster - Gene Simmons - 198060 - ABRwNN+vxpMfxM6xdHZ/16o3MQ== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1564 - Goin' Blind - Gene Simmons, Stephen Coronel - 217652 - 6dFclmpsUw== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1565 - Do You Love Me - Paul Stanley, Bob Ezrin, Kim Fowley - 193619 - 7NjICiEcM4oAh64Xsg== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1566 - Domino - Gene Simmons - 226377 - NTtKSBBLJurV - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1567 - Sure Know Something - Paul Stanley, Vincent Poncia - 254354 - aTu1LrfaynJbg6ZH+8Q= - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1568 - A World Without Heroes - Paul Stanley, Gene Simmons, Bob Ezrin, Lewis Reed - 177815 - WEP01iKIGvxunCFLIlwIHAI= - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1569 - Rock Bottom - Paul Stanley, Ace Frehley - 200594 - 1KHlZwTTJr07uy7U7Q== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1570 - See You Tonight - Gene Simmons - 146494 - hri4CDETsmtP - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1571 - I Still Love You - Paul Stanley - 369815 - R5KWjqcWU2ejRA== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1572 - Every Time I Look At You - Paul Stanley, Vincent Cusano - 283898 - IqrwPyCwZU1ezg== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1573 - 2,000 Man - Mick Jagger, Keith Richard - 312450 - ruDFaaP/6u9PaA== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1574 - Beth - Peter Criss, Stan Penridge, Bob Ezrin - 170187 - ph9xPZcVJQ== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1575 - Nothin' To Lose - Gene Simmons - 222354 - xzGpGGMNx8kQY0we8HGu5LXJ - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1576 - Rock And Roll All Nite - Paul Stanley, Gene Simmons - 259631 - clN8tPW+0A== - 0.9900000000000000000 - 126 - 1 - 1 - 1 - - - 1577 - Immigrant Song - Robert Plant - 201247 - 0c3jGVAo9QZnBMg= - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1578 - Heartbreaker - John Bonham/John Paul Jones/Robert Plant - 316081 - W9s22owCSmE0cYyHzdey - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1579 - Since I've Been Loving You - John Paul Jones/Robert Plant - 416365 - S320WpIJ9vstSvz2+2o= - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1580 - Black Dog - John Paul Jones/Robert Plant - 317622 - 3+1n4pYcoSjydG8= - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1581 - Dazed And Confused - Jimmy Page/Led Zeppelin - 1116734 - X0FbS3l137vqUG3OUg== - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1582 - Stairway To Heaven - Robert Plant - 529658 - O61BBlRlyius - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1583 - Going To California - Robert Plant - 234605 - ZvQb+alUweYjOpe60f4= - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1584 - That's The Way - Robert Plant - 343431 - gBuvW45/mY+x4PTm6w== - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1585 - Whole Lotta Love (Medley) - Arthur Crudup/Bernard Besman/Bukka White/Doc Pomus/John Bonham/John Lee Hooker/John Paul Jones/Mort Shuman/Robert Plant/Willie Dixon - 825103 - CgUzlMHlhFnmEpWOh6sYTYHbQg== - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1586 - Thank You - Robert Plant - 398262 - 00kazx0azGVqGA== - 0.9900000000000000000 - 127 - 1 - 1 - 1 - - - 1587 - We're Gonna Groove - Ben E.King/James Bethea - 157570 - btbGGTRjJRAZ/SY0ncY= - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1588 - Poor Tom - Jimmy Page/Robert Plant - 182491 - 9+13Y18Yow== - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1589 - I Can't Quit You Baby - Willie Dixon - 258168 - TMDqZHamGB/v - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1590 - Walter's Walk - Jimmy Page, Robert Plant - 270785 - XSa4wZLj6lvLKYasFA== - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1591 - Ozone Baby - Jimmy Page, Robert Plant - 215954 - CR0j3+0GuJvLb3lZSv8= - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1592 - Darlene - Jimmy Page, Robert Plant, John Bonham, John Paul Jones - 307226 - agHeNmY/n0c2W5M= - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1593 - Bonzo's Montreux - John Bonham - 258925 - A0164J+rbFtYgzkx6RU= - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1594 - Wearing And Tearing - Jimmy Page, Robert Plant - 330004 - W0lHOZnrrGEnqHWuPWnW7INZ - 0.9900000000000000000 - 128 - 1 - 1 - 1 - - - 1595 - The Song Remains The Same - Jimmy Page/Jimmy Page & Robert Plant/Robert Plant - 330004 - tE5Qjtqt3aRW58isTVA= - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1596 - The Rain Song - Jimmy Page/Jimmy Page & Robert Plant/Robert Plant - 459180 - Q/7uIvqOV+tSOCn8L/GClrXY - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1597 - Over The Hills And Far Away - Jimmy Page/Jimmy Page & Robert Plant/Robert Plant - 290089 - YXMKum2LvA== - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1598 - The Crunge - John Bonham/John Paul Jones - 197407 - VXpe+yhevw== - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1599 - Dancing Days - Jimmy Page/Jimmy Page & Robert Plant/Robert Plant - 223216 - 1/5hX/5dYv4= - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1600 - D'Yer Mak'er - John Bonham/John Paul Jones - 262948 - sLGustRQE9Tw7wo5Q4GXPkc= - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1601 - No Quarter - John Paul Jones - 420493 - cfM9AJ5vy6o= - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1602 - The Ocean - John Bonham/John Paul Jones - 271098 - VHheBBEMZLzZDpQ= - 0.9900000000000000000 - 129 - 1 - 1 - 1 - - - 1603 - In The Evening - Jimmy Page, Robert Plant & John Paul Jones - 410566 - KUsnOG617JR8yQ== - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1604 - South Bound Saurez - John Paul Jones & Robert Plant - 254406 - tlrwChivEj7n - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1605 - Fool In The Rain - Jimmy Page, Robert Plant & John Paul Jones - 372950 - uL9bkev4LN7EvTCzgEioFcgv - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1606 - Hot Dog - Jimmy Page & Robert Plant - 197198 - 3hYbileoqSACTA3G - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1607 - Carouselambra - John Paul Jones, Jimmy Page & Robert Plant - 634435 - rFdxjMung7zA - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1608 - All My Love - Robert Plant & John Paul Jones - 356284 - uAvxA9qoYQLn44UJE5w0BA== - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1609 - I'm Gonna Crawl - Jimmy Page, Robert Plant & John Paul Jones - 329639 - Qdcqkrb3YA== - 0.9900000000000000000 - 130 - 1 - 1 - 1 - - - 1610 - Black Dog - Jimmy Page, Robert Plant, John Paul Jones - 296672 - KdYbSiCs/B1gYg== - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1611 - Rock & Roll - Jimmy Page, Robert Plant, John Paul Jones, John Bonham - 220917 - ZqTPeKBJJuNJokPU - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1612 - The Battle Of Evermore - Jimmy Page, Robert Plant - 351555 - x75B5JYjAg== - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1613 - Stairway To Heaven - Jimmy Page, Robert Plant - 481619 - kPyw0Ua4xjeJ7LM6tp1Ecl8= - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1614 - Misty Mountain Hop - Jimmy Page, Robert Plant, John Paul Jones - 278857 - SZATF2TlAsOCYmoXhz1g - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1615 - Four Sticks - Jimmy Page, Robert Plant - 284447 - 1ageplqQX6zAto+aoSk= - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1616 - Going To California - Jimmy Page, Robert Plant - 215693 - z4UM2XEBeZfK - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1617 - When The Levee Breaks - Jimmy Page, Robert Plant, John Paul Jones, John Bonham, Memphis Minnie - 427702 - gjVjzXFkdtlMx5tUuS+4MQ== - 0.9900000000000000000 - 131 - 1 - 1 - 1 - - - 1618 - Good Times Bad Times - Jimmy Page/John Bonham/John Paul Jones - 166164 - Vq5VaCFZ6JqSemPvaA== - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1619 - Babe I'm Gonna Leave You - Jimmy Page/Robert Plant - 401475 - EVPW11v8309RGcBVYd57 - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1620 - You Shook Me - J. B. Lenoir/Willie Dixon - 388179 - 3SFAmSLodA== - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1621 - Dazed and Confused - Jimmy Page - 386063 - YNx7Mt/pE+rka4kA4ldd - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1622 - Your Time Is Gonna Come - Jimmy Page/John Paul Jones - 274860 - iAddPKfM9w== - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1623 - Black Mountain Side - Jimmy Page - 132702 - H8adQa/OOSnebnZ+gKw= - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1624 - Communication Breakdown - Jimmy Page/John Bonham/John Paul Jones - 150230 - ZwXWcfZVeumFxAsRG4s4wJTk - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1625 - I Can't Quit You Baby - Willie Dixon - 282671 - EhlL0TsVMWAhc+HetNs= - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1626 - How Many More Times - Jimmy Page/John Bonham/John Paul Jones - 508055 - 9TbRWwG0pNwYfaO9 - 0.9900000000000000000 - 132 - 1 - 1 - 1 - - - 1627 - Whole Lotta Love - Jimmy Page, Robert Plant, John Paul Jones, John Bonham - 334471 - nqau4poPmVY= - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1628 - What Is And What Should Never Be - Jimmy Page, Robert Plant - 287973 - NJpbxPVZdaTlVzWElQHuOQ== - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1629 - The Lemon Song - Jimmy Page, Robert Plant, John Paul Jones, John Bonham - 379141 - vW48M1SXVxPB - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1630 - Thank You - Jimmy Page, Robert Plant - 287791 - xP9DpEJA2QI2/zy+S2d0mA== - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1631 - Heartbreaker - Jimmy Page, Robert Plant, John Paul Jones, John Bonham - 253988 - iJkJpcCot1ErGujgAwSxM94= - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1632 - Living Loving Maid (She's Just A Woman) - Jimmy Page, Robert Plant - 159216 - paGy8kO7/g== - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1633 - Ramble On - Jimmy Page, Robert Plant - 275591 - Oqb+I9W/u0rOebjVBFaMUxcm - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1634 - Moby Dick - John Bonham, John Paul Jones, Jimmy Page - 260728 - IjP6iopstc72mpVWTaYI - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1635 - Bring It On Home - Jimmy Page, Robert Plant - 259970 - EFMIRSgkuDU3ewmsTg== - 0.9900000000000000000 - 133 - 1 - 1 - 1 - - - 1636 - Immigrant Song - Jimmy Page, Robert Plant - 144875 - X9sdydyEPxw= - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1637 - Friends - Jimmy Page, Robert Plant - 233560 - th/wxbA4I2su/Od8AA7gyf56xA== - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1638 - Celebration Day - Jimmy Page, Robert Plant, John Paul Jones - 209528 - D2MJf+E7ujiDyoMv9N9RJTde - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1639 - Since I've Been Loving You - Jimmy Page, Robert Plant, John Paul Jones - 444055 - /BQQ2rBnmV/MPADdCXrJ - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1640 - Out On The Tiles - Jimmy Page, Robert Plant, John Bonham - 246047 - UxVw5HR+6udkeLg= - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1641 - Gallows Pole - Traditional - 296228 - IL26kZ9yyD7/iFkYSNzt/A== - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1642 - Tangerine - Jimmy Page - 189675 - 7Hq0K3r9EMZ6lH0pKHU3 - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1643 - That's The Way - Jimmy Page, Robert Plant - 337345 - ET4PgW8+l7KKZMq8WA== - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1644 - Bron-Y-Aur Stomp - Jimmy Page, Robert Plant, John Paul Jones - 259500 - mJHuZXj+BFymv6rKJd5KFNcSIQ== - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1645 - Hats Off To (Roy) Harper - Traditional - 219376 - Np7dehKu4g== - 0.9900000000000000000 - 134 - 1 - 1 - 1 - - - 1646 - In The Light - John Paul Jones/Robert Plant - 526785 - oBUzU27e++s= - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1647 - Bron-Yr-Aur - Jimmy Page - 126641 - w/05qrSXT9Y= - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1648 - Down By The Seaside - Robert Plant - 316186 - GLlndo24m+5l+rN0Usk= - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1649 - Ten Years Gone - Robert Plant - 393116 - AryQjFdbR+Je2RMU5w== - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1650 - Night Flight - John Paul Jones/Robert Plant - 217547 - ggaOo22VKZoqiHu3gHkBNw== - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1651 - The Wanton Song - Robert Plant - 249887 - cTQeqPgHw39K0dcJnHmjsw== - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1652 - Boogie With Stu - Ian Stewart/John Bonham/John Paul Jones/Mrs. Valens/Robert Plant - 233273 - 4vMl0OQz8meRCBGf280= - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1653 - Black Country Woman - Robert Plant - 273084 - JhKi4MkXif7KJCPEUg== - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1654 - Sick Again - Robert Plant - 283036 - jQ7XBFGWDhL2jAArQGf/st8= - 0.9900000000000000000 - 135 - 1 - 1 - 1 - - - 1655 - Achilles Last Stand - Jimmy Page/Robert Plant - 625502 - A/biitbC6hZZ9FqswW+g1wQ= - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1656 - For Your Life - Jimmy Page/Robert Plant - 384391 - OZuJN9IUHBbfndci/xg= - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1657 - Royal Orleans - John Bonham/John Paul Jones - 179591 - tMBbrQM3FRk6PBm3 - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1658 - Nobody's Fault But Mine - Jimmy Page/Robert Plant - 376215 - ypGLaWIFeEPlzCTObcDiTD83 - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1659 - Candy Store Rock - Jimmy Page/Robert Plant - 252055 - QWYMrkQpAcEk - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1660 - Hots On For Nowhere - Jimmy Page/Robert Plant - 284107 - Tvq5XNJLThFuv/mgAs/0N9+Vdw== - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1661 - Tea For One - Jimmy Page/Robert Plant - 566752 - zfsEJHXjvuNHQA== - 0.9900000000000000000 - 136 - 1 - 1 - 1 - - - 1662 - Rock & Roll - John Bonham/John Paul Jones/Robert Plant - 242442 - Q1TBltFrcZp0lDo= - 0.9900000000000000000 - 137 - 1 - 1 - 1 - - - 1663 - Celebration Day - John Paul Jones/Robert Plant - 230034 - ePuhZD25DUlrSvG0U/aU - 0.9900000000000000000 - 137 - 1 - 1 - 1 - - - 1664 - The Song Remains The Same - Robert Plant - 353358 - 741ryi1etktAOCPLbQ== - 0.9900000000000000000 - 137 - 1 - 1 - 1 - - - 1665 - Rain Song - Robert Plant - 505808 - Ap2SKYwo036AKjn29fliDA== - 0.9900000000000000000 - 137 - 1 - 1 - 1 - - - 1666 - Dazed And Confused - Jimmy Page - 1612329 - 2taKq+cpb6M= - 0.9900000000000000000 - 137 - 1 - 1 - 1 - - - 1667 - No Quarter - John Paul Jones/Robert Plant - 749897 - RVUkBZVB3HFIVCEqaWwTcQ1BkQ== - 0.9900000000000000000 - 138 - 1 - 1 - 1 - - - 1668 - Stairway To Heaven - Robert Plant - 657293 - aLzpM/VJ9eNPGnQi - 0.9900000000000000000 - 138 - 1 - 1 - 1 - - - 1669 - Moby Dick - John Bonham/John Paul Jones - 766354 - cuN9WnuU9xqEsA7qGXFq - 0.9900000000000000000 - 138 - 1 - 1 - 1 - - - 1670 - Whole Lotta Love - John Bonham/John Paul Jones/Robert Plant/Willie Dixon - 863895 - Odro3myxiGzwD0xM+A== - 0.9900000000000000000 - 138 - 1 - 1 - 1 - - - 1671 - Natália - Renato Russo - 235728 - Ld//pPaIlRaRrJkd5A== - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1672 - L'Avventura - Renato Russo - 278256 - 2kjc14tsFUCMRBk= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1673 - Música De Trabalho - Renato Russo - 260231 - WxFpa0irIWODLut0 - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1674 - Longe Do Meu Lado - Renato Russo - Marcelo Bonfá - 266161 - 4eAiSDtFT818kqczdMCLC+xTug== - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1675 - A Via Láctea - Renato Russo - 280084 - NS2ErSZj7fuA - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1676 - Música Ambiente - Renato Russo - 247614 - q11nXKmM8vhQ - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1677 - Aloha - Renato Russo - 325955 - yvTef8I40+o= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1678 - Soul Parsifal - Renato Russo - Marisa Monte - 295053 - V5bbMOlFtFt1ItdXU0zy5ko= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1679 - Dezesseis - Renato Russo - 323918 - GBf/GfQDu8FBTgU= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1680 - Mil Pedaços - Renato Russo - 203337 - 7ZACZSny0Cx+ - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1681 - Leila - Renato Russo - 323056 - 9DB81XindqfsmHdtu9M= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1682 - 1º De Julho - Renato Russo - 290298 - PaHYdSgEZVWKNEdV - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1683 - Esperando Por Mim - Renato Russo - 261668 - Iv8WHkwBIs6cHooUSplibXOA1Q== - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1684 - Quando Você Voltar - Renato Russo - 173897 - z+xR97ZWEY/b8g== - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1685 - O Livro Dos Dias - Renato Russo - 257253 - MFGIheyCWSA= - 0.9900000000000000000 - 139 - 1 - 7 - 1 - - - 1686 - Será - Dado Villa-Lobos/Marcelo Bonfá - 148401 - sMehgk5g3WsD6BY= - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1687 - Ainda É Cedo - Dado Villa-Lobos/Ico Ouro-Preto/Marcelo Bonfá - 236826 - ciYeNq4eZ/bwk/M= - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1688 - Geração Coca-Cola - Renato Russo - 141453 - fVnCwhN26hpgGw== - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1689 - Eduardo E Mônica - Renato Russo - 271229 - B0vOqVZ4povy2+y+K2lPPWTx - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1690 - Tempo Perdido - Renato Russo - 302158 - yRzU9gX0nhtXjf78 - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1691 - Indios - Renato Russo - 258168 - VqcX6+B0EX4= - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1692 - Que País É Este - Renato Russo - 177606 - BwHOkJuXWA== - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1693 - Faroeste Caboclo - Renato Russo - 543007 - OIYoNlJiM1TJtbhdTv7z - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1694 - Há Tempos - Dado Villa-Lobos/Marcelo Bonfá - 197146 - mGiEUmNd7+CrfxTTJ3RZBsKT - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1695 - Pais E Filhos - Dado Villa-Lobos/Marcelo Bonfá - 308401 - eNMdA0Xklhe/WSD7CQ0= - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1696 - Meninos E Meninas - Dado Villa-Lobos/Marcelo Bonfá - 203781 - +DISBmDblg== - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1697 - Vento No Litoral - Dado Villa-Lobos/Marcelo Bonfá - 366445 - i9NNXyxUW7Gbu6l7 - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1698 - Perfeição - Dado Villa-Lobos/Marcelo Bonfá - 276558 - e2Q/bsxGMIeK - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1699 - Giz - Dado Villa-Lobos/Marcelo Bonfá - 202213 - C8Y3fCb0vDJ54YuR - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1700 - Dezesseis - Dado Villa-Lobos/Marcelo Bonfá - 321724 - 94RqwmOohUBfkQ== - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1701 - Antes Das Seis - Dado Villa-Lobos - 189231 - fM7Tl5OUZsEAUEGZ9Ng1vd4= - 0.9900000000000000000 - 140 - 1 - 7 - 1 - - - 1702 - Are You Gonna Go My Way - Craig Ross/Lenny Kravitz - 211591 - MJl/6TRH6mKEzN4FQg== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1703 - Fly Away - Lenny Kravitz - 221962 - NFP/WCAknuR7yZDgtup26S4= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1704 - Rock And Roll Is Dead - Lenny Kravitz - 204199 - prgu92STmQ== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1705 - Again - Lenny Kravitz - 228989 - rTEQmuL7DZZloQ== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1706 - It Ain't Over 'Til It's Over - Lenny Kravitz - 242703 - 3Jy66UwetlhUkQDsmp4= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1707 - Can't Get You Off My Mind - Lenny Kravitz - 273815 - Xop8PO5rvpR3bdPh55XSH4TU - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1708 - Mr. Cab Driver - Lenny Kravitz - 230321 - UU7szuLZrjpF+61FdfvunIMZ - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1709 - American Woman - B. Cummings/G. Peterson/M.J. Kale/R. Bachman - 261773 - s20eCEJ8eD3Ow4Fxexc= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1710 - Stand By My Woman - Henry Kirssch/Lenny Kravitz/S. Pasch A. Krizan - 259683 - TKVyu5pjPzB4mconXeX4+E8G - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1711 - Always On The Run - Lenny Kravitz/Slash - 232515 - IaIyRqlRapvgd8Q= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1712 - Heaven Help - Gerry DeVeaux/Terry Britten - 190354 - Mi7rrkkqx3/Eczylb3hUGlc= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1713 - I Belong To You - Lenny Kravitz - 257123 - yjFqHvXoGV7JaS/IX7mzD5f5cg== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1714 - Believe - Henry Hirsch/Lenny Kravitz - 295131 - r86Ih5euZY3XMP1QQw== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1715 - Let Love Rule - Lenny Kravitz - 342648 - rZMfEzgCleo= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1716 - Black Velveteen - Lenny Kravitz - 290899 - XU/8FIPyX+BapyEm/Kjjh0c= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 1717 - Assim Caminha A Humanidade - - 210755 - jIeZbN+EVQwg8ITAcA== - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1718 - Honolulu - - 261433 - xW0rN5uZ4Zt3T6Ko - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1719 - Dancin´Days - - 237400 - 47DqO4zxfghixw== - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1720 - Um Pro Outro - - 236382 - cHi/d9FvXJo2f2GOfQ== - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1721 - Aviso Aos Navegantes - - 242808 - 7K2h8RBJyjZicVs2tPg= - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1722 - Casa - - 307591 - 8ZlipTrHI9pqyQg= - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1723 - Condição - - 263549 - CHGigSJskJ8= - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1724 - Hyperconectividade - - 180636 - 3BZSfSY5FU0cm7tjykTm - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1725 - O Descobridor Dos Sete Mares - - 225854 - 6ELkydM3KAdW - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1726 - Satisfação - - 208065 - xL/vOMkjWIsVgg8n - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1727 - Brumário - - 216241 - jg2MTi1Njz0su4I5KazW - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1728 - Um Certo Alguém - - 194063 - pe5KJ2N0Vl3j0pcKPy9j78AuVg== - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1729 - Fullgás - - 346070 - R+n6useFmARs/593gRtvlMU= - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1730 - Sábado À Noite - - 193854 - sRm3LmtbtoT+/VeTePtWGw== - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1731 - A Cura - - 280920 - vPOQYN7cUfHjMh+II8DPKr8= - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1732 - Aquilo - - 246073 - PAQYfp4EQoea - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1733 - Atrás Do Trio Elétrico - - 149080 - 2YakIWbys6E0oNI9ZT2H - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1734 - Senta A Pua - - 217547 - lvzaPYhpuX4ZFg== - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1735 - Ro-Que-Se-Da-Ne - - 146703 - PlWLHldBpRdd - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1736 - Tudo Bem - - 196101 - /SEwDC71H6r/n9v2 - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1737 - Toda Forma De Amor - - 227813 - bUWsXSRwzSUHUOI= - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1738 - Tudo Igual - - 276035 - TKmCe/vAJiqamNqqMFpz - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1739 - Fogo De Palha - - 246804 - 0xp3NUffHdiq44Cmj2g= - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1740 - Sereia - - 278047 - 0U2W4UudLw== - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1741 - Assaltaram A Gramática - - 261041 - 3rXM2tVrAi3J/DNS7dmtLg== - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1742 - Se Você Pensa - - 195996 - i6rQFz9/mjKiCVyZeA== - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1743 - Lá Vem O Sol (Here Comes The Sun) - - 189492 - /KQWmH97BUhsqLa3qVwW - 0.9900000000000000000 - 142 - 1 - 7 - 1 - - - 1744 - O Último Romântico (Ao Vivo) - - 231993 - +KBodb/zXuyfNTKoMmKm - 0.9900000000000000000 - 143 - 1 - 7 - 1 - - - 1745 - Pseudo Silk Kimono - Kelly, Mosley, Rothery, Trewaves - 134739 - UdU3rdZALbNnQw== - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1746 - Kayleigh - Kelly, Mosley, Rothery, Trewaves - 234605 - KGCI1T4bmhG8 - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1747 - Lavender - Kelly, Mosley, Rothery, Trewaves - 153417 - AmcJRir4Skhc - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1748 - Bitter Suite: Brief Encounter / Lost Weekend / Blue Angel - Kelly, Mosley, Rothery, Trewaves - 356493 - CgEjZdQkaTG3crUOfLU2ixdg - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1749 - Heart Of Lothian: Wide Boy / Curtain Call - Kelly, Mosley, Rothery, Trewaves - 366053 - jJhR6mJObS5nrA== - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1750 - Waterhole (Expresso Bongo) - Kelly, Mosley, Rothery, Trewaves - 133093 - 42oKLTImPSI= - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1751 - Lords Of The Backstage - Kelly, Mosley, Rothery, Trewaves - 112875 - GbJoWUl79OtTEJ/h6Q== - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1752 - Blind Curve: Vocal Under A Bloodlight / Passing Strangers / Mylo / Perimeter Walk / Threshold - Kelly, Mosley, Rothery, Trewaves - 569704 - z325F8EXZ/YBhW6OSwM= - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1753 - Childhoods End? - Kelly, Mosley, Rothery, Trewaves - 272796 - gw9N9WDa2i/3oOZZgg== - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1754 - White Feather - Kelly, Mosley, Rothery, Trewaves - 143595 - Vwxm+hU6sHkPewqZIrDi - 0.9900000000000000000 - 144 - 1 - 1 - 1 - - - 1755 - Arrepio - Carlinhos Brown - 136254 - uzDxnNAAUQ== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1756 - Magamalabares - Carlinhos Brown - 215875 - iXn1TcF2277kHKp5CJQ1yJ4J - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1757 - Chuva No Brejo - Morais - 145606 - 0evGuClNDOW1Z+UK - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1758 - Cérebro Eletrônico - Gilberto Gil - 172800 - unpwnEVit5igTLQGBWni - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1759 - Tempos Modernos - Lulu Santos - 183066 - +yj+xgB/AMLBywC1kSVW/w== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1760 - Maraçá - Carlinhos Brown - 230008 - U76NI5iDO1FoMZ4SsSPk - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1761 - Blanco - Marisa Monte/poema de Octavio Paz/versão: Haroldo de Campos - 45191 - vro+5kNWOnqu23li - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1762 - Panis Et Circenses - Caetano Veloso e Gilberto Gil - 192339 - Bnv1tPSxqw== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1763 - De Noite Na Cama - Caetano Veloso e Gilberto Gil - 209005 - A2KlwnSXTmGwD6ccjNI= - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1764 - Beija Eu - Caetano Veloso e Gilberto Gil - 197276 - FxjN/YMTdL0J2U9htqld - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1765 - Give Me Love - Caetano Veloso e Gilberto Gil - 249808 - cTjTu1eZJM++7Bj+y9JFdTQP3g== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1766 - Ainda Lembro - Caetano Veloso e Gilberto Gil - 218801 - JrQnQo6knOgkNpi4 - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1767 - A Menina Dança - Caetano Veloso e Gilberto Gil - 129410 - UjXjuBYUfvT+Ppf6dvI2k9otpg== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1768 - Dança Da Solidão - Caetano Veloso e Gilberto Gil - 203520 - wJW9EJEtsvw7qohTX6t5nA== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1769 - Ao Meu Redor - Caetano Veloso e Gilberto Gil - 275591 - vR37YKgodZBHF7JmVA== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1770 - Bem Leve - Caetano Veloso e Gilberto Gil - 159190 - CPHukrx40ibpYYK4VLZDmw== - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1771 - Segue O Seco - Caetano Veloso e Gilberto Gil - 178207 - eJkxHA+rahhtR4BJFQA= - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1772 - O Xote Das Meninas - Caetano Veloso e Gilberto Gil - 291866 - 519/YXEZvCQ= - 0.9900000000000000000 - 145 - 1 - 7 - 1 - - - 1773 - Wherever I Lay My Hat - - 136986 - ljOa3fDTvw== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1774 - Get My Hands On Some Lovin' - - 149054 - rEw5zCMu+UaDeU4wUt3UYOw= - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1775 - No Good Without You - William "Mickey" Stevenson - 161410 - 9DbiKbK7daE= - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1776 - You've Been A Long Time Coming - Brian Holland/Eddie Holland/Lamont Dozier - 137221 - 3BGMKJqIM53JxsrDMYYa7g== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1777 - When I Had Your Love - Robert Rogers/Warren "Pete" Moore/William "Mickey" Stevenson - 152424 - bvQ+uV858R/eiGqCmX0= - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1778 - You're What's Happening (In The World Today) - Allen Story/George Gordy/Robert Gordy - 142027 - gagdNfZRtKcePwqaIg3DsA== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1779 - Loving You Is Sweeter Than Ever - Ivy Hunter/Stevie Wonder - 166295 - OxJNgGPMfNeaCbv/yRsvSA== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1780 - It's A Bitter Pill To Swallow - Smokey Robinson/Warren "Pete" Moore - 194821 - QYhp5fdOukwfeQ== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1781 - Seek And You Shall Find - Ivy Hunter/William "Mickey" Stevenson - 223451 - n88RG9iiRoYw1R7c - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1782 - Gonna Keep On Tryin' Till I Win Your Love - Barrett Strong/Norman Whitfield - 176404 - XVtH+KdVJNtR - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1783 - Gonna Give Her All The Love I've Got - Barrett Strong/Norman Whitfield - 210886 - yzpH4kTEkzRDUig4yvegJw== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1784 - I Wish It Would Rain - Barrett Strong/Norman Whitfield/Roger Penzabene - 172486 - 1KgYnSOsyYibBsGkylV5 - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1785 - Abraham, Martin And John - Dick Holler - 273057 - IUbgkMACwp2h2ol3JJBQ - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1786 - Save The Children - Al Cleveland/Marvin Gaye/Renaldo Benson - 194821 - fy5PMjkRqI59Wqi+0Y95/A== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1787 - You Sure Love To Ball - Marvin Gaye - 218540 - 66mxwJZm0uZ6+0g= - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1788 - Ego Tripping Out - Marvin Gaye - 314514 - UWMKtmklmwZGFA+eUhJm - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1789 - Praise - Marvin Gaye - 235833 - BMsSYY3IOeefl+jI - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1790 - Heavy Love Affair - Marvin Gaye - 227892 - TL4VX2ss9p0HZ2rd9g== - 0.9900000000000000000 - 146 - 1 - 14 - 1 - - - 1791 - Down Under - - 222171 - 1pkTboMAeeGv6eeViCkjFw== - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1792 - Overkill - - 225410 - PNOJ+lb6Pubmb7v8ZKiD - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1793 - Be Good Johnny - - 216320 - X2JNjChlyANqDyx41Q== - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1794 - Everything I Need - - 216476 - zHrwlC4KbG6An9SHnZA= - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1795 - Down by the Sea - - 408163 - 5UpBY/8px9aLqdcLhpBGzcYQQg== - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1796 - Who Can It Be Now? - - 202396 - QAvPenkp8eKtt6HHN0U= - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1797 - It's a Mistake - - 273371 - xOsU1noFpGXrV/7l3TnRDQ== - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1798 - Dr. Heckyll & Mr. Jive - - 278465 - Wu582XvG6tU3 - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1799 - Shakes and Ladders - - 198008 - KNMID9NBC4LisjnInJyl5CN6 - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1800 - No Sign of Yesterday - - 362004 - E6jbqilsScirSCQpAUIgew== - 0.9900000000000000000 - 147 - 1 - 1 - 1 - - - 1801 - Enter Sandman - James Hetfield, Lars Ulrich and Kirk Hammett - 332251 - 4kcrpNK271s9klHgMw== - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1802 - Sad But True - Ulrich - 324754 - o2+RJDxMKd6iinlgOr4= - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1803 - Holier Than Thou - Ulrich - 227892 - OIV7IBMB20+fQfE= - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1804 - The Unforgiven - James Hetfield, Lars Ulrich and Kirk Hammett - 387082 - Tuza+Od3sIC6 - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1805 - Wherever I May Roam - Ulrich - 404323 - HuQuaQOloSpxfDHSBAw= - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1806 - Don't Tread On Me - Ulrich - 240483 - vyCWyCDy4kpg2g== - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1807 - Through The Never - James Hetfield, Lars Ulrich and Kirk Hammett - 244375 - x5GS6Yk9zg== - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1808 - Nothing Else Matters - Ulrich - 388832 - Z5fyqv02rnU= - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1809 - Of Wolf And Man - James Hetfield, Lars Ulrich and Kirk Hammett - 256835 - dbp76M4jKFcauJl9PJrO - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1810 - The God That Failed - Ulrich - 308610 - Ed0PmIjy8wQ7 - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1811 - My Friend Of Misery - James Hetfield, Lars Ulrich and Jason Newsted - 409547 - Ps12mJJyfRLVpV4J+W5pkW6FNA== - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1812 - The Struggle Within - Ulrich - 234240 - K/0kGutYntxGgsZ3rCnlWuE= - 0.9900000000000000000 - 148 - 1 - 3 - 1 - - - 1813 - Helpless - Harris/Tatler - 398315 - JicAKcQoMAc= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1814 - The Small Hours - Holocaust - 403435 - oC72hG7P73lA - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1815 - The Wait - Killing Joke - 295418 - W6w506DMUt/mXc8= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1816 - Crash Course In Brain Surgery - Bourge/Phillips/Shelley - 190406 - DrDsXw1LAjj76uN0/g== - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1817 - Last Caress/Green Hell - Danzig - 209972 - UP5Yp72vpLGF1exTX11ySEk= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1818 - Am I Evil? - Harris/Tatler - 470256 - FBcfRZcPwqN3CK1xycTV8g== - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1819 - Blitzkrieg - Jones/Sirotto/Smith - 216685 - VIY/oB/lXSoXcrrspcWyoDg= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1820 - Breadfan - Bourge/Phillips/Shelley - 341551 - 5o0KZ0jlGTib - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1821 - The Prince - Harris/Tatler - 265769 - FAsofWzhHsI= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1822 - Stone Cold Crazy - Deacon/May/Mercury/Taylor - 137717 - CvQywhp/nQe30kL60Q== - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1823 - So What - Culmer/Exalt - 189152 - ZO5kcew+WobnSVkWCw== - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1824 - Killing Time - Sweet Savage - 183693 - PH/Dp/CVLmu0y+/nq91hZlg= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1825 - Overkill - Clarke/Kilmister/Tayler - 245133 - Q3vEjgdvMYOwgw3oaQR0 - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1826 - Damage Case - Clarke/Farren/Kilmister/Tayler - 220212 - yzcOmwk7Yvg6mYEFk3w= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1827 - Stone Dead Forever - Clarke/Kilmister/Tayler - 292127 - gfBP0pCFrXhUdW0= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1828 - Too Late Too Late - Clarke/Kilmister/Tayler - 192052 - ql3MYepzVxIpV70= - 0.9900000000000000000 - 149 - 1 - 3 - 1 - - - 1829 - Hit The Lights - James Hetfield, Lars Ulrich - 257541 - CBnLVG7uLA== - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1830 - The Four Horsemen - James Hetfield, Lars Ulrich, Dave Mustaine - 433188 - M16M9xky480dv7olnA== - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1831 - Motorbreath - James Hetfield - 188395 - t5ptN5aSO2r7 - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1832 - Jump In The Fire - James Hetfield, Lars Ulrich, Dave Mustaine - 281573 - M0/Kd7pZCmU= - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1833 - (Anesthesia) Pulling Teeth - Cliff Burton - 254955 - fLFM0dRIuI+J9Gmdl2OyYTA= - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1834 - Whiplash - James Hetfield, Lars Ulrich - 249208 - NleZtcliY8TKaGwTxLVU2w== - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1835 - Phantom Lord - James Hetfield, Lars Ulrich, Dave Mustaine - 302053 - pGvJme/dA7F1kYub6xgVig== - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1836 - No Remorse - James Hetfield, Lars Ulrich - 386795 - 0w6wx+jpbhB9UCI= - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1837 - Seek & Destroy - James Hetfield, Lars Ulrich - 415817 - MLRJu0MN9WZNRnmWA1M= - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1838 - Metal Militia - James Hetfield, Lars Ulrich, Dave Mustaine - 311327 - 1yjeT1aIUuJFK1i7gluI - 0.9900000000000000000 - 150 - 1 - 3 - 1 - - - 1839 - Ain't My Bitch - James Hetfield, Lars Ulrich - 304457 - jeA7RN1B36cKICMkjJUZxJQ= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1840 - 2 X 4 - James Hetfield, Lars Ulrich, Kirk Hammett - 328254 - luifAMvt3tEDkOtRcwvE1ew= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1841 - The House Jack Built - James Hetfield, Lars Ulrich, Kirk Hammett - 398942 - yA/ylUg2RTZlLVWwEZMmacSg - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1842 - Until It Sleeps - James Hetfield, Lars Ulrich - 269740 - jBRNZgs+T7y4rBdg - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1843 - King Nothing - James Hetfield, Lars Ulrich, Kirk Hammett - 328097 - qGP7hSYAoGi7lYixfFJ+Vys= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1844 - Hero Of The Day - James Hetfield, Lars Ulrich, Kirk Hammett - 261982 - RiQCYKF7qOZX+A== - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1845 - Bleeding Me - James Hetfield, Lars Ulrich, Kirk Hammett - 497998 - jIlNzZ0IrZihQ8Q= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1846 - Cure - James Hetfield, Lars Ulrich - 294347 - adB+xLSP69Bk - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1847 - Poor Twisted Me - James Hetfield, Lars Ulrich - 240065 - otE7tUjCgN0/qKfuLg== - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1848 - Wasted My Hate - James Hetfield, Lars Ulrich, Kirk Hammett - 237296 - O+TfStC/iceCJJmPIrbzV2sn - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1849 - Mama Said - James Hetfield, Lars Ulrich - 319764 - /+d8kei/6xc= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1850 - Thorn Within - James Hetfield, Lars Ulrich, Kirk Hammett - 351738 - AxtYe6JziQ== - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1851 - Ronnie - James Hetfield, Lars Ulrich - 317204 - r6D/pAPbThccuaDJ6ec8f9g= - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1852 - The Outlaw Torn - James Hetfield, Lars Ulrich - 588721 - JL9S94vlqMXDZw== - 0.9900000000000000000 - 151 - 1 - 3 - 1 - - - 1853 - Battery - J.Hetfield/L.Ulrich - 312424 - He2vLSOnyydx+wwt - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1854 - Master Of Puppets - K.Hammett - 515239 - zAVKTdob3tmick7Kfrg= - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1855 - The Thing That Should Not Be - K.Hammett - 396199 - Gvw9F+dL/szxnMZAcQ== - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1856 - Welcome Home (Sanitarium) - K.Hammett - 387186 - ZjMYkdcrhZta66c= - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1857 - Disposable Heroes - J.Hetfield/L.Ulrich - 496718 - 8Xt6YGOk77UNdb30Ri7NOQ== - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1858 - Leper Messiah - C.Burton - 347428 - sRTbbII8PzY4po2Qfw== - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1859 - Orion - K.Hammett - 500062 - UnBeWYNRkDkhULxJ8XUkSqhdSw== - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1860 - Damage Inc. - K.Hammett - 330919 - qdbLG28/Oyoq/mEljg== - 0.9900000000000000000 - 152 - 1 - 3 - 1 - - - 1861 - Fuel - Hetfield, Ulrich, Hammett - 269557 - a4Po1EroyHfzirA= - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1862 - The Memory Remains - Hetfield, Ulrich - 279353 - SskR7v0wRD34fKVC6kMWZg4= - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1863 - Devil's Dance - Hetfield, Ulrich - 318955 - 75a6HQqgYtQSY3gx40A= - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1864 - The Unforgiven II - Hetfield, Ulrich, Hammett - 395520 - NvRxGDwAMeBQ2u7epQ== - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1865 - Better Than You - Hetfield, Ulrich - 322899 - BtFiaM+bGX0sv3A= - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1866 - Slither - Hetfield, Ulrich, Hammett - 313103 - KR3hxceYZNazT6RN0iO9tmlD - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1867 - Carpe Diem Baby - Hetfield, Ulrich, Hammett - 372480 - wrzpC5EWyBOkUbjHsg== - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1868 - Bad Seed - Hetfield, Ulrich, Hammett - 245394 - sNYT/4sTVg== - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1869 - Where The Wild Things Are - Hetfield, Ulrich, Newsted - 414380 - zja3LRSWrA== - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1870 - Prince Charming - Hetfield, Ulrich - 365061 - YxPpo67PPxJQ - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1871 - Low Man's Lyric - Hetfield, Ulrich - 457639 - /oS/hPuI8aUiTKm33i/FSO2z - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1872 - Attitude - Hetfield, Ulrich - 315898 - YwEyZ8bupN0O - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1873 - Fixxxer - Hetfield, Ulrich, Hammett - 496065 - 4JYBrt0U0bpJOy87b3NfNKw= - 0.9900000000000000000 - 153 - 1 - 3 - 1 - - - 1874 - Fight Fire With Fire - Metallica - 285753 - ud5l4Yy+7K3LHfmWVqrjq0E= - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1875 - Ride The Lightning - Metallica - 397740 - qAgBG/SOo3gkKJG+ - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1876 - For Whom The Bell Tolls - Metallica - 311719 - kkJvJDCU/gpDwi9Js8E= - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1877 - Fade To Black - Metallica - 414824 - 5IVYwzKqjKQ0nunXPhQ= - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1878 - Trapped Under Ice - Metallica - 244532 - wxwMFWZU5w== - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1879 - Escape - Metallica - 264359 - shdCqmRF0dFAzO+Tn9DOjA== - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1880 - Creeping Death - Metallica - 396878 - Bp06hUa8wA== - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1881 - The Call Of Ktulu - Metallica - 534883 - qv8TPJ5aX/0= - 0.9900000000000000000 - 154 - 1 - 3 - 1 - - - 1882 - Frantic - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 350458 - pqzw/ydeY8ypCk6A - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1883 - St. Anger - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 441234 - 806AuGC2rf9r - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1884 - Some Kind Of Monster - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 505626 - gbS6Rr6Vog== - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1885 - Dirty Window - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 324989 - kJWgKiGcXd4/17mdsnE= - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1886 - Invisible Kid - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 510197 - sQvFu+X5qVD/Og== - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1887 - My World - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 345626 - bkpsGKQ3Bw== - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1888 - Shoot Me Again - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 430210 - vupYySzkWw== - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1889 - Sweet Amber - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 327235 - d9ZGzqgQPwk6+dm9eOdF - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1890 - The Unnamed Feeling - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 429479 - 79AuEnImMoKVGrOKWEKZ14l4Mg== - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1891 - Purify - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 314017 - uGyoXQtj3qpd - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1892 - All Within My Hands - Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich - 527986 - H9elt9lbtUgP - 0.9900000000000000000 - 155 - 1 - 3 - 1 - - - 1893 - Blackened - James Hetfield, Lars Ulrich & Jason Newsted - 403382 - o8Q4jly1sPhgAjMAtMvngyg= - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1894 - ...And Justice For All - James Hetfield, Lars Ulrich & Kirk Hammett - 585769 - Bw5IhyRL+tzloGg= - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1895 - Eye Of The Beholder - James Hetfield, Lars Ulrich & Kirk Hammett - 385828 - IUFo4db0MxkBVrPlSloXHiLZ - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1896 - One - James Hetfield & Lars Ulrich - 446484 - VjLlQQEIG5/slH/QD48i4A== - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1897 - The Shortest Straw - James Hetfield and Lars Ulrich - 395389 - mNP0808PzrFbYj3JNNy6C9ES - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1898 - Harvester Of Sorrow - James Hetfield and Lars Ulrich - 345547 - O/9n2LpUR4SBhaNVJ3o= - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1899 - The Frayed Ends Of Sanity - James Hetfield, Lars Ulrich and Kirk Hammett - 464039 - hk7k3AYiFpCl - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1900 - To Live Is To Die - James Hetfield, Lars Ulrich and Cliff Burton - 588564 - 3tW3t8XEPn0WpfIw+jmeCIpN - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1901 - Dyers Eve - James Hetfield, Lars Ulrich and Kirk Hammett - 313991 - twwVTw9Vayb0DA== - 0.9900000000000000000 - 156 - 1 - 3 - 1 - - - 1902 - Springsville - J. Carisi - 207725 - JW/BMtx+j80= - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1903 - The Maids Of Cadiz - L. Delibes - 233534 - wWXYENUyVVM= - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1904 - The Duke - Dave Brubeck - 214961 - Pf2XyWXumcmF - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1905 - My Ship - Ira Gershwin, Kurt Weill - 268016 - YVmeSXAtf4Nux10f - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1906 - Miles Ahead - Miles Davis, Gil Evans - 209893 - vZFqUjMEetwAGHu3D1FbCtOZ - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1907 - Blues For Pablo - Gil Evans - 318328 - +eZrYiIbaONVr+aMTR2D2Tj6 - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1908 - New Rhumba - A. Jamal - 276871 - ZcULy2FBI5Jh3CR4mw== - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1909 - The Meaning Of The Blues - R. Troup, L. Worth - 168594 - SiaTUi5HNg== - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1910 - Lament - J.J. Johnson - 134191 - ISUsGYwtmYt3Iw82 - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1911 - I Don't Wanna Be Kissed (By Anyone But You) - H. Spina, J. Elliott - 191320 - Te4aCSH/iQcGMA== - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1912 - Springsville (Alternate Take) - J. Carisi - 196388 - Sl0D9vCGCbNm - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1913 - Blues For Pablo (Alternate Take) - Gil Evans - 212558 - o+WeSLX1+A== - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1914 - The Meaning Of The Blues/Lament (Alternate Take) - J.J. Johnson/R. Troup, L. Worth - 309786 - ZABpZfn8OHhJDQ== - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1915 - I Don't Wanna Be Kissed (By Anyone But You) (Alternate Take) - H. Spina, J. Elliott - 192078 - rMQa9PXOLiqim/Aa - 0.9900000000000000000 - 157 - 1 - 2 - 1 - - - 1916 - Coração De Estudante - Wagner Tiso, Milton Nascimento - 238550 - 0JqpCHvAawqRMaIwzeVkBr4= - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1917 - A Noite Do Meu Bem - Dolores Duran - 220081 - PftsutWJ8Kl5h8tVOXPmDZRf - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1918 - Paisagem Na Janela - Lô Borges, Fernando Brant - 197694 - L/yIoT0aknjEJ+jJI+Qjsx7v - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1919 - Cuitelinho - Folclore - 209397 - xCAY0kbkPzv4Lkk= - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1920 - Caxangá - Milton Nascimento, Fernando Brant - 245551 - UASzjnu0WS+fQxA= - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1921 - Nos Bailes Da Vida - Milton Nascimento, Fernando Brant - 275748 - gZG9p3EVwMgdfpsyFw== - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1922 - Menestrel Das Alagoas - Milton Nascimento, Fernando Brant - 199758 - Qr3935pKe2eXxXBVqP/EwA== - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1923 - Brasil - Milton Nascimento, Fernando Brant - 155428 - gQ/sUbUml8ri - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1924 - Canção Do Novo Mundo - Beto Guedes, Ronaldo Bastos - 215353 - gaLSaYF3UXKcMcCpxrAa+fg2 - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1925 - Um Gosto De Sol - Milton Nascimento, Ronaldo Bastos - 307200 - bcEDXQcZIirYjJY= - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1926 - Solar - Milton Nascimento, Fernando Brant - 156212 - FLfc+cTFW+/eVowoj7fYSDw2vA== - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1927 - Para Lennon E McCartney - Lô Borges, Márcio Borges, Fernando Brant - 321828 - Ya91rH1Fyk9eTHnlBcs= - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1928 - Maria, Maria - Milton Nascimento, Fernando Brant - 72463 - 8eq2VTOcRzwWNNvNUA== - 0.9900000000000000000 - 158 - 1 - 7 - 1 - - - 1929 - Minas - Milton Nascimento, Caetano Veloso - 152293 - 2e2h0GgEZUEvfH/6DJCS3aY= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1930 - Fé Cega, Faca Amolada - Milton Nascimento, Ronaldo Bastos - 278099 - xAvmXobhiJIZcl8= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1931 - Beijo Partido - Toninho Horta - 229564 - ond6DYRe1xWcxkawujrVOJC2 - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1932 - Saudade Dos Aviões Da Panair (Conversando No Bar) - Milton Nascimento, Fernando Brant - 268721 - OI63CURbew== - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1933 - Gran Circo - Milton Nascimento, Márcio Borges - 251297 - wEjW6/Lit9kIgP4MMw== - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1934 - Ponta de Areia - Milton Nascimento, Fernando Brant - 272796 - kYb+xTajTAxPAWLIJg== - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1935 - Trastevere - Milton Nascimento, Ronaldo Bastos - 265665 - 6241sgj3F83G2lPNAmHNuJI= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1936 - Idolatrada - Milton Nascimento, Fernando Brant - 286249 - djL8MQt/Jdc= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1937 - Leila (Venha Ser Feliz) - Milton Nascimento - 209737 - s/jUiCm7zu6aSksDPA== - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1938 - Paula E Bebeto - Milton Nascimento, Caetano Veloso - 135732 - w78jcWih6j+Wb7hS - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1939 - Simples - Nelson Angelo - 133093 - 7blito0x22PU8lEpEjQ= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1940 - Norwegian Wood - John Lennon, Paul McCartney - 413910 - Mm5GpjlCOA== - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1941 - Caso Você Queira Saber - Beto Guedes, Márcio Borges - 205688 - 5w28NjB0YmXQ18bgNDc= - 0.9900000000000000000 - 159 - 1 - 7 - 1 - - - 1942 - Ace Of Spades - Clarke/Kilmister/Taylor - 169926 - vtJgjO/N0UhVbHcM - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1943 - Love Me Like A Reptile - Clarke/Kilmister/Taylor - 203546 - KBIYsbRIe6nQ+qvucoyBUktTPg== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1944 - Shoot You In The Back - Clarke/Kilmister/Taylor - 160026 - 24fT2LZJoxXFZg== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1945 - Live To Win - Clarke/Kilmister/Taylor - 217626 - uGc6PL2+FSw= - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1946 - Fast And Loose - Clarke/Kilmister/Taylor - 203337 - vOnu17WdfEBQ9QoYORFMoT4= - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1947 - (We Are) The Road Crew - Clarke/Kilmister/Taylor - 192600 - +2qkZeRpMA== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1948 - Fire Fire - Clarke/Kilmister/Taylor - 164675 - hjhQw5Q2JlM/8Zn7Iw== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1949 - Jailbait - Clarke/Kilmister/Taylor - 213916 - zWPFz1yxf1btm39+Gg== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1950 - Dance - Clarke/Kilmister/Taylor - 158432 - R1YFhafDFkTwjGHU8eXS - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1951 - Bite The Bullet - Clarke/Kilmister/Taylor - 98115 - CEId4Z1BnxQMf3Iw - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1952 - The Chase Is Better Than The Catch - Clarke/Kilmister/Taylor - 258403 - tUQVHGQL6OsTVF8DiHM5boi/mQ== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1953 - The Hammer - Clarke/Kilmister/Taylor - 168071 - kZI8YTglBrfxeCdQ - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1954 - Dirty Love - Clarke/Kilmister/Taylor - 176457 - +TpHS7iN2upv9O293hTNZaWEvw== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1955 - Please Don't Touch - Heath/Robinson - 169926 - q7kiB7TjPgUw+g== - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1956 - Emergency - Dufort/Johnson/McAuliffe/Williams - 180427 - LA8djzjxI88yv5oink6k - 0.9900000000000000000 - 160 - 1 - 3 - 1 - - - 1957 - Kir Royal - Mônica Marianno - 234788 - EThSS/Rodzo= - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1958 - O Que Vai Em Meu Coração - Mônica Marianno - 255373 - F0CX1E7VuXVawQ== - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1959 - Aos Leões - Mônica Marianno - 234684 - wYSUc4K0jBkRloS5EIkt - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1960 - Dois Índios - Mônica Marianno - 219271 - 3q+mxJjjTyGxi/vj - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1961 - Noite Negra - Mônica Marianno - 206811 - 4K1DjfaZjKM= - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1962 - Beijo do Olhar - Mônica Marianno - 252682 - yD/bXSipkoeGSg== - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1963 - É Fogo - Mônica Marianno - 194873 - CNvGs/0V3TVzwva5qQ== - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1964 - Já Foi - Mônica Marianno - 245681 - MelAKxnwoCj/5mfoO7qljio= - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1965 - Só Se For Pelo Cabelo - Mônica Marianno - 238288 - sMLhBOeQkOE= - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1966 - No Clima - Mônica Marianno - 249495 - VzAc0YUyLfa/ - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1967 - A Moça e a Chuva - Mônica Marianno - 274625 - W21ageDb30sU2SOP5JfxCedO - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1968 - Demorou! - Mônica Marianno - 39131 - ArCbODVI+OMU4bUNw+Y8 - 0.9900000000000000000 - 161 - 1 - 16 - 1 - - - 1969 - Bitter Pill - Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil - 266814 - mFVBASkHRHs= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1970 - Enslaved - Mick Mars/Nikki Sixx/Tommy Lee - 269844 - mMhLhOB8S97KvaHA - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1971 - Girls, Girls, Girls - Mick Mars/Nikki Sixx/Tommy Lee - 270288 - JTjo98ppX8tfqKjIWbOmTQ== - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1972 - Kickstart My Heart - Nikki Sixx - 283559 - +2sfMZ1/rF80ZWkv+Smb - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1973 - Wild Side - Nikki Sixx/Tommy Lee/Vince Neil - 276767 - YzAIGDE82hw7OB+ju4bJpQ== - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1974 - Glitter - Bryan Adams/Nikki Sixx/Scott Humphrey - 340114 - xsE1oAOIuDuYlgT1nGV/DQ== - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1975 - Dr. Feelgood - Mick Mars/Nikki Sixx - 282618 - 9oKdNNK+kQP1ZF8Io62cxJ0y - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1976 - Same Ol' Situation - Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil - 254511 - ZW5fqE/dmQ== - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1977 - Home Sweet Home - Nikki Sixx/Tommy Lee/Vince Neil - 236904 - 1iae06CWAZBGCF30 - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1978 - Afraid - Nikki Sixx - 248006 - pJ0OI1ky9OhnMf8yGKc= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1979 - Don't Go Away Mad (Just Go Away) - Mick Mars/Nikki Sixx - 279980 - ltlOVzkYutxXkb9yoR1VvD8= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1980 - Without You - Mick Mars/Nikki Sixx - 268956 - Y8DQUYX2qqS+bvWeoIc= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1981 - Smokin' in The Boys Room - Cub Coda/Michael Lutz - 206837 - tvlsuQa66+nAt5KZwFI= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1982 - Primal Scream - Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil - 286197 - EXTA9LXnekVUV6yUWUs= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1983 - Too Fast For Love - Nikki Sixx - 200829 - uPA4g+sk6AI5g3jWEJo= - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1984 - Looks That Kill - Nikki Sixx - 240979 - XOpR812A3qvRBzu0GA== - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1985 - Shout At The Devil - Nikki Sixx - 221962 - WSaRndj+oWE8ZqYocoZwPRBq - 0.9900000000000000000 - 162 - 1 - 3 - 1 - - - 1986 - Intro - Kurt Cobain - 52218 - YvvCQmbuZtlEZnywb9Cg - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1987 - School - Kurt Cobain - 160235 - XeY4OJtQ+63r - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1988 - Drain You - Kurt Cobain - 215196 - NA5XO5T30A== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1989 - Aneurysm - Nirvana - 271516 - tmaX4yqvcSVc+r+2NljR - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1990 - Smells Like Teen Spirit - Nirvana - 287190 - ElbXMg4RABRXGbpYgQnR - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1991 - Been A Son - Kurt Cobain - 127555 - 32YaOkd6u4nGdvQ= - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1992 - Lithium - Kurt Cobain - 250017 - 7jQW3DywKD0fng== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1993 - Sliver - Kurt Cobain - 116218 - pGaCixH0GKNTKTrW0D2XXw== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1994 - Spank Thru - Kurt Cobain - 190354 - m05rmB3/JiMC3hzR4Q== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1995 - Scentless Apprentice - Nirvana - 211200 - ZUBrddPF76mVrdKh1rNdRp6k - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1996 - Heart-Shaped Box - Kurt Cobain - 281887 - j6LRM2KHZltoDhX8 - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1997 - Milk It - Kurt Cobain - 225724 - cZXUlWTIw5qp8Q== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1998 - Negative Creep - Kurt Cobain - 163761 - vcV8KHPFvEB3gVHxlA0J7Q== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 1999 - Polly - Kurt Cobain - 149995 - aYabf7EAL0HfyOHV4bU= - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 2000 - Breed - Kurt Cobain - 208378 - sRh1nAs96KJR1YVRIKQ= - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 2001 - Tourette's - Kurt Cobain - 115591 - iFvaVjEiVTkMxUznk/3bapbLag== - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 2002 - Blew - Kurt Cobain - 216346 - e5ds4jCA5Ek= - 0.9900000000000000000 - 163 - 1 - 1 - 1 - - - 2003 - Smells Like Teen Spirit - Kurt Cobain - 301296 - LK8OnZ8/hfs= - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2004 - In Bloom - Kurt Cobain - 254928 - hMRb32jXvlVVpXVr7oa1Y8Tw - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2005 - Come As You Are - Kurt Cobain - 219219 - +CWwPgyO4BY9SfS9Vm4LRqbknA== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2006 - Breed - Kurt Cobain - 183928 - lSPaKz7TPz0pWQ== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2007 - Lithium - Kurt Cobain - 256992 - 20+WA2XThU9Qh8GADGA= - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2008 - Polly - Kurt Cobain - 177031 - H/zjPw9/J8FZ1A== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2009 - Territorial Pissings - Kurt Cobain - 143281 - hQA4T6Ps5BAZbsBrpg== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2010 - Drain You - Kurt Cobain - 223973 - IJVLp9SjzspVtEJa6Q== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2011 - Lounge Act - Kurt Cobain - 156786 - urONPC4ZToUW - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2012 - Stay Away - Kurt Cobain - 212636 - 5NSb+0d5X5A8ze7p2xo= - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2013 - On A Plain - Kurt Cobain - 196440 - MX26qoMNSQOaVWXggz2MJJp/ - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2014 - Something In The Way - Kurt Cobain - 230556 - wgAH0oPcVbIdHA== - 0.9900000000000000000 - 164 - 1 - 1 - 1 - - - 2015 - Time - - 96888 - 0ddzuP2ck9uS85vQAabhmA== - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2016 - P.S.Apareça - - 209188 - U6+pU2qQV4Q= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2017 - Sangue Latino - - 223033 - qjfOLlor5z6E - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2018 - Folhas Secas - - 161253 - bcs/8JC/7FcmLw== - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2019 - Poeira - - 267075 - LKJDeV9ucwhnRhwz0/FcDWSY - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2020 - Mágica - - 233743 - 6cIhUisRE74Yk304 - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2021 - Quem Mata A Mulher Mata O Melhor - - 262791 - VCR+lIq1+710NhxHUJc= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2022 - Mundaréu - - 217521 - /zOyiL62RkMKTxdoTK9adOk= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2023 - O Braço Da Minha Guitarra - - 258351 - 696uc8iCrp2z - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2024 - Deus - - 284160 - iwQL2nmmv+Th9Q== - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2025 - Mãe Terra - - 306625 - eg7gc0RzTa8OGcIzOWW5vos= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2026 - Às Vezes - - 330292 - L9khA9G3BUQ87qXvdZL0lA== - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2027 - Menino De Rua - - 329795 - 0M3/gw5h7qVbydHSdQ== - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2028 - Prazer E Fé - - 214831 - 6DR5sRxYdj0pbgA= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2029 - Elza - - 199105 - Xgkeoy8/pPM= - 0.9900000000000000000 - 165 - 1 - 1 - 1 - - - 2030 - Requebra - - 240744 - 8IzoIXgzXg== - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2031 - Nossa Gente (Avisa Là) - - 188212 - 7TNxxi69uvzg2Ds= - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2032 - Olodum - Alegria Geral - - 233404 - kqSRgtcC5Ia3mZItgdf4 - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2033 - Madagáscar Olodum - - 252264 - kJCjJRjIOzqP - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2034 - Faraó Divindade Do Egito - - 228571 - MExkp09naPlW - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2035 - Todo Amor (Asas Da Liberdade) - - 245133 - +mZJdk7XvQ== - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2036 - Denúncia - - 159555 - oUNFVsQSa080FuI= - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2037 - Olodum, A Banda Do Pelô - - 146599 - aFfzZ9GYIhBK - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2038 - Cartao Postal - - 211565 - xIiArK0qRyzWQArn - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2039 - Jeito Faceiro - - 217286 - SyrZh1E7/zJSF4zjo3Phpba1rQ== - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2040 - Revolta Olodum - - 230191 - dX+81hhlQQgHP6E= - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2041 - Reggae Odoyá - - 224470 - gb6nPPcQ0NRK+HJx9MgJ - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2042 - Protesto Do Olodum (Ao Vivo) - - 206001 - ZYcgi13cI8xuA27s - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2043 - Olodum - Smile (Instrumental) - - 235833 - 9yoSdcxi5cul - 0.9900000000000000000 - 166 - 1 - 7 - 1 - - - 2044 - Vulcão Dub - Fui Eu - Bi Ribeira/Herbert Vianna/João Barone - 287059 - peTYwH0MS+FQW4o= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2045 - O Trem Da Juventude - Herbert Vianna - 225880 - fx8WYqSb2870oeTaUg== - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2046 - Manguetown - Chico Science/Dengue/Lúcio Maia - 162925 - YPsnZiTswNp6poQcpcAiIR6R - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2047 - Um Amor, Um Lugar - Herbert Vianna - 184555 - VavyX2q9Su8= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2048 - Bora-Bora - Herbert Vianna - 182987 - uQQA/m6vq1C5 - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2049 - Vai Valer - Herbert Vianna - 206524 - Np3ipaVw3of1G6vS - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2050 - I Feel Good (I Got You) - Sossego - James Brown/Tim Maia - 244976 - U2r8Im6bvana/OghdaWFrvY= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2051 - Uns Dias - Herbert Vianna - 240796 - 0mc1WtJzBk3vjDVV1Cvn - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2052 - Sincero Breu - C. A./C.A./Celso Alvim/Herbert Vianna/Mário Moura/Pedro Luís/Sidon Silva - 208013 - rZRxjD20/EBcofmDLw== - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2053 - Meu Erro - Herbert Vianna - 188577 - WNn+BtlqTfiXiRwhrDE= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2054 - Selvagem - Bi Ribeiro/Herbert Vianna/João Barone - 148558 - hCi9OfT48T1p1x1r - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2055 - Brasília 5:31 - Herbert Vianna - 178337 - /TF5gh0kM1w= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2056 - Tendo A Lua - Herbert Vianna/Tet Tillett - 198922 - zVF9NLT85w== - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2057 - Que País É Este - Renato Russo - 216685 - HAjLzNd4PEk60maclC8= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2058 - Navegar Impreciso - Herbert Vianna - 262870 - /lj6ZhCZA4f9Fi1ba7w= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2059 - Feira Moderna - Beto Guedes/Fernando Brant/L Borges - 182517 - RPVV+bsVoCgluD04 - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2060 - Tequila - Lourinha Bombril (Parate Y Mira) - Bahiano/Chuck Rio/Diego Blanco/Herbert Vianna - 255738 - Us3Awp2Wfts= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2061 - Vamo Batê Lata - Herbert Vianna - 228754 - ldfWGIDNtaod0I16jnA= - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2062 - Life During Wartime - Chris Frantz/David Byrne/Jerry Harrison/Tina Weymouth - 259186 - mnOlXjDUrtJgIDQvVmq91T7kig== - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2063 - Nebulosa Do Amor - Herbert Vianna - 203415 - fSKildJye5tsq2jE - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2064 - Caleidoscópio - Herbert Vianna - 256522 - eScp8CCr5OYEdfhLnl8/X/tO - 0.9900000000000000000 - 167 - 1 - 7 - 1 - - - 2065 - Trac Trac - Fito Paez/Herbert Vianna - 231653 - AxDJeNEQi71ZE2a1t3DS3Q== - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2066 - Tendo A Lua - Herbert Vianna/Tetê Tillet - 219585 - k+QdOaV5eKw= - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2067 - Mensagen De Amor (2000) - Herbert Vianna - 183588 - STQTPDtxXNI= - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2068 - Lourinha Bombril - Bahiano/Diego Blanco/Herbert Vianna - 159895 - TK+vWOCU7YvT - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2069 - La Bella Luna - Herbert Vianna - 192653 - wEHby4H8yxcxXF2WUMwnxg== - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2070 - Busca Vida - Herbert Vianna - 176431 - qhzX9VjkroYt - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2071 - Uma Brasileira - Carlinhos Brown/Herbert Vianna - 217573 - OwSJSxqm2etobmmRQG9ZK3Y= - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2072 - Luis Inacio (300 Picaretas) - Herbert Vianna - 198191 - tl7jMRk9Qm77qWdcLA== - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2073 - Saber Amar - Herbert Vianna - 202788 - VGiQE6gRQ/B24L5Y7RncaJst - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2074 - Ela Disse Adeus - Herbert Vianna - 226298 - S9DOsAnqSwir - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2075 - O Amor Nao Sabe Esperar - Herbert Vianna - 241084 - MIQMQSQ9199Gg2UgxecDcw== - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2076 - Aonde Quer Que Eu Va - Herbert Vianna/Paulo Sérgio Valle - 258089 - TymRkw467uF0hbiGKFwIlw== - 0.9900000000000000000 - 168 - 1 - 7 - 1 - - - 2077 - Caleidoscópio - - 211330 - RluxF8ncBYlUqgkrCuY= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2078 - Óculos - - 219271 - lin73xkXIUodYK8= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2079 - Cinema Mudo - - 227918 - H1geJlyIgKGnwamGTIwK - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2080 - Alagados - - 302393 - j+W1ap4K8A== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2081 - Lanterna Dos Afogados - - 190197 - YSl+LiQRk7YZJOUwNoOs - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2082 - Melô Do Marinheiro - - 208352 - ikUF1IB1ko0MZ7o4qkUZFGcf - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2083 - Vital E Sua Moto - - 210207 - MgpRfJUt8m0npg== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2084 - O Beco - - 189178 - gws4Et9YBBt+65Y= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2085 - Meu Erro - - 208431 - Ib1XWwvTC9HJFr55mDjJcKY= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2086 - Perplexo - - 161175 - CGrmM+Ou/5dmwA== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2087 - Me Liga - - 229590 - S6HZnBkwvz7S55kb1Q9tTb96pw== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2088 - Quase Um Segundo - - 275644 - lHXx4ysK7dmpW3NtS8F9dQ== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2089 - Selvagem - - 245890 - 3X4HCTLUpm5PESM= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2090 - Romance Ideal - - 250070 - YEAdvzB71rD1cA8= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2091 - Será Que Vai Chover? - - 337057 - 5pR3cyzPFJL4aOH7n4VioEp13A== - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2092 - SKA - - 148871 - ymJIG1auG0U= - 0.9900000000000000000 - 169 - 1 - 7 - 1 - - - 2093 - Bark at the Moon - O. Osbourne - 257252 - xe9tb8QjnVwzQn/8kX74XiEf - 0.9900000000000000000 - 170 - 2 - 1 - 1 - - - 2094 - I Don't Know - B. Daisley, O. Osbourne & R. Rhoads - 312980 - GTVlgJMWeINMXBx+ - 0.9900000000000000000 - 171 - 2 - 1 - 1 - - - 2095 - Crazy Train - B. Daisley, O. Osbourne & R. Rhoads - 295960 - zuszeHSM2mLEQxczXQ== - 0.9900000000000000000 - 171 - 2 - 1 - 1 - - - 2096 - Flying High Again - L. Kerslake, O. Osbourne, R. Daisley & R. Rhoads - 290851 - OORPvDSOcSw= - 0.9900000000000000000 - 172 - 2 - 1 - 1 - - - 2097 - Mama, I'm Coming Home - L. Kilmister, O. Osbourne & Z. Wylde - 251586 - X2/ZWUygUQ== - 0.9900000000000000000 - 173 - 2 - 1 - 1 - - - 2098 - No More Tears - J. Purdell, M. Inez, O. Osbourne, R. Castillo & Z. Wylde - 444358 - FsPKLqVKgOqVRUhU8U1MNQ== - 0.9900000000000000000 - 173 - 2 - 1 - 1 - - - 2099 - I Don't Know - O. Osbourne, R. Daisley, R. Rhoads - 283088 - QJ78n+fwQ6I= - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2100 - Crazy Train - O. Osbourne, R. Daisley, R. Rhoads - 322716 - 0wiaM47Bc0MBb5I= - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2101 - Believer - O. Osbourne, R. Daisley, R. Rhoads - 308897 - kpnO0Z9JKNd/EiOkPgsC - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2102 - Mr. Crowley - O. Osbourne, R. Daisley, R. Rhoads - 344241 - YC7Th4wrd3hPYraG - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2103 - Flying High Again - O. Osbourne, R. Daisley, R. Rhoads, L. Kerslake - 261224 - rkzcokytBA== - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2104 - Relvelation (Mother Earth) - O. Osbourne, R. Daisley, R. Rhoads - 349440 - zkinGsr7wOX29IK/H+LSnAs= - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2105 - Steal Away (The Night) - O. Osbourne, R. Daisley, R. Rhoads - 485720 - ZyJWgjySofbQ - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2106 - Suicide Solution (With Guitar Solo) - O. Osbourne, R. Daisley, R. Rhoads - 467069 - RgHyXv0mkuYsbMIwtpJZbjTH - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2107 - Iron Man - A. F. Iommi, W. Ward, T. Butler, J. Osbourne - 172120 - zHpAlwtG4tdMCxR40yr6n/UBJA== - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2108 - Children Of The Grave - A. F. Iommi, W. Ward, T. Butler, J. Osbourne - 357067 - +E/rb59+NmvDKM5d - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2109 - Paranoid - A. F. Iommi, W. Ward, T. Butler, J. Osbourne - 176352 - NARLBWrnGBtP - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2110 - Goodbye To Romance - O. Osbourne, R. Daisley, R. Rhoads - 334393 - 2hfz7gW782RsEAbJfI7R9w== - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2111 - No Bone Movies - O. Osbourne, R. Daisley, R. Rhoads - 249208 - D3YTIzy2np4mr5qL - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2112 - Dee - R. Rhoads - 261302 - C6WpCBBXrJAwr9DEYk3T - 0.9900000000000000000 - 174 - 1 - 3 - 1 - - - 2113 - Shining In The Light - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 240796 - h7wzcloJpDsjnWA= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2114 - When The World Was Young - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 373394 - UN8MWdlRBGAgc315S/w= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2115 - Upon A Golden Horse - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 232359 - x0Ne2mnKM57yZhg= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2116 - Blue Train - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 405028 - AgBt5XL3Vz9Ro3brEElzSxQ+ - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2117 - Please Read The Letter - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 262112 - Jl4q3fjEw/eJHEE= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2118 - Most High - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 336535 - 88CRAl+yjQqC9LyNIw== - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2119 - Heart In Your Hand - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 230896 - c8kgV+iKs6vxYdcidCGv/80iEA== - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2120 - Walking Into Clarksdale - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 318511 - gyp+RhOYhjQ3MqGduitQ+dc= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2121 - Burning Up - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 321619 - NLZlR84wKj09bFs= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2122 - When I Was A Child - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 345626 - Jpl9mklIStlDUAN/c74= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2123 - House Of Love - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 335699 - OWhJ0LUom+5ZJDxbThvWWg== - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2124 - Sons Of Freedom - Jimmy Page, Robert Plant, Charlie Jones, Michael Lee - 246465 - 2LUMCCAg4Qiv/e7ksuXTEHA= - 0.9900000000000000000 - 175 - 1 - 1 - 1 - - - 2125 - United Colours - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 330266 - 1PSbplmKqyN1 - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2126 - Slug - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 281469 - 7Py9bfbqp76xtxhIaMgG - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2127 - Your Blue Room - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 328228 - rAmmPmhL3ioCZX4yW4Fc/Ko= - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2128 - Always Forever Now - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 383764 - G7NAge7IPhReuNiLjNOgL96hfQ== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2129 - A Different Kind Of Blue - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 120816 - pKEdkmqQbHVjMFobnpQ= - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2130 - Beach Sequence - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 212297 - UuorG93/VO0lUg== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2131 - Miss Sarajevo - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 340767 - 2aqSLKO7f3IvepWtFl1c - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2132 - Ito Okashi - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 205087 - sS5evO34JU1E - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2133 - One Minute Warning - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 279693 - hqA3ULP4QPS2weM2jJ+cK2QyvQ== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2134 - Corpse (These Chains Are Way Too Long) - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 214909 - FL2ANqK/xpWJ4YRF5/A1 - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2135 - Elvis Ate America - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 180166 - O97GnG0ippvmeqG/H8GT848Ing== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2136 - Plot 180 - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 221596 - HwCu9DGqatU8nk+caQ== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2137 - Theme From The Swan - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 203911 - 8IZsIM/yFuVQJx4HdshNkbU= - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2138 - Theme From Let's Go Native - Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. - 186723 - Umy/OjDSa8O30V9IKw== - 0.9900000000000000000 - 176 - 1 - 10 - 1 - - - 2139 - Wrathchild - Steve Harris - 170396 - VWHQDIZuOKyxOrCG1io0ooeq6A== - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2140 - Killers - Paul Di'Anno/Steve Harris - 309995 - Svz+tlaatQw6RYYI+xk= - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2141 - Prowler - Steve Harris - 240274 - FPdAC0ampbqFian7QI8V - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2142 - Murders In The Rue Morgue - Steve Harris - 258638 - tF+8ulhjGrbs - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2143 - Women In Uniform - Greg Macainsh - 189936 - LHFss6eKvXgfq0efocikQXgs - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2144 - Remember Tomorrow - Paul Di'Anno/Steve Harris - 326426 - nnV8JfzRqT9eWLA= - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2145 - Sanctuary - David Murray/Paul Di'Anno/Steve Harris - 198844 - ih6NeTRO0eI= - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2146 - Running Free - Paul Di'Anno/Steve Harris - 199706 - PshvaQIVvfMWF+rtCk5Dr0xw - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2147 - Phantom Of The Opera - Steve Harris - 418168 - /kteH27OvQ== - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2148 - Iron Maiden - Steve Harris - 235232 - E09v86dKjV+sDbv6vA== - 0.9900000000000000000 - 177 - 1 - 1 - 1 - - - 2149 - Corduroy - Pearl Jam & Eddie Vedder - 305293 - TEdBxu9/0ErJ597v4w== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2150 - Given To Fly - Eddie Vedder & Mike McCready - 233613 - 4KgAm0WUqaSmI0Ojfe8= - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2151 - Hail, Hail - Stone Gossard & Eddie Vedder & Jeff Ament & Mike McCready - 223764 - opF2JRL+F96o3j2wyYWIFbdmuQ== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2152 - Daughter - Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder - 407484 - BAwftCdBqKAdgw== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2153 - Elderly Woman Behind The Counter In A Small Town - Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder - 229328 - AuGzJ1ZnydDUyA== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2154 - Untitled - Pearl Jam - 122801 - WLwH5OAfHg6LPMNvkpZx - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2155 - MFC - Eddie Vedder - 148192 - /tFWdsAlkjvPFg== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2156 - Go - Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder - 161541 - Mq3tleW2O7NjrUJhiYIP - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2157 - Red Mosquito - Jeff Ament & Stone Gossard & Jack Irons & Mike McCready & Eddie Vedder - 242991 - Dz9xIJHkpsv/fVIJMyo= - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2158 - Even Flow - Stone Gossard & Eddie Vedder - 317100 - FcnB62Cdp925V+IO - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2159 - Off He Goes - Eddie Vedder - 343222 - vG/N87Etgvtd9cxNByKVZ2Qx - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2160 - Nothingman - Jeff Ament & Eddie Vedder - 278595 - OOEtmMeWrlloYbfJrtaSDpCv - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2161 - Do The Evolution - Eddie Vedder & Stone Gossard - 225462 - WAan0LfT9Z5ZehF2VSU= - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2162 - Better Man - Eddie Vedder - 246204 - 1TKO1wZdAtMamqUsHXd0Ew== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2163 - Black - Stone Gossard & Eddie Vedder - 415712 - twXZeZEQdcXS+FXeVutipEwA - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2164 - F*Ckin' Up - Neil Young - 377652 - gLipAVUyjDYRptcm5WcLvg== - 0.9900000000000000000 - 178 - 1 - 1 - 1 - - - 2165 - Life Wasted - Stone Gossard - 234344 - S+lEIhkSM2St9MOuQ4fRdg== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2166 - World Wide Suicide - Eddie Vedder - 209188 - k00NBIRGBNpkHvrRb3dLLA== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2167 - Comatose - Mike McCready & Stone Gossard - 139990 - WWK8PWemdZyoPciHzh8FsNDTvg== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2168 - Severed Hand - Eddie Vedder - 270341 - S8eiP0i08ziSPX14gjA= - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2169 - Marker In The Sand - Mike McCready - 263235 - brrXLKaXZ9sIPA== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2170 - Parachutes - Stone Gossard - 216555 - lv71IZ+kjHzHksB89bKyPQlrwA== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2171 - Unemployable - Matt Cameron & Mike McCready - 184398 - BZ3wl/X5phcY5OuZA/Ue9ENx - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2172 - Big Wave - Jeff Ament - 178573 - 2OsFaJyuPeJ681pdb0jsTQ== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2173 - Gone - Eddie Vedder - 249547 - DV4spv10Y+OmJ3k= - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2174 - Wasted Reprise - Stone Gossard - 53733 - k735mM3nY/80VOi3FiwkvYY= - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2175 - Army Reserve - Jeff Ament - 225567 - URenJublRPfbd6KF9Q== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2176 - Come Back - Eddie Vedder & Mike McCready - 329743 - xOLmNWHFoWCITg== - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2177 - Inside Job - Eddie Vedder & Mike McCready - 428643 - uXV0j9BQpV0p1WFY - 0.9900000000000000000 - 179 - 1 - 4 - 1 - - - 2178 - Can't Keep - Eddie Vedder - 219428 - 1xNT1gzsXa9fYfI0Re5cwdo= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2179 - Save You - Eddie Vedder/Jeff Ament/Matt Cameron/Mike McCready/Stone Gossard - 230112 - j1liLXDQaAom/A== - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2180 - Love Boat Captain - Eddie Vedder - 276453 - y7FjinheTXHLU5vxFFk= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2181 - Cropduster - Matt Cameron - 231888 - gVuKYUmbTuTS/wupo4Nu - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2182 - Ghost - Jeff Ament - 195108 - xmCGk6+Pqg== - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2183 - I Am Mine - Eddie Vedder - 215719 - jw9PD53zaE7UXE4= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2184 - Thumbing My Way - Eddie Vedder - 250226 - f8SzjH3NkA== - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2185 - You Are - Matt Cameron - 270863 - bbWq7lxR1ZCN - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2186 - Get Right - Matt Cameron - 158589 - Y/GwvdE6TD5G3pa81UY= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2187 - Green Disease - Eddie Vedder - 161253 - YYIBrfoW4v8= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2188 - Help Help - Jeff Ament - 215092 - X9plYLNMHtfBDfldXMHyeUA+ - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2189 - Bushleager - Stone Gossard - 237479 - svSw4GO6+8/T45OwgfKS - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2190 - 1/2 Full - Jeff Ament - 251010 - 99Xri/q/v/vHTdcFwA40udg= - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2191 - Arc - Pearl Jam - 65593 - TCqv+gGmtw== - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2192 - All or None - Stone Gossard - 277655 - S/QtXXhqyQ== - 0.9900000000000000000 - 180 - 1 - 1 - 1 - - - 2193 - Once - Stone Gossard - 231758 - +6NUsozyNA== - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2194 - Evenflow - Stone Gossard - 293720 - GBXj9g7Frtk= - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2195 - Alive - Stone Gossard - 341080 - JKVnrv3TRdR9dMo= - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2196 - Why Go - Jeff Ament - 200254 - atVsO1wSkGUlz1r1+eHrw8Fu - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2197 - Black - Dave Krusen/Stone Gossard - 343823 - RVSEU8RitQ== - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2198 - Jeremy - Jeff Ament - 318981 - 0A/dDn1q561Adrux - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2199 - Oceans - Jeff Ament/Stone Gossard - 162194 - HnSyVUtxtBvn - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2200 - Porch - Eddie Vedder - 210520 - Ew7uhHnlgqg= - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2201 - Garden - Jeff Ament/Stone Gossard - 299154 - pxTAVkjB3IsSM6tMBrzTJ+A= - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2202 - Deep - Jeff Ament/Stone Gossard - 258324 - /XnwAOLojcr/jg== - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2203 - Release - Jeff Ament/Mike McCready/Stone Gossard - 546063 - bce9zuIKnQ== - 0.9900000000000000000 - 181 - 1 - 1 - 1 - - - 2204 - Go - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 193123 - HWqTbuai5zs1DVEaXZkThC8= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2205 - Animal - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 169325 - pjHXyH3BTaal - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2206 - Daughter - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 235598 - 7X0jsjbKwmhqCgpe+61Xva4= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2207 - Glorified G - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 206968 - h9S0OZ/6Y2w= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2208 - Dissident - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 215510 - VezSID/8e0236Z/k - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2209 - W.M.A. - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 359262 - 16saJN1INg== - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2210 - Blood - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 170631 - ccAT2R7Qt7TeKU4= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2211 - Rearviewmirror - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 284186 - Q217l+rLYQ== - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2212 - Rats - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 255425 - X5/TDo/0/Qgeew== - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2213 - Elderly Woman Behind The Counter In A Small Town - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 196336 - GzVc4yu/RiArxJnZ - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2214 - Leash - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 189257 - URpPaS+DORLmt8s= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2215 - Indifference - Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard - 302053 - 7ARKKdOulWMNMpTniVA= - 0.9900000000000000000 - 182 - 1 - 1 - 1 - - - 2216 - Johnny B. Goode - - 243200 - o6o1usbGFL10pZM= - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2217 - Don't Look Back - - 221100 - m0EJNX6QEj67/PZYFQN2sR4= - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2218 - Jah Seh No - - 276871 - Z+Dfq5ZosPwFC9hH1Q== - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2219 - I'm The Toughest - - 230191 - QNb6IQP8FVZ2EQ== - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2220 - Nothing But Love - - 221570 - p7PdpcJPYg== - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2221 - Buk-In-Hamm Palace - - 265665 - 7j2y+O+roYWC - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2222 - Bush Doctor - - 239751 - BmZzJnIXPwlUriJxEGnO - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2223 - Wanted Dread And Alive - - 260310 - 7rTSV0K7dannRo7dCnZid5LLbw== - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2224 - Mystic Man - - 353671 - qIBAxmW5+rR7fS1IKl+8 - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2225 - Coming In Hot - - 213054 - sitJS/HKPyyIYv7eS6o= - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2226 - Pick Myself Up - - 234684 - Rfoj5250DPGIwMA= - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2227 - Crystal Ball - - 309733 - aRlGsqu5dcVn - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2228 - Equal Rights Downpresser Man - - 366733 - JLndQBQ9A7scaNGe504Gd054pQ== - 0.9900000000000000000 - 141 - 1 - 8 - 1 - - - 2229 - Speak To Me/Breathe - Mason/Waters, Gilmour, Wright - 234213 - wIowndYTQq9TJQ== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2230 - On The Run - Gilmour, Waters - 214595 - 5XfD1WoKLV/P7g== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2231 - Time - Mason, Waters, Wright, Gilmour - 425195 - pFhbyjH3rDNq/Q== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2232 - The Great Gig In The Sky - Wright, Waters - 284055 - LMGaiT9qAfpTaPaS7A== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2233 - Money - Waters - 391888 - I3icbCAY1kvz5dhBC+FL - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2234 - Us And Them - Waters, Wright - 461035 - H7rYxUoCO+DLw17Um2StxW+j - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2235 - Any Colour You Like - Gilmour, Mason, Wright, Waters - 205740 - fw/GSeVI4M60sf1fH69PSQ== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2236 - Brain Damage - Waters - 230556 - uSbdIT27oV25ArCOOA== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2237 - Eclipse - Waters - 125361 - 0WfTy/RYcPN9aQ== - 0.9900000000000000000 - 183 - 1 - 1 - 1 - - - 2238 - ZeroVinteUm - - 315637 - hy/NYz4lSxtx - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2239 - Queimando Tudo - - 172591 - ScbsQlQk7Cs= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2240 - Hip Hop Rio - - 151536 - Lz98nyz3TONb8MzFqQ== - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2241 - Bossa - - 29048 - 7bWL1Pp63WVyxgaIoeeJnw== - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2242 - 100% HardCore - - 165146 - hMg2OfQLkKBs8kHwK6VGoFL+ - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2243 - Biruta - - 213263 - yFDxsGnKzLWYo1VkWru8 - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2244 - Mão Na Cabeça - - 202631 - /XI6+Kr7M42Im3RHIb/nT+k= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2245 - O Bicho Tá Pregando - - 171964 - 1+OSGM1uJ1b3/BaN5zVvXUku - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2246 - Adoled (Ocean) - - 185103 - BeLMHGMozVaF - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2247 - Seus Amigos - - 100858 - 2bwFe13j2LXlpcvRVAQ2d/o= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2248 - Paga Pau - - 197485 - P9jEdrk34xoKxy4= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2249 - Rappers Reais - - 202004 - /xiiwh5AERI= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2250 - Nega Do Cabelo Duro - - 121808 - UZaoZIhMNA== - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2251 - Hemp Family - - 205923 - yOXsLRkWrc9iA86YQg== - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2252 - Quem Me Cobrou? - - 121704 - EYb0pbIukeX2Zecq7UEbEjA= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2253 - Se Liga - - 410409 - rotC4UHC5gH08rs9Qno= - 0.9900000000000000000 - 184 - 1 - 17 - 1 - - - 2254 - Bohemian Rhapsody - Mercury, Freddie - 358948 - eIUhb+KaBQ== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2255 - Another One Bites The Dust - Deacon, John - 216946 - 4u+HRe8pbLNQ0uPpt5YvRQ== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2256 - Killer Queen - Mercury, Freddie - 182099 - v7A6nyq4I23jdLz6ok0= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2257 - Fat Bottomed Girls - May, Brian - 204695 - qI9f8rp899iIPmpqXg== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2258 - Bicycle Race - Mercury, Freddie - 183823 - j+JW3Dwj6ctduDZj2As= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2259 - You're My Best Friend - Deacon, John - 172225 - r7mthJNAKDc8irbI2A== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2260 - Don't Stop Me Now - Mercury, Freddie - 211826 - YL9NxN1TkmUeZipn3TGmvA== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2261 - Save Me - May, Brian - 228832 - pOsk2IW95stPZ6oZUYZaEQ== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2262 - Crazy Little Thing Called Love - Mercury, Freddie - 164231 - /Pjon/q4IUqbR1osY/aQgDM= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2263 - Somebody To Love - Mercury, Freddie - 297351 - 3bPZ2wJn+I3r50zM39BV - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2264 - Now I'm Here - May, Brian - 255346 - Na3Tt6kzAo7pdYuf7HEZ - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2265 - Good Old-Fashioned Lover Boy - Mercury, Freddie - 175960 - HnR8XUAg9oCnbcw= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2266 - Play The Game - Mercury, Freddie - 213368 - /c5nidafweI= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2267 - Flash - May, Brian - 168489 - fGiqsUrxjNtZoHnOsq5qUw== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2268 - Seven Seas Of Rhye - Mercury, Freddie - 170553 - gxS3UhA7Zsg= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2269 - We Will Rock You - Deacon, John/May, Brian - 122880 - Gg4ByE2wNuyhDNKs9Q== - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2270 - We Are The Champions - Mercury, Freddie - 180950 - aaRNzVJsSyD9Nt4crCtZbCw= - 0.9900000000000000000 - 185 - 1 - 1 - 1 - - - 2271 - We Will Rock You - May - 122671 - 6brXftqQU8mXxgw= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2272 - We Are The Champions - Mercury - 182883 - gUuN5U2twm4TXEX6EMvqMAM= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2273 - Sheer Heart Attack - Taylor - 207386 - kjXgjcI7V+rKvXqJ1IQU - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2274 - All Dead, All Dead - May - 190119 - tJKPx92sqr4xjXQ= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2275 - Spread Your Wings - Deacon - 275356 - bQ6lIsWLM9c= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2276 - Fight From The Inside - Taylor - 184737 - 84lRjWPiBPOJh8DmcQ== - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2277 - Get Down, Make Love - Mercury - 231235 - WKE8LuaKIlw1x3p9vBc= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2278 - Sleep On The Sidewalk - May - 187428 - w0lRPCHBCQ== - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2279 - Who Needs You - Deacon - 186958 - OXrJpcqnBbQ= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2280 - It's Late - May - 386194 - /PdNgIldTEw= - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2281 - My Melancholy Blues - Mercury - 206471 - llOKE+Um7JvFPm+p - 0.9900000000000000000 - 186 - 1 - 1 - 1 - - - 2282 - Shiny Happy People - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 226298 - VU5jA7Qd5Fe1MBKDgMTK1w== - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2283 - Me In Honey - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 246674 - 7ATvxiq2syWUork= - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2284 - Radio Song - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 255477 - 4cdETayi/x2GqS8= - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2285 - Pop Song 89 - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 185730 - A+Ejd49kYSLEi1FruokqmK/dHw== - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2286 - Get Up - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 160235 - KynTaM411CHLubRC1IfCSJM= - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2287 - You Are The Everything - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 226298 - lS9AlmlVddmTI3dmbqg= - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2288 - Stand - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 192862 - tDvaDbqpWZA/VwvXDw== - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2289 - World Leader Pretend - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 259761 - MsbhBXJH8DmV - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2290 - The Wrong Child - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 216633 - ffL0orGqZEsLuSBL6DvYkzueAQ== - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2291 - Orange Crush - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 231706 - Xn5mQ2BclmH7 - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2292 - Turn You Inside-Out - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 257358 - mXqmGo/ItLfflfLAzFU= - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2293 - Hairshirt - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 235911 - 596mLN8LUThWYf+LsUJUEwNP - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2294 - I Remember California - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 304013 - IKWkzqsQ34S/a0yeshHN - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2295 - Untitled - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 191503 - fu80G1ZIQlC4kDwD - 0.9900000000000000000 - 188 - 1 - 4 - 1 - - - 2296 - How The West Was Won And Where It Got Us - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 271151 - i4LvcCI10EI= - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2297 - The Wake-Up Bomb - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 308532 - +xwAhpLNCcNNeuPI1STO - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2298 - New Test Leper - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 326791 - U9hjVBUa1NwPNOlcLo/b/Tdv9A== - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2299 - Undertow - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 309498 - G8+1dEb0Q8E= - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2300 - E-Bow The Letter - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 324963 - rLVdITzPXWzt+eBI - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2301 - Leave - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 437968 - d17krZW9n+aR - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2302 - Departure - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 209423 - L7YYhCLuDiDXErxjfos78g== - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2303 - Bittersweet Me - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 245812 - fpBJdRPP91dXkJlfhSI= - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2304 - Be Mine - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 333087 - Gk4uayNKOw== - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2305 - Binky The Doormat - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 301688 - 39gJNWcU31hyo/0hVUfxHOY= - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2306 - Zither - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 154148 - LMpedcFR8INIL13QznVC - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2307 - So Fast, So Numb - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 252682 - apwKmY9DeDcmvIgA49NdEQ== - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2308 - Low Desert - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 212062 - Ax1wH2kXt0XkzK/7 - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2309 - Electrolite - Bill Berry-Peter Buck-Mike Mills-Michael Stipe - 245315 - 1YfeQ91VEg== - 0.9900000000000000000 - 189 - 1 - 1 - 1 - - - 2310 - Losing My Religion - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 269035 - kOlSJk4Fye+gddJLS8tY0fM= - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2311 - Low - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 296777 - hVJUq3fIPITnASKf9Qj/N3I= - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2312 - Near Wild Heaven - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 199862 - HvgbEu1VQ1bcr1YJ - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2313 - Endgame - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 230687 - DE/c0L/45A== - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2314 - Belong - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 247013 - ierJHcjNAH/K - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2315 - Half A World Away - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 208431 - E1gjs/rlcmX+aA== - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2316 - Texarkana - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 220081 - 64wu3dIVUBk4 - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2317 - Country Feedback - Bill Berry/Michael Stipe/Mike Mills/Peter Buck - 249782 - P43ClA1R9CWIQ9cSY0KxC1lV - 0.9900000000000000000 - 187 - 1 - 4 - 1 - - - 2318 - Carnival Of Sorts - R.E.M. - 233482 - XVr5fFKdXptA9rewZpIM1Mth - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2319 - Radio Free Aurope - R.E.M. - 245315 - 7JN+P3UkSNko6yw= - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2320 - Perfect Circle - R.E.M. - 208509 - vPsi2uVFEHD3r7azL9GTcX9X - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2321 - Talk About The Passion - R.E.M. - 203206 - 5ak7aGPfGoNYCcQ1rxQv+rVD - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2322 - So Central Rain - R.E.M. - 194768 - Jo668Sc93coQpJHXWdF+ - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2323 - Don't Go Back To Rockville - R.E.M. - 272352 - HIGSv/vKwrhmMnkHnwA= - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2324 - Pretty Persuasion - R.E.M. - 229929 - 3S7IMN8quBMqhRQK38YyamQx - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2325 - Green Grow The Rushes - R.E.M. - 225671 - EnkihLtczAKK9MPVKg== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2326 - Can't Get There From Here - R.E.M. - 220630 - zbOpkaCeG2RtaA== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2327 - Driver 8 - R.E.M. - 204747 - 58Di8jTHFNbS7V27 - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2328 - Fall On Me - R.E.M. - 172016 - DNQSKC4fZq/q+hESidnDkrE= - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2329 - I Believe - R.E.M. - 227709 - C7pK1JzpD1Usr/9YIm/4/4XMjA== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2330 - Cuyahoga - R.E.M. - 260623 - NU4BifzF0A== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2331 - The One I Love - R.E.M. - 197355 - q+5RQyA/UgFfNzcoGNjyt7CS - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2332 - The Finest Worksong - R.E.M. - 229276 - ohqJVPcFvni8uMHY1hkwqg== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2333 - It's The End Of The World As We Know It (And I Feel Fine) - R.E.M. - 244819 - Xbs34h32oA== - 0.9900000000000000000 - 190 - 1 - 4 - 1 - - - 2334 - Infeliz Natal - Rodolfo - 138266 - lGPaXVtJ2WruLsUh - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2335 - A Sua - Rodolfo - 142132 - WT5hx5VInV9h - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2336 - Papeau Nuky Doe - Rodolfo - 121652 - 6C60WfRa9IQj6QZioeQ= - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2337 - Merry Christmas - Rodolfo - 126040 - YG/obejqaomjBH3VG4iu - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2338 - Bodies - Rodolfo - 180035 - 7jNU8S+n7+QP+aqiN5M= - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2339 - Puteiro Em João Pessoa - Rodolfo - 195578 - nH2tNNi18XglfqQQVXY= - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2340 - Esporrei Na Manivela - Rodolfo - 293276 - 2ft05xguTfLruX8DXu8/x1E= - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2341 - Bê-a-Bá - Rodolfo - 249051 - DOFYbVTVTfy6LnOKlg== - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2342 - Cajueiro - Rodolfo - 158589 - bYofri5QeshOisF6WLKTieW2 - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2343 - Palhas Do Coqueiro - Rodolfo - 133851 - AEmVLGynnpocdB5/ - 0.9900000000000000000 - 191 - 1 - 4 - 1 - - - 2344 - Maluco Beleza - - 203206 - IuaV09CRmQGWQ5LOrNl8mmgwSQ== - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2345 - O Dia Em Que A Terra Parou - - 261720 - NpZQ2F6zB4+2 - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2346 - No Fundo Do Quintal Da Escola - - 177606 - VDAKYFdyHMC5VB1SagUDXb8= - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2347 - O Segredo Do Universo - - 192679 - If+zQ9XDKYyVvXQciglKOO8= - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2348 - As Profecias - - 232515 - xEuCCn2od/We5CxK - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2349 - Mata Virgem - - 142602 - AfM5bbaqEFpGNsvdX0ycyhMHMQ== - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2350 - Sapato 36 - - 196702 - oJl0SxeBC8zf - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2351 - Todo Mundo Explica - - 134896 - RWBK6HMpUJyTjt4HfRS2LB4= - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2352 - Que Luz É Essa - - 165067 - 2iuL3fo0NGd+ - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2353 - Diamante De Mendigo - - 206053 - VjWeRHoh8WuSd9hz - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2354 - Negócio É - - 175464 - d3OjN5kcYA== - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2355 - Muita Estrela, Pouca Constelação - - 268068 - 6mOv8rSZaGU= - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2356 - Século XXI - - 244897 - tAyqY0Ve75qMWyJLmqeDZrI= - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2357 - Rock Das Aranhas (Ao Vivo) (Live) - - 231836 - aVb9mkseWGvS71HGiIkFfMPMyA== - 0.9900000000000000000 - 192 - 1 - 1 - 1 - - - 2358 - The Power Of Equality - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 243591 - MRWznAzAPUlQvCuL - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2359 - If You Have To Ask - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 216790 - hf4OGBnBjAvaiwBIxg== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2360 - Breaking The Girl - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 295497 - mUUd47eenOI= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2361 - Funky Monks - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 323395 - o2COiuAOGxbDxsM= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2362 - Suck My Kiss - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 217234 - i/dkqQs7CleJs1RF7aQDM9g= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2363 - I Could Have Lied - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 244506 - 7GWjqmu4ijas/L51PYED - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2364 - Mellowship Slinky In B Major - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 240091 - Dk64OatikorL8A== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2365 - The Righteous & The Wicked - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 248084 - SZw7C+g+TtldX+GLrB/Ujw2YEw== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2366 - Give It Away - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 283010 - 0kIdlrR6nsmJ0xjfe6xBmnDx - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2367 - Blood Sugar Sex Magik - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 271229 - N+6opXAswwwa1g== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2368 - Under The Bridge - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 264359 - hPG3ejkGf6VWbp+FUIpHAg== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2369 - Naked In The Rain - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 265717 - AN06HhzC3IcqnKxp8Q== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2370 - Apache Rose Peacock - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 282226 - g/K2TiYnAHI6G8ua - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2371 - The Greeting Song - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 193593 - l2hYGikqsg== - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2372 - My Lovely Man - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 279118 - PJy0aC/a8g9p0jtlABw= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2373 - Sir Psycho Sexy - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 496692 - mjwg2g+Nox5Tglo= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2374 - They're Red Hot - Robert Johnson - 71941 - HtKCgj4+YEZVAeX3TA5j0Uk= - 0.9900000000000000000 - 193 - 1 - 4 - 1 - - - 2375 - By The Way - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 218017 - NGd71b7dCVCj - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2376 - Universally Speaking - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 259213 - mX1h5dSW1D0= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2377 - This Is The Place - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 257906 - T/0noNU9mFYojQE= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2378 - Dosed - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 312058 - 0tXETfPJSRSkee4= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2379 - Don't Forget Me - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 277995 - 4a3XoAAitg== - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2380 - The Zephyr Song - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 232960 - Jen5kg3HpZclh+DDoVTHqA== - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2381 - Can't Stop - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 269400 - mOHMiylC1Q6Mvidm+A== - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2382 - I Could Die For You - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 193906 - BdbHBOjbMkAsI7HuHZkq+Q== - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2383 - Midnight - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 295810 - 5S8DZ0HqrvymJIOBCH0xLDDa - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2384 - Throw Away Your Television - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 224574 - 2VDfzGpXtajZOiU= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2385 - Cabron - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 218592 - 5JIxQjb17sTsGQdBt6+/ - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2386 - Tear - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 317413 - pYDC7L4+HzwG - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2387 - On Mercury - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 208509 - mRCMQdTCgec= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2388 - Minor Thing - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 217835 - 7tc7+jZBFv8= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2389 - Warm Tape - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 256653 - SJ0UupiRAll3OX6lc/Q70w== - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2390 - Venice Queen - Anthony Kiedis, Flea, John Frusciante, and Chad Smith - 369110 - 3jerREXA0BDRS2qFi6qoPl4= - 0.9900000000000000000 - 194 - 1 - 1 - 1 - - - 2391 - Around The World - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 238837 - aU7ed/o+ew== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2392 - Parallel Universe - Red Hot Chili Peppers - 270654 - SGn5euIAJttj3lR8 - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2393 - Scar Tissue - Red Hot Chili Peppers - 217469 - 3EOqx0aY1OuO1mYUANGEfWc= - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2394 - Otherside - Red Hot Chili Peppers - 255973 - bMn7eGcWVmlp - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2395 - Get On Top - Red Hot Chili Peppers - 198164 - sEfJ6uLxjAs0sLSmpg== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2396 - Californication - Red Hot Chili Peppers - 321671 - uZKTZeEuol77oeiy - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2397 - Easily - Red Hot Chili Peppers - 231418 - ZNyTcd0udTtGDHwyDw== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2398 - Porcelain - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 163787 - eUi2iMYinL7Ug/CHO7xS - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2399 - Emit Remmus - Red Hot Chili Peppers - 240300 - KAIv6ScuoD7XdzEjc4YWMtLoKA== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2400 - I Like Dirt - Red Hot Chili Peppers - 157727 - RRghkGqlBxCAVg== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2401 - This Velvet Glove - Red Hot Chili Peppers - 225280 - uej65HkDJR1KqHexT/F5Sk4= - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2402 - Savior - Anthony Kiedis/Chad Smith/Flea/John Frusciante - 292493 - vbRSlD0GD+Cef4Injw== - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2403 - Purple Stain - Red Hot Chili Peppers - 253440 - gYN3OnmhnC+sy91s - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2404 - Right On Time - Red Hot Chili Peppers - 112613 - ZtKe8Fq4pMI= - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2405 - Road Trippin' - Red Hot Chili Peppers - 205635 - oSWr89WZZKab - 0.9900000000000000000 - 195 - 1 - 1 - 1 - - - 2406 - The Spirit Of Radio - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 299154 - GLkwy3k/0a3PjgiHtg== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2407 - The Trees - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 285126 - OagN/44nbuv73+FSjw== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2408 - Something For Nothing - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 240770 - zAPLBS+5VBM2Bw== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2409 - Freewill - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 324362 - sYkL1DSYGm7auQ== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2410 - Xanadu - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 667428 - jGQYdLUsvlDpJq9L - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2411 - Bastille Day - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 280528 - zMICV/x8JnIF2tydYhfGRw== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2412 - By-Tor And The Snow Dog - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 519888 - 5LTMn3Zm7bsEJ1XlHf4= - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2413 - Anthem - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 264515 - PisIcZXCcV6TuYaJO9Y= - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2414 - Closer To The Heart - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 175412 - FfcJIkL7fkBVXBWc91Q= - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2415 - 2112 Overture - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 272718 - jejc2143DlSxBHJWOeXv3A== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2416 - The Temples Of Syrinx - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 133459 - 5LIRXdv7uwbA6rIVfw== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2417 - La Villa Strangiato - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 577488 - eQnCLJ6tYHgbBg== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2418 - Fly By Night - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 202318 - WB3QpURaZQ== - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2419 - Finding My Way - Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush - 305528 - ZLhFQ3Kx7CDUnk1cPjHe - 0.9900000000000000000 - 196 - 1 - 1 - 1 - - - 2420 - Jingo - M.Babatunde Olantunji - 592953 - THa5US9RbJcKuoPe - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2421 - El Corazon Manda - E.Weiss - 713534 - YXuPTJUbbjTF - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2422 - La Puesta Del Sol - E.Weiss - 628062 - e7GMi9nNqmQmPtdYzaEUUBM= - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2423 - Persuasion - Carlos Santana - 318432 - rji3LQ41cyK9 - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2424 - As The Years Go by - Albert King - 233064 - qRVww4YnPZ+ixZLJX1Y= - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2425 - Soul Sacrifice - Carlos Santana - 296437 - nxMJre04RQghhoyXTqJWGLYQmw== - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2426 - Fried Neckbones And Home Fries - W.Correa - 638563 - EM4U0aZkdK1NueXZYNBvImp10A== - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2427 - Santana Jam - Carlos Santana - 882834 - Yw1OPfmP7/xLrdu5xA== - 0.9900000000000000000 - 197 - 1 - 1 - 1 - - - 2428 - Evil Ways - - 475402 - S9D/NwaIw5i6aKCzN30zNK1B - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2429 - We've Got To Get Together/Jingo - - 1070027 - w1cDf9bXF3V3YaDe - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2430 - Rock Me - - 94720 - FMWEnyMybkcUy1LmnEZYcskX/w== - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2431 - Just Ain't Good Enough - - 850259 - eQFESFAoYO4TSzYaiXWfcQ== - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2432 - Funky Piano - - 934791 - lBF70/evjLGZOZG/A61J - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2433 - The Way You Do To Mer - - 618344 - RLITgDxO+tF/M8g= - 0.9900000000000000000 - 198 - 1 - 1 - 1 - - - 2434 - Holding Back The Years - Mick Hucknall and Neil Moss - 270053 - OFwnpuZ5NQaE - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2435 - Money's Too Tight To Mention - John and William Valentine - 268408 - glG3l7fvzy8Qnex6RQ== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2436 - The Right Thing - Mick Hucknall - 262687 - i/G8RRapU8Pm+Hk8EerZiXg= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2437 - It's Only Love - Jimmy and Vella Cameron - 232594 - G34wwcmllgoCUA== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2438 - A New Flame - Mick Hucknall - 237662 - K6e9F2Ua9L3v - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2439 - You've Got It - Mick Hucknall and Lamont Dozier - 235232 - 23K+a78de97lVYclqV7Gkson - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2440 - If You Don't Know Me By Now - Kenny Gamble and Leon Huff - 206524 - rwunA6C6UbskrM/kzIhTQAtx - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2441 - Stars - Mick Hucknall - 248137 - CocaLBz7nA== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2442 - Something Got Me Started - Mick Hucknall and Fritz McIntyre - 239595 - /V9Q0lDNpkDjNG8d - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2443 - Thrill Me - Mick Hucknall and Fritz McIntyre - 303934 - bWJXMRZwup1WHrsgdB2Pld8= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2444 - Your Mirror - Mick Hucknall - 240666 - CAS0U1vT2n4XJkhvDJxUpZw= - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2445 - For Your Babies - Mick Hucknall - 256992 - w/oGiuFpp0GVsduvFqoE - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2446 - So Beautiful - Mick Hucknall - 298083 - Zxn8GgaDV5dYlA== - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2447 - Angel - Carolyn Franklin and Sonny Saunders - 240561 - 5xIfzM+BatLkhH0jSqwaPiii - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2448 - Fairground - Mick Hucknall - 263888 - D51qYjQ6qIEdP6Nu - 0.9900000000000000000 - 141 - 1 - 1 - 1 - - - 2449 - Água E Fogo - Chico Amaral/Edgard Scandurra/Samuel Rosa - 278987 - TRS/LnXkDC2r2CAk6Q== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2450 - Três Lados - Chico Amaral/Samuel Rosa - 233665 - sW3rRS/08IS3fA== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2451 - Ela Desapareceu - Chico Amaral/Samuel Rosa - 250122 - 6pIm/0yTQRZM1Q== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2452 - Balada Do Amor Inabalável - Fausto Fawcett/Samuel Rosa - 240613 - 7OvIQ5Y6Y8RKPktE - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2453 - Canção Noturna - Chico Amaral/Lelo Zanettik - 238628 - FDH5dHlAyFw= - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2454 - Muçulmano - Leão, Rodrigo F./Samuel Rosa - 249600 - f4tS5i1eRd4OnCB7gP99 - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2455 - Maquinarama - Chico Amaral/Samuel Rosa - 245629 - XrUg8jFxnk0v6xuZzZ0L - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2456 - Rebelião - Chico Amaral/Samuel Rosa - 298527 - 2alsPPCvDAQ= - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2457 - A Última Guerra - Leão, Rodrigo F./Lô Borges/Samuel Rosa - 314723 - azCuJHuTMXuIGg== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2458 - Fica - Chico Amaral/Samuel Rosa - 272169 - p2oSDuwFtkJD - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2459 - Ali - Nando Reis/Samuel Rosa - 306390 - EXGRE6HXk0H6r6gbc8VA7w== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2460 - Preto Damião - Chico Amaral/Samuel Rosa - 264568 - s1fpHkSCgGVvl11Q6w== - 0.9900000000000000000 - 199 - 1 - 1 - 1 - - - 2461 - É Uma Partida De Futebol - Samuel Rosa - 1071 - ysHTWr8dENq8njqNa+KM9kzN/A== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2462 - Eu Disse A Ela - Samuel Rosa - 254223 - A+tajczuEa4yQDXxD7beWg== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2463 - Zé Trindade - Samuel Rosa - 247954 - a4HSGNmaSuS3F53ZeEqQUw8= - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2464 - Garota Nacional - Samuel Rosa - 317492 - 32ZGjdALYqd8aEl+tQM= - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2465 - Tão Seu - Samuel Rosa - 243748 - VuBLKcIqUBCpFddz1Q== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2466 - Sem Terra - Samuel Rosa - 279353 - 9aWd/8D/9Fnesca2MR7img== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2467 - Os Exilados - Samuel Rosa - 245551 - YZqnIWpEKU3Ljladd/iYje4= - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2468 - Um Dia Qualquer - Samuel Rosa - 292414 - wqt/9AQ9/QGaYwz5MS0O3A== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2469 - Los Pretos - Samuel Rosa - 239229 - 2S2YimF0svVwnbxnuC4pQpg= - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2470 - Sul Da América - Samuel Rosa - 254928 - 77lslWokaKnGQNE= - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2471 - Poconé - Samuel Rosa - 318406 - KI6ag79fVvthN8z/k59BmuI04w== - 0.9900000000000000000 - 200 - 1 - 1 - 1 - - - 2472 - Lucky 13 - Billy Corgan - 189387 - mQ4fIwhDw3MhuK1x - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2473 - Aeroplane Flies High - Billy Corgan - 473391 - E3UtzTVvyeycvrft - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2474 - Because You Are - Billy Corgan - 226403 - AsvjzseRXRvDGg== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2475 - Slow Dawn - Billy Corgan - 192339 - d3p7nOLaqYpa3H8pEw== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2476 - Believe - James Iha - 192940 - rcUZyf1QZw== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2477 - My Mistake - Billy Corgan - 240901 - m0H4kFPxGxQ= - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2478 - Marquis In Spades - Billy Corgan - 192731 - UFu+VrrzLQrCFS2SkYKhzwEZzA== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2479 - Here's To The Atom Bomb - Billy Corgan - 266893 - UcXJB0DeOqRR - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2480 - Sparrow - Billy Corgan - 176822 - t25G1C7OVQ== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2481 - Waiting - Billy Corgan - 228336 - 8tHsvzs7OqMKvlfAUddP0baKkQ== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2482 - Saturnine - Billy Corgan - 229877 - Fdy5ibg6Xb9LvA== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2483 - Rock On - David Cook - 366471 - 0nqKJ/pWkQ== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2484 - Set The Ray To Jerry - Billy Corgan - 249364 - js2d1HxMkTXgH3QdpA== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2485 - Winterlong - Billy Corgan - 299389 - nmEWGGMHAN57V01qhEXGsA== - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2486 - Soot & Stars - Billy Corgan - 399986 - eyQAA+h4Bz08 - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2487 - Blissed & Gone - Billy Corgan - 286302 - BXyf15+vlds= - 0.9900000000000000000 - 201 - 1 - 4 - 1 - - - 2488 - Siva - Billy Corgan - 261172 - EOLyioqwUkWGEshLbzDL+fmk - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2489 - Rhinocerous - Billy Corgan - 353462 - tukO2yfg+2HbgK4= - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2490 - Drown - Billy Corgan - 270497 - 7mqdn3GImXZTljI= - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2491 - Cherub Rock - Billy Corgan - 299389 - K3PblUzU3aULXA== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2492 - Today - Billy Corgan - 202213 - PwIHyqqOTnbE2Fc= - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2493 - Disarm - Billy Corgan - 198556 - 4NGRWXBfLQ== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2494 - Landslide - Stevie Nicks - 190275 - ILeNsLQEZRUH - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2495 - Bullet With Butterfly Wings - Billy Corgan - 257306 - CK6RRF6car7v5w== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2496 - 1979 - Billy Corgan - 263653 - H26o05n6xLt7bA== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2497 - Zero - Billy Corgan - 161123 - 3XYFiHVXFqYp - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2498 - Tonight, Tonight - Billy Corgan - 255686 - byHPqEibc/TvsnBG4QBI5A== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2499 - Eye - Billy Corgan - 294530 - GgmhWYw2wtAbP9YnE6dJvco= - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2500 - Ava Adore - Billy Corgan - 261433 - TdkqUV9Rxou51ZeUBA== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2501 - Perfect - Billy Corgan - 203023 - kXr7nIjf4+oN2Cxc - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2502 - The Everlasting Gaze - Billy Corgan - 242155 - zdsKJogXUfsLssmqT5MA - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2503 - Stand Inside Your Love - Billy Corgan - 253753 - 7DmGO5eWmaysNerLYstSJAK0+Q== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2504 - Real Love - Billy Corgan - 250697 - rq8OfbNEhccy8g== - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2505 - (Untitled) - Billy Corgan - 231784 - TONtIZ6mIQU2Ql56Uyw= - 0.9900000000000000000 - 202 - 1 - 4 - 1 - - - 2506 - Nothing To Say - Chris Cornell/Kim Thayil - 238027 - mD9gpKebmU/OPSoJhw== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2507 - Flower - Chris Cornell/Kim Thayil - 208822 - ENF5uvye5w== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2508 - Loud Love - Chris Cornell - 297456 - qrN+4a7CbVA1 - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2509 - Hands All Over - Chris Cornell/Kim Thayil - 362475 - UC2rRmeNSp2zk5/jc5yZsg== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2510 - Get On The Snake - Chris Cornell/Kim Thayil - 225123 - cOS/Vo6do5WsJsXs1g== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2511 - Jesus Christ Pose - Ben Shepherd/Chris Cornell/Kim Thayil/Matt Cameron - 352966 - fQhvuFqnymnsb1/qVFXGP+FI - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2512 - Outshined - Chris Cornell - 312476 - nPxrdWXCkAewuw== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2513 - Rusty Cage - Chris Cornell - 267728 - hLDcsiHbBOQ/ClwH+FD2 - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2514 - Spoonman - Chris Cornell - 248476 - SU3ObEV98DrlEpIJ9smfGQ== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2515 - The Day I Tried To Live - Chris Cornell - 321175 - heuvDqE06jv9CfFA9XIlbx5G - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2516 - Black Hole Sun - Soundgarden - 320365 - 4U4hB8CizA== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2517 - Fell On Black Days - Chris Cornell - 282331 - SPvtdWpCWA== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2518 - Pretty Noose - Chris Cornell - 253570 - ZUaVpxnkMUg= - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2519 - Burden In My Hand - Chris Cornell - 292153 - /vrvoG2a2A== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2520 - Blow Up The Outside World - Chris Cornell - 347898 - 5TdgZOPvbA== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2521 - Ty Cobb - Ben Shepherd/Chris Cornell - 188786 - JaFAD5SG/Z3/wCiIn6D9HdiTwQ== - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2522 - Bleed Together - Chris Cornell - 232202 - 3W7bYBXyhQr3DoFXKdL0QvE4 - 0.9900000000000000000 - 203 - 1 - 1 - 1 - - - 2523 - Morning Dance - Jay Beckenstein - 238759 - ePxRoK1xT+NFOkOLUC7E97Y= - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2524 - Jubilee - Jeremy Wall - 275147 - 3/qiAfKl8D7RX8yruyyfsw== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2525 - Rasul - Jeremy Wall - 238315 - q4vOLe/GDj/QtIIwKWTbPnsRPg== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2526 - Song For Lorraine - Jay Beckenstein - 240091 - dgqsr26g7xeafhbrneUZaw== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2527 - Starburst - Jeremy Wall - 291500 - me80k8Ii8G0Op/vxbD8aYQ== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2528 - Heliopolis - Jay Beckenstein - 338729 - 0qHfHr9O1velUZ2Wk0RL - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2529 - It Doesn't Matter - Chet Catallo - 270027 - VuIiCqq06A== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2530 - Little Linda - Jeremy Wall - 264019 - QWD49CUtP/yKJw== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2531 - End Of Romanticism - Rick Strauss - 320078 - eIvJ2qBdnA== - 0.9900000000000000000 - 204 - 1 - 2 - 1 - - - 2532 - The House Is Rockin' - Doyle Bramhall/Stevie Ray Vaughan - 144352 - 0FLWe2OvgRVd+FfLHbg= - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2533 - Crossfire - B. Carter/C. Layton/R. Ellsworth/R. Wynans/T. Shannon - 251219 - 3F5W4tF4EqEMazHT5I0= - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2534 - Tightrope - Doyle Bramhall/Stevie Ray Vaughan - 281155 - gawNmBdoauWURKQX - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2535 - Let Me Love You Baby - Willie Dixon - 164127 - BDNc9b9m7HtK - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2536 - Leave My Girl Alone - B. Guy - 256365 - yqS+scoPMtyciFR3qg== - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2537 - Travis Walk - Stevie Ray Vaughan - 140826 - haG8cXnBnS1hMJ3ZDzsUfaCNNg== - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2538 - Wall Of Denial - Doyle Bramhall/Stevie Ray Vaughan - 336927 - QvNZt6DVYmgHjo2NiJ5wHqp7 - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2539 - Scratch-N-Sniff - Doyle Bramhall/Stevie Ray Vaughan - 163422 - id6dQ40U8f/3xx/nx0B6e5FH - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2540 - Love Me Darlin' - C. Burnett - 201586 - 0aNfNCXSog9Rccv20iWLrVKlsA== - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2541 - Riviera Paradise - Stevie Ray Vaughan - 528692 - oq/Wa6Dop8VMDiPe1qWqXio= - 0.9900000000000000000 - 205 - 1 - 6 - 1 - - - 2542 - Dead And Bloated - R. DeLeo/Weiland - 310386 - d3HrBKCOK9FMwjyTJ9Xge2Ih - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2543 - Sex Type Thing - D. DeLeo/Kretz/Weiland - 218723 - 85M9KtzDQk7sHy17LII= - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2544 - Wicked Garden - D. DeLeo/R. DeLeo/Weiland - 245368 - LT/gng9HP8+c5Ym45k39Wg== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2545 - No Memory - Dean Deleo - 80613 - iJA2FjpGDkFdQD6yHkY= - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2546 - Sin - R. DeLeo/Weiland - 364800 - EX6noZvDEoW0xKBFUwpcAA== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2547 - Naked Sunday - D. DeLeo/Kretz/R. DeLeo/Weiland - 229720 - xOnznEyS8vnS - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2548 - Creep - R. DeLeo/Weiland - 333191 - sgcAHH2eeadnpQ== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2549 - Piece Of Pie - R. DeLeo/Weiland - 324623 - v391CoJSmgC6Ng== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2550 - Plush - R. DeLeo/Weiland - 314017 - P0/tNVNzxA== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2551 - Wet My Bed - R. DeLeo/Weiland - 96914 - tKfIZmB+s6cjp9pj9A== - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2552 - Crackerman - Kretz/R. DeLeo/Weiland - 194403 - kgVpfZHJQFg= - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2553 - Where The River Goes - D. DeLeo/Kretz/Weiland - 505991 - FyawyLEvSEs= - 0.9900000000000000000 - 206 - 1 - 1 - 1 - - - 2554 - Soldier Side - Intro - Dolmayan, John/Malakian, Daron/Odadjian, Shavo - 63764 - 4nvwtPYYFIzPqndZ4NMM5Lzo - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2555 - B.Y.O.B. - Tankian, Serj - 255555 - 1eL7rFuusT+vtQJ42ls= - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2556 - Revenga - Tankian, Serj - 228127 - gHhq3g5QaAT6leE= - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2557 - Cigaro - Tankian, Serj - 131787 - N1Ok5PRGfHUj58+UBUXZZdbN - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2558 - Radio/Video - Dolmayan, John/Malakian, Daron/Odadjian, Shavo - 249312 - nP0LUpR53tl6bN0A - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2559 - This Cocaine Makes Me Feel Like I'm On This Song - Tankian, Serj - 128339 - eg556wvRDTFe5rCYqdXYyHcD - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2560 - Violent Pornography - Dolmayan, John/Malakian, Daron/Odadjian, Shavo - 211435 - LWNFoisBEGo= - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2561 - Question! - Tankian, Serj - 200698 - bQEIRua4GvbL7Vk= - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2562 - Sad Statue - Tankian, Serj - 205897 - vwE9F1u56qQFEQJpr9Oz - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2563 - Old School Hollywood - Dolmayan, John/Malakian, Daron/Odadjian, Shavo - 176953 - bE7q+2f3xFzdarE= - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2564 - Lost in Hollywood - Tankian, Serj - 320783 - uuL9iqkpbWIIi9BHJcUR - 0.9900000000000000000 - 207 - 1 - 3 - 1 - - - 2565 - The Sun Road - Terry Bozzio, Steve Stevens, Tony Levin - 880640 - /5+WEwTmig== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2566 - Dark Corners - Terry Bozzio, Steve Stevens, Tony Levin - 513541 - Al6cyDzhOfAI+A== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2567 - Duende - Terry Bozzio, Steve Stevens, Tony Levin - 447582 - IxN4v4ZlUSzgfqPVoQ== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2568 - Black Light Syndrome - Terry Bozzio, Steve Stevens, Tony Levin - 526471 - aF091J7t1Fc= - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2569 - Falling in Circles - Terry Bozzio, Steve Stevens, Tony Levin - 549093 - iEuMpSUmUd8+LdztSIbgEK6yug== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2570 - Book of Hours - Terry Bozzio, Steve Stevens, Tony Levin - 583366 - /16I++LUg/scagsUy5Pwcw== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2571 - Chaos-Control - Terry Bozzio, Steve Stevens, Tony Levin - 529841 - vywFjp5kqMX4H9Zdww== - 0.9900000000000000000 - 208 - 1 - 1 - 1 - - - 2572 - Midnight From The Inside Out - Chris Robinson/Rich Robinson - 286981 - OhqtgCnCkcNQolXD - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2573 - Sting Me - Chris Robinson/Rich Robinson - 268094 - IscitJZsF+6GtBpg+eA16rStng== - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2574 - Thick & Thin - Chris Robinson/Rich Robinson - 222720 - etD6HRLGsWf83GI425CF/tVrQA== - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2575 - Greasy Grass River - Chris Robinson/Rich Robinson - 218749 - rAC0ZZMgMOFc2Q== - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2576 - Sometimes Salvation - Chris Robinson/Rich Robinson - 389146 - 9bdqWlHMBaHPuq/yqVHhhGk= - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2577 - Cursed Diamonds - Chris Robinson/Rich Robinson - 368300 - NxRJba2seg== - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2578 - Miracle To Me - Chris Robinson/Rich Robinson - 372636 - lIryltALI0Bt - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2579 - Wiser Time - Chris Robinson/Rich Robinson - 459990 - cTU0MdDJcDb9DgoU - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2580 - Girl From A Pawnshop - Chris Robinson/Rich Robinson - 404688 - m8aGJMRShwq94DU4 - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2581 - Cosmic Fiend - Chris Robinson/Rich Robinson - 308401 - rznqo89p5GATMyYFRH/9dq9sEQ== - 0.9900000000000000000 - 209 - 1 - 6 - 1 - - - 2582 - Black Moon Creeping - Chris Robinson/Rich Robinson - 359314 - 2FbPSeZe7eV2tFX/+VU= - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2583 - High Head Blues - Chris Robinson/Rich Robinson - 371879 - NkxaPqAvUIiSXx+A04o= - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2584 - Title Song - Chris Robinson/Rich Robinson - 505521 - DnQjt6JYaaC8cHv/6V/eJww= - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2585 - She Talks To Angels - Chris Robinson/Rich Robinson - 361978 - ZMYqVS1wUYfNPenH3hpa - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2586 - Twice As Hard - Chris Robinson/Rich Robinson - 275565 - peDbQbPBzaud - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2587 - Lickin' - Chris Robinson/Rich Robinson - 314409 - JTBnKbQ4EpFuw2m4Rw== - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2588 - Soul Singing - Chris Robinson/Rich Robinson - 233639 - ZhqKLLb0kWGkBrn9S8s7ovl/tw== - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2589 - Hard To Handle - A.Isbell/A.Jones/O.Redding - 206994 - SyAgpImxtUyrlnnsmSja - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2590 - Remedy - Chris Robinson/Rich Robinson - 337084 - NqD0qTzDjA== - 0.9900000000000000000 - 210 - 1 - 6 - 1 - - - 2591 - White Riot - Joe Strummer/Mick Jones - 118726 - cLbsRlbLyukB6A== - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2592 - Remote Control - Joe Strummer/Mick Jones - 180297 - RvrmowU+RbUNjA== - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2593 - Complete Control - Joe Strummer/Mick Jones - 192653 - YyLwomtYiw4iiJS+ - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2594 - Clash City Rockers - Joe Strummer/Mick Jones - 227500 - 0sRu9uDMkOuxwZSe - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2595 - (White Man) In Hammersmith Palais - Joe Strummer/Mick Jones - 240640 - /e5q9w1+1KNSyVa0X3Fe8g== - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2596 - Tommy Gun - Joe Strummer/Mick Jones - 195526 - 37E7sdBB0E7VQfzg - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2597 - English Civil War - Mick Jones/Traditional arr. Joe Strummer - 156708 - YVsDG1ucpCp6FemQ - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2598 - I Fought The Law - Sonny Curtis - 159764 - +hhCgFox+Ori42OeLK2ZqDc= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2599 - London Calling - Joe Strummer/Mick Jones - 199706 - 2MKgaPqwRBXCTptkm1Eh - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2600 - Train In Vain - Joe Strummer/Mick Jones - 189675 - RrgMVebL6Mc= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2601 - Bankrobber - Joe Strummer/Mick Jones - 272431 - eJ98L+4KgULYEQ== - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2602 - The Call Up - The Clash - 324336 - 35EdkTtEbg== - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2603 - Hitsville UK - The Clash - 261433 - T31HEn3bZuGb4lcN2tjpgRE= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2604 - The Magnificent Seven - The Clash - 268486 - 5tNEGSLDP1JxtJo= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2605 - This Is Radio Clash - The Clash - 249756 - GaFcPngBMYz+U4go5l8= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2606 - Know Your Rights - The Clash - 217678 - A/MGqJx/c16aZTVag9Iq - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2607 - Rock The Casbah - The Clash - 222145 - sUcgyLawm2DnUITJkksc - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2608 - Should I Stay Or Should I Go - The Clash - 187219 - wkI8X2sM/fumQ8HZQ6atutM= - 0.9900000000000000000 - 211 - 1 - 4 - 1 - - - 2609 - War (The Process) - Billy Duffy/Ian Astbury - 252630 - 1uDFl8pTV6bBTPs= - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2610 - The Saint - Billy Duffy/Ian Astbury - 216215 - y09JAZhAlsv+pQ== - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2611 - Rise - Billy Duffy/Ian Astbury - 219088 - JCFz7sIdQKLK9qh1O20reOgHxQ== - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2612 - Take The Power - Billy Duffy/Ian Astbury - 235755 - sQD9d3KQQQ== - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2613 - Breathe - Billy Duffy/Ian Astbury/Marti Frederiksen/Mick Jones - 299781 - bCMH6zCWoXVXZJWI - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2614 - Nico - Billy Duffy/Ian Astbury - 289488 - qjGyItoNk23IrcQ5Wpgk - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2615 - American Gothic - Billy Duffy/Ian Astbury - 236878 - +3wy2zI1pu4= - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2616 - Ashes And Ghosts - Billy Duffy/Bob Rock/Ian Astbury - 300591 - RKTMtSGEcjzKB85KVJiC - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2617 - Shape The Sky - Billy Duffy/Ian Astbury - 209789 - oaR1Q7LW/n1RW+di - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2618 - Speed Of Light - Billy Duffy/Bob Rock/Ian Astbury - 262817 - TnSKxGaVace4pyhR/ZCR - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2619 - True Believers - Billy Duffy/Ian Astbury - 308009 - 2abjryyQkTGqCm2mTw== - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2620 - My Bridges Burn - Billy Duffy/Ian Astbury - 231862 - xZ0PjnuSRIbuAhnn6fxM - 0.9900000000000000000 - 212 - 1 - 1 - 1 - - - 2621 - She Sells Sanctuary - - 253727 - tUZsJ3i0A7KAvQ== - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2622 - Fire Woman - - 312790 - WBlcKMJ4VOKLQW4U/g== - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2623 - Lil' Evil - - 165825 - UrjhlkWnleS4VSc6J+sQmVwNvg== - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2624 - Spirit Walker - - 230060 - 622S2lZvlBrAsEY= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2625 - The Witch - - 258768 - bRYl/CIbOxU= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2626 - Revolution - - 256026 - dGAGAIhQadHy5Q== - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2627 - Wild Hearted Son - - 266893 - Vk4l5CYGQNYTeiMIDvXMEMUU - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2628 - Love Removal Machine - - 257619 - QNKoY3cNi9nNHitIzsrl3B4= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2629 - Rain - - 236669 - QdUb22QC0lBY - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2630 - Edie (Ciao Baby) - - 241632 - C7s/o717pI6t - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2631 - Heart Of Soul - - 274207 - rtebLXO35zFVPSkZrh8= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2632 - Love - - 326739 - PltlbaaQJ7STzRE= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2633 - Wild Flower - - 215536 - h4tSJlcuM0M= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2634 - Go West - - 238158 - Ou1nrRqh+hrO - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2635 - Resurrection Joe - - 255451 - DR8ffyA+IAdbhyIHX2LY - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2636 - Sun King - - 368431 - pgIW0ep73BsDbf7Ai+8smcTaAw== - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2637 - Sweet Soul Sister - - 212009 - aAwy5zYn17tGM40= - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2638 - Earth Mofo - - 282200 - 1Lr7+AP9CJJD - 0.9900000000000000000 - 213 - 1 - 1 - 1 - - - 2639 - Break on Through - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 149342 - e7JAX3xrWolD - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2640 - Soul Kitchen - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 215066 - Xhn3mdAvm8OjINTQ3/js0PQ0lg== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2641 - The Crystal Ship - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 154853 - 0nF8ZJB/ptaq - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2642 - Twentienth Century Fox - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 153913 - Yb3vCaa7w2En1GFE7yIvq9NHcw== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2643 - Alabama Song - Weill-Brecht - 200097 - dybzfLLtnZMJUInFGDe/Fw== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2644 - Light My Fire - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 428329 - 1lIxDZIMwWWOgVk05KteYv/0Og== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2645 - Back Door Man - Willie Dixon, C. Burnett - 214360 - cle4HS9Y10s= - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2646 - I Looked At You - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 142080 - K7hiF8r99UKe5BoxFg== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2647 - End Of The Night - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 172695 - bENeJKQqYhlChU1uf5k= - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2648 - Take It As It Comes - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 137168 - 3To0dsliyfYdGq4= - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2649 - The End - Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison - 701831 - IGAPH5hbMw== - 0.9900000000000000000 - 214 - 1 - 1 - 1 - - - 2650 - Roxanne - G M Sumner - 192992 - 2tE0MiA6EXXdyVx+XC7BquW6 - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2651 - Can't Stand Losing You - G M Sumner - 181159 - wKJMQQr2wUG5M2W0EktMOAw= - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2652 - Message in a Bottle - G M Sumner - 291474 - AlWOUVQZU70wDPGfZA== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2653 - Walking on the Moon - G M Sumner - 302080 - 3Q5yqo6QKQ== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2654 - Don't Stand so Close to Me - G M Sumner - 241031 - X/hYQXcUSjIP9rSk4mW+b04z7Q== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2655 - De Do Do Do, De Da Da Da - G M Sumner - 247196 - xbRQGc4r1gTZoqo= - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2656 - Every Little Thing She Does is Magic - G M Sumner - 261120 - 3Mb2lvgSoT4= - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2657 - Invisible Sun - G M Sumner - 225593 - /v376sBXeE8DW1o= - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2658 - Spirit's in the Material World - G M Sumner - 181133 - 3XaqqD5yTD1GWW1LOMccbih3 - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2659 - Every Breath You Take - G M Sumner - 254615 - ka7Yx7dVLw== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2660 - King Of Pain - G M Sumner - 300512 - 1F601kZP2f5QSw== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2661 - Wrapped Around Your Finger - G M Sumner - 315454 - uZ9VAS2lj6+x+ToJJosfyfQ= - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2662 - Don't Stand So Close to Me '86 - G M Sumner - 293590 - rvNTD2R335GDJvtfyMsjOw== - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2663 - Message in a Bottle (new classic rock mix) - G M Sumner - 290951 - nDytqyInpX0V - 0.9900000000000000000 - 215 - 1 - 1 - 1 - - - 2664 - Time Is On My Side - Jerry Ragavoy - 179983 - VI5KJ4bk+qJXmqo73SGbIQ== - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2665 - Heart Of Stone - Jagger/Richards - 164493 - s1Iwb+brzoOMRw== - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2666 - Play With Fire - Nanker Phelge - 132022 - i8yukk/eiwI4/3V6zinLoBJgXw== - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2667 - Satisfaction - Jagger/Richards - 226612 - EAC+8SrkKm6je6P6naEWiw== - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2668 - As Tears Go By - Jagger/Richards/Oldham - 164284 - GOz/lpjpaT7XYUUa - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2669 - Get Off Of My Cloud - Jagger/Richards - 176013 - uyMsu0iLDrxnarMdX71ce90= - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2670 - Mother's Little Helper - Jagger/Richards - 167549 - Ez+0+nNg9XcXVLNTg+RT - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2671 - 19th Nervous Breakdown - Jagger/Richards - 237923 - v4DN4ViKfTCxgks= - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2672 - Paint It Black - Jagger/Richards - 226063 - OSsNw/kzMto= - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2673 - Under My Thumb - Jagger/Richards - 221387 - wa/MxtFzuQgU587JB/0= - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2674 - Ruby Tuesday - Jagger/Richards - 197459 - rfzViMKESfEVfD7rR/BZ - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2675 - Let's Spend The Night Together - Jagger/Richards - 217495 - snjB/dEBG4YX - 0.9900000000000000000 - 216 - 1 - 1 - 1 - - - 2676 - Intro - Jagger/Richards - 49737 - J5ybfK8xLTEV/V6q - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2677 - You Got Me Rocking - Jagger/Richards - 205766 - Eni9t0mThw== - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2678 - Gimmie Shelters - Jagger/Richards - 382119 - GLqXHFFFAAqs4E5x/1ysVpjM - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2679 - Flip The Switch - Jagger/Richards - 252421 - vhXbW/AIYK+FE0rR - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2680 - Memory Motel - Jagger/Richards - 365844 - j1AO4gNgXewt - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2681 - Corinna - Jesse Ed Davis III/Taj Mahal - 257488 - aBwPORi1zGcefYfJ - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2682 - Saint Of Me - Jagger/Richards - 325694 - PV6nFPCWevZiD1vhrk7K - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2683 - Wainting On A Friend - Jagger/Richards - 302497 - OG4gkO1yP+DOR/k= - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2684 - Sister Morphine - Faithfull/Jagger/Richards - 376215 - rCtUbMXy0YNbS20= - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2685 - Live With Me - Jagger/Richards - 234893 - sjAGDbRXaWcBE+YOZjg= - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2686 - Respectable - Jagger/Richards - 215693 - yh/GRamcwUo3u+8bu3xH9+wB - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2687 - Thief In The Night - De Beauport/Jagger/Richards - 337266 - 3rxsMix33ZG3mERGBY2DBmOV - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2688 - The Last Time - Jagger/Richards - 287294 - w7jx5s9RxDs= - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2689 - Out Of Control - Jagger/Richards - 479242 - 6roc+gybWg== - 0.9900000000000000000 - 217 - 1 - 1 - 1 - - - 2690 - Love Is Strong - Jagger/Richards - 230896 - Xu2ZzssKCbHydemOOHbjYeY9 - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2691 - You Got Me Rocking - Jagger/Richards - 215928 - 7Nad4Gg7L6f8 - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2692 - Sparks Will Fly - Jagger/Richards - 196466 - SjppMtCndfw3+K3nNQ== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2693 - The Worst - Jagger/Richards - 144613 - 3NqsdXTWuhPOiW3cwQ0x - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2694 - New Faces - Jagger/Richards - 172146 - m2MMNKc7f1xozm5lrkVkBaDABA== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2695 - Moon Is Up - Jagger/Richards - 222119 - jroyJsI2a+DE8+Y= - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2696 - Out Of Tears - Jagger/Richards - 327418 - yqRdSdoANKE= - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2697 - I Go Wild - Jagger/Richards - 264019 - UAymaFRliSRoPAEJowThMeY= - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2698 - Brand New Car - Jagger/Richards - 256052 - cc+fl3XoBpoK6Boqn4tjMg== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2699 - Sweethearts Together - Jagger/Richards - 285492 - roy9bdHiu1u35V4moHsY9I7D - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2700 - Suck On The Jugular - Jagger/Richards - 268225 - u7mXvWG5W6AKPpx1pnHGMqQ= - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2701 - Blinded By Rainbows - Jagger/Richards - 273946 - BaDs5Dy+A6d0aWwBNhHI - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2702 - Baby Break It Down - Jagger/Richards - 249417 - d4QXzlyzdUGxHQ== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2703 - Thru And Thru - Jagger/Richards - 375092 - b7i12Ulzy4gi5Q== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2704 - Mean Disposition - Jagger/Richards - 249155 - fNm6ukXxNA== - 0.9900000000000000000 - 218 - 1 - 1 - 1 - - - 2705 - Walking Wounded - The Tea Party - 277968 - CIqsFPlBG9bMUSqq - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2706 - Temptation - The Tea Party - 205087 - H6KT7r6PIw== - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2707 - The Messenger - Daniel Lanois - 212062 - aomlrKAHPhShbYQNqBSQw6S7mA== - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2708 - Psychopomp - The Tea Party - 315559 - nf42+DqjXTYn - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2709 - Sister Awake - The Tea Party - 343875 - h2ERep0BBmg= - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2710 - The Bazaar - The Tea Party - 222458 - Od3BK+SlnYoKEdBKAvc= - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2711 - Save Me (Remix) - The Tea Party - 396303 - 8GtSrXH8qQfs1eYi+y52j7w7 - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2712 - Fire In The Head - The Tea Party - 306337 - Xk/c01JSnA== - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2713 - Release - The Tea Party - 244114 - UyRXgYRpG4oyrln2XY/V - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2714 - Heaven Coming Down - The Tea Party - 241867 - Vf2DolyTgRMOoJmmE5gAWtXiVg== - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2715 - The River (Remix) - The Tea Party - 343170 - lVNiuN+jROFjRATO - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2716 - Babylon - The Tea Party - 169795 - B31Uz/q9wKJDc+PQ - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2717 - Waiting On A Sign - The Tea Party - 261903 - dpqu/iF6OfI= - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2718 - Life Line - The Tea Party - 277786 - ApvKwrhOoLA= - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2719 - Paint It Black - Keith Richards/Mick Jagger - 214752 - nMotDBqri9o= - 0.9900000000000000000 - 219 - 1 - 4 - 1 - - - 2720 - Temptation - The Tea Party - 205244 - lkBS4H7nai2qMw== - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2721 - Army Ants - The Tea Party - 215405 - I4qVhsd7uAQ4BHEC - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2722 - Psychopomp - The Tea Party - 317231 - qEcGR2l/AnM= - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2723 - Gyroscope - The Tea Party - 177711 - VaOx7CEd4leLo21LpxE1pkSe - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2724 - Alarum - The Tea Party - 298187 - hqIgJD6/NzfhIsM= - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2725 - Release - The Tea Party - 266292 - MPHcNfLV21mbIuB5zZRHATXQoQ== - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2726 - Transmission - The Tea Party - 317257 - 4Q/spDR+ci3q5gA0x3g8Wg== - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2727 - Babylon - The Tea Party - 292466 - 3EPRaUVYY8KmV6p4NQEQgZ4= - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2728 - Pulse - The Tea Party - 250253 - IQQ4AHRirW+0IauxVFjsN1iN - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2729 - Emerald - The Tea Party - 289750 - upu2iOKOJsi1tOQ= - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2730 - Aftermath - The Tea Party - 343745 - sygvGlaS3M5vvNajQhb0A1GL - 0.9900000000000000000 - 220 - 1 - 4 - 1 - - - 2731 - I Can't Explain - Pete Townshend - 125152 - qIKw461qe1VxTZn3utA= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2732 - Anyway, Anyhow, Anywhere - Pete Townshend, Roger Daltrey - 161253 - 94glPZWkfL5h/sUTRsuZI3c= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2733 - My Generation - John Entwistle/Pete Townshend - 197825 - tjxtA0WBr9s8aoHVxBvSEB4= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2734 - Substitute - Pete Townshend - 228022 - 3RT2WizDT+XoVzSK1yoi - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2735 - I'm A Boy - Pete Townshend - 157126 - BJTE9EOkjbpnET2LOapANqwuRQ== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2736 - Boris The Spider - John Entwistle - 149472 - M1sQqbNfmVimspJXs/YXPksq - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2737 - Happy Jack - Pete Townshend - 132310 - OYY78hqGw6s+Fv7dqeS/mqg= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2738 - Pictures Of Lily - Pete Townshend - 164414 - G0DkCzUTtH4= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2739 - I Can See For Miles - Pete Townshend - 262791 - 2EKSAuqCBgzc9w== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2740 - Magic Bus - Pete Townshend - 197224 - 9SLvs1tCqNU= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2741 - Pinball Wizard - John Entwistle/Pete Townshend - 181890 - cvNcb7ow6Q== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2742 - The Seeker - Pete Townshend - 204643 - LlEnPpug62irFBNaow== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2743 - Baba O'Riley - John Entwistle/Pete Townshend - 309472 - 4qI+jvhQMK/ya98= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2744 - Won't Get Fooled Again (Full Length Version) - John Entwistle/Pete Townshend - 513750 - c+TmIke6mcLdis8qWoIESq8= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2745 - Let's See Action - Pete Townshend - 243513 - lHpFmhC5MA== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2746 - 5.15 - Pete Townshend - 289619 - N5gSfl68XgU= - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2747 - Join Together - Pete Townshend - 262556 - B4KIzFnB4PpY0hM0dUzlAA== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2748 - Squeeze Box - Pete Townshend - 161280 - 12VQ2NMs8huDAK9eLBPMVA== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2749 - Who Are You (Single Edit Version) - John Entwistle/Pete Townshend - 299232 - /MgmYTq4ZZ+4 - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2750 - You Better You Bet - Pete Townshend - 338520 - HPfBSyx+mQ== - 0.9900000000000000000 - 221 - 1 - 1 - 1 - - - 2751 - Primavera - Genival Cassiano/Silvio Rochael - 126615 - +bVUNFWWsdbBMJwrv0ffHw== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2752 - Chocolate - Tim Maia - 194690 - HdljnKzrORpF1SPBtIPgkg== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2753 - Azul Da Cor Do Mar - Tim Maia - 197955 - 0p4CyHKPr2T3NAONKNQXofwPpA== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2754 - O Descobridor Dos Sete Mares - Gilson Mendonça/Michel - 262974 - SE3KGhkPwY0UDK27mZA= - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2755 - Até Que Enfim Encontrei Você - Tim Maia - 105064 - QR2Hq0mzN7S2NQ== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2756 - Coroné Antonio Bento - Do Vale, João/Luiz Wanderley - 131317 - HQALH7hzPFvmhdTnrmLOIlDrhg== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2757 - New Love - Tim Maia - 237897 - 85df1oR1ZFqDEJgT5YzywIH1VA== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2758 - Não Vou Ficar - Tim Maia - 172068 - fz2p8Gw22Eh7kefJL+2ZhaE= - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2759 - Música No Ar - Tim Maia - 158511 - m0MP4djW7MA= - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2760 - Salve Nossa Senhora - Carlos Imperial/Edardo Araújo - 115461 - IXAOoFuXTci27m9qTpwb3/E= - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2761 - Você Fugiu - Genival Cassiano - 238367 - z+T382wfTFkQ - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2762 - Cristina Nº 2 - Carlos Imperial/Tim Maia - 90148 - nWXTA6w0tths - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2763 - Compadre - Tim Maia - 171389 - jDLiJOOXMctMpvQC5qwc - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2764 - Over Again - Tim Maia - 200489 - CS0D7lMBhg== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2765 - Réu Confesso - Tim Maia - 217391 - K1Eba70Z5UNyAZ2dAdIQ1e2BDQ== - 0.9900000000000000000 - 222 - 1 - 7 - 1 - - - 2766 - O Que Me Importa - - 153155 - Npp+JufQKog= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2767 - Gostava Tanto De Você - - 253805 - fZyKq7/5kXzGDTLAsI8= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2768 - Você - - 242599 - D3/aNx0uAdLzHOyQ - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2769 - Não Quero Dinheiro - - 152607 - 9ITt711u9WQS8ULZflgn - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2770 - Eu Amo Você - - 242782 - 2qmFC5gWZ/bza6Z8 - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2771 - A Festa Do Santo Reis - - 159791 - lo/Sab+HQR9DY0Kagf2Ol12e1Q== - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2772 - I Don't Know What To Do With Myself - - 221387 - XRlyZ4U53R33+/HIeJl7YQ== - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2773 - Padre Cícero - - 139598 - cL/R5VSWRUJwFxjYXpXN0KI= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2774 - Nosso Adeus - - 206471 - fRxq5IWpJChHcnk= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2775 - Canário Do Reino - - 139337 - 54ItJ+3eBPQIgi0kFCHERJhlIw== - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2776 - Preciso Ser Amado - - 174001 - 1Sz9RASLOic= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2777 - Balanço - - 209737 - LE7TyE4wlqs2qO7MrmT670U= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2778 - Preciso Aprender A Ser Só - - 162220 - Y+Tgj+FOgUy7hOgjYaTc - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2779 - Esta É A Canção - - 184450 - 3DRaXMXxLphivQ== - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2780 - Formigueiro - - 252943 - LCfHA1W+vNZC4JxshEYCdBE= - 0.9900000000000000000 - 223 - 1 - 7 - 1 - - - 2781 - Comida - Titãs - 322612 - E0ZK73uHxpXp - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2782 - Go Back - Titãs - 230504 - crZHLSQaVSTzgZJkpc6aUj/H - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2783 - Prá Dizer Adeus - Titãs - 222484 - FcN8HNVOd+o= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2784 - Família - Titãs - 218331 - qz88wNWyY4uYb0hq8d2AkDCvoQ== - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2785 - Os Cegos Do Castelo - Titãs - 296829 - VChI/77URvWZcd6sLxh5tETSjw== - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2786 - O Pulso - Titãs - 199131 - ag66z35rJOX7jKWf1m7og/c9AQ== - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2787 - Marvin - Titãs - 264359 - a27yJ5GcOthkzEtdIK4= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2788 - Nem 5 Minutos Guardados - Titãs - 245995 - RW54gVKwYfkNzD/WwTD1 - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2789 - Flores - Titãs - 215510 - B9COh/sckj7iMUs= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2790 - Palavras - Titãs - 158458 - L0FHfihcohR/vK5QCnTkWlI= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2791 - Hereditário - Titãs - 151693 - eaduEESNkSYVKds5nyFk - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2792 - A Melhor Forma - Titãs - 191503 - ysuEwK5kjeE8SiI+fYc= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2793 - Cabeça Dinossauro - Titãs - 37120 - OOwct6QSHvy67QFHeTlF - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2794 - 32 Dentes - Titãs - 184946 - jOspqhjWkRcVGo3T+WpTqY7x - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2795 - Bichos Escrotos (Vinheta) - Titãs - 104986 - TYJpwM6rz8rTrB0Up/Y= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2796 - Não Vou Lutar - Titãs - 189988 - lVJT3B5hWgU= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2797 - Homem Primata (Vinheta) - Titãs - 34168 - iYRLA0+ZV7iHlfg= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2798 - Homem Primata - Titãs - 195500 - Iitb/kkLvmr4BeXcy9UBVrHSQQ== - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2799 - Polícia (Vinheta) - Titãs - 56111 - fcc2SmDLezlVZIw= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2800 - Querem Meu Sangue - Titãs - 212401 - /pRyJvjd1FY= - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2801 - Diversão - Titãs - 285936 - mqqEnm44eQ== - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2802 - Televisão - Titãs - 293668 - AQa1VAYcW/QQ - 0.9900000000000000000 - 224 - 1 - 4 - 1 - - - 2803 - Sonifera Ilha - Branco Mello/Carlos Barmack/Ciro Pessoa/Marcelo Fromer/Toni Belloto - 170684 - fZCEFZN50943Y9pd1P3rVuMdsg== - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2804 - Lugar Nenhum - Arnaldo Antunes/Charles Gavin/Marcelo Fromer/Sérgio Britto/Toni Bellotto - 195840 - 8ZMBoVNd1773eBYy5z5XxReF - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2805 - Sua Impossivel Chance - Nando Reis - 246622 - CsqQABa9ow== - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2806 - Desordem - Charles Gavin/Marcelo Fromer/Sérgio Britto - 213289 - t2iwOD1CZa3pj+PBNqIV5g== - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2807 - Não Vou Me Adaptar - Arnaldo Antunes - 221831 - TKh2laYlP10= - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2808 - Domingo - Sérgio Britto/Toni Bellotto - 208613 - p+Fgk+rjsCofVUc/ - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2809 - Amanhã Não Se Sabe - Sérgio Britto - 189440 - 74KQbTYzw98= - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2810 - Caras Como Eu - Toni Bellotto - 183092 - tKlByRUtnRBC - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2811 - Senhora E Senhor - Arnaldo Anutnes/Marcelo Fromer/Paulo Miklos - 203702 - 2jaag01WpP8R - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2812 - Era Uma Vez - Arnaldo Anutnes/Branco Mello/Marcelo Fromer/Sergio Brotto/Toni Bellotto - 224261 - gsCff3O49AQ57wuZJz8stw== - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2813 - Miséria - Arnaldo Antunes/Britto, SergioMiklos, Paulo - 262191 - Ic2DjQ8S1WSi - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2814 - Insensível - Sérgio Britto - 207830 - /kMWkTSy0+X0CcFWXDiZ - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2815 - Eu E Ela - Nando Reis - 276035 - UmVADltWlgWD - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2816 - Toda Cor - Ciro Pressoa/Marcelo Fromer - 209084 - jn5zrckb0GT1wCJe1+dTWTit - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2817 - É Preciso Saber Viver - Erasmo Carlos/Roberto Carlos - 251115 - ynFK9DjAcCOU+Q== - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2818 - Senhor Delegado/Eu Não Aguento - Antonio Lopes - 156656 - rRAOAiRVckY= - 0.9900000000000000000 - 225 - 1 - 4 - 1 - - - 2819 - Battlestar Galactica: The Story So Far - - 2622250 - poX4Q9i09I4= - 1.9900000000000000000 - 226 - 3 - 18 - 2 - - - 2820 - Occupation / Precipice - - 5286953 - ugEe6Xa4wESKOu1Z+A== - 1.9900000000000000000 - 227 - 3 - 19 - 2 - - - 2821 - Exodus, Pt. 1 - - 2621708 - ak0TEU/Vw/7n8W3oRA== - 1.9900000000000000000 - 227 - 3 - 19 - 2 - - - 2822 - Exodus, Pt. 2 - - 2618000 - BhuDy+HJ2fiJxJo= - 1.9900000000000000000 - 227 - 3 - 19 - 2 - - - 2823 - Collaborators - - 2626626 - Qd/LN1nmrkmO9sWipLmWvBk= - 1.9900000000000000000 - 227 - 3 - 19 - 2 - - - 2824 - Torn - - 2631291 - fI1zSD1utiF4LmJyw053 - 1.9900000000000000000 - 227 - 3 - 19 - 2 - - - 2825 - A Measure of Salvation - - 2563938 - k+Mzr5iGOvvqD1XhJigzHd5dSA== - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2826 - Hero - - 2713755 - 4vihXIA3bg== - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2827 - Unfinished Business - - 2622038 - 5hszdiqqJbKJapT1UnheLhjV - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2828 - The Passage - - 2623875 - UPpFk2YGaheb - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2829 - The Eye of Jupiter - - 2618750 - 1i5gGLoVztzftnsCgZRz - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2830 - Rapture - - 2624541 - UrppmnNDqzwehaCHzXA= - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2831 - Taking a Break from All Your Worries - - 2624207 - k4pwsjw03Zhij1E5Hn9N - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2832 - The Woman King - - 2626376 - sSCds7CtAM2TgiP6 - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2833 - A Day In the Life - - 2620245 - dEYPbvXoeBDiN5Q= - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2834 - Dirty Hands - - 2627961 - IQcLIgmMvNAL72cvvRDliQ== - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2835 - Maelstrom - - 2622372 - HrkQ42LuSA== - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2836 - The Son Also Rises - - 2621830 - yyiW1WnP6Ak9 - 1.9900000000000000000 - 227 - 3 - 18 - 2 - - - 2837 - Crossroads, Pt. 1 - - 2622622 - pvWrifZmKSmF3w== - 1.9900000000000000000 - 227 - 3 - 20 - 2 - - - 2838 - Crossroads, Pt. 2 - - 2869953 - sOUD7m3Dfg== - 1.9900000000000000000 - 227 - 3 - 20 - 2 - - - 2839 - Genesis - - 2611986 - kr8Ywt8+YyX7oh9+JoCCPpQ= - 1.9900000000000000000 - 228 - 3 - 19 - 2 - - - 2840 - Don't Look Back - - 2571154 - lcOpuTloaWIb - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2841 - One Giant Leap - - 2607649 - k+b8DGqFq8+NMstLkkA= - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2842 - Collision - - 2605480 - hmVguTBjxVo= - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2843 - Hiros - - 2533575 - Lbva2IWwWX0iIJIUphMUoNWzsA== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2844 - Better Halves - - 2573031 - K0oxaIuyAgio6w== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2845 - Nothing to Hide - - 2605647 - zoyG3q+r0knd2U4ocQ== - 1.9900000000000000000 - 228 - 3 - 19 - 2 - - - 2846 - Seven Minutes to Midnight - - 2613988 - GeBSTBlasBT4SuM= - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2847 - Homecoming - - 2601351 - cUzTrVDVNz/EhyA0ZfUCadKH3Q== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2848 - Six Months Ago - - 2602852 - v7py0rC8j5A= - 1.9900000000000000000 - 228 - 3 - 19 - 2 - - - 2849 - Fallout - - 2594761 - uZM7+yU6hXYviHjw - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2850 - The Fix - - 2600266 - 6pK/HeYjWEZC - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2851 - Distractions - - 2590382 - bcDKttoB/ZRGpw== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2852 - Run! - - 2602602 - CvPkOT+7ffOj/mQ= - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2853 - Unexpected - - 2598139 - jNDfEpLVazjqdyLOOlqDqnQy - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2854 - Company Man - - 2601226 - Mkgi357a5Kdo2lKecg== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2855 - Company Man - - 2601101 - jz3m+u9qvtpvJZPRFv7lONJ+ - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2856 - Parasite - - 2602727 - CjHpavBBN64uAw== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 2857 - A Tale of Two Cities - - 2636970 - l9iwxascnbCFxzU= - 1.9900000000000000000 - 229 - 3 - 19 - 2 - - - 2858 - Lost (Pilot, Part 1) (Premiere) - - 2548875 - 2f1MzcTmwjAI1C0= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2859 - Man of Science, Man of Faith (Premiere) - - 2612250 - 1qXT9bm3vJDWEg== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2860 - Adrift - - 2564958 - uiFRUsiaIvmq1A== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2861 - Lost (Pilot, Part 2) - - 2436583 - EGykdHPHbNNUwqtH7g== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2862 - The Glass Ballerina - - 2637458 - SKf2zQqkgcdvkatyk/mV5g== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2863 - Further Instructions - - 2563980 - g5P9lWdRRET0JAO9yw/ZY01/8w== - 1.9900000000000000000 - 229 - 3 - 19 - 2 - - - 2864 - Orientation - - 2609083 - K58vV0n9EsgANA== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2865 - Tabula Rasa - - 2627105 - Pm3nJ7Twb+FWsogVgH4Jow== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2866 - Every Man for Himself - - 2637387 - 0g5GeaG7r+NjpQ== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2867 - Everybody Hates Hugo - - 2609192 - aT57Q8CxxE/j5yVy3Z2deaI= - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2868 - Walkabout - - 2587370 - r9k/WZD28e74nLI4RFBLI3c= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2869 - ...And Found - - 2563833 - NkVVzrm6wJqsnGnbBEIMWbM= - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2870 - The Cost of Living - - 2637500 - DRCthVHSuCecqqPU - 1.9900000000000000000 - 229 - 3 - 19 - 2 - - - 2871 - White Rabbit - - 2571965 - uiaFQ1004R+FmPVJVQ== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2872 - Abandoned - - 2587041 - HZhwK+qcfhVnabDzgxWSHRU= - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2873 - House of the Rising Sun - - 2590032 - 2HSvtX7/ryXSrYh3uDv8TQ== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2874 - I Do - - 2627791 - jyx/uDiopL4bkmqwy41ogg== - 1.9900000000000000000 - 229 - 3 - 19 - 2 - - - 2875 - Not In Portland - - 2637303 - ceDVZxlxfMTK0Y3wsXT2NnkC - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2876 - Not In Portland - - 2637345 - lj6fzAr3Y2xFdAYfH/Q= - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2877 - The Moth - - 2631327 - yht3NHW7AvNu1xbOag== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2878 - The Other 48 Days - - 2610625 - c3pSinfsvtEUynC2BDdQw7Ft - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2879 - Collision - - 2564916 - 96rbvkWMNZNLMfQ= - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2880 - Confidence Man - - 2615244 - KPlO0fm0lagI - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2881 - Flashes Before Your Eyes - - 2636636 - +AatxL+2y6OqJanTcg== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2882 - Lost Survival Guide - - 2632590 - l7wM/UJYc58f1ke9tWVW - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2883 - Solitary - - 2612894 - HMXy+7HUEYHNfsenhw== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2884 - What Kate Did - - 2610250 - S1WG2zk9p5dmr4dY - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2885 - Raised By Another - - 2590459 - 1nwCAGZNmgjj4HfCw6uLLw== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2886 - Stranger In a Strange Land - - 2636428 - kMwYUIvxNtorGGiEX0N0WA== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2887 - The 23rd Psalm - - 2610416 - OgTLfWFZ7A== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2888 - All the Best Cowboys Have Daddy Issues - - 2555492 - Z3UOGHaRHGeiH7pAlg== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2889 - The Hunting Party - - 2611333 - i8slOjQyg4SdAw== - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2890 - Tricia Tanaka Is Dead - - 2635010 - 1XCGZEUvcg== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2891 - Enter 77 - - 2629796 - iiR7KMG0h0wdvCO5GFfveQBYJg== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2892 - Fire + Water - - 2600333 - uULi2AuvoSGVAw== - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2893 - Whatever the Case May Be - - 2616410 - 8EcUDCcPomOFreZmyA== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2894 - Hearts and Minds - - 2619462 - SlB9gQ1j7QhNckc= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2895 - Par Avion - - 2629879 - oxwSE2a2GmAzcQRLyGld9A== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2896 - The Long Con - - 2679583 - d9PcGl/BXySfh59u5/qh - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2897 - One of Them - - 2698791 - 5WyGUXJHL0xoRdhLMbmj - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2898 - Special - - 2618530 - +WfVnmsnQ1uy78YvevFLd2I= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2899 - The Man from Tallahassee - - 2637637 - 4v3Xoi4wow== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2900 - Exposé - - 2593760 - shnoFPLl45l0gCQCWb0= - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2901 - Homecoming - - 2515882 - Kp+DgADSdvph6KrWpi5X - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2902 - Maternity Leave - - 2780416 - pfvbdSpznfzgS+B8y1I= - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2903 - Left Behind - - 2635343 - LSXUrQKrr6K9Ox6GLEcPPWsdRg== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2904 - Outlaws - - 2619887 - B31I/rcChp+18fouD4h8sdE= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2905 - The Whole Truth - - 2610125 - VI71WB46C+xxtdEOdF6F01iw3A== - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2906 - ...In Translation - - 2604575 - 9QAkD+3LQfB3o8td - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2907 - Lockdown - - 2610250 - 6sm3iK5eDvLKkNE= - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2908 - One of Us - - 2638096 - p32bqTsvzNX7i1Np5mtS+Bt1 - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2909 - Catch-22 - - 2561394 - 6nSiiZXNS6pRzuMrcFNB - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2910 - Dave - - 2825166 - TqVGPHP+iG9fdQ== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2911 - Numbers - - 2609772 - okILFddUwudZ - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2912 - D.O.C. - - 2616032 - 8wXc8IV6Bhdf4xak - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 2913 - Deus Ex Machina - - 2582009 - BFPVOVnr7DIpIA== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2914 - S.O.S. - - 2639541 - qGdGuQzWrWzoQVqfaUvuhIFY - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2915 - Do No Harm - - 2618487 - kTj+HQfCARtp+23RyeVdRw== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2916 - Two for the Road - - 2610958 - NE0LiTapu+Ops2zta2Zq2iqORg== - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2917 - The Greater Good - - 2617784 - Sj72CrpEcHtwkbkLBNBQM0x2Ww== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2918 - "?" - - 2782333 - QjpdDpUt/ZUC9p9X - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2919 - Born to Run - - 2618619 - ndP1VgDO8jk= - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2920 - Three Minutes - - 2763666 - cxj6YOmaFQ== - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2921 - Exodus (Part 1) - - 2620747 - jbQyuGcP4eh0jUbbeXnxYg== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2922 - Live Together, Die Alone, Pt. 1 - - 2478041 - Zvxb3UynaVUCxg== - 1.9900000000000000000 - 231 - 3 - 21 - 2 - - - 2923 - Exodus (Part 2) (Season Finale) - - 2605557 - FDREYn/LaOskXjbEE26LQaxd - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2924 - Live Together, Die Alone, Pt. 2 - - 2656531 - +SaYbIKeullBDMliZEic1EA= - 1.9900000000000000000 - 231 - 3 - 19 - 2 - - - 2925 - Exodus (Part 3) (Season Finale) - - 2619869 - 41utEAY9lTA4R2/AZb33Ow== - 1.9900000000000000000 - 230 - 3 - 19 - 2 - - - 2926 - Zoo Station - U2 - 276349 - HnzIwcTEcg== - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2927 - Even Better Than The Real Thing - U2 - 221361 - 3lv70nt3mUv4 - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2928 - One - U2 - 276192 - ARnpH1rWUmVy6oGmDGs= - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2929 - Until The End Of The World - U2 - 278700 - e35Yd4YfljvpKOKZ - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2930 - Who's Gonna Ride Your Wild Horses - U2 - 316551 - vdDVdG309Q== - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2931 - So Cruel - U2 - 349492 - 4/4h8W9eUoilN06Qqf/4 - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2932 - The Fly - U2 - 268982 - 1HGpa90A93g99KihFAw5 - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2933 - Mysterious Ways - U2 - 243826 - dQWYfzaFF8BEsw== - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2934 - Tryin' To Throw Your Arms Around The World - U2 - 232463 - 8ZMJtL3Yk6D7 - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2935 - Ultraviolet (Light My Way) - U2 - 330788 - ikTiB6i0erWwc5n9NhqjZngLTg== - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2936 - Acrobat - U2 - 270288 - 6CYqvQblM0DqyQ== - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2937 - Love Is Blindness - U2 - 263497 - az7N6sG1eI3RnAqTP6nzXe4Q - 0.9900000000000000000 - 232 - 1 - 1 - 1 - - - 2938 - Beautiful Day - Adam Clayton, Bono, Larry Mullen, The Edge - 248163 - X4hSoWJkGiUB - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2939 - Stuck In A Moment You Can't Get Out Of - Adam Clayton, Bono, Larry Mullen, The Edge - 272378 - gDrL5vItv2gw4rH/ - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2940 - Elevation - Adam Clayton, Bono, Larry Mullen, The Edge - 227552 - fL3ekuoTEoc= - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2941 - Walk On - Adam Clayton, Bono, Larry Mullen, The Edge - 296280 - L5Nq+Bmda4amkHc= - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2942 - Kite - Adam Clayton, Bono, Larry Mullen, The Edge - 266893 - UGE/rU18NPS+LaZfCw== - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2943 - In A Little While - Adam Clayton, Bono, Larry Mullen, The Edge - 219271 - 44PRLxLuOzsLN3z6FCH9 - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2944 - Wild Honey - Adam Clayton, Bono, Larry Mullen, The Edge - 226768 - PCCIsixbnuWdl90= - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2945 - Peace On Earth - Adam Clayton, Bono, Larry Mullen, The Edge - 288496 - hwHtCuxDuee1d36JjhVW - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2946 - When I Look At The World - Adam Clayton, Bono, Larry Mullen, The Edge - 257776 - MFJnEvcU8YXXWamH - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2947 - New York - Adam Clayton, Bono, Larry Mullen, The Edge - 330370 - 65J6EKm0CUlxDdBoFfTE - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2948 - Grace - Adam Clayton, Bono, Larry Mullen, The Edge - 330657 - /iMXBZW1Si/Lm3IQaDOTmjIB - 0.9900000000000000000 - 233 - 1 - 1 - 1 - - - 2949 - The Three Sunrises - U2 - 234788 - 5QN45WBMvr5Fl6rhIC0= - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2950 - Spanish Eyes - U2 - 196702 - 2DWSgk82R0tFDg== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2951 - Sweetest Thing - U2 - 185103 - +eE+ejY1FCrfnw== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2952 - Love Comes Tumbling - U2 - 282671 - Pra41/YFmCC5UeKGWg== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2953 - Bass Trap - U2 - 213289 - CK+xkp24MtceU9w= - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2954 - Dancing Barefoot - Ivan Kral/Patti Smith - 287895 - ymB0zfZNQlL228l4QEKy - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2955 - Everlasting Love - Buzz Cason/Mac Gayden - 202631 - VPAWW+McLoZil0LnU2eYZfp1Og== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2956 - Unchained Melody - Alex North/Hy Zaret - 294164 - q+xalUMIZyzlOQ== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2957 - Walk To The Water - U2 - 289253 - WgUNgi08gZ2uMu5qXwtb/g== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2958 - Luminous Times (Hold On To Love) - Brian Eno/U2 - 277760 - Q2R9ygd7eGiWgRjatAGgKEQ= - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2959 - Hallelujah Here She Comes - U2 - 242364 - 4UXlail52IwEvQ== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2960 - Silver And Gold - Bono - 279875 - +4nnCtnogbuIUomUGg== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2961 - Endless Deep - U2 - 179879 - umjC+TBNQhokeg== - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2962 - A Room At The Heartbreak Hotel - U2 - 274546 - qdk6BPJ7d7vmmvcw - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2963 - Trash, Trampoline And The Party Girl - U2 - 153965 - 2xkebLyUV7HK024= - 0.9900000000000000000 - 234 - 1 - 1 - 1 - - - 2964 - Vertigo - Adam Clayton, Bono, Larry Mullen & The Edge - 194612 - FZLTbz/hZW1RLw9Gtw== - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2965 - Miracle Drug - Adam Clayton, Bono, Larry Mullen & The Edge - 239124 - 1xLZM/zDOPIeFy7VXY8iB94GzA== - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2966 - Sometimes You Can't Make It On Your Own - Adam Clayton, Bono, Larry Mullen & The Edge - 308976 - 3OmjS6e5ksN+qwrYtSa9 - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2967 - Love And Peace Or Else - Adam Clayton, Bono, Larry Mullen & The Edge - 290690 - 15fWq9gjc7xAaoPVSkpQCXk= - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2968 - City Of Blinding Lights - Adam Clayton, Bono, Larry Mullen & The Edge - 347951 - ue5vjoxDMHRz - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2969 - All Because Of You - Adam Clayton, Bono, Larry Mullen & The Edge - 219141 - DVYgN9LdL0cvIRu4deYKPTU= - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2970 - A Man And A Woman - Adam Clayton, Bono, Larry Mullen & The Edge - 270132 - eTRbAF7wbM/VSQo= - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2971 - Crumbs From Your Table - Adam Clayton, Bono, Larry Mullen & The Edge - 303568 - emOwAK/pSkwCbBoI2Vg= - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2972 - One Step Closer - Adam Clayton, Bono, Larry Mullen & The Edge - 231680 - AXiJg08Oc/s/Fwz4L8oDCOY8nQ== - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2973 - Original Of The Species - Adam Clayton, Bono, Larry Mullen & The Edge - 281443 - twh0NiDy6boMGVMnBUdr - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2974 - Yahweh - Adam Clayton, Bono, Larry Mullen & The Edge - 262034 - S8a7hAdocOmj8RqB/2Mz - 0.9900000000000000000 - 235 - 1 - 1 - 1 - - - 2975 - Discotheque - Bono, The Edge, Adam Clayton, and Larry Mullen - 319582 - PLHx+ANSYlwkuO4mxOQ= - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2976 - Do You Feel Loved - Bono, The Edge, Adam Clayton, and Larry Mullen - 307539 - 516svSCBGJ5OmIuTL9hnuw== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2977 - Mofo - Bono, The Edge, Adam Clayton, and Larry Mullen - 349178 - 5YfqU1ZzUvljX19Pekolvv4zIg== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2978 - If God Will Send His Angels - Bono, The Edge, Adam Clayton, and Larry Mullen - 322533 - phNKIxKjYHi/M4S9/Q== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2979 - Staring At The Sun - Bono, The Edge, Adam Clayton, and Larry Mullen - 276924 - QDz5npHrWcO8IrlP1E0= - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2980 - Last Night On Earth - Bono, The Edge, Adam Clayton, and Larry Mullen - 285753 - 1DClRGgC0j3GQLM= - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2981 - Gone - Bono, The Edge, Adam Clayton, and Larry Mullen - 266866 - 2Tow26JSNArpxV+hN/jiVyhqww== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2982 - Miami - Bono, The Edge, Adam Clayton, and Larry Mullen - 293041 - EhPqAt54lENu/zNd3th/ - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2983 - The Playboy Mansion - Bono, The Edge, Adam Clayton, and Larry Mullen - 280555 - jEYW/Z9DfA/QAw0= - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2984 - If You Wear That Velvet Dress - Bono, The Edge, Adam Clayton, and Larry Mullen - 315167 - H3sVW33kAMZPLQ== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2985 - Please - Bono, The Edge, Adam Clayton, and Larry Mullen - 302602 - Kb3xm+qSAcNfeFnK - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2986 - Wake Up Dead Man - Bono, The Edge, Adam Clayton, and Larry Mullen - 292832 - VMUuzpfbMdtrJA== - 0.9900000000000000000 - 236 - 1 - 1 - 1 - - - 2987 - Helter Skelter - Lennon, John/McCartney, Paul - 187350 - 8+nX4PnXuTleSuw/rqeRfc4/ - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2988 - Van Diemen's Land - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 186044 - 98WwNAe4tTEv - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2989 - Desire - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 179226 - /CC+mc2oALo= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2990 - Hawkmoon 269 - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 382458 - yoe/H2yWZ4WAJgVeY5y9LA== - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2991 - All Along The Watchtower - Dylan, Bob - 264568 - Q7XPKEOmisVhKQ== - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2992 - I Still Haven't Found What I'm Looking for - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 353567 - peD/kcKtdCc4pUOd - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2993 - Freedom For My People - Mabins, Macie/Magee, Sterling/Robinson, Bobby - 38164 - MjQKKRWYhAFtb2VK6/mG4DQ= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2994 - Silver And Gold - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 349831 - Cm0436Anc5s= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2995 - Pride (In The Name Of Love) - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 267807 - J5bzuAAYLvU= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2996 - Angel Of Harlem - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 229276 - m2CvyaUtOHGaRtaz7kYDSzgvaA== - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2997 - Love Rescue Me - Bono/Clayton, Adam/Dylan, Bob/Mullen Jr., Larry/The Edge - 384522 - lOO1euJca3m2ZDI= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2998 - When Love Comes To Town - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 255869 - A3dF1KpBxwunLowtxQ== - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 2999 - Heartland - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 303360 - OU/wbMjoxqN6uKo15kjBvro= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 3000 - God Part II - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 195604 - FBivdgEvofZoXKpmVog= - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 3001 - The Star Spangled Banner - Hendrix, Jimi - 43232 - 4CMbiUqcSfdg/YwpdFt/Seh0 - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 3002 - Bullet The Blue Sky - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 337005 - GaxTwk7Ay9GAaQ== - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 3003 - All I Want Is You - Bono/Clayton, Adam/Mullen Jr., Larry/The Edge - 390243 - FGEigAYkpTVwmMohTnl0 - 0.9900000000000000000 - 237 - 1 - 1 - 1 - - - 3004 - Pride (In The Name Of Love) - U2 - 230243 - LJrpEsHx/28IjGHNyH4= - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3005 - New Year's Day - U2 - 258925 - yY1n6SsH9FVao7MEvk6KBEjZuw== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3006 - With Or Without You - U2 - 299023 - N5dXNiJisg== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3007 - I Still Haven't Found What I'm Looking For - U2 - 280764 - ecPYbPHNAZQ= - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3008 - Sunday Bloody Sunday - U2 - 282174 - kEn+OESObg7tQCF9hxjzDd+T - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3009 - Bad - U2 - 351817 - NjHGyVR83JbLRhLwTPYduJA= - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3010 - Where The Streets Have No Name - U2 - 276218 - ZvII6Cg0IZH68Q== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3011 - I Will Follow - U2 - 218253 - 5F8ROs9dtcl/qbxo - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3012 - The Unforgettable Fire - U2 - 295183 - osfaUNSHal9jTw== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3013 - Sweetest Thing - U2 & Daragh O'Toole - 183066 - oSlOCJKnwoHq6+fnAbZ9mWjvEA== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3014 - Desire - U2 - 179853 - qokQRWBZ0b1yh0yB - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3015 - When Love Comes To Town - U2 - 258194 - mJimD6w32Oc6fg274NmZVw== - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3016 - Angel Of Harlem - U2 - 230217 - AW9SPM4YGAg= - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3017 - All I Want Is You - U2 & Van Dyke Parks - 591986 - ONYEDmKfZdc= - 0.9900000000000000000 - 238 - 1 - 1 - 1 - - - 3018 - Sunday Bloody Sunday - U2 - 278204 - HtaJu7g4LHAKA4mA - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3019 - Seconds - U2 - 191582 - N2aEhdwu08qAjQYE/gHiKxtu - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3020 - New Year's Day - U2 - 336274 - CHF7gGRGtxoQXg0Vfye4np6J3Q== - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3021 - Like A Song... - U2 - 287294 - NgSenUiDtrk2SUTvlDN3Drzm - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3022 - Drowning Man - U2 - 254458 - PyQUw2xzd4fdRmNEoT6rHw== - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3023 - The Refugee - U2 - 221283 - 09034I/948YZHoBLr6o= - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3024 - Two Hearts Beat As One - U2 - 243487 - uGmdniJBMSrR/Nlz0wWjsOk= - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3025 - Red Light - U2 - 225854 - czverkCvJzH8UlX2Oy0= - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3026 - Surrender - U2 - 333505 - gYs4oA38w6GzZuS1iRDAdm2X - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3027 - "40" - U2 - 157962 - PG8CCSntdg== - 0.9900000000000000000 - 239 - 1 - 1 - 1 - - - 3028 - Zooropa - U2; Bono - 392359 - RN/V2sCs11F5ag/cF6+ZK0hb - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3029 - Babyface - U2; Bono - 241998 - nSA73OdfBPEsfoIP - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3030 - Numb - U2; Edge, The - 260284 - lgt/wt6MIwiyv0cLXrsfjNXX - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3031 - Lemon - U2; Bono - 418324 - zfPZzwgC7Xq8u6vS91tc - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3032 - Stay (Faraway, So Close!) - U2; Bono - 298475 - CzDXTLs48eth9NGJpOVkV6c= - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3033 - Daddy's Gonna Pay For Your Crashed Car - U2; Bono - 320287 - Qr+9O3bA8BFnTQbsT7A= - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3034 - Some Days Are Better Than Others - U2; Bono - 257436 - dRNc/ooFlALubg== - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3035 - The First Time - U2; Bono - 225697 - MWTW1lZTKzYZnYjPuRdcqtCj - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3036 - Dirty Day - U2; Bono & Edge, The - 324440 - daQhhy7RCFgcuq29 - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3037 - The Wanderer - U2; Bono - 283951 - zWKOjDqQ9g== - 0.9900000000000000000 - 240 - 1 - 1 - 1 - - - 3038 - Breakfast In Bed - - 196179 - wBiWY+xDoucuW8NeCfhvENynBA== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3039 - Where Did I Go Wrong - - 226742 - +w97a+C5AVaIz29ArTE= - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3040 - I Would Do For You - - 334524 - i4okQo5mcO1f6l/F1fN+r5OM - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3041 - Homely Girl - - 203833 - t7GcK4MzQUtfX+uDsNhD44a4ZQ== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3042 - Here I Am (Come And Take Me) - - 242102 - 6IoiHIGB9CxjCiDctAV6Aw== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3043 - Kingston Town - - 226951 - XqAPTBoRjg== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3044 - Wear You To The Ball - - 213342 - Zq7tkRD49y0Vvyw= - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3045 - (I Can't Help) Falling In Love With You - - 207568 - gKoCPhXoVT4Oz6te - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3046 - Higher Ground - - 260179 - 8ycXVirNeJSnGtMHm1IRKa6e - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3047 - Bring Me Your Cup - - 341498 - TXVutJ7QNjK8T2WXAo9RHNDf1w== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3048 - C'est La Vie - - 270053 - 8bP52I8vN3qVQxVgMGUQyoU= - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3049 - Reggae Music - - 245106 - eYXzm7xFQoPQd0k1QErX - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3050 - Superstition - - 319582 - VJl7lSVvmA== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3051 - Until My Dying Day - - 235807 - nHk6BWadfoeXXmVR91b3tA== - 0.9900000000000000000 - 241 - 1 - 8 - 1 - - - 3052 - Where Have All The Good Times Gone? - Ray Davies - 186723 - C16/MF8Cy4l8EXc= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3053 - Hang 'Em High - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 210259 - 8E0K7Tb+Qw== - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3054 - Cathedral - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 82860 - PRwz+cKe4uQ= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3055 - Secrets - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 206968 - vP2hxv8ZENmLPXZu - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3056 - Intruder - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 100153 - 6owGOKYQWmTAWLSpWO8rxW7B - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3057 - (Oh) Pretty Woman - Bill Dees/Roy Orbison - 174680 - 5gO/E9WI8TP6FKrBzJw= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3058 - Dancing In The Street - Ivy Jo Hunter/Marvin Gaye/William Stevenson - 225985 - MqfziffRiSD8pO0cpirk - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3059 - Little Guitars (Intro) - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 42240 - HXtXiHgqeA== - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3060 - Little Guitars - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 228806 - r7XdYFAVl+gNl72E0uTJ - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3061 - Big Bad Bill (Is Sweet William Now) - Jack Yellen/Milton Ager - 165146 - XOPDb+hrSgkWAI1FdBNJBy4= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3062 - The Full Bug - Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony - 201116 - 2kL0KdDmDQUPD2xfQDg= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3063 - Happy Trails - Dale Evans - 65488 - CSuVZwlIRGo= - 0.9900000000000000000 - 242 - 1 - 1 - 1 - - - 3064 - Eruption - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 102164 - Sk+HUnP5TbVV - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3065 - Ain't Talkin' 'bout Love - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 228336 - CodZMxPcYeM= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3066 - Runnin' With The Devil - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 215902 - O5y2wFWTaw== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3067 - Dance the Night Away - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 185965 - tKAlepXXId6AX7qRFcG3CTA= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3068 - And the Cradle Will Rock... - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 213968 - KrD4goqnZOguNpSPMb8= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3069 - Unchained - Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony - 208953 - EpkVMJV0rzdUkg== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3070 - Jump - Edward Van Halen, Alex Van Halen, David Lee Roth - 241711 - p1FGeuWskChouu8yFX4= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3071 - Panama - Edward Van Halen, Alex Van Halen, David Lee Roth - 211853 - rajrSvEt+4kDKKLZmrh7eaQ= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3072 - Why Can't This Be Love - Van Halen - 227761 - DAASobRQ5/4JVg== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3073 - Dreams - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar - 291813 - Imb/sX/HBksJoVCryEI= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3074 - When It's Love - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar - 338991 - Q9P1b+1BS0M= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3075 - Poundcake - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar - 321854 - fgIL9Jpj8iOlO+DBoiga8XQtmg== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3076 - Right Now - Van Halen - 321828 - vFRKXmINFAiaaQzXI/YyfA== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3077 - Can't Stop Loving You - Van Halen - 248502 - ErGmriwGjGKQoKs= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3078 - Humans Being - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar - 308950 - fXgUsfVMKbg= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3079 - Can't Get This Stuff No More - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, David Lee Roth - 315376 - kY1P6Yk7LwmdrPWdNmF8856QTg== - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3080 - Me Wise Magic - Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, David Lee Roth - 366053 - /NFsaC0c8PcmLqo= - 0.9900000000000000000 - 243 - 1 - 1 - 1 - - - 3081 - Runnin' With The Devil - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 216032 - xA6BI1bFoso= - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3082 - Eruption - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 102556 - WPP0tj1HF5i9Vrs= - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3083 - You Really Got Me - Ray Davies - 158589 - +7C/Iea8bUo34m8B7Nkn4Fic2Q== - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3084 - Ain't Talkin' 'Bout Love - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 230060 - hGCj3ney8NXZX2nX7i7IXsECcA== - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3085 - I'm The One - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 226507 - NX8ldoTyyWMfNj8gfM1WmwzhqQ== - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3086 - Jamie's Cryin' - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 210546 - y5hw13mXE70RyR5WLNC4BA== - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3087 - Atomic Punk - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 182073 - LVqF6Iy1oh9JWyHX - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3088 - Feel Your Love Tonight - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 222850 - UeBYPD2dDk387N8M - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3089 - Little Dreamer - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 203258 - VRjp86wVUmDehiRK - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3090 - Ice Cream Man - John Brim - 200306 - 4s64MDzy5uN4Pv3vkxv17DFt - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3091 - On Fire - Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth - 180636 - 3DpgijZVrgyFzHNZNPH+u0CVzA== - 0.9900000000000000000 - 244 - 1 - 1 - 1 - - - 3092 - Neworld - Van Halen - 105639 - 7SVu3dnsBBj5XHStGX5u - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3093 - Without You - Van Halen - 390295 - gkOB2o3mYRcE5cg= - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3094 - One I Want - Van Halen - 330788 - lWC1V2W9uLbLgrFJUZYSKFjF - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3095 - From Afar - Van Halen - 324414 - toP5OP0T8SMHxA== - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3096 - Dirty Water Dog - Van Halen - 327392 - 2PMjBoOZpx1IXMW3OP+R - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3097 - Once - Van Halen - 462837 - ifbTOL4/pRF6mye4Q3OZsfJ0 - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3098 - Fire in the Hole - Van Halen - 331728 - vSVLEniBOw== - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3099 - Josephina - Van Halen - 342491 - 5PHMwTlr22csM4yYmU4= - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3100 - Year to the Day - Van Halen - 514612 - jOhy79nUwhPE - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3101 - Primary - Van Halen - 86987 - VdQSPuRbtoPBwSCt2e0= - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3102 - Ballot or the Bullet - Van Halen - 342282 - ZwxtfmXbEG8= - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3103 - How Many Say I - Van Halen - 363937 - vioGkmGpId0H/OOWyShI - 0.9900000000000000000 - 245 - 1 - 1 - 1 - - - 3104 - Sucker Train Blues - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 267859 - 1RXXjfHeDoSicshVlV/pRGQ= - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3105 - Do It For The Kids - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 235911 - f7lVJCIYn0Om3Qo= - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3106 - Big Machine - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 265613 - neMkpo/FOOI= - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3107 - Illegal I Song - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 257750 - 4ByB8O7gzA== - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3108 - Spectacle - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 221701 - qBOeMsupjw== - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3109 - Fall To Pieces - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 270889 - sfO/7q44MXrr1eQw7g== - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3110 - Headspace - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 223033 - IwyC3J+c0zMzN9L7/ck= - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3111 - Superhuman - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 255921 - g9E6lSTd0nnzc6g= - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3112 - Set Me Free - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 247954 - BgQZ/JxZ2O+Sr+8J8g== - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3113 - You Got No Right - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 335412 - fcCHG7M6Zw9oA6qayg== - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3114 - Slither - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 248398 - UZKOaPexzC8ZOzahJNrY - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3115 - Dirty Little Thing - Dave Kushner, Duff, Keith Nelson, Matt Sorum, Scott Weiland & Slash - 237844 - 4jCjdWAS8djAbYT3nBZSAY7n - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3116 - Loving The Alien - Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash - 348786 - ACGGEkHhTqZM5BEV - 0.9900000000000000000 - 246 - 1 - 1 - 1 - - - 3117 - Pela Luz Dos Olhos Teus - - 119196 - NpQgefdVkT6gtqiJLNWTAug= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3118 - A Bencao E Outros - - 421093 - Ez0717JbHWKT - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3119 - Tudo Na Mais Santa Paz - - 222406 - a6Xzrlf3wQc= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3120 - O Velho E Aflor - - 275121 - 2Ao5VV9ga96JFAy6o2Ov/dg= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3121 - Cotidiano N 2 - - 55902 - XuHEW5XBf9L7wvkxNROMDRAr2g== - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3122 - Adeus - - 221884 - 3HdHfZRNhw== - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3123 - Samba Pra Endrigo - - 259265 - yEFDsH+mYiYwfHR41oxkqOVX - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3124 - So Por Amor - - 236591 - +C6WU4Qj73Tm - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3125 - Meu Pranto Rolou - - 181760 - R8dHOScKuX5I - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3126 - Mulher Carioca - - 191686 - jrFm3JO2YRE= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3127 - Um Homem Chamado Alfredo - - 151640 - E56YPG6OKTHuvw== - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3128 - Samba Do Jato - - 220813 - jzF7i+m1LT4= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3129 - Oi, La - - 167053 - gqspnKVQR8i6v87B3iXT+6+K - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3130 - Vinicius, Poeta Do Encontro - - 336431 - qv3Zyr+7Ilw= - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3131 - Soneto Da Separacao - - 193880 - 2vLeiSNizWd0+5cd - 0.9900000000000000000 - 247 - 1 - 7 - 1 - - - 3132 - Still Of The Night - Sykes - 398210 - YXYu8MuxDKiQOipUkw== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3133 - Here I Go Again - Marsden - 233874 - qOBq4YPzEe3H4UWee1hshrPzuw== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3134 - Is This Love - Sykes - 283924 - nGKbzvBwUI1JuLQ= - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3135 - Love Ain't No Stranger - Galley - 259395 - j7EkhgoaFA== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3136 - Looking For Love - Sykes - 391941 - NXOuTassNbQ7Coc= - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3137 - Now You're Gone - Vandenberg - 251141 - mDAURkSc8RKjhKQPLBAOyQ== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3138 - Slide It In - Coverdale - 202475 - 5XuY35AtKQ== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3139 - Slow An' Easy - Moody - 367255 - TiLDO5xRPw== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3140 - Judgement Day - Vandenberg - 317074 - fZxfnd5BbikCh7A= - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3141 - You're Gonna Break My Hart Again - Sykes - 250853 - nyCbHWyAVg== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3142 - The Deeper The Love - Vandenberg - 262791 - 7lcIAuuR9nkt1wc= - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3143 - Crying In The Rain - Coverdale - 337005 - ZN6vdK8sVaQNb90JfA== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3144 - Fool For Your Loving - Marsden/Moody - 250801 - FS2Hps4c+7FDJpNcsUxK9PsrgA== - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3145 - Sweet Lady Luck - Vandenberg - 273737 - asBxJ21AKrKAfno= - 0.9900000000000000000 - 141 - 1 - 3 - 1 - - - 3146 - Faixa Amarela - Beto Gogo/Jessé Pai/Luiz Carlos/Zeca Pagodinho - 240692 - hZF8yfKHCOo4s5s= - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3147 - Posso Até Me Apaixonar - Dudu Nobre - 200698 - 4FN6CVkZc7KJ - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3148 - Não Sou Mais Disso - Jorge Aragão/Zeca Pagodinho - 225985 - 71S8XziO8UgwxKyV1g== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3149 - Vivo Isolado Do Mundo - Alcides Dias Lopes - 180035 - z4EBdCKVRLYl6EcaxSA= - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3150 - Coração Em Desalinho - Mauro Diniz/Ratino Sigem - 185208 - ZgrHdIahKA== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3151 - Seu Balancê - Paulinho Rezende/Toninho Geraes - 219454 - kk55+O+D1g== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3152 - Vai Adiar - Alcino Corrêa/Monarco - 270393 - SnxZOtcX/w== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3153 - Rugas - Augusto Garcez/Nelson Cavaquinho - 140930 - 9Lo5LtMYHcjR78m55CA= - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3154 - Feirinha da Pavuna/Luz do Repente/Bagaço da Laranja - Arlindo Cruz/Franco/Marquinhos PQD/Negro, Jovelina Pérolo/Zeca Pagodinho - 107206 - fqZ0biWonFUyTwv8nmzm - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3155 - Sem Essa de Malandro Agulha - Aldir Blanc/Jayme Vignoli - 158484 - Tws4gMtn+Tl6MbEn/7kc+A== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3156 - Chico Não Vai na Corimba - Dudu Nobre/Zeca Pagodinho - 269374 - K9qTYqjZ5lhlBt/IHH5c - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3157 - Papel Principal - Almir Guineto/Dedé Paraiso/Luverci Ernesto - 217495 - bnqurKCEF6w79PT3 - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3158 - Saudade Louca - Acyr Marques/Arlindo Cruz/Franco - 243591 - VXkyEtJzkVMfpjJRKA== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3159 - Camarão que Dorme e Onda Leva - Acyi Marques/Arlindo Bruz/Braço, Beto Sem/Zeca Pagodinho - 299102 - YRpwXrJVPZE/bkyIpsPm - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3160 - Sapopemba e Maxambomba - Nei Lopes/Wilson Moreira - 245394 - s+Tv4w+NrLZJC8qXT9N7Wng= - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3161 - Minha Fé - Murilão - 206994 - tpLLlkKiN8Q5xMY= - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3162 - Lua de Ogum - Ratinho/Zeca Pagodinho - 168463 - zM5s+PJNYQ== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3163 - Samba pras moças - Grazielle/Roque Ferreira - 152816 - V9NtuhSmiqZCa/Lx - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3164 - Verdade - Carlinhos Santana/Nelson Rufino - 332826 - iA1UWx2iTQ== - 0.9900000000000000000 - 248 - 1 - 7 - 1 - - - 3165 - The Brig - - 2617325 - SlPo7/8//CpW4S75NA== - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3166 - .07% - - 2585794 - 4iURgpsXkILO0tQ5RMAYnA== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 3167 - Five Years Gone - - 2587712 - qxSXDX+EyhVnjnvr - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 3168 - The Hard Part - - 2601017 - xPjbwSovSpsGNRvHhQ== - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 3169 - The Man Behind the Curtain - - 2615990 - G8X6OxG5C4LknLli - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3170 - Greatest Hits - - 2617117 - Rmw0iRWWQw0= - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3171 - Landslide - - 2600725 - XoOV6VI6pd98Rfo= - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 3172 - The Office: An American Workplace (Pilot) - - 1380833 - r1BsUmkxfkEUPwfIjw== - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3173 - Diversity Day - - 1306416 - LtGsBjFBCD5md6YoZ9E= - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3174 - Health Care - - 1321791 - BSB0aDGXHMg3q2TEzA== - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3175 - The Alliance - - 1317125 - H3vNWk4L0zN1 - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3176 - Basketball - - 1323541 - uGZw6fSsQcqtYw4= - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3177 - Hot Girl - - 1325458 - k19daxEJdVvMfTt2R/zYzhjFCQ== - 1.9900000000000000000 - 249 - 3 - 19 - 2 - - - 3178 - The Dundies - - 1253541 - ql+wyycz04o= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3179 - Sexual Harassment - - 1294541 - mhdouQDnbvzj+sq+Gkg6Kvk= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3180 - Office Olympics - - 1290458 - 99NzsuhaPHQ0rpI= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3181 - The Fire - - 1288166 - 3jXq8TFl071HFWrR - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3182 - Halloween - - 1315333 - yz8UkBd1oS2S27c= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3183 - The Fight - - 1320028 - 6C8OfIuzwGqeG5XTKBbUVw== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3184 - The Client - - 1299341 - WeJpoXwcGyjkHDjw - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3185 - Performance Review - - 1292458 - TFkz+kk2xEC7Yqlmlq+pQGc= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3186 - Email Surveillance - - 1328870 - oEnxOPlNVGs= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3187 - Christmas Party - - 1282115 - 81Onlod5h887oC3M - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3188 - Booze Cruise - - 1267958 - kvuegL875m1x6A== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3189 - The Injury - - 1275275 - G5emJRNg5aXeJNHtFMwi7A== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3190 - The Secret - - 1264875 - 322fOTQCt/WaeY0ZhaWCayp68A== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3191 - The Carpet - - 1264375 - YrvbuofuesEOirSdTteNA0hC5w== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3192 - Boys and Girls - - 1278333 - 7y9551iMWH5OgulRMhmsJJLl - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3193 - Valentine's Day - - 1270375 - RYj15w/E8MuuGH4i55Nb4zJC9A== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3194 - Dwight's Speech - - 1278041 - +5X7cougYg== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3195 - Take Your Daughter to Work Day - - 1268333 - NSppcGOQoQz5SGkiaMGqZtBfAQ== - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3196 - Michael's Birthday - - 1237791 - 1zZ64p6Dtq+Ng1tvYoU= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3197 - Drug Testing - - 1278625 - g68Ov1bxTuk= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3198 - Conflict Resolution - - 1274583 - 2NH5OuqUoiw= - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3199 - Casino Night - Season Finale - - 1712791 - pZP+r4bS4Nrxfnbs - 1.9900000000000000000 - 250 - 3 - 19 - 2 - - - 3200 - Gay Witch Hunt - - 1326534 - wOMqJ7fBoKrLiEyQCcyJew== - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3201 - The Convention - - 1297213 - +eAvz7zxl9MoO998/89z/d0R - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3202 - The Coup - - 1276526 - D8Pc4Iv02QuyH30FVl8thQ== - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3203 - Grief Counseling - - 1282615 - vSsD8ZNTj4bBLsy42ZIs - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3204 - The Initiation - - 1280113 - cmsAHACj2uPm5LSrNYgd0ko= - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3205 - Diwali - - 1279904 - QLIOJXxwTVrKxg1S2YxQSw== - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3206 - Branch Closing - - 1822781 - 8yxplRlQIAuun+RQOBH5bvs= - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3207 - The Merger - - 1801926 - eaxN75DPpdgU1ZMLJ1rq - 1.9900000000000000000 - 251 - 3 - 19 - 2 - - - 3208 - The Convict - - 1273064 - KabgSCZi7RrN0WgJkrUT5N061w== - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3209 - A Benihana Christmas, Pts. 1 & 2 - - 2519436 - lgObme9BO0p3o3c= - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3210 - Back from Vacation - - 1271688 - ZpPnU42zLBe/MyK+ - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3211 - Traveling Salesmen - - 1289039 - nEZfwa8t7YJMDiYKR1g= - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3212 - Producer's Cut: The Return - - 1700241 - JqKiKlreow== - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3213 - Ben Franklin - - 1271938 - zcBWKg3A32Lh3TNT+9yIx3WKBw== - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3214 - Phyllis's Wedding - - 1271521 - hMFIRlpH8A== - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3215 - Business School - - 1302093 - kPdkiPhHkQFYA9/CbatE - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3216 - Cocktails - - 1272522 - EwXpSRnatc/WiXoMeBDQxs/C0Q== - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3217 - The Negotiation - - 1767851 - eatatEuHb3GqRa3YfBsy - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3218 - Safety Training - - 1271229 - XaYCtkKUsW/MhIlIMxjy - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3219 - Product Recall - - 1268268 - 2lqzaKs1/ZFrQyWR3KE= - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3220 - Women's Appreciation - - 1732649 - XN57aSi/G6fk+ernx/4mPpFS - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3221 - Beach Games - - 1676134 - /iFnyagnqHBK/m8g - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3222 - The Job - - 2541875 - K/Qsarevyuq+s88= - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3223 - How to Stop an Exploding Man - - 2687103 - wU42k0QFkz7Z - 1.9900000000000000000 - 228 - 3 - 21 - 2 - - - 3224 - Through a Looking Glass - - 5088838 - bvQU0kF/TtGoddlXu9LS - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3225 - Your Time Is Gonna Come - Page, Jones - 310774 - huKIF0BtmFrn2XLdBQ== - 0.9900000000000000000 - 252 - 2 - 1 - 1 - - - 3226 - Battlestar Galactica, Pt. 1 - - 2952702 - 3OG5iIY4VeU= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3227 - Battlestar Galactica, Pt. 2 - - 2956081 - SpztC1mVapJkwYh+sLbC - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3228 - Battlestar Galactica, Pt. 3 - - 2927802 - AFu56mcNccuvmPed - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3229 - Lost Planet of the Gods, Pt. 1 - - 2922547 - S5lmoXM9e1JiP8R9Rg0cfXor - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3230 - Lost Planet of the Gods, Pt. 2 - - 2914664 - 9yaG3Jz6BjwrIQ== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3231 - The Lost Warrior - - 2920045 - wJ7MXxgnId09eEcP - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3232 - The Long Patrol - - 2925008 - HPVsIQBUTjVtzKY= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3233 - The Gun On Ice Planet Zero, Pt. 1 - - 2907615 - xbzKpmwATzEHfiax5g== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3234 - The Gun On Ice Planet Zero, Pt. 2 - - 2924341 - 9Fuc7bKvF+nAp43lPA== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3235 - The Magnificent Warriors - - 2924716 - 0yVT0SVTU2pXNtB39w== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3236 - The Young Lords - - 2863571 - lZ7OuzoLX/KYfxk= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3237 - The Living Legend, Pt. 1 - - 2924507 - 9dz8IxmHxHld4SpUi5OgigNl - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3238 - The Living Legend, Pt. 2 - - 2923298 - O7g4UyLY0qowdg== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3239 - Fire In Space - - 2926593 - jdS4Ll13bjQdSbM= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3240 - War of the Gods, Pt. 1 - - 2922630 - gbRzei+natXuM2LePryJ2Uo= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3241 - War of the Gods, Pt. 2 - - 2923381 - 3ZMCe1RWnF01KRs= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3242 - The Man With Nine Lives - - 2956998 - SNSIOreerl6iAsY= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3243 - Murder On the Rising Star - - 2935894 - 8llx2vCh7pTp1WsfegVfHN0= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3244 - Greetings from Earth, Pt. 1 - - 2960293 - ckG6H+qOVQMF6ivspNs= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3245 - Greetings from Earth, Pt. 2 - - 2903778 - YYn65MJslDuG - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3246 - Baltar's Escape - - 2922088 - cmhov7I/kYDPj4Tm - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3247 - Experiment In Terra - - 2923548 - b+OE7JsDaf0wkFI= - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3248 - Take the Celestra - - 2927677 - fGU4G2beBTM5eCXtQ1OrmWvVSw== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3249 - The Hand of God - - 2924007 - e7WLAT1/+Dcd5w== - 1.9900000000000000000 - 253 - 3 - 20 - 2 - - - 3250 - Pilot - - 2484567 - 2BWmNdlZZGmwf7OZ9w== - 1.9900000000000000000 - 254 - 3 - 19 - 2 - - - 3251 - Through the Looking Glass, Pt. 2 - - 2617117 - lqlIWM+SW0QKncbZ - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3252 - Through the Looking Glass, Pt. 1 - - 2610860 - 3ubmzhVSNkw= - 1.9900000000000000000 - 229 - 3 - 21 - 2 - - - 3253 - Instant Karma - - 193188 - nB3RPwZrmg== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3254 - #9 Dream - - 278312 - yByUQqfWr94= - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3255 - Mother - - 287740 - VeWTCwlv/yKGg8qxnUc= - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3256 - Give Peace a Chance - - 274644 - cb4MKoeQi/CqQQ== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3257 - Cold Turkey - - 281424 - qkX0NhA278j8UQ== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3258 - Whatever Gets You Thru the Night - - 215084 - zJOu0R2A6M8Y - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3259 - I'm Losing You - - 240719 - 1dTR6MmEV73K9enJNMW6Lk9z - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3260 - Gimme Some Truth - - 232778 - wdVKb7jxeXy1cg== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3261 - Oh, My Love - - 159473 - CNopqtRxI05G - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3262 - Imagine - - 192329 - lwoyW88CX+gX7zB1 - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3263 - Nobody Told Me - - 210348 - VlWLZBj2UAihSr7tD6CJ - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3264 - Jealous Guy - - 239094 - SAoBLOIpyhcT6O4Zk56D - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3265 - Working Class Hero - - 265449 - kp7SVEkMClf1qfbAdG7AYtX4zg== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3266 - Power to the People - - 213018 - LkhYLIt0US8INnQDxuNa - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3267 - Imagine - - 219078 - zTWnO/+qNjkzCqKlKIxDm8+f - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3268 - Beautiful Boy - - 227995 - SkWmydW72k++NPP5kA== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3269 - Isolation - - 156059 - T5SgUJLkgxEf+IHRqwc= - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3270 - Watching the Wheels - - 198645 - 8tgzJzcPKydr0oAlW3cEQBA= - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3271 - Grow Old With Me - - 149093 - ktn3o0o8uig4Jq1IAxDT - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3272 - Gimme Some Truth - - 187546 - y1y/0VgDJG00 - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3273 - (Just Like) Starting Over - - 215549 - Er8omRq4cL4ZLYRPjvZt - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3274 - God - - 260410 - 1wR5I85vUYirqIA/uY61iW4= - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3275 - Real Love - - 236911 - KvoAnwz11w== - 0.9900000000000000000 - 255 - 2 - 9 - 1 - - - 3276 - Sympton of the Universe - - 340890 - 96VOfM3JY0os - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3277 - Snowblind - - 295960 - 9BGwo26f7XE3MQQ= - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3278 - Black Sabbath - - 364180 - ePrhwcxzDjj4hEuJeKs5L9q3 - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3279 - Fairies Wear Boots - - 392764 - b2GWlV0bh4xgsZq9pg== - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3280 - War Pigs - - 515435 - bC1Umwv88Dv0Jg== - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3281 - The Wizard - - 282678 - xScqwma+l39VlSniZYSmReauhg== - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3282 - N.I.B. - - 335248 - xqVIDH7llM676jM= - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3283 - Sweet Leaf - - 354706 - byWX9FzJ+fID - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3284 - Never Say Die - - 258343 - UapDS+8XZbcKjW3I - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3285 - Sabbath, Bloody Sabbath - - 333622 - IN4eRIEqyMRqYbtyP+w= - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3286 - Iron Man/Children of the Grave - - 552308 - 6By0lFuHVJ7JM/V9aA== - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3287 - Paranoid - - 189171 - 4Kb/p3t3Fj6FeMg7euZJh9ivKg== - 0.9900000000000000000 - 256 - 2 - 1 - 1 - - - 3288 - Rock You Like a Hurricane - - 255766 - zu3Y2W0hy0BUEQ== - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3289 - No One Like You - - 240325 - rF/Airq8y8N0m6mWPMsg - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3290 - The Zoo - - 332740 - blRCWkVStDXyzSY6WqzW - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3291 - Loving You Sunday Morning - - 339125 - dOwb27pbjg== - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3292 - Still Loving You - - 390674 - DOy2GSRWnA1NFF3rErZF - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3293 - Big City Nights - - 251865 - qoqX7ZaRacjEvyJP - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3294 - Believe in Love - - 325774 - RFMSxndOWZubEJwwGOxGTuo= - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3295 - Rhythm of Love - - 231246 - vqfBMC/EoTR7g+5UZDRN - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3296 - I Can't Explain - - 205332 - CMBKJZpo7L4Pevu8faQjedro - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3297 - Tease Me Please Me - - 287229 - qO4TJE4lQ9LWrUerZ+O65A== - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3298 - Wind of Change - - 315325 - A8U8VroCIbTJ5LbWX3R6fNA= - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3299 - Send Me an Angel - - 273041 - b/Wc/ABXlRUQ - 0.9900000000000000000 - 257 - 2 - 1 - 1 - - - 3300 - Jump Around - E. Schrody/L. Muggerud - 217835 - zpPYw8CddhSr - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3301 - Salutations - E. Schrody/L. Dimant - 69120 - 7evxb4VAjPx2Ocwu - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3302 - Put Your Head Out - E. Schrody/L. Freese/L. Muggerud - 182230 - Pkru6QbE5cGl - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3303 - Top O' The Morning To Ya - E. Schrody/L. Dimant - 216633 - WeU1C/MVwv1l0cO3gwMsd8DK - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3304 - Commercial 1 - L. Muggerud - 7941 - ntf7oPuaeNGzb0/FTEf5mIo= - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3305 - House And The Rising Sun - E. Schrody/J. Vasquez/L. Dimant - 219402 - NJnmsztnXdOGx+q9 - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3306 - Shamrocks And Shenanigans - E. Schrody/L. Dimant - 218331 - BBooBhpeRTlxekMPjhUL - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3307 - House Of Pain Anthem - E. Schrody/L. Dimant - 155611 - cIproSeMMLLqm5NCKBSx5/Xf - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3308 - Danny Boy, Danny Boy - E. Schrody/L. Muggerud - 114520 - qyRB3zlEFcIf - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3309 - Guess Who's Back - E. Schrody/L. Muggerud - 238393 - pK1SUl0WPH8bZ3jqdht+ygMRXA== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3310 - Commercial 2 - L. Muggerud - 21211 - XBmuymBSL6sx - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3311 - Put On Your Shit Kickers - E. Schrody/L. Muggerud - 190432 - EskRD0buQe/L/nRn2XfSwa4lYA== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3312 - Come And Get Some Of This - E. Schrody/L. Muggerud/R. Medrano - 170475 - QQNlVkaK/ofyCuaRTQ== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3313 - Life Goes On - E. Schrody/R. Medrano - 163030 - Va/YZ9WQiBNGXlT0Pzb3n6QJSg== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3314 - One For The Road - E. Schrody/L. Dimant/L. Muggerud - 170213 - Gw5ju8i78Ln9wBc= - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3315 - Feel It - E. Schrody/R. Medrano - 239908 - GhoiI+hGUNDmLrwHAVFKxw== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3316 - All My Love - E. Schrody/L. Dimant - 200620 - U2XdR4qjRks= - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3317 - Jump Around (Pete Rock Remix) - E. Schrody/L. Muggerud - 236120 - nhmgzhaGR3Ha - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3318 - Shamrocks And Shenanigans (Boom Shalock Lock Boom/Butch Vig Mix) - E. Schrody/L. Dimant - 237035 - FNS2Xbl62w== - 0.9900000000000000000 - 258 - 1 - 17 - 1 - - - 3319 - Instinto Colectivo - - 300564 - Uly6d3AoKapbOZs= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3320 - Chapa o Coco - - 143830 - d9zXy6g2MBgYNr+PdyWz - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3321 - Prostituta - - 359000 - nAcjzK+29O9jJ6h3pA== - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3322 - Eu So Queria Sumir - - 269740 - Kg3WSq04/eu1gkrD1RucKv8= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3323 - Tres Reis - - 304143 - dW4NUxbO4MHn52iBjbhzrA== - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3324 - Um Lugar ao Sol - - 212323 - srkseHu+sVKgguzg2FI4J14= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3325 - Batalha Naval - - 285727 - Nl7X9wdq7FAVgzP0 - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3326 - Todo o Carnaval tem seu Fim - - 237426 - TykP6nHT0vmwXAB1 - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3327 - O Misterio do Samba - - 226142 - 8+AOlC9aL7Y8Tg== - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3328 - Armadura - - 232881 - urHCiyuoLR+s8Zy3yWfGVIsIhg== - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3329 - Na Ladeira - - 221570 - 14K7dgxBgFPZxNsT29sw - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3330 - Carimbo - - 328751 - EEbOCC7gyVs= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3331 - Catimbo - - 254484 - KEUtaAakrbZMXDj2S3/pJ9k= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3332 - Funk de Bamba - - 237322 - 5xWI3O03BkNEOX7T9rhgHuP7 - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3333 - Chega no Suingue - - 221805 - 69MgLV2Of/fJxMfl4FSb4UXO - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3334 - Mun-Ra - - 274651 - V/Vhwl9zN3llf5Ytm+3T7nLG6A== - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3335 - Freestyle Love - - 318484 - Tm5APH59VJ1+W9caT5c= - 0.9900000000000000000 - 259 - 1 - 15 - 1 - - - 3336 - War Pigs - - 234013 - XokQwbolFRk= - 0.9900000000000000000 - 260 - 4 - 23 - 1 - - - 3337 - Past, Present, and Future - - 2492867 - M5cr9w1mKBtco/3ptSRE4R4= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3338 - The Beginning of the End - - 2611903 - +wmoe90ESXRkYgU= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3339 - LOST Season 4 Trailer - - 112712 - BjlUyAnnUl2P - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3340 - LOST In 8:15 - - 497163 - M7u9rJm6qWXM35s= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3341 - Confirmed Dead - - 2611986 - Gg/PuLknrg== - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3342 - The Economist - - 2609025 - AcYWLp3ElewbXY/BCuLW7L0xag== - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3343 - Eggtown - - 2608817 - y/+WJZJ7H0T5UC0qr/YXbaWPDw== - 1.9900000000000000000 - 261 - 3 - 19 - 2 - - - 3344 - The Constant - - 2611569 - JbxJb1DZgA== - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3345 - The Other Woman - - 2605021 - OeL7iLwfzQEw8Js= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3346 - Ji Yeon - - 2588797 - pVDzyi9kEhPLaUcuIpVpDrUm1Q== - 1.9900000000000000000 - 261 - 3 - 19 - 2 - - - 3347 - Meet Kevin Johnson - - 2612028 - +ucLFlWkbo8pFT0= - 1.9900000000000000000 - 261 - 3 - 19 - 2 - - - 3348 - The Shape of Things to Come - - 2591299 - 8+0v1cl/P+vGbGvPms0= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3349 - Amanda - Luca Gusella - 246503 - J7W/TAkb4ie9 - 0.9900000000000000000 - 262 - 5 - 2 - 1 - - - 3350 - Despertar - Andrea Dulbecco - 307385 - 3HWK9oLqtiyTOjVl - 0.9900000000000000000 - 262 - 5 - 2 - 1 - - - 3351 - Din Din Wo (Little Child) - Habib Koité - 285837 - RTbn6fKOfDw= - 0.9900000000000000000 - 263 - 5 - 16 - 1 - - - 3352 - Distance - Karsh Kale/Vishal Vaid - 327122 - iD5G2mnJNJkRxXE= - 0.9900000000000000000 - 264 - 5 - 15 - 1 - - - 3353 - I Guess You're Right - Darius "Take One" Minwalla/Jon Auer/Ken Stringfellow/Matt Harris - 212044 - 7Am09USBtaMHkjHBIXkVITHvmQ== - 0.9900000000000000000 - 265 - 5 - 1 - 1 - - - 3354 - I Ka Barra (Your Work) - Habib Koité - 300605 - CGDtTK+ogO34+Slv9ANYLDL0rg== - 0.9900000000000000000 - 263 - 5 - 16 - 1 - - - 3355 - Love Comes - Darius "Take One" Minwalla/Jon Auer/Ken Stringfellow/Matt Harris - 199923 - xph09Q2FuA== - 0.9900000000000000000 - 265 - 5 - 1 - 1 - - - 3356 - Muita Bobeira - Luciana Souza - 172710 - sxJnISwviIwcaEWbAcirDWjC - 0.9900000000000000000 - 266 - 5 - 7 - 1 - - - 3357 - OAM's Blues - Aaron Goldberg - 266936 - HiHo7jxBjXtv6/c+KvCROeU= - 0.9900000000000000000 - 267 - 5 - 2 - 1 - - - 3358 - One Step Beyond - Karsh Kale - 366085 - CELFeswPyq8SCv7tZ4xLuJnOyg== - 0.9900000000000000000 - 264 - 5 - 15 - 1 - - - 3359 - Symphony No. 3 in E-flat major, Op. 55, "Eroica" - Scherzo: Allegro Vivace - Ludwig van Beethoven - 356426 - K9+ftBigJSoaqnCOxQ== - 0.9900000000000000000 - 268 - 5 - 24 - 1 - - - 3360 - Something Nice Back Home - - 2612779 - YH8Ho1TZJIwugnyChGry - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3361 - Cabin Fever - - 2612028 - VsJvwmYpohBh - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3362 - There's No Place Like Home, Pt. 1 - - 2609526 - 6p+UaJpwJ+s= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3363 - There's No Place Like Home, Pt. 2 - - 2497956 - y7D1evH+nrA= - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3364 - There's No Place Like Home, Pt. 3 - - 2582957 - N5YcujeoVK0fAxU33Q== - 1.9900000000000000000 - 261 - 3 - 21 - 2 - - - 3365 - Say Hello 2 Heaven - - 384497 - QijuhPfG5wxbmD4nwWBHfQ== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3366 - Reach Down - - 672773 - x3iF2csPL2jsE+xQJA== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3367 - Hunger Strike - - 246292 - 9O65s1ICeqfqNis7gw== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3368 - Pushin Forward Back - - 225278 - EOf0ZqE/Tb9XHXYYvhsLs/q7Ng== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3369 - Call Me a Dog - - 304458 - STgHrPV7SQ== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3370 - Times of Trouble - - 342539 - jk+tkIuzWAUfhq7kiDWW - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3371 - Wooden Jesus - - 250565 - PTpDXps3PG8EwTHX3w== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3372 - Your Savior - - 244226 - cSb2LDEIb+WMC8M= - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3373 - Four Walled World - - 414474 - k3MNUjkUoWtvujfrhFcSPozKgQ== - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3374 - All Night Thing - - 231803 - JdgVh+5cBI4sV604mpWjyGKy - 0.9900000000000000000 - 269 - 2 - 23 - 1 - - - 3375 - No Such Thing - Chris Cornell - 224837 - HTV02LbvC6fa9TFZwolC4A== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3376 - Poison Eye - Chris Cornell - 237120 - XoVj3Q8TPhcN/g== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3377 - Arms Around Your Love - Chris Cornell - 214016 - 77NK29pBZEqxAF+Y - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3378 - Safe and Sound - Chris Cornell - 256764 - tCqY+/3rrw== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3379 - She'll Never Be Your Man - Chris Cornell - 204078 - tehq3U6rDSI2 - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3380 - Ghosts - Chris Cornell - 231547 - qPC6uCarVX+BJPcu - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3381 - Killing Birds - Chris Cornell - 218498 - /+yAKOV7Qhki - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3382 - Billie Jean - Michael Jackson - 281401 - +DnK4P6LlVYoej+2 - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3383 - Scar On the Sky - Chris Cornell - 220193 - KPsD7KZ+aopghy1q8M2CKA== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3384 - Your Soul Today - Chris Cornell - 205959 - 9KaGocJ/W8pW9OvOz7N7SUVYLQ== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3385 - Finally Forever - Chris Cornell - 217035 - jpubuMSXsp11Dr0SLoE= - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3386 - Silence the Voices - Chris Cornell - 267376 - mS8GZXyoIk+KfryR07Ehq3VVRg== - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3387 - Disappearing Act - Chris Cornell - 273320 - WArO3CvMvVVINtigTSw= - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3388 - You Know My Name - Chris Cornell - 240255 - GT7zsTlsSxE5CAbf - 0.9900000000000000000 - 270 - 2 - 23 - 1 - - - 3389 - Revelations - - 252376 - U2JIvedpLo4= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3390 - One and the Same - - 217732 - Kjqv6swHVKYcRKbPB2w= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3391 - Sound of a Gun - - 260154 - ow2sDPmV0yTt0QHl7Rq45P1UuQ== - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3392 - Until We Fall - - 230758 - uAFPn0S9k+zCOBxM9cY= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3393 - Original Fire - - 218916 - 2rwilMtWFcEYyyFmi2NfqHtO - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3394 - Broken City - - 228366 - yaK9Dcc7AuditQ== - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3395 - Somedays - - 213831 - tfAmAN4n27/uvqI/N9MjVgeJYg== - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3396 - Shape of Things to Come - - 274597 - of2d/Xccr1pYyW+yDGMV - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3397 - Jewel of the Summertime - - 233242 - QIqEN827YJkmYoY= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3398 - Wide Awake - - 266308 - pOX6XQAlE7dS - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3399 - Nothing Left to Say But Goodbye - - 213041 - icJ4gGYkTvAz077xFn0EKsI= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3400 - Moth - - 298049 - nQPXFZV2tnPOEbLmUF7eFwE= - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3401 - Show Me How to Live (Live at the Quart Festival) - - 301974 - v0xVO0s2LrN7ss58 - 0.9900000000000000000 - 271 - 2 - 23 - 1 - - - 3402 - Band Members Discuss Tracks from "Revelations" - - 294294 - 1WMtGk9Rcy0ByvJVPT1M - 0.9900000000000000000 - 271 - 3 - 23 - 2 - - - 3403 - Intoitus: Adorate Deum - Anonymous - 245317 - XxL+e0FrdpBiuKDm4vsDpA== - 0.9900000000000000000 - 272 - 2 - 24 - 1 - - - 3404 - Miserere mei, Deus - Gregorio Allegri - 501503 - t9yDIkOPxY2VvYFj5Q344i8bnw== - 0.9900000000000000000 - 273 - 2 - 24 - 1 - - - 3405 - Canon and Gigue in D Major: I. Canon - Johann Pachelbel - 271788 - ARdq7Z24lrCMSwbHTQOFYMhhHA== - 0.9900000000000000000 - 274 - 2 - 24 - 1 - - - 3406 - Concerto No. 1 in E Major, RV 269 "Spring": I. Allegro - Antonio Vivaldi - 199086 - OO2srfQsfKqoBLI= - 0.9900000000000000000 - 275 - 2 - 24 - 1 - - - 3407 - Concerto for 2 Violins in D Minor, BWV 1043: I. Vivace - Johann Sebastian Bach - 193722 - Y9RQoHKWhQ== - 0.9900000000000000000 - 276 - 2 - 24 - 1 - - - 3408 - Aria Mit 30 Veränderungen, BWV 988 "Goldberg Variations": Aria - Johann Sebastian Bach - 120463 - +RUBSra6FeE= - 0.9900000000000000000 - 277 - 2 - 24 - 1 - - - 3409 - Suite for Solo Cello No. 1 in G Major, BWV 1007: I. Prélude - Johann Sebastian Bach - 143288 - lxnO/hyWE2u9+XA76wiImA== - 0.9900000000000000000 - 278 - 2 - 24 - 1 - - - 3410 - The Messiah: Behold, I Tell You a Mystery... The Trumpet Shall Sound - George Frideric Handel - 582029 - ZHiz5e4y25GKI+xi9jkX - 0.9900000000000000000 - 279 - 2 - 24 - 1 - - - 3411 - Solomon HWV 67: The Arrival of the Queen of Sheba - George Frideric Handel - 197135 - IxDq5OFGPQ== - 0.9900000000000000000 - 280 - 2 - 24 - 1 - - - 3412 - "Eine Kleine Nachtmusik" Serenade In G, K. 525: I. Allegro - Wolfgang Amadeus Mozart - 348971 - NbWdFE8NDHixkFacLg== - 0.9900000000000000000 - 281 - 2 - 24 - 1 - - - 3413 - Concerto for Clarinet in A Major, K. 622: II. Adagio - Wolfgang Amadeus Mozart - 394482 - qefybZJzJg== - 0.9900000000000000000 - 282 - 2 - 24 - 1 - - - 3414 - Symphony No. 104 in D Major "London": IV. Finale: Spiritoso - Franz Joseph Haydn - 306687 - xr9YoMj3nbNFHTs= - 0.9900000000000000000 - 283 - 4 - 24 - 1 - - - 3415 - Symphony No.5 in C Minor: I. Allegro con brio - Ludwig van Beethoven - 392462 - sDmUxkJ8FnOwZuN7bIE= - 0.9900000000000000000 - 284 - 2 - 24 - 1 - - - 3416 - Ave Maria - Franz Schubert - 338243 - AvJztMoWLO7evK5FFNr+SjhhuA== - 0.9900000000000000000 - 285 - 2 - 24 - 1 - - - 3417 - Nabucco: Chorus, "Va, Pensiero, Sull'ali Dorate" - Giuseppe Verdi - 274504 - cFIrKxVcsldg3N0= - 0.9900000000000000000 - 286 - 2 - 24 - 1 - - - 3418 - Die Walküre: The Ride of the Valkyries - Richard Wagner - 189008 - R5GbwNFpcF4= - 0.9900000000000000000 - 287 - 2 - 24 - 1 - - - 3419 - Requiem, Op.48: 4. Pie Jesu - Gabriel Fauré - 258924 - SrYKkzcBmLIbqhmzj/awx0iebg== - 0.9900000000000000000 - 288 - 2 - 24 - 1 - - - 3420 - The Nutcracker, Op. 71a, Act II: Scene 14: Pas de deux: Dance of the Prince & the Sugar-Plum Fairy - Peter Ilyich Tchaikovsky - 304226 - 1Y4C3nr9gz89ec/xWW0lnCCX - 0.9900000000000000000 - 289 - 2 - 24 - 1 - - - 3421 - Nimrod (Adagio) from Variations On an Original Theme, Op. 36 "Enigma" - Edward Elgar - 250031 - WhqlRTHDgLea6vmJygI= - 0.9900000000000000000 - 290 - 2 - 24 - 1 - - - 3422 - Madama Butterfly: Un Bel Dì Vedremo - Giacomo Puccini - 277639 - rry0LBk6fVl0otooWSLQFKaw - 0.9900000000000000000 - 291 - 2 - 24 - 1 - - - 3423 - Jupiter, the Bringer of Jollity - Gustav Holst - 522099 - E0kvSdAa+kbp - 0.9900000000000000000 - 292 - 2 - 24 - 1 - - - 3424 - Turandot, Act III, Nessun dorma! - Giacomo Puccini - 176911 - Q+8F71++aefzfqPcwTGjVps= - 0.9900000000000000000 - 293 - 2 - 24 - 1 - - - 3425 - Adagio for Strings from the String Quartet, Op. 11 - Samuel Barber - 596519 - lMnWU9gJ7rF/cg== - 0.9900000000000000000 - 294 - 2 - 24 - 1 - - - 3426 - Carmina Burana: O Fortuna - Carl Orff - 156710 - Eh/zlAQwstU5+g== - 0.9900000000000000000 - 295 - 2 - 24 - 1 - - - 3427 - Fanfare for the Common Man - Aaron Copland - 198064 - ZyyyMh03iA== - 0.9900000000000000000 - 296 - 2 - 24 - 1 - - - 3428 - Branch Closing - - 1814855 - pnl/07EgffA= - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3429 - The Return - - 1705080 - /ACuPvYD4V6v - 1.9900000000000000000 - 251 - 3 - 22 - 2 - - - 3430 - Toccata and Fugue in D Minor, BWV 565: I. Toccata - Johann Sebastian Bach - 153901 - vADwgWErMGI= - 0.9900000000000000000 - 297 - 2 - 24 - 1 - - - 3431 - Symphony No.1 in D Major, Op.25 "Classical", Allegro Con Brio - Sergei Prokofiev - 254001 - oKbrtiiBzGqS - 0.9900000000000000000 - 298 - 2 - 24 - 1 - - - 3432 - Scheherazade, Op. 35: I. The Sea and Sindbad's Ship - Nikolai Rimsky-Korsakov - 545203 - QnSGP5rYOEwlcCnQ023vy/0= - 0.9900000000000000000 - 299 - 2 - 24 - 1 - - - 3433 - Concerto No.2 in F Major, BWV1047, I. Allegro - Johann Sebastian Bach - 307244 - 9x2ogL3TUHARSg== - 0.9900000000000000000 - 300 - 2 - 24 - 1 - - - 3434 - Concerto for Piano No. 2 in F Minor, Op. 21: II. Larghetto - Frédéric Chopin - 560342 - vSmYTxJt0zbBVakp3gvxgM8= - 0.9900000000000000000 - 301 - 2 - 24 - 1 - - - 3435 - Cavalleria Rusticana \ Act \ Intermezzo Sinfonico - Pietro Mascagni - 243436 - fcdchBdzdaPBtrLv - 0.9900000000000000000 - 302 - 2 - 24 - 1 - - - 3436 - Karelia Suite, Op.11: 2. Ballade (Tempo Di Menuetto) - Jean Sibelius - 406000 - x+7GZ0aRgcAAG5U7X070yXTMUw== - 0.9900000000000000000 - 303 - 2 - 24 - 1 - - - 3437 - Piano Sonata No. 14 in C Sharp Minor, Op. 27, No. 2, "Moonlight": I. Adagio sostenuto - Ludwig van Beethoven - 391000 - npOCKTgSJdlvqx2E0g== - 0.9900000000000000000 - 304 - 2 - 24 - 1 - - - 3438 - Fantasia On Greensleeves - Ralph Vaughan Williams - 268066 - 4ToXo6vuThF9q8ZIuCSB2U3qXw== - 0.9900000000000000000 - 280 - 2 - 24 - 1 - - - 3439 - Das Lied Von Der Erde, Von Der Jugend - Gustav Mahler - 223583 - izRrnS40bKdRVP4RaTNtuQ== - 0.9900000000000000000 - 305 - 2 - 24 - 1 - - - 3440 - Concerto for Cello and Orchestra in E minor, Op. 85: I. Adagio - Moderato - Edward Elgar - 483133 - 0CBkMo0W1mLwWgBYlV4yJGOg - 0.9900000000000000000 - 306 - 2 - 24 - 1 - - - 3441 - Two Fanfares for Orchestra: II. Short Ride in a Fast Machine - John Adams - 254930 - z3p1doKmvyg= - 0.9900000000000000000 - 307 - 2 - 24 - 1 - - - 3442 - Wellington's Victory or the Battle Symphony, Op.91: 2. Symphony of Triumph - Ludwig van Beethoven - 412000 - td+Et8cofMn6PP4elDo+ - 0.9900000000000000000 - 308 - 2 - 24 - 1 - - - 3443 - Missa Papae Marcelli: Kyrie - Giovanni Pierluigi da Palestrina - 240666 - a0+89cvsBg== - 0.9900000000000000000 - 309 - 2 - 24 - 1 - - - 3444 - Romeo et Juliette: No. 11 - Danse des Chevaliers - - 275015 - wOo3W6rhjM3tKawR1UmRbeJp - 0.9900000000000000000 - 310 - 2 - 24 - 1 - - - 3445 - On the Beautiful Blue Danube - Johann Strauss II - 526696 - JqKOOj82nBZXAzPiyNnx99zw - 0.9900000000000000000 - 311 - 2 - 24 - 1 - - - 3446 - Symphonie Fantastique, Op. 14: V. Songe d'une nuit du sabbat - Hector Berlioz - 561967 - HxmwMTBrji0EIr4= - 0.9900000000000000000 - 312 - 2 - 24 - 1 - - - 3447 - Carmen: Overture - Georges Bizet - 132932 - EmLC3/AxsPglDco1ybk= - 0.9900000000000000000 - 313 - 2 - 24 - 1 - - - 3448 - Lamentations of Jeremiah, First Set \ Incipit Lamentatio - Thomas Tallis - 69194 - 4zfjUbR9wkk= - 0.9900000000000000000 - 314 - 2 - 24 - 1 - - - 3449 - Music for the Royal Fireworks, HWV351 (1749): La Réjouissance - George Frideric Handel - 120000 - dnBezrEImPSYtSB/BvoB - 0.9900000000000000000 - 315 - 2 - 24 - 1 - - - 3450 - Peer Gynt Suite No.1, Op.46: 1. Morning Mood - Edvard Grieg - 253422 - LPj6EU57Z3ck - 0.9900000000000000000 - 316 - 2 - 24 - 1 - - - 3451 - Die Zauberflöte, K.620: "Der Hölle Rache Kocht in Meinem Herze" - Wolfgang Amadeus Mozart - 174813 - 9SDQCdFQGLI= - 0.9900000000000000000 - 317 - 2 - 25 - 1 - - - 3452 - SCRIABIN: Prelude in B Major, Op. 11, No. 11 - - 101293 - f9PhRhx11pwTmcfdPeKL - 0.9900000000000000000 - 318 - 4 - 24 - 1 - - - 3453 - Pavan, Lachrimae Antiquae - John Dowland - 253281 - hMc3wvoJ5qkHE3cjj+PQZlQ= - 0.9900000000000000000 - 319 - 2 - 24 - 1 - - - 3454 - Symphony No. 41 in C Major, K. 551, "Jupiter": IV. Molto allegro - Wolfgang Amadeus Mozart - 362933 - gfNKsd6cd99T3lzM - 0.9900000000000000000 - 320 - 2 - 24 - 1 - - - 3455 - Rehab - - 213240 - PUWBTIng72127Dg/Cf2yDDDJ - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3456 - You Know I'm No Good - - 256946 - iaxhmD3T6ZtK - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3457 - Me & Mr. Jones - - 151706 - tQhMOls53g2XR4VkIw== - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3458 - Just Friends - - 191933 - BxJx1J7F0iMU+0M= - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3459 - Back to Black - Mark Ronson - 240320 - 3KxEeZ9FpVLB4+sF - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3460 - Love Is a Losing Game - - 154386 - xNT/mILbJYg= - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3461 - Tears Dry On Their Own - Nickolas Ashford & Valerie Simpson - 185293 - kSpiFPyFSJHz - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3462 - Wake Up Alone - Paul O'duffy - 221413 - 909dMcgepz8= - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3463 - Some Unholy War - - 141520 - 0UgjJ2wm2vDTipIgHoKFGw== - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3464 - He Can Only Hold Her - Richard Poindexter & Robert Poindexter - 166680 - FotJIAkw75oNXg== - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3465 - You Know I'm No Good (feat. Ghostface Killah) - - 202320 - ojZ62ptmtw5tA/btIZR1BmA= - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3466 - Rehab (Hot Chip Remix) - - 418293 - 2c3YFq4HG/Y= - 0.9900000000000000000 - 321 - 2 - 14 - 1 - - - 3467 - Intro / Stronger Than Me - - 234200 - yBg0jV7IdE2cEA== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3468 - You Sent Me Flying / Cherry - - 409906 - hLfLdq0XIA== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3469 - F**k Me Pumps - Salaam Remi - 200253 - J4uTKo5pNJGOjIhzv6XH7vY5dQ== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3470 - I Heard Love Is Blind - - 129666 - Ja1G2faorCEBYWiX5n3P - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3471 - (There Is) No Greater Love (Teo Licks) - Isham Jones & Marty Symes - 167933 - NO2mJCo35cETnPjf - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3472 - In My Bed - Salaam Remi - 315960 - 3YB0oYh4eUW5M+W8Eo8tI/E= - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3473 - Take the Box - Luke Smith - 199160 - Qda1uQiSUW3uyA== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3474 - October Song - Matt Rowe & Stefan Skarbek - 204846 - xVmwzTIk4fT2Xg== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3475 - What Is It About Men - Delroy "Chris" Cooper, Donovan Jackson, Earl Chinna Smith, Felix Howard, Gordon Williams, Luke Smith, Paul Watson & Wilburn Squiddley Cole - 209573 - Vc16ucBoGKe3nSIQtgk6Iw== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3476 - Help Yourself - Freddy James, Jimmy hogarth & Larry Stock - 300884 - 4U8birG/89o17uBr - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3477 - Amy Amy Amy (Outro) - Astor Campbell, Delroy "Chris" Cooper, Donovan Jackson, Dorothy Fields, Earl Chinna Smith, Felix Howard, Gordon Williams, James Moody, Jimmy McHugh, Matt Rowe, Salaam Remi & Stefan Skarbek - 663426 - L/suPYDoPk7S6VRGEOejSA== - 0.9900000000000000000 - 322 - 2 - 9 - 1 - - - 3478 - Slowness - - 215386 - xPcBahKmQnmjDYbf - 0.9900000000000000000 - 323 - 2 - 23 - 1 - - - 3479 - Prometheus Overture, Op. 43 - Ludwig van Beethoven - 339567 - eTg7bG4m4nmIUuQoDw== - 0.9900000000000000000 - 324 - 4 - 24 - 1 - - - 3480 - Sonata for Solo Violin: IV: Presto - Béla Bartók - 299350 - x0Oh2FCSOynoauEdVOvD3dq3 - 0.9900000000000000000 - 325 - 4 - 24 - 1 - - - 3481 - A Midsummer Night's Dream, Op.61 Incidental Music: No.7 Notturno - - 387826 - Rm8cC6R4fWZ/PKU= - 0.9900000000000000000 - 326 - 2 - 24 - 1 - - - 3482 - Suite No. 3 in D, BWV 1068: III. Gavotte I & II - Johann Sebastian Bach - 225933 - QQJAezUCNTZNT1BP0YpR0g== - 0.9900000000000000000 - 327 - 2 - 24 - 1 - - - 3483 - Concert pour 4 Parties de V**les, H. 545: I. Prelude - Marc-Antoine Charpentier - 110266 - tqp3LLnJ9qo4/F/SK7w= - 0.9900000000000000000 - 328 - 2 - 24 - 1 - - - 3484 - Adios nonino - Astor Piazzolla - 289388 - Qk2gGhNwjdqlgCL2H8w= - 0.9900000000000000000 - 329 - 2 - 24 - 1 - - - 3485 - Symphony No. 3 Op. 36 for Orchestra and Soprano "Symfonia Piesni Zalosnych" \ Lento E Largo - Tranquillissimo - Henryk Górecki - 567494 - GSerb8mRLfA= - 0.9900000000000000000 - 330 - 2 - 24 - 1 - - - 3486 - Act IV, Symphony - Henry Purcell - 364296 - OUrQ/QXVZCGTYwyD6ja+hSnP0g== - 0.9900000000000000000 - 331 - 2 - 24 - 1 - - - 3487 - 3 Gymnopédies: No.1 - Lent Et Grave, No.3 - Lent Et Douloureux - Erik Satie - 385506 - l9LX3f7jNye881oUXQ== - 0.9900000000000000000 - 332 - 2 - 24 - 1 - - - 3488 - Music for the Funeral of Queen Mary: VI. "Thou Knowest, Lord, the Secrets of Our Hearts" - Henry Purcell - 142081 - 4cmfkNXQHABju8A= - 0.9900000000000000000 - 333 - 2 - 24 - 1 - - - 3489 - Symphony No. 2: III. Allegro vivace - Kurt Weill - 376510 - L/Ht6Z/CWw== - 0.9900000000000000000 - 334 - 2 - 24 - 1 - - - 3490 - Partita in E Major, BWV 1006A: I. Prelude - Johann Sebastian Bach - 285673 - 8GZz8/4inTxloAn3JdFU9OY= - 0.9900000000000000000 - 335 - 2 - 24 - 1 - - - 3491 - Le Sacre Du Printemps: I.iv. Spring Rounds - Igor Stravinsky - 234746 - +gKOlm8cHUezRTo= - 0.9900000000000000000 - 336 - 2 - 24 - 1 - - - 3492 - Sing Joyfully - William Byrd - 133768 - U5i5GCd6VqyRszLgmw== - 0.9900000000000000000 - 314 - 2 - 24 - 1 - - - 3493 - Metopes, Op. 29: Calypso - Karol Szymanowski - 333669 - sciRXZ34AwbHWbZa91fVtg== - 0.9900000000000000000 - 337 - 2 - 24 - 1 - - - 3494 - Symphony No. 2, Op. 16 - "The Four Temperaments": II. Allegro Comodo e Flemmatico - Carl Nielsen - 286998 - VwGSTXA+DKrZnjkHR88= - 0.9900000000000000000 - 338 - 2 - 24 - 1 - - - 3495 - 24 Caprices, Op. 1, No. 24, for Solo Violin, in A Minor - Niccolò Paganini - 265541 - +6xqVLZWqELOTNFfYs2C/9baRA== - 0.9900000000000000000 - 339 - 2 - 24 - 1 - - - 3496 - Étude 1, In C Major - Preludio (Presto) - Liszt - - 51780 - 3wh1QImEs8Nayf6AigheSw== - 0.9900000000000000000 - 340 - 4 - 24 - 1 - - - 3497 - Erlkonig, D.328 - - 261849 - gQAYr7/DAJ/fqdxWnmM= - 0.9900000000000000000 - 341 - 2 - 24 - 1 - - - 3498 - Concerto for Violin, Strings and Continuo in G Major, Op. 3, No. 9: I. Allegro - Pietro Antonio Locatelli - 493573 - AvTO8jYpyzGi5OcFTlDVWg== - 0.9900000000000000000 - 342 - 4 - 24 - 1 - - - 3499 - Pini Di Roma (Pinien Von Rom) \ I Pini Della Via Appia - - 286741 - NxJV2iwrH0R1oarb1m0= - 0.9900000000000000000 - 343 - 2 - 24 - 1 - - - 3500 - String Quartet No. 12 in C Minor, D. 703 "Quartettsatz": II. Andante - Allegro assai - Franz Schubert - 139200 - ZtF9lTlsFMK1z3XK - 0.9900000000000000000 - 344 - 2 - 24 - 1 - - - 3501 - L'orfeo, Act 3, Sinfonia (Orchestra) - Claudio Monteverdi - 66639 - vrFOCk9uH4wNUtbJr63BiCFWzA== - 0.9900000000000000000 - 345 - 2 - 24 - 1 - - - 3502 - Quintet for Horn, Violin, 2 Violas, and Cello in E Flat Major, K. 407/386c: III. Allegro - Wolfgang Amadeus Mozart - 221331 - LJ580z8hAiJPnwu2YUeGw1I= - 0.9900000000000000000 - 346 - 2 - 24 - 1 - - - 3503 - Koyaanisqatsi - Philip Glass - 206005 - i2hNL1l/psuJvlM6lHk= - 0.9900000000000000000 - 347 - 2 - 10 - 1 - - - - - - System.Int32 - System.String - - - - 1 - MPEG audio file - - - 2 - Protected AAC audio file - - - 3 - Protected MPEG-4 video file - - - 4 - Purchased AAC audio file - - - 5 - AAC audio file - - - - - - System.Int32 - System.String - - - - 1 - Music - - - 2 - Movies - - - 3 - TV Shows - - - 4 - Audiobooks - - - 5 - 90’s Music - - - 6 - Audiobooks - - - 7 - Movies - - - 8 - Music - - - 9 - Music Videos - - - 10 - TV Shows - - - 11 - Brazilian Music - - - 12 - Classical - - - 13 - Classical 101 - Deep Cuts - - - 14 - Classical 101 - Next Steps - - - 15 - Classical 101 - The Basics - - - 16 - Grunge - - - 17 - Heavy Metal Classic - - - 18 - On-The-Go 1 - - - - - - System.Int32 - System.DateTime - System.DateTime - System.Int32 - System.TimeSpan - System.String - System.String - System.String - System.String - System.String - System.Decimal - System.Decimal - System.Int32 - System.Int32 - - - - 1 - 01-Jan-09 00:00:00 - 01-Jan-09 11:21:00 - 2 - - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 1.9800000000000000000 - 0.0900000000000000000 - 2 - 6 - - - 2 - 02-Jan-09 00:00:00 - - 0 - 1520000000000 - Ullevålsveien 14 - Oslo - - Norway - 0171 - 3.9600000000000000000 - 0.1800000000000000000 - 4 - 2 - - - 3 - 03-Jan-09 00:00:00 - - 1 - 808701000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 5.9400000000000000000 - 0.2700000000000000000 - 8 - 4 - - - 4 - 06-Jan-09 00:00:00 - - 1 - - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 8.9100000000000000000 - 0.4100000000000000000 - 14 - 3 - - - 5 - 11-Jan-09 00:00:00 - - 1 - 37069000000000 - 69 Salem Street - Boston - MA - USA - 2113 - 13.8600000000000000000 - 0.6300000000000000000 - 23 - 4 - - - 6 - 19-Jan-09 00:00:00 - 19-Jan-09 03:54:00 - 3 - - Berger Straße 10 - Frankfurt - - Germany - 60316 - 0.9900000000000000000 - 0.0500000000000000000 - 37 - 8 - - - 7 - 01-Feb-09 00:00:00 - - 1 - 226074000000000 - Barbarossastraße 19 - Berlin - - Germany - 10779 - 1.9800000000000000000 - 0.0900000000000000000 - 38 - 3 - - - 8 - 01-Feb-09 00:00:00 - 01-Feb-09 00:14:00 - 2 - 2122000000000 - 8, Rue Hanovre - Paris - - France - 75002 - 1.9800000000000000000 - 0.0900000000000000000 - 40 - 6 - - - 9 - 02-Feb-09 00:00:00 - - 1 - 497000000000 - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 3.9600000000000000000 - 0.1800000000000000000 - 42 - 3 - - - 10 - 03-Feb-09 00:00:00 - 03-Feb-09 05:47:00 - 3 - - 3 Chatham Street - Dublin - Dublin - Ireland - - 5.9400000000000000000 - 0.2700000000000000000 - 46 - 8 - - - 11 - 06-Feb-09 00:00:00 - - 1 - 333500000000000 - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 8.9100000000000000000 - 0.4100000000000000000 - 52 - 3 - - - 12 - 11-Feb-09 00:00:00 - - 0 - - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 13.8600000000000000000 - 0.6300000000000000000 - 2 - 1 - - - 13 - 19-Feb-09 00:00:00 - - 1 - 64000000000 - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 0.9900000000000000000 - 0.0500000000000000000 - 16 - 4 - - - 14 - 04-Mar-09 00:00:00 - - 1 - - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 1.9800000000000000000 - 0.0900000000000000000 - 17 - 3 - - - 15 - 04-Mar-09 00:00:00 - 04-Mar-09 07:52:00 - 3 - - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 1.9800000000000000000 - 0.0900000000000000000 - 19 - 7 - - - 16 - 05-Mar-09 00:00:00 - 05-Mar-09 00:13:00 - 3 - 938000000000 - 801 W 4th Street - Reno - NV - USA - 89503 - 3.9600000000000000000 - 0.1800000000000000000 - 21 - 7 - - - 17 - 06-Mar-09 00:00:00 - 06-Mar-09 06:08:00 - 2 - - 319 N. Frances Street - Madison - WI - USA - 53703 - 5.9400000000000000000 - 0.2700000000000000000 - 25 - 5 - - - 18 - 09-Mar-09 00:00:00 - - 1 - - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 8.9100000000000000000 - 0.4100000000000000000 - 31 - 3 - - - 19 - 14-Mar-09 00:00:00 - 14-Mar-09 00:02:00 - 2 - 279000000000 - 8, Rue Hanovre - Paris - - France - 75002 - 13.8600000000000000000 - 0.6300000000000000000 - 40 - 5 - - - 20 - 22-Mar-09 00:00:00 - 23-Mar-09 00:17:00 - 3 - 241828000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 0.9900000000000000000 - 0.0500000000000000000 - 54 - 7 - - - 21 - 04-Apr-09 00:00:00 - 07-Apr-09 05:13:00 - 3 - 311317000000000 - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 1.9800000000000000000 - 0.0900000000000000000 - 55 - 8 - - - 22 - 04-Apr-09 00:00:00 - - 0 - 500000000000 - Calle Lira, 198 - Santiago - - Chile - - 1.9800000000000000000 - 0.0900000000000000000 - 57 - 2 - - - 23 - 05-Apr-09 00:00:00 - 07-Apr-09 03:19:00 - 2 - 532681000000000 - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 3.9600000000000000000 - 0.1800000000000000000 - 59 - 5 - - - 24 - 06-Apr-09 00:00:00 - - 1 - - Ullevålsveien 14 - Oslo - - Norway - 0171 - 5.9400000000000000000 - 0.2700000000000000000 - 4 - 3 - - - 25 - 09-Apr-09 00:00:00 - - 0 - 539267000000000 - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 8.9100000000000000000 - 0.4100000000000000000 - 10 - 2 - - - 26 - 14-Apr-09 00:00:00 - - 0 - - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 13.8600000000000000000 - 0.6300000000000000000 - 19 - 2 - - - 27 - 22-Apr-09 00:00:00 - - 1 - 303387000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 0.9900000000000000000 - 0.0500000000000000000 - 33 - 3 - - - 28 - 05-May-09 00:00:00 - 05-May-09 00:06:00 - 2 - 98920000000000 - Rua da Assunção 53 - Lisbon - - Portugal - - 1.9800000000000000000 - 0.0900000000000000000 - 34 - 6 - - - 29 - 05-May-09 00:00:00 - 07-May-09 23:51:00 - 2 - 620638000000000 - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 1.9800000000000000000 - 0.0900000000000000000 - 36 - 5 - - - 30 - 06-May-09 00:00:00 - - 1 - 633000000000 - Barbarossastraße 19 - Berlin - - Germany - 10779 - 3.9600000000000000000 - 0.1800000000000000000 - 38 - 4 - - - 31 - 07-May-09 00:00:00 - 07-May-09 05:17:00 - 3 - 66814000000000 - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 5.9400000000000000000 - 0.2700000000000000000 - 42 - 7 - - - 32 - 10-May-09 00:00:00 - 14-May-09 17:48:00 - 2 - 500250000000000 - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 8.9100000000000000000 - 0.4100000000000000000 - 48 - 6 - - - 33 - 15-May-09 00:00:00 - - 1 - 34200000000000 - Calle Lira, 198 - Santiago - - Chile - - 13.8600000000000000000 - 0.6300000000000000000 - 57 - 3 - - - 34 - 23-May-09 00:00:00 - 23-May-09 06:42:00 - 3 - 27979000000000 - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 0.9900000000000000000 - 0.0500000000000000000 - 12 - 7 - - - 35 - 05-Jun-09 00:00:00 - - 0 - 114000000000 - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 1.9800000000000000000 - 0.0900000000000000000 - 13 - 1 - - - 36 - 05-Jun-09 00:00:00 - - 0 - 3119000000000 - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 1.9800000000000000000 - 0.0900000000000000000 - 15 - 1 - - - 37 - 06-Jun-09 00:00:00 - - 0 - 1486000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 3.9600000000000000000 - 0.1800000000000000000 - 17 - 1 - - - 38 - 07-Jun-09 00:00:00 - 11-Jun-09 17:49:00 - 3 - 656920000000000 - 801 W 4th Street - Reno - NV - USA - 89503 - 5.9400000000000000000 - 0.2700000000000000000 - 21 - 8 - - - 39 - 10-Jun-09 00:00:00 - 12-Jun-09 05:37:00 - 3 - 690586000000000 - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 8.9100000000000000000 - 0.4100000000000000000 - 27 - 8 - - - 40 - 15-Jun-09 00:00:00 - - 0 - - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 13.8600000000000000000 - 0.6300000000000000000 - 36 - 2 - - - 41 - 23-Jun-09 00:00:00 - - 1 - - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 0.9900000000000000000 - 0.0500000000000000000 - 50 - 3 - - - 42 - 06-Jul-09 00:00:00 - 06-Jul-09 09:54:00 - 2 - - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 1.9800000000000000000 - 0.0900000000000000000 - 51 - 6 - - - 43 - 06-Jul-09 00:00:00 - 11-Jul-09 08:46:00 - 3 - 581297000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 1.9800000000000000000 - 0.0900000000000000000 - 53 - 7 - - - 44 - 07-Jul-09 00:00:00 - 07-Jul-09 15:12:00 - 3 - - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 3.9600000000000000000 - 0.1800000000000000000 - 55 - 8 - - - 45 - 08-Jul-09 00:00:00 - - 0 - - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 5.9400000000000000000 - 0.2700000000000000000 - 59 - 2 - - - 46 - 11-Jul-09 00:00:00 - - 0 - - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 8.9100000000000000000 - 0.4100000000000000000 - 6 - 1 - - - 47 - 16-Jul-09 00:00:00 - 16-Jul-09 00:08:00 - 2 - 2415000000000 - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 13.8600000000000000000 - 0.6300000000000000000 - 15 - 6 - - - 48 - 24-Jul-09 00:00:00 - 24-Jul-09 09:59:00 - 2 - - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 0.9900000000000000000 - 0.0500000000000000000 - 29 - 5 - - - 49 - 06-Aug-09 00:00:00 - - 1 - 269142000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 1.9800000000000000000 - 0.0900000000000000000 - 30 - 3 - - - 50 - 06-Aug-09 00:00:00 - 07-Aug-09 12:27:00 - 3 - 356358000000000 - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 1.9800000000000000000 - 0.0900000000000000000 - 32 - 7 - - - 51 - 07-Aug-09 00:00:00 - - 0 - - Rua da Assunção 53 - Lisbon - - Portugal - - 3.9600000000000000000 - 0.1800000000000000000 - 34 - 2 - - - 52 - 08-Aug-09 00:00:00 - - 1 - - Barbarossastraße 19 - Berlin - - Germany - 10779 - 5.9400000000000000000 - 0.2700000000000000000 - 38 - 4 - - - 53 - 11-Aug-09 00:00:00 - 12-Aug-09 05:55:00 - 2 - 526529000000000 - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 8.9100000000000000000 - 0.4100000000000000000 - 44 - 6 - - - 54 - 16-Aug-09 00:00:00 - - 1 - 1913000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 13.8600000000000000000 - 0.6300000000000000000 - 53 - 3 - - - 55 - 24-Aug-09 00:00:00 - 24-Aug-09 10:45:00 - 2 - 288977000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 0.9900000000000000000 - 0.0500000000000000000 - 8 - 5 - - - 56 - 06-Sep-09 00:00:00 - - 1 - 538921000000000 - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 1.9800000000000000000 - 0.0900000000000000000 - 9 - 4 - - - 57 - 06-Sep-09 00:00:00 - 06-Sep-09 02:33:00 - 2 - 31028000000000 - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 1.9800000000000000000 - 0.0900000000000000000 - 11 - 6 - - - 58 - 07-Sep-09 00:00:00 - - 0 - 2232000000000 - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 3.9600000000000000000 - 0.1800000000000000000 - 13 - 1 - - - 59 - 08-Sep-09 00:00:00 - - 0 - 744000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 5.9400000000000000000 - 0.2700000000000000000 - 17 - 2 - - - 60 - 11-Sep-09 00:00:00 - - 1 - - 69 Salem Street - Boston - MA - USA - 2113 - 8.9100000000000000000 - 0.4100000000000000000 - 23 - 3 - - - 61 - 16-Sep-09 00:00:00 - 16-Sep-09 12:31:00 - 2 - - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 13.8600000000000000000 - 0.6300000000000000000 - 32 - 6 - - - 62 - 24-Sep-09 00:00:00 - 28-Sep-09 12:15:00 - 2 - 770136000000000 - 3 Chatham Street - Dublin - Dublin - Ireland - - 0.9900000000000000000 - 0.0500000000000000000 - 46 - 5 - - - 63 - 07-Oct-09 00:00:00 - - 0 - - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 1.9800000000000000000 - 0.0900000000000000000 - 47 - 2 - - - 64 - 07-Oct-09 00:00:00 - 07-Oct-09 18:17:00 - 3 - 173302000000000 - Ordynacka 10 - Warsaw - - Poland - 00-358 - 1.9800000000000000000 - 0.0900000000000000000 - 49 - 8 - - - 65 - 08-Oct-09 00:00:00 - - 0 - 720000000000 - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 3.9600000000000000000 - 0.1800000000000000000 - 51 - 1 - - - 66 - 09-Oct-09 00:00:00 - 09-Oct-09 14:22:00 - 2 - - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 5.9400000000000000000 - 0.2700000000000000000 - 55 - 6 - - - 67 - 12-Oct-09 00:00:00 - 14-Oct-09 11:13:00 - 2 - 335782000000000 - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 8.9100000000000000000 - 0.4100000000000000000 - 2 - 6 - - - 68 - 17-Oct-09 00:00:00 - 17-Oct-09 05:54:00 - 2 - - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 13.8600000000000000000 - 0.6300000000000000000 - 11 - 6 - - - 69 - 25-Oct-09 00:00:00 - - 0 - - 319 N. Frances Street - Madison - WI - USA - 53703 - 0.9900000000000000000 - 0.0500000000000000000 - 25 - 2 - - - 70 - 07-Nov-09 00:00:00 - 07-Nov-09 13:00:00 - 3 - - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 1.9800000000000000000 - 0.0900000000000000000 - 26 - 7 - - - 71 - 07-Nov-09 00:00:00 - 07-Nov-09 08:28:00 - 3 - 824617000000000 - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 1.9800000000000000000 - 0.0900000000000000000 - 28 - 7 - - - 72 - 08-Nov-09 00:00:00 - 08-Nov-09 00:01:00 - 2 - 499000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 3.9600000000000000000 - 0.1800000000000000000 - 30 - 6 - - - 73 - 09-Nov-09 00:00:00 - - 1 - 745224000000000 - Rua da Assunção 53 - Lisbon - - Portugal - - 5.9400000000000000000 - 0.2700000000000000000 - 34 - 4 - - - 74 - 12-Nov-09 00:00:00 - - 1 - 354135000000000 - 8, Rue Hanovre - Paris - - France - 75002 - 8.9100000000000000000 - 0.4100000000000000000 - 40 - 3 - - - 75 - 17-Nov-09 00:00:00 - 17-Nov-09 01:30:00 - 2 - - Ordynacka 10 - Warsaw - - Poland - 00-358 - 13.8600000000000000000 - 0.6300000000000000000 - 49 - 5 - - - 76 - 25-Nov-09 00:00:00 - - 1 - 3358000000000 - Ullevålsveien 14 - Oslo - - Norway - 0171 - 0.9900000000000000000 - 0.0500000000000000000 - 4 - 3 - - - 77 - 08-Dec-09 00:00:00 - - 1 - 780404000000000 - Klanova 9/506 - Prague - - Czech Republic - 14700 - 1.9800000000000000000 - 0.0900000000000000000 - 5 - 4 - - - 78 - 08-Dec-09 00:00:00 - 08-Dec-09 15:01:00 - 2 - - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 1.9800000000000000000 - 0.0900000000000000000 - 7 - 5 - - - 79 - 09-Dec-09 00:00:00 - - 0 - 498000000000 - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 3.9600000000000000000 - 0.1800000000000000000 - 9 - 2 - - - 80 - 10-Dec-09 00:00:00 - - 0 - - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 5.9400000000000000000 - 0.2700000000000000000 - 13 - 2 - - - 81 - 13-Dec-09 00:00:00 - - 1 - 126002000000000 - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 8.9100000000000000000 - 0.4100000000000000000 - 19 - 4 - - - 82 - 18-Dec-09 00:00:00 - 18-Dec-09 14:55:00 - 2 - - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 13.8600000000000000000 - 0.6300000000000000000 - 28 - 6 - - - 83 - 26-Dec-09 00:00:00 - - 1 - - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 0.9900000000000000000 - 0.0500000000000000000 - 42 - 4 - - - 84 - 08-Jan-10 00:00:00 - 08-Jan-10 04:04:00 - 2 - - 68, Rue Jouvence - Dijon - - France - 21000 - 1.9800000000000000000 - 0.0900000000000000000 - 43 - 6 - - - 85 - 08-Jan-10 00:00:00 - - 0 - - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 1.9800000000000000000 - 0.0900000000000000000 - 45 - 2 - - - 86 - 09-Jan-10 00:00:00 - - 1 - - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 3.9600000000000000000 - 0.1800000000000000000 - 47 - 4 - - - 87 - 10-Jan-10 00:00:00 - 10-Jan-10 04:27:00 - 3 - - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 6.9400000000000000000 - 0.3200000000000000000 - 51 - 8 - - - 88 - 13-Jan-10 00:00:00 - - 0 - 433564000000000 - Calle Lira, 198 - Santiago - - Chile - - 17.9100000000000000000 - 0.8200000000000000000 - 57 - 1 - - - 89 - 18-Jan-10 00:00:00 - - 0 - - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 18.8600000000000000000 - 0.8600000000000000000 - 7 - 2 - - - 90 - 26-Jan-10 00:00:00 - 26-Jan-10 10:38:00 - 2 - - 801 W 4th Street - Reno - NV - USA - 89503 - 0.9900000000000000000 - 0.0500000000000000000 - 21 - 5 - - - 91 - 08-Feb-10 00:00:00 - - 1 - - 120 S Orange Ave - Orlando - FL - USA - 32801 - 1.9800000000000000000 - 0.0900000000000000000 - 22 - 4 - - - 92 - 08-Feb-10 00:00:00 - - 0 - 697000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 1.9800000000000000000 - 0.0900000000000000000 - 24 - 1 - - - 93 - 09-Feb-10 00:00:00 - 09-Feb-10 12:38:00 - 3 - - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 3.9600000000000000000 - 0.1800000000000000000 - 26 - 7 - - - 94 - 10-Feb-10 00:00:00 - 15-Feb-10 11:45:00 - 2 - 482570000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 5.9400000000000000000 - 0.2700000000000000000 - 30 - 5 - - - 95 - 13-Feb-10 00:00:00 - 13-Feb-10 21:15:00 - 2 - 343234000000000 - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 8.9100000000000000000 - 0.4100000000000000000 - 36 - 5 - - - 96 - 18-Feb-10 00:00:00 - 18-Feb-10 01:24:00 - 2 - - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 21.8600000000000000000 - 1.0000000000000000000 - 45 - 6 - - - 97 - 26-Feb-10 00:00:00 - 27-Feb-10 21:59:00 - 2 - 253623000000000 - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 1.9900000000000000000 - 0.1000000000000000000 - 59 - 5 - - - 98 - 11-Mar-10 00:00:00 - 14-Mar-10 00:01:00 - 3 - 415566000000000 - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 3.9800000000000000000 - 0.1900000000000000000 - 1 - 7 - - - 99 - 11-Mar-10 00:00:00 - 11-Mar-10 00:17:00 - 3 - 3383000000000 - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 3.9800000000000000000 - 0.1900000000000000000 - 3 - 8 - - - 100 - 12-Mar-10 00:00:00 - 12-Mar-10 00:15:00 - 2 - 1240000000000 - Klanova 9/506 - Prague - - Czech Republic - 14700 - 3.9600000000000000000 - 0.1800000000000000000 - 5 - 5 - - - 101 - 13-Mar-10 00:00:00 - - 1 - - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 5.9400000000000000000 - 0.2700000000000000000 - 9 - 4 - - - 102 - 16-Mar-10 00:00:00 - - 0 - 189106000000000 - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 9.9100000000000000000 - 0.4500000000000000000 - 15 - 1 - - - 103 - 21-Mar-10 00:00:00 - - 1 - 37544000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 15.8600000000000000000 - 0.7200000000000000000 - 24 - 4 - - - 104 - 29-Mar-10 00:00:00 - 29-Mar-10 03:05:00 - 2 - - Barbarossastraße 19 - Berlin - - Germany - 10779 - 0.9900000000000000000 - 0.0500000000000000000 - 38 - 5 - - - 105 - 11-Apr-10 00:00:00 - - 0 - 502429000000000 - 4, Rue Milton - Paris - - France - 75009 - 1.9800000000000000000 - 0.0900000000000000000 - 39 - 1 - - - 106 - 11-Apr-10 00:00:00 - - 1 - 360503000000000 - 11, Place Bellecour - Lyon - - France - 69002 - 1.9800000000000000000 - 0.0900000000000000000 - 41 - 4 - - - 107 - 12-Apr-10 00:00:00 - - 0 - - 68, Rue Jouvence - Dijon - - France - 21000 - 3.9600000000000000000 - 0.1800000000000000000 - 43 - 1 - - - 108 - 13-Apr-10 00:00:00 - - 1 - 2422000000000 - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 5.9400000000000000000 - 0.2700000000000000000 - 47 - 3 - - - 109 - 16-Apr-10 00:00:00 - 16-Apr-10 00:19:00 - 3 - 2422000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 8.9100000000000000000 - 0.4100000000000000000 - 53 - 7 - - - 110 - 21-Apr-10 00:00:00 - - 1 - 174653000000000 - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 13.8600000000000000000 - 0.6300000000000000000 - 3 - 3 - - - 111 - 29-Apr-10 00:00:00 - - 0 - 354205000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 0.9900000000000000000 - 0.0500000000000000000 - 17 - 1 - - - 112 - 12-May-10 00:00:00 - - 0 - - 627 Broadway - New York - NY - USA - 10012-2612 - 1.9800000000000000000 - 0.0900000000000000000 - 18 - 1 - - - 113 - 12-May-10 00:00:00 - 12-May-10 11:04:00 - 3 - - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 1.9800000000000000000 - 0.0900000000000000000 - 20 - 8 - - - 114 - 13-May-10 00:00:00 - - 0 - - 120 S Orange Ave - Orlando - FL - USA - 32801 - 3.9600000000000000000 - 0.1800000000000000000 - 22 - 1 - - - 115 - 14-May-10 00:00:00 - 14-May-10 00:11:00 - 3 - 2270000000000 - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 5.9400000000000000000 - 0.2700000000000000000 - 26 - 7 - - - 116 - 17-May-10 00:00:00 - 19-May-10 23:10:00 - 3 - 422191000000000 - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 8.9100000000000000000 - 0.4100000000000000000 - 32 - 8 - - - 117 - 22-May-10 00:00:00 - - 0 - 2855000000000 - 11, Place Bellecour - Lyon - - France - 69002 - 13.8600000000000000000 - 0.6300000000000000000 - 41 - 2 - - - 118 - 30-May-10 00:00:00 - - 1 - 1892000000000 - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 0.9900000000000000000 - 0.0500000000000000000 - 55 - 4 - - - 119 - 12-Jun-10 00:00:00 - 12-Jun-10 07:56:00 - 3 - - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 1.9800000000000000000 - 0.0900000000000000000 - 56 - 7 - - - 120 - 12-Jun-10 00:00:00 - 12-Jun-10 10:35:00 - 2 - - 12,Community Centre - Delhi - - India - 110017 - 1.9800000000000000000 - 0.0900000000000000000 - 58 - 6 - - - 121 - 13-Jun-10 00:00:00 - 13-Jun-10 01:57:00 - 2 - 135817000000000 - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 3.9600000000000000000 - 0.1800000000000000000 - 1 - 6 - - - 122 - 14-Jun-10 00:00:00 - 14-Jun-10 02:24:00 - 2 - - Klanova 9/506 - Prague - - Czech Republic - 14700 - 5.9400000000000000000 - 0.2700000000000000000 - 5 - 5 - - - 123 - 17-Jun-10 00:00:00 - - 1 - 2548000000000 - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 8.9100000000000000000 - 0.4100000000000000000 - 11 - 4 - - - 124 - 22-Jun-10 00:00:00 - 22-Jun-10 10:49:00 - 2 - 116845000000000 - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 13.8600000000000000000 - 0.6300000000000000000 - 20 - 6 - - - 125 - 30-Jun-10 00:00:00 - - 1 - 2118000000000 - Rua da Assunção 53 - Lisbon - - Portugal - - 0.9900000000000000000 - 0.0500000000000000000 - 34 - 4 - - - 126 - 13-Jul-10 00:00:00 - 13-Jul-10 00:14:00 - 3 - 1326000000000 - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 1.9800000000000000000 - 0.0900000000000000000 - 35 - 7 - - - 127 - 13-Jul-10 00:00:00 - 14-Jul-10 19:40:00 - 3 - 256583000000000 - Berger Straße 10 - Frankfurt - - Germany - 60316 - 1.9800000000000000000 - 0.0900000000000000000 - 37 - 8 - - - 128 - 14-Jul-10 00:00:00 - 14-Jul-10 02:17:00 - 3 - - 4, Rue Milton - Paris - - France - 75009 - 3.9600000000000000000 - 0.1800000000000000000 - 39 - 7 - - - 129 - 15-Jul-10 00:00:00 - 19-Jul-10 08:23:00 - 3 - 382882000000000 - 68, Rue Jouvence - Dijon - - France - 21000 - 5.9400000000000000000 - 0.2700000000000000000 - 43 - 7 - - - 130 - 18-Jul-10 00:00:00 - 18-Jul-10 00:42:00 - 3 - - Ordynacka 10 - Warsaw - - Poland - 00-358 - 8.9100000000000000000 - 0.4100000000000000000 - 49 - 8 - - - 131 - 23-Jul-10 00:00:00 - 24-Jul-10 08:12:00 - 3 - 162974000000000 - 12,Community Centre - Delhi - - India - 110017 - 13.8600000000000000000 - 0.6300000000000000000 - 58 - 7 - - - 132 - 31-Jul-10 00:00:00 - 31-Jul-10 00:10:00 - 2 - 1033000000000 - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 0.9900000000000000000 - 0.0500000000000000000 - 13 - 6 - - - 133 - 13-Aug-10 00:00:00 - 14-Aug-10 06:35:00 - 2 - 172428000000000 - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 1.9800000000000000000 - 0.0900000000000000000 - 14 - 6 - - - 134 - 13-Aug-10 00:00:00 - 13-Aug-10 04:15:00 - 2 - - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 1.9800000000000000000 - 0.0900000000000000000 - 16 - 6 - - - 135 - 14-Aug-10 00:00:00 - 14-Aug-10 00:32:00 - 2 - 2497000000000 - 627 Broadway - New York - NY - USA - 10012-2612 - 3.9600000000000000000 - 0.1800000000000000000 - 18 - 6 - - - 136 - 15-Aug-10 00:00:00 - - 1 - - 120 S Orange Ave - Orlando - FL - USA - 32801 - 5.9400000000000000000 - 0.2700000000000000000 - 22 - 4 - - - 137 - 18-Aug-10 00:00:00 - - 1 - - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 8.9100000000000000000 - 0.4100000000000000000 - 28 - 3 - - - 138 - 23-Aug-10 00:00:00 - 23-Aug-10 00:06:00 - 3 - 582000000000 - Berger Straße 10 - Frankfurt - - Germany - 60316 - 13.8600000000000000000 - 0.6300000000000000000 - 37 - 8 - - - 139 - 31-Aug-10 00:00:00 - 01-Sep-10 13:48:00 - 2 - 188299000000000 - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 0.9900000000000000000 - 0.0500000000000000000 - 51 - 6 - - - 140 - 13-Sep-10 00:00:00 - 13-Sep-10 06:31:00 - 2 - - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 1.9800000000000000000 - 0.0900000000000000000 - 52 - 6 - - - 141 - 13-Sep-10 00:00:00 - - 1 - 2715000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 1.9800000000000000000 - 0.0900000000000000000 - 54 - 3 - - - 142 - 14-Sep-10 00:00:00 - 14-Sep-10 00:03:00 - 2 - 552000000000 - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 3.9600000000000000000 - 0.1800000000000000000 - 56 - 6 - - - 143 - 15-Sep-10 00:00:00 - - 1 - - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 5.9400000000000000000 - 0.2700000000000000000 - 1 - 3 - - - 144 - 18-Sep-10 00:00:00 - 18-Sep-10 00:17:00 - 3 - 1974000000000 - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 8.9100000000000000000 - 0.4100000000000000000 - 7 - 7 - - - 145 - 23-Sep-10 00:00:00 - 23-Sep-10 12:45:00 - 2 - 166179000000000 - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 13.8600000000000000000 - 0.6300000000000000000 - 16 - 5 - - - 146 - 01-Oct-10 00:00:00 - - 1 - 784000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 0.9900000000000000000 - 0.0500000000000000000 - 30 - 3 - - - 147 - 14-Oct-10 00:00:00 - - 0 - 413328000000000 - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 1.9800000000000000000 - 0.0900000000000000000 - 31 - 1 - - - 148 - 14-Oct-10 00:00:00 - 16-Oct-10 07:23:00 - 3 - 441835000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 1.9800000000000000000 - 0.0900000000000000000 - 33 - 7 - - - 149 - 15-Oct-10 00:00:00 - 15-Oct-10 10:15:00 - 2 - - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 3.9600000000000000000 - 0.1800000000000000000 - 35 - 6 - - - 150 - 16-Oct-10 00:00:00 - 16-Oct-10 03:19:00 - 2 - 82170000000000 - 4, Rue Milton - Paris - - France - 75009 - 5.9400000000000000000 - 0.2700000000000000000 - 39 - 5 - - - 151 - 19-Oct-10 00:00:00 - - 1 - - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 8.9100000000000000000 - 0.4100000000000000000 - 45 - 4 - - - 152 - 24-Oct-10 00:00:00 - - 0 - - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 13.8600000000000000000 - 0.6300000000000000000 - 54 - 1 - - - 153 - 01-Nov-10 00:00:00 - 01-Nov-10 02:18:00 - 3 - - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 0.9900000000000000000 - 0.0500000000000000000 - 9 - 8 - - - 154 - 14-Nov-10 00:00:00 - - 1 - - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 1.9800000000000000000 - 0.0900000000000000000 - 10 - 3 - - - 155 - 14-Nov-10 00:00:00 - 14-Nov-10 08:06:00 - 3 - - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 1.9800000000000000000 - 0.0900000000000000000 - 12 - 7 - - - 156 - 15-Nov-10 00:00:00 - 16-Nov-10 04:57:00 - 3 - 155323000000000 - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 3.9600000000000000000 - 0.1800000000000000000 - 14 - 7 - - - 157 - 16-Nov-10 00:00:00 - 18-Nov-10 20:25:00 - 2 - 547202000000000 - 627 Broadway - New York - NY - USA - 10012-2612 - 5.9400000000000000000 - 0.2700000000000000000 - 18 - 5 - - - 158 - 19-Nov-10 00:00:00 - 19-Nov-10 00:02:00 - 2 - 245000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 8.9100000000000000000 - 0.4100000000000000000 - 24 - 6 - - - 159 - 24-Nov-10 00:00:00 - - 0 - - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 13.8600000000000000000 - 0.6300000000000000000 - 33 - 1 - - - 160 - 02-Dec-10 00:00:00 - - 1 - - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 0.9900000000000000000 - 0.0500000000000000000 - 47 - 3 - - - 161 - 15-Dec-10 00:00:00 - - 1 - 1796000000000 - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 1.9800000000000000000 - 0.0900000000000000000 - 48 - 4 - - - 162 - 15-Dec-10 00:00:00 - - 1 - - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 1.9800000000000000000 - 0.0900000000000000000 - 50 - 3 - - - 163 - 16-Dec-10 00:00:00 - 16-Dec-10 02:24:00 - 2 - 42512000000000 - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 3.9600000000000000000 - 0.1800000000000000000 - 52 - 5 - - - 164 - 17-Dec-10 00:00:00 - 17-Dec-10 06:31:00 - 3 - - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 5.9400000000000000000 - 0.2700000000000000000 - 56 - 8 - - - 165 - 20-Dec-10 00:00:00 - 20-Dec-10 16:14:00 - 2 - - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 8.9100000000000000000 - 0.4100000000000000000 - 3 - 5 - - - 166 - 25-Dec-10 00:00:00 - - 1 - 296099000000000 - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 13.8600000000000000000 - 0.6300000000000000000 - 12 - 3 - - - 167 - 02-Jan-11 00:00:00 - - 1 - 291078000000000 - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 0.9900000000000000000 - 0.0500000000000000000 - 26 - 3 - - - 168 - 15-Jan-11 00:00:00 - - 1 - - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 1.9800000000000000000 - 0.0900000000000000000 - 27 - 3 - - - 169 - 15-Jan-11 00:00:00 - - 1 - - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 1.9800000000000000000 - 0.0900000000000000000 - 29 - 3 - - - 170 - 16-Jan-11 00:00:00 - - 1 - 2930000000000 - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 3.9600000000000000000 - 0.1800000000000000000 - 31 - 4 - - - 171 - 17-Jan-11 00:00:00 - 17-Jan-11 00:45:00 - 2 - - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 5.9400000000000000000 - 0.2700000000000000000 - 35 - 6 - - - 172 - 20-Jan-11 00:00:00 - - 0 - - 11, Place Bellecour - Lyon - - France - 69002 - 8.9100000000000000000 - 0.4100000000000000000 - 41 - 2 - - - 173 - 25-Jan-11 00:00:00 - 25-Jan-11 02:59:00 - 2 - - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 13.8600000000000000000 - 0.6300000000000000000 - 50 - 6 - - - 174 - 02-Feb-11 00:00:00 - - 0 - 432358000000000 - Klanova 9/506 - Prague - - Czech Republic - 14700 - 0.9900000000000000000 - 0.0500000000000000000 - 5 - 1 - - - 175 - 15-Feb-11 00:00:00 - - 1 - 406997000000000 - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 1.9800000000000000000 - 0.0900000000000000000 - 6 - 3 - - - 176 - 15-Feb-11 00:00:00 - - 0 - - Grétrystraat 63 - Brussels - - Belgium - 1000 - 1.9800000000000000000 - 0.0900000000000000000 - 8 - 1 - - - 177 - 16-Feb-11 00:00:00 - - 1 - 1336000000000 - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 3.9600000000000000000 - 0.1800000000000000000 - 10 - 3 - - - 178 - 17-Feb-11 00:00:00 - 17-Feb-11 00:30:00 - 2 - 3252000000000 - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 5.9400000000000000000 - 0.2700000000000000000 - 14 - 6 - - - 179 - 20-Feb-11 00:00:00 - - 0 - 842619000000000 - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 8.9100000000000000000 - 0.4100000000000000000 - 20 - 2 - - - 180 - 25-Feb-11 00:00:00 - - 0 - - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 13.8600000000000000000 - 0.6300000000000000000 - 29 - 1 - - - 181 - 05-Mar-11 00:00:00 - 05-Mar-11 06:37:00 - 2 - - 68, Rue Jouvence - Dijon - - France - 21000 - 0.9900000000000000000 - 0.0500000000000000000 - 43 - 6 - - - 182 - 18-Mar-11 00:00:00 - - 0 - - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 1.9800000000000000000 - 0.0900000000000000000 - 44 - 2 - - - 183 - 18-Mar-11 00:00:00 - - 0 - 71461000000000 - 3 Chatham Street - Dublin - Dublin - Ireland - - 1.9800000000000000000 - 0.0900000000000000000 - 46 - 1 - - - 184 - 19-Mar-11 00:00:00 - - 0 - - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 3.9600000000000000000 - 0.1800000000000000000 - 48 - 2 - - - 185 - 20-Mar-11 00:00:00 - - 1 - 2815000000000 - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 5.9400000000000000000 - 0.2700000000000000000 - 52 - 4 - - - 186 - 23-Mar-11 00:00:00 - 23-Mar-11 00:39:00 - 2 - - 12,Community Centre - Delhi - - India - 110017 - 8.9100000000000000000 - 0.4100000000000000000 - 58 - 6 - - - 187 - 28-Mar-11 00:00:00 - 03-Apr-11 09:09:00 - 2 - 721376000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 13.8600000000000000000 - 0.6300000000000000000 - 8 - 6 - - - 188 - 05-Apr-11 00:00:00 - - 1 - - 120 S Orange Ave - Orlando - FL - USA - 32801 - 0.9900000000000000000 - 0.0500000000000000000 - 22 - 3 - - - 189 - 18-Apr-11 00:00:00 - 18-Apr-11 00:13:00 - 3 - 1442000000000 - 69 Salem Street - Boston - MA - USA - 2113 - 1.9800000000000000000 - 0.0900000000000000000 - 23 - 7 - - - 190 - 18-Apr-11 00:00:00 - 18-Apr-11 09:35:00 - 3 - - 319 N. Frances Street - Madison - WI - USA - 53703 - 1.9800000000000000000 - 0.0900000000000000000 - 25 - 8 - - - 191 - 19-Apr-11 00:00:00 - 19-Apr-11 10:50:00 - 3 - - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 3.9600000000000000000 - 0.1800000000000000000 - 27 - 8 - - - 192 - 20-Apr-11 00:00:00 - 20-Apr-11 08:30:00 - 2 - - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 5.9400000000000000000 - 0.2700000000000000000 - 31 - 5 - - - 193 - 23-Apr-11 00:00:00 - 23-Apr-11 12:56:00 - 3 - - Berger Straße 10 - Frankfurt - - Germany - 60316 - 14.9100000000000000000 - 0.6800000000000000000 - 37 - 7 - - - 194 - 28-Apr-11 00:00:00 - - 1 - 138650000000000 - 3 Chatham Street - Dublin - Dublin - Ireland - - 21.8600000000000000000 - 1.0000000000000000000 - 46 - 4 - - - 195 - 06-May-11 00:00:00 - - 1 - - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 0.9900000000000000000 - 0.0500000000000000000 - 1 - 3 - - - 196 - 19-May-11 00:00:00 - - 0 - - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 1.9800000000000000000 - 0.0900000000000000000 - 2 - 1 - - - 197 - 19-May-11 00:00:00 - - 0 - - Ullevålsveien 14 - Oslo - - Norway - 0171 - 1.9800000000000000000 - 0.0900000000000000000 - 4 - 2 - - - 198 - 20-May-11 00:00:00 - - 1 - - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 3.9600000000000000000 - 0.1800000000000000000 - 6 - 4 - - - 199 - 21-May-11 00:00:00 - - 1 - 384000000000 - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 5.9400000000000000000 - 0.2700000000000000000 - 10 - 3 - - - 200 - 24-May-11 00:00:00 - - 0 - 594152000000000 - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 8.9100000000000000000 - 0.4100000000000000000 - 16 - 2 - - - 201 - 29-May-11 00:00:00 - - 0 - 296505000000000 - 319 N. Frances Street - Madison - WI - USA - 53703 - 18.8600000000000000000 - 0.8600000000000000000 - 25 - 1 - - - 202 - 06-Jun-11 00:00:00 - 06-Jun-11 00:48:00 - 3 - 3177000000000 - 4, Rue Milton - Paris - - France - 75009 - 1.9900000000000000000 - 0.1000000000000000000 - 39 - 7 - - - 203 - 19-Jun-11 00:00:00 - - 1 - - 8, Rue Hanovre - Paris - - France - 75002 - 2.9800000000000000000 - 0.1400000000000000000 - 40 - 4 - - - 204 - 19-Jun-11 00:00:00 - - 1 - - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 3.9800000000000000000 - 0.1900000000000000000 - 42 - 3 - - - 205 - 20-Jun-11 00:00:00 - 20-Jun-11 08:36:00 - 3 - - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 7.9600000000000000000 - 0.3700000000000000000 - 44 - 8 - - - 206 - 21-Jun-11 00:00:00 - - 1 - 2524000000000 - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 8.9400000000000000000 - 0.4100000000000000000 - 48 - 3 - - - 207 - 24-Jun-11 00:00:00 - - 1 - 2241000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 8.9100000000000000000 - 0.4100000000000000000 - 54 - 4 - - - 208 - 29-Jun-11 00:00:00 - 01-Jul-11 16:47:00 - 3 - 555268000000000 - Ullevålsveien 14 - Oslo - - Norway - 0171 - 15.8600000000000000000 - 0.7200000000000000000 - 4 - 8 - - - 209 - 07-Jul-11 00:00:00 - 07-Jul-11 00:23:00 - 3 - - 627 Broadway - New York - NY - USA - 10012-2612 - 0.9900000000000000000 - 0.0500000000000000000 - 18 - 8 - - - 210 - 20-Jul-11 00:00:00 - 20-Jul-11 00:21:00 - 2 - 3459000000000 - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 1.9800000000000000000 - 0.0900000000000000000 - 19 - 6 - - - 211 - 20-Jul-11 00:00:00 - - 1 - 253812000000000 - 801 W 4th Street - Reno - NV - USA - 89503 - 1.9800000000000000000 - 0.0900000000000000000 - 21 - 4 - - - 212 - 21-Jul-11 00:00:00 - 22-Jul-11 17:55:00 - 3 - 299965000000000 - 69 Salem Street - Boston - MA - USA - 2113 - 3.9600000000000000000 - 0.1800000000000000000 - 23 - 8 - - - 213 - 22-Jul-11 00:00:00 - 22-Jul-11 00:49:00 - 2 - 320683000000000 - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 5.9400000000000000000 - 0.2700000000000000000 - 27 - 5 - - - 214 - 25-Jul-11 00:00:00 - - 0 - 774101000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 8.9100000000000000000 - 0.4100000000000000000 - 33 - 1 - - - 215 - 30-Jul-11 00:00:00 - 30-Jul-11 00:04:00 - 2 - 652000000000 - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 13.8600000000000000000 - 0.6300000000000000000 - 42 - 6 - - - 216 - 07-Aug-11 00:00:00 - - 1 - - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 0.9900000000000000000 - 0.0500000000000000000 - 56 - 3 - - - 217 - 20-Aug-11 00:00:00 - - 0 - 972000000000 - Calle Lira, 198 - Santiago - - Chile - - 1.9800000000000000000 - 0.0900000000000000000 - 57 - 2 - - - 218 - 20-Aug-11 00:00:00 - - 1 - 246620000000000 - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 1.9800000000000000000 - 0.0900000000000000000 - 59 - 3 - - - 219 - 21-Aug-11 00:00:00 - - 1 - 49020000000000 - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 3.9600000000000000000 - 0.1800000000000000000 - 2 - 4 - - - 220 - 22-Aug-11 00:00:00 - 22-Aug-11 16:04:00 - 3 - 643992000000000 - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 5.9400000000000000000 - 0.2700000000000000000 - 6 - 8 - - - 221 - 25-Aug-11 00:00:00 - 25-Aug-11 05:14:00 - 2 - - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 8.9100000000000000000 - 0.4100000000000000000 - 12 - 6 - - - 222 - 30-Aug-11 00:00:00 - - 0 - - 801 W 4th Street - Reno - NV - USA - 89503 - 13.8600000000000000000 - 0.6300000000000000000 - 21 - 1 - - - 223 - 07-Sep-11 00:00:00 - - 1 - 96000000000 - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 0.9900000000000000000 - 0.0500000000000000000 - 35 - 4 - - - 224 - 20-Sep-11 00:00:00 - - 1 - 578150000000000 - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 1.9800000000000000000 - 0.0900000000000000000 - 36 - 4 - - - 225 - 20-Sep-11 00:00:00 - - 1 - 936000000000 - Barbarossastraße 19 - Berlin - - Germany - 10779 - 1.9800000000000000000 - 0.0900000000000000000 - 38 - 4 - - - 226 - 21-Sep-11 00:00:00 - - 0 - 271555000000000 - 8, Rue Hanovre - Paris - - France - 75002 - 3.9600000000000000000 - 0.1800000000000000000 - 40 - 1 - - - 227 - 22-Sep-11 00:00:00 - - 1 - 2711000000000 - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 5.9400000000000000000 - 0.2700000000000000000 - 44 - 3 - - - 228 - 25-Sep-11 00:00:00 - - 1 - 791798000000000 - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 8.9100000000000000000 - 0.4100000000000000000 - 50 - 3 - - - 229 - 30-Sep-11 00:00:00 - 30-Sep-11 09:37:00 - 3 - 44773000000000 - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 13.8600000000000000000 - 0.6300000000000000000 - 59 - 7 - - - 230 - 08-Oct-11 00:00:00 - - 1 - 764704000000000 - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 0.9900000000000000000 - 0.0500000000000000000 - 14 - 3 - - - 231 - 21-Oct-11 00:00:00 - 21-Oct-11 05:37:00 - 3 - - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 1.9800000000000000000 - 0.0900000000000000000 - 15 - 8 - - - 232 - 21-Oct-11 00:00:00 - 21-Oct-11 00:01:00 - 3 - 2435000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 1.9800000000000000000 - 0.0900000000000000000 - 17 - 8 - - - 233 - 22-Oct-11 00:00:00 - - 1 - - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 3.9600000000000000000 - 0.1800000000000000000 - 19 - 3 - - - 234 - 23-Oct-11 00:00:00 - 23-Oct-11 01:17:00 - 3 - 227767000000000 - 69 Salem Street - Boston - MA - USA - 2113 - 5.9400000000000000000 - 0.2700000000000000000 - 23 - 8 - - - 235 - 26-Oct-11 00:00:00 - - 0 - 111061000000000 - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 8.9100000000000000000 - 0.4100000000000000000 - 29 - 1 - - - 236 - 31-Oct-11 00:00:00 - 31-Oct-11 15:07:00 - 3 - - Barbarossastraße 19 - Berlin - - Germany - 10779 - 13.8600000000000000000 - 0.6300000000000000000 - 38 - 7 - - - 237 - 08-Nov-11 00:00:00 - 08-Nov-11 00:01:00 - 2 - 421000000000 - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 0.9900000000000000000 - 0.0500000000000000000 - 52 - 6 - - - 238 - 21-Nov-11 00:00:00 - 21-Nov-11 00:44:00 - 3 - 3239000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 1.9800000000000000000 - 0.0900000000000000000 - 53 - 7 - - - 239 - 21-Nov-11 00:00:00 - - 1 - 3425000000000 - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 1.9800000000000000000 - 0.0900000000000000000 - 55 - 3 - - - 240 - 22-Nov-11 00:00:00 - - 0 - 99388000000000 - Calle Lira, 198 - Santiago - - Chile - - 3.9600000000000000000 - 0.1800000000000000000 - 57 - 2 - - - 241 - 23-Nov-11 00:00:00 - - 1 - 688589000000000 - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 5.9400000000000000000 - 0.2700000000000000000 - 2 - 3 - - - 242 - 26-Nov-11 00:00:00 - 28-Nov-11 14:26:00 - 2 - 226236000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 8.9100000000000000000 - 0.4100000000000000000 - 8 - 6 - - - 243 - 01-Dec-11 00:00:00 - - 1 - 952000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 13.8600000000000000000 - 0.6300000000000000000 - 17 - 4 - - - 244 - 09-Dec-11 00:00:00 - - 0 - - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 0.9900000000000000000 - 0.0500000000000000000 - 31 - 2 - - - 245 - 22-Dec-11 00:00:00 - - 1 - 1249000000000 - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 1.9800000000000000000 - 0.0900000000000000000 - 32 - 4 - - - 246 - 22-Dec-11 00:00:00 - - 0 - - Rua da Assunção 53 - Lisbon - - Portugal - - 1.9800000000000000000 - 0.0900000000000000000 - 34 - 1 - - - 247 - 23-Dec-11 00:00:00 - - 0 - 376909000000000 - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 3.9600000000000000000 - 0.1800000000000000000 - 36 - 1 - - - 248 - 24-Dec-11 00:00:00 - 24-Dec-11 00:02:00 - 3 - 701000000000 - 8, Rue Hanovre - Paris - - France - 75002 - 5.9400000000000000000 - 0.2700000000000000000 - 40 - 7 - - - 249 - 27-Dec-11 00:00:00 - 27-Dec-11 07:01:00 - 3 - - 3 Chatham Street - Dublin - Dublin - Ireland - - 8.9100000000000000000 - 0.4100000000000000000 - 46 - 7 - - - 250 - 01-Jan-12 00:00:00 - 01-Jan-12 13:00:00 - 3 - - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 13.8600000000000000000 - 0.6300000000000000000 - 55 - 8 - - - 251 - 09-Jan-12 00:00:00 - 11-Jan-12 04:28:00 - 3 - 292022000000000 - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 0.9900000000000000000 - 0.0500000000000000000 - 10 - 8 - - - 252 - 22-Jan-12 00:00:00 - 22-Jan-12 12:20:00 - 3 - - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 1.9800000000000000000 - 0.0900000000000000000 - 11 - 7 - - - 253 - 22-Jan-12 00:00:00 - 22-Jan-12 10:22:00 - 3 - - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 1.9800000000000000000 - 0.0900000000000000000 - 13 - 8 - - - 254 - 23-Jan-12 00:00:00 - - 1 - - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 3.9600000000000000000 - 0.1800000000000000000 - 15 - 4 - - - 255 - 24-Jan-12 00:00:00 - 24-Jan-12 00:27:00 - 2 - 3562000000000 - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 5.9400000000000000000 - 0.2700000000000000000 - 19 - 5 - - - 256 - 27-Jan-12 00:00:00 - - 0 - 486985000000000 - 319 N. Frances Street - Madison - WI - USA - 53703 - 8.9100000000000000000 - 0.4100000000000000000 - 25 - 1 - - - 257 - 01-Feb-12 00:00:00 - - 1 - 2226000000000 - Rua da Assunção 53 - Lisbon - - Portugal - - 13.8600000000000000000 - 0.6300000000000000000 - 34 - 4 - - - 258 - 09-Feb-12 00:00:00 - - 0 - 2865000000000 - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 0.9900000000000000000 - 0.0500000000000000000 - 48 - 1 - - - 259 - 22-Feb-12 00:00:00 - 22-Feb-12 11:25:00 - 3 - - Ordynacka 10 - Warsaw - - Poland - 00-358 - 1.9800000000000000000 - 0.0900000000000000000 - 49 - 7 - - - 260 - 22-Feb-12 00:00:00 - 24-Feb-12 21:38:00 - 3 - 619665000000000 - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 1.9800000000000000000 - 0.0900000000000000000 - 51 - 7 - - - 261 - 23-Feb-12 00:00:00 - 23-Feb-12 12:35:00 - 3 - - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 3.9600000000000000000 - 0.1800000000000000000 - 53 - 8 - - - 262 - 24-Feb-12 00:00:00 - - 0 - - Calle Lira, 198 - Santiago - - Chile - - 5.9400000000000000000 - 0.2700000000000000000 - 57 - 1 - - - 263 - 27-Feb-12 00:00:00 - - 0 - 2843000000000 - Ullevålsveien 14 - Oslo - - Norway - 0171 - 8.9100000000000000000 - 0.4100000000000000000 - 4 - 2 - - - 264 - 03-Mar-12 00:00:00 - 03-Mar-12 11:39:00 - 2 - 43863000000000 - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 13.8600000000000000000 - 0.6300000000000000000 - 13 - 6 - - - 265 - 11-Mar-12 00:00:00 - 11-Mar-12 00:03:00 - 3 - 308000000000 - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 0.9900000000000000000 - 0.0500000000000000000 - 27 - 7 - - - 266 - 24-Mar-12 00:00:00 - - 1 - 155865000000000 - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 1.9800000000000000000 - 0.0900000000000000000 - 28 - 4 - - - 267 - 24-Mar-12 00:00:00 - 24-Mar-12 13:04:00 - 2 - - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 1.9800000000000000000 - 0.0900000000000000000 - 30 - 5 - - - 268 - 25-Mar-12 00:00:00 - 25-Mar-12 14:51:00 - 2 - - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 3.9600000000000000000 - 0.1800000000000000000 - 32 - 5 - - - 269 - 26-Mar-12 00:00:00 - - 0 - 347614000000000 - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 5.9400000000000000000 - 0.2700000000000000000 - 36 - 1 - - - 270 - 29-Mar-12 00:00:00 - 29-Mar-12 12:53:00 - 3 - - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 8.9100000000000000000 - 0.4100000000000000000 - 42 - 7 - - - 271 - 03-Apr-12 00:00:00 - 03-Apr-12 11:20:00 - 2 - - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 13.8600000000000000000 - 0.6300000000000000000 - 51 - 5 - - - 272 - 11-Apr-12 00:00:00 - - 1 - - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 0.9900000000000000000 - 0.0500000000000000000 - 6 - 3 - - - 273 - 24-Apr-12 00:00:00 - 30-Apr-12 05:22:00 - 3 - 813040000000000 - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 1.9800000000000000000 - 0.0900000000000000000 - 7 - 8 - - - 274 - 24-Apr-12 00:00:00 - - 1 - - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 1.9800000000000000000 - 0.0900000000000000000 - 9 - 3 - - - 275 - 25-Apr-12 00:00:00 - 25-Apr-12 10:37:00 - 2 - - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 3.9600000000000000000 - 0.1800000000000000000 - 11 - 5 - - - 276 - 26-Apr-12 00:00:00 - 02-May-12 01:39:00 - 3 - 738962000000000 - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 5.9400000000000000000 - 0.2700000000000000000 - 15 - 8 - - - 277 - 29-Apr-12 00:00:00 - 02-May-12 08:50:00 - 2 - 623005000000000 - 801 W 4th Street - Reno - NV - USA - 89503 - 8.9100000000000000000 - 0.4100000000000000000 - 21 - 5 - - - 278 - 04-May-12 00:00:00 - - 1 - 381000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 13.8600000000000000000 - 0.6300000000000000000 - 30 - 3 - - - 279 - 12-May-12 00:00:00 - 14-May-12 17:16:00 - 3 - 795562000000000 - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 0.9900000000000000000 - 0.0500000000000000000 - 44 - 8 - - - 280 - 25-May-12 00:00:00 - - 1 - 305372000000000 - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 1.9800000000000000000 - 0.0900000000000000000 - 45 - 4 - - - 281 - 25-May-12 00:00:00 - - 0 - 2376000000000 - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 1.9800000000000000000 - 0.0900000000000000000 - 47 - 1 - - - 282 - 26-May-12 00:00:00 - 03-Jun-12 18:49:00 - 2 - 801621000000000 - Ordynacka 10 - Warsaw - - Poland - 00-358 - 3.9600000000000000000 - 0.1800000000000000000 - 49 - 5 - - - 283 - 27-May-12 00:00:00 - - 1 - 229496000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 5.9400000000000000000 - 0.2700000000000000000 - 53 - 4 - - - 284 - 30-May-12 00:00:00 - 30-May-12 11:47:00 - 3 - - 3,Raj Bhavan Road - Bangalore - - India - 560001 - 8.9100000000000000000 - 0.4100000000000000000 - 59 - 7 - - - 285 - 04-Jun-12 00:00:00 - - 1 - 617950000000000 - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 13.8600000000000000000 - 0.6300000000000000000 - 9 - 4 - - - 286 - 12-Jun-12 00:00:00 - - 0 - - 69 Salem Street - Boston - MA - USA - 2113 - 0.9900000000000000000 - 0.0500000000000000000 - 23 - 1 - - - 287 - 25-Jun-12 00:00:00 - - 0 - 2017000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 1.9800000000000000000 - 0.0900000000000000000 - 24 - 1 - - - 288 - 25-Jun-12 00:00:00 - 26-Jun-12 04:58:00 - 3 - 139283000000000 - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 1.9800000000000000000 - 0.0900000000000000000 - 26 - 8 - - - 289 - 26-Jun-12 00:00:00 - - 1 - 220653000000000 - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 3.9600000000000000000 - 0.1800000000000000000 - 28 - 4 - - - 290 - 27-Jun-12 00:00:00 - - 0 - 311174000000000 - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 5.9400000000000000000 - 0.2700000000000000000 - 32 - 1 - - - 291 - 30-Jun-12 00:00:00 - - 1 - - Barbarossastraße 19 - Berlin - - Germany - 10779 - 8.9100000000000000000 - 0.4100000000000000000 - 38 - 3 - - - 292 - 05-Jul-12 00:00:00 - 05-Jul-12 05:02:00 - 2 - - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 13.8600000000000000000 - 0.6300000000000000000 - 47 - 6 - - - 293 - 13-Jul-12 00:00:00 - 13-Jul-12 09:54:00 - 3 - 53563000000000 - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - 0.9900000000000000000 - 0.0500000000000000000 - 2 - 8 - - - 294 - 26-Jul-12 00:00:00 - 26-Jul-12 04:28:00 - 2 - - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 1.9800000000000000000 - 0.0900000000000000000 - 3 - 5 - - - 295 - 26-Jul-12 00:00:00 - - 0 - 1710000000000 - Klanova 9/506 - Prague - - Czech Republic - 14700 - 1.9800000000000000000 - 0.0900000000000000000 - 5 - 2 - - - 296 - 27-Jul-12 00:00:00 - - 0 - 231592000000000 - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 3.9600000000000000000 - 0.1800000000000000000 - 7 - 2 - - - 297 - 28-Jul-12 00:00:00 - 02-Aug-12 01:51:00 - 2 - 522073000000000 - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 5.9400000000000000000 - 0.2700000000000000000 - 11 - 5 - - - 298 - 31-Jul-12 00:00:00 - 02-Aug-12 21:12:00 - 3 - 456789000000000 - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - 10.9100000000000000000 - 0.5000000000000000000 - 17 - 7 - - - 299 - 05-Aug-12 00:00:00 - - 1 - 275662000000000 - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 23.8600000000000000000 - 1.0900000000000000000 - 26 - 4 - - - 300 - 13-Aug-12 00:00:00 - - 0 - - 8, Rue Hanovre - Paris - - France - 75002 - 0.9900000000000000000 - 0.0500000000000000000 - 40 - 1 - - - 301 - 26-Aug-12 00:00:00 - - 1 - 767674000000000 - 11, Place Bellecour - Lyon - - France - 69002 - 1.9800000000000000000 - 0.0900000000000000000 - 41 - 4 - - - 302 - 26-Aug-12 00:00:00 - - 1 - 3464000000000 - 68, Rue Jouvence - Dijon - - France - 21000 - 1.9800000000000000000 - 0.0900000000000000000 - 43 - 4 - - - 303 - 27-Aug-12 00:00:00 - 27-Aug-12 06:17:00 - 2 - - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 3.9600000000000000000 - 0.1800000000000000000 - 45 - 6 - - - 304 - 28-Aug-12 00:00:00 - 28-Aug-12 00:05:00 - 3 - 2112000000000 - Ordynacka 10 - Warsaw - - Poland - 00-358 - 5.9400000000000000000 - 0.2700000000000000000 - 49 - 8 - - - 305 - 31-Aug-12 00:00:00 - - 1 - - 421 Bourke Street - Sidney - NSW - Australia - 2010 - 8.9100000000000000000 - 0.4100000000000000000 - 55 - 4 - - - 306 - 05-Sep-12 00:00:00 - 05-Sep-12 12:40:00 - 2 - - Klanova 9/506 - Prague - - Czech Republic - 14700 - 16.8600000000000000000 - 0.7700000000000000000 - 5 - 5 - - - 307 - 13-Sep-12 00:00:00 - 13-Sep-12 11:51:00 - 3 - - 1 Infinite Loop - Cupertino - CA - USA - 95014 - 1.9900000000000000000 - 0.1000000000000000000 - 19 - 7 - - - 308 - 26-Sep-12 00:00:00 - 26-Sep-12 09:41:00 - 2 - - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 3.9800000000000000000 - 0.1900000000000000000 - 20 - 5 - - - 309 - 26-Sep-12 00:00:00 - 26-Sep-12 08:09:00 - 3 - - 120 S Orange Ave - Orlando - FL - USA - 32801 - 3.9800000000000000000 - 0.1900000000000000000 - 22 - 7 - - - 310 - 27-Sep-12 00:00:00 - 27-Sep-12 01:39:00 - 2 - - 162 E Superior Street - Chicago - IL - USA - 60611 - 7.9600000000000000000 - 0.3700000000000000000 - 24 - 5 - - - 311 - 28-Sep-12 00:00:00 - - 1 - - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 11.9400000000000000000 - 0.5500000000000000000 - 28 - 4 - - - 312 - 01-Oct-12 00:00:00 - - 0 - - Rua da Assunção 53 - Lisbon - - Portugal - - 10.9100000000000000000 - 0.5000000000000000000 - 34 - 2 - - - 313 - 06-Oct-12 00:00:00 - - 0 - 347001000000000 - 68, Rue Jouvence - Dijon - - France - 21000 - 16.8600000000000000000 - 0.7700000000000000000 - 43 - 2 - - - 314 - 14-Oct-12 00:00:00 - - 1 - 626000000000 - Calle Lira, 198 - Santiago - - Chile - - 0.9900000000000000000 - 0.0500000000000000000 - 57 - 4 - - - 315 - 27-Oct-12 00:00:00 - 27-Oct-12 00:20:00 - 2 - 1361000000000 - 12,Community Centre - Delhi - - India - 110017 - 1.9800000000000000000 - 0.0900000000000000000 - 58 - 6 - - - 316 - 27-Oct-12 00:00:00 - - 1 - 141143000000000 - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 1.9800000000000000000 - 0.0900000000000000000 - 1 - 3 - - - 317 - 28-Oct-12 00:00:00 - 28-Oct-12 05:10:00 - 2 - - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 3.9600000000000000000 - 0.1800000000000000000 - 3 - 6 - - - 318 - 29-Oct-12 00:00:00 - - 1 - 1100000000000 - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 5.9400000000000000000 - 0.2700000000000000000 - 7 - 4 - - - 319 - 01-Nov-12 00:00:00 - - 0 - - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - 8.9100000000000000000 - 0.4100000000000000000 - 13 - 2 - - - 320 - 06-Nov-12 00:00:00 - 06-Nov-12 00:06:00 - 2 - 599000000000 - 120 S Orange Ave - Orlando - FL - USA - 32801 - 13.8600000000000000000 - 0.6300000000000000000 - 22 - 6 - - - 321 - 14-Nov-12 00:00:00 - - 1 - - Tauentzienstraße 8 - Berlin - - Germany - 10789 - 0.9900000000000000000 - 0.0500000000000000000 - 36 - 4 - - - 322 - 27-Nov-12 00:00:00 - 30-Nov-12 04:14:00 - 2 - 342705000000000 - Berger Straße 10 - Frankfurt - - Germany - 60316 - 1.9800000000000000000 - 0.0900000000000000000 - 37 - 6 - - - 323 - 27-Nov-12 00:00:00 - - 0 - 398419000000000 - 4, Rue Milton - Paris - - France - 75009 - 1.9800000000000000000 - 0.0900000000000000000 - 39 - 2 - - - 324 - 28-Nov-12 00:00:00 - - 0 - - 11, Place Bellecour - Lyon - - France - 69002 - 3.9600000000000000000 - 0.1800000000000000000 - 41 - 1 - - - 325 - 29-Nov-12 00:00:00 - 29-Nov-12 09:10:00 - 2 - - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 5.9400000000000000000 - 0.2700000000000000000 - 45 - 5 - - - 326 - 02-Dec-12 00:00:00 - 07-Dec-12 21:24:00 - 3 - 734010000000000 - Celsiusg. 9 - Stockholm - - Sweden - 11230 - 8.9100000000000000000 - 0.4100000000000000000 - 51 - 8 - - - 327 - 07-Dec-12 00:00:00 - - 1 - 389346000000000 - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 13.8600000000000000000 - 0.6300000000000000000 - 1 - 4 - - - 328 - 15-Dec-12 00:00:00 - - 1 - 2494000000000 - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - 0.9900000000000000000 - 0.0500000000000000000 - 15 - 4 - - - 329 - 28-Dec-12 00:00:00 - - 0 - 3083000000000 - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 1.9800000000000000000 - 0.0900000000000000000 - 16 - 1 - - - 330 - 28-Dec-12 00:00:00 - - 1 - 796441000000000 - 627 Broadway - New York - NY - USA - 10012-2612 - 1.9800000000000000000 - 0.0900000000000000000 - 18 - 4 - - - 331 - 29-Dec-12 00:00:00 - - 1 - 839475000000000 - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 3.9600000000000000000 - 0.1800000000000000000 - 20 - 4 - - - 332 - 30-Dec-12 00:00:00 - 30-Dec-12 21:47:00 - 3 - 794966000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 5.9400000000000000000 - 0.2700000000000000000 - 24 - 7 - - - 333 - 02-Jan-13 00:00:00 - 02-Jan-13 00:04:00 - 3 - 930000000000 - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - 8.9100000000000000000 - 0.4100000000000000000 - 30 - 7 - - - 334 - 07-Jan-13 00:00:00 - 07-Jan-13 00:06:00 - 3 - 830000000000 - 4, Rue Milton - Paris - - France - 75009 - 13.8600000000000000000 - 0.6300000000000000000 - 39 - 8 - - - 335 - 15-Jan-13 00:00:00 - - 0 - 153686000000000 - 113 Lupus St - London - - United Kingdom - SW1V 3EN - 0.9900000000000000000 - 0.0500000000000000000 - 53 - 1 - - - 336 - 28-Jan-13 00:00:00 - 28-Jan-13 13:37:00 - 2 - 184656000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 1.9800000000000000000 - 0.0900000000000000000 - 54 - 6 - - - 337 - 28-Jan-13 00:00:00 - 30-Jan-13 16:03:00 - 3 - 439240000000000 - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 1.9800000000000000000 - 0.0900000000000000000 - 56 - 7 - - - 338 - 29-Jan-13 00:00:00 - - 1 - 2570000000000 - 12,Community Centre - Delhi - - India - 110017 - 3.9600000000000000000 - 0.1800000000000000000 - 58 - 4 - - - 339 - 30-Jan-13 00:00:00 - - 1 - - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 5.9400000000000000000 - 0.2700000000000000000 - 3 - 4 - - - 340 - 02-Feb-13 00:00:00 - 02-Feb-13 14:45:00 - 3 - - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - 8.9100000000000000000 - 0.4100000000000000000 - 9 - 8 - - - 341 - 07-Feb-13 00:00:00 - - 1 - - 627 Broadway - New York - NY - USA - 10012-2612 - 13.8600000000000000000 - 0.6300000000000000000 - 18 - 3 - - - 342 - 15-Feb-13 00:00:00 - 15-Feb-13 09:24:00 - 2 - - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - 0.9900000000000000000 - 0.0500000000000000000 - 32 - 5 - - - 343 - 28-Feb-13 00:00:00 - - 0 - 148000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 1.9800000000000000000 - 0.0900000000000000000 - 33 - 1 - - - 344 - 28-Feb-13 00:00:00 - 01-Mar-13 06:09:00 - 3 - 316646000000000 - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 1.9800000000000000000 - 0.0900000000000000000 - 35 - 7 - - - 345 - 01-Mar-13 00:00:00 - 01-Mar-13 00:18:00 - 2 - 3098000000000 - Berger Straße 10 - Frankfurt - - Germany - 60316 - 3.9600000000000000000 - 0.1800000000000000000 - 37 - 5 - - - 346 - 02-Mar-13 00:00:00 - - 0 - 156453000000000 - 11, Place Bellecour - Lyon - - France - 69002 - 5.9400000000000000000 - 0.2700000000000000000 - 41 - 2 - - - 347 - 05-Mar-13 00:00:00 - 07-Mar-13 15:35:00 - 2 - 840893000000000 - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - 8.9100000000000000000 - 0.4100000000000000000 - 47 - 5 - - - 348 - 10-Mar-13 00:00:00 - 12-Mar-13 12:18:00 - 2 - 731148000000000 - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 13.8600000000000000000 - 0.6300000000000000000 - 56 - 5 - - - 349 - 18-Mar-13 00:00:00 - 18-Mar-13 06:31:00 - 3 - - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - 0.9900000000000000000 - 0.0500000000000000000 - 11 - 7 - - - 350 - 31-Mar-13 00:00:00 - 31-Mar-13 00:21:00 - 3 - 1959000000000 - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 1.9800000000000000000 - 0.0900000000000000000 - 12 - 8 - - - 351 - 31-Mar-13 00:00:00 - 31-Mar-13 16:08:00 - 2 - 269097000000000 - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 1.9800000000000000000 - 0.0900000000000000000 - 14 - 5 - - - 352 - 01-Apr-13 00:00:00 - - 0 - - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 3.9600000000000000000 - 0.1800000000000000000 - 16 - 2 - - - 353 - 02-Apr-13 00:00:00 - 02-Apr-13 00:03:00 - 2 - 317000000000 - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 5.9400000000000000000 - 0.2700000000000000000 - 20 - 5 - - - 354 - 05-Apr-13 00:00:00 - 05-Apr-13 01:19:00 - 2 - 160366000000000 - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - 8.9100000000000000000 - 0.4100000000000000000 - 26 - 6 - - - 355 - 10-Apr-13 00:00:00 - 10-Apr-13 05:57:00 - 2 - - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 13.8600000000000000000 - 0.6300000000000000000 - 35 - 6 - - - 356 - 18-Apr-13 00:00:00 - 18-Apr-13 15:06:00 - 3 - 769029000000000 - Ordynacka 10 - Warsaw - - Poland - 00-358 - 0.9900000000000000000 - 0.0500000000000000000 - 49 - 7 - - - 357 - 01-May-13 00:00:00 - - 0 - 3369000000000 - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 1.9800000000000000000 - 0.0900000000000000000 - 50 - 2 - - - 358 - 01-May-13 00:00:00 - 01-May-13 00:17:00 - 2 - 2914000000000 - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 1.9800000000000000000 - 0.0900000000000000000 - 52 - 6 - - - 359 - 02-May-13 00:00:00 - - 1 - 15000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 3.9600000000000000000 - 0.1800000000000000000 - 54 - 4 - - - 360 - 03-May-13 00:00:00 - 08-May-13 11:46:00 - 2 - 755663000000000 - 12,Community Centre - Delhi - - India - 110017 - 5.9400000000000000000 - 0.2700000000000000000 - 58 - 5 - - - 361 - 06-May-13 00:00:00 - - 0 - 300290000000000 - Klanova 9/506 - Prague - - Czech Republic - 14700 - 8.9100000000000000000 - 0.4100000000000000000 - 5 - 1 - - - 362 - 11-May-13 00:00:00 - - 1 - - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - 13.8600000000000000000 - 0.6300000000000000000 - 14 - 3 - - - 363 - 19-May-13 00:00:00 - - 1 - 403643000000000 - 302 S 700 E - Salt Lake City - UT - USA - 84102 - 0.9900000000000000000 - 0.0500000000000000000 - 28 - 4 - - - 364 - 01-Jun-13 00:00:00 - - 1 - 363000000000 - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 1.9800000000000000000 - 0.0900000000000000000 - 29 - 4 - - - 365 - 01-Jun-13 00:00:00 - - 0 - 518016000000000 - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 1.9800000000000000000 - 0.0900000000000000000 - 31 - 2 - - - 366 - 02-Jun-13 00:00:00 - 02-Jun-13 14:24:00 - 2 - 378654000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 3.9600000000000000000 - 0.1800000000000000000 - 33 - 5 - - - 367 - 03-Jun-13 00:00:00 - - 1 - - Berger Straße 10 - Frankfurt - - Germany - 60316 - 5.9400000000000000000 - 0.2700000000000000000 - 37 - 3 - - - 368 - 06-Jun-13 00:00:00 - - 0 - 449445000000000 - 68, Rue Jouvence - Dijon - - France - 21000 - 8.9100000000000000000 - 0.4100000000000000000 - 43 - 2 - - - 369 - 11-Jun-13 00:00:00 - - 1 - - 202 Hoxton Street - London - - United Kingdom - N1 5LH - 13.8600000000000000000 - 0.6300000000000000000 - 52 - 3 - - - 370 - 19-Jun-13 00:00:00 - - 0 - 789394000000000 - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - 0.9900000000000000000 - 0.0500000000000000000 - 7 - 1 - - - 371 - 02-Jul-13 00:00:00 - - 1 - 1502000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 1.9800000000000000000 - 0.0900000000000000000 - 8 - 4 - - - 372 - 02-Jul-13 00:00:00 - - 0 - - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 1.9800000000000000000 - 0.0900000000000000000 - 10 - 2 - - - 373 - 03-Jul-13 00:00:00 - 03-Jul-13 00:43:00 - 3 - - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 3.9600000000000000000 - 0.1800000000000000000 - 12 - 8 - - - 374 - 04-Jul-13 00:00:00 - - 1 - - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - 5.9400000000000000000 - 0.2700000000000000000 - 16 - 3 - - - 375 - 07-Jul-13 00:00:00 - - 1 - 167000000000 - 120 S Orange Ave - Orlando - FL - USA - 32801 - 8.9100000000000000000 - 0.4100000000000000000 - 22 - 4 - - - 376 - 12-Jul-13 00:00:00 - 12-Jul-13 10:33:00 - 3 - - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - 13.8600000000000000000 - 0.6300000000000000000 - 31 - 7 - - - 377 - 20-Jul-13 00:00:00 - 20-Jul-13 06:47:00 - 2 - 121413000000000 - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - 0.9900000000000000000 - 0.0500000000000000000 - 45 - 5 - - - 378 - 02-Aug-13 00:00:00 - - 1 - 510000000000 - 3 Chatham Street - Dublin - Dublin - Ireland - - 1.9800000000000000000 - 0.0900000000000000000 - 46 - 4 - - - 379 - 02-Aug-13 00:00:00 - - 1 - - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 1.9800000000000000000 - 0.0900000000000000000 - 48 - 4 - - - 380 - 03-Aug-13 00:00:00 - - 1 - 453000000000 - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 3.9600000000000000000 - 0.1800000000000000000 - 50 - 3 - - - 381 - 04-Aug-13 00:00:00 - - 1 - 360518000000000 - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - 5.9400000000000000000 - 0.2700000000000000000 - 54 - 3 - - - 382 - 07-Aug-13 00:00:00 - 07-Aug-13 02:04:00 - 3 - - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - 8.9100000000000000000 - 0.4100000000000000000 - 1 - 8 - - - 383 - 12-Aug-13 00:00:00 - 13-Aug-13 20:45:00 - 2 - 788267000000000 - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - 13.8600000000000000000 - 0.6300000000000000000 - 10 - 6 - - - 384 - 20-Aug-13 00:00:00 - - 0 - 1592000000000 - 162 E Superior Street - Chicago - IL - USA - 60611 - 0.9900000000000000000 - 0.0500000000000000000 - 24 - 2 - - - 385 - 02-Sep-13 00:00:00 - 02-Sep-13 06:51:00 - 3 - - 319 N. Frances Street - Madison - WI - USA - 53703 - 1.9800000000000000000 - 0.0900000000000000000 - 25 - 8 - - - 386 - 02-Sep-13 00:00:00 - - 1 - - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 1.9800000000000000000 - 0.0900000000000000000 - 27 - 3 - - - 387 - 03-Sep-13 00:00:00 - - 0 - 529687000000000 - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 3.9600000000000000000 - 0.1800000000000000000 - 29 - 2 - - - 388 - 04-Sep-13 00:00:00 - - 0 - 3263000000000 - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - 5.9400000000000000000 - 0.2700000000000000000 - 33 - 2 - - - 389 - 07-Sep-13 00:00:00 - - 1 - - 4, Rue Milton - Paris - - France - 75009 - 8.9100000000000000000 - 0.4100000000000000000 - 39 - 3 - - - 390 - 12-Sep-13 00:00:00 - - 0 - 762000000000 - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - 13.8600000000000000000 - 0.6300000000000000000 - 48 - 2 - - - 391 - 20-Sep-13 00:00:00 - - 1 - 1509000000000 - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - 0.9900000000000000000 - 0.0500000000000000000 - 3 - 4 - - - 392 - 03-Oct-13 00:00:00 - - 0 - 1592000000000 - Ullevålsveien 14 - Oslo - - Norway - 0171 - 1.9800000000000000000 - 0.0900000000000000000 - 4 - 2 - - - 393 - 03-Oct-13 00:00:00 - 03-Oct-13 11:23:00 - 3 - - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 1.9800000000000000000 - 0.0900000000000000000 - 6 - 8 - - - 394 - 04-Oct-13 00:00:00 - 09-Oct-13 04:50:00 - 3 - 659301000000000 - Grétrystraat 63 - Brussels - - Belgium - 1000 - 3.9600000000000000000 - 0.1800000000000000000 - 8 - 8 - - - 395 - 05-Oct-13 00:00:00 - 08-Oct-13 02:39:00 - 3 - 750621000000000 - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - 5.9400000000000000000 - 0.2700000000000000000 - 12 - 7 - - - 396 - 08-Oct-13 00:00:00 - 09-Oct-13 17:25:00 - 3 - 173366000000000 - 627 Broadway - New York - NY - USA - 10012-2612 - 8.9100000000000000000 - 0.4100000000000000000 - 18 - 8 - - - 397 - 13-Oct-13 00:00:00 - - 0 - - 1033 N Park Ave - Tucson - AZ - USA - 85719 - 13.8600000000000000000 - 0.6300000000000000000 - 27 - 1 - - - 398 - 21-Oct-13 00:00:00 - 30-Oct-13 01:30:00 - 2 - 861979000000000 - 11, Place Bellecour - Lyon - - France - 69002 - 0.9900000000000000000 - 0.0500000000000000000 - 41 - 6 - - - 399 - 03-Nov-13 00:00:00 - 09-Nov-13 18:38:00 - 2 - 635442000000000 - 9, Place Louis Barthou - Bordeaux - - France - 33000 - 1.9800000000000000000 - 0.0900000000000000000 - 42 - 5 - - - 400 - 03-Nov-13 00:00:00 - 03-Nov-13 10:05:00 - 3 - - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 1.9800000000000000000 - 0.0900000000000000000 - 44 - 8 - - - 401 - 04-Nov-13 00:00:00 - 09-Nov-13 18:47:00 - 3 - 589114000000000 - 3 Chatham Street - Dublin - Dublin - Ireland - - 3.9600000000000000000 - 0.1800000000000000000 - 46 - 7 - - - 402 - 05-Nov-13 00:00:00 - - 1 - - C/ San Bernardo 85 - Madrid - - Spain - 28015 - 5.9400000000000000000 - 0.2700000000000000000 - 50 - 3 - - - 403 - 08-Nov-13 00:00:00 - - 0 - 258989000000000 - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - 8.9100000000000000000 - 0.4100000000000000000 - 56 - 2 - - - 404 - 13-Nov-13 00:00:00 - 13-Nov-13 07:34:00 - 2 - - Rilská 3174/6 - Prague - - Czech Republic - 14300 - 25.8600000000000000000 - 1.1800000000000000000 - 6 - 6 - - - 405 - 21-Nov-13 00:00:00 - - 1 - 213842000000000 - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - 0.9900000000000000000 - 0.0500000000000000000 - 20 - 4 - - - 406 - 04-Dec-13 00:00:00 - - 1 - 707632000000000 - 801 W 4th Street - Reno - NV - USA - 89503 - 1.9800000000000000000 - 0.0900000000000000000 - 21 - 3 - - - 407 - 04-Dec-13 00:00:00 - - 0 - 620825000000000 - 69 Salem Street - Boston - MA - USA - 2113 - 1.9800000000000000000 - 0.0900000000000000000 - 23 - 2 - - - 408 - 05-Dec-13 00:00:00 - - 1 - 80257000000000 - 319 N. Frances Street - Madison - WI - USA - 53703 - 3.9600000000000000000 - 0.1800000000000000000 - 25 - 3 - - - 409 - 06-Dec-13 00:00:00 - - 1 - 792041000000000 - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - 5.9400000000000000000 - 0.2700000000000000000 - 29 - 3 - - - 410 - 09-Dec-13 00:00:00 - 09-Dec-13 04:21:00 - 3 - - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - 8.9100000000000000000 - 0.4100000000000000000 - 35 - 7 - - - 411 - 14-Dec-13 00:00:00 - - 1 - - Porthaninkatu 9 - Helsinki - - Finland - 00530 - 13.8600000000000000000 - 0.6300000000000000000 - 44 - 3 - - - 412 - 22-Dec-13 00:00:00 - 22-Dec-13 03:34:00 - 3 - 422879000000000 - 12,Community Centre - Delhi - - India - 110017 - 1.9900000000000000000 - 0.1000000000000000000 - 58 - 7 - - - - - - System.Int32 - System.String - System.DateTime - System.DateTime - System.Int32 - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - - - - 1 - General Manager - 18-Feb-62 00:00:00 - 14-Aug-02 00:00:00 - - Adams - Andrew - 11120 Jasper Ave NW - Edmonton - AB - Canada - T5K 2N1 - +1 (780) 428-9482 - +1 (780) 428-3457 - andrew@chinookcorp.com - - - 2 - Sales Manager - 08-Dec-58 00:00:00 - 01-May-02 00:00:00 - 1 - Edwards - Nancy - 825 8 Ave SW - Calgary - AB - Canada - T2P 2T3 - +1 (403) 262-3443 - +1 (403) 262-3322 - nancy@chinookcorp.com - - - 3 - Sales Support Agent - 29-Aug-73 00:00:00 - 01-Apr-02 00:00:00 - 2 - Peacock - Jane - 1111 6 Ave SW - Calgary - AB - Canada - T2P 5M5 - +1 (403) 262-3443 - +1 (403) 262-6712 - jane@chinookcorp.com - - - 4 - Sales Support Agent - 19-Sep-47 00:00:00 - 03-May-03 00:00:00 - 2 - Park - Margaret - 683 10 Street SW - Calgary - AB - Canada - T2P 5G3 - +1 (403) 263-4423 - +1 (403) 263-4289 - margaret@chinookcorp.com - - - 5 - Sales Support Agent - 03-Mar-65 00:00:00 - 17-Oct-03 00:00:00 - 2 - Johnson - Steve - 7727B 41 Ave - Calgary - AB - Canada - T3B 1Y7 - 1 (780) 836-9987 - 1 (780) 836-9543 - steve@chinookcorp.com - - - 6 - IT Manager - 01-Jul-73 00:00:00 - 17-Oct-03 00:00:00 - 1 - Mitchell - Michael - 5827 Bowness Road NW - Calgary - AB - Canada - T3B 0C5 - +1 (403) 246-9887 - +1 (403) 246-9899 - michael@chinookcorp.com - - - 7 - IT Staff - 29-May-70 00:00:00 - 02-Jan-04 00:00:00 - 6 - King - Robert - 590 Columbia Boulevard West - Lethbridge - AB - Canada - T1K 5N8 - +1 (403) 456-9986 - +1 (403) 456-8485 - robert@chinookcorp.com - - - 8 - IT Staff - 09-Jan-68 00:00:00 - 04-Mar-04 00:00:00 - 6 - Callahan - Laura - 923 7 ST NW - Lethbridge - AB - Canada - T1H 1Y8 - +1 (403) 467-3351 - +1 (403) 467-8772 - laura@chinookcorp.com - - - - - - System.Int32 - System.Int32 - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - System.String - - - - 1 - 3 - Embraer - Empresa Brasileira de Aeronáutica S.A. - Gonçalves - Luís - Av. Brigadeiro Faria Lima, 2170 - São José dos Campos - SP - Brazil - 12227-000 - +55 (12) 3923-5555 - +55 (12) 3923-5566 - luisg@embraer.com.br - - - 2 - 5 - - Köhler - Leonie - Theodor-Heuss-Straße 34 - Stuttgart - - Germany - 70174 - +49 0711 2842222 - - leonekohler@surfeu.de - - - 3 - 3 - - Tremblay - François - 1498 rue Bélanger - Montréal - QC - Canada - H2G 1A7 - +1 (514) 721-4711 - - ftremblay@gmail.com - - - 4 - 4 - - Hansen - Bjørn - Ullevålsveien 14 - Oslo - - Norway - 0171 - +47 22 44 22 22 - - bjorn.hansen@yahoo.no - - - 5 - 4 - JetBrains s.r.o. - Wichterlová - František - Klanova 9/506 - Prague - - Czech Republic - 14700 - +420 2 4172 5555 - +420 2 4172 5555 - frantisekw@jetbrains.com - - - 6 - 5 - - Holý - Helena - Rilská 3174/6 - Prague - - Czech Republic - 14300 - +420 2 4177 0449 - - hholy@gmail.com - - - 7 - 5 - - Gruber - Astrid - Rotenturmstraße 4, 1010 Innere Stadt - Vienne - - Austria - 1010 - +43 01 5134505 - - astrid.gruber@apple.at - - - 8 - 4 - - Peeters - Daan - Grétrystraat 63 - Brussels - - Belgium - 1000 - +32 02 219 03 03 - - daan_peeters@apple.be - - - 9 - 4 - - Nielsen - Kara - Sønder Boulevard 51 - Copenhagen - - Denmark - 1720 - +453 3331 9991 - - kara.nielsen@jubii.dk - - - 10 - 4 - Woodstock Discos - Martins - Eduardo - Rua Dr. Falcão Filho, 155 - São Paulo - SP - Brazil - 01007-010 - +55 (11) 3033-5446 - +55 (11) 3033-4564 - eduardo@woodstock.com.br - - - 11 - 5 - Banco do Brasil S.A. - Rocha - Alexandre - Av. Paulista, 2022 - São Paulo - SP - Brazil - 01310-200 - +55 (11) 3055-3278 - +55 (11) 3055-8131 - alero@uol.com.br - - - 12 - 3 - Riotur - Almeida - Roberto - Praça Pio X, 119 - Rio de Janeiro - RJ - Brazil - 20040-020 - +55 (21) 2271-7000 - +55 (21) 2271-7070 - roberto.almeida@riotur.gov.br - - - 13 - 4 - - Ramos - Fernanda - Qe 7 Bloco G - Brasília - DF - Brazil - 71020-677 - +55 (61) 3363-5547 - +55 (61) 3363-7855 - fernadaramos4@uol.com.br - - - 14 - 5 - Telus - Philips - Mark - 8210 111 ST NW - Edmonton - AB - Canada - T6G 2C7 - +1 (780) 434-4554 - +1 (780) 434-5565 - mphilips12@shaw.ca - - - 15 - 3 - Rogers Canada - Peterson - Jennifer - 700 W Pender Street - Vancouver - BC - Canada - V6C 1G8 - +1 (604) 688-2255 - +1 (604) 688-8756 - jenniferp@rogers.ca - - - 16 - 4 - Google Inc. - Harris - Frank - 1600 Amphitheatre Parkway - Mountain View - CA - USA - 94043-1351 - +1 (650) 253-0000 - +1 (650) 253-0000 - fharris@google.com - - - 17 - 5 - Microsoft Corporation - Smith - Jack - 1 Microsoft Way - Redmond - WA - USA - 98052-8300 - +1 (425) 882-8080 - +1 (425) 882-8081 - jacksmith@microsoft.com - - - 18 - 3 - - Brooks - Michelle - 627 Broadway - New York - NY - USA - 10012-2612 - +1 (212) 221-3546 - +1 (212) 221-4679 - michelleb@aol.com - - - 19 - 3 - Apple Inc. - Goyer - Tim - 1 Infinite Loop - Cupertino - CA - USA - 95014 - +1 (408) 996-1010 - +1 (408) 996-1011 - tgoyer@apple.com - - - 20 - 4 - - Miller - Dan - 541 Del Medio Avenue - Mountain View - CA - USA - 94040-111 - +1 (650) 644-3358 - - dmiller@comcast.com - - - 21 - 5 - - Chase - Kathy - 801 W 4th Street - Reno - NV - USA - 89503 - +1 (775) 223-7665 - - kachase@hotmail.com - - - 22 - 4 - - Leacock - Heather - 120 S Orange Ave - Orlando - FL - USA - 32801 - +1 (407) 999-7788 - - hleacock@gmail.com - - - 23 - 4 - - Gordon - John - 69 Salem Street - Boston - MA - USA - 2113 - +1 (617) 522-1333 - - johngordon22@yahoo.com - - - 24 - 3 - - Ralston - Frank - 162 E Superior Street - Chicago - IL - USA - 60611 - +1 (312) 332-3232 - - fralston@gmail.com - - - 25 - 5 - - Stevens - Victor - 319 N. Frances Street - Madison - WI - USA - 53703 - +1 (608) 257-0597 - - vstevens@yahoo.com - - - 26 - 4 - - Cunningham - Richard - 2211 W Berry Street - Fort Worth - TX - USA - 76110 - +1 (817) 924-7272 - - ricunningham@hotmail.com - - - 27 - 4 - - Gray - Patrick - 1033 N Park Ave - Tucson - AZ - USA - 85719 - +1 (520) 622-4200 - - patrick.gray@aol.com - - - 28 - 5 - - Barnett - Julia - 302 S 700 E - Salt Lake City - UT - USA - 84102 - +1 (801) 531-7272 - - jubarnett@gmail.com - - - 29 - 3 - - Brown - Robert - 796 Dundas Street West - Toronto - ON - Canada - M6J 1V1 - +1 (416) 363-8888 - - robbrown@shaw.ca - - - 30 - 3 - - Francis - Edward - 230 Elgin Street - Ottawa - ON - Canada - K2P 1L7 - +1 (613) 234-3322 - - edfrancis@yachoo.ca - - - 31 - 5 - - Silk - Martha - 194A Chain Lake Drive - Halifax - NS - Canada - B3S 1C5 - +1 (902) 450-0450 - - marthasilk@gmail.com - - - 32 - 4 - - Mitchell - Aaron - 696 Osborne Street - Winnipeg - MB - Canada - R3L 2B9 - +1 (204) 452-6452 - - aaronmitchell@yahoo.ca - - - 33 - 3 - - Sullivan - Ellie - 5112 48 Street - Yellowknife - NT - Canada - X1A 1N6 - +1 (867) 920-2233 - - ellie.sullivan@shaw.ca - - - 34 - 4 - - Fernandes - João - Rua da Assunção 53 - Lisbon - - Portugal - - +351 (213) 466-111 - - jfernandes@yahoo.pt - - - 35 - 4 - - Sampaio - Madalena - Rua dos Campeões Europeus de Viena, 4350 - Porto - - Portugal - - +351 (225) 022-448 - - masampaio@sapo.pt - - - 36 - 5 - - Schneider - Hannah - Tauentzienstraße 8 - Berlin - - Germany - 10789 - +49 030 26550280 - - hannah.schneider@yahoo.de - - - 37 - 3 - - Zimmermann - Fynn - Berger Straße 10 - Frankfurt - - Germany - 60316 - +49 069 40598889 - - fzimmermann@yahoo.de - - - 38 - 3 - - Schröder - Niklas - Barbarossastraße 19 - Berlin - - Germany - 10779 - +49 030 2141444 - - nschroder@surfeu.de - - - 39 - 4 - - Bernard - Camille - 4, Rue Milton - Paris - - France - 75009 - +33 01 49 70 65 65 - - camille.bernard@yahoo.fr - - - 40 - 4 - - Lefebvre - Dominique - 8, Rue Hanovre - Paris - - France - 75002 - +33 01 47 42 71 71 - - dominiquelefebvre@gmail.com - - - 41 - 5 - - Dubois - Marc - 11, Place Bellecour - Lyon - - France - 69002 - +33 04 78 30 30 30 - - marc.dubois@hotmail.com - - - 42 - 3 - - Girard - Wyatt - 9, Place Louis Barthou - Bordeaux - - France - 33000 - +33 05 56 96 96 96 - - wyatt.girard@yahoo.fr - - - 43 - 3 - - Mercier - Isabelle - 68, Rue Jouvence - Dijon - - France - 21000 - +33 03 80 73 66 99 - - isabelle_mercier@apple.fr - - - 44 - 3 - - Hämäläinen - Terhi - Porthaninkatu 9 - Helsinki - - Finland - 00530 - +358 09 870 2000 - - terhi.hamalainen@apple.fi - - - 45 - 3 - - Kovács - Ladislav - Erzsébet krt. 58. - Budapest - - Hungary - H-1073 - - - ladislav_kovacs@apple.hu - - - 46 - 3 - - O'Reilly - Hugh - 3 Chatham Street - Dublin - Dublin - Ireland - - +353 01 6792424 - - hughoreilly@apple.ie - - - 47 - 5 - - Mancini - Lucas - Via Degli Scipioni, 43 - Rome - RM - Italy - 00192 - +39 06 39733434 - - lucas.mancini@yahoo.it - - - 48 - 5 - - Van der Berg - Johannes - Lijnbaansgracht 120bg - Amsterdam - VV - Netherlands - 1016 - +31 020 6223130 - - johavanderberg@yahoo.nl - - - 49 - 4 - - Wójcik - Stanisław - Ordynacka 10 - Warsaw - - Poland - 00-358 - +48 22 828 37 39 - - stanisław.wójcik@wp.pl - - - 50 - 5 - - Muñoz - Enrique - C/ San Bernardo 85 - Madrid - - Spain - 28015 - +34 914 454 454 - - enrique_munoz@yahoo.es - - - 51 - 5 - - Johansson - Joakim - Celsiusg. 9 - Stockholm - - Sweden - 11230 - +46 08-651 52 52 - - joakim.johansson@yahoo.se - - - 52 - 3 - - Jones - Emma - 202 Hoxton Street - London - - United Kingdom - N1 5LH - +44 020 7707 0707 - - emma_jones@hotmail.com - - - 53 - 3 - - Hughes - Phil - 113 Lupus St - London - - United Kingdom - SW1V 3EN - +44 020 7976 5722 - - phil.hughes@gmail.com - - - 54 - 5 - - Murray - Steve - 110 Raeburn Pl - Edinburgh - - United Kingdom - EH4 1HH - +44 0131 315 3300 - - steve.murray@yahoo.uk - - - 55 - 4 - - Taylor - Mark - 421 Bourke Street - Sidney - NSW - Australia - 2010 - +61 (02) 9332 3633 - - mark.taylor@yahoo.au - - - 56 - 4 - - Gutiérrez - Diego - 307 Macacha Güemes - Buenos Aires - - Argentina - 1106 - +54 (0)11 4311 4333 - - diego.gutierrez@yahoo.ar - - - 57 - 5 - - Rojas - Luis - Calle Lira, 198 - Santiago - - Chile - - +56 (0)2 635 4444 - - luisrojas@yahoo.cl - - - 58 - 3 - - Pareek - Manoj - 12,Community Centre - Delhi - - India - 110017 - +91 0124 39883988 - - manoj.pareek@rediff.com - - - 59 - 3 - - Srivastava - Puja - 3,Raj Bhavan Road - Bangalore - - India - 560001 - +91 080 22289999 - - puja_srivastava@yahoo.in - - - 60 - 3 - - Cheema - Adharma - Sno16-11-741, Dilsukhnagar - Hyderabad - - India - 560001 - +91 080 26239988 - - puja_srivastava@yahoo.in - - - - - - System.Int32 - System.Int32 - - - - 1 - 1 - - - 8 - 1 - - - 17 - 1 - - - 1 - 2 - - - 8 - 2 - - - 17 - 2 - - - 1 - 3 - - - 5 - 3 - - - 8 - 3 - - - 17 - 3 - - - 1 - 4 - - - 5 - 4 - - - 8 - 4 - - - 17 - 4 - - - 1 - 5 - - - 5 - 5 - - - 8 - 5 - - - 17 - 5 - - - 1 - 6 - - - 8 - 6 - - - 1 - 7 - - - 8 - 7 - - - 1 - 8 - - - 8 - 8 - - - 1 - 9 - - - 8 - 9 - - - 1 - 10 - - - 8 - 10 - - - 1 - 11 - - - 8 - 11 - - - 1 - 12 - - - 8 - 12 - - - 1 - 13 - - - 8 - 13 - - - 1 - 14 - - - 8 - 14 - - - 1 - 15 - - - 8 - 15 - - - 1 - 16 - - - 8 - 16 - - - 1 - 17 - - - 8 - 17 - - - 1 - 18 - - - 8 - 18 - - - 1 - 19 - - - 8 - 19 - - - 1 - 20 - - - 8 - 20 - - - 1 - 21 - - - 8 - 21 - - - 1 - 22 - - - 8 - 22 - - - 1 - 23 - - - 5 - 23 - - - 8 - 23 - - - 1 - 24 - - - 5 - 24 - - - 8 - 24 - - - 1 - 25 - - - 5 - 25 - - - 8 - 25 - - - 1 - 26 - - - 5 - 26 - - - 8 - 26 - - - 1 - 27 - - - 5 - 27 - - - 8 - 27 - - - 1 - 28 - - - 5 - 28 - - - 8 - 28 - - - 1 - 29 - - - 5 - 29 - - - 8 - 29 - - - 1 - 30 - - - 5 - 30 - - - 8 - 30 - - - 1 - 31 - - - 5 - 31 - - - 8 - 31 - - - 1 - 32 - - - 5 - 32 - - - 8 - 32 - - - 1 - 33 - - - 5 - 33 - - - 8 - 33 - - - 1 - 34 - - - 5 - 34 - - - 8 - 34 - - - 1 - 35 - - - 5 - 35 - - - 8 - 35 - - - 1 - 36 - - - 5 - 36 - - - 8 - 36 - - - 1 - 37 - - - 5 - 37 - - - 8 - 37 - - - 1 - 38 - - - 5 - 38 - - - 8 - 38 - - - 1 - 39 - - - 5 - 39 - - - 8 - 39 - - - 1 - 40 - - - 5 - 40 - - - 8 - 40 - - - 1 - 41 - - - 5 - 41 - - - 8 - 41 - - - 1 - 42 - - - 5 - 42 - - - 8 - 42 - - - 1 - 43 - - - 5 - 43 - - - 8 - 43 - - - 1 - 44 - - - 5 - 44 - - - 8 - 44 - - - 1 - 45 - - - 5 - 45 - - - 8 - 45 - - - 1 - 46 - - - 5 - 46 - - - 8 - 46 - - - 1 - 47 - - - 5 - 47 - - - 8 - 47 - - - 1 - 48 - - - 5 - 48 - - - 8 - 48 - - - 1 - 49 - - - 5 - 49 - - - 8 - 49 - - - 1 - 50 - - - 5 - 50 - - - 8 - 50 - - - 1 - 51 - - - 5 - 51 - - - 8 - 51 - - - 1 - 52 - - - 5 - 52 - - - 8 - 52 - - - 16 - 52 - - - 1 - 53 - - - 5 - 53 - - - 8 - 53 - - - 1 - 54 - - - 5 - 54 - - - 8 - 54 - - - 1 - 55 - - - 5 - 55 - - - 8 - 55 - - - 1 - 56 - - - 5 - 56 - - - 8 - 56 - - - 1 - 57 - - - 5 - 57 - - - 8 - 57 - - - 1 - 58 - - - 5 - 58 - - - 8 - 58 - - - 1 - 59 - - - 5 - 59 - - - 8 - 59 - - - 1 - 60 - - - 5 - 60 - - - 8 - 60 - - - 1 - 61 - - - 5 - 61 - - - 8 - 61 - - - 1 - 62 - - - 5 - 62 - - - 8 - 62 - - - 1 - 63 - - - 8 - 63 - - - 1 - 64 - - - 8 - 64 - - - 1 - 65 - - - 8 - 65 - - - 1 - 66 - - - 8 - 66 - - - 1 - 67 - - - 8 - 67 - - - 1 - 68 - - - 8 - 68 - - - 1 - 69 - - - 8 - 69 - - - 1 - 70 - - - 8 - 70 - - - 1 - 71 - - - 8 - 71 - - - 1 - 72 - - - 8 - 72 - - - 1 - 73 - - - 8 - 73 - - - 1 - 74 - - - 8 - 74 - - - 1 - 75 - - - 8 - 75 - - - 1 - 76 - - - 8 - 76 - - - 1 - 77 - - - 5 - 77 - - - 8 - 77 - - - 1 - 78 - - - 5 - 78 - - - 8 - 78 - - - 1 - 79 - - - 5 - 79 - - - 8 - 79 - - - 1 - 80 - - - 5 - 80 - - - 8 - 80 - - - 1 - 81 - - - 5 - 81 - - - 8 - 81 - - - 1 - 82 - - - 5 - 82 - - - 8 - 82 - - - 1 - 83 - - - 5 - 83 - - - 8 - 83 - - - 1 - 84 - - - 5 - 84 - - - 8 - 84 - - - 1 - 85 - - - 8 - 85 - - - 1 - 86 - - - 8 - 86 - - - 1 - 87 - - - 8 - 87 - - - 1 - 88 - - - 8 - 88 - - - 1 - 89 - - - 8 - 89 - - - 1 - 90 - - - 8 - 90 - - - 1 - 91 - - - 8 - 91 - - - 1 - 92 - - - 8 - 92 - - - 1 - 93 - - - 8 - 93 - - - 1 - 94 - - - 8 - 94 - - - 1 - 95 - - - 8 - 95 - - - 1 - 96 - - - 8 - 96 - - - 1 - 97 - - - 8 - 97 - - - 1 - 98 - - - 8 - 98 - - - 1 - 99 - - - 8 - 99 - - - 1 - 100 - - - 8 - 100 - - - 1 - 101 - - - 8 - 101 - - - 1 - 102 - - - 8 - 102 - - - 1 - 103 - - - 8 - 103 - - - 1 - 104 - - - 8 - 104 - - - 1 - 105 - - - 8 - 105 - - - 1 - 106 - - - 8 - 106 - - - 1 - 107 - - - 8 - 107 - - - 1 - 108 - - - 8 - 108 - - - 1 - 109 - - - 8 - 109 - - - 1 - 110 - - - 8 - 110 - - - 1 - 111 - - - 5 - 111 - - - 8 - 111 - - - 1 - 112 - - - 5 - 112 - - - 8 - 112 - - - 1 - 113 - - - 5 - 113 - - - 8 - 113 - - - 1 - 114 - - - 5 - 114 - - - 8 - 114 - - - 1 - 115 - - - 5 - 115 - - - 8 - 115 - - - 1 - 116 - - - 5 - 116 - - - 8 - 116 - - - 1 - 117 - - - 5 - 117 - - - 8 - 117 - - - 1 - 118 - - - 5 - 118 - - - 8 - 118 - - - 1 - 119 - - - 5 - 119 - - - 8 - 119 - - - 1 - 120 - - - 5 - 120 - - - 8 - 120 - - - 1 - 121 - - - 5 - 121 - - - 8 - 121 - - - 1 - 122 - - - 5 - 122 - - - 8 - 122 - - - 1 - 123 - - - 8 - 123 - - - 1 - 124 - - - 8 - 124 - - - 1 - 125 - - - 8 - 125 - - - 1 - 126 - - - 8 - 126 - - - 1 - 127 - - - 8 - 127 - - - 1 - 128 - - - 8 - 128 - - - 1 - 129 - - - 8 - 129 - - - 1 - 130 - - - 8 - 130 - - - 1 - 131 - - - 8 - 131 - - - 1 - 132 - - - 8 - 132 - - - 1 - 133 - - - 8 - 133 - - - 1 - 134 - - - 8 - 134 - - - 1 - 135 - - - 8 - 135 - - - 1 - 136 - - - 8 - 136 - - - 1 - 137 - - - 8 - 137 - - - 1 - 138 - - - 8 - 138 - - - 1 - 139 - - - 8 - 139 - - - 1 - 140 - - - 8 - 140 - - - 1 - 141 - - - 8 - 141 - - - 1 - 142 - - - 8 - 142 - - - 1 - 143 - - - 8 - 143 - - - 1 - 144 - - - 8 - 144 - - - 1 - 145 - - - 8 - 145 - - - 1 - 146 - - - 8 - 146 - - - 1 - 147 - - - 8 - 147 - - - 1 - 148 - - - 8 - 148 - - - 1 - 149 - - - 8 - 149 - - - 1 - 150 - - - 8 - 150 - - - 1 - 151 - - - 8 - 151 - - - 1 - 152 - - - 8 - 152 - - - 17 - 152 - - - 1 - 153 - - - 8 - 153 - - - 1 - 154 - - - 8 - 154 - - - 1 - 155 - - - 8 - 155 - - - 1 - 156 - - - 8 - 156 - - - 1 - 157 - - - 8 - 157 - - - 1 - 158 - - - 8 - 158 - - - 1 - 159 - - - 8 - 159 - - - 1 - 160 - - - 8 - 160 - - - 17 - 160 - - - 1 - 161 - - - 8 - 161 - - - 1 - 162 - - - 8 - 162 - - - 1 - 163 - - - 8 - 163 - - - 1 - 164 - - - 8 - 164 - - - 1 - 165 - - - 8 - 165 - - - 1 - 166 - - - 5 - 166 - - - 8 - 166 - - - 1 - 167 - - - 5 - 167 - - - 8 - 167 - - - 1 - 168 - - - 5 - 168 - - - 8 - 168 - - - 1 - 169 - - - 5 - 169 - - - 8 - 169 - - - 1 - 170 - - - 5 - 170 - - - 8 - 170 - - - 1 - 171 - - - 5 - 171 - - - 8 - 171 - - - 1 - 172 - - - 5 - 172 - - - 8 - 172 - - - 1 - 173 - - - 5 - 173 - - - 8 - 173 - - - 1 - 174 - - - 5 - 174 - - - 8 - 174 - - - 1 - 175 - - - 5 - 175 - - - 8 - 175 - - - 1 - 176 - - - 5 - 176 - - - 8 - 176 - - - 1 - 177 - - - 5 - 177 - - - 8 - 177 - - - 1 - 178 - - - 5 - 178 - - - 8 - 178 - - - 1 - 179 - - - 5 - 179 - - - 8 - 179 - - - 1 - 180 - - - 5 - 180 - - - 8 - 180 - - - 1 - 181 - - - 5 - 181 - - - 8 - 181 - - - 1 - 182 - - - 5 - 182 - - - 8 - 182 - - - 1 - 183 - - - 5 - 183 - - - 8 - 183 - - - 1 - 184 - - - 5 - 184 - - - 8 - 184 - - - 1 - 185 - - - 5 - 185 - - - 8 - 185 - - - 1 - 186 - - - 5 - 186 - - - 8 - 186 - - - 1 - 187 - - - 5 - 187 - - - 8 - 187 - - - 1 - 188 - - - 5 - 188 - - - 8 - 188 - - - 1 - 189 - - - 5 - 189 - - - 8 - 189 - - - 1 - 190 - - - 5 - 190 - - - 8 - 190 - - - 1 - 191 - - - 5 - 191 - - - 8 - 191 - - - 1 - 192 - - - 5 - 192 - - - 8 - 192 - - - 1 - 193 - - - 5 - 193 - - - 8 - 193 - - - 1 - 194 - - - 8 - 194 - - - 1 - 195 - - - 8 - 195 - - - 1 - 196 - - - 8 - 196 - - - 1 - 197 - - - 8 - 197 - - - 1 - 198 - - - 8 - 198 - - - 1 - 199 - - - 8 - 199 - - - 1 - 200 - - - 8 - 200 - - - 1 - 201 - - - 8 - 201 - - - 1 - 202 - - - 8 - 202 - - - 1 - 203 - - - 8 - 203 - - - 1 - 204 - - - 8 - 204 - - - 1 - 205 - - - 5 - 205 - - - 8 - 205 - - - 1 - 206 - - - 5 - 206 - - - 8 - 206 - - - 1 - 207 - - - 5 - 207 - - - 8 - 207 - - - 1 - 208 - - - 5 - 208 - - - 8 - 208 - - - 1 - 209 - - - 5 - 209 - - - 8 - 209 - - - 1 - 210 - - - 5 - 210 - - - 8 - 210 - - - 1 - 211 - - - 5 - 211 - - - 8 - 211 - - - 1 - 212 - - - 5 - 212 - - - 8 - 212 - - - 1 - 213 - - - 5 - 213 - - - 8 - 213 - - - 1 - 214 - - - 5 - 214 - - - 8 - 214 - - - 1 - 215 - - - 5 - 215 - - - 8 - 215 - - - 11 - 215 - - - 1 - 216 - - - 5 - 216 - - - 8 - 216 - - - 1 - 217 - - - 5 - 217 - - - 8 - 217 - - - 1 - 218 - - - 5 - 218 - - - 8 - 218 - - - 1 - 219 - - - 5 - 219 - - - 8 - 219 - - - 11 - 219 - - - 1 - 220 - - - 5 - 220 - - - 8 - 220 - - - 11 - 220 - - - 1 - 221 - - - 5 - 221 - - - 8 - 221 - - - 1 - 222 - - - 5 - 222 - - - 8 - 222 - - - 1 - 223 - - - 8 - 223 - - - 1 - 224 - - - 8 - 224 - - - 1 - 225 - - - 8 - 225 - - - 1 - 226 - - - 8 - 226 - - - 1 - 227 - - - 8 - 227 - - - 1 - 228 - - - 8 - 228 - - - 11 - 228 - - - 1 - 229 - - - 8 - 229 - - - 1 - 230 - - - 8 - 230 - - - 11 - 230 - - - 1 - 231 - - - 8 - 231 - - - 1 - 232 - - - 8 - 232 - - - 1 - 233 - - - 8 - 233 - - - 1 - 234 - - - 8 - 234 - - - 1 - 235 - - - 8 - 235 - - - 1 - 236 - - - 8 - 236 - - - 11 - 236 - - - 1 - 237 - - - 8 - 237 - - - 1 - 238 - - - 8 - 238 - - - 1 - 239 - - - 8 - 239 - - - 1 - 240 - - - 8 - 240 - - - 1 - 241 - - - 8 - 241 - - - 1 - 242 - - - 8 - 242 - - - 1 - 243 - - - 8 - 243 - - - 1 - 244 - - - 8 - 244 - - - 1 - 245 - - - 8 - 245 - - - 1 - 246 - - - 5 - 246 - - - 8 - 246 - - - 1 - 247 - - - 5 - 247 - - - 8 - 247 - - - 1 - 248 - - - 5 - 248 - - - 8 - 248 - - - 1 - 249 - - - 5 - 249 - - - 8 - 249 - - - 1 - 250 - - - 5 - 250 - - - 8 - 250 - - - 1 - 251 - - - 5 - 251 - - - 8 - 251 - - - 1 - 252 - - - 5 - 252 - - - 8 - 252 - - - 1 - 253 - - - 5 - 253 - - - 8 - 253 - - - 1 - 254 - - - 5 - 254 - - - 8 - 254 - - - 1 - 255 - - - 5 - 255 - - - 8 - 255 - - - 1 - 256 - - - 5 - 256 - - - 8 - 256 - - - 1 - 257 - - - 5 - 257 - - - 8 - 257 - - - 1 - 258 - - - 5 - 258 - - - 8 - 258 - - - 1 - 259 - - - 5 - 259 - - - 8 - 259 - - - 1 - 260 - - - 5 - 260 - - - 8 - 260 - - - 1 - 261 - - - 5 - 261 - - - 8 - 261 - - - 1 - 262 - - - 5 - 262 - - - 8 - 262 - - - 1 - 263 - - - 5 - 263 - - - 8 - 263 - - - 1 - 264 - - - 5 - 264 - - - 8 - 264 - - - 1 - 265 - - - 5 - 265 - - - 8 - 265 - - - 1 - 266 - - - 5 - 266 - - - 8 - 266 - - - 1 - 267 - - - 5 - 267 - - - 8 - 267 - - - 1 - 268 - - - 5 - 268 - - - 8 - 268 - - - 1 - 269 - - - 5 - 269 - - - 8 - 269 - - - 1 - 270 - - - 5 - 270 - - - 8 - 270 - - - 1 - 271 - - - 5 - 271 - - - 8 - 271 - - - 1 - 272 - - - 5 - 272 - - - 8 - 272 - - - 1 - 273 - - - 5 - 273 - - - 8 - 273 - - - 1 - 274 - - - 5 - 274 - - - 8 - 274 - - - 1 - 275 - - - 5 - 275 - - - 8 - 275 - - - 1 - 276 - - - 5 - 276 - - - 8 - 276 - - - 1 - 277 - - - 5 - 277 - - - 8 - 277 - - - 1 - 278 - - - 5 - 278 - - - 8 - 278 - - - 1 - 279 - - - 5 - 279 - - - 8 - 279 - - - 1 - 280 - - - 5 - 280 - - - 8 - 280 - - - 1 - 281 - - - 5 - 281 - - - 8 - 281 - - - 1 - 282 - - - 8 - 282 - - - 1 - 283 - - - 8 - 283 - - - 1 - 284 - - - 8 - 284 - - - 1 - 285 - - - 8 - 285 - - - 1 - 286 - - - 8 - 286 - - - 1 - 287 - - - 8 - 287 - - - 1 - 288 - - - 8 - 288 - - - 1 - 289 - - - 8 - 289 - - - 1 - 290 - - - 8 - 290 - - - 1 - 291 - - - 8 - 291 - - - 1 - 292 - - - 8 - 292 - - - 1 - 293 - - - 8 - 293 - - - 1 - 294 - - - 8 - 294 - - - 1 - 295 - - - 8 - 295 - - - 1 - 296 - - - 8 - 296 - - - 1 - 297 - - - 8 - 297 - - - 1 - 298 - - - 8 - 298 - - - 1 - 299 - - - 5 - 299 - - - 8 - 299 - - - 1 - 300 - - - 5 - 300 - - - 8 - 300 - - - 1 - 301 - - - 5 - 301 - - - 8 - 301 - - - 1 - 302 - - - 5 - 302 - - - 8 - 302 - - - 1 - 303 - - - 5 - 303 - - - 8 - 303 - - - 1 - 304 - - - 5 - 304 - - - 8 - 304 - - - 1 - 305 - - - 5 - 305 - - - 8 - 305 - - - 1 - 306 - - - 5 - 306 - - - 8 - 306 - - - 1 - 307 - - - 5 - 307 - - - 8 - 307 - - - 1 - 308 - - - 5 - 308 - - - 8 - 308 - - - 1 - 309 - - - 5 - 309 - - - 8 - 309 - - - 1 - 310 - - - 5 - 310 - - - 8 - 310 - - - 1 - 311 - - - 5 - 311 - - - 8 - 311 - - - 1 - 312 - - - 5 - 312 - - - 8 - 312 - - - 1 - 313 - - - 8 - 313 - - - 1 - 314 - - - 8 - 314 - - - 1 - 315 - - - 8 - 315 - - - 1 - 316 - - - 8 - 316 - - - 1 - 317 - - - 8 - 317 - - - 1 - 318 - - - 8 - 318 - - - 1 - 319 - - - 8 - 319 - - - 1 - 320 - - - 8 - 320 - - - 1 - 321 - - - 8 - 321 - - - 1 - 322 - - - 8 - 322 - - - 1 - 323 - - - 8 - 323 - - - 1 - 324 - - - 8 - 324 - - - 1 - 325 - - - 8 - 325 - - - 1 - 326 - - - 8 - 326 - - - 1 - 327 - - - 8 - 327 - - - 1 - 328 - - - 8 - 328 - - - 1 - 329 - - - 8 - 329 - - - 1 - 330 - - - 8 - 330 - - - 1 - 331 - - - 8 - 331 - - - 1 - 332 - - - 8 - 332 - - - 1 - 333 - - - 8 - 333 - - - 1 - 334 - - - 8 - 334 - - - 1 - 335 - - - 8 - 335 - - - 1 - 336 - - - 8 - 336 - - - 1 - 337 - - - 5 - 337 - - - 8 - 337 - - - 1 - 338 - - - 5 - 338 - - - 8 - 338 - - - 1 - 339 - - - 5 - 339 - - - 8 - 339 - - - 1 - 340 - - - 5 - 340 - - - 8 - 340 - - - 1 - 341 - - - 5 - 341 - - - 8 - 341 - - - 1 - 342 - - - 5 - 342 - - - 8 - 342 - - - 1 - 343 - - - 5 - 343 - - - 8 - 343 - - - 1 - 344 - - - 5 - 344 - - - 8 - 344 - - - 1 - 345 - - - 5 - 345 - - - 8 - 345 - - - 1 - 346 - - - 5 - 346 - - - 8 - 346 - - - 1 - 347 - - - 5 - 347 - - - 8 - 347 - - - 1 - 348 - - - 5 - 348 - - - 8 - 348 - - - 1 - 349 - - - 5 - 349 - - - 8 - 349 - - - 1 - 350 - - - 5 - 350 - - - 8 - 350 - - - 1 - 351 - - - 8 - 351 - - - 1 - 352 - - - 8 - 352 - - - 1 - 353 - - - 8 - 353 - - - 1 - 354 - - - 8 - 354 - - - 1 - 355 - - - 8 - 355 - - - 1 - 356 - - - 8 - 356 - - - 1 - 357 - - - 8 - 357 - - - 1 - 358 - - - 8 - 358 - - - 1 - 359 - - - 8 - 359 - - - 1 - 360 - - - 8 - 360 - - - 1 - 361 - - - 8 - 361 - - - 1 - 362 - - - 8 - 362 - - - 1 - 363 - - - 8 - 363 - - - 1 - 364 - - - 8 - 364 - - - 1 - 365 - - - 8 - 365 - - - 1 - 366 - - - 8 - 366 - - - 1 - 367 - - - 8 - 367 - - - 1 - 368 - - - 8 - 368 - - - 1 - 369 - - - 8 - 369 - - - 1 - 370 - - - 8 - 370 - - - 1 - 371 - - - 8 - 371 - - - 1 - 372 - - - 8 - 372 - - - 1 - 373 - - - 8 - 373 - - - 1 - 374 - - - 8 - 374 - - - 1 - 375 - - - 8 - 375 - - - 1 - 376 - - - 8 - 376 - - - 1 - 377 - - - 8 - 377 - - - 1 - 378 - - - 8 - 378 - - - 1 - 379 - - - 8 - 379 - - - 1 - 380 - - - 8 - 380 - - - 1 - 381 - - - 8 - 381 - - - 1 - 382 - - - 8 - 382 - - - 1 - 383 - - - 8 - 383 - - - 1 - 384 - - - 8 - 384 - - - 1 - 385 - - - 8 - 385 - - - 1 - 386 - - - 8 - 386 - - - 1 - 387 - - - 8 - 387 - - - 1 - 388 - - - 8 - 388 - - - 1 - 389 - - - 8 - 389 - - - 1 - 390 - - - 8 - 390 - - - 1 - 391 - - - 8 - 391 - - - 11 - 391 - - - 1 - 392 - - - 8 - 392 - - - 1 - 393 - - - 8 - 393 - - - 11 - 393 - - - 1 - 394 - - - 8 - 394 - - - 1 - 395 - - - 8 - 395 - - - 1 - 396 - - - 8 - 396 - - - 1 - 397 - - - 8 - 397 - - - 1 - 398 - - - 8 - 398 - - - 1 - 399 - - - 8 - 399 - - - 1 - 400 - - - 8 - 400 - - - 1 - 401 - - - 8 - 401 - - - 1 - 402 - - - 8 - 402 - - - 1 - 403 - - - 8 - 403 - - - 1 - 404 - - - 8 - 404 - - - 1 - 405 - - - 8 - 405 - - - 1 - 406 - - - 8 - 406 - - - 1 - 407 - - - 8 - 407 - - - 1 - 408 - - - 5 - 408 - - - 8 - 408 - - - 1 - 409 - - - 5 - 409 - - - 8 - 409 - - - 1 - 410 - - - 5 - 410 - - - 8 - 410 - - - 1 - 411 - - - 5 - 411 - - - 8 - 411 - - - 1 - 412 - - - 5 - 412 - - - 8 - 412 - - - 1 - 413 - - - 5 - 413 - - - 8 - 413 - - - 1 - 414 - - - 5 - 414 - - - 8 - 414 - - - 1 - 415 - - - 5 - 415 - - - 8 - 415 - - - 1 - 416 - - - 5 - 416 - - - 8 - 416 - - - 1 - 417 - - - 5 - 417 - - - 8 - 417 - - - 1 - 418 - - - 5 - 418 - - - 8 - 418 - - - 1 - 419 - - - 8 - 419 - - - 1 - 420 - - - 8 - 420 - - - 1 - 421 - - - 8 - 421 - - - 1 - 422 - - - 8 - 422 - - - 1 - 423 - - - 8 - 423 - - - 1 - 424 - - - 5 - 424 - - - 8 - 424 - - - 1 - 425 - - - 8 - 425 - - - 1 - 426 - - - 8 - 426 - - - 1 - 427 - - - 8 - 427 - - - 1 - 428 - - - 5 - 428 - - - 8 - 428 - - - 1 - 429 - - - 8 - 429 - - - 1 - 430 - - - 5 - 430 - - - 8 - 430 - - - 1 - 431 - - - 8 - 431 - - - 1 - 432 - - - 8 - 432 - - - 1 - 433 - - - 8 - 433 - - - 1 - 434 - - - 5 - 434 - - - 8 - 434 - - - 1 - 435 - - - 8 - 435 - - - 1 - 436 - - - 5 - 436 - - - 8 - 436 - - - 1 - 437 - - - 5 - 437 - - - 8 - 437 - - - 1 - 438 - - - 5 - 438 - - - 8 - 438 - - - 1 - 439 - - - 5 - 439 - - - 8 - 439 - - - 1 - 440 - - - 5 - 440 - - - 8 - 440 - - - 1 - 441 - - - 5 - 441 - - - 8 - 441 - - - 1 - 442 - - - 5 - 442 - - - 8 - 442 - - - 1 - 443 - - - 5 - 443 - - - 8 - 443 - - - 1 - 444 - - - 5 - 444 - - - 8 - 444 - - - 1 - 445 - - - 5 - 445 - - - 8 - 445 - - - 1 - 446 - - - 5 - 446 - - - 8 - 446 - - - 1 - 447 - - - 5 - 447 - - - 8 - 447 - - - 1 - 448 - - - 5 - 448 - - - 8 - 448 - - - 1 - 449 - - - 5 - 449 - - - 8 - 449 - - - 1 - 450 - - - 5 - 450 - - - 8 - 450 - - - 1 - 451 - - - 5 - 451 - - - 8 - 451 - - - 1 - 452 - - - 8 - 452 - - - 1 - 453 - - - 5 - 453 - - - 8 - 453 - - - 1 - 454 - - - 5 - 454 - - - 8 - 454 - - - 1 - 455 - - - 5 - 455 - - - 8 - 455 - - - 1 - 456 - - - 5 - 456 - - - 8 - 456 - - - 1 - 457 - - - 5 - 457 - - - 8 - 457 - - - 1 - 458 - - - 5 - 458 - - - 8 - 458 - - - 1 - 459 - - - 5 - 459 - - - 8 - 459 - - - 1 - 460 - - - 5 - 460 - - - 8 - 460 - - - 1 - 461 - - - 5 - 461 - - - 8 - 461 - - - 1 - 462 - - - 5 - 462 - - - 8 - 462 - - - 1 - 463 - - - 5 - 463 - - - 8 - 463 - - - 1 - 464 - - - 5 - 464 - - - 8 - 464 - - - 1 - 465 - - - 5 - 465 - - - 8 - 465 - - - 1 - 466 - - - 5 - 466 - - - 8 - 466 - - - 1 - 467 - - - 5 - 467 - - - 8 - 467 - - - 1 - 468 - - - 8 - 468 - - - 1 - 469 - - - 8 - 469 - - - 1 - 470 - - - 5 - 470 - - - 8 - 470 - - - 1 - 471 - - - 5 - 471 - - - 8 - 471 - - - 1 - 472 - - - 5 - 472 - - - 8 - 472 - - - 1 - 473 - - - 5 - 473 - - - 8 - 473 - - - 1 - 474 - - - 5 - 474 - - - 8 - 474 - - - 1 - 475 - - - 5 - 475 - - - 8 - 475 - - - 1 - 476 - - - 5 - 476 - - - 8 - 476 - - - 1 - 477 - - - 5 - 477 - - - 8 - 477 - - - 1 - 478 - - - 5 - 478 - - - 8 - 478 - - - 1 - 479 - - - 5 - 479 - - - 8 - 479 - - - 1 - 480 - - - 5 - 480 - - - 8 - 480 - - - 1 - 481 - - - 5 - 481 - - - 8 - 481 - - - 1 - 482 - - - 5 - 482 - - - 8 - 482 - - - 1 - 483 - - - 5 - 483 - - - 8 - 483 - - - 1 - 484 - - - 5 - 484 - - - 8 - 484 - - - 1 - 485 - - - 8 - 485 - - - 1 - 486 - - - 8 - 486 - - - 1 - 487 - - - 8 - 487 - - - 1 - 488 - - - 8 - 488 - - - 1 - 489 - - - 8 - 489 - - - 1 - 490 - - - 8 - 490 - - - 1 - 491 - - - 8 - 491 - - - 1 - 492 - - - 8 - 492 - - - 1 - 493 - - - 8 - 493 - - - 1 - 494 - - - 8 - 494 - - - 1 - 495 - - - 8 - 495 - - - 1 - 496 - - - 8 - 496 - - - 1 - 497 - - - 8 - 497 - - - 1 - 498 - - - 8 - 498 - - - 1 - 499 - - - 8 - 499 - - - 1 - 500 - - - 8 - 500 - - - 1 - 501 - - - 5 - 501 - - - 8 - 501 - - - 11 - 501 - - - 1 - 502 - - - 5 - 502 - - - 8 - 502 - - - 1 - 503 - - - 5 - 503 - - - 8 - 503 - - - 1 - 504 - - - 5 - 504 - - - 8 - 504 - - - 11 - 504 - - - 1 - 505 - - - 5 - 505 - - - 8 - 505 - - - 1 - 506 - - - 5 - 506 - - - 8 - 506 - - - 1 - 507 - - - 5 - 507 - - - 8 - 507 - - - 1 - 508 - - - 5 - 508 - - - 8 - 508 - - - 1 - 509 - - - 5 - 509 - - - 8 - 509 - - - 1 - 510 - - - 5 - 510 - - - 8 - 510 - - - 1 - 511 - - - 5 - 511 - - - 8 - 511 - - - 1 - 512 - - - 5 - 512 - - - 8 - 512 - - - 1 - 513 - - - 5 - 513 - - - 8 - 513 - - - 1 - 514 - - - 5 - 514 - - - 8 - 514 - - - 1 - 515 - - - 5 - 515 - - - 8 - 515 - - - 1 - 516 - - - 5 - 516 - - - 8 - 516 - - - 11 - 516 - - - 1 - 517 - - - 5 - 517 - - - 8 - 517 - - - 1 - 518 - - - 5 - 518 - - - 8 - 518 - - - 1 - 519 - - - 5 - 519 - - - 8 - 519 - - - 1 - 520 - - - 5 - 520 - - - 8 - 520 - - - 1 - 521 - - - 5 - 521 - - - 8 - 521 - - - 1 - 522 - - - 5 - 522 - - - 8 - 522 - - - 1 - 523 - - - 5 - 523 - - - 8 - 523 - - - 11 - 523 - - - 1 - 524 - - - 5 - 524 - - - 8 - 524 - - - 1 - 525 - - - 5 - 525 - - - 8 - 525 - - - 1 - 526 - - - 5 - 526 - - - 8 - 526 - - - 1 - 527 - - - 5 - 527 - - - 8 - 527 - - - 1 - 528 - - - 5 - 528 - - - 8 - 528 - - - 1 - 529 - - - 8 - 529 - - - 1 - 530 - - - 8 - 530 - - - 1 - 531 - - - 8 - 531 - - - 1 - 532 - - - 8 - 532 - - - 1 - 533 - - - 8 - 533 - - - 1 - 534 - - - 8 - 534 - - - 1 - 535 - - - 8 - 535 - - - 1 - 536 - - - 8 - 536 - - - 1 - 537 - - - 8 - 537 - - - 1 - 538 - - - 8 - 538 - - - 1 - 539 - - - 8 - 539 - - - 1 - 540 - - - 8 - 540 - - - 1 - 541 - - - 8 - 541 - - - 1 - 542 - - - 8 - 542 - - - 1 - 543 - - - 8 - 543 - - - 1 - 544 - - - 8 - 544 - - - 1 - 545 - - - 8 - 545 - - - 1 - 546 - - - 8 - 546 - - - 1 - 547 - - - 8 - 547 - - - 1 - 548 - - - 8 - 548 - - - 1 - 549 - - - 8 - 549 - - - 1 - 550 - - - 8 - 550 - - - 1 - 551 - - - 8 - 551 - - - 1 - 552 - - - 8 - 552 - - - 1 - 553 - - - 8 - 553 - - - 1 - 554 - - - 8 - 554 - - - 1 - 555 - - - 8 - 555 - - - 1 - 556 - - - 8 - 556 - - - 1 - 557 - - - 8 - 557 - - - 1 - 558 - - - 8 - 558 - - - 1 - 559 - - - 8 - 559 - - - 1 - 560 - - - 8 - 560 - - - 1 - 561 - - - 8 - 561 - - - 1 - 562 - - - 8 - 562 - - - 1 - 563 - - - 8 - 563 - - - 1 - 564 - - - 8 - 564 - - - 1 - 565 - - - 8 - 565 - - - 1 - 566 - - - 8 - 566 - - - 1 - 567 - - - 8 - 567 - - - 1 - 568 - - - 8 - 568 - - - 1 - 569 - - - 8 - 569 - - - 1 - 570 - - - 5 - 570 - - - 8 - 570 - - - 1 - 571 - - - 5 - 571 - - - 8 - 571 - - - 1 - 572 - - - 5 - 572 - - - 8 - 572 - - - 1 - 573 - - - 5 - 573 - - - 8 - 573 - - - 1 - 574 - - - 5 - 574 - - - 8 - 574 - - - 1 - 575 - - - 5 - 575 - - - 8 - 575 - - - 1 - 576 - - - 5 - 576 - - - 8 - 576 - - - 1 - 577 - - - 5 - 577 - - - 8 - 577 - - - 1 - 578 - - - 5 - 578 - - - 8 - 578 - - - 1 - 579 - - - 5 - 579 - - - 8 - 579 - - - 1 - 580 - - - 5 - 580 - - - 8 - 580 - - - 1 - 581 - - - 5 - 581 - - - 8 - 581 - - - 1 - 582 - - - 5 - 582 - - - 8 - 582 - - - 1 - 583 - - - 5 - 583 - - - 8 - 583 - - - 1 - 584 - - - 5 - 584 - - - 8 - 584 - - - 1 - 585 - - - 5 - 585 - - - 8 - 585 - - - 1 - 586 - - - 5 - 586 - - - 8 - 586 - - - 1 - 587 - - - 5 - 587 - - - 8 - 587 - - - 1 - 588 - - - 5 - 588 - - - 8 - 588 - - - 1 - 589 - - - 5 - 589 - - - 8 - 589 - - - 1 - 590 - - - 5 - 590 - - - 8 - 590 - - - 1 - 591 - - - 5 - 591 - - - 8 - 591 - - - 1 - 592 - - - 5 - 592 - - - 8 - 592 - - - 1 - 593 - - - 5 - 593 - - - 8 - 593 - - - 1 - 594 - - - 5 - 594 - - - 8 - 594 - - - 1 - 595 - - - 5 - 595 - - - 8 - 595 - - - 1 - 596 - - - 5 - 596 - - - 8 - 596 - - - 1 - 597 - - - 8 - 597 - - - 18 - 597 - - - 1 - 598 - - - 8 - 598 - - - 1 - 599 - - - 8 - 599 - - - 1 - 600 - - - 8 - 600 - - - 1 - 601 - - - 8 - 601 - - - 1 - 602 - - - 8 - 602 - - - 1 - 603 - - - 8 - 603 - - - 1 - 604 - - - 8 - 604 - - - 1 - 605 - - - 8 - 605 - - - 1 - 606 - - - 8 - 606 - - - 1 - 607 - - - 8 - 607 - - - 1 - 608 - - - 8 - 608 - - - 1 - 609 - - - 8 - 609 - - - 1 - 610 - - - 8 - 610 - - - 1 - 611 - - - 8 - 611 - - - 1 - 612 - - - 8 - 612 - - - 1 - 613 - - - 8 - 613 - - - 1 - 614 - - - 8 - 614 - - - 1 - 615 - - - 8 - 615 - - - 1 - 616 - - - 8 - 616 - - - 1 - 617 - - - 8 - 617 - - - 1 - 618 - - - 8 - 618 - - - 1 - 619 - - - 8 - 619 - - - 1 - 620 - - - 8 - 620 - - - 1 - 621 - - - 8 - 621 - - - 1 - 622 - - - 8 - 622 - - - 1 - 623 - - - 8 - 623 - - - 1 - 624 - - - 8 - 624 - - - 1 - 625 - - - 8 - 625 - - - 1 - 626 - - - 8 - 626 - - - 1 - 627 - - - 8 - 627 - - - 1 - 628 - - - 8 - 628 - - - 1 - 629 - - - 8 - 629 - - - 1 - 630 - - - 8 - 630 - - - 1 - 631 - - - 8 - 631 - - - 1 - 632 - - - 8 - 632 - - - 1 - 633 - - - 8 - 633 - - - 1 - 634 - - - 8 - 634 - - - 1 - 635 - - - 8 - 635 - - - 1 - 636 - - - 8 - 636 - - - 1 - 637 - - - 8 - 637 - - - 1 - 638 - - - 8 - 638 - - - 1 - 639 - - - 8 - 639 - - - 1 - 640 - - - 8 - 640 - - - 1 - 641 - - - 8 - 641 - - - 1 - 642 - - - 8 - 642 - - - 1 - 643 - - - 8 - 643 - - - 1 - 644 - - - 8 - 644 - - - 1 - 645 - - - 8 - 645 - - - 1 - 646 - - - 8 - 646 - - - 1 - 647 - - - 8 - 647 - - - 1 - 648 - - - 8 - 648 - - - 1 - 649 - - - 8 - 649 - - - 1 - 650 - - - 8 - 650 - - - 1 - 651 - - - 8 - 651 - - - 1 - 652 - - - 8 - 652 - - - 1 - 653 - - - 8 - 653 - - - 1 - 654 - - - 8 - 654 - - - 1 - 655 - - - 8 - 655 - - - 1 - 656 - - - 8 - 656 - - - 1 - 657 - - - 8 - 657 - - - 1 - 658 - - - 8 - 658 - - - 1 - 659 - - - 8 - 659 - - - 1 - 660 - - - 8 - 660 - - - 1 - 661 - - - 8 - 661 - - - 1 - 662 - - - 8 - 662 - - - 1 - 663 - - - 8 - 663 - - - 1 - 664 - - - 8 - 664 - - - 1 - 665 - - - 8 - 665 - - - 1 - 666 - - - 8 - 666 - - - 1 - 667 - - - 8 - 667 - - - 1 - 668 - - - 8 - 668 - - - 1 - 669 - - - 8 - 669 - - - 1 - 670 - - - 8 - 670 - - - 1 - 671 - - - 8 - 671 - - - 1 - 672 - - - 8 - 672 - - - 1 - 673 - - - 8 - 673 - - - 1 - 674 - - - 8 - 674 - - - 1 - 675 - - - 8 - 675 - - - 1 - 676 - - - 8 - 676 - - - 1 - 677 - - - 8 - 677 - - - 1 - 678 - - - 8 - 678 - - - 1 - 679 - - - 8 - 679 - - - 1 - 680 - - - 8 - 680 - - - 1 - 681 - - - 8 - 681 - - - 1 - 682 - - - 8 - 682 - - - 1 - 683 - - - 8 - 683 - - - 1 - 684 - - - 8 - 684 - - - 1 - 685 - - - 8 - 685 - - - 1 - 686 - - - 8 - 686 - - - 1 - 687 - - - 8 - 687 - - - 1 - 688 - - - 8 - 688 - - - 1 - 689 - - - 8 - 689 - - - 1 - 690 - - - 8 - 690 - - - 1 - 691 - - - 8 - 691 - - - 1 - 692 - - - 8 - 692 - - - 1 - 693 - - - 8 - 693 - - - 1 - 694 - - - 8 - 694 - - - 1 - 695 - - - 8 - 695 - - - 1 - 696 - - - 8 - 696 - - - 1 - 697 - - - 8 - 697 - - - 1 - 698 - - - 8 - 698 - - - 1 - 699 - - - 8 - 699 - - - 1 - 700 - - - 8 - 700 - - - 1 - 701 - - - 8 - 701 - - - 1 - 702 - - - 8 - 702 - - - 1 - 703 - - - 8 - 703 - - - 1 - 704 - - - 8 - 704 - - - 1 - 705 - - - 8 - 705 - - - 1 - 706 - - - 8 - 706 - - - 1 - 707 - - - 8 - 707 - - - 1 - 708 - - - 8 - 708 - - - 1 - 709 - - - 8 - 709 - - - 1 - 710 - - - 8 - 710 - - - 1 - 711 - - - 8 - 711 - - - 1 - 712 - - - 8 - 712 - - - 1 - 713 - - - 8 - 713 - - - 1 - 714 - - - 8 - 714 - - - 1 - 715 - - - 8 - 715 - - - 1 - 716 - - - 8 - 716 - - - 1 - 717 - - - 8 - 717 - - - 1 - 718 - - - 8 - 718 - - - 1 - 719 - - - 8 - 719 - - - 1 - 720 - - - 8 - 720 - - - 1 - 721 - - - 8 - 721 - - - 1 - 722 - - - 8 - 722 - - - 1 - 723 - - - 8 - 723 - - - 1 - 724 - - - 8 - 724 - - - 1 - 725 - - - 8 - 725 - - - 1 - 726 - - - 8 - 726 - - - 1 - 727 - - - 8 - 727 - - - 1 - 728 - - - 8 - 728 - - - 1 - 729 - - - 8 - 729 - - - 1 - 730 - - - 8 - 730 - - - 11 - 730 - - - 1 - 731 - - - 8 - 731 - - - 1 - 732 - - - 8 - 732 - - - 1 - 733 - - - 8 - 733 - - - 1 - 734 - - - 8 - 734 - - - 1 - 735 - - - 8 - 735 - - - 1 - 736 - - - 8 - 736 - - - 1 - 737 - - - 8 - 737 - - - 1 - 738 - - - 8 - 738 - - - 11 - 738 - - - 1 - 739 - - - 8 - 739 - - - 1 - 740 - - - 8 - 740 - - - 1 - 741 - - - 8 - 741 - - - 1 - 742 - - - 8 - 742 - - - 1 - 743 - - - 8 - 743 - - - 1 - 744 - - - 8 - 744 - - - 1 - 745 - - - 8 - 745 - - - 1 - 746 - - - 8 - 746 - - - 1 - 747 - - - 8 - 747 - - - 1 - 748 - - - 8 - 748 - - - 1 - 749 - - - 8 - 749 - - - 1 - 750 - - - 8 - 750 - - - 1 - 751 - - - 8 - 751 - - - 1 - 752 - - - 8 - 752 - - - 1 - 753 - - - 8 - 753 - - - 1 - 754 - - - 8 - 754 - - - 1 - 755 - - - 8 - 755 - - - 1 - 756 - - - 8 - 756 - - - 1 - 757 - - - 8 - 757 - - - 1 - 758 - - - 8 - 758 - - - 1 - 759 - - - 8 - 759 - - - 1 - 760 - - - 8 - 760 - - - 1 - 761 - - - 8 - 761 - - - 1 - 762 - - - 8 - 762 - - - 1 - 763 - - - 8 - 763 - - - 1 - 764 - - - 8 - 764 - - - 1 - 765 - - - 8 - 765 - - - 1 - 766 - - - 8 - 766 - - - 1 - 767 - - - 8 - 767 - - - 1 - 768 - - - 5 - 768 - - - 8 - 768 - - - 1 - 769 - - - 5 - 769 - - - 8 - 769 - - - 1 - 770 - - - 5 - 770 - - - 8 - 770 - - - 1 - 771 - - - 5 - 771 - - - 8 - 771 - - - 1 - 772 - - - 5 - 772 - - - 8 - 772 - - - 1 - 773 - - - 5 - 773 - - - 8 - 773 - - - 1 - 774 - - - 5 - 774 - - - 8 - 774 - - - 1 - 775 - - - 5 - 775 - - - 8 - 775 - - - 1 - 776 - - - 5 - 776 - - - 8 - 776 - - - 1 - 777 - - - 5 - 777 - - - 8 - 777 - - - 1 - 778 - - - 5 - 778 - - - 8 - 778 - - - 1 - 779 - - - 8 - 779 - - - 1 - 780 - - - 8 - 780 - - - 1 - 781 - - - 8 - 781 - - - 1 - 782 - - - 8 - 782 - - - 1 - 783 - - - 8 - 783 - - - 1 - 784 - - - 8 - 784 - - - 1 - 785 - - - 8 - 785 - - - 1 - 786 - - - 5 - 786 - - - 8 - 786 - - - 1 - 787 - - - 5 - 787 - - - 8 - 787 - - - 1 - 788 - - - 5 - 788 - - - 8 - 788 - - - 1 - 789 - - - 5 - 789 - - - 8 - 789 - - - 1 - 790 - - - 5 - 790 - - - 8 - 790 - - - 1 - 791 - - - 5 - 791 - - - 8 - 791 - - - 1 - 792 - - - 5 - 792 - - - 8 - 792 - - - 1 - 793 - - - 5 - 793 - - - 8 - 793 - - - 1 - 794 - - - 5 - 794 - - - 8 - 794 - - - 1 - 795 - - - 5 - 795 - - - 8 - 795 - - - 1 - 796 - - - 5 - 796 - - - 8 - 796 - - - 1 - 797 - - - 5 - 797 - - - 8 - 797 - - - 1 - 798 - - - 5 - 798 - - - 8 - 798 - - - 1 - 799 - - - 5 - 799 - - - 8 - 799 - - - 1 - 800 - - - 5 - 800 - - - 8 - 800 - - - 1 - 801 - - - 5 - 801 - - - 8 - 801 - - - 1 - 802 - - - 5 - 802 - - - 8 - 802 - - - 1 - 803 - - - 5 - 803 - - - 8 - 803 - - - 1 - 804 - - - 5 - 804 - - - 8 - 804 - - - 1 - 805 - - - 5 - 805 - - - 8 - 805 - - - 1 - 806 - - - 5 - 806 - - - 8 - 806 - - - 1 - 807 - - - 8 - 807 - - - 1 - 808 - - - 8 - 808 - - - 1 - 809 - - - 8 - 809 - - - 1 - 810 - - - 8 - 810 - - - 1 - 811 - - - 8 - 811 - - - 1 - 812 - - - 8 - 812 - - - 1 - 813 - - - 8 - 813 - - - 1 - 814 - - - 8 - 814 - - - 1 - 815 - - - 8 - 815 - - - 1 - 816 - - - 5 - 816 - - - 8 - 816 - - - 1 - 817 - - - 5 - 817 - - - 8 - 817 - - - 1 - 818 - - - 5 - 818 - - - 8 - 818 - - - 1 - 819 - - - 5 - 819 - - - 8 - 819 - - - 1 - 820 - - - 5 - 820 - - - 8 - 820 - - - 1 - 821 - - - 5 - 821 - - - 8 - 821 - - - 1 - 822 - - - 5 - 822 - - - 8 - 822 - - - 1 - 823 - - - 5 - 823 - - - 8 - 823 - - - 1 - 824 - - - 5 - 824 - - - 8 - 824 - - - 1 - 825 - - - 5 - 825 - - - 8 - 825 - - - 1 - 826 - - - 5 - 826 - - - 8 - 826 - - - 1 - 827 - - - 5 - 827 - - - 8 - 827 - - - 1 - 828 - - - 5 - 828 - - - 8 - 828 - - - 1 - 829 - - - 5 - 829 - - - 8 - 829 - - - 1 - 830 - - - 5 - 830 - - - 8 - 830 - - - 1 - 831 - - - 5 - 831 - - - 8 - 831 - - - 1 - 832 - - - 5 - 832 - - - 8 - 832 - - - 1 - 833 - - - 5 - 833 - - - 8 - 833 - - - 1 - 834 - - - 5 - 834 - - - 8 - 834 - - - 1 - 835 - - - 5 - 835 - - - 8 - 835 - - - 1 - 836 - - - 5 - 836 - - - 8 - 836 - - - 1 - 837 - - - 5 - 837 - - - 8 - 837 - - - 1 - 838 - - - 5 - 838 - - - 8 - 838 - - - 1 - 839 - - - 5 - 839 - - - 8 - 839 - - - 1 - 840 - - - 5 - 840 - - - 8 - 840 - - - 1 - 841 - - - 5 - 841 - - - 8 - 841 - - - 1 - 842 - - - 8 - 842 - - - 1 - 843 - - - 8 - 843 - - - 1 - 844 - - - 8 - 844 - - - 1 - 845 - - - 8 - 845 - - - 1 - 846 - - - 8 - 846 - - - 1 - 847 - - - 8 - 847 - - - 1 - 848 - - - 8 - 848 - - - 1 - 849 - - - 8 - 849 - - - 1 - 850 - - - 8 - 850 - - - 1 - 851 - - - 5 - 851 - - - 8 - 851 - - - 1 - 852 - - - 5 - 852 - - - 8 - 852 - - - 11 - 852 - - - 1 - 853 - - - 5 - 853 - - - 8 - 853 - - - 1 - 854 - - - 5 - 854 - - - 8 - 854 - - - 1 - 855 - - - 5 - 855 - - - 8 - 855 - - - 1 - 856 - - - 5 - 856 - - - 8 - 856 - - - 1 - 857 - - - 5 - 857 - - - 8 - 857 - - - 1 - 858 - - - 5 - 858 - - - 8 - 858 - - - 11 - 858 - - - 1 - 859 - - - 5 - 859 - - - 8 - 859 - - - 1 - 860 - - - 5 - 860 - - - 8 - 860 - - - 1 - 861 - - - 5 - 861 - - - 8 - 861 - - - 1 - 862 - - - 5 - 862 - - - 8 - 862 - - - 1 - 863 - - - 5 - 863 - - - 8 - 863 - - - 1 - 864 - - - 5 - 864 - - - 8 - 864 - - - 11 - 864 - - - 1 - 865 - - - 5 - 865 - - - 8 - 865 - - - 1 - 866 - - - 5 - 866 - - - 8 - 866 - - - 1 - 867 - - - 5 - 867 - - - 8 - 867 - - - 11 - 867 - - - 1 - 868 - - - 5 - 868 - - - 8 - 868 - - - 1 - 869 - - - 5 - 869 - - - 8 - 869 - - - 1 - 870 - - - 5 - 870 - - - 8 - 870 - - - 1 - 871 - - - 5 - 871 - - - 8 - 871 - - - 1 - 872 - - - 5 - 872 - - - 8 - 872 - - - 1 - 873 - - - 5 - 873 - - - 8 - 873 - - - 1 - 874 - - - 5 - 874 - - - 8 - 874 - - - 11 - 874 - - - 1 - 875 - - - 5 - 875 - - - 8 - 875 - - - 1 - 876 - - - 5 - 876 - - - 8 - 876 - - - 1 - 877 - - - 8 - 877 - - - 11 - 877 - - - 1 - 878 - - - 8 - 878 - - - 1 - 879 - - - 8 - 879 - - - 1 - 880 - - - 8 - 880 - - - 1 - 881 - - - 8 - 881 - - - 1 - 882 - - - 8 - 882 - - - 1 - 883 - - - 8 - 883 - - - 1 - 884 - - - 8 - 884 - - - 1 - 885 - - - 8 - 885 - - - 11 - 885 - - - 1 - 886 - - - 8 - 886 - - - 1 - 887 - - - 8 - 887 - - - 1 - 888 - - - 8 - 888 - - - 11 - 888 - - - 1 - 889 - - - 8 - 889 - - - 1 - 890 - - - 8 - 890 - - - 1 - 891 - - - 5 - 891 - - - 8 - 891 - - - 1 - 892 - - - 5 - 892 - - - 8 - 892 - - - 1 - 893 - - - 5 - 893 - - - 8 - 893 - - - 1 - 894 - - - 5 - 894 - - - 8 - 894 - - - 1 - 895 - - - 5 - 895 - - - 8 - 895 - - - 1 - 896 - - - 5 - 896 - - - 8 - 896 - - - 1 - 897 - - - 5 - 897 - - - 8 - 897 - - - 1 - 898 - - - 5 - 898 - - - 8 - 898 - - - 1 - 899 - - - 5 - 899 - - - 8 - 899 - - - 1 - 900 - - - 5 - 900 - - - 8 - 900 - - - 1 - 901 - - - 5 - 901 - - - 8 - 901 - - - 1 - 902 - - - 5 - 902 - - - 8 - 902 - - - 1 - 903 - - - 5 - 903 - - - 8 - 903 - - - 1 - 904 - - - 5 - 904 - - - 8 - 904 - - - 1 - 905 - - - 5 - 905 - - - 8 - 905 - - - 1 - 906 - - - 5 - 906 - - - 8 - 906 - - - 1 - 907 - - - 5 - 907 - - - 8 - 907 - - - 1 - 908 - - - 5 - 908 - - - 8 - 908 - - - 1 - 909 - - - 5 - 909 - - - 8 - 909 - - - 1 - 910 - - - 5 - 910 - - - 8 - 910 - - - 1 - 911 - - - 5 - 911 - - - 8 - 911 - - - 1 - 912 - - - 5 - 912 - - - 8 - 912 - - - 1 - 913 - - - 5 - 913 - - - 8 - 913 - - - 1 - 914 - - - 5 - 914 - - - 8 - 914 - - - 1 - 915 - - - 5 - 915 - - - 8 - 915 - - - 1 - 916 - - - 5 - 916 - - - 8 - 916 - - - 1 - 917 - - - 5 - 917 - - - 8 - 917 - - - 1 - 918 - - - 5 - 918 - - - 8 - 918 - - - 1 - 919 - - - 5 - 919 - - - 8 - 919 - - - 1 - 920 - - - 5 - 920 - - - 8 - 920 - - - 1 - 921 - - - 5 - 921 - - - 8 - 921 - - - 1 - 922 - - - 5 - 922 - - - 8 - 922 - - - 1 - 923 - - - 5 - 923 - - - 8 - 923 - - - 1 - 924 - - - 5 - 924 - - - 8 - 924 - - - 1 - 925 - - - 5 - 925 - - - 8 - 925 - - - 1 - 926 - - - 5 - 926 - - - 8 - 926 - - - 1 - 927 - - - 5 - 927 - - - 8 - 927 - - - 1 - 928 - - - 5 - 928 - - - 8 - 928 - - - 1 - 929 - - - 5 - 929 - - - 8 - 929 - - - 1 - 930 - - - 5 - 930 - - - 8 - 930 - - - 1 - 931 - - - 5 - 931 - - - 8 - 931 - - - 1 - 932 - - - 5 - 932 - - - 8 - 932 - - - 1 - 933 - - - 5 - 933 - - - 8 - 933 - - - 1 - 934 - - - 5 - 934 - - - 8 - 934 - - - 1 - 935 - - - 5 - 935 - - - 8 - 935 - - - 1 - 936 - - - 5 - 936 - - - 8 - 936 - - - 1 - 937 - - - 5 - 937 - - - 8 - 937 - - - 1 - 938 - - - 5 - 938 - - - 8 - 938 - - - 1 - 939 - - - 5 - 939 - - - 8 - 939 - - - 1 - 940 - - - 5 - 940 - - - 8 - 940 - - - 1 - 941 - - - 5 - 941 - - - 8 - 941 - - - 1 - 942 - - - 5 - 942 - - - 8 - 942 - - - 1 - 943 - - - 5 - 943 - - - 8 - 943 - - - 1 - 944 - - - 5 - 944 - - - 8 - 944 - - - 1 - 945 - - - 5 - 945 - - - 8 - 945 - - - 1 - 946 - - - 5 - 946 - - - 8 - 946 - - - 1 - 947 - - - 5 - 947 - - - 8 - 947 - - - 1 - 948 - - - 5 - 948 - - - 8 - 948 - - - 1 - 949 - - - 5 - 949 - - - 8 - 949 - - - 1 - 950 - - - 5 - 950 - - - 8 - 950 - - - 1 - 951 - - - 5 - 951 - - - 8 - 951 - - - 1 - 952 - - - 5 - 952 - - - 8 - 952 - - - 1 - 953 - - - 5 - 953 - - - 8 - 953 - - - 1 - 954 - - - 5 - 954 - - - 8 - 954 - - - 1 - 955 - - - 5 - 955 - - - 8 - 955 - - - 1 - 956 - - - 5 - 956 - - - 8 - 956 - - - 1 - 957 - - - 5 - 957 - - - 8 - 957 - - - 1 - 958 - - - 5 - 958 - - - 8 - 958 - - - 1 - 959 - - - 5 - 959 - - - 8 - 959 - - - 1 - 960 - - - 5 - 960 - - - 8 - 960 - - - 1 - 961 - - - 5 - 961 - - - 8 - 961 - - - 1 - 962 - - - 5 - 962 - - - 8 - 962 - - - 1 - 963 - - - 5 - 963 - - - 8 - 963 - - - 1 - 964 - - - 8 - 964 - - - 1 - 965 - - - 8 - 965 - - - 1 - 966 - - - 8 - 966 - - - 1 - 967 - - - 8 - 967 - - - 1 - 968 - - - 8 - 968 - - - 1 - 969 - - - 8 - 969 - - - 1 - 970 - - - 8 - 970 - - - 1 - 971 - - - 8 - 971 - - - 1 - 972 - - - 8 - 972 - - - 1 - 973 - - - 8 - 973 - - - 1 - 974 - - - 8 - 974 - - - 1 - 975 - - - 8 - 975 - - - 1 - 976 - - - 5 - 976 - - - 8 - 976 - - - 1 - 977 - - - 5 - 977 - - - 8 - 977 - - - 1 - 978 - - - 5 - 978 - - - 8 - 978 - - - 1 - 979 - - - 5 - 979 - - - 8 - 979 - - - 1 - 980 - - - 8 - 980 - - - 1 - 981 - - - 8 - 981 - - - 1 - 982 - - - 8 - 982 - - - 1 - 983 - - - 8 - 983 - - - 1 - 984 - - - 5 - 984 - - - 8 - 984 - - - 1 - 985 - - - 8 - 985 - - - 1 - 986 - - - 8 - 986 - - - 1 - 987 - - - 8 - 987 - - - 1 - 988 - - - 8 - 988 - - - 1 - 989 - - - 8 - 989 - - - 1 - 990 - - - 8 - 990 - - - 1 - 991 - - - 8 - 991 - - - 1 - 992 - - - 8 - 992 - - - 1 - 993 - - - 8 - 993 - - - 1 - 994 - - - 8 - 994 - - - 1 - 995 - - - 8 - 995 - - - 1 - 996 - - - 8 - 996 - - - 1 - 997 - - - 8 - 997 - - - 1 - 998 - - - 8 - 998 - - - 1 - 999 - - - 8 - 999 - - - 1 - 1000 - - - 8 - 1000 - - - 1 - 1001 - - - 8 - 1001 - - - 1 - 1002 - - - 8 - 1002 - - - 1 - 1003 - - - 8 - 1003 - - - 1 - 1004 - - - 8 - 1004 - - - 1 - 1005 - - - 8 - 1005 - - - 1 - 1006 - - - 8 - 1006 - - - 1 - 1007 - - - 8 - 1007 - - - 1 - 1008 - - - 8 - 1008 - - - 1 - 1009 - - - 8 - 1009 - - - 1 - 1010 - - - 8 - 1010 - - - 1 - 1011 - - - 8 - 1011 - - - 1 - 1012 - - - 8 - 1012 - - - 1 - 1013 - - - 8 - 1013 - - - 1 - 1014 - - - 8 - 1014 - - - 1 - 1015 - - - 8 - 1015 - - - 1 - 1016 - - - 8 - 1016 - - - 1 - 1017 - - - 8 - 1017 - - - 1 - 1018 - - - 8 - 1018 - - - 1 - 1019 - - - 8 - 1019 - - - 1 - 1020 - - - 5 - 1020 - - - 8 - 1020 - - - 1 - 1021 - - - 5 - 1021 - - - 8 - 1021 - - - 1 - 1022 - - - 5 - 1022 - - - 8 - 1022 - - - 1 - 1023 - - - 5 - 1023 - - - 8 - 1023 - - - 1 - 1024 - - - 5 - 1024 - - - 8 - 1024 - - - 1 - 1025 - - - 5 - 1025 - - - 8 - 1025 - - - 1 - 1026 - - - 5 - 1026 - - - 8 - 1026 - - - 1 - 1027 - - - 5 - 1027 - - - 8 - 1027 - - - 1 - 1028 - - - 5 - 1028 - - - 8 - 1028 - - - 1 - 1029 - - - 5 - 1029 - - - 8 - 1029 - - - 1 - 1030 - - - 5 - 1030 - - - 8 - 1030 - - - 1 - 1031 - - - 5 - 1031 - - - 8 - 1031 - - - 1 - 1032 - - - 5 - 1032 - - - 8 - 1032 - - - 1 - 1033 - - - 8 - 1033 - - - 1 - 1034 - - - 8 - 1034 - - - 1 - 1035 - - - 8 - 1035 - - - 1 - 1036 - - - 8 - 1036 - - - 1 - 1037 - - - 8 - 1037 - - - 1 - 1038 - - - 8 - 1038 - - - 1 - 1039 - - - 8 - 1039 - - - 1 - 1040 - - - 8 - 1040 - - - 1 - 1041 - - - 8 - 1041 - - - 1 - 1042 - - - 8 - 1042 - - - 1 - 1043 - - - 8 - 1043 - - - 1 - 1044 - - - 8 - 1044 - - - 1 - 1045 - - - 8 - 1045 - - - 1 - 1046 - - - 8 - 1046 - - - 1 - 1047 - - - 8 - 1047 - - - 1 - 1048 - - - 8 - 1048 - - - 1 - 1049 - - - 8 - 1049 - - - 1 - 1050 - - - 8 - 1050 - - - 1 - 1051 - - - 8 - 1051 - - - 1 - 1052 - - - 8 - 1052 - - - 1 - 1053 - - - 8 - 1053 - - - 1 - 1054 - - - 8 - 1054 - - - 1 - 1055 - - - 8 - 1055 - - - 1 - 1056 - - - 8 - 1056 - - - 1 - 1057 - - - 5 - 1057 - - - 8 - 1057 - - - 1 - 1058 - - - 5 - 1058 - - - 8 - 1058 - - - 1 - 1059 - - - 5 - 1059 - - - 8 - 1059 - - - 1 - 1060 - - - 5 - 1060 - - - 8 - 1060 - - - 1 - 1061 - - - 5 - 1061 - - - 8 - 1061 - - - 1 - 1062 - - - 5 - 1062 - - - 8 - 1062 - - - 1 - 1063 - - - 5 - 1063 - - - 8 - 1063 - - - 1 - 1064 - - - 5 - 1064 - - - 8 - 1064 - - - 1 - 1065 - - - 5 - 1065 - - - 8 - 1065 - - - 1 - 1066 - - - 5 - 1066 - - - 8 - 1066 - - - 1 - 1067 - - - 5 - 1067 - - - 8 - 1067 - - - 1 - 1068 - - - 5 - 1068 - - - 8 - 1068 - - - 1 - 1069 - - - 5 - 1069 - - - 8 - 1069 - - - 1 - 1070 - - - 5 - 1070 - - - 8 - 1070 - - - 1 - 1071 - - - 5 - 1071 - - - 8 - 1071 - - - 1 - 1072 - - - 5 - 1072 - - - 8 - 1072 - - - 1 - 1073 - - - 8 - 1073 - - - 1 - 1074 - - - 8 - 1074 - - - 1 - 1075 - - - 8 - 1075 - - - 1 - 1076 - - - 8 - 1076 - - - 1 - 1077 - - - 8 - 1077 - - - 1 - 1078 - - - 8 - 1078 - - - 1 - 1079 - - - 8 - 1079 - - - 1 - 1080 - - - 8 - 1080 - - - 1 - 1081 - - - 8 - 1081 - - - 1 - 1082 - - - 8 - 1082 - - - 1 - 1083 - - - 8 - 1083 - - - 1 - 1084 - - - 8 - 1084 - - - 1 - 1085 - - - 8 - 1085 - - - 1 - 1086 - - - 8 - 1086 - - - 1 - 1087 - - - 5 - 1087 - - - 8 - 1087 - - - 1 - 1088 - - - 5 - 1088 - - - 8 - 1088 - - - 11 - 1088 - - - 1 - 1089 - - - 5 - 1089 - - - 8 - 1089 - - - 1 - 1090 - - - 5 - 1090 - - - 8 - 1090 - - - 1 - 1091 - - - 5 - 1091 - - - 8 - 1091 - - - 1 - 1092 - - - 5 - 1092 - - - 8 - 1092 - - - 1 - 1093 - - - 5 - 1093 - - - 8 - 1093 - - - 11 - 1093 - - - 1 - 1094 - - - 5 - 1094 - - - 8 - 1094 - - - 1 - 1095 - - - 5 - 1095 - - - 8 - 1095 - - - 1 - 1096 - - - 5 - 1096 - - - 8 - 1096 - - - 1 - 1097 - - - 5 - 1097 - - - 8 - 1097 - - - 1 - 1098 - - - 5 - 1098 - - - 8 - 1098 - - - 1 - 1099 - - - 5 - 1099 - - - 8 - 1099 - - - 11 - 1099 - - - 1 - 1100 - - - 5 - 1100 - - - 8 - 1100 - - - 1 - 1101 - - - 5 - 1101 - - - 8 - 1101 - - - 1 - 1102 - - - 8 - 1102 - - - 1 - 1103 - - - 8 - 1103 - - - 1 - 1104 - - - 8 - 1104 - - - 1 - 1105 - - - 5 - 1105 - - - 8 - 1105 - - - 11 - 1105 - - - 1 - 1106 - - - 5 - 1106 - - - 8 - 1106 - - - 1 - 1107 - - - 5 - 1107 - - - 8 - 1107 - - - 1 - 1108 - - - 5 - 1108 - - - 8 - 1108 - - - 1 - 1109 - - - 5 - 1109 - - - 8 - 1109 - - - 1 - 1110 - - - 5 - 1110 - - - 8 - 1110 - - - 1 - 1111 - - - 5 - 1111 - - - 8 - 1111 - - - 1 - 1112 - - - 5 - 1112 - - - 8 - 1112 - - - 1 - 1113 - - - 5 - 1113 - - - 8 - 1113 - - - 1 - 1114 - - - 5 - 1114 - - - 8 - 1114 - - - 1 - 1115 - - - 5 - 1115 - - - 8 - 1115 - - - 1 - 1116 - - - 5 - 1116 - - - 8 - 1116 - - - 1 - 1117 - - - 5 - 1117 - - - 8 - 1117 - - - 1 - 1118 - - - 5 - 1118 - - - 8 - 1118 - - - 1 - 1119 - - - 5 - 1119 - - - 8 - 1119 - - - 1 - 1120 - - - 5 - 1120 - - - 8 - 1120 - - - 1 - 1121 - - - 8 - 1121 - - - 1 - 1122 - - - 8 - 1122 - - - 1 - 1123 - - - 8 - 1123 - - - 1 - 1124 - - - 8 - 1124 - - - 1 - 1125 - - - 8 - 1125 - - - 1 - 1126 - - - 8 - 1126 - - - 1 - 1127 - - - 8 - 1127 - - - 1 - 1128 - - - 8 - 1128 - - - 1 - 1129 - - - 8 - 1129 - - - 1 - 1130 - - - 8 - 1130 - - - 1 - 1131 - - - 8 - 1131 - - - 1 - 1132 - - - 8 - 1132 - - - 1 - 1133 - - - 8 - 1133 - - - 1 - 1134 - - - 8 - 1134 - - - 1 - 1135 - - - 8 - 1135 - - - 1 - 1136 - - - 8 - 1136 - - - 1 - 1137 - - - 8 - 1137 - - - 1 - 1138 - - - 8 - 1138 - - - 1 - 1139 - - - 8 - 1139 - - - 1 - 1140 - - - 8 - 1140 - - - 1 - 1141 - - - 8 - 1141 - - - 1 - 1142 - - - 8 - 1142 - - - 1 - 1143 - - - 8 - 1143 - - - 1 - 1144 - - - 8 - 1144 - - - 1 - 1145 - - - 8 - 1145 - - - 1 - 1146 - - - 8 - 1146 - - - 1 - 1147 - - - 8 - 1147 - - - 1 - 1148 - - - 8 - 1148 - - - 1 - 1149 - - - 8 - 1149 - - - 1 - 1150 - - - 8 - 1150 - - - 1 - 1151 - - - 8 - 1151 - - - 1 - 1152 - - - 8 - 1152 - - - 1 - 1153 - - - 8 - 1153 - - - 1 - 1154 - - - 8 - 1154 - - - 1 - 1155 - - - 8 - 1155 - - - 1 - 1156 - - - 8 - 1156 - - - 1 - 1157 - - - 8 - 1157 - - - 1 - 1158 - - - 5 - 1158 - - - 8 - 1158 - - - 1 - 1159 - - - 5 - 1159 - - - 8 - 1159 - - - 1 - 1160 - - - 5 - 1160 - - - 8 - 1160 - - - 1 - 1161 - - - 5 - 1161 - - - 8 - 1161 - - - 1 - 1162 - - - 5 - 1162 - - - 8 - 1162 - - - 1 - 1163 - - - 5 - 1163 - - - 8 - 1163 - - - 1 - 1164 - - - 5 - 1164 - - - 8 - 1164 - - - 1 - 1165 - - - 5 - 1165 - - - 8 - 1165 - - - 1 - 1166 - - - 5 - 1166 - - - 8 - 1166 - - - 1 - 1167 - - - 5 - 1167 - - - 8 - 1167 - - - 1 - 1168 - - - 5 - 1168 - - - 8 - 1168 - - - 1 - 1169 - - - 5 - 1169 - - - 8 - 1169 - - - 1 - 1170 - - - 5 - 1170 - - - 8 - 1170 - - - 1 - 1171 - - - 5 - 1171 - - - 8 - 1171 - - - 1 - 1172 - - - 5 - 1172 - - - 8 - 1172 - - - 1 - 1173 - - - 5 - 1173 - - - 8 - 1173 - - - 1 - 1174 - - - 5 - 1174 - - - 8 - 1174 - - - 1 - 1175 - - - 5 - 1175 - - - 8 - 1175 - - - 1 - 1176 - - - 5 - 1176 - - - 8 - 1176 - - - 1 - 1177 - - - 5 - 1177 - - - 8 - 1177 - - - 1 - 1178 - - - 5 - 1178 - - - 8 - 1178 - - - 1 - 1179 - - - 5 - 1179 - - - 8 - 1179 - - - 1 - 1180 - - - 5 - 1180 - - - 8 - 1180 - - - 1 - 1181 - - - 5 - 1181 - - - 8 - 1181 - - - 1 - 1182 - - - 5 - 1182 - - - 8 - 1182 - - - 1 - 1183 - - - 5 - 1183 - - - 8 - 1183 - - - 1 - 1184 - - - 5 - 1184 - - - 8 - 1184 - - - 1 - 1185 - - - 5 - 1185 - - - 8 - 1185 - - - 1 - 1186 - - - 5 - 1186 - - - 8 - 1186 - - - 1 - 1187 - - - 5 - 1187 - - - 8 - 1187 - - - 1 - 1188 - - - 5 - 1188 - - - 8 - 1188 - - - 1 - 1189 - - - 5 - 1189 - - - 8 - 1189 - - - 1 - 1190 - - - 5 - 1190 - - - 8 - 1190 - - - 1 - 1191 - - - 5 - 1191 - - - 8 - 1191 - - - 1 - 1192 - - - 5 - 1192 - - - 8 - 1192 - - - 1 - 1193 - - - 5 - 1193 - - - 8 - 1193 - - - 1 - 1194 - - - 5 - 1194 - - - 8 - 1194 - - - 1 - 1195 - - - 5 - 1195 - - - 8 - 1195 - - - 1 - 1196 - - - 5 - 1196 - - - 8 - 1196 - - - 1 - 1197 - - - 5 - 1197 - - - 8 - 1197 - - - 1 - 1198 - - - 5 - 1198 - - - 8 - 1198 - - - 1 - 1199 - - - 5 - 1199 - - - 8 - 1199 - - - 1 - 1200 - - - 5 - 1200 - - - 8 - 1200 - - - 1 - 1201 - - - 8 - 1201 - - - 1 - 1202 - - - 8 - 1202 - - - 1 - 1203 - - - 8 - 1203 - - - 1 - 1204 - - - 8 - 1204 - - - 1 - 1205 - - - 8 - 1205 - - - 1 - 1206 - - - 8 - 1206 - - - 1 - 1207 - - - 8 - 1207 - - - 1 - 1208 - - - 8 - 1208 - - - 1 - 1209 - - - 8 - 1209 - - - 1 - 1210 - - - 8 - 1210 - - - 1 - 1211 - - - 8 - 1211 - - - 1 - 1212 - - - 5 - 1212 - - - 8 - 1212 - - - 1 - 1213 - - - 5 - 1213 - - - 8 - 1213 - - - 1 - 1214 - - - 5 - 1214 - - - 8 - 1214 - - - 1 - 1215 - - - 5 - 1215 - - - 8 - 1215 - - - 1 - 1216 - - - 5 - 1216 - - - 8 - 1216 - - - 1 - 1217 - - - 5 - 1217 - - - 8 - 1217 - - - 1 - 1218 - - - 5 - 1218 - - - 8 - 1218 - - - 1 - 1219 - - - 5 - 1219 - - - 8 - 1219 - - - 1 - 1220 - - - 5 - 1220 - - - 8 - 1220 - - - 1 - 1221 - - - 5 - 1221 - - - 8 - 1221 - - - 1 - 1222 - - - 5 - 1222 - - - 8 - 1222 - - - 1 - 1223 - - - 5 - 1223 - - - 8 - 1223 - - - 1 - 1224 - - - 5 - 1224 - - - 8 - 1224 - - - 1 - 1225 - - - 5 - 1225 - - - 8 - 1225 - - - 1 - 1226 - - - 5 - 1226 - - - 8 - 1226 - - - 1 - 1227 - - - 5 - 1227 - - - 8 - 1227 - - - 1 - 1228 - - - 5 - 1228 - - - 8 - 1228 - - - 1 - 1229 - - - 5 - 1229 - - - 8 - 1229 - - - 1 - 1230 - - - 5 - 1230 - - - 8 - 1230 - - - 1 - 1231 - - - 5 - 1231 - - - 8 - 1231 - - - 1 - 1232 - - - 5 - 1232 - - - 8 - 1232 - - - 1 - 1233 - - - 5 - 1233 - - - 8 - 1233 - - - 1 - 1234 - - - 5 - 1234 - - - 8 - 1234 - - - 1 - 1235 - - - 8 - 1235 - - - 1 - 1236 - - - 8 - 1236 - - - 1 - 1237 - - - 8 - 1237 - - - 1 - 1238 - - - 8 - 1238 - - - 1 - 1239 - - - 8 - 1239 - - - 1 - 1240 - - - 8 - 1240 - - - 1 - 1241 - - - 8 - 1241 - - - 1 - 1242 - - - 8 - 1242 - - - 1 - 1243 - - - 8 - 1243 - - - 1 - 1244 - - - 8 - 1244 - - - 1 - 1245 - - - 8 - 1245 - - - 1 - 1246 - - - 8 - 1246 - - - 1 - 1247 - - - 8 - 1247 - - - 1 - 1248 - - - 8 - 1248 - - - 1 - 1249 - - - 8 - 1249 - - - 1 - 1250 - - - 8 - 1250 - - - 1 - 1251 - - - 8 - 1251 - - - 1 - 1252 - - - 8 - 1252 - - - 1 - 1253 - - - 8 - 1253 - - - 1 - 1254 - - - 8 - 1254 - - - 1 - 1255 - - - 8 - 1255 - - - 1 - 1256 - - - 5 - 1256 - - - 8 - 1256 - - - 1 - 1257 - - - 5 - 1257 - - - 8 - 1257 - - - 1 - 1258 - - - 5 - 1258 - - - 8 - 1258 - - - 1 - 1259 - - - 5 - 1259 - - - 8 - 1259 - - - 1 - 1260 - - - 5 - 1260 - - - 8 - 1260 - - - 1 - 1261 - - - 5 - 1261 - - - 8 - 1261 - - - 1 - 1262 - - - 5 - 1262 - - - 8 - 1262 - - - 1 - 1263 - - - 5 - 1263 - - - 8 - 1263 - - - 1 - 1264 - - - 5 - 1264 - - - 8 - 1264 - - - 1 - 1265 - - - 5 - 1265 - - - 8 - 1265 - - - 1 - 1266 - - - 5 - 1266 - - - 8 - 1266 - - - 1 - 1267 - - - 5 - 1267 - - - 8 - 1267 - - - 1 - 1268 - - - 8 - 1268 - - - 1 - 1269 - - - 8 - 1269 - - - 1 - 1270 - - - 8 - 1270 - - - 1 - 1271 - - - 8 - 1271 - - - 1 - 1272 - - - 8 - 1272 - - - 1 - 1273 - - - 8 - 1273 - - - 1 - 1274 - - - 8 - 1274 - - - 1 - 1275 - - - 8 - 1275 - - - 1 - 1276 - - - 8 - 1276 - - - 1 - 1277 - - - 8 - 1277 - - - 1 - 1278 - - - 8 - 1278 - - - 17 - 1278 - - - 1 - 1279 - - - 8 - 1279 - - - 1 - 1280 - - - 8 - 1280 - - - 1 - 1281 - - - 8 - 1281 - - - 1 - 1282 - - - 8 - 1282 - - - 1 - 1283 - - - 8 - 1283 - - - 17 - 1283 - - - 1 - 1284 - - - 8 - 1284 - - - 1 - 1285 - - - 8 - 1285 - - - 1 - 1286 - - - 8 - 1286 - - - 1 - 1287 - - - 8 - 1287 - - - 1 - 1288 - - - 8 - 1288 - - - 1 - 1289 - - - 8 - 1289 - - - 1 - 1290 - - - 8 - 1290 - - - 1 - 1291 - - - 8 - 1291 - - - 1 - 1292 - - - 8 - 1292 - - - 1 - 1293 - - - 8 - 1293 - - - 1 - 1294 - - - 8 - 1294 - - - 1 - 1295 - - - 8 - 1295 - - - 1 - 1296 - - - 8 - 1296 - - - 1 - 1297 - - - 8 - 1297 - - - 1 - 1298 - - - 8 - 1298 - - - 1 - 1299 - - - 8 - 1299 - - - 1 - 1300 - - - 8 - 1300 - - - 1 - 1301 - - - 8 - 1301 - - - 1 - 1302 - - - 8 - 1302 - - - 1 - 1303 - - - 8 - 1303 - - - 1 - 1304 - - - 8 - 1304 - - - 1 - 1305 - - - 5 - 1305 - - - 8 - 1305 - - - 1 - 1306 - - - 5 - 1306 - - - 8 - 1306 - - - 1 - 1307 - - - 5 - 1307 - - - 8 - 1307 - - - 1 - 1308 - - - 5 - 1308 - - - 8 - 1308 - - - 1 - 1309 - - - 5 - 1309 - - - 8 - 1309 - - - 1 - 1310 - - - 5 - 1310 - - - 8 - 1310 - - - 1 - 1311 - - - 5 - 1311 - - - 8 - 1311 - - - 1 - 1312 - - - 5 - 1312 - - - 8 - 1312 - - - 1 - 1313 - - - 5 - 1313 - - - 8 - 1313 - - - 1 - 1314 - - - 5 - 1314 - - - 8 - 1314 - - - 1 - 1315 - - - 5 - 1315 - - - 8 - 1315 - - - 1 - 1316 - - - 5 - 1316 - - - 8 - 1316 - - - 1 - 1317 - - - 5 - 1317 - - - 8 - 1317 - - - 1 - 1318 - - - 5 - 1318 - - - 8 - 1318 - - - 1 - 1319 - - - 5 - 1319 - - - 8 - 1319 - - - 1 - 1320 - - - 5 - 1320 - - - 8 - 1320 - - - 1 - 1321 - - - 5 - 1321 - - - 8 - 1321 - - - 1 - 1322 - - - 5 - 1322 - - - 8 - 1322 - - - 1 - 1323 - - - 5 - 1323 - - - 8 - 1323 - - - 1 - 1324 - - - 5 - 1324 - - - 8 - 1324 - - - 1 - 1325 - - - 5 - 1325 - - - 8 - 1325 - - - 1 - 1326 - - - 5 - 1326 - - - 8 - 1326 - - - 1 - 1327 - - - 5 - 1327 - - - 8 - 1327 - - - 1 - 1328 - - - 5 - 1328 - - - 8 - 1328 - - - 1 - 1329 - - - 5 - 1329 - - - 8 - 1329 - - - 1 - 1330 - - - 5 - 1330 - - - 8 - 1330 - - - 1 - 1331 - - - 5 - 1331 - - - 8 - 1331 - - - 1 - 1332 - - - 5 - 1332 - - - 8 - 1332 - - - 1 - 1333 - - - 5 - 1333 - - - 8 - 1333 - - - 1 - 1334 - - - 5 - 1334 - - - 8 - 1334 - - - 1 - 1335 - - - 8 - 1335 - - - 17 - 1335 - - - 1 - 1336 - - - 8 - 1336 - - - 1 - 1337 - - - 8 - 1337 - - - 1 - 1338 - - - 8 - 1338 - - - 1 - 1339 - - - 8 - 1339 - - - 1 - 1340 - - - 8 - 1340 - - - 1 - 1341 - - - 8 - 1341 - - - 1 - 1342 - - - 8 - 1342 - - - 1 - 1343 - - - 8 - 1343 - - - 1 - 1344 - - - 8 - 1344 - - - 1 - 1345 - - - 8 - 1345 - - - 17 - 1345 - - - 1 - 1346 - - - 8 - 1346 - - - 1 - 1347 - - - 8 - 1347 - - - 1 - 1348 - - - 8 - 1348 - - - 1 - 1349 - - - 8 - 1349 - - - 1 - 1350 - - - 8 - 1350 - - - 1 - 1351 - - - 8 - 1351 - - - 1 - 1352 - - - 8 - 1352 - - - 1 - 1353 - - - 8 - 1353 - - - 1 - 1354 - - - 8 - 1354 - - - 1 - 1355 - - - 8 - 1355 - - - 1 - 1356 - - - 8 - 1356 - - - 1 - 1357 - - - 8 - 1357 - - - 1 - 1358 - - - 8 - 1358 - - - 1 - 1359 - - - 8 - 1359 - - - 1 - 1360 - - - 8 - 1360 - - - 1 - 1361 - - - 8 - 1361 - - - 1 - 1362 - - - 8 - 1362 - - - 1 - 1363 - - - 8 - 1363 - - - 1 - 1364 - - - 8 - 1364 - - - 1 - 1365 - - - 8 - 1365 - - - 1 - 1366 - - - 8 - 1366 - - - 1 - 1367 - - - 8 - 1367 - - - 1 - 1368 - - - 8 - 1368 - - - 1 - 1369 - - - 8 - 1369 - - - 1 - 1370 - - - 8 - 1370 - - - 1 - 1371 - - - 8 - 1371 - - - 1 - 1372 - - - 8 - 1372 - - - 1 - 1373 - - - 8 - 1373 - - - 1 - 1374 - - - 8 - 1374 - - - 1 - 1375 - - - 8 - 1375 - - - 1 - 1376 - - - 8 - 1376 - - - 1 - 1377 - - - 8 - 1377 - - - 1 - 1378 - - - 8 - 1378 - - - 1 - 1379 - - - 8 - 1379 - - - 1 - 1380 - - - 8 - 1380 - - - 17 - 1380 - - - 1 - 1381 - - - 8 - 1381 - - - 1 - 1382 - - - 8 - 1382 - - - 1 - 1383 - - - 8 - 1383 - - - 1 - 1384 - - - 8 - 1384 - - - 1 - 1385 - - - 8 - 1385 - - - 1 - 1386 - - - 8 - 1386 - - - 1 - 1387 - - - 8 - 1387 - - - 1 - 1388 - - - 8 - 1388 - - - 1 - 1389 - - - 8 - 1389 - - - 1 - 1390 - - - 8 - 1390 - - - 1 - 1391 - - - 8 - 1391 - - - 1 - 1392 - - - 8 - 1392 - - - 17 - 1392 - - - 1 - 1393 - - - 8 - 1393 - - - 1 - 1394 - - - 8 - 1394 - - - 1 - 1395 - - - 5 - 1395 - - - 8 - 1395 - - - 1 - 1396 - - - 5 - 1396 - - - 8 - 1396 - - - 1 - 1397 - - - 5 - 1397 - - - 8 - 1397 - - - 1 - 1398 - - - 5 - 1398 - - - 8 - 1398 - - - 1 - 1399 - - - 5 - 1399 - - - 8 - 1399 - - - 1 - 1400 - - - 5 - 1400 - - - 8 - 1400 - - - 1 - 1401 - - - 5 - 1401 - - - 8 - 1401 - - - 1 - 1402 - - - 5 - 1402 - - - 8 - 1402 - - - 1 - 1403 - - - 5 - 1403 - - - 8 - 1403 - - - 1 - 1404 - - - 5 - 1404 - - - 8 - 1404 - - - 1 - 1405 - - - 5 - 1405 - - - 8 - 1405 - - - 1 - 1406 - - - 5 - 1406 - - - 8 - 1406 - - - 1 - 1407 - - - 5 - 1407 - - - 8 - 1407 - - - 1 - 1408 - - - 5 - 1408 - - - 8 - 1408 - - - 1 - 1409 - - - 5 - 1409 - - - 8 - 1409 - - - 1 - 1410 - - - 5 - 1410 - - - 8 - 1410 - - - 1 - 1411 - - - 5 - 1411 - - - 8 - 1411 - - - 1 - 1412 - - - 5 - 1412 - - - 8 - 1412 - - - 1 - 1413 - - - 5 - 1413 - - - 8 - 1413 - - - 1 - 1414 - - - 5 - 1414 - - - 8 - 1414 - - - 1 - 1415 - - - 5 - 1415 - - - 8 - 1415 - - - 1 - 1416 - - - 5 - 1416 - - - 8 - 1416 - - - 1 - 1417 - - - 5 - 1417 - - - 8 - 1417 - - - 1 - 1418 - - - 5 - 1418 - - - 8 - 1418 - - - 1 - 1419 - - - 5 - 1419 - - - 8 - 1419 - - - 1 - 1420 - - - 5 - 1420 - - - 8 - 1420 - - - 1 - 1421 - - - 5 - 1421 - - - 8 - 1421 - - - 1 - 1422 - - - 5 - 1422 - - - 8 - 1422 - - - 1 - 1423 - - - 5 - 1423 - - - 8 - 1423 - - - 1 - 1424 - - - 5 - 1424 - - - 8 - 1424 - - - 1 - 1425 - - - 5 - 1425 - - - 8 - 1425 - - - 1 - 1426 - - - 5 - 1426 - - - 8 - 1426 - - - 1 - 1427 - - - 5 - 1427 - - - 8 - 1427 - - - 1 - 1428 - - - 5 - 1428 - - - 8 - 1428 - - - 1 - 1429 - - - 5 - 1429 - - - 8 - 1429 - - - 1 - 1430 - - - 5 - 1430 - - - 8 - 1430 - - - 1 - 1431 - - - 5 - 1431 - - - 8 - 1431 - - - 1 - 1432 - - - 5 - 1432 - - - 8 - 1432 - - - 1 - 1433 - - - 5 - 1433 - - - 8 - 1433 - - - 1 - 1434 - - - 5 - 1434 - - - 8 - 1434 - - - 1 - 1435 - - - 5 - 1435 - - - 8 - 1435 - - - 1 - 1436 - - - 5 - 1436 - - - 8 - 1436 - - - 1 - 1437 - - - 5 - 1437 - - - 8 - 1437 - - - 1 - 1438 - - - 5 - 1438 - - - 8 - 1438 - - - 1 - 1439 - - - 5 - 1439 - - - 8 - 1439 - - - 1 - 1440 - - - 5 - 1440 - - - 8 - 1440 - - - 1 - 1441 - - - 5 - 1441 - - - 8 - 1441 - - - 1 - 1442 - - - 5 - 1442 - - - 8 - 1442 - - - 1 - 1443 - - - 5 - 1443 - - - 8 - 1443 - - - 1 - 1444 - - - 5 - 1444 - - - 8 - 1444 - - - 1 - 1445 - - - 5 - 1445 - - - 8 - 1445 - - - 1 - 1446 - - - 5 - 1446 - - - 8 - 1446 - - - 1 - 1447 - - - 5 - 1447 - - - 8 - 1447 - - - 1 - 1448 - - - 5 - 1448 - - - 8 - 1448 - - - 1 - 1449 - - - 5 - 1449 - - - 8 - 1449 - - - 1 - 1450 - - - 5 - 1450 - - - 8 - 1450 - - - 1 - 1451 - - - 5 - 1451 - - - 8 - 1451 - - - 1 - 1452 - - - 5 - 1452 - - - 8 - 1452 - - - 1 - 1453 - - - 5 - 1453 - - - 8 - 1453 - - - 1 - 1454 - - - 5 - 1454 - - - 8 - 1454 - - - 1 - 1455 - - - 5 - 1455 - - - 8 - 1455 - - - 1 - 1456 - - - 5 - 1456 - - - 8 - 1456 - - - 1 - 1457 - - - 5 - 1457 - - - 8 - 1457 - - - 1 - 1458 - - - 5 - 1458 - - - 8 - 1458 - - - 1 - 1459 - - - 5 - 1459 - - - 8 - 1459 - - - 1 - 1460 - - - 5 - 1460 - - - 8 - 1460 - - - 1 - 1461 - - - 5 - 1461 - - - 8 - 1461 - - - 1 - 1462 - - - 5 - 1462 - - - 8 - 1462 - - - 1 - 1463 - - - 5 - 1463 - - - 8 - 1463 - - - 1 - 1464 - - - 5 - 1464 - - - 8 - 1464 - - - 1 - 1465 - - - 5 - 1465 - - - 8 - 1465 - - - 1 - 1466 - - - 8 - 1466 - - - 1 - 1467 - - - 8 - 1467 - - - 1 - 1468 - - - 8 - 1468 - - - 1 - 1469 - - - 8 - 1469 - - - 1 - 1470 - - - 8 - 1470 - - - 1 - 1471 - - - 8 - 1471 - - - 1 - 1472 - - - 8 - 1472 - - - 1 - 1473 - - - 8 - 1473 - - - 1 - 1474 - - - 8 - 1474 - - - 1 - 1475 - - - 8 - 1475 - - - 1 - 1476 - - - 8 - 1476 - - - 1 - 1477 - - - 8 - 1477 - - - 1 - 1478 - - - 8 - 1478 - - - 1 - 1479 - - - 8 - 1479 - - - 1 - 1480 - - - 8 - 1480 - - - 1 - 1481 - - - 8 - 1481 - - - 1 - 1482 - - - 8 - 1482 - - - 1 - 1483 - - - 8 - 1483 - - - 1 - 1484 - - - 8 - 1484 - - - 1 - 1485 - - - 8 - 1485 - - - 1 - 1486 - - - 8 - 1486 - - - 1 - 1487 - - - 8 - 1487 - - - 1 - 1488 - - - 8 - 1488 - - - 1 - 1489 - - - 8 - 1489 - - - 1 - 1490 - - - 8 - 1490 - - - 1 - 1491 - - - 8 - 1491 - - - 1 - 1492 - - - 8 - 1492 - - - 1 - 1493 - - - 8 - 1493 - - - 1 - 1494 - - - 8 - 1494 - - - 1 - 1495 - - - 8 - 1495 - - - 1 - 1496 - - - 5 - 1496 - - - 8 - 1496 - - - 1 - 1497 - - - 5 - 1497 - - - 8 - 1497 - - - 1 - 1498 - - - 5 - 1498 - - - 8 - 1498 - - - 1 - 1499 - - - 5 - 1499 - - - 8 - 1499 - - - 1 - 1500 - - - 5 - 1500 - - - 8 - 1500 - - - 1 - 1501 - - - 5 - 1501 - - - 8 - 1501 - - - 1 - 1502 - - - 5 - 1502 - - - 8 - 1502 - - - 1 - 1503 - - - 5 - 1503 - - - 8 - 1503 - - - 1 - 1504 - - - 5 - 1504 - - - 8 - 1504 - - - 1 - 1505 - - - 5 - 1505 - - - 8 - 1505 - - - 1 - 1506 - - - 8 - 1506 - - - 1 - 1507 - - - 8 - 1507 - - - 1 - 1508 - - - 8 - 1508 - - - 1 - 1509 - - - 8 - 1509 - - - 1 - 1510 - - - 8 - 1510 - - - 1 - 1511 - - - 8 - 1511 - - - 1 - 1512 - - - 8 - 1512 - - - 1 - 1513 - - - 8 - 1513 - - - 1 - 1514 - - - 8 - 1514 - - - 11 - 1514 - - - 1 - 1515 - - - 8 - 1515 - - - 1 - 1516 - - - 8 - 1516 - - - 1 - 1517 - - - 8 - 1517 - - - 1 - 1518 - - - 8 - 1518 - - - 11 - 1518 - - - 1 - 1519 - - - 8 - 1519 - - - 11 - 1519 - - - 1 - 1520 - - - 5 - 1520 - - - 8 - 1520 - - - 1 - 1521 - - - 5 - 1521 - - - 8 - 1521 - - - 1 - 1522 - - - 5 - 1522 - - - 8 - 1522 - - - 1 - 1523 - - - 5 - 1523 - - - 8 - 1523 - - - 1 - 1524 - - - 5 - 1524 - - - 8 - 1524 - - - 1 - 1525 - - - 5 - 1525 - - - 8 - 1525 - - - 1 - 1526 - - - 5 - 1526 - - - 8 - 1526 - - - 1 - 1527 - - - 5 - 1527 - - - 8 - 1527 - - - 1 - 1528 - - - 5 - 1528 - - - 8 - 1528 - - - 1 - 1529 - - - 5 - 1529 - - - 8 - 1529 - - - 1 - 1530 - - - 5 - 1530 - - - 8 - 1530 - - - 1 - 1531 - - - 5 - 1531 - - - 8 - 1531 - - - 1 - 1532 - - - 8 - 1532 - - - 1 - 1533 - - - 8 - 1533 - - - 1 - 1534 - - - 8 - 1534 - - - 1 - 1535 - - - 8 - 1535 - - - 1 - 1536 - - - 8 - 1536 - - - 1 - 1537 - - - 8 - 1537 - - - 1 - 1538 - - - 8 - 1538 - - - 1 - 1539 - - - 8 - 1539 - - - 1 - 1540 - - - 8 - 1540 - - - 1 - 1541 - - - 8 - 1541 - - - 1 - 1542 - - - 8 - 1542 - - - 1 - 1543 - - - 8 - 1543 - - - 1 - 1544 - - - 8 - 1544 - - - 1 - 1545 - - - 8 - 1545 - - - 1 - 1546 - - - 8 - 1546 - - - 1 - 1547 - - - 8 - 1547 - - - 1 - 1548 - - - 8 - 1548 - - - 1 - 1549 - - - 8 - 1549 - - - 1 - 1550 - - - 8 - 1550 - - - 1 - 1551 - - - 8 - 1551 - - - 1 - 1552 - - - 8 - 1552 - - - 1 - 1553 - - - 8 - 1553 - - - 1 - 1554 - - - 8 - 1554 - - - 1 - 1555 - - - 8 - 1555 - - - 1 - 1556 - - - 8 - 1556 - - - 1 - 1557 - - - 5 - 1557 - - - 8 - 1557 - - - 1 - 1558 - - - 8 - 1558 - - - 1 - 1559 - - - 8 - 1559 - - - 1 - 1560 - - - 8 - 1560 - - - 1 - 1561 - - - 8 - 1561 - - - 1 - 1562 - - - 5 - 1562 - - - 8 - 1562 - - - 1 - 1563 - - - 5 - 1563 - - - 8 - 1563 - - - 1 - 1564 - - - 5 - 1564 - - - 8 - 1564 - - - 1 - 1565 - - - 5 - 1565 - - - 8 - 1565 - - - 1 - 1566 - - - 5 - 1566 - - - 8 - 1566 - - - 1 - 1567 - - - 5 - 1567 - - - 8 - 1567 - - - 1 - 1568 - - - 5 - 1568 - - - 8 - 1568 - - - 1 - 1569 - - - 5 - 1569 - - - 8 - 1569 - - - 1 - 1570 - - - 5 - 1570 - - - 8 - 1570 - - - 1 - 1571 - - - 5 - 1571 - - - 8 - 1571 - - - 1 - 1572 - - - 5 - 1572 - - - 8 - 1572 - - - 1 - 1573 - - - 5 - 1573 - - - 8 - 1573 - - - 1 - 1574 - - - 5 - 1574 - - - 8 - 1574 - - - 1 - 1575 - - - 5 - 1575 - - - 8 - 1575 - - - 1 - 1576 - - - 5 - 1576 - - - 8 - 1576 - - - 1 - 1577 - - - 5 - 1577 - - - 8 - 1577 - - - 1 - 1578 - - - 5 - 1578 - - - 8 - 1578 - - - 1 - 1579 - - - 5 - 1579 - - - 8 - 1579 - - - 1 - 1580 - - - 5 - 1580 - - - 8 - 1580 - - - 1 - 1581 - - - 5 - 1581 - - - 8 - 1581 - - - 1 - 1582 - - - 5 - 1582 - - - 8 - 1582 - - - 1 - 1583 - - - 5 - 1583 - - - 8 - 1583 - - - 1 - 1584 - - - 5 - 1584 - - - 8 - 1584 - - - 1 - 1585 - - - 5 - 1585 - - - 8 - 1585 - - - 1 - 1586 - - - 5 - 1586 - - - 8 - 1586 - - - 1 - 1587 - - - 8 - 1587 - - - 1 - 1588 - - - 8 - 1588 - - - 1 - 1589 - - - 8 - 1589 - - - 1 - 1590 - - - 8 - 1590 - - - 1 - 1591 - - - 8 - 1591 - - - 1 - 1592 - - - 8 - 1592 - - - 1 - 1593 - - - 8 - 1593 - - - 1 - 1594 - - - 8 - 1594 - - - 1 - 1595 - - - 8 - 1595 - - - 1 - 1596 - - - 8 - 1596 - - - 1 - 1597 - - - 8 - 1597 - - - 1 - 1598 - - - 8 - 1598 - - - 1 - 1599 - - - 8 - 1599 - - - 1 - 1600 - - - 8 - 1600 - - - 1 - 1601 - - - 8 - 1601 - - - 1 - 1602 - - - 8 - 1602 - - - 1 - 1603 - - - 8 - 1603 - - - 1 - 1604 - - - 8 - 1604 - - - 1 - 1605 - - - 8 - 1605 - - - 1 - 1606 - - - 8 - 1606 - - - 1 - 1607 - - - 8 - 1607 - - - 1 - 1608 - - - 8 - 1608 - - - 1 - 1609 - - - 8 - 1609 - - - 1 - 1610 - - - 8 - 1610 - - - 1 - 1611 - - - 8 - 1611 - - - 1 - 1612 - - - 8 - 1612 - - - 1 - 1613 - - - 8 - 1613 - - - 1 - 1614 - - - 8 - 1614 - - - 1 - 1615 - - - 8 - 1615 - - - 1 - 1616 - - - 8 - 1616 - - - 1 - 1617 - - - 8 - 1617 - - - 1 - 1618 - - - 8 - 1618 - - - 1 - 1619 - - - 8 - 1619 - - - 1 - 1620 - - - 8 - 1620 - - - 1 - 1621 - - - 8 - 1621 - - - 1 - 1622 - - - 8 - 1622 - - - 1 - 1623 - - - 8 - 1623 - - - 1 - 1624 - - - 8 - 1624 - - - 1 - 1625 - - - 8 - 1625 - - - 1 - 1626 - - - 8 - 1626 - - - 1 - 1627 - - - 8 - 1627 - - - 1 - 1628 - - - 8 - 1628 - - - 1 - 1629 - - - 8 - 1629 - - - 1 - 1630 - - - 8 - 1630 - - - 1 - 1631 - - - 8 - 1631 - - - 1 - 1632 - - - 8 - 1632 - - - 1 - 1633 - - - 8 - 1633 - - - 1 - 1634 - - - 8 - 1634 - - - 1 - 1635 - - - 8 - 1635 - - - 1 - 1636 - - - 8 - 1636 - - - 1 - 1637 - - - 8 - 1637 - - - 1 - 1638 - - - 8 - 1638 - - - 1 - 1639 - - - 8 - 1639 - - - 1 - 1640 - - - 8 - 1640 - - - 1 - 1641 - - - 8 - 1641 - - - 1 - 1642 - - - 8 - 1642 - - - 1 - 1643 - - - 8 - 1643 - - - 1 - 1644 - - - 8 - 1644 - - - 1 - 1645 - - - 8 - 1645 - - - 1 - 1646 - - - 8 - 1646 - - - 1 - 1647 - - - 8 - 1647 - - - 1 - 1648 - - - 8 - 1648 - - - 1 - 1649 - - - 8 - 1649 - - - 1 - 1650 - - - 8 - 1650 - - - 1 - 1651 - - - 8 - 1651 - - - 1 - 1652 - - - 8 - 1652 - - - 1 - 1653 - - - 8 - 1653 - - - 1 - 1654 - - - 8 - 1654 - - - 1 - 1655 - - - 8 - 1655 - - - 1 - 1656 - - - 8 - 1656 - - - 1 - 1657 - - - 8 - 1657 - - - 1 - 1658 - - - 8 - 1658 - - - 1 - 1659 - - - 8 - 1659 - - - 1 - 1660 - - - 8 - 1660 - - - 1 - 1661 - - - 8 - 1661 - - - 1 - 1662 - - - 8 - 1662 - - - 1 - 1663 - - - 8 - 1663 - - - 1 - 1664 - - - 8 - 1664 - - - 1 - 1665 - - - 8 - 1665 - - - 1 - 1666 - - - 8 - 1666 - - - 1 - 1667 - - - 8 - 1667 - - - 1 - 1668 - - - 8 - 1668 - - - 1 - 1669 - - - 8 - 1669 - - - 1 - 1670 - - - 8 - 1670 - - - 1 - 1671 - - - 5 - 1671 - - - 8 - 1671 - - - 1 - 1672 - - - 5 - 1672 - - - 8 - 1672 - - - 1 - 1673 - - - 5 - 1673 - - - 8 - 1673 - - - 1 - 1674 - - - 5 - 1674 - - - 8 - 1674 - - - 1 - 1675 - - - 5 - 1675 - - - 8 - 1675 - - - 1 - 1676 - - - 5 - 1676 - - - 8 - 1676 - - - 1 - 1677 - - - 5 - 1677 - - - 8 - 1677 - - - 1 - 1678 - - - 5 - 1678 - - - 8 - 1678 - - - 1 - 1679 - - - 5 - 1679 - - - 8 - 1679 - - - 1 - 1680 - - - 5 - 1680 - - - 8 - 1680 - - - 1 - 1681 - - - 5 - 1681 - - - 8 - 1681 - - - 1 - 1682 - - - 5 - 1682 - - - 8 - 1682 - - - 1 - 1683 - - - 5 - 1683 - - - 8 - 1683 - - - 1 - 1684 - - - 5 - 1684 - - - 8 - 1684 - - - 1 - 1685 - - - 5 - 1685 - - - 8 - 1685 - - - 1 - 1686 - - - 5 - 1686 - - - 8 - 1686 - - - 1 - 1687 - - - 5 - 1687 - - - 8 - 1687 - - - 1 - 1688 - - - 5 - 1688 - - - 8 - 1688 - - - 1 - 1689 - - - 5 - 1689 - - - 8 - 1689 - - - 1 - 1690 - - - 5 - 1690 - - - 8 - 1690 - - - 1 - 1691 - - - 5 - 1691 - - - 8 - 1691 - - - 1 - 1692 - - - 5 - 1692 - - - 8 - 1692 - - - 1 - 1693 - - - 5 - 1693 - - - 8 - 1693 - - - 1 - 1694 - - - 5 - 1694 - - - 8 - 1694 - - - 1 - 1695 - - - 5 - 1695 - - - 8 - 1695 - - - 1 - 1696 - - - 5 - 1696 - - - 8 - 1696 - - - 1 - 1697 - - - 5 - 1697 - - - 8 - 1697 - - - 1 - 1698 - - - 5 - 1698 - - - 8 - 1698 - - - 1 - 1699 - - - 5 - 1699 - - - 8 - 1699 - - - 1 - 1700 - - - 5 - 1700 - - - 8 - 1700 - - - 1 - 1701 - - - 5 - 1701 - - - 8 - 1701 - - - 1 - 1702 - - - 8 - 1702 - - - 1 - 1703 - - - 8 - 1703 - - - 1 - 1704 - - - 8 - 1704 - - - 1 - 1705 - - - 8 - 1705 - - - 1 - 1706 - - - 8 - 1706 - - - 1 - 1707 - - - 8 - 1707 - - - 1 - 1708 - - - 8 - 1708 - - - 1 - 1709 - - - 8 - 1709 - - - 1 - 1710 - - - 8 - 1710 - - - 1 - 1711 - - - 8 - 1711 - - - 1 - 1712 - - - 8 - 1712 - - - 1 - 1713 - - - 8 - 1713 - - - 1 - 1714 - - - 8 - 1714 - - - 1 - 1715 - - - 8 - 1715 - - - 1 - 1716 - - - 8 - 1716 - - - 1 - 1717 - - - 8 - 1717 - - - 1 - 1718 - - - 8 - 1718 - - - 1 - 1719 - - - 8 - 1719 - - - 1 - 1720 - - - 8 - 1720 - - - 1 - 1721 - - - 8 - 1721 - - - 1 - 1722 - - - 8 - 1722 - - - 1 - 1723 - - - 8 - 1723 - - - 1 - 1724 - - - 8 - 1724 - - - 1 - 1725 - - - 8 - 1725 - - - 1 - 1726 - - - 8 - 1726 - - - 1 - 1727 - - - 8 - 1727 - - - 1 - 1728 - - - 8 - 1728 - - - 1 - 1729 - - - 8 - 1729 - - - 1 - 1730 - - - 8 - 1730 - - - 1 - 1731 - - - 8 - 1731 - - - 1 - 1732 - - - 8 - 1732 - - - 1 - 1733 - - - 8 - 1733 - - - 1 - 1734 - - - 8 - 1734 - - - 1 - 1735 - - - 8 - 1735 - - - 1 - 1736 - - - 8 - 1736 - - - 1 - 1737 - - - 8 - 1737 - - - 1 - 1738 - - - 8 - 1738 - - - 1 - 1739 - - - 8 - 1739 - - - 1 - 1740 - - - 8 - 1740 - - - 1 - 1741 - - - 8 - 1741 - - - 1 - 1742 - - - 8 - 1742 - - - 1 - 1743 - - - 8 - 1743 - - - 1 - 1744 - - - 8 - 1744 - - - 1 - 1745 - - - 8 - 1745 - - - 1 - 1746 - - - 8 - 1746 - - - 1 - 1747 - - - 8 - 1747 - - - 1 - 1748 - - - 8 - 1748 - - - 1 - 1749 - - - 8 - 1749 - - - 1 - 1750 - - - 8 - 1750 - - - 1 - 1751 - - - 8 - 1751 - - - 1 - 1752 - - - 8 - 1752 - - - 1 - 1753 - - - 8 - 1753 - - - 1 - 1754 - - - 8 - 1754 - - - 1 - 1755 - - - 8 - 1755 - - - 1 - 1756 - - - 8 - 1756 - - - 1 - 1757 - - - 8 - 1757 - - - 1 - 1758 - - - 8 - 1758 - - - 1 - 1759 - - - 8 - 1759 - - - 1 - 1760 - - - 8 - 1760 - - - 1 - 1761 - - - 8 - 1761 - - - 1 - 1762 - - - 8 - 1762 - - - 1 - 1763 - - - 8 - 1763 - - - 1 - 1764 - - - 8 - 1764 - - - 1 - 1765 - - - 8 - 1765 - - - 1 - 1766 - - - 8 - 1766 - - - 1 - 1767 - - - 8 - 1767 - - - 1 - 1768 - - - 8 - 1768 - - - 1 - 1769 - - - 8 - 1769 - - - 1 - 1770 - - - 8 - 1770 - - - 1 - 1771 - - - 8 - 1771 - - - 1 - 1772 - - - 8 - 1772 - - - 1 - 1773 - - - 8 - 1773 - - - 1 - 1774 - - - 8 - 1774 - - - 1 - 1775 - - - 8 - 1775 - - - 1 - 1776 - - - 8 - 1776 - - - 1 - 1777 - - - 8 - 1777 - - - 1 - 1778 - - - 8 - 1778 - - - 1 - 1779 - - - 8 - 1779 - - - 1 - 1780 - - - 8 - 1780 - - - 1 - 1781 - - - 8 - 1781 - - - 1 - 1782 - - - 8 - 1782 - - - 1 - 1783 - - - 8 - 1783 - - - 1 - 1784 - - - 8 - 1784 - - - 1 - 1785 - - - 8 - 1785 - - - 1 - 1786 - - - 8 - 1786 - - - 1 - 1787 - - - 8 - 1787 - - - 1 - 1788 - - - 8 - 1788 - - - 1 - 1789 - - - 8 - 1789 - - - 1 - 1790 - - - 8 - 1790 - - - 1 - 1791 - - - 8 - 1791 - - - 1 - 1792 - - - 8 - 1792 - - - 1 - 1793 - - - 8 - 1793 - - - 1 - 1794 - - - 8 - 1794 - - - 1 - 1795 - - - 8 - 1795 - - - 1 - 1796 - - - 8 - 1796 - - - 1 - 1797 - - - 8 - 1797 - - - 1 - 1798 - - - 8 - 1798 - - - 1 - 1799 - - - 8 - 1799 - - - 1 - 1800 - - - 8 - 1800 - - - 1 - 1801 - - - 5 - 1801 - - - 8 - 1801 - - - 17 - 1801 - - - 1 - 1802 - - - 5 - 1802 - - - 8 - 1802 - - - 1 - 1803 - - - 5 - 1803 - - - 8 - 1803 - - - 1 - 1804 - - - 5 - 1804 - - - 8 - 1804 - - - 1 - 1805 - - - 5 - 1805 - - - 8 - 1805 - - - 1 - 1806 - - - 5 - 1806 - - - 8 - 1806 - - - 1 - 1807 - - - 5 - 1807 - - - 8 - 1807 - - - 1 - 1808 - - - 5 - 1808 - - - 8 - 1808 - - - 1 - 1809 - - - 5 - 1809 - - - 8 - 1809 - - - 1 - 1810 - - - 5 - 1810 - - - 8 - 1810 - - - 1 - 1811 - - - 5 - 1811 - - - 8 - 1811 - - - 1 - 1812 - - - 5 - 1812 - - - 8 - 1812 - - - 1 - 1813 - - - 5 - 1813 - - - 8 - 1813 - - - 1 - 1814 - - - 5 - 1814 - - - 8 - 1814 - - - 1 - 1815 - - - 5 - 1815 - - - 8 - 1815 - - - 1 - 1816 - - - 5 - 1816 - - - 8 - 1816 - - - 1 - 1817 - - - 5 - 1817 - - - 8 - 1817 - - - 1 - 1818 - - - 5 - 1818 - - - 8 - 1818 - - - 1 - 1819 - - - 5 - 1819 - - - 8 - 1819 - - - 1 - 1820 - - - 5 - 1820 - - - 8 - 1820 - - - 1 - 1821 - - - 5 - 1821 - - - 8 - 1821 - - - 1 - 1822 - - - 5 - 1822 - - - 8 - 1822 - - - 1 - 1823 - - - 5 - 1823 - - - 8 - 1823 - - - 1 - 1824 - - - 5 - 1824 - - - 8 - 1824 - - - 1 - 1825 - - - 5 - 1825 - - - 8 - 1825 - - - 1 - 1826 - - - 5 - 1826 - - - 8 - 1826 - - - 1 - 1827 - - - 5 - 1827 - - - 8 - 1827 - - - 1 - 1828 - - - 5 - 1828 - - - 8 - 1828 - - - 1 - 1829 - - - 8 - 1829 - - - 1 - 1830 - - - 8 - 1830 - - - 17 - 1830 - - - 1 - 1831 - - - 8 - 1831 - - - 1 - 1832 - - - 8 - 1832 - - - 1 - 1833 - - - 8 - 1833 - - - 1 - 1834 - - - 8 - 1834 - - - 1 - 1835 - - - 8 - 1835 - - - 1 - 1836 - - - 8 - 1836 - - - 1 - 1837 - - - 8 - 1837 - - - 17 - 1837 - - - 1 - 1838 - - - 8 - 1838 - - - 1 - 1839 - - - 5 - 1839 - - - 8 - 1839 - - - 1 - 1840 - - - 5 - 1840 - - - 8 - 1840 - - - 1 - 1841 - - - 5 - 1841 - - - 8 - 1841 - - - 1 - 1842 - - - 5 - 1842 - - - 8 - 1842 - - - 1 - 1843 - - - 5 - 1843 - - - 8 - 1843 - - - 1 - 1844 - - - 5 - 1844 - - - 8 - 1844 - - - 1 - 1845 - - - 5 - 1845 - - - 8 - 1845 - - - 1 - 1846 - - - 5 - 1846 - - - 8 - 1846 - - - 1 - 1847 - - - 5 - 1847 - - - 8 - 1847 - - - 1 - 1848 - - - 5 - 1848 - - - 8 - 1848 - - - 1 - 1849 - - - 5 - 1849 - - - 8 - 1849 - - - 1 - 1850 - - - 5 - 1850 - - - 8 - 1850 - - - 1 - 1851 - - - 5 - 1851 - - - 8 - 1851 - - - 1 - 1852 - - - 5 - 1852 - - - 8 - 1852 - - - 1 - 1853 - - - 8 - 1853 - - - 1 - 1854 - - - 8 - 1854 - - - 17 - 1854 - - - 1 - 1855 - - - 8 - 1855 - - - 1 - 1856 - - - 8 - 1856 - - - 1 - 1857 - - - 8 - 1857 - - - 1 - 1858 - - - 8 - 1858 - - - 1 - 1859 - - - 8 - 1859 - - - 1 - 1860 - - - 8 - 1860 - - - 1 - 1861 - - - 5 - 1861 - - - 8 - 1861 - - - 1 - 1862 - - - 5 - 1862 - - - 8 - 1862 - - - 1 - 1863 - - - 5 - 1863 - - - 8 - 1863 - - - 1 - 1864 - - - 5 - 1864 - - - 8 - 1864 - - - 1 - 1865 - - - 5 - 1865 - - - 8 - 1865 - - - 1 - 1866 - - - 5 - 1866 - - - 8 - 1866 - - - 1 - 1867 - - - 5 - 1867 - - - 8 - 1867 - - - 1 - 1868 - - - 5 - 1868 - - - 8 - 1868 - - - 1 - 1869 - - - 5 - 1869 - - - 8 - 1869 - - - 1 - 1870 - - - 5 - 1870 - - - 8 - 1870 - - - 1 - 1871 - - - 5 - 1871 - - - 8 - 1871 - - - 1 - 1872 - - - 5 - 1872 - - - 8 - 1872 - - - 1 - 1873 - - - 5 - 1873 - - - 8 - 1873 - - - 1 - 1874 - - - 8 - 1874 - - - 1 - 1875 - - - 8 - 1875 - - - 1 - 1876 - - - 8 - 1876 - - - 17 - 1876 - - - 1 - 1877 - - - 8 - 1877 - - - 1 - 1878 - - - 8 - 1878 - - - 1 - 1879 - - - 8 - 1879 - - - 1 - 1880 - - - 8 - 1880 - - - 17 - 1880 - - - 1 - 1881 - - - 8 - 1881 - - - 1 - 1882 - - - 8 - 1882 - - - 1 - 1883 - - - 8 - 1883 - - - 1 - 1884 - - - 8 - 1884 - - - 1 - 1885 - - - 8 - 1885 - - - 1 - 1886 - - - 8 - 1886 - - - 1 - 1887 - - - 8 - 1887 - - - 1 - 1888 - - - 8 - 1888 - - - 1 - 1889 - - - 8 - 1889 - - - 1 - 1890 - - - 8 - 1890 - - - 1 - 1891 - - - 8 - 1891 - - - 1 - 1892 - - - 8 - 1892 - - - 1 - 1893 - - - 8 - 1893 - - - 1 - 1894 - - - 8 - 1894 - - - 1 - 1895 - - - 8 - 1895 - - - 1 - 1896 - - - 8 - 1896 - - - 1 - 1897 - - - 8 - 1897 - - - 1 - 1898 - - - 8 - 1898 - - - 1 - 1899 - - - 8 - 1899 - - - 1 - 1900 - - - 8 - 1900 - - - 1 - 1901 - - - 8 - 1901 - - - 1 - 1902 - - - 8 - 1902 - - - 1 - 1903 - - - 8 - 1903 - - - 1 - 1904 - - - 8 - 1904 - - - 1 - 1905 - - - 8 - 1905 - - - 1 - 1906 - - - 8 - 1906 - - - 1 - 1907 - - - 8 - 1907 - - - 1 - 1908 - - - 8 - 1908 - - - 1 - 1909 - - - 8 - 1909 - - - 1 - 1910 - - - 8 - 1910 - - - 1 - 1911 - - - 8 - 1911 - - - 1 - 1912 - - - 8 - 1912 - - - 1 - 1913 - - - 8 - 1913 - - - 1 - 1914 - - - 8 - 1914 - - - 1 - 1915 - - - 8 - 1915 - - - 1 - 1916 - - - 8 - 1916 - - - 11 - 1916 - - - 1 - 1917 - - - 8 - 1917 - - - 1 - 1918 - - - 8 - 1918 - - - 1 - 1919 - - - 8 - 1919 - - - 1 - 1920 - - - 8 - 1920 - - - 1 - 1921 - - - 8 - 1921 - - - 11 - 1921 - - - 1 - 1922 - - - 8 - 1922 - - - 1 - 1923 - - - 8 - 1923 - - - 1 - 1924 - - - 8 - 1924 - - - 1 - 1925 - - - 8 - 1925 - - - 1 - 1926 - - - 8 - 1926 - - - 1 - 1927 - - - 8 - 1927 - - - 1 - 1928 - - - 8 - 1928 - - - 11 - 1928 - - - 1 - 1929 - - - 8 - 1929 - - - 1 - 1930 - - - 8 - 1930 - - - 1 - 1931 - - - 8 - 1931 - - - 1 - 1932 - - - 8 - 1932 - - - 1 - 1933 - - - 8 - 1933 - - - 1 - 1934 - - - 8 - 1934 - - - 1 - 1935 - - - 8 - 1935 - - - 1 - 1936 - - - 8 - 1936 - - - 1 - 1937 - - - 8 - 1937 - - - 1 - 1938 - - - 8 - 1938 - - - 1 - 1939 - - - 8 - 1939 - - - 1 - 1940 - - - 8 - 1940 - - - 1 - 1941 - - - 8 - 1941 - - - 1 - 1942 - - - 8 - 1942 - - - 17 - 1942 - - - 1 - 1943 - - - 8 - 1943 - - - 1 - 1944 - - - 8 - 1944 - - - 1 - 1945 - - - 8 - 1945 - - - 17 - 1945 - - - 1 - 1946 - - - 8 - 1946 - - - 1 - 1947 - - - 8 - 1947 - - - 1 - 1948 - - - 8 - 1948 - - - 1 - 1949 - - - 8 - 1949 - - - 1 - 1950 - - - 8 - 1950 - - - 1 - 1951 - - - 8 - 1951 - - - 1 - 1952 - - - 8 - 1952 - - - 1 - 1953 - - - 8 - 1953 - - - 1 - 1954 - - - 8 - 1954 - - - 1 - 1955 - - - 8 - 1955 - - - 1 - 1956 - - - 8 - 1956 - - - 1 - 1957 - - - 8 - 1957 - - - 1 - 1958 - - - 8 - 1958 - - - 1 - 1959 - - - 8 - 1959 - - - 1 - 1960 - - - 8 - 1960 - - - 1 - 1961 - - - 8 - 1961 - - - 1 - 1962 - - - 8 - 1962 - - - 1 - 1963 - - - 8 - 1963 - - - 1 - 1964 - - - 8 - 1964 - - - 1 - 1965 - - - 8 - 1965 - - - 1 - 1966 - - - 8 - 1966 - - - 1 - 1967 - - - 8 - 1967 - - - 1 - 1968 - - - 8 - 1968 - - - 1 - 1969 - - - 5 - 1969 - - - 8 - 1969 - - - 1 - 1970 - - - 5 - 1970 - - - 8 - 1970 - - - 1 - 1971 - - - 5 - 1971 - - - 8 - 1971 - - - 1 - 1972 - - - 5 - 1972 - - - 8 - 1972 - - - 1 - 1973 - - - 5 - 1973 - - - 8 - 1973 - - - 1 - 1974 - - - 5 - 1974 - - - 8 - 1974 - - - 1 - 1975 - - - 5 - 1975 - - - 8 - 1975 - - - 1 - 1976 - - - 5 - 1976 - - - 8 - 1976 - - - 1 - 1977 - - - 5 - 1977 - - - 8 - 1977 - - - 1 - 1978 - - - 5 - 1978 - - - 8 - 1978 - - - 1 - 1979 - - - 5 - 1979 - - - 8 - 1979 - - - 1 - 1980 - - - 5 - 1980 - - - 8 - 1980 - - - 1 - 1981 - - - 5 - 1981 - - - 8 - 1981 - - - 1 - 1982 - - - 5 - 1982 - - - 8 - 1982 - - - 1 - 1983 - - - 5 - 1983 - - - 8 - 1983 - - - 1 - 1984 - - - 5 - 1984 - - - 8 - 1984 - - - 17 - 1984 - - - 1 - 1985 - - - 5 - 1985 - - - 8 - 1985 - - - 1 - 1986 - - - 5 - 1986 - - - 8 - 1986 - - - 1 - 1987 - - - 5 - 1987 - - - 8 - 1987 - - - 1 - 1988 - - - 5 - 1988 - - - 8 - 1988 - - - 1 - 1989 - - - 5 - 1989 - - - 8 - 1989 - - - 1 - 1990 - - - 5 - 1990 - - - 8 - 1990 - - - 1 - 1991 - - - 5 - 1991 - - - 8 - 1991 - - - 1 - 1992 - - - 5 - 1992 - - - 8 - 1992 - - - 1 - 1993 - - - 5 - 1993 - - - 8 - 1993 - - - 1 - 1994 - - - 5 - 1994 - - - 8 - 1994 - - - 1 - 1995 - - - 5 - 1995 - - - 8 - 1995 - - - 1 - 1996 - - - 5 - 1996 - - - 8 - 1996 - - - 1 - 1997 - - - 5 - 1997 - - - 8 - 1997 - - - 1 - 1998 - - - 5 - 1998 - - - 8 - 1998 - - - 1 - 1999 - - - 5 - 1999 - - - 8 - 1999 - - - 1 - 2000 - - - 5 - 2000 - - - 8 - 2000 - - - 1 - 2001 - - - 5 - 2001 - - - 8 - 2001 - - - 1 - 2002 - - - 5 - 2002 - - - 8 - 2002 - - - 1 - 2003 - - - 5 - 2003 - - - 8 - 2003 - - - 16 - 2003 - - - 1 - 2004 - - - 5 - 2004 - - - 8 - 2004 - - - 16 - 2004 - - - 1 - 2005 - - - 5 - 2005 - - - 8 - 2005 - - - 16 - 2005 - - - 1 - 2006 - - - 5 - 2006 - - - 8 - 2006 - - - 1 - 2007 - - - 5 - 2007 - - - 8 - 2007 - - - 16 - 2007 - - - 1 - 2008 - - - 5 - 2008 - - - 8 - 2008 - - - 1 - 2009 - - - 5 - 2009 - - - 8 - 2009 - - - 1 - 2010 - - - 5 - 2010 - - - 8 - 2010 - - - 16 - 2010 - - - 1 - 2011 - - - 5 - 2011 - - - 8 - 2011 - - - 1 - 2012 - - - 5 - 2012 - - - 8 - 2012 - - - 1 - 2013 - - - 5 - 2013 - - - 8 - 2013 - - - 16 - 2013 - - - 1 - 2014 - - - 5 - 2014 - - - 8 - 2014 - - - 1 - 2015 - - - 8 - 2015 - - - 1 - 2016 - - - 8 - 2016 - - - 1 - 2017 - - - 8 - 2017 - - - 1 - 2018 - - - 8 - 2018 - - - 1 - 2019 - - - 8 - 2019 - - - 1 - 2020 - - - 8 - 2020 - - - 1 - 2021 - - - 8 - 2021 - - - 1 - 2022 - - - 8 - 2022 - - - 1 - 2023 - - - 8 - 2023 - - - 1 - 2024 - - - 8 - 2024 - - - 1 - 2025 - - - 8 - 2025 - - - 1 - 2026 - - - 8 - 2026 - - - 1 - 2027 - - - 8 - 2027 - - - 1 - 2028 - - - 8 - 2028 - - - 1 - 2029 - - - 8 - 2029 - - - 1 - 2030 - - - 8 - 2030 - - - 1 - 2031 - - - 8 - 2031 - - - 1 - 2032 - - - 8 - 2032 - - - 1 - 2033 - - - 8 - 2033 - - - 1 - 2034 - - - 8 - 2034 - - - 1 - 2035 - - - 8 - 2035 - - - 1 - 2036 - - - 8 - 2036 - - - 1 - 2037 - - - 8 - 2037 - - - 1 - 2038 - - - 8 - 2038 - - - 1 - 2039 - - - 8 - 2039 - - - 1 - 2040 - - - 8 - 2040 - - - 1 - 2041 - - - 8 - 2041 - - - 1 - 2042 - - - 8 - 2042 - - - 1 - 2043 - - - 8 - 2043 - - - 1 - 2044 - - - 5 - 2044 - - - 8 - 2044 - - - 1 - 2045 - - - 5 - 2045 - - - 8 - 2045 - - - 1 - 2046 - - - 5 - 2046 - - - 8 - 2046 - - - 1 - 2047 - - - 5 - 2047 - - - 8 - 2047 - - - 1 - 2048 - - - 5 - 2048 - - - 8 - 2048 - - - 1 - 2049 - - - 5 - 2049 - - - 8 - 2049 - - - 1 - 2050 - - - 5 - 2050 - - - 8 - 2050 - - - 1 - 2051 - - - 5 - 2051 - - - 8 - 2051 - - - 1 - 2052 - - - 5 - 2052 - - - 8 - 2052 - - - 1 - 2053 - - - 5 - 2053 - - - 8 - 2053 - - - 1 - 2054 - - - 5 - 2054 - - - 8 - 2054 - - - 1 - 2055 - - - 5 - 2055 - - - 8 - 2055 - - - 1 - 2056 - - - 5 - 2056 - - - 8 - 2056 - - - 1 - 2057 - - - 5 - 2057 - - - 8 - 2057 - - - 1 - 2058 - - - 5 - 2058 - - - 8 - 2058 - - - 1 - 2059 - - - 5 - 2059 - - - 8 - 2059 - - - 1 - 2060 - - - 5 - 2060 - - - 8 - 2060 - - - 1 - 2061 - - - 5 - 2061 - - - 8 - 2061 - - - 1 - 2062 - - - 5 - 2062 - - - 8 - 2062 - - - 1 - 2063 - - - 5 - 2063 - - - 8 - 2063 - - - 1 - 2064 - - - 5 - 2064 - - - 8 - 2064 - - - 1 - 2065 - - - 8 - 2065 - - - 1 - 2066 - - - 8 - 2066 - - - 1 - 2067 - - - 8 - 2067 - - - 1 - 2068 - - - 8 - 2068 - - - 1 - 2069 - - - 8 - 2069 - - - 1 - 2070 - - - 8 - 2070 - - - 1 - 2071 - - - 8 - 2071 - - - 1 - 2072 - - - 8 - 2072 - - - 1 - 2073 - - - 8 - 2073 - - - 1 - 2074 - - - 8 - 2074 - - - 1 - 2075 - - - 8 - 2075 - - - 1 - 2076 - - - 8 - 2076 - - - 1 - 2077 - - - 8 - 2077 - - - 1 - 2078 - - - 8 - 2078 - - - 1 - 2079 - - - 8 - 2079 - - - 1 - 2080 - - - 8 - 2080 - - - 1 - 2081 - - - 8 - 2081 - - - 1 - 2082 - - - 8 - 2082 - - - 1 - 2083 - - - 8 - 2083 - - - 1 - 2084 - - - 8 - 2084 - - - 1 - 2085 - - - 8 - 2085 - - - 1 - 2086 - - - 8 - 2086 - - - 1 - 2087 - - - 8 - 2087 - - - 1 - 2088 - - - 8 - 2088 - - - 1 - 2089 - - - 8 - 2089 - - - 1 - 2090 - - - 8 - 2090 - - - 1 - 2091 - - - 8 - 2091 - - - 1 - 2092 - - - 8 - 2092 - - - 1 - 2093 - - - 8 - 2093 - - - 1 - 2094 - - - 8 - 2094 - - - 17 - 2094 - - - 1 - 2095 - - - 8 - 2095 - - - 17 - 2095 - - - 1 - 2096 - - - 8 - 2096 - - - 17 - 2096 - - - 1 - 2097 - - - 8 - 2097 - - - 1 - 2098 - - - 8 - 2098 - - - 1 - 2099 - - - 8 - 2099 - - - 1 - 2100 - - - 8 - 2100 - - - 1 - 2101 - - - 8 - 2101 - - - 1 - 2102 - - - 8 - 2102 - - - 1 - 2103 - - - 8 - 2103 - - - 1 - 2104 - - - 8 - 2104 - - - 1 - 2105 - - - 8 - 2105 - - - 1 - 2106 - - - 8 - 2106 - - - 1 - 2107 - - - 8 - 2107 - - - 1 - 2108 - - - 8 - 2108 - - - 1 - 2109 - - - 8 - 2109 - - - 1 - 2110 - - - 8 - 2110 - - - 1 - 2111 - - - 8 - 2111 - - - 1 - 2112 - - - 8 - 2112 - - - 1 - 2113 - - - 5 - 2113 - - - 8 - 2113 - - - 1 - 2114 - - - 5 - 2114 - - - 8 - 2114 - - - 1 - 2115 - - - 5 - 2115 - - - 8 - 2115 - - - 1 - 2116 - - - 5 - 2116 - - - 8 - 2116 - - - 1 - 2117 - - - 5 - 2117 - - - 8 - 2117 - - - 1 - 2118 - - - 5 - 2118 - - - 8 - 2118 - - - 1 - 2119 - - - 5 - 2119 - - - 8 - 2119 - - - 1 - 2120 - - - 5 - 2120 - - - 8 - 2120 - - - 1 - 2121 - - - 5 - 2121 - - - 8 - 2121 - - - 1 - 2122 - - - 5 - 2122 - - - 8 - 2122 - - - 1 - 2123 - - - 5 - 2123 - - - 8 - 2123 - - - 1 - 2124 - - - 5 - 2124 - - - 8 - 2124 - - - 1 - 2125 - - - 5 - 2125 - - - 8 - 2125 - - - 1 - 2126 - - - 5 - 2126 - - - 8 - 2126 - - - 1 - 2127 - - - 5 - 2127 - - - 8 - 2127 - - - 1 - 2128 - - - 5 - 2128 - - - 8 - 2128 - - - 1 - 2129 - - - 5 - 2129 - - - 8 - 2129 - - - 1 - 2130 - - - 5 - 2130 - - - 8 - 2130 - - - 1 - 2131 - - - 5 - 2131 - - - 8 - 2131 - - - 1 - 2132 - - - 5 - 2132 - - - 8 - 2132 - - - 1 - 2133 - - - 5 - 2133 - - - 8 - 2133 - - - 1 - 2134 - - - 5 - 2134 - - - 8 - 2134 - - - 1 - 2135 - - - 5 - 2135 - - - 8 - 2135 - - - 1 - 2136 - - - 5 - 2136 - - - 8 - 2136 - - - 1 - 2137 - - - 5 - 2137 - - - 8 - 2137 - - - 1 - 2138 - - - 5 - 2138 - - - 8 - 2138 - - - 1 - 2139 - - - 8 - 2139 - - - 1 - 2140 - - - 8 - 2140 - - - 1 - 2141 - - - 8 - 2141 - - - 1 - 2142 - - - 8 - 2142 - - - 1 - 2143 - - - 8 - 2143 - - - 1 - 2144 - - - 8 - 2144 - - - 1 - 2145 - - - 8 - 2145 - - - 1 - 2146 - - - 8 - 2146 - - - 1 - 2147 - - - 8 - 2147 - - - 1 - 2148 - - - 8 - 2148 - - - 1 - 2149 - - - 5 - 2149 - - - 8 - 2149 - - - 1 - 2150 - - - 5 - 2150 - - - 8 - 2150 - - - 1 - 2151 - - - 5 - 2151 - - - 8 - 2151 - - - 1 - 2152 - - - 5 - 2152 - - - 8 - 2152 - - - 1 - 2153 - - - 5 - 2153 - - - 8 - 2153 - - - 1 - 2154 - - - 5 - 2154 - - - 8 - 2154 - - - 1 - 2155 - - - 5 - 2155 - - - 8 - 2155 - - - 1 - 2156 - - - 5 - 2156 - - - 8 - 2156 - - - 1 - 2157 - - - 5 - 2157 - - - 8 - 2157 - - - 1 - 2158 - - - 5 - 2158 - - - 8 - 2158 - - - 1 - 2159 - - - 5 - 2159 - - - 8 - 2159 - - - 1 - 2160 - - - 5 - 2160 - - - 8 - 2160 - - - 1 - 2161 - - - 5 - 2161 - - - 8 - 2161 - - - 1 - 2162 - - - 5 - 2162 - - - 8 - 2162 - - - 1 - 2163 - - - 5 - 2163 - - - 8 - 2163 - - - 1 - 2164 - - - 5 - 2164 - - - 8 - 2164 - - - 1 - 2165 - - - 8 - 2165 - - - 1 - 2166 - - - 8 - 2166 - - - 1 - 2167 - - - 8 - 2167 - - - 1 - 2168 - - - 8 - 2168 - - - 1 - 2169 - - - 8 - 2169 - - - 1 - 2170 - - - 8 - 2170 - - - 1 - 2171 - - - 8 - 2171 - - - 1 - 2172 - - - 8 - 2172 - - - 1 - 2173 - - - 8 - 2173 - - - 1 - 2174 - - - 8 - 2174 - - - 1 - 2175 - - - 8 - 2175 - - - 1 - 2176 - - - 8 - 2176 - - - 1 - 2177 - - - 8 - 2177 - - - 1 - 2178 - - - 8 - 2178 - - - 1 - 2179 - - - 8 - 2179 - - - 1 - 2180 - - - 8 - 2180 - - - 1 - 2181 - - - 8 - 2181 - - - 1 - 2182 - - - 8 - 2182 - - - 1 - 2183 - - - 8 - 2183 - - - 1 - 2184 - - - 8 - 2184 - - - 1 - 2185 - - - 8 - 2185 - - - 1 - 2186 - - - 8 - 2186 - - - 1 - 2187 - - - 8 - 2187 - - - 1 - 2188 - - - 8 - 2188 - - - 1 - 2189 - - - 8 - 2189 - - - 1 - 2190 - - - 8 - 2190 - - - 1 - 2191 - - - 8 - 2191 - - - 1 - 2192 - - - 8 - 2192 - - - 1 - 2193 - - - 5 - 2193 - - - 8 - 2193 - - - 1 - 2194 - - - 5 - 2194 - - - 8 - 2194 - - - 16 - 2194 - - - 1 - 2195 - - - 5 - 2195 - - - 8 - 2195 - - - 16 - 2195 - - - 1 - 2196 - - - 5 - 2196 - - - 8 - 2196 - - - 1 - 2197 - - - 5 - 2197 - - - 8 - 2197 - - - 1 - 2198 - - - 5 - 2198 - - - 8 - 2198 - - - 16 - 2198 - - - 1 - 2199 - - - 5 - 2199 - - - 8 - 2199 - - - 1 - 2200 - - - 5 - 2200 - - - 8 - 2200 - - - 1 - 2201 - - - 5 - 2201 - - - 8 - 2201 - - - 1 - 2202 - - - 5 - 2202 - - - 8 - 2202 - - - 1 - 2203 - - - 5 - 2203 - - - 8 - 2203 - - - 1 - 2204 - - - 5 - 2204 - - - 8 - 2204 - - - 1 - 2205 - - - 5 - 2205 - - - 8 - 2205 - - - 1 - 2206 - - - 5 - 2206 - - - 8 - 2206 - - - 16 - 2206 - - - 1 - 2207 - - - 5 - 2207 - - - 8 - 2207 - - - 1 - 2208 - - - 5 - 2208 - - - 8 - 2208 - - - 1 - 2209 - - - 5 - 2209 - - - 8 - 2209 - - - 1 - 2210 - - - 5 - 2210 - - - 8 - 2210 - - - 1 - 2211 - - - 5 - 2211 - - - 8 - 2211 - - - 1 - 2212 - - - 5 - 2212 - - - 8 - 2212 - - - 1 - 2213 - - - 5 - 2213 - - - 8 - 2213 - - - 1 - 2214 - - - 5 - 2214 - - - 8 - 2214 - - - 1 - 2215 - - - 5 - 2215 - - - 8 - 2215 - - - 1 - 2216 - - - 8 - 2216 - - - 1 - 2217 - - - 8 - 2217 - - - 1 - 2218 - - - 8 - 2218 - - - 1 - 2219 - - - 8 - 2219 - - - 1 - 2220 - - - 8 - 2220 - - - 1 - 2221 - - - 8 - 2221 - - - 1 - 2222 - - - 8 - 2222 - - - 1 - 2223 - - - 8 - 2223 - - - 1 - 2224 - - - 8 - 2224 - - - 1 - 2225 - - - 8 - 2225 - - - 1 - 2226 - - - 8 - 2226 - - - 1 - 2227 - - - 8 - 2227 - - - 1 - 2228 - - - 8 - 2228 - - - 1 - 2229 - - - 8 - 2229 - - - 1 - 2230 - - - 8 - 2230 - - - 1 - 2231 - - - 8 - 2231 - - - 1 - 2232 - - - 8 - 2232 - - - 1 - 2233 - - - 8 - 2233 - - - 1 - 2234 - - - 8 - 2234 - - - 1 - 2235 - - - 8 - 2235 - - - 1 - 2236 - - - 8 - 2236 - - - 1 - 2237 - - - 8 - 2237 - - - 1 - 2238 - - - 5 - 2238 - - - 8 - 2238 - - - 1 - 2239 - - - 5 - 2239 - - - 8 - 2239 - - - 1 - 2240 - - - 5 - 2240 - - - 8 - 2240 - - - 1 - 2241 - - - 5 - 2241 - - - 8 - 2241 - - - 1 - 2242 - - - 5 - 2242 - - - 8 - 2242 - - - 1 - 2243 - - - 5 - 2243 - - - 8 - 2243 - - - 1 - 2244 - - - 5 - 2244 - - - 8 - 2244 - - - 1 - 2245 - - - 5 - 2245 - - - 8 - 2245 - - - 1 - 2246 - - - 5 - 2246 - - - 8 - 2246 - - - 1 - 2247 - - - 5 - 2247 - - - 8 - 2247 - - - 1 - 2248 - - - 5 - 2248 - - - 8 - 2248 - - - 1 - 2249 - - - 5 - 2249 - - - 8 - 2249 - - - 1 - 2250 - - - 5 - 2250 - - - 8 - 2250 - - - 1 - 2251 - - - 5 - 2251 - - - 8 - 2251 - - - 1 - 2252 - - - 5 - 2252 - - - 8 - 2252 - - - 1 - 2253 - - - 5 - 2253 - - - 8 - 2253 - - - 1 - 2254 - - - 8 - 2254 - - - 1 - 2255 - - - 8 - 2255 - - - 1 - 2256 - - - 8 - 2256 - - - 1 - 2257 - - - 8 - 2257 - - - 1 - 2258 - - - 8 - 2258 - - - 1 - 2259 - - - 8 - 2259 - - - 1 - 2260 - - - 8 - 2260 - - - 1 - 2261 - - - 8 - 2261 - - - 1 - 2262 - - - 8 - 2262 - - - 1 - 2263 - - - 8 - 2263 - - - 1 - 2264 - - - 8 - 2264 - - - 1 - 2265 - - - 8 - 2265 - - - 1 - 2266 - - - 8 - 2266 - - - 1 - 2267 - - - 8 - 2267 - - - 1 - 2268 - - - 8 - 2268 - - - 1 - 2269 - - - 8 - 2269 - - - 1 - 2270 - - - 8 - 2270 - - - 1 - 2271 - - - 8 - 2271 - - - 1 - 2272 - - - 8 - 2272 - - - 1 - 2273 - - - 8 - 2273 - - - 1 - 2274 - - - 8 - 2274 - - - 1 - 2275 - - - 8 - 2275 - - - 1 - 2276 - - - 8 - 2276 - - - 1 - 2277 - - - 8 - 2277 - - - 1 - 2278 - - - 8 - 2278 - - - 1 - 2279 - - - 8 - 2279 - - - 1 - 2280 - - - 8 - 2280 - - - 1 - 2281 - - - 8 - 2281 - - - 1 - 2282 - - - 5 - 2282 - - - 8 - 2282 - - - 1 - 2283 - - - 5 - 2283 - - - 8 - 2283 - - - 1 - 2284 - - - 5 - 2284 - - - 8 - 2284 - - - 1 - 2285 - - - 8 - 2285 - - - 1 - 2286 - - - 8 - 2286 - - - 1 - 2287 - - - 8 - 2287 - - - 1 - 2288 - - - 8 - 2288 - - - 1 - 2289 - - - 8 - 2289 - - - 1 - 2290 - - - 8 - 2290 - - - 1 - 2291 - - - 8 - 2291 - - - 1 - 2292 - - - 8 - 2292 - - - 1 - 2293 - - - 8 - 2293 - - - 1 - 2294 - - - 8 - 2294 - - - 1 - 2295 - - - 8 - 2295 - - - 1 - 2296 - - - 5 - 2296 - - - 8 - 2296 - - - 1 - 2297 - - - 5 - 2297 - - - 8 - 2297 - - - 1 - 2298 - - - 5 - 2298 - - - 8 - 2298 - - - 1 - 2299 - - - 5 - 2299 - - - 8 - 2299 - - - 1 - 2300 - - - 5 - 2300 - - - 8 - 2300 - - - 1 - 2301 - - - 5 - 2301 - - - 8 - 2301 - - - 1 - 2302 - - - 5 - 2302 - - - 8 - 2302 - - - 1 - 2303 - - - 5 - 2303 - - - 8 - 2303 - - - 1 - 2304 - - - 5 - 2304 - - - 8 - 2304 - - - 1 - 2305 - - - 5 - 2305 - - - 8 - 2305 - - - 1 - 2306 - - - 5 - 2306 - - - 8 - 2306 - - - 1 - 2307 - - - 5 - 2307 - - - 8 - 2307 - - - 1 - 2308 - - - 5 - 2308 - - - 8 - 2308 - - - 1 - 2309 - - - 5 - 2309 - - - 8 - 2309 - - - 1 - 2310 - - - 5 - 2310 - - - 8 - 2310 - - - 1 - 2311 - - - 5 - 2311 - - - 8 - 2311 - - - 1 - 2312 - - - 5 - 2312 - - - 8 - 2312 - - - 1 - 2313 - - - 5 - 2313 - - - 8 - 2313 - - - 1 - 2314 - - - 5 - 2314 - - - 8 - 2314 - - - 1 - 2315 - - - 5 - 2315 - - - 8 - 2315 - - - 1 - 2316 - - - 5 - 2316 - - - 8 - 2316 - - - 1 - 2317 - - - 5 - 2317 - - - 8 - 2317 - - - 1 - 2318 - - - 8 - 2318 - - - 1 - 2319 - - - 8 - 2319 - - - 1 - 2320 - - - 8 - 2320 - - - 1 - 2321 - - - 8 - 2321 - - - 1 - 2322 - - - 8 - 2322 - - - 1 - 2323 - - - 8 - 2323 - - - 1 - 2324 - - - 8 - 2324 - - - 1 - 2325 - - - 8 - 2325 - - - 1 - 2326 - - - 8 - 2326 - - - 1 - 2327 - - - 8 - 2327 - - - 1 - 2328 - - - 8 - 2328 - - - 1 - 2329 - - - 8 - 2329 - - - 1 - 2330 - - - 8 - 2330 - - - 1 - 2331 - - - 8 - 2331 - - - 1 - 2332 - - - 8 - 2332 - - - 1 - 2333 - - - 8 - 2333 - - - 1 - 2334 - - - 5 - 2334 - - - 8 - 2334 - - - 1 - 2335 - - - 5 - 2335 - - - 8 - 2335 - - - 1 - 2336 - - - 5 - 2336 - - - 8 - 2336 - - - 1 - 2337 - - - 5 - 2337 - - - 8 - 2337 - - - 1 - 2338 - - - 5 - 2338 - - - 8 - 2338 - - - 1 - 2339 - - - 5 - 2339 - - - 8 - 2339 - - - 1 - 2340 - - - 5 - 2340 - - - 8 - 2340 - - - 1 - 2341 - - - 5 - 2341 - - - 8 - 2341 - - - 1 - 2342 - - - 5 - 2342 - - - 8 - 2342 - - - 1 - 2343 - - - 5 - 2343 - - - 8 - 2343 - - - 1 - 2344 - - - 8 - 2344 - - - 1 - 2345 - - - 8 - 2345 - - - 1 - 2346 - - - 8 - 2346 - - - 1 - 2347 - - - 8 - 2347 - - - 1 - 2348 - - - 8 - 2348 - - - 1 - 2349 - - - 8 - 2349 - - - 1 - 2350 - - - 8 - 2350 - - - 1 - 2351 - - - 8 - 2351 - - - 1 - 2352 - - - 8 - 2352 - - - 1 - 2353 - - - 8 - 2353 - - - 1 - 2354 - - - 8 - 2354 - - - 1 - 2355 - - - 8 - 2355 - - - 1 - 2356 - - - 8 - 2356 - - - 1 - 2357 - - - 8 - 2357 - - - 1 - 2358 - - - 5 - 2358 - - - 8 - 2358 - - - 1 - 2359 - - - 5 - 2359 - - - 8 - 2359 - - - 1 - 2360 - - - 5 - 2360 - - - 8 - 2360 - - - 1 - 2361 - - - 5 - 2361 - - - 8 - 2361 - - - 1 - 2362 - - - 5 - 2362 - - - 8 - 2362 - - - 1 - 2363 - - - 5 - 2363 - - - 8 - 2363 - - - 1 - 2364 - - - 5 - 2364 - - - 8 - 2364 - - - 1 - 2365 - - - 5 - 2365 - - - 8 - 2365 - - - 1 - 2366 - - - 5 - 2366 - - - 8 - 2366 - - - 1 - 2367 - - - 5 - 2367 - - - 8 - 2367 - - - 1 - 2368 - - - 5 - 2368 - - - 8 - 2368 - - - 1 - 2369 - - - 5 - 2369 - - - 8 - 2369 - - - 1 - 2370 - - - 5 - 2370 - - - 8 - 2370 - - - 1 - 2371 - - - 5 - 2371 - - - 8 - 2371 - - - 1 - 2372 - - - 5 - 2372 - - - 8 - 2372 - - - 1 - 2373 - - - 5 - 2373 - - - 8 - 2373 - - - 1 - 2374 - - - 5 - 2374 - - - 8 - 2374 - - - 1 - 2375 - - - 8 - 2375 - - - 1 - 2376 - - - 8 - 2376 - - - 1 - 2377 - - - 8 - 2377 - - - 1 - 2378 - - - 8 - 2378 - - - 1 - 2379 - - - 8 - 2379 - - - 1 - 2380 - - - 8 - 2380 - - - 1 - 2381 - - - 8 - 2381 - - - 1 - 2382 - - - 8 - 2382 - - - 1 - 2383 - - - 8 - 2383 - - - 1 - 2384 - - - 8 - 2384 - - - 1 - 2385 - - - 8 - 2385 - - - 1 - 2386 - - - 8 - 2386 - - - 1 - 2387 - - - 8 - 2387 - - - 1 - 2388 - - - 8 - 2388 - - - 1 - 2389 - - - 8 - 2389 - - - 1 - 2390 - - - 8 - 2390 - - - 1 - 2391 - - - 5 - 2391 - - - 8 - 2391 - - - 1 - 2392 - - - 5 - 2392 - - - 8 - 2392 - - - 1 - 2393 - - - 5 - 2393 - - - 8 - 2393 - - - 1 - 2394 - - - 5 - 2394 - - - 8 - 2394 - - - 1 - 2395 - - - 5 - 2395 - - - 8 - 2395 - - - 1 - 2396 - - - 5 - 2396 - - - 8 - 2396 - - - 1 - 2397 - - - 5 - 2397 - - - 8 - 2397 - - - 1 - 2398 - - - 5 - 2398 - - - 8 - 2398 - - - 1 - 2399 - - - 5 - 2399 - - - 8 - 2399 - - - 1 - 2400 - - - 5 - 2400 - - - 8 - 2400 - - - 1 - 2401 - - - 5 - 2401 - - - 8 - 2401 - - - 1 - 2402 - - - 5 - 2402 - - - 8 - 2402 - - - 1 - 2403 - - - 5 - 2403 - - - 8 - 2403 - - - 1 - 2404 - - - 5 - 2404 - - - 8 - 2404 - - - 1 - 2405 - - - 5 - 2405 - - - 8 - 2405 - - - 1 - 2406 - - - 5 - 2406 - - - 8 - 2406 - - - 1 - 2407 - - - 5 - 2407 - - - 8 - 2407 - - - 1 - 2408 - - - 5 - 2408 - - - 8 - 2408 - - - 1 - 2409 - - - 5 - 2409 - - - 8 - 2409 - - - 1 - 2410 - - - 5 - 2410 - - - 8 - 2410 - - - 1 - 2411 - - - 5 - 2411 - - - 8 - 2411 - - - 1 - 2412 - - - 5 - 2412 - - - 8 - 2412 - - - 1 - 2413 - - - 5 - 2413 - - - 8 - 2413 - - - 1 - 2414 - - - 5 - 2414 - - - 8 - 2414 - - - 1 - 2415 - - - 5 - 2415 - - - 8 - 2415 - - - 1 - 2416 - - - 5 - 2416 - - - 8 - 2416 - - - 1 - 2417 - - - 5 - 2417 - - - 8 - 2417 - - - 1 - 2418 - - - 5 - 2418 - - - 8 - 2418 - - - 1 - 2419 - - - 5 - 2419 - - - 8 - 2419 - - - 1 - 2420 - - - 5 - 2420 - - - 8 - 2420 - - - 1 - 2421 - - - 5 - 2421 - - - 8 - 2421 - - - 1 - 2422 - - - 5 - 2422 - - - 8 - 2422 - - - 1 - 2423 - - - 5 - 2423 - - - 8 - 2423 - - - 1 - 2424 - - - 5 - 2424 - - - 8 - 2424 - - - 1 - 2425 - - - 5 - 2425 - - - 8 - 2425 - - - 1 - 2426 - - - 5 - 2426 - - - 8 - 2426 - - - 1 - 2427 - - - 5 - 2427 - - - 8 - 2427 - - - 1 - 2428 - - - 8 - 2428 - - - 1 - 2429 - - - 8 - 2429 - - - 1 - 2430 - - - 8 - 2430 - - - 1 - 2431 - - - 8 - 2431 - - - 1 - 2432 - - - 8 - 2432 - - - 1 - 2433 - - - 8 - 2433 - - - 1 - 2434 - - - 5 - 2434 - - - 8 - 2434 - - - 1 - 2435 - - - 5 - 2435 - - - 8 - 2435 - - - 1 - 2436 - - - 5 - 2436 - - - 8 - 2436 - - - 1 - 2437 - - - 5 - 2437 - - - 8 - 2437 - - - 1 - 2438 - - - 5 - 2438 - - - 8 - 2438 - - - 1 - 2439 - - - 5 - 2439 - - - 8 - 2439 - - - 1 - 2440 - - - 5 - 2440 - - - 8 - 2440 - - - 1 - 2441 - - - 5 - 2441 - - - 8 - 2441 - - - 1 - 2442 - - - 5 - 2442 - - - 8 - 2442 - - - 1 - 2443 - - - 5 - 2443 - - - 8 - 2443 - - - 1 - 2444 - - - 5 - 2444 - - - 8 - 2444 - - - 1 - 2445 - - - 5 - 2445 - - - 8 - 2445 - - - 1 - 2446 - - - 5 - 2446 - - - 8 - 2446 - - - 1 - 2447 - - - 5 - 2447 - - - 8 - 2447 - - - 1 - 2448 - - - 5 - 2448 - - - 8 - 2448 - - - 1 - 2449 - - - 8 - 2449 - - - 1 - 2450 - - - 8 - 2450 - - - 1 - 2451 - - - 8 - 2451 - - - 1 - 2452 - - - 8 - 2452 - - - 1 - 2453 - - - 8 - 2453 - - - 1 - 2454 - - - 8 - 2454 - - - 1 - 2455 - - - 8 - 2455 - - - 1 - 2456 - - - 8 - 2456 - - - 1 - 2457 - - - 8 - 2457 - - - 1 - 2458 - - - 8 - 2458 - - - 1 - 2459 - - - 8 - 2459 - - - 1 - 2460 - - - 8 - 2460 - - - 1 - 2461 - - - 5 - 2461 - - - 8 - 2461 - - - 1 - 2462 - - - 5 - 2462 - - - 8 - 2462 - - - 1 - 2463 - - - 5 - 2463 - - - 8 - 2463 - - - 1 - 2464 - - - 5 - 2464 - - - 8 - 2464 - - - 1 - 2465 - - - 5 - 2465 - - - 8 - 2465 - - - 1 - 2466 - - - 5 - 2466 - - - 8 - 2466 - - - 1 - 2467 - - - 5 - 2467 - - - 8 - 2467 - - - 1 - 2468 - - - 5 - 2468 - - - 8 - 2468 - - - 1 - 2469 - - - 5 - 2469 - - - 8 - 2469 - - - 1 - 2470 - - - 5 - 2470 - - - 8 - 2470 - - - 1 - 2471 - - - 5 - 2471 - - - 8 - 2471 - - - 1 - 2472 - - - 8 - 2472 - - - 1 - 2473 - - - 8 - 2473 - - - 1 - 2474 - - - 8 - 2474 - - - 1 - 2475 - - - 8 - 2475 - - - 1 - 2476 - - - 5 - 2476 - - - 8 - 2476 - - - 1 - 2477 - - - 8 - 2477 - - - 1 - 2478 - - - 5 - 2478 - - - 8 - 2478 - - - 1 - 2479 - - - 8 - 2479 - - - 1 - 2480 - - - 8 - 2480 - - - 1 - 2481 - - - 8 - 2481 - - - 1 - 2482 - - - 8 - 2482 - - - 1 - 2483 - - - 8 - 2483 - - - 1 - 2484 - - - 5 - 2484 - - - 8 - 2484 - - - 1 - 2485 - - - 8 - 2485 - - - 1 - 2486 - - - 8 - 2486 - - - 1 - 2487 - - - 8 - 2487 - - - 1 - 2488 - - - 5 - 2488 - - - 8 - 2488 - - - 1 - 2489 - - - 5 - 2489 - - - 8 - 2489 - - - 1 - 2490 - - - 5 - 2490 - - - 8 - 2490 - - - 1 - 2491 - - - 5 - 2491 - - - 8 - 2491 - - - 1 - 2492 - - - 5 - 2492 - - - 8 - 2492 - - - 1 - 2493 - - - 5 - 2493 - - - 8 - 2493 - - - 1 - 2494 - - - 5 - 2494 - - - 8 - 2494 - - - 1 - 2495 - - - 5 - 2495 - - - 8 - 2495 - - - 1 - 2496 - - - 5 - 2496 - - - 8 - 2496 - - - 1 - 2497 - - - 5 - 2497 - - - 8 - 2497 - - - 1 - 2498 - - - 5 - 2498 - - - 8 - 2498 - - - 1 - 2499 - - - 5 - 2499 - - - 8 - 2499 - - - 1 - 2500 - - - 5 - 2500 - - - 8 - 2500 - - - 1 - 2501 - - - 5 - 2501 - - - 8 - 2501 - - - 1 - 2502 - - - 8 - 2502 - - - 1 - 2503 - - - 8 - 2503 - - - 1 - 2504 - - - 8 - 2504 - - - 1 - 2505 - - - 8 - 2505 - - - 1 - 2506 - - - 5 - 2506 - - - 8 - 2506 - - - 1 - 2507 - - - 8 - 2507 - - - 1 - 2508 - - - 8 - 2508 - - - 1 - 2509 - - - 8 - 2509 - - - 1 - 2510 - - - 8 - 2510 - - - 1 - 2511 - - - 5 - 2511 - - - 8 - 2511 - - - 1 - 2512 - - - 5 - 2512 - - - 8 - 2512 - - - 16 - 2512 - - - 1 - 2513 - - - 5 - 2513 - - - 8 - 2513 - - - 1 - 2514 - - - 5 - 2514 - - - 8 - 2514 - - - 1 - 2515 - - - 5 - 2515 - - - 8 - 2515 - - - 1 - 2516 - - - 5 - 2516 - - - 8 - 2516 - - - 16 - 2516 - - - 1 - 2517 - - - 5 - 2517 - - - 8 - 2517 - - - 1 - 2518 - - - 5 - 2518 - - - 8 - 2518 - - - 1 - 2519 - - - 5 - 2519 - - - 8 - 2519 - - - 1 - 2520 - - - 5 - 2520 - - - 8 - 2520 - - - 1 - 2521 - - - 5 - 2521 - - - 8 - 2521 - - - 1 - 2522 - - - 5 - 2522 - - - 8 - 2522 - - - 1 - 2523 - - - 8 - 2523 - - - 1 - 2524 - - - 8 - 2524 - - - 1 - 2525 - - - 8 - 2525 - - - 1 - 2526 - - - 8 - 2526 - - - 1 - 2527 - - - 8 - 2527 - - - 1 - 2528 - - - 8 - 2528 - - - 1 - 2529 - - - 8 - 2529 - - - 1 - 2530 - - - 8 - 2530 - - - 1 - 2531 - - - 8 - 2531 - - - 1 - 2532 - - - 8 - 2532 - - - 1 - 2533 - - - 8 - 2533 - - - 1 - 2534 - - - 8 - 2534 - - - 1 - 2535 - - - 8 - 2535 - - - 1 - 2536 - - - 8 - 2536 - - - 1 - 2537 - - - 8 - 2537 - - - 1 - 2538 - - - 8 - 2538 - - - 1 - 2539 - - - 8 - 2539 - - - 1 - 2540 - - - 8 - 2540 - - - 1 - 2541 - - - 8 - 2541 - - - 1 - 2542 - - - 5 - 2542 - - - 8 - 2542 - - - 1 - 2543 - - - 5 - 2543 - - - 8 - 2543 - - - 1 - 2544 - - - 5 - 2544 - - - 8 - 2544 - - - 1 - 2545 - - - 5 - 2545 - - - 8 - 2545 - - - 1 - 2546 - - - 5 - 2546 - - - 8 - 2546 - - - 1 - 2547 - - - 5 - 2547 - - - 8 - 2547 - - - 1 - 2548 - - - 5 - 2548 - - - 8 - 2548 - - - 1 - 2549 - - - 5 - 2549 - - - 8 - 2549 - - - 1 - 2550 - - - 5 - 2550 - - - 8 - 2550 - - - 16 - 2550 - - - 1 - 2551 - - - 5 - 2551 - - - 8 - 2551 - - - 1 - 2552 - - - 5 - 2552 - - - 8 - 2552 - - - 1 - 2553 - - - 5 - 2553 - - - 8 - 2553 - - - 1 - 2554 - - - 8 - 2554 - - - 1 - 2555 - - - 8 - 2555 - - - 1 - 2556 - - - 8 - 2556 - - - 1 - 2557 - - - 8 - 2557 - - - 1 - 2558 - - - 8 - 2558 - - - 1 - 2559 - - - 8 - 2559 - - - 1 - 2560 - - - 8 - 2560 - - - 1 - 2561 - - - 8 - 2561 - - - 1 - 2562 - - - 8 - 2562 - - - 1 - 2563 - - - 8 - 2563 - - - 1 - 2564 - - - 8 - 2564 - - - 1 - 2565 - - - 5 - 2565 - - - 8 - 2565 - - - 1 - 2566 - - - 5 - 2566 - - - 8 - 2566 - - - 1 - 2567 - - - 5 - 2567 - - - 8 - 2567 - - - 1 - 2568 - - - 5 - 2568 - - - 8 - 2568 - - - 1 - 2569 - - - 5 - 2569 - - - 8 - 2569 - - - 1 - 2570 - - - 5 - 2570 - - - 8 - 2570 - - - 1 - 2571 - - - 5 - 2571 - - - 8 - 2571 - - - 1 - 2572 - - - 8 - 2572 - - - 1 - 2573 - - - 8 - 2573 - - - 1 - 2574 - - - 8 - 2574 - - - 1 - 2575 - - - 8 - 2575 - - - 1 - 2576 - - - 8 - 2576 - - - 1 - 2577 - - - 8 - 2577 - - - 1 - 2578 - - - 8 - 2578 - - - 1 - 2579 - - - 8 - 2579 - - - 1 - 2580 - - - 8 - 2580 - - - 1 - 2581 - - - 8 - 2581 - - - 1 - 2582 - - - 8 - 2582 - - - 1 - 2583 - - - 8 - 2583 - - - 1 - 2584 - - - 8 - 2584 - - - 1 - 2585 - - - 8 - 2585 - - - 1 - 2586 - - - 8 - 2586 - - - 1 - 2587 - - - 8 - 2587 - - - 1 - 2588 - - - 8 - 2588 - - - 1 - 2589 - - - 8 - 2589 - - - 1 - 2590 - - - 8 - 2590 - - - 1 - 2591 - - - 5 - 2591 - - - 8 - 2591 - - - 1 - 2592 - - - 5 - 2592 - - - 8 - 2592 - - - 1 - 2593 - - - 5 - 2593 - - - 8 - 2593 - - - 1 - 2594 - - - 5 - 2594 - - - 8 - 2594 - - - 1 - 2595 - - - 5 - 2595 - - - 8 - 2595 - - - 1 - 2596 - - - 5 - 2596 - - - 8 - 2596 - - - 1 - 2597 - - - 5 - 2597 - - - 8 - 2597 - - - 1 - 2598 - - - 5 - 2598 - - - 8 - 2598 - - - 1 - 2599 - - - 5 - 2599 - - - 8 - 2599 - - - 1 - 2600 - - - 5 - 2600 - - - 8 - 2600 - - - 1 - 2601 - - - 5 - 2601 - - - 8 - 2601 - - - 1 - 2602 - - - 5 - 2602 - - - 8 - 2602 - - - 1 - 2603 - - - 5 - 2603 - - - 8 - 2603 - - - 1 - 2604 - - - 5 - 2604 - - - 8 - 2604 - - - 1 - 2605 - - - 5 - 2605 - - - 8 - 2605 - - - 1 - 2606 - - - 5 - 2606 - - - 8 - 2606 - - - 1 - 2607 - - - 5 - 2607 - - - 8 - 2607 - - - 1 - 2608 - - - 5 - 2608 - - - 8 - 2608 - - - 1 - 2609 - - - 8 - 2609 - - - 1 - 2610 - - - 8 - 2610 - - - 1 - 2611 - - - 8 - 2611 - - - 1 - 2612 - - - 8 - 2612 - - - 1 - 2613 - - - 8 - 2613 - - - 1 - 2614 - - - 8 - 2614 - - - 1 - 2615 - - - 8 - 2615 - - - 1 - 2616 - - - 8 - 2616 - - - 1 - 2617 - - - 8 - 2617 - - - 1 - 2618 - - - 8 - 2618 - - - 1 - 2619 - - - 8 - 2619 - - - 1 - 2620 - - - 8 - 2620 - - - 1 - 2621 - - - 8 - 2621 - - - 1 - 2622 - - - 8 - 2622 - - - 1 - 2623 - - - 8 - 2623 - - - 1 - 2624 - - - 8 - 2624 - - - 1 - 2625 - - - 5 - 2625 - - - 8 - 2625 - - - 1 - 2626 - - - 8 - 2626 - - - 1 - 2627 - - - 5 - 2627 - - - 8 - 2627 - - - 1 - 2628 - - - 8 - 2628 - - - 1 - 2629 - - - 8 - 2629 - - - 1 - 2630 - - - 8 - 2630 - - - 1 - 2631 - - - 5 - 2631 - - - 8 - 2631 - - - 1 - 2632 - - - 8 - 2632 - - - 1 - 2633 - - - 8 - 2633 - - - 1 - 2634 - - - 8 - 2634 - - - 1 - 2635 - - - 8 - 2635 - - - 1 - 2636 - - - 8 - 2636 - - - 1 - 2637 - - - 8 - 2637 - - - 1 - 2638 - - - 5 - 2638 - - - 8 - 2638 - - - 1 - 2639 - - - 8 - 2639 - - - 1 - 2640 - - - 8 - 2640 - - - 1 - 2641 - - - 8 - 2641 - - - 1 - 2642 - - - 8 - 2642 - - - 1 - 2643 - - - 8 - 2643 - - - 1 - 2644 - - - 8 - 2644 - - - 1 - 2645 - - - 8 - 2645 - - - 1 - 2646 - - - 8 - 2646 - - - 1 - 2647 - - - 8 - 2647 - - - 1 - 2648 - - - 8 - 2648 - - - 1 - 2649 - - - 8 - 2649 - - - 1 - 2650 - - - 5 - 2650 - - - 8 - 2650 - - - 1 - 2651 - - - 5 - 2651 - - - 8 - 2651 - - - 1 - 2652 - - - 5 - 2652 - - - 8 - 2652 - - - 1 - 2653 - - - 5 - 2653 - - - 8 - 2653 - - - 1 - 2654 - - - 5 - 2654 - - - 8 - 2654 - - - 1 - 2655 - - - 5 - 2655 - - - 8 - 2655 - - - 1 - 2656 - - - 5 - 2656 - - - 8 - 2656 - - - 1 - 2657 - - - 5 - 2657 - - - 8 - 2657 - - - 1 - 2658 - - - 5 - 2658 - - - 8 - 2658 - - - 1 - 2659 - - - 5 - 2659 - - - 8 - 2659 - - - 1 - 2660 - - - 5 - 2660 - - - 8 - 2660 - - - 1 - 2661 - - - 5 - 2661 - - - 8 - 2661 - - - 1 - 2662 - - - 5 - 2662 - - - 8 - 2662 - - - 1 - 2663 - - - 5 - 2663 - - - 8 - 2663 - - - 1 - 2664 - - - 8 - 2664 - - - 1 - 2665 - - - 8 - 2665 - - - 1 - 2666 - - - 8 - 2666 - - - 1 - 2667 - - - 8 - 2667 - - - 1 - 2668 - - - 8 - 2668 - - - 1 - 2669 - - - 8 - 2669 - - - 1 - 2670 - - - 8 - 2670 - - - 1 - 2671 - - - 8 - 2671 - - - 1 - 2672 - - - 8 - 2672 - - - 1 - 2673 - - - 8 - 2673 - - - 1 - 2674 - - - 8 - 2674 - - - 1 - 2675 - - - 8 - 2675 - - - 1 - 2676 - - - 5 - 2676 - - - 8 - 2676 - - - 1 - 2677 - - - 5 - 2677 - - - 8 - 2677 - - - 1 - 2678 - - - 5 - 2678 - - - 8 - 2678 - - - 1 - 2679 - - - 5 - 2679 - - - 8 - 2679 - - - 1 - 2680 - - - 5 - 2680 - - - 8 - 2680 - - - 1 - 2681 - - - 5 - 2681 - - - 8 - 2681 - - - 1 - 2682 - - - 5 - 2682 - - - 8 - 2682 - - - 1 - 2683 - - - 5 - 2683 - - - 8 - 2683 - - - 1 - 2684 - - - 5 - 2684 - - - 8 - 2684 - - - 1 - 2685 - - - 5 - 2685 - - - 8 - 2685 - - - 1 - 2686 - - - 5 - 2686 - - - 8 - 2686 - - - 1 - 2687 - - - 5 - 2687 - - - 8 - 2687 - - - 1 - 2688 - - - 5 - 2688 - - - 8 - 2688 - - - 1 - 2689 - - - 5 - 2689 - - - 8 - 2689 - - - 1 - 2690 - - - 5 - 2690 - - - 8 - 2690 - - - 1 - 2691 - - - 5 - 2691 - - - 8 - 2691 - - - 1 - 2692 - - - 5 - 2692 - - - 8 - 2692 - - - 1 - 2693 - - - 5 - 2693 - - - 8 - 2693 - - - 1 - 2694 - - - 5 - 2694 - - - 8 - 2694 - - - 1 - 2695 - - - 5 - 2695 - - - 8 - 2695 - - - 1 - 2696 - - - 5 - 2696 - - - 8 - 2696 - - - 1 - 2697 - - - 5 - 2697 - - - 8 - 2697 - - - 1 - 2698 - - - 5 - 2698 - - - 8 - 2698 - - - 1 - 2699 - - - 5 - 2699 - - - 8 - 2699 - - - 1 - 2700 - - - 5 - 2700 - - - 8 - 2700 - - - 1 - 2701 - - - 5 - 2701 - - - 8 - 2701 - - - 1 - 2702 - - - 5 - 2702 - - - 8 - 2702 - - - 1 - 2703 - - - 5 - 2703 - - - 8 - 2703 - - - 1 - 2704 - - - 5 - 2704 - - - 8 - 2704 - - - 1 - 2705 - - - 8 - 2705 - - - 1 - 2706 - - - 5 - 2706 - - - 8 - 2706 - - - 1 - 2707 - - - 5 - 2707 - - - 8 - 2707 - - - 1 - 2708 - - - 5 - 2708 - - - 8 - 2708 - - - 1 - 2709 - - - 5 - 2709 - - - 8 - 2709 - - - 1 - 2710 - - - 5 - 2710 - - - 8 - 2710 - - - 1 - 2711 - - - 5 - 2711 - - - 8 - 2711 - - - 1 - 2712 - - - 5 - 2712 - - - 8 - 2712 - - - 1 - 2713 - - - 5 - 2713 - - - 8 - 2713 - - - 1 - 2714 - - - 5 - 2714 - - - 8 - 2714 - - - 1 - 2715 - - - 5 - 2715 - - - 8 - 2715 - - - 1 - 2716 - - - 5 - 2716 - - - 8 - 2716 - - - 1 - 2717 - - - 5 - 2717 - - - 8 - 2717 - - - 1 - 2718 - - - 5 - 2718 - - - 8 - 2718 - - - 1 - 2719 - - - 8 - 2719 - - - 1 - 2720 - - - 5 - 2720 - - - 8 - 2720 - - - 1 - 2721 - - - 5 - 2721 - - - 8 - 2721 - - - 1 - 2722 - - - 5 - 2722 - - - 8 - 2722 - - - 1 - 2723 - - - 5 - 2723 - - - 8 - 2723 - - - 1 - 2724 - - - 5 - 2724 - - - 8 - 2724 - - - 1 - 2725 - - - 5 - 2725 - - - 8 - 2725 - - - 1 - 2726 - - - 5 - 2726 - - - 8 - 2726 - - - 1 - 2727 - - - 5 - 2727 - - - 8 - 2727 - - - 1 - 2728 - - - 5 - 2728 - - - 8 - 2728 - - - 1 - 2729 - - - 5 - 2729 - - - 8 - 2729 - - - 1 - 2730 - - - 5 - 2730 - - - 8 - 2730 - - - 1 - 2731 - - - 8 - 2731 - - - 1 - 2732 - - - 8 - 2732 - - - 1 - 2733 - - - 8 - 2733 - - - 1 - 2734 - - - 8 - 2734 - - - 1 - 2735 - - - 8 - 2735 - - - 1 - 2736 - - - 8 - 2736 - - - 1 - 2737 - - - 8 - 2737 - - - 1 - 2738 - - - 8 - 2738 - - - 1 - 2739 - - - 8 - 2739 - - - 1 - 2740 - - - 8 - 2740 - - - 1 - 2741 - - - 8 - 2741 - - - 1 - 2742 - - - 8 - 2742 - - - 1 - 2743 - - - 8 - 2743 - - - 1 - 2744 - - - 8 - 2744 - - - 1 - 2745 - - - 8 - 2745 - - - 1 - 2746 - - - 8 - 2746 - - - 1 - 2747 - - - 8 - 2747 - - - 1 - 2748 - - - 8 - 2748 - - - 1 - 2749 - - - 8 - 2749 - - - 1 - 2750 - - - 8 - 2750 - - - 1 - 2751 - - - 8 - 2751 - - - 1 - 2752 - - - 8 - 2752 - - - 11 - 2752 - - - 1 - 2753 - - - 8 - 2753 - - - 11 - 2753 - - - 1 - 2754 - - - 8 - 2754 - - - 11 - 2754 - - - 1 - 2755 - - - 8 - 2755 - - - 1 - 2756 - - - 8 - 2756 - - - 1 - 2757 - - - 8 - 2757 - - - 1 - 2758 - - - 8 - 2758 - - - 11 - 2758 - - - 1 - 2759 - - - 8 - 2759 - - - 1 - 2760 - - - 8 - 2760 - - - 1 - 2761 - - - 8 - 2761 - - - 1 - 2762 - - - 8 - 2762 - - - 1 - 2763 - - - 8 - 2763 - - - 1 - 2764 - - - 8 - 2764 - - - 1 - 2765 - - - 8 - 2765 - - - 1 - 2766 - - - 8 - 2766 - - - 1 - 2767 - - - 8 - 2767 - - - 11 - 2767 - - - 1 - 2768 - - - 8 - 2768 - - - 11 - 2768 - - - 1 - 2769 - - - 8 - 2769 - - - 11 - 2769 - - - 1 - 2770 - - - 8 - 2770 - - - 1 - 2771 - - - 8 - 2771 - - - 1 - 2772 - - - 8 - 2772 - - - 1 - 2773 - - - 8 - 2773 - - - 1 - 2774 - - - 8 - 2774 - - - 1 - 2775 - - - 8 - 2775 - - - 1 - 2776 - - - 8 - 2776 - - - 1 - 2777 - - - 8 - 2777 - - - 1 - 2778 - - - 8 - 2778 - - - 1 - 2779 - - - 8 - 2779 - - - 1 - 2780 - - - 8 - 2780 - - - 1 - 2781 - - - 5 - 2781 - - - 8 - 2781 - - - 1 - 2782 - - - 5 - 2782 - - - 8 - 2782 - - - 1 - 2783 - - - 5 - 2783 - - - 8 - 2783 - - - 1 - 2784 - - - 5 - 2784 - - - 8 - 2784 - - - 1 - 2785 - - - 5 - 2785 - - - 8 - 2785 - - - 1 - 2786 - - - 5 - 2786 - - - 8 - 2786 - - - 1 - 2787 - - - 5 - 2787 - - - 8 - 2787 - - - 1 - 2788 - - - 5 - 2788 - - - 8 - 2788 - - - 1 - 2789 - - - 5 - 2789 - - - 8 - 2789 - - - 1 - 2790 - - - 5 - 2790 - - - 8 - 2790 - - - 1 - 2791 - - - 5 - 2791 - - - 8 - 2791 - - - 1 - 2792 - - - 5 - 2792 - - - 8 - 2792 - - - 1 - 2793 - - - 5 - 2793 - - - 8 - 2793 - - - 1 - 2794 - - - 5 - 2794 - - - 8 - 2794 - - - 1 - 2795 - - - 5 - 2795 - - - 8 - 2795 - - - 1 - 2796 - - - 5 - 2796 - - - 8 - 2796 - - - 1 - 2797 - - - 5 - 2797 - - - 8 - 2797 - - - 1 - 2798 - - - 5 - 2798 - - - 8 - 2798 - - - 1 - 2799 - - - 5 - 2799 - - - 8 - 2799 - - - 1 - 2800 - - - 5 - 2800 - - - 8 - 2800 - - - 1 - 2801 - - - 5 - 2801 - - - 8 - 2801 - - - 1 - 2802 - - - 5 - 2802 - - - 8 - 2802 - - - 1 - 2803 - - - 5 - 2803 - - - 8 - 2803 - - - 1 - 2804 - - - 5 - 2804 - - - 8 - 2804 - - - 1 - 2805 - - - 5 - 2805 - - - 8 - 2805 - - - 1 - 2806 - - - 5 - 2806 - - - 8 - 2806 - - - 1 - 2807 - - - 5 - 2807 - - - 8 - 2807 - - - 1 - 2808 - - - 5 - 2808 - - - 8 - 2808 - - - 1 - 2809 - - - 5 - 2809 - - - 8 - 2809 - - - 1 - 2810 - - - 5 - 2810 - - - 8 - 2810 - - - 1 - 2811 - - - 5 - 2811 - - - 8 - 2811 - - - 1 - 2812 - - - 5 - 2812 - - - 8 - 2812 - - - 1 - 2813 - - - 5 - 2813 - - - 8 - 2813 - - - 1 - 2814 - - - 5 - 2814 - - - 8 - 2814 - - - 1 - 2815 - - - 5 - 2815 - - - 8 - 2815 - - - 1 - 2816 - - - 5 - 2816 - - - 8 - 2816 - - - 1 - 2817 - - - 5 - 2817 - - - 8 - 2817 - - - 1 - 2818 - - - 5 - 2818 - - - 8 - 2818 - - - 3 - 2819 - - - 10 - 2819 - - - 3 - 2820 - - - 10 - 2820 - - - 3 - 2821 - - - 10 - 2821 - - - 3 - 2822 - - - 10 - 2822 - - - 3 - 2823 - - - 10 - 2823 - - - 3 - 2824 - - - 10 - 2824 - - - 3 - 2825 - - - 10 - 2825 - - - 3 - 2826 - - - 10 - 2826 - - - 3 - 2827 - - - 10 - 2827 - - - 3 - 2828 - - - 10 - 2828 - - - 3 - 2829 - - - 10 - 2829 - - - 3 - 2830 - - - 10 - 2830 - - - 3 - 2831 - - - 10 - 2831 - - - 3 - 2832 - - - 10 - 2832 - - - 3 - 2833 - - - 10 - 2833 - - - 3 - 2834 - - - 10 - 2834 - - - 3 - 2835 - - - 10 - 2835 - - - 3 - 2836 - - - 10 - 2836 - - - 3 - 2837 - - - 10 - 2837 - - - 3 - 2838 - - - 10 - 2838 - - - 3 - 2839 - - - 10 - 2839 - - - 3 - 2840 - - - 10 - 2840 - - - 3 - 2841 - - - 10 - 2841 - - - 3 - 2842 - - - 10 - 2842 - - - 3 - 2843 - - - 10 - 2843 - - - 3 - 2844 - - - 10 - 2844 - - - 3 - 2845 - - - 10 - 2845 - - - 3 - 2846 - - - 10 - 2846 - - - 3 - 2847 - - - 10 - 2847 - - - 3 - 2848 - - - 10 - 2848 - - - 3 - 2849 - - - 10 - 2849 - - - 3 - 2850 - - - 10 - 2850 - - - 3 - 2851 - - - 10 - 2851 - - - 3 - 2852 - - - 10 - 2852 - - - 3 - 2853 - - - 10 - 2853 - - - 3 - 2854 - - - 10 - 2854 - - - 3 - 2855 - - - 10 - 2855 - - - 3 - 2856 - - - 10 - 2856 - - - 3 - 2857 - - - 10 - 2857 - - - 3 - 2858 - - - 10 - 2858 - - - 3 - 2859 - - - 10 - 2859 - - - 3 - 2860 - - - 10 - 2860 - - - 3 - 2861 - - - 10 - 2861 - - - 3 - 2862 - - - 10 - 2862 - - - 3 - 2863 - - - 10 - 2863 - - - 3 - 2864 - - - 10 - 2864 - - - 3 - 2865 - - - 10 - 2865 - - - 3 - 2866 - - - 10 - 2866 - - - 3 - 2867 - - - 10 - 2867 - - - 3 - 2868 - - - 10 - 2868 - - - 3 - 2869 - - - 10 - 2869 - - - 3 - 2870 - - - 10 - 2870 - - - 3 - 2871 - - - 10 - 2871 - - - 3 - 2872 - - - 10 - 2872 - - - 3 - 2873 - - - 10 - 2873 - - - 3 - 2874 - - - 10 - 2874 - - - 3 - 2875 - - - 10 - 2875 - - - 3 - 2876 - - - 10 - 2876 - - - 3 - 2877 - - - 10 - 2877 - - - 3 - 2878 - - - 10 - 2878 - - - 3 - 2879 - - - 10 - 2879 - - - 3 - 2880 - - - 10 - 2880 - - - 3 - 2881 - - - 10 - 2881 - - - 3 - 2882 - - - 10 - 2882 - - - 3 - 2883 - - - 10 - 2883 - - - 3 - 2884 - - - 10 - 2884 - - - 3 - 2885 - - - 10 - 2885 - - - 3 - 2886 - - - 10 - 2886 - - - 3 - 2887 - - - 10 - 2887 - - - 3 - 2888 - - - 10 - 2888 - - - 3 - 2889 - - - 10 - 2889 - - - 3 - 2890 - - - 10 - 2890 - - - 3 - 2891 - - - 10 - 2891 - - - 3 - 2892 - - - 10 - 2892 - - - 3 - 2893 - - - 10 - 2893 - - - 3 - 2894 - - - 10 - 2894 - - - 3 - 2895 - - - 10 - 2895 - - - 3 - 2896 - - - 10 - 2896 - - - 3 - 2897 - - - 10 - 2897 - - - 3 - 2898 - - - 10 - 2898 - - - 3 - 2899 - - - 10 - 2899 - - - 3 - 2900 - - - 10 - 2900 - - - 3 - 2901 - - - 10 - 2901 - - - 3 - 2902 - - - 10 - 2902 - - - 3 - 2903 - - - 10 - 2903 - - - 3 - 2904 - - - 10 - 2904 - - - 3 - 2905 - - - 10 - 2905 - - - 3 - 2906 - - - 10 - 2906 - - - 3 - 2907 - - - 10 - 2907 - - - 3 - 2908 - - - 10 - 2908 - - - 3 - 2909 - - - 10 - 2909 - - - 3 - 2910 - - - 10 - 2910 - - - 3 - 2911 - - - 10 - 2911 - - - 3 - 2912 - - - 10 - 2912 - - - 3 - 2913 - - - 10 - 2913 - - - 3 - 2914 - - - 10 - 2914 - - - 3 - 2915 - - - 10 - 2915 - - - 3 - 2916 - - - 10 - 2916 - - - 3 - 2917 - - - 10 - 2917 - - - 3 - 2918 - - - 10 - 2918 - - - 3 - 2919 - - - 10 - 2919 - - - 3 - 2920 - - - 10 - 2920 - - - 3 - 2921 - - - 10 - 2921 - - - 3 - 2922 - - - 10 - 2922 - - - 3 - 2923 - - - 10 - 2923 - - - 3 - 2924 - - - 10 - 2924 - - - 3 - 2925 - - - 10 - 2925 - - - 1 - 2926 - - - 5 - 2926 - - - 8 - 2926 - - - 1 - 2927 - - - 5 - 2927 - - - 8 - 2927 - - - 1 - 2928 - - - 5 - 2928 - - - 8 - 2928 - - - 1 - 2929 - - - 5 - 2929 - - - 8 - 2929 - - - 1 - 2930 - - - 5 - 2930 - - - 8 - 2930 - - - 1 - 2931 - - - 5 - 2931 - - - 8 - 2931 - - - 1 - 2932 - - - 5 - 2932 - - - 8 - 2932 - - - 1 - 2933 - - - 5 - 2933 - - - 8 - 2933 - - - 1 - 2934 - - - 5 - 2934 - - - 8 - 2934 - - - 1 - 2935 - - - 5 - 2935 - - - 8 - 2935 - - - 1 - 2936 - - - 5 - 2936 - - - 8 - 2936 - - - 1 - 2937 - - - 5 - 2937 - - - 8 - 2937 - - - 1 - 2938 - - - 8 - 2938 - - - 1 - 2939 - - - 8 - 2939 - - - 1 - 2940 - - - 8 - 2940 - - - 1 - 2941 - - - 8 - 2941 - - - 1 - 2942 - - - 8 - 2942 - - - 1 - 2943 - - - 8 - 2943 - - - 1 - 2944 - - - 8 - 2944 - - - 1 - 2945 - - - 8 - 2945 - - - 1 - 2946 - - - 8 - 2946 - - - 1 - 2947 - - - 8 - 2947 - - - 1 - 2948 - - - 8 - 2948 - - - 1 - 2949 - - - 5 - 2949 - - - 8 - 2949 - - - 1 - 2950 - - - 5 - 2950 - - - 8 - 2950 - - - 1 - 2951 - - - 5 - 2951 - - - 8 - 2951 - - - 1 - 2952 - - - 5 - 2952 - - - 8 - 2952 - - - 1 - 2953 - - - 5 - 2953 - - - 8 - 2953 - - - 1 - 2954 - - - 5 - 2954 - - - 8 - 2954 - - - 1 - 2955 - - - 5 - 2955 - - - 8 - 2955 - - - 1 - 2956 - - - 5 - 2956 - - - 8 - 2956 - - - 1 - 2957 - - - 5 - 2957 - - - 8 - 2957 - - - 1 - 2958 - - - 5 - 2958 - - - 8 - 2958 - - - 1 - 2959 - - - 5 - 2959 - - - 8 - 2959 - - - 1 - 2960 - - - 5 - 2960 - - - 8 - 2960 - - - 1 - 2961 - - - 5 - 2961 - - - 8 - 2961 - - - 1 - 2962 - - - 5 - 2962 - - - 8 - 2962 - - - 1 - 2963 - - - 5 - 2963 - - - 8 - 2963 - - - 1 - 2964 - - - 8 - 2964 - - - 1 - 2965 - - - 8 - 2965 - - - 1 - 2966 - - - 8 - 2966 - - - 1 - 2967 - - - 8 - 2967 - - - 1 - 2968 - - - 8 - 2968 - - - 1 - 2969 - - - 8 - 2969 - - - 1 - 2970 - - - 8 - 2970 - - - 1 - 2971 - - - 8 - 2971 - - - 1 - 2972 - - - 8 - 2972 - - - 1 - 2973 - - - 8 - 2973 - - - 1 - 2974 - - - 8 - 2974 - - - 1 - 2975 - - - 5 - 2975 - - - 8 - 2975 - - - 1 - 2976 - - - 5 - 2976 - - - 8 - 2976 - - - 1 - 2977 - - - 5 - 2977 - - - 8 - 2977 - - - 1 - 2978 - - - 5 - 2978 - - - 8 - 2978 - - - 1 - 2979 - - - 5 - 2979 - - - 8 - 2979 - - - 1 - 2980 - - - 5 - 2980 - - - 8 - 2980 - - - 1 - 2981 - - - 5 - 2981 - - - 8 - 2981 - - - 1 - 2982 - - - 5 - 2982 - - - 8 - 2982 - - - 1 - 2983 - - - 5 - 2983 - - - 8 - 2983 - - - 1 - 2984 - - - 5 - 2984 - - - 8 - 2984 - - - 1 - 2985 - - - 5 - 2985 - - - 8 - 2985 - - - 1 - 2986 - - - 5 - 2986 - - - 8 - 2986 - - - 1 - 2987 - - - 8 - 2987 - - - 1 - 2988 - - - 8 - 2988 - - - 1 - 2989 - - - 8 - 2989 - - - 1 - 2990 - - - 8 - 2990 - - - 1 - 2991 - - - 8 - 2991 - - - 1 - 2992 - - - 8 - 2992 - - - 1 - 2993 - - - 8 - 2993 - - - 1 - 2994 - - - 8 - 2994 - - - 1 - 2995 - - - 8 - 2995 - - - 1 - 2996 - - - 8 - 2996 - - - 1 - 2997 - - - 8 - 2997 - - - 1 - 2998 - - - 8 - 2998 - - - 1 - 2999 - - - 8 - 2999 - - - 1 - 3000 - - - 8 - 3000 - - - 1 - 3001 - - - 8 - 3001 - - - 1 - 3002 - - - 8 - 3002 - - - 1 - 3003 - - - 8 - 3003 - - - 1 - 3004 - - - 5 - 3004 - - - 8 - 3004 - - - 1 - 3005 - - - 5 - 3005 - - - 8 - 3005 - - - 1 - 3006 - - - 5 - 3006 - - - 8 - 3006 - - - 1 - 3007 - - - 5 - 3007 - - - 8 - 3007 - - - 1 - 3008 - - - 5 - 3008 - - - 8 - 3008 - - - 1 - 3009 - - - 5 - 3009 - - - 8 - 3009 - - - 1 - 3010 - - - 5 - 3010 - - - 8 - 3010 - - - 1 - 3011 - - - 5 - 3011 - - - 8 - 3011 - - - 1 - 3012 - - - 5 - 3012 - - - 8 - 3012 - - - 1 - 3013 - - - 5 - 3013 - - - 8 - 3013 - - - 1 - 3014 - - - 5 - 3014 - - - 8 - 3014 - - - 1 - 3015 - - - 5 - 3015 - - - 8 - 3015 - - - 1 - 3016 - - - 5 - 3016 - - - 8 - 3016 - - - 1 - 3017 - - - 5 - 3017 - - - 8 - 3017 - - - 1 - 3018 - - - 8 - 3018 - - - 1 - 3019 - - - 8 - 3019 - - - 1 - 3020 - - - 8 - 3020 - - - 1 - 3021 - - - 8 - 3021 - - - 1 - 3022 - - - 8 - 3022 - - - 1 - 3023 - - - 8 - 3023 - - - 1 - 3024 - - - 8 - 3024 - - - 1 - 3025 - - - 8 - 3025 - - - 1 - 3026 - - - 8 - 3026 - - - 1 - 3027 - - - 8 - 3027 - - - 1 - 3028 - - - 5 - 3028 - - - 8 - 3028 - - - 1 - 3029 - - - 5 - 3029 - - - 8 - 3029 - - - 1 - 3030 - - - 5 - 3030 - - - 8 - 3030 - - - 1 - 3031 - - - 5 - 3031 - - - 8 - 3031 - - - 1 - 3032 - - - 5 - 3032 - - - 8 - 3032 - - - 1 - 3033 - - - 5 - 3033 - - - 8 - 3033 - - - 1 - 3034 - - - 5 - 3034 - - - 8 - 3034 - - - 1 - 3035 - - - 5 - 3035 - - - 8 - 3035 - - - 1 - 3036 - - - 5 - 3036 - - - 8 - 3036 - - - 1 - 3037 - - - 5 - 3037 - - - 8 - 3037 - - - 1 - 3038 - - - 5 - 3038 - - - 8 - 3038 - - - 1 - 3039 - - - 5 - 3039 - - - 8 - 3039 - - - 1 - 3040 - - - 5 - 3040 - - - 8 - 3040 - - - 1 - 3041 - - - 5 - 3041 - - - 8 - 3041 - - - 1 - 3042 - - - 5 - 3042 - - - 8 - 3042 - - - 1 - 3043 - - - 5 - 3043 - - - 8 - 3043 - - - 1 - 3044 - - - 5 - 3044 - - - 8 - 3044 - - - 1 - 3045 - - - 5 - 3045 - - - 8 - 3045 - - - 1 - 3046 - - - 5 - 3046 - - - 8 - 3046 - - - 1 - 3047 - - - 5 - 3047 - - - 8 - 3047 - - - 1 - 3048 - - - 5 - 3048 - - - 8 - 3048 - - - 1 - 3049 - - - 5 - 3049 - - - 8 - 3049 - - - 1 - 3050 - - - 5 - 3050 - - - 8 - 3050 - - - 1 - 3051 - - - 5 - 3051 - - - 8 - 3051 - - - 1 - 3052 - - - 8 - 3052 - - - 1 - 3053 - - - 8 - 3053 - - - 1 - 3054 - - - 8 - 3054 - - - 1 - 3055 - - - 8 - 3055 - - - 1 - 3056 - - - 8 - 3056 - - - 1 - 3057 - - - 8 - 3057 - - - 1 - 3058 - - - 8 - 3058 - - - 1 - 3059 - - - 8 - 3059 - - - 1 - 3060 - - - 8 - 3060 - - - 1 - 3061 - - - 8 - 3061 - - - 1 - 3062 - - - 8 - 3062 - - - 1 - 3063 - - - 8 - 3063 - - - 1 - 3064 - - - 8 - 3064 - - - 1 - 3065 - - - 8 - 3065 - - - 1 - 3066 - - - 8 - 3066 - - - 1 - 3067 - - - 8 - 3067 - - - 1 - 3068 - - - 8 - 3068 - - - 1 - 3069 - - - 8 - 3069 - - - 1 - 3070 - - - 8 - 3070 - - - 1 - 3071 - - - 8 - 3071 - - - 1 - 3072 - - - 8 - 3072 - - - 1 - 3073 - - - 8 - 3073 - - - 1 - 3074 - - - 8 - 3074 - - - 1 - 3075 - - - 5 - 3075 - - - 8 - 3075 - - - 1 - 3076 - - - 5 - 3076 - - - 8 - 3076 - - - 1 - 3077 - - - 5 - 3077 - - - 8 - 3077 - - - 1 - 3078 - - - 5 - 3078 - - - 8 - 3078 - - - 1 - 3079 - - - 5 - 3079 - - - 8 - 3079 - - - 1 - 3080 - - - 5 - 3080 - - - 8 - 3080 - - - 1 - 3081 - - - 8 - 3081 - - - 1 - 3082 - - - 8 - 3082 - - - 1 - 3083 - - - 8 - 3083 - - - 1 - 3084 - - - 8 - 3084 - - - 1 - 3085 - - - 8 - 3085 - - - 1 - 3086 - - - 8 - 3086 - - - 1 - 3087 - - - 8 - 3087 - - - 1 - 3088 - - - 8 - 3088 - - - 1 - 3089 - - - 8 - 3089 - - - 1 - 3090 - - - 8 - 3090 - - - 1 - 3091 - - - 8 - 3091 - - - 1 - 3092 - - - 5 - 3092 - - - 8 - 3092 - - - 1 - 3093 - - - 5 - 3093 - - - 8 - 3093 - - - 1 - 3094 - - - 5 - 3094 - - - 8 - 3094 - - - 1 - 3095 - - - 5 - 3095 - - - 8 - 3095 - - - 1 - 3096 - - - 5 - 3096 - - - 8 - 3096 - - - 1 - 3097 - - - 5 - 3097 - - - 8 - 3097 - - - 1 - 3098 - - - 5 - 3098 - - - 8 - 3098 - - - 1 - 3099 - - - 5 - 3099 - - - 8 - 3099 - - - 1 - 3100 - - - 5 - 3100 - - - 8 - 3100 - - - 1 - 3101 - - - 5 - 3101 - - - 8 - 3101 - - - 1 - 3102 - - - 5 - 3102 - - - 8 - 3102 - - - 1 - 3103 - - - 5 - 3103 - - - 8 - 3103 - - - 1 - 3104 - - - 8 - 3104 - - - 1 - 3105 - - - 8 - 3105 - - - 1 - 3106 - - - 8 - 3106 - - - 1 - 3107 - - - 8 - 3107 - - - 1 - 3108 - - - 8 - 3108 - - - 1 - 3109 - - - 8 - 3109 - - - 1 - 3110 - - - 8 - 3110 - - - 1 - 3111 - - - 8 - 3111 - - - 1 - 3112 - - - 8 - 3112 - - - 1 - 3113 - - - 8 - 3113 - - - 1 - 3114 - - - 8 - 3114 - - - 1 - 3115 - - - 8 - 3115 - - - 1 - 3116 - - - 8 - 3116 - - - 1 - 3117 - - - 8 - 3117 - - - 1 - 3118 - - - 8 - 3118 - - - 1 - 3119 - - - 8 - 3119 - - - 1 - 3120 - - - 8 - 3120 - - - 1 - 3121 - - - 8 - 3121 - - - 1 - 3122 - - - 8 - 3122 - - - 1 - 3123 - - - 8 - 3123 - - - 1 - 3124 - - - 8 - 3124 - - - 1 - 3125 - - - 8 - 3125 - - - 1 - 3126 - - - 8 - 3126 - - - 1 - 3127 - - - 8 - 3127 - - - 1 - 3128 - - - 8 - 3128 - - - 1 - 3129 - - - 8 - 3129 - - - 1 - 3130 - - - 8 - 3130 - - - 1 - 3131 - - - 8 - 3131 - - - 1 - 3132 - - - 5 - 3132 - - - 8 - 3132 - - - 1 - 3133 - - - 5 - 3133 - - - 8 - 3133 - - - 1 - 3134 - - - 5 - 3134 - - - 8 - 3134 - - - 1 - 3135 - - - 5 - 3135 - - - 8 - 3135 - - - 1 - 3136 - - - 5 - 3136 - - - 8 - 3136 - - - 1 - 3137 - - - 5 - 3137 - - - 8 - 3137 - - - 1 - 3138 - - - 5 - 3138 - - - 8 - 3138 - - - 1 - 3139 - - - 5 - 3139 - - - 8 - 3139 - - - 1 - 3140 - - - 5 - 3140 - - - 8 - 3140 - - - 1 - 3141 - - - 5 - 3141 - - - 8 - 3141 - - - 1 - 3142 - - - 5 - 3142 - - - 8 - 3142 - - - 1 - 3143 - - - 5 - 3143 - - - 8 - 3143 - - - 1 - 3144 - - - 5 - 3144 - - - 8 - 3144 - - - 1 - 3145 - - - 5 - 3145 - - - 8 - 3145 - - - 1 - 3146 - - - 5 - 3146 - - - 8 - 3146 - - - 1 - 3147 - - - 5 - 3147 - - - 8 - 3147 - - - 1 - 3148 - - - 5 - 3148 - - - 8 - 3148 - - - 1 - 3149 - - - 5 - 3149 - - - 8 - 3149 - - - 1 - 3150 - - - 5 - 3150 - - - 8 - 3150 - - - 1 - 3151 - - - 5 - 3151 - - - 8 - 3151 - - - 1 - 3152 - - - 5 - 3152 - - - 8 - 3152 - - - 1 - 3153 - - - 5 - 3153 - - - 8 - 3153 - - - 1 - 3154 - - - 5 - 3154 - - - 8 - 3154 - - - 1 - 3155 - - - 5 - 3155 - - - 8 - 3155 - - - 1 - 3156 - - - 5 - 3156 - - - 8 - 3156 - - - 1 - 3157 - - - 5 - 3157 - - - 8 - 3157 - - - 1 - 3158 - - - 5 - 3158 - - - 8 - 3158 - - - 1 - 3159 - - - 5 - 3159 - - - 8 - 3159 - - - 1 - 3160 - - - 5 - 3160 - - - 8 - 3160 - - - 1 - 3161 - - - 5 - 3161 - - - 8 - 3161 - - - 1 - 3162 - - - 5 - 3162 - - - 8 - 3162 - - - 1 - 3163 - - - 5 - 3163 - - - 8 - 3163 - - - 1 - 3164 - - - 5 - 3164 - - - 8 - 3164 - - - 3 - 3165 - - - 10 - 3165 - - - 3 - 3166 - - - 10 - 3166 - - - 3 - 3167 - - - 10 - 3167 - - - 3 - 3168 - - - 10 - 3168 - - - 3 - 3169 - - - 10 - 3169 - - - 3 - 3170 - - - 10 - 3170 - - - 3 - 3171 - - - 10 - 3171 - - - 3 - 3172 - - - 10 - 3172 - - - 3 - 3173 - - - 10 - 3173 - - - 3 - 3174 - - - 10 - 3174 - - - 3 - 3175 - - - 10 - 3175 - - - 3 - 3176 - - - 10 - 3176 - - - 3 - 3177 - - - 10 - 3177 - - - 3 - 3178 - - - 10 - 3178 - - - 3 - 3179 - - - 10 - 3179 - - - 3 - 3180 - - - 10 - 3180 - - - 3 - 3181 - - - 10 - 3181 - - - 3 - 3182 - - - 10 - 3182 - - - 3 - 3183 - - - 10 - 3183 - - - 3 - 3184 - - - 10 - 3184 - - - 3 - 3185 - - - 10 - 3185 - - - 3 - 3186 - - - 10 - 3186 - - - 3 - 3187 - - - 10 - 3187 - - - 3 - 3188 - - - 10 - 3188 - - - 3 - 3189 - - - 10 - 3189 - - - 3 - 3190 - - - 10 - 3190 - - - 3 - 3191 - - - 10 - 3191 - - - 3 - 3192 - - - 10 - 3192 - - - 3 - 3193 - - - 10 - 3193 - - - 3 - 3194 - - - 10 - 3194 - - - 3 - 3195 - - - 10 - 3195 - - - 3 - 3196 - - - 10 - 3196 - - - 3 - 3197 - - - 10 - 3197 - - - 3 - 3198 - - - 10 - 3198 - - - 3 - 3199 - - - 10 - 3199 - - - 3 - 3200 - - - 10 - 3200 - - - 3 - 3201 - - - 10 - 3201 - - - 3 - 3202 - - - 10 - 3202 - - - 3 - 3203 - - - 10 - 3203 - - - 3 - 3204 - - - 10 - 3204 - - - 3 - 3205 - - - 10 - 3205 - - - 3 - 3206 - - - 10 - 3206 - - - 3 - 3207 - - - 10 - 3207 - - - 3 - 3208 - - - 10 - 3208 - - - 3 - 3209 - - - 10 - 3209 - - - 3 - 3210 - - - 10 - 3210 - - - 3 - 3211 - - - 10 - 3211 - - - 3 - 3212 - - - 10 - 3212 - - - 3 - 3213 - - - 10 - 3213 - - - 3 - 3214 - - - 10 - 3214 - - - 3 - 3215 - - - 10 - 3215 - - - 3 - 3216 - - - 10 - 3216 - - - 3 - 3217 - - - 10 - 3217 - - - 3 - 3218 - - - 10 - 3218 - - - 3 - 3219 - - - 10 - 3219 - - - 3 - 3220 - - - 10 - 3220 - - - 3 - 3221 - - - 10 - 3221 - - - 3 - 3222 - - - 10 - 3222 - - - 3 - 3223 - - - 10 - 3223 - - - 3 - 3224 - - - 10 - 3224 - - - 1 - 3225 - - - 5 - 3225 - - - 8 - 3225 - - - 3 - 3226 - - - 10 - 3226 - - - 3 - 3227 - - - 10 - 3227 - - - 3 - 3228 - - - 10 - 3228 - - - 3 - 3229 - - - 10 - 3229 - - - 3 - 3230 - - - 10 - 3230 - - - 3 - 3231 - - - 10 - 3231 - - - 3 - 3232 - - - 10 - 3232 - - - 3 - 3233 - - - 10 - 3233 - - - 3 - 3234 - - - 10 - 3234 - - - 3 - 3235 - - - 10 - 3235 - - - 3 - 3236 - - - 10 - 3236 - - - 3 - 3237 - - - 10 - 3237 - - - 3 - 3238 - - - 10 - 3238 - - - 3 - 3239 - - - 10 - 3239 - - - 3 - 3240 - - - 10 - 3240 - - - 3 - 3241 - - - 10 - 3241 - - - 3 - 3242 - - - 10 - 3242 - - - 3 - 3243 - - - 10 - 3243 - - - 3 - 3244 - - - 10 - 3244 - - - 3 - 3245 - - - 10 - 3245 - - - 3 - 3246 - - - 10 - 3246 - - - 3 - 3247 - - - 10 - 3247 - - - 3 - 3248 - - - 10 - 3248 - - - 3 - 3249 - - - 10 - 3249 - - - 3 - 3250 - - - 10 - 3250 - - - 3 - 3251 - - - 10 - 3251 - - - 3 - 3252 - - - 10 - 3252 - - - 1 - 3253 - - - 8 - 3253 - - - 1 - 3254 - - - 8 - 3254 - - - 1 - 3255 - - - 8 - 3255 - - - 1 - 3256 - - - 8 - 3256 - - - 1 - 3257 - - - 8 - 3257 - - - 1 - 3258 - - - 8 - 3258 - - - 1 - 3259 - - - 8 - 3259 - - - 1 - 3260 - - - 8 - 3260 - - - 1 - 3261 - - - 8 - 3261 - - - 1 - 3262 - - - 8 - 3262 - - - 1 - 3263 - - - 8 - 3263 - - - 1 - 3264 - - - 8 - 3264 - - - 1 - 3265 - - - 8 - 3265 - - - 1 - 3266 - - - 8 - 3266 - - - 1 - 3267 - - - 8 - 3267 - - - 1 - 3268 - - - 8 - 3268 - - - 1 - 3269 - - - 8 - 3269 - - - 1 - 3270 - - - 8 - 3270 - - - 1 - 3271 - - - 8 - 3271 - - - 1 - 3272 - - - 8 - 3272 - - - 1 - 3273 - - - 8 - 3273 - - - 1 - 3274 - - - 8 - 3274 - - - 1 - 3275 - - - 8 - 3275 - - - 1 - 3276 - - - 5 - 3276 - - - 8 - 3276 - - - 1 - 3277 - - - 5 - 3277 - - - 8 - 3277 - - - 1 - 3278 - - - 5 - 3278 - - - 8 - 3278 - - - 1 - 3279 - - - 5 - 3279 - - - 8 - 3279 - - - 1 - 3280 - - - 5 - 3280 - - - 8 - 3280 - - - 1 - 3281 - - - 5 - 3281 - - - 8 - 3281 - - - 1 - 3282 - - - 5 - 3282 - - - 8 - 3282 - - - 1 - 3283 - - - 5 - 3283 - - - 8 - 3283 - - - 1 - 3284 - - - 5 - 3284 - - - 8 - 3284 - - - 1 - 3285 - - - 5 - 3285 - - - 8 - 3285 - - - 1 - 3286 - - - 5 - 3286 - - - 8 - 3286 - - - 1 - 3287 - - - 5 - 3287 - - - 8 - 3287 - - - 1 - 3288 - - - 8 - 3288 - - - 1 - 3289 - - - 8 - 3289 - - - 1 - 3290 - - - 8 - 3290 - - - 17 - 3290 - - - 1 - 3291 - - - 8 - 3291 - - - 1 - 3292 - - - 8 - 3292 - - - 1 - 3293 - - - 8 - 3293 - - - 1 - 3294 - - - 8 - 3294 - - - 1 - 3295 - - - 8 - 3295 - - - 1 - 3296 - - - 8 - 3296 - - - 1 - 3297 - - - 8 - 3297 - - - 1 - 3298 - - - 8 - 3298 - - - 1 - 3299 - - - 8 - 3299 - - - 1 - 3300 - - - 5 - 3300 - - - 8 - 3300 - - - 1 - 3301 - - - 5 - 3301 - - - 8 - 3301 - - - 1 - 3302 - - - 5 - 3302 - - - 8 - 3302 - - - 1 - 3303 - - - 5 - 3303 - - - 8 - 3303 - - - 1 - 3304 - - - 5 - 3304 - - - 8 - 3304 - - - 1 - 3305 - - - 5 - 3305 - - - 8 - 3305 - - - 1 - 3306 - - - 5 - 3306 - - - 8 - 3306 - - - 1 - 3307 - - - 5 - 3307 - - - 8 - 3307 - - - 1 - 3308 - - - 5 - 3308 - - - 8 - 3308 - - - 1 - 3309 - - - 5 - 3309 - - - 8 - 3309 - - - 1 - 3310 - - - 5 - 3310 - - - 8 - 3310 - - - 1 - 3311 - - - 5 - 3311 - - - 8 - 3311 - - - 1 - 3312 - - - 5 - 3312 - - - 8 - 3312 - - - 1 - 3313 - - - 5 - 3313 - - - 8 - 3313 - - - 1 - 3314 - - - 5 - 3314 - - - 8 - 3314 - - - 1 - 3315 - - - 5 - 3315 - - - 8 - 3315 - - - 1 - 3316 - - - 5 - 3316 - - - 8 - 3316 - - - 1 - 3317 - - - 5 - 3317 - - - 8 - 3317 - - - 1 - 3318 - - - 5 - 3318 - - - 8 - 3318 - - - 1 - 3319 - - - 8 - 3319 - - - 1 - 3320 - - - 8 - 3320 - - - 1 - 3321 - - - 8 - 3321 - - - 1 - 3322 - - - 8 - 3322 - - - 1 - 3323 - - - 8 - 3323 - - - 1 - 3324 - - - 8 - 3324 - - - 1 - 3325 - - - 8 - 3325 - - - 1 - 3326 - - - 8 - 3326 - - - 1 - 3327 - - - 8 - 3327 - - - 1 - 3328 - - - 8 - 3328 - - - 1 - 3329 - - - 8 - 3329 - - - 1 - 3330 - - - 8 - 3330 - - - 1 - 3331 - - - 8 - 3331 - - - 1 - 3332 - - - 8 - 3332 - - - 1 - 3333 - - - 8 - 3333 - - - 1 - 3334 - - - 8 - 3334 - - - 1 - 3335 - - - 8 - 3335 - - - 1 - 3336 - - - 8 - 3336 - - - 3 - 3337 - - - 10 - 3337 - - - 3 - 3338 - - - 10 - 3338 - - - 3 - 3339 - - - 10 - 3339 - - - 3 - 3340 - - - 10 - 3340 - - - 3 - 3341 - - - 10 - 3341 - - - 3 - 3342 - - - 10 - 3342 - - - 3 - 3343 - - - 10 - 3343 - - - 3 - 3344 - - - 10 - 3344 - - - 3 - 3345 - - - 10 - 3345 - - - 3 - 3346 - - - 10 - 3346 - - - 3 - 3347 - - - 10 - 3347 - - - 3 - 3348 - - - 10 - 3348 - - - 1 - 3349 - - - 8 - 3349 - - - 1 - 3350 - - - 8 - 3350 - - - 1 - 3351 - - - 5 - 3351 - - - 8 - 3351 - - - 1 - 3352 - - - 8 - 3352 - - - 1 - 3353 - - - 8 - 3353 - - - 1 - 3354 - - - 5 - 3354 - - - 8 - 3354 - - - 1 - 3355 - - - 8 - 3355 - - - 1 - 3356 - - - 8 - 3356 - - - 1 - 3357 - - - 8 - 3357 - - - 1 - 3358 - - - 8 - 3358 - - - 1 - 3359 - - - 5 - 3359 - - - 8 - 3359 - - - 3 - 3360 - - - 10 - 3360 - - - 3 - 3361 - - - 10 - 3361 - - - 3 - 3362 - - - 10 - 3362 - - - 3 - 3363 - - - 10 - 3363 - - - 3 - 3364 - - - 10 - 3364 - - - 1 - 3365 - - - 5 - 3365 - - - 8 - 3365 - - - 1 - 3366 - - - 5 - 3366 - - - 8 - 3366 - - - 1 - 3367 - - - 5 - 3367 - - - 8 - 3367 - - - 16 - 3367 - - - 1 - 3368 - - - 5 - 3368 - - - 8 - 3368 - - - 1 - 3369 - - - 5 - 3369 - - - 8 - 3369 - - - 1 - 3370 - - - 5 - 3370 - - - 8 - 3370 - - - 1 - 3371 - - - 5 - 3371 - - - 8 - 3371 - - - 1 - 3372 - - - 5 - 3372 - - - 8 - 3372 - - - 1 - 3373 - - - 5 - 3373 - - - 8 - 3373 - - - 1 - 3374 - - - 5 - 3374 - - - 8 - 3374 - - - 1 - 3375 - - - 8 - 3375 - - - 1 - 3376 - - - 8 - 3376 - - - 1 - 3377 - - - 8 - 3377 - - - 1 - 3378 - - - 8 - 3378 - - - 1 - 3379 - - - 8 - 3379 - - - 1 - 3380 - - - 8 - 3380 - - - 1 - 3381 - - - 8 - 3381 - - - 1 - 3382 - - - 8 - 3382 - - - 1 - 3383 - - - 8 - 3383 - - - 1 - 3384 - - - 8 - 3384 - - - 1 - 3385 - - - 8 - 3385 - - - 1 - 3386 - - - 8 - 3386 - - - 1 - 3387 - - - 8 - 3387 - - - 1 - 3388 - - - 8 - 3388 - - - 1 - 3389 - - - 8 - 3389 - - - 1 - 3390 - - - 8 - 3390 - - - 1 - 3391 - - - 8 - 3391 - - - 1 - 3392 - - - 8 - 3392 - - - 1 - 3393 - - - 8 - 3393 - - - 1 - 3394 - - - 8 - 3394 - - - 1 - 3395 - - - 8 - 3395 - - - 1 - 3396 - - - 8 - 3396 - - - 1 - 3397 - - - 8 - 3397 - - - 1 - 3398 - - - 8 - 3398 - - - 1 - 3399 - - - 8 - 3399 - - - 1 - 3400 - - - 8 - 3400 - - - 1 - 3401 - - - 8 - 3401 - - - 1 - 3402 - - - 8 - 3402 - - - 9 - 3402 - - - 1 - 3403 - - - 5 - 3403 - - - 8 - 3403 - - - 12 - 3403 - - - 15 - 3403 - - - 1 - 3404 - - - 5 - 3404 - - - 8 - 3404 - - - 12 - 3404 - - - 15 - 3404 - - - 1 - 3405 - - - 8 - 3405 - - - 12 - 3405 - - - 15 - 3405 - - - 1 - 3406 - - - 8 - 3406 - - - 12 - 3406 - - - 15 - 3406 - - - 1 - 3407 - - - 8 - 3407 - - - 12 - 3407 - - - 15 - 3407 - - - 1 - 3408 - - - 5 - 3408 - - - 8 - 3408 - - - 12 - 3408 - - - 15 - 3408 - - - 1 - 3409 - - - 5 - 3409 - - - 8 - 3409 - - - 12 - 3409 - - - 15 - 3409 - - - 1 - 3410 - - - 5 - 3410 - - - 8 - 3410 - - - 12 - 3410 - - - 15 - 3410 - - - 1 - 3411 - - - 5 - 3411 - - - 8 - 3411 - - - 12 - 3411 - - - 15 - 3411 - - - 1 - 3412 - - - 8 - 3412 - - - 12 - 3412 - - - 15 - 3412 - - - 1 - 3413 - - - 8 - 3413 - - - 12 - 3413 - - - 15 - 3413 - - - 1 - 3414 - - - 8 - 3414 - - - 12 - 3414 - - - 15 - 3414 - - - 1 - 3415 - - - 5 - 3415 - - - 8 - 3415 - - - 12 - 3415 - - - 15 - 3415 - - - 1 - 3416 - - - 5 - 3416 - - - 8 - 3416 - - - 12 - 3416 - - - 15 - 3416 - - - 1 - 3417 - - - 5 - 3417 - - - 8 - 3417 - - - 12 - 3417 - - - 15 - 3417 - - - 1 - 3418 - - - 5 - 3418 - - - 8 - 3418 - - - 12 - 3418 - - - 15 - 3418 - - - 1 - 3419 - - - 8 - 3419 - - - 12 - 3419 - - - 15 - 3419 - - - 1 - 3420 - - - 8 - 3420 - - - 12 - 3420 - - - 15 - 3420 - - - 1 - 3421 - - - 5 - 3421 - - - 8 - 3421 - - - 12 - 3421 - - - 15 - 3421 - - - 1 - 3422 - - - 8 - 3422 - - - 12 - 3422 - - - 15 - 3422 - - - 1 - 3423 - - - 5 - 3423 - - - 8 - 3423 - - - 12 - 3423 - - - 15 - 3423 - - - 1 - 3424 - - - 5 - 3424 - - - 8 - 3424 - - - 12 - 3424 - - - 15 - 3424 - - - 1 - 3425 - - - 8 - 3425 - - - 12 - 3425 - - - 15 - 3425 - - - 1 - 3426 - - - 5 - 3426 - - - 8 - 3426 - - - 12 - 3426 - - - 15 - 3426 - - - 1 - 3427 - - - 8 - 3427 - - - 12 - 3427 - - - 15 - 3427 - - - 3 - 3428 - - - 10 - 3428 - - - 3 - 3429 - - - 10 - 3429 - - - 1 - 3430 - - - 5 - 3430 - - - 8 - 3430 - - - 12 - 3430 - - - 14 - 3430 - - - 1 - 3431 - - - 8 - 3431 - - - 12 - 3431 - - - 14 - 3431 - - - 1 - 3432 - - - 5 - 3432 - - - 8 - 3432 - - - 12 - 3432 - - - 14 - 3432 - - - 1 - 3433 - - - 8 - 3433 - - - 12 - 3433 - - - 14 - 3433 - - - 1 - 3434 - - - 5 - 3434 - - - 8 - 3434 - - - 12 - 3434 - - - 14 - 3434 - - - 1 - 3435 - - - 5 - 3435 - - - 8 - 3435 - - - 12 - 3435 - - - 14 - 3435 - - - 1 - 3436 - - - 5 - 3436 - - - 8 - 3436 - - - 12 - 3436 - - - 14 - 3436 - - - 1 - 3437 - - - 5 - 3437 - - - 8 - 3437 - - - 12 - 3437 - - - 14 - 3437 - - - 1 - 3438 - - - 5 - 3438 - - - 8 - 3438 - - - 12 - 3438 - - - 14 - 3438 - - - 1 - 3439 - - - 5 - 3439 - - - 8 - 3439 - - - 12 - 3439 - - - 14 - 3439 - - - 1 - 3440 - - - 8 - 3440 - - - 12 - 3440 - - - 14 - 3440 - - - 1 - 3441 - - - 8 - 3441 - - - 12 - 3441 - - - 14 - 3441 - - - 1 - 3442 - - - 5 - 3442 - - - 8 - 3442 - - - 12 - 3442 - - - 14 - 3442 - - - 1 - 3443 - - - 8 - 3443 - - - 12 - 3443 - - - 14 - 3443 - - - 1 - 3444 - - - 5 - 3444 - - - 8 - 3444 - - - 12 - 3444 - - - 14 - 3444 - - - 1 - 3445 - - - 5 - 3445 - - - 8 - 3445 - - - 12 - 3445 - - - 14 - 3445 - - - 1 - 3446 - - - 5 - 3446 - - - 8 - 3446 - - - 12 - 3446 - - - 14 - 3446 - - - 1 - 3447 - - - 5 - 3447 - - - 8 - 3447 - - - 12 - 3447 - - - 14 - 3447 - - - 1 - 3448 - - - 5 - 3448 - - - 8 - 3448 - - - 12 - 3448 - - - 14 - 3448 - - - 1 - 3449 - - - 5 - 3449 - - - 8 - 3449 - - - 12 - 3449 - - - 14 - 3449 - - - 1 - 3450 - - - 8 - 3450 - - - 12 - 3450 - - - 14 - 3450 - - - 1 - 3451 - - - 5 - 3451 - - - 8 - 3451 - - - 12 - 3451 - - - 14 - 3451 - - - 1 - 3452 - - - 8 - 3452 - - - 12 - 3452 - - - 14 - 3452 - - - 1 - 3453 - - - 8 - 3453 - - - 12 - 3453 - - - 14 - 3453 - - - 1 - 3454 - - - 5 - 3454 - - - 8 - 3454 - - - 12 - 3454 - - - 14 - 3454 - - - 1 - 3455 - - - 8 - 3455 - - - 1 - 3456 - - - 8 - 3456 - - - 1 - 3457 - - - 8 - 3457 - - - 1 - 3458 - - - 8 - 3458 - - - 1 - 3459 - - - 8 - 3459 - - - 1 - 3460 - - - 8 - 3460 - - - 1 - 3461 - - - 8 - 3461 - - - 1 - 3462 - - - 8 - 3462 - - - 1 - 3463 - - - 8 - 3463 - - - 1 - 3464 - - - 8 - 3464 - - - 1 - 3465 - - - 8 - 3465 - - - 1 - 3466 - - - 8 - 3466 - - - 1 - 3467 - - - 8 - 3467 - - - 1 - 3468 - - - 8 - 3468 - - - 1 - 3469 - - - 8 - 3469 - - - 1 - 3470 - - - 8 - 3470 - - - 1 - 3471 - - - 8 - 3471 - - - 1 - 3472 - - - 8 - 3472 - - - 1 - 3473 - - - 8 - 3473 - - - 1 - 3474 - - - 8 - 3474 - - - 1 - 3475 - - - 8 - 3475 - - - 1 - 3476 - - - 8 - 3476 - - - 1 - 3477 - - - 8 - 3477 - - - 1 - 3478 - - - 8 - 3478 - - - 1 - 3479 - - - 8 - 3479 - - - 12 - 3479 - - - 13 - 3479 - - - 1 - 3480 - - - 8 - 3480 - - - 12 - 3480 - - - 13 - 3480 - - - 1 - 3481 - - - 5 - 3481 - - - 8 - 3481 - - - 12 - 3481 - - - 13 - 3481 - - - 1 - 3482 - - - 5 - 3482 - - - 8 - 3482 - - - 12 - 3482 - - - 13 - 3482 - - - 1 - 3483 - - - 8 - 3483 - - - 12 - 3483 - - - 13 - 3483 - - - 1 - 3484 - - - 8 - 3484 - - - 12 - 3484 - - - 13 - 3484 - - - 1 - 3485 - - - 5 - 3485 - - - 8 - 3485 - - - 12 - 3485 - - - 13 - 3485 - - - 1 - 3486 - - - 8 - 3486 - - - 12 - 3486 - - - 13 - 3486 - - - 1 - 3487 - - - 8 - 3487 - - - 12 - 3487 - - - 13 - 3487 - - - 1 - 3488 - - - 8 - 3488 - - - 12 - 3488 - - - 13 - 3488 - - - 1 - 3489 - - - 5 - 3489 - - - 8 - 3489 - - - 12 - 3489 - - - 13 - 3489 - - - 1 - 3490 - - - 5 - 3490 - - - 8 - 3490 - - - 12 - 3490 - - - 13 - 3490 - - - 1 - 3491 - - - 8 - 3491 - - - 12 - 3491 - - - 13 - 3491 - - - 1 - 3492 - - - 5 - 3492 - - - 8 - 3492 - - - 12 - 3492 - - - 13 - 3492 - - - 1 - 3493 - - - 5 - 3493 - - - 8 - 3493 - - - 12 - 3493 - - - 13 - 3493 - - - 1 - 3494 - - - 8 - 3494 - - - 12 - 3494 - - - 13 - 3494 - - - 1 - 3495 - - - 8 - 3495 - - - 12 - 3495 - - - 13 - 3495 - - - 1 - 3496 - - - 8 - 3496 - - - 12 - 3496 - - - 13 - 3496 - - - 1 - 3497 - - - 8 - 3497 - - - 12 - 3497 - - - 13 - 3497 - - - 1 - 3498 - - - 5 - 3498 - - - 8 - 3498 - - - 12 - 3498 - - - 13 - 3498 - - - 1 - 3499 - - - 5 - 3499 - - - 8 - 3499 - - - 12 - 3499 - - - 13 - 3499 - - - 1 - 3500 - - - 8 - 3500 - - - 12 - 3500 - - - 13 - 3500 - - - 1 - 3501 - - - 8 - 3501 - - - 12 - 3501 - - - 13 - 3501 - - - 1 - 3502 - - - 8 - 3502 - - - 12 - 3502 - - - 13 - 3502 - - - 1 - 3503 - - - 5 - 3503 - - - 8 - 3503 - - - 12 - 3503 - - - 13 - 3503 - - - + + + + + System.Int32 + System.String + System.Int32 + + + + 1 + For Those About To Rock We Salute You + 1 + + + 2 + Balls to the Wall + 2 + + + 3 + Restless and Wild + 2 + + + 4 + Let There Be Rock + 1 + + + 5 + Big Ones + 3 + + + 6 + Jagged Little Pill + 4 + + + 7 + Facelift + 5 + + + 8 + Warner 25 Anos + 6 + + + 9 + Plays Metallica By Four Cellos + 7 + + + 10 + Audioslave + 8 + + + 11 + Out Of Exile + 8 + + + 12 + BackBeat Soundtrack + 9 + + + 13 + The Best Of Billy Cobham + 10 + + + 14 + Alcohol Fueled Brewtality Live! (Disc 1) + 11 + + + 15 + Alcohol Fueled Brewtality Live! (Disc 2) + 11 + + + 16 + Black Sabbath + 12 + + + 17 + Black Sabbath Vol. 4 (Remaster) + 12 + + + 18 + Body Count + 13 + + + 19 + Chemical Wedding + 14 + + + 20 + The Best Of Buddy Guy - The Millenium Collection + 15 + + + 21 + Prenda Minha + 16 + + + 22 + Sozinho Remix Ao Vivo + 16 + + + 23 + Minha Historia + 17 + + + 24 + Afrociberdelia + 18 + + + 25 + Da Lama Ao Caos + 18 + + + 26 + Acústico MTV (Live) + 19 + + + 27 + Cidade Negra - Hits + 19 + + + 28 + Na Pista + 20 + + + 29 + Axé Bahia 2001 + 21 + + + 30 + BBC Sessions (Disc 1) (Live) + 22 + + + 31 + Bongo Fury + 23 + + + 32 + Carnaval 2001 + 21 + + + 33 + Chill: Brazil (Disc 1) + 24 + + + 34 + Chill: Brazil (Disc 2) + 6 + + + 35 + Garage Inc. (Disc 1) + 50 + + + 36 + Greatest Hits II + 51 + + + 37 + Greatest Kiss + 52 + + + 38 + Heart of the Night + 53 + + + 39 + International Superhits + 54 + + + 40 + Into The Light + 55 + + + 41 + Meus Momentos + 56 + + + 42 + Minha História + 57 + + + 43 + MK III The Final Concerts (Disc 1) + 58 + + + 44 + Physical Graffiti (Disc 1) + 22 + + + 45 + Sambas De Enredo 2001 + 21 + + + 46 + Supernatural + 59 + + + 47 + The Best of Ed Motta + 37 + + + 48 + The Essential Miles Davis (Disc 1) + 68 + + + 49 + The Essential Miles Davis (Disc 2) + 68 + + + 50 + The Final Concerts (Disc 2) + 58 + + + 51 + Up An' Atom + 69 + + + 52 + Vinícius De Moraes - Sem Limite + 70 + + + 53 + Vozes do MPB + 21 + + + 54 + Chronicle, Vol. 1 + 76 + + + 55 + Chronicle, Vol. 2 + 76 + + + 56 + Cássia Eller - Coleção Sem Limite (Disc 2) + 77 + + + 57 + Cássia Eller - Sem Limite (Disc 1) + 77 + + + 58 + Come Taste The Band + 58 + + + 59 + Deep Purple In Rock + 58 + + + 60 + Fireball + 58 + + + 61 + Knocking at Your Back Door: The Best Of Deep Purple in the 80's + 58 + + + 62 + Machine Head + 58 + + + 63 + Purpendicular + 58 + + + 64 + Slaves And Masters + 58 + + + 65 + Stormbringer + 58 + + + 66 + The Battle Rages On + 58 + + + 67 + Vault: Def Leppard's Greatest Hits + 78 + + + 68 + Outbreak + 79 + + + 69 + Djavan Ao Vivo - Vol. 02 + 80 + + + 70 + Djavan Ao Vivo - Vol. 1 + 80 + + + 71 + Elis Regina-Minha História + 41 + + + 72 + The Cream Of Clapton + 81 + + + 73 + Unplugged + 81 + + + 74 + Album Of The Year + 82 + + + 75 + Angel Dust + 82 + + + 76 + King For A Day Fool For A Lifetime + 82 + + + 77 + The Real Thing + 82 + + + 78 + Deixa Entrar + 83 + + + 79 + In Your Honor (Disc 1) + 84 + + + 80 + In Your Honor (Disc 2) + 84 + + + 81 + One By One + 84 + + + 82 + The Colour And The Shape + 84 + + + 83 + My Way: The Best Of Frank Sinatra (Disc 1) + 85 + + + 84 + Roda De Funk + 86 + + + 85 + As Canções de Eu Tu Eles + 27 + + + 86 + Quanta Gente Veio Ver (Live) + 27 + + + 87 + Quanta Gente Veio ver--Bônus De Carnaval + 27 + + + 88 + Faceless + 87 + + + 89 + American Idiot + 54 + + + 90 + Appetite for Destruction + 88 + + + 91 + Use Your Illusion I + 88 + + + 92 + Use Your Illusion II + 88 + + + 93 + Blue Moods + 89 + + + 94 + A Matter of Life and Death + 90 + + + 95 + A Real Dead One + 90 + + + 96 + A Real Live One + 90 + + + 97 + Brave New World + 90 + + + 98 + Dance Of Death + 90 + + + 99 + Fear Of The Dark + 90 + + + 100 + Iron Maiden + 90 + + + 101 + Killers + 90 + + + 102 + Live After Death + 90 + + + 103 + Live At Donington 1992 (Disc 1) + 90 + + + 104 + Live At Donington 1992 (Disc 2) + 90 + + + 105 + No Prayer For The Dying + 90 + + + 106 + Piece Of Mind + 90 + + + 107 + Powerslave + 90 + + + 108 + Rock In Rio (CD1) + 90 + + + 109 + Rock In Rio (CD2) + 90 + + + 110 + Seventh Son of a Seventh Son + 90 + + + 111 + Somewhere in Time + 90 + + + 112 + The Number of The Beast + 90 + + + 113 + The X Factor + 90 + + + 114 + Virtual XI + 90 + + + 115 + Sex Machine + 91 + + + 116 + Emergency On Planet Earth + 92 + + + 117 + Synkronized + 92 + + + 118 + The Return Of The Space Cowboy + 92 + + + 119 + Get Born + 93 + + + 120 + Are You Experienced? + 94 + + + 121 + Surfing with the Alien (Remastered) + 95 + + + 122 + Jorge Ben Jor 25 Anos + 46 + + + 123 + Jota Quest-1995 + 96 + + + 124 + Cafezinho + 97 + + + 125 + Living After Midnight + 98 + + + 126 + Unplugged (Live) + 52 + + + 127 + BBC Sessions (Disc 2) (Live) + 22 + + + 128 + Coda + 22 + + + 129 + Houses Of The Holy + 22 + + + 130 + In Through The Out Door + 22 + + + 131 + IV + 22 + + + 132 + Led Zeppelin I + 22 + + + 133 + Led Zeppelin II + 22 + + + 134 + Led Zeppelin III + 22 + + + 135 + Physical Graffiti (Disc 2) + 22 + + + 136 + Presence + 22 + + + 137 + The Song Remains The Same (Disc 1) + 22 + + + 138 + The Song Remains The Same (Disc 2) + 22 + + + 139 + A TempestadeTempestade Ou O Livro Dos Dias + 99 + + + 140 + Mais Do Mesmo + 99 + + + 141 + Greatest Hits + 100 + + + 142 + Lulu Santos - RCA 100 Anos De Música - Álbum 01 + 101 + + + 143 + Lulu Santos - RCA 100 Anos De Música - Álbum 02 + 101 + + + 144 + Misplaced Childhood + 102 + + + 145 + Barulhinho Bom + 103 + + + 146 + Seek And Shall Find: More Of The Best (1963-1981) + 104 + + + 147 + The Best Of Men At Work + 105 + + + 148 + Black Album + 50 + + + 149 + Garage Inc. (Disc 2) + 50 + + + 150 + Kill 'Em All + 50 + + + 151 + Load + 50 + + + 152 + Master Of Puppets + 50 + + + 153 + ReLoad + 50 + + + 154 + Ride The Lightning + 50 + + + 155 + St. Anger + 50 + + + 156 + ...And Justice For All + 50 + + + 157 + Miles Ahead + 68 + + + 158 + Milton Nascimento Ao Vivo + 42 + + + 159 + Minas + 42 + + + 160 + Ace Of Spades + 106 + + + 161 + Demorou... + 108 + + + 162 + Motley Crue Greatest Hits + 109 + + + 163 + From The Muddy Banks Of The Wishkah (Live) + 110 + + + 164 + Nevermind + 110 + + + 165 + Compositores + 111 + + + 166 + Olodum + 112 + + + 167 + Acústico MTV + 113 + + + 168 + Arquivo II + 113 + + + 169 + Arquivo Os Paralamas Do Sucesso + 113 + + + 170 + Bark at the Moon (Remastered) + 114 + + + 171 + Blizzard of Ozz + 114 + + + 172 + Diary of a Madman (Remastered) + 114 + + + 173 + No More Tears (Remastered) + 114 + + + 174 + Tribute + 114 + + + 175 + Walking Into Clarksdale + 115 + + + 176 + Original Soundtracks 1 + 116 + + + 177 + The Beast Live + 117 + + + 178 + Live On Two Legs (Live) + 118 + + + 179 + Pearl Jam + 118 + + + 180 + Riot Act + 118 + + + 181 + Ten + 118 + + + 182 + Vs. + 118 + + + 183 + Dark Side Of The Moon + 120 + + + 184 + Os Cães Ladram Mas A Caravana Não Pára + 121 + + + 185 + Greatest Hits I + 51 + + + 186 + News Of The World + 51 + + + 187 + Out Of Time + 122 + + + 188 + Green + 124 + + + 189 + New Adventures In Hi-Fi + 124 + + + 190 + The Best Of R.E.M.: The IRS Years + 124 + + + 191 + Cesta Básica + 125 + + + 192 + Raul Seixas + 126 + + + 193 + Blood Sugar Sex Magik + 127 + + + 194 + By The Way + 127 + + + 195 + Californication + 127 + + + 196 + Retrospective I (1974-1980) + 128 + + + 197 + Santana - As Years Go By + 59 + + + 198 + Santana Live + 59 + + + 199 + Maquinarama + 130 + + + 200 + O Samba Poconé + 130 + + + 201 + Judas 0: B-Sides and Rarities + 131 + + + 202 + Rotten Apples: Greatest Hits + 131 + + + 203 + A-Sides + 132 + + + 204 + Morning Dance + 53 + + + 205 + In Step + 133 + + + 206 + Core + 134 + + + 207 + Mezmerize + 135 + + + 208 + (1997) Black Light Syndrome + 136 + + + 209 + Live (Disc 1) + 137 + + + 210 + Live (Disc 2) + 137 + + + 211 + The Singles + 138 + + + 212 + Beyond Good And Evil + 139 + + + 213 + Pure Cult: The Best Of The Cult (For Rockers, Ravers, Lovers & Sinners) (UK) + 139 + + + 214 + The Doors + 140 + + + 215 + The Police Greatest Hits + 141 + + + 216 + Hot Rocks, 1964-1971 (Disc 1) + 142 + + + 217 + No Security + 142 + + + 218 + Voodoo Lounge + 142 + + + 219 + Tangents + 143 + + + 220 + Transmission + 143 + + + 221 + My Generation - The Very Best Of The Who + 144 + + + 222 + Serie Sem Limite (Disc 1) + 145 + + + 223 + Serie Sem Limite (Disc 2) + 145 + + + 224 + Acústico + 146 + + + 225 + Volume Dois + 146 + + + 226 + Battlestar Galactica: The Story So Far + 147 + + + 227 + Battlestar Galactica, Season 3 + 147 + + + 228 + Heroes, Season 1 + 148 + + + 229 + Lost, Season 3 + 149 + + + 230 + Lost, Season 1 + 149 + + + 231 + Lost, Season 2 + 149 + + + 232 + Achtung Baby + 150 + + + 233 + All That You Can't Leave Behind + 150 + + + 234 + B-Sides 1980-1990 + 150 + + + 235 + How To Dismantle An Atomic Bomb + 150 + + + 236 + Pop + 150 + + + 237 + Rattle And Hum + 150 + + + 238 + The Best Of 1980-1990 + 150 + + + 239 + War + 150 + + + 240 + Zooropa + 150 + + + 241 + UB40 The Best Of - Volume Two (UK) + 151 + + + 242 + Diver Down + 152 + + + 243 + The Best Of Van Halen, Vol. I + 152 + + + 244 + Van Halen + 152 + + + 245 + Van Halen III + 152 + + + 246 + Contraband + 153 + + + 247 + Vinicius De Moraes + 72 + + + 248 + Ao Vivo (IMPORT) + 155 + + + 249 + The Office, Season 1 + 156 + + + 250 + The Office, Season 2 + 156 + + + 251 + The Office, Season 3 + 156 + + + 252 + Un-Led-Ed + 157 + + + 253 + Battlestar Galactica (Classic), Season 1 + 158 + + + 254 + Aquaman + 159 + + + 255 + Instant Karma: The Amnesty International Campaign to Save Darfur + 150 + + + 256 + Speak of the Devil + 114 + + + 257 + 20th Century Masters - The Millennium Collection: The Best of Scorpions + 179 + + + 258 + House of Pain + 180 + + + 259 + Radio Brasil (O Som da Jovem Vanguarda) - Seleccao de Henrique Amaro + 36 + + + 260 + Cake: B-Sides and Rarities + 196 + + + 261 + LOST, Season 4 + 149 + + + 262 + Quiet Songs + 197 + + + 263 + Muso Ko + 198 + + + 264 + Realize + 199 + + + 265 + Every Kind of Light + 200 + + + 266 + Duos II + 201 + + + 267 + Worlds + 202 + + + 268 + The Best of Beethoven + 203 + + + 269 + Temple of the Dog + 204 + + + 270 + Carry On + 205 + + + 271 + Revelations + 8 + + + 272 + Adorate Deum: Gregorian Chant from the Proper of the Mass + 206 + + + 273 + Allegri: Miserere + 207 + + + 274 + Pachelbel: Canon & Gigue + 208 + + + 275 + Vivaldi: The Four Seasons + 209 + + + 276 + Bach: Violin Concertos + 210 + + + 277 + Bach: Goldberg Variations + 211 + + + 278 + Bach: The Cello Suites + 212 + + + 279 + Handel: The Messiah (Highlights) + 213 + + + 280 + The World of Classical Favourites + 214 + + + 281 + Sir Neville Marriner: A Celebration + 215 + + + 282 + Mozart: Wind Concertos + 216 + + + 283 + Haydn: Symphonies 99 - 104 + 217 + + + 284 + Beethoven: Symhonies Nos. 5 & 6 + 218 + + + 285 + A Soprano Inspired + 219 + + + 286 + Great Opera Choruses + 220 + + + 287 + Wagner: Favourite Overtures + 221 + + + 288 + Fauré: Requiem, Ravel: Pavane & Others + 222 + + + 289 + Tchaikovsky: The Nutcracker + 223 + + + 290 + The Last Night of the Proms + 224 + + + 291 + Puccini: Madama Butterfly - Highlights + 225 + + + 292 + Holst: The Planets, Op. 32 & Vaughan Williams: Fantasies + 226 + + + 293 + Pavarotti's Opera Made Easy + 227 + + + 294 + Great Performances - Barber's Adagio and Other Romantic Favorites for Strings + 228 + + + 295 + Carmina Burana + 229 + + + 296 + A Copland Celebration, Vol. I + 230 + + + 297 + Bach: Toccata & Fugue in D Minor + 231 + + + 298 + Prokofiev: Symphony No.1 + 232 + + + 299 + Scheherazade + 233 + + + 300 + Bach: The Brandenburg Concertos + 234 + + + 301 + Chopin: Piano Concertos Nos. 1 & 2 + 235 + + + 302 + Mascagni: Cavalleria Rusticana + 236 + + + 303 + Sibelius: Finlandia + 237 + + + 304 + Beethoven Piano Sonatas: Moonlight & Pastorale + 238 + + + 305 + Great Recordings of the Century - Mahler: Das Lied von der Erde + 240 + + + 306 + Elgar: Cello Concerto & Vaughan Williams: Fantasias + 241 + + + 307 + Adams, John: The Chairman Dances + 242 + + + 308 + Tchaikovsky: 1812 Festival Overture, Op.49, Capriccio Italien & Beethoven: Wellington's Victory + 243 + + + 309 + Palestrina: Missa Papae Marcelli & Allegri: Miserere + 244 + + + 310 + Prokofiev: Romeo & Juliet + 245 + + + 311 + Strauss: Waltzes + 226 + + + 312 + Berlioz: Symphonie Fantastique + 245 + + + 313 + Bizet: Carmen Highlights + 246 + + + 314 + English Renaissance + 247 + + + 315 + Handel: Music for the Royal Fireworks (Original Version 1749) + 208 + + + 316 + Grieg: Peer Gynt Suites & Sibelius: Pelléas et Mélisande + 248 + + + 317 + Mozart Gala: Famous Arias + 249 + + + 318 + SCRIABIN: Vers la flamme + 250 + + + 319 + Armada: Music from the Courts of England and Spain + 251 + + + 320 + Mozart: Symphonies Nos. 40 & 41 + 248 + + + 321 + Back to Black + 252 + + + 322 + Frank + 252 + + + 323 + Carried to Dust (Bonus Track Version) + 253 + + + 324 + Beethoven: Symphony No. 6 'Pastoral' Etc. + 254 + + + 325 + Bartok: Violin & Viola Concertos + 255 + + + 326 + Mendelssohn: A Midsummer Night's Dream + 256 + + + 327 + Bach: Orchestral Suites Nos. 1 - 4 + 257 + + + 328 + Charpentier: Divertissements, Airs & Concerts + 258 + + + 329 + South American Getaway + 259 + + + 330 + Górecki: Symphony No. 3 + 260 + + + 331 + Purcell: The Fairy Queen + 261 + + + 332 + The Ultimate Relexation Album + 262 + + + 333 + Purcell: Music for the Queen Mary + 263 + + + 334 + Weill: The Seven Deadly Sins + 264 + + + 335 + J.S. Bach: Chaconne, Suite in E Minor, Partita in E Major & Prelude, Fugue and Allegro + 265 + + + 336 + Prokofiev: Symphony No.5 & Stravinksy: Le Sacre Du Printemps + 248 + + + 337 + Szymanowski: Piano Works, Vol. 1 + 266 + + + 338 + Nielsen: The Six Symphonies + 267 + + + 339 + Great Recordings of the Century: Paganini's 24 Caprices + 268 + + + 340 + Liszt - 12 Études D'Execution Transcendante + 269 + + + 341 + Great Recordings of the Century - Shubert: Schwanengesang, 4 Lieder + 270 + + + 342 + Locatelli: Concertos for Violin, Strings and Continuo, Vol. 3 + 271 + + + 343 + Respighi:Pines of Rome + 226 + + + 344 + Schubert: The Late String Quartets & String Quintet (3 CD's) + 272 + + + 345 + Monteverdi: L'Orfeo + 273 + + + 346 + Mozart: Chamber Music + 274 + + + 347 + Koyaanisqatsi (Soundtrack from the Motion Picture) + 275 + + + + + + System.Int32 + System.String + + + + 1 + AC/DC + + + 2 + Accept + + + 3 + Aerosmith + + + 4 + Alanis Morissette + + + 5 + Alice In Chains + + + 6 + Antônio Carlos Jobim + + + 7 + Apocalyptica + + + 8 + Audioslave + + + 9 + BackBeat + + + 10 + Billy Cobham + + + 11 + Black Label Society + + + 12 + Black Sabbath + + + 13 + Body Count + + + 14 + Bruce Dickinson + + + 15 + Buddy Guy + + + 16 + Caetano Veloso + + + 17 + Chico Buarque + + + 18 + Chico Science & Nação Zumbi + + + 19 + Cidade Negra + + + 20 + Cláudio Zoli + + + 21 + Various Artists + + + 22 + Led Zeppelin + + + 23 + Frank Zappa & Captain Beefheart + + + 24 + Marcos Valle + + + 25 + Milton Nascimento & Bebeto + + + 26 + Azymuth + + + 27 + Gilberto Gil + + + 28 + João Gilberto + + + 29 + Bebel Gilberto + + + 30 + Jorge Vercilo + + + 31 + Baby Consuelo + + + 32 + Ney Matogrosso + + + 33 + Luiz Melodia + + + 34 + Nando Reis + + + 35 + Pedro Luís & A Parede + + + 36 + O Rappa + + + 37 + Ed Motta + + + 38 + Banda Black Rio + + + 39 + Fernanda Porto + + + 40 + Os Cariocas + + + 41 + Elis Regina + + + 42 + Milton Nascimento + + + 43 + A Cor Do Som + + + 44 + Kid Abelha + + + 45 + Sandra De Sá + + + 46 + Jorge Ben + + + 47 + Hermeto Pascoal + + + 48 + Barão Vermelho + + + 49 + Edson, DJ Marky & DJ Patife Featuring Fernanda Porto + + + 50 + Metallica + + + 51 + Queen + + + 52 + Kiss + + + 53 + Spyro Gyra + + + 54 + Green Day + + + 55 + David Coverdale + + + 56 + Gonzaguinha + + + 57 + Os Mutantes + + + 58 + Deep Purple + + + 59 + Santana + + + 60 + Santana Feat. Dave Matthews + + + 61 + Santana Feat. Everlast + + + 62 + Santana Feat. Rob Thomas + + + 63 + Santana Feat. Lauryn Hill & Cee-Lo + + + 64 + Santana Feat. The Project G&B + + + 65 + Santana Feat. Maná + + + 66 + Santana Feat. Eagle-Eye Cherry + + + 67 + Santana Feat. Eric Clapton + + + 68 + Miles Davis + + + 69 + Gene Krupa + + + 70 + Toquinho & Vinícius + + + 71 + Vinícius De Moraes & Baden Powell + + + 72 + Vinícius De Moraes + + + 73 + Vinícius E Qurteto Em Cy + + + 74 + Vinícius E Odette Lara + + + 75 + Vinicius, Toquinho & Quarteto Em Cy + + + 76 + Creedence Clearwater Revival + + + 77 + Cássia Eller + + + 78 + Def Leppard + + + 79 + Dennis Chambers + + + 80 + Djavan + + + 81 + Eric Clapton + + + 82 + Faith No More + + + 83 + Falamansa + + + 84 + Foo Fighters + + + 85 + Frank Sinatra + + + 86 + Funk Como Le Gusta + + + 87 + Godsmack + + + 88 + Guns N' Roses + + + 89 + Incognito + + + 90 + Iron Maiden + + + 91 + James Brown + + + 92 + Jamiroquai + + + 93 + JET + + + 94 + Jimi Hendrix + + + 95 + Joe Satriani + + + 96 + Jota Quest + + + 97 + João Suplicy + + + 98 + Judas Priest + + + 99 + Legião Urbana + + + 100 + Lenny Kravitz + + + 101 + Lulu Santos + + + 102 + Marillion + + + 103 + Marisa Monte + + + 104 + Marvin Gaye + + + 105 + Men At Work + + + 106 + Motörhead + + + 107 + Motörhead & Girlschool + + + 108 + Mônica Marianno + + + 109 + Mötley Crüe + + + 110 + Nirvana + + + 111 + O Terço + + + 112 + Olodum + + + 113 + Os Paralamas Do Sucesso + + + 114 + Ozzy Osbourne + + + 115 + Page & Plant + + + 116 + Passengers + + + 117 + Paul D'Ianno + + + 118 + Pearl Jam + + + 119 + Peter Tosh + + + 120 + Pink Floyd + + + 121 + Planet Hemp + + + 122 + R.E.M. Feat. Kate Pearson + + + 123 + R.E.M. Feat. KRS-One + + + 124 + R.E.M. + + + 125 + Raimundos + + + 126 + Raul Seixas + + + 127 + Red Hot Chili Peppers + + + 128 + Rush + + + 129 + Simply Red + + + 130 + Skank + + + 131 + Smashing Pumpkins + + + 132 + Soundgarden + + + 133 + Stevie Ray Vaughan & Double Trouble + + + 134 + Stone Temple Pilots + + + 135 + System Of A Down + + + 136 + Terry Bozzio, Tony Levin & Steve Stevens + + + 137 + The Black Crowes + + + 138 + The Clash + + + 139 + The Cult + + + 140 + The Doors + + + 141 + The Police + + + 142 + The Rolling Stones + + + 143 + The Tea Party + + + 144 + The Who + + + 145 + Tim Maia + + + 146 + Titãs + + + 147 + Battlestar Galactica + + + 148 + Heroes + + + 149 + Lost + + + 150 + U2 + + + 151 + UB40 + + + 152 + Van Halen + + + 153 + Velvet Revolver + + + 154 + Whitesnake + + + 155 + Zeca Pagodinho + + + 156 + The Office + + + 157 + Dread Zeppelin + + + 158 + Battlestar Galactica (Classic) + + + 159 + Aquaman + + + 160 + Christina Aguilera featuring BigElf + + + 161 + Aerosmith & Sierra Leone's Refugee Allstars + + + 162 + Los Lonely Boys + + + 163 + Corinne Bailey Rae + + + 164 + Dhani Harrison & Jakob Dylan + + + 165 + Jackson Browne + + + 166 + Avril Lavigne + + + 167 + Big & Rich + + + 168 + Youssou N'Dour + + + 169 + Black Eyed Peas + + + 170 + Jack Johnson + + + 171 + Ben Harper + + + 172 + Snow Patrol + + + 173 + Matisyahu + + + 174 + The Postal Service + + + 175 + Jaguares + + + 176 + The Flaming Lips + + + 177 + Jack's Mannequin & Mick Fleetwood + + + 178 + Regina Spektor + + + 179 + Scorpions + + + 180 + House Of Pain + + + 181 + Xis + + + 182 + Nega Gizza + + + 183 + Gustavo & Andres Veiga & Salazar + + + 184 + Rodox + + + 185 + Charlie Brown Jr. + + + 186 + Pedro Luís E A Parede + + + 187 + Los Hermanos + + + 188 + Mundo Livre S/A + + + 189 + Otto + + + 190 + Instituto + + + 191 + Nação Zumbi + + + 192 + DJ Dolores & Orchestra Santa Massa + + + 193 + Seu Jorge + + + 194 + Sabotage E Instituto + + + 195 + Stereo Maracana + + + 196 + Cake + + + 197 + Aisha Duo + + + 198 + Habib Koité and Bamada + + + 199 + Karsh Kale + + + 200 + The Posies + + + 201 + Luciana Souza/Romero Lubambo + + + 202 + Aaron Goldberg + + + 203 + Nicolaus Esterhazy Sinfonia + + + 204 + Temple of the Dog + + + 205 + Chris Cornell + + + 206 + Alberto Turco & Nova Schola Gregoriana + + + 207 + Richard Marlow & The Choir of Trinity College, Cambridge + + + 208 + English Concert & Trevor Pinnock + + + 209 + Anne-Sophie Mutter, Herbert Von Karajan & Wiener Philharmoniker + + + 210 + Hilary Hahn, Jeffrey Kahane, Los Angeles Chamber Orchestra & Margaret Batjer + + + 211 + Wilhelm Kempff + + + 212 + Yo-Yo Ma + + + 213 + Scholars Baroque Ensemble + + + 214 + Academy of St. Martin in the Fields & Sir Neville Marriner + + + 215 + Academy of St. Martin in the Fields Chamber Ensemble & Sir Neville Marriner + + + 216 + Berliner Philharmoniker, Claudio Abbado & Sabine Meyer + + + 217 + Royal Philharmonic Orchestra & Sir Thomas Beecham + + + 218 + Orchestre Révolutionnaire et Romantique & John Eliot Gardiner + + + 219 + Britten Sinfonia, Ivor Bolton & Lesley Garrett + + + 220 + Chicago Symphony Chorus, Chicago Symphony Orchestra & Sir Georg Solti + + + 221 + Sir Georg Solti & Wiener Philharmoniker + + + 222 + Academy of St. Martin in the Fields, John Birch, Sir Neville Marriner & Sylvia McNair + + + 223 + London Symphony Orchestra & Sir Charles Mackerras + + + 224 + Barry Wordsworth & BBC Concert Orchestra + + + 225 + Herbert Von Karajan, Mirella Freni & Wiener Philharmoniker + + + 226 + Eugene Ormandy + + + 227 + Luciano Pavarotti + + + 228 + Leonard Bernstein & New York Philharmonic + + + 229 + Boston Symphony Orchestra & Seiji Ozawa + + + 230 + Aaron Copland & London Symphony Orchestra + + + 231 + Ton Koopman + + + 232 + Sergei Prokofiev & Yuri Temirkanov + + + 233 + Chicago Symphony Orchestra & Fritz Reiner + + + 234 + Orchestra of The Age of Enlightenment + + + 235 + Emanuel Ax, Eugene Ormandy & Philadelphia Orchestra + + + 236 + James Levine + + + 237 + Berliner Philharmoniker & Hans Rosbaud + + + 238 + Maurizio Pollini + + + 239 + Academy of St. Martin in the Fields, Sir Neville Marriner & William Bennett + + + 240 + Gustav Mahler + + + 241 + Felix Schmidt, London Symphony Orchestra & Rafael Frühbeck de Burgos + + + 242 + Edo de Waart & San Francisco Symphony + + + 243 + Antal Doráti & London Symphony Orchestra + + + 244 + Choir Of Westminster Abbey & Simon Preston + + + 245 + Michael Tilson Thomas & San Francisco Symphony + + + 246 + Chor der Wiener Staatsoper, Herbert Von Karajan & Wiener Philharmoniker + + + 247 + The King's Singers + + + 248 + Berliner Philharmoniker & Herbert Von Karajan + + + 249 + Sir Georg Solti, Sumi Jo & Wiener Philharmoniker + + + 250 + Christopher O'Riley + + + 251 + Fretwork + + + 252 + Amy Winehouse + + + 253 + Calexico + + + 254 + Otto Klemperer & Philharmonia Orchestra + + + 255 + Yehudi Menuhin + + + 256 + Philharmonia Orchestra & Sir Neville Marriner + + + 257 + Academy of St. Martin in the Fields, Sir Neville Marriner & Thurston Dart + + + 258 + Les Arts Florissants & William Christie + + + 259 + The 12 Cellists of The Berlin Philharmonic + + + 260 + Adrian Leaper & Doreen de Feis + + + 261 + Roger Norrington, London Classical Players + + + 262 + Charles Dutoit & L'Orchestre Symphonique de Montréal + + + 263 + Equale Brass Ensemble, John Eliot Gardiner & Munich Monteverdi Orchestra and Choir + + + 264 + Kent Nagano and Orchestre de l'Opéra de Lyon + + + 265 + Julian Bream + + + 266 + Martin Roscoe + + + 267 + Göteborgs Symfoniker & Neeme Järvi + + + 268 + Itzhak Perlman + + + 269 + Michele Campanella + + + 270 + Gerald Moore + + + 271 + Mela Tenenbaum, Pro Musica Prague & Richard Kapp + + + 272 + Emerson String Quartet + + + 273 + C. Monteverdi, Nigel Rogers - Chiaroscuro; London Baroque; London Cornett & Sackbu + + + 274 + Nash Ensemble + + + 275 + Philip Glass Ensemble + + + + + + System.Int32 + System.String + + + + 1 + Rock + + + 2 + Jazz + + + 3 + Metal + + + 4 + Alternative & Punk + + + 5 + Rock And Roll + + + 6 + Blues + + + 7 + Latin + + + 8 + Reggae + + + 9 + Pop + + + 10 + Soundtrack + + + 11 + Bossa Nova + + + 12 + Easy Listening + + + 13 + Heavy Metal + + + 14 + R&B/Soul + + + 15 + Electronica/Dance + + + 16 + World + + + 17 + Hip Hop/Rap + + + 18 + Science Fiction + + + 19 + TV Shows + + + 20 + Sci Fi & Fantasy + + + 21 + Drama + + + 22 + Comedy + + + 23 + Alternative + + + 24 + Classical + + + 25 + Opera + + + + + + System.Int32 + System.Decimal + System.Int32 + System.Int32 + System.Int32 + + + + 1 + 0.9900000000000000000 + 1 + 1 + 2 + + + 2 + 0.9900000000000000000 + 1 + 1 + 4 + + + 3 + 0.9900000000000000000 + 1 + 2 + 6 + + + 4 + 0.9900000000000000000 + 1 + 2 + 8 + + + 5 + 0.9900000000000000000 + 1 + 2 + 10 + + + 6 + 0.9900000000000000000 + 1 + 2 + 12 + + + 7 + 0.9900000000000000000 + 1 + 3 + 16 + + + 8 + 0.9900000000000000000 + 1 + 3 + 20 + + + 9 + 0.9900000000000000000 + 1 + 3 + 24 + + + 10 + 0.9900000000000000000 + 1 + 3 + 28 + + + 11 + 0.9900000000000000000 + 1 + 3 + 32 + + + 12 + 0.9900000000000000000 + 1 + 3 + 36 + + + 13 + 0.9900000000000000000 + 1 + 4 + 42 + + + 14 + 0.9900000000000000000 + 1 + 4 + 48 + + + 15 + 0.9900000000000000000 + 1 + 4 + 54 + + + 16 + 0.9900000000000000000 + 1 + 4 + 60 + + + 17 + 0.9900000000000000000 + 1 + 4 + 66 + + + 18 + 0.9900000000000000000 + 1 + 4 + 72 + + + 19 + 0.9900000000000000000 + 1 + 4 + 78 + + + 20 + 0.9900000000000000000 + 1 + 4 + 84 + + + 21 + 0.9900000000000000000 + 1 + 4 + 90 + + + 22 + 0.9900000000000000000 + 1 + 5 + 99 + + + 23 + 0.9900000000000000000 + 1 + 5 + 108 + + + 24 + 0.9900000000000000000 + 1 + 5 + 117 + + + 25 + 0.9900000000000000000 + 1 + 5 + 126 + + + 26 + 0.9900000000000000000 + 1 + 5 + 135 + + + 27 + 0.9900000000000000000 + 1 + 5 + 144 + + + 28 + 0.9900000000000000000 + 1 + 5 + 153 + + + 29 + 0.9900000000000000000 + 1 + 5 + 162 + + + 30 + 0.9900000000000000000 + 1 + 5 + 171 + + + 31 + 0.9900000000000000000 + 1 + 5 + 180 + + + 32 + 0.9900000000000000000 + 1 + 5 + 189 + + + 33 + 0.9900000000000000000 + 1 + 5 + 198 + + + 34 + 0.9900000000000000000 + 1 + 5 + 207 + + + 35 + 0.9900000000000000000 + 1 + 5 + 216 + + + 36 + 0.9900000000000000000 + 1 + 6 + 230 + + + 37 + 0.9900000000000000000 + 1 + 7 + 231 + + + 38 + 0.9900000000000000000 + 1 + 7 + 232 + + + 39 + 0.9900000000000000000 + 1 + 8 + 234 + + + 40 + 0.9900000000000000000 + 1 + 8 + 236 + + + 41 + 0.9900000000000000000 + 1 + 9 + 238 + + + 42 + 0.9900000000000000000 + 1 + 9 + 240 + + + 43 + 0.9900000000000000000 + 1 + 9 + 242 + + + 44 + 0.9900000000000000000 + 1 + 9 + 244 + + + 45 + 0.9900000000000000000 + 1 + 10 + 248 + + + 46 + 0.9900000000000000000 + 1 + 10 + 252 + + + 47 + 0.9900000000000000000 + 1 + 10 + 256 + + + 48 + 0.9900000000000000000 + 1 + 10 + 260 + + + 49 + 0.9900000000000000000 + 1 + 10 + 264 + + + 50 + 0.9900000000000000000 + 1 + 10 + 268 + + + 51 + 0.9900000000000000000 + 1 + 11 + 274 + + + 52 + 0.9900000000000000000 + 1 + 11 + 280 + + + 53 + 0.9900000000000000000 + 1 + 11 + 286 + + + 54 + 0.9900000000000000000 + 1 + 11 + 292 + + + 55 + 0.9900000000000000000 + 1 + 11 + 298 + + + 56 + 0.9900000000000000000 + 1 + 11 + 304 + + + 57 + 0.9900000000000000000 + 1 + 11 + 310 + + + 58 + 0.9900000000000000000 + 1 + 11 + 316 + + + 59 + 0.9900000000000000000 + 1 + 11 + 322 + + + 60 + 0.9900000000000000000 + 1 + 12 + 331 + + + 61 + 0.9900000000000000000 + 1 + 12 + 340 + + + 62 + 0.9900000000000000000 + 1 + 12 + 349 + + + 63 + 0.9900000000000000000 + 1 + 12 + 358 + + + 64 + 0.9900000000000000000 + 1 + 12 + 367 + + + 65 + 0.9900000000000000000 + 1 + 12 + 376 + + + 66 + 0.9900000000000000000 + 1 + 12 + 385 + + + 67 + 0.9900000000000000000 + 1 + 12 + 394 + + + 68 + 0.9900000000000000000 + 1 + 12 + 403 + + + 69 + 0.9900000000000000000 + 1 + 12 + 412 + + + 70 + 0.9900000000000000000 + 1 + 12 + 421 + + + 71 + 0.9900000000000000000 + 1 + 12 + 430 + + + 72 + 0.9900000000000000000 + 1 + 12 + 439 + + + 73 + 0.9900000000000000000 + 1 + 12 + 448 + + + 74 + 0.9900000000000000000 + 1 + 13 + 462 + + + 75 + 0.9900000000000000000 + 1 + 14 + 463 + + + 76 + 0.9900000000000000000 + 1 + 14 + 464 + + + 77 + 0.9900000000000000000 + 1 + 15 + 466 + + + 78 + 0.9900000000000000000 + 1 + 15 + 468 + + + 79 + 0.9900000000000000000 + 1 + 16 + 470 + + + 80 + 0.9900000000000000000 + 1 + 16 + 472 + + + 81 + 0.9900000000000000000 + 1 + 16 + 474 + + + 82 + 0.9900000000000000000 + 1 + 16 + 476 + + + 83 + 0.9900000000000000000 + 1 + 17 + 480 + + + 84 + 0.9900000000000000000 + 1 + 17 + 484 + + + 85 + 0.9900000000000000000 + 1 + 17 + 488 + + + 86 + 0.9900000000000000000 + 1 + 17 + 492 + + + 87 + 0.9900000000000000000 + 1 + 17 + 496 + + + 88 + 0.9900000000000000000 + 1 + 17 + 500 + + + 89 + 0.9900000000000000000 + 1 + 18 + 506 + + + 90 + 0.9900000000000000000 + 1 + 18 + 512 + + + 91 + 0.9900000000000000000 + 1 + 18 + 518 + + + 92 + 0.9900000000000000000 + 1 + 18 + 524 + + + 93 + 0.9900000000000000000 + 1 + 18 + 530 + + + 94 + 0.9900000000000000000 + 1 + 18 + 536 + + + 95 + 0.9900000000000000000 + 1 + 18 + 542 + + + 96 + 0.9900000000000000000 + 1 + 18 + 548 + + + 97 + 0.9900000000000000000 + 1 + 18 + 554 + + + 98 + 0.9900000000000000000 + 1 + 19 + 563 + + + 99 + 0.9900000000000000000 + 1 + 19 + 572 + + + 100 + 0.9900000000000000000 + 1 + 19 + 581 + + + 101 + 0.9900000000000000000 + 1 + 19 + 590 + + + 102 + 0.9900000000000000000 + 1 + 19 + 599 + + + 103 + 0.9900000000000000000 + 1 + 19 + 608 + + + 104 + 0.9900000000000000000 + 1 + 19 + 617 + + + 105 + 0.9900000000000000000 + 1 + 19 + 626 + + + 106 + 0.9900000000000000000 + 1 + 19 + 635 + + + 107 + 0.9900000000000000000 + 1 + 19 + 644 + + + 108 + 0.9900000000000000000 + 1 + 19 + 653 + + + 109 + 0.9900000000000000000 + 1 + 19 + 662 + + + 110 + 0.9900000000000000000 + 1 + 19 + 671 + + + 111 + 0.9900000000000000000 + 1 + 19 + 680 + + + 112 + 0.9900000000000000000 + 1 + 20 + 694 + + + 113 + 0.9900000000000000000 + 1 + 21 + 695 + + + 114 + 0.9900000000000000000 + 1 + 21 + 696 + + + 115 + 0.9900000000000000000 + 1 + 22 + 698 + + + 116 + 0.9900000000000000000 + 1 + 22 + 700 + + + 117 + 0.9900000000000000000 + 1 + 23 + 702 + + + 118 + 0.9900000000000000000 + 1 + 23 + 704 + + + 119 + 0.9900000000000000000 + 1 + 23 + 706 + + + 120 + 0.9900000000000000000 + 1 + 23 + 708 + + + 121 + 0.9900000000000000000 + 1 + 24 + 712 + + + 122 + 0.9900000000000000000 + 1 + 24 + 716 + + + 123 + 0.9900000000000000000 + 1 + 24 + 720 + + + 124 + 0.9900000000000000000 + 1 + 24 + 724 + + + 125 + 0.9900000000000000000 + 1 + 24 + 728 + + + 126 + 0.9900000000000000000 + 1 + 24 + 732 + + + 127 + 0.9900000000000000000 + 1 + 25 + 738 + + + 128 + 0.9900000000000000000 + 1 + 25 + 744 + + + 129 + 0.9900000000000000000 + 1 + 25 + 750 + + + 130 + 0.9900000000000000000 + 1 + 25 + 756 + + + 131 + 0.9900000000000000000 + 1 + 25 + 762 + + + 132 + 0.9900000000000000000 + 1 + 25 + 768 + + + 133 + 0.9900000000000000000 + 1 + 25 + 774 + + + 134 + 0.9900000000000000000 + 1 + 25 + 780 + + + 135 + 0.9900000000000000000 + 1 + 25 + 786 + + + 136 + 0.9900000000000000000 + 1 + 26 + 795 + + + 137 + 0.9900000000000000000 + 1 + 26 + 804 + + + 138 + 0.9900000000000000000 + 1 + 26 + 813 + + + 139 + 0.9900000000000000000 + 1 + 26 + 822 + + + 140 + 0.9900000000000000000 + 1 + 26 + 831 + + + 141 + 0.9900000000000000000 + 1 + 26 + 840 + + + 142 + 0.9900000000000000000 + 1 + 26 + 849 + + + 143 + 0.9900000000000000000 + 1 + 26 + 858 + + + 144 + 0.9900000000000000000 + 1 + 26 + 867 + + + 145 + 0.9900000000000000000 + 1 + 26 + 876 + + + 146 + 0.9900000000000000000 + 1 + 26 + 885 + + + 147 + 0.9900000000000000000 + 1 + 26 + 894 + + + 148 + 0.9900000000000000000 + 1 + 26 + 903 + + + 149 + 0.9900000000000000000 + 1 + 26 + 912 + + + 150 + 0.9900000000000000000 + 1 + 27 + 926 + + + 151 + 0.9900000000000000000 + 1 + 28 + 927 + + + 152 + 0.9900000000000000000 + 1 + 28 + 928 + + + 153 + 0.9900000000000000000 + 1 + 29 + 930 + + + 154 + 0.9900000000000000000 + 1 + 29 + 932 + + + 155 + 0.9900000000000000000 + 1 + 30 + 934 + + + 156 + 0.9900000000000000000 + 1 + 30 + 936 + + + 157 + 0.9900000000000000000 + 1 + 30 + 938 + + + 158 + 0.9900000000000000000 + 1 + 30 + 940 + + + 159 + 0.9900000000000000000 + 1 + 31 + 944 + + + 160 + 0.9900000000000000000 + 1 + 31 + 948 + + + 161 + 0.9900000000000000000 + 1 + 31 + 952 + + + 162 + 0.9900000000000000000 + 1 + 31 + 956 + + + 163 + 0.9900000000000000000 + 1 + 31 + 960 + + + 164 + 0.9900000000000000000 + 1 + 31 + 964 + + + 165 + 0.9900000000000000000 + 1 + 32 + 970 + + + 166 + 0.9900000000000000000 + 1 + 32 + 976 + + + 167 + 0.9900000000000000000 + 1 + 32 + 982 + + + 168 + 0.9900000000000000000 + 1 + 32 + 988 + + + 169 + 0.9900000000000000000 + 1 + 32 + 994 + + + 170 + 0.9900000000000000000 + 1 + 32 + 1000 + + + 171 + 0.9900000000000000000 + 1 + 32 + 1006 + + + 172 + 0.9900000000000000000 + 1 + 32 + 1012 + + + 173 + 0.9900000000000000000 + 1 + 32 + 1018 + + + 174 + 0.9900000000000000000 + 1 + 33 + 1027 + + + 175 + 0.9900000000000000000 + 1 + 33 + 1036 + + + 176 + 0.9900000000000000000 + 1 + 33 + 1045 + + + 177 + 0.9900000000000000000 + 1 + 33 + 1054 + + + 178 + 0.9900000000000000000 + 1 + 33 + 1063 + + + 179 + 0.9900000000000000000 + 1 + 33 + 1072 + + + 180 + 0.9900000000000000000 + 1 + 33 + 1081 + + + 181 + 0.9900000000000000000 + 1 + 33 + 1090 + + + 182 + 0.9900000000000000000 + 1 + 33 + 1099 + + + 183 + 0.9900000000000000000 + 1 + 33 + 1108 + + + 184 + 0.9900000000000000000 + 1 + 33 + 1117 + + + 185 + 0.9900000000000000000 + 1 + 33 + 1126 + + + 186 + 0.9900000000000000000 + 1 + 33 + 1135 + + + 187 + 0.9900000000000000000 + 1 + 33 + 1144 + + + 188 + 0.9900000000000000000 + 1 + 34 + 1158 + + + 189 + 0.9900000000000000000 + 1 + 35 + 1159 + + + 190 + 0.9900000000000000000 + 1 + 35 + 1160 + + + 191 + 0.9900000000000000000 + 1 + 36 + 1162 + + + 192 + 0.9900000000000000000 + 1 + 36 + 1164 + + + 193 + 0.9900000000000000000 + 1 + 37 + 1166 + + + 194 + 0.9900000000000000000 + 1 + 37 + 1168 + + + 195 + 0.9900000000000000000 + 1 + 37 + 1170 + + + 196 + 0.9900000000000000000 + 1 + 37 + 1172 + + + 197 + 0.9900000000000000000 + 1 + 38 + 1176 + + + 198 + 0.9900000000000000000 + 1 + 38 + 1180 + + + 199 + 0.9900000000000000000 + 1 + 38 + 1184 + + + 200 + 0.9900000000000000000 + 1 + 38 + 1188 + + + 201 + 0.9900000000000000000 + 1 + 38 + 1192 + + + 202 + 0.9900000000000000000 + 1 + 38 + 1196 + + + 203 + 0.9900000000000000000 + 1 + 39 + 1202 + + + 204 + 0.9900000000000000000 + 1 + 39 + 1208 + + + 205 + 0.9900000000000000000 + 1 + 39 + 1214 + + + 206 + 0.9900000000000000000 + 1 + 39 + 1220 + + + 207 + 0.9900000000000000000 + 1 + 39 + 1226 + + + 208 + 0.9900000000000000000 + 1 + 39 + 1232 + + + 209 + 0.9900000000000000000 + 1 + 39 + 1238 + + + 210 + 0.9900000000000000000 + 1 + 39 + 1244 + + + 211 + 0.9900000000000000000 + 1 + 39 + 1250 + + + 212 + 0.9900000000000000000 + 1 + 40 + 1259 + + + 213 + 0.9900000000000000000 + 1 + 40 + 1268 + + + 214 + 0.9900000000000000000 + 1 + 40 + 1277 + + + 215 + 0.9900000000000000000 + 1 + 40 + 1286 + + + 216 + 0.9900000000000000000 + 1 + 40 + 1295 + + + 217 + 0.9900000000000000000 + 1 + 40 + 1304 + + + 218 + 0.9900000000000000000 + 1 + 40 + 1313 + + + 219 + 0.9900000000000000000 + 1 + 40 + 1322 + + + 220 + 0.9900000000000000000 + 1 + 40 + 1331 + + + 221 + 0.9900000000000000000 + 1 + 40 + 1340 + + + 222 + 0.9900000000000000000 + 1 + 40 + 1349 + + + 223 + 0.9900000000000000000 + 1 + 40 + 1358 + + + 224 + 0.9900000000000000000 + 1 + 40 + 1367 + + + 225 + 0.9900000000000000000 + 1 + 40 + 1376 + + + 226 + 0.9900000000000000000 + 1 + 41 + 1390 + + + 227 + 0.9900000000000000000 + 1 + 42 + 1391 + + + 228 + 0.9900000000000000000 + 1 + 42 + 1392 + + + 229 + 0.9900000000000000000 + 1 + 43 + 1394 + + + 230 + 0.9900000000000000000 + 1 + 43 + 1396 + + + 231 + 0.9900000000000000000 + 1 + 44 + 1398 + + + 232 + 0.9900000000000000000 + 1 + 44 + 1400 + + + 233 + 0.9900000000000000000 + 1 + 44 + 1402 + + + 234 + 0.9900000000000000000 + 1 + 44 + 1404 + + + 235 + 0.9900000000000000000 + 1 + 45 + 1408 + + + 236 + 0.9900000000000000000 + 1 + 45 + 1412 + + + 237 + 0.9900000000000000000 + 1 + 45 + 1416 + + + 238 + 0.9900000000000000000 + 1 + 45 + 1420 + + + 239 + 0.9900000000000000000 + 1 + 45 + 1424 + + + 240 + 0.9900000000000000000 + 1 + 45 + 1428 + + + 241 + 0.9900000000000000000 + 1 + 46 + 1434 + + + 242 + 0.9900000000000000000 + 1 + 46 + 1440 + + + 243 + 0.9900000000000000000 + 1 + 46 + 1446 + + + 244 + 0.9900000000000000000 + 1 + 46 + 1452 + + + 245 + 0.9900000000000000000 + 1 + 46 + 1458 + + + 246 + 0.9900000000000000000 + 1 + 46 + 1464 + + + 247 + 0.9900000000000000000 + 1 + 46 + 1470 + + + 248 + 0.9900000000000000000 + 1 + 46 + 1476 + + + 249 + 0.9900000000000000000 + 1 + 46 + 1482 + + + 250 + 0.9900000000000000000 + 1 + 47 + 1491 + + + 251 + 0.9900000000000000000 + 1 + 47 + 1500 + + + 252 + 0.9900000000000000000 + 1 + 47 + 1509 + + + 253 + 0.9900000000000000000 + 1 + 47 + 1518 + + + 254 + 0.9900000000000000000 + 1 + 47 + 1527 + + + 255 + 0.9900000000000000000 + 1 + 47 + 1536 + + + 256 + 0.9900000000000000000 + 1 + 47 + 1545 + + + 257 + 0.9900000000000000000 + 1 + 47 + 1554 + + + 258 + 0.9900000000000000000 + 1 + 47 + 1563 + + + 259 + 0.9900000000000000000 + 1 + 47 + 1572 + + + 260 + 0.9900000000000000000 + 1 + 47 + 1581 + + + 261 + 0.9900000000000000000 + 1 + 47 + 1590 + + + 262 + 0.9900000000000000000 + 1 + 47 + 1599 + + + 263 + 0.9900000000000000000 + 1 + 47 + 1608 + + + 264 + 0.9900000000000000000 + 1 + 48 + 1622 + + + 265 + 0.9900000000000000000 + 1 + 49 + 1623 + + + 266 + 0.9900000000000000000 + 1 + 49 + 1624 + + + 267 + 0.9900000000000000000 + 1 + 50 + 1626 + + + 268 + 0.9900000000000000000 + 1 + 50 + 1628 + + + 269 + 0.9900000000000000000 + 1 + 51 + 1630 + + + 270 + 0.9900000000000000000 + 1 + 51 + 1632 + + + 271 + 0.9900000000000000000 + 1 + 51 + 1634 + + + 272 + 0.9900000000000000000 + 1 + 51 + 1636 + + + 273 + 0.9900000000000000000 + 1 + 52 + 1640 + + + 274 + 0.9900000000000000000 + 1 + 52 + 1644 + + + 275 + 0.9900000000000000000 + 1 + 52 + 1648 + + + 276 + 0.9900000000000000000 + 1 + 52 + 1652 + + + 277 + 0.9900000000000000000 + 1 + 52 + 1656 + + + 278 + 0.9900000000000000000 + 1 + 52 + 1660 + + + 279 + 0.9900000000000000000 + 1 + 53 + 1666 + + + 280 + 0.9900000000000000000 + 1 + 53 + 1672 + + + 281 + 0.9900000000000000000 + 1 + 53 + 1678 + + + 282 + 0.9900000000000000000 + 1 + 53 + 1684 + + + 283 + 0.9900000000000000000 + 1 + 53 + 1690 + + + 284 + 0.9900000000000000000 + 1 + 53 + 1696 + + + 285 + 0.9900000000000000000 + 1 + 53 + 1702 + + + 286 + 0.9900000000000000000 + 1 + 53 + 1708 + + + 287 + 0.9900000000000000000 + 1 + 53 + 1714 + + + 288 + 0.9900000000000000000 + 1 + 54 + 1723 + + + 289 + 0.9900000000000000000 + 1 + 54 + 1732 + + + 290 + 0.9900000000000000000 + 1 + 54 + 1741 + + + 291 + 0.9900000000000000000 + 1 + 54 + 1750 + + + 292 + 0.9900000000000000000 + 1 + 54 + 1759 + + + 293 + 0.9900000000000000000 + 1 + 54 + 1768 + + + 294 + 0.9900000000000000000 + 1 + 54 + 1777 + + + 295 + 0.9900000000000000000 + 1 + 54 + 1786 + + + 296 + 0.9900000000000000000 + 1 + 54 + 1795 + + + 297 + 0.9900000000000000000 + 1 + 54 + 1804 + + + 298 + 0.9900000000000000000 + 1 + 54 + 1813 + + + 299 + 0.9900000000000000000 + 1 + 54 + 1822 + + + 300 + 0.9900000000000000000 + 1 + 54 + 1831 + + + 301 + 0.9900000000000000000 + 1 + 54 + 1840 + + + 302 + 0.9900000000000000000 + 1 + 55 + 1854 + + + 303 + 0.9900000000000000000 + 1 + 56 + 1855 + + + 304 + 0.9900000000000000000 + 1 + 56 + 1856 + + + 305 + 0.9900000000000000000 + 1 + 57 + 1858 + + + 306 + 0.9900000000000000000 + 1 + 57 + 1860 + + + 307 + 0.9900000000000000000 + 1 + 58 + 1862 + + + 308 + 0.9900000000000000000 + 1 + 58 + 1864 + + + 309 + 0.9900000000000000000 + 1 + 58 + 1866 + + + 310 + 0.9900000000000000000 + 1 + 58 + 1868 + + + 311 + 0.9900000000000000000 + 1 + 59 + 1872 + + + 312 + 0.9900000000000000000 + 1 + 59 + 1876 + + + 313 + 0.9900000000000000000 + 1 + 59 + 1880 + + + 314 + 0.9900000000000000000 + 1 + 59 + 1884 + + + 315 + 0.9900000000000000000 + 1 + 59 + 1888 + + + 316 + 0.9900000000000000000 + 1 + 59 + 1892 + + + 317 + 0.9900000000000000000 + 1 + 60 + 1898 + + + 318 + 0.9900000000000000000 + 1 + 60 + 1904 + + + 319 + 0.9900000000000000000 + 1 + 60 + 1910 + + + 320 + 0.9900000000000000000 + 1 + 60 + 1916 + + + 321 + 0.9900000000000000000 + 1 + 60 + 1922 + + + 322 + 0.9900000000000000000 + 1 + 60 + 1928 + + + 323 + 0.9900000000000000000 + 1 + 60 + 1934 + + + 324 + 0.9900000000000000000 + 1 + 60 + 1940 + + + 325 + 0.9900000000000000000 + 1 + 60 + 1946 + + + 326 + 0.9900000000000000000 + 1 + 61 + 1955 + + + 327 + 0.9900000000000000000 + 1 + 61 + 1964 + + + 328 + 0.9900000000000000000 + 1 + 61 + 1973 + + + 329 + 0.9900000000000000000 + 1 + 61 + 1982 + + + 330 + 0.9900000000000000000 + 1 + 61 + 1991 + + + 331 + 0.9900000000000000000 + 1 + 61 + 2000 + + + 332 + 0.9900000000000000000 + 1 + 61 + 2009 + + + 333 + 0.9900000000000000000 + 1 + 61 + 2018 + + + 334 + 0.9900000000000000000 + 1 + 61 + 2027 + + + 335 + 0.9900000000000000000 + 1 + 61 + 2036 + + + 336 + 0.9900000000000000000 + 1 + 61 + 2045 + + + 337 + 0.9900000000000000000 + 1 + 61 + 2054 + + + 338 + 0.9900000000000000000 + 1 + 61 + 2063 + + + 339 + 0.9900000000000000000 + 1 + 61 + 2072 + + + 340 + 0.9900000000000000000 + 1 + 62 + 2086 + + + 341 + 0.9900000000000000000 + 1 + 63 + 2087 + + + 342 + 0.9900000000000000000 + 1 + 63 + 2088 + + + 343 + 0.9900000000000000000 + 1 + 64 + 2090 + + + 344 + 0.9900000000000000000 + 1 + 64 + 2092 + + + 345 + 0.9900000000000000000 + 1 + 65 + 2094 + + + 346 + 0.9900000000000000000 + 1 + 65 + 2096 + + + 347 + 0.9900000000000000000 + 1 + 65 + 2098 + + + 348 + 0.9900000000000000000 + 1 + 65 + 2100 + + + 349 + 0.9900000000000000000 + 1 + 66 + 2104 + + + 350 + 0.9900000000000000000 + 1 + 66 + 2108 + + + 351 + 0.9900000000000000000 + 1 + 66 + 2112 + + + 352 + 0.9900000000000000000 + 1 + 66 + 2116 + + + 353 + 0.9900000000000000000 + 1 + 66 + 2120 + + + 354 + 0.9900000000000000000 + 1 + 66 + 2124 + + + 355 + 0.9900000000000000000 + 1 + 67 + 2130 + + + 356 + 0.9900000000000000000 + 1 + 67 + 2136 + + + 357 + 0.9900000000000000000 + 1 + 67 + 2142 + + + 358 + 0.9900000000000000000 + 1 + 67 + 2148 + + + 359 + 0.9900000000000000000 + 1 + 67 + 2154 + + + 360 + 0.9900000000000000000 + 1 + 67 + 2160 + + + 361 + 0.9900000000000000000 + 1 + 67 + 2166 + + + 362 + 0.9900000000000000000 + 1 + 67 + 2172 + + + 363 + 0.9900000000000000000 + 1 + 67 + 2178 + + + 364 + 0.9900000000000000000 + 1 + 68 + 2187 + + + 365 + 0.9900000000000000000 + 1 + 68 + 2196 + + + 366 + 0.9900000000000000000 + 1 + 68 + 2205 + + + 367 + 0.9900000000000000000 + 1 + 68 + 2214 + + + 368 + 0.9900000000000000000 + 1 + 68 + 2223 + + + 369 + 0.9900000000000000000 + 1 + 68 + 2232 + + + 370 + 0.9900000000000000000 + 1 + 68 + 2241 + + + 371 + 0.9900000000000000000 + 1 + 68 + 2250 + + + 372 + 0.9900000000000000000 + 1 + 68 + 2259 + + + 373 + 0.9900000000000000000 + 1 + 68 + 2268 + + + 374 + 0.9900000000000000000 + 1 + 68 + 2277 + + + 375 + 0.9900000000000000000 + 1 + 68 + 2286 + + + 376 + 0.9900000000000000000 + 1 + 68 + 2295 + + + 377 + 0.9900000000000000000 + 1 + 68 + 2304 + + + 378 + 0.9900000000000000000 + 1 + 69 + 2318 + + + 379 + 0.9900000000000000000 + 1 + 70 + 2319 + + + 380 + 0.9900000000000000000 + 1 + 70 + 2320 + + + 381 + 0.9900000000000000000 + 1 + 71 + 2322 + + + 382 + 0.9900000000000000000 + 1 + 71 + 2324 + + + 383 + 0.9900000000000000000 + 1 + 72 + 2326 + + + 384 + 0.9900000000000000000 + 1 + 72 + 2328 + + + 385 + 0.9900000000000000000 + 1 + 72 + 2330 + + + 386 + 0.9900000000000000000 + 1 + 72 + 2332 + + + 387 + 0.9900000000000000000 + 1 + 73 + 2336 + + + 388 + 0.9900000000000000000 + 1 + 73 + 2340 + + + 389 + 0.9900000000000000000 + 1 + 73 + 2344 + + + 390 + 0.9900000000000000000 + 1 + 73 + 2348 + + + 391 + 0.9900000000000000000 + 1 + 73 + 2352 + + + 392 + 0.9900000000000000000 + 1 + 73 + 2356 + + + 393 + 0.9900000000000000000 + 1 + 74 + 2362 + + + 394 + 0.9900000000000000000 + 1 + 74 + 2368 + + + 395 + 0.9900000000000000000 + 1 + 74 + 2374 + + + 396 + 0.9900000000000000000 + 1 + 74 + 2380 + + + 397 + 0.9900000000000000000 + 1 + 74 + 2386 + + + 398 + 0.9900000000000000000 + 1 + 74 + 2392 + + + 399 + 0.9900000000000000000 + 1 + 74 + 2398 + + + 400 + 0.9900000000000000000 + 1 + 74 + 2404 + + + 401 + 0.9900000000000000000 + 1 + 74 + 2410 + + + 402 + 0.9900000000000000000 + 1 + 75 + 2419 + + + 403 + 0.9900000000000000000 + 1 + 75 + 2428 + + + 404 + 0.9900000000000000000 + 1 + 75 + 2437 + + + 405 + 0.9900000000000000000 + 1 + 75 + 2446 + + + 406 + 0.9900000000000000000 + 1 + 75 + 2455 + + + 407 + 0.9900000000000000000 + 1 + 75 + 2464 + + + 408 + 0.9900000000000000000 + 1 + 75 + 2473 + + + 409 + 0.9900000000000000000 + 1 + 75 + 2482 + + + 410 + 0.9900000000000000000 + 1 + 75 + 2491 + + + 411 + 0.9900000000000000000 + 1 + 75 + 2500 + + + 412 + 0.9900000000000000000 + 1 + 75 + 2509 + + + 413 + 0.9900000000000000000 + 1 + 75 + 2518 + + + 414 + 0.9900000000000000000 + 1 + 75 + 2527 + + + 415 + 0.9900000000000000000 + 1 + 75 + 2536 + + + 416 + 0.9900000000000000000 + 1 + 76 + 2550 + + + 417 + 0.9900000000000000000 + 1 + 77 + 2551 + + + 418 + 0.9900000000000000000 + 1 + 77 + 2552 + + + 419 + 0.9900000000000000000 + 1 + 78 + 2554 + + + 420 + 0.9900000000000000000 + 1 + 78 + 2556 + + + 421 + 0.9900000000000000000 + 1 + 79 + 2558 + + + 422 + 0.9900000000000000000 + 1 + 79 + 2560 + + + 423 + 0.9900000000000000000 + 1 + 79 + 2562 + + + 424 + 0.9900000000000000000 + 1 + 79 + 2564 + + + 425 + 0.9900000000000000000 + 1 + 80 + 2568 + + + 426 + 0.9900000000000000000 + 1 + 80 + 2572 + + + 427 + 0.9900000000000000000 + 1 + 80 + 2576 + + + 428 + 0.9900000000000000000 + 1 + 80 + 2580 + + + 429 + 0.9900000000000000000 + 1 + 80 + 2584 + + + 430 + 0.9900000000000000000 + 1 + 80 + 2588 + + + 431 + 0.9900000000000000000 + 1 + 81 + 2594 + + + 432 + 0.9900000000000000000 + 1 + 81 + 2600 + + + 433 + 0.9900000000000000000 + 1 + 81 + 2606 + + + 434 + 0.9900000000000000000 + 1 + 81 + 2612 + + + 435 + 0.9900000000000000000 + 1 + 81 + 2618 + + + 436 + 0.9900000000000000000 + 1 + 81 + 2624 + + + 437 + 0.9900000000000000000 + 1 + 81 + 2630 + + + 438 + 0.9900000000000000000 + 1 + 81 + 2636 + + + 439 + 0.9900000000000000000 + 1 + 81 + 2642 + + + 440 + 0.9900000000000000000 + 1 + 82 + 2651 + + + 441 + 0.9900000000000000000 + 1 + 82 + 2660 + + + 442 + 0.9900000000000000000 + 1 + 82 + 2669 + + + 443 + 0.9900000000000000000 + 1 + 82 + 2678 + + + 444 + 0.9900000000000000000 + 1 + 82 + 2687 + + + 445 + 0.9900000000000000000 + 1 + 82 + 2696 + + + 446 + 0.9900000000000000000 + 1 + 82 + 2705 + + + 447 + 0.9900000000000000000 + 1 + 82 + 2714 + + + 448 + 0.9900000000000000000 + 1 + 82 + 2723 + + + 449 + 0.9900000000000000000 + 1 + 82 + 2732 + + + 450 + 0.9900000000000000000 + 1 + 82 + 2741 + + + 451 + 0.9900000000000000000 + 1 + 82 + 2750 + + + 452 + 0.9900000000000000000 + 1 + 82 + 2759 + + + 453 + 0.9900000000000000000 + 1 + 82 + 2768 + + + 454 + 0.9900000000000000000 + 1 + 83 + 2782 + + + 455 + 0.9900000000000000000 + 1 + 84 + 2783 + + + 456 + 0.9900000000000000000 + 1 + 84 + 2784 + + + 457 + 0.9900000000000000000 + 1 + 85 + 2786 + + + 458 + 0.9900000000000000000 + 1 + 85 + 2788 + + + 459 + 0.9900000000000000000 + 1 + 86 + 2790 + + + 460 + 0.9900000000000000000 + 1 + 86 + 2792 + + + 461 + 0.9900000000000000000 + 1 + 86 + 2794 + + + 462 + 0.9900000000000000000 + 1 + 86 + 2796 + + + 463 + 0.9900000000000000000 + 1 + 87 + 2800 + + + 464 + 0.9900000000000000000 + 1 + 87 + 2804 + + + 465 + 0.9900000000000000000 + 1 + 87 + 2808 + + + 466 + 0.9900000000000000000 + 1 + 87 + 2812 + + + 467 + 0.9900000000000000000 + 1 + 87 + 2816 + + + 468 + 1.9900000000000000000 + 1 + 87 + 2820 + + + 469 + 1.9900000000000000000 + 1 + 88 + 2826 + + + 470 + 1.9900000000000000000 + 1 + 88 + 2832 + + + 471 + 1.9900000000000000000 + 1 + 88 + 2838 + + + 472 + 1.9900000000000000000 + 1 + 88 + 2844 + + + 473 + 1.9900000000000000000 + 1 + 88 + 2850 + + + 474 + 1.9900000000000000000 + 1 + 88 + 2856 + + + 475 + 1.9900000000000000000 + 1 + 88 + 2862 + + + 476 + 1.9900000000000000000 + 1 + 88 + 2868 + + + 477 + 1.9900000000000000000 + 1 + 88 + 2874 + + + 478 + 1.9900000000000000000 + 1 + 89 + 2883 + + + 479 + 1.9900000000000000000 + 1 + 89 + 2892 + + + 480 + 1.9900000000000000000 + 1 + 89 + 2901 + + + 481 + 1.9900000000000000000 + 1 + 89 + 2910 + + + 482 + 1.9900000000000000000 + 1 + 89 + 2919 + + + 483 + 0.9900000000000000000 + 1 + 89 + 2928 + + + 484 + 0.9900000000000000000 + 1 + 89 + 2937 + + + 485 + 0.9900000000000000000 + 1 + 89 + 2946 + + + 486 + 0.9900000000000000000 + 1 + 89 + 2955 + + + 487 + 0.9900000000000000000 + 1 + 89 + 2964 + + + 488 + 0.9900000000000000000 + 1 + 89 + 2973 + + + 489 + 0.9900000000000000000 + 1 + 89 + 2982 + + + 490 + 0.9900000000000000000 + 1 + 89 + 2991 + + + 491 + 0.9900000000000000000 + 1 + 89 + 3000 + + + 492 + 0.9900000000000000000 + 1 + 90 + 3014 + + + 493 + 0.9900000000000000000 + 1 + 91 + 3015 + + + 494 + 0.9900000000000000000 + 1 + 91 + 3016 + + + 495 + 0.9900000000000000000 + 1 + 92 + 3018 + + + 496 + 0.9900000000000000000 + 1 + 92 + 3020 + + + 497 + 0.9900000000000000000 + 1 + 93 + 3022 + + + 498 + 0.9900000000000000000 + 1 + 93 + 3024 + + + 499 + 0.9900000000000000000 + 1 + 93 + 3026 + + + 500 + 0.9900000000000000000 + 1 + 93 + 3028 + + + 501 + 0.9900000000000000000 + 1 + 94 + 3032 + + + 502 + 0.9900000000000000000 + 1 + 94 + 3036 + + + 503 + 0.9900000000000000000 + 1 + 94 + 3040 + + + 504 + 0.9900000000000000000 + 1 + 94 + 3044 + + + 505 + 0.9900000000000000000 + 1 + 94 + 3048 + + + 506 + 0.9900000000000000000 + 1 + 94 + 3052 + + + 507 + 0.9900000000000000000 + 1 + 95 + 3058 + + + 508 + 0.9900000000000000000 + 1 + 95 + 3064 + + + 509 + 0.9900000000000000000 + 1 + 95 + 3070 + + + 510 + 0.9900000000000000000 + 1 + 95 + 3076 + + + 511 + 0.9900000000000000000 + 1 + 95 + 3082 + + + 512 + 0.9900000000000000000 + 1 + 95 + 3088 + + + 513 + 0.9900000000000000000 + 1 + 95 + 3094 + + + 514 + 0.9900000000000000000 + 1 + 95 + 3100 + + + 515 + 0.9900000000000000000 + 1 + 95 + 3106 + + + 516 + 0.9900000000000000000 + 1 + 96 + 3115 + + + 517 + 0.9900000000000000000 + 1 + 96 + 3124 + + + 518 + 0.9900000000000000000 + 1 + 96 + 3133 + + + 519 + 0.9900000000000000000 + 1 + 96 + 3142 + + + 520 + 0.9900000000000000000 + 1 + 96 + 3151 + + + 521 + 0.9900000000000000000 + 1 + 96 + 3160 + + + 522 + 1.9900000000000000000 + 1 + 96 + 3169 + + + 523 + 1.9900000000000000000 + 1 + 96 + 3178 + + + 524 + 1.9900000000000000000 + 1 + 96 + 3187 + + + 525 + 1.9900000000000000000 + 1 + 96 + 3196 + + + 526 + 1.9900000000000000000 + 1 + 96 + 3205 + + + 527 + 1.9900000000000000000 + 1 + 96 + 3214 + + + 528 + 1.9900000000000000000 + 1 + 96 + 3223 + + + 529 + 1.9900000000000000000 + 1 + 96 + 3232 + + + 530 + 1.9900000000000000000 + 1 + 97 + 3246 + + + 531 + 1.9900000000000000000 + 1 + 98 + 3247 + + + 532 + 1.9900000000000000000 + 1 + 98 + 3248 + + + 533 + 1.9900000000000000000 + 1 + 99 + 3250 + + + 534 + 1.9900000000000000000 + 1 + 99 + 3252 + + + 535 + 0.9900000000000000000 + 1 + 100 + 3254 + + + 536 + 0.9900000000000000000 + 1 + 100 + 3256 + + + 537 + 0.9900000000000000000 + 1 + 100 + 3258 + + + 538 + 0.9900000000000000000 + 1 + 100 + 3260 + + + 539 + 0.9900000000000000000 + 1 + 101 + 3264 + + + 540 + 0.9900000000000000000 + 1 + 101 + 3268 + + + 541 + 0.9900000000000000000 + 1 + 101 + 3272 + + + 542 + 0.9900000000000000000 + 1 + 101 + 3276 + + + 543 + 0.9900000000000000000 + 1 + 101 + 3280 + + + 544 + 0.9900000000000000000 + 1 + 101 + 3284 + + + 545 + 0.9900000000000000000 + 1 + 102 + 3290 + + + 546 + 0.9900000000000000000 + 1 + 102 + 3296 + + + 547 + 0.9900000000000000000 + 1 + 102 + 3302 + + + 548 + 0.9900000000000000000 + 1 + 102 + 3308 + + + 549 + 0.9900000000000000000 + 1 + 102 + 3314 + + + 550 + 0.9900000000000000000 + 1 + 102 + 3320 + + + 551 + 0.9900000000000000000 + 1 + 102 + 3326 + + + 552 + 0.9900000000000000000 + 1 + 102 + 3332 + + + 553 + 1.9900000000000000000 + 1 + 102 + 3338 + + + 554 + 1.9900000000000000000 + 1 + 103 + 3347 + + + 555 + 0.9900000000000000000 + 1 + 103 + 3356 + + + 556 + 0.9900000000000000000 + 1 + 103 + 3365 + + + 557 + 0.9900000000000000000 + 1 + 103 + 3374 + + + 558 + 0.9900000000000000000 + 1 + 103 + 3383 + + + 559 + 0.9900000000000000000 + 1 + 103 + 3392 + + + 560 + 0.9900000000000000000 + 1 + 103 + 3401 + + + 561 + 0.9900000000000000000 + 1 + 103 + 3410 + + + 562 + 0.9900000000000000000 + 1 + 103 + 3419 + + + 563 + 1.9900000000000000000 + 1 + 103 + 3428 + + + 564 + 0.9900000000000000000 + 1 + 103 + 3437 + + + 565 + 0.9900000000000000000 + 1 + 103 + 3446 + + + 566 + 0.9900000000000000000 + 1 + 103 + 3455 + + + 567 + 0.9900000000000000000 + 1 + 103 + 3464 + + + 568 + 0.9900000000000000000 + 1 + 104 + 3478 + + + 569 + 0.9900000000000000000 + 1 + 105 + 3479 + + + 570 + 0.9900000000000000000 + 1 + 105 + 3480 + + + 571 + 0.9900000000000000000 + 1 + 106 + 3482 + + + 572 + 0.9900000000000000000 + 1 + 106 + 3484 + + + 573 + 0.9900000000000000000 + 1 + 107 + 3486 + + + 574 + 0.9900000000000000000 + 1 + 107 + 3488 + + + 575 + 0.9900000000000000000 + 1 + 107 + 3490 + + + 576 + 0.9900000000000000000 + 1 + 107 + 3492 + + + 577 + 0.9900000000000000000 + 1 + 108 + 3496 + + + 578 + 0.9900000000000000000 + 1 + 108 + 3500 + + + 579 + 0.9900000000000000000 + 1 + 108 + 1 + + + 580 + 0.9900000000000000000 + 1 + 108 + 5 + + + 581 + 0.9900000000000000000 + 1 + 108 + 9 + + + 582 + 0.9900000000000000000 + 1 + 108 + 13 + + + 583 + 0.9900000000000000000 + 1 + 109 + 19 + + + 584 + 0.9900000000000000000 + 1 + 109 + 25 + + + 585 + 0.9900000000000000000 + 1 + 109 + 31 + + + 586 + 0.9900000000000000000 + 1 + 109 + 37 + + + 587 + 0.9900000000000000000 + 1 + 109 + 43 + + + 588 + 0.9900000000000000000 + 1 + 109 + 49 + + + 589 + 0.9900000000000000000 + 1 + 109 + 55 + + + 590 + 0.9900000000000000000 + 1 + 109 + 61 + + + 591 + 0.9900000000000000000 + 1 + 109 + 67 + + + 592 + 0.9900000000000000000 + 1 + 110 + 76 + + + 593 + 0.9900000000000000000 + 1 + 110 + 85 + + + 594 + 0.9900000000000000000 + 1 + 110 + 94 + + + 595 + 0.9900000000000000000 + 1 + 110 + 103 + + + 596 + 0.9900000000000000000 + 1 + 110 + 112 + + + 597 + 0.9900000000000000000 + 1 + 110 + 121 + + + 598 + 0.9900000000000000000 + 1 + 110 + 130 + + + 599 + 0.9900000000000000000 + 1 + 110 + 139 + + + 600 + 0.9900000000000000000 + 1 + 110 + 148 + + + 601 + 0.9900000000000000000 + 1 + 110 + 157 + + + 602 + 0.9900000000000000000 + 1 + 110 + 166 + + + 603 + 0.9900000000000000000 + 1 + 110 + 175 + + + 604 + 0.9900000000000000000 + 1 + 110 + 184 + + + 605 + 0.9900000000000000000 + 1 + 110 + 193 + + + 606 + 0.9900000000000000000 + 1 + 111 + 207 + + + 607 + 0.9900000000000000000 + 1 + 112 + 208 + + + 608 + 0.9900000000000000000 + 1 + 112 + 209 + + + 609 + 0.9900000000000000000 + 1 + 113 + 211 + + + 610 + 0.9900000000000000000 + 1 + 113 + 213 + + + 611 + 0.9900000000000000000 + 1 + 114 + 215 + + + 612 + 0.9900000000000000000 + 1 + 114 + 217 + + + 613 + 0.9900000000000000000 + 1 + 114 + 219 + + + 614 + 0.9900000000000000000 + 1 + 114 + 221 + + + 615 + 0.9900000000000000000 + 1 + 115 + 225 + + + 616 + 0.9900000000000000000 + 1 + 115 + 229 + + + 617 + 0.9900000000000000000 + 1 + 115 + 233 + + + 618 + 0.9900000000000000000 + 1 + 115 + 237 + + + 619 + 0.9900000000000000000 + 1 + 115 + 241 + + + 620 + 0.9900000000000000000 + 1 + 115 + 245 + + + 621 + 0.9900000000000000000 + 1 + 116 + 251 + + + 622 + 0.9900000000000000000 + 1 + 116 + 257 + + + 623 + 0.9900000000000000000 + 1 + 116 + 263 + + + 624 + 0.9900000000000000000 + 1 + 116 + 269 + + + 625 + 0.9900000000000000000 + 1 + 116 + 275 + + + 626 + 0.9900000000000000000 + 1 + 116 + 281 + + + 627 + 0.9900000000000000000 + 1 + 116 + 287 + + + 628 + 0.9900000000000000000 + 1 + 116 + 293 + + + 629 + 0.9900000000000000000 + 1 + 116 + 299 + + + 630 + 0.9900000000000000000 + 1 + 117 + 308 + + + 631 + 0.9900000000000000000 + 1 + 117 + 317 + + + 632 + 0.9900000000000000000 + 1 + 117 + 326 + + + 633 + 0.9900000000000000000 + 1 + 117 + 335 + + + 634 + 0.9900000000000000000 + 1 + 117 + 344 + + + 635 + 0.9900000000000000000 + 1 + 117 + 353 + + + 636 + 0.9900000000000000000 + 1 + 117 + 362 + + + 637 + 0.9900000000000000000 + 1 + 117 + 371 + + + 638 + 0.9900000000000000000 + 1 + 117 + 380 + + + 639 + 0.9900000000000000000 + 1 + 117 + 389 + + + 640 + 0.9900000000000000000 + 1 + 117 + 398 + + + 641 + 0.9900000000000000000 + 1 + 117 + 407 + + + 642 + 0.9900000000000000000 + 1 + 117 + 416 + + + 643 + 0.9900000000000000000 + 1 + 117 + 425 + + + 644 + 0.9900000000000000000 + 1 + 118 + 439 + + + 645 + 0.9900000000000000000 + 1 + 119 + 440 + + + 646 + 0.9900000000000000000 + 1 + 119 + 441 + + + 647 + 0.9900000000000000000 + 1 + 120 + 443 + + + 648 + 0.9900000000000000000 + 1 + 120 + 445 + + + 649 + 0.9900000000000000000 + 1 + 121 + 447 + + + 650 + 0.9900000000000000000 + 1 + 121 + 449 + + + 651 + 0.9900000000000000000 + 1 + 121 + 451 + + + 652 + 0.9900000000000000000 + 1 + 121 + 453 + + + 653 + 0.9900000000000000000 + 1 + 122 + 457 + + + 654 + 0.9900000000000000000 + 1 + 122 + 461 + + + 655 + 0.9900000000000000000 + 1 + 122 + 465 + + + 656 + 0.9900000000000000000 + 1 + 122 + 469 + + + 657 + 0.9900000000000000000 + 1 + 122 + 473 + + + 658 + 0.9900000000000000000 + 1 + 122 + 477 + + + 659 + 0.9900000000000000000 + 1 + 123 + 483 + + + 660 + 0.9900000000000000000 + 1 + 123 + 489 + + + 661 + 0.9900000000000000000 + 1 + 123 + 495 + + + 662 + 0.9900000000000000000 + 1 + 123 + 501 + + + 663 + 0.9900000000000000000 + 1 + 123 + 507 + + + 664 + 0.9900000000000000000 + 1 + 123 + 513 + + + 665 + 0.9900000000000000000 + 1 + 123 + 519 + + + 666 + 0.9900000000000000000 + 1 + 123 + 525 + + + 667 + 0.9900000000000000000 + 1 + 123 + 531 + + + 668 + 0.9900000000000000000 + 1 + 124 + 540 + + + 669 + 0.9900000000000000000 + 1 + 124 + 549 + + + 670 + 0.9900000000000000000 + 1 + 124 + 558 + + + 671 + 0.9900000000000000000 + 1 + 124 + 567 + + + 672 + 0.9900000000000000000 + 1 + 124 + 576 + + + 673 + 0.9900000000000000000 + 1 + 124 + 585 + + + 674 + 0.9900000000000000000 + 1 + 124 + 594 + + + 675 + 0.9900000000000000000 + 1 + 124 + 603 + + + 676 + 0.9900000000000000000 + 1 + 124 + 612 + + + 677 + 0.9900000000000000000 + 1 + 124 + 621 + + + 678 + 0.9900000000000000000 + 1 + 124 + 630 + + + 679 + 0.9900000000000000000 + 1 + 124 + 639 + + + 680 + 0.9900000000000000000 + 1 + 124 + 648 + + + 681 + 0.9900000000000000000 + 1 + 124 + 657 + + + 682 + 0.9900000000000000000 + 1 + 125 + 671 + + + 683 + 0.9900000000000000000 + 1 + 126 + 672 + + + 684 + 0.9900000000000000000 + 1 + 126 + 673 + + + 685 + 0.9900000000000000000 + 1 + 127 + 675 + + + 686 + 0.9900000000000000000 + 1 + 127 + 677 + + + 687 + 0.9900000000000000000 + 1 + 128 + 679 + + + 688 + 0.9900000000000000000 + 1 + 128 + 681 + + + 689 + 0.9900000000000000000 + 1 + 128 + 683 + + + 690 + 0.9900000000000000000 + 1 + 128 + 685 + + + 691 + 0.9900000000000000000 + 1 + 129 + 689 + + + 692 + 0.9900000000000000000 + 1 + 129 + 693 + + + 693 + 0.9900000000000000000 + 1 + 129 + 697 + + + 694 + 0.9900000000000000000 + 1 + 129 + 701 + + + 695 + 0.9900000000000000000 + 1 + 129 + 705 + + + 696 + 0.9900000000000000000 + 1 + 129 + 709 + + + 697 + 0.9900000000000000000 + 1 + 130 + 715 + + + 698 + 0.9900000000000000000 + 1 + 130 + 721 + + + 699 + 0.9900000000000000000 + 1 + 130 + 727 + + + 700 + 0.9900000000000000000 + 1 + 130 + 733 + + + 701 + 0.9900000000000000000 + 1 + 130 + 739 + + + 702 + 0.9900000000000000000 + 1 + 130 + 745 + + + 703 + 0.9900000000000000000 + 1 + 130 + 751 + + + 704 + 0.9900000000000000000 + 1 + 130 + 757 + + + 705 + 0.9900000000000000000 + 1 + 130 + 763 + + + 706 + 0.9900000000000000000 + 1 + 131 + 772 + + + 707 + 0.9900000000000000000 + 1 + 131 + 781 + + + 708 + 0.9900000000000000000 + 1 + 131 + 790 + + + 709 + 0.9900000000000000000 + 1 + 131 + 799 + + + 710 + 0.9900000000000000000 + 1 + 131 + 808 + + + 711 + 0.9900000000000000000 + 1 + 131 + 817 + + + 712 + 0.9900000000000000000 + 1 + 131 + 826 + + + 713 + 0.9900000000000000000 + 1 + 131 + 835 + + + 714 + 0.9900000000000000000 + 1 + 131 + 844 + + + 715 + 0.9900000000000000000 + 1 + 131 + 853 + + + 716 + 0.9900000000000000000 + 1 + 131 + 862 + + + 717 + 0.9900000000000000000 + 1 + 131 + 871 + + + 718 + 0.9900000000000000000 + 1 + 131 + 880 + + + 719 + 0.9900000000000000000 + 1 + 131 + 889 + + + 720 + 0.9900000000000000000 + 1 + 132 + 903 + + + 721 + 0.9900000000000000000 + 1 + 133 + 904 + + + 722 + 0.9900000000000000000 + 1 + 133 + 905 + + + 723 + 0.9900000000000000000 + 1 + 134 + 907 + + + 724 + 0.9900000000000000000 + 1 + 134 + 909 + + + 725 + 0.9900000000000000000 + 1 + 135 + 911 + + + 726 + 0.9900000000000000000 + 1 + 135 + 913 + + + 727 + 0.9900000000000000000 + 1 + 135 + 915 + + + 728 + 0.9900000000000000000 + 1 + 135 + 917 + + + 729 + 0.9900000000000000000 + 1 + 136 + 921 + + + 730 + 0.9900000000000000000 + 1 + 136 + 925 + + + 731 + 0.9900000000000000000 + 1 + 136 + 929 + + + 732 + 0.9900000000000000000 + 1 + 136 + 933 + + + 733 + 0.9900000000000000000 + 1 + 136 + 937 + + + 734 + 0.9900000000000000000 + 1 + 136 + 941 + + + 735 + 0.9900000000000000000 + 1 + 137 + 947 + + + 736 + 0.9900000000000000000 + 1 + 137 + 953 + + + 737 + 0.9900000000000000000 + 1 + 137 + 959 + + + 738 + 0.9900000000000000000 + 1 + 137 + 965 + + + 739 + 0.9900000000000000000 + 1 + 137 + 971 + + + 740 + 0.9900000000000000000 + 1 + 137 + 977 + + + 741 + 0.9900000000000000000 + 1 + 137 + 983 + + + 742 + 0.9900000000000000000 + 1 + 137 + 989 + + + 743 + 0.9900000000000000000 + 1 + 137 + 995 + + + 744 + 0.9900000000000000000 + 1 + 138 + 1004 + + + 745 + 0.9900000000000000000 + 1 + 138 + 1013 + + + 746 + 0.9900000000000000000 + 1 + 138 + 1022 + + + 747 + 0.9900000000000000000 + 1 + 138 + 1031 + + + 748 + 0.9900000000000000000 + 1 + 138 + 1040 + + + 749 + 0.9900000000000000000 + 1 + 138 + 1049 + + + 750 + 0.9900000000000000000 + 1 + 138 + 1058 + + + 751 + 0.9900000000000000000 + 1 + 138 + 1067 + + + 752 + 0.9900000000000000000 + 1 + 138 + 1076 + + + 753 + 0.9900000000000000000 + 1 + 138 + 1085 + + + 754 + 0.9900000000000000000 + 1 + 138 + 1094 + + + 755 + 0.9900000000000000000 + 1 + 138 + 1103 + + + 756 + 0.9900000000000000000 + 1 + 138 + 1112 + + + 757 + 0.9900000000000000000 + 1 + 138 + 1121 + + + 758 + 0.9900000000000000000 + 1 + 139 + 1135 + + + 759 + 0.9900000000000000000 + 1 + 140 + 1136 + + + 760 + 0.9900000000000000000 + 1 + 140 + 1137 + + + 761 + 0.9900000000000000000 + 1 + 141 + 1139 + + + 762 + 0.9900000000000000000 + 1 + 141 + 1141 + + + 763 + 0.9900000000000000000 + 1 + 142 + 1143 + + + 764 + 0.9900000000000000000 + 1 + 142 + 1145 + + + 765 + 0.9900000000000000000 + 1 + 142 + 1147 + + + 766 + 0.9900000000000000000 + 1 + 142 + 1149 + + + 767 + 0.9900000000000000000 + 1 + 143 + 1153 + + + 768 + 0.9900000000000000000 + 1 + 143 + 1157 + + + 769 + 0.9900000000000000000 + 1 + 143 + 1161 + + + 770 + 0.9900000000000000000 + 1 + 143 + 1165 + + + 771 + 0.9900000000000000000 + 1 + 143 + 1169 + + + 772 + 0.9900000000000000000 + 1 + 143 + 1173 + + + 773 + 0.9900000000000000000 + 1 + 144 + 1179 + + + 774 + 0.9900000000000000000 + 1 + 144 + 1185 + + + 775 + 0.9900000000000000000 + 1 + 144 + 1191 + + + 776 + 0.9900000000000000000 + 1 + 144 + 1197 + + + 777 + 0.9900000000000000000 + 1 + 144 + 1203 + + + 778 + 0.9900000000000000000 + 1 + 144 + 1209 + + + 779 + 0.9900000000000000000 + 1 + 144 + 1215 + + + 780 + 0.9900000000000000000 + 1 + 144 + 1221 + + + 781 + 0.9900000000000000000 + 1 + 144 + 1227 + + + 782 + 0.9900000000000000000 + 1 + 145 + 1236 + + + 783 + 0.9900000000000000000 + 1 + 145 + 1245 + + + 784 + 0.9900000000000000000 + 1 + 145 + 1254 + + + 785 + 0.9900000000000000000 + 1 + 145 + 1263 + + + 786 + 0.9900000000000000000 + 1 + 145 + 1272 + + + 787 + 0.9900000000000000000 + 1 + 145 + 1281 + + + 788 + 0.9900000000000000000 + 1 + 145 + 1290 + + + 789 + 0.9900000000000000000 + 1 + 145 + 1299 + + + 790 + 0.9900000000000000000 + 1 + 145 + 1308 + + + 791 + 0.9900000000000000000 + 1 + 145 + 1317 + + + 792 + 0.9900000000000000000 + 1 + 145 + 1326 + + + 793 + 0.9900000000000000000 + 1 + 145 + 1335 + + + 794 + 0.9900000000000000000 + 1 + 145 + 1344 + + + 795 + 0.9900000000000000000 + 1 + 145 + 1353 + + + 796 + 0.9900000000000000000 + 1 + 146 + 1367 + + + 797 + 0.9900000000000000000 + 1 + 147 + 1368 + + + 798 + 0.9900000000000000000 + 1 + 147 + 1369 + + + 799 + 0.9900000000000000000 + 1 + 148 + 1371 + + + 800 + 0.9900000000000000000 + 1 + 148 + 1373 + + + 801 + 0.9900000000000000000 + 1 + 149 + 1375 + + + 802 + 0.9900000000000000000 + 1 + 149 + 1377 + + + 803 + 0.9900000000000000000 + 1 + 149 + 1379 + + + 804 + 0.9900000000000000000 + 1 + 149 + 1381 + + + 805 + 0.9900000000000000000 + 1 + 150 + 1385 + + + 806 + 0.9900000000000000000 + 1 + 150 + 1389 + + + 807 + 0.9900000000000000000 + 1 + 150 + 1393 + + + 808 + 0.9900000000000000000 + 1 + 150 + 1397 + + + 809 + 0.9900000000000000000 + 1 + 150 + 1401 + + + 810 + 0.9900000000000000000 + 1 + 150 + 1405 + + + 811 + 0.9900000000000000000 + 1 + 151 + 1411 + + + 812 + 0.9900000000000000000 + 1 + 151 + 1417 + + + 813 + 0.9900000000000000000 + 1 + 151 + 1423 + + + 814 + 0.9900000000000000000 + 1 + 151 + 1429 + + + 815 + 0.9900000000000000000 + 1 + 151 + 1435 + + + 816 + 0.9900000000000000000 + 1 + 151 + 1441 + + + 817 + 0.9900000000000000000 + 1 + 151 + 1447 + + + 818 + 0.9900000000000000000 + 1 + 151 + 1453 + + + 819 + 0.9900000000000000000 + 1 + 151 + 1459 + + + 820 + 0.9900000000000000000 + 1 + 152 + 1468 + + + 821 + 0.9900000000000000000 + 1 + 152 + 1477 + + + 822 + 0.9900000000000000000 + 1 + 152 + 1486 + + + 823 + 0.9900000000000000000 + 1 + 152 + 1495 + + + 824 + 0.9900000000000000000 + 1 + 152 + 1504 + + + 825 + 0.9900000000000000000 + 1 + 152 + 1513 + + + 826 + 0.9900000000000000000 + 1 + 152 + 1522 + + + 827 + 0.9900000000000000000 + 1 + 152 + 1531 + + + 828 + 0.9900000000000000000 + 1 + 152 + 1540 + + + 829 + 0.9900000000000000000 + 1 + 152 + 1549 + + + 830 + 0.9900000000000000000 + 1 + 152 + 1558 + + + 831 + 0.9900000000000000000 + 1 + 152 + 1567 + + + 832 + 0.9900000000000000000 + 1 + 152 + 1576 + + + 833 + 0.9900000000000000000 + 1 + 152 + 1585 + + + 834 + 0.9900000000000000000 + 1 + 153 + 1599 + + + 835 + 0.9900000000000000000 + 1 + 154 + 1600 + + + 836 + 0.9900000000000000000 + 1 + 154 + 1601 + + + 837 + 0.9900000000000000000 + 1 + 155 + 1603 + + + 838 + 0.9900000000000000000 + 1 + 155 + 1605 + + + 839 + 0.9900000000000000000 + 1 + 156 + 1607 + + + 840 + 0.9900000000000000000 + 1 + 156 + 1609 + + + 841 + 0.9900000000000000000 + 1 + 156 + 1611 + + + 842 + 0.9900000000000000000 + 1 + 156 + 1613 + + + 843 + 0.9900000000000000000 + 1 + 157 + 1617 + + + 844 + 0.9900000000000000000 + 1 + 157 + 1621 + + + 845 + 0.9900000000000000000 + 1 + 157 + 1625 + + + 846 + 0.9900000000000000000 + 1 + 157 + 1629 + + + 847 + 0.9900000000000000000 + 1 + 157 + 1633 + + + 848 + 0.9900000000000000000 + 1 + 157 + 1637 + + + 849 + 0.9900000000000000000 + 1 + 158 + 1643 + + + 850 + 0.9900000000000000000 + 1 + 158 + 1649 + + + 851 + 0.9900000000000000000 + 1 + 158 + 1655 + + + 852 + 0.9900000000000000000 + 1 + 158 + 1661 + + + 853 + 0.9900000000000000000 + 1 + 158 + 1667 + + + 854 + 0.9900000000000000000 + 1 + 158 + 1673 + + + 855 + 0.9900000000000000000 + 1 + 158 + 1679 + + + 856 + 0.9900000000000000000 + 1 + 158 + 1685 + + + 857 + 0.9900000000000000000 + 1 + 158 + 1691 + + + 858 + 0.9900000000000000000 + 1 + 159 + 1700 + + + 859 + 0.9900000000000000000 + 1 + 159 + 1709 + + + 860 + 0.9900000000000000000 + 1 + 159 + 1718 + + + 861 + 0.9900000000000000000 + 1 + 159 + 1727 + + + 862 + 0.9900000000000000000 + 1 + 159 + 1736 + + + 863 + 0.9900000000000000000 + 1 + 159 + 1745 + + + 864 + 0.9900000000000000000 + 1 + 159 + 1754 + + + 865 + 0.9900000000000000000 + 1 + 159 + 1763 + + + 866 + 0.9900000000000000000 + 1 + 159 + 1772 + + + 867 + 0.9900000000000000000 + 1 + 159 + 1781 + + + 868 + 0.9900000000000000000 + 1 + 159 + 1790 + + + 869 + 0.9900000000000000000 + 1 + 159 + 1799 + + + 870 + 0.9900000000000000000 + 1 + 159 + 1808 + + + 871 + 0.9900000000000000000 + 1 + 159 + 1817 + + + 872 + 0.9900000000000000000 + 1 + 160 + 1831 + + + 873 + 0.9900000000000000000 + 1 + 161 + 1832 + + + 874 + 0.9900000000000000000 + 1 + 161 + 1833 + + + 875 + 0.9900000000000000000 + 1 + 162 + 1835 + + + 876 + 0.9900000000000000000 + 1 + 162 + 1837 + + + 877 + 0.9900000000000000000 + 1 + 163 + 1839 + + + 878 + 0.9900000000000000000 + 1 + 163 + 1841 + + + 879 + 0.9900000000000000000 + 1 + 163 + 1843 + + + 880 + 0.9900000000000000000 + 1 + 163 + 1845 + + + 881 + 0.9900000000000000000 + 1 + 164 + 1849 + + + 882 + 0.9900000000000000000 + 1 + 164 + 1853 + + + 883 + 0.9900000000000000000 + 1 + 164 + 1857 + + + 884 + 0.9900000000000000000 + 1 + 164 + 1861 + + + 885 + 0.9900000000000000000 + 1 + 164 + 1865 + + + 886 + 0.9900000000000000000 + 1 + 164 + 1869 + + + 887 + 0.9900000000000000000 + 1 + 165 + 1875 + + + 888 + 0.9900000000000000000 + 1 + 165 + 1881 + + + 889 + 0.9900000000000000000 + 1 + 165 + 1887 + + + 890 + 0.9900000000000000000 + 1 + 165 + 1893 + + + 891 + 0.9900000000000000000 + 1 + 165 + 1899 + + + 892 + 0.9900000000000000000 + 1 + 165 + 1905 + + + 893 + 0.9900000000000000000 + 1 + 165 + 1911 + + + 894 + 0.9900000000000000000 + 1 + 165 + 1917 + + + 895 + 0.9900000000000000000 + 1 + 165 + 1923 + + + 896 + 0.9900000000000000000 + 1 + 166 + 1932 + + + 897 + 0.9900000000000000000 + 1 + 166 + 1941 + + + 898 + 0.9900000000000000000 + 1 + 166 + 1950 + + + 899 + 0.9900000000000000000 + 1 + 166 + 1959 + + + 900 + 0.9900000000000000000 + 1 + 166 + 1968 + + + 901 + 0.9900000000000000000 + 1 + 166 + 1977 + + + 902 + 0.9900000000000000000 + 1 + 166 + 1986 + + + 903 + 0.9900000000000000000 + 1 + 166 + 1995 + + + 904 + 0.9900000000000000000 + 1 + 166 + 2004 + + + 905 + 0.9900000000000000000 + 1 + 166 + 2013 + + + 906 + 0.9900000000000000000 + 1 + 166 + 2022 + + + 907 + 0.9900000000000000000 + 1 + 166 + 2031 + + + 908 + 0.9900000000000000000 + 1 + 166 + 2040 + + + 909 + 0.9900000000000000000 + 1 + 166 + 2049 + + + 910 + 0.9900000000000000000 + 1 + 167 + 2063 + + + 911 + 0.9900000000000000000 + 1 + 168 + 2064 + + + 912 + 0.9900000000000000000 + 1 + 168 + 2065 + + + 913 + 0.9900000000000000000 + 1 + 169 + 2067 + + + 914 + 0.9900000000000000000 + 1 + 169 + 2069 + + + 915 + 0.9900000000000000000 + 1 + 170 + 2071 + + + 916 + 0.9900000000000000000 + 1 + 170 + 2073 + + + 917 + 0.9900000000000000000 + 1 + 170 + 2075 + + + 918 + 0.9900000000000000000 + 1 + 170 + 2077 + + + 919 + 0.9900000000000000000 + 1 + 171 + 2081 + + + 920 + 0.9900000000000000000 + 1 + 171 + 2085 + + + 921 + 0.9900000000000000000 + 1 + 171 + 2089 + + + 922 + 0.9900000000000000000 + 1 + 171 + 2093 + + + 923 + 0.9900000000000000000 + 1 + 171 + 2097 + + + 924 + 0.9900000000000000000 + 1 + 171 + 2101 + + + 925 + 0.9900000000000000000 + 1 + 172 + 2107 + + + 926 + 0.9900000000000000000 + 1 + 172 + 2113 + + + 927 + 0.9900000000000000000 + 1 + 172 + 2119 + + + 928 + 0.9900000000000000000 + 1 + 172 + 2125 + + + 929 + 0.9900000000000000000 + 1 + 172 + 2131 + + + 930 + 0.9900000000000000000 + 1 + 172 + 2137 + + + 931 + 0.9900000000000000000 + 1 + 172 + 2143 + + + 932 + 0.9900000000000000000 + 1 + 172 + 2149 + + + 933 + 0.9900000000000000000 + 1 + 172 + 2155 + + + 934 + 0.9900000000000000000 + 1 + 173 + 2164 + + + 935 + 0.9900000000000000000 + 1 + 173 + 2173 + + + 936 + 0.9900000000000000000 + 1 + 173 + 2182 + + + 937 + 0.9900000000000000000 + 1 + 173 + 2191 + + + 938 + 0.9900000000000000000 + 1 + 173 + 2200 + + + 939 + 0.9900000000000000000 + 1 + 173 + 2209 + + + 940 + 0.9900000000000000000 + 1 + 173 + 2218 + + + 941 + 0.9900000000000000000 + 1 + 173 + 2227 + + + 942 + 0.9900000000000000000 + 1 + 173 + 2236 + + + 943 + 0.9900000000000000000 + 1 + 173 + 2245 + + + 944 + 0.9900000000000000000 + 1 + 173 + 2254 + + + 945 + 0.9900000000000000000 + 1 + 173 + 2263 + + + 946 + 0.9900000000000000000 + 1 + 173 + 2272 + + + 947 + 0.9900000000000000000 + 1 + 173 + 2281 + + + 948 + 0.9900000000000000000 + 1 + 174 + 2295 + + + 949 + 0.9900000000000000000 + 1 + 175 + 2296 + + + 950 + 0.9900000000000000000 + 1 + 175 + 2297 + + + 951 + 0.9900000000000000000 + 1 + 176 + 2299 + + + 952 + 0.9900000000000000000 + 1 + 176 + 2301 + + + 953 + 0.9900000000000000000 + 1 + 177 + 2303 + + + 954 + 0.9900000000000000000 + 1 + 177 + 2305 + + + 955 + 0.9900000000000000000 + 1 + 177 + 2307 + + + 956 + 0.9900000000000000000 + 1 + 177 + 2309 + + + 957 + 0.9900000000000000000 + 1 + 178 + 2313 + + + 958 + 0.9900000000000000000 + 1 + 178 + 2317 + + + 959 + 0.9900000000000000000 + 1 + 178 + 2321 + + + 960 + 0.9900000000000000000 + 1 + 178 + 2325 + + + 961 + 0.9900000000000000000 + 1 + 178 + 2329 + + + 962 + 0.9900000000000000000 + 1 + 178 + 2333 + + + 963 + 0.9900000000000000000 + 1 + 179 + 2339 + + + 964 + 0.9900000000000000000 + 1 + 179 + 2345 + + + 965 + 0.9900000000000000000 + 1 + 179 + 2351 + + + 966 + 0.9900000000000000000 + 1 + 179 + 2357 + + + 967 + 0.9900000000000000000 + 1 + 179 + 2363 + + + 968 + 0.9900000000000000000 + 1 + 179 + 2369 + + + 969 + 0.9900000000000000000 + 1 + 179 + 2375 + + + 970 + 0.9900000000000000000 + 1 + 179 + 2381 + + + 971 + 0.9900000000000000000 + 1 + 179 + 2387 + + + 972 + 0.9900000000000000000 + 1 + 180 + 2396 + + + 973 + 0.9900000000000000000 + 1 + 180 + 2405 + + + 974 + 0.9900000000000000000 + 1 + 180 + 2414 + + + 975 + 0.9900000000000000000 + 1 + 180 + 2423 + + + 976 + 0.9900000000000000000 + 1 + 180 + 2432 + + + 977 + 0.9900000000000000000 + 1 + 180 + 2441 + + + 978 + 0.9900000000000000000 + 1 + 180 + 2450 + + + 979 + 0.9900000000000000000 + 1 + 180 + 2459 + + + 980 + 0.9900000000000000000 + 1 + 180 + 2468 + + + 981 + 0.9900000000000000000 + 1 + 180 + 2477 + + + 982 + 0.9900000000000000000 + 1 + 180 + 2486 + + + 983 + 0.9900000000000000000 + 1 + 180 + 2495 + + + 984 + 0.9900000000000000000 + 1 + 180 + 2504 + + + 985 + 0.9900000000000000000 + 1 + 180 + 2513 + + + 986 + 0.9900000000000000000 + 1 + 181 + 2527 + + + 987 + 0.9900000000000000000 + 1 + 182 + 2528 + + + 988 + 0.9900000000000000000 + 1 + 182 + 2529 + + + 989 + 0.9900000000000000000 + 1 + 183 + 2531 + + + 990 + 0.9900000000000000000 + 1 + 183 + 2533 + + + 991 + 0.9900000000000000000 + 1 + 184 + 2535 + + + 992 + 0.9900000000000000000 + 1 + 184 + 2537 + + + 993 + 0.9900000000000000000 + 1 + 184 + 2539 + + + 994 + 0.9900000000000000000 + 1 + 184 + 2541 + + + 995 + 0.9900000000000000000 + 1 + 185 + 2545 + + + 996 + 0.9900000000000000000 + 1 + 185 + 2549 + + + 997 + 0.9900000000000000000 + 1 + 185 + 2553 + + + 998 + 0.9900000000000000000 + 1 + 185 + 2557 + + + 999 + 0.9900000000000000000 + 1 + 185 + 2561 + + + 1000 + 0.9900000000000000000 + 1 + 185 + 2565 + + + 1001 + 0.9900000000000000000 + 1 + 186 + 2571 + + + 1002 + 0.9900000000000000000 + 1 + 186 + 2577 + + + 1003 + 0.9900000000000000000 + 1 + 186 + 2583 + + + 1004 + 0.9900000000000000000 + 1 + 186 + 2589 + + + 1005 + 0.9900000000000000000 + 1 + 186 + 2595 + + + 1006 + 0.9900000000000000000 + 1 + 186 + 2601 + + + 1007 + 0.9900000000000000000 + 1 + 186 + 2607 + + + 1008 + 0.9900000000000000000 + 1 + 186 + 2613 + + + 1009 + 0.9900000000000000000 + 1 + 186 + 2619 + + + 1010 + 0.9900000000000000000 + 1 + 187 + 2628 + + + 1011 + 0.9900000000000000000 + 1 + 187 + 2637 + + + 1012 + 0.9900000000000000000 + 1 + 187 + 2646 + + + 1013 + 0.9900000000000000000 + 1 + 187 + 2655 + + + 1014 + 0.9900000000000000000 + 1 + 187 + 2664 + + + 1015 + 0.9900000000000000000 + 1 + 187 + 2673 + + + 1016 + 0.9900000000000000000 + 1 + 187 + 2682 + + + 1017 + 0.9900000000000000000 + 1 + 187 + 2691 + + + 1018 + 0.9900000000000000000 + 1 + 187 + 2700 + + + 1019 + 0.9900000000000000000 + 1 + 187 + 2709 + + + 1020 + 0.9900000000000000000 + 1 + 187 + 2718 + + + 1021 + 0.9900000000000000000 + 1 + 187 + 2727 + + + 1022 + 0.9900000000000000000 + 1 + 187 + 2736 + + + 1023 + 0.9900000000000000000 + 1 + 187 + 2745 + + + 1024 + 0.9900000000000000000 + 1 + 188 + 2759 + + + 1025 + 0.9900000000000000000 + 1 + 189 + 2760 + + + 1026 + 0.9900000000000000000 + 1 + 189 + 2761 + + + 1027 + 0.9900000000000000000 + 1 + 190 + 2763 + + + 1028 + 0.9900000000000000000 + 1 + 190 + 2765 + + + 1029 + 0.9900000000000000000 + 1 + 191 + 2767 + + + 1030 + 0.9900000000000000000 + 1 + 191 + 2769 + + + 1031 + 0.9900000000000000000 + 1 + 191 + 2771 + + + 1032 + 0.9900000000000000000 + 1 + 191 + 2773 + + + 1033 + 0.9900000000000000000 + 1 + 192 + 2777 + + + 1034 + 0.9900000000000000000 + 1 + 192 + 2781 + + + 1035 + 0.9900000000000000000 + 1 + 192 + 2785 + + + 1036 + 0.9900000000000000000 + 1 + 192 + 2789 + + + 1037 + 0.9900000000000000000 + 1 + 192 + 2793 + + + 1038 + 0.9900000000000000000 + 1 + 192 + 2797 + + + 1039 + 0.9900000000000000000 + 1 + 193 + 2803 + + + 1040 + 0.9900000000000000000 + 1 + 193 + 2809 + + + 1041 + 0.9900000000000000000 + 1 + 193 + 2815 + + + 1042 + 1.9900000000000000000 + 1 + 193 + 2821 + + + 1043 + 1.9900000000000000000 + 1 + 193 + 2827 + + + 1044 + 1.9900000000000000000 + 1 + 193 + 2833 + + + 1045 + 1.9900000000000000000 + 1 + 193 + 2839 + + + 1046 + 1.9900000000000000000 + 1 + 193 + 2845 + + + 1047 + 1.9900000000000000000 + 1 + 193 + 2851 + + + 1048 + 1.9900000000000000000 + 1 + 194 + 2860 + + + 1049 + 1.9900000000000000000 + 1 + 194 + 2869 + + + 1050 + 1.9900000000000000000 + 1 + 194 + 2878 + + + 1051 + 1.9900000000000000000 + 1 + 194 + 2887 + + + 1052 + 1.9900000000000000000 + 1 + 194 + 2896 + + + 1053 + 1.9900000000000000000 + 1 + 194 + 2905 + + + 1054 + 1.9900000000000000000 + 1 + 194 + 2914 + + + 1055 + 1.9900000000000000000 + 1 + 194 + 2923 + + + 1056 + 0.9900000000000000000 + 1 + 194 + 2932 + + + 1057 + 0.9900000000000000000 + 1 + 194 + 2941 + + + 1058 + 0.9900000000000000000 + 1 + 194 + 2950 + + + 1059 + 0.9900000000000000000 + 1 + 194 + 2959 + + + 1060 + 0.9900000000000000000 + 1 + 194 + 2968 + + + 1061 + 0.9900000000000000000 + 1 + 194 + 2977 + + + 1062 + 0.9900000000000000000 + 1 + 195 + 2991 + + + 1063 + 0.9900000000000000000 + 1 + 196 + 2992 + + + 1064 + 0.9900000000000000000 + 1 + 196 + 2993 + + + 1065 + 0.9900000000000000000 + 1 + 197 + 2995 + + + 1066 + 0.9900000000000000000 + 1 + 197 + 2997 + + + 1067 + 0.9900000000000000000 + 1 + 198 + 2999 + + + 1068 + 0.9900000000000000000 + 1 + 198 + 3001 + + + 1069 + 0.9900000000000000000 + 1 + 198 + 3003 + + + 1070 + 0.9900000000000000000 + 1 + 198 + 3005 + + + 1071 + 0.9900000000000000000 + 1 + 199 + 3009 + + + 1072 + 0.9900000000000000000 + 1 + 199 + 3013 + + + 1073 + 0.9900000000000000000 + 1 + 199 + 3017 + + + 1074 + 0.9900000000000000000 + 1 + 199 + 3021 + + + 1075 + 0.9900000000000000000 + 1 + 199 + 3025 + + + 1076 + 0.9900000000000000000 + 1 + 199 + 3029 + + + 1077 + 0.9900000000000000000 + 1 + 200 + 3035 + + + 1078 + 0.9900000000000000000 + 1 + 200 + 3041 + + + 1079 + 0.9900000000000000000 + 1 + 200 + 3047 + + + 1080 + 0.9900000000000000000 + 1 + 200 + 3053 + + + 1081 + 0.9900000000000000000 + 1 + 200 + 3059 + + + 1082 + 0.9900000000000000000 + 1 + 200 + 3065 + + + 1083 + 0.9900000000000000000 + 1 + 200 + 3071 + + + 1084 + 0.9900000000000000000 + 1 + 200 + 3077 + + + 1085 + 0.9900000000000000000 + 1 + 200 + 3083 + + + 1086 + 0.9900000000000000000 + 1 + 201 + 3092 + + + 1087 + 0.9900000000000000000 + 1 + 201 + 3101 + + + 1088 + 0.9900000000000000000 + 1 + 201 + 3110 + + + 1089 + 0.9900000000000000000 + 1 + 201 + 3119 + + + 1090 + 0.9900000000000000000 + 1 + 201 + 3128 + + + 1091 + 0.9900000000000000000 + 1 + 201 + 3137 + + + 1092 + 0.9900000000000000000 + 1 + 201 + 3146 + + + 1093 + 0.9900000000000000000 + 1 + 201 + 3155 + + + 1094 + 0.9900000000000000000 + 1 + 201 + 3164 + + + 1095 + 1.9900000000000000000 + 1 + 201 + 3173 + + + 1096 + 1.9900000000000000000 + 1 + 201 + 3182 + + + 1097 + 1.9900000000000000000 + 1 + 201 + 3191 + + + 1098 + 1.9900000000000000000 + 1 + 201 + 3200 + + + 1099 + 1.9900000000000000000 + 1 + 201 + 3209 + + + 1100 + 1.9900000000000000000 + 1 + 202 + 3223 + + + 1101 + 1.9900000000000000000 + 1 + 203 + 3224 + + + 1102 + 0.9900000000000000000 + 1 + 203 + 3225 + + + 1103 + 1.9900000000000000000 + 1 + 204 + 3227 + + + 1104 + 1.9900000000000000000 + 1 + 204 + 3229 + + + 1105 + 1.9900000000000000000 + 1 + 205 + 3231 + + + 1106 + 1.9900000000000000000 + 1 + 205 + 3233 + + + 1107 + 1.9900000000000000000 + 1 + 205 + 3235 + + + 1108 + 1.9900000000000000000 + 1 + 205 + 3237 + + + 1109 + 1.9900000000000000000 + 1 + 206 + 3241 + + + 1110 + 1.9900000000000000000 + 1 + 206 + 3245 + + + 1111 + 1.9900000000000000000 + 1 + 206 + 3249 + + + 1112 + 0.9900000000000000000 + 1 + 206 + 3253 + + + 1113 + 0.9900000000000000000 + 1 + 206 + 3257 + + + 1114 + 0.9900000000000000000 + 1 + 206 + 3261 + + + 1115 + 0.9900000000000000000 + 1 + 207 + 3267 + + + 1116 + 0.9900000000000000000 + 1 + 207 + 3273 + + + 1117 + 0.9900000000000000000 + 1 + 207 + 3279 + + + 1118 + 0.9900000000000000000 + 1 + 207 + 3285 + + + 1119 + 0.9900000000000000000 + 1 + 207 + 3291 + + + 1120 + 0.9900000000000000000 + 1 + 207 + 3297 + + + 1121 + 0.9900000000000000000 + 1 + 207 + 3303 + + + 1122 + 0.9900000000000000000 + 1 + 207 + 3309 + + + 1123 + 0.9900000000000000000 + 1 + 207 + 3315 + + + 1124 + 0.9900000000000000000 + 1 + 208 + 3324 + + + 1125 + 0.9900000000000000000 + 1 + 208 + 3333 + + + 1126 + 1.9900000000000000000 + 1 + 208 + 3342 + + + 1127 + 0.9900000000000000000 + 1 + 208 + 3351 + + + 1128 + 1.9900000000000000000 + 1 + 208 + 3360 + + + 1129 + 0.9900000000000000000 + 1 + 208 + 3369 + + + 1130 + 0.9900000000000000000 + 1 + 208 + 3378 + + + 1131 + 0.9900000000000000000 + 1 + 208 + 3387 + + + 1132 + 0.9900000000000000000 + 1 + 208 + 3396 + + + 1133 + 0.9900000000000000000 + 1 + 208 + 3405 + + + 1134 + 0.9900000000000000000 + 1 + 208 + 3414 + + + 1135 + 0.9900000000000000000 + 1 + 208 + 3423 + + + 1136 + 0.9900000000000000000 + 1 + 208 + 3432 + + + 1137 + 0.9900000000000000000 + 1 + 208 + 3441 + + + 1138 + 0.9900000000000000000 + 1 + 209 + 3455 + + + 1139 + 0.9900000000000000000 + 1 + 210 + 3456 + + + 1140 + 0.9900000000000000000 + 1 + 210 + 3457 + + + 1141 + 0.9900000000000000000 + 1 + 211 + 3459 + + + 1142 + 0.9900000000000000000 + 1 + 211 + 3461 + + + 1143 + 0.9900000000000000000 + 1 + 212 + 3463 + + + 1144 + 0.9900000000000000000 + 1 + 212 + 3465 + + + 1145 + 0.9900000000000000000 + 1 + 212 + 3467 + + + 1146 + 0.9900000000000000000 + 1 + 212 + 3469 + + + 1147 + 0.9900000000000000000 + 1 + 213 + 3473 + + + 1148 + 0.9900000000000000000 + 1 + 213 + 3477 + + + 1149 + 0.9900000000000000000 + 1 + 213 + 3481 + + + 1150 + 0.9900000000000000000 + 1 + 213 + 3485 + + + 1151 + 0.9900000000000000000 + 1 + 213 + 3489 + + + 1152 + 0.9900000000000000000 + 1 + 213 + 3493 + + + 1153 + 0.9900000000000000000 + 1 + 214 + 3499 + + + 1154 + 0.9900000000000000000 + 1 + 214 + 2 + + + 1155 + 0.9900000000000000000 + 1 + 214 + 8 + + + 1156 + 0.9900000000000000000 + 1 + 214 + 14 + + + 1157 + 0.9900000000000000000 + 1 + 214 + 20 + + + 1158 + 0.9900000000000000000 + 1 + 214 + 26 + + + 1159 + 0.9900000000000000000 + 1 + 214 + 32 + + + 1160 + 0.9900000000000000000 + 1 + 214 + 38 + + + 1161 + 0.9900000000000000000 + 1 + 214 + 44 + + + 1162 + 0.9900000000000000000 + 1 + 215 + 53 + + + 1163 + 0.9900000000000000000 + 1 + 215 + 62 + + + 1164 + 0.9900000000000000000 + 1 + 215 + 71 + + + 1165 + 0.9900000000000000000 + 1 + 215 + 80 + + + 1166 + 0.9900000000000000000 + 1 + 215 + 89 + + + 1167 + 0.9900000000000000000 + 1 + 215 + 98 + + + 1168 + 0.9900000000000000000 + 1 + 215 + 107 + + + 1169 + 0.9900000000000000000 + 1 + 215 + 116 + + + 1170 + 0.9900000000000000000 + 1 + 215 + 125 + + + 1171 + 0.9900000000000000000 + 1 + 215 + 134 + + + 1172 + 0.9900000000000000000 + 1 + 215 + 143 + + + 1173 + 0.9900000000000000000 + 1 + 215 + 152 + + + 1174 + 0.9900000000000000000 + 1 + 215 + 161 + + + 1175 + 0.9900000000000000000 + 1 + 215 + 170 + + + 1176 + 0.9900000000000000000 + 1 + 216 + 184 + + + 1177 + 0.9900000000000000000 + 1 + 217 + 185 + + + 1178 + 0.9900000000000000000 + 1 + 217 + 186 + + + 1179 + 0.9900000000000000000 + 1 + 218 + 188 + + + 1180 + 0.9900000000000000000 + 1 + 218 + 190 + + + 1181 + 0.9900000000000000000 + 1 + 219 + 192 + + + 1182 + 0.9900000000000000000 + 1 + 219 + 194 + + + 1183 + 0.9900000000000000000 + 1 + 219 + 196 + + + 1184 + 0.9900000000000000000 + 1 + 219 + 198 + + + 1185 + 0.9900000000000000000 + 1 + 220 + 202 + + + 1186 + 0.9900000000000000000 + 1 + 220 + 206 + + + 1187 + 0.9900000000000000000 + 1 + 220 + 210 + + + 1188 + 0.9900000000000000000 + 1 + 220 + 214 + + + 1189 + 0.9900000000000000000 + 1 + 220 + 218 + + + 1190 + 0.9900000000000000000 + 1 + 220 + 222 + + + 1191 + 0.9900000000000000000 + 1 + 221 + 228 + + + 1192 + 0.9900000000000000000 + 1 + 221 + 234 + + + 1193 + 0.9900000000000000000 + 1 + 221 + 240 + + + 1194 + 0.9900000000000000000 + 1 + 221 + 246 + + + 1195 + 0.9900000000000000000 + 1 + 221 + 252 + + + 1196 + 0.9900000000000000000 + 1 + 221 + 258 + + + 1197 + 0.9900000000000000000 + 1 + 221 + 264 + + + 1198 + 0.9900000000000000000 + 1 + 221 + 270 + + + 1199 + 0.9900000000000000000 + 1 + 221 + 276 + + + 1200 + 0.9900000000000000000 + 1 + 222 + 285 + + + 1201 + 0.9900000000000000000 + 1 + 222 + 294 + + + 1202 + 0.9900000000000000000 + 1 + 222 + 303 + + + 1203 + 0.9900000000000000000 + 1 + 222 + 312 + + + 1204 + 0.9900000000000000000 + 1 + 222 + 321 + + + 1205 + 0.9900000000000000000 + 1 + 222 + 330 + + + 1206 + 0.9900000000000000000 + 1 + 222 + 339 + + + 1207 + 0.9900000000000000000 + 1 + 222 + 348 + + + 1208 + 0.9900000000000000000 + 1 + 222 + 357 + + + 1209 + 0.9900000000000000000 + 1 + 222 + 366 + + + 1210 + 0.9900000000000000000 + 1 + 222 + 375 + + + 1211 + 0.9900000000000000000 + 1 + 222 + 384 + + + 1212 + 0.9900000000000000000 + 1 + 222 + 393 + + + 1213 + 0.9900000000000000000 + 1 + 222 + 402 + + + 1214 + 0.9900000000000000000 + 1 + 223 + 416 + + + 1215 + 0.9900000000000000000 + 1 + 224 + 417 + + + 1216 + 0.9900000000000000000 + 1 + 224 + 418 + + + 1217 + 0.9900000000000000000 + 1 + 225 + 420 + + + 1218 + 0.9900000000000000000 + 1 + 225 + 422 + + + 1219 + 0.9900000000000000000 + 1 + 226 + 424 + + + 1220 + 0.9900000000000000000 + 1 + 226 + 426 + + + 1221 + 0.9900000000000000000 + 1 + 226 + 428 + + + 1222 + 0.9900000000000000000 + 1 + 226 + 430 + + + 1223 + 0.9900000000000000000 + 1 + 227 + 434 + + + 1224 + 0.9900000000000000000 + 1 + 227 + 438 + + + 1225 + 0.9900000000000000000 + 1 + 227 + 442 + + + 1226 + 0.9900000000000000000 + 1 + 227 + 446 + + + 1227 + 0.9900000000000000000 + 1 + 227 + 450 + + + 1228 + 0.9900000000000000000 + 1 + 227 + 454 + + + 1229 + 0.9900000000000000000 + 1 + 228 + 460 + + + 1230 + 0.9900000000000000000 + 1 + 228 + 466 + + + 1231 + 0.9900000000000000000 + 1 + 228 + 472 + + + 1232 + 0.9900000000000000000 + 1 + 228 + 478 + + + 1233 + 0.9900000000000000000 + 1 + 228 + 484 + + + 1234 + 0.9900000000000000000 + 1 + 228 + 490 + + + 1235 + 0.9900000000000000000 + 1 + 228 + 496 + + + 1236 + 0.9900000000000000000 + 1 + 228 + 502 + + + 1237 + 0.9900000000000000000 + 1 + 228 + 508 + + + 1238 + 0.9900000000000000000 + 1 + 229 + 517 + + + 1239 + 0.9900000000000000000 + 1 + 229 + 526 + + + 1240 + 0.9900000000000000000 + 1 + 229 + 535 + + + 1241 + 0.9900000000000000000 + 1 + 229 + 544 + + + 1242 + 0.9900000000000000000 + 1 + 229 + 553 + + + 1243 + 0.9900000000000000000 + 1 + 229 + 562 + + + 1244 + 0.9900000000000000000 + 1 + 229 + 571 + + + 1245 + 0.9900000000000000000 + 1 + 229 + 580 + + + 1246 + 0.9900000000000000000 + 1 + 229 + 589 + + + 1247 + 0.9900000000000000000 + 1 + 229 + 598 + + + 1248 + 0.9900000000000000000 + 1 + 229 + 607 + + + 1249 + 0.9900000000000000000 + 1 + 229 + 616 + + + 1250 + 0.9900000000000000000 + 1 + 229 + 625 + + + 1251 + 0.9900000000000000000 + 1 + 229 + 634 + + + 1252 + 0.9900000000000000000 + 1 + 230 + 648 + + + 1253 + 0.9900000000000000000 + 1 + 231 + 649 + + + 1254 + 0.9900000000000000000 + 1 + 231 + 650 + + + 1255 + 0.9900000000000000000 + 1 + 232 + 652 + + + 1256 + 0.9900000000000000000 + 1 + 232 + 654 + + + 1257 + 0.9900000000000000000 + 1 + 233 + 656 + + + 1258 + 0.9900000000000000000 + 1 + 233 + 658 + + + 1259 + 0.9900000000000000000 + 1 + 233 + 660 + + + 1260 + 0.9900000000000000000 + 1 + 233 + 662 + + + 1261 + 0.9900000000000000000 + 1 + 234 + 666 + + + 1262 + 0.9900000000000000000 + 1 + 234 + 670 + + + 1263 + 0.9900000000000000000 + 1 + 234 + 674 + + + 1264 + 0.9900000000000000000 + 1 + 234 + 678 + + + 1265 + 0.9900000000000000000 + 1 + 234 + 682 + + + 1266 + 0.9900000000000000000 + 1 + 234 + 686 + + + 1267 + 0.9900000000000000000 + 1 + 235 + 692 + + + 1268 + 0.9900000000000000000 + 1 + 235 + 698 + + + 1269 + 0.9900000000000000000 + 1 + 235 + 704 + + + 1270 + 0.9900000000000000000 + 1 + 235 + 710 + + + 1271 + 0.9900000000000000000 + 1 + 235 + 716 + + + 1272 + 0.9900000000000000000 + 1 + 235 + 722 + + + 1273 + 0.9900000000000000000 + 1 + 235 + 728 + + + 1274 + 0.9900000000000000000 + 1 + 235 + 734 + + + 1275 + 0.9900000000000000000 + 1 + 235 + 740 + + + 1276 + 0.9900000000000000000 + 1 + 236 + 749 + + + 1277 + 0.9900000000000000000 + 1 + 236 + 758 + + + 1278 + 0.9900000000000000000 + 1 + 236 + 767 + + + 1279 + 0.9900000000000000000 + 1 + 236 + 776 + + + 1280 + 0.9900000000000000000 + 1 + 236 + 785 + + + 1281 + 0.9900000000000000000 + 1 + 236 + 794 + + + 1282 + 0.9900000000000000000 + 1 + 236 + 803 + + + 1283 + 0.9900000000000000000 + 1 + 236 + 812 + + + 1284 + 0.9900000000000000000 + 1 + 236 + 821 + + + 1285 + 0.9900000000000000000 + 1 + 236 + 830 + + + 1286 + 0.9900000000000000000 + 1 + 236 + 839 + + + 1287 + 0.9900000000000000000 + 1 + 236 + 848 + + + 1288 + 0.9900000000000000000 + 1 + 236 + 857 + + + 1289 + 0.9900000000000000000 + 1 + 236 + 866 + + + 1290 + 0.9900000000000000000 + 1 + 237 + 880 + + + 1291 + 0.9900000000000000000 + 1 + 238 + 881 + + + 1292 + 0.9900000000000000000 + 1 + 238 + 882 + + + 1293 + 0.9900000000000000000 + 1 + 239 + 884 + + + 1294 + 0.9900000000000000000 + 1 + 239 + 886 + + + 1295 + 0.9900000000000000000 + 1 + 240 + 888 + + + 1296 + 0.9900000000000000000 + 1 + 240 + 890 + + + 1297 + 0.9900000000000000000 + 1 + 240 + 892 + + + 1298 + 0.9900000000000000000 + 1 + 240 + 894 + + + 1299 + 0.9900000000000000000 + 1 + 241 + 898 + + + 1300 + 0.9900000000000000000 + 1 + 241 + 902 + + + 1301 + 0.9900000000000000000 + 1 + 241 + 906 + + + 1302 + 0.9900000000000000000 + 1 + 241 + 910 + + + 1303 + 0.9900000000000000000 + 1 + 241 + 914 + + + 1304 + 0.9900000000000000000 + 1 + 241 + 918 + + + 1305 + 0.9900000000000000000 + 1 + 242 + 924 + + + 1306 + 0.9900000000000000000 + 1 + 242 + 930 + + + 1307 + 0.9900000000000000000 + 1 + 242 + 936 + + + 1308 + 0.9900000000000000000 + 1 + 242 + 942 + + + 1309 + 0.9900000000000000000 + 1 + 242 + 948 + + + 1310 + 0.9900000000000000000 + 1 + 242 + 954 + + + 1311 + 0.9900000000000000000 + 1 + 242 + 960 + + + 1312 + 0.9900000000000000000 + 1 + 242 + 966 + + + 1313 + 0.9900000000000000000 + 1 + 242 + 972 + + + 1314 + 0.9900000000000000000 + 1 + 243 + 981 + + + 1315 + 0.9900000000000000000 + 1 + 243 + 990 + + + 1316 + 0.9900000000000000000 + 1 + 243 + 999 + + + 1317 + 0.9900000000000000000 + 1 + 243 + 1008 + + + 1318 + 0.9900000000000000000 + 1 + 243 + 1017 + + + 1319 + 0.9900000000000000000 + 1 + 243 + 1026 + + + 1320 + 0.9900000000000000000 + 1 + 243 + 1035 + + + 1321 + 0.9900000000000000000 + 1 + 243 + 1044 + + + 1322 + 0.9900000000000000000 + 1 + 243 + 1053 + + + 1323 + 0.9900000000000000000 + 1 + 243 + 1062 + + + 1324 + 0.9900000000000000000 + 1 + 243 + 1071 + + + 1325 + 0.9900000000000000000 + 1 + 243 + 1080 + + + 1326 + 0.9900000000000000000 + 1 + 243 + 1089 + + + 1327 + 0.9900000000000000000 + 1 + 243 + 1098 + + + 1328 + 0.9900000000000000000 + 1 + 244 + 1112 + + + 1329 + 0.9900000000000000000 + 1 + 245 + 1113 + + + 1330 + 0.9900000000000000000 + 1 + 245 + 1114 + + + 1331 + 0.9900000000000000000 + 1 + 246 + 1116 + + + 1332 + 0.9900000000000000000 + 1 + 246 + 1118 + + + 1333 + 0.9900000000000000000 + 1 + 247 + 1120 + + + 1334 + 0.9900000000000000000 + 1 + 247 + 1122 + + + 1335 + 0.9900000000000000000 + 1 + 247 + 1124 + + + 1336 + 0.9900000000000000000 + 1 + 247 + 1126 + + + 1337 + 0.9900000000000000000 + 1 + 248 + 1130 + + + 1338 + 0.9900000000000000000 + 1 + 248 + 1134 + + + 1339 + 0.9900000000000000000 + 1 + 248 + 1138 + + + 1340 + 0.9900000000000000000 + 1 + 248 + 1142 + + + 1341 + 0.9900000000000000000 + 1 + 248 + 1146 + + + 1342 + 0.9900000000000000000 + 1 + 248 + 1150 + + + 1343 + 0.9900000000000000000 + 1 + 249 + 1156 + + + 1344 + 0.9900000000000000000 + 1 + 249 + 1162 + + + 1345 + 0.9900000000000000000 + 1 + 249 + 1168 + + + 1346 + 0.9900000000000000000 + 1 + 249 + 1174 + + + 1347 + 0.9900000000000000000 + 1 + 249 + 1180 + + + 1348 + 0.9900000000000000000 + 1 + 249 + 1186 + + + 1349 + 0.9900000000000000000 + 1 + 249 + 1192 + + + 1350 + 0.9900000000000000000 + 1 + 249 + 1198 + + + 1351 + 0.9900000000000000000 + 1 + 249 + 1204 + + + 1352 + 0.9900000000000000000 + 1 + 250 + 1213 + + + 1353 + 0.9900000000000000000 + 1 + 250 + 1222 + + + 1354 + 0.9900000000000000000 + 1 + 250 + 1231 + + + 1355 + 0.9900000000000000000 + 1 + 250 + 1240 + + + 1356 + 0.9900000000000000000 + 1 + 250 + 1249 + + + 1357 + 0.9900000000000000000 + 1 + 250 + 1258 + + + 1358 + 0.9900000000000000000 + 1 + 250 + 1267 + + + 1359 + 0.9900000000000000000 + 1 + 250 + 1276 + + + 1360 + 0.9900000000000000000 + 1 + 250 + 1285 + + + 1361 + 0.9900000000000000000 + 1 + 250 + 1294 + + + 1362 + 0.9900000000000000000 + 1 + 250 + 1303 + + + 1363 + 0.9900000000000000000 + 1 + 250 + 1312 + + + 1364 + 0.9900000000000000000 + 1 + 250 + 1321 + + + 1365 + 0.9900000000000000000 + 1 + 250 + 1330 + + + 1366 + 0.9900000000000000000 + 1 + 251 + 1344 + + + 1367 + 0.9900000000000000000 + 1 + 252 + 1345 + + + 1368 + 0.9900000000000000000 + 1 + 252 + 1346 + + + 1369 + 0.9900000000000000000 + 1 + 253 + 1348 + + + 1370 + 0.9900000000000000000 + 1 + 253 + 1350 + + + 1371 + 0.9900000000000000000 + 1 + 254 + 1352 + + + 1372 + 0.9900000000000000000 + 1 + 254 + 1354 + + + 1373 + 0.9900000000000000000 + 1 + 254 + 1356 + + + 1374 + 0.9900000000000000000 + 1 + 254 + 1358 + + + 1375 + 0.9900000000000000000 + 1 + 255 + 1362 + + + 1376 + 0.9900000000000000000 + 1 + 255 + 1366 + + + 1377 + 0.9900000000000000000 + 1 + 255 + 1370 + + + 1378 + 0.9900000000000000000 + 1 + 255 + 1374 + + + 1379 + 0.9900000000000000000 + 1 + 255 + 1378 + + + 1380 + 0.9900000000000000000 + 1 + 255 + 1382 + + + 1381 + 0.9900000000000000000 + 1 + 256 + 1388 + + + 1382 + 0.9900000000000000000 + 1 + 256 + 1394 + + + 1383 + 0.9900000000000000000 + 1 + 256 + 1400 + + + 1384 + 0.9900000000000000000 + 1 + 256 + 1406 + + + 1385 + 0.9900000000000000000 + 1 + 256 + 1412 + + + 1386 + 0.9900000000000000000 + 1 + 256 + 1418 + + + 1387 + 0.9900000000000000000 + 1 + 256 + 1424 + + + 1388 + 0.9900000000000000000 + 1 + 256 + 1430 + + + 1389 + 0.9900000000000000000 + 1 + 256 + 1436 + + + 1390 + 0.9900000000000000000 + 1 + 257 + 1445 + + + 1391 + 0.9900000000000000000 + 1 + 257 + 1454 + + + 1392 + 0.9900000000000000000 + 1 + 257 + 1463 + + + 1393 + 0.9900000000000000000 + 1 + 257 + 1472 + + + 1394 + 0.9900000000000000000 + 1 + 257 + 1481 + + + 1395 + 0.9900000000000000000 + 1 + 257 + 1490 + + + 1396 + 0.9900000000000000000 + 1 + 257 + 1499 + + + 1397 + 0.9900000000000000000 + 1 + 257 + 1508 + + + 1398 + 0.9900000000000000000 + 1 + 257 + 1517 + + + 1399 + 0.9900000000000000000 + 1 + 257 + 1526 + + + 1400 + 0.9900000000000000000 + 1 + 257 + 1535 + + + 1401 + 0.9900000000000000000 + 1 + 257 + 1544 + + + 1402 + 0.9900000000000000000 + 1 + 257 + 1553 + + + 1403 + 0.9900000000000000000 + 1 + 257 + 1562 + + + 1404 + 0.9900000000000000000 + 1 + 258 + 1576 + + + 1405 + 0.9900000000000000000 + 1 + 259 + 1577 + + + 1406 + 0.9900000000000000000 + 1 + 259 + 1578 + + + 1407 + 0.9900000000000000000 + 1 + 260 + 1580 + + + 1408 + 0.9900000000000000000 + 1 + 260 + 1582 + + + 1409 + 0.9900000000000000000 + 1 + 261 + 1584 + + + 1410 + 0.9900000000000000000 + 1 + 261 + 1586 + + + 1411 + 0.9900000000000000000 + 1 + 261 + 1588 + + + 1412 + 0.9900000000000000000 + 1 + 261 + 1590 + + + 1413 + 0.9900000000000000000 + 1 + 262 + 1594 + + + 1414 + 0.9900000000000000000 + 1 + 262 + 1598 + + + 1415 + 0.9900000000000000000 + 1 + 262 + 1602 + + + 1416 + 0.9900000000000000000 + 1 + 262 + 1606 + + + 1417 + 0.9900000000000000000 + 1 + 262 + 1610 + + + 1418 + 0.9900000000000000000 + 1 + 262 + 1614 + + + 1419 + 0.9900000000000000000 + 1 + 263 + 1620 + + + 1420 + 0.9900000000000000000 + 1 + 263 + 1626 + + + 1421 + 0.9900000000000000000 + 1 + 263 + 1632 + + + 1422 + 0.9900000000000000000 + 1 + 263 + 1638 + + + 1423 + 0.9900000000000000000 + 1 + 263 + 1644 + + + 1424 + 0.9900000000000000000 + 1 + 263 + 1650 + + + 1425 + 0.9900000000000000000 + 1 + 263 + 1656 + + + 1426 + 0.9900000000000000000 + 1 + 263 + 1662 + + + 1427 + 0.9900000000000000000 + 1 + 263 + 1668 + + + 1428 + 0.9900000000000000000 + 1 + 264 + 1677 + + + 1429 + 0.9900000000000000000 + 1 + 264 + 1686 + + + 1430 + 0.9900000000000000000 + 1 + 264 + 1695 + + + 1431 + 0.9900000000000000000 + 1 + 264 + 1704 + + + 1432 + 0.9900000000000000000 + 1 + 264 + 1713 + + + 1433 + 0.9900000000000000000 + 1 + 264 + 1722 + + + 1434 + 0.9900000000000000000 + 1 + 264 + 1731 + + + 1435 + 0.9900000000000000000 + 1 + 264 + 1740 + + + 1436 + 0.9900000000000000000 + 1 + 264 + 1749 + + + 1437 + 0.9900000000000000000 + 1 + 264 + 1758 + + + 1438 + 0.9900000000000000000 + 1 + 264 + 1767 + + + 1439 + 0.9900000000000000000 + 1 + 264 + 1776 + + + 1440 + 0.9900000000000000000 + 1 + 264 + 1785 + + + 1441 + 0.9900000000000000000 + 1 + 264 + 1794 + + + 1442 + 0.9900000000000000000 + 1 + 265 + 1808 + + + 1443 + 0.9900000000000000000 + 1 + 266 + 1809 + + + 1444 + 0.9900000000000000000 + 1 + 266 + 1810 + + + 1445 + 0.9900000000000000000 + 1 + 267 + 1812 + + + 1446 + 0.9900000000000000000 + 1 + 267 + 1814 + + + 1447 + 0.9900000000000000000 + 1 + 268 + 1816 + + + 1448 + 0.9900000000000000000 + 1 + 268 + 1818 + + + 1449 + 0.9900000000000000000 + 1 + 268 + 1820 + + + 1450 + 0.9900000000000000000 + 1 + 268 + 1822 + + + 1451 + 0.9900000000000000000 + 1 + 269 + 1826 + + + 1452 + 0.9900000000000000000 + 1 + 269 + 1830 + + + 1453 + 0.9900000000000000000 + 1 + 269 + 1834 + + + 1454 + 0.9900000000000000000 + 1 + 269 + 1838 + + + 1455 + 0.9900000000000000000 + 1 + 269 + 1842 + + + 1456 + 0.9900000000000000000 + 1 + 269 + 1846 + + + 1457 + 0.9900000000000000000 + 1 + 270 + 1852 + + + 1458 + 0.9900000000000000000 + 1 + 270 + 1858 + + + 1459 + 0.9900000000000000000 + 1 + 270 + 1864 + + + 1460 + 0.9900000000000000000 + 1 + 270 + 1870 + + + 1461 + 0.9900000000000000000 + 1 + 270 + 1876 + + + 1462 + 0.9900000000000000000 + 1 + 270 + 1882 + + + 1463 + 0.9900000000000000000 + 1 + 270 + 1888 + + + 1464 + 0.9900000000000000000 + 1 + 270 + 1894 + + + 1465 + 0.9900000000000000000 + 1 + 270 + 1900 + + + 1466 + 0.9900000000000000000 + 1 + 271 + 1909 + + + 1467 + 0.9900000000000000000 + 1 + 271 + 1918 + + + 1468 + 0.9900000000000000000 + 1 + 271 + 1927 + + + 1469 + 0.9900000000000000000 + 1 + 271 + 1936 + + + 1470 + 0.9900000000000000000 + 1 + 271 + 1945 + + + 1471 + 0.9900000000000000000 + 1 + 271 + 1954 + + + 1472 + 0.9900000000000000000 + 1 + 271 + 1963 + + + 1473 + 0.9900000000000000000 + 1 + 271 + 1972 + + + 1474 + 0.9900000000000000000 + 1 + 271 + 1981 + + + 1475 + 0.9900000000000000000 + 1 + 271 + 1990 + + + 1476 + 0.9900000000000000000 + 1 + 271 + 1999 + + + 1477 + 0.9900000000000000000 + 1 + 271 + 2008 + + + 1478 + 0.9900000000000000000 + 1 + 271 + 2017 + + + 1479 + 0.9900000000000000000 + 1 + 271 + 2026 + + + 1480 + 0.9900000000000000000 + 1 + 272 + 2040 + + + 1481 + 0.9900000000000000000 + 1 + 273 + 2041 + + + 1482 + 0.9900000000000000000 + 1 + 273 + 2042 + + + 1483 + 0.9900000000000000000 + 1 + 274 + 2044 + + + 1484 + 0.9900000000000000000 + 1 + 274 + 2046 + + + 1485 + 0.9900000000000000000 + 1 + 275 + 2048 + + + 1486 + 0.9900000000000000000 + 1 + 275 + 2050 + + + 1487 + 0.9900000000000000000 + 1 + 275 + 2052 + + + 1488 + 0.9900000000000000000 + 1 + 275 + 2054 + + + 1489 + 0.9900000000000000000 + 1 + 276 + 2058 + + + 1490 + 0.9900000000000000000 + 1 + 276 + 2062 + + + 1491 + 0.9900000000000000000 + 1 + 276 + 2066 + + + 1492 + 0.9900000000000000000 + 1 + 276 + 2070 + + + 1493 + 0.9900000000000000000 + 1 + 276 + 2074 + + + 1494 + 0.9900000000000000000 + 1 + 276 + 2078 + + + 1495 + 0.9900000000000000000 + 1 + 277 + 2084 + + + 1496 + 0.9900000000000000000 + 1 + 277 + 2090 + + + 1497 + 0.9900000000000000000 + 1 + 277 + 2096 + + + 1498 + 0.9900000000000000000 + 1 + 277 + 2102 + + + 1499 + 0.9900000000000000000 + 1 + 277 + 2108 + + + 1500 + 0.9900000000000000000 + 1 + 277 + 2114 + + + 1501 + 0.9900000000000000000 + 1 + 277 + 2120 + + + 1502 + 0.9900000000000000000 + 1 + 277 + 2126 + + + 1503 + 0.9900000000000000000 + 1 + 277 + 2132 + + + 1504 + 0.9900000000000000000 + 1 + 278 + 2141 + + + 1505 + 0.9900000000000000000 + 1 + 278 + 2150 + + + 1506 + 0.9900000000000000000 + 1 + 278 + 2159 + + + 1507 + 0.9900000000000000000 + 1 + 278 + 2168 + + + 1508 + 0.9900000000000000000 + 1 + 278 + 2177 + + + 1509 + 0.9900000000000000000 + 1 + 278 + 2186 + + + 1510 + 0.9900000000000000000 + 1 + 278 + 2195 + + + 1511 + 0.9900000000000000000 + 1 + 278 + 2204 + + + 1512 + 0.9900000000000000000 + 1 + 278 + 2213 + + + 1513 + 0.9900000000000000000 + 1 + 278 + 2222 + + + 1514 + 0.9900000000000000000 + 1 + 278 + 2231 + + + 1515 + 0.9900000000000000000 + 1 + 278 + 2240 + + + 1516 + 0.9900000000000000000 + 1 + 278 + 2249 + + + 1517 + 0.9900000000000000000 + 1 + 278 + 2258 + + + 1518 + 0.9900000000000000000 + 1 + 279 + 2272 + + + 1519 + 0.9900000000000000000 + 1 + 280 + 2273 + + + 1520 + 0.9900000000000000000 + 1 + 280 + 2274 + + + 1521 + 0.9900000000000000000 + 1 + 281 + 2276 + + + 1522 + 0.9900000000000000000 + 1 + 281 + 2278 + + + 1523 + 0.9900000000000000000 + 1 + 282 + 2280 + + + 1524 + 0.9900000000000000000 + 1 + 282 + 2282 + + + 1525 + 0.9900000000000000000 + 1 + 282 + 2284 + + + 1526 + 0.9900000000000000000 + 1 + 282 + 2286 + + + 1527 + 0.9900000000000000000 + 1 + 283 + 2290 + + + 1528 + 0.9900000000000000000 + 1 + 283 + 2294 + + + 1529 + 0.9900000000000000000 + 1 + 283 + 2298 + + + 1530 + 0.9900000000000000000 + 1 + 283 + 2302 + + + 1531 + 0.9900000000000000000 + 1 + 283 + 2306 + + + 1532 + 0.9900000000000000000 + 1 + 283 + 2310 + + + 1533 + 0.9900000000000000000 + 1 + 284 + 2316 + + + 1534 + 0.9900000000000000000 + 1 + 284 + 2322 + + + 1535 + 0.9900000000000000000 + 1 + 284 + 2328 + + + 1536 + 0.9900000000000000000 + 1 + 284 + 2334 + + + 1537 + 0.9900000000000000000 + 1 + 284 + 2340 + + + 1538 + 0.9900000000000000000 + 1 + 284 + 2346 + + + 1539 + 0.9900000000000000000 + 1 + 284 + 2352 + + + 1540 + 0.9900000000000000000 + 1 + 284 + 2358 + + + 1541 + 0.9900000000000000000 + 1 + 284 + 2364 + + + 1542 + 0.9900000000000000000 + 1 + 285 + 2373 + + + 1543 + 0.9900000000000000000 + 1 + 285 + 2382 + + + 1544 + 0.9900000000000000000 + 1 + 285 + 2391 + + + 1545 + 0.9900000000000000000 + 1 + 285 + 2400 + + + 1546 + 0.9900000000000000000 + 1 + 285 + 2409 + + + 1547 + 0.9900000000000000000 + 1 + 285 + 2418 + + + 1548 + 0.9900000000000000000 + 1 + 285 + 2427 + + + 1549 + 0.9900000000000000000 + 1 + 285 + 2436 + + + 1550 + 0.9900000000000000000 + 1 + 285 + 2445 + + + 1551 + 0.9900000000000000000 + 1 + 285 + 2454 + + + 1552 + 0.9900000000000000000 + 1 + 285 + 2463 + + + 1553 + 0.9900000000000000000 + 1 + 285 + 2472 + + + 1554 + 0.9900000000000000000 + 1 + 285 + 2481 + + + 1555 + 0.9900000000000000000 + 1 + 285 + 2490 + + + 1556 + 0.9900000000000000000 + 1 + 286 + 2504 + + + 1557 + 0.9900000000000000000 + 1 + 287 + 2505 + + + 1558 + 0.9900000000000000000 + 1 + 287 + 2506 + + + 1559 + 0.9900000000000000000 + 1 + 288 + 2508 + + + 1560 + 0.9900000000000000000 + 1 + 288 + 2510 + + + 1561 + 0.9900000000000000000 + 1 + 289 + 2512 + + + 1562 + 0.9900000000000000000 + 1 + 289 + 2514 + + + 1563 + 0.9900000000000000000 + 1 + 289 + 2516 + + + 1564 + 0.9900000000000000000 + 1 + 289 + 2518 + + + 1565 + 0.9900000000000000000 + 1 + 290 + 2522 + + + 1566 + 0.9900000000000000000 + 1 + 290 + 2526 + + + 1567 + 0.9900000000000000000 + 1 + 290 + 2530 + + + 1568 + 0.9900000000000000000 + 1 + 290 + 2534 + + + 1569 + 0.9900000000000000000 + 1 + 290 + 2538 + + + 1570 + 0.9900000000000000000 + 1 + 290 + 2542 + + + 1571 + 0.9900000000000000000 + 1 + 291 + 2548 + + + 1572 + 0.9900000000000000000 + 1 + 291 + 2554 + + + 1573 + 0.9900000000000000000 + 1 + 291 + 2560 + + + 1574 + 0.9900000000000000000 + 1 + 291 + 2566 + + + 1575 + 0.9900000000000000000 + 1 + 291 + 2572 + + + 1576 + 0.9900000000000000000 + 1 + 291 + 2578 + + + 1577 + 0.9900000000000000000 + 1 + 291 + 2584 + + + 1578 + 0.9900000000000000000 + 1 + 291 + 2590 + + + 1579 + 0.9900000000000000000 + 1 + 291 + 2596 + + + 1580 + 0.9900000000000000000 + 1 + 292 + 2605 + + + 1581 + 0.9900000000000000000 + 1 + 292 + 2614 + + + 1582 + 0.9900000000000000000 + 1 + 292 + 2623 + + + 1583 + 0.9900000000000000000 + 1 + 292 + 2632 + + + 1584 + 0.9900000000000000000 + 1 + 292 + 2641 + + + 1585 + 0.9900000000000000000 + 1 + 292 + 2650 + + + 1586 + 0.9900000000000000000 + 1 + 292 + 2659 + + + 1587 + 0.9900000000000000000 + 1 + 292 + 2668 + + + 1588 + 0.9900000000000000000 + 1 + 292 + 2677 + + + 1589 + 0.9900000000000000000 + 1 + 292 + 2686 + + + 1590 + 0.9900000000000000000 + 1 + 292 + 2695 + + + 1591 + 0.9900000000000000000 + 1 + 292 + 2704 + + + 1592 + 0.9900000000000000000 + 1 + 292 + 2713 + + + 1593 + 0.9900000000000000000 + 1 + 292 + 2722 + + + 1594 + 0.9900000000000000000 + 1 + 293 + 2736 + + + 1595 + 0.9900000000000000000 + 1 + 294 + 2737 + + + 1596 + 0.9900000000000000000 + 1 + 294 + 2738 + + + 1597 + 0.9900000000000000000 + 1 + 295 + 2740 + + + 1598 + 0.9900000000000000000 + 1 + 295 + 2742 + + + 1599 + 0.9900000000000000000 + 1 + 296 + 2744 + + + 1600 + 0.9900000000000000000 + 1 + 296 + 2746 + + + 1601 + 0.9900000000000000000 + 1 + 296 + 2748 + + + 1602 + 0.9900000000000000000 + 1 + 296 + 2750 + + + 1603 + 0.9900000000000000000 + 1 + 297 + 2754 + + + 1604 + 0.9900000000000000000 + 1 + 297 + 2758 + + + 1605 + 0.9900000000000000000 + 1 + 297 + 2762 + + + 1606 + 0.9900000000000000000 + 1 + 297 + 2766 + + + 1607 + 0.9900000000000000000 + 1 + 297 + 2770 + + + 1608 + 0.9900000000000000000 + 1 + 297 + 2774 + + + 1609 + 0.9900000000000000000 + 1 + 298 + 2780 + + + 1610 + 0.9900000000000000000 + 1 + 298 + 2786 + + + 1611 + 0.9900000000000000000 + 1 + 298 + 2792 + + + 1612 + 0.9900000000000000000 + 1 + 298 + 2798 + + + 1613 + 0.9900000000000000000 + 1 + 298 + 2804 + + + 1614 + 0.9900000000000000000 + 1 + 298 + 2810 + + + 1615 + 0.9900000000000000000 + 1 + 298 + 2816 + + + 1616 + 1.9900000000000000000 + 1 + 298 + 2822 + + + 1617 + 1.9900000000000000000 + 1 + 298 + 2828 + + + 1618 + 1.9900000000000000000 + 1 + 299 + 2837 + + + 1619 + 1.9900000000000000000 + 1 + 299 + 2846 + + + 1620 + 1.9900000000000000000 + 1 + 299 + 2855 + + + 1621 + 1.9900000000000000000 + 1 + 299 + 2864 + + + 1622 + 1.9900000000000000000 + 1 + 299 + 2873 + + + 1623 + 1.9900000000000000000 + 1 + 299 + 2882 + + + 1624 + 1.9900000000000000000 + 1 + 299 + 2891 + + + 1625 + 1.9900000000000000000 + 1 + 299 + 2900 + + + 1626 + 1.9900000000000000000 + 1 + 299 + 2909 + + + 1627 + 1.9900000000000000000 + 1 + 299 + 2918 + + + 1628 + 0.9900000000000000000 + 1 + 299 + 2927 + + + 1629 + 0.9900000000000000000 + 1 + 299 + 2936 + + + 1630 + 0.9900000000000000000 + 1 + 299 + 2945 + + + 1631 + 0.9900000000000000000 + 1 + 299 + 2954 + + + 1632 + 0.9900000000000000000 + 1 + 300 + 2968 + + + 1633 + 0.9900000000000000000 + 1 + 301 + 2969 + + + 1634 + 0.9900000000000000000 + 1 + 301 + 2970 + + + 1635 + 0.9900000000000000000 + 1 + 302 + 2972 + + + 1636 + 0.9900000000000000000 + 1 + 302 + 2974 + + + 1637 + 0.9900000000000000000 + 1 + 303 + 2976 + + + 1638 + 0.9900000000000000000 + 1 + 303 + 2978 + + + 1639 + 0.9900000000000000000 + 1 + 303 + 2980 + + + 1640 + 0.9900000000000000000 + 1 + 303 + 2982 + + + 1641 + 0.9900000000000000000 + 1 + 304 + 2986 + + + 1642 + 0.9900000000000000000 + 1 + 304 + 2990 + + + 1643 + 0.9900000000000000000 + 1 + 304 + 2994 + + + 1644 + 0.9900000000000000000 + 1 + 304 + 2998 + + + 1645 + 0.9900000000000000000 + 1 + 304 + 3002 + + + 1646 + 0.9900000000000000000 + 1 + 304 + 3006 + + + 1647 + 0.9900000000000000000 + 1 + 305 + 3012 + + + 1648 + 0.9900000000000000000 + 1 + 305 + 3018 + + + 1649 + 0.9900000000000000000 + 1 + 305 + 3024 + + + 1650 + 0.9900000000000000000 + 1 + 305 + 3030 + + + 1651 + 0.9900000000000000000 + 1 + 305 + 3036 + + + 1652 + 0.9900000000000000000 + 1 + 305 + 3042 + + + 1653 + 0.9900000000000000000 + 1 + 305 + 3048 + + + 1654 + 0.9900000000000000000 + 1 + 305 + 3054 + + + 1655 + 0.9900000000000000000 + 1 + 305 + 3060 + + + 1656 + 0.9900000000000000000 + 1 + 306 + 3069 + + + 1657 + 0.9900000000000000000 + 1 + 306 + 3078 + + + 1658 + 0.9900000000000000000 + 1 + 306 + 3087 + + + 1659 + 0.9900000000000000000 + 1 + 306 + 3096 + + + 1660 + 0.9900000000000000000 + 1 + 306 + 3105 + + + 1661 + 0.9900000000000000000 + 1 + 306 + 3114 + + + 1662 + 0.9900000000000000000 + 1 + 306 + 3123 + + + 1663 + 0.9900000000000000000 + 1 + 306 + 3132 + + + 1664 + 0.9900000000000000000 + 1 + 306 + 3141 + + + 1665 + 0.9900000000000000000 + 1 + 306 + 3150 + + + 1666 + 0.9900000000000000000 + 1 + 306 + 3159 + + + 1667 + 1.9900000000000000000 + 1 + 306 + 3168 + + + 1668 + 1.9900000000000000000 + 1 + 306 + 3177 + + + 1669 + 1.9900000000000000000 + 1 + 306 + 3186 + + + 1670 + 1.9900000000000000000 + 1 + 307 + 3200 + + + 1671 + 1.9900000000000000000 + 1 + 308 + 3201 + + + 1672 + 1.9900000000000000000 + 1 + 308 + 3202 + + + 1673 + 1.9900000000000000000 + 1 + 309 + 3204 + + + 1674 + 1.9900000000000000000 + 1 + 309 + 3206 + + + 1675 + 1.9900000000000000000 + 1 + 310 + 3208 + + + 1676 + 1.9900000000000000000 + 1 + 310 + 3210 + + + 1677 + 1.9900000000000000000 + 1 + 310 + 3212 + + + 1678 + 1.9900000000000000000 + 1 + 310 + 3214 + + + 1679 + 1.9900000000000000000 + 1 + 311 + 3218 + + + 1680 + 1.9900000000000000000 + 1 + 311 + 3222 + + + 1681 + 1.9900000000000000000 + 1 + 311 + 3226 + + + 1682 + 1.9900000000000000000 + 1 + 311 + 3230 + + + 1683 + 1.9900000000000000000 + 1 + 311 + 3234 + + + 1684 + 1.9900000000000000000 + 1 + 311 + 3238 + + + 1685 + 1.9900000000000000000 + 1 + 312 + 3244 + + + 1686 + 1.9900000000000000000 + 1 + 312 + 3250 + + + 1687 + 0.9900000000000000000 + 1 + 312 + 3256 + + + 1688 + 0.9900000000000000000 + 1 + 312 + 3262 + + + 1689 + 0.9900000000000000000 + 1 + 312 + 3268 + + + 1690 + 0.9900000000000000000 + 1 + 312 + 3274 + + + 1691 + 0.9900000000000000000 + 1 + 312 + 3280 + + + 1692 + 0.9900000000000000000 + 1 + 312 + 3286 + + + 1693 + 0.9900000000000000000 + 1 + 312 + 3292 + + + 1694 + 0.9900000000000000000 + 1 + 313 + 3301 + + + 1695 + 0.9900000000000000000 + 1 + 313 + 3310 + + + 1696 + 0.9900000000000000000 + 1 + 313 + 3319 + + + 1697 + 0.9900000000000000000 + 1 + 313 + 3328 + + + 1698 + 1.9900000000000000000 + 1 + 313 + 3337 + + + 1699 + 1.9900000000000000000 + 1 + 313 + 3346 + + + 1700 + 0.9900000000000000000 + 1 + 313 + 3355 + + + 1701 + 1.9900000000000000000 + 1 + 313 + 3364 + + + 1702 + 0.9900000000000000000 + 1 + 313 + 3373 + + + 1703 + 0.9900000000000000000 + 1 + 313 + 3382 + + + 1704 + 0.9900000000000000000 + 1 + 313 + 3391 + + + 1705 + 0.9900000000000000000 + 1 + 313 + 3400 + + + 1706 + 0.9900000000000000000 + 1 + 313 + 3409 + + + 1707 + 0.9900000000000000000 + 1 + 313 + 3418 + + + 1708 + 0.9900000000000000000 + 1 + 314 + 3432 + + + 1709 + 0.9900000000000000000 + 1 + 315 + 3433 + + + 1710 + 0.9900000000000000000 + 1 + 315 + 3434 + + + 1711 + 0.9900000000000000000 + 1 + 316 + 3436 + + + 1712 + 0.9900000000000000000 + 1 + 316 + 3438 + + + 1713 + 0.9900000000000000000 + 1 + 317 + 3440 + + + 1714 + 0.9900000000000000000 + 1 + 317 + 3442 + + + 1715 + 0.9900000000000000000 + 1 + 317 + 3444 + + + 1716 + 0.9900000000000000000 + 1 + 317 + 3446 + + + 1717 + 0.9900000000000000000 + 1 + 318 + 3450 + + + 1718 + 0.9900000000000000000 + 1 + 318 + 3454 + + + 1719 + 0.9900000000000000000 + 1 + 318 + 3458 + + + 1720 + 0.9900000000000000000 + 1 + 318 + 3462 + + + 1721 + 0.9900000000000000000 + 1 + 318 + 3466 + + + 1722 + 0.9900000000000000000 + 1 + 318 + 3470 + + + 1723 + 0.9900000000000000000 + 1 + 319 + 3476 + + + 1724 + 0.9900000000000000000 + 1 + 319 + 3482 + + + 1725 + 0.9900000000000000000 + 1 + 319 + 3488 + + + 1726 + 0.9900000000000000000 + 1 + 319 + 3494 + + + 1727 + 0.9900000000000000000 + 1 + 319 + 3500 + + + 1728 + 0.9900000000000000000 + 1 + 319 + 3 + + + 1729 + 0.9900000000000000000 + 1 + 319 + 9 + + + 1730 + 0.9900000000000000000 + 1 + 319 + 15 + + + 1731 + 0.9900000000000000000 + 1 + 319 + 21 + + + 1732 + 0.9900000000000000000 + 1 + 320 + 30 + + + 1733 + 0.9900000000000000000 + 1 + 320 + 39 + + + 1734 + 0.9900000000000000000 + 1 + 320 + 48 + + + 1735 + 0.9900000000000000000 + 1 + 320 + 57 + + + 1736 + 0.9900000000000000000 + 1 + 320 + 66 + + + 1737 + 0.9900000000000000000 + 1 + 320 + 75 + + + 1738 + 0.9900000000000000000 + 1 + 320 + 84 + + + 1739 + 0.9900000000000000000 + 1 + 320 + 93 + + + 1740 + 0.9900000000000000000 + 1 + 320 + 102 + + + 1741 + 0.9900000000000000000 + 1 + 320 + 111 + + + 1742 + 0.9900000000000000000 + 1 + 320 + 120 + + + 1743 + 0.9900000000000000000 + 1 + 320 + 129 + + + 1744 + 0.9900000000000000000 + 1 + 320 + 138 + + + 1745 + 0.9900000000000000000 + 1 + 320 + 147 + + + 1746 + 0.9900000000000000000 + 1 + 321 + 161 + + + 1747 + 0.9900000000000000000 + 1 + 322 + 162 + + + 1748 + 0.9900000000000000000 + 1 + 322 + 163 + + + 1749 + 0.9900000000000000000 + 1 + 323 + 165 + + + 1750 + 0.9900000000000000000 + 1 + 323 + 167 + + + 1751 + 0.9900000000000000000 + 1 + 324 + 169 + + + 1752 + 0.9900000000000000000 + 1 + 324 + 171 + + + 1753 + 0.9900000000000000000 + 1 + 324 + 173 + + + 1754 + 0.9900000000000000000 + 1 + 324 + 175 + + + 1755 + 0.9900000000000000000 + 1 + 325 + 179 + + + 1756 + 0.9900000000000000000 + 1 + 325 + 183 + + + 1757 + 0.9900000000000000000 + 1 + 325 + 187 + + + 1758 + 0.9900000000000000000 + 1 + 325 + 191 + + + 1759 + 0.9900000000000000000 + 1 + 325 + 195 + + + 1760 + 0.9900000000000000000 + 1 + 325 + 199 + + + 1761 + 0.9900000000000000000 + 1 + 326 + 205 + + + 1762 + 0.9900000000000000000 + 1 + 326 + 211 + + + 1763 + 0.9900000000000000000 + 1 + 326 + 217 + + + 1764 + 0.9900000000000000000 + 1 + 326 + 223 + + + 1765 + 0.9900000000000000000 + 1 + 326 + 229 + + + 1766 + 0.9900000000000000000 + 1 + 326 + 235 + + + 1767 + 0.9900000000000000000 + 1 + 326 + 241 + + + 1768 + 0.9900000000000000000 + 1 + 326 + 247 + + + 1769 + 0.9900000000000000000 + 1 + 326 + 253 + + + 1770 + 0.9900000000000000000 + 1 + 327 + 262 + + + 1771 + 0.9900000000000000000 + 1 + 327 + 271 + + + 1772 + 0.9900000000000000000 + 1 + 327 + 280 + + + 1773 + 0.9900000000000000000 + 1 + 327 + 289 + + + 1774 + 0.9900000000000000000 + 1 + 327 + 298 + + + 1775 + 0.9900000000000000000 + 1 + 327 + 307 + + + 1776 + 0.9900000000000000000 + 1 + 327 + 316 + + + 1777 + 0.9900000000000000000 + 1 + 327 + 325 + + + 1778 + 0.9900000000000000000 + 1 + 327 + 334 + + + 1779 + 0.9900000000000000000 + 1 + 327 + 343 + + + 1780 + 0.9900000000000000000 + 1 + 327 + 352 + + + 1781 + 0.9900000000000000000 + 1 + 327 + 361 + + + 1782 + 0.9900000000000000000 + 1 + 327 + 370 + + + 1783 + 0.9900000000000000000 + 1 + 327 + 379 + + + 1784 + 0.9900000000000000000 + 1 + 328 + 393 + + + 1785 + 0.9900000000000000000 + 1 + 329 + 394 + + + 1786 + 0.9900000000000000000 + 1 + 329 + 395 + + + 1787 + 0.9900000000000000000 + 1 + 330 + 397 + + + 1788 + 0.9900000000000000000 + 1 + 330 + 399 + + + 1789 + 0.9900000000000000000 + 1 + 331 + 401 + + + 1790 + 0.9900000000000000000 + 1 + 331 + 403 + + + 1791 + 0.9900000000000000000 + 1 + 331 + 405 + + + 1792 + 0.9900000000000000000 + 1 + 331 + 407 + + + 1793 + 0.9900000000000000000 + 1 + 332 + 411 + + + 1794 + 0.9900000000000000000 + 1 + 332 + 415 + + + 1795 + 0.9900000000000000000 + 1 + 332 + 419 + + + 1796 + 0.9900000000000000000 + 1 + 332 + 423 + + + 1797 + 0.9900000000000000000 + 1 + 332 + 427 + + + 1798 + 0.9900000000000000000 + 1 + 332 + 431 + + + 1799 + 0.9900000000000000000 + 1 + 333 + 437 + + + 1800 + 0.9900000000000000000 + 1 + 333 + 443 + + + 1801 + 0.9900000000000000000 + 1 + 333 + 449 + + + 1802 + 0.9900000000000000000 + 1 + 333 + 455 + + + 1803 + 0.9900000000000000000 + 1 + 333 + 461 + + + 1804 + 0.9900000000000000000 + 1 + 333 + 467 + + + 1805 + 0.9900000000000000000 + 1 + 333 + 473 + + + 1806 + 0.9900000000000000000 + 1 + 333 + 479 + + + 1807 + 0.9900000000000000000 + 1 + 333 + 485 + + + 1808 + 0.9900000000000000000 + 1 + 334 + 494 + + + 1809 + 0.9900000000000000000 + 1 + 334 + 503 + + + 1810 + 0.9900000000000000000 + 1 + 334 + 512 + + + 1811 + 0.9900000000000000000 + 1 + 334 + 521 + + + 1812 + 0.9900000000000000000 + 1 + 334 + 530 + + + 1813 + 0.9900000000000000000 + 1 + 334 + 539 + + + 1814 + 0.9900000000000000000 + 1 + 334 + 548 + + + 1815 + 0.9900000000000000000 + 1 + 334 + 557 + + + 1816 + 0.9900000000000000000 + 1 + 334 + 566 + + + 1817 + 0.9900000000000000000 + 1 + 334 + 575 + + + 1818 + 0.9900000000000000000 + 1 + 334 + 584 + + + 1819 + 0.9900000000000000000 + 1 + 334 + 593 + + + 1820 + 0.9900000000000000000 + 1 + 334 + 602 + + + 1821 + 0.9900000000000000000 + 1 + 334 + 611 + + + 1822 + 0.9900000000000000000 + 1 + 335 + 625 + + + 1823 + 0.9900000000000000000 + 1 + 336 + 626 + + + 1824 + 0.9900000000000000000 + 1 + 336 + 627 + + + 1825 + 0.9900000000000000000 + 1 + 337 + 629 + + + 1826 + 0.9900000000000000000 + 1 + 337 + 631 + + + 1827 + 0.9900000000000000000 + 1 + 338 + 633 + + + 1828 + 0.9900000000000000000 + 1 + 338 + 635 + + + 1829 + 0.9900000000000000000 + 1 + 338 + 637 + + + 1830 + 0.9900000000000000000 + 1 + 338 + 639 + + + 1831 + 0.9900000000000000000 + 1 + 339 + 643 + + + 1832 + 0.9900000000000000000 + 1 + 339 + 647 + + + 1833 + 0.9900000000000000000 + 1 + 339 + 651 + + + 1834 + 0.9900000000000000000 + 1 + 339 + 655 + + + 1835 + 0.9900000000000000000 + 1 + 339 + 659 + + + 1836 + 0.9900000000000000000 + 1 + 339 + 663 + + + 1837 + 0.9900000000000000000 + 1 + 340 + 669 + + + 1838 + 0.9900000000000000000 + 1 + 340 + 675 + + + 1839 + 0.9900000000000000000 + 1 + 340 + 681 + + + 1840 + 0.9900000000000000000 + 1 + 340 + 687 + + + 1841 + 0.9900000000000000000 + 1 + 340 + 693 + + + 1842 + 0.9900000000000000000 + 1 + 340 + 699 + + + 1843 + 0.9900000000000000000 + 1 + 340 + 705 + + + 1844 + 0.9900000000000000000 + 1 + 340 + 711 + + + 1845 + 0.9900000000000000000 + 1 + 340 + 717 + + + 1846 + 0.9900000000000000000 + 1 + 341 + 726 + + + 1847 + 0.9900000000000000000 + 1 + 341 + 735 + + + 1848 + 0.9900000000000000000 + 1 + 341 + 744 + + + 1849 + 0.9900000000000000000 + 1 + 341 + 753 + + + 1850 + 0.9900000000000000000 + 1 + 341 + 762 + + + 1851 + 0.9900000000000000000 + 1 + 341 + 771 + + + 1852 + 0.9900000000000000000 + 1 + 341 + 780 + + + 1853 + 0.9900000000000000000 + 1 + 341 + 789 + + + 1854 + 0.9900000000000000000 + 1 + 341 + 798 + + + 1855 + 0.9900000000000000000 + 1 + 341 + 807 + + + 1856 + 0.9900000000000000000 + 1 + 341 + 816 + + + 1857 + 0.9900000000000000000 + 1 + 341 + 825 + + + 1858 + 0.9900000000000000000 + 1 + 341 + 834 + + + 1859 + 0.9900000000000000000 + 1 + 341 + 843 + + + 1860 + 0.9900000000000000000 + 1 + 342 + 857 + + + 1861 + 0.9900000000000000000 + 1 + 343 + 858 + + + 1862 + 0.9900000000000000000 + 1 + 343 + 859 + + + 1863 + 0.9900000000000000000 + 1 + 344 + 861 + + + 1864 + 0.9900000000000000000 + 1 + 344 + 863 + + + 1865 + 0.9900000000000000000 + 1 + 345 + 865 + + + 1866 + 0.9900000000000000000 + 1 + 345 + 867 + + + 1867 + 0.9900000000000000000 + 1 + 345 + 869 + + + 1868 + 0.9900000000000000000 + 1 + 345 + 871 + + + 1869 + 0.9900000000000000000 + 1 + 346 + 875 + + + 1870 + 0.9900000000000000000 + 1 + 346 + 879 + + + 1871 + 0.9900000000000000000 + 1 + 346 + 883 + + + 1872 + 0.9900000000000000000 + 1 + 346 + 887 + + + 1873 + 0.9900000000000000000 + 1 + 346 + 891 + + + 1874 + 0.9900000000000000000 + 1 + 346 + 895 + + + 1875 + 0.9900000000000000000 + 1 + 347 + 901 + + + 1876 + 0.9900000000000000000 + 1 + 347 + 907 + + + 1877 + 0.9900000000000000000 + 1 + 347 + 913 + + + 1878 + 0.9900000000000000000 + 1 + 347 + 919 + + + 1879 + 0.9900000000000000000 + 1 + 347 + 925 + + + 1880 + 0.9900000000000000000 + 1 + 347 + 931 + + + 1881 + 0.9900000000000000000 + 1 + 347 + 937 + + + 1882 + 0.9900000000000000000 + 1 + 347 + 943 + + + 1883 + 0.9900000000000000000 + 1 + 347 + 949 + + + 1884 + 0.9900000000000000000 + 1 + 348 + 958 + + + 1885 + 0.9900000000000000000 + 1 + 348 + 967 + + + 1886 + 0.9900000000000000000 + 1 + 348 + 976 + + + 1887 + 0.9900000000000000000 + 1 + 348 + 985 + + + 1888 + 0.9900000000000000000 + 1 + 348 + 994 + + + 1889 + 0.9900000000000000000 + 1 + 348 + 1003 + + + 1890 + 0.9900000000000000000 + 1 + 348 + 1012 + + + 1891 + 0.9900000000000000000 + 1 + 348 + 1021 + + + 1892 + 0.9900000000000000000 + 1 + 348 + 1030 + + + 1893 + 0.9900000000000000000 + 1 + 348 + 1039 + + + 1894 + 0.9900000000000000000 + 1 + 348 + 1048 + + + 1895 + 0.9900000000000000000 + 1 + 348 + 1057 + + + 1896 + 0.9900000000000000000 + 1 + 348 + 1066 + + + 1897 + 0.9900000000000000000 + 1 + 348 + 1075 + + + 1898 + 0.9900000000000000000 + 1 + 349 + 1089 + + + 1899 + 0.9900000000000000000 + 1 + 350 + 1090 + + + 1900 + 0.9900000000000000000 + 1 + 350 + 1091 + + + 1901 + 0.9900000000000000000 + 1 + 351 + 1093 + + + 1902 + 0.9900000000000000000 + 1 + 351 + 1095 + + + 1903 + 0.9900000000000000000 + 1 + 352 + 1097 + + + 1904 + 0.9900000000000000000 + 1 + 352 + 1099 + + + 1905 + 0.9900000000000000000 + 1 + 352 + 1101 + + + 1906 + 0.9900000000000000000 + 1 + 352 + 1103 + + + 1907 + 0.9900000000000000000 + 1 + 353 + 1107 + + + 1908 + 0.9900000000000000000 + 1 + 353 + 1111 + + + 1909 + 0.9900000000000000000 + 1 + 353 + 1115 + + + 1910 + 0.9900000000000000000 + 1 + 353 + 1119 + + + 1911 + 0.9900000000000000000 + 1 + 353 + 1123 + + + 1912 + 0.9900000000000000000 + 1 + 353 + 1127 + + + 1913 + 0.9900000000000000000 + 1 + 354 + 1133 + + + 1914 + 0.9900000000000000000 + 1 + 354 + 1139 + + + 1915 + 0.9900000000000000000 + 1 + 354 + 1145 + + + 1916 + 0.9900000000000000000 + 1 + 354 + 1151 + + + 1917 + 0.9900000000000000000 + 1 + 354 + 1157 + + + 1918 + 0.9900000000000000000 + 1 + 354 + 1163 + + + 1919 + 0.9900000000000000000 + 1 + 354 + 1169 + + + 1920 + 0.9900000000000000000 + 1 + 354 + 1175 + + + 1921 + 0.9900000000000000000 + 1 + 354 + 1181 + + + 1922 + 0.9900000000000000000 + 1 + 355 + 1190 + + + 1923 + 0.9900000000000000000 + 1 + 355 + 1199 + + + 1924 + 0.9900000000000000000 + 1 + 355 + 1208 + + + 1925 + 0.9900000000000000000 + 1 + 355 + 1217 + + + 1926 + 0.9900000000000000000 + 1 + 355 + 1226 + + + 1927 + 0.9900000000000000000 + 1 + 355 + 1235 + + + 1928 + 0.9900000000000000000 + 1 + 355 + 1244 + + + 1929 + 0.9900000000000000000 + 1 + 355 + 1253 + + + 1930 + 0.9900000000000000000 + 1 + 355 + 1262 + + + 1931 + 0.9900000000000000000 + 1 + 355 + 1271 + + + 1932 + 0.9900000000000000000 + 1 + 355 + 1280 + + + 1933 + 0.9900000000000000000 + 1 + 355 + 1289 + + + 1934 + 0.9900000000000000000 + 1 + 355 + 1298 + + + 1935 + 0.9900000000000000000 + 1 + 355 + 1307 + + + 1936 + 0.9900000000000000000 + 1 + 356 + 1321 + + + 1937 + 0.9900000000000000000 + 1 + 357 + 1322 + + + 1938 + 0.9900000000000000000 + 1 + 357 + 1323 + + + 1939 + 0.9900000000000000000 + 1 + 358 + 1325 + + + 1940 + 0.9900000000000000000 + 1 + 358 + 1327 + + + 1941 + 0.9900000000000000000 + 1 + 359 + 1329 + + + 1942 + 0.9900000000000000000 + 1 + 359 + 1331 + + + 1943 + 0.9900000000000000000 + 1 + 359 + 1333 + + + 1944 + 0.9900000000000000000 + 1 + 359 + 1335 + + + 1945 + 0.9900000000000000000 + 1 + 360 + 1339 + + + 1946 + 0.9900000000000000000 + 1 + 360 + 1343 + + + 1947 + 0.9900000000000000000 + 1 + 360 + 1347 + + + 1948 + 0.9900000000000000000 + 1 + 360 + 1351 + + + 1949 + 0.9900000000000000000 + 1 + 360 + 1355 + + + 1950 + 0.9900000000000000000 + 1 + 360 + 1359 + + + 1951 + 0.9900000000000000000 + 1 + 361 + 1365 + + + 1952 + 0.9900000000000000000 + 1 + 361 + 1371 + + + 1953 + 0.9900000000000000000 + 1 + 361 + 1377 + + + 1954 + 0.9900000000000000000 + 1 + 361 + 1383 + + + 1955 + 0.9900000000000000000 + 1 + 361 + 1389 + + + 1956 + 0.9900000000000000000 + 1 + 361 + 1395 + + + 1957 + 0.9900000000000000000 + 1 + 361 + 1401 + + + 1958 + 0.9900000000000000000 + 1 + 361 + 1407 + + + 1959 + 0.9900000000000000000 + 1 + 361 + 1413 + + + 1960 + 0.9900000000000000000 + 1 + 362 + 1422 + + + 1961 + 0.9900000000000000000 + 1 + 362 + 1431 + + + 1962 + 0.9900000000000000000 + 1 + 362 + 1440 + + + 1963 + 0.9900000000000000000 + 1 + 362 + 1449 + + + 1964 + 0.9900000000000000000 + 1 + 362 + 1458 + + + 1965 + 0.9900000000000000000 + 1 + 362 + 1467 + + + 1966 + 0.9900000000000000000 + 1 + 362 + 1476 + + + 1967 + 0.9900000000000000000 + 1 + 362 + 1485 + + + 1968 + 0.9900000000000000000 + 1 + 362 + 1494 + + + 1969 + 0.9900000000000000000 + 1 + 362 + 1503 + + + 1970 + 0.9900000000000000000 + 1 + 362 + 1512 + + + 1971 + 0.9900000000000000000 + 1 + 362 + 1521 + + + 1972 + 0.9900000000000000000 + 1 + 362 + 1530 + + + 1973 + 0.9900000000000000000 + 1 + 362 + 1539 + + + 1974 + 0.9900000000000000000 + 1 + 363 + 1553 + + + 1975 + 0.9900000000000000000 + 1 + 364 + 1554 + + + 1976 + 0.9900000000000000000 + 1 + 364 + 1555 + + + 1977 + 0.9900000000000000000 + 1 + 365 + 1557 + + + 1978 + 0.9900000000000000000 + 1 + 365 + 1559 + + + 1979 + 0.9900000000000000000 + 1 + 366 + 1561 + + + 1980 + 0.9900000000000000000 + 1 + 366 + 1563 + + + 1981 + 0.9900000000000000000 + 1 + 366 + 1565 + + + 1982 + 0.9900000000000000000 + 1 + 366 + 1567 + + + 1983 + 0.9900000000000000000 + 1 + 367 + 1571 + + + 1984 + 0.9900000000000000000 + 1 + 367 + 1575 + + + 1985 + 0.9900000000000000000 + 1 + 367 + 1579 + + + 1986 + 0.9900000000000000000 + 1 + 367 + 1583 + + + 1987 + 0.9900000000000000000 + 1 + 367 + 1587 + + + 1988 + 0.9900000000000000000 + 1 + 367 + 1591 + + + 1989 + 0.9900000000000000000 + 1 + 368 + 1597 + + + 1990 + 0.9900000000000000000 + 1 + 368 + 1603 + + + 1991 + 0.9900000000000000000 + 1 + 368 + 1609 + + + 1992 + 0.9900000000000000000 + 1 + 368 + 1615 + + + 1993 + 0.9900000000000000000 + 1 + 368 + 1621 + + + 1994 + 0.9900000000000000000 + 1 + 368 + 1627 + + + 1995 + 0.9900000000000000000 + 1 + 368 + 1633 + + + 1996 + 0.9900000000000000000 + 1 + 368 + 1639 + + + 1997 + 0.9900000000000000000 + 1 + 368 + 1645 + + + 1998 + 0.9900000000000000000 + 1 + 369 + 1654 + + + 1999 + 0.9900000000000000000 + 1 + 369 + 1663 + + + 2000 + 0.9900000000000000000 + 1 + 369 + 1672 + + + 2001 + 0.9900000000000000000 + 1 + 369 + 1681 + + + 2002 + 0.9900000000000000000 + 1 + 369 + 1690 + + + 2003 + 0.9900000000000000000 + 1 + 369 + 1699 + + + 2004 + 0.9900000000000000000 + 1 + 369 + 1708 + + + 2005 + 0.9900000000000000000 + 1 + 369 + 1717 + + + 2006 + 0.9900000000000000000 + 1 + 369 + 1726 + + + 2007 + 0.9900000000000000000 + 1 + 369 + 1735 + + + 2008 + 0.9900000000000000000 + 1 + 369 + 1744 + + + 2009 + 0.9900000000000000000 + 1 + 369 + 1753 + + + 2010 + 0.9900000000000000000 + 1 + 369 + 1762 + + + 2011 + 0.9900000000000000000 + 1 + 369 + 1771 + + + 2012 + 0.9900000000000000000 + 1 + 370 + 1785 + + + 2013 + 0.9900000000000000000 + 1 + 371 + 1786 + + + 2014 + 0.9900000000000000000 + 1 + 371 + 1787 + + + 2015 + 0.9900000000000000000 + 1 + 372 + 1789 + + + 2016 + 0.9900000000000000000 + 1 + 372 + 1791 + + + 2017 + 0.9900000000000000000 + 1 + 373 + 1793 + + + 2018 + 0.9900000000000000000 + 1 + 373 + 1795 + + + 2019 + 0.9900000000000000000 + 1 + 373 + 1797 + + + 2020 + 0.9900000000000000000 + 1 + 373 + 1799 + + + 2021 + 0.9900000000000000000 + 1 + 374 + 1803 + + + 2022 + 0.9900000000000000000 + 1 + 374 + 1807 + + + 2023 + 0.9900000000000000000 + 1 + 374 + 1811 + + + 2024 + 0.9900000000000000000 + 1 + 374 + 1815 + + + 2025 + 0.9900000000000000000 + 1 + 374 + 1819 + + + 2026 + 0.9900000000000000000 + 1 + 374 + 1823 + + + 2027 + 0.9900000000000000000 + 1 + 375 + 1829 + + + 2028 + 0.9900000000000000000 + 1 + 375 + 1835 + + + 2029 + 0.9900000000000000000 + 1 + 375 + 1841 + + + 2030 + 0.9900000000000000000 + 1 + 375 + 1847 + + + 2031 + 0.9900000000000000000 + 1 + 375 + 1853 + + + 2032 + 0.9900000000000000000 + 1 + 375 + 1859 + + + 2033 + 0.9900000000000000000 + 1 + 375 + 1865 + + + 2034 + 0.9900000000000000000 + 1 + 375 + 1871 + + + 2035 + 0.9900000000000000000 + 1 + 375 + 1877 + + + 2036 + 0.9900000000000000000 + 1 + 376 + 1886 + + + 2037 + 0.9900000000000000000 + 1 + 376 + 1895 + + + 2038 + 0.9900000000000000000 + 1 + 376 + 1904 + + + 2039 + 0.9900000000000000000 + 1 + 376 + 1913 + + + 2040 + 0.9900000000000000000 + 1 + 376 + 1922 + + + 2041 + 0.9900000000000000000 + 1 + 376 + 1931 + + + 2042 + 0.9900000000000000000 + 1 + 376 + 1940 + + + 2043 + 0.9900000000000000000 + 1 + 376 + 1949 + + + 2044 + 0.9900000000000000000 + 1 + 376 + 1958 + + + 2045 + 0.9900000000000000000 + 1 + 376 + 1967 + + + 2046 + 0.9900000000000000000 + 1 + 376 + 1976 + + + 2047 + 0.9900000000000000000 + 1 + 376 + 1985 + + + 2048 + 0.9900000000000000000 + 1 + 376 + 1994 + + + 2049 + 0.9900000000000000000 + 1 + 376 + 2003 + + + 2050 + 0.9900000000000000000 + 1 + 377 + 2017 + + + 2051 + 0.9900000000000000000 + 1 + 378 + 2018 + + + 2052 + 0.9900000000000000000 + 1 + 378 + 2019 + + + 2053 + 0.9900000000000000000 + 1 + 379 + 2021 + + + 2054 + 0.9900000000000000000 + 1 + 379 + 2023 + + + 2055 + 0.9900000000000000000 + 1 + 380 + 2025 + + + 2056 + 0.9900000000000000000 + 1 + 380 + 2027 + + + 2057 + 0.9900000000000000000 + 1 + 380 + 2029 + + + 2058 + 0.9900000000000000000 + 1 + 380 + 2031 + + + 2059 + 0.9900000000000000000 + 1 + 381 + 2035 + + + 2060 + 0.9900000000000000000 + 1 + 381 + 2039 + + + 2061 + 0.9900000000000000000 + 1 + 381 + 2043 + + + 2062 + 0.9900000000000000000 + 1 + 381 + 2047 + + + 2063 + 0.9900000000000000000 + 1 + 381 + 2051 + + + 2064 + 0.9900000000000000000 + 1 + 381 + 2055 + + + 2065 + 0.9900000000000000000 + 1 + 382 + 2061 + + + 2066 + 0.9900000000000000000 + 1 + 382 + 2067 + + + 2067 + 0.9900000000000000000 + 1 + 382 + 2073 + + + 2068 + 0.9900000000000000000 + 1 + 382 + 2079 + + + 2069 + 0.9900000000000000000 + 1 + 382 + 2085 + + + 2070 + 0.9900000000000000000 + 1 + 382 + 2091 + + + 2071 + 0.9900000000000000000 + 1 + 382 + 2097 + + + 2072 + 0.9900000000000000000 + 1 + 382 + 2103 + + + 2073 + 0.9900000000000000000 + 1 + 382 + 2109 + + + 2074 + 0.9900000000000000000 + 1 + 383 + 2118 + + + 2075 + 0.9900000000000000000 + 1 + 383 + 2127 + + + 2076 + 0.9900000000000000000 + 1 + 383 + 2136 + + + 2077 + 0.9900000000000000000 + 1 + 383 + 2145 + + + 2078 + 0.9900000000000000000 + 1 + 383 + 2154 + + + 2079 + 0.9900000000000000000 + 1 + 383 + 2163 + + + 2080 + 0.9900000000000000000 + 1 + 383 + 2172 + + + 2081 + 0.9900000000000000000 + 1 + 383 + 2181 + + + 2082 + 0.9900000000000000000 + 1 + 383 + 2190 + + + 2083 + 0.9900000000000000000 + 1 + 383 + 2199 + + + 2084 + 0.9900000000000000000 + 1 + 383 + 2208 + + + 2085 + 0.9900000000000000000 + 1 + 383 + 2217 + + + 2086 + 0.9900000000000000000 + 1 + 383 + 2226 + + + 2087 + 0.9900000000000000000 + 1 + 383 + 2235 + + + 2088 + 0.9900000000000000000 + 1 + 384 + 2249 + + + 2089 + 0.9900000000000000000 + 1 + 385 + 2250 + + + 2090 + 0.9900000000000000000 + 1 + 385 + 2251 + + + 2091 + 0.9900000000000000000 + 1 + 386 + 2253 + + + 2092 + 0.9900000000000000000 + 1 + 386 + 2255 + + + 2093 + 0.9900000000000000000 + 1 + 387 + 2257 + + + 2094 + 0.9900000000000000000 + 1 + 387 + 2259 + + + 2095 + 0.9900000000000000000 + 1 + 387 + 2261 + + + 2096 + 0.9900000000000000000 + 1 + 387 + 2263 + + + 2097 + 0.9900000000000000000 + 1 + 388 + 2267 + + + 2098 + 0.9900000000000000000 + 1 + 388 + 2271 + + + 2099 + 0.9900000000000000000 + 1 + 388 + 2275 + + + 2100 + 0.9900000000000000000 + 1 + 388 + 2279 + + + 2101 + 0.9900000000000000000 + 1 + 388 + 2283 + + + 2102 + 0.9900000000000000000 + 1 + 388 + 2287 + + + 2103 + 0.9900000000000000000 + 1 + 389 + 2293 + + + 2104 + 0.9900000000000000000 + 1 + 389 + 2299 + + + 2105 + 0.9900000000000000000 + 1 + 389 + 2305 + + + 2106 + 0.9900000000000000000 + 1 + 389 + 2311 + + + 2107 + 0.9900000000000000000 + 1 + 389 + 2317 + + + 2108 + 0.9900000000000000000 + 1 + 389 + 2323 + + + 2109 + 0.9900000000000000000 + 1 + 389 + 2329 + + + 2110 + 0.9900000000000000000 + 1 + 389 + 2335 + + + 2111 + 0.9900000000000000000 + 1 + 389 + 2341 + + + 2112 + 0.9900000000000000000 + 1 + 390 + 2350 + + + 2113 + 0.9900000000000000000 + 1 + 390 + 2359 + + + 2114 + 0.9900000000000000000 + 1 + 390 + 2368 + + + 2115 + 0.9900000000000000000 + 1 + 390 + 2377 + + + 2116 + 0.9900000000000000000 + 1 + 390 + 2386 + + + 2117 + 0.9900000000000000000 + 1 + 390 + 2395 + + + 2118 + 0.9900000000000000000 + 1 + 390 + 2404 + + + 2119 + 0.9900000000000000000 + 1 + 390 + 2413 + + + 2120 + 0.9900000000000000000 + 1 + 390 + 2422 + + + 2121 + 0.9900000000000000000 + 1 + 390 + 2431 + + + 2122 + 0.9900000000000000000 + 1 + 390 + 2440 + + + 2123 + 0.9900000000000000000 + 1 + 390 + 2449 + + + 2124 + 0.9900000000000000000 + 1 + 390 + 2458 + + + 2125 + 0.9900000000000000000 + 1 + 390 + 2467 + + + 2126 + 0.9900000000000000000 + 1 + 391 + 2481 + + + 2127 + 0.9900000000000000000 + 1 + 392 + 2482 + + + 2128 + 0.9900000000000000000 + 1 + 392 + 2483 + + + 2129 + 0.9900000000000000000 + 1 + 393 + 2485 + + + 2130 + 0.9900000000000000000 + 1 + 393 + 2487 + + + 2131 + 0.9900000000000000000 + 1 + 394 + 2489 + + + 2132 + 0.9900000000000000000 + 1 + 394 + 2491 + + + 2133 + 0.9900000000000000000 + 1 + 394 + 2493 + + + 2134 + 0.9900000000000000000 + 1 + 394 + 2495 + + + 2135 + 0.9900000000000000000 + 1 + 395 + 2499 + + + 2136 + 0.9900000000000000000 + 1 + 395 + 2503 + + + 2137 + 0.9900000000000000000 + 1 + 395 + 2507 + + + 2138 + 0.9900000000000000000 + 1 + 395 + 2511 + + + 2139 + 0.9900000000000000000 + 1 + 395 + 2515 + + + 2140 + 0.9900000000000000000 + 1 + 395 + 2519 + + + 2141 + 0.9900000000000000000 + 1 + 396 + 2525 + + + 2142 + 0.9900000000000000000 + 1 + 396 + 2531 + + + 2143 + 0.9900000000000000000 + 1 + 396 + 2537 + + + 2144 + 0.9900000000000000000 + 1 + 396 + 2543 + + + 2145 + 0.9900000000000000000 + 1 + 396 + 2549 + + + 2146 + 0.9900000000000000000 + 1 + 396 + 2555 + + + 2147 + 0.9900000000000000000 + 1 + 396 + 2561 + + + 2148 + 0.9900000000000000000 + 1 + 396 + 2567 + + + 2149 + 0.9900000000000000000 + 1 + 396 + 2573 + + + 2150 + 0.9900000000000000000 + 1 + 397 + 2582 + + + 2151 + 0.9900000000000000000 + 1 + 397 + 2591 + + + 2152 + 0.9900000000000000000 + 1 + 397 + 2600 + + + 2153 + 0.9900000000000000000 + 1 + 397 + 2609 + + + 2154 + 0.9900000000000000000 + 1 + 397 + 2618 + + + 2155 + 0.9900000000000000000 + 1 + 397 + 2627 + + + 2156 + 0.9900000000000000000 + 1 + 397 + 2636 + + + 2157 + 0.9900000000000000000 + 1 + 397 + 2645 + + + 2158 + 0.9900000000000000000 + 1 + 397 + 2654 + + + 2159 + 0.9900000000000000000 + 1 + 397 + 2663 + + + 2160 + 0.9900000000000000000 + 1 + 397 + 2672 + + + 2161 + 0.9900000000000000000 + 1 + 397 + 2681 + + + 2162 + 0.9900000000000000000 + 1 + 397 + 2690 + + + 2163 + 0.9900000000000000000 + 1 + 397 + 2699 + + + 2164 + 0.9900000000000000000 + 1 + 398 + 2713 + + + 2165 + 0.9900000000000000000 + 1 + 399 + 2714 + + + 2166 + 0.9900000000000000000 + 1 + 399 + 2715 + + + 2167 + 0.9900000000000000000 + 1 + 400 + 2717 + + + 2168 + 0.9900000000000000000 + 1 + 400 + 2719 + + + 2169 + 0.9900000000000000000 + 1 + 401 + 2721 + + + 2170 + 0.9900000000000000000 + 1 + 401 + 2723 + + + 2171 + 0.9900000000000000000 + 1 + 401 + 2725 + + + 2172 + 0.9900000000000000000 + 1 + 401 + 2727 + + + 2173 + 0.9900000000000000000 + 1 + 402 + 2731 + + + 2174 + 0.9900000000000000000 + 1 + 402 + 2735 + + + 2175 + 0.9900000000000000000 + 1 + 402 + 2739 + + + 2176 + 0.9900000000000000000 + 1 + 402 + 2743 + + + 2177 + 0.9900000000000000000 + 1 + 402 + 2747 + + + 2178 + 0.9900000000000000000 + 1 + 402 + 2751 + + + 2179 + 0.9900000000000000000 + 1 + 403 + 2757 + + + 2180 + 0.9900000000000000000 + 1 + 403 + 2763 + + + 2181 + 0.9900000000000000000 + 1 + 403 + 2769 + + + 2182 + 0.9900000000000000000 + 1 + 403 + 2775 + + + 2183 + 0.9900000000000000000 + 1 + 403 + 2781 + + + 2184 + 0.9900000000000000000 + 1 + 403 + 2787 + + + 2185 + 0.9900000000000000000 + 1 + 403 + 2793 + + + 2186 + 0.9900000000000000000 + 1 + 403 + 2799 + + + 2187 + 0.9900000000000000000 + 1 + 403 + 2805 + + + 2188 + 0.9900000000000000000 + 1 + 404 + 2814 + + + 2189 + 1.9900000000000000000 + 1 + 404 + 2823 + + + 2190 + 1.9900000000000000000 + 1 + 404 + 2832 + + + 2191 + 1.9900000000000000000 + 1 + 404 + 2841 + + + 2192 + 1.9900000000000000000 + 1 + 404 + 2850 + + + 2193 + 1.9900000000000000000 + 1 + 404 + 2859 + + + 2194 + 1.9900000000000000000 + 1 + 404 + 2868 + + + 2195 + 1.9900000000000000000 + 1 + 404 + 2877 + + + 2196 + 1.9900000000000000000 + 1 + 404 + 2886 + + + 2197 + 1.9900000000000000000 + 1 + 404 + 2895 + + + 2198 + 1.9900000000000000000 + 1 + 404 + 2904 + + + 2199 + 1.9900000000000000000 + 1 + 404 + 2913 + + + 2200 + 1.9900000000000000000 + 1 + 404 + 2922 + + + 2201 + 0.9900000000000000000 + 1 + 404 + 2931 + + + 2202 + 0.9900000000000000000 + 1 + 405 + 2945 + + + 2203 + 0.9900000000000000000 + 1 + 406 + 2946 + + + 2204 + 0.9900000000000000000 + 1 + 406 + 2947 + + + 2205 + 0.9900000000000000000 + 1 + 407 + 2949 + + + 2206 + 0.9900000000000000000 + 1 + 407 + 2951 + + + 2207 + 0.9900000000000000000 + 1 + 408 + 2953 + + + 2208 + 0.9900000000000000000 + 1 + 408 + 2955 + + + 2209 + 0.9900000000000000000 + 1 + 408 + 2957 + + + 2210 + 0.9900000000000000000 + 1 + 408 + 2959 + + + 2211 + 0.9900000000000000000 + 1 + 409 + 2963 + + + 2212 + 0.9900000000000000000 + 1 + 409 + 2967 + + + 2213 + 0.9900000000000000000 + 1 + 409 + 2971 + + + 2214 + 0.9900000000000000000 + 1 + 409 + 2975 + + + 2215 + 0.9900000000000000000 + 1 + 409 + 2979 + + + 2216 + 0.9900000000000000000 + 1 + 409 + 2983 + + + 2217 + 0.9900000000000000000 + 1 + 410 + 2989 + + + 2218 + 0.9900000000000000000 + 1 + 410 + 2995 + + + 2219 + 0.9900000000000000000 + 1 + 410 + 3001 + + + 2220 + 0.9900000000000000000 + 1 + 410 + 3007 + + + 2221 + 0.9900000000000000000 + 1 + 410 + 3013 + + + 2222 + 0.9900000000000000000 + 1 + 410 + 3019 + + + 2223 + 0.9900000000000000000 + 1 + 410 + 3025 + + + 2224 + 0.9900000000000000000 + 1 + 410 + 3031 + + + 2225 + 0.9900000000000000000 + 1 + 410 + 3037 + + + 2226 + 0.9900000000000000000 + 1 + 411 + 3046 + + + 2227 + 0.9900000000000000000 + 1 + 411 + 3055 + + + 2228 + 0.9900000000000000000 + 1 + 411 + 3064 + + + 2229 + 0.9900000000000000000 + 1 + 411 + 3073 + + + 2230 + 0.9900000000000000000 + 1 + 411 + 3082 + + + 2231 + 0.9900000000000000000 + 1 + 411 + 3091 + + + 2232 + 0.9900000000000000000 + 1 + 411 + 3100 + + + 2233 + 0.9900000000000000000 + 1 + 411 + 3109 + + + 2234 + 0.9900000000000000000 + 1 + 411 + 3118 + + + 2235 + 0.9900000000000000000 + 1 + 411 + 3127 + + + 2236 + 0.9900000000000000000 + 1 + 411 + 3136 + + + 2237 + 0.9900000000000000000 + 1 + 411 + 3145 + + + 2238 + 0.9900000000000000000 + 1 + 411 + 3154 + + + 2239 + 0.9900000000000000000 + 1 + 411 + 3163 + + + 2240 + 1.9900000000000000000 + 1 + 412 + 3177 + + + + + + System.Int32 + System.String + System.String + System.Int32 + System.Byte[] + System.Decimal + System.Int32 + System.Int32 + System.Int32 + System.Int32 + + + + 1 + For Those About To Rock (We Salute You) + Angus Young, Malcolm Young, Brian Johnson + 343719 + 9tEMc5MWVcyg+2MUpPUQ + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 2 + Balls to the Wall + + 342562 + n96Enog8b5l0yb7ccE3D + 0.9900000000000000000 + 2 + 2 + 1 + 1 + + + 3 + Fast As a Shark + F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman + 230619 + yQatCNLpHiTFP3Q= + 0.9900000000000000000 + 3 + 2 + 1 + 1 + + + 4 + Restless and Wild + F. Baltes, R.A. Smith-Diesel, S. Kaufman, U. Dirkscneider & W. Hoffman + 252051 + 04RlslHSyGAa + 0.9900000000000000000 + 3 + 2 + 1 + 1 + + + 5 + Princess of the Dawn + Deaffy & R.A. Smith-Diesel + 375418 + 2Llic//KV3lbUzfqSp4= + 0.9900000000000000000 + 3 + 2 + 1 + 1 + + + 6 + Put The Finger On You + Angus Young, Malcolm Young, Brian Johnson + 205662 + CPu1wGDZSMeYxu9jDIqehWI= + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 7 + Let's Get It Up + Angus Young, Malcolm Young, Brian Johnson + 233926 + 9i3zpl/qUw== + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 8 + Inject The Venom + Angus Young, Malcolm Young, Brian Johnson + 210834 + TOMhn+g6x2lJ1hOgufqQ + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 9 + Snowballed + Angus Young, Malcolm Young, Brian Johnson + 203102 + ya0PZkvuvQ== + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 10 + Evil Walks + Angus Young, Malcolm Young, Brian Johnson + 263497 + 1IxUcFVim8psk4xkpfjd + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 11 + C.O.D. + Angus Young, Malcolm Young, Brian Johnson + 199836 + nKJBx3LCpPudAdyy2g== + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 12 + Breaking The Rules + Angus Young, Malcolm Young, Brian Johnson + 263288 + gV4lVMpb5VYU5jpIMyU= + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 13 + Night Of The Long Knives + Angus Young, Malcolm Young, Brian Johnson + 205688 + K0zRz1rKqKz2WxLoWNM= + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 14 + Spellbound + Angus Young, Malcolm Young, Brian Johnson + 270863 + hunwgBIuPg== + 0.9900000000000000000 + 1 + 1 + 1 + 1 + + + 15 + Go Down + AC/DC + 331180 + LYHPRY5bjSqPfo4= + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 16 + Dog Eat Dog + AC/DC + 215196 + tQrjgCHZsS/4 + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 17 + Let There Be Rock + AC/DC + 366654 + c4yDwF9RWLMTPuz7o02KhQ== + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 18 + Bad Boy Boogie + AC/DC + 267728 + UWgxgmnKYJ97BW8= + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 19 + Problem Child + AC/DC + 325041 + OX0OWHUOQ8LO+zs= + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 20 + Overdose + AC/DC + 369319 + 22pPhbpnlvWcv2DHxzUJwiIh + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 21 + Hell Ain't A Bad Place To Be + AC/DC + 254380 + S+hU2sHdoi4+R8NKVSxfp/96 + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 22 + Whole Lotta Rosie + AC/DC + 323761 + 5RRvecF5HUeQPwWA + 0.9900000000000000000 + 4 + 1 + 1 + 1 + + + 23 + Walk On Water + Steven Tyler, Joe Perry, Jack Blades, Tommy Shaw + 295680 + rRfw6YaQjacXOVeu + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 24 + Love In An Elevator + Steven Tyler, Joe Perry + 321828 + dQqaaI4KR0c8z9tuk2Gklg== + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 25 + Rag Doll + Steven Tyler, Joe Perry, Jim Vallance, Holly Knight + 264698 + 7jnHI5w9PHUgbu0zzdsYy+c= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 26 + What It Takes + Steven Tyler, Joe Perry, Desmond Child + 310622 + Eq0osPo4WHFIFHvzL+kRBUod + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 27 + Dude (Looks Like A Lady) + Steven Tyler, Joe Perry, Desmond Child + 264855 + ttjNXfJum1oTbvQ= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 28 + Janie's Got A Gun + Steven Tyler, Tom Hamilton + 330736 + oqtdkenpPj+Oyys= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 29 + Cryin' + Steven Tyler, Joe Perry, Taylor Rhodes + 309263 + J/osPwMix5D75DErRU82Ql7eRA== + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 30 + Amazing + Steven Tyler, Richie Supa + 356519 + VFHYR9JXJxwM3Q== + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 31 + Blind Man + Steven Tyler, Joe Perry, Taylor Rhodes + 240718 + 6q3YNvdBXFY= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 32 + Deuces Are Wild + Steven Tyler, Jim Vallance + 215875 + pmPIvnkxTJqy++Cvhieg1iI= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 33 + The Other Side + Steven Tyler, Jim Vallance + 244375 + bKz6q4Qdi0d+ + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 34 + Crazy + Steven Tyler, Joe Perry, Desmond Child + 316656 + GT4AAodTXA== + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 35 + Eat The Rich + Steven Tyler, Joe Perry, Jim Vallance + 251036 + iRnNoAqNaRD9qWOFN18= + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 36 + Angel + Steven Tyler, Desmond Child + 307617 + XO+q9vreqjMys9+BdPreKDLL + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 37 + Livin' On The Edge + Steven Tyler, Joe Perry, Mark Hudson + 381231 + TQkXzKFsQnQf4Q== + 0.9900000000000000000 + 5 + 1 + 1 + 1 + + + 38 + All I Really Want + Alanis Morissette & Glenn Ballard + 284891 + +DW5aaQS3A== + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 39 + You Oughta Know + Alanis Morissette & Glenn Ballard + 249234 + YhHe5ZrsKwz1FR6AMbqHEctE + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 40 + Perfect + Alanis Morissette & Glenn Ballard + 188133 + CYm4aopRT7qpxwpWzEvU + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 41 + Hand In My Pocket + Alanis Morissette & Glenn Ballard + 221570 + nm8jfN91YA== + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 42 + Right Through You + Alanis Morissette & Glenn Ballard + 176117 + XgBgsT6uqJ5f7tPUqadTk0sx + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 43 + Forgiven + Alanis Morissette & Glenn Ballard + 300355 + Reu+UjVcUeiiqMhEkylr + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 44 + You Learn + Alanis Morissette & Glenn Ballard + 239699 + ifCefPsfa/beeAC/9xs= + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 45 + Head Over Feet + Alanis Morissette & Glenn Ballard + 267493 + Ma30GmGgritV7MYF9Q== + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 46 + Mary Jane + Alanis Morissette & Glenn Ballard + 280607 + qj+rPZvJoq0= + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 47 + Ironic + Alanis Morissette & Glenn Ballard + 229825 + hiZ/yHS8XJHxhg== + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 48 + Not The Doctor + Alanis Morissette & Glenn Ballard + 227631 + l5afDgpr28VIjzQZdl80OFSB + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 49 + Wake Up + Alanis Morissette & Glenn Ballard + 293485 + UuyE+G304tc6bvlb1X8= + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 50 + You Oughta Know (Alternate) + Alanis Morissette & Glenn Ballard + 491885 + /xOfnTMw7t1kJVEMCWhAhAcP + 0.9900000000000000000 + 6 + 1 + 1 + 1 + + + 51 + We Die Young + Jerry Cantrell + 152084 + NCwSnjIaJ5OhVk80X5o= + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 52 + Man In The Box + Jerry Cantrell, Layne Staley + 286641 + XyCYt04rZA8f + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 53 + Sea Of Sorrow + Jerry Cantrell + 349831 + G+fYb/nq8Us/S7DtdG2C + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 54 + Bleed The Freak + Jerry Cantrell + 241946 + nEyHFfDxcnAIH+tQwWrQHfM= + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 55 + I Can't Remember + Jerry Cantrell, Layne Staley + 222955 + FjNOJKdrXek= + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 56 + Love, Hate, Love + Jerry Cantrell, Layne Staley + 387134 + T+hyrCo0Qo4Xhwrh + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 57 + It Ain't Like That + Jerry Cantrell, Michael Starr, Sean Kinney + 277577 + dGhm2v+hidV7k/qoV0+8eKQ= + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 58 + Sunshine + Jerry Cantrell + 284969 + twfRI4eWcsAbfts= + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 59 + Put You Down + Jerry Cantrell + 196231 + lejq7L7lvc1svF9L01V4 + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 60 + Confusion + Jerry Cantrell, Michael Starr, Layne Staley + 344163 + 0+WFFnJsU9pYUOHQZz6G + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 61 + I Know Somethin (Bout You) + Jerry Cantrell + 261955 + +cL+Eb1qkNe61677p4ZPMg== + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 62 + Real Thing + Jerry Cantrell, Layne Staley + 243879 + bu02+cRGKJUPlG4E7WUu + 0.9900000000000000000 + 7 + 1 + 1 + 1 + + + 63 + Desafinado + + 185338 + VFERV2ZGaFSuXJq9VzLRAK6y + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 64 + Garota De Ipanema + + 285048 + UVARNXzVfK7WItLNcYA= + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 65 + Samba De Uma Nota Só (One Note Samba) + + 137273 + UjU+27YnhOFKaKtq + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 66 + Por Causa De Você + + 169900 + 3MJtVTps3OVD + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 67 + Ligia + + 251977 + lYHqmJIx3I8pPZLgnMLT+9LN + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 68 + Fotografia + + 129227 + xszQaj/REw== + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 69 + Dindi (Dindi) + + 253178 + fJIFo98PGahZ + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 70 + Se Todos Fossem Iguais A Você (Instrumental) + + 134948 + jvGwbtmCLar8 + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 71 + Falando De Amor + + 219663 + q4I+mg93fE7EF6vHfg== + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 72 + Angela + + 169508 + X/wjmrPQgxl6L0M= + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 73 + Corcovado (Quiet Nights Of Quiet Stars) + + 205662 + vVfzTjyU1O4K+lNrk2c= + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 74 + Outra Vez + + 126511 + yuRBIMdzNA/cXpI= + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 75 + O Boto (Bôto) + + 366837 + K6GRBw5WNLokW3baFvI= + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 76 + Canta, Canta Mais + + 271856 + cmSouAZLPg== + 0.9900000000000000000 + 8 + 1 + 2 + 1 + + + 77 + Enter Sandman + Apocalyptica + 221701 + NTgOe2iJSBfwqg== + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 78 + Master Of Puppets + Apocalyptica + 436453 + qUx48kQUX60= + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 79 + Harvester Of Sorrow + Apocalyptica + 374543 + b21mCtXjwaozpYus + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 80 + The Unforgiven + Apocalyptica + 322925 + 6FzPANrLMNxEhQ== + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 81 + Sad But True + Apocalyptica + 288208 + eUlD+XFkpKed0UrH0QSmhcc= + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 82 + Creeping Death + Apocalyptica + 308035 + 40oe8LtkHCNEOZN8kSvoNpCM + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 83 + Wherever I May Roam + Apocalyptica + 369345 + yDnPAeQOHJ6U/fs0Rmk+YDo= + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 84 + Welcome Home (Sanitarium) + Apocalyptica + 350197 + iI3f3U4fahMhPx7fm3MZ + 0.9900000000000000000 + 9 + 1 + 3 + 1 + + + 85 + Cochise + Audioslave/Chris Cornell + 222380 + /2QTSTnin8WHJUk= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 86 + Show Me How to Live + Audioslave/Chris Cornell + 277890 + TBNSyq0jCP/A6uuwltDs3H+1Yg== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 87 + Gasoline + Audioslave/Chris Cornell + 279457 + GmFp2Uzx2Q== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 88 + What You Are + Audioslave/Chris Cornell + 249391 + 7RlVKNVlxg3tVDJ3axokFA== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 89 + Like a Stone + Audioslave/Chris Cornell + 294034 + Y7Jp9sNG0sLB6uupeQ== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 90 + Set It Off + Audioslave/Chris Cornell + 263262 + vEpiEaaVwtoxCd7uKoI= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 91 + Shadow on the Sun + Audioslave/Chris Cornell + 343457 + HAA8VGDpPm+vKtOCZRR722M= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 92 + I am the Highway + Audioslave/Chris Cornell + 334942 + 1nYtCAl+f7Y= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 93 + Exploder + Audioslave/Chris Cornell + 206053 + gV8X1BtP2KTpr1QY + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 94 + Hypnotize + Audioslave/Chris Cornell + 206628 + fdqz59ISXca2Lnp6VAy9FA== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 95 + Bring'em Back Alive + Audioslave/Chris Cornell + 329534 + vtWpYb0QmFW4Mo1wkSwPWw== + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 96 + Light My Way + Audioslave/Chris Cornell + 303595 + +FJVIqtsWcI= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 97 + Getaway Car + Audioslave/Chris Cornell + 299598 + MZxZx0Iaj/Pxf28= + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 98 + The Last Remaining Light + Audioslave/Chris Cornell + 317492 + wMoakRrg0FUkAmsf + 0.9900000000000000000 + 10 + 1 + 1 + 1 + + + 99 + Your Time Has Come + Cornell, Commerford, Morello, Wilk + 255529 + FGq/1BJpUJ7x3vz88e9y4J46 + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 100 + Out Of Exile + Cornell, Commerford, Morello, Wilk + 291291 + 6xA3iDqRkQ== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 101 + Be Yourself + Cornell, Commerford, Morello, Wilk + 279484 + iWymLzA5ti6w0B7eFR+TzusdlQ== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 102 + Doesn't Remind Me + Cornell, Commerford, Morello, Wilk + 255869 + 8F11hsfbNADc4oRDgd3GMkqv + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 103 + Drown Me Slowly + Cornell, Commerford, Morello, Wilk + 233691 + wjvBwg9/XHrM + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 104 + Heaven's Dead + Cornell, Commerford, Morello, Wilk + 276688 + aJwd+2ibK/cgaA== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 105 + The Worm + Cornell, Commerford, Morello, Wilk + 237714 + BbVRzUzbXTdYYYM8UQ== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 106 + Man Or Animal + Cornell, Commerford, Morello, Wilk + 233195 + 7S+bZQZrYWiCc0VnRxlCmjoqRw== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 107 + Yesterday To Tomorrow + Cornell, Commerford, Morello, Wilk + 273763 + vIVv9MKj/0JzHOVgyyh6bA== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 108 + Dandelion + Cornell, Commerford, Morello, Wilk + 278125 + kRn9850z3ofllEP1vSY= + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 109 + #1 Zero + Cornell, Commerford, Morello, Wilk + 299102 + 9doWaL+mo2NsHvRm + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 110 + The Curse + Cornell, Commerford, Morello, Wilk + 309786 + 5ZsentYKqRBKhB5SkQ== + 0.9900000000000000000 + 11 + 1 + 4 + 1 + + + 111 + Money + Berry Gordy, Jr./Janie Bradford + 147591 + 3A+7TbX1i2rxEhKs6u22 + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 112 + Long Tall Sally + Enotris Johnson/Little Richard/Robert "Bumps" Blackwell + 106396 + 1KjMT6JKdqQfs3xIq1X3Fi45xg== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 113 + Bad Boy + Larry Williams + 116088 + sNE/cQJ6qguMKiC7WbmvdQ== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 114 + Twist And Shout + Bert Russell/Phil Medley + 161123 + QcqSmRYtAQ== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 115 + Please Mr. Postman + Brian Holland/Freddie Gorman/Georgia Dobbins/Robert Bateman/William Garrett + 137639 + Qr+bGvx9sCdj4A== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 116 + C'Mon Everybody + Eddie Cochran/Jerry Capehart + 140199 + aVtMJ59qF/U= + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 117 + Rock 'N' Roll Music + Chuck Berry + 141923 + wO7xpYKP7W80upmjPg== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 118 + Slow Down + Larry Williams + 163265 + v7oP8ZCsb5T22KwMKvSi8w== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 119 + Roadrunner + Bo Diddley + 143595 + /jhuuFPN9Zg= + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 120 + Carol + Chuck Berry + 143830 + kEDzqEZfK2OMbQ== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 121 + Good Golly Miss Molly + Little Richard + 106266 + eIdIIyz4Gfh1ZfjNQIuaa88/aw== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 122 + 20 Flight Rock + Ned Fairchild + 107807 + GVkkHC+hTpJN4cdoNWO2dw== + 0.9900000000000000000 + 12 + 1 + 5 + 1 + + + 123 + Quadrant + Billy Cobham + 261851 + SoxbtP0iB5hzsh2r81s= + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 124 + Snoopy's search-Red baron + Billy Cobham + 456071 + IIB2H2Ms9Iqp + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 125 + Spanish moss-"A sound portrait"-Spanish moss + Billy Cobham + 248084 + q5SdkJfd1CM= + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 126 + Moon germs + Billy Cobham + 294060 + hbIQNxw2HYS87jDmWYWjR7Ts + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 127 + Stratus + Billy Cobham + 582086 + FMNWAbItUY0= + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 128 + The pleasant pheasant + Billy Cobham + 318066 + B9vVSIh31XEQSFro + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 129 + Solo-Panhandler + Billy Cobham + 246151 + qDibeKBRD/pJ4g== + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 130 + Do what cha wanna + George Duke + 274155 + PQ+4L7FdCg== + 0.9900000000000000000 + 13 + 1 + 2 + 1 + + + 131 + Intro/ Low Down + + 323683 + qLN84BnoXuGvMTZskq7NGh4= + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 132 + 13 Years Of Grief + + 246987 + OY3/fm6++A== + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 133 + Stronger Than Death + + 300747 + Cni/psCyPo8/kitX + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 134 + All For You + + 235833 + kEJwX8gSdl2P + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 135 + Super Terrorizer + + 319373 + nRBLJH3KKkS96DTd5SIIcYMu + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 136 + Phoney Smile Fake Hellos + + 273606 + bjvvxuOoSo8fpqyBiHs2 + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 137 + Lost My Better Half + + 284081 + lnSOwcQVTm5vTrJcTVZW + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 138 + Bored To Tears + + 247327 + SFkgBq5JZ3s= + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 139 + A.N.D.R.O.T.A.Z. + + 266266 + OgqeEWarYq8Acvz1bT9Z + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 140 + Born To Booze + + 282122 + gFeV9u1CyA== + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 141 + World Of Trouble + + 359157 + HTkuWy9zTA0SjokKr10JolCt + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 142 + No More Tears + + 555075 + 5FmZ2xrGGS4= + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 143 + The Begining... At Last + + 365662 + 0YVE+EFO9Cx9Bn+N + 0.9900000000000000000 + 14 + 1 + 3 + 1 + + + 144 + Heart Of Gold + + 194873 + 7+LetU49I07z + 0.9900000000000000000 + 15 + 1 + 3 + 1 + + + 145 + Snowblind + + 420022 + QPXk9oNeFJQWRVk7jUmQyGE= + 0.9900000000000000000 + 15 + 1 + 3 + 1 + + + 146 + Like A Bird + + 276532 + 3CVJLb+9arb8ZHjcCqPe3wQDXA== + 0.9900000000000000000 + 15 + 1 + 3 + 1 + + + 147 + Blood In The Wall + + 284368 + cM1ocmlIzLNVlCSF27pxzVwSNQ== + 0.9900000000000000000 + 15 + 1 + 3 + 1 + + + 148 + The Beginning...At Last + + 271960 + jMxirxs5OrVdrUWNawn4DrzWxA== + 0.9900000000000000000 + 15 + 1 + 3 + 1 + + + 149 + Black Sabbath + + 382066 + 8bZhZz/yAFA= + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 150 + The Wizard + + 264829 + EIPxzjXLpA== + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 151 + Behind The Wall Of Sleep + + 217573 + uFYwDRZVqE+XGdLC + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 152 + N.I.B. + + 368770 + EYVOvjXVa/pv + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 153 + Evil Woman + + 204930 + OOqDTSpUvjU9U6ME + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 154 + Sleeping Village + + 644571 + lGnaYLgYqNgu + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 155 + Warning + + 212062 + zv/+og8A9jhwSC33I5II + 0.9900000000000000000 + 16 + 1 + 3 + 1 + + + 156 + Wheels Of Confusion / The Straightener + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 494524 + +tjjlG6/DAS6VVp0suLHUAlctA== + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 157 + Tomorrow's Dream + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 192496 + K7KuNUcbMrtSnEVIWDodz/SaHw== + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 158 + Changes + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 286275 + 8vnnuqWCho2A3O3G3bpSSCquTQ== + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 159 + FX + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 103157 + jVGyHQ8SHHfE+FtvPaVb + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 160 + Supernaut + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 285779 + yvSPxJSkOnaufmqd6NWl + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 161 + Snowblind + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 331676 + TcuBoEfJq5NlDsiIgH4= + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 162 + Cornucopia + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 234814 + N18ffTUeiL7o + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 163 + Laguna Sunrise + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 173087 + O2+Qp36O71MVIXIkuusASA== + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 164 + St. Vitus Dance + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 149655 + X4bcsvUv9TI+yVdvJ8QMmYo= + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 165 + Under The Sun/Every Day Comes and Goes + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 350458 + Whrs5n/ZNWtdFhOk + 0.9900000000000000000 + 17 + 1 + 3 + 1 + + + 166 + Smoked Pork + + 47333 + fe0iKTgMZEY/m3RAxZjj7Vxl + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 167 + Body Count's In The House + + 204251 + MOClLg94BgJ8itI= + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 168 + Now Sports + + 4884 + H5mV2YIEm9SNJcUbfnc= + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 169 + Body Count + + 317936 + ukFRfQCxiXM= + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 170 + A Statistic + + 6373 + 174TsTIJ57xsvFWmL75h6ME= + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 171 + Bowels Of The Devil + + 223216 + /Aoaiq+Y0kvBKwzSLZU= + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 172 + The Real Problem + + 11650 + QQLD8eqihD4JrsIh/4uD75U+ + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 173 + KKK Bitch + + 173008 + jGk4TA563uZHvK+aj7+A7Q== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 174 + D Note + + 95738 + nffW73jMEdztdtLAPjt3kw0J + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 175 + Voodoo + + 300721 + CbW1dgu7PIJZEzJhfp3H + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 176 + The Winner Loses + + 392254 + nmgwFJwncCAEDA== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 177 + There Goes The Neighborhood + + 350171 + CYA4B4G2xOQG6IDLMztKuA== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 178 + Oprah + + 6635 + uxVUInbp2Svd9B/hRQ== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 179 + Evil Dick + + 239020 + cv+WMgEgC7Cqug== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 180 + Body Count Anthem + + 166426 + wGkdnPzYUg== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 181 + Momma's Gotta Die Tonight + + 371539 + pmXvtwKSl1/cpMKkAsFUDcud + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 182 + Freedom Of Speech + + 281234 + SJe9CmqaaQ== + 0.9900000000000000000 + 18 + 1 + 4 + 1 + + + 183 + King In Crimson + Roy Z + 283167 + f7uO4BvNcp4ug0eTn2rBLwvoFQ== + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 184 + Chemical Wedding + Roy Z + 246177 + /xUQ0F7PCtfoW4Q= + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 185 + The Tower + Roy Z + 285257 + mNwXpE3DptePIiWJhApp3dWN/g== + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 186 + Killing Floor + Adrian Smith + 269557 + hbO2aau9gkzDm7bT/ir6wlI= + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 187 + Book Of Thel + Eddie Casillas/Roy Z + 494393 + 4khBPibd74ZMVGYs + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 188 + Gates Of Urizen + Roy Z + 265351 + W1wDl+UmrfmPQVoU9GxSi1kQ + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 189 + Jerusalem + Roy Z + 402390 + i7irtj9Gjdh5 + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 190 + Trupets Of Jericho + Roy Z + 359131 + cS3ll5lbd/uSFZykJFIG5yo= + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 191 + Machine Men + Adrian Smith + 341655 + cZ3680TAoEmv + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 192 + The Alchemist + Roy Z + 509413 + w1FYTjTUHhN0fVoR2o/G + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 193 + Realword + Roy Z + 237531 + CeaTWbBYHFpn2yl96SX2 + 0.9900000000000000000 + 19 + 1 + 3 + 1 + + + 194 + First Time I Met The Blues + Eurreal Montgomery + 140434 + q9E4Qb1OcFA08nKt12DDay1J + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 195 + Let Me Love You Baby + Willie Dixon + 175386 + urVW9Wo0/eZYqqAp + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 196 + Stone Crazy + Buddy Guy + 433397 + hgtlCVeEPbt1QyS95m+DBg== + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 197 + Pretty Baby + Willie Dixon + 237662 + vlCgbjuaVdzODL9nGKWTyCImzA== + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 198 + When My Left Eye Jumps + Al Perkins/Willie Dixon + 235311 + uRSoDPpEcTE3g8V54D/rT4k= + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 199 + Leave My Girl Alone + Buddy Guy + 204721 + S3AQLYl3fVRcnpD0xEi3DF+q + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 200 + She Suits Me To A Tee + Buddy Guy + 136803 + lHT3KCOkSkdGh9k= + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 201 + Keep It To Myself (Aka Keep It To Yourself) + Sonny Boy Williamson (I) + 166060 + RD9B21vqjIswjqbn06BCv3zC0w== + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 202 + My Time After Awhile + Robert Geddins/Ron Badger/Sheldon Feinberg + 182491 + Qaf1bFRI7Ig+MDfMg+RMtYI= + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 203 + Too Many Ways (Alternate) + Willie Dixon + 135053 + WyHTH3cFzQ9VgmGKyoOz+Xid + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 204 + Talkin' 'Bout Women Obviously + Amos Blakemore/Buddy Guy + 589531 + 1IYT/QNM/1fZZO9UjT0= + 0.9900000000000000000 + 20 + 1 + 6 + 1 + + + 205 + Jorge Da Capadócia + Jorge Ben + 177397 + ZrIMIi/vn0TzaSezZrMZiWs= + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 206 + Prenda Minha + Tradicional + 99369 + bK3mSCPP0neu + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 207 + Meditação + Tom Jobim - Newton Mendoça + 148793 + qmUu1E27HQHs + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 208 + Terra + Caetano Veloso + 482429 + bVk1QR+T25iZpL/ag6U= + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 209 + Eclipse Oculto + Caetano Veloso + 221936 + jycdjj1Pt0Gqmo07U2aqlRic + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 210 + Texto "Verdade Tropical" + Caetano Veloso + 84088 + QRJ4pCiP8zrdCTTP4YmzvpP/cg== + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 211 + Bem Devagar + Gilberto Gil + 133172 + B7YXiqeSWIgy7w6nPm5jDheC + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 212 + Drão + Gilberto Gil + 156264 + /kkU2Td2yquyn6gWlabs + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 213 + Saudosismo + Caetano Veloso + 144326 + i/rt/ZY3awju+4yRcyWl + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 214 + Carolina + Chico Buarque + 181812 + EAtzZvLc3xTd5qboidh4 + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 215 + Sozinho + Peninha + 190589 + UWHYEyqFXcfdDA== + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 216 + Esse Cara + Caetano Veloso + 223111 + POk4OIz6AQ== + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 217 + Mel + Caetano Veloso - Waly Salomão + 294765 + ijKGG64a2B+w + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 218 + Linha Do Equador + Caetano Veloso - Djavan + 299337 + g34Wgos/EUyRfA== + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 219 + Odara + Caetano Veloso + 141270 + rayI5fGjKqStGe2H0u7Oy0Up+A== + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 220 + A Luz De Tieta + Caetano Veloso + 251742 + Za02Wo7Uul74Jj8= + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 221 + Atrás Da Verd-E-Rosa Só Não Vai Quem Já Morreu + David Corrêa - Paulinho Carvalho - Carlos Sena - Bira do Ponto + 307252 + hXvchv01vXeuewJ3 + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 222 + Vida Boa + Fausto Nilo - Armandinho + 281730 + 9kSUvHTLI5grJf92 + 0.9900000000000000000 + 21 + 1 + 7 + 1 + + + 223 + Sozinho (Hitmakers Classic Mix) + + 436636 + VxzpzKuG2YQCVg== + 0.9900000000000000000 + 22 + 1 + 7 + 1 + + + 224 + Sozinho (Hitmakers Classic Radio Edit) + + 195004 + SM4Qa4Gi6qu+xZiQJaE= + 0.9900000000000000000 + 22 + 1 + 7 + 1 + + + 225 + Sozinho (Caêdrum 'n' Bass) + + 328071 + WhzQWlbdEM7eoY4= + 0.9900000000000000000 + 22 + 1 + 7 + 1 + + + 226 + Carolina + + 163056 + z3ueEfPtgnSmuw== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 227 + Essa Moça Ta Diferente + + 167235 + F4g6VLdpv4zDKic= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 228 + Vai Passar + + 369763 + vbOoADQ4/zHK8sAbLyCzpKKjLQ== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 229 + Samba De Orly + + 162429 + n2W50huJWGU= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 230 + Bye, Bye Brasil + + 283402 + FMu3qE/hXUvsTjym + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 231 + Atras Da Porta + + 189675 + 7CTHHySXtQ== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 232 + Tatuagem + + 172120 + 6h/9SYxX+tblq+CZErYnCXLg + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 233 + O Que Será (À Flor Da Terra) + + 167288 + VVi1VfE3FQ== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 234 + Morena De Angola + + 186801 + lAr8ZMCwBCmruV7CiWN1Bw== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 235 + Apesar De Você + + 234501 + Ww13Nv2+rA== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 236 + A Banda + + 132493 + WF/BNcoMEXffZsvoRh/oDYx8Tw== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 237 + Minha Historia + + 182256 + HbXy462ylSqdQpZLTyBnUUL04A== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 238 + Com Açúcar E Com Afeto + + 175386 + TEuq/akfXDwkaqmA + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 239 + Brejo Da Cruz + + 214099 + mCajbN6HGHfn2pzPgA== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 240 + Meu Caro Amigo + + 260257 + JbeXy5ebocfS + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 241 + Geni E O Zepelim + + 317570 + 9TqOVVgFM5kV3A== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 242 + Trocando Em Miúdos + + 169717 + +sTkZG3INWU= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 243 + Vai Trabalhar Vagabundo + + 139154 + Di0phTaEjZ8S5c3RU5d3 + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 244 + Gota D'água + + 153208 + +cIe4qcDuaPiK/M= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 245 + Construção / Deus Lhe Pague + + 383059 + ZirTa2Fh/ccRCB7U + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 246 + Mateus Enter + Chico Science + 33149 + k4cwDuWnLG3BcwU= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 247 + O Cidadão Do Mundo + Chico Science + 200933 + gskKc4WjC5HaOOc= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 248 + Etnia + Chico Science + 152555 + Ym/xmq+R8aRKaRN8iZX8hMZE + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 249 + Quilombo Groove (Instrumental) + Chico Science + 151823 + ts5U35jyU4xkE0M= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 250 + Macô + Chico Science + 249600 + W58erHa1kr0vgmHNGA== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 251 + Um Passeio No Mundo Livre + Chico Science + 240091 + jurwp4fKlZMx + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 252 + Samba Do Lado + Chico Science + 227317 + DZBZqFsFjJEGzLjcauiGzg== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 253 + Maracatu Atômico + Chico Science + 284264 + h3UzbYfG4mNp + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 254 + O Encontro De Isaac Asimov Com Santos Dumont No Céu + Chico Science + 99108 + vYt4B8dt2p7lXOlhKfY= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 255 + Corpo De Lama + Chico Science + 232672 + xkz+soAHIA== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 256 + Sobremesa + Chico Science + 240091 + lg4d/taGyXZF8mrPBY7E8G4= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 257 + Manguetown + Chico Science + 194560 + SqBySiVMPZ3AeuSx6ZOc0g== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 258 + Um Satélite Na Cabeça + Chico Science + 126615 + +apvBBcb5aRuvyY= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 259 + Baião Ambiental (Instrumental) + Chico Science + 152659 + OIcOQ/C9gEZM6dHAOQ== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 260 + Sangue De Bairro + Chico Science + 132231 + T5KTCdYyMqvLRf+LMoSMpbaMFg== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 261 + Enquanto O Mundo Explode + Chico Science + 88764 + iPLWbfjVHIyWENmuyg== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 262 + Interlude Zumbi + Chico Science + 71627 + zFMQZen0l4y7yERki/u6pjI= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 263 + Criança De Domingo + Chico Science + 208222 + qmc9XLwmEQAWphW7 + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 264 + Amor De Muito + Chico Science + 175333 + UMHguDmUUaMiOvs2DSmUSiDR + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 265 + Samidarish (Instrumental) + Chico Science + 272431 + 3ZUEYxRvlupU6N3xdv9c + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 266 + Maracatu Atômico (Atomic Version) + Chico Science + 273084 + o6tDgRHhoYgsQSWu/H219dQl3g== + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 267 + Maracatu Atômico (Ragga Mix) + Chico Science + 210155 + TF7MSKKq/bpESYQ2sDXw + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 268 + Maracatu Atômico (Trip Hop) + Chico Science + 221492 + 3VDd/PR7NtJJ6O0= + 0.9900000000000000000 + 24 + 1 + 7 + 1 + + + 269 + Banditismo Por Uma Questa + + 307095 + MugcUSGGp0Xe+t9n4+ZE4rzu + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 270 + Banditismo Por Uma Questa + + 243644 + x4wWF4NI4uLQJ/k= + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 271 + Rios Pontes & Overdrives + + 286720 + urwmh1wtMxUqjQ== + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 272 + Cidade + + 216346 + wONxdhgNN1QW + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 273 + Praiera + + 183640 + 6SZKHNCYCT+j1x7l+iSr + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 274 + Samba Makossa + + 271856 + X+e1iNnTOeFWMxLR + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 275 + Da Lama Ao Caos + + 251559 + 1ZnT4qTQldxri5Qq1Ya2 + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 276 + Maracatu De Tiro Certeiro + + 88868 + 2uhMylquTw== + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 277 + Salustiano Song + + 215405 + jYEV7WjGnIY3dc4+SgNW + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 278 + Antene Se + + 248372 + FeH0XCBdA02DVHtLxQ== + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 279 + Risoflora + + 105586 + bidJNFQjuqhzpO8O81+4eELX + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 280 + Lixo Do Mangue + + 193253 + +LV5ufN9MH3IahQ= + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 281 + Computadores Fazem Arte + + 404323 + UcEwB6f0Fq4ymW1uT20= + 0.9900000000000000000 + 25 + 1 + 7 + 1 + + + 282 + Girassol + Bino Farias/Da Gama/Lazão/Pedro Luis/Toni Garrido + 249808 + aqSUCxKkuMxR9W1Wtg== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 283 + A Sombra Da Maldade + Da Gama/Toni Garrido + 230922 + pvI+XlqdTMNYEYMrKV9eSAtq + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 284 + Johnny B. Goode + Chuck Berry + 254615 + a8XYNF8Cppj03hI5 + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 285 + Soldado Da Paz + Herbert Vianna + 194220 + X4mMpy4P9c/Fp0uDh+Z6 + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 286 + Firmamento + Bino Farias/Da Gama/Henry Lawes/Lazão/Toni Garrido/Winston Foser-Vers + 222145 + bgnpAs9LX8293w== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 287 + Extra + Gilberto Gil + 304352 + swRY5EbX5Mug07YZ+3W2pR6MsQ== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 288 + O Erê + Bernardo Vilhena/Bino Farias/Da Gama/Lazão/Toni Garrido + 236382 + HCs/hdUoN84UKr7p + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 289 + Podes Crer + Bino Farias/Da Gama/Lazão/Toni Garrido + 232280 + s0HKbMMFq6Ma2oa3 + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 290 + A Estrada + Bino Farias/Da Gama/Lazão/Toni Garrido + 248842 + 7o0YpUBADAc/h8XSDh2g + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 291 + Berlim + Da Gama/Toni Garrido + 207542 + t3UUzcpHNOw5WocFNAFRuQ== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 292 + Já Foi + Bino Farias/Da Gama/Lazão/Toni Garrido + 221544 + 5jqqtm/pftxHc7k= + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 293 + Onde Você Mora? + Marisa Monte/Nando Reis + 256026 + mrToC41jZA== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 294 + Pensamento + Bino Farias/Da Gamma/Lazão/Rás Bernard + 173008 + 6iWmWSxr5rkH0z42DAQo4/Y= + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 295 + Conciliação + Da Gama/Lazão/Rás Bernardo + 257619 + R4yW8ILTeueepZ/6p50= + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 296 + Realidade Virtual + Bino Farias/Da Gama/Lazão/Toni Garrido + 195239 + R+PAk1CJAwPE1XQ1g/g= + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 297 + Mensagem + Bino Farias/Da Gama/Lazão/Rás Bernardo + 225332 + jAQULRzX2/qi095EzEAaDA== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 298 + A Cor Do Sol + Bernardo Vilhena/Da Gama/Lazão + 231392 + oEnEIGdQpdVDiQ== + 0.9900000000000000000 + 26 + 1 + 8 + 1 + + + 299 + Onde Você Mora? + Marisa Monte/Nando Reis + 298396 + Gg6e9+4JGZrleYEUa+k= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 300 + O Erê + Bernardo Vilhena/Bino/Da Gama/Lazao/Toni Garrido + 206942 + wHJENsKqyUeUOTR1JbRvV9g= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 301 + A Sombra Da Maldade + Da Gama/Toni Garrido + 285231 + CuCUNedWwyaAJrIfNVg2SY8zkA== + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 302 + A Estrada + Da Gama/Lazao/Toni Garrido + 282174 + xidQxgm+upTz5XYhqMY= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 303 + Falar A Verdade + Bino/Da Gama/Ras Bernardo + 244950 + CYmKi+5zmymilXUE2z7bJDw= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 304 + Firmamento + Harry Lawes/Winston Foster-Vers + 225488 + zIbij80rKZwvMw== + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 305 + Pensamento + Bino/Da Gama/Ras Bernardo + 192391 + sJF2bvYtwAWnopkr + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 306 + Realidade Virtual + Bino/Da Gamma/Lazao/Toni Garrido + 240300 + rjGTut5VGME5Wtw/fw== + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 307 + Doutor + Bino/Da Gama/Toni Garrido + 178155 + u19hUkNoj/ED + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 308 + Na Frente Da TV + Bino/Da Gama/Lazao/Ras Bernardo + 289750 + leQQGx+UJTJb5eCbl28= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 309 + Downtown + Cidade Negra + 239725 + 2RrZdzeaLnezBKY= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 310 + Sábado A Noite + Lulu Santos + 267363 + T1XCbbwulST5 + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 311 + A Cor Do Sol + Bernardo Vilhena/Da Gama/Lazao + 273031 + /aGkNKnjmpkfx/KVaU62eQ== + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 312 + Eu Também Quero Beijar + Fausto Nilo/Moraes Moreira/Pepeu Gomes + 211147 + Y2dtXRZ5TtXcmXcjbQI= + 0.9900000000000000000 + 27 + 1 + 8 + 1 + + + 313 + Noite Do Prazer + + 311353 + w5UdN9IC8UrdGeTeU7rsc7dD + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 314 + À Francesa + + 244532 + Mb2M5uYoVl/MSiJ1sg== + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 315 + Cada Um Cada Um (A Namoradeira) + + 253492 + p9HUMH6nynIcj0Qymvo= + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 316 + Linha Do Equador + + 244715 + 8CW/4AzRjTauNw98oyUAug== + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 317 + Amor Demais + + 254040 + Mhqr6BhDOJuXv6D9 + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 318 + Férias + + 264202 + s41bQ9skYpSl8xmbJflvKyc= + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 319 + Gostava Tanto De Você + + 230452 + G9SfAIBPM9g= + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 320 + Flor Do Futuro + + 275748 + hkV1Eu04C4OBIF9J3FgQjA== + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 321 + Felicidade Urgente + + 266605 + kUzySclwbw== + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 322 + Livre Pra Viver + + 214595 + hCkDsw0MDwNB208w4SxiGnbt + 0.9900000000000000000 + 28 + 1 + 7 + 1 + + + 323 + Dig-Dig, Lambe-Lambe (Ao Vivo) + Cassiano Costa/Cintia Maviane/J.F./Lucas Costa + 205479 + xwM/fI9zWb3m5pm91AU= + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 324 + Pererê + Augusto Conceição/Chiclete Com Banana + 198661 + aA8I0HQTT0aa + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 325 + TriboTchan + Cal Adan/Paulo Levi + 194194 + wFxFZOrX0w== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 326 + Tapa Aqui, Descobre Ali + Paulo Levi/W. Rangel + 188630 + ZqhuRaxzP7RPKR2oHnoqQcRS + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 327 + Daniela + Jorge Cardoso/Pierre Onasis + 230791 + pXn2d72lAM4= + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 328 + Bate Lata + Fábio Nolasco/Gal Sales/Ivan Brasil + 206733 + E1j8Dsbhbl0xImOUkL/EJg== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 329 + Garotas do Brasil + Garay, Ricardo Engels/Luca Predabom/Ludwig, Carlos Henrique/Maurício Vieira + 210155 + 8l1GMQSglw== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 330 + Levada do Amor (Ailoviu) + Luiz Wanderley/Paulo Levi + 190093 + LWJvMLGgrKUnofcsD+E8Cw== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 331 + Lavadeira + Do Vale, Valverde/Gal Oliveira/Luciano Pinto + 214256 + D6HvfRS5MVCUsqKI5g64ZEg= + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 332 + Reboladeira + Cal Adan/Ferrugem/Julinho Carioca/Tríona Ní Dhomhnaill + 210599 + f/8sgIK372kezfo= + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 333 + É que Nessa Encarnação Eu Nasci Manga + Lucina/Luli + 196519 + ECA6Y/X+qA== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 334 + Reggae Tchan + Cal Adan/Del Rey, Tension/Edu Casanova + 206654 + GKg94B3tCRw= + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 335 + My Love + Jauperi/Zeu Góes + 203493 + kj7Ixki9DKGO + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 336 + Latinha de Cerveja + Adriano Bernandes/Edmar Neves + 166687 + OI6rmmRWeg== + 0.9900000000000000000 + 29 + 1 + 9 + 1 + + + 337 + You Shook Me + J B Lenoir/Willie Dixon + 315951 + gk2CGbq7AIE= + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 338 + I Can't Quit You Baby + Willie Dixon + 263836 + wUtjla3SKA== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 339 + Communication Breakdown + Jimmy Page/John Bonham/John Paul Jones + 192653 + jjJTyGMtwWbfcLpsDg== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 340 + Dazed and Confused + Jimmy Page + 401920 + iaJLh86+eA== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 341 + The Girl I Love She Got Long Black Wavy Hair + Jimmy Page/John Bonham/John Estes/John Paul Jones/Robert Plant + 183327 + DMbH50pVK4mKu4MO1SQ= + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 342 + What is and Should Never Be + Jimmy Page/Robert Plant + 260675 + 2R4gwbPbS0YUx+jCwEo= + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 343 + Communication Breakdown(2) + Jimmy Page/John Bonham/John Paul Jones + 161149 + BGkTCiWNAXvibDtV + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 344 + Travelling Riverside Blues + Jimmy Page/Robert Johnson/Robert Plant + 312032 + /uj/A2V8cWiu/cU= + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 345 + Whole Lotta Love + Jimmy Page/John Bonham/John Paul Jones/Robert Plant/Willie Dixon + 373394 + wH+yH2KTaj9jthn6yw== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 346 + Somethin' Else + Bob Cochran/Sharon Sheeley + 127869 + mdijPVV3hWRHK8jlXUTZ + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 347 + Communication Breakdown(3) + Jimmy Page/John Bonham/John Paul Jones + 185260 + VWxOYGUNTg== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 348 + I Can't Quit You Baby(2) + Willie Dixon + 380551 + gNjRFoJHzwU3ZuOYxHA= + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 349 + You Shook Me(2) + J B Lenoir/Willie Dixon + 619467 + TiNbOIZXfDYlZqVhrKxqmYuJSA== + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 350 + How Many More Times + Chester Burnett/Jimmy Page/John Bonham/John Paul Jones/Robert Plant + 711836 + fKZv4v9cw632YUD55MQAPAnV + 0.9900000000000000000 + 30 + 1 + 1 + 1 + + + 351 + Debra Kadabra + Frank Zappa + 234553 + BAOiq7Dc5iJY + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 352 + Carolina Hard-Core Ecstasy + Frank Zappa + 359680 + zFcOfLQrp7R5OCqUzz/EJax85w== + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 353 + Sam With The Showing Scalp Flat Top + Don Van Vliet + 171284 + LpC2wUS52fu/ + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 354 + Poofter's Froth Wyoming Plans Ahead + Frank Zappa + 183902 + GDlq4CkJMXwwmViIj5yebw== + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 355 + 200 Years Old + Frank Zappa + 272561 + Y+aKMGo6rJ48oE04+lE= + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 356 + Cucamonga + Frank Zappa + 144483 + 9XMf8CnuFbo= + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 357 + Advance Romance + Frank Zappa + 677694 + L0tOU6UAGiM= + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 358 + Man With The Woman Head + Don Van Vliet + 88894 + hHYVNNWu/w== + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 359 + Muffin Man + Frank Zappa + 332878 + Qe1p5EQ2R6w= + 0.9900000000000000000 + 31 + 1 + 1 + 1 + + + 360 + Vai-Vai 2001 + + 276349 + HHytRkVNK5YAH+xZ+TyG + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 361 + X-9 2001 + + 273920 + ZHbal8CecfFrrCg= + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 362 + Gavioes 2001 + + 282723 + D+sVBqYT5J11jT4p6Q== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 363 + Nene 2001 + + 284969 + 1I4SZUiw4rvfv2wV0Q== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 364 + Rosas De Ouro 2001 + + 284342 + CrzamCTahhQ= + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 365 + Mocidade Alegre 2001 + + 282488 + 5bLlWOmz1jexrSLJ + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 366 + Camisa Verde 2001 + + 283454 + 3gZkd25UC1WZkUFlkrmypQQPFw== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 367 + Leandro De Itaquera 2001 + + 274808 + hC2yYlj5BwiHu2evtCjd1DStaw== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 368 + Tucuruvi 2001 + + 287921 + CbRLIKTyVvkkkqyeCg== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 369 + Aguia De Ouro 2001 + + 284160 + XrFTAR51TALN + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 370 + Ipiranga 2001 + + 248293 + KZGwatvdcVej5bbP4Q== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 371 + Morro Da Casa Verde 2001 + + 284708 + vmajDuT1Dg== + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 372 + Perola Negra 2001 + + 281626 + pavJLIEyjvbmBudt + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 373 + Sao Lucas 2001 + + 296254 + E0HrHUYhVfolUo/P + 0.9900000000000000000 + 32 + 1 + 10 + 1 + + + 374 + Guanabara + Marcos Valle + 247614 + Q7jSPh7Xz2DsBaGvXA== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 375 + Mas Que Nada + Jorge Ben + 248398 + ya3/sOd0mqok + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 376 + Vôo Sobre o Horizonte + J.r.Bertami/Parana + 225097 + 8J7Uuc6AWTlcv+/V + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 377 + A Paz + Donato/Gilberto Gil + 263183 + p+cPnZcmPA== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 378 + Wave (Vou te Contar) + Antonio Carlos Jobim + 271647 + bunijEwloadbJpiTGg== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 379 + Água de Beber + Antonio Carlos Jobim/Vinicius de Moraes + 146677 + gAMWkWysZ1OdTg== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 380 + Samba da Bençaco + Baden Powell/Vinicius de Moraes + 282200 + iVfI2NcDhOhsgbTxLQ== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 381 + Pode Parar + Jorge Vercilo/Jota Maranhao + 179408 + WreSAJhWQQk= + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 382 + Menino do Rio + Caetano Veloso + 262713 + ZwyGBrqQ4xpMk5jCztk= + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 383 + Ando Meio Desligado + Caetano Veloso + 195813 + hCMUq63MyxHpDxL01VIE+LGA/Q== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 384 + Mistério da Raça + Luiz Melodia/Ricardo Augusto + 184320 + zFD9yliJZ2g= + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 385 + All Star + Nando Reis + 176326 + lL+L3cN8dEI= + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 386 + Menina Bonita + Alexandre Brazil/Pedro Luis/Rodrigo Cabelo + 237087 + W42b+533qJsOx0eb50LQeA== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 387 + Pescador de Ilusões + Macelo Yuka/O Rappa + 245524 + MyZKUiNkY7JUT4YWEdaPthsk + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 388 + À Vontade (Live Mix) + Bombom/Ed Motta + 180636 + xdCyBiK9e58hwq18 + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 389 + Maria Fumaça + Luiz Carlos/Oberdan + 141008 + ZcBITvdEOCg4SEinIQ== + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 390 + Sambassim (dj patife remix) + Alba Carvalho/Fernando Porto + 213655 + /PG35cseYLMygSAo + 0.9900000000000000000 + 33 + 1 + 7 + 1 + + + 391 + Garota De Ipanema + Vários + 279536 + qMVB8KfTzLFQjUG+1uxHjIg= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 392 + Tim Tim Por Tim Tim + Vários + 213237 + XwA5f65q3Q== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 393 + Tarde Em Itapoã + Vários + 313704 + Xlqyjsctz6+PY/c= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 394 + Tanto Tempo + Vários + 170292 + odNU06tjdQ== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 395 + Eu Vim Da Bahia - Live + Vários + 157988 + 9TEYJqkXwSdbKBbXEsZ1cg== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 396 + Alô Alô Marciano + Vários + 238106 + wsYT7iZc5JUwyYusZdNL + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 397 + Linha Do Horizonte + Vários + 279484 + tussQYvksGyoU2c= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 398 + Only A Dream In Rio + Vários + 371356 + H0XaXuLU6Zw= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 399 + Abrir A Porta + Vários + 271960 + N87VNJF5TjZ79VXK41vaSA== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 400 + Alice + Vários + 165982 + ct0Wp0bS9Zd16u4syZHqrg== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 401 + Momentos Que Marcam + Vários + 280137 + fx1XDfprYjYsXhKCPOkA + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 402 + Um Jantar Pra Dois + Vários + 237714 + sWELhrnw+9+cG44= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 403 + Bumbo Da Mangueira + Vários + 270158 + CbFkahxQ3LzwI3hxtHEadOMVOQ== + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 404 + Mr Funk Samba + Vários + 213890 + 7RYXL98o2I4hd3A= + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 405 + Santo Antonio + Vários + 162716 + 3QIsevmnZesNQyWO + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 406 + Por Você + Vários + 205557 + mdJI1ob8h+KMcvKa + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 407 + Só Tinha De Ser Com Você + Vários + 389642 + i/R3Tpp4spmUskWfezuvTfSp + 0.9900000000000000000 + 34 + 1 + 7 + 1 + + + 408 + Free Speech For The Dumb + Molaney/Morris/Roberts/Wainwright + 155428 + iEZFVpC3m3vp+1CPOeA= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 409 + It's Electric + Harris/Tatler + 213995 + HHF0vqit3E8EHwM3C8DYlZg= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 410 + Sabbra Cadabra + Black Sabbath + 380342 + AhHuRZ3nl//9yA== + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 411 + Turn The Page + Seger + 366524 + RCILv7YfPdk1AUM= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 412 + Die Die My Darling + Danzig + 149315 + 9kA2jYCPuhFlt8c3ztY= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 413 + Loverman + Cave + 472764 + 1Iwnqa8TscD993dVoZq8Yse+ + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 414 + Mercyful Fate + Diamond/Shermann + 671712 + 9wRnWRZvQrc4jFrT8OBIaUw= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 415 + Astronomy + A.Bouchard/J.Bouchard/S.Pearlman + 397531 + V5OZRYA4lQg6GXap + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 416 + Whiskey In The Jar + Traditional + 305005 + AHhp3tJsMhA5bQ== + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 417 + Tuesday's Gone + Collins/Van Zandt + 545750 + eDSiI4d0WDFvVG8ry7I= + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 418 + The More I See + Molaney/Morris/Roberts/Wainwright + 287973 + LsQNNSlBjjZaW4YB + 0.9900000000000000000 + 35 + 1 + 3 + 1 + + + 419 + A Kind Of Magic + Roger Taylor + 262608 + /Bn9HSY9zEs= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 420 + Under Pressure + Queen & David Bowie + 236617 + cYHFwEU5AJBNnitNPm4CBEQ= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 421 + Radio GA GA + Roger Taylor + 343745 + 6v1IyABz4jRWVlEFjg== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 422 + I Want It All + Queen + 241684 + OZhSjG9o+1Q1yQ7o1Q== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 423 + I Want To Break Free + John Deacon + 259108 + vqr6GeEj4k0= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 424 + Innuendo + Queen + 387761 + qYFS3RHjqj4= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 425 + It's A Hard Life + Freddie Mercury + 249417 + EEYUpRx2lNselch/uhidunWrXA== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 426 + Breakthru + Queen + 249234 + I2oC60uoCh2K6nGLisY= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 427 + Who Wants To Live Forever + Brian May + 297691 + jxMYjoOEBQRNhc3uabUimzhOBg== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 428 + Headlong + Queen + 273057 + pUMpWXNsd1A0Izw= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 429 + The Miracle + Queen + 294974 + 9EANp1wd2LQdZrVmfQ== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 430 + I'm Going Slightly Mad + Queen + 248032 + oWdnTzk9hKE= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 431 + The Invisible Man + Queen + 238994 + S+q/GhcMtdApSNn6KA== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 432 + Hammer To Fall + Brian May + 220316 + ez4adVEGPo7C3LnKEOjk6v5vUg== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 433 + Friends Will Be Friends + Freddie Mercury & John Deacon + 248920 + wb2dA8CnaJaLHaS/eL/sEQ== + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 434 + The Show Must Go On + Queen + 263784 + xzKb870n4mBN+8zr + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 435 + One Vision + Queen + 242599 + SWmnG+a+oBc= + 0.9900000000000000000 + 36 + 1 + 1 + 1 + + + 436 + Detroit Rock City + Paul Stanley, B. Ezrin + 218880 + qp6oAqQ3+VFQ/NPMNj23GgOVug== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 437 + Black Diamond + Paul Stanley + 314148 + c6ucq0zTOhhd2S5w + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 438 + Hard Luck Woman + Paul Stanley + 216032 + E4j8S7uDq2b8q88XchM= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 439 + Sure Know Something + Paul Stanley, Vincent Poncia + 242468 + 8ADiKOV1Qf4B + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 440 + Love Gun + Paul Stanley + 196257 + tdD94fN3zg== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 441 + Deuce + Gene Simmons + 185077 + xSO0us5IEg87dwDMk9nADig= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 442 + Goin' Blind + Gene Simmons, S. Coronel + 216215 + 9gWLkdGK+04Fsq2ECDMBtK3v + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 443 + Shock Me + Ace Frehley + 227291 + NTKaFtU5yv01adwP7g== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 444 + Do You Love Me + Paul Stanley, B. Ezrin, K. Fowley + 214987 + loHI1zRSKr+AQmBht27Nyt4s + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 445 + She + Gene Simmons, S. Coronel + 248346 + l/IqW++1VwaNxeQpog== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 446 + I Was Made For Loving You + Paul Stanley, Vincent Poncia, Desmond Child + 271360 + ynGxON14nE11sVe2cw== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 447 + Shout It Out Loud + Paul Stanley, Gene Simmons, B. Ezrin + 219742 + Wy9riq8+V8drJdkh3Es= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 448 + God Of Thunder + Paul Stanley + 255791 + +psYvaLs/Bw= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 449 + Calling Dr. Love + Gene Simmons + 225332 + AbM0SXx5AzlB1KpdWlp5ZGg= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 450 + Beth + S. Penridge, Bob Ezrin, Peter Criss + 166974 + BYteu5xRsHsVPvjRll8T + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 451 + Strutter + Paul Stanley, Gene Simmons + 192496 + iPwJDUryIaDgB6A/ + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 452 + Rock And Roll All Nite + Paul Stanley, Gene Simmons + 173609 + QJ5ZOuj2kDNGF+OZAWPEQHA+Sw== + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 453 + Cold Gin + Ace Frehley + 262243 + gNJ9Wlq5E2q92pSwcNvVoJ6X + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 454 + Plaster Caster + Gene Simmons + 207333 + aIOmQuQmc0mPXGBwyVX1H24= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 455 + God Gave Rock 'n' Roll To You + Paul Stanley, Gene Simmons, Rus Ballard, Bob Ezrin + 320444 + /98v4yZ1a4M= + 0.9900000000000000000 + 37 + 1 + 1 + 1 + + + 456 + Heart of the Night + + 273737 + KSWOJKLYkOPG2pA= + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 457 + De La Luz + + 315219 + NOZvgw1daspaerxmfp63foVdMQ== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 458 + Westwood Moon + + 295627 + YfJKJAE4vZc4ci9E3g== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 459 + Midnight + + 266866 + y/i/XxgXALjY + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 460 + Playtime + + 273580 + aCelAyASXmmpuTdBnEuC + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 461 + Surrender + + 287634 + oNOS6Et3iPbT + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 462 + Valentino's + + 296124 + viVEGdWpGpu7 + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 463 + Believe + + 310778 + krp2JhTGmyRQiVt03UN3LSbvYw== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 464 + As We Sleep + + 316865 + n68wYVM4JI/k + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 465 + When Evening Falls + + 298135 + JwGQqEPmXA== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 466 + J Squared + + 288757 + 1IXbY6VJY0pHAKKogyo4yjriiQ== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 467 + Best Thing + + 274259 + 0tuhDEDCYlrkNQCR0Loa3g== + 0.9900000000000000000 + 38 + 1 + 2 + 1 + + + 468 + Maria + Billie Joe Armstrong -Words Green Day -Music + 167262 + PAnm/gnwI+w7Cvw= + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 469 + Poprocks And Coke + Billie Joe Armstrong -Words Green Day -Music + 158354 + xW1gXEiZ+ePPIuPmCGY= + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 470 + Longview + Billie Joe Armstrong -Words Green Day -Music + 234083 + ABHXyQ9atP7ZoxbJ6n4fBA== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 471 + Welcome To Paradise + Billie Joe Armstrong -Words Green Day -Music + 224208 + ZpIex6A1iCAh+kUZJv/2ot4j + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 472 + Basket Case + Billie Joe Armstrong -Words Green Day -Music + 181629 + ZEHsbhFvh7gxzw8= + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 473 + When I Come Around + Billie Joe Armstrong -Words Green Day -Music + 178364 + rx0rgHVIS2Dc + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 474 + She + Billie Joe Armstrong -Words Green Day -Music + 134164 + qO5fbuSyox8mDFpEoHZ6JA1XGQ== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 475 + J.A.R. (Jason Andrew Relva) + Mike Dirnt -Words Green Day -Music + 170997 + VlESlZb8+3+AWpLD + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 476 + Geek Stink Breath + Billie Joe Armstrong -Words Green Day -Music + 135888 + FZn9DqKL1BQSqAMKa3y1BlE69A== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 477 + Brain Stew + Billie Joe Armstrong -Words Green Day -Music + 193149 + X/hX3MnY6Lckn8x5l0WL3HwVaw== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 478 + Jaded + Billie Joe Armstrong -Words Green Day -Music + 90331 + RGdEqA6LK39GeS4= + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 479 + Walking Contradiction + Billie Joe Armstrong -Words Green Day -Music + 151170 + nnyfHUIhRcmiHPBy3IlzJQ== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 480 + Stuck With Me + Billie Joe Armstrong -Words Green Day -Music + 135523 + 2Ik8zycC+LOuzT6t + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 481 + Hitchin' A Ride + Billie Joe Armstrong -Words Green Day -Music + 171546 + capwrNoapm6ZW9Ch + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 482 + Good Riddance (Time Of Your Life) + Billie Joe Armstrong -Words Green Day -Music + 153600 + KHfRy4UXBY1t7/FPdnqmaQ== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 483 + Redundant + Billie Joe Armstrong -Words Green Day -Music + 198164 + UwYcOatFATCuWH+CPi4= + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 484 + Nice Guys Finish Last + Billie Joe Armstrong -Words Green Day -Music + 170187 + Lv7ageHjSCan2wO7f1xkoA== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 485 + Minority + Billie Joe Armstrong -Words Green Day -Music + 168803 + BAYHyYTwfDHQmta/hgou + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 486 + Warning + Billie Joe Armstrong -Words Green Day -Music + 221910 + hSF4oCWHrwvf + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 487 + Waiting + Billie Joe Armstrong -Words Green Day -Music + 192757 + XaiKgtNKuH9+OCajqQ1dTxFI + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 488 + Macy's Day Parade + Billie Joe Armstrong -Words Green Day -Music + 213420 + ZyHQ1Pr5O+v/2n1W/A== + 0.9900000000000000000 + 39 + 1 + 4 + 1 + + + 489 + Into The Light + David Coverdale + 76303 + EJPUp03HjAYGjPaa4XdrQtY= + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 490 + River Song + David Coverdale + 439510 + Z5l4U4zTkIiY + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 491 + She Give Me ... + David Coverdale + 252551 + uKUA4iq5mXqJ + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 492 + Don't You Cry + David Coverdale + 347036 + xIHlYBpE3V8Y + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 493 + Love Is Blind + David Coverdale/Earl Slick + 344999 + f70DBu5icbwGAA== + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 494 + Slave + David Coverdale/Earl Slick + 291892 + xC4sTmGLFG8= + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 495 + Cry For Love + Bossi/David Coverdale/Earl Slick + 293015 + 3vC5LbHltBc5SPUwcNU= + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 496 + Living On Love + Bossi/David Coverdale/Earl Slick + 391549 + +6H588dH3XSJkQ== + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 497 + Midnight Blue + David Coverdale/Earl Slick + 298631 + U7gSubjJ8O/kjwTWVQmuWoM= + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 498 + Too Many Tears + Adrian Vanderberg/David Coverdale + 359497 + CuZTWE1Tv5Ehp+EBfDCcspL8BQ== + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 499 + Don't Lie To Me + David Coverdale/Earl Slick + 283585 + kCxAgfBQ98uk6hntWbZ+qqz6ag== + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 500 + Wherever You May Go + David Coverdale + 239699 + +SaoSA7jEg== + 0.9900000000000000000 + 40 + 1 + 1 + 1 + + + 501 + Grito De Alerta + Gonzaga Jr. + 202213 + OaJ2sVUDLd6m0mj9XPTsN43z + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 502 + Não Dá Mais Pra Segurar (Explode Coração) + + 219768 + xrHyBpiRRoZphPhyDQ== + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 503 + Começaria Tudo Outra Vez + + 196545 + I5ICc2eXVg== + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 504 + O Que É O Que É ? + + 259291 + oATZkW1iBTlxuho= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 505 + Sangrando + Gonzaga Jr/Gonzaguinha + 169717 + SyJHnN0gDw== + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 506 + Diga Lá, Coração + + 255921 + xFmuX1u/OGHqwyZbUD4Q7iwG + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 507 + Lindo Lago Do Amor + Gonzaga Jr. + 249678 + 44AwEz1Y0fIAS2U= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 508 + Eu Apenas Queria Que Voçê Soubesse + + 155637 + R4jZxEZWejatKqNOrZS+6w0= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 509 + Com A Perna No Mundo + Gonzaga Jr. + 227448 + WHDX/Cz8k0ZwB4rMOBY= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 510 + E Vamos À Luta + + 222406 + Ld7Td3rKmLLQdrjd4Q== + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 511 + Um Homem Também Chora (Guerreiro Menino) + + 207229 + qZnl5e/y9b5LXN0wAOU= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 512 + Comportamento Geral + Gonzaga Jr + 181577 + rODyjMl/tet0kkfAvQeFcx6x + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 513 + Ponto De Interrogação + + 180950 + xm2k50gkkG8= + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 514 + Espere Por Mim, Morena + Gonzaguinha + 207072 + dplJyrI/I5XG + 0.9900000000000000000 + 41 + 1 + 7 + 1 + + + 515 + Meia-Lua Inteira + + 222093 + GOXzrXFSpzE3t8Xpvn4= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 516 + Voce e Linda + + 242938 + HwUH+alnOBAiddpJfQ5+4++s + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 517 + Um Indio + + 195944 + mfvSvzKUoPNYtw== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 518 + Podres Poderes + + 259761 + jdrKq5I6G5sd6OA= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 519 + Voce Nao Entende Nada - Cotidiano + + 421982 + 0TiWCSojuQ== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 520 + O Estrangeiro + + 374700 + 1j3w5SNMRdVlCHTfWFXoAA== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 521 + Menino Do Rio + + 147670 + 0XtDx1SO5bkmAYaci3Y= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 522 + Qualquer Coisa + + 193410 + n+T3T+rlh0b0 + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 523 + Sampa + + 185051 + NhR0AHx8UJaKWKd1C4GuCg== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 524 + Queixa + + 299676 + /Eu+ONqSpEB0XZg= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 525 + O Leaozinho + + 184398 + mUo1ToEdeXG4qoQ= + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 526 + Fora Da Ordem + + 354011 + BQAdKCrYdQ== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 527 + Terra + + 401319 + 37mK+jYNW4LPwAceuIDxDg== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 528 + Alegria, Alegria + + 169221 + JopkNJlzUg== + 0.9900000000000000000 + 23 + 1 + 7 + 1 + + + 529 + Balada Do Louco + Arnaldo Baptista - Rita Lee + 241057 + iDPadHsWnA== + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 530 + Ando Meio Desligado + Arnaldo Baptista - Rita Lee - Sérgio Dias + 287817 + 9jfgvzsYc8L3ofiiZn0= + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 531 + Top Top + Os Mutantes - Arnolpho Lima Filho + 146938 + Dg+2A00RbUVFODOt2oEOVKo= + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 532 + Baby + Caetano Veloso + 177188 + NcJIEU82DhehPfd6sGAL + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 533 + A E O Z + Mutantes + 518556 + y2XEEk7XiPGahw== + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 534 + Panis Et Circenses + Caetano Veloso - Gilberto Gil + 125152 + aphA6E1ONjC7Pf3Af/U1bzA= + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 535 + Chão De Estrelas + Orestes Barbosa-Sílvio Caldas + 284813 + yofSoi21qY+XHF45V3bH + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 536 + Vida De Cachorro + Rita Lee - Arnaldo Baptista - Sérgio Baptista + 195186 + o39hVKoseTBP + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 537 + Bat Macumba + Gilberto Gil - Caetano Veloso + 187794 + zqRFHRloWKTP/w== + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 538 + Desculpe Babe + Arnaldo Baptista - Rita Lee + 170422 + yGqKPr63GdGC5Q== + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 539 + Rita Lee + Arnaldo Baptista/Rita Lee/Sérgio Dias + 189257 + +FBRtg7bo54NolK9 + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 540 + Posso Perder Minha Mulher, Minha Mãe, Desde Que Eu Tenha O Rock And Roll + Arnaldo Baptista - Rita Lee - Arnolpho Lima Filho + 222955 + BEl5A/bgs6bI+doU1hXs + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 541 + Banho De Lua + B. de Filippi - F. Migliaci - Versão: Fred Jorge + 221831 + X17Nikes9A== + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 542 + Meu Refrigerador Não Funciona + Arnaldo Baptista - Rita Lee - Sérgio Dias + 382981 + Yll9ADHxk3Wtozp0PRY= + 0.9900000000000000000 + 42 + 1 + 4 + 1 + + + 543 + Burn + Coverdale/Lord/Paice + 453955 + oTLfL1Z3oQ== + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 544 + Stormbringer + Coverdale + 277133 + xbYprUOEMg== + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 545 + Gypsy + Coverdale/Hughes/Lord/Paice + 339173 + V1WuoJxjsnXWZmVmMtt3Nw== + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 546 + Lady Double Dealer + Coverdale + 233586 + gyxXaHyeVMAht0kIRE/wegM= + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 547 + Mistreated + Coverdale + 758648 + H491Pj6AaVnvEQ== + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 548 + Smoke On The Water + Gillan/Glover/Lord/Paice + 618031 + Bek/8WO/WNs32rc= + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 549 + You Fool No One + Coverdale/Lord/Paice + 804101 + 33uraG2SFnTrL/lYqNQ= + 0.9900000000000000000 + 43 + 1 + 1 + 1 + + + 550 + Custard Pie + Jimmy Page/Robert Plant + 253962 + 7db+I65ChRzOChbgkA== + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 551 + The Rover + Jimmy Page/Robert Plant + 337084 + n8wHaDWVw5MY/MfZnU/V8OZJ + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 552 + In My Time Of Dying + John Bonham/John Paul Jones + 666017 + eWsEOLcIFlpe3V1WsoY= + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 553 + Houses Of The Holy + Jimmy Page/Robert Plant + 242494 + TGPy8HI+glq9AVzVpTZG3Q== + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 554 + Trampled Under Foot + John Paul Jones + 336692 + zFAWLJqTT18fO2S2 + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 555 + Kashmir + John Bonham + 508604 + phRSwAJy/fXXUPc= + 0.9900000000000000000 + 44 + 1 + 1 + 1 + + + 556 + Imperatriz + Guga/Marquinho Lessa/Tuninho Professor + 339173 + RjdaM3EkF/84iWFvsLLPopFTAw== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 557 + Beija-Flor + Caruso/Cleber/Deo/Osmar + 327000 + pAJbR4LlM9TgLvX/ + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 558 + Viradouro + Dadinho/Gilbreto Gomes/Gustavo/P.C. Portugal/R. Mocoto + 344320 + G1Nc9CuuFk0= + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 559 + Mocidade + Domenil/J. Brito/Joaozinho/Rap, Marcelo Do + 261720 + ghyz4xBQog== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 560 + Unidos Da Tijuca + Douglas/Neves, Vicente Das/Silva, Gilmar L./Toninho Gentil/Wantuir + 338834 + ZIRM2mxE2xOxi/FCHw== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 561 + Salgueiro + Augusto/Craig Negoescu/Rocco Filho/Saara, Ze Carlos Da + 305920 + lGFQlF5zrWY= + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 562 + Mangueira + Bizuca/Clóvis Pê/Gilson Bernini/Marelo D'Aguia + 298318 + 7M/sgD+UntXi + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 563 + União Da Ilha + Dito/Djalma Falcao/Ilha, Almir Da/Márcio André + 330945 + hMpxs0SuD4DheSIlCph4hw== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 564 + Grande Rio + Carlos Santos/Ciro/Claudio Russo/Zé Luiz + 307252 + k3zyL6793l8Kf8Q= + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 565 + Portela + Flavio Bororo/Paulo Apparicio/Wagner Alves/Zeca Sereno + 319608 + fhO2DhGaPyM= + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 566 + Caprichosos + Gule/Jorge 101/Lequinho/Luiz Piao + 351320 + C+VP8svtgsbFVAe3QwtY + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 567 + Tradição + Adalto Magalha/Lourenco + 269165 + AtbMklM6L0vkYg== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 568 + Império Serrano + Arlindo Cruz/Carlos Sena/Elmo Caetano/Mauricao + 334942 + axf5/ThkooeWojziEFyZRCq85A== + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 569 + Tuiuti + Claudio Martins/David Lima/Kleber Rodrigues/Livre, Cesare Som + 259657 + B10eDsRykFvQtgQN + 0.9900000000000000000 + 45 + 1 + 7 + 1 + + + 570 + (Da Le) Yaleo + Santana + 353488 + hxavzFfOUqCDwk3F9Ls2ug== + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 571 + Love Of My Life + Carlos Santana & Dave Matthews + 347820 + BI4AJ14O+Q== + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 572 + Put Your Lights On + E. Shrody + 285178 + OcXUR7fgni55iUXpeNM= + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 573 + Africa Bamba + I. Toure, S. Tidiane Toure, Carlos Santana & K. Perazzo + 282827 + kpqEm9BJz7Zaodqy + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 574 + Smooth + M. Itaal Shur & Rob Thomas + 298161 + DUEpCLbhHQl+Wczh + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 575 + Do You Like The Way + L. Hill + 354899 + lnoy8NB9MKFujNlzKKFpD3ml + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 576 + Maria Maria + W. Jean, J. Duplessis, Carlos Santana, K. Perazzo & R. Rekow + 262635 + LikhOGA9M5e15BNB + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 577 + Migra + R. Taha, Carlos Santana & T. Lindsay + 329064 + uSGyVYRp0V2B1J+0Tw== + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 578 + Corazon Espinado + F. Olivera + 276114 + jj+0+gSz8LOFdQ== + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 579 + Wishing It Was + Eale-Eye Cherry, M. Simpson, J. King & M. Nishita + 292832 + 0bOd5Xu9Wks= + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 580 + El Farol + Carlos Santana & KC Porter + 291160 + uQbvFIoQ1H+sVYE= + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 581 + Primavera + KC Porter & JB Eckl + 378618 + EaelVwHqD43HBpw8E7K2NA== + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 582 + The Calling + Carlos Santana & C. Thompson + 747755 + BhdFaSzbh1Cgb/Q= + 0.9900000000000000000 + 46 + 1 + 1 + 1 + + + 583 + Solução + + 247431 + cQYw9L7AC/eO + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 584 + Manuel + + 230269 + 0ku9W7JqswDXWaAHpj48 + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 585 + Entre E Ouça + + 286302 + 5MsdBmF6Gq5W + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 586 + Um Contrato Com Deus + + 202501 + a0dU8qo86IxE+Q== + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 587 + Um Jantar Pra Dois + + 244009 + 0SkdnZ+Ymj5pXw== + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 588 + Vamos Dançar + + 226194 + uKTbP9qHGFgwDgSy/ms= + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 589 + Um Love + + 181603 + 5K9kHxn5Qm0= + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 590 + Seis Da Tarde + + 238445 + ov9pwuJ/b+ygeI6wFmph + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 591 + Baixo Rio + + 198008 + dOzIncx2HzHys+vaSkX4djY= + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 592 + Sombras Do Meu Destino + + 280685 + nNseVnWxnhg= + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 593 + Do You Have Other Loves? + + 295235 + hd37zUQCvqUNedBFK+A4zy+U + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 594 + Agora Que O Dia Acordou + + 323213 + olqAGHpNzYZCHnY= + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 595 + Já!!! + + 217782 + /rRkmVT35abXjKDr/WWD + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 596 + A Rua + + 238027 + +uWGRhwJdbcFxIB/dnx7h5dh0Q== + 0.9900000000000000000 + 47 + 1 + 7 + 1 + + + 597 + Now's The Time + Miles Davis + 197459 + x0fk10ntvRa6lRoUylyLXJc= + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 598 + Jeru + Miles Davis + 193410 + +vU+rZOPdg== + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 599 + Compulsion + Miles Davis + 345025 + L1sQGVOblPKpswGv/C9LXw== + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 600 + Tempus Fugit + Miles Davis + 231784 + cKpstRrwH+9nZg== + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 601 + Walkin' + Miles Davis + 807392 + URmzVWDjvWIFoEF/gNey11o= + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 602 + 'Round Midnight + Miles Davis + 357459 + M8up3rAj5Qo= + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 603 + Bye Bye Blackbird + Miles Davis + 476003 + FWrxKew0uKCQAA== + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 604 + New Rhumba + Miles Davis + 277968 + Thlx6VpcLyrr3WcYxA== + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 605 + Generique + Miles Davis + 168777 + NJsycmmPcFYzp/cUdlQ= + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 606 + Summertime + Miles Davis + 200437 + xzci166ZGVnAhFP0 + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 607 + So What + Miles Davis + 564009 + HtKuUSwiuJmG + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 608 + The Pan Piper + Miles Davis + 233769 + JnA89+XJ8Ubl2uAkpkRB + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 609 + Someday My Prince Will Come + Miles Davis + 544078 + bRpCce4Vm7U3 + 0.9900000000000000000 + 48 + 1 + 2 + 1 + + + 610 + My Funny Valentine (Live) + Miles Davis + 907520 + +abnVJuxQQn7Z3GhNI/OPm0Z + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 611 + E.S.P. + Miles Davis + 330684 + +ixqEBa0nlYUPxHUhr+E0Es= + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 612 + Nefertiti + Miles Davis + 473495 + kT4v45xI2aTL5bKisKiB3A== + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 613 + Petits Machins (Little Stuff) + Miles Davis + 487392 + NI+W0KD9WizK6pLr4q++g98= + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 614 + Miles Runs The Voodoo Down + Miles Davis + 843964 + 26oWjyE2cui5pA== + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 615 + Little Church (Live) + Miles Davis + 196101 + j2hTqoJPQbSN + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 616 + Black Satin + Miles Davis + 316682 + QdS30l5Huek1 + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 617 + Jean Pierre (Live) + Miles Davis + 243461 + H9DLpjEmpW1fXrdDtrk7gT5AYA== + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 618 + Time After Time + Miles Davis + 220734 + fc5R65nWX7zD7rn/g7BTvp2teQ== + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 619 + Portia + Miles Davis + 378775 + qtNVLzn9Hf2X3A== + 0.9900000000000000000 + 49 + 1 + 2 + 1 + + + 620 + Space Truckin' + Blackmore/Gillan/Glover/Lord/Paice + 1196094 + eInVdlB+4AxbxuiqcaW4wAZmfA== + 0.9900000000000000000 + 50 + 1 + 1 + 1 + + + 621 + Going Down / Highway Star + Gillan/Glover/Lord/Nix - Blackmore/Paice + 913658 + kccEtal5IrGcuGIl5uVB + 0.9900000000000000000 + 50 + 1 + 1 + 1 + + + 622 + Mistreated (Alternate Version) + Blackmore/Coverdale + 854700 + rTkCQLyhHpTBKOOKgT0= + 0.9900000000000000000 + 50 + 1 + 1 + 1 + + + 623 + You Fool No One (Alternate Version) + Blackmore/Coverdale/Lord/Paice + 763924 + lhv3d7CEIM3WXC9vog== + 0.9900000000000000000 + 50 + 1 + 1 + 1 + + + 624 + Jeepers Creepers + + 185965 + w8SLZEISzQ== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 625 + Blue Rythm Fantasy + + 348212 + OyjwqXDzgJWYL1+gzAnubpA= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 626 + Drum Boogie + + 191555 + jWws5IwxezD+ZFgmPipKMg== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 627 + Let Me Off Uptown + + 187637 + z4cGFC1MQMP/EAKXutUd01GFYQ== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 628 + Leave Us Leap + + 182726 + V5u+Lj/0Gz1x8DU= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 629 + Opus No.1 + + 179800 + mSkf5orcYB/rIIw= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 630 + Boogie Blues + + 204199 + eZhEjzpT7KTp+4gzyNjUOA== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 631 + How High The Moon + + 201430 + A1IP26v9kLY= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 632 + Disc Jockey Jump + + 193149 + SHUlQUs2D561prCMAh4EkA== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 633 + Up An' Atom + + 179565 + nqDrHrIHJ+4= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 634 + Bop Boogie + + 189596 + zn1FzZuz2QQKd3+nrw== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 635 + Lemon Drop + + 194089 + JCoiLYelAA== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 636 + Coronation Drop + + 176222 + C0s+X+/KGJY= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 637 + Overtime + + 163030 + /VNjaJFY6Av8sv4= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 638 + Imagination + + 289306 + jRDF707H84/ZoEnnm3L5jjs= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 639 + Don't Take Your Love From Me + + 282331 + D+tzCIJTTOmS0Q== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 640 + Midget + + 217025 + IYvyAR59OnhwoAIkB5Q= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 641 + I'm Coming Virginia + + 280163 + CnvNH15ZzzijE6E= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 642 + Payin' Them Dues Blues + + 198556 + jnGiZTUiVLgUVuU= + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 643 + Jungle Drums + + 199627 + 9L8VyyMNxmt0JEnRHHNy4VFTTw== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 644 + Showcase + + 201560 + fPmsB807zAKy3EizlVAqn0MEFA== + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 645 + Swedish Schnapps + + 191268 + TDUQaSjRSMKvc2bBB/YA+hMO + 0.9900000000000000000 + 51 + 1 + 2 + 1 + + + 646 + Samba Da Bênção + + 409965 + 50DEuZfblTvMSNI= + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 647 + Pot-Pourri N.º 4 + + 392437 + TT65okfpQt778wpSP3aHrJ5PLw== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 648 + Onde Anda Você + + 168437 + NAUtVYd8eI2Slnt63A== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 649 + Samba Da Volta + + 170631 + GIJNVLkR0DAC9DZxeg== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 650 + Canto De Ossanha + + 204956 + VOmdfBhGaUcRYxrK + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 651 + Pot-Pourri N.º 5 + + 219898 + tEtld5B1aV0E + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 652 + Formosa + + 137482 + SpYeuwQDOR8WAVc5qfj/ + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 653 + Como É Duro Trabalhar + + 226168 + lmzQcek57qAc5J18pQ== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 654 + Minha Namorada + + 244297 + EMNPilPl+g== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 655 + Por Que Será + + 162142 + ZETYRATIGnuibHgu3/2N + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 656 + Berimbau + + 190667 + dBCofp8gZrx5GvGT + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 657 + Deixa + + 179826 + H6UZZwsHi5mlNCWFoEIw + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 658 + Pot-Pourri N.º 2 + + 211748 + dxwTNrwVQj1760TeG8vq14aRgg== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 659 + Samba Em Prelúdio + + 212636 + X8fT9gH6zw== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 660 + Carta Ao Tom 74 + + 162560 + g/j+3jW4Av3dXQ== + 0.9900000000000000000 + 52 + 1 + 11 + 1 + + + 661 + Linha de Passe (João Bosco) + + 230948 + CWPc6yDCrX3ZSk0= + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 662 + Pela Luz dos Olhos Teus (Miúcha e Tom Jobim) + + 163970 + D79ppLBJHTXC + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 663 + Chão de Giz (Elba Ramalho) + + 274834 + ZbqD7GaoYsnt + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 664 + Marina (Dorival Caymmi) + + 172643 + KWR5Y4PbsjNUfA== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 665 + Aquarela (Toquinho) + + 259944 + kjX57x7ME1KzwChrw/0h + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 666 + Coração do Agreste (Fafá de Belém) + + 258194 + NFwEGxBcU9WqRQUh1JY= + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 667 + Dona (Roupa Nova) + + 243356 + 4EZQ04SJ/EfcTg== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 668 + Começaria Tudo Outra Vez (Maria Creuza) + + 206994 + OToB+bZlYXI= + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 669 + Caçador de Mim (Sá & Guarabyra) + + 238341 + 1k9g5TXiI0TYxg== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 670 + Romaria (Renato Teixeira) + + 244793 + fR3VRyVyKZ3eNxQozJkjGdSxjw== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 671 + As Rosas Não Falam (Beth Carvalho) + + 116767 + wGEYE5Hla56iZrduFVz5HGS6 + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 672 + Wave (Os Cariocas) + + 130063 + QzzDlEbCJw== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 673 + Garota de Ipanema (Dick Farney) + + 174367 + SxHJT5NIJw== + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 674 + Preciso Apender a Viver Só (Maysa) + + 143464 + GwTCtT8Hi/t4 + 0.9900000000000000000 + 53 + 1 + 7 + 1 + + + 675 + Susie Q + Hawkins-Lewis-Broadwater + 275565 + pRNvnwe0Gd1MY/3N0VFqUR+M + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 676 + I Put A Spell On You + Jay Hawkins + 272091 + FiQl7ivdF6EElDywyBvGHBM= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 677 + Proud Mary + J. C. Fogerty + 189022 + qwoUNrX8wzM= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 678 + Bad Moon Rising + J. C. Fogerty + 140146 + MnFL7uf+ImFbfw== + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 679 + Lodi + J. C. Fogerty + 191451 + RMLvEhVJELM0sQs= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 680 + Green River + J. C. Fogerty + 154279 + Vi10gcTgbikq94/lMLmm + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 681 + Commotion + J. C. Fogerty + 162899 + saW5a5zu3+kbAiFs7A//nA== + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 682 + Down On The Corner + J. C. Fogerty + 164858 + PPTBcnxegexW + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 683 + Fortunate Son + J. C. Fogerty + 140329 + TDIJ4lujuwGP95+Y + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 684 + Travelin' Band + J. C. Fogerty + 129358 + TYtmwb8CPRr4877z + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 685 + Who'll Stop The Rain + J. C. Fogerty + 149394 + 5OE1Rzh+RfOTthEgxQ== + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 686 + Up Around The Bend + J. C. Fogerty + 162429 + MA5vpIekjHPnFpzB + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 687 + Run Through The Jungle + J. C. Fogerty + 186044 + Gd9UP0vul77ZzEc= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 688 + Lookin' Out My Back Door + J. C. Fogerty + 152946 + IVJ0utRVofo= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 689 + Long As I Can See The Light + J. C. Fogerty + 213237 + DQyITjdPOHH5Hqt2lCwUP3c= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 690 + I Heard It Through The Grapevine + Whitfield-Strong + 664894 + MS0LVkIo5WVSF7kTwfrHsQ== + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 691 + Have You Ever Seen The Rain? + J. C. Fogerty + 160052 + 08vxFJ5fTQ== + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 692 + Hey Tonight + J. C. Fogerty + 162847 + rZxIjCVge10= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 693 + Sweet Hitch-Hiker + J. C. Fogerty + 175490 + b8wttslgaNH9ILc= + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 694 + Someday Never Comes + J. C. Fogerty + 239360 + XbCv4iBBc4Wx + 0.9900000000000000000 + 54 + 1 + 1 + 1 + + + 695 + Walking On The Water + J.C. Fogerty + 281286 + zr52lIud2Cw= + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 696 + Suzie-Q, Pt. 2 + J.C. Fogerty + 244114 + PrYxivuDVQlqiEOhPpX5Tw== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 697 + Born On The Bayou + J.C. Fogerty + 316630 + maoEHgfX3tz9b0A11Mv40Gh5 + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 698 + Good Golly Miss Molly + J.C. Fogerty + 163604 + Kya0Xss4CP1t8Y8pfESf + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 699 + Tombstone Shadow + J.C. Fogerty + 218880 + LieZNt9Trf0UFA== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 700 + Wrote A Song For Everyone + J.C. Fogerty + 296385 + lr1L0dUbyg== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 701 + Night Time Is The Right Time + J.C. Fogerty + 190119 + xeRLOeb+2g== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 702 + Cotton Fields + J.C. Fogerty + 178181 + 621GxPA0x8moz0NQ + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 703 + It Came Out Of The Sky + J.C. Fogerty + 176718 + eLZKt2RyQCIguQ0= + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 704 + Don't Look Now + J.C. Fogerty + 131918 + INof4+6yNw== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 705 + The Midnight Special + J.C. Fogerty + 253596 + 48KPzlDjYfU= + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 706 + Before You Accuse Me + J.C. Fogerty + 207804 + KAbYeUtNLgCCgoyZTcqzOBLP + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 707 + My Baby Left Me + J.C. Fogerty + 140460 + p+W6HAtL9bYnfGaAEA== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 708 + Pagan Baby + J.C. Fogerty + 385619 + oPizNTjVjPHibDCra5U= + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 709 + (Wish I Could) Hideaway + J.C. Fogerty + 228466 + 25U9FAdNnG7pzC5W + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 710 + It's Just A Thought + J.C. Fogerty + 237374 + BoQbAXtPrdIAAw== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 711 + Molina + J.C. Fogerty + 163239 + +s22Ak3sXw== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 712 + Born To Move + J.C. Fogerty + 342804 + X75L5ilrCfwEispoCX716l5RLg== + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 713 + Lookin' For A Reason + J.C. Fogerty + 209789 + HOgk25FjGjmXmSD8bE722Ls= + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 714 + Hello Mary Lou + J.C. Fogerty + 132832 + 8pVyUqhINZrQe9jMpPy+ + 0.9900000000000000000 + 55 + 1 + 1 + 1 + + + 715 + Gatas Extraordinárias + + 212506 + w3eZb1TFUc9l + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 716 + Brasil + + 243696 + ac37u4ccLsBfmL3JP9w= + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 717 + Eu Sou Neguinha (Ao Vivo) + + 251768 + 95OeYcr1JD48in4+S0gsRKI= + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 718 + Geração Coca-Cola (Ao Vivo) + + 228153 + Pt9onhTzuw== + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 719 + Lanterna Dos Afogados + + 204538 + 450lcvk4vcldMbNumnVFjr8w + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 720 + Coroné Antonio Bento + + 200437 + 3uJ4MlQb3AD8PQ== + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 721 + Você Passa, Eu Acho Graça (Ao Vivo) + + 206733 + f6qlLBKGGcmRRYA= + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 722 + Meu Mundo Fica Completo (Com Você) + + 247771 + 6/qQM1LJmQ== + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 723 + 1° De Julho + + 270262 + 3+Pq3btratFX + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 724 + Música Urbana 2 + + 194899 + OMCMBbIJyW1jvnX1n8NdYI03 + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 725 + Vida Bandida (Ao Vivo) + + 192626 + 54o3Y2R4m7/IcaYbR3J0Db/1 + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 726 + Palavras Ao Vento + + 212453 + SIdp5GbaY+pDJ39a3jMN + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 727 + Não Sei O Que Eu Quero Da Vida + + 151849 + kgBdJ4wXSQH8vKItgiu1nQ== + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 728 + Woman Is The Nigger Of The World (Ao Vivo) + + 298919 + p+88faXRiAGOV5hIF8joOgLh + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 729 + Juventude Transviada (Ao Vivo) + + 278622 + Ys1YMD5o6Kk4NWcYceLvNg== + 0.9900000000000000000 + 56 + 1 + 7 + 1 + + + 730 + Malandragem + + 247588 + 0PHsL9Um/r+wueQ= + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 731 + O Segundo Sol + + 252133 + uvN/Sak7nE6+ + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 732 + Smells Like Teen Spirit (Ao Vivo) + + 316865 + Fb0nUMsmPydm + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 733 + E.C.T. + + 227500 + kaVpEPXcjKdacY2vA7V9 + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 734 + Todo Amor Que Houver Nesta Vida + + 227160 + 587HplLohNLcLw== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 735 + Metrô. Linha 743 + + 174654 + hVvYgIhTvWMUiW9UzK4= + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 736 + Nós (Ao Vivo) + + 193828 + 801wZblx0ok+cV+/1KgglzQ= + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 737 + Na Cadência Do Samba + + 196075 + 1AdMgvEEXEZSaLh4efv3XPQ2Yg== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 738 + Admirável Gado Novo + + 274390 + dZey0ZkPKJPouvTyOo74pw== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 739 + Eleanor Rigby + + 189466 + cVxrCXIeadDF92TIeLTqNQ== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 740 + Socorro + + 258586 + UD1Ueuji28hemHTGPg== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 741 + Blues Da Piedade + + 257123 + A0+zg9r2bQJ4SQHTF8TLcAYJvQ== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 742 + Rubens + + 211853 + PrpTL4h6kEAUhg== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 743 + Não Deixe O Samba Morrer - Cassia Eller e Alcione + + 268173 + CYcMYXjEMA8+UE3FC3gUyhf97g== + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 744 + Mis Penas Lloraba Yo (Ao Vivo) Soy Gitano (Tangos) + + 188473 + agnArEj8g/pfZizu8VT3TAtj + 0.9900000000000000000 + 57 + 1 + 7 + 1 + + + 745 + Comin' Home + Bolin/Coverdale/Paice + 235781 + q9X6fizx9Ue2c7A= + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 746 + Lady Luck + Cook/Coverdale + 168202 + QyX0igDGXxh7QTaw2CNe07eByA== + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 747 + Gettin' Tighter + Bolin/Hughes + 218044 + s6pDvHCLlLtStM2Gr+3pyPzJ9w== + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 748 + Dealer + Bolin/Coverdale + 230922 + q0rXaZ5KpQmSIpA1q/HFmOI4GQ== + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 749 + I Need Love + Bolin/Coverdale + 263836 + MqTFxnSwAOs6ldbtikITaA== + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 750 + Drifter + Bolin/Coverdale + 242834 + 2R0m5ospMCOY2g== + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 751 + Love Child + Bolin/Coverdale + 188160 + J1DmxLCCUweFEfXu + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 752 + This Time Around / Owed to 'G' (Instrumental) + Bolin/Hughes/Lord + 370102 + uc78S6Orad1cxgga8o6n + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 753 + You Keep On Moving + Coverdale/Hughes + 319111 + lKLc1UHE6a8SPAc= + 0.9900000000000000000 + 58 + 1 + 1 + 1 + + + 754 + Speed King + Blackmore, Gillan, Glover, Lord, Paice + 264385 + DOPA5C/dLLws5YDsceDLit2pvQ== + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 755 + Bloodsucker + Blackmore, Gillan, Glover, Lord, Paice + 256261 + q4vwbhkYB/XlTDlno3rReAUk6w== + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 756 + Child In Time + Blackmore, Gillan, Glover, Lord, Paice + 620460 + YutOryLvZGH4X9JofhND + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 757 + Flight Of The Rat + Blackmore, Gillan, Glover, Lord, Paice + 478302 + 81LKFtU219+sGEn2D1KEuA== + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 758 + Into The Fire + Blackmore, Gillan, Glover, Lord, Paice + 210259 + qJHAPEBLKbSm/IU= + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 759 + Living Wreck + Blackmore, Gillan, Glover, Lord, Paice + 274886 + 0OiQN1CFs1nUQCsUbwMJpg== + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 760 + Hard Lovin' Man + Blackmore, Gillan, Glover, Lord, Paice + 431203 + UaXaGarWgYJDsgah + 0.9900000000000000000 + 59 + 1 + 1 + 1 + + + 761 + Fireball + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 204721 + LjpRZNswuL++ + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 762 + No No No + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 414902 + 0V7pZ2aszT1C + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 763 + Strange Kind Of Woman + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 247092 + RlRXq2AmEQ60DNKtuHIR8Q== + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 764 + Anyone's Daughter + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 284682 + CifZ7a2S2Am7wG4b1XZ1xB0b2g== + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 765 + The Mule + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 322063 + pgO1HqoKsvokpXZWdenCFWiWmQ== + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 766 + Fools + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 500427 + fqGlZaLz3pVd6JtXNw4cBnK6 + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 767 + No One Came + Ritchie Blackmore, Ian Gillan, Roger Glover, Jon Lord, Ian Paice + 385880 + o+De5RVJGKbstF9bhoIYZA== + 0.9900000000000000000 + 60 + 1 + 1 + 1 + + + 768 + Knocking At Your Back Door + Richie Blackmore, Ian Gillian, Roger Glover + 424829 + XlB7tyscnTsKHx9mzLs= + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 769 + Bad Attitude + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord + 307905 + rVP24aC8kBuKTfLh/Q== + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 770 + Child In Time (Son Of Aleric - Instrumental) + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice + 602880 + FNUeqRioIT+Ld8RBqQsq+D8f+A== + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 771 + Nobody's Home + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice + 243017 + rjKMNsRIzTTxaTk6 + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 772 + Black Night + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice + 368770 + rvVKAL20EoFuyH4dXhKE + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 773 + Perfect Strangers + Richie Blackmore, Ian Gillian, Roger Glover + 321149 + kQ3S6UHe4knn + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 774 + The Unwritten Law + Richie Blackmore, Ian Gillian, Roger Glover, Ian Paice + 295053 + z9rtTiE+iaH7FeD4gWvlOj9qDQ== + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 775 + Call Of The Wild + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord + 293851 + ZTZIQ19cZlFezxMAGdjkN5Q= + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 776 + Hush + South + 213054 + pkCTvRZuEJmLZw== + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 777 + Smoke On The Water + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice + 464378 + Bp93O81+mZKq7sXXOEM= + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 778 + Space Trucking + Richie Blackmore, Ian Gillian, Roger Glover, Jon Lord, Ian Paice + 341185 + At/eqYatph/DzYaoH9kyxQ== + 0.9900000000000000000 + 61 + 1 + 1 + 1 + + + 779 + Highway Star + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 368770 + /01YMJvES1k= + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 780 + Maybe I'm A Leo + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 290455 + peox4WhbeetsMbri4FVff7M= + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 781 + Pictures Of Home + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 303777 + R9Z6uHcp9djq6vtmGpNQ + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 782 + Never Before + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 239830 + CLzu4mQqLg== + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 783 + Smoke On The Water + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 340871 + bQEK7R73+LHoVgM= + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 784 + Lazy + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 442096 + 0O1yB+uPcI/vBRY= + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 785 + Space Truckin' + Ian Gillan/Ian Paice/Jon Lord/Ritchie Blckmore/Roger Glover + 272796 + kqRNopHQCQ== + 0.9900000000000000000 + 62 + 1 + 1 + 1 + + + 786 + Vavoom : Ted The Mechanic + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 257384 + p0ZKdh8HuvLxSX7EkMxrGkrm + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 787 + Loosen My Strings + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 359680 + 1bqfRGjr41t6qg== + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 788 + Soon Forgotten + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 287791 + HxdM5tyKo/zo49V+naaGUZbF + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 789 + Sometimes I Feel Like Screaming + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 451840 + M1iq2TRiBwHiizysQEibKmd4 + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 790 + Cascades : I'm Not Your Lover + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 283689 + 8OF3Tv4T/w== + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 791 + The Aviator + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 320992 + Ap7hmUyVQXf9dD4Xg9SIwHCsNw== + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 792 + Rosa's Cantina + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 312372 + NQF7H9js1Fe8CqzFNQ== + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 793 + A Castle Full Of Rascals + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 311693 + BWMA8e8W/tGetShhJhxYtt0= + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 794 + A Touch Away + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 276323 + 3GkGACLCwGA= + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 795 + Hey Cisco + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 354089 + 6bryyHjiXM4lwH+8IJZk + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 796 + Somebody Stole My Guitar + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 249443 + xvZ3xrj+BSxa6csgBUA+MI5W + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 797 + The Purpendicular Waltz + Ian Gillan, Roger Glover, Jon Lord, Steve Morse, Ian Paice + 283924 + FqvssH7JTTP1XpU= + 0.9900000000000000000 + 63 + 1 + 1 + 1 + + + 798 + King Of Dreams + Blackmore, Glover, Turner + 328385 + 06GdW8tImgfqtcVtjhY8yeQ= + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 799 + The Cut Runs Deep + Blackmore, Glover, Turner, Lord, Paice + 342752 + Ti3KgU222UX4/A== + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 800 + Fire In The Basement + Blackmore, Glover, Turner, Lord, Paice + 283977 + yxDOxS33fmfkcuf0Tg== + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 801 + Truth Hurts + Blackmore, Glover, Turner + 314827 + YeZ/ImiNg09zD2fxUg== + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 802 + Breakfast In Bed + Blackmore, Glover, Turner + 317126 + 5oKGUJ2cH6T2qGAevWH/D2c5 + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 803 + Love Conquers All + Blackmore, Glover, Turner + 227186 + VuzQWiOQb+d8nL9ePKUqgWI= + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 804 + Fortuneteller + Blackmore, Glover, Turner, Lord, Paice + 349335 + l1exCrzv1sFJzw== + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 805 + Too Much Is Not Enough + Turner, Held, Greenwood + 257724 + T2OoLXX7ZxUnYr8utKMINw== + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 806 + Wicked Ways + Blackmore, Glover, Turner, Lord, Paice + 393691 + JHmS4J0jz+HJSzA= + 0.9900000000000000000 + 64 + 1 + 1 + 1 + + + 807 + Stormbringer + D.Coverdale/R.Blackmore/Ritchie Blackmore + 246413 + g2JHn8YsORcwxqrD + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 808 + Love Don't Mean a Thing + D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore + 263862 + OonYKf1ntLg= + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 809 + Holy Man + D.Coverdale/G.Hughes/Glenn Hughes/J.Lord/John Lord + 270236 + nNA8QLJA2Eusrw== + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 810 + Hold On + D.Coverdal/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord + 306860 + NKQAeI7uds8= + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 811 + Lady Double Dealer + D.Coverdale/R.Blackmore/Ritchie Blackmore + 201482 + Gl7Pz3Vimfe4zOR8KffFdw== + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 812 + You Can't Do it Right (With the One You Love) + D.Coverdale/G.Hughes/Glenn Hughes/R.Blackmore/Ritchie Blackmore + 203755 + hXr4PuQa+ow2 + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 813 + High Ball Shooter + D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore + 267833 + iV+aDvDkmHI+AG0= + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 814 + The Gypsy + D.Coverdale/G.Hughes/Glenn Hughes/I.Paice/Ian Paice/J.Lord/John Lord/R.Blackmore/Ritchie Blackmore + 242886 + T6bhk9/LuwusOgErafzW4TVE1Q== + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 815 + Soldier Of Fortune + D.Coverdale/R.Blackmore/Ritchie Blackmore + 193750 + P8wPlx6985eQ + 0.9900000000000000000 + 65 + 1 + 1 + 1 + + + 816 + The Battle Rages On + ian paice/jon lord + 356963 + hnb2uipSXVE6LtEr + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 817 + Lick It Up + roger glover + 240274 + T15vpfMOtzz6KyqLg5ZJdCE= + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 818 + Anya + jon lord/roger glover + 392437 + I3ons4o1rtKDg+QJpnET4sA= + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 819 + Talk About Love + roger glover + 247823 + rhj/iNlJjErM + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 820 + Time To Kill + roger glover + 351033 + p7wU3BhWrbHCm9M69g== + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 821 + Ramshackle Man + roger glover + 334445 + izNX8IW4eKDVEMYJ15ug3Q== + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 822 + A Twist In The Tail + roger glover + 257462 + QGmAKsdvCPBPxA== + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 823 + Nasty Piece Of Work + jon lord/roger glover + 276662 + HyVlcyHe/aXx + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 824 + Solitaire + roger glover + 282226 + xBO2BuYDFQ9+ERDkdA== + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 825 + One Man's Meat + roger glover + 278804 + 0Xb2w8ROADXzFoE= + 0.9900000000000000000 + 66 + 1 + 1 + 1 + + + 826 + Pour Some Sugar On Me + + 292519 + qlLo+Z776w== + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 827 + Photograph + + 248633 + e1XKJOBr8uHQs1E6sdKiq+c= + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 828 + Love Bites + + 346853 + 4aKbjyCfhTZYwyeEcxX4 + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 829 + Let's Get Rocked + + 296019 + F3yr0uJYXB9lQA== + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 830 + Two Steps Behind (Acoustic Version) + + 259787 + Rv7YrzwSZBlJ8Ow= + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 831 + Animal + + 244741 + Kp6qEi+6Sz88Qcm6 + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 832 + Heaven Is + + 214021 + /xRWiEZ8Kg== + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 833 + Rocket + + 247248 + 2z84gBPqcg77r/crR4E= + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 834 + When Love & Hate Collide + + 257280 + OEUtZBkAhwQ1Hok9/Q2Q + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 835 + Action + + 220604 + dMJTTl9ykhvP2TFBkg== + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 836 + Make Love Like A Man + + 255660 + jt5+4R5DGRcQ4FM7AmE= + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 837 + Armageddon It + + 322455 + rXQAaq2DafQy1MayEZU/ + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 838 + Have You Ever Needed Someone So Bad + + 319320 + RnJjkKu/HO9N6V2xc/okbzGR + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 839 + Rock Of Ages + + 248424 + ZDDW5E4l6UsM + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 840 + Hysteria + + 355056 + kAeC0RENyJ7R3e5XEBw= + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 841 + Bringin' On The Heartbreak + + 272457 + JbeAOK9WgX9y2g== + 0.9900000000000000000 + 67 + 1 + 1 + 1 + + + 842 + Roll Call + Jim Beard + 321358 + b40VasFzD5i8 + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 843 + Otay + John Scofield, Robert Aries, Milton Chambers and Gary Grainger + 423653 + 2+Bh7VvQYLQzDR+6ICg= + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 844 + Groovus Interruptus + Jim Beard + 319373 + aRNdAA+HD/ZznTuJ + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 845 + Paris On Mine + Jon Herington + 368875 + G3pHeF/iStce + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 846 + In Time + Sylvester Stewart + 368953 + VIYgyz/NfrVt7P1YYA== + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 847 + Plan B + Dean Brown, Dennis Chambers & Jim Beard + 272039 + l61ZzOruTyBH+pi5xada + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 848 + Outbreak + Jim Beard & Jon Herington + 659226 + 3pVKyAl67rzQKPTnzpxo + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 849 + Baltimore, DC + John Scofield + 346932 + GZXgsoh+7TD6Mz4mM4UH1lsv + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 850 + Talkin Loud and Saying Nothin + James Brown & Bobby Byrd + 360411 + Zw6YqRy+nQ== + 0.9900000000000000000 + 68 + 1 + 2 + 1 + + + 851 + Pétala + + 270080 + wflnUqqR1Z8wxqe0X6gaztU8 + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 852 + Meu Bem-Querer + + 255608 + iEohHoyejgE= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 853 + Cigano + + 304692 + gevE8+qCLDaS4Q== + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 854 + Boa Noite + + 338755 + lV3l1xCzeq4= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 855 + Fato Consumado + + 211565 + 9MnU4PYVsZ/b27MbkCEeRQK0yQ== + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 856 + Faltando Um Pedaço + + 267728 + fOM786gzKmRKDdk= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 857 + Álibi + + 213237 + 4EK/txfj/dXRjFq3LngEPMc= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 858 + Esquinas + + 280999 + Dv+w0EIRjuA4w+pMVc0CjzpOYQ== + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 859 + Se... + + 286432 + LR639AzwiITFLy7unQ== + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 860 + Eu Te Devoro + + 311614 + /9lzEP+uKTaqOQ== + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 861 + Lilás + + 274181 + hDaNtJ49ttphZO9IvMQ= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 862 + Acelerou + + 284081 + iAobCZX7r53OKBwq + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 863 + Um Amor Puro + + 327784 + sz32dH0Ih7n7zybxdxM= + 0.9900000000000000000 + 69 + 1 + 7 + 1 + + + 864 + Samurai + Djavan + 330997 + UxCRtkutJR4boQ== + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 865 + Nem Um Dia + Djavan + 337423 + 79WZvoyBE2cn + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 866 + Oceano + Djavan + 217338 + bXvKsz2YjTv0Fx3ockk= + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 867 + Açai + Djavan + 270968 + l2bfoY0e29LZGLEgPEKl3Q/r + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 868 + Serrado + Djavan + 295314 + 5pXGAg4UmOMniYYHYk8A + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 869 + Flor De Lis + Djavan + 236355 + GzTGmgSSqPGbi3hQ+E85Dfw= + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 870 + Amar É Tudo + Djavan + 211617 + YyjQY9CN9Duz + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 871 + Azul + Djavan + 253962 + UhFO0DtOialJUBNT7NVngptI + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 872 + Seduzir + Djavan + 277524 + 1094Cwjs2CO3Yzmmyd5fnoo= + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 873 + A Carta + Djavan - Gabriel, O Pensador + 347297 + qBSqxpDEq0YPO/v8 + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 874 + Sina + Djavan + 268173 + 8axQ3PnZBUXjYyrRRg+qSnU= + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 875 + Acelerou + Djavan + 284133 + Nt1E8zNAEb+0 + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 876 + Um Amor Puro + Djavan + 327105 + wt2cKLsUSPl4AmbEhA== + 0.9900000000000000000 + 70 + 1 + 7 + 1 + + + 877 + O Bêbado e a Equilibrista + + 223059 + xLGA9Eq0AfuarsUfCv4= + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 878 + O Mestre-Sala dos Mares + + 186226 + EMo5JaaDBsY= + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 879 + Atrás da Porta + + 166608 + FjHHsNJyJg== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 880 + Dois Pra Lá, Dois Pra Cá + + 263026 + WU0vgcAddf9exkPuY5wKSYBo + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 881 + Casa no Campo + + 170788 + LZ/ddL3qft4Y7VApJ4dTxrw= + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 882 + Romaria + + 242834 + 90+txCZIvA== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 883 + Alô, Alô, Marciano + + 241397 + 2J55Jn0vaTr5 + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 884 + Me Deixas Louca + + 214831 + e9lxl0I+XBINnRtmD9VNeg== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 885 + Fascinação + + 180793 + GIpoeZW3+hLfZPFvIL8= + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 886 + Saudosa Maloca + + 278125 + joBK411fDW5nFDof + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 887 + As Aparências Enganam + + 247379 + cY+k2QKmUbCQWeUh + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 888 + Madalena + + 157387 + hWLaaqLt3S/Yj4tpHQ== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 889 + Maria Rosa + + 232803 + ChsBZFuXU6BQwBhsem07/Q== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 890 + Aprendendo A Jogar + + 290664 + ZcHn2qqU/HFMQXiZ/xlv5Q== + 0.9900000000000000000 + 71 + 1 + 7 + 1 + + + 891 + Layla + Clapton/Gordon + 430733 + R5WP9IqKI+USGlI1cw== + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 892 + Badge + Clapton/Harrison + 163552 + 89toJac1T1+HBPMOVdsGUKephw== + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 893 + I Feel Free + Bruce/Clapton + 174576 + JqZtMdo3xPWXeqo82dGEvpc= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 894 + Sunshine Of Your Love + Bruce/Clapton + 252891 + x68t5w2LAXs= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 895 + Crossroads + Clapton/Robert Johnson Arr: Eric Clapton + 253335 + R97CcqiudUk= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 896 + Strange Brew + Clapton/Collins/Pappalardi + 167810 + bTZKcHFZxw1ZtzWEVke4tOI= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 897 + White Room + Bruce/Clapton + 301583 + 0D+Z4jBfA3wW + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 898 + Bell Bottom Blues + Clapton + 304744 + BwKNZIg3UWA= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 899 + Cocaine + Cale/Clapton + 215928 + Vz7THwAxSkav + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 900 + I Shot The Sheriff + Marley + 263862 + lgm+xtekCrM= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 901 + After Midnight + Clapton/J. J. Cale + 191320 + Buts9UPyBVc= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 902 + Swing Low Sweet Chariot + Clapton/Trad. Arr. Clapton + 208143 + 0Psf9lgLi5j9H5iw5Rk= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 903 + Lay Down Sally + Clapton/Levy + 231732 + in/LSDu2v36Dxlq86kiP + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 904 + Knockin On Heavens Door + Clapton/Dylan + 264411 + +togdbTRn7GyOz4= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 905 + Wonderful Tonight + Clapton + 221387 + 6hvaINEYasMnvRtzEQ== + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 906 + Let It Grow + Clapton + 297064 + mzD9T6BQbfGd1Q== + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 907 + Promises + Clapton/F.eldman/Linn + 180401 + o5+54BmV/3cY + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 908 + I Can't Stand It + Clapton + 249730 + aOs56tHezAU9vq0= + 0.9900000000000000000 + 72 + 1 + 6 + 1 + + + 909 + Signe + Eric Clapton + 193515 + NzZvs2Ob7jr5fQVbLg== + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 910 + Before You Accuse Me + Eugene McDaniel + 224339 + seMNJxz7+OkyRcRkznI= + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 911 + Hey Hey + Big Bill Broonzy + 196466 + 62AWFz9ognFlMmSJ3prr5t68 + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 912 + Tears In Heaven + Eric Clapton, Will Jennings + 274729 + LOn4FqKyaw== + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 913 + Lonely Stranger + Eric Clapton + 328724 + Aynv/8x7mQ0= + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 914 + Nobody Knows You When You're Down & Out + Jimmy Cox + 231836 + 7kPuES9yqPS3 + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 915 + Layla + Eric Clapton, Jim Gordon + 285387 + Gk9HX+WndkW380l0ZQ== + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 916 + Running On Faith + Jerry Lynn Williams + 378984 + G35HdjOYDkSMzvebzkb9dg== + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 917 + Walkin' Blues + Robert Johnson + 226429 + IetAUP28yQpXVTbhGdN53Rr2 + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 918 + Alberta + Traditional + 222406 + KjLBHmPVwnlnStk= + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 919 + San Francisco Bay Blues + Jesse Fuller + 203363 + SECjKIglgg== + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 920 + Malted Milk + Robert Johnson + 216528 + wn1r20LYY3P6fr2zUE1MHV8= + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 921 + Old Love + Eric Clapton, Robert Cray + 472920 + 3Xs6QmK/fiXtoHWq8Lg= + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 922 + Rollin' And Tumblin' + McKinley Morgenfield (Muddy Waters) + 251768 + 2O2sxubci3JP + 0.9900000000000000000 + 73 + 1 + 6 + 1 + + + 923 + Collision + Jon Hudson/Mike Patton + 204303 + 6Y0m3/v0hsi8RwfjfxurXB0= + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 924 + Stripsearch + Jon Hudson/Mike Bordin/Mike Patton + 270106 + wv5PjQQaeF+fVw== + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 925 + Last Cup Of Sorrow + Bill Gould/Mike Patton + 251663 + 8FEI68N4Mlg= + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 926 + Naked In Front Of The Computer + Mike Patton + 128757 + 8qvv4jRxkA== + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 927 + Helpless + Bill Gould/Mike Bordin/Mike Patton + 326217 + bpEair6hr1E= + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 928 + Mouth To Mouth + Bill Gould/Jon Hudson/Mike Bordin/Mike Patton + 228493 + XIgLZ5tVLk/L9f/3u6J5BNf3 + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 929 + Ashes To Ashes + Bill Gould/Jon Hudson/Mike Bordin/Mike Patton/Roddy Bottum + 217391 + Dm1Yk4qD8Q097jGwWJqVHKpN + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 930 + She Loves Me Not + Bill Gould/Mike Bordin/Mike Patton + 209867 + VlXAkmh7kf2y7qGG56mZQsED + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 931 + Got That Feeling + Mike Patton + 140852 + gOSqSPFgmUWmXSaG + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 932 + Paths Of Glory + Bill Gould/Jon Hudson/Mike Bordin/Mike Patton/Roddy Bottum + 257253 + tvigwE7a7xj5hT4fnGhKB79Y + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 933 + Home Sick Home + Mike Patton + 119040 + GLTM+qsNzzLONuqfi2fSz+4= + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 934 + Pristina + Bill Gould/Mike Patton + 232698 + 2PPmFN2HXmsoVfdPPQ== + 0.9900000000000000000 + 74 + 1 + 4 + 1 + + + 935 + Land Of Sunshine + + 223921 + BVJuGur99LM= + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 936 + Caffeine + + 267937 + qCDhDuazt8mZW/4= + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 937 + Midlife Crisis + + 263235 + ZO0D10ScQOV5On/4 + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 938 + RV + + 223242 + mjj4uOTxEyV0PfP7eXc= + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 939 + Smaller And Smaller + + 310831 + cYtd8z7/oWVqQqZg + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 940 + Everything's Ruined + + 273658 + zgVtoekKS3q+EbVq68LvrxA= + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 941 + Malpractice + + 241371 + yiSHc+7ci7k= + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 942 + Kindergarten + + 270680 + +dKNdT6QXlduz1IRbiw9snmo + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 943 + Be Aggressive + + 222432 + Uz2xtVpm2zwtWheR + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 944 + A Small Victory + + 297168 + LwZSqDCbdtmM + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 945 + Crack Hitler + + 279144 + gN+9ylz4SsF0NA== + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 946 + Jizzlobber + + 398341 + ZsZHHDMPYlQx/Fc+PQ== + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 947 + Midnight Cowboy + + 251924 + Z9mVgd0xr8bSMNadnH5D4pii + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 948 + Easy + + 185835 + EslAC4v9jBSFWm4ooYDo9B+0QA== + 0.9900000000000000000 + 75 + 1 + 4 + 1 + + + 949 + Get Out + Mike Bordin, Billy Gould, Mike Patton + 137482 + AlOf9BdGlnM= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 950 + Ricochet + Mike Bordin, Billy Gould, Mike Patton + 269400 + EE5kteEqGA== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 951 + Evidence + Mike Bordin, Billy Gould, Mike Patton, Trey Spruance + 293590 + zgqDUR0pa2MHNRyzig== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 952 + The Gentle Art Of Making Enemies + Mike Bordin, Billy Gould, Mike Patton + 209319 + LlgLWr8qS/NEZxkv + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 953 + Star A.D. + Mike Bordin, Billy Gould, Mike Patton + 203807 + DAlzv1XQzVGqvEblKQ== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 954 + Cuckoo For Caca + Mike Bordin, Billy Gould, Mike Patton, Trey Spruance + 222902 + kA8Reb9Z6yAMqodr7ds= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 955 + Caralho Voador + Mike Bordin, Billy Gould, Mike Patton, Trey Spruance + 242102 + xRw37bRfWpR1x+O904M= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 956 + Ugly In The Morning + Mike Bordin, Billy Gould, Mike Patton + 186435 + xXWW9rvjMu1Z1g== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 957 + Digging The Grave + Mike Bordin, Billy Gould, Mike Patton + 185129 + 6/3IN+ri8XbkoA73dQ== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 958 + Take This Bottle + Mike Bordin, Billy Gould, Mike Patton, Trey Spruance + 298997 + NnubstycGA== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 959 + King For A Day + Mike Bordin, Billy Gould, Mike Patton, Trey Spruance + 395859 + ceUS1PYg9g== + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 960 + What A Day + Mike Bordin, Billy Gould, Mike Patton + 158275 + Lt4XKnNczD0= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 961 + The Last To Know + Mike Bordin, Billy Gould, Mike Patton + 267833 + AMtcnvq2fSAihGiWO30= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 962 + Just A Man + Mike Bordin, Billy Gould, Mike Patton + 336666 + cE6L4iUV69A= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 963 + Absolute Zero + Mike Bordin, Billy Gould, Mike Patton + 181995 + UXEv4Epg2a9e1dvQu/52LpQ= + 0.9900000000000000000 + 76 + 1 + 1 + 1 + + + 964 + From Out Of Nowhere + Faith No More + 202527 + 1JyO/PJh3bk= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 965 + Epic + Faith No More + 294008 + 0OkYxhT73E2Ih50= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 966 + Falling To Pieces + Faith No More + 316055 + wqq4OGWhabRQFbORYRc08VU= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 967 + Surprise! You're Dead! + Faith No More + 147226 + zgOROgjGRg4= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 968 + Zombie Eaters + Faith No More + 360881 + 1d6w7af33hHx1cOMwHME1Ls1hg== + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 969 + The Real Thing + Faith No More + 493635 + /cbr+Am4mkQ= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 970 + Underwater Love + Faith No More + 231993 + ofLyVtqU1p8nDJqDBkIbkfIO + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 971 + The Morning After + Faith No More + 223764 + jGVNkL+pyQ7zuOPuXJmJUOLR + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 972 + Woodpecker From Mars + Faith No More + 340532 + 5t4uNZMp7OH2hM9mF6oKuCFUYg== + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 973 + War Pigs + Tony Iommi, Bill Ward, Geezer Butler, Ozzy Osbourne + 464770 + rRCG4uZDHT3pffI5wLw= + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 974 + Edge Of The World + Faith No More + 250357 + sV0wuWfSxw== + 0.9900000000000000000 + 77 + 1 + 4 + 1 + + + 975 + Deixa Entrar + + 33619 + iSNSzENS4Wf8gA== + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 976 + Falamansa Song + + 237165 + iNVXS05PC6/4eZKW + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 977 + Xote Dos Milagres + + 269557 + W4JZWvGa+2HlPPy/lHfa + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 978 + Rindo À Toa + + 222066 + CBX1uSMzUlkR + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 979 + Confidência + + 222197 + aVsiz1n3jaxxwPmHdmGE + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 980 + Forró De Tóquio + + 169273 + o5hbjLnYMcQ= + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 981 + Zeca Violeiro + + 143673 + ZJzcgicw/w== + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 982 + Avisa + + 355030 + DjCfPhXjBTHn + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 983 + Principiando/Decolagem + + 116767 + GfGAn5M054+5/oUokQ== + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 984 + Asas + + 231915 + Xt/1WrAqSZD5 + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 985 + Medo De Escuro + + 213760 + ZzHl/Y61VVvR0Rg= + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 986 + Oração + + 271072 + b8QIqJuXdwE= + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 987 + Minha Gata + + 181838 + 5Z513zXtqoA= + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 988 + Desaforo + + 174524 + vYn4QTdiT+kBBKgpVw== + 0.9900000000000000000 + 78 + 1 + 7 + 1 + + + 989 + In Your Honor + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 230191 + EoxwMFEIj7E= + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 990 + No Way Back + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 196675 + +HyCkm8eWA== + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 991 + Best Of You + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 255712 + qtoUFI/ZLo2mWLGWc1iZjt4= + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 992 + DOA + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 252186 + UsS8WHcuC3D/xbQ= + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 993 + Hell + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 117080 + 38upPP5OQquDskKjq6/dG6ag4g== + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 994 + The Last Song + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 199523 + swzLkwpRY+UIHtpp2NZ55uw2 + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 995 + Free Me + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 278700 + Sksy4J+CGa3HUQ== + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 996 + Resolve + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 288731 + yl/iwBzS/xUxrOtco2TY + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 997 + The Deepest Blues Are Black + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 238419 + ytU29i5vRQ== + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 998 + End Over End + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett + 352078 + qIAsKxDwpJuUF1R6hhe6pufX + 0.9900000000000000000 + 79 + 1 + 1 + 1 + + + 999 + Still + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 313182 + rV/vj3zHqU/XkVs= + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1000 + What If I Do? + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 302994 + WhlKGJum0wRA + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1001 + Miracle + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 209684 + UMiLD11SshuPDldplzi48bA= + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1002 + Another Round + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 265848 + Z6HMCTlV+mE8/h4A + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1003 + Friend Of A Friend + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 193280 + 0sSmDycDbGlXnbwBTGvwgRE= + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1004 + Over And Out + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 316264 + qfZvnZ86Ro42FfwVs/yP+oSl8Q== + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1005 + On The Mend + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 271908 + ke1D+w8DEAfs6gk= + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1006 + Virginia Moon + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 229198 + Kp91CaQ1JWvImA== + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1007 + Cold Day In The Sun + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 200724 + V2xC6r9yUeZLj+jOvLN0jZsq + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1008 + Razor + Dave Grohl, Taylor Hawkins, Nate Mendel, Chris Shiflett/FOO FIGHTERS + 293276 + oksMHeoUh4Y= + 0.9900000000000000000 + 80 + 1 + 1 + 1 + + + 1009 + All My Life + Foo Fighters + 263653 + Tn+GYPkf647NGVA= + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1010 + Low + Foo Fighters + 268120 + mgO9T0LQuFYwqIk= + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1011 + Have It All + Foo Fighters + 298057 + ifaCS05X1Tjr+5jMCYfUnMfl + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1012 + Times Like These + Foo Fighters + 266370 + gtmpB0dPzqhDzjAlpvY= + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1013 + Disenchanted Lullaby + Foo Fighters + 273528 + 1wOdn0B2Qxipn2vwRbr8 + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1014 + Tired Of You + Foo Fighters + 311353 + jkvoBmff7zr8gA== + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1015 + Halo + Foo Fighters + 306442 + kmq71fLVw6/R/yikST7BAGfc + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1016 + Lonely As You + Foo Fighters + 277185 + iO1GsaLave/e + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1017 + Overdrive + Foo Fighters + 270550 + FGKjwMexre3KeRs= + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1018 + Burn Away + Foo Fighters + 298396 + CyscZaafyKU= + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1019 + Come Back + Foo Fighters + 469968 + h16e98FLuA== + 0.9900000000000000000 + 81 + 1 + 4 + 1 + + + 1020 + Doll + Dave, Taylor, Nate, Chris + 83487 + +jXl5be8nITkgY0TEp0= + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1021 + Monkey Wrench + Dave, Taylor, Nate, Chris + 231523 + QgbiG5U8NB0nOBmM + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1022 + Hey, Johnny Park! + Dave, Taylor, Nate, Chris + 248528 + BcgGZvXUz0M1nFNuf+HB + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1023 + My Poor Brain + Dave, Taylor, Nate, Chris + 213446 + OpLM6vpb8d4vI93GFw== + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1024 + Wind Up + Dave, Taylor, Nate, Chris + 152163 + rZ4wmH8ceycePs4f + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1025 + Up In Arms + Dave, Taylor, Nate, Chris + 135732 + aY6sFVpy/uymTQ== + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1026 + My Hero + Dave, Taylor, Nate, Chris + 260101 + CanWJzbS9ggrd++1 + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1027 + See You + Dave, Taylor, Nate, Chris + 146782 + 52KloxN0jRzbTodQgw6CVA== + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1028 + Enough Space + Dave Grohl + 157387 + 0QZRjY7VRVM= + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1029 + February Stars + Dave, Taylor, Nate, Chris + 289306 + TEjF85Z62G4t+M1b2DK/hi5b + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1030 + Everlong + Dave Grohl + 250749 + 1rPEdLQSpehksQ== + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1031 + Walking After You + Dave Grohl + 303856 + jV9PIidFVue3DXcV4Io= + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1032 + New Way Home + Dave, Taylor, Nate, Chris + 342230 + vfnUkQdfefZ8 + 0.9900000000000000000 + 82 + 1 + 1 + 1 + + + 1033 + My Way + claude françois/gilles thibault/jacques revaux/paul anka + 275879 + iNMQ4PGRdLzTam0LtQp6L0c= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1034 + Strangers In The Night + berthold kaempfert/charles singleton/eddie snyder + 155794 + QV+e4+ktVasU06n6FGnT5Z8= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1035 + New York, New York + fred ebb/john kander + 206001 + RQbGfANYDB8askPKFw== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1036 + I Get A Kick Out Of You + cole porter + 194429 + F9W0HZ+k6g== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1037 + Something Stupid + carson c. parks + 158615 + i0V9oBPZVgM40GoI6UHcxQ== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1038 + Moon River + henry mancini/johnny mercer + 198922 + RtbJE6JoSbvR4j61tUX7h2J6gQ== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1039 + What Now My Love + carl sigman/gilbert becaud/pierre leroyer + 149995 + YkQzyRZ6cg== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1040 + Summer Love + hans bradtke/heinz meier/johnny mercer + 174994 + Du7W+O/BWQ== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1041 + For Once In My Life + orlando murden/ronald miller + 171154 + INDp3DPlQfYXToKLb4GHxg== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1042 + Love And Marriage + jimmy van heusen/sammy cahn + 89730 + xvkBowD8KPU= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1043 + They Can't Take That Away From Me + george gershwin/ira gershwin + 161227 + reMLRsb06y1mkZGly30= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1044 + My Kind Of Town + jimmy van heusen/sammy cahn + 188499 + PLHI9+fwjWcQnQ== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1045 + Fly Me To The Moon + bart howard + 149263 + x1gqH9PA50k3XuvRh42f + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1046 + I've Got You Under My Skin + cole porter + 210808 + GvU0tvp8/WdPNDAN+A== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1047 + The Best Is Yet To Come + carolyn leigh/cy coleman + 173583 + fPuonSyTA0c= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1048 + It Was A Very Good Year + ervin drake + 266605 + 0b2BRaVR30BqSK9ycdvnLUs= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1049 + Come Fly With Me + jimmy van heusen/sammy cahn + 190458 + wtCfkNlRF+LvKOpg + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1050 + That's Life + dean kay thompson/kelly gordon + 187010 + PtM3Y/h5NlgWb/PGxEmtCh8= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1051 + The Girl From Ipanema + antonio carlos jobim/norman gimbel/vinicius de moraes + 193750 + b+A5QHceQOMwLsJh + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1052 + The Lady Is A Tramp + lorenz hart/richard rodgers + 184111 + Vgk8cZ45eO+0FQGsYKzJFAhp1w== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1053 + Bad, Bad Leroy Brown + jim croce + 169900 + Z3p/0v1cGSI= + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1054 + Mack The Knife + bert brecht/kurt weill/marc blitzstein + 292075 + SQiVtbidvIjXDtGn0g== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1055 + Loves Been Good To Me + rod mckuen + 203964 + yzeUFnJ2zijE6w== + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1056 + L.A. Is My Lady + alan bergman/marilyn bergman/peggy lipton jones/quincy jones + 193175 + T9uJanRCH1Xa + 0.9900000000000000000 + 83 + 1 + 12 + 1 + + + 1057 + Entrando Na Sua (Intro) + + 179252 + DWv3pw4NjDBbBSiV + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1058 + Nervosa + + 229537 + tJtoRaerRSBEqg== + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1059 + Funk De Bamba (Com Fernanda Abreu) + + 237191 + acEyHmPMsVH3T77LnW9jaUL3 + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1060 + Call Me At Cleo´s + + 236617 + 5mi6HNXOC/13qZRKycHTPk3bbg== + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1061 + Olhos Coloridos (Com Sandra De Sá) + + 321332 + j1PXnW/2z8rWREIDKdvDu64= + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1062 + Zambação + + 301113 + XU9XzjqnYgX0CsowFY7TKtmS + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1063 + Funk Hum + + 244453 + Ha3f/0EmM2eRIe4= + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1064 + Forty Days (Com DJ Hum) + + 221727 + F5CofR91wBkvOmoB + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1065 + Balada Da Paula + Emerson Villani + 322821 + AKYusy/+ATEqkPd9TxaoBg== + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1066 + Dujji + + 324597 + 0eMGDbKgbRC0 + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1067 + Meu Guarda-Chuva + + 248528 + GXli40LdOkGABLNhI+zM + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1068 + Motéis + + 213498 + /7AAz18XEu9ohvq3TQXB + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1069 + Whistle Stop + + 526132 + e0jnuMettaAU1Sg= + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1070 + 16 Toneladas + + 191634 + jG/AGUHFobwQ5A== + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1071 + Divirta-Se (Saindo Da Sua) + + 74919 + AWZzerzig/N6QhDl + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1072 + Forty Days Instrumental + + 292493 + BRMlUftfuorvEGL5xeF2iGQ= + 0.9900000000000000000 + 84 + 1 + 7 + 1 + + + 1073 + Óia Eu Aqui De Novo + + 219454 + kpfy5VFUM/i9keGtvw== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1074 + Baião Da Penha + + 247928 + ieUULZ9PwLApzBJVEIH2AQ== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1075 + Esperando Na Janela + Manuca/Raimundinho DoAcordion/Targino Godim + 261041 + axU9fU7oH8HRHgOiKahCUA== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1076 + Juazeiro + Humberto Teixeira/Luiz Gonzaga + 222275 + b9/MSegVRA== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1077 + Último Pau-De-Arara + Corumbá/José Gumarães/Venancio + 200437 + biXT+0SxAbyEdZc= + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1078 + Asa Branca + Humberto Teixeira/Luiz Gonzaga + 217051 + /jv99GvOMb0O/w== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1079 + Qui Nem Jiló + Humberto Teixeira/Luiz Gonzaga + 204695 + 0AQpEhc0w4IA+Jvfwg== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1080 + Assum Preto + Humberto Teixeira/Luiz Gonzaga + 199653 + xoxsAeWkMqrO6DM= + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1081 + Pau-De-Arara + Guio De Morais E Seus "Parentes"/Luiz Gonzaga + 191660 + 2N4a5IfTbgID9xqf6ofB + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1082 + A Volta Da Asa Branca + Luiz Gonzaga/Zé Dantas + 271020 + loliWzqopUHEuyhb + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1083 + O Amor Daqui De Casa + Gilberto Gil + 148636 + JTZA3jRc5WgccMdxwEnO + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1084 + As Pegadas Do Amor + Gilberto Gil + 209136 + zBdd4z8URIbYqC842B/Lqg== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1085 + Lamento Sertanejo + Dominguinhos/Gilberto Gil + 260963 + Ed7A2sG1Kw== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1086 + Casinha Feliz + Gilberto Gil + 32287 + i3oZm+p5X9bP96TKeLER8boFjA== + 0.9900000000000000000 + 85 + 1 + 10 + 1 + + + 1087 + Introdução (Live) + + 154096 + rI/9pRxermoOlwthMg== + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1088 + Palco (Live) + + 238315 + tJor6u4u0GII + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1089 + Is This Love (Live) + + 295262 + J+CaYMzPILs= + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1090 + Stir It Up (Live) + + 282409 + /i/8fHN+i8r0yDjrQ5hx/Xc= + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1091 + Refavela (Live) + + 236695 + zxddW0qG1H48w06dPnZP + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1092 + Vendedor De Caranguejo (Live) + + 248842 + M9e4HbdsYmPcms8= + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1093 + Quanta (Live) + + 357485 + 40cpY1UJUaPM + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1094 + Estrela (Live) + + 285309 + 5XWn9ULIfA== + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1095 + Pela Internet (Live) + + 263471 + icKcDGWZRVkNY7X5 + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1096 + Cérebro Eletrônico (Live) + + 231627 + r7aYmvWa60g0JaxrkPJCdcIp + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1097 + Opachorô (Live) + + 259526 + 54UQDaDX4pAe/Pw= + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1098 + Copacabana (Live) + + 289671 + 7tIjNb4PW00= + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1099 + A Novidade (Live) + + 316969 + kQ5UnO+g1A== + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1100 + Ghandi (Live) + + 222458 + AuRLORsS+p6p+MIS + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1101 + De Ouro E Marfim (Live) + + 234971 + zUs4N72Ybb2DZmfcbFV3 + 0.9900000000000000000 + 86 + 1 + 7 + 1 + + + 1102 + Doce De Carnaval (Candy All) + + 356101 + cLA2DeobF7C0 + 0.9900000000000000000 + 87 + 1 + 2 + 1 + + + 1103 + Lamento De Carnaval + + 294530 + vyiWFRaYOiQ= + 0.9900000000000000000 + 87 + 1 + 2 + 1 + + + 1104 + Pretinha + + 265273 + whtlMQhn6H4= + 0.9900000000000000000 + 87 + 1 + 2 + 1 + + + 1105 + A Novidade + Gilberto Gil + 324780 + 5FyuvILiOEiMBR+x + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1106 + Tenho Sede + Gilberto Gil + 261616 + h4Lq2UQnbk/PokeR + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1107 + Refazenda + Gilberto Gil + 218305 + oAt+LqUBnJnMWCQCprPdzg== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1108 + Realce + Gilberto Gil + 264489 + NAQSjpTjRy8jwRAuFbln + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1109 + Esotérico + Gilberto Gil + 317779 + zkItyl5fHhWbuw== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1110 + Drão + Gilberto Gil + 301453 + xtaec5CBw21DfyYMKDf/ + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1111 + A Paz + Gilberto Gil + 293093 + P4tqt5+919dxsAOt1eb88g== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1112 + Beira Mar + Gilberto Gil + 295444 + uYBYhE5/rQ== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1113 + Sampa + Gilberto Gil + 225697 + SySrpzYFk1/c34kxA4oJ + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1114 + Parabolicamará + Gilberto Gil + 284943 + xgLgfRWXXII0M262pv3xC70= + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1115 + Tempo Rei + Gilberto Gil + 302733 + U5krMDqqcE75B3LB1S93Wr5Mnw== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1116 + Expresso 2222 + Gilberto Gil + 284760 + O7PHKXMDlty43u4= + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1117 + Aquele Abraço + Gilberto Gil + 263993 + dJ03b9OWxzYNxw== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1118 + Palco + Gilberto Gil + 270550 + VQ9yXT8+TD+kbI0qn9ECvDc= + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1119 + Toda Menina Baiana + Gilberto Gil + 278177 + k5UaGfRNOA== + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1120 + Sítio Do Pica-Pau Amarelo + Gilberto Gil + 218070 + B4YohGkidBVxGQClV55sn0kR + 0.9900000000000000000 + 73 + 1 + 7 + 1 + + + 1121 + Straight Out Of Line + Sully Erna + 259213 + c5ee0NmPInkyhA== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1122 + Faceless + Sully Erna + 216006 + GiUlRzbFFyA= + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1123 + Changes + Sully Erna; Tony Rombola + 260022 + a7WKX+i7kbz1KHrQ4g== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1124 + Make Me Believe + Sully Erna + 248607 + xF9ptk71RqhC + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1125 + I Stand Alone + Sully Erna + 246125 + Nf7bgA9np4goDnq9DT7o + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1126 + Re-Align + Sully Erna + 260884 + /mWECQlrN75g580PyCu8wnP5Kg== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1127 + I Fucking Hate You + Sully Erna + 247170 + 3xCtjYHyp9TsB1IrzTD24SQ4 + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1128 + Releasing The Demons + Sully Erna + 252760 + ysYdICiZmMD9UbdJFBT+Pu24 + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1129 + Dead And Broken + Sully Erna + 251454 + iBfEY9FYlQ== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1130 + I Am + Sully Erna + 239516 + QZc02p47cmAiwvCE9OgyqYM0vg== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1131 + The Awakening + Sully Erna + 89547 + F8/yCSkusG8FYw== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1132 + Serenity + Sully Erna; Tony Rombola + 274834 + x5L3VyjJdhkNoQ== + 0.9900000000000000000 + 88 + 1 + 3 + 1 + + + 1133 + American Idiot + Billie Joe Armstrong, Mike Dirnt, Tré Cool + 174419 + 23v8MwKf5Rs= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1134 + Jesus Of Suburbia / City Of The Damned / I Don't Care / Dearly Beloved / Tales Of Another Broken Home + Billie Joe Armstrong/Green Day + 548336 + nJpXinGlKrFviwNav3Up8vyRCg== + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1135 + Holiday + Billie Joe Armstrong, Mike Dirnt, Tré Cool + 232724 + DBqwnGP0dg31LA== + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1136 + Boulevard Of Broken Dreams + Mike Dint, Billie Joe, Tré Cool + 260858 + iumDry07beWCn8U= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1137 + Are We The Waiting + Green Day + 163004 + gp5ZHAbTQQUO2zw= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1138 + St. Jimmy + Green Day + 175307 + geq6J30uHLtCe3lwOw== + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1139 + Give Me Novacaine + Green Day + 205871 + /LaOrIc/R3At/gnY + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1140 + She's A Rebel + Green Day + 120528 + OrQmAq6tsC1CgUVoVIM= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1141 + Extraordinary Girl + Green Day + 214021 + Zwcl6OA/14t3YVP8 + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1142 + Letterbomb + Green Day + 246151 + Eby7HaW+4gc= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1143 + Wake Me Up When September Ends + Mike Dint, Billie Joe, Tré Cool + 285753 + eMrDipi5NElD + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1144 + Homecoming / The Death Of St. Jimmy / East 12th St. / Nobody Likes You / Rock And Roll Girlfriend / We're Coming Home Again + Mike Dirnt/Tré Cool + 558602 + vD0JJtkh9zFi + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1145 + Whatsername + Green Day + 252316 + r6BasCQchsYnwpU= + 0.9900000000000000000 + 89 + 1 + 4 + 1 + + + 1146 + Welcome to the Jungle + + 273552 + AkuOWyVWph5WLh4gQE4I + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1147 + It's So Easy + + 202824 + 4fyujX/dbNhvEmZ8Mm4= + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1148 + Nightrain + + 268537 + gJ0bO72Yfvs= + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1149 + Out Ta Get Me + + 263893 + ikTSgYI6cNYT8eQrFAghJN61 + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1150 + Mr. Brownstone + + 228924 + E+8p6+gNnYMkEkr9YwANAjoL6w== + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1151 + Paradise City + + 406347 + NKGQaECK9WyU+hff4g== + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1152 + My Michelle + + 219961 + 6LFgWOp05bZLw8nz + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1153 + Think About You + + 231640 + KgcG5hnyX7dxX8GrXhcw + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1154 + Sweet Child O' Mine + + 356424 + KvtrG9EYXKLi + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1155 + You're Crazy + + 197135 + d3F+VsyfTQ== + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1156 + Anything Goes + + 206400 + y2SOFP7sgtt3Up+t + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1157 + Rocket Queen + + 375349 + XLTHIche2K8Rq2ME+HvtOBuS + 0.9900000000000000000 + 90 + 2 + 1 + 1 + + + 1158 + Right Next Door to Hell + + 182321 + XVRLy2AV/H+Y9aEJAzSVGr23NA== + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1159 + Dust N' Bones + + 298374 + QXRZubkqEAZwlaJbvw== + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1160 + Live and Let Die + + 184016 + UDcR6GYLy94/uXA= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1161 + Don't Cry (Original) + + 284744 + YM9iYTCB5o3g6PqS + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1162 + Perfect Crime + + 143637 + NgX2DgNSRUmF5F4J + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1163 + You Ain't the First + + 156268 + UCk4YjWgSBg= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1164 + Bad Obsession + + 328282 + QKMPZCF1MpxnPH7VMAbU0Dw= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1165 + Back off Bitch + + 303436 + K1fa6wRXWzC8VH6zWkn6bMQ= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1166 + Double Talkin' Jive + + 203637 + /58xzxfpfSGK/yAjZJE= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1167 + November Rain + + 537540 + OR3A7lWetwnwuN0es+E128NB + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1168 + The Garden + + 322175 + 0Z01Wz/xbuPNXA== + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1169 + Garden of Eden + + 161539 + mfDsuiErOX1vtUeWQRY= + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1170 + Don't Damn Me + + 318901 + y8lAVSNc4uLA + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1171 + Bad Apples + + 268351 + BMGA/ee76qzfH+wx+MAJ + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1172 + Dead Horse + + 257600 + RtLLiQf0RQUmpKJ4OLO3DStf + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1173 + Coma + + 616511 + ariAh/pc6WH3TZnQf0uBFg8XNg== + 0.9900000000000000000 + 91 + 2 + 1 + 1 + + + 1174 + Civil War + Duff McKagan/Slash/W. Axl Rose + 461165 + EHx71kIYcnQrZ98FmQ== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1175 + 14 Years + Izzy Stradlin'/W. Axl Rose + 261355 + n+nFStEtHpJNuI3TIw== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1176 + Yesterdays + Billy/Del James/W. Axl Rose/West Arkeen + 196205 + tp2n9vUKDO09qkXh6nQ1 + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1177 + Knockin' On Heaven's Door + Bob Dylan + 336457 + bZQ33KyYUMVFCTZ9 + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1178 + Get In The Ring + Duff McKagan/Slash/W. Axl Rose + 341054 + wklv9UW9jsDoEI+WsasbBO9C + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1179 + Shotgun Blues + W. Axl Rose + 203206 + Xb5K+JxGgB1M4bHr1A== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1180 + Breakdown + W. Axl Rose + 424960 + vnpg1uyktqfOhIOnRfrtNQ== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1181 + Pretty Tied Up + Izzy Stradlin' + 287477 + VcaMH3B4UNKuxaBB3jckugby + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1182 + Locomotive + Slash/W. Axl Rose + 522396 + ui4DnvK278V09ACFMA== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1183 + So Fine + Duff McKagan + 246491 + IFwlR29OAhADPg== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1184 + Estranged + W. Axl Rose + 563800 + FmXwTV/sPgc= + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1185 + You Could Be Mine + Izzy Stradlin'/W. Axl Rose + 343875 + epJRKJppgbLb3a0/cCq+2/9zlw== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1186 + Don't Cry + Izzy Stradlin'/W. Axl Rose + 284238 + Laorxb/cUP94FQfCfnOcjgo= + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1187 + My World + W. Axl Rose + 84532 + rQXMUDQmkA== + 0.9900000000000000000 + 92 + 1 + 3 + 1 + + + 1188 + Colibri + Richard Bull + 361012 + pjsxcmB5p2KPz2eMaQ== + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1189 + Love Is The Colour + R. Carless + 251585 + GYI6xtXrwfyNL9ECxpHY + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1190 + Magnetic Ocean + Patrick Claher/Richard Bull + 321123 + dgQ0HzYVzQa0jhob5A== + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1191 + Deep Waters + Richard Bull + 396460 + J32U7+xKFm5Qpd6prQKgXrIW + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1192 + L'Arc En Ciel De Miles + Kevin Robinson/Richard Bull + 242390 + sVliWEmHA7QzEUfRphjA + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1193 + Gypsy + Kevin Robinson + 330997 + U27XpI3HBw== + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1194 + Journey Into Sunlight + Jean Paul Maunick + 249756 + j0GMZ8tlVtsDkDJzxQ== + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1195 + Sunchild + Graham Harvey + 259970 + SmfoleJcCdQ3kOz6TfDb + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1196 + Millenium + Maxton Gig Beesley Jnr. + 379167 + /OpRrcgH+pzpzrtrzRXmTUIt + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1197 + Thinking 'Bout Tomorrow + Fayyaz Virgi/Richard Bull + 355395 + b7z45Kuruwn7ew== + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1198 + Jacob's Ladder + Julian Crampton + 367647 + F2UAkZNHIRdcQ21MqxSgngY= + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1199 + She Wears Black + G Harvey/R Hope-Taylor + 528666 + qp63H81stQQ= + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1200 + Dark Side Of The Cog + Jean Paul Maunick + 377155 + pgIN/f4gGbZVajuCniw= + 0.9900000000000000000 + 93 + 1 + 2 + 1 + + + 1201 + Different World + + 258692 + 0OACb0zQCgy051HcGfeYkw== + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1202 + These Colours Don't Run + + 412152 + jkJ6FU9FbiuSXUszyqALcoxP + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1203 + Brighter Than a Thousand Suns + + 526255 + aka4NJv1WBU= + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1204 + The Pilgrim + + 307593 + RP++vddg81yx + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1205 + The Longest Day + + 467810 + gZqUQ7lzv9nqR0Vp + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1206 + Out of the Shadows + + 336896 + qKspldYN3h8= + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1207 + The Reincarnation of Benjamin Breeg + + 442106 + L8Dmkp6NXGqsrw== + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1208 + For the Greater Good of God + + 564893 + d81S1gL+wdwcbs5n2nM= + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1209 + Lord of Light + + 444614 + Eq3KHE7S9Ytq01wm1DF8f5qWqQ== + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1210 + The Legacy + + 562966 + 21hSk9dMAgOHYVkMH4g= + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1211 + Hallowed Be Thy Name (Live) (Non Album Bonus Track) + + 431262 + rqCQYe2BQec= + 0.9900000000000000000 + 94 + 2 + 1 + 1 + + + 1212 + The Number Of The Beast + Steve Harris + 294635 + pdfsqp/uM9Ax + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1213 + The Trooper + Steve Harris + 235311 + OrlaNkUC0PID + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1214 + Prowler + Steve Harris + 255634 + eVAHTLbO3wo0u5KZ + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1215 + Transylvania + Steve Harris + 265874 + T+7/X1djmC4= + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1216 + Remember Tomorrow + Paul Di'Anno/Steve Harris + 352731 + 2r9OwVRpS14djj7eiVTQ + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1217 + Where Eagles Dare + Steve Harris + 289358 + 89EOKJx2zKBICkhFoniPag== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1218 + Sanctuary + David Murray/Paul Di'Anno/Steve Harris + 293250 + 8HZH/fV5dr/Wng== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1219 + Running Free + Paul Di'Anno/Steve Harris + 228937 + W5LGmS++ZJKKBexk8614SSAFuw== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1220 + Run To The Hilss + Steve Harris + 237557 + /9MCmN6Iov5XmGk= + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1221 + 2 Minutes To Midnight + Adrian Smith/Bruce Dickinson + 337423 + 18hFtUSuFeQU/ODVBBFUUHwwVQ== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1222 + Iron Maiden + Steve Harris + 324623 + GvoEiI8tu6cbZjrxmw== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1223 + Hallowed Be Thy Name + Steve Harris + 471849 + jCtnwwRy8NePAvItlMwzUg== + 0.9900000000000000000 + 95 + 1 + 3 + 1 + + + 1224 + Be Quick Or Be Dead + Bruce Dickinson/Janick Gers + 196911 + J0Kvq93EvSUX8m3IrsLuOQ== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1225 + From Here To Eternity + Steve Harris + 259866 + hSjouSzjyUJqAZVi + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1226 + Can I Play With Madness + Adrian Smith/Bruce Dickinson/Steve Harris + 282488 + 73PJ5BOv7HqvZ6qd7A== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1227 + Wasting Love + Bruce Dickinson/Janick Gers + 347846 + gg/hQAPzt0cKacj6Xw== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1228 + Tailgunner + Bruce Dickinson/Steve Harris + 249469 + aXLDJ8J/A/r/ya4/TWLVwQ== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1229 + The Evil That Men Do + Adrian Smith/Bruce Dickinson/Steve Harris + 325929 + Gz9jRjOIwA== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1230 + Afraid To Shoot Strangers + Steve Harris + 407980 + b+GoaV8bGE8= + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1231 + Bring Your Daughter... To The Slaughter + Bruce Dickinson + 317727 + ETykg9ptfIgQFw== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1232 + Heaven Can Wait + Steve Harris + 448574 + w6VUcUgrrLv7oDXqApVT + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1233 + The Clairvoyant + Steve Harris + 269871 + WpCfrpbvSA== + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1234 + Fear Of The Dark + Steve Harris + 431333 + mB26QNHnviNwLs7KjDYgNG9d + 0.9900000000000000000 + 96 + 1 + 3 + 1 + + + 1235 + The Wicker Man + Adrian Smith/Bruce Dickinson/Steve Harris + 275539 + ZdtSoe2HzyH3cGn7 + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1236 + Ghost Of The Navigator + Bruce Dickinson/Janick Gers/Steve Harris + 410070 + XAPZK3Br6RPhEnnTxogRI3A= + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1237 + Brave New World + Bruce Dickinson/David Murray/Steve Harris + 378984 + Pzmb43VGfM25AsXGsgYz+m2IXQ== + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1238 + Blood Brothers + Steve Harris + 434442 + wwNzQIPJ2M0m/73+hgUqwjh5 + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1239 + The Mercenary + Janick Gers/Steve Harris + 282488 + kq+jsuZOGmByoMwaiMV7pw== + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1240 + Dream Of Mirrors + Janick Gers/Steve Harris + 561162 + xVtfrG2uprpEx0Cs3HHC9Pk= + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1241 + The Fallen Angel + Adrian Smith/Steve Harris + 240718 + RSBQjfFoaGUtWuQ0OApe7v3dGQ== + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1242 + The Nomad + David Murray/Steve Harris + 546115 + JAD9+KKH2rOWLwkmj/o= + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1243 + Out Of The Silent Planet + Bruce Dickinson/Janick Gers/Steve Harris + 385541 + h+s4afdDCIBL + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1244 + The Thin Line Between Love & Hate + David Murray/Steve Harris + 506801 + D441Tu1z5doXpkUiWOpqjbU= + 0.9900000000000000000 + 97 + 1 + 1 + 1 + + + 1245 + Wildest Dreams + Adrian Smith/Steve Harris + 232777 + /lC9pT3U1wPFcw== + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1246 + Rainmaker + Bruce Dickinson/David Murray/Steve Harris + 228623 + nxx/sSKS+KVlqbsk + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1247 + No More Lies + Steve Harris + 441782 + d1TxZJJN/mmNOIL7F2lQ + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1248 + Montsegur + Bruce Dickinson/Janick Gers/Steve Harris + 350484 + dumucbh3icVxNVdx6FAmQys= + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1249 + Dance Of Death + Janick Gers/Steve Harris + 516649 + LujjcnF3dbkR4w== + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1250 + Gates Of Tomorrow + Bruce Dickinson/Janick Gers/Steve Harris + 312032 + tgopp0Tuvwyzk//LLPNd + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1251 + New Frontier + Adrian Smith/Bruce Dickinson/Nicko McBrain + 304509 + jIA9Ej7PpTtnfQM= + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1252 + Paschendale + Adrian Smith/Steve Harris + 508107 + Nvz/ZqXHuysuyqNh + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1253 + Face In The Sand + Adrian Smith/Bruce Dickinson/Steve Harris + 391105 + NnjfLh23fxSC6DjU0Q== + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1254 + Age Of Innocence + David Murray/Steve Harris + 370468 + 5mXtP8fqR9W2k5kmZDcyxg== + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1255 + Journeyman + Bruce Dickinson/David Murray/Steve Harris + 427023 + 3dusCFbGDUrGg2S0Ew== + 0.9900000000000000000 + 98 + 1 + 13 + 1 + + + 1256 + Be Quick Or Be Dead + Bruce Dickinson/Janick Gers + 204512 + ktQI1MVBitw= + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1257 + From Here To Eternity + Steve Harris + 218357 + H2HBS5X3UkjiuyVb + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1258 + Afraid To Shoot Strangers + Steve Harris + 416496 + JLaPnuD1AWbiIaPMB1JbYw== + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1259 + Fear Is The Key + Bruce Dickinson/Janick Gers + 335307 + hTgAZI2nlQ== + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1260 + Childhood's End + Steve Harris + 280607 + eFNzO4L47WyZr1JEJw== + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1261 + Wasting Love + Bruce Dickinson/Janick Gers + 350981 + ldsQPD8efo2l9uR2Nu1alJcP + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1262 + The Fugitive + Steve Harris + 294112 + ImiijSpgKLVgbaIJH0QkoyRT + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1263 + Chains Of Misery + Bruce Dickinson/David Murray + 217443 + Z3b96q18VwzB/xEEF0JJBA== + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1264 + The Apparition + Janick Gers/Steve Harris + 234605 + 8k3m2xdpHR8C7cQx + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1265 + Judas Be My Guide + Bruce Dickinson/David Murray + 188786 + SjVBR6iEJX70EdNUZ7VPaYs= + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1266 + Weekend Warrior + Janick Gers/Steve Harris + 339748 + 1UArsNdtdVAN4Mqrj5LarrU= + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1267 + Fear Of The Dark + Steve Harris + 436976 + w9Caxd56/jwTh7CzzbY= + 0.9900000000000000000 + 99 + 1 + 1 + 1 + + + 1268 + 01 - Prowler + Steve Harris + 236173 + Ju7x55pe1NJYd0WzSIJAebgAcw== + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1269 + 02 - Sanctuary + David Murray/Paul Di'Anno/Steve Harris + 196284 + uywQYbGxmlntn1kSFDRoo+nHGg== + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1270 + 03 - Remember Tomorrow + Harris/Paul Di´Anno + 328620 + 7v5CTpnGtbnSDfezWRC7+t6P + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1271 + 04 - Running Free + Harris/Paul Di´Anno + 197276 + 6MN65LgdM58UGZyP8OX3 + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1272 + 05 - Phantom of the Opera + Steve Harris + 428016 + vOnCyOr74Yc= + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1273 + 06 - Transylvania + Steve Harris + 259343 + qKW4A3huxVmSMrl0GYowZSc= + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1274 + 07 - Strange World + Steve Harris + 332460 + nzV9B85iWf4QG8dL7OLzBBB3 + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1275 + 08 - Charlotte the Harlot + Murray Dave + 252708 + m5ur1zZesj1C + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1276 + 09 - Iron Maiden + Steve Harris + 216058 + X5Jiw1lBUWE= + 0.9900000000000000000 + 100 + 1 + 6 + 1 + + + 1277 + The Ides Of March + Steve Harris + 105926 + 11WqeV2qkUc= + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1278 + Wrathchild + Steve Harris + 174471 + 1oEVernqiwb0Xg== + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1279 + Murders In The Rue Morgue + Steve Harris + 258377 + qBslFluxiWWHk6Ghom6g + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1280 + Another Life + Steve Harris + 203049 + 8SFOLKQXbWfBjeTYdzdTTfIa + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1281 + Genghis Khan + Steve Harris + 187141 + uzCTHqshLL+yNd9yCxnE + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1282 + Innocent Exile + Di´Anno/Harris + 232515 + 5aUxo5CtvVXNzLDtTz8= + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1283 + Killers + Steve Harris + 300956 + r4h25PVeA6ILd1i7MuEb2Q== + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1284 + Prodigal Son + Steve Harris + 372349 + s55up8B2Zw5yPVDecD5vcuEw + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1285 + Purgatory + Steve Harris + 200150 + lTXPO+ECJis= + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1286 + Drifter + Steve Harris + 288757 + 8ot0svPwOrHRrO4RDtaCIA== + 0.9900000000000000000 + 101 + 1 + 13 + 1 + + + 1287 + Intro- Churchill S Speech + + 48013 + w5o46ElQsDFEiuM= + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1288 + Aces High + + 276375 + jKSaSy4b58md + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1289 + 2 Minutes To Midnight + Smith/Dickinson + 366550 + gAS+oDVC2IZfTBouPos= + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1290 + The Trooper + Harris + 268878 + UKg7xIGuZVZORAdUxt8= + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1291 + Revelations + Dickinson + 371826 + m1cV2Bo0Kaga + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1292 + Flight Of Icarus + Smith/Dickinson + 229982 + WL0rl0heZQ9Y3nKrBBs8Gq1w + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1293 + Rime Of The Ancient Mariner + + 789472 + Lu4Sp6SwwhhmcL0mACBWKPE= + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1294 + Powerslave + + 454974 + vgXmoUVtAEfvUvqb/4a5TA== + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1295 + The Number Of The Beast + Harris + 275121 + f0YWh+eGRf+emg== + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1296 + Hallowed Be Thy Name + Harris + 451422 + couu8kvh7mt1 + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1297 + Iron Maiden + Harris + 261955 + qaWmXcBvHspxNw== + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1298 + Run To The Hills + Harris + 231627 + szTW4tqy136goabSSNRkpAc= + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1299 + Running Free + Harris/Di Anno + 204617 + HpdO117WoXApJhY= + 0.9900000000000000000 + 102 + 1 + 3 + 1 + + + 1300 + Wrathchild + Steve Harris + 183666 + NCxjS75X2BBwLhfs1OsC + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1301 + Acacia Avenue + + 379872 + XYhbyxZ6Up8e29UAQWqJ + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1302 + Children Of The Damned + Steve Harris + 278177 + Z3lteW79FQ3M99/vgGEDc9POEg== + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1303 + Die With Your Boots On + Adrian Smith/Bruce Dickinson/Steve Harris + 314174 + yksQudnELOKB184GpWaEW30= + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1304 + Phantom Of The Opera + Steve Harris + 441155 + Y2ByTv8fm2MevNhhLXJX + 0.9900000000000000000 + 102 + 1 + 13 + 1 + + + 1305 + Be Quick Or Be Dead + + 233142 + 5hxos6Cq0DKL9CjY + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1306 + The Number Of The Beast + + 294008 + Gt2o9kpqsi18S/Aedg== + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1307 + Wrathchild + + 174106 + cAogqluvvH9o + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1308 + From Here To Eternity + + 284447 + yei5jz/DCvfCGAPfMGvi + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1309 + Can I Play With Madness + + 213106 + pLpq0HeVKQRg + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1310 + Wasting Love + + 336953 + a0rMKY2adbUsYrAj7rk= + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1311 + Tailgunner + + 247640 + +FxeopHZtMhTCg== + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1312 + The Evil That Men Do + + 478145 + FZd6NL+1LxdXwCs= + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1313 + Afraid To Shoot Strangers + + 412525 + i2hqez9/V4HMsY9/OMth + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1314 + Fear Of The Dark + + 431542 + TraCeB6LhQ== + 0.9900000000000000000 + 103 + 1 + 1 + 1 + + + 1315 + Bring Your Daughter... To The Slaughter... + + 376711 + Ovej+/PWYYDNw9I= + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1316 + The Clairvoyant + + 262426 + Jl51SPyJNWQI+/zzVGDIoT6zeg== + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1317 + Heaven Can Wait + + 440555 + 44xAR9xbjfVPDrF0+Ceo70A= + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1318 + Run To The Hills + + 235859 + e5RVINQ++6+mkw2/QhlJ + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1319 + 2 Minutes To Midnight + Adrian Smith/Bruce Dickinson + 338233 + VpkeLWug+0AU + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1320 + Iron Maiden + + 494602 + SYf7LLjYYAQ= + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1321 + Hallowed Be Thy Name + + 447791 + 5arCuAFMLbX655DL + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1322 + The Trooper + + 232672 + KiXQDtETzQ== + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1323 + Sanctuary + + 318511 + mBUM2vV0s3naNQ== + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1324 + Running Free + + 474017 + PeJkKJPhHOE+6w== + 0.9900000000000000000 + 104 + 1 + 1 + 1 + + + 1325 + Tailgunner + Bruce Dickinson/Steve Harris + 255582 + WIQusVzWXKkHTQ== + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1326 + Holy Smoke + Bruce Dickinson/Steve Harris + 229459 + XEyVtt0M2Hk7H7IwjbXG/A== + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1327 + No Prayer For The Dying + Steve Harris + 263941 + LbQxj++XvYes + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1328 + Public Enema Number One + Bruce Dickinson/David Murray + 254197 + F90dMS4RB4YYk9wEEAk= + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1329 + Fates Warning + David Murray/Steve Harris + 250853 + sOGlU6D8ltk= + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1330 + The Assassin + Steve Harris + 258768 + fFIbp2y01y8xyMCbHe6EHoYv + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1331 + Run Silent Run Deep + Bruce Dickinson/Steve Harris + 275408 + aGAopCjKP7YXNAs= + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1332 + Hooks In You + Adrian Smith/Bruce Dickinson + 247510 + gQP+tNz2Xxpju63T + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1333 + Bring Your Daughter... ...To The Slaughter + Bruce Dickinson + 284238 + SCmT8iE0Gcw= + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1334 + Mother Russia + Steve Harris + 332617 + cb5TrvPdLP7A+yWBP5geOQ== + 0.9900000000000000000 + 105 + 1 + 3 + 1 + + + 1335 + Where Eagles Dare + Steve Harris + 369554 + KCYVS6yyVVvfoA== + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1336 + Revelations + Bruce Dickinson + 408607 + w/b/8XqZkkBhLQKC + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1337 + Flight Of The Icarus + Adrian Smith/Bruce Dickinson + 230269 + ZPuyrcYJkXQ= + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1338 + Die With Your Boots On + Adrian Smith/Bruce Dickinson/Steve Harris + 325694 + eQvyt5zEDP5SEw== + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1339 + The Trooper + Steve Harris + 251454 + gDvJ+zMGpQbd2Hol + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1340 + Still Life + David Murray/Steve Harris + 294347 + KOax/6eU1g83CX3z/g== + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1341 + Quest For Fire + Steve Harris + 221309 + /c00Y9vuRmwoMbZ6wGSKluD+5g== + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1342 + Sun And Steel + Adrian Smith/Bruce Dickinson + 206367 + j7UTDFa9PSxIMUwINA== + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1343 + To Tame A Land + Steve Harris + 445283 + qDipdZ42Xru+f0kt1HGE + 0.9900000000000000000 + 106 + 1 + 3 + 1 + + + 1344 + Aces High + Harris + 269531 + KX4NsDNHuSgMHrEZI/fl + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1345 + 2 Minutes To Midnight + Smith/Dickinson + 359810 + RXy8Uu1rYK/w1PeU + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1346 + Losfer Words + Steve Harris + 252891 + KOjLp6gIzfs= + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1347 + Flash of The Blade + Dickinson + 242729 + EGB+gWiAhQ== + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1348 + Duelists + Steve Harris + 366471 + l8eamudXtTKzvh5ewF9QJWXk + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1349 + Back in the Village + Dickinson/Smith + 320548 + 5XF77hezwWxb02sC3yk= + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1350 + Powerslave + Dickinson + 407823 + PDD6KECQFnT0Sg== + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1351 + Rime of the Ancient Mariner + Harris + 816509 + nMOwEFkchEqg + 0.9900000000000000000 + 107 + 1 + 3 + 1 + + + 1352 + Intro + + 115931 + HNiC5yXrWl9Huz41FSIfKzyjpA== + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1353 + The Wicker Man + Adrian Smith/Bruce Dickinson/Steve Harris + 281782 + /IakaBb+u0t6T36UiNggWHdB + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1354 + Ghost Of The Navigator + Bruce Dickinson/Janick Gers/Steve Harris + 408607 + pbwVrY5wZ66O + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1355 + Brave New World + Bruce Dickinson/David Murray/Steve Harris + 366785 + Lt/gptHWlTMa0CcvDuX3Pao= + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1356 + Wrathchild + Steve Harris + 185808 + PALHs/uI/hLn2RX3rk8t + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1357 + 2 Minutes To Midnight + Adrian Smith/Bruce Dickinson + 386821 + S2+d7rYCiiRdcPM= + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1358 + Blood Brothers + Steve Harris + 435513 + rTC1Uca7cYspeuRYp77uvB4i + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1359 + Sign Of The Cross + Steve Harris + 649116 + 1wK0mYifu/U6d6JWi5SJZbYjxA== + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1360 + The Mercenary + Janick Gers/Steve Harris + 282697 + 892iMNGLREf3E84GOk4bcw== + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1361 + The Trooper + Steve Harris + 273528 + ly2yC8U3E4YjWcQdWQ== + 0.9900000000000000000 + 108 + 1 + 3 + 1 + + + 1362 + Dream Of Mirrors + Janick Gers/Steve Harris + 578324 + mFnwLvpgg8f9WnP+ + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1363 + The Clansman + Steve Harris + 559203 + qJwcPHkVbR/2EiY= + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1364 + The Evil That Men Do + Adrian Smith/Bruce Dickinson/Steve Harris + 280737 + po6qrTKAKZ7aNqxJICETdA== + 0.9900000000000000000 + 109 + 1 + 3 + 1 + + + 1365 + Fear Of The Dark + Steve Harris + 460695 + MFeXxg9q6QccSwg= + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1366 + Iron Maiden + Steve Harris + 351869 + GaJHyv9T0dk= + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1367 + The Number Of The Beast + Steve Harris + 300434 + y9lJX0xy8NIcVwL4 + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1368 + Hallowed Be Thy Name + Steve Harris + 443977 + xrqPZ5YjwKUVNSGywZNkfyA= + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1369 + Sanctuary + David Murray/Paul Di'Anno/Steve Harris + 317335 + QZu0ZX1NZ8P4+Q== + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1370 + Run To The Hills + Steve Harris + 292179 + //MG88nbjTuXvK4YdLWjKK0= + 0.9900000000000000000 + 109 + 1 + 1 + 1 + + + 1371 + Moonchild + Adrian Smith; Bruce Dickinson + 340767 + 3otT/InAXJphPEEA0yvGcRZC + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1372 + Infinite Dreams + Steve Harris + 369005 + vvi310SJEZOCQK/ZJbk4GW7h + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1373 + Can I Play With Madness + Adrian Smith; Bruce Dickinson; Steve Harris + 211043 + akWWLnpQ+Zbogw== + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1374 + The Evil That Men Do + Adrian Smith; Bruce Dickinson; Steve Harris + 273998 + A55hDe6SJg== + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1375 + Seventh Son of a Seventh Son + Steve Harris + 593580 + D3J3LdpasQ== + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1376 + The Prophecy + Dave Murray; Steve Harris + 305475 + HEebEliPEw== + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1377 + The Clairvoyant + Adrian Smith; Bruce Dickinson; Steve Harris + 267023 + 1CfJPYZK8ikQMD0RdxfKpfI= + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1378 + Only the Good Die Young + Bruce Dickinson; Harris + 280894 + 0ZDzGLzUye3dT01w + 0.9900000000000000000 + 110 + 1 + 3 + 1 + + + 1379 + Caught Somewhere in Time + Steve Harris + 445779 + c4uJOMfI6S3FgE0dqRyf6w== + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1380 + Wasted Years + Adrian Smith + 307565 + fPUfnb6C5Lxr9XM= + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1381 + Sea of Madness + Adrian Smith + 341995 + bKPbnzbKhu7e + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1382 + Heaven Can Wait + Steve Harris + 441417 + 3AiNDBCl+xO3KQLZ + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1383 + Stranger in a Strange Land + Adrian Smith + 344502 + WFFbtQilfFvT + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1384 + Alexander the Great + Steve Harris + 515631 + lFjccn5yUhn8JXkYFxCx + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1385 + De Ja Vu + David Murray/Steve Harris + 296176 + P8FYPkqWk9GD + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1386 + The Loneliness of the Long Dis + Steve Harris + 391314 + 2xR9SGKnCZP5tDQzfKBkDwWzWA== + 0.9900000000000000000 + 111 + 1 + 3 + 1 + + + 1387 + 22 Acacia Avenue + Adrian Smith/Steve Harris + 395572 + OUsDlma7A5Ur/cUK7jA= + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1388 + Children of the Damned + Steve Harris + 274364 + Ppy0wtEPhBf9PgxE + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1389 + Gangland + Adrian Smith/Clive Burr/Steve Harris + 228440 + 2TuR33hEFI8R5+KnpHRn + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1390 + Hallowed Be Thy Name + Steve Harris + 428669 + 7ilETAkmclHxhjC1MwZYWQ== + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1391 + Invaders + Steve Harris + 203180 + S7vvbOWSqhwH + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1392 + Run to the Hills + Steve Harris + 228884 + tdEbLZocGw4Ux/eus8g/7vETXg== + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1393 + The Number Of The Beast + Steve Harris + 293407 + Co6IMFi4d48JlpowAfm9 + 0.9900000000000000000 + 112 + 1 + 1 + 1 + + + 1394 + The Prisoner + Adrian Smith/Steve Harris + 361299 + 1VmVmRj4Q5J/nQcnLA== + 0.9900000000000000000 + 112 + 1 + 3 + 1 + + + 1395 + Sign Of The Cross + Steve Harris + 678008 + oJa9rCImSOvU4qSMBX0txg== + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1396 + Lord Of The Flies + Janick Gers/Steve Harris + 303699 + ugvAGJh+xA== + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1397 + Man On The Edge + Blaze Bayley/Janick Gers + 253413 + Ekv2sLuxUGIR9gM= + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1398 + Fortunes Of War + Steve Harris + 443977 + VdeWNumEs/WM88VkuPBNHGw= + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1399 + Look For The Truth + Blaze Bayley/Janick Gers/Steve Harris + 310230 + Bxj4aA/bUjsZMVMp84cpVFfj + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1400 + The Aftermath + Blaze Bayley/Janick Gers/Steve Harris + 380786 + iS4Uys+3H4WS98pjM/Yy + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1401 + Judgement Of Heaven + Steve Harris + 312476 + 63nsx7rkrg== + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1402 + Blood On The World's Hands + Steve Harris + 357799 + gqFi/z47ZJhpp+Kw800psQ== + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1403 + The Edge Of Darkness + Blaze Bayley/Janick Gers/Steve Harris + 399333 + Vb9DTs0gMsGYPtpr + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1404 + 2 A.M. + Blaze Bayley/Janick Gers/Steve Harris + 337658 + uaSAqUguVCBH + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1405 + The Unbeliever + Janick Gers/Steve Harris + 490422 + kjL5ixSC+51QOtZkJGobtIA= + 0.9900000000000000000 + 113 + 1 + 1 + 1 + + + 1406 + Futureal + Blaze Bayley/Steve Harris + 175777 + Pab8iixN7j0vSgX6XNAOabEc + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1407 + The Angel And The Gambler + Steve Harris + 592744 + lB4/nKCJMEVVgBWNk60k4g== + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1408 + Lightning Strikes Twice + David Murray/Steve Harris + 290377 + WQcFq53WUrCYVg== + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1409 + The Clansman + Steve Harris + 539689 + Bla7uf/h7BH+CVwB+wiYvRq8 + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1410 + When Two Worlds Collide + Blaze Bayley/David Murray/Steve Harris + 377312 + TDftbQ+pFif2SOw= + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1411 + The Educated Fool + Steve Harris + 404767 + CDJTPv7EWw== + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1412 + Don't Look To The Eyes Of A Stranger + Steve Harris + 483657 + ssET5Jj9BgmjBBk4 + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1413 + Como Estais Amigos + Blaze Bayley/Janick Gers + 330292 + JwmlGeisEA== + 0.9900000000000000000 + 114 + 1 + 1 + 1 + + + 1414 + Please Please Please + James Brown/Johnny Terry + 165067 + ufXJEh1Tz6jJmQ== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1415 + Think + Lowman Pauling + 166739 + vi6+iyQJ1RGjDYTx + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1416 + Night Train + Jimmy Forrest/Lewis C. Simpkins/Oscar Washington + 212401 + tPfhKK0lFhhLpvnLStJ6qjc= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1417 + Out Of Sight + Ted Wright + 143725 + 2WsgecVofoEPE5ts2zQDml0lcg== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1418 + Papa's Got A Brand New Bag Pt.1 + James Brown + 127399 + +6OD33OIxb8= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1419 + I Got You (I Feel Good) + James Brown + 167392 + N1pnbKyqhg07MniqKxUCfd4= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1420 + It's A Man's Man's Man's World + Betty Newsome/James Brown + 168228 + xMiwdFU3kWU250AFPaO+p9i5Mw== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1421 + Cold Sweat + Alfred Ellis/James Brown + 172408 + L4p8jCLy+fvQjYFilL0A9ynC + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1422 + Say It Loud, I'm Black And I'm Proud Pt.1 + Alfred Ellis/James Brown + 167392 + L9pGdJ/NNfXV7IM9SUndmzo= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1423 + Get Up (I Feel Like Being A) Sex Machine + Bobby Byrd/James Brown/Ron Lenhoff + 316551 + I1JiPZWVqGXecH8= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1424 + Hey America + Addie William Jones/Nat Jones + 218226 + xn4VtAQl6Bbdv+z9JA5MUDgY + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1425 + Make It Funky Pt.1 + Charles Bobbitt/James Brown + 196231 + IcasBXCh8UWxzA== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1426 + I'm A Greedy Man Pt.1 + Charles Bobbitt/James Brown + 217730 + 7sV1MiUFJ5RFt7MjbmRlZRk= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1427 + Get On The Good Foot + Fred Wesley/James Brown/Joseph Mims + 215902 + SFctxble3Bp4pBIS4DZKo9A= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1428 + Get Up Offa That Thing + Deanna Brown/Deidra Jenkins/Yamma Brown + 250723 + iPLpRiij0/9toj6h + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1429 + It's Too Funky In Here + Brad Shapiro/George Jackson/Robert Miller/Walter Shaw + 239072 + PNi+aXQMKQsXVguNgoEy133Z + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1430 + Living In America + Charlie Midnight/Dan Hartman + 282880 + lD7cJ50BLok= + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1431 + I'm Real + Full Force/James Brown + 334236 + ufA53NaZ1TkizQ== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1432 + Hot Pants Pt.1 + Fred Wesley/James Brown + 188212 + lqcbcZzduQ== + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1433 + Soul Power (Live) + James Brown + 260728 + IaAo8MlyDcxfsSBnRYI2 + 0.9900000000000000000 + 115 + 1 + 14 + 1 + + + 1434 + When You Gonna Learn (Digeridoo) + Jay Kay/Kay, Jay + 230635 + Jhwvtums+bSwAzTsImuLvw== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1435 + Too Young To Die + Smith, Toby + 365818 + iWdRkQBvacnNdYgBZZATcMpKfw== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1436 + Hooked Up + Smith, Toby + 275879 + A7x1p3NAxj4gqvQmYA== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1437 + If I Like It, I Do It + Gelder, Nick van + 293093 + vBvlwCasxewbNnCzS3IgfFgh + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1438 + Music Of The Wind + Smith, Toby + 383033 + EUTM8aodv6kqqSOBYg== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1439 + Emergency On Planet Earth + Smith, Toby + 245263 + RdT4iwkk0ugWoT82wPVTHg== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1440 + Whatever It Is, I Just Can't Stop + Jay Kay/Kay, Jay + 247222 + UdMaT9vvKTqiZgOaQw== + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1441 + Blow Your Mind + Smith, Toby + 512339 + tQ4SBZ4n8E78OCg= + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1442 + Revolution 1993 + Smith, Toby + 616829 + K7JzXMpVDAQ= + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1443 + Didgin' Out + Buchanan, Wallis + 157100 + rkdRauTPUGe9z03T + 0.9900000000000000000 + 116 + 1 + 1 + 1 + + + 1444 + Canned Heat + Jay Kay + 331964 + iiiu77X2tAPW4iatw3fH + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1445 + Planet Home + Jay Kay/Toby Smith + 284447 + m62OPiYGx8GbuVif5z9p2lo= + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1446 + Black Capricorn Day + Jay Kay + 341629 + KEqu258WUA== + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1447 + Soul Education + Jay Kay/Toby Smith + 255477 + 12UqvSFYiQ== + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1448 + Failling + Jay Kay/Toby Smith + 225227 + ISG/lIGDYexT/J0= + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1449 + Destitute Illusions + Derrick McKenzie/Jay Kay/Toby Smith + 340218 + HJZ5S1JAT3yWwA137Q== + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1450 + Supersonic + Jay Kay + 315872 + L2GW3pgAFsYdRxvGAaTpwYijeA== + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1451 + Butterfly + Jay Kay/Toby Smith + 268852 + sUDr3mrgCQw= + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1452 + Were Do We Go From Here + Jay Kay + 313626 + YRRHpihU/1Z0ZJ0= + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1453 + King For A Day + Jay Kay/Toby Smith + 221544 + VnkyMIs/qpPVN2r/ + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1454 + Deeper Underground + Toby Smith + 281808 + pu52uHO39wk7vDPTH9hQ6WsU + 0.9900000000000000000 + 117 + 1 + 14 + 1 + + + 1455 + Just Another Story + Toby Smith + 529684 + 2j1bx7mu36BeebUpqkc= + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1456 + Stillness In Time + Toby Smith + 257097 + gWWJnQCspfUavP9cbGZZqWk= + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1457 + Half The Man + Toby Smith + 289854 + KiR0Sya8CpQXmI+Gk4mL + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1458 + Light Years + Toby Smith + 354560 + VupgzROTNUhBC7pRcjkFz0sF + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1459 + Manifest Destiny + Toby Smith + 382197 + I4A2P8yTa5QNZZMp + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1460 + The Kids + Toby Smith + 309995 + 0EEQbkmbEA== + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1461 + Mr. Moon + Stuard Zender/Toby Smith + 329534 + 7ysJGwG4Id2T + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1462 + Scam + Stuart Zender + 422321 + Oo0JaKogqw== + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1463 + Journey To Arnhemland + Toby Smith/Wallis Buchanan + 322455 + Oqf+J+Ot4kSAMSk= + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1464 + Morning Glory + J. Kay/Jay Kay + 384130 + hrD16DNVLQ== + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1465 + Space Cowboy + J. Kay/Jay Kay + 385697 + y9pJt3mlWZxsaJfww7Zh + 0.9900000000000000000 + 118 + 1 + 15 + 1 + + + 1466 + Last Chance + C. Cester/C. Muncey + 112352 + mMdIWzm9OPCz/Tk= + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1467 + Are You Gonna Be My Girl + C. Muncey/N. Cester + 213890 + lyE1VfKIyF9dRq49VEbYGJo50g== + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1468 + Rollover D.J. + C. Cester/N. Cester + 196702 + T41PawzR6g2i + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1469 + Look What You've Done + N. Cester + 230974 + BHtrzwRLM0L9O+0CClI= + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1470 + Get What You Need + C. Cester/C. Muncey/N. Cester + 247719 + Cgfz5SBVeSpp + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1471 + Move On + C. Cester/N. Cester + 260623 + CtHJSCGdurwEQjLShEGM5Vg= + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1472 + Radio Song + C. Cester/C. Muncey/N. Cester + 272117 + l+JMgv1SAsn3KIIDilAB + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1473 + Get Me Outta Here + C. Cester/N. Cester + 176274 + +nlp+dudM0UGD+Y3grE= + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1474 + Cold Hard Bitch + C. Cester/C. Muncey/N. Cester + 243278 + O/09kofth9R2RQ== + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1475 + Come Around Again + C. Muncey/N. Cester + 270497 + ppE6ALjh0PBHE3teYfquB3zt + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1476 + Take It Or Leave It + C. Muncey/N. Cester + 142889 + ykZF0EYGTb56pg== + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1477 + Lazy Gun + C. Cester/N. Cester + 282174 + pPK0g/ahCg== + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1478 + Timothy + C. Cester + 270341 + VwRnkmpEv57bmNjmCuY= + 0.9900000000000000000 + 119 + 1 + 4 + 1 + + + 1479 + Foxy Lady + Jimi Hendrix + 199340 + ehFgwfT6aiNVSdRuiKo= + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1480 + Manic Depression + Jimi Hendrix + 222302 + Aw39d5ZnY7Tbi4dn + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1481 + Red House + Jimi Hendrix + 224130 + JaLAaL7oOXKW4BYL + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1482 + Can You See Me + Jimi Hendrix + 153077 + 4BFJltU29P6UyuiTUKIX + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1483 + Love Or Confusion + Jimi Hendrix + 193123 + hTVskvn9sog= + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1484 + I Don't Live Today + Jimi Hendrix + 235311 + sKBwam0s52uphlFqRbZQcw== + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1485 + May This Be Love + Jimi Hendrix + 191216 + kdfX1W1FIRURqql58+JfwCok + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1486 + Fire + Jimi Hendrix + 164989 + g5MmnQEnphvG8j8= + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1487 + Third Stone From The Sun + Jimi Hendrix + 404453 + HB+GbNqwlkJbTlVcgj0= + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1488 + Remember + Jimi Hendrix + 168150 + tqTyqRuRuu/fajnWrccp + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1489 + Are You Experienced? + Jimi Hendrix + 254537 + I9ErjVlsdoQPk+I7ND7K + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1490 + Hey Joe + Billy Roberts + 210259 + xDTvd9NIJO5iL6cBoNrpew== + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1491 + Stone Free + Jimi Hendrix + 216293 + 8zKKV6+YSS1umoeu + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1492 + Purple Haze + Jimi Hendrix + 171572 + u6CfHhF417GH2qw8KyrFdOM1 + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1493 + 51st Anniversary + Jimi Hendrix + 196388 + ZglBDD/EFJymSmWu + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1494 + The Wind Cries Mary + Jimi Hendrix + 200463 + P+N0BmKCyHCjf2tX3hqEboS4iw== + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1495 + Highway Chile + Jimi Hendrix + 212453 + 3Uh1eZRgWQ== + 0.9900000000000000000 + 120 + 1 + 1 + 1 + + + 1496 + Surfing with the Alien + + 263707 + 3DFnIiwP/Ui2vhI= + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1497 + Ice 9 + + 239721 + bDnCitW0YaqPLiGR + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1498 + Crushing Day + + 314768 + Sb/3bvpxASnLlHIX + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1499 + Always With Me, Always With You + + 202035 + K84dPLfFpir4ow== + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1500 + Satch Boogie + + 193560 + 6qPg/q9trg/WR+JQBdo= + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1501 + Hill of the Skull + J. Satriani + 108435 + TRA3oKVQcoyIk4xTdlzr + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1502 + Circles + + 209071 + UBxxg1aRA3le5mNBAUh9 + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1503 + Lords of Karma + J. Satriani + 288227 + Yvx4lfNY/TV4F1drIhk= + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1504 + Midnight + J. Satriani + 102630 + suuYkjOUVg== + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1505 + Echo + J. Satriani + 337570 + uw29Qr/sMItAFXXxeeRVvPgePA== + 0.9900000000000000000 + 121 + 2 + 1 + 1 + + + 1506 + Engenho De Dentro + + 310073 + PzmXV0SusFZptg== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1507 + Alcohol + + 355239 + gwuXvIg1FT5IRw== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1508 + Mama Africa + + 283062 + F1WsKL7OlduaFVc= + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1509 + Salve Simpatia + + 343484 + JYJ1Zv0RPNohisvx5g== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1510 + W/Brasil (Chama O Síndico) + + 317100 + KMyG4t/zxLIhQaoc7w== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1511 + País Tropical + + 452519 + wI0bNSu/cTkSzw== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1512 + Os Alquimistas Estão Chegando + + 367281 + LQxsao2KukHbpshVuDVkh3JhMw== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1513 + Charles Anjo 45 + + 389276 + 4SFaGZRulcYmcO66tsqy5w== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1514 + Selassiê + + 326321 + SJO279oUO/c= + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1515 + Menina Sarará + + 191477 + Y//HOP7Y3xM2DLJT1h/09Bs= + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1516 + Que Maravilha + + 338076 + tw6e7YJ8MCrNfMwGDR4iXAqW + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1517 + Santa Clara Clareou + + 380081 + 7nEV26KTpjUEcnTB+r+phOg= + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1518 + Filho Maravilha + + 227526 + dX1KB9QLYkcv/5QweRRe9Sz4oQ== + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1519 + Taj Mahal + + 289750 + /FncRyy4WLrRR2OaOcOU + 0.9900000000000000000 + 122 + 1 + 7 + 1 + + + 1520 + Rapidamente + + 252238 + tOadCnhbZKc= + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1521 + As Dores do Mundo + Hyldon + 255477 + 0/hgYwSSsOK1nBygA9scsqd2 + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1522 + Vou Pra Ai + + 300878 + m/r3tn9FQQ== + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1523 + My Brother + + 253231 + W5e6oPU1plm/ + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1524 + Há Quanto Tempo + + 270027 + V8y0s7eDJnh4sAuBWNHk + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1525 + Vício + + 269897 + C6bbQuAdw0xUSvo= + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1526 + Encontrar Alguém + Marco Tulio Lara/Rogerio Flausino + 224078 + Jmpcgly5T6kz50J0jwbNkDvZ + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1527 + Dance Enquanto é Tempo + + 229093 + 6bx4Kf9+fRg6CWhebYkq + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1528 + A Tarde + + 266919 + DVSIJZ6BOkkjZGez2VAyEQ== + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1529 + Always Be All Right + + 128078 + DBA/rUFcBN6h + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1530 + Sem Sentido + + 250462 + oMqJ1epktb88srQ= + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1531 + Onibusfobia + + 315977 + aIEvBpsWyj7q11bjYHjro8w= + 0.9900000000000000000 + 123 + 1 + 7 + 1 + + + 1532 + Pura Elegancia + João Suplicy + 284107 + hEf9bJp+mo98TiSR9V7GbA== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1533 + Choramingando + João Suplicy + 190484 + vn46we0TYivJc6Z0cnkR8kQubQ== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1534 + Por Merecer + João Suplicy + 230582 + ++axawyafBpZ4fgc9A== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1535 + No Futuro + João Suplicy + 182308 + LCWRNpczmkHRCg== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1536 + Voce Inteira + João Suplicy + 241084 + GgnVEp6wMFnJ + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1537 + Cuando A Noite Vai Chegando + João Suplicy + 270628 + 18zPtFKXSNI= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1538 + Naquele Dia + João Suplicy + 251768 + e4mAo0zrYA6XOQi6Fad38Q== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1539 + Equinocio + João Suplicy + 269008 + pwe6McfCKg== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1540 + Papelão + João Suplicy + 213263 + VFnCgkSbUW4= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1541 + Cuando Eu For Pro Ceu + João Suplicy + 118804 + jmqaZogmPqKZIME= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1542 + Do Nosso Amor + João Suplicy + 203415 + wiRXw8HwQRe2tMc= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1543 + Borogodo + João Suplicy + 208457 + gfiSnoxSnbZLLBkNVyoe4A== + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1544 + Cafezinho + João Suplicy + 180924 + ji2iaC+SNGq/gqs= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1545 + Enquanto O Dia Não Vem + João Suplicy + 220891 + VzLao0TlkJSgFkaCC6Y= + 0.9900000000000000000 + 124 + 1 + 16 + 1 + + + 1546 + The Green Manalishi + + 205792 + C0prltFgmyeGJO1RZV4zzdA= + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1547 + Living After Midnight + + 213289 + pfT5P2kSRY5M3HjmIF2J + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1548 + Breaking The Law (Live) + + 144195 + KB9T69mwvApTfleTKjVsSXaP + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1549 + Hot Rockin' + + 197328 + sZzM4VlRQxO/r6AE + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1550 + Heading Out To The Highway (Live) + + 276427 + x2g1E3rkGfU= + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1551 + The Hellion + + 41900 + 7uvrurFjFm8vb5D312A= + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1552 + Electric Eye + + 222197 + Pvmalpz8W7N5x8vC/w== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1553 + You've Got Another Thing Comin' + + 305162 + zpF2b3mt4fWfn9/9T38wdJjw + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1554 + Turbo Lover + + 335542 + 2tWASoNZO5I4cvPmoRYWYA== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1555 + Freewheel Burning + + 265952 + GYdes3pJWvq2n63cggQv27olgw== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1556 + Some Heads Are Gonna Roll + + 249939 + R/MWPRqog6y5 + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1557 + Metal Meltdown + + 290664 + 5jgeUloQklRgiyZPzLk= + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1558 + Ram It Down + + 292179 + trVtxArm8ZI= + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1559 + Diamonds And Rust (Live) + + 219350 + liZxIJjSxa5Bd7l0vQ== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1560 + Victim Of Change (Live) + + 430942 + qh5JZsX3J/cmXa9j8g== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1561 + Tyrant (Live) + + 282253 + 565Y9KUMuzOfcbuOxg== + 0.9900000000000000000 + 125 + 1 + 3 + 1 + + + 1562 + Comin' Home + Paul Stanley, Ace Frehley + 172068 + DlQAGfmFwqXBgCub6g== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1563 + Plaster Caster + Gene Simmons + 198060 + ABRwNN+vxpMfxM6xdHZ/16o3MQ== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1564 + Goin' Blind + Gene Simmons, Stephen Coronel + 217652 + 6dFclmpsUw== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1565 + Do You Love Me + Paul Stanley, Bob Ezrin, Kim Fowley + 193619 + 7NjICiEcM4oAh64Xsg== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1566 + Domino + Gene Simmons + 226377 + NTtKSBBLJurV + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1567 + Sure Know Something + Paul Stanley, Vincent Poncia + 254354 + aTu1LrfaynJbg6ZH+8Q= + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1568 + A World Without Heroes + Paul Stanley, Gene Simmons, Bob Ezrin, Lewis Reed + 177815 + WEP01iKIGvxunCFLIlwIHAI= + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1569 + Rock Bottom + Paul Stanley, Ace Frehley + 200594 + 1KHlZwTTJr07uy7U7Q== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1570 + See You Tonight + Gene Simmons + 146494 + hri4CDETsmtP + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1571 + I Still Love You + Paul Stanley + 369815 + R5KWjqcWU2ejRA== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1572 + Every Time I Look At You + Paul Stanley, Vincent Cusano + 283898 + IqrwPyCwZU1ezg== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1573 + 2,000 Man + Mick Jagger, Keith Richard + 312450 + ruDFaaP/6u9PaA== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1574 + Beth + Peter Criss, Stan Penridge, Bob Ezrin + 170187 + ph9xPZcVJQ== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1575 + Nothin' To Lose + Gene Simmons + 222354 + xzGpGGMNx8kQY0we8HGu5LXJ + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1576 + Rock And Roll All Nite + Paul Stanley, Gene Simmons + 259631 + clN8tPW+0A== + 0.9900000000000000000 + 126 + 1 + 1 + 1 + + + 1577 + Immigrant Song + Robert Plant + 201247 + 0c3jGVAo9QZnBMg= + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1578 + Heartbreaker + John Bonham/John Paul Jones/Robert Plant + 316081 + W9s22owCSmE0cYyHzdey + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1579 + Since I've Been Loving You + John Paul Jones/Robert Plant + 416365 + S320WpIJ9vstSvz2+2o= + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1580 + Black Dog + John Paul Jones/Robert Plant + 317622 + 3+1n4pYcoSjydG8= + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1581 + Dazed And Confused + Jimmy Page/Led Zeppelin + 1116734 + X0FbS3l137vqUG3OUg== + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1582 + Stairway To Heaven + Robert Plant + 529658 + O61BBlRlyius + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1583 + Going To California + Robert Plant + 234605 + ZvQb+alUweYjOpe60f4= + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1584 + That's The Way + Robert Plant + 343431 + gBuvW45/mY+x4PTm6w== + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1585 + Whole Lotta Love (Medley) + Arthur Crudup/Bernard Besman/Bukka White/Doc Pomus/John Bonham/John Lee Hooker/John Paul Jones/Mort Shuman/Robert Plant/Willie Dixon + 825103 + CgUzlMHlhFnmEpWOh6sYTYHbQg== + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1586 + Thank You + Robert Plant + 398262 + 00kazx0azGVqGA== + 0.9900000000000000000 + 127 + 1 + 1 + 1 + + + 1587 + We're Gonna Groove + Ben E.King/James Bethea + 157570 + btbGGTRjJRAZ/SY0ncY= + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1588 + Poor Tom + Jimmy Page/Robert Plant + 182491 + 9+13Y18Yow== + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1589 + I Can't Quit You Baby + Willie Dixon + 258168 + TMDqZHamGB/v + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1590 + Walter's Walk + Jimmy Page, Robert Plant + 270785 + XSa4wZLj6lvLKYasFA== + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1591 + Ozone Baby + Jimmy Page, Robert Plant + 215954 + CR0j3+0GuJvLb3lZSv8= + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1592 + Darlene + Jimmy Page, Robert Plant, John Bonham, John Paul Jones + 307226 + agHeNmY/n0c2W5M= + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1593 + Bonzo's Montreux + John Bonham + 258925 + A0164J+rbFtYgzkx6RU= + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1594 + Wearing And Tearing + Jimmy Page, Robert Plant + 330004 + W0lHOZnrrGEnqHWuPWnW7INZ + 0.9900000000000000000 + 128 + 1 + 1 + 1 + + + 1595 + The Song Remains The Same + Jimmy Page/Jimmy Page & Robert Plant/Robert Plant + 330004 + tE5Qjtqt3aRW58isTVA= + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1596 + The Rain Song + Jimmy Page/Jimmy Page & Robert Plant/Robert Plant + 459180 + Q/7uIvqOV+tSOCn8L/GClrXY + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1597 + Over The Hills And Far Away + Jimmy Page/Jimmy Page & Robert Plant/Robert Plant + 290089 + YXMKum2LvA== + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1598 + The Crunge + John Bonham/John Paul Jones + 197407 + VXpe+yhevw== + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1599 + Dancing Days + Jimmy Page/Jimmy Page & Robert Plant/Robert Plant + 223216 + 1/5hX/5dYv4= + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1600 + D'Yer Mak'er + John Bonham/John Paul Jones + 262948 + sLGustRQE9Tw7wo5Q4GXPkc= + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1601 + No Quarter + John Paul Jones + 420493 + cfM9AJ5vy6o= + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1602 + The Ocean + John Bonham/John Paul Jones + 271098 + VHheBBEMZLzZDpQ= + 0.9900000000000000000 + 129 + 1 + 1 + 1 + + + 1603 + In The Evening + Jimmy Page, Robert Plant & John Paul Jones + 410566 + KUsnOG617JR8yQ== + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1604 + South Bound Saurez + John Paul Jones & Robert Plant + 254406 + tlrwChivEj7n + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1605 + Fool In The Rain + Jimmy Page, Robert Plant & John Paul Jones + 372950 + uL9bkev4LN7EvTCzgEioFcgv + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1606 + Hot Dog + Jimmy Page & Robert Plant + 197198 + 3hYbileoqSACTA3G + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1607 + Carouselambra + John Paul Jones, Jimmy Page & Robert Plant + 634435 + rFdxjMung7zA + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1608 + All My Love + Robert Plant & John Paul Jones + 356284 + uAvxA9qoYQLn44UJE5w0BA== + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1609 + I'm Gonna Crawl + Jimmy Page, Robert Plant & John Paul Jones + 329639 + Qdcqkrb3YA== + 0.9900000000000000000 + 130 + 1 + 1 + 1 + + + 1610 + Black Dog + Jimmy Page, Robert Plant, John Paul Jones + 296672 + KdYbSiCs/B1gYg== + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1611 + Rock & Roll + Jimmy Page, Robert Plant, John Paul Jones, John Bonham + 220917 + ZqTPeKBJJuNJokPU + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1612 + The Battle Of Evermore + Jimmy Page, Robert Plant + 351555 + x75B5JYjAg== + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1613 + Stairway To Heaven + Jimmy Page, Robert Plant + 481619 + kPyw0Ua4xjeJ7LM6tp1Ecl8= + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1614 + Misty Mountain Hop + Jimmy Page, Robert Plant, John Paul Jones + 278857 + SZATF2TlAsOCYmoXhz1g + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1615 + Four Sticks + Jimmy Page, Robert Plant + 284447 + 1ageplqQX6zAto+aoSk= + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1616 + Going To California + Jimmy Page, Robert Plant + 215693 + z4UM2XEBeZfK + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1617 + When The Levee Breaks + Jimmy Page, Robert Plant, John Paul Jones, John Bonham, Memphis Minnie + 427702 + gjVjzXFkdtlMx5tUuS+4MQ== + 0.9900000000000000000 + 131 + 1 + 1 + 1 + + + 1618 + Good Times Bad Times + Jimmy Page/John Bonham/John Paul Jones + 166164 + Vq5VaCFZ6JqSemPvaA== + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1619 + Babe I'm Gonna Leave You + Jimmy Page/Robert Plant + 401475 + EVPW11v8309RGcBVYd57 + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1620 + You Shook Me + J. B. Lenoir/Willie Dixon + 388179 + 3SFAmSLodA== + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1621 + Dazed and Confused + Jimmy Page + 386063 + YNx7Mt/pE+rka4kA4ldd + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1622 + Your Time Is Gonna Come + Jimmy Page/John Paul Jones + 274860 + iAddPKfM9w== + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1623 + Black Mountain Side + Jimmy Page + 132702 + H8adQa/OOSnebnZ+gKw= + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1624 + Communication Breakdown + Jimmy Page/John Bonham/John Paul Jones + 150230 + ZwXWcfZVeumFxAsRG4s4wJTk + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1625 + I Can't Quit You Baby + Willie Dixon + 282671 + EhlL0TsVMWAhc+HetNs= + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1626 + How Many More Times + Jimmy Page/John Bonham/John Paul Jones + 508055 + 9TbRWwG0pNwYfaO9 + 0.9900000000000000000 + 132 + 1 + 1 + 1 + + + 1627 + Whole Lotta Love + Jimmy Page, Robert Plant, John Paul Jones, John Bonham + 334471 + nqau4poPmVY= + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1628 + What Is And What Should Never Be + Jimmy Page, Robert Plant + 287973 + NJpbxPVZdaTlVzWElQHuOQ== + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1629 + The Lemon Song + Jimmy Page, Robert Plant, John Paul Jones, John Bonham + 379141 + vW48M1SXVxPB + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1630 + Thank You + Jimmy Page, Robert Plant + 287791 + xP9DpEJA2QI2/zy+S2d0mA== + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1631 + Heartbreaker + Jimmy Page, Robert Plant, John Paul Jones, John Bonham + 253988 + iJkJpcCot1ErGujgAwSxM94= + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1632 + Living Loving Maid (She's Just A Woman) + Jimmy Page, Robert Plant + 159216 + paGy8kO7/g== + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1633 + Ramble On + Jimmy Page, Robert Plant + 275591 + Oqb+I9W/u0rOebjVBFaMUxcm + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1634 + Moby Dick + John Bonham, John Paul Jones, Jimmy Page + 260728 + IjP6iopstc72mpVWTaYI + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1635 + Bring It On Home + Jimmy Page, Robert Plant + 259970 + EFMIRSgkuDU3ewmsTg== + 0.9900000000000000000 + 133 + 1 + 1 + 1 + + + 1636 + Immigrant Song + Jimmy Page, Robert Plant + 144875 + X9sdydyEPxw= + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1637 + Friends + Jimmy Page, Robert Plant + 233560 + th/wxbA4I2su/Od8AA7gyf56xA== + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1638 + Celebration Day + Jimmy Page, Robert Plant, John Paul Jones + 209528 + D2MJf+E7ujiDyoMv9N9RJTde + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1639 + Since I've Been Loving You + Jimmy Page, Robert Plant, John Paul Jones + 444055 + /BQQ2rBnmV/MPADdCXrJ + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1640 + Out On The Tiles + Jimmy Page, Robert Plant, John Bonham + 246047 + UxVw5HR+6udkeLg= + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1641 + Gallows Pole + Traditional + 296228 + IL26kZ9yyD7/iFkYSNzt/A== + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1642 + Tangerine + Jimmy Page + 189675 + 7Hq0K3r9EMZ6lH0pKHU3 + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1643 + That's The Way + Jimmy Page, Robert Plant + 337345 + ET4PgW8+l7KKZMq8WA== + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1644 + Bron-Y-Aur Stomp + Jimmy Page, Robert Plant, John Paul Jones + 259500 + mJHuZXj+BFymv6rKJd5KFNcSIQ== + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1645 + Hats Off To (Roy) Harper + Traditional + 219376 + Np7dehKu4g== + 0.9900000000000000000 + 134 + 1 + 1 + 1 + + + 1646 + In The Light + John Paul Jones/Robert Plant + 526785 + oBUzU27e++s= + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1647 + Bron-Yr-Aur + Jimmy Page + 126641 + w/05qrSXT9Y= + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1648 + Down By The Seaside + Robert Plant + 316186 + GLlndo24m+5l+rN0Usk= + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1649 + Ten Years Gone + Robert Plant + 393116 + AryQjFdbR+Je2RMU5w== + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1650 + Night Flight + John Paul Jones/Robert Plant + 217547 + ggaOo22VKZoqiHu3gHkBNw== + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1651 + The Wanton Song + Robert Plant + 249887 + cTQeqPgHw39K0dcJnHmjsw== + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1652 + Boogie With Stu + Ian Stewart/John Bonham/John Paul Jones/Mrs. Valens/Robert Plant + 233273 + 4vMl0OQz8meRCBGf280= + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1653 + Black Country Woman + Robert Plant + 273084 + JhKi4MkXif7KJCPEUg== + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1654 + Sick Again + Robert Plant + 283036 + jQ7XBFGWDhL2jAArQGf/st8= + 0.9900000000000000000 + 135 + 1 + 1 + 1 + + + 1655 + Achilles Last Stand + Jimmy Page/Robert Plant + 625502 + A/biitbC6hZZ9FqswW+g1wQ= + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1656 + For Your Life + Jimmy Page/Robert Plant + 384391 + OZuJN9IUHBbfndci/xg= + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1657 + Royal Orleans + John Bonham/John Paul Jones + 179591 + tMBbrQM3FRk6PBm3 + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1658 + Nobody's Fault But Mine + Jimmy Page/Robert Plant + 376215 + ypGLaWIFeEPlzCTObcDiTD83 + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1659 + Candy Store Rock + Jimmy Page/Robert Plant + 252055 + QWYMrkQpAcEk + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1660 + Hots On For Nowhere + Jimmy Page/Robert Plant + 284107 + Tvq5XNJLThFuv/mgAs/0N9+Vdw== + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1661 + Tea For One + Jimmy Page/Robert Plant + 566752 + zfsEJHXjvuNHQA== + 0.9900000000000000000 + 136 + 1 + 1 + 1 + + + 1662 + Rock & Roll + John Bonham/John Paul Jones/Robert Plant + 242442 + Q1TBltFrcZp0lDo= + 0.9900000000000000000 + 137 + 1 + 1 + 1 + + + 1663 + Celebration Day + John Paul Jones/Robert Plant + 230034 + ePuhZD25DUlrSvG0U/aU + 0.9900000000000000000 + 137 + 1 + 1 + 1 + + + 1664 + The Song Remains The Same + Robert Plant + 353358 + 741ryi1etktAOCPLbQ== + 0.9900000000000000000 + 137 + 1 + 1 + 1 + + + 1665 + Rain Song + Robert Plant + 505808 + Ap2SKYwo036AKjn29fliDA== + 0.9900000000000000000 + 137 + 1 + 1 + 1 + + + 1666 + Dazed And Confused + Jimmy Page + 1612329 + 2taKq+cpb6M= + 0.9900000000000000000 + 137 + 1 + 1 + 1 + + + 1667 + No Quarter + John Paul Jones/Robert Plant + 749897 + RVUkBZVB3HFIVCEqaWwTcQ1BkQ== + 0.9900000000000000000 + 138 + 1 + 1 + 1 + + + 1668 + Stairway To Heaven + Robert Plant + 657293 + aLzpM/VJ9eNPGnQi + 0.9900000000000000000 + 138 + 1 + 1 + 1 + + + 1669 + Moby Dick + John Bonham/John Paul Jones + 766354 + cuN9WnuU9xqEsA7qGXFq + 0.9900000000000000000 + 138 + 1 + 1 + 1 + + + 1670 + Whole Lotta Love + John Bonham/John Paul Jones/Robert Plant/Willie Dixon + 863895 + Odro3myxiGzwD0xM+A== + 0.9900000000000000000 + 138 + 1 + 1 + 1 + + + 1671 + Natália + Renato Russo + 235728 + Ld//pPaIlRaRrJkd5A== + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1672 + L'Avventura + Renato Russo + 278256 + 2kjc14tsFUCMRBk= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1673 + Música De Trabalho + Renato Russo + 260231 + WxFpa0irIWODLut0 + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1674 + Longe Do Meu Lado + Renato Russo - Marcelo Bonfá + 266161 + 4eAiSDtFT818kqczdMCLC+xTug== + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1675 + A Via Láctea + Renato Russo + 280084 + NS2ErSZj7fuA + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1676 + Música Ambiente + Renato Russo + 247614 + q11nXKmM8vhQ + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1677 + Aloha + Renato Russo + 325955 + yvTef8I40+o= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1678 + Soul Parsifal + Renato Russo - Marisa Monte + 295053 + V5bbMOlFtFt1ItdXU0zy5ko= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1679 + Dezesseis + Renato Russo + 323918 + GBf/GfQDu8FBTgU= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1680 + Mil Pedaços + Renato Russo + 203337 + 7ZACZSny0Cx+ + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1681 + Leila + Renato Russo + 323056 + 9DB81XindqfsmHdtu9M= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1682 + 1º De Julho + Renato Russo + 290298 + PaHYdSgEZVWKNEdV + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1683 + Esperando Por Mim + Renato Russo + 261668 + Iv8WHkwBIs6cHooUSplibXOA1Q== + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1684 + Quando Você Voltar + Renato Russo + 173897 + z+xR97ZWEY/b8g== + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1685 + O Livro Dos Dias + Renato Russo + 257253 + MFGIheyCWSA= + 0.9900000000000000000 + 139 + 1 + 7 + 1 + + + 1686 + Será + Dado Villa-Lobos/Marcelo Bonfá + 148401 + sMehgk5g3WsD6BY= + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1687 + Ainda É Cedo + Dado Villa-Lobos/Ico Ouro-Preto/Marcelo Bonfá + 236826 + ciYeNq4eZ/bwk/M= + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1688 + Geração Coca-Cola + Renato Russo + 141453 + fVnCwhN26hpgGw== + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1689 + Eduardo E Mônica + Renato Russo + 271229 + B0vOqVZ4povy2+y+K2lPPWTx + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1690 + Tempo Perdido + Renato Russo + 302158 + yRzU9gX0nhtXjf78 + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1691 + Indios + Renato Russo + 258168 + VqcX6+B0EX4= + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1692 + Que País É Este + Renato Russo + 177606 + BwHOkJuXWA== + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1693 + Faroeste Caboclo + Renato Russo + 543007 + OIYoNlJiM1TJtbhdTv7z + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1694 + Há Tempos + Dado Villa-Lobos/Marcelo Bonfá + 197146 + mGiEUmNd7+CrfxTTJ3RZBsKT + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1695 + Pais E Filhos + Dado Villa-Lobos/Marcelo Bonfá + 308401 + eNMdA0Xklhe/WSD7CQ0= + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1696 + Meninos E Meninas + Dado Villa-Lobos/Marcelo Bonfá + 203781 + +DISBmDblg== + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1697 + Vento No Litoral + Dado Villa-Lobos/Marcelo Bonfá + 366445 + i9NNXyxUW7Gbu6l7 + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1698 + Perfeição + Dado Villa-Lobos/Marcelo Bonfá + 276558 + e2Q/bsxGMIeK + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1699 + Giz + Dado Villa-Lobos/Marcelo Bonfá + 202213 + C8Y3fCb0vDJ54YuR + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1700 + Dezesseis + Dado Villa-Lobos/Marcelo Bonfá + 321724 + 94RqwmOohUBfkQ== + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1701 + Antes Das Seis + Dado Villa-Lobos + 189231 + fM7Tl5OUZsEAUEGZ9Ng1vd4= + 0.9900000000000000000 + 140 + 1 + 7 + 1 + + + 1702 + Are You Gonna Go My Way + Craig Ross/Lenny Kravitz + 211591 + MJl/6TRH6mKEzN4FQg== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1703 + Fly Away + Lenny Kravitz + 221962 + NFP/WCAknuR7yZDgtup26S4= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1704 + Rock And Roll Is Dead + Lenny Kravitz + 204199 + prgu92STmQ== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1705 + Again + Lenny Kravitz + 228989 + rTEQmuL7DZZloQ== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1706 + It Ain't Over 'Til It's Over + Lenny Kravitz + 242703 + 3Jy66UwetlhUkQDsmp4= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1707 + Can't Get You Off My Mind + Lenny Kravitz + 273815 + Xop8PO5rvpR3bdPh55XSH4TU + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1708 + Mr. Cab Driver + Lenny Kravitz + 230321 + UU7szuLZrjpF+61FdfvunIMZ + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1709 + American Woman + B. Cummings/G. Peterson/M.J. Kale/R. Bachman + 261773 + s20eCEJ8eD3Ow4Fxexc= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1710 + Stand By My Woman + Henry Kirssch/Lenny Kravitz/S. Pasch A. Krizan + 259683 + TKVyu5pjPzB4mconXeX4+E8G + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1711 + Always On The Run + Lenny Kravitz/Slash + 232515 + IaIyRqlRapvgd8Q= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1712 + Heaven Help + Gerry DeVeaux/Terry Britten + 190354 + Mi7rrkkqx3/Eczylb3hUGlc= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1713 + I Belong To You + Lenny Kravitz + 257123 + yjFqHvXoGV7JaS/IX7mzD5f5cg== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1714 + Believe + Henry Hirsch/Lenny Kravitz + 295131 + r86Ih5euZY3XMP1QQw== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1715 + Let Love Rule + Lenny Kravitz + 342648 + rZMfEzgCleo= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1716 + Black Velveteen + Lenny Kravitz + 290899 + XU/8FIPyX+BapyEm/Kjjh0c= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 1717 + Assim Caminha A Humanidade + + 210755 + jIeZbN+EVQwg8ITAcA== + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1718 + Honolulu + + 261433 + xW0rN5uZ4Zt3T6Ko + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1719 + Dancin´Days + + 237400 + 47DqO4zxfghixw== + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1720 + Um Pro Outro + + 236382 + cHi/d9FvXJo2f2GOfQ== + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1721 + Aviso Aos Navegantes + + 242808 + 7K2h8RBJyjZicVs2tPg= + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1722 + Casa + + 307591 + 8ZlipTrHI9pqyQg= + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1723 + Condição + + 263549 + CHGigSJskJ8= + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1724 + Hyperconectividade + + 180636 + 3BZSfSY5FU0cm7tjykTm + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1725 + O Descobridor Dos Sete Mares + + 225854 + 6ELkydM3KAdW + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1726 + Satisfação + + 208065 + xL/vOMkjWIsVgg8n + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1727 + Brumário + + 216241 + jg2MTi1Njz0su4I5KazW + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1728 + Um Certo Alguém + + 194063 + pe5KJ2N0Vl3j0pcKPy9j78AuVg== + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1729 + Fullgás + + 346070 + R+n6useFmARs/593gRtvlMU= + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1730 + Sábado À Noite + + 193854 + sRm3LmtbtoT+/VeTePtWGw== + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1731 + A Cura + + 280920 + vPOQYN7cUfHjMh+II8DPKr8= + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1732 + Aquilo + + 246073 + PAQYfp4EQoea + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1733 + Atrás Do Trio Elétrico + + 149080 + 2YakIWbys6E0oNI9ZT2H + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1734 + Senta A Pua + + 217547 + lvzaPYhpuX4ZFg== + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1735 + Ro-Que-Se-Da-Ne + + 146703 + PlWLHldBpRdd + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1736 + Tudo Bem + + 196101 + /SEwDC71H6r/n9v2 + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1737 + Toda Forma De Amor + + 227813 + bUWsXSRwzSUHUOI= + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1738 + Tudo Igual + + 276035 + TKmCe/vAJiqamNqqMFpz + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1739 + Fogo De Palha + + 246804 + 0xp3NUffHdiq44Cmj2g= + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1740 + Sereia + + 278047 + 0U2W4UudLw== + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1741 + Assaltaram A Gramática + + 261041 + 3rXM2tVrAi3J/DNS7dmtLg== + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1742 + Se Você Pensa + + 195996 + i6rQFz9/mjKiCVyZeA== + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1743 + Lá Vem O Sol (Here Comes The Sun) + + 189492 + /KQWmH97BUhsqLa3qVwW + 0.9900000000000000000 + 142 + 1 + 7 + 1 + + + 1744 + O Último Romântico (Ao Vivo) + + 231993 + +KBodb/zXuyfNTKoMmKm + 0.9900000000000000000 + 143 + 1 + 7 + 1 + + + 1745 + Pseudo Silk Kimono + Kelly, Mosley, Rothery, Trewaves + 134739 + UdU3rdZALbNnQw== + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1746 + Kayleigh + Kelly, Mosley, Rothery, Trewaves + 234605 + KGCI1T4bmhG8 + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1747 + Lavender + Kelly, Mosley, Rothery, Trewaves + 153417 + AmcJRir4Skhc + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1748 + Bitter Suite: Brief Encounter / Lost Weekend / Blue Angel + Kelly, Mosley, Rothery, Trewaves + 356493 + CgEjZdQkaTG3crUOfLU2ixdg + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1749 + Heart Of Lothian: Wide Boy / Curtain Call + Kelly, Mosley, Rothery, Trewaves + 366053 + jJhR6mJObS5nrA== + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1750 + Waterhole (Expresso Bongo) + Kelly, Mosley, Rothery, Trewaves + 133093 + 42oKLTImPSI= + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1751 + Lords Of The Backstage + Kelly, Mosley, Rothery, Trewaves + 112875 + GbJoWUl79OtTEJ/h6Q== + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1752 + Blind Curve: Vocal Under A Bloodlight / Passing Strangers / Mylo / Perimeter Walk / Threshold + Kelly, Mosley, Rothery, Trewaves + 569704 + z325F8EXZ/YBhW6OSwM= + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1753 + Childhoods End? + Kelly, Mosley, Rothery, Trewaves + 272796 + gw9N9WDa2i/3oOZZgg== + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1754 + White Feather + Kelly, Mosley, Rothery, Trewaves + 143595 + Vwxm+hU6sHkPewqZIrDi + 0.9900000000000000000 + 144 + 1 + 1 + 1 + + + 1755 + Arrepio + Carlinhos Brown + 136254 + uzDxnNAAUQ== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1756 + Magamalabares + Carlinhos Brown + 215875 + iXn1TcF2277kHKp5CJQ1yJ4J + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1757 + Chuva No Brejo + Morais + 145606 + 0evGuClNDOW1Z+UK + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1758 + Cérebro Eletrônico + Gilberto Gil + 172800 + unpwnEVit5igTLQGBWni + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1759 + Tempos Modernos + Lulu Santos + 183066 + +yj+xgB/AMLBywC1kSVW/w== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1760 + Maraçá + Carlinhos Brown + 230008 + U76NI5iDO1FoMZ4SsSPk + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1761 + Blanco + Marisa Monte/poema de Octavio Paz/versão: Haroldo de Campos + 45191 + vro+5kNWOnqu23li + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1762 + Panis Et Circenses + Caetano Veloso e Gilberto Gil + 192339 + Bnv1tPSxqw== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1763 + De Noite Na Cama + Caetano Veloso e Gilberto Gil + 209005 + A2KlwnSXTmGwD6ccjNI= + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1764 + Beija Eu + Caetano Veloso e Gilberto Gil + 197276 + FxjN/YMTdL0J2U9htqld + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1765 + Give Me Love + Caetano Veloso e Gilberto Gil + 249808 + cTjTu1eZJM++7Bj+y9JFdTQP3g== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1766 + Ainda Lembro + Caetano Veloso e Gilberto Gil + 218801 + JrQnQo6knOgkNpi4 + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1767 + A Menina Dança + Caetano Veloso e Gilberto Gil + 129410 + UjXjuBYUfvT+Ppf6dvI2k9otpg== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1768 + Dança Da Solidão + Caetano Veloso e Gilberto Gil + 203520 + wJW9EJEtsvw7qohTX6t5nA== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1769 + Ao Meu Redor + Caetano Veloso e Gilberto Gil + 275591 + vR37YKgodZBHF7JmVA== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1770 + Bem Leve + Caetano Veloso e Gilberto Gil + 159190 + CPHukrx40ibpYYK4VLZDmw== + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1771 + Segue O Seco + Caetano Veloso e Gilberto Gil + 178207 + eJkxHA+rahhtR4BJFQA= + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1772 + O Xote Das Meninas + Caetano Veloso e Gilberto Gil + 291866 + 519/YXEZvCQ= + 0.9900000000000000000 + 145 + 1 + 7 + 1 + + + 1773 + Wherever I Lay My Hat + + 136986 + ljOa3fDTvw== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1774 + Get My Hands On Some Lovin' + + 149054 + rEw5zCMu+UaDeU4wUt3UYOw= + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1775 + No Good Without You + William "Mickey" Stevenson + 161410 + 9DbiKbK7daE= + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1776 + You've Been A Long Time Coming + Brian Holland/Eddie Holland/Lamont Dozier + 137221 + 3BGMKJqIM53JxsrDMYYa7g== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1777 + When I Had Your Love + Robert Rogers/Warren "Pete" Moore/William "Mickey" Stevenson + 152424 + bvQ+uV858R/eiGqCmX0= + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1778 + You're What's Happening (In The World Today) + Allen Story/George Gordy/Robert Gordy + 142027 + gagdNfZRtKcePwqaIg3DsA== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1779 + Loving You Is Sweeter Than Ever + Ivy Hunter/Stevie Wonder + 166295 + OxJNgGPMfNeaCbv/yRsvSA== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1780 + It's A Bitter Pill To Swallow + Smokey Robinson/Warren "Pete" Moore + 194821 + QYhp5fdOukwfeQ== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1781 + Seek And You Shall Find + Ivy Hunter/William "Mickey" Stevenson + 223451 + n88RG9iiRoYw1R7c + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1782 + Gonna Keep On Tryin' Till I Win Your Love + Barrett Strong/Norman Whitfield + 176404 + XVtH+KdVJNtR + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1783 + Gonna Give Her All The Love I've Got + Barrett Strong/Norman Whitfield + 210886 + yzpH4kTEkzRDUig4yvegJw== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1784 + I Wish It Would Rain + Barrett Strong/Norman Whitfield/Roger Penzabene + 172486 + 1KgYnSOsyYibBsGkylV5 + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1785 + Abraham, Martin And John + Dick Holler + 273057 + IUbgkMACwp2h2ol3JJBQ + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1786 + Save The Children + Al Cleveland/Marvin Gaye/Renaldo Benson + 194821 + fy5PMjkRqI59Wqi+0Y95/A== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1787 + You Sure Love To Ball + Marvin Gaye + 218540 + 66mxwJZm0uZ6+0g= + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1788 + Ego Tripping Out + Marvin Gaye + 314514 + UWMKtmklmwZGFA+eUhJm + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1789 + Praise + Marvin Gaye + 235833 + BMsSYY3IOeefl+jI + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1790 + Heavy Love Affair + Marvin Gaye + 227892 + TL4VX2ss9p0HZ2rd9g== + 0.9900000000000000000 + 146 + 1 + 14 + 1 + + + 1791 + Down Under + + 222171 + 1pkTboMAeeGv6eeViCkjFw== + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1792 + Overkill + + 225410 + PNOJ+lb6Pubmb7v8ZKiD + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1793 + Be Good Johnny + + 216320 + X2JNjChlyANqDyx41Q== + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1794 + Everything I Need + + 216476 + zHrwlC4KbG6An9SHnZA= + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1795 + Down by the Sea + + 408163 + 5UpBY/8px9aLqdcLhpBGzcYQQg== + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1796 + Who Can It Be Now? + + 202396 + QAvPenkp8eKtt6HHN0U= + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1797 + It's a Mistake + + 273371 + xOsU1noFpGXrV/7l3TnRDQ== + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1798 + Dr. Heckyll & Mr. Jive + + 278465 + Wu582XvG6tU3 + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1799 + Shakes and Ladders + + 198008 + KNMID9NBC4LisjnInJyl5CN6 + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1800 + No Sign of Yesterday + + 362004 + E6jbqilsScirSCQpAUIgew== + 0.9900000000000000000 + 147 + 1 + 1 + 1 + + + 1801 + Enter Sandman + James Hetfield, Lars Ulrich and Kirk Hammett + 332251 + 4kcrpNK271s9klHgMw== + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1802 + Sad But True + Ulrich + 324754 + o2+RJDxMKd6iinlgOr4= + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1803 + Holier Than Thou + Ulrich + 227892 + OIV7IBMB20+fQfE= + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1804 + The Unforgiven + James Hetfield, Lars Ulrich and Kirk Hammett + 387082 + Tuza+Od3sIC6 + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1805 + Wherever I May Roam + Ulrich + 404323 + HuQuaQOloSpxfDHSBAw= + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1806 + Don't Tread On Me + Ulrich + 240483 + vyCWyCDy4kpg2g== + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1807 + Through The Never + James Hetfield, Lars Ulrich and Kirk Hammett + 244375 + x5GS6Yk9zg== + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1808 + Nothing Else Matters + Ulrich + 388832 + Z5fyqv02rnU= + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1809 + Of Wolf And Man + James Hetfield, Lars Ulrich and Kirk Hammett + 256835 + dbp76M4jKFcauJl9PJrO + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1810 + The God That Failed + Ulrich + 308610 + Ed0PmIjy8wQ7 + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1811 + My Friend Of Misery + James Hetfield, Lars Ulrich and Jason Newsted + 409547 + Ps12mJJyfRLVpV4J+W5pkW6FNA== + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1812 + The Struggle Within + Ulrich + 234240 + K/0kGutYntxGgsZ3rCnlWuE= + 0.9900000000000000000 + 148 + 1 + 3 + 1 + + + 1813 + Helpless + Harris/Tatler + 398315 + JicAKcQoMAc= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1814 + The Small Hours + Holocaust + 403435 + oC72hG7P73lA + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1815 + The Wait + Killing Joke + 295418 + W6w506DMUt/mXc8= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1816 + Crash Course In Brain Surgery + Bourge/Phillips/Shelley + 190406 + DrDsXw1LAjj76uN0/g== + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1817 + Last Caress/Green Hell + Danzig + 209972 + UP5Yp72vpLGF1exTX11ySEk= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1818 + Am I Evil? + Harris/Tatler + 470256 + FBcfRZcPwqN3CK1xycTV8g== + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1819 + Blitzkrieg + Jones/Sirotto/Smith + 216685 + VIY/oB/lXSoXcrrspcWyoDg= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1820 + Breadfan + Bourge/Phillips/Shelley + 341551 + 5o0KZ0jlGTib + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1821 + The Prince + Harris/Tatler + 265769 + FAsofWzhHsI= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1822 + Stone Cold Crazy + Deacon/May/Mercury/Taylor + 137717 + CvQywhp/nQe30kL60Q== + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1823 + So What + Culmer/Exalt + 189152 + ZO5kcew+WobnSVkWCw== + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1824 + Killing Time + Sweet Savage + 183693 + PH/Dp/CVLmu0y+/nq91hZlg= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1825 + Overkill + Clarke/Kilmister/Tayler + 245133 + Q3vEjgdvMYOwgw3oaQR0 + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1826 + Damage Case + Clarke/Farren/Kilmister/Tayler + 220212 + yzcOmwk7Yvg6mYEFk3w= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1827 + Stone Dead Forever + Clarke/Kilmister/Tayler + 292127 + gfBP0pCFrXhUdW0= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1828 + Too Late Too Late + Clarke/Kilmister/Tayler + 192052 + ql3MYepzVxIpV70= + 0.9900000000000000000 + 149 + 1 + 3 + 1 + + + 1829 + Hit The Lights + James Hetfield, Lars Ulrich + 257541 + CBnLVG7uLA== + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1830 + The Four Horsemen + James Hetfield, Lars Ulrich, Dave Mustaine + 433188 + M16M9xky480dv7olnA== + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1831 + Motorbreath + James Hetfield + 188395 + t5ptN5aSO2r7 + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1832 + Jump In The Fire + James Hetfield, Lars Ulrich, Dave Mustaine + 281573 + M0/Kd7pZCmU= + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1833 + (Anesthesia) Pulling Teeth + Cliff Burton + 254955 + fLFM0dRIuI+J9Gmdl2OyYTA= + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1834 + Whiplash + James Hetfield, Lars Ulrich + 249208 + NleZtcliY8TKaGwTxLVU2w== + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1835 + Phantom Lord + James Hetfield, Lars Ulrich, Dave Mustaine + 302053 + pGvJme/dA7F1kYub6xgVig== + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1836 + No Remorse + James Hetfield, Lars Ulrich + 386795 + 0w6wx+jpbhB9UCI= + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1837 + Seek & Destroy + James Hetfield, Lars Ulrich + 415817 + MLRJu0MN9WZNRnmWA1M= + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1838 + Metal Militia + James Hetfield, Lars Ulrich, Dave Mustaine + 311327 + 1yjeT1aIUuJFK1i7gluI + 0.9900000000000000000 + 150 + 1 + 3 + 1 + + + 1839 + Ain't My Bitch + James Hetfield, Lars Ulrich + 304457 + jeA7RN1B36cKICMkjJUZxJQ= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1840 + 2 X 4 + James Hetfield, Lars Ulrich, Kirk Hammett + 328254 + luifAMvt3tEDkOtRcwvE1ew= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1841 + The House Jack Built + James Hetfield, Lars Ulrich, Kirk Hammett + 398942 + yA/ylUg2RTZlLVWwEZMmacSg + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1842 + Until It Sleeps + James Hetfield, Lars Ulrich + 269740 + jBRNZgs+T7y4rBdg + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1843 + King Nothing + James Hetfield, Lars Ulrich, Kirk Hammett + 328097 + qGP7hSYAoGi7lYixfFJ+Vys= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1844 + Hero Of The Day + James Hetfield, Lars Ulrich, Kirk Hammett + 261982 + RiQCYKF7qOZX+A== + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1845 + Bleeding Me + James Hetfield, Lars Ulrich, Kirk Hammett + 497998 + jIlNzZ0IrZihQ8Q= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1846 + Cure + James Hetfield, Lars Ulrich + 294347 + adB+xLSP69Bk + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1847 + Poor Twisted Me + James Hetfield, Lars Ulrich + 240065 + otE7tUjCgN0/qKfuLg== + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1848 + Wasted My Hate + James Hetfield, Lars Ulrich, Kirk Hammett + 237296 + O+TfStC/iceCJJmPIrbzV2sn + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1849 + Mama Said + James Hetfield, Lars Ulrich + 319764 + /+d8kei/6xc= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1850 + Thorn Within + James Hetfield, Lars Ulrich, Kirk Hammett + 351738 + AxtYe6JziQ== + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1851 + Ronnie + James Hetfield, Lars Ulrich + 317204 + r6D/pAPbThccuaDJ6ec8f9g= + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1852 + The Outlaw Torn + James Hetfield, Lars Ulrich + 588721 + JL9S94vlqMXDZw== + 0.9900000000000000000 + 151 + 1 + 3 + 1 + + + 1853 + Battery + J.Hetfield/L.Ulrich + 312424 + He2vLSOnyydx+wwt + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1854 + Master Of Puppets + K.Hammett + 515239 + zAVKTdob3tmick7Kfrg= + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1855 + The Thing That Should Not Be + K.Hammett + 396199 + Gvw9F+dL/szxnMZAcQ== + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1856 + Welcome Home (Sanitarium) + K.Hammett + 387186 + ZjMYkdcrhZta66c= + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1857 + Disposable Heroes + J.Hetfield/L.Ulrich + 496718 + 8Xt6YGOk77UNdb30Ri7NOQ== + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1858 + Leper Messiah + C.Burton + 347428 + sRTbbII8PzY4po2Qfw== + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1859 + Orion + K.Hammett + 500062 + UnBeWYNRkDkhULxJ8XUkSqhdSw== + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1860 + Damage Inc. + K.Hammett + 330919 + qdbLG28/Oyoq/mEljg== + 0.9900000000000000000 + 152 + 1 + 3 + 1 + + + 1861 + Fuel + Hetfield, Ulrich, Hammett + 269557 + a4Po1EroyHfzirA= + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1862 + The Memory Remains + Hetfield, Ulrich + 279353 + SskR7v0wRD34fKVC6kMWZg4= + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1863 + Devil's Dance + Hetfield, Ulrich + 318955 + 75a6HQqgYtQSY3gx40A= + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1864 + The Unforgiven II + Hetfield, Ulrich, Hammett + 395520 + NvRxGDwAMeBQ2u7epQ== + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1865 + Better Than You + Hetfield, Ulrich + 322899 + BtFiaM+bGX0sv3A= + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1866 + Slither + Hetfield, Ulrich, Hammett + 313103 + KR3hxceYZNazT6RN0iO9tmlD + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1867 + Carpe Diem Baby + Hetfield, Ulrich, Hammett + 372480 + wrzpC5EWyBOkUbjHsg== + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1868 + Bad Seed + Hetfield, Ulrich, Hammett + 245394 + sNYT/4sTVg== + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1869 + Where The Wild Things Are + Hetfield, Ulrich, Newsted + 414380 + zja3LRSWrA== + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1870 + Prince Charming + Hetfield, Ulrich + 365061 + YxPpo67PPxJQ + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1871 + Low Man's Lyric + Hetfield, Ulrich + 457639 + /oS/hPuI8aUiTKm33i/FSO2z + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1872 + Attitude + Hetfield, Ulrich + 315898 + YwEyZ8bupN0O + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1873 + Fixxxer + Hetfield, Ulrich, Hammett + 496065 + 4JYBrt0U0bpJOy87b3NfNKw= + 0.9900000000000000000 + 153 + 1 + 3 + 1 + + + 1874 + Fight Fire With Fire + Metallica + 285753 + ud5l4Yy+7K3LHfmWVqrjq0E= + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1875 + Ride The Lightning + Metallica + 397740 + qAgBG/SOo3gkKJG+ + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1876 + For Whom The Bell Tolls + Metallica + 311719 + kkJvJDCU/gpDwi9Js8E= + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1877 + Fade To Black + Metallica + 414824 + 5IVYwzKqjKQ0nunXPhQ= + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1878 + Trapped Under Ice + Metallica + 244532 + wxwMFWZU5w== + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1879 + Escape + Metallica + 264359 + shdCqmRF0dFAzO+Tn9DOjA== + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1880 + Creeping Death + Metallica + 396878 + Bp06hUa8wA== + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1881 + The Call Of Ktulu + Metallica + 534883 + qv8TPJ5aX/0= + 0.9900000000000000000 + 154 + 1 + 3 + 1 + + + 1882 + Frantic + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 350458 + pqzw/ydeY8ypCk6A + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1883 + St. Anger + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 441234 + 806AuGC2rf9r + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1884 + Some Kind Of Monster + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 505626 + gbS6Rr6Vog== + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1885 + Dirty Window + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 324989 + kJWgKiGcXd4/17mdsnE= + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1886 + Invisible Kid + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 510197 + sQvFu+X5qVD/Og== + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1887 + My World + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 345626 + bkpsGKQ3Bw== + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1888 + Shoot Me Again + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 430210 + vupYySzkWw== + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1889 + Sweet Amber + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 327235 + d9ZGzqgQPwk6+dm9eOdF + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1890 + The Unnamed Feeling + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 429479 + 79AuEnImMoKVGrOKWEKZ14l4Mg== + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1891 + Purify + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 314017 + uGyoXQtj3qpd + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1892 + All Within My Hands + Bob Rock/James Hetfield/Kirk Hammett/Lars Ulrich + 527986 + H9elt9lbtUgP + 0.9900000000000000000 + 155 + 1 + 3 + 1 + + + 1893 + Blackened + James Hetfield, Lars Ulrich & Jason Newsted + 403382 + o8Q4jly1sPhgAjMAtMvngyg= + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1894 + ...And Justice For All + James Hetfield, Lars Ulrich & Kirk Hammett + 585769 + Bw5IhyRL+tzloGg= + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1895 + Eye Of The Beholder + James Hetfield, Lars Ulrich & Kirk Hammett + 385828 + IUFo4db0MxkBVrPlSloXHiLZ + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1896 + One + James Hetfield & Lars Ulrich + 446484 + VjLlQQEIG5/slH/QD48i4A== + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1897 + The Shortest Straw + James Hetfield and Lars Ulrich + 395389 + mNP0808PzrFbYj3JNNy6C9ES + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1898 + Harvester Of Sorrow + James Hetfield and Lars Ulrich + 345547 + O/9n2LpUR4SBhaNVJ3o= + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1899 + The Frayed Ends Of Sanity + James Hetfield, Lars Ulrich and Kirk Hammett + 464039 + hk7k3AYiFpCl + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1900 + To Live Is To Die + James Hetfield, Lars Ulrich and Cliff Burton + 588564 + 3tW3t8XEPn0WpfIw+jmeCIpN + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1901 + Dyers Eve + James Hetfield, Lars Ulrich and Kirk Hammett + 313991 + twwVTw9Vayb0DA== + 0.9900000000000000000 + 156 + 1 + 3 + 1 + + + 1902 + Springsville + J. Carisi + 207725 + JW/BMtx+j80= + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1903 + The Maids Of Cadiz + L. Delibes + 233534 + wWXYENUyVVM= + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1904 + The Duke + Dave Brubeck + 214961 + Pf2XyWXumcmF + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1905 + My Ship + Ira Gershwin, Kurt Weill + 268016 + YVmeSXAtf4Nux10f + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1906 + Miles Ahead + Miles Davis, Gil Evans + 209893 + vZFqUjMEetwAGHu3D1FbCtOZ + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1907 + Blues For Pablo + Gil Evans + 318328 + +eZrYiIbaONVr+aMTR2D2Tj6 + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1908 + New Rhumba + A. Jamal + 276871 + ZcULy2FBI5Jh3CR4mw== + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1909 + The Meaning Of The Blues + R. Troup, L. Worth + 168594 + SiaTUi5HNg== + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1910 + Lament + J.J. Johnson + 134191 + ISUsGYwtmYt3Iw82 + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1911 + I Don't Wanna Be Kissed (By Anyone But You) + H. Spina, J. Elliott + 191320 + Te4aCSH/iQcGMA== + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1912 + Springsville (Alternate Take) + J. Carisi + 196388 + Sl0D9vCGCbNm + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1913 + Blues For Pablo (Alternate Take) + Gil Evans + 212558 + o+WeSLX1+A== + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1914 + The Meaning Of The Blues/Lament (Alternate Take) + J.J. Johnson/R. Troup, L. Worth + 309786 + ZABpZfn8OHhJDQ== + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1915 + I Don't Wanna Be Kissed (By Anyone But You) (Alternate Take) + H. Spina, J. Elliott + 192078 + rMQa9PXOLiqim/Aa + 0.9900000000000000000 + 157 + 1 + 2 + 1 + + + 1916 + Coração De Estudante + Wagner Tiso, Milton Nascimento + 238550 + 0JqpCHvAawqRMaIwzeVkBr4= + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1917 + A Noite Do Meu Bem + Dolores Duran + 220081 + PftsutWJ8Kl5h8tVOXPmDZRf + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1918 + Paisagem Na Janela + Lô Borges, Fernando Brant + 197694 + L/yIoT0aknjEJ+jJI+Qjsx7v + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1919 + Cuitelinho + Folclore + 209397 + xCAY0kbkPzv4Lkk= + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1920 + Caxangá + Milton Nascimento, Fernando Brant + 245551 + UASzjnu0WS+fQxA= + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1921 + Nos Bailes Da Vida + Milton Nascimento, Fernando Brant + 275748 + gZG9p3EVwMgdfpsyFw== + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1922 + Menestrel Das Alagoas + Milton Nascimento, Fernando Brant + 199758 + Qr3935pKe2eXxXBVqP/EwA== + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1923 + Brasil + Milton Nascimento, Fernando Brant + 155428 + gQ/sUbUml8ri + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1924 + Canção Do Novo Mundo + Beto Guedes, Ronaldo Bastos + 215353 + gaLSaYF3UXKcMcCpxrAa+fg2 + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1925 + Um Gosto De Sol + Milton Nascimento, Ronaldo Bastos + 307200 + bcEDXQcZIirYjJY= + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1926 + Solar + Milton Nascimento, Fernando Brant + 156212 + FLfc+cTFW+/eVowoj7fYSDw2vA== + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1927 + Para Lennon E McCartney + Lô Borges, Márcio Borges, Fernando Brant + 321828 + Ya91rH1Fyk9eTHnlBcs= + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1928 + Maria, Maria + Milton Nascimento, Fernando Brant + 72463 + 8eq2VTOcRzwWNNvNUA== + 0.9900000000000000000 + 158 + 1 + 7 + 1 + + + 1929 + Minas + Milton Nascimento, Caetano Veloso + 152293 + 2e2h0GgEZUEvfH/6DJCS3aY= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1930 + Fé Cega, Faca Amolada + Milton Nascimento, Ronaldo Bastos + 278099 + xAvmXobhiJIZcl8= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1931 + Beijo Partido + Toninho Horta + 229564 + ond6DYRe1xWcxkawujrVOJC2 + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1932 + Saudade Dos Aviões Da Panair (Conversando No Bar) + Milton Nascimento, Fernando Brant + 268721 + OI63CURbew== + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1933 + Gran Circo + Milton Nascimento, Márcio Borges + 251297 + wEjW6/Lit9kIgP4MMw== + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1934 + Ponta de Areia + Milton Nascimento, Fernando Brant + 272796 + kYb+xTajTAxPAWLIJg== + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1935 + Trastevere + Milton Nascimento, Ronaldo Bastos + 265665 + 6241sgj3F83G2lPNAmHNuJI= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1936 + Idolatrada + Milton Nascimento, Fernando Brant + 286249 + djL8MQt/Jdc= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1937 + Leila (Venha Ser Feliz) + Milton Nascimento + 209737 + s/jUiCm7zu6aSksDPA== + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1938 + Paula E Bebeto + Milton Nascimento, Caetano Veloso + 135732 + w78jcWih6j+Wb7hS + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1939 + Simples + Nelson Angelo + 133093 + 7blito0x22PU8lEpEjQ= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1940 + Norwegian Wood + John Lennon, Paul McCartney + 413910 + Mm5GpjlCOA== + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1941 + Caso Você Queira Saber + Beto Guedes, Márcio Borges + 205688 + 5w28NjB0YmXQ18bgNDc= + 0.9900000000000000000 + 159 + 1 + 7 + 1 + + + 1942 + Ace Of Spades + Clarke/Kilmister/Taylor + 169926 + vtJgjO/N0UhVbHcM + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1943 + Love Me Like A Reptile + Clarke/Kilmister/Taylor + 203546 + KBIYsbRIe6nQ+qvucoyBUktTPg== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1944 + Shoot You In The Back + Clarke/Kilmister/Taylor + 160026 + 24fT2LZJoxXFZg== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1945 + Live To Win + Clarke/Kilmister/Taylor + 217626 + uGc6PL2+FSw= + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1946 + Fast And Loose + Clarke/Kilmister/Taylor + 203337 + vOnu17WdfEBQ9QoYORFMoT4= + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1947 + (We Are) The Road Crew + Clarke/Kilmister/Taylor + 192600 + +2qkZeRpMA== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1948 + Fire Fire + Clarke/Kilmister/Taylor + 164675 + hjhQw5Q2JlM/8Zn7Iw== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1949 + Jailbait + Clarke/Kilmister/Taylor + 213916 + zWPFz1yxf1btm39+Gg== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1950 + Dance + Clarke/Kilmister/Taylor + 158432 + R1YFhafDFkTwjGHU8eXS + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1951 + Bite The Bullet + Clarke/Kilmister/Taylor + 98115 + CEId4Z1BnxQMf3Iw + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1952 + The Chase Is Better Than The Catch + Clarke/Kilmister/Taylor + 258403 + tUQVHGQL6OsTVF8DiHM5boi/mQ== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1953 + The Hammer + Clarke/Kilmister/Taylor + 168071 + kZI8YTglBrfxeCdQ + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1954 + Dirty Love + Clarke/Kilmister/Taylor + 176457 + +TpHS7iN2upv9O293hTNZaWEvw== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1955 + Please Don't Touch + Heath/Robinson + 169926 + q7kiB7TjPgUw+g== + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1956 + Emergency + Dufort/Johnson/McAuliffe/Williams + 180427 + LA8djzjxI88yv5oink6k + 0.9900000000000000000 + 160 + 1 + 3 + 1 + + + 1957 + Kir Royal + Mônica Marianno + 234788 + EThSS/Rodzo= + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1958 + O Que Vai Em Meu Coração + Mônica Marianno + 255373 + F0CX1E7VuXVawQ== + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1959 + Aos Leões + Mônica Marianno + 234684 + wYSUc4K0jBkRloS5EIkt + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1960 + Dois Índios + Mônica Marianno + 219271 + 3q+mxJjjTyGxi/vj + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1961 + Noite Negra + Mônica Marianno + 206811 + 4K1DjfaZjKM= + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1962 + Beijo do Olhar + Mônica Marianno + 252682 + yD/bXSipkoeGSg== + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1963 + É Fogo + Mônica Marianno + 194873 + CNvGs/0V3TVzwva5qQ== + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1964 + Já Foi + Mônica Marianno + 245681 + MelAKxnwoCj/5mfoO7qljio= + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1965 + Só Se For Pelo Cabelo + Mônica Marianno + 238288 + sMLhBOeQkOE= + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1966 + No Clima + Mônica Marianno + 249495 + VzAc0YUyLfa/ + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1967 + A Moça e a Chuva + Mônica Marianno + 274625 + W21ageDb30sU2SOP5JfxCedO + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1968 + Demorou! + Mônica Marianno + 39131 + ArCbODVI+OMU4bUNw+Y8 + 0.9900000000000000000 + 161 + 1 + 16 + 1 + + + 1969 + Bitter Pill + Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil + 266814 + mFVBASkHRHs= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1970 + Enslaved + Mick Mars/Nikki Sixx/Tommy Lee + 269844 + mMhLhOB8S97KvaHA + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1971 + Girls, Girls, Girls + Mick Mars/Nikki Sixx/Tommy Lee + 270288 + JTjo98ppX8tfqKjIWbOmTQ== + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1972 + Kickstart My Heart + Nikki Sixx + 283559 + +2sfMZ1/rF80ZWkv+Smb + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1973 + Wild Side + Nikki Sixx/Tommy Lee/Vince Neil + 276767 + YzAIGDE82hw7OB+ju4bJpQ== + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1974 + Glitter + Bryan Adams/Nikki Sixx/Scott Humphrey + 340114 + xsE1oAOIuDuYlgT1nGV/DQ== + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1975 + Dr. Feelgood + Mick Mars/Nikki Sixx + 282618 + 9oKdNNK+kQP1ZF8Io62cxJ0y + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1976 + Same Ol' Situation + Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil + 254511 + ZW5fqE/dmQ== + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1977 + Home Sweet Home + Nikki Sixx/Tommy Lee/Vince Neil + 236904 + 1iae06CWAZBGCF30 + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1978 + Afraid + Nikki Sixx + 248006 + pJ0OI1ky9OhnMf8yGKc= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1979 + Don't Go Away Mad (Just Go Away) + Mick Mars/Nikki Sixx + 279980 + ltlOVzkYutxXkb9yoR1VvD8= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1980 + Without You + Mick Mars/Nikki Sixx + 268956 + Y8DQUYX2qqS+bvWeoIc= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1981 + Smokin' in The Boys Room + Cub Coda/Michael Lutz + 206837 + tvlsuQa66+nAt5KZwFI= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1982 + Primal Scream + Mick Mars/Nikki Sixx/Tommy Lee/Vince Neil + 286197 + EXTA9LXnekVUV6yUWUs= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1983 + Too Fast For Love + Nikki Sixx + 200829 + uPA4g+sk6AI5g3jWEJo= + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1984 + Looks That Kill + Nikki Sixx + 240979 + XOpR812A3qvRBzu0GA== + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1985 + Shout At The Devil + Nikki Sixx + 221962 + WSaRndj+oWE8ZqYocoZwPRBq + 0.9900000000000000000 + 162 + 1 + 3 + 1 + + + 1986 + Intro + Kurt Cobain + 52218 + YvvCQmbuZtlEZnywb9Cg + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1987 + School + Kurt Cobain + 160235 + XeY4OJtQ+63r + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1988 + Drain You + Kurt Cobain + 215196 + NA5XO5T30A== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1989 + Aneurysm + Nirvana + 271516 + tmaX4yqvcSVc+r+2NljR + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1990 + Smells Like Teen Spirit + Nirvana + 287190 + ElbXMg4RABRXGbpYgQnR + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1991 + Been A Son + Kurt Cobain + 127555 + 32YaOkd6u4nGdvQ= + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1992 + Lithium + Kurt Cobain + 250017 + 7jQW3DywKD0fng== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1993 + Sliver + Kurt Cobain + 116218 + pGaCixH0GKNTKTrW0D2XXw== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1994 + Spank Thru + Kurt Cobain + 190354 + m05rmB3/JiMC3hzR4Q== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1995 + Scentless Apprentice + Nirvana + 211200 + ZUBrddPF76mVrdKh1rNdRp6k + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1996 + Heart-Shaped Box + Kurt Cobain + 281887 + j6LRM2KHZltoDhX8 + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1997 + Milk It + Kurt Cobain + 225724 + cZXUlWTIw5qp8Q== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1998 + Negative Creep + Kurt Cobain + 163761 + vcV8KHPFvEB3gVHxlA0J7Q== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 1999 + Polly + Kurt Cobain + 149995 + aYabf7EAL0HfyOHV4bU= + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 2000 + Breed + Kurt Cobain + 208378 + sRh1nAs96KJR1YVRIKQ= + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 2001 + Tourette's + Kurt Cobain + 115591 + iFvaVjEiVTkMxUznk/3bapbLag== + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 2002 + Blew + Kurt Cobain + 216346 + e5ds4jCA5Ek= + 0.9900000000000000000 + 163 + 1 + 1 + 1 + + + 2003 + Smells Like Teen Spirit + Kurt Cobain + 301296 + LK8OnZ8/hfs= + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2004 + In Bloom + Kurt Cobain + 254928 + hMRb32jXvlVVpXVr7oa1Y8Tw + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2005 + Come As You Are + Kurt Cobain + 219219 + +CWwPgyO4BY9SfS9Vm4LRqbknA== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2006 + Breed + Kurt Cobain + 183928 + lSPaKz7TPz0pWQ== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2007 + Lithium + Kurt Cobain + 256992 + 20+WA2XThU9Qh8GADGA= + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2008 + Polly + Kurt Cobain + 177031 + H/zjPw9/J8FZ1A== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2009 + Territorial Pissings + Kurt Cobain + 143281 + hQA4T6Ps5BAZbsBrpg== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2010 + Drain You + Kurt Cobain + 223973 + IJVLp9SjzspVtEJa6Q== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2011 + Lounge Act + Kurt Cobain + 156786 + urONPC4ZToUW + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2012 + Stay Away + Kurt Cobain + 212636 + 5NSb+0d5X5A8ze7p2xo= + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2013 + On A Plain + Kurt Cobain + 196440 + MX26qoMNSQOaVWXggz2MJJp/ + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2014 + Something In The Way + Kurt Cobain + 230556 + wgAH0oPcVbIdHA== + 0.9900000000000000000 + 164 + 1 + 1 + 1 + + + 2015 + Time + + 96888 + 0ddzuP2ck9uS85vQAabhmA== + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2016 + P.S.Apareça + + 209188 + U6+pU2qQV4Q= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2017 + Sangue Latino + + 223033 + qjfOLlor5z6E + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2018 + Folhas Secas + + 161253 + bcs/8JC/7FcmLw== + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2019 + Poeira + + 267075 + LKJDeV9ucwhnRhwz0/FcDWSY + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2020 + Mágica + + 233743 + 6cIhUisRE74Yk304 + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2021 + Quem Mata A Mulher Mata O Melhor + + 262791 + VCR+lIq1+710NhxHUJc= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2022 + Mundaréu + + 217521 + /zOyiL62RkMKTxdoTK9adOk= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2023 + O Braço Da Minha Guitarra + + 258351 + 696uc8iCrp2z + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2024 + Deus + + 284160 + iwQL2nmmv+Th9Q== + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2025 + Mãe Terra + + 306625 + eg7gc0RzTa8OGcIzOWW5vos= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2026 + Às Vezes + + 330292 + L9khA9G3BUQ87qXvdZL0lA== + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2027 + Menino De Rua + + 329795 + 0M3/gw5h7qVbydHSdQ== + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2028 + Prazer E Fé + + 214831 + 6DR5sRxYdj0pbgA= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2029 + Elza + + 199105 + Xgkeoy8/pPM= + 0.9900000000000000000 + 165 + 1 + 1 + 1 + + + 2030 + Requebra + + 240744 + 8IzoIXgzXg== + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2031 + Nossa Gente (Avisa Là) + + 188212 + 7TNxxi69uvzg2Ds= + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2032 + Olodum - Alegria Geral + + 233404 + kqSRgtcC5Ia3mZItgdf4 + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2033 + Madagáscar Olodum + + 252264 + kJCjJRjIOzqP + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2034 + Faraó Divindade Do Egito + + 228571 + MExkp09naPlW + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2035 + Todo Amor (Asas Da Liberdade) + + 245133 + +mZJdk7XvQ== + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2036 + Denúncia + + 159555 + oUNFVsQSa080FuI= + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2037 + Olodum, A Banda Do Pelô + + 146599 + aFfzZ9GYIhBK + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2038 + Cartao Postal + + 211565 + xIiArK0qRyzWQArn + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2039 + Jeito Faceiro + + 217286 + SyrZh1E7/zJSF4zjo3Phpba1rQ== + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2040 + Revolta Olodum + + 230191 + dX+81hhlQQgHP6E= + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2041 + Reggae Odoyá + + 224470 + gb6nPPcQ0NRK+HJx9MgJ + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2042 + Protesto Do Olodum (Ao Vivo) + + 206001 + ZYcgi13cI8xuA27s + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2043 + Olodum - Smile (Instrumental) + + 235833 + 9yoSdcxi5cul + 0.9900000000000000000 + 166 + 1 + 7 + 1 + + + 2044 + Vulcão Dub - Fui Eu + Bi Ribeira/Herbert Vianna/João Barone + 287059 + peTYwH0MS+FQW4o= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2045 + O Trem Da Juventude + Herbert Vianna + 225880 + fx8WYqSb2870oeTaUg== + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2046 + Manguetown + Chico Science/Dengue/Lúcio Maia + 162925 + YPsnZiTswNp6poQcpcAiIR6R + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2047 + Um Amor, Um Lugar + Herbert Vianna + 184555 + VavyX2q9Su8= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2048 + Bora-Bora + Herbert Vianna + 182987 + uQQA/m6vq1C5 + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2049 + Vai Valer + Herbert Vianna + 206524 + Np3ipaVw3of1G6vS + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2050 + I Feel Good (I Got You) - Sossego + James Brown/Tim Maia + 244976 + U2r8Im6bvana/OghdaWFrvY= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2051 + Uns Dias + Herbert Vianna + 240796 + 0mc1WtJzBk3vjDVV1Cvn + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2052 + Sincero Breu + C. A./C.A./Celso Alvim/Herbert Vianna/Mário Moura/Pedro Luís/Sidon Silva + 208013 + rZRxjD20/EBcofmDLw== + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2053 + Meu Erro + Herbert Vianna + 188577 + WNn+BtlqTfiXiRwhrDE= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2054 + Selvagem + Bi Ribeiro/Herbert Vianna/João Barone + 148558 + hCi9OfT48T1p1x1r + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2055 + Brasília 5:31 + Herbert Vianna + 178337 + /TF5gh0kM1w= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2056 + Tendo A Lua + Herbert Vianna/Tet Tillett + 198922 + zVF9NLT85w== + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2057 + Que País É Este + Renato Russo + 216685 + HAjLzNd4PEk60maclC8= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2058 + Navegar Impreciso + Herbert Vianna + 262870 + /lj6ZhCZA4f9Fi1ba7w= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2059 + Feira Moderna + Beto Guedes/Fernando Brant/L Borges + 182517 + RPVV+bsVoCgluD04 + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2060 + Tequila - Lourinha Bombril (Parate Y Mira) + Bahiano/Chuck Rio/Diego Blanco/Herbert Vianna + 255738 + Us3Awp2Wfts= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2061 + Vamo Batê Lata + Herbert Vianna + 228754 + ldfWGIDNtaod0I16jnA= + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2062 + Life During Wartime + Chris Frantz/David Byrne/Jerry Harrison/Tina Weymouth + 259186 + mnOlXjDUrtJgIDQvVmq91T7kig== + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2063 + Nebulosa Do Amor + Herbert Vianna + 203415 + fSKildJye5tsq2jE + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2064 + Caleidoscópio + Herbert Vianna + 256522 + eScp8CCr5OYEdfhLnl8/X/tO + 0.9900000000000000000 + 167 + 1 + 7 + 1 + + + 2065 + Trac Trac + Fito Paez/Herbert Vianna + 231653 + AxDJeNEQi71ZE2a1t3DS3Q== + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2066 + Tendo A Lua + Herbert Vianna/Tetê Tillet + 219585 + k+QdOaV5eKw= + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2067 + Mensagen De Amor (2000) + Herbert Vianna + 183588 + STQTPDtxXNI= + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2068 + Lourinha Bombril + Bahiano/Diego Blanco/Herbert Vianna + 159895 + TK+vWOCU7YvT + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2069 + La Bella Luna + Herbert Vianna + 192653 + wEHby4H8yxcxXF2WUMwnxg== + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2070 + Busca Vida + Herbert Vianna + 176431 + qhzX9VjkroYt + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2071 + Uma Brasileira + Carlinhos Brown/Herbert Vianna + 217573 + OwSJSxqm2etobmmRQG9ZK3Y= + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2072 + Luis Inacio (300 Picaretas) + Herbert Vianna + 198191 + tl7jMRk9Qm77qWdcLA== + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2073 + Saber Amar + Herbert Vianna + 202788 + VGiQE6gRQ/B24L5Y7RncaJst + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2074 + Ela Disse Adeus + Herbert Vianna + 226298 + S9DOsAnqSwir + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2075 + O Amor Nao Sabe Esperar + Herbert Vianna + 241084 + MIQMQSQ9199Gg2UgxecDcw== + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2076 + Aonde Quer Que Eu Va + Herbert Vianna/Paulo Sérgio Valle + 258089 + TymRkw467uF0hbiGKFwIlw== + 0.9900000000000000000 + 168 + 1 + 7 + 1 + + + 2077 + Caleidoscópio + + 211330 + RluxF8ncBYlUqgkrCuY= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2078 + Óculos + + 219271 + lin73xkXIUodYK8= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2079 + Cinema Mudo + + 227918 + H1geJlyIgKGnwamGTIwK + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2080 + Alagados + + 302393 + j+W1ap4K8A== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2081 + Lanterna Dos Afogados + + 190197 + YSl+LiQRk7YZJOUwNoOs + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2082 + Melô Do Marinheiro + + 208352 + ikUF1IB1ko0MZ7o4qkUZFGcf + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2083 + Vital E Sua Moto + + 210207 + MgpRfJUt8m0npg== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2084 + O Beco + + 189178 + gws4Et9YBBt+65Y= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2085 + Meu Erro + + 208431 + Ib1XWwvTC9HJFr55mDjJcKY= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2086 + Perplexo + + 161175 + CGrmM+Ou/5dmwA== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2087 + Me Liga + + 229590 + S6HZnBkwvz7S55kb1Q9tTb96pw== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2088 + Quase Um Segundo + + 275644 + lHXx4ysK7dmpW3NtS8F9dQ== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2089 + Selvagem + + 245890 + 3X4HCTLUpm5PESM= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2090 + Romance Ideal + + 250070 + YEAdvzB71rD1cA8= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2091 + Será Que Vai Chover? + + 337057 + 5pR3cyzPFJL4aOH7n4VioEp13A== + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2092 + SKA + + 148871 + ymJIG1auG0U= + 0.9900000000000000000 + 169 + 1 + 7 + 1 + + + 2093 + Bark at the Moon + O. Osbourne + 257252 + xe9tb8QjnVwzQn/8kX74XiEf + 0.9900000000000000000 + 170 + 2 + 1 + 1 + + + 2094 + I Don't Know + B. Daisley, O. Osbourne & R. Rhoads + 312980 + GTVlgJMWeINMXBx+ + 0.9900000000000000000 + 171 + 2 + 1 + 1 + + + 2095 + Crazy Train + B. Daisley, O. Osbourne & R. Rhoads + 295960 + zuszeHSM2mLEQxczXQ== + 0.9900000000000000000 + 171 + 2 + 1 + 1 + + + 2096 + Flying High Again + L. Kerslake, O. Osbourne, R. Daisley & R. Rhoads + 290851 + OORPvDSOcSw= + 0.9900000000000000000 + 172 + 2 + 1 + 1 + + + 2097 + Mama, I'm Coming Home + L. Kilmister, O. Osbourne & Z. Wylde + 251586 + X2/ZWUygUQ== + 0.9900000000000000000 + 173 + 2 + 1 + 1 + + + 2098 + No More Tears + J. Purdell, M. Inez, O. Osbourne, R. Castillo & Z. Wylde + 444358 + FsPKLqVKgOqVRUhU8U1MNQ== + 0.9900000000000000000 + 173 + 2 + 1 + 1 + + + 2099 + I Don't Know + O. Osbourne, R. Daisley, R. Rhoads + 283088 + QJ78n+fwQ6I= + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2100 + Crazy Train + O. Osbourne, R. Daisley, R. Rhoads + 322716 + 0wiaM47Bc0MBb5I= + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2101 + Believer + O. Osbourne, R. Daisley, R. Rhoads + 308897 + kpnO0Z9JKNd/EiOkPgsC + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2102 + Mr. Crowley + O. Osbourne, R. Daisley, R. Rhoads + 344241 + YC7Th4wrd3hPYraG + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2103 + Flying High Again + O. Osbourne, R. Daisley, R. Rhoads, L. Kerslake + 261224 + rkzcokytBA== + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2104 + Relvelation (Mother Earth) + O. Osbourne, R. Daisley, R. Rhoads + 349440 + zkinGsr7wOX29IK/H+LSnAs= + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2105 + Steal Away (The Night) + O. Osbourne, R. Daisley, R. Rhoads + 485720 + ZyJWgjySofbQ + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2106 + Suicide Solution (With Guitar Solo) + O. Osbourne, R. Daisley, R. Rhoads + 467069 + RgHyXv0mkuYsbMIwtpJZbjTH + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2107 + Iron Man + A. F. Iommi, W. Ward, T. Butler, J. Osbourne + 172120 + zHpAlwtG4tdMCxR40yr6n/UBJA== + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2108 + Children Of The Grave + A. F. Iommi, W. Ward, T. Butler, J. Osbourne + 357067 + +E/rb59+NmvDKM5d + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2109 + Paranoid + A. F. Iommi, W. Ward, T. Butler, J. Osbourne + 176352 + NARLBWrnGBtP + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2110 + Goodbye To Romance + O. Osbourne, R. Daisley, R. Rhoads + 334393 + 2hfz7gW782RsEAbJfI7R9w== + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2111 + No Bone Movies + O. Osbourne, R. Daisley, R. Rhoads + 249208 + D3YTIzy2np4mr5qL + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2112 + Dee + R. Rhoads + 261302 + C6WpCBBXrJAwr9DEYk3T + 0.9900000000000000000 + 174 + 1 + 3 + 1 + + + 2113 + Shining In The Light + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 240796 + h7wzcloJpDsjnWA= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2114 + When The World Was Young + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 373394 + UN8MWdlRBGAgc315S/w= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2115 + Upon A Golden Horse + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 232359 + x0Ne2mnKM57yZhg= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2116 + Blue Train + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 405028 + AgBt5XL3Vz9Ro3brEElzSxQ+ + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2117 + Please Read The Letter + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 262112 + Jl4q3fjEw/eJHEE= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2118 + Most High + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 336535 + 88CRAl+yjQqC9LyNIw== + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2119 + Heart In Your Hand + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 230896 + c8kgV+iKs6vxYdcidCGv/80iEA== + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2120 + Walking Into Clarksdale + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 318511 + gyp+RhOYhjQ3MqGduitQ+dc= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2121 + Burning Up + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 321619 + NLZlR84wKj09bFs= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2122 + When I Was A Child + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 345626 + Jpl9mklIStlDUAN/c74= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2123 + House Of Love + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 335699 + OWhJ0LUom+5ZJDxbThvWWg== + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2124 + Sons Of Freedom + Jimmy Page, Robert Plant, Charlie Jones, Michael Lee + 246465 + 2LUMCCAg4Qiv/e7ksuXTEHA= + 0.9900000000000000000 + 175 + 1 + 1 + 1 + + + 2125 + United Colours + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 330266 + 1PSbplmKqyN1 + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2126 + Slug + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 281469 + 7Py9bfbqp76xtxhIaMgG + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2127 + Your Blue Room + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 328228 + rAmmPmhL3ioCZX4yW4Fc/Ko= + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2128 + Always Forever Now + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 383764 + G7NAge7IPhReuNiLjNOgL96hfQ== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2129 + A Different Kind Of Blue + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 120816 + pKEdkmqQbHVjMFobnpQ= + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2130 + Beach Sequence + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 212297 + UuorG93/VO0lUg== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2131 + Miss Sarajevo + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 340767 + 2aqSLKO7f3IvepWtFl1c + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2132 + Ito Okashi + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 205087 + sS5evO34JU1E + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2133 + One Minute Warning + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 279693 + hqA3ULP4QPS2weM2jJ+cK2QyvQ== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2134 + Corpse (These Chains Are Way Too Long) + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 214909 + FL2ANqK/xpWJ4YRF5/A1 + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2135 + Elvis Ate America + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 180166 + O97GnG0ippvmeqG/H8GT848Ing== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2136 + Plot 180 + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 221596 + HwCu9DGqatU8nk+caQ== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2137 + Theme From The Swan + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 203911 + 8IZsIM/yFuVQJx4HdshNkbU= + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2138 + Theme From Let's Go Native + Brian Eno, Bono, Adam Clayton, The Edge & Larry Mullen Jnr. + 186723 + Umy/OjDSa8O30V9IKw== + 0.9900000000000000000 + 176 + 1 + 10 + 1 + + + 2139 + Wrathchild + Steve Harris + 170396 + VWHQDIZuOKyxOrCG1io0ooeq6A== + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2140 + Killers + Paul Di'Anno/Steve Harris + 309995 + Svz+tlaatQw6RYYI+xk= + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2141 + Prowler + Steve Harris + 240274 + FPdAC0ampbqFian7QI8V + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2142 + Murders In The Rue Morgue + Steve Harris + 258638 + tF+8ulhjGrbs + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2143 + Women In Uniform + Greg Macainsh + 189936 + LHFss6eKvXgfq0efocikQXgs + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2144 + Remember Tomorrow + Paul Di'Anno/Steve Harris + 326426 + nnV8JfzRqT9eWLA= + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2145 + Sanctuary + David Murray/Paul Di'Anno/Steve Harris + 198844 + ih6NeTRO0eI= + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2146 + Running Free + Paul Di'Anno/Steve Harris + 199706 + PshvaQIVvfMWF+rtCk5Dr0xw + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2147 + Phantom Of The Opera + Steve Harris + 418168 + /kteH27OvQ== + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2148 + Iron Maiden + Steve Harris + 235232 + E09v86dKjV+sDbv6vA== + 0.9900000000000000000 + 177 + 1 + 1 + 1 + + + 2149 + Corduroy + Pearl Jam & Eddie Vedder + 305293 + TEdBxu9/0ErJ597v4w== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2150 + Given To Fly + Eddie Vedder & Mike McCready + 233613 + 4KgAm0WUqaSmI0Ojfe8= + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2151 + Hail, Hail + Stone Gossard & Eddie Vedder & Jeff Ament & Mike McCready + 223764 + opF2JRL+F96o3j2wyYWIFbdmuQ== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2152 + Daughter + Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder + 407484 + BAwftCdBqKAdgw== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2153 + Elderly Woman Behind The Counter In A Small Town + Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder + 229328 + AuGzJ1ZnydDUyA== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2154 + Untitled + Pearl Jam + 122801 + WLwH5OAfHg6LPMNvkpZx + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2155 + MFC + Eddie Vedder + 148192 + /tFWdsAlkjvPFg== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2156 + Go + Dave Abbruzzese & Jeff Ament & Stone Gossard & Mike McCready & Eddie Vedder + 161541 + Mq3tleW2O7NjrUJhiYIP + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2157 + Red Mosquito + Jeff Ament & Stone Gossard & Jack Irons & Mike McCready & Eddie Vedder + 242991 + Dz9xIJHkpsv/fVIJMyo= + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2158 + Even Flow + Stone Gossard & Eddie Vedder + 317100 + FcnB62Cdp925V+IO + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2159 + Off He Goes + Eddie Vedder + 343222 + vG/N87Etgvtd9cxNByKVZ2Qx + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2160 + Nothingman + Jeff Ament & Eddie Vedder + 278595 + OOEtmMeWrlloYbfJrtaSDpCv + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2161 + Do The Evolution + Eddie Vedder & Stone Gossard + 225462 + WAan0LfT9Z5ZehF2VSU= + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2162 + Better Man + Eddie Vedder + 246204 + 1TKO1wZdAtMamqUsHXd0Ew== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2163 + Black + Stone Gossard & Eddie Vedder + 415712 + twXZeZEQdcXS+FXeVutipEwA + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2164 + F*Ckin' Up + Neil Young + 377652 + gLipAVUyjDYRptcm5WcLvg== + 0.9900000000000000000 + 178 + 1 + 1 + 1 + + + 2165 + Life Wasted + Stone Gossard + 234344 + S+lEIhkSM2St9MOuQ4fRdg== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2166 + World Wide Suicide + Eddie Vedder + 209188 + k00NBIRGBNpkHvrRb3dLLA== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2167 + Comatose + Mike McCready & Stone Gossard + 139990 + WWK8PWemdZyoPciHzh8FsNDTvg== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2168 + Severed Hand + Eddie Vedder + 270341 + S8eiP0i08ziSPX14gjA= + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2169 + Marker In The Sand + Mike McCready + 263235 + brrXLKaXZ9sIPA== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2170 + Parachutes + Stone Gossard + 216555 + lv71IZ+kjHzHksB89bKyPQlrwA== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2171 + Unemployable + Matt Cameron & Mike McCready + 184398 + BZ3wl/X5phcY5OuZA/Ue9ENx + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2172 + Big Wave + Jeff Ament + 178573 + 2OsFaJyuPeJ681pdb0jsTQ== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2173 + Gone + Eddie Vedder + 249547 + DV4spv10Y+OmJ3k= + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2174 + Wasted Reprise + Stone Gossard + 53733 + k735mM3nY/80VOi3FiwkvYY= + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2175 + Army Reserve + Jeff Ament + 225567 + URenJublRPfbd6KF9Q== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2176 + Come Back + Eddie Vedder & Mike McCready + 329743 + xOLmNWHFoWCITg== + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2177 + Inside Job + Eddie Vedder & Mike McCready + 428643 + uXV0j9BQpV0p1WFY + 0.9900000000000000000 + 179 + 1 + 4 + 1 + + + 2178 + Can't Keep + Eddie Vedder + 219428 + 1xNT1gzsXa9fYfI0Re5cwdo= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2179 + Save You + Eddie Vedder/Jeff Ament/Matt Cameron/Mike McCready/Stone Gossard + 230112 + j1liLXDQaAom/A== + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2180 + Love Boat Captain + Eddie Vedder + 276453 + y7FjinheTXHLU5vxFFk= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2181 + Cropduster + Matt Cameron + 231888 + gVuKYUmbTuTS/wupo4Nu + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2182 + Ghost + Jeff Ament + 195108 + xmCGk6+Pqg== + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2183 + I Am Mine + Eddie Vedder + 215719 + jw9PD53zaE7UXE4= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2184 + Thumbing My Way + Eddie Vedder + 250226 + f8SzjH3NkA== + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2185 + You Are + Matt Cameron + 270863 + bbWq7lxR1ZCN + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2186 + Get Right + Matt Cameron + 158589 + Y/GwvdE6TD5G3pa81UY= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2187 + Green Disease + Eddie Vedder + 161253 + YYIBrfoW4v8= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2188 + Help Help + Jeff Ament + 215092 + X9plYLNMHtfBDfldXMHyeUA+ + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2189 + Bushleager + Stone Gossard + 237479 + svSw4GO6+8/T45OwgfKS + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2190 + 1/2 Full + Jeff Ament + 251010 + 99Xri/q/v/vHTdcFwA40udg= + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2191 + Arc + Pearl Jam + 65593 + TCqv+gGmtw== + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2192 + All or None + Stone Gossard + 277655 + S/QtXXhqyQ== + 0.9900000000000000000 + 180 + 1 + 1 + 1 + + + 2193 + Once + Stone Gossard + 231758 + +6NUsozyNA== + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2194 + Evenflow + Stone Gossard + 293720 + GBXj9g7Frtk= + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2195 + Alive + Stone Gossard + 341080 + JKVnrv3TRdR9dMo= + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2196 + Why Go + Jeff Ament + 200254 + atVsO1wSkGUlz1r1+eHrw8Fu + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2197 + Black + Dave Krusen/Stone Gossard + 343823 + RVSEU8RitQ== + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2198 + Jeremy + Jeff Ament + 318981 + 0A/dDn1q561Adrux + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2199 + Oceans + Jeff Ament/Stone Gossard + 162194 + HnSyVUtxtBvn + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2200 + Porch + Eddie Vedder + 210520 + Ew7uhHnlgqg= + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2201 + Garden + Jeff Ament/Stone Gossard + 299154 + pxTAVkjB3IsSM6tMBrzTJ+A= + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2202 + Deep + Jeff Ament/Stone Gossard + 258324 + /XnwAOLojcr/jg== + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2203 + Release + Jeff Ament/Mike McCready/Stone Gossard + 546063 + bce9zuIKnQ== + 0.9900000000000000000 + 181 + 1 + 1 + 1 + + + 2204 + Go + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 193123 + HWqTbuai5zs1DVEaXZkThC8= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2205 + Animal + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 169325 + pjHXyH3BTaal + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2206 + Daughter + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 235598 + 7X0jsjbKwmhqCgpe+61Xva4= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2207 + Glorified G + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 206968 + h9S0OZ/6Y2w= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2208 + Dissident + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 215510 + VezSID/8e0236Z/k + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2209 + W.M.A. + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 359262 + 16saJN1INg== + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2210 + Blood + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 170631 + ccAT2R7Qt7TeKU4= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2211 + Rearviewmirror + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 284186 + Q217l+rLYQ== + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2212 + Rats + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 255425 + X5/TDo/0/Qgeew== + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2213 + Elderly Woman Behind The Counter In A Small Town + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 196336 + GzVc4yu/RiArxJnZ + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2214 + Leash + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 189257 + URpPaS+DORLmt8s= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2215 + Indifference + Dave Abbruzzese/Eddie Vedder/Jeff Ament/Mike McCready/Stone Gossard + 302053 + 7ARKKdOulWMNMpTniVA= + 0.9900000000000000000 + 182 + 1 + 1 + 1 + + + 2216 + Johnny B. Goode + + 243200 + o6o1usbGFL10pZM= + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2217 + Don't Look Back + + 221100 + m0EJNX6QEj67/PZYFQN2sR4= + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2218 + Jah Seh No + + 276871 + Z+Dfq5ZosPwFC9hH1Q== + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2219 + I'm The Toughest + + 230191 + QNb6IQP8FVZ2EQ== + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2220 + Nothing But Love + + 221570 + p7PdpcJPYg== + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2221 + Buk-In-Hamm Palace + + 265665 + 7j2y+O+roYWC + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2222 + Bush Doctor + + 239751 + BmZzJnIXPwlUriJxEGnO + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2223 + Wanted Dread And Alive + + 260310 + 7rTSV0K7dannRo7dCnZid5LLbw== + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2224 + Mystic Man + + 353671 + qIBAxmW5+rR7fS1IKl+8 + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2225 + Coming In Hot + + 213054 + sitJS/HKPyyIYv7eS6o= + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2226 + Pick Myself Up + + 234684 + Rfoj5250DPGIwMA= + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2227 + Crystal Ball + + 309733 + aRlGsqu5dcVn + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2228 + Equal Rights Downpresser Man + + 366733 + JLndQBQ9A7scaNGe504Gd054pQ== + 0.9900000000000000000 + 141 + 1 + 8 + 1 + + + 2229 + Speak To Me/Breathe + Mason/Waters, Gilmour, Wright + 234213 + wIowndYTQq9TJQ== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2230 + On The Run + Gilmour, Waters + 214595 + 5XfD1WoKLV/P7g== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2231 + Time + Mason, Waters, Wright, Gilmour + 425195 + pFhbyjH3rDNq/Q== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2232 + The Great Gig In The Sky + Wright, Waters + 284055 + LMGaiT9qAfpTaPaS7A== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2233 + Money + Waters + 391888 + I3icbCAY1kvz5dhBC+FL + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2234 + Us And Them + Waters, Wright + 461035 + H7rYxUoCO+DLw17Um2StxW+j + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2235 + Any Colour You Like + Gilmour, Mason, Wright, Waters + 205740 + fw/GSeVI4M60sf1fH69PSQ== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2236 + Brain Damage + Waters + 230556 + uSbdIT27oV25ArCOOA== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2237 + Eclipse + Waters + 125361 + 0WfTy/RYcPN9aQ== + 0.9900000000000000000 + 183 + 1 + 1 + 1 + + + 2238 + ZeroVinteUm + + 315637 + hy/NYz4lSxtx + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2239 + Queimando Tudo + + 172591 + ScbsQlQk7Cs= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2240 + Hip Hop Rio + + 151536 + Lz98nyz3TONb8MzFqQ== + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2241 + Bossa + + 29048 + 7bWL1Pp63WVyxgaIoeeJnw== + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2242 + 100% HardCore + + 165146 + hMg2OfQLkKBs8kHwK6VGoFL+ + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2243 + Biruta + + 213263 + yFDxsGnKzLWYo1VkWru8 + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2244 + Mão Na Cabeça + + 202631 + /XI6+Kr7M42Im3RHIb/nT+k= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2245 + O Bicho Tá Pregando + + 171964 + 1+OSGM1uJ1b3/BaN5zVvXUku + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2246 + Adoled (Ocean) + + 185103 + BeLMHGMozVaF + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2247 + Seus Amigos + + 100858 + 2bwFe13j2LXlpcvRVAQ2d/o= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2248 + Paga Pau + + 197485 + P9jEdrk34xoKxy4= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2249 + Rappers Reais + + 202004 + /xiiwh5AERI= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2250 + Nega Do Cabelo Duro + + 121808 + UZaoZIhMNA== + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2251 + Hemp Family + + 205923 + yOXsLRkWrc9iA86YQg== + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2252 + Quem Me Cobrou? + + 121704 + EYb0pbIukeX2Zecq7UEbEjA= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2253 + Se Liga + + 410409 + rotC4UHC5gH08rs9Qno= + 0.9900000000000000000 + 184 + 1 + 17 + 1 + + + 2254 + Bohemian Rhapsody + Mercury, Freddie + 358948 + eIUhb+KaBQ== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2255 + Another One Bites The Dust + Deacon, John + 216946 + 4u+HRe8pbLNQ0uPpt5YvRQ== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2256 + Killer Queen + Mercury, Freddie + 182099 + v7A6nyq4I23jdLz6ok0= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2257 + Fat Bottomed Girls + May, Brian + 204695 + qI9f8rp899iIPmpqXg== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2258 + Bicycle Race + Mercury, Freddie + 183823 + j+JW3Dwj6ctduDZj2As= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2259 + You're My Best Friend + Deacon, John + 172225 + r7mthJNAKDc8irbI2A== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2260 + Don't Stop Me Now + Mercury, Freddie + 211826 + YL9NxN1TkmUeZipn3TGmvA== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2261 + Save Me + May, Brian + 228832 + pOsk2IW95stPZ6oZUYZaEQ== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2262 + Crazy Little Thing Called Love + Mercury, Freddie + 164231 + /Pjon/q4IUqbR1osY/aQgDM= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2263 + Somebody To Love + Mercury, Freddie + 297351 + 3bPZ2wJn+I3r50zM39BV + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2264 + Now I'm Here + May, Brian + 255346 + Na3Tt6kzAo7pdYuf7HEZ + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2265 + Good Old-Fashioned Lover Boy + Mercury, Freddie + 175960 + HnR8XUAg9oCnbcw= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2266 + Play The Game + Mercury, Freddie + 213368 + /c5nidafweI= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2267 + Flash + May, Brian + 168489 + fGiqsUrxjNtZoHnOsq5qUw== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2268 + Seven Seas Of Rhye + Mercury, Freddie + 170553 + gxS3UhA7Zsg= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2269 + We Will Rock You + Deacon, John/May, Brian + 122880 + Gg4ByE2wNuyhDNKs9Q== + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2270 + We Are The Champions + Mercury, Freddie + 180950 + aaRNzVJsSyD9Nt4crCtZbCw= + 0.9900000000000000000 + 185 + 1 + 1 + 1 + + + 2271 + We Will Rock You + May + 122671 + 6brXftqQU8mXxgw= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2272 + We Are The Champions + Mercury + 182883 + gUuN5U2twm4TXEX6EMvqMAM= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2273 + Sheer Heart Attack + Taylor + 207386 + kjXgjcI7V+rKvXqJ1IQU + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2274 + All Dead, All Dead + May + 190119 + tJKPx92sqr4xjXQ= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2275 + Spread Your Wings + Deacon + 275356 + bQ6lIsWLM9c= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2276 + Fight From The Inside + Taylor + 184737 + 84lRjWPiBPOJh8DmcQ== + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2277 + Get Down, Make Love + Mercury + 231235 + WKE8LuaKIlw1x3p9vBc= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2278 + Sleep On The Sidewalk + May + 187428 + w0lRPCHBCQ== + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2279 + Who Needs You + Deacon + 186958 + OXrJpcqnBbQ= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2280 + It's Late + May + 386194 + /PdNgIldTEw= + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2281 + My Melancholy Blues + Mercury + 206471 + llOKE+Um7JvFPm+p + 0.9900000000000000000 + 186 + 1 + 1 + 1 + + + 2282 + Shiny Happy People + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 226298 + VU5jA7Qd5Fe1MBKDgMTK1w== + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2283 + Me In Honey + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 246674 + 7ATvxiq2syWUork= + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2284 + Radio Song + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 255477 + 4cdETayi/x2GqS8= + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2285 + Pop Song 89 + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 185730 + A+Ejd49kYSLEi1FruokqmK/dHw== + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2286 + Get Up + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 160235 + KynTaM411CHLubRC1IfCSJM= + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2287 + You Are The Everything + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 226298 + lS9AlmlVddmTI3dmbqg= + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2288 + Stand + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 192862 + tDvaDbqpWZA/VwvXDw== + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2289 + World Leader Pretend + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 259761 + MsbhBXJH8DmV + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2290 + The Wrong Child + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 216633 + ffL0orGqZEsLuSBL6DvYkzueAQ== + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2291 + Orange Crush + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 231706 + Xn5mQ2BclmH7 + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2292 + Turn You Inside-Out + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 257358 + mXqmGo/ItLfflfLAzFU= + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2293 + Hairshirt + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 235911 + 596mLN8LUThWYf+LsUJUEwNP + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2294 + I Remember California + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 304013 + IKWkzqsQ34S/a0yeshHN + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2295 + Untitled + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 191503 + fu80G1ZIQlC4kDwD + 0.9900000000000000000 + 188 + 1 + 4 + 1 + + + 2296 + How The West Was Won And Where It Got Us + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 271151 + i4LvcCI10EI= + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2297 + The Wake-Up Bomb + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 308532 + +xwAhpLNCcNNeuPI1STO + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2298 + New Test Leper + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 326791 + U9hjVBUa1NwPNOlcLo/b/Tdv9A== + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2299 + Undertow + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 309498 + G8+1dEb0Q8E= + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2300 + E-Bow The Letter + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 324963 + rLVdITzPXWzt+eBI + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2301 + Leave + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 437968 + d17krZW9n+aR + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2302 + Departure + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 209423 + L7YYhCLuDiDXErxjfos78g== + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2303 + Bittersweet Me + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 245812 + fpBJdRPP91dXkJlfhSI= + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2304 + Be Mine + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 333087 + Gk4uayNKOw== + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2305 + Binky The Doormat + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 301688 + 39gJNWcU31hyo/0hVUfxHOY= + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2306 + Zither + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 154148 + LMpedcFR8INIL13QznVC + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2307 + So Fast, So Numb + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 252682 + apwKmY9DeDcmvIgA49NdEQ== + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2308 + Low Desert + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 212062 + Ax1wH2kXt0XkzK/7 + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2309 + Electrolite + Bill Berry-Peter Buck-Mike Mills-Michael Stipe + 245315 + 1YfeQ91VEg== + 0.9900000000000000000 + 189 + 1 + 1 + 1 + + + 2310 + Losing My Religion + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 269035 + kOlSJk4Fye+gddJLS8tY0fM= + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2311 + Low + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 296777 + hVJUq3fIPITnASKf9Qj/N3I= + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2312 + Near Wild Heaven + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 199862 + HvgbEu1VQ1bcr1YJ + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2313 + Endgame + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 230687 + DE/c0L/45A== + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2314 + Belong + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 247013 + ierJHcjNAH/K + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2315 + Half A World Away + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 208431 + E1gjs/rlcmX+aA== + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2316 + Texarkana + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 220081 + 64wu3dIVUBk4 + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2317 + Country Feedback + Bill Berry/Michael Stipe/Mike Mills/Peter Buck + 249782 + P43ClA1R9CWIQ9cSY0KxC1lV + 0.9900000000000000000 + 187 + 1 + 4 + 1 + + + 2318 + Carnival Of Sorts + R.E.M. + 233482 + XVr5fFKdXptA9rewZpIM1Mth + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2319 + Radio Free Aurope + R.E.M. + 245315 + 7JN+P3UkSNko6yw= + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2320 + Perfect Circle + R.E.M. + 208509 + vPsi2uVFEHD3r7azL9GTcX9X + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2321 + Talk About The Passion + R.E.M. + 203206 + 5ak7aGPfGoNYCcQ1rxQv+rVD + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2322 + So Central Rain + R.E.M. + 194768 + Jo668Sc93coQpJHXWdF+ + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2323 + Don't Go Back To Rockville + R.E.M. + 272352 + HIGSv/vKwrhmMnkHnwA= + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2324 + Pretty Persuasion + R.E.M. + 229929 + 3S7IMN8quBMqhRQK38YyamQx + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2325 + Green Grow The Rushes + R.E.M. + 225671 + EnkihLtczAKK9MPVKg== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2326 + Can't Get There From Here + R.E.M. + 220630 + zbOpkaCeG2RtaA== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2327 + Driver 8 + R.E.M. + 204747 + 58Di8jTHFNbS7V27 + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2328 + Fall On Me + R.E.M. + 172016 + DNQSKC4fZq/q+hESidnDkrE= + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2329 + I Believe + R.E.M. + 227709 + C7pK1JzpD1Usr/9YIm/4/4XMjA== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2330 + Cuyahoga + R.E.M. + 260623 + NU4BifzF0A== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2331 + The One I Love + R.E.M. + 197355 + q+5RQyA/UgFfNzcoGNjyt7CS + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2332 + The Finest Worksong + R.E.M. + 229276 + ohqJVPcFvni8uMHY1hkwqg== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2333 + It's The End Of The World As We Know It (And I Feel Fine) + R.E.M. + 244819 + Xbs34h32oA== + 0.9900000000000000000 + 190 + 1 + 4 + 1 + + + 2334 + Infeliz Natal + Rodolfo + 138266 + lGPaXVtJ2WruLsUh + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2335 + A Sua + Rodolfo + 142132 + WT5hx5VInV9h + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2336 + Papeau Nuky Doe + Rodolfo + 121652 + 6C60WfRa9IQj6QZioeQ= + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2337 + Merry Christmas + Rodolfo + 126040 + YG/obejqaomjBH3VG4iu + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2338 + Bodies + Rodolfo + 180035 + 7jNU8S+n7+QP+aqiN5M= + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2339 + Puteiro Em João Pessoa + Rodolfo + 195578 + nH2tNNi18XglfqQQVXY= + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2340 + Esporrei Na Manivela + Rodolfo + 293276 + 2ft05xguTfLruX8DXu8/x1E= + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2341 + Bê-a-Bá + Rodolfo + 249051 + DOFYbVTVTfy6LnOKlg== + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2342 + Cajueiro + Rodolfo + 158589 + bYofri5QeshOisF6WLKTieW2 + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2343 + Palhas Do Coqueiro + Rodolfo + 133851 + AEmVLGynnpocdB5/ + 0.9900000000000000000 + 191 + 1 + 4 + 1 + + + 2344 + Maluco Beleza + + 203206 + IuaV09CRmQGWQ5LOrNl8mmgwSQ== + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2345 + O Dia Em Que A Terra Parou + + 261720 + NpZQ2F6zB4+2 + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2346 + No Fundo Do Quintal Da Escola + + 177606 + VDAKYFdyHMC5VB1SagUDXb8= + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2347 + O Segredo Do Universo + + 192679 + If+zQ9XDKYyVvXQciglKOO8= + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2348 + As Profecias + + 232515 + xEuCCn2od/We5CxK + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2349 + Mata Virgem + + 142602 + AfM5bbaqEFpGNsvdX0ycyhMHMQ== + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2350 + Sapato 36 + + 196702 + oJl0SxeBC8zf + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2351 + Todo Mundo Explica + + 134896 + RWBK6HMpUJyTjt4HfRS2LB4= + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2352 + Que Luz É Essa + + 165067 + 2iuL3fo0NGd+ + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2353 + Diamante De Mendigo + + 206053 + VjWeRHoh8WuSd9hz + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2354 + Negócio É + + 175464 + d3OjN5kcYA== + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2355 + Muita Estrela, Pouca Constelação + + 268068 + 6mOv8rSZaGU= + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2356 + Século XXI + + 244897 + tAyqY0Ve75qMWyJLmqeDZrI= + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2357 + Rock Das Aranhas (Ao Vivo) (Live) + + 231836 + aVb9mkseWGvS71HGiIkFfMPMyA== + 0.9900000000000000000 + 192 + 1 + 1 + 1 + + + 2358 + The Power Of Equality + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 243591 + MRWznAzAPUlQvCuL + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2359 + If You Have To Ask + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 216790 + hf4OGBnBjAvaiwBIxg== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2360 + Breaking The Girl + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 295497 + mUUd47eenOI= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2361 + Funky Monks + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 323395 + o2COiuAOGxbDxsM= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2362 + Suck My Kiss + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 217234 + i/dkqQs7CleJs1RF7aQDM9g= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2363 + I Could Have Lied + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 244506 + 7GWjqmu4ijas/L51PYED + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2364 + Mellowship Slinky In B Major + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 240091 + Dk64OatikorL8A== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2365 + The Righteous & The Wicked + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 248084 + SZw7C+g+TtldX+GLrB/Ujw2YEw== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2366 + Give It Away + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 283010 + 0kIdlrR6nsmJ0xjfe6xBmnDx + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2367 + Blood Sugar Sex Magik + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 271229 + N+6opXAswwwa1g== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2368 + Under The Bridge + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 264359 + hPG3ejkGf6VWbp+FUIpHAg== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2369 + Naked In The Rain + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 265717 + AN06HhzC3IcqnKxp8Q== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2370 + Apache Rose Peacock + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 282226 + g/K2TiYnAHI6G8ua + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2371 + The Greeting Song + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 193593 + l2hYGikqsg== + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2372 + My Lovely Man + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 279118 + PJy0aC/a8g9p0jtlABw= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2373 + Sir Psycho Sexy + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 496692 + mjwg2g+Nox5Tglo= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2374 + They're Red Hot + Robert Johnson + 71941 + HtKCgj4+YEZVAeX3TA5j0Uk= + 0.9900000000000000000 + 193 + 1 + 4 + 1 + + + 2375 + By The Way + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 218017 + NGd71b7dCVCj + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2376 + Universally Speaking + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 259213 + mX1h5dSW1D0= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2377 + This Is The Place + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 257906 + T/0noNU9mFYojQE= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2378 + Dosed + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 312058 + 0tXETfPJSRSkee4= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2379 + Don't Forget Me + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 277995 + 4a3XoAAitg== + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2380 + The Zephyr Song + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 232960 + Jen5kg3HpZclh+DDoVTHqA== + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2381 + Can't Stop + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 269400 + mOHMiylC1Q6Mvidm+A== + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2382 + I Could Die For You + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 193906 + BdbHBOjbMkAsI7HuHZkq+Q== + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2383 + Midnight + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 295810 + 5S8DZ0HqrvymJIOBCH0xLDDa + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2384 + Throw Away Your Television + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 224574 + 2VDfzGpXtajZOiU= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2385 + Cabron + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 218592 + 5JIxQjb17sTsGQdBt6+/ + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2386 + Tear + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 317413 + pYDC7L4+HzwG + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2387 + On Mercury + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 208509 + mRCMQdTCgec= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2388 + Minor Thing + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 217835 + 7tc7+jZBFv8= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2389 + Warm Tape + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 256653 + SJ0UupiRAll3OX6lc/Q70w== + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2390 + Venice Queen + Anthony Kiedis, Flea, John Frusciante, and Chad Smith + 369110 + 3jerREXA0BDRS2qFi6qoPl4= + 0.9900000000000000000 + 194 + 1 + 1 + 1 + + + 2391 + Around The World + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 238837 + aU7ed/o+ew== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2392 + Parallel Universe + Red Hot Chili Peppers + 270654 + SGn5euIAJttj3lR8 + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2393 + Scar Tissue + Red Hot Chili Peppers + 217469 + 3EOqx0aY1OuO1mYUANGEfWc= + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2394 + Otherside + Red Hot Chili Peppers + 255973 + bMn7eGcWVmlp + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2395 + Get On Top + Red Hot Chili Peppers + 198164 + sEfJ6uLxjAs0sLSmpg== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2396 + Californication + Red Hot Chili Peppers + 321671 + uZKTZeEuol77oeiy + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2397 + Easily + Red Hot Chili Peppers + 231418 + ZNyTcd0udTtGDHwyDw== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2398 + Porcelain + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 163787 + eUi2iMYinL7Ug/CHO7xS + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2399 + Emit Remmus + Red Hot Chili Peppers + 240300 + KAIv6ScuoD7XdzEjc4YWMtLoKA== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2400 + I Like Dirt + Red Hot Chili Peppers + 157727 + RRghkGqlBxCAVg== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2401 + This Velvet Glove + Red Hot Chili Peppers + 225280 + uej65HkDJR1KqHexT/F5Sk4= + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2402 + Savior + Anthony Kiedis/Chad Smith/Flea/John Frusciante + 292493 + vbRSlD0GD+Cef4Injw== + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2403 + Purple Stain + Red Hot Chili Peppers + 253440 + gYN3OnmhnC+sy91s + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2404 + Right On Time + Red Hot Chili Peppers + 112613 + ZtKe8Fq4pMI= + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2405 + Road Trippin' + Red Hot Chili Peppers + 205635 + oSWr89WZZKab + 0.9900000000000000000 + 195 + 1 + 1 + 1 + + + 2406 + The Spirit Of Radio + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 299154 + GLkwy3k/0a3PjgiHtg== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2407 + The Trees + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 285126 + OagN/44nbuv73+FSjw== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2408 + Something For Nothing + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 240770 + zAPLBS+5VBM2Bw== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2409 + Freewill + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 324362 + sYkL1DSYGm7auQ== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2410 + Xanadu + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 667428 + jGQYdLUsvlDpJq9L + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2411 + Bastille Day + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 280528 + zMICV/x8JnIF2tydYhfGRw== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2412 + By-Tor And The Snow Dog + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 519888 + 5LTMn3Zm7bsEJ1XlHf4= + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2413 + Anthem + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 264515 + PisIcZXCcV6TuYaJO9Y= + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2414 + Closer To The Heart + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 175412 + FfcJIkL7fkBVXBWc91Q= + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2415 + 2112 Overture + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 272718 + jejc2143DlSxBHJWOeXv3A== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2416 + The Temples Of Syrinx + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 133459 + 5LIRXdv7uwbA6rIVfw== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2417 + La Villa Strangiato + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 577488 + eQnCLJ6tYHgbBg== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2418 + Fly By Night + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 202318 + WB3QpURaZQ== + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2419 + Finding My Way + Geddy Lee And Alex Lifeson/Geddy Lee And Neil Peart/Rush + 305528 + ZLhFQ3Kx7CDUnk1cPjHe + 0.9900000000000000000 + 196 + 1 + 1 + 1 + + + 2420 + Jingo + M.Babatunde Olantunji + 592953 + THa5US9RbJcKuoPe + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2421 + El Corazon Manda + E.Weiss + 713534 + YXuPTJUbbjTF + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2422 + La Puesta Del Sol + E.Weiss + 628062 + e7GMi9nNqmQmPtdYzaEUUBM= + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2423 + Persuasion + Carlos Santana + 318432 + rji3LQ41cyK9 + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2424 + As The Years Go by + Albert King + 233064 + qRVww4YnPZ+ixZLJX1Y= + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2425 + Soul Sacrifice + Carlos Santana + 296437 + nxMJre04RQghhoyXTqJWGLYQmw== + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2426 + Fried Neckbones And Home Fries + W.Correa + 638563 + EM4U0aZkdK1NueXZYNBvImp10A== + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2427 + Santana Jam + Carlos Santana + 882834 + Yw1OPfmP7/xLrdu5xA== + 0.9900000000000000000 + 197 + 1 + 1 + 1 + + + 2428 + Evil Ways + + 475402 + S9D/NwaIw5i6aKCzN30zNK1B + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2429 + We've Got To Get Together/Jingo + + 1070027 + w1cDf9bXF3V3YaDe + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2430 + Rock Me + + 94720 + FMWEnyMybkcUy1LmnEZYcskX/w== + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2431 + Just Ain't Good Enough + + 850259 + eQFESFAoYO4TSzYaiXWfcQ== + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2432 + Funky Piano + + 934791 + lBF70/evjLGZOZG/A61J + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2433 + The Way You Do To Mer + + 618344 + RLITgDxO+tF/M8g= + 0.9900000000000000000 + 198 + 1 + 1 + 1 + + + 2434 + Holding Back The Years + Mick Hucknall and Neil Moss + 270053 + OFwnpuZ5NQaE + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2435 + Money's Too Tight To Mention + John and William Valentine + 268408 + glG3l7fvzy8Qnex6RQ== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2436 + The Right Thing + Mick Hucknall + 262687 + i/G8RRapU8Pm+Hk8EerZiXg= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2437 + It's Only Love + Jimmy and Vella Cameron + 232594 + G34wwcmllgoCUA== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2438 + A New Flame + Mick Hucknall + 237662 + K6e9F2Ua9L3v + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2439 + You've Got It + Mick Hucknall and Lamont Dozier + 235232 + 23K+a78de97lVYclqV7Gkson + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2440 + If You Don't Know Me By Now + Kenny Gamble and Leon Huff + 206524 + rwunA6C6UbskrM/kzIhTQAtx + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2441 + Stars + Mick Hucknall + 248137 + CocaLBz7nA== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2442 + Something Got Me Started + Mick Hucknall and Fritz McIntyre + 239595 + /V9Q0lDNpkDjNG8d + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2443 + Thrill Me + Mick Hucknall and Fritz McIntyre + 303934 + bWJXMRZwup1WHrsgdB2Pld8= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2444 + Your Mirror + Mick Hucknall + 240666 + CAS0U1vT2n4XJkhvDJxUpZw= + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2445 + For Your Babies + Mick Hucknall + 256992 + w/oGiuFpp0GVsduvFqoE + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2446 + So Beautiful + Mick Hucknall + 298083 + Zxn8GgaDV5dYlA== + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2447 + Angel + Carolyn Franklin and Sonny Saunders + 240561 + 5xIfzM+BatLkhH0jSqwaPiii + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2448 + Fairground + Mick Hucknall + 263888 + D51qYjQ6qIEdP6Nu + 0.9900000000000000000 + 141 + 1 + 1 + 1 + + + 2449 + Água E Fogo + Chico Amaral/Edgard Scandurra/Samuel Rosa + 278987 + TRS/LnXkDC2r2CAk6Q== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2450 + Três Lados + Chico Amaral/Samuel Rosa + 233665 + sW3rRS/08IS3fA== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2451 + Ela Desapareceu + Chico Amaral/Samuel Rosa + 250122 + 6pIm/0yTQRZM1Q== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2452 + Balada Do Amor Inabalável + Fausto Fawcett/Samuel Rosa + 240613 + 7OvIQ5Y6Y8RKPktE + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2453 + Canção Noturna + Chico Amaral/Lelo Zanettik + 238628 + FDH5dHlAyFw= + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2454 + Muçulmano + Leão, Rodrigo F./Samuel Rosa + 249600 + f4tS5i1eRd4OnCB7gP99 + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2455 + Maquinarama + Chico Amaral/Samuel Rosa + 245629 + XrUg8jFxnk0v6xuZzZ0L + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2456 + Rebelião + Chico Amaral/Samuel Rosa + 298527 + 2alsPPCvDAQ= + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2457 + A Última Guerra + Leão, Rodrigo F./Lô Borges/Samuel Rosa + 314723 + azCuJHuTMXuIGg== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2458 + Fica + Chico Amaral/Samuel Rosa + 272169 + p2oSDuwFtkJD + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2459 + Ali + Nando Reis/Samuel Rosa + 306390 + EXGRE6HXk0H6r6gbc8VA7w== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2460 + Preto Damião + Chico Amaral/Samuel Rosa + 264568 + s1fpHkSCgGVvl11Q6w== + 0.9900000000000000000 + 199 + 1 + 1 + 1 + + + 2461 + É Uma Partida De Futebol + Samuel Rosa + 1071 + ysHTWr8dENq8njqNa+KM9kzN/A== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2462 + Eu Disse A Ela + Samuel Rosa + 254223 + A+tajczuEa4yQDXxD7beWg== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2463 + Zé Trindade + Samuel Rosa + 247954 + a4HSGNmaSuS3F53ZeEqQUw8= + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2464 + Garota Nacional + Samuel Rosa + 317492 + 32ZGjdALYqd8aEl+tQM= + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2465 + Tão Seu + Samuel Rosa + 243748 + VuBLKcIqUBCpFddz1Q== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2466 + Sem Terra + Samuel Rosa + 279353 + 9aWd/8D/9Fnesca2MR7img== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2467 + Os Exilados + Samuel Rosa + 245551 + YZqnIWpEKU3Ljladd/iYje4= + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2468 + Um Dia Qualquer + Samuel Rosa + 292414 + wqt/9AQ9/QGaYwz5MS0O3A== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2469 + Los Pretos + Samuel Rosa + 239229 + 2S2YimF0svVwnbxnuC4pQpg= + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2470 + Sul Da América + Samuel Rosa + 254928 + 77lslWokaKnGQNE= + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2471 + Poconé + Samuel Rosa + 318406 + KI6ag79fVvthN8z/k59BmuI04w== + 0.9900000000000000000 + 200 + 1 + 1 + 1 + + + 2472 + Lucky 13 + Billy Corgan + 189387 + mQ4fIwhDw3MhuK1x + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2473 + Aeroplane Flies High + Billy Corgan + 473391 + E3UtzTVvyeycvrft + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2474 + Because You Are + Billy Corgan + 226403 + AsvjzseRXRvDGg== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2475 + Slow Dawn + Billy Corgan + 192339 + d3p7nOLaqYpa3H8pEw== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2476 + Believe + James Iha + 192940 + rcUZyf1QZw== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2477 + My Mistake + Billy Corgan + 240901 + m0H4kFPxGxQ= + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2478 + Marquis In Spades + Billy Corgan + 192731 + UFu+VrrzLQrCFS2SkYKhzwEZzA== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2479 + Here's To The Atom Bomb + Billy Corgan + 266893 + UcXJB0DeOqRR + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2480 + Sparrow + Billy Corgan + 176822 + t25G1C7OVQ== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2481 + Waiting + Billy Corgan + 228336 + 8tHsvzs7OqMKvlfAUddP0baKkQ== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2482 + Saturnine + Billy Corgan + 229877 + Fdy5ibg6Xb9LvA== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2483 + Rock On + David Cook + 366471 + 0nqKJ/pWkQ== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2484 + Set The Ray To Jerry + Billy Corgan + 249364 + js2d1HxMkTXgH3QdpA== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2485 + Winterlong + Billy Corgan + 299389 + nmEWGGMHAN57V01qhEXGsA== + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2486 + Soot & Stars + Billy Corgan + 399986 + eyQAA+h4Bz08 + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2487 + Blissed & Gone + Billy Corgan + 286302 + BXyf15+vlds= + 0.9900000000000000000 + 201 + 1 + 4 + 1 + + + 2488 + Siva + Billy Corgan + 261172 + EOLyioqwUkWGEshLbzDL+fmk + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2489 + Rhinocerous + Billy Corgan + 353462 + tukO2yfg+2HbgK4= + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2490 + Drown + Billy Corgan + 270497 + 7mqdn3GImXZTljI= + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2491 + Cherub Rock + Billy Corgan + 299389 + K3PblUzU3aULXA== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2492 + Today + Billy Corgan + 202213 + PwIHyqqOTnbE2Fc= + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2493 + Disarm + Billy Corgan + 198556 + 4NGRWXBfLQ== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2494 + Landslide + Stevie Nicks + 190275 + ILeNsLQEZRUH + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2495 + Bullet With Butterfly Wings + Billy Corgan + 257306 + CK6RRF6car7v5w== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2496 + 1979 + Billy Corgan + 263653 + H26o05n6xLt7bA== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2497 + Zero + Billy Corgan + 161123 + 3XYFiHVXFqYp + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2498 + Tonight, Tonight + Billy Corgan + 255686 + byHPqEibc/TvsnBG4QBI5A== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2499 + Eye + Billy Corgan + 294530 + GgmhWYw2wtAbP9YnE6dJvco= + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2500 + Ava Adore + Billy Corgan + 261433 + TdkqUV9Rxou51ZeUBA== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2501 + Perfect + Billy Corgan + 203023 + kXr7nIjf4+oN2Cxc + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2502 + The Everlasting Gaze + Billy Corgan + 242155 + zdsKJogXUfsLssmqT5MA + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2503 + Stand Inside Your Love + Billy Corgan + 253753 + 7DmGO5eWmaysNerLYstSJAK0+Q== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2504 + Real Love + Billy Corgan + 250697 + rq8OfbNEhccy8g== + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2505 + (Untitled) + Billy Corgan + 231784 + TONtIZ6mIQU2Ql56Uyw= + 0.9900000000000000000 + 202 + 1 + 4 + 1 + + + 2506 + Nothing To Say + Chris Cornell/Kim Thayil + 238027 + mD9gpKebmU/OPSoJhw== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2507 + Flower + Chris Cornell/Kim Thayil + 208822 + ENF5uvye5w== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2508 + Loud Love + Chris Cornell + 297456 + qrN+4a7CbVA1 + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2509 + Hands All Over + Chris Cornell/Kim Thayil + 362475 + UC2rRmeNSp2zk5/jc5yZsg== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2510 + Get On The Snake + Chris Cornell/Kim Thayil + 225123 + cOS/Vo6do5WsJsXs1g== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2511 + Jesus Christ Pose + Ben Shepherd/Chris Cornell/Kim Thayil/Matt Cameron + 352966 + fQhvuFqnymnsb1/qVFXGP+FI + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2512 + Outshined + Chris Cornell + 312476 + nPxrdWXCkAewuw== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2513 + Rusty Cage + Chris Cornell + 267728 + hLDcsiHbBOQ/ClwH+FD2 + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2514 + Spoonman + Chris Cornell + 248476 + SU3ObEV98DrlEpIJ9smfGQ== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2515 + The Day I Tried To Live + Chris Cornell + 321175 + heuvDqE06jv9CfFA9XIlbx5G + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2516 + Black Hole Sun + Soundgarden + 320365 + 4U4hB8CizA== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2517 + Fell On Black Days + Chris Cornell + 282331 + SPvtdWpCWA== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2518 + Pretty Noose + Chris Cornell + 253570 + ZUaVpxnkMUg= + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2519 + Burden In My Hand + Chris Cornell + 292153 + /vrvoG2a2A== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2520 + Blow Up The Outside World + Chris Cornell + 347898 + 5TdgZOPvbA== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2521 + Ty Cobb + Ben Shepherd/Chris Cornell + 188786 + JaFAD5SG/Z3/wCiIn6D9HdiTwQ== + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2522 + Bleed Together + Chris Cornell + 232202 + 3W7bYBXyhQr3DoFXKdL0QvE4 + 0.9900000000000000000 + 203 + 1 + 1 + 1 + + + 2523 + Morning Dance + Jay Beckenstein + 238759 + ePxRoK1xT+NFOkOLUC7E97Y= + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2524 + Jubilee + Jeremy Wall + 275147 + 3/qiAfKl8D7RX8yruyyfsw== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2525 + Rasul + Jeremy Wall + 238315 + q4vOLe/GDj/QtIIwKWTbPnsRPg== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2526 + Song For Lorraine + Jay Beckenstein + 240091 + dgqsr26g7xeafhbrneUZaw== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2527 + Starburst + Jeremy Wall + 291500 + me80k8Ii8G0Op/vxbD8aYQ== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2528 + Heliopolis + Jay Beckenstein + 338729 + 0qHfHr9O1velUZ2Wk0RL + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2529 + It Doesn't Matter + Chet Catallo + 270027 + VuIiCqq06A== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2530 + Little Linda + Jeremy Wall + 264019 + QWD49CUtP/yKJw== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2531 + End Of Romanticism + Rick Strauss + 320078 + eIvJ2qBdnA== + 0.9900000000000000000 + 204 + 1 + 2 + 1 + + + 2532 + The House Is Rockin' + Doyle Bramhall/Stevie Ray Vaughan + 144352 + 0FLWe2OvgRVd+FfLHbg= + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2533 + Crossfire + B. Carter/C. Layton/R. Ellsworth/R. Wynans/T. Shannon + 251219 + 3F5W4tF4EqEMazHT5I0= + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2534 + Tightrope + Doyle Bramhall/Stevie Ray Vaughan + 281155 + gawNmBdoauWURKQX + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2535 + Let Me Love You Baby + Willie Dixon + 164127 + BDNc9b9m7HtK + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2536 + Leave My Girl Alone + B. Guy + 256365 + yqS+scoPMtyciFR3qg== + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2537 + Travis Walk + Stevie Ray Vaughan + 140826 + haG8cXnBnS1hMJ3ZDzsUfaCNNg== + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2538 + Wall Of Denial + Doyle Bramhall/Stevie Ray Vaughan + 336927 + QvNZt6DVYmgHjo2NiJ5wHqp7 + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2539 + Scratch-N-Sniff + Doyle Bramhall/Stevie Ray Vaughan + 163422 + id6dQ40U8f/3xx/nx0B6e5FH + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2540 + Love Me Darlin' + C. Burnett + 201586 + 0aNfNCXSog9Rccv20iWLrVKlsA== + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2541 + Riviera Paradise + Stevie Ray Vaughan + 528692 + oq/Wa6Dop8VMDiPe1qWqXio= + 0.9900000000000000000 + 205 + 1 + 6 + 1 + + + 2542 + Dead And Bloated + R. DeLeo/Weiland + 310386 + d3HrBKCOK9FMwjyTJ9Xge2Ih + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2543 + Sex Type Thing + D. DeLeo/Kretz/Weiland + 218723 + 85M9KtzDQk7sHy17LII= + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2544 + Wicked Garden + D. DeLeo/R. DeLeo/Weiland + 245368 + LT/gng9HP8+c5Ym45k39Wg== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2545 + No Memory + Dean Deleo + 80613 + iJA2FjpGDkFdQD6yHkY= + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2546 + Sin + R. DeLeo/Weiland + 364800 + EX6noZvDEoW0xKBFUwpcAA== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2547 + Naked Sunday + D. DeLeo/Kretz/R. DeLeo/Weiland + 229720 + xOnznEyS8vnS + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2548 + Creep + R. DeLeo/Weiland + 333191 + sgcAHH2eeadnpQ== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2549 + Piece Of Pie + R. DeLeo/Weiland + 324623 + v391CoJSmgC6Ng== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2550 + Plush + R. DeLeo/Weiland + 314017 + P0/tNVNzxA== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2551 + Wet My Bed + R. DeLeo/Weiland + 96914 + tKfIZmB+s6cjp9pj9A== + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2552 + Crackerman + Kretz/R. DeLeo/Weiland + 194403 + kgVpfZHJQFg= + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2553 + Where The River Goes + D. DeLeo/Kretz/Weiland + 505991 + FyawyLEvSEs= + 0.9900000000000000000 + 206 + 1 + 1 + 1 + + + 2554 + Soldier Side - Intro + Dolmayan, John/Malakian, Daron/Odadjian, Shavo + 63764 + 4nvwtPYYFIzPqndZ4NMM5Lzo + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2555 + B.Y.O.B. + Tankian, Serj + 255555 + 1eL7rFuusT+vtQJ42ls= + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2556 + Revenga + Tankian, Serj + 228127 + gHhq3g5QaAT6leE= + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2557 + Cigaro + Tankian, Serj + 131787 + N1Ok5PRGfHUj58+UBUXZZdbN + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2558 + Radio/Video + Dolmayan, John/Malakian, Daron/Odadjian, Shavo + 249312 + nP0LUpR53tl6bN0A + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2559 + This Cocaine Makes Me Feel Like I'm On This Song + Tankian, Serj + 128339 + eg556wvRDTFe5rCYqdXYyHcD + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2560 + Violent Pornography + Dolmayan, John/Malakian, Daron/Odadjian, Shavo + 211435 + LWNFoisBEGo= + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2561 + Question! + Tankian, Serj + 200698 + bQEIRua4GvbL7Vk= + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2562 + Sad Statue + Tankian, Serj + 205897 + vwE9F1u56qQFEQJpr9Oz + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2563 + Old School Hollywood + Dolmayan, John/Malakian, Daron/Odadjian, Shavo + 176953 + bE7q+2f3xFzdarE= + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2564 + Lost in Hollywood + Tankian, Serj + 320783 + uuL9iqkpbWIIi9BHJcUR + 0.9900000000000000000 + 207 + 1 + 3 + 1 + + + 2565 + The Sun Road + Terry Bozzio, Steve Stevens, Tony Levin + 880640 + /5+WEwTmig== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2566 + Dark Corners + Terry Bozzio, Steve Stevens, Tony Levin + 513541 + Al6cyDzhOfAI+A== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2567 + Duende + Terry Bozzio, Steve Stevens, Tony Levin + 447582 + IxN4v4ZlUSzgfqPVoQ== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2568 + Black Light Syndrome + Terry Bozzio, Steve Stevens, Tony Levin + 526471 + aF091J7t1Fc= + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2569 + Falling in Circles + Terry Bozzio, Steve Stevens, Tony Levin + 549093 + iEuMpSUmUd8+LdztSIbgEK6yug== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2570 + Book of Hours + Terry Bozzio, Steve Stevens, Tony Levin + 583366 + /16I++LUg/scagsUy5Pwcw== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2571 + Chaos-Control + Terry Bozzio, Steve Stevens, Tony Levin + 529841 + vywFjp5kqMX4H9Zdww== + 0.9900000000000000000 + 208 + 1 + 1 + 1 + + + 2572 + Midnight From The Inside Out + Chris Robinson/Rich Robinson + 286981 + OhqtgCnCkcNQolXD + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2573 + Sting Me + Chris Robinson/Rich Robinson + 268094 + IscitJZsF+6GtBpg+eA16rStng== + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2574 + Thick & Thin + Chris Robinson/Rich Robinson + 222720 + etD6HRLGsWf83GI425CF/tVrQA== + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2575 + Greasy Grass River + Chris Robinson/Rich Robinson + 218749 + rAC0ZZMgMOFc2Q== + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2576 + Sometimes Salvation + Chris Robinson/Rich Robinson + 389146 + 9bdqWlHMBaHPuq/yqVHhhGk= + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2577 + Cursed Diamonds + Chris Robinson/Rich Robinson + 368300 + NxRJba2seg== + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2578 + Miracle To Me + Chris Robinson/Rich Robinson + 372636 + lIryltALI0Bt + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2579 + Wiser Time + Chris Robinson/Rich Robinson + 459990 + cTU0MdDJcDb9DgoU + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2580 + Girl From A Pawnshop + Chris Robinson/Rich Robinson + 404688 + m8aGJMRShwq94DU4 + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2581 + Cosmic Fiend + Chris Robinson/Rich Robinson + 308401 + rznqo89p5GATMyYFRH/9dq9sEQ== + 0.9900000000000000000 + 209 + 1 + 6 + 1 + + + 2582 + Black Moon Creeping + Chris Robinson/Rich Robinson + 359314 + 2FbPSeZe7eV2tFX/+VU= + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2583 + High Head Blues + Chris Robinson/Rich Robinson + 371879 + NkxaPqAvUIiSXx+A04o= + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2584 + Title Song + Chris Robinson/Rich Robinson + 505521 + DnQjt6JYaaC8cHv/6V/eJww= + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2585 + She Talks To Angels + Chris Robinson/Rich Robinson + 361978 + ZMYqVS1wUYfNPenH3hpa + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2586 + Twice As Hard + Chris Robinson/Rich Robinson + 275565 + peDbQbPBzaud + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2587 + Lickin' + Chris Robinson/Rich Robinson + 314409 + JTBnKbQ4EpFuw2m4Rw== + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2588 + Soul Singing + Chris Robinson/Rich Robinson + 233639 + ZhqKLLb0kWGkBrn9S8s7ovl/tw== + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2589 + Hard To Handle + A.Isbell/A.Jones/O.Redding + 206994 + SyAgpImxtUyrlnnsmSja + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2590 + Remedy + Chris Robinson/Rich Robinson + 337084 + NqD0qTzDjA== + 0.9900000000000000000 + 210 + 1 + 6 + 1 + + + 2591 + White Riot + Joe Strummer/Mick Jones + 118726 + cLbsRlbLyukB6A== + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2592 + Remote Control + Joe Strummer/Mick Jones + 180297 + RvrmowU+RbUNjA== + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2593 + Complete Control + Joe Strummer/Mick Jones + 192653 + YyLwomtYiw4iiJS+ + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2594 + Clash City Rockers + Joe Strummer/Mick Jones + 227500 + 0sRu9uDMkOuxwZSe + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2595 + (White Man) In Hammersmith Palais + Joe Strummer/Mick Jones + 240640 + /e5q9w1+1KNSyVa0X3Fe8g== + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2596 + Tommy Gun + Joe Strummer/Mick Jones + 195526 + 37E7sdBB0E7VQfzg + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2597 + English Civil War + Mick Jones/Traditional arr. Joe Strummer + 156708 + YVsDG1ucpCp6FemQ + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2598 + I Fought The Law + Sonny Curtis + 159764 + +hhCgFox+Ori42OeLK2ZqDc= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2599 + London Calling + Joe Strummer/Mick Jones + 199706 + 2MKgaPqwRBXCTptkm1Eh + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2600 + Train In Vain + Joe Strummer/Mick Jones + 189675 + RrgMVebL6Mc= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2601 + Bankrobber + Joe Strummer/Mick Jones + 272431 + eJ98L+4KgULYEQ== + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2602 + The Call Up + The Clash + 324336 + 35EdkTtEbg== + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2603 + Hitsville UK + The Clash + 261433 + T31HEn3bZuGb4lcN2tjpgRE= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2604 + The Magnificent Seven + The Clash + 268486 + 5tNEGSLDP1JxtJo= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2605 + This Is Radio Clash + The Clash + 249756 + GaFcPngBMYz+U4go5l8= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2606 + Know Your Rights + The Clash + 217678 + A/MGqJx/c16aZTVag9Iq + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2607 + Rock The Casbah + The Clash + 222145 + sUcgyLawm2DnUITJkksc + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2608 + Should I Stay Or Should I Go + The Clash + 187219 + wkI8X2sM/fumQ8HZQ6atutM= + 0.9900000000000000000 + 211 + 1 + 4 + 1 + + + 2609 + War (The Process) + Billy Duffy/Ian Astbury + 252630 + 1uDFl8pTV6bBTPs= + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2610 + The Saint + Billy Duffy/Ian Astbury + 216215 + y09JAZhAlsv+pQ== + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2611 + Rise + Billy Duffy/Ian Astbury + 219088 + JCFz7sIdQKLK9qh1O20reOgHxQ== + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2612 + Take The Power + Billy Duffy/Ian Astbury + 235755 + sQD9d3KQQQ== + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2613 + Breathe + Billy Duffy/Ian Astbury/Marti Frederiksen/Mick Jones + 299781 + bCMH6zCWoXVXZJWI + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2614 + Nico + Billy Duffy/Ian Astbury + 289488 + qjGyItoNk23IrcQ5Wpgk + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2615 + American Gothic + Billy Duffy/Ian Astbury + 236878 + +3wy2zI1pu4= + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2616 + Ashes And Ghosts + Billy Duffy/Bob Rock/Ian Astbury + 300591 + RKTMtSGEcjzKB85KVJiC + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2617 + Shape The Sky + Billy Duffy/Ian Astbury + 209789 + oaR1Q7LW/n1RW+di + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2618 + Speed Of Light + Billy Duffy/Bob Rock/Ian Astbury + 262817 + TnSKxGaVace4pyhR/ZCR + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2619 + True Believers + Billy Duffy/Ian Astbury + 308009 + 2abjryyQkTGqCm2mTw== + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2620 + My Bridges Burn + Billy Duffy/Ian Astbury + 231862 + xZ0PjnuSRIbuAhnn6fxM + 0.9900000000000000000 + 212 + 1 + 1 + 1 + + + 2621 + She Sells Sanctuary + + 253727 + tUZsJ3i0A7KAvQ== + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2622 + Fire Woman + + 312790 + WBlcKMJ4VOKLQW4U/g== + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2623 + Lil' Evil + + 165825 + UrjhlkWnleS4VSc6J+sQmVwNvg== + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2624 + Spirit Walker + + 230060 + 622S2lZvlBrAsEY= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2625 + The Witch + + 258768 + bRYl/CIbOxU= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2626 + Revolution + + 256026 + dGAGAIhQadHy5Q== + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2627 + Wild Hearted Son + + 266893 + Vk4l5CYGQNYTeiMIDvXMEMUU + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2628 + Love Removal Machine + + 257619 + QNKoY3cNi9nNHitIzsrl3B4= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2629 + Rain + + 236669 + QdUb22QC0lBY + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2630 + Edie (Ciao Baby) + + 241632 + C7s/o717pI6t + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2631 + Heart Of Soul + + 274207 + rtebLXO35zFVPSkZrh8= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2632 + Love + + 326739 + PltlbaaQJ7STzRE= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2633 + Wild Flower + + 215536 + h4tSJlcuM0M= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2634 + Go West + + 238158 + Ou1nrRqh+hrO + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2635 + Resurrection Joe + + 255451 + DR8ffyA+IAdbhyIHX2LY + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2636 + Sun King + + 368431 + pgIW0ep73BsDbf7Ai+8smcTaAw== + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2637 + Sweet Soul Sister + + 212009 + aAwy5zYn17tGM40= + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2638 + Earth Mofo + + 282200 + 1Lr7+AP9CJJD + 0.9900000000000000000 + 213 + 1 + 1 + 1 + + + 2639 + Break on Through + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 149342 + e7JAX3xrWolD + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2640 + Soul Kitchen + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 215066 + Xhn3mdAvm8OjINTQ3/js0PQ0lg== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2641 + The Crystal Ship + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 154853 + 0nF8ZJB/ptaq + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2642 + Twentienth Century Fox + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 153913 + Yb3vCaa7w2En1GFE7yIvq9NHcw== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2643 + Alabama Song + Weill-Brecht + 200097 + dybzfLLtnZMJUInFGDe/Fw== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2644 + Light My Fire + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 428329 + 1lIxDZIMwWWOgVk05KteYv/0Og== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2645 + Back Door Man + Willie Dixon, C. Burnett + 214360 + cle4HS9Y10s= + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2646 + I Looked At You + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 142080 + K7hiF8r99UKe5BoxFg== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2647 + End Of The Night + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 172695 + bENeJKQqYhlChU1uf5k= + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2648 + Take It As It Comes + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 137168 + 3To0dsliyfYdGq4= + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2649 + The End + Robby Krieger, Ray Manzarek, John Densmore, Jim Morrison + 701831 + IGAPH5hbMw== + 0.9900000000000000000 + 214 + 1 + 1 + 1 + + + 2650 + Roxanne + G M Sumner + 192992 + 2tE0MiA6EXXdyVx+XC7BquW6 + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2651 + Can't Stand Losing You + G M Sumner + 181159 + wKJMQQr2wUG5M2W0EktMOAw= + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2652 + Message in a Bottle + G M Sumner + 291474 + AlWOUVQZU70wDPGfZA== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2653 + Walking on the Moon + G M Sumner + 302080 + 3Q5yqo6QKQ== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2654 + Don't Stand so Close to Me + G M Sumner + 241031 + X/hYQXcUSjIP9rSk4mW+b04z7Q== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2655 + De Do Do Do, De Da Da Da + G M Sumner + 247196 + xbRQGc4r1gTZoqo= + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2656 + Every Little Thing She Does is Magic + G M Sumner + 261120 + 3Mb2lvgSoT4= + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2657 + Invisible Sun + G M Sumner + 225593 + /v376sBXeE8DW1o= + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2658 + Spirit's in the Material World + G M Sumner + 181133 + 3XaqqD5yTD1GWW1LOMccbih3 + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2659 + Every Breath You Take + G M Sumner + 254615 + ka7Yx7dVLw== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2660 + King Of Pain + G M Sumner + 300512 + 1F601kZP2f5QSw== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2661 + Wrapped Around Your Finger + G M Sumner + 315454 + uZ9VAS2lj6+x+ToJJosfyfQ= + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2662 + Don't Stand So Close to Me '86 + G M Sumner + 293590 + rvNTD2R335GDJvtfyMsjOw== + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2663 + Message in a Bottle (new classic rock mix) + G M Sumner + 290951 + nDytqyInpX0V + 0.9900000000000000000 + 215 + 1 + 1 + 1 + + + 2664 + Time Is On My Side + Jerry Ragavoy + 179983 + VI5KJ4bk+qJXmqo73SGbIQ== + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2665 + Heart Of Stone + Jagger/Richards + 164493 + s1Iwb+brzoOMRw== + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2666 + Play With Fire + Nanker Phelge + 132022 + i8yukk/eiwI4/3V6zinLoBJgXw== + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2667 + Satisfaction + Jagger/Richards + 226612 + EAC+8SrkKm6je6P6naEWiw== + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2668 + As Tears Go By + Jagger/Richards/Oldham + 164284 + GOz/lpjpaT7XYUUa + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2669 + Get Off Of My Cloud + Jagger/Richards + 176013 + uyMsu0iLDrxnarMdX71ce90= + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2670 + Mother's Little Helper + Jagger/Richards + 167549 + Ez+0+nNg9XcXVLNTg+RT + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2671 + 19th Nervous Breakdown + Jagger/Richards + 237923 + v4DN4ViKfTCxgks= + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2672 + Paint It Black + Jagger/Richards + 226063 + OSsNw/kzMto= + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2673 + Under My Thumb + Jagger/Richards + 221387 + wa/MxtFzuQgU587JB/0= + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2674 + Ruby Tuesday + Jagger/Richards + 197459 + rfzViMKESfEVfD7rR/BZ + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2675 + Let's Spend The Night Together + Jagger/Richards + 217495 + snjB/dEBG4YX + 0.9900000000000000000 + 216 + 1 + 1 + 1 + + + 2676 + Intro + Jagger/Richards + 49737 + J5ybfK8xLTEV/V6q + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2677 + You Got Me Rocking + Jagger/Richards + 205766 + Eni9t0mThw== + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2678 + Gimmie Shelters + Jagger/Richards + 382119 + GLqXHFFFAAqs4E5x/1ysVpjM + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2679 + Flip The Switch + Jagger/Richards + 252421 + vhXbW/AIYK+FE0rR + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2680 + Memory Motel + Jagger/Richards + 365844 + j1AO4gNgXewt + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2681 + Corinna + Jesse Ed Davis III/Taj Mahal + 257488 + aBwPORi1zGcefYfJ + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2682 + Saint Of Me + Jagger/Richards + 325694 + PV6nFPCWevZiD1vhrk7K + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2683 + Wainting On A Friend + Jagger/Richards + 302497 + OG4gkO1yP+DOR/k= + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2684 + Sister Morphine + Faithfull/Jagger/Richards + 376215 + rCtUbMXy0YNbS20= + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2685 + Live With Me + Jagger/Richards + 234893 + sjAGDbRXaWcBE+YOZjg= + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2686 + Respectable + Jagger/Richards + 215693 + yh/GRamcwUo3u+8bu3xH9+wB + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2687 + Thief In The Night + De Beauport/Jagger/Richards + 337266 + 3rxsMix33ZG3mERGBY2DBmOV + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2688 + The Last Time + Jagger/Richards + 287294 + w7jx5s9RxDs= + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2689 + Out Of Control + Jagger/Richards + 479242 + 6roc+gybWg== + 0.9900000000000000000 + 217 + 1 + 1 + 1 + + + 2690 + Love Is Strong + Jagger/Richards + 230896 + Xu2ZzssKCbHydemOOHbjYeY9 + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2691 + You Got Me Rocking + Jagger/Richards + 215928 + 7Nad4Gg7L6f8 + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2692 + Sparks Will Fly + Jagger/Richards + 196466 + SjppMtCndfw3+K3nNQ== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2693 + The Worst + Jagger/Richards + 144613 + 3NqsdXTWuhPOiW3cwQ0x + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2694 + New Faces + Jagger/Richards + 172146 + m2MMNKc7f1xozm5lrkVkBaDABA== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2695 + Moon Is Up + Jagger/Richards + 222119 + jroyJsI2a+DE8+Y= + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2696 + Out Of Tears + Jagger/Richards + 327418 + yqRdSdoANKE= + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2697 + I Go Wild + Jagger/Richards + 264019 + UAymaFRliSRoPAEJowThMeY= + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2698 + Brand New Car + Jagger/Richards + 256052 + cc+fl3XoBpoK6Boqn4tjMg== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2699 + Sweethearts Together + Jagger/Richards + 285492 + roy9bdHiu1u35V4moHsY9I7D + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2700 + Suck On The Jugular + Jagger/Richards + 268225 + u7mXvWG5W6AKPpx1pnHGMqQ= + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2701 + Blinded By Rainbows + Jagger/Richards + 273946 + BaDs5Dy+A6d0aWwBNhHI + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2702 + Baby Break It Down + Jagger/Richards + 249417 + d4QXzlyzdUGxHQ== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2703 + Thru And Thru + Jagger/Richards + 375092 + b7i12Ulzy4gi5Q== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2704 + Mean Disposition + Jagger/Richards + 249155 + fNm6ukXxNA== + 0.9900000000000000000 + 218 + 1 + 1 + 1 + + + 2705 + Walking Wounded + The Tea Party + 277968 + CIqsFPlBG9bMUSqq + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2706 + Temptation + The Tea Party + 205087 + H6KT7r6PIw== + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2707 + The Messenger + Daniel Lanois + 212062 + aomlrKAHPhShbYQNqBSQw6S7mA== + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2708 + Psychopomp + The Tea Party + 315559 + nf42+DqjXTYn + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2709 + Sister Awake + The Tea Party + 343875 + h2ERep0BBmg= + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2710 + The Bazaar + The Tea Party + 222458 + Od3BK+SlnYoKEdBKAvc= + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2711 + Save Me (Remix) + The Tea Party + 396303 + 8GtSrXH8qQfs1eYi+y52j7w7 + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2712 + Fire In The Head + The Tea Party + 306337 + Xk/c01JSnA== + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2713 + Release + The Tea Party + 244114 + UyRXgYRpG4oyrln2XY/V + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2714 + Heaven Coming Down + The Tea Party + 241867 + Vf2DolyTgRMOoJmmE5gAWtXiVg== + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2715 + The River (Remix) + The Tea Party + 343170 + lVNiuN+jROFjRATO + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2716 + Babylon + The Tea Party + 169795 + B31Uz/q9wKJDc+PQ + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2717 + Waiting On A Sign + The Tea Party + 261903 + dpqu/iF6OfI= + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2718 + Life Line + The Tea Party + 277786 + ApvKwrhOoLA= + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2719 + Paint It Black + Keith Richards/Mick Jagger + 214752 + nMotDBqri9o= + 0.9900000000000000000 + 219 + 1 + 4 + 1 + + + 2720 + Temptation + The Tea Party + 205244 + lkBS4H7nai2qMw== + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2721 + Army Ants + The Tea Party + 215405 + I4qVhsd7uAQ4BHEC + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2722 + Psychopomp + The Tea Party + 317231 + qEcGR2l/AnM= + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2723 + Gyroscope + The Tea Party + 177711 + VaOx7CEd4leLo21LpxE1pkSe + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2724 + Alarum + The Tea Party + 298187 + hqIgJD6/NzfhIsM= + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2725 + Release + The Tea Party + 266292 + MPHcNfLV21mbIuB5zZRHATXQoQ== + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2726 + Transmission + The Tea Party + 317257 + 4Q/spDR+ci3q5gA0x3g8Wg== + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2727 + Babylon + The Tea Party + 292466 + 3EPRaUVYY8KmV6p4NQEQgZ4= + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2728 + Pulse + The Tea Party + 250253 + IQQ4AHRirW+0IauxVFjsN1iN + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2729 + Emerald + The Tea Party + 289750 + upu2iOKOJsi1tOQ= + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2730 + Aftermath + The Tea Party + 343745 + sygvGlaS3M5vvNajQhb0A1GL + 0.9900000000000000000 + 220 + 1 + 4 + 1 + + + 2731 + I Can't Explain + Pete Townshend + 125152 + qIKw461qe1VxTZn3utA= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2732 + Anyway, Anyhow, Anywhere + Pete Townshend, Roger Daltrey + 161253 + 94glPZWkfL5h/sUTRsuZI3c= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2733 + My Generation + John Entwistle/Pete Townshend + 197825 + tjxtA0WBr9s8aoHVxBvSEB4= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2734 + Substitute + Pete Townshend + 228022 + 3RT2WizDT+XoVzSK1yoi + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2735 + I'm A Boy + Pete Townshend + 157126 + BJTE9EOkjbpnET2LOapANqwuRQ== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2736 + Boris The Spider + John Entwistle + 149472 + M1sQqbNfmVimspJXs/YXPksq + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2737 + Happy Jack + Pete Townshend + 132310 + OYY78hqGw6s+Fv7dqeS/mqg= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2738 + Pictures Of Lily + Pete Townshend + 164414 + G0DkCzUTtH4= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2739 + I Can See For Miles + Pete Townshend + 262791 + 2EKSAuqCBgzc9w== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2740 + Magic Bus + Pete Townshend + 197224 + 9SLvs1tCqNU= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2741 + Pinball Wizard + John Entwistle/Pete Townshend + 181890 + cvNcb7ow6Q== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2742 + The Seeker + Pete Townshend + 204643 + LlEnPpug62irFBNaow== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2743 + Baba O'Riley + John Entwistle/Pete Townshend + 309472 + 4qI+jvhQMK/ya98= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2744 + Won't Get Fooled Again (Full Length Version) + John Entwistle/Pete Townshend + 513750 + c+TmIke6mcLdis8qWoIESq8= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2745 + Let's See Action + Pete Townshend + 243513 + lHpFmhC5MA== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2746 + 5.15 + Pete Townshend + 289619 + N5gSfl68XgU= + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2747 + Join Together + Pete Townshend + 262556 + B4KIzFnB4PpY0hM0dUzlAA== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2748 + Squeeze Box + Pete Townshend + 161280 + 12VQ2NMs8huDAK9eLBPMVA== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2749 + Who Are You (Single Edit Version) + John Entwistle/Pete Townshend + 299232 + /MgmYTq4ZZ+4 + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2750 + You Better You Bet + Pete Townshend + 338520 + HPfBSyx+mQ== + 0.9900000000000000000 + 221 + 1 + 1 + 1 + + + 2751 + Primavera + Genival Cassiano/Silvio Rochael + 126615 + +bVUNFWWsdbBMJwrv0ffHw== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2752 + Chocolate + Tim Maia + 194690 + HdljnKzrORpF1SPBtIPgkg== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2753 + Azul Da Cor Do Mar + Tim Maia + 197955 + 0p4CyHKPr2T3NAONKNQXofwPpA== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2754 + O Descobridor Dos Sete Mares + Gilson Mendonça/Michel + 262974 + SE3KGhkPwY0UDK27mZA= + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2755 + Até Que Enfim Encontrei Você + Tim Maia + 105064 + QR2Hq0mzN7S2NQ== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2756 + Coroné Antonio Bento + Do Vale, João/Luiz Wanderley + 131317 + HQALH7hzPFvmhdTnrmLOIlDrhg== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2757 + New Love + Tim Maia + 237897 + 85df1oR1ZFqDEJgT5YzywIH1VA== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2758 + Não Vou Ficar + Tim Maia + 172068 + fz2p8Gw22Eh7kefJL+2ZhaE= + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2759 + Música No Ar + Tim Maia + 158511 + m0MP4djW7MA= + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2760 + Salve Nossa Senhora + Carlos Imperial/Edardo Araújo + 115461 + IXAOoFuXTci27m9qTpwb3/E= + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2761 + Você Fugiu + Genival Cassiano + 238367 + z+T382wfTFkQ + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2762 + Cristina Nº 2 + Carlos Imperial/Tim Maia + 90148 + nWXTA6w0tths + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2763 + Compadre + Tim Maia + 171389 + jDLiJOOXMctMpvQC5qwc + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2764 + Over Again + Tim Maia + 200489 + CS0D7lMBhg== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2765 + Réu Confesso + Tim Maia + 217391 + K1Eba70Z5UNyAZ2dAdIQ1e2BDQ== + 0.9900000000000000000 + 222 + 1 + 7 + 1 + + + 2766 + O Que Me Importa + + 153155 + Npp+JufQKog= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2767 + Gostava Tanto De Você + + 253805 + fZyKq7/5kXzGDTLAsI8= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2768 + Você + + 242599 + D3/aNx0uAdLzHOyQ + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2769 + Não Quero Dinheiro + + 152607 + 9ITt711u9WQS8ULZflgn + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2770 + Eu Amo Você + + 242782 + 2qmFC5gWZ/bza6Z8 + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2771 + A Festa Do Santo Reis + + 159791 + lo/Sab+HQR9DY0Kagf2Ol12e1Q== + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2772 + I Don't Know What To Do With Myself + + 221387 + XRlyZ4U53R33+/HIeJl7YQ== + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2773 + Padre Cícero + + 139598 + cL/R5VSWRUJwFxjYXpXN0KI= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2774 + Nosso Adeus + + 206471 + fRxq5IWpJChHcnk= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2775 + Canário Do Reino + + 139337 + 54ItJ+3eBPQIgi0kFCHERJhlIw== + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2776 + Preciso Ser Amado + + 174001 + 1Sz9RASLOic= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2777 + Balanço + + 209737 + LE7TyE4wlqs2qO7MrmT670U= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2778 + Preciso Aprender A Ser Só + + 162220 + Y+Tgj+FOgUy7hOgjYaTc + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2779 + Esta É A Canção + + 184450 + 3DRaXMXxLphivQ== + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2780 + Formigueiro + + 252943 + LCfHA1W+vNZC4JxshEYCdBE= + 0.9900000000000000000 + 223 + 1 + 7 + 1 + + + 2781 + Comida + Titãs + 322612 + E0ZK73uHxpXp + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2782 + Go Back + Titãs + 230504 + crZHLSQaVSTzgZJkpc6aUj/H + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2783 + Prá Dizer Adeus + Titãs + 222484 + FcN8HNVOd+o= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2784 + Família + Titãs + 218331 + qz88wNWyY4uYb0hq8d2AkDCvoQ== + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2785 + Os Cegos Do Castelo + Titãs + 296829 + VChI/77URvWZcd6sLxh5tETSjw== + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2786 + O Pulso + Titãs + 199131 + ag66z35rJOX7jKWf1m7og/c9AQ== + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2787 + Marvin + Titãs + 264359 + a27yJ5GcOthkzEtdIK4= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2788 + Nem 5 Minutos Guardados + Titãs + 245995 + RW54gVKwYfkNzD/WwTD1 + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2789 + Flores + Titãs + 215510 + B9COh/sckj7iMUs= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2790 + Palavras + Titãs + 158458 + L0FHfihcohR/vK5QCnTkWlI= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2791 + Hereditário + Titãs + 151693 + eaduEESNkSYVKds5nyFk + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2792 + A Melhor Forma + Titãs + 191503 + ysuEwK5kjeE8SiI+fYc= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2793 + Cabeça Dinossauro + Titãs + 37120 + OOwct6QSHvy67QFHeTlF + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2794 + 32 Dentes + Titãs + 184946 + jOspqhjWkRcVGo3T+WpTqY7x + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2795 + Bichos Escrotos (Vinheta) + Titãs + 104986 + TYJpwM6rz8rTrB0Up/Y= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2796 + Não Vou Lutar + Titãs + 189988 + lVJT3B5hWgU= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2797 + Homem Primata (Vinheta) + Titãs + 34168 + iYRLA0+ZV7iHlfg= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2798 + Homem Primata + Titãs + 195500 + Iitb/kkLvmr4BeXcy9UBVrHSQQ== + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2799 + Polícia (Vinheta) + Titãs + 56111 + fcc2SmDLezlVZIw= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2800 + Querem Meu Sangue + Titãs + 212401 + /pRyJvjd1FY= + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2801 + Diversão + Titãs + 285936 + mqqEnm44eQ== + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2802 + Televisão + Titãs + 293668 + AQa1VAYcW/QQ + 0.9900000000000000000 + 224 + 1 + 4 + 1 + + + 2803 + Sonifera Ilha + Branco Mello/Carlos Barmack/Ciro Pessoa/Marcelo Fromer/Toni Belloto + 170684 + fZCEFZN50943Y9pd1P3rVuMdsg== + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2804 + Lugar Nenhum + Arnaldo Antunes/Charles Gavin/Marcelo Fromer/Sérgio Britto/Toni Bellotto + 195840 + 8ZMBoVNd1773eBYy5z5XxReF + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2805 + Sua Impossivel Chance + Nando Reis + 246622 + CsqQABa9ow== + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2806 + Desordem + Charles Gavin/Marcelo Fromer/Sérgio Britto + 213289 + t2iwOD1CZa3pj+PBNqIV5g== + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2807 + Não Vou Me Adaptar + Arnaldo Antunes + 221831 + TKh2laYlP10= + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2808 + Domingo + Sérgio Britto/Toni Bellotto + 208613 + p+Fgk+rjsCofVUc/ + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2809 + Amanhã Não Se Sabe + Sérgio Britto + 189440 + 74KQbTYzw98= + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2810 + Caras Como Eu + Toni Bellotto + 183092 + tKlByRUtnRBC + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2811 + Senhora E Senhor + Arnaldo Anutnes/Marcelo Fromer/Paulo Miklos + 203702 + 2jaag01WpP8R + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2812 + Era Uma Vez + Arnaldo Anutnes/Branco Mello/Marcelo Fromer/Sergio Brotto/Toni Bellotto + 224261 + gsCff3O49AQ57wuZJz8stw== + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2813 + Miséria + Arnaldo Antunes/Britto, SergioMiklos, Paulo + 262191 + Ic2DjQ8S1WSi + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2814 + Insensível + Sérgio Britto + 207830 + /kMWkTSy0+X0CcFWXDiZ + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2815 + Eu E Ela + Nando Reis + 276035 + UmVADltWlgWD + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2816 + Toda Cor + Ciro Pressoa/Marcelo Fromer + 209084 + jn5zrckb0GT1wCJe1+dTWTit + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2817 + É Preciso Saber Viver + Erasmo Carlos/Roberto Carlos + 251115 + ynFK9DjAcCOU+Q== + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2818 + Senhor Delegado/Eu Não Aguento + Antonio Lopes + 156656 + rRAOAiRVckY= + 0.9900000000000000000 + 225 + 1 + 4 + 1 + + + 2819 + Battlestar Galactica: The Story So Far + + 2622250 + poX4Q9i09I4= + 1.9900000000000000000 + 226 + 3 + 18 + 2 + + + 2820 + Occupation / Precipice + + 5286953 + ugEe6Xa4wESKOu1Z+A== + 1.9900000000000000000 + 227 + 3 + 19 + 2 + + + 2821 + Exodus, Pt. 1 + + 2621708 + ak0TEU/Vw/7n8W3oRA== + 1.9900000000000000000 + 227 + 3 + 19 + 2 + + + 2822 + Exodus, Pt. 2 + + 2618000 + BhuDy+HJ2fiJxJo= + 1.9900000000000000000 + 227 + 3 + 19 + 2 + + + 2823 + Collaborators + + 2626626 + Qd/LN1nmrkmO9sWipLmWvBk= + 1.9900000000000000000 + 227 + 3 + 19 + 2 + + + 2824 + Torn + + 2631291 + fI1zSD1utiF4LmJyw053 + 1.9900000000000000000 + 227 + 3 + 19 + 2 + + + 2825 + A Measure of Salvation + + 2563938 + k+Mzr5iGOvvqD1XhJigzHd5dSA== + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2826 + Hero + + 2713755 + 4vihXIA3bg== + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2827 + Unfinished Business + + 2622038 + 5hszdiqqJbKJapT1UnheLhjV + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2828 + The Passage + + 2623875 + UPpFk2YGaheb + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2829 + The Eye of Jupiter + + 2618750 + 1i5gGLoVztzftnsCgZRz + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2830 + Rapture + + 2624541 + UrppmnNDqzwehaCHzXA= + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2831 + Taking a Break from All Your Worries + + 2624207 + k4pwsjw03Zhij1E5Hn9N + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2832 + The Woman King + + 2626376 + sSCds7CtAM2TgiP6 + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2833 + A Day In the Life + + 2620245 + dEYPbvXoeBDiN5Q= + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2834 + Dirty Hands + + 2627961 + IQcLIgmMvNAL72cvvRDliQ== + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2835 + Maelstrom + + 2622372 + HrkQ42LuSA== + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2836 + The Son Also Rises + + 2621830 + yyiW1WnP6Ak9 + 1.9900000000000000000 + 227 + 3 + 18 + 2 + + + 2837 + Crossroads, Pt. 1 + + 2622622 + pvWrifZmKSmF3w== + 1.9900000000000000000 + 227 + 3 + 20 + 2 + + + 2838 + Crossroads, Pt. 2 + + 2869953 + sOUD7m3Dfg== + 1.9900000000000000000 + 227 + 3 + 20 + 2 + + + 2839 + Genesis + + 2611986 + kr8Ywt8+YyX7oh9+JoCCPpQ= + 1.9900000000000000000 + 228 + 3 + 19 + 2 + + + 2840 + Don't Look Back + + 2571154 + lcOpuTloaWIb + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2841 + One Giant Leap + + 2607649 + k+b8DGqFq8+NMstLkkA= + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2842 + Collision + + 2605480 + hmVguTBjxVo= + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2843 + Hiros + + 2533575 + Lbva2IWwWX0iIJIUphMUoNWzsA== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2844 + Better Halves + + 2573031 + K0oxaIuyAgio6w== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2845 + Nothing to Hide + + 2605647 + zoyG3q+r0knd2U4ocQ== + 1.9900000000000000000 + 228 + 3 + 19 + 2 + + + 2846 + Seven Minutes to Midnight + + 2613988 + GeBSTBlasBT4SuM= + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2847 + Homecoming + + 2601351 + cUzTrVDVNz/EhyA0ZfUCadKH3Q== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2848 + Six Months Ago + + 2602852 + v7py0rC8j5A= + 1.9900000000000000000 + 228 + 3 + 19 + 2 + + + 2849 + Fallout + + 2594761 + uZM7+yU6hXYviHjw + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2850 + The Fix + + 2600266 + 6pK/HeYjWEZC + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2851 + Distractions + + 2590382 + bcDKttoB/ZRGpw== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2852 + Run! + + 2602602 + CvPkOT+7ffOj/mQ= + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2853 + Unexpected + + 2598139 + jNDfEpLVazjqdyLOOlqDqnQy + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2854 + Company Man + + 2601226 + Mkgi357a5Kdo2lKecg== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2855 + Company Man + + 2601101 + jz3m+u9qvtpvJZPRFv7lONJ+ + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2856 + Parasite + + 2602727 + CjHpavBBN64uAw== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 2857 + A Tale of Two Cities + + 2636970 + l9iwxascnbCFxzU= + 1.9900000000000000000 + 229 + 3 + 19 + 2 + + + 2858 + Lost (Pilot, Part 1) (Premiere) + + 2548875 + 2f1MzcTmwjAI1C0= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2859 + Man of Science, Man of Faith (Premiere) + + 2612250 + 1qXT9bm3vJDWEg== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2860 + Adrift + + 2564958 + uiFRUsiaIvmq1A== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2861 + Lost (Pilot, Part 2) + + 2436583 + EGykdHPHbNNUwqtH7g== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2862 + The Glass Ballerina + + 2637458 + SKf2zQqkgcdvkatyk/mV5g== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2863 + Further Instructions + + 2563980 + g5P9lWdRRET0JAO9yw/ZY01/8w== + 1.9900000000000000000 + 229 + 3 + 19 + 2 + + + 2864 + Orientation + + 2609083 + K58vV0n9EsgANA== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2865 + Tabula Rasa + + 2627105 + Pm3nJ7Twb+FWsogVgH4Jow== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2866 + Every Man for Himself + + 2637387 + 0g5GeaG7r+NjpQ== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2867 + Everybody Hates Hugo + + 2609192 + aT57Q8CxxE/j5yVy3Z2deaI= + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2868 + Walkabout + + 2587370 + r9k/WZD28e74nLI4RFBLI3c= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2869 + ...And Found + + 2563833 + NkVVzrm6wJqsnGnbBEIMWbM= + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2870 + The Cost of Living + + 2637500 + DRCthVHSuCecqqPU + 1.9900000000000000000 + 229 + 3 + 19 + 2 + + + 2871 + White Rabbit + + 2571965 + uiaFQ1004R+FmPVJVQ== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2872 + Abandoned + + 2587041 + HZhwK+qcfhVnabDzgxWSHRU= + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2873 + House of the Rising Sun + + 2590032 + 2HSvtX7/ryXSrYh3uDv8TQ== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2874 + I Do + + 2627791 + jyx/uDiopL4bkmqwy41ogg== + 1.9900000000000000000 + 229 + 3 + 19 + 2 + + + 2875 + Not In Portland + + 2637303 + ceDVZxlxfMTK0Y3wsXT2NnkC + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2876 + Not In Portland + + 2637345 + lj6fzAr3Y2xFdAYfH/Q= + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2877 + The Moth + + 2631327 + yht3NHW7AvNu1xbOag== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2878 + The Other 48 Days + + 2610625 + c3pSinfsvtEUynC2BDdQw7Ft + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2879 + Collision + + 2564916 + 96rbvkWMNZNLMfQ= + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2880 + Confidence Man + + 2615244 + KPlO0fm0lagI + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2881 + Flashes Before Your Eyes + + 2636636 + +AatxL+2y6OqJanTcg== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2882 + Lost Survival Guide + + 2632590 + l7wM/UJYc58f1ke9tWVW + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2883 + Solitary + + 2612894 + HMXy+7HUEYHNfsenhw== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2884 + What Kate Did + + 2610250 + S1WG2zk9p5dmr4dY + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2885 + Raised By Another + + 2590459 + 1nwCAGZNmgjj4HfCw6uLLw== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2886 + Stranger In a Strange Land + + 2636428 + kMwYUIvxNtorGGiEX0N0WA== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2887 + The 23rd Psalm + + 2610416 + OgTLfWFZ7A== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2888 + All the Best Cowboys Have Daddy Issues + + 2555492 + Z3UOGHaRHGeiH7pAlg== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2889 + The Hunting Party + + 2611333 + i8slOjQyg4SdAw== + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2890 + Tricia Tanaka Is Dead + + 2635010 + 1XCGZEUvcg== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2891 + Enter 77 + + 2629796 + iiR7KMG0h0wdvCO5GFfveQBYJg== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2892 + Fire + Water + + 2600333 + uULi2AuvoSGVAw== + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2893 + Whatever the Case May Be + + 2616410 + 8EcUDCcPomOFreZmyA== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2894 + Hearts and Minds + + 2619462 + SlB9gQ1j7QhNckc= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2895 + Par Avion + + 2629879 + oxwSE2a2GmAzcQRLyGld9A== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2896 + The Long Con + + 2679583 + d9PcGl/BXySfh59u5/qh + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2897 + One of Them + + 2698791 + 5WyGUXJHL0xoRdhLMbmj + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2898 + Special + + 2618530 + +WfVnmsnQ1uy78YvevFLd2I= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2899 + The Man from Tallahassee + + 2637637 + 4v3Xoi4wow== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2900 + Exposé + + 2593760 + shnoFPLl45l0gCQCWb0= + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2901 + Homecoming + + 2515882 + Kp+DgADSdvph6KrWpi5X + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2902 + Maternity Leave + + 2780416 + pfvbdSpznfzgS+B8y1I= + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2903 + Left Behind + + 2635343 + LSXUrQKrr6K9Ox6GLEcPPWsdRg== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2904 + Outlaws + + 2619887 + B31I/rcChp+18fouD4h8sdE= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2905 + The Whole Truth + + 2610125 + VI71WB46C+xxtdEOdF6F01iw3A== + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2906 + ...In Translation + + 2604575 + 9QAkD+3LQfB3o8td + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2907 + Lockdown + + 2610250 + 6sm3iK5eDvLKkNE= + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2908 + One of Us + + 2638096 + p32bqTsvzNX7i1Np5mtS+Bt1 + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2909 + Catch-22 + + 2561394 + 6nSiiZXNS6pRzuMrcFNB + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2910 + Dave + + 2825166 + TqVGPHP+iG9fdQ== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2911 + Numbers + + 2609772 + okILFddUwudZ + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2912 + D.O.C. + + 2616032 + 8wXc8IV6Bhdf4xak + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 2913 + Deus Ex Machina + + 2582009 + BFPVOVnr7DIpIA== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2914 + S.O.S. + + 2639541 + qGdGuQzWrWzoQVqfaUvuhIFY + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2915 + Do No Harm + + 2618487 + kTj+HQfCARtp+23RyeVdRw== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2916 + Two for the Road + + 2610958 + NE0LiTapu+Ops2zta2Zq2iqORg== + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2917 + The Greater Good + + 2617784 + Sj72CrpEcHtwkbkLBNBQM0x2Ww== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2918 + "?" + + 2782333 + QjpdDpUt/ZUC9p9X + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2919 + Born to Run + + 2618619 + ndP1VgDO8jk= + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2920 + Three Minutes + + 2763666 + cxj6YOmaFQ== + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2921 + Exodus (Part 1) + + 2620747 + jbQyuGcP4eh0jUbbeXnxYg== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2922 + Live Together, Die Alone, Pt. 1 + + 2478041 + Zvxb3UynaVUCxg== + 1.9900000000000000000 + 231 + 3 + 21 + 2 + + + 2923 + Exodus (Part 2) (Season Finale) + + 2605557 + FDREYn/LaOskXjbEE26LQaxd + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2924 + Live Together, Die Alone, Pt. 2 + + 2656531 + +SaYbIKeullBDMliZEic1EA= + 1.9900000000000000000 + 231 + 3 + 19 + 2 + + + 2925 + Exodus (Part 3) (Season Finale) + + 2619869 + 41utEAY9lTA4R2/AZb33Ow== + 1.9900000000000000000 + 230 + 3 + 19 + 2 + + + 2926 + Zoo Station + U2 + 276349 + HnzIwcTEcg== + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2927 + Even Better Than The Real Thing + U2 + 221361 + 3lv70nt3mUv4 + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2928 + One + U2 + 276192 + ARnpH1rWUmVy6oGmDGs= + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2929 + Until The End Of The World + U2 + 278700 + e35Yd4YfljvpKOKZ + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2930 + Who's Gonna Ride Your Wild Horses + U2 + 316551 + vdDVdG309Q== + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2931 + So Cruel + U2 + 349492 + 4/4h8W9eUoilN06Qqf/4 + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2932 + The Fly + U2 + 268982 + 1HGpa90A93g99KihFAw5 + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2933 + Mysterious Ways + U2 + 243826 + dQWYfzaFF8BEsw== + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2934 + Tryin' To Throw Your Arms Around The World + U2 + 232463 + 8ZMJtL3Yk6D7 + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2935 + Ultraviolet (Light My Way) + U2 + 330788 + ikTiB6i0erWwc5n9NhqjZngLTg== + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2936 + Acrobat + U2 + 270288 + 6CYqvQblM0DqyQ== + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2937 + Love Is Blindness + U2 + 263497 + az7N6sG1eI3RnAqTP6nzXe4Q + 0.9900000000000000000 + 232 + 1 + 1 + 1 + + + 2938 + Beautiful Day + Adam Clayton, Bono, Larry Mullen, The Edge + 248163 + X4hSoWJkGiUB + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2939 + Stuck In A Moment You Can't Get Out Of + Adam Clayton, Bono, Larry Mullen, The Edge + 272378 + gDrL5vItv2gw4rH/ + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2940 + Elevation + Adam Clayton, Bono, Larry Mullen, The Edge + 227552 + fL3ekuoTEoc= + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2941 + Walk On + Adam Clayton, Bono, Larry Mullen, The Edge + 296280 + L5Nq+Bmda4amkHc= + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2942 + Kite + Adam Clayton, Bono, Larry Mullen, The Edge + 266893 + UGE/rU18NPS+LaZfCw== + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2943 + In A Little While + Adam Clayton, Bono, Larry Mullen, The Edge + 219271 + 44PRLxLuOzsLN3z6FCH9 + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2944 + Wild Honey + Adam Clayton, Bono, Larry Mullen, The Edge + 226768 + PCCIsixbnuWdl90= + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2945 + Peace On Earth + Adam Clayton, Bono, Larry Mullen, The Edge + 288496 + hwHtCuxDuee1d36JjhVW + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2946 + When I Look At The World + Adam Clayton, Bono, Larry Mullen, The Edge + 257776 + MFJnEvcU8YXXWamH + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2947 + New York + Adam Clayton, Bono, Larry Mullen, The Edge + 330370 + 65J6EKm0CUlxDdBoFfTE + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2948 + Grace + Adam Clayton, Bono, Larry Mullen, The Edge + 330657 + /iMXBZW1Si/Lm3IQaDOTmjIB + 0.9900000000000000000 + 233 + 1 + 1 + 1 + + + 2949 + The Three Sunrises + U2 + 234788 + 5QN45WBMvr5Fl6rhIC0= + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2950 + Spanish Eyes + U2 + 196702 + 2DWSgk82R0tFDg== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2951 + Sweetest Thing + U2 + 185103 + +eE+ejY1FCrfnw== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2952 + Love Comes Tumbling + U2 + 282671 + Pra41/YFmCC5UeKGWg== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2953 + Bass Trap + U2 + 213289 + CK+xkp24MtceU9w= + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2954 + Dancing Barefoot + Ivan Kral/Patti Smith + 287895 + ymB0zfZNQlL228l4QEKy + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2955 + Everlasting Love + Buzz Cason/Mac Gayden + 202631 + VPAWW+McLoZil0LnU2eYZfp1Og== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2956 + Unchained Melody + Alex North/Hy Zaret + 294164 + q+xalUMIZyzlOQ== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2957 + Walk To The Water + U2 + 289253 + WgUNgi08gZ2uMu5qXwtb/g== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2958 + Luminous Times (Hold On To Love) + Brian Eno/U2 + 277760 + Q2R9ygd7eGiWgRjatAGgKEQ= + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2959 + Hallelujah Here She Comes + U2 + 242364 + 4UXlail52IwEvQ== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2960 + Silver And Gold + Bono + 279875 + +4nnCtnogbuIUomUGg== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2961 + Endless Deep + U2 + 179879 + umjC+TBNQhokeg== + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2962 + A Room At The Heartbreak Hotel + U2 + 274546 + qdk6BPJ7d7vmmvcw + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2963 + Trash, Trampoline And The Party Girl + U2 + 153965 + 2xkebLyUV7HK024= + 0.9900000000000000000 + 234 + 1 + 1 + 1 + + + 2964 + Vertigo + Adam Clayton, Bono, Larry Mullen & The Edge + 194612 + FZLTbz/hZW1RLw9Gtw== + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2965 + Miracle Drug + Adam Clayton, Bono, Larry Mullen & The Edge + 239124 + 1xLZM/zDOPIeFy7VXY8iB94GzA== + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2966 + Sometimes You Can't Make It On Your Own + Adam Clayton, Bono, Larry Mullen & The Edge + 308976 + 3OmjS6e5ksN+qwrYtSa9 + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2967 + Love And Peace Or Else + Adam Clayton, Bono, Larry Mullen & The Edge + 290690 + 15fWq9gjc7xAaoPVSkpQCXk= + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2968 + City Of Blinding Lights + Adam Clayton, Bono, Larry Mullen & The Edge + 347951 + ue5vjoxDMHRz + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2969 + All Because Of You + Adam Clayton, Bono, Larry Mullen & The Edge + 219141 + DVYgN9LdL0cvIRu4deYKPTU= + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2970 + A Man And A Woman + Adam Clayton, Bono, Larry Mullen & The Edge + 270132 + eTRbAF7wbM/VSQo= + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2971 + Crumbs From Your Table + Adam Clayton, Bono, Larry Mullen & The Edge + 303568 + emOwAK/pSkwCbBoI2Vg= + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2972 + One Step Closer + Adam Clayton, Bono, Larry Mullen & The Edge + 231680 + AXiJg08Oc/s/Fwz4L8oDCOY8nQ== + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2973 + Original Of The Species + Adam Clayton, Bono, Larry Mullen & The Edge + 281443 + twh0NiDy6boMGVMnBUdr + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2974 + Yahweh + Adam Clayton, Bono, Larry Mullen & The Edge + 262034 + S8a7hAdocOmj8RqB/2Mz + 0.9900000000000000000 + 235 + 1 + 1 + 1 + + + 2975 + Discotheque + Bono, The Edge, Adam Clayton, and Larry Mullen + 319582 + PLHx+ANSYlwkuO4mxOQ= + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2976 + Do You Feel Loved + Bono, The Edge, Adam Clayton, and Larry Mullen + 307539 + 516svSCBGJ5OmIuTL9hnuw== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2977 + Mofo + Bono, The Edge, Adam Clayton, and Larry Mullen + 349178 + 5YfqU1ZzUvljX19Pekolvv4zIg== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2978 + If God Will Send His Angels + Bono, The Edge, Adam Clayton, and Larry Mullen + 322533 + phNKIxKjYHi/M4S9/Q== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2979 + Staring At The Sun + Bono, The Edge, Adam Clayton, and Larry Mullen + 276924 + QDz5npHrWcO8IrlP1E0= + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2980 + Last Night On Earth + Bono, The Edge, Adam Clayton, and Larry Mullen + 285753 + 1DClRGgC0j3GQLM= + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2981 + Gone + Bono, The Edge, Adam Clayton, and Larry Mullen + 266866 + 2Tow26JSNArpxV+hN/jiVyhqww== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2982 + Miami + Bono, The Edge, Adam Clayton, and Larry Mullen + 293041 + EhPqAt54lENu/zNd3th/ + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2983 + The Playboy Mansion + Bono, The Edge, Adam Clayton, and Larry Mullen + 280555 + jEYW/Z9DfA/QAw0= + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2984 + If You Wear That Velvet Dress + Bono, The Edge, Adam Clayton, and Larry Mullen + 315167 + H3sVW33kAMZPLQ== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2985 + Please + Bono, The Edge, Adam Clayton, and Larry Mullen + 302602 + Kb3xm+qSAcNfeFnK + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2986 + Wake Up Dead Man + Bono, The Edge, Adam Clayton, and Larry Mullen + 292832 + VMUuzpfbMdtrJA== + 0.9900000000000000000 + 236 + 1 + 1 + 1 + + + 2987 + Helter Skelter + Lennon, John/McCartney, Paul + 187350 + 8+nX4PnXuTleSuw/rqeRfc4/ + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2988 + Van Diemen's Land + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 186044 + 98WwNAe4tTEv + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2989 + Desire + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 179226 + /CC+mc2oALo= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2990 + Hawkmoon 269 + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 382458 + yoe/H2yWZ4WAJgVeY5y9LA== + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2991 + All Along The Watchtower + Dylan, Bob + 264568 + Q7XPKEOmisVhKQ== + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2992 + I Still Haven't Found What I'm Looking for + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 353567 + peD/kcKtdCc4pUOd + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2993 + Freedom For My People + Mabins, Macie/Magee, Sterling/Robinson, Bobby + 38164 + MjQKKRWYhAFtb2VK6/mG4DQ= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2994 + Silver And Gold + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 349831 + Cm0436Anc5s= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2995 + Pride (In The Name Of Love) + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 267807 + J5bzuAAYLvU= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2996 + Angel Of Harlem + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 229276 + m2CvyaUtOHGaRtaz7kYDSzgvaA== + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2997 + Love Rescue Me + Bono/Clayton, Adam/Dylan, Bob/Mullen Jr., Larry/The Edge + 384522 + lOO1euJca3m2ZDI= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2998 + When Love Comes To Town + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 255869 + A3dF1KpBxwunLowtxQ== + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 2999 + Heartland + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 303360 + OU/wbMjoxqN6uKo15kjBvro= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 3000 + God Part II + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 195604 + FBivdgEvofZoXKpmVog= + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 3001 + The Star Spangled Banner + Hendrix, Jimi + 43232 + 4CMbiUqcSfdg/YwpdFt/Seh0 + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 3002 + Bullet The Blue Sky + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 337005 + GaxTwk7Ay9GAaQ== + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 3003 + All I Want Is You + Bono/Clayton, Adam/Mullen Jr., Larry/The Edge + 390243 + FGEigAYkpTVwmMohTnl0 + 0.9900000000000000000 + 237 + 1 + 1 + 1 + + + 3004 + Pride (In The Name Of Love) + U2 + 230243 + LJrpEsHx/28IjGHNyH4= + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3005 + New Year's Day + U2 + 258925 + yY1n6SsH9FVao7MEvk6KBEjZuw== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3006 + With Or Without You + U2 + 299023 + N5dXNiJisg== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3007 + I Still Haven't Found What I'm Looking For + U2 + 280764 + ecPYbPHNAZQ= + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3008 + Sunday Bloody Sunday + U2 + 282174 + kEn+OESObg7tQCF9hxjzDd+T + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3009 + Bad + U2 + 351817 + NjHGyVR83JbLRhLwTPYduJA= + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3010 + Where The Streets Have No Name + U2 + 276218 + ZvII6Cg0IZH68Q== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3011 + I Will Follow + U2 + 218253 + 5F8ROs9dtcl/qbxo + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3012 + The Unforgettable Fire + U2 + 295183 + osfaUNSHal9jTw== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3013 + Sweetest Thing + U2 & Daragh O'Toole + 183066 + oSlOCJKnwoHq6+fnAbZ9mWjvEA== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3014 + Desire + U2 + 179853 + qokQRWBZ0b1yh0yB + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3015 + When Love Comes To Town + U2 + 258194 + mJimD6w32Oc6fg274NmZVw== + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3016 + Angel Of Harlem + U2 + 230217 + AW9SPM4YGAg= + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3017 + All I Want Is You + U2 & Van Dyke Parks + 591986 + ONYEDmKfZdc= + 0.9900000000000000000 + 238 + 1 + 1 + 1 + + + 3018 + Sunday Bloody Sunday + U2 + 278204 + HtaJu7g4LHAKA4mA + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3019 + Seconds + U2 + 191582 + N2aEhdwu08qAjQYE/gHiKxtu + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3020 + New Year's Day + U2 + 336274 + CHF7gGRGtxoQXg0Vfye4np6J3Q== + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3021 + Like A Song... + U2 + 287294 + NgSenUiDtrk2SUTvlDN3Drzm + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3022 + Drowning Man + U2 + 254458 + PyQUw2xzd4fdRmNEoT6rHw== + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3023 + The Refugee + U2 + 221283 + 09034I/948YZHoBLr6o= + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3024 + Two Hearts Beat As One + U2 + 243487 + uGmdniJBMSrR/Nlz0wWjsOk= + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3025 + Red Light + U2 + 225854 + czverkCvJzH8UlX2Oy0= + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3026 + Surrender + U2 + 333505 + gYs4oA38w6GzZuS1iRDAdm2X + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3027 + "40" + U2 + 157962 + PG8CCSntdg== + 0.9900000000000000000 + 239 + 1 + 1 + 1 + + + 3028 + Zooropa + U2; Bono + 392359 + RN/V2sCs11F5ag/cF6+ZK0hb + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3029 + Babyface + U2; Bono + 241998 + nSA73OdfBPEsfoIP + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3030 + Numb + U2; Edge, The + 260284 + lgt/wt6MIwiyv0cLXrsfjNXX + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3031 + Lemon + U2; Bono + 418324 + zfPZzwgC7Xq8u6vS91tc + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3032 + Stay (Faraway, So Close!) + U2; Bono + 298475 + CzDXTLs48eth9NGJpOVkV6c= + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3033 + Daddy's Gonna Pay For Your Crashed Car + U2; Bono + 320287 + Qr+9O3bA8BFnTQbsT7A= + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3034 + Some Days Are Better Than Others + U2; Bono + 257436 + dRNc/ooFlALubg== + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3035 + The First Time + U2; Bono + 225697 + MWTW1lZTKzYZnYjPuRdcqtCj + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3036 + Dirty Day + U2; Bono & Edge, The + 324440 + daQhhy7RCFgcuq29 + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3037 + The Wanderer + U2; Bono + 283951 + zWKOjDqQ9g== + 0.9900000000000000000 + 240 + 1 + 1 + 1 + + + 3038 + Breakfast In Bed + + 196179 + wBiWY+xDoucuW8NeCfhvENynBA== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3039 + Where Did I Go Wrong + + 226742 + +w97a+C5AVaIz29ArTE= + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3040 + I Would Do For You + + 334524 + i4okQo5mcO1f6l/F1fN+r5OM + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3041 + Homely Girl + + 203833 + t7GcK4MzQUtfX+uDsNhD44a4ZQ== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3042 + Here I Am (Come And Take Me) + + 242102 + 6IoiHIGB9CxjCiDctAV6Aw== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3043 + Kingston Town + + 226951 + XqAPTBoRjg== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3044 + Wear You To The Ball + + 213342 + Zq7tkRD49y0Vvyw= + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3045 + (I Can't Help) Falling In Love With You + + 207568 + gKoCPhXoVT4Oz6te + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3046 + Higher Ground + + 260179 + 8ycXVirNeJSnGtMHm1IRKa6e + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3047 + Bring Me Your Cup + + 341498 + TXVutJ7QNjK8T2WXAo9RHNDf1w== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3048 + C'est La Vie + + 270053 + 8bP52I8vN3qVQxVgMGUQyoU= + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3049 + Reggae Music + + 245106 + eYXzm7xFQoPQd0k1QErX + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3050 + Superstition + + 319582 + VJl7lSVvmA== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3051 + Until My Dying Day + + 235807 + nHk6BWadfoeXXmVR91b3tA== + 0.9900000000000000000 + 241 + 1 + 8 + 1 + + + 3052 + Where Have All The Good Times Gone? + Ray Davies + 186723 + C16/MF8Cy4l8EXc= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3053 + Hang 'Em High + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 210259 + 8E0K7Tb+Qw== + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3054 + Cathedral + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 82860 + PRwz+cKe4uQ= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3055 + Secrets + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 206968 + vP2hxv8ZENmLPXZu + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3056 + Intruder + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 100153 + 6owGOKYQWmTAWLSpWO8rxW7B + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3057 + (Oh) Pretty Woman + Bill Dees/Roy Orbison + 174680 + 5gO/E9WI8TP6FKrBzJw= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3058 + Dancing In The Street + Ivy Jo Hunter/Marvin Gaye/William Stevenson + 225985 + MqfziffRiSD8pO0cpirk + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3059 + Little Guitars (Intro) + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 42240 + HXtXiHgqeA== + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3060 + Little Guitars + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 228806 + r7XdYFAVl+gNl72E0uTJ + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3061 + Big Bad Bill (Is Sweet William Now) + Jack Yellen/Milton Ager + 165146 + XOPDb+hrSgkWAI1FdBNJBy4= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3062 + The Full Bug + Alex Van Halen/David Lee Roth/Edward Van Halen/Michael Anthony + 201116 + 2kL0KdDmDQUPD2xfQDg= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3063 + Happy Trails + Dale Evans + 65488 + CSuVZwlIRGo= + 0.9900000000000000000 + 242 + 1 + 1 + 1 + + + 3064 + Eruption + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 102164 + Sk+HUnP5TbVV + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3065 + Ain't Talkin' 'bout Love + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 228336 + CodZMxPcYeM= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3066 + Runnin' With The Devil + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 215902 + O5y2wFWTaw== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3067 + Dance the Night Away + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 185965 + tKAlepXXId6AX7qRFcG3CTA= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3068 + And the Cradle Will Rock... + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 213968 + KrD4goqnZOguNpSPMb8= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3069 + Unchained + Edward Van Halen, Alex Van Halen, David Lee Roth, Michael Anthony + 208953 + EpkVMJV0rzdUkg== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3070 + Jump + Edward Van Halen, Alex Van Halen, David Lee Roth + 241711 + p1FGeuWskChouu8yFX4= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3071 + Panama + Edward Van Halen, Alex Van Halen, David Lee Roth + 211853 + rajrSvEt+4kDKKLZmrh7eaQ= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3072 + Why Can't This Be Love + Van Halen + 227761 + DAASobRQ5/4JVg== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3073 + Dreams + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar + 291813 + Imb/sX/HBksJoVCryEI= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3074 + When It's Love + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar + 338991 + Q9P1b+1BS0M= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3075 + Poundcake + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar + 321854 + fgIL9Jpj8iOlO+DBoiga8XQtmg== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3076 + Right Now + Van Halen + 321828 + vFRKXmINFAiaaQzXI/YyfA== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3077 + Can't Stop Loving You + Van Halen + 248502 + ErGmriwGjGKQoKs= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3078 + Humans Being + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, Sammy Hagar + 308950 + fXgUsfVMKbg= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3079 + Can't Get This Stuff No More + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, David Lee Roth + 315376 + kY1P6Yk7LwmdrPWdNmF8856QTg== + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3080 + Me Wise Magic + Edward Van Halen, Alex Van Halen, Michael Anthony,/Edward Van Halen, Alex Van Halen, Michael Anthony, David Lee Roth + 366053 + /NFsaC0c8PcmLqo= + 0.9900000000000000000 + 243 + 1 + 1 + 1 + + + 3081 + Runnin' With The Devil + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 216032 + xA6BI1bFoso= + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3082 + Eruption + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 102556 + WPP0tj1HF5i9Vrs= + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3083 + You Really Got Me + Ray Davies + 158589 + +7C/Iea8bUo34m8B7Nkn4Fic2Q== + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3084 + Ain't Talkin' 'Bout Love + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 230060 + hGCj3ney8NXZX2nX7i7IXsECcA== + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3085 + I'm The One + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 226507 + NX8ldoTyyWMfNj8gfM1WmwzhqQ== + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3086 + Jamie's Cryin' + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 210546 + y5hw13mXE70RyR5WLNC4BA== + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3087 + Atomic Punk + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 182073 + LVqF6Iy1oh9JWyHX + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3088 + Feel Your Love Tonight + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 222850 + UeBYPD2dDk387N8M + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3089 + Little Dreamer + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 203258 + VRjp86wVUmDehiRK + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3090 + Ice Cream Man + John Brim + 200306 + 4s64MDzy5uN4Pv3vkxv17DFt + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3091 + On Fire + Edward Van Halen, Alex Van Halen, Michael Anthony and David Lee Roth + 180636 + 3DpgijZVrgyFzHNZNPH+u0CVzA== + 0.9900000000000000000 + 244 + 1 + 1 + 1 + + + 3092 + Neworld + Van Halen + 105639 + 7SVu3dnsBBj5XHStGX5u + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3093 + Without You + Van Halen + 390295 + gkOB2o3mYRcE5cg= + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3094 + One I Want + Van Halen + 330788 + lWC1V2W9uLbLgrFJUZYSKFjF + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3095 + From Afar + Van Halen + 324414 + toP5OP0T8SMHxA== + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3096 + Dirty Water Dog + Van Halen + 327392 + 2PMjBoOZpx1IXMW3OP+R + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3097 + Once + Van Halen + 462837 + ifbTOL4/pRF6mye4Q3OZsfJ0 + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3098 + Fire in the Hole + Van Halen + 331728 + vSVLEniBOw== + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3099 + Josephina + Van Halen + 342491 + 5PHMwTlr22csM4yYmU4= + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3100 + Year to the Day + Van Halen + 514612 + jOhy79nUwhPE + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3101 + Primary + Van Halen + 86987 + VdQSPuRbtoPBwSCt2e0= + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3102 + Ballot or the Bullet + Van Halen + 342282 + ZwxtfmXbEG8= + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3103 + How Many Say I + Van Halen + 363937 + vioGkmGpId0H/OOWyShI + 0.9900000000000000000 + 245 + 1 + 1 + 1 + + + 3104 + Sucker Train Blues + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 267859 + 1RXXjfHeDoSicshVlV/pRGQ= + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3105 + Do It For The Kids + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 235911 + f7lVJCIYn0Om3Qo= + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3106 + Big Machine + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 265613 + neMkpo/FOOI= + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3107 + Illegal I Song + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 257750 + 4ByB8O7gzA== + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3108 + Spectacle + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 221701 + qBOeMsupjw== + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3109 + Fall To Pieces + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 270889 + sfO/7q44MXrr1eQw7g== + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3110 + Headspace + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 223033 + IwyC3J+c0zMzN9L7/ck= + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3111 + Superhuman + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 255921 + g9E6lSTd0nnzc6g= + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3112 + Set Me Free + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 247954 + BgQZ/JxZ2O+Sr+8J8g== + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3113 + You Got No Right + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 335412 + fcCHG7M6Zw9oA6qayg== + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3114 + Slither + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 248398 + UZKOaPexzC8ZOzahJNrY + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3115 + Dirty Little Thing + Dave Kushner, Duff, Keith Nelson, Matt Sorum, Scott Weiland & Slash + 237844 + 4jCjdWAS8djAbYT3nBZSAY7n + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3116 + Loving The Alien + Dave Kushner, Duff, Matt Sorum, Scott Weiland & Slash + 348786 + ACGGEkHhTqZM5BEV + 0.9900000000000000000 + 246 + 1 + 1 + 1 + + + 3117 + Pela Luz Dos Olhos Teus + + 119196 + NpQgefdVkT6gtqiJLNWTAug= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3118 + A Bencao E Outros + + 421093 + Ez0717JbHWKT + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3119 + Tudo Na Mais Santa Paz + + 222406 + a6Xzrlf3wQc= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3120 + O Velho E Aflor + + 275121 + 2Ao5VV9ga96JFAy6o2Ov/dg= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3121 + Cotidiano N 2 + + 55902 + XuHEW5XBf9L7wvkxNROMDRAr2g== + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3122 + Adeus + + 221884 + 3HdHfZRNhw== + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3123 + Samba Pra Endrigo + + 259265 + yEFDsH+mYiYwfHR41oxkqOVX + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3124 + So Por Amor + + 236591 + +C6WU4Qj73Tm + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3125 + Meu Pranto Rolou + + 181760 + R8dHOScKuX5I + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3126 + Mulher Carioca + + 191686 + jrFm3JO2YRE= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3127 + Um Homem Chamado Alfredo + + 151640 + E56YPG6OKTHuvw== + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3128 + Samba Do Jato + + 220813 + jzF7i+m1LT4= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3129 + Oi, La + + 167053 + gqspnKVQR8i6v87B3iXT+6+K + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3130 + Vinicius, Poeta Do Encontro + + 336431 + qv3Zyr+7Ilw= + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3131 + Soneto Da Separacao + + 193880 + 2vLeiSNizWd0+5cd + 0.9900000000000000000 + 247 + 1 + 7 + 1 + + + 3132 + Still Of The Night + Sykes + 398210 + YXYu8MuxDKiQOipUkw== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3133 + Here I Go Again + Marsden + 233874 + qOBq4YPzEe3H4UWee1hshrPzuw== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3134 + Is This Love + Sykes + 283924 + nGKbzvBwUI1JuLQ= + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3135 + Love Ain't No Stranger + Galley + 259395 + j7EkhgoaFA== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3136 + Looking For Love + Sykes + 391941 + NXOuTassNbQ7Coc= + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3137 + Now You're Gone + Vandenberg + 251141 + mDAURkSc8RKjhKQPLBAOyQ== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3138 + Slide It In + Coverdale + 202475 + 5XuY35AtKQ== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3139 + Slow An' Easy + Moody + 367255 + TiLDO5xRPw== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3140 + Judgement Day + Vandenberg + 317074 + fZxfnd5BbikCh7A= + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3141 + You're Gonna Break My Hart Again + Sykes + 250853 + nyCbHWyAVg== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3142 + The Deeper The Love + Vandenberg + 262791 + 7lcIAuuR9nkt1wc= + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3143 + Crying In The Rain + Coverdale + 337005 + ZN6vdK8sVaQNb90JfA== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3144 + Fool For Your Loving + Marsden/Moody + 250801 + FS2Hps4c+7FDJpNcsUxK9PsrgA== + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3145 + Sweet Lady Luck + Vandenberg + 273737 + asBxJ21AKrKAfno= + 0.9900000000000000000 + 141 + 1 + 3 + 1 + + + 3146 + Faixa Amarela + Beto Gogo/Jessé Pai/Luiz Carlos/Zeca Pagodinho + 240692 + hZF8yfKHCOo4s5s= + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3147 + Posso Até Me Apaixonar + Dudu Nobre + 200698 + 4FN6CVkZc7KJ + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3148 + Não Sou Mais Disso + Jorge Aragão/Zeca Pagodinho + 225985 + 71S8XziO8UgwxKyV1g== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3149 + Vivo Isolado Do Mundo + Alcides Dias Lopes + 180035 + z4EBdCKVRLYl6EcaxSA= + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3150 + Coração Em Desalinho + Mauro Diniz/Ratino Sigem + 185208 + ZgrHdIahKA== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3151 + Seu Balancê + Paulinho Rezende/Toninho Geraes + 219454 + kk55+O+D1g== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3152 + Vai Adiar + Alcino Corrêa/Monarco + 270393 + SnxZOtcX/w== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3153 + Rugas + Augusto Garcez/Nelson Cavaquinho + 140930 + 9Lo5LtMYHcjR78m55CA= + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3154 + Feirinha da Pavuna/Luz do Repente/Bagaço da Laranja + Arlindo Cruz/Franco/Marquinhos PQD/Negro, Jovelina Pérolo/Zeca Pagodinho + 107206 + fqZ0biWonFUyTwv8nmzm + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3155 + Sem Essa de Malandro Agulha + Aldir Blanc/Jayme Vignoli + 158484 + Tws4gMtn+Tl6MbEn/7kc+A== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3156 + Chico Não Vai na Corimba + Dudu Nobre/Zeca Pagodinho + 269374 + K9qTYqjZ5lhlBt/IHH5c + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3157 + Papel Principal + Almir Guineto/Dedé Paraiso/Luverci Ernesto + 217495 + bnqurKCEF6w79PT3 + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3158 + Saudade Louca + Acyr Marques/Arlindo Cruz/Franco + 243591 + VXkyEtJzkVMfpjJRKA== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3159 + Camarão que Dorme e Onda Leva + Acyi Marques/Arlindo Bruz/Braço, Beto Sem/Zeca Pagodinho + 299102 + YRpwXrJVPZE/bkyIpsPm + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3160 + Sapopemba e Maxambomba + Nei Lopes/Wilson Moreira + 245394 + s+Tv4w+NrLZJC8qXT9N7Wng= + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3161 + Minha Fé + Murilão + 206994 + tpLLlkKiN8Q5xMY= + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3162 + Lua de Ogum + Ratinho/Zeca Pagodinho + 168463 + zM5s+PJNYQ== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3163 + Samba pras moças + Grazielle/Roque Ferreira + 152816 + V9NtuhSmiqZCa/Lx + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3164 + Verdade + Carlinhos Santana/Nelson Rufino + 332826 + iA1UWx2iTQ== + 0.9900000000000000000 + 248 + 1 + 7 + 1 + + + 3165 + The Brig + + 2617325 + SlPo7/8//CpW4S75NA== + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3166 + .07% + + 2585794 + 4iURgpsXkILO0tQ5RMAYnA== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 3167 + Five Years Gone + + 2587712 + qxSXDX+EyhVnjnvr + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 3168 + The Hard Part + + 2601017 + xPjbwSovSpsGNRvHhQ== + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 3169 + The Man Behind the Curtain + + 2615990 + G8X6OxG5C4LknLli + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3170 + Greatest Hits + + 2617117 + Rmw0iRWWQw0= + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3171 + Landslide + + 2600725 + XoOV6VI6pd98Rfo= + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 3172 + The Office: An American Workplace (Pilot) + + 1380833 + r1BsUmkxfkEUPwfIjw== + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3173 + Diversity Day + + 1306416 + LtGsBjFBCD5md6YoZ9E= + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3174 + Health Care + + 1321791 + BSB0aDGXHMg3q2TEzA== + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3175 + The Alliance + + 1317125 + H3vNWk4L0zN1 + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3176 + Basketball + + 1323541 + uGZw6fSsQcqtYw4= + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3177 + Hot Girl + + 1325458 + k19daxEJdVvMfTt2R/zYzhjFCQ== + 1.9900000000000000000 + 249 + 3 + 19 + 2 + + + 3178 + The Dundies + + 1253541 + ql+wyycz04o= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3179 + Sexual Harassment + + 1294541 + mhdouQDnbvzj+sq+Gkg6Kvk= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3180 + Office Olympics + + 1290458 + 99NzsuhaPHQ0rpI= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3181 + The Fire + + 1288166 + 3jXq8TFl071HFWrR + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3182 + Halloween + + 1315333 + yz8UkBd1oS2S27c= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3183 + The Fight + + 1320028 + 6C8OfIuzwGqeG5XTKBbUVw== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3184 + The Client + + 1299341 + WeJpoXwcGyjkHDjw + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3185 + Performance Review + + 1292458 + TFkz+kk2xEC7Yqlmlq+pQGc= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3186 + Email Surveillance + + 1328870 + oEnxOPlNVGs= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3187 + Christmas Party + + 1282115 + 81Onlod5h887oC3M + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3188 + Booze Cruise + + 1267958 + kvuegL875m1x6A== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3189 + The Injury + + 1275275 + G5emJRNg5aXeJNHtFMwi7A== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3190 + The Secret + + 1264875 + 322fOTQCt/WaeY0ZhaWCayp68A== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3191 + The Carpet + + 1264375 + YrvbuofuesEOirSdTteNA0hC5w== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3192 + Boys and Girls + + 1278333 + 7y9551iMWH5OgulRMhmsJJLl + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3193 + Valentine's Day + + 1270375 + RYj15w/E8MuuGH4i55Nb4zJC9A== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3194 + Dwight's Speech + + 1278041 + +5X7cougYg== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3195 + Take Your Daughter to Work Day + + 1268333 + NSppcGOQoQz5SGkiaMGqZtBfAQ== + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3196 + Michael's Birthday + + 1237791 + 1zZ64p6Dtq+Ng1tvYoU= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3197 + Drug Testing + + 1278625 + g68Ov1bxTuk= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3198 + Conflict Resolution + + 1274583 + 2NH5OuqUoiw= + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3199 + Casino Night - Season Finale + + 1712791 + pZP+r4bS4Nrxfnbs + 1.9900000000000000000 + 250 + 3 + 19 + 2 + + + 3200 + Gay Witch Hunt + + 1326534 + wOMqJ7fBoKrLiEyQCcyJew== + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3201 + The Convention + + 1297213 + +eAvz7zxl9MoO998/89z/d0R + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3202 + The Coup + + 1276526 + D8Pc4Iv02QuyH30FVl8thQ== + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3203 + Grief Counseling + + 1282615 + vSsD8ZNTj4bBLsy42ZIs + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3204 + The Initiation + + 1280113 + cmsAHACj2uPm5LSrNYgd0ko= + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3205 + Diwali + + 1279904 + QLIOJXxwTVrKxg1S2YxQSw== + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3206 + Branch Closing + + 1822781 + 8yxplRlQIAuun+RQOBH5bvs= + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3207 + The Merger + + 1801926 + eaxN75DPpdgU1ZMLJ1rq + 1.9900000000000000000 + 251 + 3 + 19 + 2 + + + 3208 + The Convict + + 1273064 + KabgSCZi7RrN0WgJkrUT5N061w== + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3209 + A Benihana Christmas, Pts. 1 & 2 + + 2519436 + lgObme9BO0p3o3c= + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3210 + Back from Vacation + + 1271688 + ZpPnU42zLBe/MyK+ + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3211 + Traveling Salesmen + + 1289039 + nEZfwa8t7YJMDiYKR1g= + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3212 + Producer's Cut: The Return + + 1700241 + JqKiKlreow== + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3213 + Ben Franklin + + 1271938 + zcBWKg3A32Lh3TNT+9yIx3WKBw== + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3214 + Phyllis's Wedding + + 1271521 + hMFIRlpH8A== + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3215 + Business School + + 1302093 + kPdkiPhHkQFYA9/CbatE + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3216 + Cocktails + + 1272522 + EwXpSRnatc/WiXoMeBDQxs/C0Q== + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3217 + The Negotiation + + 1767851 + eatatEuHb3GqRa3YfBsy + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3218 + Safety Training + + 1271229 + XaYCtkKUsW/MhIlIMxjy + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3219 + Product Recall + + 1268268 + 2lqzaKs1/ZFrQyWR3KE= + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3220 + Women's Appreciation + + 1732649 + XN57aSi/G6fk+ernx/4mPpFS + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3221 + Beach Games + + 1676134 + /iFnyagnqHBK/m8g + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3222 + The Job + + 2541875 + K/Qsarevyuq+s88= + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3223 + How to Stop an Exploding Man + + 2687103 + wU42k0QFkz7Z + 1.9900000000000000000 + 228 + 3 + 21 + 2 + + + 3224 + Through a Looking Glass + + 5088838 + bvQU0kF/TtGoddlXu9LS + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3225 + Your Time Is Gonna Come + Page, Jones + 310774 + huKIF0BtmFrn2XLdBQ== + 0.9900000000000000000 + 252 + 2 + 1 + 1 + + + 3226 + Battlestar Galactica, Pt. 1 + + 2952702 + 3OG5iIY4VeU= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3227 + Battlestar Galactica, Pt. 2 + + 2956081 + SpztC1mVapJkwYh+sLbC + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3228 + Battlestar Galactica, Pt. 3 + + 2927802 + AFu56mcNccuvmPed + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3229 + Lost Planet of the Gods, Pt. 1 + + 2922547 + S5lmoXM9e1JiP8R9Rg0cfXor + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3230 + Lost Planet of the Gods, Pt. 2 + + 2914664 + 9yaG3Jz6BjwrIQ== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3231 + The Lost Warrior + + 2920045 + wJ7MXxgnId09eEcP + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3232 + The Long Patrol + + 2925008 + HPVsIQBUTjVtzKY= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3233 + The Gun On Ice Planet Zero, Pt. 1 + + 2907615 + xbzKpmwATzEHfiax5g== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3234 + The Gun On Ice Planet Zero, Pt. 2 + + 2924341 + 9Fuc7bKvF+nAp43lPA== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3235 + The Magnificent Warriors + + 2924716 + 0yVT0SVTU2pXNtB39w== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3236 + The Young Lords + + 2863571 + lZ7OuzoLX/KYfxk= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3237 + The Living Legend, Pt. 1 + + 2924507 + 9dz8IxmHxHld4SpUi5OgigNl + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3238 + The Living Legend, Pt. 2 + + 2923298 + O7g4UyLY0qowdg== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3239 + Fire In Space + + 2926593 + jdS4Ll13bjQdSbM= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3240 + War of the Gods, Pt. 1 + + 2922630 + gbRzei+natXuM2LePryJ2Uo= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3241 + War of the Gods, Pt. 2 + + 2923381 + 3ZMCe1RWnF01KRs= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3242 + The Man With Nine Lives + + 2956998 + SNSIOreerl6iAsY= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3243 + Murder On the Rising Star + + 2935894 + 8llx2vCh7pTp1WsfegVfHN0= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3244 + Greetings from Earth, Pt. 1 + + 2960293 + ckG6H+qOVQMF6ivspNs= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3245 + Greetings from Earth, Pt. 2 + + 2903778 + YYn65MJslDuG + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3246 + Baltar's Escape + + 2922088 + cmhov7I/kYDPj4Tm + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3247 + Experiment In Terra + + 2923548 + b+OE7JsDaf0wkFI= + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3248 + Take the Celestra + + 2927677 + fGU4G2beBTM5eCXtQ1OrmWvVSw== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3249 + The Hand of God + + 2924007 + e7WLAT1/+Dcd5w== + 1.9900000000000000000 + 253 + 3 + 20 + 2 + + + 3250 + Pilot + + 2484567 + 2BWmNdlZZGmwf7OZ9w== + 1.9900000000000000000 + 254 + 3 + 19 + 2 + + + 3251 + Through the Looking Glass, Pt. 2 + + 2617117 + lqlIWM+SW0QKncbZ + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3252 + Through the Looking Glass, Pt. 1 + + 2610860 + 3ubmzhVSNkw= + 1.9900000000000000000 + 229 + 3 + 21 + 2 + + + 3253 + Instant Karma + + 193188 + nB3RPwZrmg== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3254 + #9 Dream + + 278312 + yByUQqfWr94= + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3255 + Mother + + 287740 + VeWTCwlv/yKGg8qxnUc= + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3256 + Give Peace a Chance + + 274644 + cb4MKoeQi/CqQQ== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3257 + Cold Turkey + + 281424 + qkX0NhA278j8UQ== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3258 + Whatever Gets You Thru the Night + + 215084 + zJOu0R2A6M8Y + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3259 + I'm Losing You + + 240719 + 1dTR6MmEV73K9enJNMW6Lk9z + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3260 + Gimme Some Truth + + 232778 + wdVKb7jxeXy1cg== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3261 + Oh, My Love + + 159473 + CNopqtRxI05G + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3262 + Imagine + + 192329 + lwoyW88CX+gX7zB1 + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3263 + Nobody Told Me + + 210348 + VlWLZBj2UAihSr7tD6CJ + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3264 + Jealous Guy + + 239094 + SAoBLOIpyhcT6O4Zk56D + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3265 + Working Class Hero + + 265449 + kp7SVEkMClf1qfbAdG7AYtX4zg== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3266 + Power to the People + + 213018 + LkhYLIt0US8INnQDxuNa + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3267 + Imagine + + 219078 + zTWnO/+qNjkzCqKlKIxDm8+f + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3268 + Beautiful Boy + + 227995 + SkWmydW72k++NPP5kA== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3269 + Isolation + + 156059 + T5SgUJLkgxEf+IHRqwc= + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3270 + Watching the Wheels + + 198645 + 8tgzJzcPKydr0oAlW3cEQBA= + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3271 + Grow Old With Me + + 149093 + ktn3o0o8uig4Jq1IAxDT + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3272 + Gimme Some Truth + + 187546 + y1y/0VgDJG00 + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3273 + (Just Like) Starting Over + + 215549 + Er8omRq4cL4ZLYRPjvZt + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3274 + God + + 260410 + 1wR5I85vUYirqIA/uY61iW4= + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3275 + Real Love + + 236911 + KvoAnwz11w== + 0.9900000000000000000 + 255 + 2 + 9 + 1 + + + 3276 + Sympton of the Universe + + 340890 + 96VOfM3JY0os + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3277 + Snowblind + + 295960 + 9BGwo26f7XE3MQQ= + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3278 + Black Sabbath + + 364180 + ePrhwcxzDjj4hEuJeKs5L9q3 + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3279 + Fairies Wear Boots + + 392764 + b2GWlV0bh4xgsZq9pg== + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3280 + War Pigs + + 515435 + bC1Umwv88Dv0Jg== + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3281 + The Wizard + + 282678 + xScqwma+l39VlSniZYSmReauhg== + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3282 + N.I.B. + + 335248 + xqVIDH7llM676jM= + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3283 + Sweet Leaf + + 354706 + byWX9FzJ+fID + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3284 + Never Say Die + + 258343 + UapDS+8XZbcKjW3I + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3285 + Sabbath, Bloody Sabbath + + 333622 + IN4eRIEqyMRqYbtyP+w= + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3286 + Iron Man/Children of the Grave + + 552308 + 6By0lFuHVJ7JM/V9aA== + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3287 + Paranoid + + 189171 + 4Kb/p3t3Fj6FeMg7euZJh9ivKg== + 0.9900000000000000000 + 256 + 2 + 1 + 1 + + + 3288 + Rock You Like a Hurricane + + 255766 + zu3Y2W0hy0BUEQ== + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3289 + No One Like You + + 240325 + rF/Airq8y8N0m6mWPMsg + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3290 + The Zoo + + 332740 + blRCWkVStDXyzSY6WqzW + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3291 + Loving You Sunday Morning + + 339125 + dOwb27pbjg== + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3292 + Still Loving You + + 390674 + DOy2GSRWnA1NFF3rErZF + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3293 + Big City Nights + + 251865 + qoqX7ZaRacjEvyJP + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3294 + Believe in Love + + 325774 + RFMSxndOWZubEJwwGOxGTuo= + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3295 + Rhythm of Love + + 231246 + vqfBMC/EoTR7g+5UZDRN + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3296 + I Can't Explain + + 205332 + CMBKJZpo7L4Pevu8faQjedro + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3297 + Tease Me Please Me + + 287229 + qO4TJE4lQ9LWrUerZ+O65A== + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3298 + Wind of Change + + 315325 + A8U8VroCIbTJ5LbWX3R6fNA= + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3299 + Send Me an Angel + + 273041 + b/Wc/ABXlRUQ + 0.9900000000000000000 + 257 + 2 + 1 + 1 + + + 3300 + Jump Around + E. Schrody/L. Muggerud + 217835 + zpPYw8CddhSr + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3301 + Salutations + E. Schrody/L. Dimant + 69120 + 7evxb4VAjPx2Ocwu + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3302 + Put Your Head Out + E. Schrody/L. Freese/L. Muggerud + 182230 + Pkru6QbE5cGl + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3303 + Top O' The Morning To Ya + E. Schrody/L. Dimant + 216633 + WeU1C/MVwv1l0cO3gwMsd8DK + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3304 + Commercial 1 + L. Muggerud + 7941 + ntf7oPuaeNGzb0/FTEf5mIo= + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3305 + House And The Rising Sun + E. Schrody/J. Vasquez/L. Dimant + 219402 + NJnmsztnXdOGx+q9 + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3306 + Shamrocks And Shenanigans + E. Schrody/L. Dimant + 218331 + BBooBhpeRTlxekMPjhUL + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3307 + House Of Pain Anthem + E. Schrody/L. Dimant + 155611 + cIproSeMMLLqm5NCKBSx5/Xf + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3308 + Danny Boy, Danny Boy + E. Schrody/L. Muggerud + 114520 + qyRB3zlEFcIf + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3309 + Guess Who's Back + E. Schrody/L. Muggerud + 238393 + pK1SUl0WPH8bZ3jqdht+ygMRXA== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3310 + Commercial 2 + L. Muggerud + 21211 + XBmuymBSL6sx + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3311 + Put On Your Shit Kickers + E. Schrody/L. Muggerud + 190432 + EskRD0buQe/L/nRn2XfSwa4lYA== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3312 + Come And Get Some Of This + E. Schrody/L. Muggerud/R. Medrano + 170475 + QQNlVkaK/ofyCuaRTQ== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3313 + Life Goes On + E. Schrody/R. Medrano + 163030 + Va/YZ9WQiBNGXlT0Pzb3n6QJSg== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3314 + One For The Road + E. Schrody/L. Dimant/L. Muggerud + 170213 + Gw5ju8i78Ln9wBc= + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3315 + Feel It + E. Schrody/R. Medrano + 239908 + GhoiI+hGUNDmLrwHAVFKxw== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3316 + All My Love + E. Schrody/L. Dimant + 200620 + U2XdR4qjRks= + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3317 + Jump Around (Pete Rock Remix) + E. Schrody/L. Muggerud + 236120 + nhmgzhaGR3Ha + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3318 + Shamrocks And Shenanigans (Boom Shalock Lock Boom/Butch Vig Mix) + E. Schrody/L. Dimant + 237035 + FNS2Xbl62w== + 0.9900000000000000000 + 258 + 1 + 17 + 1 + + + 3319 + Instinto Colectivo + + 300564 + Uly6d3AoKapbOZs= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3320 + Chapa o Coco + + 143830 + d9zXy6g2MBgYNr+PdyWz + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3321 + Prostituta + + 359000 + nAcjzK+29O9jJ6h3pA== + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3322 + Eu So Queria Sumir + + 269740 + Kg3WSq04/eu1gkrD1RucKv8= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3323 + Tres Reis + + 304143 + dW4NUxbO4MHn52iBjbhzrA== + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3324 + Um Lugar ao Sol + + 212323 + srkseHu+sVKgguzg2FI4J14= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3325 + Batalha Naval + + 285727 + Nl7X9wdq7FAVgzP0 + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3326 + Todo o Carnaval tem seu Fim + + 237426 + TykP6nHT0vmwXAB1 + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3327 + O Misterio do Samba + + 226142 + 8+AOlC9aL7Y8Tg== + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3328 + Armadura + + 232881 + urHCiyuoLR+s8Zy3yWfGVIsIhg== + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3329 + Na Ladeira + + 221570 + 14K7dgxBgFPZxNsT29sw + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3330 + Carimbo + + 328751 + EEbOCC7gyVs= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3331 + Catimbo + + 254484 + KEUtaAakrbZMXDj2S3/pJ9k= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3332 + Funk de Bamba + + 237322 + 5xWI3O03BkNEOX7T9rhgHuP7 + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3333 + Chega no Suingue + + 221805 + 69MgLV2Of/fJxMfl4FSb4UXO + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3334 + Mun-Ra + + 274651 + V/Vhwl9zN3llf5Ytm+3T7nLG6A== + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3335 + Freestyle Love + + 318484 + Tm5APH59VJ1+W9caT5c= + 0.9900000000000000000 + 259 + 1 + 15 + 1 + + + 3336 + War Pigs + + 234013 + XokQwbolFRk= + 0.9900000000000000000 + 260 + 4 + 23 + 1 + + + 3337 + Past, Present, and Future + + 2492867 + M5cr9w1mKBtco/3ptSRE4R4= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3338 + The Beginning of the End + + 2611903 + +wmoe90ESXRkYgU= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3339 + LOST Season 4 Trailer + + 112712 + BjlUyAnnUl2P + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3340 + LOST In 8:15 + + 497163 + M7u9rJm6qWXM35s= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3341 + Confirmed Dead + + 2611986 + Gg/PuLknrg== + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3342 + The Economist + + 2609025 + AcYWLp3ElewbXY/BCuLW7L0xag== + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3343 + Eggtown + + 2608817 + y/+WJZJ7H0T5UC0qr/YXbaWPDw== + 1.9900000000000000000 + 261 + 3 + 19 + 2 + + + 3344 + The Constant + + 2611569 + JbxJb1DZgA== + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3345 + The Other Woman + + 2605021 + OeL7iLwfzQEw8Js= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3346 + Ji Yeon + + 2588797 + pVDzyi9kEhPLaUcuIpVpDrUm1Q== + 1.9900000000000000000 + 261 + 3 + 19 + 2 + + + 3347 + Meet Kevin Johnson + + 2612028 + +ucLFlWkbo8pFT0= + 1.9900000000000000000 + 261 + 3 + 19 + 2 + + + 3348 + The Shape of Things to Come + + 2591299 + 8+0v1cl/P+vGbGvPms0= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3349 + Amanda + Luca Gusella + 246503 + J7W/TAkb4ie9 + 0.9900000000000000000 + 262 + 5 + 2 + 1 + + + 3350 + Despertar + Andrea Dulbecco + 307385 + 3HWK9oLqtiyTOjVl + 0.9900000000000000000 + 262 + 5 + 2 + 1 + + + 3351 + Din Din Wo (Little Child) + Habib Koité + 285837 + RTbn6fKOfDw= + 0.9900000000000000000 + 263 + 5 + 16 + 1 + + + 3352 + Distance + Karsh Kale/Vishal Vaid + 327122 + iD5G2mnJNJkRxXE= + 0.9900000000000000000 + 264 + 5 + 15 + 1 + + + 3353 + I Guess You're Right + Darius "Take One" Minwalla/Jon Auer/Ken Stringfellow/Matt Harris + 212044 + 7Am09USBtaMHkjHBIXkVITHvmQ== + 0.9900000000000000000 + 265 + 5 + 1 + 1 + + + 3354 + I Ka Barra (Your Work) + Habib Koité + 300605 + CGDtTK+ogO34+Slv9ANYLDL0rg== + 0.9900000000000000000 + 263 + 5 + 16 + 1 + + + 3355 + Love Comes + Darius "Take One" Minwalla/Jon Auer/Ken Stringfellow/Matt Harris + 199923 + xph09Q2FuA== + 0.9900000000000000000 + 265 + 5 + 1 + 1 + + + 3356 + Muita Bobeira + Luciana Souza + 172710 + sxJnISwviIwcaEWbAcirDWjC + 0.9900000000000000000 + 266 + 5 + 7 + 1 + + + 3357 + OAM's Blues + Aaron Goldberg + 266936 + HiHo7jxBjXtv6/c+KvCROeU= + 0.9900000000000000000 + 267 + 5 + 2 + 1 + + + 3358 + One Step Beyond + Karsh Kale + 366085 + CELFeswPyq8SCv7tZ4xLuJnOyg== + 0.9900000000000000000 + 264 + 5 + 15 + 1 + + + 3359 + Symphony No. 3 in E-flat major, Op. 55, "Eroica" - Scherzo: Allegro Vivace + Ludwig van Beethoven + 356426 + K9+ftBigJSoaqnCOxQ== + 0.9900000000000000000 + 268 + 5 + 24 + 1 + + + 3360 + Something Nice Back Home + + 2612779 + YH8Ho1TZJIwugnyChGry + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3361 + Cabin Fever + + 2612028 + VsJvwmYpohBh + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3362 + There's No Place Like Home, Pt. 1 + + 2609526 + 6p+UaJpwJ+s= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3363 + There's No Place Like Home, Pt. 2 + + 2497956 + y7D1evH+nrA= + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3364 + There's No Place Like Home, Pt. 3 + + 2582957 + N5YcujeoVK0fAxU33Q== + 1.9900000000000000000 + 261 + 3 + 21 + 2 + + + 3365 + Say Hello 2 Heaven + + 384497 + QijuhPfG5wxbmD4nwWBHfQ== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3366 + Reach Down + + 672773 + x3iF2csPL2jsE+xQJA== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3367 + Hunger Strike + + 246292 + 9O65s1ICeqfqNis7gw== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3368 + Pushin Forward Back + + 225278 + EOf0ZqE/Tb9XHXYYvhsLs/q7Ng== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3369 + Call Me a Dog + + 304458 + STgHrPV7SQ== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3370 + Times of Trouble + + 342539 + jk+tkIuzWAUfhq7kiDWW + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3371 + Wooden Jesus + + 250565 + PTpDXps3PG8EwTHX3w== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3372 + Your Savior + + 244226 + cSb2LDEIb+WMC8M= + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3373 + Four Walled World + + 414474 + k3MNUjkUoWtvujfrhFcSPozKgQ== + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3374 + All Night Thing + + 231803 + JdgVh+5cBI4sV604mpWjyGKy + 0.9900000000000000000 + 269 + 2 + 23 + 1 + + + 3375 + No Such Thing + Chris Cornell + 224837 + HTV02LbvC6fa9TFZwolC4A== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3376 + Poison Eye + Chris Cornell + 237120 + XoVj3Q8TPhcN/g== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3377 + Arms Around Your Love + Chris Cornell + 214016 + 77NK29pBZEqxAF+Y + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3378 + Safe and Sound + Chris Cornell + 256764 + tCqY+/3rrw== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3379 + She'll Never Be Your Man + Chris Cornell + 204078 + tehq3U6rDSI2 + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3380 + Ghosts + Chris Cornell + 231547 + qPC6uCarVX+BJPcu + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3381 + Killing Birds + Chris Cornell + 218498 + /+yAKOV7Qhki + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3382 + Billie Jean + Michael Jackson + 281401 + +DnK4P6LlVYoej+2 + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3383 + Scar On the Sky + Chris Cornell + 220193 + KPsD7KZ+aopghy1q8M2CKA== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3384 + Your Soul Today + Chris Cornell + 205959 + 9KaGocJ/W8pW9OvOz7N7SUVYLQ== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3385 + Finally Forever + Chris Cornell + 217035 + jpubuMSXsp11Dr0SLoE= + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3386 + Silence the Voices + Chris Cornell + 267376 + mS8GZXyoIk+KfryR07Ehq3VVRg== + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3387 + Disappearing Act + Chris Cornell + 273320 + WArO3CvMvVVINtigTSw= + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3388 + You Know My Name + Chris Cornell + 240255 + GT7zsTlsSxE5CAbf + 0.9900000000000000000 + 270 + 2 + 23 + 1 + + + 3389 + Revelations + + 252376 + U2JIvedpLo4= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3390 + One and the Same + + 217732 + Kjqv6swHVKYcRKbPB2w= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3391 + Sound of a Gun + + 260154 + ow2sDPmV0yTt0QHl7Rq45P1UuQ== + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3392 + Until We Fall + + 230758 + uAFPn0S9k+zCOBxM9cY= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3393 + Original Fire + + 218916 + 2rwilMtWFcEYyyFmi2NfqHtO + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3394 + Broken City + + 228366 + yaK9Dcc7AuditQ== + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3395 + Somedays + + 213831 + tfAmAN4n27/uvqI/N9MjVgeJYg== + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3396 + Shape of Things to Come + + 274597 + of2d/Xccr1pYyW+yDGMV + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3397 + Jewel of the Summertime + + 233242 + QIqEN827YJkmYoY= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3398 + Wide Awake + + 266308 + pOX6XQAlE7dS + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3399 + Nothing Left to Say But Goodbye + + 213041 + icJ4gGYkTvAz077xFn0EKsI= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3400 + Moth + + 298049 + nQPXFZV2tnPOEbLmUF7eFwE= + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3401 + Show Me How to Live (Live at the Quart Festival) + + 301974 + v0xVO0s2LrN7ss58 + 0.9900000000000000000 + 271 + 2 + 23 + 1 + + + 3402 + Band Members Discuss Tracks from "Revelations" + + 294294 + 1WMtGk9Rcy0ByvJVPT1M + 0.9900000000000000000 + 271 + 3 + 23 + 2 + + + 3403 + Intoitus: Adorate Deum + Anonymous + 245317 + XxL+e0FrdpBiuKDm4vsDpA== + 0.9900000000000000000 + 272 + 2 + 24 + 1 + + + 3404 + Miserere mei, Deus + Gregorio Allegri + 501503 + t9yDIkOPxY2VvYFj5Q344i8bnw== + 0.9900000000000000000 + 273 + 2 + 24 + 1 + + + 3405 + Canon and Gigue in D Major: I. Canon + Johann Pachelbel + 271788 + ARdq7Z24lrCMSwbHTQOFYMhhHA== + 0.9900000000000000000 + 274 + 2 + 24 + 1 + + + 3406 + Concerto No. 1 in E Major, RV 269 "Spring": I. Allegro + Antonio Vivaldi + 199086 + OO2srfQsfKqoBLI= + 0.9900000000000000000 + 275 + 2 + 24 + 1 + + + 3407 + Concerto for 2 Violins in D Minor, BWV 1043: I. Vivace + Johann Sebastian Bach + 193722 + Y9RQoHKWhQ== + 0.9900000000000000000 + 276 + 2 + 24 + 1 + + + 3408 + Aria Mit 30 Veränderungen, BWV 988 "Goldberg Variations": Aria + Johann Sebastian Bach + 120463 + +RUBSra6FeE= + 0.9900000000000000000 + 277 + 2 + 24 + 1 + + + 3409 + Suite for Solo Cello No. 1 in G Major, BWV 1007: I. Prélude + Johann Sebastian Bach + 143288 + lxnO/hyWE2u9+XA76wiImA== + 0.9900000000000000000 + 278 + 2 + 24 + 1 + + + 3410 + The Messiah: Behold, I Tell You a Mystery... The Trumpet Shall Sound + George Frideric Handel + 582029 + ZHiz5e4y25GKI+xi9jkX + 0.9900000000000000000 + 279 + 2 + 24 + 1 + + + 3411 + Solomon HWV 67: The Arrival of the Queen of Sheba + George Frideric Handel + 197135 + IxDq5OFGPQ== + 0.9900000000000000000 + 280 + 2 + 24 + 1 + + + 3412 + "Eine Kleine Nachtmusik" Serenade In G, K. 525: I. Allegro + Wolfgang Amadeus Mozart + 348971 + NbWdFE8NDHixkFacLg== + 0.9900000000000000000 + 281 + 2 + 24 + 1 + + + 3413 + Concerto for Clarinet in A Major, K. 622: II. Adagio + Wolfgang Amadeus Mozart + 394482 + qefybZJzJg== + 0.9900000000000000000 + 282 + 2 + 24 + 1 + + + 3414 + Symphony No. 104 in D Major "London": IV. Finale: Spiritoso + Franz Joseph Haydn + 306687 + xr9YoMj3nbNFHTs= + 0.9900000000000000000 + 283 + 4 + 24 + 1 + + + 3415 + Symphony No.5 in C Minor: I. Allegro con brio + Ludwig van Beethoven + 392462 + sDmUxkJ8FnOwZuN7bIE= + 0.9900000000000000000 + 284 + 2 + 24 + 1 + + + 3416 + Ave Maria + Franz Schubert + 338243 + AvJztMoWLO7evK5FFNr+SjhhuA== + 0.9900000000000000000 + 285 + 2 + 24 + 1 + + + 3417 + Nabucco: Chorus, "Va, Pensiero, Sull'ali Dorate" + Giuseppe Verdi + 274504 + cFIrKxVcsldg3N0= + 0.9900000000000000000 + 286 + 2 + 24 + 1 + + + 3418 + Die Walküre: The Ride of the Valkyries + Richard Wagner + 189008 + R5GbwNFpcF4= + 0.9900000000000000000 + 287 + 2 + 24 + 1 + + + 3419 + Requiem, Op.48: 4. Pie Jesu + Gabriel Fauré + 258924 + SrYKkzcBmLIbqhmzj/awx0iebg== + 0.9900000000000000000 + 288 + 2 + 24 + 1 + + + 3420 + The Nutcracker, Op. 71a, Act II: Scene 14: Pas de deux: Dance of the Prince & the Sugar-Plum Fairy + Peter Ilyich Tchaikovsky + 304226 + 1Y4C3nr9gz89ec/xWW0lnCCX + 0.9900000000000000000 + 289 + 2 + 24 + 1 + + + 3421 + Nimrod (Adagio) from Variations On an Original Theme, Op. 36 "Enigma" + Edward Elgar + 250031 + WhqlRTHDgLea6vmJygI= + 0.9900000000000000000 + 290 + 2 + 24 + 1 + + + 3422 + Madama Butterfly: Un Bel Dì Vedremo + Giacomo Puccini + 277639 + rry0LBk6fVl0otooWSLQFKaw + 0.9900000000000000000 + 291 + 2 + 24 + 1 + + + 3423 + Jupiter, the Bringer of Jollity + Gustav Holst + 522099 + E0kvSdAa+kbp + 0.9900000000000000000 + 292 + 2 + 24 + 1 + + + 3424 + Turandot, Act III, Nessun dorma! + Giacomo Puccini + 176911 + Q+8F71++aefzfqPcwTGjVps= + 0.9900000000000000000 + 293 + 2 + 24 + 1 + + + 3425 + Adagio for Strings from the String Quartet, Op. 11 + Samuel Barber + 596519 + lMnWU9gJ7rF/cg== + 0.9900000000000000000 + 294 + 2 + 24 + 1 + + + 3426 + Carmina Burana: O Fortuna + Carl Orff + 156710 + Eh/zlAQwstU5+g== + 0.9900000000000000000 + 295 + 2 + 24 + 1 + + + 3427 + Fanfare for the Common Man + Aaron Copland + 198064 + ZyyyMh03iA== + 0.9900000000000000000 + 296 + 2 + 24 + 1 + + + 3428 + Branch Closing + + 1814855 + pnl/07EgffA= + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3429 + The Return + + 1705080 + /ACuPvYD4V6v + 1.9900000000000000000 + 251 + 3 + 22 + 2 + + + 3430 + Toccata and Fugue in D Minor, BWV 565: I. Toccata + Johann Sebastian Bach + 153901 + vADwgWErMGI= + 0.9900000000000000000 + 297 + 2 + 24 + 1 + + + 3431 + Symphony No.1 in D Major, Op.25 "Classical", Allegro Con Brio + Sergei Prokofiev + 254001 + oKbrtiiBzGqS + 0.9900000000000000000 + 298 + 2 + 24 + 1 + + + 3432 + Scheherazade, Op. 35: I. The Sea and Sindbad's Ship + Nikolai Rimsky-Korsakov + 545203 + QnSGP5rYOEwlcCnQ023vy/0= + 0.9900000000000000000 + 299 + 2 + 24 + 1 + + + 3433 + Concerto No.2 in F Major, BWV1047, I. Allegro + Johann Sebastian Bach + 307244 + 9x2ogL3TUHARSg== + 0.9900000000000000000 + 300 + 2 + 24 + 1 + + + 3434 + Concerto for Piano No. 2 in F Minor, Op. 21: II. Larghetto + Frédéric Chopin + 560342 + vSmYTxJt0zbBVakp3gvxgM8= + 0.9900000000000000000 + 301 + 2 + 24 + 1 + + + 3435 + Cavalleria Rusticana \ Act \ Intermezzo Sinfonico + Pietro Mascagni + 243436 + fcdchBdzdaPBtrLv + 0.9900000000000000000 + 302 + 2 + 24 + 1 + + + 3436 + Karelia Suite, Op.11: 2. Ballade (Tempo Di Menuetto) + Jean Sibelius + 406000 + x+7GZ0aRgcAAG5U7X070yXTMUw== + 0.9900000000000000000 + 303 + 2 + 24 + 1 + + + 3437 + Piano Sonata No. 14 in C Sharp Minor, Op. 27, No. 2, "Moonlight": I. Adagio sostenuto + Ludwig van Beethoven + 391000 + npOCKTgSJdlvqx2E0g== + 0.9900000000000000000 + 304 + 2 + 24 + 1 + + + 3438 + Fantasia On Greensleeves + Ralph Vaughan Williams + 268066 + 4ToXo6vuThF9q8ZIuCSB2U3qXw== + 0.9900000000000000000 + 280 + 2 + 24 + 1 + + + 3439 + Das Lied Von Der Erde, Von Der Jugend + Gustav Mahler + 223583 + izRrnS40bKdRVP4RaTNtuQ== + 0.9900000000000000000 + 305 + 2 + 24 + 1 + + + 3440 + Concerto for Cello and Orchestra in E minor, Op. 85: I. Adagio - Moderato + Edward Elgar + 483133 + 0CBkMo0W1mLwWgBYlV4yJGOg + 0.9900000000000000000 + 306 + 2 + 24 + 1 + + + 3441 + Two Fanfares for Orchestra: II. Short Ride in a Fast Machine + John Adams + 254930 + z3p1doKmvyg= + 0.9900000000000000000 + 307 + 2 + 24 + 1 + + + 3442 + Wellington's Victory or the Battle Symphony, Op.91: 2. Symphony of Triumph + Ludwig van Beethoven + 412000 + td+Et8cofMn6PP4elDo+ + 0.9900000000000000000 + 308 + 2 + 24 + 1 + + + 3443 + Missa Papae Marcelli: Kyrie + Giovanni Pierluigi da Palestrina + 240666 + a0+89cvsBg== + 0.9900000000000000000 + 309 + 2 + 24 + 1 + + + 3444 + Romeo et Juliette: No. 11 - Danse des Chevaliers + + 275015 + wOo3W6rhjM3tKawR1UmRbeJp + 0.9900000000000000000 + 310 + 2 + 24 + 1 + + + 3445 + On the Beautiful Blue Danube + Johann Strauss II + 526696 + JqKOOj82nBZXAzPiyNnx99zw + 0.9900000000000000000 + 311 + 2 + 24 + 1 + + + 3446 + Symphonie Fantastique, Op. 14: V. Songe d'une nuit du sabbat + Hector Berlioz + 561967 + HxmwMTBrji0EIr4= + 0.9900000000000000000 + 312 + 2 + 24 + 1 + + + 3447 + Carmen: Overture + Georges Bizet + 132932 + EmLC3/AxsPglDco1ybk= + 0.9900000000000000000 + 313 + 2 + 24 + 1 + + + 3448 + Lamentations of Jeremiah, First Set \ Incipit Lamentatio + Thomas Tallis + 69194 + 4zfjUbR9wkk= + 0.9900000000000000000 + 314 + 2 + 24 + 1 + + + 3449 + Music for the Royal Fireworks, HWV351 (1749): La Réjouissance + George Frideric Handel + 120000 + dnBezrEImPSYtSB/BvoB + 0.9900000000000000000 + 315 + 2 + 24 + 1 + + + 3450 + Peer Gynt Suite No.1, Op.46: 1. Morning Mood + Edvard Grieg + 253422 + LPj6EU57Z3ck + 0.9900000000000000000 + 316 + 2 + 24 + 1 + + + 3451 + Die Zauberflöte, K.620: "Der Hölle Rache Kocht in Meinem Herze" + Wolfgang Amadeus Mozart + 174813 + 9SDQCdFQGLI= + 0.9900000000000000000 + 317 + 2 + 25 + 1 + + + 3452 + SCRIABIN: Prelude in B Major, Op. 11, No. 11 + + 101293 + f9PhRhx11pwTmcfdPeKL + 0.9900000000000000000 + 318 + 4 + 24 + 1 + + + 3453 + Pavan, Lachrimae Antiquae + John Dowland + 253281 + hMc3wvoJ5qkHE3cjj+PQZlQ= + 0.9900000000000000000 + 319 + 2 + 24 + 1 + + + 3454 + Symphony No. 41 in C Major, K. 551, "Jupiter": IV. Molto allegro + Wolfgang Amadeus Mozart + 362933 + gfNKsd6cd99T3lzM + 0.9900000000000000000 + 320 + 2 + 24 + 1 + + + 3455 + Rehab + + 213240 + PUWBTIng72127Dg/Cf2yDDDJ + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3456 + You Know I'm No Good + + 256946 + iaxhmD3T6ZtK + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3457 + Me & Mr. Jones + + 151706 + tQhMOls53g2XR4VkIw== + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3458 + Just Friends + + 191933 + BxJx1J7F0iMU+0M= + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3459 + Back to Black + Mark Ronson + 240320 + 3KxEeZ9FpVLB4+sF + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3460 + Love Is a Losing Game + + 154386 + xNT/mILbJYg= + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3461 + Tears Dry On Their Own + Nickolas Ashford & Valerie Simpson + 185293 + kSpiFPyFSJHz + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3462 + Wake Up Alone + Paul O'duffy + 221413 + 909dMcgepz8= + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3463 + Some Unholy War + + 141520 + 0UgjJ2wm2vDTipIgHoKFGw== + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3464 + He Can Only Hold Her + Richard Poindexter & Robert Poindexter + 166680 + FotJIAkw75oNXg== + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3465 + You Know I'm No Good (feat. Ghostface Killah) + + 202320 + ojZ62ptmtw5tA/btIZR1BmA= + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3466 + Rehab (Hot Chip Remix) + + 418293 + 2c3YFq4HG/Y= + 0.9900000000000000000 + 321 + 2 + 14 + 1 + + + 3467 + Intro / Stronger Than Me + + 234200 + yBg0jV7IdE2cEA== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3468 + You Sent Me Flying / Cherry + + 409906 + hLfLdq0XIA== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3469 + F**k Me Pumps + Salaam Remi + 200253 + J4uTKo5pNJGOjIhzv6XH7vY5dQ== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3470 + I Heard Love Is Blind + + 129666 + Ja1G2faorCEBYWiX5n3P + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3471 + (There Is) No Greater Love (Teo Licks) + Isham Jones & Marty Symes + 167933 + NO2mJCo35cETnPjf + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3472 + In My Bed + Salaam Remi + 315960 + 3YB0oYh4eUW5M+W8Eo8tI/E= + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3473 + Take the Box + Luke Smith + 199160 + Qda1uQiSUW3uyA== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3474 + October Song + Matt Rowe & Stefan Skarbek + 204846 + xVmwzTIk4fT2Xg== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3475 + What Is It About Men + Delroy "Chris" Cooper, Donovan Jackson, Earl Chinna Smith, Felix Howard, Gordon Williams, Luke Smith, Paul Watson & Wilburn Squiddley Cole + 209573 + Vc16ucBoGKe3nSIQtgk6Iw== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3476 + Help Yourself + Freddy James, Jimmy hogarth & Larry Stock + 300884 + 4U8birG/89o17uBr + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3477 + Amy Amy Amy (Outro) + Astor Campbell, Delroy "Chris" Cooper, Donovan Jackson, Dorothy Fields, Earl Chinna Smith, Felix Howard, Gordon Williams, James Moody, Jimmy McHugh, Matt Rowe, Salaam Remi & Stefan Skarbek + 663426 + L/suPYDoPk7S6VRGEOejSA== + 0.9900000000000000000 + 322 + 2 + 9 + 1 + + + 3478 + Slowness + + 215386 + xPcBahKmQnmjDYbf + 0.9900000000000000000 + 323 + 2 + 23 + 1 + + + 3479 + Prometheus Overture, Op. 43 + Ludwig van Beethoven + 339567 + eTg7bG4m4nmIUuQoDw== + 0.9900000000000000000 + 324 + 4 + 24 + 1 + + + 3480 + Sonata for Solo Violin: IV: Presto + Béla Bartók + 299350 + x0Oh2FCSOynoauEdVOvD3dq3 + 0.9900000000000000000 + 325 + 4 + 24 + 1 + + + 3481 + A Midsummer Night's Dream, Op.61 Incidental Music: No.7 Notturno + + 387826 + Rm8cC6R4fWZ/PKU= + 0.9900000000000000000 + 326 + 2 + 24 + 1 + + + 3482 + Suite No. 3 in D, BWV 1068: III. Gavotte I & II + Johann Sebastian Bach + 225933 + QQJAezUCNTZNT1BP0YpR0g== + 0.9900000000000000000 + 327 + 2 + 24 + 1 + + + 3483 + Concert pour 4 Parties de V**les, H. 545: I. Prelude + Marc-Antoine Charpentier + 110266 + tqp3LLnJ9qo4/F/SK7w= + 0.9900000000000000000 + 328 + 2 + 24 + 1 + + + 3484 + Adios nonino + Astor Piazzolla + 289388 + Qk2gGhNwjdqlgCL2H8w= + 0.9900000000000000000 + 329 + 2 + 24 + 1 + + + 3485 + Symphony No. 3 Op. 36 for Orchestra and Soprano "Symfonia Piesni Zalosnych" \ Lento E Largo - Tranquillissimo + Henryk Górecki + 567494 + GSerb8mRLfA= + 0.9900000000000000000 + 330 + 2 + 24 + 1 + + + 3486 + Act IV, Symphony + Henry Purcell + 364296 + OUrQ/QXVZCGTYwyD6ja+hSnP0g== + 0.9900000000000000000 + 331 + 2 + 24 + 1 + + + 3487 + 3 Gymnopédies: No.1 - Lent Et Grave, No.3 - Lent Et Douloureux + Erik Satie + 385506 + l9LX3f7jNye881oUXQ== + 0.9900000000000000000 + 332 + 2 + 24 + 1 + + + 3488 + Music for the Funeral of Queen Mary: VI. "Thou Knowest, Lord, the Secrets of Our Hearts" + Henry Purcell + 142081 + 4cmfkNXQHABju8A= + 0.9900000000000000000 + 333 + 2 + 24 + 1 + + + 3489 + Symphony No. 2: III. Allegro vivace + Kurt Weill + 376510 + L/Ht6Z/CWw== + 0.9900000000000000000 + 334 + 2 + 24 + 1 + + + 3490 + Partita in E Major, BWV 1006A: I. Prelude + Johann Sebastian Bach + 285673 + 8GZz8/4inTxloAn3JdFU9OY= + 0.9900000000000000000 + 335 + 2 + 24 + 1 + + + 3491 + Le Sacre Du Printemps: I.iv. Spring Rounds + Igor Stravinsky + 234746 + +gKOlm8cHUezRTo= + 0.9900000000000000000 + 336 + 2 + 24 + 1 + + + 3492 + Sing Joyfully + William Byrd + 133768 + U5i5GCd6VqyRszLgmw== + 0.9900000000000000000 + 314 + 2 + 24 + 1 + + + 3493 + Metopes, Op. 29: Calypso + Karol Szymanowski + 333669 + sciRXZ34AwbHWbZa91fVtg== + 0.9900000000000000000 + 337 + 2 + 24 + 1 + + + 3494 + Symphony No. 2, Op. 16 - "The Four Temperaments": II. Allegro Comodo e Flemmatico + Carl Nielsen + 286998 + VwGSTXA+DKrZnjkHR88= + 0.9900000000000000000 + 338 + 2 + 24 + 1 + + + 3495 + 24 Caprices, Op. 1, No. 24, for Solo Violin, in A Minor + Niccolò Paganini + 265541 + +6xqVLZWqELOTNFfYs2C/9baRA== + 0.9900000000000000000 + 339 + 2 + 24 + 1 + + + 3496 + Étude 1, In C Major - Preludio (Presto) - Liszt + + 51780 + 3wh1QImEs8Nayf6AigheSw== + 0.9900000000000000000 + 340 + 4 + 24 + 1 + + + 3497 + Erlkonig, D.328 + + 261849 + gQAYr7/DAJ/fqdxWnmM= + 0.9900000000000000000 + 341 + 2 + 24 + 1 + + + 3498 + Concerto for Violin, Strings and Continuo in G Major, Op. 3, No. 9: I. Allegro + Pietro Antonio Locatelli + 493573 + AvTO8jYpyzGi5OcFTlDVWg== + 0.9900000000000000000 + 342 + 4 + 24 + 1 + + + 3499 + Pini Di Roma (Pinien Von Rom) \ I Pini Della Via Appia + + 286741 + NxJV2iwrH0R1oarb1m0= + 0.9900000000000000000 + 343 + 2 + 24 + 1 + + + 3500 + String Quartet No. 12 in C Minor, D. 703 "Quartettsatz": II. Andante - Allegro assai + Franz Schubert + 139200 + ZtF9lTlsFMK1z3XK + 0.9900000000000000000 + 344 + 2 + 24 + 1 + + + 3501 + L'orfeo, Act 3, Sinfonia (Orchestra) + Claudio Monteverdi + 66639 + vrFOCk9uH4wNUtbJr63BiCFWzA== + 0.9900000000000000000 + 345 + 2 + 24 + 1 + + + 3502 + Quintet for Horn, Violin, 2 Violas, and Cello in E Flat Major, K. 407/386c: III. Allegro + Wolfgang Amadeus Mozart + 221331 + LJ580z8hAiJPnwu2YUeGw1I= + 0.9900000000000000000 + 346 + 2 + 24 + 1 + + + 3503 + Koyaanisqatsi + Philip Glass + 206005 + i2hNL1l/psuJvlM6lHk= + 0.9900000000000000000 + 347 + 2 + 10 + 1 + + + + + + System.Int32 + System.String + + + + 1 + MPEG audio file + + + 2 + Protected AAC audio file + + + 3 + Protected MPEG-4 video file + + + 4 + Purchased AAC audio file + + + 5 + AAC audio file + + + + + + System.Int32 + System.String + + + + 1 + Music + + + 2 + Movies + + + 3 + TV Shows + + + 4 + Audiobooks + + + 5 + 90’s Music + + + 6 + Audiobooks + + + 7 + Movies + + + 8 + Music + + + 9 + Music Videos + + + 10 + TV Shows + + + 11 + Brazilian Music + + + 12 + Classical + + + 13 + Classical 101 - Deep Cuts + + + 14 + Classical 101 - Next Steps + + + 15 + Classical 101 - The Basics + + + 16 + Grunge + + + 17 + Heavy Metal Classic + + + 18 + On-The-Go 1 + + + + + + System.Int32 + System.DateTime + System.DateTime + System.Int32 + System.TimeSpan + System.String + System.String + System.String + System.String + System.String + System.Decimal + System.Decimal + System.Int32 + System.Int32 + + + + 1 + 01-Jan-09 00:00:00 + 01-Jan-09 11:21:00 + 2 + + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 1.9800000000000000000 + 0.0900000000000000000 + 2 + 6 + + + 2 + 02-Jan-09 00:00:00 + + 0 + 1520000000000 + Ullevålsveien 14 + Oslo + + Norway + 0171 + 3.9600000000000000000 + 0.1800000000000000000 + 4 + 2 + + + 3 + 03-Jan-09 00:00:00 + + 1 + 808701000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 5.9400000000000000000 + 0.2700000000000000000 + 8 + 4 + + + 4 + 06-Jan-09 00:00:00 + + 1 + + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 8.9100000000000000000 + 0.4100000000000000000 + 14 + 3 + + + 5 + 11-Jan-09 00:00:00 + + 1 + 37069000000000 + 69 Salem Street + Boston + MA + USA + 2113 + 13.8600000000000000000 + 0.6300000000000000000 + 23 + 4 + + + 6 + 19-Jan-09 00:00:00 + 19-Jan-09 03:54:00 + 3 + + Berger Straße 10 + Frankfurt + + Germany + 60316 + 0.9900000000000000000 + 0.0500000000000000000 + 37 + 8 + + + 7 + 01-Feb-09 00:00:00 + + 1 + 226074000000000 + Barbarossastraße 19 + Berlin + + Germany + 10779 + 1.9800000000000000000 + 0.0900000000000000000 + 38 + 3 + + + 8 + 01-Feb-09 00:00:00 + 01-Feb-09 00:14:00 + 2 + 2122000000000 + 8, Rue Hanovre + Paris + + France + 75002 + 1.9800000000000000000 + 0.0900000000000000000 + 40 + 6 + + + 9 + 02-Feb-09 00:00:00 + + 1 + 497000000000 + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 3.9600000000000000000 + 0.1800000000000000000 + 42 + 3 + + + 10 + 03-Feb-09 00:00:00 + 03-Feb-09 05:47:00 + 3 + + 3 Chatham Street + Dublin + Dublin + Ireland + + 5.9400000000000000000 + 0.2700000000000000000 + 46 + 8 + + + 11 + 06-Feb-09 00:00:00 + + 1 + 333500000000000 + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 8.9100000000000000000 + 0.4100000000000000000 + 52 + 3 + + + 12 + 11-Feb-09 00:00:00 + + 0 + + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 13.8600000000000000000 + 0.6300000000000000000 + 2 + 1 + + + 13 + 19-Feb-09 00:00:00 + + 1 + 64000000000 + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 0.9900000000000000000 + 0.0500000000000000000 + 16 + 4 + + + 14 + 04-Mar-09 00:00:00 + + 1 + + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 1.9800000000000000000 + 0.0900000000000000000 + 17 + 3 + + + 15 + 04-Mar-09 00:00:00 + 04-Mar-09 07:52:00 + 3 + + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 1.9800000000000000000 + 0.0900000000000000000 + 19 + 7 + + + 16 + 05-Mar-09 00:00:00 + 05-Mar-09 00:13:00 + 3 + 938000000000 + 801 W 4th Street + Reno + NV + USA + 89503 + 3.9600000000000000000 + 0.1800000000000000000 + 21 + 7 + + + 17 + 06-Mar-09 00:00:00 + 06-Mar-09 06:08:00 + 2 + + 319 N. Frances Street + Madison + WI + USA + 53703 + 5.9400000000000000000 + 0.2700000000000000000 + 25 + 5 + + + 18 + 09-Mar-09 00:00:00 + + 1 + + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 8.9100000000000000000 + 0.4100000000000000000 + 31 + 3 + + + 19 + 14-Mar-09 00:00:00 + 14-Mar-09 00:02:00 + 2 + 279000000000 + 8, Rue Hanovre + Paris + + France + 75002 + 13.8600000000000000000 + 0.6300000000000000000 + 40 + 5 + + + 20 + 22-Mar-09 00:00:00 + 23-Mar-09 00:17:00 + 3 + 241828000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 0.9900000000000000000 + 0.0500000000000000000 + 54 + 7 + + + 21 + 04-Apr-09 00:00:00 + 07-Apr-09 05:13:00 + 3 + 311317000000000 + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 1.9800000000000000000 + 0.0900000000000000000 + 55 + 8 + + + 22 + 04-Apr-09 00:00:00 + + 0 + 500000000000 + Calle Lira, 198 + Santiago + + Chile + + 1.9800000000000000000 + 0.0900000000000000000 + 57 + 2 + + + 23 + 05-Apr-09 00:00:00 + 07-Apr-09 03:19:00 + 2 + 532681000000000 + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 3.9600000000000000000 + 0.1800000000000000000 + 59 + 5 + + + 24 + 06-Apr-09 00:00:00 + + 1 + + Ullevålsveien 14 + Oslo + + Norway + 0171 + 5.9400000000000000000 + 0.2700000000000000000 + 4 + 3 + + + 25 + 09-Apr-09 00:00:00 + + 0 + 539267000000000 + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 8.9100000000000000000 + 0.4100000000000000000 + 10 + 2 + + + 26 + 14-Apr-09 00:00:00 + + 0 + + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 13.8600000000000000000 + 0.6300000000000000000 + 19 + 2 + + + 27 + 22-Apr-09 00:00:00 + + 1 + 303387000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 0.9900000000000000000 + 0.0500000000000000000 + 33 + 3 + + + 28 + 05-May-09 00:00:00 + 05-May-09 00:06:00 + 2 + 98920000000000 + Rua da Assunção 53 + Lisbon + + Portugal + + 1.9800000000000000000 + 0.0900000000000000000 + 34 + 6 + + + 29 + 05-May-09 00:00:00 + 07-May-09 23:51:00 + 2 + 620638000000000 + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 1.9800000000000000000 + 0.0900000000000000000 + 36 + 5 + + + 30 + 06-May-09 00:00:00 + + 1 + 633000000000 + Barbarossastraße 19 + Berlin + + Germany + 10779 + 3.9600000000000000000 + 0.1800000000000000000 + 38 + 4 + + + 31 + 07-May-09 00:00:00 + 07-May-09 05:17:00 + 3 + 66814000000000 + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 5.9400000000000000000 + 0.2700000000000000000 + 42 + 7 + + + 32 + 10-May-09 00:00:00 + 14-May-09 17:48:00 + 2 + 500250000000000 + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 8.9100000000000000000 + 0.4100000000000000000 + 48 + 6 + + + 33 + 15-May-09 00:00:00 + + 1 + 34200000000000 + Calle Lira, 198 + Santiago + + Chile + + 13.8600000000000000000 + 0.6300000000000000000 + 57 + 3 + + + 34 + 23-May-09 00:00:00 + 23-May-09 06:42:00 + 3 + 27979000000000 + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 0.9900000000000000000 + 0.0500000000000000000 + 12 + 7 + + + 35 + 05-Jun-09 00:00:00 + + 0 + 114000000000 + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 1.9800000000000000000 + 0.0900000000000000000 + 13 + 1 + + + 36 + 05-Jun-09 00:00:00 + + 0 + 3119000000000 + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 1.9800000000000000000 + 0.0900000000000000000 + 15 + 1 + + + 37 + 06-Jun-09 00:00:00 + + 0 + 1486000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 3.9600000000000000000 + 0.1800000000000000000 + 17 + 1 + + + 38 + 07-Jun-09 00:00:00 + 11-Jun-09 17:49:00 + 3 + 656920000000000 + 801 W 4th Street + Reno + NV + USA + 89503 + 5.9400000000000000000 + 0.2700000000000000000 + 21 + 8 + + + 39 + 10-Jun-09 00:00:00 + 12-Jun-09 05:37:00 + 3 + 690586000000000 + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 8.9100000000000000000 + 0.4100000000000000000 + 27 + 8 + + + 40 + 15-Jun-09 00:00:00 + + 0 + + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 13.8600000000000000000 + 0.6300000000000000000 + 36 + 2 + + + 41 + 23-Jun-09 00:00:00 + + 1 + + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 0.9900000000000000000 + 0.0500000000000000000 + 50 + 3 + + + 42 + 06-Jul-09 00:00:00 + 06-Jul-09 09:54:00 + 2 + + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 1.9800000000000000000 + 0.0900000000000000000 + 51 + 6 + + + 43 + 06-Jul-09 00:00:00 + 11-Jul-09 08:46:00 + 3 + 581297000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 1.9800000000000000000 + 0.0900000000000000000 + 53 + 7 + + + 44 + 07-Jul-09 00:00:00 + 07-Jul-09 15:12:00 + 3 + + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 3.9600000000000000000 + 0.1800000000000000000 + 55 + 8 + + + 45 + 08-Jul-09 00:00:00 + + 0 + + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 5.9400000000000000000 + 0.2700000000000000000 + 59 + 2 + + + 46 + 11-Jul-09 00:00:00 + + 0 + + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 8.9100000000000000000 + 0.4100000000000000000 + 6 + 1 + + + 47 + 16-Jul-09 00:00:00 + 16-Jul-09 00:08:00 + 2 + 2415000000000 + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 13.8600000000000000000 + 0.6300000000000000000 + 15 + 6 + + + 48 + 24-Jul-09 00:00:00 + 24-Jul-09 09:59:00 + 2 + + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 0.9900000000000000000 + 0.0500000000000000000 + 29 + 5 + + + 49 + 06-Aug-09 00:00:00 + + 1 + 269142000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 1.9800000000000000000 + 0.0900000000000000000 + 30 + 3 + + + 50 + 06-Aug-09 00:00:00 + 07-Aug-09 12:27:00 + 3 + 356358000000000 + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 1.9800000000000000000 + 0.0900000000000000000 + 32 + 7 + + + 51 + 07-Aug-09 00:00:00 + + 0 + + Rua da Assunção 53 + Lisbon + + Portugal + + 3.9600000000000000000 + 0.1800000000000000000 + 34 + 2 + + + 52 + 08-Aug-09 00:00:00 + + 1 + + Barbarossastraße 19 + Berlin + + Germany + 10779 + 5.9400000000000000000 + 0.2700000000000000000 + 38 + 4 + + + 53 + 11-Aug-09 00:00:00 + 12-Aug-09 05:55:00 + 2 + 526529000000000 + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 8.9100000000000000000 + 0.4100000000000000000 + 44 + 6 + + + 54 + 16-Aug-09 00:00:00 + + 1 + 1913000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 13.8600000000000000000 + 0.6300000000000000000 + 53 + 3 + + + 55 + 24-Aug-09 00:00:00 + 24-Aug-09 10:45:00 + 2 + 288977000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 0.9900000000000000000 + 0.0500000000000000000 + 8 + 5 + + + 56 + 06-Sep-09 00:00:00 + + 1 + 538921000000000 + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 1.9800000000000000000 + 0.0900000000000000000 + 9 + 4 + + + 57 + 06-Sep-09 00:00:00 + 06-Sep-09 02:33:00 + 2 + 31028000000000 + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 1.9800000000000000000 + 0.0900000000000000000 + 11 + 6 + + + 58 + 07-Sep-09 00:00:00 + + 0 + 2232000000000 + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 3.9600000000000000000 + 0.1800000000000000000 + 13 + 1 + + + 59 + 08-Sep-09 00:00:00 + + 0 + 744000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 5.9400000000000000000 + 0.2700000000000000000 + 17 + 2 + + + 60 + 11-Sep-09 00:00:00 + + 1 + + 69 Salem Street + Boston + MA + USA + 2113 + 8.9100000000000000000 + 0.4100000000000000000 + 23 + 3 + + + 61 + 16-Sep-09 00:00:00 + 16-Sep-09 12:31:00 + 2 + + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 13.8600000000000000000 + 0.6300000000000000000 + 32 + 6 + + + 62 + 24-Sep-09 00:00:00 + 28-Sep-09 12:15:00 + 2 + 770136000000000 + 3 Chatham Street + Dublin + Dublin + Ireland + + 0.9900000000000000000 + 0.0500000000000000000 + 46 + 5 + + + 63 + 07-Oct-09 00:00:00 + + 0 + + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 1.9800000000000000000 + 0.0900000000000000000 + 47 + 2 + + + 64 + 07-Oct-09 00:00:00 + 07-Oct-09 18:17:00 + 3 + 173302000000000 + Ordynacka 10 + Warsaw + + Poland + 00-358 + 1.9800000000000000000 + 0.0900000000000000000 + 49 + 8 + + + 65 + 08-Oct-09 00:00:00 + + 0 + 720000000000 + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 3.9600000000000000000 + 0.1800000000000000000 + 51 + 1 + + + 66 + 09-Oct-09 00:00:00 + 09-Oct-09 14:22:00 + 2 + + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 5.9400000000000000000 + 0.2700000000000000000 + 55 + 6 + + + 67 + 12-Oct-09 00:00:00 + 14-Oct-09 11:13:00 + 2 + 335782000000000 + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 8.9100000000000000000 + 0.4100000000000000000 + 2 + 6 + + + 68 + 17-Oct-09 00:00:00 + 17-Oct-09 05:54:00 + 2 + + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 13.8600000000000000000 + 0.6300000000000000000 + 11 + 6 + + + 69 + 25-Oct-09 00:00:00 + + 0 + + 319 N. Frances Street + Madison + WI + USA + 53703 + 0.9900000000000000000 + 0.0500000000000000000 + 25 + 2 + + + 70 + 07-Nov-09 00:00:00 + 07-Nov-09 13:00:00 + 3 + + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 1.9800000000000000000 + 0.0900000000000000000 + 26 + 7 + + + 71 + 07-Nov-09 00:00:00 + 07-Nov-09 08:28:00 + 3 + 824617000000000 + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 1.9800000000000000000 + 0.0900000000000000000 + 28 + 7 + + + 72 + 08-Nov-09 00:00:00 + 08-Nov-09 00:01:00 + 2 + 499000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 3.9600000000000000000 + 0.1800000000000000000 + 30 + 6 + + + 73 + 09-Nov-09 00:00:00 + + 1 + 745224000000000 + Rua da Assunção 53 + Lisbon + + Portugal + + 5.9400000000000000000 + 0.2700000000000000000 + 34 + 4 + + + 74 + 12-Nov-09 00:00:00 + + 1 + 354135000000000 + 8, Rue Hanovre + Paris + + France + 75002 + 8.9100000000000000000 + 0.4100000000000000000 + 40 + 3 + + + 75 + 17-Nov-09 00:00:00 + 17-Nov-09 01:30:00 + 2 + + Ordynacka 10 + Warsaw + + Poland + 00-358 + 13.8600000000000000000 + 0.6300000000000000000 + 49 + 5 + + + 76 + 25-Nov-09 00:00:00 + + 1 + 3358000000000 + Ullevålsveien 14 + Oslo + + Norway + 0171 + 0.9900000000000000000 + 0.0500000000000000000 + 4 + 3 + + + 77 + 08-Dec-09 00:00:00 + + 1 + 780404000000000 + Klanova 9/506 + Prague + + Czech Republic + 14700 + 1.9800000000000000000 + 0.0900000000000000000 + 5 + 4 + + + 78 + 08-Dec-09 00:00:00 + 08-Dec-09 15:01:00 + 2 + + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 1.9800000000000000000 + 0.0900000000000000000 + 7 + 5 + + + 79 + 09-Dec-09 00:00:00 + + 0 + 498000000000 + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 3.9600000000000000000 + 0.1800000000000000000 + 9 + 2 + + + 80 + 10-Dec-09 00:00:00 + + 0 + + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 5.9400000000000000000 + 0.2700000000000000000 + 13 + 2 + + + 81 + 13-Dec-09 00:00:00 + + 1 + 126002000000000 + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 8.9100000000000000000 + 0.4100000000000000000 + 19 + 4 + + + 82 + 18-Dec-09 00:00:00 + 18-Dec-09 14:55:00 + 2 + + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 13.8600000000000000000 + 0.6300000000000000000 + 28 + 6 + + + 83 + 26-Dec-09 00:00:00 + + 1 + + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 0.9900000000000000000 + 0.0500000000000000000 + 42 + 4 + + + 84 + 08-Jan-10 00:00:00 + 08-Jan-10 04:04:00 + 2 + + 68, Rue Jouvence + Dijon + + France + 21000 + 1.9800000000000000000 + 0.0900000000000000000 + 43 + 6 + + + 85 + 08-Jan-10 00:00:00 + + 0 + + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 1.9800000000000000000 + 0.0900000000000000000 + 45 + 2 + + + 86 + 09-Jan-10 00:00:00 + + 1 + + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 3.9600000000000000000 + 0.1800000000000000000 + 47 + 4 + + + 87 + 10-Jan-10 00:00:00 + 10-Jan-10 04:27:00 + 3 + + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 6.9400000000000000000 + 0.3200000000000000000 + 51 + 8 + + + 88 + 13-Jan-10 00:00:00 + + 0 + 433564000000000 + Calle Lira, 198 + Santiago + + Chile + + 17.9100000000000000000 + 0.8200000000000000000 + 57 + 1 + + + 89 + 18-Jan-10 00:00:00 + + 0 + + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 18.8600000000000000000 + 0.8600000000000000000 + 7 + 2 + + + 90 + 26-Jan-10 00:00:00 + 26-Jan-10 10:38:00 + 2 + + 801 W 4th Street + Reno + NV + USA + 89503 + 0.9900000000000000000 + 0.0500000000000000000 + 21 + 5 + + + 91 + 08-Feb-10 00:00:00 + + 1 + + 120 S Orange Ave + Orlando + FL + USA + 32801 + 1.9800000000000000000 + 0.0900000000000000000 + 22 + 4 + + + 92 + 08-Feb-10 00:00:00 + + 0 + 697000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 1.9800000000000000000 + 0.0900000000000000000 + 24 + 1 + + + 93 + 09-Feb-10 00:00:00 + 09-Feb-10 12:38:00 + 3 + + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 3.9600000000000000000 + 0.1800000000000000000 + 26 + 7 + + + 94 + 10-Feb-10 00:00:00 + 15-Feb-10 11:45:00 + 2 + 482570000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 5.9400000000000000000 + 0.2700000000000000000 + 30 + 5 + + + 95 + 13-Feb-10 00:00:00 + 13-Feb-10 21:15:00 + 2 + 343234000000000 + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 8.9100000000000000000 + 0.4100000000000000000 + 36 + 5 + + + 96 + 18-Feb-10 00:00:00 + 18-Feb-10 01:24:00 + 2 + + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 21.8600000000000000000 + 1.0000000000000000000 + 45 + 6 + + + 97 + 26-Feb-10 00:00:00 + 27-Feb-10 21:59:00 + 2 + 253623000000000 + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 1.9900000000000000000 + 0.1000000000000000000 + 59 + 5 + + + 98 + 11-Mar-10 00:00:00 + 14-Mar-10 00:01:00 + 3 + 415566000000000 + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 3.9800000000000000000 + 0.1900000000000000000 + 1 + 7 + + + 99 + 11-Mar-10 00:00:00 + 11-Mar-10 00:17:00 + 3 + 3383000000000 + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 3.9800000000000000000 + 0.1900000000000000000 + 3 + 8 + + + 100 + 12-Mar-10 00:00:00 + 12-Mar-10 00:15:00 + 2 + 1240000000000 + Klanova 9/506 + Prague + + Czech Republic + 14700 + 3.9600000000000000000 + 0.1800000000000000000 + 5 + 5 + + + 101 + 13-Mar-10 00:00:00 + + 1 + + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 5.9400000000000000000 + 0.2700000000000000000 + 9 + 4 + + + 102 + 16-Mar-10 00:00:00 + + 0 + 189106000000000 + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 9.9100000000000000000 + 0.4500000000000000000 + 15 + 1 + + + 103 + 21-Mar-10 00:00:00 + + 1 + 37544000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 15.8600000000000000000 + 0.7200000000000000000 + 24 + 4 + + + 104 + 29-Mar-10 00:00:00 + 29-Mar-10 03:05:00 + 2 + + Barbarossastraße 19 + Berlin + + Germany + 10779 + 0.9900000000000000000 + 0.0500000000000000000 + 38 + 5 + + + 105 + 11-Apr-10 00:00:00 + + 0 + 502429000000000 + 4, Rue Milton + Paris + + France + 75009 + 1.9800000000000000000 + 0.0900000000000000000 + 39 + 1 + + + 106 + 11-Apr-10 00:00:00 + + 1 + 360503000000000 + 11, Place Bellecour + Lyon + + France + 69002 + 1.9800000000000000000 + 0.0900000000000000000 + 41 + 4 + + + 107 + 12-Apr-10 00:00:00 + + 0 + + 68, Rue Jouvence + Dijon + + France + 21000 + 3.9600000000000000000 + 0.1800000000000000000 + 43 + 1 + + + 108 + 13-Apr-10 00:00:00 + + 1 + 2422000000000 + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 5.9400000000000000000 + 0.2700000000000000000 + 47 + 3 + + + 109 + 16-Apr-10 00:00:00 + 16-Apr-10 00:19:00 + 3 + 2422000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 8.9100000000000000000 + 0.4100000000000000000 + 53 + 7 + + + 110 + 21-Apr-10 00:00:00 + + 1 + 174653000000000 + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 13.8600000000000000000 + 0.6300000000000000000 + 3 + 3 + + + 111 + 29-Apr-10 00:00:00 + + 0 + 354205000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 0.9900000000000000000 + 0.0500000000000000000 + 17 + 1 + + + 112 + 12-May-10 00:00:00 + + 0 + + 627 Broadway + New York + NY + USA + 10012-2612 + 1.9800000000000000000 + 0.0900000000000000000 + 18 + 1 + + + 113 + 12-May-10 00:00:00 + 12-May-10 11:04:00 + 3 + + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 1.9800000000000000000 + 0.0900000000000000000 + 20 + 8 + + + 114 + 13-May-10 00:00:00 + + 0 + + 120 S Orange Ave + Orlando + FL + USA + 32801 + 3.9600000000000000000 + 0.1800000000000000000 + 22 + 1 + + + 115 + 14-May-10 00:00:00 + 14-May-10 00:11:00 + 3 + 2270000000000 + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 5.9400000000000000000 + 0.2700000000000000000 + 26 + 7 + + + 116 + 17-May-10 00:00:00 + 19-May-10 23:10:00 + 3 + 422191000000000 + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 8.9100000000000000000 + 0.4100000000000000000 + 32 + 8 + + + 117 + 22-May-10 00:00:00 + + 0 + 2855000000000 + 11, Place Bellecour + Lyon + + France + 69002 + 13.8600000000000000000 + 0.6300000000000000000 + 41 + 2 + + + 118 + 30-May-10 00:00:00 + + 1 + 1892000000000 + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 0.9900000000000000000 + 0.0500000000000000000 + 55 + 4 + + + 119 + 12-Jun-10 00:00:00 + 12-Jun-10 07:56:00 + 3 + + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 1.9800000000000000000 + 0.0900000000000000000 + 56 + 7 + + + 120 + 12-Jun-10 00:00:00 + 12-Jun-10 10:35:00 + 2 + + 12,Community Centre + Delhi + + India + 110017 + 1.9800000000000000000 + 0.0900000000000000000 + 58 + 6 + + + 121 + 13-Jun-10 00:00:00 + 13-Jun-10 01:57:00 + 2 + 135817000000000 + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 3.9600000000000000000 + 0.1800000000000000000 + 1 + 6 + + + 122 + 14-Jun-10 00:00:00 + 14-Jun-10 02:24:00 + 2 + + Klanova 9/506 + Prague + + Czech Republic + 14700 + 5.9400000000000000000 + 0.2700000000000000000 + 5 + 5 + + + 123 + 17-Jun-10 00:00:00 + + 1 + 2548000000000 + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 8.9100000000000000000 + 0.4100000000000000000 + 11 + 4 + + + 124 + 22-Jun-10 00:00:00 + 22-Jun-10 10:49:00 + 2 + 116845000000000 + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 13.8600000000000000000 + 0.6300000000000000000 + 20 + 6 + + + 125 + 30-Jun-10 00:00:00 + + 1 + 2118000000000 + Rua da Assunção 53 + Lisbon + + Portugal + + 0.9900000000000000000 + 0.0500000000000000000 + 34 + 4 + + + 126 + 13-Jul-10 00:00:00 + 13-Jul-10 00:14:00 + 3 + 1326000000000 + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 1.9800000000000000000 + 0.0900000000000000000 + 35 + 7 + + + 127 + 13-Jul-10 00:00:00 + 14-Jul-10 19:40:00 + 3 + 256583000000000 + Berger Straße 10 + Frankfurt + + Germany + 60316 + 1.9800000000000000000 + 0.0900000000000000000 + 37 + 8 + + + 128 + 14-Jul-10 00:00:00 + 14-Jul-10 02:17:00 + 3 + + 4, Rue Milton + Paris + + France + 75009 + 3.9600000000000000000 + 0.1800000000000000000 + 39 + 7 + + + 129 + 15-Jul-10 00:00:00 + 19-Jul-10 08:23:00 + 3 + 382882000000000 + 68, Rue Jouvence + Dijon + + France + 21000 + 5.9400000000000000000 + 0.2700000000000000000 + 43 + 7 + + + 130 + 18-Jul-10 00:00:00 + 18-Jul-10 00:42:00 + 3 + + Ordynacka 10 + Warsaw + + Poland + 00-358 + 8.9100000000000000000 + 0.4100000000000000000 + 49 + 8 + + + 131 + 23-Jul-10 00:00:00 + 24-Jul-10 08:12:00 + 3 + 162974000000000 + 12,Community Centre + Delhi + + India + 110017 + 13.8600000000000000000 + 0.6300000000000000000 + 58 + 7 + + + 132 + 31-Jul-10 00:00:00 + 31-Jul-10 00:10:00 + 2 + 1033000000000 + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 0.9900000000000000000 + 0.0500000000000000000 + 13 + 6 + + + 133 + 13-Aug-10 00:00:00 + 14-Aug-10 06:35:00 + 2 + 172428000000000 + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 1.9800000000000000000 + 0.0900000000000000000 + 14 + 6 + + + 134 + 13-Aug-10 00:00:00 + 13-Aug-10 04:15:00 + 2 + + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 1.9800000000000000000 + 0.0900000000000000000 + 16 + 6 + + + 135 + 14-Aug-10 00:00:00 + 14-Aug-10 00:32:00 + 2 + 2497000000000 + 627 Broadway + New York + NY + USA + 10012-2612 + 3.9600000000000000000 + 0.1800000000000000000 + 18 + 6 + + + 136 + 15-Aug-10 00:00:00 + + 1 + + 120 S Orange Ave + Orlando + FL + USA + 32801 + 5.9400000000000000000 + 0.2700000000000000000 + 22 + 4 + + + 137 + 18-Aug-10 00:00:00 + + 1 + + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 8.9100000000000000000 + 0.4100000000000000000 + 28 + 3 + + + 138 + 23-Aug-10 00:00:00 + 23-Aug-10 00:06:00 + 3 + 582000000000 + Berger Straße 10 + Frankfurt + + Germany + 60316 + 13.8600000000000000000 + 0.6300000000000000000 + 37 + 8 + + + 139 + 31-Aug-10 00:00:00 + 01-Sep-10 13:48:00 + 2 + 188299000000000 + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 0.9900000000000000000 + 0.0500000000000000000 + 51 + 6 + + + 140 + 13-Sep-10 00:00:00 + 13-Sep-10 06:31:00 + 2 + + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 1.9800000000000000000 + 0.0900000000000000000 + 52 + 6 + + + 141 + 13-Sep-10 00:00:00 + + 1 + 2715000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 1.9800000000000000000 + 0.0900000000000000000 + 54 + 3 + + + 142 + 14-Sep-10 00:00:00 + 14-Sep-10 00:03:00 + 2 + 552000000000 + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 3.9600000000000000000 + 0.1800000000000000000 + 56 + 6 + + + 143 + 15-Sep-10 00:00:00 + + 1 + + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 5.9400000000000000000 + 0.2700000000000000000 + 1 + 3 + + + 144 + 18-Sep-10 00:00:00 + 18-Sep-10 00:17:00 + 3 + 1974000000000 + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 8.9100000000000000000 + 0.4100000000000000000 + 7 + 7 + + + 145 + 23-Sep-10 00:00:00 + 23-Sep-10 12:45:00 + 2 + 166179000000000 + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 13.8600000000000000000 + 0.6300000000000000000 + 16 + 5 + + + 146 + 01-Oct-10 00:00:00 + + 1 + 784000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 0.9900000000000000000 + 0.0500000000000000000 + 30 + 3 + + + 147 + 14-Oct-10 00:00:00 + + 0 + 413328000000000 + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 1.9800000000000000000 + 0.0900000000000000000 + 31 + 1 + + + 148 + 14-Oct-10 00:00:00 + 16-Oct-10 07:23:00 + 3 + 441835000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 1.9800000000000000000 + 0.0900000000000000000 + 33 + 7 + + + 149 + 15-Oct-10 00:00:00 + 15-Oct-10 10:15:00 + 2 + + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 3.9600000000000000000 + 0.1800000000000000000 + 35 + 6 + + + 150 + 16-Oct-10 00:00:00 + 16-Oct-10 03:19:00 + 2 + 82170000000000 + 4, Rue Milton + Paris + + France + 75009 + 5.9400000000000000000 + 0.2700000000000000000 + 39 + 5 + + + 151 + 19-Oct-10 00:00:00 + + 1 + + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 8.9100000000000000000 + 0.4100000000000000000 + 45 + 4 + + + 152 + 24-Oct-10 00:00:00 + + 0 + + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 13.8600000000000000000 + 0.6300000000000000000 + 54 + 1 + + + 153 + 01-Nov-10 00:00:00 + 01-Nov-10 02:18:00 + 3 + + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 0.9900000000000000000 + 0.0500000000000000000 + 9 + 8 + + + 154 + 14-Nov-10 00:00:00 + + 1 + + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 1.9800000000000000000 + 0.0900000000000000000 + 10 + 3 + + + 155 + 14-Nov-10 00:00:00 + 14-Nov-10 08:06:00 + 3 + + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 1.9800000000000000000 + 0.0900000000000000000 + 12 + 7 + + + 156 + 15-Nov-10 00:00:00 + 16-Nov-10 04:57:00 + 3 + 155323000000000 + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 3.9600000000000000000 + 0.1800000000000000000 + 14 + 7 + + + 157 + 16-Nov-10 00:00:00 + 18-Nov-10 20:25:00 + 2 + 547202000000000 + 627 Broadway + New York + NY + USA + 10012-2612 + 5.9400000000000000000 + 0.2700000000000000000 + 18 + 5 + + + 158 + 19-Nov-10 00:00:00 + 19-Nov-10 00:02:00 + 2 + 245000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 8.9100000000000000000 + 0.4100000000000000000 + 24 + 6 + + + 159 + 24-Nov-10 00:00:00 + + 0 + + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 13.8600000000000000000 + 0.6300000000000000000 + 33 + 1 + + + 160 + 02-Dec-10 00:00:00 + + 1 + + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 0.9900000000000000000 + 0.0500000000000000000 + 47 + 3 + + + 161 + 15-Dec-10 00:00:00 + + 1 + 1796000000000 + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 1.9800000000000000000 + 0.0900000000000000000 + 48 + 4 + + + 162 + 15-Dec-10 00:00:00 + + 1 + + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 1.9800000000000000000 + 0.0900000000000000000 + 50 + 3 + + + 163 + 16-Dec-10 00:00:00 + 16-Dec-10 02:24:00 + 2 + 42512000000000 + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 3.9600000000000000000 + 0.1800000000000000000 + 52 + 5 + + + 164 + 17-Dec-10 00:00:00 + 17-Dec-10 06:31:00 + 3 + + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 5.9400000000000000000 + 0.2700000000000000000 + 56 + 8 + + + 165 + 20-Dec-10 00:00:00 + 20-Dec-10 16:14:00 + 2 + + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 8.9100000000000000000 + 0.4100000000000000000 + 3 + 5 + + + 166 + 25-Dec-10 00:00:00 + + 1 + 296099000000000 + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 13.8600000000000000000 + 0.6300000000000000000 + 12 + 3 + + + 167 + 02-Jan-11 00:00:00 + + 1 + 291078000000000 + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 0.9900000000000000000 + 0.0500000000000000000 + 26 + 3 + + + 168 + 15-Jan-11 00:00:00 + + 1 + + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 1.9800000000000000000 + 0.0900000000000000000 + 27 + 3 + + + 169 + 15-Jan-11 00:00:00 + + 1 + + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 1.9800000000000000000 + 0.0900000000000000000 + 29 + 3 + + + 170 + 16-Jan-11 00:00:00 + + 1 + 2930000000000 + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 3.9600000000000000000 + 0.1800000000000000000 + 31 + 4 + + + 171 + 17-Jan-11 00:00:00 + 17-Jan-11 00:45:00 + 2 + + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 5.9400000000000000000 + 0.2700000000000000000 + 35 + 6 + + + 172 + 20-Jan-11 00:00:00 + + 0 + + 11, Place Bellecour + Lyon + + France + 69002 + 8.9100000000000000000 + 0.4100000000000000000 + 41 + 2 + + + 173 + 25-Jan-11 00:00:00 + 25-Jan-11 02:59:00 + 2 + + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 13.8600000000000000000 + 0.6300000000000000000 + 50 + 6 + + + 174 + 02-Feb-11 00:00:00 + + 0 + 432358000000000 + Klanova 9/506 + Prague + + Czech Republic + 14700 + 0.9900000000000000000 + 0.0500000000000000000 + 5 + 1 + + + 175 + 15-Feb-11 00:00:00 + + 1 + 406997000000000 + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 1.9800000000000000000 + 0.0900000000000000000 + 6 + 3 + + + 176 + 15-Feb-11 00:00:00 + + 0 + + Grétrystraat 63 + Brussels + + Belgium + 1000 + 1.9800000000000000000 + 0.0900000000000000000 + 8 + 1 + + + 177 + 16-Feb-11 00:00:00 + + 1 + 1336000000000 + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 3.9600000000000000000 + 0.1800000000000000000 + 10 + 3 + + + 178 + 17-Feb-11 00:00:00 + 17-Feb-11 00:30:00 + 2 + 3252000000000 + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 5.9400000000000000000 + 0.2700000000000000000 + 14 + 6 + + + 179 + 20-Feb-11 00:00:00 + + 0 + 842619000000000 + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 8.9100000000000000000 + 0.4100000000000000000 + 20 + 2 + + + 180 + 25-Feb-11 00:00:00 + + 0 + + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 13.8600000000000000000 + 0.6300000000000000000 + 29 + 1 + + + 181 + 05-Mar-11 00:00:00 + 05-Mar-11 06:37:00 + 2 + + 68, Rue Jouvence + Dijon + + France + 21000 + 0.9900000000000000000 + 0.0500000000000000000 + 43 + 6 + + + 182 + 18-Mar-11 00:00:00 + + 0 + + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 1.9800000000000000000 + 0.0900000000000000000 + 44 + 2 + + + 183 + 18-Mar-11 00:00:00 + + 0 + 71461000000000 + 3 Chatham Street + Dublin + Dublin + Ireland + + 1.9800000000000000000 + 0.0900000000000000000 + 46 + 1 + + + 184 + 19-Mar-11 00:00:00 + + 0 + + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 3.9600000000000000000 + 0.1800000000000000000 + 48 + 2 + + + 185 + 20-Mar-11 00:00:00 + + 1 + 2815000000000 + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 5.9400000000000000000 + 0.2700000000000000000 + 52 + 4 + + + 186 + 23-Mar-11 00:00:00 + 23-Mar-11 00:39:00 + 2 + + 12,Community Centre + Delhi + + India + 110017 + 8.9100000000000000000 + 0.4100000000000000000 + 58 + 6 + + + 187 + 28-Mar-11 00:00:00 + 03-Apr-11 09:09:00 + 2 + 721376000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 13.8600000000000000000 + 0.6300000000000000000 + 8 + 6 + + + 188 + 05-Apr-11 00:00:00 + + 1 + + 120 S Orange Ave + Orlando + FL + USA + 32801 + 0.9900000000000000000 + 0.0500000000000000000 + 22 + 3 + + + 189 + 18-Apr-11 00:00:00 + 18-Apr-11 00:13:00 + 3 + 1442000000000 + 69 Salem Street + Boston + MA + USA + 2113 + 1.9800000000000000000 + 0.0900000000000000000 + 23 + 7 + + + 190 + 18-Apr-11 00:00:00 + 18-Apr-11 09:35:00 + 3 + + 319 N. Frances Street + Madison + WI + USA + 53703 + 1.9800000000000000000 + 0.0900000000000000000 + 25 + 8 + + + 191 + 19-Apr-11 00:00:00 + 19-Apr-11 10:50:00 + 3 + + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 3.9600000000000000000 + 0.1800000000000000000 + 27 + 8 + + + 192 + 20-Apr-11 00:00:00 + 20-Apr-11 08:30:00 + 2 + + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 5.9400000000000000000 + 0.2700000000000000000 + 31 + 5 + + + 193 + 23-Apr-11 00:00:00 + 23-Apr-11 12:56:00 + 3 + + Berger Straße 10 + Frankfurt + + Germany + 60316 + 14.9100000000000000000 + 0.6800000000000000000 + 37 + 7 + + + 194 + 28-Apr-11 00:00:00 + + 1 + 138650000000000 + 3 Chatham Street + Dublin + Dublin + Ireland + + 21.8600000000000000000 + 1.0000000000000000000 + 46 + 4 + + + 195 + 06-May-11 00:00:00 + + 1 + + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 0.9900000000000000000 + 0.0500000000000000000 + 1 + 3 + + + 196 + 19-May-11 00:00:00 + + 0 + + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 1.9800000000000000000 + 0.0900000000000000000 + 2 + 1 + + + 197 + 19-May-11 00:00:00 + + 0 + + Ullevålsveien 14 + Oslo + + Norway + 0171 + 1.9800000000000000000 + 0.0900000000000000000 + 4 + 2 + + + 198 + 20-May-11 00:00:00 + + 1 + + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 3.9600000000000000000 + 0.1800000000000000000 + 6 + 4 + + + 199 + 21-May-11 00:00:00 + + 1 + 384000000000 + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 5.9400000000000000000 + 0.2700000000000000000 + 10 + 3 + + + 200 + 24-May-11 00:00:00 + + 0 + 594152000000000 + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 8.9100000000000000000 + 0.4100000000000000000 + 16 + 2 + + + 201 + 29-May-11 00:00:00 + + 0 + 296505000000000 + 319 N. Frances Street + Madison + WI + USA + 53703 + 18.8600000000000000000 + 0.8600000000000000000 + 25 + 1 + + + 202 + 06-Jun-11 00:00:00 + 06-Jun-11 00:48:00 + 3 + 3177000000000 + 4, Rue Milton + Paris + + France + 75009 + 1.9900000000000000000 + 0.1000000000000000000 + 39 + 7 + + + 203 + 19-Jun-11 00:00:00 + + 1 + + 8, Rue Hanovre + Paris + + France + 75002 + 2.9800000000000000000 + 0.1400000000000000000 + 40 + 4 + + + 204 + 19-Jun-11 00:00:00 + + 1 + + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 3.9800000000000000000 + 0.1900000000000000000 + 42 + 3 + + + 205 + 20-Jun-11 00:00:00 + 20-Jun-11 08:36:00 + 3 + + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 7.9600000000000000000 + 0.3700000000000000000 + 44 + 8 + + + 206 + 21-Jun-11 00:00:00 + + 1 + 2524000000000 + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 8.9400000000000000000 + 0.4100000000000000000 + 48 + 3 + + + 207 + 24-Jun-11 00:00:00 + + 1 + 2241000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 8.9100000000000000000 + 0.4100000000000000000 + 54 + 4 + + + 208 + 29-Jun-11 00:00:00 + 01-Jul-11 16:47:00 + 3 + 555268000000000 + Ullevålsveien 14 + Oslo + + Norway + 0171 + 15.8600000000000000000 + 0.7200000000000000000 + 4 + 8 + + + 209 + 07-Jul-11 00:00:00 + 07-Jul-11 00:23:00 + 3 + + 627 Broadway + New York + NY + USA + 10012-2612 + 0.9900000000000000000 + 0.0500000000000000000 + 18 + 8 + + + 210 + 20-Jul-11 00:00:00 + 20-Jul-11 00:21:00 + 2 + 3459000000000 + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 1.9800000000000000000 + 0.0900000000000000000 + 19 + 6 + + + 211 + 20-Jul-11 00:00:00 + + 1 + 253812000000000 + 801 W 4th Street + Reno + NV + USA + 89503 + 1.9800000000000000000 + 0.0900000000000000000 + 21 + 4 + + + 212 + 21-Jul-11 00:00:00 + 22-Jul-11 17:55:00 + 3 + 299965000000000 + 69 Salem Street + Boston + MA + USA + 2113 + 3.9600000000000000000 + 0.1800000000000000000 + 23 + 8 + + + 213 + 22-Jul-11 00:00:00 + 22-Jul-11 00:49:00 + 2 + 320683000000000 + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 5.9400000000000000000 + 0.2700000000000000000 + 27 + 5 + + + 214 + 25-Jul-11 00:00:00 + + 0 + 774101000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 8.9100000000000000000 + 0.4100000000000000000 + 33 + 1 + + + 215 + 30-Jul-11 00:00:00 + 30-Jul-11 00:04:00 + 2 + 652000000000 + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 13.8600000000000000000 + 0.6300000000000000000 + 42 + 6 + + + 216 + 07-Aug-11 00:00:00 + + 1 + + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 0.9900000000000000000 + 0.0500000000000000000 + 56 + 3 + + + 217 + 20-Aug-11 00:00:00 + + 0 + 972000000000 + Calle Lira, 198 + Santiago + + Chile + + 1.9800000000000000000 + 0.0900000000000000000 + 57 + 2 + + + 218 + 20-Aug-11 00:00:00 + + 1 + 246620000000000 + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 1.9800000000000000000 + 0.0900000000000000000 + 59 + 3 + + + 219 + 21-Aug-11 00:00:00 + + 1 + 49020000000000 + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 3.9600000000000000000 + 0.1800000000000000000 + 2 + 4 + + + 220 + 22-Aug-11 00:00:00 + 22-Aug-11 16:04:00 + 3 + 643992000000000 + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 5.9400000000000000000 + 0.2700000000000000000 + 6 + 8 + + + 221 + 25-Aug-11 00:00:00 + 25-Aug-11 05:14:00 + 2 + + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 8.9100000000000000000 + 0.4100000000000000000 + 12 + 6 + + + 222 + 30-Aug-11 00:00:00 + + 0 + + 801 W 4th Street + Reno + NV + USA + 89503 + 13.8600000000000000000 + 0.6300000000000000000 + 21 + 1 + + + 223 + 07-Sep-11 00:00:00 + + 1 + 96000000000 + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 0.9900000000000000000 + 0.0500000000000000000 + 35 + 4 + + + 224 + 20-Sep-11 00:00:00 + + 1 + 578150000000000 + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 1.9800000000000000000 + 0.0900000000000000000 + 36 + 4 + + + 225 + 20-Sep-11 00:00:00 + + 1 + 936000000000 + Barbarossastraße 19 + Berlin + + Germany + 10779 + 1.9800000000000000000 + 0.0900000000000000000 + 38 + 4 + + + 226 + 21-Sep-11 00:00:00 + + 0 + 271555000000000 + 8, Rue Hanovre + Paris + + France + 75002 + 3.9600000000000000000 + 0.1800000000000000000 + 40 + 1 + + + 227 + 22-Sep-11 00:00:00 + + 1 + 2711000000000 + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 5.9400000000000000000 + 0.2700000000000000000 + 44 + 3 + + + 228 + 25-Sep-11 00:00:00 + + 1 + 791798000000000 + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 8.9100000000000000000 + 0.4100000000000000000 + 50 + 3 + + + 229 + 30-Sep-11 00:00:00 + 30-Sep-11 09:37:00 + 3 + 44773000000000 + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 13.8600000000000000000 + 0.6300000000000000000 + 59 + 7 + + + 230 + 08-Oct-11 00:00:00 + + 1 + 764704000000000 + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 0.9900000000000000000 + 0.0500000000000000000 + 14 + 3 + + + 231 + 21-Oct-11 00:00:00 + 21-Oct-11 05:37:00 + 3 + + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 1.9800000000000000000 + 0.0900000000000000000 + 15 + 8 + + + 232 + 21-Oct-11 00:00:00 + 21-Oct-11 00:01:00 + 3 + 2435000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 1.9800000000000000000 + 0.0900000000000000000 + 17 + 8 + + + 233 + 22-Oct-11 00:00:00 + + 1 + + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 3.9600000000000000000 + 0.1800000000000000000 + 19 + 3 + + + 234 + 23-Oct-11 00:00:00 + 23-Oct-11 01:17:00 + 3 + 227767000000000 + 69 Salem Street + Boston + MA + USA + 2113 + 5.9400000000000000000 + 0.2700000000000000000 + 23 + 8 + + + 235 + 26-Oct-11 00:00:00 + + 0 + 111061000000000 + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 8.9100000000000000000 + 0.4100000000000000000 + 29 + 1 + + + 236 + 31-Oct-11 00:00:00 + 31-Oct-11 15:07:00 + 3 + + Barbarossastraße 19 + Berlin + + Germany + 10779 + 13.8600000000000000000 + 0.6300000000000000000 + 38 + 7 + + + 237 + 08-Nov-11 00:00:00 + 08-Nov-11 00:01:00 + 2 + 421000000000 + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 0.9900000000000000000 + 0.0500000000000000000 + 52 + 6 + + + 238 + 21-Nov-11 00:00:00 + 21-Nov-11 00:44:00 + 3 + 3239000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 1.9800000000000000000 + 0.0900000000000000000 + 53 + 7 + + + 239 + 21-Nov-11 00:00:00 + + 1 + 3425000000000 + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 1.9800000000000000000 + 0.0900000000000000000 + 55 + 3 + + + 240 + 22-Nov-11 00:00:00 + + 0 + 99388000000000 + Calle Lira, 198 + Santiago + + Chile + + 3.9600000000000000000 + 0.1800000000000000000 + 57 + 2 + + + 241 + 23-Nov-11 00:00:00 + + 1 + 688589000000000 + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 5.9400000000000000000 + 0.2700000000000000000 + 2 + 3 + + + 242 + 26-Nov-11 00:00:00 + 28-Nov-11 14:26:00 + 2 + 226236000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 8.9100000000000000000 + 0.4100000000000000000 + 8 + 6 + + + 243 + 01-Dec-11 00:00:00 + + 1 + 952000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 13.8600000000000000000 + 0.6300000000000000000 + 17 + 4 + + + 244 + 09-Dec-11 00:00:00 + + 0 + + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 0.9900000000000000000 + 0.0500000000000000000 + 31 + 2 + + + 245 + 22-Dec-11 00:00:00 + + 1 + 1249000000000 + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 1.9800000000000000000 + 0.0900000000000000000 + 32 + 4 + + + 246 + 22-Dec-11 00:00:00 + + 0 + + Rua da Assunção 53 + Lisbon + + Portugal + + 1.9800000000000000000 + 0.0900000000000000000 + 34 + 1 + + + 247 + 23-Dec-11 00:00:00 + + 0 + 376909000000000 + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 3.9600000000000000000 + 0.1800000000000000000 + 36 + 1 + + + 248 + 24-Dec-11 00:00:00 + 24-Dec-11 00:02:00 + 3 + 701000000000 + 8, Rue Hanovre + Paris + + France + 75002 + 5.9400000000000000000 + 0.2700000000000000000 + 40 + 7 + + + 249 + 27-Dec-11 00:00:00 + 27-Dec-11 07:01:00 + 3 + + 3 Chatham Street + Dublin + Dublin + Ireland + + 8.9100000000000000000 + 0.4100000000000000000 + 46 + 7 + + + 250 + 01-Jan-12 00:00:00 + 01-Jan-12 13:00:00 + 3 + + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 13.8600000000000000000 + 0.6300000000000000000 + 55 + 8 + + + 251 + 09-Jan-12 00:00:00 + 11-Jan-12 04:28:00 + 3 + 292022000000000 + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 0.9900000000000000000 + 0.0500000000000000000 + 10 + 8 + + + 252 + 22-Jan-12 00:00:00 + 22-Jan-12 12:20:00 + 3 + + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 1.9800000000000000000 + 0.0900000000000000000 + 11 + 7 + + + 253 + 22-Jan-12 00:00:00 + 22-Jan-12 10:22:00 + 3 + + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 1.9800000000000000000 + 0.0900000000000000000 + 13 + 8 + + + 254 + 23-Jan-12 00:00:00 + + 1 + + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 3.9600000000000000000 + 0.1800000000000000000 + 15 + 4 + + + 255 + 24-Jan-12 00:00:00 + 24-Jan-12 00:27:00 + 2 + 3562000000000 + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 5.9400000000000000000 + 0.2700000000000000000 + 19 + 5 + + + 256 + 27-Jan-12 00:00:00 + + 0 + 486985000000000 + 319 N. Frances Street + Madison + WI + USA + 53703 + 8.9100000000000000000 + 0.4100000000000000000 + 25 + 1 + + + 257 + 01-Feb-12 00:00:00 + + 1 + 2226000000000 + Rua da Assunção 53 + Lisbon + + Portugal + + 13.8600000000000000000 + 0.6300000000000000000 + 34 + 4 + + + 258 + 09-Feb-12 00:00:00 + + 0 + 2865000000000 + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 0.9900000000000000000 + 0.0500000000000000000 + 48 + 1 + + + 259 + 22-Feb-12 00:00:00 + 22-Feb-12 11:25:00 + 3 + + Ordynacka 10 + Warsaw + + Poland + 00-358 + 1.9800000000000000000 + 0.0900000000000000000 + 49 + 7 + + + 260 + 22-Feb-12 00:00:00 + 24-Feb-12 21:38:00 + 3 + 619665000000000 + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 1.9800000000000000000 + 0.0900000000000000000 + 51 + 7 + + + 261 + 23-Feb-12 00:00:00 + 23-Feb-12 12:35:00 + 3 + + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 3.9600000000000000000 + 0.1800000000000000000 + 53 + 8 + + + 262 + 24-Feb-12 00:00:00 + + 0 + + Calle Lira, 198 + Santiago + + Chile + + 5.9400000000000000000 + 0.2700000000000000000 + 57 + 1 + + + 263 + 27-Feb-12 00:00:00 + + 0 + 2843000000000 + Ullevålsveien 14 + Oslo + + Norway + 0171 + 8.9100000000000000000 + 0.4100000000000000000 + 4 + 2 + + + 264 + 03-Mar-12 00:00:00 + 03-Mar-12 11:39:00 + 2 + 43863000000000 + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 13.8600000000000000000 + 0.6300000000000000000 + 13 + 6 + + + 265 + 11-Mar-12 00:00:00 + 11-Mar-12 00:03:00 + 3 + 308000000000 + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 0.9900000000000000000 + 0.0500000000000000000 + 27 + 7 + + + 266 + 24-Mar-12 00:00:00 + + 1 + 155865000000000 + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 1.9800000000000000000 + 0.0900000000000000000 + 28 + 4 + + + 267 + 24-Mar-12 00:00:00 + 24-Mar-12 13:04:00 + 2 + + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 1.9800000000000000000 + 0.0900000000000000000 + 30 + 5 + + + 268 + 25-Mar-12 00:00:00 + 25-Mar-12 14:51:00 + 2 + + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 3.9600000000000000000 + 0.1800000000000000000 + 32 + 5 + + + 269 + 26-Mar-12 00:00:00 + + 0 + 347614000000000 + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 5.9400000000000000000 + 0.2700000000000000000 + 36 + 1 + + + 270 + 29-Mar-12 00:00:00 + 29-Mar-12 12:53:00 + 3 + + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 8.9100000000000000000 + 0.4100000000000000000 + 42 + 7 + + + 271 + 03-Apr-12 00:00:00 + 03-Apr-12 11:20:00 + 2 + + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 13.8600000000000000000 + 0.6300000000000000000 + 51 + 5 + + + 272 + 11-Apr-12 00:00:00 + + 1 + + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 0.9900000000000000000 + 0.0500000000000000000 + 6 + 3 + + + 273 + 24-Apr-12 00:00:00 + 30-Apr-12 05:22:00 + 3 + 813040000000000 + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 1.9800000000000000000 + 0.0900000000000000000 + 7 + 8 + + + 274 + 24-Apr-12 00:00:00 + + 1 + + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 1.9800000000000000000 + 0.0900000000000000000 + 9 + 3 + + + 275 + 25-Apr-12 00:00:00 + 25-Apr-12 10:37:00 + 2 + + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 3.9600000000000000000 + 0.1800000000000000000 + 11 + 5 + + + 276 + 26-Apr-12 00:00:00 + 02-May-12 01:39:00 + 3 + 738962000000000 + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 5.9400000000000000000 + 0.2700000000000000000 + 15 + 8 + + + 277 + 29-Apr-12 00:00:00 + 02-May-12 08:50:00 + 2 + 623005000000000 + 801 W 4th Street + Reno + NV + USA + 89503 + 8.9100000000000000000 + 0.4100000000000000000 + 21 + 5 + + + 278 + 04-May-12 00:00:00 + + 1 + 381000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 13.8600000000000000000 + 0.6300000000000000000 + 30 + 3 + + + 279 + 12-May-12 00:00:00 + 14-May-12 17:16:00 + 3 + 795562000000000 + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 0.9900000000000000000 + 0.0500000000000000000 + 44 + 8 + + + 280 + 25-May-12 00:00:00 + + 1 + 305372000000000 + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 1.9800000000000000000 + 0.0900000000000000000 + 45 + 4 + + + 281 + 25-May-12 00:00:00 + + 0 + 2376000000000 + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 1.9800000000000000000 + 0.0900000000000000000 + 47 + 1 + + + 282 + 26-May-12 00:00:00 + 03-Jun-12 18:49:00 + 2 + 801621000000000 + Ordynacka 10 + Warsaw + + Poland + 00-358 + 3.9600000000000000000 + 0.1800000000000000000 + 49 + 5 + + + 283 + 27-May-12 00:00:00 + + 1 + 229496000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 5.9400000000000000000 + 0.2700000000000000000 + 53 + 4 + + + 284 + 30-May-12 00:00:00 + 30-May-12 11:47:00 + 3 + + 3,Raj Bhavan Road + Bangalore + + India + 560001 + 8.9100000000000000000 + 0.4100000000000000000 + 59 + 7 + + + 285 + 04-Jun-12 00:00:00 + + 1 + 617950000000000 + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 13.8600000000000000000 + 0.6300000000000000000 + 9 + 4 + + + 286 + 12-Jun-12 00:00:00 + + 0 + + 69 Salem Street + Boston + MA + USA + 2113 + 0.9900000000000000000 + 0.0500000000000000000 + 23 + 1 + + + 287 + 25-Jun-12 00:00:00 + + 0 + 2017000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 1.9800000000000000000 + 0.0900000000000000000 + 24 + 1 + + + 288 + 25-Jun-12 00:00:00 + 26-Jun-12 04:58:00 + 3 + 139283000000000 + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 1.9800000000000000000 + 0.0900000000000000000 + 26 + 8 + + + 289 + 26-Jun-12 00:00:00 + + 1 + 220653000000000 + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 3.9600000000000000000 + 0.1800000000000000000 + 28 + 4 + + + 290 + 27-Jun-12 00:00:00 + + 0 + 311174000000000 + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 5.9400000000000000000 + 0.2700000000000000000 + 32 + 1 + + + 291 + 30-Jun-12 00:00:00 + + 1 + + Barbarossastraße 19 + Berlin + + Germany + 10779 + 8.9100000000000000000 + 0.4100000000000000000 + 38 + 3 + + + 292 + 05-Jul-12 00:00:00 + 05-Jul-12 05:02:00 + 2 + + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 13.8600000000000000000 + 0.6300000000000000000 + 47 + 6 + + + 293 + 13-Jul-12 00:00:00 + 13-Jul-12 09:54:00 + 3 + 53563000000000 + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + 0.9900000000000000000 + 0.0500000000000000000 + 2 + 8 + + + 294 + 26-Jul-12 00:00:00 + 26-Jul-12 04:28:00 + 2 + + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 1.9800000000000000000 + 0.0900000000000000000 + 3 + 5 + + + 295 + 26-Jul-12 00:00:00 + + 0 + 1710000000000 + Klanova 9/506 + Prague + + Czech Republic + 14700 + 1.9800000000000000000 + 0.0900000000000000000 + 5 + 2 + + + 296 + 27-Jul-12 00:00:00 + + 0 + 231592000000000 + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 3.9600000000000000000 + 0.1800000000000000000 + 7 + 2 + + + 297 + 28-Jul-12 00:00:00 + 02-Aug-12 01:51:00 + 2 + 522073000000000 + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 5.9400000000000000000 + 0.2700000000000000000 + 11 + 5 + + + 298 + 31-Jul-12 00:00:00 + 02-Aug-12 21:12:00 + 3 + 456789000000000 + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + 10.9100000000000000000 + 0.5000000000000000000 + 17 + 7 + + + 299 + 05-Aug-12 00:00:00 + + 1 + 275662000000000 + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 23.8600000000000000000 + 1.0900000000000000000 + 26 + 4 + + + 300 + 13-Aug-12 00:00:00 + + 0 + + 8, Rue Hanovre + Paris + + France + 75002 + 0.9900000000000000000 + 0.0500000000000000000 + 40 + 1 + + + 301 + 26-Aug-12 00:00:00 + + 1 + 767674000000000 + 11, Place Bellecour + Lyon + + France + 69002 + 1.9800000000000000000 + 0.0900000000000000000 + 41 + 4 + + + 302 + 26-Aug-12 00:00:00 + + 1 + 3464000000000 + 68, Rue Jouvence + Dijon + + France + 21000 + 1.9800000000000000000 + 0.0900000000000000000 + 43 + 4 + + + 303 + 27-Aug-12 00:00:00 + 27-Aug-12 06:17:00 + 2 + + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 3.9600000000000000000 + 0.1800000000000000000 + 45 + 6 + + + 304 + 28-Aug-12 00:00:00 + 28-Aug-12 00:05:00 + 3 + 2112000000000 + Ordynacka 10 + Warsaw + + Poland + 00-358 + 5.9400000000000000000 + 0.2700000000000000000 + 49 + 8 + + + 305 + 31-Aug-12 00:00:00 + + 1 + + 421 Bourke Street + Sidney + NSW + Australia + 2010 + 8.9100000000000000000 + 0.4100000000000000000 + 55 + 4 + + + 306 + 05-Sep-12 00:00:00 + 05-Sep-12 12:40:00 + 2 + + Klanova 9/506 + Prague + + Czech Republic + 14700 + 16.8600000000000000000 + 0.7700000000000000000 + 5 + 5 + + + 307 + 13-Sep-12 00:00:00 + 13-Sep-12 11:51:00 + 3 + + 1 Infinite Loop + Cupertino + CA + USA + 95014 + 1.9900000000000000000 + 0.1000000000000000000 + 19 + 7 + + + 308 + 26-Sep-12 00:00:00 + 26-Sep-12 09:41:00 + 2 + + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 3.9800000000000000000 + 0.1900000000000000000 + 20 + 5 + + + 309 + 26-Sep-12 00:00:00 + 26-Sep-12 08:09:00 + 3 + + 120 S Orange Ave + Orlando + FL + USA + 32801 + 3.9800000000000000000 + 0.1900000000000000000 + 22 + 7 + + + 310 + 27-Sep-12 00:00:00 + 27-Sep-12 01:39:00 + 2 + + 162 E Superior Street + Chicago + IL + USA + 60611 + 7.9600000000000000000 + 0.3700000000000000000 + 24 + 5 + + + 311 + 28-Sep-12 00:00:00 + + 1 + + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 11.9400000000000000000 + 0.5500000000000000000 + 28 + 4 + + + 312 + 01-Oct-12 00:00:00 + + 0 + + Rua da Assunção 53 + Lisbon + + Portugal + + 10.9100000000000000000 + 0.5000000000000000000 + 34 + 2 + + + 313 + 06-Oct-12 00:00:00 + + 0 + 347001000000000 + 68, Rue Jouvence + Dijon + + France + 21000 + 16.8600000000000000000 + 0.7700000000000000000 + 43 + 2 + + + 314 + 14-Oct-12 00:00:00 + + 1 + 626000000000 + Calle Lira, 198 + Santiago + + Chile + + 0.9900000000000000000 + 0.0500000000000000000 + 57 + 4 + + + 315 + 27-Oct-12 00:00:00 + 27-Oct-12 00:20:00 + 2 + 1361000000000 + 12,Community Centre + Delhi + + India + 110017 + 1.9800000000000000000 + 0.0900000000000000000 + 58 + 6 + + + 316 + 27-Oct-12 00:00:00 + + 1 + 141143000000000 + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 1.9800000000000000000 + 0.0900000000000000000 + 1 + 3 + + + 317 + 28-Oct-12 00:00:00 + 28-Oct-12 05:10:00 + 2 + + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 3.9600000000000000000 + 0.1800000000000000000 + 3 + 6 + + + 318 + 29-Oct-12 00:00:00 + + 1 + 1100000000000 + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 5.9400000000000000000 + 0.2700000000000000000 + 7 + 4 + + + 319 + 01-Nov-12 00:00:00 + + 0 + + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + 8.9100000000000000000 + 0.4100000000000000000 + 13 + 2 + + + 320 + 06-Nov-12 00:00:00 + 06-Nov-12 00:06:00 + 2 + 599000000000 + 120 S Orange Ave + Orlando + FL + USA + 32801 + 13.8600000000000000000 + 0.6300000000000000000 + 22 + 6 + + + 321 + 14-Nov-12 00:00:00 + + 1 + + Tauentzienstraße 8 + Berlin + + Germany + 10789 + 0.9900000000000000000 + 0.0500000000000000000 + 36 + 4 + + + 322 + 27-Nov-12 00:00:00 + 30-Nov-12 04:14:00 + 2 + 342705000000000 + Berger Straße 10 + Frankfurt + + Germany + 60316 + 1.9800000000000000000 + 0.0900000000000000000 + 37 + 6 + + + 323 + 27-Nov-12 00:00:00 + + 0 + 398419000000000 + 4, Rue Milton + Paris + + France + 75009 + 1.9800000000000000000 + 0.0900000000000000000 + 39 + 2 + + + 324 + 28-Nov-12 00:00:00 + + 0 + + 11, Place Bellecour + Lyon + + France + 69002 + 3.9600000000000000000 + 0.1800000000000000000 + 41 + 1 + + + 325 + 29-Nov-12 00:00:00 + 29-Nov-12 09:10:00 + 2 + + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 5.9400000000000000000 + 0.2700000000000000000 + 45 + 5 + + + 326 + 02-Dec-12 00:00:00 + 07-Dec-12 21:24:00 + 3 + 734010000000000 + Celsiusg. 9 + Stockholm + + Sweden + 11230 + 8.9100000000000000000 + 0.4100000000000000000 + 51 + 8 + + + 327 + 07-Dec-12 00:00:00 + + 1 + 389346000000000 + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 13.8600000000000000000 + 0.6300000000000000000 + 1 + 4 + + + 328 + 15-Dec-12 00:00:00 + + 1 + 2494000000000 + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + 0.9900000000000000000 + 0.0500000000000000000 + 15 + 4 + + + 329 + 28-Dec-12 00:00:00 + + 0 + 3083000000000 + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 1.9800000000000000000 + 0.0900000000000000000 + 16 + 1 + + + 330 + 28-Dec-12 00:00:00 + + 1 + 796441000000000 + 627 Broadway + New York + NY + USA + 10012-2612 + 1.9800000000000000000 + 0.0900000000000000000 + 18 + 4 + + + 331 + 29-Dec-12 00:00:00 + + 1 + 839475000000000 + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 3.9600000000000000000 + 0.1800000000000000000 + 20 + 4 + + + 332 + 30-Dec-12 00:00:00 + 30-Dec-12 21:47:00 + 3 + 794966000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 5.9400000000000000000 + 0.2700000000000000000 + 24 + 7 + + + 333 + 02-Jan-13 00:00:00 + 02-Jan-13 00:04:00 + 3 + 930000000000 + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + 8.9100000000000000000 + 0.4100000000000000000 + 30 + 7 + + + 334 + 07-Jan-13 00:00:00 + 07-Jan-13 00:06:00 + 3 + 830000000000 + 4, Rue Milton + Paris + + France + 75009 + 13.8600000000000000000 + 0.6300000000000000000 + 39 + 8 + + + 335 + 15-Jan-13 00:00:00 + + 0 + 153686000000000 + 113 Lupus St + London + + United Kingdom + SW1V 3EN + 0.9900000000000000000 + 0.0500000000000000000 + 53 + 1 + + + 336 + 28-Jan-13 00:00:00 + 28-Jan-13 13:37:00 + 2 + 184656000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 1.9800000000000000000 + 0.0900000000000000000 + 54 + 6 + + + 337 + 28-Jan-13 00:00:00 + 30-Jan-13 16:03:00 + 3 + 439240000000000 + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 1.9800000000000000000 + 0.0900000000000000000 + 56 + 7 + + + 338 + 29-Jan-13 00:00:00 + + 1 + 2570000000000 + 12,Community Centre + Delhi + + India + 110017 + 3.9600000000000000000 + 0.1800000000000000000 + 58 + 4 + + + 339 + 30-Jan-13 00:00:00 + + 1 + + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 5.9400000000000000000 + 0.2700000000000000000 + 3 + 4 + + + 340 + 02-Feb-13 00:00:00 + 02-Feb-13 14:45:00 + 3 + + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + 8.9100000000000000000 + 0.4100000000000000000 + 9 + 8 + + + 341 + 07-Feb-13 00:00:00 + + 1 + + 627 Broadway + New York + NY + USA + 10012-2612 + 13.8600000000000000000 + 0.6300000000000000000 + 18 + 3 + + + 342 + 15-Feb-13 00:00:00 + 15-Feb-13 09:24:00 + 2 + + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + 0.9900000000000000000 + 0.0500000000000000000 + 32 + 5 + + + 343 + 28-Feb-13 00:00:00 + + 0 + 148000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 1.9800000000000000000 + 0.0900000000000000000 + 33 + 1 + + + 344 + 28-Feb-13 00:00:00 + 01-Mar-13 06:09:00 + 3 + 316646000000000 + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 1.9800000000000000000 + 0.0900000000000000000 + 35 + 7 + + + 345 + 01-Mar-13 00:00:00 + 01-Mar-13 00:18:00 + 2 + 3098000000000 + Berger Straße 10 + Frankfurt + + Germany + 60316 + 3.9600000000000000000 + 0.1800000000000000000 + 37 + 5 + + + 346 + 02-Mar-13 00:00:00 + + 0 + 156453000000000 + 11, Place Bellecour + Lyon + + France + 69002 + 5.9400000000000000000 + 0.2700000000000000000 + 41 + 2 + + + 347 + 05-Mar-13 00:00:00 + 07-Mar-13 15:35:00 + 2 + 840893000000000 + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + 8.9100000000000000000 + 0.4100000000000000000 + 47 + 5 + + + 348 + 10-Mar-13 00:00:00 + 12-Mar-13 12:18:00 + 2 + 731148000000000 + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 13.8600000000000000000 + 0.6300000000000000000 + 56 + 5 + + + 349 + 18-Mar-13 00:00:00 + 18-Mar-13 06:31:00 + 3 + + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + 0.9900000000000000000 + 0.0500000000000000000 + 11 + 7 + + + 350 + 31-Mar-13 00:00:00 + 31-Mar-13 00:21:00 + 3 + 1959000000000 + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 1.9800000000000000000 + 0.0900000000000000000 + 12 + 8 + + + 351 + 31-Mar-13 00:00:00 + 31-Mar-13 16:08:00 + 2 + 269097000000000 + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 1.9800000000000000000 + 0.0900000000000000000 + 14 + 5 + + + 352 + 01-Apr-13 00:00:00 + + 0 + + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 3.9600000000000000000 + 0.1800000000000000000 + 16 + 2 + + + 353 + 02-Apr-13 00:00:00 + 02-Apr-13 00:03:00 + 2 + 317000000000 + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 5.9400000000000000000 + 0.2700000000000000000 + 20 + 5 + + + 354 + 05-Apr-13 00:00:00 + 05-Apr-13 01:19:00 + 2 + 160366000000000 + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + 8.9100000000000000000 + 0.4100000000000000000 + 26 + 6 + + + 355 + 10-Apr-13 00:00:00 + 10-Apr-13 05:57:00 + 2 + + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 13.8600000000000000000 + 0.6300000000000000000 + 35 + 6 + + + 356 + 18-Apr-13 00:00:00 + 18-Apr-13 15:06:00 + 3 + 769029000000000 + Ordynacka 10 + Warsaw + + Poland + 00-358 + 0.9900000000000000000 + 0.0500000000000000000 + 49 + 7 + + + 357 + 01-May-13 00:00:00 + + 0 + 3369000000000 + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 1.9800000000000000000 + 0.0900000000000000000 + 50 + 2 + + + 358 + 01-May-13 00:00:00 + 01-May-13 00:17:00 + 2 + 2914000000000 + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 1.9800000000000000000 + 0.0900000000000000000 + 52 + 6 + + + 359 + 02-May-13 00:00:00 + + 1 + 15000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 3.9600000000000000000 + 0.1800000000000000000 + 54 + 4 + + + 360 + 03-May-13 00:00:00 + 08-May-13 11:46:00 + 2 + 755663000000000 + 12,Community Centre + Delhi + + India + 110017 + 5.9400000000000000000 + 0.2700000000000000000 + 58 + 5 + + + 361 + 06-May-13 00:00:00 + + 0 + 300290000000000 + Klanova 9/506 + Prague + + Czech Republic + 14700 + 8.9100000000000000000 + 0.4100000000000000000 + 5 + 1 + + + 362 + 11-May-13 00:00:00 + + 1 + + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + 13.8600000000000000000 + 0.6300000000000000000 + 14 + 3 + + + 363 + 19-May-13 00:00:00 + + 1 + 403643000000000 + 302 S 700 E + Salt Lake City + UT + USA + 84102 + 0.9900000000000000000 + 0.0500000000000000000 + 28 + 4 + + + 364 + 01-Jun-13 00:00:00 + + 1 + 363000000000 + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 1.9800000000000000000 + 0.0900000000000000000 + 29 + 4 + + + 365 + 01-Jun-13 00:00:00 + + 0 + 518016000000000 + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 1.9800000000000000000 + 0.0900000000000000000 + 31 + 2 + + + 366 + 02-Jun-13 00:00:00 + 02-Jun-13 14:24:00 + 2 + 378654000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 3.9600000000000000000 + 0.1800000000000000000 + 33 + 5 + + + 367 + 03-Jun-13 00:00:00 + + 1 + + Berger Straße 10 + Frankfurt + + Germany + 60316 + 5.9400000000000000000 + 0.2700000000000000000 + 37 + 3 + + + 368 + 06-Jun-13 00:00:00 + + 0 + 449445000000000 + 68, Rue Jouvence + Dijon + + France + 21000 + 8.9100000000000000000 + 0.4100000000000000000 + 43 + 2 + + + 369 + 11-Jun-13 00:00:00 + + 1 + + 202 Hoxton Street + London + + United Kingdom + N1 5LH + 13.8600000000000000000 + 0.6300000000000000000 + 52 + 3 + + + 370 + 19-Jun-13 00:00:00 + + 0 + 789394000000000 + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + 0.9900000000000000000 + 0.0500000000000000000 + 7 + 1 + + + 371 + 02-Jul-13 00:00:00 + + 1 + 1502000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 1.9800000000000000000 + 0.0900000000000000000 + 8 + 4 + + + 372 + 02-Jul-13 00:00:00 + + 0 + + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 1.9800000000000000000 + 0.0900000000000000000 + 10 + 2 + + + 373 + 03-Jul-13 00:00:00 + 03-Jul-13 00:43:00 + 3 + + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 3.9600000000000000000 + 0.1800000000000000000 + 12 + 8 + + + 374 + 04-Jul-13 00:00:00 + + 1 + + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + 5.9400000000000000000 + 0.2700000000000000000 + 16 + 3 + + + 375 + 07-Jul-13 00:00:00 + + 1 + 167000000000 + 120 S Orange Ave + Orlando + FL + USA + 32801 + 8.9100000000000000000 + 0.4100000000000000000 + 22 + 4 + + + 376 + 12-Jul-13 00:00:00 + 12-Jul-13 10:33:00 + 3 + + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + 13.8600000000000000000 + 0.6300000000000000000 + 31 + 7 + + + 377 + 20-Jul-13 00:00:00 + 20-Jul-13 06:47:00 + 2 + 121413000000000 + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + 0.9900000000000000000 + 0.0500000000000000000 + 45 + 5 + + + 378 + 02-Aug-13 00:00:00 + + 1 + 510000000000 + 3 Chatham Street + Dublin + Dublin + Ireland + + 1.9800000000000000000 + 0.0900000000000000000 + 46 + 4 + + + 379 + 02-Aug-13 00:00:00 + + 1 + + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 1.9800000000000000000 + 0.0900000000000000000 + 48 + 4 + + + 380 + 03-Aug-13 00:00:00 + + 1 + 453000000000 + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 3.9600000000000000000 + 0.1800000000000000000 + 50 + 3 + + + 381 + 04-Aug-13 00:00:00 + + 1 + 360518000000000 + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + 5.9400000000000000000 + 0.2700000000000000000 + 54 + 3 + + + 382 + 07-Aug-13 00:00:00 + 07-Aug-13 02:04:00 + 3 + + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + 8.9100000000000000000 + 0.4100000000000000000 + 1 + 8 + + + 383 + 12-Aug-13 00:00:00 + 13-Aug-13 20:45:00 + 2 + 788267000000000 + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + 13.8600000000000000000 + 0.6300000000000000000 + 10 + 6 + + + 384 + 20-Aug-13 00:00:00 + + 0 + 1592000000000 + 162 E Superior Street + Chicago + IL + USA + 60611 + 0.9900000000000000000 + 0.0500000000000000000 + 24 + 2 + + + 385 + 02-Sep-13 00:00:00 + 02-Sep-13 06:51:00 + 3 + + 319 N. Frances Street + Madison + WI + USA + 53703 + 1.9800000000000000000 + 0.0900000000000000000 + 25 + 8 + + + 386 + 02-Sep-13 00:00:00 + + 1 + + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 1.9800000000000000000 + 0.0900000000000000000 + 27 + 3 + + + 387 + 03-Sep-13 00:00:00 + + 0 + 529687000000000 + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 3.9600000000000000000 + 0.1800000000000000000 + 29 + 2 + + + 388 + 04-Sep-13 00:00:00 + + 0 + 3263000000000 + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + 5.9400000000000000000 + 0.2700000000000000000 + 33 + 2 + + + 389 + 07-Sep-13 00:00:00 + + 1 + + 4, Rue Milton + Paris + + France + 75009 + 8.9100000000000000000 + 0.4100000000000000000 + 39 + 3 + + + 390 + 12-Sep-13 00:00:00 + + 0 + 762000000000 + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + 13.8600000000000000000 + 0.6300000000000000000 + 48 + 2 + + + 391 + 20-Sep-13 00:00:00 + + 1 + 1509000000000 + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + 0.9900000000000000000 + 0.0500000000000000000 + 3 + 4 + + + 392 + 03-Oct-13 00:00:00 + + 0 + 1592000000000 + Ullevålsveien 14 + Oslo + + Norway + 0171 + 1.9800000000000000000 + 0.0900000000000000000 + 4 + 2 + + + 393 + 03-Oct-13 00:00:00 + 03-Oct-13 11:23:00 + 3 + + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 1.9800000000000000000 + 0.0900000000000000000 + 6 + 8 + + + 394 + 04-Oct-13 00:00:00 + 09-Oct-13 04:50:00 + 3 + 659301000000000 + Grétrystraat 63 + Brussels + + Belgium + 1000 + 3.9600000000000000000 + 0.1800000000000000000 + 8 + 8 + + + 395 + 05-Oct-13 00:00:00 + 08-Oct-13 02:39:00 + 3 + 750621000000000 + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + 5.9400000000000000000 + 0.2700000000000000000 + 12 + 7 + + + 396 + 08-Oct-13 00:00:00 + 09-Oct-13 17:25:00 + 3 + 173366000000000 + 627 Broadway + New York + NY + USA + 10012-2612 + 8.9100000000000000000 + 0.4100000000000000000 + 18 + 8 + + + 397 + 13-Oct-13 00:00:00 + + 0 + + 1033 N Park Ave + Tucson + AZ + USA + 85719 + 13.8600000000000000000 + 0.6300000000000000000 + 27 + 1 + + + 398 + 21-Oct-13 00:00:00 + 30-Oct-13 01:30:00 + 2 + 861979000000000 + 11, Place Bellecour + Lyon + + France + 69002 + 0.9900000000000000000 + 0.0500000000000000000 + 41 + 6 + + + 399 + 03-Nov-13 00:00:00 + 09-Nov-13 18:38:00 + 2 + 635442000000000 + 9, Place Louis Barthou + Bordeaux + + France + 33000 + 1.9800000000000000000 + 0.0900000000000000000 + 42 + 5 + + + 400 + 03-Nov-13 00:00:00 + 03-Nov-13 10:05:00 + 3 + + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 1.9800000000000000000 + 0.0900000000000000000 + 44 + 8 + + + 401 + 04-Nov-13 00:00:00 + 09-Nov-13 18:47:00 + 3 + 589114000000000 + 3 Chatham Street + Dublin + Dublin + Ireland + + 3.9600000000000000000 + 0.1800000000000000000 + 46 + 7 + + + 402 + 05-Nov-13 00:00:00 + + 1 + + C/ San Bernardo 85 + Madrid + + Spain + 28015 + 5.9400000000000000000 + 0.2700000000000000000 + 50 + 3 + + + 403 + 08-Nov-13 00:00:00 + + 0 + 258989000000000 + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + 8.9100000000000000000 + 0.4100000000000000000 + 56 + 2 + + + 404 + 13-Nov-13 00:00:00 + 13-Nov-13 07:34:00 + 2 + + Rilská 3174/6 + Prague + + Czech Republic + 14300 + 25.8600000000000000000 + 1.1800000000000000000 + 6 + 6 + + + 405 + 21-Nov-13 00:00:00 + + 1 + 213842000000000 + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + 0.9900000000000000000 + 0.0500000000000000000 + 20 + 4 + + + 406 + 04-Dec-13 00:00:00 + + 1 + 707632000000000 + 801 W 4th Street + Reno + NV + USA + 89503 + 1.9800000000000000000 + 0.0900000000000000000 + 21 + 3 + + + 407 + 04-Dec-13 00:00:00 + + 0 + 620825000000000 + 69 Salem Street + Boston + MA + USA + 2113 + 1.9800000000000000000 + 0.0900000000000000000 + 23 + 2 + + + 408 + 05-Dec-13 00:00:00 + + 1 + 80257000000000 + 319 N. Frances Street + Madison + WI + USA + 53703 + 3.9600000000000000000 + 0.1800000000000000000 + 25 + 3 + + + 409 + 06-Dec-13 00:00:00 + + 1 + 792041000000000 + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + 5.9400000000000000000 + 0.2700000000000000000 + 29 + 3 + + + 410 + 09-Dec-13 00:00:00 + 09-Dec-13 04:21:00 + 3 + + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + 8.9100000000000000000 + 0.4100000000000000000 + 35 + 7 + + + 411 + 14-Dec-13 00:00:00 + + 1 + + Porthaninkatu 9 + Helsinki + + Finland + 00530 + 13.8600000000000000000 + 0.6300000000000000000 + 44 + 3 + + + 412 + 22-Dec-13 00:00:00 + 22-Dec-13 03:34:00 + 3 + 422879000000000 + 12,Community Centre + Delhi + + India + 110017 + 1.9900000000000000000 + 0.1000000000000000000 + 58 + 7 + + + + + + System.Int32 + System.String + System.DateTime + System.DateTime + System.Int32 + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + + + + 1 + General Manager + 18-Feb-62 00:00:00 + 14-Aug-02 00:00:00 + + Adams + Andrew + 11120 Jasper Ave NW + Edmonton + AB + Canada + T5K 2N1 + +1 (780) 428-9482 + +1 (780) 428-3457 + andrew@chinookcorp.com + + + 2 + Sales Manager + 08-Dec-58 00:00:00 + 01-May-02 00:00:00 + 1 + Edwards + Nancy + 825 8 Ave SW + Calgary + AB + Canada + T2P 2T3 + +1 (403) 262-3443 + +1 (403) 262-3322 + nancy@chinookcorp.com + + + 3 + Sales Support Agent + 29-Aug-73 00:00:00 + 01-Apr-02 00:00:00 + 2 + Peacock + Jane + 1111 6 Ave SW + Calgary + AB + Canada + T2P 5M5 + +1 (403) 262-3443 + +1 (403) 262-6712 + jane@chinookcorp.com + + + 4 + Sales Support Agent + 19-Sep-47 00:00:00 + 03-May-03 00:00:00 + 2 + Park + Margaret + 683 10 Street SW + Calgary + AB + Canada + T2P 5G3 + +1 (403) 263-4423 + +1 (403) 263-4289 + margaret@chinookcorp.com + + + 5 + Sales Support Agent + 03-Mar-65 00:00:00 + 17-Oct-03 00:00:00 + 2 + Johnson + Steve + 7727B 41 Ave + Calgary + AB + Canada + T3B 1Y7 + 1 (780) 836-9987 + 1 (780) 836-9543 + steve@chinookcorp.com + + + 6 + IT Manager + 01-Jul-73 00:00:00 + 17-Oct-03 00:00:00 + 1 + Mitchell + Michael + 5827 Bowness Road NW + Calgary + AB + Canada + T3B 0C5 + +1 (403) 246-9887 + +1 (403) 246-9899 + michael@chinookcorp.com + + + 7 + IT Staff + 29-May-70 00:00:00 + 02-Jan-04 00:00:00 + 6 + King + Robert + 590 Columbia Boulevard West + Lethbridge + AB + Canada + T1K 5N8 + +1 (403) 456-9986 + +1 (403) 456-8485 + robert@chinookcorp.com + + + 8 + IT Staff + 09-Jan-68 00:00:00 + 04-Mar-04 00:00:00 + 6 + Callahan + Laura + 923 7 ST NW + Lethbridge + AB + Canada + T1H 1Y8 + +1 (403) 467-3351 + +1 (403) 467-8772 + laura@chinookcorp.com + + + + + + System.Int32 + System.Int32 + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + System.String + + + + 1 + 3 + Embraer - Empresa Brasileira de Aeronáutica S.A. + Gonçalves + Luís + Av. Brigadeiro Faria Lima, 2170 + São José dos Campos + SP + Brazil + 12227-000 + +55 (12) 3923-5555 + +55 (12) 3923-5566 + luisg@embraer.com.br + + + 2 + 5 + + Köhler + Leonie + Theodor-Heuss-Straße 34 + Stuttgart + + Germany + 70174 + +49 0711 2842222 + + leonekohler@surfeu.de + + + 3 + 3 + + Tremblay + François + 1498 rue Bélanger + Montréal + QC + Canada + H2G 1A7 + +1 (514) 721-4711 + + ftremblay@gmail.com + + + 4 + 4 + + Hansen + Bjørn + Ullevålsveien 14 + Oslo + + Norway + 0171 + +47 22 44 22 22 + + bjorn.hansen@yahoo.no + + + 5 + 4 + JetBrains s.r.o. + Wichterlová + František + Klanova 9/506 + Prague + + Czech Republic + 14700 + +420 2 4172 5555 + +420 2 4172 5555 + frantisekw@jetbrains.com + + + 6 + 5 + + Holý + Helena + Rilská 3174/6 + Prague + + Czech Republic + 14300 + +420 2 4177 0449 + + hholy@gmail.com + + + 7 + 5 + + Gruber + Astrid + Rotenturmstraße 4, 1010 Innere Stadt + Vienne + + Austria + 1010 + +43 01 5134505 + + astrid.gruber@apple.at + + + 8 + 4 + + Peeters + Daan + Grétrystraat 63 + Brussels + + Belgium + 1000 + +32 02 219 03 03 + + daan_peeters@apple.be + + + 9 + 4 + + Nielsen + Kara + Sønder Boulevard 51 + Copenhagen + + Denmark + 1720 + +453 3331 9991 + + kara.nielsen@jubii.dk + + + 10 + 4 + Woodstock Discos + Martins + Eduardo + Rua Dr. Falcão Filho, 155 + São Paulo + SP + Brazil + 01007-010 + +55 (11) 3033-5446 + +55 (11) 3033-4564 + eduardo@woodstock.com.br + + + 11 + 5 + Banco do Brasil S.A. + Rocha + Alexandre + Av. Paulista, 2022 + São Paulo + SP + Brazil + 01310-200 + +55 (11) 3055-3278 + +55 (11) 3055-8131 + alero@uol.com.br + + + 12 + 3 + Riotur + Almeida + Roberto + Praça Pio X, 119 + Rio de Janeiro + RJ + Brazil + 20040-020 + +55 (21) 2271-7000 + +55 (21) 2271-7070 + roberto.almeida@riotur.gov.br + + + 13 + 4 + + Ramos + Fernanda + Qe 7 Bloco G + Brasília + DF + Brazil + 71020-677 + +55 (61) 3363-5547 + +55 (61) 3363-7855 + fernadaramos4@uol.com.br + + + 14 + 5 + Telus + Philips + Mark + 8210 111 ST NW + Edmonton + AB + Canada + T6G 2C7 + +1 (780) 434-4554 + +1 (780) 434-5565 + mphilips12@shaw.ca + + + 15 + 3 + Rogers Canada + Peterson + Jennifer + 700 W Pender Street + Vancouver + BC + Canada + V6C 1G8 + +1 (604) 688-2255 + +1 (604) 688-8756 + jenniferp@rogers.ca + + + 16 + 4 + Google Inc. + Harris + Frank + 1600 Amphitheatre Parkway + Mountain View + CA + USA + 94043-1351 + +1 (650) 253-0000 + +1 (650) 253-0000 + fharris@google.com + + + 17 + 5 + Microsoft Corporation + Smith + Jack + 1 Microsoft Way + Redmond + WA + USA + 98052-8300 + +1 (425) 882-8080 + +1 (425) 882-8081 + jacksmith@microsoft.com + + + 18 + 3 + + Brooks + Michelle + 627 Broadway + New York + NY + USA + 10012-2612 + +1 (212) 221-3546 + +1 (212) 221-4679 + michelleb@aol.com + + + 19 + 3 + Apple Inc. + Goyer + Tim + 1 Infinite Loop + Cupertino + CA + USA + 95014 + +1 (408) 996-1010 + +1 (408) 996-1011 + tgoyer@apple.com + + + 20 + 4 + + Miller + Dan + 541 Del Medio Avenue + Mountain View + CA + USA + 94040-111 + +1 (650) 644-3358 + + dmiller@comcast.com + + + 21 + 5 + + Chase + Kathy + 801 W 4th Street + Reno + NV + USA + 89503 + +1 (775) 223-7665 + + kachase@hotmail.com + + + 22 + 4 + + Leacock + Heather + 120 S Orange Ave + Orlando + FL + USA + 32801 + +1 (407) 999-7788 + + hleacock@gmail.com + + + 23 + 4 + + Gordon + John + 69 Salem Street + Boston + MA + USA + 2113 + +1 (617) 522-1333 + + johngordon22@yahoo.com + + + 24 + 3 + + Ralston + Frank + 162 E Superior Street + Chicago + IL + USA + 60611 + +1 (312) 332-3232 + + fralston@gmail.com + + + 25 + 5 + + Stevens + Victor + 319 N. Frances Street + Madison + WI + USA + 53703 + +1 (608) 257-0597 + + vstevens@yahoo.com + + + 26 + 4 + + Cunningham + Richard + 2211 W Berry Street + Fort Worth + TX + USA + 76110 + +1 (817) 924-7272 + + ricunningham@hotmail.com + + + 27 + 4 + + Gray + Patrick + 1033 N Park Ave + Tucson + AZ + USA + 85719 + +1 (520) 622-4200 + + patrick.gray@aol.com + + + 28 + 5 + + Barnett + Julia + 302 S 700 E + Salt Lake City + UT + USA + 84102 + +1 (801) 531-7272 + + jubarnett@gmail.com + + + 29 + 3 + + Brown + Robert + 796 Dundas Street West + Toronto + ON + Canada + M6J 1V1 + +1 (416) 363-8888 + + robbrown@shaw.ca + + + 30 + 3 + + Francis + Edward + 230 Elgin Street + Ottawa + ON + Canada + K2P 1L7 + +1 (613) 234-3322 + + edfrancis@yachoo.ca + + + 31 + 5 + + Silk + Martha + 194A Chain Lake Drive + Halifax + NS + Canada + B3S 1C5 + +1 (902) 450-0450 + + marthasilk@gmail.com + + + 32 + 4 + + Mitchell + Aaron + 696 Osborne Street + Winnipeg + MB + Canada + R3L 2B9 + +1 (204) 452-6452 + + aaronmitchell@yahoo.ca + + + 33 + 3 + + Sullivan + Ellie + 5112 48 Street + Yellowknife + NT + Canada + X1A 1N6 + +1 (867) 920-2233 + + ellie.sullivan@shaw.ca + + + 34 + 4 + + Fernandes + João + Rua da Assunção 53 + Lisbon + + Portugal + + +351 (213) 466-111 + + jfernandes@yahoo.pt + + + 35 + 4 + + Sampaio + Madalena + Rua dos Campeões Europeus de Viena, 4350 + Porto + + Portugal + + +351 (225) 022-448 + + masampaio@sapo.pt + + + 36 + 5 + + Schneider + Hannah + Tauentzienstraße 8 + Berlin + + Germany + 10789 + +49 030 26550280 + + hannah.schneider@yahoo.de + + + 37 + 3 + + Zimmermann + Fynn + Berger Straße 10 + Frankfurt + + Germany + 60316 + +49 069 40598889 + + fzimmermann@yahoo.de + + + 38 + 3 + + Schröder + Niklas + Barbarossastraße 19 + Berlin + + Germany + 10779 + +49 030 2141444 + + nschroder@surfeu.de + + + 39 + 4 + + Bernard + Camille + 4, Rue Milton + Paris + + France + 75009 + +33 01 49 70 65 65 + + camille.bernard@yahoo.fr + + + 40 + 4 + + Lefebvre + Dominique + 8, Rue Hanovre + Paris + + France + 75002 + +33 01 47 42 71 71 + + dominiquelefebvre@gmail.com + + + 41 + 5 + + Dubois + Marc + 11, Place Bellecour + Lyon + + France + 69002 + +33 04 78 30 30 30 + + marc.dubois@hotmail.com + + + 42 + 3 + + Girard + Wyatt + 9, Place Louis Barthou + Bordeaux + + France + 33000 + +33 05 56 96 96 96 + + wyatt.girard@yahoo.fr + + + 43 + 3 + + Mercier + Isabelle + 68, Rue Jouvence + Dijon + + France + 21000 + +33 03 80 73 66 99 + + isabelle_mercier@apple.fr + + + 44 + 3 + + Hämäläinen + Terhi + Porthaninkatu 9 + Helsinki + + Finland + 00530 + +358 09 870 2000 + + terhi.hamalainen@apple.fi + + + 45 + 3 + + Kovács + Ladislav + Erzsébet krt. 58. + Budapest + + Hungary + H-1073 + + + ladislav_kovacs@apple.hu + + + 46 + 3 + + O'Reilly + Hugh + 3 Chatham Street + Dublin + Dublin + Ireland + + +353 01 6792424 + + hughoreilly@apple.ie + + + 47 + 5 + + Mancini + Lucas + Via Degli Scipioni, 43 + Rome + RM + Italy + 00192 + +39 06 39733434 + + lucas.mancini@yahoo.it + + + 48 + 5 + + Van der Berg + Johannes + Lijnbaansgracht 120bg + Amsterdam + VV + Netherlands + 1016 + +31 020 6223130 + + johavanderberg@yahoo.nl + + + 49 + 4 + + Wójcik + Stanisław + Ordynacka 10 + Warsaw + + Poland + 00-358 + +48 22 828 37 39 + + stanisław.wójcik@wp.pl + + + 50 + 5 + + Muñoz + Enrique + C/ San Bernardo 85 + Madrid + + Spain + 28015 + +34 914 454 454 + + enrique_munoz@yahoo.es + + + 51 + 5 + + Johansson + Joakim + Celsiusg. 9 + Stockholm + + Sweden + 11230 + +46 08-651 52 52 + + joakim.johansson@yahoo.se + + + 52 + 3 + + Jones + Emma + 202 Hoxton Street + London + + United Kingdom + N1 5LH + +44 020 7707 0707 + + emma_jones@hotmail.com + + + 53 + 3 + + Hughes + Phil + 113 Lupus St + London + + United Kingdom + SW1V 3EN + +44 020 7976 5722 + + phil.hughes@gmail.com + + + 54 + 5 + + Murray + Steve + 110 Raeburn Pl + Edinburgh + + United Kingdom + EH4 1HH + +44 0131 315 3300 + + steve.murray@yahoo.uk + + + 55 + 4 + + Taylor + Mark + 421 Bourke Street + Sidney + NSW + Australia + 2010 + +61 (02) 9332 3633 + + mark.taylor@yahoo.au + + + 56 + 4 + + Gutiérrez + Diego + 307 Macacha Güemes + Buenos Aires + + Argentina + 1106 + +54 (0)11 4311 4333 + + diego.gutierrez@yahoo.ar + + + 57 + 5 + + Rojas + Luis + Calle Lira, 198 + Santiago + + Chile + + +56 (0)2 635 4444 + + luisrojas@yahoo.cl + + + 58 + 3 + + Pareek + Manoj + 12,Community Centre + Delhi + + India + 110017 + +91 0124 39883988 + + manoj.pareek@rediff.com + + + 59 + 3 + + Srivastava + Puja + 3,Raj Bhavan Road + Bangalore + + India + 560001 + +91 080 22289999 + + puja_srivastava@yahoo.in + + + 60 + 3 + + Cheema + Adharma + Sno16-11-741, Dilsukhnagar + Hyderabad + + India + 560001 + +91 080 26239988 + + puja_srivastava@yahoo.in + + + + + + System.Int32 + System.Int32 + + + + 1 + 1 + + + 8 + 1 + + + 17 + 1 + + + 1 + 2 + + + 8 + 2 + + + 17 + 2 + + + 1 + 3 + + + 5 + 3 + + + 8 + 3 + + + 17 + 3 + + + 1 + 4 + + + 5 + 4 + + + 8 + 4 + + + 17 + 4 + + + 1 + 5 + + + 5 + 5 + + + 8 + 5 + + + 17 + 5 + + + 1 + 6 + + + 8 + 6 + + + 1 + 7 + + + 8 + 7 + + + 1 + 8 + + + 8 + 8 + + + 1 + 9 + + + 8 + 9 + + + 1 + 10 + + + 8 + 10 + + + 1 + 11 + + + 8 + 11 + + + 1 + 12 + + + 8 + 12 + + + 1 + 13 + + + 8 + 13 + + + 1 + 14 + + + 8 + 14 + + + 1 + 15 + + + 8 + 15 + + + 1 + 16 + + + 8 + 16 + + + 1 + 17 + + + 8 + 17 + + + 1 + 18 + + + 8 + 18 + + + 1 + 19 + + + 8 + 19 + + + 1 + 20 + + + 8 + 20 + + + 1 + 21 + + + 8 + 21 + + + 1 + 22 + + + 8 + 22 + + + 1 + 23 + + + 5 + 23 + + + 8 + 23 + + + 1 + 24 + + + 5 + 24 + + + 8 + 24 + + + 1 + 25 + + + 5 + 25 + + + 8 + 25 + + + 1 + 26 + + + 5 + 26 + + + 8 + 26 + + + 1 + 27 + + + 5 + 27 + + + 8 + 27 + + + 1 + 28 + + + 5 + 28 + + + 8 + 28 + + + 1 + 29 + + + 5 + 29 + + + 8 + 29 + + + 1 + 30 + + + 5 + 30 + + + 8 + 30 + + + 1 + 31 + + + 5 + 31 + + + 8 + 31 + + + 1 + 32 + + + 5 + 32 + + + 8 + 32 + + + 1 + 33 + + + 5 + 33 + + + 8 + 33 + + + 1 + 34 + + + 5 + 34 + + + 8 + 34 + + + 1 + 35 + + + 5 + 35 + + + 8 + 35 + + + 1 + 36 + + + 5 + 36 + + + 8 + 36 + + + 1 + 37 + + + 5 + 37 + + + 8 + 37 + + + 1 + 38 + + + 5 + 38 + + + 8 + 38 + + + 1 + 39 + + + 5 + 39 + + + 8 + 39 + + + 1 + 40 + + + 5 + 40 + + + 8 + 40 + + + 1 + 41 + + + 5 + 41 + + + 8 + 41 + + + 1 + 42 + + + 5 + 42 + + + 8 + 42 + + + 1 + 43 + + + 5 + 43 + + + 8 + 43 + + + 1 + 44 + + + 5 + 44 + + + 8 + 44 + + + 1 + 45 + + + 5 + 45 + + + 8 + 45 + + + 1 + 46 + + + 5 + 46 + + + 8 + 46 + + + 1 + 47 + + + 5 + 47 + + + 8 + 47 + + + 1 + 48 + + + 5 + 48 + + + 8 + 48 + + + 1 + 49 + + + 5 + 49 + + + 8 + 49 + + + 1 + 50 + + + 5 + 50 + + + 8 + 50 + + + 1 + 51 + + + 5 + 51 + + + 8 + 51 + + + 1 + 52 + + + 5 + 52 + + + 8 + 52 + + + 16 + 52 + + + 1 + 53 + + + 5 + 53 + + + 8 + 53 + + + 1 + 54 + + + 5 + 54 + + + 8 + 54 + + + 1 + 55 + + + 5 + 55 + + + 8 + 55 + + + 1 + 56 + + + 5 + 56 + + + 8 + 56 + + + 1 + 57 + + + 5 + 57 + + + 8 + 57 + + + 1 + 58 + + + 5 + 58 + + + 8 + 58 + + + 1 + 59 + + + 5 + 59 + + + 8 + 59 + + + 1 + 60 + + + 5 + 60 + + + 8 + 60 + + + 1 + 61 + + + 5 + 61 + + + 8 + 61 + + + 1 + 62 + + + 5 + 62 + + + 8 + 62 + + + 1 + 63 + + + 8 + 63 + + + 1 + 64 + + + 8 + 64 + + + 1 + 65 + + + 8 + 65 + + + 1 + 66 + + + 8 + 66 + + + 1 + 67 + + + 8 + 67 + + + 1 + 68 + + + 8 + 68 + + + 1 + 69 + + + 8 + 69 + + + 1 + 70 + + + 8 + 70 + + + 1 + 71 + + + 8 + 71 + + + 1 + 72 + + + 8 + 72 + + + 1 + 73 + + + 8 + 73 + + + 1 + 74 + + + 8 + 74 + + + 1 + 75 + + + 8 + 75 + + + 1 + 76 + + + 8 + 76 + + + 1 + 77 + + + 5 + 77 + + + 8 + 77 + + + 1 + 78 + + + 5 + 78 + + + 8 + 78 + + + 1 + 79 + + + 5 + 79 + + + 8 + 79 + + + 1 + 80 + + + 5 + 80 + + + 8 + 80 + + + 1 + 81 + + + 5 + 81 + + + 8 + 81 + + + 1 + 82 + + + 5 + 82 + + + 8 + 82 + + + 1 + 83 + + + 5 + 83 + + + 8 + 83 + + + 1 + 84 + + + 5 + 84 + + + 8 + 84 + + + 1 + 85 + + + 8 + 85 + + + 1 + 86 + + + 8 + 86 + + + 1 + 87 + + + 8 + 87 + + + 1 + 88 + + + 8 + 88 + + + 1 + 89 + + + 8 + 89 + + + 1 + 90 + + + 8 + 90 + + + 1 + 91 + + + 8 + 91 + + + 1 + 92 + + + 8 + 92 + + + 1 + 93 + + + 8 + 93 + + + 1 + 94 + + + 8 + 94 + + + 1 + 95 + + + 8 + 95 + + + 1 + 96 + + + 8 + 96 + + + 1 + 97 + + + 8 + 97 + + + 1 + 98 + + + 8 + 98 + + + 1 + 99 + + + 8 + 99 + + + 1 + 100 + + + 8 + 100 + + + 1 + 101 + + + 8 + 101 + + + 1 + 102 + + + 8 + 102 + + + 1 + 103 + + + 8 + 103 + + + 1 + 104 + + + 8 + 104 + + + 1 + 105 + + + 8 + 105 + + + 1 + 106 + + + 8 + 106 + + + 1 + 107 + + + 8 + 107 + + + 1 + 108 + + + 8 + 108 + + + 1 + 109 + + + 8 + 109 + + + 1 + 110 + + + 8 + 110 + + + 1 + 111 + + + 5 + 111 + + + 8 + 111 + + + 1 + 112 + + + 5 + 112 + + + 8 + 112 + + + 1 + 113 + + + 5 + 113 + + + 8 + 113 + + + 1 + 114 + + + 5 + 114 + + + 8 + 114 + + + 1 + 115 + + + 5 + 115 + + + 8 + 115 + + + 1 + 116 + + + 5 + 116 + + + 8 + 116 + + + 1 + 117 + + + 5 + 117 + + + 8 + 117 + + + 1 + 118 + + + 5 + 118 + + + 8 + 118 + + + 1 + 119 + + + 5 + 119 + + + 8 + 119 + + + 1 + 120 + + + 5 + 120 + + + 8 + 120 + + + 1 + 121 + + + 5 + 121 + + + 8 + 121 + + + 1 + 122 + + + 5 + 122 + + + 8 + 122 + + + 1 + 123 + + + 8 + 123 + + + 1 + 124 + + + 8 + 124 + + + 1 + 125 + + + 8 + 125 + + + 1 + 126 + + + 8 + 126 + + + 1 + 127 + + + 8 + 127 + + + 1 + 128 + + + 8 + 128 + + + 1 + 129 + + + 8 + 129 + + + 1 + 130 + + + 8 + 130 + + + 1 + 131 + + + 8 + 131 + + + 1 + 132 + + + 8 + 132 + + + 1 + 133 + + + 8 + 133 + + + 1 + 134 + + + 8 + 134 + + + 1 + 135 + + + 8 + 135 + + + 1 + 136 + + + 8 + 136 + + + 1 + 137 + + + 8 + 137 + + + 1 + 138 + + + 8 + 138 + + + 1 + 139 + + + 8 + 139 + + + 1 + 140 + + + 8 + 140 + + + 1 + 141 + + + 8 + 141 + + + 1 + 142 + + + 8 + 142 + + + 1 + 143 + + + 8 + 143 + + + 1 + 144 + + + 8 + 144 + + + 1 + 145 + + + 8 + 145 + + + 1 + 146 + + + 8 + 146 + + + 1 + 147 + + + 8 + 147 + + + 1 + 148 + + + 8 + 148 + + + 1 + 149 + + + 8 + 149 + + + 1 + 150 + + + 8 + 150 + + + 1 + 151 + + + 8 + 151 + + + 1 + 152 + + + 8 + 152 + + + 17 + 152 + + + 1 + 153 + + + 8 + 153 + + + 1 + 154 + + + 8 + 154 + + + 1 + 155 + + + 8 + 155 + + + 1 + 156 + + + 8 + 156 + + + 1 + 157 + + + 8 + 157 + + + 1 + 158 + + + 8 + 158 + + + 1 + 159 + + + 8 + 159 + + + 1 + 160 + + + 8 + 160 + + + 17 + 160 + + + 1 + 161 + + + 8 + 161 + + + 1 + 162 + + + 8 + 162 + + + 1 + 163 + + + 8 + 163 + + + 1 + 164 + + + 8 + 164 + + + 1 + 165 + + + 8 + 165 + + + 1 + 166 + + + 5 + 166 + + + 8 + 166 + + + 1 + 167 + + + 5 + 167 + + + 8 + 167 + + + 1 + 168 + + + 5 + 168 + + + 8 + 168 + + + 1 + 169 + + + 5 + 169 + + + 8 + 169 + + + 1 + 170 + + + 5 + 170 + + + 8 + 170 + + + 1 + 171 + + + 5 + 171 + + + 8 + 171 + + + 1 + 172 + + + 5 + 172 + + + 8 + 172 + + + 1 + 173 + + + 5 + 173 + + + 8 + 173 + + + 1 + 174 + + + 5 + 174 + + + 8 + 174 + + + 1 + 175 + + + 5 + 175 + + + 8 + 175 + + + 1 + 176 + + + 5 + 176 + + + 8 + 176 + + + 1 + 177 + + + 5 + 177 + + + 8 + 177 + + + 1 + 178 + + + 5 + 178 + + + 8 + 178 + + + 1 + 179 + + + 5 + 179 + + + 8 + 179 + + + 1 + 180 + + + 5 + 180 + + + 8 + 180 + + + 1 + 181 + + + 5 + 181 + + + 8 + 181 + + + 1 + 182 + + + 5 + 182 + + + 8 + 182 + + + 1 + 183 + + + 5 + 183 + + + 8 + 183 + + + 1 + 184 + + + 5 + 184 + + + 8 + 184 + + + 1 + 185 + + + 5 + 185 + + + 8 + 185 + + + 1 + 186 + + + 5 + 186 + + + 8 + 186 + + + 1 + 187 + + + 5 + 187 + + + 8 + 187 + + + 1 + 188 + + + 5 + 188 + + + 8 + 188 + + + 1 + 189 + + + 5 + 189 + + + 8 + 189 + + + 1 + 190 + + + 5 + 190 + + + 8 + 190 + + + 1 + 191 + + + 5 + 191 + + + 8 + 191 + + + 1 + 192 + + + 5 + 192 + + + 8 + 192 + + + 1 + 193 + + + 5 + 193 + + + 8 + 193 + + + 1 + 194 + + + 8 + 194 + + + 1 + 195 + + + 8 + 195 + + + 1 + 196 + + + 8 + 196 + + + 1 + 197 + + + 8 + 197 + + + 1 + 198 + + + 8 + 198 + + + 1 + 199 + + + 8 + 199 + + + 1 + 200 + + + 8 + 200 + + + 1 + 201 + + + 8 + 201 + + + 1 + 202 + + + 8 + 202 + + + 1 + 203 + + + 8 + 203 + + + 1 + 204 + + + 8 + 204 + + + 1 + 205 + + + 5 + 205 + + + 8 + 205 + + + 1 + 206 + + + 5 + 206 + + + 8 + 206 + + + 1 + 207 + + + 5 + 207 + + + 8 + 207 + + + 1 + 208 + + + 5 + 208 + + + 8 + 208 + + + 1 + 209 + + + 5 + 209 + + + 8 + 209 + + + 1 + 210 + + + 5 + 210 + + + 8 + 210 + + + 1 + 211 + + + 5 + 211 + + + 8 + 211 + + + 1 + 212 + + + 5 + 212 + + + 8 + 212 + + + 1 + 213 + + + 5 + 213 + + + 8 + 213 + + + 1 + 214 + + + 5 + 214 + + + 8 + 214 + + + 1 + 215 + + + 5 + 215 + + + 8 + 215 + + + 11 + 215 + + + 1 + 216 + + + 5 + 216 + + + 8 + 216 + + + 1 + 217 + + + 5 + 217 + + + 8 + 217 + + + 1 + 218 + + + 5 + 218 + + + 8 + 218 + + + 1 + 219 + + + 5 + 219 + + + 8 + 219 + + + 11 + 219 + + + 1 + 220 + + + 5 + 220 + + + 8 + 220 + + + 11 + 220 + + + 1 + 221 + + + 5 + 221 + + + 8 + 221 + + + 1 + 222 + + + 5 + 222 + + + 8 + 222 + + + 1 + 223 + + + 8 + 223 + + + 1 + 224 + + + 8 + 224 + + + 1 + 225 + + + 8 + 225 + + + 1 + 226 + + + 8 + 226 + + + 1 + 227 + + + 8 + 227 + + + 1 + 228 + + + 8 + 228 + + + 11 + 228 + + + 1 + 229 + + + 8 + 229 + + + 1 + 230 + + + 8 + 230 + + + 11 + 230 + + + 1 + 231 + + + 8 + 231 + + + 1 + 232 + + + 8 + 232 + + + 1 + 233 + + + 8 + 233 + + + 1 + 234 + + + 8 + 234 + + + 1 + 235 + + + 8 + 235 + + + 1 + 236 + + + 8 + 236 + + + 11 + 236 + + + 1 + 237 + + + 8 + 237 + + + 1 + 238 + + + 8 + 238 + + + 1 + 239 + + + 8 + 239 + + + 1 + 240 + + + 8 + 240 + + + 1 + 241 + + + 8 + 241 + + + 1 + 242 + + + 8 + 242 + + + 1 + 243 + + + 8 + 243 + + + 1 + 244 + + + 8 + 244 + + + 1 + 245 + + + 8 + 245 + + + 1 + 246 + + + 5 + 246 + + + 8 + 246 + + + 1 + 247 + + + 5 + 247 + + + 8 + 247 + + + 1 + 248 + + + 5 + 248 + + + 8 + 248 + + + 1 + 249 + + + 5 + 249 + + + 8 + 249 + + + 1 + 250 + + + 5 + 250 + + + 8 + 250 + + + 1 + 251 + + + 5 + 251 + + + 8 + 251 + + + 1 + 252 + + + 5 + 252 + + + 8 + 252 + + + 1 + 253 + + + 5 + 253 + + + 8 + 253 + + + 1 + 254 + + + 5 + 254 + + + 8 + 254 + + + 1 + 255 + + + 5 + 255 + + + 8 + 255 + + + 1 + 256 + + + 5 + 256 + + + 8 + 256 + + + 1 + 257 + + + 5 + 257 + + + 8 + 257 + + + 1 + 258 + + + 5 + 258 + + + 8 + 258 + + + 1 + 259 + + + 5 + 259 + + + 8 + 259 + + + 1 + 260 + + + 5 + 260 + + + 8 + 260 + + + 1 + 261 + + + 5 + 261 + + + 8 + 261 + + + 1 + 262 + + + 5 + 262 + + + 8 + 262 + + + 1 + 263 + + + 5 + 263 + + + 8 + 263 + + + 1 + 264 + + + 5 + 264 + + + 8 + 264 + + + 1 + 265 + + + 5 + 265 + + + 8 + 265 + + + 1 + 266 + + + 5 + 266 + + + 8 + 266 + + + 1 + 267 + + + 5 + 267 + + + 8 + 267 + + + 1 + 268 + + + 5 + 268 + + + 8 + 268 + + + 1 + 269 + + + 5 + 269 + + + 8 + 269 + + + 1 + 270 + + + 5 + 270 + + + 8 + 270 + + + 1 + 271 + + + 5 + 271 + + + 8 + 271 + + + 1 + 272 + + + 5 + 272 + + + 8 + 272 + + + 1 + 273 + + + 5 + 273 + + + 8 + 273 + + + 1 + 274 + + + 5 + 274 + + + 8 + 274 + + + 1 + 275 + + + 5 + 275 + + + 8 + 275 + + + 1 + 276 + + + 5 + 276 + + + 8 + 276 + + + 1 + 277 + + + 5 + 277 + + + 8 + 277 + + + 1 + 278 + + + 5 + 278 + + + 8 + 278 + + + 1 + 279 + + + 5 + 279 + + + 8 + 279 + + + 1 + 280 + + + 5 + 280 + + + 8 + 280 + + + 1 + 281 + + + 5 + 281 + + + 8 + 281 + + + 1 + 282 + + + 8 + 282 + + + 1 + 283 + + + 8 + 283 + + + 1 + 284 + + + 8 + 284 + + + 1 + 285 + + + 8 + 285 + + + 1 + 286 + + + 8 + 286 + + + 1 + 287 + + + 8 + 287 + + + 1 + 288 + + + 8 + 288 + + + 1 + 289 + + + 8 + 289 + + + 1 + 290 + + + 8 + 290 + + + 1 + 291 + + + 8 + 291 + + + 1 + 292 + + + 8 + 292 + + + 1 + 293 + + + 8 + 293 + + + 1 + 294 + + + 8 + 294 + + + 1 + 295 + + + 8 + 295 + + + 1 + 296 + + + 8 + 296 + + + 1 + 297 + + + 8 + 297 + + + 1 + 298 + + + 8 + 298 + + + 1 + 299 + + + 5 + 299 + + + 8 + 299 + + + 1 + 300 + + + 5 + 300 + + + 8 + 300 + + + 1 + 301 + + + 5 + 301 + + + 8 + 301 + + + 1 + 302 + + + 5 + 302 + + + 8 + 302 + + + 1 + 303 + + + 5 + 303 + + + 8 + 303 + + + 1 + 304 + + + 5 + 304 + + + 8 + 304 + + + 1 + 305 + + + 5 + 305 + + + 8 + 305 + + + 1 + 306 + + + 5 + 306 + + + 8 + 306 + + + 1 + 307 + + + 5 + 307 + + + 8 + 307 + + + 1 + 308 + + + 5 + 308 + + + 8 + 308 + + + 1 + 309 + + + 5 + 309 + + + 8 + 309 + + + 1 + 310 + + + 5 + 310 + + + 8 + 310 + + + 1 + 311 + + + 5 + 311 + + + 8 + 311 + + + 1 + 312 + + + 5 + 312 + + + 8 + 312 + + + 1 + 313 + + + 8 + 313 + + + 1 + 314 + + + 8 + 314 + + + 1 + 315 + + + 8 + 315 + + + 1 + 316 + + + 8 + 316 + + + 1 + 317 + + + 8 + 317 + + + 1 + 318 + + + 8 + 318 + + + 1 + 319 + + + 8 + 319 + + + 1 + 320 + + + 8 + 320 + + + 1 + 321 + + + 8 + 321 + + + 1 + 322 + + + 8 + 322 + + + 1 + 323 + + + 8 + 323 + + + 1 + 324 + + + 8 + 324 + + + 1 + 325 + + + 8 + 325 + + + 1 + 326 + + + 8 + 326 + + + 1 + 327 + + + 8 + 327 + + + 1 + 328 + + + 8 + 328 + + + 1 + 329 + + + 8 + 329 + + + 1 + 330 + + + 8 + 330 + + + 1 + 331 + + + 8 + 331 + + + 1 + 332 + + + 8 + 332 + + + 1 + 333 + + + 8 + 333 + + + 1 + 334 + + + 8 + 334 + + + 1 + 335 + + + 8 + 335 + + + 1 + 336 + + + 8 + 336 + + + 1 + 337 + + + 5 + 337 + + + 8 + 337 + + + 1 + 338 + + + 5 + 338 + + + 8 + 338 + + + 1 + 339 + + + 5 + 339 + + + 8 + 339 + + + 1 + 340 + + + 5 + 340 + + + 8 + 340 + + + 1 + 341 + + + 5 + 341 + + + 8 + 341 + + + 1 + 342 + + + 5 + 342 + + + 8 + 342 + + + 1 + 343 + + + 5 + 343 + + + 8 + 343 + + + 1 + 344 + + + 5 + 344 + + + 8 + 344 + + + 1 + 345 + + + 5 + 345 + + + 8 + 345 + + + 1 + 346 + + + 5 + 346 + + + 8 + 346 + + + 1 + 347 + + + 5 + 347 + + + 8 + 347 + + + 1 + 348 + + + 5 + 348 + + + 8 + 348 + + + 1 + 349 + + + 5 + 349 + + + 8 + 349 + + + 1 + 350 + + + 5 + 350 + + + 8 + 350 + + + 1 + 351 + + + 8 + 351 + + + 1 + 352 + + + 8 + 352 + + + 1 + 353 + + + 8 + 353 + + + 1 + 354 + + + 8 + 354 + + + 1 + 355 + + + 8 + 355 + + + 1 + 356 + + + 8 + 356 + + + 1 + 357 + + + 8 + 357 + + + 1 + 358 + + + 8 + 358 + + + 1 + 359 + + + 8 + 359 + + + 1 + 360 + + + 8 + 360 + + + 1 + 361 + + + 8 + 361 + + + 1 + 362 + + + 8 + 362 + + + 1 + 363 + + + 8 + 363 + + + 1 + 364 + + + 8 + 364 + + + 1 + 365 + + + 8 + 365 + + + 1 + 366 + + + 8 + 366 + + + 1 + 367 + + + 8 + 367 + + + 1 + 368 + + + 8 + 368 + + + 1 + 369 + + + 8 + 369 + + + 1 + 370 + + + 8 + 370 + + + 1 + 371 + + + 8 + 371 + + + 1 + 372 + + + 8 + 372 + + + 1 + 373 + + + 8 + 373 + + + 1 + 374 + + + 8 + 374 + + + 1 + 375 + + + 8 + 375 + + + 1 + 376 + + + 8 + 376 + + + 1 + 377 + + + 8 + 377 + + + 1 + 378 + + + 8 + 378 + + + 1 + 379 + + + 8 + 379 + + + 1 + 380 + + + 8 + 380 + + + 1 + 381 + + + 8 + 381 + + + 1 + 382 + + + 8 + 382 + + + 1 + 383 + + + 8 + 383 + + + 1 + 384 + + + 8 + 384 + + + 1 + 385 + + + 8 + 385 + + + 1 + 386 + + + 8 + 386 + + + 1 + 387 + + + 8 + 387 + + + 1 + 388 + + + 8 + 388 + + + 1 + 389 + + + 8 + 389 + + + 1 + 390 + + + 8 + 390 + + + 1 + 391 + + + 8 + 391 + + + 11 + 391 + + + 1 + 392 + + + 8 + 392 + + + 1 + 393 + + + 8 + 393 + + + 11 + 393 + + + 1 + 394 + + + 8 + 394 + + + 1 + 395 + + + 8 + 395 + + + 1 + 396 + + + 8 + 396 + + + 1 + 397 + + + 8 + 397 + + + 1 + 398 + + + 8 + 398 + + + 1 + 399 + + + 8 + 399 + + + 1 + 400 + + + 8 + 400 + + + 1 + 401 + + + 8 + 401 + + + 1 + 402 + + + 8 + 402 + + + 1 + 403 + + + 8 + 403 + + + 1 + 404 + + + 8 + 404 + + + 1 + 405 + + + 8 + 405 + + + 1 + 406 + + + 8 + 406 + + + 1 + 407 + + + 8 + 407 + + + 1 + 408 + + + 5 + 408 + + + 8 + 408 + + + 1 + 409 + + + 5 + 409 + + + 8 + 409 + + + 1 + 410 + + + 5 + 410 + + + 8 + 410 + + + 1 + 411 + + + 5 + 411 + + + 8 + 411 + + + 1 + 412 + + + 5 + 412 + + + 8 + 412 + + + 1 + 413 + + + 5 + 413 + + + 8 + 413 + + + 1 + 414 + + + 5 + 414 + + + 8 + 414 + + + 1 + 415 + + + 5 + 415 + + + 8 + 415 + + + 1 + 416 + + + 5 + 416 + + + 8 + 416 + + + 1 + 417 + + + 5 + 417 + + + 8 + 417 + + + 1 + 418 + + + 5 + 418 + + + 8 + 418 + + + 1 + 419 + + + 8 + 419 + + + 1 + 420 + + + 8 + 420 + + + 1 + 421 + + + 8 + 421 + + + 1 + 422 + + + 8 + 422 + + + 1 + 423 + + + 8 + 423 + + + 1 + 424 + + + 5 + 424 + + + 8 + 424 + + + 1 + 425 + + + 8 + 425 + + + 1 + 426 + + + 8 + 426 + + + 1 + 427 + + + 8 + 427 + + + 1 + 428 + + + 5 + 428 + + + 8 + 428 + + + 1 + 429 + + + 8 + 429 + + + 1 + 430 + + + 5 + 430 + + + 8 + 430 + + + 1 + 431 + + + 8 + 431 + + + 1 + 432 + + + 8 + 432 + + + 1 + 433 + + + 8 + 433 + + + 1 + 434 + + + 5 + 434 + + + 8 + 434 + + + 1 + 435 + + + 8 + 435 + + + 1 + 436 + + + 5 + 436 + + + 8 + 436 + + + 1 + 437 + + + 5 + 437 + + + 8 + 437 + + + 1 + 438 + + + 5 + 438 + + + 8 + 438 + + + 1 + 439 + + + 5 + 439 + + + 8 + 439 + + + 1 + 440 + + + 5 + 440 + + + 8 + 440 + + + 1 + 441 + + + 5 + 441 + + + 8 + 441 + + + 1 + 442 + + + 5 + 442 + + + 8 + 442 + + + 1 + 443 + + + 5 + 443 + + + 8 + 443 + + + 1 + 444 + + + 5 + 444 + + + 8 + 444 + + + 1 + 445 + + + 5 + 445 + + + 8 + 445 + + + 1 + 446 + + + 5 + 446 + + + 8 + 446 + + + 1 + 447 + + + 5 + 447 + + + 8 + 447 + + + 1 + 448 + + + 5 + 448 + + + 8 + 448 + + + 1 + 449 + + + 5 + 449 + + + 8 + 449 + + + 1 + 450 + + + 5 + 450 + + + 8 + 450 + + + 1 + 451 + + + 5 + 451 + + + 8 + 451 + + + 1 + 452 + + + 8 + 452 + + + 1 + 453 + + + 5 + 453 + + + 8 + 453 + + + 1 + 454 + + + 5 + 454 + + + 8 + 454 + + + 1 + 455 + + + 5 + 455 + + + 8 + 455 + + + 1 + 456 + + + 5 + 456 + + + 8 + 456 + + + 1 + 457 + + + 5 + 457 + + + 8 + 457 + + + 1 + 458 + + + 5 + 458 + + + 8 + 458 + + + 1 + 459 + + + 5 + 459 + + + 8 + 459 + + + 1 + 460 + + + 5 + 460 + + + 8 + 460 + + + 1 + 461 + + + 5 + 461 + + + 8 + 461 + + + 1 + 462 + + + 5 + 462 + + + 8 + 462 + + + 1 + 463 + + + 5 + 463 + + + 8 + 463 + + + 1 + 464 + + + 5 + 464 + + + 8 + 464 + + + 1 + 465 + + + 5 + 465 + + + 8 + 465 + + + 1 + 466 + + + 5 + 466 + + + 8 + 466 + + + 1 + 467 + + + 5 + 467 + + + 8 + 467 + + + 1 + 468 + + + 8 + 468 + + + 1 + 469 + + + 8 + 469 + + + 1 + 470 + + + 5 + 470 + + + 8 + 470 + + + 1 + 471 + + + 5 + 471 + + + 8 + 471 + + + 1 + 472 + + + 5 + 472 + + + 8 + 472 + + + 1 + 473 + + + 5 + 473 + + + 8 + 473 + + + 1 + 474 + + + 5 + 474 + + + 8 + 474 + + + 1 + 475 + + + 5 + 475 + + + 8 + 475 + + + 1 + 476 + + + 5 + 476 + + + 8 + 476 + + + 1 + 477 + + + 5 + 477 + + + 8 + 477 + + + 1 + 478 + + + 5 + 478 + + + 8 + 478 + + + 1 + 479 + + + 5 + 479 + + + 8 + 479 + + + 1 + 480 + + + 5 + 480 + + + 8 + 480 + + + 1 + 481 + + + 5 + 481 + + + 8 + 481 + + + 1 + 482 + + + 5 + 482 + + + 8 + 482 + + + 1 + 483 + + + 5 + 483 + + + 8 + 483 + + + 1 + 484 + + + 5 + 484 + + + 8 + 484 + + + 1 + 485 + + + 8 + 485 + + + 1 + 486 + + + 8 + 486 + + + 1 + 487 + + + 8 + 487 + + + 1 + 488 + + + 8 + 488 + + + 1 + 489 + + + 8 + 489 + + + 1 + 490 + + + 8 + 490 + + + 1 + 491 + + + 8 + 491 + + + 1 + 492 + + + 8 + 492 + + + 1 + 493 + + + 8 + 493 + + + 1 + 494 + + + 8 + 494 + + + 1 + 495 + + + 8 + 495 + + + 1 + 496 + + + 8 + 496 + + + 1 + 497 + + + 8 + 497 + + + 1 + 498 + + + 8 + 498 + + + 1 + 499 + + + 8 + 499 + + + 1 + 500 + + + 8 + 500 + + + 1 + 501 + + + 5 + 501 + + + 8 + 501 + + + 11 + 501 + + + 1 + 502 + + + 5 + 502 + + + 8 + 502 + + + 1 + 503 + + + 5 + 503 + + + 8 + 503 + + + 1 + 504 + + + 5 + 504 + + + 8 + 504 + + + 11 + 504 + + + 1 + 505 + + + 5 + 505 + + + 8 + 505 + + + 1 + 506 + + + 5 + 506 + + + 8 + 506 + + + 1 + 507 + + + 5 + 507 + + + 8 + 507 + + + 1 + 508 + + + 5 + 508 + + + 8 + 508 + + + 1 + 509 + + + 5 + 509 + + + 8 + 509 + + + 1 + 510 + + + 5 + 510 + + + 8 + 510 + + + 1 + 511 + + + 5 + 511 + + + 8 + 511 + + + 1 + 512 + + + 5 + 512 + + + 8 + 512 + + + 1 + 513 + + + 5 + 513 + + + 8 + 513 + + + 1 + 514 + + + 5 + 514 + + + 8 + 514 + + + 1 + 515 + + + 5 + 515 + + + 8 + 515 + + + 1 + 516 + + + 5 + 516 + + + 8 + 516 + + + 11 + 516 + + + 1 + 517 + + + 5 + 517 + + + 8 + 517 + + + 1 + 518 + + + 5 + 518 + + + 8 + 518 + + + 1 + 519 + + + 5 + 519 + + + 8 + 519 + + + 1 + 520 + + + 5 + 520 + + + 8 + 520 + + + 1 + 521 + + + 5 + 521 + + + 8 + 521 + + + 1 + 522 + + + 5 + 522 + + + 8 + 522 + + + 1 + 523 + + + 5 + 523 + + + 8 + 523 + + + 11 + 523 + + + 1 + 524 + + + 5 + 524 + + + 8 + 524 + + + 1 + 525 + + + 5 + 525 + + + 8 + 525 + + + 1 + 526 + + + 5 + 526 + + + 8 + 526 + + + 1 + 527 + + + 5 + 527 + + + 8 + 527 + + + 1 + 528 + + + 5 + 528 + + + 8 + 528 + + + 1 + 529 + + + 8 + 529 + + + 1 + 530 + + + 8 + 530 + + + 1 + 531 + + + 8 + 531 + + + 1 + 532 + + + 8 + 532 + + + 1 + 533 + + + 8 + 533 + + + 1 + 534 + + + 8 + 534 + + + 1 + 535 + + + 8 + 535 + + + 1 + 536 + + + 8 + 536 + + + 1 + 537 + + + 8 + 537 + + + 1 + 538 + + + 8 + 538 + + + 1 + 539 + + + 8 + 539 + + + 1 + 540 + + + 8 + 540 + + + 1 + 541 + + + 8 + 541 + + + 1 + 542 + + + 8 + 542 + + + 1 + 543 + + + 8 + 543 + + + 1 + 544 + + + 8 + 544 + + + 1 + 545 + + + 8 + 545 + + + 1 + 546 + + + 8 + 546 + + + 1 + 547 + + + 8 + 547 + + + 1 + 548 + + + 8 + 548 + + + 1 + 549 + + + 8 + 549 + + + 1 + 550 + + + 8 + 550 + + + 1 + 551 + + + 8 + 551 + + + 1 + 552 + + + 8 + 552 + + + 1 + 553 + + + 8 + 553 + + + 1 + 554 + + + 8 + 554 + + + 1 + 555 + + + 8 + 555 + + + 1 + 556 + + + 8 + 556 + + + 1 + 557 + + + 8 + 557 + + + 1 + 558 + + + 8 + 558 + + + 1 + 559 + + + 8 + 559 + + + 1 + 560 + + + 8 + 560 + + + 1 + 561 + + + 8 + 561 + + + 1 + 562 + + + 8 + 562 + + + 1 + 563 + + + 8 + 563 + + + 1 + 564 + + + 8 + 564 + + + 1 + 565 + + + 8 + 565 + + + 1 + 566 + + + 8 + 566 + + + 1 + 567 + + + 8 + 567 + + + 1 + 568 + + + 8 + 568 + + + 1 + 569 + + + 8 + 569 + + + 1 + 570 + + + 5 + 570 + + + 8 + 570 + + + 1 + 571 + + + 5 + 571 + + + 8 + 571 + + + 1 + 572 + + + 5 + 572 + + + 8 + 572 + + + 1 + 573 + + + 5 + 573 + + + 8 + 573 + + + 1 + 574 + + + 5 + 574 + + + 8 + 574 + + + 1 + 575 + + + 5 + 575 + + + 8 + 575 + + + 1 + 576 + + + 5 + 576 + + + 8 + 576 + + + 1 + 577 + + + 5 + 577 + + + 8 + 577 + + + 1 + 578 + + + 5 + 578 + + + 8 + 578 + + + 1 + 579 + + + 5 + 579 + + + 8 + 579 + + + 1 + 580 + + + 5 + 580 + + + 8 + 580 + + + 1 + 581 + + + 5 + 581 + + + 8 + 581 + + + 1 + 582 + + + 5 + 582 + + + 8 + 582 + + + 1 + 583 + + + 5 + 583 + + + 8 + 583 + + + 1 + 584 + + + 5 + 584 + + + 8 + 584 + + + 1 + 585 + + + 5 + 585 + + + 8 + 585 + + + 1 + 586 + + + 5 + 586 + + + 8 + 586 + + + 1 + 587 + + + 5 + 587 + + + 8 + 587 + + + 1 + 588 + + + 5 + 588 + + + 8 + 588 + + + 1 + 589 + + + 5 + 589 + + + 8 + 589 + + + 1 + 590 + + + 5 + 590 + + + 8 + 590 + + + 1 + 591 + + + 5 + 591 + + + 8 + 591 + + + 1 + 592 + + + 5 + 592 + + + 8 + 592 + + + 1 + 593 + + + 5 + 593 + + + 8 + 593 + + + 1 + 594 + + + 5 + 594 + + + 8 + 594 + + + 1 + 595 + + + 5 + 595 + + + 8 + 595 + + + 1 + 596 + + + 5 + 596 + + + 8 + 596 + + + 1 + 597 + + + 8 + 597 + + + 18 + 597 + + + 1 + 598 + + + 8 + 598 + + + 1 + 599 + + + 8 + 599 + + + 1 + 600 + + + 8 + 600 + + + 1 + 601 + + + 8 + 601 + + + 1 + 602 + + + 8 + 602 + + + 1 + 603 + + + 8 + 603 + + + 1 + 604 + + + 8 + 604 + + + 1 + 605 + + + 8 + 605 + + + 1 + 606 + + + 8 + 606 + + + 1 + 607 + + + 8 + 607 + + + 1 + 608 + + + 8 + 608 + + + 1 + 609 + + + 8 + 609 + + + 1 + 610 + + + 8 + 610 + + + 1 + 611 + + + 8 + 611 + + + 1 + 612 + + + 8 + 612 + + + 1 + 613 + + + 8 + 613 + + + 1 + 614 + + + 8 + 614 + + + 1 + 615 + + + 8 + 615 + + + 1 + 616 + + + 8 + 616 + + + 1 + 617 + + + 8 + 617 + + + 1 + 618 + + + 8 + 618 + + + 1 + 619 + + + 8 + 619 + + + 1 + 620 + + + 8 + 620 + + + 1 + 621 + + + 8 + 621 + + + 1 + 622 + + + 8 + 622 + + + 1 + 623 + + + 8 + 623 + + + 1 + 624 + + + 8 + 624 + + + 1 + 625 + + + 8 + 625 + + + 1 + 626 + + + 8 + 626 + + + 1 + 627 + + + 8 + 627 + + + 1 + 628 + + + 8 + 628 + + + 1 + 629 + + + 8 + 629 + + + 1 + 630 + + + 8 + 630 + + + 1 + 631 + + + 8 + 631 + + + 1 + 632 + + + 8 + 632 + + + 1 + 633 + + + 8 + 633 + + + 1 + 634 + + + 8 + 634 + + + 1 + 635 + + + 8 + 635 + + + 1 + 636 + + + 8 + 636 + + + 1 + 637 + + + 8 + 637 + + + 1 + 638 + + + 8 + 638 + + + 1 + 639 + + + 8 + 639 + + + 1 + 640 + + + 8 + 640 + + + 1 + 641 + + + 8 + 641 + + + 1 + 642 + + + 8 + 642 + + + 1 + 643 + + + 8 + 643 + + + 1 + 644 + + + 8 + 644 + + + 1 + 645 + + + 8 + 645 + + + 1 + 646 + + + 8 + 646 + + + 1 + 647 + + + 8 + 647 + + + 1 + 648 + + + 8 + 648 + + + 1 + 649 + + + 8 + 649 + + + 1 + 650 + + + 8 + 650 + + + 1 + 651 + + + 8 + 651 + + + 1 + 652 + + + 8 + 652 + + + 1 + 653 + + + 8 + 653 + + + 1 + 654 + + + 8 + 654 + + + 1 + 655 + + + 8 + 655 + + + 1 + 656 + + + 8 + 656 + + + 1 + 657 + + + 8 + 657 + + + 1 + 658 + + + 8 + 658 + + + 1 + 659 + + + 8 + 659 + + + 1 + 660 + + + 8 + 660 + + + 1 + 661 + + + 8 + 661 + + + 1 + 662 + + + 8 + 662 + + + 1 + 663 + + + 8 + 663 + + + 1 + 664 + + + 8 + 664 + + + 1 + 665 + + + 8 + 665 + + + 1 + 666 + + + 8 + 666 + + + 1 + 667 + + + 8 + 667 + + + 1 + 668 + + + 8 + 668 + + + 1 + 669 + + + 8 + 669 + + + 1 + 670 + + + 8 + 670 + + + 1 + 671 + + + 8 + 671 + + + 1 + 672 + + + 8 + 672 + + + 1 + 673 + + + 8 + 673 + + + 1 + 674 + + + 8 + 674 + + + 1 + 675 + + + 8 + 675 + + + 1 + 676 + + + 8 + 676 + + + 1 + 677 + + + 8 + 677 + + + 1 + 678 + + + 8 + 678 + + + 1 + 679 + + + 8 + 679 + + + 1 + 680 + + + 8 + 680 + + + 1 + 681 + + + 8 + 681 + + + 1 + 682 + + + 8 + 682 + + + 1 + 683 + + + 8 + 683 + + + 1 + 684 + + + 8 + 684 + + + 1 + 685 + + + 8 + 685 + + + 1 + 686 + + + 8 + 686 + + + 1 + 687 + + + 8 + 687 + + + 1 + 688 + + + 8 + 688 + + + 1 + 689 + + + 8 + 689 + + + 1 + 690 + + + 8 + 690 + + + 1 + 691 + + + 8 + 691 + + + 1 + 692 + + + 8 + 692 + + + 1 + 693 + + + 8 + 693 + + + 1 + 694 + + + 8 + 694 + + + 1 + 695 + + + 8 + 695 + + + 1 + 696 + + + 8 + 696 + + + 1 + 697 + + + 8 + 697 + + + 1 + 698 + + + 8 + 698 + + + 1 + 699 + + + 8 + 699 + + + 1 + 700 + + + 8 + 700 + + + 1 + 701 + + + 8 + 701 + + + 1 + 702 + + + 8 + 702 + + + 1 + 703 + + + 8 + 703 + + + 1 + 704 + + + 8 + 704 + + + 1 + 705 + + + 8 + 705 + + + 1 + 706 + + + 8 + 706 + + + 1 + 707 + + + 8 + 707 + + + 1 + 708 + + + 8 + 708 + + + 1 + 709 + + + 8 + 709 + + + 1 + 710 + + + 8 + 710 + + + 1 + 711 + + + 8 + 711 + + + 1 + 712 + + + 8 + 712 + + + 1 + 713 + + + 8 + 713 + + + 1 + 714 + + + 8 + 714 + + + 1 + 715 + + + 8 + 715 + + + 1 + 716 + + + 8 + 716 + + + 1 + 717 + + + 8 + 717 + + + 1 + 718 + + + 8 + 718 + + + 1 + 719 + + + 8 + 719 + + + 1 + 720 + + + 8 + 720 + + + 1 + 721 + + + 8 + 721 + + + 1 + 722 + + + 8 + 722 + + + 1 + 723 + + + 8 + 723 + + + 1 + 724 + + + 8 + 724 + + + 1 + 725 + + + 8 + 725 + + + 1 + 726 + + + 8 + 726 + + + 1 + 727 + + + 8 + 727 + + + 1 + 728 + + + 8 + 728 + + + 1 + 729 + + + 8 + 729 + + + 1 + 730 + + + 8 + 730 + + + 11 + 730 + + + 1 + 731 + + + 8 + 731 + + + 1 + 732 + + + 8 + 732 + + + 1 + 733 + + + 8 + 733 + + + 1 + 734 + + + 8 + 734 + + + 1 + 735 + + + 8 + 735 + + + 1 + 736 + + + 8 + 736 + + + 1 + 737 + + + 8 + 737 + + + 1 + 738 + + + 8 + 738 + + + 11 + 738 + + + 1 + 739 + + + 8 + 739 + + + 1 + 740 + + + 8 + 740 + + + 1 + 741 + + + 8 + 741 + + + 1 + 742 + + + 8 + 742 + + + 1 + 743 + + + 8 + 743 + + + 1 + 744 + + + 8 + 744 + + + 1 + 745 + + + 8 + 745 + + + 1 + 746 + + + 8 + 746 + + + 1 + 747 + + + 8 + 747 + + + 1 + 748 + + + 8 + 748 + + + 1 + 749 + + + 8 + 749 + + + 1 + 750 + + + 8 + 750 + + + 1 + 751 + + + 8 + 751 + + + 1 + 752 + + + 8 + 752 + + + 1 + 753 + + + 8 + 753 + + + 1 + 754 + + + 8 + 754 + + + 1 + 755 + + + 8 + 755 + + + 1 + 756 + + + 8 + 756 + + + 1 + 757 + + + 8 + 757 + + + 1 + 758 + + + 8 + 758 + + + 1 + 759 + + + 8 + 759 + + + 1 + 760 + + + 8 + 760 + + + 1 + 761 + + + 8 + 761 + + + 1 + 762 + + + 8 + 762 + + + 1 + 763 + + + 8 + 763 + + + 1 + 764 + + + 8 + 764 + + + 1 + 765 + + + 8 + 765 + + + 1 + 766 + + + 8 + 766 + + + 1 + 767 + + + 8 + 767 + + + 1 + 768 + + + 5 + 768 + + + 8 + 768 + + + 1 + 769 + + + 5 + 769 + + + 8 + 769 + + + 1 + 770 + + + 5 + 770 + + + 8 + 770 + + + 1 + 771 + + + 5 + 771 + + + 8 + 771 + + + 1 + 772 + + + 5 + 772 + + + 8 + 772 + + + 1 + 773 + + + 5 + 773 + + + 8 + 773 + + + 1 + 774 + + + 5 + 774 + + + 8 + 774 + + + 1 + 775 + + + 5 + 775 + + + 8 + 775 + + + 1 + 776 + + + 5 + 776 + + + 8 + 776 + + + 1 + 777 + + + 5 + 777 + + + 8 + 777 + + + 1 + 778 + + + 5 + 778 + + + 8 + 778 + + + 1 + 779 + + + 8 + 779 + + + 1 + 780 + + + 8 + 780 + + + 1 + 781 + + + 8 + 781 + + + 1 + 782 + + + 8 + 782 + + + 1 + 783 + + + 8 + 783 + + + 1 + 784 + + + 8 + 784 + + + 1 + 785 + + + 8 + 785 + + + 1 + 786 + + + 5 + 786 + + + 8 + 786 + + + 1 + 787 + + + 5 + 787 + + + 8 + 787 + + + 1 + 788 + + + 5 + 788 + + + 8 + 788 + + + 1 + 789 + + + 5 + 789 + + + 8 + 789 + + + 1 + 790 + + + 5 + 790 + + + 8 + 790 + + + 1 + 791 + + + 5 + 791 + + + 8 + 791 + + + 1 + 792 + + + 5 + 792 + + + 8 + 792 + + + 1 + 793 + + + 5 + 793 + + + 8 + 793 + + + 1 + 794 + + + 5 + 794 + + + 8 + 794 + + + 1 + 795 + + + 5 + 795 + + + 8 + 795 + + + 1 + 796 + + + 5 + 796 + + + 8 + 796 + + + 1 + 797 + + + 5 + 797 + + + 8 + 797 + + + 1 + 798 + + + 5 + 798 + + + 8 + 798 + + + 1 + 799 + + + 5 + 799 + + + 8 + 799 + + + 1 + 800 + + + 5 + 800 + + + 8 + 800 + + + 1 + 801 + + + 5 + 801 + + + 8 + 801 + + + 1 + 802 + + + 5 + 802 + + + 8 + 802 + + + 1 + 803 + + + 5 + 803 + + + 8 + 803 + + + 1 + 804 + + + 5 + 804 + + + 8 + 804 + + + 1 + 805 + + + 5 + 805 + + + 8 + 805 + + + 1 + 806 + + + 5 + 806 + + + 8 + 806 + + + 1 + 807 + + + 8 + 807 + + + 1 + 808 + + + 8 + 808 + + + 1 + 809 + + + 8 + 809 + + + 1 + 810 + + + 8 + 810 + + + 1 + 811 + + + 8 + 811 + + + 1 + 812 + + + 8 + 812 + + + 1 + 813 + + + 8 + 813 + + + 1 + 814 + + + 8 + 814 + + + 1 + 815 + + + 8 + 815 + + + 1 + 816 + + + 5 + 816 + + + 8 + 816 + + + 1 + 817 + + + 5 + 817 + + + 8 + 817 + + + 1 + 818 + + + 5 + 818 + + + 8 + 818 + + + 1 + 819 + + + 5 + 819 + + + 8 + 819 + + + 1 + 820 + + + 5 + 820 + + + 8 + 820 + + + 1 + 821 + + + 5 + 821 + + + 8 + 821 + + + 1 + 822 + + + 5 + 822 + + + 8 + 822 + + + 1 + 823 + + + 5 + 823 + + + 8 + 823 + + + 1 + 824 + + + 5 + 824 + + + 8 + 824 + + + 1 + 825 + + + 5 + 825 + + + 8 + 825 + + + 1 + 826 + + + 5 + 826 + + + 8 + 826 + + + 1 + 827 + + + 5 + 827 + + + 8 + 827 + + + 1 + 828 + + + 5 + 828 + + + 8 + 828 + + + 1 + 829 + + + 5 + 829 + + + 8 + 829 + + + 1 + 830 + + + 5 + 830 + + + 8 + 830 + + + 1 + 831 + + + 5 + 831 + + + 8 + 831 + + + 1 + 832 + + + 5 + 832 + + + 8 + 832 + + + 1 + 833 + + + 5 + 833 + + + 8 + 833 + + + 1 + 834 + + + 5 + 834 + + + 8 + 834 + + + 1 + 835 + + + 5 + 835 + + + 8 + 835 + + + 1 + 836 + + + 5 + 836 + + + 8 + 836 + + + 1 + 837 + + + 5 + 837 + + + 8 + 837 + + + 1 + 838 + + + 5 + 838 + + + 8 + 838 + + + 1 + 839 + + + 5 + 839 + + + 8 + 839 + + + 1 + 840 + + + 5 + 840 + + + 8 + 840 + + + 1 + 841 + + + 5 + 841 + + + 8 + 841 + + + 1 + 842 + + + 8 + 842 + + + 1 + 843 + + + 8 + 843 + + + 1 + 844 + + + 8 + 844 + + + 1 + 845 + + + 8 + 845 + + + 1 + 846 + + + 8 + 846 + + + 1 + 847 + + + 8 + 847 + + + 1 + 848 + + + 8 + 848 + + + 1 + 849 + + + 8 + 849 + + + 1 + 850 + + + 8 + 850 + + + 1 + 851 + + + 5 + 851 + + + 8 + 851 + + + 1 + 852 + + + 5 + 852 + + + 8 + 852 + + + 11 + 852 + + + 1 + 853 + + + 5 + 853 + + + 8 + 853 + + + 1 + 854 + + + 5 + 854 + + + 8 + 854 + + + 1 + 855 + + + 5 + 855 + + + 8 + 855 + + + 1 + 856 + + + 5 + 856 + + + 8 + 856 + + + 1 + 857 + + + 5 + 857 + + + 8 + 857 + + + 1 + 858 + + + 5 + 858 + + + 8 + 858 + + + 11 + 858 + + + 1 + 859 + + + 5 + 859 + + + 8 + 859 + + + 1 + 860 + + + 5 + 860 + + + 8 + 860 + + + 1 + 861 + + + 5 + 861 + + + 8 + 861 + + + 1 + 862 + + + 5 + 862 + + + 8 + 862 + + + 1 + 863 + + + 5 + 863 + + + 8 + 863 + + + 1 + 864 + + + 5 + 864 + + + 8 + 864 + + + 11 + 864 + + + 1 + 865 + + + 5 + 865 + + + 8 + 865 + + + 1 + 866 + + + 5 + 866 + + + 8 + 866 + + + 1 + 867 + + + 5 + 867 + + + 8 + 867 + + + 11 + 867 + + + 1 + 868 + + + 5 + 868 + + + 8 + 868 + + + 1 + 869 + + + 5 + 869 + + + 8 + 869 + + + 1 + 870 + + + 5 + 870 + + + 8 + 870 + + + 1 + 871 + + + 5 + 871 + + + 8 + 871 + + + 1 + 872 + + + 5 + 872 + + + 8 + 872 + + + 1 + 873 + + + 5 + 873 + + + 8 + 873 + + + 1 + 874 + + + 5 + 874 + + + 8 + 874 + + + 11 + 874 + + + 1 + 875 + + + 5 + 875 + + + 8 + 875 + + + 1 + 876 + + + 5 + 876 + + + 8 + 876 + + + 1 + 877 + + + 8 + 877 + + + 11 + 877 + + + 1 + 878 + + + 8 + 878 + + + 1 + 879 + + + 8 + 879 + + + 1 + 880 + + + 8 + 880 + + + 1 + 881 + + + 8 + 881 + + + 1 + 882 + + + 8 + 882 + + + 1 + 883 + + + 8 + 883 + + + 1 + 884 + + + 8 + 884 + + + 1 + 885 + + + 8 + 885 + + + 11 + 885 + + + 1 + 886 + + + 8 + 886 + + + 1 + 887 + + + 8 + 887 + + + 1 + 888 + + + 8 + 888 + + + 11 + 888 + + + 1 + 889 + + + 8 + 889 + + + 1 + 890 + + + 8 + 890 + + + 1 + 891 + + + 5 + 891 + + + 8 + 891 + + + 1 + 892 + + + 5 + 892 + + + 8 + 892 + + + 1 + 893 + + + 5 + 893 + + + 8 + 893 + + + 1 + 894 + + + 5 + 894 + + + 8 + 894 + + + 1 + 895 + + + 5 + 895 + + + 8 + 895 + + + 1 + 896 + + + 5 + 896 + + + 8 + 896 + + + 1 + 897 + + + 5 + 897 + + + 8 + 897 + + + 1 + 898 + + + 5 + 898 + + + 8 + 898 + + + 1 + 899 + + + 5 + 899 + + + 8 + 899 + + + 1 + 900 + + + 5 + 900 + + + 8 + 900 + + + 1 + 901 + + + 5 + 901 + + + 8 + 901 + + + 1 + 902 + + + 5 + 902 + + + 8 + 902 + + + 1 + 903 + + + 5 + 903 + + + 8 + 903 + + + 1 + 904 + + + 5 + 904 + + + 8 + 904 + + + 1 + 905 + + + 5 + 905 + + + 8 + 905 + + + 1 + 906 + + + 5 + 906 + + + 8 + 906 + + + 1 + 907 + + + 5 + 907 + + + 8 + 907 + + + 1 + 908 + + + 5 + 908 + + + 8 + 908 + + + 1 + 909 + + + 5 + 909 + + + 8 + 909 + + + 1 + 910 + + + 5 + 910 + + + 8 + 910 + + + 1 + 911 + + + 5 + 911 + + + 8 + 911 + + + 1 + 912 + + + 5 + 912 + + + 8 + 912 + + + 1 + 913 + + + 5 + 913 + + + 8 + 913 + + + 1 + 914 + + + 5 + 914 + + + 8 + 914 + + + 1 + 915 + + + 5 + 915 + + + 8 + 915 + + + 1 + 916 + + + 5 + 916 + + + 8 + 916 + + + 1 + 917 + + + 5 + 917 + + + 8 + 917 + + + 1 + 918 + + + 5 + 918 + + + 8 + 918 + + + 1 + 919 + + + 5 + 919 + + + 8 + 919 + + + 1 + 920 + + + 5 + 920 + + + 8 + 920 + + + 1 + 921 + + + 5 + 921 + + + 8 + 921 + + + 1 + 922 + + + 5 + 922 + + + 8 + 922 + + + 1 + 923 + + + 5 + 923 + + + 8 + 923 + + + 1 + 924 + + + 5 + 924 + + + 8 + 924 + + + 1 + 925 + + + 5 + 925 + + + 8 + 925 + + + 1 + 926 + + + 5 + 926 + + + 8 + 926 + + + 1 + 927 + + + 5 + 927 + + + 8 + 927 + + + 1 + 928 + + + 5 + 928 + + + 8 + 928 + + + 1 + 929 + + + 5 + 929 + + + 8 + 929 + + + 1 + 930 + + + 5 + 930 + + + 8 + 930 + + + 1 + 931 + + + 5 + 931 + + + 8 + 931 + + + 1 + 932 + + + 5 + 932 + + + 8 + 932 + + + 1 + 933 + + + 5 + 933 + + + 8 + 933 + + + 1 + 934 + + + 5 + 934 + + + 8 + 934 + + + 1 + 935 + + + 5 + 935 + + + 8 + 935 + + + 1 + 936 + + + 5 + 936 + + + 8 + 936 + + + 1 + 937 + + + 5 + 937 + + + 8 + 937 + + + 1 + 938 + + + 5 + 938 + + + 8 + 938 + + + 1 + 939 + + + 5 + 939 + + + 8 + 939 + + + 1 + 940 + + + 5 + 940 + + + 8 + 940 + + + 1 + 941 + + + 5 + 941 + + + 8 + 941 + + + 1 + 942 + + + 5 + 942 + + + 8 + 942 + + + 1 + 943 + + + 5 + 943 + + + 8 + 943 + + + 1 + 944 + + + 5 + 944 + + + 8 + 944 + + + 1 + 945 + + + 5 + 945 + + + 8 + 945 + + + 1 + 946 + + + 5 + 946 + + + 8 + 946 + + + 1 + 947 + + + 5 + 947 + + + 8 + 947 + + + 1 + 948 + + + 5 + 948 + + + 8 + 948 + + + 1 + 949 + + + 5 + 949 + + + 8 + 949 + + + 1 + 950 + + + 5 + 950 + + + 8 + 950 + + + 1 + 951 + + + 5 + 951 + + + 8 + 951 + + + 1 + 952 + + + 5 + 952 + + + 8 + 952 + + + 1 + 953 + + + 5 + 953 + + + 8 + 953 + + + 1 + 954 + + + 5 + 954 + + + 8 + 954 + + + 1 + 955 + + + 5 + 955 + + + 8 + 955 + + + 1 + 956 + + + 5 + 956 + + + 8 + 956 + + + 1 + 957 + + + 5 + 957 + + + 8 + 957 + + + 1 + 958 + + + 5 + 958 + + + 8 + 958 + + + 1 + 959 + + + 5 + 959 + + + 8 + 959 + + + 1 + 960 + + + 5 + 960 + + + 8 + 960 + + + 1 + 961 + + + 5 + 961 + + + 8 + 961 + + + 1 + 962 + + + 5 + 962 + + + 8 + 962 + + + 1 + 963 + + + 5 + 963 + + + 8 + 963 + + + 1 + 964 + + + 8 + 964 + + + 1 + 965 + + + 8 + 965 + + + 1 + 966 + + + 8 + 966 + + + 1 + 967 + + + 8 + 967 + + + 1 + 968 + + + 8 + 968 + + + 1 + 969 + + + 8 + 969 + + + 1 + 970 + + + 8 + 970 + + + 1 + 971 + + + 8 + 971 + + + 1 + 972 + + + 8 + 972 + + + 1 + 973 + + + 8 + 973 + + + 1 + 974 + + + 8 + 974 + + + 1 + 975 + + + 8 + 975 + + + 1 + 976 + + + 5 + 976 + + + 8 + 976 + + + 1 + 977 + + + 5 + 977 + + + 8 + 977 + + + 1 + 978 + + + 5 + 978 + + + 8 + 978 + + + 1 + 979 + + + 5 + 979 + + + 8 + 979 + + + 1 + 980 + + + 8 + 980 + + + 1 + 981 + + + 8 + 981 + + + 1 + 982 + + + 8 + 982 + + + 1 + 983 + + + 8 + 983 + + + 1 + 984 + + + 5 + 984 + + + 8 + 984 + + + 1 + 985 + + + 8 + 985 + + + 1 + 986 + + + 8 + 986 + + + 1 + 987 + + + 8 + 987 + + + 1 + 988 + + + 8 + 988 + + + 1 + 989 + + + 8 + 989 + + + 1 + 990 + + + 8 + 990 + + + 1 + 991 + + + 8 + 991 + + + 1 + 992 + + + 8 + 992 + + + 1 + 993 + + + 8 + 993 + + + 1 + 994 + + + 8 + 994 + + + 1 + 995 + + + 8 + 995 + + + 1 + 996 + + + 8 + 996 + + + 1 + 997 + + + 8 + 997 + + + 1 + 998 + + + 8 + 998 + + + 1 + 999 + + + 8 + 999 + + + 1 + 1000 + + + 8 + 1000 + + + 1 + 1001 + + + 8 + 1001 + + + 1 + 1002 + + + 8 + 1002 + + + 1 + 1003 + + + 8 + 1003 + + + 1 + 1004 + + + 8 + 1004 + + + 1 + 1005 + + + 8 + 1005 + + + 1 + 1006 + + + 8 + 1006 + + + 1 + 1007 + + + 8 + 1007 + + + 1 + 1008 + + + 8 + 1008 + + + 1 + 1009 + + + 8 + 1009 + + + 1 + 1010 + + + 8 + 1010 + + + 1 + 1011 + + + 8 + 1011 + + + 1 + 1012 + + + 8 + 1012 + + + 1 + 1013 + + + 8 + 1013 + + + 1 + 1014 + + + 8 + 1014 + + + 1 + 1015 + + + 8 + 1015 + + + 1 + 1016 + + + 8 + 1016 + + + 1 + 1017 + + + 8 + 1017 + + + 1 + 1018 + + + 8 + 1018 + + + 1 + 1019 + + + 8 + 1019 + + + 1 + 1020 + + + 5 + 1020 + + + 8 + 1020 + + + 1 + 1021 + + + 5 + 1021 + + + 8 + 1021 + + + 1 + 1022 + + + 5 + 1022 + + + 8 + 1022 + + + 1 + 1023 + + + 5 + 1023 + + + 8 + 1023 + + + 1 + 1024 + + + 5 + 1024 + + + 8 + 1024 + + + 1 + 1025 + + + 5 + 1025 + + + 8 + 1025 + + + 1 + 1026 + + + 5 + 1026 + + + 8 + 1026 + + + 1 + 1027 + + + 5 + 1027 + + + 8 + 1027 + + + 1 + 1028 + + + 5 + 1028 + + + 8 + 1028 + + + 1 + 1029 + + + 5 + 1029 + + + 8 + 1029 + + + 1 + 1030 + + + 5 + 1030 + + + 8 + 1030 + + + 1 + 1031 + + + 5 + 1031 + + + 8 + 1031 + + + 1 + 1032 + + + 5 + 1032 + + + 8 + 1032 + + + 1 + 1033 + + + 8 + 1033 + + + 1 + 1034 + + + 8 + 1034 + + + 1 + 1035 + + + 8 + 1035 + + + 1 + 1036 + + + 8 + 1036 + + + 1 + 1037 + + + 8 + 1037 + + + 1 + 1038 + + + 8 + 1038 + + + 1 + 1039 + + + 8 + 1039 + + + 1 + 1040 + + + 8 + 1040 + + + 1 + 1041 + + + 8 + 1041 + + + 1 + 1042 + + + 8 + 1042 + + + 1 + 1043 + + + 8 + 1043 + + + 1 + 1044 + + + 8 + 1044 + + + 1 + 1045 + + + 8 + 1045 + + + 1 + 1046 + + + 8 + 1046 + + + 1 + 1047 + + + 8 + 1047 + + + 1 + 1048 + + + 8 + 1048 + + + 1 + 1049 + + + 8 + 1049 + + + 1 + 1050 + + + 8 + 1050 + + + 1 + 1051 + + + 8 + 1051 + + + 1 + 1052 + + + 8 + 1052 + + + 1 + 1053 + + + 8 + 1053 + + + 1 + 1054 + + + 8 + 1054 + + + 1 + 1055 + + + 8 + 1055 + + + 1 + 1056 + + + 8 + 1056 + + + 1 + 1057 + + + 5 + 1057 + + + 8 + 1057 + + + 1 + 1058 + + + 5 + 1058 + + + 8 + 1058 + + + 1 + 1059 + + + 5 + 1059 + + + 8 + 1059 + + + 1 + 1060 + + + 5 + 1060 + + + 8 + 1060 + + + 1 + 1061 + + + 5 + 1061 + + + 8 + 1061 + + + 1 + 1062 + + + 5 + 1062 + + + 8 + 1062 + + + 1 + 1063 + + + 5 + 1063 + + + 8 + 1063 + + + 1 + 1064 + + + 5 + 1064 + + + 8 + 1064 + + + 1 + 1065 + + + 5 + 1065 + + + 8 + 1065 + + + 1 + 1066 + + + 5 + 1066 + + + 8 + 1066 + + + 1 + 1067 + + + 5 + 1067 + + + 8 + 1067 + + + 1 + 1068 + + + 5 + 1068 + + + 8 + 1068 + + + 1 + 1069 + + + 5 + 1069 + + + 8 + 1069 + + + 1 + 1070 + + + 5 + 1070 + + + 8 + 1070 + + + 1 + 1071 + + + 5 + 1071 + + + 8 + 1071 + + + 1 + 1072 + + + 5 + 1072 + + + 8 + 1072 + + + 1 + 1073 + + + 8 + 1073 + + + 1 + 1074 + + + 8 + 1074 + + + 1 + 1075 + + + 8 + 1075 + + + 1 + 1076 + + + 8 + 1076 + + + 1 + 1077 + + + 8 + 1077 + + + 1 + 1078 + + + 8 + 1078 + + + 1 + 1079 + + + 8 + 1079 + + + 1 + 1080 + + + 8 + 1080 + + + 1 + 1081 + + + 8 + 1081 + + + 1 + 1082 + + + 8 + 1082 + + + 1 + 1083 + + + 8 + 1083 + + + 1 + 1084 + + + 8 + 1084 + + + 1 + 1085 + + + 8 + 1085 + + + 1 + 1086 + + + 8 + 1086 + + + 1 + 1087 + + + 5 + 1087 + + + 8 + 1087 + + + 1 + 1088 + + + 5 + 1088 + + + 8 + 1088 + + + 11 + 1088 + + + 1 + 1089 + + + 5 + 1089 + + + 8 + 1089 + + + 1 + 1090 + + + 5 + 1090 + + + 8 + 1090 + + + 1 + 1091 + + + 5 + 1091 + + + 8 + 1091 + + + 1 + 1092 + + + 5 + 1092 + + + 8 + 1092 + + + 1 + 1093 + + + 5 + 1093 + + + 8 + 1093 + + + 11 + 1093 + + + 1 + 1094 + + + 5 + 1094 + + + 8 + 1094 + + + 1 + 1095 + + + 5 + 1095 + + + 8 + 1095 + + + 1 + 1096 + + + 5 + 1096 + + + 8 + 1096 + + + 1 + 1097 + + + 5 + 1097 + + + 8 + 1097 + + + 1 + 1098 + + + 5 + 1098 + + + 8 + 1098 + + + 1 + 1099 + + + 5 + 1099 + + + 8 + 1099 + + + 11 + 1099 + + + 1 + 1100 + + + 5 + 1100 + + + 8 + 1100 + + + 1 + 1101 + + + 5 + 1101 + + + 8 + 1101 + + + 1 + 1102 + + + 8 + 1102 + + + 1 + 1103 + + + 8 + 1103 + + + 1 + 1104 + + + 8 + 1104 + + + 1 + 1105 + + + 5 + 1105 + + + 8 + 1105 + + + 11 + 1105 + + + 1 + 1106 + + + 5 + 1106 + + + 8 + 1106 + + + 1 + 1107 + + + 5 + 1107 + + + 8 + 1107 + + + 1 + 1108 + + + 5 + 1108 + + + 8 + 1108 + + + 1 + 1109 + + + 5 + 1109 + + + 8 + 1109 + + + 1 + 1110 + + + 5 + 1110 + + + 8 + 1110 + + + 1 + 1111 + + + 5 + 1111 + + + 8 + 1111 + + + 1 + 1112 + + + 5 + 1112 + + + 8 + 1112 + + + 1 + 1113 + + + 5 + 1113 + + + 8 + 1113 + + + 1 + 1114 + + + 5 + 1114 + + + 8 + 1114 + + + 1 + 1115 + + + 5 + 1115 + + + 8 + 1115 + + + 1 + 1116 + + + 5 + 1116 + + + 8 + 1116 + + + 1 + 1117 + + + 5 + 1117 + + + 8 + 1117 + + + 1 + 1118 + + + 5 + 1118 + + + 8 + 1118 + + + 1 + 1119 + + + 5 + 1119 + + + 8 + 1119 + + + 1 + 1120 + + + 5 + 1120 + + + 8 + 1120 + + + 1 + 1121 + + + 8 + 1121 + + + 1 + 1122 + + + 8 + 1122 + + + 1 + 1123 + + + 8 + 1123 + + + 1 + 1124 + + + 8 + 1124 + + + 1 + 1125 + + + 8 + 1125 + + + 1 + 1126 + + + 8 + 1126 + + + 1 + 1127 + + + 8 + 1127 + + + 1 + 1128 + + + 8 + 1128 + + + 1 + 1129 + + + 8 + 1129 + + + 1 + 1130 + + + 8 + 1130 + + + 1 + 1131 + + + 8 + 1131 + + + 1 + 1132 + + + 8 + 1132 + + + 1 + 1133 + + + 8 + 1133 + + + 1 + 1134 + + + 8 + 1134 + + + 1 + 1135 + + + 8 + 1135 + + + 1 + 1136 + + + 8 + 1136 + + + 1 + 1137 + + + 8 + 1137 + + + 1 + 1138 + + + 8 + 1138 + + + 1 + 1139 + + + 8 + 1139 + + + 1 + 1140 + + + 8 + 1140 + + + 1 + 1141 + + + 8 + 1141 + + + 1 + 1142 + + + 8 + 1142 + + + 1 + 1143 + + + 8 + 1143 + + + 1 + 1144 + + + 8 + 1144 + + + 1 + 1145 + + + 8 + 1145 + + + 1 + 1146 + + + 8 + 1146 + + + 1 + 1147 + + + 8 + 1147 + + + 1 + 1148 + + + 8 + 1148 + + + 1 + 1149 + + + 8 + 1149 + + + 1 + 1150 + + + 8 + 1150 + + + 1 + 1151 + + + 8 + 1151 + + + 1 + 1152 + + + 8 + 1152 + + + 1 + 1153 + + + 8 + 1153 + + + 1 + 1154 + + + 8 + 1154 + + + 1 + 1155 + + + 8 + 1155 + + + 1 + 1156 + + + 8 + 1156 + + + 1 + 1157 + + + 8 + 1157 + + + 1 + 1158 + + + 5 + 1158 + + + 8 + 1158 + + + 1 + 1159 + + + 5 + 1159 + + + 8 + 1159 + + + 1 + 1160 + + + 5 + 1160 + + + 8 + 1160 + + + 1 + 1161 + + + 5 + 1161 + + + 8 + 1161 + + + 1 + 1162 + + + 5 + 1162 + + + 8 + 1162 + + + 1 + 1163 + + + 5 + 1163 + + + 8 + 1163 + + + 1 + 1164 + + + 5 + 1164 + + + 8 + 1164 + + + 1 + 1165 + + + 5 + 1165 + + + 8 + 1165 + + + 1 + 1166 + + + 5 + 1166 + + + 8 + 1166 + + + 1 + 1167 + + + 5 + 1167 + + + 8 + 1167 + + + 1 + 1168 + + + 5 + 1168 + + + 8 + 1168 + + + 1 + 1169 + + + 5 + 1169 + + + 8 + 1169 + + + 1 + 1170 + + + 5 + 1170 + + + 8 + 1170 + + + 1 + 1171 + + + 5 + 1171 + + + 8 + 1171 + + + 1 + 1172 + + + 5 + 1172 + + + 8 + 1172 + + + 1 + 1173 + + + 5 + 1173 + + + 8 + 1173 + + + 1 + 1174 + + + 5 + 1174 + + + 8 + 1174 + + + 1 + 1175 + + + 5 + 1175 + + + 8 + 1175 + + + 1 + 1176 + + + 5 + 1176 + + + 8 + 1176 + + + 1 + 1177 + + + 5 + 1177 + + + 8 + 1177 + + + 1 + 1178 + + + 5 + 1178 + + + 8 + 1178 + + + 1 + 1179 + + + 5 + 1179 + + + 8 + 1179 + + + 1 + 1180 + + + 5 + 1180 + + + 8 + 1180 + + + 1 + 1181 + + + 5 + 1181 + + + 8 + 1181 + + + 1 + 1182 + + + 5 + 1182 + + + 8 + 1182 + + + 1 + 1183 + + + 5 + 1183 + + + 8 + 1183 + + + 1 + 1184 + + + 5 + 1184 + + + 8 + 1184 + + + 1 + 1185 + + + 5 + 1185 + + + 8 + 1185 + + + 1 + 1186 + + + 5 + 1186 + + + 8 + 1186 + + + 1 + 1187 + + + 5 + 1187 + + + 8 + 1187 + + + 1 + 1188 + + + 5 + 1188 + + + 8 + 1188 + + + 1 + 1189 + + + 5 + 1189 + + + 8 + 1189 + + + 1 + 1190 + + + 5 + 1190 + + + 8 + 1190 + + + 1 + 1191 + + + 5 + 1191 + + + 8 + 1191 + + + 1 + 1192 + + + 5 + 1192 + + + 8 + 1192 + + + 1 + 1193 + + + 5 + 1193 + + + 8 + 1193 + + + 1 + 1194 + + + 5 + 1194 + + + 8 + 1194 + + + 1 + 1195 + + + 5 + 1195 + + + 8 + 1195 + + + 1 + 1196 + + + 5 + 1196 + + + 8 + 1196 + + + 1 + 1197 + + + 5 + 1197 + + + 8 + 1197 + + + 1 + 1198 + + + 5 + 1198 + + + 8 + 1198 + + + 1 + 1199 + + + 5 + 1199 + + + 8 + 1199 + + + 1 + 1200 + + + 5 + 1200 + + + 8 + 1200 + + + 1 + 1201 + + + 8 + 1201 + + + 1 + 1202 + + + 8 + 1202 + + + 1 + 1203 + + + 8 + 1203 + + + 1 + 1204 + + + 8 + 1204 + + + 1 + 1205 + + + 8 + 1205 + + + 1 + 1206 + + + 8 + 1206 + + + 1 + 1207 + + + 8 + 1207 + + + 1 + 1208 + + + 8 + 1208 + + + 1 + 1209 + + + 8 + 1209 + + + 1 + 1210 + + + 8 + 1210 + + + 1 + 1211 + + + 8 + 1211 + + + 1 + 1212 + + + 5 + 1212 + + + 8 + 1212 + + + 1 + 1213 + + + 5 + 1213 + + + 8 + 1213 + + + 1 + 1214 + + + 5 + 1214 + + + 8 + 1214 + + + 1 + 1215 + + + 5 + 1215 + + + 8 + 1215 + + + 1 + 1216 + + + 5 + 1216 + + + 8 + 1216 + + + 1 + 1217 + + + 5 + 1217 + + + 8 + 1217 + + + 1 + 1218 + + + 5 + 1218 + + + 8 + 1218 + + + 1 + 1219 + + + 5 + 1219 + + + 8 + 1219 + + + 1 + 1220 + + + 5 + 1220 + + + 8 + 1220 + + + 1 + 1221 + + + 5 + 1221 + + + 8 + 1221 + + + 1 + 1222 + + + 5 + 1222 + + + 8 + 1222 + + + 1 + 1223 + + + 5 + 1223 + + + 8 + 1223 + + + 1 + 1224 + + + 5 + 1224 + + + 8 + 1224 + + + 1 + 1225 + + + 5 + 1225 + + + 8 + 1225 + + + 1 + 1226 + + + 5 + 1226 + + + 8 + 1226 + + + 1 + 1227 + + + 5 + 1227 + + + 8 + 1227 + + + 1 + 1228 + + + 5 + 1228 + + + 8 + 1228 + + + 1 + 1229 + + + 5 + 1229 + + + 8 + 1229 + + + 1 + 1230 + + + 5 + 1230 + + + 8 + 1230 + + + 1 + 1231 + + + 5 + 1231 + + + 8 + 1231 + + + 1 + 1232 + + + 5 + 1232 + + + 8 + 1232 + + + 1 + 1233 + + + 5 + 1233 + + + 8 + 1233 + + + 1 + 1234 + + + 5 + 1234 + + + 8 + 1234 + + + 1 + 1235 + + + 8 + 1235 + + + 1 + 1236 + + + 8 + 1236 + + + 1 + 1237 + + + 8 + 1237 + + + 1 + 1238 + + + 8 + 1238 + + + 1 + 1239 + + + 8 + 1239 + + + 1 + 1240 + + + 8 + 1240 + + + 1 + 1241 + + + 8 + 1241 + + + 1 + 1242 + + + 8 + 1242 + + + 1 + 1243 + + + 8 + 1243 + + + 1 + 1244 + + + 8 + 1244 + + + 1 + 1245 + + + 8 + 1245 + + + 1 + 1246 + + + 8 + 1246 + + + 1 + 1247 + + + 8 + 1247 + + + 1 + 1248 + + + 8 + 1248 + + + 1 + 1249 + + + 8 + 1249 + + + 1 + 1250 + + + 8 + 1250 + + + 1 + 1251 + + + 8 + 1251 + + + 1 + 1252 + + + 8 + 1252 + + + 1 + 1253 + + + 8 + 1253 + + + 1 + 1254 + + + 8 + 1254 + + + 1 + 1255 + + + 8 + 1255 + + + 1 + 1256 + + + 5 + 1256 + + + 8 + 1256 + + + 1 + 1257 + + + 5 + 1257 + + + 8 + 1257 + + + 1 + 1258 + + + 5 + 1258 + + + 8 + 1258 + + + 1 + 1259 + + + 5 + 1259 + + + 8 + 1259 + + + 1 + 1260 + + + 5 + 1260 + + + 8 + 1260 + + + 1 + 1261 + + + 5 + 1261 + + + 8 + 1261 + + + 1 + 1262 + + + 5 + 1262 + + + 8 + 1262 + + + 1 + 1263 + + + 5 + 1263 + + + 8 + 1263 + + + 1 + 1264 + + + 5 + 1264 + + + 8 + 1264 + + + 1 + 1265 + + + 5 + 1265 + + + 8 + 1265 + + + 1 + 1266 + + + 5 + 1266 + + + 8 + 1266 + + + 1 + 1267 + + + 5 + 1267 + + + 8 + 1267 + + + 1 + 1268 + + + 8 + 1268 + + + 1 + 1269 + + + 8 + 1269 + + + 1 + 1270 + + + 8 + 1270 + + + 1 + 1271 + + + 8 + 1271 + + + 1 + 1272 + + + 8 + 1272 + + + 1 + 1273 + + + 8 + 1273 + + + 1 + 1274 + + + 8 + 1274 + + + 1 + 1275 + + + 8 + 1275 + + + 1 + 1276 + + + 8 + 1276 + + + 1 + 1277 + + + 8 + 1277 + + + 1 + 1278 + + + 8 + 1278 + + + 17 + 1278 + + + 1 + 1279 + + + 8 + 1279 + + + 1 + 1280 + + + 8 + 1280 + + + 1 + 1281 + + + 8 + 1281 + + + 1 + 1282 + + + 8 + 1282 + + + 1 + 1283 + + + 8 + 1283 + + + 17 + 1283 + + + 1 + 1284 + + + 8 + 1284 + + + 1 + 1285 + + + 8 + 1285 + + + 1 + 1286 + + + 8 + 1286 + + + 1 + 1287 + + + 8 + 1287 + + + 1 + 1288 + + + 8 + 1288 + + + 1 + 1289 + + + 8 + 1289 + + + 1 + 1290 + + + 8 + 1290 + + + 1 + 1291 + + + 8 + 1291 + + + 1 + 1292 + + + 8 + 1292 + + + 1 + 1293 + + + 8 + 1293 + + + 1 + 1294 + + + 8 + 1294 + + + 1 + 1295 + + + 8 + 1295 + + + 1 + 1296 + + + 8 + 1296 + + + 1 + 1297 + + + 8 + 1297 + + + 1 + 1298 + + + 8 + 1298 + + + 1 + 1299 + + + 8 + 1299 + + + 1 + 1300 + + + 8 + 1300 + + + 1 + 1301 + + + 8 + 1301 + + + 1 + 1302 + + + 8 + 1302 + + + 1 + 1303 + + + 8 + 1303 + + + 1 + 1304 + + + 8 + 1304 + + + 1 + 1305 + + + 5 + 1305 + + + 8 + 1305 + + + 1 + 1306 + + + 5 + 1306 + + + 8 + 1306 + + + 1 + 1307 + + + 5 + 1307 + + + 8 + 1307 + + + 1 + 1308 + + + 5 + 1308 + + + 8 + 1308 + + + 1 + 1309 + + + 5 + 1309 + + + 8 + 1309 + + + 1 + 1310 + + + 5 + 1310 + + + 8 + 1310 + + + 1 + 1311 + + + 5 + 1311 + + + 8 + 1311 + + + 1 + 1312 + + + 5 + 1312 + + + 8 + 1312 + + + 1 + 1313 + + + 5 + 1313 + + + 8 + 1313 + + + 1 + 1314 + + + 5 + 1314 + + + 8 + 1314 + + + 1 + 1315 + + + 5 + 1315 + + + 8 + 1315 + + + 1 + 1316 + + + 5 + 1316 + + + 8 + 1316 + + + 1 + 1317 + + + 5 + 1317 + + + 8 + 1317 + + + 1 + 1318 + + + 5 + 1318 + + + 8 + 1318 + + + 1 + 1319 + + + 5 + 1319 + + + 8 + 1319 + + + 1 + 1320 + + + 5 + 1320 + + + 8 + 1320 + + + 1 + 1321 + + + 5 + 1321 + + + 8 + 1321 + + + 1 + 1322 + + + 5 + 1322 + + + 8 + 1322 + + + 1 + 1323 + + + 5 + 1323 + + + 8 + 1323 + + + 1 + 1324 + + + 5 + 1324 + + + 8 + 1324 + + + 1 + 1325 + + + 5 + 1325 + + + 8 + 1325 + + + 1 + 1326 + + + 5 + 1326 + + + 8 + 1326 + + + 1 + 1327 + + + 5 + 1327 + + + 8 + 1327 + + + 1 + 1328 + + + 5 + 1328 + + + 8 + 1328 + + + 1 + 1329 + + + 5 + 1329 + + + 8 + 1329 + + + 1 + 1330 + + + 5 + 1330 + + + 8 + 1330 + + + 1 + 1331 + + + 5 + 1331 + + + 8 + 1331 + + + 1 + 1332 + + + 5 + 1332 + + + 8 + 1332 + + + 1 + 1333 + + + 5 + 1333 + + + 8 + 1333 + + + 1 + 1334 + + + 5 + 1334 + + + 8 + 1334 + + + 1 + 1335 + + + 8 + 1335 + + + 17 + 1335 + + + 1 + 1336 + + + 8 + 1336 + + + 1 + 1337 + + + 8 + 1337 + + + 1 + 1338 + + + 8 + 1338 + + + 1 + 1339 + + + 8 + 1339 + + + 1 + 1340 + + + 8 + 1340 + + + 1 + 1341 + + + 8 + 1341 + + + 1 + 1342 + + + 8 + 1342 + + + 1 + 1343 + + + 8 + 1343 + + + 1 + 1344 + + + 8 + 1344 + + + 1 + 1345 + + + 8 + 1345 + + + 17 + 1345 + + + 1 + 1346 + + + 8 + 1346 + + + 1 + 1347 + + + 8 + 1347 + + + 1 + 1348 + + + 8 + 1348 + + + 1 + 1349 + + + 8 + 1349 + + + 1 + 1350 + + + 8 + 1350 + + + 1 + 1351 + + + 8 + 1351 + + + 1 + 1352 + + + 8 + 1352 + + + 1 + 1353 + + + 8 + 1353 + + + 1 + 1354 + + + 8 + 1354 + + + 1 + 1355 + + + 8 + 1355 + + + 1 + 1356 + + + 8 + 1356 + + + 1 + 1357 + + + 8 + 1357 + + + 1 + 1358 + + + 8 + 1358 + + + 1 + 1359 + + + 8 + 1359 + + + 1 + 1360 + + + 8 + 1360 + + + 1 + 1361 + + + 8 + 1361 + + + 1 + 1362 + + + 8 + 1362 + + + 1 + 1363 + + + 8 + 1363 + + + 1 + 1364 + + + 8 + 1364 + + + 1 + 1365 + + + 8 + 1365 + + + 1 + 1366 + + + 8 + 1366 + + + 1 + 1367 + + + 8 + 1367 + + + 1 + 1368 + + + 8 + 1368 + + + 1 + 1369 + + + 8 + 1369 + + + 1 + 1370 + + + 8 + 1370 + + + 1 + 1371 + + + 8 + 1371 + + + 1 + 1372 + + + 8 + 1372 + + + 1 + 1373 + + + 8 + 1373 + + + 1 + 1374 + + + 8 + 1374 + + + 1 + 1375 + + + 8 + 1375 + + + 1 + 1376 + + + 8 + 1376 + + + 1 + 1377 + + + 8 + 1377 + + + 1 + 1378 + + + 8 + 1378 + + + 1 + 1379 + + + 8 + 1379 + + + 1 + 1380 + + + 8 + 1380 + + + 17 + 1380 + + + 1 + 1381 + + + 8 + 1381 + + + 1 + 1382 + + + 8 + 1382 + + + 1 + 1383 + + + 8 + 1383 + + + 1 + 1384 + + + 8 + 1384 + + + 1 + 1385 + + + 8 + 1385 + + + 1 + 1386 + + + 8 + 1386 + + + 1 + 1387 + + + 8 + 1387 + + + 1 + 1388 + + + 8 + 1388 + + + 1 + 1389 + + + 8 + 1389 + + + 1 + 1390 + + + 8 + 1390 + + + 1 + 1391 + + + 8 + 1391 + + + 1 + 1392 + + + 8 + 1392 + + + 17 + 1392 + + + 1 + 1393 + + + 8 + 1393 + + + 1 + 1394 + + + 8 + 1394 + + + 1 + 1395 + + + 5 + 1395 + + + 8 + 1395 + + + 1 + 1396 + + + 5 + 1396 + + + 8 + 1396 + + + 1 + 1397 + + + 5 + 1397 + + + 8 + 1397 + + + 1 + 1398 + + + 5 + 1398 + + + 8 + 1398 + + + 1 + 1399 + + + 5 + 1399 + + + 8 + 1399 + + + 1 + 1400 + + + 5 + 1400 + + + 8 + 1400 + + + 1 + 1401 + + + 5 + 1401 + + + 8 + 1401 + + + 1 + 1402 + + + 5 + 1402 + + + 8 + 1402 + + + 1 + 1403 + + + 5 + 1403 + + + 8 + 1403 + + + 1 + 1404 + + + 5 + 1404 + + + 8 + 1404 + + + 1 + 1405 + + + 5 + 1405 + + + 8 + 1405 + + + 1 + 1406 + + + 5 + 1406 + + + 8 + 1406 + + + 1 + 1407 + + + 5 + 1407 + + + 8 + 1407 + + + 1 + 1408 + + + 5 + 1408 + + + 8 + 1408 + + + 1 + 1409 + + + 5 + 1409 + + + 8 + 1409 + + + 1 + 1410 + + + 5 + 1410 + + + 8 + 1410 + + + 1 + 1411 + + + 5 + 1411 + + + 8 + 1411 + + + 1 + 1412 + + + 5 + 1412 + + + 8 + 1412 + + + 1 + 1413 + + + 5 + 1413 + + + 8 + 1413 + + + 1 + 1414 + + + 5 + 1414 + + + 8 + 1414 + + + 1 + 1415 + + + 5 + 1415 + + + 8 + 1415 + + + 1 + 1416 + + + 5 + 1416 + + + 8 + 1416 + + + 1 + 1417 + + + 5 + 1417 + + + 8 + 1417 + + + 1 + 1418 + + + 5 + 1418 + + + 8 + 1418 + + + 1 + 1419 + + + 5 + 1419 + + + 8 + 1419 + + + 1 + 1420 + + + 5 + 1420 + + + 8 + 1420 + + + 1 + 1421 + + + 5 + 1421 + + + 8 + 1421 + + + 1 + 1422 + + + 5 + 1422 + + + 8 + 1422 + + + 1 + 1423 + + + 5 + 1423 + + + 8 + 1423 + + + 1 + 1424 + + + 5 + 1424 + + + 8 + 1424 + + + 1 + 1425 + + + 5 + 1425 + + + 8 + 1425 + + + 1 + 1426 + + + 5 + 1426 + + + 8 + 1426 + + + 1 + 1427 + + + 5 + 1427 + + + 8 + 1427 + + + 1 + 1428 + + + 5 + 1428 + + + 8 + 1428 + + + 1 + 1429 + + + 5 + 1429 + + + 8 + 1429 + + + 1 + 1430 + + + 5 + 1430 + + + 8 + 1430 + + + 1 + 1431 + + + 5 + 1431 + + + 8 + 1431 + + + 1 + 1432 + + + 5 + 1432 + + + 8 + 1432 + + + 1 + 1433 + + + 5 + 1433 + + + 8 + 1433 + + + 1 + 1434 + + + 5 + 1434 + + + 8 + 1434 + + + 1 + 1435 + + + 5 + 1435 + + + 8 + 1435 + + + 1 + 1436 + + + 5 + 1436 + + + 8 + 1436 + + + 1 + 1437 + + + 5 + 1437 + + + 8 + 1437 + + + 1 + 1438 + + + 5 + 1438 + + + 8 + 1438 + + + 1 + 1439 + + + 5 + 1439 + + + 8 + 1439 + + + 1 + 1440 + + + 5 + 1440 + + + 8 + 1440 + + + 1 + 1441 + + + 5 + 1441 + + + 8 + 1441 + + + 1 + 1442 + + + 5 + 1442 + + + 8 + 1442 + + + 1 + 1443 + + + 5 + 1443 + + + 8 + 1443 + + + 1 + 1444 + + + 5 + 1444 + + + 8 + 1444 + + + 1 + 1445 + + + 5 + 1445 + + + 8 + 1445 + + + 1 + 1446 + + + 5 + 1446 + + + 8 + 1446 + + + 1 + 1447 + + + 5 + 1447 + + + 8 + 1447 + + + 1 + 1448 + + + 5 + 1448 + + + 8 + 1448 + + + 1 + 1449 + + + 5 + 1449 + + + 8 + 1449 + + + 1 + 1450 + + + 5 + 1450 + + + 8 + 1450 + + + 1 + 1451 + + + 5 + 1451 + + + 8 + 1451 + + + 1 + 1452 + + + 5 + 1452 + + + 8 + 1452 + + + 1 + 1453 + + + 5 + 1453 + + + 8 + 1453 + + + 1 + 1454 + + + 5 + 1454 + + + 8 + 1454 + + + 1 + 1455 + + + 5 + 1455 + + + 8 + 1455 + + + 1 + 1456 + + + 5 + 1456 + + + 8 + 1456 + + + 1 + 1457 + + + 5 + 1457 + + + 8 + 1457 + + + 1 + 1458 + + + 5 + 1458 + + + 8 + 1458 + + + 1 + 1459 + + + 5 + 1459 + + + 8 + 1459 + + + 1 + 1460 + + + 5 + 1460 + + + 8 + 1460 + + + 1 + 1461 + + + 5 + 1461 + + + 8 + 1461 + + + 1 + 1462 + + + 5 + 1462 + + + 8 + 1462 + + + 1 + 1463 + + + 5 + 1463 + + + 8 + 1463 + + + 1 + 1464 + + + 5 + 1464 + + + 8 + 1464 + + + 1 + 1465 + + + 5 + 1465 + + + 8 + 1465 + + + 1 + 1466 + + + 8 + 1466 + + + 1 + 1467 + + + 8 + 1467 + + + 1 + 1468 + + + 8 + 1468 + + + 1 + 1469 + + + 8 + 1469 + + + 1 + 1470 + + + 8 + 1470 + + + 1 + 1471 + + + 8 + 1471 + + + 1 + 1472 + + + 8 + 1472 + + + 1 + 1473 + + + 8 + 1473 + + + 1 + 1474 + + + 8 + 1474 + + + 1 + 1475 + + + 8 + 1475 + + + 1 + 1476 + + + 8 + 1476 + + + 1 + 1477 + + + 8 + 1477 + + + 1 + 1478 + + + 8 + 1478 + + + 1 + 1479 + + + 8 + 1479 + + + 1 + 1480 + + + 8 + 1480 + + + 1 + 1481 + + + 8 + 1481 + + + 1 + 1482 + + + 8 + 1482 + + + 1 + 1483 + + + 8 + 1483 + + + 1 + 1484 + + + 8 + 1484 + + + 1 + 1485 + + + 8 + 1485 + + + 1 + 1486 + + + 8 + 1486 + + + 1 + 1487 + + + 8 + 1487 + + + 1 + 1488 + + + 8 + 1488 + + + 1 + 1489 + + + 8 + 1489 + + + 1 + 1490 + + + 8 + 1490 + + + 1 + 1491 + + + 8 + 1491 + + + 1 + 1492 + + + 8 + 1492 + + + 1 + 1493 + + + 8 + 1493 + + + 1 + 1494 + + + 8 + 1494 + + + 1 + 1495 + + + 8 + 1495 + + + 1 + 1496 + + + 5 + 1496 + + + 8 + 1496 + + + 1 + 1497 + + + 5 + 1497 + + + 8 + 1497 + + + 1 + 1498 + + + 5 + 1498 + + + 8 + 1498 + + + 1 + 1499 + + + 5 + 1499 + + + 8 + 1499 + + + 1 + 1500 + + + 5 + 1500 + + + 8 + 1500 + + + 1 + 1501 + + + 5 + 1501 + + + 8 + 1501 + + + 1 + 1502 + + + 5 + 1502 + + + 8 + 1502 + + + 1 + 1503 + + + 5 + 1503 + + + 8 + 1503 + + + 1 + 1504 + + + 5 + 1504 + + + 8 + 1504 + + + 1 + 1505 + + + 5 + 1505 + + + 8 + 1505 + + + 1 + 1506 + + + 8 + 1506 + + + 1 + 1507 + + + 8 + 1507 + + + 1 + 1508 + + + 8 + 1508 + + + 1 + 1509 + + + 8 + 1509 + + + 1 + 1510 + + + 8 + 1510 + + + 1 + 1511 + + + 8 + 1511 + + + 1 + 1512 + + + 8 + 1512 + + + 1 + 1513 + + + 8 + 1513 + + + 1 + 1514 + + + 8 + 1514 + + + 11 + 1514 + + + 1 + 1515 + + + 8 + 1515 + + + 1 + 1516 + + + 8 + 1516 + + + 1 + 1517 + + + 8 + 1517 + + + 1 + 1518 + + + 8 + 1518 + + + 11 + 1518 + + + 1 + 1519 + + + 8 + 1519 + + + 11 + 1519 + + + 1 + 1520 + + + 5 + 1520 + + + 8 + 1520 + + + 1 + 1521 + + + 5 + 1521 + + + 8 + 1521 + + + 1 + 1522 + + + 5 + 1522 + + + 8 + 1522 + + + 1 + 1523 + + + 5 + 1523 + + + 8 + 1523 + + + 1 + 1524 + + + 5 + 1524 + + + 8 + 1524 + + + 1 + 1525 + + + 5 + 1525 + + + 8 + 1525 + + + 1 + 1526 + + + 5 + 1526 + + + 8 + 1526 + + + 1 + 1527 + + + 5 + 1527 + + + 8 + 1527 + + + 1 + 1528 + + + 5 + 1528 + + + 8 + 1528 + + + 1 + 1529 + + + 5 + 1529 + + + 8 + 1529 + + + 1 + 1530 + + + 5 + 1530 + + + 8 + 1530 + + + 1 + 1531 + + + 5 + 1531 + + + 8 + 1531 + + + 1 + 1532 + + + 8 + 1532 + + + 1 + 1533 + + + 8 + 1533 + + + 1 + 1534 + + + 8 + 1534 + + + 1 + 1535 + + + 8 + 1535 + + + 1 + 1536 + + + 8 + 1536 + + + 1 + 1537 + + + 8 + 1537 + + + 1 + 1538 + + + 8 + 1538 + + + 1 + 1539 + + + 8 + 1539 + + + 1 + 1540 + + + 8 + 1540 + + + 1 + 1541 + + + 8 + 1541 + + + 1 + 1542 + + + 8 + 1542 + + + 1 + 1543 + + + 8 + 1543 + + + 1 + 1544 + + + 8 + 1544 + + + 1 + 1545 + + + 8 + 1545 + + + 1 + 1546 + + + 8 + 1546 + + + 1 + 1547 + + + 8 + 1547 + + + 1 + 1548 + + + 8 + 1548 + + + 1 + 1549 + + + 8 + 1549 + + + 1 + 1550 + + + 8 + 1550 + + + 1 + 1551 + + + 8 + 1551 + + + 1 + 1552 + + + 8 + 1552 + + + 1 + 1553 + + + 8 + 1553 + + + 1 + 1554 + + + 8 + 1554 + + + 1 + 1555 + + + 8 + 1555 + + + 1 + 1556 + + + 8 + 1556 + + + 1 + 1557 + + + 5 + 1557 + + + 8 + 1557 + + + 1 + 1558 + + + 8 + 1558 + + + 1 + 1559 + + + 8 + 1559 + + + 1 + 1560 + + + 8 + 1560 + + + 1 + 1561 + + + 8 + 1561 + + + 1 + 1562 + + + 5 + 1562 + + + 8 + 1562 + + + 1 + 1563 + + + 5 + 1563 + + + 8 + 1563 + + + 1 + 1564 + + + 5 + 1564 + + + 8 + 1564 + + + 1 + 1565 + + + 5 + 1565 + + + 8 + 1565 + + + 1 + 1566 + + + 5 + 1566 + + + 8 + 1566 + + + 1 + 1567 + + + 5 + 1567 + + + 8 + 1567 + + + 1 + 1568 + + + 5 + 1568 + + + 8 + 1568 + + + 1 + 1569 + + + 5 + 1569 + + + 8 + 1569 + + + 1 + 1570 + + + 5 + 1570 + + + 8 + 1570 + + + 1 + 1571 + + + 5 + 1571 + + + 8 + 1571 + + + 1 + 1572 + + + 5 + 1572 + + + 8 + 1572 + + + 1 + 1573 + + + 5 + 1573 + + + 8 + 1573 + + + 1 + 1574 + + + 5 + 1574 + + + 8 + 1574 + + + 1 + 1575 + + + 5 + 1575 + + + 8 + 1575 + + + 1 + 1576 + + + 5 + 1576 + + + 8 + 1576 + + + 1 + 1577 + + + 5 + 1577 + + + 8 + 1577 + + + 1 + 1578 + + + 5 + 1578 + + + 8 + 1578 + + + 1 + 1579 + + + 5 + 1579 + + + 8 + 1579 + + + 1 + 1580 + + + 5 + 1580 + + + 8 + 1580 + + + 1 + 1581 + + + 5 + 1581 + + + 8 + 1581 + + + 1 + 1582 + + + 5 + 1582 + + + 8 + 1582 + + + 1 + 1583 + + + 5 + 1583 + + + 8 + 1583 + + + 1 + 1584 + + + 5 + 1584 + + + 8 + 1584 + + + 1 + 1585 + + + 5 + 1585 + + + 8 + 1585 + + + 1 + 1586 + + + 5 + 1586 + + + 8 + 1586 + + + 1 + 1587 + + + 8 + 1587 + + + 1 + 1588 + + + 8 + 1588 + + + 1 + 1589 + + + 8 + 1589 + + + 1 + 1590 + + + 8 + 1590 + + + 1 + 1591 + + + 8 + 1591 + + + 1 + 1592 + + + 8 + 1592 + + + 1 + 1593 + + + 8 + 1593 + + + 1 + 1594 + + + 8 + 1594 + + + 1 + 1595 + + + 8 + 1595 + + + 1 + 1596 + + + 8 + 1596 + + + 1 + 1597 + + + 8 + 1597 + + + 1 + 1598 + + + 8 + 1598 + + + 1 + 1599 + + + 8 + 1599 + + + 1 + 1600 + + + 8 + 1600 + + + 1 + 1601 + + + 8 + 1601 + + + 1 + 1602 + + + 8 + 1602 + + + 1 + 1603 + + + 8 + 1603 + + + 1 + 1604 + + + 8 + 1604 + + + 1 + 1605 + + + 8 + 1605 + + + 1 + 1606 + + + 8 + 1606 + + + 1 + 1607 + + + 8 + 1607 + + + 1 + 1608 + + + 8 + 1608 + + + 1 + 1609 + + + 8 + 1609 + + + 1 + 1610 + + + 8 + 1610 + + + 1 + 1611 + + + 8 + 1611 + + + 1 + 1612 + + + 8 + 1612 + + + 1 + 1613 + + + 8 + 1613 + + + 1 + 1614 + + + 8 + 1614 + + + 1 + 1615 + + + 8 + 1615 + + + 1 + 1616 + + + 8 + 1616 + + + 1 + 1617 + + + 8 + 1617 + + + 1 + 1618 + + + 8 + 1618 + + + 1 + 1619 + + + 8 + 1619 + + + 1 + 1620 + + + 8 + 1620 + + + 1 + 1621 + + + 8 + 1621 + + + 1 + 1622 + + + 8 + 1622 + + + 1 + 1623 + + + 8 + 1623 + + + 1 + 1624 + + + 8 + 1624 + + + 1 + 1625 + + + 8 + 1625 + + + 1 + 1626 + + + 8 + 1626 + + + 1 + 1627 + + + 8 + 1627 + + + 1 + 1628 + + + 8 + 1628 + + + 1 + 1629 + + + 8 + 1629 + + + 1 + 1630 + + + 8 + 1630 + + + 1 + 1631 + + + 8 + 1631 + + + 1 + 1632 + + + 8 + 1632 + + + 1 + 1633 + + + 8 + 1633 + + + 1 + 1634 + + + 8 + 1634 + + + 1 + 1635 + + + 8 + 1635 + + + 1 + 1636 + + + 8 + 1636 + + + 1 + 1637 + + + 8 + 1637 + + + 1 + 1638 + + + 8 + 1638 + + + 1 + 1639 + + + 8 + 1639 + + + 1 + 1640 + + + 8 + 1640 + + + 1 + 1641 + + + 8 + 1641 + + + 1 + 1642 + + + 8 + 1642 + + + 1 + 1643 + + + 8 + 1643 + + + 1 + 1644 + + + 8 + 1644 + + + 1 + 1645 + + + 8 + 1645 + + + 1 + 1646 + + + 8 + 1646 + + + 1 + 1647 + + + 8 + 1647 + + + 1 + 1648 + + + 8 + 1648 + + + 1 + 1649 + + + 8 + 1649 + + + 1 + 1650 + + + 8 + 1650 + + + 1 + 1651 + + + 8 + 1651 + + + 1 + 1652 + + + 8 + 1652 + + + 1 + 1653 + + + 8 + 1653 + + + 1 + 1654 + + + 8 + 1654 + + + 1 + 1655 + + + 8 + 1655 + + + 1 + 1656 + + + 8 + 1656 + + + 1 + 1657 + + + 8 + 1657 + + + 1 + 1658 + + + 8 + 1658 + + + 1 + 1659 + + + 8 + 1659 + + + 1 + 1660 + + + 8 + 1660 + + + 1 + 1661 + + + 8 + 1661 + + + 1 + 1662 + + + 8 + 1662 + + + 1 + 1663 + + + 8 + 1663 + + + 1 + 1664 + + + 8 + 1664 + + + 1 + 1665 + + + 8 + 1665 + + + 1 + 1666 + + + 8 + 1666 + + + 1 + 1667 + + + 8 + 1667 + + + 1 + 1668 + + + 8 + 1668 + + + 1 + 1669 + + + 8 + 1669 + + + 1 + 1670 + + + 8 + 1670 + + + 1 + 1671 + + + 5 + 1671 + + + 8 + 1671 + + + 1 + 1672 + + + 5 + 1672 + + + 8 + 1672 + + + 1 + 1673 + + + 5 + 1673 + + + 8 + 1673 + + + 1 + 1674 + + + 5 + 1674 + + + 8 + 1674 + + + 1 + 1675 + + + 5 + 1675 + + + 8 + 1675 + + + 1 + 1676 + + + 5 + 1676 + + + 8 + 1676 + + + 1 + 1677 + + + 5 + 1677 + + + 8 + 1677 + + + 1 + 1678 + + + 5 + 1678 + + + 8 + 1678 + + + 1 + 1679 + + + 5 + 1679 + + + 8 + 1679 + + + 1 + 1680 + + + 5 + 1680 + + + 8 + 1680 + + + 1 + 1681 + + + 5 + 1681 + + + 8 + 1681 + + + 1 + 1682 + + + 5 + 1682 + + + 8 + 1682 + + + 1 + 1683 + + + 5 + 1683 + + + 8 + 1683 + + + 1 + 1684 + + + 5 + 1684 + + + 8 + 1684 + + + 1 + 1685 + + + 5 + 1685 + + + 8 + 1685 + + + 1 + 1686 + + + 5 + 1686 + + + 8 + 1686 + + + 1 + 1687 + + + 5 + 1687 + + + 8 + 1687 + + + 1 + 1688 + + + 5 + 1688 + + + 8 + 1688 + + + 1 + 1689 + + + 5 + 1689 + + + 8 + 1689 + + + 1 + 1690 + + + 5 + 1690 + + + 8 + 1690 + + + 1 + 1691 + + + 5 + 1691 + + + 8 + 1691 + + + 1 + 1692 + + + 5 + 1692 + + + 8 + 1692 + + + 1 + 1693 + + + 5 + 1693 + + + 8 + 1693 + + + 1 + 1694 + + + 5 + 1694 + + + 8 + 1694 + + + 1 + 1695 + + + 5 + 1695 + + + 8 + 1695 + + + 1 + 1696 + + + 5 + 1696 + + + 8 + 1696 + + + 1 + 1697 + + + 5 + 1697 + + + 8 + 1697 + + + 1 + 1698 + + + 5 + 1698 + + + 8 + 1698 + + + 1 + 1699 + + + 5 + 1699 + + + 8 + 1699 + + + 1 + 1700 + + + 5 + 1700 + + + 8 + 1700 + + + 1 + 1701 + + + 5 + 1701 + + + 8 + 1701 + + + 1 + 1702 + + + 8 + 1702 + + + 1 + 1703 + + + 8 + 1703 + + + 1 + 1704 + + + 8 + 1704 + + + 1 + 1705 + + + 8 + 1705 + + + 1 + 1706 + + + 8 + 1706 + + + 1 + 1707 + + + 8 + 1707 + + + 1 + 1708 + + + 8 + 1708 + + + 1 + 1709 + + + 8 + 1709 + + + 1 + 1710 + + + 8 + 1710 + + + 1 + 1711 + + + 8 + 1711 + + + 1 + 1712 + + + 8 + 1712 + + + 1 + 1713 + + + 8 + 1713 + + + 1 + 1714 + + + 8 + 1714 + + + 1 + 1715 + + + 8 + 1715 + + + 1 + 1716 + + + 8 + 1716 + + + 1 + 1717 + + + 8 + 1717 + + + 1 + 1718 + + + 8 + 1718 + + + 1 + 1719 + + + 8 + 1719 + + + 1 + 1720 + + + 8 + 1720 + + + 1 + 1721 + + + 8 + 1721 + + + 1 + 1722 + + + 8 + 1722 + + + 1 + 1723 + + + 8 + 1723 + + + 1 + 1724 + + + 8 + 1724 + + + 1 + 1725 + + + 8 + 1725 + + + 1 + 1726 + + + 8 + 1726 + + + 1 + 1727 + + + 8 + 1727 + + + 1 + 1728 + + + 8 + 1728 + + + 1 + 1729 + + + 8 + 1729 + + + 1 + 1730 + + + 8 + 1730 + + + 1 + 1731 + + + 8 + 1731 + + + 1 + 1732 + + + 8 + 1732 + + + 1 + 1733 + + + 8 + 1733 + + + 1 + 1734 + + + 8 + 1734 + + + 1 + 1735 + + + 8 + 1735 + + + 1 + 1736 + + + 8 + 1736 + + + 1 + 1737 + + + 8 + 1737 + + + 1 + 1738 + + + 8 + 1738 + + + 1 + 1739 + + + 8 + 1739 + + + 1 + 1740 + + + 8 + 1740 + + + 1 + 1741 + + + 8 + 1741 + + + 1 + 1742 + + + 8 + 1742 + + + 1 + 1743 + + + 8 + 1743 + + + 1 + 1744 + + + 8 + 1744 + + + 1 + 1745 + + + 8 + 1745 + + + 1 + 1746 + + + 8 + 1746 + + + 1 + 1747 + + + 8 + 1747 + + + 1 + 1748 + + + 8 + 1748 + + + 1 + 1749 + + + 8 + 1749 + + + 1 + 1750 + + + 8 + 1750 + + + 1 + 1751 + + + 8 + 1751 + + + 1 + 1752 + + + 8 + 1752 + + + 1 + 1753 + + + 8 + 1753 + + + 1 + 1754 + + + 8 + 1754 + + + 1 + 1755 + + + 8 + 1755 + + + 1 + 1756 + + + 8 + 1756 + + + 1 + 1757 + + + 8 + 1757 + + + 1 + 1758 + + + 8 + 1758 + + + 1 + 1759 + + + 8 + 1759 + + + 1 + 1760 + + + 8 + 1760 + + + 1 + 1761 + + + 8 + 1761 + + + 1 + 1762 + + + 8 + 1762 + + + 1 + 1763 + + + 8 + 1763 + + + 1 + 1764 + + + 8 + 1764 + + + 1 + 1765 + + + 8 + 1765 + + + 1 + 1766 + + + 8 + 1766 + + + 1 + 1767 + + + 8 + 1767 + + + 1 + 1768 + + + 8 + 1768 + + + 1 + 1769 + + + 8 + 1769 + + + 1 + 1770 + + + 8 + 1770 + + + 1 + 1771 + + + 8 + 1771 + + + 1 + 1772 + + + 8 + 1772 + + + 1 + 1773 + + + 8 + 1773 + + + 1 + 1774 + + + 8 + 1774 + + + 1 + 1775 + + + 8 + 1775 + + + 1 + 1776 + + + 8 + 1776 + + + 1 + 1777 + + + 8 + 1777 + + + 1 + 1778 + + + 8 + 1778 + + + 1 + 1779 + + + 8 + 1779 + + + 1 + 1780 + + + 8 + 1780 + + + 1 + 1781 + + + 8 + 1781 + + + 1 + 1782 + + + 8 + 1782 + + + 1 + 1783 + + + 8 + 1783 + + + 1 + 1784 + + + 8 + 1784 + + + 1 + 1785 + + + 8 + 1785 + + + 1 + 1786 + + + 8 + 1786 + + + 1 + 1787 + + + 8 + 1787 + + + 1 + 1788 + + + 8 + 1788 + + + 1 + 1789 + + + 8 + 1789 + + + 1 + 1790 + + + 8 + 1790 + + + 1 + 1791 + + + 8 + 1791 + + + 1 + 1792 + + + 8 + 1792 + + + 1 + 1793 + + + 8 + 1793 + + + 1 + 1794 + + + 8 + 1794 + + + 1 + 1795 + + + 8 + 1795 + + + 1 + 1796 + + + 8 + 1796 + + + 1 + 1797 + + + 8 + 1797 + + + 1 + 1798 + + + 8 + 1798 + + + 1 + 1799 + + + 8 + 1799 + + + 1 + 1800 + + + 8 + 1800 + + + 1 + 1801 + + + 5 + 1801 + + + 8 + 1801 + + + 17 + 1801 + + + 1 + 1802 + + + 5 + 1802 + + + 8 + 1802 + + + 1 + 1803 + + + 5 + 1803 + + + 8 + 1803 + + + 1 + 1804 + + + 5 + 1804 + + + 8 + 1804 + + + 1 + 1805 + + + 5 + 1805 + + + 8 + 1805 + + + 1 + 1806 + + + 5 + 1806 + + + 8 + 1806 + + + 1 + 1807 + + + 5 + 1807 + + + 8 + 1807 + + + 1 + 1808 + + + 5 + 1808 + + + 8 + 1808 + + + 1 + 1809 + + + 5 + 1809 + + + 8 + 1809 + + + 1 + 1810 + + + 5 + 1810 + + + 8 + 1810 + + + 1 + 1811 + + + 5 + 1811 + + + 8 + 1811 + + + 1 + 1812 + + + 5 + 1812 + + + 8 + 1812 + + + 1 + 1813 + + + 5 + 1813 + + + 8 + 1813 + + + 1 + 1814 + + + 5 + 1814 + + + 8 + 1814 + + + 1 + 1815 + + + 5 + 1815 + + + 8 + 1815 + + + 1 + 1816 + + + 5 + 1816 + + + 8 + 1816 + + + 1 + 1817 + + + 5 + 1817 + + + 8 + 1817 + + + 1 + 1818 + + + 5 + 1818 + + + 8 + 1818 + + + 1 + 1819 + + + 5 + 1819 + + + 8 + 1819 + + + 1 + 1820 + + + 5 + 1820 + + + 8 + 1820 + + + 1 + 1821 + + + 5 + 1821 + + + 8 + 1821 + + + 1 + 1822 + + + 5 + 1822 + + + 8 + 1822 + + + 1 + 1823 + + + 5 + 1823 + + + 8 + 1823 + + + 1 + 1824 + + + 5 + 1824 + + + 8 + 1824 + + + 1 + 1825 + + + 5 + 1825 + + + 8 + 1825 + + + 1 + 1826 + + + 5 + 1826 + + + 8 + 1826 + + + 1 + 1827 + + + 5 + 1827 + + + 8 + 1827 + + + 1 + 1828 + + + 5 + 1828 + + + 8 + 1828 + + + 1 + 1829 + + + 8 + 1829 + + + 1 + 1830 + + + 8 + 1830 + + + 17 + 1830 + + + 1 + 1831 + + + 8 + 1831 + + + 1 + 1832 + + + 8 + 1832 + + + 1 + 1833 + + + 8 + 1833 + + + 1 + 1834 + + + 8 + 1834 + + + 1 + 1835 + + + 8 + 1835 + + + 1 + 1836 + + + 8 + 1836 + + + 1 + 1837 + + + 8 + 1837 + + + 17 + 1837 + + + 1 + 1838 + + + 8 + 1838 + + + 1 + 1839 + + + 5 + 1839 + + + 8 + 1839 + + + 1 + 1840 + + + 5 + 1840 + + + 8 + 1840 + + + 1 + 1841 + + + 5 + 1841 + + + 8 + 1841 + + + 1 + 1842 + + + 5 + 1842 + + + 8 + 1842 + + + 1 + 1843 + + + 5 + 1843 + + + 8 + 1843 + + + 1 + 1844 + + + 5 + 1844 + + + 8 + 1844 + + + 1 + 1845 + + + 5 + 1845 + + + 8 + 1845 + + + 1 + 1846 + + + 5 + 1846 + + + 8 + 1846 + + + 1 + 1847 + + + 5 + 1847 + + + 8 + 1847 + + + 1 + 1848 + + + 5 + 1848 + + + 8 + 1848 + + + 1 + 1849 + + + 5 + 1849 + + + 8 + 1849 + + + 1 + 1850 + + + 5 + 1850 + + + 8 + 1850 + + + 1 + 1851 + + + 5 + 1851 + + + 8 + 1851 + + + 1 + 1852 + + + 5 + 1852 + + + 8 + 1852 + + + 1 + 1853 + + + 8 + 1853 + + + 1 + 1854 + + + 8 + 1854 + + + 17 + 1854 + + + 1 + 1855 + + + 8 + 1855 + + + 1 + 1856 + + + 8 + 1856 + + + 1 + 1857 + + + 8 + 1857 + + + 1 + 1858 + + + 8 + 1858 + + + 1 + 1859 + + + 8 + 1859 + + + 1 + 1860 + + + 8 + 1860 + + + 1 + 1861 + + + 5 + 1861 + + + 8 + 1861 + + + 1 + 1862 + + + 5 + 1862 + + + 8 + 1862 + + + 1 + 1863 + + + 5 + 1863 + + + 8 + 1863 + + + 1 + 1864 + + + 5 + 1864 + + + 8 + 1864 + + + 1 + 1865 + + + 5 + 1865 + + + 8 + 1865 + + + 1 + 1866 + + + 5 + 1866 + + + 8 + 1866 + + + 1 + 1867 + + + 5 + 1867 + + + 8 + 1867 + + + 1 + 1868 + + + 5 + 1868 + + + 8 + 1868 + + + 1 + 1869 + + + 5 + 1869 + + + 8 + 1869 + + + 1 + 1870 + + + 5 + 1870 + + + 8 + 1870 + + + 1 + 1871 + + + 5 + 1871 + + + 8 + 1871 + + + 1 + 1872 + + + 5 + 1872 + + + 8 + 1872 + + + 1 + 1873 + + + 5 + 1873 + + + 8 + 1873 + + + 1 + 1874 + + + 8 + 1874 + + + 1 + 1875 + + + 8 + 1875 + + + 1 + 1876 + + + 8 + 1876 + + + 17 + 1876 + + + 1 + 1877 + + + 8 + 1877 + + + 1 + 1878 + + + 8 + 1878 + + + 1 + 1879 + + + 8 + 1879 + + + 1 + 1880 + + + 8 + 1880 + + + 17 + 1880 + + + 1 + 1881 + + + 8 + 1881 + + + 1 + 1882 + + + 8 + 1882 + + + 1 + 1883 + + + 8 + 1883 + + + 1 + 1884 + + + 8 + 1884 + + + 1 + 1885 + + + 8 + 1885 + + + 1 + 1886 + + + 8 + 1886 + + + 1 + 1887 + + + 8 + 1887 + + + 1 + 1888 + + + 8 + 1888 + + + 1 + 1889 + + + 8 + 1889 + + + 1 + 1890 + + + 8 + 1890 + + + 1 + 1891 + + + 8 + 1891 + + + 1 + 1892 + + + 8 + 1892 + + + 1 + 1893 + + + 8 + 1893 + + + 1 + 1894 + + + 8 + 1894 + + + 1 + 1895 + + + 8 + 1895 + + + 1 + 1896 + + + 8 + 1896 + + + 1 + 1897 + + + 8 + 1897 + + + 1 + 1898 + + + 8 + 1898 + + + 1 + 1899 + + + 8 + 1899 + + + 1 + 1900 + + + 8 + 1900 + + + 1 + 1901 + + + 8 + 1901 + + + 1 + 1902 + + + 8 + 1902 + + + 1 + 1903 + + + 8 + 1903 + + + 1 + 1904 + + + 8 + 1904 + + + 1 + 1905 + + + 8 + 1905 + + + 1 + 1906 + + + 8 + 1906 + + + 1 + 1907 + + + 8 + 1907 + + + 1 + 1908 + + + 8 + 1908 + + + 1 + 1909 + + + 8 + 1909 + + + 1 + 1910 + + + 8 + 1910 + + + 1 + 1911 + + + 8 + 1911 + + + 1 + 1912 + + + 8 + 1912 + + + 1 + 1913 + + + 8 + 1913 + + + 1 + 1914 + + + 8 + 1914 + + + 1 + 1915 + + + 8 + 1915 + + + 1 + 1916 + + + 8 + 1916 + + + 11 + 1916 + + + 1 + 1917 + + + 8 + 1917 + + + 1 + 1918 + + + 8 + 1918 + + + 1 + 1919 + + + 8 + 1919 + + + 1 + 1920 + + + 8 + 1920 + + + 1 + 1921 + + + 8 + 1921 + + + 11 + 1921 + + + 1 + 1922 + + + 8 + 1922 + + + 1 + 1923 + + + 8 + 1923 + + + 1 + 1924 + + + 8 + 1924 + + + 1 + 1925 + + + 8 + 1925 + + + 1 + 1926 + + + 8 + 1926 + + + 1 + 1927 + + + 8 + 1927 + + + 1 + 1928 + + + 8 + 1928 + + + 11 + 1928 + + + 1 + 1929 + + + 8 + 1929 + + + 1 + 1930 + + + 8 + 1930 + + + 1 + 1931 + + + 8 + 1931 + + + 1 + 1932 + + + 8 + 1932 + + + 1 + 1933 + + + 8 + 1933 + + + 1 + 1934 + + + 8 + 1934 + + + 1 + 1935 + + + 8 + 1935 + + + 1 + 1936 + + + 8 + 1936 + + + 1 + 1937 + + + 8 + 1937 + + + 1 + 1938 + + + 8 + 1938 + + + 1 + 1939 + + + 8 + 1939 + + + 1 + 1940 + + + 8 + 1940 + + + 1 + 1941 + + + 8 + 1941 + + + 1 + 1942 + + + 8 + 1942 + + + 17 + 1942 + + + 1 + 1943 + + + 8 + 1943 + + + 1 + 1944 + + + 8 + 1944 + + + 1 + 1945 + + + 8 + 1945 + + + 17 + 1945 + + + 1 + 1946 + + + 8 + 1946 + + + 1 + 1947 + + + 8 + 1947 + + + 1 + 1948 + + + 8 + 1948 + + + 1 + 1949 + + + 8 + 1949 + + + 1 + 1950 + + + 8 + 1950 + + + 1 + 1951 + + + 8 + 1951 + + + 1 + 1952 + + + 8 + 1952 + + + 1 + 1953 + + + 8 + 1953 + + + 1 + 1954 + + + 8 + 1954 + + + 1 + 1955 + + + 8 + 1955 + + + 1 + 1956 + + + 8 + 1956 + + + 1 + 1957 + + + 8 + 1957 + + + 1 + 1958 + + + 8 + 1958 + + + 1 + 1959 + + + 8 + 1959 + + + 1 + 1960 + + + 8 + 1960 + + + 1 + 1961 + + + 8 + 1961 + + + 1 + 1962 + + + 8 + 1962 + + + 1 + 1963 + + + 8 + 1963 + + + 1 + 1964 + + + 8 + 1964 + + + 1 + 1965 + + + 8 + 1965 + + + 1 + 1966 + + + 8 + 1966 + + + 1 + 1967 + + + 8 + 1967 + + + 1 + 1968 + + + 8 + 1968 + + + 1 + 1969 + + + 5 + 1969 + + + 8 + 1969 + + + 1 + 1970 + + + 5 + 1970 + + + 8 + 1970 + + + 1 + 1971 + + + 5 + 1971 + + + 8 + 1971 + + + 1 + 1972 + + + 5 + 1972 + + + 8 + 1972 + + + 1 + 1973 + + + 5 + 1973 + + + 8 + 1973 + + + 1 + 1974 + + + 5 + 1974 + + + 8 + 1974 + + + 1 + 1975 + + + 5 + 1975 + + + 8 + 1975 + + + 1 + 1976 + + + 5 + 1976 + + + 8 + 1976 + + + 1 + 1977 + + + 5 + 1977 + + + 8 + 1977 + + + 1 + 1978 + + + 5 + 1978 + + + 8 + 1978 + + + 1 + 1979 + + + 5 + 1979 + + + 8 + 1979 + + + 1 + 1980 + + + 5 + 1980 + + + 8 + 1980 + + + 1 + 1981 + + + 5 + 1981 + + + 8 + 1981 + + + 1 + 1982 + + + 5 + 1982 + + + 8 + 1982 + + + 1 + 1983 + + + 5 + 1983 + + + 8 + 1983 + + + 1 + 1984 + + + 5 + 1984 + + + 8 + 1984 + + + 17 + 1984 + + + 1 + 1985 + + + 5 + 1985 + + + 8 + 1985 + + + 1 + 1986 + + + 5 + 1986 + + + 8 + 1986 + + + 1 + 1987 + + + 5 + 1987 + + + 8 + 1987 + + + 1 + 1988 + + + 5 + 1988 + + + 8 + 1988 + + + 1 + 1989 + + + 5 + 1989 + + + 8 + 1989 + + + 1 + 1990 + + + 5 + 1990 + + + 8 + 1990 + + + 1 + 1991 + + + 5 + 1991 + + + 8 + 1991 + + + 1 + 1992 + + + 5 + 1992 + + + 8 + 1992 + + + 1 + 1993 + + + 5 + 1993 + + + 8 + 1993 + + + 1 + 1994 + + + 5 + 1994 + + + 8 + 1994 + + + 1 + 1995 + + + 5 + 1995 + + + 8 + 1995 + + + 1 + 1996 + + + 5 + 1996 + + + 8 + 1996 + + + 1 + 1997 + + + 5 + 1997 + + + 8 + 1997 + + + 1 + 1998 + + + 5 + 1998 + + + 8 + 1998 + + + 1 + 1999 + + + 5 + 1999 + + + 8 + 1999 + + + 1 + 2000 + + + 5 + 2000 + + + 8 + 2000 + + + 1 + 2001 + + + 5 + 2001 + + + 8 + 2001 + + + 1 + 2002 + + + 5 + 2002 + + + 8 + 2002 + + + 1 + 2003 + + + 5 + 2003 + + + 8 + 2003 + + + 16 + 2003 + + + 1 + 2004 + + + 5 + 2004 + + + 8 + 2004 + + + 16 + 2004 + + + 1 + 2005 + + + 5 + 2005 + + + 8 + 2005 + + + 16 + 2005 + + + 1 + 2006 + + + 5 + 2006 + + + 8 + 2006 + + + 1 + 2007 + + + 5 + 2007 + + + 8 + 2007 + + + 16 + 2007 + + + 1 + 2008 + + + 5 + 2008 + + + 8 + 2008 + + + 1 + 2009 + + + 5 + 2009 + + + 8 + 2009 + + + 1 + 2010 + + + 5 + 2010 + + + 8 + 2010 + + + 16 + 2010 + + + 1 + 2011 + + + 5 + 2011 + + + 8 + 2011 + + + 1 + 2012 + + + 5 + 2012 + + + 8 + 2012 + + + 1 + 2013 + + + 5 + 2013 + + + 8 + 2013 + + + 16 + 2013 + + + 1 + 2014 + + + 5 + 2014 + + + 8 + 2014 + + + 1 + 2015 + + + 8 + 2015 + + + 1 + 2016 + + + 8 + 2016 + + + 1 + 2017 + + + 8 + 2017 + + + 1 + 2018 + + + 8 + 2018 + + + 1 + 2019 + + + 8 + 2019 + + + 1 + 2020 + + + 8 + 2020 + + + 1 + 2021 + + + 8 + 2021 + + + 1 + 2022 + + + 8 + 2022 + + + 1 + 2023 + + + 8 + 2023 + + + 1 + 2024 + + + 8 + 2024 + + + 1 + 2025 + + + 8 + 2025 + + + 1 + 2026 + + + 8 + 2026 + + + 1 + 2027 + + + 8 + 2027 + + + 1 + 2028 + + + 8 + 2028 + + + 1 + 2029 + + + 8 + 2029 + + + 1 + 2030 + + + 8 + 2030 + + + 1 + 2031 + + + 8 + 2031 + + + 1 + 2032 + + + 8 + 2032 + + + 1 + 2033 + + + 8 + 2033 + + + 1 + 2034 + + + 8 + 2034 + + + 1 + 2035 + + + 8 + 2035 + + + 1 + 2036 + + + 8 + 2036 + + + 1 + 2037 + + + 8 + 2037 + + + 1 + 2038 + + + 8 + 2038 + + + 1 + 2039 + + + 8 + 2039 + + + 1 + 2040 + + + 8 + 2040 + + + 1 + 2041 + + + 8 + 2041 + + + 1 + 2042 + + + 8 + 2042 + + + 1 + 2043 + + + 8 + 2043 + + + 1 + 2044 + + + 5 + 2044 + + + 8 + 2044 + + + 1 + 2045 + + + 5 + 2045 + + + 8 + 2045 + + + 1 + 2046 + + + 5 + 2046 + + + 8 + 2046 + + + 1 + 2047 + + + 5 + 2047 + + + 8 + 2047 + + + 1 + 2048 + + + 5 + 2048 + + + 8 + 2048 + + + 1 + 2049 + + + 5 + 2049 + + + 8 + 2049 + + + 1 + 2050 + + + 5 + 2050 + + + 8 + 2050 + + + 1 + 2051 + + + 5 + 2051 + + + 8 + 2051 + + + 1 + 2052 + + + 5 + 2052 + + + 8 + 2052 + + + 1 + 2053 + + + 5 + 2053 + + + 8 + 2053 + + + 1 + 2054 + + + 5 + 2054 + + + 8 + 2054 + + + 1 + 2055 + + + 5 + 2055 + + + 8 + 2055 + + + 1 + 2056 + + + 5 + 2056 + + + 8 + 2056 + + + 1 + 2057 + + + 5 + 2057 + + + 8 + 2057 + + + 1 + 2058 + + + 5 + 2058 + + + 8 + 2058 + + + 1 + 2059 + + + 5 + 2059 + + + 8 + 2059 + + + 1 + 2060 + + + 5 + 2060 + + + 8 + 2060 + + + 1 + 2061 + + + 5 + 2061 + + + 8 + 2061 + + + 1 + 2062 + + + 5 + 2062 + + + 8 + 2062 + + + 1 + 2063 + + + 5 + 2063 + + + 8 + 2063 + + + 1 + 2064 + + + 5 + 2064 + + + 8 + 2064 + + + 1 + 2065 + + + 8 + 2065 + + + 1 + 2066 + + + 8 + 2066 + + + 1 + 2067 + + + 8 + 2067 + + + 1 + 2068 + + + 8 + 2068 + + + 1 + 2069 + + + 8 + 2069 + + + 1 + 2070 + + + 8 + 2070 + + + 1 + 2071 + + + 8 + 2071 + + + 1 + 2072 + + + 8 + 2072 + + + 1 + 2073 + + + 8 + 2073 + + + 1 + 2074 + + + 8 + 2074 + + + 1 + 2075 + + + 8 + 2075 + + + 1 + 2076 + + + 8 + 2076 + + + 1 + 2077 + + + 8 + 2077 + + + 1 + 2078 + + + 8 + 2078 + + + 1 + 2079 + + + 8 + 2079 + + + 1 + 2080 + + + 8 + 2080 + + + 1 + 2081 + + + 8 + 2081 + + + 1 + 2082 + + + 8 + 2082 + + + 1 + 2083 + + + 8 + 2083 + + + 1 + 2084 + + + 8 + 2084 + + + 1 + 2085 + + + 8 + 2085 + + + 1 + 2086 + + + 8 + 2086 + + + 1 + 2087 + + + 8 + 2087 + + + 1 + 2088 + + + 8 + 2088 + + + 1 + 2089 + + + 8 + 2089 + + + 1 + 2090 + + + 8 + 2090 + + + 1 + 2091 + + + 8 + 2091 + + + 1 + 2092 + + + 8 + 2092 + + + 1 + 2093 + + + 8 + 2093 + + + 1 + 2094 + + + 8 + 2094 + + + 17 + 2094 + + + 1 + 2095 + + + 8 + 2095 + + + 17 + 2095 + + + 1 + 2096 + + + 8 + 2096 + + + 17 + 2096 + + + 1 + 2097 + + + 8 + 2097 + + + 1 + 2098 + + + 8 + 2098 + + + 1 + 2099 + + + 8 + 2099 + + + 1 + 2100 + + + 8 + 2100 + + + 1 + 2101 + + + 8 + 2101 + + + 1 + 2102 + + + 8 + 2102 + + + 1 + 2103 + + + 8 + 2103 + + + 1 + 2104 + + + 8 + 2104 + + + 1 + 2105 + + + 8 + 2105 + + + 1 + 2106 + + + 8 + 2106 + + + 1 + 2107 + + + 8 + 2107 + + + 1 + 2108 + + + 8 + 2108 + + + 1 + 2109 + + + 8 + 2109 + + + 1 + 2110 + + + 8 + 2110 + + + 1 + 2111 + + + 8 + 2111 + + + 1 + 2112 + + + 8 + 2112 + + + 1 + 2113 + + + 5 + 2113 + + + 8 + 2113 + + + 1 + 2114 + + + 5 + 2114 + + + 8 + 2114 + + + 1 + 2115 + + + 5 + 2115 + + + 8 + 2115 + + + 1 + 2116 + + + 5 + 2116 + + + 8 + 2116 + + + 1 + 2117 + + + 5 + 2117 + + + 8 + 2117 + + + 1 + 2118 + + + 5 + 2118 + + + 8 + 2118 + + + 1 + 2119 + + + 5 + 2119 + + + 8 + 2119 + + + 1 + 2120 + + + 5 + 2120 + + + 8 + 2120 + + + 1 + 2121 + + + 5 + 2121 + + + 8 + 2121 + + + 1 + 2122 + + + 5 + 2122 + + + 8 + 2122 + + + 1 + 2123 + + + 5 + 2123 + + + 8 + 2123 + + + 1 + 2124 + + + 5 + 2124 + + + 8 + 2124 + + + 1 + 2125 + + + 5 + 2125 + + + 8 + 2125 + + + 1 + 2126 + + + 5 + 2126 + + + 8 + 2126 + + + 1 + 2127 + + + 5 + 2127 + + + 8 + 2127 + + + 1 + 2128 + + + 5 + 2128 + + + 8 + 2128 + + + 1 + 2129 + + + 5 + 2129 + + + 8 + 2129 + + + 1 + 2130 + + + 5 + 2130 + + + 8 + 2130 + + + 1 + 2131 + + + 5 + 2131 + + + 8 + 2131 + + + 1 + 2132 + + + 5 + 2132 + + + 8 + 2132 + + + 1 + 2133 + + + 5 + 2133 + + + 8 + 2133 + + + 1 + 2134 + + + 5 + 2134 + + + 8 + 2134 + + + 1 + 2135 + + + 5 + 2135 + + + 8 + 2135 + + + 1 + 2136 + + + 5 + 2136 + + + 8 + 2136 + + + 1 + 2137 + + + 5 + 2137 + + + 8 + 2137 + + + 1 + 2138 + + + 5 + 2138 + + + 8 + 2138 + + + 1 + 2139 + + + 8 + 2139 + + + 1 + 2140 + + + 8 + 2140 + + + 1 + 2141 + + + 8 + 2141 + + + 1 + 2142 + + + 8 + 2142 + + + 1 + 2143 + + + 8 + 2143 + + + 1 + 2144 + + + 8 + 2144 + + + 1 + 2145 + + + 8 + 2145 + + + 1 + 2146 + + + 8 + 2146 + + + 1 + 2147 + + + 8 + 2147 + + + 1 + 2148 + + + 8 + 2148 + + + 1 + 2149 + + + 5 + 2149 + + + 8 + 2149 + + + 1 + 2150 + + + 5 + 2150 + + + 8 + 2150 + + + 1 + 2151 + + + 5 + 2151 + + + 8 + 2151 + + + 1 + 2152 + + + 5 + 2152 + + + 8 + 2152 + + + 1 + 2153 + + + 5 + 2153 + + + 8 + 2153 + + + 1 + 2154 + + + 5 + 2154 + + + 8 + 2154 + + + 1 + 2155 + + + 5 + 2155 + + + 8 + 2155 + + + 1 + 2156 + + + 5 + 2156 + + + 8 + 2156 + + + 1 + 2157 + + + 5 + 2157 + + + 8 + 2157 + + + 1 + 2158 + + + 5 + 2158 + + + 8 + 2158 + + + 1 + 2159 + + + 5 + 2159 + + + 8 + 2159 + + + 1 + 2160 + + + 5 + 2160 + + + 8 + 2160 + + + 1 + 2161 + + + 5 + 2161 + + + 8 + 2161 + + + 1 + 2162 + + + 5 + 2162 + + + 8 + 2162 + + + 1 + 2163 + + + 5 + 2163 + + + 8 + 2163 + + + 1 + 2164 + + + 5 + 2164 + + + 8 + 2164 + + + 1 + 2165 + + + 8 + 2165 + + + 1 + 2166 + + + 8 + 2166 + + + 1 + 2167 + + + 8 + 2167 + + + 1 + 2168 + + + 8 + 2168 + + + 1 + 2169 + + + 8 + 2169 + + + 1 + 2170 + + + 8 + 2170 + + + 1 + 2171 + + + 8 + 2171 + + + 1 + 2172 + + + 8 + 2172 + + + 1 + 2173 + + + 8 + 2173 + + + 1 + 2174 + + + 8 + 2174 + + + 1 + 2175 + + + 8 + 2175 + + + 1 + 2176 + + + 8 + 2176 + + + 1 + 2177 + + + 8 + 2177 + + + 1 + 2178 + + + 8 + 2178 + + + 1 + 2179 + + + 8 + 2179 + + + 1 + 2180 + + + 8 + 2180 + + + 1 + 2181 + + + 8 + 2181 + + + 1 + 2182 + + + 8 + 2182 + + + 1 + 2183 + + + 8 + 2183 + + + 1 + 2184 + + + 8 + 2184 + + + 1 + 2185 + + + 8 + 2185 + + + 1 + 2186 + + + 8 + 2186 + + + 1 + 2187 + + + 8 + 2187 + + + 1 + 2188 + + + 8 + 2188 + + + 1 + 2189 + + + 8 + 2189 + + + 1 + 2190 + + + 8 + 2190 + + + 1 + 2191 + + + 8 + 2191 + + + 1 + 2192 + + + 8 + 2192 + + + 1 + 2193 + + + 5 + 2193 + + + 8 + 2193 + + + 1 + 2194 + + + 5 + 2194 + + + 8 + 2194 + + + 16 + 2194 + + + 1 + 2195 + + + 5 + 2195 + + + 8 + 2195 + + + 16 + 2195 + + + 1 + 2196 + + + 5 + 2196 + + + 8 + 2196 + + + 1 + 2197 + + + 5 + 2197 + + + 8 + 2197 + + + 1 + 2198 + + + 5 + 2198 + + + 8 + 2198 + + + 16 + 2198 + + + 1 + 2199 + + + 5 + 2199 + + + 8 + 2199 + + + 1 + 2200 + + + 5 + 2200 + + + 8 + 2200 + + + 1 + 2201 + + + 5 + 2201 + + + 8 + 2201 + + + 1 + 2202 + + + 5 + 2202 + + + 8 + 2202 + + + 1 + 2203 + + + 5 + 2203 + + + 8 + 2203 + + + 1 + 2204 + + + 5 + 2204 + + + 8 + 2204 + + + 1 + 2205 + + + 5 + 2205 + + + 8 + 2205 + + + 1 + 2206 + + + 5 + 2206 + + + 8 + 2206 + + + 16 + 2206 + + + 1 + 2207 + + + 5 + 2207 + + + 8 + 2207 + + + 1 + 2208 + + + 5 + 2208 + + + 8 + 2208 + + + 1 + 2209 + + + 5 + 2209 + + + 8 + 2209 + + + 1 + 2210 + + + 5 + 2210 + + + 8 + 2210 + + + 1 + 2211 + + + 5 + 2211 + + + 8 + 2211 + + + 1 + 2212 + + + 5 + 2212 + + + 8 + 2212 + + + 1 + 2213 + + + 5 + 2213 + + + 8 + 2213 + + + 1 + 2214 + + + 5 + 2214 + + + 8 + 2214 + + + 1 + 2215 + + + 5 + 2215 + + + 8 + 2215 + + + 1 + 2216 + + + 8 + 2216 + + + 1 + 2217 + + + 8 + 2217 + + + 1 + 2218 + + + 8 + 2218 + + + 1 + 2219 + + + 8 + 2219 + + + 1 + 2220 + + + 8 + 2220 + + + 1 + 2221 + + + 8 + 2221 + + + 1 + 2222 + + + 8 + 2222 + + + 1 + 2223 + + + 8 + 2223 + + + 1 + 2224 + + + 8 + 2224 + + + 1 + 2225 + + + 8 + 2225 + + + 1 + 2226 + + + 8 + 2226 + + + 1 + 2227 + + + 8 + 2227 + + + 1 + 2228 + + + 8 + 2228 + + + 1 + 2229 + + + 8 + 2229 + + + 1 + 2230 + + + 8 + 2230 + + + 1 + 2231 + + + 8 + 2231 + + + 1 + 2232 + + + 8 + 2232 + + + 1 + 2233 + + + 8 + 2233 + + + 1 + 2234 + + + 8 + 2234 + + + 1 + 2235 + + + 8 + 2235 + + + 1 + 2236 + + + 8 + 2236 + + + 1 + 2237 + + + 8 + 2237 + + + 1 + 2238 + + + 5 + 2238 + + + 8 + 2238 + + + 1 + 2239 + + + 5 + 2239 + + + 8 + 2239 + + + 1 + 2240 + + + 5 + 2240 + + + 8 + 2240 + + + 1 + 2241 + + + 5 + 2241 + + + 8 + 2241 + + + 1 + 2242 + + + 5 + 2242 + + + 8 + 2242 + + + 1 + 2243 + + + 5 + 2243 + + + 8 + 2243 + + + 1 + 2244 + + + 5 + 2244 + + + 8 + 2244 + + + 1 + 2245 + + + 5 + 2245 + + + 8 + 2245 + + + 1 + 2246 + + + 5 + 2246 + + + 8 + 2246 + + + 1 + 2247 + + + 5 + 2247 + + + 8 + 2247 + + + 1 + 2248 + + + 5 + 2248 + + + 8 + 2248 + + + 1 + 2249 + + + 5 + 2249 + + + 8 + 2249 + + + 1 + 2250 + + + 5 + 2250 + + + 8 + 2250 + + + 1 + 2251 + + + 5 + 2251 + + + 8 + 2251 + + + 1 + 2252 + + + 5 + 2252 + + + 8 + 2252 + + + 1 + 2253 + + + 5 + 2253 + + + 8 + 2253 + + + 1 + 2254 + + + 8 + 2254 + + + 1 + 2255 + + + 8 + 2255 + + + 1 + 2256 + + + 8 + 2256 + + + 1 + 2257 + + + 8 + 2257 + + + 1 + 2258 + + + 8 + 2258 + + + 1 + 2259 + + + 8 + 2259 + + + 1 + 2260 + + + 8 + 2260 + + + 1 + 2261 + + + 8 + 2261 + + + 1 + 2262 + + + 8 + 2262 + + + 1 + 2263 + + + 8 + 2263 + + + 1 + 2264 + + + 8 + 2264 + + + 1 + 2265 + + + 8 + 2265 + + + 1 + 2266 + + + 8 + 2266 + + + 1 + 2267 + + + 8 + 2267 + + + 1 + 2268 + + + 8 + 2268 + + + 1 + 2269 + + + 8 + 2269 + + + 1 + 2270 + + + 8 + 2270 + + + 1 + 2271 + + + 8 + 2271 + + + 1 + 2272 + + + 8 + 2272 + + + 1 + 2273 + + + 8 + 2273 + + + 1 + 2274 + + + 8 + 2274 + + + 1 + 2275 + + + 8 + 2275 + + + 1 + 2276 + + + 8 + 2276 + + + 1 + 2277 + + + 8 + 2277 + + + 1 + 2278 + + + 8 + 2278 + + + 1 + 2279 + + + 8 + 2279 + + + 1 + 2280 + + + 8 + 2280 + + + 1 + 2281 + + + 8 + 2281 + + + 1 + 2282 + + + 5 + 2282 + + + 8 + 2282 + + + 1 + 2283 + + + 5 + 2283 + + + 8 + 2283 + + + 1 + 2284 + + + 5 + 2284 + + + 8 + 2284 + + + 1 + 2285 + + + 8 + 2285 + + + 1 + 2286 + + + 8 + 2286 + + + 1 + 2287 + + + 8 + 2287 + + + 1 + 2288 + + + 8 + 2288 + + + 1 + 2289 + + + 8 + 2289 + + + 1 + 2290 + + + 8 + 2290 + + + 1 + 2291 + + + 8 + 2291 + + + 1 + 2292 + + + 8 + 2292 + + + 1 + 2293 + + + 8 + 2293 + + + 1 + 2294 + + + 8 + 2294 + + + 1 + 2295 + + + 8 + 2295 + + + 1 + 2296 + + + 5 + 2296 + + + 8 + 2296 + + + 1 + 2297 + + + 5 + 2297 + + + 8 + 2297 + + + 1 + 2298 + + + 5 + 2298 + + + 8 + 2298 + + + 1 + 2299 + + + 5 + 2299 + + + 8 + 2299 + + + 1 + 2300 + + + 5 + 2300 + + + 8 + 2300 + + + 1 + 2301 + + + 5 + 2301 + + + 8 + 2301 + + + 1 + 2302 + + + 5 + 2302 + + + 8 + 2302 + + + 1 + 2303 + + + 5 + 2303 + + + 8 + 2303 + + + 1 + 2304 + + + 5 + 2304 + + + 8 + 2304 + + + 1 + 2305 + + + 5 + 2305 + + + 8 + 2305 + + + 1 + 2306 + + + 5 + 2306 + + + 8 + 2306 + + + 1 + 2307 + + + 5 + 2307 + + + 8 + 2307 + + + 1 + 2308 + + + 5 + 2308 + + + 8 + 2308 + + + 1 + 2309 + + + 5 + 2309 + + + 8 + 2309 + + + 1 + 2310 + + + 5 + 2310 + + + 8 + 2310 + + + 1 + 2311 + + + 5 + 2311 + + + 8 + 2311 + + + 1 + 2312 + + + 5 + 2312 + + + 8 + 2312 + + + 1 + 2313 + + + 5 + 2313 + + + 8 + 2313 + + + 1 + 2314 + + + 5 + 2314 + + + 8 + 2314 + + + 1 + 2315 + + + 5 + 2315 + + + 8 + 2315 + + + 1 + 2316 + + + 5 + 2316 + + + 8 + 2316 + + + 1 + 2317 + + + 5 + 2317 + + + 8 + 2317 + + + 1 + 2318 + + + 8 + 2318 + + + 1 + 2319 + + + 8 + 2319 + + + 1 + 2320 + + + 8 + 2320 + + + 1 + 2321 + + + 8 + 2321 + + + 1 + 2322 + + + 8 + 2322 + + + 1 + 2323 + + + 8 + 2323 + + + 1 + 2324 + + + 8 + 2324 + + + 1 + 2325 + + + 8 + 2325 + + + 1 + 2326 + + + 8 + 2326 + + + 1 + 2327 + + + 8 + 2327 + + + 1 + 2328 + + + 8 + 2328 + + + 1 + 2329 + + + 8 + 2329 + + + 1 + 2330 + + + 8 + 2330 + + + 1 + 2331 + + + 8 + 2331 + + + 1 + 2332 + + + 8 + 2332 + + + 1 + 2333 + + + 8 + 2333 + + + 1 + 2334 + + + 5 + 2334 + + + 8 + 2334 + + + 1 + 2335 + + + 5 + 2335 + + + 8 + 2335 + + + 1 + 2336 + + + 5 + 2336 + + + 8 + 2336 + + + 1 + 2337 + + + 5 + 2337 + + + 8 + 2337 + + + 1 + 2338 + + + 5 + 2338 + + + 8 + 2338 + + + 1 + 2339 + + + 5 + 2339 + + + 8 + 2339 + + + 1 + 2340 + + + 5 + 2340 + + + 8 + 2340 + + + 1 + 2341 + + + 5 + 2341 + + + 8 + 2341 + + + 1 + 2342 + + + 5 + 2342 + + + 8 + 2342 + + + 1 + 2343 + + + 5 + 2343 + + + 8 + 2343 + + + 1 + 2344 + + + 8 + 2344 + + + 1 + 2345 + + + 8 + 2345 + + + 1 + 2346 + + + 8 + 2346 + + + 1 + 2347 + + + 8 + 2347 + + + 1 + 2348 + + + 8 + 2348 + + + 1 + 2349 + + + 8 + 2349 + + + 1 + 2350 + + + 8 + 2350 + + + 1 + 2351 + + + 8 + 2351 + + + 1 + 2352 + + + 8 + 2352 + + + 1 + 2353 + + + 8 + 2353 + + + 1 + 2354 + + + 8 + 2354 + + + 1 + 2355 + + + 8 + 2355 + + + 1 + 2356 + + + 8 + 2356 + + + 1 + 2357 + + + 8 + 2357 + + + 1 + 2358 + + + 5 + 2358 + + + 8 + 2358 + + + 1 + 2359 + + + 5 + 2359 + + + 8 + 2359 + + + 1 + 2360 + + + 5 + 2360 + + + 8 + 2360 + + + 1 + 2361 + + + 5 + 2361 + + + 8 + 2361 + + + 1 + 2362 + + + 5 + 2362 + + + 8 + 2362 + + + 1 + 2363 + + + 5 + 2363 + + + 8 + 2363 + + + 1 + 2364 + + + 5 + 2364 + + + 8 + 2364 + + + 1 + 2365 + + + 5 + 2365 + + + 8 + 2365 + + + 1 + 2366 + + + 5 + 2366 + + + 8 + 2366 + + + 1 + 2367 + + + 5 + 2367 + + + 8 + 2367 + + + 1 + 2368 + + + 5 + 2368 + + + 8 + 2368 + + + 1 + 2369 + + + 5 + 2369 + + + 8 + 2369 + + + 1 + 2370 + + + 5 + 2370 + + + 8 + 2370 + + + 1 + 2371 + + + 5 + 2371 + + + 8 + 2371 + + + 1 + 2372 + + + 5 + 2372 + + + 8 + 2372 + + + 1 + 2373 + + + 5 + 2373 + + + 8 + 2373 + + + 1 + 2374 + + + 5 + 2374 + + + 8 + 2374 + + + 1 + 2375 + + + 8 + 2375 + + + 1 + 2376 + + + 8 + 2376 + + + 1 + 2377 + + + 8 + 2377 + + + 1 + 2378 + + + 8 + 2378 + + + 1 + 2379 + + + 8 + 2379 + + + 1 + 2380 + + + 8 + 2380 + + + 1 + 2381 + + + 8 + 2381 + + + 1 + 2382 + + + 8 + 2382 + + + 1 + 2383 + + + 8 + 2383 + + + 1 + 2384 + + + 8 + 2384 + + + 1 + 2385 + + + 8 + 2385 + + + 1 + 2386 + + + 8 + 2386 + + + 1 + 2387 + + + 8 + 2387 + + + 1 + 2388 + + + 8 + 2388 + + + 1 + 2389 + + + 8 + 2389 + + + 1 + 2390 + + + 8 + 2390 + + + 1 + 2391 + + + 5 + 2391 + + + 8 + 2391 + + + 1 + 2392 + + + 5 + 2392 + + + 8 + 2392 + + + 1 + 2393 + + + 5 + 2393 + + + 8 + 2393 + + + 1 + 2394 + + + 5 + 2394 + + + 8 + 2394 + + + 1 + 2395 + + + 5 + 2395 + + + 8 + 2395 + + + 1 + 2396 + + + 5 + 2396 + + + 8 + 2396 + + + 1 + 2397 + + + 5 + 2397 + + + 8 + 2397 + + + 1 + 2398 + + + 5 + 2398 + + + 8 + 2398 + + + 1 + 2399 + + + 5 + 2399 + + + 8 + 2399 + + + 1 + 2400 + + + 5 + 2400 + + + 8 + 2400 + + + 1 + 2401 + + + 5 + 2401 + + + 8 + 2401 + + + 1 + 2402 + + + 5 + 2402 + + + 8 + 2402 + + + 1 + 2403 + + + 5 + 2403 + + + 8 + 2403 + + + 1 + 2404 + + + 5 + 2404 + + + 8 + 2404 + + + 1 + 2405 + + + 5 + 2405 + + + 8 + 2405 + + + 1 + 2406 + + + 5 + 2406 + + + 8 + 2406 + + + 1 + 2407 + + + 5 + 2407 + + + 8 + 2407 + + + 1 + 2408 + + + 5 + 2408 + + + 8 + 2408 + + + 1 + 2409 + + + 5 + 2409 + + + 8 + 2409 + + + 1 + 2410 + + + 5 + 2410 + + + 8 + 2410 + + + 1 + 2411 + + + 5 + 2411 + + + 8 + 2411 + + + 1 + 2412 + + + 5 + 2412 + + + 8 + 2412 + + + 1 + 2413 + + + 5 + 2413 + + + 8 + 2413 + + + 1 + 2414 + + + 5 + 2414 + + + 8 + 2414 + + + 1 + 2415 + + + 5 + 2415 + + + 8 + 2415 + + + 1 + 2416 + + + 5 + 2416 + + + 8 + 2416 + + + 1 + 2417 + + + 5 + 2417 + + + 8 + 2417 + + + 1 + 2418 + + + 5 + 2418 + + + 8 + 2418 + + + 1 + 2419 + + + 5 + 2419 + + + 8 + 2419 + + + 1 + 2420 + + + 5 + 2420 + + + 8 + 2420 + + + 1 + 2421 + + + 5 + 2421 + + + 8 + 2421 + + + 1 + 2422 + + + 5 + 2422 + + + 8 + 2422 + + + 1 + 2423 + + + 5 + 2423 + + + 8 + 2423 + + + 1 + 2424 + + + 5 + 2424 + + + 8 + 2424 + + + 1 + 2425 + + + 5 + 2425 + + + 8 + 2425 + + + 1 + 2426 + + + 5 + 2426 + + + 8 + 2426 + + + 1 + 2427 + + + 5 + 2427 + + + 8 + 2427 + + + 1 + 2428 + + + 8 + 2428 + + + 1 + 2429 + + + 8 + 2429 + + + 1 + 2430 + + + 8 + 2430 + + + 1 + 2431 + + + 8 + 2431 + + + 1 + 2432 + + + 8 + 2432 + + + 1 + 2433 + + + 8 + 2433 + + + 1 + 2434 + + + 5 + 2434 + + + 8 + 2434 + + + 1 + 2435 + + + 5 + 2435 + + + 8 + 2435 + + + 1 + 2436 + + + 5 + 2436 + + + 8 + 2436 + + + 1 + 2437 + + + 5 + 2437 + + + 8 + 2437 + + + 1 + 2438 + + + 5 + 2438 + + + 8 + 2438 + + + 1 + 2439 + + + 5 + 2439 + + + 8 + 2439 + + + 1 + 2440 + + + 5 + 2440 + + + 8 + 2440 + + + 1 + 2441 + + + 5 + 2441 + + + 8 + 2441 + + + 1 + 2442 + + + 5 + 2442 + + + 8 + 2442 + + + 1 + 2443 + + + 5 + 2443 + + + 8 + 2443 + + + 1 + 2444 + + + 5 + 2444 + + + 8 + 2444 + + + 1 + 2445 + + + 5 + 2445 + + + 8 + 2445 + + + 1 + 2446 + + + 5 + 2446 + + + 8 + 2446 + + + 1 + 2447 + + + 5 + 2447 + + + 8 + 2447 + + + 1 + 2448 + + + 5 + 2448 + + + 8 + 2448 + + + 1 + 2449 + + + 8 + 2449 + + + 1 + 2450 + + + 8 + 2450 + + + 1 + 2451 + + + 8 + 2451 + + + 1 + 2452 + + + 8 + 2452 + + + 1 + 2453 + + + 8 + 2453 + + + 1 + 2454 + + + 8 + 2454 + + + 1 + 2455 + + + 8 + 2455 + + + 1 + 2456 + + + 8 + 2456 + + + 1 + 2457 + + + 8 + 2457 + + + 1 + 2458 + + + 8 + 2458 + + + 1 + 2459 + + + 8 + 2459 + + + 1 + 2460 + + + 8 + 2460 + + + 1 + 2461 + + + 5 + 2461 + + + 8 + 2461 + + + 1 + 2462 + + + 5 + 2462 + + + 8 + 2462 + + + 1 + 2463 + + + 5 + 2463 + + + 8 + 2463 + + + 1 + 2464 + + + 5 + 2464 + + + 8 + 2464 + + + 1 + 2465 + + + 5 + 2465 + + + 8 + 2465 + + + 1 + 2466 + + + 5 + 2466 + + + 8 + 2466 + + + 1 + 2467 + + + 5 + 2467 + + + 8 + 2467 + + + 1 + 2468 + + + 5 + 2468 + + + 8 + 2468 + + + 1 + 2469 + + + 5 + 2469 + + + 8 + 2469 + + + 1 + 2470 + + + 5 + 2470 + + + 8 + 2470 + + + 1 + 2471 + + + 5 + 2471 + + + 8 + 2471 + + + 1 + 2472 + + + 8 + 2472 + + + 1 + 2473 + + + 8 + 2473 + + + 1 + 2474 + + + 8 + 2474 + + + 1 + 2475 + + + 8 + 2475 + + + 1 + 2476 + + + 5 + 2476 + + + 8 + 2476 + + + 1 + 2477 + + + 8 + 2477 + + + 1 + 2478 + + + 5 + 2478 + + + 8 + 2478 + + + 1 + 2479 + + + 8 + 2479 + + + 1 + 2480 + + + 8 + 2480 + + + 1 + 2481 + + + 8 + 2481 + + + 1 + 2482 + + + 8 + 2482 + + + 1 + 2483 + + + 8 + 2483 + + + 1 + 2484 + + + 5 + 2484 + + + 8 + 2484 + + + 1 + 2485 + + + 8 + 2485 + + + 1 + 2486 + + + 8 + 2486 + + + 1 + 2487 + + + 8 + 2487 + + + 1 + 2488 + + + 5 + 2488 + + + 8 + 2488 + + + 1 + 2489 + + + 5 + 2489 + + + 8 + 2489 + + + 1 + 2490 + + + 5 + 2490 + + + 8 + 2490 + + + 1 + 2491 + + + 5 + 2491 + + + 8 + 2491 + + + 1 + 2492 + + + 5 + 2492 + + + 8 + 2492 + + + 1 + 2493 + + + 5 + 2493 + + + 8 + 2493 + + + 1 + 2494 + + + 5 + 2494 + + + 8 + 2494 + + + 1 + 2495 + + + 5 + 2495 + + + 8 + 2495 + + + 1 + 2496 + + + 5 + 2496 + + + 8 + 2496 + + + 1 + 2497 + + + 5 + 2497 + + + 8 + 2497 + + + 1 + 2498 + + + 5 + 2498 + + + 8 + 2498 + + + 1 + 2499 + + + 5 + 2499 + + + 8 + 2499 + + + 1 + 2500 + + + 5 + 2500 + + + 8 + 2500 + + + 1 + 2501 + + + 5 + 2501 + + + 8 + 2501 + + + 1 + 2502 + + + 8 + 2502 + + + 1 + 2503 + + + 8 + 2503 + + + 1 + 2504 + + + 8 + 2504 + + + 1 + 2505 + + + 8 + 2505 + + + 1 + 2506 + + + 5 + 2506 + + + 8 + 2506 + + + 1 + 2507 + + + 8 + 2507 + + + 1 + 2508 + + + 8 + 2508 + + + 1 + 2509 + + + 8 + 2509 + + + 1 + 2510 + + + 8 + 2510 + + + 1 + 2511 + + + 5 + 2511 + + + 8 + 2511 + + + 1 + 2512 + + + 5 + 2512 + + + 8 + 2512 + + + 16 + 2512 + + + 1 + 2513 + + + 5 + 2513 + + + 8 + 2513 + + + 1 + 2514 + + + 5 + 2514 + + + 8 + 2514 + + + 1 + 2515 + + + 5 + 2515 + + + 8 + 2515 + + + 1 + 2516 + + + 5 + 2516 + + + 8 + 2516 + + + 16 + 2516 + + + 1 + 2517 + + + 5 + 2517 + + + 8 + 2517 + + + 1 + 2518 + + + 5 + 2518 + + + 8 + 2518 + + + 1 + 2519 + + + 5 + 2519 + + + 8 + 2519 + + + 1 + 2520 + + + 5 + 2520 + + + 8 + 2520 + + + 1 + 2521 + + + 5 + 2521 + + + 8 + 2521 + + + 1 + 2522 + + + 5 + 2522 + + + 8 + 2522 + + + 1 + 2523 + + + 8 + 2523 + + + 1 + 2524 + + + 8 + 2524 + + + 1 + 2525 + + + 8 + 2525 + + + 1 + 2526 + + + 8 + 2526 + + + 1 + 2527 + + + 8 + 2527 + + + 1 + 2528 + + + 8 + 2528 + + + 1 + 2529 + + + 8 + 2529 + + + 1 + 2530 + + + 8 + 2530 + + + 1 + 2531 + + + 8 + 2531 + + + 1 + 2532 + + + 8 + 2532 + + + 1 + 2533 + + + 8 + 2533 + + + 1 + 2534 + + + 8 + 2534 + + + 1 + 2535 + + + 8 + 2535 + + + 1 + 2536 + + + 8 + 2536 + + + 1 + 2537 + + + 8 + 2537 + + + 1 + 2538 + + + 8 + 2538 + + + 1 + 2539 + + + 8 + 2539 + + + 1 + 2540 + + + 8 + 2540 + + + 1 + 2541 + + + 8 + 2541 + + + 1 + 2542 + + + 5 + 2542 + + + 8 + 2542 + + + 1 + 2543 + + + 5 + 2543 + + + 8 + 2543 + + + 1 + 2544 + + + 5 + 2544 + + + 8 + 2544 + + + 1 + 2545 + + + 5 + 2545 + + + 8 + 2545 + + + 1 + 2546 + + + 5 + 2546 + + + 8 + 2546 + + + 1 + 2547 + + + 5 + 2547 + + + 8 + 2547 + + + 1 + 2548 + + + 5 + 2548 + + + 8 + 2548 + + + 1 + 2549 + + + 5 + 2549 + + + 8 + 2549 + + + 1 + 2550 + + + 5 + 2550 + + + 8 + 2550 + + + 16 + 2550 + + + 1 + 2551 + + + 5 + 2551 + + + 8 + 2551 + + + 1 + 2552 + + + 5 + 2552 + + + 8 + 2552 + + + 1 + 2553 + + + 5 + 2553 + + + 8 + 2553 + + + 1 + 2554 + + + 8 + 2554 + + + 1 + 2555 + + + 8 + 2555 + + + 1 + 2556 + + + 8 + 2556 + + + 1 + 2557 + + + 8 + 2557 + + + 1 + 2558 + + + 8 + 2558 + + + 1 + 2559 + + + 8 + 2559 + + + 1 + 2560 + + + 8 + 2560 + + + 1 + 2561 + + + 8 + 2561 + + + 1 + 2562 + + + 8 + 2562 + + + 1 + 2563 + + + 8 + 2563 + + + 1 + 2564 + + + 8 + 2564 + + + 1 + 2565 + + + 5 + 2565 + + + 8 + 2565 + + + 1 + 2566 + + + 5 + 2566 + + + 8 + 2566 + + + 1 + 2567 + + + 5 + 2567 + + + 8 + 2567 + + + 1 + 2568 + + + 5 + 2568 + + + 8 + 2568 + + + 1 + 2569 + + + 5 + 2569 + + + 8 + 2569 + + + 1 + 2570 + + + 5 + 2570 + + + 8 + 2570 + + + 1 + 2571 + + + 5 + 2571 + + + 8 + 2571 + + + 1 + 2572 + + + 8 + 2572 + + + 1 + 2573 + + + 8 + 2573 + + + 1 + 2574 + + + 8 + 2574 + + + 1 + 2575 + + + 8 + 2575 + + + 1 + 2576 + + + 8 + 2576 + + + 1 + 2577 + + + 8 + 2577 + + + 1 + 2578 + + + 8 + 2578 + + + 1 + 2579 + + + 8 + 2579 + + + 1 + 2580 + + + 8 + 2580 + + + 1 + 2581 + + + 8 + 2581 + + + 1 + 2582 + + + 8 + 2582 + + + 1 + 2583 + + + 8 + 2583 + + + 1 + 2584 + + + 8 + 2584 + + + 1 + 2585 + + + 8 + 2585 + + + 1 + 2586 + + + 8 + 2586 + + + 1 + 2587 + + + 8 + 2587 + + + 1 + 2588 + + + 8 + 2588 + + + 1 + 2589 + + + 8 + 2589 + + + 1 + 2590 + + + 8 + 2590 + + + 1 + 2591 + + + 5 + 2591 + + + 8 + 2591 + + + 1 + 2592 + + + 5 + 2592 + + + 8 + 2592 + + + 1 + 2593 + + + 5 + 2593 + + + 8 + 2593 + + + 1 + 2594 + + + 5 + 2594 + + + 8 + 2594 + + + 1 + 2595 + + + 5 + 2595 + + + 8 + 2595 + + + 1 + 2596 + + + 5 + 2596 + + + 8 + 2596 + + + 1 + 2597 + + + 5 + 2597 + + + 8 + 2597 + + + 1 + 2598 + + + 5 + 2598 + + + 8 + 2598 + + + 1 + 2599 + + + 5 + 2599 + + + 8 + 2599 + + + 1 + 2600 + + + 5 + 2600 + + + 8 + 2600 + + + 1 + 2601 + + + 5 + 2601 + + + 8 + 2601 + + + 1 + 2602 + + + 5 + 2602 + + + 8 + 2602 + + + 1 + 2603 + + + 5 + 2603 + + + 8 + 2603 + + + 1 + 2604 + + + 5 + 2604 + + + 8 + 2604 + + + 1 + 2605 + + + 5 + 2605 + + + 8 + 2605 + + + 1 + 2606 + + + 5 + 2606 + + + 8 + 2606 + + + 1 + 2607 + + + 5 + 2607 + + + 8 + 2607 + + + 1 + 2608 + + + 5 + 2608 + + + 8 + 2608 + + + 1 + 2609 + + + 8 + 2609 + + + 1 + 2610 + + + 8 + 2610 + + + 1 + 2611 + + + 8 + 2611 + + + 1 + 2612 + + + 8 + 2612 + + + 1 + 2613 + + + 8 + 2613 + + + 1 + 2614 + + + 8 + 2614 + + + 1 + 2615 + + + 8 + 2615 + + + 1 + 2616 + + + 8 + 2616 + + + 1 + 2617 + + + 8 + 2617 + + + 1 + 2618 + + + 8 + 2618 + + + 1 + 2619 + + + 8 + 2619 + + + 1 + 2620 + + + 8 + 2620 + + + 1 + 2621 + + + 8 + 2621 + + + 1 + 2622 + + + 8 + 2622 + + + 1 + 2623 + + + 8 + 2623 + + + 1 + 2624 + + + 8 + 2624 + + + 1 + 2625 + + + 5 + 2625 + + + 8 + 2625 + + + 1 + 2626 + + + 8 + 2626 + + + 1 + 2627 + + + 5 + 2627 + + + 8 + 2627 + + + 1 + 2628 + + + 8 + 2628 + + + 1 + 2629 + + + 8 + 2629 + + + 1 + 2630 + + + 8 + 2630 + + + 1 + 2631 + + + 5 + 2631 + + + 8 + 2631 + + + 1 + 2632 + + + 8 + 2632 + + + 1 + 2633 + + + 8 + 2633 + + + 1 + 2634 + + + 8 + 2634 + + + 1 + 2635 + + + 8 + 2635 + + + 1 + 2636 + + + 8 + 2636 + + + 1 + 2637 + + + 8 + 2637 + + + 1 + 2638 + + + 5 + 2638 + + + 8 + 2638 + + + 1 + 2639 + + + 8 + 2639 + + + 1 + 2640 + + + 8 + 2640 + + + 1 + 2641 + + + 8 + 2641 + + + 1 + 2642 + + + 8 + 2642 + + + 1 + 2643 + + + 8 + 2643 + + + 1 + 2644 + + + 8 + 2644 + + + 1 + 2645 + + + 8 + 2645 + + + 1 + 2646 + + + 8 + 2646 + + + 1 + 2647 + + + 8 + 2647 + + + 1 + 2648 + + + 8 + 2648 + + + 1 + 2649 + + + 8 + 2649 + + + 1 + 2650 + + + 5 + 2650 + + + 8 + 2650 + + + 1 + 2651 + + + 5 + 2651 + + + 8 + 2651 + + + 1 + 2652 + + + 5 + 2652 + + + 8 + 2652 + + + 1 + 2653 + + + 5 + 2653 + + + 8 + 2653 + + + 1 + 2654 + + + 5 + 2654 + + + 8 + 2654 + + + 1 + 2655 + + + 5 + 2655 + + + 8 + 2655 + + + 1 + 2656 + + + 5 + 2656 + + + 8 + 2656 + + + 1 + 2657 + + + 5 + 2657 + + + 8 + 2657 + + + 1 + 2658 + + + 5 + 2658 + + + 8 + 2658 + + + 1 + 2659 + + + 5 + 2659 + + + 8 + 2659 + + + 1 + 2660 + + + 5 + 2660 + + + 8 + 2660 + + + 1 + 2661 + + + 5 + 2661 + + + 8 + 2661 + + + 1 + 2662 + + + 5 + 2662 + + + 8 + 2662 + + + 1 + 2663 + + + 5 + 2663 + + + 8 + 2663 + + + 1 + 2664 + + + 8 + 2664 + + + 1 + 2665 + + + 8 + 2665 + + + 1 + 2666 + + + 8 + 2666 + + + 1 + 2667 + + + 8 + 2667 + + + 1 + 2668 + + + 8 + 2668 + + + 1 + 2669 + + + 8 + 2669 + + + 1 + 2670 + + + 8 + 2670 + + + 1 + 2671 + + + 8 + 2671 + + + 1 + 2672 + + + 8 + 2672 + + + 1 + 2673 + + + 8 + 2673 + + + 1 + 2674 + + + 8 + 2674 + + + 1 + 2675 + + + 8 + 2675 + + + 1 + 2676 + + + 5 + 2676 + + + 8 + 2676 + + + 1 + 2677 + + + 5 + 2677 + + + 8 + 2677 + + + 1 + 2678 + + + 5 + 2678 + + + 8 + 2678 + + + 1 + 2679 + + + 5 + 2679 + + + 8 + 2679 + + + 1 + 2680 + + + 5 + 2680 + + + 8 + 2680 + + + 1 + 2681 + + + 5 + 2681 + + + 8 + 2681 + + + 1 + 2682 + + + 5 + 2682 + + + 8 + 2682 + + + 1 + 2683 + + + 5 + 2683 + + + 8 + 2683 + + + 1 + 2684 + + + 5 + 2684 + + + 8 + 2684 + + + 1 + 2685 + + + 5 + 2685 + + + 8 + 2685 + + + 1 + 2686 + + + 5 + 2686 + + + 8 + 2686 + + + 1 + 2687 + + + 5 + 2687 + + + 8 + 2687 + + + 1 + 2688 + + + 5 + 2688 + + + 8 + 2688 + + + 1 + 2689 + + + 5 + 2689 + + + 8 + 2689 + + + 1 + 2690 + + + 5 + 2690 + + + 8 + 2690 + + + 1 + 2691 + + + 5 + 2691 + + + 8 + 2691 + + + 1 + 2692 + + + 5 + 2692 + + + 8 + 2692 + + + 1 + 2693 + + + 5 + 2693 + + + 8 + 2693 + + + 1 + 2694 + + + 5 + 2694 + + + 8 + 2694 + + + 1 + 2695 + + + 5 + 2695 + + + 8 + 2695 + + + 1 + 2696 + + + 5 + 2696 + + + 8 + 2696 + + + 1 + 2697 + + + 5 + 2697 + + + 8 + 2697 + + + 1 + 2698 + + + 5 + 2698 + + + 8 + 2698 + + + 1 + 2699 + + + 5 + 2699 + + + 8 + 2699 + + + 1 + 2700 + + + 5 + 2700 + + + 8 + 2700 + + + 1 + 2701 + + + 5 + 2701 + + + 8 + 2701 + + + 1 + 2702 + + + 5 + 2702 + + + 8 + 2702 + + + 1 + 2703 + + + 5 + 2703 + + + 8 + 2703 + + + 1 + 2704 + + + 5 + 2704 + + + 8 + 2704 + + + 1 + 2705 + + + 8 + 2705 + + + 1 + 2706 + + + 5 + 2706 + + + 8 + 2706 + + + 1 + 2707 + + + 5 + 2707 + + + 8 + 2707 + + + 1 + 2708 + + + 5 + 2708 + + + 8 + 2708 + + + 1 + 2709 + + + 5 + 2709 + + + 8 + 2709 + + + 1 + 2710 + + + 5 + 2710 + + + 8 + 2710 + + + 1 + 2711 + + + 5 + 2711 + + + 8 + 2711 + + + 1 + 2712 + + + 5 + 2712 + + + 8 + 2712 + + + 1 + 2713 + + + 5 + 2713 + + + 8 + 2713 + + + 1 + 2714 + + + 5 + 2714 + + + 8 + 2714 + + + 1 + 2715 + + + 5 + 2715 + + + 8 + 2715 + + + 1 + 2716 + + + 5 + 2716 + + + 8 + 2716 + + + 1 + 2717 + + + 5 + 2717 + + + 8 + 2717 + + + 1 + 2718 + + + 5 + 2718 + + + 8 + 2718 + + + 1 + 2719 + + + 8 + 2719 + + + 1 + 2720 + + + 5 + 2720 + + + 8 + 2720 + + + 1 + 2721 + + + 5 + 2721 + + + 8 + 2721 + + + 1 + 2722 + + + 5 + 2722 + + + 8 + 2722 + + + 1 + 2723 + + + 5 + 2723 + + + 8 + 2723 + + + 1 + 2724 + + + 5 + 2724 + + + 8 + 2724 + + + 1 + 2725 + + + 5 + 2725 + + + 8 + 2725 + + + 1 + 2726 + + + 5 + 2726 + + + 8 + 2726 + + + 1 + 2727 + + + 5 + 2727 + + + 8 + 2727 + + + 1 + 2728 + + + 5 + 2728 + + + 8 + 2728 + + + 1 + 2729 + + + 5 + 2729 + + + 8 + 2729 + + + 1 + 2730 + + + 5 + 2730 + + + 8 + 2730 + + + 1 + 2731 + + + 8 + 2731 + + + 1 + 2732 + + + 8 + 2732 + + + 1 + 2733 + + + 8 + 2733 + + + 1 + 2734 + + + 8 + 2734 + + + 1 + 2735 + + + 8 + 2735 + + + 1 + 2736 + + + 8 + 2736 + + + 1 + 2737 + + + 8 + 2737 + + + 1 + 2738 + + + 8 + 2738 + + + 1 + 2739 + + + 8 + 2739 + + + 1 + 2740 + + + 8 + 2740 + + + 1 + 2741 + + + 8 + 2741 + + + 1 + 2742 + + + 8 + 2742 + + + 1 + 2743 + + + 8 + 2743 + + + 1 + 2744 + + + 8 + 2744 + + + 1 + 2745 + + + 8 + 2745 + + + 1 + 2746 + + + 8 + 2746 + + + 1 + 2747 + + + 8 + 2747 + + + 1 + 2748 + + + 8 + 2748 + + + 1 + 2749 + + + 8 + 2749 + + + 1 + 2750 + + + 8 + 2750 + + + 1 + 2751 + + + 8 + 2751 + + + 1 + 2752 + + + 8 + 2752 + + + 11 + 2752 + + + 1 + 2753 + + + 8 + 2753 + + + 11 + 2753 + + + 1 + 2754 + + + 8 + 2754 + + + 11 + 2754 + + + 1 + 2755 + + + 8 + 2755 + + + 1 + 2756 + + + 8 + 2756 + + + 1 + 2757 + + + 8 + 2757 + + + 1 + 2758 + + + 8 + 2758 + + + 11 + 2758 + + + 1 + 2759 + + + 8 + 2759 + + + 1 + 2760 + + + 8 + 2760 + + + 1 + 2761 + + + 8 + 2761 + + + 1 + 2762 + + + 8 + 2762 + + + 1 + 2763 + + + 8 + 2763 + + + 1 + 2764 + + + 8 + 2764 + + + 1 + 2765 + + + 8 + 2765 + + + 1 + 2766 + + + 8 + 2766 + + + 1 + 2767 + + + 8 + 2767 + + + 11 + 2767 + + + 1 + 2768 + + + 8 + 2768 + + + 11 + 2768 + + + 1 + 2769 + + + 8 + 2769 + + + 11 + 2769 + + + 1 + 2770 + + + 8 + 2770 + + + 1 + 2771 + + + 8 + 2771 + + + 1 + 2772 + + + 8 + 2772 + + + 1 + 2773 + + + 8 + 2773 + + + 1 + 2774 + + + 8 + 2774 + + + 1 + 2775 + + + 8 + 2775 + + + 1 + 2776 + + + 8 + 2776 + + + 1 + 2777 + + + 8 + 2777 + + + 1 + 2778 + + + 8 + 2778 + + + 1 + 2779 + + + 8 + 2779 + + + 1 + 2780 + + + 8 + 2780 + + + 1 + 2781 + + + 5 + 2781 + + + 8 + 2781 + + + 1 + 2782 + + + 5 + 2782 + + + 8 + 2782 + + + 1 + 2783 + + + 5 + 2783 + + + 8 + 2783 + + + 1 + 2784 + + + 5 + 2784 + + + 8 + 2784 + + + 1 + 2785 + + + 5 + 2785 + + + 8 + 2785 + + + 1 + 2786 + + + 5 + 2786 + + + 8 + 2786 + + + 1 + 2787 + + + 5 + 2787 + + + 8 + 2787 + + + 1 + 2788 + + + 5 + 2788 + + + 8 + 2788 + + + 1 + 2789 + + + 5 + 2789 + + + 8 + 2789 + + + 1 + 2790 + + + 5 + 2790 + + + 8 + 2790 + + + 1 + 2791 + + + 5 + 2791 + + + 8 + 2791 + + + 1 + 2792 + + + 5 + 2792 + + + 8 + 2792 + + + 1 + 2793 + + + 5 + 2793 + + + 8 + 2793 + + + 1 + 2794 + + + 5 + 2794 + + + 8 + 2794 + + + 1 + 2795 + + + 5 + 2795 + + + 8 + 2795 + + + 1 + 2796 + + + 5 + 2796 + + + 8 + 2796 + + + 1 + 2797 + + + 5 + 2797 + + + 8 + 2797 + + + 1 + 2798 + + + 5 + 2798 + + + 8 + 2798 + + + 1 + 2799 + + + 5 + 2799 + + + 8 + 2799 + + + 1 + 2800 + + + 5 + 2800 + + + 8 + 2800 + + + 1 + 2801 + + + 5 + 2801 + + + 8 + 2801 + + + 1 + 2802 + + + 5 + 2802 + + + 8 + 2802 + + + 1 + 2803 + + + 5 + 2803 + + + 8 + 2803 + + + 1 + 2804 + + + 5 + 2804 + + + 8 + 2804 + + + 1 + 2805 + + + 5 + 2805 + + + 8 + 2805 + + + 1 + 2806 + + + 5 + 2806 + + + 8 + 2806 + + + 1 + 2807 + + + 5 + 2807 + + + 8 + 2807 + + + 1 + 2808 + + + 5 + 2808 + + + 8 + 2808 + + + 1 + 2809 + + + 5 + 2809 + + + 8 + 2809 + + + 1 + 2810 + + + 5 + 2810 + + + 8 + 2810 + + + 1 + 2811 + + + 5 + 2811 + + + 8 + 2811 + + + 1 + 2812 + + + 5 + 2812 + + + 8 + 2812 + + + 1 + 2813 + + + 5 + 2813 + + + 8 + 2813 + + + 1 + 2814 + + + 5 + 2814 + + + 8 + 2814 + + + 1 + 2815 + + + 5 + 2815 + + + 8 + 2815 + + + 1 + 2816 + + + 5 + 2816 + + + 8 + 2816 + + + 1 + 2817 + + + 5 + 2817 + + + 8 + 2817 + + + 1 + 2818 + + + 5 + 2818 + + + 8 + 2818 + + + 3 + 2819 + + + 10 + 2819 + + + 3 + 2820 + + + 10 + 2820 + + + 3 + 2821 + + + 10 + 2821 + + + 3 + 2822 + + + 10 + 2822 + + + 3 + 2823 + + + 10 + 2823 + + + 3 + 2824 + + + 10 + 2824 + + + 3 + 2825 + + + 10 + 2825 + + + 3 + 2826 + + + 10 + 2826 + + + 3 + 2827 + + + 10 + 2827 + + + 3 + 2828 + + + 10 + 2828 + + + 3 + 2829 + + + 10 + 2829 + + + 3 + 2830 + + + 10 + 2830 + + + 3 + 2831 + + + 10 + 2831 + + + 3 + 2832 + + + 10 + 2832 + + + 3 + 2833 + + + 10 + 2833 + + + 3 + 2834 + + + 10 + 2834 + + + 3 + 2835 + + + 10 + 2835 + + + 3 + 2836 + + + 10 + 2836 + + + 3 + 2837 + + + 10 + 2837 + + + 3 + 2838 + + + 10 + 2838 + + + 3 + 2839 + + + 10 + 2839 + + + 3 + 2840 + + + 10 + 2840 + + + 3 + 2841 + + + 10 + 2841 + + + 3 + 2842 + + + 10 + 2842 + + + 3 + 2843 + + + 10 + 2843 + + + 3 + 2844 + + + 10 + 2844 + + + 3 + 2845 + + + 10 + 2845 + + + 3 + 2846 + + + 10 + 2846 + + + 3 + 2847 + + + 10 + 2847 + + + 3 + 2848 + + + 10 + 2848 + + + 3 + 2849 + + + 10 + 2849 + + + 3 + 2850 + + + 10 + 2850 + + + 3 + 2851 + + + 10 + 2851 + + + 3 + 2852 + + + 10 + 2852 + + + 3 + 2853 + + + 10 + 2853 + + + 3 + 2854 + + + 10 + 2854 + + + 3 + 2855 + + + 10 + 2855 + + + 3 + 2856 + + + 10 + 2856 + + + 3 + 2857 + + + 10 + 2857 + + + 3 + 2858 + + + 10 + 2858 + + + 3 + 2859 + + + 10 + 2859 + + + 3 + 2860 + + + 10 + 2860 + + + 3 + 2861 + + + 10 + 2861 + + + 3 + 2862 + + + 10 + 2862 + + + 3 + 2863 + + + 10 + 2863 + + + 3 + 2864 + + + 10 + 2864 + + + 3 + 2865 + + + 10 + 2865 + + + 3 + 2866 + + + 10 + 2866 + + + 3 + 2867 + + + 10 + 2867 + + + 3 + 2868 + + + 10 + 2868 + + + 3 + 2869 + + + 10 + 2869 + + + 3 + 2870 + + + 10 + 2870 + + + 3 + 2871 + + + 10 + 2871 + + + 3 + 2872 + + + 10 + 2872 + + + 3 + 2873 + + + 10 + 2873 + + + 3 + 2874 + + + 10 + 2874 + + + 3 + 2875 + + + 10 + 2875 + + + 3 + 2876 + + + 10 + 2876 + + + 3 + 2877 + + + 10 + 2877 + + + 3 + 2878 + + + 10 + 2878 + + + 3 + 2879 + + + 10 + 2879 + + + 3 + 2880 + + + 10 + 2880 + + + 3 + 2881 + + + 10 + 2881 + + + 3 + 2882 + + + 10 + 2882 + + + 3 + 2883 + + + 10 + 2883 + + + 3 + 2884 + + + 10 + 2884 + + + 3 + 2885 + + + 10 + 2885 + + + 3 + 2886 + + + 10 + 2886 + + + 3 + 2887 + + + 10 + 2887 + + + 3 + 2888 + + + 10 + 2888 + + + 3 + 2889 + + + 10 + 2889 + + + 3 + 2890 + + + 10 + 2890 + + + 3 + 2891 + + + 10 + 2891 + + + 3 + 2892 + + + 10 + 2892 + + + 3 + 2893 + + + 10 + 2893 + + + 3 + 2894 + + + 10 + 2894 + + + 3 + 2895 + + + 10 + 2895 + + + 3 + 2896 + + + 10 + 2896 + + + 3 + 2897 + + + 10 + 2897 + + + 3 + 2898 + + + 10 + 2898 + + + 3 + 2899 + + + 10 + 2899 + + + 3 + 2900 + + + 10 + 2900 + + + 3 + 2901 + + + 10 + 2901 + + + 3 + 2902 + + + 10 + 2902 + + + 3 + 2903 + + + 10 + 2903 + + + 3 + 2904 + + + 10 + 2904 + + + 3 + 2905 + + + 10 + 2905 + + + 3 + 2906 + + + 10 + 2906 + + + 3 + 2907 + + + 10 + 2907 + + + 3 + 2908 + + + 10 + 2908 + + + 3 + 2909 + + + 10 + 2909 + + + 3 + 2910 + + + 10 + 2910 + + + 3 + 2911 + + + 10 + 2911 + + + 3 + 2912 + + + 10 + 2912 + + + 3 + 2913 + + + 10 + 2913 + + + 3 + 2914 + + + 10 + 2914 + + + 3 + 2915 + + + 10 + 2915 + + + 3 + 2916 + + + 10 + 2916 + + + 3 + 2917 + + + 10 + 2917 + + + 3 + 2918 + + + 10 + 2918 + + + 3 + 2919 + + + 10 + 2919 + + + 3 + 2920 + + + 10 + 2920 + + + 3 + 2921 + + + 10 + 2921 + + + 3 + 2922 + + + 10 + 2922 + + + 3 + 2923 + + + 10 + 2923 + + + 3 + 2924 + + + 10 + 2924 + + + 3 + 2925 + + + 10 + 2925 + + + 1 + 2926 + + + 5 + 2926 + + + 8 + 2926 + + + 1 + 2927 + + + 5 + 2927 + + + 8 + 2927 + + + 1 + 2928 + + + 5 + 2928 + + + 8 + 2928 + + + 1 + 2929 + + + 5 + 2929 + + + 8 + 2929 + + + 1 + 2930 + + + 5 + 2930 + + + 8 + 2930 + + + 1 + 2931 + + + 5 + 2931 + + + 8 + 2931 + + + 1 + 2932 + + + 5 + 2932 + + + 8 + 2932 + + + 1 + 2933 + + + 5 + 2933 + + + 8 + 2933 + + + 1 + 2934 + + + 5 + 2934 + + + 8 + 2934 + + + 1 + 2935 + + + 5 + 2935 + + + 8 + 2935 + + + 1 + 2936 + + + 5 + 2936 + + + 8 + 2936 + + + 1 + 2937 + + + 5 + 2937 + + + 8 + 2937 + + + 1 + 2938 + + + 8 + 2938 + + + 1 + 2939 + + + 8 + 2939 + + + 1 + 2940 + + + 8 + 2940 + + + 1 + 2941 + + + 8 + 2941 + + + 1 + 2942 + + + 8 + 2942 + + + 1 + 2943 + + + 8 + 2943 + + + 1 + 2944 + + + 8 + 2944 + + + 1 + 2945 + + + 8 + 2945 + + + 1 + 2946 + + + 8 + 2946 + + + 1 + 2947 + + + 8 + 2947 + + + 1 + 2948 + + + 8 + 2948 + + + 1 + 2949 + + + 5 + 2949 + + + 8 + 2949 + + + 1 + 2950 + + + 5 + 2950 + + + 8 + 2950 + + + 1 + 2951 + + + 5 + 2951 + + + 8 + 2951 + + + 1 + 2952 + + + 5 + 2952 + + + 8 + 2952 + + + 1 + 2953 + + + 5 + 2953 + + + 8 + 2953 + + + 1 + 2954 + + + 5 + 2954 + + + 8 + 2954 + + + 1 + 2955 + + + 5 + 2955 + + + 8 + 2955 + + + 1 + 2956 + + + 5 + 2956 + + + 8 + 2956 + + + 1 + 2957 + + + 5 + 2957 + + + 8 + 2957 + + + 1 + 2958 + + + 5 + 2958 + + + 8 + 2958 + + + 1 + 2959 + + + 5 + 2959 + + + 8 + 2959 + + + 1 + 2960 + + + 5 + 2960 + + + 8 + 2960 + + + 1 + 2961 + + + 5 + 2961 + + + 8 + 2961 + + + 1 + 2962 + + + 5 + 2962 + + + 8 + 2962 + + + 1 + 2963 + + + 5 + 2963 + + + 8 + 2963 + + + 1 + 2964 + + + 8 + 2964 + + + 1 + 2965 + + + 8 + 2965 + + + 1 + 2966 + + + 8 + 2966 + + + 1 + 2967 + + + 8 + 2967 + + + 1 + 2968 + + + 8 + 2968 + + + 1 + 2969 + + + 8 + 2969 + + + 1 + 2970 + + + 8 + 2970 + + + 1 + 2971 + + + 8 + 2971 + + + 1 + 2972 + + + 8 + 2972 + + + 1 + 2973 + + + 8 + 2973 + + + 1 + 2974 + + + 8 + 2974 + + + 1 + 2975 + + + 5 + 2975 + + + 8 + 2975 + + + 1 + 2976 + + + 5 + 2976 + + + 8 + 2976 + + + 1 + 2977 + + + 5 + 2977 + + + 8 + 2977 + + + 1 + 2978 + + + 5 + 2978 + + + 8 + 2978 + + + 1 + 2979 + + + 5 + 2979 + + + 8 + 2979 + + + 1 + 2980 + + + 5 + 2980 + + + 8 + 2980 + + + 1 + 2981 + + + 5 + 2981 + + + 8 + 2981 + + + 1 + 2982 + + + 5 + 2982 + + + 8 + 2982 + + + 1 + 2983 + + + 5 + 2983 + + + 8 + 2983 + + + 1 + 2984 + + + 5 + 2984 + + + 8 + 2984 + + + 1 + 2985 + + + 5 + 2985 + + + 8 + 2985 + + + 1 + 2986 + + + 5 + 2986 + + + 8 + 2986 + + + 1 + 2987 + + + 8 + 2987 + + + 1 + 2988 + + + 8 + 2988 + + + 1 + 2989 + + + 8 + 2989 + + + 1 + 2990 + + + 8 + 2990 + + + 1 + 2991 + + + 8 + 2991 + + + 1 + 2992 + + + 8 + 2992 + + + 1 + 2993 + + + 8 + 2993 + + + 1 + 2994 + + + 8 + 2994 + + + 1 + 2995 + + + 8 + 2995 + + + 1 + 2996 + + + 8 + 2996 + + + 1 + 2997 + + + 8 + 2997 + + + 1 + 2998 + + + 8 + 2998 + + + 1 + 2999 + + + 8 + 2999 + + + 1 + 3000 + + + 8 + 3000 + + + 1 + 3001 + + + 8 + 3001 + + + 1 + 3002 + + + 8 + 3002 + + + 1 + 3003 + + + 8 + 3003 + + + 1 + 3004 + + + 5 + 3004 + + + 8 + 3004 + + + 1 + 3005 + + + 5 + 3005 + + + 8 + 3005 + + + 1 + 3006 + + + 5 + 3006 + + + 8 + 3006 + + + 1 + 3007 + + + 5 + 3007 + + + 8 + 3007 + + + 1 + 3008 + + + 5 + 3008 + + + 8 + 3008 + + + 1 + 3009 + + + 5 + 3009 + + + 8 + 3009 + + + 1 + 3010 + + + 5 + 3010 + + + 8 + 3010 + + + 1 + 3011 + + + 5 + 3011 + + + 8 + 3011 + + + 1 + 3012 + + + 5 + 3012 + + + 8 + 3012 + + + 1 + 3013 + + + 5 + 3013 + + + 8 + 3013 + + + 1 + 3014 + + + 5 + 3014 + + + 8 + 3014 + + + 1 + 3015 + + + 5 + 3015 + + + 8 + 3015 + + + 1 + 3016 + + + 5 + 3016 + + + 8 + 3016 + + + 1 + 3017 + + + 5 + 3017 + + + 8 + 3017 + + + 1 + 3018 + + + 8 + 3018 + + + 1 + 3019 + + + 8 + 3019 + + + 1 + 3020 + + + 8 + 3020 + + + 1 + 3021 + + + 8 + 3021 + + + 1 + 3022 + + + 8 + 3022 + + + 1 + 3023 + + + 8 + 3023 + + + 1 + 3024 + + + 8 + 3024 + + + 1 + 3025 + + + 8 + 3025 + + + 1 + 3026 + + + 8 + 3026 + + + 1 + 3027 + + + 8 + 3027 + + + 1 + 3028 + + + 5 + 3028 + + + 8 + 3028 + + + 1 + 3029 + + + 5 + 3029 + + + 8 + 3029 + + + 1 + 3030 + + + 5 + 3030 + + + 8 + 3030 + + + 1 + 3031 + + + 5 + 3031 + + + 8 + 3031 + + + 1 + 3032 + + + 5 + 3032 + + + 8 + 3032 + + + 1 + 3033 + + + 5 + 3033 + + + 8 + 3033 + + + 1 + 3034 + + + 5 + 3034 + + + 8 + 3034 + + + 1 + 3035 + + + 5 + 3035 + + + 8 + 3035 + + + 1 + 3036 + + + 5 + 3036 + + + 8 + 3036 + + + 1 + 3037 + + + 5 + 3037 + + + 8 + 3037 + + + 1 + 3038 + + + 5 + 3038 + + + 8 + 3038 + + + 1 + 3039 + + + 5 + 3039 + + + 8 + 3039 + + + 1 + 3040 + + + 5 + 3040 + + + 8 + 3040 + + + 1 + 3041 + + + 5 + 3041 + + + 8 + 3041 + + + 1 + 3042 + + + 5 + 3042 + + + 8 + 3042 + + + 1 + 3043 + + + 5 + 3043 + + + 8 + 3043 + + + 1 + 3044 + + + 5 + 3044 + + + 8 + 3044 + + + 1 + 3045 + + + 5 + 3045 + + + 8 + 3045 + + + 1 + 3046 + + + 5 + 3046 + + + 8 + 3046 + + + 1 + 3047 + + + 5 + 3047 + + + 8 + 3047 + + + 1 + 3048 + + + 5 + 3048 + + + 8 + 3048 + + + 1 + 3049 + + + 5 + 3049 + + + 8 + 3049 + + + 1 + 3050 + + + 5 + 3050 + + + 8 + 3050 + + + 1 + 3051 + + + 5 + 3051 + + + 8 + 3051 + + + 1 + 3052 + + + 8 + 3052 + + + 1 + 3053 + + + 8 + 3053 + + + 1 + 3054 + + + 8 + 3054 + + + 1 + 3055 + + + 8 + 3055 + + + 1 + 3056 + + + 8 + 3056 + + + 1 + 3057 + + + 8 + 3057 + + + 1 + 3058 + + + 8 + 3058 + + + 1 + 3059 + + + 8 + 3059 + + + 1 + 3060 + + + 8 + 3060 + + + 1 + 3061 + + + 8 + 3061 + + + 1 + 3062 + + + 8 + 3062 + + + 1 + 3063 + + + 8 + 3063 + + + 1 + 3064 + + + 8 + 3064 + + + 1 + 3065 + + + 8 + 3065 + + + 1 + 3066 + + + 8 + 3066 + + + 1 + 3067 + + + 8 + 3067 + + + 1 + 3068 + + + 8 + 3068 + + + 1 + 3069 + + + 8 + 3069 + + + 1 + 3070 + + + 8 + 3070 + + + 1 + 3071 + + + 8 + 3071 + + + 1 + 3072 + + + 8 + 3072 + + + 1 + 3073 + + + 8 + 3073 + + + 1 + 3074 + + + 8 + 3074 + + + 1 + 3075 + + + 5 + 3075 + + + 8 + 3075 + + + 1 + 3076 + + + 5 + 3076 + + + 8 + 3076 + + + 1 + 3077 + + + 5 + 3077 + + + 8 + 3077 + + + 1 + 3078 + + + 5 + 3078 + + + 8 + 3078 + + + 1 + 3079 + + + 5 + 3079 + + + 8 + 3079 + + + 1 + 3080 + + + 5 + 3080 + + + 8 + 3080 + + + 1 + 3081 + + + 8 + 3081 + + + 1 + 3082 + + + 8 + 3082 + + + 1 + 3083 + + + 8 + 3083 + + + 1 + 3084 + + + 8 + 3084 + + + 1 + 3085 + + + 8 + 3085 + + + 1 + 3086 + + + 8 + 3086 + + + 1 + 3087 + + + 8 + 3087 + + + 1 + 3088 + + + 8 + 3088 + + + 1 + 3089 + + + 8 + 3089 + + + 1 + 3090 + + + 8 + 3090 + + + 1 + 3091 + + + 8 + 3091 + + + 1 + 3092 + + + 5 + 3092 + + + 8 + 3092 + + + 1 + 3093 + + + 5 + 3093 + + + 8 + 3093 + + + 1 + 3094 + + + 5 + 3094 + + + 8 + 3094 + + + 1 + 3095 + + + 5 + 3095 + + + 8 + 3095 + + + 1 + 3096 + + + 5 + 3096 + + + 8 + 3096 + + + 1 + 3097 + + + 5 + 3097 + + + 8 + 3097 + + + 1 + 3098 + + + 5 + 3098 + + + 8 + 3098 + + + 1 + 3099 + + + 5 + 3099 + + + 8 + 3099 + + + 1 + 3100 + + + 5 + 3100 + + + 8 + 3100 + + + 1 + 3101 + + + 5 + 3101 + + + 8 + 3101 + + + 1 + 3102 + + + 5 + 3102 + + + 8 + 3102 + + + 1 + 3103 + + + 5 + 3103 + + + 8 + 3103 + + + 1 + 3104 + + + 8 + 3104 + + + 1 + 3105 + + + 8 + 3105 + + + 1 + 3106 + + + 8 + 3106 + + + 1 + 3107 + + + 8 + 3107 + + + 1 + 3108 + + + 8 + 3108 + + + 1 + 3109 + + + 8 + 3109 + + + 1 + 3110 + + + 8 + 3110 + + + 1 + 3111 + + + 8 + 3111 + + + 1 + 3112 + + + 8 + 3112 + + + 1 + 3113 + + + 8 + 3113 + + + 1 + 3114 + + + 8 + 3114 + + + 1 + 3115 + + + 8 + 3115 + + + 1 + 3116 + + + 8 + 3116 + + + 1 + 3117 + + + 8 + 3117 + + + 1 + 3118 + + + 8 + 3118 + + + 1 + 3119 + + + 8 + 3119 + + + 1 + 3120 + + + 8 + 3120 + + + 1 + 3121 + + + 8 + 3121 + + + 1 + 3122 + + + 8 + 3122 + + + 1 + 3123 + + + 8 + 3123 + + + 1 + 3124 + + + 8 + 3124 + + + 1 + 3125 + + + 8 + 3125 + + + 1 + 3126 + + + 8 + 3126 + + + 1 + 3127 + + + 8 + 3127 + + + 1 + 3128 + + + 8 + 3128 + + + 1 + 3129 + + + 8 + 3129 + + + 1 + 3130 + + + 8 + 3130 + + + 1 + 3131 + + + 8 + 3131 + + + 1 + 3132 + + + 5 + 3132 + + + 8 + 3132 + + + 1 + 3133 + + + 5 + 3133 + + + 8 + 3133 + + + 1 + 3134 + + + 5 + 3134 + + + 8 + 3134 + + + 1 + 3135 + + + 5 + 3135 + + + 8 + 3135 + + + 1 + 3136 + + + 5 + 3136 + + + 8 + 3136 + + + 1 + 3137 + + + 5 + 3137 + + + 8 + 3137 + + + 1 + 3138 + + + 5 + 3138 + + + 8 + 3138 + + + 1 + 3139 + + + 5 + 3139 + + + 8 + 3139 + + + 1 + 3140 + + + 5 + 3140 + + + 8 + 3140 + + + 1 + 3141 + + + 5 + 3141 + + + 8 + 3141 + + + 1 + 3142 + + + 5 + 3142 + + + 8 + 3142 + + + 1 + 3143 + + + 5 + 3143 + + + 8 + 3143 + + + 1 + 3144 + + + 5 + 3144 + + + 8 + 3144 + + + 1 + 3145 + + + 5 + 3145 + + + 8 + 3145 + + + 1 + 3146 + + + 5 + 3146 + + + 8 + 3146 + + + 1 + 3147 + + + 5 + 3147 + + + 8 + 3147 + + + 1 + 3148 + + + 5 + 3148 + + + 8 + 3148 + + + 1 + 3149 + + + 5 + 3149 + + + 8 + 3149 + + + 1 + 3150 + + + 5 + 3150 + + + 8 + 3150 + + + 1 + 3151 + + + 5 + 3151 + + + 8 + 3151 + + + 1 + 3152 + + + 5 + 3152 + + + 8 + 3152 + + + 1 + 3153 + + + 5 + 3153 + + + 8 + 3153 + + + 1 + 3154 + + + 5 + 3154 + + + 8 + 3154 + + + 1 + 3155 + + + 5 + 3155 + + + 8 + 3155 + + + 1 + 3156 + + + 5 + 3156 + + + 8 + 3156 + + + 1 + 3157 + + + 5 + 3157 + + + 8 + 3157 + + + 1 + 3158 + + + 5 + 3158 + + + 8 + 3158 + + + 1 + 3159 + + + 5 + 3159 + + + 8 + 3159 + + + 1 + 3160 + + + 5 + 3160 + + + 8 + 3160 + + + 1 + 3161 + + + 5 + 3161 + + + 8 + 3161 + + + 1 + 3162 + + + 5 + 3162 + + + 8 + 3162 + + + 1 + 3163 + + + 5 + 3163 + + + 8 + 3163 + + + 1 + 3164 + + + 5 + 3164 + + + 8 + 3164 + + + 3 + 3165 + + + 10 + 3165 + + + 3 + 3166 + + + 10 + 3166 + + + 3 + 3167 + + + 10 + 3167 + + + 3 + 3168 + + + 10 + 3168 + + + 3 + 3169 + + + 10 + 3169 + + + 3 + 3170 + + + 10 + 3170 + + + 3 + 3171 + + + 10 + 3171 + + + 3 + 3172 + + + 10 + 3172 + + + 3 + 3173 + + + 10 + 3173 + + + 3 + 3174 + + + 10 + 3174 + + + 3 + 3175 + + + 10 + 3175 + + + 3 + 3176 + + + 10 + 3176 + + + 3 + 3177 + + + 10 + 3177 + + + 3 + 3178 + + + 10 + 3178 + + + 3 + 3179 + + + 10 + 3179 + + + 3 + 3180 + + + 10 + 3180 + + + 3 + 3181 + + + 10 + 3181 + + + 3 + 3182 + + + 10 + 3182 + + + 3 + 3183 + + + 10 + 3183 + + + 3 + 3184 + + + 10 + 3184 + + + 3 + 3185 + + + 10 + 3185 + + + 3 + 3186 + + + 10 + 3186 + + + 3 + 3187 + + + 10 + 3187 + + + 3 + 3188 + + + 10 + 3188 + + + 3 + 3189 + + + 10 + 3189 + + + 3 + 3190 + + + 10 + 3190 + + + 3 + 3191 + + + 10 + 3191 + + + 3 + 3192 + + + 10 + 3192 + + + 3 + 3193 + + + 10 + 3193 + + + 3 + 3194 + + + 10 + 3194 + + + 3 + 3195 + + + 10 + 3195 + + + 3 + 3196 + + + 10 + 3196 + + + 3 + 3197 + + + 10 + 3197 + + + 3 + 3198 + + + 10 + 3198 + + + 3 + 3199 + + + 10 + 3199 + + + 3 + 3200 + + + 10 + 3200 + + + 3 + 3201 + + + 10 + 3201 + + + 3 + 3202 + + + 10 + 3202 + + + 3 + 3203 + + + 10 + 3203 + + + 3 + 3204 + + + 10 + 3204 + + + 3 + 3205 + + + 10 + 3205 + + + 3 + 3206 + + + 10 + 3206 + + + 3 + 3207 + + + 10 + 3207 + + + 3 + 3208 + + + 10 + 3208 + + + 3 + 3209 + + + 10 + 3209 + + + 3 + 3210 + + + 10 + 3210 + + + 3 + 3211 + + + 10 + 3211 + + + 3 + 3212 + + + 10 + 3212 + + + 3 + 3213 + + + 10 + 3213 + + + 3 + 3214 + + + 10 + 3214 + + + 3 + 3215 + + + 10 + 3215 + + + 3 + 3216 + + + 10 + 3216 + + + 3 + 3217 + + + 10 + 3217 + + + 3 + 3218 + + + 10 + 3218 + + + 3 + 3219 + + + 10 + 3219 + + + 3 + 3220 + + + 10 + 3220 + + + 3 + 3221 + + + 10 + 3221 + + + 3 + 3222 + + + 10 + 3222 + + + 3 + 3223 + + + 10 + 3223 + + + 3 + 3224 + + + 10 + 3224 + + + 1 + 3225 + + + 5 + 3225 + + + 8 + 3225 + + + 3 + 3226 + + + 10 + 3226 + + + 3 + 3227 + + + 10 + 3227 + + + 3 + 3228 + + + 10 + 3228 + + + 3 + 3229 + + + 10 + 3229 + + + 3 + 3230 + + + 10 + 3230 + + + 3 + 3231 + + + 10 + 3231 + + + 3 + 3232 + + + 10 + 3232 + + + 3 + 3233 + + + 10 + 3233 + + + 3 + 3234 + + + 10 + 3234 + + + 3 + 3235 + + + 10 + 3235 + + + 3 + 3236 + + + 10 + 3236 + + + 3 + 3237 + + + 10 + 3237 + + + 3 + 3238 + + + 10 + 3238 + + + 3 + 3239 + + + 10 + 3239 + + + 3 + 3240 + + + 10 + 3240 + + + 3 + 3241 + + + 10 + 3241 + + + 3 + 3242 + + + 10 + 3242 + + + 3 + 3243 + + + 10 + 3243 + + + 3 + 3244 + + + 10 + 3244 + + + 3 + 3245 + + + 10 + 3245 + + + 3 + 3246 + + + 10 + 3246 + + + 3 + 3247 + + + 10 + 3247 + + + 3 + 3248 + + + 10 + 3248 + + + 3 + 3249 + + + 10 + 3249 + + + 3 + 3250 + + + 10 + 3250 + + + 3 + 3251 + + + 10 + 3251 + + + 3 + 3252 + + + 10 + 3252 + + + 1 + 3253 + + + 8 + 3253 + + + 1 + 3254 + + + 8 + 3254 + + + 1 + 3255 + + + 8 + 3255 + + + 1 + 3256 + + + 8 + 3256 + + + 1 + 3257 + + + 8 + 3257 + + + 1 + 3258 + + + 8 + 3258 + + + 1 + 3259 + + + 8 + 3259 + + + 1 + 3260 + + + 8 + 3260 + + + 1 + 3261 + + + 8 + 3261 + + + 1 + 3262 + + + 8 + 3262 + + + 1 + 3263 + + + 8 + 3263 + + + 1 + 3264 + + + 8 + 3264 + + + 1 + 3265 + + + 8 + 3265 + + + 1 + 3266 + + + 8 + 3266 + + + 1 + 3267 + + + 8 + 3267 + + + 1 + 3268 + + + 8 + 3268 + + + 1 + 3269 + + + 8 + 3269 + + + 1 + 3270 + + + 8 + 3270 + + + 1 + 3271 + + + 8 + 3271 + + + 1 + 3272 + + + 8 + 3272 + + + 1 + 3273 + + + 8 + 3273 + + + 1 + 3274 + + + 8 + 3274 + + + 1 + 3275 + + + 8 + 3275 + + + 1 + 3276 + + + 5 + 3276 + + + 8 + 3276 + + + 1 + 3277 + + + 5 + 3277 + + + 8 + 3277 + + + 1 + 3278 + + + 5 + 3278 + + + 8 + 3278 + + + 1 + 3279 + + + 5 + 3279 + + + 8 + 3279 + + + 1 + 3280 + + + 5 + 3280 + + + 8 + 3280 + + + 1 + 3281 + + + 5 + 3281 + + + 8 + 3281 + + + 1 + 3282 + + + 5 + 3282 + + + 8 + 3282 + + + 1 + 3283 + + + 5 + 3283 + + + 8 + 3283 + + + 1 + 3284 + + + 5 + 3284 + + + 8 + 3284 + + + 1 + 3285 + + + 5 + 3285 + + + 8 + 3285 + + + 1 + 3286 + + + 5 + 3286 + + + 8 + 3286 + + + 1 + 3287 + + + 5 + 3287 + + + 8 + 3287 + + + 1 + 3288 + + + 8 + 3288 + + + 1 + 3289 + + + 8 + 3289 + + + 1 + 3290 + + + 8 + 3290 + + + 17 + 3290 + + + 1 + 3291 + + + 8 + 3291 + + + 1 + 3292 + + + 8 + 3292 + + + 1 + 3293 + + + 8 + 3293 + + + 1 + 3294 + + + 8 + 3294 + + + 1 + 3295 + + + 8 + 3295 + + + 1 + 3296 + + + 8 + 3296 + + + 1 + 3297 + + + 8 + 3297 + + + 1 + 3298 + + + 8 + 3298 + + + 1 + 3299 + + + 8 + 3299 + + + 1 + 3300 + + + 5 + 3300 + + + 8 + 3300 + + + 1 + 3301 + + + 5 + 3301 + + + 8 + 3301 + + + 1 + 3302 + + + 5 + 3302 + + + 8 + 3302 + + + 1 + 3303 + + + 5 + 3303 + + + 8 + 3303 + + + 1 + 3304 + + + 5 + 3304 + + + 8 + 3304 + + + 1 + 3305 + + + 5 + 3305 + + + 8 + 3305 + + + 1 + 3306 + + + 5 + 3306 + + + 8 + 3306 + + + 1 + 3307 + + + 5 + 3307 + + + 8 + 3307 + + + 1 + 3308 + + + 5 + 3308 + + + 8 + 3308 + + + 1 + 3309 + + + 5 + 3309 + + + 8 + 3309 + + + 1 + 3310 + + + 5 + 3310 + + + 8 + 3310 + + + 1 + 3311 + + + 5 + 3311 + + + 8 + 3311 + + + 1 + 3312 + + + 5 + 3312 + + + 8 + 3312 + + + 1 + 3313 + + + 5 + 3313 + + + 8 + 3313 + + + 1 + 3314 + + + 5 + 3314 + + + 8 + 3314 + + + 1 + 3315 + + + 5 + 3315 + + + 8 + 3315 + + + 1 + 3316 + + + 5 + 3316 + + + 8 + 3316 + + + 1 + 3317 + + + 5 + 3317 + + + 8 + 3317 + + + 1 + 3318 + + + 5 + 3318 + + + 8 + 3318 + + + 1 + 3319 + + + 8 + 3319 + + + 1 + 3320 + + + 8 + 3320 + + + 1 + 3321 + + + 8 + 3321 + + + 1 + 3322 + + + 8 + 3322 + + + 1 + 3323 + + + 8 + 3323 + + + 1 + 3324 + + + 8 + 3324 + + + 1 + 3325 + + + 8 + 3325 + + + 1 + 3326 + + + 8 + 3326 + + + 1 + 3327 + + + 8 + 3327 + + + 1 + 3328 + + + 8 + 3328 + + + 1 + 3329 + + + 8 + 3329 + + + 1 + 3330 + + + 8 + 3330 + + + 1 + 3331 + + + 8 + 3331 + + + 1 + 3332 + + + 8 + 3332 + + + 1 + 3333 + + + 8 + 3333 + + + 1 + 3334 + + + 8 + 3334 + + + 1 + 3335 + + + 8 + 3335 + + + 1 + 3336 + + + 8 + 3336 + + + 3 + 3337 + + + 10 + 3337 + + + 3 + 3338 + + + 10 + 3338 + + + 3 + 3339 + + + 10 + 3339 + + + 3 + 3340 + + + 10 + 3340 + + + 3 + 3341 + + + 10 + 3341 + + + 3 + 3342 + + + 10 + 3342 + + + 3 + 3343 + + + 10 + 3343 + + + 3 + 3344 + + + 10 + 3344 + + + 3 + 3345 + + + 10 + 3345 + + + 3 + 3346 + + + 10 + 3346 + + + 3 + 3347 + + + 10 + 3347 + + + 3 + 3348 + + + 10 + 3348 + + + 1 + 3349 + + + 8 + 3349 + + + 1 + 3350 + + + 8 + 3350 + + + 1 + 3351 + + + 5 + 3351 + + + 8 + 3351 + + + 1 + 3352 + + + 8 + 3352 + + + 1 + 3353 + + + 8 + 3353 + + + 1 + 3354 + + + 5 + 3354 + + + 8 + 3354 + + + 1 + 3355 + + + 8 + 3355 + + + 1 + 3356 + + + 8 + 3356 + + + 1 + 3357 + + + 8 + 3357 + + + 1 + 3358 + + + 8 + 3358 + + + 1 + 3359 + + + 5 + 3359 + + + 8 + 3359 + + + 3 + 3360 + + + 10 + 3360 + + + 3 + 3361 + + + 10 + 3361 + + + 3 + 3362 + + + 10 + 3362 + + + 3 + 3363 + + + 10 + 3363 + + + 3 + 3364 + + + 10 + 3364 + + + 1 + 3365 + + + 5 + 3365 + + + 8 + 3365 + + + 1 + 3366 + + + 5 + 3366 + + + 8 + 3366 + + + 1 + 3367 + + + 5 + 3367 + + + 8 + 3367 + + + 16 + 3367 + + + 1 + 3368 + + + 5 + 3368 + + + 8 + 3368 + + + 1 + 3369 + + + 5 + 3369 + + + 8 + 3369 + + + 1 + 3370 + + + 5 + 3370 + + + 8 + 3370 + + + 1 + 3371 + + + 5 + 3371 + + + 8 + 3371 + + + 1 + 3372 + + + 5 + 3372 + + + 8 + 3372 + + + 1 + 3373 + + + 5 + 3373 + + + 8 + 3373 + + + 1 + 3374 + + + 5 + 3374 + + + 8 + 3374 + + + 1 + 3375 + + + 8 + 3375 + + + 1 + 3376 + + + 8 + 3376 + + + 1 + 3377 + + + 8 + 3377 + + + 1 + 3378 + + + 8 + 3378 + + + 1 + 3379 + + + 8 + 3379 + + + 1 + 3380 + + + 8 + 3380 + + + 1 + 3381 + + + 8 + 3381 + + + 1 + 3382 + + + 8 + 3382 + + + 1 + 3383 + + + 8 + 3383 + + + 1 + 3384 + + + 8 + 3384 + + + 1 + 3385 + + + 8 + 3385 + + + 1 + 3386 + + + 8 + 3386 + + + 1 + 3387 + + + 8 + 3387 + + + 1 + 3388 + + + 8 + 3388 + + + 1 + 3389 + + + 8 + 3389 + + + 1 + 3390 + + + 8 + 3390 + + + 1 + 3391 + + + 8 + 3391 + + + 1 + 3392 + + + 8 + 3392 + + + 1 + 3393 + + + 8 + 3393 + + + 1 + 3394 + + + 8 + 3394 + + + 1 + 3395 + + + 8 + 3395 + + + 1 + 3396 + + + 8 + 3396 + + + 1 + 3397 + + + 8 + 3397 + + + 1 + 3398 + + + 8 + 3398 + + + 1 + 3399 + + + 8 + 3399 + + + 1 + 3400 + + + 8 + 3400 + + + 1 + 3401 + + + 8 + 3401 + + + 1 + 3402 + + + 8 + 3402 + + + 9 + 3402 + + + 1 + 3403 + + + 5 + 3403 + + + 8 + 3403 + + + 12 + 3403 + + + 15 + 3403 + + + 1 + 3404 + + + 5 + 3404 + + + 8 + 3404 + + + 12 + 3404 + + + 15 + 3404 + + + 1 + 3405 + + + 8 + 3405 + + + 12 + 3405 + + + 15 + 3405 + + + 1 + 3406 + + + 8 + 3406 + + + 12 + 3406 + + + 15 + 3406 + + + 1 + 3407 + + + 8 + 3407 + + + 12 + 3407 + + + 15 + 3407 + + + 1 + 3408 + + + 5 + 3408 + + + 8 + 3408 + + + 12 + 3408 + + + 15 + 3408 + + + 1 + 3409 + + + 5 + 3409 + + + 8 + 3409 + + + 12 + 3409 + + + 15 + 3409 + + + 1 + 3410 + + + 5 + 3410 + + + 8 + 3410 + + + 12 + 3410 + + + 15 + 3410 + + + 1 + 3411 + + + 5 + 3411 + + + 8 + 3411 + + + 12 + 3411 + + + 15 + 3411 + + + 1 + 3412 + + + 8 + 3412 + + + 12 + 3412 + + + 15 + 3412 + + + 1 + 3413 + + + 8 + 3413 + + + 12 + 3413 + + + 15 + 3413 + + + 1 + 3414 + + + 8 + 3414 + + + 12 + 3414 + + + 15 + 3414 + + + 1 + 3415 + + + 5 + 3415 + + + 8 + 3415 + + + 12 + 3415 + + + 15 + 3415 + + + 1 + 3416 + + + 5 + 3416 + + + 8 + 3416 + + + 12 + 3416 + + + 15 + 3416 + + + 1 + 3417 + + + 5 + 3417 + + + 8 + 3417 + + + 12 + 3417 + + + 15 + 3417 + + + 1 + 3418 + + + 5 + 3418 + + + 8 + 3418 + + + 12 + 3418 + + + 15 + 3418 + + + 1 + 3419 + + + 8 + 3419 + + + 12 + 3419 + + + 15 + 3419 + + + 1 + 3420 + + + 8 + 3420 + + + 12 + 3420 + + + 15 + 3420 + + + 1 + 3421 + + + 5 + 3421 + + + 8 + 3421 + + + 12 + 3421 + + + 15 + 3421 + + + 1 + 3422 + + + 8 + 3422 + + + 12 + 3422 + + + 15 + 3422 + + + 1 + 3423 + + + 5 + 3423 + + + 8 + 3423 + + + 12 + 3423 + + + 15 + 3423 + + + 1 + 3424 + + + 5 + 3424 + + + 8 + 3424 + + + 12 + 3424 + + + 15 + 3424 + + + 1 + 3425 + + + 8 + 3425 + + + 12 + 3425 + + + 15 + 3425 + + + 1 + 3426 + + + 5 + 3426 + + + 8 + 3426 + + + 12 + 3426 + + + 15 + 3426 + + + 1 + 3427 + + + 8 + 3427 + + + 12 + 3427 + + + 15 + 3427 + + + 3 + 3428 + + + 10 + 3428 + + + 3 + 3429 + + + 10 + 3429 + + + 1 + 3430 + + + 5 + 3430 + + + 8 + 3430 + + + 12 + 3430 + + + 14 + 3430 + + + 1 + 3431 + + + 8 + 3431 + + + 12 + 3431 + + + 14 + 3431 + + + 1 + 3432 + + + 5 + 3432 + + + 8 + 3432 + + + 12 + 3432 + + + 14 + 3432 + + + 1 + 3433 + + + 8 + 3433 + + + 12 + 3433 + + + 14 + 3433 + + + 1 + 3434 + + + 5 + 3434 + + + 8 + 3434 + + + 12 + 3434 + + + 14 + 3434 + + + 1 + 3435 + + + 5 + 3435 + + + 8 + 3435 + + + 12 + 3435 + + + 14 + 3435 + + + 1 + 3436 + + + 5 + 3436 + + + 8 + 3436 + + + 12 + 3436 + + + 14 + 3436 + + + 1 + 3437 + + + 5 + 3437 + + + 8 + 3437 + + + 12 + 3437 + + + 14 + 3437 + + + 1 + 3438 + + + 5 + 3438 + + + 8 + 3438 + + + 12 + 3438 + + + 14 + 3438 + + + 1 + 3439 + + + 5 + 3439 + + + 8 + 3439 + + + 12 + 3439 + + + 14 + 3439 + + + 1 + 3440 + + + 8 + 3440 + + + 12 + 3440 + + + 14 + 3440 + + + 1 + 3441 + + + 8 + 3441 + + + 12 + 3441 + + + 14 + 3441 + + + 1 + 3442 + + + 5 + 3442 + + + 8 + 3442 + + + 12 + 3442 + + + 14 + 3442 + + + 1 + 3443 + + + 8 + 3443 + + + 12 + 3443 + + + 14 + 3443 + + + 1 + 3444 + + + 5 + 3444 + + + 8 + 3444 + + + 12 + 3444 + + + 14 + 3444 + + + 1 + 3445 + + + 5 + 3445 + + + 8 + 3445 + + + 12 + 3445 + + + 14 + 3445 + + + 1 + 3446 + + + 5 + 3446 + + + 8 + 3446 + + + 12 + 3446 + + + 14 + 3446 + + + 1 + 3447 + + + 5 + 3447 + + + 8 + 3447 + + + 12 + 3447 + + + 14 + 3447 + + + 1 + 3448 + + + 5 + 3448 + + + 8 + 3448 + + + 12 + 3448 + + + 14 + 3448 + + + 1 + 3449 + + + 5 + 3449 + + + 8 + 3449 + + + 12 + 3449 + + + 14 + 3449 + + + 1 + 3450 + + + 8 + 3450 + + + 12 + 3450 + + + 14 + 3450 + + + 1 + 3451 + + + 5 + 3451 + + + 8 + 3451 + + + 12 + 3451 + + + 14 + 3451 + + + 1 + 3452 + + + 8 + 3452 + + + 12 + 3452 + + + 14 + 3452 + + + 1 + 3453 + + + 8 + 3453 + + + 12 + 3453 + + + 14 + 3453 + + + 1 + 3454 + + + 5 + 3454 + + + 8 + 3454 + + + 12 + 3454 + + + 14 + 3454 + + + 1 + 3455 + + + 8 + 3455 + + + 1 + 3456 + + + 8 + 3456 + + + 1 + 3457 + + + 8 + 3457 + + + 1 + 3458 + + + 8 + 3458 + + + 1 + 3459 + + + 8 + 3459 + + + 1 + 3460 + + + 8 + 3460 + + + 1 + 3461 + + + 8 + 3461 + + + 1 + 3462 + + + 8 + 3462 + + + 1 + 3463 + + + 8 + 3463 + + + 1 + 3464 + + + 8 + 3464 + + + 1 + 3465 + + + 8 + 3465 + + + 1 + 3466 + + + 8 + 3466 + + + 1 + 3467 + + + 8 + 3467 + + + 1 + 3468 + + + 8 + 3468 + + + 1 + 3469 + + + 8 + 3469 + + + 1 + 3470 + + + 8 + 3470 + + + 1 + 3471 + + + 8 + 3471 + + + 1 + 3472 + + + 8 + 3472 + + + 1 + 3473 + + + 8 + 3473 + + + 1 + 3474 + + + 8 + 3474 + + + 1 + 3475 + + + 8 + 3475 + + + 1 + 3476 + + + 8 + 3476 + + + 1 + 3477 + + + 8 + 3477 + + + 1 + 3478 + + + 8 + 3478 + + + 1 + 3479 + + + 8 + 3479 + + + 12 + 3479 + + + 13 + 3479 + + + 1 + 3480 + + + 8 + 3480 + + + 12 + 3480 + + + 13 + 3480 + + + 1 + 3481 + + + 5 + 3481 + + + 8 + 3481 + + + 12 + 3481 + + + 13 + 3481 + + + 1 + 3482 + + + 5 + 3482 + + + 8 + 3482 + + + 12 + 3482 + + + 13 + 3482 + + + 1 + 3483 + + + 8 + 3483 + + + 12 + 3483 + + + 13 + 3483 + + + 1 + 3484 + + + 8 + 3484 + + + 12 + 3484 + + + 13 + 3484 + + + 1 + 3485 + + + 5 + 3485 + + + 8 + 3485 + + + 12 + 3485 + + + 13 + 3485 + + + 1 + 3486 + + + 8 + 3486 + + + 12 + 3486 + + + 13 + 3486 + + + 1 + 3487 + + + 8 + 3487 + + + 12 + 3487 + + + 13 + 3487 + + + 1 + 3488 + + + 8 + 3488 + + + 12 + 3488 + + + 13 + 3488 + + + 1 + 3489 + + + 5 + 3489 + + + 8 + 3489 + + + 12 + 3489 + + + 13 + 3489 + + + 1 + 3490 + + + 5 + 3490 + + + 8 + 3490 + + + 12 + 3490 + + + 13 + 3490 + + + 1 + 3491 + + + 8 + 3491 + + + 12 + 3491 + + + 13 + 3491 + + + 1 + 3492 + + + 5 + 3492 + + + 8 + 3492 + + + 12 + 3492 + + + 13 + 3492 + + + 1 + 3493 + + + 5 + 3493 + + + 8 + 3493 + + + 12 + 3493 + + + 13 + 3493 + + + 1 + 3494 + + + 8 + 3494 + + + 12 + 3494 + + + 13 + 3494 + + + 1 + 3495 + + + 8 + 3495 + + + 12 + 3495 + + + 13 + 3495 + + + 1 + 3496 + + + 8 + 3496 + + + 12 + 3496 + + + 13 + 3496 + + + 1 + 3497 + + + 8 + 3497 + + + 12 + 3497 + + + 13 + 3497 + + + 1 + 3498 + + + 5 + 3498 + + + 8 + 3498 + + + 12 + 3498 + + + 13 + 3498 + + + 1 + 3499 + + + 5 + 3499 + + + 8 + 3499 + + + 12 + 3499 + + + 13 + 3499 + + + 1 + 3500 + + + 8 + 3500 + + + 12 + 3500 + + + 13 + 3500 + + + 1 + 3501 + + + 8 + 3501 + + + 12 + 3501 + + + 13 + 3501 + + + 1 + 3502 + + + 8 + 3502 + + + 12 + 3502 + + + 13 + 3502 + + + 1 + 3503 + + + 5 + 3503 + + + 8 + 3503 + + + 12 + 3503 + + + 13 + 3503 + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Configuration/AppConfigTest.cs b/Orm/Xtensive.Orm.Tests/Configuration/AppConfigTest.cs index ea1b655465..4ac17c24fc 100644 --- a/Orm/Xtensive.Orm.Tests/Configuration/AppConfigTest.cs +++ b/Orm/Xtensive.Orm.Tests/Configuration/AppConfigTest.cs @@ -1,402 +1,402 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.08.06 - -using System; -using System.Configuration; -using System.Linq; -using NUnit.Framework; -using Xtensive.Linq; -using Xtensive.Orm.Tests; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Configuration.UserDefinedMappings -{ - [CompilerContainer(typeof(SqlExpression), ConflictHandlingMethod.ReportError)] - internal static class ArrayMappings - { - [Compiler(typeof(byte[]), "Length", TargetKind.PropertyGet)] - public static SqlExpression ByteArrayLength(SqlExpression _this) - { - return SqlDml.BinaryLength(_this); - } - } -} - -namespace Xtensive.Orm.Tests.Configuration -{ - [TestFixture] - public class AppConfigTest : HasConfigurationAccessTest - { - [Test] - public void CustomMemberCompilerProvidersTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain3"); - configuration.Lock(); - Assert.AreEqual(1, configuration.Types.CompilerContainers.Count()); - } - - [Test] - public void TestDomain2() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain1"); - Assert.IsNotNull(configuration); - } - - [Test] - public void TestWrongSection() - { - AssertEx.ThrowsInvalidOperationException(() => { - var configuration = LoadDomainConfiguration("AppConfigTest1", "TestDomain1"); - }); - } - - [Test] - public void TestWrongDomain() - { - AssertEx.ThrowsInvalidOperationException(() => { - var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain0"); - }); - } - - [Test] - public void BatchSizeTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain4"); - var defaultSession = configuration.Sessions[WellKnown.Sessions.Default]; - Assert.IsNotNull(defaultSession); - Assert.AreEqual(10, defaultSession.BatchSize); - var myCoolSession = configuration.Sessions["MyCoolSession"]; - Assert.IsNotNull(myCoolSession); - Assert.AreEqual(100, myCoolSession.BatchSize); - var clone = myCoolSession.Clone(); - Assert.AreEqual(100, clone.BatchSize); - } - - [Test] - public void EntityChangeRegistrySizeTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithCustomChangeRegistrySize"); - var defaultSession = configuration.Sessions[WellKnown.Sessions.Default]; - Assert.AreEqual(1000, defaultSession.EntityChangeRegistrySize); - Assert.AreEqual(1000, defaultSession.Clone().EntityChangeRegistrySize); - } - - [Test] - public void SchemaSyncExceptionFormatTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithBriefSchemaSyncExceptions"); - Assert.That(configuration.SchemaSyncExceptionFormat, Is.EqualTo(SchemaSyncExceptionFormat.Brief)); - var clone = configuration.Clone(); - Assert.That(clone.SchemaSyncExceptionFormat, Is.EqualTo(SchemaSyncExceptionFormat.Brief)); - } - - [Test] - public void ConnectionInitializationSqlTest() - { - const string expected = @"use [OtherDb]"; - var configuration = DomainConfiguration.Load(Configuration, "AppConfigTest", "DomainWithInitSql"); - Assert.That(configuration.ConnectionInitializationSql, Is.EqualTo(expected)); - var clone = configuration.Clone(); - Assert.That(clone.ConnectionInitializationSql, Is.EqualTo(expected)); - } - - [Test] - public void AdvancedMappingTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "AdvancedMappingTest"); - ValidateAdvancedMappingConfiguration(configuration); - var clone = configuration.Clone(); - ValidateAdvancedMappingConfiguration(clone); - - var bad1 = configuration.Clone(); - bad1.DefaultDatabase = null; - AssertEx.ThrowsInvalidOperationException(bad1.Lock); - - var bad2 = configuration.Clone(); - bad2.DefaultSchema = null; - AssertEx.ThrowsInvalidOperationException(bad2.Lock); - - var good = configuration.Clone(); - good.DefaultDatabase = null; - good.MappingRules.Clear(); - good.MappingRules.Map(GetType().Namespace).ToSchema("check"); - good.Lock(); - } - - private void ValidateAdvancedMappingConfiguration(DomainConfiguration configuration) - { - Assert.That(configuration.AllowCyclicDatabaseDependencies, Is.True); - Assert.That(configuration.DefaultDatabase, Is.EqualTo("main")); - - Assert.That(configuration.MappingRules.Count, Is.EqualTo(2)); - var rule1 = configuration.MappingRules[0]; - Assert.That(rule1.Namespace, Is.EqualTo("Xtensive.Orm.Tests.Configuration")); - Assert.That(rule1.Schema, Is.EqualTo("myschema")); - var rule2 = configuration.MappingRules[1]; - Assert.That(rule2.Assembly, Is.EqualTo(GetType().Assembly)); - Assert.That(rule2.Database, Is.EqualTo("other")); - - Assert.That(configuration.Databases.Count, Is.EqualTo(2)); - var alias1 = configuration.Databases[0]; - Assert.That(alias1.Name, Is.EqualTo("main")); - Assert.That(alias1.RealName, Is.EqualTo("DO40-Tests")); - var alias2 = configuration.Databases[1]; - Assert.That(alias2.Name, Is.EqualTo("other")); - Assert.That(alias2.RealName, Is.EqualTo("Other-DO40-Tests")); - - configuration.Lock(); // ensure configuration is correct - } - - [Test] - public void DotsAndHypensExclusiveOptionsTest() - { - var configuration = new DomainConfiguration(); - - const NamingRules invalidRules1 = NamingRules.UnderscoreDots | NamingRules.UnderscoreHyphens | NamingRules.RemoveDots; - const NamingRules invalidRules2 = NamingRules.RemoveDots | NamingRules.RemoveHyphens | NamingRules.UnderscoreHyphens; - const NamingRules validRules1 = NamingRules.UnderscoreHyphens | NamingRules.UnderscoreDots; - const NamingRules validRules2 = NamingRules.RemoveDots | NamingRules.RemoveHyphens; - - var convention = configuration.NamingConvention; - - AssertEx.ThrowsArgumentException(() => convention.NamingRules = invalidRules1); - AssertEx.ThrowsArgumentException(() => convention.NamingRules = invalidRules2); - - convention.NamingRules = validRules1; - convention.NamingRules = validRules2; - } - - [Test] - public void ReferencedConnectionStringTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithReferencedConnectionStrings"); - var domainConnectionString = Configuration.ConnectionStrings.ConnectionStrings["DomainConnectionString"].ConnectionString; - var sessionConnectionString = Configuration.ConnectionStrings.ConnectionStrings["SessionConnectionString"].ConnectionString; - ValidateConnectionString(domainConnectionString, configuration.ConnectionInfo); - ValidateConnectionString(sessionConnectionString, configuration.Sessions.Default.ConnectionInfo); - } - - - [Test] - public void DefaultConfigurationTest() - { - var actualDomainConfiguration = LoadDomainConfiguration("AppConfigTest", "DomainWithoutConfiguration"); - var expectedDomainConfiguration = new DomainConfiguration(); - ValidateDomainConfiguration(expectedDomainConfiguration, actualDomainConfiguration); - ValidateNamingCovention(expectedDomainConfiguration.NamingConvention, actualDomainConfiguration.NamingConvention); - ValidateSessionConfiguration(new SessionConfiguration(), actualDomainConfiguration.Sessions.Default); - } - - - [Test] - public void IgnoreRuleConfigTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "IgnoreRuleConfigTest"); - ValidateIgnoringConfiguration(configuration); - var clone = configuration.Clone(); - ValidateIgnoringConfiguration(clone); - - var good = configuration.Clone(); - good.IgnoreRules.Clear(); - good.IgnoreRules.IgnoreTable("ignored-table").WhenDatabase("Other-DO40-Test").WhenSchema("dbo"); - good.IgnoreRules.IgnoreColumn("ignored-column"); - good.Lock(); - } - - [Test] - public void LoggingConfigurationTest() - { - var configuration = LoadLoggingConfiguration("AppConfigTest"); - ValidateLoggingConfiguration(configuration); - } - - [Test] - public void FullTextChangeTrackingTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest1"); - Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Off)); - - configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest2"); - Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Auto)); - - configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest3"); - Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Manual)); - - configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest4"); - Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.OffWithNoPopulation)); - - configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest5"); - Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Default)); - } - - - private void ValidateConnectionString(string expected, ConnectionInfo actual) - { - Assert.That(actual, Is.Not.Null); - Assert.That(actual.ConnectionString, Is.EqualTo(expected)); - } - - private void ValidateSessionConfiguration(SessionConfiguration expected, SessionConfiguration actual) - { - Assert.That(actual.BatchSize, Is.EqualTo(expected.BatchSize)); - Assert.That(actual.CacheSize, Is.EqualTo(expected.CacheSize)); - Assert.That(actual.CacheType, Is.EqualTo(expected.CacheType)); - Assert.That(actual.ConnectionInfo, Is.EqualTo(expected.ConnectionInfo)); - Assert.That(actual.DefaultCommandTimeout, Is.EqualTo(expected.DefaultCommandTimeout)); - Assert.That(actual.DefaultIsolationLevel, Is.EqualTo(expected.DefaultIsolationLevel)); - Assert.That(actual.EntityChangeRegistrySize, Is.EqualTo(expected.EntityChangeRegistrySize)); - Assert.That(actual.Options, Is.EqualTo(expected.Options)); - Assert.That(actual.Password, Is.EqualTo(expected.Password)); - Assert.That(actual.ReaderPreloading, Is.EqualTo(expected.ReaderPreloading)); - Assert.That(actual.ServiceContainerType, Is.EqualTo(expected.ServiceContainerType)); - Assert.That(actual.Type, Is.EqualTo(expected.Type)); - Assert.That(actual.UserName, Is.EqualTo(expected.UserName)); - } - - private static void ValidateDomainConfiguration(DomainConfiguration expected, DomainConfiguration actual) - { - Assert.That(actual.BuildInParallel, Is.EqualTo(expected.BuildInParallel)); - Assert.That(actual.Collation, Is.EqualTo(expected.Collation)); - Assert.That(actual.ConnectionInitializationSql, Is.EqualTo(expected.ConnectionInitializationSql)); - Assert.That(actual.ConnectionInfo, Is.EqualTo(expected.ConnectionInfo)); - Assert.That(actual.DefaultDatabase, Is.EqualTo(expected.DefaultDatabase)); - Assert.That(actual.DefaultSchema, Is.EqualTo(expected.DefaultSchema)); - Assert.That(actual.ForcedServerVersion, Is.EqualTo(expected.ForcedServerVersion)); - Assert.That(actual.ForeignKeyMode, Is.EqualTo(expected.ForeignKeyMode)); - Assert.That(actual.IncludeSqlInExceptions, Is.EqualTo(expected.IncludeSqlInExceptions)); - Assert.That(actual.KeyCacheSize, Is.EqualTo(expected.KeyCacheSize)); - Assert.That(actual.KeyGeneratorCacheSize, Is.EqualTo(expected.KeyGeneratorCacheSize)); - Assert.That(actual.QueryCacheSize, Is.EqualTo(expected.QueryCacheSize)); - Assert.That(actual.RecordSetMappingCacheSize, Is.EqualTo(expected.RecordSetMappingCacheSize)); - Assert.That(actual.SchemaSyncExceptionFormat, Is.EqualTo(expected.SchemaSyncExceptionFormat)); - Assert.That(actual.ServiceContainerType, Is.EqualTo(expected.ServiceContainerType)); - Assert.That(actual.UpgradeMode, Is.EqualTo(expected.UpgradeMode)); - } - - private static void ValidateNamingCovention(NamingConvention expected, NamingConvention actual) - { - Assert.That(actual.LetterCasePolicy, Is.EqualTo(expected.LetterCasePolicy)); - Assert.That(actual.NamespacePolicy, Is.EqualTo(expected.NamespacePolicy)); - Assert.That(actual.NamingRules, Is.EqualTo(expected.NamingRules)); - } - - - [Test] - public void ShareStorageSchemaOverNodesTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaNone"); - Assert.That(configuration.ShareStorageSchemaOverNodes, Is.False); - - var clone = configuration.Clone(); - Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); - - configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaOn"); - Assert.That(configuration.ShareStorageSchemaOverNodes, Is.True); - - clone = configuration.Clone(); - Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); - - configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaOff"); - Assert.That(configuration.ShareStorageSchemaOverNodes, Is.False); - - clone = configuration.Clone(); - Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); - } - - [Test] - public void VersioningConventionTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest1"); - Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Default)); - Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(false)); - - configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest2"); - Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Default)); - - configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest3"); - Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Optimistic)); - - configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest4"); - Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Pessimistic)); - - configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest5"); - Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(true)); - - configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest6"); - Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(false)); - } - - [Test] - public void EnsureConnectionIsAliveTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveNone"); - Assert.That(configuration.EnsureConnectionIsAlive, Is.True); - - var clone = configuration.Clone(); - Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); - - configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveTrue"); - Assert.That(configuration.EnsureConnectionIsAlive, Is.True); - - clone = configuration.Clone(); - Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); - - configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveFalse"); - Assert.That(configuration.EnsureConnectionIsAlive, Is.False); - - clone = configuration.Clone(); - Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); - } - - private void ValidateLoggingConfiguration(LoggingConfiguration configuration) - { - Assert.AreEqual(string.IsNullOrEmpty(configuration.Provider), true); - - Assert.That(configuration.Logs[0].Source, Is.EqualTo("*")); - Assert.That(configuration.Logs[0].Target, Is.EqualTo("Console")); - - Assert.That(configuration.Logs[1].Source, Is.EqualTo("SomeLogName")); - Assert.That(configuration.Logs[1].Target, Is.EqualTo("DebugOnlyConsole")); - - Assert.That(configuration.Logs[2].Source, Is.EqualTo("FirstLogName,SecondLogName")); - Assert.That(configuration.Logs[2].Target, Is.EqualTo(@"d:\log.txt")); - - Assert.That(configuration.Logs[3].Source, Is.EqualTo("LogName, AnotherLogName")); - Assert.That(configuration.Logs[3].Target, Is.EqualTo("Console")); - - Assert.That(configuration.Logs[4].Source, Is.EqualTo("FileLog")); - Assert.That(configuration.Logs[4].Target, Is.EqualTo("log.txt")); - - Assert.That(configuration.Logs[5].Source, Is.EqualTo("NullLog")); - Assert.That(configuration.Logs[5].Target, Is.EqualTo("None")); - - Assert.That(configuration.Logs[6].Source, Is.EqualTo("Trash")); - Assert.That(configuration.Logs[6].Target, Is.EqualTo("skjdhfjsdf sdfsdfksjdghj fgdfg")); - } - - private void ValidateIgnoringConfiguration(DomainConfiguration configuration) - { - Assert.That(configuration.DefaultDatabase, Is.EqualTo("main")); - Assert.That(configuration.DefaultSchema, Is.EqualTo("dbo")); - Assert.That(configuration.IgnoreRules.Count, Is.EqualTo(11)); - var rule = configuration.IgnoreRules[0]; - Assert.That(rule.Database, Is.EqualTo("Other-DO40-Tests")); - var rule2 = configuration.IgnoreRules[2]; - Assert.That(rule2.Schema, Is.EqualTo("some-schema3")); - Assert.That(rule2.Table, Is.EqualTo("table2")); - Assert.That(rule2.Column, Is.EqualTo("col3")); - var databases = configuration.Databases; - Assert.That(databases.Count, Is.EqualTo(2)); - Assert.That(databases[0].Name, Is.EqualTo("main")); - Assert.That(databases[0].RealName, Is.EqualTo("DO40-Tests")); - Assert.That(databases[1].Name, Is.EqualTo("other")); - Assert.That(databases[1].RealName, Is.EqualTo("Other-DO40-Tests")); - configuration.Lock(); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.08.06 + +using System; +using System.Configuration; +using System.Linq; +using NUnit.Framework; +using Xtensive.Linq; +using Xtensive.Orm.Tests; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Configuration.UserDefinedMappings +{ + [CompilerContainer(typeof(SqlExpression), ConflictHandlingMethod.ReportError)] + internal static class ArrayMappings + { + [Compiler(typeof(byte[]), "Length", TargetKind.PropertyGet)] + public static SqlExpression ByteArrayLength(SqlExpression _this) + { + return SqlDml.BinaryLength(_this); + } + } +} + +namespace Xtensive.Orm.Tests.Configuration +{ + [TestFixture] + public class AppConfigTest : HasConfigurationAccessTest + { + [Test] + public void CustomMemberCompilerProvidersTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain3"); + configuration.Lock(); + Assert.AreEqual(1, configuration.Types.CompilerContainers.Count()); + } + + [Test] + public void TestDomain2() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain1"); + Assert.IsNotNull(configuration); + } + + [Test] + public void TestWrongSection() + { + AssertEx.ThrowsInvalidOperationException(() => { + var configuration = LoadDomainConfiguration("AppConfigTest1", "TestDomain1"); + }); + } + + [Test] + public void TestWrongDomain() + { + AssertEx.ThrowsInvalidOperationException(() => { + var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain0"); + }); + } + + [Test] + public void BatchSizeTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "TestDomain4"); + var defaultSession = configuration.Sessions[WellKnown.Sessions.Default]; + Assert.IsNotNull(defaultSession); + Assert.AreEqual(10, defaultSession.BatchSize); + var myCoolSession = configuration.Sessions["MyCoolSession"]; + Assert.IsNotNull(myCoolSession); + Assert.AreEqual(100, myCoolSession.BatchSize); + var clone = myCoolSession.Clone(); + Assert.AreEqual(100, clone.BatchSize); + } + + [Test] + public void EntityChangeRegistrySizeTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithCustomChangeRegistrySize"); + var defaultSession = configuration.Sessions[WellKnown.Sessions.Default]; + Assert.AreEqual(1000, defaultSession.EntityChangeRegistrySize); + Assert.AreEqual(1000, defaultSession.Clone().EntityChangeRegistrySize); + } + + [Test] + public void SchemaSyncExceptionFormatTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithBriefSchemaSyncExceptions"); + Assert.That(configuration.SchemaSyncExceptionFormat, Is.EqualTo(SchemaSyncExceptionFormat.Brief)); + var clone = configuration.Clone(); + Assert.That(clone.SchemaSyncExceptionFormat, Is.EqualTo(SchemaSyncExceptionFormat.Brief)); + } + + [Test] + public void ConnectionInitializationSqlTest() + { + const string expected = @"use [OtherDb]"; + var configuration = DomainConfiguration.Load(Configuration, "AppConfigTest", "DomainWithInitSql"); + Assert.That(configuration.ConnectionInitializationSql, Is.EqualTo(expected)); + var clone = configuration.Clone(); + Assert.That(clone.ConnectionInitializationSql, Is.EqualTo(expected)); + } + + [Test] + public void AdvancedMappingTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "AdvancedMappingTest"); + ValidateAdvancedMappingConfiguration(configuration); + var clone = configuration.Clone(); + ValidateAdvancedMappingConfiguration(clone); + + var bad1 = configuration.Clone(); + bad1.DefaultDatabase = null; + AssertEx.ThrowsInvalidOperationException(bad1.Lock); + + var bad2 = configuration.Clone(); + bad2.DefaultSchema = null; + AssertEx.ThrowsInvalidOperationException(bad2.Lock); + + var good = configuration.Clone(); + good.DefaultDatabase = null; + good.MappingRules.Clear(); + good.MappingRules.Map(GetType().Namespace).ToSchema("check"); + good.Lock(); + } + + private void ValidateAdvancedMappingConfiguration(DomainConfiguration configuration) + { + Assert.That(configuration.AllowCyclicDatabaseDependencies, Is.True); + Assert.That(configuration.DefaultDatabase, Is.EqualTo("main")); + + Assert.That(configuration.MappingRules.Count, Is.EqualTo(2)); + var rule1 = configuration.MappingRules[0]; + Assert.That(rule1.Namespace, Is.EqualTo("Xtensive.Orm.Tests.Configuration")); + Assert.That(rule1.Schema, Is.EqualTo("myschema")); + var rule2 = configuration.MappingRules[1]; + Assert.That(rule2.Assembly, Is.EqualTo(GetType().Assembly)); + Assert.That(rule2.Database, Is.EqualTo("other")); + + Assert.That(configuration.Databases.Count, Is.EqualTo(2)); + var alias1 = configuration.Databases[0]; + Assert.That(alias1.Name, Is.EqualTo("main")); + Assert.That(alias1.RealName, Is.EqualTo("DO40-Tests")); + var alias2 = configuration.Databases[1]; + Assert.That(alias2.Name, Is.EqualTo("other")); + Assert.That(alias2.RealName, Is.EqualTo("Other-DO40-Tests")); + + configuration.Lock(); // ensure configuration is correct + } + + [Test] + public void DotsAndHypensExclusiveOptionsTest() + { + var configuration = new DomainConfiguration(); + + const NamingRules invalidRules1 = NamingRules.UnderscoreDots | NamingRules.UnderscoreHyphens | NamingRules.RemoveDots; + const NamingRules invalidRules2 = NamingRules.RemoveDots | NamingRules.RemoveHyphens | NamingRules.UnderscoreHyphens; + const NamingRules validRules1 = NamingRules.UnderscoreHyphens | NamingRules.UnderscoreDots; + const NamingRules validRules2 = NamingRules.RemoveDots | NamingRules.RemoveHyphens; + + var convention = configuration.NamingConvention; + + AssertEx.ThrowsArgumentException(() => convention.NamingRules = invalidRules1); + AssertEx.ThrowsArgumentException(() => convention.NamingRules = invalidRules2); + + convention.NamingRules = validRules1; + convention.NamingRules = validRules2; + } + + [Test] + public void ReferencedConnectionStringTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "DomainWithReferencedConnectionStrings"); + var domainConnectionString = Configuration.ConnectionStrings.ConnectionStrings["DomainConnectionString"].ConnectionString; + var sessionConnectionString = Configuration.ConnectionStrings.ConnectionStrings["SessionConnectionString"].ConnectionString; + ValidateConnectionString(domainConnectionString, configuration.ConnectionInfo); + ValidateConnectionString(sessionConnectionString, configuration.Sessions.Default.ConnectionInfo); + } + + + [Test] + public void DefaultConfigurationTest() + { + var actualDomainConfiguration = LoadDomainConfiguration("AppConfigTest", "DomainWithoutConfiguration"); + var expectedDomainConfiguration = new DomainConfiguration(); + ValidateDomainConfiguration(expectedDomainConfiguration, actualDomainConfiguration); + ValidateNamingCovention(expectedDomainConfiguration.NamingConvention, actualDomainConfiguration.NamingConvention); + ValidateSessionConfiguration(new SessionConfiguration(), actualDomainConfiguration.Sessions.Default); + } + + + [Test] + public void IgnoreRuleConfigTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "IgnoreRuleConfigTest"); + ValidateIgnoringConfiguration(configuration); + var clone = configuration.Clone(); + ValidateIgnoringConfiguration(clone); + + var good = configuration.Clone(); + good.IgnoreRules.Clear(); + good.IgnoreRules.IgnoreTable("ignored-table").WhenDatabase("Other-DO40-Test").WhenSchema("dbo"); + good.IgnoreRules.IgnoreColumn("ignored-column"); + good.Lock(); + } + + [Test] + public void LoggingConfigurationTest() + { + var configuration = LoadLoggingConfiguration("AppConfigTest"); + ValidateLoggingConfiguration(configuration); + } + + [Test] + public void FullTextChangeTrackingTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest1"); + Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Off)); + + configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest2"); + Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Auto)); + + configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest3"); + Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Manual)); + + configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest4"); + Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.OffWithNoPopulation)); + + configuration = LoadDomainConfiguration("AppConfigTest", "ChangeTrackingTest5"); + Assert.That(configuration.FullTextChangeTrackingMode, Is.EqualTo(FullTextChangeTrackingMode.Default)); + } + + + private void ValidateConnectionString(string expected, ConnectionInfo actual) + { + Assert.That(actual, Is.Not.Null); + Assert.That(actual.ConnectionString, Is.EqualTo(expected)); + } + + private void ValidateSessionConfiguration(SessionConfiguration expected, SessionConfiguration actual) + { + Assert.That(actual.BatchSize, Is.EqualTo(expected.BatchSize)); + Assert.That(actual.CacheSize, Is.EqualTo(expected.CacheSize)); + Assert.That(actual.CacheType, Is.EqualTo(expected.CacheType)); + Assert.That(actual.ConnectionInfo, Is.EqualTo(expected.ConnectionInfo)); + Assert.That(actual.DefaultCommandTimeout, Is.EqualTo(expected.DefaultCommandTimeout)); + Assert.That(actual.DefaultIsolationLevel, Is.EqualTo(expected.DefaultIsolationLevel)); + Assert.That(actual.EntityChangeRegistrySize, Is.EqualTo(expected.EntityChangeRegistrySize)); + Assert.That(actual.Options, Is.EqualTo(expected.Options)); + Assert.That(actual.Password, Is.EqualTo(expected.Password)); + Assert.That(actual.ReaderPreloading, Is.EqualTo(expected.ReaderPreloading)); + Assert.That(actual.ServiceContainerType, Is.EqualTo(expected.ServiceContainerType)); + Assert.That(actual.Type, Is.EqualTo(expected.Type)); + Assert.That(actual.UserName, Is.EqualTo(expected.UserName)); + } + + private static void ValidateDomainConfiguration(DomainConfiguration expected, DomainConfiguration actual) + { + Assert.That(actual.BuildInParallel, Is.EqualTo(expected.BuildInParallel)); + Assert.That(actual.Collation, Is.EqualTo(expected.Collation)); + Assert.That(actual.ConnectionInitializationSql, Is.EqualTo(expected.ConnectionInitializationSql)); + Assert.That(actual.ConnectionInfo, Is.EqualTo(expected.ConnectionInfo)); + Assert.That(actual.DefaultDatabase, Is.EqualTo(expected.DefaultDatabase)); + Assert.That(actual.DefaultSchema, Is.EqualTo(expected.DefaultSchema)); + Assert.That(actual.ForcedServerVersion, Is.EqualTo(expected.ForcedServerVersion)); + Assert.That(actual.ForeignKeyMode, Is.EqualTo(expected.ForeignKeyMode)); + Assert.That(actual.IncludeSqlInExceptions, Is.EqualTo(expected.IncludeSqlInExceptions)); + Assert.That(actual.KeyCacheSize, Is.EqualTo(expected.KeyCacheSize)); + Assert.That(actual.KeyGeneratorCacheSize, Is.EqualTo(expected.KeyGeneratorCacheSize)); + Assert.That(actual.QueryCacheSize, Is.EqualTo(expected.QueryCacheSize)); + Assert.That(actual.RecordSetMappingCacheSize, Is.EqualTo(expected.RecordSetMappingCacheSize)); + Assert.That(actual.SchemaSyncExceptionFormat, Is.EqualTo(expected.SchemaSyncExceptionFormat)); + Assert.That(actual.ServiceContainerType, Is.EqualTo(expected.ServiceContainerType)); + Assert.That(actual.UpgradeMode, Is.EqualTo(expected.UpgradeMode)); + } + + private static void ValidateNamingCovention(NamingConvention expected, NamingConvention actual) + { + Assert.That(actual.LetterCasePolicy, Is.EqualTo(expected.LetterCasePolicy)); + Assert.That(actual.NamespacePolicy, Is.EqualTo(expected.NamespacePolicy)); + Assert.That(actual.NamingRules, Is.EqualTo(expected.NamingRules)); + } + + + [Test] + public void ShareStorageSchemaOverNodesTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaNone"); + Assert.That(configuration.ShareStorageSchemaOverNodes, Is.False); + + var clone = configuration.Clone(); + Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); + + configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaOn"); + Assert.That(configuration.ShareStorageSchemaOverNodes, Is.True); + + clone = configuration.Clone(); + Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); + + configuration = LoadDomainConfiguration("AppConfigTest", "SharedStorageSchemaOff"); + Assert.That(configuration.ShareStorageSchemaOverNodes, Is.False); + + clone = configuration.Clone(); + Assert.That(clone.ShareStorageSchemaOverNodes, Is.EqualTo(configuration.ShareStorageSchemaOverNodes)); + } + + [Test] + public void VersioningConventionTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest1"); + Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Default)); + Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(false)); + + configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest2"); + Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Default)); + + configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest3"); + Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Optimistic)); + + configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest4"); + Assert.That(configuration.VersioningConvention.EntityVersioningPolicy, Is.EqualTo(EntityVersioningPolicy.Pessimistic)); + + configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest5"); + Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(true)); + + configuration = LoadDomainConfiguration("AppConfigTest", "VersioningConventionTest6"); + Assert.That(configuration.VersioningConvention.DenyEntitySetOwnerVersionChange, Is.EqualTo(false)); + } + + [Test] + public void EnsureConnectionIsAliveTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveNone"); + Assert.That(configuration.EnsureConnectionIsAlive, Is.True); + + var clone = configuration.Clone(); + Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); + + configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveTrue"); + Assert.That(configuration.EnsureConnectionIsAlive, Is.True); + + clone = configuration.Clone(); + Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); + + configuration = LoadDomainConfiguration("AppConfigTest", "EnableConnectionIsAliveFalse"); + Assert.That(configuration.EnsureConnectionIsAlive, Is.False); + + clone = configuration.Clone(); + Assert.That(clone.EnsureConnectionIsAlive, Is.EqualTo(configuration.EnsureConnectionIsAlive)); + } + + private void ValidateLoggingConfiguration(LoggingConfiguration configuration) + { + Assert.AreEqual(string.IsNullOrEmpty(configuration.Provider), true); + + Assert.That(configuration.Logs[0].Source, Is.EqualTo("*")); + Assert.That(configuration.Logs[0].Target, Is.EqualTo("Console")); + + Assert.That(configuration.Logs[1].Source, Is.EqualTo("SomeLogName")); + Assert.That(configuration.Logs[1].Target, Is.EqualTo("DebugOnlyConsole")); + + Assert.That(configuration.Logs[2].Source, Is.EqualTo("FirstLogName,SecondLogName")); + Assert.That(configuration.Logs[2].Target, Is.EqualTo(@"d:\log.txt")); + + Assert.That(configuration.Logs[3].Source, Is.EqualTo("LogName, AnotherLogName")); + Assert.That(configuration.Logs[3].Target, Is.EqualTo("Console")); + + Assert.That(configuration.Logs[4].Source, Is.EqualTo("FileLog")); + Assert.That(configuration.Logs[4].Target, Is.EqualTo("log.txt")); + + Assert.That(configuration.Logs[5].Source, Is.EqualTo("NullLog")); + Assert.That(configuration.Logs[5].Target, Is.EqualTo("None")); + + Assert.That(configuration.Logs[6].Source, Is.EqualTo("Trash")); + Assert.That(configuration.Logs[6].Target, Is.EqualTo("skjdhfjsdf sdfsdfksjdghj fgdfg")); + } + + private void ValidateIgnoringConfiguration(DomainConfiguration configuration) + { + Assert.That(configuration.DefaultDatabase, Is.EqualTo("main")); + Assert.That(configuration.DefaultSchema, Is.EqualTo("dbo")); + Assert.That(configuration.IgnoreRules.Count, Is.EqualTo(11)); + var rule = configuration.IgnoreRules[0]; + Assert.That(rule.Database, Is.EqualTo("Other-DO40-Tests")); + var rule2 = configuration.IgnoreRules[2]; + Assert.That(rule2.Schema, Is.EqualTo("some-schema3")); + Assert.That(rule2.Table, Is.EqualTo("table2")); + Assert.That(rule2.Column, Is.EqualTo("col3")); + var databases = configuration.Databases; + Assert.That(databases.Count, Is.EqualTo(2)); + Assert.That(databases[0].Name, Is.EqualTo("main")); + Assert.That(databases[0].RealName, Is.EqualTo("DO40-Tests")); + Assert.That(databases[1].Name, Is.EqualTo("other")); + Assert.That(databases[1].RealName, Is.EqualTo("Other-DO40-Tests")); + configuration.Lock(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Configuration/SchemaTest.cs b/Orm/Xtensive.Orm.Tests/Configuration/SchemaTest.cs index a7c309e22d..5dccf4f593 100644 --- a/Orm/Xtensive.Orm.Tests/Configuration/SchemaTest.cs +++ b/Orm/Xtensive.Orm.Tests/Configuration/SchemaTest.cs @@ -1,118 +1,118 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.10.04 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Xml; -using System.Xml.Linq; -using System.Xml.Schema; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Configuration -{ - [TestFixture] - public class SchemaTest - { - private const string originalConfigFileName = "Xtensive.Orm.Tests.dll.config"; - private const string xsdFileName = "Xtensive.Orm.xsd"; - private const string xsdInLowerCaseFileName = "Test.xsd"; - private const string configFileName = "Test.config"; - private const string originalRootElementName = "AppConfigTest"; - private const string rootElementName = "Xtensive.Orm"; - private const string configXmlNamespace = "http://dataobjects.net/schemas/appconfig/"; - private bool hasErrors; - - [Test] - public void TestSchema() - { - hasErrors = false; - - XElement segmentConfig = XElement.Load(originalConfigFileName).Element(originalRootElementName); - Debug.Assert(segmentConfig!=null, "segmentConfig != null"); - segmentConfig.Name = rootElementName; - - foreach (XElement element in segmentConfig.DescendantsAndSelf()) - element.Name = (XNamespace) configXmlNamespace + element.Name.LocalName; - - using (StreamWriter segmentConfigWriter = File.CreateText(configFileName)) - segmentConfigWriter.Write(segmentConfig.ToString().ToLower()); - - ChangeXsdElementsToLowerCase(); - - try { - XmlReaderSettings schemaSettings = new XmlReaderSettings(); - schemaSettings.Schemas.Add(configXmlNamespace, xsdInLowerCaseFileName); - schemaSettings.ValidationType = ValidationType.Schema; - schemaSettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler); - - XmlReader configReader = XmlReader.Create(configFileName, schemaSettings); - while (configReader.Read()) { - } - configReader.Close(); - } - catch (XmlException exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - Console.WriteLine("LineNumber = {0}", exception.LineNumber); - Console.WriteLine("LinePosition = {0}", exception.LinePosition); - } - catch (XmlSchemaValidationException exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - Console.WriteLine("LineNumber = {0}", exception.LineNumber); - Console.WriteLine("LinePosition = {0}", exception.LinePosition); - } - catch (XmlSchemaException exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - Console.WriteLine("LineNumber = {0}", exception.LineNumber); - Console.WriteLine("LinePosition = {0}", exception.LinePosition); - } - catch (ArgumentNullException exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - } - catch (InvalidOperationException exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - } - catch (Exception exception) { - hasErrors = true; - Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); - } - finally { - File.Delete(configFileName); - File.Delete(xsdInLowerCaseFileName); - } - - Assert.IsFalse(hasErrors); - } - - public void ValidationHandler(object sender, ValidationEventArgs exception) - { - hasErrors = true; - Console.WriteLine("({0}) {1}: {2}", exception.Severity, exception.GetType(), exception.Message); - } - - private static void ChangeXsdElementsToLowerCase() - { - var elementsUsedInXsd = new List {"element", "complexType", "attribute", "simpleType", "restriction", "enumeration", "pattern"}; - - XNamespace namespaceXsd = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); - XElement xsdWithElementsToLowerCase = XElement.Load(xsdFileName); - - foreach (var element in elementsUsedInXsd) - foreach (var attributes in xsdWithElementsToLowerCase.Descendants(namespaceXsd + element)) - foreach (var attribute in attributes.Attributes()) - attribute.Value = attribute.Value.ToLower(); - - using (StreamWriter xElementXsdWriter = File.CreateText(xsdInLowerCaseFileName)) - xElementXsdWriter.Write(xsdWithElementsToLowerCase); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.10.04 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Schema; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Configuration +{ + [TestFixture] + public class SchemaTest + { + private const string originalConfigFileName = "Xtensive.Orm.Tests.dll.config"; + private const string xsdFileName = "Xtensive.Orm.xsd"; + private const string xsdInLowerCaseFileName = "Test.xsd"; + private const string configFileName = "Test.config"; + private const string originalRootElementName = "AppConfigTest"; + private const string rootElementName = "Xtensive.Orm"; + private const string configXmlNamespace = "http://dataobjects.net/schemas/appconfig/"; + private bool hasErrors; + + [Test] + public void TestSchema() + { + hasErrors = false; + + XElement segmentConfig = XElement.Load(originalConfigFileName).Element(originalRootElementName); + Debug.Assert(segmentConfig!=null, "segmentConfig != null"); + segmentConfig.Name = rootElementName; + + foreach (XElement element in segmentConfig.DescendantsAndSelf()) + element.Name = (XNamespace) configXmlNamespace + element.Name.LocalName; + + using (StreamWriter segmentConfigWriter = File.CreateText(configFileName)) + segmentConfigWriter.Write(segmentConfig.ToString().ToLower()); + + ChangeXsdElementsToLowerCase(); + + try { + XmlReaderSettings schemaSettings = new XmlReaderSettings(); + schemaSettings.Schemas.Add(configXmlNamespace, xsdInLowerCaseFileName); + schemaSettings.ValidationType = ValidationType.Schema; + schemaSettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler); + + XmlReader configReader = XmlReader.Create(configFileName, schemaSettings); + while (configReader.Read()) { + } + configReader.Close(); + } + catch (XmlException exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + Console.WriteLine("LineNumber = {0}", exception.LineNumber); + Console.WriteLine("LinePosition = {0}", exception.LinePosition); + } + catch (XmlSchemaValidationException exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + Console.WriteLine("LineNumber = {0}", exception.LineNumber); + Console.WriteLine("LinePosition = {0}", exception.LinePosition); + } + catch (XmlSchemaException exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + Console.WriteLine("LineNumber = {0}", exception.LineNumber); + Console.WriteLine("LinePosition = {0}", exception.LinePosition); + } + catch (ArgumentNullException exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + } + catch (InvalidOperationException exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + } + catch (Exception exception) { + hasErrors = true; + Console.WriteLine("{0}: {1}", exception.GetType(), exception.Message); + } + finally { + File.Delete(configFileName); + File.Delete(xsdInLowerCaseFileName); + } + + Assert.IsFalse(hasErrors); + } + + public void ValidationHandler(object sender, ValidationEventArgs exception) + { + hasErrors = true; + Console.WriteLine("({0}) {1}: {2}", exception.Severity, exception.GetType(), exception.Message); + } + + private static void ChangeXsdElementsToLowerCase() + { + var elementsUsedInXsd = new List {"element", "complexType", "attribute", "simpleType", "restriction", "enumeration", "pattern"}; + + XNamespace namespaceXsd = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); + XElement xsdWithElementsToLowerCase = XElement.Load(xsdFileName); + + foreach (var element in elementsUsedInXsd) + foreach (var attributes in xsdWithElementsToLowerCase.Descendants(namespaceXsd + element)) + foreach (var attribute in attributes.Attributes()) + attribute.Value = attribute.Value.ToLower(); + + using (StreamWriter xElementXsdWriter = File.CreateText(xsdInLowerCaseFileName)) + xElementXsdWriter.Write(xsdWithElementsToLowerCase); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Configuration/SessionInitializationTest.cs b/Orm/Xtensive.Orm.Tests/Configuration/SessionInitializationTest.cs index 37fc0fe241..1286c9695a 100644 --- a/Orm/Xtensive.Orm.Tests/Configuration/SessionInitializationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Configuration/SessionInitializationTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.13 - -using System; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Configuration -{ - [TestFixture] - public class SessionInitializationTest - { - [Test] - public void TestSessionCache() - { - // Default CacheType - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - TestCacheType(configuration, typeof (LruCache<,>)); - // Lru CacheType - configuration = DomainConfigurationFactory.Create(); - configuration.Sessions[WellKnown.Sessions.Default].CacheType = SessionCacheType.LruWeak; - TestCacheType(configuration, typeof (LruCache<,>)); - // Infinite CacheType - configuration = DomainConfigurationFactory.Create(); - configuration.Sessions[WellKnown.Sessions.Default].CacheType = SessionCacheType.Infinite; - TestCacheType(configuration, typeof (InfiniteCache<,>)); - } - - public void TestCacheType(DomainConfiguration config, Type expectedType) - { - var d = Domain.Build(config); - using (var s = d.OpenSession()) { - var cacheType = s.EntityStateCache.GetType(); - TestLog.Debug("Session CacheType: {0}", cacheType.Name); - Assert.IsTrue(cacheType.IsOfGenericType(expectedType)); - } - d.DisposeSafely(); - } - - [Test] - public void TestNamedConfigurations() - { - var config = DomainConfigurationFactory.Create(); - AssertEx.ThrowsInvalidOperationException(() => config.Sessions.Add(new SessionConfiguration())); - config.Sessions.Add(new SessionConfiguration("SomeName")); - AssertEx.ThrowsInvalidOperationException(() => config.Sessions.Add(new SessionConfiguration("SomeName"))); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.13 + +using System; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Configuration +{ + [TestFixture] + public class SessionInitializationTest + { + [Test] + public void TestSessionCache() + { + // Default CacheType + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + TestCacheType(configuration, typeof (LruCache<,>)); + // Lru CacheType + configuration = DomainConfigurationFactory.Create(); + configuration.Sessions[WellKnown.Sessions.Default].CacheType = SessionCacheType.LruWeak; + TestCacheType(configuration, typeof (LruCache<,>)); + // Infinite CacheType + configuration = DomainConfigurationFactory.Create(); + configuration.Sessions[WellKnown.Sessions.Default].CacheType = SessionCacheType.Infinite; + TestCacheType(configuration, typeof (InfiniteCache<,>)); + } + + public void TestCacheType(DomainConfiguration config, Type expectedType) + { + var d = Domain.Build(config); + using (var s = d.OpenSession()) { + var cacheType = s.EntityStateCache.GetType(); + TestLog.Debug("Session CacheType: {0}", cacheType.Name); + Assert.IsTrue(cacheType.IsOfGenericType(expectedType)); + } + d.DisposeSafely(); + } + + [Test] + public void TestNamedConfigurations() + { + var config = DomainConfigurationFactory.Create(); + AssertEx.ThrowsInvalidOperationException(() => config.Sessions.Add(new SessionConfiguration())); + config.Sessions.Add(new SessionConfiguration("SomeName")); + AssertEx.ThrowsInvalidOperationException(() => config.Sessions.Add(new SessionConfiguration("SomeName"))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Configuration/TypeRegistryTest.cs b/Orm/Xtensive.Orm.Tests/Configuration/TypeRegistryTest.cs index 32996b02b9..ec23029155 100644 --- a/Orm/Xtensive.Orm.Tests/Configuration/TypeRegistryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Configuration/TypeRegistryTest.cs @@ -1,134 +1,134 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2007.08.08 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.RegistryModel1; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.RegistryModel1 -{ - [Serializable] - public class A : Entity - { - } - - [Serializable] - public class B : A - { - } - - [Serializable] - public class C - { - } - - [Serializable] - public class D : A - { - } -} - -namespace Xtensive.Orm.Tests.RegistryModel2 -{ - [Serializable] - public class A : Entity - { - } - - [Serializable] - public class B : A - { - } - - [Serializable] - public class C - { - } - - [Serializable] - public class D : A - { - } -} - -namespace Xtensive.Orm.Tests.Configuration -{ - [TestFixture] - public class TypeRegistryTest - { - [Test] - public void HierarchyTest() - { - var config = new DomainConfiguration(); - var typeRegistry = config.Types; - typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); - Assert.IsTrue(typeRegistry.Contains(typeof (A))); - Assert.IsTrue(typeRegistry.Contains(typeof (B))); - Assert.IsFalse(typeRegistry.Contains(typeof (C))); - Assert.IsTrue(typeRegistry.Contains(typeof (D))); - - config = new DomainConfiguration(); - typeRegistry = config.Types; - typeRegistry.Register(typeof (B).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); - Assert.IsTrue(typeRegistry.Contains(typeof (A))); - Assert.IsTrue(typeRegistry.Contains(typeof (B))); - Assert.IsFalse(typeRegistry.Contains(typeof (C))); - Assert.IsTrue(typeRegistry.Contains(typeof (D))); - } - - [Test] - public void ContiniousRegistrationTest() - { - var config = new DomainConfiguration(); - TypeRegistry typeRegistry = config.Types; - typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); - long amount = typeRegistry.Count; - typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel2"); - Assert.Less(amount, typeRegistry.Count); - } - - [Test] - public void CloneTest() - { - var config = new DomainConfiguration(); - TypeRegistry registry1 = config.Types; - registry1.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); - var registry2 = registry1.Clone() as TypeRegistry; - Assert.IsNotNull(registry2); - Assert.AreEqual(registry1.Count, registry2.Count); - } - - [Test] - public void NamespaceFilterTest() - { - var config = new DomainConfiguration(); - var typeRegistry = config.Types; - typeRegistry.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.RegistryModel2"); - Assert.IsFalse(typeRegistry.Contains(typeof (A))); - Assert.IsFalse(typeRegistry.Contains(typeof (B))); - Assert.IsFalse(typeRegistry.Contains(typeof (C))); - Assert.IsFalse(typeRegistry.Contains(typeof (D))); - Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.A))); - Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.B))); - Assert.IsFalse(typeRegistry.Contains(typeof (RegistryModel2.C))); - Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.D))); - } - - [Test] - public void InvalidRegistrationTest() - { - var config = new DomainConfiguration(); - var types = config.Types; - AssertEx.ThrowsArgumentNullException(() => types.Register((Assembly) null)); - AssertEx.ThrowsArgumentNullException(() => types.Register((Assembly) null, "Xtensive.Orm.Tests.RegistryModel1")); - AssertEx.ThrowsArgumentException(() => types.Register(Assembly.GetExecutingAssembly(), "")); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2007.08.08 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.RegistryModel1; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.RegistryModel1 +{ + [Serializable] + public class A : Entity + { + } + + [Serializable] + public class B : A + { + } + + [Serializable] + public class C + { + } + + [Serializable] + public class D : A + { + } +} + +namespace Xtensive.Orm.Tests.RegistryModel2 +{ + [Serializable] + public class A : Entity + { + } + + [Serializable] + public class B : A + { + } + + [Serializable] + public class C + { + } + + [Serializable] + public class D : A + { + } +} + +namespace Xtensive.Orm.Tests.Configuration +{ + [TestFixture] + public class TypeRegistryTest + { + [Test] + public void HierarchyTest() + { + var config = new DomainConfiguration(); + var typeRegistry = config.Types; + typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); + Assert.IsTrue(typeRegistry.Contains(typeof (A))); + Assert.IsTrue(typeRegistry.Contains(typeof (B))); + Assert.IsFalse(typeRegistry.Contains(typeof (C))); + Assert.IsTrue(typeRegistry.Contains(typeof (D))); + + config = new DomainConfiguration(); + typeRegistry = config.Types; + typeRegistry.Register(typeof (B).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); + Assert.IsTrue(typeRegistry.Contains(typeof (A))); + Assert.IsTrue(typeRegistry.Contains(typeof (B))); + Assert.IsFalse(typeRegistry.Contains(typeof (C))); + Assert.IsTrue(typeRegistry.Contains(typeof (D))); + } + + [Test] + public void ContiniousRegistrationTest() + { + var config = new DomainConfiguration(); + TypeRegistry typeRegistry = config.Types; + typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); + long amount = typeRegistry.Count; + typeRegistry.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel2"); + Assert.Less(amount, typeRegistry.Count); + } + + [Test] + public void CloneTest() + { + var config = new DomainConfiguration(); + TypeRegistry registry1 = config.Types; + registry1.Register(typeof (A).Assembly, "Xtensive.Orm.Tests.RegistryModel1"); + var registry2 = registry1.Clone() as TypeRegistry; + Assert.IsNotNull(registry2); + Assert.AreEqual(registry1.Count, registry2.Count); + } + + [Test] + public void NamespaceFilterTest() + { + var config = new DomainConfiguration(); + var typeRegistry = config.Types; + typeRegistry.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.RegistryModel2"); + Assert.IsFalse(typeRegistry.Contains(typeof (A))); + Assert.IsFalse(typeRegistry.Contains(typeof (B))); + Assert.IsFalse(typeRegistry.Contains(typeof (C))); + Assert.IsFalse(typeRegistry.Contains(typeof (D))); + Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.A))); + Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.B))); + Assert.IsFalse(typeRegistry.Contains(typeof (RegistryModel2.C))); + Assert.IsTrue(typeRegistry.Contains(typeof (RegistryModel2.D))); + } + + [Test] + public void InvalidRegistrationTest() + { + var config = new DomainConfiguration(); + var types = config.Types; + AssertEx.ThrowsArgumentNullException(() => types.Register((Assembly) null)); + AssertEx.ThrowsArgumentNullException(() => types.Register((Assembly) null, "Xtensive.Orm.Tests.RegistryModel1")); + AssertEx.ThrowsArgumentException(() => types.Register(Assembly.GetExecutingAssembly(), "")); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/DomainConfigurationFactoryTest.cs b/Orm/Xtensive.Orm.Tests/DomainConfigurationFactoryTest.cs index c2ef763796..8a27739fd2 100644 --- a/Orm/Xtensive.Orm.Tests/DomainConfigurationFactoryTest.cs +++ b/Orm/Xtensive.Orm.Tests/DomainConfigurationFactoryTest.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.05.19 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests -{ - [TestFixture] - public class DomainConfigurationFactoryTest - { - // ReSharper disable LocalizableElement - - [Test] - public void MainTest() - { - Console.WriteLine("Is64BitProcess: {0}", Environment.Is64BitProcess); - Console.WriteLine(); - - var urlConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; - Console.WriteLine("ConnectionURL: {0}", urlConnectionInfo); - Console.WriteLine(); - - var stringConnectionInfo = DomainConfigurationFactory.CreateForConnectionStringTest().ConnectionInfo; - Console.WriteLine("ConnectionString: {0}", stringConnectionInfo); - Console.WriteLine(); - - var driver = TestSqlDriver.Create(urlConnectionInfo); - var providerInfo = ProviderInfoBuilder.Build(urlConnectionInfo.Provider, driver); - - Console.WriteLine("Features: {0}", providerInfo.ProviderFeatures); - } - - // ReSharper restore LocalizableElement - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.05.19 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests +{ + [TestFixture] + public class DomainConfigurationFactoryTest + { + // ReSharper disable LocalizableElement + + [Test] + public void MainTest() + { + Console.WriteLine("Is64BitProcess: {0}", Environment.Is64BitProcess); + Console.WriteLine(); + + var urlConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; + Console.WriteLine("ConnectionURL: {0}", urlConnectionInfo); + Console.WriteLine(); + + var stringConnectionInfo = DomainConfigurationFactory.CreateForConnectionStringTest().ConnectionInfo; + Console.WriteLine("ConnectionString: {0}", stringConnectionInfo); + Console.WriteLine(); + + var driver = TestSqlDriver.Create(urlConnectionInfo); + var providerInfo = ProviderInfoBuilder.Build(urlConnectionInfo.Provider, driver); + + Console.WriteLine("Features: {0}", providerInfo.ProviderFeatures); + } + + // ReSharper restore LocalizableElement + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Indexing/ForeignKeyInfoTest.cs b/Orm/Xtensive.Orm.Tests/Indexing/ForeignKeyInfoTest.cs index 4f03a93fd7..89b023b30e 100644 --- a/Orm/Xtensive.Orm.Tests/Indexing/ForeignKeyInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Indexing/ForeignKeyInfoTest.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Upgrade.Model; -using NUnit.Framework; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Indexing -{ - [TestFixture] - public class ForeignKeyInfoTest - { - private StorageModel storage; - private TableInfo referencingTable; - private SecondaryIndexInfo referencingIndex; - private SecondaryIndexInfo invalideReferencingIndex; - - private TableInfo referencedTable; - private PrimaryIndexInfo foreignPrimary; - - [SetUp] - public void BuildStorageModel() - { - storage = new StorageModel("storage"); - referencingTable = new TableInfo(storage, "referencingTable"); - var pkColumn = new StorageColumnInfo(referencingTable, "Id", new StorageTypeInfo(typeof (int), null)); - var fkColumn = new StorageColumnInfo(referencingTable, "foreignId", new StorageTypeInfo(typeof (int?), null)); - var fkColumn2 = new StorageColumnInfo(referencingTable, "invalideForeignId", new StorageTypeInfo(typeof (string), null)); - var primaryKey = new PrimaryIndexInfo(referencingTable, "PK1"); - new KeyColumnRef(primaryKey, pkColumn); - referencingIndex = new SecondaryIndexInfo(referencingTable, "FK"); - new KeyColumnRef(referencingIndex, fkColumn); - referencingIndex.PopulatePrimaryKeyColumns(); - invalideReferencingIndex = new SecondaryIndexInfo(referencingTable, "FK2"); - invalideReferencingIndex.PopulatePrimaryKeyColumns(); - new KeyColumnRef(invalideReferencingIndex, fkColumn2); - primaryKey.PopulateValueColumns(); - - referencedTable = new TableInfo(storage, "referencedTable"); - pkColumn = new StorageColumnInfo(referencedTable, "Id", new StorageTypeInfo(typeof (int), null)); - foreignPrimary = new PrimaryIndexInfo(referencedTable, "Id"); - new KeyColumnRef(foreignPrimary, pkColumn); - } - - [Test] - public void ForeignKeyValidationTest() - { - storage.Validate(); - - var foreignKey = new ForeignKeyInfo(referencingTable, "ForeignKey"); - AssertEx.Throws(foreignKey.Validate); - foreignKey.PrimaryKey = foreignPrimary; - AssertEx.Throws(foreignKey.Validate); - - foreignKey.ForeignKeyColumns.Set(invalideReferencingIndex); - AssertEx.Throws(foreignKey.Validate); - foreignKey.ForeignKeyColumns.Set(referencingIndex); - foreignKey.Validate(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Upgrade.Model; +using NUnit.Framework; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Indexing +{ + [TestFixture] + public class ForeignKeyInfoTest + { + private StorageModel storage; + private TableInfo referencingTable; + private SecondaryIndexInfo referencingIndex; + private SecondaryIndexInfo invalideReferencingIndex; + + private TableInfo referencedTable; + private PrimaryIndexInfo foreignPrimary; + + [SetUp] + public void BuildStorageModel() + { + storage = new StorageModel("storage"); + referencingTable = new TableInfo(storage, "referencingTable"); + var pkColumn = new StorageColumnInfo(referencingTable, "Id", new StorageTypeInfo(typeof (int), null)); + var fkColumn = new StorageColumnInfo(referencingTable, "foreignId", new StorageTypeInfo(typeof (int?), null)); + var fkColumn2 = new StorageColumnInfo(referencingTable, "invalideForeignId", new StorageTypeInfo(typeof (string), null)); + var primaryKey = new PrimaryIndexInfo(referencingTable, "PK1"); + new KeyColumnRef(primaryKey, pkColumn); + referencingIndex = new SecondaryIndexInfo(referencingTable, "FK"); + new KeyColumnRef(referencingIndex, fkColumn); + referencingIndex.PopulatePrimaryKeyColumns(); + invalideReferencingIndex = new SecondaryIndexInfo(referencingTable, "FK2"); + invalideReferencingIndex.PopulatePrimaryKeyColumns(); + new KeyColumnRef(invalideReferencingIndex, fkColumn2); + primaryKey.PopulateValueColumns(); + + referencedTable = new TableInfo(storage, "referencedTable"); + pkColumn = new StorageColumnInfo(referencedTable, "Id", new StorageTypeInfo(typeof (int), null)); + foreignPrimary = new PrimaryIndexInfo(referencedTable, "Id"); + new KeyColumnRef(foreignPrimary, pkColumn); + } + + [Test] + public void ForeignKeyValidationTest() + { + storage.Validate(); + + var foreignKey = new ForeignKeyInfo(referencingTable, "ForeignKey"); + AssertEx.Throws(foreignKey.Validate); + foreignKey.PrimaryKey = foreignPrimary; + AssertEx.Throws(foreignKey.Validate); + + foreignKey.ForeignKeyColumns.Set(invalideReferencingIndex); + AssertEx.Throws(foreignKey.Validate); + foreignKey.ForeignKeyColumns.Set(referencingIndex); + foreignKey.Validate(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Indexing/PrimaryIndexInfoTest.cs b/Orm/Xtensive.Orm.Tests/Indexing/PrimaryIndexInfoTest.cs index a1d812804e..7e1901b962 100644 --- a/Orm/Xtensive.Orm.Tests/Indexing/PrimaryIndexInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Indexing/PrimaryIndexInfoTest.cs @@ -1,149 +1,149 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.17 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Upgrade.Model; -using AggregateException = Xtensive.Core.AggregateException; - -namespace Xtensive.Orm.Tests.Indexing -{ - [TestFixture] - public class PrimaryIndexInfoTest - { - private StorageModel storage; - private TableInfo table; - private PrimaryIndexInfo index; - - [SetUp] - public void CreateStorage() - { - storage = new StorageModel("s1"); - table = new TableInfo(storage, "table"); - index = new PrimaryIndexInfo(table, "i"); - } - - [Test] - public void DenyIndexInfoConstructor() - { - var indexBefore = table.PrimaryIndex; - AssertEx.Throws(() => new PrimaryIndexInfo(null, "i2")); - AssertEx.Throws(() => new PrimaryIndexInfo(table, "")); - Assert.AreEqual(indexBefore, table.PrimaryIndex); - } - - [Test] - public void AddRemoveColumnsTest() - { - var column = new StorageColumnInfo(table, "c"); - Assert.AreEqual(1, table.Columns.Count); - column.Remove(); - Assert.AreEqual(0, table.Columns.Count); - } - - [Test] - public void DenyAddColumnTest() - { - var column = new StorageColumnInfo(table, "c"); - AssertEx.Throws(() => new StorageColumnInfo(table, "c")); - } - - [Test] - public void AddRemoveKeyColumnRefs() - { - var column = new StorageColumnInfo(table, "col1"); - var colRef = new KeyColumnRef(index, column, Direction.Positive); - Assert.AreEqual(1, index.KeyColumns.Count); - colRef.Remove(); - Assert.AreEqual(0, index.KeyColumns.Count); - column.Remove(); - } - - [Test] - public void AddRemoveValueColumnRefs() - { - var column = new StorageColumnInfo(table, "col1"); - var colRef = new ValueColumnRef(index, column); - Assert.AreEqual(1, index.ValueColumns.Count); - colRef.Remove(); - Assert.AreEqual(0, index.ValueColumns.Count); - } - - [Test] - public void ValidateEmptyKeys() - { - new StorageColumnInfo(table, "c1", new StorageTypeInfo(typeof(string), null)); - new StorageColumnInfo(table, "c2", new StorageTypeInfo(typeof(string), null)); - - AssertEx.Throws(index.Validate); - } - - [Test] - public void ValidateNullableKeyColumns() - { - var col = new StorageColumnInfo(table, "c2", new StorageTypeInfo(typeof (string), null, true)); - new KeyColumnRef(index, col, Direction.Positive); - - AssertEx.Throws(index.Validate); - } - - [Test] - public void ValidateDoubleColumnRefs() - { - var column = new StorageColumnInfo(table, "c"); - new KeyColumnRef(index, column, Direction.Positive); - new ValueColumnRef(index, column); - - AssertEx.Throws(index.Validate); - } - - [Test] - public void ValidateNotReferencedColumns() - { - new KeyColumnRef(index, new StorageColumnInfo(table, "key"), Direction.Positive); - new StorageColumnInfo(table, "col"); - - AssertEx.Throws(index.Validate); - } - - [Test] - public void ValidateDoubleKeysAndValuesColumnRefs() - { - var key = new StorageColumnInfo(table, "key"); - var value = new StorageColumnInfo(table, "value"); - new KeyColumnRef(index, key, Direction.Positive); - new KeyColumnRef(index, key, Direction.Negative); - new ValueColumnRef(index, value); - new ValueColumnRef(index, value); - - AssertEx.Throws(index.Validate); - } - - [Test] - public void ValidateRefToColumnFromAnotherIndex() - { - var anoterTable = new TableInfo(storage, "t2"); - var key = new StorageColumnInfo(anoterTable, "key"); - var value = new StorageColumnInfo(anoterTable, "value"); - - new KeyColumnRef(index, key, Direction.Positive); - new ValueColumnRef(index, value); - - AssertEx.Throws(index.Validate); - } - - - [TearDown] - public void Dump() - { - storage.Dump(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.17 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Upgrade.Model; +using AggregateException = Xtensive.Core.AggregateException; + +namespace Xtensive.Orm.Tests.Indexing +{ + [TestFixture] + public class PrimaryIndexInfoTest + { + private StorageModel storage; + private TableInfo table; + private PrimaryIndexInfo index; + + [SetUp] + public void CreateStorage() + { + storage = new StorageModel("s1"); + table = new TableInfo(storage, "table"); + index = new PrimaryIndexInfo(table, "i"); + } + + [Test] + public void DenyIndexInfoConstructor() + { + var indexBefore = table.PrimaryIndex; + AssertEx.Throws(() => new PrimaryIndexInfo(null, "i2")); + AssertEx.Throws(() => new PrimaryIndexInfo(table, "")); + Assert.AreEqual(indexBefore, table.PrimaryIndex); + } + + [Test] + public void AddRemoveColumnsTest() + { + var column = new StorageColumnInfo(table, "c"); + Assert.AreEqual(1, table.Columns.Count); + column.Remove(); + Assert.AreEqual(0, table.Columns.Count); + } + + [Test] + public void DenyAddColumnTest() + { + var column = new StorageColumnInfo(table, "c"); + AssertEx.Throws(() => new StorageColumnInfo(table, "c")); + } + + [Test] + public void AddRemoveKeyColumnRefs() + { + var column = new StorageColumnInfo(table, "col1"); + var colRef = new KeyColumnRef(index, column, Direction.Positive); + Assert.AreEqual(1, index.KeyColumns.Count); + colRef.Remove(); + Assert.AreEqual(0, index.KeyColumns.Count); + column.Remove(); + } + + [Test] + public void AddRemoveValueColumnRefs() + { + var column = new StorageColumnInfo(table, "col1"); + var colRef = new ValueColumnRef(index, column); + Assert.AreEqual(1, index.ValueColumns.Count); + colRef.Remove(); + Assert.AreEqual(0, index.ValueColumns.Count); + } + + [Test] + public void ValidateEmptyKeys() + { + new StorageColumnInfo(table, "c1", new StorageTypeInfo(typeof(string), null)); + new StorageColumnInfo(table, "c2", new StorageTypeInfo(typeof(string), null)); + + AssertEx.Throws(index.Validate); + } + + [Test] + public void ValidateNullableKeyColumns() + { + var col = new StorageColumnInfo(table, "c2", new StorageTypeInfo(typeof (string), null, true)); + new KeyColumnRef(index, col, Direction.Positive); + + AssertEx.Throws(index.Validate); + } + + [Test] + public void ValidateDoubleColumnRefs() + { + var column = new StorageColumnInfo(table, "c"); + new KeyColumnRef(index, column, Direction.Positive); + new ValueColumnRef(index, column); + + AssertEx.Throws(index.Validate); + } + + [Test] + public void ValidateNotReferencedColumns() + { + new KeyColumnRef(index, new StorageColumnInfo(table, "key"), Direction.Positive); + new StorageColumnInfo(table, "col"); + + AssertEx.Throws(index.Validate); + } + + [Test] + public void ValidateDoubleKeysAndValuesColumnRefs() + { + var key = new StorageColumnInfo(table, "key"); + var value = new StorageColumnInfo(table, "value"); + new KeyColumnRef(index, key, Direction.Positive); + new KeyColumnRef(index, key, Direction.Negative); + new ValueColumnRef(index, value); + new ValueColumnRef(index, value); + + AssertEx.Throws(index.Validate); + } + + [Test] + public void ValidateRefToColumnFromAnotherIndex() + { + var anoterTable = new TableInfo(storage, "t2"); + var key = new StorageColumnInfo(anoterTable, "key"); + var value = new StorageColumnInfo(anoterTable, "value"); + + new KeyColumnRef(index, key, Direction.Positive); + new ValueColumnRef(index, value); + + AssertEx.Throws(index.Validate); + } + + + [TearDown] + public void Dump() + { + storage.Dump(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Indexing/SecondaryIndexInfoTest.cs b/Orm/Xtensive.Orm.Tests/Indexing/SecondaryIndexInfoTest.cs index 0dbd668d92..adf2089c20 100644 --- a/Orm/Xtensive.Orm.Tests/Indexing/SecondaryIndexInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Indexing/SecondaryIndexInfoTest.cs @@ -1,98 +1,98 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Upgrade.Model; -using AggregateException = Xtensive.Core.AggregateException; - -namespace Xtensive.Orm.Tests.Indexing -{ - [TestFixture] - public class SecondaryIndexInfoTest - { - private StorageModel storage; - private TableInfo table; - private PrimaryIndexInfo primary; - private SecondaryIndexInfo secondary; - private StorageColumnInfo primaryKey; - private StorageColumnInfo primaryValue1; - private StorageColumnInfo primaryValue2; - - [SetUp] - public void CreateModel() - { - storage = new StorageModel("storage1"); - table = new TableInfo(storage, "table"); - primary = new PrimaryIndexInfo(table, "primary1"); - secondary = new SecondaryIndexInfo(table, "secondary1"); - primaryKey = new StorageColumnInfo(table, "key", new StorageTypeInfo(typeof(int), null)); - primaryValue1 = new StorageColumnInfo(table, "value1", new StorageTypeInfo(typeof(int), null)); - primaryValue2 = new StorageColumnInfo(table, "value2", new StorageTypeInfo(typeof(int), null)); - new KeyColumnRef(primary, primaryKey, Direction.Positive); - new ValueColumnRef(primary, primaryValue1); - new ValueColumnRef(primary, primaryValue2); - } - - [Test] - public void ConstructorTest() - { - var coutBefore = table.SecondaryIndexes.Count; - new SecondaryIndexInfo(table, "secondary2"); - Assert.AreEqual(coutBefore + 1, table.SecondaryIndexes.Count); - } - - [Test] - public void DenyConstructor() - { - int countBefore = table.SecondaryIndexes.Count; - AssertEx.Throws(() => new SecondaryIndexInfo(null, "secondary2")); - AssertEx.Throws(() => new SecondaryIndexInfo(table, "")); - Assert.AreEqual(countBefore, table.SecondaryIndexes.Count); - } - - [Test] - public void AddRemoveKeyColumnsTest() - { - new KeyColumnRef(secondary, primaryValue1, Direction.Negative); - new KeyColumnRef(secondary, primaryValue2, Direction.Negative); - Assert.AreEqual(2, secondary.KeyColumns.Count); - Dump(); - secondary.KeyColumns[0].Remove(); - Assert.AreEqual(1, secondary.KeyColumns.Count); - } - - [Test] - public void ValidateEmptyKey() - { - AssertEx.Throws(secondary.Validate); - } - - [Test] - public void ValidateDoubleKeys() - { - new KeyColumnRef(secondary, primaryValue1, Direction.Negative); - new KeyColumnRef(secondary, primaryValue1, Direction.Positive); - - AssertEx.Throws(secondary.Validate); - } - - [Test] - public void ValidateKeyIsNotPrimaryValue() - { - new KeyColumnRef(secondary, primaryKey, Direction.Positive); - } - - [TearDown] - public void Dump() - { - storage.Dump(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Upgrade.Model; +using AggregateException = Xtensive.Core.AggregateException; + +namespace Xtensive.Orm.Tests.Indexing +{ + [TestFixture] + public class SecondaryIndexInfoTest + { + private StorageModel storage; + private TableInfo table; + private PrimaryIndexInfo primary; + private SecondaryIndexInfo secondary; + private StorageColumnInfo primaryKey; + private StorageColumnInfo primaryValue1; + private StorageColumnInfo primaryValue2; + + [SetUp] + public void CreateModel() + { + storage = new StorageModel("storage1"); + table = new TableInfo(storage, "table"); + primary = new PrimaryIndexInfo(table, "primary1"); + secondary = new SecondaryIndexInfo(table, "secondary1"); + primaryKey = new StorageColumnInfo(table, "key", new StorageTypeInfo(typeof(int), null)); + primaryValue1 = new StorageColumnInfo(table, "value1", new StorageTypeInfo(typeof(int), null)); + primaryValue2 = new StorageColumnInfo(table, "value2", new StorageTypeInfo(typeof(int), null)); + new KeyColumnRef(primary, primaryKey, Direction.Positive); + new ValueColumnRef(primary, primaryValue1); + new ValueColumnRef(primary, primaryValue2); + } + + [Test] + public void ConstructorTest() + { + var coutBefore = table.SecondaryIndexes.Count; + new SecondaryIndexInfo(table, "secondary2"); + Assert.AreEqual(coutBefore + 1, table.SecondaryIndexes.Count); + } + + [Test] + public void DenyConstructor() + { + int countBefore = table.SecondaryIndexes.Count; + AssertEx.Throws(() => new SecondaryIndexInfo(null, "secondary2")); + AssertEx.Throws(() => new SecondaryIndexInfo(table, "")); + Assert.AreEqual(countBefore, table.SecondaryIndexes.Count); + } + + [Test] + public void AddRemoveKeyColumnsTest() + { + new KeyColumnRef(secondary, primaryValue1, Direction.Negative); + new KeyColumnRef(secondary, primaryValue2, Direction.Negative); + Assert.AreEqual(2, secondary.KeyColumns.Count); + Dump(); + secondary.KeyColumns[0].Remove(); + Assert.AreEqual(1, secondary.KeyColumns.Count); + } + + [Test] + public void ValidateEmptyKey() + { + AssertEx.Throws(secondary.Validate); + } + + [Test] + public void ValidateDoubleKeys() + { + new KeyColumnRef(secondary, primaryValue1, Direction.Negative); + new KeyColumnRef(secondary, primaryValue1, Direction.Positive); + + AssertEx.Throws(secondary.Validate); + } + + [Test] + public void ValidateKeyIsNotPrimaryValue() + { + new KeyColumnRef(secondary, primaryKey, Direction.Positive); + } + + [TearDown] + public void Dump() + { + storage.Dump(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Indexing/StorageActionTest.cs b/Orm/Xtensive.Orm.Tests/Indexing/StorageActionTest.cs index ddcc7eff5e..ac5e57b837 100644 --- a/Orm/Xtensive.Orm.Tests/Indexing/StorageActionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Indexing/StorageActionTest.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Modelling.Actions; -using Xtensive.Orm.Upgrade.Model; - -namespace Xtensive.Orm.Tests.Indexing -{ - [TestFixture] - public class StorageActionTest - { - private StorageModel storage; - private TableInfo table; - private PrimaryIndexInfo primary; - private SecondaryIndexInfo secondary; - private StorageColumnInfo primaryKey; - private StorageColumnInfo primaryValue1; - private StorageColumnInfo primaryValue2; - - [SetUp] - public void CreateModel() - { - storage = new StorageModel("STORAGE") { Actions = new ActionSequence() }; - table = new TableInfo(storage, "TABLE"); - primary = new PrimaryIndexInfo(table, "PK"); - secondary = new SecondaryIndexInfo(table, "IX"); - primaryKey = new StorageColumnInfo(table, "ID", new StorageTypeInfo(typeof(int), null)); - primaryValue1 = new StorageColumnInfo(table, "AGE", new StorageTypeInfo(typeof(int), null)); - primaryValue2 = new StorageColumnInfo(table, "NAME", new StorageTypeInfo(typeof(int), null)); - new KeyColumnRef(primary, primaryKey, Direction.Positive); - new ValueColumnRef(primary, primaryValue1); - new ValueColumnRef(primary, primaryValue2); - new KeyColumnRef(secondary, primaryValue1, Direction.Positive); - - storage.Dump(); - } - - [Test] - public void ApplyActionsTest() - { - var newStorage = new StorageModel("STORAGE") { Actions = new ActionSequence() }; - TestLog.Info("Actions: \n{0}", storage.Actions); - storage.Actions.Apply(newStorage); - newStorage.Dump(); - storage.Actions = new ActionSequence(); - primaryValue1.Type = new StorageTypeInfo(typeof(string), null); - storage.Actions.Apply(newStorage); - newStorage.Dump(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Modelling.Actions; +using Xtensive.Orm.Upgrade.Model; + +namespace Xtensive.Orm.Tests.Indexing +{ + [TestFixture] + public class StorageActionTest + { + private StorageModel storage; + private TableInfo table; + private PrimaryIndexInfo primary; + private SecondaryIndexInfo secondary; + private StorageColumnInfo primaryKey; + private StorageColumnInfo primaryValue1; + private StorageColumnInfo primaryValue2; + + [SetUp] + public void CreateModel() + { + storage = new StorageModel("STORAGE") { Actions = new ActionSequence() }; + table = new TableInfo(storage, "TABLE"); + primary = new PrimaryIndexInfo(table, "PK"); + secondary = new SecondaryIndexInfo(table, "IX"); + primaryKey = new StorageColumnInfo(table, "ID", new StorageTypeInfo(typeof(int), null)); + primaryValue1 = new StorageColumnInfo(table, "AGE", new StorageTypeInfo(typeof(int), null)); + primaryValue2 = new StorageColumnInfo(table, "NAME", new StorageTypeInfo(typeof(int), null)); + new KeyColumnRef(primary, primaryKey, Direction.Positive); + new ValueColumnRef(primary, primaryValue1); + new ValueColumnRef(primary, primaryValue2); + new KeyColumnRef(secondary, primaryValue1, Direction.Positive); + + storage.Dump(); + } + + [Test] + public void ApplyActionsTest() + { + var newStorage = new StorageModel("STORAGE") { Actions = new ActionSequence() }; + TestLog.Info("Actions: \n{0}", storage.Actions); + storage.Actions.Apply(newStorage); + newStorage.Dump(); + storage.Actions = new ActionSequence(); + primaryValue1.Type = new StorageTypeInfo(typeof(string), null); + storage.Actions.Apply(newStorage); + newStorage.Dump(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Indexing/StorageInfoTest.cs b/Orm/Xtensive.Orm.Tests/Indexing/StorageInfoTest.cs index 16bcbaaa6b..40c59b0805 100644 --- a/Orm/Xtensive.Orm.Tests/Indexing/StorageInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Indexing/StorageInfoTest.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.17 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Modelling.Actions; -using Xtensive.Orm.Upgrade.Model; -using AggregateException = Xtensive.Core.AggregateException; - -namespace Xtensive.Orm.Tests.Indexing -{ - [TestFixture] - public class StorageInfoTest - { - protected StorageModel storage; - protected TableInfo table1; - protected TableInfo table2; - protected PrimaryIndexInfo pi1; - protected PrimaryIndexInfo pi2; - protected SecondaryIndexInfo si1; - protected SecondaryIndexInfo si2; - protected ForeignKeyInfo fk1; - protected StorageColumnInfo column1; - protected StorageColumnInfo column2; - protected StorageColumnInfo column3; - protected StorageColumnInfo column4; - protected StorageColumnInfo column5; - - [SetUp] - public void CreateModel() - { - storage = new StorageModel("storage") { Actions = new ActionSequence() }; - // Table 1 - table1 = new TableInfo(storage, "table1"); - pi1 = new PrimaryIndexInfo(table1, "pk1"); - column1 = new StorageColumnInfo(table1, "col1", new StorageTypeInfo(typeof(string), null, false)); - column2 = new StorageColumnInfo(table1, "col2", new StorageTypeInfo(typeof(string), null)); - column3 = new StorageColumnInfo(table1, "col3", new StorageTypeInfo(typeof(string), null)); - new KeyColumnRef(pi1, column1, Direction.Positive); - pi1.PopulateValueColumns(); - si1 = new SecondaryIndexInfo(table1, "ix1"); - new KeyColumnRef(si1, column2, Direction.Positive); - si1.PopulatePrimaryKeyColumns(); - - // Table 2 - table2 = new TableInfo(storage, "table2"); - pi2 = new PrimaryIndexInfo(table2, "pk2"); - column4 = new StorageColumnInfo(table2, "col4", new StorageTypeInfo(typeof(int), null)); - column5 = new StorageColumnInfo(table2, "col5", new StorageTypeInfo(typeof(string), null)); - new KeyColumnRef(pi2, column4, Direction.Negative); - pi2.PopulateValueColumns(); - si2 = new SecondaryIndexInfo(table2, "ix2"); - new KeyColumnRef(si2, column5, Direction.Positive); - si2.PopulatePrimaryKeyColumns(); - - // Foreign keys - fk1 = new ForeignKeyInfo(table2, "fk1") - { - PrimaryKey = pi1 - }; - fk1.ForeignKeyColumns.Set(si2); - } - - [Test] - public void ValidateModel() - { - storage.Validate(); - } - - [Test] - public void StorageLogTest() - { - TestLog.Info("Actions:"); - TestLog.Info("{0}", storage.Actions); - } - - [Test] - public void RemoveReferencedColumnTest() - { - column5.Remove(); - AssertEx.Throws(storage.Validate); - } - - [Test] - public void RemoveReferencedSecondaryIndexTest() - { - column5.Remove(); - si2.Remove(); - AssertEx.Throws(storage.Validate); - } - - [TearDown] - public void Dump() - { - storage.Dump(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.17 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Modelling.Actions; +using Xtensive.Orm.Upgrade.Model; +using AggregateException = Xtensive.Core.AggregateException; + +namespace Xtensive.Orm.Tests.Indexing +{ + [TestFixture] + public class StorageInfoTest + { + protected StorageModel storage; + protected TableInfo table1; + protected TableInfo table2; + protected PrimaryIndexInfo pi1; + protected PrimaryIndexInfo pi2; + protected SecondaryIndexInfo si1; + protected SecondaryIndexInfo si2; + protected ForeignKeyInfo fk1; + protected StorageColumnInfo column1; + protected StorageColumnInfo column2; + protected StorageColumnInfo column3; + protected StorageColumnInfo column4; + protected StorageColumnInfo column5; + + [SetUp] + public void CreateModel() + { + storage = new StorageModel("storage") { Actions = new ActionSequence() }; + // Table 1 + table1 = new TableInfo(storage, "table1"); + pi1 = new PrimaryIndexInfo(table1, "pk1"); + column1 = new StorageColumnInfo(table1, "col1", new StorageTypeInfo(typeof(string), null, false)); + column2 = new StorageColumnInfo(table1, "col2", new StorageTypeInfo(typeof(string), null)); + column3 = new StorageColumnInfo(table1, "col3", new StorageTypeInfo(typeof(string), null)); + new KeyColumnRef(pi1, column1, Direction.Positive); + pi1.PopulateValueColumns(); + si1 = new SecondaryIndexInfo(table1, "ix1"); + new KeyColumnRef(si1, column2, Direction.Positive); + si1.PopulatePrimaryKeyColumns(); + + // Table 2 + table2 = new TableInfo(storage, "table2"); + pi2 = new PrimaryIndexInfo(table2, "pk2"); + column4 = new StorageColumnInfo(table2, "col4", new StorageTypeInfo(typeof(int), null)); + column5 = new StorageColumnInfo(table2, "col5", new StorageTypeInfo(typeof(string), null)); + new KeyColumnRef(pi2, column4, Direction.Negative); + pi2.PopulateValueColumns(); + si2 = new SecondaryIndexInfo(table2, "ix2"); + new KeyColumnRef(si2, column5, Direction.Positive); + si2.PopulatePrimaryKeyColumns(); + + // Foreign keys + fk1 = new ForeignKeyInfo(table2, "fk1") + { + PrimaryKey = pi1 + }; + fk1.ForeignKeyColumns.Set(si2); + } + + [Test] + public void ValidateModel() + { + storage.Validate(); + } + + [Test] + public void StorageLogTest() + { + TestLog.Info("Actions:"); + TestLog.Info("{0}", storage.Actions); + } + + [Test] + public void RemoveReferencedColumnTest() + { + column5.Remove(); + AssertEx.Throws(storage.Validate); + } + + [Test] + public void RemoveReferencedSecondaryIndexTest() + { + column5.Remove(); + si2.Remove(); + AssertEx.Throws(storage.Validate); + } + + [TearDown] + public void Dump() + { + storage.Dump(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/DoubleIndexedInterfaceTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/DoubleIndexedInterfaceTest.cs index beab336495..a0b32c7dbd 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/DoubleIndexedInterfaceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/DoubleIndexedInterfaceTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.09 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.DoubleIndexedInterfaceTestModel; - -namespace Xtensive.Orm.Tests.Interfaces.DoubleIndexedInterfaceTestModel -{ - [HierarchyRoot] - public class Victim : Entity - { - [Key, Field] - public int Id { get; private set; } - } - - public interface ITest : IEntity - { - [Field] - Victim Victim1 { get; } - [Field] - Victim Victim2 { get; } - } - - [HierarchyRoot] - public class TestImpl1 : Entity, ITest - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Victim Victim1 { get; private set; } - - [Field] - public Victim Victim2 { get; private set; } - } - - [HierarchyRoot] - public class TestImpl2 : Entity, ITest - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Victim Victim1 { get; private set; } - - [Field] - public Victim Victim2 { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Interfaces -{ - public class DoubleIndexedInterfaceTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (ITest).Assembly, typeof (ITest).Namespace); - return config; - } - - [Test] - public void MainTest() - { - // Just ensure that domain builds - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.09 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.DoubleIndexedInterfaceTestModel; + +namespace Xtensive.Orm.Tests.Interfaces.DoubleIndexedInterfaceTestModel +{ + [HierarchyRoot] + public class Victim : Entity + { + [Key, Field] + public int Id { get; private set; } + } + + public interface ITest : IEntity + { + [Field] + Victim Victim1 { get; } + [Field] + Victim Victim2 { get; } + } + + [HierarchyRoot] + public class TestImpl1 : Entity, ITest + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Victim Victim1 { get; private set; } + + [Field] + public Victim Victim2 { get; private set; } + } + + [HierarchyRoot] + public class TestImpl2 : Entity, ITest + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Victim Victim1 { get; private set; } + + [Field] + public Victim Victim2 { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Interfaces +{ + public class DoubleIndexedInterfaceTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (ITest).Assembly, typeof (ITest).Namespace); + return config; + } + + [Test] + public void MainTest() + { + // Just ensure that domain builds + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceImplementationTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceImplementationTest.cs index 5a944a8d1c..eea44d7db1 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceImplementationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceImplementationTest.cs @@ -1,157 +1,157 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.05.18 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Interfaces -{ - namespace Model - { - public interface IHasName : IEntity - { - [Field(Length = 100)] - string Name { get; set; } - } - - public interface ITagged : IHasName - { - [Field(Length = 100)] - string Tag { get; set; } - } - - [HierarchyRoot] - public class A : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Name { get; set; } - } - - public class B : A, IHasName - { - - } - - public class C : A, ITagged - { - [Field(Length=100, Indexed = true)] - public string Tag { get; set; } - } - - [Index("Title", "Name", "Tag")] - [HierarchyRoot] - public class D : Entity, IHasName, ITagged - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Title { get; set; } - - public string Name { get; set; } - - public string Tag { get; set; } - } - } - - [TestFixture] - public class InterfaceImplementationTest - { - [Test] - public void CompsiteIndexTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(IHasName).Assembly, typeof(IHasName).Namespace); - var domain = GetClassTableDomain(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var d = new D(); - d.Title = "A"; - d.Name = "B"; - d.Tag = "C"; - t.Complete(); - } - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var d = session.Query.All().Single(); - Assert.IsNotNull(d); - t.Complete(); - } - } - - [Test] - public void CombinedTest() - { - InternalTest(GetClassTableDomain); - InternalTest(GetConcreteTableDomain); - InternalTest(GetSingleTableDomain); - } - - public void InternalTest(Func generator) - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(IHasName).Assembly, typeof(IHasName).Namespace); - var domain = generator(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new A() {Name = "A"}; - new B() {Name = "B"}; - new C() {Name = "C"}; - var hasNames = session.Query.All().ToList(); - Assert.AreEqual(2, hasNames.Count); - t.Complete(); - } - } - - private Domain GetSingleTableDomain(DomainConfiguration config) - { - Domain domain; - try { - SingleTableSchemaModifier.IsEnabled = true; - config.Types.Register(typeof(ClassTableSchemaModifier)); - domain = Domain.Build(config); - } - finally { - SingleTableSchemaModifier.IsEnabled = false; - } - return domain; - } - - private Domain GetConcreteTableDomain(DomainConfiguration config) - { - Domain domain; - try { - ConcreteTableSchemaModifier.IsEnabled = true; - config.Types.Register(typeof(ClassTableSchemaModifier)); - domain = Domain.Build(config); - } - finally { - ConcreteTableSchemaModifier.IsEnabled = false; - } - return domain; - } - - private Domain GetClassTableDomain(DomainConfiguration config) - { - Domain domain; - try { - ClassTableSchemaModifier.IsEnabled = true; - config.Types.Register(typeof(ClassTableSchemaModifier)); - domain = Domain.Build(config); - } - finally { - ClassTableSchemaModifier.IsEnabled = false; - } - return domain; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.05.18 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Interfaces +{ + namespace Model + { + public interface IHasName : IEntity + { + [Field(Length = 100)] + string Name { get; set; } + } + + public interface ITagged : IHasName + { + [Field(Length = 100)] + string Tag { get; set; } + } + + [HierarchyRoot] + public class A : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Name { get; set; } + } + + public class B : A, IHasName + { + + } + + public class C : A, ITagged + { + [Field(Length=100, Indexed = true)] + public string Tag { get; set; } + } + + [Index("Title", "Name", "Tag")] + [HierarchyRoot] + public class D : Entity, IHasName, ITagged + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Title { get; set; } + + public string Name { get; set; } + + public string Tag { get; set; } + } + } + + [TestFixture] + public class InterfaceImplementationTest + { + [Test] + public void CompsiteIndexTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(IHasName).Assembly, typeof(IHasName).Namespace); + var domain = GetClassTableDomain(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var d = new D(); + d.Title = "A"; + d.Name = "B"; + d.Tag = "C"; + t.Complete(); + } + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var d = session.Query.All().Single(); + Assert.IsNotNull(d); + t.Complete(); + } + } + + [Test] + public void CombinedTest() + { + InternalTest(GetClassTableDomain); + InternalTest(GetConcreteTableDomain); + InternalTest(GetSingleTableDomain); + } + + public void InternalTest(Func generator) + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(IHasName).Assembly, typeof(IHasName).Namespace); + var domain = generator(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new A() {Name = "A"}; + new B() {Name = "B"}; + new C() {Name = "C"}; + var hasNames = session.Query.All().ToList(); + Assert.AreEqual(2, hasNames.Count); + t.Complete(); + } + } + + private Domain GetSingleTableDomain(DomainConfiguration config) + { + Domain domain; + try { + SingleTableSchemaModifier.IsEnabled = true; + config.Types.Register(typeof(ClassTableSchemaModifier)); + domain = Domain.Build(config); + } + finally { + SingleTableSchemaModifier.IsEnabled = false; + } + return domain; + } + + private Domain GetConcreteTableDomain(DomainConfiguration config) + { + Domain domain; + try { + ConcreteTableSchemaModifier.IsEnabled = true; + config.Types.Register(typeof(ClassTableSchemaModifier)); + domain = Domain.Build(config); + } + finally { + ConcreteTableSchemaModifier.IsEnabled = false; + } + return domain; + } + + private Domain GetClassTableDomain(DomainConfiguration config) + { + Domain domain; + try { + ClassTableSchemaModifier.IsEnabled = true; + config.Types.Register(typeof(ClassTableSchemaModifier)); + domain = Domain.Build(config); + } + finally { + ClassTableSchemaModifier.IsEnabled = false; + } + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceTest.cs index b5eb217ef4..c72e00aa5c 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/InterfaceTest.cs @@ -1,166 +1,166 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.08 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.InterfaceTest_Model; - -namespace Xtensive.Orm.Tests.Interfaces.InterfaceTest_Model -{ - public interface IPerson : IEntity - { - [Field] - string Name { get; set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Pets { get; } - - [Field] - IAnimal Favorite { get; set; } - } - - public interface IAnimal : IEntity - { - int Id { get; } - - [Field] - string PetName { get; set; } - - [Field] - IPerson Owner { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Person1 : Entity, IPerson - { - [Field, Key] - public int Id { get; private set; } - - public string Name { get; set; } - - public EntitySet Pets { get; private set; } - - public IAnimal Favorite { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Person2 : Entity, IPerson - { - [Field, Key] - public int Id { get; private set; } - - public string Name { get; set; } - - public EntitySet Pets { get; private set; } - - public IAnimal Favorite { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Animal1 : Entity, IAnimal - { - [Field, Key] - public int Id { get; private set; } - - public string PetName { get; set; } - - public IPerson Owner { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Animal2 : Entity, IAnimal - { - [Field, Key] - public int Id { get; private set; } - - public string PetName { get; set; } - - public IPerson Owner { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Animal3 : Entity, IAnimal - { - [Field, Key] - public int Id { get; private set; } - - public string PetName { get; set; } - - public IPerson Owner { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Interfaces -{ - public class InterfaceTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person1).Assembly, typeof (Person1).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - IPerson p = new Person1(); - p.Pets.Add(new Animal1()); - p.Pets.Add(new Animal1()); - p.Pets.Add(new Animal2()); - - p = new Person2(); - p.Pets.Add(new Animal1()); - p.Pets.Add(new Animal1()); - p.Pets.Add(new Animal2()); - - Session.Current.SaveChanges(); - - p = session.Query.All().First(); - Assert.AreEqual(3, p.Pets.Count); - - var first = p.Pets.First(); - first.Remove(); - Assert.IsTrue(first.PersistenceState == PersistenceState.Removed); - Assert.IsFalse(p.Pets.Contains(first)); - Assert.AreEqual(2, p.Pets.Count); - - p.Remove(); - session.Remove(session.Query.All()); - - new Animal1() { PetName = "A" }; - new Animal1() { PetName = "B" }; - new Animal1() { PetName = "C" }; - new Animal2() { PetName = "D" }; - new Animal2() { PetName = "E" }; - new Animal2() { PetName = "F" }; - new Animal3() { PetName = "G" }; - new Animal3() { PetName = "H" }; - new Animal3() { PetName = "J" }; - - var animals = session.Query.All(); - Assert.AreEqual(9, animals.Count()); - animals.Select(a => new {a.Id, a.PetName}).Where(x => x.Id != 0).ToList(); - var list = session.Query.All().Where(a => (string)a["PetName"] == "D").ToList(); - Assert.AreEqual(1, list.Count); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.08 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.InterfaceTest_Model; + +namespace Xtensive.Orm.Tests.Interfaces.InterfaceTest_Model +{ + public interface IPerson : IEntity + { + [Field] + string Name { get; set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Pets { get; } + + [Field] + IAnimal Favorite { get; set; } + } + + public interface IAnimal : IEntity + { + int Id { get; } + + [Field] + string PetName { get; set; } + + [Field] + IPerson Owner { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Person1 : Entity, IPerson + { + [Field, Key] + public int Id { get; private set; } + + public string Name { get; set; } + + public EntitySet Pets { get; private set; } + + public IAnimal Favorite { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Person2 : Entity, IPerson + { + [Field, Key] + public int Id { get; private set; } + + public string Name { get; set; } + + public EntitySet Pets { get; private set; } + + public IAnimal Favorite { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Animal1 : Entity, IAnimal + { + [Field, Key] + public int Id { get; private set; } + + public string PetName { get; set; } + + public IPerson Owner { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Animal2 : Entity, IAnimal + { + [Field, Key] + public int Id { get; private set; } + + public string PetName { get; set; } + + public IPerson Owner { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Animal3 : Entity, IAnimal + { + [Field, Key] + public int Id { get; private set; } + + public string PetName { get; set; } + + public IPerson Owner { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Interfaces +{ + public class InterfaceTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person1).Assembly, typeof (Person1).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + IPerson p = new Person1(); + p.Pets.Add(new Animal1()); + p.Pets.Add(new Animal1()); + p.Pets.Add(new Animal2()); + + p = new Person2(); + p.Pets.Add(new Animal1()); + p.Pets.Add(new Animal1()); + p.Pets.Add(new Animal2()); + + Session.Current.SaveChanges(); + + p = session.Query.All().First(); + Assert.AreEqual(3, p.Pets.Count); + + var first = p.Pets.First(); + first.Remove(); + Assert.IsTrue(first.PersistenceState == PersistenceState.Removed); + Assert.IsFalse(p.Pets.Contains(first)); + Assert.AreEqual(2, p.Pets.Count); + + p.Remove(); + session.Remove(session.Query.All()); + + new Animal1() { PetName = "A" }; + new Animal1() { PetName = "B" }; + new Animal1() { PetName = "C" }; + new Animal2() { PetName = "D" }; + new Animal2() { PetName = "E" }; + new Animal2() { PetName = "F" }; + new Animal3() { PetName = "G" }; + new Animal3() { PetName = "H" }; + new Animal3() { PetName = "J" }; + + var animals = session.Query.All(); + Assert.AreEqual(9, animals.Count()); + animals.Select(a => new {a.Id, a.PetName}).Where(x => x.Id != 0).ToList(); + var list = session.Query.All().Where(a => (string)a["PetName"] == "D").ToList(); + Assert.AreEqual(1, list.Count); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/KeyStructureConflictTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/KeyStructureConflictTest.cs index ef54412121..63a58e9f09 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/KeyStructureConflictTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/KeyStructureConflictTest.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.10 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.KeyStructureConflictTestModel; - -namespace Xtensive.Orm.Tests.Interfaces.KeyStructureConflictTestModel -{ - public interface IChild : IEntity - { - } - - [Serializable] - [HierarchyRoot] - public class Root1 : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - public class Child1 : Root1, IChild - { - - } - - [Serializable] - [HierarchyRoot] - public class Root2 : Entity - { - [Field, Key] - public Guid Id { get; private set; } - } - - [Serializable] - public class Child2 : Root2, IChild - { - } -} - -namespace Xtensive.Orm.Tests.Interfaces -{ - public class KeyStructureConflictTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - try { - base.BuildDomain(configuration); - Assert.Fail(); - } - catch (DomainBuilderException e) { - Console.WriteLine(e); - } - return null; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.10 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.KeyStructureConflictTestModel; + +namespace Xtensive.Orm.Tests.Interfaces.KeyStructureConflictTestModel +{ + public interface IChild : IEntity + { + } + + [Serializable] + [HierarchyRoot] + public class Root1 : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + public class Child1 : Root1, IChild + { + + } + + [Serializable] + [HierarchyRoot] + public class Root2 : Entity + { + [Field, Key] + public Guid Id { get; private set; } + } + + [Serializable] + public class Child2 : Root2, IChild + { + } +} + +namespace Xtensive.Orm.Tests.Interfaces +{ + public class KeyStructureConflictTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + try { + base.BuildDomain(configuration); + Assert.Fail(); + } + catch (DomainBuilderException e) { + Console.WriteLine(e); + } + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/TypeIdModeConflictTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/TypeIdModeConflictTest.cs index 57dacd166f..4e8d982e31 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/TypeIdModeConflictTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/TypeIdModeConflictTest.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.14 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.TypeIdModeConflictTestModel; - -namespace Xtensive.Orm.Tests.Interfaces.TypeIdModeConflictTestModel -{ - public interface IRoot : IEntity - { - } - - [Serializable] - [HierarchyRoot] - public class Root1 : Entity, IRoot - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot(IncludeTypeId = true)] - public class Root2 : Entity, IRoot - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Interfaces -{ - public class TypeIdModeConflictTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - try { - base.BuildDomain(configuration); - Assert.Fail(); - } - catch (DomainBuilderException e) { - Console.WriteLine(e); - } - return null; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.14 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.TypeIdModeConflictTestModel; + +namespace Xtensive.Orm.Tests.Interfaces.TypeIdModeConflictTestModel +{ + public interface IRoot : IEntity + { + } + + [Serializable] + [HierarchyRoot] + public class Root1 : Entity, IRoot + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot(IncludeTypeId = true)] + public class Root2 : Entity, IRoot + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Interfaces +{ + public class TypeIdModeConflictTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + try { + base.BuildDomain(configuration); + Assert.Fail(); + } + catch (DomainBuilderException e) { + Console.WriteLine(e); + } + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Interfaces/UnusedTypeRemovalTest.cs b/Orm/Xtensive.Orm.Tests/Interfaces/UnusedTypeRemovalTest.cs index 48fa8d0a12..f6546ecd68 100644 --- a/Orm/Xtensive.Orm.Tests/Interfaces/UnusedTypeRemovalTest.cs +++ b/Orm/Xtensive.Orm.Tests/Interfaces/UnusedTypeRemovalTest.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.14 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Interfaces.UnusedTypeRemovalTestModel; - -namespace Xtensive.Orm.Tests.Interfaces.UnusedTypeRemovalTestModel -{ - public interface IFirst : IEntity - { - - } - - public interface ISecond : IFirst - { - - } - - public interface IThird : IFirst - { - - } - - [Serializable] - // No [HierarchyRoot] here - public class Third : Entity, IThird - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IFirst First { get; set; } - } - - [HierarchyRoot] - public class First : Entity, IFirst - { - [Field, Key] - public int Id { get; private set; } - [Field] - public ISecond Second { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Interfaces -{ - public class UnusedTypeRemovalTest : AutoBuildTest - { - [Test] - public void MainTest() - { - Assert.IsNull(Domain); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (IFirst).Assembly, typeof (IFirst).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - try { - base.BuildDomain(configuration); - Assert.Fail(); - } - catch (DomainBuilderException e) { - Console.WriteLine(e); - } - return null; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.14 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Interfaces.UnusedTypeRemovalTestModel; + +namespace Xtensive.Orm.Tests.Interfaces.UnusedTypeRemovalTestModel +{ + public interface IFirst : IEntity + { + + } + + public interface ISecond : IFirst + { + + } + + public interface IThird : IFirst + { + + } + + [Serializable] + // No [HierarchyRoot] here + public class Third : Entity, IThird + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IFirst First { get; set; } + } + + [HierarchyRoot] + public class First : Entity, IFirst + { + [Field, Key] + public int Id { get; private set; } + [Field] + public ISecond Second { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Interfaces +{ + public class UnusedTypeRemovalTest : AutoBuildTest + { + [Test] + public void MainTest() + { + Assert.IsNull(Domain); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (IFirst).Assembly, typeof (IFirst).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + try { + base.BuildDomain(configuration); + Assert.Fail(); + } + catch (DomainBuilderException e) { + Console.WriteLine(e); + } + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/BatchingCommandProcessorFrenzy.cs b/Orm/Xtensive.Orm.Tests/Issues/BatchingCommandProcessorFrenzy.cs index ae92441413..ecfe940992 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/BatchingCommandProcessorFrenzy.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/BatchingCommandProcessorFrenzy.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.20 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.BatchingCommandProcessorFrenzyModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace BatchingCommandProcessorFrenzyModel - { - [HierarchyRoot] - public class FrenzyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - } - - public class BatchingCommandProcessorFrenzy : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (FrenzyEntity).Assembly, typeof (FrenzyEntity).Namespace); - return configuration; - } - - private int GetParameter() - { - var e1 = Query.All().FirstOrDefault(); - var e2 = Query.All().FirstOrDefault(); - return 0; - } - - [Test] - public void Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var x = Query.All().Count(e => e.Id==GetParameter()); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.20 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.BatchingCommandProcessorFrenzyModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace BatchingCommandProcessorFrenzyModel + { + [HierarchyRoot] + public class FrenzyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + } + + public class BatchingCommandProcessorFrenzy : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (FrenzyEntity).Assembly, typeof (FrenzyEntity).Namespace); + return configuration; + } + + private int GetParameter() + { + var e1 = Query.All().FirstOrDefault(); + var e2 = Query.All().FirstOrDefault(); + return 0; + } + + [Test] + public void Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var x = Query.All().Count(e => e.Id==GetParameter()); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/ClientProfileEntitySetTest.cs b/Orm/Xtensive.Orm.Tests/Issues/ClientProfileEntitySetTest.cs index 538ff1114a..5c0671d127 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/ClientProfileEntitySetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/ClientProfileEntitySetTest.cs @@ -1,137 +1,137 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.04 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.ClientProfileEntitySetTestModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace ClientProfileEntitySetTestModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public EntitySet Items { get; private set; } - - public Owner(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public long Id { get; private set; } - - public Item(Session session) - : base(session) - { - } - } - } - - public class ClientProfileEntitySetTest : AutoBuildTest - { - private Key ownerKey; - private Key itemKey; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - configuration.Sessions.Default.Options = SessionOptions.ClientProfile; - return configuration; - } - - public override void TestFixtureSetUp() - { - CheckRequirements(); - } - - public override void TestFixtureTearDown() - { - } - - [SetUp] - public void SetUp() - { - RebuildDomain(); - - using (var session = Domain.OpenSession()) { - var owner = new Owner(session); - var item = new Item(session); - - session.SaveChanges(); - - ownerKey = owner.Key; - itemKey = item.Key; - } - } - - [TearDown] - public void TearDown() - { - if (Domain==null) - return; - Domain.Dispose(); - Domain = null; - } - - [Test] - public void ClearAndAddWithPreviouslyUsedItemTest() - { - using (var session = Domain.OpenSession()) { - var owner = GetOwner(session); - var item = GetItem(session); - owner.Items.Add(item); - session.SaveChanges(); - } - - using (var session = Domain.OpenSession()) { - var owner = GetOwner(session); - var item = GetItem(session); - - owner.Items.Clear(); - owner.Items.Add(item); - - session.SaveChanges(); - } - } - - [Test] - public void AddClearAddClearWithPreviouslyNonUsedItem() - { - using (var session = Domain.OpenSession()) { - var owner = GetOwner(session); - var item = GetItem(session); - - owner.Items.Add(item); - owner.Items.Clear(); - owner.Items.Add(item); - owner.Items.Clear(); - - session.SaveChanges(); - } - } - - private Owner GetOwner(Session session) - { - return session.Query.Single(ownerKey); - } - - private Item GetItem(Session session) - { - return session.Query.Single(itemKey); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.04 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.ClientProfileEntitySetTestModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace ClientProfileEntitySetTestModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public EntitySet Items { get; private set; } + + public Owner(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public long Id { get; private set; } + + public Item(Session session) + : base(session) + { + } + } + } + + public class ClientProfileEntitySetTest : AutoBuildTest + { + private Key ownerKey; + private Key itemKey; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + configuration.Sessions.Default.Options = SessionOptions.ClientProfile; + return configuration; + } + + public override void TestFixtureSetUp() + { + CheckRequirements(); + } + + public override void TestFixtureTearDown() + { + } + + [SetUp] + public void SetUp() + { + RebuildDomain(); + + using (var session = Domain.OpenSession()) { + var owner = new Owner(session); + var item = new Item(session); + + session.SaveChanges(); + + ownerKey = owner.Key; + itemKey = item.Key; + } + } + + [TearDown] + public void TearDown() + { + if (Domain==null) + return; + Domain.Dispose(); + Domain = null; + } + + [Test] + public void ClearAndAddWithPreviouslyUsedItemTest() + { + using (var session = Domain.OpenSession()) { + var owner = GetOwner(session); + var item = GetItem(session); + owner.Items.Add(item); + session.SaveChanges(); + } + + using (var session = Domain.OpenSession()) { + var owner = GetOwner(session); + var item = GetItem(session); + + owner.Items.Clear(); + owner.Items.Add(item); + + session.SaveChanges(); + } + } + + [Test] + public void AddClearAddClearWithPreviouslyNonUsedItem() + { + using (var session = Domain.OpenSession()) { + var owner = GetOwner(session); + var item = GetItem(session); + + owner.Items.Add(item); + owner.Items.Clear(); + owner.Items.Add(item); + owner.Items.Clear(); + + session.SaveChanges(); + } + } + + private Owner GetOwner(Session session) + { + return session.Query.Single(ownerKey); + } + + private Item GetItem(Session session) + { + return session.Query.Single(itemKey); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerException.cs b/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerException.cs index 60123df870..c3f525ecc9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerException.cs @@ -1,139 +1,139 @@ -// Copyright (C) 2011-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexis Kochetov -// Created: 2011.05.29 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.ProjectCustomCompilerException.Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - using System.Linq.Expressions; - namespace ProjectCustomCompilerException.Model - { - [Serializable] - [HierarchyRoot] - public abstract class FundBase : Entity - { - [Field, Key] - public int Id { get; private set; } - - private static readonly Expression> VirtualJuridicalPersonExpression = - obj => - (obj is MutualFund) - ? (obj as MutualFund).ManagementCompany - : (obj is MilitaryMortgage) - ? (obj as MilitaryMortgage).JuridicalPerson - : (obj is SelfRegulatoryOrganization) - ? (obj as SelfRegulatoryOrganization).Organization - : (obj is PrivatePensionFund) - ? (obj as PrivatePensionFund).JuridicalPerson - : (obj is ShareholderInvestmentFund) - ? (obj as ShareholderInvestmentFund).JuridicalPerson - : null; - - private static readonly Func VirtualJuridicalPersonCompiled = - VirtualJuridicalPersonExpression.Compile(); - - public JuridicalPerson VirtualJuridicalPerson - { - get { return VirtualJuridicalPersonCompiled(this); } - } - - [CompilerContainer(typeof(Expression))] - public static class CustomLinqCompilerContainer - { - /// Required to use a virtual field - /// The assignment expression. - /// Expression with bound parameters - [Compiler(typeof(FundBase), "VirtualJuridicalPerson", TargetKind.PropertyGet)] - public static Expression Depositary(Expression assignmentExpression) - { - return VirtualJuridicalPersonExpression.BindParameters(assignmentExpression); - } - } - } - - [Serializable] - public class MutualFund : FundBase - { - /// - /// Fund's management company - /// - [Field(Nullable = false)] - public JuridicalPerson ManagementCompany { get; set; } - } - - [Serializable] - public class MilitaryMortgage : FundBase - { - [Field(Nullable = false)] - public JuridicalPerson JuridicalPerson { get; set; } - } - - [Serializable] - public class SelfRegulatoryOrganization : FundBase - { - [Field(Nullable = false)] - public JuridicalPerson Organization { get; set; } - } - [Serializable] - public class PrivatePensionFund : FundBase - { - [Field(Nullable = false)] - public JuridicalPerson JuridicalPerson { get; set; } - } - - [Serializable] - public class ShareholderInvestmentFund : FundBase - { - [Field(Nullable = false)] - public JuridicalPerson JuridicalPerson { get; set; } - } - - [Serializable] - [HierarchyRoot] - public partial class JuridicalPerson : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Nullable = false, Length = 400)] - public string FullName { get; set; } - } - } - - - public class CustomCompilerException : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FundBase).Assembly, typeof (FundBase).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "parser stack overflow"); - - using (var session = Domain.OpenSession()) - { - using (var transactionScope = session.OpenTransaction()) - { - var result = session.Query.All() - .Where(q => q.VirtualJuridicalPerson != null && q.VirtualJuridicalPerson.FullName != null && q.VirtualJuridicalPerson.FullName.StartsWith("qweqwe")) - .ToArray(); - } - } - } - } +// Copyright (C) 2011-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexis Kochetov +// Created: 2011.05.29 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.ProjectCustomCompilerException.Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + using System.Linq.Expressions; + namespace ProjectCustomCompilerException.Model + { + [Serializable] + [HierarchyRoot] + public abstract class FundBase : Entity + { + [Field, Key] + public int Id { get; private set; } + + private static readonly Expression> VirtualJuridicalPersonExpression = + obj => + (obj is MutualFund) + ? (obj as MutualFund).ManagementCompany + : (obj is MilitaryMortgage) + ? (obj as MilitaryMortgage).JuridicalPerson + : (obj is SelfRegulatoryOrganization) + ? (obj as SelfRegulatoryOrganization).Organization + : (obj is PrivatePensionFund) + ? (obj as PrivatePensionFund).JuridicalPerson + : (obj is ShareholderInvestmentFund) + ? (obj as ShareholderInvestmentFund).JuridicalPerson + : null; + + private static readonly Func VirtualJuridicalPersonCompiled = + VirtualJuridicalPersonExpression.Compile(); + + public JuridicalPerson VirtualJuridicalPerson + { + get { return VirtualJuridicalPersonCompiled(this); } + } + + [CompilerContainer(typeof(Expression))] + public static class CustomLinqCompilerContainer + { + /// Required to use a virtual field + /// The assignment expression. + /// Expression with bound parameters + [Compiler(typeof(FundBase), "VirtualJuridicalPerson", TargetKind.PropertyGet)] + public static Expression Depositary(Expression assignmentExpression) + { + return VirtualJuridicalPersonExpression.BindParameters(assignmentExpression); + } + } + } + + [Serializable] + public class MutualFund : FundBase + { + /// + /// Fund's management company + /// + [Field(Nullable = false)] + public JuridicalPerson ManagementCompany { get; set; } + } + + [Serializable] + public class MilitaryMortgage : FundBase + { + [Field(Nullable = false)] + public JuridicalPerson JuridicalPerson { get; set; } + } + + [Serializable] + public class SelfRegulatoryOrganization : FundBase + { + [Field(Nullable = false)] + public JuridicalPerson Organization { get; set; } + } + [Serializable] + public class PrivatePensionFund : FundBase + { + [Field(Nullable = false)] + public JuridicalPerson JuridicalPerson { get; set; } + } + + [Serializable] + public class ShareholderInvestmentFund : FundBase + { + [Field(Nullable = false)] + public JuridicalPerson JuridicalPerson { get; set; } + } + + [Serializable] + [HierarchyRoot] + public partial class JuridicalPerson : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Nullable = false, Length = 400)] + public string FullName { get; set; } + } + } + + + public class CustomCompilerException : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FundBase).Assembly, typeof (FundBase).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "parser stack overflow"); + + using (var session = Domain.OpenSession()) + { + using (var transactionScope = session.OpenTransaction()) + { + var result = session.Query.All() + .Where(q => q.VirtualJuridicalPerson != null && q.VirtualJuridicalPerson.FullName != null && q.VirtualJuridicalPerson.FullName.StartsWith("qweqwe")) + .ToArray(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerFeatureTest.cs b/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerFeatureTest.cs index 2ea65d6702..f32deb4f49 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerFeatureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/CustomCompilerFeatureTest.cs @@ -1,337 +1,337 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.05.29 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.CustomCompilerFeatureTest_HierarchyModel; -using Xtensive.Orm.Tests.Issues.CustomCompilerFeatureTest_InterfaceModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace CustomCompilerFeatureTest_InterfaceModel - { - public interface IHasVirtualFields : IEntity - { - string RegionName { get; } - } - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (IHasVirtualFields), "RegionName", TargetKind.PropertyGet)] - public static Expression ITestRegionName(Expression _this) - { - return null; - } - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity, IHasVirtualFields - { - private static readonly Expression> expr = p => p.Region.Name; - - private static readonly Func exprComp = expr.Compile(); - - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Age { get; set; } - - [Field] - public Region Region { get; set; } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Person), "RegionName", TargetKind.PropertyGet)] - public static Expression PersonRegionName(Expression assignmentExpression) - { - return expr.BindParameters(assignmentExpression); - } - } - - #endregion - - #region IHasVirtualFields Members - - public string RegionName - { - get { return exprComp(this); } - } - - #endregion - - public Person(Session session) - : base(session) - { - } - } - - [Serializable] - [HierarchyRoot] - public class Company : Entity, IHasVirtualFields - { - private static readonly Expression> expr = p => p.Address.Region.Name; - - private static readonly Func exprComp = expr.Compile(); - - [Field, Key] - public int Id { get; private set; } - - [Field] - public Address Address { get; set; } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Company), "RegionName", TargetKind.PropertyGet)] - public static Expression PersonRegionName(Expression assignmentExpression) - { - return expr.BindParameters(assignmentExpression); - } - } - - #endregion - - #region IHasVirtualFields Members - - public string RegionName - { - get { return exprComp(this); } - } - - #endregion - } - - [Serializable] - [HierarchyRoot] - public class Address : Structure - { - [Field] - public Region Region { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Region : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Region(Session session) - : base(session) - { - } - } - } - - namespace CustomCompilerFeatureTest_HierarchyModel - { - [HierarchyRoot] - public abstract class HasVirtualFields : Entity - { - [Field, Key] - public int Id { get; private set; } - - public abstract string RegionName { get; } - - protected HasVirtualFields(Session session) - : base(session) - { - } - } - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (HasVirtualFields), "RegionName", TargetKind.PropertyGet)] - public static Expression RootRegionName(Expression _this) - { - return null; - } - } - - public class Customer : HasVirtualFields - { - private static readonly Expression> expr = p => p.Area.Name; - - private static readonly Func exprComp = expr.Compile(); - - [Field] - public int Age { get; set; } - - [Field] - public Area Area { get; set; } - - public override string RegionName - { - get { return exprComp(this); } - } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Customer), "RegionName", TargetKind.PropertyGet)] - public static Expression CustomerRegionName(Expression _this) - { - return expr.BindParameters(_this); - } - } - - #endregion - - public Customer(Session session) - : base(session) - { - } - } - - public class Enterprise : HasVirtualFields - { - private static readonly Expression> expr = p => p.BusinessAddress.Area.Name; - - private static readonly Func exprComp = expr.Compile(); - - [Field] - public BusinessAddress BusinessAddress { get; set; } - - public override string RegionName - { - get { return exprComp(this); } - } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Enterprise), "RegionName", TargetKind.PropertyGet)] - public static Expression EnterpriseRegionName(Expression _this) - { - return expr.BindParameters(_this); - } - } - - #endregion - - public Enterprise(Session session) - : base(session) - { - } - } - - [Serializable] - [HierarchyRoot] - public class BusinessAddress : Structure - { - [Field] - public Area Area { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Area : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Area(Session session) - : base(session) - { - } - } - } - - [Serializable] - public class CustomCompilerFeatureTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (IHasVirtualFields).Assembly, typeof (IHasVirtualFields).Namespace); - configuration.Types.Register(typeof (HasVirtualFields).Assembly, typeof (HasVirtualFields).Namespace); - configuration.Sessions.Default.Options = SessionOptions.ServerProfile; - return configuration; - } - - [Test] - public void HierarchyVirtualFieldTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var area = new Area(session) {Name = "13123123121"}; - var customer = new Customer(session) {Age = 1, Area = area}; - - var customers = session.Query.All(); - var customersQuery = customers.Where(c => c.RegionName=="13123123121"); - Assert.AreEqual(1, customersQuery.ToList().Count); - - var virtualEntities = customers as IQueryable; - if (virtualEntities!=null) { - // Covariant upcast will work in .NET 4.0+ - var virtualEntitiesQuery = virtualEntities.Where(item => item.RegionName=="13123123121"); - Assert.AreEqual(1, virtualEntitiesQuery.ToList().Count); - } - - var allCustomers = session.Query.All() - .OrderBy(c => c.RegionName) - .ToList(); - - var allVirtualEntities = session.Query.All() - .OrderBy(c => c.RegionName) - .ToList(); - } - } - - [Test] - public void InterfaceVirtualFieldTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var region = new Region(session) {Name = "13123123121"}; - var person = new Person(session) {Age = 1, Region = region}; - - var persons = session.Query.All(); - var personsQuery = persons.Where(p => p.RegionName=="13123123121"); - Assert.AreEqual(1, personsQuery.ToList().Count); - - var virtualEntities = persons as IQueryable; - if (virtualEntities!=null) { - // Covariant upcast will work in .NET 4.0+ - var virtualEntitiesQuery = virtualEntities.Where(root => root.RegionName=="13123123121"); - Assert.AreEqual(1, virtualEntitiesQuery.ToList().Count); - } - - var allPersons = session.Query.All() - .OrderBy(c => c.RegionName) - .ToList(); - - var allVirtualEntities = session.Query.All() - .OrderBy(c => c.RegionName) - .ToList(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.05.29 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.CustomCompilerFeatureTest_HierarchyModel; +using Xtensive.Orm.Tests.Issues.CustomCompilerFeatureTest_InterfaceModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace CustomCompilerFeatureTest_InterfaceModel + { + public interface IHasVirtualFields : IEntity + { + string RegionName { get; } + } + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (IHasVirtualFields), "RegionName", TargetKind.PropertyGet)] + public static Expression ITestRegionName(Expression _this) + { + return null; + } + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity, IHasVirtualFields + { + private static readonly Expression> expr = p => p.Region.Name; + + private static readonly Func exprComp = expr.Compile(); + + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Age { get; set; } + + [Field] + public Region Region { get; set; } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Person), "RegionName", TargetKind.PropertyGet)] + public static Expression PersonRegionName(Expression assignmentExpression) + { + return expr.BindParameters(assignmentExpression); + } + } + + #endregion + + #region IHasVirtualFields Members + + public string RegionName + { + get { return exprComp(this); } + } + + #endregion + + public Person(Session session) + : base(session) + { + } + } + + [Serializable] + [HierarchyRoot] + public class Company : Entity, IHasVirtualFields + { + private static readonly Expression> expr = p => p.Address.Region.Name; + + private static readonly Func exprComp = expr.Compile(); + + [Field, Key] + public int Id { get; private set; } + + [Field] + public Address Address { get; set; } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Company), "RegionName", TargetKind.PropertyGet)] + public static Expression PersonRegionName(Expression assignmentExpression) + { + return expr.BindParameters(assignmentExpression); + } + } + + #endregion + + #region IHasVirtualFields Members + + public string RegionName + { + get { return exprComp(this); } + } + + #endregion + } + + [Serializable] + [HierarchyRoot] + public class Address : Structure + { + [Field] + public Region Region { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Region : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Region(Session session) + : base(session) + { + } + } + } + + namespace CustomCompilerFeatureTest_HierarchyModel + { + [HierarchyRoot] + public abstract class HasVirtualFields : Entity + { + [Field, Key] + public int Id { get; private set; } + + public abstract string RegionName { get; } + + protected HasVirtualFields(Session session) + : base(session) + { + } + } + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (HasVirtualFields), "RegionName", TargetKind.PropertyGet)] + public static Expression RootRegionName(Expression _this) + { + return null; + } + } + + public class Customer : HasVirtualFields + { + private static readonly Expression> expr = p => p.Area.Name; + + private static readonly Func exprComp = expr.Compile(); + + [Field] + public int Age { get; set; } + + [Field] + public Area Area { get; set; } + + public override string RegionName + { + get { return exprComp(this); } + } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Customer), "RegionName", TargetKind.PropertyGet)] + public static Expression CustomerRegionName(Expression _this) + { + return expr.BindParameters(_this); + } + } + + #endregion + + public Customer(Session session) + : base(session) + { + } + } + + public class Enterprise : HasVirtualFields + { + private static readonly Expression> expr = p => p.BusinessAddress.Area.Name; + + private static readonly Func exprComp = expr.Compile(); + + [Field] + public BusinessAddress BusinessAddress { get; set; } + + public override string RegionName + { + get { return exprComp(this); } + } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Enterprise), "RegionName", TargetKind.PropertyGet)] + public static Expression EnterpriseRegionName(Expression _this) + { + return expr.BindParameters(_this); + } + } + + #endregion + + public Enterprise(Session session) + : base(session) + { + } + } + + [Serializable] + [HierarchyRoot] + public class BusinessAddress : Structure + { + [Field] + public Area Area { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Area : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Area(Session session) + : base(session) + { + } + } + } + + [Serializable] + public class CustomCompilerFeatureTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (IHasVirtualFields).Assembly, typeof (IHasVirtualFields).Namespace); + configuration.Types.Register(typeof (HasVirtualFields).Assembly, typeof (HasVirtualFields).Namespace); + configuration.Sessions.Default.Options = SessionOptions.ServerProfile; + return configuration; + } + + [Test] + public void HierarchyVirtualFieldTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var area = new Area(session) {Name = "13123123121"}; + var customer = new Customer(session) {Age = 1, Area = area}; + + var customers = session.Query.All(); + var customersQuery = customers.Where(c => c.RegionName=="13123123121"); + Assert.AreEqual(1, customersQuery.ToList().Count); + + var virtualEntities = customers as IQueryable; + if (virtualEntities!=null) { + // Covariant upcast will work in .NET 4.0+ + var virtualEntitiesQuery = virtualEntities.Where(item => item.RegionName=="13123123121"); + Assert.AreEqual(1, virtualEntitiesQuery.ToList().Count); + } + + var allCustomers = session.Query.All() + .OrderBy(c => c.RegionName) + .ToList(); + + var allVirtualEntities = session.Query.All() + .OrderBy(c => c.RegionName) + .ToList(); + } + } + + [Test] + public void InterfaceVirtualFieldTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var region = new Region(session) {Name = "13123123121"}; + var person = new Person(session) {Age = 1, Region = region}; + + var persons = session.Query.All(); + var personsQuery = persons.Where(p => p.RegionName=="13123123121"); + Assert.AreEqual(1, personsQuery.ToList().Count); + + var virtualEntities = persons as IQueryable; + if (virtualEntities!=null) { + // Covariant upcast will work in .NET 4.0+ + var virtualEntitiesQuery = virtualEntities.Where(root => root.RegionName=="13123123121"); + Assert.AreEqual(1, virtualEntitiesQuery.ToList().Count); + } + + var allPersons = session.Query.All() + .OrderBy(c => c.RegionName) + .ToList(); + + var allVirtualEntities = session.Query.All() + .OrderBy(c => c.RegionName) + .ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/InterfaceEntitySetTest.cs b/Orm/Xtensive.Orm.Tests/Issues/InterfaceEntitySetTest.cs index d7db7f2a03..c000beaae2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/InterfaceEntitySetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/InterfaceEntitySetTest.cs @@ -1,69 +1,69 @@ -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.InterfaceEntitySetTest_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace InterfaceEntitySetTest_Model - { - public interface IHasTraceFields : IEntity - { - [Key] - [Field] - long ID { get; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "Owner")] - EntitySet TraceFields { get; } - } - - [HierarchyRoot] - public class TraceField: Entity - { - [Key] - [Field] - public long ID { get; private set; } - - [Field] - public IHasTraceFields Owner { get; set; } - } - - [HierarchyRoot] - public class Pallet: Entity, IHasTraceFields { - - public long ID { get; private set; } - - [Field] - public EntitySet TraceFields { get; private set; } - } - - public class WestfroPallet: Pallet { - public WestfroPallet() - { - Console.WriteLine(TraceFields.Count); - } - } - } - - public class InterfaceEntitySetTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Pallet).Assembly, typeof (Pallet).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var pallet = new WestfroPallet(); - t.Complete(); - } - } - } +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.InterfaceEntitySetTest_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace InterfaceEntitySetTest_Model + { + public interface IHasTraceFields : IEntity + { + [Key] + [Field] + long ID { get; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "Owner")] + EntitySet TraceFields { get; } + } + + [HierarchyRoot] + public class TraceField: Entity + { + [Key] + [Field] + public long ID { get; private set; } + + [Field] + public IHasTraceFields Owner { get; set; } + } + + [HierarchyRoot] + public class Pallet: Entity, IHasTraceFields { + + public long ID { get; private set; } + + [Field] + public EntitySet TraceFields { get; private set; } + } + + public class WestfroPallet: Pallet { + public WestfroPallet() + { + Console.WriteLine(TraceFields.Count); + } + } + } + + public class InterfaceEntitySetTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Pallet).Assembly, typeof (Pallet).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var pallet = new WestfroPallet(); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0001_MultipleHierarchyRootAttributes.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0001_MultipleHierarchyRootAttributes.cs index fcda82d493..eece89cd1c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0001_MultipleHierarchyRootAttributes.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0001_MultipleHierarchyRootAttributes.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.10.16 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0001_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0001_Model -{ - [Serializable] - [HierarchyRoot] - public class X : Entity - { - [Field, Key] - public int ID { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Y : X - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0001_MultipleHierarchyRootAttributes : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof (X).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain result = null; - AssertEx.Throws(() => result = base.BuildDomain(configuration)); - return result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.10.16 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0001_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0001_Model +{ + [Serializable] + [HierarchyRoot] + public class X : Entity + { + [Field, Key] + public int ID { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Y : X + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0001_MultipleHierarchyRootAttributes : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof (X).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain result = null; + AssertEx.Throws(() => result = base.BuildDomain(configuration)); + return result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0002_PrimaryKeyWithLazyLoad.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0002_PrimaryKeyWithLazyLoad.cs index 811ae25621..c1dae318c1 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0002_PrimaryKeyWithLazyLoad.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0002_PrimaryKeyWithLazyLoad.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.10.16 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0002_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0002_Model -{ - [Serializable] - [HierarchyRoot] - public class X : Entity - { - [Field(LazyLoad = true), Key] - public int ID { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0002_PrimaryKeyWithLazyLoad : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(X).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain result = null; - AssertEx.Throws(() => result = base.BuildDomain(configuration)); - return result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.10.16 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0002_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0002_Model +{ + [Serializable] + [HierarchyRoot] + public class X : Entity + { + [Field(LazyLoad = true), Key] + public int ID { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0002_PrimaryKeyWithLazyLoad : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(X).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain result = null; + AssertEx.Throws(() => result = base.BuildDomain(configuration)); + return result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0003_NullablePrimaryKey.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0003_NullablePrimaryKey.cs index 56e647212d..240358202f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0003_NullablePrimaryKey.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0003_NullablePrimaryKey.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.10.16 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0003_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0003_Model -{ - [Serializable] - [HierarchyRoot] - public class X : Entity - { - [Field, Key] - public int? ID { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0003_NullablePrimaryKey : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(X).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain = null; - AssertEx.Throws(() => domain = base.BuildDomain(configuration)); - return domain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.10.16 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0003_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0003_Model +{ + [Serializable] + [HierarchyRoot] + public class X : Entity + { + [Field, Key] + public int? ID { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0003_NullablePrimaryKey : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(X).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain = null; + AssertEx.Throws(() => domain = base.BuildDomain(configuration)); + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0004_PairAttributeMisusageIsNotHandled.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0004_PairAttributeMisusageIsNotHandled.cs index aabe221775..f9b4d21bc7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0004_PairAttributeMisusageIsNotHandled.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0004_PairAttributeMisusageIsNotHandled.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.11.26 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issue0004_Model; - -namespace Xtensive.Orm.Tests.Issue0004_Model -{ - [Serializable] - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(PairTo = "User")] - public EntitySet Notifications { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Notification : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public string Description { get; set; } - - [Field, Association(PairTo = "Notifications")] - public User User { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [Ignore("No more actual")] - public class Issue0004_PairAttributeMisusageIsNotHandled : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(User).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain result = null; - AssertEx.Throws(() => result = base.BuildDomain(configuration)); - return result; - } - } -} - - +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.11.26 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issue0004_Model; + +namespace Xtensive.Orm.Tests.Issue0004_Model +{ + [Serializable] + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(PairTo = "User")] + public EntitySet Notifications { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Notification : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public string Description { get; set; } + + [Field, Association(PairTo = "Notifications")] + public User User { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [Ignore("No more actual")] + public class Issue0004_PairAttributeMisusageIsNotHandled : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(User).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain result = null; + AssertEx.Throws(() => result = base.BuildDomain(configuration)); + return result; + } + } +} + + diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0005_EntitySetItemEnhancement.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0005_EntitySetItemEnhancement.cs index 7aaf9e44a5..e0b3b6b8d2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0005_EntitySetItemEnhancement.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0005_EntitySetItemEnhancement.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.03 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0009_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0005_EntitySetItemEnhancement : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); - return config; - } - - [Test] - public void MainTest() - { - TypeInfo type = Domain.Model.Types["Book-Authors-Author"]; - Assert.IsNotNull(type.Fields["Master"]); - Assert.IsNotNull(type.Fields["Slave"]); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.03 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0009_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0005_EntitySetItemEnhancement : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); + return config; + } + + [Test] + public void MainTest() + { + TypeInfo type = Domain.Model.Types["Book-Authors-Author"]; + Assert.IsNotNull(type.Fields["Master"]); + Assert.IsNotNull(type.Fields["Slave"]); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0007_InvalidNotNullConstraint.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0007_InvalidNotNullConstraint.cs index ef7406f283..6fbcf822da 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0007_InvalidNotNullConstraint.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0007_InvalidNotNullConstraint.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.25 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0007_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0007_Model -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public Address Address { get; set; } - - [Field] - public City City { get; set; } - } - - [Serializable] - public class Address : Structure - { - [Field] - public string Street { get; set; } - - [Field] - public int House { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class City : Entity - { - [Field, Key] - public int ID { get; private set; } - - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0007_InvalidNotNullConstraint : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["Address.Street"].IsNullable); - Assert.AreEqual(false, Domain.Model.Types[typeof (Person)].Fields["Address.House"].IsNullable); - Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["City"].IsNullable); - Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["City.ID"].IsNullable); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.25 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0007_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0007_Model +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public Address Address { get; set; } + + [Field] + public City City { get; set; } + } + + [Serializable] + public class Address : Structure + { + [Field] + public string Street { get; set; } + + [Field] + public int House { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class City : Entity + { + [Field, Key] + public int ID { get; private set; } + + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0007_InvalidNotNullConstraint : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["Address.Street"].IsNullable); + Assert.AreEqual(false, Domain.Model.Types[typeof (Person)].Fields["Address.House"].IsNullable); + Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["City"].IsNullable); + Assert.AreEqual(true, Domain.Model.Types[typeof (Person)].Fields["City.ID"].IsNullable); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0009_2SymmetricTablesForMNRelationship.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0009_2SymmetricTablesForMNRelationship.cs index a4057aefca..484d5683e2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0009_2SymmetricTablesForMNRelationship.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0009_2SymmetricTablesForMNRelationship.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.26 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0009_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0009_Model -{ - [Serializable] - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public EntitySet Authors { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Author : Entity - { - [Field, Key] - public Guid ID { get; private set; } - - [Field, Association(PairTo = "Authors")] - public EntitySet Books { get; private set; } - } - -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0009_2SymmetricTablesForMNRelationship : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Book).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var book = new Book(); - var author = new Author(); - book.Authors.Add(author); - - Assert.AreEqual(1, book.Authors.Count); - Assert.AreEqual(1, author.Books.Count); - Assert.IsTrue(book.Authors.Contains(author)); - Assert.IsTrue(author.Books.Contains(book)); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.26 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0009_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0009_Model +{ + [Serializable] + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public EntitySet Authors { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Author : Entity + { + [Field, Key] + public Guid ID { get; private set; } + + [Field, Association(PairTo = "Authors")] + public EntitySet Books { get; private set; } + } + +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0009_2SymmetricTablesForMNRelationship : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Book).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var book = new Book(); + var author = new Author(); + book.Authors.Add(author); + + Assert.AreEqual(1, book.Authors.Count); + Assert.AreEqual(1, author.Books.Count); + Assert.IsTrue(book.Authors.Contains(author)); + Assert.IsTrue(author.Books.Contains(book)); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0011_MultipleFieldPersistence.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0011_MultipleFieldPersistence.cs index 1f55e43b7d..b9591e5338 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0011_MultipleFieldPersistence.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0011_MultipleFieldPersistence.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.20 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0012_Model; -using Xtensive.Orm.Tests.Issues.Issue0012_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0011_MultipleFieldPersistence : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - /* - This code snippet in a transaction executes 3 queries, an INSERT, and - 2 UPDATES. But the third persistance updates Field3 again even though - it hadn't changed since the second persistance. - */ - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e1 = new MyEntity(); - e1.Field3 = 3; - Session.Current.SaveChanges(); - e1.Field3 = 3; - Session.Current.SaveChanges(); - e1.Field1 = 1; - e1.Field2 = 2; - Session.Current.SaveChanges(); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.20 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0012_Model; +using Xtensive.Orm.Tests.Issues.Issue0012_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0011_MultipleFieldPersistence : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + /* + This code snippet in a transaction executes 3 queries, an INSERT, and + 2 UPDATES. But the third persistance updates Field3 again even though + it hadn't changed since the second persistance. + */ + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e1 = new MyEntity(); + e1.Field3 = 3; + Session.Current.SaveChanges(); + e1.Field3 = 3; + Session.Current.SaveChanges(); + e1.Field1 = 1; + e1.Field2 = 2; + Session.Current.SaveChanges(); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0012_TakeSkipSequence.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0012_TakeSkipSequence.cs index bf5407d0ff..2d752bb196 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0012_TakeSkipSequence.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0012_TakeSkipSequence.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.20 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Rse.Providers; -using Xtensive.Orm.Tests.Issues.Issue0012_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0012_Model -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Field1 { get; set; } - - [Field] - public int Field2 { get; set; } - - [Field] - public int Field3 { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0012_TakeSkipSequence : AutoBuildTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Assert.AreEqual(0, new[] {1, 2}.Take(1).Skip(1).Count()); - - using (var session = Domain.OpenSession()) - using (var trs = session.OpenTransaction()) { - var e1 = new MyEntity(); - var e2 = new MyEntity(); - CompilableProvider rsMyEntities = Domain.Model.Types[typeof(MyEntity)] - .Indexes.PrimaryIndex.GetQuery() - .Filter(t => t.GetValue(0) == e1.Id || t.GetValue(0) == e2.Id); - - Assert.AreEqual(2, rsMyEntities.Count(Session.Current)); - - Assert.AreEqual(0, rsMyEntities.Take(1).Skip(1).Count(Session.Current)); - Assert.AreEqual(1, rsMyEntities.Skip(1).Take(1).Count(Session.Current)); - Assert.AreEqual(1, rsMyEntities.Take(1).Take(2).Count(Session.Current)); - Assert.AreEqual(0, rsMyEntities.Skip(1).Skip(1).Count(Session.Current)); - trs.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.20 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Rse.Providers; +using Xtensive.Orm.Tests.Issues.Issue0012_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0012_Model +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Field1 { get; set; } + + [Field] + public int Field2 { get; set; } + + [Field] + public int Field3 { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0012_TakeSkipSequence : AutoBuildTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Assert.AreEqual(0, new[] {1, 2}.Take(1).Skip(1).Count()); + + using (var session = Domain.OpenSession()) + using (var trs = session.OpenTransaction()) { + var e1 = new MyEntity(); + var e2 = new MyEntity(); + CompilableProvider rsMyEntities = Domain.Model.Types[typeof(MyEntity)] + .Indexes.PrimaryIndex.GetQuery() + .Filter(t => t.GetValue(0) == e1.Id || t.GetValue(0) == e2.Id); + + Assert.AreEqual(2, rsMyEntities.Count(Session.Current)); + + Assert.AreEqual(0, rsMyEntities.Take(1).Skip(1).Count(Session.Current)); + Assert.AreEqual(1, rsMyEntities.Skip(1).Take(1).Count(Session.Current)); + Assert.AreEqual(1, rsMyEntities.Take(1).Take(2).Count(Session.Current)); + Assert.AreEqual(0, rsMyEntities.Skip(1).Skip(1).Count(Session.Current)); + trs.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0013_SqlBuilderRequestTaskBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0013_SqlBuilderRequestTaskBug.cs index e71bf0edf0..2c97e9ab7a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0013_SqlBuilderRequestTaskBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0013_SqlBuilderRequestTaskBug.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.20 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0013_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0013_Model -{ - [Serializable] - [HierarchyRoot] - public class SqlTaskEntity : Entity - { - [Field, Key] - public long ID { get; private set; } - - [Field] - public int Field1 { get; set; } - - [Field] - public int Field2 { get; set; } - - [Field] - public int Field3 { get; set; } - - [Field] - public int Field4 { get; set; } - - [Field] - public int Field5 { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0013_SqlBuilderRequestTaskBug : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (SqlTaskEntity).Assembly, typeof (SqlTaskEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - SqlTaskEntity e1; - using (TransactionScope trs = session.OpenTransaction()) { - e1 = new SqlTaskEntity(); - //insert - Session.Current.SaveChanges(); - e1.Field5 = 5; - //update - trs.Complete(); - } - using (TransactionScope trs = session.OpenTransaction()) { - e1.Field1 = 1; - e1.Field3 = 3; - //update - trs.Complete(); - } - using (TransactionScope trs = session.OpenTransaction()) { - Assert.AreEqual(1, e1.Field1); - Assert.AreEqual(3, e1.Field3); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.20 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0013_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0013_Model +{ + [Serializable] + [HierarchyRoot] + public class SqlTaskEntity : Entity + { + [Field, Key] + public long ID { get; private set; } + + [Field] + public int Field1 { get; set; } + + [Field] + public int Field2 { get; set; } + + [Field] + public int Field3 { get; set; } + + [Field] + public int Field4 { get; set; } + + [Field] + public int Field5 { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0013_SqlBuilderRequestTaskBug : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (SqlTaskEntity).Assembly, typeof (SqlTaskEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + SqlTaskEntity e1; + using (TransactionScope trs = session.OpenTransaction()) { + e1 = new SqlTaskEntity(); + //insert + Session.Current.SaveChanges(); + e1.Field5 = 5; + //update + trs.Complete(); + } + using (TransactionScope trs = session.OpenTransaction()) { + e1.Field1 = 1; + e1.Field3 = 3; + //update + trs.Complete(); + } + using (TransactionScope trs = session.OpenTransaction()) { + Assert.AreEqual(1, e1.Field1); + Assert.AreEqual(3, e1.Field3); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0014_SymmetricRelationshipIsUnsupported.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0014_SymmetricRelationshipIsUnsupported.cs index bc0d4d288d..52b643b629 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0014_SymmetricRelationshipIsUnsupported.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0014_SymmetricRelationshipIsUnsupported.cs @@ -1,121 +1,121 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.11.26 - - -using System; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Issue0014_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0014_Model -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(PairTo = "Friends")] - public EntitySet Friends { get; set; } - - [Field, Association(PairTo = "BestFriend")] - public Person BestFriend { get; set;} - } -} -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0014_SymmetricRelationshipIsUnsupported : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Person).Namespace); - return config; - } - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - } - - [Test] - public void ManyToManyTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Person first = new Person {Name = "First"}; - Person second = new Person {Name = "Second"}; - Person third = new Person {Name = "Third"}; - - first.Friends.Add(second); - first.Friends.Add(third); - Assert.AreEqual(2,first.Friends.Count); - Assert.AreEqual(1,second.Friends.Count); - Assert.AreEqual(1,third.Friends.Count); - Assert.AreSame(first, first.Friends.First().Friends.First()); - Assert.AreSame(first, first.Friends.Skip(1).First().Friends.First()); - - first.Friends.Add(first); - Assert.AreEqual(3,first.Friends.Count); - - first.Friends.Remove(first); - Assert.AreEqual(2,first.Friends.Count); - - first.Friends.Clear(); - second.Friends.Clear(); - third.Friends.Clear(); - Session.Current.SaveChanges(); - - first.Friends.Add(first); - - t.Complete(); - } - } - } - - - [Test] - public void OneToOneTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Person first = new Person {Name = "First"}; - Person second = new Person {Name = "Second"}; - Person third = new Person {Name = "Third"}; - - first.BestFriend = second; - Assert.AreSame(first.BestFriend, second); - Assert.AreSame(first, second.BestFriend); - - first.BestFriend = third; - Assert.AreSame(first.BestFriend, third); - Assert.AreSame(first, third.BestFriend); - Assert.AreSame(null, second.BestFriend); - - first.BestFriend = null; - Assert.AreSame(null, first.BestFriend); - Assert.AreSame(null, third.BestFriend); - - first.BestFriend = first; - Assert.AreSame(first.BestFriend, first); - - first.BestFriend = null; - Assert.AreSame(null, first.BestFriend); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.11.26 + + +using System; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Issue0014_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0014_Model +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(PairTo = "Friends")] + public EntitySet Friends { get; set; } + + [Field, Association(PairTo = "BestFriend")] + public Person BestFriend { get; set;} + } +} +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0014_SymmetricRelationshipIsUnsupported : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Person).Namespace); + return config; + } + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + } + + [Test] + public void ManyToManyTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Person first = new Person {Name = "First"}; + Person second = new Person {Name = "Second"}; + Person third = new Person {Name = "Third"}; + + first.Friends.Add(second); + first.Friends.Add(third); + Assert.AreEqual(2,first.Friends.Count); + Assert.AreEqual(1,second.Friends.Count); + Assert.AreEqual(1,third.Friends.Count); + Assert.AreSame(first, first.Friends.First().Friends.First()); + Assert.AreSame(first, first.Friends.Skip(1).First().Friends.First()); + + first.Friends.Add(first); + Assert.AreEqual(3,first.Friends.Count); + + first.Friends.Remove(first); + Assert.AreEqual(2,first.Friends.Count); + + first.Friends.Clear(); + second.Friends.Clear(); + third.Friends.Clear(); + Session.Current.SaveChanges(); + + first.Friends.Add(first); + + t.Complete(); + } + } + } + + + [Test] + public void OneToOneTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Person first = new Person {Name = "First"}; + Person second = new Person {Name = "Second"}; + Person third = new Person {Name = "Third"}; + + first.BestFriend = second; + Assert.AreSame(first.BestFriend, second); + Assert.AreSame(first, second.BestFriend); + + first.BestFriend = third; + Assert.AreSame(first.BestFriend, third); + Assert.AreSame(first, third.BestFriend); + Assert.AreSame(null, second.BestFriend); + + first.BestFriend = null; + Assert.AreSame(null, first.BestFriend); + Assert.AreSame(null, third.BestFriend); + + first.BestFriend = first; + Assert.AreSame(first.BestFriend, first); + + first.BestFriend = null; + Assert.AreSame(null, first.BestFriend); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0016_FieldOfInterfaceType.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0016_FieldOfInterfaceType.cs index ac780c5f84..577bf8864a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0016_FieldOfInterfaceType.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0016_FieldOfInterfaceType.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.09 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0016_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0016_Model -{ - public interface IMaster : IEntity - { - [Field] - Slave Slave { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Master : Entity, IMaster - { - [Field, Key] - public int Id { get; private set; } - - public Slave Slave { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Slave : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field , Association(PairTo = "Slave")] - public IMaster Master { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0016_FieldOfInterfaceType : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Slave).Assembly, typeof (Slave).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - Master m = new Master(); - Slave s = new Slave(); - m.Slave = s; - Assert.IsNotNull(m.Slave); - Assert.AreSame(s, m.Slave); - - m.Slave = null; - Assert.IsNull(m.Slave); - - s.Master = m; - Assert.IsNotNull(s.Master); - Assert.AreSame(m, s.Master); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.09 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0016_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0016_Model +{ + public interface IMaster : IEntity + { + [Field] + Slave Slave { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Master : Entity, IMaster + { + [Field, Key] + public int Id { get; private set; } + + public Slave Slave { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Slave : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field , Association(PairTo = "Slave")] + public IMaster Master { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0016_FieldOfInterfaceType : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Slave).Assembly, typeof (Slave).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + Master m = new Master(); + Slave s = new Slave(); + m.Slave = s; + Assert.IsNotNull(m.Slave); + Assert.AreSame(s, m.Slave); + + m.Slave = null; + Assert.IsNull(m.Slave); + + s.Master = m; + Assert.IsNotNull(s.Master); + Assert.AreSame(m, s.Master); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0017_ReferentialActionCascade.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0017_ReferentialActionCascade.cs index 8ec786644c..47b47e9a3e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0017_ReferentialActionCascade.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0017_ReferentialActionCascade.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.15 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0017_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0017_Model -{ - [Serializable] - [HierarchyRoot] - public class Master:Entity - { - [Field, Key] - public long ID { get; private set; } - - [Field, Association(PairTo = "Master1")] - public Slave Slave { get; set; } - - [Field, Association(PairTo = "Master2")] - public EntitySet Slaves { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Slave:Entity - { - [Field, Key] - public long ID { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public Master Master1 { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public Master Master2 { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0017_ReferentialActionCascade : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var m1 = new Master(); - var s1 = new Slave(); - m1.Slave = s1; - Assert.AreEqual(m1, s1.Master1); - m1.Remove(); - Assert.AreEqual(PersistenceState.Removed, m1.PersistenceState); - Assert.AreEqual(PersistenceState.Removed, s1.PersistenceState); - Session.Current.SaveChanges(); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.15 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0017_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0017_Model +{ + [Serializable] + [HierarchyRoot] + public class Master:Entity + { + [Field, Key] + public long ID { get; private set; } + + [Field, Association(PairTo = "Master1")] + public Slave Slave { get; set; } + + [Field, Association(PairTo = "Master2")] + public EntitySet Slaves { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Slave:Entity + { + [Field, Key] + public long ID { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public Master Master1 { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public Master Master2 { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0017_ReferentialActionCascade : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var m1 = new Master(); + var s1 = new Slave(); + m1.Slave = s1; + Assert.AreEqual(m1, s1.Master1); + m1.Remove(); + Assert.AreEqual(PersistenceState.Removed, m1.PersistenceState); + Assert.AreEqual(PersistenceState.Removed, s1.PersistenceState); + Session.Current.SaveChanges(); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0021_InvalidSqlQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0021_InvalidSqlQuery.cs index 6dac6d4eaa..a3f1c71dfd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0021_InvalidSqlQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0021_InvalidSqlQuery.cs @@ -1,94 +1,94 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.01.19 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0021_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0021_Model -{ - [Serializable] - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class Root : Entity - { - [Field, Key] - public long ID { get; private set; } - - [Field] - public string StringField { get; set; } - } - - [Serializable] - public class Child1 : Root - { - [Field] - public Guid GuidField { get; set; } - - } - - [Serializable] - public class Child2 : Child1 - { - [Field] - public DateTime DateTimeField { get; set; } - - [Field] - public bool BoolField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0021_InvalidSqlQuery : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Root).Assembly, typeof (Root).Namespace); - return config; - } - - /*protected override Domain BuildDomain(DomainConfiguration configuration) - { - if (configuration.ConnectionInfo.Url.StartsWith("memory") && configuration.Builders.Contains(typeof(IncludeTypeIdModifier))) { - throw new IgnoreException("This configuration hangs the test"); - } - return base.BuildDomain(configuration); - }*/ - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new Child2 - { - StringField = "1", - BoolField = true, - DateTimeField = new DateTime(1967, 10, 23) - }; - new Child2 - { - StringField = "2", - BoolField = false, - DateTimeField = new DateTime(1968, 11, 24) - }; - - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var all = session.Query.All(); - foreach (var obj in all) { - obj.Remove(); - } - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.01.19 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0021_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0021_Model +{ + [Serializable] + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class Root : Entity + { + [Field, Key] + public long ID { get; private set; } + + [Field] + public string StringField { get; set; } + } + + [Serializable] + public class Child1 : Root + { + [Field] + public Guid GuidField { get; set; } + + } + + [Serializable] + public class Child2 : Child1 + { + [Field] + public DateTime DateTimeField { get; set; } + + [Field] + public bool BoolField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0021_InvalidSqlQuery : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Root).Assembly, typeof (Root).Namespace); + return config; + } + + /*protected override Domain BuildDomain(DomainConfiguration configuration) + { + if (configuration.ConnectionInfo.Url.StartsWith("memory") && configuration.Builders.Contains(typeof(IncludeTypeIdModifier))) { + throw new IgnoreException("This configuration hangs the test"); + } + return base.BuildDomain(configuration); + }*/ + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new Child2 + { + StringField = "1", + BoolField = true, + DateTimeField = new DateTime(1967, 10, 23) + }; + new Child2 + { + StringField = "2", + BoolField = false, + DateTimeField = new DateTime(1968, 11, 24) + }; + + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var all = session.Query.All(); + foreach (var obj in all) { + obj.Remove(); + } + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0028_1_1SymmetricAssociationBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0028_1_1SymmetricAssociationBug.cs index 08dce67399..de87d91220 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0028_1_1SymmetricAssociationBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0028_1_1SymmetricAssociationBug.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.02.12 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0028_1_1SymmetricAssociationBug_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0028_1_1SymmetricAssociationBug_Model -{ - [Serializable] - [HierarchyRoot] - public class First : Entity - { - [Field, Key] - public long ID { get; private set; } - - //symmetric - [Field, Association(PairTo = "SPair")] - public First SPair { get; set; } - - //assymetric - [Field] - public Second APair { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Second : Entity - { - [Field, Key] - public long ID { get; private set; } - - [Field, Association(PairTo = "APair")] - public First APair { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0028_1_1SymmetricAssociationBug : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (First).Assembly, typeof (First).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var e1a = new First(); - var e1b = new First(); - var e1c = new First(); - var e1d = new First(); - - e1a.SPair = e1a; - Assert.AreEqual(e1a, e1a.SPair); - e1b.SPair = e1a; - Assert.AreEqual(e1a, e1b.SPair); - Assert.AreEqual(e1b, e1a.SPair); - e1c.SPair = e1b; - Assert.AreEqual(e1c, e1b.SPair); - Assert.AreEqual(e1b, e1c.SPair); - Assert.AreEqual(null, e1a.SPair); - e1c.SPair = null; - Assert.AreEqual(null, e1a.SPair); - Assert.AreEqual(null, e1b.SPair); - Assert.AreEqual(null, e1c.SPair); - Assert.AreEqual(null, e1d.SPair); - - e1a.SPair = e1b; - Assert.AreEqual(e1a, e1b.SPair); - Assert.AreEqual(e1b, e1a.SPair); - e1c.SPair = e1d; - Assert.AreEqual(e1c, e1d.SPair); - Assert.AreEqual(e1d, e1c.SPair); - e1b.SPair = e1d; - Assert.AreEqual(null, e1a.SPair); - Assert.AreEqual(e1d, e1b.SPair); - Assert.AreEqual(null, e1c.SPair); - Assert.AreEqual(e1b, e1d.SPair); - e1d.SPair = null; - Assert.AreEqual(null, e1a.SPair); - Assert.AreEqual(null, e1b.SPair); - Assert.AreEqual(null, e1c.SPair); - Assert.AreEqual(null, e1d.SPair); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.02.12 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0028_1_1SymmetricAssociationBug_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0028_1_1SymmetricAssociationBug_Model +{ + [Serializable] + [HierarchyRoot] + public class First : Entity + { + [Field, Key] + public long ID { get; private set; } + + //symmetric + [Field, Association(PairTo = "SPair")] + public First SPair { get; set; } + + //assymetric + [Field] + public Second APair { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Second : Entity + { + [Field, Key] + public long ID { get; private set; } + + [Field, Association(PairTo = "APair")] + public First APair { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0028_1_1SymmetricAssociationBug : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (First).Assembly, typeof (First).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var e1a = new First(); + var e1b = new First(); + var e1c = new First(); + var e1d = new First(); + + e1a.SPair = e1a; + Assert.AreEqual(e1a, e1a.SPair); + e1b.SPair = e1a; + Assert.AreEqual(e1a, e1b.SPair); + Assert.AreEqual(e1b, e1a.SPair); + e1c.SPair = e1b; + Assert.AreEqual(e1c, e1b.SPair); + Assert.AreEqual(e1b, e1c.SPair); + Assert.AreEqual(null, e1a.SPair); + e1c.SPair = null; + Assert.AreEqual(null, e1a.SPair); + Assert.AreEqual(null, e1b.SPair); + Assert.AreEqual(null, e1c.SPair); + Assert.AreEqual(null, e1d.SPair); + + e1a.SPair = e1b; + Assert.AreEqual(e1a, e1b.SPair); + Assert.AreEqual(e1b, e1a.SPair); + e1c.SPair = e1d; + Assert.AreEqual(e1c, e1d.SPair); + Assert.AreEqual(e1d, e1c.SPair); + e1b.SPair = e1d; + Assert.AreEqual(null, e1a.SPair); + Assert.AreEqual(e1d, e1b.SPair); + Assert.AreEqual(null, e1c.SPair); + Assert.AreEqual(e1b, e1d.SPair); + e1d.SPair = null; + Assert.AreEqual(null, e1a.SPair); + Assert.AreEqual(null, e1b.SPair); + Assert.AreEqual(null, e1c.SPair); + Assert.AreEqual(null, e1d.SPair); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0036_AutomaticGenericTypesRegistration.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0036_AutomaticGenericTypesRegistration.cs index 614581e476..414a70ea5f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0036_AutomaticGenericTypesRegistration.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0036_AutomaticGenericTypesRegistration.cs @@ -1,94 +1,94 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.05.13 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0036_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0036_Model -{ - public interface ISecurable : IEntity - { - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class User : Entity, ISecurable - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class SyncInfo : Entity - where TEntity : Entity, new() - { - [Field, Key] - public TEntity Target { get; private set; } - - public SyncInfo (TEntity target) - : base(target) - { - } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class SecurityInfo : Entity - where TEntity : Entity, ISecurable - { - [Field, Key] - public TEntity Target { get; private set; } - - public SecurityInfo (TEntity target) - : base(target) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0036_AutomaticGenericTypesRegistration : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { -// Domain.Model.Dump(); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = new Person(); - var personSyncInfo = new SyncInfo(person); - var user = new User(); - var userSyncInfo = new SyncInfo(user); - var userSecurityInfo = new SecurityInfo(user); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.05.13 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0036_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0036_Model +{ + public interface ISecurable : IEntity + { + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class User : Entity, ISecurable + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class SyncInfo : Entity + where TEntity : Entity, new() + { + [Field, Key] + public TEntity Target { get; private set; } + + public SyncInfo (TEntity target) + : base(target) + { + } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class SecurityInfo : Entity + where TEntity : Entity, ISecurable + { + [Field, Key] + public TEntity Target { get; private set; } + + public SecurityInfo (TEntity target) + : base(target) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0036_AutomaticGenericTypesRegistration : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { +// Domain.Model.Dump(); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = new Person(); + var personSyncInfo = new SyncInfo(person); + var user = new User(); + var userSyncInfo = new SyncInfo(user); + var userSecurityInfo = new SecurityInfo(user); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0082_ReferentialManagerProblem.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0082_ReferentialManagerProblem.cs index f90e18f83f..2ecd259e59 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0082_ReferentialManagerProblem.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0082_ReferentialManagerProblem.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.04 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0082_ReferentialManagerProblem_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0082_ReferentialManagerProblem_Model -{ - [Serializable] - [HierarchyRoot] - public class Ancestor : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - public class Descendant : Ancestor - { - [Field] - public Descendant Ref1 { get; set; } - - [Field] - public EntitySet Set1 { get; private set; } - - [Field, Association(PairTo = "Set3")] - public EntitySet Set2 { get; private set; } - - [Field] - public EntitySet Set3 { get; private set; } - - [Field] - public String StringField { get; set; } - - [Field] - public Descendant Ref2 { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0082_ReferentialManagerProblem : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new Descendant {StringField = "1",}; - new Descendant {StringField = "2",}; - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var allD = from d in session.Query.All() select d; - foreach (var d in allD) - d.Remove(); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.04 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0082_ReferentialManagerProblem_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0082_ReferentialManagerProblem_Model +{ + [Serializable] + [HierarchyRoot] + public class Ancestor : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + public class Descendant : Ancestor + { + [Field] + public Descendant Ref1 { get; set; } + + [Field] + public EntitySet Set1 { get; private set; } + + [Field, Association(PairTo = "Set3")] + public EntitySet Set2 { get; private set; } + + [Field] + public EntitySet Set3 { get; private set; } + + [Field] + public String StringField { get; set; } + + [Field] + public Descendant Ref2 { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0082_ReferentialManagerProblem : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new Descendant {StringField = "1",}; + new Descendant {StringField = "2",}; + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var allD = from d in session.Query.All() select d; + foreach (var d in allD) + d.Remove(); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0096_NumerousSchemaExtraction.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0096_NumerousSchemaExtraction.cs index e70453648d..8d79fc0f38 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0096_NumerousSchemaExtraction.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0096_NumerousSchemaExtraction.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.06.09 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0096_NumerousSchemaExtraction_Model; -using Xtensive.Orm.Building; - -namespace Xtensive.Orm.Tests.Issues.Issue0096_NumerousSchemaExtraction_Model -{ - [Serializable] - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public class Ancestor : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - [Explicit("Manual usage only.")] - public class Issue0096_NumerousSchemaExtraction - { - public class ModelChanger : IModule - { - public static bool IsActive { get; set; } - - public void OnBuilt(Domain domain) - { - } - - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsActive) - return; - - if (!model.Types.Contains("Ancestor")) - return; - - var type = model.Types["Ancestor"]; - var newField = new FieldDef(typeof (int), context.Validator); - newField.Name = "NewField"; - type.Fields.Add(newField); - } - } - - private void BuildDomain(DomainUpgradeMode mode) - { - var config = DomainConfigurationFactory.Create(); - config.UpgradeMode = mode; - config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new Ancestor(); - t.Complete(); - } - } - - } - - [Test] - public void MainTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - BuildDomain(DomainUpgradeMode.Recreate); - BuildDomain(DomainUpgradeMode.Validate); - ModelChanger.IsActive = true; - BuildDomain(DomainUpgradeMode.Perform); - ModelChanger.IsActive = false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.06.09 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0096_NumerousSchemaExtraction_Model; +using Xtensive.Orm.Building; + +namespace Xtensive.Orm.Tests.Issues.Issue0096_NumerousSchemaExtraction_Model +{ + [Serializable] + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public class Ancestor : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + [Explicit("Manual usage only.")] + public class Issue0096_NumerousSchemaExtraction + { + public class ModelChanger : IModule + { + public static bool IsActive { get; set; } + + public void OnBuilt(Domain domain) + { + } + + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsActive) + return; + + if (!model.Types.Contains("Ancestor")) + return; + + var type = model.Types["Ancestor"]; + var newField = new FieldDef(typeof (int), context.Validator); + newField.Name = "NewField"; + type.Fields.Add(newField); + } + } + + private void BuildDomain(DomainUpgradeMode mode) + { + var config = DomainConfigurationFactory.Create(); + config.UpgradeMode = mode; + config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new Ancestor(); + t.Complete(); + } + } + + } + + [Test] + public void MainTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + BuildDomain(DomainUpgradeMode.Recreate); + BuildDomain(DomainUpgradeMode.Validate); + ModelChanger.IsActive = true; + BuildDomain(DomainUpgradeMode.Perform); + ModelChanger.IsActive = false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0167_SingleTableProblem.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0167_SingleTableProblem.cs index 8d17f08044..3a4b2da427 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0167_SingleTableProblem.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0167_SingleTableProblem.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.06.09 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0167_SingleTableProblem_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0167_SingleTableProblem_Model -{ - [Serializable] - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public class Ancestor : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - public class Descendant : Ancestor - { - [Field] - public int NotNullableField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0167_SingleTableProblem : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new Ancestor(); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.06.09 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0167_SingleTableProblem_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0167_SingleTableProblem_Model +{ + [Serializable] + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public class Ancestor : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + public class Descendant : Ancestor + { + [Field] + public int NotNullableField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0167_SingleTableProblem : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Ancestor).Assembly, typeof (Ancestor).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new Ancestor(); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0188_ModelBuilderError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0188_ModelBuilderError.cs index edfe4c73df..554af93826 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0188_ModelBuilderError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0188_ModelBuilderError.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.12 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0188_ModelBuilderError_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0188_ModelBuilderError_Model -{ - [Serializable] - [HierarchyRoot] - public class A : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public B B { get; set; } - } - - [Serializable] - public class B : A - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0188_ModelBuilderError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (A).Assembly, typeof (A).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - - - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.12 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0188_ModelBuilderError_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0188_ModelBuilderError_Model +{ + [Serializable] + [HierarchyRoot] + public class A : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public B B { get; set; } + } + + [Serializable] + public class B : A + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0188_ModelBuilderError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (A).Assembly, typeof (A).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + + + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0245_StructureWhere.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0245_StructureWhere.cs index 4a5d291e4c..e5ee17f381 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0245_StructureWhere.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0245_StructureWhere.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.06.25 - -using System; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0245_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0245_Model -{ - [Serializable] - public class Point : Structure - { - [Field] - public int X { get; set; } - - [Field] - public int Y { get; set; } - - public Point() { } - - public Point(int x, int y) - { - X = x; - Y = y; - } - } - - [Serializable] - [HierarchyRoot] - public class Range : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Point Left { get; set; } - - [Field] - public Point Right { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - [Serializable] - public class Issue0245_StructureWhere : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Range).Namespace); - return config; - } - - - [Test] - public void Test1() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var points = session.Query.All().Select(r => r.Left).Where(p => p == new Point(10, 1)); - var list = points.ToList(); - } - } - - [Test] - public void Test2() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var filter = new Point(10, 1); - var points = session.Query.All().Where(r => r.Left == filter).Select(r => r.Left); - var list = points.ToList(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.06.25 + +using System; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0245_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0245_Model +{ + [Serializable] + public class Point : Structure + { + [Field] + public int X { get; set; } + + [Field] + public int Y { get; set; } + + public Point() { } + + public Point(int x, int y) + { + X = x; + Y = y; + } + } + + [Serializable] + [HierarchyRoot] + public class Range : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Point Left { get; set; } + + [Field] + public Point Right { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + [Serializable] + public class Issue0245_StructureWhere : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Range).Namespace); + return config; + } + + + [Test] + public void Test1() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var points = session.Query.All().Select(r => r.Left).Where(p => p == new Point(10, 1)); + var list = points.ToList(); + } + } + + [Test] + public void Test2() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var filter = new Point(10, 1); + var points = session.Query.All().Where(r => r.Left == filter).Select(r => r.Left); + var list = points.ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0262_StructureAssignment.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0262_StructureAssignment.cs index de3e0328cf..8cd192f80b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0262_StructureAssignment.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0262_StructureAssignment.cs @@ -1,117 +1,117 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.06.29 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0262_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0262_Model -{ - [Serializable] - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Pair Value { get; set; } - } - - [Serializable] - public class Pair : Structure - { - [Field] - public int One { get; set; } - - [Field] - public int Two { get; set; } - - public Pair(int one, int two) - { - One = one; - Two = two; - } - - public Pair() - { - } - } - - [Serializable] - public class Triple : Pair - { - [Field] - public int Three { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0262_StructureAssignment : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); - return config; - } - - [Test] - public void SetTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var container = new Container(); - try { - container.Value = new Triple(); - Assert.Fail(); - } catch (InvalidOperationException) { - - } - - // Rollback - } - } - } - - [Test] - public void CastTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var container = new Container(); - try { - container.Value = (Pair)new Triple(); - Assert.Fail(); - } catch (InvalidOperationException) { - - } - - // Rollback - } - } - } - - [Test] - public void ValidTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var container = new Container(); - var triple = new Triple(); - container.Value = new Pair(triple.One, triple.Two); - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.06.29 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0262_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0262_Model +{ + [Serializable] + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Pair Value { get; set; } + } + + [Serializable] + public class Pair : Structure + { + [Field] + public int One { get; set; } + + [Field] + public int Two { get; set; } + + public Pair(int one, int two) + { + One = one; + Two = two; + } + + public Pair() + { + } + } + + [Serializable] + public class Triple : Pair + { + [Field] + public int Three { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0262_StructureAssignment : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); + return config; + } + + [Test] + public void SetTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var container = new Container(); + try { + container.Value = new Triple(); + Assert.Fail(); + } catch (InvalidOperationException) { + + } + + // Rollback + } + } + } + + [Test] + public void CastTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var container = new Container(); + try { + container.Value = (Pair)new Triple(); + Assert.Fail(); + } catch (InvalidOperationException) { + + } + + // Rollback + } + } + } + + [Test] + public void ValidTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var container = new Container(); + var triple = new Triple(); + container.Value = new Pair(triple.One, triple.Two); + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0271_EntityNotInserted.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0271_EntityNotInserted.cs index 6c67971fce..a241b7f866 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0271_EntityNotInserted.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0271_EntityNotInserted.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.07.07 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0271_Model; - - -namespace Xtensive.Orm.Tests.Issues.Issue0271_Model -{ - [Serializable] - [HierarchyRoot] - public class Address : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Address Address { get; set; } - - [Field, Association("User", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Deny)] - public Account Account { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Account : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public User User { get; set; } - } -} -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0271_EntityNotInserted : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof (Issue0271_Model.Address).Namespace); - return config; - } - - [Test] - public void EntityNotInsertedTest() - { - using (var session = Domain.OpenSession()) - using (TransactionScope t = session.OpenTransaction()) { - var a = new Address(); - var u = new User(); - var ac = new Account(); - u.Address = a; - u.Account = ac; - - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.07.07 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0271_Model; + + +namespace Xtensive.Orm.Tests.Issues.Issue0271_Model +{ + [Serializable] + [HierarchyRoot] + public class Address : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Address Address { get; set; } + + [Field, Association("User", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Deny)] + public Account Account { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Account : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public User User { get; set; } + } +} +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0271_EntityNotInserted : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof (Issue0271_Model.Address).Namespace); + return config; + } + + [Test] + public void EntityNotInsertedTest() + { + using (var session = Domain.OpenSession()) + using (TransactionScope t = session.OpenTransaction()) { + var a = new Address(); + var u = new User(); + var ac = new Account(); + u.Address = a; + u.Account = ac; + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0276_DuplicateIndex.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0276_DuplicateIndex.cs index 77b61003ff..d8c0aaa72d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0276_DuplicateIndex.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0276_DuplicateIndex.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.29 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0276_DuplicateIndex_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0276_DuplicateIndex_Model -{ - [Serializable] - [HierarchyRoot] - [Index("Id", Unique = true, Name = "IX_Id")] - [Index("Left", Unique = true, Name = "IX_L")] - [Index("Right", Unique = true, Name = "IX_R")] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public MyEntity Left { get; set; } - - [Field(Length = 128)] - public Key Right { get; set; } - } - - [Serializable] - [KeyGenerator(null)] - [HierarchyRoot] - [Index("Target", Unique = true)] - public class MyEntityInfo : Entity where TEntity : Entity - { - [Field, Key] - public TEntity Target { get; private set; } - - public MyEntityInfo (TEntity target) - : base(target) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0276_DuplicateIndex : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var type = Domain.Model.Types[typeof (MyEntity)]; - Assert.AreEqual(6, type.Indexes.Count); - - type = Domain.Model.Types[typeof (MyEntityInfo)]; - Assert.AreEqual(2, type.Indexes.Count); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.29 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0276_DuplicateIndex_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0276_DuplicateIndex_Model +{ + [Serializable] + [HierarchyRoot] + [Index("Id", Unique = true, Name = "IX_Id")] + [Index("Left", Unique = true, Name = "IX_L")] + [Index("Right", Unique = true, Name = "IX_R")] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public MyEntity Left { get; set; } + + [Field(Length = 128)] + public Key Right { get; set; } + } + + [Serializable] + [KeyGenerator(null)] + [HierarchyRoot] + [Index("Target", Unique = true)] + public class MyEntityInfo : Entity where TEntity : Entity + { + [Field, Key] + public TEntity Target { get; private set; } + + public MyEntityInfo (TEntity target) + : base(target) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0276_DuplicateIndex : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var type = Domain.Model.Types[typeof (MyEntity)]; + Assert.AreEqual(6, type.Indexes.Count); + + type = Domain.Model.Types[typeof (MyEntityInfo)]; + Assert.AreEqual(2, type.Indexes.Count); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0282_EntitySetContains.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0282_EntitySetContains.cs index 6414df9dca..a565b7a2cd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0282_EntitySetContains.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0282_EntitySetContains.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.07.10 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0282_EntitySetContains_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0282_EntitySetContains_Model -{ - [Serializable] - [HierarchyRoot] - public abstract class Parent : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Items { get; private set; } - } - - [Serializable] - public class Child : Parent - { - } - - [Serializable] - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0282_EntitySetContains : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var child = new Child(); - var item = new Item(); - child.Items.Contains(item); - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.07.10 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0282_EntitySetContains_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0282_EntitySetContains_Model +{ + [Serializable] + [HierarchyRoot] + public abstract class Parent : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Items { get; private set; } + } + + [Serializable] + public class Child : Parent + { + } + + [Serializable] + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0282_EntitySetContains : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var child = new Child(); + var item = new Item(); + child.Items.Contains(item); + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0296_DeferredConstraints.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0296_DeferredConstraints.cs index e0cfb4b9a4..90a64a42c4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0296_DeferredConstraints.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0296_DeferredConstraints.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.07.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0296_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0296_Model -{ - [Serializable] - [HierarchyRoot] - public class Node : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Node Right { get; set; } - - [Field] - public Node Left { get; set; } - - [Field] - public Node Top { get; set; } - - [Field] - public Node Bottom { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [Ignore("Requires manual profiling")] - public class Issue0296_DeferredConstraints : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); - return config; - } - - [Test] - public void MainTest() - { - const int count = 50; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var root = new Node(); - for (int i = 0; i < count-1; i++) { - var next = new Node(); - root.Right = next; - root.Left = new Node(); - root = next; - } - - Assert.Less(count, Session.Current.EntityChangeRegistry.GetItems(PersistenceState.New).Count()); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.07.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0296_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0296_Model +{ + [Serializable] + [HierarchyRoot] + public class Node : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Node Right { get; set; } + + [Field] + public Node Left { get; set; } + + [Field] + public Node Top { get; set; } + + [Field] + public Node Bottom { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [Ignore("Requires manual profiling")] + public class Issue0296_DeferredConstraints : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); + return config; + } + + [Test] + public void MainTest() + { + const int count = 50; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var root = new Node(); + for (int i = 0; i < count-1; i++) { + var next = new Node(); + root.Right = next; + root.Left = new Node(); + root = next; + } + + Assert.Less(count, Session.Current.EntityChangeRegistry.GetItems(PersistenceState.New).Count()); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0298_InheritedAssociationIsIgnored.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0298_InheritedAssociationIsIgnored.cs index ac8fbc084d..0b14e3d879 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0298_InheritedAssociationIsIgnored.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0298_InheritedAssociationIsIgnored.cs @@ -1,104 +1,104 @@ -// Copyright (C) a Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: a -// Created: a - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0298_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues.Issue0298_Model -{ - [Serializable] - [HierarchyRoot] - public class Master : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - [Association("Master", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Deny)] - public EntitySet Tracks { get; private set; } - } - - [Serializable] - public class AudioMaster : Master - { - } - - [Serializable] - [HierarchyRoot] - public class MasterTrack : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Master Master { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0298_InheritedAssociationIsIgnored : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var am = new AudioMaster(); - am.Tracks.Add(new MasterTrack()); - am.Tracks.Add(new MasterTrack()); - - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(2, session.Query.All().Count()); - - AssertEx.Throws(() => am.Tracks.First().Remove()); - - am.Remove(); - - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - // Rollback - } - } - } - - [Test] - public void ClientPrifileTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()){ - - var am = new AudioMaster(); - am.Tracks.Add(new MasterTrack()); - am.Tracks.Add(new MasterTrack()); - - //Assert.AreEqual(1, session.Query.All().Count()); - //Assert.AreEqual(2, session.Query.All().Count()); - - AssertEx.Throws(() => ((IEnumerable) am.Tracks).First().Remove()); - - am.Remove(); - - //Assert.AreEqual(0, session.Query.All().Count()); - //Assert.AreEqual(0, session.Query.All().Count()); - // Rollback - } - } - } +// Copyright (C) a Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: a +// Created: a + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0298_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues.Issue0298_Model +{ + [Serializable] + [HierarchyRoot] + public class Master : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + [Association("Master", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Deny)] + public EntitySet Tracks { get; private set; } + } + + [Serializable] + public class AudioMaster : Master + { + } + + [Serializable] + [HierarchyRoot] + public class MasterTrack : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Master Master { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0298_InheritedAssociationIsIgnored : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var am = new AudioMaster(); + am.Tracks.Add(new MasterTrack()); + am.Tracks.Add(new MasterTrack()); + + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(2, session.Query.All().Count()); + + AssertEx.Throws(() => am.Tracks.First().Remove()); + + am.Remove(); + + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + // Rollback + } + } + } + + [Test] + public void ClientPrifileTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()){ + + var am = new AudioMaster(); + am.Tracks.Add(new MasterTrack()); + am.Tracks.Add(new MasterTrack()); + + //Assert.AreEqual(1, session.Query.All().Count()); + //Assert.AreEqual(2, session.Query.All().Count()); + + AssertEx.Throws(() => ((IEnumerable) am.Tracks).First().Remove()); + + am.Remove(); + + //Assert.AreEqual(0, session.Query.All().Count()); + //Assert.AreEqual(0, session.Query.All().Count()); + // Rollback + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0307_EntitySetOfType.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0307_EntitySetOfType.cs index 91b0f45dac..6709e26d23 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0307_EntitySetOfType.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0307_EntitySetOfType.cs @@ -1,124 +1,124 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.08.13 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0307_EntitySetOfType_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0307_EntitySetOfType_Model - { - [Serializable] - [HierarchyRoot] - public class Company : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Employees { get; private set; } - } - - [Serializable] - public class Consultant : Employee - { - public Consultant(Company company, string firstName, string lastName, Skill mainSkill) - : base(company, firstName, lastName) - { - MainSkill = mainSkill; - } - - [Field] - public Skill MainSkill { get; private set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.Deny)] - public EntitySet Skills { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Employee : Entity - { - [Field, Key] - public int Id { get; private set; } - - public Employee(Company company, string firstName, string lastName) - { - if (company == null) throw new ArgumentNullException("company"); - - Company = company; - FirstName = firstName; - LastName = lastName; - } - - [Field] - [Association("Employees", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Company Company { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - public override string ToString() - { - return string.Format("{0} {1}", FirstName, LastName); - } - } - - [Serializable] - [HierarchyRoot] - public class Skill : Entity - { - [Field, Key] - public int Id { get; private set; } - - public Skill(string name) - { - Name = name; - } - - [Field] - public string Name { get; private set; } - } - } - - - [Serializable] - public class Issue0307_EntitySetOfType : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Skill).Assembly, typeof(Skill).Namespace); - return config; - } - - - [Test] - public void Test() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var company = new Company(); - var skill = new Skill("Programmer"); - var employee = new Employee(company, "Joe", "Smith"); - var consultant = new Consultant(company, "George", "Carlson", skill); - - var consultants = from comp in session.Query.All() - from cons in comp.Employees.OfType() - select cons; - foreach (var c in consultants) - Console.WriteLine(c.ToString()); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.08.13 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0307_EntitySetOfType_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0307_EntitySetOfType_Model + { + [Serializable] + [HierarchyRoot] + public class Company : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Employees { get; private set; } + } + + [Serializable] + public class Consultant : Employee + { + public Consultant(Company company, string firstName, string lastName, Skill mainSkill) + : base(company, firstName, lastName) + { + MainSkill = mainSkill; + } + + [Field] + public Skill MainSkill { get; private set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.Deny)] + public EntitySet Skills { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Employee : Entity + { + [Field, Key] + public int Id { get; private set; } + + public Employee(Company company, string firstName, string lastName) + { + if (company == null) throw new ArgumentNullException("company"); + + Company = company; + FirstName = firstName; + LastName = lastName; + } + + [Field] + [Association("Employees", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Company Company { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + public override string ToString() + { + return string.Format("{0} {1}", FirstName, LastName); + } + } + + [Serializable] + [HierarchyRoot] + public class Skill : Entity + { + [Field, Key] + public int Id { get; private set; } + + public Skill(string name) + { + Name = name; + } + + [Field] + public string Name { get; private set; } + } + } + + + [Serializable] + public class Issue0307_EntitySetOfType : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Skill).Assembly, typeof(Skill).Namespace); + return config; + } + + + [Test] + public void Test() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var company = new Company(); + var skill = new Skill("Programmer"); + var employee = new Employee(company, "Joe", "Smith"); + var consultant = new Consultant(company, "George", "Carlson", skill); + + var consultants = from comp in session.Query.All() + from cons in comp.Employees.OfType() + select cons; + foreach (var c in consultants) + Console.WriteLine(c.ToString()); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0331_ForgetHierarchyRoot.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0331_ForgetHierarchyRoot.cs index 4ea19c05ff..5afaa79f84 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0331_ForgetHierarchyRoot.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0331_ForgetHierarchyRoot.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.03 - -using System; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0331_ForgetHierarchyRoot_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0331_ForgetHierarchyRoot_Model -{ - [Serializable] - [HierarchyRoot] - public class Cell : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public int X { get; set; } - - [Field] - public int Y { get; set; } - - [Field, Association(PairTo = "Cell", OnTargetRemove = OnRemoveAction.Clear)] - public Creature Creature { get; set; } - } - - [Serializable] - public class Creature : Entity - { - [Key, Field] - public int ID { get; private set; } - - [Field] - public Cell Cell { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0331_ForgetHierarchyRoot : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Cell).Assembly, typeof (Cell).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain = null; - AssertEx.Throws(() => domain = base.BuildDomain(configuration)); - return domain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.03 + +using System; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0331_ForgetHierarchyRoot_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0331_ForgetHierarchyRoot_Model +{ + [Serializable] + [HierarchyRoot] + public class Cell : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public int X { get; set; } + + [Field] + public int Y { get; set; } + + [Field, Association(PairTo = "Cell", OnTargetRemove = OnRemoveAction.Clear)] + public Creature Creature { get; set; } + } + + [Serializable] + public class Creature : Entity + { + [Key, Field] + public int ID { get; private set; } + + [Field] + public Cell Cell { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0331_ForgetHierarchyRoot : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Cell).Assembly, typeof (Cell).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain = null; + AssertEx.Throws(() => domain = base.BuildDomain(configuration)); + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0351_NameBuilderProblem.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0351_NameBuilderProblem.cs index 50775fea89..2ec228c241 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0351_NameBuilderProblem.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0351_NameBuilderProblem.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.24 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0351_NameBuilderProblem_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0351_NameBuilderProblem_Model -{ - [Serializable] - [HierarchyRoot] - public class Master : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Slaves { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Slave : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0351_NameBuilderProblem : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); - config.NamingConvention.NamespacePolicy = NamespacePolicy.AsIs; - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.24 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0351_NameBuilderProblem_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0351_NameBuilderProblem_Model +{ + [Serializable] + [HierarchyRoot] + public class Master : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Slaves { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Slave : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0351_NameBuilderProblem : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); + config.NamingConvention.NamespacePolicy = NamespacePolicy.AsIs; + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0359_UpgradeUsingAutoshortenTransaction.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0359_UpgradeUsingAutoshortenTransaction.cs index 463b736300..62aa8ec327 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0359_UpgradeUsingAutoshortenTransaction.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0359_UpgradeUsingAutoshortenTransaction.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.24 - -using System; -using System.Transactions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0359_CustomSessionConfigurationProblem_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0359_CustomSessionConfigurationProblem_Model -{ - [Serializable] - [HierarchyRoot] - public class Class1 : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0359_UpgradeUsingAutoshortenTransaction : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = DomainConfigurationFactory.Create(); - config.ForeignKeyMode = ForeignKeyMode.All; - config.KeyGeneratorCacheSize = 32; - - config.UpgradeMode = DomainUpgradeMode.Recreate; - - config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); - config.Sessions.Default.DefaultIsolationLevel = IsolationLevel.Serializable; - - return config; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.24 + +using System; +using System.Transactions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0359_CustomSessionConfigurationProblem_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0359_CustomSessionConfigurationProblem_Model +{ + [Serializable] + [HierarchyRoot] + public class Class1 : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0359_UpgradeUsingAutoshortenTransaction : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = DomainConfigurationFactory.Create(); + config.ForeignKeyMode = ForeignKeyMode.All; + config.KeyGeneratorCacheSize = 32; + + config.UpgradeMode = DomainUpgradeMode.Recreate; + + config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); + config.Sessions.Default.DefaultIsolationLevel = IsolationLevel.Serializable; + + return config; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0370_EntitiSetIsNotHandledProperly.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0370_EntitiSetIsNotHandledProperly.cs index 75c1a62293..8619b2fba2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0370_EntitiSetIsNotHandledProperly.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0370_EntitiSetIsNotHandledProperly.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.03 - -using System; -using System.Runtime.Serialization; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0370_EntitiSetIsNotHandledProperly_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0370_EntitiSetIsNotHandledProperly_Model -{ - [Serializable] - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public ContainerItemSet Items { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class ContainerItem : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class ContainerItemSet : EntitySet - { - protected ContainerItemSet(Entity owner, FieldInfo field) - : base(owner, field) - {} - - protected ContainerItemSet(SerializationInfo info, StreamingContext context) - : base(info, context) - {} - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0370_EntitiSetIsNotHandledProperly : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var c = new Container(); - c.Items.Add(new ContainerItem()); - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.03 + +using System; +using System.Runtime.Serialization; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0370_EntitiSetIsNotHandledProperly_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0370_EntitiSetIsNotHandledProperly_Model +{ + [Serializable] + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public ContainerItemSet Items { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class ContainerItem : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class ContainerItemSet : EntitySet + { + protected ContainerItemSet(Entity owner, FieldInfo field) + : base(owner, field) + {} + + protected ContainerItemSet(SerializationInfo info, StreamingContext context) + : base(info, context) + {} + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0370_EntitiSetIsNotHandledProperly : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var c = new Container(); + c.Items.Add(new ContainerItem()); + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0371_ObjectEquals.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0371_ObjectEquals.cs index 063c9120d9..a69fd79814 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0371_ObjectEquals.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0371_ObjectEquals.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.09.02 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.Issues.Issue0371_ObjectEquals_Model; -using System.Linq; -using Xtensive.Orm.Tests.Linq; - -namespace Xtensive.Orm.Tests.Issues.Issue0371_ObjectEquals_Model -{ - [Serializable] - [HierarchyRoot] - public class Item : Entity - { - [Field][Key] - public int Id { get; private set; } - - [Field] - public string Name { get; private set; } - - public static bool Equals() - { - return true; - } - - public new static bool Equals(object a, object b) - { - return true; - } - - public new static bool Equals(Item a, Item b) - { - return true; - } - - public Item() - { - Name = Guid.NewGuid().ToString(); - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0371_ObjectEquals : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); - return config; - } - - [Test] - public void ObjectEqualsTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var item1 = new Item(); - var item2 = new Item(); - var result = session.Query.All().Where(item => Equals(item, item1)); - QueryDumper.Dump(result); - // Rollback - } - } - } - - [Test] - public void ItemEquals1Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var item1 = new Item(); - var item2 = new Item(); - var result = session.Query.All().Where(item => Item.Equals((object)item, (object)item1)); - Assert.Throws(() => QueryDumper.Dump(result)); - // Rollback - } - } - } - - [Test] - public void ItemEquals2Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var item1 = new Item(); - var item2 = new Item(); - var result = session.Query.All().Where(item => Item.Equals(item, item1)); - QueryDumper.Dump(result); - // Rollback - } - } - } - - [Test] - public void ClassEqualsTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var item1 = new Item(); - var item2 = new Item(); - var result = session.Query.All().Where(item => String.Equals(item.Name, item1.Name)); - QueryDumper.Dump(result); - // Rollback - } - } - } - - [Test] - public void StringEqualsTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var item1 = new Item(); - var item2 = new Item(); - var result = session.Query.All().Where(item => item.Equals(item1)); - QueryDumper.Dump(result); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.09.02 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.Issues.Issue0371_ObjectEquals_Model; +using System.Linq; +using Xtensive.Orm.Tests.Linq; + +namespace Xtensive.Orm.Tests.Issues.Issue0371_ObjectEquals_Model +{ + [Serializable] + [HierarchyRoot] + public class Item : Entity + { + [Field][Key] + public int Id { get; private set; } + + [Field] + public string Name { get; private set; } + + public static bool Equals() + { + return true; + } + + public new static bool Equals(object a, object b) + { + return true; + } + + public new static bool Equals(Item a, Item b) + { + return true; + } + + public Item() + { + Name = Guid.NewGuid().ToString(); + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0371_ObjectEquals : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); + return config; + } + + [Test] + public void ObjectEqualsTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var item1 = new Item(); + var item2 = new Item(); + var result = session.Query.All().Where(item => Equals(item, item1)); + QueryDumper.Dump(result); + // Rollback + } + } + } + + [Test] + public void ItemEquals1Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var item1 = new Item(); + var item2 = new Item(); + var result = session.Query.All().Where(item => Item.Equals((object)item, (object)item1)); + Assert.Throws(() => QueryDumper.Dump(result)); + // Rollback + } + } + } + + [Test] + public void ItemEquals2Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var item1 = new Item(); + var item2 = new Item(); + var result = session.Query.All().Where(item => Item.Equals(item, item1)); + QueryDumper.Dump(result); + // Rollback + } + } + } + + [Test] + public void ClassEqualsTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var item1 = new Item(); + var item2 = new Item(); + var result = session.Query.All().Where(item => String.Equals(item.Name, item1.Name)); + QueryDumper.Dump(result); + // Rollback + } + } + } + + [Test] + public void StringEqualsTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var item1 = new Item(); + var item2 = new Item(); + var result = session.Query.All().Where(item => item.Equals(item1)); + QueryDumper.Dump(result); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0372_SelfReferenceWithInheritance.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0372_SelfReferenceWithInheritance.cs index 2bb6343e46..2e1f1f93d2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0372_SelfReferenceWithInheritance.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0372_SelfReferenceWithInheritance.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.09.03 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0372_SelfReferenceWithInheritance_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0372_SelfReferenceWithInheritance_Model -{ - [HierarchyRoot] - public class MyEntity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - private MyEntity MyEntityField { get; set; } - - public MyEntity() - { - MyEntityField = this; - } - } - - [Serializable] - [HierarchyRoot] - public class Item - : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public WebSite WebSite { get; set; } - - [Field] - public WebSite WebSite2 { get; set; } - } - - [Serializable] - public class WebSite - : Item - { - [Field] - public string DomainName { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0372_SelfReferenceWithInheritance : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (WebSite).Assembly, typeof (WebSite).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var webSite = new WebSite(); - webSite.WebSite = webSite; // self-refernece - Session.Current.SaveChanges(); - // Rollback - } - } - } - - [Test] - public void DualSelfreferenceTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var webSite = new WebSite(); - webSite.WebSite = webSite; // self-refernece 1 - webSite.WebSite2 = webSite; // self-refernece 2 - Session.Current.SaveChanges(); - // Rollback - } - } - } - - [Test] - public void SelfreferenceTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var myEntity = new MyEntity(); - Session.Current.SaveChanges(); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.09.03 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0372_SelfReferenceWithInheritance_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0372_SelfReferenceWithInheritance_Model +{ + [HierarchyRoot] + public class MyEntity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + private MyEntity MyEntityField { get; set; } + + public MyEntity() + { + MyEntityField = this; + } + } + + [Serializable] + [HierarchyRoot] + public class Item + : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public WebSite WebSite { get; set; } + + [Field] + public WebSite WebSite2 { get; set; } + } + + [Serializable] + public class WebSite + : Item + { + [Field] + public string DomainName { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0372_SelfReferenceWithInheritance : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (WebSite).Assembly, typeof (WebSite).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var webSite = new WebSite(); + webSite.WebSite = webSite; // self-refernece + Session.Current.SaveChanges(); + // Rollback + } + } + } + + [Test] + public void DualSelfreferenceTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var webSite = new WebSite(); + webSite.WebSite = webSite; // self-refernece 1 + webSite.WebSite2 = webSite; // self-refernece 2 + Session.Current.SaveChanges(); + // Rollback + } + } + } + + [Test] + public void SelfreferenceTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var myEntity = new MyEntity(); + Session.Current.SaveChanges(); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0376_RemoveFieldHint.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0376_RemoveFieldHint.cs index 7c2cd0a8fc..759b923ec8 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0376_RemoveFieldHint.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0376_RemoveFieldHint.cs @@ -1,215 +1,215 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.10.09 - -using System; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade; -using System.Reflection; -using System.Linq; - -#region Models - -namespace Xtensive.Orm.Tests.Issues.Issue0376.Model1 -{ - [Serializable] - [HierarchyRoot] - public class Father : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string LastName { get; set; } - } - - [Serializable] - public class Son : Father - { - [Field] - public string FirstName { get; set; } - - [Field] - public string NickName { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.Issue0376.Model2 -{ - [Serializable] - [HierarchyRoot] - public class Father : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string LastName { get; set; } - - [Field] - public string FirstName { get; set; } - } - - [Serializable] - public class Son : Father - { - [Field] - public string NickName { get; set; } - } - - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - - /// Handler is already enabled. - public static IDisposable Enable() - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - return new Disposable(_ => { - isEnabled = false; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override void AddUpgradeHints(ISet hints) - { - var oldNamespace = "Xtensive.Orm.Tests.Issues.Issue0376.Model1"; - hints.Add(new RenameTypeHint(oldNamespace + ".Father", typeof (Father))); - hints.Add(new RenameTypeHint(oldNamespace + ".Son", typeof (Son))); - hints.Add(new MoveFieldHint(oldNamespace + ".Son", "FirstName", typeof (Father))); -// hintSet.Add(new CopyFieldHint(oldNamescpace + ".Son", "FirstName", typeof (Father))); -// hintSet.Add(new RemoveFieldHint(oldNamescpace + ".Son", "FirstName")); - } - } -} - -namespace Xtensive.Orm.Tests.Issues.Issue0376.Model3 -{ - [Serializable] - [HierarchyRoot] - public class Father : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string LastName { get; set; } - - [Field] - public string FirstName { get; set; } - } - - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - - /// Handler is already enabled. - public static IDisposable Enable() - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - return new Disposable(_ => { - isEnabled = false; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override void AddUpgradeHints(ISet hints) - { - var oldNamespace = "Xtensive.Orm.Tests.Issues.Issue0376.Model2"; - hints.Add(new RenameTypeHint(oldNamespace + ".Father", typeof (Father))); - hints.Add(new RemoveTypeHint(oldNamespace + ".Son")); - } - } -} - -#endregion - - -namespace Xtensive.Orm.Tests.Issues -{ - using M1 = Issue0376.Model1; - using M2 = Issue0376.Model2; - using M3 = Issue0376.Model3; - - [TestFixture] - public class Issue0376_RemoveFieldHint : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model1"); - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - var domain = base.BuildDomain(configuration); - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - var son = new M1.Son {FirstName = "FirstName", LastName = "LastName", NickName = "NickName"}; - transactionScope.Complete(); - } - } - return domain; - } - - [Test] - public void BaseTest() - { - Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); - // Test MoveFieldHint (RemoveFieldHint) - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model2"); - config.UpgradeMode = DomainUpgradeMode.PerformSafely; - Domain domain; - using (M2.Upgrader.Enable()) { - domain = Domain.Build(config); - } - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - var son = session.Query.All().Single(); - Assert.AreEqual("FirstName", son.FirstName); - Assert.AreEqual("LastName", son.LastName); - Assert.AreEqual("NickName", son.NickName); - transactionScope.Complete(); - } - } - - // Test RemoveTypeHint - config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model3"); - config.UpgradeMode = DomainUpgradeMode.PerformSafely; - using (M3.Upgrader.Enable()) { - domain = Domain.Build(config); - } - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - Assert.IsTrue(session.Query.All().Count()==0); - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.10.09 + +using System; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade; +using System.Reflection; +using System.Linq; + +#region Models + +namespace Xtensive.Orm.Tests.Issues.Issue0376.Model1 +{ + [Serializable] + [HierarchyRoot] + public class Father : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string LastName { get; set; } + } + + [Serializable] + public class Son : Father + { + [Field] + public string FirstName { get; set; } + + [Field] + public string NickName { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.Issue0376.Model2 +{ + [Serializable] + [HierarchyRoot] + public class Father : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string LastName { get; set; } + + [Field] + public string FirstName { get; set; } + } + + [Serializable] + public class Son : Father + { + [Field] + public string NickName { get; set; } + } + + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + + /// Handler is already enabled. + public static IDisposable Enable() + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + return new Disposable(_ => { + isEnabled = false; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override void AddUpgradeHints(ISet hints) + { + var oldNamespace = "Xtensive.Orm.Tests.Issues.Issue0376.Model1"; + hints.Add(new RenameTypeHint(oldNamespace + ".Father", typeof (Father))); + hints.Add(new RenameTypeHint(oldNamespace + ".Son", typeof (Son))); + hints.Add(new MoveFieldHint(oldNamespace + ".Son", "FirstName", typeof (Father))); +// hintSet.Add(new CopyFieldHint(oldNamescpace + ".Son", "FirstName", typeof (Father))); +// hintSet.Add(new RemoveFieldHint(oldNamescpace + ".Son", "FirstName")); + } + } +} + +namespace Xtensive.Orm.Tests.Issues.Issue0376.Model3 +{ + [Serializable] + [HierarchyRoot] + public class Father : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string LastName { get; set; } + + [Field] + public string FirstName { get; set; } + } + + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + + /// Handler is already enabled. + public static IDisposable Enable() + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + return new Disposable(_ => { + isEnabled = false; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override void AddUpgradeHints(ISet hints) + { + var oldNamespace = "Xtensive.Orm.Tests.Issues.Issue0376.Model2"; + hints.Add(new RenameTypeHint(oldNamespace + ".Father", typeof (Father))); + hints.Add(new RemoveTypeHint(oldNamespace + ".Son")); + } + } +} + +#endregion + + +namespace Xtensive.Orm.Tests.Issues +{ + using M1 = Issue0376.Model1; + using M2 = Issue0376.Model2; + using M3 = Issue0376.Model3; + + [TestFixture] + public class Issue0376_RemoveFieldHint : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model1"); + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + var son = new M1.Son {FirstName = "FirstName", LastName = "LastName", NickName = "NickName"}; + transactionScope.Complete(); + } + } + return domain; + } + + [Test] + public void BaseTest() + { + Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); + // Test MoveFieldHint (RemoveFieldHint) + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model2"); + config.UpgradeMode = DomainUpgradeMode.PerformSafely; + Domain domain; + using (M2.Upgrader.Enable()) { + domain = Domain.Build(config); + } + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + var son = session.Query.All().Single(); + Assert.AreEqual("FirstName", son.FirstName); + Assert.AreEqual("LastName", son.LastName); + Assert.AreEqual("NickName", son.NickName); + transactionScope.Complete(); + } + } + + // Test RemoveTypeHint + config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Issues.Issue0376.Model3"); + config.UpgradeMode = DomainUpgradeMode.PerformSafely; + using (M3.Upgrader.Enable()) { + domain = Domain.Build(config); + } + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + Assert.IsTrue(session.Query.All().Count()==0); + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0391_OnRemoveActionNone.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0391_OnRemoveActionNone.cs index eaafef714a..fce25228e6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0391_OnRemoveActionNone.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0391_OnRemoveActionNone.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.21 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0391_OnRemoveActionNone_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0391_OnRemoveActionNone_Model -{ - [Serializable] - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.None)] - public Customer Customer { get; set; } - - public bool HasCustomerKey() - { - var field = GetTypeInfo().Fields["Customer"]; - return GetReferenceKey(field)!=null; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0391_OnRemoveActionNone : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var c = new Customer(); - var o = new Order(); - o.Customer = c; - c.Remove(); - Assert.IsTrue(o.HasCustomerKey()); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.21 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0391_OnRemoveActionNone_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0391_OnRemoveActionNone_Model +{ + [Serializable] + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.None)] + public Customer Customer { get; set; } + + public bool HasCustomerKey() + { + var field = GetTypeInfo().Fields["Customer"]; + return GetReferenceKey(field)!=null; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0391_OnRemoveActionNone : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var c = new Customer(); + var o = new Order(); + o.Customer = c; + c.Remove(); + Assert.IsTrue(o.HasCustomerKey()); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0394_UndefinedSqlTypeExtractionError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0394_UndefinedSqlTypeExtractionError.cs index bbc0ae1e23..3fbb2a9919 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0394_UndefinedSqlTypeExtractionError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0394_UndefinedSqlTypeExtractionError.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.09.11 - -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using System.Linq; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Sql; - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0394_UndefinedSqlTypeExtractionError : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.SqlServerCe); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = DomainConfigurationFactory.Create(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Genre)); - return config; - } - - [Test] - public void MainTest() - { - var schemaName = Domain.StorageProviderInfo.DefaultSchema; - - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - var domainHandler = Domain.Handler; - string createTableCommandText; - if (Domain.Configuration.ConnectionInfo.Provider==WellKnown.Provider.SqlServer) - createTableCommandText = "CREATE TABLE " + schemaName + ".[TestTable] ([TestColumn] [money])"; - else - createTableCommandText = "CREATE TABLE [TestTable] ([TestColumn] [money])"; - var executor = session.Services.Demand(); - executor.ExecuteNonQuery(createTableCommandText); - transactionScope.Complete(); - } - } - - var domain = BuildDomain(BuildConfiguration()); - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var driver = Domain.Handlers.StorageDriver; - var defaultSchema = driver.ProviderInfo.DefaultSchema; - var defaultDatabase = driver.ProviderInfo.DefaultDatabase; - var connection = ((SqlSessionHandler) session.Handler).Connection; - - var schema = driver - .Extract(connection, new[] {new SqlExtractionTask(defaultDatabase, defaultSchema)}) - .Catalogs.SelectMany(c => c.Schemas).First(); - - Assert.IsNull(schema.Tables.SingleOrDefault(table => table.Name=="TestTable")); - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.09.11 + +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using System.Linq; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Sql; + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0394_UndefinedSqlTypeExtractionError : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.SqlServerCe); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = DomainConfigurationFactory.Create(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Genre)); + return config; + } + + [Test] + public void MainTest() + { + var schemaName = Domain.StorageProviderInfo.DefaultSchema; + + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + var domainHandler = Domain.Handler; + string createTableCommandText; + if (Domain.Configuration.ConnectionInfo.Provider==WellKnown.Provider.SqlServer) + createTableCommandText = "CREATE TABLE " + schemaName + ".[TestTable] ([TestColumn] [money])"; + else + createTableCommandText = "CREATE TABLE [TestTable] ([TestColumn] [money])"; + var executor = session.Services.Demand(); + executor.ExecuteNonQuery(createTableCommandText); + transactionScope.Complete(); + } + } + + var domain = BuildDomain(BuildConfiguration()); + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var driver = Domain.Handlers.StorageDriver; + var defaultSchema = driver.ProviderInfo.DefaultSchema; + var defaultDatabase = driver.ProviderInfo.DefaultDatabase; + var connection = ((SqlSessionHandler) session.Handler).Connection; + + var schema = driver + .Extract(connection, new[] {new SqlExtractionTask(defaultDatabase, defaultSchema)}) + .Catalogs.SelectMany(c => c.Schemas).First(); + + Assert.IsNull(schema.Tables.SingleOrDefault(table => table.Name=="TestTable")); + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0402_WrongEntitySetQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0402_WrongEntitySetQuery.cs index a80bcd90cb..de46c13819 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0402_WrongEntitySetQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0402_WrongEntitySetQuery.cs @@ -1,115 +1,115 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.15 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0402_WrongEntitySetQuery_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0402_WrongEntitySetQuery_Model -{ - [Serializable] - [HierarchyRoot] - public class Node : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Node Parent { get; set;} - - [Field] - [Association(PairTo = "Parent")] - public EntitySet Children { get; private set; } - - public Node(string name) - { - Name = name; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0402_WrongEntitySetQuery : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var root1 = new Node("1"); - key = root1.Key; - var child11 = new Node("11"); - var child12 = new Node("12"); - root1.Children.Add(child11); - root1.Children.Add(child12); - child11.Children.Add(new Node("111")); - child11.Children.Add(new Node("112")); - child12.Children.Add(new Node("121")); - child12.Children.Add(new Node("122")); - - var root2 = new Node("2"); - var child21 = new Node("21"); - var child22 = new Node("22"); - root2.Children.Add(child21); - root2.Children.Add(child22); - child21.Children.Add(new Node("211")); - child21.Children.Add(new Node("212")); - child22.Children.Add(new Node("221")); - child22.Children.Add(new Node("222")); - - t.Complete(); - } - } - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var root1 = session.Query.Single(key); - Console.WriteLine("Direct query"); - var directQuery = session.Query - .All() - .Where(node => root1.Children.Contains(node.Parent)); - var enumerable = session.Query - .All() - .AsEnumerable(); - var directQueryExpected = enumerable - .Where(node => root1.Children.AsEnumerable().Contains(node.Parent)); - foreach (var node in directQuery) - Console.WriteLine(node.Name); - Assert.AreEqual(0, directQueryExpected.Except(directQuery).Count()); - - - Console.WriteLine("Query through EntitySet"); - var entitySet = root1.Children; - var entitySetQuery = session.Query - .All() - .Where(node => entitySet.Contains(node.Parent)); - var entitySetQueryExpected = session.Query - .All() - .AsEnumerable() - .Where(node => entitySet.AsEnumerable().Contains(node.Parent)); - foreach (var node in entitySetQuery) - Console.WriteLine(node.Name); - Assert.AreEqual(0, entitySetQueryExpected.Except(entitySetQuery).Count()); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.15 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0402_WrongEntitySetQuery_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0402_WrongEntitySetQuery_Model +{ + [Serializable] + [HierarchyRoot] + public class Node : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Node Parent { get; set;} + + [Field] + [Association(PairTo = "Parent")] + public EntitySet Children { get; private set; } + + public Node(string name) + { + Name = name; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0402_WrongEntitySetQuery : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var root1 = new Node("1"); + key = root1.Key; + var child11 = new Node("11"); + var child12 = new Node("12"); + root1.Children.Add(child11); + root1.Children.Add(child12); + child11.Children.Add(new Node("111")); + child11.Children.Add(new Node("112")); + child12.Children.Add(new Node("121")); + child12.Children.Add(new Node("122")); + + var root2 = new Node("2"); + var child21 = new Node("21"); + var child22 = new Node("22"); + root2.Children.Add(child21); + root2.Children.Add(child22); + child21.Children.Add(new Node("211")); + child21.Children.Add(new Node("212")); + child22.Children.Add(new Node("221")); + child22.Children.Add(new Node("222")); + + t.Complete(); + } + } + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var root1 = session.Query.Single(key); + Console.WriteLine("Direct query"); + var directQuery = session.Query + .All() + .Where(node => root1.Children.Contains(node.Parent)); + var enumerable = session.Query + .All() + .AsEnumerable(); + var directQueryExpected = enumerable + .Where(node => root1.Children.AsEnumerable().Contains(node.Parent)); + foreach (var node in directQuery) + Console.WriteLine(node.Name); + Assert.AreEqual(0, directQueryExpected.Except(directQuery).Count()); + + + Console.WriteLine("Query through EntitySet"); + var entitySet = root1.Children; + var entitySetQuery = session.Query + .All() + .Where(node => entitySet.Contains(node.Parent)); + var entitySetQueryExpected = session.Query + .All() + .AsEnumerable() + .Where(node => entitySet.AsEnumerable().Contains(node.Parent)); + foreach (var node in entitySetQuery) + Console.WriteLine(node.Name); + Assert.AreEqual(0, entitySetQueryExpected.Except(entitySetQuery).Count()); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference.cs index 3ec88c9c2a..959e099f84 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2009.09.17 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model; - - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0408_EntitySetNullReference - { - [Test] - public void Main() - { - Require.ProviderIs(StorageProvider.SqlServer); - - // Initialize domain - Domain domain; - try - { - var domainConfig = DomainConfigurationFactory.Create(); - domainConfig.NamingConvention.NamespacePolicy = NamespacePolicy.AsIs; - - // Load assemblies with persistent classes from configuration : - TestLog.Info("Loading plugins..."); - - domainConfig.Types.Register(typeof(QueueProcessor).Assembly, typeof(QueueProcessor).Namespace); - - domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; - domain = Domain.Build(domainConfig); - } - catch (DomainBuilderException e) - { - TestLog.Error("Domain build failed: " + e.ToString()); - throw; - } - - string key = CreateObjects.CreateTestEchoQueueProcessor(domain); - - IList workList = QueueProcessor.GetWork(key, domain); - foreach (object workUnit in workList) - { - QueueProcessor.Execute(key, workUnit, domain); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2009.09.17 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model; + + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0408_EntitySetNullReference + { + [Test] + public void Main() + { + Require.ProviderIs(StorageProvider.SqlServer); + + // Initialize domain + Domain domain; + try + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.NamingConvention.NamespacePolicy = NamespacePolicy.AsIs; + + // Load assemblies with persistent classes from configuration : + TestLog.Info("Loading plugins..."); + + domainConfig.Types.Register(typeof(QueueProcessor).Assembly, typeof(QueueProcessor).Namespace); + + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + domain = Domain.Build(domainConfig); + } + catch (DomainBuilderException e) + { + TestLog.Error("Domain build failed: " + e.ToString()); + throw; + } + + string key = CreateObjects.CreateTestEchoQueueProcessor(domain); + + IList workList = QueueProcessor.GetWork(key, domain); + foreach (object workUnit in workList) + { + QueueProcessor.Execute(key, workUnit, domain); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Container.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Container.cs index 0580c6b8c8..7938405740 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Container.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Container.cs @@ -1,30 +1,30 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public long Id {get ; private set;} - - [Field] - public string Name { get; set; } - - [Field, Association(PairTo = "Container", OnTargetRemove = OnRemoveAction.Deny)] - public EntitySet Documents { get; private set; } - - public virtual T CreateDocument(string name) where T : Document, new() - { - T doc = new T() { Name = name }; - Documents.Add(doc); - return doc; - } - - public override string ToString() - { - return String.Format("[Container]<{0}>::Name='{1}'::Count='{2}'", Id, Name, Documents.Count); - } - } -} +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public long Id {get ; private set;} + + [Field] + public string Name { get; set; } + + [Field, Association(PairTo = "Container", OnTargetRemove = OnRemoveAction.Deny)] + public EntitySet Documents { get; private set; } + + public virtual T CreateDocument(string name) where T : Document, new() + { + T doc = new T() { Name = name }; + Documents.Add(doc); + return doc; + } + + public override string ToString() + { + return String.Format("[Container]<{0}>::Name='{1}'::Count='{2}'", Id, Name, Documents.Count); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/CreateObjects.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/CreateObjects.cs index d76159c874..0d93ddb2d3 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/CreateObjects.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/CreateObjects.cs @@ -1,49 +1,49 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - public static class CreateObjects - { - public static string CreateTestEchoQueueProcessor(Domain domain) - { - Container inputContainer = null; - Container outputContainer = null; - Container processedInputContainer = null; - - string key = null; - - using (var session = domain.OpenSession()) - { - using (var transactionScope = session.OpenTransaction()) - { - inputContainer = new Container { Name = "DebugInputContainer" }; - inputContainer.CreateDocument("FirstDocument"); - - outputContainer = new Container { Name = "DebugOutputContainer" }; - processedInputContainer = new Container { Name = "DebugProcessedContainer" }; - transactionScope.Complete(); - } - - // - using (var transactionScope = session.OpenTransaction()) - { - EchoProcessor echoProcessor = new EchoProcessor - { - Name = "testEchoProcessor", - InputContainer = inputContainer, - OutputContainer = outputContainer, - ProcessedContainer = processedInputContainer - }; - key = echoProcessor.SchedulerKey; - transactionScope.Complete(); - } - } - - return key; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + public static class CreateObjects + { + public static string CreateTestEchoQueueProcessor(Domain domain) + { + Container inputContainer = null; + Container outputContainer = null; + Container processedInputContainer = null; + + string key = null; + + using (var session = domain.OpenSession()) + { + using (var transactionScope = session.OpenTransaction()) + { + inputContainer = new Container { Name = "DebugInputContainer" }; + inputContainer.CreateDocument("FirstDocument"); + + outputContainer = new Container { Name = "DebugOutputContainer" }; + processedInputContainer = new Container { Name = "DebugProcessedContainer" }; + transactionScope.Complete(); + } + + // + using (var transactionScope = session.OpenTransaction()) + { + EchoProcessor echoProcessor = new EchoProcessor + { + Name = "testEchoProcessor", + InputContainer = inputContainer, + OutputContainer = outputContainer, + ProcessedContainer = processedInputContainer + }; + key = echoProcessor.SchedulerKey; + transactionScope.Complete(); + } + } + + return key; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.History.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.History.cs index 5b5ec52d82..3d622edbb0 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.History.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.History.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - public partial class Document : Entity - { - [Field, Association(PairTo = "Owner", OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet HistoryEntries { get; private set; } - - public void AddHistoryEntry(string what, HistoryEntryVisibility visibility) - { - HistoryEntries.Add(new HistoryEntry { What = what, Visibility = visibility, When = DateTime.Now }); - TestLog.Debug("History entry added for {0}. {1}What : {2}", ToString(), Environment.NewLine, what); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + public partial class Document : Entity + { + [Field, Association(PairTo = "Owner", OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet HistoryEntries { get; private set; } + + public void AddHistoryEntry(string what, HistoryEntryVisibility visibility) + { + HistoryEntries.Add(new HistoryEntry { What = what, Visibility = visibility, When = DateTime.Now }); + TestLog.Debug("History entry added for {0}. {1}What : {2}", ToString(), Environment.NewLine, what); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.cs index 6c2e2100d7..561f141f3d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Document.cs @@ -1,167 +1,167 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [HierarchyRoot] - public partial class Document : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string DocumentType { get; set; } - - [Field] - public Container Container { get; set; } - - /// - /// Automatically filled creation date of Document. (UTC Time) - /// - [Field] - protected DateTime CreationDate { get; set; } - - [Field, Association(PairTo = "LinkSource", OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet LinksFromThis { get; private set; } - - [Field, Association(PairTo = "LinkDestination", OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet LinksToThis { get; private set; } - - public Document() - { - CreationDate = DateTime.UtcNow; - } - - /// - /// Create a new group whose head will be this document - /// - public void CreateNewGroupAndAddThis() - { - CreateNewLinkfromMe(this, LinkSemantic.GroupHeadToDocumentInGroup); - TestLog.Debug("Starting a new group : head document is " + this); - } - - /// - /// Create a new DocumentLink with this document as source. - /// Possible semantics: "GroupHeadToDocumentInGroup", ... - /// - // DOFIXME : remove this function (one line ... ) - public void CreateNewLinkfromMe(Document destination, LinkSemantic semantic) - { - if (destination == null) - { - throw new ArgumentNullException("destination"); - } - - DocumentLink newLink = new DocumentLink { LinkSemantic = semantic, LinkDestination=destination, LinkSource=this}; - } - - /// - /// Returns the heads of all the groups that this document belongs to. - /// The heads are returnd in descending order of creation date, i.e. from innermost to the outermost group - /// - /// - /// The 'head' of a group is the Document that is the 'LinkSource' for all DocumentLinks in the group. - /// Implementation note : do not sort with - /// 'Order By {LinkSource.CreationDate} Desc' - /// instead of - /// 'Order By {LinkSource.ID} Desc' - /// Confirmed risk of error if the server date is changed (NTP synchronization) while the agent is running. - /// - /// - public List FindHeadsFromGroupsIBelongTo() - { - var heads = from link in Session.Demand().Query.All() - where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup - where link.LinkDestination == this - orderby link.LinkSource.Id descending - select link.LinkSource ; - return heads.ToList(); - } - - /// - /// Find all documents in the group whose head is this document - /// - /// empty list if none - public List FindDocumentsInGroup() - { - var documents = from link in Session.Demand().Query.All() - where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup - where link.LinkSource == this - select link.LinkDestination; - - return documents.ToList(); - } - - public override string ToString() - { - return - "[Document]<" + Id + ">" + - "Name='" + Name + "'::" + - (String.IsNullOrEmpty(DocumentType) ? null : "::DocType='" + DocumentType + "'::") + - "Container=[" + Container + "]::" ; - } - - - #region FindDocumentsInMyGroupsByType (based on DocumentType) - - /// - /// Find a document with the given DocumentType in the same group as this document. - /// If this document belongs to multiple groups, return the document of the nearest (innermost) group first. - /// - /// 'maxDepth' is the number of heads to consider for the search in the group : - /// * maxDepth = 1 : search only in nearest group (i.e. keep only 1 head (the most recent) in the group) - /// * maxDepth = 0 : search in all groups (no depth limit) - /// - /// Please note that we suppose that the head of the inner group belongs - /// to the outer group : e.g. the outer group contains the inner group : - /// No orthogonal group allowed. - /// - /// - public List FindDocumentsInMyGroupsByType(string documentType, int maxDepth) - { - List result = new List(); - List heads = FindHeadsFromGroupsIBelongTo(); - - // if there is a depth limit, remove all unnecessary heads (0 = no depth limit, 1 = innermost group only) - if (maxDepth != 0 && heads.Count > maxDepth) - { - //log.DebugFormat("Found too many heads ({0} > {1}), won't follow group with head {2}", heads.Count, maxDepth, heads[heads.Count - 1]); - while (heads.Count > maxDepth) - heads.RemoveAt(heads.Count - 1); - } - - // Heads are sorted from innermost group to outermost group - foreach (Document head in heads) - { - // Select DocumentLinks from head with the desired DocumentType : - - var qr = from link in Session.Demand().Query.All() - where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup - where link.LinkSource == head - where link.LinkDestination.DocumentType == documentType - select link.LinkDestination; - - //QueryResult qr; - //using (Query q = Session.CreateQuery("Select DocumentLink instances where {LinkSemantic}=@semantic and LinkSource=@head and {LinkDestination.DocumentType}=@docType")) - //{ - // q.Parameters.Add("@semantic", LinkSemantic.GroupHeadToDocumentInGroup); - // q.Parameters.Add("@head", head); - // q.Parameters.Add("@docType", documentType); - // qr = q.Execute(); - //} - - result.AddRange(qr); - } - return result; - } - - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [HierarchyRoot] + public partial class Document : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string DocumentType { get; set; } + + [Field] + public Container Container { get; set; } + + /// + /// Automatically filled creation date of Document. (UTC Time) + /// + [Field] + protected DateTime CreationDate { get; set; } + + [Field, Association(PairTo = "LinkSource", OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet LinksFromThis { get; private set; } + + [Field, Association(PairTo = "LinkDestination", OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet LinksToThis { get; private set; } + + public Document() + { + CreationDate = DateTime.UtcNow; + } + + /// + /// Create a new group whose head will be this document + /// + public void CreateNewGroupAndAddThis() + { + CreateNewLinkfromMe(this, LinkSemantic.GroupHeadToDocumentInGroup); + TestLog.Debug("Starting a new group : head document is " + this); + } + + /// + /// Create a new DocumentLink with this document as source. + /// Possible semantics: "GroupHeadToDocumentInGroup", ... + /// + // DOFIXME : remove this function (one line ... ) + public void CreateNewLinkfromMe(Document destination, LinkSemantic semantic) + { + if (destination == null) + { + throw new ArgumentNullException("destination"); + } + + DocumentLink newLink = new DocumentLink { LinkSemantic = semantic, LinkDestination=destination, LinkSource=this}; + } + + /// + /// Returns the heads of all the groups that this document belongs to. + /// The heads are returnd in descending order of creation date, i.e. from innermost to the outermost group + /// + /// + /// The 'head' of a group is the Document that is the 'LinkSource' for all DocumentLinks in the group. + /// Implementation note : do not sort with + /// 'Order By {LinkSource.CreationDate} Desc' + /// instead of + /// 'Order By {LinkSource.ID} Desc' + /// Confirmed risk of error if the server date is changed (NTP synchronization) while the agent is running. + /// + /// + public List FindHeadsFromGroupsIBelongTo() + { + var heads = from link in Session.Demand().Query.All() + where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup + where link.LinkDestination == this + orderby link.LinkSource.Id descending + select link.LinkSource ; + return heads.ToList(); + } + + /// + /// Find all documents in the group whose head is this document + /// + /// empty list if none + public List FindDocumentsInGroup() + { + var documents = from link in Session.Demand().Query.All() + where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup + where link.LinkSource == this + select link.LinkDestination; + + return documents.ToList(); + } + + public override string ToString() + { + return + "[Document]<" + Id + ">" + + "Name='" + Name + "'::" + + (String.IsNullOrEmpty(DocumentType) ? null : "::DocType='" + DocumentType + "'::") + + "Container=[" + Container + "]::" ; + } + + + #region FindDocumentsInMyGroupsByType (based on DocumentType) + + /// + /// Find a document with the given DocumentType in the same group as this document. + /// If this document belongs to multiple groups, return the document of the nearest (innermost) group first. + /// + /// 'maxDepth' is the number of heads to consider for the search in the group : + /// * maxDepth = 1 : search only in nearest group (i.e. keep only 1 head (the most recent) in the group) + /// * maxDepth = 0 : search in all groups (no depth limit) + /// + /// Please note that we suppose that the head of the inner group belongs + /// to the outer group : e.g. the outer group contains the inner group : + /// No orthogonal group allowed. + /// + /// + public List FindDocumentsInMyGroupsByType(string documentType, int maxDepth) + { + List result = new List(); + List heads = FindHeadsFromGroupsIBelongTo(); + + // if there is a depth limit, remove all unnecessary heads (0 = no depth limit, 1 = innermost group only) + if (maxDepth != 0 && heads.Count > maxDepth) + { + //log.DebugFormat("Found too many heads ({0} > {1}), won't follow group with head {2}", heads.Count, maxDepth, heads[heads.Count - 1]); + while (heads.Count > maxDepth) + heads.RemoveAt(heads.Count - 1); + } + + // Heads are sorted from innermost group to outermost group + foreach (Document head in heads) + { + // Select DocumentLinks from head with the desired DocumentType : + + var qr = from link in Session.Demand().Query.All() + where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup + where link.LinkSource == head + where link.LinkDestination.DocumentType == documentType + select link.LinkDestination; + + //QueryResult qr; + //using (Query q = Session.CreateQuery("Select DocumentLink instances where {LinkSemantic}=@semantic and LinkSource=@head and {LinkDestination.DocumentType}=@docType")) + //{ + // q.Parameters.Add("@semantic", LinkSemantic.GroupHeadToDocumentInGroup); + // q.Parameters.Add("@head", head); + // q.Parameters.Add("@docType", documentType); + // qr = q.Execute(); + //} + + result.AddRange(qr); + } + return result; + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/DocumentLink.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/DocumentLink.cs index d9b6b73661..b1f933890d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/DocumentLink.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/DocumentLink.cs @@ -1,38 +1,38 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - [HierarchyRoot] - public class DocumentLink : Entity - { - [Field, Key] - public long Id { get; private set; } - - /// - /// A link between two documents. E.g. corrected invoice with correcting invoice, corrected invoice with credit memo. - /// - [Field] - public LinkSemantic LinkSemantic { get; set; } - - /// - /// In case of a group defining link, this the head of the group. - /// - [Field] - public Document LinkSource { get; set; } - - /// - /// In case of a group defining link, this is the object belonging to the group - /// - [Field] - public Document LinkDestination { get; set; } - } - - public enum LinkSemantic - { - GroupHeadToDocumentInGroup = 0, - CorrectedInvoiceToCorrectingInvoice = 1, - CorrectedInvoiceToCreditMemo = 2, - InvoiceOnMeasurementToEstimatedInvoice = 3 - } -} +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + [HierarchyRoot] + public class DocumentLink : Entity + { + [Field, Key] + public long Id { get; private set; } + + /// + /// A link between two documents. E.g. corrected invoice with correcting invoice, corrected invoice with credit memo. + /// + [Field] + public LinkSemantic LinkSemantic { get; set; } + + /// + /// In case of a group defining link, this the head of the group. + /// + [Field] + public Document LinkSource { get; set; } + + /// + /// In case of a group defining link, this is the object belonging to the group + /// + [Field] + public Document LinkDestination { get; set; } + } + + public enum LinkSemantic + { + GroupHeadToDocumentInGroup = 0, + CorrectedInvoiceToCorrectingInvoice = 1, + CorrectedInvoiceToCreditMemo = 2, + InvoiceOnMeasurementToEstimatedInvoice = 3 + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/EchoProcessor.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/EchoProcessor.cs index 5424108eeb..d2d441a9b3 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/EchoProcessor.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/EchoProcessor.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - public class EchoProcessor : QueueProcessor - { - public override void ProcessDocument(Document inputDocument) - { - TestLog.Info("Entered EchoProcessor.Process() "); - - Document outputDocument = OutputContainer.CreateDocument("output test document"); - MoveDocumentsToOutputAndDoneContainers(outputDocument, inputDocument); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + public class EchoProcessor : QueueProcessor + { + public override void ProcessDocument(Document inputDocument) + { + TestLog.Info("Entered EchoProcessor.Process() "); + + Document outputDocument = OutputContainer.CreateDocument("output test document"); + MoveDocumentsToOutputAndDoneContainers(outputDocument, inputDocument); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/ErrorDocument.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/ErrorDocument.cs index 5161d118de..d2ec738c17 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/ErrorDocument.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/ErrorDocument.cs @@ -1,28 +1,28 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - public class ErrorDocument : Document - { - [Field] - public string LinkedMessage { get; set; } - - [Field] - public Document LinkedDocument { get; set; } - - [Field] - public Processor ExecutableHavingCausedTheError { get; set; } - - [Field] - public Container OriginalContainer { get; set; } - - [Field] - public DateTime? RetryAfter { get; set; } - - public DateTime? GetDateOfFirstSimilarError() - { - return null; - } - } -} +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + public class ErrorDocument : Document + { + [Field] + public string LinkedMessage { get; set; } + + [Field] + public Document LinkedDocument { get; set; } + + [Field] + public Processor ExecutableHavingCausedTheError { get; set; } + + [Field] + public Container OriginalContainer { get; set; } + + [Field] + public DateTime? RetryAfter { get; set; } + + public DateTime? GetDateOfFirstSimilarError() + { + return null; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntry.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntry.cs index fd50658c59..c96b7bee5c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntry.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntry.cs @@ -1,27 +1,27 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - [HierarchyRoot] - public class HistoryEntry : Entity - { - [Field, Key] - public long Id { get; private set; } - - public const HistoryEntryVisibility VisibilityForAll = HistoryEntryVisibility.EndUser | HistoryEntryVisibility.AdministratorUser | HistoryEntryVisibility.Debugger; - - [Field(Length = Int32.MaxValue)] - public string What { get; set; } - - [Field] - public DateTime When { get; set; } - - [Field] - public HistoryEntryVisibility Visibility { get; set; } - - [Field] - public Document Owner { get; set; } - - } -} +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + [HierarchyRoot] + public class HistoryEntry : Entity + { + [Field, Key] + public long Id { get; private set; } + + public const HistoryEntryVisibility VisibilityForAll = HistoryEntryVisibility.EndUser | HistoryEntryVisibility.AdministratorUser | HistoryEntryVisibility.Debugger; + + [Field(Length = Int32.MaxValue)] + public string What { get; set; } + + [Field] + public DateTime When { get; set; } + + [Field] + public HistoryEntryVisibility Visibility { get; set; } + + [Field] + public Document Owner { get; set; } + + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntryVisibility.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntryVisibility.cs index 2d1a61d149..cfa3c5950f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntryVisibility.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/HistoryEntryVisibility.cs @@ -1,21 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - /// - /// Allows specifying who shall see a particular history entry. - /// Consider also HistoryEntry.VisibilityForAll . - /// - [Flags] - [Serializable] - public enum HistoryEntryVisibility : int - { - None = 0, - EndUser = 1, - AdministratorUser = 2, - Debugger = 4 - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + /// + /// Allows specifying who shall see a particular history entry. + /// Consider also HistoryEntry.VisibilityForAll . + /// + [Flags] + [Serializable] + public enum HistoryEntryVisibility : int + { + None = 0, + EndUser = 1, + AdministratorUser = 2, + Debugger = 4 + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Processor.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Processor.cs index f129f1a61e..de07652cca 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Processor.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/Processor.cs @@ -1,115 +1,115 @@ -using System; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - [HierarchyRoot] - public abstract class Processor : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public bool Enabled { get; set; } - - [Field] - public Container OutputContainer { get; set; } - - [Field] - public string DocumentTypeToProduce { get; set; } - - protected Processor() - { - Enabled = true; - } - - - #region Helper functions to be used in sub classes - - /// - /// Propagate all the links that point to sourceDocument to destinationDocument - /// - /// - /// - protected void PropagateAllGroups(Document sourceDocument, Document destinationDocument) - { - TestLog.Debug("Propagating to document {0} all groups of document {1}.", destinationDocument, sourceDocument); - - //// Does the source document belong to any group(s) ? - //QueryResult qr; - //using (Query q = Session.CreateQuery("Select DocumentLink instances where {LinkSemantic}=@semantic and LinkDestination=@ourSource")) - //{ - // q.Parameters.Add("@semantic", LinkSemantic.GroupHeadToDocumentInGroup); - // q.Parameters.Add("@ourSource", sourceDocument); - // qr = q.Execute(); - //} - - var qr = from link in Session.Demand().Query.All() - where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup - where link.LinkDestination == sourceDocument - select link; - - if (qr.Count() > 0) - { - foreach (DocumentLink link in qr) - { - if (destinationDocument == link.LinkDestination) - { - // The link we are about to create is already exactly the one which is already present. - // This happens when we move a document which just received a link from some other source. - // E.g. this document was just promoted head of a group by e.g. UnBundleEDIFACTOxl. - continue; - } - - // propagate all groups of sourceDocument to destinationDocument - link.LinkSource.CreateNewLinkfromMe(destinationDocument, link.LinkSemantic); - TestLog.Debug("Document/ID={0} inherits a link from Document/ID={1}. Head of the group is Document/ID={2}. (LinkSemantic={3})", destinationDocument.Id, sourceDocument.Id, link.LinkSource.Id, link.LinkSemantic); - } - } - else - { - TestLog.Warning("Creating a new group from this document because no links point to it. (Document is {0})", sourceDocument); - sourceDocument.CreateNewGroupAndAddThis(); - } - } - - /// - /// Link sourceDocument and outputDocument together, and then move the first argument to outputContainer. - /// - /// - /// - /// - protected void LinkToSourceDocumentAndMoveToContainer(Document outputDocument, Document sourceDocument, Container outputContainer) - { - System.Diagnostics.Debug.Assert(Transaction.Current != null, "Cannot execute out of a transaction"); - - PropagateAllGroups(sourceDocument, outputDocument); - MoveDocumentToContainer(outputDocument, outputContainer); - } - - /// - /// Move document from outputContainer to doneContainer. - /// - /// - /// - /// - protected void MoveDocumentToContainer(Document document, Container container) - { - System.Diagnostics.Debug.Assert(Transaction.Current != null, "Cannot execute out of a transaction"); - - if (container == null) - { - throw new ArgumentNullException("container", "The container must be non-null."); - } - TestLog.Debug("Moving " + document + " from " + document.Container + " to " + container); - document.Container = container; - } - - - #endregion - } -} +using System; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + [HierarchyRoot] + public abstract class Processor : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public bool Enabled { get; set; } + + [Field] + public Container OutputContainer { get; set; } + + [Field] + public string DocumentTypeToProduce { get; set; } + + protected Processor() + { + Enabled = true; + } + + + #region Helper functions to be used in sub classes + + /// + /// Propagate all the links that point to sourceDocument to destinationDocument + /// + /// + /// + protected void PropagateAllGroups(Document sourceDocument, Document destinationDocument) + { + TestLog.Debug("Propagating to document {0} all groups of document {1}.", destinationDocument, sourceDocument); + + //// Does the source document belong to any group(s) ? + //QueryResult qr; + //using (Query q = Session.CreateQuery("Select DocumentLink instances where {LinkSemantic}=@semantic and LinkDestination=@ourSource")) + //{ + // q.Parameters.Add("@semantic", LinkSemantic.GroupHeadToDocumentInGroup); + // q.Parameters.Add("@ourSource", sourceDocument); + // qr = q.Execute(); + //} + + var qr = from link in Session.Demand().Query.All() + where link.LinkSemantic == LinkSemantic.GroupHeadToDocumentInGroup + where link.LinkDestination == sourceDocument + select link; + + if (qr.Count() > 0) + { + foreach (DocumentLink link in qr) + { + if (destinationDocument == link.LinkDestination) + { + // The link we are about to create is already exactly the one which is already present. + // This happens when we move a document which just received a link from some other source. + // E.g. this document was just promoted head of a group by e.g. UnBundleEDIFACTOxl. + continue; + } + + // propagate all groups of sourceDocument to destinationDocument + link.LinkSource.CreateNewLinkfromMe(destinationDocument, link.LinkSemantic); + TestLog.Debug("Document/ID={0} inherits a link from Document/ID={1}. Head of the group is Document/ID={2}. (LinkSemantic={3})", destinationDocument.Id, sourceDocument.Id, link.LinkSource.Id, link.LinkSemantic); + } + } + else + { + TestLog.Warning("Creating a new group from this document because no links point to it. (Document is {0})", sourceDocument); + sourceDocument.CreateNewGroupAndAddThis(); + } + } + + /// + /// Link sourceDocument and outputDocument together, and then move the first argument to outputContainer. + /// + /// + /// + /// + protected void LinkToSourceDocumentAndMoveToContainer(Document outputDocument, Document sourceDocument, Container outputContainer) + { + System.Diagnostics.Debug.Assert(Transaction.Current != null, "Cannot execute out of a transaction"); + + PropagateAllGroups(sourceDocument, outputDocument); + MoveDocumentToContainer(outputDocument, outputContainer); + } + + /// + /// Move document from outputContainer to doneContainer. + /// + /// + /// + /// + protected void MoveDocumentToContainer(Document document, Container container) + { + System.Diagnostics.Debug.Assert(Transaction.Current != null, "Cannot execute out of a transaction"); + + if (container == null) + { + throw new ArgumentNullException("container", "The container must be non-null."); + } + TestLog.Debug("Moving " + document + " from " + document.Container + " to " + container); + document.Container = container; + } + + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/QueueProcessor.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/QueueProcessor.cs index dc2da5e2ad..0d575a1587 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/QueueProcessor.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0408_EntitySetNullReference_Model/QueueProcessor.cs @@ -1,223 +1,223 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Orm; -using System.Diagnostics; - -namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model -{ - [Serializable] - public abstract class QueueProcessor : Processor - { - [Field] - public string DocumentTypeToProcess { get; set; } - - [Field] - public Container InputContainer { get; set; } - - [Field] - public Container ProcessedContainer { get; set; } - - public static IList GetWork(string key, Domain domain) - { - using (var session = domain.OpenSession()) - { - QueueProcessor queueProcessor = null; - IList result; - using (TransactionScope transactionScope = session.OpenTransaction()) - { - queueProcessor = GetQueueProcessorByKey(key); - transactionScope.Complete(); - result = queueProcessor.GetWork(); - } - return result; - } - } - - public static void Execute(string key, object workUnit, Domain domain) - { - using (var session = domain.OpenSession()) - { - QueueProcessor queueProcessor = null; - using (TransactionScope transactionScope = session.OpenTransaction()) - { - queueProcessor = GetQueueProcessorByKey(key); - queueProcessor.Execute(workUnit); - transactionScope.Complete(); - } - } - } - - private static QueueProcessor GetQueueProcessorByKey(string key) - { - string[] parts = key.Split('~'); - long id = Convert.ToInt64(parts[1]); - return (from p in Session.Demand().Query.All() - where p.Id == id - select p).FirstOrDefault(); - } - - public string SchedulerKey - { - get - { - return this.GetType().FullName + "~" + this.Id; - } - } - - /// - /// Process one document: override it with your implementation - /// - public virtual void ProcessDocument(Document inputDocument) - { - throw new NotImplementedException(); - } - - public virtual IList GetWork() - { - if (InputContainer == null) - { - throw new InvalidOperationException("A DocumentProcessor should have a not null InputContainer."); - } - - var work = from d in InputContainer.Documents - select (object)d.Id; - - return (IList)work.ToList(); - } - - //-> pour commiter chaque document traité - //on laisse remonter les exceptions dataobjects - public virtual void Execute(object workUnit) - { - long id = (long)workUnit; - Document inputDocument = InputContainer.Documents.Where(d => d.Id == id).FirstOrDefault(); - System.Diagnostics.Debug.Assert(inputDocument != null, "QueueProcessor.Execute() called with nothing to do. There must be a document in the InputContainer"); - - try - { - Document documentToProcess = GetDocumentToProcessFromInputDocument(inputDocument); - if (documentToProcess == null) - { - string message = String.Format("No document with DocumentTypeToProcess={0} found in the group of the inputDocument.", DocumentTypeToProcess); - throw new Exception(message); - } - - ProcessAndMove(inputDocument, documentToProcess); - - } - catch (Exception ex) // yes, general exception type - { - using (TransactionScope transactionScope = Session.OpenTransaction()) - { - string message = String.Format("Exception caught in {0}.Execute() : '", this.Name); - TestLog.Error(message, ex); - - transactionScope.Complete(); - } - } - } - - /// - /// Allow to override default behaviour that is to use ProcessedContainer property - /// - /// - /// EdifactoNoOhSwitch has to containers : one for OH, one for NO - /// - protected virtual Container GetProcessedContainerForDocument(Document inputDocument) - { - return ProcessedContainer; - } - - private void ProcessAndMove(Document inputDocument, Document documentToProcess) - { - // ProcessDocument may disable automatic transactions : - ProcessDocument(documentToProcess); - - documentToProcess.AddHistoryEntry("Document processed by " + this.Name, HistoryEntryVisibility.AdministratorUser); - - Container processedContainer = GetProcessedContainerForDocument(inputDocument); - if (processedContainer != null) - { - MoveDocumentToContainer(inputDocument, processedContainer); - } - else - { - TestLog.Warning("No ContainerForDoneInputDocuments is defined for '{0}' DocumentProcessor", this.Name); - } - } - - #region Helper functions to be used in sub classes - /// - /// Find a document in the same group of a document, with a specified DocumentType. - /// Returns : - /// * the closest document (the document in the innermost group), if multiple documents are found in the group. - /// * null, if no document with the correct DocumentType is found in the group. - /// * the input argument, if this.DocumentTypeToProcess is not set - /// - /// E.g. find the edi document associated with an invoice, find the .ser file associated with an invoice etc. - /// - protected Document GetDocumentToProcessFromInputDocument(Document inputDocument) - { - if (inputDocument == null) - { - TestLog.Warning("Cannot find document to process because {0} is not a Document", inputDocument); - return null; - } - - string documentTypeToProcess = DocumentTypeToProcess; - if (String.IsNullOrEmpty(documentTypeToProcess)) - { - return inputDocument; - } - if (inputDocument.DocumentType == documentTypeToProcess) - { - return inputDocument; - } - - List documentsMatchingDocType = inputDocument.FindDocumentsInMyGroupsByType(documentTypeToProcess, 0); - - // return the document in the innermost group : - if (documentsMatchingDocType.Count > 0) - { - if (documentsMatchingDocType.Count > 1) - { - TestLog.Debug("Found {0} documents matching DocumentType={1} in this group. Returning the document in innermost group : {2}", documentsMatchingDocType.Count, documentTypeToProcess, documentsMatchingDocType[0].Name); - } - return documentsMatchingDocType[0]; - } - - // default : - return null; - } - - /// - /// Move outputDocument to outputContainer, move inputDocument to doneContainer, and create a link between inputDocument and outputDocument - /// - /// Document created within an ExecutableObject execution - /// Document input of a DocumentProcessor - /// - /// - protected void MoveDocumentsToOutputAndDoneContainers(Document outputDocument, Document inputDocument) - { - // 1- README : - // Commenting out the following call to PropagateAllGroups(inputDocument, outputDocument) gives another exception. - PropagateAllGroups(inputDocument, outputDocument); - - // 2- README : - // Interchanging the order of the two calls also gives another exception. Please try : - // MoveDocumentToContainer(inputDocument, ProcessedContainer); - // MoveDocumentToContainer(outputDocument, OutputContainer); - // instead of : - // MoveDocumentToContainer(outputDocument, OutputContainer); - // MoveDocumentToContainer(inputDocument, ProcessedContainer); - MoveDocumentToContainer(outputDocument, OutputContainer); - MoveDocumentToContainer(inputDocument, ProcessedContainer); - } - - - #endregion Helper functions to be used in sub classes - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Orm; +using System.Diagnostics; + +namespace Xtensive.Orm.Tests.Issues.Issue0408_EntitySetNullReference_Model +{ + [Serializable] + public abstract class QueueProcessor : Processor + { + [Field] + public string DocumentTypeToProcess { get; set; } + + [Field] + public Container InputContainer { get; set; } + + [Field] + public Container ProcessedContainer { get; set; } + + public static IList GetWork(string key, Domain domain) + { + using (var session = domain.OpenSession()) + { + QueueProcessor queueProcessor = null; + IList result; + using (TransactionScope transactionScope = session.OpenTransaction()) + { + queueProcessor = GetQueueProcessorByKey(key); + transactionScope.Complete(); + result = queueProcessor.GetWork(); + } + return result; + } + } + + public static void Execute(string key, object workUnit, Domain domain) + { + using (var session = domain.OpenSession()) + { + QueueProcessor queueProcessor = null; + using (TransactionScope transactionScope = session.OpenTransaction()) + { + queueProcessor = GetQueueProcessorByKey(key); + queueProcessor.Execute(workUnit); + transactionScope.Complete(); + } + } + } + + private static QueueProcessor GetQueueProcessorByKey(string key) + { + string[] parts = key.Split('~'); + long id = Convert.ToInt64(parts[1]); + return (from p in Session.Demand().Query.All() + where p.Id == id + select p).FirstOrDefault(); + } + + public string SchedulerKey + { + get + { + return this.GetType().FullName + "~" + this.Id; + } + } + + /// + /// Process one document: override it with your implementation + /// + public virtual void ProcessDocument(Document inputDocument) + { + throw new NotImplementedException(); + } + + public virtual IList GetWork() + { + if (InputContainer == null) + { + throw new InvalidOperationException("A DocumentProcessor should have a not null InputContainer."); + } + + var work = from d in InputContainer.Documents + select (object)d.Id; + + return (IList)work.ToList(); + } + + //-> pour commiter chaque document traité + //on laisse remonter les exceptions dataobjects + public virtual void Execute(object workUnit) + { + long id = (long)workUnit; + Document inputDocument = InputContainer.Documents.Where(d => d.Id == id).FirstOrDefault(); + System.Diagnostics.Debug.Assert(inputDocument != null, "QueueProcessor.Execute() called with nothing to do. There must be a document in the InputContainer"); + + try + { + Document documentToProcess = GetDocumentToProcessFromInputDocument(inputDocument); + if (documentToProcess == null) + { + string message = String.Format("No document with DocumentTypeToProcess={0} found in the group of the inputDocument.", DocumentTypeToProcess); + throw new Exception(message); + } + + ProcessAndMove(inputDocument, documentToProcess); + + } + catch (Exception ex) // yes, general exception type + { + using (TransactionScope transactionScope = Session.OpenTransaction()) + { + string message = String.Format("Exception caught in {0}.Execute() : '", this.Name); + TestLog.Error(message, ex); + + transactionScope.Complete(); + } + } + } + + /// + /// Allow to override default behaviour that is to use ProcessedContainer property + /// + /// + /// EdifactoNoOhSwitch has to containers : one for OH, one for NO + /// + protected virtual Container GetProcessedContainerForDocument(Document inputDocument) + { + return ProcessedContainer; + } + + private void ProcessAndMove(Document inputDocument, Document documentToProcess) + { + // ProcessDocument may disable automatic transactions : + ProcessDocument(documentToProcess); + + documentToProcess.AddHistoryEntry("Document processed by " + this.Name, HistoryEntryVisibility.AdministratorUser); + + Container processedContainer = GetProcessedContainerForDocument(inputDocument); + if (processedContainer != null) + { + MoveDocumentToContainer(inputDocument, processedContainer); + } + else + { + TestLog.Warning("No ContainerForDoneInputDocuments is defined for '{0}' DocumentProcessor", this.Name); + } + } + + #region Helper functions to be used in sub classes + /// + /// Find a document in the same group of a document, with a specified DocumentType. + /// Returns : + /// * the closest document (the document in the innermost group), if multiple documents are found in the group. + /// * null, if no document with the correct DocumentType is found in the group. + /// * the input argument, if this.DocumentTypeToProcess is not set + /// + /// E.g. find the edi document associated with an invoice, find the .ser file associated with an invoice etc. + /// + protected Document GetDocumentToProcessFromInputDocument(Document inputDocument) + { + if (inputDocument == null) + { + TestLog.Warning("Cannot find document to process because {0} is not a Document", inputDocument); + return null; + } + + string documentTypeToProcess = DocumentTypeToProcess; + if (String.IsNullOrEmpty(documentTypeToProcess)) + { + return inputDocument; + } + if (inputDocument.DocumentType == documentTypeToProcess) + { + return inputDocument; + } + + List documentsMatchingDocType = inputDocument.FindDocumentsInMyGroupsByType(documentTypeToProcess, 0); + + // return the document in the innermost group : + if (documentsMatchingDocType.Count > 0) + { + if (documentsMatchingDocType.Count > 1) + { + TestLog.Debug("Found {0} documents matching DocumentType={1} in this group. Returning the document in innermost group : {2}", documentsMatchingDocType.Count, documentTypeToProcess, documentsMatchingDocType[0].Name); + } + return documentsMatchingDocType[0]; + } + + // default : + return null; + } + + /// + /// Move outputDocument to outputContainer, move inputDocument to doneContainer, and create a link between inputDocument and outputDocument + /// + /// Document created within an ExecutableObject execution + /// Document input of a DocumentProcessor + /// + /// + protected void MoveDocumentsToOutputAndDoneContainers(Document outputDocument, Document inputDocument) + { + // 1- README : + // Commenting out the following call to PropagateAllGroups(inputDocument, outputDocument) gives another exception. + PropagateAllGroups(inputDocument, outputDocument); + + // 2- README : + // Interchanging the order of the two calls also gives another exception. Please try : + // MoveDocumentToContainer(inputDocument, ProcessedContainer); + // MoveDocumentToContainer(outputDocument, OutputContainer); + // instead of : + // MoveDocumentToContainer(outputDocument, OutputContainer); + // MoveDocumentToContainer(inputDocument, ProcessedContainer); + MoveDocumentToContainer(outputDocument, OutputContainer); + MoveDocumentToContainer(inputDocument, ProcessedContainer); + } + + + #endregion Helper functions to be used in sub classes + + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0409_ConstructorTransactional.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0409_ConstructorTransactional.cs index fbe88dc072..93a40654ff 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0409_ConstructorTransactional.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0409_ConstructorTransactional.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2009.09.17 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0409_ConstructorTransactional_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0409_ConstructorTransactional_Model -{ - [Serializable] - [HierarchyRoot] - public class Document : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0409_ConstructorTransactional : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); - return config; - } - - [Test] - public void DocumentCreatedInSeparateTransactionTest() - { - Key key; - using (var s = Domain.OpenSession()) { - using (var t = s.OpenTransaction()) { - var document = new Document(); - key = document.Key; - t.Complete(); - } - } - using (var s = Domain.OpenSession()) { - Assert.Throws(() => { var document = s.Query.Single(key); }); - } - } - - [Test] - public void DocumentCreatedInAutoTransactionTest() - { - using (var s = Domain.OpenSession()) { - Assert.Throws(() => { var document = new Document(); }); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2009.09.17 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0409_ConstructorTransactional_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0409_ConstructorTransactional_Model +{ + [Serializable] + [HierarchyRoot] + public class Document : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0409_ConstructorTransactional : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); + return config; + } + + [Test] + public void DocumentCreatedInSeparateTransactionTest() + { + Key key; + using (var s = Domain.OpenSession()) { + using (var t = s.OpenTransaction()) { + var document = new Document(); + key = document.Key; + t.Complete(); + } + } + using (var s = Domain.OpenSession()) { + Assert.Throws(() => { var document = s.Query.Single(key); }); + } + } + + [Test] + public void DocumentCreatedInAutoTransactionTest() + { + using (var s = Domain.OpenSession()) { + Assert.Throws(() => { var document = new Document(); }); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0422_GetStructureFieldsForComplexStructures.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0422_GetStructureFieldsForComplexStructures.cs index 9a760232ce..9590eb0c8a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0422_GetStructureFieldsForComplexStructures.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0422_GetStructureFieldsForComplexStructures.cs @@ -1,122 +1,122 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.10.05 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Issue0422_GetStructureFieldsForComplexStructures_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0422_GetStructureFieldsForComplexStructures_Model -{ - [Serializable] - public class EntityStructure : Structure - { - [Field] - [Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntityB EntityB { get; set; } - - [Field] - public string StructureName { get; set; } - - [Field] - public DateTime StructureAge { get; set; } - } - - [Serializable] - public class ComplexStructure : Structure - { - [Field] - [Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntityB EntityB { get; set; } - - [Field] - public string ComplexStructureName { get; set; } - - [Field] - public EntityStructure EntityStructure { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class EntityB : Entity - { - [Field] - [Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public ComplexStructure ComplexStructure { get; set; } - - [Field] - public EntityStructure EntityStructure { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0422_GetStructureFieldsForComplexStructures : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (EntityB).Assembly, typeof (EntityB).Namespace); - config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; - config.NamingConvention.NamingRules = NamingRules.None; - return config; - } - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - // Fill - IEnumerable entitiesB = Enumerable - .Range(0, 100) - .Select(i => new EntityB { - Name = "NameB_" + i, - ComplexStructure = new ComplexStructure { - EntityB = new EntityB { - Name = "NameB_1_" + i - }, - ComplexStructureName = "StructureName_1_" + i, - EntityStructure = new EntityStructure { - EntityB = new EntityB { - Name = "NameB_2_" + i - }, - StructureAge = new DateTime(2000 + i, 10, 10), - StructureName = "StructureName_2_" + i, - } - } - }) - .ToList(); - - // Query - session.SaveChanges(); - var structures = session.Query.All().Select(b => b.ComplexStructure).Skip(83).Take(1); - var str = structures.Single(); - var testEntities = session.Query.All().Where(b => b.ComplexStructure==str).ToArray(); - var actualEntities = session.Query.All().AsEnumerable().Where(b => b.ComplexStructure==str).ToArray(); - Assert.AreEqual(0, actualEntities.Except(testEntities).Count()); - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.10.05 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Issue0422_GetStructureFieldsForComplexStructures_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0422_GetStructureFieldsForComplexStructures_Model +{ + [Serializable] + public class EntityStructure : Structure + { + [Field] + [Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntityB EntityB { get; set; } + + [Field] + public string StructureName { get; set; } + + [Field] + public DateTime StructureAge { get; set; } + } + + [Serializable] + public class ComplexStructure : Structure + { + [Field] + [Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntityB EntityB { get; set; } + + [Field] + public string ComplexStructureName { get; set; } + + [Field] + public EntityStructure EntityStructure { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class EntityB : Entity + { + [Field] + [Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public ComplexStructure ComplexStructure { get; set; } + + [Field] + public EntityStructure EntityStructure { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0422_GetStructureFieldsForComplexStructures : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (EntityB).Assembly, typeof (EntityB).Namespace); + config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; + config.NamingConvention.NamingRules = NamingRules.None; + return config; + } + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + // Fill + IEnumerable entitiesB = Enumerable + .Range(0, 100) + .Select(i => new EntityB { + Name = "NameB_" + i, + ComplexStructure = new ComplexStructure { + EntityB = new EntityB { + Name = "NameB_1_" + i + }, + ComplexStructureName = "StructureName_1_" + i, + EntityStructure = new EntityStructure { + EntityB = new EntityB { + Name = "NameB_2_" + i + }, + StructureAge = new DateTime(2000 + i, 10, 10), + StructureName = "StructureName_2_" + i, + } + } + }) + .ToList(); + + // Query + session.SaveChanges(); + var structures = session.Query.All().Select(b => b.ComplexStructure).Skip(83).Take(1); + var str = structures.Single(); + var testEntities = session.Query.All().Where(b => b.ComplexStructure==str).ToArray(); + var actualEntities = session.Query.All().AsEnumerable().Where(b => b.ComplexStructure==str).ToArray(); + Assert.AreEqual(0, actualEntities.Except(testEntities).Count()); + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0424_SqlCommandIsNull.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0424_SqlCommandIsNull.cs index 484f7cf495..84997aecb9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0424_SqlCommandIsNull.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0424_SqlCommandIsNull.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.10.08 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0296_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0296_Model -{ - [Serializable] - [HierarchyRoot] - public class TheParent : Entity - { - [Key, Field] - public int Id { get; private set;} - - [Field] - public TheChild Child { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TheChild : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public int Value { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [Serializable] - public class Issue0424_SqlCommandIsNull : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TheParent).Assembly, typeof (TheParent).Namespace); - return configuration; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new TheParent {Child = new TheChild()}; - t.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var parent = session.Query.All().Single(); - var result = session.Query.All().Single(child => child.Value==parent.Child.Value); - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.10.08 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0296_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0296_Model +{ + [Serializable] + [HierarchyRoot] + public class TheParent : Entity + { + [Key, Field] + public int Id { get; private set;} + + [Field] + public TheChild Child { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TheChild : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public int Value { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [Serializable] + public class Issue0424_SqlCommandIsNull : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TheParent).Assembly, typeof (TheParent).Namespace); + return configuration; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new TheParent {Child = new TheChild()}; + t.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var parent = session.Query.All().Single(); + var result = session.Query.All().Single(child => child.Value==parent.Child.Value); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0435_BatchingFail.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0435_BatchingFail.cs index 594c5645a5..a097bd497f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0435_BatchingFail.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0435_BatchingFail.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.10.15 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0435_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0435_Model -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0435_BatchingFail : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (MyEntity)); - return configuration; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - CreateSessionAndTransaction(); - } - - [Test] - public void Test1() - { - var entity1 = new MyEntity { - Text = "Entity 1" - }; // Nothing is sent to server yet - - var entity2 = new MyEntity { - Text = "Entity 2" - }; // Nothing is sent to server yet - - foreach (var e in Session.Demand().Query.All()) // Batch is sent - Console.WriteLine("Entity.Text: {0}", e.Text); - } - - [Test] - public void Test2() - { - var entity1 = new MyEntity { - Text = "Entity 1" - }; // Nothing is sent to server yet - - var entity2 = new MyEntity { - Text = "Entity 2" - }; // Nothing is sent to server yet - - var futureCount = Session.Demand().Query.ExecuteDelayed(qe => qe.All().Count()); - - foreach (var e in Session.Demand().Query.All()) // Batch is sent - Console.WriteLine("Entity.Text: {0}", e.Text); - Console.WriteLine("Count: {0}", futureCount.Value); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.10.15 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0435_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0435_Model +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0435_BatchingFail : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (MyEntity)); + return configuration; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + CreateSessionAndTransaction(); + } + + [Test] + public void Test1() + { + var entity1 = new MyEntity { + Text = "Entity 1" + }; // Nothing is sent to server yet + + var entity2 = new MyEntity { + Text = "Entity 2" + }; // Nothing is sent to server yet + + foreach (var e in Session.Demand().Query.All()) // Batch is sent + Console.WriteLine("Entity.Text: {0}", e.Text); + } + + [Test] + public void Test2() + { + var entity1 = new MyEntity { + Text = "Entity 1" + }; // Nothing is sent to server yet + + var entity2 = new MyEntity { + Text = "Entity 2" + }; // Nothing is sent to server yet + + var futureCount = Session.Demand().Query.ExecuteDelayed(qe => qe.All().Count()); + + foreach (var e in Session.Demand().Query.All()) // Batch is sent + Console.WriteLine("Entity.Text: {0}", e.Text); + Console.WriteLine("Count: {0}", futureCount.Value); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0452_OrderByIncorrectColumn.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0452_OrderByIncorrectColumn.cs index d70e488137..e2937ce564 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0452_OrderByIncorrectColumn.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0452_OrderByIncorrectColumn.cs @@ -1,241 +1,241 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.10.26 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Issue0452_OrderByIncorrectColumn_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0452_OrderByIncorrectColumn_Model -{ - [Serializable] - [HierarchyRoot] - public class Image : Entity - { - [Field, Key] - public Guid Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class SitePage : Entity - { - [Field, Key] - public Guid Id { get; private set; } - [Field] - public string Url { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public Guid Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Category : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [Serializable] - [HierarchyRoot] - public abstract class AbstractObject : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field] - public DateTime CreatedOn{ get; set;} - - [Field] - public Person CreatedBy{ get; set;} - } - - [Serializable] - public abstract class BlogPost : AbstractObject - { - [Field] - public Category Category{ get; set;} - - [Field] - public string Title { get; set; } - - [Field] - public DateTime? PublishedOn { get; set; } - - [Field] - public Image TeaserImage { get; set; } - - [Field] - public SitePage SitePage { get; set; } - } - - [Serializable] - public sealed class Article : BlogPost - { - } - - [Serializable] - public sealed class Article2 : BlogPost - { - - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0452_OrderByIncorrectColumn : AutoBuildTest - { - private const int Count = 100; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (BlogPost).Assembly, typeof (BlogPost).Namespace); - return config; - } - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Fill(); - t.Complete(); - } - } - } - - [Test] - public void TakeTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Take(Count - 1).ToList(); - var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Take(Count - 1).ToList(); - Assert.IsTrue(expected.Count>0); - Assert.AreEqual(expected.Count, result.Count); - for (int i = 0; i < expected.Count; i++) { - var areMatch = Equals(expected[i], result[i]); - Assert.IsTrue(areMatch); - } - Assert.IsTrue(expected.SequenceEqual(result)); - } - } - } - - [Test] - public void SkipTakeTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Skip(5).Take(Count - 10).ToList(); - var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Skip(5).Take(Count - 10).ToList(); - Assert.IsTrue(expected.Count>0); - Assert.AreEqual(expected.Count, result.Count); - for (int i = 0; i < expected.Count; i++) { - bool areMatch = Equals(expected[i], result[i]); - Assert.IsTrue(areMatch); - } - Assert.IsTrue(expected.SequenceEqual(result)); - } - } - } - - [Test] - public void SkipTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Skip(5).ToList(); - var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Skip(5).ToList(); - Assert.AreEqual(expected.Count, result.Count); - Assert.IsTrue(expected.Count>0); - for (int i = 0; i < expected.Count; i++) { - bool areMatch = Equals(expected[i], result[i]); - Assert.IsTrue(areMatch); - } - Assert.IsTrue(expected.SequenceEqual(result)); - } - } - } - - [Test] - public void SelectCategoryTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All
().Select(p => p.Category); - foreach (var category in result) { - Assert.IsNotNull(category); - } - } - } - } - - [Test] - public void QuerySingleTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var a1 = session.Query.All
().First(); - var id = a1.Id; - - var a2 = session.Query.SingleOrDefault(id); - Assert.IsNull(a2); - } - } - - [Test] - public void QuerySingleOrDefaultTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var url = "http://localhost/page_1.htm"; - var result = session.Query.All().Where(p => p.SitePage.Url == url).SingleOrDefault(); - Assert.IsNotNull(result); - } - } - - private void Fill() - { - for (int i = 0; i < Count; i++) { - var person = new Person(); - var category = new Category(); - var sitePage = new SitePage() { - Url = string.Format("http://localhost/page_{0}.htm", i) - }; - var image = new Image(); - var article = new Article { - Category = category, - CreatedBy = person, - CreatedOn = new DateTime(1800 + i, 1, 1), - PublishedOn = new DateTime(1800 + (i % 2) * Count + i, 1, 1), - SitePage = sitePage, - Title = string.Format("Article_{0}", i), - TeaserImage = image - }; - } - Session.Current.SaveChanges(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.10.26 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Issue0452_OrderByIncorrectColumn_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0452_OrderByIncorrectColumn_Model +{ + [Serializable] + [HierarchyRoot] + public class Image : Entity + { + [Field, Key] + public Guid Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class SitePage : Entity + { + [Field, Key] + public Guid Id { get; private set; } + [Field] + public string Url { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public Guid Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Category : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [Serializable] + [HierarchyRoot] + public abstract class AbstractObject : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field] + public DateTime CreatedOn{ get; set;} + + [Field] + public Person CreatedBy{ get; set;} + } + + [Serializable] + public abstract class BlogPost : AbstractObject + { + [Field] + public Category Category{ get; set;} + + [Field] + public string Title { get; set; } + + [Field] + public DateTime? PublishedOn { get; set; } + + [Field] + public Image TeaserImage { get; set; } + + [Field] + public SitePage SitePage { get; set; } + } + + [Serializable] + public sealed class Article : BlogPost + { + } + + [Serializable] + public sealed class Article2 : BlogPost + { + + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0452_OrderByIncorrectColumn : AutoBuildTest + { + private const int Count = 100; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (BlogPost).Assembly, typeof (BlogPost).Namespace); + return config; + } + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Fill(); + t.Complete(); + } + } + } + + [Test] + public void TakeTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Take(Count - 1).ToList(); + var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Take(Count - 1).ToList(); + Assert.IsTrue(expected.Count>0); + Assert.AreEqual(expected.Count, result.Count); + for (int i = 0; i < expected.Count; i++) { + var areMatch = Equals(expected[i], result[i]); + Assert.IsTrue(areMatch); + } + Assert.IsTrue(expected.SequenceEqual(result)); + } + } + } + + [Test] + public void SkipTakeTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Skip(5).Take(Count - 10).ToList(); + var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Skip(5).Take(Count - 10).ToList(); + Assert.IsTrue(expected.Count>0); + Assert.AreEqual(expected.Count, result.Count); + for (int i = 0; i < expected.Count; i++) { + bool areMatch = Equals(expected[i], result[i]); + Assert.IsTrue(areMatch); + } + Assert.IsTrue(expected.SequenceEqual(result)); + } + } + } + + [Test] + public void SkipTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All
().OrderByDescending(a => a.PublishedOn).Skip(5).ToList(); + var expected = session.Query.All
().AsEnumerable().OrderByDescending(a => a.PublishedOn).Skip(5).ToList(); + Assert.AreEqual(expected.Count, result.Count); + Assert.IsTrue(expected.Count>0); + for (int i = 0; i < expected.Count; i++) { + bool areMatch = Equals(expected[i], result[i]); + Assert.IsTrue(areMatch); + } + Assert.IsTrue(expected.SequenceEqual(result)); + } + } + } + + [Test] + public void SelectCategoryTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All
().Select(p => p.Category); + foreach (var category in result) { + Assert.IsNotNull(category); + } + } + } + } + + [Test] + public void QuerySingleTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var a1 = session.Query.All
().First(); + var id = a1.Id; + + var a2 = session.Query.SingleOrDefault(id); + Assert.IsNull(a2); + } + } + + [Test] + public void QuerySingleOrDefaultTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var url = "http://localhost/page_1.htm"; + var result = session.Query.All().Where(p => p.SitePage.Url == url).SingleOrDefault(); + Assert.IsNotNull(result); + } + } + + private void Fill() + { + for (int i = 0; i < Count; i++) { + var person = new Person(); + var category = new Category(); + var sitePage = new SitePage() { + Url = string.Format("http://localhost/page_{0}.htm", i) + }; + var image = new Image(); + var article = new Article { + Category = category, + CreatedBy = person, + CreatedOn = new DateTime(1800 + i, 1, 1), + PublishedOn = new DateTime(1800 + (i % 2) * Count + i, 1, 1), + SitePage = sitePage, + Title = string.Format("Article_{0}", i), + TeaserImage = image + }; + } + Session.Current.SaveChanges(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0457_EntityStateToString.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0457_EntityStateToString.cs index d95d493549..e3cde5bfa7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0457_EntityStateToString.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0457_EntityStateToString.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.10.29 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0457_EntityStateToStringModel; - -namespace Xtensive.Orm.Tests.Issues.Issue0457_EntityStateToStringModel -{ - [Serializable] - [HierarchyRoot] - public class BuggyEntity : Entity - { - [Key, Field] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0457_EntityStateToString : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (BuggyEntity).Assembly, typeof (BuggyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - session.Query.SingleOrDefault(1001); - var entityState = session.EntityStateCache.FirstOrDefault(); - - if (entityState!=null) - Console.WriteLine(entityState.ToString()); // NullReferenceException is thrown here - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.10.29 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0457_EntityStateToStringModel; + +namespace Xtensive.Orm.Tests.Issues.Issue0457_EntityStateToStringModel +{ + [Serializable] + [HierarchyRoot] + public class BuggyEntity : Entity + { + [Key, Field] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0457_EntityStateToString : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (BuggyEntity).Assembly, typeof (BuggyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + session.Query.SingleOrDefault(1001); + var entityState = session.EntityStateCache.FirstOrDefault(); + + if (entityState!=null) + Console.WriteLine(entityState.ToString()); // NullReferenceException is thrown here + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0485_EntitySetDescendant.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0485_EntitySetDescendant.cs index 61e92eca2a..c6e50a3cfb 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0485_EntitySetDescendant.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0485_EntitySetDescendant.cs @@ -1,94 +1,94 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.26 - -using System; -using System.Runtime.Serialization; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Issue0485_EntitySetDescendant_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues.Issue0485_EntitySetDescendant_Model -{ - [Serializable] - [HierarchyRoot] - public class Company : Entity - { - [Field][Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public EntitySetDescendant Employees{ get; private set;} - } - - [Serializable] - [HierarchyRoot] - public class Employee : Entity - { - [Field][Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - } - - public class EntitySetDescendant : EntitySet - where T : IEntity - { - protected EntitySetDescendant(Entity owner, FieldInfo field) - : base(owner, field) - { - } - - protected EntitySetDescendant(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0485_EntitySetDescendant : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Company).Assembly, typeof (Company).Namespace); - return config; - } - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AllFeaturesSupported(ProviderFeatures.RowNumber); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company = new Company(); - var employee1 = new Employee(); - var employee2 = new Employee(); - var employee3 = new Employee(); - company.Employees.Add(employee1); - company.Employees.Add(employee2); - company.Employees.Add(employee3); - Assert.IsNotNull(company.Employees.ElementAt(0)); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.26 + +using System; +using System.Runtime.Serialization; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Issue0485_EntitySetDescendant_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues.Issue0485_EntitySetDescendant_Model +{ + [Serializable] + [HierarchyRoot] + public class Company : Entity + { + [Field][Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public EntitySetDescendant Employees{ get; private set;} + } + + [Serializable] + [HierarchyRoot] + public class Employee : Entity + { + [Field][Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + } + + public class EntitySetDescendant : EntitySet + where T : IEntity + { + protected EntitySetDescendant(Entity owner, FieldInfo field) + : base(owner, field) + { + } + + protected EntitySetDescendant(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0485_EntitySetDescendant : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Company).Assembly, typeof (Company).Namespace); + return config; + } + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AllFeaturesSupported(ProviderFeatures.RowNumber); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company = new Company(); + var employee1 = new Employee(); + var employee2 = new Employee(); + var employee3 = new Employee(); + company.Employees.Add(employee1); + company.Employees.Add(employee2); + company.Employees.Add(employee3); + Assert.IsNotNull(company.Employees.ElementAt(0)); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0490_GroupByWithTypeId.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0490_GroupByWithTypeId.cs index 3b4280c4e3..43d100f3c1 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0490_GroupByWithTypeId.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0490_GroupByWithTypeId.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.03 - -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using System.Reflection; - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0490_GroupByWithTypeId : ChinookDOModelTest - { - [Test] - public void MainTest() - { - var groupQuery = - from invoice in Session.Query.All() - group invoice by invoice.Customer.Key - into siteGroup - select new { - Enterprise = siteGroup.Key, - SitesCount = siteGroup.Count() - }; - QueryDumper.Dump(groupQuery); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.03 + +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using System.Reflection; + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0490_GroupByWithTypeId : ChinookDOModelTest + { + [Test] + public void MainTest() + { + var groupQuery = + from invoice in Session.Query.All() + group invoice by invoice.Customer.Key + into siteGroup + select new { + Enterprise = siteGroup.Key, + SitesCount = siteGroup.Count() + }; + QueryDumper.Dump(groupQuery); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0493_BadImageFormatTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0493_BadImageFormatTest.cs index 249efdbdc8..c9023b0e87 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0493_BadImageFormatTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0493_BadImageFormatTest.cs @@ -1,69 +1,69 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0493_BadImageFormatTest_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0493_BadImageFormatTest_Model -{ - [Serializable] - public abstract class Info : Entity where T:Entity - { - [Field, Key] - public T Target { get; private set; } - - public Info(T target) - : base(target) - {} - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class PersonInfo : Info - { - public PersonInfo(Person target) - : base(target) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0493_BadImageFormatTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var p = new Person(); - var pi = new PersonInfo(p); - t.Complete(); - } - } - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Assert.IsNotNull(session.Query.All().First()); - } - } - } - } +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0493_BadImageFormatTest_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0493_BadImageFormatTest_Model +{ + [Serializable] + public abstract class Info : Entity where T:Entity + { + [Field, Key] + public T Target { get; private set; } + + public Info(T target) + : base(target) + {} + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class PersonInfo : Info + { + public PersonInfo(Person target) + : base(target) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0493_BadImageFormatTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var p = new Person(); + var pi = new PersonInfo(p); + t.Complete(); + } + } + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Assert.IsNotNull(session.Query.All().First()); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0512_NullableGetValueOrDefaultIsNotSupported.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0512_NullableGetValueOrDefaultIsNotSupported.cs index 29bd15aa75..e7d26f3cb5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0512_NullableGetValueOrDefaultIsNotSupported.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0512_NullableGetValueOrDefaultIsNotSupported.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.06 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DbTypeSupportModel; - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0512_NullableGetValueOrDefaultIsNotSupported : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (X).Assembly, typeof (X).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - new X {FNInt = 5}; - new X(); - var sum1 = session.Query.All().Sum(x => x.FNInt.GetValueOrDefault()); - Assert.AreEqual(5, sum1); - var sum2 = session.Query.All().Sum(x => x.FNInt.GetValueOrDefault(1)); - Assert.AreEqual(6, sum2); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.06 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DbTypeSupportModel; + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0512_NullableGetValueOrDefaultIsNotSupported : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (X).Assembly, typeof (X).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + new X {FNInt = 5}; + new X(); + var sum1 = session.Query.All().Sum(x => x.FNInt.GetValueOrDefault()); + Assert.AreEqual(5, sum1); + var sum2 = session.Query.All().Sum(x => x.FNInt.GetValueOrDefault(1)); + Assert.AreEqual(6, sum2); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0559_EntitySetQueryError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0559_EntitySetQueryError.cs index 0d61216250..e725169840 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0559_EntitySetQueryError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0559_EntitySetQueryError.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.12.23 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0559_EntitySetQueryError_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0559_EntitySetQueryError_Model - { - [Serializable] - [HierarchyRoot] - [Index("Name")] - public class Topic : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Subscriptions { get; private set; } - } - - [Serializable] - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - [Index("ApplicationName")] - public class Subscription : Entity - { - [Field, Key(0)] - public long Id { get; private set; } - - [Field, Key(1)] - public long LastEventId { get; private set; } - - [Field(Length = 300)] - public string ApplicationName { get; set; } - - [Field] - public bool Persistent { get; set; } - - public Subscription(long id, long lastEventId) - : base(id, lastEventId) - { - } - } - } - - [TestFixture] - public class Issue0559_EntitySetQueryError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Subscription).Assembly, typeof(Subscription).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var topicName = "Name"; - var ApplicationName = "Name"; - var defaultTopic = new Topic() { Name = topicName }; - var subscription = new Subscription(1, 1) {ApplicationName = ApplicationName}; - defaultTopic.Subscriptions.Add(subscription); - - - var subTopic = (from topic in session.Query.All() where topic.Name == topicName select topic).SingleOrDefault(); - var subscriptions = subTopic.Subscriptions; - var result = from sub in subscriptions where sub.ApplicationName == ApplicationName select sub; - var list = result.ToList(); - - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.12.23 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0559_EntitySetQueryError_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0559_EntitySetQueryError_Model + { + [Serializable] + [HierarchyRoot] + [Index("Name")] + public class Topic : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Subscriptions { get; private set; } + } + + [Serializable] + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + [Index("ApplicationName")] + public class Subscription : Entity + { + [Field, Key(0)] + public long Id { get; private set; } + + [Field, Key(1)] + public long LastEventId { get; private set; } + + [Field(Length = 300)] + public string ApplicationName { get; set; } + + [Field] + public bool Persistent { get; set; } + + public Subscription(long id, long lastEventId) + : base(id, lastEventId) + { + } + } + } + + [TestFixture] + public class Issue0559_EntitySetQueryError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Subscription).Assembly, typeof(Subscription).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var topicName = "Name"; + var ApplicationName = "Name"; + var defaultTopic = new Topic() { Name = topicName }; + var subscription = new Subscription(1, 1) {ApplicationName = ApplicationName}; + defaultTopic.Subscriptions.Add(subscription); + + + var subTopic = (from topic in session.Query.All() where topic.Name == topicName select topic).SingleOrDefault(); + var subscriptions = subTopic.Subscriptions; + var result = from sub in subscriptions where sub.ApplicationName == ApplicationName select sub; + var list = result.ToList(); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0585_TakeSkipJoinMappingError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0585_TakeSkipJoinMappingError.cs index f75820a69c..53052e2977 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0585_TakeSkipJoinMappingError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0585_TakeSkipJoinMappingError.cs @@ -1,203 +1,203 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.19 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Xtensive.Storage.Tests.Issues.Issue0585_TakeSkipJoinMappingError_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Xtensive.Storage.Tests.Issues.Issue0585_TakeSkipJoinMappingError_Model - { - // [Index("Name", Unique = true)] - // [Index("UniqueIndentifier", Unique = true)] - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Guid? UniqueIndentifier { get; set; } - - [Field(Length = 400)] - public string Name { get; set; } - - [Field(Length = 400)] - public string Email { get; set; } - - [Field(Length = 400)] - public string Password { get; set; } - - [Field(Length = 400)] - public string AlternativePassword { get; set; } - - [Field(Length = 400)] - public string PasswordQuestion { get; set; } - - [Field(Length = 400)] - public string PasswordAnswer { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear, PairTo = "Users")] - public EntitySet Roles { get; private set; } - } - - [HierarchyRoot] - public class UserActivity - : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public DateTime? LastLoginAttemptDate { get; set; } - - [Field] - public int LoginAttemptCount { get; set; } - - [Field] - public DateTime LastPasswordChangeDate { get; set; } - - [Field] - public DateTime LastLockoutDate { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public User User { get; set; } - - [Field] - public bool IsApproved { get; set; } - - [Field] - public bool IsLockedOut { get; set; } - - [Field] - public string Comment { get; set; } - - [Field] - public DateTime LastLoginDate { get; set; } - - [Field] - public DateTime LastActivityDate { get; set; } - - public static UserActivity GetOrCreate(User user) - { - var activity = user.Session.Query.All().Where(ua => ua.User==user).FirstOrDefault(); - if (activity==null) - activity = new UserActivity {User = user}; - return activity; - } - } - - - // [Index("Name", Unique = true)] - [HierarchyRoot] - public class Role : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Users { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Roles { get; private set; } - } - } - - [Serializable] - public class Issue0585_TakeSkipJoinMappingError : AutoBuildTest - { - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Fill(); - t.Complete(); - } - } - } - - private void Fill() - { - for (int i = 0; i < 10; i++) { - var user = new User { - Name = string.Format("name_{0}", i), - Password = string.Format("password_{0}", i), - PasswordQuestion = string.Format("passwordQuestion_{0}", i), - Email = string.Format("email{0}", i) - }; - for (int j = 0; j < 10; j++) { - var activity = new UserActivity { - Comment = string.Format("comment_{0}_{1}", i, j), - IsApproved = true, - IsLockedOut = false, - CreationDate = DateTime.Now, - LastLoginDate = DateTime.Now, - LastActivityDate = DateTime.Now, - LastPasswordChangeDate = DateTime.Now, - LastLockoutDate = DateTime.Now, - User = user - }; - } - } - Session.Current.SaveChanges(); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (UserActivity).Assembly, typeof (UserActivity).Namespace); - return config; - } - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - int pageIndex = 1; - int pageSize = 1; - IQueryable usersQuery = session.Query.All().Skip(pageIndex * pageSize).Take(pageSize); - var query = - from user in usersQuery - from activity in session.Query.All().Where(a => a.User==user).DefaultIfEmpty() - select new { - user.Name, - user.UniqueIndentifier, - user.Email, - user.PasswordQuestion, - activity.Comment, - activity.IsApproved, - activity.IsLockedOut, - activity.CreationDate, - activity.LastLoginDate, - activity.LastActivityDate, - activity.LastPasswordChangeDate, - activity.LastLockoutDate - }; - var result = query.ToList(); - Assert.Greater(result.Count, 0); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.19 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Xtensive.Storage.Tests.Issues.Issue0585_TakeSkipJoinMappingError_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Xtensive.Storage.Tests.Issues.Issue0585_TakeSkipJoinMappingError_Model + { + // [Index("Name", Unique = true)] + // [Index("UniqueIndentifier", Unique = true)] + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Guid? UniqueIndentifier { get; set; } + + [Field(Length = 400)] + public string Name { get; set; } + + [Field(Length = 400)] + public string Email { get; set; } + + [Field(Length = 400)] + public string Password { get; set; } + + [Field(Length = 400)] + public string AlternativePassword { get; set; } + + [Field(Length = 400)] + public string PasswordQuestion { get; set; } + + [Field(Length = 400)] + public string PasswordAnswer { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear, PairTo = "Users")] + public EntitySet Roles { get; private set; } + } + + [HierarchyRoot] + public class UserActivity + : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public DateTime? LastLoginAttemptDate { get; set; } + + [Field] + public int LoginAttemptCount { get; set; } + + [Field] + public DateTime LastPasswordChangeDate { get; set; } + + [Field] + public DateTime LastLockoutDate { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public User User { get; set; } + + [Field] + public bool IsApproved { get; set; } + + [Field] + public bool IsLockedOut { get; set; } + + [Field] + public string Comment { get; set; } + + [Field] + public DateTime LastLoginDate { get; set; } + + [Field] + public DateTime LastActivityDate { get; set; } + + public static UserActivity GetOrCreate(User user) + { + var activity = user.Session.Query.All().Where(ua => ua.User==user).FirstOrDefault(); + if (activity==null) + activity = new UserActivity {User = user}; + return activity; + } + } + + + // [Index("Name", Unique = true)] + [HierarchyRoot] + public class Role : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Users { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Roles { get; private set; } + } + } + + [Serializable] + public class Issue0585_TakeSkipJoinMappingError : AutoBuildTest + { + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Fill(); + t.Complete(); + } + } + } + + private void Fill() + { + for (int i = 0; i < 10; i++) { + var user = new User { + Name = string.Format("name_{0}", i), + Password = string.Format("password_{0}", i), + PasswordQuestion = string.Format("passwordQuestion_{0}", i), + Email = string.Format("email{0}", i) + }; + for (int j = 0; j < 10; j++) { + var activity = new UserActivity { + Comment = string.Format("comment_{0}_{1}", i, j), + IsApproved = true, + IsLockedOut = false, + CreationDate = DateTime.Now, + LastLoginDate = DateTime.Now, + LastActivityDate = DateTime.Now, + LastPasswordChangeDate = DateTime.Now, + LastLockoutDate = DateTime.Now, + User = user + }; + } + } + Session.Current.SaveChanges(); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (UserActivity).Assembly, typeof (UserActivity).Namespace); + return config; + } + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + int pageIndex = 1; + int pageSize = 1; + IQueryable usersQuery = session.Query.All().Skip(pageIndex * pageSize).Take(pageSize); + var query = + from user in usersQuery + from activity in session.Query.All().Where(a => a.User==user).DefaultIfEmpty() + select new { + user.Name, + user.UniqueIndentifier, + user.Email, + user.PasswordQuestion, + activity.Comment, + activity.IsApproved, + activity.IsLockedOut, + activity.CreationDate, + activity.LastLoginDate, + activity.LastActivityDate, + activity.LastPasswordChangeDate, + activity.LastLockoutDate + }; + var result = query.ToList(); + Assert.Greater(result.Count, 0); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0587_ByteArrayEquals.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0587_ByteArrayEquals.cs index 3198a0fd7a..34774614bb 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0587_ByteArrayEquals.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0587_ByteArrayEquals.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.22 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Xtensive.Storage.Tests.Issues.Issue0587_ByteArrayEquals_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Xtensive.Storage.Tests.Issues.Issue0587_ByteArrayEquals_Model - { - // [Index("Name", Unique = true)] - // [Index("UniqueIndentifier", Unique = true)] - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public byte[] Photo { get; set; } - - } - } - - [Serializable] - public class Issue0587_ByteArrayEquals : AutoBuildTest - { - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Fill(); - t.Complete(); - } - } - } - - private void Fill() - { - for (byte i = 0; i < 10; i++) { - var user = new User { - Name = string.Format("name_{0}", i), - Photo = new byte[] {i, i, i} - }; - } - Session.Current.SaveChanges(); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (User).Assembly, typeof (User).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - int pageIndex = 1; - int pageSize = 1; - var usersQuery = session.Query.All().Skip(pageIndex * pageSize).Take(pageSize); - var key = new byte[]{1,1,1}; - var query = session.Query.All().Where(user => user.Photo==key); - var result = query.ToList(); - Assert.Greater(result.Count, 0); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.22 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Xtensive.Storage.Tests.Issues.Issue0587_ByteArrayEquals_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Xtensive.Storage.Tests.Issues.Issue0587_ByteArrayEquals_Model + { + // [Index("Name", Unique = true)] + // [Index("UniqueIndentifier", Unique = true)] + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public byte[] Photo { get; set; } + + } + } + + [Serializable] + public class Issue0587_ByteArrayEquals : AutoBuildTest + { + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Fill(); + t.Complete(); + } + } + } + + private void Fill() + { + for (byte i = 0; i < 10; i++) { + var user = new User { + Name = string.Format("name_{0}", i), + Photo = new byte[] {i, i, i} + }; + } + Session.Current.SaveChanges(); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (User).Assembly, typeof (User).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + int pageIndex = 1; + int pageSize = 1; + var usersQuery = session.Query.All().Skip(pageIndex * pageSize).Take(pageSize); + var key = new byte[]{1,1,1}; + var query = session.Query.All().Where(user => user.Photo==key); + var result = query.ToList(); + Assert.Greater(result.Count, 0); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0593_OverrideDefaultSchema.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0593_OverrideDefaultSchema.cs index b3c9cdb88f..22a7c1be0e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0593_OverrideDefaultSchema.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0593_OverrideDefaultSchema.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.02 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Sql; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0593_OverrideDefaultSchema : AutoBuildTest - { - private const string SchemaName = "MyFancySchema"; - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.DefaultSchema = "MyFancySchema"; - return configuration; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - EnsureSchemaExists(configuration.ConnectionInfo); - return base.BuildDomain(configuration); - } - - [Test] - public void CheckSchemaTest() - { - var configuration = Domain.Configuration; - Assert.AreEqual(SchemaName, configuration.DefaultSchema); - Assert.AreEqual(SchemaName, configuration.Clone().DefaultSchema); - Assert.AreEqual(StorageTestHelper.GetDefaultSchema(Domain).Name, SchemaName); - } - - private static void EnsureSchemaExists(ConnectionInfo connectionInfo) - { - var driver = TestSqlDriver.Create(connectionInfo); - using (var connection = driver.CreateConnection()) { - connection.Open(); - string checkSchemaQuery = string.Format("select schema_id('{0}')", SchemaName); - using (var command = connection.CreateCommand(checkSchemaQuery)) - if (command.ExecuteScalar()!=DBNull.Value) - return; - var createSchemaQuery = string.Format("create schema {0}", SchemaName); - using (var command = connection.CreateCommand(createSchemaQuery)) - command.ExecuteNonQuery(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.02 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Sql; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0593_OverrideDefaultSchema : AutoBuildTest + { + private const string SchemaName = "MyFancySchema"; + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.DefaultSchema = "MyFancySchema"; + return configuration; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + EnsureSchemaExists(configuration.ConnectionInfo); + return base.BuildDomain(configuration); + } + + [Test] + public void CheckSchemaTest() + { + var configuration = Domain.Configuration; + Assert.AreEqual(SchemaName, configuration.DefaultSchema); + Assert.AreEqual(SchemaName, configuration.Clone().DefaultSchema); + Assert.AreEqual(StorageTestHelper.GetDefaultSchema(Domain).Name, SchemaName); + } + + private static void EnsureSchemaExists(ConnectionInfo connectionInfo) + { + var driver = TestSqlDriver.Create(connectionInfo); + using (var connection = driver.CreateConnection()) { + connection.Open(); + string checkSchemaQuery = string.Format("select schema_id('{0}')", SchemaName); + using (var command = connection.CreateCommand(checkSchemaQuery)) + if (command.ExecuteScalar()!=DBNull.Value) + return; + var createSchemaQuery = string.Format("create schema {0}", SchemaName); + using (var command = connection.CreateCommand(createSchemaQuery)) + command.ExecuteNonQuery(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0597_OpenGenericsInDomainModel.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0597_OpenGenericsInDomainModel.cs index f36d59dd89..cf8d025c98 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0597_OpenGenericsInDomainModel.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0597_OpenGenericsInDomainModel.cs @@ -1,156 +1,156 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.02.08 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0597_OpenGenericsInDomainModel_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0597_OpenGenericsInDomainModel_Model - { - public abstract class MediaType : Entity - { - public MediaType() - { - ID = Guid.NewGuid(); - } - - [Field, Key] - public Guid ID { get; private set; } - } - - [HierarchyRoot] - public class VirtualMedia : MediaType - { - public VirtualMedia() : base() { } - } - - public class VirtualMediaDescendant : VirtualMedia - { - public VirtualMediaDescendant() : base() { } - } - - [HierarchyRoot] - public class ConcreteMedia : MediaType - { - public ConcreteMedia() : base() { } - } - - public abstract class MediaBase : Entity - { - public MediaBase() - { - ID = Guid.NewGuid(); - } - - [Field, Key] - public Guid ID { get; private set; } - - [Field] - public abstract Int64 Duration { get; } - } - - [HierarchyRoot] - public class WrongMediaItemBase : MediaBase - { - public override long Duration - { - get { throw new NotImplementedException(); } - } - - public WrongMediaItemBase() : base() { } - } - - public abstract class MediaItemBase : MediaBase - where MT : MediaType - { - public MediaItemBase() : base() { } - } - - public abstract class MediaItem : MediaItemBase - where MT : MediaType - { - - protected MediaItem() : base() { } - - protected MediaItem(IList outputTracks) : this() { } - } - - public abstract class OutputTrack : Entity - { - protected OutputTrack() { } - - protected OutputTrack(Int32 trackDefinition) - { - TrackDefinition = trackDefinition; - } - - [Field] - public Int32 TrackDefinition { get; private set; } - } - - [HierarchyRoot] - public class SimpleOutputTrack : OutputTrack - { - public SimpleOutputTrack() { } - - public SimpleOutputTrack(Int32 trackDefinition) - : base(trackDefinition) { } - - [Field, Key] - public Guid ID { get; private set; } - } - - public abstract class SimpleMedia : MediaItem - where MT : MediaType - { - private Int64 _duration = 0; - - public SimpleMedia() { } - - public SimpleMedia(Int64 duration, IList outputTracks) - : base(outputTracks) - { - _duration = duration; - } - - public override Int64 Duration { get { return _duration; } } - } - - [HierarchyRoot] - public class SimpleVirtualMedia : SimpleMedia - { - public SimpleVirtualMedia() { } - - public SimpleVirtualMedia(Int64 duration, IList outputTracks) - : base(duration, outputTracks) { } - } - } - - [Serializable] - public class Issue0597_OpenGenericsInDomainModel : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(MediaBase).Assembly, typeof(MediaBase).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Assert.IsFalse(Domain.Model.Types.Contains(typeof(WrongMediaItemBase))); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.02.08 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0597_OpenGenericsInDomainModel_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0597_OpenGenericsInDomainModel_Model + { + public abstract class MediaType : Entity + { + public MediaType() + { + ID = Guid.NewGuid(); + } + + [Field, Key] + public Guid ID { get; private set; } + } + + [HierarchyRoot] + public class VirtualMedia : MediaType + { + public VirtualMedia() : base() { } + } + + public class VirtualMediaDescendant : VirtualMedia + { + public VirtualMediaDescendant() : base() { } + } + + [HierarchyRoot] + public class ConcreteMedia : MediaType + { + public ConcreteMedia() : base() { } + } + + public abstract class MediaBase : Entity + { + public MediaBase() + { + ID = Guid.NewGuid(); + } + + [Field, Key] + public Guid ID { get; private set; } + + [Field] + public abstract Int64 Duration { get; } + } + + [HierarchyRoot] + public class WrongMediaItemBase : MediaBase + { + public override long Duration + { + get { throw new NotImplementedException(); } + } + + public WrongMediaItemBase() : base() { } + } + + public abstract class MediaItemBase : MediaBase + where MT : MediaType + { + public MediaItemBase() : base() { } + } + + public abstract class MediaItem : MediaItemBase + where MT : MediaType + { + + protected MediaItem() : base() { } + + protected MediaItem(IList outputTracks) : this() { } + } + + public abstract class OutputTrack : Entity + { + protected OutputTrack() { } + + protected OutputTrack(Int32 trackDefinition) + { + TrackDefinition = trackDefinition; + } + + [Field] + public Int32 TrackDefinition { get; private set; } + } + + [HierarchyRoot] + public class SimpleOutputTrack : OutputTrack + { + public SimpleOutputTrack() { } + + public SimpleOutputTrack(Int32 trackDefinition) + : base(trackDefinition) { } + + [Field, Key] + public Guid ID { get; private set; } + } + + public abstract class SimpleMedia : MediaItem + where MT : MediaType + { + private Int64 _duration = 0; + + public SimpleMedia() { } + + public SimpleMedia(Int64 duration, IList outputTracks) + : base(outputTracks) + { + _duration = duration; + } + + public override Int64 Duration { get { return _duration; } } + } + + [HierarchyRoot] + public class SimpleVirtualMedia : SimpleMedia + { + public SimpleVirtualMedia() { } + + public SimpleVirtualMedia(Int64 duration, IList outputTracks) + : base(duration, outputTracks) { } + } + } + + [Serializable] + public class Issue0597_OpenGenericsInDomainModel : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(MediaBase).Assembly, typeof(MediaBase).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Assert.IsFalse(Domain.Model.Types.Contains(typeof(WrongMediaItemBase))); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0624_EntitySetSubqueryError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0624_EntitySetSubqueryError.cs index bd98d379fd..d649453e00 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0624_EntitySetSubqueryError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0624_EntitySetSubqueryError.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0624_EntitySetSubqueryError_Model; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0624_EntitySetSubqueryError_Model - { - public abstract class EntityBase : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - protected EntityBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class Control : EntityBase - { - public Control(Guid id) - : base(id) - {} - - [Field, Association(PairTo = "Owner")] - public EntitySet Messages { get; private set; } - } - - [HierarchyRoot] - public class ControlMessage : TablePartBase - { - public ControlMessage(Guid id) - : base(id) - { - } - } - - public abstract class TablePartBase : Entity - where T: Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field] - public T Owner { get; set; } - - protected TablePartBase(Guid id) - : base(id) - { - } - } - } - - [Serializable] - public class Issue0624_EntitySetSubqueryError : AutoBuildTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIsNot(StorageProvider.Oracle); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(ControlMessage).Assembly, typeof(ControlMessage).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var controlId = Guid.NewGuid(); - var messageId = Guid.NewGuid(); - var control = new Control(controlId); - var message = new ControlMessage(messageId) {Owner = control}; - session.SaveChanges(); - - var ids = new[] { controlId, messageId }; - var itemsX = session.Query.All().Where(a => a.Messages.Select(b => b.Id).Any(id => ids.Contains(id))).ToList(); - Assert.AreEqual(1, itemsX.Count); - Assert.AreSame(control, itemsX[0]); - var itemsA = session.Query.All().Where(a => ids.Any(id => a.Messages.Select(b => b.Id).Contains(id))).ToList(); - Assert.AreEqual(1, itemsA.Count); - Assert.AreSame(control, itemsA[0]); - var itemsB = session.Query.All().Where(a => ids.ContainsAny(a.Messages.Select(b => b.Id))).ToList(); - Assert.AreEqual(1, itemsB.Count); - Assert.AreSame(control, itemsB[0]); - t.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0624_EntitySetSubqueryError_Model; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0624_EntitySetSubqueryError_Model + { + public abstract class EntityBase : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + protected EntityBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class Control : EntityBase + { + public Control(Guid id) + : base(id) + {} + + [Field, Association(PairTo = "Owner")] + public EntitySet Messages { get; private set; } + } + + [HierarchyRoot] + public class ControlMessage : TablePartBase + { + public ControlMessage(Guid id) + : base(id) + { + } + } + + public abstract class TablePartBase : Entity + where T: Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field] + public T Owner { get; set; } + + protected TablePartBase(Guid id) + : base(id) + { + } + } + } + + [Serializable] + public class Issue0624_EntitySetSubqueryError : AutoBuildTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIsNot(StorageProvider.Oracle); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(ControlMessage).Assembly, typeof(ControlMessage).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var controlId = Guid.NewGuid(); + var messageId = Guid.NewGuid(); + var control = new Control(controlId); + var message = new ControlMessage(messageId) {Owner = control}; + session.SaveChanges(); + + var ids = new[] { controlId, messageId }; + var itemsX = session.Query.All().Where(a => a.Messages.Select(b => b.Id).Any(id => ids.Contains(id))).ToList(); + Assert.AreEqual(1, itemsX.Count); + Assert.AreSame(control, itemsX[0]); + var itemsA = session.Query.All().Where(a => ids.Any(id => a.Messages.Select(b => b.Id).Contains(id))).ToList(); + Assert.AreEqual(1, itemsA.Count); + Assert.AreSame(control, itemsA[0]); + var itemsB = session.Query.All().Where(a => ids.ContainsAny(a.Messages.Select(b => b.Id))).ToList(); + Assert.AreEqual(1, itemsB.Count); + Assert.AreSame(control, itemsB[0]); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0626_SequenceContainsNoElements.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0626_SequenceContainsNoElements.cs index 55360a1495..8b723b4ae5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0626_SequenceContainsNoElements.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0626_SequenceContainsNoElements.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.Issue0624_EntitySetSubqueryError_Model; -using Xtensive.Orm.Tests.Issues.Issue0626_SequenceContainsNoElements_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0626_SequenceContainsNoElements_Model - { - public abstract class EntityBase : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - protected EntityBase(Guid id) - : base(id) - {} - } - - [HierarchyRoot] - class Person : EntityBase - { - public Person(Guid id) - : base(id) - {} - - /// - /// Gets or sets Rank. - /// - [Field] - public int Rank { get; set; } - } - - [HierarchyRoot] - class Position : EntityBase - { - public Position(Guid id) - : base(id) - {} - - /// - /// Gets or sets Rank. - /// - [Field] - public int Rank { get; set; } - } - } - - [Serializable] - public class Issue0626_SequenceContainsNoElements : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Position).Assembly, typeof(Position).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var person = new Person(Guid.NewGuid()) {Rank = 1}; - var position = new Position(Guid.NewGuid()) {Rank = 1}; -// session.Persist(); - - var rank = session.Query.All().Where(r => r.Rank == 1).Single().Rank; // Ok here - Assert.AreEqual(1, rank); - var people = session.Query.All() - .Where(p => p.Rank == session.Query.All().Where(r => r.Rank == 1).Single().Rank) - .ToList(); //Exception - Assert.AreEqual(1, people.Count); - t.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.Issue0624_EntitySetSubqueryError_Model; +using Xtensive.Orm.Tests.Issues.Issue0626_SequenceContainsNoElements_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0626_SequenceContainsNoElements_Model + { + public abstract class EntityBase : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + protected EntityBase(Guid id) + : base(id) + {} + } + + [HierarchyRoot] + class Person : EntityBase + { + public Person(Guid id) + : base(id) + {} + + /// + /// Gets or sets Rank. + /// + [Field] + public int Rank { get; set; } + } + + [HierarchyRoot] + class Position : EntityBase + { + public Position(Guid id) + : base(id) + {} + + /// + /// Gets or sets Rank. + /// + [Field] + public int Rank { get; set; } + } + } + + [Serializable] + public class Issue0626_SequenceContainsNoElements : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Position).Assembly, typeof(Position).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var person = new Person(Guid.NewGuid()) {Rank = 1}; + var position = new Position(Guid.NewGuid()) {Rank = 1}; +// session.Persist(); + + var rank = session.Query.All().Where(r => r.Rank == 1).Single().Rank; // Ok here + Assert.AreEqual(1, rank); + var people = session.Query.All() + .Where(p => p.Rank == session.Query.All().Where(r => r.Rank == 1).Single().Rank) + .ToList(); //Exception + Assert.AreEqual(1, people.Count); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0628_ExecuteFutureScalarError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0628_ExecuteFutureScalarError.cs index fb5fcbcf04..436c0638e9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0628_ExecuteFutureScalarError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0628_ExecuteFutureScalarError.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Collections; -using System.Diagnostics; -using System.Linq; -using System.Linq.Dynamic; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Caching; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0628_ExecuteFutureScalarError_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0628_ExecuteFutureScalarError_Model - { - [HierarchyRoot] - class Item : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Tag { get; set; } - } - } - - [Serializable] - public class Issue0628_ExecuteFutureScalarError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Item).Assembly, typeof(Item).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var item = new Item() {Tag = 10}; - var countSimple = session.Query.All().Count(i => i.Tag == 10); - var countFuture1 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); - var countFuture2 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); - var countFuture3 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); - Assert.AreEqual(1, countSimple); - Assert.AreEqual(countSimple, countFuture1.Value); - Assert.AreEqual(countSimple, countFuture2.Value); - Assert.AreEqual(countSimple, countFuture3.Value); - - t.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Collections; +using System.Diagnostics; +using System.Linq; +using System.Linq.Dynamic; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Caching; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0628_ExecuteFutureScalarError_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0628_ExecuteFutureScalarError_Model + { + [HierarchyRoot] + class Item : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Tag { get; set; } + } + } + + [Serializable] + public class Issue0628_ExecuteFutureScalarError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Item).Assembly, typeof(Item).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var item = new Item() {Tag = 10}; + var countSimple = session.Query.All().Count(i => i.Tag == 10); + var countFuture1 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); + var countFuture2 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); + var countFuture3 = session.Query.ExecuteDelayed(qe => (qe.All() as IQueryable).Count()); + Assert.AreEqual(1, countSimple); + Assert.AreEqual(countSimple, countFuture1.Value); + Assert.AreEqual(countSimple, countFuture2.Value); + Assert.AreEqual(countSimple, countFuture3.Value); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0630_NullReferenceOnSelect.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0630_NullReferenceOnSelect.cs index 85288ec93b..e6228df270 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0630_NullReferenceOnSelect.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0630_NullReferenceOnSelect.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Collections; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0630_NullReferenceOnSelect_Model; -using System.Linq.Dynamic; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0630_NullReferenceOnSelect_Model - { - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class MyEntity2 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - public class ValObj - { - public int Id { get; set; } - public string Text { get; set; } - } - } - - [Serializable] - public class Issue0630_NullReferenceOnSelect : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - // Creating new persistent object - // Creating new persistent object - var helloWorld = new MyEntity - { - Text = "Hello World!" - }; var helloWorld2 = new MyEntity2 - { - Text = "Hello World!" - }; - - // Committing transaction - transactionScope.Complete(); - } - - using (var transactionScope = session.OpenTransaction()) { - var c = session.Query.All() - .Select(a => new ValObj {Id = a.Id, Text = a.Text}) - .ToList(); - var d = session.Query.All() - .Select(a => new ValObj { Id = a.Id, Text = a.Text }) - .ToList(); - var a11 = new ArrayList() {session.Query.All().Select("new(Id,Text)")}; - var b12 = new ArrayList() {session.Query.All().Select("new(Id,Text)")}; - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Collections; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0630_NullReferenceOnSelect_Model; +using System.Linq.Dynamic; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0630_NullReferenceOnSelect_Model + { + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class MyEntity2 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + public class ValObj + { + public int Id { get; set; } + public string Text { get; set; } + } + } + + [Serializable] + public class Issue0630_NullReferenceOnSelect : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + // Creating new persistent object + // Creating new persistent object + var helloWorld = new MyEntity + { + Text = "Hello World!" + }; var helloWorld2 = new MyEntity2 + { + Text = "Hello World!" + }; + + // Committing transaction + transactionScope.Complete(); + } + + using (var transactionScope = session.OpenTransaction()) { + var c = session.Query.All() + .Select(a => new ValObj {Id = a.Id, Text = a.Text}) + .ToList(); + var d = session.Query.All() + .Select(a => new ValObj { Id = a.Id, Text = a.Text }) + .ToList(); + var a11 = new ArrayList() {session.Query.All().Select("new(Id,Text)")}; + var b12 = new ArrayList() {session.Query.All().Select("new(Id,Text)")}; + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0634_PairToMisuse.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0634_PairToMisuse.cs index 86462caf7d..101402e3d6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0634_PairToMisuse.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0634_PairToMisuse.cs @@ -1,170 +1,170 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.06.07 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.Issue0634_PairToMisuse_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0634_PairToMisuse_Model -{ - [HierarchyRoot] - public class Helper : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - #region OneToOne - - [HierarchyRoot] - public class OneToOneSlave : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Helper Value1 { get; set; } - - [Field] - public OneToOneMaster Value2 { get; set; } - } - - [HierarchyRoot] - public class OneToOneMaster : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Value1")] - public OneToOneSlave Value { get; set; } - } - - #endregion - - #region ManyToOne - - [HierarchyRoot] - public class ManyToOneSlave : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Helper Value1 { get; set; } - - [Field] - public ManyToOneMaster Value2 { get; set; } - } - - [HierarchyRoot] - public class ManyToOneMaster : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Value1")] - public EntitySet Value { get; set; } - } - - #endregion - - #region OneToMany - - [HierarchyRoot] - public class OneToManyEntitySlave : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntitySet Value1 { get; set; } - - [Field] - public EntitySet Value2 { get; set; } - } - - [HierarchyRoot] - public class OneToManyEntityMaster : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Value1")] - public OneToManyEntitySlave Value { get; set; } - } - - #endregion - - #region ManyToMany - - [HierarchyRoot] - public class ManyToManySlave : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntitySet Value1 { get; set; } - - [Field] - public EntitySet Value2 { get; set; } - } - - [HierarchyRoot] - public class ManyToManyMaster : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Value1")] - public EntitySet Value { get; set; } - } - - - #endregion -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0634_PairToMisuse - { - [Test] - public void OneToOneTest() - { - Check(typeof (OneToOneSlave), typeof(OneToOneMaster)); - } - - [Test] - public void ManyToOneTest() - { - Check(typeof (ManyToOneSlave), typeof(ManyToOneMaster)); - } - - [Test] - public void OneToManyTest() - { - Check(typeof (OneToManyEntitySlave), typeof(OneToManyEntityMaster)); - } - - [Test] - public void ManyToManyTest() - { - Check(typeof (ManyToManySlave), typeof (ManyToManyMaster)); - } - - private static void Check(params Type[] types) - { - var configuration = DomainConfigurationFactory.Create(); - foreach (var type in types) - configuration.Types.Register(type); - configuration.Types.Register(typeof (Helper)); - AssertEx.Throws(() => Domain.Build(configuration)); - } - - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.06.07 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.Issue0634_PairToMisuse_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0634_PairToMisuse_Model +{ + [HierarchyRoot] + public class Helper : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + #region OneToOne + + [HierarchyRoot] + public class OneToOneSlave : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Helper Value1 { get; set; } + + [Field] + public OneToOneMaster Value2 { get; set; } + } + + [HierarchyRoot] + public class OneToOneMaster : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Value1")] + public OneToOneSlave Value { get; set; } + } + + #endregion + + #region ManyToOne + + [HierarchyRoot] + public class ManyToOneSlave : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Helper Value1 { get; set; } + + [Field] + public ManyToOneMaster Value2 { get; set; } + } + + [HierarchyRoot] + public class ManyToOneMaster : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Value1")] + public EntitySet Value { get; set; } + } + + #endregion + + #region OneToMany + + [HierarchyRoot] + public class OneToManyEntitySlave : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntitySet Value1 { get; set; } + + [Field] + public EntitySet Value2 { get; set; } + } + + [HierarchyRoot] + public class OneToManyEntityMaster : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Value1")] + public OneToManyEntitySlave Value { get; set; } + } + + #endregion + + #region ManyToMany + + [HierarchyRoot] + public class ManyToManySlave : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntitySet Value1 { get; set; } + + [Field] + public EntitySet Value2 { get; set; } + } + + [HierarchyRoot] + public class ManyToManyMaster : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Value1")] + public EntitySet Value { get; set; } + } + + + #endregion +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0634_PairToMisuse + { + [Test] + public void OneToOneTest() + { + Check(typeof (OneToOneSlave), typeof(OneToOneMaster)); + } + + [Test] + public void ManyToOneTest() + { + Check(typeof (ManyToOneSlave), typeof(ManyToOneMaster)); + } + + [Test] + public void OneToManyTest() + { + Check(typeof (OneToManyEntitySlave), typeof(OneToManyEntityMaster)); + } + + [Test] + public void ManyToManyTest() + { + Check(typeof (ManyToManySlave), typeof (ManyToManyMaster)); + } + + private static void Check(params Type[] types) + { + var configuration = DomainConfigurationFactory.Create(); + foreach (var type in types) + configuration.Types.Register(type); + configuration.Types.Register(typeof (Helper)); + AssertEx.Throws(() => Domain.Build(configuration)); + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0641_GroupBySumError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0641_GroupBySumError.cs index 61c3efde9c..634656e92f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0641_GroupBySumError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0641_GroupBySumError.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0641_GroupBySumError_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0641_GroupBySumError_Model - { - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - public EntitySet Lines { get; private set; } - } - - [HierarchyRoot] - public class Line : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public decimal? Rate { get; set; } - - [Field] - public decimal? Amount { get; set; } - } - } - - [Serializable] - public class Issue0641_GroupBySumError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - { - using (TransactionScope transactionScope = session.OpenTransaction()) - { - // Creating new persistent object - var helloWorld = new MyEntity - { - Text = "Hello World!", - Lines = - { - new Line {Rate = 5.5M, Amount = 2M}, - new Line {Rate = 5.5M, Amount = 2M}, - new Line {Rate = 5.5M, Amount = 2M}, - new Line {Rate = 5.5M, Amount = 2M}, - new Line {Rate = 5.5M, Amount = 2M}, - new Line {Rate = 5.5M, Amount = 2M} - } - }; - // Committing transaction - transactionScope.Complete(); - } - } - - // Reading all persisted objects from another Session - using (var session = Domain.OpenSession()) - { - using (var transactionScope = session.OpenTransaction()) { - var query = from l in session.Query.All().First().Lines - group l by l.Rate.GetValueOrDefault() into g - select new {Rate = g.Key, BaseAmount = g.Sum(l => l.Amount.GetValueOrDefault())}; - var actual = query.ToList().Single(); - var expected = (from l in session.Query.All().First().Lines.ToList() - group l by l.Rate.GetValueOrDefault() - into g - select new {Rate = g.Key, BaseAmount = g.Sum(l => l.Amount.GetValueOrDefault())}) - .Single(); - Assert.AreEqual(expected.Rate, actual.Rate); - Assert.AreEqual(expected.BaseAmount, actual.BaseAmount); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0641_GroupBySumError_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0641_GroupBySumError_Model + { + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + public EntitySet Lines { get; private set; } + } + + [HierarchyRoot] + public class Line : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public decimal? Rate { get; set; } + + [Field] + public decimal? Amount { get; set; } + } + } + + [Serializable] + public class Issue0641_GroupBySumError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + { + using (TransactionScope transactionScope = session.OpenTransaction()) + { + // Creating new persistent object + var helloWorld = new MyEntity + { + Text = "Hello World!", + Lines = + { + new Line {Rate = 5.5M, Amount = 2M}, + new Line {Rate = 5.5M, Amount = 2M}, + new Line {Rate = 5.5M, Amount = 2M}, + new Line {Rate = 5.5M, Amount = 2M}, + new Line {Rate = 5.5M, Amount = 2M}, + new Line {Rate = 5.5M, Amount = 2M} + } + }; + // Committing transaction + transactionScope.Complete(); + } + } + + // Reading all persisted objects from another Session + using (var session = Domain.OpenSession()) + { + using (var transactionScope = session.OpenTransaction()) { + var query = from l in session.Query.All().First().Lines + group l by l.Rate.GetValueOrDefault() into g + select new {Rate = g.Key, BaseAmount = g.Sum(l => l.Amount.GetValueOrDefault())}; + var actual = query.ToList().Single(); + var expected = (from l in session.Query.All().First().Lines.ToList() + group l by l.Rate.GetValueOrDefault() + into g + select new {Rate = g.Key, BaseAmount = g.Sum(l => l.Amount.GetValueOrDefault())}) + .Single(); + Assert.AreEqual(expected.Rate, actual.Rate); + Assert.AreEqual(expected.BaseAmount, actual.BaseAmount); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0643_EntitySetAddInCtor.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0643_EntitySetAddInCtor.cs index 2f73e75893..3eb4786c7d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0643_EntitySetAddInCtor.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0643_EntitySetAddInCtor.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0643_EntitySetAddInCtor_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0643_EntitySetAddInCtor_Model - { - [HierarchyRoot] - public abstract class ModuleBase : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - [Association(PairTo = "Module", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - public class Module : ModuleBase - { - public Module() - { - new ModuleItem(); -// Items.Add(new ModuleItem()); - } - } - - [HierarchyRoot] - public class ModuleItem : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public ModuleBase Module { get; set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - } - - [Serializable] - public class Issue0643_EntitySetAddInCtor : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (Module).Assembly, typeof (Module).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - // Creating new persistent object - var modules = new Module(); - - // Committing transaction - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0643_EntitySetAddInCtor_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0643_EntitySetAddInCtor_Model + { + [HierarchyRoot] + public abstract class ModuleBase : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + [Association(PairTo = "Module", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + public class Module : ModuleBase + { + public Module() + { + new ModuleItem(); +// Items.Add(new ModuleItem()); + } + } + + [HierarchyRoot] + public class ModuleItem : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public ModuleBase Module { get; set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + } + + [Serializable] + public class Issue0643_EntitySetAddInCtor : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (Module).Assembly, typeof (Module).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + // Creating new persistent object + var modules = new Module(); + + // Committing transaction + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0647_WrongLinqQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0647_WrongLinqQuery.cs index 63abfa3d40..25242d2c6c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0647_WrongLinqQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0647_WrongLinqQuery.cs @@ -1,259 +1,259 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0647_WrongLinqQuery_Model; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0647_WrongLinqQuery_Model - { - [Serializable] - public abstract class EntityBase : Entity - { - protected EntityBase(Guid id) - : base(id) - { - } - - [Field] - [Key] - public Guid Id { get; private set; } - } - - - [HierarchyRoot] - [Index("SysName", Unique = true)] - [Index("Name", Unique = true)] - public class Document : EntityBase - { - public Document(Guid id) - : base(id) - { - } - - [Field(Length = 64)] - public string SysName { get; set; } - - [Field(Length = 250)] - public string Name { get; set; } - - [Field(Length = 400)] - public string Description { get; set; } - - [Field] - public Document OwnerEntity { get; set; } - - [Field] - public Document LinkedEntity { get; set; } - - [Field] - public bool IsOrdered { get; set; } - - [Field] - public bool IsHierarchical { get; set; } - - public override string ToString() - { - return string.Format("SysName: {1}, Name: {2}", base.ToString(), SysName, Name); - } - } - - - [HierarchyRoot] - [Index("Name", Unique = true)] - public class Role : EntityBase - { - public Role(Guid id) - : base(id) - {} - - [Field(Length = 100)] - public string Name { get; set; } - - [Field(Length = 255)] - public string DisplayName { get; set; } - } - - [HierarchyRoot] - public class RowLevelPermission : EntityBase - { - public RowLevelPermission(Guid id) - : base(id) - { - } - - [Field(Length = 400, Nullable = false)] - public string Name { get; set; } - - [Field(Nullable = false)] - public Role Role { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Fields { get; private set; } - - [HierarchyRoot] - public class MlRowlevelPermissionDocEntityField : Multilink - { - /// Initializes a new instance of the class. - /// . - public MlRowlevelPermissionDocEntityField(Guid id) - : base(id) - { - } - } - } - - [Serializable] - public abstract class Multilink : EntityBase - where TOwner : EntityBase - where TLinked : EntityBase - { - protected Multilink(Guid id) - : base(id) - { - } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public TOwner Owner { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Deny)] - public TLinked Linked { get; set; } - - public override string ToString() - { - return string.Format("{0}, Owner: {1}, Linked: {2}", base.ToString(), Owner, Linked); - } - } - - - [HierarchyRoot] - [Index("Role", "Entity", Unique = true)] - public class FunctionalPermission : EntityBase - { - public FunctionalPermission(Guid id) - : base(id) - { - } - - [Field(Length = 400, Nullable = false)] - public string Name { get; set; } - - [Field] - public Role Role { get; set; } - - [Field] - public Document Entity { get; set; } - - [Field] - public bool? FullControl { get; set; } - - [Field] - public bool? Read { get; set; } - - [Field] - public bool? Create { get; set; } - - [Field] - public bool? Delete { get; set; } - - public static bool CanRead(string entity, string[] roles) - { - return HasPermission(entity, roles, e => e.Read); - } - - public static bool CanCreate(string entity, string[] roles) - { - return HasPermission(entity, roles, e => e.Create); - } - - public static bool CanDelete(string entity, string[] roles) - { - return HasPermission(entity, roles, e => e.Delete); - } - - public static bool CanControl(string entity, string[] roles) - { - return HasPermission(entity, roles, e => e.FullControl); - } - - private static bool HasPermission(string entity, string[] roles, Expression> permission) - { - var effectiveEntity = entity; - - var q = from perm in Session.Demand().Query.All() - where perm.Role.Name.In(roles) && perm.Entity.SysName == effectiveEntity - select perm; - - var total = q.Select(permission).ToArray(); - return total.Contains(true) && !total.Contains(false); - } - } - - } - - [Serializable] - public class Issue0647_WrongLinqQuery : AutoBuildTest - { - private Guid globalId1 = new Guid("A3A01D2F-41A9-416E-8513-6C2F55224B56"); - private Guid globalId2 = new Guid("FDBDBCF1-0117-4508-89A3-F47A9A098478"); - private Guid globalId3 = new Guid("EC2F180E-48BB-445C-BE95-C384B069D60B"); - private Guid globalId4 = new Guid("07F0DF2A-B55F-44BE-BB9B-034A875BF0DE"); - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIsNot(StorageProvider.Oracle); - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(Role).Assembly, typeof(Role).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var r1 = new Role(globalId1) { Name = "1" }; - var r2 = new Role(globalId2) { Name = "2" }; - - var de = new Document(Guid.NewGuid()) { SysName = "Control" }; - - var p1 = new FunctionalPermission(globalId3) { FullControl = false, Read = true, Name = "q", Entity = de, Role = r1 }; - var p2 = new FunctionalPermission(globalId4) { FullControl = true, Read = false, Delete = true, Name = "q", Entity = de, Role = r2 }; - t.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Assert.IsFalse(FunctionalPermission.CanRead("Control", new string[] { })); - Assert.IsTrue(FunctionalPermission.CanRead("Control", new[] { "1" })); - Assert.IsFalse(FunctionalPermission.CanControl("Control", new[] { "1" })); - Assert.IsFalse(FunctionalPermission.CanCreate("Control", new[] { "1", "2" })); - Assert.IsFalse(FunctionalPermission.CanRead("Control", new[] { "1", "2" })); - Assert.IsTrue(FunctionalPermission.CanDelete("Control", new[] { "1", "2" })); - - var roles = new[] { "1", "2" }; - var q = from perm in session.Query.All() - where perm.Role.Name.In(roles) && perm.Fields.Any(m => m.Linked.SysName == "Control") - select perm; - var result = q.ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0647_WrongLinqQuery_Model; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0647_WrongLinqQuery_Model + { + [Serializable] + public abstract class EntityBase : Entity + { + protected EntityBase(Guid id) + : base(id) + { + } + + [Field] + [Key] + public Guid Id { get; private set; } + } + + + [HierarchyRoot] + [Index("SysName", Unique = true)] + [Index("Name", Unique = true)] + public class Document : EntityBase + { + public Document(Guid id) + : base(id) + { + } + + [Field(Length = 64)] + public string SysName { get; set; } + + [Field(Length = 250)] + public string Name { get; set; } + + [Field(Length = 400)] + public string Description { get; set; } + + [Field] + public Document OwnerEntity { get; set; } + + [Field] + public Document LinkedEntity { get; set; } + + [Field] + public bool IsOrdered { get; set; } + + [Field] + public bool IsHierarchical { get; set; } + + public override string ToString() + { + return string.Format("SysName: {1}, Name: {2}", base.ToString(), SysName, Name); + } + } + + + [HierarchyRoot] + [Index("Name", Unique = true)] + public class Role : EntityBase + { + public Role(Guid id) + : base(id) + {} + + [Field(Length = 100)] + public string Name { get; set; } + + [Field(Length = 255)] + public string DisplayName { get; set; } + } + + [HierarchyRoot] + public class RowLevelPermission : EntityBase + { + public RowLevelPermission(Guid id) + : base(id) + { + } + + [Field(Length = 400, Nullable = false)] + public string Name { get; set; } + + [Field(Nullable = false)] + public Role Role { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Fields { get; private set; } + + [HierarchyRoot] + public class MlRowlevelPermissionDocEntityField : Multilink + { + /// Initializes a new instance of the class. + /// . + public MlRowlevelPermissionDocEntityField(Guid id) + : base(id) + { + } + } + } + + [Serializable] + public abstract class Multilink : EntityBase + where TOwner : EntityBase + where TLinked : EntityBase + { + protected Multilink(Guid id) + : base(id) + { + } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public TOwner Owner { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Deny)] + public TLinked Linked { get; set; } + + public override string ToString() + { + return string.Format("{0}, Owner: {1}, Linked: {2}", base.ToString(), Owner, Linked); + } + } + + + [HierarchyRoot] + [Index("Role", "Entity", Unique = true)] + public class FunctionalPermission : EntityBase + { + public FunctionalPermission(Guid id) + : base(id) + { + } + + [Field(Length = 400, Nullable = false)] + public string Name { get; set; } + + [Field] + public Role Role { get; set; } + + [Field] + public Document Entity { get; set; } + + [Field] + public bool? FullControl { get; set; } + + [Field] + public bool? Read { get; set; } + + [Field] + public bool? Create { get; set; } + + [Field] + public bool? Delete { get; set; } + + public static bool CanRead(string entity, string[] roles) + { + return HasPermission(entity, roles, e => e.Read); + } + + public static bool CanCreate(string entity, string[] roles) + { + return HasPermission(entity, roles, e => e.Create); + } + + public static bool CanDelete(string entity, string[] roles) + { + return HasPermission(entity, roles, e => e.Delete); + } + + public static bool CanControl(string entity, string[] roles) + { + return HasPermission(entity, roles, e => e.FullControl); + } + + private static bool HasPermission(string entity, string[] roles, Expression> permission) + { + var effectiveEntity = entity; + + var q = from perm in Session.Demand().Query.All() + where perm.Role.Name.In(roles) && perm.Entity.SysName == effectiveEntity + select perm; + + var total = q.Select(permission).ToArray(); + return total.Contains(true) && !total.Contains(false); + } + } + + } + + [Serializable] + public class Issue0647_WrongLinqQuery : AutoBuildTest + { + private Guid globalId1 = new Guid("A3A01D2F-41A9-416E-8513-6C2F55224B56"); + private Guid globalId2 = new Guid("FDBDBCF1-0117-4508-89A3-F47A9A098478"); + private Guid globalId3 = new Guid("EC2F180E-48BB-445C-BE95-C384B069D60B"); + private Guid globalId4 = new Guid("07F0DF2A-B55F-44BE-BB9B-034A875BF0DE"); + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIsNot(StorageProvider.Oracle); + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(Role).Assembly, typeof(Role).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var r1 = new Role(globalId1) { Name = "1" }; + var r2 = new Role(globalId2) { Name = "2" }; + + var de = new Document(Guid.NewGuid()) { SysName = "Control" }; + + var p1 = new FunctionalPermission(globalId3) { FullControl = false, Read = true, Name = "q", Entity = de, Role = r1 }; + var p2 = new FunctionalPermission(globalId4) { FullControl = true, Read = false, Delete = true, Name = "q", Entity = de, Role = r2 }; + t.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Assert.IsFalse(FunctionalPermission.CanRead("Control", new string[] { })); + Assert.IsTrue(FunctionalPermission.CanRead("Control", new[] { "1" })); + Assert.IsFalse(FunctionalPermission.CanControl("Control", new[] { "1" })); + Assert.IsFalse(FunctionalPermission.CanCreate("Control", new[] { "1", "2" })); + Assert.IsFalse(FunctionalPermission.CanRead("Control", new[] { "1", "2" })); + Assert.IsTrue(FunctionalPermission.CanDelete("Control", new[] { "1", "2" })); + + var roles = new[] { "1", "2" }; + var q = from perm in session.Query.All() + where perm.Role.Name.In(roles) && perm.Fields.Any(m => m.Linked.SysName == "Control") + select perm; + var result = q.ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0648_MultiThreadNullReference.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0648_MultiThreadNullReference.cs index bf820d69c2..7be23e85be 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0648_MultiThreadNullReference.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0648_MultiThreadNullReference.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.24 - -using System; -using System.Linq; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0648_MultiThreadNullReference_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0648_MultiThreadNullReference_Model - { - [HierarchyRoot] - public class Simple : Entity - { - [Key, Field] - public int Id { get; private set; } - } - } - - [Serializable] - public class Issue0648_MultiThreadNullReference : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Simple).Assembly, typeof (Simple).Namespace); - return config; - } - - [Test] - public void MainTest() - { - const int threadCount = 10; - - var completionEvents = new ManualResetEvent[threadCount]; - - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - new Simple(); - new Simple(); - new Simple(); - new Simple(); - new Simple(); - - for (int i = 0; i < threadCount; i++) { - var completionEvent = completionEvents[i] = new ManualResetEvent(false); - ThreadPool.QueueUserWorkItem(state => { - using (var session2 = Domain.OpenSession()) - using (var t = session2.OpenTransaction()) { - var count = session2.Query.All().Count(); - } - completionEvent.Set(); - }); - } - - // Committing transaction - transactionScope.Complete(); - } - } - - WaitHandle.WaitAll(completionEvents); - - foreach (var item in completionEvents) - item.Close(); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.24 + +using System; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0648_MultiThreadNullReference_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0648_MultiThreadNullReference_Model + { + [HierarchyRoot] + public class Simple : Entity + { + [Key, Field] + public int Id { get; private set; } + } + } + + [Serializable] + public class Issue0648_MultiThreadNullReference : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Simple).Assembly, typeof (Simple).Namespace); + return config; + } + + [Test] + public void MainTest() + { + const int threadCount = 10; + + var completionEvents = new ManualResetEvent[threadCount]; + + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + new Simple(); + new Simple(); + new Simple(); + new Simple(); + new Simple(); + + for (int i = 0; i < threadCount; i++) { + var completionEvent = completionEvents[i] = new ManualResetEvent(false); + ThreadPool.QueueUserWorkItem(state => { + using (var session2 = Domain.OpenSession()) + using (var t = session2.OpenTransaction()) { + var count = session2.Query.All().Count(); + } + completionEvent.Set(); + }); + } + + // Committing transaction + transactionScope.Complete(); + } + } + + WaitHandle.WaitAll(completionEvents); + + foreach (var item in completionEvents) + item.Close(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0676_NonNullableReferenceBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0676_NonNullableReferenceBug.cs index 546824476f..f947ff766d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0676_NonNullableReferenceBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0676_NonNullableReferenceBug.cs @@ -1,193 +1,193 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.24 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Issues.Issue0676.Model; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.Issue0676.Model -{ - [Serializable] - [HierarchyRoot] - public class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Nullable = false)] - [Association(OnTargetRemove = OnRemoveAction.None)] - public Animal Mate { get; set; } - - [Field(Nullable = false)] - public Animal MateDenyRemove { get; set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - - public Animal(string name) - { - using (Session.DisableSaveChanges(this)) { - Name = name; - Mate = this; - MateDenyRemove = this; - } - } - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity, - IHasNullEntity - { - private sealed class KeyExtension - { - public Key Key { get; set; } - } - - #region "Null entity" pattern implementation - - public const string NullName = ""; - private static object @lock = new object(); - - public static Person Null { - get { - return Session.Demand().Query.Single(NullKey); - } - } - - protected static Key NullKey { - get { - var domain = Domain.Current; - if (domain==null) - return null; - var extensions = domain.Extensions; - var keyExtension = extensions.Get(); - if (keyExtension==null) - lock (@lock) { - keyExtension = extensions.Get(); - if (keyExtension==null) { - var nullPerson = Session.Demand().Query.All().Where(p => p.Name==NullName).SingleOrDefault(); - if (nullPerson!=null) { - keyExtension = new KeyExtension {Key = nullPerson.Key}; - extensions.Set(keyExtension); - } - } - } - return keyExtension==null ? null : keyExtension.Key; - } - } - - IEntity IHasNullEntity.NullEntity { - get { return Null; } - } - - #endregion - - [Field, Key] - public int Id { get; private set; } - - [Field(Nullable = false)] - [Association(OnTargetRemove = OnRemoveAction.Clear)] - public Person Mate { get; set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - - public Person(string name) - { - using (Session.DisableSaveChanges(this)) { - Name = name; - Mate = name==NullName ? this : Null; - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0676_NonNullableReferenceBug : AutoBuildTest - { - private const string VersionFieldName = "Version"; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - return configuration; - } - - [Test] - public void StandardTest() - { - using (var session = Domain.OpenSession()) { - var tAnimal = session.Domain.Model.Types[typeof (Animal)]; - var fMate = tAnimal.Fields["Mate"]; - Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tAnimal).OnOwnerRemove); - Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tAnimal).OnTargetRemove); - var fMateDenyRemove = tAnimal.Fields["MateDenyRemove"]; - Assert.AreEqual(OnRemoveAction.None, fMateDenyRemove.GetAssociation(tAnimal).OnOwnerRemove); - Assert.AreEqual(OnRemoveAction.Deny, fMateDenyRemove.GetAssociation(tAnimal).OnTargetRemove); - - Animal a,b; - Key aKey; - using (var tx = session.OpenTransaction()) - { - a = new Animal("A"); - b = new Animal("B") {Mate = a, MateDenyRemove = a}; - aKey = a.Key; - AssertEx.Throws(a.Remove); - b.MateDenyRemove = b; - a.Remove(); - tx.Complete(); - } - - using (var tx = session.OpenTransaction()) { - var dpa = session.Services.Demand(); - Assert.AreEqual(aKey, dpa.GetReferenceKey(b, fMate)); - tx.Complete(); - } - ((Action) (() => b.Remove())).InvokeTransactionally(session); - } - } - - [Test] - public void HasNullEntityTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tPerson = session.Domain.Model.Types[typeof(Person)]; - var fMate = tPerson.Fields["Mate"]; - Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tPerson).OnOwnerRemove); - Assert.AreEqual(OnRemoveAction.Clear, fMate.GetAssociation(tPerson).OnTargetRemove); - - var nullPerson = new Person(Person.NullName); - Assert.AreSame(nullPerson, Person.Null); - - var a = new Person("A"); - var b = new Person("B") { Mate = a }; - a.Remove(); - Assert.AreSame(nullPerson, b.Mate); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.24 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Issues.Issue0676.Model; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.Issue0676.Model +{ + [Serializable] + [HierarchyRoot] + public class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Nullable = false)] + [Association(OnTargetRemove = OnRemoveAction.None)] + public Animal Mate { get; set; } + + [Field(Nullable = false)] + public Animal MateDenyRemove { get; set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + + public Animal(string name) + { + using (Session.DisableSaveChanges(this)) { + Name = name; + Mate = this; + MateDenyRemove = this; + } + } + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity, + IHasNullEntity + { + private sealed class KeyExtension + { + public Key Key { get; set; } + } + + #region "Null entity" pattern implementation + + public const string NullName = ""; + private static object @lock = new object(); + + public static Person Null { + get { + return Session.Demand().Query.Single(NullKey); + } + } + + protected static Key NullKey { + get { + var domain = Domain.Current; + if (domain==null) + return null; + var extensions = domain.Extensions; + var keyExtension = extensions.Get(); + if (keyExtension==null) + lock (@lock) { + keyExtension = extensions.Get(); + if (keyExtension==null) { + var nullPerson = Session.Demand().Query.All().Where(p => p.Name==NullName).SingleOrDefault(); + if (nullPerson!=null) { + keyExtension = new KeyExtension {Key = nullPerson.Key}; + extensions.Set(keyExtension); + } + } + } + return keyExtension==null ? null : keyExtension.Key; + } + } + + IEntity IHasNullEntity.NullEntity { + get { return Null; } + } + + #endregion + + [Field, Key] + public int Id { get; private set; } + + [Field(Nullable = false)] + [Association(OnTargetRemove = OnRemoveAction.Clear)] + public Person Mate { get; set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + + public Person(string name) + { + using (Session.DisableSaveChanges(this)) { + Name = name; + Mate = name==NullName ? this : Null; + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0676_NonNullableReferenceBug : AutoBuildTest + { + private const string VersionFieldName = "Version"; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + return configuration; + } + + [Test] + public void StandardTest() + { + using (var session = Domain.OpenSession()) { + var tAnimal = session.Domain.Model.Types[typeof (Animal)]; + var fMate = tAnimal.Fields["Mate"]; + Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tAnimal).OnOwnerRemove); + Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tAnimal).OnTargetRemove); + var fMateDenyRemove = tAnimal.Fields["MateDenyRemove"]; + Assert.AreEqual(OnRemoveAction.None, fMateDenyRemove.GetAssociation(tAnimal).OnOwnerRemove); + Assert.AreEqual(OnRemoveAction.Deny, fMateDenyRemove.GetAssociation(tAnimal).OnTargetRemove); + + Animal a,b; + Key aKey; + using (var tx = session.OpenTransaction()) + { + a = new Animal("A"); + b = new Animal("B") {Mate = a, MateDenyRemove = a}; + aKey = a.Key; + AssertEx.Throws(a.Remove); + b.MateDenyRemove = b; + a.Remove(); + tx.Complete(); + } + + using (var tx = session.OpenTransaction()) { + var dpa = session.Services.Demand(); + Assert.AreEqual(aKey, dpa.GetReferenceKey(b, fMate)); + tx.Complete(); + } + ((Action) (() => b.Remove())).InvokeTransactionally(session); + } + } + + [Test] + public void HasNullEntityTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tPerson = session.Domain.Model.Types[typeof(Person)]; + var fMate = tPerson.Fields["Mate"]; + Assert.AreEqual(OnRemoveAction.None, fMate.GetAssociation(tPerson).OnOwnerRemove); + Assert.AreEqual(OnRemoveAction.Clear, fMate.GetAssociation(tPerson).OnTargetRemove); + + var nullPerson = new Person(Person.NullName); + Assert.AreSame(nullPerson, Person.Null); + + var a = new Person("A"); + var b = new Person("B") { Mate = a }; + a.Remove(); + Assert.AreSame(nullPerson, b.Mate); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0682_FieldInfoIsNullable.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0682_FieldInfoIsNullable.cs index 7d4ad6c252..6593238a73 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0682_FieldInfoIsNullable.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0682_FieldInfoIsNullable.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.01.19 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0680; - -namespace Xtensive.Orm.Tests.Issues.Issue0680 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 64, Nullable = false)] - public string SysName { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue680Test : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); - return config; - } - - [Test] - public void BuildTest() - { - var qweType = typeof (Base); - var qweTypeInfo = Domain.Model.Types[qweType]; - var sysNameFieldInfo = qweTypeInfo.Fields["SysName"]; - Assert.IsFalse(sysNameFieldInfo.IsNullable); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.01.19 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0680; + +namespace Xtensive.Orm.Tests.Issues.Issue0680 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 64, Nullable = false)] + public string SysName { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue680Test : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); + return config; + } + + [Test] + public void BuildTest() + { + var qweType = typeof (Base); + var qweTypeInfo = Domain.Model.Types[qweType]; + var sysNameFieldInfo = qweTypeInfo.Fields["SysName"]; + Assert.IsFalse(sysNameFieldInfo.IsNullable); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0689_WeirdExceptionWhenMissingConnectionInfo.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0689_WeirdExceptionWhenMissingConnectionInfo.cs index d7e7451e4c..e29c63d1e5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0689_WeirdExceptionWhenMissingConnectionInfo.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0689_WeirdExceptionWhenMissingConnectionInfo.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.06.08 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0689_WeirdExceptionWhenMissingConnectionInfo : HasConfigurationAccessTest - { - [Test] - public void MissingConnectionInfoInCodeTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.ConnectionInfo = null; - AssertEx.Throws( - () => Domain.Build(configuration)); - } - - [Test] - public void MissingConnectionInfoInAppConfigTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - // Default behavior was changed - var config = LoadDomainConfiguration("AppConfigTest", "DomainWithWrongConnectionInfo"); - Assert.That(config.ConnectionInfo.Provider, Is.EqualTo(WellKnown.Provider.SqlServer)); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.06.08 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0689_WeirdExceptionWhenMissingConnectionInfo : HasConfigurationAccessTest + { + [Test] + public void MissingConnectionInfoInCodeTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.ConnectionInfo = null; + AssertEx.Throws( + () => Domain.Build(configuration)); + } + + [Test] + public void MissingConnectionInfoInAppConfigTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + // Default behavior was changed + var config = LoadDomainConfiguration("AppConfigTest", "DomainWithWrongConnectionInfo"); + Assert.That(config.ConnectionInfo.Provider, Is.EqualTo(WellKnown.Provider.SqlServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0690_RemoveAndCreate.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0690_RemoveAndCreate.cs index 687c5a3018..74b2b6943f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0690_RemoveAndCreate.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0690_RemoveAndCreate.cs @@ -1,150 +1,150 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.06.11 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issue0690_Model; - -namespace Xtensive.Orm.Tests.Issue0690_Model -{ - [HierarchyRoot] - public class Book : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntitySet Reviews { get; private set; } - } - - [HierarchyRoot] - public class Review : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class Message : Entity - { - [Key, Field(Length = 50)] - public string Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Message(string id) - : base(id) - { - - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0690_RemoveAndCreate : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); - return configuration; - } - - [Test] - public void EntitySetTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var book = new Book(); - var review = new Review(); - book.Reviews.Add(review); - book.Reviews.Clear(); - book.Reviews.Add(review); - session.SaveChanges(); - } - } - - [Test] - public void EntityWithCustomKeyTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var id = Guid.NewGuid().ToString(); - var message = new Message(id); - message.Remove(); - message = new Message(id); - session.SaveChanges(); - } - } - - [Test] - public void RemoveCreateTest() - { - var id = Guid.NewGuid().ToString(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var message = new Message(id) {Name = "Alfa"}; - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var message = session.Query.Single(id); - message.Remove(); - message = new Message(id) {Name = "Beta"}; - t.Complete(); - } - } - } - - [Test] - public void CreateRemoveTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var id = Guid.NewGuid().ToString(); - var message = new Message(id) { Name = "Alfa" }; - message.Remove(); - t.Complete(); - } - } - - [Test] - public void CreateRemoveCreateTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) - { - var id = Guid.NewGuid().ToString(); - var message = new Message(id) { Name = "Alfa" }; - message.Remove(); - message = new Message(id) {Name ="Beta"}; - t.Complete(); - } - } - - [Test] - public void RemoveCreateRemoveTest() - { - var id = Guid.NewGuid().ToString(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var message = new Message(id) {Name = "Alfa"}; - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var message = session.Query.Single(id); - message.Remove(); - message = new Message(id) {Name = "Beta"}; - message.Remove(); - t.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.06.11 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issue0690_Model; + +namespace Xtensive.Orm.Tests.Issue0690_Model +{ + [HierarchyRoot] + public class Book : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntitySet Reviews { get; private set; } + } + + [HierarchyRoot] + public class Review : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class Message : Entity + { + [Key, Field(Length = 50)] + public string Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Message(string id) + : base(id) + { + + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0690_RemoveAndCreate : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); + return configuration; + } + + [Test] + public void EntitySetTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var book = new Book(); + var review = new Review(); + book.Reviews.Add(review); + book.Reviews.Clear(); + book.Reviews.Add(review); + session.SaveChanges(); + } + } + + [Test] + public void EntityWithCustomKeyTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var id = Guid.NewGuid().ToString(); + var message = new Message(id); + message.Remove(); + message = new Message(id); + session.SaveChanges(); + } + } + + [Test] + public void RemoveCreateTest() + { + var id = Guid.NewGuid().ToString(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var message = new Message(id) {Name = "Alfa"}; + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var message = session.Query.Single(id); + message.Remove(); + message = new Message(id) {Name = "Beta"}; + t.Complete(); + } + } + } + + [Test] + public void CreateRemoveTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var id = Guid.NewGuid().ToString(); + var message = new Message(id) { Name = "Alfa" }; + message.Remove(); + t.Complete(); + } + } + + [Test] + public void CreateRemoveCreateTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) + { + var id = Guid.NewGuid().ToString(); + var message = new Message(id) { Name = "Alfa" }; + message.Remove(); + message = new Message(id) {Name ="Beta"}; + t.Complete(); + } + } + + [Test] + public void RemoveCreateRemoveTest() + { + var id = Guid.NewGuid().ToString(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var message = new Message(id) {Name = "Alfa"}; + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var message = session.Query.Single(id); + message.Remove(); + message = new Message(id) {Name = "Beta"}; + message.Remove(); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0696_EntitySetItemAddBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0696_EntitySetItemAddBug.cs index b569d4c42f..a6b23ad3ca 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0696_EntitySetItemAddBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0696_EntitySetItemAddBug.cs @@ -1,237 +1,237 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.24 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0696.Model; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Issues.Issue0696.Model -{ - [Serializable] - [HierarchyRoot] - public class Master : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - [Association(PairTo = "Master")] - public EntitySet Details { get; private set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - } - - [Serializable] - [HierarchyRoot] - public class Detail : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Master Master { get; set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class SyncEntry - { - public AssociationInfo Association; - public Entity End1; - public Entity End2; - public Direction LastDirection; - public int Depth; - - public bool CheckDirection(Direction currentDirection, out int depth) - { - depth = Depth; - if (currentDirection==Direction.None) - return false; - switch (LastDirection) { - case Direction.None: - if (currentDirection!=Direction.Positive) - Assert.Fail("Positive direction expected."); - LastDirection = currentDirection; - Depth++; - return false; - case Direction.Positive: - if (currentDirection==Direction.Positive) { - Depth++; - return false; - } - LastDirection = currentDirection; - Depth--; - depth = Depth; - return Depth==0; - case Direction.Negative: - if (currentDirection!=Direction.Negative) - Assert.Fail("Negative direction expected."); - Depth--; - depth = Depth; - if (Depth<0) - Assert.Fail("Depth is negative."); - return Depth == 0; - default: - throw new ArgumentOutOfRangeException("currentDirection"); - } - } - - - public SyncEntry(AssociationInfo association, Entity end1, Entity end2) - { - Association = association; - End1 = end1; - End2 = end2; - } - } - - [TestFixture] - public class Issue0696_EntitySetItemAddBug : AutoBuildTest - { - private const string VersionFieldName = "Version"; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Master).Assembly, typeof(Master).Namespace); - return configuration; - } - - [Test] - public void BugTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var m = new Master(); - - session.SaveChanges(); - session.Events.EntitySetItemAdd += (sender, e) => { - if (e.EntitySet ==m.Details && e.Item is Detail) { - // This call leads to EntitySet content refresh, and thus - // discarding of just added item. - var count = m.Details.Count; - } - }; - - var d1 = new Detail(); - var d2 = new Detail(); - d1.Master = m; - d2.Master = m; - Assert.IsTrue(m.Details.Contains(d2)); - Assert.IsTrue(m.Details.Contains(d1)); - } - } - - [Test] - public void EventSequenceTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - AttachSyncEventCheckers(session); - var m1 = new Master { Name = "m1" }; - var m2 = new Master { Name = "m2" }; - var d1 = new Detail { Name = "d1" }; - var d2 = new Detail { Name = "d2" }; - var d3 = new Detail { Name = "d3" }; - d1.Master = m1; - d2.Master = m1; - d1.Master = m2; - m1.Details.Add(d2); - - EventHandler h1 = (s, e) => { - isNewChain = true; - m2.Details.Add(d3); - }; - session.Events.EntitySetItemRemove += h1; - m2.Details.Add(d2); - } - } - - private void AttachSyncEventCheckers(Session session) - { - session.Events.EntityFieldValueSetting += CreateEntityFieldSettingHandler("Field value setting", Direction.Positive); - session.Events.EntityFieldValueSet += CreateEntityFieldSetHandler("Field value set", Direction.Negative); - session.Events.EntitySetItemAdding += CreateEntitySetItemHandler("Item adding", Direction.Positive); - session.Events.EntitySetItemAdd += CreateEntitySetItemHandler("Item added", Direction.Negative); - session.Events.EntitySetItemRemoving += CreateEntitySetItemHandler("Item removing", Direction.Positive); - session.Events.EntitySetItemRemove += CreateEntitySetItemHandler("Item removed", Direction.Negative); - } - - private EventHandler CreateEntityFieldSetHandler(string description, Direction direction) - { - return (sender, e) => { - var association = e.Field.Associations.LastOrDefault(); - if (association == null) - return; - CheckDirection(association, e.Entity, (Entity)e.NewValue, direction, - string.Format("{0}, Field = {1}, Entity = {2}, Value = {3}", description, - e.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.NewValue)); - }; - } - - private EventHandler CreateEntityFieldSettingHandler(string description, Direction direction) - { - return (sender, e) => { - var association = e.Field.Associations.LastOrDefault(); - if (association==null) - return; - CheckDirection(association, e.Entity, (Entity)e.Value, direction, - string.Format("{0}, Field = {1}, Entity = {2}, Value = {3}", description, - e.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.Value)); - }; - } - - private EventHandler CreateEntitySetItemHandler(string description, Direction direction) - { - return (sender, e) => { - if (e.Field.Associations.LastOrDefault() == null) - return; - CheckDirection(e.EntitySet.Field.GetAssociation(e.Item.TypeInfo), e.Entity, e.Item, direction, - string.Format("{0}, Field = {1}, Owner = {2}, Item = {3}", description, - e.EntitySet.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.Item)); - }; - } - - private Stack stack = new Stack(); - private bool isNewChain; - - private void CheckDirection(AssociationInfo association, Entity owner, Entity item, Direction direction, string message) - { - var entry = (stack.Count>0) ? stack.Peek() : null; - if (entry==null || isNewChain) { - isNewChain = false; - entry = new SyncEntry(association, owner, item); - stack.Push(entry); - } - int depth; - if (entry.CheckDirection(direction, out depth)) - stack.Pop(); - TestLog.Info("{0}", message.Indent(depth * 2)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.24 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0696.Model; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Issues.Issue0696.Model +{ + [Serializable] + [HierarchyRoot] + public class Master : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + [Association(PairTo = "Master")] + public EntitySet Details { get; private set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } + + [Serializable] + [HierarchyRoot] + public class Detail : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Master Master { get; set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class SyncEntry + { + public AssociationInfo Association; + public Entity End1; + public Entity End2; + public Direction LastDirection; + public int Depth; + + public bool CheckDirection(Direction currentDirection, out int depth) + { + depth = Depth; + if (currentDirection==Direction.None) + return false; + switch (LastDirection) { + case Direction.None: + if (currentDirection!=Direction.Positive) + Assert.Fail("Positive direction expected."); + LastDirection = currentDirection; + Depth++; + return false; + case Direction.Positive: + if (currentDirection==Direction.Positive) { + Depth++; + return false; + } + LastDirection = currentDirection; + Depth--; + depth = Depth; + return Depth==0; + case Direction.Negative: + if (currentDirection!=Direction.Negative) + Assert.Fail("Negative direction expected."); + Depth--; + depth = Depth; + if (Depth<0) + Assert.Fail("Depth is negative."); + return Depth == 0; + default: + throw new ArgumentOutOfRangeException("currentDirection"); + } + } + + + public SyncEntry(AssociationInfo association, Entity end1, Entity end2) + { + Association = association; + End1 = end1; + End2 = end2; + } + } + + [TestFixture] + public class Issue0696_EntitySetItemAddBug : AutoBuildTest + { + private const string VersionFieldName = "Version"; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Master).Assembly, typeof(Master).Namespace); + return configuration; + } + + [Test] + public void BugTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var m = new Master(); + + session.SaveChanges(); + session.Events.EntitySetItemAdd += (sender, e) => { + if (e.EntitySet ==m.Details && e.Item is Detail) { + // This call leads to EntitySet content refresh, and thus + // discarding of just added item. + var count = m.Details.Count; + } + }; + + var d1 = new Detail(); + var d2 = new Detail(); + d1.Master = m; + d2.Master = m; + Assert.IsTrue(m.Details.Contains(d2)); + Assert.IsTrue(m.Details.Contains(d1)); + } + } + + [Test] + public void EventSequenceTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + AttachSyncEventCheckers(session); + var m1 = new Master { Name = "m1" }; + var m2 = new Master { Name = "m2" }; + var d1 = new Detail { Name = "d1" }; + var d2 = new Detail { Name = "d2" }; + var d3 = new Detail { Name = "d3" }; + d1.Master = m1; + d2.Master = m1; + d1.Master = m2; + m1.Details.Add(d2); + + EventHandler h1 = (s, e) => { + isNewChain = true; + m2.Details.Add(d3); + }; + session.Events.EntitySetItemRemove += h1; + m2.Details.Add(d2); + } + } + + private void AttachSyncEventCheckers(Session session) + { + session.Events.EntityFieldValueSetting += CreateEntityFieldSettingHandler("Field value setting", Direction.Positive); + session.Events.EntityFieldValueSet += CreateEntityFieldSetHandler("Field value set", Direction.Negative); + session.Events.EntitySetItemAdding += CreateEntitySetItemHandler("Item adding", Direction.Positive); + session.Events.EntitySetItemAdd += CreateEntitySetItemHandler("Item added", Direction.Negative); + session.Events.EntitySetItemRemoving += CreateEntitySetItemHandler("Item removing", Direction.Positive); + session.Events.EntitySetItemRemove += CreateEntitySetItemHandler("Item removed", Direction.Negative); + } + + private EventHandler CreateEntityFieldSetHandler(string description, Direction direction) + { + return (sender, e) => { + var association = e.Field.Associations.LastOrDefault(); + if (association == null) + return; + CheckDirection(association, e.Entity, (Entity)e.NewValue, direction, + string.Format("{0}, Field = {1}, Entity = {2}, Value = {3}", description, + e.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.NewValue)); + }; + } + + private EventHandler CreateEntityFieldSettingHandler(string description, Direction direction) + { + return (sender, e) => { + var association = e.Field.Associations.LastOrDefault(); + if (association==null) + return; + CheckDirection(association, e.Entity, (Entity)e.Value, direction, + string.Format("{0}, Field = {1}, Entity = {2}, Value = {3}", description, + e.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.Value)); + }; + } + + private EventHandler CreateEntitySetItemHandler(string description, Direction direction) + { + return (sender, e) => { + if (e.Field.Associations.LastOrDefault() == null) + return; + CheckDirection(e.EntitySet.Field.GetAssociation(e.Item.TypeInfo), e.Entity, e.Item, direction, + string.Format("{0}, Field = {1}, Owner = {2}, Item = {3}", description, + e.EntitySet.Field.UnderlyingProperty.GetShortName(true), e.Entity, e.Item)); + }; + } + + private Stack stack = new Stack(); + private bool isNewChain; + + private void CheckDirection(AssociationInfo association, Entity owner, Entity item, Direction direction, string message) + { + var entry = (stack.Count>0) ? stack.Peek() : null; + if (entry==null || isNewChain) { + isNewChain = false; + entry = new SyncEntry(association, owner, item); + stack.Push(entry); + } + int depth; + if (entry.CheckDirection(direction, out depth)) + stack.Pop(); + TestLog.Info("{0}", message.Indent(depth * 2)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0713_InconsistentDefaultDateTimeValues.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0713_InconsistentDefaultDateTimeValues.cs index 7803c5395a..5c5a8d0895 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0713_InconsistentDefaultDateTimeValues.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0713_InconsistentDefaultDateTimeValues.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.06.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Tests.Issues.InconsistentDefaultDateTimeValuesModel1 -{ - [HierarchyRoot] - public class MyEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.InconsistentDefaultDateTimeValuesModel2 -{ - [HierarchyRoot] - public class MyEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public DateTime Value { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0713_InconsistentDefaultDateTimeValues - { - public class Upgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - hints.Add(new RenameTypeHint(typeof (InconsistentDefaultDateTimeValuesModel1.MyEntity).FullName, typeof (InconsistentDefaultDateTimeValuesModel2.MyEntity))); - } - } - - [Test] - public void MainTest() - { - var configuration1 = DomainConfigurationFactory.Create(); - configuration1.Types.Register(typeof(InconsistentDefaultDateTimeValuesModel1.MyEntity)); - configuration1.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain1 = Domain.Build(configuration1)) - using (var session = domain1.OpenSession()) - using (var ts = session.OpenTransaction()) { - new InconsistentDefaultDateTimeValuesModel1.MyEntity(); - ts.Complete(); - } - - var configuration2 = DomainConfigurationFactory.Create(); - configuration2.Types.Register(typeof(InconsistentDefaultDateTimeValuesModel2.MyEntity)); - configuration2.Types.Register(typeof(Upgrader)); - configuration2.UpgradeMode = DomainUpgradeMode.Perform; - - using (var domain2 = Domain.Build(configuration2)) - using (var session = domain2.OpenSession()) - using (var ts = session.OpenTransaction()) { - var count = session.Query.All().Count(); - Assert.AreEqual(1, count); - session.Query.All().First(entity => entity.Value==DateTime.MinValue); - ts.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.06.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Tests.Issues.InconsistentDefaultDateTimeValuesModel1 +{ + [HierarchyRoot] + public class MyEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.InconsistentDefaultDateTimeValuesModel2 +{ + [HierarchyRoot] + public class MyEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public DateTime Value { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0713_InconsistentDefaultDateTimeValues + { + public class Upgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + hints.Add(new RenameTypeHint(typeof (InconsistentDefaultDateTimeValuesModel1.MyEntity).FullName, typeof (InconsistentDefaultDateTimeValuesModel2.MyEntity))); + } + } + + [Test] + public void MainTest() + { + var configuration1 = DomainConfigurationFactory.Create(); + configuration1.Types.Register(typeof(InconsistentDefaultDateTimeValuesModel1.MyEntity)); + configuration1.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain1 = Domain.Build(configuration1)) + using (var session = domain1.OpenSession()) + using (var ts = session.OpenTransaction()) { + new InconsistentDefaultDateTimeValuesModel1.MyEntity(); + ts.Complete(); + } + + var configuration2 = DomainConfigurationFactory.Create(); + configuration2.Types.Register(typeof(InconsistentDefaultDateTimeValuesModel2.MyEntity)); + configuration2.Types.Register(typeof(Upgrader)); + configuration2.UpgradeMode = DomainUpgradeMode.Perform; + + using (var domain2 = Domain.Build(configuration2)) + using (var session = domain2.OpenSession()) + using (var ts = session.OpenTransaction()) { + var count = session.Query.All().Count(); + Assert.AreEqual(1, count); + session.Query.All().First(entity => entity.Value==DateTime.MinValue); + ts.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0715_NestedTypeBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0715_NestedTypeBug.cs index 956fda6fcc..85b20e79fd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0715_NestedTypeBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0715_NestedTypeBug.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.24 - -using System; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0715.Model; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.Issue0715.Model -{ - public static class Forest - { - [Serializable] - [HierarchyRoot] - public class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - } - } - - [Serializable] - [HierarchyRoot] - public class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public override string ToString() - { - return Name; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0715_NestedTypeBug : AutoBuildTest - { - private const string VersionFieldName = "Version"; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Animal).Assembly, typeof(Animal).Namespace); - return configuration; - } - - [Test] - public void StandardTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Forest.Animal {Name = "Forest Animal"}; - new Animal {Name = "Animal"}; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.24 + +using System; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0715.Model; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.Issue0715.Model +{ + public static class Forest + { + [Serializable] + [HierarchyRoot] + public class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } + } + + [Serializable] + [HierarchyRoot] + public class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0715_NestedTypeBug : AutoBuildTest + { + private const string VersionFieldName = "Version"; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Animal).Assembly, typeof(Animal).Namespace); + return configuration; + } + + [Test] + public void StandardTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Forest.Animal {Name = "Forest Animal"}; + new Animal {Name = "Animal"}; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0717_VersionCheckBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0717_VersionCheckBug.cs index be5dc3d0eb..d05a1106ee 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0717_VersionCheckBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0717_VersionCheckBug.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.24 - -using System; -using System.Collections.Generic; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0717.Model; -using Xtensive.Core; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Issues.Issue0717.Model -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field, Version] - public DateTime Version { get; set; } - - /// - /// Gets or sets Name. - /// - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0717_VersionCheckBug : AutoBuildTest - { - private const string VersionFieldName = "Version"; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - configuration.Sessions.Default.BatchSize = 25; - configuration.Sessions.Default.DefaultIsolationLevel = IsolationLevel.ReadCommitted; - configuration.Sessions.Default.CacheSize = 1000; - return configuration; - } - - [Test] - public void Test() - { - using (var session = Domain.OpenSession()) { - Person person; - Key key; - VersionInfo version; - using (var tx = session.OpenTransaction()) { - person = new Person() {Name = "Name"}; - key = person.Key; - version = person.VersionInfo; - tx.Complete(); - } - - // 1st update (ok) - OptimisticUpdate(key, version, p => p.Name = "ANewName" ); - - // 2nd update (must fail) - AssertEx.Throws(() => - OptimisticUpdate(key, version, p => p.Name = "ANewName" )); - } - } - - public virtual void OptimisticUpdate(Key key, VersionInfo expectedVersion, Action updater) - where T: class, IEntity - { - var expectedVersions = new VersionSet( - new List> { - new KeyValuePair(key, expectedVersion), - }); - - var session = Session.Demand(); - using (VersionValidator.Attach(session, expectedVersions)) { - using (var tx = session.OpenTransaction()) { - var entity = session.Query.Single(key); - updater.Invoke(entity); - session.Validate(); - tx.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.24 + +using System; +using System.Collections.Generic; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0717.Model; +using Xtensive.Core; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Issues.Issue0717.Model +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field, Version] + public DateTime Version { get; set; } + + /// + /// Gets or sets Name. + /// + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0717_VersionCheckBug : AutoBuildTest + { + private const string VersionFieldName = "Version"; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + configuration.Sessions.Default.BatchSize = 25; + configuration.Sessions.Default.DefaultIsolationLevel = IsolationLevel.ReadCommitted; + configuration.Sessions.Default.CacheSize = 1000; + return configuration; + } + + [Test] + public void Test() + { + using (var session = Domain.OpenSession()) { + Person person; + Key key; + VersionInfo version; + using (var tx = session.OpenTransaction()) { + person = new Person() {Name = "Name"}; + key = person.Key; + version = person.VersionInfo; + tx.Complete(); + } + + // 1st update (ok) + OptimisticUpdate(key, version, p => p.Name = "ANewName" ); + + // 2nd update (must fail) + AssertEx.Throws(() => + OptimisticUpdate(key, version, p => p.Name = "ANewName" )); + } + } + + public virtual void OptimisticUpdate(Key key, VersionInfo expectedVersion, Action updater) + where T: class, IEntity + { + var expectedVersions = new VersionSet( + new List> { + new KeyValuePair(key, expectedVersion), + }); + + var session = Session.Demand(); + using (VersionValidator.Attach(session, expectedVersions)) { + using (var tx = session.OpenTransaction()) { + var entity = session.Query.Single(key); + updater.Invoke(entity); + session.Validate(); + tx.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0733_UseINNER_JOIN.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0733_UseINNER_JOIN.cs index d86a60a7f9..1329ee61b7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0733_UseINNER_JOIN.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0733_UseINNER_JOIN.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.12 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0737_PersistentFieldState_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0737_PersistentFieldState_Model - { - [HierarchyRoot] - public class Derived : Entity - { - [Key,Field] - public int Id { get; private set; } - - [Field] - public new string State { get; set; } - } - - [HierarchyRoot, Serializable] - [TableMapping("States")] - [KeyGenerator(KeyGeneratorKind.None)] - public class State : Entity - { - [Key] - [Field(Length = 100)] - public string ID { get; private set; } - - [Field] - [Association(PairTo = "State")] - public EntitySet AbiturAds { get; set; } - } - - [HierarchyRoot, Serializable] - [TableMapping("AbiturAds")] - public class AbiturAd : Entity - { - [Key] - [Field] - public int ID { get; private set; } - - [Field] - [FieldMapping("StateID")] - public new State State { get; set; } - } - } - - [Serializable] - public class Issue0737_PersistentFieldState : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(Derived).Assembly, typeof(Derived).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var derived = new Derived() {State = "new"}; - - var list = session.Query.All() - .Where(d => d.State == "new") - .ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.12 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0737_PersistentFieldState_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0737_PersistentFieldState_Model + { + [HierarchyRoot] + public class Derived : Entity + { + [Key,Field] + public int Id { get; private set; } + + [Field] + public new string State { get; set; } + } + + [HierarchyRoot, Serializable] + [TableMapping("States")] + [KeyGenerator(KeyGeneratorKind.None)] + public class State : Entity + { + [Key] + [Field(Length = 100)] + public string ID { get; private set; } + + [Field] + [Association(PairTo = "State")] + public EntitySet AbiturAds { get; set; } + } + + [HierarchyRoot, Serializable] + [TableMapping("AbiturAds")] + public class AbiturAd : Entity + { + [Key] + [Field] + public int ID { get; private set; } + + [Field] + [FieldMapping("StateID")] + public new State State { get; set; } + } + } + + [Serializable] + public class Issue0737_PersistentFieldState : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(Derived).Assembly, typeof(Derived).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var derived = new Derived() {State = "new"}; + + var list = session.Query.All() + .Where(d => d.State == "new") + .ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0737_PersistentFieldState.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0737_PersistentFieldState.cs index 1bce06c2d4..9ba88d542e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0737_PersistentFieldState.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0737_PersistentFieldState.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.12 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0733_UseINNER_JOIN_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0733_UseINNER_JOIN_Model - { - [HierarchyRoot] - public class Person : Entity - { - [Key,Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field(Nullable = false)] - public City City { get; set; } - } - - [HierarchyRoot] - public class City : Entity - { - [Key,Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - } - - [Serializable] - public class Issue0733_UseINNER_JOIN : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var msk = new City() {Name = "Moscow"}; - var ekb = new City() {Name = "Yekaterinburg"}; - for (int i = 0; i < 100; i++) { - new Person() {Name = "Alex " + i, City = msk}; - new Person() {Name = "Ivan " + i, City = ekb}; - } - - var list = session.Query.All() - .OrderBy(p => p.City.Name) - .Take(10) - .ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.12 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0733_UseINNER_JOIN_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0733_UseINNER_JOIN_Model + { + [HierarchyRoot] + public class Person : Entity + { + [Key,Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field(Nullable = false)] + public City City { get; set; } + } + + [HierarchyRoot] + public class City : Entity + { + [Key,Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + } + + [Serializable] + public class Issue0733_UseINNER_JOIN : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var msk = new City() {Name = "Moscow"}; + var ekb = new City() {Name = "Yekaterinburg"}; + for (int i = 0; i < 100; i++) { + new Person() {Name = "Alex " + i, City = msk}; + new Person() {Name = "Ivan " + i, City = ekb}; + } + + var list = session.Query.All() + .OrderBy(p => p.City.Name) + .Take(10) + .ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0751_EntitySetEquals.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0751_EntitySetEquals.cs index 4b86436a92..1606457fc5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0751_EntitySetEquals.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0751_EntitySetEquals.cs @@ -1,250 +1,250 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.08.31 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0751_EntitySetEqualsModel; - -namespace Xtensive.Orm.Tests.Issues.Issue0751_EntitySetEqualsModel -{ - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Company Company { get; set; } - } - - [HierarchyRoot] - public class Company : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Company")] - public EntitySet Persons { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0751_EntitySetEquals : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void EqualToNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company(); - var company2 = new Company(); - var person11 = new Person {Company = company1}; - var person12 = new Person {Company = company1}; - var person13 = new Person {Company = company1}; - var person21 = new Person {Company = company2}; - var person22 = new Person {Company = company2}; - var person23 = new Person {Company = company2}; - var query = from company in session.Query.All() - where null==company.Persons - select company; - var result = query.ToList(); - Assert.AreEqual(0, result.Count); - // Rollback - } - } - } - - [Test] - public void NotEqualToNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company(); - var company2 = new Company(); - var person11 = new Person {Company = company1}; - var person12 = new Person {Company = company1}; - var person13 = new Person {Company = company1}; - var person21 = new Person {Company = company2}; - var person22 = new Person {Company = company2}; - var person23 = new Person {Company = company2}; - var query = from company in session.Query.All() - where company.Persons!=null - select company; - var result = query.ToList(); - Assert.AreEqual(2, result.Count); - // Rollback - } - } - } - - [Test] - public void EqualTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company{Name = "Company"}; - var company2 = new Company{Name = "Company"}; - - var query = - from x in - from c1 in session.Query.All() - join c2 in session.Query.All() - on c1.Name equals c2.Name - select new {Company1 = c1, Company2 = c2} - where x.Company1.Persons==x.Company2.Persons - select x; - var result = query.ToList(); - Assert.AreEqual(2, result.Count); - foreach (var pair in result) - Assert.AreEqual(pair.Company1, pair.Company2); - // Rollback - } - } - } - - [Test] - public void NotEqualTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company{Name = "Company"}; - var company2 = new Company{Name = "Company"}; - - var query = - from x in - from c1 in session.Query.All() - join c2 in session.Query.All() - on c1.Name equals c2.Name - select new {Company1 = c1, Company2 = c2} - where x.Company1.Persons!=x.Company2.Persons - select x; - var result = query.ToList(); - Assert.AreEqual(2, result.Count); - foreach (var pair in result) - Assert.AreNotEqual(pair.Company1, pair.Company2); - // Rollback - } - } - } - - [Test] - public void ParameterNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company {Name = "Company"}; - var company2 = new Company {Name = "Company"}; - EntitySet nullEntitySet = null; - var query = - from c in session.Query.All() - where c.Persons==nullEntitySet - select c; - var result = query.ToList(); - Assert.AreEqual(0, result.Count); - // Rollback - } - } - } - - [Test] - public void ClosureEqual1Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company {Name = "Company1"}; - var company2 = new Company {Name = "Company2"}; - EntitySet persons = company1.Persons; - var query = - from c in session.Query.All() - where c.Persons==persons - select c; - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(company1, result.Single()); - // Rollback - } - } - } - - [Test] - public void ClosureEqual2Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company {Name = "Company1"}; - var company2 = new Company {Name = "Company2"}; - var query = - from c in session.Query.All() - where c.Persons==company1.Persons - select c; - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(company1, result.Single()); - // Rollback - } - } - } - - [Test] - public void ClosureNotEqualTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company {Name = "Company1"}; - var company2 = new Company {Name = "Company2"}; - EntitySet persons = company1.Persons; - var query = - from c in session.Query.All() - where c.Persons!=persons - select c; - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(company2, result.Single()); - // Rollback - } - } - } - - [Test] - public void ParameterEqualTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var company1 = new Company {Name = "Company1"}; - var company2 = new Company {Name = "Company2"}; - EntitySet persons = company1.Persons; - ParameterEqual(company1, persons); - // Rollback - } - } - } - - private void ParameterEqual(Company company1, EntitySet persons) - { - var query = - from c in Session.Demand().Query.All() - where c.Persons==persons - select c; - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(company1, result.Single()); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.08.31 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0751_EntitySetEqualsModel; + +namespace Xtensive.Orm.Tests.Issues.Issue0751_EntitySetEqualsModel +{ + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Company Company { get; set; } + } + + [HierarchyRoot] + public class Company : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Company")] + public EntitySet Persons { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0751_EntitySetEquals : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void EqualToNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company(); + var company2 = new Company(); + var person11 = new Person {Company = company1}; + var person12 = new Person {Company = company1}; + var person13 = new Person {Company = company1}; + var person21 = new Person {Company = company2}; + var person22 = new Person {Company = company2}; + var person23 = new Person {Company = company2}; + var query = from company in session.Query.All() + where null==company.Persons + select company; + var result = query.ToList(); + Assert.AreEqual(0, result.Count); + // Rollback + } + } + } + + [Test] + public void NotEqualToNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company(); + var company2 = new Company(); + var person11 = new Person {Company = company1}; + var person12 = new Person {Company = company1}; + var person13 = new Person {Company = company1}; + var person21 = new Person {Company = company2}; + var person22 = new Person {Company = company2}; + var person23 = new Person {Company = company2}; + var query = from company in session.Query.All() + where company.Persons!=null + select company; + var result = query.ToList(); + Assert.AreEqual(2, result.Count); + // Rollback + } + } + } + + [Test] + public void EqualTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company{Name = "Company"}; + var company2 = new Company{Name = "Company"}; + + var query = + from x in + from c1 in session.Query.All() + join c2 in session.Query.All() + on c1.Name equals c2.Name + select new {Company1 = c1, Company2 = c2} + where x.Company1.Persons==x.Company2.Persons + select x; + var result = query.ToList(); + Assert.AreEqual(2, result.Count); + foreach (var pair in result) + Assert.AreEqual(pair.Company1, pair.Company2); + // Rollback + } + } + } + + [Test] + public void NotEqualTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company{Name = "Company"}; + var company2 = new Company{Name = "Company"}; + + var query = + from x in + from c1 in session.Query.All() + join c2 in session.Query.All() + on c1.Name equals c2.Name + select new {Company1 = c1, Company2 = c2} + where x.Company1.Persons!=x.Company2.Persons + select x; + var result = query.ToList(); + Assert.AreEqual(2, result.Count); + foreach (var pair in result) + Assert.AreNotEqual(pair.Company1, pair.Company2); + // Rollback + } + } + } + + [Test] + public void ParameterNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company {Name = "Company"}; + var company2 = new Company {Name = "Company"}; + EntitySet nullEntitySet = null; + var query = + from c in session.Query.All() + where c.Persons==nullEntitySet + select c; + var result = query.ToList(); + Assert.AreEqual(0, result.Count); + // Rollback + } + } + } + + [Test] + public void ClosureEqual1Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company {Name = "Company1"}; + var company2 = new Company {Name = "Company2"}; + EntitySet persons = company1.Persons; + var query = + from c in session.Query.All() + where c.Persons==persons + select c; + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(company1, result.Single()); + // Rollback + } + } + } + + [Test] + public void ClosureEqual2Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company {Name = "Company1"}; + var company2 = new Company {Name = "Company2"}; + var query = + from c in session.Query.All() + where c.Persons==company1.Persons + select c; + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(company1, result.Single()); + // Rollback + } + } + } + + [Test] + public void ClosureNotEqualTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company {Name = "Company1"}; + var company2 = new Company {Name = "Company2"}; + EntitySet persons = company1.Persons; + var query = + from c in session.Query.All() + where c.Persons!=persons + select c; + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(company2, result.Single()); + // Rollback + } + } + } + + [Test] + public void ParameterEqualTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var company1 = new Company {Name = "Company1"}; + var company2 = new Company {Name = "Company2"}; + EntitySet persons = company1.Persons; + ParameterEqual(company1, persons); + // Rollback + } + } + } + + private void ParameterEqual(Company company1, EntitySet persons) + { + var query = + from c in Session.Demand().Query.All() + where c.Persons==persons + select c; + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(company1, result.Single()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Issue0754_CopyFieldHint_MoveFieldHint.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Issue0754_CopyFieldHint_MoveFieldHint.cs index 476daf2dec..e35de1f92c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Issue0754_CopyFieldHint_MoveFieldHint.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Issue0754_CopyFieldHint_MoveFieldHint.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2010.11.17 - -using System; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Providers; - - -namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint -{ - [TestFixture] - public class Issue0754_CopyFieldHint_MoveFieldHint - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain(typeof (ModelVersion1.A), DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var acticle = new ModelVersion1.B(){Reference = new ModelVersion1.X()}; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeTest() - { - Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); - BuildDomain(typeof (ModelVersion2.A), DomainUpgradeMode.PerformSafely); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var result = session.Query.All().ToList(); - Assert.AreEqual(1, result.Count); - Assert.IsNotNull(result[0].Reference); - } - } - } - - private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) - { - if (domain!=null) - domain.DisposeSafely(); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), type.Namespace); - configuration.Types.Register(typeof (Upgrader)); - - domain = Domain.Build(configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2010.11.17 + +using System; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Providers; + + +namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint +{ + [TestFixture] + public class Issue0754_CopyFieldHint_MoveFieldHint + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain(typeof (ModelVersion1.A), DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var acticle = new ModelVersion1.B(){Reference = new ModelVersion1.X()}; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeTest() + { + Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); + BuildDomain(typeof (ModelVersion2.A), DomainUpgradeMode.PerformSafely); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var result = session.Query.All().ToList(); + Assert.AreEqual(1, result.Count); + Assert.IsNotNull(result[0].Reference); + } + } + } + + private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) + { + if (domain!=null) + domain.DisposeSafely(); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), type.Namespace); + configuration.Types.Register(typeof (Upgrader)); + + domain = Domain.Build(configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion1.cs index 09c7e5c741..3b8d50b89c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion1.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2010.11.17 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint.ModelVersion1 -{ - [HierarchyRoot] - public class X : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class A : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class B : A - { - [Field] - public X Reference { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2010.11.17 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint.ModelVersion1 +{ + [HierarchyRoot] + public class X : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class A : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class B : A + { + [Field] + public X Reference { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion2.cs index 99a3138f3c..28b4c41111 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/ModelVersion2.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2010.11.17 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint.ModelVersion2 -{ - [HierarchyRoot] - public class X : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class A : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public X Reference { get; set; } - } - - public class B : A - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2010.11.17 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint.ModelVersion2 +{ + [HierarchyRoot] + public class X : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class A : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public X Reference { get; set; } + } + + public class B : A + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Upgrader.cs index c7f56fe205..601af14861 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0754_CopyFieldHint_MoveFieldHint/Upgrader.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2010.11.17 - -using System; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint -{ - public class Upgrader: UpgradeHandler - { - protected override void AddUpgradeHints(Collections.ISet hints) - { - hints.Add(new RenameTypeHint(typeof (ModelVersion1.A).FullName, typeof (ModelVersion2.A))); - hints.Add(new RenameTypeHint(typeof (ModelVersion1.B).FullName, typeof (ModelVersion2.B))); - hints.Add(new RenameTypeHint(typeof (ModelVersion1.X).FullName, typeof (ModelVersion2.X))); - hints.Add(new MoveFieldHint(typeof (ModelVersion1.B).FullName, "Reference", typeof (ModelVersion2.A))); - base.AddUpgradeHints(hints); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2010.11.17 + +using System; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Tests.Issues.Issue0754_CopyFieldHint_MoveFieldHint +{ + public class Upgrader: UpgradeHandler + { + protected override void AddUpgradeHints(Collections.ISet hints) + { + hints.Add(new RenameTypeHint(typeof (ModelVersion1.A).FullName, typeof (ModelVersion2.A))); + hints.Add(new RenameTypeHint(typeof (ModelVersion1.B).FullName, typeof (ModelVersion2.B))); + hints.Add(new RenameTypeHint(typeof (ModelVersion1.X).FullName, typeof (ModelVersion2.X))); + hints.Add(new MoveFieldHint(typeof (ModelVersion1.B).FullName, "Reference", typeof (ModelVersion2.A))); + base.AddUpgradeHints(hints); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0764_LinqTranslationError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0764_LinqTranslationError.cs index 3bc90b769c..0c6037b2fc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0764_LinqTranslationError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0764_LinqTranslationError.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.12 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0764_LinqTranslationError_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0764_LinqTranslationError_Model - { - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field, Association(PairTo = "LinkSource", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet LinksFromThis { get; private set; } - - [Field, Association(PairTo = "LinkDestination", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet LinksToThis { get; private set; } - } - - [HierarchyRoot] - public class Link : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyEntity LinkSource { get; set; } - - [Field] - public MyEntity LinkDestination { get; set; } - } - } - - [Serializable] - public class Issue0764_LinqTranslationError : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var source = new MyEntity() { Text = "Source" }; - var destination = new MyEntity() { Text = "Destination" }; - var link = new Link() {LinkSource = source, LinkDestination = destination}; - - var query = - from l in session.Query.All() - where l.LinkSource == source && l.LinkDestination.Text == "Destination" - select l.LinkDestination; - - query.ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.12 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0764_LinqTranslationError_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0764_LinqTranslationError_Model + { + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field, Association(PairTo = "LinkSource", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet LinksFromThis { get; private set; } + + [Field, Association(PairTo = "LinkDestination", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet LinksToThis { get; private set; } + } + + [HierarchyRoot] + public class Link : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyEntity LinkSource { get; set; } + + [Field] + public MyEntity LinkDestination { get; set; } + } + } + + [Serializable] + public class Issue0764_LinqTranslationError : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(MyEntity).Assembly, typeof(MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var source = new MyEntity() { Text = "Source" }; + var destination = new MyEntity() { Text = "Destination" }; + var link = new Link() {LinkSource = source, LinkDestination = destination}; + + var query = + from l in session.Query.All() + where l.LinkSource == source && l.LinkDestination.Text == "Destination" + select l.LinkDestination; + + query.ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0765_LinqTranslationError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0765_LinqTranslationError.cs index 81c3edb0db..50a648679b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0765_LinqTranslationError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0765_LinqTranslationError.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0765_LinqTranslationError_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0765_LinqTranslationError_Model - { - [HierarchyRoot] - public class Document : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field(Length = Int32.MaxValue)] - public string FullText { get; set; } - } - - public class Invoice : Document - { - [Field(Length = 80)] - public String DocumentId { get; set; } - - [Field(Length = 80)] - public String Supplier { get; set; } - } - - [HierarchyRoot] - public class InvoiceExtract : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Invoice Owner { get; set; } - - [Field] - public string Name { get; set; } - - [Field(Length = Int32.MaxValue)] - public string FullText { get; set; } - } - } - - [Serializable] - public class Issue0765_LinqTranslationError : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(Document).Assembly, typeof(Document).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var invoice = new Invoice { - DocumentId = "test", - Supplier = "supplier" - }; - var extract = new InvoiceExtract { Owner = invoice }; - - // Committing transaction - t.Complete(); - } - - // Reading all persisted objects from another Session - using (var session = Domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var groupByQuery = session.Query.All() - .Join(session.Query.All(), i => i, e => e.Owner, (i, e) => new { Invoice = i, Extract = e }) - .GroupBy(c => c.Invoice.DocumentId); - var result = groupByQuery.ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0765_LinqTranslationError_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0765_LinqTranslationError_Model + { + [HierarchyRoot] + public class Document : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field(Length = Int32.MaxValue)] + public string FullText { get; set; } + } + + public class Invoice : Document + { + [Field(Length = 80)] + public String DocumentId { get; set; } + + [Field(Length = 80)] + public String Supplier { get; set; } + } + + [HierarchyRoot] + public class InvoiceExtract : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Invoice Owner { get; set; } + + [Field] + public string Name { get; set; } + + [Field(Length = Int32.MaxValue)] + public string FullText { get; set; } + } + } + + [Serializable] + public class Issue0765_LinqTranslationError : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(Document).Assembly, typeof(Document).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var invoice = new Invoice { + DocumentId = "test", + Supplier = "supplier" + }; + var extract = new InvoiceExtract { Owner = invoice }; + + // Committing transaction + t.Complete(); + } + + // Reading all persisted objects from another Session + using (var session = Domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var groupByQuery = session.Query.All() + .Join(session.Query.All(), i => i, e => e.Owner, (i, e) => new { Invoice = i, Extract = e }) + .GroupBy(c => c.Invoice.DocumentId); + var result = groupByQuery.ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0766_LinqTranslationError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0766_LinqTranslationError.cs index fc4ddb13f5..4cdf0ad986 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0766_LinqTranslationError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0766_LinqTranslationError.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.23 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Issues -{ - [Serializable] - public class Issue0766_LinqTranslationError : ChinookDOModelTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - } - - [Test] - public void MainTest() - { - var result1 = - from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).Take(1).DefaultIfEmpty() - where i!=null - select - new { - ID = c.CustomerId, - Name = c.FirstName, - InvoiceID = i.InvoiceId - }; - var list1 = result1.ToList(); - - var result2 = - from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).DefaultIfEmpty() - where i!=null - select - new { - ID = c.CustomerId, - Name = c.FirstName, - InvoiceID = i.InvoiceId - }; - var list2 = result2.ToList(); - - var count = result1.Count(); - Assert.AreEqual(list1.Count, count); - Assert.Greater(list2.Count, count); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.23 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Issues +{ + [Serializable] + public class Issue0766_LinqTranslationError : ChinookDOModelTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + } + + [Test] + public void MainTest() + { + var result1 = + from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).Take(1).DefaultIfEmpty() + where i!=null + select + new { + ID = c.CustomerId, + Name = c.FirstName, + InvoiceID = i.InvoiceId + }; + var list1 = result1.ToList(); + + var result2 = + from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).DefaultIfEmpty() + where i!=null + select + new { + ID = c.CustomerId, + Name = c.FirstName, + InvoiceID = i.InvoiceId + }; + var list2 = result2.ToList(); + + var count = result1.Count(); + Assert.AreEqual(list1.Count, count); + Assert.Greater(list2.Count, count); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0767_QueryByInterfaceException.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0767_QueryByInterfaceException.cs index 0925725921..c3eb465197 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0767_QueryByInterfaceException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0767_QueryByInterfaceException.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.26 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0767_QueryByInterfaceException_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0767_QueryByInterfaceException_Model - { - /*Some specifics of my model: - - * All entities inherit from BusinessEntity (which inherits from Entity). - * BusinessEntity implements IBusinessEntity. - * Key field is defined on IBusinessEntity (of type long). - * [HierarchyRoot(InheritanceSchema.ConcreteTable)] is applied on BusinessEntity. - - I am querying for type IMyInterface, and IMyInterface inherits from IBusinessEntity. - * There are also other interfaces that implement/inherit IMyInterface*/ - - public interface IBusinessEntity : IEntity - { - [Field, Key] - long Id { get; } - } - - public interface IHasName : IBusinessEntity - { - [Field] - string Name { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BusinessEntity : Entity, IBusinessEntity - { - public long Id { get; private set; } - [Field] - public string Tag { get; set; } - } - - public class Foo : BusinessEntity, IHasName - { - [Field] - public int Some { get; set; } - - public string Name { get; set; } - } - - public class Bar : BusinessEntity, IHasName - { - [Field] - public Guid Some { get; set; } - public string Name { get; set; } - } - - - } - - [Serializable] - public class Issue0767_QueryByInterfaceException : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(BusinessEntity).Assembly, typeof(BusinessEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) - { - new Foo() {Name = "foo", Some = 10, Tag = "foo tag"}; - new Bar() {Name = "bar", Some = Guid.NewGuid(), Tag = "bar tag"}; - - var all = session.Query.All().ToList(); - Assert.AreEqual(2, all.Count); - var hasNames = session.Query.All().ToList(); - Assert.AreEqual(2, hasNames.Count); - var foos = session.Query.All().Where(i => i.Name == "foo").ToList(); - Assert.AreEqual(1, foos.Count); - var bars = session.Query.All().Where(i => i.Name == "bar").ToList(); - Assert.AreEqual(1, bars.Count); - - t.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.26 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0767_QueryByInterfaceException_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0767_QueryByInterfaceException_Model + { + /*Some specifics of my model: + + * All entities inherit from BusinessEntity (which inherits from Entity). + * BusinessEntity implements IBusinessEntity. + * Key field is defined on IBusinessEntity (of type long). + * [HierarchyRoot(InheritanceSchema.ConcreteTable)] is applied on BusinessEntity. + + I am querying for type IMyInterface, and IMyInterface inherits from IBusinessEntity. + * There are also other interfaces that implement/inherit IMyInterface*/ + + public interface IBusinessEntity : IEntity + { + [Field, Key] + long Id { get; } + } + + public interface IHasName : IBusinessEntity + { + [Field] + string Name { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BusinessEntity : Entity, IBusinessEntity + { + public long Id { get; private set; } + [Field] + public string Tag { get; set; } + } + + public class Foo : BusinessEntity, IHasName + { + [Field] + public int Some { get; set; } + + public string Name { get; set; } + } + + public class Bar : BusinessEntity, IHasName + { + [Field] + public Guid Some { get; set; } + public string Name { get; set; } + } + + + } + + [Serializable] + public class Issue0767_QueryByInterfaceException : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(BusinessEntity).Assembly, typeof(BusinessEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) + { + new Foo() {Name = "foo", Some = 10, Tag = "foo tag"}; + new Bar() {Name = "bar", Some = Guid.NewGuid(), Tag = "bar tag"}; + + var all = session.Query.All().ToList(); + Assert.AreEqual(2, all.Count); + var hasNames = session.Query.All().ToList(); + Assert.AreEqual(2, hasNames.Count); + var foos = session.Query.All().Where(i => i.Name == "foo").ToList(); + Assert.AreEqual(1, foos.Count); + var bars = session.Query.All().Where(i => i.Name == "bar").ToList(); + Assert.AreEqual(1, bars.Count); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0768_WrongJoinBehavior.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0768_WrongJoinBehavior.cs index 583e94b63b..4415c9f4af 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0768_WrongJoinBehavior.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0768_WrongJoinBehavior.cs @@ -1,139 +1,139 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.26 - -using System; -using System.Diagnostics; -using System.Linq.Expressions; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0768_WrongJoinBehavior_Model; -using Node = Xtensive.Orm.Tests.Issues.Issue0768_WrongJoinBehavior_Model.Node; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0768_WrongJoinBehavior_Model - { - [Serializable] - [HierarchyRoot] - public class Node : Entity - { - public Node(Guid id) - : base(id) - { - } - - [Field, Key] - public Guid Id { get; private set; } - - [Field, Version] - public DateTime Version { get; set; } - - /// - /// Gets or sets Name. - /// - [Field] - public string Name { get; set; } - - [Field(Nullable = false)] - public Reference Ref { get; set; } - - [Field] - public Node Parent { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Reference : Entity - { - public Reference(Guid id) - : base(id) - { - } - - [Field, Key] - public Guid Id { get; private set; } - - [Field, Version] - public DateTime Version { get; set; } - - /// - /// Gets or sets Name. - /// - [Field] - public string Name { get; set; } - } - - } - - [Serializable] - public class Issue0768_WrongJoinBehavior : AutoBuildTest - { - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof(Issue0768_WrongJoinBehavior_Model.Node).Assembly, typeof(Issue0768_WrongJoinBehavior_Model.Node).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var ref1 = new Reference(Guid.NewGuid()) { Name = "q", Version = DateTime.Now }; - var node1 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "w", Ref = ref1, Version = DateTime.Now }; - - var ref2 = new Reference(Guid.NewGuid()) { Name = "p5", Version = DateTime.Now }; - var node2 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "pp", Ref = ref1, Version = DateTime.Now }; - - var ref3 = new Reference(Guid.NewGuid()) { Name = "q2", Version = DateTime.Now }; - var node3 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "w2", Ref = ref1, Version = DateTime.Now, Parent = node2 }; - - t.Complete(); - } - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var list = session.Query.All().Select(node => new { Parent = node.Parent.Ref.Name, node.Name }).ToList(); - Assert.AreEqual(3, list.Count()); - - // Current wrong way - /*Join (Inner, #a.Ref.Id == #b.Id) - Join (LeftOuter, Parent.Id == #a.Id) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#a) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#b) - Index (Index 'PK_Reference.TYPED' @ Reference)*/ - - // Easy way ***** IMPLEMENTED ***** - /*Join (LeftOuter, #a.Ref.Id == #b.Id) - Join (LeftOuter, Parent.Id == #a.Id) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#a) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#b) - Index (Index 'PK_Reference.TYPED' @ Reference)*/ - - // True way - /* Join (LeftOuter, Parent.Id == #a.Id) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#a) - Join (Inner, #a.Ref.Id == #b.Id) - Index (Index 'PK_Node.TYPED' @ Node) - Alias (#b) - Index (Index 'PK_Reference.TYPED' @ Reference) - */ - - - t.Complete(); - } - - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.26 + +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0768_WrongJoinBehavior_Model; +using Node = Xtensive.Orm.Tests.Issues.Issue0768_WrongJoinBehavior_Model.Node; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0768_WrongJoinBehavior_Model + { + [Serializable] + [HierarchyRoot] + public class Node : Entity + { + public Node(Guid id) + : base(id) + { + } + + [Field, Key] + public Guid Id { get; private set; } + + [Field, Version] + public DateTime Version { get; set; } + + /// + /// Gets or sets Name. + /// + [Field] + public string Name { get; set; } + + [Field(Nullable = false)] + public Reference Ref { get; set; } + + [Field] + public Node Parent { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Reference : Entity + { + public Reference(Guid id) + : base(id) + { + } + + [Field, Key] + public Guid Id { get; private set; } + + [Field, Version] + public DateTime Version { get; set; } + + /// + /// Gets or sets Name. + /// + [Field] + public string Name { get; set; } + } + + } + + [Serializable] + public class Issue0768_WrongJoinBehavior : AutoBuildTest + { + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof(Issue0768_WrongJoinBehavior_Model.Node).Assembly, typeof(Issue0768_WrongJoinBehavior_Model.Node).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var ref1 = new Reference(Guid.NewGuid()) { Name = "q", Version = DateTime.Now }; + var node1 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "w", Ref = ref1, Version = DateTime.Now }; + + var ref2 = new Reference(Guid.NewGuid()) { Name = "p5", Version = DateTime.Now }; + var node2 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "pp", Ref = ref1, Version = DateTime.Now }; + + var ref3 = new Reference(Guid.NewGuid()) { Name = "q2", Version = DateTime.Now }; + var node3 = new Issue0768_WrongJoinBehavior_Model.Node(Guid.NewGuid()) { Name = "w2", Ref = ref1, Version = DateTime.Now, Parent = node2 }; + + t.Complete(); + } + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var list = session.Query.All().Select(node => new { Parent = node.Parent.Ref.Name, node.Name }).ToList(); + Assert.AreEqual(3, list.Count()); + + // Current wrong way + /*Join (Inner, #a.Ref.Id == #b.Id) + Join (LeftOuter, Parent.Id == #a.Id) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#a) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#b) + Index (Index 'PK_Reference.TYPED' @ Reference)*/ + + // Easy way ***** IMPLEMENTED ***** + /*Join (LeftOuter, #a.Ref.Id == #b.Id) + Join (LeftOuter, Parent.Id == #a.Id) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#a) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#b) + Index (Index 'PK_Reference.TYPED' @ Reference)*/ + + // True way + /* Join (LeftOuter, Parent.Id == #a.Id) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#a) + Join (Inner, #a.Ref.Id == #b.Id) + Index (Index 'PK_Node.TYPED' @ Node) + Alias (#b) + Index (Index 'PK_Reference.TYPED' @ Reference) + */ + + + t.Complete(); + } + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0771_AbstractTypeRegistration.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0771_AbstractTypeRegistration.cs index 422f5d4191..5daddc630a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0771_AbstractTypeRegistration.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0771_AbstractTypeRegistration.cs @@ -1,92 +1,92 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.26 - -using System; -using System.Diagnostics; -using System.Linq.Expressions; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.Issue0771_AbstractTypeRegistration_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0771_AbstractTypeRegistration_Model - { - [HierarchyRoot] - public abstract class A : Entity - { - [Field,Key] - public int Id { get; private set; } - } - - public abstract class B : A - {} - - public abstract class C : B - {} - - public class D : B - {} - - public class E : C - {} - } - - [Serializable] - public class Issue0771_AbstractTypeRegistration - { - - [Test] -// [ExpectedException(typeof(DomainBuilderException))] - public void AbstractClassPerHierarchyTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof (A)); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var list = session.Query.All().ToList(); - } - } - - [Test] -// [ExpectedException(typeof(DomainBuilderException))] - public void AbstractHierarchyTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(A)); - config.Types.Register(typeof(B)); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var listA = session.Query.All().ToList(); - var listB = session.Query.All().ToList(); - } - } - - [Test] - public void NonAbstractLeafTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(A)); - config.Types.Register(typeof(B)); - config.Types.Register(typeof(C)); - config.Types.Register(typeof(D)); - config.Types.Register(typeof(E)); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var listA = session.Query.All().ToList(); - var listB = session.Query.All().ToList(); - var listC = session.Query.All().ToList(); - var listD = session.Query.All().ToList(); - var listE = session.Query.All().ToList(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.26 + +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.Issue0771_AbstractTypeRegistration_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0771_AbstractTypeRegistration_Model + { + [HierarchyRoot] + public abstract class A : Entity + { + [Field,Key] + public int Id { get; private set; } + } + + public abstract class B : A + {} + + public abstract class C : B + {} + + public class D : B + {} + + public class E : C + {} + } + + [Serializable] + public class Issue0771_AbstractTypeRegistration + { + + [Test] +// [ExpectedException(typeof(DomainBuilderException))] + public void AbstractClassPerHierarchyTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof (A)); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var list = session.Query.All().ToList(); + } + } + + [Test] +// [ExpectedException(typeof(DomainBuilderException))] + public void AbstractHierarchyTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(A)); + config.Types.Register(typeof(B)); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var listA = session.Query.All().ToList(); + var listB = session.Query.All().ToList(); + } + } + + [Test] + public void NonAbstractLeafTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(A)); + config.Types.Register(typeof(B)); + config.Types.Register(typeof(C)); + config.Types.Register(typeof(D)); + config.Types.Register(typeof(E)); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var listA = session.Query.All().ToList(); + var listB = session.Query.All().ToList(); + var listC = session.Query.All().ToList(); + var listD = session.Query.All().ToList(); + var listE = session.Query.All().ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0773_UnableTranslateUnionQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0773_UnableTranslateUnionQuery.cs index 91231a6e85..61b7800f9e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0773_UnableTranslateUnionQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0773_UnableTranslateUnionQuery.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.08.11 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Issues -{ - [Serializable] - public class Issue0773_UnableTranslateUnionQuery : ChinookDOModelTest - { - private class DTO - { - public int InvoiceId { get; set; } - public int TrackId { get; set; } - public decimal Amount { get; set; } - public decimal? Commission; - } - - [Test] - public void MainTest() - { - var query = - from i in Session.Query.All() - join il in Session.Query.All() on i equals il.Invoice - where i.Commission > 0.1m - select new DTO {InvoiceId = i.InvoiceId, Commission = i.Commission, TrackId = il.Track.TrackId, Amount = il.UnitPrice*il.Quantity}; - var list = query.ToList(); - var secondQuery = - from il in Session.Query.All() - select new DTO() {InvoiceId = il.Invoice.InvoiceId, Commission = null, TrackId = il.Track.TrackId, Amount = 1234}; - var secondList = secondQuery.ToList(); - var result = query - .Union(secondQuery) - .OrderByDescending(dto => dto.Amount) - .ThenBy(dto=>dto.InvoiceId); - var resultList = result.ToList(); - - } - /*var innerEx = from b in Session.Query.All() - join p in Session.Query.All() on new { b.FinTool, b.AuthDate } equals - new { p.FinTool, AuthDate = (DateTime?)p.ActualizationDate } - where b.ActualVolume > 0 - select - new AnonymousClass - { - FinTool = b.FinTool, - AuthDate = b.AuthDate, - Fund = b.Fund, - ActualVolume = (decimal?)b.ActualVolume, - VolumeDelta = (decimal?)b.VolumeDelta, - Price = (decimal?)null - }; - var balEx = from b in Session.Query.All() - select - new AnonymousClass - { - FinTool = b.FinTool, - AuthDate = b.AuthDate, - Fund = b.Fund, - ActualVolume = (decimal?)b.ActualVolume, - VolumeDelta = (decimal?)b.VolumeDelta, - Price = (decimal?)null - }; - - var unionPrice = from p in Session.Query.All() - select - new AnonymousClass - { - FinTool = p.FinTool, - AuthDate = (DateTime?)p.ActualizationDate, - Fund = (Fund)null, - ActualVolume = (decimal?)null, - VolumeDelta = (decimal?)null, - Price = (decimal?)p.Price - }; - - var unionRes = balEx.Except(innerEx).Union(unionPrice) - .OrderBy(a => a.FinTool).ThenBy(a => a.AuthDate).ThenBy(a => a.Fund);*/ - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.08.11 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Issues +{ + [Serializable] + public class Issue0773_UnableTranslateUnionQuery : ChinookDOModelTest + { + private class DTO + { + public int InvoiceId { get; set; } + public int TrackId { get; set; } + public decimal Amount { get; set; } + public decimal? Commission; + } + + [Test] + public void MainTest() + { + var query = + from i in Session.Query.All() + join il in Session.Query.All() on i equals il.Invoice + where i.Commission > 0.1m + select new DTO {InvoiceId = i.InvoiceId, Commission = i.Commission, TrackId = il.Track.TrackId, Amount = il.UnitPrice*il.Quantity}; + var list = query.ToList(); + var secondQuery = + from il in Session.Query.All() + select new DTO() {InvoiceId = il.Invoice.InvoiceId, Commission = null, TrackId = il.Track.TrackId, Amount = 1234}; + var secondList = secondQuery.ToList(); + var result = query + .Union(secondQuery) + .OrderByDescending(dto => dto.Amount) + .ThenBy(dto=>dto.InvoiceId); + var resultList = result.ToList(); + + } + /*var innerEx = from b in Session.Query.All() + join p in Session.Query.All() on new { b.FinTool, b.AuthDate } equals + new { p.FinTool, AuthDate = (DateTime?)p.ActualizationDate } + where b.ActualVolume > 0 + select + new AnonymousClass + { + FinTool = b.FinTool, + AuthDate = b.AuthDate, + Fund = b.Fund, + ActualVolume = (decimal?)b.ActualVolume, + VolumeDelta = (decimal?)b.VolumeDelta, + Price = (decimal?)null + }; + var balEx = from b in Session.Query.All() + select + new AnonymousClass + { + FinTool = b.FinTool, + AuthDate = b.AuthDate, + Fund = b.Fund, + ActualVolume = (decimal?)b.ActualVolume, + VolumeDelta = (decimal?)b.VolumeDelta, + Price = (decimal?)null + }; + + var unionPrice = from p in Session.Query.All() + select + new AnonymousClass + { + FinTool = p.FinTool, + AuthDate = (DateTime?)p.ActualizationDate, + Fund = (Fund)null, + ActualVolume = (decimal?)null, + VolumeDelta = (decimal?)null, + Price = (decimal?)p.Price + }; + + var unionRes = balEx.Except(innerEx).Union(unionPrice) + .OrderBy(a => a.FinTool).ThenBy(a => a.AuthDate).ThenBy(a => a.Fund);*/ + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0775_WrongLinqQueryOverComputedFields.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0775_WrongLinqQueryOverComputedFields.cs index 0fdfe64dca..39ae5e5e80 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0775_WrongLinqQueryOverComputedFields.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0775_WrongLinqQueryOverComputedFields.cs @@ -1,178 +1,178 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.08.13 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0775_WrongLinqQueryOverComputedFields_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0775_WrongLinqQueryOverComputedFields_Model - { - [HierarchyRoot] - public class Share : Entity - { - private static readonly Expression> PduRegNumberExpression = e => - e.FinTool == null - ? null - : e.Session.Query.All().FirstOrDefault(f => f.Person == e.FinTool.Person) != null - ? e.Session.Query.All().FirstOrDefault(f => f.Person == e.FinTool.Person).PduRegNumber - : null; - - private static readonly Func PduRegNumberExpressionCompiled = PduRegNumberExpression.Compile(); - - public Share(Guid id) - : base(id) - {} - - [Field] - [Key] - public Guid Id { get; private set; } - - [Field(Nullable = false)] - public Fund FinTool { get; set; } - - public string PduRegNumber - { - get { return PduRegNumberExpressionCompiled(this); } - } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Share), "PduRegNumber", TargetKind.PropertyGet)] - public static Expression SharePduRegNumber(Expression assignmentExpression) - { - return PduRegNumberExpression.BindParameters(assignmentExpression); - } - } - - #endregion - } - - [HierarchyRoot] - public class Person : Entity - { - public Person(Guid id) - : base(id) - { - } - - [Field] - [Key] - public Guid Id { get; private set; } - - [Field] - public int IntId { get; set; } - } - - [HierarchyRoot] - public class Fund : Entity - { - public Fund(Guid id) - : base(id) - { - } - - [Field] - [Key] - public Guid Id { get; private set; } - - [Field] - public int IntId { get; set; } - - [Field(Nullable = false)] - public Person Person { get; set; } - - [Field(Length = 50, Nullable = true)] - public string PduRegNumber { get; set; } - } - } - - [Serializable] - public class Issue0775_WrongLinqQueryOverComputedFields : AutoBuildTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIsNot(StorageProvider.Oracle); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Fund).Assembly, typeof (Fund).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var query = session.Query.All().Select(s => new {s.Id, s.FinTool, s.PduRegNumber}); - var list = query.ToList(); - - } - } - /*SELECT [a].[Id] , - [a].[FinTool_Id] , - [a].[EmissionVolume] , - [a].[Version] , - [b].[#a.Name] , - [c].[#b.Id] , - [d].[#c.PduRegNumber] - FROM ( SELECT TOP 41 - [e].[Id] , - 191 AS [TypeId] , - [e].[FinTool_Id] , - [e].[EmissionVolume] , - [e].[Version] , - ROW_NUMBER() OVER ( ORDER BY [e].[Id] ASC ) AS [RowNumber0] - FROM [dbo].[Share] [e] - WHERE ( [e].[Version] < CAST('2010-07-15 00:00:00.000' AS DATETIME2) ) - ORDER BY [e].[Id] ASC - ) [a] - INNER JOIN ( SELECT [f].[Id] AS [#a.Id] , - 146 AS [#a.TypeId] , - [f].[IntId] AS [#a.IntId] , - [f].[Emitter_Id] AS [#a.Emitter_Id] , - [f].[FinToolGroup_Id] AS [#a.FinToolGroup_Id] , - [f].[FinToolType_Id] AS [#a.FinToolType_Id] , - [f].[Name] AS [#a.Name] , - [f].[FullName] AS [#a.FullName] , - [f].[Currency_Id] AS [#a.Currency_Id] , - [f].[Nominal] AS [#a.Nominal] , - [f].[Version] AS [#a.Version] - FROM [dbo].[FinTool] [f] - ) [b] ON ( [a].[FinTool_Id] = [b].[#a.Id] ) - OUTER APPLY ( SELECT TOP 1 - [g].[Id] AS [#b.Id] - FROM [dbo].[Fund] [g] - WHERE ( [g].[Person_Id] = [b].[#a.IntId] ) - ORDER BY [g].[Id] ASC - ) [c] - OUTER APPLY ( SELECT TOP 1 - [h].[Id] AS [#c.Id] , - [h].[PduRegNumber] AS [#c.PduRegNumber] - FROM [dbo].[Fund] [h] - WHERE ( [h].[Person_Id] = [b].[#a.IntId] ) - ORDER BY [h].[Id] ASC - ) [d] - WHERE ( [a].[RowNumber0] > 0 ) - ORDER BY [a].[Id] ASC , - [b].[#a.Id] ASC , - [c].[#b.Id] ASC , - [d].[#c.Id] ASC ;*/ - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.08.13 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0775_WrongLinqQueryOverComputedFields_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0775_WrongLinqQueryOverComputedFields_Model + { + [HierarchyRoot] + public class Share : Entity + { + private static readonly Expression> PduRegNumberExpression = e => + e.FinTool == null + ? null + : e.Session.Query.All().FirstOrDefault(f => f.Person == e.FinTool.Person) != null + ? e.Session.Query.All().FirstOrDefault(f => f.Person == e.FinTool.Person).PduRegNumber + : null; + + private static readonly Func PduRegNumberExpressionCompiled = PduRegNumberExpression.Compile(); + + public Share(Guid id) + : base(id) + {} + + [Field] + [Key] + public Guid Id { get; private set; } + + [Field(Nullable = false)] + public Fund FinTool { get; set; } + + public string PduRegNumber + { + get { return PduRegNumberExpressionCompiled(this); } + } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Share), "PduRegNumber", TargetKind.PropertyGet)] + public static Expression SharePduRegNumber(Expression assignmentExpression) + { + return PduRegNumberExpression.BindParameters(assignmentExpression); + } + } + + #endregion + } + + [HierarchyRoot] + public class Person : Entity + { + public Person(Guid id) + : base(id) + { + } + + [Field] + [Key] + public Guid Id { get; private set; } + + [Field] + public int IntId { get; set; } + } + + [HierarchyRoot] + public class Fund : Entity + { + public Fund(Guid id) + : base(id) + { + } + + [Field] + [Key] + public Guid Id { get; private set; } + + [Field] + public int IntId { get; set; } + + [Field(Nullable = false)] + public Person Person { get; set; } + + [Field(Length = 50, Nullable = true)] + public string PduRegNumber { get; set; } + } + } + + [Serializable] + public class Issue0775_WrongLinqQueryOverComputedFields : AutoBuildTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIsNot(StorageProvider.Oracle); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Fund).Assembly, typeof (Fund).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var query = session.Query.All().Select(s => new {s.Id, s.FinTool, s.PduRegNumber}); + var list = query.ToList(); + + } + } + /*SELECT [a].[Id] , + [a].[FinTool_Id] , + [a].[EmissionVolume] , + [a].[Version] , + [b].[#a.Name] , + [c].[#b.Id] , + [d].[#c.PduRegNumber] + FROM ( SELECT TOP 41 + [e].[Id] , + 191 AS [TypeId] , + [e].[FinTool_Id] , + [e].[EmissionVolume] , + [e].[Version] , + ROW_NUMBER() OVER ( ORDER BY [e].[Id] ASC ) AS [RowNumber0] + FROM [dbo].[Share] [e] + WHERE ( [e].[Version] < CAST('2010-07-15 00:00:00.000' AS DATETIME2) ) + ORDER BY [e].[Id] ASC + ) [a] + INNER JOIN ( SELECT [f].[Id] AS [#a.Id] , + 146 AS [#a.TypeId] , + [f].[IntId] AS [#a.IntId] , + [f].[Emitter_Id] AS [#a.Emitter_Id] , + [f].[FinToolGroup_Id] AS [#a.FinToolGroup_Id] , + [f].[FinToolType_Id] AS [#a.FinToolType_Id] , + [f].[Name] AS [#a.Name] , + [f].[FullName] AS [#a.FullName] , + [f].[Currency_Id] AS [#a.Currency_Id] , + [f].[Nominal] AS [#a.Nominal] , + [f].[Version] AS [#a.Version] + FROM [dbo].[FinTool] [f] + ) [b] ON ( [a].[FinTool_Id] = [b].[#a.Id] ) + OUTER APPLY ( SELECT TOP 1 + [g].[Id] AS [#b.Id] + FROM [dbo].[Fund] [g] + WHERE ( [g].[Person_Id] = [b].[#a.IntId] ) + ORDER BY [g].[Id] ASC + ) [c] + OUTER APPLY ( SELECT TOP 1 + [h].[Id] AS [#c.Id] , + [h].[PduRegNumber] AS [#c.PduRegNumber] + FROM [dbo].[Fund] [h] + WHERE ( [h].[Person_Id] = [b].[#a.IntId] ) + ORDER BY [h].[Id] ASC + ) [d] + WHERE ( [a].[RowNumber0] > 0 ) + ORDER BY [a].[Id] ASC , + [b].[#a.Id] ASC , + [c].[#b.Id] ASC , + [d].[#c.Id] ASC ;*/ + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0776_OrderingCorrectorOfAggregateProvider.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0776_OrderingCorrectorOfAggregateProvider.cs index 451ebea9d8..29cd0c528b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0776_OrderingCorrectorOfAggregateProvider.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0776_OrderingCorrectorOfAggregateProvider.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.08.13 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0776_OrderingCorrectorOfAggregateProvider_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0776_OrderingCorrectorOfAggregateProvider_Model - { - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - [HierarchyRoot] - public class Another : Entity - { - private static readonly Expression> MyEntTextExpression = - e => e.MyEnt == null ? null : e.MyEnt.Text; - - private static readonly Func MyEntTextExpressionCompiled = MyEntTextExpression.Compile(); - - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - public MyEntity MyEnt { get; set; } - - public string MyEntText - { - get { return MyEntTextExpressionCompiled(this); } - } - - #region Nested type: CustomLinqCompilerContainer - - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Another), "MyEntText", TargetKind.PropertyGet)] - public static Expression MyEntText(Expression assignmentExpression) - { - return MyEntTextExpression.BindParameters(assignmentExpression); - } - } - - #endregion - } - } - - [Serializable] - public class Issue0776_OrderingCorrectorOfAggregateProvider : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (TransactionScope transactionScope = session.OpenTransaction()) - { - // Creating new persistent object - var helloWorld = new MyEntity - { - Text = "Hello World!" - }; - // Committing transaction - - var hw2 = new Another {Text = "ololo", MyEnt = helloWorld}; - - transactionScope.Complete(); - } - - // Reading all persisted objects from another Session - using (var session = Domain.OpenSession()) - using (TransactionScope transactionScope = session.OpenTransaction()) - { - foreach (MyEntity myEntity in session.Query.All()) - Console.WriteLine(myEntity.Text); - - - var query = session.Query.All().Where(a => a.MyEntText.Contains("e")).Select(a => new {a.Id, a.MyEntText}); - foreach (var item in query) - // OK - Console.WriteLine(item); - - - var aggregateQuery = from q in query - select new {Item = q, FakeKey = 0} - into i - group i by i.FakeKey; - var aggregate = aggregateQuery.Select(a => new {Count = a.Count()}); - - foreach (var item in aggregate) - // OK - Console.WriteLine(item); - - // Exception! - var nowCount = aggregate.FirstOrDefault(); - - var futureCount = session.Query.ExecuteDelayed(_ => aggregate.FirstOrDefault()); - - transactionScope.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.08.13 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0776_OrderingCorrectorOfAggregateProvider_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0776_OrderingCorrectorOfAggregateProvider_Model + { + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + [HierarchyRoot] + public class Another : Entity + { + private static readonly Expression> MyEntTextExpression = + e => e.MyEnt == null ? null : e.MyEnt.Text; + + private static readonly Func MyEntTextExpressionCompiled = MyEntTextExpression.Compile(); + + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + public MyEntity MyEnt { get; set; } + + public string MyEntText + { + get { return MyEntTextExpressionCompiled(this); } + } + + #region Nested type: CustomLinqCompilerContainer + + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Another), "MyEntText", TargetKind.PropertyGet)] + public static Expression MyEntText(Expression assignmentExpression) + { + return MyEntTextExpression.BindParameters(assignmentExpression); + } + } + + #endregion + } + } + + [Serializable] + public class Issue0776_OrderingCorrectorOfAggregateProvider : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (TransactionScope transactionScope = session.OpenTransaction()) + { + // Creating new persistent object + var helloWorld = new MyEntity + { + Text = "Hello World!" + }; + // Committing transaction + + var hw2 = new Another {Text = "ololo", MyEnt = helloWorld}; + + transactionScope.Complete(); + } + + // Reading all persisted objects from another Session + using (var session = Domain.OpenSession()) + using (TransactionScope transactionScope = session.OpenTransaction()) + { + foreach (MyEntity myEntity in session.Query.All()) + Console.WriteLine(myEntity.Text); + + + var query = session.Query.All().Where(a => a.MyEntText.Contains("e")).Select(a => new {a.Id, a.MyEntText}); + foreach (var item in query) + // OK + Console.WriteLine(item); + + + var aggregateQuery = from q in query + select new {Item = q, FakeKey = 0} + into i + group i by i.FakeKey; + var aggregate = aggregateQuery.Select(a => new {Count = a.Count()}); + + foreach (var item in aggregate) + // OK + Console.WriteLine(item); + + // Exception! + var nowCount = aggregate.FirstOrDefault(); + + var futureCount = session.Query.ExecuteDelayed(_ => aggregate.FirstOrDefault()); + + transactionScope.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0777_WrongLinqQueryConditional.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0777_WrongLinqQueryConditional.cs index 59ac4161eb..e79d28c3bf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0777_WrongLinqQueryConditional.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0777_WrongLinqQueryConditional.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.08.13 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0777_WrongLinqQueryConditional_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0777_WrongLinqQueryConditional_Model - { - [HierarchyRoot] - public class BooleanHell : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public DateTime ApocalypseDate { get; set; } - - [Field] - public DateTime DefaultApocalypseDate { get; set; } - } - } - - [Serializable] - public class Issue0777_WrongLinqQueryConditional : AutoBuildTest - { - DateTime? apocalypseNow = DateTime.Now; - DateTime? apocalypseNever = null; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (BooleanHell)); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new BooleanHell { ApocalypseDate = new DateTime(2012, 12, 12), DefaultApocalypseDate = new DateTime(2012, 12, 12)}; - session.SaveChanges(); - - var firstHell = session.Query.All() - .Where(hell => hell.ApocalypseDate >= (apocalypseNow.HasValue ? apocalypseNow.Value : hell.DefaultApocalypseDate)) - .ToList(); - var defaultHell = session.Query.All() - .Where(hell => hell.ApocalypseDate >= (apocalypseNever.HasValue ? apocalypseNever.Value : hell.DefaultApocalypseDate)) - .ToList(); - - t.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.08.13 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0777_WrongLinqQueryConditional_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0777_WrongLinqQueryConditional_Model + { + [HierarchyRoot] + public class BooleanHell : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public DateTime ApocalypseDate { get; set; } + + [Field] + public DateTime DefaultApocalypseDate { get; set; } + } + } + + [Serializable] + public class Issue0777_WrongLinqQueryConditional : AutoBuildTest + { + DateTime? apocalypseNow = DateTime.Now; + DateTime? apocalypseNever = null; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (BooleanHell)); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new BooleanHell { ApocalypseDate = new DateTime(2012, 12, 12), DefaultApocalypseDate = new DateTime(2012, 12, 12)}; + session.SaveChanges(); + + var firstHell = session.Query.All() + .Where(hell => hell.ApocalypseDate >= (apocalypseNow.HasValue ? apocalypseNow.Value : hell.DefaultApocalypseDate)) + .ToList(); + var defaultHell = session.Query.All() + .Where(hell => hell.ApocalypseDate >= (apocalypseNever.HasValue ? apocalypseNever.Value : hell.DefaultApocalypseDate)) + .ToList(); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0785_GenericStructureBugs.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0785_GenericStructureBugs.cs index 682a4d2d53..3edfa8be3e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0785_GenericStructureBugs.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0785_GenericStructureBugs.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.24 - -using System; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0785.Model; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.Issue0785.Model -{ - [Serializable] - [HierarchyRoot] - public class Book : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - public RefHolder BookRef { get; set; } - - public override string ToString() - { - return Title; - } - } - - [HierarchyRoot] - public abstract class ItemInfo : Entity where T: Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public RefHolder Reference { get; set; } - } - - public class BookInfo : ItemInfo - { - - } - - [Serializable] - public class RefHolder : Structure - { - [Field] - public T Ref { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0785_GenericStructureBugs : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Book).Assembly, typeof(Book).Namespace); - return configuration; - } - - [Test] - public void StandardTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var book = new Book() { Title = "Book" }; - var bookRef = new RefHolder(); - bookRef.Ref = book; - book.BookRef = bookRef; - Assert.AreEqual(book, book.BookRef.Ref); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.24 + +using System; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0785.Model; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.Issue0785.Model +{ + [Serializable] + [HierarchyRoot] + public class Book : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + public RefHolder BookRef { get; set; } + + public override string ToString() + { + return Title; + } + } + + [HierarchyRoot] + public abstract class ItemInfo : Entity where T: Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public RefHolder Reference { get; set; } + } + + public class BookInfo : ItemInfo + { + + } + + [Serializable] + public class RefHolder : Structure + { + [Field] + public T Ref { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0785_GenericStructureBugs : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Book).Assembly, typeof(Book).Namespace); + return configuration; + } + + [Test] + public void StandardTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var book = new Book() { Title = "Book" }; + var bookRef = new RefHolder(); + bookRef.Ref = book; + book.BookRef = bookRef; + Assert.AreEqual(book, book.BookRef.Ref); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0788_EntityIsDetached.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0788_EntityIsDetached.cs index 9cdacbda21..8e3c492dcb 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0788_EntityIsDetached.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0788_EntityIsDetached.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.08.27 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0788_EntityIsDetached_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0788_EntityIsDetached_Model -{ - internal class Event : SyncObject - { - public Event(string token, Guid requestorId, bool signalled) - : base(token, requestorId, signalled) - {} - } - - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot /*(InheritanceSchema = InheritanceSchema.SingleTable)*/] - internal abstract class SyncObject : Entity - { - [Field(Length = 128)] - [Key] - public string Token { get; private set; } - - [Field] - public Lock LockObject { get; private set; } - - public bool Signalled - { - get { return (null==LockObject); } - } - - protected SyncObject(string token, Guid requestorId, bool signalled) - : base(token) - { - if (!signalled) { - // - //LockObject = new Lock(token, requestorId, this); - } - } - } - - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - internal class Lock : Entity - { - [Field(Length = 128)] - [Key] - public string Token { get; private set; } - - [Field(Nullable = false)] - public Guid RequestorId { get; private set; } - - [Field] - public DateTime TimeStamp { get; private set; } - - [Field] - //[Association( - // PairTo = "LockObject"//, // linked to LockObject property of SyncObject - //OnOwnerRemove = OnRemoveAction.Deny, // can't remove SyncObject while its LockObject exists - //OnTargetRemove = OnRemoveAction.Clear // upon Lock's removal, clear corresponding LockObject property of SyncObject - // ) - //] - public SyncObject OwnerObject { get; set; } - - /// - /// Constructs independent Lock object - /// - /// Token - /// Requestor Id - public Lock(string token, Guid requestorId) - : base(token) - { - RequestorId = requestorId; - TimeStamp = DateTime.Now; - } - - /// - /// Constructs Lock object as part of owning - /// - /// Token - /// Requestor Id - /// Owning - public Lock(string token, Guid requestorId, SyncObject owner) - : base(token) - { - //using(Session.Pin(this)) - //{ - RequestorId = requestorId; - TimeStamp = DateTime.Now; - - OwnerObject = owner; - //} - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0788_EntityIsDetached : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Lock).Assembly, typeof (Lock).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - Guid key = new Guid("{0AF02FA4-F6C6-4A78-A569-9E5225281E27}"); - Event evt = null; - Lock evtLock; - - using (var transactionScope = session.OpenTransaction()) { - evt = new Event("dep", key, false); - evtLock = new Lock("dep", key, null); - evtLock.OwnerObject = evt; - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.08.27 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0788_EntityIsDetached_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0788_EntityIsDetached_Model +{ + internal class Event : SyncObject + { + public Event(string token, Guid requestorId, bool signalled) + : base(token, requestorId, signalled) + {} + } + + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot /*(InheritanceSchema = InheritanceSchema.SingleTable)*/] + internal abstract class SyncObject : Entity + { + [Field(Length = 128)] + [Key] + public string Token { get; private set; } + + [Field] + public Lock LockObject { get; private set; } + + public bool Signalled + { + get { return (null==LockObject); } + } + + protected SyncObject(string token, Guid requestorId, bool signalled) + : base(token) + { + if (!signalled) { + // + //LockObject = new Lock(token, requestorId, this); + } + } + } + + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + internal class Lock : Entity + { + [Field(Length = 128)] + [Key] + public string Token { get; private set; } + + [Field(Nullable = false)] + public Guid RequestorId { get; private set; } + + [Field] + public DateTime TimeStamp { get; private set; } + + [Field] + //[Association( + // PairTo = "LockObject"//, // linked to LockObject property of SyncObject + //OnOwnerRemove = OnRemoveAction.Deny, // can't remove SyncObject while its LockObject exists + //OnTargetRemove = OnRemoveAction.Clear // upon Lock's removal, clear corresponding LockObject property of SyncObject + // ) + //] + public SyncObject OwnerObject { get; set; } + + /// + /// Constructs independent Lock object + /// + /// Token + /// Requestor Id + public Lock(string token, Guid requestorId) + : base(token) + { + RequestorId = requestorId; + TimeStamp = DateTime.Now; + } + + /// + /// Constructs Lock object as part of owning + /// + /// Token + /// Requestor Id + /// Owning + public Lock(string token, Guid requestorId, SyncObject owner) + : base(token) + { + //using(Session.Pin(this)) + //{ + RequestorId = requestorId; + TimeStamp = DateTime.Now; + + OwnerObject = owner; + //} + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0788_EntityIsDetached : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Lock).Assembly, typeof (Lock).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + Guid key = new Guid("{0AF02FA4-F6C6-4A78-A569-9E5225281E27}"); + Event evt = null; + Lock evtLock; + + using (var transactionScope = session.OpenTransaction()) { + evt = new Event("dep", key, false); + evtLock = new Lock("dep", key, null); + evtLock.OwnerObject = evt; + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0792_OrderByWithDistinct.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0792_OrderByWithDistinct.cs index 70156ef0ce..a0248667ed 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0792_OrderByWithDistinct.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0792_OrderByWithDistinct.cs @@ -1,47 +1,47 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -using Xtensive.Orm.Tests.Issues_Issue0792_OrderByWithDistinct; - -namespace Xtensive.Orm.Tests.Issues_Issue0792_OrderByWithDistinct -{ - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - class Issue0792_OrderByWithDistinct: AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person3 = new Person {Name = "Person3"}; - var person2 = new Person {Name = "Person2"}; - var person1 = new Person {Name = "Person1"}; - session.SaveChanges(); - var query = session.Query.All().OrderBy(p => p.Name).Distinct().ToList(); - Assert.IsTrue(query.SequenceEqual(new []{person1, person2, person3})); - // Rollback - } - } - } - } -} +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +using Xtensive.Orm.Tests.Issues_Issue0792_OrderByWithDistinct; + +namespace Xtensive.Orm.Tests.Issues_Issue0792_OrderByWithDistinct +{ + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + class Issue0792_OrderByWithDistinct: AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person3 = new Person {Name = "Person3"}; + var person2 = new Person {Name = "Person2"}; + var person1 = new Person {Name = "Person1"}; + session.SaveChanges(); + var query = session.Query.All().OrderBy(p => p.Name).Distinct().ToList(); + Assert.IsTrue(query.SequenceEqual(new []{person1, person2, person3})); + // Rollback + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0800_OrderByEnum.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0800_OrderByEnum.cs index ee7a136708..1f5106e558 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0800_OrderByEnum.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0800_OrderByEnum.cs @@ -1,56 +1,56 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0800_OrderByEnum; - -namespace Xtensive.Orm.Tests.Issues_Issue0800_OrderByEnum -{ - public enum Status - { - Married, - Single - } - - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int? IntField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0800_OrderByEnum: AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person1 = new Person(){IntField = 1}; - var person2 = new Person(){IntField = 2}; - var personNull = new Person(){IntField = null}; - var query = from person in session.Query.All() - select new {Status = person.IntField == null ? Status.Married : Status.Single}; - var result = query.ToList(); - Assert.AreEqual(3, result.Count); - // Rollback - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0800_OrderByEnum; + +namespace Xtensive.Orm.Tests.Issues_Issue0800_OrderByEnum +{ + public enum Status + { + Married, + Single + } + + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int? IntField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0800_OrderByEnum: AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person1 = new Person(){IntField = 1}; + var person2 = new Person(){IntField = 2}; + var personNull = new Person(){IntField = null}; + var query = from person in session.Query.All() + select new {Status = person.IntField == null ? Status.Married : Status.Single}; + var result = query.ToList(); + Assert.AreEqual(3, result.Count); + // Rollback + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0806_ColumnNamingError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0806_ColumnNamingError.cs index 6409524901..00638b1ab1 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0806_ColumnNamingError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0806_ColumnNamingError.cs @@ -1,182 +1,182 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues_Issue0806_ColumnNamingError; - -namespace Xtensive.Orm.Tests.Issues_Issue0806_ColumnNamingError -{ - [HierarchyRoot] - public class Kalina2RngGasObjectMatchGuess : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public int KalinaPipeAbonentID { get; set; } - - [Field] - public int RngGasObjectID { get; set; } - - [Field] - public int? Rank { get; set; } - } - - [HierarchyRoot] - public class PipeAbonent : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class GasObject : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class PipeAbonentOwnershipInfo : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public DateTime? BeginDate { get; set; } - - [Field] - public DateTime? EndDate { get; set; } - - [Field] - public PipeAbonent Abonent { get; set; } - - [Field] - public string Patronymic { get; set; } - - [Field] - public string Surname { get; set; } - } - - [HierarchyRoot] - public class UnifiedGasObject : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public PipeAbonent KalinaGasObject { get; set; } - - [Field] - public GasObject RngGasObject { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - - public enum MatchStatus - { - NotConfirmed, - Confirmed - } - - public class Kalina2RngGasObjectMatchListItem - { - public int LeftID { get; set; } - - public string LeftName { get; set; } - - public object LeftPatronymic { get; set; } - - public object LeftSurname { get; set; } - - public MatchStatus Status { get; set; } - - public PipeAbonent Right { get; set; } - } - - [TestFixture] - public class Issue0806_ColumnNamingError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Kalina2RngGasObjectMatchGuess).Assembly, typeof (Kalina2RngGasObjectMatchGuess).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var today = DateTime.Now; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = - from kalinaGasObject in session.Query.All() - let matchGuess = session.Query.All().Where(g => g.KalinaPipeAbonentID==kalinaGasObject.Id).FirstOrDefault() - let matchGuessObject = session.Query.All().Where(go => go.Id==matchGuess.RngGasObjectID).FirstOrDefault() - let owner = session.Query.All().Where( - ao => - ao.Abonent==kalinaGasObject && - (ao.BeginDate==null || ao.BeginDate <= today) && - (ao.EndDate==null || ao.EndDate >= today)).FirstOrDefault() - let unifiedGasObject = session.Query.All().Where( - ua => ua.KalinaGasObject==kalinaGasObject && ua.RngGasObject!=null).FirstOrDefault() - orderby matchGuess.Rank ?? 0 descending - select new Kalina2RngGasObjectMatchListItem { - LeftID = kalinaGasObject.Id, - LeftName = owner.Name ?? kalinaGasObject.Name, - LeftPatronymic = owner.Patronymic, - LeftSurname = owner.Surname, - Status = unifiedGasObject==null ? MatchStatus.NotConfirmed : MatchStatus.Confirmed, - Right = unifiedGasObject==null - ? GetMatch(matchGuessObject) - : GetMatch(unifiedGasObject.RngGasObject) - }; - - var result = query.Count(); - } - } - } - - [Test] - public void SimplifiedTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var today = DateTime.Now; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = - from kalinaGasObject in session.Query.All() - let matchGuess = session.Query.All().FirstOrDefault() - let owner = session.Query.All().FirstOrDefault() - orderby matchGuess.Rank ?? 0 descending - select matchGuess; - - var result = query.ToList(); - } - } - } - - private PipeAbonent GetMatch(GasObject rngGasObject) - { - return null; - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues_Issue0806_ColumnNamingError; + +namespace Xtensive.Orm.Tests.Issues_Issue0806_ColumnNamingError +{ + [HierarchyRoot] + public class Kalina2RngGasObjectMatchGuess : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public int KalinaPipeAbonentID { get; set; } + + [Field] + public int RngGasObjectID { get; set; } + + [Field] + public int? Rank { get; set; } + } + + [HierarchyRoot] + public class PipeAbonent : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class GasObject : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class PipeAbonentOwnershipInfo : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public DateTime? BeginDate { get; set; } + + [Field] + public DateTime? EndDate { get; set; } + + [Field] + public PipeAbonent Abonent { get; set; } + + [Field] + public string Patronymic { get; set; } + + [Field] + public string Surname { get; set; } + } + + [HierarchyRoot] + public class UnifiedGasObject : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public PipeAbonent KalinaGasObject { get; set; } + + [Field] + public GasObject RngGasObject { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + + public enum MatchStatus + { + NotConfirmed, + Confirmed + } + + public class Kalina2RngGasObjectMatchListItem + { + public int LeftID { get; set; } + + public string LeftName { get; set; } + + public object LeftPatronymic { get; set; } + + public object LeftSurname { get; set; } + + public MatchStatus Status { get; set; } + + public PipeAbonent Right { get; set; } + } + + [TestFixture] + public class Issue0806_ColumnNamingError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Kalina2RngGasObjectMatchGuess).Assembly, typeof (Kalina2RngGasObjectMatchGuess).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var today = DateTime.Now; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = + from kalinaGasObject in session.Query.All() + let matchGuess = session.Query.All().Where(g => g.KalinaPipeAbonentID==kalinaGasObject.Id).FirstOrDefault() + let matchGuessObject = session.Query.All().Where(go => go.Id==matchGuess.RngGasObjectID).FirstOrDefault() + let owner = session.Query.All().Where( + ao => + ao.Abonent==kalinaGasObject && + (ao.BeginDate==null || ao.BeginDate <= today) && + (ao.EndDate==null || ao.EndDate >= today)).FirstOrDefault() + let unifiedGasObject = session.Query.All().Where( + ua => ua.KalinaGasObject==kalinaGasObject && ua.RngGasObject!=null).FirstOrDefault() + orderby matchGuess.Rank ?? 0 descending + select new Kalina2RngGasObjectMatchListItem { + LeftID = kalinaGasObject.Id, + LeftName = owner.Name ?? kalinaGasObject.Name, + LeftPatronymic = owner.Patronymic, + LeftSurname = owner.Surname, + Status = unifiedGasObject==null ? MatchStatus.NotConfirmed : MatchStatus.Confirmed, + Right = unifiedGasObject==null + ? GetMatch(matchGuessObject) + : GetMatch(unifiedGasObject.RngGasObject) + }; + + var result = query.Count(); + } + } + } + + [Test] + public void SimplifiedTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var today = DateTime.Now; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = + from kalinaGasObject in session.Query.All() + let matchGuess = session.Query.All().FirstOrDefault() + let owner = session.Query.All().FirstOrDefault() + orderby matchGuess.Rank ?? 0 descending + select matchGuess; + + var result = query.ToList(); + } + } + } + + private PipeAbonent GetMatch(GasObject rngGasObject) + { + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0808_StructSerialization.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0808_StructSerialization.cs index f481e86d74..c75173846e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0808_StructSerialization.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0808_StructSerialization.cs @@ -1,68 +1,68 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Linq.Expressions; -using System.Runtime.Serialization; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq.SerializableExpressions; - -namespace Xtensive.Orm.Tests.Issues -{ - public struct UnifiedCustomerID - { - public int Id; - } - - [TestFixture] - public class Issue0808_StructSerialization - { - public IEnumerable SerializableExpressionTypes - { - get - { - yield return typeof (SerializableBinaryExpression); - yield return typeof (SerializableConditionalExpression); - yield return typeof (SerializableConstantExpression); - yield return typeof (SerializableElementInit); - yield return typeof (SerializableExpression); - yield return typeof (SerializableInvocationExpression); - yield return typeof (SerializableLambdaExpression); - yield return typeof (SerializableListInitExpression); - yield return typeof (SerializableMemberAssignment); - yield return typeof (SerializableMemberBinding); - yield return typeof (SerializableMemberExpression); - yield return typeof (SerializableMemberInitExpression); - yield return typeof (SerializableMemberListBinding); - yield return typeof (SerializableMemberMemberBinding); - yield return typeof (SerializableMethodCallExpression); - yield return typeof (SerializableNewArrayExpression); - yield return typeof (SerializableNewExpression); - yield return typeof (SerializableParameterExpression); - yield return typeof (SerializableTypeBinaryExpression); - yield return typeof (SerializableUnaryExpression); - } - } - - [Test] - public void MainTest() - { - var t = typeof(UnifiedCustomerID); - Expression> ex = a => new UnifiedCustomerID { Id = 2 }; - var serializableExpression = ex.ToSerializableExpression(); - var memoryStream = new MemoryStream(); - - var serializer = new DataContractSerializer(typeof (SerializableLambdaExpression), - SerializableExpressionTypes.Except(Enumerable.Repeat(typeof (SerializableLambdaExpression), 1))); - - serializer.WriteObject(memoryStream, serializableExpression); - - memoryStream.Position = 0; - - var deserializedExpression = (SerializableLambdaExpression) serializer.ReadObject(memoryStream); - - var ex2 = deserializedExpression.ToExpression(); - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Linq.Expressions; +using System.Runtime.Serialization; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq.SerializableExpressions; + +namespace Xtensive.Orm.Tests.Issues +{ + public struct UnifiedCustomerID + { + public int Id; + } + + [TestFixture] + public class Issue0808_StructSerialization + { + public IEnumerable SerializableExpressionTypes + { + get + { + yield return typeof (SerializableBinaryExpression); + yield return typeof (SerializableConditionalExpression); + yield return typeof (SerializableConstantExpression); + yield return typeof (SerializableElementInit); + yield return typeof (SerializableExpression); + yield return typeof (SerializableInvocationExpression); + yield return typeof (SerializableLambdaExpression); + yield return typeof (SerializableListInitExpression); + yield return typeof (SerializableMemberAssignment); + yield return typeof (SerializableMemberBinding); + yield return typeof (SerializableMemberExpression); + yield return typeof (SerializableMemberInitExpression); + yield return typeof (SerializableMemberListBinding); + yield return typeof (SerializableMemberMemberBinding); + yield return typeof (SerializableMethodCallExpression); + yield return typeof (SerializableNewArrayExpression); + yield return typeof (SerializableNewExpression); + yield return typeof (SerializableParameterExpression); + yield return typeof (SerializableTypeBinaryExpression); + yield return typeof (SerializableUnaryExpression); + } + } + + [Test] + public void MainTest() + { + var t = typeof(UnifiedCustomerID); + Expression> ex = a => new UnifiedCustomerID { Id = 2 }; + var serializableExpression = ex.ToSerializableExpression(); + var memoryStream = new MemoryStream(); + + var serializer = new DataContractSerializer(typeof (SerializableLambdaExpression), + SerializableExpressionTypes.Except(Enumerable.Repeat(typeof (SerializableLambdaExpression), 1))); + + serializer.WriteObject(memoryStream, serializableExpression); + + memoryStream.Position = 0; + + var deserializedExpression = (SerializableLambdaExpression) serializer.ReadObject(memoryStream); + + var ex2 = deserializedExpression.ToExpression(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0813_AuxilaryTableMappingNameBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0813_AuxilaryTableMappingNameBug.cs index 6d15404e73..7bd5c42bca 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0813_AuxilaryTableMappingNameBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0813_AuxilaryTableMappingNameBug.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.10.27 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0813_AuxilaryTableMappingNameBug_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0813_AuxilaryTableMappingNameBug_Model -{ - [HierarchyRoot] - [TableMapping("P")] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - [FieldMapping("F")] - public EntitySet Friends { get; private set; } - } - - [HierarchyRoot] - public class PersonGroup : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Persons { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0813_AuxilaryTableMappingNameBug : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - - var person = new Person(); - var typeInfo = person.TypeInfo; - var fieldInfo = typeInfo.Fields["Friends"]; - var associationInfo = fieldInfo.Associations[0]; - var auxiliaryType = associationInfo.AuxiliaryType; - Assert.AreEqual("Person-Friends-Person", auxiliaryType.Name); - Assert.AreEqual("P-F-P", auxiliaryType.MappingName); - - var personGroup = new PersonGroup(); - typeInfo = personGroup.TypeInfo; - fieldInfo = typeInfo.Fields["Persons"]; - associationInfo = fieldInfo.Associations[0]; - auxiliaryType = associationInfo.AuxiliaryType; - Assert.AreEqual("PersonGroup-Persons-Person", auxiliaryType.Name); - Assert.AreEqual("PersonGroup-Persons-P", auxiliaryType.MappingName); - - ts.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.10.27 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0813_AuxilaryTableMappingNameBug_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0813_AuxilaryTableMappingNameBug_Model +{ + [HierarchyRoot] + [TableMapping("P")] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + [FieldMapping("F")] + public EntitySet Friends { get; private set; } + } + + [HierarchyRoot] + public class PersonGroup : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Persons { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0813_AuxilaryTableMappingNameBug : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + + var person = new Person(); + var typeInfo = person.TypeInfo; + var fieldInfo = typeInfo.Fields["Friends"]; + var associationInfo = fieldInfo.Associations[0]; + var auxiliaryType = associationInfo.AuxiliaryType; + Assert.AreEqual("Person-Friends-Person", auxiliaryType.Name); + Assert.AreEqual("P-F-P", auxiliaryType.MappingName); + + var personGroup = new PersonGroup(); + typeInfo = personGroup.TypeInfo; + fieldInfo = typeInfo.Fields["Persons"]; + associationInfo = fieldInfo.Associations[0]; + auxiliaryType = associationInfo.AuxiliaryType; + Assert.AreEqual("PersonGroup-Persons-Person", auxiliaryType.Name); + Assert.AreEqual("PersonGroup-Persons-P", auxiliaryType.MappingName); + + ts.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0817_LocalCollectionWithEnum.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0817_LocalCollectionWithEnum.cs index 82bc552500..b949fc67a5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0817_LocalCollectionWithEnum.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0817_LocalCollectionWithEnum.cs @@ -1,86 +1,86 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0817_LocalCollectionWithEnum; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Issues_Issue0817_LocalCollectionWithEnum -{ - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] -#pragma warning disable 108,114 - public ItemState State { get; set; } -#pragma warning restore 108,114 - } - - public enum ItemState - { - Registering = 17, - Wrong = 44 - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0817_LocalCollectionWithEnum : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); - return config; - } - - [Test] - public void Query1Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var query = from item in session.Query.All() - where item.State.In(new[] {ItemState.Registering}) - select item; - var result = query.ToList(); - } - } - } - - [Test] - public void Query2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var itemStates = session.Query.Store(new[] {ItemState.Registering}); - var query = from item in session.Query.All() - where item.State.In(itemStates) - select item; - var result = query.ToList(); - } - } - } - - [Test] - public void Query3Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var itemStates = session.Query.Store(new[] {ItemState.Registering}); - - var query = from item in session.Query.All() - where itemStates.Contains(item.State) - select item; - var result = query.ToList(); - } - } - } - } +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0817_LocalCollectionWithEnum; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Issues_Issue0817_LocalCollectionWithEnum +{ + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] +#pragma warning disable 108,114 + public ItemState State { get; set; } +#pragma warning restore 108,114 + } + + public enum ItemState + { + Registering = 17, + Wrong = 44 + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0817_LocalCollectionWithEnum : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); + return config; + } + + [Test] + public void Query1Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var query = from item in session.Query.All() + where item.State.In(new[] {ItemState.Registering}) + select item; + var result = query.ToList(); + } + } + } + + [Test] + public void Query2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var itemStates = session.Query.Store(new[] {ItemState.Registering}); + var query = from item in session.Query.All() + where item.State.In(itemStates) + select item; + var result = query.ToList(); + } + } + } + + [Test] + public void Query3Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var itemStates = session.Query.Store(new[] {ItemState.Registering}); + + var query = from item in session.Query.All() + where itemStates.Contains(item.State) + select item; + var result = query.ToList(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0818_NanosecondTrancation.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0818_NanosecondTrancation.cs index 6dabcbf175..dd5f5db39a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0818_NanosecondTrancation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0818_NanosecondTrancation.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.10.14 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0818_NanosecondTrancation_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0818_NanosecondTrancation_Model -{ - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public TimeSpan Interval { get; set; } - - public MyEntity(TimeSpan interval) - { - Interval = interval; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0818_NanosecondTrancation : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.ProviderIsNot(StorageProvider.PostgreSql); // PostgreSql stores intervals with microseconds only - - long ticks = 123456789; - - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var entity = new MyEntity(new TimeSpan(ticks)); - ts.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) - Assert.AreEqual(ticks, session.Query.All().First().Interval.Ticks); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.10.14 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0818_NanosecondTrancation_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0818_NanosecondTrancation_Model +{ + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public TimeSpan Interval { get; set; } + + public MyEntity(TimeSpan interval) + { + Interval = interval; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0818_NanosecondTrancation : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.ProviderIsNot(StorageProvider.PostgreSql); // PostgreSql stores intervals with microseconds only + + long ticks = 123456789; + + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var entity = new MyEntity(new TimeSpan(ticks)); + ts.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) + Assert.AreEqual(ticks, session.Query.All().First().Interval.Ticks); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0820_GroupByWithDatePart.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0820_GroupByWithDatePart.cs index b112aebe02..66beecebb2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0820_GroupByWithDatePart.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0820_GroupByWithDatePart.cs @@ -1,113 +1,113 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0820_GroupByWithDatePart; - -namespace Xtensive.Orm.Tests.Issues_Issue0820_GroupByWithDatePart -{ - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime? Date { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0820_GroupByWithDatePart : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); - return config; - } - - [Test] - public void OriginalTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var dateTime = DateTime.Now; - var item1 = new Item {Date = dateTime}; - var item2 = new Item {Date = dateTime.AddSeconds(1)}; - var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { - Year = (c.Date!=((Nullable) null)) - ? ((Nullable) c.Date.Value.Year) - : null - }).GroupBy( - g => new PipeAbonentDocumentReportItemDto { - Year = g.Year - }, - (e, g) => new PipeAbonentDocumentReportItemDto { - Year = e.Year, - LineCount = g.Count() - } - ); - - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual(2, result[0].LineCount); - } - } - } - - [Test] - public void SimplifiedTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var dateTime = DateTime.Now; - var item1 = new Item {Date = dateTime}; - var item2 = new Item {Date = dateTime.AddSeconds(1)}; - var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { - Year = (c.Date!=((DateTime?) null)) - ? ((int?) c.Date.Value.Year) - : null - }).GroupBy( - g => new PipeAbonentDocumentReportItemDto { - Year = g.Year - }); - - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - } - } - } - - [Test] - public void AnonimousTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var dateTime = DateTime.Now; - var item1 = new Item {Date = dateTime}; - var item2 = new Item {Date = dateTime.AddSeconds(1)}; - var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { - Year = (c.Date!=((DateTime?) null)) - ? ((int?) c.Date.Value.Year) - : null - }).GroupBy( - g => new { - Year = g.Year - }); - session.SaveChanges(); - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - } - } - } - } - - public class PipeAbonentDocumentReportItemDto - { - public int? Year; - public int LineCount; - } +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0820_GroupByWithDatePart; + +namespace Xtensive.Orm.Tests.Issues_Issue0820_GroupByWithDatePart +{ + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime? Date { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0820_GroupByWithDatePart : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Item).Assembly, typeof (Item).Namespace); + return config; + } + + [Test] + public void OriginalTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var dateTime = DateTime.Now; + var item1 = new Item {Date = dateTime}; + var item2 = new Item {Date = dateTime.AddSeconds(1)}; + var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { + Year = (c.Date!=((Nullable) null)) + ? ((Nullable) c.Date.Value.Year) + : null + }).GroupBy( + g => new PipeAbonentDocumentReportItemDto { + Year = g.Year + }, + (e, g) => new PipeAbonentDocumentReportItemDto { + Year = e.Year, + LineCount = g.Count() + } + ); + + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(2, result[0].LineCount); + } + } + } + + [Test] + public void SimplifiedTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var dateTime = DateTime.Now; + var item1 = new Item {Date = dateTime}; + var item2 = new Item {Date = dateTime.AddSeconds(1)}; + var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { + Year = (c.Date!=((DateTime?) null)) + ? ((int?) c.Date.Value.Year) + : null + }).GroupBy( + g => new PipeAbonentDocumentReportItemDto { + Year = g.Year + }); + + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + } + } + } + + [Test] + public void AnonimousTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var dateTime = DateTime.Now; + var item1 = new Item {Date = dateTime}; + var item2 = new Item {Date = dateTime.AddSeconds(1)}; + var query = session.Query.All().Select(c => new PipeAbonentDocumentReportItemDto { + Year = (c.Date!=((DateTime?) null)) + ? ((int?) c.Date.Value.Year) + : null + }).GroupBy( + g => new { + Year = g.Year + }); + session.SaveChanges(); + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + } + } + } + } + + public class PipeAbonentDocumentReportItemDto + { + public int? Year; + public int LineCount; + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0821_StructureNulComparisonInLinq.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0821_StructureNulComparisonInLinq.cs index 91a8337e45..69639b3ff7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0821_StructureNulComparisonInLinq.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0821_StructureNulComparisonInLinq.cs @@ -1,60 +1,60 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0821_StructureNulComparisonInLinq; - -namespace Xtensive.Orm.Tests.Issues_Issue0821_StructureNulComparisonInLinq -{ - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Address Address { get; set; } - } - - public class Address : Structure - { - [Field] - public string City { get; set; } - - [Field] - public string Street { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0821_StructureNulComparisonInLinq : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (User).Assembly, typeof (User).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var address = new Address {City = "Moscow", Street = "Lomonosova"}; - var nullStrucutre = new User(); - var notNullStructure = new User {Address = address}; - session.SaveChanges(); - var nullQuery = session.Query.All().Where(u => u.Address==null).ToList(); - var notNullQuery = session.Query.All().Where(u => u.Address!=null).ToList(); - Assert.AreEqual(0, nullQuery.Count); - Assert.AreEqual(2, notNullQuery.Count); - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0821_StructureNulComparisonInLinq; + +namespace Xtensive.Orm.Tests.Issues_Issue0821_StructureNulComparisonInLinq +{ + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Address Address { get; set; } + } + + public class Address : Structure + { + [Field] + public string City { get; set; } + + [Field] + public string Street { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0821_StructureNulComparisonInLinq : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (User).Assembly, typeof (User).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var address = new Address {City = "Moscow", Street = "Lomonosova"}; + var nullStrucutre = new User(); + var notNullStructure = new User {Address = address}; + session.SaveChanges(); + var nullQuery = session.Query.All().Where(u => u.Address==null).ToList(); + var notNullQuery = session.Query.All().Where(u => u.Address!=null).ToList(); + Assert.AreEqual(0, nullQuery.Count); + Assert.AreEqual(2, notNullQuery.Count); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0825_StrangeLinqBehavior.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0825_StrangeLinqBehavior.cs index bb8a09db98..283aa5ede4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0825_StrangeLinqBehavior.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0825_StrangeLinqBehavior.cs @@ -1,172 +1,172 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.10.07 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues_Issue0825_StrangeLinqBehavior; - -namespace Xtensive.Orm.Tests.Issues_Issue0825_StrangeLinqBehavior -{ - [HierarchyRoot] - public class SevRGas2EPassportCustomerMatchGuess : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int SevRGasCustomerID { get; set; } - - [Field] - public int EPassportCustomerID { get; set; } - - [Field] - public int Rank { get; set; } - } - - [HierarchyRoot] - public class SevRGasCustomer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string FullName { get; set; } - - [Field] - public int Tin { get; set; } - - [Field] - public string Code { get; set; } - } - - [HierarchyRoot] - public class EPassportAgent : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class DataUnitCustomer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public SevRGasCustomer SevRGasCustomer { get; set; } - - [Field] - public EPassportAgent EPassportAgent { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0825_StrangeLinqBehavior : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (SevRGas2EPassportCustomerMatchGuess).Assembly, typeof (SevRGas2EPassportCustomerMatchGuess).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) { - using (var transactionn = session.OpenTransaction()) { - - var sevRGasCustomer2 = new SevRGasCustomer() { - Code = "Code", - FullName = "Customer FullName", - Name = "Customer Name", - Tin = 44 - }; - // var ePassportAgent2 = new EPassportAgent(); - var sevRGas2EPassportCustomerMatchGuess2 = new SevRGas2EPassportCustomerMatchGuess { - SevRGasCustomerID = sevRGasCustomer2.Id, - EPassportCustomerID = 12345, - Rank = 12345 - }; - var dataUnitCustomer2 = new DataUnitCustomer { - SevRGasCustomer = sevRGasCustomer2, - EPassportAgent = null - }; - - var sevRGasCustomer1 = new SevRGasCustomer() { - Code = "Code", - FullName = "Customer FullName", - Name = "Customer Name", - Tin = 12 - }; - var ePassportAgent1 = new EPassportAgent(); - var sevRGas2EPassportCustomerMatchGuess1 = new SevRGas2EPassportCustomerMatchGuess { - SevRGasCustomerID = sevRGasCustomer1.Id, - EPassportCustomerID = ePassportAgent1.Id, - Rank = 12345 - }; - var dataUnitCustomer1 = new DataUnitCustomer { - SevRGasCustomer = sevRGasCustomer1, - EPassportAgent = ePassportAgent1 - }; - - var query = - from customer in session.Query.All() - let matchGuess = session.Query.All().Where( - g => g.SevRGasCustomerID==customer.Id).FirstOrDefault() - let matchGuessObject = session.Query.All().Where( - go => go.Id==matchGuess.EPassportCustomerID).FirstOrDefault() - let unifiedCustomer = session.Query.All().Where( - ua => ua.SevRGasCustomer==customer && ua.EPassportAgent!=null).FirstOrDefault() - select new SevRGas2EPassportCustomerMatchListItem { - LeftID = customer.Id, - LeftName = customer.Name ?? customer.FullName, - LeftUniqueTaxpayerNumber = customer.Tin, - LeftCode = customer.Code, - Rank = matchGuess.Rank, - Status = unifiedCustomer==null ? MatchStatus.NotConfirmed : MatchStatus.Confirmed, - Right = GetRight(unifiedCustomer, matchGuess, matchGuessObject) - }; - var result = query.ToList(); - } - } - } - - private EPassportAgent GetRight(DataUnitCustomer unifiedCustomer, SevRGas2EPassportCustomerMatchGuess matchGuess, EPassportAgent matchGuessObject) - { - return matchGuessObject; - } - - } - - public class SevRGas2EPassportCustomerMatchListItem - { - public int LeftID { get; set; } - - public string LeftName { get; set; } - - public int LeftUniqueTaxpayerNumber { get; set; } - - public string LeftCode { get; set; } - - public int Rank { get; set; } - - public MatchStatus Status { get; set; } - - public EPassportAgent Right { get; set; } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.10.07 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues_Issue0825_StrangeLinqBehavior; + +namespace Xtensive.Orm.Tests.Issues_Issue0825_StrangeLinqBehavior +{ + [HierarchyRoot] + public class SevRGas2EPassportCustomerMatchGuess : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int SevRGasCustomerID { get; set; } + + [Field] + public int EPassportCustomerID { get; set; } + + [Field] + public int Rank { get; set; } + } + + [HierarchyRoot] + public class SevRGasCustomer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string FullName { get; set; } + + [Field] + public int Tin { get; set; } + + [Field] + public string Code { get; set; } + } + + [HierarchyRoot] + public class EPassportAgent : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class DataUnitCustomer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public SevRGasCustomer SevRGasCustomer { get; set; } + + [Field] + public EPassportAgent EPassportAgent { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0825_StrangeLinqBehavior : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (SevRGas2EPassportCustomerMatchGuess).Assembly, typeof (SevRGas2EPassportCustomerMatchGuess).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) { + using (var transactionn = session.OpenTransaction()) { + + var sevRGasCustomer2 = new SevRGasCustomer() { + Code = "Code", + FullName = "Customer FullName", + Name = "Customer Name", + Tin = 44 + }; + // var ePassportAgent2 = new EPassportAgent(); + var sevRGas2EPassportCustomerMatchGuess2 = new SevRGas2EPassportCustomerMatchGuess { + SevRGasCustomerID = sevRGasCustomer2.Id, + EPassportCustomerID = 12345, + Rank = 12345 + }; + var dataUnitCustomer2 = new DataUnitCustomer { + SevRGasCustomer = sevRGasCustomer2, + EPassportAgent = null + }; + + var sevRGasCustomer1 = new SevRGasCustomer() { + Code = "Code", + FullName = "Customer FullName", + Name = "Customer Name", + Tin = 12 + }; + var ePassportAgent1 = new EPassportAgent(); + var sevRGas2EPassportCustomerMatchGuess1 = new SevRGas2EPassportCustomerMatchGuess { + SevRGasCustomerID = sevRGasCustomer1.Id, + EPassportCustomerID = ePassportAgent1.Id, + Rank = 12345 + }; + var dataUnitCustomer1 = new DataUnitCustomer { + SevRGasCustomer = sevRGasCustomer1, + EPassportAgent = ePassportAgent1 + }; + + var query = + from customer in session.Query.All() + let matchGuess = session.Query.All().Where( + g => g.SevRGasCustomerID==customer.Id).FirstOrDefault() + let matchGuessObject = session.Query.All().Where( + go => go.Id==matchGuess.EPassportCustomerID).FirstOrDefault() + let unifiedCustomer = session.Query.All().Where( + ua => ua.SevRGasCustomer==customer && ua.EPassportAgent!=null).FirstOrDefault() + select new SevRGas2EPassportCustomerMatchListItem { + LeftID = customer.Id, + LeftName = customer.Name ?? customer.FullName, + LeftUniqueTaxpayerNumber = customer.Tin, + LeftCode = customer.Code, + Rank = matchGuess.Rank, + Status = unifiedCustomer==null ? MatchStatus.NotConfirmed : MatchStatus.Confirmed, + Right = GetRight(unifiedCustomer, matchGuess, matchGuessObject) + }; + var result = query.ToList(); + } + } + } + + private EPassportAgent GetRight(DataUnitCustomer unifiedCustomer, SevRGas2EPassportCustomerMatchGuess matchGuess, EPassportAgent matchGuessObject) + { + return matchGuessObject; + } + + } + + public class SevRGas2EPassportCustomerMatchListItem + { + public int LeftID { get; set; } + + public string LeftName { get; set; } + + public int LeftUniqueTaxpayerNumber { get; set; } + + public string LeftCode { get; set; } + + public int Rank { get; set; } + + public MatchStatus Status { get; set; } + + public EPassportAgent Right { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0826_OperandTypeClash.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0826_OperandTypeClash.cs index ccf7d504f3..6c9786a1aa 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0826_OperandTypeClash.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0826_OperandTypeClash.cs @@ -1,79 +1,79 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues_Issue0826_OperandTypeClash; - -namespace Xtensive.Orm.Tests.Issues_Issue0826_OperandTypeClash -{ - [HierarchyRoot(InheritanceSchema.ClassTable)] - public abstract class IdentifiableEntity : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field] - public bool Active { get; set; } - } - - [HierarchyRoot] - public class Status : Entity - { - [Field, Key] - public Guid ID { get; private set; } - } - - public abstract class ConcreteMedia : IdentifiableEntity - { - [Field] - public VirtualMedia VirtualMedia { get; set; } - - [Field] - public EntitySet Statuses { get; set; } - } - - public abstract class VirtualMedia : IdentifiableEntity - { - [Field] - [Association(PairTo = "VirtualMedia")] - public EntitySet Concretes { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0826_OperandTypeClash : AutoBuildTest - { - - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIsNot(StorageProvider.Oracle); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (VirtualMedia).Assembly, typeof (VirtualMedia).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var titles = - from vm in session.Query.All() - join cm in session.Query.All() on vm equals cm.VirtualMedia - where cm.Statuses.Any() - select vm; - - var error = titles.ToList(); - } - } - } - } +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues_Issue0826_OperandTypeClash; + +namespace Xtensive.Orm.Tests.Issues_Issue0826_OperandTypeClash +{ + [HierarchyRoot(InheritanceSchema.ClassTable)] + public abstract class IdentifiableEntity : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field] + public bool Active { get; set; } + } + + [HierarchyRoot] + public class Status : Entity + { + [Field, Key] + public Guid ID { get; private set; } + } + + public abstract class ConcreteMedia : IdentifiableEntity + { + [Field] + public VirtualMedia VirtualMedia { get; set; } + + [Field] + public EntitySet Statuses { get; set; } + } + + public abstract class VirtualMedia : IdentifiableEntity + { + [Field] + [Association(PairTo = "VirtualMedia")] + public EntitySet Concretes { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0826_OperandTypeClash : AutoBuildTest + { + + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIsNot(StorageProvider.Oracle); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (VirtualMedia).Assembly, typeof (VirtualMedia).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var titles = + from vm in session.Query.All() + join cm in session.Query.All() on vm equals cm.VirtualMedia + where cm.Statuses.Any() + select vm; + + var error = titles.ToList(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0827_LinqDtoMaterialization.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0827_LinqDtoMaterialization.cs index f54502ebdb..3a7f5ceacf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0827_LinqDtoMaterialization.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0827_LinqDtoMaterialization.cs @@ -1,198 +1,198 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.10.08 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0827_LinqDtoMaterialization; - -namespace Xtensive.Orm.Tests.Issues_Issue0827_LinqDtoMaterialization -{ - [HierarchyRoot] - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string SysName { get; set; } - - [Field] - public string Description { get; set; } - } - - public class DocEntity : BaseEntity - { - [Field] - public BaseEntity LinkedEntity { get; set; } - - [Field] - public BaseEntity OwnerEntity { get; set; } - - [Field] - public BaseEntity EnEntityType { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [Serializable] - public class Issue0827_LinqDtoMaterialization : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (DocEntity).Assembly, typeof (DocEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var interfacesDic = new Dictionary>(); - var numeratorsDict = new Dictionary>(); - var fieldsDict = new Dictionary>(); - var enEntityType = new DocEntity() { - Name = "enEntityType", - SysName = "enEntityType SysName", - Description = "enEntityType Description" - }; - var linkedEntity = new DocEntity() { - Name = "linkedEntity", - SysName = "linkedEntity SysName", - Description = "linkedEntity Description" - }; - var ownerEntity = new DocEntity() { - Name = "ownerEntity", - SysName = "ownerEntity SysName", - Description = "ownerEntity Description" - }; - var docEntity = new DocEntity { - Description = "docEntity Description", - Name = "docEntity", - SysName = "docEntity SysName", - EnEntityType = enEntityType, - LinkedEntity = linkedEntity, - OwnerEntity = ownerEntity, - }; - session.SaveChanges(); - var query = - session.Query.All().Select( - q => - new DocEntityInfo() { - Caption = q.Name, - Id = q.Id, - Name = q.SysName, - Description = q.Description, - EntityTypeId = q.EnEntityType.Id, - EntityTypeName = q.EnEntityType.SysName, - LinkedEntitySysName = q.LinkedEntity!=null ? q.LinkedEntity.SysName : null, - OwnerEntitySysName = q.OwnerEntity!=null ? q.OwnerEntity.SysName : null, - FieldsInfo = fieldsDict.ContainsKey(q.Id) ? fieldsDict[q.Id] : new List(), - NumeratorInfo = numeratorsDict.ContainsKey(q.Id) ? numeratorsDict[q.Id] : new List(), - Interfaces = interfacesDic.ContainsKey(q.Id) ? interfacesDic[q.Id] : new Dictionary() - }).ToList(); - - var result = query.ToList(); - } - } - } - - [Test] - public void AdditionalTest() - { - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var interfacesDic = new Dictionary>(); - var numeratorsDict = new Dictionary>(); - var fieldsDict = new Dictionary>(); - var enEntityType = new DocEntity() { - Name = "enEntityType", - SysName = "enEntityType SysName", - Description = "enEntityType Description" - }; - var linkedEntity = new DocEntity() { - Name = "linkedEntity", - SysName = "linkedEntity SysName", - Description = "linkedEntity Description" - }; - var ownerEntity = new DocEntity() { - Name = "ownerEntity", - SysName = "ownerEntity SysName", - Description = "ownerEntity Description" - }; - var docEntity = new DocEntity { - Description = "docEntity Description", - Name = "docEntity", - SysName = "docEntity SysName", - EnEntityType = enEntityType, - LinkedEntity = linkedEntity, - OwnerEntity = ownerEntity, - }; - session.SaveChanges(); - var q = session.Query.All() - .GroupBy(tpf => tpf.EnEntityType.Id) - .Select(gr => new { - V = gr.Select(a => new DynamicFilterInfo() { - SourceSysName = a.OwnerEntity!=null ? a.OwnerEntity.SysName : null, - FilteredSysName = a.LinkedEntity!=null ? a.LinkedEntity.SysName : null, - }) - }) - .First(); - } - } - } - } - - public class DynamicFilterInfo - { - public string SourceSysName { get; set; } - - public string FilteredSysName { get; set; } - - } - - public class DocEntityInfo - { - public Dictionary Interfaces { get; set; } - - public string Caption { get; set; } - - public List NumeratorInfo { get; set; } - - public List FieldsInfo { get; set; } - - public string OwnerEntitySysName { get; set; } - - public string LinkedEntitySysName { get; set; } - - public string EntityTypeName { get; set; } - - public int EntityTypeId { get; set; } - - public string Description { get; set; } - - public string Name { get; set; } - - public int Id { get; set; } - } - - public class DocFieldInfo - { - } - - public class NumeratorInfo - { - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.10.08 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0827_LinqDtoMaterialization; + +namespace Xtensive.Orm.Tests.Issues_Issue0827_LinqDtoMaterialization +{ + [HierarchyRoot] + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string SysName { get; set; } + + [Field] + public string Description { get; set; } + } + + public class DocEntity : BaseEntity + { + [Field] + public BaseEntity LinkedEntity { get; set; } + + [Field] + public BaseEntity OwnerEntity { get; set; } + + [Field] + public BaseEntity EnEntityType { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [Serializable] + public class Issue0827_LinqDtoMaterialization : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (DocEntity).Assembly, typeof (DocEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var interfacesDic = new Dictionary>(); + var numeratorsDict = new Dictionary>(); + var fieldsDict = new Dictionary>(); + var enEntityType = new DocEntity() { + Name = "enEntityType", + SysName = "enEntityType SysName", + Description = "enEntityType Description" + }; + var linkedEntity = new DocEntity() { + Name = "linkedEntity", + SysName = "linkedEntity SysName", + Description = "linkedEntity Description" + }; + var ownerEntity = new DocEntity() { + Name = "ownerEntity", + SysName = "ownerEntity SysName", + Description = "ownerEntity Description" + }; + var docEntity = new DocEntity { + Description = "docEntity Description", + Name = "docEntity", + SysName = "docEntity SysName", + EnEntityType = enEntityType, + LinkedEntity = linkedEntity, + OwnerEntity = ownerEntity, + }; + session.SaveChanges(); + var query = + session.Query.All().Select( + q => + new DocEntityInfo() { + Caption = q.Name, + Id = q.Id, + Name = q.SysName, + Description = q.Description, + EntityTypeId = q.EnEntityType.Id, + EntityTypeName = q.EnEntityType.SysName, + LinkedEntitySysName = q.LinkedEntity!=null ? q.LinkedEntity.SysName : null, + OwnerEntitySysName = q.OwnerEntity!=null ? q.OwnerEntity.SysName : null, + FieldsInfo = fieldsDict.ContainsKey(q.Id) ? fieldsDict[q.Id] : new List(), + NumeratorInfo = numeratorsDict.ContainsKey(q.Id) ? numeratorsDict[q.Id] : new List(), + Interfaces = interfacesDic.ContainsKey(q.Id) ? interfacesDic[q.Id] : new Dictionary() + }).ToList(); + + var result = query.ToList(); + } + } + } + + [Test] + public void AdditionalTest() + { + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var interfacesDic = new Dictionary>(); + var numeratorsDict = new Dictionary>(); + var fieldsDict = new Dictionary>(); + var enEntityType = new DocEntity() { + Name = "enEntityType", + SysName = "enEntityType SysName", + Description = "enEntityType Description" + }; + var linkedEntity = new DocEntity() { + Name = "linkedEntity", + SysName = "linkedEntity SysName", + Description = "linkedEntity Description" + }; + var ownerEntity = new DocEntity() { + Name = "ownerEntity", + SysName = "ownerEntity SysName", + Description = "ownerEntity Description" + }; + var docEntity = new DocEntity { + Description = "docEntity Description", + Name = "docEntity", + SysName = "docEntity SysName", + EnEntityType = enEntityType, + LinkedEntity = linkedEntity, + OwnerEntity = ownerEntity, + }; + session.SaveChanges(); + var q = session.Query.All() + .GroupBy(tpf => tpf.EnEntityType.Id) + .Select(gr => new { + V = gr.Select(a => new DynamicFilterInfo() { + SourceSysName = a.OwnerEntity!=null ? a.OwnerEntity.SysName : null, + FilteredSysName = a.LinkedEntity!=null ? a.LinkedEntity.SysName : null, + }) + }) + .First(); + } + } + } + } + + public class DynamicFilterInfo + { + public string SourceSysName { get; set; } + + public string FilteredSysName { get; set; } + + } + + public class DocEntityInfo + { + public Dictionary Interfaces { get; set; } + + public string Caption { get; set; } + + public List NumeratorInfo { get; set; } + + public List FieldsInfo { get; set; } + + public string OwnerEntitySysName { get; set; } + + public string LinkedEntitySysName { get; set; } + + public string EntityTypeName { get; set; } + + public int EntityTypeId { get; set; } + + public string Description { get; set; } + + public string Name { get; set; } + + public int Id { get; set; } + } + + public class DocFieldInfo + { + } + + public class NumeratorInfo + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0828_LinqMaterializeException.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0828_LinqMaterializeException.cs index 1c7540e90a..7a12a1fe2c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0828_LinqMaterializeException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0828_LinqMaterializeException.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.10.11 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues_Issue0828_LinqMaterializeException; - -namespace Xtensive.Orm.Tests.Issues_Issue0828_LinqMaterializeException -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public DateTime? Date { get; set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Infos { get; private set; } - } - - [HierarchyRoot] - public class Info : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public MyEntity Owner { get; set; } - } - - public class SuccessInfo : Info - { - } - - public class ErrorInfo : Info - { - } - - public enum Status - { - Unknown, - Success, - Error - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0828_LinqMaterializeException : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var myEntity = new MyEntity() { - Date = DateTime.Now, - Text = "Text" - }; - var query = session.Query.All() - .Select(e => new { - MyEntity = e, - Year = (int?) e.Date.Value.Year, - Status = e.Infos.OfType().Any() ? Status.Success : (e.Infos.OfType().Any() ? Status.Error : Status.Unknown) - }) - .Select(o => new object[] {o.MyEntity.Id, o.Year, o.Status}); - var result = query.ToList(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.10.11 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues_Issue0828_LinqMaterializeException; + +namespace Xtensive.Orm.Tests.Issues_Issue0828_LinqMaterializeException +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public DateTime? Date { get; set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Infos { get; private set; } + } + + [HierarchyRoot] + public class Info : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public MyEntity Owner { get; set; } + } + + public class SuccessInfo : Info + { + } + + public class ErrorInfo : Info + { + } + + public enum Status + { + Unknown, + Success, + Error + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0828_LinqMaterializeException : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var myEntity = new MyEntity() { + Date = DateTime.Now, + Text = "Text" + }; + var query = session.Query.All() + .Select(e => new { + MyEntity = e, + Year = (int?) e.Date.Value.Year, + Status = e.Infos.OfType().Any() ? Status.Success : (e.Infos.OfType().Any() ? Status.Error : Status.Unknown) + }) + .Select(o => new object[] {o.MyEntity.Id, o.Year, o.Status}); + var result = query.ToList(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0835_QueryNestedTooDeep.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0835_QueryNestedTooDeep.cs index ebc8684b26..0f6cd8c643 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0835_QueryNestedTooDeep.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0835_QueryNestedTooDeep.cs @@ -1,643 +1,643 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0835_QueryNestedTooDeep; - -namespace Xtensive.Orm.Tests.Issues_Issue0835_QueryNestedTooDeep -{ - [HierarchyRoot] - public class BaseEntity3 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public class BaseEntity2 : BaseEntity3 - { - } - - public class BaseEntity1 : BaseEntity2 - { - } - - public class BaseEntity : BaseEntity1 - { - } - - public class EconomicOperation : BaseEntity - { - } - public class Region : BaseEntity - { - } - public class Nomenclature : BaseEntity - { - } - public class TaxRates : BaseEntity - { - - } - - public class Customer : BaseEntity - { - } - - public class ConsumptionCategory : BaseEntity - { - } - - public class PrivilegesLaw : BaseEntity - { - } - - public class Contract : BaseEntity - { - } - - public class EntryCategory : BaseEntity - { - } - - public class SaleCategory : BaseEntity - { - } - - public class NamedEntity : BaseEntity - { - } - - [HierarchyRoot] - public class PaymentTransfer : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - public PaymentTransferOperationType? OperationType { get; set; } - - [Field] - public GasDeliveryTypes? DeliveryTypeTo { get; set; } - - [Field] - public GasDeliveryTypes? DeliveryTypeFrom { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public EntryCategory EntryCategory { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public EntryCategory EntryCategoryFrom { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public SaleCategory SaleCategoryTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public SaleCategory SaleCategoryFrom { get; set; } - - [Field] - public DateTime? ClosedDebtCorrectionsDate { get; set; } - - [Field] - public DateTime? AdvanceCorrectionsDate { get; set; } - - [Field] - public DateTime? ReversalAdvanceCorrectionsDate { get; set; } - - [Field] - public DateTime? ReversalDebtCorrectionsDate { get; set; } - - [Field] - public DateTime? PaymentDocumentDate { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public Contract ContractTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public Contract ContractFrom { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field] - public Contract PayerContract { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Contract PayerContractTo { get; set; } - - [Field()] - public bool? BuyerDocument { get; set; } - - [Field()] - public bool? SupplierDocument { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public PrivilegesLaw PrivilegesLaw { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public PrivilegesLaw PrivilegesLawFrom { get; set; } - - [Field()] - public bool? CloseRecoveredDebts { get; set; } - - [Field()] - public bool? CloseDebtsUnderMoratorium { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public ConsumptionCategory ConsumptionCategoryTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public ConsumptionCategory ConsumptionCategoryFrom { get; set; } - - [Field()] - public DateTime? PaymentPeriodEnd { get; set; } - - [Field()] - public DateTime? PaymentToSupplierPeriodEnd { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer CustomerTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer CustomerFrom { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public TaxRates TaxRatesTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public TaxRates TaxRatesFrom { get; set; } - - [Field()] - public DateTime? PaymentPeriodBegin { get; set; } - - [Field()] - public DateTime? PaymentToSupplierPeriodBegin { get; set; } - - [Field()] - public bool? NotReflectReversalOfClosedAdvances { get; set; } - - [Field()] - public bool? DoNotCreateNewAdvancesInvoices { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Nomenclature Nomenclature { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Nomenclature NomenclatureFrom { get; set; } - - [Field(Length = 50)] - public string PaymentDocumentNumber { get; set; } - - [Field()] - public bool? ReflectPaymentReversalAsCreditAdvance { get; set; } - - [Field()] - public bool? RecalculateTaxesOnTheOldAdvanceDocument { get; set; } - - [Field()] - public DateTime? CorrectionsPeriod { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer Payer { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer PayerTo { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer PrivilegeRecipient { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer PrivilegeRecipientFrom { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer Consumer { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Customer ConsumerFrom { get; set; } - - [Field(Length = 100)] - public string DocumentPresentation { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Region Region { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public Region RegionFrom { get; set; } - - [Field()] - public bool? SaveAdvancesOnTheOldPaymentDocument { get; set; } - - [Field()] - public bool? SaveAdvancesSecurities { get; set; } - - [Field()] - public bool? ReverseAdvancesOnFIFO { get; set; } - - [Field()] - public bool? ReverseOnlyIndicatedDocument { get; set; } - - [Field(Precision = 15, Scale = 2)] - public decimal? Sum { get; set; } - - [Field(Precision = 15, Scale = 2)] - public decimal? VatTo { get; set; } - - [Field(Precision = 15, Scale = 2)] - public decimal? VatFrom { get; set; } - - [Field()] - public bool? SpecifySalesBookCorrectionsPeriodManually { get; set; } - - [Field()] - public bool? ComposeAdvanceForFullDocumentSum { get; set; } - - [Association(OnTargetRemove = OnRemoveAction.Clear)] - [Field()] - public EconomicOperation EconomicOperation { get; set; } - - [Field()] - public NamedEntity Entity1{ get; set; } - - [Field()] - public NamedEntity Entity2 { get; set; } - - [Field()] - public NamedEntity Entity3 { get; set; } - - [Field()] - public NamedEntity Entity4 { get; set; } - - [Field()] - public NamedEntity Entity5 { get; set; } - - [Field()] - public NamedEntity Entity6 { get; set; } - - [Field()] - public NamedEntity Entity7 { get; set; } - - [Field()] - public NamedEntity Entity8 { get; set; } - } - - public enum GasDeliveryTypes - { - C, - D - } - - public enum PaymentTransferOperationType - { - A, - B - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0835_QueryNestedTooDeep : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (PaymentTransfer).Assembly, typeof (PaymentTransfer).Namespace); - var systemSession = new SessionConfiguration(WellKnown.Sessions.System); - systemSession.DefaultCommandTimeout = 100; - config.Sessions.Add(systemSession); - return config; - } - - [Test] - public void MainTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "parser stack overflow"); - - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new PaymentTransferDto { - ID = c.Id, - Number = c.Number, - Date = c.Date, - OperationType = (PaymentTransferOperationType?) (int?) c.OperationType, - DeliveryTypeTo = (GasDeliveryTypes?) (int?) c.DeliveryTypeTo, - DeliveryTypeFrom = (GasDeliveryTypes?) (int?) c.DeliveryTypeFrom, - EntryCategoryId = c.EntryCategory!=null ? (int?) c.EntryCategory.Id : null, - EntryCategoryName = c.EntryCategory!=null ? c.EntryCategory.Name : null, - EntryCategoryFromId = c.EntryCategoryFrom!=null ? (int?) c.EntryCategoryFrom.Id : null, - EntryCategoryFromName = c.EntryCategoryFrom!=null ? c.EntryCategoryFrom.Name : null, - SaleCategoryToId = c.SaleCategoryTo!=null ? (int?) c.SaleCategoryTo.Id : null, - SaleCategoryToName = c.SaleCategoryTo!=null ? c.SaleCategoryTo.Name : null, - SaleCategoryFromId = c.SaleCategoryFrom!=null ? (int?) c.SaleCategoryFrom.Id : null, - SaleCategoryFromName = c.SaleCategoryFrom!=null ? c.SaleCategoryFrom.Name : null, - ClosedDebtCorrectionsDate = c.ClosedDebtCorrectionsDate, - AdvanceCorrectionsDate = c.AdvanceCorrectionsDate, - ReversalAdvanceCorrectionsDate = c.ReversalAdvanceCorrectionsDate, - ReversalDebtCorrectionsDate = c.ReversalDebtCorrectionsDate, - PaymentDocumentDate = c.PaymentDocumentDate, - ContractToId = c.ContractTo!=null ? (int?) c.ContractTo.Id : null, - ContractToName = c.ContractTo!=null ? c.ContractTo.Name : null, - ContractFromId = c.ContractFrom!=null ? (int?) c.ContractFrom.Id : null, - ContractFromName = c.ContractFrom!=null ? c.ContractFrom.Name : null, - PayerContractId = c.PayerContract!=null ? (int?) c.PayerContract.Id : null, - PayerContractName = c.PayerContract!=null ? c.PayerContract.Name : null, - PayerContractToId = c.PayerContractTo!=null ? (int?) c.PayerContractTo.Id : null, - PayerContractToName = c.PayerContractTo!=null ? c.PayerContractTo.Name : null, - BuyerDocument = c.BuyerDocument, - SupplierDocument = c.SupplierDocument, - PrivilegesLawId = c.PrivilegesLaw!=null ? (int?) c.PrivilegesLaw.Id : null, - PrivilegesLawName = c.PrivilegesLaw!=null ? c.PrivilegesLaw.Name : null, - PrivilegesLawFromId = c.PrivilegesLawFrom!=null ? (int?) c.PrivilegesLawFrom.Id : null, - PrivilegesLawFromName = c.PrivilegesLawFrom!=null ? c.PrivilegesLawFrom.Name : null, - CloseRecoveredDebts = c.CloseRecoveredDebts, - CloseDebtsUnderMoratorium = c.CloseDebtsUnderMoratorium, - ConsumptionCategoryToId = c.ConsumptionCategoryTo!=null ? (int?) c.ConsumptionCategoryTo.Id : null, - ConsumptionCategoryToName = c.ConsumptionCategoryTo!=null ? c.ConsumptionCategoryTo.Name : null, - ConsumptionCategoryFromId = c.ConsumptionCategoryFrom!=null ? (int?) c.ConsumptionCategoryFrom.Id : null, - ConsumptionCategoryFromName = c.ConsumptionCategoryFrom!=null ? c.ConsumptionCategoryFrom.Name : null, - PaymentPeriodEnd = c.PaymentPeriodEnd, - PaymentToSupplierPeriodEnd = c.PaymentToSupplierPeriodEnd, - CustomerToId = c.CustomerTo!=null ? (int?) c.CustomerTo.Id : null, - CustomerToName = c.CustomerTo!=null ? c.CustomerTo.Name : null, - CustomerFromId = c.CustomerFrom!=null ? (int?) c.CustomerFrom.Id : null, - CustomerFromName = c.CustomerFrom!=null ? c.CustomerFrom.Name : null, - TaxRatesToId = c.TaxRatesTo!=null ? (int?) c.TaxRatesTo.Id : null, - TaxRatesToName = c.TaxRatesTo!=null ? c.TaxRatesTo.Name : null, - TaxRatesFromId = c.TaxRatesFrom!=null ? (int?) c.TaxRatesFrom.Id : null, - TaxRatesFromName = c.TaxRatesFrom!=null ? c.TaxRatesFrom.Name : null, - PaymentPeriodBegin = c.PaymentPeriodBegin, - PaymentToSupplierPeriodBegin = c.PaymentToSupplierPeriodBegin, - NotReflectReversalOfClosedAdvances = c.NotReflectReversalOfClosedAdvances, - DoNotCreateNewAdvancesInvoices = c.DoNotCreateNewAdvancesInvoices, - NomenclatureId = c.Nomenclature!=null ? (int?) c.Nomenclature.Id : null, - NomenclatureName = c.Nomenclature!=null ? c.Nomenclature.Name : null, - NomenclatureFromId = c.NomenclatureFrom!=null ? (int?) c.NomenclatureFrom.Id : null, - NomenclatureFromName = c.NomenclatureFrom!=null ? c.NomenclatureFrom.Name : null, - PaymentDocumentNumber = c.PaymentDocumentNumber, - ReflectPaymentReversalAsCreditAdvance = c.ReflectPaymentReversalAsCreditAdvance, - RecalculateTaxesOnTheOldAdvanceDocument = c.RecalculateTaxesOnTheOldAdvanceDocument, - CorrectionsPeriod = c.CorrectionsPeriod, - PayerId = c.Payer!=null ? (int?) c.Payer.Id : null, - PayerName = c.Payer!=null ? c.Payer.Name : null, - PayerToId = c.PayerTo!=null ? (int?) c.PayerTo.Id : null, - PayerToName = c.PayerTo!=null ? c.PayerTo.Name : null, - PrivilegeRecipientId = c.PrivilegeRecipient!=null ? (int?) c.PrivilegeRecipient.Id : null, - PrivilegeRecipientName = c.PrivilegeRecipient!=null ? c.PrivilegeRecipient.Name : null, - PrivilegeRecipientFromId = c.PrivilegeRecipientFrom!=null ? (int?) c.PrivilegeRecipientFrom.Id : null, - PrivilegeRecipientFromName = c.PrivilegeRecipientFrom!=null ? c.PrivilegeRecipientFrom.Name : null, - ConsumerId = c.Consumer!=null ? (int?) c.Consumer.Id : null, - ConsumerName = c.Consumer!=null ? c.Consumer.Name : null, - ConsumerFromId = c.ConsumerFrom!=null ? (int?) c.ConsumerFrom.Id : null, - ConsumerFromName = c.ConsumerFrom!=null ? c.ConsumerFrom.Name : null, - DocumentPresentation = c.DocumentPresentation, - RegionId = c.Region!=null ? (int?) c.Region.Id : null, - RegionName = c.Region!=null ? c.Region.Name : null, - RegionFromId = c.RegionFrom!=null ? (int?) c.RegionFrom.Id : null, - RegionFromName = c.RegionFrom!=null ? c.RegionFrom.Name : null, - SaveAdvancesOnTheOldPaymentDocument = c.SaveAdvancesOnTheOldPaymentDocument, - SaveAdvancesSecurities = c.SaveAdvancesSecurities, - ReverseAdvancesOnFIFO = c.ReverseAdvancesOnFIFO, - ReverseOnlyIndicatedDocument = c.ReverseOnlyIndicatedDocument, - Sum = c.Sum, - VatTo = c.VatTo, - VatFrom = c.VatFrom, - SpecifySalesBookCorrectionsPeriodManually = c.SpecifySalesBookCorrectionsPeriodManually, - ComposeAdvanceForFullDocumentSum = c.ComposeAdvanceForFullDocumentSum, - EconomicOperationId = c.EconomicOperation!=null ? (int?) c.EconomicOperation.Id : null, - EconomicOperationName = c.EconomicOperation!=null ? c.EconomicOperation.Name : null, - }); - var result = query.Count(); - } - } - } - } - - public class PaymentTransferDto - { - public Guid ID { get; set; } - - public long Number { get; set; } - - public DateTime Date { get; set; } - - public PaymentTransferOperationType? OperationType { get; set; } - - public GasDeliveryTypes? DeliveryTypeTo { get; set; } - - public GasDeliveryTypes? DeliveryTypeFrom { get; set; } - - public int? EntryCategoryId { get; set; } - - public string EntryCategoryName { get; set; } - - public int? EntryCategoryFromId { get; set; } - - public string EntryCategoryFromName { get; set; } - - public int? SaleCategoryToId{ get; set; } - - public string SaleCategoryToName { get; set; } - - public int? SaleCategoryFromId { get; set; } - - public string SaleCategoryFromName { get; set; } - - public DateTime? ClosedDebtCorrectionsDate { get; set; } - - public DateTime? AdvanceCorrectionsDate { get; set; } - - public DateTime? ReversalAdvanceCorrectionsDate { get; set; } - - public DateTime? ReversalDebtCorrectionsDate { get; set; } - - public DateTime? PaymentDocumentDate { get; set; } - - public int? ContractToId { get; set; } - - public string ContractToName { get; set; } - - public int? ContractFromId { get; set; } - - public string ContractFromName { get; set; } - - public int? PayerContractId { get; set; } - - public string PayerContractName { get; set; } - - public int? PayerContractToId { get; set; } - - public string PayerContractToName { get; set; } - - public bool? BuyerDocument { get; set; } - - public bool? SupplierDocument { get; set; } - - public int? PrivilegesLawId { get; set; } - - public string PrivilegesLawName { get; set; } - - public int? PrivilegesLawFromId { get; set; } - - public string PrivilegesLawFromName { get; set; } - - public bool? CloseRecoveredDebts { get; set; } - - public bool? CloseDebtsUnderMoratorium { get; set; } - - public int? ConsumptionCategoryToId { get; set; } - - public string ConsumptionCategoryToName { get; set; } - - public int? ConsumptionCategoryFromId { get; set; } - - public string ConsumptionCategoryFromName { get; set; } - - public DateTime? PaymentPeriodEnd { get; set; } - - public DateTime? PaymentToSupplierPeriodEnd { get; set; } - - public int? CustomerToId { get; set; } - - public string CustomerToName { get; set; } - - public int? CustomerFromId { get; set; } - - public string CustomerFromName { get; set; } - - public int? TaxRatesToId { get; set; } - - public string TaxRatesToName { get; set; } - - public int? TaxRatesFromId { get; set; } - - public string TaxRatesFromName { get; set; } - - public DateTime? PaymentPeriodBegin { get; set; } - - public DateTime? PaymentToSupplierPeriodBegin { get; set; } - - public bool? NotReflectReversalOfClosedAdvances { get; set; } - - public bool? DoNotCreateNewAdvancesInvoices { get; set; } - - public int? NomenclatureId { get; set; } - - public string NomenclatureName { get; set; } - - public int? NomenclatureFromId { get; set; } - - public string NomenclatureFromName { get; set; } - - public string PaymentDocumentNumber { get; set; } - - public bool? ReflectPaymentReversalAsCreditAdvance { get; set; } - - public bool? RecalculateTaxesOnTheOldAdvanceDocument { get; set; } - - public DateTime? CorrectionsPeriod { get; set; } - - public int? PayerId { get; set; } - - public string PayerName { get; set; } - - public int? PayerToId { get; set; } - - public string PayerToName { get; set; } - - public int? PrivilegeRecipientId { get; set; } - - public string PrivilegeRecipientName { get; set; } - - public int? PrivilegeRecipientFromId { get; set; } - - public string PrivilegeRecipientFromName { get; set; } - - public int? ConsumerId { get; set; } - - public string ConsumerName { get; set; } - - public int? ConsumerFromId { get; set; } - - public string ConsumerFromName { get; set; } - - public string DocumentPresentation { get; set; } - - public int? RegionId { get; set; } - - public string RegionName { get; set; } - - public int? RegionFromId { get; set; } - - public string RegionFromName { get; set; } - - public bool? SaveAdvancesOnTheOldPaymentDocument { get; set; } - - public bool? SaveAdvancesSecurities { get; set; } - - public bool? ReverseAdvancesOnFIFO { get; set; } - - public bool? ReverseOnlyIndicatedDocument { get; set; } - - public decimal? Sum { get; set; } - - public decimal? VatTo { get; set; } - - public decimal? VatFrom { get; set; } - - public bool? SpecifySalesBookCorrectionsPeriodManually { get; set; } - - public bool? ComposeAdvanceForFullDocumentSum { get; set; } - - public int? EconomicOperationId { get; set; } - - public string EconomicOperationName { get; set; } - - public string Name1 { get; set; } - - public string Name2 { get; set; } - - public string Name3 { get; set; } - - public string Name4 { get; set; } - - public string Name5 { get; set; } - - public string Name6 { get; set; } - - public string Name7 { get; set; } - - public string Name8 { get; set; } - } -} +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0835_QueryNestedTooDeep; + +namespace Xtensive.Orm.Tests.Issues_Issue0835_QueryNestedTooDeep +{ + [HierarchyRoot] + public class BaseEntity3 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public class BaseEntity2 : BaseEntity3 + { + } + + public class BaseEntity1 : BaseEntity2 + { + } + + public class BaseEntity : BaseEntity1 + { + } + + public class EconomicOperation : BaseEntity + { + } + public class Region : BaseEntity + { + } + public class Nomenclature : BaseEntity + { + } + public class TaxRates : BaseEntity + { + + } + + public class Customer : BaseEntity + { + } + + public class ConsumptionCategory : BaseEntity + { + } + + public class PrivilegesLaw : BaseEntity + { + } + + public class Contract : BaseEntity + { + } + + public class EntryCategory : BaseEntity + { + } + + public class SaleCategory : BaseEntity + { + } + + public class NamedEntity : BaseEntity + { + } + + [HierarchyRoot] + public class PaymentTransfer : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + public PaymentTransferOperationType? OperationType { get; set; } + + [Field] + public GasDeliveryTypes? DeliveryTypeTo { get; set; } + + [Field] + public GasDeliveryTypes? DeliveryTypeFrom { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public EntryCategory EntryCategory { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public EntryCategory EntryCategoryFrom { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public SaleCategory SaleCategoryTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public SaleCategory SaleCategoryFrom { get; set; } + + [Field] + public DateTime? ClosedDebtCorrectionsDate { get; set; } + + [Field] + public DateTime? AdvanceCorrectionsDate { get; set; } + + [Field] + public DateTime? ReversalAdvanceCorrectionsDate { get; set; } + + [Field] + public DateTime? ReversalDebtCorrectionsDate { get; set; } + + [Field] + public DateTime? PaymentDocumentDate { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public Contract ContractTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public Contract ContractFrom { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field] + public Contract PayerContract { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Contract PayerContractTo { get; set; } + + [Field()] + public bool? BuyerDocument { get; set; } + + [Field()] + public bool? SupplierDocument { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public PrivilegesLaw PrivilegesLaw { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public PrivilegesLaw PrivilegesLawFrom { get; set; } + + [Field()] + public bool? CloseRecoveredDebts { get; set; } + + [Field()] + public bool? CloseDebtsUnderMoratorium { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public ConsumptionCategory ConsumptionCategoryTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public ConsumptionCategory ConsumptionCategoryFrom { get; set; } + + [Field()] + public DateTime? PaymentPeriodEnd { get; set; } + + [Field()] + public DateTime? PaymentToSupplierPeriodEnd { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer CustomerTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer CustomerFrom { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public TaxRates TaxRatesTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public TaxRates TaxRatesFrom { get; set; } + + [Field()] + public DateTime? PaymentPeriodBegin { get; set; } + + [Field()] + public DateTime? PaymentToSupplierPeriodBegin { get; set; } + + [Field()] + public bool? NotReflectReversalOfClosedAdvances { get; set; } + + [Field()] + public bool? DoNotCreateNewAdvancesInvoices { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Nomenclature Nomenclature { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Nomenclature NomenclatureFrom { get; set; } + + [Field(Length = 50)] + public string PaymentDocumentNumber { get; set; } + + [Field()] + public bool? ReflectPaymentReversalAsCreditAdvance { get; set; } + + [Field()] + public bool? RecalculateTaxesOnTheOldAdvanceDocument { get; set; } + + [Field()] + public DateTime? CorrectionsPeriod { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer Payer { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer PayerTo { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer PrivilegeRecipient { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer PrivilegeRecipientFrom { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer Consumer { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Customer ConsumerFrom { get; set; } + + [Field(Length = 100)] + public string DocumentPresentation { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Region Region { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public Region RegionFrom { get; set; } + + [Field()] + public bool? SaveAdvancesOnTheOldPaymentDocument { get; set; } + + [Field()] + public bool? SaveAdvancesSecurities { get; set; } + + [Field()] + public bool? ReverseAdvancesOnFIFO { get; set; } + + [Field()] + public bool? ReverseOnlyIndicatedDocument { get; set; } + + [Field(Precision = 15, Scale = 2)] + public decimal? Sum { get; set; } + + [Field(Precision = 15, Scale = 2)] + public decimal? VatTo { get; set; } + + [Field(Precision = 15, Scale = 2)] + public decimal? VatFrom { get; set; } + + [Field()] + public bool? SpecifySalesBookCorrectionsPeriodManually { get; set; } + + [Field()] + public bool? ComposeAdvanceForFullDocumentSum { get; set; } + + [Association(OnTargetRemove = OnRemoveAction.Clear)] + [Field()] + public EconomicOperation EconomicOperation { get; set; } + + [Field()] + public NamedEntity Entity1{ get; set; } + + [Field()] + public NamedEntity Entity2 { get; set; } + + [Field()] + public NamedEntity Entity3 { get; set; } + + [Field()] + public NamedEntity Entity4 { get; set; } + + [Field()] + public NamedEntity Entity5 { get; set; } + + [Field()] + public NamedEntity Entity6 { get; set; } + + [Field()] + public NamedEntity Entity7 { get; set; } + + [Field()] + public NamedEntity Entity8 { get; set; } + } + + public enum GasDeliveryTypes + { + C, + D + } + + public enum PaymentTransferOperationType + { + A, + B + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0835_QueryNestedTooDeep : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (PaymentTransfer).Assembly, typeof (PaymentTransfer).Namespace); + var systemSession = new SessionConfiguration(WellKnown.Sessions.System); + systemSession.DefaultCommandTimeout = 100; + config.Sessions.Add(systemSession); + return config; + } + + [Test] + public void MainTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "parser stack overflow"); + + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new PaymentTransferDto { + ID = c.Id, + Number = c.Number, + Date = c.Date, + OperationType = (PaymentTransferOperationType?) (int?) c.OperationType, + DeliveryTypeTo = (GasDeliveryTypes?) (int?) c.DeliveryTypeTo, + DeliveryTypeFrom = (GasDeliveryTypes?) (int?) c.DeliveryTypeFrom, + EntryCategoryId = c.EntryCategory!=null ? (int?) c.EntryCategory.Id : null, + EntryCategoryName = c.EntryCategory!=null ? c.EntryCategory.Name : null, + EntryCategoryFromId = c.EntryCategoryFrom!=null ? (int?) c.EntryCategoryFrom.Id : null, + EntryCategoryFromName = c.EntryCategoryFrom!=null ? c.EntryCategoryFrom.Name : null, + SaleCategoryToId = c.SaleCategoryTo!=null ? (int?) c.SaleCategoryTo.Id : null, + SaleCategoryToName = c.SaleCategoryTo!=null ? c.SaleCategoryTo.Name : null, + SaleCategoryFromId = c.SaleCategoryFrom!=null ? (int?) c.SaleCategoryFrom.Id : null, + SaleCategoryFromName = c.SaleCategoryFrom!=null ? c.SaleCategoryFrom.Name : null, + ClosedDebtCorrectionsDate = c.ClosedDebtCorrectionsDate, + AdvanceCorrectionsDate = c.AdvanceCorrectionsDate, + ReversalAdvanceCorrectionsDate = c.ReversalAdvanceCorrectionsDate, + ReversalDebtCorrectionsDate = c.ReversalDebtCorrectionsDate, + PaymentDocumentDate = c.PaymentDocumentDate, + ContractToId = c.ContractTo!=null ? (int?) c.ContractTo.Id : null, + ContractToName = c.ContractTo!=null ? c.ContractTo.Name : null, + ContractFromId = c.ContractFrom!=null ? (int?) c.ContractFrom.Id : null, + ContractFromName = c.ContractFrom!=null ? c.ContractFrom.Name : null, + PayerContractId = c.PayerContract!=null ? (int?) c.PayerContract.Id : null, + PayerContractName = c.PayerContract!=null ? c.PayerContract.Name : null, + PayerContractToId = c.PayerContractTo!=null ? (int?) c.PayerContractTo.Id : null, + PayerContractToName = c.PayerContractTo!=null ? c.PayerContractTo.Name : null, + BuyerDocument = c.BuyerDocument, + SupplierDocument = c.SupplierDocument, + PrivilegesLawId = c.PrivilegesLaw!=null ? (int?) c.PrivilegesLaw.Id : null, + PrivilegesLawName = c.PrivilegesLaw!=null ? c.PrivilegesLaw.Name : null, + PrivilegesLawFromId = c.PrivilegesLawFrom!=null ? (int?) c.PrivilegesLawFrom.Id : null, + PrivilegesLawFromName = c.PrivilegesLawFrom!=null ? c.PrivilegesLawFrom.Name : null, + CloseRecoveredDebts = c.CloseRecoveredDebts, + CloseDebtsUnderMoratorium = c.CloseDebtsUnderMoratorium, + ConsumptionCategoryToId = c.ConsumptionCategoryTo!=null ? (int?) c.ConsumptionCategoryTo.Id : null, + ConsumptionCategoryToName = c.ConsumptionCategoryTo!=null ? c.ConsumptionCategoryTo.Name : null, + ConsumptionCategoryFromId = c.ConsumptionCategoryFrom!=null ? (int?) c.ConsumptionCategoryFrom.Id : null, + ConsumptionCategoryFromName = c.ConsumptionCategoryFrom!=null ? c.ConsumptionCategoryFrom.Name : null, + PaymentPeriodEnd = c.PaymentPeriodEnd, + PaymentToSupplierPeriodEnd = c.PaymentToSupplierPeriodEnd, + CustomerToId = c.CustomerTo!=null ? (int?) c.CustomerTo.Id : null, + CustomerToName = c.CustomerTo!=null ? c.CustomerTo.Name : null, + CustomerFromId = c.CustomerFrom!=null ? (int?) c.CustomerFrom.Id : null, + CustomerFromName = c.CustomerFrom!=null ? c.CustomerFrom.Name : null, + TaxRatesToId = c.TaxRatesTo!=null ? (int?) c.TaxRatesTo.Id : null, + TaxRatesToName = c.TaxRatesTo!=null ? c.TaxRatesTo.Name : null, + TaxRatesFromId = c.TaxRatesFrom!=null ? (int?) c.TaxRatesFrom.Id : null, + TaxRatesFromName = c.TaxRatesFrom!=null ? c.TaxRatesFrom.Name : null, + PaymentPeriodBegin = c.PaymentPeriodBegin, + PaymentToSupplierPeriodBegin = c.PaymentToSupplierPeriodBegin, + NotReflectReversalOfClosedAdvances = c.NotReflectReversalOfClosedAdvances, + DoNotCreateNewAdvancesInvoices = c.DoNotCreateNewAdvancesInvoices, + NomenclatureId = c.Nomenclature!=null ? (int?) c.Nomenclature.Id : null, + NomenclatureName = c.Nomenclature!=null ? c.Nomenclature.Name : null, + NomenclatureFromId = c.NomenclatureFrom!=null ? (int?) c.NomenclatureFrom.Id : null, + NomenclatureFromName = c.NomenclatureFrom!=null ? c.NomenclatureFrom.Name : null, + PaymentDocumentNumber = c.PaymentDocumentNumber, + ReflectPaymentReversalAsCreditAdvance = c.ReflectPaymentReversalAsCreditAdvance, + RecalculateTaxesOnTheOldAdvanceDocument = c.RecalculateTaxesOnTheOldAdvanceDocument, + CorrectionsPeriod = c.CorrectionsPeriod, + PayerId = c.Payer!=null ? (int?) c.Payer.Id : null, + PayerName = c.Payer!=null ? c.Payer.Name : null, + PayerToId = c.PayerTo!=null ? (int?) c.PayerTo.Id : null, + PayerToName = c.PayerTo!=null ? c.PayerTo.Name : null, + PrivilegeRecipientId = c.PrivilegeRecipient!=null ? (int?) c.PrivilegeRecipient.Id : null, + PrivilegeRecipientName = c.PrivilegeRecipient!=null ? c.PrivilegeRecipient.Name : null, + PrivilegeRecipientFromId = c.PrivilegeRecipientFrom!=null ? (int?) c.PrivilegeRecipientFrom.Id : null, + PrivilegeRecipientFromName = c.PrivilegeRecipientFrom!=null ? c.PrivilegeRecipientFrom.Name : null, + ConsumerId = c.Consumer!=null ? (int?) c.Consumer.Id : null, + ConsumerName = c.Consumer!=null ? c.Consumer.Name : null, + ConsumerFromId = c.ConsumerFrom!=null ? (int?) c.ConsumerFrom.Id : null, + ConsumerFromName = c.ConsumerFrom!=null ? c.ConsumerFrom.Name : null, + DocumentPresentation = c.DocumentPresentation, + RegionId = c.Region!=null ? (int?) c.Region.Id : null, + RegionName = c.Region!=null ? c.Region.Name : null, + RegionFromId = c.RegionFrom!=null ? (int?) c.RegionFrom.Id : null, + RegionFromName = c.RegionFrom!=null ? c.RegionFrom.Name : null, + SaveAdvancesOnTheOldPaymentDocument = c.SaveAdvancesOnTheOldPaymentDocument, + SaveAdvancesSecurities = c.SaveAdvancesSecurities, + ReverseAdvancesOnFIFO = c.ReverseAdvancesOnFIFO, + ReverseOnlyIndicatedDocument = c.ReverseOnlyIndicatedDocument, + Sum = c.Sum, + VatTo = c.VatTo, + VatFrom = c.VatFrom, + SpecifySalesBookCorrectionsPeriodManually = c.SpecifySalesBookCorrectionsPeriodManually, + ComposeAdvanceForFullDocumentSum = c.ComposeAdvanceForFullDocumentSum, + EconomicOperationId = c.EconomicOperation!=null ? (int?) c.EconomicOperation.Id : null, + EconomicOperationName = c.EconomicOperation!=null ? c.EconomicOperation.Name : null, + }); + var result = query.Count(); + } + } + } + } + + public class PaymentTransferDto + { + public Guid ID { get; set; } + + public long Number { get; set; } + + public DateTime Date { get; set; } + + public PaymentTransferOperationType? OperationType { get; set; } + + public GasDeliveryTypes? DeliveryTypeTo { get; set; } + + public GasDeliveryTypes? DeliveryTypeFrom { get; set; } + + public int? EntryCategoryId { get; set; } + + public string EntryCategoryName { get; set; } + + public int? EntryCategoryFromId { get; set; } + + public string EntryCategoryFromName { get; set; } + + public int? SaleCategoryToId{ get; set; } + + public string SaleCategoryToName { get; set; } + + public int? SaleCategoryFromId { get; set; } + + public string SaleCategoryFromName { get; set; } + + public DateTime? ClosedDebtCorrectionsDate { get; set; } + + public DateTime? AdvanceCorrectionsDate { get; set; } + + public DateTime? ReversalAdvanceCorrectionsDate { get; set; } + + public DateTime? ReversalDebtCorrectionsDate { get; set; } + + public DateTime? PaymentDocumentDate { get; set; } + + public int? ContractToId { get; set; } + + public string ContractToName { get; set; } + + public int? ContractFromId { get; set; } + + public string ContractFromName { get; set; } + + public int? PayerContractId { get; set; } + + public string PayerContractName { get; set; } + + public int? PayerContractToId { get; set; } + + public string PayerContractToName { get; set; } + + public bool? BuyerDocument { get; set; } + + public bool? SupplierDocument { get; set; } + + public int? PrivilegesLawId { get; set; } + + public string PrivilegesLawName { get; set; } + + public int? PrivilegesLawFromId { get; set; } + + public string PrivilegesLawFromName { get; set; } + + public bool? CloseRecoveredDebts { get; set; } + + public bool? CloseDebtsUnderMoratorium { get; set; } + + public int? ConsumptionCategoryToId { get; set; } + + public string ConsumptionCategoryToName { get; set; } + + public int? ConsumptionCategoryFromId { get; set; } + + public string ConsumptionCategoryFromName { get; set; } + + public DateTime? PaymentPeriodEnd { get; set; } + + public DateTime? PaymentToSupplierPeriodEnd { get; set; } + + public int? CustomerToId { get; set; } + + public string CustomerToName { get; set; } + + public int? CustomerFromId { get; set; } + + public string CustomerFromName { get; set; } + + public int? TaxRatesToId { get; set; } + + public string TaxRatesToName { get; set; } + + public int? TaxRatesFromId { get; set; } + + public string TaxRatesFromName { get; set; } + + public DateTime? PaymentPeriodBegin { get; set; } + + public DateTime? PaymentToSupplierPeriodBegin { get; set; } + + public bool? NotReflectReversalOfClosedAdvances { get; set; } + + public bool? DoNotCreateNewAdvancesInvoices { get; set; } + + public int? NomenclatureId { get; set; } + + public string NomenclatureName { get; set; } + + public int? NomenclatureFromId { get; set; } + + public string NomenclatureFromName { get; set; } + + public string PaymentDocumentNumber { get; set; } + + public bool? ReflectPaymentReversalAsCreditAdvance { get; set; } + + public bool? RecalculateTaxesOnTheOldAdvanceDocument { get; set; } + + public DateTime? CorrectionsPeriod { get; set; } + + public int? PayerId { get; set; } + + public string PayerName { get; set; } + + public int? PayerToId { get; set; } + + public string PayerToName { get; set; } + + public int? PrivilegeRecipientId { get; set; } + + public string PrivilegeRecipientName { get; set; } + + public int? PrivilegeRecipientFromId { get; set; } + + public string PrivilegeRecipientFromName { get; set; } + + public int? ConsumerId { get; set; } + + public string ConsumerName { get; set; } + + public int? ConsumerFromId { get; set; } + + public string ConsumerFromName { get; set; } + + public string DocumentPresentation { get; set; } + + public int? RegionId { get; set; } + + public string RegionName { get; set; } + + public int? RegionFromId { get; set; } + + public string RegionFromName { get; set; } + + public bool? SaveAdvancesOnTheOldPaymentDocument { get; set; } + + public bool? SaveAdvancesSecurities { get; set; } + + public bool? ReverseAdvancesOnFIFO { get; set; } + + public bool? ReverseOnlyIndicatedDocument { get; set; } + + public decimal? Sum { get; set; } + + public decimal? VatTo { get; set; } + + public decimal? VatFrom { get; set; } + + public bool? SpecifySalesBookCorrectionsPeriodManually { get; set; } + + public bool? ComposeAdvanceForFullDocumentSum { get; set; } + + public int? EconomicOperationId { get; set; } + + public string EconomicOperationName { get; set; } + + public string Name1 { get; set; } + + public string Name2 { get; set; } + + public string Name3 { get; set; } + + public string Name4 { get; set; } + + public string Name5 { get; set; } + + public string Name6 { get; set; } + + public string Name7 { get; set; } + + public string Name8 { get; set; } + } +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0839_MultithreadingBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0839_MultithreadingBug.cs index b7b50d2e76..8e961ec0a7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0839_MultithreadingBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0839_MultithreadingBug.cs @@ -1,141 +1,141 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.10.14 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0839_MultithreadingBug_Model; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.Issue0839_MultithreadingBug_Model -{ - [Serializable] - [HierarchyRoot] - [Index("NextRun")] - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public DateTime NextRun { get; set; } - } - - [Serializable] - [Index("Text", Unique = true)] - public class UniqueTextEntity : BaseEntity - { - [Field(Length = 100)] - public string Text { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0839_MultithreadingBug : AutoBuildTest - { - private static bool stopThread = false; - private const int threadCount = 2; - private const int entityCount = 20; - private const int readCount = 20; - - private static object exceptionLock = new object(); - private static int exceptionCount; - private static Key[] keys = new Key[entityCount]; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (BaseEntity).Assembly, typeof(BaseEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - for (int i = 0; i < entityCount; ++i) { - var entity = new UniqueTextEntity { Text = "Test" + i }; - keys[i] = entity.Key; - } - tx.Complete(); - } - } - - var threads = new Thread[threadCount]; - - Console.WriteLine("Starting {0} threads...", threadCount); - for (int i = 0; i(key); - } - tx.Complete(); - } - } - catch (Exception error) { - var currentError = error; - bool notImportantException = false; - while (currentError!=null) { - if (currentError is ThreadAbortException) - return; - notImportantException = - currentError is ReprocessableException || - currentError is OperationTimeoutException || - currentError is UniqueConstraintViolationException || - (currentError is StorageException && currentError.Message.Contains("This SqlTransaction has completed")); - if (notImportantException) - break; - currentError = currentError.InnerException; - } - if (notImportantException) - continue; - - lock (exceptionLock) { - ++exceptionCount; - Console.WriteLine("Exception #{0}:", exceptionCount); - Console.WriteLine("{0}", error.ToString().Indent(2)); - Console.WriteLine(); - } - } - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.10.14 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0839_MultithreadingBug_Model; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.Issue0839_MultithreadingBug_Model +{ + [Serializable] + [HierarchyRoot] + [Index("NextRun")] + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public DateTime NextRun { get; set; } + } + + [Serializable] + [Index("Text", Unique = true)] + public class UniqueTextEntity : BaseEntity + { + [Field(Length = 100)] + public string Text { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0839_MultithreadingBug : AutoBuildTest + { + private static bool stopThread = false; + private const int threadCount = 2; + private const int entityCount = 20; + private const int readCount = 20; + + private static object exceptionLock = new object(); + private static int exceptionCount; + private static Key[] keys = new Key[entityCount]; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (BaseEntity).Assembly, typeof(BaseEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + for (int i = 0; i < entityCount; ++i) { + var entity = new UniqueTextEntity { Text = "Test" + i }; + keys[i] = entity.Key; + } + tx.Complete(); + } + } + + var threads = new Thread[threadCount]; + + Console.WriteLine("Starting {0} threads...", threadCount); + for (int i = 0; i(key); + } + tx.Complete(); + } + } + catch (Exception error) { + var currentError = error; + bool notImportantException = false; + while (currentError!=null) { + if (currentError is ThreadAbortException) + return; + notImportantException = + currentError is ReprocessableException || + currentError is OperationTimeoutException || + currentError is UniqueConstraintViolationException || + (currentError is StorageException && currentError.Message.Contains("This SqlTransaction has completed")); + if (notImportantException) + break; + currentError = currentError.InnerException; + } + if (notImportantException) + continue; + + lock (exceptionLock) { + ++exceptionCount; + Console.WriteLine("Exception #{0}:", exceptionCount); + Console.WriteLine("{0}", error.ToString().Indent(2)); + Console.WriteLine(); + } + } + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0844_GroupByConstant.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0844_GroupByConstant.cs index 0f16cf039e..ef0776b1b3 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0844_GroupByConstant.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0844_GroupByConstant.cs @@ -1,45 +1,45 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0844_GroupByConstant; - -namespace Xtensive.Orm.Tests.Issues_Issue0844_GroupByConstant -{ - [HierarchyRoot] - public class Line : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Length { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class Issue0844_GroupByConstant : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionn = session.OpenTransaction()) { - var query = session.Query.All().GroupBy(x => 0); - var result = query.ToList(); - } - } - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0844_GroupByConstant; + +namespace Xtensive.Orm.Tests.Issues_Issue0844_GroupByConstant +{ + [HierarchyRoot] + public class Line : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Length { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class Issue0844_GroupByConstant : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionn = session.OpenTransaction()) { + var query = session.Query.All().GroupBy(x => 0); + var result = query.ToList(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0845_KeyTypeAccessBug.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0845_KeyTypeAccessBug.cs index 5ab0feb4bb..3ff2837a87 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0845_KeyTypeAccessBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0845_KeyTypeAccessBug.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.10.27 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0845_KeyTypeAccessBug_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0845_KeyTypeAccessBug_Model -{ - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - // There must be a descendant to make this test fall - public class Employee : Person - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0845_KeyTypeAccessBug : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var key = Key.Create(Domain, 999); // Key of non-existing entity - - Assert.IsNull(session.Query.SingleOrDefault(key)); - AssertEx.ThrowsInvalidOperationException(() => { - var type = key.ResolveTypeInfo(session); - }); - - tx.Complete(); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.10.27 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0845_KeyTypeAccessBug_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0845_KeyTypeAccessBug_Model +{ + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + // There must be a descendant to make this test fall + public class Employee : Person + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0845_KeyTypeAccessBug : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var key = Key.Create(Domain, 999); // Key of non-existing entity + + Assert.IsNull(session.Query.SingleOrDefault(key)); + AssertEx.ThrowsInvalidOperationException(() => { + var type = key.ResolveTypeInfo(session); + }); + + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0847_IsOperator.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0847_IsOperator.cs index dc849d80f1..5efcbc6255 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0847_IsOperator.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0847_IsOperator.cs @@ -1,79 +1,79 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues_Issue0847_IsOperator; - -namespace Xtensive.Orm.Tests.Issues_Issue0847_IsOperator -{ - public enum Activity - { - Blogging, - Reading, - Emailing, - Buzzing, - Chatting, - Unknown - } - - [HierarchyRoot] - public class Developer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public interface IAmSoloProfessional : IEntity - { - [Field] - Activity CurrentActivity { get; set; } - } - - public sealed class Alex : Developer, IAmSoloProfessional - { - public Activity CurrentActivity { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0847_IsOperator : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Alex).Assembly, typeof (Alex).Namespace); - return config; - } - - [Test] - public void IsTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionn = session.OpenTransaction()) { - var alex = new Alex(); - session.SaveChanges(); - var query = session.Query.All().Select(developer => new {IsSoloProfessional = developer is IAmSoloProfessional}).ToArray(); - Assert.AreEqual(1, query.Length); - Assert.AreEqual(true, query[0].IsSoloProfessional); - } - } - } - - [Test] - public void AsTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionn = session.OpenTransaction()) { - var alex = new Alex(); - session.SaveChanges(); - var query = session.Query.All().Select(developer => new {SoloProfessional = developer as IAmSoloProfessional}).ToArray(); - Assert.AreEqual(1, query.Length); - Assert.AreSame(alex, query[0].SoloProfessional); - } - } - } - } +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues_Issue0847_IsOperator; + +namespace Xtensive.Orm.Tests.Issues_Issue0847_IsOperator +{ + public enum Activity + { + Blogging, + Reading, + Emailing, + Buzzing, + Chatting, + Unknown + } + + [HierarchyRoot] + public class Developer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public interface IAmSoloProfessional : IEntity + { + [Field] + Activity CurrentActivity { get; set; } + } + + public sealed class Alex : Developer, IAmSoloProfessional + { + public Activity CurrentActivity { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0847_IsOperator : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Alex).Assembly, typeof (Alex).Namespace); + return config; + } + + [Test] + public void IsTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionn = session.OpenTransaction()) { + var alex = new Alex(); + session.SaveChanges(); + var query = session.Query.All().Select(developer => new {IsSoloProfessional = developer is IAmSoloProfessional}).ToArray(); + Assert.AreEqual(1, query.Length); + Assert.AreEqual(true, query[0].IsSoloProfessional); + } + } + } + + [Test] + public void AsTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionn = session.OpenTransaction()) { + var alex = new Alex(); + session.SaveChanges(); + var query = session.Query.All().Select(developer => new {SoloProfessional = developer as IAmSoloProfessional}).ToArray(); + Assert.AreEqual(1, query.Length); + Assert.AreSame(alex, query[0].SoloProfessional); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0851_AnyMappingError.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0851_AnyMappingError.cs index d1c20bbb27..64f8c8a644 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0851_AnyMappingError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0851_AnyMappingError.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2010.10.22 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0851_AnyMappingError_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0851_AnyMappingError_Model -{ - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - - public interface IHasItems : IEntity - { - [Field] - EntitySet Items { get; } - } - - [HierarchyRoot] - public class ReferenceContainer : Entity, IHasItems - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Items { get; private set; } - } - - - [HierarchyRoot] - public class Reference : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Item Item { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue0851_AnyMappingError : AutoBuildTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.ProviderIsNot(StorageProvider.Oracle); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (IHasItems).Assembly, typeof (IHasItems).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - - var item = new Item(); - var referenceContainer1 = new ReferenceContainer(); - var referenceContainer2 = new ReferenceContainer{Items = {new Reference {Item = item}}}; - - session.SaveChanges(); - var l = session.Query.All() - .Where(container => container.Items.Any()) - .ToList(); - - Assert.AreEqual(1, l.Count); - } - } - } - } -} +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2010.10.22 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0851_AnyMappingError_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0851_AnyMappingError_Model +{ + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + + public interface IHasItems : IEntity + { + [Field] + EntitySet Items { get; } + } + + [HierarchyRoot] + public class ReferenceContainer : Entity, IHasItems + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Items { get; private set; } + } + + + [HierarchyRoot] + public class Reference : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Item Item { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue0851_AnyMappingError : AutoBuildTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.ProviderIsNot(StorageProvider.Oracle); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (IHasItems).Assembly, typeof (IHasItems).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + + var item = new Item(); + var referenceContainer1 = new ReferenceContainer(); + var referenceContainer2 = new ReferenceContainer{Items = {new Reference {Item = item}}}; + + session.SaveChanges(); + var l = session.Query.All() + .Where(container => container.Items.Any()) + .ToList(); + + Assert.AreEqual(1, l.Count); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue0860_DateTimeDate.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue0860_DateTimeDate.cs index ed3ee73cbe..9fa9b6ef49 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue0860_DateTimeDate.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue0860_DateTimeDate.cs @@ -1,58 +1,58 @@ -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.Issue0860_DateTimeDateModel; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace Issue0860_DateTimeDateModel - { - [HierarchyRoot] - public class Document : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime DateTime1 { get; set; } - - [Field] - public DateTime DateTime2 { get; set; } - } - } - - public class Issue0860_DateTimeDate : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var random = RandomManager.CreateRandom(); - var randomDate = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(random); - var date = randomDate.Date; - var document = new Document {DateTime1 = randomDate, DateTime2 = date}; - session.SaveChanges(); - - var query = - from d in Query.All() - where d.DateTime1.Date==d.DateTime2 - select d; - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - } - } - } - } +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.Issue0860_DateTimeDateModel; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace Issue0860_DateTimeDateModel + { + [HierarchyRoot] + public class Document : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime DateTime1 { get; set; } + + [Field] + public DateTime DateTime2 { get; set; } + } + } + + public class Issue0860_DateTimeDate : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var random = RandomManager.CreateRandom(); + var randomDate = InstanceGeneratorProvider.Default.GetInstanceGenerator().GetInstance(random); + var date = randomDate.Date; + var document = new Document {DateTime1 = randomDate, DateTime2 = date}; + session.SaveChanges(); + + var query = + from d in Query.All() + where d.DateTime1.Date==d.DateTime2 + select d; + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue679,681_EntitySetRelatedBugs.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue679,681_EntitySetRelatedBugs.cs index 90466c97d8..715c0f832a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue679,681_EntitySetRelatedBugs.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue679,681_EntitySetRelatedBugs.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.01.19 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue679And681; - -namespace Xtensive.Orm.Tests.Issues.Issue679And681 -{ - [HierarchyRoot] - public class Doctor : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 50)] - public string FullName { get; set; } - - [Field] - public string Email { get; set; } - - [Field] - [Association(PairTo = "Doctors")] - public EntitySet Specialities { get; private set; } - } - - [HierarchyRoot] - public class Speciality : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 50)] - public string Title { get; set; } - - [Field] - public bool Activ { get; set; } - - [Field] - // [Association(PairTo = "Specialities")] // Must lead to an exception! - public EntitySet Doctors { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue679And681Test : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Doctor).Assembly, typeof (Doctor).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var s1 = new Speciality { - Title = "Speciality1" - }; - var d1 = new Doctor { - FullName = "Doctor1", - Email = "email1@host.com" - }; - var d2 = new Doctor { - FullName = "Doctor2", - Email = "email2@host.com" - }; - d1.Specialities.Add(s1); - d2.Specialities.Add(s1); - t.Complete(); - } - } - Assert.IsTrue(true); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var speciality = session.Query.All().First(); - var list = - from doctor in speciality.Doctors - select new { - speciality.Title, - doctor.FullName, - doctor.Email - }; - - foreach (var item in list) { - Console.WriteLine("{0} {1} {2}", - item.Title, item.FullName, item.Email); - } - Assert.AreEqual(2, list.Count()); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.01.19 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue679And681; + +namespace Xtensive.Orm.Tests.Issues.Issue679And681 +{ + [HierarchyRoot] + public class Doctor : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 50)] + public string FullName { get; set; } + + [Field] + public string Email { get; set; } + + [Field] + [Association(PairTo = "Doctors")] + public EntitySet Specialities { get; private set; } + } + + [HierarchyRoot] + public class Speciality : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 50)] + public string Title { get; set; } + + [Field] + public bool Activ { get; set; } + + [Field] + // [Association(PairTo = "Specialities")] // Must lead to an exception! + public EntitySet Doctors { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue679And681Test : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Doctor).Assembly, typeof (Doctor).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var s1 = new Speciality { + Title = "Speciality1" + }; + var d1 = new Doctor { + FullName = "Doctor1", + Email = "email1@host.com" + }; + var d2 = new Doctor { + FullName = "Doctor2", + Email = "email2@host.com" + }; + d1.Specialities.Add(s1); + d2.Specialities.Add(s1); + t.Complete(); + } + } + Assert.IsTrue(true); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var speciality = session.Query.All().First(); + var list = + from doctor in speciality.Doctors + select new { + speciality.Title, + doctor.FullName, + doctor.Email + }; + + foreach (var item in list) { + Console.WriteLine("{0} {1} {2}", + item.Title, item.FullName, item.Email); + } + Assert.AreEqual(2, list.Count()); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA363_WrongInnerJoin.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA363_WrongInnerJoin.cs index 3974971fad..3f9e704562 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA363_WrongInnerJoin.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA363_WrongInnerJoin.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.01.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA363_WrongInnerJoin_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA363_WrongInnerJoin_Model - { - [Serializable] - [HierarchyRoot] - public abstract class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - [HierarchyRoot] - public class SomeEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - } - - public class MyEntityWithLink : MyEntity - { - [Field(Nullable = false)] - public SomeEntity Link { get; set; } - } - - public class MyEntityWithText : MyEntity - { - [Field] - public string SomeData { get; set; } - } - } - - [Serializable] - public class IssueA363_WrongInnerJoin : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var se1 = new SomeEntity {Text = "se1"}; - var se2 = new SomeEntity {Text = "se2"}; - - var mie1 = new MyEntityWithLink {Link = se1, Text = "MyEntityWithLink"}; - var mie2 = new MyEntityWithLink {Link = se2, Text = "MyEntityWithLink"}; - var mihe2 = new MyEntityWithText {SomeData = "ololo", Text = "MyEntityWithText"}; - - // if MyEntityWithLink.SomeEntity - decorated with [Field(Nullable = false)] - there are no MyEntityWithText data - // if MyEntityWithLink.SomeEntity - decorated with [Field(Nullable = true)] - ok - var items = Query.All().OrderBy(a => a.Id) - .Select(q => (q as MyEntityWithLink!=null) - ? new {d = (q as MyEntityWithLink).Link.Text} - : new {d = (q as MyEntityWithText).SomeData}); - var result = items.ToList(); - t.Complete(); - - Assert.AreEqual(3, result.Count); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.01.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA363_WrongInnerJoin_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA363_WrongInnerJoin_Model + { + [Serializable] + [HierarchyRoot] + public abstract class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + [HierarchyRoot] + public class SomeEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + } + + public class MyEntityWithLink : MyEntity + { + [Field(Nullable = false)] + public SomeEntity Link { get; set; } + } + + public class MyEntityWithText : MyEntity + { + [Field] + public string SomeData { get; set; } + } + } + + [Serializable] + public class IssueA363_WrongInnerJoin : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var se1 = new SomeEntity {Text = "se1"}; + var se2 = new SomeEntity {Text = "se2"}; + + var mie1 = new MyEntityWithLink {Link = se1, Text = "MyEntityWithLink"}; + var mie2 = new MyEntityWithLink {Link = se2, Text = "MyEntityWithLink"}; + var mihe2 = new MyEntityWithText {SomeData = "ololo", Text = "MyEntityWithText"}; + + // if MyEntityWithLink.SomeEntity - decorated with [Field(Nullable = false)] - there are no MyEntityWithText data + // if MyEntityWithLink.SomeEntity - decorated with [Field(Nullable = true)] - ok + var items = Query.All().OrderBy(a => a.Id) + .Select(q => (q as MyEntityWithLink!=null) + ? new {d = (q as MyEntityWithLink).Link.Text} + : new {d = (q as MyEntityWithText).SomeData}); + var result = items.ToList(); + t.Complete(); + + Assert.AreEqual(3, result.Count); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA399_SetPropertyForPrivatePropertiesOfInheritors.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA399_SetPropertyForPrivatePropertiesOfInheritors.cs index fb1476c45c..20befbc671 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA399_SetPropertyForPrivatePropertiesOfInheritors.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA399_SetPropertyForPrivatePropertiesOfInheritors.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.07 - -using System; -using System.Diagnostics; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA399_SetPropertyForPrivatePropertiesOfInheritors_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA399_SetPropertyForPrivatePropertiesOfInheritors_Model - { - public abstract class Base : Entity - { - [Field] - public string Foo { get; private set; } - } - - [HierarchyRoot] - public class Derived : Base - { - [Field, Key] - public long Id { get; private set; } - - [Field] - private int Bar { get; set; } - } - } - - [Serializable] - public class IssueA399_SetPropertyForPrivatePropertiesOfInheritors : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Derived).Assembly, typeof (Derived).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var derived = new Derived(); - -// Assert.AreEqual("FOO", derived.Foo); -// Assert.AreEqual(100500, derived.GetProperty("Bar")); - - derived.SetProperty("Foo", "foo!!!"); - derived.SetProperty("Bar", 9000); - - Assert.AreEqual("foo!!!", derived.Foo); - Assert.AreEqual(9000, derived.GetProperty("Bar")); - - derived["Foo"] = "!!!foo!!!"; - derived["Bar"] = 9; - - Assert.AreEqual("!!!foo!!!", derived["Foo"]); - Assert.AreEqual(9, derived["Bar"]); - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.07 + +using System; +using System.Diagnostics; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA399_SetPropertyForPrivatePropertiesOfInheritors_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA399_SetPropertyForPrivatePropertiesOfInheritors_Model + { + public abstract class Base : Entity + { + [Field] + public string Foo { get; private set; } + } + + [HierarchyRoot] + public class Derived : Base + { + [Field, Key] + public long Id { get; private set; } + + [Field] + private int Bar { get; set; } + } + } + + [Serializable] + public class IssueA399_SetPropertyForPrivatePropertiesOfInheritors : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Derived).Assembly, typeof (Derived).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var derived = new Derived(); + +// Assert.AreEqual("FOO", derived.Foo); +// Assert.AreEqual(100500, derived.GetProperty("Bar")); + + derived.SetProperty("Foo", "foo!!!"); + derived.SetProperty("Bar", 9000); + + Assert.AreEqual("foo!!!", derived.Foo); + Assert.AreEqual(9000, derived.GetProperty("Bar")); + + derived["Foo"] = "!!!foo!!!"; + derived["Bar"] = 9; + + Assert.AreEqual("!!!foo!!!", derived["Foo"]); + Assert.AreEqual(9, derived["Bar"]); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA401_AmbiguousMatchFoundException.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA401_AmbiguousMatchFoundException.cs index 6a56cff8d7..a5132b87e0 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA401_AmbiguousMatchFoundException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA401_AmbiguousMatchFoundException.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.07 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA401_AmbiguousMatchFoundException_Model; -using System.Linq; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA401_AmbiguousMatchFoundException_Model - { - [HierarchyRoot] - public class ConcreteEntity : Entity - { - [Field,Key] - public long Id { get; private set; } - [Field, NotNullConstraint] - public AbstractEntity Foo { get; set; } - - public ConcreteEntity(AbstractEntity foo) - { - Foo = foo; - } - } - - [HierarchyRoot] - public abstract class AbstractEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - public class Some : AbstractEntity - { - - } - } - - [Serializable] - public class IssueA401_AmbiguousMatchFoundException - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(ConcreteEntity).Assembly, typeof(ConcreteEntity).Namespace); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var concrete = new ConcreteEntity(new Some()); - - var result = Query.All().ToList(); - Assert.AreEqual(1, result.Count); - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.07 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA401_AmbiguousMatchFoundException_Model; +using System.Linq; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA401_AmbiguousMatchFoundException_Model + { + [HierarchyRoot] + public class ConcreteEntity : Entity + { + [Field,Key] + public long Id { get; private set; } + [Field, NotNullConstraint] + public AbstractEntity Foo { get; set; } + + public ConcreteEntity(AbstractEntity foo) + { + Foo = foo; + } + } + + [HierarchyRoot] + public abstract class AbstractEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + public class Some : AbstractEntity + { + + } + } + + [Serializable] + public class IssueA401_AmbiguousMatchFoundException + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(ConcreteEntity).Assembly, typeof(ConcreteEntity).Namespace); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var concrete = new ConcreteEntity(new Some()); + + var result = Query.All().ToList(); + Assert.AreEqual(1, result.Count); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA408_TargetException.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA408_TargetException.cs index 767a23b892..a1500bff4f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA408_TargetException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA408_TargetException.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.07 - -using System; -using System.Diagnostics; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA408_TargetException_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA408_TargetException_Model - { - [HierarchyRoot] - public class Some : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public uint Tag { get; set; } - - [Field] - public Struct Structure { get; set; } - - [Field] - public Ref Reference { get; set; } - } - - public class Struct: Structure - { - [Field] - public uint Tag { get; set; } - } - - [HierarchyRoot] - public class Ref : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public uint Tag { get; set; } - } - } - - [Serializable] - public class IssueA408_TargetException : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Some).Assembly, typeof (Some).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) - { - var some = new Some {Tag = 100500, Reference = new Ref{Tag = 9000}, Structure = new Struct{Tag = 777}}; - var tagObject = some.GetProperty("Tag"); - var tagValue = some.GetProperty("Tag"); - var tagIndexed = some["Tag"]; - AssertEx.Throws(() => some.GetProperty("Tag")); - Assert.AreEqual(100500, tagValue); - Assert.AreEqual(100500, (uint)tagObject); - Assert.AreEqual(100500, (uint)tagIndexed); - - var refObject = some.GetProperty("Reference.Tag"); - var refValue = some.Reference.Tag; - Assert.AreEqual(9000, refValue); - Assert.AreEqual(9000, (uint)refObject); - - var strObject = some.GetProperty("Structure.Tag"); - var strValue = some.Structure.Tag; - Assert.AreEqual(777, strValue); - Assert.AreEqual(777, (uint)strObject); - - some.SetProperty("Tag", 111u); - some.SetProperty("Reference.Tag", 111u); - some.SetProperty("Structure.Tag", 111u); - - Assert.AreEqual(111u, some.Tag); - Assert.AreEqual(111u, some.Reference.Tag); - Assert.AreEqual(111u, some.Structure.Tag); - - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.07 + +using System; +using System.Diagnostics; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA408_TargetException_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA408_TargetException_Model + { + [HierarchyRoot] + public class Some : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public uint Tag { get; set; } + + [Field] + public Struct Structure { get; set; } + + [Field] + public Ref Reference { get; set; } + } + + public class Struct: Structure + { + [Field] + public uint Tag { get; set; } + } + + [HierarchyRoot] + public class Ref : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public uint Tag { get; set; } + } + } + + [Serializable] + public class IssueA408_TargetException : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Some).Assembly, typeof (Some).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) + { + var some = new Some {Tag = 100500, Reference = new Ref{Tag = 9000}, Structure = new Struct{Tag = 777}}; + var tagObject = some.GetProperty("Tag"); + var tagValue = some.GetProperty("Tag"); + var tagIndexed = some["Tag"]; + AssertEx.Throws(() => some.GetProperty("Tag")); + Assert.AreEqual(100500, tagValue); + Assert.AreEqual(100500, (uint)tagObject); + Assert.AreEqual(100500, (uint)tagIndexed); + + var refObject = some.GetProperty("Reference.Tag"); + var refValue = some.Reference.Tag; + Assert.AreEqual(9000, refValue); + Assert.AreEqual(9000, (uint)refObject); + + var strObject = some.GetProperty("Structure.Tag"); + var strValue = some.Structure.Tag; + Assert.AreEqual(777, strValue); + Assert.AreEqual(777, (uint)strObject); + + some.SetProperty("Tag", 111u); + some.SetProperty("Reference.Tag", 111u); + some.SetProperty("Structure.Tag", 111u); + + Assert.AreEqual(111u, some.Tag); + Assert.AreEqual(111u, some.Reference.Tag); + Assert.AreEqual(111u, some.Structure.Tag); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA413_KeyNotFoundException.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA413_KeyNotFoundException.cs index acf361d6b1..1ddce41f18 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA413_KeyNotFoundException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA413_KeyNotFoundException.cs @@ -1,150 +1,150 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.02 - -using System; -using System.Linq; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA413_KeyNotFoundException_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA413_KeyNotFoundException_Model - { - [HierarchyRoot] - public class A : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public B B { get; set; } - - [Field] - public string Tag { get; set; } - } - - [HierarchyRoot] - public class B : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public IItem Item { get; set; } - } - - public interface IItem : IEntity - { - [Field] - string Name { get; set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public long Id { get; private set; } - - public string Name { get; set; } - } - - [HierarchyRoot] - public class My : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyStatus Status { get; set; } // Enum - } - - public enum MyStatus - { - None, - Open, - Closed - } - - public class MyEntityViewModel - { - public string Status { get; set; } - - public MyEntityViewModel(MyStatus status) - { - Status = status.ToString(); - } - } - - /*public class MyEntity : Entity { - [Field] - public MyStatus Status { get; set; } // Enum - } - - - - ... - var x = from e in Session.Query.All() select new MyEntitiyViewModel(e.Status)*/ - } - - [Serializable] - public class IssueA413_KeyNotFoundException : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (IItem).Assembly, typeof (IItem).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new A {Tag = "Alpha", B = new B {Item = new Item {Name = "Item name"}}}; - t.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var query = - from a in Query.All() - where a.Tag == "Alpha" - group a by a.B into g - select new { g.Key.Item.Name, Count = g.Count() }; - var list = query.ToList(); - Assert.AreEqual(1, list.Count); - Assert.AreEqual("Item name", list.Single().Name); - Assert.AreEqual(1, list.Single().Count); - - t.Complete(); - } - } - - [Test] - public void EnumTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new My {Status = MyStatus.Closed}; - t.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var x = from e in Query.All() - select new MyEntityViewModel(e.Status); - var list = x.ToList(); - Assert.AreEqual(1, list.Count); - Assert.AreEqual("Closed", list.Single().Status); - t.Complete(); - } - - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.02 + +using System; +using System.Linq; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA413_KeyNotFoundException_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA413_KeyNotFoundException_Model + { + [HierarchyRoot] + public class A : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public B B { get; set; } + + [Field] + public string Tag { get; set; } + } + + [HierarchyRoot] + public class B : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public IItem Item { get; set; } + } + + public interface IItem : IEntity + { + [Field] + string Name { get; set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public long Id { get; private set; } + + public string Name { get; set; } + } + + [HierarchyRoot] + public class My : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyStatus Status { get; set; } // Enum + } + + public enum MyStatus + { + None, + Open, + Closed + } + + public class MyEntityViewModel + { + public string Status { get; set; } + + public MyEntityViewModel(MyStatus status) + { + Status = status.ToString(); + } + } + + /*public class MyEntity : Entity { + [Field] + public MyStatus Status { get; set; } // Enum + } + + + + ... + var x = from e in Session.Query.All() select new MyEntitiyViewModel(e.Status)*/ + } + + [Serializable] + public class IssueA413_KeyNotFoundException : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (IItem).Assembly, typeof (IItem).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new A {Tag = "Alpha", B = new B {Item = new Item {Name = "Item name"}}}; + t.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var query = + from a in Query.All() + where a.Tag == "Alpha" + group a by a.B into g + select new { g.Key.Item.Name, Count = g.Count() }; + var list = query.ToList(); + Assert.AreEqual(1, list.Count); + Assert.AreEqual("Item name", list.Single().Name); + Assert.AreEqual(1, list.Single().Count); + + t.Complete(); + } + } + + [Test] + public void EnumTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new My {Status = MyStatus.Closed}; + t.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var x = from e in Query.All() + select new MyEntityViewModel(e.Status); + var list = x.ToList(); + Assert.AreEqual(1, list.Count); + Assert.AreEqual("Closed", list.Single().Status); + t.Complete(); + } + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA418_UnableToCompileModelWithPersistentInterface.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA418_UnableToCompileModelWithPersistentInterface.cs index f0d84d50df..89e8dbcbe0 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA418_UnableToCompileModelWithPersistentInterface.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA418_UnableToCompileModelWithPersistentInterface.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.08 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueA418_UnableToCompileModelWithPersistentInterface_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA418_UnableToCompileModelWithPersistentInterface_Model - { - public interface IWithReference : IEntity - { - [Association(OnTargetRemove = OnRemoveAction.Cascade)] - [Field(Nullable = false)] - Reference Reference { get; set; } - } - - [HierarchyRoot] - public class SomeWithReference : Entity, IWithReference - { - [Field, Key] - public long Id { get; private set; } - - [Field(NullableOnUpgrade = true, Nullable = false)] - public Reference Reference { get; set; } - } - - [HierarchyRoot] - public class Reference : Entity - { - [Field, Key] - public long Id { get; private set; } - } - } - - [Serializable] - public class IssueA418_UnableToCompileModelWithPersistentInterface - { - [Test] - public void MainTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof (IWithReference).Assembly, typeof (IWithReference).Namespace); - var domain = Domain.Build(config); - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new SomeWithReference {Reference = new Reference()}; - - var result = Query.All() - .Prefetch(s => s.Reference) - .ToList(); - - Assert.AreEqual(1, result.Count); - Assert.IsNotNull(result.Single()); - Assert.IsNotNull(result.Single().Reference); - - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.08 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueA418_UnableToCompileModelWithPersistentInterface_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA418_UnableToCompileModelWithPersistentInterface_Model + { + public interface IWithReference : IEntity + { + [Association(OnTargetRemove = OnRemoveAction.Cascade)] + [Field(Nullable = false)] + Reference Reference { get; set; } + } + + [HierarchyRoot] + public class SomeWithReference : Entity, IWithReference + { + [Field, Key] + public long Id { get; private set; } + + [Field(NullableOnUpgrade = true, Nullable = false)] + public Reference Reference { get; set; } + } + + [HierarchyRoot] + public class Reference : Entity + { + [Field, Key] + public long Id { get; private set; } + } + } + + [Serializable] + public class IssueA418_UnableToCompileModelWithPersistentInterface + { + [Test] + public void MainTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof (IWithReference).Assembly, typeof (IWithReference).Namespace); + var domain = Domain.Build(config); + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new SomeWithReference {Reference = new Reference()}; + + var result = Query.All() + .Prefetch(s => s.Reference) + .ToList(); + + Assert.AreEqual(1, result.Count); + Assert.IsNotNull(result.Single()); + Assert.IsNotNull(result.Single().Reference); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueA424_QueryByInterfaceException.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueA424_QueryByInterfaceException.cs index dc29fd1074..b37dbde4ef 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueA424_QueryByInterfaceException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueA424_QueryByInterfaceException.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.02.17 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueA424_QueryByInterfaceException_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueA424_QueryByInterfaceException_Model - { - [Serializable] - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] - public abstract class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - protected Animal(Session session) : base(session) { } - } - - public interface IHasLegs : IEntity - { - [Field] - string NumberOfLegs { get; set; } - } - - public abstract class Mammal : Animal, IHasLegs - { - [Field] - public string NumberOfLegs { get; set; } - - protected Mammal(Session session) : base(session) { } - } - - public interface ICanRun : IHasLegs - { - - } - - public abstract class Cat : Animal, ICanRun - { - protected Cat(Session session) : base(session) { } - - [Field] - public string NumberOfLegs { get; set; } - } - - public class Lion : Cat - { - public Lion(Session session) : base(session) { } - } - } - - [Serializable] - public class IssueA424_QueryByInterfaceException : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (IHasLegs).Assembly, typeof (IHasLegs).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) - { - - Query.All().ToList(); - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.02.17 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueA424_QueryByInterfaceException_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueA424_QueryByInterfaceException_Model + { + [Serializable] + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] + public abstract class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + protected Animal(Session session) : base(session) { } + } + + public interface IHasLegs : IEntity + { + [Field] + string NumberOfLegs { get; set; } + } + + public abstract class Mammal : Animal, IHasLegs + { + [Field] + public string NumberOfLegs { get; set; } + + protected Mammal(Session session) : base(session) { } + } + + public interface ICanRun : IHasLegs + { + + } + + public abstract class Cat : Animal, ICanRun + { + protected Cat(Session session) : base(session) { } + + [Field] + public string NumberOfLegs { get; set; } + } + + public class Lion : Cat + { + public Lion(Session session) : base(session) { } + } + } + + [Serializable] + public class IssueA424_QueryByInterfaceException : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (IHasLegs).Assembly, typeof (IHasLegs).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) + { + + Query.All().ToList(); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0003_OrderByStructureFieldLost.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0003_OrderByStructureFieldLost.cs index 3cc5b71abb..9cf096da45 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0003_OrderByStructureFieldLost.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0003_OrderByStructureFieldLost.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.03.05 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJIRA0003_OrderByStructureFieldLost_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJIRA0003_OrderByStructureFieldLost_Model - { - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Address Address { get; set; } - } - - public class Address : Structure - { - [Field] - public string City { get; set; } - - [Field] - public string PostCode { get; set; } - } - } - - [Serializable] - public class IssueJIRA0003_OrderByStructureFieldLost : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Address).Assembly, typeof (Address).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Person() {Name = "Vasya", Address = new Address {City = "Moscow", PostCode = "444444"}}; - new Person() {Name = "Petya", Address = new Address {City = "Kiev", PostCode = "111111"}}; - session.SaveChanges(); - - var query = session.Query.All() - .Where(p => p.Name != "Vovka") - .OrderBy(p => p.Address.PostCode) - .Skip(() => 1) - .Take(() => 5); - var result = query.ToList(); - Assert.AreEqual(1, result.Count); - Assert.AreEqual("Vasya", result[0].Name); - - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.03.05 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJIRA0003_OrderByStructureFieldLost_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJIRA0003_OrderByStructureFieldLost_Model + { + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Address Address { get; set; } + } + + public class Address : Structure + { + [Field] + public string City { get; set; } + + [Field] + public string PostCode { get; set; } + } + } + + [Serializable] + public class IssueJIRA0003_OrderByStructureFieldLost : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Address).Assembly, typeof (Address).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Person() {Name = "Vasya", Address = new Address {City = "Moscow", PostCode = "444444"}}; + new Person() {Name = "Petya", Address = new Address {City = "Kiev", PostCode = "111111"}}; + session.SaveChanges(); + + var query = session.Query.All() + .Where(p => p.Name != "Vovka") + .OrderBy(p => p.Address.PostCode) + .Skip(() => 1) + .Take(() => 5); + var result = query.ToList(); + Assert.AreEqual(1, result.Count); + Assert.AreEqual("Vasya", result[0].Name); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0020_CustomLINQCompilerContainerInterface.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0020_CustomLINQCompilerContainerInterface.cs index db56173477..385dc1d85d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0020_CustomLINQCompilerContainerInterface.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0020_CustomLINQCompilerContainerInterface.cs @@ -1,115 +1,115 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.03.03 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJIRA0020_CustomLINQCompilerContainerInterface_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJIRA0020_CustomLINQCompilerContainerInterface_Model - { - [Serializable] - [HierarchyRoot] - public class Person : Entity, ITest - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Age { get; set; } - - [Field] - public Region Region { get; set; } - - public string RegionName - { - get { return exprComp(this); } - } - - private static readonly Expression> expr = p => p.Region.Name; - - private static readonly Func exprComp = expr.Compile(); - - /// - /// The custom linq compiler container. - /// - [CompilerContainer(typeof (Expression))] - public static class CustomLinqCompilerContainer - { - [Compiler(typeof (Person), "RegionName", TargetKind.PropertyGet)] - public static Expression PersonRegionName(Expression assignmentExpression) - { - return expr.BindParameters(assignmentExpression); - } - - [Compiler(typeof (ITest), "RegionName", TargetKind.PropertyGet)] - public static Expression ITestRegionName(Expression assignmentExpression) - { - Expression> le = it => it is Person ? (it as Person).Region.Name : null; - return le.BindParameters(assignmentExpression); - } - } - } - - [Serializable] - [HierarchyRoot] - public class Region : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public interface ITest : IEntity - { - string RegionName { get; } - } - } - - [Serializable] - public class IssueJIRA0020_CustomLINQCompilerContainerInterface : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ITest).Assembly, typeof (ITest).Namespace); - configuration.Sessions.Default.Options = SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges; - return configuration; - } - - [Test] - public void VirtualFieldSelect() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var region = new Region {Name = "13123123121"}; - var person = new Person {Age = 1, Region = region}; - - var persons = session.Query.All(); - - var personsQuery = persons.Where(p => p.RegionName=="13123123121"); - var result = personsQuery.ToList(); - Assert.AreEqual(1, result.Count); - - var interfaces = persons as IQueryable; - if (interfaces!=null) { - // Convariant upcast will work in .NET 4.0+ - var interfacesQuery = interfaces.Where(test => test.RegionName=="13123123121"); - var interfaceResult = interfacesQuery.ToList(); - Assert.AreEqual(1, interfaceResult.Count); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.03.03 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJIRA0020_CustomLINQCompilerContainerInterface_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJIRA0020_CustomLINQCompilerContainerInterface_Model + { + [Serializable] + [HierarchyRoot] + public class Person : Entity, ITest + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Age { get; set; } + + [Field] + public Region Region { get; set; } + + public string RegionName + { + get { return exprComp(this); } + } + + private static readonly Expression> expr = p => p.Region.Name; + + private static readonly Func exprComp = expr.Compile(); + + /// + /// The custom linq compiler container. + /// + [CompilerContainer(typeof (Expression))] + public static class CustomLinqCompilerContainer + { + [Compiler(typeof (Person), "RegionName", TargetKind.PropertyGet)] + public static Expression PersonRegionName(Expression assignmentExpression) + { + return expr.BindParameters(assignmentExpression); + } + + [Compiler(typeof (ITest), "RegionName", TargetKind.PropertyGet)] + public static Expression ITestRegionName(Expression assignmentExpression) + { + Expression> le = it => it is Person ? (it as Person).Region.Name : null; + return le.BindParameters(assignmentExpression); + } + } + } + + [Serializable] + [HierarchyRoot] + public class Region : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public interface ITest : IEntity + { + string RegionName { get; } + } + } + + [Serializable] + public class IssueJIRA0020_CustomLINQCompilerContainerInterface : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (ITest).Assembly, typeof (ITest).Namespace); + configuration.Sessions.Default.Options = SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges; + return configuration; + } + + [Test] + public void VirtualFieldSelect() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var region = new Region {Name = "13123123121"}; + var person = new Person {Age = 1, Region = region}; + + var persons = session.Query.All(); + + var personsQuery = persons.Where(p => p.RegionName=="13123123121"); + var result = personsQuery.ToList(); + Assert.AreEqual(1, result.Count); + + var interfaces = persons as IQueryable; + if (interfaces!=null) { + // Convariant upcast will work in .NET 4.0+ + var interfacesQuery = interfaces.Where(test => test.RegionName=="13123123121"); + var interfaceResult = interfacesQuery.ToList(); + Assert.AreEqual(1, interfaceResult.Count); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0028_StructureOnSetError.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0028_StructureOnSetError.cs index 76e0a684a7..ec524b5317 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0028_StructureOnSetError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0028_StructureOnSetError.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.04 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJIRA0028_StructureOnSetError_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJIRA0028_StructureOnSetError_Model -{ - [HierarchyRoot] - public class Interval : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Point Left { get; set; } - - [Field] - public Point Right { get; set; } - - protected override void OnSetFieldValue(Orm.Model.FieldInfo field, object oldValue, object newValue) - { - base.OnSetFieldValue(field, oldValue, newValue); - if (field.Name == "Left" || field.Name == "Right") { - Point o, n; - o = oldValue as Point; - n = newValue as Point; - if (o == null || n == null) - return; - Assert.AreNotEqual(o.X, n.X); - Assert.AreNotEqual(o.Y, n.Y); - } - } - } - - public class Point : Structure - { - [Field] - public int X { get; set; } - - [Field] - public int Y { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJIRA0028_StructureOnSetError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Interval).Assembly, typeof (Interval).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var interval = new Interval(); - var point = new Point {X = 10, Y = 15}; - interval.Left = point; - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.04 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJIRA0028_StructureOnSetError_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJIRA0028_StructureOnSetError_Model +{ + [HierarchyRoot] + public class Interval : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Point Left { get; set; } + + [Field] + public Point Right { get; set; } + + protected override void OnSetFieldValue(Orm.Model.FieldInfo field, object oldValue, object newValue) + { + base.OnSetFieldValue(field, oldValue, newValue); + if (field.Name == "Left" || field.Name == "Right") { + Point o, n; + o = oldValue as Point; + n = newValue as Point; + if (o == null || n == null) + return; + Assert.AreNotEqual(o.X, n.X); + Assert.AreNotEqual(o.Y, n.Y); + } + } + } + + public class Point : Structure + { + [Field] + public int X { get; set; } + + [Field] + public int Y { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJIRA0028_StructureOnSetError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Interval).Assembly, typeof (Interval).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var interval = new Interval(); + var point = new Point {X = 10, Y = 15}; + interval.Left = point; + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork.cs index 8170156807..46ab2d31e4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork.cs @@ -1,92 +1,92 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.03.14 - -using System; -using System.ComponentModel; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork_Model - { - [HierarchyRoot] - public class Firm : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - [Association(PairTo = "Firm", OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.None)] - public Contractor Contractor { get; private set; } - - public Firm() - : this(new Contractor()) - {} - - public Firm(Contractor contractor) - { - Contractor = contractor; - } - } - - [HierarchyRoot] - public class Contractor : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Firm Firm { get; private set; } - } - - } - - [Serializable] - public class IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork : AutoBuildTest - { - private Session session; - private SessionScope scope; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Firm).Assembly, typeof (Firm).Namespace); - config.Sessions.Default.Options = SessionOptions.ClientProfile | SessionOptions.ReadRemovedObjects; - return config; - } - - [SetUp] - public void SetUp() - { - session = Domain.OpenSession(); - scope = session.Activate(); - } - - [TearDown] - public void TearDown() - { - scope.Dispose(); - session.Dispose(); - } - - [Test] - public void MainTest() - { - CreateContractors(); - session.SaveChanges(); - } - - public static void CreateContractors() - { - var contractor = new Contractor(); - var firm = new Firm(contractor); - var f = new Firm(); // - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.03.14 + +using System; +using System.ComponentModel; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork_Model + { + [HierarchyRoot] + public class Firm : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + [Association(PairTo = "Firm", OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.None)] + public Contractor Contractor { get; private set; } + + public Firm() + : this(new Contractor()) + {} + + public Firm(Contractor contractor) + { + Contractor = contractor; + } + } + + [HierarchyRoot] + public class Contractor : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Firm Firm { get; private set; } + } + + } + + [Serializable] + public class IssueJIRA0036_AutoTransactionsOpenModeDoesNotWork : AutoBuildTest + { + private Session session; + private SessionScope scope; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Firm).Assembly, typeof (Firm).Namespace); + config.Sessions.Default.Options = SessionOptions.ClientProfile | SessionOptions.ReadRemovedObjects; + return config; + } + + [SetUp] + public void SetUp() + { + session = Domain.OpenSession(); + scope = session.Activate(); + } + + [TearDown] + public void TearDown() + { + scope.Dispose(); + session.Dispose(); + } + + [Test] + public void MainTest() + { + CreateContractors(); + session.SaveChanges(); + } + + public static void CreateContractors() + { + var contractor = new Contractor(); + var firm = new Firm(contractor); + var f = new Firm(); // + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0085.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0085.cs index 604a896cf1..f33270ae4e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0085.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJIRA0085.cs @@ -1,152 +1,152 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.04.28 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJIRA0085_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJIRA0085_Model -{ - [Serializable] - [HierarchyRoot] - public abstract class SomeEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - protected SomeEntity(Session session) : base(session) - {} - } - - [Serializable] - public class FirstEntity : SomeEntity - { - [Field] - [Association(PairTo = "Owner")] - public EntitySet entSet { get; set; } - - public FirstEntity(Session session) : base(session) - {} - } - - [Serializable] - public class SecondEntity : SomeEntity - { - [Field] - [Association(PairTo = "Owner")] - public EntitySet entSet { get; set; } - - public SecondEntity(Session session) : base(session) - {} - } - - [Serializable] - public class MyEntity : Entity where TEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - public TEntity Owner { get; set; } - - public MyEntity(Session session, TEntity entity) - : base(session) - { - Owner = entity; - } - - public MyEntity(Session session) - : base(session) - {} - } - - [Serializable] - [HierarchyRoot] - public abstract class NextEntity : MyEntity - { - public NextEntity(Session session) : base(session) - {} - - protected NextEntity(Session session, SomeEntity entity) : base(session, entity) - {} - } - - [Serializable] - public class FirstChild : NextEntity - { - public FirstChild(Session session, SomeEntity entity) : base(session, entity) - {} - - public FirstChild(Session session) : base(session) - {} - } - - [Serializable] - public class SecondChild : NextEntity - { - public SecondChild(Session session) - : base(session) - {} - - public SecondChild(Session session, SomeEntity entity) : base(session, entity) - {} - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJIRA0085 : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - //config.ForeignKeyMode = ForeignKeyMode.None; - config.Types.Register(typeof (SecondChild).Assembly, typeof (SecondChild).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope transactionScope = session.OpenTransaction()) { - // Creating new persistent object - var first = new FirstEntity(session) - { - Text = "first!" - }; - - // Creating new persistent object - var second = new SecondEntity(session) - { - Text = "second!" - }; - - new FirstChild(session, first) {Text = "First"}; - new SecondChild(session, second) {Text = "Second"}; - - // Committing transaction - transactionScope.Complete(); - } - } - - using (Session session = Domain.OpenSession()) { - using (TransactionScope transactionScope = session.OpenTransaction()) { - Console.WriteLine(session.Query.All().First().Text); - Console.WriteLine(session.Query.All().First().Text); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.04.28 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJIRA0085_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJIRA0085_Model +{ + [Serializable] + [HierarchyRoot] + public abstract class SomeEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + protected SomeEntity(Session session) : base(session) + {} + } + + [Serializable] + public class FirstEntity : SomeEntity + { + [Field] + [Association(PairTo = "Owner")] + public EntitySet entSet { get; set; } + + public FirstEntity(Session session) : base(session) + {} + } + + [Serializable] + public class SecondEntity : SomeEntity + { + [Field] + [Association(PairTo = "Owner")] + public EntitySet entSet { get; set; } + + public SecondEntity(Session session) : base(session) + {} + } + + [Serializable] + public class MyEntity : Entity where TEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + public TEntity Owner { get; set; } + + public MyEntity(Session session, TEntity entity) + : base(session) + { + Owner = entity; + } + + public MyEntity(Session session) + : base(session) + {} + } + + [Serializable] + [HierarchyRoot] + public abstract class NextEntity : MyEntity + { + public NextEntity(Session session) : base(session) + {} + + protected NextEntity(Session session, SomeEntity entity) : base(session, entity) + {} + } + + [Serializable] + public class FirstChild : NextEntity + { + public FirstChild(Session session, SomeEntity entity) : base(session, entity) + {} + + public FirstChild(Session session) : base(session) + {} + } + + [Serializable] + public class SecondChild : NextEntity + { + public SecondChild(Session session) + : base(session) + {} + + public SecondChild(Session session, SomeEntity entity) : base(session, entity) + {} + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJIRA0085 : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + //config.ForeignKeyMode = ForeignKeyMode.None; + config.Types.Register(typeof (SecondChild).Assembly, typeof (SecondChild).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope transactionScope = session.OpenTransaction()) { + // Creating new persistent object + var first = new FirstEntity(session) + { + Text = "first!" + }; + + // Creating new persistent object + var second = new SecondEntity(session) + { + Text = "second!" + }; + + new FirstChild(session, first) {Text = "First"}; + new SecondChild(session, second) {Text = "Second"}; + + // Committing transaction + transactionScope.Complete(); + } + } + + using (Session session = Domain.OpenSession()) { + using (TransactionScope transactionScope = session.OpenTransaction()) { + Console.WriteLine(session.Query.All().First().Text); + Console.WriteLine(session.Query.All().First().Text); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0042_IndexAttributeIsOmitted.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0042_IndexAttributeIsOmitted.cs index 761ada4c2a..317f1e81bb 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0042_IndexAttributeIsOmitted.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0042_IndexAttributeIsOmitted.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.10 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0042_IndexAttributeIsOmitted_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0042_IndexAttributeIsOmitted_Model -{ - [Index("Name", Unique = true)] - public abstract class Root : Entity - { - [Field(Length = 100)] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Child : Root - { - [Field, Key] - public int Id { get; private set; } - } - - public class GrandChild : Child - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0042_IndexAttributeIsOmitted : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Child).Assembly, typeof (Child).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var model = Domain.Model; - var type = model.Types[typeof(Child)]; - Assert.IsTrue(type.Indexes.Any(i => i.IsSecondary && i.IsUnique)); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.10 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0042_IndexAttributeIsOmitted_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0042_IndexAttributeIsOmitted_Model +{ + [Index("Name", Unique = true)] + public abstract class Root : Entity + { + [Field(Length = 100)] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Child : Root + { + [Field, Key] + public int Id { get; private set; } + } + + public class GrandChild : Child + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0042_IndexAttributeIsOmitted : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Child).Assembly, typeof (Child).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var model = Domain.Model; + var type = model.Types[typeof(Child)]; + Assert.IsTrue(type.Indexes.Any(i => i.IsSecondary && i.IsUnique)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0071_DistinctDoesNotWorkProperly.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0071_DistinctDoesNotWorkProperly.cs index 34866413f7..57745a1342 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0071_DistinctDoesNotWorkProperly.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0071_DistinctDoesNotWorkProperly.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.25 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0071_DistinctDoesNotWorkProperlyModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0071_DistinctDoesNotWorkProperlyModel -{ - [HierarchyRoot] - public class Jira0071Entity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public int? Index { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - - public class IssueJira0071_DistinctDoesNotWorkProperly : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Jira0071Entity).Assembly, typeof (Jira0071Entity).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (Domain.OpenSession()) - using (var t = Session.Current.OpenTransaction()) { - new Jira0071Entity {Text = "Some text", Index = 1}; - new Jira0071Entity {Text = "Some text", Index = 1}; - new Jira0071Entity {Text = "Some text", Index = 2}; - new Jira0071Entity {Text = "Some text", Index = null}; - new Jira0071Entity {Text = "Some text", Index = 1}; - new Jira0071Entity {Text = "Other text", Index = 1}; - new Jira0071Entity {Text = "Other text", Index = null}; - t.Complete(); - } - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) - using (var t = Session.Current.OpenTransaction()) { - - var q = - from x in Query.All() - select new {x.Text, OneOrNull = x.Index==null ? true : x.Index==1 ? true : false}; - - var r = q.Distinct().OrderBy(x => x.Text).ThenBy(x => x.OneOrNull).ToList(); - - Assert.That(r.Count, Is.EqualTo(3)); - Assert.That(r[0].Text, Is.EqualTo("Other text")); - Assert.That(r[0].OneOrNull, Is.EqualTo(true)); - Assert.That(r[1].Text, Is.EqualTo("Some text")); - Assert.That(r[1].OneOrNull, Is.EqualTo(false)); - Assert.That(r[2].Text, Is.EqualTo("Some text")); - Assert.That(r[2].OneOrNull, Is.EqualTo(true)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.25 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0071_DistinctDoesNotWorkProperlyModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0071_DistinctDoesNotWorkProperlyModel +{ + [HierarchyRoot] + public class Jira0071Entity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public int? Index { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + + public class IssueJira0071_DistinctDoesNotWorkProperly : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Jira0071Entity).Assembly, typeof (Jira0071Entity).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (Domain.OpenSession()) + using (var t = Session.Current.OpenTransaction()) { + new Jira0071Entity {Text = "Some text", Index = 1}; + new Jira0071Entity {Text = "Some text", Index = 1}; + new Jira0071Entity {Text = "Some text", Index = 2}; + new Jira0071Entity {Text = "Some text", Index = null}; + new Jira0071Entity {Text = "Some text", Index = 1}; + new Jira0071Entity {Text = "Other text", Index = 1}; + new Jira0071Entity {Text = "Other text", Index = null}; + t.Complete(); + } + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) + using (var t = Session.Current.OpenTransaction()) { + + var q = + from x in Query.All() + select new {x.Text, OneOrNull = x.Index==null ? true : x.Index==1 ? true : false}; + + var r = q.Distinct().OrderBy(x => x.Text).ThenBy(x => x.OneOrNull).ToList(); + + Assert.That(r.Count, Is.EqualTo(3)); + Assert.That(r[0].Text, Is.EqualTo("Other text")); + Assert.That(r[0].OneOrNull, Is.EqualTo(true)); + Assert.That(r[1].Text, Is.EqualTo("Some text")); + Assert.That(r[1].OneOrNull, Is.EqualTo(false)); + Assert.That(r[2].Text, Is.EqualTo("Some text")); + Assert.That(r[2].OneOrNull, Is.EqualTo(true)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0083_DtoMaterialization.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0083_DtoMaterialization.cs index 91e09e0d33..4ee06e5e9c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0083_DtoMaterialization.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0083_DtoMaterialization.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.04.26 - -using System.Linq; -using System.Linq.Dynamic; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.IssueJira0083_Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0083_Model - { - [HierarchyRoot] - public class Class1 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - public class Class1DTO - { - public int Id { get; set; } - - public Class1DTO(Class1 entity) - { - Id = entity.Id; - } - } - - public class Class2DTO - { - public int Id { get; set; } - - public string Text { get; set; } - - public object Class1DTO { get; set; } - } - } - - public class IssueJira0083_DtoMaterialization : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - - var class1 = new Class1(); - - var q = session.Query.All() - .Select(c => new Class2DTO { Id = c.Id, Class1DTO = new Class1DTO(c), Text = c.Text}); - var r = q.ToArray()[0]; - Assert.IsNotNull(r.Class1DTO); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.04.26 + +using System.Linq; +using System.Linq.Dynamic; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.IssueJira0083_Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0083_Model + { + [HierarchyRoot] + public class Class1 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + public class Class1DTO + { + public int Id { get; set; } + + public Class1DTO(Class1 entity) + { + Id = entity.Id; + } + } + + public class Class2DTO + { + public int Id { get; set; } + + public string Text { get; set; } + + public object Class1DTO { get; set; } + } + } + + public class IssueJira0083_DtoMaterialization : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + + var class1 = new Class1(); + + var q = session.Query.All() + .Select(c => new Class2DTO { Id = c.Id, Class1DTO = new Class1DTO(c), Text = c.Text}); + var r = q.ToArray()[0]; + Assert.IsNotNull(r.Class1DTO); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0102_NoForeignKeyOnInterfaceField.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0102_NoForeignKeyOnInterfaceField.cs index ab7c333166..4b7a5115cc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0102_NoForeignKeyOnInterfaceField.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0102_NoForeignKeyOnInterfaceField.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.11 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue0102_NoForeignKeyOnInterfaceField_Model; -using Xtensive.Orm.Providers; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Issues.Issue0102_NoForeignKeyOnInterfaceField_Model -{ - public interface IHierarchy : IEntity - { - [Field] - MyEntity Parent { get; set; } - } - - [HierarchyRoot] - public class MyEntity : Entity, IHierarchy - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string Text { get; set; } - - [Field] - public MyEntity Parent { get; set; } - - public MyEntity() - {} - - public MyEntity(Session session) - : base(session) - {} - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0102_NoForeignKeyOnInterfaceField : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var ti = Domain.Model.Types[typeof (MyEntity)]; - string tableName = Domain.Services.Get().ApplyNamingRules(ti.MappingName); - var schema = StorageTestHelper.GetDefaultSchema(Domain); - Assert.IsTrue(schema.Tables[tableName].TableConstraints.OfType().Any()); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.11 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue0102_NoForeignKeyOnInterfaceField_Model; +using Xtensive.Orm.Providers; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Issues.Issue0102_NoForeignKeyOnInterfaceField_Model +{ + public interface IHierarchy : IEntity + { + [Field] + MyEntity Parent { get; set; } + } + + [HierarchyRoot] + public class MyEntity : Entity, IHierarchy + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string Text { get; set; } + + [Field] + public MyEntity Parent { get; set; } + + public MyEntity() + {} + + public MyEntity(Session session) + : base(session) + {} + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0102_NoForeignKeyOnInterfaceField : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var ti = Domain.Model.Types[typeof (MyEntity)]; + string tableName = Domain.Services.Get().ApplyNamingRules(ti.MappingName); + var schema = StorageTestHelper.GetDefaultSchema(Domain); + Assert.IsTrue(schema.Tables[tableName].TableConstraints.OfType().Any()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexes.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexes.cs index 2db373bca9..aa6e8cd193 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexes.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexes.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0116_InterfacesCastAndIndexes : AutoBuildTest - { - [SetUp] - public void SetUp() - { - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - var p = new Employee(null) - { - FirstName = "Person " + i - }; - new Country(null) - { - Name = "Country " + i, - Code = i.ToString() - }; - } - t.Complete(); - } - } - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (IRecord).Assembly, typeof (IRecord).Namespace); - return config; - } - - [Test] - public void CastTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - session.Query.All(typeof (IEmployee)).Cast().ToList(); - } - } - - [Test] - public void OfTypeTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - session.Query.All(typeof (IRecord)).OfType().ToList(); - session.Query.All(typeof (IRecord)).OfType().ToList(); - session.Query.All(typeof (IRecord)).OfType().ToList(); - session.Query.All(typeof (IRecord)).OfType().ToList(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0116_InterfacesCastAndIndexes : AutoBuildTest + { + [SetUp] + public void SetUp() + { + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + var p = new Employee(null) + { + FirstName = "Person " + i + }; + new Country(null) + { + Name = "Country " + i, + Code = i.ToString() + }; + } + t.Complete(); + } + } + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (IRecord).Assembly, typeof (IRecord).Namespace); + return config; + } + + [Test] + public void CastTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + session.Query.All(typeof (IEmployee)).Cast().ToList(); + } + } + + [Test] + public void OfTypeTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + session.Query.All(typeof (IRecord)).OfType().ToList(); + session.Query.All(typeof (IRecord)).OfType().ToList(); + session.Query.All(typeof (IRecord)).OfType().ToList(); + session.Query.All(typeof (IRecord)).OfType().ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Generated.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Generated.cs index a8b52fcf0b..caef6da700 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Generated.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Generated.cs @@ -1,101 +1,101 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public class Employee : Record, IEmployee - { - [Field(Length = 200)] - public String InsuranceNumber { get; set; } - - [Field(Length = 200)] - public String PensionNumber { get; set; } - - [Field] - public Double EmploymentFraction { get; set; } - - [Field(Length = 200)] - public String PersonNumber { get; set; } - - [Field(Length = 200)] - public String LastName { get; set; } - - [Field(Length = 200)] - public String FirstName { get; set; } - - [Field] - public Boolean Active { get; set; } - - [Field(Length = 200)] - public String BankAccountNumber { get; set; } - - [Field(Length = 200)] - public String Notes { get; set; } - - [Field(Length = 200)] - public String WebSite { get; set; } - - [Field(Length = 200)] - public String Email { get; set; } - - [Field(Length = 200)] - public String Fax { get; set; } - - [Field(Length = 200)] - public String Mobile { get; set; } - - [Field(Length = 200)] - public String Phone { get; set; } - - [Field] - public ICountry Country { get; set; } - - [Field(Length = 200)] - public String Place { get; set; } - - [Field(Length = 200)] - public String PostalCode { get; set; } - - [Field(Length = 200)] - public String Address { get; set; } - - [Field] - public Int32 Number { get; set; } - - [Field(Length = 200)] - public String Name { get; set; } - - public Employee(IParty createdBy) - : base(createdBy) - { - try { - base.Initialize(typeof (Employee)); - } - catch (Exception ex) { - base.InitializationError(typeof (Employee), ex); - throw; - } - } - } - - - public class Country : Record, ICountry - { - [Field] - public String Name { get; set; } - - [Field(Length = 3)] - public string Code { get; set; } - - public Country(IParty createdBy) - : base(createdBy) - { - try { - base.Initialize(typeof (Country)); - } - catch (Exception ex) { - base.InitializationError(typeof (Country), ex); - throw; - } - } - } +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public class Employee : Record, IEmployee + { + [Field(Length = 200)] + public String InsuranceNumber { get; set; } + + [Field(Length = 200)] + public String PensionNumber { get; set; } + + [Field] + public Double EmploymentFraction { get; set; } + + [Field(Length = 200)] + public String PersonNumber { get; set; } + + [Field(Length = 200)] + public String LastName { get; set; } + + [Field(Length = 200)] + public String FirstName { get; set; } + + [Field] + public Boolean Active { get; set; } + + [Field(Length = 200)] + public String BankAccountNumber { get; set; } + + [Field(Length = 200)] + public String Notes { get; set; } + + [Field(Length = 200)] + public String WebSite { get; set; } + + [Field(Length = 200)] + public String Email { get; set; } + + [Field(Length = 200)] + public String Fax { get; set; } + + [Field(Length = 200)] + public String Mobile { get; set; } + + [Field(Length = 200)] + public String Phone { get; set; } + + [Field] + public ICountry Country { get; set; } + + [Field(Length = 200)] + public String Place { get; set; } + + [Field(Length = 200)] + public String PostalCode { get; set; } + + [Field(Length = 200)] + public String Address { get; set; } + + [Field] + public Int32 Number { get; set; } + + [Field(Length = 200)] + public String Name { get; set; } + + public Employee(IParty createdBy) + : base(createdBy) + { + try { + base.Initialize(typeof (Employee)); + } + catch (Exception ex) { + base.InitializationError(typeof (Employee), ex); + throw; + } + } + } + + + public class Country : Record, ICountry + { + [Field] + public String Name { get; set; } + + [Field(Length = 3)] + public string Code { get; set; } + + public Country(IParty createdBy) + : base(createdBy) + { + try { + base.Initialize(typeof (Country)); + } + catch (Exception ex) { + base.InitializationError(typeof (Country), ex); + throw; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/ICountry.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/ICountry.cs index 71a8a7ca28..1c9569b304 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/ICountry.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/ICountry.cs @@ -1,8 +1,8 @@ -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public interface ICountry : IRecord - { - [Field(Length = 512)] - string Name{ get; set;} - } +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public interface ICountry : IRecord + { + [Field(Length = 512)] + string Name{ get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IEmployee.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IEmployee.cs index 873c28f70a..bc559dea10 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IEmployee.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IEmployee.cs @@ -1,14 +1,14 @@ -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public interface IEmployee : IPerson - { - [Field] - double EmploymentFraction { get; set; } - - [Field] - string PensionNumber { get; set; } - - [Field] - string InsuranceNumber { get; set; } - } +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public interface IEmployee : IPerson + { + [Field] + double EmploymentFraction { get; set; } + + [Field] + string PensionNumber { get; set; } + + [Field] + string InsuranceNumber { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IParty.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IParty.cs index 6dce7f83d4..5e4a8756a0 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IParty.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IParty.cs @@ -1,52 +1,52 @@ -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public interface IParty : IRecord - { - /// - /// Name of Party - /// For a company it would be company name - /// For an employee it would be employee name - /// - [Field]//(Length = 512, Indexed = true, Nullable = false)] - string Name { get; set; } - - [Field] - int Number { get; set; } - - [Field] - string Address { get; set; } - - [Field] - string PostalCode { get; set; } - - [Field] - string Place { get; set; } - - [Field] - ICountry Country { get; set; } - - [Field] - string Phone { get; set; } - - [Field] - string Mobile { get; set; } - - [Field] - string Fax { get; set; } - - [Field] - string Email { get; set; } - - [Field] - string WebSite { get; set; } - - [Field] - string Notes { get; set; } - - [Field] - string BankAccountNumber { get; set; } - - [Field] - bool Active { get; set; } - } +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public interface IParty : IRecord + { + /// + /// Name of Party + /// For a company it would be company name + /// For an employee it would be employee name + /// + [Field]//(Length = 512, Indexed = true, Nullable = false)] + string Name { get; set; } + + [Field] + int Number { get; set; } + + [Field] + string Address { get; set; } + + [Field] + string PostalCode { get; set; } + + [Field] + string Place { get; set; } + + [Field] + ICountry Country { get; set; } + + [Field] + string Phone { get; set; } + + [Field] + string Mobile { get; set; } + + [Field] + string Fax { get; set; } + + [Field] + string Email { get; set; } + + [Field] + string WebSite { get; set; } + + [Field] + string Notes { get; set; } + + [Field] + string BankAccountNumber { get; set; } + + [Field] + bool Active { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IPerson.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IPerson.cs index 5ae298fcc2..123eb09861 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IPerson.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IPerson.cs @@ -1,14 +1,14 @@ -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public interface IPerson : IParty - { - [Field] - string FirstName { get; set; } - - [Field] - string LastName { get; set; } - - [Field] - string PersonNumber { get; set; } - } +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public interface IPerson : IParty + { + [Field] + string FirstName { get; set; } + + [Field] + string LastName { get; set; } + + [Field] + string PersonNumber { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IRecord.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IRecord.cs index ad5861d3e4..5a9557bc6f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IRecord.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/IRecord.cs @@ -1,38 +1,38 @@ -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public interface IRecord : IEntity - { - /// - /// key of table - /// - [Field] - long Id { get; } - - [Field] - RecordState Status { get; } - - /// - /// Username of user who created Record - /// - //[Field] - //IParty CreatedBy { get; set; } - - /// - /// Date when Record was created - /// - [Field] - DateTime DateCreated { get; set; } - - /// - /// Date when record was last Modified - /// - [Field] - DateTime? DateModified { get; set; } - - void Delete(); - void SetStateToNormal(); - } -} - +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public interface IRecord : IEntity + { + /// + /// key of table + /// + [Field] + long Id { get; } + + [Field] + RecordState Status { get; } + + /// + /// Username of user who created Record + /// + //[Field] + //IParty CreatedBy { get; set; } + + /// + /// Date when Record was created + /// + [Field] + DateTime DateCreated { get; set; } + + /// + /// Date when record was last Modified + /// + [Field] + DateTime? DateModified { get; set; } + + void Delete(); + void SetStateToNormal(); + } +} + diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Record.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Record.cs index c1bc14cbbf..128e56960d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Record.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0116_InterfacesCastAndIndexesModel/Record.cs @@ -1,83 +1,83 @@ -using System; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel -{ - public enum RecordState - { - Deleted = -1, - Draft = 0, - Normal = 1 - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class Record : Entity, IRecord - { - /// - /// To create an empty record - /// - protected Record(IParty createdBy) - { - CreatedBy = createdBy; - DateCreated = DateTime.UtcNow; - Status = RecordState.Draft; - } - - /// - /// key of table - /// - [Field, Key] - public long Id { get; private set; } - - [Field] - public RecordState Status { get; private set; } - - /// - /// Username of user who created Record - /// - [Field] - public IParty CreatedBy { get; set; } - - /// - /// Date when Record was created - /// - [Field] - public DateTime DateCreated { get; set; } - - /// - /// Date when record was last Modified - /// - [Field] - public DateTime? DateModified { get; set; } - - /// - /// method override from dataObjects .. called when a a value is set in a field on screen - /// used for auditing - /// Other features to add here: - /// -set fields that don't need tracking - /// -set information for auditing - /// -calculations/population of other values based on the value entered - /// - /// field information - /// previous value of field - /// current submitted value of field - protected override void OnSetFieldValue(FieldInfo field, object oldValue, object newValue) - { - base.OnSetFieldValue(field, oldValue, newValue); - - if (field.Name != "DateModified") - DateModified = DateTime.UtcNow; - } - - public void Delete() - { - Status = RecordState.Deleted; - } - - //todo: find a better name for this method? - public void SetStateToNormal() - { - Status = RecordState.Normal; - } - } -} +using System; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0116_InterfacesCastAndIndexesModel +{ + public enum RecordState + { + Deleted = -1, + Draft = 0, + Normal = 1 + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class Record : Entity, IRecord + { + /// + /// To create an empty record + /// + protected Record(IParty createdBy) + { + CreatedBy = createdBy; + DateCreated = DateTime.UtcNow; + Status = RecordState.Draft; + } + + /// + /// key of table + /// + [Field, Key] + public long Id { get; private set; } + + [Field] + public RecordState Status { get; private set; } + + /// + /// Username of user who created Record + /// + [Field] + public IParty CreatedBy { get; set; } + + /// + /// Date when Record was created + /// + [Field] + public DateTime DateCreated { get; set; } + + /// + /// Date when record was last Modified + /// + [Field] + public DateTime? DateModified { get; set; } + + /// + /// method override from dataObjects .. called when a a value is set in a field on screen + /// used for auditing + /// Other features to add here: + /// -set fields that don't need tracking + /// -set information for auditing + /// -calculations/population of other values based on the value entered + /// + /// field information + /// previous value of field + /// current submitted value of field + protected override void OnSetFieldValue(FieldInfo field, object oldValue, object newValue) + { + base.OnSetFieldValue(field, oldValue, newValue); + + if (field.Name != "DateModified") + DateModified = DateTime.UtcNow; + } + + public void Delete() + { + Status = RecordState.Deleted; + } + + //todo: find a better name for this method? + public void SetStateToNormal() + { + Status = RecordState.Normal; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0117_FKStructureTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0117_FKStructureTest.cs index e8486db528..f638cf403d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0117_FKStructureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0117_FKStructureTest.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.05.19 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.MultipleFKViaStructureTestModel; -using Xtensive.Orm.Providers; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Storage.MultipleFKViaStructureTestModel -{ - [HierarchyRoot] - public class Target1 : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class Target2 : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class TargetSet : Structure - { - [Field] - public Target1 T1 { get; set; } - - [Field] - public Target2 T2 { get; set; } - } - - [HierarchyRoot] - public class Owner0 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Target1 T1 { get; set; } - - [Field] - public Target2 T2 { get; set; } - } - - [HierarchyRoot] - public class Owner1 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public TargetSet Targets { get; set; } - } - - [HierarchyRoot] - public class Owner2 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public TargetSet Targets { get; set; } - } - - [HierarchyRoot] - public class Owner3 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public TargetSet Targets { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class IssueJira0117_FKStructureTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Target1).Assembly, typeof (Target1).Namespace); - return config; - } - - [Test] - public void AssociationThroughStructureTest() - { - var type = Domain.Model.Types[typeof (Owner1)]; - Assert.AreEqual(2, type.GetOwnerAssociations().Count); - Assert.AreEqual(8, Domain.Model.Associations.Count); - } - - [Test] - public void ForeignKeysCountTest() - { - var domainHandler = Domain.Handler; - var mapping = StorageTestHelper.GetDefaultModelMapping(Domain); - var schema = mapping[Domain.Model.Types[typeof (Metadata.Type)]].Schema; - - var count = GetForeignKeysCount(schema, typeof(Owner1)); - Assert.AreEqual(count, GetForeignKeysCount(schema, typeof(Owner2))); - Assert.AreEqual(count, GetForeignKeysCount(schema, typeof(Owner3))); - } - - [Test] - public void IndexesCountTest() - { - var count = GetIndexesCount(typeof (Owner0)); - Assert.AreEqual(count, GetIndexesCount(typeof(Owner1))); - Assert.AreEqual(count, GetIndexesCount(typeof(Owner2))); - Assert.AreEqual(count, GetIndexesCount(typeof(Owner3))); - } - - private int GetIndexesCount(Type type) - { - return Domain.Model.Types[type].Indexes.Count; - } - - private int GetForeignKeysCount(Schema schema, Type type) - { - string tableName = Domain.Services.Get().ApplyNamingRules(Domain.Model.Types[type].MappingName); - var result = schema.Tables[tableName].TableConstraints.OfType().Count(); - return result; - } - } -} +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.05.19 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.MultipleFKViaStructureTestModel; +using Xtensive.Orm.Providers; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Storage.MultipleFKViaStructureTestModel +{ + [HierarchyRoot] + public class Target1 : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class Target2 : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class TargetSet : Structure + { + [Field] + public Target1 T1 { get; set; } + + [Field] + public Target2 T2 { get; set; } + } + + [HierarchyRoot] + public class Owner0 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Target1 T1 { get; set; } + + [Field] + public Target2 T2 { get; set; } + } + + [HierarchyRoot] + public class Owner1 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public TargetSet Targets { get; set; } + } + + [HierarchyRoot] + public class Owner2 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public TargetSet Targets { get; set; } + } + + [HierarchyRoot] + public class Owner3 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public TargetSet Targets { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class IssueJira0117_FKStructureTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Target1).Assembly, typeof (Target1).Namespace); + return config; + } + + [Test] + public void AssociationThroughStructureTest() + { + var type = Domain.Model.Types[typeof (Owner1)]; + Assert.AreEqual(2, type.GetOwnerAssociations().Count); + Assert.AreEqual(8, Domain.Model.Associations.Count); + } + + [Test] + public void ForeignKeysCountTest() + { + var domainHandler = Domain.Handler; + var mapping = StorageTestHelper.GetDefaultModelMapping(Domain); + var schema = mapping[Domain.Model.Types[typeof (Metadata.Type)]].Schema; + + var count = GetForeignKeysCount(schema, typeof(Owner1)); + Assert.AreEqual(count, GetForeignKeysCount(schema, typeof(Owner2))); + Assert.AreEqual(count, GetForeignKeysCount(schema, typeof(Owner3))); + } + + [Test] + public void IndexesCountTest() + { + var count = GetIndexesCount(typeof (Owner0)); + Assert.AreEqual(count, GetIndexesCount(typeof(Owner1))); + Assert.AreEqual(count, GetIndexesCount(typeof(Owner2))); + Assert.AreEqual(count, GetIndexesCount(typeof(Owner3))); + } + + private int GetIndexesCount(Type type) + { + return Domain.Model.Types[type].Indexes.Count; + } + + private int GetForeignKeysCount(Schema schema, Type type) + { + string tableName = Domain.Services.Get().ApplyNamingRules(Domain.Model.Types[type].MappingName); + var result = schema.Tables[tableName].TableConstraints.OfType().Count(); + return result; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0149_LinqTranslationError.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0149_LinqTranslationError.cs index 1ccc10739e..4b37b6abcf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0149_LinqTranslationError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0149_LinqTranslationError.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.06.21 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0149_LinqTranslationError_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0149_LinqTranslationError_Model -{ - [HierarchyRoot] - public class ProductInstance : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Product Product { get; set; } - - [Field] - public bool IsWaybilled { get; set; } - - [Field] - public bool IsChecked { get; set; } - - public static Expression> IsAvialableForSale() - { - return pi => !pi.IsChecked && !pi.IsWaybilled; - } - } - - [HierarchyRoot] - public class Product : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public ProductModel ProductModel { get; set; } - - [Field] - [Association(PairTo = "Product", OnOwnerRemove = OnRemoveAction.Deny, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet InstanceSet { get; set; } - } - - [HierarchyRoot] - public class ProductModel : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "ProductModel", OnOwnerRemove = OnRemoveAction.Deny, OnTargetRemove = OnRemoveAction.Clear - )] - public EntitySet Products { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0149_LinqTranslationError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (ProductModel).Assembly, typeof (ProductModel).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - - new ProductModel(); - session.SaveChanges(); - - var model = session.Query.All().FirstOrDefault(); -//works - session.Query.All() - .Where(pi => pi.Product.ProductModel == model) - .Where(ProductInstance.IsAvialableForSale()) - .Count(); - -//Works - model.Products - .SelectMany(p => p.InstanceSet.Where(pi => !pi.IsChecked && !pi.IsWaybilled)) - .Count(); -//don't works - model.Products - .SelectMany(p => p.InstanceSet.Where(ProductInstance.IsAvialableForSale())) - .Count(); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.06.21 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0149_LinqTranslationError_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0149_LinqTranslationError_Model +{ + [HierarchyRoot] + public class ProductInstance : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Product Product { get; set; } + + [Field] + public bool IsWaybilled { get; set; } + + [Field] + public bool IsChecked { get; set; } + + public static Expression> IsAvialableForSale() + { + return pi => !pi.IsChecked && !pi.IsWaybilled; + } + } + + [HierarchyRoot] + public class Product : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public ProductModel ProductModel { get; set; } + + [Field] + [Association(PairTo = "Product", OnOwnerRemove = OnRemoveAction.Deny, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet InstanceSet { get; set; } + } + + [HierarchyRoot] + public class ProductModel : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "ProductModel", OnOwnerRemove = OnRemoveAction.Deny, OnTargetRemove = OnRemoveAction.Clear + )] + public EntitySet Products { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0149_LinqTranslationError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (ProductModel).Assembly, typeof (ProductModel).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + + new ProductModel(); + session.SaveChanges(); + + var model = session.Query.All().FirstOrDefault(); +//works + session.Query.All() + .Where(pi => pi.Product.ProductModel == model) + .Where(ProductInstance.IsAvialableForSale()) + .Count(); + +//Works + model.Products + .SelectMany(p => p.InstanceSet.Where(pi => !pi.IsChecked && !pi.IsWaybilled)) + .Count(); +//don't works + model.Products + .SelectMany(p => p.InstanceSet.Where(ProductInstance.IsAvialableForSale())) + .Count(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0165_CaseSensitiveFieldNames.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0165_CaseSensitiveFieldNames.cs index fb6bf14660..c75192d68a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0165_CaseSensitiveFieldNames.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0165_CaseSensitiveFieldNames.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.07.24 - -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.IssueJira0165_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0165_Model -{ - [HierarchyRoot] - public class Class1 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Value { get; set; } - - [Field] - [FieldMapping("AnotherValue")] - public int VaLue { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0165_CaseSensitiveFieldNames : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) { - using (var t = Session.Current.OpenTransaction()) { - - - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.07.24 + +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.IssueJira0165_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0165_Model +{ + [HierarchyRoot] + public class Class1 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Value { get; set; } + + [Field] + [FieldMapping("AnotherValue")] + public int VaLue { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0165_CaseSensitiveFieldNames : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Class1).Assembly, typeof (Class1).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) { + using (var t = Session.Current.OpenTransaction()) { + + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0168_RemoveQueryableExtensionFails.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0168_RemoveQueryableExtensionFails.cs index 1c3a8a40c4..bcac5107bc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0168_RemoveQueryableExtensionFails.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0168_RemoveQueryableExtensionFails.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.07.29 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0168_RemoveQueryableExtensionFails_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0168_RemoveQueryableExtensionFails_Model -{ - [HierarchyRoot] - public class Target : Entity - { - [Field, Key] - public int Id { get; private set; } - - public Target(Session session) : - base(session) - {} - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0168_RemoveQueryableExtensionFails : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Target).Assembly, typeof (Target).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var sc = new SessionConfiguration(SessionOptions.ServerProfile); - using (var session = Domain.OpenSession(sc)) { - using (var t = session.OpenTransaction()) { - - new Target(session); - session.SaveChanges(); - - session.Remove(session.Query.All()); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.07.29 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0168_RemoveQueryableExtensionFails_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0168_RemoveQueryableExtensionFails_Model +{ + [HierarchyRoot] + public class Target : Entity + { + [Field, Key] + public int Id { get; private set; } + + public Target(Session session) : + base(session) + {} + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0168_RemoveQueryableExtensionFails : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Target).Assembly, typeof (Target).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var sc = new SessionConfiguration(SessionOptions.ServerProfile); + using (var session = Domain.OpenSession(sc)) { + using (var t = session.OpenTransaction()) { + + new Target(session); + session.SaveChanges(); + + session.Remove(session.Query.All()); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0171_DateTimeOffset.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0171_DateTimeOffset.cs index 85bf8aa250..9f2c31386e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0171_DateTimeOffset.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0171_DateTimeOffset.cs @@ -1,398 +1,398 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2013.11.27 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0171_DateTimeOffsetModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0171_DateTimeOffsetModel - { - [HierarchyRoot] - public class EntityWithDateTimeOffset : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public DateTimeOffset Today { get; set; } - } - } - - [TestFixture] - internal class IssueJira0171_DateTimeOffset : AutoBuildTest - { - private DateTimeOffset today = new DateTimeOffset(2018, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithDateTimeOffset)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - var providerInfo = StorageProviderInfo.Instance.Info; - if (providerInfo.ProviderName == WellKnown.Provider.PostgreSql) { - var localZone = today.ToLocalTime().Offset; - var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); - configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); - } - return configuration; - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var e = new EntityWithDateTimeOffset { - Today = today - }; - tx.Complete(); - } - } - - private void RunAllTestsInt(Func>> filterProvider) - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - RunTest(session, filterProvider.Invoke(1)); - RunTest(session, filterProvider.Invoke(20)); - RunTest(session, filterProvider.Invoke(-5)); - RunTest(session, filterProvider.Invoke(0)); - } - } - - private void RunAllTestsDouble(Func>> filterProvider) - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - RunTest(session, filterProvider.Invoke(1)); - RunTest(session, filterProvider.Invoke(20)); - RunTest(session, filterProvider.Invoke(-5)); - RunTest(session, filterProvider.Invoke(0)); - } - } - - private static void RunTest(Session session, Expression> filter) - { - var count = session.Query.All().Count(filter); - Assert.That(count, Is.EqualTo(1)); - } - - private void RunAllTests(Expression> filterProvider) - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - RunTest(session, filterProvider); - } - } - - # region Test Methods For Adding - - [Test] - public void AddYearsTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsInt(value => e => e.Today.AddYears(value)==todayLocal.AddYears(value)); - } - - [Test] - public void AddMonthsTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsInt(value => e => e.Today.AddMonths(value)==todayLocal.AddMonths(value)); - } - - [Test] - public void AddDaysTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsDouble(value => e => e.Today.AddDays(value)==todayLocal.AddDays(value)); - } - - [Test] - public void AddHoursTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsDouble(value => e => e.Today.AddHours(value)==todayLocal.AddHours(value)); - } - - [Test] - public void AddMinutesTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsDouble(value => e => e.Today.AddMinutes(value)==todayLocal.AddMinutes(value)); - } - - [Test] - public void AddSecondsTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsDouble(value => e => e.Today.AddSeconds(value)==todayLocal.AddSeconds(value)); - } - - [Test] - public void AddMillisecondsTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTestsDouble(value => e => e.Today.AddMilliseconds(value)==todayLocal.AddMilliseconds(value)); - } - - [Test] - public void AddTest() - { - TimeSpan timeSpan = new TimeSpan(-6, 00, 0); - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Add(timeSpan)==todayLocal.Add(timeSpan)); - } - - # endregion - - # region Tests Extractors - - [Test] - public void YearTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Year==todayLocal.Year); - } - - [Test] - public void MonthTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Month==todayLocal.Month); - } - - [Test] - public void DayTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Day==todayLocal.Day); - } - - [Test] - public void HourTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Hour==todayLocal.Hour); - } - - [Test] - public void MinuteTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Minute==todayLocal.Minute); - } - - [Test] - public void SecondTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Second==todayLocal.Second); - } - - [Test] - public void MilliseconsTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Millisecond==todayLocal.Millisecond); - } - - [Test] - public void TimeOfDayTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.TimeOfDay==todayLocal.TimeOfDay); - } - - [Test] - public void DateTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Date==todayLocal.Date); - } - - [Test] - public void DayOfWeekTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.DayOfWeek==todayLocal.DayOfWeek); - } - - [Test] - public void DayOfYearTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.DayOfYear==todayLocal.DayOfYear); - } - - [Test] - public void DateTimeTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.DateTime==todayLocal.DateTime); - } - - [Test] - public void OffsetTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Offset==todayLocal.Offset); - } - - [Test] - public void UtcDateTimeTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.UtcDateTime==todayLocal.UtcDateTime); - } - - [Test] - public void LocalDateTimeTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.LocalDateTime==todayLocal.LocalDateTime); - } - - # endregion - - #region Tests Operators - - [Test] - public void EqualityTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today==todayLocal); - } - - [Test] - public void InequalityTets() - { - DateTimeOffset dateTimeOffset = DateTimeOffset.Now; - var nowLocal = TryMoveToLocalTimeZone(dateTimeOffset); - RunAllTests(e => e.Today!=nowLocal); - } - - [Test] - public void GreaterThanTest() - { - DateTimeOffset dateTimeOffset = new DateTimeOffset(2012, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); - var dtoLocal = TryMoveToLocalTimeZone(dateTimeOffset); - RunAllTests(e => e.Today > dtoLocal); - } - - [Test] - public void GreaterThanOrEqual() - { - DateTimeOffset dateTimeOffset = new DateTimeOffset(2012, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); - var todayLocal = TryMoveToLocalTimeZone(today); - var dtoLocal = TryMoveToLocalTimeZone(dateTimeOffset); - RunAllTests(e => e.Today >= dtoLocal); - RunAllTests(e => e.Today >= todayLocal); - } - - [Test] - public void LessThan() - { - var nowLocal = TryMoveToLocalTimeZone(DateTimeOffset.Now); - RunAllTests(e => e.Today < nowLocal); - } - - [Test] - public void LessThanOrEqual() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today <= DateTimeOffset.Now); - RunAllTests(e => e.Today <= today); - } - - [Test] - public void AdditionTest() - { - TimeSpan timeSpan = new TimeSpan(1, 2, 3, 4, 5); - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => (e.Today + timeSpan)==(todayLocal + timeSpan)); - } - - [Test] - public void SubtractDateTimeOffsetTest() - { - DateTimeOffset subtractDateTimeOffset = new DateTimeOffset(2013, 11, 27, 10, 0, 0, 0, new TimeSpan(-1, 0, 0)); - var todayLocal = TryMoveToLocalTimeZone(today); - var substractDTOLocal = TryMoveToLocalTimeZone(subtractDateTimeOffset); - RunAllTests(e => e.Today.Subtract(substractDTOLocal)==todayLocal.Subtract(substractDTOLocal)); - } - - [Test] - public void SubtractTimeSpanTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.Subtract(new TimeSpan(1, 10, 2, 1))==todayLocal.Subtract(new TimeSpan(1, 10, 2, 1))); - } - - #endregion - - [Test] - public void ToUniversalTimeTest() - { - var todayLocal = TryMoveToLocalTimeZone(today); - RunAllTests(e => e.Today.ToUniversalTime()==todayLocal.ToUniversalTime()); - } - - [Test] - public void ToLocalTimeTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from t in session.Query.All() - group t by new { - Date = t.Today.ToLocalTime(), - ServerOffset = t.Today.ToLocalTime().Offset - }; - - var resultQuery = query.ToList().FirstOrDefault(); - - if (resultQuery!=null) { - var serverOffset = new TimeSpan(resultQuery.Key.ServerOffset.Hours, resultQuery.Key.ServerOffset.Minutes, 0); - var todayLocal = TryMoveToLocalTimeZone(today); - Assert.That(resultQuery.Key.Date, Is.EqualTo(todayLocal.ToOffset(serverOffset))); - } - tx.Complete(); - } - } - - [Test] - public void OutputDateTimeOffsetTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Select(d => d.Today) - .ToList(); - var todayLocal = TryMoveToLocalTimeZone(today); - Assert.That(result[0], Is.EqualTo(todayLocal)); - tx.Complete(); - } - } - - protected DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) - { - if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) - return dateTimeOffset.ToLocalTime(); - return dateTimeOffset; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2013.11.27 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0171_DateTimeOffsetModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0171_DateTimeOffsetModel + { + [HierarchyRoot] + public class EntityWithDateTimeOffset : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public DateTimeOffset Today { get; set; } + } + } + + [TestFixture] + internal class IssueJira0171_DateTimeOffset : AutoBuildTest + { + private DateTimeOffset today = new DateTimeOffset(2018, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithDateTimeOffset)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + var providerInfo = StorageProviderInfo.Instance.Info; + if (providerInfo.ProviderName == WellKnown.Provider.PostgreSql) { + var localZone = today.ToLocalTime().Offset; + var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); + configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); + } + return configuration; + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var e = new EntityWithDateTimeOffset { + Today = today + }; + tx.Complete(); + } + } + + private void RunAllTestsInt(Func>> filterProvider) + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + RunTest(session, filterProvider.Invoke(1)); + RunTest(session, filterProvider.Invoke(20)); + RunTest(session, filterProvider.Invoke(-5)); + RunTest(session, filterProvider.Invoke(0)); + } + } + + private void RunAllTestsDouble(Func>> filterProvider) + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + RunTest(session, filterProvider.Invoke(1)); + RunTest(session, filterProvider.Invoke(20)); + RunTest(session, filterProvider.Invoke(-5)); + RunTest(session, filterProvider.Invoke(0)); + } + } + + private static void RunTest(Session session, Expression> filter) + { + var count = session.Query.All().Count(filter); + Assert.That(count, Is.EqualTo(1)); + } + + private void RunAllTests(Expression> filterProvider) + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + RunTest(session, filterProvider); + } + } + + # region Test Methods For Adding + + [Test] + public void AddYearsTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsInt(value => e => e.Today.AddYears(value)==todayLocal.AddYears(value)); + } + + [Test] + public void AddMonthsTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsInt(value => e => e.Today.AddMonths(value)==todayLocal.AddMonths(value)); + } + + [Test] + public void AddDaysTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsDouble(value => e => e.Today.AddDays(value)==todayLocal.AddDays(value)); + } + + [Test] + public void AddHoursTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsDouble(value => e => e.Today.AddHours(value)==todayLocal.AddHours(value)); + } + + [Test] + public void AddMinutesTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsDouble(value => e => e.Today.AddMinutes(value)==todayLocal.AddMinutes(value)); + } + + [Test] + public void AddSecondsTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsDouble(value => e => e.Today.AddSeconds(value)==todayLocal.AddSeconds(value)); + } + + [Test] + public void AddMillisecondsTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTestsDouble(value => e => e.Today.AddMilliseconds(value)==todayLocal.AddMilliseconds(value)); + } + + [Test] + public void AddTest() + { + TimeSpan timeSpan = new TimeSpan(-6, 00, 0); + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Add(timeSpan)==todayLocal.Add(timeSpan)); + } + + # endregion + + # region Tests Extractors + + [Test] + public void YearTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Year==todayLocal.Year); + } + + [Test] + public void MonthTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Month==todayLocal.Month); + } + + [Test] + public void DayTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Day==todayLocal.Day); + } + + [Test] + public void HourTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Hour==todayLocal.Hour); + } + + [Test] + public void MinuteTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Minute==todayLocal.Minute); + } + + [Test] + public void SecondTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Second==todayLocal.Second); + } + + [Test] + public void MilliseconsTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Millisecond==todayLocal.Millisecond); + } + + [Test] + public void TimeOfDayTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.TimeOfDay==todayLocal.TimeOfDay); + } + + [Test] + public void DateTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Date==todayLocal.Date); + } + + [Test] + public void DayOfWeekTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.DayOfWeek==todayLocal.DayOfWeek); + } + + [Test] + public void DayOfYearTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.DayOfYear==todayLocal.DayOfYear); + } + + [Test] + public void DateTimeTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.DateTime==todayLocal.DateTime); + } + + [Test] + public void OffsetTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Offset==todayLocal.Offset); + } + + [Test] + public void UtcDateTimeTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.UtcDateTime==todayLocal.UtcDateTime); + } + + [Test] + public void LocalDateTimeTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.LocalDateTime==todayLocal.LocalDateTime); + } + + # endregion + + #region Tests Operators + + [Test] + public void EqualityTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today==todayLocal); + } + + [Test] + public void InequalityTets() + { + DateTimeOffset dateTimeOffset = DateTimeOffset.Now; + var nowLocal = TryMoveToLocalTimeZone(dateTimeOffset); + RunAllTests(e => e.Today!=nowLocal); + } + + [Test] + public void GreaterThanTest() + { + DateTimeOffset dateTimeOffset = new DateTimeOffset(2012, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); + var dtoLocal = TryMoveToLocalTimeZone(dateTimeOffset); + RunAllTests(e => e.Today > dtoLocal); + } + + [Test] + public void GreaterThanOrEqual() + { + DateTimeOffset dateTimeOffset = new DateTimeOffset(2012, 11, 28, 16, 53, 0, 0, new TimeSpan(4, 10, 0)); + var todayLocal = TryMoveToLocalTimeZone(today); + var dtoLocal = TryMoveToLocalTimeZone(dateTimeOffset); + RunAllTests(e => e.Today >= dtoLocal); + RunAllTests(e => e.Today >= todayLocal); + } + + [Test] + public void LessThan() + { + var nowLocal = TryMoveToLocalTimeZone(DateTimeOffset.Now); + RunAllTests(e => e.Today < nowLocal); + } + + [Test] + public void LessThanOrEqual() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today <= DateTimeOffset.Now); + RunAllTests(e => e.Today <= today); + } + + [Test] + public void AdditionTest() + { + TimeSpan timeSpan = new TimeSpan(1, 2, 3, 4, 5); + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => (e.Today + timeSpan)==(todayLocal + timeSpan)); + } + + [Test] + public void SubtractDateTimeOffsetTest() + { + DateTimeOffset subtractDateTimeOffset = new DateTimeOffset(2013, 11, 27, 10, 0, 0, 0, new TimeSpan(-1, 0, 0)); + var todayLocal = TryMoveToLocalTimeZone(today); + var substractDTOLocal = TryMoveToLocalTimeZone(subtractDateTimeOffset); + RunAllTests(e => e.Today.Subtract(substractDTOLocal)==todayLocal.Subtract(substractDTOLocal)); + } + + [Test] + public void SubtractTimeSpanTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.Subtract(new TimeSpan(1, 10, 2, 1))==todayLocal.Subtract(new TimeSpan(1, 10, 2, 1))); + } + + #endregion + + [Test] + public void ToUniversalTimeTest() + { + var todayLocal = TryMoveToLocalTimeZone(today); + RunAllTests(e => e.Today.ToUniversalTime()==todayLocal.ToUniversalTime()); + } + + [Test] + public void ToLocalTimeTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from t in session.Query.All() + group t by new { + Date = t.Today.ToLocalTime(), + ServerOffset = t.Today.ToLocalTime().Offset + }; + + var resultQuery = query.ToList().FirstOrDefault(); + + if (resultQuery!=null) { + var serverOffset = new TimeSpan(resultQuery.Key.ServerOffset.Hours, resultQuery.Key.ServerOffset.Minutes, 0); + var todayLocal = TryMoveToLocalTimeZone(today); + Assert.That(resultQuery.Key.Date, Is.EqualTo(todayLocal.ToOffset(serverOffset))); + } + tx.Complete(); + } + } + + [Test] + public void OutputDateTimeOffsetTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Select(d => d.Today) + .ToList(); + var todayLocal = TryMoveToLocalTimeZone(today); + Assert.That(result[0], Is.EqualTo(todayLocal)); + tx.Complete(); + } + } + + protected DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) + { + if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) + return dateTimeOffset.ToLocalTime(); + return dateTimeOffset; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0179_NullableBooleanFieldsQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0179_NullableBooleanFieldsQuery.cs index d976f1c744..6f561408ca 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0179_NullableBooleanFieldsQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0179_NullableBooleanFieldsQuery.cs @@ -1,151 +1,151 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.23 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0179_NullableBooleanFieldsQueryModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0179_NullableBooleanFieldsQueryModel -{ - [HierarchyRoot] - public class FlagContainer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public bool? Flag { get; private set; } - - public FlagContainer(bool? flag) - { - Flag = flag; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0179_NullableBooleanFieldsQuery : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FlagContainer).Assembly, typeof (FlagContainer).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new FlagContainer(true); - new FlagContainer(false); - new FlagContainer(null); - t.Complete(); - } - } - } - - [Test] - public void EqualsNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => c.Flag==null); - Assert.AreEqual(1, result); - // Rollback - } - } - } - - [Test] - public void NotEqualsNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => c.Flag!=null); - Assert.AreEqual(2, result); - // Rollback - } - } - } - - [Test] - public void HasValueTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => c.Flag.HasValue); - Assert.AreEqual(2, result); - // Rollback - } - } - } - - - [Test] - public void NotHasValueTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => !c.Flag.HasValue); - Assert.AreEqual(1, result); - // Rollback - } - } - } - - [Test] - public void GetValueOrDefault1Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => !c.Flag.GetValueOrDefault()); - Assert.AreEqual(2, result); - // Rollback - } - } - } - - [Test] - public void GetValueOrDefault2Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => c.Flag.GetValueOrDefault(true)); - Assert.AreEqual(2, result); - // Rollback - } - } - } - - [Test] - public void CoalesceTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => c.Flag ?? true); - Assert.AreEqual(2, result); - // Rollback - } - } - } - - [Test] - public void NotCoalesceTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var result = session.Query.All().Count(c => !(c.Flag ?? true)); - Assert.AreEqual(1, result); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.23 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0179_NullableBooleanFieldsQueryModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0179_NullableBooleanFieldsQueryModel +{ + [HierarchyRoot] + public class FlagContainer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public bool? Flag { get; private set; } + + public FlagContainer(bool? flag) + { + Flag = flag; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0179_NullableBooleanFieldsQuery : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FlagContainer).Assembly, typeof (FlagContainer).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new FlagContainer(true); + new FlagContainer(false); + new FlagContainer(null); + t.Complete(); + } + } + } + + [Test] + public void EqualsNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => c.Flag==null); + Assert.AreEqual(1, result); + // Rollback + } + } + } + + [Test] + public void NotEqualsNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => c.Flag!=null); + Assert.AreEqual(2, result); + // Rollback + } + } + } + + [Test] + public void HasValueTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => c.Flag.HasValue); + Assert.AreEqual(2, result); + // Rollback + } + } + } + + + [Test] + public void NotHasValueTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => !c.Flag.HasValue); + Assert.AreEqual(1, result); + // Rollback + } + } + } + + [Test] + public void GetValueOrDefault1Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => !c.Flag.GetValueOrDefault()); + Assert.AreEqual(2, result); + // Rollback + } + } + } + + [Test] + public void GetValueOrDefault2Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => c.Flag.GetValueOrDefault(true)); + Assert.AreEqual(2, result); + // Rollback + } + } + } + + [Test] + public void CoalesceTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => c.Flag ?? true); + Assert.AreEqual(2, result); + // Rollback + } + } + } + + [Test] + public void NotCoalesceTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var result = session.Query.All().Count(c => !(c.Flag ?? true)); + Assert.AreEqual(1, result); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion1.cs index 144dfd4b5f..803315a881 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion1.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.19 - -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1 -{ - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public decimal? Weight { get; set; } - - [Field] - public int Age { get; set; } - - [Field] - public Car Car { get; set; } - - [Field] - public Phone Phone { get; set; } - } - - [HierarchyRoot] - public class Car : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class Phone : Entity - { - [Key, Field] - public long Id { get; private set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.19 + +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1 +{ + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public decimal? Weight { get; set; } + + [Field] + public int Age { get; set; } + + [Field] + public Car Car { get; set; } + + [Field] + public Phone Phone { get; set; } + } + + [HierarchyRoot] + public class Car : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class Phone : Entity + { + [Key, Field] + public long Id { get; private set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion2.cs index a759739148..8725c85a0e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/ModelVersion2.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.19 - -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2 -{ - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field(Nullable = false)] // Made non-nullable - public string Name { get; set; } - - [Field] // Made non-nullable - public decimal Weight { get; set; } - - // Age is removed - - // Car is removed - - [Field(Nullable = false)] // Made non-nullable - public Phone Phone { get; set; } - } - - [HierarchyRoot] - public class Car : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class Phone : Entity - { - [Key, Field] - public long Id { get; private set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.19 + +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2 +{ + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field(Nullable = false)] // Made non-nullable + public string Name { get; set; } + + [Field] // Made non-nullable + public decimal Weight { get; set; } + + // Age is removed + + // Car is removed + + [Field(Nullable = false)] // Made non-nullable + public Phone Phone { get; set; } + } + + [HierarchyRoot] + public class Car : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class Phone : Entity + { + [Key, Field] + public long Id { get; private set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/UpgradeTest.cs index 24da7fef2c..313b69de44 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/UpgradeTest.cs @@ -1,92 +1,92 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.19 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using M1 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [Test] - public void NoneTest() - { - RunTest(NamingRules.None); - } - - [Test] - public void UnderscoreDotsTest() - { - RunTest(NamingRules.UnderscoreDots); - } - - [Test] - public void UnderscoreHyphensTest() - { - RunTest(NamingRules.UnderscoreHyphens); - } - - [Test] - public void UnderscoreDotsAndHyphensTest() - { - RunTest(NamingRules.UnderscoreDots | NamingRules.UnderscoreHyphens); - } - - private void RunTest(NamingRules namingRules) - { - BuildDomain("1", DomainUpgradeMode.Recreate, namingRules); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var person = new M1.Person { - Name = "Vasya", - Weight = 80, - Age = 20, - Phone = new M1.Phone(), - }; - tx.Complete(); - } - } - BuildDomain("2", DomainUpgradeMode.PerformSafely, namingRules); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var vasya = session.Query.All().Single(); - Assert.AreEqual("Vasya", vasya.Name); - Assert.AreEqual(80, vasya.Weight); - Assert.IsNotNull(vasya.Phone); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode, NamingRules namingRules) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Person).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - configuration.NamingConvention.NamingRules = namingRules; - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.19 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using M1 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [Test] + public void NoneTest() + { + RunTest(NamingRules.None); + } + + [Test] + public void UnderscoreDotsTest() + { + RunTest(NamingRules.UnderscoreDots); + } + + [Test] + public void UnderscoreHyphensTest() + { + RunTest(NamingRules.UnderscoreHyphens); + } + + [Test] + public void UnderscoreDotsAndHyphensTest() + { + RunTest(NamingRules.UnderscoreDots | NamingRules.UnderscoreHyphens); + } + + private void RunTest(NamingRules namingRules) + { + BuildDomain("1", DomainUpgradeMode.Recreate, namingRules); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var person = new M1.Person { + Name = "Vasya", + Weight = 80, + Age = 20, + Phone = new M1.Phone(), + }; + tx.Complete(); + } + } + BuildDomain("2", DomainUpgradeMode.PerformSafely, namingRules); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var vasya = session.Query.All().Single(); + Assert.AreEqual("Vasya", vasya.Name); + Assert.AreEqual(80, vasya.Weight); + Assert.IsNotNull(vasya.Phone); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode, NamingRules namingRules) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Person).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + configuration.NamingConvention.NamingRules = namingRules; + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/Upgrader.cs index cbc7ba8b46..70d96879e8 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0180_ChangeNullabilityViaUpgradeHints/Upgrader.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.19 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - var hints = new List(); - hints.AddRange(GetTypeRenameHints("Version1", "Version2")); - hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Name")); - hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Weight")); - hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Phone")); - hints.Add(new RemoveFieldHint(typeof (M1.Person), "Age")); - hints.Add(new RemoveFieldHint(typeof (M1.Person), "Car")); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.19 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0180_ChangeNullabilityViaUpgradeHints +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + var hints = new List(); + hints.AddRange(GetTypeRenameHints("Version1", "Version2")); + hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Name")); + hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Weight")); + hints.Add(new ChangeFieldTypeHint(typeof (M2.Person), "Phone")); + hints.Add(new RemoveFieldHint(typeof (M1.Person), "Age")); + hints.Add(new RemoveFieldHint(typeof (M1.Person), "Car")); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0187_TypeCastInContain.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0187_TypeCastInContain.cs index f84129ed93..b25b80ca9e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0187_TypeCastInContain.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0187_TypeCastInContain.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.09.06 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue_TypeCastInContain_Model; -using System.Collections.Generic; - -namespace Xtensive.Orm.Tests.Issues.Issue_TypeCastInContain_Model -{ - [HierarchyRoot] - public class Parent : Entity - { - [Field, Key] - public int Id { get; private set; } - - public Parent(Session session) - : base(session) - { - } - } - - public class Child : Parent - { - [Field] - public bool SomeBool { get; set; } - - [Field] - public Parent Parent { get; set; } - - public Child(Session session) - : base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue_TypeCastInContain : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - CreateSessionAndTransaction(); - } - - [Test] - public void ParentsContainsChildWithImplicitCastTest() - { - var parents = Query.All().ToArray(); - var result = Query.All().Where(child => parents.Contains(child)).ToArray(); - } - - [Test] - public void ParentsContainsChildWithExplicitCastTest() - { - var parents = Query.All().ToArray(); - var result = Query.All().Where(child => parents.Contains(child as Parent)).ToArray(); - } - - [Test] - public void ChildInParentsTest() - { - var parents = Query.All().ToArray(); - var result = Query.All().Where(child => child.In(parents)).ToArray(); - } - - [Test] - public void ChildContainsParentWithImplicitCast() - { - var children = Query.All().ToArray(); - var result = Query.All().Where(a => children.Contains(a.Parent)).ToArray(); - } - - [Test] - public void ChildContainsParentWithExplicitCast() - { - var children = Query.All().ToArray(); - var result = Query.All().Where(a => (children as IEnumerable).Contains(a.Parent)).ToArray(); - } - - [Test] - public void ParentInChildrenTest() - { - var children = Query.All().ToArray(); - var result = Query.All().Where(a => a.Parent.In(children)).ToArray(); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.09.06 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue_TypeCastInContain_Model; +using System.Collections.Generic; + +namespace Xtensive.Orm.Tests.Issues.Issue_TypeCastInContain_Model +{ + [HierarchyRoot] + public class Parent : Entity + { + [Field, Key] + public int Id { get; private set; } + + public Parent(Session session) + : base(session) + { + } + } + + public class Child : Parent + { + [Field] + public bool SomeBool { get; set; } + + [Field] + public Parent Parent { get; set; } + + public Child(Session session) + : base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue_TypeCastInContain : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + CreateSessionAndTransaction(); + } + + [Test] + public void ParentsContainsChildWithImplicitCastTest() + { + var parents = Query.All().ToArray(); + var result = Query.All().Where(child => parents.Contains(child)).ToArray(); + } + + [Test] + public void ParentsContainsChildWithExplicitCastTest() + { + var parents = Query.All().ToArray(); + var result = Query.All().Where(child => parents.Contains(child as Parent)).ToArray(); + } + + [Test] + public void ChildInParentsTest() + { + var parents = Query.All().ToArray(); + var result = Query.All().Where(child => child.In(parents)).ToArray(); + } + + [Test] + public void ChildContainsParentWithImplicitCast() + { + var children = Query.All().ToArray(); + var result = Query.All().Where(a => children.Contains(a.Parent)).ToArray(); + } + + [Test] + public void ChildContainsParentWithExplicitCast() + { + var children = Query.All().ToArray(); + var result = Query.All().Where(a => (children as IEnumerable).Contains(a.Parent)).ToArray(); + } + + [Test] + public void ParentInChildrenTest() + { + var children = Query.All().ToArray(); + var result = Query.All().Where(a => a.Parent.In(children)).ToArray(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0188_MissingFKsForComplexHierarchies.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0188_MissingFKsForComplexHierarchies.cs index ba9c814c5b..8f100cd395 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0188_MissingFKsForComplexHierarchies.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0188_MissingFKsForComplexHierarchies.cs @@ -1,143 +1,143 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.20 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Sql.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0188_MissingFKsForComplexHierarchiesModel; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0188_MissingFKsForComplexHierarchiesModel -{ - public interface IDocumentElement : IEntity - { - [Field] - Document Document { get; } - } - - public interface IDocumentCollection : IEntity - { - [Field] - EntitySet Documents { get; } - } - - [HierarchyRoot] - public class Document : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Picture : Entity, IDocumentElement - { - [Field, Key] - public int Id { get; private set; } - - public Document Document { get; set; } - } - - [HierarchyRoot] - public class Paragraph : Entity, IDocumentElement - { - [Field, Key] - public int Id { get; private set; } - - public Document Document { get; set; } - } - - [HierarchyRoot] - public class Person : Entity, IDocumentCollection - { - [Field, Key] - public int Id { get; private set; } - - public EntitySet Documents { get; private set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] - public abstract class Animal : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Person Owner { get; set; } - } - - public class Dog : Animal - { - } - - public class Cat : Animal - { - } - - public class Tiger : Cat - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0188_MissingFKsForComplexHierarchies : AutoBuildTest - { - private Schema schema; - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - var domain = base.BuildDomain(configuration); - schema = StorageTestHelper.GetDefaultSchema(domain); - return domain; - } - - [Test] - public void AnimalsTest() - { - Assert.AreEqual(1, GetForeignKeysCount(typeof (Dog))); - Assert.AreEqual(1, GetForeignKeysCount(typeof (Cat))); - Assert.AreEqual(1, GetForeignKeysCount(typeof (Tiger))); - } - - [Test] - public void DocumentsTest() - { - Assert.AreEqual(1, GetForeignKeysCount(typeof (Picture))); - Assert.AreEqual(1, GetForeignKeysCount(typeof (Paragraph))); - } - - private int GetForeignKeysCount(TypeInfo typeInfo) - { - var tableName = Domain.Handlers.NameBuilder.ApplyNamingRules(typeInfo.MappingName); - var result = schema.Tables[tableName].TableConstraints.OfType().Count(); - return result; - } - - private int GetForeignKeysCount(Type type) - { - return GetForeignKeysCount(Domain.Model.Types[type]); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.20 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Sql.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0188_MissingFKsForComplexHierarchiesModel; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0188_MissingFKsForComplexHierarchiesModel +{ + public interface IDocumentElement : IEntity + { + [Field] + Document Document { get; } + } + + public interface IDocumentCollection : IEntity + { + [Field] + EntitySet Documents { get; } + } + + [HierarchyRoot] + public class Document : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Picture : Entity, IDocumentElement + { + [Field, Key] + public int Id { get; private set; } + + public Document Document { get; set; } + } + + [HierarchyRoot] + public class Paragraph : Entity, IDocumentElement + { + [Field, Key] + public int Id { get; private set; } + + public Document Document { get; set; } + } + + [HierarchyRoot] + public class Person : Entity, IDocumentCollection + { + [Field, Key] + public int Id { get; private set; } + + public EntitySet Documents { get; private set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] + public abstract class Animal : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Person Owner { get; set; } + } + + public class Dog : Animal + { + } + + public class Cat : Animal + { + } + + public class Tiger : Cat + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0188_MissingFKsForComplexHierarchies : AutoBuildTest + { + private Schema schema; + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + schema = StorageTestHelper.GetDefaultSchema(domain); + return domain; + } + + [Test] + public void AnimalsTest() + { + Assert.AreEqual(1, GetForeignKeysCount(typeof (Dog))); + Assert.AreEqual(1, GetForeignKeysCount(typeof (Cat))); + Assert.AreEqual(1, GetForeignKeysCount(typeof (Tiger))); + } + + [Test] + public void DocumentsTest() + { + Assert.AreEqual(1, GetForeignKeysCount(typeof (Picture))); + Assert.AreEqual(1, GetForeignKeysCount(typeof (Paragraph))); + } + + private int GetForeignKeysCount(TypeInfo typeInfo) + { + var tableName = Domain.Handlers.NameBuilder.ApplyNamingRules(typeInfo.MappingName); + var result = schema.Tables[tableName].TableConstraints.OfType().Count(); + return result; + } + + private int GetForeignKeysCount(Type type) + { + return GetForeignKeysCount(Domain.Model.Types[type]); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty.cs index b35d9056aa..56392fa48e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty.cs @@ -1,117 +1,117 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.22 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0194_WrongResultWhenInClauseArgumentIsEmptyModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0194_WrongResultWhenInClauseArgumentIsEmptyModel -{ - [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] - public class Person : Entity - { - [Field(Length = 100), Key(0)] - public string Name { get; private set; } - - [Field(Length = 100), Key(1)] - public string Surname { get; private set; } - - public Person(string name, string surname) - : base(name, surname) - { - } - } - - [HierarchyRoot] - public class Document : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Person Owner { get; set; } - - public Document() - { - Name = Id.ToString(); - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); - return config; - } - - [Test] - public void ListOfPrimitiveTypeAsParameterTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var document = new Document(); - var forbiddenIds = new List(); - var result = session.Query.All().Where(doc => !doc.Id.In(forbiddenIds)).Count(); - Assert.AreEqual(1, result); - // Rollback - } - } - } - - [Test] - public void ListOfPrimitiveTypeAsExpressionTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var document = new Document(); - var result = session.Query.All().Where(doc => !doc.Id.In(new List())).Count(); - Assert.AreEqual(1, result); - // Rollback - } - } - } - - [Test] - public void ListOfReferenceTypeAsParameterTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = new Person("Vasily", "Petrov"); - var document = new Document {Owner = person}; - var forbiddenOwners = new List(); - var result = session.Query.All().Where(doc => !doc.Owner.In(forbiddenOwners)).Count(); - Assert.AreEqual(1, result); - // Rollback - } - } - } - - [Test] - public void ListOfReferenceTypeAsExpressionTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = new Person("Vasily", "Petrov"); - var document = new Document {Owner = person}; - var result = session.Query.All().Where(doc => !doc.Owner.In(new List())).Count(); - Assert.AreEqual(1, result); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.22 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0194_WrongResultWhenInClauseArgumentIsEmptyModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0194_WrongResultWhenInClauseArgumentIsEmptyModel +{ + [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] + public class Person : Entity + { + [Field(Length = 100), Key(0)] + public string Name { get; private set; } + + [Field(Length = 100), Key(1)] + public string Surname { get; private set; } + + public Person(string name, string surname) + : base(name, surname) + { + } + } + + [HierarchyRoot] + public class Document : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Person Owner { get; set; } + + public Document() + { + Name = Id.ToString(); + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0194_WrongResultWhenInClauseArgumentIsEmpty : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Document).Assembly, typeof (Document).Namespace); + return config; + } + + [Test] + public void ListOfPrimitiveTypeAsParameterTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var document = new Document(); + var forbiddenIds = new List(); + var result = session.Query.All().Where(doc => !doc.Id.In(forbiddenIds)).Count(); + Assert.AreEqual(1, result); + // Rollback + } + } + } + + [Test] + public void ListOfPrimitiveTypeAsExpressionTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var document = new Document(); + var result = session.Query.All().Where(doc => !doc.Id.In(new List())).Count(); + Assert.AreEqual(1, result); + // Rollback + } + } + } + + [Test] + public void ListOfReferenceTypeAsParameterTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = new Person("Vasily", "Petrov"); + var document = new Document {Owner = person}; + var forbiddenOwners = new List(); + var result = session.Query.All().Where(doc => !doc.Owner.In(forbiddenOwners)).Count(); + Assert.AreEqual(1, result); + // Rollback + } + } + } + + [Test] + public void ListOfReferenceTypeAsExpressionTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = new Person("Vasily", "Petrov"); + var document = new Document {Owner = person}; + var result = session.Query.All().Where(doc => !doc.Owner.In(new List())).Count(); + Assert.AreEqual(1, result); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0195_DeleteAndCreateWithValidation.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0195_DeleteAndCreateWithValidation.cs index 4bc659829a..46ac76c836 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0195_DeleteAndCreateWithValidation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0195_DeleteAndCreateWithValidation.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.23 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0195_DeleteAndCreateWithValidationModel; -using Xtensive.Orm.Validation; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0195_DeleteAndCreateWithValidationModel -{ - [HierarchyRoot] - public class Guider : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - protected override void OnValidate() - { - if (IsRemoved) - throw new InvalidOperationException("Should not validate removed entity"); - } - - public Guider(Guid id) - : base(id) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0195_DeleteAndCreateWithValidation : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Guider).Assembly, typeof (Guider).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var id = Guid.NewGuid(); - new Guider(id) {Name = "123"}; - var g = session.Query.Single(id); - g.Remove(); - new Guider(id) {Name = "321"}; - Assert.IsTrue(g.IsRemoved); // Check that IsRemoved is accessible - g.Validate(); // Check that Validate() is no-op for removed entities - // rollback - } - } - } - - [Test] - public void RegressionTest() - { - // Ensure no regression: - // it should be imposible to create entity with the same key - // if old entity is not removed - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var id = Guid.NewGuid(); - var expected = new Guider(id) {Name = "123"}; - AssertEx.Throws(() => new Guider(id) {Name = "321"}); - var actual = session.Query.All().Single(); - Assert.AreSame(expected, actual); - Assert.AreEqual("123", actual.Name); - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.23 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0195_DeleteAndCreateWithValidationModel; +using Xtensive.Orm.Validation; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0195_DeleteAndCreateWithValidationModel +{ + [HierarchyRoot] + public class Guider : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + protected override void OnValidate() + { + if (IsRemoved) + throw new InvalidOperationException("Should not validate removed entity"); + } + + public Guider(Guid id) + : base(id) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0195_DeleteAndCreateWithValidation : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Guider).Assembly, typeof (Guider).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var id = Guid.NewGuid(); + new Guider(id) {Name = "123"}; + var g = session.Query.Single(id); + g.Remove(); + new Guider(id) {Name = "321"}; + Assert.IsTrue(g.IsRemoved); // Check that IsRemoved is accessible + g.Validate(); // Check that Validate() is no-op for removed entities + // rollback + } + } + } + + [Test] + public void RegressionTest() + { + // Ensure no regression: + // it should be imposible to create entity with the same key + // if old entity is not removed + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var id = Guid.NewGuid(); + var expected = new Guider(id) {Name = "123"}; + AssertEx.Throws(() => new Guider(id) {Name = "321"}); + var actual = session.Query.All().Single(); + Assert.AreSame(expected, actual); + Assert.AreEqual("123", actual.Name); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0196_GuidAsTypeDiscriminator.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0196_GuidAsTypeDiscriminator.cs index eb86d0d89d..e4b36b98bd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0196_GuidAsTypeDiscriminator.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0196_GuidAsTypeDiscriminator.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.27 - -using System; -using NUnit.Framework; -using Xtensive.Reflection; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0196_GuidAsTypeDiscriminatorModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0196_GuidAsTypeDiscriminatorModel -{ - [HierarchyRoot, TypeDiscriminatorValue("8F68958C-E7F5-4CC2-BCFD-B0F24426191F")] - public class User : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, TypeDiscriminator] - public Guid UserType { get; set; } - } - - [TypeDiscriminatorValue("FDC50B92-8150-42F1-9AAD-17B36DBFD55C")] - public class AdminUser : User - { - } - - [TypeDiscriminatorValue("4118F961-8CFA-4C16-BCC6-B1A8662FCE31", Default = true)] - public class GuestUser : User - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0196_GuidAsTypeDiscriminator : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - CheckUserType(new AdminUser()); - CheckUserType(new GuestUser()); - CheckUserType(new User()); - t.Complete(); - } - } - } - - private void CheckUserType(User user) - { - var expected = new Guid(user.GetType().GetAttribute().Value.ToString()); - Assert.AreEqual(expected, user.UserType); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.27 + +using System; +using NUnit.Framework; +using Xtensive.Reflection; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0196_GuidAsTypeDiscriminatorModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0196_GuidAsTypeDiscriminatorModel +{ + [HierarchyRoot, TypeDiscriminatorValue("8F68958C-E7F5-4CC2-BCFD-B0F24426191F")] + public class User : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, TypeDiscriminator] + public Guid UserType { get; set; } + } + + [TypeDiscriminatorValue("FDC50B92-8150-42F1-9AAD-17B36DBFD55C")] + public class AdminUser : User + { + } + + [TypeDiscriminatorValue("4118F961-8CFA-4C16-BCC6-B1A8662FCE31", Default = true)] + public class GuestUser : User + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0196_GuidAsTypeDiscriminator : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(User).Assembly, typeof(User).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + CheckUserType(new AdminUser()); + CheckUserType(new GuestUser()); + CheckUserType(new User()); + t.Complete(); + } + } + } + + private void CheckUserType(User user) + { + var expected = new Guid(user.GetType().GetAttribute().Value.ToString()); + Assert.AreEqual(expected, user.UserType); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0197_ExtendedErrorInformation.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0197_ExtendedErrorInformation.cs index fc3026a6b1..037ce272ef 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0197_ExtendedErrorInformation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0197_ExtendedErrorInformation.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.30 - -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.IssueJira0197_ExtendedErrorInformationModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0197_ExtendedErrorInformationModel -{ - [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None), Index("Unique", Unique = true)] - public class ErrorProvider : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Unique { get; set; } - - [Field(Nullable = false)] - public string NotNull { get; set; } - - public ErrorProvider(int id) - : base(id) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0197_ExtendedErrorInformation : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (ErrorProvider).Assembly, typeof (ErrorProvider).Namespace); - return config; - } - - [Test] - public void InsertNullTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - try { - new ErrorProvider(1); - session.SaveChanges(); - } - catch (CheckConstraintViolationException exception) { - var expected = Domain.Model.Types[typeof (ErrorProvider)]; - Assert.AreEqual(expected, exception.Info.Type); - Assert.AreEqual(expected.Fields["NotNull"], exception.Info.Field); - } - } - } - } - - [Test] - public void DuplicateUniqueIndexTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - try { - new ErrorProvider(2) {NotNull = string.Empty, Unique = 2}; - session.SaveChanges(); - new ErrorProvider(3) {NotNull = string.Empty, Unique = 2}; - session.SaveChanges(); - Assert.Fail(); - } - catch (UniqueConstraintViolationException exception) { - Assert.AreEqual(Domain.Model.Types[typeof (ErrorProvider)], exception.Info.Type); - } - } - } - } - - [Test] - public void DuplicatePrimaryKeyTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new ErrorProvider(3) {NotNull = string.Empty, Unique = 31}; - t.Complete(); - } - } - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - try { - new ErrorProvider(3) {NotNull = string.Empty, Unique = 32}; - session.SaveChanges(); - Assert.Fail(); - } - catch (UniqueConstraintViolationException exception) { - Assert.AreEqual(Domain.Model.Types[typeof (ErrorProvider)], exception.Info.Type); - } - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.30 + +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.IssueJira0197_ExtendedErrorInformationModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0197_ExtendedErrorInformationModel +{ + [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None), Index("Unique", Unique = true)] + public class ErrorProvider : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Unique { get; set; } + + [Field(Nullable = false)] + public string NotNull { get; set; } + + public ErrorProvider(int id) + : base(id) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0197_ExtendedErrorInformation : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (ErrorProvider).Assembly, typeof (ErrorProvider).Namespace); + return config; + } + + [Test] + public void InsertNullTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + try { + new ErrorProvider(1); + session.SaveChanges(); + } + catch (CheckConstraintViolationException exception) { + var expected = Domain.Model.Types[typeof (ErrorProvider)]; + Assert.AreEqual(expected, exception.Info.Type); + Assert.AreEqual(expected.Fields["NotNull"], exception.Info.Field); + } + } + } + } + + [Test] + public void DuplicateUniqueIndexTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + try { + new ErrorProvider(2) {NotNull = string.Empty, Unique = 2}; + session.SaveChanges(); + new ErrorProvider(3) {NotNull = string.Empty, Unique = 2}; + session.SaveChanges(); + Assert.Fail(); + } + catch (UniqueConstraintViolationException exception) { + Assert.AreEqual(Domain.Model.Types[typeof (ErrorProvider)], exception.Info.Type); + } + } + } + } + + [Test] + public void DuplicatePrimaryKeyTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new ErrorProvider(3) {NotNull = string.Empty, Unique = 31}; + t.Complete(); + } + } + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + try { + new ErrorProvider(3) {NotNull = string.Empty, Unique = 32}; + session.SaveChanges(); + Assert.Fail(); + } + catch (UniqueConstraintViolationException exception) { + Assert.AreEqual(Domain.Model.Types[typeof (ErrorProvider)], exception.Info.Type); + } + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0202_OnRemoveActionOverriding.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0202_OnRemoveActionOverriding.cs index 7702d1efde..823180d546 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0202_OnRemoveActionOverriding.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0202_OnRemoveActionOverriding.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.11.18 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0202_OnRemoveActionOverriding_Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0202_OnRemoveActionOverriding_Model -{ - public interface IBaseEntity : IEntity - { - [Field(Nullable = false)] - Linked Entity { get; set; } - } - - [HierarchyRoot] - public class Linked2 : Entity, IBaseEntity - { - public Linked2(Guid id) - : base(id) - { - } - - [Field, Key] - public Guid Id { get; private set; } - - [Association(OnTargetRemove = OnRemoveAction.Cascade)] - public Linked Entity { get; set; } - } - - [HierarchyRoot] - public class Linked : Entity - { - public Linked(Guid id) - : base(id) - { - } - - [Field, Key] - public Guid Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [Ignore("")] - public class IssueJira0202_OnRemoveActionOverriding : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Linked).Assembly, typeof (Linked).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) { - using (var t = Session.Current.OpenTransaction()) { - var l = new Linked(Guid.NewGuid()); - var l2 = new Linked2(Guid.NewGuid()) {Entity = l}; - - l.Remove(); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.11.18 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0202_OnRemoveActionOverriding_Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0202_OnRemoveActionOverriding_Model +{ + public interface IBaseEntity : IEntity + { + [Field(Nullable = false)] + Linked Entity { get; set; } + } + + [HierarchyRoot] + public class Linked2 : Entity, IBaseEntity + { + public Linked2(Guid id) + : base(id) + { + } + + [Field, Key] + public Guid Id { get; private set; } + + [Association(OnTargetRemove = OnRemoveAction.Cascade)] + public Linked Entity { get; set; } + } + + [HierarchyRoot] + public class Linked : Entity + { + public Linked(Guid id) + : base(id) + { + } + + [Field, Key] + public Guid Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [Ignore("")] + public class IssueJira0202_OnRemoveActionOverriding : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Linked).Assembly, typeof (Linked).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) { + using (var t = Session.Current.OpenTransaction()) { + var l = new Linked(Guid.NewGuid()); + var l2 = new Linked2(Guid.NewGuid()) {Entity = l}; + + l.Remove(); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion1.cs index bdd369f5c7..34b9bea2cc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion1.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1 -{ - [HierarchyRoot] - public class VeryUniqueEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class EntityToRemove1 : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class EntityToKeep1 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntityToRemove1 EvilRef { get; set; } - - public EntityToKeep1(EntityToRemove1 evilRef) - { - EvilRef = evilRef; - } - } - - // Same as 1 but with NOT NULL constraint - - [HierarchyRoot] - public class EntityToRemove2 : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class EntityToKeep2 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field(Nullable = false)] - public EntityToRemove2 EvilRef { get; set; } - - public EntityToKeep2(EntityToRemove2 evilRef) - { - EvilRef = evilRef; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1 +{ + [HierarchyRoot] + public class VeryUniqueEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class EntityToRemove1 : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class EntityToKeep1 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntityToRemove1 EvilRef { get; set; } + + public EntityToKeep1(EntityToRemove1 evilRef) + { + EvilRef = evilRef; + } + } + + // Same as 1 but with NOT NULL constraint + + [HierarchyRoot] + public class EntityToRemove2 : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class EntityToKeep2 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field(Nullable = false)] + public EntityToRemove2 EvilRef { get; set; } + + public EntityToKeep2(EntityToRemove2 evilRef) + { + EvilRef = evilRef; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion2.cs index e54a733dac..39f833413d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/ModelVersion2.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2 -{ - [HierarchyRoot, Index("Field", Unique = true)] - public class VeryUniqueEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public int Field { get; set; } - } - - [HierarchyRoot] - public class EntityToKeep1 : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class EntityToKeep2 : Entity - { - [Key, Field] - public long Id { get; private set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2 +{ + [HierarchyRoot, Index("Field", Unique = true)] + public class VeryUniqueEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public int Field { get; set; } + } + + [HierarchyRoot] + public class EntityToKeep1 : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class EntityToKeep2 : Entity + { + [Key, Field] + public long Id { get; private set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/UpgradeTest.cs index 84e8124e42..bfc1450197 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/UpgradeTest.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using M1 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var toRemove1 = new M1.EntityToRemove1(); - var toKeep1 = new M1.EntityToKeep1(toRemove1); - var toRemove2 = new M1.EntityToRemove2(); - var toKeep2 = new M1.EntityToKeep2(toRemove2); - new M1.VeryUniqueEntity(); - new M1.VeryUniqueEntity(); - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.PerformSafely); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var toKeep1 = session.Query.All().Single(); - var toKeep2 = session.Query.All().Single(); - Assert.AreEqual(2, session.Query.All().Count()); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.EntityToKeep1).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.NamingConvention.NamingRules = NamingRules.UnderscoreDots; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using M1 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var toRemove1 = new M1.EntityToRemove1(); + var toKeep1 = new M1.EntityToKeep1(toRemove1); + var toRemove2 = new M1.EntityToRemove2(); + var toKeep2 = new M1.EntityToKeep2(toRemove2); + new M1.VeryUniqueEntity(); + new M1.VeryUniqueEntity(); + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.PerformSafely); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var toKeep1 = session.Query.All().Single(); + var toKeep2 = session.Query.All().Single(); + Assert.AreEqual(2, session.Query.All().Count()); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.EntityToKeep1).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.NamingConvention.NamingRules = NamingRules.UnderscoreDots; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/Upgrader.cs index 6f269c0ad5..5685f50473 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0208_IncorrectUpgradeSequence/Upgrader.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { - // Ensure uniqueness of newly created field - int i = 0; - foreach (var entity in Query.All()) - entity.Field = ++i; - } - - private static List Version1To2Hints { - get { - var hints = new List(); - hints.AddRange(GetTypeRenameHints("Version1", "Version2")); - hints.Add(new RemoveTypeHint(typeof (M1.EntityToRemove1).FullName)); - hints.Add(new RemoveTypeHint(typeof (M1.EntityToRemove2).FullName)); - hints.Add(new RemoveFieldHint(typeof (M1.EntityToKeep1), "EvilRef")); - hints.Add(new RemoveFieldHint(typeof (M1.EntityToKeep2), "EvilRef")); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0208_IncorrectUpgradeSequence +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { + // Ensure uniqueness of newly created field + int i = 0; + foreach (var entity in Query.All()) + entity.Field = ++i; + } + + private static List Version1To2Hints { + get { + var hints = new List(); + hints.AddRange(GetTypeRenameHints("Version1", "Version2")); + hints.Add(new RemoveTypeHint(typeof (M1.EntityToRemove1).FullName)); + hints.Add(new RemoveTypeHint(typeof (M1.EntityToRemove2).FullName)); + hints.Add(new RemoveFieldHint(typeof (M1.EntityToKeep1), "EvilRef")); + hints.Add(new RemoveFieldHint(typeof (M1.EntityToKeep2), "EvilRef")); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0213_GroupByNewDate.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0213_GroupByNewDate.cs index d84f49be42..11c4586cf2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0213_GroupByNewDate.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0213_GroupByNewDate.cs @@ -1,164 +1,164 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.25 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0213_GroupByNewDateModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0213_GroupByNewDateModel -{ - [HierarchyRoot] - public class EntityWithDate : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime Date { get; set; } - - public override string ToString() - { - return Date.ToString("yyyy.MM.dd"); - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0213_GroupByNewDate : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithDate).Assembly, typeof (EntityWithDate).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - var now = DateTime.Now; - for (int i = 1; i <= 10; i++) - new EntityWithDate {Date = new DateTime(now.Year, now.Month, i)}; - tx.Complete(); - } - } - - [Test] - public void GroupByNewDateDirectly() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var q = - from i in Query.All() - group i by new DateTime(i.Date.Year, i.Date.Month, 1) into g - select g; - - Assert.That(q.Count(), Is.EqualTo(1)); - } - } - - [Test] - public void GroupByNewDateWithIntermediateProjection() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var q = - from i in Query.All() - let x = new DateTime(i.Date.Year, i.Date.Month, 1) - group i by x into g - select g; - - Assert.That(q.Count(), Is.EqualTo(1)); - } - } - - [Test] - public void OrderByNewDateWithIntermediateProjection() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var expected = Query.All() - .OrderBy(e => e.Date) - .AsEnumerable() - .Reverse() - .ToList(); - - var q = - from i in Query.All() - let x = new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) - orderby x - select i; - - Assert.That(q.ToList(), Is.EqualTo(expected)); - } - } - - [Test] - public void OrderByNewDateDirectly() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var expected = Query.All() - .OrderBy(e => e.Date) - .AsEnumerable() - .Reverse() - .ToList(); - - var q = - from i in Query.All() - orderby new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) - select i; - - Assert.That(q.ToList(), Is.EqualTo(expected)); - } - } - - [Test] - public void WhereNewDateDirectly() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var now = DateTime.Now; - var firstDay = new DateTime(now.Year, now.Month, 1); - - var q = - from i in Query.All() - where new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day)==firstDay - select i; - - Assert.That(q.Single().Date.Day, Is.EqualTo(10)); - } - } - - [Test] - public void WhereNewDateWithIntermediateProjection() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - - var now = DateTime.Now; - var firstDay = new DateTime(now.Year, now.Month, 1); - - var q = - from i in Query.All() - let x = new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) - where x==firstDay - select i; - - Assert.That(q.Single().Date.Day, Is.EqualTo(10)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.25 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0213_GroupByNewDateModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0213_GroupByNewDateModel +{ + [HierarchyRoot] + public class EntityWithDate : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime Date { get; set; } + + public override string ToString() + { + return Date.ToString("yyyy.MM.dd"); + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0213_GroupByNewDate : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithDate).Assembly, typeof (EntityWithDate).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + var now = DateTime.Now; + for (int i = 1; i <= 10; i++) + new EntityWithDate {Date = new DateTime(now.Year, now.Month, i)}; + tx.Complete(); + } + } + + [Test] + public void GroupByNewDateDirectly() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var q = + from i in Query.All() + group i by new DateTime(i.Date.Year, i.Date.Month, 1) into g + select g; + + Assert.That(q.Count(), Is.EqualTo(1)); + } + } + + [Test] + public void GroupByNewDateWithIntermediateProjection() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var q = + from i in Query.All() + let x = new DateTime(i.Date.Year, i.Date.Month, 1) + group i by x into g + select g; + + Assert.That(q.Count(), Is.EqualTo(1)); + } + } + + [Test] + public void OrderByNewDateWithIntermediateProjection() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var expected = Query.All() + .OrderBy(e => e.Date) + .AsEnumerable() + .Reverse() + .ToList(); + + var q = + from i in Query.All() + let x = new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) + orderby x + select i; + + Assert.That(q.ToList(), Is.EqualTo(expected)); + } + } + + [Test] + public void OrderByNewDateDirectly() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var expected = Query.All() + .OrderBy(e => e.Date) + .AsEnumerable() + .Reverse() + .ToList(); + + var q = + from i in Query.All() + orderby new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) + select i; + + Assert.That(q.ToList(), Is.EqualTo(expected)); + } + } + + [Test] + public void WhereNewDateDirectly() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var now = DateTime.Now; + var firstDay = new DateTime(now.Year, now.Month, 1); + + var q = + from i in Query.All() + where new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day)==firstDay + select i; + + Assert.That(q.Single().Date.Day, Is.EqualTo(10)); + } + } + + [Test] + public void WhereNewDateWithIntermediateProjection() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + + var now = DateTime.Now; + var firstDay = new DateTime(now.Year, now.Month, 1); + + var q = + from i in Query.All() + let x = new DateTime(i.Date.Year, i.Date.Month, 11 - i.Date.Day) + where x==firstDay + select i; + + Assert.That(q.Single().Date.Day, Is.EqualTo(10)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction.cs index d66716b5d8..8aab8d737f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.11 - -using NUnit.Framework; -using Xtensive.Orm.Services; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction : AutoBuildTest - { - [Test] - public void GetDbTransactionInTransaction() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var accessor = session.Services.Get(); - Assert.That(accessor.Transaction, Is.Not.Null); - } - } - - [Test] - public void CreateCommandInTransaction() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var accessor = session.Services.Get(); - var command = accessor.CreateCommand(); - Assert.That(command.Transaction, Is.Not.Null); - } - } - - [Test] - public void GetDbTransactionWithoutTransaction() - { - using (var session = Domain.OpenSession()) { - var accessor = session.Services.Get(); - var command = accessor.CreateCommand(); - Assert.That(command.Transaction, Is.Null); - } - } - - [Test] - public void CreateCommandWithoutTransaction() - { - using (var session = Domain.OpenSession()) { - var accessor = session.Services.Get(); - Assert.That(accessor.Transaction, Is.Null); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.11 + +using NUnit.Framework; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0215_DirectSqlAccessorDoesNotBindCommandToTransaction : AutoBuildTest + { + [Test] + public void GetDbTransactionInTransaction() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var accessor = session.Services.Get(); + Assert.That(accessor.Transaction, Is.Not.Null); + } + } + + [Test] + public void CreateCommandInTransaction() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var accessor = session.Services.Get(); + var command = accessor.CreateCommand(); + Assert.That(command.Transaction, Is.Not.Null); + } + } + + [Test] + public void GetDbTransactionWithoutTransaction() + { + using (var session = Domain.OpenSession()) { + var accessor = session.Services.Get(); + var command = accessor.CreateCommand(); + Assert.That(command.Transaction, Is.Null); + } + } + + [Test] + public void CreateCommandWithoutTransaction() + { + using (var session = Domain.OpenSession()) { + var accessor = session.Services.Get(); + Assert.That(accessor.Transaction, Is.Null); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0221_UnableToTranslateAggregate.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0221_UnableToTranslateAggregate.cs index 685948e791..88100b8867 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0221_UnableToTranslateAggregate.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0221_UnableToTranslateAggregate.cs @@ -1,250 +1,250 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.21 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0221_UnableToTranslateAggregateModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0221_UnableToTranslateAggregateModel -{ - public class RowTuple - { - public int FakeKey { get; set; } - public TValue Value { get; set; } - } - - [HierarchyRoot] - public class Zames : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class ZamesInfo : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Zames Owner { get; set; } - - [Field] - public int Rank { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0221_UnableToTranslateAggregate : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Zames).Assembly, typeof (Zames).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - CreateSessionAndTransaction(); - - new ZamesInfo {Owner = new Zames(), Rank = 1}; - new ZamesInfo {Owner = new Zames(), Rank = 3}; - } - - #region Min() - - [Test] - public void MinOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.Min(item => item.Value.Rank)) - .FirstOrDefault(); - Assert.AreEqual(1, result); - } - - [Test] - public void MinOnEntitiesTest() - { - var result = GetEntitiesQuery().Min(info => info.Rank); - Assert.AreEqual(1, result); - } - - [Test] - public void MinOnValuesTest() - { - var result = GetValuesQuery().Min(); - Assert.AreEqual(1, result); - } - - #endregion - - #region Max() - - [Test] - public void MaxOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.Max(item => item.Value.Rank)) - .FirstOrDefault(); - Assert.AreEqual(3, result); - } - - [Test] - public void MaxOnEntitiesTest() - { - var result = GetEntitiesQuery().Max(info => info.Rank); - Assert.AreEqual(3, result); - } - - [Test] - public void MaxOnValuesTest() - { - var result = GetValuesQuery().Max(); - Assert.AreEqual(3, result); - } - - #endregion - - #region Average() - - [Test] - public void AverageOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.Average(item => item.Value.Rank)) - .FirstOrDefault(); - Assert.AreEqual(2, result); - } - - [Test] - public void AverageOnEntitiesTest() - { - var result = GetEntitiesQuery().Average(info => info.Rank); - Assert.AreEqual(2, result); - } - - [Test] - public void AverageOnValuesTest() - { - var result = GetValuesQuery().Average(); - Assert.AreEqual(2, result); - } - - #endregion - - #region Sum() - - [Test] - public void SumOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.Sum(item => item.Value.Rank)) - .FirstOrDefault(); - Assert.AreEqual(4, result); - } - - [Test] - public void SumOnEntitiesTest() - { - var result = GetEntitiesQuery().Sum(info => info.Rank); - Assert.AreEqual(4, result); - } - - [Test] - public void SumOnValuesTest() - { - var result = GetValuesQuery().Sum(); - Assert.AreEqual(4, result); - } - - #endregion - - #region Count() - - [Test] - public void CountOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.Count()) - .FirstOrDefault(); - Assert.AreEqual(2, result); - } - - [Test] - public void CountOnEntitiesTest() - { - var result = GetEntitiesQuery().Count(); - Assert.AreEqual(2, result); - } - - [Test] - public void CountOnValuesTest() - { - var result = GetValuesQuery().Count(); - Assert.AreEqual(2, result); - } - - #endregion - - #region LongCount() - - [Test] - public void LongCountOnGroupingsTest() - { - var result = GetGroupingsQuery() - .Select(grouping => grouping.LongCount()) - .FirstOrDefault(); - Assert.AreEqual(2, result); - } - - [Test] - public void LongCountOnEntitiesTest() - { - var result = GetEntitiesQuery().LongCount(); - Assert.AreEqual(2, result); - } - - [Test] - public void LongCountOnValuesTest() - { - var result = GetValuesQuery().LongCount(); - Assert.AreEqual(2, result); - } - - #endregion - - #region Helpers - - private static IQueryable GetValuesQuery() - { - return Query.All() - .Select(z => Query.All().Where(info => info.Owner==z).Select(info => info.Rank).FirstOrDefault()); - } - - private static IQueryable GetEntitiesQuery() - { - return Query.All() - .Select(z => Query.All().Where(info => info.Owner==z).FirstOrDefault()); - } - - private static IQueryable>> GetGroupingsQuery() - { - return Query.All() - .Select(z => new RowTuple { - FakeKey = 0, - Value = Query.All().Where(info => info.Owner==z).FirstOrDefault() - }) - .GroupBy(item => item.FakeKey); - } - - #endregion - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.21 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0221_UnableToTranslateAggregateModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0221_UnableToTranslateAggregateModel +{ + public class RowTuple + { + public int FakeKey { get; set; } + public TValue Value { get; set; } + } + + [HierarchyRoot] + public class Zames : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class ZamesInfo : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Zames Owner { get; set; } + + [Field] + public int Rank { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0221_UnableToTranslateAggregate : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Zames).Assembly, typeof (Zames).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + CreateSessionAndTransaction(); + + new ZamesInfo {Owner = new Zames(), Rank = 1}; + new ZamesInfo {Owner = new Zames(), Rank = 3}; + } + + #region Min() + + [Test] + public void MinOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.Min(item => item.Value.Rank)) + .FirstOrDefault(); + Assert.AreEqual(1, result); + } + + [Test] + public void MinOnEntitiesTest() + { + var result = GetEntitiesQuery().Min(info => info.Rank); + Assert.AreEqual(1, result); + } + + [Test] + public void MinOnValuesTest() + { + var result = GetValuesQuery().Min(); + Assert.AreEqual(1, result); + } + + #endregion + + #region Max() + + [Test] + public void MaxOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.Max(item => item.Value.Rank)) + .FirstOrDefault(); + Assert.AreEqual(3, result); + } + + [Test] + public void MaxOnEntitiesTest() + { + var result = GetEntitiesQuery().Max(info => info.Rank); + Assert.AreEqual(3, result); + } + + [Test] + public void MaxOnValuesTest() + { + var result = GetValuesQuery().Max(); + Assert.AreEqual(3, result); + } + + #endregion + + #region Average() + + [Test] + public void AverageOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.Average(item => item.Value.Rank)) + .FirstOrDefault(); + Assert.AreEqual(2, result); + } + + [Test] + public void AverageOnEntitiesTest() + { + var result = GetEntitiesQuery().Average(info => info.Rank); + Assert.AreEqual(2, result); + } + + [Test] + public void AverageOnValuesTest() + { + var result = GetValuesQuery().Average(); + Assert.AreEqual(2, result); + } + + #endregion + + #region Sum() + + [Test] + public void SumOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.Sum(item => item.Value.Rank)) + .FirstOrDefault(); + Assert.AreEqual(4, result); + } + + [Test] + public void SumOnEntitiesTest() + { + var result = GetEntitiesQuery().Sum(info => info.Rank); + Assert.AreEqual(4, result); + } + + [Test] + public void SumOnValuesTest() + { + var result = GetValuesQuery().Sum(); + Assert.AreEqual(4, result); + } + + #endregion + + #region Count() + + [Test] + public void CountOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.Count()) + .FirstOrDefault(); + Assert.AreEqual(2, result); + } + + [Test] + public void CountOnEntitiesTest() + { + var result = GetEntitiesQuery().Count(); + Assert.AreEqual(2, result); + } + + [Test] + public void CountOnValuesTest() + { + var result = GetValuesQuery().Count(); + Assert.AreEqual(2, result); + } + + #endregion + + #region LongCount() + + [Test] + public void LongCountOnGroupingsTest() + { + var result = GetGroupingsQuery() + .Select(grouping => grouping.LongCount()) + .FirstOrDefault(); + Assert.AreEqual(2, result); + } + + [Test] + public void LongCountOnEntitiesTest() + { + var result = GetEntitiesQuery().LongCount(); + Assert.AreEqual(2, result); + } + + [Test] + public void LongCountOnValuesTest() + { + var result = GetValuesQuery().LongCount(); + Assert.AreEqual(2, result); + } + + #endregion + + #region Helpers + + private static IQueryable GetValuesQuery() + { + return Query.All() + .Select(z => Query.All().Where(info => info.Owner==z).Select(info => info.Rank).FirstOrDefault()); + } + + private static IQueryable GetEntitiesQuery() + { + return Query.All() + .Select(z => Query.All().Where(info => info.Owner==z).FirstOrDefault()); + } + + private static IQueryable>> GetGroupingsQuery() + { + return Query.All() + .Select(z => new RowTuple { + FakeKey = 0, + Value = Query.All().Where(info => info.Owner==z).FirstOrDefault() + }) + .GroupBy(item => item.FakeKey); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0222_GroupByBooleanColumn.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0222_GroupByBooleanColumn.cs index 3aa28b632e..bd74201045 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0222_GroupByBooleanColumn.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0222_GroupByBooleanColumn.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.22 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0222_GroupByBooleanColumnModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0222_GroupByBooleanColumnModel -{ - [HierarchyRoot] - public class Message : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public bool IsRecieved { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0222_GroupByBooleanColumn : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Message).Assembly, typeof (Message).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) { - using (var t = Session.Current.OpenTransaction()) { - new Message {IsRecieved = true}; - new Message {IsRecieved = true}; - new Message {IsRecieved = false}; - - var result = Query.All() - .GroupBy(m => m.IsRecieved) - .OrderBy(g => g.Key) - .Select(g => new {IsRecieved = g.Key, Count = g.Count()}) - .ToList(); - - var trueResult = result.Single(item => item.IsRecieved).Count; - var falseResult = result.Single(item => !item.IsRecieved).Count; - - Assert.AreEqual(2, trueResult); - Assert.AreEqual(1, falseResult); - - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.22 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0222_GroupByBooleanColumnModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0222_GroupByBooleanColumnModel +{ + [HierarchyRoot] + public class Message : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public bool IsRecieved { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0222_GroupByBooleanColumn : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Message).Assembly, typeof (Message).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) { + using (var t = Session.Current.OpenTransaction()) { + new Message {IsRecieved = true}; + new Message {IsRecieved = true}; + new Message {IsRecieved = false}; + + var result = Query.All() + .GroupBy(m => m.IsRecieved) + .OrderBy(g => g.Key) + .Select(g => new {IsRecieved = g.Key, Count = g.Count()}) + .ToList(); + + var trueResult = result.Single(item => item.IsRecieved).Count; + var falseResult = result.Single(item => !item.IsRecieved).Count; + + Assert.AreEqual(2, trueResult); + Assert.AreEqual(1, falseResult); + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0232_SupportForEnumHasFlag.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0232_SupportForEnumHasFlag.cs index f6a068d2df..aadd67065c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0232_SupportForEnumHasFlag.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0232_SupportForEnumHasFlag.cs @@ -1,234 +1,234 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.07.22 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0232_SupportForEnumHasFlageModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0232_SupportForEnumHasFlageModel -{ - [Flags] - public enum PenColorsLong : long - { - White = 0, - Red = 1, - Green = 2, - Blue = 4, - Yellow = 8, - } - [Flags] - public enum PenColors - { - White = 0, - Red = 1, - Green = 2, - Blue = 4, - Yellow = 8, - } - - [HierarchyRoot] - public class Preference : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public PenColors FavoritePanColores { get; set; } - } - - [HierarchyRoot] - public class PreferenceLong : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public PenColorsLong FavoritePanColorses { get; set; } - } - - [HierarchyRoot] - public class Pen : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public PenColors Color { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0232_SupportForEnumHasFlag : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Preference).Assembly, typeof (Preference).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for(int i = 0; i < 9; i++) { - new Preference {FavoritePanColores = (PenColors) i}; - new PreferenceLong {FavoritePanColorses = (PenColorsLong) i}; - } - new Pen {Color = PenColors.Red}; - new Pen {Color = PenColors.Blue}; - new Pen {Color = PenColors.Red | PenColors.Blue}; - new Pen {Color = PenColors.Red | PenColors.Green}; - transaction.Complete(); - } - } - - [Test] - public void WhereSimplePenColorIntermediate() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColors.White; - - var result = from a in Query.All() - let v = PenColors.White - where a.FavoritePanColores.HasFlag(v) - select a; - - Assert.That(result.First().FavoritePanColores,Is.EqualTo(expected)); - } - } - - [Test] - public void WhereSimplePenColorDirectly() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColors.Blue; - - var result = from a in Query.All() - where a.FavoritePanColores.HasFlag(PenColors.Blue) - select a; - - Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); - } - } - - [Test] - public void WhenComplexPenColorIntermediate() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColors.Blue | PenColors.Green | PenColors.Red; - - var result = from a in Query.All() - let v = PenColors.Blue | PenColors.Green | PenColors.Red - where a.FavoritePanColores.HasFlag(v) - select a; - - Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); - } - } - - [Test] - public void WhenComplexPenColorDirectly() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColors.Blue | PenColors.Green | PenColors.Red; - - var result = from a in Query.All() - where a.FavoritePanColores.HasFlag(PenColors.Blue | PenColors.Green | PenColors.Red) - select a; - - Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); - } - } - - [Test] - public void WhereSimplePenColorLongDirectly() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColorsLong.White; - - var result = from a in Query.All() - where a.FavoritePanColorses.HasFlag(PenColorsLong.White) - select a; - - Assert.That(result.First().FavoritePanColorses,Is.EqualTo(expected)); - } - } - - [Test] - public void WhereSimplePenColorLongIntermediate() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColorsLong.White; - - var result = from a in Query.All() - let v = PenColorsLong.White - where a.FavoritePanColorses.HasFlag(v) - select a; - - Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); - } - } - - [Test] - public void WhereComplexPenColorLongDirectly() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColorsLong.White | PenColorsLong.Blue; - - var result = from a in Query.All() - where a.FavoritePanColorses.HasFlag(PenColorsLong.White | PenColorsLong.Blue) - select a; - - Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); - } - } - - [Test] - public void WhereComplexPenColorLongIntermediate() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColorsLong.White | PenColorsLong.Blue; - - var result = from a in Query.All() - let v = PenColorsLong.White | PenColorsLong.Blue - where a.FavoritePanColorses.HasFlag(v) - select a; - - Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); - } - } - - [Test] - public void SimpleWithLeftSidePenColorIntermediate() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var expected = PenColors.Red; - - var s = from p in Query.All() - let v = PenColors.Red - where p.Color.HasFlag(v)==(from pref in Query.All() - where pref.FavoritePanColores.HasFlag(v) - select pref).First().FavoritePanColores.HasFlag(v) - select p; - - Assert.That(s.First().Color,Is.EqualTo(expected)); - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.07.22 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0232_SupportForEnumHasFlageModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0232_SupportForEnumHasFlageModel +{ + [Flags] + public enum PenColorsLong : long + { + White = 0, + Red = 1, + Green = 2, + Blue = 4, + Yellow = 8, + } + [Flags] + public enum PenColors + { + White = 0, + Red = 1, + Green = 2, + Blue = 4, + Yellow = 8, + } + + [HierarchyRoot] + public class Preference : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public PenColors FavoritePanColores { get; set; } + } + + [HierarchyRoot] + public class PreferenceLong : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public PenColorsLong FavoritePanColorses { get; set; } + } + + [HierarchyRoot] + public class Pen : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public PenColors Color { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0232_SupportForEnumHasFlag : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Preference).Assembly, typeof (Preference).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for(int i = 0; i < 9; i++) { + new Preference {FavoritePanColores = (PenColors) i}; + new PreferenceLong {FavoritePanColorses = (PenColorsLong) i}; + } + new Pen {Color = PenColors.Red}; + new Pen {Color = PenColors.Blue}; + new Pen {Color = PenColors.Red | PenColors.Blue}; + new Pen {Color = PenColors.Red | PenColors.Green}; + transaction.Complete(); + } + } + + [Test] + public void WhereSimplePenColorIntermediate() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColors.White; + + var result = from a in Query.All() + let v = PenColors.White + where a.FavoritePanColores.HasFlag(v) + select a; + + Assert.That(result.First().FavoritePanColores,Is.EqualTo(expected)); + } + } + + [Test] + public void WhereSimplePenColorDirectly() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColors.Blue; + + var result = from a in Query.All() + where a.FavoritePanColores.HasFlag(PenColors.Blue) + select a; + + Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); + } + } + + [Test] + public void WhenComplexPenColorIntermediate() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColors.Blue | PenColors.Green | PenColors.Red; + + var result = from a in Query.All() + let v = PenColors.Blue | PenColors.Green | PenColors.Red + where a.FavoritePanColores.HasFlag(v) + select a; + + Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); + } + } + + [Test] + public void WhenComplexPenColorDirectly() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColors.Blue | PenColors.Green | PenColors.Red; + + var result = from a in Query.All() + where a.FavoritePanColores.HasFlag(PenColors.Blue | PenColors.Green | PenColors.Red) + select a; + + Assert.That(result.First().FavoritePanColores, Is.EqualTo(expected)); + } + } + + [Test] + public void WhereSimplePenColorLongDirectly() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColorsLong.White; + + var result = from a in Query.All() + where a.FavoritePanColorses.HasFlag(PenColorsLong.White) + select a; + + Assert.That(result.First().FavoritePanColorses,Is.EqualTo(expected)); + } + } + + [Test] + public void WhereSimplePenColorLongIntermediate() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColorsLong.White; + + var result = from a in Query.All() + let v = PenColorsLong.White + where a.FavoritePanColorses.HasFlag(v) + select a; + + Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); + } + } + + [Test] + public void WhereComplexPenColorLongDirectly() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColorsLong.White | PenColorsLong.Blue; + + var result = from a in Query.All() + where a.FavoritePanColorses.HasFlag(PenColorsLong.White | PenColorsLong.Blue) + select a; + + Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); + } + } + + [Test] + public void WhereComplexPenColorLongIntermediate() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColorsLong.White | PenColorsLong.Blue; + + var result = from a in Query.All() + let v = PenColorsLong.White | PenColorsLong.Blue + where a.FavoritePanColorses.HasFlag(v) + select a; + + Assert.That(result.First().FavoritePanColorses, Is.EqualTo(expected)); + } + } + + [Test] + public void SimpleWithLeftSidePenColorIntermediate() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var expected = PenColors.Red; + + var s = from p in Query.All() + let v = PenColors.Red + where p.Color.HasFlag(v)==(from pref in Query.All() + where pref.FavoritePanColores.HasFlag(v) + select pref).First().FavoritePanColores.HasFlag(v) + select p; + + Assert.That(s.First().Color,Is.EqualTo(expected)); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0238_GroupByGeneric.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0238_GroupByGeneric.cs index 9f19e9f11d..34a364427d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0238_GroupByGeneric.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0238_GroupByGeneric.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.24 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueIssueJira0238_GroupByGenericModel; - -namespace Xtensive.Orm.Tests.Issues.IssueIssueJira0238_GroupByGenericModel -{ - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Surname { get; set; } - - [Field] - public string City { get; set; } - } - - public class GroupKey - { - public T1 Key1 { get; set; } - public T2 Key2 { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0238_GroupByGeneric : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) - using (Session.Current.OpenTransaction()) { - new Person {City = "A", Surname = "1"}; - new Person {City = "A", Surname = "1"}; - new Person {City = "A", Surname = "2"}; - new Person {City = "B", Surname = "3"}; - - // This works - var result1 = Query.All() - .GroupBy(p => new {Key1 = p.City, Key2 = p.Surname}) - .Select(group => new {group.Key, Count = group.Count()}) - .OrderBy(item => item.Key) - .ToList(); - - Assert.That(result1.Count, Is.EqualTo(3)); - Assert.That(result1[0].Key.Key1, Is.EqualTo("A")); - Assert.That(result1[0].Key.Key2, Is.EqualTo("1")); - Assert.That(result1[0].Count, Is.EqualTo(2)); - Assert.That(result1[1].Key.Key1, Is.EqualTo("A")); - Assert.That(result1[1].Key.Key2, Is.EqualTo("2")); - Assert.That(result1[1].Count, Is.EqualTo(1)); - Assert.That(result1[2].Key.Key1, Is.EqualTo("B")); - Assert.That(result1[2].Key.Key2, Is.EqualTo("3")); - Assert.That(result1[2].Count, Is.EqualTo(1)); - - // This does not work - var result2 = Query.All() - .GroupBy(p => new GroupKey {Key1 = p.City, Key2 = p.Surname}) - .Select(group => new {group.Key, Count = group.Count()}) - .OrderBy(item => item.Key) - .ToList(); - - Assert.That(result2.Count, Is.EqualTo(3)); - Assert.That(result2[0].Key.Key1, Is.EqualTo("A")); - Assert.That(result2[0].Key.Key2, Is.EqualTo("1")); - Assert.That(result2[0].Count, Is.EqualTo(2)); - Assert.That(result2[1].Key.Key1, Is.EqualTo("A")); - Assert.That(result2[1].Key.Key2, Is.EqualTo("2")); - Assert.That(result2[1].Count, Is.EqualTo(1)); - Assert.That(result2[2].Key.Key1, Is.EqualTo("B")); - Assert.That(result2[2].Key.Key2, Is.EqualTo("3")); - Assert.That(result2[2].Count, Is.EqualTo(1)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.24 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueIssueJira0238_GroupByGenericModel; + +namespace Xtensive.Orm.Tests.Issues.IssueIssueJira0238_GroupByGenericModel +{ + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Surname { get; set; } + + [Field] + public string City { get; set; } + } + + public class GroupKey + { + public T1 Key1 { get; set; } + public T2 Key2 { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0238_GroupByGeneric : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) + using (Session.Current.OpenTransaction()) { + new Person {City = "A", Surname = "1"}; + new Person {City = "A", Surname = "1"}; + new Person {City = "A", Surname = "2"}; + new Person {City = "B", Surname = "3"}; + + // This works + var result1 = Query.All() + .GroupBy(p => new {Key1 = p.City, Key2 = p.Surname}) + .Select(group => new {group.Key, Count = group.Count()}) + .OrderBy(item => item.Key) + .ToList(); + + Assert.That(result1.Count, Is.EqualTo(3)); + Assert.That(result1[0].Key.Key1, Is.EqualTo("A")); + Assert.That(result1[0].Key.Key2, Is.EqualTo("1")); + Assert.That(result1[0].Count, Is.EqualTo(2)); + Assert.That(result1[1].Key.Key1, Is.EqualTo("A")); + Assert.That(result1[1].Key.Key2, Is.EqualTo("2")); + Assert.That(result1[1].Count, Is.EqualTo(1)); + Assert.That(result1[2].Key.Key1, Is.EqualTo("B")); + Assert.That(result1[2].Key.Key2, Is.EqualTo("3")); + Assert.That(result1[2].Count, Is.EqualTo(1)); + + // This does not work + var result2 = Query.All() + .GroupBy(p => new GroupKey {Key1 = p.City, Key2 = p.Surname}) + .Select(group => new {group.Key, Count = group.Count()}) + .OrderBy(item => item.Key) + .ToList(); + + Assert.That(result2.Count, Is.EqualTo(3)); + Assert.That(result2[0].Key.Key1, Is.EqualTo("A")); + Assert.That(result2[0].Key.Key2, Is.EqualTo("1")); + Assert.That(result2[0].Count, Is.EqualTo(2)); + Assert.That(result2[1].Key.Key1, Is.EqualTo("A")); + Assert.That(result2[1].Key.Key2, Is.EqualTo("2")); + Assert.That(result2[1].Count, Is.EqualTo(1)); + Assert.That(result2[2].Key.Key1, Is.EqualTo("B")); + Assert.That(result2[2].Key.Key2, Is.EqualTo("3")); + Assert.That(result2[2].Count, Is.EqualTo(1)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0240_SortingInSubqueryIsOmitted.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0240_SortingInSubqueryIsOmitted.cs index e0714d2bd4..b66d0930c7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0240_SortingInSubqueryIsOmitted.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0240_SortingInSubqueryIsOmitted.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.25 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0240_SortingInSubqueryIsOmittedModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0240_SortingInSubqueryIsOmittedModel -{ - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class StoredContainer : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Container Container { get; set; } - - [Field] - public string Address { get; set; } - - [Field] - public DateTime CreationTime { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0240_SortingInSubqueryIsOmitted : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - var c = new Container(); - new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 1), Address = "1"}; - new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 2), Address = "2"}; - new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 3), Address = "3"}; - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) - using (var tx = Session.Current.OpenTransaction()) { - var r = Query.All() - .Select(c => new { - c.Id, - LastLocation = Query.All() - .Where(s => s.Container==c) - .OrderByDescending(s => s.CreationTime) - .Select(s => s.Address) - .FirstOrDefault() - }) - .OrderBy(c => c.Id) - .Single(); - Assert.That(r.LastLocation, Is.EqualTo("3")); - } - } - - [Test] - public void RegressionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var container = Query.All().Single(); - var now = DateTime.Now; - var lastStoredContainer = Query.All() - .Where(s => s.Container==container && s.CreationTime <= now) - .GroupBy(s => s.CreationTime) - .OrderByDescending(s => s.Key) - .FirstOrDefault(); - - Assert.That(lastStoredContainer, Is.Not.Null); - Assert.That(lastStoredContainer.Key.Day, Is.EqualTo(3)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.25 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0240_SortingInSubqueryIsOmittedModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0240_SortingInSubqueryIsOmittedModel +{ + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class StoredContainer : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Container Container { get; set; } + + [Field] + public string Address { get; set; } + + [Field] + public DateTime CreationTime { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0240_SortingInSubqueryIsOmitted : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Container).Assembly, typeof (Container).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + var c = new Container(); + new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 1), Address = "1"}; + new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 2), Address = "2"}; + new StoredContainer {Container = c, CreationTime = new DateTime(2012, 1, 3), Address = "3"}; + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) + using (var tx = Session.Current.OpenTransaction()) { + var r = Query.All() + .Select(c => new { + c.Id, + LastLocation = Query.All() + .Where(s => s.Container==c) + .OrderByDescending(s => s.CreationTime) + .Select(s => s.Address) + .FirstOrDefault() + }) + .OrderBy(c => c.Id) + .Single(); + Assert.That(r.LastLocation, Is.EqualTo("3")); + } + } + + [Test] + public void RegressionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var container = Query.All().Single(); + var now = DateTime.Now; + var lastStoredContainer = Query.All() + .Where(s => s.Container==container && s.CreationTime <= now) + .GroupBy(s => s.CreationTime) + .OrderByDescending(s => s.Key) + .FirstOrDefault(); + + Assert.That(lastStoredContainer, Is.Not.Null); + Assert.That(lastStoredContainer.Key.Day, Is.EqualTo(3)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0242_LegacyExecuteMethodsDoNotWork.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0242_LegacyExecuteMethodsDoNotWork.cs index 0836e80055..3aec3af8ce 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0242_LegacyExecuteMethodsDoNotWork.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0242_LegacyExecuteMethodsDoNotWork.cs @@ -1,116 +1,116 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.27 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using MetadataType = Xtensive.Orm.Metadata.Type; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0242_LegacyExecuteMethodsDoNotWork : AutoBuildTest - { - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - CreateSessionAndTransaction(); - } - - #region Compiled queries - - [Test] - public void CompiledSequenceTest() - { - var id = GetId(); - var r = Query.Execute(() => Query.All().Where(m => m.Id==id)); - VerifyResult(r); - } - - [Test] - public void CompiledSequenceWithKeyTest() - { - var id = GetId(); - var r = Query.Execute(GetKey(), () => Query.All().Where(m => m.Id==id)); - VerifyResult(r); - } - - [Test] - public void CompiledScalarTest() - { - var id = GetId(); - var r = Query.Execute(() => Query.All().Single(m => m.Id==id)); - VerifyResult(r); - } - - [Test] - public void CompiledScalarWithKeyTest() - { - var id = GetId(); - var r = Query.Execute(GetKey(), () => Query.All().Single(m => m.Id==id)); - VerifyResult(r); - } - - #endregion - - #region Future queries - - [Test] - public void FutureSequenceTest() - { - var id = GetId(); - var r = Query.ExecuteFuture(() => Query.All().Where(m => m.Id==id)); - VerifyResult(r); - } - - [Test] - public void FutureSequenceWithKeyTest() - { - var id = GetId(); - var r = Query.ExecuteFuture(GetKey(), () => Query.All().Where(m => m.Id==id)); - VerifyResult(r); - } - - [Test] - public void FutureScalarTest() - { - var id = GetId(); - var r = Query.ExecuteFutureScalar(() => Query.All().Single(m => m.Id==id)); - VerifyResult(r.Value); - } - - [Test] - public void FutureScalarWithKeyTest() - { - var id = GetId(); - var r = Query.ExecuteFutureScalar(GetKey(), () => Query.All().Single(m => m.Id==id)); - VerifyResult(r.Value); - } - - #endregion - - private void VerifyResult(MetadataType result) - { - Assert.That(result.Id, Is.EqualTo(GetId())); - } - - private void VerifyResult(IEnumerable result) - { - var items = result.ToList(); - Assert.That(items.Count, Is.EqualTo(1)); - VerifyResult(items[0]); - } - - private int GetId() - { - return Domain.Model.Types[typeof (MetadataType)].TypeId; - } - - private object GetKey() - { - return new object(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.27 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using MetadataType = Xtensive.Orm.Metadata.Type; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0242_LegacyExecuteMethodsDoNotWork : AutoBuildTest + { + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + CreateSessionAndTransaction(); + } + + #region Compiled queries + + [Test] + public void CompiledSequenceTest() + { + var id = GetId(); + var r = Query.Execute(() => Query.All().Where(m => m.Id==id)); + VerifyResult(r); + } + + [Test] + public void CompiledSequenceWithKeyTest() + { + var id = GetId(); + var r = Query.Execute(GetKey(), () => Query.All().Where(m => m.Id==id)); + VerifyResult(r); + } + + [Test] + public void CompiledScalarTest() + { + var id = GetId(); + var r = Query.Execute(() => Query.All().Single(m => m.Id==id)); + VerifyResult(r); + } + + [Test] + public void CompiledScalarWithKeyTest() + { + var id = GetId(); + var r = Query.Execute(GetKey(), () => Query.All().Single(m => m.Id==id)); + VerifyResult(r); + } + + #endregion + + #region Future queries + + [Test] + public void FutureSequenceTest() + { + var id = GetId(); + var r = Query.ExecuteFuture(() => Query.All().Where(m => m.Id==id)); + VerifyResult(r); + } + + [Test] + public void FutureSequenceWithKeyTest() + { + var id = GetId(); + var r = Query.ExecuteFuture(GetKey(), () => Query.All().Where(m => m.Id==id)); + VerifyResult(r); + } + + [Test] + public void FutureScalarTest() + { + var id = GetId(); + var r = Query.ExecuteFutureScalar(() => Query.All().Single(m => m.Id==id)); + VerifyResult(r.Value); + } + + [Test] + public void FutureScalarWithKeyTest() + { + var id = GetId(); + var r = Query.ExecuteFutureScalar(GetKey(), () => Query.All().Single(m => m.Id==id)); + VerifyResult(r.Value); + } + + #endregion + + private void VerifyResult(MetadataType result) + { + Assert.That(result.Id, Is.EqualTo(GetId())); + } + + private void VerifyResult(IEnumerable result) + { + var items = result.ToList(); + Assert.That(items.Count, Is.EqualTo(1)); + VerifyResult(items[0]); + } + + private int GetId() + { + return Domain.Model.Types[typeof (MetadataType)].TypeId; + } + + private object GetKey() + { + return new object(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0243_PrefetchSyntaxSugar.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0243_PrefetchSyntaxSugar.cs index d3c3e0f3f5..19bceedd66 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0243_PrefetchSyntaxSugar.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0243_PrefetchSyntaxSugar.cs @@ -1,162 +1,162 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.30 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0243_PrefetchSyntaxSugarModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0243_PrefetchSyntaxSugarModel -{ - [HierarchyRoot] - public class Owner : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Target Target1 { get; set; } - - [Field] - public Target Target2 { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet Items1 { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet Items2 { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Target RelatedTarget { get; set; } - } - - [HierarchyRoot] - public class Target : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Target RelatedTarget { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0243_PrefetchSyntaxSugar : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Target).Namespace); - return configuration; - } - - [Test] - public void ShortcutTest() - { - Key target1Key; - Key target2Key; - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - Reset(); - var owner = new Owner {Target1 = new Target(), Target2 = new Target()}; - target1Key = owner.Target1.Key; - target2Key = owner.Target2.Key; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - // The following statement should prefetch Target1 and Target2 - var result = session.Query.All() - .Prefetch(x => new {x.Target1, x.Target2}) - .ToList(); - // Check that Target1 and Target2 are loaded into session. - Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); - Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); - } - } - - [Test] - public void NestedShortcutTest() - { - Key target1Key; - Key target2Key; - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - Reset(); - var target1 = new Target(); - var target2 = new Target(); - var owner = new Owner(); - owner.Items1.Add(new Item {RelatedTarget = target1}); - owner.Items1.Add(new Item {RelatedTarget = target2}); - target1Key = target1.Key; - target2Key = target2.Key; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - // The following statement should prefetch Target1 and Target2 - var result = session.Query.All() - .Prefetch(x => x.Items1.Prefetch(y => new {y.RelatedTarget})) - .ToList(); - // Check that Target1 and Target2 are loaded into session. - Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); - Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); - } - } - - [Test] - public void NestingInShortcutTest() - { - Key target1Key; - Key target2Key; - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - Reset(); - var target1 = new Target(); - var target2 = new Target(); - var owner = new Owner(); - owner.Items1.Add(new Item {RelatedTarget = target1}); - owner.Items1.Add(new Item {RelatedTarget = target2}); - target1Key = target1.Key; - target2Key = target2.Key; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - // The following statement should prefetch Target1 and Target2 - var result = session.Query.All() - .Prefetch(x => new {v = x.Items1.Prefetch(y => y.RelatedTarget)}) - .ToList(); - // Check that Target1 and Target2 are loaded into session. - Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); - Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); - } - } - - private void Reset() - { - var session = Session.Demand(); - session.Remove(Query.All()); - session.Remove(Query.All()); - session.Remove(Query.All()); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.30 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0243_PrefetchSyntaxSugarModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0243_PrefetchSyntaxSugarModel +{ + [HierarchyRoot] + public class Owner : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Target Target1 { get; set; } + + [Field] + public Target Target2 { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet Items1 { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet Items2 { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Target RelatedTarget { get; set; } + } + + [HierarchyRoot] + public class Target : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Target RelatedTarget { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0243_PrefetchSyntaxSugar : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Target).Namespace); + return configuration; + } + + [Test] + public void ShortcutTest() + { + Key target1Key; + Key target2Key; + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + Reset(); + var owner = new Owner {Target1 = new Target(), Target2 = new Target()}; + target1Key = owner.Target1.Key; + target2Key = owner.Target2.Key; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + // The following statement should prefetch Target1 and Target2 + var result = session.Query.All() + .Prefetch(x => new {x.Target1, x.Target2}) + .ToList(); + // Check that Target1 and Target2 are loaded into session. + Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); + Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); + } + } + + [Test] + public void NestedShortcutTest() + { + Key target1Key; + Key target2Key; + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + Reset(); + var target1 = new Target(); + var target2 = new Target(); + var owner = new Owner(); + owner.Items1.Add(new Item {RelatedTarget = target1}); + owner.Items1.Add(new Item {RelatedTarget = target2}); + target1Key = target1.Key; + target2Key = target2.Key; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + // The following statement should prefetch Target1 and Target2 + var result = session.Query.All() + .Prefetch(x => x.Items1.Prefetch(y => new {y.RelatedTarget})) + .ToList(); + // Check that Target1 and Target2 are loaded into session. + Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); + Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); + } + } + + [Test] + public void NestingInShortcutTest() + { + Key target1Key; + Key target2Key; + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + Reset(); + var target1 = new Target(); + var target2 = new Target(); + var owner = new Owner(); + owner.Items1.Add(new Item {RelatedTarget = target1}); + owner.Items1.Add(new Item {RelatedTarget = target2}); + target1Key = target1.Key; + target2Key = target2.Key; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + // The following statement should prefetch Target1 and Target2 + var result = session.Query.All() + .Prefetch(x => new {v = x.Items1.Prefetch(y => y.RelatedTarget)}) + .ToList(); + // Check that Target1 and Target2 are loaded into session. + Assert.IsTrue(StorageTestHelper.IsFetched(session, target1Key)); + Assert.IsTrue(StorageTestHelper.IsFetched(session, target2Key)); + } + } + + private void Reset() + { + var session = Session.Demand(); + session.Remove(Query.All()); + session.Remove(Query.All()); + session.Remove(Query.All()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0261_QuerySingleInsideDelayedCompiledQueries.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0261_QuerySingleInsideDelayedCompiledQueries.cs index 9d9f5db31c..a0921acb0a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0261_QuerySingleInsideDelayedCompiledQueries.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0261_QuerySingleInsideDelayedCompiledQueries.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.07.28 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0261_QuerySingleInsideDelayedCompiledQueriesModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0261_QuerySingleInsideDelayedCompiledQueriesModel -{ - [HierarchyRoot] - class TestEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0261_QuerySingleInsideDelayedCompiledQueries : AutoBuildTest - { - private Key instanceKey; - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(TestEntity).Assembly, typeof(TestEntity).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()){ - var instance = new TestEntity {FirstName = "Jeremy", LastName = "Clarkson"}; - instanceKey = instance.Key; - transaction.Complete(); - } - } - - [Test] - public void QuerySingle() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - - var expected = new Exception(Strings.ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed); - - Assert.Throws(() => { - var result = session.Query.ExecuteDelayed(query => query.SingleOrDefault(instanceKey)); - Assert.That(result.Value.FirstName, Is.EqualTo("Jeremy")); - }); - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.07.28 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0261_QuerySingleInsideDelayedCompiledQueriesModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0261_QuerySingleInsideDelayedCompiledQueriesModel +{ + [HierarchyRoot] + class TestEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0261_QuerySingleInsideDelayedCompiledQueries : AutoBuildTest + { + private Key instanceKey; + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestEntity).Assembly, typeof(TestEntity).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()){ + var instance = new TestEntity {FirstName = "Jeremy", LastName = "Clarkson"}; + instanceKey = instance.Key; + transaction.Complete(); + } + } + + [Test] + public void QuerySingle() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + + var expected = new Exception(Strings.ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed); + + Assert.Throws(() => { + var result = session.Query.ExecuteDelayed(query => query.SingleOrDefault(instanceKey)); + Assert.That(result.Value.FirstName, Is.EqualTo("Jeremy")); + }); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0275_FilterComputedColumn.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0275_FilterComputedColumn.cs index c65b81518b..2b092bd2c9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0275_FilterComputedColumn.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0275_FilterComputedColumn.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.01.31 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0275_FilterComputedColumnModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0275_FilterComputedColumnModel -{ - [HierarchyRoot] - public sealed class FilterTarget : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Code { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0275_FilterComputedColumn : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FilterTarget).Assembly, typeof (FilterTarget).Namespace); - return config; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new FilterTarget {Code = "AA123"}; - new FilterTarget {Code = "BB123"}; - new FilterTarget {Code = "AA321"}; - new FilterTarget {Code = "BB321"}; - new FilterTarget {Code = "AA777"}; - new FilterTarget {Code = "BB777"}; - tx.Complete(); - } - } - - [Test] - public void ContainsWithProjectionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var codes = new[] {"123", "321"}; - var q = Query.All() - .Select(t => new {Target = t, Subcode = t.Code.Substring(2, 3)}) - .Where(item => codes.Contains(item.Subcode)) - .ToList(); - Assert.That(q.Count, Is.EqualTo(4)); - } - } - - [Test] - public void ContainsTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var codes = new[] {"123", "321"}; - var q = Query.All() - .Where(t => codes.Contains(t.Code.Substring(2, 3))) - .ToList(); - Assert.That(q.Count, Is.EqualTo(4)); - } - } - - [Test] - public void InWithProjectionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var codes = new[] {"123", "321"}; - var q = Query.All() - .Select(t => new {Target = t, Subcode = t.Code.Substring(2, 3)}) - .Where(item => item.Subcode.In(codes)) - .ToList(); - Assert.That(q.Count, Is.EqualTo(4)); - } - } - - [Test] - public void InTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var codes = new[] {"123", "321"}; - var q = Query.All() - .Where(t => t.Code.Substring(2, 3).In(codes)) - .ToList(); - Assert.That(q.Count, Is.EqualTo(4)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.01.31 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0275_FilterComputedColumnModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0275_FilterComputedColumnModel +{ + [HierarchyRoot] + public sealed class FilterTarget : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Code { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0275_FilterComputedColumn : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FilterTarget).Assembly, typeof (FilterTarget).Namespace); + return config; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new FilterTarget {Code = "AA123"}; + new FilterTarget {Code = "BB123"}; + new FilterTarget {Code = "AA321"}; + new FilterTarget {Code = "BB321"}; + new FilterTarget {Code = "AA777"}; + new FilterTarget {Code = "BB777"}; + tx.Complete(); + } + } + + [Test] + public void ContainsWithProjectionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var codes = new[] {"123", "321"}; + var q = Query.All() + .Select(t => new {Target = t, Subcode = t.Code.Substring(2, 3)}) + .Where(item => codes.Contains(item.Subcode)) + .ToList(); + Assert.That(q.Count, Is.EqualTo(4)); + } + } + + [Test] + public void ContainsTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var codes = new[] {"123", "321"}; + var q = Query.All() + .Where(t => codes.Contains(t.Code.Substring(2, 3))) + .ToList(); + Assert.That(q.Count, Is.EqualTo(4)); + } + } + + [Test] + public void InWithProjectionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var codes = new[] {"123", "321"}; + var q = Query.All() + .Select(t => new {Target = t, Subcode = t.Code.Substring(2, 3)}) + .Where(item => item.Subcode.In(codes)) + .ToList(); + Assert.That(q.Count, Is.EqualTo(4)); + } + } + + [Test] + public void InTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var codes = new[] {"123", "321"}; + var q = Query.All() + .Where(t => t.Code.Substring(2, 3).In(codes)) + .ToList(); + Assert.That(q.Count, Is.EqualTo(4)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0314_IncorrectTransactionDisposing.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0314_IncorrectTransactionDisposing.cs index b33c670a4d..4368134580 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0314_IncorrectTransactionDisposing.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0314_IncorrectTransactionDisposing.cs @@ -1,101 +1,101 @@ -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Tests.Issues.IssueJira0314_IncorrectTransactionDisposingModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0314_IncorrectTransactionDisposingModel -{ - [HierarchyRoot] - public sealed class Entity1 : Entity - { - [Field] - [Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public sealed class Entity2 : Entity - { - [Field] - [Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0314_IncorrectTransactionDisposing : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Sessions.Default.Options = - SessionOptions.ServerProfile - | SessionOptions.AutoActivation - | SessionOptions.SuppressRollbackExceptions; - config.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); - return config; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Entity1(); - new Entity2(); - } - } - - // ReSharper disable EmptyGeneralCatchClause - - [Test] - public void Test() - { - var wait1 = new ManualResetEventSlim(); - var wait2 = new ManualResetEventSlim(); - Parallel.Invoke( - () => { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) - using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) { - try { - Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - wait1.Set(); - wait2.Wait(); - Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - } - catch { - // catch deadlock here - // we should complete normally - } - } - }, - () => { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) - using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) { - try { - Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - wait2.Set(); - wait1.Wait(); - Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); - } - catch { - // catch deadlock here - // we should complete normally - } - } - }); - } - } -} +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Tests.Issues.IssueJira0314_IncorrectTransactionDisposingModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0314_IncorrectTransactionDisposingModel +{ + [HierarchyRoot] + public sealed class Entity1 : Entity + { + [Field] + [Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public sealed class Entity2 : Entity + { + [Field] + [Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0314_IncorrectTransactionDisposing : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Sessions.Default.Options = + SessionOptions.ServerProfile + | SessionOptions.AutoActivation + | SessionOptions.SuppressRollbackExceptions; + config.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); + return config; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Entity1(); + new Entity2(); + } + } + + // ReSharper disable EmptyGeneralCatchClause + + [Test] + public void Test() + { + var wait1 = new ManualResetEventSlim(); + var wait2 = new ManualResetEventSlim(); + Parallel.Invoke( + () => { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) + using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) { + try { + Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + wait1.Set(); + wait2.Wait(); + Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + } + catch { + // catch deadlock here + // we should complete normally + } + } + }, + () => { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) + using (session.OpenTransaction(TransactionOpenMode.New, IsolationLevel.Serializable)) { + try { + Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + wait2.Set(); + wait1.Wait(); + Query.All().Lock(LockMode.Exclusive, LockBehavior.Wait).ToArray(); + } + catch { + // catch deadlock here + // we should complete normally + } + } + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0330_MaterializationOfNullReference.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0330_MaterializationOfNullReference.cs index 4bb7725b3d..e44dce7c0c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0330_MaterializationOfNullReference.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0330_MaterializationOfNullReference.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.17 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0330_MaterializationOfNullReferenceModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0330_MaterializationOfNullReferenceModel - { - [HierarchyRoot] - public class Referencer : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Referencer Ref { get; set; } - } - } - - public class IssueJira0330_MaterializationOfNullReference : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Referencer).Assembly, typeof (Referencer).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Referencer(); - t.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var query = Query.Execute(() => Query.All().Where(r => r.Id > 0).Select(r => r.Ref)); - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0], Is.Null); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.17 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0330_MaterializationOfNullReferenceModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0330_MaterializationOfNullReferenceModel + { + [HierarchyRoot] + public class Referencer : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Referencer Ref { get; set; } + } + } + + public class IssueJira0330_MaterializationOfNullReference : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Referencer).Assembly, typeof (Referencer).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Referencer(); + t.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var query = Query.Execute(() => Query.All().Where(r => r.Id > 0).Select(r => r.Ref)); + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0], Is.Null); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0339_PrefetchViaStructure.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0339_PrefetchViaStructure.cs index 7f4835f462..2fa48277c2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0339_PrefetchViaStructure.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0339_PrefetchViaStructure.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.22 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Issues.IssueJira0339_PrefetchViaStructureModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0339_PrefetchViaStructureModel - { - public class Jira0339Struct : Structure - { - [Field] - public Jira0339Target Target { get; set; } - } - - [HierarchyRoot] - public class Jira0339Owner : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Jira0339Struct Targets { get; set; } - } - - [HierarchyRoot] - public class Jira0339Target : Entity - { - [Field, Key] - public int Id { get; private set; } - } - } - - public class IssueJira0339_PrefetchViaStructure : AutoBuildTest - { - private Key targetKey; - - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Jira0339Owner).Assembly, typeof (Jira0339Owner).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var target = new Jira0339Target(); - var owner = new Jira0339Owner(); - targetKey = target.Key; - owner.Targets.Target = target; - tx.Complete(); - } - } - - [Test] - public void PrefetchViaPersistentType() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = Query.All() - .Prefetch(o => o.Targets.Target) - .ToList(); - StorageTestHelper.IsFetched(session, targetKey); - } - } - - [Test] - public void PrefetchViaNonPersistentType() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = Query.All() - .GroupBy(o => new {Owner = o}) - .Prefetch(g => g.Key.Owner.Targets.Target) - .ToList(); - StorageTestHelper.IsFetched(session, targetKey); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.22 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueJira0339_PrefetchViaStructureModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0339_PrefetchViaStructureModel + { + public class Jira0339Struct : Structure + { + [Field] + public Jira0339Target Target { get; set; } + } + + [HierarchyRoot] + public class Jira0339Owner : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Jira0339Struct Targets { get; set; } + } + + [HierarchyRoot] + public class Jira0339Target : Entity + { + [Field, Key] + public int Id { get; private set; } + } + } + + public class IssueJira0339_PrefetchViaStructure : AutoBuildTest + { + private Key targetKey; + + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Jira0339Owner).Assembly, typeof (Jira0339Owner).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var target = new Jira0339Target(); + var owner = new Jira0339Owner(); + targetKey = target.Key; + owner.Targets.Target = target; + tx.Complete(); + } + } + + [Test] + public void PrefetchViaPersistentType() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = Query.All() + .Prefetch(o => o.Targets.Target) + .ToList(); + StorageTestHelper.IsFetched(session, targetKey); + } + } + + [Test] + public void PrefetchViaNonPersistentType() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = Query.All() + .GroupBy(o => new {Owner = o}) + .Prefetch(g => g.Key.Owner.Targets.Target) + .ToList(); + StorageTestHelper.IsFetched(session, targetKey); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly.cs index 93f820e3e8..3d498685f9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly.cs @@ -1,255 +1,255 @@ -// Copyright (C) 2013-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexey Kulakov -// Created: 2013.07.30 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnlyModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnlyModel -{ - [HierarchyRoot] - public class User : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Login { get; set; } - - [Field] - public string Password { get; set; } - - [Field] - public UserInfo UserInfo { get; set; } - - [Field] - [Association(PairTo = "User")] - public EntitySet AssignedRoles { get; set; } - - [Field] - public EntitySet Groups { get; set; } - - [Field] - public UserState UserState { get; set; } - - [Field] - public Location Location { get; set; } - } - - [HierarchyRoot] - public class UserInfo : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - [Association(PairTo = "UserInfo")] - public User User { get; set; } - } - - [HierarchyRoot] - public class Role : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public string RoleName { get; set; } - - [Field] - public EntitySet AssignedRoles { get; set; } - } - - [HierarchyRoot] - public class AssignedRole : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - [Association(PairTo = "AssignedRoles")] - public Role Role { get; set; } - - [Field(Nullable = false)] - public User User { get; set; } - } - - [HierarchyRoot] - public class Group : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Groups")] - public EntitySet Users { get; set; } - } - - [HierarchyRoot] - public class UserState : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public class Location : Structure - { - [Field] - public double Longitude { get; set; } - - [Field] - public double Latitude { get; set; } - - [Field] - public City City { get; set; } - } - - [HierarchyRoot] - public class City : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly : AutoBuildTest - { - private List roles; - private List users; - private List userStates; - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (User).Assembly, typeof (User).Namespace); - return configuration; - } - - protected override void PopulateData() - { - roles = new List(); - users = new List(); - userStates = new List(); - - using(var session = Domain.OpenSession()) - using(var transaction = session.OpenTransaction()) { - roles.Add(new Role {RoleName = "Admin"}); - roles.Add(new Role {RoleName = "User"}); - roles.Add(new Role {RoleName = "Moderator"}); - - userStates.Add(new UserState { Name = "Activated"}); - userStates.Add(new UserState { Name = "NotActivated" }); - userStates.Add(new UserState { Name = "Blocked" }); - - users.Add(new User { - Login = "walli98", - Password = "1", - UserInfo = new UserInfo { - FirstName = "John", - LastName = "Bean" - }, - UserState = userStates.Find(el=>el.Name=="Activated"), - Location = new Location{City = new City{Name = "City1"},Latitude = 0, Longitude = 1} - }); - users.Add(new User { - Login = "visa43", - Password = "1", - UserInfo = new UserInfo { - FirstName = "John", - LastName = "Potter" - }, - UserState = userStates.Find(el=>el.Name=="Blocked"), - Location = new Location { City = new City { Name = "City1" }, Latitude = 0, Longitude = 1 } - }); - users.Add(new User { - Login = "csi90210", - Password = "1", - UserInfo = new UserInfo { - FirstName = "Alex", - LastName = "Alexander" - }, - UserState = userStates.Find(el => el.Name == "Activated"), - Location = new Location { City = new City { Name = "City1" }, Latitude = 0, Longitude = 1 } - }); - - new AssignedRole { - User = users.Find(el => el.Login=="walli98"), - Role = roles.Find(el => el.RoleName=="Admin") - }; - new AssignedRole { - User = users.Find(el => el.Login == "visa43"), - Role = roles.Find(el => el.RoleName == "User") - }; - new AssignedRole { - User = users.Find(el => el.Login == "csi90210"), - Role = roles.Find(el => el.RoleName == "Moderator") - }; - - var group = new Group { - Name = "Closed for everyone" - }; - group = new Group { - Name = "Admin's Group" - }; - group.Users.Add(users.Find(el => el.Login == "walli98")); - group = new Group { - Name = "Moderator's and Admin's Group" - }; - group.Users.Add(users.Find(el => el.Login=="walli98")); - group.Users.Add(users.Find(el => el.Login=="walli98")); - transaction.Complete(); - } - } - - [Test] - public void InboundOnlyAndOutbountOnlyFlagsTest() - { - Assert.That(Domain.Model.Types.First(el => el.Name=="Role").IsInboundOnly, Is.EqualTo(true)); - Assert.That(Domain.Model.Types.First(el => el.Name=="Role").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="User").IsInboundOnly, Is.EqualTo(false)); - Assert.That(Domain.Model.Types.First(el => el.Name=="User").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="Group").IsInboundOnly, Is.EqualTo(true)); - Assert.That(Domain.Model.Types.First(el => el.Name=="Group").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="City").IsInboundOnly, Is.EqualTo(true)); - Assert.That(Domain.Model.Types.First(el => el.Name=="City").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="UserInfo").IsInboundOnly, Is.EqualTo(false)); - Assert.That(Domain.Model.Types.First(el => el.Name=="UserInfo").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="UserState").IsInboundOnly, Is.EqualTo(true)); - Assert.That(Domain.Model.Types.First(el => el.Name=="UserState").IsOutboundOnly, Is.EqualTo(false)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="AssignedRole").IsInboundOnly, Is.EqualTo(false)); - Assert.That(Domain.Model.Types.First(el => el.Name=="AssignedRole").IsOutboundOnly, Is.EqualTo(true)); - - Assert.That(Domain.Model.Types.First(el => el.Name=="User-Groups-Group").IsInboundOnly, Is.EqualTo(false)); - Assert.That(Domain.Model.Types.First(el => el.Name=="User-Groups-Group").IsOutboundOnly, Is.EqualTo(true)); - } - } -} +// Copyright (C) 2013-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexey Kulakov +// Created: 2013.07.30 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnlyModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnlyModel +{ + [HierarchyRoot] + public class User : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Login { get; set; } + + [Field] + public string Password { get; set; } + + [Field] + public UserInfo UserInfo { get; set; } + + [Field] + [Association(PairTo = "User")] + public EntitySet AssignedRoles { get; set; } + + [Field] + public EntitySet Groups { get; set; } + + [Field] + public UserState UserState { get; set; } + + [Field] + public Location Location { get; set; } + } + + [HierarchyRoot] + public class UserInfo : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + [Association(PairTo = "UserInfo")] + public User User { get; set; } + } + + [HierarchyRoot] + public class Role : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public string RoleName { get; set; } + + [Field] + public EntitySet AssignedRoles { get; set; } + } + + [HierarchyRoot] + public class AssignedRole : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + [Association(PairTo = "AssignedRoles")] + public Role Role { get; set; } + + [Field(Nullable = false)] + public User User { get; set; } + } + + [HierarchyRoot] + public class Group : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Groups")] + public EntitySet Users { get; set; } + } + + [HierarchyRoot] + public class UserState : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public class Location : Structure + { + [Field] + public double Longitude { get; set; } + + [Field] + public double Latitude { get; set; } + + [Field] + public City City { get; set; } + } + + [HierarchyRoot] + public class City : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0346_OptimizeSessionSaveChangesWithoutInboundOnlyAndOutboundOnly : AutoBuildTest + { + private List roles; + private List users; + private List userStates; + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (User).Assembly, typeof (User).Namespace); + return configuration; + } + + protected override void PopulateData() + { + roles = new List(); + users = new List(); + userStates = new List(); + + using(var session = Domain.OpenSession()) + using(var transaction = session.OpenTransaction()) { + roles.Add(new Role {RoleName = "Admin"}); + roles.Add(new Role {RoleName = "User"}); + roles.Add(new Role {RoleName = "Moderator"}); + + userStates.Add(new UserState { Name = "Activated"}); + userStates.Add(new UserState { Name = "NotActivated" }); + userStates.Add(new UserState { Name = "Blocked" }); + + users.Add(new User { + Login = "walli98", + Password = "1", + UserInfo = new UserInfo { + FirstName = "John", + LastName = "Bean" + }, + UserState = userStates.Find(el=>el.Name=="Activated"), + Location = new Location{City = new City{Name = "City1"},Latitude = 0, Longitude = 1} + }); + users.Add(new User { + Login = "visa43", + Password = "1", + UserInfo = new UserInfo { + FirstName = "John", + LastName = "Potter" + }, + UserState = userStates.Find(el=>el.Name=="Blocked"), + Location = new Location { City = new City { Name = "City1" }, Latitude = 0, Longitude = 1 } + }); + users.Add(new User { + Login = "csi90210", + Password = "1", + UserInfo = new UserInfo { + FirstName = "Alex", + LastName = "Alexander" + }, + UserState = userStates.Find(el => el.Name == "Activated"), + Location = new Location { City = new City { Name = "City1" }, Latitude = 0, Longitude = 1 } + }); + + new AssignedRole { + User = users.Find(el => el.Login=="walli98"), + Role = roles.Find(el => el.RoleName=="Admin") + }; + new AssignedRole { + User = users.Find(el => el.Login == "visa43"), + Role = roles.Find(el => el.RoleName == "User") + }; + new AssignedRole { + User = users.Find(el => el.Login == "csi90210"), + Role = roles.Find(el => el.RoleName == "Moderator") + }; + + var group = new Group { + Name = "Closed for everyone" + }; + group = new Group { + Name = "Admin's Group" + }; + group.Users.Add(users.Find(el => el.Login == "walli98")); + group = new Group { + Name = "Moderator's and Admin's Group" + }; + group.Users.Add(users.Find(el => el.Login=="walli98")); + group.Users.Add(users.Find(el => el.Login=="walli98")); + transaction.Complete(); + } + } + + [Test] + public void InboundOnlyAndOutbountOnlyFlagsTest() + { + Assert.That(Domain.Model.Types.First(el => el.Name=="Role").IsInboundOnly, Is.EqualTo(true)); + Assert.That(Domain.Model.Types.First(el => el.Name=="Role").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="User").IsInboundOnly, Is.EqualTo(false)); + Assert.That(Domain.Model.Types.First(el => el.Name=="User").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="Group").IsInboundOnly, Is.EqualTo(true)); + Assert.That(Domain.Model.Types.First(el => el.Name=="Group").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="City").IsInboundOnly, Is.EqualTo(true)); + Assert.That(Domain.Model.Types.First(el => el.Name=="City").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="UserInfo").IsInboundOnly, Is.EqualTo(false)); + Assert.That(Domain.Model.Types.First(el => el.Name=="UserInfo").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="UserState").IsInboundOnly, Is.EqualTo(true)); + Assert.That(Domain.Model.Types.First(el => el.Name=="UserState").IsOutboundOnly, Is.EqualTo(false)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="AssignedRole").IsInboundOnly, Is.EqualTo(false)); + Assert.That(Domain.Model.Types.First(el => el.Name=="AssignedRole").IsOutboundOnly, Is.EqualTo(true)); + + Assert.That(Domain.Model.Types.First(el => el.Name=="User-Groups-Group").IsInboundOnly, Is.EqualTo(false)); + Assert.That(Domain.Model.Types.First(el => el.Name=="User-Groups-Group").IsOutboundOnly, Is.EqualTo(true)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0357_IndexWithInheritedFields.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0357_IndexWithInheritedFields.cs index 7d405ec44b..abd33ac8bf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0357_IndexWithInheritedFields.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0357_IndexWithInheritedFields.cs @@ -1,205 +1,205 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.08.07 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using concreteTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields1; -using singleTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields2; -using classTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields3; - - -namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields1 -{ - [HierarchyRoot] - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] - [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] - public class EntityA : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - - [Field(Nullable = false)] - public EntityB TestLink { get; set; } - } - - [HierarchyRoot] - public class EntityB : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - } - - [Index("Field", "TestField", Unique = true, Name = "DescendantA.IX_FieldTestField")] - [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] - [Index("TestField", Unique = true, Name = "DescendantA.IX_TestField")] - public class DescendantA : EntityA - { - [Field] - public int Field { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields2 -{ - [HierarchyRoot] - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] - - public class EntityA : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - - [Field(Nullable = false)] - public EntityB TestLink { get; set; } - } - - [HierarchyRoot] - public class EntityB : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - } - - [Index("Field", "TestField", Unique = true, Name = "DescendantA.IX_FieldTestField")] - [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] - [Index("TestField", Unique = true, Name = "DescendantA.IX_TestField")] - public class DescendantA : EntityA - { - [Field] - public int Field { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields3 -{ - [HierarchyRoot] - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] - [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] - public class EntityA : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - - [Field(Nullable = false)] - public EntityB TestLink { get; set; } - } - - [HierarchyRoot] - public class EntityB : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string TestField { get; set; } - } - - [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] - public class DescendantA : EntityA - { - [Field] - public int Field { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0357_IndexWithInheritedFields : AutoBuildTest - { - protected DomainConfiguration BuildConfiguration(Type type) - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(type.Assembly, type.Namespace); - return configuration; - } - - [Test] - public void ConcreteTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof (concreteTableModel.DescendantA)))) { - var descendantType = domain.Model.Types[typeof (concreteTableModel.DescendantA)]; - var secondaryIndexes = descendantType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); - Assert.AreEqual(4, secondaryIndexes.Count()); - var entityAType = domain.Model.Types[typeof (concreteTableModel.EntityA)]; - secondaryIndexes = entityAType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); - Assert.AreEqual(1, secondaryIndexes.Count()); - using (var session = domain.OpenSession()) { - using (var trans = session.OpenTransaction()) { - var a = new concreteTableModel.EntityA(); - a.TestLink = new concreteTableModel.EntityB(); - trans.Complete(); - } - using (var trans = session.OpenTransaction()) { - var result = session.Query.All().ToList(); - - } - } - } - } - - [Test] - public void SingleTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof (singleTableModel.DescendantA)))) { - var type = domain.Model.Types[typeof (singleTableModel.EntityA)]; - var secondaryIndexes = type.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); - Assert.AreEqual(4, secondaryIndexes.Count()); - } - } - - [Test] - public void ClassTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof (classTableModel.DescendantA)))) { - var type = domain.Model.Types[typeof (classTableModel.DescendantA)]; - var secondaryIndexes = type.Indexes.Where(index => index.IsSecondary && !index.IsVirtual); - Assert.AreEqual(1, secondaryIndexes.Count()); - var entityAType = domain.Model.Types[typeof(classTableModel.EntityA)]; - secondaryIndexes = entityAType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); - Assert.AreEqual(1, secondaryIndexes.Count()); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.08.07 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using concreteTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields1; +using singleTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields2; +using classTableModel = Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields3; + + +namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields1 +{ + [HierarchyRoot] + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] + [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] + public class EntityA : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + + [Field(Nullable = false)] + public EntityB TestLink { get; set; } + } + + [HierarchyRoot] + public class EntityB : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + } + + [Index("Field", "TestField", Unique = true, Name = "DescendantA.IX_FieldTestField")] + [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] + [Index("TestField", Unique = true, Name = "DescendantA.IX_TestField")] + public class DescendantA : EntityA + { + [Field] + public int Field { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields2 +{ + [HierarchyRoot] + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] + + public class EntityA : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + + [Field(Nullable = false)] + public EntityB TestLink { get; set; } + } + + [HierarchyRoot] + public class EntityB : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + } + + [Index("Field", "TestField", Unique = true, Name = "DescendantA.IX_FieldTestField")] + [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] + [Index("TestField", Unique = true, Name = "DescendantA.IX_TestField")] + public class DescendantA : EntityA + { + [Field] + public int Field { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0357_IndexWithInheritedFields3 +{ + [HierarchyRoot] + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] + [Index("TestField", "TestLink", Unique = true, Name = "DescendantA.IX_TestFieldTestLink")] + public class EntityA : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + + [Field(Nullable = false)] + public EntityB TestLink { get; set; } + } + + [HierarchyRoot] + public class EntityB : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string TestField { get; set; } + } + + [Index("Field", Unique = true, Name = "DescendantA.IX_Field")] + public class DescendantA : EntityA + { + [Field] + public int Field { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0357_IndexWithInheritedFields : AutoBuildTest + { + protected DomainConfiguration BuildConfiguration(Type type) + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(type.Assembly, type.Namespace); + return configuration; + } + + [Test] + public void ConcreteTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof (concreteTableModel.DescendantA)))) { + var descendantType = domain.Model.Types[typeof (concreteTableModel.DescendantA)]; + var secondaryIndexes = descendantType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); + Assert.AreEqual(4, secondaryIndexes.Count()); + var entityAType = domain.Model.Types[typeof (concreteTableModel.EntityA)]; + secondaryIndexes = entityAType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); + Assert.AreEqual(1, secondaryIndexes.Count()); + using (var session = domain.OpenSession()) { + using (var trans = session.OpenTransaction()) { + var a = new concreteTableModel.EntityA(); + a.TestLink = new concreteTableModel.EntityB(); + trans.Complete(); + } + using (var trans = session.OpenTransaction()) { + var result = session.Query.All().ToList(); + + } + } + } + } + + [Test] + public void SingleTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof (singleTableModel.DescendantA)))) { + var type = domain.Model.Types[typeof (singleTableModel.EntityA)]; + var secondaryIndexes = type.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); + Assert.AreEqual(4, secondaryIndexes.Count()); + } + } + + [Test] + public void ClassTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof (classTableModel.DescendantA)))) { + var type = domain.Model.Types[typeof (classTableModel.DescendantA)]; + var secondaryIndexes = type.Indexes.Where(index => index.IsSecondary && !index.IsVirtual); + Assert.AreEqual(1, secondaryIndexes.Count()); + var entityAType = domain.Model.Types[typeof(classTableModel.EntityA)]; + secondaryIndexes = entityAType.Indexes.Where(index => index.IsSecondary && !index.IsVirtual && index.IsUnique); + Assert.AreEqual(1, secondaryIndexes.Count()); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0385_OracleExtractorFailure.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0385_OracleExtractorFailure.cs index 65035ede8e..0ea4db1c6a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0385_OracleExtractorFailure.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0385_OracleExtractorFailure.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.04.18 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0385Model; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0385Model - { - [HierarchyRoot] - [Index("DateFrom:DESC", "DateTo:DESC")] - public class J0385Entity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public double? Duration { get; set; } - - [Field] - public DateTime DateFrom { get; set; } - - [Field] - public DateTime? DateTo { get; set; } - } - } - - [TestFixture] - public class IssueJira0385_OracleExtractorFailure : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (J0385Entity)); - return configuration; - } - - public override void TestFixtureSetUp() - { - } - - public void BuildWithMode(DomainUpgradeMode mode) - { - var configuration = BuildConfiguration(); - configuration.UpgradeMode = mode; - var domain = BuildDomain(configuration); - domain.Dispose(); - } - - [Test] - public void MainTest() - { - Require.ProviderIs(StorageProvider.Oracle); - BuildWithMode(DomainUpgradeMode.Recreate); - BuildWithMode(DomainUpgradeMode.Validate); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.04.18 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0385Model; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0385Model + { + [HierarchyRoot] + [Index("DateFrom:DESC", "DateTo:DESC")] + public class J0385Entity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public double? Duration { get; set; } + + [Field] + public DateTime DateFrom { get; set; } + + [Field] + public DateTime? DateTo { get; set; } + } + } + + [TestFixture] + public class IssueJira0385_OracleExtractorFailure : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (J0385Entity)); + return configuration; + } + + public override void TestFixtureSetUp() + { + } + + public void BuildWithMode(DomainUpgradeMode mode) + { + var configuration = BuildConfiguration(); + configuration.UpgradeMode = mode; + var domain = BuildDomain(configuration); + domain.Dispose(); + } + + [Test] + public void MainTest() + { + Require.ProviderIs(StorageProvider.Oracle); + BuildWithMode(DomainUpgradeMode.Recreate); + BuildWithMode(DomainUpgradeMode.Validate); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlBox.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlBox.cs index b7d8d419dd..9df930f4d9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlBox.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlBox.cs @@ -1,227 +1,227 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.05 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlBoxModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlBoxModel - { - [HierarchyRoot] - public class EntityWithNpgsqlBox : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlBox Box { get; set; } - - [Field] - public NpgsqlBox OtherBox { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlBox : AutoBuildTest - { - private NpgsqlBox box = new NpgsqlBox(new NpgsqlPoint(2, 3), new NpgsqlPoint(0, 1)); - private NpgsqlBox otherBox = new NpgsqlBox(new NpgsqlPoint(11, 22), new NpgsqlPoint(33, 44)); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlBox)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlBox {Box = box, OtherBox = otherBox}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlBox"); - } - - #region Extractors - - [Test] - public void ExtractUpperRightPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.UpperRight!=otherBox.UpperRight); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractLowerLeftPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.LowerLeft!=otherBox.LowerLeft); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractRightTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Right==box.Right); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractTopTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Top==box.Top); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractLeftTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Left==box.Left); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractBottomTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Bottom==box.Bottom); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractHeightTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Height==box.Height); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractWidthTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box.Width==box.Width); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - - #region Operators - - [Test] - public void EqualityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box==e.Box); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void InequalityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Box!=e.OtherBox); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.05 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlBoxModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlBoxModel + { + [HierarchyRoot] + public class EntityWithNpgsqlBox : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlBox Box { get; set; } + + [Field] + public NpgsqlBox OtherBox { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlBox : AutoBuildTest + { + private NpgsqlBox box = new NpgsqlBox(new NpgsqlPoint(2, 3), new NpgsqlPoint(0, 1)); + private NpgsqlBox otherBox = new NpgsqlBox(new NpgsqlPoint(11, 22), new NpgsqlPoint(33, 44)); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlBox)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlBox {Box = box, OtherBox = otherBox}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlBox"); + } + + #region Extractors + + [Test] + public void ExtractUpperRightPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.UpperRight!=otherBox.UpperRight); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractLowerLeftPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.LowerLeft!=otherBox.LowerLeft); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractRightTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Right==box.Right); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractTopTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Top==box.Top); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractLeftTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Left==box.Left); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractBottomTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Bottom==box.Bottom); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractHeightTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Height==box.Height); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractWidthTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box.Width==box.Width); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + + #region Operators + + [Test] + public void EqualityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box==e.Box); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void InequalityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Box!=e.OtherBox); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlCircle.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlCircle.cs index acd66561a7..eb2a03d709 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlCircle.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlCircle.cs @@ -1,131 +1,131 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlCircleModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlCircleModel - { - [HierarchyRoot] - public class EntityWithNpgsqlCircle : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlCircle Circle { get; set; } - - [Field] - public NpgsqlCircle OtherCircle { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlCircle : AutoBuildTest - { - private NpgsqlCircle circle = new NpgsqlCircle(new NpgsqlPoint(1, 1), 10); - private NpgsqlCircle otherCircle = new NpgsqlCircle(new NpgsqlPoint(0, 0), 11); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlCircle)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlCircle {Circle = circle}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlCircle"); - } - - #region Extractors - - [Test] - public void ExtractCenterPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Circle.Center!=otherCircle.Center); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractRadiusTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Circle.Radius==circle.Radius); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - - #region Operators - - [Test] - public void EqualityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Circle==e.Circle); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void InequalityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Circle!=e.OtherCircle); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlCircleModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlCircleModel + { + [HierarchyRoot] + public class EntityWithNpgsqlCircle : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlCircle Circle { get; set; } + + [Field] + public NpgsqlCircle OtherCircle { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlCircle : AutoBuildTest + { + private NpgsqlCircle circle = new NpgsqlCircle(new NpgsqlPoint(1, 1), 10); + private NpgsqlCircle otherCircle = new NpgsqlCircle(new NpgsqlPoint(0, 0), 11); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlCircle)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlCircle {Circle = circle}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlCircle"); + } + + #region Extractors + + [Test] + public void ExtractCenterPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Circle.Center!=otherCircle.Center); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractRadiusTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Circle.Radius==circle.Radius); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + + #region Operators + + [Test] + public void EqualityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Circle==e.Circle); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void InequalityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Circle!=e.OtherCircle); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlLSeg.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlLSeg.cs index 1c2813c5ef..b051b5d3f2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlLSeg.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlLSeg.cs @@ -1,173 +1,173 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlLSegModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlLSegModel - { - [HierarchyRoot] - public class EntityWithNpgsqlLSeg : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlLSeg LSeg { get; set; } - - [Field] - public NpgsqlLSeg OtherLSeg { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlLSeg : AutoBuildTest - { - private NpgsqlLSeg lSeg = new NpgsqlLSeg(new NpgsqlPoint(1, 1), new NpgsqlPoint(2, 2)); - private NpgsqlLSeg otherLSeg = new NpgsqlLSeg(new NpgsqlPoint(0, 0), new NpgsqlPoint(1, 1)); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlLSeg)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlLSeg {LSeg = lSeg, OtherLSeg = otherLSeg}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlLSeg"); - } - - #region Extractors - - [Test] - public void ExtractStartPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg.Start!=otherLSeg.Start); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractEndPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg.End!=otherLSeg.End); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractPartOfStartPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg.Start.X==lSeg.Start.X); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - query = session.Query.All() - .Where(e => e.LSeg.Start.Y==lSeg.Start.Y); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractPartOfEndPointTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg.End.X==lSeg.End.X); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - query = session.Query.All() - .Where(e => e.LSeg.End.Y==lSeg.End.Y); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - - #region Operators - - [Test] - public void EqualityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg==e.LSeg); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void InequalityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.LSeg!=e.OtherLSeg); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlLSegModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlLSegModel + { + [HierarchyRoot] + public class EntityWithNpgsqlLSeg : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlLSeg LSeg { get; set; } + + [Field] + public NpgsqlLSeg OtherLSeg { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlLSeg : AutoBuildTest + { + private NpgsqlLSeg lSeg = new NpgsqlLSeg(new NpgsqlPoint(1, 1), new NpgsqlPoint(2, 2)); + private NpgsqlLSeg otherLSeg = new NpgsqlLSeg(new NpgsqlPoint(0, 0), new NpgsqlPoint(1, 1)); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlLSeg)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlLSeg {LSeg = lSeg, OtherLSeg = otherLSeg}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlLSeg"); + } + + #region Extractors + + [Test] + public void ExtractStartPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg.Start!=otherLSeg.Start); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractEndPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg.End!=otherLSeg.End); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractPartOfStartPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg.Start.X==lSeg.Start.X); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + query = session.Query.All() + .Where(e => e.LSeg.Start.Y==lSeg.Start.Y); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractPartOfEndPointTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg.End.X==lSeg.End.X); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + query = session.Query.All() + .Where(e => e.LSeg.End.Y==lSeg.End.Y); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + + #region Operators + + [Test] + public void EqualityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg==e.LSeg); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void InequalityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.LSeg!=e.OtherLSeg); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPath.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPath.cs index 3c53f93992..314d2b723e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPath.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPath.cs @@ -1,114 +1,114 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPathModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlPathModel - { - [HierarchyRoot] - public class EntityWithNpgsqlPath : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlPath Path { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlPath : AutoBuildTest - { - private NpgsqlPath path = new NpgsqlPath(new[] { - new NpgsqlPoint(0, 1), - new NpgsqlPoint(2, 3), - new NpgsqlPoint(4, 5), - new NpgsqlPoint(6, 7)}) {Open = true}; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlPath)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlPath {Path = path}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPath"); - } - - [Test] - public void CountTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Path.Count==path.Count); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void OpenTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Path.Open==path.Open); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ContainsTest() - { - NpgsqlPoint pointContains = new NpgsqlPoint(4, 5); - NpgsqlPoint pointNotContains = new NpgsqlPoint(4, 6); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Path.Contains(pointContains)); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - query = session.Query.All() - .Where(e => e.Path.Contains(pointNotContains)); - Assert.IsTrue(query.ToList().FirstOrDefault()==null); - - t.Complete(); - } - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPathModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlPathModel + { + [HierarchyRoot] + public class EntityWithNpgsqlPath : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlPath Path { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlPath : AutoBuildTest + { + private NpgsqlPath path = new NpgsqlPath(new[] { + new NpgsqlPoint(0, 1), + new NpgsqlPoint(2, 3), + new NpgsqlPoint(4, 5), + new NpgsqlPoint(6, 7)}) {Open = true}; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlPath)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlPath {Path = path}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPath"); + } + + [Test] + public void CountTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Path.Count==path.Count); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void OpenTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Path.Open==path.Open); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ContainsTest() + { + NpgsqlPoint pointContains = new NpgsqlPoint(4, 5); + NpgsqlPoint pointNotContains = new NpgsqlPoint(4, 6); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Path.Contains(pointContains)); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + query = session.Query.All() + .Where(e => e.Path.Contains(pointNotContains)); + Assert.IsTrue(query.ToList().FirstOrDefault()==null); + + t.Complete(); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPoint.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPoint.cs index 89337d65d4..4b00ec5438 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPoint.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPoint.cs @@ -1,131 +1,131 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.05 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPointModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlPointModel - { - [HierarchyRoot] - public class EntityWithNpgsqlPoint : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlPoint Point { get; set; } - - [Field] - public NpgsqlPoint OtherPoint { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlPoint : AutoBuildTest - { - private NpgsqlPoint point = new NpgsqlPoint(0, 1); - private NpgsqlPoint otherPoint = new NpgsqlPoint(1, 0); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlPoint)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlPoint {Point = point, OtherPoint = otherPoint}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPoint"); - } - - #region Extractors - - [Test] - public void ExtractXPartTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Point.X==point.X); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ExtractYPartTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Point.Y==point.Y); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - - #region Operators - - [Test] - public void EqualityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Point==e.Point); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void InequalityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Point!=e.OtherPoint); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.05 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPointModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlPointModel + { + [HierarchyRoot] + public class EntityWithNpgsqlPoint : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlPoint Point { get; set; } + + [Field] + public NpgsqlPoint OtherPoint { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlPoint : AutoBuildTest + { + private NpgsqlPoint point = new NpgsqlPoint(0, 1); + private NpgsqlPoint otherPoint = new NpgsqlPoint(1, 0); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlPoint)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlPoint {Point = point, OtherPoint = otherPoint}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPoint"); + } + + #region Extractors + + [Test] + public void ExtractXPartTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Point.X==point.X); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ExtractYPartTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Point.Y==point.Y); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + + #region Operators + + [Test] + public void EqualityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Point==e.Point); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void InequalityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Point!=e.OtherPoint); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPolygon.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPolygon.cs index a7a0b53527..739741ef58 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPolygon.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0416_NpgsqlPolygon.cs @@ -1,143 +1,143 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System.Linq; -using NpgsqlTypes; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPolygonModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0416_NpgsqlPolygonModel - { - [HierarchyRoot] - public class EntityWithNpgsqlPolygon : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public NpgsqlPolygon Polygon { get; set; } - - [Field] - public NpgsqlPolygon OtherPolygon { get; set; } - } - } - - [TestFixture] - internal class IssueJira0416_NpgsqlPolygon : AutoBuildTest - { - private NpgsqlPolygon polygon = new NpgsqlPolygon(new[] { - new NpgsqlPoint(0, 1), - new NpgsqlPoint(2, 3), - new NpgsqlPoint(4, 5), - new NpgsqlPoint(6, 7)}); - - private NpgsqlPolygon otherPolygon = new NpgsqlPolygon(new[] { - new NpgsqlPoint(0, 1), - new NpgsqlPoint(2, 3), - new NpgsqlPoint(4, 5), - new NpgsqlPoint(6, 8)}); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNpgsqlPolygon)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - new EntityWithNpgsqlPolygon {Polygon = polygon, OtherPolygon = otherPolygon}; - t.Complete(); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPolygon"); - } - - [Test] - public void CountTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Polygon.Count==polygon.Count); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void ContainsTest() - { - NpgsqlPoint pointContains = new NpgsqlPoint(4, 5); - NpgsqlPoint pointNotContains = new NpgsqlPoint(4, 6); - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Polygon.Contains(pointContains)); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - query = session.Query.All() - .Where(e => e.Polygon.Contains(pointNotContains)); - Assert.IsTrue(query.ToList().FirstOrDefault()==null); - - t.Complete(); - } - } - } - - #region Operators - - [Test] - public void EqualityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Polygon==e.Polygon); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - [Test] - public void InequalityTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var query = session.Query.All() - .Where(e => e.Polygon!=e.OtherPolygon); - - Assert.IsTrue(query.ToList().FirstOrDefault()!=null); - - t.Complete(); - } - } - } - - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System.Linq; +using NpgsqlTypes; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0416_NpgsqlPolygonModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0416_NpgsqlPolygonModel + { + [HierarchyRoot] + public class EntityWithNpgsqlPolygon : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public NpgsqlPolygon Polygon { get; set; } + + [Field] + public NpgsqlPolygon OtherPolygon { get; set; } + } + } + + [TestFixture] + internal class IssueJira0416_NpgsqlPolygon : AutoBuildTest + { + private NpgsqlPolygon polygon = new NpgsqlPolygon(new[] { + new NpgsqlPoint(0, 1), + new NpgsqlPoint(2, 3), + new NpgsqlPoint(4, 5), + new NpgsqlPoint(6, 7)}); + + private NpgsqlPolygon otherPolygon = new NpgsqlPolygon(new[] { + new NpgsqlPoint(0, 1), + new NpgsqlPoint(2, 3), + new NpgsqlPoint(4, 5), + new NpgsqlPoint(6, 8)}); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNpgsqlPolygon)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + new EntityWithNpgsqlPolygon {Polygon = polygon, OtherPolygon = otherPolygon}; + t.Complete(); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.PostgreSql, "Only PostgreSql supports the data type of NpgsqlPolygon"); + } + + [Test] + public void CountTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Polygon.Count==polygon.Count); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void ContainsTest() + { + NpgsqlPoint pointContains = new NpgsqlPoint(4, 5); + NpgsqlPoint pointNotContains = new NpgsqlPoint(4, 6); + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Polygon.Contains(pointContains)); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + query = session.Query.All() + .Where(e => e.Polygon.Contains(pointNotContains)); + Assert.IsTrue(query.ToList().FirstOrDefault()==null); + + t.Complete(); + } + } + } + + #region Operators + + [Test] + public void EqualityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Polygon==e.Polygon); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + [Test] + public void InequalityTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var query = session.Query.All() + .Where(e => e.Polygon!=e.OtherPolygon); + + Assert.IsTrue(query.ToList().FirstOrDefault()!=null); + + t.Complete(); + } + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0421_DateTimeAddXxx.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0421_DateTimeAddXxx.cs index 2959a95dfd..56d4a98990 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0421_DateTimeAddXxx.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0421_DateTimeAddXxx.cs @@ -1,120 +1,120 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.02.14 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0421_DateTimeAddXxxModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0421_DateTimeAddXxxModel - { - [HierarchyRoot] - public class EntityWithDate : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public DateTime Today { get; set; } - } - } - - [TestFixture] - public class IssueJira0421_DateTimeAddXxx : AutoBuildTest - { - // private DateTime today = new DateTime(2016, 01, 02, 03, 04, 05, 347); todo This Value failed with sqlite provider because of accuracy millisecond error - private DateTime today = new DateTime(2016, 01, 02, 03, 04, 05, 348); - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithDate)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var e = new EntityWithDate {Today = today}; - tx.Complete(); - } - } - - private void RunAllTestsInt(Func>> filterProvider) - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - RunTest(session, filterProvider.Invoke(1)); - RunTest(session, filterProvider.Invoke(20)); - RunTest(session, filterProvider.Invoke(-5)); - RunTest(session, filterProvider.Invoke(0)); - } - } - - private void RunAllTestsDouble(Func>> filterProvider) - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - RunTest(session, filterProvider.Invoke(1)); - RunTest(session, filterProvider.Invoke(20)); - RunTest(session, filterProvider.Invoke(-5)); - RunTest(session, filterProvider.Invoke(0)); - } - } - - private static void RunTest(Session session, Expression> filter) - { - var count = session.Query.All().Count(filter); - Assert.That(count, Is.EqualTo(1)); - } - - [Test] - public void AddYearsTest() - { - RunAllTestsInt(value => e => e.Today.AddYears(value)==today.AddYears(value)); - } - - [Test] - public void AddMonthsTest() - { - RunAllTestsInt(value => e => e.Today.AddMonths(value)==today.AddMonths(value)); - } - - [Test] - public void AddDaysTest() - { - RunAllTestsDouble(value => e => e.Today.AddDays(value)==today.AddDays(value)); - } - - [Test] - public void AddHoursTest() - { - RunAllTestsDouble(value => e => e.Today.AddHours(value)==today.AddHours(value)); - } - - [Test] - public void AddMinutesTest() - { - RunAllTestsDouble(value => e => e.Today.AddMinutes(value)==today.AddMinutes(value)); - } - - [Test] - public void AddSecondsTest() - { - RunAllTestsDouble(value => e => e.Today.AddSeconds(value)==today.AddSeconds(value)); - } - - [Test] - public void AddMillisecondsTest() - { - RunAllTestsDouble(value => e => e.Today.AddMilliseconds(value)==today.AddMilliseconds(value)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.02.14 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0421_DateTimeAddXxxModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0421_DateTimeAddXxxModel + { + [HierarchyRoot] + public class EntityWithDate : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public DateTime Today { get; set; } + } + } + + [TestFixture] + public class IssueJira0421_DateTimeAddXxx : AutoBuildTest + { + // private DateTime today = new DateTime(2016, 01, 02, 03, 04, 05, 347); todo This Value failed with sqlite provider because of accuracy millisecond error + private DateTime today = new DateTime(2016, 01, 02, 03, 04, 05, 348); + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithDate)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var e = new EntityWithDate {Today = today}; + tx.Complete(); + } + } + + private void RunAllTestsInt(Func>> filterProvider) + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + RunTest(session, filterProvider.Invoke(1)); + RunTest(session, filterProvider.Invoke(20)); + RunTest(session, filterProvider.Invoke(-5)); + RunTest(session, filterProvider.Invoke(0)); + } + } + + private void RunAllTestsDouble(Func>> filterProvider) + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + RunTest(session, filterProvider.Invoke(1)); + RunTest(session, filterProvider.Invoke(20)); + RunTest(session, filterProvider.Invoke(-5)); + RunTest(session, filterProvider.Invoke(0)); + } + } + + private static void RunTest(Session session, Expression> filter) + { + var count = session.Query.All().Count(filter); + Assert.That(count, Is.EqualTo(1)); + } + + [Test] + public void AddYearsTest() + { + RunAllTestsInt(value => e => e.Today.AddYears(value)==today.AddYears(value)); + } + + [Test] + public void AddMonthsTest() + { + RunAllTestsInt(value => e => e.Today.AddMonths(value)==today.AddMonths(value)); + } + + [Test] + public void AddDaysTest() + { + RunAllTestsDouble(value => e => e.Today.AddDays(value)==today.AddDays(value)); + } + + [Test] + public void AddHoursTest() + { + RunAllTestsDouble(value => e => e.Today.AddHours(value)==today.AddHours(value)); + } + + [Test] + public void AddMinutesTest() + { + RunAllTestsDouble(value => e => e.Today.AddMinutes(value)==today.AddMinutes(value)); + } + + [Test] + public void AddSecondsTest() + { + RunAllTestsDouble(value => e => e.Today.AddSeconds(value)==today.AddSeconds(value)); + } + + [Test] + public void AddMillisecondsTest() + { + RunAllTestsDouble(value => e => e.Today.AddMilliseconds(value)==today.AddMilliseconds(value)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0424_DateTimeOperationInvalidSql.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0424_DateTimeOperationInvalidSql.cs index f24188cddf..46d1e1762c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0424_DateTimeOperationInvalidSql.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0424_DateTimeOperationInvalidSql.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.31 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0424_DateTimeOperationInvalidSqlModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0424_DateTimeOperationInvalidSqlModel - { - [HierarchyRoot] - public class EntityWithDate : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public DateTime Date { get; set; } - - [Field] - public string Type { get; set; } - - [Field] - public string Description { get; set; } - } - } - - public class IssueJira0424_DateTimeOperationInvalidSql : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithDate)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new EntityWithDate {Date = new DateTime(2013, 1, 30, 12, 0, 0)}; - new EntityWithDate {Date = new DateTime(2013, 1, 31, 5, 0, 0)}; - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var offset = TimeSpan.FromHours(6); - var q = - from t in session.Query.All() - group t by new { - Date = t.Date.TimeOfDay < offset - ? new DateTime(t.Date.Year, t.Date.Month, t.Date.Day) - : new DateTime(t.Date.Year, t.Date.Month, t.Date.Day) + TimeSpan.FromDays(1), - t.Type, - Description = t.Type.StartsWith("XYZ") ? "" : t.Description - }; - var result = q.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Key.Date, Is.EqualTo(new DateTime(2013, 1, 31))); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.31 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0424_DateTimeOperationInvalidSqlModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0424_DateTimeOperationInvalidSqlModel + { + [HierarchyRoot] + public class EntityWithDate : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public DateTime Date { get; set; } + + [Field] + public string Type { get; set; } + + [Field] + public string Description { get; set; } + } + } + + public class IssueJira0424_DateTimeOperationInvalidSql : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithDate)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new EntityWithDate {Date = new DateTime(2013, 1, 30, 12, 0, 0)}; + new EntityWithDate {Date = new DateTime(2013, 1, 31, 5, 0, 0)}; + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var offset = TimeSpan.FromHours(6); + var q = + from t in session.Query.All() + group t by new { + Date = t.Date.TimeOfDay < offset + ? new DateTime(t.Date.Year, t.Date.Month, t.Date.Day) + : new DateTime(t.Date.Year, t.Date.Month, t.Date.Day) + TimeSpan.FromDays(1), + t.Type, + Description = t.Type.StartsWith("XYZ") ? "" : t.Description + }; + var result = q.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Key.Date, Is.EqualTo(new DateTime(2013, 1, 31))); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0425_DateTimeOperationError.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0425_DateTimeOperationError.cs index bcc000f1aa..a4b93fd633 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0425_DateTimeOperationError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0425_DateTimeOperationError.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.31 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0425_DateTimeOperationErrorModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0425_DateTimeOperationErrorModel - { - [HierarchyRoot] - public class EntityWithDate : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public DateTime Date { get; set; } - } - } - - public class IssueJira0425_DateTimeOperationError : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithDate)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - TimeSpan offset = TimeSpan.FromHours(5); - var q = - from t in session.Query.All() - select new { - Date = t.Date + offset - } - into ts - group ts by new { - Date = new DateTime(ts.Date.Year, ts.Date.Month, ts.Date.Day) - }; - var res = q.FirstOrDefault(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.31 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0425_DateTimeOperationErrorModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0425_DateTimeOperationErrorModel + { + [HierarchyRoot] + public class EntityWithDate : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public DateTime Date { get; set; } + } + } + + public class IssueJira0425_DateTimeOperationError : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithDate)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + TimeSpan offset = TimeSpan.FromHours(5); + var q = + from t in session.Query.All() + select new { + Date = t.Date + offset + } + into ts + group ts by new { + Date = new DateTime(ts.Date.Year, ts.Date.Month, ts.Date.Day) + }; + var res = q.FirstOrDefault(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0427_IndexOutOfRangeOnContainsOperation.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0427_IndexOutOfRangeOnContainsOperation.cs index 941f2d0326..b0c76fb7bf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0427_IndexOutOfRangeOnContainsOperation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0427_IndexOutOfRangeOnContainsOperation.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.31 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0427_IndexOutOfRangeOnContainsOperationModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0427_IndexOutOfRangeOnContainsOperationModel - { - [HierarchyRoot] - public class Kind : Entity - { - [Key, Field(Length = 255)] - public string Id { get; private set; } - - [Field] - public string Name { get; private set; } - } - } - - public class IssueJira0427_IndexOutOfRangeOnContainsOperation : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Kind)); - return configuration; - } - - [Test] - public void MainTest() - { - // TODO: fix this to reproduce the bug - - var items = new string[0]; - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .Where(e => items.Contains(e.Name)) - .ToList(); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.31 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0427_IndexOutOfRangeOnContainsOperationModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0427_IndexOutOfRangeOnContainsOperationModel + { + [HierarchyRoot] + public class Kind : Entity + { + [Key, Field(Length = 255)] + public string Id { get; private set; } + + [Field] + public string Name { get; private set; } + } + } + + public class IssueJira0427_IndexOutOfRangeOnContainsOperation : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Kind)); + return configuration; + } + + [Test] + public void MainTest() + { + // TODO: fix this to reproduce the bug + + var items = new string[0]; + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .Where(e => items.Contains(e.Name)) + .ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0430_PartialIndexOnBoolOrEnumFields.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0430_PartialIndexOnBoolOrEnumFields.cs index 2dffbf19e5..358d2f3f11 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0430_PartialIndexOnBoolOrEnumFields.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0430_PartialIndexOnBoolOrEnumFields.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.31 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0430_PartialIndexOnBoolOrEnumFieldsModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0430_PartialIndexOnBoolOrEnumFieldsModel - { - [HierarchyRoot, Index("Value", Filter = "FilterExpression")] - public class EntityWithFilteredIndexWithBooleanField : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Value { get; set; } - - [Field] - public bool? IsActive { get; set; } - - private static Expression> FilterExpression() - { - return e => e.IsActive==true; - } - } - - public enum ObjectState - { - Disabled, - Active, - } - - [HierarchyRoot, Index("Value", Filter = "FilterExpression")] - public class EntityWithFilteredIndexWithEnumField : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Value { get; set; } - - [Field] - public ObjectState ObjState { get; set; } - - private static Expression> FilterExpression() - { - return e => e.ObjState==ObjectState.Active; - } - } - } - - [TestFixture] - public class IssueJira0430_PartialIndexOnBoolOrEnumFields - { - [OneTimeSetUp] - public void TestFixtureSetUp() - { - Require.AllFeaturesSupported(ProviderFeatures.PartialIndexes); - } - - [Test] - public void BoolTest() - { - RunTest(typeof (EntityWithFilteredIndexWithBooleanField)); - } - - [Test] - public void EnumTest() - { - RunTest(typeof (EntityWithFilteredIndexWithEnumField)); - } - - private void RunTest(Type type) - { - BuildDomain(type, DomainUpgradeMode.Recreate); - BuildDomain(type, DomainUpgradeMode.Validate); - } - - private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(type); - configuration.UpgradeMode = upgradeMode; - Domain.Build(configuration).Dispose(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.31 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0430_PartialIndexOnBoolOrEnumFieldsModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0430_PartialIndexOnBoolOrEnumFieldsModel + { + [HierarchyRoot, Index("Value", Filter = "FilterExpression")] + public class EntityWithFilteredIndexWithBooleanField : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Value { get; set; } + + [Field] + public bool? IsActive { get; set; } + + private static Expression> FilterExpression() + { + return e => e.IsActive==true; + } + } + + public enum ObjectState + { + Disabled, + Active, + } + + [HierarchyRoot, Index("Value", Filter = "FilterExpression")] + public class EntityWithFilteredIndexWithEnumField : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Value { get; set; } + + [Field] + public ObjectState ObjState { get; set; } + + private static Expression> FilterExpression() + { + return e => e.ObjState==ObjectState.Active; + } + } + } + + [TestFixture] + public class IssueJira0430_PartialIndexOnBoolOrEnumFields + { + [OneTimeSetUp] + public void TestFixtureSetUp() + { + Require.AllFeaturesSupported(ProviderFeatures.PartialIndexes); + } + + [Test] + public void BoolTest() + { + RunTest(typeof (EntityWithFilteredIndexWithBooleanField)); + } + + [Test] + public void EnumTest() + { + RunTest(typeof (EntityWithFilteredIndexWithEnumField)); + } + + private void RunTest(Type type) + { + BuildDomain(type, DomainUpgradeMode.Recreate); + BuildDomain(type, DomainUpgradeMode.Validate); + } + + private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(type); + configuration.UpgradeMode = upgradeMode; + Domain.Build(configuration).Dispose(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0431_IGroupingKeyIsNotUsable.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0431_IGroupingKeyIsNotUsable.cs index 05b0b22227..98e99afc6e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0431_IGroupingKeyIsNotUsable.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0431_IGroupingKeyIsNotUsable.cs @@ -1,245 +1,245 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.31 - -using System; -using System.Linq; -using System.Runtime.Serialization; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0431_IGroupingKeyIsNotUsableModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0431_IGroupingKeyIsNotUsableModel - { - public interface IItemBase : IEntity - { - } - - public interface IItemVersionBase : IEntity - { - [Field] - IItemBase ItemObject { get; set; } - } - - public class ItemItemVersionsEntitySet : EntitySet - { - protected ItemItemVersionsEntitySet(Entity owner, FieldInfo field) - : base(owner, field) - { - } - - protected ItemItemVersionsEntitySet(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } - - public abstract class ItemBase : Entity, IItemBase - { - [Key, Field] - public Guid Id { get; private set; } - } - - public abstract class ItemVersionBase : Entity, IItemVersionBase - { - [Key, Field] - public Guid Id { get; private set; } - - [Field] - public IItemBase ItemObject { get; set; } - } - - public abstract class Item : ItemBase - { - [Field, Association(PairTo = "ItemObject", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public ItemItemVersionsEntitySet ItemVersions { get; private set; } - } - - public abstract class ItemVersion : ItemVersionBase - { - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class Line : Item - { - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class LineVersion : ItemVersion - { - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class SimpleLine : Entity - { - [Key, Field] - public Guid Id { get; private set; } - - [Field, Association(PairTo = "ItemObject", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet ItemVersions { get; private set; } - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class SimpleLineVersion : Entity - { - [Key, Field] - public Guid Id { get; private set; } - - [Field] - public SimpleLine ItemObject { get; set; } - } - } - - [TestFixture] - public class IssueJira0431_IGroupingKeyIsNotUsable : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var line = new Line(); - line.ItemVersions.Add(new LineVersion()); - line.ItemVersions.Add(new LineVersion()); - new LineVersion(); - - var simpleLine = new SimpleLine(); - simpleLine.ItemVersions.Add(new SimpleLineVersion()); - simpleLine.ItemVersions.Add(new SimpleLineVersion()); - new SimpleLineVersion(); - tx.Complete(); - } - } - - [Test] - public void CountLinqTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - Count = g.Key.ItemVersions.Count(), - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void CountEntitySetTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - g.Key.ItemVersions.Count, - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void CountExplicitTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - Count = session.Query.All().Where(i => i.ItemObject==g.Key).LongCount(), - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void CountLinqSimpleTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - Count = g.Key.ItemVersions.Count(), - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void CountEntitySetSimpleTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - g.Key.ItemVersions.Count, - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void CountExplicitSimpleTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by e - into g - select new { - g.Key, - Count = session.Query.All().Where(i => i.ItemObject==g.Key).LongCount(), - }; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Count, Is.EqualTo(2)); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.31 + +using System; +using System.Linq; +using System.Runtime.Serialization; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0431_IGroupingKeyIsNotUsableModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0431_IGroupingKeyIsNotUsableModel + { + public interface IItemBase : IEntity + { + } + + public interface IItemVersionBase : IEntity + { + [Field] + IItemBase ItemObject { get; set; } + } + + public class ItemItemVersionsEntitySet : EntitySet + { + protected ItemItemVersionsEntitySet(Entity owner, FieldInfo field) + : base(owner, field) + { + } + + protected ItemItemVersionsEntitySet(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } + + public abstract class ItemBase : Entity, IItemBase + { + [Key, Field] + public Guid Id { get; private set; } + } + + public abstract class ItemVersionBase : Entity, IItemVersionBase + { + [Key, Field] + public Guid Id { get; private set; } + + [Field] + public IItemBase ItemObject { get; set; } + } + + public abstract class Item : ItemBase + { + [Field, Association(PairTo = "ItemObject", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public ItemItemVersionsEntitySet ItemVersions { get; private set; } + } + + public abstract class ItemVersion : ItemVersionBase + { + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class Line : Item + { + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class LineVersion : ItemVersion + { + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class SimpleLine : Entity + { + [Key, Field] + public Guid Id { get; private set; } + + [Field, Association(PairTo = "ItemObject", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet ItemVersions { get; private set; } + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class SimpleLineVersion : Entity + { + [Key, Field] + public Guid Id { get; private set; } + + [Field] + public SimpleLine ItemObject { get; set; } + } + } + + [TestFixture] + public class IssueJira0431_IGroupingKeyIsNotUsable : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Line).Assembly, typeof (Line).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var line = new Line(); + line.ItemVersions.Add(new LineVersion()); + line.ItemVersions.Add(new LineVersion()); + new LineVersion(); + + var simpleLine = new SimpleLine(); + simpleLine.ItemVersions.Add(new SimpleLineVersion()); + simpleLine.ItemVersions.Add(new SimpleLineVersion()); + new SimpleLineVersion(); + tx.Complete(); + } + } + + [Test] + public void CountLinqTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + Count = g.Key.ItemVersions.Count(), + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void CountEntitySetTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + g.Key.ItemVersions.Count, + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void CountExplicitTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + Count = session.Query.All().Where(i => i.ItemObject==g.Key).LongCount(), + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void CountLinqSimpleTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + Count = g.Key.ItemVersions.Count(), + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void CountEntitySetSimpleTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + g.Key.ItemVersions.Count, + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void CountExplicitSimpleTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by e + into g + select new { + g.Key, + Count = session.Query.All().Where(i => i.ItemObject==g.Key).LongCount(), + }; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Count, Is.EqualTo(2)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0432_EnumTypeDiscriminator.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0432_EnumTypeDiscriminator.cs index 51139796b6..2989886e4b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0432_EnumTypeDiscriminator.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0432_EnumTypeDiscriminator.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.02.11 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0432_EnumTypeDiscriminatorModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0432_EnumTypeDiscriminatorModel - { - public enum TypeIdentifier - { - Base = 0, - Child = 1, - } - - [HierarchyRoot, TypeDiscriminatorValue(TypeIdentifier.Base, Default = true)] - public class Base : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, TypeDiscriminator] - public TypeIdentifier TypeIdentifier { get; private set; } - } - - [TypeDiscriminatorValue(TypeIdentifier.Child)] - public class Child : Base - { - } - } - - [TestFixture] - public class IssueJira0432_EnumTypeDiscriminator : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TypeIdentifier).Assembly, typeof (TypeIdentifier).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var baseQuery = session.Query.All().ToList(); - var childQuery = session.Query.All().ToList(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.02.11 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0432_EnumTypeDiscriminatorModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0432_EnumTypeDiscriminatorModel + { + public enum TypeIdentifier + { + Base = 0, + Child = 1, + } + + [HierarchyRoot, TypeDiscriminatorValue(TypeIdentifier.Base, Default = true)] + public class Base : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, TypeDiscriminator] + public TypeIdentifier TypeIdentifier { get; private set; } + } + + [TypeDiscriminatorValue(TypeIdentifier.Child)] + public class Child : Base + { + } + } + + [TestFixture] + public class IssueJira0432_EnumTypeDiscriminator : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TypeIdentifier).Assembly, typeof (TypeIdentifier).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var baseQuery = session.Query.All().ToList(); + var childQuery = session.Query.All().ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0433_CompiledQueryOverEntitySet.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0433_CompiledQueryOverEntitySet.cs index e4ac867e2c..f333e72305 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0433_CompiledQueryOverEntitySet.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0433_CompiledQueryOverEntitySet.cs @@ -1,132 +1,132 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.02.13 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0433_CompiledQueryOverEntitySetModel; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0433_CompiledQueryOverEntitySetModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity - { - [Key, Field] - public long Id { get; private set; } - } - } - - public class IssueJira0433_CompiledQueryOverEntitySet : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - return configuration; - } - - [Test] - public void CompiledQueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx =session.OpenTransaction()) { - var owner1 = new Owner(); - var owner2 = new Owner(); - owner1.Items.Add(new Item()); - owner1.Items.Add(new Item()); - - Assert.That(HasItems(session, owner1)); - Assert.That(HasItems(session, owner2), Is.False); - } - } - - [Test] - public void InvalidCompiledQueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var owner1 = new Owner(); - AssertEx.Throws(() => HasItemsInvalid(session, owner1)); - } - } - - [Test] - public void RegularQueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx =session.OpenTransaction()) { - var owner1 = new Owner(); - var owner2 = new Owner(); - owner1.Items.Add(new Item()); - owner1.Items.Add(new Item()); - - Assert.That(session.Query.Items(() => owner1.Items).Any()); - Assert.That(session.Query.Items(() => owner2.Items).Any(), Is.False); - } - } - - [Test] - public void SubqueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var owner1 = new Owner(); - var owner2 = new Owner(); - owner1.Items.Add(new Item()); - owner1.Items.Add(new Item()); - - Assert.That(GetOwnersWithItemsDirect(session).Single(), Is.EqualTo(owner1)); - Assert.That(GetOwnersWithItemsWrapped(session).Single(), Is.EqualTo(owner1)); - - var ownersWithItemsDirect = session.Query - .All() - .Where(o => o.Items.Any()) - .AsEnumerable(); - Assert.That(ownersWithItemsDirect.Single(), Is.EqualTo(owner1)); - - var ownersWithItemsWrapped = session.Query - .All() - .Where(o => session.Query.Items(() => o.Items).Any()) - .AsEnumerable(); - Assert.That(ownersWithItemsWrapped.Single(), Is.EqualTo(owner1)); - } - } - - public IEnumerable GetOwnersWithItemsDirect(Session session) - { - return session.Query.Execute(q => q.All().Where(o => o.Items.Any())); - } - - public IEnumerable GetOwnersWithItemsWrapped(Session session) - { - return session.Query.Execute(q => q.All().Where(o => q.Items(() => o.Items).Any())); - } - - public bool HasItems(Session session, Owner owner) - { - return session.Query.Execute(q => q.Items(() => owner.Items).Any()); - } - - public bool HasItemsInvalid(Session session, Owner owner) - { - return session.Query.Execute(q => owner.Items.Any()); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.02.13 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0433_CompiledQueryOverEntitySetModel; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0433_CompiledQueryOverEntitySetModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity + { + [Key, Field] + public long Id { get; private set; } + } + } + + public class IssueJira0433_CompiledQueryOverEntitySet : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + return configuration; + } + + [Test] + public void CompiledQueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx =session.OpenTransaction()) { + var owner1 = new Owner(); + var owner2 = new Owner(); + owner1.Items.Add(new Item()); + owner1.Items.Add(new Item()); + + Assert.That(HasItems(session, owner1)); + Assert.That(HasItems(session, owner2), Is.False); + } + } + + [Test] + public void InvalidCompiledQueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var owner1 = new Owner(); + AssertEx.Throws(() => HasItemsInvalid(session, owner1)); + } + } + + [Test] + public void RegularQueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx =session.OpenTransaction()) { + var owner1 = new Owner(); + var owner2 = new Owner(); + owner1.Items.Add(new Item()); + owner1.Items.Add(new Item()); + + Assert.That(session.Query.Items(() => owner1.Items).Any()); + Assert.That(session.Query.Items(() => owner2.Items).Any(), Is.False); + } + } + + [Test] + public void SubqueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var owner1 = new Owner(); + var owner2 = new Owner(); + owner1.Items.Add(new Item()); + owner1.Items.Add(new Item()); + + Assert.That(GetOwnersWithItemsDirect(session).Single(), Is.EqualTo(owner1)); + Assert.That(GetOwnersWithItemsWrapped(session).Single(), Is.EqualTo(owner1)); + + var ownersWithItemsDirect = session.Query + .All() + .Where(o => o.Items.Any()) + .AsEnumerable(); + Assert.That(ownersWithItemsDirect.Single(), Is.EqualTo(owner1)); + + var ownersWithItemsWrapped = session.Query + .All() + .Where(o => session.Query.Items(() => o.Items).Any()) + .AsEnumerable(); + Assert.That(ownersWithItemsWrapped.Single(), Is.EqualTo(owner1)); + } + } + + public IEnumerable GetOwnersWithItemsDirect(Session session) + { + return session.Query.Execute(q => q.All().Where(o => o.Items.Any())); + } + + public IEnumerable GetOwnersWithItemsWrapped(Session session) + { + return session.Query.Execute(q => q.All().Where(o => q.Items(() => o.Items).Any())); + } + + public bool HasItems(Session session, Owner owner) + { + return session.Query.Execute(q => q.Items(() => owner.Items).Any()); + } + + public bool HasItemsInvalid(Session session, Owner owner) + { + return session.Query.Execute(q => owner.Items.Any()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0437_OperationsWithListOfInt.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0437_OperationsWithListOfInt.cs index d1459c5e94..44aed413cf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0437_OperationsWithListOfInt.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0437_OperationsWithListOfInt.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.02.22 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0437_OperationsWithListOfIntModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0437_OperationsWithListOfIntModel - { - [HierarchyRoot] - public class NamedObject : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - } - } - - public class IssueJira0437_OperationsWithListOfInt : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (NamedObject)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new NamedObject {Name = "One"}; - new NamedObject {Name = "Two"}; - new NamedObject {Name = "Three"}; - tx.Complete(); - } - } - - [Test] - public void GroupJoinTest() - { - Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new List {2, 3}; - var query = - from o in session.Query.All() - join i in items on o.Id equals i - into j - select o; - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(3)); - } - } - - [Test] - public void JoinTest() - { - Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new List {1, 2}; - var query = - from o in session.Query.All() - join i in items on o.Id equals i - orderby o.Id - select o; - - var result = query.ToList(); - - Assert.That(result.Count, Is.EqualTo(2)); - Assert.That(result[0].Id, Is.EqualTo(1)); - Assert.That(result[1].Id, Is.EqualTo(2)); - } - } - - [Test] - public void ApplyTest() - { - Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new List {1, 2, 3}; - - var query = - from o in session.Query.All() - from i in items - select new {Object = o, Item = i}; - - Assert.That(query.Count(), Is.EqualTo(9)); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.02.22 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0437_OperationsWithListOfIntModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0437_OperationsWithListOfIntModel + { + [HierarchyRoot] + public class NamedObject : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + } + } + + public class IssueJira0437_OperationsWithListOfInt : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (NamedObject)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new NamedObject {Name = "One"}; + new NamedObject {Name = "Two"}; + new NamedObject {Name = "Three"}; + tx.Complete(); + } + } + + [Test] + public void GroupJoinTest() + { + Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new List {2, 3}; + var query = + from o in session.Query.All() + join i in items on o.Id equals i + into j + select o; + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(3)); + } + } + + [Test] + public void JoinTest() + { + Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new List {1, 2}; + var query = + from o in session.Query.All() + join i in items on o.Id equals i + orderby o.Id + select o; + + var result = query.ToList(); + + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result[0].Id, Is.EqualTo(1)); + Assert.That(result[1].Id, Is.EqualTo(2)); + } + } + + [Test] + public void ApplyTest() + { + Require.AnyFeatureNotSupported(ProviderFeatures.TemporaryTableEmulation | ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new List {1, 2, 3}; + + var query = + from o in session.Query.All() + from i in items + select new {Object = o, Item = i}; + + Assert.That(query.Count(), Is.EqualTo(9)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0440_CustomCompilerLoosesImplicitCastToNullable.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0440_CustomCompilerLoosesImplicitCastToNullable.cs index 8d8a563460..e0c9593010 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0440_CustomCompilerLoosesImplicitCastToNullable.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0440_CustomCompilerLoosesImplicitCastToNullable.cs @@ -1,66 +1,66 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0440_CustomCompilerLoosesImplicitCastToNullableModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0440_CustomCompilerLoosesImplicitCastToNullableModel - { - [HierarchyRoot] - public class TestEntity1 : Entity - { - [Key, Field] - public Guid Id { get; private set; } - - [Field] - public DateTime DateField { get; set; } - } - - [HierarchyRoot] - public class TestEntity2 : Entity - { - [Key, Field] - public Guid Id { get; private set; } - - public DateTime? VirtualDateTime { get; set; } - - [Field] - public TestEntity1 LinkWithDate { get; set; } - } - } - - [TestFixture] - public class IssueJira0440_CustomCompilerLoosesImplicitCastToNullable : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity1)); - configuration.Types.Register(typeof (TestEntity2)); - Expression> substitution = e => e.LinkWithDate.DateField; - configuration.LinqExtensions.Register(typeof (TestEntity2).GetProperty("VirtualDateTime"), substitution); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query1 = session.Query.All() - .Where(e => e.VirtualDateTime.Value.Date==DateTime.Now.Date) - .ToList(); - var query2 = session.Query.All() - .Where(e => e.VirtualDateTime.HasValue) - .ToList(); - var query3 = session.Query.All() - .Where(e => e.VirtualDateTime!=null) - .ToList(); - tx.Complete(); - } - } - } +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0440_CustomCompilerLoosesImplicitCastToNullableModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0440_CustomCompilerLoosesImplicitCastToNullableModel + { + [HierarchyRoot] + public class TestEntity1 : Entity + { + [Key, Field] + public Guid Id { get; private set; } + + [Field] + public DateTime DateField { get; set; } + } + + [HierarchyRoot] + public class TestEntity2 : Entity + { + [Key, Field] + public Guid Id { get; private set; } + + public DateTime? VirtualDateTime { get; set; } + + [Field] + public TestEntity1 LinkWithDate { get; set; } + } + } + + [TestFixture] + public class IssueJira0440_CustomCompilerLoosesImplicitCastToNullable : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity1)); + configuration.Types.Register(typeof (TestEntity2)); + Expression> substitution = e => e.LinkWithDate.DateField; + configuration.LinqExtensions.Register(typeof (TestEntity2).GetProperty("VirtualDateTime"), substitution); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query1 = session.Query.All() + .Where(e => e.VirtualDateTime.Value.Date==DateTime.Now.Date) + .ToList(); + var query2 = session.Query.All() + .Where(e => e.VirtualDateTime.HasValue) + .ToList(); + var query3 = session.Query.All() + .Where(e => e.VirtualDateTime!=null) + .ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0441_EntitySetQueryFailsToTranslate.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0441_EntitySetQueryFailsToTranslate.cs index 489fffb186..bcce7e6321 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0441_EntitySetQueryFailsToTranslate.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0441_EntitySetQueryFailsToTranslate.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.04.01 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0441_EntitySetQueryFailsToTranslateModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0441_EntitySetQueryFailsToTranslateModel - { - [HierarchyRoot] - public class Place : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Company : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field(Nullable = false)] - public Man CompanyOwner { get; set; } - - [Field] - public Place Place { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Employees { get; set; } - } - - [HierarchyRoot] - public class Man : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public class Employee : Man - { - [Field] - public Company Owner { get; set; } - } - } - - [TestFixture] - public class IssueJira0441_EntitySetQueryFailsToTranslate : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Employee)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var somePlace = new Place {Name = "SomePlace"}; - var leader1 = new Man {Name = "Company leader 1"}; - var company1 = new Company {Name = "Company 1", CompanyOwner = leader1, Place = somePlace}; - var emp = new Employee {Name = "Slave 1", Owner = company1}; - var emp1 = new Employee {Name = "Slave 2", Owner = company1}; - var emp2 = new Employee {Name = "Slave 3", Owner = company1}; - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var company = session.Query.All().Single(c => c.Name=="Company 1"); - var employees = company.Employees; - var ordered = employees.OrderBy(e => e.Owner.Name).ThenBy(e => e.Owner.Place.Name).ThenBy(e => e.Name).ToList(); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.04.01 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0441_EntitySetQueryFailsToTranslateModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0441_EntitySetQueryFailsToTranslateModel + { + [HierarchyRoot] + public class Place : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Company : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field(Nullable = false)] + public Man CompanyOwner { get; set; } + + [Field] + public Place Place { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Employees { get; set; } + } + + [HierarchyRoot] + public class Man : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public class Employee : Man + { + [Field] + public Company Owner { get; set; } + } + } + + [TestFixture] + public class IssueJira0441_EntitySetQueryFailsToTranslate : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Employee)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var somePlace = new Place {Name = "SomePlace"}; + var leader1 = new Man {Name = "Company leader 1"}; + var company1 = new Company {Name = "Company 1", CompanyOwner = leader1, Place = somePlace}; + var emp = new Employee {Name = "Slave 1", Owner = company1}; + var emp1 = new Employee {Name = "Slave 2", Owner = company1}; + var emp2 = new Employee {Name = "Slave 3", Owner = company1}; + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var company = session.Query.All().Single(c => c.Name=="Company 1"); + var employees = company.Employees; + var ordered = employees.OrderBy(e => e.Owner.Name).ThenBy(e => e.Owner.Place.Name).ThenBy(e => e.Name).ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0442_AsQueryableExpressionInQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0442_AsQueryableExpressionInQuery.cs index 96a2261b42..bdcf925553 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0442_AsQueryableExpressionInQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0442_AsQueryableExpressionInQuery.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.04.29 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0442_AsQueryableExpressionInQueryModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0442_AsQueryableExpressionInQueryModel - { - [HierarchyRoot] - public class ObjectWithId : Entity - { - [Key, Field] - public long Id { get; private set; } - } - } - - [TestFixture] - public class IssueJira0442_AsQueryableExpressionInQuery : AutoBuildTest - { - private List keys = new List(); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ObjectWithId)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var o1 = new ObjectWithId(); - var o2 = new ObjectWithId(); - var o3 = new ObjectWithId(); - keys.Add(o1.Id); - keys.Add(o3.Id); - tx.Complete(); - } - } - - [Test] - public void AsQueryableTest() - { - RunTest(keys.AsQueryable()); - } - - [Test] - public void EnumerableQueryTest() - { - RunTest(new EnumerableQuery(keys)); - } - - private void RunTest(IQueryable keysQuery) - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Where(BuildIdFilter(keysQuery.Expression)) - .Select(i => i.Id) - .OrderBy(i => i) - .ToList(); - Assert.That(result.Count, Is.EqualTo(2)); - Assert.That(result.SequenceEqual(keys)); - tx.Complete(); - } - } - - private Expression> BuildIdFilter(Expression expression) - { - var method = typeof (Queryable).GetMethods().Single(m => m.Name=="Contains" && m.GetParameters().Length==2); - var p = Expression.Parameter(typeof (ObjectWithId), "o"); - var id = Expression.Property(p, "Id"); - var call = Expression.Call(method.MakeGenericMethod(typeof (long)), expression, id); - return Expression.Lambda>(call, p); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.04.29 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0442_AsQueryableExpressionInQueryModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0442_AsQueryableExpressionInQueryModel + { + [HierarchyRoot] + public class ObjectWithId : Entity + { + [Key, Field] + public long Id { get; private set; } + } + } + + [TestFixture] + public class IssueJira0442_AsQueryableExpressionInQuery : AutoBuildTest + { + private List keys = new List(); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (ObjectWithId)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var o1 = new ObjectWithId(); + var o2 = new ObjectWithId(); + var o3 = new ObjectWithId(); + keys.Add(o1.Id); + keys.Add(o3.Id); + tx.Complete(); + } + } + + [Test] + public void AsQueryableTest() + { + RunTest(keys.AsQueryable()); + } + + [Test] + public void EnumerableQueryTest() + { + RunTest(new EnumerableQuery(keys)); + } + + private void RunTest(IQueryable keysQuery) + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Where(BuildIdFilter(keysQuery.Expression)) + .Select(i => i.Id) + .OrderBy(i => i) + .ToList(); + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result.SequenceEqual(keys)); + tx.Complete(); + } + } + + private Expression> BuildIdFilter(Expression expression) + { + var method = typeof (Queryable).GetMethods().Single(m => m.Name=="Contains" && m.GetParameters().Length==2); + var p = Expression.Parameter(typeof (ObjectWithId), "o"); + var id = Expression.Property(p, "Id"); + var call = Expression.Call(method.MakeGenericMethod(typeof (long)), expression, id); + return Expression.Lambda>(call, p); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault.cs index 1255cc1e28..c20aa6b0dc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.04.30 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefaultModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefaultModel - { - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Items { get; set; } - } - - [HierarchyRoot] - public class MyItem : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public MyEnum MyEnum { get; set; } - - [Field] - public MyEntity Owner { get; set; } - } - - public enum MyEnum - { - None, - Value1 - } - } - - public class IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = new MyEntity(); - tx.Complete(); - } - } - - [Test] - public void FirstOrDefaultTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var queryResult = session.Query.All().Select(e => e.MyEnum).FirstOrDefault(); - Assert.That(queryResult, Is.EqualTo(MyEnum.None)); - - var subqueryResult = session.Query.All().Select(e => e.Items.Select(i => i.MyEnum).FirstOrDefault()).Single(); - Assert.That(subqueryResult, Is.EqualTo(MyEnum.None)); - - var subqueryCountResult = session.Query.All().Count(e => e.Items.Select(i => i.MyEnum).FirstOrDefault()==MyEnum.None); - Assert.That(subqueryCountResult, Is.EqualTo(1)); - - tx.Complete(); - } - } - - [Test] - public void SingleOrDefaultTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var queryResult = session.Query.All().Select(e => e.MyEnum).SingleOrDefault(); - Assert.That(queryResult, Is.EqualTo(MyEnum.None)); - - var subqueryResult = session.Query.All().Select(e => e.Items.Select(i => i.MyEnum).SingleOrDefault()).Single(); - Assert.That(subqueryResult, Is.EqualTo(MyEnum.None)); - - var subqueryCountResult = session.Query.All().Count(e => e.Items.Select(i => i.MyEnum).SingleOrDefault()==MyEnum.None); - Assert.That(subqueryCountResult, Is.EqualTo(1)); - - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.04.30 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefaultModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefaultModel + { + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Items { get; set; } + } + + [HierarchyRoot] + public class MyItem : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public MyEnum MyEnum { get; set; } + + [Field] + public MyEntity Owner { get; set; } + } + + public enum MyEnum + { + None, + Value1 + } + } + + public class IssueJira0443_FirstOrDefaultInSubqueryUsesWrongDefault : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = new MyEntity(); + tx.Complete(); + } + } + + [Test] + public void FirstOrDefaultTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var queryResult = session.Query.All().Select(e => e.MyEnum).FirstOrDefault(); + Assert.That(queryResult, Is.EqualTo(MyEnum.None)); + + var subqueryResult = session.Query.All().Select(e => e.Items.Select(i => i.MyEnum).FirstOrDefault()).Single(); + Assert.That(subqueryResult, Is.EqualTo(MyEnum.None)); + + var subqueryCountResult = session.Query.All().Count(e => e.Items.Select(i => i.MyEnum).FirstOrDefault()==MyEnum.None); + Assert.That(subqueryCountResult, Is.EqualTo(1)); + + tx.Complete(); + } + } + + [Test] + public void SingleOrDefaultTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var queryResult = session.Query.All().Select(e => e.MyEnum).SingleOrDefault(); + Assert.That(queryResult, Is.EqualTo(MyEnum.None)); + + var subqueryResult = session.Query.All().Select(e => e.Items.Select(i => i.MyEnum).SingleOrDefault()).Single(); + Assert.That(subqueryResult, Is.EqualTo(MyEnum.None)); + + var subqueryCountResult = session.Query.All().Count(e => e.Items.Select(i => i.MyEnum).SingleOrDefault()==MyEnum.None); + Assert.That(subqueryCountResult, Is.EqualTo(1)); + + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0445_QueryForEntityWithEnumKey.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0445_QueryForEntityWithEnumKey.cs index 779d0ce1ff..7e98df378a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0445_QueryForEntityWithEnumKey.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0445_QueryForEntityWithEnumKey.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.05.21 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0445_QueryForEntityWithEnumKeyModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0445_QueryForEntityWithEnumKeyModel - { - public enum EntityKey - { - Zero, - One, - Two - } - - [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] - public class EntityWithEnumKey : Entity - { - [Key, Field] - public EntityKey Id { get; private set; } - - public string Value { get; set; } - - public EntityWithEnumKey(Session session, EntityKey id) - : base(session, id) - { - } - } - } - - [TestFixture] - public class IssueJira0445_QueryForEntityWithEnumKey : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithEnumKey)); - return configuration; - } - - [Test] - public void MainTest() - { - Key entityKey; - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - // Create - entityKey = new EntityWithEnumKey(session, EntityKey.One).Key; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - // Fetch - var entity1 = session.Query.Single(entityKey); - - // Query using LINQ - var entity2 = session.Query.All().Single(e => e.Key==entityKey); - - Assert.That(entity1, Is.SameAs(entity2)); - - // Update - entity1.Value = "Hello"; - session.SaveChanges(); - - // Remove - entity1.Remove(); - - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.05.21 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0445_QueryForEntityWithEnumKeyModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0445_QueryForEntityWithEnumKeyModel + { + public enum EntityKey + { + Zero, + One, + Two + } + + [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] + public class EntityWithEnumKey : Entity + { + [Key, Field] + public EntityKey Id { get; private set; } + + public string Value { get; set; } + + public EntityWithEnumKey(Session session, EntityKey id) + : base(session, id) + { + } + } + } + + [TestFixture] + public class IssueJira0445_QueryForEntityWithEnumKey : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithEnumKey)); + return configuration; + } + + [Test] + public void MainTest() + { + Key entityKey; + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + // Create + entityKey = new EntityWithEnumKey(session, EntityKey.One).Key; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + // Fetch + var entity1 = session.Query.Single(entityKey); + + // Query using LINQ + var entity2 = session.Query.All().Single(e => e.Key==entityKey); + + Assert.That(entity1, Is.SameAs(entity2)); + + // Update + entity1.Value = "Hello"; + session.SaveChanges(); + + // Remove + entity1.Remove(); + + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0446_TypeAsOnSubqueryOperand.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0446_TypeAsOnSubqueryOperand.cs index 7757f5e369..24827d11ee 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0446_TypeAsOnSubqueryOperand.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0446_TypeAsOnSubqueryOperand.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.06.25 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0446_TypeAsOnSubqueryOperandModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0446_TypeAsOnSubqueryOperandModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Owner")] - public EntitySet Items { get; set; } - } - - [HierarchyRoot] - public class Item : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Owner Owner { get; set; } - } - - public class Item2 : Item - { - [Field] - public string Info { get; set; } - } - } - - [TestFixture] - public class IssueJira0446_TypeAsOnSubqueryOperand : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var q = session.Query.All().Select(o => (o.Items.First() as Item2).Info).ToList(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.06.25 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0446_TypeAsOnSubqueryOperandModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0446_TypeAsOnSubqueryOperandModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Owner")] + public EntitySet Items { get; set; } + } + + [HierarchyRoot] + public class Item : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Owner Owner { get; set; } + } + + public class Item2 : Item + { + [Field] + public string Info { get; set; } + } + } + + [TestFixture] + public class IssueJira0446_TypeAsOnSubqueryOperand : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var q = session.Query.All().Select(o => (o.Items.First() as Item2).Info).ToList(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_RenameTableInNonDefaultDatabase.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_RenameTableInNonDefaultDatabase.cs index 65e29fa283..cd8543f0bb 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_RenameTableInNonDefaultDatabase.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_RenameTableInNonDefaultDatabase.cs @@ -1,114 +1,114 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.07.16 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Storage.Multimapping; -using Xtensive.Orm.Upgrade; -using V1 = Xtensive.Orm.Tests.Upgrade.IssueJira0449_RenameTableInNonDefaultDatabaseTestModel.Version1; -using V2 = Xtensive.Orm.Tests.Upgrade.IssueJira0449_RenameTableInNonDefaultDatabaseTestModel.Version2; - -namespace Xtensive.Orm.Tests.Upgrade -{ - namespace IssueJira0449_RenameTableInNonDefaultDatabaseTestModel - { - namespace Version1 - { - [HierarchyRoot] - public class MyEntity1 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override string DetectAssemblyVersion() - { - return "1"; - } - } - } - - namespace Version2 - { - [HierarchyRoot] - public class MyEntity2 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value2 { get; set; } - } - - public class Upgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override string DetectAssemblyVersion() - { - return "2"; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - hints.Add(new RenameTypeHint(typeof (V1.MyEntity1).FullName, typeof (MyEntity2))); - hints.Add(new RenameFieldHint(typeof (MyEntity2), "Value", "Value2")); - } - } - } - } - - [TestFixture] - public class IssueJira0449_RenameTableInNonDefaultDatabaseTest : MultidatabaseTest - { - [Test] - public void MainTest() - { - using (var domain = BuildInitialDomain()) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new V1.MyEntity1 {Value = "Hello"}; - tx.Complete(); - } - - using (var domain = BuildUpgradedDomain()) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var e = session.Query.All().Single(); - Assert.That(e.Value2, Is.EqualTo("Hello")); - tx.Complete(); - } - } - - private Domain BuildInitialDomain() - { - return BuildDomain(DomainUpgradeMode.Recreate, typeof (V1.MyEntity1)); - } - - private Domain BuildUpgradedDomain() - { - return BuildDomain(DomainUpgradeMode.PerformSafely, typeof (V2.MyEntity2)); - } - - private Domain BuildDomain(DomainUpgradeMode upgradeMode, Type sampleType) - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(sampleType.Assembly, sampleType.Namespace); - configuration.MappingRules.Map(sampleType.Assembly, sampleType.Namespace).ToDatabase(Database2Name); - return Domain.Build(configuration); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.07.16 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Storage.Multimapping; +using Xtensive.Orm.Upgrade; +using V1 = Xtensive.Orm.Tests.Upgrade.IssueJira0449_RenameTableInNonDefaultDatabaseTestModel.Version1; +using V2 = Xtensive.Orm.Tests.Upgrade.IssueJira0449_RenameTableInNonDefaultDatabaseTestModel.Version2; + +namespace Xtensive.Orm.Tests.Upgrade +{ + namespace IssueJira0449_RenameTableInNonDefaultDatabaseTestModel + { + namespace Version1 + { + [HierarchyRoot] + public class MyEntity1 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override string DetectAssemblyVersion() + { + return "1"; + } + } + } + + namespace Version2 + { + [HierarchyRoot] + public class MyEntity2 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value2 { get; set; } + } + + public class Upgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override string DetectAssemblyVersion() + { + return "2"; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + hints.Add(new RenameTypeHint(typeof (V1.MyEntity1).FullName, typeof (MyEntity2))); + hints.Add(new RenameFieldHint(typeof (MyEntity2), "Value", "Value2")); + } + } + } + } + + [TestFixture] + public class IssueJira0449_RenameTableInNonDefaultDatabaseTest : MultidatabaseTest + { + [Test] + public void MainTest() + { + using (var domain = BuildInitialDomain()) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new V1.MyEntity1 {Value = "Hello"}; + tx.Complete(); + } + + using (var domain = BuildUpgradedDomain()) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var e = session.Query.All().Single(); + Assert.That(e.Value2, Is.EqualTo("Hello")); + tx.Complete(); + } + } + + private Domain BuildInitialDomain() + { + return BuildDomain(DomainUpgradeMode.Recreate, typeof (V1.MyEntity1)); + } + + private Domain BuildUpgradedDomain() + { + return BuildDomain(DomainUpgradeMode.PerformSafely, typeof (V2.MyEntity2)); + } + + private Domain BuildDomain(DomainUpgradeMode upgradeMode, Type sampleType) + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(sampleType.Assembly, sampleType.Namespace); + configuration.MappingRules.Map(sampleType.Assembly, sampleType.Namespace).ToDatabase(Database2Name); + return Domain.Build(configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_TimeSpanMinMaxValue.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_TimeSpanMinMaxValue.cs index 3c1a1c1174..a11e6b4040 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_TimeSpanMinMaxValue.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0449_TimeSpanMinMaxValue.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.07.02 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0449_TimeSpanMinMaxValueModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0449_TimeSpanMinMaxValueModel - { - [HierarchyRoot] - public class EntityWithTimeSpan : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public TimeSpan Value { get; set; } - } - } - - [TestFixture] - public class IssueJira0449_TimeSpanMinMaxValue : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithTimeSpan)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var created = new EntityWithTimeSpan {Value = TimeSpan.MinValue}; - var fetched = session.Query.All().Single(e => e.Value==TimeSpan.MinValue); - Assert.That(fetched, Is.EqualTo(created)); - created = new EntityWithTimeSpan {Value = TimeSpan.MaxValue}; - fetched = session.Query.All().Single(e => e.Value==TimeSpan.MaxValue); - Assert.That(fetched, Is.EqualTo(created)); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.07.02 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0449_TimeSpanMinMaxValueModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0449_TimeSpanMinMaxValueModel + { + [HierarchyRoot] + public class EntityWithTimeSpan : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public TimeSpan Value { get; set; } + } + } + + [TestFixture] + public class IssueJira0449_TimeSpanMinMaxValue : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithTimeSpan)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var created = new EntityWithTimeSpan {Value = TimeSpan.MinValue}; + var fetched = session.Query.All().Single(e => e.Value==TimeSpan.MinValue); + Assert.That(fetched, Is.EqualTo(created)); + created = new EntityWithTimeSpan {Value = TimeSpan.MaxValue}; + fetched = session.Query.All().Single(e => e.Value==TimeSpan.MaxValue); + Assert.That(fetched, Is.EqualTo(created)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0450_SingleOrDefaultInvalidResult.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0450_SingleOrDefaultInvalidResult.cs index c37ee1327b..1239d2c80d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0450_SingleOrDefaultInvalidResult.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0450_SingleOrDefaultInvalidResult.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.07.16 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0450_SingleOrDefaultInvalidResultModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0450_SingleOrDefaultInvalidResultModel - { - [HierarchyRoot] - public class Entity1 : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - public class Entity1Child : Entity1 - { - } - - [HierarchyRoot] - public class Entity2 : Entity - { - [Key, Field] - public long Id { get; private set; } - } - } - - [TestFixture] - public class IssueJira0450_SingleOrDefaultInvalidResult : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - long id; - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - id = new Entity1().Id; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity2 = session.Query.SingleOrDefault(id); - Assert.That(entity2, Is.Null); - var entity1 = session.Query.SingleOrDefault(id); - Assert.That(entity1, Is.Not.Null); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.07.16 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0450_SingleOrDefaultInvalidResultModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0450_SingleOrDefaultInvalidResultModel + { + [HierarchyRoot] + public class Entity1 : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + public class Entity1Child : Entity1 + { + } + + [HierarchyRoot] + public class Entity2 : Entity + { + [Key, Field] + public long Id { get; private set; } + } + } + + [TestFixture] + public class IssueJira0450_SingleOrDefaultInvalidResult : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + long id; + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + id = new Entity1().Id; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity2 = session.Query.SingleOrDefault(id); + Assert.That(entity2, Is.Null); + var entity1 = session.Query.SingleOrDefault(id); + Assert.That(entity1, Is.Not.Null); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0451_ConnectionInitializationSql.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0451_ConnectionInitializationSql.cs index 6a013d530f..437e03f5ee 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0451_ConnectionInitializationSql.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0451_ConnectionInitializationSql.cs @@ -1,76 +1,76 @@ -using System.Data.SqlClient; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0451_ConnectionInitializationSqlModel; -using Xtensive.Orm.Tests.Storage.Multimapping; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0451_ConnectionInitializationSqlModel - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value { get; set; } - } - } - - [TestFixture] - public class IssueJira0451_ConnectionInitializationSql - { - [Test] - public void MainTest() - { - Require.ProviderIs(StorageProvider.SqlServer, "uses native SQL"); - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - - const string message = "Hello custom initialized world!"; - const string db1 = MultidatabaseTest.Database1Name; - const string db2 = MultidatabaseTest.Database2Name; - - var configuration = BuildConfiguration(db1, DomainUpgradeMode.Recreate); - configuration.ConnectionInitializationSql = string.Format("use [{0}]", db2); - - long entityId; - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = new TestEntity {Value = message}; - entityId = entity.Id; - tx.Complete(); - } - - configuration = BuildConfiguration(db2, DomainUpgradeMode.Validate); - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = session.Query.Single(entityId); - Assert.That(entity.Value, Is.EqualTo(message)); - tx.Complete(); - } - } - - private static DomainConfiguration BuildConfiguration(string database, DomainUpgradeMode upgradeMode) - { - var configuration = DomainConfigurationFactory.CreateForConnectionStringTest(); - configuration.ConnectionInfo = OverrideDatabase(configuration.ConnectionInfo, database); - configuration.Types.Register(typeof (TestEntity)); - configuration.UpgradeMode = upgradeMode; - return configuration; - } - - private static ConnectionInfo OverrideDatabase(ConnectionInfo connectionInfo, string database) - { - var builder = new SqlConnectionStringBuilder(connectionInfo.ConnectionString) { - InitialCatalog = database - }; - return new ConnectionInfo(WellKnown.Provider.SqlServer, builder.ToString()); - } - } +using System.Data.SqlClient; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0451_ConnectionInitializationSqlModel; +using Xtensive.Orm.Tests.Storage.Multimapping; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0451_ConnectionInitializationSqlModel + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value { get; set; } + } + } + + [TestFixture] + public class IssueJira0451_ConnectionInitializationSql + { + [Test] + public void MainTest() + { + Require.ProviderIs(StorageProvider.SqlServer, "uses native SQL"); + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + + const string message = "Hello custom initialized world!"; + const string db1 = MultidatabaseTest.Database1Name; + const string db2 = MultidatabaseTest.Database2Name; + + var configuration = BuildConfiguration(db1, DomainUpgradeMode.Recreate); + configuration.ConnectionInitializationSql = string.Format("use [{0}]", db2); + + long entityId; + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = new TestEntity {Value = message}; + entityId = entity.Id; + tx.Complete(); + } + + configuration = BuildConfiguration(db2, DomainUpgradeMode.Validate); + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = session.Query.Single(entityId); + Assert.That(entity.Value, Is.EqualTo(message)); + tx.Complete(); + } + } + + private static DomainConfiguration BuildConfiguration(string database, DomainUpgradeMode upgradeMode) + { + var configuration = DomainConfigurationFactory.CreateForConnectionStringTest(); + configuration.ConnectionInfo = OverrideDatabase(configuration.ConnectionInfo, database); + configuration.Types.Register(typeof (TestEntity)); + configuration.UpgradeMode = upgradeMode; + return configuration; + } + + private static ConnectionInfo OverrideDatabase(ConnectionInfo connectionInfo, string database) + { + var builder = new SqlConnectionStringBuilder(connectionInfo.ConnectionString) { + InitialCatalog = database + }; + return new ConnectionInfo(WellKnown.Provider.SqlServer, builder.ToString()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0459_SelfReferencingEntitiesRemove.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0459_SelfReferencingEntitiesRemove.cs index 078f5822e3..82b4bd2dc7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0459_SelfReferencingEntitiesRemove.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0459_SelfReferencingEntitiesRemove.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.08.14 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0459_SelfReferencingEntitiesRemoveModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0459_SelfReferencingEntitiesRemoveModel -{ - [HierarchyRoot] - public class Department : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Department SeniorDepartment { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Issues -{ - - public class IssueJira0459_SelfReferencingEntitiesRemove : AutoBuildTest - { - private Key selfReferencedInstanceKey; - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Department).Assembly, typeof(Department).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var deparnment = new Department { Name = "Cool Department" }; - deparnment.SeniorDepartment = deparnment; - selfReferencedInstanceKey = deparnment.Key; - transaction.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - (from a in session.Query.All() where a.Key == selfReferencedInstanceKey select a).First().Remove(); - var deletedEntity = (from a in session.Query.All() - where a.Key == selfReferencedInstanceKey - select a).FirstOrDefault(); - transaction.Complete(); - Assert.AreEqual(deletedEntity, null); - } - } - } -} - +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.14 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0459_SelfReferencingEntitiesRemoveModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0459_SelfReferencingEntitiesRemoveModel +{ + [HierarchyRoot] + public class Department : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Department SeniorDepartment { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Issues +{ + + public class IssueJira0459_SelfReferencingEntitiesRemove : AutoBuildTest + { + private Key selfReferencedInstanceKey; + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Department).Assembly, typeof(Department).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var deparnment = new Department { Name = "Cool Department" }; + deparnment.SeniorDepartment = deparnment; + selfReferencedInstanceKey = deparnment.Key; + transaction.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + (from a in session.Query.All() where a.Key == selfReferencedInstanceKey select a).First().Remove(); + var deletedEntity = (from a in session.Query.All() + where a.Key == selfReferencedInstanceKey + select a).FirstOrDefault(); + transaction.Complete(); + Assert.AreEqual(deletedEntity, null); + } + } + } +} + diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0471_LikeOperatorSupport.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0471_LikeOperatorSupport.cs index c782ef5216..427b8fff1f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0471_LikeOperatorSupport.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0471_LikeOperatorSupport.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.08.12 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0471_LikeOperatorSupportModel; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0471_LikeOperatorSupportModel -{ - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0471_LikeOperatorSupport : AutoBuildTest - { - [Test] - public void SimlpeOneSymbolTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.FirstName.Like("K_le") - select a; - Assert.That(firstQuery.First().FirstName,Is.EqualTo("Kyle")); - } - } - - [Test] - public void SimpleSequenceTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.FirstName.Like("%xey") - select a; - Assert.That(firstQuery.Count(), Is.EqualTo(4)); - } - } - - [Test] - public void SimpleSpecialRegExpSimbolsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.LastName.Like("$%") - select a; - Assert.That(firstQuery.First().LastName, Is.EqualTo("$mith")); - } - } - - [Test] - public void SimpleEscapeSpecialSymbolsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.FirstName.Like("E!%ric", '!') - select a; - Assert.That(firstQuery.First().FirstName, Is.EqualTo("E%ric")); - } - } - - [Test] - public void AllInOneTest() - { - Require.ProviderIsNot(StorageProvider.Firebird);// specified escape character can't be used in firebird - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.LastName.Like("K!%![m%f_", '!') - select a; - Assert.That(firstQuery.First().LastName, Is.EqualTo("K%[maroff")); - } - } - - [Test] - public void AllInOneForFirebirdTest() - { - Require.ProviderIs(StorageProvider.Firebird); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstQuery = from a in session.Query.All() - where a.LastName.Like("K$%[m%f_", '$') - select a; - Assert.That(firstQuery.First().LastName, Is.EqualTo("K%[maroff")); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Customer).Assembly, typeof(Customer).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - new Customer { FirstName = "Alexey", LastName = "Kulakov" }; - new Customer { FirstName = "Ulexey", LastName = "Kerzhakov" }; - new Customer { FirstName = "Klexey", LastName = "Komarov" }; - new Customer { FirstName = "Klexey", LastName = "K%[maroff" }; - new Customer { FirstName = "Martha", LastName = "$mith" }; - new Customer { FirstName = "E%ric", LastName = "Cartman" }; - new Customer { FirstName = "Kyle", LastName = "Broflovski" }; - transaction.Complete(); - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.12 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0471_LikeOperatorSupportModel; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0471_LikeOperatorSupportModel +{ + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0471_LikeOperatorSupport : AutoBuildTest + { + [Test] + public void SimlpeOneSymbolTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.FirstName.Like("K_le") + select a; + Assert.That(firstQuery.First().FirstName,Is.EqualTo("Kyle")); + } + } + + [Test] + public void SimpleSequenceTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.FirstName.Like("%xey") + select a; + Assert.That(firstQuery.Count(), Is.EqualTo(4)); + } + } + + [Test] + public void SimpleSpecialRegExpSimbolsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.LastName.Like("$%") + select a; + Assert.That(firstQuery.First().LastName, Is.EqualTo("$mith")); + } + } + + [Test] + public void SimpleEscapeSpecialSymbolsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.FirstName.Like("E!%ric", '!') + select a; + Assert.That(firstQuery.First().FirstName, Is.EqualTo("E%ric")); + } + } + + [Test] + public void AllInOneTest() + { + Require.ProviderIsNot(StorageProvider.Firebird);// specified escape character can't be used in firebird + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.LastName.Like("K!%![m%f_", '!') + select a; + Assert.That(firstQuery.First().LastName, Is.EqualTo("K%[maroff")); + } + } + + [Test] + public void AllInOneForFirebirdTest() + { + Require.ProviderIs(StorageProvider.Firebird); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstQuery = from a in session.Query.All() + where a.LastName.Like("K$%[m%f_", '$') + select a; + Assert.That(firstQuery.First().LastName, Is.EqualTo("K%[maroff")); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Customer).Assembly, typeof(Customer).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + new Customer { FirstName = "Alexey", LastName = "Kulakov" }; + new Customer { FirstName = "Ulexey", LastName = "Kerzhakov" }; + new Customer { FirstName = "Klexey", LastName = "Komarov" }; + new Customer { FirstName = "Klexey", LastName = "K%[maroff" }; + new Customer { FirstName = "Martha", LastName = "$mith" }; + new Customer { FirstName = "E%ric", LastName = "Cartman" }; + new Customer { FirstName = "Kyle", LastName = "Broflovski" }; + transaction.Complete(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0481_EntitySetCachesInvalidState.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0481_EntitySetCachesInvalidState.cs index def18a853c..882ff5ef77 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0481_EntitySetCachesInvalidState.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0481_EntitySetCachesInvalidState.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.17 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0481_EntitySetCachesInvalidStateModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0481_EntitySetCachesInvalidStateModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity - { - [Key, Field] - public long Id { get; private set; } - } - } - - [TestFixture] - public class IssueJira0481_EntitySetCachesInvalidState : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var owner = new Owner(); - session.SaveChanges(); - using (session.DisableSaveChanges()) { - var item = new Item(); - owner.Items.Add(item); - var dummy = owner.Items.ToList(); - } - session.SaveChanges(); - var items = owner.Items.ToList(); - Assert.That(items.Count, Is.EqualTo(1)); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.17 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0481_EntitySetCachesInvalidStateModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0481_EntitySetCachesInvalidStateModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity + { + [Key, Field] + public long Id { get; private set; } + } + } + + [TestFixture] + public class IssueJira0481_EntitySetCachesInvalidState : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var owner = new Owner(); + session.SaveChanges(); + using (session.DisableSaveChanges()) { + var item = new Item(); + owner.Items.Add(item); + var dummy = owner.Items.ToList(); + } + session.SaveChanges(); + var items = owner.Items.ToList(); + Assert.That(items.Count, Is.EqualTo(1)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0500_OptimizeMultipleAggregatesWithProjections.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0500_OptimizeMultipleAggregatesWithProjections.cs index 12e41e6a96..93dc316040 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0500_OptimizeMultipleAggregatesWithProjections.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0500_OptimizeMultipleAggregatesWithProjections.cs @@ -1,189 +1,189 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.10 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Linq.Rewriters; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Issues.IssueJira0500_OptimizeMultipleAggregatesWithProjectionsModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0500_OptimizeMultipleAggregatesWithProjectionsModel - { - [HierarchyRoot] - public class ReferencedEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public decimal Value { get; set; } - } - - [HierarchyRoot] - public class AggregatedEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public int Group { get; set; } - - [Field] - public decimal Value { get; set; } - - [Field] - public ReferencedEntity Ref { get; set; } - } - - [HierarchyRoot] - public class TwoSumEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public int Group { get; set; } - - [Field] - public bool Condition { get; set; } - - [Field] - public decimal Value { get; set; } - } - } - - [TestFixture] - public class IssueJira0500_OptimizeMultipleAggregatesWithProjections : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (AggregatedEntity).Assembly, typeof (AggregatedEntity).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var ref1 = new ReferencedEntity {Value = 2}; - var ref2 = new ReferencedEntity {Value = 3}; - var ref3 = new ReferencedEntity {Value = 4}; - new AggregatedEntity {Value = 0, Ref = ref1}; - new AggregatedEntity {Value = 1, Ref = ref2}; - new AggregatedEntity {Value = 2, Ref = ref3}; - new AggregatedEntity {Value = 3}; - new TwoSumEntity {Condition = true, Value = 1}; - new TwoSumEntity {Condition = true, Value = 2}; - new TwoSumEntity {Condition = true, Value = 3}; - new TwoSumEntity {Condition = false, Value = 2}; - new TwoSumEntity {Condition = false, Value = 3}; - new TwoSumEntity {Condition = false, Value = 4}; - tx.Complete(); - } - } - - [Test] - public void GroupBySimpleTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .GroupBy(e => e.Group) - .Select(g => new { - SumValue = g.Sum(e => e.Value), - SumRefValue = g.Sum(e => e.Ref.Value), - }); - Test(session, query, e => e.SumValue, e => e.SumRefValue); - tx.Complete(); - } - } - - [Test] - public void GroupByWithElementSelectorTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .GroupBy(e => e.Group, e => new {Element = e}) - .Select(g => new { - SumValue = g.Sum(e => e.Element.Value), - SumRefValue = g.Sum(e => e.Element.Ref.Value), - }); - Test(session, query, e => e.SumValue, e => e.SumRefValue); - tx.Complete(); - } - } - - [Test] - public void GroupByWithResultSelectorTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .GroupBy(e => e.Group, (key, elements) => new { - SumValue = elements.Sum(e => e.Value), - SumRefValue = elements.Sum(e => e.Ref.Value), - }); - Test(session, query, e => e.SumValue, e => e.SumRefValue); - tx.Complete(); - } - } - - [Test] - public void GroupByWithElementAndResultSelectorsTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .GroupBy(e => e.Group, e => new {Element = e}, (key, elements) => new { - SumValue = elements.Sum(e => e.Element.Value), - SumRefValue = elements.Sum(e => e.Element.Ref.Value), - }); - Test(session, query, e => e.SumValue, e => e.SumRefValue); - tx.Complete(); - } - } - - [Test] - public void GroupByConditionalTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .GroupBy(e => e.Group) - .Select(item => new { - Sum1 = item.Sum(e => e.Condition ? e.Value : 0), - Sum2 = item.Sum(e => !e.Condition ? e.Value : 0), - }); - Test(session, query, e => e.Sum1, e => e.Sum2); - } - } - - private void Test(Session session, IQueryable query, - Func firstSumSelector, Func secondSumSelector) - { - var queryFormatter = session.Services.Demand(); - var queryString = queryFormatter.ToSqlString(query); - var firstSelectPosition = queryString.IndexOf("select", - StringComparison.InvariantCultureIgnoreCase); - Assert.That(firstSelectPosition, Is.GreaterThanOrEqualTo(0)); - var secondSelectPosition = queryString.IndexOf("select", firstSelectPosition + 1, - StringComparison.InvariantCultureIgnoreCase); - Assert.That(secondSelectPosition, Is.LessThan(0)); - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - var sumValue = firstSumSelector.Invoke(result[0]); - var sumRefValue = secondSumSelector.Invoke(result[0]); - Assert.That(sumValue, Is.EqualTo(6m)); - Assert.That(sumRefValue, Is.EqualTo(9m)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.10 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Linq.Rewriters; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Issues.IssueJira0500_OptimizeMultipleAggregatesWithProjectionsModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0500_OptimizeMultipleAggregatesWithProjectionsModel + { + [HierarchyRoot] + public class ReferencedEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public decimal Value { get; set; } + } + + [HierarchyRoot] + public class AggregatedEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public int Group { get; set; } + + [Field] + public decimal Value { get; set; } + + [Field] + public ReferencedEntity Ref { get; set; } + } + + [HierarchyRoot] + public class TwoSumEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public int Group { get; set; } + + [Field] + public bool Condition { get; set; } + + [Field] + public decimal Value { get; set; } + } + } + + [TestFixture] + public class IssueJira0500_OptimizeMultipleAggregatesWithProjections : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (AggregatedEntity).Assembly, typeof (AggregatedEntity).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var ref1 = new ReferencedEntity {Value = 2}; + var ref2 = new ReferencedEntity {Value = 3}; + var ref3 = new ReferencedEntity {Value = 4}; + new AggregatedEntity {Value = 0, Ref = ref1}; + new AggregatedEntity {Value = 1, Ref = ref2}; + new AggregatedEntity {Value = 2, Ref = ref3}; + new AggregatedEntity {Value = 3}; + new TwoSumEntity {Condition = true, Value = 1}; + new TwoSumEntity {Condition = true, Value = 2}; + new TwoSumEntity {Condition = true, Value = 3}; + new TwoSumEntity {Condition = false, Value = 2}; + new TwoSumEntity {Condition = false, Value = 3}; + new TwoSumEntity {Condition = false, Value = 4}; + tx.Complete(); + } + } + + [Test] + public void GroupBySimpleTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .GroupBy(e => e.Group) + .Select(g => new { + SumValue = g.Sum(e => e.Value), + SumRefValue = g.Sum(e => e.Ref.Value), + }); + Test(session, query, e => e.SumValue, e => e.SumRefValue); + tx.Complete(); + } + } + + [Test] + public void GroupByWithElementSelectorTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .GroupBy(e => e.Group, e => new {Element = e}) + .Select(g => new { + SumValue = g.Sum(e => e.Element.Value), + SumRefValue = g.Sum(e => e.Element.Ref.Value), + }); + Test(session, query, e => e.SumValue, e => e.SumRefValue); + tx.Complete(); + } + } + + [Test] + public void GroupByWithResultSelectorTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .GroupBy(e => e.Group, (key, elements) => new { + SumValue = elements.Sum(e => e.Value), + SumRefValue = elements.Sum(e => e.Ref.Value), + }); + Test(session, query, e => e.SumValue, e => e.SumRefValue); + tx.Complete(); + } + } + + [Test] + public void GroupByWithElementAndResultSelectorsTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .GroupBy(e => e.Group, e => new {Element = e}, (key, elements) => new { + SumValue = elements.Sum(e => e.Element.Value), + SumRefValue = elements.Sum(e => e.Element.Ref.Value), + }); + Test(session, query, e => e.SumValue, e => e.SumRefValue); + tx.Complete(); + } + } + + [Test] + public void GroupByConditionalTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .GroupBy(e => e.Group) + .Select(item => new { + Sum1 = item.Sum(e => e.Condition ? e.Value : 0), + Sum2 = item.Sum(e => !e.Condition ? e.Value : 0), + }); + Test(session, query, e => e.Sum1, e => e.Sum2); + } + } + + private void Test(Session session, IQueryable query, + Func firstSumSelector, Func secondSumSelector) + { + var queryFormatter = session.Services.Demand(); + var queryString = queryFormatter.ToSqlString(query); + var firstSelectPosition = queryString.IndexOf("select", + StringComparison.InvariantCultureIgnoreCase); + Assert.That(firstSelectPosition, Is.GreaterThanOrEqualTo(0)); + var secondSelectPosition = queryString.IndexOf("select", firstSelectPosition + 1, + StringComparison.InvariantCultureIgnoreCase); + Assert.That(secondSelectPosition, Is.LessThan(0)); + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + var sumValue = firstSumSelector.Invoke(result[0]); + var sumRefValue = secondSumSelector.Invoke(result[0]); + Assert.That(sumValue, Is.EqualTo(6m)); + Assert.That(sumRefValue, Is.EqualTo(9m)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0516_PartialIndexConstruction.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0516_PartialIndexConstruction.cs index 58bea2ee52..50d9843aab 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0516_PartialIndexConstruction.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0516_PartialIndexConstruction.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.02.13 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0516_PartialIndexConstructionModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0516_PartialIndexConstructionModel - { - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - [Index("Number", Unique = true, Filter = "NumberIndexFilter")] - public abstract class Basic : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Number { get; set; } - - [Field] - public bool NumberIsIndexed { get; set; } - - private static Expression> NumberIndexFilter() - { - return entity => entity.NumberIsIndexed; - } - } - - public abstract class Derived : Basic - { - } - } - - [TestFixture] - internal class IssueJira0516_PartialIndexConstruction - { - [Test] - public void MainTest() - { - RunTest(typeof (Derived)); - } - - private void RunTest(Type type) - { - BuildDomain(type, DomainUpgradeMode.Recreate); - BuildDomain(type, DomainUpgradeMode.Validate); - } - - private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(type); - configuration.UpgradeMode = upgradeMode; - Domain.Build(configuration).Dispose(); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.02.13 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0516_PartialIndexConstructionModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0516_PartialIndexConstructionModel + { + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + [Index("Number", Unique = true, Filter = "NumberIndexFilter")] + public abstract class Basic : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Number { get; set; } + + [Field] + public bool NumberIsIndexed { get; set; } + + private static Expression> NumberIndexFilter() + { + return entity => entity.NumberIsIndexed; + } + } + + public abstract class Derived : Basic + { + } + } + + [TestFixture] + internal class IssueJira0516_PartialIndexConstruction + { + [Test] + public void MainTest() + { + RunTest(typeof (Derived)); + } + + private void RunTest(Type type) + { + BuildDomain(type, DomainUpgradeMode.Recreate); + BuildDomain(type, DomainUpgradeMode.Validate); + } + + private void BuildDomain(Type type, DomainUpgradeMode upgradeMode) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(type); + configuration.UpgradeMode = upgradeMode; + Domain.Build(configuration).Dispose(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0519_StaleKeyInEntitySet.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0519_StaleKeyInEntitySet.cs index 9a696905a3..ffb45ad440 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0519_StaleKeyInEntitySet.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0519_StaleKeyInEntitySet.cs @@ -1,217 +1,217 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.02.09 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0519_StaleKeyInEntitySetModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0519_StaleKeyInEntitySetModel - { - [HierarchyRoot] - public class Order : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - [Association(PairTo = "Order", - OnOwnerRemove = OnRemoveAction.Cascade, - OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class OrderItem : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Order Order { get; set; } - } - } - - [TestFixture] - public class IssueJira0519_StaleKeyInEntitySet : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Order).Assembly, typeof (Order).Namespace); - var defaultConfiguration = configuration.Sessions.Default; - defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - VerifyOrder(order, 3); - - var items = order.Items.ToList(); - item1.Remove(); - session.SaveChanges(); - VerifyOrder(order, 2); - } - } - - [Test] - public void ChangesInDifferentSessionsTest() - { - int id; - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - id = item1.Id; - VerifyOrder(order, 3); - } - using (var session = Domain.OpenSession()) { - var item1 = session.Query.All().First(el => el.Id==id); - var order = item1.Order; - item1.Remove(); - session.SaveChanges(); - VerifyOrder(order, 2); - } - } - - [Test] - public void AddDoubleRemoveAndAddNewItemsInDifferentSavesTest() - { - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - VerifyOrder(order, 3); - - var items = order.Items.ToList(); - item1.Remove(); - item2.Remove(); - session.SaveChanges(); - VerifyOrder(order, 1); - items = order.Items.ToList(); - - var item4 = new OrderItem(); - var item5 = new OrderItem(); - order.Items.Add(item4); - order.Items.Add(item5); - session.SaveChanges(); - VerifyOrder(order, 3); - } - } - - [Test] - public void AddDoubleRemoveAndAddNewItemsInSingleSaveTest() - { - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - VerifyOrder(order, 3); - - var items = order.Items.ToList(); - item1.Remove(); - item2.Remove(); - var item4 = new OrderItem(); - var item5 = new OrderItem(); - order.Items.Add(item4); - order.Items.Add(item5); - session.SaveChanges(); - VerifyOrder(order, 3); - } - } - - [Test] - public void AddRemoveAndAddNewItemsTest() - { - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - VerifyOrder(order, 3); - - var items = order.Items.ToList(); - item1.Remove(); - session.SaveChanges(); - VerifyOrder(order, 2); - items = order.Items.ToList(); - - var item4 = new OrderItem(); - var item5 = new OrderItem(); - order.Items.Add(item4); - order.Items.Add(item5); - session.SaveChanges(); - VerifyOrder(order, 4); - } - } - - [Test] - public void AddMoveToAnotherOrderAndAddNewItems() - { - using (var session = Domain.OpenSession()) { - var item1 = new OrderItem(); - var item2 = new OrderItem(); - var item3 = new OrderItem(); - var order = new Order(); - order.Items.Add(item1); - order.Items.Add(item2); - order.Items.Add(item3); - session.SaveChanges(); - VerifyOrder(order, 3); - - var items = order.Items.ToList(); - var order1 = new Order(); - order1.Items.Add(item1); - var item4 = new OrderItem(); - var item5 = new OrderItem(); - order.Items.Add(item4); - order.Items.Add(item5); - session.SaveChanges(); - VerifyOrder(order, 4); - VerifyOrder(order1, 1); - } - } - - private void VerifyOrder(Order order, long expectedCount) - { - Assert.That(order.Items.Count, Is.EqualTo(expectedCount)); - foreach (var item in order.Items) - Assert.That(item, Is.Not.Null); - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.02.09 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0519_StaleKeyInEntitySetModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0519_StaleKeyInEntitySetModel + { + [HierarchyRoot] + public class Order : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + [Association(PairTo = "Order", + OnOwnerRemove = OnRemoveAction.Cascade, + OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class OrderItem : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Order Order { get; set; } + } + } + + [TestFixture] + public class IssueJira0519_StaleKeyInEntitySet : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Order).Assembly, typeof (Order).Namespace); + var defaultConfiguration = configuration.Sessions.Default; + defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + VerifyOrder(order, 3); + + var items = order.Items.ToList(); + item1.Remove(); + session.SaveChanges(); + VerifyOrder(order, 2); + } + } + + [Test] + public void ChangesInDifferentSessionsTest() + { + int id; + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + id = item1.Id; + VerifyOrder(order, 3); + } + using (var session = Domain.OpenSession()) { + var item1 = session.Query.All().First(el => el.Id==id); + var order = item1.Order; + item1.Remove(); + session.SaveChanges(); + VerifyOrder(order, 2); + } + } + + [Test] + public void AddDoubleRemoveAndAddNewItemsInDifferentSavesTest() + { + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + VerifyOrder(order, 3); + + var items = order.Items.ToList(); + item1.Remove(); + item2.Remove(); + session.SaveChanges(); + VerifyOrder(order, 1); + items = order.Items.ToList(); + + var item4 = new OrderItem(); + var item5 = new OrderItem(); + order.Items.Add(item4); + order.Items.Add(item5); + session.SaveChanges(); + VerifyOrder(order, 3); + } + } + + [Test] + public void AddDoubleRemoveAndAddNewItemsInSingleSaveTest() + { + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + VerifyOrder(order, 3); + + var items = order.Items.ToList(); + item1.Remove(); + item2.Remove(); + var item4 = new OrderItem(); + var item5 = new OrderItem(); + order.Items.Add(item4); + order.Items.Add(item5); + session.SaveChanges(); + VerifyOrder(order, 3); + } + } + + [Test] + public void AddRemoveAndAddNewItemsTest() + { + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + VerifyOrder(order, 3); + + var items = order.Items.ToList(); + item1.Remove(); + session.SaveChanges(); + VerifyOrder(order, 2); + items = order.Items.ToList(); + + var item4 = new OrderItem(); + var item5 = new OrderItem(); + order.Items.Add(item4); + order.Items.Add(item5); + session.SaveChanges(); + VerifyOrder(order, 4); + } + } + + [Test] + public void AddMoveToAnotherOrderAndAddNewItems() + { + using (var session = Domain.OpenSession()) { + var item1 = new OrderItem(); + var item2 = new OrderItem(); + var item3 = new OrderItem(); + var order = new Order(); + order.Items.Add(item1); + order.Items.Add(item2); + order.Items.Add(item3); + session.SaveChanges(); + VerifyOrder(order, 3); + + var items = order.Items.ToList(); + var order1 = new Order(); + order1.Items.Add(item1); + var item4 = new OrderItem(); + var item5 = new OrderItem(); + order.Items.Add(item4); + order.Items.Add(item5); + session.SaveChanges(); + VerifyOrder(order, 4); + VerifyOrder(order1, 1); + } + } + + private void VerifyOrder(Order order, long expectedCount) + { + Assert.That(order.Items.Count, Is.EqualTo(expectedCount)); + foreach (var item in order.Items) + Assert.That(item, Is.Not.Null); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0528_LongEnumBitOperations.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0528_LongEnumBitOperations.cs index 5d969ebf69..ad6a97259d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0528_LongEnumBitOperations.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0528_LongEnumBitOperations.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.04.11 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Issues.IssueJira0528_LongEnumBitOperationsModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0528_LongEnumBitOperationsModel - { - [Flags] - public enum LongEnum : long - { - None = 0, - Flag0 = 1L << 32, - Flag1 = 1L << 33, - Flag2 = 1L << 34, - } - - [HierarchyRoot] - public class EnumContainer : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public LongEnum Value { get; set; } - } - } - - [TestFixture] - public class IssueJira0528_LongEnumBitOperations : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EnumContainer)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new EnumContainer {Value = LongEnum.Flag0 | LongEnum.Flag1}; - new EnumContainer {Value = LongEnum.Flag1 | LongEnum.Flag2}; - new EnumContainer {Value = LongEnum.Flag2 | LongEnum.Flag0}; - tx.Complete(); - } - } - - [Test] - public void BitAndTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Count(item => (item.Value & LongEnum.Flag1)==LongEnum.Flag1); - Assert.That(result, Is.EqualTo(2)); - result = session.Query.All() - .Count(item => (item.Value & LongEnum.Flag1)==0); - Assert.That(result, Is.EqualTo(1)); - tx.Complete(); - } - } - - [Test] - public void BitOrTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Count(item => (item.Value | LongEnum.Flag1)==(LongEnum.Flag0 | LongEnum.Flag1)); - Assert.That(result, Is.EqualTo(1)); - tx.Complete(); - } - } - - [Test] - public void BitNotTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Count(item => ~item.Value==~(LongEnum.Flag1 | LongEnum.Flag2)); - Assert.That(result, Is.EqualTo(1)); - tx.Complete(); - } - } - - [Test] - public void BitXorTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Count(item => (item.Value ^ LongEnum.Flag0)==(LongEnum.Flag0 | LongEnum.Flag1 | LongEnum.Flag2)); - Assert.That(result, Is.EqualTo(1)); - tx.Complete(); - } - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.04.11 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueJira0528_LongEnumBitOperationsModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0528_LongEnumBitOperationsModel + { + [Flags] + public enum LongEnum : long + { + None = 0, + Flag0 = 1L << 32, + Flag1 = 1L << 33, + Flag2 = 1L << 34, + } + + [HierarchyRoot] + public class EnumContainer : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public LongEnum Value { get; set; } + } + } + + [TestFixture] + public class IssueJira0528_LongEnumBitOperations : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EnumContainer)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new EnumContainer {Value = LongEnum.Flag0 | LongEnum.Flag1}; + new EnumContainer {Value = LongEnum.Flag1 | LongEnum.Flag2}; + new EnumContainer {Value = LongEnum.Flag2 | LongEnum.Flag0}; + tx.Complete(); + } + } + + [Test] + public void BitAndTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Count(item => (item.Value & LongEnum.Flag1)==LongEnum.Flag1); + Assert.That(result, Is.EqualTo(2)); + result = session.Query.All() + .Count(item => (item.Value & LongEnum.Flag1)==0); + Assert.That(result, Is.EqualTo(1)); + tx.Complete(); + } + } + + [Test] + public void BitOrTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Count(item => (item.Value | LongEnum.Flag1)==(LongEnum.Flag0 | LongEnum.Flag1)); + Assert.That(result, Is.EqualTo(1)); + tx.Complete(); + } + } + + [Test] + public void BitNotTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Count(item => ~item.Value==~(LongEnum.Flag1 | LongEnum.Flag2)); + Assert.That(result, Is.EqualTo(1)); + tx.Complete(); + } + } + + [Test] + public void BitXorTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Count(item => (item.Value ^ LongEnum.Flag0)==(LongEnum.Flag0 | LongEnum.Flag1 | LongEnum.Flag2)); + Assert.That(result, Is.EqualTo(1)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0529_MultipleInOperations.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0529_MultipleInOperations.cs index 64e811d638..6736f1d693 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0529_MultipleInOperations.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0529_MultipleInOperations.cs @@ -1,306 +1,306 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.05.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Issues.IssueJira0529_MultipleInOperationsTestModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0529_MultipleInOperationsTestModel - { - [HierarchyRoot] - public class TechnicalProcess : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Equipment Equipment { get; set; } - - [Field] - public EquipmentParameter RunIdHiParameter { get; set; } - - [Field] - public EquipmentParameter RunIdLowParameter { get; set; } - - [Field] - public EquipmentParameter StatusParameter { get; set; } - } - - [HierarchyRoot] - public class Equipment : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class EquipmentParameter : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Url { get; set; } - } - - [HierarchyRoot] - public class Entity1 : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Entity2 Link { get; set; } - } - - [HierarchyRoot] - public class Entity2 : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - public string Name { get; set; } - } - } - - [TestFixture] - public class IssueJira0529_MultipleInOperations : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Equipment).Assembly, typeof (Equipment).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var equipment1 = new Equipment(); - var equipment2 = new Equipment(); - var equipment3 = new Equipment(); - - var parameter1Hi = new EquipmentParameter {Url = "1Hi"}; - var parameter1Low = new EquipmentParameter {Url = "1Low"}; - var parameter1Status = new EquipmentParameter {Url = "1Status"}; - var parameter2Hi = new EquipmentParameter {Url = "2Hi"}; - var parameter2Low = new EquipmentParameter {Url = "2Low"}; - var parameter2Status = new EquipmentParameter {Url = "2Status"}; - var parameter3Hi = new EquipmentParameter {Url = "3Hi"}; - var parameter3Low = new EquipmentParameter {Url = "3Low"}; - var parameter3Status = new EquipmentParameter {Url = "3Status"}; - - var technicalProcess1 = new TechnicalProcess { - Equipment = equipment1, - RunIdHiParameter = parameter1Hi, - RunIdLowParameter = parameter1Low, - StatusParameter = parameter1Status, - }; - var technicalProcess2 = new TechnicalProcess { - Equipment = equipment2, - RunIdHiParameter = parameter2Hi, - RunIdLowParameter = parameter2Low, - StatusParameter = parameter2Status, - }; - var technicalProcess3 = new TechnicalProcess { - Equipment = equipment3, - RunIdHiParameter = parameter3Hi, - RunIdLowParameter = parameter3Low, - StatusParameter = parameter3Status, - }; - - var equipments = new[] {equipment1, equipment2}; - - var technicalProcesses = Query.All() - .Where(tp => tp.Equipment.In(equipments)); - - - var urls = technicalProcesses.Select(p => p.RunIdHiParameter.Url) - .Concat(technicalProcesses.Select(p => p.RunIdLowParameter.Url)) - .Concat(technicalProcesses.Select(p => p.StatusParameter.Url)) - .ToArray(); - - Assert.That(urls.Length, Is.EqualTo(6)); - Assert.That(urls.Contains("1Hi")); - Assert.That(urls.Contains("1Low")); - Assert.That(urls.Contains("1Status")); - Assert.That(urls.Contains("2Hi")); - Assert.That(urls.Contains("2Low")); - Assert.That(urls.Contains("2Status")); - } - } - - [Test] - public void NonPersistentTypesExceptTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; - var query1 = session.Query.All().Where(a => a.Id.In(someIds)); - var query2 = session.Query.All().Select(a => a.Link); - var query3 = query1.Except(query2).ToList(); - } - } - - [Test] - public void NonPersistentTypesIntersectTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; - var query1 = session.Query.All().Where(a => a.Id.In(someIds)); - var query2 = session.Query.All().Select(a => a.Link); - var query3 = query1.Intersect(query2).ToList(); - } - } - - [Test] - public void NonPersistentTypesUnionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; - var query1 = session.Query.All().Where(a => a.Id.In(someIds)); - var query2 = session.Query.All().Select(a => a.Link); - var query3 = query1.Union(query2).ToList(); - } - } - - [Test] - public void NonPersistentTypesConcatTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; - var query1 = session.Query.All().Where(a => a.Id.In(someIds)); - var query2 = session.Query.All().Select(a => a.Link); - var query3 = query1.Concat(query2).ToList(); - } - } - - [Test] - public void OnlyInOperationTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - { - var equipment1 = new Equipment(); - var equipment2 = new Equipment(); - var equipment3 = new Equipment(); - - var parameter1Hi = new EquipmentParameter { Url = "1Hi" }; - var parameter1Low = new EquipmentParameter { Url = "1Low" }; - var parameter1Status = new EquipmentParameter { Url = "1Status" }; - var parameter2Hi = new EquipmentParameter { Url = "2Hi" }; - var parameter2Low = new EquipmentParameter { Url = "2Low" }; - var parameter2Status = new EquipmentParameter { Url = "2Status" }; - var parameter3Hi = new EquipmentParameter { Url = "3Hi" }; - var parameter3Low = new EquipmentParameter { Url = "3Low" }; - var parameter3Status = new EquipmentParameter { Url = "3Status" }; - - var technicalProcess1 = new TechnicalProcess - { - Equipment = equipment1, - RunIdHiParameter = parameter1Hi, - RunIdLowParameter = parameter1Low, - StatusParameter = parameter1Status, - }; - var technicalProcess2 = new TechnicalProcess - { - Equipment = equipment2, - RunIdHiParameter = parameter2Hi, - RunIdLowParameter = parameter2Low, - StatusParameter = parameter2Status, - }; - var technicalProcess3 = new TechnicalProcess - { - Equipment = equipment3, - RunIdHiParameter = parameter3Hi, - RunIdLowParameter = parameter3Low, - StatusParameter = parameter3Status, - }; - - var equipments = new[] { equipment1, equipment2 }; - - var technicalProcesses = Query.All() - .Where(tp => tp.Equipment.In(equipments)).ToArray(); - - Assert.AreEqual(2, technicalProcesses.Length); - } - } - - [Test] - public void OnlyJoinOperationTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - { - var equipment1 = new Equipment(); - var equipment2 = new Equipment(); - var equipment3 = new Equipment(); - - var parameter1Hi = new EquipmentParameter { Url = "1Hi" }; - var parameter1Low = new EquipmentParameter { Url = "1Low" }; - var parameter1Status = new EquipmentParameter { Url = "1Status" }; - var parameter2Hi = new EquipmentParameter { Url = "2Hi" }; - var parameter2Low = new EquipmentParameter { Url = "2Low" }; - var parameter2Status = new EquipmentParameter { Url = "2Status" }; - var parameter3Hi = new EquipmentParameter { Url = "3Hi" }; - var parameter3Low = new EquipmentParameter { Url = "3Low" }; - var parameter3Status = new EquipmentParameter { Url = "3Status" }; - - var technicalProcess1 = new TechnicalProcess - { - Equipment = equipment1, - RunIdHiParameter = parameter1Hi, - RunIdLowParameter = parameter1Low, - StatusParameter = parameter1Status, - }; - var technicalProcess2 = new TechnicalProcess - { - Equipment = equipment2, - RunIdHiParameter = parameter2Hi, - RunIdLowParameter = parameter2Low, - StatusParameter = parameter2Status, - }; - var technicalProcess3 = new TechnicalProcess - { - Equipment = equipment3, - RunIdHiParameter = parameter3Hi, - RunIdLowParameter = parameter3Low, - StatusParameter = parameter3Status, - }; - - var urls = session.Query.All() - .Select(p => p.RunIdHiParameter.Url) - .Concat(session.Query.All().Select(p => p.RunIdLowParameter.Url)) - .Concat(session.Query.All().Select(p => p.StatusParameter.Url)) - .ToArray(); - - Assert.AreEqual(9, urls.Length); - } - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.05.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueJira0529_MultipleInOperationsTestModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0529_MultipleInOperationsTestModel + { + [HierarchyRoot] + public class TechnicalProcess : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Equipment Equipment { get; set; } + + [Field] + public EquipmentParameter RunIdHiParameter { get; set; } + + [Field] + public EquipmentParameter RunIdLowParameter { get; set; } + + [Field] + public EquipmentParameter StatusParameter { get; set; } + } + + [HierarchyRoot] + public class Equipment : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class EquipmentParameter : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Url { get; set; } + } + + [HierarchyRoot] + public class Entity1 : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Entity2 Link { get; set; } + } + + [HierarchyRoot] + public class Entity2 : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + public string Name { get; set; } + } + } + + [TestFixture] + public class IssueJira0529_MultipleInOperations : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Equipment).Assembly, typeof (Equipment).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var equipment1 = new Equipment(); + var equipment2 = new Equipment(); + var equipment3 = new Equipment(); + + var parameter1Hi = new EquipmentParameter {Url = "1Hi"}; + var parameter1Low = new EquipmentParameter {Url = "1Low"}; + var parameter1Status = new EquipmentParameter {Url = "1Status"}; + var parameter2Hi = new EquipmentParameter {Url = "2Hi"}; + var parameter2Low = new EquipmentParameter {Url = "2Low"}; + var parameter2Status = new EquipmentParameter {Url = "2Status"}; + var parameter3Hi = new EquipmentParameter {Url = "3Hi"}; + var parameter3Low = new EquipmentParameter {Url = "3Low"}; + var parameter3Status = new EquipmentParameter {Url = "3Status"}; + + var technicalProcess1 = new TechnicalProcess { + Equipment = equipment1, + RunIdHiParameter = parameter1Hi, + RunIdLowParameter = parameter1Low, + StatusParameter = parameter1Status, + }; + var technicalProcess2 = new TechnicalProcess { + Equipment = equipment2, + RunIdHiParameter = parameter2Hi, + RunIdLowParameter = parameter2Low, + StatusParameter = parameter2Status, + }; + var technicalProcess3 = new TechnicalProcess { + Equipment = equipment3, + RunIdHiParameter = parameter3Hi, + RunIdLowParameter = parameter3Low, + StatusParameter = parameter3Status, + }; + + var equipments = new[] {equipment1, equipment2}; + + var technicalProcesses = Query.All() + .Where(tp => tp.Equipment.In(equipments)); + + + var urls = technicalProcesses.Select(p => p.RunIdHiParameter.Url) + .Concat(technicalProcesses.Select(p => p.RunIdLowParameter.Url)) + .Concat(technicalProcesses.Select(p => p.StatusParameter.Url)) + .ToArray(); + + Assert.That(urls.Length, Is.EqualTo(6)); + Assert.That(urls.Contains("1Hi")); + Assert.That(urls.Contains("1Low")); + Assert.That(urls.Contains("1Status")); + Assert.That(urls.Contains("2Hi")); + Assert.That(urls.Contains("2Low")); + Assert.That(urls.Contains("2Status")); + } + } + + [Test] + public void NonPersistentTypesExceptTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; + var query1 = session.Query.All().Where(a => a.Id.In(someIds)); + var query2 = session.Query.All().Select(a => a.Link); + var query3 = query1.Except(query2).ToList(); + } + } + + [Test] + public void NonPersistentTypesIntersectTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; + var query1 = session.Query.All().Where(a => a.Id.In(someIds)); + var query2 = session.Query.All().Select(a => a.Link); + var query3 = query1.Intersect(query2).ToList(); + } + } + + [Test] + public void NonPersistentTypesUnionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; + var query1 = session.Query.All().Where(a => a.Id.In(someIds)); + var query2 = session.Query.All().Select(a => a.Link); + var query3 = query1.Union(query2).ToList(); + } + } + + [Test] + public void NonPersistentTypesConcatTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var someIds = new[] { Guid.NewGuid(), Guid.NewGuid() }; + var query1 = session.Query.All().Where(a => a.Id.In(someIds)); + var query2 = session.Query.All().Select(a => a.Link); + var query3 = query1.Concat(query2).ToList(); + } + } + + [Test] + public void OnlyInOperationTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + { + var equipment1 = new Equipment(); + var equipment2 = new Equipment(); + var equipment3 = new Equipment(); + + var parameter1Hi = new EquipmentParameter { Url = "1Hi" }; + var parameter1Low = new EquipmentParameter { Url = "1Low" }; + var parameter1Status = new EquipmentParameter { Url = "1Status" }; + var parameter2Hi = new EquipmentParameter { Url = "2Hi" }; + var parameter2Low = new EquipmentParameter { Url = "2Low" }; + var parameter2Status = new EquipmentParameter { Url = "2Status" }; + var parameter3Hi = new EquipmentParameter { Url = "3Hi" }; + var parameter3Low = new EquipmentParameter { Url = "3Low" }; + var parameter3Status = new EquipmentParameter { Url = "3Status" }; + + var technicalProcess1 = new TechnicalProcess + { + Equipment = equipment1, + RunIdHiParameter = parameter1Hi, + RunIdLowParameter = parameter1Low, + StatusParameter = parameter1Status, + }; + var technicalProcess2 = new TechnicalProcess + { + Equipment = equipment2, + RunIdHiParameter = parameter2Hi, + RunIdLowParameter = parameter2Low, + StatusParameter = parameter2Status, + }; + var technicalProcess3 = new TechnicalProcess + { + Equipment = equipment3, + RunIdHiParameter = parameter3Hi, + RunIdLowParameter = parameter3Low, + StatusParameter = parameter3Status, + }; + + var equipments = new[] { equipment1, equipment2 }; + + var technicalProcesses = Query.All() + .Where(tp => tp.Equipment.In(equipments)).ToArray(); + + Assert.AreEqual(2, technicalProcesses.Length); + } + } + + [Test] + public void OnlyJoinOperationTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + { + var equipment1 = new Equipment(); + var equipment2 = new Equipment(); + var equipment3 = new Equipment(); + + var parameter1Hi = new EquipmentParameter { Url = "1Hi" }; + var parameter1Low = new EquipmentParameter { Url = "1Low" }; + var parameter1Status = new EquipmentParameter { Url = "1Status" }; + var parameter2Hi = new EquipmentParameter { Url = "2Hi" }; + var parameter2Low = new EquipmentParameter { Url = "2Low" }; + var parameter2Status = new EquipmentParameter { Url = "2Status" }; + var parameter3Hi = new EquipmentParameter { Url = "3Hi" }; + var parameter3Low = new EquipmentParameter { Url = "3Low" }; + var parameter3Status = new EquipmentParameter { Url = "3Status" }; + + var technicalProcess1 = new TechnicalProcess + { + Equipment = equipment1, + RunIdHiParameter = parameter1Hi, + RunIdLowParameter = parameter1Low, + StatusParameter = parameter1Status, + }; + var technicalProcess2 = new TechnicalProcess + { + Equipment = equipment2, + RunIdHiParameter = parameter2Hi, + RunIdLowParameter = parameter2Low, + StatusParameter = parameter2Status, + }; + var technicalProcess3 = new TechnicalProcess + { + Equipment = equipment3, + RunIdHiParameter = parameter3Hi, + RunIdLowParameter = parameter3Low, + StatusParameter = parameter3Status, + }; + + var urls = session.Query.All() + .Select(p => p.RunIdHiParameter.Url) + .Concat(session.Query.All().Select(p => p.RunIdLowParameter.Url)) + .Concat(session.Query.All().Select(p => p.StatusParameter.Url)) + .ToArray(); + + Assert.AreEqual(9, urls.Length); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0531_IncorrectNameOfRecycledNestedType.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0531_IncorrectNameOfRecycledNestedType.cs index 38cd268d2c..d5d59b18b6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0531_IncorrectNameOfRecycledNestedType.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0531_IncorrectNameOfRecycledNestedType.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.05.21 - -using System; -using NUnit.Framework; -using model1 = Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV1; -using model2 = Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV2; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV1 -{ - public class Foo - { - public class Foo2 - { - [HierarchyRoot] - public class Bar : Entity - { - [Field] - [Key] - public Guid Id { get; set; } - } - } - } - - namespace Recycled - { - public class Foo - { - public class Foo2 - { - [HierarchyRoot] - [Recycled] - public class Bar : Entity - { - [Field] - [Key] - public Guid Id { get; set; } - } - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV2 -{ - public class Foo - { - public class Foo2 - { - [HierarchyRoot] - [Recycled] - public class Bar : Entity - { - [Field] - [Key] - public Guid Id { get; set; } - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0531_IncorrectNameOfRecycledNestedType : AutoBuildTest - { - [Test] - public void MainTest() - { - var dc = DomainConfigurationFactory.Create(); - dc.Types.Register(typeof(model1.Foo.Foo2.Bar)); - dc.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain = Domain.Build(dc)) { } - - dc = DomainConfigurationFactory.Create(); - dc.Types.Register(typeof (model1.Recycled.Foo.Foo2.Bar)); - dc.UpgradeMode = DomainUpgradeMode.PerformSafely; - - using (var domain = Domain.Build(dc)) { } - } - } -} - - +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.05.21 + +using System; +using NUnit.Framework; +using model1 = Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV1; +using model2 = Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV2; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV1 +{ + public class Foo + { + public class Foo2 + { + [HierarchyRoot] + public class Bar : Entity + { + [Field] + [Key] + public Guid Id { get; set; } + } + } + } + + namespace Recycled + { + public class Foo + { + public class Foo2 + { + [HierarchyRoot] + [Recycled] + public class Bar : Entity + { + [Field] + [Key] + public Guid Id { get; set; } + } + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0529_BugWithRecycledNestedV2 +{ + public class Foo + { + public class Foo2 + { + [HierarchyRoot] + [Recycled] + public class Bar : Entity + { + [Field] + [Key] + public Guid Id { get; set; } + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0531_IncorrectNameOfRecycledNestedType : AutoBuildTest + { + [Test] + public void MainTest() + { + var dc = DomainConfigurationFactory.Create(); + dc.Types.Register(typeof(model1.Foo.Foo2.Bar)); + dc.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain = Domain.Build(dc)) { } + + dc = DomainConfigurationFactory.Create(); + dc.Types.Register(typeof (model1.Recycled.Foo.Foo2.Bar)); + dc.UpgradeMode = DomainUpgradeMode.PerformSafely; + + using (var domain = Domain.Build(dc)) { } + } + } +} + + diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0537_DropDefaultConstraintBugTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0537_DropDefaultConstraintBugTest.cs index 93dad27b84..f69f5d9c8d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0537_DropDefaultConstraintBugTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0537_DropDefaultConstraintBugTest.cs @@ -1,434 +1,434 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.12.30 - -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade; -using Xtensive.Sql; -using Xtensive.Sql.Drivers.SqlServer; -using Xtensive.Sql.Drivers.SqlServer.v09; -using Xtensive.Sql.Model; -using Model1 = Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1; -using Model2 = Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel2; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1 -{ - [HierarchyRoot] - public class Area : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field(Nullable = false)] - public string NotEmpty { get; set; } - - [Field(Nullable = false)] - public bool BoolField { get; set; } - - [Field(Nullable = false)] - public char CharField { get; set; } - - [Field(Nullable = false)] - public sbyte SbyteField { get; set; } - - [Field(Nullable = false)] - public byte ByteField { get; set; } - - [Field(Nullable = false)] - public short ShortField { get; set; } - - [Field(Nullable = false)] - public ushort UshortField { get; set; } - - [Field(Nullable = false)] - public int IntField { get; set; } - - [Field(Nullable = false)] - public uint UIntField { get; set; } - - [Field(Nullable = false)] - public long LongField { get; set; } - - [Field(Nullable = false)] - public ulong UlongField { get; set; } - - [Field(Nullable = false)] - public float FloatField { get; set; } - - [Field(Nullable = false)] - public double Double { get; set; } - } - - [HierarchyRoot] - public class StoredObject : Entity - { - [Field, Key] - public long ID { get; set; } - [Field] - public Area Area { get; set; } - } - - [HierarchyRoot] - public class AnotherArea : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field] - public string NotEmpty { get; set; } - - [Field] - public bool BoolField { get; set; } - - [Field] - public char CharField { get; set; } - - [Field] - public sbyte SbyteField { get; set; } - - [Field] - public byte ByteField { get; set; } - - [Field] - public short ShortField { get; set; } - - [Field] - public ushort UshortField { get; set; } - - [Field] - public int IntField { get; set; } - - [Field] - public uint UIntField { get; set; } - - [Field] - public long LongField { get; set; } - - [Field] - public ulong UlongField { get; set; } - - [Field] - public float FloatField { get; set; } - - [Field] - public double Double { get; set; } - } - - [HierarchyRoot] - public class AnotherStoredObject : Entity - { - [Field, Key] - public long ID { get; set; } - [Field] - public AnotherArea Area { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel2 -{ - namespace WMS - { - [HierarchyRoot] - public class StoredObject : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field] - public Core.Area Area { get; set; } - } - - [HierarchyRoot] - public class AnotherStoredObject : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field] - public Core.AnotherArea Area { get; set; } - } - } - - namespace Core - { - [HierarchyRoot] - public class Area : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field] - public string NotEmpty { get; set; } - - [Field] - public bool BoolField { get; set; } - - [Field] - public char CharField { get; set; } - - [Field] - public sbyte SbyteField { get; set; } - - [Field] - public byte ByteField { get; set; } - - [Field] - public short ShortField { get; set; } - - [Field] - public ushort UshortField { get; set; } - - [Field] - public int IntField { get; set; } - - [Field] - public uint UIntField { get; set; } - - [Field] - public long LongField { get; set; } - - [Field] - public ulong UlongField { get; set; } - - [Field] - public float FloatField { get; set; } - - [Field] - public double Double { get; set; } - } - - [HierarchyRoot] - public class AnotherArea : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field(Nullable = false)] - public string NotEmpty { get; set; } - - [Field(Nullable = false)] - public bool BoolField { get; set; } - - [Field(Nullable = false)] - public char CharField { get; set; } - - [Field(Nullable = false)] - public sbyte SbyteField { get; set; } - - [Field(Nullable = false)] - public byte ByteField { get; set; } - - [Field(Nullable = false)] - public short ShortField { get; set; } - - [Field(Nullable = false)] - public ushort UshortField { get; set; } - - [Field(Nullable = false)] - public int IntField { get; set; } - - [Field(Nullable = false)] - public uint UIntField { get; set; } - - [Field(Nullable = false)] - public long LongField { get; set; } - - [Field(Nullable = false)] - public ulong UlongField { get; set; } - - [Field(Nullable = false)] - public float FloatField { get; set; } - - [Field(Nullable = false)] - public double Double { get; set; } - } - } - - public class Upgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.StoredObject", typeof (WMS.StoredObject))); - hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.Area", typeof (Core.Area))); - hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.AnotherStoredObject", typeof (WMS.AnotherStoredObject))); - hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.AnotherArea", typeof (Core.AnotherArea))); - hints.Add(new ChangeFieldTypeHint(typeof (Core.AnotherArea), "NotEmpty")); - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0537_DropDefaultConstraintBugTest : AutoBuildTest - { - private const string Database1Name = "DO-Tests-1"; - private const string Database2Name = "DO-Tests-2"; - private const string CoreAlias = "core"; - private const string WmsAlias = "wms"; - private const string SpecialSchemaAlias = "dbo"; - - private ConnectionInfo connectionInfo; - private string connectionString; - - private static string multiDatabaseConnectionString; - private static string singleDatabaseConnectionStringDatabase1; - private static string singleDatabaseConnectionStringDatabase2; - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - } - - protected override void PopulateData() - { - BuildSingleDomain(Database1Name); - } - - [OneTimeSetUp] - public override void TestFixtureSetUp() - { - InitializeConnectionStrings(); - CheckRequirements(); - CleanUp(); - PopulateData(); - } - - [Test] - public void MainTest() - { - BuildMultipleDomain(Database2Name, Database1Name); - } - - private static void BuildMultipleDomain(string coreDatabaseName, string wmsDatabaseName) - { - var domainConfiguration = new DomainConfiguration(multiDatabaseConnectionString); - - domainConfiguration.DefaultDatabase = WmsAlias; - domainConfiguration.DefaultSchema = SpecialSchemaAlias; - - var coreDatabase = new DatabaseConfiguration(CoreAlias); - coreDatabase.RealName = coreDatabaseName; - - var wmsDatabase = new DatabaseConfiguration(WmsAlias); - wmsDatabase.RealName = wmsDatabaseName; - - domainConfiguration.Databases.Add(coreDatabase); - - - domainConfiguration.Databases.Add(wmsDatabase); - - domainConfiguration.Types.Register(typeof (Model2.Upgrader).Assembly, typeof (Model2.Upgrader).Namespace); - - domainConfiguration.MappingRules.Map(typeof (Model2.Core.Area).Namespace).ToDatabase(CoreAlias); - domainConfiguration.MappingRules.Map(typeof (Model2.WMS.StoredObject).Namespace).ToDatabase(WmsAlias); - - domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - using (var domain = Domain.Build(domainConfiguration)) { } - } - - private static void BuildSingleDomain(string wmsDatabaseName) - { - var domainConfiguration = new DomainConfiguration(singleDatabaseConnectionStringDatabase1); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - domainConfiguration.DefaultSchema = SpecialSchemaAlias; - domainConfiguration.DefaultDatabase = WmsAlias; - - var wmsDatabase = new DatabaseConfiguration(WmsAlias); - wmsDatabase.RealName = wmsDatabaseName; - - domainConfiguration.Databases.Add(wmsDatabase); - - domainConfiguration.MappingRules.Map(typeof (Model1.Area).Namespace).To(WmsAlias, SpecialSchemaAlias); - - domainConfiguration.Types.Register(typeof (Model1.Area)); - domainConfiguration.Types.Register(typeof (Model1.StoredObject)); - domainConfiguration.Types.Register(typeof (Model1.AnotherArea)); - domainConfiguration.Types.Register(typeof (Model1.AnotherStoredObject)); - - domainConfiguration.Databases.Add(wmsDatabaseName); - - using (var domain = Domain.Build(domainConfiguration)) { } - } - - - private void CleanUp() - { - var driverFactory = new DriverFactory(); - var driver = driverFactory.GetDriver(new ConnectionInfo(singleDatabaseConnectionStringDatabase1)); - ClearSchema(driver); - driver = driverFactory.GetDriver(new ConnectionInfo(singleDatabaseConnectionStringDatabase2)); - ClearSchema(driver); - } - - private void ClearSchema(SqlDriver driver) - { - using (var connection = driver.CreateConnection()) { - connection.Open(); - try { - var schema = driver.ExtractSchema(connection, SpecialSchemaAlias); - var foreignKeys = schema.Tables - .Select(t => new { - Table = t, - ForeignKeys = t.TableConstraints.OfType() - }); - foreach (var dropConstraintText in from foreignKeyInfo in foreignKeys - from foreignKey in foreignKeyInfo.ForeignKeys - select driver.Compile(SqlDdl.Alter(foreignKeyInfo.Table, SqlDdl.DropConstraint(foreignKey))).GetCommandText()) { - using (var command = connection.CreateCommand(dropConstraintText)) - command.ExecuteNonQuery(); - } - - foreach (var table in schema.Tables) { - var dropTableText = driver.Compile(SqlDdl.Drop(table, true)).GetCommandText(); - using (var command = connection.CreateCommand(dropTableText)) - command.ExecuteNonQuery(); - } - } - finally { - connection.Close(); - } - } - } - - private void InitializeConnectionStrings() - { - var stringBuilder = new StringBuilder(); - connectionInfo = TestConfiguration.Instance.GetConnectionInfo(TestConfiguration.Instance.Storage); - - stringBuilder.AppendFormat("{0}://", connectionInfo.ConnectionUrl.Protocol); - if (!string.IsNullOrEmpty(connectionInfo.ConnectionUrl.User) && !string.IsNullOrEmpty(connectionInfo.ConnectionUrl.Password)) - stringBuilder.AppendFormat("{0}:{1}@", connectionInfo.ConnectionUrl.User, connectionInfo.ConnectionUrl.Password); - stringBuilder.AppendFormat("{0}{1}", connectionInfo.ConnectionUrl.Host, (connectionInfo.ConnectionUrl.Port > 0) ? string.Format(":{0}", connectionInfo.ConnectionUrl.Port) : string.Empty); - stringBuilder.Append("/{0}{1}"); - var paramsString = string.Empty; - foreach (var pair in connectionInfo.ConnectionUrl.Params) { - if (string.IsNullOrEmpty(paramsString)) - paramsString += string.Format("?{0}={1}", pair.Key, pair.Value); - else - paramsString += string.Format("&{0}={1}", pair.Key, pair.Value); - } - - singleDatabaseConnectionStringDatabase1 = string.Format(stringBuilder.ToString(), Database1Name, paramsString); - singleDatabaseConnectionStringDatabase2 = string.Format(stringBuilder.ToString(), Database2Name, paramsString); - multiDatabaseConnectionString = string.Format(stringBuilder.ToString(), string.Empty, paramsString); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.12.30 + +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade; +using Xtensive.Sql; +using Xtensive.Sql.Drivers.SqlServer; +using Xtensive.Sql.Drivers.SqlServer.v09; +using Xtensive.Sql.Model; +using Model1 = Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1; +using Model2 = Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel2; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1 +{ + [HierarchyRoot] + public class Area : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field(Nullable = false)] + public string NotEmpty { get; set; } + + [Field(Nullable = false)] + public bool BoolField { get; set; } + + [Field(Nullable = false)] + public char CharField { get; set; } + + [Field(Nullable = false)] + public sbyte SbyteField { get; set; } + + [Field(Nullable = false)] + public byte ByteField { get; set; } + + [Field(Nullable = false)] + public short ShortField { get; set; } + + [Field(Nullable = false)] + public ushort UshortField { get; set; } + + [Field(Nullable = false)] + public int IntField { get; set; } + + [Field(Nullable = false)] + public uint UIntField { get; set; } + + [Field(Nullable = false)] + public long LongField { get; set; } + + [Field(Nullable = false)] + public ulong UlongField { get; set; } + + [Field(Nullable = false)] + public float FloatField { get; set; } + + [Field(Nullable = false)] + public double Double { get; set; } + } + + [HierarchyRoot] + public class StoredObject : Entity + { + [Field, Key] + public long ID { get; set; } + [Field] + public Area Area { get; set; } + } + + [HierarchyRoot] + public class AnotherArea : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field] + public string NotEmpty { get; set; } + + [Field] + public bool BoolField { get; set; } + + [Field] + public char CharField { get; set; } + + [Field] + public sbyte SbyteField { get; set; } + + [Field] + public byte ByteField { get; set; } + + [Field] + public short ShortField { get; set; } + + [Field] + public ushort UshortField { get; set; } + + [Field] + public int IntField { get; set; } + + [Field] + public uint UIntField { get; set; } + + [Field] + public long LongField { get; set; } + + [Field] + public ulong UlongField { get; set; } + + [Field] + public float FloatField { get; set; } + + [Field] + public double Double { get; set; } + } + + [HierarchyRoot] + public class AnotherStoredObject : Entity + { + [Field, Key] + public long ID { get; set; } + [Field] + public AnotherArea Area { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel2 +{ + namespace WMS + { + [HierarchyRoot] + public class StoredObject : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field] + public Core.Area Area { get; set; } + } + + [HierarchyRoot] + public class AnotherStoredObject : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field] + public Core.AnotherArea Area { get; set; } + } + } + + namespace Core + { + [HierarchyRoot] + public class Area : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field] + public string NotEmpty { get; set; } + + [Field] + public bool BoolField { get; set; } + + [Field] + public char CharField { get; set; } + + [Field] + public sbyte SbyteField { get; set; } + + [Field] + public byte ByteField { get; set; } + + [Field] + public short ShortField { get; set; } + + [Field] + public ushort UshortField { get; set; } + + [Field] + public int IntField { get; set; } + + [Field] + public uint UIntField { get; set; } + + [Field] + public long LongField { get; set; } + + [Field] + public ulong UlongField { get; set; } + + [Field] + public float FloatField { get; set; } + + [Field] + public double Double { get; set; } + } + + [HierarchyRoot] + public class AnotherArea : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field(Nullable = false)] + public string NotEmpty { get; set; } + + [Field(Nullable = false)] + public bool BoolField { get; set; } + + [Field(Nullable = false)] + public char CharField { get; set; } + + [Field(Nullable = false)] + public sbyte SbyteField { get; set; } + + [Field(Nullable = false)] + public byte ByteField { get; set; } + + [Field(Nullable = false)] + public short ShortField { get; set; } + + [Field(Nullable = false)] + public ushort UshortField { get; set; } + + [Field(Nullable = false)] + public int IntField { get; set; } + + [Field(Nullable = false)] + public uint UIntField { get; set; } + + [Field(Nullable = false)] + public long LongField { get; set; } + + [Field(Nullable = false)] + public ulong UlongField { get; set; } + + [Field(Nullable = false)] + public float FloatField { get; set; } + + [Field(Nullable = false)] + public double Double { get; set; } + } + } + + public class Upgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.StoredObject", typeof (WMS.StoredObject))); + hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.Area", typeof (Core.Area))); + hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.AnotherStoredObject", typeof (WMS.AnotherStoredObject))); + hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0537_DropDefaultConstraintBugTestModel1.AnotherArea", typeof (Core.AnotherArea))); + hints.Add(new ChangeFieldTypeHint(typeof (Core.AnotherArea), "NotEmpty")); + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0537_DropDefaultConstraintBugTest : AutoBuildTest + { + private const string Database1Name = "DO-Tests-1"; + private const string Database2Name = "DO-Tests-2"; + private const string CoreAlias = "core"; + private const string WmsAlias = "wms"; + private const string SpecialSchemaAlias = "dbo"; + + private ConnectionInfo connectionInfo; + private string connectionString; + + private static string multiDatabaseConnectionString; + private static string singleDatabaseConnectionStringDatabase1; + private static string singleDatabaseConnectionStringDatabase2; + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + } + + protected override void PopulateData() + { + BuildSingleDomain(Database1Name); + } + + [OneTimeSetUp] + public override void TestFixtureSetUp() + { + InitializeConnectionStrings(); + CheckRequirements(); + CleanUp(); + PopulateData(); + } + + [Test] + public void MainTest() + { + BuildMultipleDomain(Database2Name, Database1Name); + } + + private static void BuildMultipleDomain(string coreDatabaseName, string wmsDatabaseName) + { + var domainConfiguration = new DomainConfiguration(multiDatabaseConnectionString); + + domainConfiguration.DefaultDatabase = WmsAlias; + domainConfiguration.DefaultSchema = SpecialSchemaAlias; + + var coreDatabase = new DatabaseConfiguration(CoreAlias); + coreDatabase.RealName = coreDatabaseName; + + var wmsDatabase = new DatabaseConfiguration(WmsAlias); + wmsDatabase.RealName = wmsDatabaseName; + + domainConfiguration.Databases.Add(coreDatabase); + + + domainConfiguration.Databases.Add(wmsDatabase); + + domainConfiguration.Types.Register(typeof (Model2.Upgrader).Assembly, typeof (Model2.Upgrader).Namespace); + + domainConfiguration.MappingRules.Map(typeof (Model2.Core.Area).Namespace).ToDatabase(CoreAlias); + domainConfiguration.MappingRules.Map(typeof (Model2.WMS.StoredObject).Namespace).ToDatabase(WmsAlias); + + domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + using (var domain = Domain.Build(domainConfiguration)) { } + } + + private static void BuildSingleDomain(string wmsDatabaseName) + { + var domainConfiguration = new DomainConfiguration(singleDatabaseConnectionStringDatabase1); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + domainConfiguration.DefaultSchema = SpecialSchemaAlias; + domainConfiguration.DefaultDatabase = WmsAlias; + + var wmsDatabase = new DatabaseConfiguration(WmsAlias); + wmsDatabase.RealName = wmsDatabaseName; + + domainConfiguration.Databases.Add(wmsDatabase); + + domainConfiguration.MappingRules.Map(typeof (Model1.Area).Namespace).To(WmsAlias, SpecialSchemaAlias); + + domainConfiguration.Types.Register(typeof (Model1.Area)); + domainConfiguration.Types.Register(typeof (Model1.StoredObject)); + domainConfiguration.Types.Register(typeof (Model1.AnotherArea)); + domainConfiguration.Types.Register(typeof (Model1.AnotherStoredObject)); + + domainConfiguration.Databases.Add(wmsDatabaseName); + + using (var domain = Domain.Build(domainConfiguration)) { } + } + + + private void CleanUp() + { + var driverFactory = new DriverFactory(); + var driver = driverFactory.GetDriver(new ConnectionInfo(singleDatabaseConnectionStringDatabase1)); + ClearSchema(driver); + driver = driverFactory.GetDriver(new ConnectionInfo(singleDatabaseConnectionStringDatabase2)); + ClearSchema(driver); + } + + private void ClearSchema(SqlDriver driver) + { + using (var connection = driver.CreateConnection()) { + connection.Open(); + try { + var schema = driver.ExtractSchema(connection, SpecialSchemaAlias); + var foreignKeys = schema.Tables + .Select(t => new { + Table = t, + ForeignKeys = t.TableConstraints.OfType() + }); + foreach (var dropConstraintText in from foreignKeyInfo in foreignKeys + from foreignKey in foreignKeyInfo.ForeignKeys + select driver.Compile(SqlDdl.Alter(foreignKeyInfo.Table, SqlDdl.DropConstraint(foreignKey))).GetCommandText()) { + using (var command = connection.CreateCommand(dropConstraintText)) + command.ExecuteNonQuery(); + } + + foreach (var table in schema.Tables) { + var dropTableText = driver.Compile(SqlDdl.Drop(table, true)).GetCommandText(); + using (var command = connection.CreateCommand(dropTableText)) + command.ExecuteNonQuery(); + } + } + finally { + connection.Close(); + } + } + } + + private void InitializeConnectionStrings() + { + var stringBuilder = new StringBuilder(); + connectionInfo = TestConfiguration.Instance.GetConnectionInfo(TestConfiguration.Instance.Storage); + + stringBuilder.AppendFormat("{0}://", connectionInfo.ConnectionUrl.Protocol); + if (!string.IsNullOrEmpty(connectionInfo.ConnectionUrl.User) && !string.IsNullOrEmpty(connectionInfo.ConnectionUrl.Password)) + stringBuilder.AppendFormat("{0}:{1}@", connectionInfo.ConnectionUrl.User, connectionInfo.ConnectionUrl.Password); + stringBuilder.AppendFormat("{0}{1}", connectionInfo.ConnectionUrl.Host, (connectionInfo.ConnectionUrl.Port > 0) ? string.Format(":{0}", connectionInfo.ConnectionUrl.Port) : string.Empty); + stringBuilder.Append("/{0}{1}"); + var paramsString = string.Empty; + foreach (var pair in connectionInfo.ConnectionUrl.Params) { + if (string.IsNullOrEmpty(paramsString)) + paramsString += string.Format("?{0}={1}", pair.Key, pair.Value); + else + paramsString += string.Format("&{0}={1}", pair.Key, pair.Value); + } + + singleDatabaseConnectionStringDatabase1 = string.Format(stringBuilder.ToString(), Database1Name, paramsString); + singleDatabaseConnectionStringDatabase2 = string.Format(stringBuilder.ToString(), Database2Name, paramsString); + multiDatabaseConnectionString = string.Format(stringBuilder.ToString(), string.Empty, paramsString); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0538_IncorrectSortedActionSequence.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0538_IncorrectSortedActionSequence.cs index 5b2a0ff1c4..3a1fa515aa 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0538_IncorrectSortedActionSequence.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0538_IncorrectSortedActionSequence.cs @@ -1,141 +1,141 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.06.05 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Tests.Issues.IssueJira0538_IncorrectSortedActionSequenceModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0538_IncorrectSortedActionSequenceModel -{ - public abstract class DataFieldBase : FormElement - { - [Field(Length = 4000)] - public string BindingExpression { get; set; } - - protected DataFieldBase(Guid id) - : base(id) - { - } - } - - [Serializable] - public class ExternalDataField : DataFieldBase - { - [Field(Nullable = false)] - public string SysName { get; set; } - - public ExternalDataField(Guid id) - : base(id) - { - } - } - - public interface IOwned : IEntityBase - where TOwner : IEntityBase - { - - [Field(Nullable = false, Indexed = false)] - [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] - TOwner Owner { get; } - } - - [HierarchyRoot(Clustered = false)] - public abstract class FormElement : EntityBase - { - protected FormElement(Guid id) - : base(id) - { - } - - [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] - [Field] - public EntitySet Visibility { get; private set; } - - public abstract class TablePartBase : EntityBase, IOwned where TOwner : EntityBase - { - protected TablePartBase(Guid id, TOwner owner) - : base(id) - { - Owner = owner; - } - - public TOwner Owner { get; private set; } - } - - [HierarchyRoot] - [Serializable] - public class TpVisibleEnable : TablePartBase - { - public TpVisibleEnable(Guid id, FormElement owner) - : base(id, owner) - { - } - - [Field(Length = 4000)] - public string DynamicLinqExpression { get; set; } - - } - } - - /// - /// Base Entity interface - /// - public interface IEntityBase : IEntity - { - [Field] - [Key] - new Guid Id { get; } - } - - public abstract class EntityBase : Entity, IEntityBase - { - protected EntityBase(Guid id) - : base(id) - { - } - - public Guid Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0538_IncorrectSortedActionSequence : AutoBuildTest - { - [Test] - public void MainTest() - { - var domainConfiguration = DomainConfigurationFactory.Create(); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - foreach (var type in typeof(FormElement).Assembly.GetTypes()) { - if (typeof(IEntityBase).IsAssignableFrom(type)) - domainConfiguration.Types.Register(type); - } - using (var domain = Domain.Build(domainConfiguration)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = Session.Current.OpenTransaction()) { - var externalDataField = new ExternalDataField(Guid.NewGuid()) { SysName = "ee" }; - var eee = new FormElement.TpVisibleEnable(Guid.NewGuid(), externalDataField); - - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = Session.Current.OpenTransaction()) { - var e1 = Query.All().Single(); - e1.Remove(); - transaction.Complete(); - } - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.06.05 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueJira0538_IncorrectSortedActionSequenceModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0538_IncorrectSortedActionSequenceModel +{ + public abstract class DataFieldBase : FormElement + { + [Field(Length = 4000)] + public string BindingExpression { get; set; } + + protected DataFieldBase(Guid id) + : base(id) + { + } + } + + [Serializable] + public class ExternalDataField : DataFieldBase + { + [Field(Nullable = false)] + public string SysName { get; set; } + + public ExternalDataField(Guid id) + : base(id) + { + } + } + + public interface IOwned : IEntityBase + where TOwner : IEntityBase + { + + [Field(Nullable = false, Indexed = false)] + [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] + TOwner Owner { get; } + } + + [HierarchyRoot(Clustered = false)] + public abstract class FormElement : EntityBase + { + protected FormElement(Guid id) + : base(id) + { + } + + [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] + [Field] + public EntitySet Visibility { get; private set; } + + public abstract class TablePartBase : EntityBase, IOwned where TOwner : EntityBase + { + protected TablePartBase(Guid id, TOwner owner) + : base(id) + { + Owner = owner; + } + + public TOwner Owner { get; private set; } + } + + [HierarchyRoot] + [Serializable] + public class TpVisibleEnable : TablePartBase + { + public TpVisibleEnable(Guid id, FormElement owner) + : base(id, owner) + { + } + + [Field(Length = 4000)] + public string DynamicLinqExpression { get; set; } + + } + } + + /// + /// Base Entity interface + /// + public interface IEntityBase : IEntity + { + [Field] + [Key] + new Guid Id { get; } + } + + public abstract class EntityBase : Entity, IEntityBase + { + protected EntityBase(Guid id) + : base(id) + { + } + + public Guid Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0538_IncorrectSortedActionSequence : AutoBuildTest + { + [Test] + public void MainTest() + { + var domainConfiguration = DomainConfigurationFactory.Create(); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + foreach (var type in typeof(FormElement).Assembly.GetTypes()) { + if (typeof(IEntityBase).IsAssignableFrom(type)) + domainConfiguration.Types.Register(type); + } + using (var domain = Domain.Build(domainConfiguration)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = Session.Current.OpenTransaction()) { + var externalDataField = new ExternalDataField(Guid.NewGuid()) { SysName = "ee" }; + var eee = new FormElement.TpVisibleEnable(Guid.NewGuid(), externalDataField); + + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = Session.Current.OpenTransaction()) { + var e1 = Query.All().Single(); + e1.Remove(); + transaction.Complete(); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug.cs index b54df2f21e..c85f8ec52b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.06.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Upgrade; -using model1 = Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel1; -using model2 = Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel2; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel1 -{ - [HierarchyRoot] - [Recycled] - public class Recycled : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Test : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - [Recycled] - public Recycled Link { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel2 -{ - [HierarchyRoot] - [Recycled("Some.Namespace.SomeType")] - public class Recycled : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Test : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - [Recycled] - public Recycled Link { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug : AutoBuildTest - { - [Test] - public void OldTypeDoesNotDefinedInAttributeTest() - { - var domainConfiguration = DomainConfigurationFactory.Create(); - domainConfiguration.Types.Register(typeof (model1.Recycled).Assembly, typeof (model1.Recycled).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain = Domain.Build(domainConfiguration)) { } - - domainConfiguration = domainConfiguration.Clone(); - domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - Assert.DoesNotThrow(()=>Domain.Build(domainConfiguration)); - } - - [Test] - public void OldTypeDefinedInAttributeTest() - { - var domainConfiguration = DomainConfigurationFactory.Create(); - domainConfiguration.Types.Register(typeof (model2.Recycled).Assembly, typeof (model2.Recycled).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain = Domain.Build(domainConfiguration)) { } - - domainConfiguration = domainConfiguration.Clone(); - domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; - Assert.Throws(() => Domain.Build(domainConfiguration)); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.06.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Upgrade; +using model1 = Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel1; +using model2 = Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel2; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel1 +{ + [HierarchyRoot] + [Recycled] + public class Recycled : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Test : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + [Recycled] + public Recycled Link { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBugModel2 +{ + [HierarchyRoot] + [Recycled("Some.Namespace.SomeType")] + public class Recycled : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Test : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + [Recycled] + public Recycled Link { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0540_IncorrectBehaviorOnDomainUpgradeWithRecycledTypeBug : AutoBuildTest + { + [Test] + public void OldTypeDoesNotDefinedInAttributeTest() + { + var domainConfiguration = DomainConfigurationFactory.Create(); + domainConfiguration.Types.Register(typeof (model1.Recycled).Assembly, typeof (model1.Recycled).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain = Domain.Build(domainConfiguration)) { } + + domainConfiguration = domainConfiguration.Clone(); + domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + Assert.DoesNotThrow(()=>Domain.Build(domainConfiguration)); + } + + [Test] + public void OldTypeDefinedInAttributeTest() + { + var domainConfiguration = DomainConfigurationFactory.Create(); + domainConfiguration.Types.Register(typeof (model2.Recycled).Assembly, typeof (model2.Recycled).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain = Domain.Build(domainConfiguration)) { } + + domainConfiguration = domainConfiguration.Clone(); + domainConfiguration.UpgradeMode = DomainUpgradeMode.PerformSafely; + Assert.Throws(() => Domain.Build(domainConfiguration)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0541_IncorrectMappingNameInSingleTable.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0541_IncorrectMappingNameInSingleTable.cs index ef7aaa24f1..74521f5c80 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0541_IncorrectMappingNameInSingleTable.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0541_IncorrectMappingNameInSingleTable.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.06.17 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0541_IncorrectMappingNameInSingleTableModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0541_IncorrectMappingNameInSingleTableModel -{ - [HierarchyRoot(InheritanceSchema.SingleTable)] - public abstract class BaseClass : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class FirstChild : BaseClass - { - [Field] - public string Name { get; set; } - - [Field] - public string SomeFirstChildField { get; set; } - } - - public class SecondChild : BaseClass - { - [Field] - public string Name { get; set; } - - [Field] - public string SomeSecondChildField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0541_IncorrectMappingNameInSingleTable : AutoBuildTest - { - [Test] - public void MainTest() - { - Assert.AreEqual("Name", Domain.Model.Types[typeof (FirstChild)].Fields["Name"].MappingName); - Assert.AreEqual("SecondChild.Name", Domain.Model.Types[typeof (SecondChild)].Fields["Name"].MappingName); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (BaseClass).Assembly, typeof (BaseClass).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.06.17 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0541_IncorrectMappingNameInSingleTableModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0541_IncorrectMappingNameInSingleTableModel +{ + [HierarchyRoot(InheritanceSchema.SingleTable)] + public abstract class BaseClass : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class FirstChild : BaseClass + { + [Field] + public string Name { get; set; } + + [Field] + public string SomeFirstChildField { get; set; } + } + + public class SecondChild : BaseClass + { + [Field] + public string Name { get; set; } + + [Field] + public string SomeSecondChildField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0541_IncorrectMappingNameInSingleTable : AutoBuildTest + { + [Test] + public void MainTest() + { + Assert.AreEqual("Name", Domain.Model.Types[typeof (FirstChild)].Fields["Name"].MappingName); + Assert.AreEqual("SecondChild.Name", Domain.Model.Types[typeof (SecondChild)].Fields["Name"].MappingName); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (BaseClass).Assembly, typeof (BaseClass).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0542_OfTypeTranslationBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0542_OfTypeTranslationBug.cs index fa3db59773..98758984aa 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0542_OfTypeTranslationBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0542_OfTypeTranslationBug.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.07.25 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0542_OfTypeTranslationBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0542_OfTypeTranslationBugModel -{ - [HierarchyRoot] - public class Test : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public StructType Struct { get; set; } - } - - [HierarchyRoot] - public class Test2 : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - [Association(PairTo = "Struct.Item")] - public EntitySet StructSet { get; set; } - } - - public class StructType : Structure - { - [Field] - public Test2 Item { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0542_OfTypeTranslationBug : AutoBuildTest - { - [Test] - public void MainTest() - { - var configuration = DomainConfigurationFactory.Create(); - - configuration.Types.Register(typeof(Test)); - configuration.Types.Register(typeof(Test2)); - - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain = Domain.Build(configuration)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var t = session.OpenTransaction()) { - var test2 = new Test2(); - var test = new Test { - Name = "", - Struct = new StructType { Item = test2 } - }; - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var t = session.OpenTransaction()) { - var test2 = Session.Current.Query.All().SingleOrDefault(); - var result2 = test2.StructSet.OfType().ToList(); - } - } - } - - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.07.25 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0542_OfTypeTranslationBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0542_OfTypeTranslationBugModel +{ + [HierarchyRoot] + public class Test : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public StructType Struct { get; set; } + } + + [HierarchyRoot] + public class Test2 : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + [Association(PairTo = "Struct.Item")] + public EntitySet StructSet { get; set; } + } + + public class StructType : Structure + { + [Field] + public Test2 Item { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0542_OfTypeTranslationBug : AutoBuildTest + { + [Test] + public void MainTest() + { + var configuration = DomainConfigurationFactory.Create(); + + configuration.Types.Register(typeof(Test)); + configuration.Types.Register(typeof(Test2)); + + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain = Domain.Build(configuration)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var t = session.OpenTransaction()) { + var test2 = new Test2(); + var test = new Test { + Name = "", + Struct = new StructType { Item = test2 } + }; + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var t = session.OpenTransaction()) { + var test2 = Session.Current.Query.All().SingleOrDefault(); + var result2 = test2.StructSet.OfType().ToList(); + } + } + } + + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0546_IncorrectCachingOfQueries.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0546_IncorrectCachingOfQueries.cs index 5356ca8e8b..420d2bbbf9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0546_IncorrectCachingOfQueries.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0546_IncorrectCachingOfQueries.cs @@ -1,365 +1,365 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.08.08 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.Issues.IssueJira0546_IncorrectCachingOfQueriesModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0546_IncorrectCachingOfQueriesModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public bool Active { get; set; } - - [Field] - public Zone Zone { get; set; } - } - - [HierarchyRoot] - public class Zone : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Zone")] - public EntitySet Locations { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - internal class BaseTask - { - public int StartValue { get; set; } - - public BaseTask(int startValue) - { - StartValue = startValue; - } - } - internal class Task: BaseTask - { - public Session Session { get; private set; } - - public Zone NullZone { get; private set; } - - public int GetMinimalLocationIdDelayedApi() - { - Func func = (s) => { - var locations = Session.Query.ExecuteDelayed(endpoint => from location in s.Query.All() - where location.Active && location.Id.In(( - from loc in s.Query.All() - where loc.Id > StartValue && loc.Zone==NullZone - orderby loc.Id - select loc.Id)) - select location); - var minId = locations.Min(entity => entity.Id); - return minId; - }; - int result = 0; - Action action = () => { - using (var tx = Session.OpenTransaction()) { - result = func.Invoke(Session); - tx.Complete(); - } - }; - action.Invoke(); - return result; - } - - public int GetMinimalLocationIdFutureApi() - { - Func func = () => { - var locations = Query.ExecuteFuture(() => from location in Query.All() - where location.Active && location.Id.In(( - from loc in Query.All() - where loc.Id > StartValue && loc.Zone == NullZone - orderby loc.Id - select loc.Id)) - select location); - var minId = locations.Min(entity => entity.Id); - return minId; - }; - int result = 0; - Action action = () => { - using (var tx = Session.OpenTransaction()) { - result = func.Invoke(); - tx.Complete(); - } - }; - action.Invoke(); - return result; - } - - public Task(Session session, int startValue) - : base(startValue) - { - this.Session = session; - NullZone = null; - } - } - - [TestFixture] - public class IssueJira0546_IncorrectCachingOfQueries : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 100; i++) { - var location = new Location {Active = true}; - } - - new Location {Active = true, Zone = new Zone {Name = "Zone"}}; - transaction.Complete(); - } - } - - [Test] - public void LoopIndexExecuteDelayedTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var upperLimit = 80; - List> queries = new List>(); - var cachedQueriesCountBefore = Domain.QueryCache.Count; - for (int i = 0; i < upperLimit; i++) { - var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() - where location.Active && location.Id.In(( - from loc in session.Query.All() - where loc.Id > i && loc.Zone==null - orderby loc.Id - select loc.Id)) - select location); - queries.Add(locations); - } - var cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - var result = session.Query.All().ToList(); - upperLimit++; - foreach (var query in queries) - Assert.AreEqual(upperLimit, query.Min(entity => entity.Id)); - } - } - - [Test] - public void LoopIndexExecuteFeatureTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var upperLimit = 80; - List> queries = new List>(); - var cachedQueriesCountBefore = Domain.QueryCache.Count; - for (int i = 0; i < upperLimit; i++) { - var locations = Query.ExecuteFuture(() => from location in Query.All() - where location.Active && location.Id.In(( - from loc in Query.All() - where loc.Id > i && loc.Zone == null - orderby loc.Id - select loc.Id)) - select location); - queries.Add(locations); - } - var cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - var result = session.Query.All().ToList(); - upperLimit++; - foreach (var query in queries) - Assert.AreEqual(upperLimit, query.Min(entity => entity.Id)); - } - } - - [Test] - public void LocalValueTypeVariableTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var cachedQueriesCountBefore = Domain.QueryCache.Count; - var currentValue = 1; - var iterationsCount = 0; - var oldValue = currentValue; - while (currentValue<80) { - currentValue = GetMinimalId(session, currentValue); - Assert.AreEqual(oldValue+1, currentValue); - oldValue = currentValue; - iterationsCount++; - } - var cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - - cachedQueriesCountBefore = Domain.QueryCache.Count; - currentValue = oldValue = 1; - iterationsCount = 0; - while (currentValue < 80) { - currentValue = GetMinimalId(currentValue); - Assert.AreEqual(oldValue + 1, currentValue); - oldValue = currentValue; - iterationsCount++; - } - cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - } - } - - public void LocalReferenceTypeVariableTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - //ExecuteDelayed API - var cachedQueriesCountBefore = Domain.QueryCache.Count; - var zone = session.Query.All().First(); - for (int i = 0; i < 80; i++) - GetMinimalIdWithZone(session, zone); - var cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - - //ExecuteFuture API - cachedQueriesCountBefore = Domain.QueryCache.Count; - for (int i = 0; i < 80; i++) - GetMinimalIdWithZone(zone); - cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - } - } - - [Test] - public void GlobalFieldOfClassTest() - { - using (var session = Domain.OpenSession()) { - using (session.Activate()) { - TaskSequencesGenerator(session); - } - } - } - - private void TaskSequencesGenerator(Session session) - { - //ExecuteDelayed API - var cachedQueriesCountBefore = Domain.QueryCache.Count; - var currentId = 1; - var iterationsCount = 0; - while (currentId<80) { - var task = new Task(session, currentId); - var previousId = currentId; - currentId = task.GetMinimalLocationIdDelayedApi(); - Assert.AreEqual(previousId+1, currentId); - iterationsCount++; - } - var cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - - //ExecuteFuture API - cachedQueriesCountBefore = Domain.QueryCache.Count; - currentId = 1; - iterationsCount = 0; - while (currentId < 80) { - var task = new Task(session, currentId); - var previousId = currentId; - currentId = task.GetMinimalLocationIdFutureApi(); - Assert.AreEqual(previousId + 1, currentId); - iterationsCount++; - } - cachedQueriesCountAfter = Domain.QueryCache.Count; - Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); - Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); - } - - private int GetMinimalId(Session session, int startId) - { - var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() - where location.Active && location.Id.In(( - from loc in session.Query.All() - where loc.Id > startId && loc.Zone==null - orderby loc.Id - select loc.Id)) - select location); - session.Query.All(); - return locations.Min(field => field.Id); - } - - private int GetMinimalId(int startId) - { - var locations = Query.ExecuteFuture(() => from location in Query.All() - where location.Active && location.Id.In(( - from loc in Query.All() - where loc.Id > startId && loc.Zone == null - orderby loc.Id - select loc.Id)) - select location); - Query.All(); - return locations.Min(field => field.Id); - } - - private int GetMinimalIdWithZone(Session session, Zone zone) - { - var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() - where location.Active && location.Id.In(( - from loc in session.Query.All() - where loc.Zone==zone - orderby loc.Id - select loc.Id)) - select location); - session.Query.All(); - return locations.Min(field => field.Id); - } - - private int GetMinimalIdWithZone(Zone zone) - { - var locations = Query.ExecuteFuture(() => from location in Query.All() - where location.Active && location.Id.In(( - from loc in Query.All() - where loc.Zone == zone - orderby loc.Id - select loc.Id)) - select location); - Query.All(); - return locations.Min(field => field.Id); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.08.08 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.Issues.IssueJira0546_IncorrectCachingOfQueriesModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0546_IncorrectCachingOfQueriesModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public bool Active { get; set; } + + [Field] + public Zone Zone { get; set; } + } + + [HierarchyRoot] + public class Zone : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Zone")] + public EntitySet Locations { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + internal class BaseTask + { + public int StartValue { get; set; } + + public BaseTask(int startValue) + { + StartValue = startValue; + } + } + internal class Task: BaseTask + { + public Session Session { get; private set; } + + public Zone NullZone { get; private set; } + + public int GetMinimalLocationIdDelayedApi() + { + Func func = (s) => { + var locations = Session.Query.ExecuteDelayed(endpoint => from location in s.Query.All() + where location.Active && location.Id.In(( + from loc in s.Query.All() + where loc.Id > StartValue && loc.Zone==NullZone + orderby loc.Id + select loc.Id)) + select location); + var minId = locations.Min(entity => entity.Id); + return minId; + }; + int result = 0; + Action action = () => { + using (var tx = Session.OpenTransaction()) { + result = func.Invoke(Session); + tx.Complete(); + } + }; + action.Invoke(); + return result; + } + + public int GetMinimalLocationIdFutureApi() + { + Func func = () => { + var locations = Query.ExecuteFuture(() => from location in Query.All() + where location.Active && location.Id.In(( + from loc in Query.All() + where loc.Id > StartValue && loc.Zone == NullZone + orderby loc.Id + select loc.Id)) + select location); + var minId = locations.Min(entity => entity.Id); + return minId; + }; + int result = 0; + Action action = () => { + using (var tx = Session.OpenTransaction()) { + result = func.Invoke(); + tx.Complete(); + } + }; + action.Invoke(); + return result; + } + + public Task(Session session, int startValue) + : base(startValue) + { + this.Session = session; + NullZone = null; + } + } + + [TestFixture] + public class IssueJira0546_IncorrectCachingOfQueries : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 100; i++) { + var location = new Location {Active = true}; + } + + new Location {Active = true, Zone = new Zone {Name = "Zone"}}; + transaction.Complete(); + } + } + + [Test] + public void LoopIndexExecuteDelayedTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var upperLimit = 80; + List> queries = new List>(); + var cachedQueriesCountBefore = Domain.QueryCache.Count; + for (int i = 0; i < upperLimit; i++) { + var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() + where location.Active && location.Id.In(( + from loc in session.Query.All() + where loc.Id > i && loc.Zone==null + orderby loc.Id + select loc.Id)) + select location); + queries.Add(locations); + } + var cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + var result = session.Query.All().ToList(); + upperLimit++; + foreach (var query in queries) + Assert.AreEqual(upperLimit, query.Min(entity => entity.Id)); + } + } + + [Test] + public void LoopIndexExecuteFeatureTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var upperLimit = 80; + List> queries = new List>(); + var cachedQueriesCountBefore = Domain.QueryCache.Count; + for (int i = 0; i < upperLimit; i++) { + var locations = Query.ExecuteFuture(() => from location in Query.All() + where location.Active && location.Id.In(( + from loc in Query.All() + where loc.Id > i && loc.Zone == null + orderby loc.Id + select loc.Id)) + select location); + queries.Add(locations); + } + var cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + var result = session.Query.All().ToList(); + upperLimit++; + foreach (var query in queries) + Assert.AreEqual(upperLimit, query.Min(entity => entity.Id)); + } + } + + [Test] + public void LocalValueTypeVariableTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var cachedQueriesCountBefore = Domain.QueryCache.Count; + var currentValue = 1; + var iterationsCount = 0; + var oldValue = currentValue; + while (currentValue<80) { + currentValue = GetMinimalId(session, currentValue); + Assert.AreEqual(oldValue+1, currentValue); + oldValue = currentValue; + iterationsCount++; + } + var cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + + cachedQueriesCountBefore = Domain.QueryCache.Count; + currentValue = oldValue = 1; + iterationsCount = 0; + while (currentValue < 80) { + currentValue = GetMinimalId(currentValue); + Assert.AreEqual(oldValue + 1, currentValue); + oldValue = currentValue; + iterationsCount++; + } + cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + } + } + + public void LocalReferenceTypeVariableTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + //ExecuteDelayed API + var cachedQueriesCountBefore = Domain.QueryCache.Count; + var zone = session.Query.All().First(); + for (int i = 0; i < 80; i++) + GetMinimalIdWithZone(session, zone); + var cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + + //ExecuteFuture API + cachedQueriesCountBefore = Domain.QueryCache.Count; + for (int i = 0; i < 80; i++) + GetMinimalIdWithZone(zone); + cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + } + } + + [Test] + public void GlobalFieldOfClassTest() + { + using (var session = Domain.OpenSession()) { + using (session.Activate()) { + TaskSequencesGenerator(session); + } + } + } + + private void TaskSequencesGenerator(Session session) + { + //ExecuteDelayed API + var cachedQueriesCountBefore = Domain.QueryCache.Count; + var currentId = 1; + var iterationsCount = 0; + while (currentId<80) { + var task = new Task(session, currentId); + var previousId = currentId; + currentId = task.GetMinimalLocationIdDelayedApi(); + Assert.AreEqual(previousId+1, currentId); + iterationsCount++; + } + var cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + + //ExecuteFuture API + cachedQueriesCountBefore = Domain.QueryCache.Count; + currentId = 1; + iterationsCount = 0; + while (currentId < 80) { + var task = new Task(session, currentId); + var previousId = currentId; + currentId = task.GetMinimalLocationIdFutureApi(); + Assert.AreEqual(previousId + 1, currentId); + iterationsCount++; + } + cachedQueriesCountAfter = Domain.QueryCache.Count; + Assert.Greater(cachedQueriesCountAfter, cachedQueriesCountBefore); + Assert.AreEqual(1, cachedQueriesCountAfter - cachedQueriesCountBefore); + } + + private int GetMinimalId(Session session, int startId) + { + var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() + where location.Active && location.Id.In(( + from loc in session.Query.All() + where loc.Id > startId && loc.Zone==null + orderby loc.Id + select loc.Id)) + select location); + session.Query.All(); + return locations.Min(field => field.Id); + } + + private int GetMinimalId(int startId) + { + var locations = Query.ExecuteFuture(() => from location in Query.All() + where location.Active && location.Id.In(( + from loc in Query.All() + where loc.Id > startId && loc.Zone == null + orderby loc.Id + select loc.Id)) + select location); + Query.All(); + return locations.Min(field => field.Id); + } + + private int GetMinimalIdWithZone(Session session, Zone zone) + { + var locations = session.Query.ExecuteDelayed(endpoint => from location in session.Query.All() + where location.Active && location.Id.In(( + from loc in session.Query.All() + where loc.Zone==zone + orderby loc.Id + select loc.Id)) + select location); + session.Query.All(); + return locations.Min(field => field.Id); + } + + private int GetMinimalIdWithZone(Zone zone) + { + var locations = Query.ExecuteFuture(() => from location in Query.All() + where location.Active && location.Id.In(( + from loc in Query.All() + where loc.Zone == zone + orderby loc.Id + select loc.Id)) + select location); + Query.All(); + return locations.Min(field => field.Id); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey.cs index b6515a7e19..0ed6e84840 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.08.19 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Issues.IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKeyModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKeyModel -{ - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Person : Entity - { - [Key, Field] - [Association] - public User Entity { get; private set; } - - public Person(Session session, User user) - : base(session) - { - Entity = user; - } - } - - [HierarchyRoot] - public class User : Entity - { - [Key,Field] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey : AutoBuildTest - { - [Test] - public void MainTest() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - - Assert.DoesNotThrow(()=> { - var domain = BuildDomain(domainConfiguration); - domain.Dispose(); - }); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.08.19 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKeyModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKeyModel +{ + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Person : Entity + { + [Key, Field] + [Association] + public User Entity { get; private set; } + + public Person(Session session, User user) + : base(session) + { + Entity = user; + } + } + + [HierarchyRoot] + public class User : Entity + { + [Key,Field] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0549_AssociationOwnerFieldIsEntityAndIsPrimaryKey : AutoBuildTest + { + [Test] + public void MainTest() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + + Assert.DoesNotThrow(()=> { + var domain = BuildDomain(domainConfiguration); + domain.Dispose(); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest.cs index 4464032dae..530c356d73 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest.cs @@ -1,144 +1,144 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.09.01 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTestModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTestModel -{ - public interface IHuman : IEntity - { - [Field, Key] - int Id { get; } - - [Field(Length = 50)] - string Name { get; set; } - - [Field(Length = 50)] - string Surname { get; set; } - - [Field] - DateTime Birthday { get; set; } - } - - [HierarchyRoot] - [Index("Surname", Unique = true)] - public abstract class Human : Entity, IHuman - { - public int Id { get; private set; } - - public string Name { get; set; } - - public string Surname { get; set; } - - public DateTime Birthday { get; set; } - } - - public class Teacher : Worker - { - [Field] - public EntitySet Disceplines { get; set; } - } - - public class Worker : Human - { - [Field] - public string Field { get; set; } - - [Field] - public WorkerContract Contract { get; set; } - } - - [HierarchyRoot] - public abstract class Contract : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Nullable = false)] - public int Number { get; set; } - - [Field(Nullable = false)] - public DateTime StartsWith { get; set; } - - [Field] - public DateTime EndsWith { get; set; } - } - - public class WorkerContract : Contract - { - [Field] - [Association(PairTo = "Contract")] - public EntitySet Workers { get; set; } - } - - [HierarchyRoot] - public class Discepline : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Disceplines")] - public EntitySet Teachers { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var juliaTeacher = session.Query.All().Single(el => el.Name=="Julia"); - var discipline = session.Query.All().Single(el => el.Name=="German"); - Assert.DoesNotThrow(() => juliaTeacher.Disceplines.Remove(discipline)); - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Worker).Assembly, typeof (Worker).Namespace); - return configuration; - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var englishTeacher = new Teacher { - Name = "Julia", - Surname = "Ololo", - Birthday = new DateTime(1987, 06, 18), - Contract = new WorkerContract { Number = 2, StartsWith = new DateTime(2012, 10, 20) }, - }; - var english = new Discepline { Name = "English" }; - var german = new Discepline { Name = "German" }; - englishTeacher.Disceplines.AddRange(new[] { english, german }); - transaction.Complete(); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.09.01 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTestModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTestModel +{ + public interface IHuman : IEntity + { + [Field, Key] + int Id { get; } + + [Field(Length = 50)] + string Name { get; set; } + + [Field(Length = 50)] + string Surname { get; set; } + + [Field] + DateTime Birthday { get; set; } + } + + [HierarchyRoot] + [Index("Surname", Unique = true)] + public abstract class Human : Entity, IHuman + { + public int Id { get; private set; } + + public string Name { get; set; } + + public string Surname { get; set; } + + public DateTime Birthday { get; set; } + } + + public class Teacher : Worker + { + [Field] + public EntitySet Disceplines { get; set; } + } + + public class Worker : Human + { + [Field] + public string Field { get; set; } + + [Field] + public WorkerContract Contract { get; set; } + } + + [HierarchyRoot] + public abstract class Contract : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Nullable = false)] + public int Number { get; set; } + + [Field(Nullable = false)] + public DateTime StartsWith { get; set; } + + [Field] + public DateTime EndsWith { get; set; } + } + + public class WorkerContract : Contract + { + [Field] + [Association(PairTo = "Contract")] + public EntitySet Workers { get; set; } + } + + [HierarchyRoot] + public class Discepline : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Disceplines")] + public EntitySet Teachers { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0550_IncorrectJoinSequenceTranslationInMySqlTest : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var juliaTeacher = session.Query.All().Single(el => el.Name=="Julia"); + var discipline = session.Query.All().Single(el => el.Name=="German"); + Assert.DoesNotThrow(() => juliaTeacher.Disceplines.Remove(discipline)); + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Worker).Assembly, typeof (Worker).Namespace); + return configuration; + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var englishTeacher = new Teacher { + Name = "Julia", + Surname = "Ololo", + Birthday = new DateTime(1987, 06, 18), + Contract = new WorkerContract { Number = 2, StartsWith = new DateTime(2012, 10, 20) }, + }; + var english = new Discepline { Name = "English" }; + var german = new Discepline { Name = "German" }; + englishTeacher.Disceplines.AddRange(new[] { english, german }); + transaction.Complete(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0551_IncorrectTypeIdFieldBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0551_IncorrectTypeIdFieldBug.cs index beb049bfe8..3d41234916 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0551_IncorrectTypeIdFieldBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0551_IncorrectTypeIdFieldBug.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.08.22 - -using NUnit.Framework; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0551_IncorrectTypeIdFieldBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0551_IncorrectTypeIdFieldBugModel -{ - [HierarchyRoot(IncludeTypeId = true, Clustered = true, InheritanceSchema = InheritanceSchema.ClassTable)] - public abstract class BaseEntity : Entity - { - [Field] - [Key(Position = 0)] - public int Id { get; private set; } - } - - public class Student : BaseEntity - { - [Field()] - public EntitySet Courses { get; private set; } - } - - public class Course : BaseEntity - { - [Field] - [Association(PairTo = "Courses", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Students { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0551_IncorrectTypeIdFieldBug : AutoBuildTest - { - [Test] - public void Test() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof (BaseEntity).Assembly, typeof (BaseEntity).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - using (var domain = Domain.Build(domainConfiguration)) - using (var session = domain.OpenSession()) { - using (session.Activate()) - using (var trans = session.OpenTransaction()) { - Student student1 = new Student(); - Course course1 = new Course(); - student1.Courses.Add(course1); - trans.Complete(); - } - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.08.22 + +using NUnit.Framework; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0551_IncorrectTypeIdFieldBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0551_IncorrectTypeIdFieldBugModel +{ + [HierarchyRoot(IncludeTypeId = true, Clustered = true, InheritanceSchema = InheritanceSchema.ClassTable)] + public abstract class BaseEntity : Entity + { + [Field] + [Key(Position = 0)] + public int Id { get; private set; } + } + + public class Student : BaseEntity + { + [Field()] + public EntitySet Courses { get; private set; } + } + + public class Course : BaseEntity + { + [Field] + [Association(PairTo = "Courses", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Students { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0551_IncorrectTypeIdFieldBug : AutoBuildTest + { + [Test] + public void Test() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof (BaseEntity).Assembly, typeof (BaseEntity).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + using (var domain = Domain.Build(domainConfiguration)) + using (var session = domain.OpenSession()) { + using (session.Activate()) + using (var trans = session.OpenTransaction()) { + Student student1 = new Student(); + Course course1 = new Course(); + student1.Courses.Add(course1); + trans.Complete(); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0553_IncorrectLeftJoinOnNotNullEntityField.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0553_IncorrectLeftJoinOnNotNullEntityField.cs index 1d3ff01fc6..3356de0776 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0553_IncorrectLeftJoinOnNotNullEntityField.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0553_IncorrectLeftJoinOnNotNullEntityField.cs @@ -1,237 +1,237 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.09.08 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0553_IncorrectLeftJoinOnNotNullEntityFieldModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0553_IncorrectLeftJoinOnNotNullEntityFieldModel -{ - [Serializable] - [HierarchyRoot] - public class Employee : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - } - - [Serializable] - public class EmployeeWithCar : Employee - { - [Field(Nullable = false)] - public Car Car { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Car : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - } - - public class BaseClass : Entity - { - [Field, Key] - public int Id { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Job : BaseClass - { - [Field(Nullable = false)] - public Location Location { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Invoice : BaseClass - { - [Field] - public Job Job { get; set; } - - [Field(Nullable = true)] - public Customer Customer { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Location : BaseClass - { - [Field] - public Address Address { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Address : BaseClass - { - [Field] - public string Street { get; set; } - } - - [HierarchyRoot] - public class Customer : BaseClass - { - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0553_IncorrectLeftJoinOnNotNullEntityField : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof(Car).Assembly, typeof(Car).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - return domainConfiguration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var car = new Car(); - new EmployeeWithCar { Car = car }; - new Employee(); - new Employee(); - - var customer = new Customer(); - for (var i = 0; i < 10; i++) { - if (i % 2==0) { - var job = new Job() { - Location = new Location() { - Address = new Address() { - Street = string.Format("{0} street", i + 1.ToString()) - } - } - }; - var invoice = new Invoice() {Customer = customer, Job = job}; - } - else { - var invoice = new Invoice() { Customer = customer }; - } - } - t.Complete(); - } - } - - [Test] - public void BadWorkTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var badResult = session.Query.All() - .LeftJoin( - session.Query.All(), - e => e.Id, - ewc => ewc.Id, - (e, ewc) => new { - e.Id, - CarObject = ewc.Car - }); - - Assert.AreEqual(3, badResult.Count()); - } - } - - [Test] - public void GoodWorkTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var goodResult = session.Query.All() - .LeftJoin( - session.Query.All(), - e => e.Id, - ewc => ewc.Id, - (e, ewc) => new { - e.Id, - Car = ewc.Car.Id - }); - Assert.AreEqual(3, goodResult.Count()); - } - } - - [Test] - public void WorkaroundTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var wordaround = session.Query.All() - .LeftJoin( - session.Query.All(), - e => e.Id, - ewc => ewc.Id, - (e, ewc) => new { - e.Id, - CarId = ewc.Car.Id - }) - .LeftJoin( - session.Query.All(), - e => e.CarId, - c => c.Id, - (e, c) => new { - e.Id, - Car = c - }); - Assert.AreEqual(3, wordaround.Count()); - } - } - - [Test] - public void Test01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var result = (from i in session.Query.All() - from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() - where i.Customer.Id==customer.Id - select new {i.Id, Location = j!=null && j.Location!=null ? j.Location.Address.Street : ""}).ToList(); - Assert.AreEqual(10, result.Count); - } - } - - [Test] - public void Test02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var results = (from i in session.Query.All() - from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() - select new {i.Id, Location = j.Location}).Where(el => el.Location!=null || string.IsNullOrEmpty(el.Location.Address.Street)).ToList(); - Assert.AreEqual(5, results.Count); - } - } - - [Test] - public void Test3() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var cusomer = session.Query.All().First(); - var result = (from i in session.Query.All() - from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() - from l in session.Query.All().Where(l => l==j.Location).DefaultIfEmpty() - where i.Customer.Id==cusomer.Id - select new { i.Id, Location = l!=null ? l.Address.Street : "", }).ToList(); - Assert.AreEqual(10, result.Count); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.09.08 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0553_IncorrectLeftJoinOnNotNullEntityFieldModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0553_IncorrectLeftJoinOnNotNullEntityFieldModel +{ + [Serializable] + [HierarchyRoot] + public class Employee : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + } + + [Serializable] + public class EmployeeWithCar : Employee + { + [Field(Nullable = false)] + public Car Car { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Car : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + } + + public class BaseClass : Entity + { + [Field, Key] + public int Id { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Job : BaseClass + { + [Field(Nullable = false)] + public Location Location { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Invoice : BaseClass + { + [Field] + public Job Job { get; set; } + + [Field(Nullable = true)] + public Customer Customer { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Location : BaseClass + { + [Field] + public Address Address { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Address : BaseClass + { + [Field] + public string Street { get; set; } + } + + [HierarchyRoot] + public class Customer : BaseClass + { + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0553_IncorrectLeftJoinOnNotNullEntityField : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof(Car).Assembly, typeof(Car).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + return domainConfiguration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var car = new Car(); + new EmployeeWithCar { Car = car }; + new Employee(); + new Employee(); + + var customer = new Customer(); + for (var i = 0; i < 10; i++) { + if (i % 2==0) { + var job = new Job() { + Location = new Location() { + Address = new Address() { + Street = string.Format("{0} street", i + 1.ToString()) + } + } + }; + var invoice = new Invoice() {Customer = customer, Job = job}; + } + else { + var invoice = new Invoice() { Customer = customer }; + } + } + t.Complete(); + } + } + + [Test] + public void BadWorkTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var badResult = session.Query.All() + .LeftJoin( + session.Query.All(), + e => e.Id, + ewc => ewc.Id, + (e, ewc) => new { + e.Id, + CarObject = ewc.Car + }); + + Assert.AreEqual(3, badResult.Count()); + } + } + + [Test] + public void GoodWorkTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var goodResult = session.Query.All() + .LeftJoin( + session.Query.All(), + e => e.Id, + ewc => ewc.Id, + (e, ewc) => new { + e.Id, + Car = ewc.Car.Id + }); + Assert.AreEqual(3, goodResult.Count()); + } + } + + [Test] + public void WorkaroundTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var wordaround = session.Query.All() + .LeftJoin( + session.Query.All(), + e => e.Id, + ewc => ewc.Id, + (e, ewc) => new { + e.Id, + CarId = ewc.Car.Id + }) + .LeftJoin( + session.Query.All(), + e => e.CarId, + c => c.Id, + (e, c) => new { + e.Id, + Car = c + }); + Assert.AreEqual(3, wordaround.Count()); + } + } + + [Test] + public void Test01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var result = (from i in session.Query.All() + from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() + where i.Customer.Id==customer.Id + select new {i.Id, Location = j!=null && j.Location!=null ? j.Location.Address.Street : ""}).ToList(); + Assert.AreEqual(10, result.Count); + } + } + + [Test] + public void Test02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var results = (from i in session.Query.All() + from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() + select new {i.Id, Location = j.Location}).Where(el => el.Location!=null || string.IsNullOrEmpty(el.Location.Address.Street)).ToList(); + Assert.AreEqual(5, results.Count); + } + } + + [Test] + public void Test3() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var cusomer = session.Query.All().First(); + var result = (from i in session.Query.All() + from j in session.Query.All().Where(j => j==i.Job).DefaultIfEmpty() + from l in session.Query.All().Where(l => l==j.Location).DefaultIfEmpty() + where i.Customer.Id==cusomer.Id + select new { i.Id, Location = l!=null ? l.Address.Street : "", }).ToList(); + Assert.AreEqual(10, result.Count); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0555_KeyRemapBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0555_KeyRemapBug.cs index b80afd6c54..be8fe1b2ac 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0555_KeyRemapBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0555_KeyRemapBug.cs @@ -1,159 +1,159 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.09.19 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0555_KeyRemapBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0555_KeyRemapBugModel -{ - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class EntityWithEntityKeyField2 : Entity - { - [Field, Key(1)] - public TestEntity EntityKey1 { get; set; } - - [Field, Key(0)] - public EntityWithEntityKeyField1 EntityKey2 { get; set; } - - [Field] - public string Text { get; set; } - - public EntityWithEntityKeyField2(Session session, TestEntity key1, EntityWithEntityKeyField1 key2) - : base(session, key2, key1) - { - } - } - - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class EntityWithEntityKeyField1 : Entity - { - [Key, Field] - public TestEntity EntityKey { get; private set; } - - [Field] - public string Text { get; set; } - - public EntityWithEntityKeyField1(Session session, TestEntity key) - : base(session, key) - { - } - } - - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [HierarchyRoot] - [KeyGenerator] - public class TestEntity2 : Entity - { - private static int Increment = 1; - - [Field, Key(0)] - public int Key1 { get; set; } - - [Field, Key(1)] - public TestEntity Key2 { get; set; } - - [Field] - public string Text { get; set; } - - public TestEntity2(Session session, TestEntity key2) - : base (session, Increment, key2) - { - Increment++; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0555_KeyRemapBug : AutoBuildTest - { - [Test] - public void Test01() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { - var testEntity = new TestEntity {Text = "TestEntityTest01"}; - var entityWithEntityKey = new EntityWithEntityKeyField1(session, testEntity); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); - Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.LessThan(0)); - - Assert.DoesNotThrow(() => session.SaveChanges()); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.GreaterThan(0)); - } - } - - [Test] - public void Test02() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { - var testEntity = new TestEntity {Text = "TestEntityTest02"}; - var entityWithEntityKey = new EntityWithEntityKeyField1(session, testEntity); - var entityWithEntityKey1 = new EntityWithEntityKeyField2(session, testEntity, entityWithEntityKey); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); - Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.LessThan(0)); - Assert.That(entityWithEntityKey1.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey1.Key.Value.GetValue(0), Is.LessThan(0)); - Assert.That(entityWithEntityKey1.Key.Value.GetValue(1), Is.LessThan(0)); - - Assert.DoesNotThrow(() => session.SaveChanges()); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.GreaterThan(0)); - Assert.That(entityWithEntityKey1.Key.IsTemporary(Domain), Is.False); - Assert.That(entityWithEntityKey1.Key.Value.GetValue(0), Is.GreaterThan(0)); - Assert.That(entityWithEntityKey1.Key.Value.GetValue(1), Is.GreaterThan(0)); - } - } - - [Test] - public void Test03() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { - var testEntity = new TestEntity { Text = "TestEntityTest03" }; - var testEntity2 = new TestEntity2(session, testEntity); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); - Assert.That(testEntity2.Key.IsTemporary(Domain), Is.False); - Assert.That(testEntity2.Key.Value.GetValue(1), Is.LessThan(0)); - - Assert.DoesNotThrow(() => session.SaveChanges()); - - Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); - Assert.That(testEntity2.Key.IsTemporary(Domain), Is.False); - Assert.That(testEntity2.Key.Value.GetValue(1), Is.GreaterThan(0)); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.09.19 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0555_KeyRemapBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0555_KeyRemapBugModel +{ + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class EntityWithEntityKeyField2 : Entity + { + [Field, Key(1)] + public TestEntity EntityKey1 { get; set; } + + [Field, Key(0)] + public EntityWithEntityKeyField1 EntityKey2 { get; set; } + + [Field] + public string Text { get; set; } + + public EntityWithEntityKeyField2(Session session, TestEntity key1, EntityWithEntityKeyField1 key2) + : base(session, key2, key1) + { + } + } + + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class EntityWithEntityKeyField1 : Entity + { + [Key, Field] + public TestEntity EntityKey { get; private set; } + + [Field] + public string Text { get; set; } + + public EntityWithEntityKeyField1(Session session, TestEntity key) + : base(session, key) + { + } + } + + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [HierarchyRoot] + [KeyGenerator] + public class TestEntity2 : Entity + { + private static int Increment = 1; + + [Field, Key(0)] + public int Key1 { get; set; } + + [Field, Key(1)] + public TestEntity Key2 { get; set; } + + [Field] + public string Text { get; set; } + + public TestEntity2(Session session, TestEntity key2) + : base (session, Increment, key2) + { + Increment++; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0555_KeyRemapBug : AutoBuildTest + { + [Test] + public void Test01() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { + var testEntity = new TestEntity {Text = "TestEntityTest01"}; + var entityWithEntityKey = new EntityWithEntityKeyField1(session, testEntity); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); + Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.LessThan(0)); + + Assert.DoesNotThrow(() => session.SaveChanges()); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.GreaterThan(0)); + } + } + + [Test] + public void Test02() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { + var testEntity = new TestEntity {Text = "TestEntityTest02"}; + var entityWithEntityKey = new EntityWithEntityKeyField1(session, testEntity); + var entityWithEntityKey1 = new EntityWithEntityKeyField2(session, testEntity, entityWithEntityKey); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); + Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.LessThan(0)); + Assert.That(entityWithEntityKey1.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey1.Key.Value.GetValue(0), Is.LessThan(0)); + Assert.That(entityWithEntityKey1.Key.Value.GetValue(1), Is.LessThan(0)); + + Assert.DoesNotThrow(() => session.SaveChanges()); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey.Key.Value.GetValue(0), Is.GreaterThan(0)); + Assert.That(entityWithEntityKey1.Key.IsTemporary(Domain), Is.False); + Assert.That(entityWithEntityKey1.Key.Value.GetValue(0), Is.GreaterThan(0)); + Assert.That(entityWithEntityKey1.Key.Value.GetValue(1), Is.GreaterThan(0)); + } + } + + [Test] + public void Test03() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { + var testEntity = new TestEntity { Text = "TestEntityTest03" }; + var testEntity2 = new TestEntity2(session, testEntity); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.True); + Assert.That(testEntity2.Key.IsTemporary(Domain), Is.False); + Assert.That(testEntity2.Key.Value.GetValue(1), Is.LessThan(0)); + + Assert.DoesNotThrow(() => session.SaveChanges()); + + Assert.That(testEntity.Key.IsTemporary(Domain), Is.False); + Assert.That(testEntity2.Key.IsTemporary(Domain), Is.False); + Assert.That(testEntity2.Key.Value.GetValue(1), Is.GreaterThan(0)); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates.cs index 54c741542b..374e6f3fbf 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.09.26 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0556_ArithmeticExceptionWhenSubstractionOfDatesModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0556_ArithmeticExceptionWhenSubstractionOfDatesModel -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public DateTime CreatedOn { get; set; } - - [Field] - public DateTime InvoicedOn { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof(Invoice).Assembly, typeof(Invoice).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - return domainConfiguration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(10)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(100)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(1000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(10000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(100000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(106751)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(120000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(130000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(140000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(150000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(160000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(170000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(180000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(190000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(200000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(300000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(400000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(500000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(600000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(700000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(800000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(900000)}; - new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(1000000)}; - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All().Where(invoice => (invoice.CreatedOn - invoice.InvoicedOn) > TimeSpan.FromHours(1)).ToList(); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.09.26 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0556_ArithmeticExceptionWhenSubstractionOfDatesModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0556_ArithmeticExceptionWhenSubstractionOfDatesModel +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public DateTime CreatedOn { get; set; } + + [Field] + public DateTime InvoicedOn { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0556_ArithmeticExceptionWhenSubstractionOfDates : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof(Invoice).Assembly, typeof(Invoice).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + return domainConfiguration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(10)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(100)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(1000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(10000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(100000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(106751)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(120000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(130000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(140000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(150000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(160000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(170000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(180000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(190000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(200000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(300000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(400000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(500000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(600000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(700000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(800000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(900000)}; + new Invoice {CreatedOn = DateTime.MinValue.AddYears(100), InvoicedOn = DateTime.MinValue.AddYears(100).AddDays(1000000)}; + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All().Where(invoice => (invoice.CreatedOn - invoice.InvoicedOn) > TimeSpan.FromHours(1)).ToList(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed.cs index cc22df7271..73ab89483d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed.cs @@ -1,217 +1,217 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.10.03 - -using System; -using System.Globalization; -using System.Linq; -using System.Transactions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailedModel; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailedModel -{ - [HierarchyRoot] - [Index("UniqueField", Unique= true)] - public class Call : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string ConflictedField { get; set; } - - [Field(Length = 250)] - public string UniqueField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - class IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed : AutoBuildTest - { - private bool conflictAlreadyCatched; - private object locableObject = new object(); - private DifferentialTuple globalTupleToTest; - - [Test] - public void RestoringModifiedEntityWhenPersistFailedTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); - Assert.IsNull(firstCall.State.DifferentialTuple.Difference); - firstCall.UniqueField = "2"; - Assert.IsNotNull(firstCall.State.DifferentialTuple.Difference); - bool exceptionCatched = false; - try { - session.SaveChanges(); - } - catch(Exception exception) { - exceptionCatched = true; - } - Assert.IsTrue(exceptionCatched); - Assert.IsNotNull(firstCall.State.DifferentialTuple.Difference); - Assert.AreEqual("2", firstCall.UniqueField); - } - } - - [Test] - public void RestoringNewEntityWhenPersistFailed() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); - firstCall.UniqueField = "2"; - var secondCall = new Call{ConflictedField = "new entity"}; - Assert.IsNull(secondCall.State.DifferentialTuple.Difference); - bool exceptionCatched = false; - try { - session.SaveChanges(); - } - catch (Exception exception) { - exceptionCatched = true; - } - Assert.IsTrue(exceptionCatched); - Assert.IsNull(secondCall.State.DifferentialTuple.Difference); - } - } - - [Test] - public void RestoringNewModifiedEntityWhenPersistFailed() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); - firstCall.UniqueField = "2"; - var secondCall = new Call { ConflictedField = "new entity" }; - Assert.IsNull(secondCall.State.DifferentialTuple.Difference); - secondCall.ConflictedField = "new modified entity"; - Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); - bool exceptionCatched = false; - try { - session.SaveChanges(); - } - catch (Exception exception) { - exceptionCatched = true; - } - Assert.IsTrue(exceptionCatched); - Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); - Assert.AreEqual("new modified entity", secondCall.ConflictedField); - } - } - - [Test] - public void RestoringDeletedEntityWhenPersistWasFailed() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); - var secondCall = session.Query.All().First(el => el.ConflictedField == "4"); - firstCall.UniqueField = "2"; - Assert.IsNull(secondCall.State.DifferentialTuple.Difference); - secondCall.Remove(); - Assert.IsTrue(secondCall.IsRemoved); - Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); - bool exceptionCatched = false; - try { - session.SaveChanges(); - } - catch (Exception exception) { - exceptionCatched = true; - } - Assert.IsTrue(exceptionCatched); - Assert.IsTrue(secondCall.IsRemoved); - Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); - } - } - - [Test] - public void RestoringEditedAndDeletedEntityWhenPersistWasFailed() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); - var secondCall = session.Query.All().First(el => el.ConflictedField == "4"); - firstCall.UniqueField = "2"; - Assert.IsNull(secondCall.State.DifferentialTuple.Difference); - secondCall.ConflictedField = "edited removed entity"; - Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); - secondCall.Remove(); - Assert.IsTrue(secondCall.IsRemoved); - Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); - bool exceptionCatched = false; - try { - session.SaveChanges(); - } - catch (Exception exception) { - exceptionCatched = true; - } - Assert.IsTrue(exceptionCatched); - Assert.IsTrue(secondCall.IsRemoved); - Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); - } - } - - [Test] - public void RestoreDifferetialTupleTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var call = session.Query.All().First(); - var originTuple = call.State.DifferentialTuple.Origin.Clone(); - Assert.IsNotNull(call.State.DifferentialTuple.Origin); - Assert.IsNull(call.State.DifferentialTuple.Difference); - call.ConflictedField = "aaaa"; - Assert.IsNotNull(call.State.DifferentialTuple.Origin); - Assert.IsNotNull(call.State.DifferentialTuple.Difference); - var originTupleAfterChange = call.State.DifferentialTuple.Origin.Clone(); - var differenceTupleAfterChange = call.State.DifferentialTuple.Difference.Clone(); - call.State.CommitDifference(); - Assert.IsNotNull(call.State.DifferentialTuple.Origin); - Assert.AreNotEqual(originTupleAfterChange, call.State.DifferentialTuple.Origin); - Assert.IsNull(call.State.DifferentialTuple.Difference); - call.State.RestoreDifference(); - Assert.IsNotNull(call.State.DifferentialTuple.Origin); - Assert.AreEqual(originTupleAfterChange, call.State.DifferentialTuple.Origin); - Assert.IsNotNull(call.State.DifferentialTuple.Difference); - Assert.AreEqual(differenceTupleAfterChange, call.State.DifferentialTuple.Difference); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof (Call).Assembly, typeof(Call).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - return domainConfiguration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new Call {ConflictedField = "1", UniqueField = "1"}; - new Call {ConflictedField = "2", UniqueField = "2"}; - new Call {ConflictedField = "3", UniqueField = "3"}; - new Call {ConflictedField = "4", UniqueField = "4"}; - new Call {ConflictedField = "5", UniqueField = "5"}; - new Call {ConflictedField = "6", UniqueField = "6"}; - new Call {ConflictedField = "7", UniqueField = "7"}; - new Call {ConflictedField = "8", UniqueField = "8"}; - new Call {ConflictedField = "9", UniqueField = "9"}; - new Call {ConflictedField = "10", UniqueField = "10"}; - new Call {ConflictedField = "11", UniqueField = "11"}; - new Call {ConflictedField = "12", UniqueField = "12"}; - tx.Complete(); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.10.03 + +using System; +using System.Globalization; +using System.Linq; +using System.Transactions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailedModel; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailedModel +{ + [HierarchyRoot] + [Index("UniqueField", Unique= true)] + public class Call : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string ConflictedField { get; set; } + + [Field(Length = 250)] + public string UniqueField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + class IssueJira0557_RollbackOfDifferentialTupleDifferenceWhenPersistFailed : AutoBuildTest + { + private bool conflictAlreadyCatched; + private object locableObject = new object(); + private DifferentialTuple globalTupleToTest; + + [Test] + public void RestoringModifiedEntityWhenPersistFailedTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); + Assert.IsNull(firstCall.State.DifferentialTuple.Difference); + firstCall.UniqueField = "2"; + Assert.IsNotNull(firstCall.State.DifferentialTuple.Difference); + bool exceptionCatched = false; + try { + session.SaveChanges(); + } + catch(Exception exception) { + exceptionCatched = true; + } + Assert.IsTrue(exceptionCatched); + Assert.IsNotNull(firstCall.State.DifferentialTuple.Difference); + Assert.AreEqual("2", firstCall.UniqueField); + } + } + + [Test] + public void RestoringNewEntityWhenPersistFailed() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); + firstCall.UniqueField = "2"; + var secondCall = new Call{ConflictedField = "new entity"}; + Assert.IsNull(secondCall.State.DifferentialTuple.Difference); + bool exceptionCatched = false; + try { + session.SaveChanges(); + } + catch (Exception exception) { + exceptionCatched = true; + } + Assert.IsTrue(exceptionCatched); + Assert.IsNull(secondCall.State.DifferentialTuple.Difference); + } + } + + [Test] + public void RestoringNewModifiedEntityWhenPersistFailed() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); + firstCall.UniqueField = "2"; + var secondCall = new Call { ConflictedField = "new entity" }; + Assert.IsNull(secondCall.State.DifferentialTuple.Difference); + secondCall.ConflictedField = "new modified entity"; + Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); + bool exceptionCatched = false; + try { + session.SaveChanges(); + } + catch (Exception exception) { + exceptionCatched = true; + } + Assert.IsTrue(exceptionCatched); + Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); + Assert.AreEqual("new modified entity", secondCall.ConflictedField); + } + } + + [Test] + public void RestoringDeletedEntityWhenPersistWasFailed() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); + var secondCall = session.Query.All().First(el => el.ConflictedField == "4"); + firstCall.UniqueField = "2"; + Assert.IsNull(secondCall.State.DifferentialTuple.Difference); + secondCall.Remove(); + Assert.IsTrue(secondCall.IsRemoved); + Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); + bool exceptionCatched = false; + try { + session.SaveChanges(); + } + catch (Exception exception) { + exceptionCatched = true; + } + Assert.IsTrue(exceptionCatched); + Assert.IsTrue(secondCall.IsRemoved); + Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); + } + } + + [Test] + public void RestoringEditedAndDeletedEntityWhenPersistWasFailed() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var firstCall = session.Query.All().First(el => el.ConflictedField=="3"); + var secondCall = session.Query.All().First(el => el.ConflictedField == "4"); + firstCall.UniqueField = "2"; + Assert.IsNull(secondCall.State.DifferentialTuple.Difference); + secondCall.ConflictedField = "edited removed entity"; + Assert.IsNotNull(secondCall.State.DifferentialTuple.Difference); + secondCall.Remove(); + Assert.IsTrue(secondCall.IsRemoved); + Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); + bool exceptionCatched = false; + try { + session.SaveChanges(); + } + catch (Exception exception) { + exceptionCatched = true; + } + Assert.IsTrue(exceptionCatched); + Assert.IsTrue(secondCall.IsRemoved); + Assert.AreEqual(secondCall.PersistenceState, PersistenceState.Removed); + } + } + + [Test] + public void RestoreDifferetialTupleTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var call = session.Query.All().First(); + var originTuple = call.State.DifferentialTuple.Origin.Clone(); + Assert.IsNotNull(call.State.DifferentialTuple.Origin); + Assert.IsNull(call.State.DifferentialTuple.Difference); + call.ConflictedField = "aaaa"; + Assert.IsNotNull(call.State.DifferentialTuple.Origin); + Assert.IsNotNull(call.State.DifferentialTuple.Difference); + var originTupleAfterChange = call.State.DifferentialTuple.Origin.Clone(); + var differenceTupleAfterChange = call.State.DifferentialTuple.Difference.Clone(); + call.State.CommitDifference(); + Assert.IsNotNull(call.State.DifferentialTuple.Origin); + Assert.AreNotEqual(originTupleAfterChange, call.State.DifferentialTuple.Origin); + Assert.IsNull(call.State.DifferentialTuple.Difference); + call.State.RestoreDifference(); + Assert.IsNotNull(call.State.DifferentialTuple.Origin); + Assert.AreEqual(originTupleAfterChange, call.State.DifferentialTuple.Origin); + Assert.IsNotNull(call.State.DifferentialTuple.Difference); + Assert.AreEqual(differenceTupleAfterChange, call.State.DifferentialTuple.Difference); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof (Call).Assembly, typeof(Call).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + return domainConfiguration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new Call {ConflictedField = "1", UniqueField = "1"}; + new Call {ConflictedField = "2", UniqueField = "2"}; + new Call {ConflictedField = "3", UniqueField = "3"}; + new Call {ConflictedField = "4", UniqueField = "4"}; + new Call {ConflictedField = "5", UniqueField = "5"}; + new Call {ConflictedField = "6", UniqueField = "6"}; + new Call {ConflictedField = "7", UniqueField = "7"}; + new Call {ConflictedField = "8", UniqueField = "8"}; + new Call {ConflictedField = "9", UniqueField = "9"}; + new Call {ConflictedField = "10", UniqueField = "10"}; + new Call {ConflictedField = "11", UniqueField = "11"}; + new Call {ConflictedField = "12", UniqueField = "12"}; + tx.Complete(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist.cs index 455f191eb2..0142ed5554 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist.cs @@ -1,161 +1,161 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.10.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Tests.Issues.IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersistModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersistModel -{ - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - - [Field] - public EntitySet Memberships { get; set; } - } - - [HierarchyRoot] - public class Membership : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public MembershipStatus Status { get; set; } - - [Field] - public MembershipType Type { get; set; } - } - - [HierarchyRoot] - public class MembershipType : Entity - { - [Field, Key] - public int Id { get; set; } - } - - public enum MembershipStatus - { - Active, - Inactive - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - - public class IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist : AutoBuildTest - { - private Key jobKey; - - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (MembershipType).Assembly, typeof (MembershipType).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var firstType = new MembershipType(); - var secondType = new MembershipType(); - var customer = new Customer(); - customer.Memberships.Add(new Membership { Status = MembershipStatus.Active, Type = firstType }); - customer.Memberships.Add(new Membership { Status = MembershipStatus.Active, Type = secondType }); - customer.Memberships.Add(new Membership { Status = MembershipStatus.Inactive, Type = firstType }); - customer.Memberships.Add(new Membership { Status = MembershipStatus.Inactive, Type = secondType }); - jobKey = new Job { Customer = customer }.Key; - transaction.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var countBeforeInsertion = session.Query.All().Count(); - var membership = new Membership() {Type = new MembershipType(), Status = MembershipStatus.Active}; - var countAfterInsertionUsingDelayedQuery = session.Query.ExecuteDelayed(endpoint => endpoint.All().Count()); - GetAllMembershipWithTypes(GetMembershipTypes(jobKey)); - Assert.Greater(countAfterInsertionUsingDelayedQuery.Value, countBeforeInsertion); - Assert.AreEqual(1, countAfterInsertionUsingDelayedQuery.Value - countBeforeInsertion); - } - } - - [Test] - public void UserDefinedDelayedQueries() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var firstCustomer = session.Query.All().First(); - var allMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All()); - var countOfMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Count()); - var allActiveMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Where(el => el.Status==MembershipStatus.Active)); - var countOfActiveMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Count(el => el.Status==MembershipStatus.Active)); - var userDefinedQueryTasks = GetUserDefinedQueryTasks(session); - Assert.AreEqual(4, userDefinedQueryTasks.Count); - //must be fetching without execution of user defined queries - var customerMembership = firstCustomer.Memberships.ToList(); - userDefinedQueryTasks = GetUserDefinedQueryTasks(session); - Assert.AreEqual(4, userDefinedQueryTasks.Count); - } - } - - private IQueryable GetMembershipTypes(Key key) - { - var membershipTypes = Query.Single(key).Customer.Memberships - .Where(m => m.Status == MembershipStatus.Active) - .Select(m => m.Type); - return membershipTypes; - } - - private void GetAllMembershipWithTypes(IQueryable types) - { - var memberships = Query.All().Where(el => el.Type.In(types)).ToList(); - } - - private List GetUserDefinedQueryTasks(Session session) - { - var type = session.GetType(); - var property = type.GetField("userDefinedQueryTasks", BindingFlags.Instance | BindingFlags.NonPublic); - var result = property.GetValue(session); - return (List) result; - } - - private List GetInternalQueryTasks(Session session) - { - var type = session.GetType(); - var property = type.GetField("internalQueryTasks", BindingFlags.Instance | BindingFlags.NonPublic); - var result = property.GetValue(session); - return (List)result; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.10.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Tests.Issues.IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersistModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersistModel +{ + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + + [Field] + public EntitySet Memberships { get; set; } + } + + [HierarchyRoot] + public class Membership : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public MembershipStatus Status { get; set; } + + [Field] + public MembershipType Type { get; set; } + } + + [HierarchyRoot] + public class MembershipType : Entity + { + [Field, Key] + public int Id { get; set; } + } + + public enum MembershipStatus + { + Active, + Inactive + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + + public class IssueJira0558_InternalOperationForcedExecutionOfDelayedQueriesWithoutPersist : AutoBuildTest + { + private Key jobKey; + + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (MembershipType).Assembly, typeof (MembershipType).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var firstType = new MembershipType(); + var secondType = new MembershipType(); + var customer = new Customer(); + customer.Memberships.Add(new Membership { Status = MembershipStatus.Active, Type = firstType }); + customer.Memberships.Add(new Membership { Status = MembershipStatus.Active, Type = secondType }); + customer.Memberships.Add(new Membership { Status = MembershipStatus.Inactive, Type = firstType }); + customer.Memberships.Add(new Membership { Status = MembershipStatus.Inactive, Type = secondType }); + jobKey = new Job { Customer = customer }.Key; + transaction.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var countBeforeInsertion = session.Query.All().Count(); + var membership = new Membership() {Type = new MembershipType(), Status = MembershipStatus.Active}; + var countAfterInsertionUsingDelayedQuery = session.Query.ExecuteDelayed(endpoint => endpoint.All().Count()); + GetAllMembershipWithTypes(GetMembershipTypes(jobKey)); + Assert.Greater(countAfterInsertionUsingDelayedQuery.Value, countBeforeInsertion); + Assert.AreEqual(1, countAfterInsertionUsingDelayedQuery.Value - countBeforeInsertion); + } + } + + [Test] + public void UserDefinedDelayedQueries() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var firstCustomer = session.Query.All().First(); + var allMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All()); + var countOfMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Count()); + var allActiveMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Where(el => el.Status==MembershipStatus.Active)); + var countOfActiveMemberships = session.Query.ExecuteDelayed(queryEndpoint => queryEndpoint.All().Count(el => el.Status==MembershipStatus.Active)); + var userDefinedQueryTasks = GetUserDefinedQueryTasks(session); + Assert.AreEqual(4, userDefinedQueryTasks.Count); + //must be fetching without execution of user defined queries + var customerMembership = firstCustomer.Memberships.ToList(); + userDefinedQueryTasks = GetUserDefinedQueryTasks(session); + Assert.AreEqual(4, userDefinedQueryTasks.Count); + } + } + + private IQueryable GetMembershipTypes(Key key) + { + var membershipTypes = Query.Single(key).Customer.Memberships + .Where(m => m.Status == MembershipStatus.Active) + .Select(m => m.Type); + return membershipTypes; + } + + private void GetAllMembershipWithTypes(IQueryable types) + { + var memberships = Query.All().Where(el => el.Type.In(types)).ToList(); + } + + private List GetUserDefinedQueryTasks(Session session) + { + var type = session.GetType(); + var property = type.GetField("userDefinedQueryTasks", BindingFlags.Instance | BindingFlags.NonPublic); + var result = property.GetValue(session); + return (List) result; + } + + private List GetInternalQueryTasks(Session session) + { + var type = session.GetType(); + var property = type.GetField("internalQueryTasks", BindingFlags.Instance | BindingFlags.NonPublic); + var result = property.GetValue(session); + return (List)result; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0563_IncorrectPersistActionSequence.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0563_IncorrectPersistActionSequence.cs index cbaf4b882c..c2e24193b1 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0563_IncorrectPersistActionSequence.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0563_IncorrectPersistActionSequence.cs @@ -1,3068 +1,3068 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.10.27 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Validation; -using model1 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel1; -using model2 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel2; -using model3 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel3; -using model4 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel4; -using model5 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel5; -using model6 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel6; -using model7 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel7; -using model8 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel8; -using model9 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel9; -using model10 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel10; -using model11 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel11; -using model12 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel12; -using model13 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel13; -using model14 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel14; -using model15 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel15; -using model16 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel16; -using model17 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel17; -using model18 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel18; -using model19 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel19; -using model20 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel20; -using model21 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel21; -using model22 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel22; -using model23 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel23; -using model24 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel24; -using model25 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel25; -using model26 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel26; -using model27 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel27; - - -#region models -//ZeroToOne Location in Job is nullable -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel1 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//ZeroToOne Location in Job is not nullable -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel2 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne all nullable not paired -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel3 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is nullable and Job is not nullable, not paired -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel4 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is not nullable and Job is nullable, not paired -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel5 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location and Job both are not nullable, not paired -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel6 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne all nullable, paired on Location side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel7 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Location")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne all nullable, paired on Job side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel8 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - [Association(PairTo = "Job")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is nullable and Job is not nullable, paired on Location side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel9 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - [Association(PairTo = "Location")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is nullable and Job is not nullable, paired on Job side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel10 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - [Association(PairTo = "Job")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is not nullable and Job is nullable, paired on Location side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel11 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Location")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location is not nullable and Job is nullable, paired on Job side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel12 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - [Association(PairTo = "Job")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location and Job both are not nullable, paired on Location side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel13 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - [Association(PairTo = "Location")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToOne Location and Job both are not nullable, paired on Job side -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel14 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false), NotNullConstraint] - [Association(PairTo = "Job")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//Loop big Test -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel15 -{ - [HierarchyRoot] - public class A : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public B B { get; set; } - - [Field(Nullable = false)] - public NN NN { get; set; } - } - - [HierarchyRoot] - public class B : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public C C { get; set; } - } - - [HierarchyRoot] - public class C : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public D D { get; set; } - } - - [HierarchyRoot] - public class D : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public A A { get; set; } - } - - [HierarchyRoot] - public class NN : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public A A { get; set; } - } - - [HierarchyRoot] - public class NNN : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public NN NN { get; set; } - } - - [HierarchyRoot] - public class NNNN : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public NNN NNN { get; set; } - } -} - -//OneToMany, not paired -//Location is entity, -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel16 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, not paired -//Location is entity [Nullable = false], -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel17 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, not paired -//Location is EntitySet, -//Job is Entity -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel18 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, not paired -//Location is EntitySet, -//Job is Entity [Nullable = false] -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel19 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Job -//Location is entity, -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel20 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Jobs")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Job -//Location is entity [Nullable = false], -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel21 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - [Association(PairTo = "Jobs")] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Job -//Location is EntitySet, -//Job is Entity -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel22 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Job")] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Job -//Location is EntitySet, -//Job is Entity [Nullable = false] -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel23 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Job")] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Location -//Location is entity, -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel24 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Location")] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Location -//Location is entity [Nullable = false], -//Job is EntitySet -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel25 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - public Location Location { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Location = location; - location.Jobs.Add(this); - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Location")] - public EntitySet Jobs { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Location -//Location is EntitySet, -//Job is Entity -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel26 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - [Association(PairTo = "Locations")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} - -//OneToMany, association in Location -//Location is EntitySet, -//Job is Entity [Nullable = false] -namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel27 -{ - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Job Job { get; set; } - - public Invoice(Session session, Job job) - : base(session) - { - Job = job; - job.Invoice = this; - } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public EntitySet Locations { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public Opportunity Opportunity { get; set; } - - public Job(Session session, Customer customer, Location location) - : base(session) - { - Customer = customer; - Locations.Add(location); - location.Job = this; - Opportunity = new Opportunity(); - } - } - - [HierarchyRoot] - public class Opportunity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, NotNullConstraint] - [Association("Opportunity")] - public Job Job { get; private set; } - } - - [HierarchyRoot] - public class Location : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field(Nullable = false)] - [Association(PairTo="Locations")] - public Job Job { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Key, Field] - public int Id { get; set; } - } -} -#endregion - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0563_IncorrectPersistActionSequence : AutoBuildTest - { - [Test] - public void Model01Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model1.Customer).Assembly, typeof (model1.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model1.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model1.Location(); - var job = new model1.Job(session, customer, location); - new model1.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model02Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model2.Customer).Assembly, typeof (model2.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model2.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model2.Location(); - var job = new model2.Job(session, customer, location); - new model2.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model03Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model3.Customer).Assembly, typeof (model3.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model3.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model3.Location(); - var job = new model3.Job(session, customer, location); - new model3.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model04Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model4.Customer).Assembly, typeof (model4.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model4.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model4.Location(); - var job = new model4.Job(session, customer, location); - new model4.Invoice(session, job); - location.Job = job; - tx.Complete(); - } - } - } - - [Test] - public void Model05Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model5.Customer).Assembly, typeof (model5.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model5.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model5.Location(); - var job = new model5.Job(session, customer, location); - new model5.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model06Test() - { - Require.ProviderIsNot(StorageProvider.MySql); - Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert - var config = BuildConfiguration(); - config.Types.Register(typeof (model6.Customer).Assembly, typeof (model6.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model6.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model6.Location(); - var job = new model6.Job(session, customer, location); - new model6.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model06TestForMySql() - { - Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); - var config = BuildConfiguration(); - config.Types.Register(typeof (model6.Customer).Assembly, typeof (model6.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model6.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model6.Location(); - var job = new model6.Job(session, customer, location); - new model6.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model07Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model7.Customer).Assembly, typeof (model7.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model7.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model7.Location(); - var job = new model7.Job(session, customer, location); - new model7.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model08Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model8.Customer).Assembly, typeof (model8.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model8.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model8.Location(); - var job = new model8.Job(session, customer, location); - new model8.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model09Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model9.Customer).Assembly, typeof (model9.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model9.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model9.Location(); - var job = new model9.Job(session, customer, location); - new model9.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model10Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model10.Customer).Assembly, typeof (model10.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model10.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model10.Location(); - var job = new model10.Job(session, customer, location); - new model10.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model11Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model11.Customer).Assembly, typeof (model11.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model11.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model11.Location(); - var job = new model11.Job(session, customer, location); - new model11.Invoice(session, job); - location.Job = job; - tx.Complete(); - } - } - } - - [Test] - public void Model12Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model12.Customer).Assembly, typeof (model12.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model12.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model12.Location(); - var job = new model12.Job(session, customer, location); - new model12.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model13Test() - { - Require.ProviderIsNot(StorageProvider.MySql); - Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert - var config = BuildConfiguration(); - config.Types.Register(typeof (model13.Customer).Assembly, typeof (model13.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model13.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model13.Location(); - var job = new model13.Job(session, customer, location); - new model13.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model13TestForMySql() - { - Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); - var config = BuildConfiguration(); - config.Types.Register(typeof (model13.Customer).Assembly, typeof (model13.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model13.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model13.Location(); - var job = new model13.Job(session, customer, location); - new model13.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model14Test() - { - Require.ProviderIsNot(StorageProvider.MySql); - Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert - var config = BuildConfiguration(); - config.Types.Register(typeof (model14.Customer).Assembly, typeof (model14.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model14.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model14.Location(); - var job = new model14.Job(session, customer, location); - new model14.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model14TestForMySql() - { - Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); - - var config = BuildConfiguration(); - config.Types.Register(typeof (model14.Customer).Assembly, typeof (model14.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model14.Customer(); - tx.Complete(); - } - - Assert.Throws(() => { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model14.Location(); - var job = new model14.Job(session, customer, location); - new model14.Invoice(session, job); - tx.Complete(); - } - }); - } - } - - [Test] - public void Model15Test() - { - Require.ProviderIsNot(StorageProvider.MySql); - Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert - var configuration = BuildConfiguration(); - configuration.Types.Register(typeof (model15.A).Assembly, typeof (model15.A).Namespace); - - Assert.Throws(() => { - using (var domain = Domain.Build(configuration)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var a = new model15.A(); - var b = new model15.B(); - a.B = b; - var c = new model15.C(); - b.C = c; - var d = new model15.D(); - d.A = a; - c.D = d; - var nnnn = new model15.NNNN() { NNN = new model15.NNN() { NN = new model15.NN { A = a } } }; - a.NN = nnnn.NNN.NN; - transaction.Complete(); - } - } - }); - } - - [Test] - public void Model15TestForMySQl() - { - Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); - - var configuration = BuildConfiguration(); - configuration.Types.Register(typeof (model15.A).Assembly, typeof (model15.A).Namespace); - - Assert.Throws(() => { - using (var domain = Domain.Build(configuration)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var a = new model15.A(); - var b = new model15.B(); - a.B = b; - var c = new model15.C(); - b.C = c; - var d = new model15.D(); - d.A = a; - c.D = d; - var nnnn = new model15.NNNN() { NNN = new model15.NNN() { NN = new model15.NN { A = a } } }; - a.NN = nnnn.NNN.NN; - transaction.Complete(); - } - } - }); - } - - [Test] - public void Model16Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model16.Customer).Assembly, typeof (model16.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model16.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model16.Location(); - var job = new model16.Job(session, customer, location); - new model16.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model17Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model17.Customer).Assembly, typeof (model17.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model17.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model17.Location(); - var job = new model17.Job(session, customer, location); - new model17.Invoice(session, job); - tx.Complete(); - } - } - } - [Test] - public void Model18Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model18.Customer).Assembly, typeof (model18.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model18.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model18.Location(); - var job = new model18.Job(session, customer, location); - new model18.Invoice(session, job); - tx.Complete(); - } - } - } - [Test] - public void Model19Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model19.Customer).Assembly, typeof (model19.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model19.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model19.Location(); - var job = new model19.Job(session, customer, location); - new model19.Invoice(session, job); - tx.Complete(); - } - } - } - [Test] - public void Model20Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model20.Customer).Assembly, typeof (model20.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model20.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model20.Location(); - var job = new model20.Job(session, customer, location); - new model20.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model21Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model21.Customer).Assembly, typeof (model21.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model21.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model21.Location(); - var job = new model21.Job(session, customer, location); - new model21.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model22Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model22.Customer).Assembly, typeof (model22.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model22.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model22.Location(); - var job = new model22.Job(session, customer, location); - new model22.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model23Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model23.Customer).Assembly, typeof (model23.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model23.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model23.Location(); - var job = new model23.Job(session, customer, location); - new model23.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model24Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model24.Customer).Assembly, typeof (model24.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model24.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model24.Location(); - var job = new model24.Job(session, customer, location); - new model24.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model25Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model25.Customer).Assembly, typeof (model25.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model25.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model25.Location(); - var job = new model25.Job(session, customer, location); - new model25.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model26Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model26.Customer).Assembly, typeof (model26.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model26.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model26.Location(); - var job = new model26.Job(session, customer, location); - new model26.Invoice(session, job); - tx.Complete(); - } - } - } - - [Test] - public void Model27Test() - { - var config = BuildConfiguration(); - config.Types.Register(typeof (model27.Customer).Assembly, typeof (model27.Customer).Namespace); - - using (var domain = Domain.Build(config)) { - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new model27.Customer(); - tx.Complete(); - } - - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - var customer = session.Query.All().First(); - var location = new model27.Location(); - var job = new model27.Job(session, customer, location); - new model27.Invoice(session, job); - tx.Complete(); - } - } - } - - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.10.27 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Validation; +using model1 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel1; +using model2 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel2; +using model3 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel3; +using model4 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel4; +using model5 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel5; +using model6 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel6; +using model7 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel7; +using model8 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel8; +using model9 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel9; +using model10 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel10; +using model11 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel11; +using model12 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel12; +using model13 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel13; +using model14 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel14; +using model15 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel15; +using model16 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel16; +using model17 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel17; +using model18 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel18; +using model19 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel19; +using model20 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel20; +using model21 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel21; +using model22 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel22; +using model23 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel23; +using model24 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel24; +using model25 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel25; +using model26 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel26; +using model27 = Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel27; + + +#region models +//ZeroToOne Location in Job is nullable +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel1 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//ZeroToOne Location in Job is not nullable +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel2 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne all nullable not paired +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel3 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is nullable and Job is not nullable, not paired +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel4 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is not nullable and Job is nullable, not paired +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel5 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location and Job both are not nullable, not paired +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel6 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne all nullable, paired on Location side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel7 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Location")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne all nullable, paired on Job side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel8 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + [Association(PairTo = "Job")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is nullable and Job is not nullable, paired on Location side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel9 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + [Association(PairTo = "Location")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is nullable and Job is not nullable, paired on Job side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel10 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + [Association(PairTo = "Job")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is not nullable and Job is nullable, paired on Location side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel11 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Location")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location is not nullable and Job is nullable, paired on Job side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel12 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + [Association(PairTo = "Job")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location and Job both are not nullable, paired on Location side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel13 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + [Association(PairTo = "Location")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToOne Location and Job both are not nullable, paired on Job side +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel14 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false), NotNullConstraint] + [Association(PairTo = "Job")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//Loop big Test +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel15 +{ + [HierarchyRoot] + public class A : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public B B { get; set; } + + [Field(Nullable = false)] + public NN NN { get; set; } + } + + [HierarchyRoot] + public class B : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public C C { get; set; } + } + + [HierarchyRoot] + public class C : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public D D { get; set; } + } + + [HierarchyRoot] + public class D : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public A A { get; set; } + } + + [HierarchyRoot] + public class NN : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public A A { get; set; } + } + + [HierarchyRoot] + public class NNN : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public NN NN { get; set; } + } + + [HierarchyRoot] + public class NNNN : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public NNN NNN { get; set; } + } +} + +//OneToMany, not paired +//Location is entity, +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel16 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, not paired +//Location is entity [Nullable = false], +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel17 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, not paired +//Location is EntitySet, +//Job is Entity +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel18 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, not paired +//Location is EntitySet, +//Job is Entity [Nullable = false] +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel19 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Job +//Location is entity, +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel20 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Jobs")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Job +//Location is entity [Nullable = false], +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel21 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + [Association(PairTo = "Jobs")] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Job +//Location is EntitySet, +//Job is Entity +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel22 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Job")] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Job +//Location is EntitySet, +//Job is Entity [Nullable = false] +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel23 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Job")] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Location +//Location is entity, +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel24 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Location")] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Location +//Location is entity [Nullable = false], +//Job is EntitySet +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel25 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + public Location Location { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Location = location; + location.Jobs.Add(this); + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Location")] + public EntitySet Jobs { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Location +//Location is EntitySet, +//Job is Entity +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel26 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + [Association(PairTo = "Locations")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} + +//OneToMany, association in Location +//Location is EntitySet, +//Job is Entity [Nullable = false] +namespace Xtensive.Orm.Tests.Issues.IssueJira0563_IncorrectPersistActionSequenceModel27 +{ + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Job Job { get; set; } + + public Invoice(Session session, Job job) + : base(session) + { + Job = job; + job.Invoice = this; + } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public EntitySet Locations { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public Opportunity Opportunity { get; set; } + + public Job(Session session, Customer customer, Location location) + : base(session) + { + Customer = customer; + Locations.Add(location); + location.Job = this; + Opportunity = new Opportunity(); + } + } + + [HierarchyRoot] + public class Opportunity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, NotNullConstraint] + [Association("Opportunity")] + public Job Job { get; private set; } + } + + [HierarchyRoot] + public class Location : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field(Nullable = false)] + [Association(PairTo="Locations")] + public Job Job { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Key, Field] + public int Id { get; set; } + } +} +#endregion + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0563_IncorrectPersistActionSequence : AutoBuildTest + { + [Test] + public void Model01Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model1.Customer).Assembly, typeof (model1.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model1.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model1.Location(); + var job = new model1.Job(session, customer, location); + new model1.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model02Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model2.Customer).Assembly, typeof (model2.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model2.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model2.Location(); + var job = new model2.Job(session, customer, location); + new model2.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model03Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model3.Customer).Assembly, typeof (model3.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model3.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model3.Location(); + var job = new model3.Job(session, customer, location); + new model3.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model04Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model4.Customer).Assembly, typeof (model4.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model4.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model4.Location(); + var job = new model4.Job(session, customer, location); + new model4.Invoice(session, job); + location.Job = job; + tx.Complete(); + } + } + } + + [Test] + public void Model05Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model5.Customer).Assembly, typeof (model5.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model5.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model5.Location(); + var job = new model5.Job(session, customer, location); + new model5.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model06Test() + { + Require.ProviderIsNot(StorageProvider.MySql); + Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert + var config = BuildConfiguration(); + config.Types.Register(typeof (model6.Customer).Assembly, typeof (model6.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model6.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model6.Location(); + var job = new model6.Job(session, customer, location); + new model6.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model06TestForMySql() + { + Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); + var config = BuildConfiguration(); + config.Types.Register(typeof (model6.Customer).Assembly, typeof (model6.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model6.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model6.Location(); + var job = new model6.Job(session, customer, location); + new model6.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model07Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model7.Customer).Assembly, typeof (model7.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model7.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model7.Location(); + var job = new model7.Job(session, customer, location); + new model7.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model08Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model8.Customer).Assembly, typeof (model8.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model8.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model8.Location(); + var job = new model8.Job(session, customer, location); + new model8.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model09Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model9.Customer).Assembly, typeof (model9.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model9.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model9.Location(); + var job = new model9.Job(session, customer, location); + new model9.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model10Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model10.Customer).Assembly, typeof (model10.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model10.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model10.Location(); + var job = new model10.Job(session, customer, location); + new model10.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model11Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model11.Customer).Assembly, typeof (model11.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model11.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model11.Location(); + var job = new model11.Job(session, customer, location); + new model11.Invoice(session, job); + location.Job = job; + tx.Complete(); + } + } + } + + [Test] + public void Model12Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model12.Customer).Assembly, typeof (model12.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model12.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model12.Location(); + var job = new model12.Job(session, customer, location); + new model12.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model13Test() + { + Require.ProviderIsNot(StorageProvider.MySql); + Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert + var config = BuildConfiguration(); + config.Types.Register(typeof (model13.Customer).Assembly, typeof (model13.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model13.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model13.Location(); + var job = new model13.Job(session, customer, location); + new model13.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model13TestForMySql() + { + Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); + var config = BuildConfiguration(); + config.Types.Register(typeof (model13.Customer).Assembly, typeof (model13.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model13.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model13.Location(); + var job = new model13.Job(session, customer, location); + new model13.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model14Test() + { + Require.ProviderIsNot(StorageProvider.MySql); + Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert + var config = BuildConfiguration(); + config.Types.Register(typeof (model14.Customer).Assembly, typeof (model14.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model14.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model14.Location(); + var job = new model14.Job(session, customer, location); + new model14.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model14TestForMySql() + { + Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); + + var config = BuildConfiguration(); + config.Types.Register(typeof (model14.Customer).Assembly, typeof (model14.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model14.Customer(); + tx.Complete(); + } + + Assert.Throws(() => { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model14.Location(); + var job = new model14.Job(session, customer, location); + new model14.Invoice(session, job); + tx.Complete(); + } + }); + } + } + + [Test] + public void Model15Test() + { + Require.ProviderIsNot(StorageProvider.MySql); + Require.ProviderIsNot(StorageProvider.PostgreSql | StorageProvider.Sqlite | StorageProvider.Oracle);//do not use Sorting before insert + var configuration = BuildConfiguration(); + configuration.Types.Register(typeof (model15.A).Assembly, typeof (model15.A).Namespace); + + Assert.Throws(() => { + using (var domain = Domain.Build(configuration)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var a = new model15.A(); + var b = new model15.B(); + a.B = b; + var c = new model15.C(); + b.C = c; + var d = new model15.D(); + d.A = a; + c.D = d; + var nnnn = new model15.NNNN() { NNN = new model15.NNN() { NN = new model15.NN { A = a } } }; + a.NN = nnnn.NNN.NN; + transaction.Complete(); + } + } + }); + } + + [Test] + public void Model15TestForMySQl() + { + Require.ProviderIs(StorageProvider.MySql | StorageProvider.SqlServerCe); + + var configuration = BuildConfiguration(); + configuration.Types.Register(typeof (model15.A).Assembly, typeof (model15.A).Namespace); + + Assert.Throws(() => { + using (var domain = Domain.Build(configuration)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var a = new model15.A(); + var b = new model15.B(); + a.B = b; + var c = new model15.C(); + b.C = c; + var d = new model15.D(); + d.A = a; + c.D = d; + var nnnn = new model15.NNNN() { NNN = new model15.NNN() { NN = new model15.NN { A = a } } }; + a.NN = nnnn.NNN.NN; + transaction.Complete(); + } + } + }); + } + + [Test] + public void Model16Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model16.Customer).Assembly, typeof (model16.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model16.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model16.Location(); + var job = new model16.Job(session, customer, location); + new model16.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model17Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model17.Customer).Assembly, typeof (model17.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model17.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model17.Location(); + var job = new model17.Job(session, customer, location); + new model17.Invoice(session, job); + tx.Complete(); + } + } + } + [Test] + public void Model18Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model18.Customer).Assembly, typeof (model18.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model18.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model18.Location(); + var job = new model18.Job(session, customer, location); + new model18.Invoice(session, job); + tx.Complete(); + } + } + } + [Test] + public void Model19Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model19.Customer).Assembly, typeof (model19.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model19.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model19.Location(); + var job = new model19.Job(session, customer, location); + new model19.Invoice(session, job); + tx.Complete(); + } + } + } + [Test] + public void Model20Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model20.Customer).Assembly, typeof (model20.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model20.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model20.Location(); + var job = new model20.Job(session, customer, location); + new model20.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model21Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model21.Customer).Assembly, typeof (model21.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model21.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model21.Location(); + var job = new model21.Job(session, customer, location); + new model21.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model22Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model22.Customer).Assembly, typeof (model22.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model22.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model22.Location(); + var job = new model22.Job(session, customer, location); + new model22.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model23Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model23.Customer).Assembly, typeof (model23.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model23.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model23.Location(); + var job = new model23.Job(session, customer, location); + new model23.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model24Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model24.Customer).Assembly, typeof (model24.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model24.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model24.Location(); + var job = new model24.Job(session, customer, location); + new model24.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model25Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model25.Customer).Assembly, typeof (model25.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model25.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model25.Location(); + var job = new model25.Job(session, customer, location); + new model25.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model26Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model26.Customer).Assembly, typeof (model26.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model26.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model26.Location(); + var job = new model26.Job(session, customer, location); + new model26.Invoice(session, job); + tx.Complete(); + } + } + } + + [Test] + public void Model27Test() + { + var config = BuildConfiguration(); + config.Types.Register(typeof (model27.Customer).Assembly, typeof (model27.Customer).Namespace); + + using (var domain = Domain.Build(config)) { + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new model27.Customer(); + tx.Complete(); + } + + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + var customer = session.Query.All().First(); + var location = new model27.Location(); + var job = new model27.Job(session, customer, location); + new model27.Invoice(session, job); + tx.Complete(); + } + } + } + + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0566_IndexOnRemovableEntityBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0566_IndexOnRemovableEntityBug.cs index 53ccf748bc..979ef4cdae 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0566_IndexOnRemovableEntityBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0566_IndexOnRemovableEntityBug.cs @@ -1,265 +1,265 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.11.26 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using model1 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel1; -using model2 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel2; -using model3 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel3; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel1 -{ - [Index("Entity", Clustered = true, Name = "Clustered")] - [Serializable] - public abstract class BaseEntity : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] - public WithEntitySet Entity { get; set; } - } - - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class TestEntity : BaseEntity - { - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - } - - [HierarchyRoot] - [Serializable] - public class WithEntitySet : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Entity")] - public EntitySet List { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel2 -{ - [Index("Entity", Clustered = true, Name = "Clustered")] - [Serializable] - public abstract class BaseEntity : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] - public WithEntitySet Entity { get; set; } - } - - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] - public class TestEntity : BaseEntity - { - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - } - - public class TestEntityChild : TestEntity - { - [Field] - public string TestEntityChildField { get; set; } - } - - [HierarchyRoot] - [Serializable] - public class WithEntitySet : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Entity")] - public EntitySet List { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel3 -{ - [Index("Entity", Clustered = true, Name = "Clustered")] - [Serializable] - public abstract class BaseEntity : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field] - [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] - public WithEntitySet Entity { get; set; } - } - - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class TestEntity : BaseEntity - { - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - } - - public class TestEntityChild : TestEntity - { - [Field] - public string TestEntityChildField { get; set; } - } - - [HierarchyRoot] - [Serializable] - public class WithEntitySet : Entity - { - [Key] - [Field(Nullable = false)] - public Guid Id { get; private set; } - - [Field(Nullable = false, Length = 400)] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Entity")] - public EntitySet List { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0566_IndexOnRemovableEntityBug : AutoBuildTest - { - [Test] - public void ConcreteTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof (model1.BaseEntity)))) { - Assert.That(domain.Model.Types.Contains(typeof (model1.BaseEntity)), Is.False); - Assert.That(domain.Model.Types[typeof(model1.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); - Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields.Contains("Entity"), Is.True); - Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); - Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields.Contains("List"), Is.True); - Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var entity = new model1.WithEntitySet { Name = "Test" }; - - for (int i = 0; i < 25; i++) { - new model1.TestEntity { Entity = entity, Name = "Test" }; - } - - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - model1.TestEntity[] array = null; - Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); - Assert.IsNotNull(array); - Assert.AreEqual(25, array.Length); - } - } - } - - [Test] - public void ClassTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof(model2.BaseEntity)))) { - Assert.That(domain.Model.Types.Contains(typeof(model2.BaseEntity)), Is.False); - Assert.That(domain.Model.Types[typeof (model2.TestEntity)].Fields.Contains("Entity"), Is.True); - Assert.That(domain.Model.Types[typeof (model2.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); - Assert.That(domain.Model.Types[typeof(model2.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof(model2.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); - Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields.Contains("List"), Is.True); - Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var entity = new model2.WithEntitySet { Name = "Test" }; - - for (int i = 0; i < 25; i++) { - new model2.TestEntity { Entity = entity, Name = "Test" }; - } - - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - model2.TestEntity[] array = null; - Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); - Assert.IsNotNull(array); - Assert.AreEqual(25, array.Length); - } - } - } - - [Test] - public void SingleTableTest() - { - using (var domain = BuildDomain(BuildConfiguration(typeof(model3.BaseEntity)))) { - Assert.That(domain.Model.Types.Contains(typeof(model3.BaseEntity)), Is.False); - Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields.Contains("Entity"), Is.True); - Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); - Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); - Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields.Contains("List"), Is.True); - Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); - Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); - using (var session = domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var entity = new model3.WithEntitySet { Name = "Test" }; - - for (int i = 0; i < 25; i++) { - new model3.TestEntity { Entity = entity, Name = "Test" }; - } - - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - model3.TestEntity[] array = null; - Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); - Assert.IsNotNull(array); - Assert.AreEqual(25, array.Length); - } - } - } - - private DomainConfiguration BuildConfiguration(Type typeFromRegisteringModel) - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeFromRegisteringModel.Assembly, typeFromRegisteringModel.Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.11.26 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using model1 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel1; +using model2 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel2; +using model3 = Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel3; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel1 +{ + [Index("Entity", Clustered = true, Name = "Clustered")] + [Serializable] + public abstract class BaseEntity : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] + public WithEntitySet Entity { get; set; } + } + + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class TestEntity : BaseEntity + { + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + } + + [HierarchyRoot] + [Serializable] + public class WithEntitySet : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Entity")] + public EntitySet List { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel2 +{ + [Index("Entity", Clustered = true, Name = "Clustered")] + [Serializable] + public abstract class BaseEntity : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] + public WithEntitySet Entity { get; set; } + } + + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] + public class TestEntity : BaseEntity + { + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + } + + public class TestEntityChild : TestEntity + { + [Field] + public string TestEntityChildField { get; set; } + } + + [HierarchyRoot] + [Serializable] + public class WithEntitySet : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Entity")] + public EntitySet List { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0566_BuildingUnderlyingIndexForForeignKeyBugModel3 +{ + [Index("Entity", Clustered = true, Name = "Clustered")] + [Serializable] + public abstract class BaseEntity : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field] + [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] + public WithEntitySet Entity { get; set; } + } + + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class TestEntity : BaseEntity + { + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + } + + public class TestEntityChild : TestEntity + { + [Field] + public string TestEntityChildField { get; set; } + } + + [HierarchyRoot] + [Serializable] + public class WithEntitySet : Entity + { + [Key] + [Field(Nullable = false)] + public Guid Id { get; private set; } + + [Field(Nullable = false, Length = 400)] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Entity")] + public EntitySet List { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0566_IndexOnRemovableEntityBug : AutoBuildTest + { + [Test] + public void ConcreteTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof (model1.BaseEntity)))) { + Assert.That(domain.Model.Types.Contains(typeof (model1.BaseEntity)), Is.False); + Assert.That(domain.Model.Types[typeof(model1.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); + Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields.Contains("Entity"), Is.True); + Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof (model1.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); + Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields.Contains("List"), Is.True); + Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof(model1.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var entity = new model1.WithEntitySet { Name = "Test" }; + + for (int i = 0; i < 25; i++) { + new model1.TestEntity { Entity = entity, Name = "Test" }; + } + + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + model1.TestEntity[] array = null; + Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); + Assert.IsNotNull(array); + Assert.AreEqual(25, array.Length); + } + } + } + + [Test] + public void ClassTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof(model2.BaseEntity)))) { + Assert.That(domain.Model.Types.Contains(typeof(model2.BaseEntity)), Is.False); + Assert.That(domain.Model.Types[typeof (model2.TestEntity)].Fields.Contains("Entity"), Is.True); + Assert.That(domain.Model.Types[typeof (model2.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); + Assert.That(domain.Model.Types[typeof(model2.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof(model2.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); + Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields.Contains("List"), Is.True); + Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof(model2.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var entity = new model2.WithEntitySet { Name = "Test" }; + + for (int i = 0; i < 25; i++) { + new model2.TestEntity { Entity = entity, Name = "Test" }; + } + + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + model2.TestEntity[] array = null; + Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); + Assert.IsNotNull(array); + Assert.AreEqual(25, array.Length); + } + } + } + + [Test] + public void SingleTableTest() + { + using (var domain = BuildDomain(BuildConfiguration(typeof(model3.BaseEntity)))) { + Assert.That(domain.Model.Types.Contains(typeof(model3.BaseEntity)), Is.False); + Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields.Contains("Entity"), Is.True); + Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Indexes.Any(info => info.IsSecondary && info.IsClustered), Is.True); + Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields["Entity"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof(model3.TestEntity)].Fields["Entity"].Associations.First().UnderlyingIndex, Is.Not.Null); + Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields.Contains("List"), Is.True); + Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields["List"].Associations.Count, Is.EqualTo(1)); + Assert.That(domain.Model.Types[typeof(model3.WithEntitySet)].Fields["List"].Associations.First().UnderlyingIndex, Is.Not.Null); + using (var session = domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var entity = new model3.WithEntitySet { Name = "Test" }; + + for (int i = 0; i < 25; i++) { + new model3.TestEntity { Entity = entity, Name = "Test" }; + } + + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + model3.TestEntity[] array = null; + Assert.DoesNotThrow(() => { array = session.Query.All().First().List.ToArray(); }); + Assert.IsNotNull(array); + Assert.AreEqual(25, array.Length); + } + } + } + + private DomainConfiguration BuildConfiguration(Type typeFromRegisteringModel) + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeFromRegisteringModel.Assembly, typeFromRegisteringModel.Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0570_InOperationDoesNotCreateTemporaryTable.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0570_InOperationDoesNotCreateTemporaryTable.cs index abfd13b5b6..1372e05aa2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0570_InOperationDoesNotCreateTemporaryTable.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0570_InOperationDoesNotCreateTemporaryTable.cs @@ -1,592 +1,592 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.08.24 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0570_InOperationDoesNotCreateTemporaryTableModel; -using Xtensive.Orm.Tests.Storage; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0570_InOperationDoesNotCreateTemporaryTableModel -{ - [HierarchyRoot] - public class Payment : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public bool Active { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public PaymentStatus Status { get; set; } - - [Field] - public decimal Amount { get; set; } - } - - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public bool Active { get; set; } - - [Field] - public InvoiceStatus Status { get; set; } - - [Field] - public DateTime? InvoicedOn { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; set; } - } - - [HierarchyRoot] - public class Job : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public BusinessUnit BusinessUnit { get; set; } - } - - [HierarchyRoot] - public class BusinessUnit : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public bool Active { get; set; } - - [Field] - public string QuickbooksClass { get; set; } - } - - - public enum InvoiceStatus - { - Pending, - Queued, - Authorized, - Paid, - Processing, - Shipped, - Cancelled, - Refunded, - } - - public enum PaymentStatus - { - Scheduled, - Canceled, - Processed, - Failed, - Paid, - Retuned, - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0570_InOperationDoesNotCreateTemporaryTable : AutoBuildTest - { - private int[] customerIds; - private PaymentStatus[] queryablePaymentStatuses; - private InvoiceStatus[] queryableInvoiceStatuses; - - [Test] - public void OnlyTemporaryTableTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void OnlyComplexConditionTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void TemporaryTableInTheBeginning() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void TemporaryTableInTheMiddle() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void TemporaryTableInTheEnd() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void ComplexConditionInTheBeginning() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void ComplexConditionInTheMiddle() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void ComplexConditionInTheEnd() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var paymentsQuery = - from payment in session.Query.All() - join invoice in session.Query.All() on payment.Invoice equals invoice - join customer in session.Query.All() on invoice.Customer equals customer - where invoice.Active && - invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && - invoice.InvoicedOn.HasValue && - customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && - payment.Active && - payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) - group payment.Amount by invoice.Id - into amounts - select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; - Assert.DoesNotThrow(() => paymentsQuery.Run()); - } - } - - [Test] - public void StoreThenIncludeTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var businessUnitIds = session.Query.All().Select(bu=>bu.Id).ToList(); - - var bounds = new Tuple[26]; - for (int i = 0; i < bounds.Length; i++) { - bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); - } - var list = session.Query.All() - .Select(job => new {BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3}) - .Where(job => job.BusinessUnitId.In(businessUnitIds)) - .ToList(); - } - } - - [Test] - public void IncludeThenStoreTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); - - var bounds = new Tuple[26]; - for (int i = 0; i < bounds.Length; i++) { - bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); - } - var list = session.Query.All() - .Where(job => job.BusinessUnit.Id.In(businessUnitIds)) - .Select(job => new { BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3 }) - .ToList(); - } - } - - [Test] - public void IncludeWithoutStoreTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); - - var bounds = new Tuple[26]; - for (int i = 0; i < bounds.Length; i++) { - bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); - } - var list = session.Query.All() - .Where(job => job.BusinessUnit.Id.In(businessUnitIds)) - .ToList(); - } - } - - [Test] - public void StoreWithoutIncludeTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); - - var bounds = new Tuple[26]; - for (int i = 0; i < bounds.Length; i++) { - bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); - } - var list = session.Query.All() - .Select(job => new { BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3 }) - .ToList(); - } - } - - [Test] - public void DelayedQueryExecutionTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var parametersCountLimit = 2100; - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customers = new int[customerIds.Length]; - customerIds.CopyTo(customers, 0); - - var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; - queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); - - var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; - queryablePaymentStatuses.CopyTo(paymentStatuses, 0); - - var currentParametersCount = 0; - var delayedQueries = new List>(); - - while (currentParametersCount < parametersCountLimit) { - var customersDelayed = session.Query.ExecuteDelayed(q => q.All().Where(c => c.Id.In(customers))); - delayedQueries.Add(customersDelayed); - currentParametersCount += customers.Length; - } - - delayedQueries.First().Run(); - transaction.Complete(); - } - } - - protected override void PopulateData() - { - PopulateEnums(); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - PopulateCustomers(); - PopulateInvoices(); - PopulatePayments(); - PopulateBusinessUnits(); - PopulateJobs(); - transaction.Complete(); - } - } - - private void PopulateEnums() - { - queryableInvoiceStatuses = new[] { - InvoiceStatus.Authorized, - InvoiceStatus.Processing, - InvoiceStatus.Paid, - InvoiceStatus.Cancelled, - InvoiceStatus.Refunded, - }; - - queryablePaymentStatuses = new[] { - PaymentStatus.Scheduled, - PaymentStatus.Paid, - PaymentStatus.Retuned, - PaymentStatus.Canceled - }; - } - - private void PopulateCustomers() - { - customerIds = new int[160]; - for (int i = 0; i < 160; i++) - customerIds[i] = new Customer().Id; - } - - private void PopulateInvoices() - { - foreach (var customer in Query.All()) { - foreach (var status in Enum.GetValues(typeof(InvoiceStatus))) { - new Invoice { - Active = true, - Customer = customer, - InvoicedOn = DateTime.Now, - Status = (InvoiceStatus)status, - }; - } - } - } - - private void PopulatePayments() - { - var generator = new Random(); - foreach (var invoice in Query.All().Where(el => el.Status.In(queryableInvoiceStatuses))) { - new Payment { - Active = true, - Amount = new decimal(generator.Next(10000000, 200000000) / 100000), - Invoice = invoice, - Status = GetStatus(invoice.Status) - }; - } - } - - private void PopulateBusinessUnits() - { - new BusinessUnit() { - Active = true, - QuickbooksClass = "" - }; - - new BusinessUnit() { - Active = true, - QuickbooksClass = "" - }; - - new BusinessUnit() { - Active = true, - QuickbooksClass = "" - }; - } - - private void PopulateJobs() - { - foreach (var bu in Query.All()) { - new Job() { - BusinessUnit = bu - }; - } - } - - private PaymentStatus GetStatus(InvoiceStatus invoiceStatus) - { - switch (invoiceStatus) { - case InvoiceStatus.Authorized: - return PaymentStatus.Scheduled; - case InvoiceStatus.Paid: - return PaymentStatus.Paid; - case InvoiceStatus.Processing: - return PaymentStatus.Scheduled; - case InvoiceStatus.Refunded: - return PaymentStatus.Retuned; - case InvoiceStatus.Cancelled: - return PaymentStatus.Canceled; - default: - throw new NotSupportedException(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (Payment).Assembly, typeof (Payment).Namespace); - return configuration; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.08.24 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0570_InOperationDoesNotCreateTemporaryTableModel; +using Xtensive.Orm.Tests.Storage; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0570_InOperationDoesNotCreateTemporaryTableModel +{ + [HierarchyRoot] + public class Payment : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public bool Active { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public PaymentStatus Status { get; set; } + + [Field] + public decimal Amount { get; set; } + } + + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public bool Active { get; set; } + + [Field] + public InvoiceStatus Status { get; set; } + + [Field] + public DateTime? InvoicedOn { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; set; } + } + + [HierarchyRoot] + public class Job : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public BusinessUnit BusinessUnit { get; set; } + } + + [HierarchyRoot] + public class BusinessUnit : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public bool Active { get; set; } + + [Field] + public string QuickbooksClass { get; set; } + } + + + public enum InvoiceStatus + { + Pending, + Queued, + Authorized, + Paid, + Processing, + Shipped, + Cancelled, + Refunded, + } + + public enum PaymentStatus + { + Scheduled, + Canceled, + Processed, + Failed, + Paid, + Retuned, + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0570_InOperationDoesNotCreateTemporaryTable : AutoBuildTest + { + private int[] customerIds; + private PaymentStatus[] queryablePaymentStatuses; + private InvoiceStatus[] queryableInvoiceStatuses; + + [Test] + public void OnlyTemporaryTableTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void OnlyComplexConditionTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void TemporaryTableInTheBeginning() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void TemporaryTableInTheMiddle() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void TemporaryTableInTheEnd() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void ComplexConditionInTheBeginning() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.ComplexCondition, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void ComplexConditionInTheMiddle() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.ComplexCondition, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.TemporaryTable, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void ComplexConditionInTheEnd() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var paymentsQuery = + from payment in session.Query.All() + join invoice in session.Query.All() on payment.Invoice equals invoice + join customer in session.Query.All() on invoice.Customer equals customer + where invoice.Active && + invoice.Status.In(IncludeAlgorithm.TemporaryTable, invoiceStatuses) && + invoice.InvoicedOn.HasValue && + customer.Id.In(IncludeAlgorithm.TemporaryTable, customers) && + payment.Active && + payment.Status.In(IncludeAlgorithm.ComplexCondition, paymentStatuses) + group payment.Amount by invoice.Id + into amounts + select new { Id = amounts.Key, Amount = amounts.Sum(e => e) }; + Assert.DoesNotThrow(() => paymentsQuery.Run()); + } + } + + [Test] + public void StoreThenIncludeTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var businessUnitIds = session.Query.All().Select(bu=>bu.Id).ToList(); + + var bounds = new Tuple[26]; + for (int i = 0; i < bounds.Length; i++) { + bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); + } + var list = session.Query.All() + .Select(job => new {BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3}) + .Where(job => job.BusinessUnitId.In(businessUnitIds)) + .ToList(); + } + } + + [Test] + public void IncludeThenStoreTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); + + var bounds = new Tuple[26]; + for (int i = 0; i < bounds.Length; i++) { + bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); + } + var list = session.Query.All() + .Where(job => job.BusinessUnit.Id.In(businessUnitIds)) + .Select(job => new { BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3 }) + .ToList(); + } + } + + [Test] + public void IncludeWithoutStoreTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); + + var bounds = new Tuple[26]; + for (int i = 0; i < bounds.Length; i++) { + bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); + } + var list = session.Query.All() + .Where(job => job.BusinessUnit.Id.In(businessUnitIds)) + .ToList(); + } + } + + [Test] + public void StoreWithoutIncludeTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var businessUnitIds = session.Query.All().Select(bu => bu.Id).ToList(); + + var bounds = new Tuple[26]; + for (int i = 0; i < bounds.Length; i++) { + bounds[i] = new Tuple(DateTime.UtcNow, DateTime.UtcNow, ""); + } + var list = session.Query.All() + .Select(job => new { BusinessUnitId = job.BusinessUnit.Id, Month = bounds.FirstOrDefault().Item3 }) + .ToList(); + } + } + + [Test] + public void DelayedQueryExecutionTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var parametersCountLimit = 2100; + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customers = new int[customerIds.Length]; + customerIds.CopyTo(customers, 0); + + var invoiceStatuses = new InvoiceStatus[queryableInvoiceStatuses.Length]; + queryableInvoiceStatuses.CopyTo(invoiceStatuses, 0); + + var paymentStatuses = new PaymentStatus[queryablePaymentStatuses.Length]; + queryablePaymentStatuses.CopyTo(paymentStatuses, 0); + + var currentParametersCount = 0; + var delayedQueries = new List>(); + + while (currentParametersCount < parametersCountLimit) { + var customersDelayed = session.Query.ExecuteDelayed(q => q.All().Where(c => c.Id.In(customers))); + delayedQueries.Add(customersDelayed); + currentParametersCount += customers.Length; + } + + delayedQueries.First().Run(); + transaction.Complete(); + } + } + + protected override void PopulateData() + { + PopulateEnums(); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + PopulateCustomers(); + PopulateInvoices(); + PopulatePayments(); + PopulateBusinessUnits(); + PopulateJobs(); + transaction.Complete(); + } + } + + private void PopulateEnums() + { + queryableInvoiceStatuses = new[] { + InvoiceStatus.Authorized, + InvoiceStatus.Processing, + InvoiceStatus.Paid, + InvoiceStatus.Cancelled, + InvoiceStatus.Refunded, + }; + + queryablePaymentStatuses = new[] { + PaymentStatus.Scheduled, + PaymentStatus.Paid, + PaymentStatus.Retuned, + PaymentStatus.Canceled + }; + } + + private void PopulateCustomers() + { + customerIds = new int[160]; + for (int i = 0; i < 160; i++) + customerIds[i] = new Customer().Id; + } + + private void PopulateInvoices() + { + foreach (var customer in Query.All()) { + foreach (var status in Enum.GetValues(typeof(InvoiceStatus))) { + new Invoice { + Active = true, + Customer = customer, + InvoicedOn = DateTime.Now, + Status = (InvoiceStatus)status, + }; + } + } + } + + private void PopulatePayments() + { + var generator = new Random(); + foreach (var invoice in Query.All().Where(el => el.Status.In(queryableInvoiceStatuses))) { + new Payment { + Active = true, + Amount = new decimal(generator.Next(10000000, 200000000) / 100000), + Invoice = invoice, + Status = GetStatus(invoice.Status) + }; + } + } + + private void PopulateBusinessUnits() + { + new BusinessUnit() { + Active = true, + QuickbooksClass = "" + }; + + new BusinessUnit() { + Active = true, + QuickbooksClass = "" + }; + + new BusinessUnit() { + Active = true, + QuickbooksClass = "" + }; + } + + private void PopulateJobs() + { + foreach (var bu in Query.All()) { + new Job() { + BusinessUnit = bu + }; + } + } + + private PaymentStatus GetStatus(InvoiceStatus invoiceStatus) + { + switch (invoiceStatus) { + case InvoiceStatus.Authorized: + return PaymentStatus.Scheduled; + case InvoiceStatus.Paid: + return PaymentStatus.Paid; + case InvoiceStatus.Processing: + return PaymentStatus.Scheduled; + case InvoiceStatus.Refunded: + return PaymentStatus.Retuned; + case InvoiceStatus.Cancelled: + return PaymentStatus.Canceled; + default: + throw new NotSupportedException(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (Payment).Assembly, typeof (Payment).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0571_MySqlKeyGenerationProblem.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0571_MySqlKeyGenerationProblem.cs index 3de861a7c9..cc2d77ef9e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0571_MySqlKeyGenerationProblem.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0571_MySqlKeyGenerationProblem.cs @@ -1,178 +1,178 @@ -// Copyright (C) 2015-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexey Kulakov -// Created: 2015.02.03 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Services; -using Xtensive.Sql; -using Xtensive.Sql.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0571_MySqlKeyGenerationProblemModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0571_MySqlKeyGenerationProblemModel -{ - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.Default, Name="GeneratorForEntity1")] - public class Entity1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string TextData { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0571_MySqlKeyGenerationProblem : AutoBuildTest - { - private DomainConfiguration recreateConfiguration; - private DomainConfiguration performConfiguration; - private Catalog extractedCatalog; - - [Test] - public void NormalModeGeneration() - { - Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); - Require.AllFeaturesNotSupported(ProviderFeatures.AutoIncrementSettingsInMemory); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); - for (int i = 0; i < 13; i++ ) { - new Entity1(); - } - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); - for (int i = 0; i < 120; i++) { - new Entity1(); - } - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); - for (int i = 0; i < 250; i++) { - new Entity1(); - } - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); - } - } - - [Test] - public void MySqlModeGeneration() - { - Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); - Require.AllFeaturesSupported(ProviderFeatures.AutoIncrementSettingsInMemory); - - using (var session = Domain.OpenSession()) { - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); - } - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 1; i++) { - var entity = new Entity1(); - } - } - using (var session = Domain.OpenSession()) { - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); - } - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 120; i++) { - var entity = new Entity1(); - } - } - - using (var session = Domain.OpenSession()) { - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); - } - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 250; i++) { - var entity = new Entity1(); - } - } - using (var session = Domain.OpenSession()) { - foreach (var keyGenerator in Domain.Configuration.KeyGenerators) - CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); - } - } - - private ISqlCompileUnit GetQuery(Table generatorTable) - { - var select = SqlDml.Select(); - select.Columns.Add(SqlDml.Count()); - select.From = SqlDml.TableRef(generatorTable); - return select; - } - - private void CheckGeneratorsAfterDomainBuilded(KeyGeneratorConfiguration keyGeneratorConfiguration, Session session, int expectedValue) - { - if (Domain.Configuration.IsMultischema) { - foreach (var schema in extractedCatalog.Schemas) { - CheckSchemaGenerators(schema, keyGeneratorConfiguration.Name+ "-Generator", session, expectedValue); - } - } - else { - CheckSchemaGenerators(extractedCatalog.DefaultSchema, keyGeneratorConfiguration.Name + "-Generator", session, expectedValue); - } - } - - private void CheckSchemaGenerators(Schema schema, string generatorName, Session session, int expectedValue) - { - var generatorTable = schema.Tables[generatorName]; - if (generatorTable == null) - return; - var query = GetQuery(generatorTable); - var queryBuilder = GetQueryBuilder(session); - var queryCompilationResult = queryBuilder.CompileQuery(query); - var queryRequest = queryBuilder.CreateRequest(queryCompilationResult, Enumerable.Empty()); - using var command = queryBuilder.CreateCommand(queryRequest); - var rowCount = command.ExecuteScalar(); - Assert.AreEqual(expectedValue, rowCount); - } - - private QueryBuilder GetQueryBuilder(Session session) - { - return session.Services.Get(); - } - - protected override DomainConfiguration BuildConfiguration() - { - return recreateConfiguration; - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.MySql); - } - - public override void TestFixtureSetUp() - { - recreateConfiguration = base.BuildConfiguration(); - recreateConfiguration.Types.Register(typeof (Entity1)); - recreateConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - recreateConfiguration.KeyGenerators.Add(new KeyGeneratorConfiguration("GeneratorForEntity1") {CacheSize = 128, Seed = 0}); - - base.TestFixtureSetUp(); - var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); - using (var sqlConnection = driver.CreateConnection()) { - sqlConnection.Open(); - extractedCatalog = driver.ExtractCatalog(sqlConnection); - sqlConnection.Close(); - } - } - } -} +// Copyright (C) 2015-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexey Kulakov +// Created: 2015.02.03 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; +using Xtensive.Sql; +using Xtensive.Sql.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0571_MySqlKeyGenerationProblemModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0571_MySqlKeyGenerationProblemModel +{ + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.Default, Name="GeneratorForEntity1")] + public class Entity1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string TextData { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0571_MySqlKeyGenerationProblem : AutoBuildTest + { + private DomainConfiguration recreateConfiguration; + private DomainConfiguration performConfiguration; + private Catalog extractedCatalog; + + [Test] + public void NormalModeGeneration() + { + Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); + Require.AllFeaturesNotSupported(ProviderFeatures.AutoIncrementSettingsInMemory); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); + for (int i = 0; i < 13; i++ ) { + new Entity1(); + } + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); + for (int i = 0; i < 120; i++) { + new Entity1(); + } + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); + for (int i = 0; i < 250; i++) { + new Entity1(); + } + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); + } + } + + [Test] + public void MySqlModeGeneration() + { + Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); + Require.AllFeaturesSupported(ProviderFeatures.AutoIncrementSettingsInMemory); + + using (var session = Domain.OpenSession()) { + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 0); + } + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 1; i++) { + var entity = new Entity1(); + } + } + using (var session = Domain.OpenSession()) { + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); + } + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 120; i++) { + var entity = new Entity1(); + } + } + + using (var session = Domain.OpenSession()) { + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); + } + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 250; i++) { + var entity = new Entity1(); + } + } + using (var session = Domain.OpenSession()) { + foreach (var keyGenerator in Domain.Configuration.KeyGenerators) + CheckGeneratorsAfterDomainBuilded(keyGenerator, session, 1); + } + } + + private ISqlCompileUnit GetQuery(Table generatorTable) + { + var select = SqlDml.Select(); + select.Columns.Add(SqlDml.Count()); + select.From = SqlDml.TableRef(generatorTable); + return select; + } + + private void CheckGeneratorsAfterDomainBuilded(KeyGeneratorConfiguration keyGeneratorConfiguration, Session session, int expectedValue) + { + if (Domain.Configuration.IsMultischema) { + foreach (var schema in extractedCatalog.Schemas) { + CheckSchemaGenerators(schema, keyGeneratorConfiguration.Name+ "-Generator", session, expectedValue); + } + } + else { + CheckSchemaGenerators(extractedCatalog.DefaultSchema, keyGeneratorConfiguration.Name + "-Generator", session, expectedValue); + } + } + + private void CheckSchemaGenerators(Schema schema, string generatorName, Session session, int expectedValue) + { + var generatorTable = schema.Tables[generatorName]; + if (generatorTable == null) + return; + var query = GetQuery(generatorTable); + var queryBuilder = GetQueryBuilder(session); + var queryCompilationResult = queryBuilder.CompileQuery(query); + var queryRequest = queryBuilder.CreateRequest(queryCompilationResult, Enumerable.Empty()); + using var command = queryBuilder.CreateCommand(queryRequest); + var rowCount = command.ExecuteScalar(); + Assert.AreEqual(expectedValue, rowCount); + } + + private QueryBuilder GetQueryBuilder(Session session) + { + return session.Services.Get(); + } + + protected override DomainConfiguration BuildConfiguration() + { + return recreateConfiguration; + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.MySql); + } + + public override void TestFixtureSetUp() + { + recreateConfiguration = base.BuildConfiguration(); + recreateConfiguration.Types.Register(typeof (Entity1)); + recreateConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + recreateConfiguration.KeyGenerators.Add(new KeyGeneratorConfiguration("GeneratorForEntity1") {CacheSize = 128, Seed = 0}); + + base.TestFixtureSetUp(); + var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); + using (var sqlConnection = driver.CreateConnection()) { + sqlConnection.Open(); + extractedCatalog = driver.ExtractCatalog(sqlConnection); + sqlConnection.Close(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0573_IncorrectMappingOfStructureFields.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0573_IncorrectMappingOfStructureFields.cs index 6324e4b333..6b8bfe42e5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0573_IncorrectMappingOfStructureFields.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0573_IncorrectMappingOfStructureFields.cs @@ -1,128 +1,128 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.02 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0573_IncorrectMappingOfStructureFieldsModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0573_IncorrectMappingOfStructureFieldsModel -{ - public interface IHasProcess : IEntity, IMesObject - { - } - - public interface IHasRecipe : IEntity, IMesObject - { - } - - public interface IHasConsumable : IEntity, IMesObject - { - } - - public interface IHasPackingMaterial : IMesObject, IEntity - { - } - - public interface IMesObject - { - [Key, Field] - int ID { get; } - } - - [HierarchyRoot] - public class SalesUnitVersion : Entity, IHasProcess, IHasRecipe, IHasConsumable, IHasPackingMaterial - { - [Field] - public int ID { get; set; } - } - - [HierarchyRoot] - public abstract class ProductUsage : MesObject - { - [Field] - public Point Point { get; set; } - } - - public class Point : Structure - { - [Field] - public int X { get; set; } - - [Field(Precision = 1, Scale = 1)] - public decimal Y { get; set; } - } - - public class RecipeProductUsage : ProductUsage - { - [Field] - public IHasRecipe Owner { get; set; } - } - - public class ConsumableUsage : ProductUsage - { - [Field] - public IHasConsumable Owner { get; set; } - } - - public class PackingMaterialUsage : ProductUsage - { - [Field(Nullable = false)] - public IHasPackingMaterial Owner { get; set; } - } - - public abstract class MesObject : Entity, IMesObject - { - public int ID { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0573_IncorrectMappingOfStructureFields : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) - { - IHasProcess owner = new SalesUnitVersion(); - IQueryable q = null; - if (owner is IHasRecipe) - q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); - if (owner is IHasConsumable) - q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); - if (owner is IHasPackingMaterial) - q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); - - if (q == null) - throw new InvalidOperationException(); - - Assert.DoesNotThrow(()=>q.ToArray()); - } - } - - private IQueryable SafeUnion(IQueryable x, IQueryable y) - { - if (x == null) - return y; - if (y == null) - return x; - return x.Union(y); - } - - protected override DomainConfiguration BuildConfiguration() - { - var c = base.BuildConfiguration(); - c.Types.Register(typeof (SalesUnitVersion).Assembly, typeof (SalesUnitVersion).Namespace); - c.UpgradeMode = DomainUpgradeMode.Recreate; - return c; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.02 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0573_IncorrectMappingOfStructureFieldsModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0573_IncorrectMappingOfStructureFieldsModel +{ + public interface IHasProcess : IEntity, IMesObject + { + } + + public interface IHasRecipe : IEntity, IMesObject + { + } + + public interface IHasConsumable : IEntity, IMesObject + { + } + + public interface IHasPackingMaterial : IMesObject, IEntity + { + } + + public interface IMesObject + { + [Key, Field] + int ID { get; } + } + + [HierarchyRoot] + public class SalesUnitVersion : Entity, IHasProcess, IHasRecipe, IHasConsumable, IHasPackingMaterial + { + [Field] + public int ID { get; set; } + } + + [HierarchyRoot] + public abstract class ProductUsage : MesObject + { + [Field] + public Point Point { get; set; } + } + + public class Point : Structure + { + [Field] + public int X { get; set; } + + [Field(Precision = 1, Scale = 1)] + public decimal Y { get; set; } + } + + public class RecipeProductUsage : ProductUsage + { + [Field] + public IHasRecipe Owner { get; set; } + } + + public class ConsumableUsage : ProductUsage + { + [Field] + public IHasConsumable Owner { get; set; } + } + + public class PackingMaterialUsage : ProductUsage + { + [Field(Nullable = false)] + public IHasPackingMaterial Owner { get; set; } + } + + public abstract class MesObject : Entity, IMesObject + { + public int ID { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0573_IncorrectMappingOfStructureFields : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) + { + IHasProcess owner = new SalesUnitVersion(); + IQueryable q = null; + if (owner is IHasRecipe) + q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); + if (owner is IHasConsumable) + q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); + if (owner is IHasPackingMaterial) + q = SafeUnion(q, Query.All().Where(u => u.Owner.ID == owner.ID)); + + if (q == null) + throw new InvalidOperationException(); + + Assert.DoesNotThrow(()=>q.ToArray()); + } + } + + private IQueryable SafeUnion(IQueryable x, IQueryable y) + { + if (x == null) + return y; + if (y == null) + return x; + return x.Union(y); + } + + protected override DomainConfiguration BuildConfiguration() + { + var c = base.BuildConfiguration(); + c.Types.Register(typeof (SalesUnitVersion).Assembly, typeof (SalesUnitVersion).Namespace); + c.UpgradeMode = DomainUpgradeMode.Recreate; + return c; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed.cs index 32b0a3cca1..484a7b5142 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed.cs @@ -1,147 +1,147 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.03.18 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailedModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailedModel -{ - [HierarchyRoot] - [Index("UniqueField", Unique = true)] - public class Call : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string TextField { get; set; } - - [Field(Length = 250)] - public string UniqueField { get; set; } - - [Field] - public Caller Caller { get; set; } - - [Field] - public EntitySet Parameters { get; set; } - } - - [HierarchyRoot] - public class Caller : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Parameter : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Value { get; set; } - } -} - - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed : AutoBuildTest - { - [Test] - public void PersistFailedServerProfileOnTransactionComplete() - { - using (var session = Domain.OpenSession()) { - Assert.Catch( - () => { - using (var transaction = session.OpenTransaction()) { - var call = session.Query.All().First(el => el.TextField == "3"); - Assert.IsNull(call.State.DifferentialTuple.Difference); - call.UniqueField = "2"; - call.Caller = new Caller() {Name = "Caller"}; - call.Parameters.Add(new Parameter() {Value = "parameterValue"}); - Assert.AreEqual(4, session.EntityChangeRegistry.Count); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); - Assert.AreEqual(1, session.EntitySetChangeRegistry.Count); - - //must be persist - transaction.Complete(); - } - } - ); - Assert.AreEqual(0, session.EntityChangeRegistry.Count); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); - Assert.AreEqual(0, session.EntitySetChangeRegistry.Count); - } - } - - [Test] - public void PersistFailedServerProfileOnTransactionRollbacked() - { - using (var session = Domain.OpenSession()) { - Assert.DoesNotThrow( - () => { - using (var transaction = session.OpenTransaction()) { - var call = session.Query.All().First(el => el.TextField=="3"); - Assert.IsNull(call.State.DifferentialTuple.Difference); - call.UniqueField = "2"; - call.Caller = new Caller() {Name = "Caller"}; - call.Parameters.Add(new Parameter() {Value = "parameterValue"}); - Assert.AreEqual(4, session.EntityChangeRegistry.Count); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); - Assert.AreEqual(1, session.EntitySetChangeRegistry.Count); - } - }); - Assert.AreEqual(0, session.EntityChangeRegistry.Count); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); - Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); - Assert.AreEqual(0, session.EntitySetChangeRegistry.Count); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof(Call).Assembly, typeof(Call).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - return domainConfiguration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var tx = session.OpenTransaction()) { - new Call {TextField = "1", UniqueField = "1"}; - new Call {TextField = "2", UniqueField = "2"}; - new Call {TextField = "3", UniqueField = "3"}; - new Call {TextField = "4", UniqueField = "4"}; - new Call {TextField = "5", UniqueField = "5"}; - new Call {TextField = "6", UniqueField = "6"}; - new Call {TextField = "7", UniqueField = "7"}; - new Call {TextField = "8", UniqueField = "8"}; - new Call {TextField = "9", UniqueField = "9"}; - new Call {TextField = "10", UniqueField = "10"}; - new Call {TextField = "11", UniqueField = "11"}; - new Call {TextField = "12", UniqueField = "12"}; - tx.Complete(); - } - } - - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.03.18 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailedModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailedModel +{ + [HierarchyRoot] + [Index("UniqueField", Unique = true)] + public class Call : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string TextField { get; set; } + + [Field(Length = 250)] + public string UniqueField { get; set; } + + [Field] + public Caller Caller { get; set; } + + [Field] + public EntitySet Parameters { get; set; } + } + + [HierarchyRoot] + public class Caller : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Parameter : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Value { get; set; } + } +} + + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0577_EntityChangesRegistryIsNotEmptyAfterPersistFailed : AutoBuildTest + { + [Test] + public void PersistFailedServerProfileOnTransactionComplete() + { + using (var session = Domain.OpenSession()) { + Assert.Catch( + () => { + using (var transaction = session.OpenTransaction()) { + var call = session.Query.All().First(el => el.TextField == "3"); + Assert.IsNull(call.State.DifferentialTuple.Difference); + call.UniqueField = "2"; + call.Caller = new Caller() {Name = "Caller"}; + call.Parameters.Add(new Parameter() {Value = "parameterValue"}); + Assert.AreEqual(4, session.EntityChangeRegistry.Count); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); + Assert.AreEqual(1, session.EntitySetChangeRegistry.Count); + + //must be persist + transaction.Complete(); + } + } + ); + Assert.AreEqual(0, session.EntityChangeRegistry.Count); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); + Assert.AreEqual(0, session.EntitySetChangeRegistry.Count); + } + } + + [Test] + public void PersistFailedServerProfileOnTransactionRollbacked() + { + using (var session = Domain.OpenSession()) { + Assert.DoesNotThrow( + () => { + using (var transaction = session.OpenTransaction()) { + var call = session.Query.All().First(el => el.TextField=="3"); + Assert.IsNull(call.State.DifferentialTuple.Difference); + call.UniqueField = "2"; + call.Caller = new Caller() {Name = "Caller"}; + call.Parameters.Add(new Parameter() {Value = "parameterValue"}); + Assert.AreEqual(4, session.EntityChangeRegistry.Count); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); + Assert.AreEqual(1, session.EntitySetChangeRegistry.Count); + } + }); + Assert.AreEqual(0, session.EntityChangeRegistry.Count); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.RemovedReferencesCount); + Assert.AreEqual(0, session.NonPairedReferencesRegistry.AddedReferencesCount); + Assert.AreEqual(0, session.EntitySetChangeRegistry.Count); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof(Call).Assembly, typeof(Call).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + return domainConfiguration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var tx = session.OpenTransaction()) { + new Call {TextField = "1", UniqueField = "1"}; + new Call {TextField = "2", UniqueField = "2"}; + new Call {TextField = "3", UniqueField = "3"}; + new Call {TextField = "4", UniqueField = "4"}; + new Call {TextField = "5", UniqueField = "5"}; + new Call {TextField = "6", UniqueField = "6"}; + new Call {TextField = "7", UniqueField = "7"}; + new Call {TextField = "8", UniqueField = "8"}; + new Call {TextField = "9", UniqueField = "9"}; + new Call {TextField = "10", UniqueField = "10"}; + new Call {TextField = "11", UniqueField = "11"}; + new Call {TextField = "12", UniqueField = "12"}; + tx.Complete(); + } + } + + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0582_OverrideInterfaceDefinedAssociation.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0582_OverrideInterfaceDefinedAssociation.cs index 6b7da6059f..fe5011799e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0582_OverrideInterfaceDefinedAssociation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0582_OverrideInterfaceDefinedAssociation.cs @@ -1,366 +1,366 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.04.30 - -using System.Security.Cryptography.X509Certificates; -using NUnit.Framework; -using V1 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV1; -using V2 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV2; -using V3 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV3; -using V4 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV4; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV1 -{ - public interface IHasRegimeReference : IEntity - { - [Field, Key] - int Id { get; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - Regime ZeroToOne { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - EntitySet ZeroToMany { get; set; } - - [Field] - [Association(PairTo = "HasRegimeReferenseObject1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - Regime OneToOne { get; set; } - - [Field] - [Association(PairTo = "HasRegimeReferenseObject2")] - Regime OnlyPairDeclared { get; set; } - - [Field] - [Association(PairTo = "HasRegimeReferenseObjects1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - Regime OneToMany { get; set; } - - [Field] - [Association(PairTo = "HasRegimeReferenseObject2", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - EntitySet ManyToOne { get; set; } - - [Field] - [Association(PairTo = "HasRegimeReferenseObjects1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - EntitySet ManyToMany { get; set; } - } - - [HierarchyRoot] - public class Regime : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - - [Field] - public IHasRegimeReference OneToOne { get; set; } - - [Field] - public EntitySet ManyToOne { get; set; } - - [Field] - public IHasRegimeReference HasRegimeReferenseObject1 { get; set; } - - [Field] - public IHasRegimeReference HasRegimeReferenseObject2 { get; set; } - - [Field] - public IHasRegimeReference HasRegimeReferenseObject3 { get; set; } - - [Field] - public IHasRegimeReference HasRegimeReferenseObject4 { get; set; } - - [Field] - public EntitySet HasRegimeReferenseObjects1 { get; set; } - - [Field] - public EntitySet HasRegimeReferenseObjects2 { get; set; } - } - - [HierarchyRoot] - public class Country : Entity, IHasRegimeReference - { - public int Id { get; set; } - - public Regime ZeroToOne { get; set; } - - public EntitySet ZeroToMany { get; set; } - - public Regime OneToOne { get; set; } - - [Association(PairTo = "HasRegimeReferenseObject4")] - public Regime OnlyPairDeclared { get; set; } - - public Regime OneToMany { get; set; } - - public EntitySet ManyToOne { get; set; } - - public EntitySet ManyToMany { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV2 -{ - public interface IHasRegimeReference : IEntity - { - [Field, Key] - int Id { get; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] - Regime Regime { get; } - } - - [HierarchyRoot] - public class Regime : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - } - - [HierarchyRoot] - public class Phone : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Field] - public Regime Regime { get; set; } - } - - [HierarchyRoot] - public class Country : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - public Regime Regime { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV3 -{ - public interface IHasRegimeReference : IEntity - { - [Field, Key] - int Id { get; } - - [Field] - Regime Regime { get; } - } - - [HierarchyRoot] - public class Regime : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - } - - [HierarchyRoot] - public class Country : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - public Regime Regime { get; set; } - } - - [HierarchyRoot] - public class Phone : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - public Regime Regime { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV4 -{ - public interface IHasRegimeReference : IEntity - { - [Field, Key] - int Id { get; } - - [Field] - Regime Regime { get; } - } - - [HierarchyRoot] - public class Regime : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - } - - [HierarchyRoot] - public class Country : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] - public Regime Regime { get; set; } - } - - [HierarchyRoot] - public class Phone : Entity, IHasRegimeReference - { - public int Id { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.None)] - public Regime Regime { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV5 -{ - public abstract class BaseEntity : Entity - { - [Key, Field] - public int Id { get; set; } - } - - [HierarchyRoot] - public abstract class Shield : BaseEntity - { - [Field] - [Association(OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] - public abstract ShieldBehavior Behavior { get; set; } - } - - [HierarchyRoot] - public abstract class ShieldBehavior : BaseEntity - { - public abstract int ProtectionValue { get; set; } - } - - public class WoodenShield : Shield - { - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public override ShieldBehavior Behavior { get; set; } - } - - public class WoodenShieldBehavior : ShieldBehavior - { - [Field] - public override int ProtectionValue { get; set; } - } -} - - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0582_OverrideInterfaceDefinedAssociation : AutoBuildTest - { - [Test] - [Ignore("Bug hasn't been fixed yet")] - public void AssociationDefinedInInterface() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (V1.Regime).Assembly, typeof (V1.Regime).Namespace); - using (var domain = BuildDomain(configuration)) { - Assert.AreEqual(1, domain.Model.Associations.Count); - var interfaceAssociation = domain.Model.Types[typeof (V1.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; - Assert.That(interfaceAssociation.OnOwnerRemove,Is.EqualTo(OnRemoveAction.Cascade)); - Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); - var regimeField = domain.Model.Types[typeof (V1.Country)].Fields["ZeroToOne"]; - Assert.AreEqual(1, regimeField.Associations.Count); - var association = regimeField.Associations[0]; - Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); - Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); - } - } - - [Test] - [Ignore("Bug hasn't been fixed yet")] - public void AssociationDefinedInInterfaceAndOverridenByImplementor() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (V2.Regime).Assembly, typeof (V2.Regime).Namespace); - using (var domain = BuildDomain(configuration)) { - Assert.AreEqual(2, domain.Model.Associations.Count); - var interfaceAssociation = domain.Model.Types[typeof(V2.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; - Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.None)); - Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.None)); - var countryRegimeField = domain.Model.Types[typeof(V2.Country)].Fields["ZeroToOne"]; - Assert.AreEqual(1, countryRegimeField.Associations.Count); - var overriddenAssociation = countryRegimeField.Associations[0]; - Assert.That(overriddenAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); - Assert.That(overriddenAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); - - var phoneRegimeField = domain.Model.Types[typeof(V2.Phone)].Fields["ZeroToOne"]; - Assert.AreEqual(1, phoneRegimeField.Associations.Count); - var association = phoneRegimeField.Associations[0]; - Assert.That(association.OnOwnerRemove, Is.EqualTo(interfaceAssociation.OnOwnerRemove)); - Assert.That(association.OnTargetRemove, Is.EqualTo(interfaceAssociation.OnTargetRemove)); - } - } - - [Test] - [Ignore("Bug hasn't been fixed yet")] - public void AssociationDefinedByEachImplementorInTheSameWay() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (V3.Regime).Assembly, typeof (V3.Regime).Namespace); - using (var domain = BuildDomain(configuration)) { - Assert.AreEqual(1, domain.Model.Associations.Count); - var interfaceAssociation = domain.Model.Types[typeof(V1.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; - Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); - Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); - var regimeField = domain.Model.Types[typeof(V1.Country)].Fields["ZeroToOne"]; - Assert.AreEqual(1, regimeField.Associations.Count); - var association = regimeField.Associations[0]; - Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); - Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); - } - } - - [Test] - [Ignore("Bug hasn't been fixed yet")] - public void AssociationDefinedByEachImplementorInDifferentWay() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(V4.Regime).Assembly, typeof(V4.Regime).Namespace); - using (var domain = BuildDomain(configuration)) - { - - } - } - - public override void TestFixtureSetUp() - { - CheckRequirements(); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.04.30 + +using System.Security.Cryptography.X509Certificates; +using NUnit.Framework; +using V1 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV1; +using V2 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV2; +using V3 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV3; +using V4 = Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV4; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV1 +{ + public interface IHasRegimeReference : IEntity + { + [Field, Key] + int Id { get; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + Regime ZeroToOne { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + EntitySet ZeroToMany { get; set; } + + [Field] + [Association(PairTo = "HasRegimeReferenseObject1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + Regime OneToOne { get; set; } + + [Field] + [Association(PairTo = "HasRegimeReferenseObject2")] + Regime OnlyPairDeclared { get; set; } + + [Field] + [Association(PairTo = "HasRegimeReferenseObjects1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + Regime OneToMany { get; set; } + + [Field] + [Association(PairTo = "HasRegimeReferenseObject2", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + EntitySet ManyToOne { get; set; } + + [Field] + [Association(PairTo = "HasRegimeReferenseObjects1", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + EntitySet ManyToMany { get; set; } + } + + [HierarchyRoot] + public class Regime : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + + [Field] + public IHasRegimeReference OneToOne { get; set; } + + [Field] + public EntitySet ManyToOne { get; set; } + + [Field] + public IHasRegimeReference HasRegimeReferenseObject1 { get; set; } + + [Field] + public IHasRegimeReference HasRegimeReferenseObject2 { get; set; } + + [Field] + public IHasRegimeReference HasRegimeReferenseObject3 { get; set; } + + [Field] + public IHasRegimeReference HasRegimeReferenseObject4 { get; set; } + + [Field] + public EntitySet HasRegimeReferenseObjects1 { get; set; } + + [Field] + public EntitySet HasRegimeReferenseObjects2 { get; set; } + } + + [HierarchyRoot] + public class Country : Entity, IHasRegimeReference + { + public int Id { get; set; } + + public Regime ZeroToOne { get; set; } + + public EntitySet ZeroToMany { get; set; } + + public Regime OneToOne { get; set; } + + [Association(PairTo = "HasRegimeReferenseObject4")] + public Regime OnlyPairDeclared { get; set; } + + public Regime OneToMany { get; set; } + + public EntitySet ManyToOne { get; set; } + + public EntitySet ManyToMany { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV2 +{ + public interface IHasRegimeReference : IEntity + { + [Field, Key] + int Id { get; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] + Regime Regime { get; } + } + + [HierarchyRoot] + public class Regime : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + } + + [HierarchyRoot] + public class Phone : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Field] + public Regime Regime { get; set; } + } + + [HierarchyRoot] + public class Country : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + public Regime Regime { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV3 +{ + public interface IHasRegimeReference : IEntity + { + [Field, Key] + int Id { get; } + + [Field] + Regime Regime { get; } + } + + [HierarchyRoot] + public class Regime : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + } + + [HierarchyRoot] + public class Country : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + public Regime Regime { get; set; } + } + + [HierarchyRoot] + public class Phone : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + public Regime Regime { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV4 +{ + public interface IHasRegimeReference : IEntity + { + [Field, Key] + int Id { get; } + + [Field] + Regime Regime { get; } + } + + [HierarchyRoot] + public class Regime : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + } + + [HierarchyRoot] + public class Country : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Default)] + public Regime Regime { get; set; } + } + + [HierarchyRoot] + public class Phone : Entity, IHasRegimeReference + { + public int Id { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.None)] + public Regime Regime { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0582_OverrideInterfaceDefinedAssociationModelV5 +{ + public abstract class BaseEntity : Entity + { + [Key, Field] + public int Id { get; set; } + } + + [HierarchyRoot] + public abstract class Shield : BaseEntity + { + [Field] + [Association(OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] + public abstract ShieldBehavior Behavior { get; set; } + } + + [HierarchyRoot] + public abstract class ShieldBehavior : BaseEntity + { + public abstract int ProtectionValue { get; set; } + } + + public class WoodenShield : Shield + { + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public override ShieldBehavior Behavior { get; set; } + } + + public class WoodenShieldBehavior : ShieldBehavior + { + [Field] + public override int ProtectionValue { get; set; } + } +} + + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0582_OverrideInterfaceDefinedAssociation : AutoBuildTest + { + [Test] + [Ignore("Bug hasn't been fixed yet")] + public void AssociationDefinedInInterface() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (V1.Regime).Assembly, typeof (V1.Regime).Namespace); + using (var domain = BuildDomain(configuration)) { + Assert.AreEqual(1, domain.Model.Associations.Count); + var interfaceAssociation = domain.Model.Types[typeof (V1.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; + Assert.That(interfaceAssociation.OnOwnerRemove,Is.EqualTo(OnRemoveAction.Cascade)); + Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); + var regimeField = domain.Model.Types[typeof (V1.Country)].Fields["ZeroToOne"]; + Assert.AreEqual(1, regimeField.Associations.Count); + var association = regimeField.Associations[0]; + Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); + Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); + } + } + + [Test] + [Ignore("Bug hasn't been fixed yet")] + public void AssociationDefinedInInterfaceAndOverridenByImplementor() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (V2.Regime).Assembly, typeof (V2.Regime).Namespace); + using (var domain = BuildDomain(configuration)) { + Assert.AreEqual(2, domain.Model.Associations.Count); + var interfaceAssociation = domain.Model.Types[typeof(V2.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; + Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.None)); + Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.None)); + var countryRegimeField = domain.Model.Types[typeof(V2.Country)].Fields["ZeroToOne"]; + Assert.AreEqual(1, countryRegimeField.Associations.Count); + var overriddenAssociation = countryRegimeField.Associations[0]; + Assert.That(overriddenAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); + Assert.That(overriddenAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); + + var phoneRegimeField = domain.Model.Types[typeof(V2.Phone)].Fields["ZeroToOne"]; + Assert.AreEqual(1, phoneRegimeField.Associations.Count); + var association = phoneRegimeField.Associations[0]; + Assert.That(association.OnOwnerRemove, Is.EqualTo(interfaceAssociation.OnOwnerRemove)); + Assert.That(association.OnTargetRemove, Is.EqualTo(interfaceAssociation.OnTargetRemove)); + } + } + + [Test] + [Ignore("Bug hasn't been fixed yet")] + public void AssociationDefinedByEachImplementorInTheSameWay() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (V3.Regime).Assembly, typeof (V3.Regime).Namespace); + using (var domain = BuildDomain(configuration)) { + Assert.AreEqual(1, domain.Model.Associations.Count); + var interfaceAssociation = domain.Model.Types[typeof(V1.IHasRegimeReference)].Fields["ZeroToOne"].Associations[0]; + Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); + Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); + var regimeField = domain.Model.Types[typeof(V1.Country)].Fields["ZeroToOne"]; + Assert.AreEqual(1, regimeField.Associations.Count); + var association = regimeField.Associations[0]; + Assert.That(interfaceAssociation.OnOwnerRemove, Is.EqualTo(OnRemoveAction.Cascade)); + Assert.That(interfaceAssociation.OnTargetRemove, Is.EqualTo(OnRemoveAction.Default)); + } + } + + [Test] + [Ignore("Bug hasn't been fixed yet")] + public void AssociationDefinedByEachImplementorInDifferentWay() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(V4.Regime).Assembly, typeof(V4.Regime).Namespace); + using (var domain = BuildDomain(configuration)) + { + + } + } + + public override void TestFixtureSetUp() + { + CheckRequirements(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0584_IncorrectMappingOfColumnInQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0584_IncorrectMappingOfColumnInQuery.cs index 49d66ffed2..8da2cd4acc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0584_IncorrectMappingOfColumnInQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0584_IncorrectMappingOfColumnInQuery.cs @@ -1,1361 +1,1361 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.05.21 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0584_IncorrectMappingOfColumnInQueryModel; -using Xtensive.Sql; -using Xtensive.Sql.Dml; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0584_IncorrectMappingOfColumnInQueryModel -{ - public enum PacioliAccountType - { - Passive, - Active, - ActivePassive - } - - public enum DealType - { - RoundsPlannedDeal, - LeftOffPlannedDeal, - RealDeal, - } - - public enum DebitCredit - { - Debit, - Credit, - } - - [KeyGenerator(KeyGeneratorKind.None)] - public abstract class EntityBase : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - protected EntityBase(Guid id) - : base(id) - { - } - } - - public abstract class TablePartBase : EntityBase - { - [Field] - public FinToolKind Owner { get; private set; } - - protected TablePartBase(Guid id, FinToolKind owner) - : base(id) - { - Owner = owner; - } - - [HierarchyRoot] - public class FinToolKind : EntityBase - { - [Field(Nullable = false, Length = 100)] - public string Name { get; set; } - - [Field(Nullable = false, Length = 100)] - public string FullName { get; set; } - - [Field] - public FinToolKind Parent { get; set; } - - [Field] - public string Entity { get; set; } - - [Field] - public bool Quantitative { get; set; } - - [Field] - [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] - public EntitySet PriceCalc { get; private set; } - - public FinToolKind(Guid id) - : base(id) - { - } - - [HierarchyRoot] - public class TpPriceCalc : TablePartBase - { - [Field(Nullable = false)] - public PacioliAccount Account { get; set; } - - [Field] - public bool OnlyCurrentType { get; set; } - - public TpPriceCalc(Guid id, FinToolKind owner) - : base(id, owner) - { - } - } - } - } - - [HierarchyRoot] - public abstract class FinToolBase : EntityBase - { - [Field(Length = 300, Nullable = false)] - public virtual string Name { get; set; } - - [Field(Length = 50, Nullable = false)] - public string DocumentIdentifier { get; set; } - - [Field(Nullable = false)] - public TablePartBase.FinToolKind FinToolKind { get; set; } - - [Field(Nullable = false)] - public virtual Currency Cur { get; set; } - - public FinToolBase(Guid id) - : base(id) - { - } - } - - public class OtherFinTools : FinToolBase - { - public OtherFinTools(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class Status : EntityBase - { - [Field] - public string Description { get; set; } - - [Field] - public string Name { get; set; } - - public Status(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class Currency : EntityBase - { - [Field(Length = 20)] - public string CurCode { get; set; } - - [Field(Length = 3)] - public string DigitCode { get; set; } - - [Field] - public int? MinorUnits { get; set; } - - [Field(Length = 400, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 400)] - public string Description { get; set; } - - [Field(Length = 20)] - public string Sign { get; set; } - - [Field(Length = 400)] - public string EngName { get; set; } - - public Currency(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public abstract class Subject : EntityBase - { - [Field(Length = 8)] - public int? Code { get; set; } - - [Field(Nullable = false, Length = 255)] - public string Name { get; set; } - - [Field(Nullable = false, Length = 400)] - public string FullName { get; set; } - - [Field(Nullable = false, Length = 20)] - public virtual string Identifier { get; set; } - - public Subject(Guid id) - : base(id) - { - } - } - - public abstract class Portfolio : Subject - { - [Field(Length = 400)] - public string LegalName { get; set; } - - [Field] - public DateTime? DateOnService { get; set; } - - [Field] - public DateTime? DateRemovalFromService { get; set; } - - [Field] - public DateTime? EisTransitionDate { get; set; } - - [Field] - public DateTime? ImportedToDate { get; set; } - - protected Portfolio(Guid id) - : base(id) - { - } - } - - public class RealPortfolio : Portfolio - { - public RealPortfolio(Guid id) - :base(id) - {} - } - - public abstract class DocumentBase : EntityBase - { - [Field] - public Status Status { get; set; } - - public DocumentBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public abstract class OperationBase : DocumentBase - { - [Field(Length = 50)] - public string Number { get; set; } - - [Field] - public DateTime? InputDate { get; set; } - - [Field] - public DateTime? AuthorizationDate { get; set; } - - [Field] - public OperationType OperationType { get; set; } - - [Field] - public Portfolio Portfolio { get; set; } - - [Field(Length = 1024)] - public string Comment { get; set; } - - protected OperationBase(Guid id) - : base(id) - { - } - } - - public class TechOperation : OperationBase - { - [Field] - public string ForeignId { get; set; } - - public TechOperation(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class OperationType : EntityBase - { - [Field(Length = 255, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 255)] - public string Description { get; set; } - - [Field] - public PacioliAccount Account { get; set; } - - public OperationType(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class PacioliAccount : EntityBase - { - [Field, Key] - public Guid Id { get; set; } - - [Field] - public PacioliAccount Parent { get; set; } - - [Field(Length = 128, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 4000)] - public string Description { get; set; } - - [Field(Length = 32, Nullable = false)] - public string Code { get; set; } - - [Field(Length = 32, Nullable = false)] - public string FastAccess { get; set; } - - [Field] - public PacioliAccountType AccountType { get; set; } - - public PacioliAccount(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class PacioliPosting : DocumentBase - { - [Field] - public FinToolBase FinDebit { get; set; } - - [Field] - public FinToolBase FinCredit { get; set; } - - [Field(Nullable = false)] - public Portfolio BalanceHolder { get; set; } - - [Field] - public string Name { get; set; } - - [Field(Nullable = false)] - public OperationBase Operation { get; set; } - - [Field] - public string ForeignId { get; set; } - - [Field(Length = 12)] - public string ForeignIdHash { get; set; } - - [Field] - public PacioliAccount DebitAccount { get; set; } - - [Field] - public PacioliAccount CreditAccount { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public DateTime? ExecutionDate { get; set; } - - [Field] - public decimal Sum { get; set; } - - [Field] - public Currency Currency { get; set; } - - [Field(Indexed = false)] - public FinToolBase DebitFinTool { get; set; } - - [Field(Indexed = false)] - public FinToolBase CreditFinTool { get; set; } - - [Field] - public DealType Deal { get; set; } - - public PacioliPosting(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class RegTransaction : Entity - { - [Field, Key] - public Guid Id { get; set; } - - [Field] - public DateTime? AuthorizeDate { get; set; } - - [Field] - public DateTime? OperDate { get; set; } - - [Field] - public Portfolio Portfolio { get; set; } - - [Field] - public TablePartBase.FinToolKind FinTool { get; set; } - - [Field] - public TransactionMethod Method { get; set; } - - [Field] - public decimal Qty { get; set; } - - [Field] - public decimal Price { get; set; } - } - - public enum TransactionMethod - { - Debit - } - - public class CustomPosting - { - public Guid Id { get; set; } - - public DateTime CreationDate { get; set; } - - public DateTime? ExecutionDate { get; set; } - - public Portfolio BalanceHolder { get; set; } - - public OperationBase Operation { get; set; } - - public OperationType OperationType { get; set; } - - public decimal Sum { get; set; } - - public Currency Currency { get; set; } - - public Status Status { get; set; } - - public PacioliAccount MasterAccount { get; set; } - - public PacioliAccount SlaveAccount { get; set; } - - public FinToolBase MasterFinToolBase { get; set; } - - public FinToolBase SlaveFinToolBase { get; set; } - - public TablePartBase.FinToolKind MasterFinToolKind { get; set; } - - public TablePartBase.FinToolKind SlaveFinToolKind { get; set; } - } - - public static class GuidModifier - { - public static Guid ReplaceOne(Guid source, string replacement) - { - return Guid.Parse(source.ToString().Substring(0, 35) + replacement); - } - } - - [CompilerContainer(typeof(SqlExpression))] - public class GuidCompilers - { - [Compiler(typeof(GuidModifier), "ReplaceOne", TargetKind.Method | TargetKind.Static)] - public static SqlExpression CompileReplaceOne(SqlExpression sourceSqlExpression, SqlExpression replacement) - { - var stringId = SqlDml.Cast(sourceSqlExpression, SqlType.VarCharMax); - var substringId = SqlDml.Substring(stringId, 0, 35); - return SqlDml.Cast(SqlDml.Concat(substringId, replacement), SqlType.Guid); - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0584_IncorrectMappingOfColumnInQuery : AutoBuildTest - { - private ProviderKind? previousProviderKind; - - [Test(Description = "Case when calculated column in the midle of selected columns averege")] - public void IncludeProviderOptimizationTest01() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting() { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test(Description = "Case when calculated column is first columns of selection")] - public void IncludeProviderOptimizationTest02() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test(Description = "Case when calculated column is the second column in selection")] - public void IncludeProviderOptimizationTest03() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test(Description = "Case when calculated columns is right before the last columns in selection")] - public void IncludeProviderOptimizationTest04() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test (Description = "Case when calculated column is the last column in selection")] - public void IncludeProviderOptimizationTest05() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test] - public void AdditionalTest01() - { - EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var portfolioId = session.Query.All().Select(el=>el.Id).First(); - var assistant = new {PortfolioId = portfolioId, PriceOnDate = DateTime.Now, DateOfFormation = DateTime.Now,}; - var transactions = Session.Current.Query.All() - .Where(a => a.AuthorizeDate!=null && a.OperDate!=null && a.Portfolio.Id==assistant.PortfolioId) - .Where(a => a.AuthorizeDate.Value.Date <= assistant.DateOfFormation && a.OperDate.Value.Date <= assistant.PriceOnDate); - - var balanceFinTools = transactions.Select( - z => new { - z.FinTool, - Sum = z.Method==TransactionMethod.Debit ? z.Qty : -z.Qty, - SumPrice = z.Method==TransactionMethod.Debit ? z.Price : -z.Price - }).GroupBy(r => r.FinTool) - .Select(f => new {FinTool = f.Key, Summ = f.Sum(s => s.Sum), SummPrice = f.Sum(s => s.SumPrice)}) - .Where(a => a.Summ!=0); - - Assert.DoesNotThrow(() => { balanceFinTools.Select(a => a.FinTool.Id).Distinct().ToArray(); }); - } - } - - [Test] - public void TakeProviderOptimizationTest01() - { - EnsureRightDateIsInStorage(ProviderKind.TakeProvider); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var allPostings = Query.All(); - var masterDebit = - allPostings.Select( - posting => - new { - Id = GuidModifier.ReplaceOne(posting.Id, "1"), - Posting = posting, - Sum = posting.DebitAccount.AccountType==PacioliAccountType.Passive ? -posting.Sum : posting.Sum, - MasterFinToolBase = posting.DebitFinTool - }); - - var masterCredit = - allPostings.Select( - posting => - new { - Id = GuidModifier.ReplaceOne(posting.Id, "9"), - Posting = posting, - Sum = posting.CreditAccount.AccountType==PacioliAccountType.Active || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - MasterFinToolBase = posting.CreditFinTool - }); - - var concatination = masterCredit.Concat(masterDebit); - var usefulColumnsSelection = from raw in concatination - select new { - Id = raw.Id, - Posting = raw.Posting, - Sum = raw.Sum, - MasterFinToolBase = raw.MasterFinToolBase, - }; - - var finalQuery = from raw in usefulColumnsSelection.Select( - selectionItem => new { - MasterFinToolBase = selectionItem.MasterFinToolBase, - Sum = selectionItem.Sum, - Id = selectionItem.Posting.Id - }) - where raw.MasterFinToolBase!=null - group raw by new { - MasterFinToolBase = raw.MasterFinToolBase - } - into grouping - select new { - MasterFinToolBase = grouping.Key.MasterFinToolBase, - Sum = grouping.Sum(s => s.Sum), - Id = grouping.Select(x => x.Id).First() - }; - Assert.DoesNotThrow(() => { finalQuery.ToArray(); }); - transaction.Complete(); - } - } - - [Test] - public void JoinAsSourceOfSetOperation() - { - EnsureRightDateIsInStorage(ProviderKind.TakeProvider); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var tp = from q in Query.All() - select - new { - q.Account, - OnlyCurrentType = !q.OnlyCurrentType, - FinToolKind = q.OnlyCurrentType ? Guid.Empty : q.Owner.Id - }; - - var masterDebit = from q in Query.All() - select - new { - Id = q.Id, - Posting = q, - DebitCredit = DebitCredit.Debit, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.DebitAccount, - MasterFinToolBase = q.DebitFinTool, - }; - - var masterCredit = from q in Query.All() - select - new { - Id = q.Id, - Posting = q, - DebitCredit = DebitCredit.Credit, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.CreditAccount, - MasterFinToolBase = q.CreditFinTool, - }; - - var preResult = masterCredit.Concat(masterDebit); - - var result = - from r in - preResult.Join(tp.Distinct(), a => a.MasterAccount, a => a.Account, (a, pm) => new {pp = a, pm}) - .LeftJoin(Query.All(), a => a.pm.FinToolKind, a => a.Id, (a, b) => new {pp = a.pp, pm = a.pm, fk = b}) - let q = r.pp - select - new { - Id = q.Id, - Posting = q.Posting, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.MasterAccount, - MasterFinToolBase = q.MasterFinToolBase, - MasterFinToolKind = r.pm.OnlyCurrentType ? r.fk : q.MasterFinToolBase.FinToolKind, - AccountType = q.MasterAccount.AccountType - }; - - var xx = - from a in - result - .Select( - a => - new { - MasterFinToolBase = a.MasterFinToolBase, - MasterFinToolKind = a.MasterFinToolKind, - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - ExecutionDate = a.ExecutionDate, - Deal = a.Deal, - MasterAccount = a.MasterAccount, - Sum = a.Sum, - Posting = a.Posting - }) - where a.MasterFinToolBase!=null && a.MasterFinToolKind!=null - group a by - new { - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - Deal = a.Deal, - ExecutionDate = a.ExecutionDate, - MasterAccount = a.MasterAccount, - MasterFinToolBase = a.MasterFinToolBase - } - into gr - select - new { - ExecutionDate = gr.Key.ExecutionDate, - BalanceHolder = gr.Key.BalanceHolder, - MasterFinToolBase = gr.Key.MasterFinToolBase, - Currency = gr.Key.Currency, - CreationDate = gr.Key.CreationDate, - Deal = gr.Key.Deal, - MasterAccount = gr.Key.MasterAccount, - Sum = gr.Sum(s => s.Sum), - Id = gr.Select(a => a.Posting).First().Id - }; - - Assert.DoesNotThrow(() => result.Run()); - } - } - - private void PopulateDataForIncludeProvider() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var currency = new Currency(Guid.NewGuid()) { CurCode = "RU", Name = "Ruble" }; - - var debitPassiveAccount = new PacioliAccount(Guid.NewGuid()); - debitPassiveAccount.AccountType = PacioliAccountType.Passive; - debitPassiveAccount.Code = "12345"; - debitPassiveAccount.Description = "debitPassiveAccount"; - debitPassiveAccount.FastAccess = "debitPassiveAccount"; - debitPassiveAccount.Name = "debitPassiveAccount"; - - var debitActiveAccount = new PacioliAccount(Guid.NewGuid()); - debitActiveAccount.AccountType = PacioliAccountType.Active; - debitActiveAccount.Code = "23456"; - debitActiveAccount.Description = "debitActiveAccount"; - debitActiveAccount.FastAccess = "debitActiveAccount"; - debitActiveAccount.Name = "debitActiveAccount"; - - var debitActivePassiveAccount = new PacioliAccount(Guid.NewGuid()); - debitActivePassiveAccount.AccountType = PacioliAccountType.ActivePassive; - debitActivePassiveAccount.Code = "34567"; - debitActivePassiveAccount.Description = "debitActivePassiveAccount"; - debitActivePassiveAccount.FastAccess = "debitActivePassiveAccount"; - debitActivePassiveAccount.Name = "debitActivePassiveAccount"; - - var creditPassiveAccount = new PacioliAccount(Guid.NewGuid()); - creditPassiveAccount.AccountType = PacioliAccountType.Passive; - creditPassiveAccount.Code = "45678"; - creditPassiveAccount.Description = "creditPassiveAccount"; - creditPassiveAccount.FastAccess = "creditPassiveAccount"; - creditPassiveAccount.Name = "creditPassiveAccount"; - - var creditActiveAccount = new PacioliAccount(Guid.NewGuid()); - creditActiveAccount.AccountType = PacioliAccountType.Active; - creditActiveAccount.Code = "56789"; - creditActiveAccount.Description = "creditActiveAccount"; - creditActiveAccount.FastAccess = "creditActiveAccount"; - creditActiveAccount.Name = "creditActiveAccount"; - - var creditActivePassiveAccount = new PacioliAccount(Guid.NewGuid()); - creditActivePassiveAccount.AccountType = PacioliAccountType.ActivePassive; - creditActivePassiveAccount.Code = "67890"; - creditActivePassiveAccount.Description = "creditActivePassiveAccount"; - creditActivePassiveAccount.FastAccess = "creditActivePassiveAccount"; - creditActivePassiveAccount.Name = "creditActivePassiveAccount"; - - var fintoolkindOwner = new TablePartBase.FinToolKind(Guid.NewGuid()) { Name = "fgjlhjfglkhjfg", FullName = "jfhjhgfkdhkgjhfkgjh" }; - var priceCalc1 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc1.OnlyCurrentType = true; - priceCalc1.Account = debitActiveAccount; - - var priceCalc2 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc2.OnlyCurrentType = true; - priceCalc2.Account = debitPassiveAccount; - - var priceCalc3 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc3.OnlyCurrentType = true; - priceCalc3.Account = debitActivePassiveAccount; - - var priceCalc4 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc4.OnlyCurrentType = true; - priceCalc4.Account = creditActiveAccount; - - var priceCalc5 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc5.OnlyCurrentType = true; - priceCalc5.Account = creditPassiveAccount; - - var priceCalc6 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc6.OnlyCurrentType = true; - priceCalc6.Account = creditActivePassiveAccount; - - var priceCalc7 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc7.OnlyCurrentType = false; - priceCalc7.Account = debitActiveAccount; - - var priceCalc8 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc8.OnlyCurrentType = false; - priceCalc8.Account = debitPassiveAccount; - - var priceCalc9 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc9.OnlyCurrentType = false; - priceCalc9.Account = debitActivePassiveAccount; - - var priceCalc10 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc10.OnlyCurrentType = false; - priceCalc10.Account = creditActiveAccount; - - var priceCalc11 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc11.OnlyCurrentType = false; - priceCalc11.Account = creditPassiveAccount; - - var priceCalc12 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); - priceCalc12.OnlyCurrentType = false; - priceCalc12.Account = creditActivePassiveAccount; - - var posting1 = new PacioliPosting(Guid.NewGuid()); - posting1.Sum = new decimal(11); - posting1.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfgkjhdfj", FullName = "dhsfhkjh khgkjdfhgkj", Identifier = "uyiyriet"}; - posting1.CreationDate = DateTime.Now; - posting1.CreditAccount = creditPassiveAccount; - posting1.DebitAccount = debitPassiveAccount; - posting1.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "aaaa", Name = "aaaa"}; - posting1.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "bbbb", Name = "bbbb"}; - posting1.Operation = new TechOperation(Guid.NewGuid()); - - var posting2 = new PacioliPosting(Guid.NewGuid()); - posting2.Sum = new decimal(12); - posting2.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfg", FullName = "dhsfhkjh khgkj", Identifier = "udfjgkjhfdk"}; - posting2.CreationDate = DateTime.Now; - posting2.CreditAccount = creditPassiveAccount; - posting2.DebitAccount = debitActiveAccount; - posting2.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "cccc", Name = "cccc"}; - posting2.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "dddd", Name = "dddd"}; - posting2.Operation = new TechOperation(Guid.NewGuid()); - - var posting3 = new PacioliPosting(Guid.NewGuid()); - posting3.Sum = new decimal(13); - posting3.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfj", FullName = "dhsfhkjh", Identifier = "utrtoiore"}; - posting3.CreationDate = DateTime.Now; - posting3.CreditAccount = creditPassiveAccount; - posting3.DebitAccount = debitActivePassiveAccount; - posting3.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "eeee", Name = "eeee"}; - posting3.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "ffff", Name = "ffff"}; - posting3.Operation = new TechOperation(Guid.NewGuid()); - - var posting4 = new PacioliPosting(Guid.NewGuid()); - posting4.Sum = new decimal(14); - posting4.BalanceHolder = new RealPortfolio(Guid.NewGuid()) { Name = "kjhdfgkjhdfj", FullName = "kjh khgkjdfhgkj", Identifier = "dfkgkfdj" }; - posting4.CreationDate = DateTime.Now; - posting4.CreditAccount = creditActiveAccount; - posting4.DebitAccount = debitPassiveAccount; - posting4.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "gggg", Name = "gggg"}; - posting4.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "hhh", Name = "hhh"}; - posting4.Operation = new TechOperation(Guid.NewGuid()); - - var posting5 = new PacioliPosting(Guid.NewGuid()); - posting5.Sum = new decimal(-15); - posting5.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "reotoihre", FullName = "fghdg hdufgihiu", Identifier = "ghdfgjhf"}; - posting5.CreationDate = DateTime.Now; - posting5.CreditAccount = creditActiveAccount; - posting5.DebitAccount = debitActiveAccount; - posting5.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "iii", Name = "iiii"}; - posting5.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "jjj", Name = "jjj"}; - posting5.Operation = new TechOperation(Guid.NewGuid()); - - var posting6 = new PacioliPosting(Guid.NewGuid()); - posting6.Sum = new decimal(-14); - posting6.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "hfgdhdfhjghhkj", FullName = "kjh jdfhghjdgh", Identifier = "jdhfkgjhfkjgh"}; - posting6.CreationDate = DateTime.Now; - posting6.CreditAccount = creditActiveAccount; - posting6.DebitAccount = debitActivePassiveAccount; - posting6.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "kkkk", Name = "kkkk"}; - posting6.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "llll", Name = "llll"}; - posting6.Operation = new TechOperation(Guid.NewGuid()); - - var posting7 = new PacioliPosting(Guid.NewGuid()); - posting7.Sum = new decimal(-13); - posting7.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "hjdjhfghjdfhg", FullName = "dfgjdfhkgkj khgkjdfhgkj", Identifier = "dfbghkjdfhgkj"}; - posting7.CreationDate = DateTime.Now; - posting7.CreditAccount = creditActivePassiveAccount; - posting7.DebitAccount = debitPassiveAccount; - posting7.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "mmmm", Name = "mmm"}; - posting7.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "nnn", Name = "nnn"}; - posting7.Operation = new TechOperation(Guid.NewGuid()); - - var posting8 = new PacioliPosting(Guid.NewGuid()); - posting8.Sum = new decimal(130); - posting8.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "yrietyiury", FullName = "dhkgkj khgkjdfhgkj", Identifier = "dfbghj"}; - posting8.CreationDate = DateTime.Now; - posting8.CreditAccount = creditActivePassiveAccount; - posting8.DebitAccount = debitActiveAccount; - posting8.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "oooo", Name = "ooo"}; - posting8.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "ppp", Name = "ppp"}; - posting8.Operation = new TechOperation(Guid.NewGuid()); - - var posting9 = new PacioliPosting(Guid.NewGuid()); - posting9.Sum = new decimal(-113); - posting9.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "biibibibob", FullName = "nbknf riewuruiet", Identifier = "ncvbmnvbcm"}; - posting9.CreationDate = DateTime.Now; - posting9.CreditAccount = creditActivePassiveAccount; - posting9.DebitAccount = debitActivePassiveAccount; - posting9.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "qqqq", Name = "qqq"}; - posting9.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "rrr", Name = "rrr"}; - posting9.Operation = new TechOperation(Guid.NewGuid()); - - transaction.Complete(); - } - } - - public void PopulateDataForTakeProvider() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var status = new Status(Guid.NewGuid()) { Name = "aa" }; - var currency = new Currency(Guid.NewGuid()) { Name = "aa", CurCode = "qwe", DigitCode = "123", EngName = "re" }; - session.SaveChanges(); - - var port = new RealPortfolio(Guid.NewGuid()) { Name = "ww", FullName = "ee", Identifier = "w" }; - var operation = new TechOperation(Guid.NewGuid()); - operation.Status = status; - session.SaveChanges(); - - var finToolKind = new TablePartBase.FinToolKind(Guid.NewGuid()) { Name = "aa", FullName = "qq" }; - var finTool1 = new OtherFinTools(Guid.NewGuid()) { Name = "aa", DocumentIdentifier = "wewe", Cur = currency, FinToolKind = finToolKind }; - var finTool2 = new OtherFinTools(Guid.NewGuid()) - { - Name = "aaw", - DocumentIdentifier = "wewee", - Cur = currency, - FinToolKind = finToolKind, - }; - session.SaveChanges(); - - var pp = new PacioliAccount(Guid.NewGuid()) { AccountType = PacioliAccountType.Active, Name = "aa", FastAccess = "w", Code = "x" }; - new PacioliPosting(Guid.NewGuid()) { - Name = "a", - Status = status, - DebitAccount = pp, - CreditAccount = pp, - CreditFinTool = finTool1, - DebitFinTool = finTool2, - Sum = 1, - Currency = currency, - BalanceHolder = port, - Operation = operation - }; - transaction.Complete(); - } - } - - public void EnsureRightDateIsInStorage(ProviderKind providerKind) - { - if (previousProviderKind.HasValue && previousProviderKind!=providerKind) { - RebuildDomain(); - previousProviderKind = providerKind; - } - switch (providerKind) { - case ProviderKind.IncludeProvider: { - PopulateDataForTakeProvider(); - return; - } - case ProviderKind.TakeProvider: { - PopulateDataForIncludeProvider(); - return; - } - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(CustomPosting).Assembly, typeof(CustomPosting).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } - - public enum ProviderKind - { - IncludeProvider, - TakeProvider - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.05.21 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0584_IncorrectMappingOfColumnInQueryModel; +using Xtensive.Sql; +using Xtensive.Sql.Dml; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0584_IncorrectMappingOfColumnInQueryModel +{ + public enum PacioliAccountType + { + Passive, + Active, + ActivePassive + } + + public enum DealType + { + RoundsPlannedDeal, + LeftOffPlannedDeal, + RealDeal, + } + + public enum DebitCredit + { + Debit, + Credit, + } + + [KeyGenerator(KeyGeneratorKind.None)] + public abstract class EntityBase : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + protected EntityBase(Guid id) + : base(id) + { + } + } + + public abstract class TablePartBase : EntityBase + { + [Field] + public FinToolKind Owner { get; private set; } + + protected TablePartBase(Guid id, FinToolKind owner) + : base(id) + { + Owner = owner; + } + + [HierarchyRoot] + public class FinToolKind : EntityBase + { + [Field(Nullable = false, Length = 100)] + public string Name { get; set; } + + [Field(Nullable = false, Length = 100)] + public string FullName { get; set; } + + [Field] + public FinToolKind Parent { get; set; } + + [Field] + public string Entity { get; set; } + + [Field] + public bool Quantitative { get; set; } + + [Field] + [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] + public EntitySet PriceCalc { get; private set; } + + public FinToolKind(Guid id) + : base(id) + { + } + + [HierarchyRoot] + public class TpPriceCalc : TablePartBase + { + [Field(Nullable = false)] + public PacioliAccount Account { get; set; } + + [Field] + public bool OnlyCurrentType { get; set; } + + public TpPriceCalc(Guid id, FinToolKind owner) + : base(id, owner) + { + } + } + } + } + + [HierarchyRoot] + public abstract class FinToolBase : EntityBase + { + [Field(Length = 300, Nullable = false)] + public virtual string Name { get; set; } + + [Field(Length = 50, Nullable = false)] + public string DocumentIdentifier { get; set; } + + [Field(Nullable = false)] + public TablePartBase.FinToolKind FinToolKind { get; set; } + + [Field(Nullable = false)] + public virtual Currency Cur { get; set; } + + public FinToolBase(Guid id) + : base(id) + { + } + } + + public class OtherFinTools : FinToolBase + { + public OtherFinTools(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class Status : EntityBase + { + [Field] + public string Description { get; set; } + + [Field] + public string Name { get; set; } + + public Status(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class Currency : EntityBase + { + [Field(Length = 20)] + public string CurCode { get; set; } + + [Field(Length = 3)] + public string DigitCode { get; set; } + + [Field] + public int? MinorUnits { get; set; } + + [Field(Length = 400, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 400)] + public string Description { get; set; } + + [Field(Length = 20)] + public string Sign { get; set; } + + [Field(Length = 400)] + public string EngName { get; set; } + + public Currency(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public abstract class Subject : EntityBase + { + [Field(Length = 8)] + public int? Code { get; set; } + + [Field(Nullable = false, Length = 255)] + public string Name { get; set; } + + [Field(Nullable = false, Length = 400)] + public string FullName { get; set; } + + [Field(Nullable = false, Length = 20)] + public virtual string Identifier { get; set; } + + public Subject(Guid id) + : base(id) + { + } + } + + public abstract class Portfolio : Subject + { + [Field(Length = 400)] + public string LegalName { get; set; } + + [Field] + public DateTime? DateOnService { get; set; } + + [Field] + public DateTime? DateRemovalFromService { get; set; } + + [Field] + public DateTime? EisTransitionDate { get; set; } + + [Field] + public DateTime? ImportedToDate { get; set; } + + protected Portfolio(Guid id) + : base(id) + { + } + } + + public class RealPortfolio : Portfolio + { + public RealPortfolio(Guid id) + :base(id) + {} + } + + public abstract class DocumentBase : EntityBase + { + [Field] + public Status Status { get; set; } + + public DocumentBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public abstract class OperationBase : DocumentBase + { + [Field(Length = 50)] + public string Number { get; set; } + + [Field] + public DateTime? InputDate { get; set; } + + [Field] + public DateTime? AuthorizationDate { get; set; } + + [Field] + public OperationType OperationType { get; set; } + + [Field] + public Portfolio Portfolio { get; set; } + + [Field(Length = 1024)] + public string Comment { get; set; } + + protected OperationBase(Guid id) + : base(id) + { + } + } + + public class TechOperation : OperationBase + { + [Field] + public string ForeignId { get; set; } + + public TechOperation(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class OperationType : EntityBase + { + [Field(Length = 255, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 255)] + public string Description { get; set; } + + [Field] + public PacioliAccount Account { get; set; } + + public OperationType(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class PacioliAccount : EntityBase + { + [Field, Key] + public Guid Id { get; set; } + + [Field] + public PacioliAccount Parent { get; set; } + + [Field(Length = 128, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 4000)] + public string Description { get; set; } + + [Field(Length = 32, Nullable = false)] + public string Code { get; set; } + + [Field(Length = 32, Nullable = false)] + public string FastAccess { get; set; } + + [Field] + public PacioliAccountType AccountType { get; set; } + + public PacioliAccount(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class PacioliPosting : DocumentBase + { + [Field] + public FinToolBase FinDebit { get; set; } + + [Field] + public FinToolBase FinCredit { get; set; } + + [Field(Nullable = false)] + public Portfolio BalanceHolder { get; set; } + + [Field] + public string Name { get; set; } + + [Field(Nullable = false)] + public OperationBase Operation { get; set; } + + [Field] + public string ForeignId { get; set; } + + [Field(Length = 12)] + public string ForeignIdHash { get; set; } + + [Field] + public PacioliAccount DebitAccount { get; set; } + + [Field] + public PacioliAccount CreditAccount { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public DateTime? ExecutionDate { get; set; } + + [Field] + public decimal Sum { get; set; } + + [Field] + public Currency Currency { get; set; } + + [Field(Indexed = false)] + public FinToolBase DebitFinTool { get; set; } + + [Field(Indexed = false)] + public FinToolBase CreditFinTool { get; set; } + + [Field] + public DealType Deal { get; set; } + + public PacioliPosting(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class RegTransaction : Entity + { + [Field, Key] + public Guid Id { get; set; } + + [Field] + public DateTime? AuthorizeDate { get; set; } + + [Field] + public DateTime? OperDate { get; set; } + + [Field] + public Portfolio Portfolio { get; set; } + + [Field] + public TablePartBase.FinToolKind FinTool { get; set; } + + [Field] + public TransactionMethod Method { get; set; } + + [Field] + public decimal Qty { get; set; } + + [Field] + public decimal Price { get; set; } + } + + public enum TransactionMethod + { + Debit + } + + public class CustomPosting + { + public Guid Id { get; set; } + + public DateTime CreationDate { get; set; } + + public DateTime? ExecutionDate { get; set; } + + public Portfolio BalanceHolder { get; set; } + + public OperationBase Operation { get; set; } + + public OperationType OperationType { get; set; } + + public decimal Sum { get; set; } + + public Currency Currency { get; set; } + + public Status Status { get; set; } + + public PacioliAccount MasterAccount { get; set; } + + public PacioliAccount SlaveAccount { get; set; } + + public FinToolBase MasterFinToolBase { get; set; } + + public FinToolBase SlaveFinToolBase { get; set; } + + public TablePartBase.FinToolKind MasterFinToolKind { get; set; } + + public TablePartBase.FinToolKind SlaveFinToolKind { get; set; } + } + + public static class GuidModifier + { + public static Guid ReplaceOne(Guid source, string replacement) + { + return Guid.Parse(source.ToString().Substring(0, 35) + replacement); + } + } + + [CompilerContainer(typeof(SqlExpression))] + public class GuidCompilers + { + [Compiler(typeof(GuidModifier), "ReplaceOne", TargetKind.Method | TargetKind.Static)] + public static SqlExpression CompileReplaceOne(SqlExpression sourceSqlExpression, SqlExpression replacement) + { + var stringId = SqlDml.Cast(sourceSqlExpression, SqlType.VarCharMax); + var substringId = SqlDml.Substring(stringId, 0, 35); + return SqlDml.Cast(SqlDml.Concat(substringId, replacement), SqlType.Guid); + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0584_IncorrectMappingOfColumnInQuery : AutoBuildTest + { + private ProviderKind? previousProviderKind; + + [Test(Description = "Case when calculated column in the midle of selected columns averege")] + public void IncludeProviderOptimizationTest01() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting() { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test(Description = "Case when calculated column is first columns of selection")] + public void IncludeProviderOptimizationTest02() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(()=>readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test(Description = "Case when calculated column is the second column in selection")] + public void IncludeProviderOptimizationTest03() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test(Description = "Case when calculated columns is right before the last columns in selection")] + public void IncludeProviderOptimizationTest04() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test (Description = "Case when calculated column is the last column in selection")] + public void IncludeProviderOptimizationTest05() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test] + public void AdditionalTest01() + { + EnsureRightDateIsInStorage(ProviderKind.IncludeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var portfolioId = session.Query.All().Select(el=>el.Id).First(); + var assistant = new {PortfolioId = portfolioId, PriceOnDate = DateTime.Now, DateOfFormation = DateTime.Now,}; + var transactions = Session.Current.Query.All() + .Where(a => a.AuthorizeDate!=null && a.OperDate!=null && a.Portfolio.Id==assistant.PortfolioId) + .Where(a => a.AuthorizeDate.Value.Date <= assistant.DateOfFormation && a.OperDate.Value.Date <= assistant.PriceOnDate); + + var balanceFinTools = transactions.Select( + z => new { + z.FinTool, + Sum = z.Method==TransactionMethod.Debit ? z.Qty : -z.Qty, + SumPrice = z.Method==TransactionMethod.Debit ? z.Price : -z.Price + }).GroupBy(r => r.FinTool) + .Select(f => new {FinTool = f.Key, Summ = f.Sum(s => s.Sum), SummPrice = f.Sum(s => s.SumPrice)}) + .Where(a => a.Summ!=0); + + Assert.DoesNotThrow(() => { balanceFinTools.Select(a => a.FinTool.Id).Distinct().ToArray(); }); + } + } + + [Test] + public void TakeProviderOptimizationTest01() + { + EnsureRightDateIsInStorage(ProviderKind.TakeProvider); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var allPostings = Query.All(); + var masterDebit = + allPostings.Select( + posting => + new { + Id = GuidModifier.ReplaceOne(posting.Id, "1"), + Posting = posting, + Sum = posting.DebitAccount.AccountType==PacioliAccountType.Passive ? -posting.Sum : posting.Sum, + MasterFinToolBase = posting.DebitFinTool + }); + + var masterCredit = + allPostings.Select( + posting => + new { + Id = GuidModifier.ReplaceOne(posting.Id, "9"), + Posting = posting, + Sum = posting.CreditAccount.AccountType==PacioliAccountType.Active || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + MasterFinToolBase = posting.CreditFinTool + }); + + var concatination = masterCredit.Concat(masterDebit); + var usefulColumnsSelection = from raw in concatination + select new { + Id = raw.Id, + Posting = raw.Posting, + Sum = raw.Sum, + MasterFinToolBase = raw.MasterFinToolBase, + }; + + var finalQuery = from raw in usefulColumnsSelection.Select( + selectionItem => new { + MasterFinToolBase = selectionItem.MasterFinToolBase, + Sum = selectionItem.Sum, + Id = selectionItem.Posting.Id + }) + where raw.MasterFinToolBase!=null + group raw by new { + MasterFinToolBase = raw.MasterFinToolBase + } + into grouping + select new { + MasterFinToolBase = grouping.Key.MasterFinToolBase, + Sum = grouping.Sum(s => s.Sum), + Id = grouping.Select(x => x.Id).First() + }; + Assert.DoesNotThrow(() => { finalQuery.ToArray(); }); + transaction.Complete(); + } + } + + [Test] + public void JoinAsSourceOfSetOperation() + { + EnsureRightDateIsInStorage(ProviderKind.TakeProvider); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var tp = from q in Query.All() + select + new { + q.Account, + OnlyCurrentType = !q.OnlyCurrentType, + FinToolKind = q.OnlyCurrentType ? Guid.Empty : q.Owner.Id + }; + + var masterDebit = from q in Query.All() + select + new { + Id = q.Id, + Posting = q, + DebitCredit = DebitCredit.Debit, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.DebitAccount, + MasterFinToolBase = q.DebitFinTool, + }; + + var masterCredit = from q in Query.All() + select + new { + Id = q.Id, + Posting = q, + DebitCredit = DebitCredit.Credit, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.CreditAccount, + MasterFinToolBase = q.CreditFinTool, + }; + + var preResult = masterCredit.Concat(masterDebit); + + var result = + from r in + preResult.Join(tp.Distinct(), a => a.MasterAccount, a => a.Account, (a, pm) => new {pp = a, pm}) + .LeftJoin(Query.All(), a => a.pm.FinToolKind, a => a.Id, (a, b) => new {pp = a.pp, pm = a.pm, fk = b}) + let q = r.pp + select + new { + Id = q.Id, + Posting = q.Posting, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.MasterAccount, + MasterFinToolBase = q.MasterFinToolBase, + MasterFinToolKind = r.pm.OnlyCurrentType ? r.fk : q.MasterFinToolBase.FinToolKind, + AccountType = q.MasterAccount.AccountType + }; + + var xx = + from a in + result + .Select( + a => + new { + MasterFinToolBase = a.MasterFinToolBase, + MasterFinToolKind = a.MasterFinToolKind, + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + ExecutionDate = a.ExecutionDate, + Deal = a.Deal, + MasterAccount = a.MasterAccount, + Sum = a.Sum, + Posting = a.Posting + }) + where a.MasterFinToolBase!=null && a.MasterFinToolKind!=null + group a by + new { + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + Deal = a.Deal, + ExecutionDate = a.ExecutionDate, + MasterAccount = a.MasterAccount, + MasterFinToolBase = a.MasterFinToolBase + } + into gr + select + new { + ExecutionDate = gr.Key.ExecutionDate, + BalanceHolder = gr.Key.BalanceHolder, + MasterFinToolBase = gr.Key.MasterFinToolBase, + Currency = gr.Key.Currency, + CreationDate = gr.Key.CreationDate, + Deal = gr.Key.Deal, + MasterAccount = gr.Key.MasterAccount, + Sum = gr.Sum(s => s.Sum), + Id = gr.Select(a => a.Posting).First().Id + }; + + Assert.DoesNotThrow(() => result.Run()); + } + } + + private void PopulateDataForIncludeProvider() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var currency = new Currency(Guid.NewGuid()) { CurCode = "RU", Name = "Ruble" }; + + var debitPassiveAccount = new PacioliAccount(Guid.NewGuid()); + debitPassiveAccount.AccountType = PacioliAccountType.Passive; + debitPassiveAccount.Code = "12345"; + debitPassiveAccount.Description = "debitPassiveAccount"; + debitPassiveAccount.FastAccess = "debitPassiveAccount"; + debitPassiveAccount.Name = "debitPassiveAccount"; + + var debitActiveAccount = new PacioliAccount(Guid.NewGuid()); + debitActiveAccount.AccountType = PacioliAccountType.Active; + debitActiveAccount.Code = "23456"; + debitActiveAccount.Description = "debitActiveAccount"; + debitActiveAccount.FastAccess = "debitActiveAccount"; + debitActiveAccount.Name = "debitActiveAccount"; + + var debitActivePassiveAccount = new PacioliAccount(Guid.NewGuid()); + debitActivePassiveAccount.AccountType = PacioliAccountType.ActivePassive; + debitActivePassiveAccount.Code = "34567"; + debitActivePassiveAccount.Description = "debitActivePassiveAccount"; + debitActivePassiveAccount.FastAccess = "debitActivePassiveAccount"; + debitActivePassiveAccount.Name = "debitActivePassiveAccount"; + + var creditPassiveAccount = new PacioliAccount(Guid.NewGuid()); + creditPassiveAccount.AccountType = PacioliAccountType.Passive; + creditPassiveAccount.Code = "45678"; + creditPassiveAccount.Description = "creditPassiveAccount"; + creditPassiveAccount.FastAccess = "creditPassiveAccount"; + creditPassiveAccount.Name = "creditPassiveAccount"; + + var creditActiveAccount = new PacioliAccount(Guid.NewGuid()); + creditActiveAccount.AccountType = PacioliAccountType.Active; + creditActiveAccount.Code = "56789"; + creditActiveAccount.Description = "creditActiveAccount"; + creditActiveAccount.FastAccess = "creditActiveAccount"; + creditActiveAccount.Name = "creditActiveAccount"; + + var creditActivePassiveAccount = new PacioliAccount(Guid.NewGuid()); + creditActivePassiveAccount.AccountType = PacioliAccountType.ActivePassive; + creditActivePassiveAccount.Code = "67890"; + creditActivePassiveAccount.Description = "creditActivePassiveAccount"; + creditActivePassiveAccount.FastAccess = "creditActivePassiveAccount"; + creditActivePassiveAccount.Name = "creditActivePassiveAccount"; + + var fintoolkindOwner = new TablePartBase.FinToolKind(Guid.NewGuid()) { Name = "fgjlhjfglkhjfg", FullName = "jfhjhgfkdhkgjhfkgjh" }; + var priceCalc1 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc1.OnlyCurrentType = true; + priceCalc1.Account = debitActiveAccount; + + var priceCalc2 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc2.OnlyCurrentType = true; + priceCalc2.Account = debitPassiveAccount; + + var priceCalc3 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc3.OnlyCurrentType = true; + priceCalc3.Account = debitActivePassiveAccount; + + var priceCalc4 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc4.OnlyCurrentType = true; + priceCalc4.Account = creditActiveAccount; + + var priceCalc5 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc5.OnlyCurrentType = true; + priceCalc5.Account = creditPassiveAccount; + + var priceCalc6 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc6.OnlyCurrentType = true; + priceCalc6.Account = creditActivePassiveAccount; + + var priceCalc7 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc7.OnlyCurrentType = false; + priceCalc7.Account = debitActiveAccount; + + var priceCalc8 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc8.OnlyCurrentType = false; + priceCalc8.Account = debitPassiveAccount; + + var priceCalc9 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc9.OnlyCurrentType = false; + priceCalc9.Account = debitActivePassiveAccount; + + var priceCalc10 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc10.OnlyCurrentType = false; + priceCalc10.Account = creditActiveAccount; + + var priceCalc11 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc11.OnlyCurrentType = false; + priceCalc11.Account = creditPassiveAccount; + + var priceCalc12 = new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), fintoolkindOwner); + priceCalc12.OnlyCurrentType = false; + priceCalc12.Account = creditActivePassiveAccount; + + var posting1 = new PacioliPosting(Guid.NewGuid()); + posting1.Sum = new decimal(11); + posting1.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfgkjhdfj", FullName = "dhsfhkjh khgkjdfhgkj", Identifier = "uyiyriet"}; + posting1.CreationDate = DateTime.Now; + posting1.CreditAccount = creditPassiveAccount; + posting1.DebitAccount = debitPassiveAccount; + posting1.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "aaaa", Name = "aaaa"}; + posting1.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "bbbb", Name = "bbbb"}; + posting1.Operation = new TechOperation(Guid.NewGuid()); + + var posting2 = new PacioliPosting(Guid.NewGuid()); + posting2.Sum = new decimal(12); + posting2.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfg", FullName = "dhsfhkjh khgkj", Identifier = "udfjgkjhfdk"}; + posting2.CreationDate = DateTime.Now; + posting2.CreditAccount = creditPassiveAccount; + posting2.DebitAccount = debitActiveAccount; + posting2.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "cccc", Name = "cccc"}; + posting2.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "dddd", Name = "dddd"}; + posting2.Operation = new TechOperation(Guid.NewGuid()); + + var posting3 = new PacioliPosting(Guid.NewGuid()); + posting3.Sum = new decimal(13); + posting3.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "dfhgkjhdfj", FullName = "dhsfhkjh", Identifier = "utrtoiore"}; + posting3.CreationDate = DateTime.Now; + posting3.CreditAccount = creditPassiveAccount; + posting3.DebitAccount = debitActivePassiveAccount; + posting3.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "eeee", Name = "eeee"}; + posting3.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "ffff", Name = "ffff"}; + posting3.Operation = new TechOperation(Guid.NewGuid()); + + var posting4 = new PacioliPosting(Guid.NewGuid()); + posting4.Sum = new decimal(14); + posting4.BalanceHolder = new RealPortfolio(Guid.NewGuid()) { Name = "kjhdfgkjhdfj", FullName = "kjh khgkjdfhgkj", Identifier = "dfkgkfdj" }; + posting4.CreationDate = DateTime.Now; + posting4.CreditAccount = creditActiveAccount; + posting4.DebitAccount = debitPassiveAccount; + posting4.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "gggg", Name = "gggg"}; + posting4.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "hhh", Name = "hhh"}; + posting4.Operation = new TechOperation(Guid.NewGuid()); + + var posting5 = new PacioliPosting(Guid.NewGuid()); + posting5.Sum = new decimal(-15); + posting5.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "reotoihre", FullName = "fghdg hdufgihiu", Identifier = "ghdfgjhf"}; + posting5.CreationDate = DateTime.Now; + posting5.CreditAccount = creditActiveAccount; + posting5.DebitAccount = debitActiveAccount; + posting5.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "iii", Name = "iiii"}; + posting5.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "jjj", Name = "jjj"}; + posting5.Operation = new TechOperation(Guid.NewGuid()); + + var posting6 = new PacioliPosting(Guid.NewGuid()); + posting6.Sum = new decimal(-14); + posting6.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "hfgdhdfhjghhkj", FullName = "kjh jdfhghjdgh", Identifier = "jdhfkgjhfkjgh"}; + posting6.CreationDate = DateTime.Now; + posting6.CreditAccount = creditActiveAccount; + posting6.DebitAccount = debitActivePassiveAccount; + posting6.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "kkkk", Name = "kkkk"}; + posting6.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "llll", Name = "llll"}; + posting6.Operation = new TechOperation(Guid.NewGuid()); + + var posting7 = new PacioliPosting(Guid.NewGuid()); + posting7.Sum = new decimal(-13); + posting7.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "hjdjhfghjdfhg", FullName = "dfgjdfhkgkj khgkjdfhgkj", Identifier = "dfbghkjdfhgkj"}; + posting7.CreationDate = DateTime.Now; + posting7.CreditAccount = creditActivePassiveAccount; + posting7.DebitAccount = debitPassiveAccount; + posting7.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "mmmm", Name = "mmm"}; + posting7.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "nnn", Name = "nnn"}; + posting7.Operation = new TechOperation(Guid.NewGuid()); + + var posting8 = new PacioliPosting(Guid.NewGuid()); + posting8.Sum = new decimal(130); + posting8.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "yrietyiury", FullName = "dhkgkj khgkjdfhgkj", Identifier = "dfbghj"}; + posting8.CreationDate = DateTime.Now; + posting8.CreditAccount = creditActivePassiveAccount; + posting8.DebitAccount = debitActiveAccount; + posting8.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "oooo", Name = "ooo"}; + posting8.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "ppp", Name = "ppp"}; + posting8.Operation = new TechOperation(Guid.NewGuid()); + + var posting9 = new PacioliPosting(Guid.NewGuid()); + posting9.Sum = new decimal(-113); + posting9.BalanceHolder = new RealPortfolio(Guid.NewGuid()) {Name = "biibibibob", FullName = "nbknf riewuruiet", Identifier = "ncvbmnvbcm"}; + posting9.CreationDate = DateTime.Now; + posting9.CreditAccount = creditActivePassiveAccount; + posting9.DebitAccount = debitActivePassiveAccount; + posting9.FinDebit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "qqqq", Name = "qqq"}; + posting9.FinCredit = new OtherFinTools(Guid.NewGuid()) {Cur = currency, FinToolKind = fintoolkindOwner, DocumentIdentifier = "rrr", Name = "rrr"}; + posting9.Operation = new TechOperation(Guid.NewGuid()); + + transaction.Complete(); + } + } + + public void PopulateDataForTakeProvider() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var status = new Status(Guid.NewGuid()) { Name = "aa" }; + var currency = new Currency(Guid.NewGuid()) { Name = "aa", CurCode = "qwe", DigitCode = "123", EngName = "re" }; + session.SaveChanges(); + + var port = new RealPortfolio(Guid.NewGuid()) { Name = "ww", FullName = "ee", Identifier = "w" }; + var operation = new TechOperation(Guid.NewGuid()); + operation.Status = status; + session.SaveChanges(); + + var finToolKind = new TablePartBase.FinToolKind(Guid.NewGuid()) { Name = "aa", FullName = "qq" }; + var finTool1 = new OtherFinTools(Guid.NewGuid()) { Name = "aa", DocumentIdentifier = "wewe", Cur = currency, FinToolKind = finToolKind }; + var finTool2 = new OtherFinTools(Guid.NewGuid()) + { + Name = "aaw", + DocumentIdentifier = "wewee", + Cur = currency, + FinToolKind = finToolKind, + }; + session.SaveChanges(); + + var pp = new PacioliAccount(Guid.NewGuid()) { AccountType = PacioliAccountType.Active, Name = "aa", FastAccess = "w", Code = "x" }; + new PacioliPosting(Guid.NewGuid()) { + Name = "a", + Status = status, + DebitAccount = pp, + CreditAccount = pp, + CreditFinTool = finTool1, + DebitFinTool = finTool2, + Sum = 1, + Currency = currency, + BalanceHolder = port, + Operation = operation + }; + transaction.Complete(); + } + } + + public void EnsureRightDateIsInStorage(ProviderKind providerKind) + { + if (previousProviderKind.HasValue && previousProviderKind!=providerKind) { + RebuildDomain(); + previousProviderKind = providerKind; + } + switch (providerKind) { + case ProviderKind.IncludeProvider: { + PopulateDataForTakeProvider(); + return; + } + case ProviderKind.TakeProvider: { + PopulateDataForIncludeProvider(); + return; + } + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(CustomPosting).Assembly, typeof(CustomPosting).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } + + public enum ProviderKind + { + IncludeProvider, + TakeProvider + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0586_AnonymousTypeComparisonBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0586_AnonymousTypeComparisonBug.cs index cdf0731f7a..7783e28a32 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0586_AnonymousTypeComparisonBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0586_AnonymousTypeComparisonBug.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.05.28 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0586_AnonymousTypeComparisonBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0586_AnonymousTypeComparisonBugModel -{ - public abstract class EntityBase : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - protected EntityBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class TpPriceCalc : EntityBase - { - [Field] - public bool Check { get; set; } - - [Field] - public Account Account { get; set; } - - [Field] - public FinToolKind Owner { get; set; } - - public TpPriceCalc(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class FinToolKind : EntityBase - { - public FinToolKind(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class PacioliPosting : EntityBase - { - [Field] - public Account CreditAccount { get; set; } - - [Field] - public FinToolBase FinCredit { get; set; } - - public PacioliPosting(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class FinToolBase : EntityBase - { - [Field] - public FinToolKind FinToolKind { get; set; } - - public FinToolBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class Account : EntityBase - { - public Account(Guid id) - : base(id) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0586_AnonymousTypeComparisonBug : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var tableParts = from q in Query.All() - select new { - q.Account, - Check = !q.Check, - FinToolKind = q.Check - ? null - : q.Owner - }; - - var masterCredit = Query.All(); - - var join = from r in masterCredit.LeftJoin( - tableParts, - a => a.CreditAccount.Id, - a => a.Account.Id, - (a, pm) => new {pp = a, pm}) - let q = r.pp - select new { - Id = q.Id, - MasterFinToolKind = r.pm==null - ? (FinToolKind) null - : (!r.pm.Check ? r.pm.FinToolKind : q.FinCredit.FinToolKind) - }; - - var result = join.ToArray(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(EntityBase).Assembly, typeof(EntityBase).Namespace); - return configuration; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.05.28 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0586_AnonymousTypeComparisonBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0586_AnonymousTypeComparisonBugModel +{ + public abstract class EntityBase : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + protected EntityBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class TpPriceCalc : EntityBase + { + [Field] + public bool Check { get; set; } + + [Field] + public Account Account { get; set; } + + [Field] + public FinToolKind Owner { get; set; } + + public TpPriceCalc(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class FinToolKind : EntityBase + { + public FinToolKind(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class PacioliPosting : EntityBase + { + [Field] + public Account CreditAccount { get; set; } + + [Field] + public FinToolBase FinCredit { get; set; } + + public PacioliPosting(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class FinToolBase : EntityBase + { + [Field] + public FinToolKind FinToolKind { get; set; } + + public FinToolBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class Account : EntityBase + { + public Account(Guid id) + : base(id) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0586_AnonymousTypeComparisonBug : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var tableParts = from q in Query.All() + select new { + q.Account, + Check = !q.Check, + FinToolKind = q.Check + ? null + : q.Owner + }; + + var masterCredit = Query.All(); + + var join = from r in masterCredit.LeftJoin( + tableParts, + a => a.CreditAccount.Id, + a => a.Account.Id, + (a, pm) => new {pp = a, pm}) + let q = r.pp + select new { + Id = q.Id, + MasterFinToolKind = r.pm==null + ? (FinToolKind) null + : (!r.pm.Check ? r.pm.FinToolKind : q.FinCredit.FinToolKind) + }; + + var result = join.ToArray(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(EntityBase).Assembly, typeof(EntityBase).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0587_KeyComparisonBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0587_KeyComparisonBug.cs index cd03bd743a..3a32251283 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0587_KeyComparisonBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0587_KeyComparisonBug.cs @@ -1,147 +1,147 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.06.29 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Issues.IssueJira0587_KeyComparisonBugModel; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0587_KeyComparisonBugModel -{ - public interface IPerson : IEntity - { - [Field] - string FirstName { get; set; } - - [Field] - string LastName { get; set; } - } - - [HierarchyRoot] - public class Person : Entity, IPerson - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - public Person(Session session, string firstName, string lastName) - : base(session) - { - FirstName = firstName; - LastName = lastName; - } - } - - [HierarchyRoot] - public class PassportOffice : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Title { get; set; } - - public PassportOffice(Session session, string titile) - : base(session) - { - Title = titile; - } - } - - [HierarchyRoot] - public class Passport: Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public IPerson Person { get; set; } - - public Passport(Session session, IPerson person) - : base(session) - { - Person = person; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0587_KeyComparisonBug: AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var person = session.Query.All().First(el => el.Id==1); - Assert.That(typeof (IPerson).IsAssignableFrom(person.Key.TypeReference.Type.UnderlyingType), Is.True); - var passportOffice = session.Query.All().First(el => el.Id==1); - - var passport = new Passport(session, person); - var referencedPerson = passport.Person; - Assert.That(referencedPerson, Is.Not.Null); - Assert.That(referencedPerson.GetType(), Is.EqualTo(typeof (Person))); - } - } - - protected override void PopulateData() - { - Catalog catalog; - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var connection = ((SqlSessionHandler) session.Handler).Connection; - var extractionResult = Domain.Handlers.StorageDriver.Extract(connection, new[] { new SqlExtractionTask(connection.UnderlyingConnection.Database) }); - catalog = extractionResult.Catalogs[0]; - transaction.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var connection = ((SqlSessionHandler) session.Handler).Connection; - var queryBuilder = session.Services.Get(); - var type = Domain.Model.Types[typeof (PassportOffice)]; - var insert1 = SqlDml.Insert(SqlDml.TableRef(catalog.DefaultSchema.Tables[type.MappingName])); - insert1.Values.Add(insert1.Into.Columns[type.Fields["Id"].MappingName], 1); - insert1.Values.Add(insert1.Into.Columns[type.Fields["Title"].MappingName], "Department #1"); - var compiledQuery = queryBuilder.CompileQuery(insert1); - using (var command = connection.CreateCommand(insert1)) { - command.ExecuteNonQuery(); - } - - type = Domain.Model.Types[typeof (Person)]; - var insert2 = SqlDml.Insert(SqlDml.TableRef(catalog.DefaultSchema.Tables[type.MappingName])); - insert2.Values.Add(insert2.Into.Columns[type.Fields["Id"].MappingName], 1); - insert2.Values.Add(insert2.Into.Columns[type.Fields["FirstName"].MappingName], "John"); - insert2.Values.Add(insert2.Into.Columns[type.Fields["LastName"].MappingName], "Smith"); - using (var command = connection.CreateCommand(insert2)) { - command.ExecuteNonQuery(); - } - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (IPerson).Assembly, typeof (IPerson).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.06.29 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Issues.IssueJira0587_KeyComparisonBugModel; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0587_KeyComparisonBugModel +{ + public interface IPerson : IEntity + { + [Field] + string FirstName { get; set; } + + [Field] + string LastName { get; set; } + } + + [HierarchyRoot] + public class Person : Entity, IPerson + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + public Person(Session session, string firstName, string lastName) + : base(session) + { + FirstName = firstName; + LastName = lastName; + } + } + + [HierarchyRoot] + public class PassportOffice : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Title { get; set; } + + public PassportOffice(Session session, string titile) + : base(session) + { + Title = titile; + } + } + + [HierarchyRoot] + public class Passport: Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public IPerson Person { get; set; } + + public Passport(Session session, IPerson person) + : base(session) + { + Person = person; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0587_KeyComparisonBug: AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var person = session.Query.All().First(el => el.Id==1); + Assert.That(typeof (IPerson).IsAssignableFrom(person.Key.TypeReference.Type.UnderlyingType), Is.True); + var passportOffice = session.Query.All().First(el => el.Id==1); + + var passport = new Passport(session, person); + var referencedPerson = passport.Person; + Assert.That(referencedPerson, Is.Not.Null); + Assert.That(referencedPerson.GetType(), Is.EqualTo(typeof (Person))); + } + } + + protected override void PopulateData() + { + Catalog catalog; + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + var extractionResult = Domain.Handlers.StorageDriver.Extract(connection, new[] { new SqlExtractionTask(connection.UnderlyingConnection.Database) }); + catalog = extractionResult.Catalogs[0]; + transaction.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + var queryBuilder = session.Services.Get(); + var type = Domain.Model.Types[typeof (PassportOffice)]; + var insert1 = SqlDml.Insert(SqlDml.TableRef(catalog.DefaultSchema.Tables[type.MappingName])); + insert1.Values.Add(insert1.Into.Columns[type.Fields["Id"].MappingName], 1); + insert1.Values.Add(insert1.Into.Columns[type.Fields["Title"].MappingName], "Department #1"); + var compiledQuery = queryBuilder.CompileQuery(insert1); + using (var command = connection.CreateCommand(insert1)) { + command.ExecuteNonQuery(); + } + + type = Domain.Model.Types[typeof (Person)]; + var insert2 = SqlDml.Insert(SqlDml.TableRef(catalog.DefaultSchema.Tables[type.MappingName])); + insert2.Values.Add(insert2.Into.Columns[type.Fields["Id"].MappingName], 1); + insert2.Values.Add(insert2.Into.Columns[type.Fields["FirstName"].MappingName], "John"); + insert2.Values.Add(insert2.Into.Columns[type.Fields["LastName"].MappingName], "Smith"); + using (var command = connection.CreateCommand(insert2)) { + command.ExecuteNonQuery(); + } + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (IPerson).Assembly, typeof (IPerson).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0593_AggregateForSingleColumnTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0593_AggregateForSingleColumnTest.cs index 610e2a6ad5..6bcae90608 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0593_AggregateForSingleColumnTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0593_AggregateForSingleColumnTest.cs @@ -1,727 +1,727 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.09.02 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0593_AggregateForSingleColumnModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0593_AggregateForSingleColumnModel - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public sbyte SByteField { get; set; } - - [Field] - public sbyte? NullableSByteField { get; set; } - - [Field] - public byte ByteField { get; set; } - - [Field] - public byte? NullableByteField { get; set; } - - [Field] - public short ShortField { get; set; } - - [Field] - public short? NullableShortField { get; set; } - - [Field] - public ushort UShortField { get; set; } - - [Field] - public ushort? NullableUShortField { get; set; } - - [Field] - public int IntField { get; set; } - - [Field] - public int? NullableIntField { get; set; } - - [Field] - public uint UIntField { get; set; } - - [Field] - public uint? NullableUIntField { get; set; } - - [Field] - public long LongField { get; set; } - - [Field] - public long? NullableLongField { get; set; } - - [Field] - public ulong ULongField { get; set; } - - [Field] - public ulong? NullableULongField { get; set; } - - [Field] - public float FloatField { get; set; } - - [Field] - public float? NullableFloatField { get; set; } - - [Field] - public double DoubleField { get; set; } - - [Field] - public double? NullableDoubleField { get; set; } - - [Field] - public decimal DecimalField { get; set; } - - [Field] - public decimal? NullableDecimalField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field] - public TimeSpan? NullableTimeSpanField { get; set; } - - [Field] - public DateTime DateTimeField { get; set; } - - [Field] - public DateTime? NullableDateTimeField { get; set; } - - [Field] - public string StringField { get; set; } - - [Field] - public Guid GuidField { get; set; } - - [Field] - public Guid? NullableGuidField { get; set; } - } - } - - public class IssueJira0593_AggregateForSingleColumnTest : AutoBuildTest - { - private const int EntityCount = 20; - private const string FilterCondition = "3"; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (TestEntity)); - return config; - } - - protected override void PopulateData() - { - var now = DateTime.Now.Date; - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - for (var i = 0; i < EntityCount; ++i) { - var entity = new TestEntity { - Name = "Entity" + i, - SByteField = -1, - ByteField = 1, - ShortField = -2, - UShortField = 2, - IntField = -3, - UIntField = 3, - LongField = -4, - ULongField = 4, - FloatField = -5.55f, - DoubleField = 6.66d, - DecimalField = -7.77m, - TimeSpanField = TimeSpan.FromMinutes(i), - DateTimeField = now.AddDays(i), - GuidField = Guid.NewGuid(), - StringField = "StringField" + i, - }; - - if (i % 2==0) { - entity.NullableSByteField = entity.SByteField; - entity.NullableByteField = entity.ByteField; - entity.NullableShortField = entity.ShortField; - entity.NullableUShortField = entity.UShortField; - entity.NullableIntField = entity.IntField; - entity.NullableUIntField = entity.UIntField; - entity.NullableLongField = entity.LongField; - entity.NullableULongField = entity.ULongField; - entity.NullableFloatField = entity.FloatField; - entity.NullableDoubleField = entity.DoubleField; - entity.NullableDecimalField = entity.DecimalField; - entity.NullableTimeSpanField = entity.TimeSpanField; - entity.NullableDateTimeField = entity.DateTimeField; - entity.NullableGuidField = entity.GuidField; - } - } - - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var localSum = Query.All().Select(c => c.DecimalField).ToArray().Sum(); - Assert.AreEqual(Query.All().Sum(c => c.DecimalField), localSum); - Assert.AreEqual(Query.All().Select(c => c.DecimalField).Sum(c => c), localSum); - Assert.AreEqual(Query.All().Select(c => c.DecimalField).Sum(), localSum); - - var query = Query.All().Select(c => c.Name.Contains("3") ? c.DecimalField : -c.DecimalField); - localSum = query.ToArray().Sum(); - Assert.AreEqual(query.Sum(c => c), localSum); - Assert.AreEqual(query.Sum(), localSum); - - var nullableQuery = Query.All().Select(c => c.Name.Contains("3") ? c.NullableDecimalField : -c.NullableDecimalField); - var nullableLocalSum = nullableQuery.ToArray().Sum(); - Assert.AreEqual(nullableQuery.Sum(c => c), nullableLocalSum); - Assert.AreEqual(nullableQuery.Sum(), nullableLocalSum); - } - } - - [Test] - public void DifferentColumnsTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains("3") ? c.IntField : -c.ShortField); - var localSum = query.ToArray().Sum(); - Assert.AreEqual(query.Sum(c => c), localSum); - Assert.AreEqual(query.Sum(), localSum); - - var nullableQuery = Query.All().Select(c => c.Name.Contains("3") ? c.DecimalField : -c.NullableDecimalField); - var nullableLocalSum = nullableQuery.ToArray().Sum(); - Assert.AreEqual(nullableQuery.Sum(c => c), nullableLocalSum); - Assert.AreEqual(nullableQuery.Sum(), nullableLocalSum); - } - } - - #region Primitive numeric type tests (nonnullable and nullable) - - [Test] - public void SByteTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.SByteField : -c.SByteField); - CheckQueryable(query); - } - } - - [Test] - public void NullableSByteTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableSByteField : -c.NullableSByteField); - CheckQueryable(query); - } - } - - [Test] - public void ByteTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.ByteField : -c.ByteField); - CheckQueryable(query); - } - } - - [Test] - public void NullableByteTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableByteField : -c.NullableByteField); - CheckQueryable(query); - } - } - - [Test] - public void ShortTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.ShortField : -c.ShortField); - CheckQueryable(query); - } - } - - [Test] - public void NullableShortTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableShortField : -c.NullableShortField); - CheckQueryable(query); - } - } - - [Test] - public void UShortTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.UShortField : -c.UShortField); - CheckQueryable(query); - } - } - - [Test] - public void NullableUShortTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableUShortField : -c.NullableUShortField); - CheckQueryable(query); - } - } - - [Test] - public void IntTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.IntField : -c.IntField); - CheckQueryable(query); - } - } - - [Test] - public void NullableIntTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableIntField : -c.NullableIntField); - CheckQueryable(query); - } - } - - [Test] - public void UIntTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.UIntField : -c.UIntField); - CheckQueryable(query); - } - } - - [Test] - public void NullableUIntTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableUIntField : -c.NullableUIntField); - CheckQueryable(query); - } - } - - [Test] - public void LongTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.LongField : -c.LongField); - CheckQueryable(query); - } - } - - [Test] - public void NullableLongTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableLongField : -c.NullableLongField); - CheckQueryable(query); - } - } - - [Test] - public void ULongTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? -(long) c.ULongField : (long) c.ULongField); - CheckQueryable(query); - } - } - - [Test] - public void NullableULongTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? -(long?) c.NullableULongField : (long?) c.NullableULongField); - CheckQueryable(query); - } - } - - [Test] - public void FloatTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.FloatField : -c.FloatField); - CheckQueryable(query); - } - } - - [Test] - public void NullableFloatTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableFloatField : -c.NullableFloatField); - CheckQueryable(query); - } - } - - [Test] - public void DoubleTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DoubleField : -c.DoubleField); - CheckQueryable(query); - } - } - - [Test] - public void NullableDoubleTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDoubleField : -c.NullableDoubleField); - CheckQueryable(query); - } - } - - [Test] - public void DecimalTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DecimalField : -c.DecimalField); - CheckQueryable(query); - } - } - - [Test] - public void NullableDecimalTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDecimalField : -c.NullableDecimalField); - CheckQueryable(query); - } - } - - #endregion - - #region Nonnumeric type test (nonnulable and nullable) - - [Test] - public void TimeSpanTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.TimeSpanField : -c.TimeSpanField); - CheckQueryable(query); - } - } - - [Test] - public void NullableTimeSpanTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableTimeSpanField : -c.NullableTimeSpanField); - CheckQueryable(query); - } - } - - [Test] - public void DateTimeTest() - { - var now = DateTime.Now; - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DateTimeField : now); - CheckQueryable(query); - } - } - - [Test] - public void NullableDateTimeTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDateTimeField : null); - CheckQueryable(query); - } - } - - [Test] - public void GuidTest() - { - var newGuid = Guid.NewGuid(); - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.GuidField : newGuid); - CheckQueryable(query); - } - } - - [Test] - public void NullableGuidTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableGuidField : null); - CheckQueryable(query); - } - } - - [Test] - public void StringTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.StringField : c.Name); - CheckQueryable(query); - } - } - - #endregion - - #region CheckQueryable methods - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); - Assert.AreEqual(localArray.Sum(), query.Sum()); - Assert.AreEqual(localArray.Average(), query.Average(c => c)); - Assert.AreEqual(localArray.Average(), query.Average()); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min(c => c))); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min())); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max(c => c))); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max())); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min(c => c))); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min())); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max(c => c))); - Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max())); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - private static void CheckQueryable(IQueryable query) - { - var localArray = query.ToArray(); - Assert.AreEqual(localArray.Min(), query.Min(c => c)); - Assert.AreEqual(localArray.Min(), query.Min()); - Assert.AreEqual(localArray.Max(), query.Max(c => c)); - Assert.AreEqual(localArray.Max(), query.Max()); - Assert.AreEqual(localArray.Count(), query.Count()); - } - - #endregion - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.09.02 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0593_AggregateForSingleColumnModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0593_AggregateForSingleColumnModel + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public sbyte SByteField { get; set; } + + [Field] + public sbyte? NullableSByteField { get; set; } + + [Field] + public byte ByteField { get; set; } + + [Field] + public byte? NullableByteField { get; set; } + + [Field] + public short ShortField { get; set; } + + [Field] + public short? NullableShortField { get; set; } + + [Field] + public ushort UShortField { get; set; } + + [Field] + public ushort? NullableUShortField { get; set; } + + [Field] + public int IntField { get; set; } + + [Field] + public int? NullableIntField { get; set; } + + [Field] + public uint UIntField { get; set; } + + [Field] + public uint? NullableUIntField { get; set; } + + [Field] + public long LongField { get; set; } + + [Field] + public long? NullableLongField { get; set; } + + [Field] + public ulong ULongField { get; set; } + + [Field] + public ulong? NullableULongField { get; set; } + + [Field] + public float FloatField { get; set; } + + [Field] + public float? NullableFloatField { get; set; } + + [Field] + public double DoubleField { get; set; } + + [Field] + public double? NullableDoubleField { get; set; } + + [Field] + public decimal DecimalField { get; set; } + + [Field] + public decimal? NullableDecimalField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field] + public TimeSpan? NullableTimeSpanField { get; set; } + + [Field] + public DateTime DateTimeField { get; set; } + + [Field] + public DateTime? NullableDateTimeField { get; set; } + + [Field] + public string StringField { get; set; } + + [Field] + public Guid GuidField { get; set; } + + [Field] + public Guid? NullableGuidField { get; set; } + } + } + + public class IssueJira0593_AggregateForSingleColumnTest : AutoBuildTest + { + private const int EntityCount = 20; + private const string FilterCondition = "3"; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (TestEntity)); + return config; + } + + protected override void PopulateData() + { + var now = DateTime.Now.Date; + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + for (var i = 0; i < EntityCount; ++i) { + var entity = new TestEntity { + Name = "Entity" + i, + SByteField = -1, + ByteField = 1, + ShortField = -2, + UShortField = 2, + IntField = -3, + UIntField = 3, + LongField = -4, + ULongField = 4, + FloatField = -5.55f, + DoubleField = 6.66d, + DecimalField = -7.77m, + TimeSpanField = TimeSpan.FromMinutes(i), + DateTimeField = now.AddDays(i), + GuidField = Guid.NewGuid(), + StringField = "StringField" + i, + }; + + if (i % 2==0) { + entity.NullableSByteField = entity.SByteField; + entity.NullableByteField = entity.ByteField; + entity.NullableShortField = entity.ShortField; + entity.NullableUShortField = entity.UShortField; + entity.NullableIntField = entity.IntField; + entity.NullableUIntField = entity.UIntField; + entity.NullableLongField = entity.LongField; + entity.NullableULongField = entity.ULongField; + entity.NullableFloatField = entity.FloatField; + entity.NullableDoubleField = entity.DoubleField; + entity.NullableDecimalField = entity.DecimalField; + entity.NullableTimeSpanField = entity.TimeSpanField; + entity.NullableDateTimeField = entity.DateTimeField; + entity.NullableGuidField = entity.GuidField; + } + } + + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var localSum = Query.All().Select(c => c.DecimalField).ToArray().Sum(); + Assert.AreEqual(Query.All().Sum(c => c.DecimalField), localSum); + Assert.AreEqual(Query.All().Select(c => c.DecimalField).Sum(c => c), localSum); + Assert.AreEqual(Query.All().Select(c => c.DecimalField).Sum(), localSum); + + var query = Query.All().Select(c => c.Name.Contains("3") ? c.DecimalField : -c.DecimalField); + localSum = query.ToArray().Sum(); + Assert.AreEqual(query.Sum(c => c), localSum); + Assert.AreEqual(query.Sum(), localSum); + + var nullableQuery = Query.All().Select(c => c.Name.Contains("3") ? c.NullableDecimalField : -c.NullableDecimalField); + var nullableLocalSum = nullableQuery.ToArray().Sum(); + Assert.AreEqual(nullableQuery.Sum(c => c), nullableLocalSum); + Assert.AreEqual(nullableQuery.Sum(), nullableLocalSum); + } + } + + [Test] + public void DifferentColumnsTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains("3") ? c.IntField : -c.ShortField); + var localSum = query.ToArray().Sum(); + Assert.AreEqual(query.Sum(c => c), localSum); + Assert.AreEqual(query.Sum(), localSum); + + var nullableQuery = Query.All().Select(c => c.Name.Contains("3") ? c.DecimalField : -c.NullableDecimalField); + var nullableLocalSum = nullableQuery.ToArray().Sum(); + Assert.AreEqual(nullableQuery.Sum(c => c), nullableLocalSum); + Assert.AreEqual(nullableQuery.Sum(), nullableLocalSum); + } + } + + #region Primitive numeric type tests (nonnullable and nullable) + + [Test] + public void SByteTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.SByteField : -c.SByteField); + CheckQueryable(query); + } + } + + [Test] + public void NullableSByteTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableSByteField : -c.NullableSByteField); + CheckQueryable(query); + } + } + + [Test] + public void ByteTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.ByteField : -c.ByteField); + CheckQueryable(query); + } + } + + [Test] + public void NullableByteTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableByteField : -c.NullableByteField); + CheckQueryable(query); + } + } + + [Test] + public void ShortTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.ShortField : -c.ShortField); + CheckQueryable(query); + } + } + + [Test] + public void NullableShortTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableShortField : -c.NullableShortField); + CheckQueryable(query); + } + } + + [Test] + public void UShortTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.UShortField : -c.UShortField); + CheckQueryable(query); + } + } + + [Test] + public void NullableUShortTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableUShortField : -c.NullableUShortField); + CheckQueryable(query); + } + } + + [Test] + public void IntTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.IntField : -c.IntField); + CheckQueryable(query); + } + } + + [Test] + public void NullableIntTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableIntField : -c.NullableIntField); + CheckQueryable(query); + } + } + + [Test] + public void UIntTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.UIntField : -c.UIntField); + CheckQueryable(query); + } + } + + [Test] + public void NullableUIntTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableUIntField : -c.NullableUIntField); + CheckQueryable(query); + } + } + + [Test] + public void LongTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.LongField : -c.LongField); + CheckQueryable(query); + } + } + + [Test] + public void NullableLongTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableLongField : -c.NullableLongField); + CheckQueryable(query); + } + } + + [Test] + public void ULongTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? -(long) c.ULongField : (long) c.ULongField); + CheckQueryable(query); + } + } + + [Test] + public void NullableULongTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? -(long?) c.NullableULongField : (long?) c.NullableULongField); + CheckQueryable(query); + } + } + + [Test] + public void FloatTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.FloatField : -c.FloatField); + CheckQueryable(query); + } + } + + [Test] + public void NullableFloatTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableFloatField : -c.NullableFloatField); + CheckQueryable(query); + } + } + + [Test] + public void DoubleTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DoubleField : -c.DoubleField); + CheckQueryable(query); + } + } + + [Test] + public void NullableDoubleTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDoubleField : -c.NullableDoubleField); + CheckQueryable(query); + } + } + + [Test] + public void DecimalTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DecimalField : -c.DecimalField); + CheckQueryable(query); + } + } + + [Test] + public void NullableDecimalTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDecimalField : -c.NullableDecimalField); + CheckQueryable(query); + } + } + + #endregion + + #region Nonnumeric type test (nonnulable and nullable) + + [Test] + public void TimeSpanTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.TimeSpanField : -c.TimeSpanField); + CheckQueryable(query); + } + } + + [Test] + public void NullableTimeSpanTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableTimeSpanField : -c.NullableTimeSpanField); + CheckQueryable(query); + } + } + + [Test] + public void DateTimeTest() + { + var now = DateTime.Now; + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.DateTimeField : now); + CheckQueryable(query); + } + } + + [Test] + public void NullableDateTimeTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableDateTimeField : null); + CheckQueryable(query); + } + } + + [Test] + public void GuidTest() + { + var newGuid = Guid.NewGuid(); + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.GuidField : newGuid); + CheckQueryable(query); + } + } + + [Test] + public void NullableGuidTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.NullableGuidField : null); + CheckQueryable(query); + } + } + + [Test] + public void StringTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var query = Query.All().Select(c => c.Name.Contains(FilterCondition) ? c.StringField : c.Name); + CheckQueryable(query); + } + } + + #endregion + + #region CheckQueryable methods + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Sum(), query.Sum(c => c)); + Assert.AreEqual(localArray.Sum(), query.Sum()); + Assert.AreEqual(localArray.Average(), query.Average(c => c)); + Assert.AreEqual(localArray.Average(), query.Average()); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min(c => c))); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min())); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max(c => c))); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max())); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min(c => c))); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Min())); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max(c => c))); + Assert.Throws(typeof (QueryTranslationException), () => Assert.AreEqual(localArray.Min(), query.Max())); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + private static void CheckQueryable(IQueryable query) + { + var localArray = query.ToArray(); + Assert.AreEqual(localArray.Min(), query.Min(c => c)); + Assert.AreEqual(localArray.Min(), query.Min()); + Assert.AreEqual(localArray.Max(), query.Max(c => c)); + Assert.AreEqual(localArray.Max(), query.Max()); + Assert.AreEqual(localArray.Count(), query.Count()); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0604_SetOperationsWithDuplicateFieldsUsageFail.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0604_SetOperationsWithDuplicateFieldsUsageFail.cs index b8a6f43aa8..e2f5142e97 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0604_SetOperationsWithDuplicateFieldsUsageFail.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0604_SetOperationsWithDuplicateFieldsUsageFail.cs @@ -1,128 +1,128 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.09.14 - -using System; -using System.Globalization; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira604_SetOperationsWithDuplicateFieldsUsageFailsModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira604_SetOperationsWithDuplicateFieldsUsageFailsModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public String SomeText { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira604_SetOperationsWithDuplicateFieldsUsageFails : AutoBuildTest - { - [Test] - public void UnionTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query1 = session.Query.All().Where(el=>el.Id > 1000).Select(el => new{el.Id, Text = el.SomeText, TextDublicate = el.SomeText}); - var query2 = session.Query.All().Where(el=>el.Id < 1000).Select(el => new{el.Id, Text = el.SomeText, TextDublicate = el.SomeText}); - Assert.DoesNotThrow(()=>query1.Union(query2).Run()); - - var query = query1.Union(query2).ToArray(); - Assert.That(query.Length, Is.EqualTo(1999)); - foreach (var entity in query) { - Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); - Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); - Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); - } - } - } - - [Test] - public void ConcatTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query1 = session.Query.All().Where(el => el.Id > 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - var query2 = session.Query.All().Where(el => el.Id < 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - Assert.DoesNotThrow(() => query1.Concat(query2).Run()); - - var query = query1.Concat(query2).ToArray(); - Assert.That(query.Length, Is.EqualTo(1999)); - foreach (var entity in query) { - Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); - Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); - Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); - } - } - } - - [Test] - public void IntersectTest() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query1 = session.Query.All().Where(el => el.Id <= 200).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - var query2 = session.Query.All().Where(el => el.Id >= 100).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - Assert.DoesNotThrow(() => query1.Intersect(query2).Run()); - - var query = query1.Intersect(query2).ToArray(); - Assert.That(query.Length, Is.EqualTo(101)); - foreach (var entity in query) { - Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); - Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); - Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); - } - } - } - - [Test] - public void ExceptTest() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query1 = session.Query.All().Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - var query2 = session.Query.All().Where(el => el.Id < 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); - Assert.DoesNotThrow(() => query1.Except(query2).Run()); - - var query = query1.Except(query2).ToArray(); - Assert.That(query.Length, Is.EqualTo(1001)); - foreach (var entity in query) { - Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); - Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); - Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); - } - } - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < 2000; i++) - new TestEntity(){SomeText = i.ToString(CultureInfo.InvariantCulture)}; - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (TestEntity)); - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.09.14 + +using System; +using System.Globalization; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira604_SetOperationsWithDuplicateFieldsUsageFailsModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira604_SetOperationsWithDuplicateFieldsUsageFailsModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public String SomeText { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira604_SetOperationsWithDuplicateFieldsUsageFails : AutoBuildTest + { + [Test] + public void UnionTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query1 = session.Query.All().Where(el=>el.Id > 1000).Select(el => new{el.Id, Text = el.SomeText, TextDublicate = el.SomeText}); + var query2 = session.Query.All().Where(el=>el.Id < 1000).Select(el => new{el.Id, Text = el.SomeText, TextDublicate = el.SomeText}); + Assert.DoesNotThrow(()=>query1.Union(query2).Run()); + + var query = query1.Union(query2).ToArray(); + Assert.That(query.Length, Is.EqualTo(1999)); + foreach (var entity in query) { + Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); + Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); + Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); + } + } + } + + [Test] + public void ConcatTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query1 = session.Query.All().Where(el => el.Id > 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + var query2 = session.Query.All().Where(el => el.Id < 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + Assert.DoesNotThrow(() => query1.Concat(query2).Run()); + + var query = query1.Concat(query2).ToArray(); + Assert.That(query.Length, Is.EqualTo(1999)); + foreach (var entity in query) { + Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); + Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); + Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); + } + } + } + + [Test] + public void IntersectTest() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query1 = session.Query.All().Where(el => el.Id <= 200).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + var query2 = session.Query.All().Where(el => el.Id >= 100).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + Assert.DoesNotThrow(() => query1.Intersect(query2).Run()); + + var query = query1.Intersect(query2).ToArray(); + Assert.That(query.Length, Is.EqualTo(101)); + foreach (var entity in query) { + Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); + Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); + Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); + } + } + } + + [Test] + public void ExceptTest() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query1 = session.Query.All().Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + var query2 = session.Query.All().Where(el => el.Id < 1000).Select(el => new { el.Id, Text = el.SomeText, TextDublicate = el.SomeText }); + Assert.DoesNotThrow(() => query1.Except(query2).Run()); + + var query = query1.Except(query2).ToArray(); + Assert.That(query.Length, Is.EqualTo(1001)); + foreach (var entity in query) { + Assert.That(string.IsNullOrEmpty(entity.Text), Is.False); + Assert.That(string.IsNullOrEmpty(entity.TextDublicate), Is.False); + Assert.That(entity.Text, Is.EqualTo(entity.TextDublicate)); + } + } + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < 2000; i++) + new TestEntity(){SomeText = i.ToString(CultureInfo.InvariantCulture)}; + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (TestEntity)); + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0607_ColumnUselessRecreationsTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0607_ColumnUselessRecreationsTest.cs index 921141603d..adf32fed02 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0607_ColumnUselessRecreationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0607_ColumnUselessRecreationsTest.cs @@ -1,911 +1,911 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Modelling.Actions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade; -using Xtensive.Orm.Upgrade.Model; -using model = Xtensive.Orm.Tests.Issues.IssueJira0607_ColumnUselessRecreationsTestModel; - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0607_ColumnUselessRecreationsTest - { - [Test] - public void MainTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var initialConfig = DomainConfigurationFactory.Create(); - initialConfig.Types.Register(typeof(model.MainTestModel.TestEntity)); - initialConfig.Types.Register(typeof(model.MainTestModel.TestEntity2)); - initialConfig.UpgradeMode = DomainUpgradeMode.Recreate; - using (var domain = Domain.Build(initialConfig)) { } - - // useful work - var configration = DomainConfigurationFactory.Create(); - configration.Types.Register(typeof(model.MainTestModel.TestEntity)); - configration.Types.Register(typeof(model.MainTestModel.TestEntity2)); - configration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - Exception exception = null; - int step = 0; - for (var i = 0; i < 30; i++, step++) { - try { - using (var domain = Domain.Build(configration)) { } - } - catch (Exception e) { - exception = e; - break; - } - } - Assert.That(exception, Is.Null); - Assert.That(step, Is.EqualTo(30)); - } - - [Test] - public void Test1() - { - Require.AnyFeatureSupported(ProviderFeatures.TransactionalDdl); - - using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof (model.V1.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new model.V1.Initial.TestEntity() { - Name = "Name", - ReferenceField = new model.V1.Initial.TestReferencedEntity(), - StateField = model.V1.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - - Assert.Throws( - () => { - Domain domain = null; - try { - domain = Domain.Build(BuildConfiguration(false, typeof (model.V1.Final.TestEntity))); - } - finally { - if (domain!=null) - domain.Dispose(); - } - }); - using (var domain = Domain.Build(BuildConfiguration(false, typeof(model.V1.Initial.TestEntity)))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var entities = session.Query.All().ToList(); - Assert.That(entities.Count, Is.EqualTo(10)); - } - } - - [Test] - public void Test2() - { - using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V2.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new model.V2.Initial.TestEntity() { - Name = "Name", - ReferenceField = new model.V2.Initial.TestReferencedEntity(), - StateField = model.V2.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - Assert.Throws(() => { - Domain domain=null; - try { - domain = Domain.Build(BuildConfiguration(false, typeof (model.V2.Final.TestEntity))); - } - finally { - if (domain!=null) - domain.Dispose(); - } - }); - - using (var initialDomain = Domain.Build(BuildConfiguration(false, typeof(model.V2.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - foreach (var entity in session.Query.All()) { - Assert.That(entity.Name, Is.EqualTo("Name")); - Assert.That(entity.ReferenceField, Is.Not.Null); - Assert.That(entity.StateField, Is.EqualTo(model.V2.Initial.State.Live)); - Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); - } - } - } - - [Test] - public void Test3() - { - using (var domain = Domain.Build(BuildConfiguration(true, typeof (model.V3.Initial.TestEntity)))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()){ - for (int i = 0; i < 10; i++) { - new model.V3.Initial.TestEntity { - Name = "Name", - ReferenceField = new model.V3.Initial.TestReferencedEntity(), - StateField = model.V3.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - - var exception = Assert.Throws( - () => Domain.Build(BuildConfiguration(false, typeof (model.V3.Final.TestEntity)))); - Assert.That(exception, Is.Not.Null); - Assert.That(exception.ComparisonResult.HasUnsafeActions, Is.True); - Assert.That(exception.ComparisonResult.UnsafeActions.Count, Is.EqualTo(4)); - foreach (var unsafeAction in exception.ComparisonResult.UnsafeActions) { - Assert.IsInstanceOf(typeof(PropertyChangeAction), unsafeAction); - var propertyChangeAction = unsafeAction as PropertyChangeAction; - Assert.That(propertyChangeAction.Properties.ContainsKey("Type"), Is.True); - var targetColumnInfo = unsafeAction.Difference.Target as StorageTypeInfo; - var sourceColumnInfo = unsafeAction.Difference.Source as StorageTypeInfo; - Assert.That(IsOnlyNullableChanged(sourceColumnInfo, targetColumnInfo), Is.True); - } - - using (var initialDomain = Domain.Build(BuildConfiguration(false, typeof(model.V3.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - foreach (var entity in session.Query.All()) { - Assert.That(entity.Name, Is.EqualTo("Name")); - Assert.That(entity.ReferenceField, Is.Not.Null); - Assert.That(entity.StateField, Is.EqualTo(model.V3.Initial.State.Live)); - Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); - } - } - } - - [Test] - public void Test4() - { - using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V4.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new model.V4.Initial.TestEntity { - Name = "Name", - ReferenceField = new model.V4.Initial.TestReferencedEntity(), - StateField = model.V4.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - Domain domain = null; - Assert.DoesNotThrow( - () => { - domain = Domain.Build(BuildConfiguration(false, typeof (model.V4.Final.TestEntity))); - }); - Assert.That(domain, Is.Not.Null); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var entities = session.Query.All().ToList(); - Assert.That(entities.Count, Is.EqualTo(11)); - Assert.That(entities.Count(el => string.IsNullOrEmpty(el.Name)), Is.EqualTo(1)); - } - } - - [Test] - public void Test5() - { - using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V5.Initial.TestEntity)))) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new model.V5.Initial.TestEntity { - Name = "Name", - ReferenceField = new model.V5.Initial.TestReferencedEntity(), - StateField = model.V5.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - Domain domain = null; - Assert.DoesNotThrow( - () => domain = Domain.Build(BuildConfiguration(false, typeof (model.V5.Final.TestEntity)))); - Assert.That(domain, Is.Not.Null); - - using (domain) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - foreach (var entity in session.Query.All().Where(el => el.Name!=null)) { - Assert.That(entity.Name, Is.EqualTo("Name")); - Assert.That(entity.ReferenceField, Is.Not.Null); - Assert.That(entity.StateField, Is.EqualTo(model.V5.Final.State.Live)); - Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); - } - } - } - - [Test] - public void Test6() - { - using (var domain = Domain.Build(BuildConfiguration(true, typeof(model.V6.Initial.TestEntity)))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new model.V6.Initial.TestEntity { - Name = "Name", - ReferenceField = new model.V6.Initial.TestReferencedEntity(), - StateField = model.V6.Initial.State.Live, - TimeSpanField = new TimeSpan(3, 3, 3, 3), - }; - } - transaction.Complete(); - } - - using (var domain = Domain.Build(BuildConfiguration(false, typeof(model.V6.Final.TestEntity)))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(11)); - Assert.That(session.Query.All().Count(), Is.EqualTo(10)); - foreach (var entity in session.Query.All().Where(el=>el.Name!=null)) { - Assert.That(entity.Name, Is.EqualTo("Name")); - Assert.That(entity.ReferenceField, Is.Not.Null); - Assert.That((model.V6.Initial.State) entity.StateField, Is.EqualTo(model.V6.Initial.State.Live)); - Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); - } - } - } - - [OneTimeSetUp] - public void TestFixtureSetup() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - private DomainConfiguration BuildConfiguration(bool isInitial, params Type[] types) - { - var configuration = DomainConfigurationFactory.Create(); - foreach (var type in types) { - configuration.Types.Register(type.Assembly, type.Namespace); - } - configuration.UpgradeMode = (isInitial) ? DomainUpgradeMode.Recreate : DomainUpgradeMode.PerformSafely; - return configuration; - } - - private static bool IsOnlyNullableChanged(StorageTypeInfo source, StorageTypeInfo target) - { - return source.Scale == target.Scale && - source.Precision == target.Precision && - source.NativeType == target.NativeType && - source.Length == target.Length && - source.IsNullable != target.IsNullable; - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0607_ColumnUselessRecreationsTestModel -{ - namespace MainTestModel - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField01 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField02 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField03 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField04 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField05 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField06 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField07 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField08 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField09 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField10 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField11 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField12 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField13 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField14 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField15 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField16 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField17 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField18 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField19 { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestEntity2 LongField20 { get; set; } - } - - [HierarchyRoot] - public class TestEntity2 : Entity - { - [Field, Key] - public long Id { get; set; } - } - } - - namespace V1 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = false)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = false)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = false)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - - public class CustomUpgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - new TestEntity() {Name = null}; - } - } - } - } - - namespace V2 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = false)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - - public class CustomUpgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - new TestEntity() { Name = null, ReferenceField = null}; - } - } - } - } - - namespace V3 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = false)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = false)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - - public class CustomUpgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - new TestEntity() { Name = null }; - } - } - } - } - - namespace V4 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = false)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = false)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - - public class CustomUpgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - new TestEntity() { Name = null }; - } - } - } - } - - namespace V5 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public string Name { get; set; } - - [Field] - public State StateField { get; set; } - - [Field] - public TimeSpan TimeSpanField { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - } - - namespace V6 - { - namespace Initial - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - } - - namespace Final - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = true)] - public string Name { get; set; } - - [Field] - public State? StateField { get; set; } - - [Field] - public TimeSpan? TimeSpanField { get; set; } - - [Field(Nullable = true, NullableOnUpgrade = true)] - public TestReferencedEntity ReferenceField { get; set; } - } - - [HierarchyRoot] - public class TestReferencedEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public enum State - { - Live, - Dead - } - - public class CustomUpgrader : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnUpgrade() - { - new TestEntity() { Name = null }; - } - } - } - } -} +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Modelling.Actions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade; +using Xtensive.Orm.Upgrade.Model; +using model = Xtensive.Orm.Tests.Issues.IssueJira0607_ColumnUselessRecreationsTestModel; + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0607_ColumnUselessRecreationsTest + { + [Test] + public void MainTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var initialConfig = DomainConfigurationFactory.Create(); + initialConfig.Types.Register(typeof(model.MainTestModel.TestEntity)); + initialConfig.Types.Register(typeof(model.MainTestModel.TestEntity2)); + initialConfig.UpgradeMode = DomainUpgradeMode.Recreate; + using (var domain = Domain.Build(initialConfig)) { } + + // useful work + var configration = DomainConfigurationFactory.Create(); + configration.Types.Register(typeof(model.MainTestModel.TestEntity)); + configration.Types.Register(typeof(model.MainTestModel.TestEntity2)); + configration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + Exception exception = null; + int step = 0; + for (var i = 0; i < 30; i++, step++) { + try { + using (var domain = Domain.Build(configration)) { } + } + catch (Exception e) { + exception = e; + break; + } + } + Assert.That(exception, Is.Null); + Assert.That(step, Is.EqualTo(30)); + } + + [Test] + public void Test1() + { + Require.AnyFeatureSupported(ProviderFeatures.TransactionalDdl); + + using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof (model.V1.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + new model.V1.Initial.TestEntity() { + Name = "Name", + ReferenceField = new model.V1.Initial.TestReferencedEntity(), + StateField = model.V1.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + + Assert.Throws( + () => { + Domain domain = null; + try { + domain = Domain.Build(BuildConfiguration(false, typeof (model.V1.Final.TestEntity))); + } + finally { + if (domain!=null) + domain.Dispose(); + } + }); + using (var domain = Domain.Build(BuildConfiguration(false, typeof(model.V1.Initial.TestEntity)))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var entities = session.Query.All().ToList(); + Assert.That(entities.Count, Is.EqualTo(10)); + } + } + + [Test] + public void Test2() + { + using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V2.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + new model.V2.Initial.TestEntity() { + Name = "Name", + ReferenceField = new model.V2.Initial.TestReferencedEntity(), + StateField = model.V2.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + Assert.Throws(() => { + Domain domain=null; + try { + domain = Domain.Build(BuildConfiguration(false, typeof (model.V2.Final.TestEntity))); + } + finally { + if (domain!=null) + domain.Dispose(); + } + }); + + using (var initialDomain = Domain.Build(BuildConfiguration(false, typeof(model.V2.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + foreach (var entity in session.Query.All()) { + Assert.That(entity.Name, Is.EqualTo("Name")); + Assert.That(entity.ReferenceField, Is.Not.Null); + Assert.That(entity.StateField, Is.EqualTo(model.V2.Initial.State.Live)); + Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); + } + } + } + + [Test] + public void Test3() + { + using (var domain = Domain.Build(BuildConfiguration(true, typeof (model.V3.Initial.TestEntity)))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()){ + for (int i = 0; i < 10; i++) { + new model.V3.Initial.TestEntity { + Name = "Name", + ReferenceField = new model.V3.Initial.TestReferencedEntity(), + StateField = model.V3.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + + var exception = Assert.Throws( + () => Domain.Build(BuildConfiguration(false, typeof (model.V3.Final.TestEntity)))); + Assert.That(exception, Is.Not.Null); + Assert.That(exception.ComparisonResult.HasUnsafeActions, Is.True); + Assert.That(exception.ComparisonResult.UnsafeActions.Count, Is.EqualTo(4)); + foreach (var unsafeAction in exception.ComparisonResult.UnsafeActions) { + Assert.IsInstanceOf(typeof(PropertyChangeAction), unsafeAction); + var propertyChangeAction = unsafeAction as PropertyChangeAction; + Assert.That(propertyChangeAction.Properties.ContainsKey("Type"), Is.True); + var targetColumnInfo = unsafeAction.Difference.Target as StorageTypeInfo; + var sourceColumnInfo = unsafeAction.Difference.Source as StorageTypeInfo; + Assert.That(IsOnlyNullableChanged(sourceColumnInfo, targetColumnInfo), Is.True); + } + + using (var initialDomain = Domain.Build(BuildConfiguration(false, typeof(model.V3.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + foreach (var entity in session.Query.All()) { + Assert.That(entity.Name, Is.EqualTo("Name")); + Assert.That(entity.ReferenceField, Is.Not.Null); + Assert.That(entity.StateField, Is.EqualTo(model.V3.Initial.State.Live)); + Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); + } + } + } + + [Test] + public void Test4() + { + using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V4.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + new model.V4.Initial.TestEntity { + Name = "Name", + ReferenceField = new model.V4.Initial.TestReferencedEntity(), + StateField = model.V4.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + Domain domain = null; + Assert.DoesNotThrow( + () => { + domain = Domain.Build(BuildConfiguration(false, typeof (model.V4.Final.TestEntity))); + }); + Assert.That(domain, Is.Not.Null); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var entities = session.Query.All().ToList(); + Assert.That(entities.Count, Is.EqualTo(11)); + Assert.That(entities.Count(el => string.IsNullOrEmpty(el.Name)), Is.EqualTo(1)); + } + } + + [Test] + public void Test5() + { + using (var initialDomain = Domain.Build(BuildConfiguration(true, typeof(model.V5.Initial.TestEntity)))) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + new model.V5.Initial.TestEntity { + Name = "Name", + ReferenceField = new model.V5.Initial.TestReferencedEntity(), + StateField = model.V5.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + Domain domain = null; + Assert.DoesNotThrow( + () => domain = Domain.Build(BuildConfiguration(false, typeof (model.V5.Final.TestEntity)))); + Assert.That(domain, Is.Not.Null); + + using (domain) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + foreach (var entity in session.Query.All().Where(el => el.Name!=null)) { + Assert.That(entity.Name, Is.EqualTo("Name")); + Assert.That(entity.ReferenceField, Is.Not.Null); + Assert.That(entity.StateField, Is.EqualTo(model.V5.Final.State.Live)); + Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); + } + } + } + + [Test] + public void Test6() + { + using (var domain = Domain.Build(BuildConfiguration(true, typeof(model.V6.Initial.TestEntity)))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + new model.V6.Initial.TestEntity { + Name = "Name", + ReferenceField = new model.V6.Initial.TestReferencedEntity(), + StateField = model.V6.Initial.State.Live, + TimeSpanField = new TimeSpan(3, 3, 3, 3), + }; + } + transaction.Complete(); + } + + using (var domain = Domain.Build(BuildConfiguration(false, typeof(model.V6.Final.TestEntity)))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(11)); + Assert.That(session.Query.All().Count(), Is.EqualTo(10)); + foreach (var entity in session.Query.All().Where(el=>el.Name!=null)) { + Assert.That(entity.Name, Is.EqualTo("Name")); + Assert.That(entity.ReferenceField, Is.Not.Null); + Assert.That((model.V6.Initial.State) entity.StateField, Is.EqualTo(model.V6.Initial.State.Live)); + Assert.That(entity.TimeSpanField, Is.EqualTo(new TimeSpan(3, 3, 3, 3))); + } + } + } + + [OneTimeSetUp] + public void TestFixtureSetup() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + private DomainConfiguration BuildConfiguration(bool isInitial, params Type[] types) + { + var configuration = DomainConfigurationFactory.Create(); + foreach (var type in types) { + configuration.Types.Register(type.Assembly, type.Namespace); + } + configuration.UpgradeMode = (isInitial) ? DomainUpgradeMode.Recreate : DomainUpgradeMode.PerformSafely; + return configuration; + } + + private static bool IsOnlyNullableChanged(StorageTypeInfo source, StorageTypeInfo target) + { + return source.Scale == target.Scale && + source.Precision == target.Precision && + source.NativeType == target.NativeType && + source.Length == target.Length && + source.IsNullable != target.IsNullable; + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0607_ColumnUselessRecreationsTestModel +{ + namespace MainTestModel + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField01 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField02 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField03 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField04 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField05 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField06 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField07 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField08 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField09 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField10 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField11 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField12 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField13 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField14 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField15 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField16 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField17 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField18 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField19 { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestEntity2 LongField20 { get; set; } + } + + [HierarchyRoot] + public class TestEntity2 : Entity + { + [Field, Key] + public long Id { get; set; } + } + } + + namespace V1 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = false)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = false)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = false)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + + public class CustomUpgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + new TestEntity() {Name = null}; + } + } + } + } + + namespace V2 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = false)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + + public class CustomUpgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + new TestEntity() { Name = null, ReferenceField = null}; + } + } + } + } + + namespace V3 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = false)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = false)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + + public class CustomUpgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + new TestEntity() { Name = null }; + } + } + } + } + + namespace V4 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = false)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = false)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + + public class CustomUpgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + new TestEntity() { Name = null }; + } + } + } + } + + namespace V5 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public string Name { get; set; } + + [Field] + public State StateField { get; set; } + + [Field] + public TimeSpan TimeSpanField { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + } + + namespace V6 + { + namespace Initial + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + } + + namespace Final + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = true)] + public string Name { get; set; } + + [Field] + public State? StateField { get; set; } + + [Field] + public TimeSpan? TimeSpanField { get; set; } + + [Field(Nullable = true, NullableOnUpgrade = true)] + public TestReferencedEntity ReferenceField { get; set; } + } + + [HierarchyRoot] + public class TestReferencedEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public enum State + { + Live, + Dead + } + + public class CustomUpgrader : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnUpgrade() + { + new TestEntity() { Name = null }; + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0609_RewritingQueriesInClosure.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0609_RewritingQueriesInClosure.cs index e2810c3e92..d5ebc848d2 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0609_RewritingQueriesInClosure.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0609_RewritingQueriesInClosure.cs @@ -1,137 +1,137 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2009.11.02 - -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Xtensive.Orm.Tests.Issues.IssueJira0609_RewritingQueriesInClosureModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0609_RewritingQueriesInClosure : AutoBuildTest - { - private List uniqueIdentifiers; - - [Test] - public void DirectInParametersTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var q = Query.All().Where(c => c.IsAvailable); - var pallets = Query.All().Where(p => p.UniqueIdentifier.In("2","4","6","8","10")); - var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); - q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); - Assert.DoesNotThrow(()=>q.Run()); - var expectedCountOfElemetns = uniqueIdentifiers.Where((s,i)=> i % 2==0).Count(); - Assert.That(q.Count(), Is.EqualTo(expectedCountOfElemetns)); - } - } - - [Test] - public void ArrayAsParameterForInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var q = Query.All().Where(c => c.IsAvailable); - var requiredIdentifiers = uniqueIdentifiers.Where((s, i) => i % 2==0).ToArray(); - var pallets = Query.All().Where(p => p.UniqueIdentifier.In(requiredIdentifiers)); - var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); - q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); - Assert.DoesNotThrow(() => q.Run()); - Assert.That(q.Count(), Is.EqualTo(requiredIdentifiers.Length)); - } - } - - [Test] - public void EnumerableAsParameterForInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var q = Query.All().Where(c => c.IsAvailable); - var requiredIdentifiers = uniqueIdentifiers.Where((s, i) => i % 2==0); - var pallets = Query.All().Where(p => p.UniqueIdentifier.In(requiredIdentifiers)); - var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); - q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); - Assert.DoesNotThrow(() => q.Run()); - Assert.That(q.Count(), Is.EqualTo(requiredIdentifiers.Count())); - } - } - - protected override void PopulateData() - { - PopulateIdentifiers(); - PopulateEntities(); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(StoredMaterialLot)); - return configuration; - } - - private void PopulateIdentifiers() - { - uniqueIdentifiers = new List(Enumerable.Range(1, 10).Select(el => el.ToString(CultureInfo.InvariantCulture))); - } - - private void PopulateEntities() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - foreach (var uniqueIdentifier in uniqueIdentifiers) { - new StoredMaterialLot { - IsAvailable = true, - StoredContainer = new StoredContainer { - Container = new BegroPallet {UniqueIdentifier = uniqueIdentifier} - } - }; - } - transaction.Complete(); - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues.Xtensive.Orm.Tests.Issues.IssueJira0609_RewritingQueriesInClosureModel -{ - [HierarchyRoot] - public class StoredMaterialLot : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public bool IsAvailable { get; set; } - - [Field] - public StoredContainer StoredContainer { get; set; } - } - - [HierarchyRoot] - public class BegroPallet : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string UniqueIdentifier { get; set; } - } - - [HierarchyRoot] - public class StoredContainer : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public BegroPallet Container { get; set; } - } +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2009.11.02 + +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Xtensive.Orm.Tests.Issues.IssueJira0609_RewritingQueriesInClosureModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0609_RewritingQueriesInClosure : AutoBuildTest + { + private List uniqueIdentifiers; + + [Test] + public void DirectInParametersTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var q = Query.All().Where(c => c.IsAvailable); + var pallets = Query.All().Where(p => p.UniqueIdentifier.In("2","4","6","8","10")); + var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); + q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); + Assert.DoesNotThrow(()=>q.Run()); + var expectedCountOfElemetns = uniqueIdentifiers.Where((s,i)=> i % 2==0).Count(); + Assert.That(q.Count(), Is.EqualTo(expectedCountOfElemetns)); + } + } + + [Test] + public void ArrayAsParameterForInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var q = Query.All().Where(c => c.IsAvailable); + var requiredIdentifiers = uniqueIdentifiers.Where((s, i) => i % 2==0).ToArray(); + var pallets = Query.All().Where(p => p.UniqueIdentifier.In(requiredIdentifiers)); + var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); + q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); + Assert.DoesNotThrow(() => q.Run()); + Assert.That(q.Count(), Is.EqualTo(requiredIdentifiers.Length)); + } + } + + [Test] + public void EnumerableAsParameterForInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var q = Query.All().Where(c => c.IsAvailable); + var requiredIdentifiers = uniqueIdentifiers.Where((s, i) => i % 2==0); + var pallets = Query.All().Where(p => p.UniqueIdentifier.In(requiredIdentifiers)); + var storedContainers = Query.All().Where(sc => sc.Container.Id.In(pallets.Select(p => p.Id))); + q = q.Where(sml => sml.StoredContainer.Id.In(storedContainers.Select(sc => sc.Id))); + Assert.DoesNotThrow(() => q.Run()); + Assert.That(q.Count(), Is.EqualTo(requiredIdentifiers.Count())); + } + } + + protected override void PopulateData() + { + PopulateIdentifiers(); + PopulateEntities(); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(StoredMaterialLot)); + return configuration; + } + + private void PopulateIdentifiers() + { + uniqueIdentifiers = new List(Enumerable.Range(1, 10).Select(el => el.ToString(CultureInfo.InvariantCulture))); + } + + private void PopulateEntities() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + foreach (var uniqueIdentifier in uniqueIdentifiers) { + new StoredMaterialLot { + IsAvailable = true, + StoredContainer = new StoredContainer { + Container = new BegroPallet {UniqueIdentifier = uniqueIdentifier} + } + }; + } + transaction.Complete(); + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues.Xtensive.Orm.Tests.Issues.IssueJira0609_RewritingQueriesInClosureModel +{ + [HierarchyRoot] + public class StoredMaterialLot : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public bool IsAvailable { get; set; } + + [Field] + public StoredContainer StoredContainer { get; set; } + } + + [HierarchyRoot] + public class BegroPallet : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string UniqueIdentifier { get; set; } + } + + [HierarchyRoot] + public class StoredContainer : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public BegroPallet Container { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0612_NonPairedReferencesSearchBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0612_NonPairedReferencesSearchBug.cs index 1825d7c01e..4802275a8f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0612_NonPairedReferencesSearchBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0612_NonPairedReferencesSearchBug.cs @@ -1,76 +1,76 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0612_ReferenceFinderBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0612_ReferenceFinderBugModel -{ - [HierarchyRoot] - public class TestA : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field, Association(PairTo = "TestA", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet TestBs { get; private set; } - } - - [HierarchyRoot] - public class TestB : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public TestA TestA { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TestC : Entity - { - [Field, Key] - public int Id { get; private set; } - [Field] - public string Text { get; set; } - - [Field] - public string Text2 { get; set; } - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public TestA TestA { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0612_NonPairedReferencesSearchBug : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { - var NewTestA = new TestA {Text = "TestA"}; - new TestB {TestA = NewTestA, Text = "TestB"}; - // Wrong ReferencingEntity "TestB" instead of "TestC" with Association "TestC-TestA-TestA" - var references = ReferenceFinder.GetReferencesTo(NewTestA).ToList(); - // Exception - Assert.DoesNotThrow(() => NewTestA.Remove()); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0612_ReferenceFinderBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0612_ReferenceFinderBugModel +{ + [HierarchyRoot] + public class TestA : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field, Association(PairTo = "TestA", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet TestBs { get; private set; } + } + + [HierarchyRoot] + public class TestB : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public TestA TestA { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TestC : Entity + { + [Field, Key] + public int Id { get; private set; } + [Field] + public string Text { get; set; } + + [Field] + public string Text2 { get; set; } + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public TestA TestA { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0612_NonPairedReferencesSearchBug : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { + var NewTestA = new TestA {Text = "TestA"}; + new TestB {TestA = NewTestA, Text = "TestB"}; + // Wrong ReferencingEntity "TestB" instead of "TestC" with Association "TestC-TestA-TestA" + var references = ReferenceFinder.GetReferencesTo(NewTestA).ToList(); + // Exception + Assert.DoesNotThrow(() => NewTestA.Remove()); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0613_DataCleanUpInPerformSafely.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0613_DataCleanUpInPerformSafely.cs index e9e6c7db4c..5710a49666 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0613_DataCleanUpInPerformSafely.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0613_DataCleanUpInPerformSafely.cs @@ -1,490 +1,490 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.04.27 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Model; -using userCase = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.UserCase; -using upgradeSource = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.Sources; -using upgradeTargets = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.Targets; - - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0613_DataCleanUpInPerformSafely - { - [Test] - public void MainTest() - { - var sourceType = typeof (userCase.Source.A1); - var targetType = typeof (userCase.Target.A1); - - Action populateAction = () => { - for (int i = 0; i < 10; i++) { - new userCase.Source.A1 {Date = DateTime.Now, Text = "A1 " + i}; - } - for (int i = 0; i < 10; i++) { - new userCase.Source.A2 {Length = i, Text = "A2 " + i}; - } - }; - - Action validateAction = (session) => { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - - count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - }; - - RunTest(populateAction, validateAction, sourceType, targetType, true); - RunTest(populateAction, validateAction, sourceType, targetType, false); - } - - // Movement handling algorithm is based on source type's hierarchy - // We need to test only three cases - // 1) type is moved from ConcreteTable hierarchy - // 2) type is moved from ClassTable hierarcy - // 3) type is moved from SingleTable hierarchy - // Target types' hierarchies are not so important so we are free to choose - // whatever hierarchy we like. The esiest case is to get target hierarchy of same type - - [Test] - public void ConcreteTableToConcreteTableMovement() - { - var sourceType = typeof (upgradeSource.ConcreteToConcrete.BaseType1); - var targetType = typeof (upgradeTargets.ConcreteToConcrete.BaseType1); - - Action populateAction = () => { - for (int i = 0; i < 10; i++) { - new upgradeSource.ConcreteToConcrete.A1 { - Date = DateTime.Now.Date, - Text = (100 + i).ToString() - }; - } - for (int i = 0; i < 10; i++) { - new upgradeSource.ConcreteToConcrete.A2 { - Date = DateTime.Now.AddDays(10).Date, - Text = (200 + i).ToString() - }; - } - }; - - Action validateAction = (session) => { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - - count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - }; - - RunTest(populateAction, validateAction, sourceType, targetType, true); - RunTest(populateAction, validateAction, sourceType, targetType, false); - } - - [Test] - public void ClassTableToClassTable() - { - var sourceType = typeof(upgradeSource.ClassToClass.BaseType1); - var targetType = typeof(upgradeTargets.ClassToClass.BaseType1); - - Action populateAction = () => { - for (int i = 0; i < 10; i++) { - new upgradeSource.ClassToClass.A1 { - Text = (100 + i).ToString(), - Value = i - }; - } - for (int i = 0; i < 10; i++) { - new upgradeSource.ClassToClass.A2 { - Date = DateTime.Now.Date, - Text = (100 + i).ToString() - }; - } - }; - - Action validateAction = (session) => - { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - - count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - }; - - RunTest(populateAction, validateAction, sourceType, targetType, true); - RunTest(populateAction, validateAction, sourceType, targetType, false); - } - - [Test] - public void SingleTableToSingleTable() - { - var sourceType = typeof(upgradeSource.SingleToSingle.BaseType1); - var targetType = typeof(upgradeTargets.SingleToSingle.BaseType1); - - Action populateAction = () => { - for (int i = 0; i < 10; i++) { - new upgradeSource.SingleToSingle.A1 { - Text = (100 + i).ToString(), - }; - } - for (int i = 0; i < 10; i++) { - new upgradeSource.SingleToSingle.A2 { - - Text = (100 + i).ToString() - }; - } - }; - - Action validateAction = (session) => - { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - - count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(10)); - }; - - RunTest(populateAction, validateAction, sourceType, targetType, true); - // There is no difference in structure of database before and after uprade in this case - // Needn't run test one more time. - //RunTest(populateAction, validateAction, sourceType, targetType, false); - } - - private void RunTest(Action populateAction, Action validateAction, Type initialType, Type upgradedType, bool isSafelyMode) - { - var inintialConfiguration = DomainConfigurationFactory.Create(); - inintialConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - inintialConfiguration.Types.Register(initialType.Assembly, initialType.Namespace); - using (var initialDomain = Domain.Build(inintialConfiguration)) - using (var session = initialDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - populateAction.Invoke(); - transaction.Complete(); - } - - var upgradingConfiguration = DomainConfigurationFactory.Create(); - upgradingConfiguration.UpgradeMode = (isSafelyMode) ? DomainUpgradeMode.PerformSafely : DomainUpgradeMode.Perform; - upgradingConfiguration.Types.Register(upgradedType.Assembly, upgradedType.Namespace); - if (isSafelyMode) { - Assert.Throws(() => Domain.Build(upgradingConfiguration)); - } - else - Assert.DoesNotThrow(() => Domain.Build(upgradingConfiguration)); - - var validationConfiguration = inintialConfiguration.Clone(); - validationConfiguration.UpgradeMode = DomainUpgradeMode.Validate; - if (isSafelyMode) { - using (var performedDomain = Domain.Build(validationConfiguration)) - using (var session = performedDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - validateAction.Invoke(session); - } - } - else - // In this kind of tests we have only primary keys changed. - // To be clear, only name is changed. - // But MySQL has no named PKs so we have no difference in mysql - if (validationConfiguration.ConnectionInfo.Provider!=WellKnown.Provider.MySql) - Assert.Throws(() => Domain.Build(validationConfiguration)); - else - Assert.DoesNotThrow(()=>Domain.Build(validationConfiguration)); - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel -{ - namespace UserCase - { - namespace Source - { - public abstract class BaseType : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [HierarchyRoot] - public class A1 : BaseType - { - [Field] - public DateTime Date { get; set; } - } - - [HierarchyRoot] - public class A2 : BaseType - { - [Field] - public int Length { get; set; } - } - } - - namespace Target - { - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BaseType : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - public class A1 : BaseType - { - [Field] - public DateTime Date { get; set; } - } - - public class A2 : BaseType - { - [Field] - public int Length { get; set; } - } - } - } - - namespace Sources - { - namespace ConcreteToConcrete - { - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A1 : BaseType1 - { - [Field] - public DateTime Date { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BaseType2: Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A2 : BaseType2 - { - [Field] - public DateTime Date { get; set; } - } - } - - namespace ClassToClass - { - [HierarchyRoot] - public class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - public string Text { get; set; } - } - - public class A1 : BaseType1 - { - public double Value { get; set; } - } - - public class A2 : BaseType1 - { - public DateTime Date { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class BaseType2 : Entity - { - [Field, Key] - public int Id { get; set; } - - public string Text { get; set; } - } - - public class A3 : BaseType2 - { - public double Value { get; set; } - } - - public class A4 : BaseType2 - { - public DateTime Date { get; set; } - } - } - - namespace SingleToSingle - { - [HierarchyRoot(InheritanceSchema.SingleTable)] - public abstract class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A1 : BaseType1 - { - } - - public class A2 : BaseType1 - { - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public abstract class BaseType2 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A3 : BaseType2 - { - } - - public class A4 : BaseType2 - { - } - } - } - - namespace Targets - { - namespace ConcreteToConcrete - { - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A2 : BaseType1 - { - [Field] - public DateTime Date { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public abstract class BaseType2 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A1 : BaseType2 - { - [Field] - public DateTime Date { get; set; } - } - } - - namespace ClassToClass - { - [HierarchyRoot] - public class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - public string Text { get; set; } - } - - public class A3 : BaseType1 - { - public double Value { get; set; } - } - - public class A4 : BaseType1 - { - public DateTime Date { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class BaseType2 : Entity - { - [Field, Key] - public int Id { get; set; } - - public string Text { get; set; } - } - - public class A1 : BaseType2 - { - public double Value { get; set; } - } - - public class A2 : BaseType2 - { - public DateTime Date { get; set; } - } - } - - namespace SingleToSingle - { - [HierarchyRoot(InheritanceSchema.SingleTable)] - public abstract class BaseType1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A3 : BaseType1 - { - } - - public class A4 : BaseType1 - { - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public abstract class BaseType2 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class A1 : BaseType2 - { - } - - public class A2 : BaseType2 - { - } - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.04.27 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Model; +using userCase = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.UserCase; +using upgradeSource = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.Sources; +using upgradeTargets = Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel.Targets; + + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0613_DataCleanUpInPerformSafely + { + [Test] + public void MainTest() + { + var sourceType = typeof (userCase.Source.A1); + var targetType = typeof (userCase.Target.A1); + + Action populateAction = () => { + for (int i = 0; i < 10; i++) { + new userCase.Source.A1 {Date = DateTime.Now, Text = "A1 " + i}; + } + for (int i = 0; i < 10; i++) { + new userCase.Source.A2 {Length = i, Text = "A2 " + i}; + } + }; + + Action validateAction = (session) => { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + + count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + }; + + RunTest(populateAction, validateAction, sourceType, targetType, true); + RunTest(populateAction, validateAction, sourceType, targetType, false); + } + + // Movement handling algorithm is based on source type's hierarchy + // We need to test only three cases + // 1) type is moved from ConcreteTable hierarchy + // 2) type is moved from ClassTable hierarcy + // 3) type is moved from SingleTable hierarchy + // Target types' hierarchies are not so important so we are free to choose + // whatever hierarchy we like. The esiest case is to get target hierarchy of same type + + [Test] + public void ConcreteTableToConcreteTableMovement() + { + var sourceType = typeof (upgradeSource.ConcreteToConcrete.BaseType1); + var targetType = typeof (upgradeTargets.ConcreteToConcrete.BaseType1); + + Action populateAction = () => { + for (int i = 0; i < 10; i++) { + new upgradeSource.ConcreteToConcrete.A1 { + Date = DateTime.Now.Date, + Text = (100 + i).ToString() + }; + } + for (int i = 0; i < 10; i++) { + new upgradeSource.ConcreteToConcrete.A2 { + Date = DateTime.Now.AddDays(10).Date, + Text = (200 + i).ToString() + }; + } + }; + + Action validateAction = (session) => { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + + count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + }; + + RunTest(populateAction, validateAction, sourceType, targetType, true); + RunTest(populateAction, validateAction, sourceType, targetType, false); + } + + [Test] + public void ClassTableToClassTable() + { + var sourceType = typeof(upgradeSource.ClassToClass.BaseType1); + var targetType = typeof(upgradeTargets.ClassToClass.BaseType1); + + Action populateAction = () => { + for (int i = 0; i < 10; i++) { + new upgradeSource.ClassToClass.A1 { + Text = (100 + i).ToString(), + Value = i + }; + } + for (int i = 0; i < 10; i++) { + new upgradeSource.ClassToClass.A2 { + Date = DateTime.Now.Date, + Text = (100 + i).ToString() + }; + } + }; + + Action validateAction = (session) => + { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + + count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + }; + + RunTest(populateAction, validateAction, sourceType, targetType, true); + RunTest(populateAction, validateAction, sourceType, targetType, false); + } + + [Test] + public void SingleTableToSingleTable() + { + var sourceType = typeof(upgradeSource.SingleToSingle.BaseType1); + var targetType = typeof(upgradeTargets.SingleToSingle.BaseType1); + + Action populateAction = () => { + for (int i = 0; i < 10; i++) { + new upgradeSource.SingleToSingle.A1 { + Text = (100 + i).ToString(), + }; + } + for (int i = 0; i < 10; i++) { + new upgradeSource.SingleToSingle.A2 { + + Text = (100 + i).ToString() + }; + } + }; + + Action validateAction = (session) => + { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + + count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(10)); + }; + + RunTest(populateAction, validateAction, sourceType, targetType, true); + // There is no difference in structure of database before and after uprade in this case + // Needn't run test one more time. + //RunTest(populateAction, validateAction, sourceType, targetType, false); + } + + private void RunTest(Action populateAction, Action validateAction, Type initialType, Type upgradedType, bool isSafelyMode) + { + var inintialConfiguration = DomainConfigurationFactory.Create(); + inintialConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + inintialConfiguration.Types.Register(initialType.Assembly, initialType.Namespace); + using (var initialDomain = Domain.Build(inintialConfiguration)) + using (var session = initialDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + populateAction.Invoke(); + transaction.Complete(); + } + + var upgradingConfiguration = DomainConfigurationFactory.Create(); + upgradingConfiguration.UpgradeMode = (isSafelyMode) ? DomainUpgradeMode.PerformSafely : DomainUpgradeMode.Perform; + upgradingConfiguration.Types.Register(upgradedType.Assembly, upgradedType.Namespace); + if (isSafelyMode) { + Assert.Throws(() => Domain.Build(upgradingConfiguration)); + } + else + Assert.DoesNotThrow(() => Domain.Build(upgradingConfiguration)); + + var validationConfiguration = inintialConfiguration.Clone(); + validationConfiguration.UpgradeMode = DomainUpgradeMode.Validate; + if (isSafelyMode) { + using (var performedDomain = Domain.Build(validationConfiguration)) + using (var session = performedDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + validateAction.Invoke(session); + } + } + else + // In this kind of tests we have only primary keys changed. + // To be clear, only name is changed. + // But MySQL has no named PKs so we have no difference in mysql + if (validationConfiguration.ConnectionInfo.Provider!=WellKnown.Provider.MySql) + Assert.Throws(() => Domain.Build(validationConfiguration)); + else + Assert.DoesNotThrow(()=>Domain.Build(validationConfiguration)); + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0613_DataCleanUpInPerformSafelyModel +{ + namespace UserCase + { + namespace Source + { + public abstract class BaseType : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [HierarchyRoot] + public class A1 : BaseType + { + [Field] + public DateTime Date { get; set; } + } + + [HierarchyRoot] + public class A2 : BaseType + { + [Field] + public int Length { get; set; } + } + } + + namespace Target + { + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BaseType : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + public class A1 : BaseType + { + [Field] + public DateTime Date { get; set; } + } + + public class A2 : BaseType + { + [Field] + public int Length { get; set; } + } + } + } + + namespace Sources + { + namespace ConcreteToConcrete + { + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A1 : BaseType1 + { + [Field] + public DateTime Date { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BaseType2: Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A2 : BaseType2 + { + [Field] + public DateTime Date { get; set; } + } + } + + namespace ClassToClass + { + [HierarchyRoot] + public class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + public string Text { get; set; } + } + + public class A1 : BaseType1 + { + public double Value { get; set; } + } + + public class A2 : BaseType1 + { + public DateTime Date { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class BaseType2 : Entity + { + [Field, Key] + public int Id { get; set; } + + public string Text { get; set; } + } + + public class A3 : BaseType2 + { + public double Value { get; set; } + } + + public class A4 : BaseType2 + { + public DateTime Date { get; set; } + } + } + + namespace SingleToSingle + { + [HierarchyRoot(InheritanceSchema.SingleTable)] + public abstract class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A1 : BaseType1 + { + } + + public class A2 : BaseType1 + { + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public abstract class BaseType2 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A3 : BaseType2 + { + } + + public class A4 : BaseType2 + { + } + } + } + + namespace Targets + { + namespace ConcreteToConcrete + { + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A2 : BaseType1 + { + [Field] + public DateTime Date { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public abstract class BaseType2 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A1 : BaseType2 + { + [Field] + public DateTime Date { get; set; } + } + } + + namespace ClassToClass + { + [HierarchyRoot] + public class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + public string Text { get; set; } + } + + public class A3 : BaseType1 + { + public double Value { get; set; } + } + + public class A4 : BaseType1 + { + public DateTime Date { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class BaseType2 : Entity + { + [Field, Key] + public int Id { get; set; } + + public string Text { get; set; } + } + + public class A1 : BaseType2 + { + public double Value { get; set; } + } + + public class A2 : BaseType2 + { + public DateTime Date { get; set; } + } + } + + namespace SingleToSingle + { + [HierarchyRoot(InheritanceSchema.SingleTable)] + public abstract class BaseType1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A3 : BaseType1 + { + } + + public class A4 : BaseType1 + { + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public abstract class BaseType2 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class A1 : BaseType2 + { + } + + public class A2 : BaseType2 + { + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs index 1534d290d1..9153670f65 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs @@ -1,493 +1,493 @@ -using System; -using System.Diagnostics; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel; -using Xtensive.Orm.Tests.Storage.VersionBehavior.Model; -using Xtensive.Orm.Upgrade; -using Node1 = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Source.Node1; -using Node2 = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Source.Node2; -using Target = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Target; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel -{ - namespace Source.Node1 - { - public abstract class BusinessEntityBase : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - public BusinessEntityBase(Session session) - : base(session) - { } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - [Index("Code", Unique = true)] - public class TimesheetCode : BusinessEntityBase - { - public const string Other = "Other"; - public const string Meal = "Meal"; - public const string Training = "Training"; - - [Field(Length = 25)] - public string EventName { get; set; } - - [Field(Length = 8, Nullable = false)] - public string Code { get; set; } - - [Field(Length = 100)] - public string Description { get; set; } - - [Field] - public bool IsPaid { get; set; } - - public string GetDisplayName() - { - return string.IsNullOrEmpty(EventName) ? Code : EventName; - } - - public TimesheetCode(Session session) - : base(session) - { } - } - - public class CustomUpgradeHandler : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnPrepare() - { - UpgradeContext.UserDefinedTypeMap.Add(typeof(TimesheetCode).FullName, 288); - } - } - } - - namespace Source.Node2 - { - public abstract class BusinessEntityBase : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - public BusinessEntityBase(Session session) - : base(session) - { } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - [Index("Code", Unique = true)] - public class TimesheetCode : BusinessEntityBase - { - public const string Other = "Other"; - public const string Meal = "Meal"; - public const string Training = "Training"; - - [Field(Length = 25)] - public string EventName { get; set; } - - [Field(Length = 8, Nullable = false)] - public string Code { get; set; } - - [Field(Length = 100)] - public string Description { get; set; } - - [Field] - public bool IsPaid { get; set; } - - public string GetDisplayName() - { - return string.IsNullOrEmpty(EventName) ? Code : EventName; - } - - public TimesheetCode(Session session) - : base(session) - { } - } - - public class CustomUpgradeHandler : UpgradeHandler - { - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - public override void OnPrepare() - { - UpgradeContext.UserDefinedTypeMap.Add(typeof(TimesheetCode).FullName, 284); - } - } - } - - namespace Target - { - public abstract class BusinessEntityBase : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - public BusinessEntityBase(Session session) - : base(session) - { } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - [Index("Code", Unique = true)] - public class TimesheetCode : BusinessEntityBase - { - public const string Other = "Other"; - public const string Meal = "Meal"; - public const string Training = "Training"; - - [Field(Length = 25)] - public string EventName { get; set; } - - [Field(Length = 8, Nullable = false)] - public string Code { get; set; } - - [Field(Length = 100)] - public string Description { get; set; } - - [Field] - public bool IsPaid { get; set; } - - public string GetDisplayName() - { - return string.IsNullOrEmpty(EventName) ? Code : EventName; - } - - public TimesheetCode(Session session) - : base(session) - { } - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0614_MaterializationContextModel - { - private const string Node2Name = "Node2"; - private const string Node1Name = "Node1"; - private const string ErrorInTestFixtureSetup = "Error in Text fixture setup {0}"; - - [Test] - public void Test01() - { - var configuration1 = CreateConfiguration(typeof (Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); - var configuration2 = CreateConfiguration(typeof (Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); - - using (var domain = BuildDomain(configuration1)) { - Assert.That(domain.Model.Types[typeof (Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < 10; i++) { - new Node1.TimesheetCode(session) { - Active = i % 2==0, - Code = "jdfgdj" + i, - Description = "dfjghjdhfgjhsjkhgjdfg", - EventName = "Event" + i, - IsPaid = true - }; - } - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - using (var domain = BuildDomain(configuration2)) { - Assert.That(domain.Model.Types[typeof(Node2.TimesheetCode)].TypeId, Is.EqualTo(284)); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < 10; i++) { - new Node2.TimesheetCode(session) { - Active = i % 2 == 0, - Code = "jdfgdj" + i, - Description = "dfjghjdhfgjhsjkhgjdfg", - EventName = "Event" + i, - IsPaid = true - }; - } - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - var multinodeDomainConfiguration = CreateConfiguration(typeof (Target.TimesheetCode), DomainUpgradeMode.Skip, "Model1"); - var nodeConfiguration = CreateNodeConfiguration(Node2Name, "Model1", "Model2", DomainUpgradeMode.Skip); - using (var domain = BuildDomain(multinodeDomainConfiguration)) { - domain.StorageNodeManager.AddNode(nodeConfiguration); - using (var session = domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - using (var session = domain.OpenSession()) { - session.SelectStorageNode(Node2Name); - using (var transaction = session.OpenTransaction()) { - - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - } - } - } - } - - [Test] - public void Test02() - { - var configuration1 = CreateConfiguration(typeof(Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); - var configuration2 = CreateConfiguration(typeof(Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); - - using (var domain = BuildDomain(configuration1)) { - Assert.That(domain.Model.Types[typeof(Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < 10; i++) { - new Node1.TimesheetCode(session) { - Active = i % 2 == 0, - Code = "jdfgdj" + i, - Description = "dfjghjdhfgjhsjkhgjdfg", - EventName = "Event" + i, - IsPaid = true - }; - } - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new - { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - using (var domain = BuildDomain(configuration2)) { - Assert.That(domain.Model.Types[typeof(Node2.TimesheetCode)].TypeId, Is.EqualTo(284)); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < 10; i++) { - new Node2.TimesheetCode(session) { - Active = i % 2 == 0, - Code = "jdfgdj" + i, - Description = "dfjghjdhfgjhsjkhgjdfg", - EventName = "Event" + i, - IsPaid = true - }; - } - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new - { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - var multinodeDomainConfiguration = CreateConfiguration(typeof(Target.TimesheetCode), DomainUpgradeMode.PerformSafely, "Model2"); - var nodeConfiguration = CreateNodeConfiguration(Node1Name, "Model2", "Model1", DomainUpgradeMode.PerformSafely); - using (var domain = BuildDomain(multinodeDomainConfiguration, nodeConfiguration)) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new - { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new - { - Value = c.Code, - Name = c.Code - }).ToList(); - Assert.That(list.Count, Is.EqualTo(5)); - } - } - - using (var session = domain.OpenSession()) { - session.SelectStorageNode(Node1Name); - using (var transaction = session.OpenTransaction()) { - - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new - { - Value = c.Code, - Name = c.Code - }).ToList(); - } - using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - } - } - } - } - - private void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multischema); - Require.ProviderIs(StorageProvider.SqlServer); - } - - private Domain BuildDomain(DomainConfiguration configuration, NodeConfiguration nodeConfiguration = null) - { - try{ - var domain = Domain.Build(configuration); - if (nodeConfiguration!=null) - domain.StorageNodeManager.AddNode(nodeConfiguration); - return domain; - } - catch (Exception e) { - TestLog.Error(GetType().GetFullName()); - TestLog.Error(e); - throw; - } - } - - private DomainConfiguration CreateConfiguration(Type type, DomainUpgradeMode upgradeMode, string defaultSchema) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(type.Assembly, type.Namespace); - configuration.DefaultSchema = defaultSchema; - return configuration; - } - - private NodeConfiguration CreateNodeConfiguration(string nodeId, string oldSchema, string newSchema, DomainUpgradeMode upgradeMode) - { - var configuration = new NodeConfiguration(nodeId); - configuration.SchemaMapping.Add(oldSchema, newSchema); - configuration.UpgradeMode = upgradeMode; - return configuration; - } - - [OneTimeSetUp] - public void TestFixtureSetUp() - { - try { - CheckRequirements(); - } - catch (IgnoreException) { - throw; - } - catch (Exception e) { - Debug.WriteLine(ErrorInTestFixtureSetup, e); - throw; - } - } - - [OneTimeTearDown] - public void TestFixtureTearDown() - { - } - } -} +using System; +using System.Diagnostics; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel; +using Xtensive.Orm.Tests.Storage.VersionBehavior.Model; +using Xtensive.Orm.Upgrade; +using Node1 = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Source.Node1; +using Node2 = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Source.Node2; +using Target = Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel.Target; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0614_MaterializationContextBugModel +{ + namespace Source.Node1 + { + public abstract class BusinessEntityBase : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + public BusinessEntityBase(Session session) + : base(session) + { } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + [Index("Code", Unique = true)] + public class TimesheetCode : BusinessEntityBase + { + public const string Other = "Other"; + public const string Meal = "Meal"; + public const string Training = "Training"; + + [Field(Length = 25)] + public string EventName { get; set; } + + [Field(Length = 8, Nullable = false)] + public string Code { get; set; } + + [Field(Length = 100)] + public string Description { get; set; } + + [Field] + public bool IsPaid { get; set; } + + public string GetDisplayName() + { + return string.IsNullOrEmpty(EventName) ? Code : EventName; + } + + public TimesheetCode(Session session) + : base(session) + { } + } + + public class CustomUpgradeHandler : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnPrepare() + { + UpgradeContext.UserDefinedTypeMap.Add(typeof(TimesheetCode).FullName, 288); + } + } + } + + namespace Source.Node2 + { + public abstract class BusinessEntityBase : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + public BusinessEntityBase(Session session) + : base(session) + { } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + [Index("Code", Unique = true)] + public class TimesheetCode : BusinessEntityBase + { + public const string Other = "Other"; + public const string Meal = "Meal"; + public const string Training = "Training"; + + [Field(Length = 25)] + public string EventName { get; set; } + + [Field(Length = 8, Nullable = false)] + public string Code { get; set; } + + [Field(Length = 100)] + public string Description { get; set; } + + [Field] + public bool IsPaid { get; set; } + + public string GetDisplayName() + { + return string.IsNullOrEmpty(EventName) ? Code : EventName; + } + + public TimesheetCode(Session session) + : base(session) + { } + } + + public class CustomUpgradeHandler : UpgradeHandler + { + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + public override void OnPrepare() + { + UpgradeContext.UserDefinedTypeMap.Add(typeof(TimesheetCode).FullName, 284); + } + } + } + + namespace Target + { + public abstract class BusinessEntityBase : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + public BusinessEntityBase(Session session) + : base(session) + { } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + [Index("Code", Unique = true)] + public class TimesheetCode : BusinessEntityBase + { + public const string Other = "Other"; + public const string Meal = "Meal"; + public const string Training = "Training"; + + [Field(Length = 25)] + public string EventName { get; set; } + + [Field(Length = 8, Nullable = false)] + public string Code { get; set; } + + [Field(Length = 100)] + public string Description { get; set; } + + [Field] + public bool IsPaid { get; set; } + + public string GetDisplayName() + { + return string.IsNullOrEmpty(EventName) ? Code : EventName; + } + + public TimesheetCode(Session session) + : base(session) + { } + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0614_MaterializationContextModel + { + private const string Node2Name = "Node2"; + private const string Node1Name = "Node1"; + private const string ErrorInTestFixtureSetup = "Error in Text fixture setup {0}"; + + [Test] + public void Test01() + { + var configuration1 = CreateConfiguration(typeof (Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); + var configuration2 = CreateConfiguration(typeof (Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); + + using (var domain = BuildDomain(configuration1)) { + Assert.That(domain.Model.Types[typeof (Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < 10; i++) { + new Node1.TimesheetCode(session) { + Active = i % 2==0, + Code = "jdfgdj" + i, + Description = "dfjghjdhfgjhsjkhgjdfg", + EventName = "Event" + i, + IsPaid = true + }; + } + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + using (var domain = BuildDomain(configuration2)) { + Assert.That(domain.Model.Types[typeof(Node2.TimesheetCode)].TypeId, Is.EqualTo(284)); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < 10; i++) { + new Node2.TimesheetCode(session) { + Active = i % 2 == 0, + Code = "jdfgdj" + i, + Description = "dfjghjdhfgjhsjkhgjdfg", + EventName = "Event" + i, + IsPaid = true + }; + } + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + var multinodeDomainConfiguration = CreateConfiguration(typeof (Target.TimesheetCode), DomainUpgradeMode.Skip, "Model1"); + var nodeConfiguration = CreateNodeConfiguration(Node2Name, "Model1", "Model2", DomainUpgradeMode.Skip); + using (var domain = BuildDomain(multinodeDomainConfiguration)) { + domain.StorageNodeManager.AddNode(nodeConfiguration); + using (var session = domain.OpenSession()) { + session.SelectStorageNode(WellKnown.DefaultNodeId); + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + using (var session = domain.OpenSession()) { + session.SelectStorageNode(Node2Name); + using (var transaction = session.OpenTransaction()) { + + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + } + } + } + } + + [Test] + public void Test02() + { + var configuration1 = CreateConfiguration(typeof(Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); + var configuration2 = CreateConfiguration(typeof(Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); + + using (var domain = BuildDomain(configuration1)) { + Assert.That(domain.Model.Types[typeof(Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < 10; i++) { + new Node1.TimesheetCode(session) { + Active = i % 2 == 0, + Code = "jdfgdj" + i, + Description = "dfjghjdhfgjhsjkhgjdfg", + EventName = "Event" + i, + IsPaid = true + }; + } + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new + { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + using (var domain = BuildDomain(configuration2)) { + Assert.That(domain.Model.Types[typeof(Node2.TimesheetCode)].TypeId, Is.EqualTo(284)); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < 10; i++) { + new Node2.TimesheetCode(session) { + Active = i % 2 == 0, + Code = "jdfgdj" + i, + Description = "dfjghjdhfgjhsjkhgjdfg", + EventName = "Event" + i, + IsPaid = true + }; + } + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new + { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + var multinodeDomainConfiguration = CreateConfiguration(typeof(Target.TimesheetCode), DomainUpgradeMode.PerformSafely, "Model2"); + var nodeConfiguration = CreateNodeConfiguration(Node1Name, "Model2", "Model1", DomainUpgradeMode.PerformSafely); + using (var domain = BuildDomain(multinodeDomainConfiguration, nodeConfiguration)) { + using (var session = domain.OpenSession()) { + session.SelectStorageNode(WellKnown.DefaultNodeId); + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new + { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new + { + Value = c.Code, + Name = c.Code + }).ToList(); + Assert.That(list.Count, Is.EqualTo(5)); + } + } + + using (var session = domain.OpenSession()) { + session.SelectStorageNode(Node1Name); + using (var transaction = session.OpenTransaction()) { + + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new + { + Value = c.Code, + Name = c.Code + }).ToList(); + } + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); + } + } + } + } + + private void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.Multischema); + Require.ProviderIs(StorageProvider.SqlServer); + } + + private Domain BuildDomain(DomainConfiguration configuration, NodeConfiguration nodeConfiguration = null) + { + try{ + var domain = Domain.Build(configuration); + if (nodeConfiguration!=null) + domain.StorageNodeManager.AddNode(nodeConfiguration); + return domain; + } + catch (Exception e) { + TestLog.Error(GetType().GetFullName()); + TestLog.Error(e); + throw; + } + } + + private DomainConfiguration CreateConfiguration(Type type, DomainUpgradeMode upgradeMode, string defaultSchema) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(type.Assembly, type.Namespace); + configuration.DefaultSchema = defaultSchema; + return configuration; + } + + private NodeConfiguration CreateNodeConfiguration(string nodeId, string oldSchema, string newSchema, DomainUpgradeMode upgradeMode) + { + var configuration = new NodeConfiguration(nodeId); + configuration.SchemaMapping.Add(oldSchema, newSchema); + configuration.UpgradeMode = upgradeMode; + return configuration; + } + + [OneTimeSetUp] + public void TestFixtureSetUp() + { + try { + CheckRequirements(); + } + catch (IgnoreException) { + throw; + } + catch (Exception e) { + Debug.WriteLine(ErrorInTestFixtureSetup, e); + throw; + } + } + + [OneTimeTearDown] + public void TestFixtureTearDown() + { + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0616_ExistanceProviderProcessingBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0616_ExistanceProviderProcessingBug.cs index d4c5c419d4..22d6e25d44 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0616_ExistanceProviderProcessingBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0616_ExistanceProviderProcessingBug.cs @@ -1,115 +1,115 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.12.04 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0616_ExistanceProviderProcessingBugModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0616_ExistanceProviderProcessingBug : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow(() => session.Query.All().Select(p => new { - V2 = p.Product.MeasureType, - Value = p.Details.Any() - ? p.Details.Sum(d => d.Quantity.NormalizedValue) - : p.Requirement.Quantity.NormalizedValue - }) - .GroupBy(groupByParam => groupByParam.V2).Select(aggregationSource => new { - V0 = aggregationSource.Key, - V1 = aggregationSource.Count() - }).Run()); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(InventoryAction).Assembly, typeof(InventoryAction).Namespace); - return configuration; - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0616_ExistanceProviderProcessingBugModel -{ - [HierarchyRoot] - public class InventoryAction : MesObject - { - [Field] - public Product Product { get; set; } - - [Field] - public LogisticFlow LogisticFlow { get; set; } - } - - [HierarchyRoot] - public class LogisticFlow : MesObject - { - } - - [HierarchyRoot] - public class PickingPoolMember : MesObject - { - [Field] - public Product Product { get; private set; } - - [Field] - public PickingProductRequirement Requirement { get; private set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Details { get; private set; } - } - - [HierarchyRoot] - public class Product : MesObject - { - [Field] - public string MeasureType { get; set; } - } - - [HierarchyRoot] - public class PickingProductRequirement : MesObject - { - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Deny)] - public Product Product { get; private set; } - - [Field] - public DimensionalField Quantity { get; private set; } - - [Field] - public InventoryAction InventoryAction { get; set; } - } - - public class DimensionalField : Structure - { - [Field] - public decimal NormalizedValue { get; private set; } - } - - [HierarchyRoot] - public class PickingPoolMemberDetail : MesObject - { - [Field] - public DimensionalField Quantity { get; set; } - } - - public abstract class MesObject : Entity - { - [Field, Key] - public int ID { get; set; } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.12.04 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0616_ExistanceProviderProcessingBugModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0616_ExistanceProviderProcessingBug : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow(() => session.Query.All().Select(p => new { + V2 = p.Product.MeasureType, + Value = p.Details.Any() + ? p.Details.Sum(d => d.Quantity.NormalizedValue) + : p.Requirement.Quantity.NormalizedValue + }) + .GroupBy(groupByParam => groupByParam.V2).Select(aggregationSource => new { + V0 = aggregationSource.Key, + V1 = aggregationSource.Count() + }).Run()); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(InventoryAction).Assembly, typeof(InventoryAction).Namespace); + return configuration; + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0616_ExistanceProviderProcessingBugModel +{ + [HierarchyRoot] + public class InventoryAction : MesObject + { + [Field] + public Product Product { get; set; } + + [Field] + public LogisticFlow LogisticFlow { get; set; } + } + + [HierarchyRoot] + public class LogisticFlow : MesObject + { + } + + [HierarchyRoot] + public class PickingPoolMember : MesObject + { + [Field] + public Product Product { get; private set; } + + [Field] + public PickingProductRequirement Requirement { get; private set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Details { get; private set; } + } + + [HierarchyRoot] + public class Product : MesObject + { + [Field] + public string MeasureType { get; set; } + } + + [HierarchyRoot] + public class PickingProductRequirement : MesObject + { + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Deny)] + public Product Product { get; private set; } + + [Field] + public DimensionalField Quantity { get; private set; } + + [Field] + public InventoryAction InventoryAction { get; set; } + } + + public class DimensionalField : Structure + { + [Field] + public decimal NormalizedValue { get; private set; } + } + + [HierarchyRoot] + public class PickingPoolMemberDetail : MesObject + { + [Field] + public DimensionalField Quantity { get; set; } + } + + public abstract class MesObject : Entity + { + [Field, Key] + public int ID { get; set; } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0617_IncorrectRemoveOfRedundantColumns.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0617_IncorrectRemoveOfRedundantColumns.cs index 65808d3a3f..01c2df046e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0617_IncorrectRemoveOfRedundantColumns.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0617_IncorrectRemoveOfRedundantColumns.cs @@ -1,1706 +1,1706 @@ -// Copyright (C) 2015-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexey Kulakov -// Created: 2015.12.01 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Orm.Tests.Issues.IssueJira0617_IncorrectRedundantColumnRemoveModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0617_IncorrectRedundantColumnRemove : AutoBuildTest - { - [Test] - public void Test01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting() { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test] - public void Test02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test] - public void Test03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test] - public void Test04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, - SlaveFinToolBase = posting.FinCredit - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - SlaveFinToolBase = posting.FinDebit - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); - } - } - - [Test] - public void Test05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; - - var masterDebit = from posting in - Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.DebitAccount, - MasterFinToolBase = posting.FinDebit, - SlaveAccount = posting.CreditAccount, - SlaveFinToolBase = posting.FinCredit, - Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum - }; - - var masterCredit = from posting in Query.All() - select - new { - Id = posting.Id, - Status = posting.Status, - BalanceHolder = posting.BalanceHolder, - CreationDate = posting.CreationDate, - Currency = posting.Currency, - ExecutionDate = posting.ExecutionDate, - Operation = posting.Operation, - OperationType = posting.Operation.OperationType, - MasterAccount = posting.CreditAccount, - MasterFinToolBase = posting.FinCredit, - SlaveAccount = posting.DebitAccount, - SlaveFinToolBase = posting.FinDebit, - Sum = - posting.CreditAccount.AccountType==PacioliAccountType.Active - || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - }; - - var usefulColumns = masterCredit.Union(masterDebit); - var readyForFilterQuery = from joinResult in usefulColumns - .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) - .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) - let item = joinResult.pp - select new CustomPosting { - Id = item.Id, - Status = item.Status, - BalanceHolder = item.BalanceHolder, - CreationDate = item.CreationDate, - Currency = item.Currency, - ExecutionDate = item.ExecutionDate, - Operation = item.Operation, - OperationType = item.Operation.OperationType, - Sum = item.Sum, - MasterAccount = item.MasterAccount, - MasterFinToolBase = item.MasterFinToolBase, - SlaveAccount = item.SlaveAccount, - SlaveFinToolBase = item.SlaveFinToolBase, - MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, - SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, - }; - - var id = session.Query.All().First().Id; - - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id==id).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code=="123").LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] {id})).ToArray()); - Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] {id})).LongCount()); - } - } - - [Test] - public void Test06() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var transactions = Session.Current.Query.All(); - - var balanceFinTools = transactions.Select( - z => new { - z.FinTool, - Sum = z.Method==TransactionMethod.Debit ? z.Qty : -z.Qty, - SumPrice = z.Method==TransactionMethod.Debit ? z.Price : -z.Price - }).GroupBy(r => r.FinTool) - .Select(f => new {FinTool = f.Key, Summ = f.Sum(s => s.Sum), SummPrice = f.Sum(s => s.SumPrice)}) - .Where(a => a.Summ!=0); - var resultQuery = balanceFinTools.Select(a => a.FinTool.Id).Distinct(); - - var objects = resultQuery.ToArray(); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Length, Is.Not.EqualTo(0)); - } - } - - [Test] - public void Test07() - { - Require.ProviderIs(StorageProvider.SqlServer); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var allPostings = Query.All(); - var masterDebit = - allPostings.Select( - posting => - new { - Id = GuidModifier.ReplaceOne(posting.Id, "1"), - Posting = posting, - Sum = posting.DebitAccount.AccountType==PacioliAccountType.Passive ? -posting.Sum : posting.Sum, - MasterFinToolBase = posting.DebitFinTool - }); - - var masterCredit = - allPostings.Select( - posting => - new { - Id = GuidModifier.ReplaceOne(posting.Id, "9"), - Posting = posting, - Sum = posting.CreditAccount.AccountType==PacioliAccountType.Active || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive - ? -posting.Sum - : posting.Sum, - MasterFinToolBase = posting.CreditFinTool - }); - - var concatination = masterCredit.Concat(masterDebit); - var usefulColumnsSelection = from raw in concatination - select new { - Id = raw.Id, - Posting = raw.Posting, - Sum = raw.Sum, - MasterFinToolBase = raw.MasterFinToolBase, - }; - - var finalQuery = from raw in usefulColumnsSelection.Select( - selectionItem => new { - MasterFinToolBase = selectionItem.MasterFinToolBase, - Sum = selectionItem.Sum, - Id = selectionItem.Posting.Id - }) - where raw.MasterFinToolBase!=null - group raw by new { - MasterFinToolBase = raw.MasterFinToolBase - } - into grouping - select new { - MasterFinToolBase = grouping.Key.MasterFinToolBase, - Sum = grouping.Sum(s => s.Sum), - Id = grouping.Select(x => x.Id).First() - }; - - object[] objects = null; - Assert.DoesNotThrow(() => { objects = finalQuery.ToArray(); }); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Length, Is.Not.EqualTo(0)); - } - } - - [Test] - public void Test08() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var tp = from q in Query.All() - select - new { - q.Account, - OnlyCurrentType = !q.OnlyCurrentType, - FinToolKind = q.OnlyCurrentType ? Guid.Empty : q.Owner.Id - }; - - var masterDebit = from q in Query.All() - select - new { - Id = q.Id, - Posting = q, - DebitCredit = DebitCredit.Debit, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.DebitAccount, - MasterFinToolBase = q.DebitFinTool, - }; - - var masterCredit = from q in Query.All() - select - new { - Id = q.Id, - Posting = q, - DebitCredit = DebitCredit.Credit, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.CreditAccount, - MasterFinToolBase = q.CreditFinTool, - }; - - var preResult = masterCredit.Concat(masterDebit); - - var result = - from r in - preResult.Join(tp.Distinct(), a => a.MasterAccount, a => a.Account, (a, pm) => new {pp = a, pm}) - .LeftJoin(Query.All(), a => a.pm.FinToolKind, a => a.Id, (a, b) => new {pp = a.pp, pm = a.pm, fk = b}) - let q = r.pp - select - new { - Id = q.Id, - Posting = q.Posting, - Status = q.Status, - BalanceHolder = q.BalanceHolder, - CreationDate = q.CreationDate, - Currency = q.Currency, - Deal = q.Deal, - ExecutionDate = q.ExecutionDate, - Sum = q.Sum, - MasterAccount = q.MasterAccount, - MasterFinToolBase = q.MasterFinToolBase, - MasterFinToolKind = r.pm.OnlyCurrentType ? r.fk : q.MasterFinToolBase.FinToolKind, - AccountType = q.MasterAccount.AccountType - }; - - var xx = - from a in - result - .Select( - a => - new { - MasterFinToolBase = a.MasterFinToolBase, - MasterFinToolKind = a.MasterFinToolKind, - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - ExecutionDate = a.ExecutionDate, - Deal = a.Deal, - MasterAccount = a.MasterAccount, - Sum = a.Sum, - Posting = a.Posting - }) - where a.MasterFinToolBase!=null && a.MasterFinToolKind!=null - group a by - new { - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - Deal = a.Deal, - ExecutionDate = a.ExecutionDate, - MasterAccount = a.MasterAccount, - MasterFinToolBase = a.MasterFinToolBase - } - into gr - select - new { - ExecutionDate = gr.Key.ExecutionDate, - BalanceHolder = gr.Key.BalanceHolder, - MasterFinToolBase = gr.Key.MasterFinToolBase, - Currency = gr.Key.Currency, - CreationDate = gr.Key.CreationDate, - Deal = gr.Key.Deal, - MasterAccount = gr.Key.MasterAccount, - Sum = gr.Sum(s => s.Sum), - Id = gr.Select(a => a.Posting).First().Id - }; - List objects = null; - Assert.DoesNotThrow(() => objects = result.ToList()); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Count, Is.Not.EqualTo(0)); - } - } - - [Test] - public void Test09() - { - Require.ProviderIs(StorageProvider.SqlServer); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var pacioliPostings = Query.All().Select(el => el.Id).ToList(); - Assert.That(pacioliPostings.Count, Is.EqualTo(10)); - var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); - - var query = session.Query.All() - .Select(a => new { - Id = GuidModifier.ReplaceOne(a.Id, "9"), - Posting = a, - Sum = a.CreditAccount.AccountType==PacioliAccountType.Passive || a.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -a.Sum : a.Sum, - MasterAccount = a.CreditAccount, - MasterFinToolBase = a.CreditFinTool, - SlaveAccount = a.DebitAccount, - SlaveFinToolBase = a.DebitFinTool - }) - .Concat(session.Query.All().Select(b => new { - Id = GuidModifier.ReplaceOne(b.Id, "1"), - Posting = b, - Sum = b.DebitAccount.AccountType==PacioliAccountType.Active ? -b.Sum : b.Sum, - MasterAccount = b.DebitAccount, - MasterFinToolBase = b.DebitFinTool, - SlaveAccount = b.CreditAccount, - SlaveFinToolBase = b.CreditFinTool - })) - .Select(r => new {r = r, q = r}) - .Select(el => new CustomPosting() { - Id = el.q.Id, - Posting = el.q.Posting, - Status = el.q.Posting.Status, - BalanceHolder = el.q.Posting.BalanceHolder, - CreationDate = el.q.Posting.CreationDate, - Currency = el.q.Posting.Currency, - Deal = el.q.Posting.Deal, - ExecutionDate = el.q.Posting.ExecutionDate, - OperationType = el.q.Posting.Operation.OperationType, - Sum = el.q.Sum, - MasterAccount = el.q.MasterAccount, - MasterFinToolBase = el.q.MasterFinToolBase, - SlaveAccount = el.q.SlaveAccount, - SlaveFinToolBase = el.q.SlaveFinToolBase, - MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind - }) - .Where(a => (a.MasterFinToolBase.Id.In(finTools))) - .Select(a => - new { - MasterFinToolBase = a.MasterFinToolBase, - MasterFinToolKind = a.MasterFinToolKind, - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - ExecutionDate = a.ExecutionDate, - Deal = a.Deal, - MasterAccount = a.MasterAccount, - Sum = a.Sum, - Id = a.Posting.Id - }) - .Where(a => ((a.MasterFinToolBase!=null) && (a.MasterFinToolKind!=null))) - .GroupBy(a => new { - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - Deal = a.Deal, - ExecutionDate = a.ExecutionDate, - MasterAccount = a.MasterAccount, - MasterFinToolBase = a.MasterFinToolBase - }); - var query1 = query.Select(gr => - new CustomPostingGroup() { - ExecutionDate = gr.Key.ExecutionDate, - BalanceHolder = gr.Key.BalanceHolder, - MasterFinToolBase = gr.Key.MasterFinToolBase, - Currency = gr.Key.Currency, - CreationDate = gr.Key.CreationDate, - Deal = gr.Key.Deal, - MasterAccount = gr.Key.MasterAccount, - Sum = gr.Sum(s => s.Sum), - Id = gr.First().Id - }) - .Where(a => true) - .OrderBy(a => a.CreationDate) - .Select(c => new {Item = c, FakeKey = 0}) - .GroupBy(i => i.FakeKey); - - object[] objects = null; - objects = query1.ToArray(); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Length, Is.Not.EqualTo(0)); - - object @object = null; - dynamic q = query1.Select("new (Sum(Item.Sum) as Sum, Count() as Count)"); - Assert.DoesNotThrow(() => @object = Queryable.FirstOrDefault(q)); - Assert.That(@object, Is.Not.Null); - } - } - - [Test] - public void Test10() - { - Require.ProviderIs(StorageProvider.SqlServer); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var pacioliPostings = Query.All().Select(el => el.Id).ToList(); - var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); - - var query = session.Query.All() - .Select(a => new { - Id = GuidModifier.ReplaceOne(a.Id, "9"), - Posting = a, - Sum = a.CreditAccount.AccountType==PacioliAccountType.Passive || a.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -a.Sum : a.Sum, - MasterAccount = a.CreditAccount, - MasterFinToolBase = a.CreditFinTool, - SlaveAccount = a.DebitAccount, - SlaveFinToolBase = a.DebitFinTool - }) - .Concat(session.Query.All().Select(b => new { - Id = GuidModifier.ReplaceOne(b.Id, "1"), - Posting = b, - Sum = b.DebitAccount.AccountType==PacioliAccountType.Active ? -b.Sum : b.Sum, - MasterAccount = b.DebitAccount, - MasterFinToolBase = b.DebitFinTool, - SlaveAccount = b.CreditAccount, - SlaveFinToolBase = b.CreditFinTool - })) - .Select(r => new {r = r, q = r}) - .Select(el => new CustomPosting { - Id = el.q.Id, - Posting = el.q.Posting, - Status = el.q.Posting.Status, - BalanceHolder = el.q.Posting.BalanceHolder, - CreationDate = el.q.Posting.CreationDate, - Currency = el.q.Posting.Currency, - Deal = el.q.Posting.Deal, - ExecutionDate = el.q.Posting.ExecutionDate, - OperationType = el.q.Posting.Operation.OperationType, - Sum = el.q.Sum, - MasterAccount = el.q.MasterAccount, - MasterFinToolBase = el.q.MasterFinToolBase, - SlaveAccount = el.q.SlaveAccount, - SlaveFinToolBase = el.q.SlaveFinToolBase, - MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind - }) - .Where(a => (a.MasterFinToolBase.Id.In(finTools))) - .Select(a => - new { - MasterFinToolBase = a.MasterFinToolBase, - MasterFinToolKind = a.MasterFinToolKind, - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - ExecutionDate = a.ExecutionDate, - Deal = a.Deal, - MasterAccount = a.MasterAccount, - Sum = a.Sum, - Id = a.Posting.Id - }) - .Where(a => ((a.MasterFinToolBase!=null) && (a.MasterFinToolKind!=null))) - .GroupBy(a => new { - Currency = a.Currency, - BalanceHolder = a.BalanceHolder, - CreationDate = a.CreationDate, - Deal = a.Deal, - ExecutionDate = a.ExecutionDate, - MasterAccount = a.MasterAccount, - MasterFinToolBase = a.MasterFinToolBase - }) - .Select(gr => - new CustomPostingGroup() { - ExecutionDate = gr.Key.ExecutionDate, - BalanceHolder = gr.Key.BalanceHolder, - MasterFinToolBase = gr.Key.MasterFinToolBase, - Currency = gr.Key.Currency, - CreationDate = gr.Key.CreationDate, - Deal = gr.Key.Deal, - MasterAccount = gr.Key.MasterAccount, - Sum = gr.Sum(s => s.Sum), - Id = gr.First().Id - }) - .Where(a => true) - .OrderBy(a => a.CreationDate) - .Take(10); - - var simpleSelection = query.Select(el => new { - el.Id, - el.CreationDate, - el.ExecutionDate, - BalanceHolder = el.BalanceHolder, - MasterAccount = el.MasterAccount.Name, - MasterFinToolBase = el.MasterFinToolBase.Name, - Currency = el.Currency.Name, - Sum = el.Sum - }); - object[] elements = null; - Assert.DoesNotThrow(() => elements = simpleSelection.ToArray()); - Assert.That(elements, Is.Not.Null); - Assert.That(elements.Length, Is.Not.EqualTo(0)); - - dynamic selection = query.Select("new (" + - "Id, " + - " CreationDate," + - " ExecutionDate," + - " BalanceHolder.Name as BalanceHolder," + - " MasterAccount.Name as MasterAccount," + - " MasterFinToolBase.Name as MasterFinToolBase," + - " Currency.Name as Currency," + - " Sum)"); - - object[] objects = null; - Assert.DoesNotThrow(() => objects = Enumerable.ToArray((IEnumerable)selection)); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Length, Is.Not.EqualTo(0)); - } - } - - [Test] - public void Test11() - { - Require.ProviderIs(StorageProvider.SqlServer); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var pacioliPostings = Query.All().Select(el => el.Id).ToList(); - var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); - - var query = session.Query.All() - .Select(el => new { - Id = GuidModifier.ReplaceOne(el.Id, "9"), - Posting = el, - Sum = el.CreditAccount.AccountType==PacioliAccountType.Passive || el.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -el.Sum : el.Sum, - MasterAccount = el.CreditAccount, - MasterFinToolBase = el.CreditFinTool, - SlaveAccount = el.DebitAccount, - SlaveFinToolBase = el.DebitFinTool - }) - .Union( - session.Query.All() - .Select(el => new { - Id = GuidModifier.ReplaceOne(el.Id, "1"), - Posting = el, - Sum = el.DebitAccount.AccountType==PacioliAccountType.Active ? -el.Sum : el.Sum, - MasterAccount = el.DebitAccount, - MasterFinToolBase = el.DebitFinTool, - SlaveAccount = el.CreditAccount, - SlaveFinToolBase = el.CreditFinTool - }) - ) - .Select(r => new {r = r, q = r}) - .Select(el => new CustomPosting { - Id = el.q.Id, - Posting = el.q.Posting, - Status = el.q.Posting.Status, - BalanceHolder = el.q.Posting.BalanceHolder, - CreationDate = el.q.Posting.CreationDate, - Currency = el.q.Posting.Currency, - Deal = el.q.Posting.Deal, - ExecutionDate = el.q.Posting.ExecutionDate, - OperationType = el.q.Posting.Operation.OperationType, - Sum = el.q.Sum, - MasterAccount = el.q.MasterAccount, - MasterFinToolBase = el.q.MasterFinToolBase, - SlaveAccount = el.q.SlaveAccount, - SlaveFinToolBase = el.q.SlaveFinToolBase, - MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind - }) - .Where(a => (a.MasterFinToolBase.Id.In(finTools))) - .Where(a => true) - .OrderBy(el => el.CreationDate) - .Take(10); - - var simpleSelection = query.Select(el => new { - el.Id, - el.Posting.Name, - el.CreationDate, - el.ExecutionDate, - BalanceHolder = el.BalanceHolder.Name, - OperationType = el.OperationType.Name, - el.Sum, - Currency = el.Currency.Name, - Status = el.Status.Name, - MasterAccount = el.MasterAccount.Name, - SlaveAccount = el.SlaveAccount.Name, - MasterFinToolBase = el.MasterFinToolBase.Name, - SlaveFinToolBase = el.SlaveFinToolBase.Name, - MasterFinToolKind = el.MasterFinToolKind - }).ToArray(); - Assert.That(simpleSelection, Is.Not.Null); - Assert.That(simpleSelection.Length, Is.Not.EqualTo(0)); - - dynamic selection = query.Select("new (Id," + - " Posting.Name as Posting," + - " CreationDate, ExecutionDate," + - " ExecutionDate," + - " BalanceHolder.Name as BalanceHolder," + - " OperationType.Name as OperationType," + - " Sum," + - " Currency.Name as Currency," + - " Status.Name as Status," + - " MasterAccount.Name as MasterAccount," + - " SlaveAccount.Name as SlaveAccount," + - " MasterFinToolBase.Name as MasterFinToolBase," + - " SlaveFinToolBase.Name as SlaveFinToolBase," + - " MasterFinToolKind.Name as MasterFinToolKind)"); - - object[] objects = null; - Assert.DoesNotThrow(() => objects = Enumerable.ToArray((IEnumerable)selection)); - Assert.That(objects, Is.Not.Null); - Assert.That(objects.Length, Is.Not.EqualTo(0)); - } - } - - [Test] - public void Test12() - { - Require.ProviderIs(StorageProvider.SqlServer); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var pacioliPostings = Query.All().Select(el => el.Id).ToList(); - var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); - - var query = session.Query.All() - .Select(q => new { - Id = GuidModifier.ReplaceOne(q.Id, "9"), - Posting = q, - Sum = q.CreditAccount.AccountType==PacioliAccountType.Passive || q.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -q.Sum : q.Sum, - MasterAccount = q.CreditAccount, - MasterFinToolBase = q.CreditFinTool, - SlaveAccount = q.DebitAccount, - SlaveFinToolBase = q.DebitFinTool - }) - .Concat( - session.Query.All() - .Select(q => new { - Id = GuidModifier.ReplaceOne(q.Id, "1"), - Posting = q, - Sum = q.DebitAccount.AccountType==PacioliAccountType.Active ? -q.Sum : q.Sum, - MasterAccount = q.DebitAccount, - MasterFinToolBase = q.DebitFinTool, - SlaveAccount = q.CreditAccount, - SlaveFinToolBase = q.CreditFinTool - })) - .Select(r => new {r = r, q = r}) - .Select(a => new CustomPosting { - Id = a.q.Id, - Posting = a.q.Posting, - Status = a.q.Posting.Status, - BalanceHolder = a.q.Posting.BalanceHolder, - CreationDate = a.q.Posting.CreationDate, - Currency = a.q.Posting.Currency, - Deal = a.q.Posting.Deal, - ExecutionDate = a.q.Posting.ExecutionDate, - OperationType = a.q.Posting.Operation.OperationType, - Sum = a.q.Sum, - MasterAccount = a.q.MasterAccount, - MasterFinToolBase = a.q.MasterFinToolBase, - SlaveAccount = a.q.SlaveAccount, - SlaveFinToolBase = a.q.SlaveFinToolBase, - MasterFinToolKind = a.q.MasterFinToolBase.FinToolKind - }) - .Where(a => (a.MasterFinToolBase.Id.In(finTools))) - .Where(a => true) - .OrderBy(a => a.CreationDate) - .Select(q => new {Item = q, FakeKey = 0}) - .GroupBy(i => i.FakeKey); - - dynamic selection = query.Select("new (Sum(Item.Sum) as Sum, Count() as sysTotal_Item_Count)"); - object @object = null; - Assert.DoesNotThrow(() => @object = Queryable.FirstOrDefault(selection)); - Assert.That(@object, Is.Not.Null); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(PacioliAccount).Assembly, typeof(PacioliAccount).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - base.PopulateData(); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var randomNumbersProvider = new Random(); - var statuses = new List(10); - for (var i = 0; i < 10; i++) { - statuses.Add(new Status(Guid.NewGuid()) {Description = "Status", Name = "Status" + i}); - } - - var modules = new List(); - for (var i = 0; i < 10; i++) { - modules.Add(new Module(Guid.NewGuid()) {Name = "Module" + i, SysName = "Module" + i, FileVersion = i + "." + (40 - i) + "." + i}); - } - - var currencies = new List(10); - for (int i = 0; i < 10; i++) { - currencies.Add(new Currency(Guid.NewGuid()) {Name = "Currency" + i, Status = statuses[randomNumbersProvider.Next(0, 10)]}); - } - - var regEntities = new List(10); - for (var i = 0; i < 10; i++) { - regEntities.Add(new RegEntity(Guid.NewGuid()) {Name = "RegEntity" + i, Module = modules[randomNumbersProvider.Next(0, 10)]}); - } - - var finToolKinds = new List(10); - for (var i = 0; i < 10; i++) { - finToolKinds.Add(new TablePartBase.FinToolKind(Guid.NewGuid()) { - Entity = regEntities[randomNumbersProvider.Next(0, 10)], - Name = "FinToolKind" + i, - FullName = "FinToolKind" + i - }); - } - - var pacioliAccounts = new List(10); - for (var i = 0; i < 10; i++) { - pacioliAccounts.Add(new PacioliAccount(Guid.NewGuid()) { - AccountType = (PacioliAccountType)randomNumbersProvider.Next(0, 3), - Name = "PacioliAccount" + i, - Code = (i * i).ToString(), - FastAccess = "dfghdfjghkjdfg" + i, - }); - } - - var tablePriceCalcs = new List(); - for (var i = 0; i < 10; i++) { - tablePriceCalcs.Add(new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), finToolKinds[randomNumbersProvider.Next(0, 10)]) { - Account = pacioliAccounts[randomNumbersProvider.Next(0, 10)] - }); - } - - var operationTypes = new List(10); - for (var i = 0; i < 10; i++) { - operationTypes.Add(new OperationType(Guid.NewGuid()) { - Name = "OperationType", - Account = pacioliAccounts[randomNumbersProvider.Next(0, 10)] - }); - } - - var regTransactions = new List(10); - for (var i = 0; i < 10; i++) { - regTransactions.Add(new RegTransaction(Guid.NewGuid()) { - Portfolio = null, - FinTool = finToolKinds[randomNumbersProvider.Next(0, 10)], - Method = TransactionMethod.Debit, - Price = (decimal)i / 10, - Qty = (decimal)i * 10, - }); - } - - var portfolios = new List(20); - for (var i = 0; i < 10; i++) { - portfolios.Add(new AggregatePortfolio(Guid.NewGuid()) { - Name = "AggregatePortfolio" + i, - FullName = "AggregatePortfolio" + i, - Identifier = "AggregatePortfolio" + i, - }); - } - for (var i = 0; i < 10; i++) { - portfolios.Add(new RealPortfolio(Guid.NewGuid()) { - Name = "RealPortfolio" + i, - FullName = "RealPortfolio" + i, - Identifier = "RealPortfolio" + i, - }); - } - - var operationBases = new List(20); - for (var i = 0; i < 10; i++) { - operationBases.Add(new TechOperation(Guid.NewGuid()) { - Portfolio = portfolios[randomNumbersProvider.Next(0, 20)], - }); - } - - for (var i = 0; i < 10; i++) { - operationBases.Add(new ActOfNavDetectedErrors(Guid.NewGuid()) { - Portfolio = portfolios[randomNumbersProvider.Next(0, 20)] - }); - } - - var finToolBases = new List(10); - for (var i = 0; i < 10; i++) { - finToolBases.Add(new OtherFinTools(Guid.NewGuid()) { - Name = "FinToolBase" + i, - DocumentIdentifier = "FinToolBase" + Guid.NewGuid(), - Cur = currencies[randomNumbersProvider.Next(0, 10)], - FinToolKind = finToolKinds[randomNumbersProvider.Next(0, 10)], - }); - } - - var pacioliPostings = new List(); - for (int i = 0; i < 10; i++) { - pacioliPostings.Add(new PacioliPosting(Guid.NewGuid()) { - Name = "PacioliPosting" + i, - Status = statuses[randomNumbersProvider.Next(0, 10)], - DebitAccount = pacioliAccounts[randomNumbersProvider.Next(0, 10)], - CreditAccount = pacioliAccounts[randomNumbersProvider.Next(0, 10)], - CreditFinTool = finToolBases[randomNumbersProvider.Next(0, 10)], - DebitFinTool = finToolBases[randomNumbersProvider.Next(0, 10)], - ExecutionDate = DateTime.Today, - Sum = 1, - Currency = currencies[randomNumbersProvider.Next(0, 10)], - BalanceHolder = portfolios[randomNumbersProvider.Next(0, 20)], - Operation = operationBases[randomNumbersProvider.Next(0, 20)], - }); - } - transaction.Complete(); - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0617_IncorrectRedundantColumnRemoveModel -{ - public enum ProviderKind - { - IncludeProvider, - TakeProvider - } - - public enum PacioliAccountType - { - Passive, - Active, - ActivePassive - } - - public enum DealType - { - RoundsPlannedDeal, - LeftOffPlannedDeal, - RealDeal, - } - - public enum DebitCredit - { - Debit, - Credit, - } - - [KeyGenerator(KeyGeneratorKind.None)] - public abstract class EntityBase : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - protected EntityBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class Module : EntityBase - { - [Field(Length = 40)] - public string LongRevision { get; set; } - - [Field(Length = 400, Nullable = false)] - public string Name { get; set; } - - [Field] - public ulong Revision { get; set; } - - [Field(Length = 400, Nullable = false)] - public string SysName { get; set; } - - [Field(Length = 100, Nullable = false, NullableOnUpgrade = true)] - public string FileVersion { get; set; } - - public Module(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class RegEntity : EntityBase - { - [Field] - public string Description { get; set; } - - [Field] - public string FullName { get; set; } - - - [Field(Nullable = false)] - public Module Module { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public string SysName { get; set; } - - public bool IsAbstract - { - get { return Session.Domain.Model.Types[SysName].IsAbstract; } - } - - public RegEntity(Guid id) - : base(id) - { - } - } - - public abstract class TablePartBase : EntityBase - { - [Field] - public FinToolKind Owner { get; private set; } - - protected TablePartBase(Guid id, FinToolKind owner) - : base(id) - { - Owner = owner; - } - - [HierarchyRoot] - public sealed class FinToolKind : EntityBase - { - [Field(Nullable = false, Length = 100)] - public string Name { get; set; } - - [Field(Nullable = false, Length = 100)] - public string FullName { get; set; } - - [Field] - public FinToolKind Parent { get; set; } - - [Field] - public RegEntity Entity { get; set; } - - [Field] - public bool Quantitative { get; set; } - - [Field] - [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] - public EntitySet PriceCalc { get; private set; } - - public FinToolKind(Guid id) - : base(id) - { - } - - [HierarchyRoot] - public sealed class TpPriceCalc : TablePartBase - { - [Field(Nullable = false)] - public PacioliAccount Account { get; set; } - - [Field] - public bool OnlyCurrentType { get; set; } - - public TpPriceCalc(Guid id, FinToolKind owner) - : base(id, owner) - { - } - } - } - } - - [HierarchyRoot] - public abstract class FinToolBase : EntityBase - { - [Field(Length = 300, Nullable = false)] - public virtual string Name { get; set; } - - [Field(Length = 50, Nullable = false)] - public string DocumentIdentifier { get; set; } - - [Field] - public string ForeignId { get; set; } - - [Field(Nullable = false)] - public TablePartBase.FinToolKind FinToolKind { get; set; } - - [Field(Nullable = false)] - public virtual Currency Cur { get; set; } - - public FinToolBase(Guid id) - : base(id) - { - } - } - - public class OtherFinTools : FinToolBase - { - public OtherFinTools(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class Status : EntityBase - { - [Field] - public string Description { get; set; } - - [Field] - public string Name { get; set; } - - public Status(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class Currency : EntityBase - { - [Field(Length = 20)] - public string CurCode { get; set; } - - [Field(Length = 3)] - public string DigitCode { get; set; } - - [Field] - public int? MinorUnits { get; set; } - - [Field(Length = 400, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 400)] - public string Description { get; set; } - - [Field(Length = 20)] - public string Sign { get; set; } - - [Field(Length = 400)] - public string EngName { get; set; } - - [Field] - public Status Status { get; set; } - - public Currency(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public abstract class Subject : EntityBase - { - [Field(Length = 8)] - public int? Code { get; set; } - - [Field(Nullable = false, Length = 255)] - public string Name { get; set; } - - [Field(Nullable = false, Length = 400)] - public string FullName { get; set; } - - [Field(Nullable = false, Length = 20)] - public virtual string Identifier { get; set; } - - public Subject(Guid id) - : base(id) - { - } - } - - public abstract class Portfolio : Subject - { - [Field(Length = 400)] - public string LegalName { get; set; } - - [Field] - public DateTime? DateOnService { get; set; } - - [Field] - public DateTime? DateRemovalFromService { get; set; } - - [Field] - public DateTime? EisTransitionDate { get; set; } - - [Field] - public DateTime? ImportedToDate { get; set; } - - protected Portfolio(Guid id) - : base(id) - { - } - } - - [Serializable] - public sealed class AggregatePortfolio : Portfolio - { - public AggregatePortfolio(Guid id) - : base(id) - { - } - } - - public sealed class RealPortfolio : Portfolio - { - public RealPortfolio(Guid id) - : base(id) - { } - } - - public abstract class DocumentBase : EntityBase - { - [Field] - public Status Status { get; set; } - - public DocumentBase(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public abstract class OperationBase : DocumentBase - { - [Field(Length = 50)] - public string Number { get; set; } - - [Field] - public DateTime? InputDate { get; set; } - - [Field] - public DateTime? AuthorizationDate { get; set; } - - [Field] - public OperationType OperationType { get; set; } - - [Field] - public Portfolio Portfolio { get; set; } - - [Field(Length = 1024)] - public string Comment { get; set; } - - protected OperationBase(Guid id) - : base(id) - { - } - } - - public sealed class TechOperation : OperationBase - { - [Field] - public string ForeignId { get; set; } - - public TechOperation(Guid id) - : base(id) - { - } - } - - public sealed class ActOfNavDetectedErrors : OperationBase - { - public ActOfNavDetectedErrors(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class OperationType : EntityBase - { - [Field(Length = 255, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 255)] - public string Description { get; set; } - - [Field] - public PacioliAccount Account { get; set; } - - public OperationType(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class PacioliAccount : EntityBase - { - [Field] - public PacioliAccount Parent { get; set; } - - [Field(Length = 128, Nullable = false)] - public string Name { get; set; } - - [Field(Length = 4000)] - public string Description { get; set; } - - [Field(Length = 32, Nullable = false)] - public string Code { get; set; } - - [Field(Length = 32, Nullable = false)] - public string FastAccess { get; set; } - - [Field] - public PacioliAccountType AccountType { get; set; } - - public PacioliAccount(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public class PacioliPosting : DocumentBase - { - [Field] - public FinToolBase FinDebit { get; set; } - - [Field] - public FinToolBase FinCredit { get; set; } - - [Field(Nullable = false)] - public Portfolio BalanceHolder { get; set; } - - [Field] - public string Name { get; set; } - - [Field(Nullable = false)] - public OperationBase Operation { get; set; } - - [Field] - public string ForeignId { get; set; } - - [Field(Length = 12)] - public string ForeignIdHash { get; set; } - - [Field] - public PacioliAccount DebitAccount { get; set; } - - [Field] - public PacioliAccount CreditAccount { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public DateTime? ExecutionDate { get; set; } - - [Field] - public decimal Sum { get; set; } - - [Field] - public Currency Currency { get; set; } - - [Field(Indexed = false)] - public FinToolBase DebitFinTool { get; set; } - - [Field(Indexed = false)] - public FinToolBase CreditFinTool { get; set; } - - [Field] - public DealType Deal { get; set; } - - public PacioliPosting(Guid id) - : base(id) - { - } - } - - [HierarchyRoot] - public sealed class RegTransaction : EntityBase - { - [Field] - public DateTime? AuthorizeDate { get; set; } - - [Field] - public DateTime? OperDate { get; set; } - - [Field] - public Portfolio Portfolio { get; set; } - - [Field] - public TablePartBase.FinToolKind FinTool { get; set; } - - [Field] - public TransactionMethod Method { get; set; } - - [Field] - public decimal Qty { get; set; } - - [Field] - public decimal Price { get; set; } - - public RegTransaction(Guid id) - : base(id) - { - } - } - - public enum TransactionMethod - { - Debit - } - - public class CustomPosting - { - public Guid Id { get; set; } - - public DateTime CreationDate { get; set; } - - public DateTime? ExecutionDate { get; set; } - - public Portfolio BalanceHolder { get; set; } - - public OperationBase Operation { get; set; } - - public OperationType OperationType { get; set; } - - public decimal Sum { get; set; } - - public Currency Currency { get; set; } - - public Status Status { get; set; } - - public PacioliAccount MasterAccount { get; set; } - - public PacioliAccount SlaveAccount { get; set; } - - public FinToolBase MasterFinToolBase { get; set; } - - public FinToolBase SlaveFinToolBase { get; set; } - - public TablePartBase.FinToolKind MasterFinToolKind { get; set; } - - public TablePartBase.FinToolKind SlaveFinToolKind { get; set; } - - public PacioliPosting Posting { get; set; } - - public DealType Deal { get; set; } - } - - public class CustomPostingGroup - { - public Guid Id { get; set; } - - public DateTime CreationDate { get; set; } - - public DateTime? ExecutionDate { get; set; } - - public Portfolio BalanceHolder { get; set; } - - public DealType Deal { get; set; } - - public PacioliAccount MasterAccount { get; set; } - - public FinToolBase MasterFinToolBase { get; set; } - - public Currency Currency { get; set; } - - public Decimal Sum { get; set; } - } - - public static class GuidModifier - { - public static Guid ReplaceOne(Guid source, string replacement) - { - return Guid.Parse(source.ToString().Substring(0, 35) + replacement); - } - } - - [CompilerContainer(typeof(SqlExpression))] - public class GuidCompilers - { - [Compiler(typeof(GuidModifier), "ReplaceOne", TargetKind.Method | TargetKind.Static)] - public static SqlExpression CompileReplaceOne(SqlExpression sourceSqlExpression, SqlExpression replacement) - { - var stringId = SqlDml.Cast(sourceSqlExpression, SqlType.VarCharMax); - var substringId = SqlDml.Substring(stringId, 0, 35); - return SqlDml.Cast(SqlDml.Concat(substringId, replacement), SqlType.Guid); - } - } -} +// Copyright (C) 2015-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexey Kulakov +// Created: 2015.12.01 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Orm.Tests.Issues.IssueJira0617_IncorrectRedundantColumnRemoveModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0617_IncorrectRedundantColumnRemove : AutoBuildTest + { + [Test] + public void Test01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting() { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test] + public void Test02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test] + public void Test03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test] + public void Test04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum, + SlaveFinToolBase = posting.FinCredit + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + SlaveFinToolBase = posting.FinDebit + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id == id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code == "123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] { id })).LongCount()); + } + } + + [Test] + public void Test05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var priceCalculation = from tablePart in Query.All() where !tablePart.OnlyCurrentType select tablePart; + + var masterDebit = from posting in + Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.DebitAccount, + MasterFinToolBase = posting.FinDebit, + SlaveAccount = posting.CreditAccount, + SlaveFinToolBase = posting.FinCredit, + Sum = (posting.DebitAccount.AccountType==PacioliAccountType.Passive) ? -posting.Sum : posting.Sum + }; + + var masterCredit = from posting in Query.All() + select + new { + Id = posting.Id, + Status = posting.Status, + BalanceHolder = posting.BalanceHolder, + CreationDate = posting.CreationDate, + Currency = posting.Currency, + ExecutionDate = posting.ExecutionDate, + Operation = posting.Operation, + OperationType = posting.Operation.OperationType, + MasterAccount = posting.CreditAccount, + MasterFinToolBase = posting.FinCredit, + SlaveAccount = posting.DebitAccount, + SlaveFinToolBase = posting.FinDebit, + Sum = + posting.CreditAccount.AccountType==PacioliAccountType.Active + || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + }; + + var usefulColumns = masterCredit.Union(masterDebit); + var readyForFilterQuery = from joinResult in usefulColumns + .LeftJoin(priceCalculation, a => a.SlaveAccount, a => a.Account, (pp, ps) => new {pp, ps}) + .LeftJoin(priceCalculation, a => a.pp.MasterAccount, a => a.Account, (a, pm) => new {a.pp, a.ps, pm}) + let item = joinResult.pp + select new CustomPosting { + Id = item.Id, + Status = item.Status, + BalanceHolder = item.BalanceHolder, + CreationDate = item.CreationDate, + Currency = item.Currency, + ExecutionDate = item.ExecutionDate, + Operation = item.Operation, + OperationType = item.Operation.OperationType, + Sum = item.Sum, + MasterAccount = item.MasterAccount, + MasterFinToolBase = item.MasterFinToolBase, + SlaveAccount = item.SlaveAccount, + SlaveFinToolBase = item.SlaveFinToolBase, + MasterFinToolKind = joinResult.pm!=null ? joinResult.pm.Owner : item.MasterFinToolBase.FinToolKind, + SlaveFinToolKind = joinResult.pm!=null ? joinResult.ps.Owner : item.SlaveFinToolBase.FinToolKind, + }; + + var id = session.Query.All().First().Id; + + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id==id).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code=="123").LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Code.In("123")).LongCount()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] {id})).ToArray()); + Assert.DoesNotThrow(() => readyForFilterQuery.Where(a => a.MasterAccount.Id.In(new[] {id})).LongCount()); + } + } + + [Test] + public void Test06() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var transactions = Session.Current.Query.All(); + + var balanceFinTools = transactions.Select( + z => new { + z.FinTool, + Sum = z.Method==TransactionMethod.Debit ? z.Qty : -z.Qty, + SumPrice = z.Method==TransactionMethod.Debit ? z.Price : -z.Price + }).GroupBy(r => r.FinTool) + .Select(f => new {FinTool = f.Key, Summ = f.Sum(s => s.Sum), SummPrice = f.Sum(s => s.SumPrice)}) + .Where(a => a.Summ!=0); + var resultQuery = balanceFinTools.Select(a => a.FinTool.Id).Distinct(); + + var objects = resultQuery.ToArray(); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Length, Is.Not.EqualTo(0)); + } + } + + [Test] + public void Test07() + { + Require.ProviderIs(StorageProvider.SqlServer); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var allPostings = Query.All(); + var masterDebit = + allPostings.Select( + posting => + new { + Id = GuidModifier.ReplaceOne(posting.Id, "1"), + Posting = posting, + Sum = posting.DebitAccount.AccountType==PacioliAccountType.Passive ? -posting.Sum : posting.Sum, + MasterFinToolBase = posting.DebitFinTool + }); + + var masterCredit = + allPostings.Select( + posting => + new { + Id = GuidModifier.ReplaceOne(posting.Id, "9"), + Posting = posting, + Sum = posting.CreditAccount.AccountType==PacioliAccountType.Active || posting.CreditAccount.AccountType==PacioliAccountType.ActivePassive + ? -posting.Sum + : posting.Sum, + MasterFinToolBase = posting.CreditFinTool + }); + + var concatination = masterCredit.Concat(masterDebit); + var usefulColumnsSelection = from raw in concatination + select new { + Id = raw.Id, + Posting = raw.Posting, + Sum = raw.Sum, + MasterFinToolBase = raw.MasterFinToolBase, + }; + + var finalQuery = from raw in usefulColumnsSelection.Select( + selectionItem => new { + MasterFinToolBase = selectionItem.MasterFinToolBase, + Sum = selectionItem.Sum, + Id = selectionItem.Posting.Id + }) + where raw.MasterFinToolBase!=null + group raw by new { + MasterFinToolBase = raw.MasterFinToolBase + } + into grouping + select new { + MasterFinToolBase = grouping.Key.MasterFinToolBase, + Sum = grouping.Sum(s => s.Sum), + Id = grouping.Select(x => x.Id).First() + }; + + object[] objects = null; + Assert.DoesNotThrow(() => { objects = finalQuery.ToArray(); }); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Length, Is.Not.EqualTo(0)); + } + } + + [Test] + public void Test08() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var tp = from q in Query.All() + select + new { + q.Account, + OnlyCurrentType = !q.OnlyCurrentType, + FinToolKind = q.OnlyCurrentType ? Guid.Empty : q.Owner.Id + }; + + var masterDebit = from q in Query.All() + select + new { + Id = q.Id, + Posting = q, + DebitCredit = DebitCredit.Debit, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.DebitAccount, + MasterFinToolBase = q.DebitFinTool, + }; + + var masterCredit = from q in Query.All() + select + new { + Id = q.Id, + Posting = q, + DebitCredit = DebitCredit.Credit, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.CreditAccount, + MasterFinToolBase = q.CreditFinTool, + }; + + var preResult = masterCredit.Concat(masterDebit); + + var result = + from r in + preResult.Join(tp.Distinct(), a => a.MasterAccount, a => a.Account, (a, pm) => new {pp = a, pm}) + .LeftJoin(Query.All(), a => a.pm.FinToolKind, a => a.Id, (a, b) => new {pp = a.pp, pm = a.pm, fk = b}) + let q = r.pp + select + new { + Id = q.Id, + Posting = q.Posting, + Status = q.Status, + BalanceHolder = q.BalanceHolder, + CreationDate = q.CreationDate, + Currency = q.Currency, + Deal = q.Deal, + ExecutionDate = q.ExecutionDate, + Sum = q.Sum, + MasterAccount = q.MasterAccount, + MasterFinToolBase = q.MasterFinToolBase, + MasterFinToolKind = r.pm.OnlyCurrentType ? r.fk : q.MasterFinToolBase.FinToolKind, + AccountType = q.MasterAccount.AccountType + }; + + var xx = + from a in + result + .Select( + a => + new { + MasterFinToolBase = a.MasterFinToolBase, + MasterFinToolKind = a.MasterFinToolKind, + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + ExecutionDate = a.ExecutionDate, + Deal = a.Deal, + MasterAccount = a.MasterAccount, + Sum = a.Sum, + Posting = a.Posting + }) + where a.MasterFinToolBase!=null && a.MasterFinToolKind!=null + group a by + new { + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + Deal = a.Deal, + ExecutionDate = a.ExecutionDate, + MasterAccount = a.MasterAccount, + MasterFinToolBase = a.MasterFinToolBase + } + into gr + select + new { + ExecutionDate = gr.Key.ExecutionDate, + BalanceHolder = gr.Key.BalanceHolder, + MasterFinToolBase = gr.Key.MasterFinToolBase, + Currency = gr.Key.Currency, + CreationDate = gr.Key.CreationDate, + Deal = gr.Key.Deal, + MasterAccount = gr.Key.MasterAccount, + Sum = gr.Sum(s => s.Sum), + Id = gr.Select(a => a.Posting).First().Id + }; + List objects = null; + Assert.DoesNotThrow(() => objects = result.ToList()); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Count, Is.Not.EqualTo(0)); + } + } + + [Test] + public void Test09() + { + Require.ProviderIs(StorageProvider.SqlServer); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var pacioliPostings = Query.All().Select(el => el.Id).ToList(); + Assert.That(pacioliPostings.Count, Is.EqualTo(10)); + var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); + + var query = session.Query.All() + .Select(a => new { + Id = GuidModifier.ReplaceOne(a.Id, "9"), + Posting = a, + Sum = a.CreditAccount.AccountType==PacioliAccountType.Passive || a.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -a.Sum : a.Sum, + MasterAccount = a.CreditAccount, + MasterFinToolBase = a.CreditFinTool, + SlaveAccount = a.DebitAccount, + SlaveFinToolBase = a.DebitFinTool + }) + .Concat(session.Query.All().Select(b => new { + Id = GuidModifier.ReplaceOne(b.Id, "1"), + Posting = b, + Sum = b.DebitAccount.AccountType==PacioliAccountType.Active ? -b.Sum : b.Sum, + MasterAccount = b.DebitAccount, + MasterFinToolBase = b.DebitFinTool, + SlaveAccount = b.CreditAccount, + SlaveFinToolBase = b.CreditFinTool + })) + .Select(r => new {r = r, q = r}) + .Select(el => new CustomPosting() { + Id = el.q.Id, + Posting = el.q.Posting, + Status = el.q.Posting.Status, + BalanceHolder = el.q.Posting.BalanceHolder, + CreationDate = el.q.Posting.CreationDate, + Currency = el.q.Posting.Currency, + Deal = el.q.Posting.Deal, + ExecutionDate = el.q.Posting.ExecutionDate, + OperationType = el.q.Posting.Operation.OperationType, + Sum = el.q.Sum, + MasterAccount = el.q.MasterAccount, + MasterFinToolBase = el.q.MasterFinToolBase, + SlaveAccount = el.q.SlaveAccount, + SlaveFinToolBase = el.q.SlaveFinToolBase, + MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind + }) + .Where(a => (a.MasterFinToolBase.Id.In(finTools))) + .Select(a => + new { + MasterFinToolBase = a.MasterFinToolBase, + MasterFinToolKind = a.MasterFinToolKind, + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + ExecutionDate = a.ExecutionDate, + Deal = a.Deal, + MasterAccount = a.MasterAccount, + Sum = a.Sum, + Id = a.Posting.Id + }) + .Where(a => ((a.MasterFinToolBase!=null) && (a.MasterFinToolKind!=null))) + .GroupBy(a => new { + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + Deal = a.Deal, + ExecutionDate = a.ExecutionDate, + MasterAccount = a.MasterAccount, + MasterFinToolBase = a.MasterFinToolBase + }); + var query1 = query.Select(gr => + new CustomPostingGroup() { + ExecutionDate = gr.Key.ExecutionDate, + BalanceHolder = gr.Key.BalanceHolder, + MasterFinToolBase = gr.Key.MasterFinToolBase, + Currency = gr.Key.Currency, + CreationDate = gr.Key.CreationDate, + Deal = gr.Key.Deal, + MasterAccount = gr.Key.MasterAccount, + Sum = gr.Sum(s => s.Sum), + Id = gr.First().Id + }) + .Where(a => true) + .OrderBy(a => a.CreationDate) + .Select(c => new {Item = c, FakeKey = 0}) + .GroupBy(i => i.FakeKey); + + object[] objects = null; + objects = query1.ToArray(); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Length, Is.Not.EqualTo(0)); + + object @object = null; + dynamic q = query1.Select("new (Sum(Item.Sum) as Sum, Count() as Count)"); + Assert.DoesNotThrow(() => @object = Queryable.FirstOrDefault(q)); + Assert.That(@object, Is.Not.Null); + } + } + + [Test] + public void Test10() + { + Require.ProviderIs(StorageProvider.SqlServer); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var pacioliPostings = Query.All().Select(el => el.Id).ToList(); + var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); + + var query = session.Query.All() + .Select(a => new { + Id = GuidModifier.ReplaceOne(a.Id, "9"), + Posting = a, + Sum = a.CreditAccount.AccountType==PacioliAccountType.Passive || a.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -a.Sum : a.Sum, + MasterAccount = a.CreditAccount, + MasterFinToolBase = a.CreditFinTool, + SlaveAccount = a.DebitAccount, + SlaveFinToolBase = a.DebitFinTool + }) + .Concat(session.Query.All().Select(b => new { + Id = GuidModifier.ReplaceOne(b.Id, "1"), + Posting = b, + Sum = b.DebitAccount.AccountType==PacioliAccountType.Active ? -b.Sum : b.Sum, + MasterAccount = b.DebitAccount, + MasterFinToolBase = b.DebitFinTool, + SlaveAccount = b.CreditAccount, + SlaveFinToolBase = b.CreditFinTool + })) + .Select(r => new {r = r, q = r}) + .Select(el => new CustomPosting { + Id = el.q.Id, + Posting = el.q.Posting, + Status = el.q.Posting.Status, + BalanceHolder = el.q.Posting.BalanceHolder, + CreationDate = el.q.Posting.CreationDate, + Currency = el.q.Posting.Currency, + Deal = el.q.Posting.Deal, + ExecutionDate = el.q.Posting.ExecutionDate, + OperationType = el.q.Posting.Operation.OperationType, + Sum = el.q.Sum, + MasterAccount = el.q.MasterAccount, + MasterFinToolBase = el.q.MasterFinToolBase, + SlaveAccount = el.q.SlaveAccount, + SlaveFinToolBase = el.q.SlaveFinToolBase, + MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind + }) + .Where(a => (a.MasterFinToolBase.Id.In(finTools))) + .Select(a => + new { + MasterFinToolBase = a.MasterFinToolBase, + MasterFinToolKind = a.MasterFinToolKind, + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + ExecutionDate = a.ExecutionDate, + Deal = a.Deal, + MasterAccount = a.MasterAccount, + Sum = a.Sum, + Id = a.Posting.Id + }) + .Where(a => ((a.MasterFinToolBase!=null) && (a.MasterFinToolKind!=null))) + .GroupBy(a => new { + Currency = a.Currency, + BalanceHolder = a.BalanceHolder, + CreationDate = a.CreationDate, + Deal = a.Deal, + ExecutionDate = a.ExecutionDate, + MasterAccount = a.MasterAccount, + MasterFinToolBase = a.MasterFinToolBase + }) + .Select(gr => + new CustomPostingGroup() { + ExecutionDate = gr.Key.ExecutionDate, + BalanceHolder = gr.Key.BalanceHolder, + MasterFinToolBase = gr.Key.MasterFinToolBase, + Currency = gr.Key.Currency, + CreationDate = gr.Key.CreationDate, + Deal = gr.Key.Deal, + MasterAccount = gr.Key.MasterAccount, + Sum = gr.Sum(s => s.Sum), + Id = gr.First().Id + }) + .Where(a => true) + .OrderBy(a => a.CreationDate) + .Take(10); + + var simpleSelection = query.Select(el => new { + el.Id, + el.CreationDate, + el.ExecutionDate, + BalanceHolder = el.BalanceHolder, + MasterAccount = el.MasterAccount.Name, + MasterFinToolBase = el.MasterFinToolBase.Name, + Currency = el.Currency.Name, + Sum = el.Sum + }); + object[] elements = null; + Assert.DoesNotThrow(() => elements = simpleSelection.ToArray()); + Assert.That(elements, Is.Not.Null); + Assert.That(elements.Length, Is.Not.EqualTo(0)); + + dynamic selection = query.Select("new (" + + "Id, " + + " CreationDate," + + " ExecutionDate," + + " BalanceHolder.Name as BalanceHolder," + + " MasterAccount.Name as MasterAccount," + + " MasterFinToolBase.Name as MasterFinToolBase," + + " Currency.Name as Currency," + + " Sum)"); + + object[] objects = null; + Assert.DoesNotThrow(() => objects = Enumerable.ToArray((IEnumerable)selection)); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Length, Is.Not.EqualTo(0)); + } + } + + [Test] + public void Test11() + { + Require.ProviderIs(StorageProvider.SqlServer); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var pacioliPostings = Query.All().Select(el => el.Id).ToList(); + var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); + + var query = session.Query.All() + .Select(el => new { + Id = GuidModifier.ReplaceOne(el.Id, "9"), + Posting = el, + Sum = el.CreditAccount.AccountType==PacioliAccountType.Passive || el.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -el.Sum : el.Sum, + MasterAccount = el.CreditAccount, + MasterFinToolBase = el.CreditFinTool, + SlaveAccount = el.DebitAccount, + SlaveFinToolBase = el.DebitFinTool + }) + .Union( + session.Query.All() + .Select(el => new { + Id = GuidModifier.ReplaceOne(el.Id, "1"), + Posting = el, + Sum = el.DebitAccount.AccountType==PacioliAccountType.Active ? -el.Sum : el.Sum, + MasterAccount = el.DebitAccount, + MasterFinToolBase = el.DebitFinTool, + SlaveAccount = el.CreditAccount, + SlaveFinToolBase = el.CreditFinTool + }) + ) + .Select(r => new {r = r, q = r}) + .Select(el => new CustomPosting { + Id = el.q.Id, + Posting = el.q.Posting, + Status = el.q.Posting.Status, + BalanceHolder = el.q.Posting.BalanceHolder, + CreationDate = el.q.Posting.CreationDate, + Currency = el.q.Posting.Currency, + Deal = el.q.Posting.Deal, + ExecutionDate = el.q.Posting.ExecutionDate, + OperationType = el.q.Posting.Operation.OperationType, + Sum = el.q.Sum, + MasterAccount = el.q.MasterAccount, + MasterFinToolBase = el.q.MasterFinToolBase, + SlaveAccount = el.q.SlaveAccount, + SlaveFinToolBase = el.q.SlaveFinToolBase, + MasterFinToolKind = el.q.MasterFinToolBase.FinToolKind + }) + .Where(a => (a.MasterFinToolBase.Id.In(finTools))) + .Where(a => true) + .OrderBy(el => el.CreationDate) + .Take(10); + + var simpleSelection = query.Select(el => new { + el.Id, + el.Posting.Name, + el.CreationDate, + el.ExecutionDate, + BalanceHolder = el.BalanceHolder.Name, + OperationType = el.OperationType.Name, + el.Sum, + Currency = el.Currency.Name, + Status = el.Status.Name, + MasterAccount = el.MasterAccount.Name, + SlaveAccount = el.SlaveAccount.Name, + MasterFinToolBase = el.MasterFinToolBase.Name, + SlaveFinToolBase = el.SlaveFinToolBase.Name, + MasterFinToolKind = el.MasterFinToolKind + }).ToArray(); + Assert.That(simpleSelection, Is.Not.Null); + Assert.That(simpleSelection.Length, Is.Not.EqualTo(0)); + + dynamic selection = query.Select("new (Id," + + " Posting.Name as Posting," + + " CreationDate, ExecutionDate," + + " ExecutionDate," + + " BalanceHolder.Name as BalanceHolder," + + " OperationType.Name as OperationType," + + " Sum," + + " Currency.Name as Currency," + + " Status.Name as Status," + + " MasterAccount.Name as MasterAccount," + + " SlaveAccount.Name as SlaveAccount," + + " MasterFinToolBase.Name as MasterFinToolBase," + + " SlaveFinToolBase.Name as SlaveFinToolBase," + + " MasterFinToolKind.Name as MasterFinToolKind)"); + + object[] objects = null; + Assert.DoesNotThrow(() => objects = Enumerable.ToArray((IEnumerable)selection)); + Assert.That(objects, Is.Not.Null); + Assert.That(objects.Length, Is.Not.EqualTo(0)); + } + } + + [Test] + public void Test12() + { + Require.ProviderIs(StorageProvider.SqlServer); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var pacioliPostings = Query.All().Select(el => el.Id).ToList(); + var finTools = Query.All().Where(a => a.Id.In(pacioliPostings)).ToArray().Select(x => x.CreditFinTool.Id).Distinct(); + + var query = session.Query.All() + .Select(q => new { + Id = GuidModifier.ReplaceOne(q.Id, "9"), + Posting = q, + Sum = q.CreditAccount.AccountType==PacioliAccountType.Passive || q.CreditAccount.AccountType==PacioliAccountType.ActivePassive ? -q.Sum : q.Sum, + MasterAccount = q.CreditAccount, + MasterFinToolBase = q.CreditFinTool, + SlaveAccount = q.DebitAccount, + SlaveFinToolBase = q.DebitFinTool + }) + .Concat( + session.Query.All() + .Select(q => new { + Id = GuidModifier.ReplaceOne(q.Id, "1"), + Posting = q, + Sum = q.DebitAccount.AccountType==PacioliAccountType.Active ? -q.Sum : q.Sum, + MasterAccount = q.DebitAccount, + MasterFinToolBase = q.DebitFinTool, + SlaveAccount = q.CreditAccount, + SlaveFinToolBase = q.CreditFinTool + })) + .Select(r => new {r = r, q = r}) + .Select(a => new CustomPosting { + Id = a.q.Id, + Posting = a.q.Posting, + Status = a.q.Posting.Status, + BalanceHolder = a.q.Posting.BalanceHolder, + CreationDate = a.q.Posting.CreationDate, + Currency = a.q.Posting.Currency, + Deal = a.q.Posting.Deal, + ExecutionDate = a.q.Posting.ExecutionDate, + OperationType = a.q.Posting.Operation.OperationType, + Sum = a.q.Sum, + MasterAccount = a.q.MasterAccount, + MasterFinToolBase = a.q.MasterFinToolBase, + SlaveAccount = a.q.SlaveAccount, + SlaveFinToolBase = a.q.SlaveFinToolBase, + MasterFinToolKind = a.q.MasterFinToolBase.FinToolKind + }) + .Where(a => (a.MasterFinToolBase.Id.In(finTools))) + .Where(a => true) + .OrderBy(a => a.CreationDate) + .Select(q => new {Item = q, FakeKey = 0}) + .GroupBy(i => i.FakeKey); + + dynamic selection = query.Select("new (Sum(Item.Sum) as Sum, Count() as sysTotal_Item_Count)"); + object @object = null; + Assert.DoesNotThrow(() => @object = Queryable.FirstOrDefault(selection)); + Assert.That(@object, Is.Not.Null); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(PacioliAccount).Assembly, typeof(PacioliAccount).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + base.PopulateData(); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var randomNumbersProvider = new Random(); + var statuses = new List(10); + for (var i = 0; i < 10; i++) { + statuses.Add(new Status(Guid.NewGuid()) {Description = "Status", Name = "Status" + i}); + } + + var modules = new List(); + for (var i = 0; i < 10; i++) { + modules.Add(new Module(Guid.NewGuid()) {Name = "Module" + i, SysName = "Module" + i, FileVersion = i + "." + (40 - i) + "." + i}); + } + + var currencies = new List(10); + for (int i = 0; i < 10; i++) { + currencies.Add(new Currency(Guid.NewGuid()) {Name = "Currency" + i, Status = statuses[randomNumbersProvider.Next(0, 10)]}); + } + + var regEntities = new List(10); + for (var i = 0; i < 10; i++) { + regEntities.Add(new RegEntity(Guid.NewGuid()) {Name = "RegEntity" + i, Module = modules[randomNumbersProvider.Next(0, 10)]}); + } + + var finToolKinds = new List(10); + for (var i = 0; i < 10; i++) { + finToolKinds.Add(new TablePartBase.FinToolKind(Guid.NewGuid()) { + Entity = regEntities[randomNumbersProvider.Next(0, 10)], + Name = "FinToolKind" + i, + FullName = "FinToolKind" + i + }); + } + + var pacioliAccounts = new List(10); + for (var i = 0; i < 10; i++) { + pacioliAccounts.Add(new PacioliAccount(Guid.NewGuid()) { + AccountType = (PacioliAccountType)randomNumbersProvider.Next(0, 3), + Name = "PacioliAccount" + i, + Code = (i * i).ToString(), + FastAccess = "dfghdfjghkjdfg" + i, + }); + } + + var tablePriceCalcs = new List(); + for (var i = 0; i < 10; i++) { + tablePriceCalcs.Add(new TablePartBase.FinToolKind.TpPriceCalc(Guid.NewGuid(), finToolKinds[randomNumbersProvider.Next(0, 10)]) { + Account = pacioliAccounts[randomNumbersProvider.Next(0, 10)] + }); + } + + var operationTypes = new List(10); + for (var i = 0; i < 10; i++) { + operationTypes.Add(new OperationType(Guid.NewGuid()) { + Name = "OperationType", + Account = pacioliAccounts[randomNumbersProvider.Next(0, 10)] + }); + } + + var regTransactions = new List(10); + for (var i = 0; i < 10; i++) { + regTransactions.Add(new RegTransaction(Guid.NewGuid()) { + Portfolio = null, + FinTool = finToolKinds[randomNumbersProvider.Next(0, 10)], + Method = TransactionMethod.Debit, + Price = (decimal)i / 10, + Qty = (decimal)i * 10, + }); + } + + var portfolios = new List(20); + for (var i = 0; i < 10; i++) { + portfolios.Add(new AggregatePortfolio(Guid.NewGuid()) { + Name = "AggregatePortfolio" + i, + FullName = "AggregatePortfolio" + i, + Identifier = "AggregatePortfolio" + i, + }); + } + for (var i = 0; i < 10; i++) { + portfolios.Add(new RealPortfolio(Guid.NewGuid()) { + Name = "RealPortfolio" + i, + FullName = "RealPortfolio" + i, + Identifier = "RealPortfolio" + i, + }); + } + + var operationBases = new List(20); + for (var i = 0; i < 10; i++) { + operationBases.Add(new TechOperation(Guid.NewGuid()) { + Portfolio = portfolios[randomNumbersProvider.Next(0, 20)], + }); + } + + for (var i = 0; i < 10; i++) { + operationBases.Add(new ActOfNavDetectedErrors(Guid.NewGuid()) { + Portfolio = portfolios[randomNumbersProvider.Next(0, 20)] + }); + } + + var finToolBases = new List(10); + for (var i = 0; i < 10; i++) { + finToolBases.Add(new OtherFinTools(Guid.NewGuid()) { + Name = "FinToolBase" + i, + DocumentIdentifier = "FinToolBase" + Guid.NewGuid(), + Cur = currencies[randomNumbersProvider.Next(0, 10)], + FinToolKind = finToolKinds[randomNumbersProvider.Next(0, 10)], + }); + } + + var pacioliPostings = new List(); + for (int i = 0; i < 10; i++) { + pacioliPostings.Add(new PacioliPosting(Guid.NewGuid()) { + Name = "PacioliPosting" + i, + Status = statuses[randomNumbersProvider.Next(0, 10)], + DebitAccount = pacioliAccounts[randomNumbersProvider.Next(0, 10)], + CreditAccount = pacioliAccounts[randomNumbersProvider.Next(0, 10)], + CreditFinTool = finToolBases[randomNumbersProvider.Next(0, 10)], + DebitFinTool = finToolBases[randomNumbersProvider.Next(0, 10)], + ExecutionDate = DateTime.Today, + Sum = 1, + Currency = currencies[randomNumbersProvider.Next(0, 10)], + BalanceHolder = portfolios[randomNumbersProvider.Next(0, 20)], + Operation = operationBases[randomNumbersProvider.Next(0, 20)], + }); + } + transaction.Complete(); + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0617_IncorrectRedundantColumnRemoveModel +{ + public enum ProviderKind + { + IncludeProvider, + TakeProvider + } + + public enum PacioliAccountType + { + Passive, + Active, + ActivePassive + } + + public enum DealType + { + RoundsPlannedDeal, + LeftOffPlannedDeal, + RealDeal, + } + + public enum DebitCredit + { + Debit, + Credit, + } + + [KeyGenerator(KeyGeneratorKind.None)] + public abstract class EntityBase : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + protected EntityBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class Module : EntityBase + { + [Field(Length = 40)] + public string LongRevision { get; set; } + + [Field(Length = 400, Nullable = false)] + public string Name { get; set; } + + [Field] + public ulong Revision { get; set; } + + [Field(Length = 400, Nullable = false)] + public string SysName { get; set; } + + [Field(Length = 100, Nullable = false, NullableOnUpgrade = true)] + public string FileVersion { get; set; } + + public Module(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class RegEntity : EntityBase + { + [Field] + public string Description { get; set; } + + [Field] + public string FullName { get; set; } + + + [Field(Nullable = false)] + public Module Module { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public string SysName { get; set; } + + public bool IsAbstract + { + get { return Session.Domain.Model.Types[SysName].IsAbstract; } + } + + public RegEntity(Guid id) + : base(id) + { + } + } + + public abstract class TablePartBase : EntityBase + { + [Field] + public FinToolKind Owner { get; private set; } + + protected TablePartBase(Guid id, FinToolKind owner) + : base(id) + { + Owner = owner; + } + + [HierarchyRoot] + public sealed class FinToolKind : EntityBase + { + [Field(Nullable = false, Length = 100)] + public string Name { get; set; } + + [Field(Nullable = false, Length = 100)] + public string FullName { get; set; } + + [Field] + public FinToolKind Parent { get; set; } + + [Field] + public RegEntity Entity { get; set; } + + [Field] + public bool Quantitative { get; set; } + + [Field] + [Association(PairTo = "Owner", OnTargetRemove = OnRemoveAction.Clear, OnOwnerRemove = OnRemoveAction.Cascade)] + public EntitySet PriceCalc { get; private set; } + + public FinToolKind(Guid id) + : base(id) + { + } + + [HierarchyRoot] + public sealed class TpPriceCalc : TablePartBase + { + [Field(Nullable = false)] + public PacioliAccount Account { get; set; } + + [Field] + public bool OnlyCurrentType { get; set; } + + public TpPriceCalc(Guid id, FinToolKind owner) + : base(id, owner) + { + } + } + } + } + + [HierarchyRoot] + public abstract class FinToolBase : EntityBase + { + [Field(Length = 300, Nullable = false)] + public virtual string Name { get; set; } + + [Field(Length = 50, Nullable = false)] + public string DocumentIdentifier { get; set; } + + [Field] + public string ForeignId { get; set; } + + [Field(Nullable = false)] + public TablePartBase.FinToolKind FinToolKind { get; set; } + + [Field(Nullable = false)] + public virtual Currency Cur { get; set; } + + public FinToolBase(Guid id) + : base(id) + { + } + } + + public class OtherFinTools : FinToolBase + { + public OtherFinTools(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class Status : EntityBase + { + [Field] + public string Description { get; set; } + + [Field] + public string Name { get; set; } + + public Status(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class Currency : EntityBase + { + [Field(Length = 20)] + public string CurCode { get; set; } + + [Field(Length = 3)] + public string DigitCode { get; set; } + + [Field] + public int? MinorUnits { get; set; } + + [Field(Length = 400, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 400)] + public string Description { get; set; } + + [Field(Length = 20)] + public string Sign { get; set; } + + [Field(Length = 400)] + public string EngName { get; set; } + + [Field] + public Status Status { get; set; } + + public Currency(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public abstract class Subject : EntityBase + { + [Field(Length = 8)] + public int? Code { get; set; } + + [Field(Nullable = false, Length = 255)] + public string Name { get; set; } + + [Field(Nullable = false, Length = 400)] + public string FullName { get; set; } + + [Field(Nullable = false, Length = 20)] + public virtual string Identifier { get; set; } + + public Subject(Guid id) + : base(id) + { + } + } + + public abstract class Portfolio : Subject + { + [Field(Length = 400)] + public string LegalName { get; set; } + + [Field] + public DateTime? DateOnService { get; set; } + + [Field] + public DateTime? DateRemovalFromService { get; set; } + + [Field] + public DateTime? EisTransitionDate { get; set; } + + [Field] + public DateTime? ImportedToDate { get; set; } + + protected Portfolio(Guid id) + : base(id) + { + } + } + + [Serializable] + public sealed class AggregatePortfolio : Portfolio + { + public AggregatePortfolio(Guid id) + : base(id) + { + } + } + + public sealed class RealPortfolio : Portfolio + { + public RealPortfolio(Guid id) + : base(id) + { } + } + + public abstract class DocumentBase : EntityBase + { + [Field] + public Status Status { get; set; } + + public DocumentBase(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public abstract class OperationBase : DocumentBase + { + [Field(Length = 50)] + public string Number { get; set; } + + [Field] + public DateTime? InputDate { get; set; } + + [Field] + public DateTime? AuthorizationDate { get; set; } + + [Field] + public OperationType OperationType { get; set; } + + [Field] + public Portfolio Portfolio { get; set; } + + [Field(Length = 1024)] + public string Comment { get; set; } + + protected OperationBase(Guid id) + : base(id) + { + } + } + + public sealed class TechOperation : OperationBase + { + [Field] + public string ForeignId { get; set; } + + public TechOperation(Guid id) + : base(id) + { + } + } + + public sealed class ActOfNavDetectedErrors : OperationBase + { + public ActOfNavDetectedErrors(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class OperationType : EntityBase + { + [Field(Length = 255, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 255)] + public string Description { get; set; } + + [Field] + public PacioliAccount Account { get; set; } + + public OperationType(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class PacioliAccount : EntityBase + { + [Field] + public PacioliAccount Parent { get; set; } + + [Field(Length = 128, Nullable = false)] + public string Name { get; set; } + + [Field(Length = 4000)] + public string Description { get; set; } + + [Field(Length = 32, Nullable = false)] + public string Code { get; set; } + + [Field(Length = 32, Nullable = false)] + public string FastAccess { get; set; } + + [Field] + public PacioliAccountType AccountType { get; set; } + + public PacioliAccount(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public class PacioliPosting : DocumentBase + { + [Field] + public FinToolBase FinDebit { get; set; } + + [Field] + public FinToolBase FinCredit { get; set; } + + [Field(Nullable = false)] + public Portfolio BalanceHolder { get; set; } + + [Field] + public string Name { get; set; } + + [Field(Nullable = false)] + public OperationBase Operation { get; set; } + + [Field] + public string ForeignId { get; set; } + + [Field(Length = 12)] + public string ForeignIdHash { get; set; } + + [Field] + public PacioliAccount DebitAccount { get; set; } + + [Field] + public PacioliAccount CreditAccount { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public DateTime? ExecutionDate { get; set; } + + [Field] + public decimal Sum { get; set; } + + [Field] + public Currency Currency { get; set; } + + [Field(Indexed = false)] + public FinToolBase DebitFinTool { get; set; } + + [Field(Indexed = false)] + public FinToolBase CreditFinTool { get; set; } + + [Field] + public DealType Deal { get; set; } + + public PacioliPosting(Guid id) + : base(id) + { + } + } + + [HierarchyRoot] + public sealed class RegTransaction : EntityBase + { + [Field] + public DateTime? AuthorizeDate { get; set; } + + [Field] + public DateTime? OperDate { get; set; } + + [Field] + public Portfolio Portfolio { get; set; } + + [Field] + public TablePartBase.FinToolKind FinTool { get; set; } + + [Field] + public TransactionMethod Method { get; set; } + + [Field] + public decimal Qty { get; set; } + + [Field] + public decimal Price { get; set; } + + public RegTransaction(Guid id) + : base(id) + { + } + } + + public enum TransactionMethod + { + Debit + } + + public class CustomPosting + { + public Guid Id { get; set; } + + public DateTime CreationDate { get; set; } + + public DateTime? ExecutionDate { get; set; } + + public Portfolio BalanceHolder { get; set; } + + public OperationBase Operation { get; set; } + + public OperationType OperationType { get; set; } + + public decimal Sum { get; set; } + + public Currency Currency { get; set; } + + public Status Status { get; set; } + + public PacioliAccount MasterAccount { get; set; } + + public PacioliAccount SlaveAccount { get; set; } + + public FinToolBase MasterFinToolBase { get; set; } + + public FinToolBase SlaveFinToolBase { get; set; } + + public TablePartBase.FinToolKind MasterFinToolKind { get; set; } + + public TablePartBase.FinToolKind SlaveFinToolKind { get; set; } + + public PacioliPosting Posting { get; set; } + + public DealType Deal { get; set; } + } + + public class CustomPostingGroup + { + public Guid Id { get; set; } + + public DateTime CreationDate { get; set; } + + public DateTime? ExecutionDate { get; set; } + + public Portfolio BalanceHolder { get; set; } + + public DealType Deal { get; set; } + + public PacioliAccount MasterAccount { get; set; } + + public FinToolBase MasterFinToolBase { get; set; } + + public Currency Currency { get; set; } + + public Decimal Sum { get; set; } + } + + public static class GuidModifier + { + public static Guid ReplaceOne(Guid source, string replacement) + { + return Guid.Parse(source.ToString().Substring(0, 35) + replacement); + } + } + + [CompilerContainer(typeof(SqlExpression))] + public class GuidCompilers + { + [Compiler(typeof(GuidModifier), "ReplaceOne", TargetKind.Method | TargetKind.Static)] + public static SqlExpression CompileReplaceOne(SqlExpression sourceSqlExpression, SqlExpression replacement) + { + var stringId = SqlDml.Cast(sourceSqlExpression, SqlType.VarCharMax); + var substringId = SqlDml.Substring(stringId, 0, 35); + return SqlDml.Cast(SqlDml.Concat(substringId, replacement), SqlType.Guid); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0619_InvalidExpressionInOrderBy.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0619_InvalidExpressionInOrderBy.cs index 5eb977090d..09f6ee784c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0619_InvalidExpressionInOrderBy.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0619_InvalidExpressionInOrderBy.cs @@ -1,173 +1,173 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.12.08 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira060x_InvalidExpressionInOrderByModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira060x_InvalidExpressionInOrderByModel -{ - public interface IMesObject - { - [Key, Field] - long ID { get; } - } - - public abstract class MesObject : Entity, IMesObject - { - public long ID { get; private set; } - } - - public class DimensionalField : Structure - { - - [Field(Nullable = false, DefaultValue = "", Length = 20)] - public string MeasureType { get; private set; } - - [Field] - public decimal NormalizedValue { get; private set; } - - [Field(DefaultValue = 1.0)] - public double LastUsedScale { get; private set; } - } - - [HierarchyRoot] - public class ProductRequirement : MesObject - { - [Field] - public DimensionalField RequestedProductQuantity { get; set; } - - [Field] - public DimensionalField QuantityToGetViaInventoryAction { get; set; } - } - - public sealed class RowTuple - { - public const int FieldCount = 128; - - private object[] data = new object[FieldCount]; - - public object V0 { get { return GetValue(0); } set { SetValue(0, value); } } - public object V1 { get { return GetValue(1); } set { SetValue(1, value); } } - public object V2 { get { return GetValue(2); } set { SetValue(2, value); } } - - public object GetValue(int i) - { - return data[i]; - } - - public void SetValue(int i, object value) - { - data[i] = value; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0619_InvalidExpressionInOrderBy : AutoBuildTest - { - [Test] - public void Test01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new RowTuple{ - V0 = c.ID, - V1 = c.TypeId, - V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m - }) - .OrderBy(c => c.V2); - Assert.DoesNotThrow(() => query.Run()); - } - } - - [Test] - public void Test02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new RowTuple { - V0 = c.ID, - V1 = c.TypeId, - V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m - }) - .OrderBy(c => c.V1); - Assert.DoesNotThrow(() => query.Run()); - } - } - - [Test] - public void Test03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new RowTuple { - V0 = c.ID, - V1 = c.TypeId, - V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m - }) - .OrderBy(c => c.V0); - Assert.DoesNotThrow(() => query.Run()); - } - } - - [Test] - public void Test04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new { - V0 = (object) c.ID, - V1 = (object) c.TypeId, - V2 = (object) ((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) - }).OrderBy(el=>el.V2); - - Assert.DoesNotThrow(()=>query.Run()); - } - } - - [Test] - public void Test05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new { - V0 = (object)c.ID, - V1 = (object)c.TypeId, - V2 = (object)((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) - }).OrderBy(el => el.V1); - - Assert.DoesNotThrow(() => query.Run()); - } - } - - [Test] - public void Test06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(c => new { - V0 = (object)c.ID, - V1 = (object)c.TypeId, - V2 = (object)((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) - }).OrderBy(el => el.V0); - - Assert.DoesNotThrow(() => query.Run()); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (IMesObject).Assembly, typeof (IMesObject).Namespace); - return configuration; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.12.08 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira060x_InvalidExpressionInOrderByModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira060x_InvalidExpressionInOrderByModel +{ + public interface IMesObject + { + [Key, Field] + long ID { get; } + } + + public abstract class MesObject : Entity, IMesObject + { + public long ID { get; private set; } + } + + public class DimensionalField : Structure + { + + [Field(Nullable = false, DefaultValue = "", Length = 20)] + public string MeasureType { get; private set; } + + [Field] + public decimal NormalizedValue { get; private set; } + + [Field(DefaultValue = 1.0)] + public double LastUsedScale { get; private set; } + } + + [HierarchyRoot] + public class ProductRequirement : MesObject + { + [Field] + public DimensionalField RequestedProductQuantity { get; set; } + + [Field] + public DimensionalField QuantityToGetViaInventoryAction { get; set; } + } + + public sealed class RowTuple + { + public const int FieldCount = 128; + + private object[] data = new object[FieldCount]; + + public object V0 { get { return GetValue(0); } set { SetValue(0, value); } } + public object V1 { get { return GetValue(1); } set { SetValue(1, value); } } + public object V2 { get { return GetValue(2); } set { SetValue(2, value); } } + + public object GetValue(int i) + { + return data[i]; + } + + public void SetValue(int i, object value) + { + data[i] = value; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0619_InvalidExpressionInOrderBy : AutoBuildTest + { + [Test] + public void Test01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new RowTuple{ + V0 = c.ID, + V1 = c.TypeId, + V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m + }) + .OrderBy(c => c.V2); + Assert.DoesNotThrow(() => query.Run()); + } + } + + [Test] + public void Test02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new RowTuple { + V0 = c.ID, + V1 = c.TypeId, + V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m + }) + .OrderBy(c => c.V1); + Assert.DoesNotThrow(() => query.Run()); + } + } + + [Test] + public void Test03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new RowTuple { + V0 = c.ID, + V1 = c.TypeId, + V2 = (c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m + }) + .OrderBy(c => c.V0); + Assert.DoesNotThrow(() => query.Run()); + } + } + + [Test] + public void Test04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new { + V0 = (object) c.ID, + V1 = (object) c.TypeId, + V2 = (object) ((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) + }).OrderBy(el=>el.V2); + + Assert.DoesNotThrow(()=>query.Run()); + } + } + + [Test] + public void Test05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new { + V0 = (object)c.ID, + V1 = (object)c.TypeId, + V2 = (object)((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) + }).OrderBy(el => el.V1); + + Assert.DoesNotThrow(() => query.Run()); + } + } + + [Test] + public void Test06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(c => new { + V0 = (object)c.ID, + V1 = (object)c.TypeId, + V2 = (object)((c.QuantityToGetViaInventoryAction.NormalizedValue / c.RequestedProductQuantity.NormalizedValue) > 0.05m) + }).OrderBy(el => el.V0); + + Assert.DoesNotThrow(() => query.Run()); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (IMesObject).Assembly, typeof (IMesObject).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_FieldInitializationTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_FieldInitializationTest.cs index b61043c411..ac5ad2d4a5 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_FieldInitializationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_FieldInitializationTest.cs @@ -1,225 +1,225 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.05.03 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.MemberInitWhereItIsNotSupposeToBeModel; - -namespace Xtensive.Orm.Tests.Issues.MemberInitWhereItIsNotSupposeToBeModel -{ - public enum Level { Intern, Junior, Senior, Lead } - public enum Department { RandD, It, Marketing, Sales } - - [HierarchyRoot] - public class Employee : Entity - { - [Field, Key] - public long Id { get; private set; } - [Field] - public long? FloorNumber { get; set; } - [Field] - public long? OfficeNumber { get; set; } - [Field] - public long? Salary { get; set; } - [Field] - public Level Level { get; set; } - [Field] - public Department Department { get; set; } - } - - public class PersonSimplifiedByOffice : PersonSimplified - { - public long OfficeNumber; - public static Expression> IsBigOffice = e => e.OfficeNumber < 3; - } - - public class PersonSimplified : PersonSimplified where T : PersonSimplified - { - public static Expression> Require360Eval = e => e.Department != Department.Sales && (e.Level == Level.Junior || e.Level == Level.Senior); - public static Expression> NeedProductTraining = e => e.Department != Department.It && e.Level != Level.Intern; - } - - public class PersonSimplified - { - public Level Level; - public Department Department; - public long? Cost; - } - - public class PersonFlatByOffice - { - public long OfficeNumber; - public static Expression> IsBigOffice = e => e.OfficeNumber < 3; - - public static Expression> Require360Eval = e => e.Department != Department.Sales && (e.Level == Level.Junior || e.Level == Level.Senior); - public static Expression> NeedProductTraining = e => e.Department != Department.It && e.Level != Level.Intern; - - public Level Level; - public Department Department; - public long? Cost; - } - - public class OfficeStatistics - { - public long OfficeNumber; - public Level Level; - public long Salary; - - public object this[string fieldName] - { - set - { - var fieldToSetValue = this.GetType().GetField(fieldName); - if (fieldToSetValue==null) - throw new ArgumentException(); - fieldToSetValue.SetValue(this, value); - } - } - } - - public class ExtendedOfficeStatistics : OfficeStatistics - { - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0627_FieldInitializationTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var domainConfiguration = base.BuildConfiguration(); - domainConfiguration.Types.Register(typeof(Employee).Assembly, typeof(Employee).Namespace); - domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - return domainConfiguration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var levels = Enum.GetValues(typeof(Level)); - var departments = Enum.GetValues(typeof(Department)); - foreach (Level level in levels) { - foreach (Department department in departments) { - new Employee() {Level = level, Department = department, FloorNumber = 1, OfficeNumber = 2}; - } - } - tx.Complete(); - } - } - - [Test] - public void TestForProblem() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var q = Query.All() - .Where(e => e.FloorNumber==1) - .Select( - e => new PersonSimplifiedByOffice() { - OfficeNumber = e.OfficeNumber.GetValueOrDefault(), - Cost = e.Salary, - Department = e.Department, - Level = e.Level - }) - .GroupBy(g => g.OfficeNumber) - .Select( - g => new { - OfficeNumber = g.Key, - TotalCost = g.Sum(e => e.Cost), - BifOfficeCost = (g as IQueryable).Where(PersonSimplifiedByOffice.IsBigOffice).Sum(e => e.Cost), - TrainingCount = (g as IQueryable).Where(PersonSimplifiedByOffice.NeedProductTraining).Sum(e => e.Cost), - }); - q.Run(); - } - } - - [Test] - public void FlatStructureTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var q = Query.All() - .Where(e => e.FloorNumber==1) - .Select( - e => new PersonFlatByOffice() { - OfficeNumber = e.OfficeNumber.GetValueOrDefault(), - Cost = e.Salary, - Department = e.Department, - Level = e.Level - }) - .GroupBy(g => g.OfficeNumber) - .Select( - g => new { - OfficeNumber = g.Key, - TotalCost = g.Sum(e => e.Cost), - BifOfficeCost = (g as IQueryable).Where(PersonFlatByOffice.IsBigOffice).Sum(e => e.Cost), - TrainingCount = (g as IQueryable).Where(PersonFlatByOffice.NeedProductTraining).Sum(e => e.Cost), - }); - q.Run(); - } - } - - [Test] - public void DirectFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Where(e => e.OfficeNumber==1) - .Select( - e => new OfficeStatistics() { - OfficeNumber = e.OfficeNumber.GetValueOrDefault(), - Salary = e.Salary.GetValueOrDefault(), - Level = e.Level - }) - .GroupBy(g => g.OfficeNumber) - .Select( - g => new { - Floor = g.Key, - TotalCost = g.Sum(e => e.Salary), - AverageCost = g.Average(e => e.Salary), - MinCost = g.Min(e => e.Salary), - MaxCost = g.Max(e => e.Salary), - }); - query.Run(); - } - } - - [Test] - public void NestedFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Where(e => e.OfficeNumber==1) - .Select( - e => new ExtendedOfficeStatistics() { - OfficeNumber = e.OfficeNumber.GetValueOrDefault(), - Salary = e.Salary.GetValueOrDefault(), - Level = e.Level - }) - .GroupBy(g => g.OfficeNumber) - .Select( - g => new { - Floor = g.Key, - TotalCost = g.Sum(e => e.Salary), - AverageCost = g.Average(e => e.Salary), - MinCost = g.Min(e => e.Salary), - MaxCost = g.Max(e => e.Salary), - }); - query.Run(); - } - } - } -} +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.05.03 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.MemberInitWhereItIsNotSupposeToBeModel; + +namespace Xtensive.Orm.Tests.Issues.MemberInitWhereItIsNotSupposeToBeModel +{ + public enum Level { Intern, Junior, Senior, Lead } + public enum Department { RandD, It, Marketing, Sales } + + [HierarchyRoot] + public class Employee : Entity + { + [Field, Key] + public long Id { get; private set; } + [Field] + public long? FloorNumber { get; set; } + [Field] + public long? OfficeNumber { get; set; } + [Field] + public long? Salary { get; set; } + [Field] + public Level Level { get; set; } + [Field] + public Department Department { get; set; } + } + + public class PersonSimplifiedByOffice : PersonSimplified + { + public long OfficeNumber; + public static Expression> IsBigOffice = e => e.OfficeNumber < 3; + } + + public class PersonSimplified : PersonSimplified where T : PersonSimplified + { + public static Expression> Require360Eval = e => e.Department != Department.Sales && (e.Level == Level.Junior || e.Level == Level.Senior); + public static Expression> NeedProductTraining = e => e.Department != Department.It && e.Level != Level.Intern; + } + + public class PersonSimplified + { + public Level Level; + public Department Department; + public long? Cost; + } + + public class PersonFlatByOffice + { + public long OfficeNumber; + public static Expression> IsBigOffice = e => e.OfficeNumber < 3; + + public static Expression> Require360Eval = e => e.Department != Department.Sales && (e.Level == Level.Junior || e.Level == Level.Senior); + public static Expression> NeedProductTraining = e => e.Department != Department.It && e.Level != Level.Intern; + + public Level Level; + public Department Department; + public long? Cost; + } + + public class OfficeStatistics + { + public long OfficeNumber; + public Level Level; + public long Salary; + + public object this[string fieldName] + { + set + { + var fieldToSetValue = this.GetType().GetField(fieldName); + if (fieldToSetValue==null) + throw new ArgumentException(); + fieldToSetValue.SetValue(this, value); + } + } + } + + public class ExtendedOfficeStatistics : OfficeStatistics + { + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0627_FieldInitializationTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var domainConfiguration = base.BuildConfiguration(); + domainConfiguration.Types.Register(typeof(Employee).Assembly, typeof(Employee).Namespace); + domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; + return domainConfiguration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var levels = Enum.GetValues(typeof(Level)); + var departments = Enum.GetValues(typeof(Department)); + foreach (Level level in levels) { + foreach (Department department in departments) { + new Employee() {Level = level, Department = department, FloorNumber = 1, OfficeNumber = 2}; + } + } + tx.Complete(); + } + } + + [Test] + public void TestForProblem() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var q = Query.All() + .Where(e => e.FloorNumber==1) + .Select( + e => new PersonSimplifiedByOffice() { + OfficeNumber = e.OfficeNumber.GetValueOrDefault(), + Cost = e.Salary, + Department = e.Department, + Level = e.Level + }) + .GroupBy(g => g.OfficeNumber) + .Select( + g => new { + OfficeNumber = g.Key, + TotalCost = g.Sum(e => e.Cost), + BifOfficeCost = (g as IQueryable).Where(PersonSimplifiedByOffice.IsBigOffice).Sum(e => e.Cost), + TrainingCount = (g as IQueryable).Where(PersonSimplifiedByOffice.NeedProductTraining).Sum(e => e.Cost), + }); + q.Run(); + } + } + + [Test] + public void FlatStructureTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var q = Query.All() + .Where(e => e.FloorNumber==1) + .Select( + e => new PersonFlatByOffice() { + OfficeNumber = e.OfficeNumber.GetValueOrDefault(), + Cost = e.Salary, + Department = e.Department, + Level = e.Level + }) + .GroupBy(g => g.OfficeNumber) + .Select( + g => new { + OfficeNumber = g.Key, + TotalCost = g.Sum(e => e.Cost), + BifOfficeCost = (g as IQueryable).Where(PersonFlatByOffice.IsBigOffice).Sum(e => e.Cost), + TrainingCount = (g as IQueryable).Where(PersonFlatByOffice.NeedProductTraining).Sum(e => e.Cost), + }); + q.Run(); + } + } + + [Test] + public void DirectFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Where(e => e.OfficeNumber==1) + .Select( + e => new OfficeStatistics() { + OfficeNumber = e.OfficeNumber.GetValueOrDefault(), + Salary = e.Salary.GetValueOrDefault(), + Level = e.Level + }) + .GroupBy(g => g.OfficeNumber) + .Select( + g => new { + Floor = g.Key, + TotalCost = g.Sum(e => e.Salary), + AverageCost = g.Average(e => e.Salary), + MinCost = g.Min(e => e.Salary), + MaxCost = g.Max(e => e.Salary), + }); + query.Run(); + } + } + + [Test] + public void NestedFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Where(e => e.OfficeNumber==1) + .Select( + e => new ExtendedOfficeStatistics() { + OfficeNumber = e.OfficeNumber.GetValueOrDefault(), + Salary = e.Salary.GetValueOrDefault(), + Level = e.Level + }) + .GroupBy(g => g.OfficeNumber) + .Select( + g => new { + Floor = g.Key, + TotalCost = g.Sum(e => e.Salary), + AverageCost = g.Average(e => e.Salary), + MinCost = g.Min(e => e.Salary), + MaxCost = g.Max(e => e.Salary), + }); + query.Run(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_PocoClassPropertyRenitialization.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_PocoClassPropertyRenitialization.cs index 53093a2a8d..19db027d1e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_PocoClassPropertyRenitialization.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0627_PocoClassPropertyRenitialization.cs @@ -1,2263 +1,2263 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.12.31 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Rse.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0627_PocoClassPropertyRenitializationModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0627_PocoClassPropertyRenitialization : AutoBuildTest - { - private int businessUnitCount; - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var trasnaction = session.OpenTransaction()) { - List localClasses = new List(); - var buClassesLocal = ( - from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new { - businessUnit.Id, - businessUnit.QuickbooksClass - }).ToList(); - - localClasses.AddRange( - buClassesLocal.Select(bu => new QboClassModel(bu.Id, bu.QuickbooksClass))); - Assert.That(localClasses.Count, Is.Not.EqualTo(0)); - foreach (var qboClassModel in localClasses) { - Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); - } - - localClasses.Clear(); - - var buClasses = ( - from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new { - businessUnit.Id, - businessUnit.QuickbooksClass - }); - localClasses.AddRange( - buClasses.Select(bu => new QboClassModel(bu.Id, bu.QuickbooksClass))); - Assert.That(localClasses.Count, Is.Not.EqualTo(0)); - foreach (var qboClassModel in localClasses) { - Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); - } - } - } - - [Test] - public void InitializationOnlyUsingConstructorParametersTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var buClasses = (from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass)).ToList(); - - foreach (var qboClassModel in buClasses) { - Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); - Assert.That(qboClassModel.SomeOtherField, Is.Null); - } - } - } - - [Test] - public void PocoClassConstructorInsideQuery() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var buClasses = (from dto in - ( - from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass)) - where dto.Name.StartsWith(" ") - select dto.Name).ToList(); - } - } - - [Test] - public void PocoClassObjectInitializerInsideQuery() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var buClassess = (from dto in - ( - from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new Poco1() {Key = businessUnit.QuickbooksClass, Value = businessUnit.QuickbooksClass}) - where dto.Key.StartsWith(" ") - select dto.Value).ToList(); - } - } - - [Test] - public void AnonymousTypeInitializationTest() - { - Require.ProviderIsNot(StorageProvider.Firebird); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var buClasses = (from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new {businessUnit.Id, Name = businessUnit.QuickbooksClass}).ToList(); - - foreach (var qboClassModel in buClasses) - Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.True); - } - } - - [Test] - public void MixedInitialization() - { - Require.ProviderIsNot(StorageProvider.Firebird); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var buClasses = (from businessUnit in session.Query.All() - where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) - select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass) {SomeOtherField = businessUnit.QuickbooksClass}).ToList(); - foreach (var qboClassModel in buClasses) { - Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); - Assert.That(qboClassModel.SomeOtherField.StartsWith(" ") || qboClassModel.SomeOtherField.EndsWith(" "), Is.True); - } - } - } - - [Test] - public void SimpleClassConstructorInitialization01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) - Assert.That(expected.Any(el=>el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassConstructorInitialization02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(el => new Poco0()).ToList(); - var expected = session.Query.All().AsEnumerable().Select(el => new Poco0()).ToList(); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in expected) { - Assert.That(poco.Key, Is.EqualTo(default(string))); - Assert.That(poco.Value, Is.EqualTo(default(string))); - } - } - } - - [Test] - public void SimpleClassConstructorInitialization03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el=>new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) - Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassConstructorInitialization04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco0()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable().Select(el => new Poco0()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(expected.Count)); - } - } - - [Test] - public void SimpleClassConstructorInitialization05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(expected.Count)); - foreach (var poco in query) - Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassConstructorInitialization06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All().Select(el => new Poco1()).ToList(); - var expected = session.Query.All().AsEnumerable().Select(el => new Poco1()).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(expected.Count)); - } - } - - [Test] - public void SimpleClassConstructorInitialization07() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) - Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassConstructorInitialization08() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable().Select(el => new Poco1()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - } - } - - [Test] - public void SimpleClassObjectInitialization01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1 { Key = el.QuickbooksClass, Value = el.QuickbooksClass }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) - Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassObjectInitialization02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1 { Key = el.QuickbooksClass }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1 { Key = el.QuickbooksClass }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) { - var expectedPoco = expected.FirstOrDefault(el => el.Key==poco.Key); - Assert.That(expectedPoco, Is.Not.Null); - Assert.That(expectedPoco.Value, Is.EqualTo(default (string))); - Assert.That(poco.Value, Is.EqualTo(default (string))); - } - } - } - - [Test] - public void SimpleClassObjectInitialization03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - foreach (var poco in query) - Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); - } - } - - [Test] - public void SimpleClassObjectInitialization04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new Poco1 {Key = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new Poco1 {Key = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var poco in query) { - var expectedPoco = expected.FirstOrDefault(el => el.Key == poco.Key); - Assert.That(expectedPoco, Is.Not.Null); - Assert.That(expectedPoco.Value, Is.EqualTo(default(string))); - Assert.That(poco.Value, Is.EqualTo(default(string))); - } - } - } - - [Test] - public void GenericClassConstructorInitialization01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco0 in query) - Assert.That(expected.Any(el=>el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); - } - } - - [Test] - public void GenericClassConstructorInitialization02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0(el.Id, el.Id)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0(el.Id, el.Id)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco0 in query) - Assert.That(expected.Any(el => el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); - } - } - - [Test] - public void GenericClassConstructorInitialization03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0()).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0()).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in expected) { - Assert.That(genericPoco.Key, Is.EqualTo(default(string))); - Assert.That(genericPoco.Value, Is.EqualTo(default(string))); - } - - foreach (var genericPoco in query) { - Assert.That(genericPoco.Key, Is.EqualTo(default(string))); - Assert.That(genericPoco.Value, Is.EqualTo(default(string))); - } - } - } - - [Test] - public void GenericClassConstructorInitialization04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0()).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0()).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in expected) { - Assert.That(genericPoco.Key, Is.EqualTo(default(long))); - Assert.That(genericPoco.Value, Is.EqualTo(default(long))); - } - - foreach (var genericPoco in query) { - Assert.That(genericPoco.Key, Is.EqualTo(default(long))); - Assert.That(genericPoco.Value, Is.EqualTo(default(long))); - } - } - } - - [Test] - public void GenericClassConstructorInitialization05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco0 in query) - Assert.That(expected.Any(el => el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); - } - } - - [Test] - public void GenericClassConstructorInitialization06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0(el.Id, el.Id)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0(el.Id, el.Id)) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - } - } - - [Test] - public void GenericClassConstructorInitialization07() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in expected) { - Assert.That(genericPoco.Key, Is.EqualTo(default(string))); - Assert.That(genericPoco.Value, Is.EqualTo(default(string))); - } - - foreach (var genericPoco in query) { - Assert.That(genericPoco.Key, Is.EqualTo(default(string))); - Assert.That(genericPoco.Value, Is.EqualTo(default(string))); - } - } - } - - [Test] - public void GenericClassConstructorInitialization08() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco0()) - .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco0()) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in expected) { - Assert.That(genericPoco.Key, Is.EqualTo(default(long))); - Assert.That(genericPoco.Value, Is.EqualTo(default(long))); - } - - foreach (var genericPoco in query) { - Assert.That(genericPoco.Key, Is.EqualTo(default(long))); - Assert.That(genericPoco.Value, Is.EqualTo(default(long))); - } - } - } - - [Test] - public void GenericClassObjectInitialization01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - - Assert.That(query.Count, Is.EqualTo(5)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - } - } - - [Test] - public void GenericClassObjectInitialization02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) { - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - Assert.That(genericPoco.Value==default(string)); - } - } - } - - [Test] - public void GenericClassObjectInitialization03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - } - } - - [Test] - public void GenericClassObjectInitialization04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) { - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - Assert.That(genericPoco.Value==default(string)); - } - } - } - - [Test] - public void GenericClassObjectInitialization05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - } - } - - [Test] - public void GenericClassObjectInitialization06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.Id}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.Id}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) { - Assert.That(expected.Any(el => el.Key == genericPoco.Key && el.Value == genericPoco.Value)); - Assert.That(genericPoco.Value == default(long)); - } - } - } - - [Test] - public void GenericClassObjectInitialization07() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - } - } - - [Test] - public void GenericClassObjectInitialization08() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new GenericPoco1 {Key = el.Id}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new GenericPoco1 {Key = el.Id}) - .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var genericPoco in query) { - Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); - Assert.That(genericPoco.Value == default(long)); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass)) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass)) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassConstructorInitializationTest06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)) - .Select(el => new { Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo }).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected){ - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 { AdditionalInfo = el.QuickbooksClass }) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void DescendantClassObjectInitializationTest06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var query = session.Query.All() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - var expected = session.Query.All() - .AsEnumerable() - .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}) - .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); - - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - Assert.That(query.Count, Is.EqualTo(businessUnitCount)); - - foreach (var descendantPoco in expected) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - - foreach (var descendantPoco in query) { - Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); - Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); - } - } - } - - [Test] - public void AllByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .All(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AllByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .All(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AllByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .All(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AllByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .All(el => el.Name.IsNullOrEmpty())); - } - } - - [Test] - public void AllByFieldOfPoco05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .All(el => el.Name.IsNullOrEmpty()); - } - } - - - [Test] - public void AnyByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}).Any(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AnyByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .Any(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AnyByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Any(el => el.BaseName.IsNullOrEmpty()); - } - } - - [Test] - public void AnyByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Any(el => el.BaseName.IsNullOrEmpty()); - } - } - - [Test] - public void AnyByFieldOfPoco05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .Any(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void AverageByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Average(el => el.Name.Length); - } - } - - [Test] - public void AverageByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Average(el => el.Name.Length); - } - } - - [Test] - public void AverageByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Average(el => el.BaseName.Length); - } - } - - [Test] - public void AverageByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Average(el => el.BaseName.Length); - } - } - - [Test] - public void AverageByFieldOfPoco05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => session.Query.All() - .Select(e => new Poco()) - .Average(el => el.Name.Length)); - } - } - - [Test] - public void ConcatOfPocos01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Concat(session.Query.All().Select(e => new Poco {Name = e.Name})) - .ToArray(); - } - } - - [Test] - public void ConcatOfPocos02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Concat(session.Query.All().Select(e => new Poco {Name = e.Name, BaseName = e.Name})) - .ToArray(); - } - } - - [Test] - public void ConcatOfPocos03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { BaseName = e.Name }) - .Concat(session.Query.All().Select(e => new Poco { BaseName = e.Name })) - .ToArray(); - } - } - - [Test] - public void ConcatOfPocos04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .Concat(session.Query.All().Select(e => new Poco())) - .ToArray(); - } - } - - [Test] - public void CountByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Count(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void CountByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .Count(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void CountByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .Count(el => el.BaseName.IsNullOrEmpty()); - } - } - - [Test] - public void CountByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { BaseName = e.Name }) - .Count(el => el.BaseName.IsNullOrEmpty()); - } - } - - [Test] - public void CountByFieldOfPoco05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - session.Query.All() - .Select(e => new Poco()) - .Count(el => el.Name.IsNullOrEmpty()); - } - } - - [Test] - public void DistinctOfPocos01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - session.Query.All() - .Select(e => new Poco { Name = e.Name }) - .Distinct() - .ToArray(); - } - } - - [Test] - public void ExceptOfPocos01Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Except(session.Query.All() - .Select(e => new Poco {Name = e.Name})) - .ToArray(); - } - } - - [Test] - public void ExceptOfPocos02Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Except(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name})) - .ToArray(); - } - } - - [Test] - public void ExceptOfPocos03Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Except(session.Query.All() - .Select(e => new Poco {BaseName = e.Name})) - .ToArray(); - } - } - - [Test] - public void ExceptOfPocos05Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .Except(session.Query.All() - .Select(e => new Poco())) - .ToArray(); - } - } - - [Test] - public void GroupByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .GroupBy(e => e.Name) - .ToArray(); - } - } - - [Test] - public void GroupByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupBy(e => e.Name) - .ToArray(); - } - } - - [Test] - public void GroupByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupBy(e => e.BaseName) - .ToArray(); - } - } - - [Test] - public void GroupByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(()=>session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .GroupBy(e => e.Name) - .ToArray()); - } - } - - [Test] - public void GroupByFieldOfPoco05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .GroupBy(e => e.Name) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {Name = e.Name}), (poco) => poco.Name, poco => poco.Name, (poco, pocos) => new {Key = poco.Name, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.Name, poco => poco.Name, (poco, pocos) => new {Key = poco.Name, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPocos03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.Name, poco => poco.BaseName, (poco, pocos) => new {Key = poco.Name, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPocos04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.Name, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPocos05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.BaseName, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void GroupJoinOfPocos06Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .GroupJoin(session.Query.All() - .Select(e => new Poco {BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.BaseName, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) - .ToArray(); - } - } - - [Test] - public void IntersectOfPocos01Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name }) - .Except(session.Query.All() - .Select(e => new Poco { Name = e.Name })) - .ToArray(); - } - } - - [Test] - public void IntersectOfPocos02Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .Intersect(session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name })) - .ToArray(); - } - } - - [Test] - public void IntersectOfPocos03Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { BaseName = e.Name }) - .Intersect(session.Query.All() - .Select(e => new Poco { BaseName = e.Name })) - .ToArray(); - } - } - - [Test] - public void IntersectOfPocos05Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .Intersect(session.Query.All() - .Select(e => new Poco())) - .ToArray(); - } - } - - - [Test] - public void JoinOfPocos01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Join(session.Query.All() - .Select(e => new Poco {Name = e.Name}), poco => poco.Name, poco => poco.Name, (poco, poco1) => new {poco, poco1}) - .ToArray(); - } - } - - [Test] - public void JoinOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Join(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.Name, poco => poco.Name, (poco, poco1) => new {poco, poco1}) - .ToArray(); - } - } - - [Test] - public void JoinOfPocos03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Join(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.BaseName, poco => poco.Name, (poco, poco1) => new {poco, poco1}) - .ToArray(); - } - } - - [Test] - public void JoinOfPocos04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) - .Join(session.Query.All() - .Select(e => new Poco { Name = e.Name, BaseName = e.Name }), poco => poco.Name, poco => poco.BaseName, (poco, poco1) => new { poco, poco1 }) - .ToArray(); - } - } - - [Test] - public void JoinOfPocos05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Join(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.BaseName, poco => poco.BaseName, (poco, poco1) => new {poco, poco1}) - .ToArray(); - } - } - - [Test] - public void JoinOfPocos06Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Join(session.Query.All() - .Select(e => new Poco {BaseName = e.Name}), poco => poco.BaseName, poco => poco.BaseName, (poco, poco1) => new {poco, poco1}) - .ToArray(); - } - } - - [Test] - public void MaxByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Max(el => el.Name.Length); - } - } - - [Test] - public void MaxByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Max(el => el.Name.Length + el.BaseName.Length); - } - } - - [Test] - public void MaxByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Max(el => el.BaseName.Length); - } - } - - [Test] - public void MaxByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => session.Query.All() - .Select(e => new Poco()) - .Max(el => el.Name.Length)); - } - } - - [Test] - public void MinByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Min(el => el.Name.Length); - } - } - - [Test] - public void MinByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Min(el => el.Name.Length + el.BaseName.Length); - } - } - - [Test] - public void MinByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Min(el => el.BaseName.Length); - } - } - - [Test] - public void MinByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => session.Query.All() - .Select(e => new Poco()) - .Min(el => el.Name.Length)); - } - } - - [Test] - public void OrderByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .OrderBy(e => e.Name) - .ToArray(); - } - } - - [Test] - public void OrderByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .OrderBy(e => e.Name) - .ToArray(); - } - } - - [Test] - public void OrderByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .OrderBy(e => e.BaseName) - .ToArray(); - } - } - - [Test] - public void OrderByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .OrderBy(e => e.Name) - .ToArray()); - } - } - - [Test] - public void OrderByFieldOfPoco05Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - if (ProviderAllowsOrderByNull()) - Assert.DoesNotThrow(() => - session.Query.All() - .Select(e => new Poco()) - .OrderBy(e => e.Name) - .ToArray()); - else - Assert.Throws(() => - session.Query.All() - .Select(e => new Poco()) - .OrderBy(e => e.Name) - .ToArray()); - } - } - - [Test] - public void OrderByDescendingByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .OrderByDescending(e => e.Name) - .ToArray(); - } - } - - [Test] - public void OrderByDescendingByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .OrderByDescending(e => e.Name) - .ToArray(); - } - } - - [Test] - public void OrderByDescendingByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .OrderByDescending(e => e.BaseName) - .ToArray(); - } - } - - [Test] - public void OrderByDescendingByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .OrderByDescending(e => e.Name) - .ToArray()); - } - } - - [Test] - public void OrderByDescendingByFieldOfPoco05Test() - { - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql | StorageProvider.PostgreSql); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => - session.Query.All() - .Select(e => new Poco()) - .OrderByDescending(e => e.Name) - .ToArray()); - } - } - - [Test] - public void SumByFieldOfPoco01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}).Sum(el => el.Name.Length); - } - } - - [Test] - public void SumByFieldOfPoco02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}).Sum(el => el.Name.Length + el.BaseName.Length); - } - } - - [Test] - public void SumByFieldOfPoco03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}).Sum(el => el.BaseName.Length); - } - } - - [Test] - public void SumByFieldOfPoco04Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => - session.Query.All() - .Select(e => new Poco()).Sum(el => el.Name.Length)); - } - } - - [Test] - public void UnionOfPocos01Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name}) - .Union(session.Query.All() - .Select(e => new Poco {Name = e.Name})) - .ToArray(); - } - } - - [Test] - public void UnionOfPocos02Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) - .Union(session.Query.All() - .Select(e => new Poco {Name = e.Name, BaseName = e.Name})) - .ToArray(); - } - } - - [Test] - public void UnionOfPocos03Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco {BaseName = e.Name}) - .Union(session.Query.All() - .Select(e => new Poco {BaseName = e.Name})) - .ToArray(); - } - } - - [Test] - public void UnionOfPocos05Test() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Query.All() - .Select(e => new Poco()) - .Union(session.Query.All() - .Select(e => new Poco())) - .ToArray(); - } - } - - private bool ProviderAllowsOrderByNull() - { - var providers = new[] {WellKnown.Provider.PostgreSql}; - return providers.Contains(ProviderInfo.ProviderName); - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new BusinessUnit {Active = true, QuickbooksClass = "jdfhgkjhfdgjkhjhjh "}; - new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkgjkhjhjh "}; - new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkjhjdhfgfdgjkhjhjh"}; - new BusinessUnit {Active = true, QuickbooksClass = "dfhgkaaaaajkhjhjh "}; - new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkjhfdgaaaaajh"}; - - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - new TestEntity {Name = Guid.NewGuid().ToString()}; - - new TestEntity {Name = "klegjkrlksl hdfhgh jhthkjhjth "}; - new TestEntity {Name = " ohgoih oierigh oihreho hoiherigh oherg"}; - new TestEntity {Name = "jshfhjhgjkherjghewogerogp reopertgo "}; - new TestEntity {Name = "hjwroiheorihi oerhoigho hohergoh "}; - new TestEntity {Name = "wieoru ioritgierh oiheroihg hoidfhgdf"}; - new TestEntity {Name = "joijie oersidfgo dhhri "}; - new TestEntity {Name = "fdg lhwoih jngoj bhoihiwht e"}; - new TestEntity {Name = "rh ihh4i3hi ohierth094t pjpigd"}; - new TestEntity {Name = "i049 hi0 4th 0fgi08 h03gh "}; - businessUnitCount = 5; - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (BusinessUnit).Assembly, typeof(BusinessUnit).Namespace); - return configuration; - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0627_PocoClassPropertyRenitializationModel -{ - [HierarchyRoot] - public class BusinessUnit : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - [Field] - public string QuickbooksClass { get; set; } - } - - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public Guid Id { get; set; } - - [Field] - public string Name { get; set; } - } - - public class Poco0 - { - public string Key { get; private set; } - - public string Value { get; private set; } - - public Poco0() - { - Key = default (string); - Value = default (string); - } - - public Poco0(string key, string value) - { - Key = key; - Value = value; - } - } - - public class Poco1 - { - public string Key { get; set; } - - public string Value { get; set; } - - public Poco1() - { - Key = default (string); - Value = default (string); - } - - public Poco1(string key, string value) - { - Key = key; - Value = value; - } - } - - public class GenericPoco0 - { - public TKey Key { get; private set; } - - public TValue Value { get; private set; } - - public GenericPoco0() - { - Key = default (TKey); - Value = default (TValue); - } - - public GenericPoco0(TKey key, TValue value) - { - Key = key; - Value = value; - } - } - - public class GenericPoco1 - { - public TKey Key { get; set; } - - public TValue Value { get; set; } - - public GenericPoco1() - { - Key = default (TKey); - Value = default (TValue); - } - - public GenericPoco1(TKey key, TValue value) - { - Key = key; - Value = value; - } - } - - public class BasePoco0 - { - public string Key { get; private set; } - - public string Value { get; private set; } - - public BasePoco0() - { - Key = default(string); - Value = default(string); - } - - public BasePoco0(string key, string value) - { - Key = key; - Value = value; - } - } - - public sealed class DescendantPoco0 : BasePoco0 - { - public string AdditionalInfo { get; private set; } - - public DescendantPoco0() - { - AdditionalInfo = string.Empty; - } - - public DescendantPoco0(string additionalInfo) - { - AdditionalInfo = additionalInfo; - } - - public DescendantPoco0(string key, string value) - : base(key, value) - { - AdditionalInfo = string.Empty; - } - - public DescendantPoco0(string key, string value, string additionalInfo) - : base(key, value) - { - AdditionalInfo = additionalInfo; - } - } - - public class BasePoco1 - { - public string Key { get; set; } - - public string Value { get; set; } - - public BasePoco1() - { - Key = default(string); - Value = default(string); - } - - public BasePoco1(string key, string value) - { - Key = key; - Value = value; - } - } - - public sealed class DescendantPoco1 : BasePoco1 - { - public string AdditionalInfo { get; set; } - - public DescendantPoco1() - { - AdditionalInfo = default(string); - } - - public DescendantPoco1(string additionalInfo) - { - AdditionalInfo = additionalInfo; - } - - public DescendantPoco1(string key, string value) - : base(key, value) - { - AdditionalInfo = default(string); - } - - public DescendantPoco1(string key, string value, string additionalInfo) - : base(key, value) - { - AdditionalInfo = additionalInfo; - } - } - - public class Poco : PocoBase - { - public string Name { get; set; } - } - - public class PocoBase - { - public string BaseName { get; set; } - } - - public class QboClassModel - { - public long Id { get; private set; } - - public string Name { get; private set; } - - public string SomeOtherField { get; internal set; } - - public QboClassModel(long id, string name) - { - Id = id; - Name = name.Trim(); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.12.31 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Rse.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0627_PocoClassPropertyRenitializationModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0627_PocoClassPropertyRenitialization : AutoBuildTest + { + private int businessUnitCount; + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var trasnaction = session.OpenTransaction()) { + List localClasses = new List(); + var buClassesLocal = ( + from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new { + businessUnit.Id, + businessUnit.QuickbooksClass + }).ToList(); + + localClasses.AddRange( + buClassesLocal.Select(bu => new QboClassModel(bu.Id, bu.QuickbooksClass))); + Assert.That(localClasses.Count, Is.Not.EqualTo(0)); + foreach (var qboClassModel in localClasses) { + Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); + } + + localClasses.Clear(); + + var buClasses = ( + from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new { + businessUnit.Id, + businessUnit.QuickbooksClass + }); + localClasses.AddRange( + buClasses.Select(bu => new QboClassModel(bu.Id, bu.QuickbooksClass))); + Assert.That(localClasses.Count, Is.Not.EqualTo(0)); + foreach (var qboClassModel in localClasses) { + Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); + } + } + } + + [Test] + public void InitializationOnlyUsingConstructorParametersTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var buClasses = (from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass)).ToList(); + + foreach (var qboClassModel in buClasses) { + Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); + Assert.That(qboClassModel.SomeOtherField, Is.Null); + } + } + } + + [Test] + public void PocoClassConstructorInsideQuery() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var buClasses = (from dto in + ( + from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass)) + where dto.Name.StartsWith(" ") + select dto.Name).ToList(); + } + } + + [Test] + public void PocoClassObjectInitializerInsideQuery() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var buClassess = (from dto in + ( + from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new Poco1() {Key = businessUnit.QuickbooksClass, Value = businessUnit.QuickbooksClass}) + where dto.Key.StartsWith(" ") + select dto.Value).ToList(); + } + } + + [Test] + public void AnonymousTypeInitializationTest() + { + Require.ProviderIsNot(StorageProvider.Firebird); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var buClasses = (from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new {businessUnit.Id, Name = businessUnit.QuickbooksClass}).ToList(); + + foreach (var qboClassModel in buClasses) + Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.True); + } + } + + [Test] + public void MixedInitialization() + { + Require.ProviderIsNot(StorageProvider.Firebird); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var buClasses = (from businessUnit in session.Query.All() + where businessUnit.Active && !string.IsNullOrEmpty(businessUnit.QuickbooksClass) + select new QboClassModel(businessUnit.Id, businessUnit.QuickbooksClass) {SomeOtherField = businessUnit.QuickbooksClass}).ToList(); + foreach (var qboClassModel in buClasses) { + Assert.That(qboClassModel.Name.StartsWith(" ") || qboClassModel.Name.EndsWith(" "), Is.False); + Assert.That(qboClassModel.SomeOtherField.StartsWith(" ") || qboClassModel.SomeOtherField.EndsWith(" "), Is.True); + } + } + } + + [Test] + public void SimpleClassConstructorInitialization01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) + Assert.That(expected.Any(el=>el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassConstructorInitialization02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(el => new Poco0()).ToList(); + var expected = session.Query.All().AsEnumerable().Select(el => new Poco0()).ToList(); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in expected) { + Assert.That(poco.Key, Is.EqualTo(default(string))); + Assert.That(poco.Value, Is.EqualTo(default(string))); + } + } + } + + [Test] + public void SimpleClassConstructorInitialization03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el=>new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) + Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassConstructorInitialization04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco0()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable().Select(el => new Poco0()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(expected.Count)); + } + } + + [Test] + public void SimpleClassConstructorInitialization05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(expected.Count)); + foreach (var poco in query) + Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassConstructorInitialization06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All().Select(el => new Poco1()).ToList(); + var expected = session.Query.All().AsEnumerable().Select(el => new Poco1()).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(expected.Count)); + } + } + + [Test] + public void SimpleClassConstructorInitialization07() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) + Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassConstructorInitialization08() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable().Select(el => new Poco1()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + } + } + + [Test] + public void SimpleClassObjectInitialization01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1 { Key = el.QuickbooksClass, Value = el.QuickbooksClass }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) + Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassObjectInitialization02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1 { Key = el.QuickbooksClass }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1 { Key = el.QuickbooksClass }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) { + var expectedPoco = expected.FirstOrDefault(el => el.Key==poco.Key); + Assert.That(expectedPoco, Is.Not.Null); + Assert.That(expectedPoco.Value, Is.EqualTo(default (string))); + Assert.That(poco.Value, Is.EqualTo(default (string))); + } + } + } + + [Test] + public void SimpleClassObjectInitialization03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + foreach (var poco in query) + Assert.That(expected.Any(el => el.Key==poco.Key && el.Value==poco.Value), Is.True); + } + } + + [Test] + public void SimpleClassObjectInitialization04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new Poco1 {Key = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new Poco1 {Key = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var poco in query) { + var expectedPoco = expected.FirstOrDefault(el => el.Key == poco.Key); + Assert.That(expectedPoco, Is.Not.Null); + Assert.That(expectedPoco.Value, Is.EqualTo(default(string))); + Assert.That(poco.Value, Is.EqualTo(default(string))); + } + } + } + + [Test] + public void GenericClassConstructorInitialization01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco0 in query) + Assert.That(expected.Any(el=>el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); + } + } + + [Test] + public void GenericClassConstructorInitialization02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0(el.Id, el.Id)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0(el.Id, el.Id)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco0 in query) + Assert.That(expected.Any(el => el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); + } + } + + [Test] + public void GenericClassConstructorInitialization03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0()).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0()).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in expected) { + Assert.That(genericPoco.Key, Is.EqualTo(default(string))); + Assert.That(genericPoco.Value, Is.EqualTo(default(string))); + } + + foreach (var genericPoco in query) { + Assert.That(genericPoco.Key, Is.EqualTo(default(string))); + Assert.That(genericPoco.Value, Is.EqualTo(default(string))); + } + } + } + + [Test] + public void GenericClassConstructorInitialization04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0()).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0()).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in expected) { + Assert.That(genericPoco.Key, Is.EqualTo(default(long))); + Assert.That(genericPoco.Value, Is.EqualTo(default(long))); + } + + foreach (var genericPoco in query) { + Assert.That(genericPoco.Key, Is.EqualTo(default(long))); + Assert.That(genericPoco.Value, Is.EqualTo(default(long))); + } + } + } + + [Test] + public void GenericClassConstructorInitialization05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco0 in query) + Assert.That(expected.Any(el => el.Key==genericPoco0.Key && el.Value==genericPoco0.Value)); + } + } + + [Test] + public void GenericClassConstructorInitialization06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0(el.Id, el.Id)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0(el.Id, el.Id)) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + } + } + + [Test] + public void GenericClassConstructorInitialization07() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in expected) { + Assert.That(genericPoco.Key, Is.EqualTo(default(string))); + Assert.That(genericPoco.Value, Is.EqualTo(default(string))); + } + + foreach (var genericPoco in query) { + Assert.That(genericPoco.Key, Is.EqualTo(default(string))); + Assert.That(genericPoco.Value, Is.EqualTo(default(string))); + } + } + } + + [Test] + public void GenericClassConstructorInitialization08() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco0()) + .Select(el => new { Key = el.Key, Value = el.Value }).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco0()) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in expected) { + Assert.That(genericPoco.Key, Is.EqualTo(default(long))); + Assert.That(genericPoco.Value, Is.EqualTo(default(long))); + } + + foreach (var genericPoco in query) { + Assert.That(genericPoco.Key, Is.EqualTo(default(long))); + Assert.That(genericPoco.Value, Is.EqualTo(default(long))); + } + } + } + + [Test] + public void GenericClassObjectInitialization01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + + Assert.That(query.Count, Is.EqualTo(5)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + } + } + + [Test] + public void GenericClassObjectInitialization02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) { + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + Assert.That(genericPoco.Value==default(string)); + } + } + } + + [Test] + public void GenericClassObjectInitialization03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + } + } + + [Test] + public void GenericClassObjectInitialization04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) { + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + Assert.That(genericPoco.Value==default(string)); + } + } + } + + [Test] + public void GenericClassObjectInitialization05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + } + } + + [Test] + public void GenericClassObjectInitialization06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.Id}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.Id}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) { + Assert.That(expected.Any(el => el.Key == genericPoco.Key && el.Value == genericPoco.Value)); + Assert.That(genericPoco.Value == default(long)); + } + } + } + + [Test] + public void GenericClassObjectInitialization07() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.Id, Value = el.Id}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + } + } + + [Test] + public void GenericClassObjectInitialization08() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new GenericPoco1 {Key = el.Id}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new GenericPoco1 {Key = el.Id}) + .Select(el => new {Key = el.Key, Value = el.Value}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var genericPoco in query) { + Assert.That(expected.Any(el => el.Key==genericPoco.Key && el.Value==genericPoco.Value)); + Assert.That(genericPoco.Value == default(long)); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass)) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass)) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassConstructorInitializationTest06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco0(el.QuickbooksClass, el.QuickbooksClass, el.QuickbooksClass)) + .Select(el => new { Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo }).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(expected.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected){ + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 { AdditionalInfo = el.QuickbooksClass }) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.True); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.True); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void DescendantClassObjectInitializationTest06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var query = session.Query.All() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + var expected = session.Query.All() + .AsEnumerable() + .Select(el => new DescendantPoco1 {AdditionalInfo = el.QuickbooksClass, Key = el.QuickbooksClass, Value = el.QuickbooksClass}) + .Select(el => new {Key = el.Key, Value = el.Value, AdditionalInfo = el.AdditionalInfo}).ToList(); + + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + Assert.That(query.Count, Is.EqualTo(businessUnitCount)); + + foreach (var descendantPoco in expected) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + + foreach (var descendantPoco in query) { + Assert.That(string.IsNullOrEmpty(descendantPoco.AdditionalInfo), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Key), Is.False); + Assert.That(string.IsNullOrEmpty(descendantPoco.Value), Is.False); + } + } + } + + [Test] + public void AllByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .All(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AllByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .All(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AllByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .All(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AllByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .All(el => el.Name.IsNullOrEmpty())); + } + } + + [Test] + public void AllByFieldOfPoco05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .All(el => el.Name.IsNullOrEmpty()); + } + } + + + [Test] + public void AnyByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}).Any(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AnyByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .Any(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AnyByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Any(el => el.BaseName.IsNullOrEmpty()); + } + } + + [Test] + public void AnyByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Any(el => el.BaseName.IsNullOrEmpty()); + } + } + + [Test] + public void AnyByFieldOfPoco05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .Any(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void AverageByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Average(el => el.Name.Length); + } + } + + [Test] + public void AverageByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Average(el => el.Name.Length); + } + } + + [Test] + public void AverageByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Average(el => el.BaseName.Length); + } + } + + [Test] + public void AverageByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Average(el => el.BaseName.Length); + } + } + + [Test] + public void AverageByFieldOfPoco05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => session.Query.All() + .Select(e => new Poco()) + .Average(el => el.Name.Length)); + } + } + + [Test] + public void ConcatOfPocos01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Concat(session.Query.All().Select(e => new Poco {Name = e.Name})) + .ToArray(); + } + } + + [Test] + public void ConcatOfPocos02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Concat(session.Query.All().Select(e => new Poco {Name = e.Name, BaseName = e.Name})) + .ToArray(); + } + } + + [Test] + public void ConcatOfPocos03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { BaseName = e.Name }) + .Concat(session.Query.All().Select(e => new Poco { BaseName = e.Name })) + .ToArray(); + } + } + + [Test] + public void ConcatOfPocos04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .Concat(session.Query.All().Select(e => new Poco())) + .ToArray(); + } + } + + [Test] + public void CountByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Count(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void CountByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .Count(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void CountByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .Count(el => el.BaseName.IsNullOrEmpty()); + } + } + + [Test] + public void CountByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { BaseName = e.Name }) + .Count(el => el.BaseName.IsNullOrEmpty()); + } + } + + [Test] + public void CountByFieldOfPoco05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + session.Query.All() + .Select(e => new Poco()) + .Count(el => el.Name.IsNullOrEmpty()); + } + } + + [Test] + public void DistinctOfPocos01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + session.Query.All() + .Select(e => new Poco { Name = e.Name }) + .Distinct() + .ToArray(); + } + } + + [Test] + public void ExceptOfPocos01Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Except(session.Query.All() + .Select(e => new Poco {Name = e.Name})) + .ToArray(); + } + } + + [Test] + public void ExceptOfPocos02Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Except(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name})) + .ToArray(); + } + } + + [Test] + public void ExceptOfPocos03Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Except(session.Query.All() + .Select(e => new Poco {BaseName = e.Name})) + .ToArray(); + } + } + + [Test] + public void ExceptOfPocos05Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .Except(session.Query.All() + .Select(e => new Poco())) + .ToArray(); + } + } + + [Test] + public void GroupByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .GroupBy(e => e.Name) + .ToArray(); + } + } + + [Test] + public void GroupByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupBy(e => e.Name) + .ToArray(); + } + } + + [Test] + public void GroupByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupBy(e => e.BaseName) + .ToArray(); + } + } + + [Test] + public void GroupByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(()=>session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .GroupBy(e => e.Name) + .ToArray()); + } + } + + [Test] + public void GroupByFieldOfPoco05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .GroupBy(e => e.Name) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {Name = e.Name}), (poco) => poco.Name, poco => poco.Name, (poco, pocos) => new {Key = poco.Name, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.Name, poco => poco.Name, (poco, pocos) => new {Key = poco.Name, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPocos03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.Name, poco => poco.BaseName, (poco, pocos) => new {Key = poco.Name, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPocos04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.Name, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPocos05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.BaseName, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void GroupJoinOfPocos06Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .GroupJoin(session.Query.All() + .Select(e => new Poco {BaseName = e.Name}), (poco) => poco.BaseName, poco => poco.BaseName, (poco, pocos) => new {Key = poco.BaseName, Values = pocos}) + .ToArray(); + } + } + + [Test] + public void IntersectOfPocos01Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name }) + .Except(session.Query.All() + .Select(e => new Poco { Name = e.Name })) + .ToArray(); + } + } + + [Test] + public void IntersectOfPocos02Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .Intersect(session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name })) + .ToArray(); + } + } + + [Test] + public void IntersectOfPocos03Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { BaseName = e.Name }) + .Intersect(session.Query.All() + .Select(e => new Poco { BaseName = e.Name })) + .ToArray(); + } + } + + [Test] + public void IntersectOfPocos05Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .Intersect(session.Query.All() + .Select(e => new Poco())) + .ToArray(); + } + } + + + [Test] + public void JoinOfPocos01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Join(session.Query.All() + .Select(e => new Poco {Name = e.Name}), poco => poco.Name, poco => poco.Name, (poco, poco1) => new {poco, poco1}) + .ToArray(); + } + } + + [Test] + public void JoinOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Join(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.Name, poco => poco.Name, (poco, poco1) => new {poco, poco1}) + .ToArray(); + } + } + + [Test] + public void JoinOfPocos03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Join(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.BaseName, poco => poco.Name, (poco, poco1) => new {poco, poco1}) + .ToArray(); + } + } + + [Test] + public void JoinOfPocos04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }) + .Join(session.Query.All() + .Select(e => new Poco { Name = e.Name, BaseName = e.Name }), poco => poco.Name, poco => poco.BaseName, (poco, poco1) => new { poco, poco1 }) + .ToArray(); + } + } + + [Test] + public void JoinOfPocos05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Join(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}), poco => poco.BaseName, poco => poco.BaseName, (poco, poco1) => new {poco, poco1}) + .ToArray(); + } + } + + [Test] + public void JoinOfPocos06Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Join(session.Query.All() + .Select(e => new Poco {BaseName = e.Name}), poco => poco.BaseName, poco => poco.BaseName, (poco, poco1) => new {poco, poco1}) + .ToArray(); + } + } + + [Test] + public void MaxByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Max(el => el.Name.Length); + } + } + + [Test] + public void MaxByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Max(el => el.Name.Length + el.BaseName.Length); + } + } + + [Test] + public void MaxByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Max(el => el.BaseName.Length); + } + } + + [Test] + public void MaxByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => session.Query.All() + .Select(e => new Poco()) + .Max(el => el.Name.Length)); + } + } + + [Test] + public void MinByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Min(el => el.Name.Length); + } + } + + [Test] + public void MinByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Min(el => el.Name.Length + el.BaseName.Length); + } + } + + [Test] + public void MinByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Min(el => el.BaseName.Length); + } + } + + [Test] + public void MinByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => session.Query.All() + .Select(e => new Poco()) + .Min(el => el.Name.Length)); + } + } + + [Test] + public void OrderByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .OrderBy(e => e.Name) + .ToArray(); + } + } + + [Test] + public void OrderByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .OrderBy(e => e.Name) + .ToArray(); + } + } + + [Test] + public void OrderByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .OrderBy(e => e.BaseName) + .ToArray(); + } + } + + [Test] + public void OrderByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .OrderBy(e => e.Name) + .ToArray()); + } + } + + [Test] + public void OrderByFieldOfPoco05Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + if (ProviderAllowsOrderByNull()) + Assert.DoesNotThrow(() => + session.Query.All() + .Select(e => new Poco()) + .OrderBy(e => e.Name) + .ToArray()); + else + Assert.Throws(() => + session.Query.All() + .Select(e => new Poco()) + .OrderBy(e => e.Name) + .ToArray()); + } + } + + [Test] + public void OrderByDescendingByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .OrderByDescending(e => e.Name) + .ToArray(); + } + } + + [Test] + public void OrderByDescendingByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .OrderByDescending(e => e.Name) + .ToArray(); + } + } + + [Test] + public void OrderByDescendingByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .OrderByDescending(e => e.BaseName) + .ToArray(); + } + } + + [Test] + public void OrderByDescendingByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .OrderByDescending(e => e.Name) + .ToArray()); + } + } + + [Test] + public void OrderByDescendingByFieldOfPoco05Test() + { + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql | StorageProvider.PostgreSql); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => + session.Query.All() + .Select(e => new Poco()) + .OrderByDescending(e => e.Name) + .ToArray()); + } + } + + [Test] + public void SumByFieldOfPoco01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}).Sum(el => el.Name.Length); + } + } + + [Test] + public void SumByFieldOfPoco02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}).Sum(el => el.Name.Length + el.BaseName.Length); + } + } + + [Test] + public void SumByFieldOfPoco03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}).Sum(el => el.BaseName.Length); + } + } + + [Test] + public void SumByFieldOfPoco04Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => + session.Query.All() + .Select(e => new Poco()).Sum(el => el.Name.Length)); + } + } + + [Test] + public void UnionOfPocos01Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name}) + .Union(session.Query.All() + .Select(e => new Poco {Name = e.Name})) + .ToArray(); + } + } + + [Test] + public void UnionOfPocos02Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name}) + .Union(session.Query.All() + .Select(e => new Poco {Name = e.Name, BaseName = e.Name})) + .ToArray(); + } + } + + [Test] + public void UnionOfPocos03Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco {BaseName = e.Name}) + .Union(session.Query.All() + .Select(e => new Poco {BaseName = e.Name})) + .ToArray(); + } + } + + [Test] + public void UnionOfPocos05Test() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Query.All() + .Select(e => new Poco()) + .Union(session.Query.All() + .Select(e => new Poco())) + .ToArray(); + } + } + + private bool ProviderAllowsOrderByNull() + { + var providers = new[] {WellKnown.Provider.PostgreSql}; + return providers.Contains(ProviderInfo.ProviderName); + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new BusinessUnit {Active = true, QuickbooksClass = "jdfhgkjhfdgjkhjhjh "}; + new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkgjkhjhjh "}; + new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkjhjdhfgfdgjkhjhjh"}; + new BusinessUnit {Active = true, QuickbooksClass = "dfhgkaaaaajkhjhjh "}; + new BusinessUnit {Active = true, QuickbooksClass = " jdfhgkjhfdgaaaaajh"}; + + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + new TestEntity {Name = Guid.NewGuid().ToString()}; + + new TestEntity {Name = "klegjkrlksl hdfhgh jhthkjhjth "}; + new TestEntity {Name = " ohgoih oierigh oihreho hoiherigh oherg"}; + new TestEntity {Name = "jshfhjhgjkherjghewogerogp reopertgo "}; + new TestEntity {Name = "hjwroiheorihi oerhoigho hohergoh "}; + new TestEntity {Name = "wieoru ioritgierh oiheroihg hoidfhgdf"}; + new TestEntity {Name = "joijie oersidfgo dhhri "}; + new TestEntity {Name = "fdg lhwoih jngoj bhoihiwht e"}; + new TestEntity {Name = "rh ihh4i3hi ohierth094t pjpigd"}; + new TestEntity {Name = "i049 hi0 4th 0fgi08 h03gh "}; + businessUnitCount = 5; + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (BusinessUnit).Assembly, typeof(BusinessUnit).Namespace); + return configuration; + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0627_PocoClassPropertyRenitializationModel +{ + [HierarchyRoot] + public class BusinessUnit : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + [Field] + public string QuickbooksClass { get; set; } + } + + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public Guid Id { get; set; } + + [Field] + public string Name { get; set; } + } + + public class Poco0 + { + public string Key { get; private set; } + + public string Value { get; private set; } + + public Poco0() + { + Key = default (string); + Value = default (string); + } + + public Poco0(string key, string value) + { + Key = key; + Value = value; + } + } + + public class Poco1 + { + public string Key { get; set; } + + public string Value { get; set; } + + public Poco1() + { + Key = default (string); + Value = default (string); + } + + public Poco1(string key, string value) + { + Key = key; + Value = value; + } + } + + public class GenericPoco0 + { + public TKey Key { get; private set; } + + public TValue Value { get; private set; } + + public GenericPoco0() + { + Key = default (TKey); + Value = default (TValue); + } + + public GenericPoco0(TKey key, TValue value) + { + Key = key; + Value = value; + } + } + + public class GenericPoco1 + { + public TKey Key { get; set; } + + public TValue Value { get; set; } + + public GenericPoco1() + { + Key = default (TKey); + Value = default (TValue); + } + + public GenericPoco1(TKey key, TValue value) + { + Key = key; + Value = value; + } + } + + public class BasePoco0 + { + public string Key { get; private set; } + + public string Value { get; private set; } + + public BasePoco0() + { + Key = default(string); + Value = default(string); + } + + public BasePoco0(string key, string value) + { + Key = key; + Value = value; + } + } + + public sealed class DescendantPoco0 : BasePoco0 + { + public string AdditionalInfo { get; private set; } + + public DescendantPoco0() + { + AdditionalInfo = string.Empty; + } + + public DescendantPoco0(string additionalInfo) + { + AdditionalInfo = additionalInfo; + } + + public DescendantPoco0(string key, string value) + : base(key, value) + { + AdditionalInfo = string.Empty; + } + + public DescendantPoco0(string key, string value, string additionalInfo) + : base(key, value) + { + AdditionalInfo = additionalInfo; + } + } + + public class BasePoco1 + { + public string Key { get; set; } + + public string Value { get; set; } + + public BasePoco1() + { + Key = default(string); + Value = default(string); + } + + public BasePoco1(string key, string value) + { + Key = key; + Value = value; + } + } + + public sealed class DescendantPoco1 : BasePoco1 + { + public string AdditionalInfo { get; set; } + + public DescendantPoco1() + { + AdditionalInfo = default(string); + } + + public DescendantPoco1(string additionalInfo) + { + AdditionalInfo = additionalInfo; + } + + public DescendantPoco1(string key, string value) + : base(key, value) + { + AdditionalInfo = default(string); + } + + public DescendantPoco1(string key, string value, string additionalInfo) + : base(key, value) + { + AdditionalInfo = additionalInfo; + } + } + + public class Poco : PocoBase + { + public string Name { get; set; } + } + + public class PocoBase + { + public string BaseName { get; set; } + } + + public class QboClassModel + { + public long Id { get; private set; } + + public string Name { get; private set; } + + public string SomeOtherField { get; internal set; } + + public QboClassModel(long id, string name) + { + Id = id; + Name = name.Trim(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes.cs index c768df57df..b6edcdbc4b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes.cs @@ -1,1278 +1,1278 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2016.03.31 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel; -using Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel.Populator; -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes : AutoBuildTest - { - [Test] - public void ColumnsOrderTestTest() - { - foreach (var type in Domain.Model.Types.Where(t=>t.IsEntity && !t.IsSystem)) { - var index = type.Indexes.PrimaryIndex; - int currentIndex = -1; - foreach (var indexColumn in index.Columns) { - var i = type.Columns.IndexOf(indexColumn); - Assert.That(i > currentIndex, Is.True); - currentIndex = i; - } - } - } - - [Test] - public void SelectInterfaceFieldTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - IStoredMaterialCreator[] creators = null; - Assert.DoesNotThrow(() => creators = session.Query.All().Select(el => el.Creator).ToArray()); - Assert.That(creators.Length, Is.EqualTo(2)); - foreach (var creator in creators) { - Assert.That(creator, Is.Not.Null); - var simple = creator as SimpleStoredMaterialCreator; - var complex = creator as ComplexStoredMaterialCreator; - Assert.That(simple!=null || complex!=null, Is.True); - } - } - } - - [Test] - public void SelectInterfaceDirectlyTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - IAction[] actions = null; - Assert.DoesNotThrow(()=> actions = session.Query.All().ToArray()); - Assert.That(actions.Length, Is.EqualTo(2)); - foreach (var action in actions) { - Assert.That(action, Is.Not.Null); - var simple = action as SimpleStoredMaterialCreator; - var complex = action as ComplexStoredMaterialCreator; - Assert.That(simple!=null || complex!=null, Is.True); - } - - ISomeIntermediateInterface[] intermediateThings = null; - Assert.DoesNotThrow(() => intermediateThings = session.Query.All().ToArray()); - Assert.That(intermediateThings.Length, Is.EqualTo(2)); - foreach (var thing in intermediateThings) { - Assert.That(thing, Is.Not.Null); - var simple = thing as SimpleStoredMaterialCreator; - var complex = thing as ComplexStoredMaterialCreator; - Assert.That(simple!=null || complex!=null, Is.True); - } - - IStoredObjectCreator[] objectCreators = null; - Assert.DoesNotThrow(() => objectCreators = session.Query.All().ToArray()); - Assert.That(objectCreators.Length, Is.EqualTo(2)); - foreach (var creator in objectCreators) { - Assert.That(creator, Is.Not.Null); - var simple = creator as SimpleStoredMaterialCreator; - var complex = creator as ComplexStoredMaterialCreator; - Assert.That(simple!=null || complex!=null, Is.True); - } - - IStoredMaterialCreator[] materialCreators = null; - Assert.DoesNotThrow(() => materialCreators = session.Query.All().ToArray()); - Assert.That(materialCreators.Length, Is.EqualTo(2)); - foreach (var creator in materialCreators) { - Assert.That(creator, Is.Not.Null); - var simple = creator as SimpleStoredMaterialCreator; - var complex = creator as ComplexStoredMaterialCreator; - Assert.That(simple!=null || complex!=null, Is.True); - } - } - } - - [Test] - public void SelectInterfaceFieldAdditonalTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AHField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AHandEField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.EField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.EandAHField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HAEField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HAField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HEAField).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HField).ToArray()); - } - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new Populator(session).Populate(); - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (StoredMaterialLot).Assembly, typeof (StoredMaterialLot).Namespace); - return configuration; - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel -{ - namespace Populator - { - internal sealed class Populator - { - public Session Session { get; private set; } - - public void Populate() - { - PopulateUserCaseRelatedData(); - PopulateExtraCasesRelatedData(); - } - - private void PopulateUserCaseRelatedData() - { - var simpleStoredMaterialCreator = new SimpleStoredMaterialCreator { - ActionState = ActionState.State1, - IgnoreLockedForInput = true, - IgnoreLockedInBeam = true, - IntermediateInterfaceText = "SimpleStoredMaterialCreator:IntemediateText", - }; - - var complexStoredMaterialCreator = new ComplexStoredMaterialCreator { - ActionState = ActionState.State1, - IgnoreLockedForInput = false, - IgnoreLockedInBeam = false, - IntermediateInterfaceText = "ComplexStoredMaterialCreator:IntemediateText", - FieldWhichMakesItComplex = "CompexStoredMaterialCreator:ComplexFieldText" - }; - - new StoredMaterialLot { - SomeNonPersistentProperty = "Text which will be ommited because it's non-persistent field", - Creator = simpleStoredMaterialCreator, - }; - - new StoredMaterialLot { - SomeNonPersistentProperty = "Text which willbe ommited because of non-persistence", - Creator = complexStoredMaterialCreator - }; - } - - private void PopulateExtraCasesRelatedData() - { - const int testDataCount = 10; - var randomizer = new Random(); - var testEntities = GetSimpleTestEntities(testDataCount); - var testStructures = GetSimpleStructures(testDataCount); - - Func getEntityAction = () => testEntities[randomizer.Next(0, testDataCount)]; - Func getStructureAction = () => testStructures[randomizer.Next(0, testDataCount)]; - - PopulateZeroLevelEntities(getEntityAction, getStructureAction); - PopulateFirstLevelEntities(getEntityAction, getStructureAction); - PopulateSecondLevelEntities(getEntityAction, getStructureAction); - PopulateThirdLevelEntities(getEntityAction, getStructureAction); - PopulateContainers(); - } - - private void PopulateZeroLevelEntities(Func entityProvider, Func structureProvider) - { - new ACorrectOrder { - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 10, - AStringField = "jdfhkjghjdfhgjhdf", - AStructureField = structureProvider.Invoke() - }; - - new AIncorrectOrder { - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State2, - AIntField = 10, - AStringField = "jdfhkjghjdfhgjhdf", - AStructureField = structureProvider.Invoke() - }; - - new ECorrectOrder { - EBoolField = false, - EEntityField = entityProvider.Invoke(), - EEnumField = ActionState.State1, - EIntField = 10, - EStringField = "jdfhkjghjdfhgjhdf", - EStructureField = structureProvider.Invoke() - }; - - new EIncorrectOrder { - EBoolField = false, - EEntityField = entityProvider.Invoke(), - EEnumField = ActionState.State2, - EIntField = 10, - EStringField = "jdfhkjghjdfhgjhdf", - EStructureField = structureProvider.Invoke() - }; - - new HCorrectOrder { - HBoolField = true, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 10, - HStringField = "jdfhkjghjdfhgjhdf", - HStructureField = structureProvider.Invoke() - }; - - new HIncorrectOrder { - HBoolField = true, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 10, - HStringField = "jdfhkjghjdfhgjhdf", - HStructureField = structureProvider.Invoke() - }; - } - - private void PopulateFirstLevelEntities(Func entityProvider, Func structureProvider) - { - new AHCorrectOrder { - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 11, - AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - AStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 11, - HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - HStructureField = structureProvider.Invoke(), - }; - - new AHIncorrectOrder { - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 11, - AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - AStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 11, - HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - HStructureField = structureProvider.Invoke(), - }; - - new HACorrectOrder { - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 11, - AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - AStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 11, - HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - HStructureField = structureProvider.Invoke(), - }; - - new HAIncorrectOrder { - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 11, - AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - AStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State1, - HIntField = 11, - HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", - HStructureField = structureProvider.Invoke(), - }; - } - - private void PopulateSecondLevelEntities(Func entityProvider, Func structureProvider) - { - new HAECorrectOrder { - HAEBoolField = true, - HAEEntityField = entityProvider.Invoke(), - HAEEnumField = ActionState.State3, - HAEIntField = 20, - HAEStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HAEStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State2, - HIntField = 21, - HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HStructureField = structureProvider.Invoke(), - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 22, - AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - AStructureField = structureProvider.Invoke(), - }; - new HAEIncorrectOrder { - HAEBoolField = true, - HAEEntityField = entityProvider.Invoke(), - HAEEnumField = ActionState.State3, - HAEIntField = 20, - HAEStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HAEStructureField = structureProvider.Invoke(), - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State2, - HIntField = 21, - HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HStructureField = structureProvider.Invoke(), - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 22, - AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - AStructureField = structureProvider.Invoke(), - }; - - var entity = new HEACorrectOrder { - HEABoolField = true, - HEAEntityField = entityProvider.Invoke(), - HEAEnumField = ActionState.State3, - HEAIntField = 20, - HEAStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State2, - HIntField = 21, - HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HStructureField = structureProvider.Invoke(), - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 22, - AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - }; - ((IHEA)entity).AStructureField = structureProvider.Invoke(); - ((IA)entity).AStructureField = structureProvider.Invoke(); - - var entity2 = new HEAIncorrectOrder { - HEABoolField = true, - HEAEntityField = entityProvider.Invoke(), - HEAEnumField = ActionState.State3, - HEAIntField = 20, - HEAStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State2, - HIntField = 21, - HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - HStructureField = structureProvider.Invoke(), - ABoolField = true, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AIntField = 22, - AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", - }; - ((IHEA)entity2).AStructureField = structureProvider.Invoke(); - ((IA)entity2).AStructureField = structureProvider.Invoke(); - } - - private void PopulateThirdLevelEntities(Func entityProvider, Func structureProvider) - { - new AHandE { - AIntField = 30, - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - AStructureField = structureProvider.Invoke(), - AHIntField = 30, - AHBoolField = false, - AHEntityField = entityProvider.Invoke(), - AHEnumField = ActionState.State2, - AHStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - AHStructureField = structureProvider.Invoke(), - HIntField = 30, - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State3, - HStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - HStructureField = structureProvider.Invoke(), - EIntField = 30, - EBoolField = false, - EEntityField = entityProvider.Invoke(), - EEnumField = ActionState.State1, - EStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - EStructureField = structureProvider.Invoke(), - }; - new EandAH { - AIntField = 30, - ABoolField = false, - AEntityField = entityProvider.Invoke(), - AEnumField = ActionState.State1, - AStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - AStructureField = structureProvider.Invoke(), - AHIntField = 30, - AHBoolField = false, - AHEntityField = entityProvider.Invoke(), - AHEnumField = ActionState.State2, - AHStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - AHStructureField = structureProvider.Invoke(), - HIntField = 30, - HBoolField = false, - HEntityField = entityProvider.Invoke(), - HEnumField = ActionState.State3, - HStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - HStructureField = structureProvider.Invoke(), - EIntField = 30, - EBoolField = false, - EEntityField = entityProvider.Invoke(), - EEnumField = ActionState.State1, - EStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", - EStructureField = structureProvider.Invoke(), - }; - } - - private void PopulateContainers() - { - var AFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var AHFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var AHandEFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var EFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var EandAHFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var HAEFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var HAFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var HEAFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); - var HFieldValue = Session.Query.All().First(); - - new InterfaceFieldsContainer { - AField = AFieldValue.Value, - AHField = AHFieldValue.Value, - AHandEField = AHandEFieldValue.Value, - EField = EFieldValue.Value, - EandAHField = EandAHFieldValue.Value, - HAEField = HAEFieldValue.Value, - HAField = HAFieldValue.Value, - HEAField = HEAFieldValue.Value, - HField = HFieldValue - }; - } - - private SimpleTestEntity[] GetSimpleTestEntities(int arrayLength) - { - var array = new SimpleTestEntity[arrayLength]; - for (int i = 0; i < arrayLength; i++) { - array[i] = new SimpleTestEntity {Text = Guid.NewGuid().ToString()}; - } - return array; - } - - private SimpleStructure[] GetSimpleStructures(int arrayLength) - { - var array = new SimpleStructure[arrayLength]; - for (int i = 0; i < arrayLength; i++) { - array[i] = new SimpleStructure {Value = i, CurrencyCode = 100 + i}; - } - return array; - } - - public Populator(Session session) - { - Session = session; - } - } - } - - #region User case types - public interface IMesObject - { - [Field, Key] - long Id { get; } - - string SomeNonPersistentProperty { get; set; } - } - - public interface IAction : IEntity, IMesObject - { - [Field] - Size Size { get; set; } - - [Field] - ActionState ActionState { get; set; } - } - - public interface ISomeIntermediateInterface : IAction - { - [Field] - string IntermediateInterfaceText { get; set; } - } - - public interface IStoredObjectCreator : ISomeIntermediateInterface - { - [Field] - bool IgnoreLockedForInput { get; set; } - - [Field] - bool IgnoreLockedInBeam { get; set; } - } - - public interface IStoredMaterialCreator : IStoredObjectCreator - { - } - - public abstract class MesObject : Entity, IMesObject - { - public long Id { get; set; } - - public string SomeNonPersistentProperty { get; set; } - } - - [HierarchyRoot] - public class Size : MesObject - { - [Field] - public string Text { get; set; } - } - - [HierarchyRoot] - public class SimpleStoredMaterialCreator : MesObject, IStoredMaterialCreator - { - public bool IgnoreLockedForInput { get; set; } - - public bool IgnoreLockedInBeam { get; set; } - - public string IntermediateInterfaceText { get; set; } - - public Size Size { get; set; } - - public ActionState ActionState { get; set; } - } - - [HierarchyRoot] - public class ComplexStoredMaterialCreator : MesObject, IStoredMaterialCreator - { - public bool IgnoreLockedForInput { get; set; } - - public bool IgnoreLockedInBeam { get; set; } - - public string IntermediateInterfaceText { get; set; } - - public Size Size { get; set; } - - public ActionState ActionState { get; set; } - - [Field] - public string FieldWhichMakesItComplex { get; set; } - } - - [HierarchyRoot] - public class StoredMaterialLot : MesObject - { - [Field] - public IStoredMaterialCreator Creator { get; set; } - } - #endregion - - #region Supporting types - [HierarchyRoot] - public class SimpleTestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - } - - public class SimpleStructure : Structure - { - [Field] - public double Value { get; set; } - - [Field] - public int CurrencyCode { get; set; } - } - - public enum ActionState - { - State1, - State2, - State3 - } -#endregion - - #region Zero level interfaces - - public interface IA : IEntity - { - [Field] - string AStringField { get; set; } - - [Field] - bool ABoolField { get; set; } - - [Field] - int AIntField { get; set; } - - [Field] - ActionState AEnumField { get; set; } - - [Field] - IE AInterfaceField { get; set; } - - [Field] - SimpleTestEntity AEntityField { get; set; } - - [Field] - SimpleStructure AStructureField { get; set; } - } - - public interface IE : IEntity - { - [Field] - string EStringField { get; set; } - - [Field] - bool EBoolField { get; set; } - - [Field] - int EIntField { get; set; } - - [Field] - ActionState EEnumField { get; set; } - - [Field] - IE EInterfaceField { get; set; } - - [Field] - SimpleTestEntity EEntityField { get; set; } - - [Field] - SimpleStructure EStructureField { get; set; } - } - - public interface IH : IEntity - { - [Field] - string HStringField { get; set; } - - [Field] - bool HBoolField { get; set; } - - [Field] - int HIntField { get; set; } - - [Field] - ActionState HEnumField { get; set; } - - [Field] - IE HInterfaceField { get; set; } - - [Field] - SimpleTestEntity HEntityField { get; set; } - - [Field] - SimpleStructure HStructureField { get; set; } - } - -#endregion - - #region The first level intefaces - - public interface IAH : IA, IH - { - [Field] - string AHStringField { get; set; } - - [Field] - bool AHBoolField { get; set; } - - [Field] - int AHIntField { get; set; } - - [Field] - ActionState AHEnumField { get; set; } - - [Field] - IE AHInterfaceField { get; set; } - - [Field] - SimpleTestEntity AHEntityField { get; set; } - - [Field] - SimpleStructure AHStructureField { get; set; } - } - - public interface IHA : IH, IA - { - [Field] - string HAStringField { get; set; } - - [Field] - bool HABoolField { get; set; } - - [Field] - int HAIntField { get; set; } - - [Field] - ActionState HAEnumField { get; set; } - - [Field] - IE HAInterfaceField { get; set; } - - [Field] - SimpleTestEntity HAEntityField { get; set; } - - [Field] - SimpleStructure HAStructureField { get; set; } - } - -#endregion - - #region The second level interfaces - - public interface IHAE : IH, IA, IE - { - [Field] - string HAEStringField { get; set; } - - [Field] - bool HAEBoolField { get; set; } - - [Field] - int HAEIntField { get; set; } - - [Field] - ActionState HAEEnumField { get; set; } - - [Field] - IE HAEInterfaceField { get; set; } - - [Field] - SimpleTestEntity HAEEntityField { get; set; } - - [Field] - SimpleStructure HAEStructureField { get; set; } - } - - public interface IHEA : IH, IE, IA - { - [Field] - string HEAStringField { get; set; } - - [Field] - bool HEABoolField { get; set; } - - [Field] - int HEAIntField { get; set; } - - [Field] - ActionState HEAEnumField { get; set; } - - [Field] - IE HEAInterfaceField { get; set; } - - [Field] - SimpleTestEntity HEAEntityField { get; set; } - - [Field] - SimpleStructure AStructureField { get; set; } - } - -#endregion - - #region Three level interfaces - - public interface IAHandE : IAH, IE - { - [Field] - string AHandEStringField { get; set; } - - [Field] - bool AHandEBoolField { get; set; } - - [Field] - int AHandEIntField { get; set; } - - [Field] - ActionState AHandEEnumField { get; set; } - - [Field] - IE AHandEInterfaceField { get; set; } - - [Field] - SimpleTestEntity AHandEEntityField { get; set; } - - [Field] - SimpleStructure AHandEStructureField { get; set; } - } - - public interface IEandAH : IE, IAH - { - [Field] - string EandAHStringField { get; set; } - - [Field] - bool EandAHBoolField { get; set; } - - [Field] - int EandAHIntField { get; set; } - - [Field] - ActionState EandAHEnumField { get; set; } - - [Field] - IE EandAHInterfaceField { get; set; } - - [Field] - SimpleTestEntity EandAHEntityField { get; set; } - - [Field] - SimpleStructure EandAHStructureField { get; set; } - } -#endregion - - #region Implementations - - public abstract class BaseEntity : Entity - { - [Field, Key] - public int Id { get; set; } - } - - [HierarchyRoot] - public class ACorrectOrder : BaseEntity, IA - { - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - } - - [HierarchyRoot] - public class AIncorrectOrder : BaseEntity, IA - { - public string AStringField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - } - - [HierarchyRoot] - public class HCorrectOrder : BaseEntity, IH - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - } - - [HierarchyRoot] - public class HIncorrectOrder : BaseEntity, IH - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - } - - [HierarchyRoot] - public class ECorrectOrder : BaseEntity, IE - { - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - } - - [HierarchyRoot] - public class EIncorrectOrder : BaseEntity, IE - { - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - } - - [HierarchyRoot] - public class AHCorrectOrder : BaseEntity, IAH - { - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AHStringField { get; set; } - public bool AHBoolField { get; set; } - public int AHIntField { get; set; } - public ActionState AHEnumField { get; set; } - public IE AHInterfaceField { get; set; } - public SimpleTestEntity AHEntityField { get; set; } - public SimpleStructure AHStructureField { get; set; } - } - - [HierarchyRoot] - public class AHIncorrectOrder : BaseEntity, IAH - { - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AHStringField { get; set; } - public bool AHBoolField { get; set; } - public int AHIntField { get; set; } - public ActionState AHEnumField { get; set; } - public IE AHInterfaceField { get; set; } - public SimpleTestEntity AHEntityField { get; set; } - public SimpleStructure AHStructureField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - } - - [HierarchyRoot] - public class HACorrectOrder : BaseEntity, IHA - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HAStringField { get; set; } - public bool HABoolField { get; set; } - public int HAIntField { get; set; } - public ActionState HAEnumField { get; set; } - public IE HAInterfaceField { get; set; } - public SimpleTestEntity HAEntityField { get; set; } - public SimpleStructure HAStructureField { get; set; } - } - - [HierarchyRoot] - public class HAIncorrectOrder : BaseEntity, IHA - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HAStringField { get; set; } - public bool HABoolField { get; set; } - public int HAIntField { get; set; } - public ActionState HAEnumField { get; set; } - public IE HAInterfaceField { get; set; } - public SimpleTestEntity HAEntityField { get; set; } - public SimpleStructure HAStructureField { get; set; } - } - - [HierarchyRoot] - public class HAECorrectOrder : BaseEntity, IHAE - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string HAEStringField { get; set; } - public bool HAEBoolField { get; set; } - public int HAEIntField { get; set; } - public ActionState HAEEnumField { get; set; } - public IE HAEInterfaceField { get; set; } - public SimpleTestEntity HAEEntityField { get; set; } - public SimpleStructure HAEStructureField { get; set; } - } - - [HierarchyRoot] - public class HAEIncorrectOrder : BaseEntity, IHAE - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string HAEStringField { get; set; } - public bool HAEBoolField { get; set; } - public int HAEIntField { get; set; } - public ActionState HAEEnumField { get; set; } - public IE HAEInterfaceField { get; set; } - public SimpleTestEntity HAEEntityField { get; set; } - public SimpleStructure HAEStructureField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - } - - [HierarchyRoot] - public class HEACorrectOrder : BaseEntity, IHEA - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - SimpleStructure IHEA.AStructureField { get; set; } - public string HEAStringField { get; set; } - public bool HEABoolField { get; set; } - public int HEAIntField { get; set; } - public ActionState HEAEnumField { get; set; } - public IE HEAInterfaceField { get; set; } - public SimpleTestEntity HEAEntityField { get; set; } - SimpleStructure IA.AStructureField { get; set; } - } - - [HierarchyRoot] - public class HEAIncorrectOrder : BaseEntity, IHEA - { - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleTestEntity HEAEntityField { get; set; } - SimpleStructure IA.AStructureField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - SimpleStructure IHEA.AStructureField { get; set; } - public string HEAStringField { get; set; } - public bool HEABoolField { get; set; } - public int HEAIntField { get; set; } - public ActionState HEAEnumField { get; set; } - public IE HEAInterfaceField { get; set; } - } - - [HierarchyRoot] - public class AHandE : BaseEntity, IAHandE - { - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AHStringField { get; set; } - public bool AHBoolField { get; set; } - public int AHIntField { get; set; } - public ActionState AHEnumField { get; set; } - public IE AHInterfaceField { get; set; } - public SimpleTestEntity AHEntityField { get; set; } - public SimpleStructure AHStructureField { get; set; } - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string AHandEStringField { get; set; } - public bool AHandEBoolField { get; set; } - public int AHandEIntField { get; set; } - public ActionState AHandEEnumField { get; set; } - public IE AHandEInterfaceField { get; set; } - public SimpleTestEntity AHandEEntityField { get; set; } - public SimpleStructure AHandEStructureField { get; set; } - } - - [HierarchyRoot] - public class EandAH : BaseEntity, IE, IEandAH - { - public string EStringField { get; set; } - public bool EBoolField { get; set; } - public int EIntField { get; set; } - public ActionState EEnumField { get; set; } - public IE EInterfaceField { get; set; } - public SimpleTestEntity EEntityField { get; set; } - public SimpleStructure EStructureField { get; set; } - public string AStringField { get; set; } - public bool ABoolField { get; set; } - public int AIntField { get; set; } - public ActionState AEnumField { get; set; } - public IE AInterfaceField { get; set; } - public SimpleTestEntity AEntityField { get; set; } - public SimpleStructure AStructureField { get; set; } - public string HStringField { get; set; } - public bool HBoolField { get; set; } - public int HIntField { get; set; } - public ActionState HEnumField { get; set; } - public IE HInterfaceField { get; set; } - public SimpleTestEntity HEntityField { get; set; } - public SimpleStructure HStructureField { get; set; } - public string AHStringField { get; set; } - public bool AHBoolField { get; set; } - public int AHIntField { get; set; } - public ActionState AHEnumField { get; set; } - public IE AHInterfaceField { get; set; } - public SimpleTestEntity AHEntityField { get; set; } - public SimpleStructure AHStructureField { get; set; } - public string EandAHStringField { get; set; } - public bool EandAHBoolField { get; set; } - public int EandAHIntField { get; set; } - public ActionState EandAHEnumField { get; set; } - public IE EandAHInterfaceField { get; set; } - public SimpleTestEntity EandAHEntityField { get; set; } - public SimpleStructure EandAHStructureField { get; set; } - } - - [HierarchyRoot] - public class InterfaceFieldsContainer : BaseEntity - { - [Field] - public IA AField { get; set; } - - [Field] - public IE EField { get; set; } - - [Field] - public IH HField { get; set; } - - [Field] - public IAH AHField { get; set; } - - [Field] - public IHA HAField { get; set; } - - [Field] - public IHAE HAEField { get; set; } - - [Field] - public IHEA HEAField { get; set; } - - [Field] - public IAHandE AHandEField { get; set; } - - [Field] - public IEandAH EandAHField { get; set; } - } - #endregion -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2016.03.31 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel; +using Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel.Populator; +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypes : AutoBuildTest + { + [Test] + public void ColumnsOrderTestTest() + { + foreach (var type in Domain.Model.Types.Where(t=>t.IsEntity && !t.IsSystem)) { + var index = type.Indexes.PrimaryIndex; + int currentIndex = -1; + foreach (var indexColumn in index.Columns) { + var i = type.Columns.IndexOf(indexColumn); + Assert.That(i > currentIndex, Is.True); + currentIndex = i; + } + } + } + + [Test] + public void SelectInterfaceFieldTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + IStoredMaterialCreator[] creators = null; + Assert.DoesNotThrow(() => creators = session.Query.All().Select(el => el.Creator).ToArray()); + Assert.That(creators.Length, Is.EqualTo(2)); + foreach (var creator in creators) { + Assert.That(creator, Is.Not.Null); + var simple = creator as SimpleStoredMaterialCreator; + var complex = creator as ComplexStoredMaterialCreator; + Assert.That(simple!=null || complex!=null, Is.True); + } + } + } + + [Test] + public void SelectInterfaceDirectlyTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + IAction[] actions = null; + Assert.DoesNotThrow(()=> actions = session.Query.All().ToArray()); + Assert.That(actions.Length, Is.EqualTo(2)); + foreach (var action in actions) { + Assert.That(action, Is.Not.Null); + var simple = action as SimpleStoredMaterialCreator; + var complex = action as ComplexStoredMaterialCreator; + Assert.That(simple!=null || complex!=null, Is.True); + } + + ISomeIntermediateInterface[] intermediateThings = null; + Assert.DoesNotThrow(() => intermediateThings = session.Query.All().ToArray()); + Assert.That(intermediateThings.Length, Is.EqualTo(2)); + foreach (var thing in intermediateThings) { + Assert.That(thing, Is.Not.Null); + var simple = thing as SimpleStoredMaterialCreator; + var complex = thing as ComplexStoredMaterialCreator; + Assert.That(simple!=null || complex!=null, Is.True); + } + + IStoredObjectCreator[] objectCreators = null; + Assert.DoesNotThrow(() => objectCreators = session.Query.All().ToArray()); + Assert.That(objectCreators.Length, Is.EqualTo(2)); + foreach (var creator in objectCreators) { + Assert.That(creator, Is.Not.Null); + var simple = creator as SimpleStoredMaterialCreator; + var complex = creator as ComplexStoredMaterialCreator; + Assert.That(simple!=null || complex!=null, Is.True); + } + + IStoredMaterialCreator[] materialCreators = null; + Assert.DoesNotThrow(() => materialCreators = session.Query.All().ToArray()); + Assert.That(materialCreators.Length, Is.EqualTo(2)); + foreach (var creator in materialCreators) { + Assert.That(creator, Is.Not.Null); + var simple = creator as SimpleStoredMaterialCreator; + var complex = creator as ComplexStoredMaterialCreator; + Assert.That(simple!=null || complex!=null, Is.True); + } + } + } + + [Test] + public void SelectInterfaceFieldAdditonalTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AHField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.AHandEField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.EField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.EandAHField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HAEField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HAField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HEAField).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Select(e => e.HField).ToArray()); + } + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new Populator(session).Populate(); + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (StoredMaterialLot).Assembly, typeof (StoredMaterialLot).Namespace); + return configuration; + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0630_IncorrectColumnOrderOfPKIndexOfInterfaceTypesModel +{ + namespace Populator + { + internal sealed class Populator + { + public Session Session { get; private set; } + + public void Populate() + { + PopulateUserCaseRelatedData(); + PopulateExtraCasesRelatedData(); + } + + private void PopulateUserCaseRelatedData() + { + var simpleStoredMaterialCreator = new SimpleStoredMaterialCreator { + ActionState = ActionState.State1, + IgnoreLockedForInput = true, + IgnoreLockedInBeam = true, + IntermediateInterfaceText = "SimpleStoredMaterialCreator:IntemediateText", + }; + + var complexStoredMaterialCreator = new ComplexStoredMaterialCreator { + ActionState = ActionState.State1, + IgnoreLockedForInput = false, + IgnoreLockedInBeam = false, + IntermediateInterfaceText = "ComplexStoredMaterialCreator:IntemediateText", + FieldWhichMakesItComplex = "CompexStoredMaterialCreator:ComplexFieldText" + }; + + new StoredMaterialLot { + SomeNonPersistentProperty = "Text which will be ommited because it's non-persistent field", + Creator = simpleStoredMaterialCreator, + }; + + new StoredMaterialLot { + SomeNonPersistentProperty = "Text which willbe ommited because of non-persistence", + Creator = complexStoredMaterialCreator + }; + } + + private void PopulateExtraCasesRelatedData() + { + const int testDataCount = 10; + var randomizer = new Random(); + var testEntities = GetSimpleTestEntities(testDataCount); + var testStructures = GetSimpleStructures(testDataCount); + + Func getEntityAction = () => testEntities[randomizer.Next(0, testDataCount)]; + Func getStructureAction = () => testStructures[randomizer.Next(0, testDataCount)]; + + PopulateZeroLevelEntities(getEntityAction, getStructureAction); + PopulateFirstLevelEntities(getEntityAction, getStructureAction); + PopulateSecondLevelEntities(getEntityAction, getStructureAction); + PopulateThirdLevelEntities(getEntityAction, getStructureAction); + PopulateContainers(); + } + + private void PopulateZeroLevelEntities(Func entityProvider, Func structureProvider) + { + new ACorrectOrder { + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 10, + AStringField = "jdfhkjghjdfhgjhdf", + AStructureField = structureProvider.Invoke() + }; + + new AIncorrectOrder { + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State2, + AIntField = 10, + AStringField = "jdfhkjghjdfhgjhdf", + AStructureField = structureProvider.Invoke() + }; + + new ECorrectOrder { + EBoolField = false, + EEntityField = entityProvider.Invoke(), + EEnumField = ActionState.State1, + EIntField = 10, + EStringField = "jdfhkjghjdfhgjhdf", + EStructureField = structureProvider.Invoke() + }; + + new EIncorrectOrder { + EBoolField = false, + EEntityField = entityProvider.Invoke(), + EEnumField = ActionState.State2, + EIntField = 10, + EStringField = "jdfhkjghjdfhgjhdf", + EStructureField = structureProvider.Invoke() + }; + + new HCorrectOrder { + HBoolField = true, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 10, + HStringField = "jdfhkjghjdfhgjhdf", + HStructureField = structureProvider.Invoke() + }; + + new HIncorrectOrder { + HBoolField = true, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 10, + HStringField = "jdfhkjghjdfhgjhdf", + HStructureField = structureProvider.Invoke() + }; + } + + private void PopulateFirstLevelEntities(Func entityProvider, Func structureProvider) + { + new AHCorrectOrder { + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 11, + AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + AStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 11, + HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + HStructureField = structureProvider.Invoke(), + }; + + new AHIncorrectOrder { + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 11, + AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + AStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 11, + HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + HStructureField = structureProvider.Invoke(), + }; + + new HACorrectOrder { + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 11, + AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + AStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 11, + HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + HStructureField = structureProvider.Invoke(), + }; + + new HAIncorrectOrder { + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 11, + AStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + AStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State1, + HIntField = 11, + HStringField = "dhfkghkdhfgkjhdfkjhgkjfd", + HStructureField = structureProvider.Invoke(), + }; + } + + private void PopulateSecondLevelEntities(Func entityProvider, Func structureProvider) + { + new HAECorrectOrder { + HAEBoolField = true, + HAEEntityField = entityProvider.Invoke(), + HAEEnumField = ActionState.State3, + HAEIntField = 20, + HAEStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HAEStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State2, + HIntField = 21, + HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HStructureField = structureProvider.Invoke(), + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 22, + AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + AStructureField = structureProvider.Invoke(), + }; + new HAEIncorrectOrder { + HAEBoolField = true, + HAEEntityField = entityProvider.Invoke(), + HAEEnumField = ActionState.State3, + HAEIntField = 20, + HAEStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HAEStructureField = structureProvider.Invoke(), + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State2, + HIntField = 21, + HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HStructureField = structureProvider.Invoke(), + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 22, + AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + AStructureField = structureProvider.Invoke(), + }; + + var entity = new HEACorrectOrder { + HEABoolField = true, + HEAEntityField = entityProvider.Invoke(), + HEAEnumField = ActionState.State3, + HEAIntField = 20, + HEAStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State2, + HIntField = 21, + HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HStructureField = structureProvider.Invoke(), + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 22, + AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + }; + ((IHEA)entity).AStructureField = structureProvider.Invoke(); + ((IA)entity).AStructureField = structureProvider.Invoke(); + + var entity2 = new HEAIncorrectOrder { + HEABoolField = true, + HEAEntityField = entityProvider.Invoke(), + HEAEnumField = ActionState.State3, + HEAIntField = 20, + HEAStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State2, + HIntField = 21, + HStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + HStructureField = structureProvider.Invoke(), + ABoolField = true, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AIntField = 22, + AStringField = "dfhkhwrhjerhjhgdkjhfgjkfg", + }; + ((IHEA)entity2).AStructureField = structureProvider.Invoke(); + ((IA)entity2).AStructureField = structureProvider.Invoke(); + } + + private void PopulateThirdLevelEntities(Func entityProvider, Func structureProvider) + { + new AHandE { + AIntField = 30, + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + AStructureField = structureProvider.Invoke(), + AHIntField = 30, + AHBoolField = false, + AHEntityField = entityProvider.Invoke(), + AHEnumField = ActionState.State2, + AHStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + AHStructureField = structureProvider.Invoke(), + HIntField = 30, + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State3, + HStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + HStructureField = structureProvider.Invoke(), + EIntField = 30, + EBoolField = false, + EEntityField = entityProvider.Invoke(), + EEnumField = ActionState.State1, + EStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + EStructureField = structureProvider.Invoke(), + }; + new EandAH { + AIntField = 30, + ABoolField = false, + AEntityField = entityProvider.Invoke(), + AEnumField = ActionState.State1, + AStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + AStructureField = structureProvider.Invoke(), + AHIntField = 30, + AHBoolField = false, + AHEntityField = entityProvider.Invoke(), + AHEnumField = ActionState.State2, + AHStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + AHStructureField = structureProvider.Invoke(), + HIntField = 30, + HBoolField = false, + HEntityField = entityProvider.Invoke(), + HEnumField = ActionState.State3, + HStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + HStructureField = structureProvider.Invoke(), + EIntField = 30, + EBoolField = false, + EEntityField = entityProvider.Invoke(), + EEnumField = ActionState.State1, + EStringField = "jdfhkgjhdkjfhgkjhskjfhkdsjg", + EStructureField = structureProvider.Invoke(), + }; + } + + private void PopulateContainers() + { + var AFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var AHFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var AHandEFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var EFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var EandAHFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var HAEFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var HAFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var HEAFieldValue = Session.Query.ExecuteDelayed((q) => q.All().First()); + var HFieldValue = Session.Query.All().First(); + + new InterfaceFieldsContainer { + AField = AFieldValue.Value, + AHField = AHFieldValue.Value, + AHandEField = AHandEFieldValue.Value, + EField = EFieldValue.Value, + EandAHField = EandAHFieldValue.Value, + HAEField = HAEFieldValue.Value, + HAField = HAFieldValue.Value, + HEAField = HEAFieldValue.Value, + HField = HFieldValue + }; + } + + private SimpleTestEntity[] GetSimpleTestEntities(int arrayLength) + { + var array = new SimpleTestEntity[arrayLength]; + for (int i = 0; i < arrayLength; i++) { + array[i] = new SimpleTestEntity {Text = Guid.NewGuid().ToString()}; + } + return array; + } + + private SimpleStructure[] GetSimpleStructures(int arrayLength) + { + var array = new SimpleStructure[arrayLength]; + for (int i = 0; i < arrayLength; i++) { + array[i] = new SimpleStructure {Value = i, CurrencyCode = 100 + i}; + } + return array; + } + + public Populator(Session session) + { + Session = session; + } + } + } + + #region User case types + public interface IMesObject + { + [Field, Key] + long Id { get; } + + string SomeNonPersistentProperty { get; set; } + } + + public interface IAction : IEntity, IMesObject + { + [Field] + Size Size { get; set; } + + [Field] + ActionState ActionState { get; set; } + } + + public interface ISomeIntermediateInterface : IAction + { + [Field] + string IntermediateInterfaceText { get; set; } + } + + public interface IStoredObjectCreator : ISomeIntermediateInterface + { + [Field] + bool IgnoreLockedForInput { get; set; } + + [Field] + bool IgnoreLockedInBeam { get; set; } + } + + public interface IStoredMaterialCreator : IStoredObjectCreator + { + } + + public abstract class MesObject : Entity, IMesObject + { + public long Id { get; set; } + + public string SomeNonPersistentProperty { get; set; } + } + + [HierarchyRoot] + public class Size : MesObject + { + [Field] + public string Text { get; set; } + } + + [HierarchyRoot] + public class SimpleStoredMaterialCreator : MesObject, IStoredMaterialCreator + { + public bool IgnoreLockedForInput { get; set; } + + public bool IgnoreLockedInBeam { get; set; } + + public string IntermediateInterfaceText { get; set; } + + public Size Size { get; set; } + + public ActionState ActionState { get; set; } + } + + [HierarchyRoot] + public class ComplexStoredMaterialCreator : MesObject, IStoredMaterialCreator + { + public bool IgnoreLockedForInput { get; set; } + + public bool IgnoreLockedInBeam { get; set; } + + public string IntermediateInterfaceText { get; set; } + + public Size Size { get; set; } + + public ActionState ActionState { get; set; } + + [Field] + public string FieldWhichMakesItComplex { get; set; } + } + + [HierarchyRoot] + public class StoredMaterialLot : MesObject + { + [Field] + public IStoredMaterialCreator Creator { get; set; } + } + #endregion + + #region Supporting types + [HierarchyRoot] + public class SimpleTestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + } + + public class SimpleStructure : Structure + { + [Field] + public double Value { get; set; } + + [Field] + public int CurrencyCode { get; set; } + } + + public enum ActionState + { + State1, + State2, + State3 + } +#endregion + + #region Zero level interfaces + + public interface IA : IEntity + { + [Field] + string AStringField { get; set; } + + [Field] + bool ABoolField { get; set; } + + [Field] + int AIntField { get; set; } + + [Field] + ActionState AEnumField { get; set; } + + [Field] + IE AInterfaceField { get; set; } + + [Field] + SimpleTestEntity AEntityField { get; set; } + + [Field] + SimpleStructure AStructureField { get; set; } + } + + public interface IE : IEntity + { + [Field] + string EStringField { get; set; } + + [Field] + bool EBoolField { get; set; } + + [Field] + int EIntField { get; set; } + + [Field] + ActionState EEnumField { get; set; } + + [Field] + IE EInterfaceField { get; set; } + + [Field] + SimpleTestEntity EEntityField { get; set; } + + [Field] + SimpleStructure EStructureField { get; set; } + } + + public interface IH : IEntity + { + [Field] + string HStringField { get; set; } + + [Field] + bool HBoolField { get; set; } + + [Field] + int HIntField { get; set; } + + [Field] + ActionState HEnumField { get; set; } + + [Field] + IE HInterfaceField { get; set; } + + [Field] + SimpleTestEntity HEntityField { get; set; } + + [Field] + SimpleStructure HStructureField { get; set; } + } + +#endregion + + #region The first level intefaces + + public interface IAH : IA, IH + { + [Field] + string AHStringField { get; set; } + + [Field] + bool AHBoolField { get; set; } + + [Field] + int AHIntField { get; set; } + + [Field] + ActionState AHEnumField { get; set; } + + [Field] + IE AHInterfaceField { get; set; } + + [Field] + SimpleTestEntity AHEntityField { get; set; } + + [Field] + SimpleStructure AHStructureField { get; set; } + } + + public interface IHA : IH, IA + { + [Field] + string HAStringField { get; set; } + + [Field] + bool HABoolField { get; set; } + + [Field] + int HAIntField { get; set; } + + [Field] + ActionState HAEnumField { get; set; } + + [Field] + IE HAInterfaceField { get; set; } + + [Field] + SimpleTestEntity HAEntityField { get; set; } + + [Field] + SimpleStructure HAStructureField { get; set; } + } + +#endregion + + #region The second level interfaces + + public interface IHAE : IH, IA, IE + { + [Field] + string HAEStringField { get; set; } + + [Field] + bool HAEBoolField { get; set; } + + [Field] + int HAEIntField { get; set; } + + [Field] + ActionState HAEEnumField { get; set; } + + [Field] + IE HAEInterfaceField { get; set; } + + [Field] + SimpleTestEntity HAEEntityField { get; set; } + + [Field] + SimpleStructure HAEStructureField { get; set; } + } + + public interface IHEA : IH, IE, IA + { + [Field] + string HEAStringField { get; set; } + + [Field] + bool HEABoolField { get; set; } + + [Field] + int HEAIntField { get; set; } + + [Field] + ActionState HEAEnumField { get; set; } + + [Field] + IE HEAInterfaceField { get; set; } + + [Field] + SimpleTestEntity HEAEntityField { get; set; } + + [Field] + SimpleStructure AStructureField { get; set; } + } + +#endregion + + #region Three level interfaces + + public interface IAHandE : IAH, IE + { + [Field] + string AHandEStringField { get; set; } + + [Field] + bool AHandEBoolField { get; set; } + + [Field] + int AHandEIntField { get; set; } + + [Field] + ActionState AHandEEnumField { get; set; } + + [Field] + IE AHandEInterfaceField { get; set; } + + [Field] + SimpleTestEntity AHandEEntityField { get; set; } + + [Field] + SimpleStructure AHandEStructureField { get; set; } + } + + public interface IEandAH : IE, IAH + { + [Field] + string EandAHStringField { get; set; } + + [Field] + bool EandAHBoolField { get; set; } + + [Field] + int EandAHIntField { get; set; } + + [Field] + ActionState EandAHEnumField { get; set; } + + [Field] + IE EandAHInterfaceField { get; set; } + + [Field] + SimpleTestEntity EandAHEntityField { get; set; } + + [Field] + SimpleStructure EandAHStructureField { get; set; } + } +#endregion + + #region Implementations + + public abstract class BaseEntity : Entity + { + [Field, Key] + public int Id { get; set; } + } + + [HierarchyRoot] + public class ACorrectOrder : BaseEntity, IA + { + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + } + + [HierarchyRoot] + public class AIncorrectOrder : BaseEntity, IA + { + public string AStringField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + } + + [HierarchyRoot] + public class HCorrectOrder : BaseEntity, IH + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + } + + [HierarchyRoot] + public class HIncorrectOrder : BaseEntity, IH + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + } + + [HierarchyRoot] + public class ECorrectOrder : BaseEntity, IE + { + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + } + + [HierarchyRoot] + public class EIncorrectOrder : BaseEntity, IE + { + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + } + + [HierarchyRoot] + public class AHCorrectOrder : BaseEntity, IAH + { + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AHStringField { get; set; } + public bool AHBoolField { get; set; } + public int AHIntField { get; set; } + public ActionState AHEnumField { get; set; } + public IE AHInterfaceField { get; set; } + public SimpleTestEntity AHEntityField { get; set; } + public SimpleStructure AHStructureField { get; set; } + } + + [HierarchyRoot] + public class AHIncorrectOrder : BaseEntity, IAH + { + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AHStringField { get; set; } + public bool AHBoolField { get; set; } + public int AHIntField { get; set; } + public ActionState AHEnumField { get; set; } + public IE AHInterfaceField { get; set; } + public SimpleTestEntity AHEntityField { get; set; } + public SimpleStructure AHStructureField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + } + + [HierarchyRoot] + public class HACorrectOrder : BaseEntity, IHA + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HAStringField { get; set; } + public bool HABoolField { get; set; } + public int HAIntField { get; set; } + public ActionState HAEnumField { get; set; } + public IE HAInterfaceField { get; set; } + public SimpleTestEntity HAEntityField { get; set; } + public SimpleStructure HAStructureField { get; set; } + } + + [HierarchyRoot] + public class HAIncorrectOrder : BaseEntity, IHA + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HAStringField { get; set; } + public bool HABoolField { get; set; } + public int HAIntField { get; set; } + public ActionState HAEnumField { get; set; } + public IE HAInterfaceField { get; set; } + public SimpleTestEntity HAEntityField { get; set; } + public SimpleStructure HAStructureField { get; set; } + } + + [HierarchyRoot] + public class HAECorrectOrder : BaseEntity, IHAE + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string HAEStringField { get; set; } + public bool HAEBoolField { get; set; } + public int HAEIntField { get; set; } + public ActionState HAEEnumField { get; set; } + public IE HAEInterfaceField { get; set; } + public SimpleTestEntity HAEEntityField { get; set; } + public SimpleStructure HAEStructureField { get; set; } + } + + [HierarchyRoot] + public class HAEIncorrectOrder : BaseEntity, IHAE + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string HAEStringField { get; set; } + public bool HAEBoolField { get; set; } + public int HAEIntField { get; set; } + public ActionState HAEEnumField { get; set; } + public IE HAEInterfaceField { get; set; } + public SimpleTestEntity HAEEntityField { get; set; } + public SimpleStructure HAEStructureField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + } + + [HierarchyRoot] + public class HEACorrectOrder : BaseEntity, IHEA + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + SimpleStructure IHEA.AStructureField { get; set; } + public string HEAStringField { get; set; } + public bool HEABoolField { get; set; } + public int HEAIntField { get; set; } + public ActionState HEAEnumField { get; set; } + public IE HEAInterfaceField { get; set; } + public SimpleTestEntity HEAEntityField { get; set; } + SimpleStructure IA.AStructureField { get; set; } + } + + [HierarchyRoot] + public class HEAIncorrectOrder : BaseEntity, IHEA + { + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleTestEntity HEAEntityField { get; set; } + SimpleStructure IA.AStructureField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + SimpleStructure IHEA.AStructureField { get; set; } + public string HEAStringField { get; set; } + public bool HEABoolField { get; set; } + public int HEAIntField { get; set; } + public ActionState HEAEnumField { get; set; } + public IE HEAInterfaceField { get; set; } + } + + [HierarchyRoot] + public class AHandE : BaseEntity, IAHandE + { + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AHStringField { get; set; } + public bool AHBoolField { get; set; } + public int AHIntField { get; set; } + public ActionState AHEnumField { get; set; } + public IE AHInterfaceField { get; set; } + public SimpleTestEntity AHEntityField { get; set; } + public SimpleStructure AHStructureField { get; set; } + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string AHandEStringField { get; set; } + public bool AHandEBoolField { get; set; } + public int AHandEIntField { get; set; } + public ActionState AHandEEnumField { get; set; } + public IE AHandEInterfaceField { get; set; } + public SimpleTestEntity AHandEEntityField { get; set; } + public SimpleStructure AHandEStructureField { get; set; } + } + + [HierarchyRoot] + public class EandAH : BaseEntity, IE, IEandAH + { + public string EStringField { get; set; } + public bool EBoolField { get; set; } + public int EIntField { get; set; } + public ActionState EEnumField { get; set; } + public IE EInterfaceField { get; set; } + public SimpleTestEntity EEntityField { get; set; } + public SimpleStructure EStructureField { get; set; } + public string AStringField { get; set; } + public bool ABoolField { get; set; } + public int AIntField { get; set; } + public ActionState AEnumField { get; set; } + public IE AInterfaceField { get; set; } + public SimpleTestEntity AEntityField { get; set; } + public SimpleStructure AStructureField { get; set; } + public string HStringField { get; set; } + public bool HBoolField { get; set; } + public int HIntField { get; set; } + public ActionState HEnumField { get; set; } + public IE HInterfaceField { get; set; } + public SimpleTestEntity HEntityField { get; set; } + public SimpleStructure HStructureField { get; set; } + public string AHStringField { get; set; } + public bool AHBoolField { get; set; } + public int AHIntField { get; set; } + public ActionState AHEnumField { get; set; } + public IE AHInterfaceField { get; set; } + public SimpleTestEntity AHEntityField { get; set; } + public SimpleStructure AHStructureField { get; set; } + public string EandAHStringField { get; set; } + public bool EandAHBoolField { get; set; } + public int EandAHIntField { get; set; } + public ActionState EandAHEnumField { get; set; } + public IE EandAHInterfaceField { get; set; } + public SimpleTestEntity EandAHEntityField { get; set; } + public SimpleStructure EandAHStructureField { get; set; } + } + + [HierarchyRoot] + public class InterfaceFieldsContainer : BaseEntity + { + [Field] + public IA AField { get; set; } + + [Field] + public IE EField { get; set; } + + [Field] + public IH HField { get; set; } + + [Field] + public IAH AHField { get; set; } + + [Field] + public IHA HAField { get; set; } + + [Field] + public IHAE HAEField { get; set; } + + [Field] + public IHEA HEAField { get; set; } + + [Field] + public IAHandE AHandEField { get; set; } + + [Field] + public IEandAH EandAHField { get; set; } + } + #endregion +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0636_SessionCacheTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0636_SessionCacheTest.cs index 2c769bb258..17f367fd34 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0636_SessionCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0636_SessionCacheTest.cs @@ -1,1100 +1,1100 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.05.16 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.Interfaces; -using IssueModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.IssueModel; -using ClassTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.ClassTableModel; -using ConcreteTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.ConcreteTableModel; -using SingleTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.SingleTableModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace IssueJira0636_Model - { - // Issue model (user case) - namespace IssueModel - { - [HierarchyRoot] - public class BaseEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - public BaseEntity() - { - } - - public BaseEntity(Session session, long id) - : base(session, id) - { - } - } - - public class FirstSuccessor : BaseEntity - { - [Field] - public string StringField1 { get; set; } - - public FirstSuccessor() - { - } - - public FirstSuccessor(Session session, long id) - : base(session, id) - { - } - } - - public class SecondSuccessor : BaseEntity - { - [Field] - public string StringField2 { get; set; } - - public SecondSuccessor() - { - } - - public SecondSuccessor(Session session, long id) - : base(session, id) - { - } - } - } - - // Complicated model for possible apperance of this bug - namespace ComplicatedModel - { - namespace Interfaces - { - internal interface IBaseEntity - { - long Id { get; } - string Field0 { get; set; } - } - - internal interface IFirstSuccessor : IBaseEntity - { - string Field1 { get; set; } - } - - internal interface ISecondSuccessor : IBaseEntity - { - string Field2 { get; set; } - } - - internal interface ISecondSuccessorLeaf : ISecondSuccessor - { - int LeafCode { get; set; } - } - - internal interface IThirdSuccessor : IBaseEntity - { - string Field3 { get; set; } - } - - internal interface IThirdSuccessorLeaf1 : IThirdSuccessor - { - int Leaf1Code { get; set; } - } - - internal interface IThirdSuccessorLeaf2 : IThirdSuccessor - { - int Leaf2Code { get; set; } - } - } - - namespace ClassTableModel - { - /// - /// Base entity - /// - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class BaseEntity : Entity, IBaseEntity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Field0 { get; set; } - } - - /// - /// Successor without own successors - /// - public class FirstSuccessor : BaseEntity, IFirstSuccessor - { - [Field] - public string Field1 { get; set; } - } - - /// - /// Successor with one own successor - /// - public class SecondSuccessor : BaseEntity, ISecondSuccessor - { - [Field] - public string Field2 { get; set; } - } - - public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf - { - [Field] - public int LeafCode { get; set; } - } - - /// - /// Successor with two own successors - /// - public class ThirdSuccessor : BaseEntity, IThirdSuccessor - { - [Field] - public string Field3 { get; set; } - } - - public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 - { - [Field] - public int Leaf1Code { get; set; } - } - - public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 - { - [Field] - public int Leaf2Code { get; set; } - } - } - - namespace ConcreteTableModel - { - /// - /// Base entity - /// - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class BaseEntity : Entity, IBaseEntity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Field0 { get; set; } - } - - /// - /// Successor without own successors - /// - public class FirstSuccessor : BaseEntity, IFirstSuccessor - { - [Field] - public string Field1 { get; set; } - } - - /// - /// Successor with one own successor - /// - public class SecondSuccessor : BaseEntity, ISecondSuccessor - { - [Field] - public string Field2 { get; set; } - } - - public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf - { - [Field] - public int LeafCode { get; set; } - } - - /// - /// Successor with two own successors - /// - public class ThirdSuccessor : BaseEntity, IThirdSuccessor - { - [Field] - public string Field3 { get; set; } - } - - public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 - { - [Field] - public int Leaf1Code { get; set; } - } - - public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 - { - [Field] - public int Leaf2Code { get; set; } - } - } - - namespace SingleTableModel - { - /// - /// Base entity - /// - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class BaseEntity : Entity, IBaseEntity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Field0 { get; set; } - } - - /// - /// Successor without own successors - /// - public class FirstSuccessor : BaseEntity, IFirstSuccessor - { - [Field] - public string Field1 { get; set; } - } - - /// - /// Successor with one own successor - /// - public class SecondSuccessor : BaseEntity, ISecondSuccessor - { - [Field] - public string Field2 { get; set; } - } - - public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf - { - [Field] - public int LeafCode { get; set; } - } - - /// - /// Successor with two own successors - /// - public class ThirdSuccessor : BaseEntity, IThirdSuccessor - { - [Field] - public string Field3 { get; set; } - } - - public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 - { - [Field] - public int Leaf1Code { get; set; } - } - - public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 - { - [Field] - public int Leaf2Code { get; set; } - } - } - } - } - - public class IssueJira0636_SessionCacheTest : AutoBuildTest - { - private struct IdsStruct - { - public InheritanceSchema InheritanceSchema { get; private set; } - - public long BaseEntityId { get; private set; } - public long FirstSuccessorId { get; private set; } - public long SecondSuccessorId { get; private set; } - public long SecondSuccessorLeafId { get; private set; } - public long ThirdSuccessorId { get; private set; } - public long ThirdSuccessorLeaf1Id { get; private set; } - public long ThirdSuccessorLeaf2Id { get; private set; } - - public IdsStruct(InheritanceSchema inheritanceSchema, long baseEntityId, long firstSuccessorId, long secondSuccessorId, long secondSuccessorLeafId, - long thirdSuccessorId, long thirdSuccessorLeaf1Id, long thirdSuccessorLeaf2Id) - : this() - { - InheritanceSchema = inheritanceSchema; - BaseEntityId = baseEntityId; - FirstSuccessorId = firstSuccessorId; - SecondSuccessorId = secondSuccessorId; - SecondSuccessorLeafId = secondSuccessorLeafId; - ThirdSuccessorId = thirdSuccessorId; - ThirdSuccessorLeaf1Id = thirdSuccessorLeaf1Id; - ThirdSuccessorLeaf2Id = thirdSuccessorLeaf2Id; - } - } - - #region Consts - - private const string BaseEntityField0 = "BaseEntityField0"; - - private const string FirstSuccessorField0 = "FirstSuccessorField0"; - private const string FirstSuccessorField1 = "FirstSuccessorField1"; - - private const string SecondSuccessorField0 = "SecondSuccessorField0"; - private const string SecondSuccessorField2 = "SecondSuccessorField2"; - - private const string SecondSuccessorLeafField0 = "SecondSuccessorLeafField0"; - private const string SecondSuccessorLeafField2 = "SecondSuccessorLeafField2"; - private const int SecondSuccessorLeafCode = 99; - - private const string ThirdSuccessorField0 = "ThirdSuccessorField0"; - private const string ThirdSuccessorField3 = "ThirdSuccessorField3"; - - private const string ThirdSuccessorLeaf1Field0 = "ThirdSuccessorLeaf1Field0"; - private const string ThirdSuccessorLeaf1Field3 = "ThirdSuccessorLeaf1Field3"; - private const int ThirdSuccessorLeaf1Code = 98; - - private const string ThirdSuccessorLeaf2Field0 = "ThirdSuccessorLeaf2Field0"; - private const string ThirdSuccessorLeaf2Field3 = "ThirdSuccessorLeaf2Field3"; - private const int ThirdSuccessorLeaf2Code = 97; - private const long WrongId = int.MaxValue - 1; - - #endregion - - private long baseEntityId; - private long firstSuccessorId; - private long secondSuccessorId; - private readonly List idsByInheritanceSchema = new List(); - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (IssueModel.BaseEntity).Assembly, "Xtensive.Orm.Tests.Issues.IssueJira0636_Model"); - configuration.NamingConvention = new NamingConvention { NamespacePolicy = NamespacePolicy.AsIs }; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - #region Issue model entities creation - - baseEntityId = new IssueModel.BaseEntity().Id; - firstSuccessorId = new IssueModel.FirstSuccessor().Id; - secondSuccessorId = new IssueModel.SecondSuccessor().Id; - - #endregion - - #region Complicated model entities creation - - #region ClassTableModel entities creation - - IBaseEntity baseEntity = new ClassTableModel.BaseEntity { Field0 = BaseEntityField0 }; - IFirstSuccessor firstSuccessor = new ClassTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; - ISecondSuccessor secondSuccessor = new ClassTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; - ISecondSuccessorLeaf secondSuccessorLeaf = new ClassTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; - IThirdSuccessor thirdSuccessor = new ClassTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; - IThirdSuccessorLeaf1 thirdSuccessorLeaf1 = new ClassTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; - IThirdSuccessorLeaf2 thirdSuccessorLeaf2 = new ClassTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; - - var classTableStruct = new IdsStruct(InheritanceSchema.ClassTable, - baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, - thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); - idsByInheritanceSchema.Add(classTableStruct); - - #endregion - - #region ConcreteTableModel entities creation - - baseEntity = new ConcreteTableModel.BaseEntity { Field0 = BaseEntityField0 }; - firstSuccessor = new ConcreteTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; - secondSuccessor = new ConcreteTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; - secondSuccessorLeaf = new ConcreteTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; - thirdSuccessor = new ConcreteTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; - thirdSuccessorLeaf1 = new ConcreteTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; - thirdSuccessorLeaf2 = new ConcreteTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; - - var concreteTableStruct = new IdsStruct(InheritanceSchema.ConcreteTable, - baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, - thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); - idsByInheritanceSchema.Add(concreteTableStruct); - - #endregion - - #region SingleTableModel entities creation - - baseEntity = new SingleTableModel.BaseEntity { Field0 = BaseEntityField0 }; - firstSuccessor = new SingleTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; - secondSuccessor = new SingleTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; - secondSuccessorLeaf = new SingleTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; - thirdSuccessor = new SingleTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; - thirdSuccessorLeaf1 = new SingleTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; - thirdSuccessorLeaf2 = new SingleTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; - - var singleTableStruct = new IdsStruct(InheritanceSchema.SingleTable, - baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, - thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); - idsByInheritanceSchema.Add(singleTableStruct); - - #endregion - - #endregion - - transaction.Complete(); - } - } - - #region Issue model tests (including user case - - [Test] - public void SelectBaseEntityFirstTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - GetEntity(WrongId, true); - GetEntity(baseEntityId, false); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, false); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, true); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, true); - GetEntity(secondSuccessorId, false); - } - } - - [Test] - public void SelectBaseEntityInTheMiddleTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, true); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, false); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, false); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, true); - GetEntity(secondSuccessorId, false); - } - } - - [Test] - public void SelectBaseEntityLastTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, true); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, true); - GetEntity(firstSuccessorId, true); - GetEntity(secondSuccessorId, false); - - GetEntity(WrongId, true); - GetEntity(baseEntityId, false); - GetEntity(firstSuccessorId, false); - GetEntity(secondSuccessorId, false); - } - } - - [Test] - public void SelectBeforeCreateTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var id = 5001L; - var entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - new IssueModel.BaseEntity(session, id); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity.Remove(); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - - ++id; - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - new IssueModel.FirstSuccessor(session, id); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity.Remove(); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - - ++id; - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - new IssueModel.SecondSuccessor(session, id); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity.Remove(); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - - ++id; - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - new IssueModel.BaseEntity(session, id); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.Single(id); - entity.Remove(); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - - ++id; - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - new IssueModel.BaseEntity(session, id); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNotNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.Single(id); - entity.Remove(); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - entity = Query.SingleOrDefault(id); - Assert.IsNull(entity); - } - } - - #endregion - - #region Complicated model tests - - [Test] - public void Test00() - { - var actions = new Action[] { - CheckBaseEntity, - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckSecondSuccessorLeaf, - CheckThirdSuccessor, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2 - }; - - InvokeActions(actions); - } - - [Test] - public void Test01() - { - var actions = new Action[] { - CheckBaseEntity, - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2 - }; - - InvokeActions(actions); - } - - [Test] - public void Test02() - { - var actions = new Action[] { - CheckBaseEntity, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor - }; - - InvokeActions(actions); - } - - [Test] - public void Test03() - { - var actions = new Action[] { - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor, - CheckBaseEntity, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2 - }; - - InvokeActions(actions); - } - - [Test] - public void Test04() - { - var actions = new Action[] { - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckBaseEntity - }; - - InvokeActions(actions); - } - - [Test] - public void Test05() - { - var actions = new Action[] { - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckBaseEntity, - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor - }; - - InvokeActions(actions); - } - - [Test] - public void Test06() - { - var actions = new Action[] { - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckFirstSuccessor, - CheckSecondSuccessor, - CheckThirdSuccessor, - CheckBaseEntity - }; - - InvokeActions(actions); - } - - [Test] - public void Test07() - { - var actions = new Action[] { - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckThirdSuccessor, - CheckSecondSuccessor, - CheckSecondSuccessorLeaf, - CheckBaseEntity, - CheckFirstSuccessor - }; - - InvokeActions(actions); - } - - [Test] - public void Test08() - { - var actions = new Action[] { - CheckFirstSuccessor, - CheckBaseEntity, - CheckThirdSuccessor, - CheckSecondSuccessor, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2 - }; - - InvokeActions(actions); - } - - [Test] - public void Test09() - { - var actions = new Action[] { - CheckThirdSuccessorLeaf2, - CheckSecondSuccessorLeaf, - CheckSecondSuccessor, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessor, - CheckFirstSuccessor, - CheckBaseEntity - }; - - InvokeActions(actions); - } - - [Test] - public void Test10() - { - var actions = new Action[] { - CheckBaseEntity, - CheckThirdSuccessorLeaf2, - CheckThirdSuccessor, - CheckThirdSuccessorLeaf1, - CheckSecondSuccessorLeaf, - CheckSecondSuccessor, - CheckFirstSuccessor - }; - - InvokeActions(actions); - } - - [Test] - public void Test11() - { - var actions = new Action[] { - CheckThirdSuccessor, - CheckThirdSuccessorLeaf2, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckSecondSuccessor, - CheckFirstSuccessor, - CheckBaseEntity - }; - - InvokeActions(actions); - } - - [Test] - public void Test12() - { - var actions = new Action[] { - CheckSecondSuccessor, - CheckThirdSuccessor, - CheckSecondSuccessorLeaf, - CheckThirdSuccessorLeaf1, - CheckThirdSuccessorLeaf2, - CheckBaseEntity, - CheckFirstSuccessor - }; - - InvokeActions(actions); - } - - [Test] - public void Test13() - { - var actions = new Action[] { - CheckThirdSuccessorLeaf2, - CheckThirdSuccessorLeaf1, - CheckSecondSuccessorLeaf, - CheckThirdSuccessor, - CheckSecondSuccessor, - CheckFirstSuccessor, - CheckBaseEntity - }; - - InvokeActions(actions); - } - - #endregion - - #region Helper methods - - private void CheckBaseEntity() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - var entity = getEntity(idsStruct.BaseEntityId, false); - Assert.AreEqual(entity.Field0, BaseEntityField0); - - entity = getEntity(idsStruct.FirstSuccessorId, false); - Assert.AreEqual(entity.Field0, FirstSuccessorField0); - - entity = getEntity(idsStruct.SecondSuccessorId, false); - Assert.AreEqual(entity.Field0, SecondSuccessorField0); - - entity = getEntity(idsStruct.SecondSuccessorLeafId, false); - Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); - - entity = getEntity(idsStruct.ThirdSuccessorId, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorField0); - - entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); - - entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); - } - } - - private void CheckFirstSuccessor() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - getEntity(idsStruct.BaseEntityId, true); - - var entity = getEntity(idsStruct.FirstSuccessorId, false); - Assert.AreEqual(entity.Field0, FirstSuccessorField0); - Assert.AreEqual(entity.Field1, FirstSuccessorField1); - - getEntity(idsStruct.SecondSuccessorId, true); - getEntity(idsStruct.SecondSuccessorLeafId, true); - getEntity(idsStruct.ThirdSuccessorId, true); - getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); - getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); - } - } - - private void CheckSecondSuccessor() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - getEntity(idsStruct.BaseEntityId, true); - getEntity(idsStruct.FirstSuccessorId, true); - - var entity = getEntity(idsStruct.SecondSuccessorId, false); - Assert.AreEqual(entity.Field0, SecondSuccessorField0); - Assert.AreEqual(entity.Field2, SecondSuccessorField2); - - entity = getEntity(idsStruct.SecondSuccessorLeafId, false); - Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); - Assert.AreEqual(entity.Field2, SecondSuccessorLeafField2); - - getEntity(idsStruct.ThirdSuccessorId, true); - getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); - getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); - } - } - - private void CheckSecondSuccessorLeaf() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - getEntity(idsStruct.BaseEntityId, true); - getEntity(idsStruct.FirstSuccessorId, true); - getEntity(idsStruct.SecondSuccessorId, true); - - var entity = getEntity(idsStruct.SecondSuccessorLeafId, false); - Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); - Assert.AreEqual(entity.Field2, SecondSuccessorLeafField2); - Assert.AreEqual(entity.LeafCode, SecondSuccessorLeafCode); - - getEntity(idsStruct.ThirdSuccessorId, true); - getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); - getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); - } - } - - private void CheckThirdSuccessor() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - getEntity(idsStruct.BaseEntityId, true); - getEntity(idsStruct.FirstSuccessorId, true); - getEntity(idsStruct.SecondSuccessorId, true); - getEntity(idsStruct.SecondSuccessorLeafId, true); - - var entity = getEntity(idsStruct.ThirdSuccessorId, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorField0); - Assert.AreEqual(entity.Field3, ThirdSuccessorField3); - - entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); - Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf1Field3); - - entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); - Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf2Field3); - } - } - - private void CheckThirdSuccessorLeaf1() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - - getEntity(idsStruct.BaseEntityId, true); - getEntity(idsStruct.FirstSuccessorId, true); - getEntity(idsStruct.SecondSuccessorId, true); - getEntity(idsStruct.SecondSuccessorLeafId, true); - getEntity(idsStruct.ThirdSuccessorId, true); - - var entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); - Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf1Field3); - Assert.AreEqual(entity.Leaf1Code, ThirdSuccessorLeaf1Code); - - getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); - } - } - - private void CheckThirdSuccessorLeaf2() - { - foreach (var idsStruct in idsByInheritanceSchema) { - Func getEntity; - switch (idsStruct.InheritanceSchema) { - case InheritanceSchema.ClassTable: - getEntity = GetEntity; - break; - case InheritanceSchema.ConcreteTable: - getEntity = GetEntity; - break; - case InheritanceSchema.SingleTable: - getEntity = GetEntity; - break; - default: - throw new NotSupportedException(); - } - getEntity(idsStruct.BaseEntityId, true); - getEntity(idsStruct.FirstSuccessorId, true); - getEntity(idsStruct.SecondSuccessorId, true); - getEntity(idsStruct.SecondSuccessorLeafId, true); - getEntity(idsStruct.ThirdSuccessorId, true); - getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); - - var entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); - Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); - Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf2Field3); - Assert.AreEqual(entity.Leaf2Code, ThirdSuccessorLeaf2Code); - } - } - - private void InvokeActions(Action[] actions) - { - OpenSessionAndAction(() => { - foreach (var action in actions) - action.Invoke(); - }); - } - - private void OpenSessionAndAction(Action action) - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - TestLog.InfoRegion("Start openSessionAndAction"); - action(); - TestLog.Info("Finish openSessionAndAction"); - } - } - - private T GetEntity(long keyValue, bool expectedNull) - where T : Entity - { - var entity = Query.SingleOrDefault(keyValue); - if (expectedNull) - Assert.IsNull(entity); - else - Assert.IsNotNull(entity); - return entity; - } - - #endregion - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.05.16 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.Interfaces; +using IssueModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.IssueModel; +using ClassTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.ClassTableModel; +using ConcreteTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.ConcreteTableModel; +using SingleTableModel = Xtensive.Orm.Tests.Issues.IssueJira0636_Model.ComplicatedModel.SingleTableModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace IssueJira0636_Model + { + // Issue model (user case) + namespace IssueModel + { + [HierarchyRoot] + public class BaseEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + public BaseEntity() + { + } + + public BaseEntity(Session session, long id) + : base(session, id) + { + } + } + + public class FirstSuccessor : BaseEntity + { + [Field] + public string StringField1 { get; set; } + + public FirstSuccessor() + { + } + + public FirstSuccessor(Session session, long id) + : base(session, id) + { + } + } + + public class SecondSuccessor : BaseEntity + { + [Field] + public string StringField2 { get; set; } + + public SecondSuccessor() + { + } + + public SecondSuccessor(Session session, long id) + : base(session, id) + { + } + } + } + + // Complicated model for possible apperance of this bug + namespace ComplicatedModel + { + namespace Interfaces + { + internal interface IBaseEntity + { + long Id { get; } + string Field0 { get; set; } + } + + internal interface IFirstSuccessor : IBaseEntity + { + string Field1 { get; set; } + } + + internal interface ISecondSuccessor : IBaseEntity + { + string Field2 { get; set; } + } + + internal interface ISecondSuccessorLeaf : ISecondSuccessor + { + int LeafCode { get; set; } + } + + internal interface IThirdSuccessor : IBaseEntity + { + string Field3 { get; set; } + } + + internal interface IThirdSuccessorLeaf1 : IThirdSuccessor + { + int Leaf1Code { get; set; } + } + + internal interface IThirdSuccessorLeaf2 : IThirdSuccessor + { + int Leaf2Code { get; set; } + } + } + + namespace ClassTableModel + { + /// + /// Base entity + /// + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class BaseEntity : Entity, IBaseEntity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Field0 { get; set; } + } + + /// + /// Successor without own successors + /// + public class FirstSuccessor : BaseEntity, IFirstSuccessor + { + [Field] + public string Field1 { get; set; } + } + + /// + /// Successor with one own successor + /// + public class SecondSuccessor : BaseEntity, ISecondSuccessor + { + [Field] + public string Field2 { get; set; } + } + + public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf + { + [Field] + public int LeafCode { get; set; } + } + + /// + /// Successor with two own successors + /// + public class ThirdSuccessor : BaseEntity, IThirdSuccessor + { + [Field] + public string Field3 { get; set; } + } + + public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 + { + [Field] + public int Leaf1Code { get; set; } + } + + public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 + { + [Field] + public int Leaf2Code { get; set; } + } + } + + namespace ConcreteTableModel + { + /// + /// Base entity + /// + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class BaseEntity : Entity, IBaseEntity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Field0 { get; set; } + } + + /// + /// Successor without own successors + /// + public class FirstSuccessor : BaseEntity, IFirstSuccessor + { + [Field] + public string Field1 { get; set; } + } + + /// + /// Successor with one own successor + /// + public class SecondSuccessor : BaseEntity, ISecondSuccessor + { + [Field] + public string Field2 { get; set; } + } + + public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf + { + [Field] + public int LeafCode { get; set; } + } + + /// + /// Successor with two own successors + /// + public class ThirdSuccessor : BaseEntity, IThirdSuccessor + { + [Field] + public string Field3 { get; set; } + } + + public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 + { + [Field] + public int Leaf1Code { get; set; } + } + + public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 + { + [Field] + public int Leaf2Code { get; set; } + } + } + + namespace SingleTableModel + { + /// + /// Base entity + /// + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class BaseEntity : Entity, IBaseEntity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Field0 { get; set; } + } + + /// + /// Successor without own successors + /// + public class FirstSuccessor : BaseEntity, IFirstSuccessor + { + [Field] + public string Field1 { get; set; } + } + + /// + /// Successor with one own successor + /// + public class SecondSuccessor : BaseEntity, ISecondSuccessor + { + [Field] + public string Field2 { get; set; } + } + + public class SecondSuccessorLeaf : SecondSuccessor, ISecondSuccessorLeaf + { + [Field] + public int LeafCode { get; set; } + } + + /// + /// Successor with two own successors + /// + public class ThirdSuccessor : BaseEntity, IThirdSuccessor + { + [Field] + public string Field3 { get; set; } + } + + public class ThirdSuccessorLeaf1 : ThirdSuccessor, IThirdSuccessorLeaf1 + { + [Field] + public int Leaf1Code { get; set; } + } + + public class ThirdSuccessorLeaf2 : ThirdSuccessor, IThirdSuccessorLeaf2 + { + [Field] + public int Leaf2Code { get; set; } + } + } + } + } + + public class IssueJira0636_SessionCacheTest : AutoBuildTest + { + private struct IdsStruct + { + public InheritanceSchema InheritanceSchema { get; private set; } + + public long BaseEntityId { get; private set; } + public long FirstSuccessorId { get; private set; } + public long SecondSuccessorId { get; private set; } + public long SecondSuccessorLeafId { get; private set; } + public long ThirdSuccessorId { get; private set; } + public long ThirdSuccessorLeaf1Id { get; private set; } + public long ThirdSuccessorLeaf2Id { get; private set; } + + public IdsStruct(InheritanceSchema inheritanceSchema, long baseEntityId, long firstSuccessorId, long secondSuccessorId, long secondSuccessorLeafId, + long thirdSuccessorId, long thirdSuccessorLeaf1Id, long thirdSuccessorLeaf2Id) + : this() + { + InheritanceSchema = inheritanceSchema; + BaseEntityId = baseEntityId; + FirstSuccessorId = firstSuccessorId; + SecondSuccessorId = secondSuccessorId; + SecondSuccessorLeafId = secondSuccessorLeafId; + ThirdSuccessorId = thirdSuccessorId; + ThirdSuccessorLeaf1Id = thirdSuccessorLeaf1Id; + ThirdSuccessorLeaf2Id = thirdSuccessorLeaf2Id; + } + } + + #region Consts + + private const string BaseEntityField0 = "BaseEntityField0"; + + private const string FirstSuccessorField0 = "FirstSuccessorField0"; + private const string FirstSuccessorField1 = "FirstSuccessorField1"; + + private const string SecondSuccessorField0 = "SecondSuccessorField0"; + private const string SecondSuccessorField2 = "SecondSuccessorField2"; + + private const string SecondSuccessorLeafField0 = "SecondSuccessorLeafField0"; + private const string SecondSuccessorLeafField2 = "SecondSuccessorLeafField2"; + private const int SecondSuccessorLeafCode = 99; + + private const string ThirdSuccessorField0 = "ThirdSuccessorField0"; + private const string ThirdSuccessorField3 = "ThirdSuccessorField3"; + + private const string ThirdSuccessorLeaf1Field0 = "ThirdSuccessorLeaf1Field0"; + private const string ThirdSuccessorLeaf1Field3 = "ThirdSuccessorLeaf1Field3"; + private const int ThirdSuccessorLeaf1Code = 98; + + private const string ThirdSuccessorLeaf2Field0 = "ThirdSuccessorLeaf2Field0"; + private const string ThirdSuccessorLeaf2Field3 = "ThirdSuccessorLeaf2Field3"; + private const int ThirdSuccessorLeaf2Code = 97; + private const long WrongId = int.MaxValue - 1; + + #endregion + + private long baseEntityId; + private long firstSuccessorId; + private long secondSuccessorId; + private readonly List idsByInheritanceSchema = new List(); + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (IssueModel.BaseEntity).Assembly, "Xtensive.Orm.Tests.Issues.IssueJira0636_Model"); + configuration.NamingConvention = new NamingConvention { NamespacePolicy = NamespacePolicy.AsIs }; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + #region Issue model entities creation + + baseEntityId = new IssueModel.BaseEntity().Id; + firstSuccessorId = new IssueModel.FirstSuccessor().Id; + secondSuccessorId = new IssueModel.SecondSuccessor().Id; + + #endregion + + #region Complicated model entities creation + + #region ClassTableModel entities creation + + IBaseEntity baseEntity = new ClassTableModel.BaseEntity { Field0 = BaseEntityField0 }; + IFirstSuccessor firstSuccessor = new ClassTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; + ISecondSuccessor secondSuccessor = new ClassTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; + ISecondSuccessorLeaf secondSuccessorLeaf = new ClassTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; + IThirdSuccessor thirdSuccessor = new ClassTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; + IThirdSuccessorLeaf1 thirdSuccessorLeaf1 = new ClassTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; + IThirdSuccessorLeaf2 thirdSuccessorLeaf2 = new ClassTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; + + var classTableStruct = new IdsStruct(InheritanceSchema.ClassTable, + baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, + thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); + idsByInheritanceSchema.Add(classTableStruct); + + #endregion + + #region ConcreteTableModel entities creation + + baseEntity = new ConcreteTableModel.BaseEntity { Field0 = BaseEntityField0 }; + firstSuccessor = new ConcreteTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; + secondSuccessor = new ConcreteTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; + secondSuccessorLeaf = new ConcreteTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; + thirdSuccessor = new ConcreteTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; + thirdSuccessorLeaf1 = new ConcreteTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; + thirdSuccessorLeaf2 = new ConcreteTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; + + var concreteTableStruct = new IdsStruct(InheritanceSchema.ConcreteTable, + baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, + thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); + idsByInheritanceSchema.Add(concreteTableStruct); + + #endregion + + #region SingleTableModel entities creation + + baseEntity = new SingleTableModel.BaseEntity { Field0 = BaseEntityField0 }; + firstSuccessor = new SingleTableModel.FirstSuccessor { Field0 = FirstSuccessorField0, Field1 = FirstSuccessorField1 }; + secondSuccessor = new SingleTableModel.SecondSuccessor { Field0 = SecondSuccessorField0, Field2 = SecondSuccessorField2 }; + secondSuccessorLeaf = new SingleTableModel.SecondSuccessorLeaf { Field0 = SecondSuccessorLeafField0, Field2 = SecondSuccessorLeafField2, LeafCode = SecondSuccessorLeafCode }; + thirdSuccessor = new SingleTableModel.ThirdSuccessor { Field0 = ThirdSuccessorField0, Field3 = ThirdSuccessorField3 }; + thirdSuccessorLeaf1 = new SingleTableModel.ThirdSuccessorLeaf1 { Field0 = ThirdSuccessorLeaf1Field0, Field3 = ThirdSuccessorLeaf1Field3, Leaf1Code = ThirdSuccessorLeaf1Code }; + thirdSuccessorLeaf2 = new SingleTableModel.ThirdSuccessorLeaf2 { Field0 = ThirdSuccessorLeaf2Field0, Field3 = ThirdSuccessorLeaf2Field3, Leaf2Code = ThirdSuccessorLeaf2Code }; + + var singleTableStruct = new IdsStruct(InheritanceSchema.SingleTable, + baseEntity.Id, firstSuccessor.Id, secondSuccessor.Id, secondSuccessorLeaf.Id, + thirdSuccessor.Id, thirdSuccessorLeaf1.Id, thirdSuccessorLeaf2.Id); + idsByInheritanceSchema.Add(singleTableStruct); + + #endregion + + #endregion + + transaction.Complete(); + } + } + + #region Issue model tests (including user case + + [Test] + public void SelectBaseEntityFirstTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + GetEntity(WrongId, true); + GetEntity(baseEntityId, false); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, false); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, true); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, true); + GetEntity(secondSuccessorId, false); + } + } + + [Test] + public void SelectBaseEntityInTheMiddleTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, true); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, false); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, false); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, true); + GetEntity(secondSuccessorId, false); + } + } + + [Test] + public void SelectBaseEntityLastTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, true); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, true); + GetEntity(firstSuccessorId, true); + GetEntity(secondSuccessorId, false); + + GetEntity(WrongId, true); + GetEntity(baseEntityId, false); + GetEntity(firstSuccessorId, false); + GetEntity(secondSuccessorId, false); + } + } + + [Test] + public void SelectBeforeCreateTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var id = 5001L; + var entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + new IssueModel.BaseEntity(session, id); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity.Remove(); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + + ++id; + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + new IssueModel.FirstSuccessor(session, id); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity.Remove(); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + + ++id; + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + new IssueModel.SecondSuccessor(session, id); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity.Remove(); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + + ++id; + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + new IssueModel.BaseEntity(session, id); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.Single(id); + entity.Remove(); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + + ++id; + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + new IssueModel.BaseEntity(session, id); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNotNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.Single(id); + entity.Remove(); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + entity = Query.SingleOrDefault(id); + Assert.IsNull(entity); + } + } + + #endregion + + #region Complicated model tests + + [Test] + public void Test00() + { + var actions = new Action[] { + CheckBaseEntity, + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckSecondSuccessorLeaf, + CheckThirdSuccessor, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2 + }; + + InvokeActions(actions); + } + + [Test] + public void Test01() + { + var actions = new Action[] { + CheckBaseEntity, + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2 + }; + + InvokeActions(actions); + } + + [Test] + public void Test02() + { + var actions = new Action[] { + CheckBaseEntity, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor + }; + + InvokeActions(actions); + } + + [Test] + public void Test03() + { + var actions = new Action[] { + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor, + CheckBaseEntity, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2 + }; + + InvokeActions(actions); + } + + [Test] + public void Test04() + { + var actions = new Action[] { + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckBaseEntity + }; + + InvokeActions(actions); + } + + [Test] + public void Test05() + { + var actions = new Action[] { + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckBaseEntity, + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor + }; + + InvokeActions(actions); + } + + [Test] + public void Test06() + { + var actions = new Action[] { + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckFirstSuccessor, + CheckSecondSuccessor, + CheckThirdSuccessor, + CheckBaseEntity + }; + + InvokeActions(actions); + } + + [Test] + public void Test07() + { + var actions = new Action[] { + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckThirdSuccessor, + CheckSecondSuccessor, + CheckSecondSuccessorLeaf, + CheckBaseEntity, + CheckFirstSuccessor + }; + + InvokeActions(actions); + } + + [Test] + public void Test08() + { + var actions = new Action[] { + CheckFirstSuccessor, + CheckBaseEntity, + CheckThirdSuccessor, + CheckSecondSuccessor, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2 + }; + + InvokeActions(actions); + } + + [Test] + public void Test09() + { + var actions = new Action[] { + CheckThirdSuccessorLeaf2, + CheckSecondSuccessorLeaf, + CheckSecondSuccessor, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessor, + CheckFirstSuccessor, + CheckBaseEntity + }; + + InvokeActions(actions); + } + + [Test] + public void Test10() + { + var actions = new Action[] { + CheckBaseEntity, + CheckThirdSuccessorLeaf2, + CheckThirdSuccessor, + CheckThirdSuccessorLeaf1, + CheckSecondSuccessorLeaf, + CheckSecondSuccessor, + CheckFirstSuccessor + }; + + InvokeActions(actions); + } + + [Test] + public void Test11() + { + var actions = new Action[] { + CheckThirdSuccessor, + CheckThirdSuccessorLeaf2, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckSecondSuccessor, + CheckFirstSuccessor, + CheckBaseEntity + }; + + InvokeActions(actions); + } + + [Test] + public void Test12() + { + var actions = new Action[] { + CheckSecondSuccessor, + CheckThirdSuccessor, + CheckSecondSuccessorLeaf, + CheckThirdSuccessorLeaf1, + CheckThirdSuccessorLeaf2, + CheckBaseEntity, + CheckFirstSuccessor + }; + + InvokeActions(actions); + } + + [Test] + public void Test13() + { + var actions = new Action[] { + CheckThirdSuccessorLeaf2, + CheckThirdSuccessorLeaf1, + CheckSecondSuccessorLeaf, + CheckThirdSuccessor, + CheckSecondSuccessor, + CheckFirstSuccessor, + CheckBaseEntity + }; + + InvokeActions(actions); + } + + #endregion + + #region Helper methods + + private void CheckBaseEntity() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + var entity = getEntity(idsStruct.BaseEntityId, false); + Assert.AreEqual(entity.Field0, BaseEntityField0); + + entity = getEntity(idsStruct.FirstSuccessorId, false); + Assert.AreEqual(entity.Field0, FirstSuccessorField0); + + entity = getEntity(idsStruct.SecondSuccessorId, false); + Assert.AreEqual(entity.Field0, SecondSuccessorField0); + + entity = getEntity(idsStruct.SecondSuccessorLeafId, false); + Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); + + entity = getEntity(idsStruct.ThirdSuccessorId, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorField0); + + entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); + + entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); + } + } + + private void CheckFirstSuccessor() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + getEntity(idsStruct.BaseEntityId, true); + + var entity = getEntity(idsStruct.FirstSuccessorId, false); + Assert.AreEqual(entity.Field0, FirstSuccessorField0); + Assert.AreEqual(entity.Field1, FirstSuccessorField1); + + getEntity(idsStruct.SecondSuccessorId, true); + getEntity(idsStruct.SecondSuccessorLeafId, true); + getEntity(idsStruct.ThirdSuccessorId, true); + getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); + getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); + } + } + + private void CheckSecondSuccessor() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + getEntity(idsStruct.BaseEntityId, true); + getEntity(idsStruct.FirstSuccessorId, true); + + var entity = getEntity(idsStruct.SecondSuccessorId, false); + Assert.AreEqual(entity.Field0, SecondSuccessorField0); + Assert.AreEqual(entity.Field2, SecondSuccessorField2); + + entity = getEntity(idsStruct.SecondSuccessorLeafId, false); + Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); + Assert.AreEqual(entity.Field2, SecondSuccessorLeafField2); + + getEntity(idsStruct.ThirdSuccessorId, true); + getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); + getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); + } + } + + private void CheckSecondSuccessorLeaf() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + getEntity(idsStruct.BaseEntityId, true); + getEntity(idsStruct.FirstSuccessorId, true); + getEntity(idsStruct.SecondSuccessorId, true); + + var entity = getEntity(idsStruct.SecondSuccessorLeafId, false); + Assert.AreEqual(entity.Field0, SecondSuccessorLeafField0); + Assert.AreEqual(entity.Field2, SecondSuccessorLeafField2); + Assert.AreEqual(entity.LeafCode, SecondSuccessorLeafCode); + + getEntity(idsStruct.ThirdSuccessorId, true); + getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); + getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); + } + } + + private void CheckThirdSuccessor() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + getEntity(idsStruct.BaseEntityId, true); + getEntity(idsStruct.FirstSuccessorId, true); + getEntity(idsStruct.SecondSuccessorId, true); + getEntity(idsStruct.SecondSuccessorLeafId, true); + + var entity = getEntity(idsStruct.ThirdSuccessorId, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorField0); + Assert.AreEqual(entity.Field3, ThirdSuccessorField3); + + entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); + Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf1Field3); + + entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); + Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf2Field3); + } + } + + private void CheckThirdSuccessorLeaf1() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + + getEntity(idsStruct.BaseEntityId, true); + getEntity(idsStruct.FirstSuccessorId, true); + getEntity(idsStruct.SecondSuccessorId, true); + getEntity(idsStruct.SecondSuccessorLeafId, true); + getEntity(idsStruct.ThirdSuccessorId, true); + + var entity = getEntity(idsStruct.ThirdSuccessorLeaf1Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf1Field0); + Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf1Field3); + Assert.AreEqual(entity.Leaf1Code, ThirdSuccessorLeaf1Code); + + getEntity(idsStruct.ThirdSuccessorLeaf2Id, true); + } + } + + private void CheckThirdSuccessorLeaf2() + { + foreach (var idsStruct in idsByInheritanceSchema) { + Func getEntity; + switch (idsStruct.InheritanceSchema) { + case InheritanceSchema.ClassTable: + getEntity = GetEntity; + break; + case InheritanceSchema.ConcreteTable: + getEntity = GetEntity; + break; + case InheritanceSchema.SingleTable: + getEntity = GetEntity; + break; + default: + throw new NotSupportedException(); + } + getEntity(idsStruct.BaseEntityId, true); + getEntity(idsStruct.FirstSuccessorId, true); + getEntity(idsStruct.SecondSuccessorId, true); + getEntity(idsStruct.SecondSuccessorLeafId, true); + getEntity(idsStruct.ThirdSuccessorId, true); + getEntity(idsStruct.ThirdSuccessorLeaf1Id, true); + + var entity = getEntity(idsStruct.ThirdSuccessorLeaf2Id, false); + Assert.AreEqual(entity.Field0, ThirdSuccessorLeaf2Field0); + Assert.AreEqual(entity.Field3, ThirdSuccessorLeaf2Field3); + Assert.AreEqual(entity.Leaf2Code, ThirdSuccessorLeaf2Code); + } + } + + private void InvokeActions(Action[] actions) + { + OpenSessionAndAction(() => { + foreach (var action in actions) + action.Invoke(); + }); + } + + private void OpenSessionAndAction(Action action) + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + TestLog.InfoRegion("Start openSessionAndAction"); + action(); + TestLog.Info("Finish openSessionAndAction"); + } + } + + private T GetEntity(long keyValue, bool expectedNull) + where T : Entity + { + var entity = Query.SingleOrDefault(keyValue); + if (expectedNull) + Assert.IsNull(entity); + else + Assert.IsNotNull(entity); + return entity; + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0637_EntitySetFullOfNullsOnEnumeration.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0637_EntitySetFullOfNullsOnEnumeration.cs index a2f4e70818..36c3071f76 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0637_EntitySetFullOfNullsOnEnumeration.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0637_EntitySetFullOfNullsOnEnumeration.cs @@ -1,169 +1,169 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.07.26 - -using System.Linq; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0637_EntitySetFullOfNullsOnEnumerationModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0637_EntitySetFullOfNullsOnEnumerationModel -{ - [HierarchyRoot] - public class Table : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - public EntitySet Legs { get; set; } - } - - [HierarchyRoot] - public class TableLeg : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Legs", OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] - public Table Table { get; set; } - } - - [HierarchyRoot] - public class ReferencingEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field, Association(PairTo = "TestA", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet TestBs { get; private set; } - } - - [HierarchyRoot] - public class TestB : Entity - { - public TestB(Session session) : base(session) { } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public ReferencingEntity TestA { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0637_EntitySetFullOfNullsOnEnumeration : AutoBuildTest - { - [Test] - public void DirectEnumerationTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var table = session.Query.All
().First(); - session.Remove(table.Legs); - foreach (var leg in table.Legs.AsEnumerable()) { - Assert.That(leg, Is.Not.Null); - Assert.That(leg.IsRemoved, Is.True); - } - } - } - - [Test] - public void ToListTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var table = session.Query.All
().First(); - session.Remove(table.Legs); - foreach (var leg in table.Legs.ToList()) { - Assert.That(leg, Is.Not.Null); - Assert.That(leg.IsRemoved, Is.True); - } - } - } - - [Test] - public void ToArrayTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var table = session.Query.All
().First(); - session.Remove(table.Legs); - foreach (var leg in table.Legs.ToArray()) { - Assert.That(leg, Is.Not.Null); - Assert.That(leg.IsRemoved, Is.True); - } - } - } - - [Test] - public void UnsavedChangesTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { - var referencing = new ReferencingEntity() { Text = "A" }; - var count = referencing.TestBs.Count; - Assert.That(count, Is.EqualTo(0)); - var testB = new TestB(session) { Text = "B", TestA = referencing }; - - count = referencing.TestBs.Count; - var list = new List(); - foreach (var item in referencing.TestBs) - list.Add(item); - - count = list.Count; - Assert.That(count, Is.EqualTo(1)); - - count = referencing.TestBs.Count; - Assert.That(count, Is.EqualTo(1)); - var list1 = referencing.TestBs.ToList(); - - count = list1.Count; - Assert.That(count, Is.EqualTo(1)); - - count = referencing.TestBs.Count; - Assert.That(count, Is.EqualTo(1)); - } - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var table = new Table { Name = "Ikea coffee table" }; - table.Legs.Add(new TableLeg { Name = "Leg 1" }); - table.Legs.Add(new TableLeg { Name = "Leg 2" }); - table.Legs.Add(new TableLeg { Name = "Leg 3" }); - table.Legs.Add(new TableLeg { Name = "Leg 4" }); - - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (Table).Assembly, typeof (Table).Namespace); - return configuration; - } - } -} - +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.07.26 + +using System.Linq; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0637_EntitySetFullOfNullsOnEnumerationModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0637_EntitySetFullOfNullsOnEnumerationModel +{ + [HierarchyRoot] + public class Table : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + public EntitySet Legs { get; set; } + } + + [HierarchyRoot] + public class TableLeg : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Legs", OnOwnerRemove = OnRemoveAction.None, OnTargetRemove = OnRemoveAction.None)] + public Table Table { get; set; } + } + + [HierarchyRoot] + public class ReferencingEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field, Association(PairTo = "TestA", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet TestBs { get; private set; } + } + + [HierarchyRoot] + public class TestB : Entity + { + public TestB(Session session) : base(session) { } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public ReferencingEntity TestA { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0637_EntitySetFullOfNullsOnEnumeration : AutoBuildTest + { + [Test] + public void DirectEnumerationTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var table = session.Query.All
().First(); + session.Remove(table.Legs); + foreach (var leg in table.Legs.AsEnumerable()) { + Assert.That(leg, Is.Not.Null); + Assert.That(leg.IsRemoved, Is.True); + } + } + } + + [Test] + public void ToListTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var table = session.Query.All
().First(); + session.Remove(table.Legs); + foreach (var leg in table.Legs.ToList()) { + Assert.That(leg, Is.Not.Null); + Assert.That(leg.IsRemoved, Is.True); + } + } + } + + [Test] + public void ToArrayTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var table = session.Query.All
().First(); + session.Remove(table.Legs); + foreach (var leg in table.Legs.ToArray()) { + Assert.That(leg, Is.Not.Null); + Assert.That(leg.IsRemoved, Is.True); + } + } + } + + [Test] + public void UnsavedChangesTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation))) { + var referencing = new ReferencingEntity() { Text = "A" }; + var count = referencing.TestBs.Count; + Assert.That(count, Is.EqualTo(0)); + var testB = new TestB(session) { Text = "B", TestA = referencing }; + + count = referencing.TestBs.Count; + var list = new List(); + foreach (var item in referencing.TestBs) + list.Add(item); + + count = list.Count; + Assert.That(count, Is.EqualTo(1)); + + count = referencing.TestBs.Count; + Assert.That(count, Is.EqualTo(1)); + var list1 = referencing.TestBs.ToList(); + + count = list1.Count; + Assert.That(count, Is.EqualTo(1)); + + count = referencing.TestBs.Count; + Assert.That(count, Is.EqualTo(1)); + } + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var table = new Table { Name = "Ikea coffee table" }; + table.Legs.Add(new TableLeg { Name = "Leg 1" }); + table.Legs.Add(new TableLeg { Name = "Leg 2" }); + table.Legs.Add(new TableLeg { Name = "Leg 3" }); + table.Legs.Add(new TableLeg { Name = "Leg 4" }); + + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (Table).Assembly, typeof (Table).Namespace); + return configuration; + } + } +} + diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0641_IndexFilterExpressionTranslationBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0641_IndexFilterExpressionTranslationBug.cs index 34b9097751..c6dddb608e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0641_IndexFilterExpressionTranslationBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0641_IndexFilterExpressionTranslationBug.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.08.09 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests.Issues.IssueJira0641_IndexFilterExpressionTranslationBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0641_IndexFilterExpressionTranslationBugModel -{ - [HierarchyRoot] - [Index("Text", Filter = "NotBilledCalls")] - public class BandwidthCall : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public bool IsBilled { get; set; } - - [Field] - public DirectionEnum Direction { get; set; } - - private static Expression> NotBilledCalls() - { - return e => e.IsBilled==false && (e.Direction).In(DirectionEnum.FirstIn, DirectionEnum.FirstOut); - } - } - - [HierarchyRoot] - public class IndexlessBandwidthCall : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public bool IsBilled { get; set; } - - [Field] - public DirectionEnum Direction { get; set; } - } - - public enum DirectionEnum - { - FirstIn, - FirstOut - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public sealed class IssueJira0641_IndexFilterExpressionTranslationBug - { - [Test] - public void MainTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (BandwidthCall).Assembly, typeof (BandwidthCall).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - - Domain domain = null; - Assert.DoesNotThrow(()=> domain = Domain.Build(configuration)); - if (domain!=null) - domain.Dispose(); - } - - [Test] - public void InOperationInQueryTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (IndexlessBandwidthCall)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow(() => session.Query.All().Where(e => e.Direction.In(DirectionEnum.FirstIn, DirectionEnum.FirstOut)).Run()); - } - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.08.09 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests.Issues.IssueJira0641_IndexFilterExpressionTranslationBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0641_IndexFilterExpressionTranslationBugModel +{ + [HierarchyRoot] + [Index("Text", Filter = "NotBilledCalls")] + public class BandwidthCall : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public bool IsBilled { get; set; } + + [Field] + public DirectionEnum Direction { get; set; } + + private static Expression> NotBilledCalls() + { + return e => e.IsBilled==false && (e.Direction).In(DirectionEnum.FirstIn, DirectionEnum.FirstOut); + } + } + + [HierarchyRoot] + public class IndexlessBandwidthCall : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public bool IsBilled { get; set; } + + [Field] + public DirectionEnum Direction { get; set; } + } + + public enum DirectionEnum + { + FirstIn, + FirstOut + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public sealed class IssueJira0641_IndexFilterExpressionTranslationBug + { + [Test] + public void MainTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (BandwidthCall).Assembly, typeof (BandwidthCall).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + + Domain domain = null; + Assert.DoesNotThrow(()=> domain = Domain.Build(configuration)); + if (domain!=null) + domain.Dispose(); + } + + [Test] + public void InOperationInQueryTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (IndexlessBandwidthCall)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow(() => session.Query.All().Where(e => e.Direction.In(DirectionEnum.FirstIn, DirectionEnum.FirstOut)).Run()); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0643_OracleDateTimeOffsetExtractionBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0643_OracleDateTimeOffsetExtractionBug.cs index a89abfcf69..737dae4580 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0643_OracleDateTimeOffsetExtractionBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0643_OracleDateTimeOffsetExtractionBug.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.04.29 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0643_OracleDateTimeOffsetExtractionBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0643_OracleDateTimeOffsetExtractionBugModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public DateTime DateTimeField { get; set; } - - [Field] - public DateTimeOffset DateTimeOffsetField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0643_OracleDateTimeOffsetExtractionBug : AutoBuildTest - { - private DateTime[] dates; - private DateTimeOffset[] dateTimeOffsets; - - [Test] - public void MainTest() - { - var configuration = BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Validate; - Assert.DoesNotThrow(() => Domain = BuildDomain(configuration)); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(5)); - foreach (var source in session.Query.All()) { - Assert.That(dates.Contains(source.DateTimeField)); - Assert.That(dateTimeOffsets.Contains(source.DateTimeOffsetField)); - } - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Oracle); - Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); - } - - protected override void PopulateData() - { - dates = new DateTime[5]; - dateTimeOffsets = new DateTimeOffset[5]; - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 5; i++) { - new TestEntity { - DateTimeField = dates[i] = DateTime.Now.AddHours(i), - DateTimeOffsetField = dateTimeOffsets[i] = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(i)) - }; - } - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.04.29 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0643_OracleDateTimeOffsetExtractionBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0643_OracleDateTimeOffsetExtractionBugModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public DateTime DateTimeField { get; set; } + + [Field] + public DateTimeOffset DateTimeOffsetField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0643_OracleDateTimeOffsetExtractionBug : AutoBuildTest + { + private DateTime[] dates; + private DateTimeOffset[] dateTimeOffsets; + + [Test] + public void MainTest() + { + var configuration = BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Validate; + Assert.DoesNotThrow(() => Domain = BuildDomain(configuration)); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(5)); + foreach (var source in session.Query.All()) { + Assert.That(dates.Contains(source.DateTimeField)); + Assert.That(dateTimeOffsets.Contains(source.DateTimeOffsetField)); + } + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Oracle); + Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); + } + + protected override void PopulateData() + { + dates = new DateTime[5]; + dateTimeOffsets = new DateTimeOffset[5]; + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < 5; i++) { + new TestEntity { + DateTimeField = dates[i] = DateTime.Now.AddHours(i), + DateTimeOffsetField = dateTimeOffsets[i] = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(i)) + }; + } + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs index 8a397b9ca1..222f0c1549 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs @@ -1,592 +1,592 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.04.16 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Upgrade; -using ModelNamespace = Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel -{ - namespace MainTestModel - { - [HierarchyRoot] - public class SuperUniqueTestClass1 : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Text { get; set; } - - [Field] - public double Value { get; set; } - } - - [HierarchyRoot] - public class SuperUniqueTestClass2 : Entity - { - [Field, Key] - public int Id { get; set; } - } - } - - namespace HintTest - { - - #region BaseVersion - - namespace BaseVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public string Text { get; set; } - } - } - - #endregion - - #region ChangeFieldTypeVersion - - namespace ChangeFieldTypeVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Number { get; set; } - - [Field] - public string Text { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new ChangeFieldTypeHint(typeof (Order), "Number")); - } - } - } - - #endregion - - #region CopyFieldVersion - - namespace CopyFieldVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public string Text { get; set; } - - [Field] - public string Description { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new CopyFieldHint(typeof (BaseVersion.Order), "Text", typeof (Order), "Description")); - } - } - } - - #endregion - - #region MoveFieldVersion - - namespace MoveFieldVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new MoveFieldHint(typeof (BaseVersion.Order), "Text", typeof (Customer), "Description")); - } - } - } - - #endregion - - #region RecycledTypeVersion - - namespace RecycledTypeVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public string Text { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RecycledTypeHint(typeof (Order))); - } - } - } - - #endregion - - #region RemoveFieldVersion - - namespace RemoveFieldVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RemoveFieldHint(typeof (BaseVersion.Order), "Number")); - } - } - } - - #endregion - - #region RemoveTypeVersion - - namespace RemoveTypeVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RemoveTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel.HintTest.BaseVersion.Order")); - } - } - } - - #endregion - - #region RenameFieldVersion - - namespace RenameFieldVersion - { - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string LastName { get; set; } - - [Field] - public string FirstName { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public string Text { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RenameFieldHint(typeof (Customer), "Name", "LastName")); - } - } - } - - #endregion - - #region RenameTypeVersion - - namespace RenameTypeVersion - { - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public long Number { get; set; } - - [Field] - public string Text { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel.HintTest.BaseVersion.Customer", typeof (Person))); - } - } - } - - #endregion - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public sealed class IssueJira0647_StoredDomainModelMappingsUpdateBug - { - private class ClientNodeConfiguration - { - public string Name { get; set; } - public ConnectionInfo ConnectionInfo { get; set; } - public string InitializationSql { get; set; } - public string DefaultSchema { get; set; } - } - - private ClientNodeConfiguration alpha; - private ClientNodeConfiguration beta; - private ClientNodeConfiguration main; - - [OneTimeSetUp] - public void TestFixtureSetUp() - { - Require.ProviderIs(StorageProvider.SqlServer); - BuildNodeConfigurationsMetadata(); - } - - [Test] - public void MainTest() - { - var configuration = BuildConfiguration(alpha, DomainUpgradeMode.Recreate, typeof (ModelNamespace.MainTestModel.SuperUniqueTestClass1)); - - using (var domain = Domain.Build(configuration)) { - Assert.That(domain.Configuration.IsMultischema, Is.EqualTo(true)); - Assert.That(domain.Configuration.IsMultidatabase, Is.EqualTo(false)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); - - CheckNode(domain, alpha.Name, false); - CheckNode(domain, beta.Name, true); - } - } - - [Test] - public void ChangeFieldTypeHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.ChangeFieldTypeVersion.Customer)); - } - - [Test] - public void CopyFieldHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.CopyFieldVersion.Customer)); - } - - [Test] - public void MoveFieldHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.MoveFieldVersion.Customer)); - } - - [Test] - public void RemoveFieldHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RemoveFieldVersion.Customer)); - } - - [Test] - public void RemoveTypeHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RemoveTypeVersion.Customer)); - } - - [Test] - public void RenameFieldHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RenameFieldVersion.Customer)); - } - - [Test] - public void RenameTypeHintTest() - { - BuildBaseVersion(); - BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RenameTypeVersion.Person)); - } - - private void BuildBaseVersion() - { - var configuration = BuildConfiguration(main, DomainUpgradeMode.Recreate, typeof (ModelNamespace.HintTest.BaseVersion.Customer)); - using (var domain = Domain.Build(configuration)) { - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); - - using (var session = domain.OpenSession()) { - session.SelectStorageNode(alpha.Name); - using (var tx = session.OpenTransaction()) { - new ModelNamespace.HintTest.BaseVersion.Customer { Name = "CustomerName" }; - new ModelNamespace.HintTest.BaseVersion.Customer { Name = "Groznov" }; - new ModelNamespace.HintTest.BaseVersion.Order { Number = 99, Text = "Test order number 99" }; - new ModelNamespace.HintTest.BaseVersion.Order { Number = 1, Text = "Test order number 1" }; - tx.Complete(); - } - } - } - } - - private void BuildUpgradedVersion(Type type) - { - var configuration = BuildConfiguration(main, DomainUpgradeMode.PerformSafely, type); - using (var domain = Domain.Build(configuration)) { - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.PerformSafely)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.PerformSafely)); - } - } - - private void CheckNode(Domain domain, string nodeName, bool spoiledExpected) - { - var node = domain.StorageNodeManager.GetNode(nodeName); - Assert.IsNotNull(node); - - var expectedSchema = node.Configuration.SchemaMapping.Apply(domain.Configuration.DefaultSchema); - - var spoiledModel = domain.Model.ToStoredModel(node.TypeIdRegistry); - spoiledModel.UpdateReferences(); - - var currentModel = domain.Model.ToStoredModel(node.TypeIdRegistry); - currentModel.UpdateReferences(); - currentModel.UpdateMappings(node.Configuration); //this operation suppose to be performed by DataObjects internally - - foreach (var typeInfo in currentModel.Types.Where(t => !t.IsSystem)) - Assert.AreEqual(typeInfo.MappingSchema, expectedSchema); - - var func = spoiledExpected ? new Action(Assert.AreNotEqual) : new Action(Assert.AreEqual); - foreach (var typeInfo in spoiledModel.Types.Where(t => !t.IsSystem)) - func(typeInfo.MappingSchema, expectedSchema); - } - - private NodeConfiguration BuildNodeConfiguration(DomainConfiguration domainConfiguration, ClientNodeConfiguration nodeConfiguration, DomainUpgradeMode upgradeMode) - { - var node = new NodeConfiguration(nodeConfiguration.Name); - node.ConnectionInfo = nodeConfiguration.ConnectionInfo; - node.ConnectionInitializationSql = nodeConfiguration.InitializationSql; - node.UpgradeMode = upgradeMode; - if (!domainConfiguration.DefaultSchema.IsNullOrEmpty() && !nodeConfiguration.DefaultSchema.IsNullOrEmpty()) - node.SchemaMapping.Add(domainConfiguration.DefaultSchema, nodeConfiguration.DefaultSchema); - return node; - } - - private DomainConfiguration BuildConfiguration(ClientNodeConfiguration nodeConfig, DomainUpgradeMode upgradeMode, Type modelType) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.ConnectionInfo = nodeConfig.ConnectionInfo; - configuration.ConnectionInitializationSql = nodeConfig.InitializationSql; - configuration.UpgradeMode = upgradeMode; - configuration.DefaultSchema = nodeConfig.DefaultSchema; - configuration.Types.Register(modelType.Assembly, modelType.Namespace); - return configuration; - } - - private void BuildNodeConfigurationsMetadata() - { - var defaultConnection = DomainConfigurationFactory.Create().ConnectionInfo; - main = new ClientNodeConfiguration { - Name = "main", - ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), - InitializationSql = "USE [DO-Tests-1]", - DefaultSchema = "dbo" - }; - alpha = new ClientNodeConfiguration { - Name = "alpha", - ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), - InitializationSql = "USE [DO-Tests-1]", - DefaultSchema = "Model1" - }; - - beta = new ClientNodeConfiguration { - Name = "beta", - ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), - InitializationSql = "USE [DO-Tests-2]", - DefaultSchema = "Model2" - }; - } - - private ConnectionInfo ComposeConnectionToMasterDatabase(ConnectionInfo baseConnectionInfo) - { - if (baseConnectionInfo.ConnectionUrl==null) - throw new InvalidOperationException("Can't convert connection string based ConnectionInfo"); - - var provider = baseConnectionInfo.ConnectionUrl.Protocol; - var user = baseConnectionInfo.ConnectionUrl.User; - var password = baseConnectionInfo.ConnectionUrl.Password; - var host = baseConnectionInfo.ConnectionUrl.Host; - var port = baseConnectionInfo.ConnectionUrl.Port; - var database = "master"; - var parameters = baseConnectionInfo.ConnectionUrl.Params; - - string urlTemplate = "{0}://{1}{2}{3}/{4}{5}"; - var authenticationPartTemplate = "{0}:{1}@"; - - var authentication = user.IsNullOrEmpty() - ? string.Empty - : string.Format(authenticationPartTemplate, user, password); - - var portPart = port==0 - ? string.Empty - : ":" + port; - - var parametersPart = string.Empty; - if (parameters.Count > 0) { - parametersPart += "?"; - parametersPart = parameters.Aggregate(parametersPart, (current, parameter) => current + (parameter.Key + "=" + parameter.Value + "&")); - parametersPart = parametersPart.TrimEnd('&'); - } - - var newUrl = string.Format(urlTemplate, provider, authentication, host, portPart, database, parametersPart); - return new ConnectionInfo(newUrl); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.04.16 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Upgrade; +using ModelNamespace = Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel +{ + namespace MainTestModel + { + [HierarchyRoot] + public class SuperUniqueTestClass1 : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Text { get; set; } + + [Field] + public double Value { get; set; } + } + + [HierarchyRoot] + public class SuperUniqueTestClass2 : Entity + { + [Field, Key] + public int Id { get; set; } + } + } + + namespace HintTest + { + + #region BaseVersion + + namespace BaseVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public string Text { get; set; } + } + } + + #endregion + + #region ChangeFieldTypeVersion + + namespace ChangeFieldTypeVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Number { get; set; } + + [Field] + public string Text { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new ChangeFieldTypeHint(typeof (Order), "Number")); + } + } + } + + #endregion + + #region CopyFieldVersion + + namespace CopyFieldVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public string Text { get; set; } + + [Field] + public string Description { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new CopyFieldHint(typeof (BaseVersion.Order), "Text", typeof (Order), "Description")); + } + } + } + + #endregion + + #region MoveFieldVersion + + namespace MoveFieldVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new MoveFieldHint(typeof (BaseVersion.Order), "Text", typeof (Customer), "Description")); + } + } + } + + #endregion + + #region RecycledTypeVersion + + namespace RecycledTypeVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public string Text { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RecycledTypeHint(typeof (Order))); + } + } + } + + #endregion + + #region RemoveFieldVersion + + namespace RemoveFieldVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RemoveFieldHint(typeof (BaseVersion.Order), "Number")); + } + } + } + + #endregion + + #region RemoveTypeVersion + + namespace RemoveTypeVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RemoveTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel.HintTest.BaseVersion.Order")); + } + } + } + + #endregion + + #region RenameFieldVersion + + namespace RenameFieldVersion + { + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string LastName { get; set; } + + [Field] + public string FirstName { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public string Text { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RenameFieldHint(typeof (Customer), "Name", "LastName")); + } + } + } + + #endregion + + #region RenameTypeVersion + + namespace RenameTypeVersion + { + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public long Number { get; set; } + + [Field] + public string Text { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RenameTypeHint("Xtensive.Orm.Tests.Issues.IssueJira0647_StoredDomainModelMappingsUpdateBugModel.HintTest.BaseVersion.Customer", typeof (Person))); + } + } + } + + #endregion + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public sealed class IssueJira0647_StoredDomainModelMappingsUpdateBug + { + private class ClientNodeConfiguration + { + public string Name { get; set; } + public ConnectionInfo ConnectionInfo { get; set; } + public string InitializationSql { get; set; } + public string DefaultSchema { get; set; } + } + + private ClientNodeConfiguration alpha; + private ClientNodeConfiguration beta; + private ClientNodeConfiguration main; + + [OneTimeSetUp] + public void TestFixtureSetUp() + { + Require.ProviderIs(StorageProvider.SqlServer); + BuildNodeConfigurationsMetadata(); + } + + [Test] + public void MainTest() + { + var configuration = BuildConfiguration(alpha, DomainUpgradeMode.Recreate, typeof (ModelNamespace.MainTestModel.SuperUniqueTestClass1)); + + using (var domain = Domain.Build(configuration)) { + Assert.That(domain.Configuration.IsMultischema, Is.EqualTo(true)); + Assert.That(domain.Configuration.IsMultidatabase, Is.EqualTo(false)); + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); + + CheckNode(domain, alpha.Name, false); + CheckNode(domain, beta.Name, true); + } + } + + [Test] + public void ChangeFieldTypeHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.ChangeFieldTypeVersion.Customer)); + } + + [Test] + public void CopyFieldHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.CopyFieldVersion.Customer)); + } + + [Test] + public void MoveFieldHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.MoveFieldVersion.Customer)); + } + + [Test] + public void RemoveFieldHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RemoveFieldVersion.Customer)); + } + + [Test] + public void RemoveTypeHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RemoveTypeVersion.Customer)); + } + + [Test] + public void RenameFieldHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RenameFieldVersion.Customer)); + } + + [Test] + public void RenameTypeHintTest() + { + BuildBaseVersion(); + BuildUpgradedVersion(typeof (ModelNamespace.HintTest.RenameTypeVersion.Person)); + } + + private void BuildBaseVersion() + { + var configuration = BuildConfiguration(main, DomainUpgradeMode.Recreate, typeof (ModelNamespace.HintTest.BaseVersion.Customer)); + using (var domain = Domain.Build(configuration)) { + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); + + using (var session = domain.OpenSession()) { + session.SelectStorageNode(alpha.Name); + using (var tx = session.OpenTransaction()) { + new ModelNamespace.HintTest.BaseVersion.Customer { Name = "CustomerName" }; + new ModelNamespace.HintTest.BaseVersion.Customer { Name = "Groznov" }; + new ModelNamespace.HintTest.BaseVersion.Order { Number = 99, Text = "Test order number 99" }; + new ModelNamespace.HintTest.BaseVersion.Order { Number = 1, Text = "Test order number 1" }; + tx.Complete(); + } + } + } + } + + private void BuildUpgradedVersion(Type type) + { + var configuration = BuildConfiguration(main, DomainUpgradeMode.PerformSafely, type); + using (var domain = Domain.Build(configuration)) { + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.PerformSafely)); + domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.PerformSafely)); + } + } + + private void CheckNode(Domain domain, string nodeName, bool spoiledExpected) + { + var node = domain.StorageNodeManager.GetNode(nodeName); + Assert.IsNotNull(node); + + var expectedSchema = node.Configuration.SchemaMapping.Apply(domain.Configuration.DefaultSchema); + + var spoiledModel = domain.Model.ToStoredModel(node.TypeIdRegistry); + spoiledModel.UpdateReferences(); + + var currentModel = domain.Model.ToStoredModel(node.TypeIdRegistry); + currentModel.UpdateReferences(); + currentModel.UpdateMappings(node.Configuration); //this operation suppose to be performed by DataObjects internally + + foreach (var typeInfo in currentModel.Types.Where(t => !t.IsSystem)) + Assert.AreEqual(typeInfo.MappingSchema, expectedSchema); + + var func = spoiledExpected ? new Action(Assert.AreNotEqual) : new Action(Assert.AreEqual); + foreach (var typeInfo in spoiledModel.Types.Where(t => !t.IsSystem)) + func(typeInfo.MappingSchema, expectedSchema); + } + + private NodeConfiguration BuildNodeConfiguration(DomainConfiguration domainConfiguration, ClientNodeConfiguration nodeConfiguration, DomainUpgradeMode upgradeMode) + { + var node = new NodeConfiguration(nodeConfiguration.Name); + node.ConnectionInfo = nodeConfiguration.ConnectionInfo; + node.ConnectionInitializationSql = nodeConfiguration.InitializationSql; + node.UpgradeMode = upgradeMode; + if (!domainConfiguration.DefaultSchema.IsNullOrEmpty() && !nodeConfiguration.DefaultSchema.IsNullOrEmpty()) + node.SchemaMapping.Add(domainConfiguration.DefaultSchema, nodeConfiguration.DefaultSchema); + return node; + } + + private DomainConfiguration BuildConfiguration(ClientNodeConfiguration nodeConfig, DomainUpgradeMode upgradeMode, Type modelType) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.ConnectionInfo = nodeConfig.ConnectionInfo; + configuration.ConnectionInitializationSql = nodeConfig.InitializationSql; + configuration.UpgradeMode = upgradeMode; + configuration.DefaultSchema = nodeConfig.DefaultSchema; + configuration.Types.Register(modelType.Assembly, modelType.Namespace); + return configuration; + } + + private void BuildNodeConfigurationsMetadata() + { + var defaultConnection = DomainConfigurationFactory.Create().ConnectionInfo; + main = new ClientNodeConfiguration { + Name = "main", + ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), + InitializationSql = "USE [DO-Tests-1]", + DefaultSchema = "dbo" + }; + alpha = new ClientNodeConfiguration { + Name = "alpha", + ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), + InitializationSql = "USE [DO-Tests-1]", + DefaultSchema = "Model1" + }; + + beta = new ClientNodeConfiguration { + Name = "beta", + ConnectionInfo = ComposeConnectionToMasterDatabase(defaultConnection), + InitializationSql = "USE [DO-Tests-2]", + DefaultSchema = "Model2" + }; + } + + private ConnectionInfo ComposeConnectionToMasterDatabase(ConnectionInfo baseConnectionInfo) + { + if (baseConnectionInfo.ConnectionUrl==null) + throw new InvalidOperationException("Can't convert connection string based ConnectionInfo"); + + var provider = baseConnectionInfo.ConnectionUrl.Protocol; + var user = baseConnectionInfo.ConnectionUrl.User; + var password = baseConnectionInfo.ConnectionUrl.Password; + var host = baseConnectionInfo.ConnectionUrl.Host; + var port = baseConnectionInfo.ConnectionUrl.Port; + var database = "master"; + var parameters = baseConnectionInfo.ConnectionUrl.Params; + + string urlTemplate = "{0}://{1}{2}{3}/{4}{5}"; + var authenticationPartTemplate = "{0}:{1}@"; + + var authentication = user.IsNullOrEmpty() + ? string.Empty + : string.Format(authenticationPartTemplate, user, password); + + var portPart = port==0 + ? string.Empty + : ":" + port; + + var parametersPart = string.Empty; + if (parameters.Count > 0) { + parametersPart += "?"; + parametersPart = parameters.Aggregate(parametersPart, (current, parameter) => current + (parameter.Key + "=" + parameter.Value + "&")); + parametersPart = parametersPart.TrimEnd('&'); + } + + var newUrl = string.Format(urlTemplate, provider, authentication, host, portPart, database, parametersPart); + return new ConnectionInfo(newUrl); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0656_RemapRestoresRemovedReferences.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0656_RemapRestoresRemovedReferences.cs index 0f9ade6ee0..7fec70795f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0656_RemapRestoresRemovedReferences.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0656_RemapRestoresRemovedReferences.cs @@ -1,247 +1,247 @@ -using System; -using System.Linq; -using System.Runtime; -using System.Runtime.InteropServices; -using JetBrains.Annotations; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0656_RemapRestoresRemovedReferencesModel; -using Xtensive.Orm.Tests.Linq; -using Xtensive.Orm.Tests.Storage.Validation; -using Xtensive.Tuples; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0656_RemapRestoresRemovedReferencesModel -{ - [Serializable] - [HierarchyRoot] - public class TestA : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public TestB TestB { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TestB : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TestBase : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [Serializable] - public class TestC : TestBase - { - [Field, Association(PairTo = "TestC", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet TestDs { get; private set; } - } - - - [Serializable] - [HierarchyRoot] - public class TestD : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public TestC TestC { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0656_RemapRestoresRemovedReferences : AutoBuildTest - { - private readonly SessionConfiguration clientProfile = new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation); - - [Test] - public void UnableToSaveLocalChanges() - { - using (var session = Domain.OpenSession(clientProfile)) { - var testB = new TestB { Text = "B" }; - var testA = new TestA { Text = "A", TestB = testB }; - testB.Remove(); - var aTuple = testA.Tuple; - var aKey = testA.Key; - - Assert.DoesNotThrow(() => session.SaveChanges()); - testA = session.Query.Single(aKey); - Assert.That(testA.TestB, Is.Null); - } - } - - [Test] - public void WrongAssociationAfterSaveChanges() - { - Key keyA; - using (var session = Domain.OpenSession(clientProfile)) { - var testB = new TestB { Text = "B" }; - var testA = new TestA { Text = "A", TestB = testB }; - - Assert.DoesNotThrow(() => session.SaveChanges()); - - keyA = testA.Key; - var newTestB = new TestB { Text = "B2" }; - testA.TestB = newTestB; - testB.Remove(); - newTestB.Remove(); - Assert.DoesNotThrow(() => session.SaveChanges()); - Assert.That(testA.TestB, Is.Null); - } - using (var session = Domain.OpenSession(clientProfile)) { - var testA = session.Query.Single(keyA); - Assert.That(testA.TestB, Is.Null); - } - } - - [Test] - public void RemapReferencesToRemapedEntity() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()) { - var testA = new TestA { Text = "A" }; - var TestB = new TestB { Text = "B" }; - - //Everything is OK. There should be two assignment. - testA.TestB = TestB; - testA.TestB = TestB; - - Assert.DoesNotThrow(() => session.SaveChanges()); - Assert.That(testA.TestB, Is.Not.Null); - } - } - - [Test] - public void SetReferenceToNewObject() - { - int nullReferenceId; - using (var populateSession = Domain.OpenSession()) - using (var transaction = populateSession.OpenTransaction()) { - var testA = new TestA {Text = "Test A without Reference"}; - nullReferenceId = testA.Id; - transaction.Complete(); - } - - int anotherTestBTemporaryId; - int anotherTestBRealId; - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()) { - var nullReferenceEntity = session.Query.All().FirstOrDefault(el => el.Id==nullReferenceId); - Assert.That(nullReferenceEntity, Is.Not.Null); - Assert.That(nullReferenceEntity.TestB, Is.Null); - - var newTestB = new TestB{Text = "Another test B"}; - Assert.That(newTestB.Id, Is.LessThan(0)); - Assert.That(newTestB.Key.IsTemporary(Domain), Is.True); - - anotherTestBTemporaryId = newTestB.Id; - nullReferenceEntity.TestB = newTestB; - - Assert.DoesNotThrow(() => session.SaveChanges()); - Assert.That(nullReferenceEntity.TestB, Is.Not.Null); - Assert.That(nullReferenceEntity.TestB.Key.IsTemporary(Domain), Is.False); - anotherTestBRealId = nullReferenceEntity.TestB.Id; - } - - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()) { - var testA = session.Query.All().FirstOrDefault(el => el.Id==nullReferenceId); - Assert.That(testA, Is.Not.Null); - - var testBTemporary = session.Query.All().FirstOrDefault(el => el.Id==anotherTestBTemporaryId); - Assert.That(testBTemporary, Is.Null); - - var testBReal = session.Query.All().FirstOrDefault(el => el.Id==anotherTestBRealId); - Assert.That(testBReal, Is.Not.Null); - - Assert.That(testA.TestB, Is.EqualTo(testBReal)); - } - } - - [Test] - public void SetSyncObjectAsReferenceFormNewObject() - { - int nullReferenceId, referencingId, referencedId; - using (var populateSession = Domain.OpenSession()) - using (var transaction = populateSession.OpenTransaction()){ - var testB = new TestB { Text = "Test B" }; - referencedId = testB.Id; - transaction.Complete(); - } - - int temporaryId, realId; - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()){ - var testB = session.Query.All().FirstOrDefault(el => el.Id==referencedId); - Assert.That(testB, Is.Not.Null); - - var testA = new TestA(); - temporaryId = testA.Id; - testA.TestB = testB; - Assert.That(testA.Key.IsTemporary(Domain), Is.True); - Assert.DoesNotThrow(() => session.SaveChanges()); - - Assert.That(testA.Key.IsTemporary(Domain), Is.False); - realId = testA.Id; - } - - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()) { - var testB = session.Query.All().FirstOrDefault(el => el.Id==referencedId); - Assert.That(testB, Is.Not.Null); - - var testATemporary = session.Query.All().FirstOrDefault(el => el.Id==temporaryId); - Assert.That(testATemporary, Is.Null); - - var testAReal = session.Query.All().FirstOrDefault(el => el.Id==realId); - Assert.That(testAReal, Is.Not.Null); - Assert.That(testAReal.TestB, Is.Not.Null); - Assert.That(testAReal.TestB.Id, Is.EqualTo(testB.Id)); - } - } - - [Test] - public void BaseTypeAccuracyReferencedKeyTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) - using (session.Activate()) { - var testC = new TestC { Text = "C" }; - session.SaveChanges(); - var testB = new TestD { Text = "B", TestC = testC }; - Assert.DoesNotThrow(() => session.SaveChanges()); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var confinguration = base.BuildConfiguration(); - confinguration.UpgradeMode = DomainUpgradeMode.Recreate; - confinguration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); - return confinguration; - } - } -} +using System; +using System.Linq; +using System.Runtime; +using System.Runtime.InteropServices; +using JetBrains.Annotations; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0656_RemapRestoresRemovedReferencesModel; +using Xtensive.Orm.Tests.Linq; +using Xtensive.Orm.Tests.Storage.Validation; +using Xtensive.Tuples; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0656_RemapRestoresRemovedReferencesModel +{ + [Serializable] + [HierarchyRoot] + public class TestA : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public TestB TestB { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TestB : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TestBase : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [Serializable] + public class TestC : TestBase + { + [Field, Association(PairTo = "TestC", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet TestDs { get; private set; } + } + + + [Serializable] + [HierarchyRoot] + public class TestD : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public TestC TestC { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0656_RemapRestoresRemovedReferences : AutoBuildTest + { + private readonly SessionConfiguration clientProfile = new SessionConfiguration(SessionOptions.ClientProfile | SessionOptions.AutoActivation); + + [Test] + public void UnableToSaveLocalChanges() + { + using (var session = Domain.OpenSession(clientProfile)) { + var testB = new TestB { Text = "B" }; + var testA = new TestA { Text = "A", TestB = testB }; + testB.Remove(); + var aTuple = testA.Tuple; + var aKey = testA.Key; + + Assert.DoesNotThrow(() => session.SaveChanges()); + testA = session.Query.Single(aKey); + Assert.That(testA.TestB, Is.Null); + } + } + + [Test] + public void WrongAssociationAfterSaveChanges() + { + Key keyA; + using (var session = Domain.OpenSession(clientProfile)) { + var testB = new TestB { Text = "B" }; + var testA = new TestA { Text = "A", TestB = testB }; + + Assert.DoesNotThrow(() => session.SaveChanges()); + + keyA = testA.Key; + var newTestB = new TestB { Text = "B2" }; + testA.TestB = newTestB; + testB.Remove(); + newTestB.Remove(); + Assert.DoesNotThrow(() => session.SaveChanges()); + Assert.That(testA.TestB, Is.Null); + } + using (var session = Domain.OpenSession(clientProfile)) { + var testA = session.Query.Single(keyA); + Assert.That(testA.TestB, Is.Null); + } + } + + [Test] + public void RemapReferencesToRemapedEntity() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()) { + var testA = new TestA { Text = "A" }; + var TestB = new TestB { Text = "B" }; + + //Everything is OK. There should be two assignment. + testA.TestB = TestB; + testA.TestB = TestB; + + Assert.DoesNotThrow(() => session.SaveChanges()); + Assert.That(testA.TestB, Is.Not.Null); + } + } + + [Test] + public void SetReferenceToNewObject() + { + int nullReferenceId; + using (var populateSession = Domain.OpenSession()) + using (var transaction = populateSession.OpenTransaction()) { + var testA = new TestA {Text = "Test A without Reference"}; + nullReferenceId = testA.Id; + transaction.Complete(); + } + + int anotherTestBTemporaryId; + int anotherTestBRealId; + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()) { + var nullReferenceEntity = session.Query.All().FirstOrDefault(el => el.Id==nullReferenceId); + Assert.That(nullReferenceEntity, Is.Not.Null); + Assert.That(nullReferenceEntity.TestB, Is.Null); + + var newTestB = new TestB{Text = "Another test B"}; + Assert.That(newTestB.Id, Is.LessThan(0)); + Assert.That(newTestB.Key.IsTemporary(Domain), Is.True); + + anotherTestBTemporaryId = newTestB.Id; + nullReferenceEntity.TestB = newTestB; + + Assert.DoesNotThrow(() => session.SaveChanges()); + Assert.That(nullReferenceEntity.TestB, Is.Not.Null); + Assert.That(nullReferenceEntity.TestB.Key.IsTemporary(Domain), Is.False); + anotherTestBRealId = nullReferenceEntity.TestB.Id; + } + + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()) { + var testA = session.Query.All().FirstOrDefault(el => el.Id==nullReferenceId); + Assert.That(testA, Is.Not.Null); + + var testBTemporary = session.Query.All().FirstOrDefault(el => el.Id==anotherTestBTemporaryId); + Assert.That(testBTemporary, Is.Null); + + var testBReal = session.Query.All().FirstOrDefault(el => el.Id==anotherTestBRealId); + Assert.That(testBReal, Is.Not.Null); + + Assert.That(testA.TestB, Is.EqualTo(testBReal)); + } + } + + [Test] + public void SetSyncObjectAsReferenceFormNewObject() + { + int nullReferenceId, referencingId, referencedId; + using (var populateSession = Domain.OpenSession()) + using (var transaction = populateSession.OpenTransaction()){ + var testB = new TestB { Text = "Test B" }; + referencedId = testB.Id; + transaction.Complete(); + } + + int temporaryId, realId; + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()){ + var testB = session.Query.All().FirstOrDefault(el => el.Id==referencedId); + Assert.That(testB, Is.Not.Null); + + var testA = new TestA(); + temporaryId = testA.Id; + testA.TestB = testB; + Assert.That(testA.Key.IsTemporary(Domain), Is.True); + Assert.DoesNotThrow(() => session.SaveChanges()); + + Assert.That(testA.Key.IsTemporary(Domain), Is.False); + realId = testA.Id; + } + + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()) { + var testB = session.Query.All().FirstOrDefault(el => el.Id==referencedId); + Assert.That(testB, Is.Not.Null); + + var testATemporary = session.Query.All().FirstOrDefault(el => el.Id==temporaryId); + Assert.That(testATemporary, Is.Null); + + var testAReal = session.Query.All().FirstOrDefault(el => el.Id==realId); + Assert.That(testAReal, Is.Not.Null); + Assert.That(testAReal.TestB, Is.Not.Null); + Assert.That(testAReal.TestB.Id, Is.EqualTo(testB.Id)); + } + } + + [Test] + public void BaseTypeAccuracyReferencedKeyTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) + using (session.Activate()) { + var testC = new TestC { Text = "C" }; + session.SaveChanges(); + var testB = new TestD { Text = "B", TestC = testC }; + Assert.DoesNotThrow(() => session.SaveChanges()); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var confinguration = base.BuildConfiguration(); + confinguration.UpgradeMode = DomainUpgradeMode.Recreate; + confinguration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); + return confinguration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0659_EnumExpressionsAndConstantsTranslationBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0659_EnumExpressionsAndConstantsTranslationBug.cs index 81750653de..3c7a2711ed 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0659_EnumExpressionsAndConstantsTranslationBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0659_EnumExpressionsAndConstantsTranslationBug.cs @@ -1,1050 +1,1050 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.08.08 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0659_GroupByConditionalExpressionWithEnumsModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0659_GroupByConditionalExpressionWithEnumsModel -{ - [HierarchyRoot] - public class EntityWithGender : Entity - { - [Field] - [Key] - public Guid Id { get; set; } - - [Field] - public Gender? NullableGender { get; set; } - - [Field] - public Gender Gender { get; set; } - } - - [HierarchyRoot] - public class EntityWithExtendedGender : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public ExtendedGender? NullableGender { get; set; } - - [Field] - public ExtendedGender Gender { get; set; } - } - - [HierarchyRoot] - public class EntityWithIntFlags : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public SomeIntFlags Flags { get; set; } - - [Field] - public SomeIntFlags? NullableFlags { get; set; } - } - - [HierarchyRoot] - public class EntityWithLongFlags : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public SomeLongFlags Flags { get; set; } - - [Field] - public SomeLongFlags? NullableFlags { get; set; } - } - - [HierarchyRoot] - public class EntityWithDateTime : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public DateTime? NullableDateTime { get; set; } - - [Field] - public DateTime DateTime { get; set; } - } - - [HierarchyRoot] - public class EntityWithInt : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public int Int { get; set; } - - [Field] - public int? NullableInt { get; set; } - } - - [HierarchyRoot] - public class EntityWithDecimal : Entity - { - [Field, Key] - public Guid Id { get; set; } - - [Field] - public decimal Sum { get; set; } - } - - public enum Gender - { - None = 0, - Male = 1, - Female = 2 - } - - public enum ExtendedGender : long - { - None = 0, - Male = 1, - Female = 2, - Transgender = 4 - } - - [Flags] - public enum SomeIntFlags : int - { - None = 0, - Flag1 = 1 << 0, - Flag2 = 1 << 1, - Flag3 = 1 << 2, - Flag4 = 1 << 3, - Flag5 = 1 << 4, - Flag6 = 1 << 5, - Flag7 = 1 << 6, - Flag8 = 1 << 7, - Flag9 = 1 << 8, - Flag10 = 1 << 9, - Flag11 = 1 << 10, - Flag12 = 1 << 11, - Flag13 = 1 << 12, - Flag14 = 1 << 13, - Flag15 = 1 << 14, - Flag16 = 1 << 15, - Flag17 = 1 << 16, - Flag18 = 1 << 17, - Flag19 = 1 << 18, - Flag20 = 1 << 19, - } - - [Flags] - public enum SomeLongFlags : long - { - None = 0, - Flag1 = 1L << 0, - Flag2 = 1L << 1, - Flag3 = 1L << 2, - Flag4 = 1L << 3, - Flag5 = 1L << 4, - Flag6 = 1L << 5, - Flag7 = 1L << 6, - Flag8 = 1L << 7, - Flag9 = 1L << 8, - Flag10 = 1L << 9, - Flag11 = 1L << 10, - Flag12 = 1L << 11, - Flag13 = 1L << 12, - Flag14 = 1L << 13, - Flag15 = 1L << 14, - Flag16 = 1L << 15, - Flag17 = 1L << 16, - Flag18 = 1L << 17, - Flag19 = 1L << 18, - Flag20 = 1L << 19, - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0659_EnumExpressionsAndConstantsTranslationBug : AutoBuildTest - { - private readonly DateTime nullableFieldDateTime = new DateTime(2015, 6, 6); - private readonly DateTime firstDateTime = new DateTime(2013, 10, 10); - private readonly DateTime secondDateTime = new DateTime(2014, 12, 10); - private readonly DateTime defaultDateTime = new DateTime(2012, 12, 12); - - [Test] - public void DirectGroupByByNotNullEnum() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.Gender) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g=> g.Key==Gender.Male)); - Assert.That(result.Any(g=>g.Key==Gender.Female)); - - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForIntEnumTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .GroupBy(x => x.NullableGender.HasValue ? x.NullableGender.Value : Gender.None) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==Gender.None)); - Assert.That(genderGroups.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForLongEnumTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .GroupBy(x => x.NullableGender.HasValue ? x.NullableGender.Value : ExtendedGender.None) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.None)); - Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForIntFlagTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .GroupBy(x => x.NullableFlags.HasValue ? x.NullableFlags.Value : SomeIntFlags.None) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForLongFlagTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .GroupBy(x => x.NullableFlags.HasValue ? x.NullableFlags.Value : SomeLongFlags.None) - .Select(g => new { g.Key, Items = g }) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForDateTimeTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .GroupBy(x => x.NullableDateTime.HasValue ? x.NullableDateTime.Value : new DateTime(2012, 12, 12)) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==new DateTime(2012, 12, 12))); - Assert.That(genderGroups.Any(g => g.Key==nullableFieldDateTime)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByConditionalOperatorForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableInt.HasValue ? x.NullableInt : -1) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForIntEnumTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .Select(el => new { - Id = el.Id, - Gender = el.NullableGender.HasValue ? el.NullableGender.Value : Gender.None - }) - .GroupBy(x => x.Gender) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==Gender.None)); - Assert.That(genderGroups.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForLongEnumTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .Select(el => new { - Id = el.Id, - Gender = el.NullableGender.HasValue ? el.NullableGender.Value : ExtendedGender.None - }) - .GroupBy(x => x.Gender) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.None)); - Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForIntFlagTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .Select(el => new { - Id = el.Id, - Flags = el.NullableFlags.HasValue ? el.NullableFlags.Value : SomeIntFlags.None - }) - .GroupBy(x => x.Flags) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForLongFlagTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .Select(el => new { - Id = el.Id, - Flags = el.NullableFlags.HasValue ? el.NullableFlags.Value : SomeLongFlags.None - }) - .GroupBy(x => x.Flags) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForDateTimeTest() - { - Action testAction = (session) => { - var genderGroups = session.Query.All() - .Select(el => new { - Id = el.Id, - DateTime = el.NullableDateTime.HasValue ? el.NullableDateTime.Value : new DateTime(2012, 12, 12) - }) - .GroupBy(x => x.DateTime) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(genderGroups.Length, Is.EqualTo(2)); - Assert.That(genderGroups.Any(g => g.Key==new DateTime(2012, 12, 12))); - Assert.That(genderGroups.Any(g => g.Key==nullableFieldDateTime)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByConditionalOperatorForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableInt = el.NullableInt.HasValue ? el.NullableInt : -1 - }) - .GroupBy(x => x.NullableInt) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForIntEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableGender ?? Gender.None) - .Select(g => new { Key = g.Key, Items = g }) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==Gender.None)); - Assert.That(result.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForLongEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableGender ?? ExtendedGender.None) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==ExtendedGender.None)); - Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForIntFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableFlags ?? SomeIntFlags.None) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForLongFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableFlags ?? SomeLongFlags.None) - .Select(g => new { Key = g.Key, Items = g }) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForDateTimeTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableDateTime ?? new DateTime(2012, 12, 12)) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); - Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByCoalescingOperatorForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableInt ?? -1) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForIntEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableGender = el.NullableGender ?? Gender.None - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==Gender.None)); - Assert.That(result.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForLongEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableGender = el.NullableGender ?? ExtendedGender.None - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==ExtendedGender.None)); - Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForIntFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableGender = el.NullableFlags ?? SomeIntFlags.None - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForLongFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableGender = el.NullableFlags ?? SomeLongFlags.None - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForDateTimeTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableGender = el.NullableDateTime ?? new DateTime(2012, 12, 12) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); - Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByCoalescingOperatorForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableInt = el.NullableInt ?? -1 - }) - .GroupBy(x => x.NullableInt) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByGetValueOrDefaultForIntEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableGender.GetValueOrDefault(Gender.None)) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==Gender.None)); - Assert.That(result.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByGetValueOrDefaultForLongEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableGender.GetValueOrDefault(ExtendedGender.None)) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==ExtendedGender.None)); - Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByGetValueOrDefaultForIntFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableFlags.GetValueOrDefault(SomeIntFlags.None)) - .Select(g => new { Key = g.Key, Items = g }) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByGetValueOrDefaultForLongFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableFlags.GetValueOrDefault(SomeLongFlags.None)) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByGetValueOrDefaultForDateTimeTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableDateTime.GetValueOrDefault(new DateTime(2012, 12, 12))) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); - Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); - }; - RunTestInSession(testAction); - } - - [Test] - public void DirectGroupByByGetValueOrDefaultForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .GroupBy(x => x.NullableInt.GetValueOrDefault(-1)) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForIntEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - el.Id, - NullableGender = el.NullableGender.GetValueOrDefault(Gender.None) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==Gender.None)); - Assert.That(result.Any(g => g.Key==Gender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForLongEnumTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - el.Id, - NullableGender = el.NullableGender.GetValueOrDefault(ExtendedGender.None) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==ExtendedGender.None)); - Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - el.Id, - NullableGender = el.NullableFlags.GetValueOrDefault(SomeIntFlags.None) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); - Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForLongFlagTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - el.Id, - NullableGender = el.NullableFlags.GetValueOrDefault(SomeLongFlags.None) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); - Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForDateTimeTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - el.Id, - NullableGender = el.NullableDateTime.GetValueOrDefault(new DateTime(2012, 12, 12)) - }) - .GroupBy(x => x.NullableGender) - .Select(g => new {Key = g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); - Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); - }; - RunTestInSession(testAction); - } - - [Test] - public void IndirectGroupByByGetValueOrDefaultForIntTest() - { - Action testAction = (session) => { - var result = session.Query.All() - .Select(el => new { - Id = el.Id, - NullableInt = el.NullableInt.GetValueOrDefault(-1) - }) - .GroupBy(x => x.NullableInt) - .Select(g => new {g.Key, Items = g}) - .ToArray(); - Assert.That(result.Length, Is.EqualTo(2)); - Assert.That(result.Any(g => g.Key==-1)); - Assert.That(result.Any(g => g.Key==10)); - }; - RunTestInSession(testAction); - } - - [Test] - public void OrderByHasFlagExpressionTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .OrderBy(el => el.Flags.HasFlag(SomeIntFlags.Flag10)).ToArray(); - var result2 = session.Query.All() - .OrderBy(el => el.Flags.HasFlag(SomeLongFlags.Flag10)).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void OrderByBitAndExpressionTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .OrderBy(el => (el.Flags & SomeIntFlags.Flag1)==SomeIntFlags.Flag1).ToArray(); - var result2 = session.Query.All() - .OrderBy(el => (el.Flags & SomeLongFlags.Flag1)==SomeLongFlags.Flag1).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void OrderByCoalescingOperatorTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .OrderBy(el => el.NullableFlags ?? SomeIntFlags.Flag1).ToArray(); - var result2 = session.Query.All() - .OrderBy(el => el.NullableFlags ?? SomeLongFlags.Flag1).ToArray(); - var result3 = session.Query.All() - .OrderBy(el => el.NullableGender ?? Gender.None).ToArray(); - var result4 = session.Query.All() - .OrderBy(el => el.NullableGender ?? ExtendedGender.None).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void OrderByInequalityExpressionTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .OrderBy(el => el.Gender!=Gender.Male).ToArray(); - var result2 = session.Query.All() - .OrderBy(el => Gender.Male!=el.Gender).ToArray(); - - var result3 = session.Query.All() - .OrderBy(el => el.Gender!=ExtendedGender.Male).ToArray(); - var result4 = session.Query.All() - .OrderBy(el => ExtendedGender.Male!=el.Gender).ToArray(); - - var result5 = session.Query.All() - .OrderBy(el => el.Flags!=SomeIntFlags.Flag1).ToArray(); - var result6 = session.Query.All() - .OrderBy(el => SomeIntFlags.Flag1!=el.Flags).ToArray(); - - var result7 = session.Query.All() - .OrderBy(el => el.Flags!=SomeLongFlags.Flag1).ToArray(); - var result8 = session.Query.All() - .OrderBy(el => SomeLongFlags.Flag1!=el.Flags).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void OrderByEqualityExpression() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .OrderBy(el => el.Gender==Gender.Male).ToArray(); - var result2 = session.Query.All() - .OrderBy(el => Gender.Male==el.Gender).ToArray(); - - var result3 = session.Query.All() - .OrderBy(el => el.Gender==ExtendedGender.Male).ToArray(); - var result4 = session.Query.All() - .OrderBy(el => ExtendedGender.Male==el.Gender).ToArray(); - - var result5 = session.Query.All() - .OrderBy(el => el.Flags==SomeIntFlags.Flag1).ToArray(); - var result6 = session.Query.All() - .OrderBy(el => SomeIntFlags.Flag1==el.Flags).ToArray(); - - var result7 = session.Query.All() - .OrderBy(el => el.Flags==SomeLongFlags.Flag1).ToArray(); - var result8 = session.Query.All() - .OrderBy(el => SomeLongFlags.Flag1==el.Flags).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void WhereByHasValueTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .Where(el => el.Flags.HasFlag(SomeIntFlags.Flag1)).ToArray(); - var result2 = session.Query.All() - .Where(el => el.Flags.HasFlag(SomeLongFlags.Flag1)).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void WhereByBitAndExpressionTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .Where(el => (el.Flags & SomeIntFlags.Flag1)==SomeIntFlags.Flag1).ToArray(); - - var result2 = session.Query.All() - .Where(el => (el.Flags & SomeLongFlags.Flag1)==SomeLongFlags.Flag1).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void WhereByEqualityTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .Where(el => el.Gender==Gender.Male).ToArray(); - var result2 = session.Query.All() - .Where(el => Gender.Male==el.Gender).ToArray(); - - var result3 = session.Query.All() - .Where(el => el.Gender==ExtendedGender.Male).ToArray(); - var result4 = session.Query.All() - .Where(el => ExtendedGender.Male==el.Gender).ToArray(); - - var result5 = session.Query.All() - .Where(el => el.Flags==SomeIntFlags.Flag1).ToArray(); - var result6 = session.Query.All() - .Where(el => SomeIntFlags.Flag1==el.Flags).ToArray(); - - var result7 = session.Query.All() - .Where(el => el.Flags==SomeLongFlags.Flag1).ToArray(); - var result8 = session.Query.All() - .Where(el => SomeLongFlags.Flag1==el.Flags).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void WhereByInequalityTest() - { - Action testAction = (session) => { - var result1 = session.Query.All() - .Where(el => el.Gender!=Gender.Female).ToArray(); - var result2 = session.Query.All() - .Where(el => Gender.Female!=el.Gender).ToArray(); - - var result3 = session.Query.All() - .Where(el => el.Gender!=ExtendedGender.Female).ToArray(); - var result4 = session.Query.All() - .Where(el => ExtendedGender.Female!=el.Gender).ToArray(); - - var result5 = session.Query.All() - .Where(el => el.Flags!=SomeIntFlags.Flag1).ToArray(); - var result6 = session.Query.All() - .Where(el => SomeIntFlags.Flag1!=el.Flags).ToArray(); - - var result7 = session.Query.All() - .Where(el => el.Flags!=SomeLongFlags.Flag1).ToArray(); - var result8 = session.Query.All() - .Where(el => SomeLongFlags.Flag1!=el.Flags).ToArray(); - }; - RunTestInSession(testAction); - } - - [Test] - public void MathRoundTest() - { - Action testAction = (session) => { - Assert.DoesNotThrow(() => session.Query.All().Select(e => (Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100)).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Where(e => (Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100) > 1).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().OrderBy(e => Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Sum(e => Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100)); - Assert.DoesNotThrow(() => session.Query.All().Select(e => (Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100)).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Where(e => (Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100) > 1).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().OrderBy(e => Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100).ToArray()); - Assert.DoesNotThrow(() => session.Query.All().Sum(e => Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100)); - }; - RunTestInSession(testAction); - } - - [Test] - public void ConcatinationTest() - { - Action testAction = session => { - Assert.DoesNotThrow( - () => session.Query.All().Select(q=> new {q.Id, Gender = Gender.Female}) - .Concat(session.Query.All().Select(q=> new {q.Id, Gender = Gender.Male})) - .FirstOrDefault()); - }; - RunTestInSession(testAction); - } - - private void RunTestInSession(Action testBody) - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - testBody.Invoke(session); - } - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new EntityWithGender {Gender = Gender.Male}; - new EntityWithGender {Gender = Gender.Female, NullableGender = Gender.Female}; - - new EntityWithExtendedGender {Gender = ExtendedGender.Male}; - new EntityWithExtendedGender {Gender = ExtendedGender.Female, NullableGender = ExtendedGender.Female}; - - new EntityWithIntFlags {Flags = SomeIntFlags.Flag1 | SomeIntFlags.Flag20}; - new EntityWithIntFlags {Flags = SomeIntFlags.Flag1 | SomeIntFlags.Flag10, NullableFlags = SomeIntFlags.Flag10}; - - new EntityWithLongFlags {Flags = SomeLongFlags.Flag1 | SomeLongFlags.Flag20}; - new EntityWithLongFlags {Flags = SomeLongFlags.Flag1 | SomeLongFlags.Flag20, NullableFlags = SomeLongFlags.Flag10}; - - new EntityWithDateTime {DateTime = firstDateTime}; - new EntityWithDateTime {DateTime = secondDateTime, NullableDateTime = nullableFieldDateTime}; - - new EntityWithInt {Int = 20}; - new EntityWithInt {Int = 20, NullableInt = 10}; - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (EntityWithGender).Assembly, typeof (EntityWithGender).Namespace); - return configuration; - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.08.08 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0659_GroupByConditionalExpressionWithEnumsModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0659_GroupByConditionalExpressionWithEnumsModel +{ + [HierarchyRoot] + public class EntityWithGender : Entity + { + [Field] + [Key] + public Guid Id { get; set; } + + [Field] + public Gender? NullableGender { get; set; } + + [Field] + public Gender Gender { get; set; } + } + + [HierarchyRoot] + public class EntityWithExtendedGender : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public ExtendedGender? NullableGender { get; set; } + + [Field] + public ExtendedGender Gender { get; set; } + } + + [HierarchyRoot] + public class EntityWithIntFlags : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public SomeIntFlags Flags { get; set; } + + [Field] + public SomeIntFlags? NullableFlags { get; set; } + } + + [HierarchyRoot] + public class EntityWithLongFlags : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public SomeLongFlags Flags { get; set; } + + [Field] + public SomeLongFlags? NullableFlags { get; set; } + } + + [HierarchyRoot] + public class EntityWithDateTime : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public DateTime? NullableDateTime { get; set; } + + [Field] + public DateTime DateTime { get; set; } + } + + [HierarchyRoot] + public class EntityWithInt : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public int Int { get; set; } + + [Field] + public int? NullableInt { get; set; } + } + + [HierarchyRoot] + public class EntityWithDecimal : Entity + { + [Field, Key] + public Guid Id { get; set; } + + [Field] + public decimal Sum { get; set; } + } + + public enum Gender + { + None = 0, + Male = 1, + Female = 2 + } + + public enum ExtendedGender : long + { + None = 0, + Male = 1, + Female = 2, + Transgender = 4 + } + + [Flags] + public enum SomeIntFlags : int + { + None = 0, + Flag1 = 1 << 0, + Flag2 = 1 << 1, + Flag3 = 1 << 2, + Flag4 = 1 << 3, + Flag5 = 1 << 4, + Flag6 = 1 << 5, + Flag7 = 1 << 6, + Flag8 = 1 << 7, + Flag9 = 1 << 8, + Flag10 = 1 << 9, + Flag11 = 1 << 10, + Flag12 = 1 << 11, + Flag13 = 1 << 12, + Flag14 = 1 << 13, + Flag15 = 1 << 14, + Flag16 = 1 << 15, + Flag17 = 1 << 16, + Flag18 = 1 << 17, + Flag19 = 1 << 18, + Flag20 = 1 << 19, + } + + [Flags] + public enum SomeLongFlags : long + { + None = 0, + Flag1 = 1L << 0, + Flag2 = 1L << 1, + Flag3 = 1L << 2, + Flag4 = 1L << 3, + Flag5 = 1L << 4, + Flag6 = 1L << 5, + Flag7 = 1L << 6, + Flag8 = 1L << 7, + Flag9 = 1L << 8, + Flag10 = 1L << 9, + Flag11 = 1L << 10, + Flag12 = 1L << 11, + Flag13 = 1L << 12, + Flag14 = 1L << 13, + Flag15 = 1L << 14, + Flag16 = 1L << 15, + Flag17 = 1L << 16, + Flag18 = 1L << 17, + Flag19 = 1L << 18, + Flag20 = 1L << 19, + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0659_EnumExpressionsAndConstantsTranslationBug : AutoBuildTest + { + private readonly DateTime nullableFieldDateTime = new DateTime(2015, 6, 6); + private readonly DateTime firstDateTime = new DateTime(2013, 10, 10); + private readonly DateTime secondDateTime = new DateTime(2014, 12, 10); + private readonly DateTime defaultDateTime = new DateTime(2012, 12, 12); + + [Test] + public void DirectGroupByByNotNullEnum() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.Gender) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g=> g.Key==Gender.Male)); + Assert.That(result.Any(g=>g.Key==Gender.Female)); + + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForIntEnumTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .GroupBy(x => x.NullableGender.HasValue ? x.NullableGender.Value : Gender.None) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==Gender.None)); + Assert.That(genderGroups.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForLongEnumTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .GroupBy(x => x.NullableGender.HasValue ? x.NullableGender.Value : ExtendedGender.None) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.None)); + Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForIntFlagTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .GroupBy(x => x.NullableFlags.HasValue ? x.NullableFlags.Value : SomeIntFlags.None) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForLongFlagTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .GroupBy(x => x.NullableFlags.HasValue ? x.NullableFlags.Value : SomeLongFlags.None) + .Select(g => new { g.Key, Items = g }) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForDateTimeTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .GroupBy(x => x.NullableDateTime.HasValue ? x.NullableDateTime.Value : new DateTime(2012, 12, 12)) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==new DateTime(2012, 12, 12))); + Assert.That(genderGroups.Any(g => g.Key==nullableFieldDateTime)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByConditionalOperatorForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableInt.HasValue ? x.NullableInt : -1) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForIntEnumTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .Select(el => new { + Id = el.Id, + Gender = el.NullableGender.HasValue ? el.NullableGender.Value : Gender.None + }) + .GroupBy(x => x.Gender) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==Gender.None)); + Assert.That(genderGroups.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForLongEnumTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .Select(el => new { + Id = el.Id, + Gender = el.NullableGender.HasValue ? el.NullableGender.Value : ExtendedGender.None + }) + .GroupBy(x => x.Gender) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.None)); + Assert.That(genderGroups.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForIntFlagTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .Select(el => new { + Id = el.Id, + Flags = el.NullableFlags.HasValue ? el.NullableFlags.Value : SomeIntFlags.None + }) + .GroupBy(x => x.Flags) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(genderGroups.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForLongFlagTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .Select(el => new { + Id = el.Id, + Flags = el.NullableFlags.HasValue ? el.NullableFlags.Value : SomeLongFlags.None + }) + .GroupBy(x => x.Flags) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(genderGroups.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForDateTimeTest() + { + Action testAction = (session) => { + var genderGroups = session.Query.All() + .Select(el => new { + Id = el.Id, + DateTime = el.NullableDateTime.HasValue ? el.NullableDateTime.Value : new DateTime(2012, 12, 12) + }) + .GroupBy(x => x.DateTime) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(genderGroups.Length, Is.EqualTo(2)); + Assert.That(genderGroups.Any(g => g.Key==new DateTime(2012, 12, 12))); + Assert.That(genderGroups.Any(g => g.Key==nullableFieldDateTime)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByConditionalOperatorForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableInt = el.NullableInt.HasValue ? el.NullableInt : -1 + }) + .GroupBy(x => x.NullableInt) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForIntEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableGender ?? Gender.None) + .Select(g => new { Key = g.Key, Items = g }) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==Gender.None)); + Assert.That(result.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForLongEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableGender ?? ExtendedGender.None) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==ExtendedGender.None)); + Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForIntFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableFlags ?? SomeIntFlags.None) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForLongFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableFlags ?? SomeLongFlags.None) + .Select(g => new { Key = g.Key, Items = g }) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForDateTimeTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableDateTime ?? new DateTime(2012, 12, 12)) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); + Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByCoalescingOperatorForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableInt ?? -1) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForIntEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableGender = el.NullableGender ?? Gender.None + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==Gender.None)); + Assert.That(result.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForLongEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableGender = el.NullableGender ?? ExtendedGender.None + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==ExtendedGender.None)); + Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForIntFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableGender = el.NullableFlags ?? SomeIntFlags.None + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForLongFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableGender = el.NullableFlags ?? SomeLongFlags.None + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForDateTimeTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableGender = el.NullableDateTime ?? new DateTime(2012, 12, 12) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); + Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByCoalescingOperatorForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableInt = el.NullableInt ?? -1 + }) + .GroupBy(x => x.NullableInt) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByGetValueOrDefaultForIntEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableGender.GetValueOrDefault(Gender.None)) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==Gender.None)); + Assert.That(result.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByGetValueOrDefaultForLongEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableGender.GetValueOrDefault(ExtendedGender.None)) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==ExtendedGender.None)); + Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByGetValueOrDefaultForIntFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableFlags.GetValueOrDefault(SomeIntFlags.None)) + .Select(g => new { Key = g.Key, Items = g }) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByGetValueOrDefaultForLongFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableFlags.GetValueOrDefault(SomeLongFlags.None)) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByGetValueOrDefaultForDateTimeTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableDateTime.GetValueOrDefault(new DateTime(2012, 12, 12))) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); + Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); + }; + RunTestInSession(testAction); + } + + [Test] + public void DirectGroupByByGetValueOrDefaultForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .GroupBy(x => x.NullableInt.GetValueOrDefault(-1)) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForIntEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + el.Id, + NullableGender = el.NullableGender.GetValueOrDefault(Gender.None) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==Gender.None)); + Assert.That(result.Any(g => g.Key==Gender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForLongEnumTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + el.Id, + NullableGender = el.NullableGender.GetValueOrDefault(ExtendedGender.None) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==ExtendedGender.None)); + Assert.That(result.Any(g => g.Key==ExtendedGender.Female)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + el.Id, + NullableGender = el.NullableFlags.GetValueOrDefault(SomeIntFlags.None) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.None)); + Assert.That(result.Any(g => g.Key==SomeIntFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForLongFlagTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + el.Id, + NullableGender = el.NullableFlags.GetValueOrDefault(SomeLongFlags.None) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.None)); + Assert.That(result.Any(g => g.Key==SomeLongFlags.Flag10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForDateTimeTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + el.Id, + NullableGender = el.NullableDateTime.GetValueOrDefault(new DateTime(2012, 12, 12)) + }) + .GroupBy(x => x.NullableGender) + .Select(g => new {Key = g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==new DateTime(2012, 12, 12))); + Assert.That(result.Any(g => g.Key==nullableFieldDateTime)); + }; + RunTestInSession(testAction); + } + + [Test] + public void IndirectGroupByByGetValueOrDefaultForIntTest() + { + Action testAction = (session) => { + var result = session.Query.All() + .Select(el => new { + Id = el.Id, + NullableInt = el.NullableInt.GetValueOrDefault(-1) + }) + .GroupBy(x => x.NullableInt) + .Select(g => new {g.Key, Items = g}) + .ToArray(); + Assert.That(result.Length, Is.EqualTo(2)); + Assert.That(result.Any(g => g.Key==-1)); + Assert.That(result.Any(g => g.Key==10)); + }; + RunTestInSession(testAction); + } + + [Test] + public void OrderByHasFlagExpressionTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .OrderBy(el => el.Flags.HasFlag(SomeIntFlags.Flag10)).ToArray(); + var result2 = session.Query.All() + .OrderBy(el => el.Flags.HasFlag(SomeLongFlags.Flag10)).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void OrderByBitAndExpressionTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .OrderBy(el => (el.Flags & SomeIntFlags.Flag1)==SomeIntFlags.Flag1).ToArray(); + var result2 = session.Query.All() + .OrderBy(el => (el.Flags & SomeLongFlags.Flag1)==SomeLongFlags.Flag1).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void OrderByCoalescingOperatorTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .OrderBy(el => el.NullableFlags ?? SomeIntFlags.Flag1).ToArray(); + var result2 = session.Query.All() + .OrderBy(el => el.NullableFlags ?? SomeLongFlags.Flag1).ToArray(); + var result3 = session.Query.All() + .OrderBy(el => el.NullableGender ?? Gender.None).ToArray(); + var result4 = session.Query.All() + .OrderBy(el => el.NullableGender ?? ExtendedGender.None).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void OrderByInequalityExpressionTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .OrderBy(el => el.Gender!=Gender.Male).ToArray(); + var result2 = session.Query.All() + .OrderBy(el => Gender.Male!=el.Gender).ToArray(); + + var result3 = session.Query.All() + .OrderBy(el => el.Gender!=ExtendedGender.Male).ToArray(); + var result4 = session.Query.All() + .OrderBy(el => ExtendedGender.Male!=el.Gender).ToArray(); + + var result5 = session.Query.All() + .OrderBy(el => el.Flags!=SomeIntFlags.Flag1).ToArray(); + var result6 = session.Query.All() + .OrderBy(el => SomeIntFlags.Flag1!=el.Flags).ToArray(); + + var result7 = session.Query.All() + .OrderBy(el => el.Flags!=SomeLongFlags.Flag1).ToArray(); + var result8 = session.Query.All() + .OrderBy(el => SomeLongFlags.Flag1!=el.Flags).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void OrderByEqualityExpression() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .OrderBy(el => el.Gender==Gender.Male).ToArray(); + var result2 = session.Query.All() + .OrderBy(el => Gender.Male==el.Gender).ToArray(); + + var result3 = session.Query.All() + .OrderBy(el => el.Gender==ExtendedGender.Male).ToArray(); + var result4 = session.Query.All() + .OrderBy(el => ExtendedGender.Male==el.Gender).ToArray(); + + var result5 = session.Query.All() + .OrderBy(el => el.Flags==SomeIntFlags.Flag1).ToArray(); + var result6 = session.Query.All() + .OrderBy(el => SomeIntFlags.Flag1==el.Flags).ToArray(); + + var result7 = session.Query.All() + .OrderBy(el => el.Flags==SomeLongFlags.Flag1).ToArray(); + var result8 = session.Query.All() + .OrderBy(el => SomeLongFlags.Flag1==el.Flags).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void WhereByHasValueTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .Where(el => el.Flags.HasFlag(SomeIntFlags.Flag1)).ToArray(); + var result2 = session.Query.All() + .Where(el => el.Flags.HasFlag(SomeLongFlags.Flag1)).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void WhereByBitAndExpressionTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .Where(el => (el.Flags & SomeIntFlags.Flag1)==SomeIntFlags.Flag1).ToArray(); + + var result2 = session.Query.All() + .Where(el => (el.Flags & SomeLongFlags.Flag1)==SomeLongFlags.Flag1).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void WhereByEqualityTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .Where(el => el.Gender==Gender.Male).ToArray(); + var result2 = session.Query.All() + .Where(el => Gender.Male==el.Gender).ToArray(); + + var result3 = session.Query.All() + .Where(el => el.Gender==ExtendedGender.Male).ToArray(); + var result4 = session.Query.All() + .Where(el => ExtendedGender.Male==el.Gender).ToArray(); + + var result5 = session.Query.All() + .Where(el => el.Flags==SomeIntFlags.Flag1).ToArray(); + var result6 = session.Query.All() + .Where(el => SomeIntFlags.Flag1==el.Flags).ToArray(); + + var result7 = session.Query.All() + .Where(el => el.Flags==SomeLongFlags.Flag1).ToArray(); + var result8 = session.Query.All() + .Where(el => SomeLongFlags.Flag1==el.Flags).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void WhereByInequalityTest() + { + Action testAction = (session) => { + var result1 = session.Query.All() + .Where(el => el.Gender!=Gender.Female).ToArray(); + var result2 = session.Query.All() + .Where(el => Gender.Female!=el.Gender).ToArray(); + + var result3 = session.Query.All() + .Where(el => el.Gender!=ExtendedGender.Female).ToArray(); + var result4 = session.Query.All() + .Where(el => ExtendedGender.Female!=el.Gender).ToArray(); + + var result5 = session.Query.All() + .Where(el => el.Flags!=SomeIntFlags.Flag1).ToArray(); + var result6 = session.Query.All() + .Where(el => SomeIntFlags.Flag1!=el.Flags).ToArray(); + + var result7 = session.Query.All() + .Where(el => el.Flags!=SomeLongFlags.Flag1).ToArray(); + var result8 = session.Query.All() + .Where(el => SomeLongFlags.Flag1!=el.Flags).ToArray(); + }; + RunTestInSession(testAction); + } + + [Test] + public void MathRoundTest() + { + Action testAction = (session) => { + Assert.DoesNotThrow(() => session.Query.All().Select(e => (Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100)).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Where(e => (Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100) > 1).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().OrderBy(e => Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Sum(e => Math.Truncate(Math.Round(e.Sum, 2) * 100) / 100)); + Assert.DoesNotThrow(() => session.Query.All().Select(e => (Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100)).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Where(e => (Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100) > 1).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().OrderBy(e => Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100).ToArray()); + Assert.DoesNotThrow(() => session.Query.All().Sum(e => Math.Truncate(Math.Round(e.Sum, 2, MidpointRounding.AwayFromZero) * 100) / 100)); + }; + RunTestInSession(testAction); + } + + [Test] + public void ConcatinationTest() + { + Action testAction = session => { + Assert.DoesNotThrow( + () => session.Query.All().Select(q=> new {q.Id, Gender = Gender.Female}) + .Concat(session.Query.All().Select(q=> new {q.Id, Gender = Gender.Male})) + .FirstOrDefault()); + }; + RunTestInSession(testAction); + } + + private void RunTestInSession(Action testBody) + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + testBody.Invoke(session); + } + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new EntityWithGender {Gender = Gender.Male}; + new EntityWithGender {Gender = Gender.Female, NullableGender = Gender.Female}; + + new EntityWithExtendedGender {Gender = ExtendedGender.Male}; + new EntityWithExtendedGender {Gender = ExtendedGender.Female, NullableGender = ExtendedGender.Female}; + + new EntityWithIntFlags {Flags = SomeIntFlags.Flag1 | SomeIntFlags.Flag20}; + new EntityWithIntFlags {Flags = SomeIntFlags.Flag1 | SomeIntFlags.Flag10, NullableFlags = SomeIntFlags.Flag10}; + + new EntityWithLongFlags {Flags = SomeLongFlags.Flag1 | SomeLongFlags.Flag20}; + new EntityWithLongFlags {Flags = SomeLongFlags.Flag1 | SomeLongFlags.Flag20, NullableFlags = SomeLongFlags.Flag10}; + + new EntityWithDateTime {DateTime = firstDateTime}; + new EntityWithDateTime {DateTime = secondDateTime, NullableDateTime = nullableFieldDateTime}; + + new EntityWithInt {Int = 20}; + new EntityWithInt {Int = 20, NullableInt = 10}; + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (EntityWithGender).Assembly, typeof (EntityWithGender).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0674_ReferenceFinderBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0674_ReferenceFinderBug.cs index 8fefcd3f30..8454221f49 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0674_ReferenceFinderBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0674_ReferenceFinderBug.cs @@ -1,125 +1,125 @@ -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0674_ReferenceFinderBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0674_ReferenceFinderBugModel -{ - [Serializable] - [HierarchyRoot] - public class TestA : Entity - { - public TestA(Session session) : base(session) { } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TestB : Entity - { - public TestB(Session session) : base(session) { } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - - [Field] - public TestA TestA { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0674_ReferenceFinderBug : AutoBuildTest - { - [Test] - public void RemoveUnsavedReferenceClientTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { - var testA = new TestA(session) { Text = "A" }; - var testB = new TestB(session) { Text = "B", TestA = testA }; - - testB.Remove(); - testA.Remove(); - } - } - - [Test] - public void RemoveUnsavedReferenceServerTest() - { - using (var session = Domain.OpenSession()) - using (var trasaction = session.OpenTransaction()) { - var testA = new TestA(session) { Text = "A" }; - var testB = new TestB(session) { Text = "B", TestA = testA }; - - testB.Remove(); - testA.Remove(); - } - } - - [Test] - public void RemoveSavedReferenceClientTest() - { - Key keyA2, keyB1, keyB2; - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) - using (var transaction = session.OpenTransaction()) { - var testA1 = new TestA(session) {Text = "A1"}; - keyA2 = new TestA(session) {Text = "A2"}.Key; - keyB1 = new TestB(session) {Text = "B1", TestA = testA1}.Key; - keyB2 = new TestB(session) {Text = "B2", TestA = testA1}.Key; - transaction.Complete(); - } - - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { - var testA2 = session.Query.Single(keyA2); - var testB1 = session.Query.Single(keyB1); - var testB2 = session.Query.Single(keyB2); - testB2.Remove(); - var testA1 = testB1.TestA; - testB1.TestA = testA2; - // Exception with TestB2! - testA1.Remove(); - } - } - - [Test] - public void RemoveSavedReferenceServerTest() - { - Key keyA2, keyB1, keyB2; - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) - using (var transaction = session.OpenTransaction()) { - var testA1 = new TestA(session) {Text = "A1"}; - keyA2 = new TestA(session) {Text = "A2"}.Key; - keyB1 = new TestB(session) {Text = "B1", TestA = testA1}.Key; - keyB2 = new TestB(session) {Text = "B2", TestA = testA1}.Key; - transaction.Complete(); - } - - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) - using (var transaction = session.OpenTransaction()) { - var testA2 = session.Query.Single(keyA2); - var testB1 = session.Query.Single(keyB1); - var testB2 = session.Query.Single(keyB2); - testB2.Remove(); - var testA1 = testB1.TestA; - testB1.TestA = testA2; - testA1.Remove(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); - return configuration; - } - } -} +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0674_ReferenceFinderBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0674_ReferenceFinderBugModel +{ + [Serializable] + [HierarchyRoot] + public class TestA : Entity + { + public TestA(Session session) : base(session) { } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TestB : Entity + { + public TestB(Session session) : base(session) { } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + + [Field] + public TestA TestA { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0674_ReferenceFinderBug : AutoBuildTest + { + [Test] + public void RemoveUnsavedReferenceClientTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { + var testA = new TestA(session) { Text = "A" }; + var testB = new TestB(session) { Text = "B", TestA = testA }; + + testB.Remove(); + testA.Remove(); + } + } + + [Test] + public void RemoveUnsavedReferenceServerTest() + { + using (var session = Domain.OpenSession()) + using (var trasaction = session.OpenTransaction()) { + var testA = new TestA(session) { Text = "A" }; + var testB = new TestB(session) { Text = "B", TestA = testA }; + + testB.Remove(); + testA.Remove(); + } + } + + [Test] + public void RemoveSavedReferenceClientTest() + { + Key keyA2, keyB1, keyB2; + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) + using (var transaction = session.OpenTransaction()) { + var testA1 = new TestA(session) {Text = "A1"}; + keyA2 = new TestA(session) {Text = "A2"}.Key; + keyB1 = new TestB(session) {Text = "B1", TestA = testA1}.Key; + keyB2 = new TestB(session) {Text = "B2", TestA = testA1}.Key; + transaction.Complete(); + } + + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { + var testA2 = session.Query.Single(keyA2); + var testB1 = session.Query.Single(keyB1); + var testB2 = session.Query.Single(keyB2); + testB2.Remove(); + var testA1 = testB1.TestA; + testB1.TestA = testA2; + // Exception with TestB2! + testA1.Remove(); + } + } + + [Test] + public void RemoveSavedReferenceServerTest() + { + Key keyA2, keyB1, keyB2; + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) + using (var transaction = session.OpenTransaction()) { + var testA1 = new TestA(session) {Text = "A1"}; + keyA2 = new TestA(session) {Text = "A2"}.Key; + keyB1 = new TestB(session) {Text = "B1", TestA = testA1}.Key; + keyB2 = new TestB(session) {Text = "B2", TestA = testA1}.Key; + transaction.Complete(); + } + + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) + using (var transaction = session.OpenTransaction()) { + var testA2 = session.Query.Single(keyA2); + var testB1 = session.Query.Single(keyB1); + var testB2 = session.Query.Single(keyB2); + testB2.Remove(); + var testA1 = testB1.TestA; + testB1.TestA = testA2; + testA1.Remove(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (TestA).Assembly, typeof (TestA).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0675_EntityChangeRegistryDoesntClear.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0675_EntityChangeRegistryDoesntClear.cs index f2ed03bc4d..18f20d77e4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0675_EntityChangeRegistryDoesntClear.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0675_EntityChangeRegistryDoesntClear.cs @@ -1,283 +1,283 @@ -using System; -using System.Linq; -using System.Reflection; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Interfaces.Model; -using Xtensive.Orm.Tests.Issues.CustomerBug1Model; - -namespace Xtensive.Orm.Tests.Issues.CustomerBug1Model -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public int Index { get; set; } - - [Field] - public int Value { get; set; } - } - - [HierarchyRoot] - [Index("Index", Unique = true)] - [Index("Value", Unique = true)] - public class TestEntityWithUniqueIndex : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public int Index { get; set; } - - [Field] - public int Value { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0675_EntityChangeRegistryDoesntClear : AutoBuildTest - { - private const int MaxEntities = 50; - - [Test] - public void TestTransactionRollbackOnDeadLock() - { - System.Threading.Tasks.Task task1 = System.Threading.Tasks.Task.Factory.StartNew(() => UpdateEntities(1)); - System.Threading.Tasks.Task task2 = System.Threading.Tasks.Task.Factory.StartNew(() => UpdateEntities(2)); - System.Threading.Tasks.Task.WaitAll(task1, task2); - } - - [Test] - public void ChangeSavedEntityInsideTransactionTest01() - { - using (var session = Domain.OpenSession()) { - TestEntityWithUniqueIndex a; - TestEntityWithUniqueIndex b; - using (var transaction = session.OpenTransaction()) { - new TestEntityWithUniqueIndex { - Index = 1, - Value = 1, - }; - new TestEntityWithUniqueIndex { - Index = 2, - Value = 2 - }; - transaction.Complete(); - } - - a = session.Query.All().First(el=>el.Index==1); - b = session.Query.All().First(el=>el.Index==2); - - try { - using (var trasaction = session.OpenTransaction()) { - a.Value = 2; //unique constraint violation - trasaction.Complete(); - } - } - catch(Exception) {} - - Assert.That(a.Index, Is.EqualTo(1)); - Assert.That(a.Value, Is.EqualTo(1)); - Assert.That(b.Index, Is.EqualTo(2)); - Assert.That(b.Value, Is.EqualTo(2)); - Assert.That(session.EntityChangeRegistry.Count, Is.EqualTo(0)); - } - } - - [Test] - public void ChangeEntityOutsideTransaction() - { - using (var session = Domain.OpenSession()) { - TestEntityWithUniqueIndex a; - TestEntityWithUniqueIndex b; - using (var transaction = session.OpenTransaction()) { - new TestEntityWithUniqueIndex { - Index = 3, - Value = 3, - }; - new TestEntityWithUniqueIndex { - Index = 4, - Value = 4 - }; - transaction.Complete(); - } - - a = session.Query.All().First(el=>el.Index==3); - b = session.Query.All().First(el=>el.Index==4); - Assert.Throws(()=>a.Value = 5); - } - } - - [Test] - public void DeleteOutsideTransactionTest() - { - using (var session = Domain.OpenSession()) { - TestEntityWithUniqueIndex a; - TestEntityWithUniqueIndex b; - using (var transaction = session.OpenTransaction()) { - new TestEntityWithUniqueIndex { - Index = 5, - Value = 5, - }; - new TestEntityWithUniqueIndex { - Index = 6, - Value = 6 - }; - transaction.Complete(); - } - - a = session.Query.All().First(el => el.Index==5); - b = session.Query.All().First(el => el.Index==6); - - Assert.Throws(()=>a.Remove()); - } - } - - [Test] - public void DeleteInsideTransaction() - { - using (var session = Domain.OpenSession()) { - TestEntityWithUniqueIndex aaa; - TestEntityWithUniqueIndex bbb; - TestEntityWithUniqueIndex ccc; - using (var transaction = session.OpenTransaction()) { - new TestEntityWithUniqueIndex { - Index = 7, - Value = 7, - }; - new TestEntityWithUniqueIndex { - Index = 8, - Value = 8 - }; - new TestEntityWithUniqueIndex { - Index = 9, - Value = 9 - }; - transaction.Complete(); - } - - aaa = session.Query.All().First(el => el.Index==7); - bbb = session.Query.All().First(el => el.Index==8); - ccc = session.Query.All().First(el => el.Index==9); - - try { - using (var transaction = session.OpenTransaction()) { - aaa.Value = 8; - ccc.Remove(); - - transaction.Complete(); - } - } - catch(Exception){} - - Assert.That(aaa.Index, Is.EqualTo(7)); - Assert.That(aaa.Value, Is.EqualTo(7)); - Assert.That(bbb.Index, Is.EqualTo(8)); - Assert.That(bbb.Value, Is.EqualTo(8)); - Assert.That(ccc.IsRemoved, Is.False); - Assert.That(ccc.Index, Is.EqualTo(9)); - Assert.That(ccc.Value, Is.EqualTo(9)); - Assert.That(session.EntityChangeRegistry.Count, Is.EqualTo(0)); - } - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - for (int i = 0; i < MaxEntities; i++) { - new TestEntity() {Index = i, Value = 1}; - } - t.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Assert.That(session.Query.All().Count(), Is.EqualTo(MaxEntities)); - } - } - - private void UpdateEntities(int instanceId) - { - for (int i = 0; i < MaxEntities; i++) { - using (Session session = Domain.OpenSession()) { - int retryCount = 3; - for (int retry = 0; ; retry++) { - - int initialValue = 0; - try { - initialValue = GetEntityValue(session, i); - UpdateEntity(session, i); - break; - } - catch (Exception ex) { - if (ex is DeadlockException || - ex is TransactionSerializationFailureException || - (ex is TargetInvocationException && (ex.InnerException is DeadlockException || ex.InnerException is TransactionSerializationFailureException))) - { - if (retry + 1 < retryCount) { - Console.WriteLine("Deadlock detected : retrying transactional method for UpdateEntities({0}, {1})", instanceId, i); - int currentValue = GetEntityValue(session, i); - if (currentValue != initialValue) { - Console.WriteLine("Deadlock detected : retrying transactional method for UpdateEntities({0}, {1})", instanceId, i); - } - continue; - } - else { - Console.WriteLine("Deadlock detected on last try : giving up on UpdateEntities2({0})", i); - throw; - } - } - else { - throw; - } - } - } - } - } - } - - private int GetEntityValue(Session session, int i) - { - int initialValue; - using (TransactionScope t = session.OpenTransaction()) - { - TestEntity entity = Query.All().Single(e => e.Index == i); - initialValue = entity.Value; - t.Complete(); - } - return initialValue; - } - - private void UpdateEntity(Session session, int i) - { - using (TransactionScope t = session.OpenTransaction()) { - TestEntity entity = Query.All().Single(e => e.Index == i); - int initialValue = entity.Value; - entity.Value++; - t.Complete(); // rollback - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(TestEntity).Assembly, typeof (TestEntity).Namespace); - - SessionConfiguration defaultSessionConfig = configuration.Sessions.Default; - if (defaultSessionConfig==null) { - defaultSessionConfig = new SessionConfiguration(WellKnown.Sessions.Default); - configuration.Sessions.Add(defaultSessionConfig); - } - - defaultSessionConfig.Options = SessionOptions.ValidateEntities | SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges | SessionOptions.NonTransactionalReads; - return configuration; - } - } -} +using System; +using System.Linq; +using System.Reflection; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Interfaces.Model; +using Xtensive.Orm.Tests.Issues.CustomerBug1Model; + +namespace Xtensive.Orm.Tests.Issues.CustomerBug1Model +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public int Index { get; set; } + + [Field] + public int Value { get; set; } + } + + [HierarchyRoot] + [Index("Index", Unique = true)] + [Index("Value", Unique = true)] + public class TestEntityWithUniqueIndex : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public int Index { get; set; } + + [Field] + public int Value { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0675_EntityChangeRegistryDoesntClear : AutoBuildTest + { + private const int MaxEntities = 50; + + [Test] + public void TestTransactionRollbackOnDeadLock() + { + System.Threading.Tasks.Task task1 = System.Threading.Tasks.Task.Factory.StartNew(() => UpdateEntities(1)); + System.Threading.Tasks.Task task2 = System.Threading.Tasks.Task.Factory.StartNew(() => UpdateEntities(2)); + System.Threading.Tasks.Task.WaitAll(task1, task2); + } + + [Test] + public void ChangeSavedEntityInsideTransactionTest01() + { + using (var session = Domain.OpenSession()) { + TestEntityWithUniqueIndex a; + TestEntityWithUniqueIndex b; + using (var transaction = session.OpenTransaction()) { + new TestEntityWithUniqueIndex { + Index = 1, + Value = 1, + }; + new TestEntityWithUniqueIndex { + Index = 2, + Value = 2 + }; + transaction.Complete(); + } + + a = session.Query.All().First(el=>el.Index==1); + b = session.Query.All().First(el=>el.Index==2); + + try { + using (var trasaction = session.OpenTransaction()) { + a.Value = 2; //unique constraint violation + trasaction.Complete(); + } + } + catch(Exception) {} + + Assert.That(a.Index, Is.EqualTo(1)); + Assert.That(a.Value, Is.EqualTo(1)); + Assert.That(b.Index, Is.EqualTo(2)); + Assert.That(b.Value, Is.EqualTo(2)); + Assert.That(session.EntityChangeRegistry.Count, Is.EqualTo(0)); + } + } + + [Test] + public void ChangeEntityOutsideTransaction() + { + using (var session = Domain.OpenSession()) { + TestEntityWithUniqueIndex a; + TestEntityWithUniqueIndex b; + using (var transaction = session.OpenTransaction()) { + new TestEntityWithUniqueIndex { + Index = 3, + Value = 3, + }; + new TestEntityWithUniqueIndex { + Index = 4, + Value = 4 + }; + transaction.Complete(); + } + + a = session.Query.All().First(el=>el.Index==3); + b = session.Query.All().First(el=>el.Index==4); + Assert.Throws(()=>a.Value = 5); + } + } + + [Test] + public void DeleteOutsideTransactionTest() + { + using (var session = Domain.OpenSession()) { + TestEntityWithUniqueIndex a; + TestEntityWithUniqueIndex b; + using (var transaction = session.OpenTransaction()) { + new TestEntityWithUniqueIndex { + Index = 5, + Value = 5, + }; + new TestEntityWithUniqueIndex { + Index = 6, + Value = 6 + }; + transaction.Complete(); + } + + a = session.Query.All().First(el => el.Index==5); + b = session.Query.All().First(el => el.Index==6); + + Assert.Throws(()=>a.Remove()); + } + } + + [Test] + public void DeleteInsideTransaction() + { + using (var session = Domain.OpenSession()) { + TestEntityWithUniqueIndex aaa; + TestEntityWithUniqueIndex bbb; + TestEntityWithUniqueIndex ccc; + using (var transaction = session.OpenTransaction()) { + new TestEntityWithUniqueIndex { + Index = 7, + Value = 7, + }; + new TestEntityWithUniqueIndex { + Index = 8, + Value = 8 + }; + new TestEntityWithUniqueIndex { + Index = 9, + Value = 9 + }; + transaction.Complete(); + } + + aaa = session.Query.All().First(el => el.Index==7); + bbb = session.Query.All().First(el => el.Index==8); + ccc = session.Query.All().First(el => el.Index==9); + + try { + using (var transaction = session.OpenTransaction()) { + aaa.Value = 8; + ccc.Remove(); + + transaction.Complete(); + } + } + catch(Exception){} + + Assert.That(aaa.Index, Is.EqualTo(7)); + Assert.That(aaa.Value, Is.EqualTo(7)); + Assert.That(bbb.Index, Is.EqualTo(8)); + Assert.That(bbb.Value, Is.EqualTo(8)); + Assert.That(ccc.IsRemoved, Is.False); + Assert.That(ccc.Index, Is.EqualTo(9)); + Assert.That(ccc.Value, Is.EqualTo(9)); + Assert.That(session.EntityChangeRegistry.Count, Is.EqualTo(0)); + } + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + for (int i = 0; i < MaxEntities; i++) { + new TestEntity() {Index = i, Value = 1}; + } + t.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Assert.That(session.Query.All().Count(), Is.EqualTo(MaxEntities)); + } + } + + private void UpdateEntities(int instanceId) + { + for (int i = 0; i < MaxEntities; i++) { + using (Session session = Domain.OpenSession()) { + int retryCount = 3; + for (int retry = 0; ; retry++) { + + int initialValue = 0; + try { + initialValue = GetEntityValue(session, i); + UpdateEntity(session, i); + break; + } + catch (Exception ex) { + if (ex is DeadlockException || + ex is TransactionSerializationFailureException || + (ex is TargetInvocationException && (ex.InnerException is DeadlockException || ex.InnerException is TransactionSerializationFailureException))) + { + if (retry + 1 < retryCount) { + Console.WriteLine("Deadlock detected : retrying transactional method for UpdateEntities({0}, {1})", instanceId, i); + int currentValue = GetEntityValue(session, i); + if (currentValue != initialValue) { + Console.WriteLine("Deadlock detected : retrying transactional method for UpdateEntities({0}, {1})", instanceId, i); + } + continue; + } + else { + Console.WriteLine("Deadlock detected on last try : giving up on UpdateEntities2({0})", i); + throw; + } + } + else { + throw; + } + } + } + } + } + } + + private int GetEntityValue(Session session, int i) + { + int initialValue; + using (TransactionScope t = session.OpenTransaction()) + { + TestEntity entity = Query.All().Single(e => e.Index == i); + initialValue = entity.Value; + t.Complete(); + } + return initialValue; + } + + private void UpdateEntity(Session session, int i) + { + using (TransactionScope t = session.OpenTransaction()) { + TestEntity entity = Query.All().Single(e => e.Index == i); + int initialValue = entity.Value; + entity.Value++; + t.Complete(); // rollback + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(TestEntity).Assembly, typeof (TestEntity).Namespace); + + SessionConfiguration defaultSessionConfig = configuration.Sessions.Default; + if (defaultSessionConfig==null) { + defaultSessionConfig = new SessionConfiguration(WellKnown.Sessions.Default); + configuration.Sessions.Add(defaultSessionConfig); + } + + defaultSessionConfig.Options = SessionOptions.ValidateEntities | SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges | SessionOptions.NonTransactionalReads; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0702_QueryingWithoutOpenedTransaction.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0702_QueryingWithoutOpenedTransaction.cs index f74c1fa3f9..e9ee34ada0 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0702_QueryingWithoutOpenedTransaction.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0702_QueryingWithoutOpenedTransaction.cs @@ -1,66 +1,66 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0702_QueryingWithoutOpenedTransactionModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0702_QueryingWithoutOpenedTransactionModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Text { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0702_QueryingWithoutOpenedTransaction: AutoBuildTest - { - [Test] - public void NonTransactionalReadsIsEnabledTest() - { - var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads); - - using (var session = Domain.OpenSession(sessionConfiguration)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - new TestEntity {Text = "abc"}; - } - - Assert.DoesNotThrow(() => Query.All().Any()); - Assert.DoesNotThrow(() => session.Query.All().Any()); - } - } - - [Test] - public void NonTransactionalReadsIsDisabledTest() - { - var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile); - - using (var session = Domain.OpenSession(sessionConfiguration)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - new TestEntity { Text = "abc" }; - } - - Assert.Throws(() => Query.All().Any()); - Assert.Throws(() => session.Query.All().Any()); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0702_QueryingWithoutOpenedTransactionModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0702_QueryingWithoutOpenedTransactionModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Text { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0702_QueryingWithoutOpenedTransaction: AutoBuildTest + { + [Test] + public void NonTransactionalReadsIsEnabledTest() + { + var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads); + + using (var session = Domain.OpenSession(sessionConfiguration)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + new TestEntity {Text = "abc"}; + } + + Assert.DoesNotThrow(() => Query.All().Any()); + Assert.DoesNotThrow(() => session.Query.All().Any()); + } + } + + [Test] + public void NonTransactionalReadsIsDisabledTest() + { + var sessionConfiguration = new SessionConfiguration(SessionOptions.ServerProfile); + + using (var session = Domain.OpenSession(sessionConfiguration)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + new TestEntity { Text = "abc" }; + } + + Assert.Throws(() => Query.All().Any()); + Assert.Throws(() => session.Query.All().Any()); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0708_StackOverflowOnDifferetialTupleMerge.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0708_StackOverflowOnDifferetialTupleMerge.cs index 3e7fb79a56..db5574b7cc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0708_StackOverflowOnDifferetialTupleMerge.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0708_StackOverflowOnDifferetialTupleMerge.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2017.09.06 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0708_StackOverflowOnDifferetialTupleMergeModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0708_StackOverflowOnDifferetialTupleMergeModel -{ - [HierarchyRoot] - public class Ent : Entity - { - [Field, Key] - public Guid Id { get; set; } - - [Field] - public int Num { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture, Explicit("The test is really time-consuming")] - public class IssueJira0708_StackOverflowOnDifferetialTupleMerge : AutoBuildTest - { - private int IterationsCount = 100000; - - [Test] - public void MainTest() - { - var sw = new Stopwatch(); - using (var s = Domain.OpenSession(SessionConfiguration.Default)) - using (s.Activate()) - using (var t1 = s.OpenTransaction(TransactionOpenMode.New)) { - sw.Start(); - - var ent = new Ent(); - - for (var i = 0; i < IterationsCount; i++) { - Session.Current.Query.All().Where(z => z.Id==ent.Id).ToArray(); - ent.Num = i; - if (i % 100==0) { - Console.WriteLine("{0} {1}", i, sw.Elapsed.TotalSeconds); - sw.Restart(); - } - } - sw.Stop(); - t1.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (Ent).Assembly, typeof (Ent).Namespace); - return configuration; - } - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2017.09.06 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0708_StackOverflowOnDifferetialTupleMergeModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0708_StackOverflowOnDifferetialTupleMergeModel +{ + [HierarchyRoot] + public class Ent : Entity + { + [Field, Key] + public Guid Id { get; set; } + + [Field] + public int Num { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture, Explicit("The test is really time-consuming")] + public class IssueJira0708_StackOverflowOnDifferetialTupleMerge : AutoBuildTest + { + private int IterationsCount = 100000; + + [Test] + public void MainTest() + { + var sw = new Stopwatch(); + using (var s = Domain.OpenSession(SessionConfiguration.Default)) + using (s.Activate()) + using (var t1 = s.OpenTransaction(TransactionOpenMode.New)) { + sw.Start(); + + var ent = new Ent(); + + for (var i = 0; i < IterationsCount; i++) { + Session.Current.Query.All().Where(z => z.Id==ent.Id).ToArray(); + ent.Num = i; + if (i % 100==0) { + Console.WriteLine("{0} {1}", i, sw.Elapsed.TotalSeconds); + sw.Restart(); + } + } + sw.Stop(); + t1.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (Ent).Assembly, typeof (Ent).Namespace); + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0710_IndirectStructureChildFKAbsence.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0710_IndirectStructureChildFKAbsence.cs index 55647cb510..6012ea752f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0710_IndirectStructureChildFKAbsence.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0710_IndirectStructureChildFKAbsence.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2003-2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2017.09.01 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0710_IndirectStructureChildFKAbsenceModel; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0710_IndirectStructureChildFKAbsenceModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public TestStructureChild TestStructureChild { get; set; } - } - - public class TestStructure : Structure - { - [Field] - public AnotherTestEntity AnotherTestEntity { get; set; } - } - - public class TestStructureChild : TestStructure - { - [Field] - public OneMoreTestEntity AnotherTestEntity2 { get; set; } - } - - [HierarchyRoot] - public class AnotherTestEntity : Entity - { - [Field, Key] - public long Id { get; set; } - } - - [HierarchyRoot] - public class OneMoreTestEntity : Entity - { - [Field, Key] - public long Id { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira0710_IndirectStructureChildFKAbsence : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); - } - - [Test] - public void MainTest() - { - var testableType = Domain.Model.Types[typeof (TestEntity)]; - var foreignKeys = Domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId).Mapping[testableType] - .TableConstraints.OfType() - .OrderBy(i => i.ReferencedTable.Name).ToList(); - - Assert.IsTrue(foreignKeys.Count==2); - Assert.IsTrue(foreignKeys.All(c => c.Columns.Count==1)); - - var foreignKey1Column = foreignKeys[0].Columns.Single(); - var expectedColumnName = testableType.Fields["TestStructureChild.AnotherTestEntity"].Columns.Single().Name; - Assert.IsTrue(foreignKey1Column.Name==expectedColumnName); - Assert.IsTrue(foreignKey1Column.Table.Name.Equals("TestEntity", StringComparison.InvariantCultureIgnoreCase)); - Assert.IsTrue(foreignKeys[0].ReferencedTable.Name.Equals("AnotherTestEntity", StringComparison.InvariantCultureIgnoreCase)); - - var foreignKey2Column = foreignKeys[1].Columns.Single(); - expectedColumnName = testableType.Fields["TestStructureChild.AnotherTestEntity2"].Columns.Single().Name; - Assert.IsTrue(foreignKey2Column.Name==expectedColumnName); - Assert.IsTrue(foreignKey2Column.Table.Name.Equals("TestEntity", StringComparison.InvariantCultureIgnoreCase)); - Assert.IsTrue(foreignKeys[1].ReferencedTable.Name.Equals("OneMoreTestEntity", StringComparison.InvariantCultureIgnoreCase)); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - return config; - } - } -} +// Copyright (C) 2003-2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2017.09.01 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0710_IndirectStructureChildFKAbsenceModel; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0710_IndirectStructureChildFKAbsenceModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public TestStructureChild TestStructureChild { get; set; } + } + + public class TestStructure : Structure + { + [Field] + public AnotherTestEntity AnotherTestEntity { get; set; } + } + + public class TestStructureChild : TestStructure + { + [Field] + public OneMoreTestEntity AnotherTestEntity2 { get; set; } + } + + [HierarchyRoot] + public class AnotherTestEntity : Entity + { + [Field, Key] + public long Id { get; set; } + } + + [HierarchyRoot] + public class OneMoreTestEntity : Entity + { + [Field, Key] + public long Id { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira0710_IndirectStructureChildFKAbsence : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.ForeignKeyConstraints); + } + + [Test] + public void MainTest() + { + var testableType = Domain.Model.Types[typeof (TestEntity)]; + var foreignKeys = Domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId).Mapping[testableType] + .TableConstraints.OfType() + .OrderBy(i => i.ReferencedTable.Name).ToList(); + + Assert.IsTrue(foreignKeys.Count==2); + Assert.IsTrue(foreignKeys.All(c => c.Columns.Count==1)); + + var foreignKey1Column = foreignKeys[0].Columns.Single(); + var expectedColumnName = testableType.Fields["TestStructureChild.AnotherTestEntity"].Columns.Single().Name; + Assert.IsTrue(foreignKey1Column.Name==expectedColumnName); + Assert.IsTrue(foreignKey1Column.Table.Name.Equals("TestEntity", StringComparison.InvariantCultureIgnoreCase)); + Assert.IsTrue(foreignKeys[0].ReferencedTable.Name.Equals("AnotherTestEntity", StringComparison.InvariantCultureIgnoreCase)); + + var foreignKey2Column = foreignKeys[1].Columns.Single(); + expectedColumnName = testableType.Fields["TestStructureChild.AnotherTestEntity2"].Columns.Single().Name; + Assert.IsTrue(foreignKey2Column.Name==expectedColumnName); + Assert.IsTrue(foreignKey2Column.Table.Name.Equals("TestEntity", StringComparison.InvariantCultureIgnoreCase)); + Assert.IsTrue(foreignKeys[1].ReferencedTable.Name.Equals("OneMoreTestEntity", StringComparison.InvariantCultureIgnoreCase)); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + return config; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0712_IncorrectDefaultEnumValueTranslation.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0712_IncorrectDefaultEnumValueTranslation.cs index f56d5481e2..2ca1bfc24b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0712_IncorrectDefaultEnumValueTranslation.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0712_IncorrectDefaultEnumValueTranslation.cs @@ -1,194 +1,194 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2017.09.15 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using model = Xtensive.Orm.Tests.Issues.IssueJira0712_IncorrectDefaultEnumValueTranslationModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0712_IncorrectDefaultEnumValueTranslationModel -{ - namespace ConcreteTable - { - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class TestEntity : Entity - { - [Key, Field] - public Guid Id { get; set; } - - [Field(DefaultValue = OneTwo.One)] - public OneTwo Num { get; set; } - - [Field(DefaultValue = OneTwo.Two)] - public OneTwo? NullableNum { get; set; } - } - - public class EntDerived : TestEntity - { - } - } - - namespace SingleTable - { - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class TestEntity : Entity - { - [Key, Field] - public Guid Id { get; set; } - - [Field(DefaultValue = OneTwo.One)] - public OneTwo Num { get; set; } - - [Field(DefaultValue = OneTwo.Two)] - public OneTwo? NullableNum { get; set; } - } - - public class EntDerived : TestEntity - { - } - } - - namespace ClassTable - { - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class TestEntity : Entity - { - [Key, Field] - public Guid Id { get; set; } - - [Field(DefaultValue = OneTwo.One)] - public OneTwo Num { get; set; } - - [Field(DefaultValue = OneTwo.Two)] - public OneTwo? NullableNum { get; set; } - } - - public class EntDerived : TestEntity - { - } - } - - public enum OneTwo - { - One = 1, - Two = 2, - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - [TestFixture] - public class IssueJira0712_IncorrectDefaultEnumValueTranslation - { - [Test] - public void ConcreteTableTest() - { - var configuration = BuildConfiguration(typeof (model.ConcreteTable.TestEntity)); - Domain domain = null; - Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); - Assert.That(domain, Is.Not.Null); - Key baseKey, childKey; - using (domain) { - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - baseKey = new model.ConcreteTable.TestEntity().Key; - childKey = new model.ConcreteTable.EntDerived().Key; - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var baseEntity = session.Query.Single(baseKey); - var childEntity = session.Query.Single(childKey); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - } - } - } - - [Test] - public void ClassTableTest() - { - var configuration = BuildConfiguration(typeof (model.ClassTable.TestEntity)); - Domain domain = null; - Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); - Assert.That(domain, Is.Not.Null); - Key baseKey, childKey; - using (domain) { - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - baseKey = new model.ClassTable.TestEntity().Key; - childKey = new model.ClassTable.EntDerived().Key; - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var baseEntity = session.Query.Single(baseKey); - var childEntity = session.Query.Single(childKey); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - } - } - } - - [Test] - public void SingleTableTest() - { - var configuration = BuildConfiguration(typeof (model.SingleTable.TestEntity)); - Domain domain = null; - Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); - Assert.That(domain, Is.Not.Null); - Key baseKey, childKey; - using (domain) { - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()){ - baseKey = new model.SingleTable.TestEntity().Key; - childKey = new model.SingleTable.EntDerived().Key; - transaction.Complete(); - } - - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var baseEntity = session.Query.Single(baseKey); - var childEntity = session.Query.Single(childKey); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); - } - } - } - - private DomainConfiguration BuildConfiguration(Type t) - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(t.Assembly, t.Namespace); - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2017.09.15 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using model = Xtensive.Orm.Tests.Issues.IssueJira0712_IncorrectDefaultEnumValueTranslationModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0712_IncorrectDefaultEnumValueTranslationModel +{ + namespace ConcreteTable + { + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class TestEntity : Entity + { + [Key, Field] + public Guid Id { get; set; } + + [Field(DefaultValue = OneTwo.One)] + public OneTwo Num { get; set; } + + [Field(DefaultValue = OneTwo.Two)] + public OneTwo? NullableNum { get; set; } + } + + public class EntDerived : TestEntity + { + } + } + + namespace SingleTable + { + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class TestEntity : Entity + { + [Key, Field] + public Guid Id { get; set; } + + [Field(DefaultValue = OneTwo.One)] + public OneTwo Num { get; set; } + + [Field(DefaultValue = OneTwo.Two)] + public OneTwo? NullableNum { get; set; } + } + + public class EntDerived : TestEntity + { + } + } + + namespace ClassTable + { + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class TestEntity : Entity + { + [Key, Field] + public Guid Id { get; set; } + + [Field(DefaultValue = OneTwo.One)] + public OneTwo Num { get; set; } + + [Field(DefaultValue = OneTwo.Two)] + public OneTwo? NullableNum { get; set; } + } + + public class EntDerived : TestEntity + { + } + } + + public enum OneTwo + { + One = 1, + Two = 2, + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + [TestFixture] + public class IssueJira0712_IncorrectDefaultEnumValueTranslation + { + [Test] + public void ConcreteTableTest() + { + var configuration = BuildConfiguration(typeof (model.ConcreteTable.TestEntity)); + Domain domain = null; + Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); + Assert.That(domain, Is.Not.Null); + Key baseKey, childKey; + using (domain) { + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + baseKey = new model.ConcreteTable.TestEntity().Key; + childKey = new model.ConcreteTable.EntDerived().Key; + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var baseEntity = session.Query.Single(baseKey); + var childEntity = session.Query.Single(childKey); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + } + } + } + + [Test] + public void ClassTableTest() + { + var configuration = BuildConfiguration(typeof (model.ClassTable.TestEntity)); + Domain domain = null; + Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); + Assert.That(domain, Is.Not.Null); + Key baseKey, childKey; + using (domain) { + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + baseKey = new model.ClassTable.TestEntity().Key; + childKey = new model.ClassTable.EntDerived().Key; + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var baseEntity = session.Query.Single(baseKey); + var childEntity = session.Query.Single(childKey); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + } + } + } + + [Test] + public void SingleTableTest() + { + var configuration = BuildConfiguration(typeof (model.SingleTable.TestEntity)); + Domain domain = null; + Assert.DoesNotThrow(() => domain = Domain.Build(configuration)); + Assert.That(domain, Is.Not.Null); + Key baseKey, childKey; + using (domain) { + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()){ + baseKey = new model.SingleTable.TestEntity().Key; + childKey = new model.SingleTable.EntDerived().Key; + transaction.Complete(); + } + + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var baseEntity = session.Query.Single(baseKey); + var childEntity = session.Query.Single(childKey); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(baseEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.Num, Is.EqualTo(model.OneTwo.One)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + Assert.That(childEntity.NullableNum, Is.EqualTo(model.OneTwo.Two)); + } + } + } + + private DomainConfiguration BuildConfiguration(Type t) + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(t.Assembly, t.Namespace); + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0718_EntitySetEnumerationBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0718_EntitySetEnumerationBug.cs index cf18c4c964..560718cd93 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0718_EntitySetEnumerationBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0718_EntitySetEnumerationBug.cs @@ -1,1163 +1,1163 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2017.12.22 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0718_EntitySetEnumerationBugModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0718_EntitySetEnumerationBugModel -{ - public abstract class BaseEntity : Entity - { - [Key, Field] - public long ID { get; set; } - } - - [HierarchyRoot] - public class CustomerOrder : BaseEntity - { - [Field] - public string Name { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "CustomerOrder")] - public EntitySet Items { get; set; } - } - - [HierarchyRoot] - public class CustomerOrderItem : BaseEntity - { - [Field] - public string Product { get; set; } - - [Field] - public CustomerOrder CustomerOrder { get; private set; } - - public CustomerOrderItem(CustomerOrder order) - { - CustomerOrder = order; - } - } - - [HierarchyRoot] - public class SomeOtherEntity : BaseEntity - { - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "SomeOtherEntity")] - public EntitySet Items { get; set; } - } - - [HierarchyRoot] - public class SomeOtherEntitySet : BaseEntity - { - [Field] - public string Name { get; set; } - - [Field] - public SomeOtherEntity SomeOtherEntity { get; private set; } - - - public SomeOtherEntitySet(SomeOtherEntity entity) - { - SomeOtherEntity = entity; - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0718_EntitySetEnumeration : AutoBuildTest - { - private const int DefaultCustomerOrderItemsCount = 5; - - private readonly SessionConfiguration clientProfile = new SessionConfiguration(SessionOptions.ClientProfile); - private readonly SessionConfiguration serverProfile = new SessionConfiguration(SessionOptions.ServerProfile); - - [SetUp] - public void SetUp() - { - ClearTables(); - } - - [Test(Description = "Persist on enumeration")] - public void ServerProfileTest01() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrder.Items) - session.SaveChanges(); - }); - } - } - - [Test(Description = "Add item to entity set after enumeration")] - public void ServerProfileTest02() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItems.Add(new CustomerOrderItem(customerOrder)); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); - } - } - - [Test(Description = "Add item to entity set after")] - public void ServerProfileTest03() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - new CustomerOrderItem(customerOrder); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); - } - } - - [Test(Description = "Implicit remove entity after enumeration")] - public void ServerProfileTest04() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - var customerOrderItem = customerOrderItems.First(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItems.Remove(customerOrderItem); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); - } - } - - [Test(Description = "Explicit remove entity after enumeration")] - public void ServerProfileTest05() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - var customerOrderItem = customerOrderItems.First(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItem.Remove(); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); - } - } - - [Test(Description = "Explicit remove enitity from entity set")] - public void ServerProfileTest06() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - new SomeOtherEntity(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().Count(), DefaultCustomerOrderItemsCount); - } - } - - [Test(Description = "Add entity in another entity set")] - public void ServerProfileTest07() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - new SomeOtherEntitySet(someOtherEntity); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().Single().Items.Count(), DefaultCustomerOrderItemsCount); - } - } - - [Test(Description = "Remove entities from enother entity set")] - public void ServerProfileTest08() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - session.SaveChanges(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - var fetchedSomeOtherEntity = session.Query.All().SingleOrDefault(); - if (fetchedSomeOtherEntity!=null && !fetchedSomeOtherEntity.IsRemoved) - fetchedSomeOtherEntity.Remove(); - } - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.IsFalse(session.Query.All().Any()); - } - } - - [Test(Description = "Remove another entity entity set items")] - public void ServerProfileTest09() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - var someOtherEntitySet = new SomeOtherEntitySet(someOtherEntity); - session.SaveChanges(); - - Assert.DoesNotThrow( - () => { - var someOtherEntitySetItems = session.Query.All().Single().Items; - foreach (var orderItem in customerOrderItems) - session.Remove(someOtherEntitySetItems); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.IsFalse(session.Query.All().Single().Items.Any()); - } - } - - [Test(Description = "Enumeration inside enumeration")] - public void ServerProfileTest10() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var item in customerOrderItems) - foreach (var item2 in customerOrderItems) - session.SaveChanges(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - } - } - - [Test(Description = "Explicit add and persist during entity set enumeration")] - public void ServerProfileTest11() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.Throws( - () => { - foreach (var item in customerOrderItems) - foreach (var item2 in customerOrderItems) - new CustomerOrderItem(customerOrder); - - session.SaveChanges(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - } - - [Test(Description = "Explicit add item to entity set")] - public void ServerProfileTest12() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) - new CustomerOrderItem(customerOrder); - }); - } - } - - [Test(Description = "Explicit persist and add item to entity set")] - public void ServerProfileTest13() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - new CustomerOrderItem(customerOrder); - } - }); - } - } - - [Test(Description = "Implicitly remove entity from entityset during enumeration")] - public void ServerProfileTest14() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) - orderItem.Remove(); - }); - } - } - - [Test(Description = "Explicit persist and implicit remove from entity set")] - public void ServerProfileTest15() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - orderItem.Remove(); - } - }); - } - } - - [Test(Description = "Explicit persist and change of entity in entity set")] - public void ServerProfileTest16() - { - var expectedProductName = "GTX 1080 ti"; - - using (var session = Domain.OpenSession(serverProfile)) { - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - orderItem.Product = expectedProductName; - session.SaveChanges(); - } - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var customerOrder = session.Query.All().Single(); - Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); - } - } - } - } - - [Test(Description = "Explicit persist and change of entity in entity set")] - public void ServerProfileTest17() - { - var expectedProductName = "GTX 1080 ti"; - - ClearTables(); - using (var session = Domain.OpenSession(serverProfile)) { - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - orderItem.Product = expectedProductName; - } - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var customerOrder = session.Query.All().Single(); - Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); - } - } - } - } - - [Test(Description = "Emplicit persist and remove entity")] - public void ServerProfileTest18() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItem = new CustomerOrderItem(customerOrder); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) { - session.SaveChanges(); - customerOrder.Remove(); - } - }); - } - } - - [Test(Description = "Implicitly remove entity from entity set")] - public void ServerProfileTest19() - { - using (var session = Domain.OpenSession(serverProfile)) { - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) - customerOrder.Remove(); - }); - transaction.Complete(); - } - } - } - } - - [Test(Description = "Explicitly remove entity during enumeration")] - public void ServerProfileTest20() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - var customerOrderItem = new CustomerOrderItem(customerOrder); - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) - customerOrder.Items.Remove(customerOrderItem); - }); - } - } - - [Test(Description = "Explicitly add items during enum")] - public void ServerProfileTest21() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - var customerOrderItem = new CustomerOrderItem(customerOrder); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) { - customerOrder.Items.Add(new CustomerOrderItem(customerOrder)); - } - }); - } - } - - [Test(Description = "Clears items during transaction")] - public void ServerProfileTest22() - { - using (var session = Domain.OpenSession(serverProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - new CustomerOrderItem(customerOrder); - new CustomerOrderItem(customerOrder); - - PersistIfClientProfile(session); - Assert.Throws( - () => { - foreach (var order in customerOrder.Items) { - customerOrder.Items.Clear(); - } - }); - } - } - - [Test(Description = "Persist on enumeration")] - public void ClientProfileTest01() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrder.Items) - session.SaveChanges(); - }); - } - } - - [Test(Description = "Add item to entity set after enumeration")] - public void ClientProfileTest02() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItems.Add(new CustomerOrderItem(customerOrder)); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); - } - } - - [Test(Description = "Add item to entity set after")] - public void ClientProfileTest03() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - new CustomerOrderItem(customerOrder); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); - } - } - - [Test(Description = "Implicit remove entity after enumeration")] - public void ClientProfileTest04() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - var customerOrderItem = customerOrderItems.First(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItems.Remove(customerOrderItem); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); - } - } - - [Test(Description = "")] - public void ClientProfileTest05() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - var customerOrderItem = customerOrderItems.First(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - session.SaveChanges(); - - customerOrderItem.Remove(); - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); - } - } - - [Test(Description = "Explicit remove enitity from entity set")] - public void ClientProfileTest06() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - new SomeOtherEntity(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().Count(), DefaultCustomerOrderItemsCount); - } - } - - [Test(Description = "Add entity in another entity set")] - public void ClientProfileTest07() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) - new SomeOtherEntitySet(someOtherEntity); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.AreEqual(session.Query.All().Single().Items.Count(), DefaultCustomerOrderItemsCount); - } - } - - [Test(Description = "Remove entities from enother entity set")] - public void ClientProfileTest08() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - session.SaveChanges(); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - var fetchedSomeOtherEntity = session.Query.All().SingleOrDefault(); - if (fetchedSomeOtherEntity!=null && !fetchedSomeOtherEntity.IsRemoved) - fetchedSomeOtherEntity.Remove(); - } - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.IsFalse(session.Query.All().Any()); - } - } - - [Test(Description = "Remove another entity entity set items")] - public void ClientProfileTest09() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - var someOtherEntity = new SomeOtherEntity(); - var someOtherEntitySet = new SomeOtherEntitySet(someOtherEntity); - session.SaveChanges(); - - Assert.DoesNotThrow( - () => { - var someOtherEntitySetItems = session.Query.All().Single().Items; - foreach (var orderItem in customerOrderItems) - session.Remove(someOtherEntitySetItems); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) - Assert.IsFalse(session.Query.All().Single().Items.Any()); - } - } - - [Test(Description = "Enumeration inside enumeration")] - public void ClientProfileTest10() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.DoesNotThrow( - () => { - foreach (var item in customerOrderItems) - foreach (var item2 in customerOrderItems) - session.SaveChanges(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - } - } - - [Test(Description = "Explicit add and persist during entity set enumeration")] - public void ClientProfileTest11() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - - Assert.Throws( - () => { - foreach (var item in customerOrderItems) - foreach (var item2 in customerOrderItems) - new CustomerOrderItem(customerOrder); - session.SaveChanges(); - - PersistIfClientProfile(session); - }); - transaction.Complete(); - } - } - } - - [Test(Description = "Explicit add item to entity set")] - public void ClientProfileTest12() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) - new CustomerOrderItem(customerOrder); - }); - } - } - - [Test(Description = "Explicit persist and add item to entity set")] - public void ClientProfileTest13() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - new CustomerOrderItem(customerOrder); - } - }); - } - } - - [Test(Description = "Implicitly remove entity from entityset during enumeration")] - public void ClientProfileTest14() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) - orderItem.Remove(); - }); - } - } - } - - [Test(Description = "Explicit persist and implicit remove from entity set")] - public void ClientProfileTest15() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - orderItem.Remove(); - } - }); - } - } - - [Test(Description = "Explicit persist and change of entity in entity set")] - public void ClientProfileTest16() - { - var expectedProductName = "GTX 1080 ti"; - - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - orderItem.Product = expectedProductName; - session.SaveChanges(); - } - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var customerOrder = session.Query.All().Single(); - Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); - } - } - } - - [Test(Description = "Explicit persist and change of entity in entity set")] - public void ClientProfileTest17() - { - var expectedProductName = "GTX 1080 ti"; - - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) { - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - var customerOrderItems = customerOrder.Items; - PersistIfClientProfile(session); - - Assert.DoesNotThrow( - () => { - foreach (var orderItem in customerOrderItems) { - session.SaveChanges(); - orderItem.Product = expectedProductName; - } - }); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var customerOrder = session.Query.All().Single(); - Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); - } - } - } - - [Test(Description = "Emplicit persist and remove entity")] - public void ClientProfileTest18() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = CreateCustomerOrderWithItems(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) { - session.SaveChanges(); - customerOrder.Remove(); - } - }); - } - } - - [Test(Description = "Implicitly remove entity from entity set")] - public void ClientProfileTest19() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - var customerOrderItem = new CustomerOrderItem(customerOrder); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) - customerOrder.Remove(); - }); - transaction.Complete(); - } - } - - [Test(Description = "Explicitly remove entity during enumeration")] - public void ClientProfileTest20() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var items = new List(); - var customerOrder = CreateCustomerOrderWithItems(session, ref items); - var itemToRemove = items[0]; - - PersistIfClientProfile(session); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) - customerOrder.Items.Remove(itemToRemove); - }); - } - } - - [Test(Description = "Explicitly add items during enum")] - public void ClientProfileTest21() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - var customerOrderItem = new CustomerOrderItem(customerOrder); - - Assert.Throws( - () => { - foreach (var orderItem in customerOrder.Items) { - customerOrder.Items.Add(new CustomerOrderItem(customerOrder)); - } - }); - } - } - - [Test(Description = "Clears items during transaction")] - public void ClientProfileTest22() - { - using (var session = Domain.OpenSession(clientProfile)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var customerOrder = new CustomerOrder(); - new CustomerOrderItem(customerOrder); - new CustomerOrderItem(customerOrder); - - PersistIfClientProfile(session); - Assert.Throws( - () => { - foreach (var order in customerOrder.Items) { - customerOrder.Items.Clear(); - } - }); - } - } - - [Test] - public void FullyLoadedEntitySetEnumerationTest() - { - using (var s = Domain.OpenSession()) - using (var tx = s.OpenTransaction()) { - var order = new CustomerOrder(); - var orderItem1 = new CustomerOrderItem(order); - - Assert.That(orderItem1.PersistenceState, Is.EqualTo(PersistenceState.New)); - s.SaveChanges(); - - Assert.That(orderItem1.PersistenceState, Is.EqualTo(PersistenceState.Synchronized)); - order.Items.Run(); - - var orderItem2 = new CustomerOrderItem(order); - Assert.That(orderItem2.PersistenceState, Is.EqualTo(PersistenceState.New)); - - Assert.DoesNotThrow( - () => { - foreach (var item in order.Items) - s.SaveChanges(); - }); - } - } - - - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(CustomerOrderItem).Assembly, typeof(CustomerOrderItem).Namespace); - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - - private void ClearTables() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var customerOrders = session.Query.All().ToArray(); - var someOtherEntities = session.Query.All().ToArray(); - - if (customerOrders.Any()) - session.Remove(customerOrders); - if (someOtherEntities.Any()) - session.Remove(someOtherEntities); - transaction.Complete(); - } - } - - private CustomerOrder CreateCustomerOrderWithItems(Session session) - { - List list = new List(); - return CreateCustomerOrderWithItems(session, ref list); - } - - private CustomerOrder CreateCustomerOrderWithItems(Session session, ref List items) - { - var customerOrder = new CustomerOrder(); - for (var i = 0; i < DefaultCustomerOrderItemsCount; i++) - items.Add(new CustomerOrderItem(customerOrder)); - - PersistIfClientProfile(session); - return customerOrder; - } - - private void PersistIfClientProfile(Session sesssion) - { - if (Session.Current.Configuration.Options.HasFlag(SessionOptions.ClientProfile)) - sesssion.SaveChanges(); - } - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2017.12.22 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0718_EntitySetEnumerationBugModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0718_EntitySetEnumerationBugModel +{ + public abstract class BaseEntity : Entity + { + [Key, Field] + public long ID { get; set; } + } + + [HierarchyRoot] + public class CustomerOrder : BaseEntity + { + [Field] + public string Name { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "CustomerOrder")] + public EntitySet Items { get; set; } + } + + [HierarchyRoot] + public class CustomerOrderItem : BaseEntity + { + [Field] + public string Product { get; set; } + + [Field] + public CustomerOrder CustomerOrder { get; private set; } + + public CustomerOrderItem(CustomerOrder order) + { + CustomerOrder = order; + } + } + + [HierarchyRoot] + public class SomeOtherEntity : BaseEntity + { + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear, PairTo = "SomeOtherEntity")] + public EntitySet Items { get; set; } + } + + [HierarchyRoot] + public class SomeOtherEntitySet : BaseEntity + { + [Field] + public string Name { get; set; } + + [Field] + public SomeOtherEntity SomeOtherEntity { get; private set; } + + + public SomeOtherEntitySet(SomeOtherEntity entity) + { + SomeOtherEntity = entity; + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0718_EntitySetEnumeration : AutoBuildTest + { + private const int DefaultCustomerOrderItemsCount = 5; + + private readonly SessionConfiguration clientProfile = new SessionConfiguration(SessionOptions.ClientProfile); + private readonly SessionConfiguration serverProfile = new SessionConfiguration(SessionOptions.ServerProfile); + + [SetUp] + public void SetUp() + { + ClearTables(); + } + + [Test(Description = "Persist on enumeration")] + public void ServerProfileTest01() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrder.Items) + session.SaveChanges(); + }); + } + } + + [Test(Description = "Add item to entity set after enumeration")] + public void ServerProfileTest02() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItems.Add(new CustomerOrderItem(customerOrder)); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); + } + } + + [Test(Description = "Add item to entity set after")] + public void ServerProfileTest03() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + new CustomerOrderItem(customerOrder); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); + } + } + + [Test(Description = "Implicit remove entity after enumeration")] + public void ServerProfileTest04() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + var customerOrderItem = customerOrderItems.First(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItems.Remove(customerOrderItem); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); + } + } + + [Test(Description = "Explicit remove entity after enumeration")] + public void ServerProfileTest05() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + var customerOrderItem = customerOrderItems.First(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItem.Remove(); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); + } + } + + [Test(Description = "Explicit remove enitity from entity set")] + public void ServerProfileTest06() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + new SomeOtherEntity(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().Count(), DefaultCustomerOrderItemsCount); + } + } + + [Test(Description = "Add entity in another entity set")] + public void ServerProfileTest07() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + new SomeOtherEntitySet(someOtherEntity); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().Single().Items.Count(), DefaultCustomerOrderItemsCount); + } + } + + [Test(Description = "Remove entities from enother entity set")] + public void ServerProfileTest08() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + session.SaveChanges(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + var fetchedSomeOtherEntity = session.Query.All().SingleOrDefault(); + if (fetchedSomeOtherEntity!=null && !fetchedSomeOtherEntity.IsRemoved) + fetchedSomeOtherEntity.Remove(); + } + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.IsFalse(session.Query.All().Any()); + } + } + + [Test(Description = "Remove another entity entity set items")] + public void ServerProfileTest09() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + var someOtherEntitySet = new SomeOtherEntitySet(someOtherEntity); + session.SaveChanges(); + + Assert.DoesNotThrow( + () => { + var someOtherEntitySetItems = session.Query.All().Single().Items; + foreach (var orderItem in customerOrderItems) + session.Remove(someOtherEntitySetItems); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.IsFalse(session.Query.All().Single().Items.Any()); + } + } + + [Test(Description = "Enumeration inside enumeration")] + public void ServerProfileTest10() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var item in customerOrderItems) + foreach (var item2 in customerOrderItems) + session.SaveChanges(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + } + } + + [Test(Description = "Explicit add and persist during entity set enumeration")] + public void ServerProfileTest11() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.Throws( + () => { + foreach (var item in customerOrderItems) + foreach (var item2 in customerOrderItems) + new CustomerOrderItem(customerOrder); + + session.SaveChanges(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + } + + [Test(Description = "Explicit add item to entity set")] + public void ServerProfileTest12() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) + new CustomerOrderItem(customerOrder); + }); + } + } + + [Test(Description = "Explicit persist and add item to entity set")] + public void ServerProfileTest13() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + new CustomerOrderItem(customerOrder); + } + }); + } + } + + [Test(Description = "Implicitly remove entity from entityset during enumeration")] + public void ServerProfileTest14() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) + orderItem.Remove(); + }); + } + } + + [Test(Description = "Explicit persist and implicit remove from entity set")] + public void ServerProfileTest15() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + orderItem.Remove(); + } + }); + } + } + + [Test(Description = "Explicit persist and change of entity in entity set")] + public void ServerProfileTest16() + { + var expectedProductName = "GTX 1080 ti"; + + using (var session = Domain.OpenSession(serverProfile)) { + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + orderItem.Product = expectedProductName; + session.SaveChanges(); + } + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var customerOrder = session.Query.All().Single(); + Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); + } + } + } + } + + [Test(Description = "Explicit persist and change of entity in entity set")] + public void ServerProfileTest17() + { + var expectedProductName = "GTX 1080 ti"; + + ClearTables(); + using (var session = Domain.OpenSession(serverProfile)) { + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + orderItem.Product = expectedProductName; + } + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var customerOrder = session.Query.All().Single(); + Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); + } + } + } + } + + [Test(Description = "Emplicit persist and remove entity")] + public void ServerProfileTest18() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItem = new CustomerOrderItem(customerOrder); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) { + session.SaveChanges(); + customerOrder.Remove(); + } + }); + } + } + + [Test(Description = "Implicitly remove entity from entity set")] + public void ServerProfileTest19() + { + using (var session = Domain.OpenSession(serverProfile)) { + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) + customerOrder.Remove(); + }); + transaction.Complete(); + } + } + } + } + + [Test(Description = "Explicitly remove entity during enumeration")] + public void ServerProfileTest20() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + var customerOrderItem = new CustomerOrderItem(customerOrder); + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) + customerOrder.Items.Remove(customerOrderItem); + }); + } + } + + [Test(Description = "Explicitly add items during enum")] + public void ServerProfileTest21() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + var customerOrderItem = new CustomerOrderItem(customerOrder); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) { + customerOrder.Items.Add(new CustomerOrderItem(customerOrder)); + } + }); + } + } + + [Test(Description = "Clears items during transaction")] + public void ServerProfileTest22() + { + using (var session = Domain.OpenSession(serverProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + new CustomerOrderItem(customerOrder); + new CustomerOrderItem(customerOrder); + + PersistIfClientProfile(session); + Assert.Throws( + () => { + foreach (var order in customerOrder.Items) { + customerOrder.Items.Clear(); + } + }); + } + } + + [Test(Description = "Persist on enumeration")] + public void ClientProfileTest01() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrder.Items) + session.SaveChanges(); + }); + } + } + + [Test(Description = "Add item to entity set after enumeration")] + public void ClientProfileTest02() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItems.Add(new CustomerOrderItem(customerOrder)); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); + } + } + + [Test(Description = "Add item to entity set after")] + public void ClientProfileTest03() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + new CustomerOrderItem(customerOrder); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount + 1); + } + } + + [Test(Description = "Implicit remove entity after enumeration")] + public void ClientProfileTest04() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + var customerOrderItem = customerOrderItems.First(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItems.Remove(customerOrderItem); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); + } + } + + [Test(Description = "")] + public void ClientProfileTest05() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + var customerOrderItem = customerOrderItems.First(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + session.SaveChanges(); + + customerOrderItem.Remove(); + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().First().Items.Count, DefaultCustomerOrderItemsCount - 1); + } + } + + [Test(Description = "Explicit remove enitity from entity set")] + public void ClientProfileTest06() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + new SomeOtherEntity(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().Count(), DefaultCustomerOrderItemsCount); + } + } + + [Test(Description = "Add entity in another entity set")] + public void ClientProfileTest07() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) + new SomeOtherEntitySet(someOtherEntity); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.AreEqual(session.Query.All().Single().Items.Count(), DefaultCustomerOrderItemsCount); + } + } + + [Test(Description = "Remove entities from enother entity set")] + public void ClientProfileTest08() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + session.SaveChanges(); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + var fetchedSomeOtherEntity = session.Query.All().SingleOrDefault(); + if (fetchedSomeOtherEntity!=null && !fetchedSomeOtherEntity.IsRemoved) + fetchedSomeOtherEntity.Remove(); + } + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.IsFalse(session.Query.All().Any()); + } + } + + [Test(Description = "Remove another entity entity set items")] + public void ClientProfileTest09() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + var someOtherEntity = new SomeOtherEntity(); + var someOtherEntitySet = new SomeOtherEntitySet(someOtherEntity); + session.SaveChanges(); + + Assert.DoesNotThrow( + () => { + var someOtherEntitySetItems = session.Query.All().Single().Items; + foreach (var orderItem in customerOrderItems) + session.Remove(someOtherEntitySetItems); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) + Assert.IsFalse(session.Query.All().Single().Items.Any()); + } + } + + [Test(Description = "Enumeration inside enumeration")] + public void ClientProfileTest10() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.DoesNotThrow( + () => { + foreach (var item in customerOrderItems) + foreach (var item2 in customerOrderItems) + session.SaveChanges(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + } + } + + [Test(Description = "Explicit add and persist during entity set enumeration")] + public void ClientProfileTest11() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + + Assert.Throws( + () => { + foreach (var item in customerOrderItems) + foreach (var item2 in customerOrderItems) + new CustomerOrderItem(customerOrder); + session.SaveChanges(); + + PersistIfClientProfile(session); + }); + transaction.Complete(); + } + } + } + + [Test(Description = "Explicit add item to entity set")] + public void ClientProfileTest12() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) + new CustomerOrderItem(customerOrder); + }); + } + } + + [Test(Description = "Explicit persist and add item to entity set")] + public void ClientProfileTest13() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + new CustomerOrderItem(customerOrder); + } + }); + } + } + + [Test(Description = "Implicitly remove entity from entityset during enumeration")] + public void ClientProfileTest14() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) + orderItem.Remove(); + }); + } + } + } + + [Test(Description = "Explicit persist and implicit remove from entity set")] + public void ClientProfileTest15() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + orderItem.Remove(); + } + }); + } + } + + [Test(Description = "Explicit persist and change of entity in entity set")] + public void ClientProfileTest16() + { + var expectedProductName = "GTX 1080 ti"; + + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + orderItem.Product = expectedProductName; + session.SaveChanges(); + } + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var customerOrder = session.Query.All().Single(); + Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); + } + } + } + + [Test(Description = "Explicit persist and change of entity in entity set")] + public void ClientProfileTest17() + { + var expectedProductName = "GTX 1080 ti"; + + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) { + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + var customerOrderItems = customerOrder.Items; + PersistIfClientProfile(session); + + Assert.DoesNotThrow( + () => { + foreach (var orderItem in customerOrderItems) { + session.SaveChanges(); + orderItem.Product = expectedProductName; + } + }); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var customerOrder = session.Query.All().Single(); + Assert.IsTrue(customerOrder.Items.All(i => i.Product==expectedProductName)); + } + } + } + + [Test(Description = "Emplicit persist and remove entity")] + public void ClientProfileTest18() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = CreateCustomerOrderWithItems(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) { + session.SaveChanges(); + customerOrder.Remove(); + } + }); + } + } + + [Test(Description = "Implicitly remove entity from entity set")] + public void ClientProfileTest19() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + var customerOrderItem = new CustomerOrderItem(customerOrder); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) + customerOrder.Remove(); + }); + transaction.Complete(); + } + } + + [Test(Description = "Explicitly remove entity during enumeration")] + public void ClientProfileTest20() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var items = new List(); + var customerOrder = CreateCustomerOrderWithItems(session, ref items); + var itemToRemove = items[0]; + + PersistIfClientProfile(session); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) + customerOrder.Items.Remove(itemToRemove); + }); + } + } + + [Test(Description = "Explicitly add items during enum")] + public void ClientProfileTest21() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + var customerOrderItem = new CustomerOrderItem(customerOrder); + + Assert.Throws( + () => { + foreach (var orderItem in customerOrder.Items) { + customerOrder.Items.Add(new CustomerOrderItem(customerOrder)); + } + }); + } + } + + [Test(Description = "Clears items during transaction")] + public void ClientProfileTest22() + { + using (var session = Domain.OpenSession(clientProfile)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var customerOrder = new CustomerOrder(); + new CustomerOrderItem(customerOrder); + new CustomerOrderItem(customerOrder); + + PersistIfClientProfile(session); + Assert.Throws( + () => { + foreach (var order in customerOrder.Items) { + customerOrder.Items.Clear(); + } + }); + } + } + + [Test] + public void FullyLoadedEntitySetEnumerationTest() + { + using (var s = Domain.OpenSession()) + using (var tx = s.OpenTransaction()) { + var order = new CustomerOrder(); + var orderItem1 = new CustomerOrderItem(order); + + Assert.That(orderItem1.PersistenceState, Is.EqualTo(PersistenceState.New)); + s.SaveChanges(); + + Assert.That(orderItem1.PersistenceState, Is.EqualTo(PersistenceState.Synchronized)); + order.Items.Run(); + + var orderItem2 = new CustomerOrderItem(order); + Assert.That(orderItem2.PersistenceState, Is.EqualTo(PersistenceState.New)); + + Assert.DoesNotThrow( + () => { + foreach (var item in order.Items) + s.SaveChanges(); + }); + } + } + + + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(CustomerOrderItem).Assembly, typeof(CustomerOrderItem).Namespace); + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + + private void ClearTables() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var customerOrders = session.Query.All().ToArray(); + var someOtherEntities = session.Query.All().ToArray(); + + if (customerOrders.Any()) + session.Remove(customerOrders); + if (someOtherEntities.Any()) + session.Remove(someOtherEntities); + transaction.Complete(); + } + } + + private CustomerOrder CreateCustomerOrderWithItems(Session session) + { + List list = new List(); + return CreateCustomerOrderWithItems(session, ref list); + } + + private CustomerOrder CreateCustomerOrderWithItems(Session session, ref List items) + { + var customerOrder = new CustomerOrder(); + for (var i = 0; i < DefaultCustomerOrderItemsCount; i++) + items.Add(new CustomerOrderItem(customerOrder)); + + PersistIfClientProfile(session); + return customerOrder; + } + + private void PersistIfClientProfile(Session sesssion) + { + if (Session.Current.Configuration.Options.HasFlag(SessionOptions.ClientProfile)) + sesssion.SaveChanges(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0723_ContainsOverLocalCollectionError.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0723_ContainsOverLocalCollectionError.cs index b11ba3c7e2..f853453bd7 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0723_ContainsOverLocalCollectionError.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0723_ContainsOverLocalCollectionError.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2018.01.31 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadlyModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadlyModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Key] - [Field(Nullable = false)] - public int Id { get; private set; } - - public TestEntity(Session session) - : base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadly : AutoBuildTest - { - private static int ItemId = 1; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(TestEntity)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var trasaction = session.OpenTransaction()) { - var ids = new[] {1, 2}; - Assert.DoesNotThrow(()=>session.Query.All().Count(e => ItemId.In(ids))); - Assert.DoesNotThrow(()=>session.Query.All().Count(e => ids.Contains(ItemId))); - } - } - } -} +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2018.01.31 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadlyModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadlyModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Key] + [Field(Nullable = false)] + public int Id { get; private set; } + + public TestEntity(Session session) + : base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0723_IncludeFilterMappingGathererHandlesMemberExpressionBadly : AutoBuildTest + { + private static int ItemId = 1; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestEntity)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var trasaction = session.OpenTransaction()) { + var ids = new[] {1, 2}; + Assert.DoesNotThrow(()=>session.Query.All().Count(e => ItemId.In(ids))); + Assert.DoesNotThrow(()=>session.Query.All().Count(e => ids.Contains(ItemId))); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0728_NullGroupHasNoElementsTest.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0728_NullGroupHasNoElementsTest.cs index 4e359070fb..f287878c34 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0728_NullGroupHasNoElementsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0728_NullGroupHasNoElementsTest.cs @@ -1,636 +1,636 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.05.08 - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.GroupByNullableFieldTestModel; - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0728_NullGroupHasNoElementsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Battery)); - configuration.Types.Register(typeof(Product)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List batt = new List() { - null, - new Battery() {Amps = 5, Cell = 10, Volts = 10.4}, - new Battery() {Amps = 8, Cell = 12, Volts = 12.4}, - new Battery() {Amps = 2, Cell = 5, Volts = 3.7} - }; - - for (int i = 0; i < 10; i++) { - new Product { - Name = "Name:" + i % 3, - CreationDate = DateTime.UtcNow.AddDays(-(i % 3)), - Description = i % 3!=0 ? "Lap:" + i % 3 : null, - Comment = i % 3!=0 ? "Comment:" + i % 3 : null, - Price = new Money() {CurrencyCode = 100 + i % 3, Value = (decimal) 12.3}, - Battery = batt[i % 3] - }; - } - transaction.Complete(); - } - } - - [Test] - public void GroupByPersistentField() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => g.Battery) - .AsEnumerable() - .Select(g => new {Key = g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => g.Battery) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByStructureFieldTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => g.Price) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => g.Price) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByStructureFieldTest2() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => g.Price2) - .AsEnumerable() - .Select(g => new { g.Key, Cnt = g.Count() }) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => g.Price2) - .Select(g => new { g.Key, Cnt = g.Count() }); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key == e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByStructureFieldTest3() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => g.Price2.CurrencyCode) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => g.Price2.CurrencyCode) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByStructureFieldTest4() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {A = g.Price2.Value, B = g.Price2.Value}) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {A = g.Price2.Value, B = g.Price2.Value}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.A==e.Key.A && i.Key.B==e.Key.B); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GrouoByNonNullableFieldTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(p => p.Name) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(p => p.Name) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByNullableFieldTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(p => p.Description) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(p => p.Description) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithNullableFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(p => new {p.Description, p.Comment}) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(p => new {p.Description, p.Comment}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Description==e.Key.Description && i.Key.Comment==e.Key.Comment); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithNonNullableFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(p => new {p.Name, p.CreationDate}) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(p => new {p.Name, p.CreationDate}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Name==e.Key.Name && i.Key.CreationDate==e.Key.CreationDate); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithMixedFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(p => new { p.Name, p.Description }) - .AsEnumerable() - .Select(g => new { g.Key, Cnt = g.Count() }) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(p => new { p.Name, p.Description }) - .Select(g => new { g.Key, Cnt = g.Count() }); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Name==e.Key.Name && i.Key.Description==e.Key.Description); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByIdTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => g.Battery.Id) - .AsEnumerable() - .Select(g => new {g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => g.Battery.Id) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithPersistentFieldTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {Battery = g.Battery}) - .AsEnumerable() - .Select( - g => new { - g.Key, - Cnt = g.Count() - }) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {Battery = g.Battery}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithPersistentAndNullableFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {Battery = g.Battery, Description = g.Description}) - .AsEnumerable() - .Select( - g => new { - g.Key, - Cnt = g.Count() - }) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {Battery = g.Battery, Description = g.Description}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery && i.Key.Description==e.Key.Description); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithPersistentAndNonNullableFielsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {Battery = g.Battery, Description = g.Name}) - .AsEnumerable() - .Select( - g => new { - g.Key, - Cnt = g.Count() - }) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {Battery = g.Battery, Description = g.Name}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery && i.Key.Description==e.Key.Description); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithStructureFieldTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {g.Price}) - .AsEnumerable() - .Select(g => new {Key = g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {g.Price}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithStructureAndNullableFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {g.Price, g.Description}) - .AsEnumerable() - .Select(g => new {Key = g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {g.Price, g.Description}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price && i.Key.Description==e.Key.Description); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - - [Test] - public void GroupByAnonymousTypeWithStructureAndNonNullableFieldsTest() - { - using (var session = Domain.OpenSession()) - using (var logger = new QueryLogger(session)) - using (var transaction = session.OpenTransaction()) { - var expectedCounts = Query.All() - .GroupBy(g => new {g.Price, g.Name}) - .AsEnumerable() - .Select(g => new {Key = g.Key, Cnt = g.Count()}) - .ToList(); - - using (logger.Attach()) { - var x = Query.All() - .GroupBy(g => new {g.Price, g.Name}) - .Select(g => new {g.Key, Cnt = g.Count()}); - - foreach (var e in x) { - var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price && i.Key.Name==e.Key.Name); - Assert.That(entry, Is.Not.Null); - Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); - } - } - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues.GroupByNullableFieldTestModel -{ - [HierarchyRoot] - public class Battery : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public double Volts { get; set; } - [Field] - public int Amps { get; set; } - [Field] - public int Cell { get; set; } - } - - [HierarchyRoot] - public class Product : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public string Comment { get; set; } - - [Field] - public Battery Battery { get; set; } - - [Field] - public Money Price { get; set; } - - [Field] - public Money2 Price2 { get; set; } - } - - public class Money : Structure - { - [Field] - public decimal Value { get; set; } - - [Field] - public int CurrencyCode { get; set; } - } - - public class Money2 : Structure - { - [Field] - public decimal Value { get; set; } - - [Field] - public Currency CurrencyCode { get; set; } - } - - [HierarchyRoot] - public class Currency : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - } - - public class QueryLogger : IDisposable - { - private Session session; - private bool isAttached; - - public IDisposable Attach() - { - if (isAttached) - new Disposable((a) => Detach()); - session.Events.QueryExecuting += EventsOnQueryExecuting; - session.Events.DbCommandExecuting += EventsOnDbCommandExecuting; - return new Disposable((a) => Detach()); - } - - private void EventsOnDbCommandExecuting(object sender, DbCommandEventArgs dbCommandEventArgs) - { - LogQueryTextToConsole(dbCommandEventArgs.Command); - } - - private void EventsOnQueryExecuting(object sender, QueryEventArgs queryEventArgs) - { - LogExpressionToConsole(queryEventArgs.Expression); - } - - public void Detach() - { - if (!isAttached) - return; - session.Events.QueryExecuting -= EventsOnQueryExecuting; - session.Events.DbCommandExecuting -= EventsOnDbCommandExecuting; - } - - public void Dispose() - { - Detach(); - } - - private void LogExpressionToConsole(Expression expression) - { - Console.WriteLine(expression.ToString()); - } - - private void LogQueryTextToConsole(DbCommand command) - { - Console.WriteLine(command.CommandText); - } - - - public QueryLogger(Session session) - { - this.session = session; - } - } -} +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.05.08 + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.GroupByNullableFieldTestModel; + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0728_NullGroupHasNoElementsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Battery)); + configuration.Types.Register(typeof(Product)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List batt = new List() { + null, + new Battery() {Amps = 5, Cell = 10, Volts = 10.4}, + new Battery() {Amps = 8, Cell = 12, Volts = 12.4}, + new Battery() {Amps = 2, Cell = 5, Volts = 3.7} + }; + + for (int i = 0; i < 10; i++) { + new Product { + Name = "Name:" + i % 3, + CreationDate = DateTime.UtcNow.AddDays(-(i % 3)), + Description = i % 3!=0 ? "Lap:" + i % 3 : null, + Comment = i % 3!=0 ? "Comment:" + i % 3 : null, + Price = new Money() {CurrencyCode = 100 + i % 3, Value = (decimal) 12.3}, + Battery = batt[i % 3] + }; + } + transaction.Complete(); + } + } + + [Test] + public void GroupByPersistentField() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => g.Battery) + .AsEnumerable() + .Select(g => new {Key = g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => g.Battery) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByStructureFieldTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => g.Price) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => g.Price) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByStructureFieldTest2() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => g.Price2) + .AsEnumerable() + .Select(g => new { g.Key, Cnt = g.Count() }) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => g.Price2) + .Select(g => new { g.Key, Cnt = g.Count() }); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key == e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByStructureFieldTest3() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => g.Price2.CurrencyCode) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => g.Price2.CurrencyCode) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByStructureFieldTest4() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {A = g.Price2.Value, B = g.Price2.Value}) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {A = g.Price2.Value, B = g.Price2.Value}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.A==e.Key.A && i.Key.B==e.Key.B); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GrouoByNonNullableFieldTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(p => p.Name) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(p => p.Name) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByNullableFieldTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(p => p.Description) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(p => p.Description) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithNullableFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(p => new {p.Description, p.Comment}) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(p => new {p.Description, p.Comment}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Description==e.Key.Description && i.Key.Comment==e.Key.Comment); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithNonNullableFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(p => new {p.Name, p.CreationDate}) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(p => new {p.Name, p.CreationDate}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Name==e.Key.Name && i.Key.CreationDate==e.Key.CreationDate); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithMixedFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(p => new { p.Name, p.Description }) + .AsEnumerable() + .Select(g => new { g.Key, Cnt = g.Count() }) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(p => new { p.Name, p.Description }) + .Select(g => new { g.Key, Cnt = g.Count() }); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Name==e.Key.Name && i.Key.Description==e.Key.Description); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByIdTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => g.Battery.Id) + .AsEnumerable() + .Select(g => new {g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => g.Battery.Id) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key==e.Key); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithPersistentFieldTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {Battery = g.Battery}) + .AsEnumerable() + .Select( + g => new { + g.Key, + Cnt = g.Count() + }) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {Battery = g.Battery}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithPersistentAndNullableFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {Battery = g.Battery, Description = g.Description}) + .AsEnumerable() + .Select( + g => new { + g.Key, + Cnt = g.Count() + }) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {Battery = g.Battery, Description = g.Description}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery && i.Key.Description==e.Key.Description); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithPersistentAndNonNullableFielsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {Battery = g.Battery, Description = g.Name}) + .AsEnumerable() + .Select( + g => new { + g.Key, + Cnt = g.Count() + }) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {Battery = g.Battery, Description = g.Name}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Battery==e.Key.Battery && i.Key.Description==e.Key.Description); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithStructureFieldTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {g.Price}) + .AsEnumerable() + .Select(g => new {Key = g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {g.Price}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithStructureAndNullableFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {g.Price, g.Description}) + .AsEnumerable() + .Select(g => new {Key = g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {g.Price, g.Description}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price && i.Key.Description==e.Key.Description); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + + [Test] + public void GroupByAnonymousTypeWithStructureAndNonNullableFieldsTest() + { + using (var session = Domain.OpenSession()) + using (var logger = new QueryLogger(session)) + using (var transaction = session.OpenTransaction()) { + var expectedCounts = Query.All() + .GroupBy(g => new {g.Price, g.Name}) + .AsEnumerable() + .Select(g => new {Key = g.Key, Cnt = g.Count()}) + .ToList(); + + using (logger.Attach()) { + var x = Query.All() + .GroupBy(g => new {g.Price, g.Name}) + .Select(g => new {g.Key, Cnt = g.Count()}); + + foreach (var e in x) { + var entry = expectedCounts.FirstOrDefault(i => i.Key.Price==e.Key.Price && i.Key.Name==e.Key.Name); + Assert.That(entry, Is.Not.Null); + Assert.That(e.Cnt, Is.EqualTo(entry.Cnt)); + } + } + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues.GroupByNullableFieldTestModel +{ + [HierarchyRoot] + public class Battery : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public double Volts { get; set; } + [Field] + public int Amps { get; set; } + [Field] + public int Cell { get; set; } + } + + [HierarchyRoot] + public class Product : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public string Comment { get; set; } + + [Field] + public Battery Battery { get; set; } + + [Field] + public Money Price { get; set; } + + [Field] + public Money2 Price2 { get; set; } + } + + public class Money : Structure + { + [Field] + public decimal Value { get; set; } + + [Field] + public int CurrencyCode { get; set; } + } + + public class Money2 : Structure + { + [Field] + public decimal Value { get; set; } + + [Field] + public Currency CurrencyCode { get; set; } + } + + [HierarchyRoot] + public class Currency : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + } + + public class QueryLogger : IDisposable + { + private Session session; + private bool isAttached; + + public IDisposable Attach() + { + if (isAttached) + new Disposable((a) => Detach()); + session.Events.QueryExecuting += EventsOnQueryExecuting; + session.Events.DbCommandExecuting += EventsOnDbCommandExecuting; + return new Disposable((a) => Detach()); + } + + private void EventsOnDbCommandExecuting(object sender, DbCommandEventArgs dbCommandEventArgs) + { + LogQueryTextToConsole(dbCommandEventArgs.Command); + } + + private void EventsOnQueryExecuting(object sender, QueryEventArgs queryEventArgs) + { + LogExpressionToConsole(queryEventArgs.Expression); + } + + public void Detach() + { + if (!isAttached) + return; + session.Events.QueryExecuting -= EventsOnQueryExecuting; + session.Events.DbCommandExecuting -= EventsOnDbCommandExecuting; + } + + public void Dispose() + { + Detach(); + } + + private void LogExpressionToConsole(Expression expression) + { + Console.WriteLine(expression.ToString()); + } + + private void LogQueryTextToConsole(DbCommand command) + { + Console.WriteLine(command.CommandText); + } + + + public QueryLogger(Session session) + { + this.session = session; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0735_WrongTypeIdsInValidateMode.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0735_WrongTypeIdsInValidateMode.cs index 374c3f1fa7..f8ade435c8 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0735_WrongTypeIdsInValidateMode.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0735_WrongTypeIdsInValidateMode.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.06.17 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using V1 = Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel.V1; -using V2 = Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel.V2; - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0735_WrongTypeIdsInValidateMode - { - [Test] - public void DefaultBehaviorTest() - { - using (var domain = Domain.Build(BuildInitialConfiguration())) { } - - var exception = Assert.Throws(() => Domain.Build(BuildUpgradeConfiguration())); - Assert.That(exception.ComparisonResult, Is.Null); - } - - private DomainConfiguration BuildInitialConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (V1.MaterialLot)); - configuration.Types.Register(typeof (V1.CustomMaterialLot)); - return configuration; - } - - private DomainConfiguration BuildUpgradeConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Validate; - configuration.Types.Register(typeof (V1.MaterialLot)); - configuration.Types.Register(typeof (V2.CustomMaterialLot)); - return configuration; - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel -{ - namespace V1 - { - [HierarchyRoot] - public class MaterialLot : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public String LotNumber { get; set; } - } - - public class CustomMaterialLot : MaterialLot - { - [Field] - public String CustomField { get; set; } - } - } - - namespace V2 - { - public class CustomMaterialLot : V1.MaterialLot - { - [Field] - public String CustomField { get; set; } - } - } -} +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.06.17 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using V1 = Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel.V1; +using V2 = Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel.V2; + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0735_WrongTypeIdsInValidateMode + { + [Test] + public void DefaultBehaviorTest() + { + using (var domain = Domain.Build(BuildInitialConfiguration())) { } + + var exception = Assert.Throws(() => Domain.Build(BuildUpgradeConfiguration())); + Assert.That(exception.ComparisonResult, Is.Null); + } + + private DomainConfiguration BuildInitialConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (V1.MaterialLot)); + configuration.Types.Register(typeof (V1.CustomMaterialLot)); + return configuration; + } + + private DomainConfiguration BuildUpgradeConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Validate; + configuration.Types.Register(typeof (V1.MaterialLot)); + configuration.Types.Register(typeof (V2.CustomMaterialLot)); + return configuration; + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0735_WrongTypeIdsInValidateModeModel +{ + namespace V1 + { + [HierarchyRoot] + public class MaterialLot : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public String LotNumber { get; set; } + } + + public class CustomMaterialLot : MaterialLot + { + [Field] + public String CustomField { get; set; } + } + } + + namespace V2 + { + public class CustomMaterialLot : V1.MaterialLot + { + [Field] + public String CustomField { get; set; } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0778_PrefetchStackOverflow.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0778_PrefetchStackOverflow.cs index 2e179ef153..53f4f1644c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0778_PrefetchStackOverflow.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0778_PrefetchStackOverflow.cs @@ -1,1017 +1,1017 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.24 - -using System; -using System.Linq; -using System.Text; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Issues.IssueJira0778_PrefetchStackOverflowModel; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Tests.Issues -{ - [Explicit] - public class IssueJira0778_PrefetchStackOverflow : AutoBuildTest - { - private class TestDataInvalidException : Exception - { - - } - - private const int CustomerCount = 161000; - - private bool isSchemaRecreated = false; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Recipient).Assembly, typeof (Recipient).Namespace); - return configuration; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - var firstTryConfig = configuration.Clone(); - firstTryConfig.UpgradeMode = DomainUpgradeMode.Validate; - try { - //try to avoid long population - var domain = base.BuildDomain(firstTryConfig); - ValidateTestData(domain); - } - catch (SchemaSynchronizationException exception) { - //schemas differ - isSchemaRecreated = true; - } - catch (TestDataInvalidException) { - // schemas are the same but data in not ok - // create so override existing schema and publish correct data - isSchemaRecreated = true; - } - var secondTry = configuration.Clone(); - secondTry.UpgradeMode = DomainUpgradeMode.Recreate; - return base.BuildDomain(secondTry); - } - - protected override void PopulateData() - { - if (isSchemaRecreated) - return; - - PopulateEmployeeHierarchy(Domain); - PopulateCustomers(Domain); - PopulateContactsForEmployees(Domain); - PopulateRecipients(Domain); - PopulateTestHierarchy(Domain); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.Default| SessionOptions.AutoActivation) {DefaultCommandTimeout = 3000})) - using (var tx = session.OpenTransaction()) { - ExecuteAsync(session); - } - } - - [Test] - public void OneLevelPrefetchTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Prefetch(a => a.Reference1) - .Prefetch(a => a.Reference2) - .Prefetch(a => a.Reference3) - .Prefetch(a => a.SomeObject); - - var localResult = result.ToList(); - int count = 0; - session.Events.DbCommandExecuted += (sender, args) => count++; - foreach (var aaaa in localResult) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); - } - - Assert.That(count, Is.EqualTo(0)); - } - } - - [Test] - public void TwoLevelPrefetchTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Prefetch(a => a.Reference1) - .Prefetch(a => a.Reference2) - .Prefetch(a => a.Reference3) - .Prefetch(a => a.SomeObject) - .Prefetch(a => a.Bbbbs - .Prefetch(b => b.Reference4) - .Prefetch(b => b.Reference5) - .Prefetch(b => b.Reference6) - .Prefetch(b => b.SomeObject) - ); - - var localResult = result.ToList(); - int count = 0; - session.Events.DbCommandExecuted += (sender, args) => count++; - foreach (var aaaa in localResult) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); - - foreach (var bbbb in aaaa.Bbbbs) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference4, bbbb.Reference4.Address, bbbb.Reference4.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference5, bbbb.Reference5.Address, bbbb.Reference5.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference6, bbbb.Reference6.Address, bbbb.Reference6.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(bbbb.SomeObject)); - } - } - - Assert.That(count, Is.EqualTo(0)); - } - } - - [Test] - public void ThreeLevelPrefetchTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Prefetch(a => a.Reference1) - .Prefetch(a => a.Reference2) - .Prefetch(a => a.Reference3) - .Prefetch(a => a.SomeObject) - .Prefetch(a => a.Bbbbs - .Prefetch(b => b.Reference4) - .Prefetch(b => b.Reference5) - .Prefetch(b => b.Reference6) - .Prefetch(b => b.SomeObject) - .Prefetch(b => b.CCCCs - .Prefetch(c => c.Reference7) - .Prefetch(c => c.Reference8) - .Prefetch(c => c.Reference9) - .Prefetch(c => c.SomeObject) - ) - ); - - var localResult = result.ToList(); - int count = 0; - session.Events.DbCommandExecuted += (sender, args) => count++; - foreach (var aaaa in localResult) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); - - foreach (var bbbb in aaaa.Bbbbs) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference4, bbbb.Reference4.Address, bbbb.Reference4.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference5, bbbb.Reference5.Address, bbbb.Reference5.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference6, bbbb.Reference6.Address, bbbb.Reference6.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(bbbb.SomeObject)); - - foreach (var cccc in bbbb.CCCCs) { - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference7, cccc.Reference7.Address, cccc.Reference7.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference8, cccc.Reference8.Address, cccc.Reference8.Passport); - Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference9, cccc.Reference9.Address, cccc.Reference9.Passport); - Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(cccc.SomeObject)); - } - } - } - Assert.That(count, Is.EqualTo(0)); - } - } - - [Test] - public void CyclicReferenceTest() - { - using (var populateSession = Domain.OpenSession()) - using (var tx = populateSession.OpenTransaction()) { - var firstOperation = new IssueJira0778_PrefetchStackOverflowModel.Operation(); - var secondOperation = new IssueJira0778_PrefetchStackOverflowModel.Operation(); - firstOperation.PreviousOperation = secondOperation; - firstOperation.NextOperation = secondOperation; - secondOperation.PreviousOperation = firstOperation; - secondOperation.NextOperation = firstOperation; - - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Prefetch(o => o.PreviousOperation) - .Prefetch(o => o.NextOperation) - .ToList(); - - int count = 0; - session.Events.DbCommandExecuted += (sender, args) => count++; - foreach (var op in result) { - Console.WriteLine("Prevoius operation {0}", op.PreviousOperation); - } - Assert.That(count, Is.EqualTo(0)); - } - } - - private void ExecuteAsync(Session session) - { - var recipients = session.Query.All() - .Active() - .Where(r => !r.Data.Contains(nameof (CustomerData.Email))) - .Prefetch(r => r.Contact) - .ToList(); - - Assert.That(recipients.Count, Is.AtLeast(1000)); - int counter = 0; - session.Events.DbCommandExecuted += (sender, args) => counter++; - foreach (var recipient in recipients) { - var contact = recipient.Contact; - } - Assert.That(counter, Is.EqualTo(0)); - } - - private static void ValidateTestData(Domain domain) - { - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var contactCount = session.Query.ExecuteDelayed(q => q.All().Count()); - var employeeCount = session.Query.ExecuteDelayed(q => q.All().Count()); - var recipientCount = session.Query.ExecuteDelayed(q => q.All().Count()); - var boss = session.Query.ExecuteDelayed(q => q.All().FirstOrDefault(emp => emp.FirstName == "The" && emp.LastName == "Boss")); - var As = session.Query.ExecuteDelayed(q => q.All().Count()); - var Bs = session.Query.ExecuteDelayed(q => q.All().Count()); - var Cs = session.Query.ExecuteDelayed(q => q.All().Count()); - - var isValid = recipientCount.Value==CustomerCount && - employeeCount.Value== 45 && - boss.Value != null && - contactCount.Value > CustomerCount * 3 && - As.Value == 10 && - Bs.Value == 100 && - Cs.Value == 1000; - - if (!isValid) - throw new TestDataInvalidException(); - } - } - - private static void PopulateEmployeeHierarchy(Domain domain) - { - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var ceo = new Employee(session, "The", "Boss"); - var gm = new Employee(session, "General", "Manager"); - var ipDirector = new Employee(session, "Investment & Placement", "Director"); - var pManager = new Employee(session, "Placement", "Director"); - new Employee(session, "Placement", "Staff #1"); - new Employee(session, "Placement", "Staff #2"); - new Employee(session, "Placement", "Staff #3"); - - var iManager = new Employee(session, "Investment", "Manager"); - new Employee(session, "Investment", "Staff #1"); - new Employee(session, "Investment", "Staff #2"); - new Employee(session, "Investment", "Staff #3"); - - var bdsManager = new Employee(session, "Business Development", "S.Manager"); - new Employee(session, "Projects Marketing and Exhibition Team", "Member #1"); - new Employee(session, "Projects Marketing and Exhibition Team", "Member #2"); - new Employee(session, "Projects Marketing and Exhibition Team", "Member #3"); - - new Employee(session, "Projects Marketing and Exhibition Team", "Member #1"); - new Employee(session, "Projects Marketing and Exhibition Team", "Member #2"); - new Employee(session, "Projects Marketing and Exhibition Team", "Member #3"); - - var pdDirector = new Employee(session, "Project Development", "Director"); - new Employee(session, "Project", "Architect #1"); - new Employee(session, "Project", "Architect #2"); - new Employee(session, "Project", "Architect #3"); - - new Employee(session, "Project", "Manager #1"); - new Employee(session, "Project", "Manager #2"); - new Employee(session, "Project", "Manager #3"); - - var hraDirector = new Employee(session, "HR & Admin", "Director"); - new Employee(session, "HR", "Staff #1"); - new Employee(session, "HR", "Staff #2"); - new Employee(session, "HR", "Staff #3"); - - new Employee(session, "Admin", "Staff #1"); - new Employee(session, "Admin", "Staff #2"); - new Employee(session, "Admin", "Staff #3"); - - new Employee(session, "Support", "Serviceman #1"); - new Employee(session, "Support", "Serviceman #2"); - new Employee(session, "Support", "Serviceman #3"); - - var fitDirector = new Employee(session, "Finance & IT", "Director"); - var chiefAccountant = new Employee(session, "Chief", "Accountant"); - - new Employee(session, "Accountant", "Clerk #1"); - new Employee(session, "Accountant", "Clerk #2"); - new Employee(session, "Accountant", "Clerk #3"); - new Employee(session, "Accountant", "Clerk #4"); - new Employee(session, "Accountant", "Clerk #5"); - - new Employee(session, "IT","Administrator #1"); - new Employee(session, "IT", "Administrator #2"); - new Employee(session, "IT", "Administrator #3"); - - tx.Complete(); - } - } - - private static void PopulateCustomers(Domain domain) - { - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - for (int i = 0; i < CustomerCount; i++) { - var customer = new Customer(session, Guid.NewGuid().ToString(), Guid.NewGuid().ToString()); - new Contact(session, customer, ContactType.Email, ContactGenerator.GetEmail()); - new Contact(session, customer, ContactType.Fax, ContactGenerator.GetPhone()); - new Contact(session, customer, ContactType.Phone, ContactGenerator.GetPhone()); - } - tx.Complete(); - } - } - - private static void PopulateContactsForEmployees(Domain domain) - { - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - foreach (var employee in session.Query.All()) { - new Contact(session, employee, ContactType.Email, ContactGenerator.GetEmail()) {Active = true}; - new Contact(session, employee, ContactType.Fax, ContactGenerator.GetPhone()) {Active = true}; - new Contact(session, employee, ContactType.Phone, ContactGenerator.GetPhone()) {Active= true}; - } - tx.Complete(); - } - } - - public static void PopulateRecipients(Domain domain) - { - Random random = new Random(); - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customers = session.Query.All().ToArray(); - foreach (var customer in customers) { - var contactsToChoose = customer.Contacts.ToArray(); - new Recipient(session, new Audience(session)) { - Contact = contactsToChoose[random.Next(0, contactsToChoose.Length)], - Active = true, - Data = Guid.NewGuid().ToString(), - Customer = customer - }; - } - tx.Complete(); - } - } - - public static void PopulateTestHierarchy(Domain domain) - { - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - var aaaa = new AAAA { - Reference1 = new ReferenceEntity1 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #1" + i +"00", - Region = "Region #1" + i +"00", - City = "City #1" + i +"00", - Street = "Street #1" + i +"00", - Index = "Index #1" + i +"00", - Building = "Building #1" + i +"00", - }, - Passport = new PassportData { - Number = "N#1" + i, - Series = "S#1" + i - } - }, - Reference2 = new ReferenceEntity2 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #2" + i + "00", - Region = "Region #2" + i + "00", - City = "City #2" + i + "00", - Street = "Street #2" + i + "00", - Index = "Index #2" + i + "00", - Building = "Building #2" + i + "00", - }, - Passport = new PassportData { - Number = "N#2" + i, - Series = "S#2" + i - } - }, - Reference3 = new ReferenceEntity3 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #3" + i + "00", - Region = "Region #3" + i + "00", - City = "City #3" + i + "00", - Street = "Street #3" + i + "00", - Index = "Index #3" + i + "00", - Building = "Building #3" + i + "00", - }, - Passport = new PassportData { - Number = "N#2" + i, - Series = "S#2" + i, - } - }, - SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) - }; - for (int j = 0; j < 10; j++) { - var bbbb = new BBBB { - Reference4 = new ReferenceEntity4() { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #1" + i + j + "00", - Region = "Region #1" + i + j + "00", - City = "City #1" + i + j + "00", - Street = "Street #1" + i + j + "00", - Index = "Index #1" + i + j + "00", - Building = "Building #4" + i + j + "00", - }, - Passport = new PassportData { - Number = "N#4" + i + j, - Series = "S#4" + i + j - } - }, - Reference5 = new ReferenceEntity5() { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #5" + i + j + "00", - Region = "Region #5" + i + j + "00", - City = "City #5" + i + j + "00", - Street = "Street #5" + i + j + "00", - Index = "Index #5" + i + j + "00", - Building = "Building #5" + i + j + "00", - }, - Passport = new PassportData { - Number = "N#5" + i + j, - Series = "S#5" + i + j - } - }, - Reference6 = new ReferenceEntity6 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #6" + i + j + "00", - Region = "Region #6" + i + j + "00", - City = "City #6" + i + j + "00", - Street = "Street #6" + i + j + "00", - Index = "Index #6" + i + j + "00", - Building = "Building #6" + i + j + "00", - }, - Passport = new PassportData { - Number = "N#6" + i + j, - Series = "S#6" + i + j - } - }, - SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) - }; - for (int k = 0; k < 10; k++) { - var cccc = new CCCC { - Reference7 = new ReferenceEntity7 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #7" + i + j + k + "00", - Region = "Region #7" + i + j + k + "00", - City = "City #7" + i + j + k + "00", - Street = "Street #7" + i + j + k + "00", - Index = "Index #7" + i + j + k + "00", - Building = "Building #7" + i + j + k + "00", - }, - Passport = new PassportData { - Number = "N#7" + i + j + k, - Series = "S#7" + i + j + k - } - }, - Reference8 = new ReferenceEntity8 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #8" + i + j + k + "00", - Region = "Region #8" + i + j + k + "00", - City = "City #8" + i + j + k + "00", - Street = "Street #8" + i + j + k + "00", - Index = "Index #8" + i + j + k + "00", - Building = "Building #8" + i + j + k + "00", - }, - Passport = new PassportData { - Number = "N#8" + i + j + k, - Series = "S#8" + i + j + k - } - }, - Reference9 = new ReferenceEntity9 { - Reference = new ReferenceEntity10(), - Address = new Address { - Country = "Country #9" + i + j + k + "00", - Region = "Region #9" + i + j + k + "00", - City = "City #9" + i + j + k + "00", - Street = "Street #9" + i + j + k + "00", - Index = "Index #9" + i + j + k + "00", - Building = "Building #9" + i + j + k + "00", - }, - Passport = new PassportData { - Number = "N#9" + i + j + k, - Series = "S#9" + i + j + k - } - }, - SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) - }; - bbbb.CCCCs.Add(cccc); - } - aaaa.Bbbbs.Add(bbbb); - } - } - tx.Complete(); - } - } - } -} - -namespace Xtensive.Orm.Tests.Issues.IssueJira0778_PrefetchStackOverflowModel -{ - public class ContactGenerator - { - private static Random Random = new Random(); - - public const string Template = "+7({0}){1}-{2}-{3}"; - public readonly static string[] Hosts = new[] {"@gimail.com", "@jahoo.com", "@inlook.com", "@tindax.ru"}; - - public static string GetEmail() - { - return Guid.NewGuid().ToString().Replace('-', '_') + Hosts[Random.Next(0, 4)]; - } - - public static string GetFax() - { - return GetPhone(); - } - - public static string GetPhone() - { - var code = Random.Next(900, 950); - var block1 = Random.Next(100, 1000); - var block2 = Random.Next(10, 100); - var block3 = Random.Next(10, 100); - return string.Format(Template, code, block1, block2, block3); - } - } - - public static class Extensions - { - public static IQueryable Active(this IQueryable source) - { - return source.Where(e => e.Active); - } - } - - public enum ContactType - { - Phone, - Email, - Fax - } - - public abstract class BusinessEntityBase : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - public BusinessEntityBase(Session session) - : base(session) - { - } - } - - public interface IHasContacts: IEntity - { - [Field] - EntitySet Contacts { get; } - } - - [HierarchyRoot] - public class Audience : BusinessEntityBase - { - - public Audience(Session session) - : base(session) - { - - } - } - - public class CustomerData - { - public static string Email => "email"; - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class Recipient : BusinessEntityBase - { - public const int DataMaxLength = 4000; - - [Field(Indexed = true, Nullable = false)] - [NotNullConstraint(ValidateOnlyIfModified = true)] - public Audience Audience { get; set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Contact Contact { get; set; } - - [Field(Length = DataMaxLength, LazyLoad = false)] - public string Data { get; set; } - - public Recipient(Session session, Audience audience) : base(session) - { - Audience = audience; - } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class Contact : BusinessEntityBase - { - public const int MemoMaxLength = 250; - - [Field] - [NotNullConstraint(ValidateOnlyIfModified = true)] - [Association(PairTo = nameof(IHasContacts.Contacts))] - public IHasContacts Owner { get; private set; } - - [Field] - public ContactType Type { get; private set; } - - [Field(Nullable = false)] - [NotNullOrEmptyConstraint(ValidateOnlyIfModified = true)] - public string Value { get; private set; } - - [Field] - public string ReversePhone { get; private set; } - - [Field(Length = MemoMaxLength)] - public string Memo { get; set; } - - [Field, Obsolete] // Temporarily resurrected - public bool MessagesEnabled { get; set; } - - [Field] - public bool JobRemindersEnabled { get; set; } - - [Field] - public bool MarketingUpdatesEnabled { get; set; } - - [Field(DefaultSqlExpression = "GETUTCDATE()")] - public DateTime ModifiedOn { get; set; } - - public Contact(Session session, IHasContacts owner, ContactType type, string value) - : base(session) - { - Owner = owner; - Type = type; - MarketingUpdatesEnabled = true; - Value = value; - } - } - - [HierarchyRoot] - public class Employee : BusinessEntityBase, IHasContacts - { - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public EntitySet Contacts { get; private set; } - - public Employee(Session session, string firstName, string lastName) - :base(session) - { - FirstName = firstName; - LastName = lastName; - } - } - - [HierarchyRoot] - public class Customer : BusinessEntityBase, IHasContacts - { - [Field] - public string FistName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public EntitySet Contacts { get; private set; } - - public Customer(Session session, string firstName, string lastName) - :base(session) - { - FistName = firstName; - LastName = lastName; - } - } - - [HierarchyRoot] - public class AAAA : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public ReferenceEntity1 Reference1 { get; set; } - - [Field] - public ReferenceEntity2 Reference2 { get; set; } - - [Field] - public ReferenceEntity3 Reference3 { get; set; } - - [Field(LazyLoad = true)] - public byte[] SomeObject { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet Bbbbs { get; private set; } - } - - [HierarchyRoot] - public class BBBB : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public AAAA Owner { get; set; } - - [Field] - public ReferenceEntity4 Reference4 { get; set; } - - [Field] - public ReferenceEntity5 Reference5 { get; set; } - - [Field] - public ReferenceEntity6 Reference6 { get; set; } - - [Field(LazyLoad = true)] - public byte[] SomeObject { get; set; } - - [Field] - [Association(PairTo = "Owner")] - public EntitySet CCCCs { get; private set; } - } - - [HierarchyRoot] - public class CCCC : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public BBBB Owner { get; set; } - - [Field] - public ReferenceEntity7 Reference7 { get; set; } - - [Field] - public ReferenceEntity8 Reference8 { get; set; } - - [Field] - public ReferenceEntity9 Reference9 { get; set; } - - [Field(LazyLoad = true)] - public byte[] SomeObject { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity1 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity2 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity3 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity4 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity5 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity6 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity7 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity8 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity9 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Address Address { get; set; } - - [Field] - public PassportData Passport { get; set; } - - [Field] - public ReferenceEntity10 Reference { get; set; } - } - - [HierarchyRoot] - public class ReferenceEntity10 : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Operation : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public Operation PreviousOperation { get; set; } - - [Field] - public Operation NextOperation { get; set; } - } - - - public class Address : Structure - { - [Field(Length = 128)] - public string Country { get; set; } - - [Field(Length = 128)] - public string Region { get; set; } - - [Field(Length = 128)] - public string City { get; set; } - - [Field(Length = 128)] - public string Street { get; set; } - - [Field(Length = 128)] - public string Building { get; set; } - - [Field(Length = 128)] - public string Index { get; set; } - - public override string ToString() - { - var builder = new StringBuilder(); - - builder.Append(Building); - builder.Append(Street).Append(", "); - builder.Append(City).Append(", "); - builder.Append(Region).Append(", "); - builder.Append(Index).Append(", "); - builder.Append(Country); - - return builder.ToString(); - } - } - - public class PassportData : Structure - { - [Field(Length = 128)] - public string Series { get; set; } - - [Field(Length = 128)] - public string Number { get; set; } - - public override string ToString() - { - return Series + " " + Number; - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.24 + +using System; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Issues.IssueJira0778_PrefetchStackOverflowModel; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Tests.Issues +{ + [Explicit] + public class IssueJira0778_PrefetchStackOverflow : AutoBuildTest + { + private class TestDataInvalidException : Exception + { + + } + + private const int CustomerCount = 161000; + + private bool isSchemaRecreated = false; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Recipient).Assembly, typeof (Recipient).Namespace); + return configuration; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + var firstTryConfig = configuration.Clone(); + firstTryConfig.UpgradeMode = DomainUpgradeMode.Validate; + try { + //try to avoid long population + var domain = base.BuildDomain(firstTryConfig); + ValidateTestData(domain); + } + catch (SchemaSynchronizationException exception) { + //schemas differ + isSchemaRecreated = true; + } + catch (TestDataInvalidException) { + // schemas are the same but data in not ok + // create so override existing schema and publish correct data + isSchemaRecreated = true; + } + var secondTry = configuration.Clone(); + secondTry.UpgradeMode = DomainUpgradeMode.Recreate; + return base.BuildDomain(secondTry); + } + + protected override void PopulateData() + { + if (isSchemaRecreated) + return; + + PopulateEmployeeHierarchy(Domain); + PopulateCustomers(Domain); + PopulateContactsForEmployees(Domain); + PopulateRecipients(Domain); + PopulateTestHierarchy(Domain); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.Default| SessionOptions.AutoActivation) {DefaultCommandTimeout = 3000})) + using (var tx = session.OpenTransaction()) { + ExecuteAsync(session); + } + } + + [Test] + public void OneLevelPrefetchTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Prefetch(a => a.Reference1) + .Prefetch(a => a.Reference2) + .Prefetch(a => a.Reference3) + .Prefetch(a => a.SomeObject); + + var localResult = result.ToList(); + int count = 0; + session.Events.DbCommandExecuted += (sender, args) => count++; + foreach (var aaaa in localResult) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); + } + + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void TwoLevelPrefetchTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Prefetch(a => a.Reference1) + .Prefetch(a => a.Reference2) + .Prefetch(a => a.Reference3) + .Prefetch(a => a.SomeObject) + .Prefetch(a => a.Bbbbs + .Prefetch(b => b.Reference4) + .Prefetch(b => b.Reference5) + .Prefetch(b => b.Reference6) + .Prefetch(b => b.SomeObject) + ); + + var localResult = result.ToList(); + int count = 0; + session.Events.DbCommandExecuted += (sender, args) => count++; + foreach (var aaaa in localResult) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); + + foreach (var bbbb in aaaa.Bbbbs) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference4, bbbb.Reference4.Address, bbbb.Reference4.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference5, bbbb.Reference5.Address, bbbb.Reference5.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference6, bbbb.Reference6.Address, bbbb.Reference6.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(bbbb.SomeObject)); + } + } + + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void ThreeLevelPrefetchTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Prefetch(a => a.Reference1) + .Prefetch(a => a.Reference2) + .Prefetch(a => a.Reference3) + .Prefetch(a => a.SomeObject) + .Prefetch(a => a.Bbbbs + .Prefetch(b => b.Reference4) + .Prefetch(b => b.Reference5) + .Prefetch(b => b.Reference6) + .Prefetch(b => b.SomeObject) + .Prefetch(b => b.CCCCs + .Prefetch(c => c.Reference7) + .Prefetch(c => c.Reference8) + .Prefetch(c => c.Reference9) + .Prefetch(c => c.SomeObject) + ) + ); + + var localResult = result.ToList(); + int count = 0; + session.Events.DbCommandExecuted += (sender, args) => count++; + foreach (var aaaa in localResult) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference1, aaaa.Reference1.Address, aaaa.Reference1.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference2, aaaa.Reference2.Address, aaaa.Reference2.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", aaaa.Reference3, aaaa.Reference3.Address, aaaa.Reference3.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(aaaa.SomeObject)); + + foreach (var bbbb in aaaa.Bbbbs) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference4, bbbb.Reference4.Address, bbbb.Reference4.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference5, bbbb.Reference5.Address, bbbb.Reference5.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", bbbb.Reference6, bbbb.Reference6.Address, bbbb.Reference6.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(bbbb.SomeObject)); + + foreach (var cccc in bbbb.CCCCs) { + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference7, cccc.Reference7.Address, cccc.Reference7.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference8, cccc.Reference8.Address, cccc.Reference8.Passport); + Console.WriteLine("Reference {0}, Address {1}, Passport {2}", cccc.Reference9, cccc.Reference9.Address, cccc.Reference9.Passport); + Console.WriteLine("Some object {0}", Encoding.UTF8.GetString(cccc.SomeObject)); + } + } + } + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void CyclicReferenceTest() + { + using (var populateSession = Domain.OpenSession()) + using (var tx = populateSession.OpenTransaction()) { + var firstOperation = new IssueJira0778_PrefetchStackOverflowModel.Operation(); + var secondOperation = new IssueJira0778_PrefetchStackOverflowModel.Operation(); + firstOperation.PreviousOperation = secondOperation; + firstOperation.NextOperation = secondOperation; + secondOperation.PreviousOperation = firstOperation; + secondOperation.NextOperation = firstOperation; + + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Prefetch(o => o.PreviousOperation) + .Prefetch(o => o.NextOperation) + .ToList(); + + int count = 0; + session.Events.DbCommandExecuted += (sender, args) => count++; + foreach (var op in result) { + Console.WriteLine("Prevoius operation {0}", op.PreviousOperation); + } + Assert.That(count, Is.EqualTo(0)); + } + } + + private void ExecuteAsync(Session session) + { + var recipients = session.Query.All() + .Active() + .Where(r => !r.Data.Contains(nameof (CustomerData.Email))) + .Prefetch(r => r.Contact) + .ToList(); + + Assert.That(recipients.Count, Is.AtLeast(1000)); + int counter = 0; + session.Events.DbCommandExecuted += (sender, args) => counter++; + foreach (var recipient in recipients) { + var contact = recipient.Contact; + } + Assert.That(counter, Is.EqualTo(0)); + } + + private static void ValidateTestData(Domain domain) + { + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var contactCount = session.Query.ExecuteDelayed(q => q.All().Count()); + var employeeCount = session.Query.ExecuteDelayed(q => q.All().Count()); + var recipientCount = session.Query.ExecuteDelayed(q => q.All().Count()); + var boss = session.Query.ExecuteDelayed(q => q.All().FirstOrDefault(emp => emp.FirstName == "The" && emp.LastName == "Boss")); + var As = session.Query.ExecuteDelayed(q => q.All().Count()); + var Bs = session.Query.ExecuteDelayed(q => q.All().Count()); + var Cs = session.Query.ExecuteDelayed(q => q.All().Count()); + + var isValid = recipientCount.Value==CustomerCount && + employeeCount.Value== 45 && + boss.Value != null && + contactCount.Value > CustomerCount * 3 && + As.Value == 10 && + Bs.Value == 100 && + Cs.Value == 1000; + + if (!isValid) + throw new TestDataInvalidException(); + } + } + + private static void PopulateEmployeeHierarchy(Domain domain) + { + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var ceo = new Employee(session, "The", "Boss"); + var gm = new Employee(session, "General", "Manager"); + var ipDirector = new Employee(session, "Investment & Placement", "Director"); + var pManager = new Employee(session, "Placement", "Director"); + new Employee(session, "Placement", "Staff #1"); + new Employee(session, "Placement", "Staff #2"); + new Employee(session, "Placement", "Staff #3"); + + var iManager = new Employee(session, "Investment", "Manager"); + new Employee(session, "Investment", "Staff #1"); + new Employee(session, "Investment", "Staff #2"); + new Employee(session, "Investment", "Staff #3"); + + var bdsManager = new Employee(session, "Business Development", "S.Manager"); + new Employee(session, "Projects Marketing and Exhibition Team", "Member #1"); + new Employee(session, "Projects Marketing and Exhibition Team", "Member #2"); + new Employee(session, "Projects Marketing and Exhibition Team", "Member #3"); + + new Employee(session, "Projects Marketing and Exhibition Team", "Member #1"); + new Employee(session, "Projects Marketing and Exhibition Team", "Member #2"); + new Employee(session, "Projects Marketing and Exhibition Team", "Member #3"); + + var pdDirector = new Employee(session, "Project Development", "Director"); + new Employee(session, "Project", "Architect #1"); + new Employee(session, "Project", "Architect #2"); + new Employee(session, "Project", "Architect #3"); + + new Employee(session, "Project", "Manager #1"); + new Employee(session, "Project", "Manager #2"); + new Employee(session, "Project", "Manager #3"); + + var hraDirector = new Employee(session, "HR & Admin", "Director"); + new Employee(session, "HR", "Staff #1"); + new Employee(session, "HR", "Staff #2"); + new Employee(session, "HR", "Staff #3"); + + new Employee(session, "Admin", "Staff #1"); + new Employee(session, "Admin", "Staff #2"); + new Employee(session, "Admin", "Staff #3"); + + new Employee(session, "Support", "Serviceman #1"); + new Employee(session, "Support", "Serviceman #2"); + new Employee(session, "Support", "Serviceman #3"); + + var fitDirector = new Employee(session, "Finance & IT", "Director"); + var chiefAccountant = new Employee(session, "Chief", "Accountant"); + + new Employee(session, "Accountant", "Clerk #1"); + new Employee(session, "Accountant", "Clerk #2"); + new Employee(session, "Accountant", "Clerk #3"); + new Employee(session, "Accountant", "Clerk #4"); + new Employee(session, "Accountant", "Clerk #5"); + + new Employee(session, "IT","Administrator #1"); + new Employee(session, "IT", "Administrator #2"); + new Employee(session, "IT", "Administrator #3"); + + tx.Complete(); + } + } + + private static void PopulateCustomers(Domain domain) + { + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + for (int i = 0; i < CustomerCount; i++) { + var customer = new Customer(session, Guid.NewGuid().ToString(), Guid.NewGuid().ToString()); + new Contact(session, customer, ContactType.Email, ContactGenerator.GetEmail()); + new Contact(session, customer, ContactType.Fax, ContactGenerator.GetPhone()); + new Contact(session, customer, ContactType.Phone, ContactGenerator.GetPhone()); + } + tx.Complete(); + } + } + + private static void PopulateContactsForEmployees(Domain domain) + { + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + foreach (var employee in session.Query.All()) { + new Contact(session, employee, ContactType.Email, ContactGenerator.GetEmail()) {Active = true}; + new Contact(session, employee, ContactType.Fax, ContactGenerator.GetPhone()) {Active = true}; + new Contact(session, employee, ContactType.Phone, ContactGenerator.GetPhone()) {Active= true}; + } + tx.Complete(); + } + } + + public static void PopulateRecipients(Domain domain) + { + Random random = new Random(); + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customers = session.Query.All().ToArray(); + foreach (var customer in customers) { + var contactsToChoose = customer.Contacts.ToArray(); + new Recipient(session, new Audience(session)) { + Contact = contactsToChoose[random.Next(0, contactsToChoose.Length)], + Active = true, + Data = Guid.NewGuid().ToString(), + Customer = customer + }; + } + tx.Complete(); + } + } + + public static void PopulateTestHierarchy(Domain domain) + { + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + for (int i = 0; i < 10; i++) { + var aaaa = new AAAA { + Reference1 = new ReferenceEntity1 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #1" + i +"00", + Region = "Region #1" + i +"00", + City = "City #1" + i +"00", + Street = "Street #1" + i +"00", + Index = "Index #1" + i +"00", + Building = "Building #1" + i +"00", + }, + Passport = new PassportData { + Number = "N#1" + i, + Series = "S#1" + i + } + }, + Reference2 = new ReferenceEntity2 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #2" + i + "00", + Region = "Region #2" + i + "00", + City = "City #2" + i + "00", + Street = "Street #2" + i + "00", + Index = "Index #2" + i + "00", + Building = "Building #2" + i + "00", + }, + Passport = new PassportData { + Number = "N#2" + i, + Series = "S#2" + i + } + }, + Reference3 = new ReferenceEntity3 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #3" + i + "00", + Region = "Region #3" + i + "00", + City = "City #3" + i + "00", + Street = "Street #3" + i + "00", + Index = "Index #3" + i + "00", + Building = "Building #3" + i + "00", + }, + Passport = new PassportData { + Number = "N#2" + i, + Series = "S#2" + i, + } + }, + SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) + }; + for (int j = 0; j < 10; j++) { + var bbbb = new BBBB { + Reference4 = new ReferenceEntity4() { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #1" + i + j + "00", + Region = "Region #1" + i + j + "00", + City = "City #1" + i + j + "00", + Street = "Street #1" + i + j + "00", + Index = "Index #1" + i + j + "00", + Building = "Building #4" + i + j + "00", + }, + Passport = new PassportData { + Number = "N#4" + i + j, + Series = "S#4" + i + j + } + }, + Reference5 = new ReferenceEntity5() { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #5" + i + j + "00", + Region = "Region #5" + i + j + "00", + City = "City #5" + i + j + "00", + Street = "Street #5" + i + j + "00", + Index = "Index #5" + i + j + "00", + Building = "Building #5" + i + j + "00", + }, + Passport = new PassportData { + Number = "N#5" + i + j, + Series = "S#5" + i + j + } + }, + Reference6 = new ReferenceEntity6 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #6" + i + j + "00", + Region = "Region #6" + i + j + "00", + City = "City #6" + i + j + "00", + Street = "Street #6" + i + j + "00", + Index = "Index #6" + i + j + "00", + Building = "Building #6" + i + j + "00", + }, + Passport = new PassportData { + Number = "N#6" + i + j, + Series = "S#6" + i + j + } + }, + SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) + }; + for (int k = 0; k < 10; k++) { + var cccc = new CCCC { + Reference7 = new ReferenceEntity7 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #7" + i + j + k + "00", + Region = "Region #7" + i + j + k + "00", + City = "City #7" + i + j + k + "00", + Street = "Street #7" + i + j + k + "00", + Index = "Index #7" + i + j + k + "00", + Building = "Building #7" + i + j + k + "00", + }, + Passport = new PassportData { + Number = "N#7" + i + j + k, + Series = "S#7" + i + j + k + } + }, + Reference8 = new ReferenceEntity8 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #8" + i + j + k + "00", + Region = "Region #8" + i + j + k + "00", + City = "City #8" + i + j + k + "00", + Street = "Street #8" + i + j + k + "00", + Index = "Index #8" + i + j + k + "00", + Building = "Building #8" + i + j + k + "00", + }, + Passport = new PassportData { + Number = "N#8" + i + j + k, + Series = "S#8" + i + j + k + } + }, + Reference9 = new ReferenceEntity9 { + Reference = new ReferenceEntity10(), + Address = new Address { + Country = "Country #9" + i + j + k + "00", + Region = "Region #9" + i + j + k + "00", + City = "City #9" + i + j + k + "00", + Street = "Street #9" + i + j + k + "00", + Index = "Index #9" + i + j + k + "00", + Building = "Building #9" + i + j + k + "00", + }, + Passport = new PassportData { + Number = "N#9" + i + j + k, + Series = "S#9" + i + j + k + } + }, + SomeObject = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()) + }; + bbbb.CCCCs.Add(cccc); + } + aaaa.Bbbbs.Add(bbbb); + } + } + tx.Complete(); + } + } + } +} + +namespace Xtensive.Orm.Tests.Issues.IssueJira0778_PrefetchStackOverflowModel +{ + public class ContactGenerator + { + private static Random Random = new Random(); + + public const string Template = "+7({0}){1}-{2}-{3}"; + public readonly static string[] Hosts = new[] {"@gimail.com", "@jahoo.com", "@inlook.com", "@tindax.ru"}; + + public static string GetEmail() + { + return Guid.NewGuid().ToString().Replace('-', '_') + Hosts[Random.Next(0, 4)]; + } + + public static string GetFax() + { + return GetPhone(); + } + + public static string GetPhone() + { + var code = Random.Next(900, 950); + var block1 = Random.Next(100, 1000); + var block2 = Random.Next(10, 100); + var block3 = Random.Next(10, 100); + return string.Format(Template, code, block1, block2, block3); + } + } + + public static class Extensions + { + public static IQueryable Active(this IQueryable source) + { + return source.Where(e => e.Active); + } + } + + public enum ContactType + { + Phone, + Email, + Fax + } + + public abstract class BusinessEntityBase : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + public BusinessEntityBase(Session session) + : base(session) + { + } + } + + public interface IHasContacts: IEntity + { + [Field] + EntitySet Contacts { get; } + } + + [HierarchyRoot] + public class Audience : BusinessEntityBase + { + + public Audience(Session session) + : base(session) + { + + } + } + + public class CustomerData + { + public static string Email => "email"; + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class Recipient : BusinessEntityBase + { + public const int DataMaxLength = 4000; + + [Field(Indexed = true, Nullable = false)] + [NotNullConstraint(ValidateOnlyIfModified = true)] + public Audience Audience { get; set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Contact Contact { get; set; } + + [Field(Length = DataMaxLength, LazyLoad = false)] + public string Data { get; set; } + + public Recipient(Session session, Audience audience) : base(session) + { + Audience = audience; + } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class Contact : BusinessEntityBase + { + public const int MemoMaxLength = 250; + + [Field] + [NotNullConstraint(ValidateOnlyIfModified = true)] + [Association(PairTo = nameof(IHasContacts.Contacts))] + public IHasContacts Owner { get; private set; } + + [Field] + public ContactType Type { get; private set; } + + [Field(Nullable = false)] + [NotNullOrEmptyConstraint(ValidateOnlyIfModified = true)] + public string Value { get; private set; } + + [Field] + public string ReversePhone { get; private set; } + + [Field(Length = MemoMaxLength)] + public string Memo { get; set; } + + [Field, Obsolete] // Temporarily resurrected + public bool MessagesEnabled { get; set; } + + [Field] + public bool JobRemindersEnabled { get; set; } + + [Field] + public bool MarketingUpdatesEnabled { get; set; } + + [Field(DefaultSqlExpression = "GETUTCDATE()")] + public DateTime ModifiedOn { get; set; } + + public Contact(Session session, IHasContacts owner, ContactType type, string value) + : base(session) + { + Owner = owner; + Type = type; + MarketingUpdatesEnabled = true; + Value = value; + } + } + + [HierarchyRoot] + public class Employee : BusinessEntityBase, IHasContacts + { + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public EntitySet Contacts { get; private set; } + + public Employee(Session session, string firstName, string lastName) + :base(session) + { + FirstName = firstName; + LastName = lastName; + } + } + + [HierarchyRoot] + public class Customer : BusinessEntityBase, IHasContacts + { + [Field] + public string FistName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public EntitySet Contacts { get; private set; } + + public Customer(Session session, string firstName, string lastName) + :base(session) + { + FistName = firstName; + LastName = lastName; + } + } + + [HierarchyRoot] + public class AAAA : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public ReferenceEntity1 Reference1 { get; set; } + + [Field] + public ReferenceEntity2 Reference2 { get; set; } + + [Field] + public ReferenceEntity3 Reference3 { get; set; } + + [Field(LazyLoad = true)] + public byte[] SomeObject { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet Bbbbs { get; private set; } + } + + [HierarchyRoot] + public class BBBB : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public AAAA Owner { get; set; } + + [Field] + public ReferenceEntity4 Reference4 { get; set; } + + [Field] + public ReferenceEntity5 Reference5 { get; set; } + + [Field] + public ReferenceEntity6 Reference6 { get; set; } + + [Field(LazyLoad = true)] + public byte[] SomeObject { get; set; } + + [Field] + [Association(PairTo = "Owner")] + public EntitySet CCCCs { get; private set; } + } + + [HierarchyRoot] + public class CCCC : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public BBBB Owner { get; set; } + + [Field] + public ReferenceEntity7 Reference7 { get; set; } + + [Field] + public ReferenceEntity8 Reference8 { get; set; } + + [Field] + public ReferenceEntity9 Reference9 { get; set; } + + [Field(LazyLoad = true)] + public byte[] SomeObject { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity1 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity2 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity3 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity4 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity5 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity6 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity7 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity8 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity9 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Address Address { get; set; } + + [Field] + public PassportData Passport { get; set; } + + [Field] + public ReferenceEntity10 Reference { get; set; } + } + + [HierarchyRoot] + public class ReferenceEntity10 : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Operation : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public Operation PreviousOperation { get; set; } + + [Field] + public Operation NextOperation { get; set; } + } + + + public class Address : Structure + { + [Field(Length = 128)] + public string Country { get; set; } + + [Field(Length = 128)] + public string Region { get; set; } + + [Field(Length = 128)] + public string City { get; set; } + + [Field(Length = 128)] + public string Street { get; set; } + + [Field(Length = 128)] + public string Building { get; set; } + + [Field(Length = 128)] + public string Index { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + + builder.Append(Building); + builder.Append(Street).Append(", "); + builder.Append(City).Append(", "); + builder.Append(Region).Append(", "); + builder.Append(Index).Append(", "); + builder.Append(Country); + + return builder.ToString(); + } + } + + public class PassportData : Structure + { + [Field(Length = 128)] + public string Series { get; set; } + + [Field(Length = 128)] + public string Number { get; set; } + + public override string ToString() + { + return Series + " " + Number; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery.cs index b225f19952..182de9a89b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery.cs @@ -1,131 +1,131 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.25 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.IssueJira0779_SetOperationsWithOrderAndTakeWrongQueryModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira0779_SetOperationsWithOrderAndTakeWrongQueryModel -{ - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class NamedValue : Entity - { - [Field, Key] - public string Name { get; set; } - - [Field] - public long Value { get; set; } - - public NamedValue(Session session, string name) - : base(session, name) - { - - } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public sealed class IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.PagingRequiresOrderBy); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (NamedValue).Assembly, typeof (NamedValue).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()){ - new NamedValue(session, "A") {Value = 22}; - new NamedValue(session, "B") {Value = 21}; - new NamedValue(session, "C") {Value = 20}; - new NamedValue(session, "D") {Value = 19}; - new NamedValue(session, "E") {Value = 18}; - new NamedValue(session, "F") {Value = 17}; - new NamedValue(session, "G") {Value = 16}; - tx.Complete(); - } - } - - [Test] - public void ConcatTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query1 = session.Query.All().OrderBy(c => c.Value).Take(3); - var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(3); - var result = query1.Concat(query2).ToList().Select(e => e.Name).ToArray(); - - var expectedSequence = new [] {"G", "F", "E", "A", "B", "C"}; - Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); - for(int i =0; i < expectedSequence.Length; i++) - Assert.That(result[i], Is.EqualTo(expectedSequence[i])); - } - } - - [Test] - public void UnionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query1 = session.Query.All().OrderBy(c => c.Value).Take(3); - var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(3); - var result = query1.Union(query2).ToList().Select(e => e.Name).ToArray(); - - var expectedSequence = new[] { "A", "B", "C", "E", "F", "G" }; - Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); - for (int i = 0; i < expectedSequence.Length; i++) - Assert.That(result[i], Is.EqualTo(expectedSequence[i])); - } - } - - [Test] - public void IntersectTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query1 = session.Query.All().OrderBy(c => c.Value).Take(5); - var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(5); - var result = query1.Intersect(query2).ToList().Select(e => e.Name).ToArray(); - - // G F E D C - // E D C B A - var expectedSequence = new[] { "E", "D", "C" }; - Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); - for (int i = 0; i < expectedSequence.Length; i++) - Assert.That(result[i], Is.EqualTo(expectedSequence[i])); - } - } - - [Test] - public void ExceptTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query1 = session.Query.All().OrderBy(c => c.Value).Take(5); - var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(5); - var result = query1.Except(query2).ToList().Select(e => e.Name).ToArray(); - - var expectedSequence = new[] { "G", "F"}; - Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); - for (int i = 0; i < expectedSequence.Length; i++) - Assert.That(result[i], Is.EqualTo(expectedSequence[i])); - } - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.25 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.IssueJira0779_SetOperationsWithOrderAndTakeWrongQueryModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira0779_SetOperationsWithOrderAndTakeWrongQueryModel +{ + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class NamedValue : Entity + { + [Field, Key] + public string Name { get; set; } + + [Field] + public long Value { get; set; } + + public NamedValue(Session session, string name) + : base(session, name) + { + + } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public sealed class IssueJira0779_SetOperationsWithOrderAndTakeWrongQuery : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.PagingRequiresOrderBy); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (NamedValue).Assembly, typeof (NamedValue).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()){ + new NamedValue(session, "A") {Value = 22}; + new NamedValue(session, "B") {Value = 21}; + new NamedValue(session, "C") {Value = 20}; + new NamedValue(session, "D") {Value = 19}; + new NamedValue(session, "E") {Value = 18}; + new NamedValue(session, "F") {Value = 17}; + new NamedValue(session, "G") {Value = 16}; + tx.Complete(); + } + } + + [Test] + public void ConcatTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query1 = session.Query.All().OrderBy(c => c.Value).Take(3); + var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(3); + var result = query1.Concat(query2).ToList().Select(e => e.Name).ToArray(); + + var expectedSequence = new [] {"G", "F", "E", "A", "B", "C"}; + Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); + for(int i =0; i < expectedSequence.Length; i++) + Assert.That(result[i], Is.EqualTo(expectedSequence[i])); + } + } + + [Test] + public void UnionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query1 = session.Query.All().OrderBy(c => c.Value).Take(3); + var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(3); + var result = query1.Union(query2).ToList().Select(e => e.Name).ToArray(); + + var expectedSequence = new[] { "A", "B", "C", "E", "F", "G" }; + Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); + for (int i = 0; i < expectedSequence.Length; i++) + Assert.That(result[i], Is.EqualTo(expectedSequence[i])); + } + } + + [Test] + public void IntersectTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query1 = session.Query.All().OrderBy(c => c.Value).Take(5); + var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(5); + var result = query1.Intersect(query2).ToList().Select(e => e.Name).ToArray(); + + // G F E D C + // E D C B A + var expectedSequence = new[] { "E", "D", "C" }; + Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); + for (int i = 0; i < expectedSequence.Length; i++) + Assert.That(result[i], Is.EqualTo(expectedSequence[i])); + } + } + + [Test] + public void ExceptTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query1 = session.Query.All().OrderBy(c => c.Value).Take(5); + var query2 = session.Query.All().OrderByDescending(c => c.Value).Take(5); + var result = query1.Except(query2).ToList().Select(e => e.Name).ToArray(); + + var expectedSequence = new[] { "G", "F"}; + Assert.That(result.Length, Is.EqualTo(expectedSequence.Length)); + for (int i = 0; i < expectedSequence.Length; i++) + Assert.That(result[i], Is.EqualTo(expectedSequence[i])); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException.cs index 20efa59eb9..70966d4fa4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.04.22 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Issues.IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalExceptionModel; - -namespace Xtensive.Orm.Tests.Issues.IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalExceptionModel -{ - [HierarchyRoot] - public class EntityWithNormalDecimal : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Precision = 9, Scale = 2)] - public decimal Decimal { get; set; } - - } - - [HierarchyRoot] - public class EntityWithUnnormalDecimal : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(DefaultSqlExpression = "792281625142643375935439503351", Precision = 38, Scale = 5)] - public decimal Decimal { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException : AutoBuildTest - { - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var watch1 = new Stopwatch(); - watch1.Start(); - var query1 = session.Query.All().Select(el => el.Decimal).ToArray(); - watch1.Stop(); - Console.WriteLine(watch1.ElapsedMilliseconds); - - watch1.Reset(); - Assert.AreEqual(0, watch1.ElapsedMilliseconds); - watch1.Start(); - var query2 = session.Query.All().Select(el => el.Decimal).ToArray(); - watch1.Stop(); - Console.WriteLine(watch1.ElapsedMilliseconds); - } - } - - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var service = session.Services.Get(); - using (var command = service.CreateCommand()) { - command.CommandText = "INSERT INTO [EntityWithUnnormalDecimal](Id) Values (0)"; - command.ExecuteNonQuery(); - } - for (int i = 0; i < 1000000; i++) { - new EntityWithNormalDecimal() {Decimal = new decimal(1 + i)}; - new EntityWithUnnormalDecimal() {Decimal = new decimal(2000 + i)}; - } - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNormalDecimal).Assembly, typeof (EntityWithNormalDecimal).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.04.22 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Issues.IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalExceptionModel; + +namespace Xtensive.Orm.Tests.Issues.IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalExceptionModel +{ + [HierarchyRoot] + public class EntityWithNormalDecimal : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Precision = 9, Scale = 2)] + public decimal Decimal { get; set; } + + } + + [HierarchyRoot] + public class EntityWithUnnormalDecimal : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(DefaultSqlExpression = "792281625142643375935439503351", Precision = 38, Scale = 5)] + public decimal Decimal { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class IssueJira_0530_LowSpeedDecimalMaterializationCouseSqlDecimalInternalException : AutoBuildTest + { + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var watch1 = new Stopwatch(); + watch1.Start(); + var query1 = session.Query.All().Select(el => el.Decimal).ToArray(); + watch1.Stop(); + Console.WriteLine(watch1.ElapsedMilliseconds); + + watch1.Reset(); + Assert.AreEqual(0, watch1.ElapsedMilliseconds); + watch1.Start(); + var query2 = session.Query.All().Select(el => el.Decimal).ToArray(); + watch1.Stop(); + Console.WriteLine(watch1.ElapsedMilliseconds); + } + } + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "INSERT INTO [EntityWithUnnormalDecimal](Id) Values (0)"; + command.ExecuteNonQuery(); + } + for (int i = 0; i < 1000000; i++) { + new EntityWithNormalDecimal() {Decimal = new decimal(1 + i)}; + new EntityWithUnnormalDecimal() {Decimal = new decimal(2000 + i)}; + } + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNormalDecimal).Assembly, typeof (EntityWithNormalDecimal).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion1.cs index c7ad7673d1..de6ee6880a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion1.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using Xtensive.Core; - -namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1 -{ - [Serializable] - [HierarchyRoot] - public sealed class Status : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - [Association(PairTo = "Statuses")] - public EntitySet AssociatedContent { get; private set; } - - public override string ToString() - { - return Title; - } - } - - [Serializable] - [HierarchyRoot] - public class Content : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - public EntitySet Statuses { get; private set; } - - public override string ToString() - { - return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); - } - } - - [Serializable] - public class Media : Content - { - [Field] - public string Data { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using Xtensive.Core; + +namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1 +{ + [Serializable] + [HierarchyRoot] + public sealed class Status : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + [Association(PairTo = "Statuses")] + public EntitySet AssociatedContent { get; private set; } + + public override string ToString() + { + return Title; + } + } + + [Serializable] + [HierarchyRoot] + public class Content : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + public EntitySet Statuses { get; private set; } + + public override string ToString() + { + return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); + } + } + + [Serializable] + public class Media : Content + { + [Field] + public string Data { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion2.cs index bbe3ea021d..3e34a4c892 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion2.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2 -{ - [Serializable] - [HierarchyRoot] - public sealed class Status : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - [Association(PairTo = "Statuses")] - public EntitySet AssociatedContent { get; private set; } - - public override string ToString() - { - return Title; - } - } - - [Serializable] - [HierarchyRoot] - public class Content : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - public EntitySet Statuses { get; private set; } - - public override string ToString() - { - return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); - } - } - - [Serializable] - public class NewMedia : Content - { - [Field] - public string Data { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2 +{ + [Serializable] + [HierarchyRoot] + public sealed class Status : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + [Association(PairTo = "Statuses")] + public EntitySet AssociatedContent { get; private set; } + + public override string ToString() + { + return Title; + } + } + + [Serializable] + [HierarchyRoot] + public class Content : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + public EntitySet Statuses { get; private set; } + + public override string ToString() + { + return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); + } + } + + [Serializable] + public class NewMedia : Content + { + [Field] + public string Data { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion3.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion3.cs index 9a9327f84e..c50971dff8 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion3.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/ModelVersion3.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version3 -{ - [Serializable] - [HierarchyRoot] - public sealed class Status : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - [Association(PairTo = "Statuses")] - public EntitySet AssociatedContent { get; private set; } - - public override string ToString() - { - return Title; - } - } - - [Serializable] - [HierarchyRoot] - public class Content : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - public EntitySet Statuses { get; private set; } - - public override string ToString() - { - return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); - } - } - - [Serializable] - public class NewMedia : Content - { - [Field] - public string Data { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version3 +{ + [Serializable] + [HierarchyRoot] + public sealed class Status : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + [Association(PairTo = "Statuses")] + public EntitySet AssociatedContent { get; private set; } + + public override string ToString() + { + return Title; + } + } + + [Serializable] + [HierarchyRoot] + public class Content : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + public EntitySet Statuses { get; private set; } + + public override string ToString() + { + return string.Format("{0} (Statuses: {1})", Title, Statuses.ToCommaDelimitedString()); + } + } + + [Serializable] + public class NewMedia : Content + { + [Field] + public string Data { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/UpgradeTest.cs index 1ea6576476..3d55f32612 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/UpgradeTest.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; -using Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; -using M3 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version3; -using NUnit.Framework; -using Content = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2.Content; -using Status = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1.Status; - -namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var status = new Status() {Title = "Status"}; - var media = new Media() {Title = "Media", Data = "Data"}; - media.Statuses.Add(status); - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) - { - using (session.OpenTransaction()) - { - var status = session.Query.All().SingleOrDefault(); - var newMedia = session.Query.All().SingleOrDefault(); - var newMediaTricky = session.Query.All().Where(c => c.Title == "Media").SingleOrDefault(); - - int statusCount = session.Query.All().Count(); - int statusAssociationCount = status != null ? status.AssociatedContent.Count() : 0; - int newMediaCount = session.Query.All().Count(); - - Assert.IsNotNull(status); - Assert.IsNull(newMedia); - Assert.IsNull(newMediaTricky); - Assert.AreEqual(1, statusCount); - Assert.AreEqual(0, newMediaCount); - Assert.AreEqual(0, statusAssociationCount); - } - } - } - - [Test, Ignore("Default behavior changed. Namespace-only renames are tracked automatically.")] - public void UpgradeToVersion3Test() - { - BuildDomain("3", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - // No version-to-version hints, so all the types are removed - var status = session.Query.All().FirstOrDefault(); - var newMedia = session.Query.All().FirstOrDefault(); - var newMediaTricky = session.Query.All().FirstOrDefault(); - - int statusCount = session.Query.All().Count(); - int statusAssociationCount = status!=null ? status.AssociatedContent.Count() : 0; - int newMediaCount = session.Query.All().Count(); - - Assert.IsNull(status); - Assert.IsNull(newMedia); - Assert.IsNull(newMediaTricky); - Assert.AreEqual(0, statusCount); - Assert.AreEqual(0, newMediaCount); - Assert.AreEqual(0, statusAssociationCount); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(Model.Version1.Content).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; +using Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; +using M3 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version3; +using NUnit.Framework; +using Content = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2.Content; +using Status = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1.Status; + +namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var status = new Status() {Title = "Status"}; + var media = new Media() {Title = "Media", Data = "Data"}; + media.Statuses.Add(status); + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) + { + using (session.OpenTransaction()) + { + var status = session.Query.All().SingleOrDefault(); + var newMedia = session.Query.All().SingleOrDefault(); + var newMediaTricky = session.Query.All().Where(c => c.Title == "Media").SingleOrDefault(); + + int statusCount = session.Query.All().Count(); + int statusAssociationCount = status != null ? status.AssociatedContent.Count() : 0; + int newMediaCount = session.Query.All().Count(); + + Assert.IsNotNull(status); + Assert.IsNull(newMedia); + Assert.IsNull(newMediaTricky); + Assert.AreEqual(1, statusCount); + Assert.AreEqual(0, newMediaCount); + Assert.AreEqual(0, statusAssociationCount); + } + } + } + + [Test, Ignore("Default behavior changed. Namespace-only renames are tracked automatically.")] + public void UpgradeToVersion3Test() + { + BuildDomain("3", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + // No version-to-version hints, so all the types are removed + var status = session.Query.All().FirstOrDefault(); + var newMedia = session.Query.All().FirstOrDefault(); + var newMediaTricky = session.Query.All().FirstOrDefault(); + + int statusCount = session.Query.All().Count(); + int statusAssociationCount = status!=null ? status.AssociatedContent.Count() : 0; + int newMediaCount = session.Query.All().Count(); + + Assert.IsNull(status); + Assert.IsNull(newMedia); + Assert.IsNull(newMediaTricky); + Assert.AreEqual(0, statusCount); + Assert.AreEqual(0, newMediaCount); + Assert.AreEqual(0, statusAssociationCount); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(Model.Version1.Content).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/Upgrader.cs index 78d9379b23..155483f355 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0694_SchemaUpgradeBug/Upgrader.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Collections; -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - else if (runningVersion=="3") - return; - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - var hints = GetTypeRenameHints(".Version1", ".Version2"); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Collections; +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0694_SchemaUpgradeBug +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + else if (runningVersion=="3") + return; + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + var hints = GetTypeRenameHints(".Version1", ".Version2"); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion1.cs index 137ee32fe1..6a1eb455c8 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion1.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1 -{ - [Serializable] - [HierarchyRoot] - public class Article : Entity - { - [Key, Field] - public long Id { get; private set; } - - [FullText("English")] - [Field] - public string Title { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1 +{ + [Serializable] + [HierarchyRoot] + public class Article : Entity + { + [Key, Field] + public long Id { get; private set; } + + [FullText("English")] + [Field] + public string Title { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion2.cs index b75a24a55d..94714c87f6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/ModelVersion2.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2 -{ - [Serializable] - [HierarchyRoot] - public class Article : Entity - { - [Key, Field] - public long Id { get; private set; } - - [FullText("English")] - [Field] - public string Title { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2 +{ + [Serializable] + [HierarchyRoot] + public class Article : Entity + { + [Key, Field] + public long Id { get; private set; } + + [FullText("English")] + [Field] + public string Title { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/UpgradeTest.cs index 427504bd04..213bc6b659 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/UpgradeTest.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; -using Xtensive.Orm.Providers; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode -{ - [TestFixture] - [Ignore("Outdated")] - // Alowing behavior when types moved to different namespace - // can cause problems and corrupt data in database which is unacceptable. - // Relying on t - // As long as Validate mode is expected to be strict we have to forbid - // cases when cross-namespace movements appear. - - public class UpgradeTest - { - private Domain domain; - - [OneTimeSetUp] - public void TestSetUp() - { - Require.AllFeaturesSupported(ProviderFeatures.FullText); - } - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var acticle = new Article(); - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Validate); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - Assert.AreEqual(1, session.Query.All().Count()); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(Article).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; +using Xtensive.Orm.Providers; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode +{ + [TestFixture] + [Ignore("Outdated")] + // Alowing behavior when types moved to different namespace + // can cause problems and corrupt data in database which is unacceptable. + // Relying on t + // As long as Validate mode is expected to be strict we have to forbid + // cases when cross-namespace movements appear. + + public class UpgradeTest + { + private Domain domain; + + [OneTimeSetUp] + public void TestSetUp() + { + Require.AllFeaturesSupported(ProviderFeatures.FullText); + } + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var acticle = new Article(); + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Validate); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + Assert.AreEqual(1, session.Query.All().Count()); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(Article).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/Upgrader.cs index a136b92990..3d003857bd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0716_UpgradeFailsInValidateMode/Upgrader.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - var hints = GetTypeRenameHints("Version1", "Version2"); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var extractedDomainModel = upgradeContext.ExtractedDomainModel; - if (extractedDomainModel==null) - return new List(); // Handler is invoked in Validate or Skip mode - - var oldTypes = extractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - if (name == "Acticle") - name = "Article"; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0716_UpgradeFailsInValidateMode +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + var hints = GetTypeRenameHints("Version1", "Version2"); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var extractedDomainModel = upgradeContext.ExtractedDomainModel; + if (extractedDomainModel==null) + return new List(); // Handler is invoked in Validate or Skip mode + + var oldTypes = extractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + if (name == "Acticle") + name = "Article"; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion1.cs index c1ca48fb73..89eaee2b10 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion1.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1 -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public int? Age { get; set; } - - [Field] - public Person Friend { get; set; } - - [Field(Length = int.MaxValue)] - public Byte[] Bytes { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1 +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public int? Age { get; set; } + + [Field] + public Person Friend { get; set; } + + [Field(Length = int.MaxValue)] + public Byte[] Bytes { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion2.cs index 4b07b61be7..be285df7d3 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/ModelVersion2.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2 -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field(DefaultValue = -1)] - public int Age { get; set; } - - [Field(Nullable = false, NullableOnUpgrade = true)] - public Person Friend { get; set; } - - [Field(Nullable = false, DefaultValue = new byte[] {0} )] - public Byte[] Bytes { get; set; } - - // Default definitions - - [Field(Nullable = false, DefaultValue = "A")] - public string DefaultTest1 { get; set; } - - [Field(DefaultValue = (byte) 1)] - public byte DefaultTest2 { get; set; } - - [Field(DefaultValue = "1900.01.01")] - public DateTime DefaultTest3 { get; set; } - - [Field] - public PersonData DefaultTest4 { get; set; } - } - - public sealed class PersonData : Structure - { - [Field(Nullable = false, DefaultValue = "A")] - public string DefaultTest1 { get; set; } - - [Field(DefaultValue = (byte) 1)] - public byte DefaultTest2 { get; set; } - - [Field(DefaultValue = "1900.01.01")] - public DateTime DefaultTest3 { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2 +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field(DefaultValue = -1)] + public int Age { get; set; } + + [Field(Nullable = false, NullableOnUpgrade = true)] + public Person Friend { get; set; } + + [Field(Nullable = false, DefaultValue = new byte[] {0} )] + public Byte[] Bytes { get; set; } + + // Default definitions + + [Field(Nullable = false, DefaultValue = "A")] + public string DefaultTest1 { get; set; } + + [Field(DefaultValue = (byte) 1)] + public byte DefaultTest2 { get; set; } + + [Field(DefaultValue = "1900.01.01")] + public DateTime DefaultTest3 { get; set; } + + [Field] + public PersonData DefaultTest4 { get; set; } + } + + public sealed class PersonData : Structure + { + [Field(Nullable = false, DefaultValue = "A")] + public string DefaultTest1 { get; set; } + + [Field(DefaultValue = (byte) 1)] + public byte DefaultTest2 { get; set; } + + [Field(DefaultValue = "1900.01.01")] + public DateTime DefaultTest3 { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/UpgradeTest.cs index 96b94425fd..8d840bf558 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/UpgradeTest.cs @@ -1,118 +1,118 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var person1 = new Model.Version1.Person { - Name = "Person", - Age = 30, - Bytes = new byte[] {1,2,3} - }; - var person2 = new Model.Version1.Person(); - person1.Friend = person2; - person2.Friend = person1; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var persons = ( - from p in session.Query.All() - orderby p.Name - select p - ).ToList(); - Assert.AreEqual(3, persons.Count); - - var none = persons[1]; - var person1 = persons[2]; - var person2 = persons[0]; - var person3 = new Person() {Friend = person1}; - - Assert.IsNull(person3.Name); - person3.Name = string.Empty; - - persons.Add(person3); - Session.Demand().SaveChanges(); - - Assert.AreEqual("Person", person1.Name); - Assert.AreEqual(30, person1.Age); - Assert.AreEqual(person2, person1.Friend); - AssertEx.HasSameElements(new byte[] {1,2,3}, person1.Bytes); - - Assert.AreEqual(string.Empty, person2.Name); - Assert.AreEqual(-1, person2.Age); - Assert.AreEqual(person1, person2.Friend); - - Assert.AreEqual(string.Empty, person3.Name); - Assert.AreEqual(-1, person3.Age); - Assert.AreEqual(person1, person3.Friend); - - Assert.AreEqual("None", none.Name); - Assert.AreEqual(-1, none.Age); - Assert.AreEqual(none, none.Friend); - - foreach (var person in persons) { - Assert.AreEqual("A", person.DefaultTest1); - Assert.AreEqual(1, person.DefaultTest2); - Assert.AreEqual(new DateTime(1900,01,01), person.DefaultTest3); - if (person.Bytes.Length!=3) - AssertEx.HasSameElements(new byte[] {0}, person.Bytes); - // Structure defaults test - Assert.AreEqual("A", person.DefaultTest4.DefaultTest1); - Assert.AreEqual(1, person.DefaultTest4.DefaultTest2); - Assert.AreEqual(new DateTime(1900,01,01), person.DefaultTest4.DefaultTest3); - } - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(Model.Version1.Person).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var person1 = new Model.Version1.Person { + Name = "Person", + Age = 30, + Bytes = new byte[] {1,2,3} + }; + var person2 = new Model.Version1.Person(); + person1.Friend = person2; + person2.Friend = person1; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var persons = ( + from p in session.Query.All() + orderby p.Name + select p + ).ToList(); + Assert.AreEqual(3, persons.Count); + + var none = persons[1]; + var person1 = persons[2]; + var person2 = persons[0]; + var person3 = new Person() {Friend = person1}; + + Assert.IsNull(person3.Name); + person3.Name = string.Empty; + + persons.Add(person3); + Session.Demand().SaveChanges(); + + Assert.AreEqual("Person", person1.Name); + Assert.AreEqual(30, person1.Age); + Assert.AreEqual(person2, person1.Friend); + AssertEx.HasSameElements(new byte[] {1,2,3}, person1.Bytes); + + Assert.AreEqual(string.Empty, person2.Name); + Assert.AreEqual(-1, person2.Age); + Assert.AreEqual(person1, person2.Friend); + + Assert.AreEqual(string.Empty, person3.Name); + Assert.AreEqual(-1, person3.Age); + Assert.AreEqual(person1, person3.Friend); + + Assert.AreEqual("None", none.Name); + Assert.AreEqual(-1, none.Age); + Assert.AreEqual(none, none.Friend); + + foreach (var person in persons) { + Assert.AreEqual("A", person.DefaultTest1); + Assert.AreEqual(1, person.DefaultTest2); + Assert.AreEqual(new DateTime(1900,01,01), person.DefaultTest3); + if (person.Bytes.Length!=3) + AssertEx.HasSameElements(new byte[] {0}, person.Bytes); + // Structure defaults test + Assert.AreEqual("A", person.DefaultTest4.DefaultTest1); + Assert.AreEqual(1, person.DefaultTest4.DefaultTest2); + Assert.AreEqual(new DateTime(1900,01,01), person.DefaultTest4.DefaultTest3); + } + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(Model.Version1.Person).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/Upgrader.cs index fc5c976d8c..0f797524d6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0743_UpgradeToNonNullableTypes/Upgrader.cs @@ -1,116 +1,116 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 - - if (runningVersion=="2") { - // Upgrading Person.Friend - var none = new Person {Name = "None"}; - none.Friend = none; - ( from p in Session.Demand().Query.All() - where p.Friend==null - select p - ).ForEach(p => { p.Friend = none; }); - } - -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - var hints = GetTypeRenameHints("Version1", "Version2"); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0743_UpgradeToNonNullableTypes +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(global::Xtensive.Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 + + if (runningVersion=="2") { + // Upgrading Person.Friend + var none = new Person {Name = "None"}; + none.Friend = none; + ( from p in Session.Demand().Query.All() + where p.Friend==null + select p + ).ForEach(p => { p.Friend = none; }); + } + +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + var hints = GetTypeRenameHints("Version1", "Version2"); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion1.cs index ee4c03e3c5..d6f230fc3a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion1.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1 -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public byte[] Bytes { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1 +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public byte[] Bytes { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion2.cs index 9f979133ac..f4f16e36dc 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/ModelVersion2.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Collections; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version2 -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field(Length = Int32.MaxValue)] - public string Name { get; set; } - - [Field(Length = Int32.MaxValue)] - public byte[] Bytes { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Collections; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version2 +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field(Length = Int32.MaxValue)] + public string Name { get; set; } + + [Field(Length = Int32.MaxValue)] + public byte[] Bytes { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/UpgradeTest.cs index 5a9c546fd4..718aee3ca4 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/UpgradeTest.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Upgrade.Model; -using Person = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1.Person; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [OneTimeSetUp] - public void TestSetUp() - { - Require.ProviderIsNot(StorageProvider.Firebird); - } - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var person = new Person { - Name = "Person", - Bytes = new byte[] {1, 2, 3} - }; - - var bytesColumn = GetColumnInfo(Upgrader.TargetStorageModel, person.TypeInfo, "Bytes"); - var driver = TestSqlDriver.Create(domain.Configuration.ConnectionInfo); - var expected = driver.TypeMappings[typeof (byte[])].MapType().Length; - Assert.AreEqual(expected, bytesColumn.Type.Length); - - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var person = session.Query.All().Single(); - AssertEx.HasSameElements("Person", person.Name); - AssertEx.HasSameElements(new byte[] {1, 2, 3}, person.Bytes); - - var bytesColumn = GetColumnInfo(Upgrader.TargetStorageModel, person.TypeInfo, "Bytes"); - Assert.AreEqual(null, bytesColumn.Type.Length); - } - } - } - - private StorageColumnInfo GetColumnInfo(StorageModel model, TypeInfo type, string fieldName) - { - var resolver = Upgrader.MappingResolver; - var table = model.Tables[resolver.GetNodeName(type)]; - var field = type.Fields[fieldName]; - return table.Columns[field.MappingName]; - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain!=null) - domain.DisposeSafely(); - - string ns = typeof (Person).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof (Upgrader)); - - using (Upgrader.Enable(version)) - domain = Domain.Build(configuration); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Upgrade.Model; +using Person = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1.Person; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [OneTimeSetUp] + public void TestSetUp() + { + Require.ProviderIsNot(StorageProvider.Firebird); + } + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var person = new Person { + Name = "Person", + Bytes = new byte[] {1, 2, 3} + }; + + var bytesColumn = GetColumnInfo(Upgrader.TargetStorageModel, person.TypeInfo, "Bytes"); + var driver = TestSqlDriver.Create(domain.Configuration.ConnectionInfo); + var expected = driver.TypeMappings[typeof (byte[])].MapType().Length; + Assert.AreEqual(expected, bytesColumn.Type.Length); + + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var person = session.Query.All().Single(); + AssertEx.HasSameElements("Person", person.Name); + AssertEx.HasSameElements(new byte[] {1, 2, 3}, person.Bytes); + + var bytesColumn = GetColumnInfo(Upgrader.TargetStorageModel, person.TypeInfo, "Bytes"); + Assert.AreEqual(null, bytesColumn.Type.Length); + } + } + } + + private StorageColumnInfo GetColumnInfo(StorageModel model, TypeInfo type, string fieldName) + { + var resolver = Upgrader.MappingResolver; + var table = model.Tables[resolver.GetNodeName(type)]; + var field = type.Fields[fieldName]; + return table.Columns[field.MappingName]; + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain!=null) + domain.DisposeSafely(); + + string ns = typeof (Person).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof (Upgrader)); + + using (Upgrader.Enable(version)) + domain = Domain.Build(configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/Upgrader.cs index 2fabe03c5b..976156db30 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0769_ByteArrayColumnUpgrade/Upgrader.cs @@ -1,116 +1,116 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade; -using Xtensive.Orm.Upgrade.Model; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - internal static StorageModel TargetStorageModel; - internal static MappingResolver MappingResolver; - - public override void OnComplete(Domain domain) - { - base.OnComplete(domain); - - TargetStorageModel = UpgradeContext.TargetStorageModel; - MappingResolver = UpgradeContext.Services.MappingResolver; - } - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - var hints = GetTypeRenameHints("Version1", "Version2"); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade; +using Xtensive.Orm.Upgrade.Model; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0769_ByteArrayColumnUpgrade +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + internal static StorageModel TargetStorageModel; + internal static MappingResolver MappingResolver; + + public override void OnComplete(Domain domain) + { + base.OnComplete(domain); + + TargetStorageModel = UpgradeContext.TargetStorageModel; + MappingResolver = UpgradeContext.Services.MappingResolver; + } + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + var hints = GetTypeRenameHints("Version1", "Version2"); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion1.cs index d5deb42253..bcf8fa0983 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion1.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string BaseTitle { get; set; } - } - - public class Derived : Base - { - [Field] - public string DerivedTitle { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string BaseTitle { get; set; } + } + + public class Derived : Base + { + [Field] + public string DerivedTitle { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion2.cs index f42de2f341..19b31c2966 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/ModelVersion2.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string BaseTitle { get; set; } - } - - [HierarchyRoot] - public class Derived : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string BaseTitle { get; set; } - - [Field] - public string DerivedTitle { get;set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string BaseTitle { get; set; } + } + + [HierarchyRoot] + public class Derived : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string BaseTitle { get; set; } + + [Field] + public string DerivedTitle { get;set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/UpgradeTest.cs index 956b1b104b..7970f18009 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/UpgradeTest.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new M1.Base() { BaseTitle = "a.Base"}; - var b = new M1.Derived() { BaseTitle = "b.Base", DerivedTitle = "b.Derived" }; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var a = session.Query.All().SingleOrDefault(); - Assert.IsNotNull(a); - Assert.AreEqual("a.Base", a.BaseTitle); - - var b = session.Query.All().SingleOrDefault(); - Assert.IsNotNull(b); - Assert.AreEqual("b.Base", b.BaseTitle); - Assert.AreEqual("b.Derived", b.DerivedTitle); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Base).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new M1.Base() { BaseTitle = "a.Base"}; + var b = new M1.Derived() { BaseTitle = "b.Base", DerivedTitle = "b.Derived" }; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var a = session.Query.All().SingleOrDefault(); + Assert.IsNotNull(a); + Assert.AreEqual("a.Base", a.BaseTitle); + + var b = session.Query.All().SingleOrDefault(); + Assert.IsNotNull(b); + Assert.AreEqual("b.Base", b.BaseTitle); + Assert.AreEqual("b.Derived", b.DerivedTitle); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Base).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/Upgrader.cs index f040a8485a..e9ed433189 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0837_HintGeneratorBug/Upgrader.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { - // var hints = GetTypeRenameHints("Version1", "Version2"); - var hints = new List(); - hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); - hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); - hints.Add(new CopyFieldHint(typeof (M1.Base).FullName, "BaseTitle", typeof (M2.Derived))); - return hints; - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0834_HintGeneratorBug +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { + // var hints = GetTypeRenameHints("Version1", "Version2"); + var hints = new List(); + hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); + hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); + hints.Add(new CopyFieldHint(typeof (M1.Base).FullName, "BaseTitle", typeof (M2.Derived))); + return hints; + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion1.cs index aee69a3eb8..2cb4499a3f 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion1.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - public class Derived : Base - { - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + public class Derived : Base + { + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion2.cs index 9ce69677cd..56d074b956 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/ModelVersion2.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2 -{ - [HierarchyRoot] - public class Derived : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - [HierarchyRoot] - [Recycled, Obsolete] - public class RecycledBase : Entity - { - [Field, Key] - public long Id { get; private set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2 +{ + [HierarchyRoot] + public class Derived : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + [HierarchyRoot] + [Recycled, Obsolete] + public class RecycledBase : Entity + { + [Field, Key] + public long Id { get; private set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/UpgradeTest.cs index dd1bfc55d5..656eee400d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/UpgradeTest.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new M1.Base(); - var b = new M1.Derived() { Text = "B" }; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var b = session.Query.All().SingleOrDefault(); - Assert.IsNotNull(b); - Assert.AreEqual("B", b.Text); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Base).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new M1.Base(); + var b = new M1.Derived() { Text = "B" }; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var b = session.Query.All().SingleOrDefault(); + Assert.IsNotNull(b); + Assert.AreEqual("B", b.Text); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Base).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/Upgrader.cs index f924bcfa0b..a549445984 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug/Upgrader.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { - if (runningVersion=="2") - Version1To2Hints.ForEach(hint => hints.Add(hint)); - } - - public override void OnUpgrade() - { -#pragma warning disable 612,618 -#pragma warning restore 612,618 - } - - private static List Version1To2Hints { - get { -#pragma warning disable 612,618 - // var hints = GetTypeRenameHints("Version1", "Version2"); - var hints = new List(); - hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.RecycledBase))); - hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); - hints.Add(new CopyFieldHint(typeof (M1.Derived).FullName, "Text", typeof (M2.Derived))); - return hints; -#pragma warning restore 612,618 - } - } - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { + if (runningVersion=="2") + Version1To2Hints.ForEach(hint => hints.Add(hint)); + } + + public override void OnUpgrade() + { +#pragma warning disable 612,618 +#pragma warning restore 612,618 + } + + private static List Version1To2Hints { + get { +#pragma warning disable 612,618 + // var hints = GetTypeRenameHints("Version1", "Version2"); + var hints = new List(); + hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.RecycledBase))); + hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); + hints.Add(new CopyFieldHint(typeof (M1.Derived).FullName, "Text", typeof (M2.Derived))); + return hints; +#pragma warning restore 612,618 + } + } + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion1.cs index 3692649537..fb1393a3b6 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion1.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - public class Derived : Base - { - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + public class Derived : Base + { + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion2.cs index 36edf37785..59ad5f4616 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/ModelVersion2.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - // It's necessary to keep it till the final stage of upgrade - [HierarchyRoot] - [Recycled, Obsolete] - public class Derived : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + // It's necessary to keep it till the final stage of upgrade + [HierarchyRoot] + [Recycled, Obsolete] + public class Derived : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/UpgradeTest.cs index 56025deb07..b152fe2408 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/UpgradeTest.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2 -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [OneTimeSetUp] - public void TestSetUp() - { - Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); - } - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new M1.Base(); - var b = new M1.Derived() { Text = "B" }; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var a = session.Query.All().SingleOrDefault(e => e.Text==null); - var b = session.Query.All().SingleOrDefault(e => e.Text!=null); - Assert.IsNotNull(a); - Assert.IsNotNull(b); - Assert.AreEqual("B", b.Text); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Base).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2 +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [OneTimeSetUp] + public void TestSetUp() + { + Require.AllFeaturesSupported(ProviderFeatures.UpdateFrom); + } + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new M1.Base(); + var b = new M1.Derived() { Text = "B" }; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var a = session.Query.All().SingleOrDefault(e => e.Text==null); + var b = session.Query.All().SingleOrDefault(e => e.Text!=null); + Assert.IsNotNull(a); + Assert.IsNotNull(b); + Assert.AreEqual("B", b.Text); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Base).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/Upgrader.cs index e0a17c3a4e..42a6ee118e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug2/Upgrader.cs @@ -1,135 +1,135 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2 -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { -#pragma warning disable 612,618 - // var hints = GetTypeRenameHints("Version1", "Version2"); - hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); - hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); -#pragma warning restore 612,618 - } - - public override void OnSchemaReady() - { - if (runningVersion!="2") - return; - string baseTableNodePath = "Tables/Base"; - string baseTableColumnPath = "Tables/Base/Columns/"; - string derivedTableNodePath = "Tables/Derived"; - string derivedTableColumnPath = "Tables/Derived/Columns/"; - if (UpgradeContext.Stage==UpgradeStage.Upgrading) { - // Replacing Dervided type's TypeId in Base table - // to Base type's TypeId; if there are many ancestors, - // this action must be performed for each of them. - UpgradeContext.SchemaHints.Add(new UpdateDataHint( - baseTableNodePath, - new List { - new IdentityPair(baseTableColumnPath + "TypeId", - UpgradeContext.ExtractedTypeMap[typeof (M1.Derived).FullName].ToString(), true) - }, - new List> { - new Pair(baseTableColumnPath + "TypeId", - UpgradeContext.ExtractedTypeMap[typeof (M1.Base).FullName]) - })); - } - if (UpgradeContext.Stage==UpgradeStage.Final) { - // Copying the data from "Text" column in "Dervided" table - // to "Base" table - UpgradeContext.SchemaHints.Add(new CopyDataHint( - derivedTableNodePath, - new List { - new IdentityPair( - derivedTableColumnPath + "Id", baseTableColumnPath + "Id", false) - }, - new List> { - new Pair( - derivedTableColumnPath + "Text", baseTableColumnPath + "Text"), - })); - } - } - - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug2 +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { +#pragma warning disable 612,618 + // var hints = GetTypeRenameHints("Version1", "Version2"); + hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); + hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); +#pragma warning restore 612,618 + } + + public override void OnSchemaReady() + { + if (runningVersion!="2") + return; + string baseTableNodePath = "Tables/Base"; + string baseTableColumnPath = "Tables/Base/Columns/"; + string derivedTableNodePath = "Tables/Derived"; + string derivedTableColumnPath = "Tables/Derived/Columns/"; + if (UpgradeContext.Stage==UpgradeStage.Upgrading) { + // Replacing Dervided type's TypeId in Base table + // to Base type's TypeId; if there are many ancestors, + // this action must be performed for each of them. + UpgradeContext.SchemaHints.Add(new UpdateDataHint( + baseTableNodePath, + new List { + new IdentityPair(baseTableColumnPath + "TypeId", + UpgradeContext.ExtractedTypeMap[typeof (M1.Derived).FullName].ToString(), true) + }, + new List> { + new Pair(baseTableColumnPath + "TypeId", + UpgradeContext.ExtractedTypeMap[typeof (M1.Base).FullName]) + })); + } + if (UpgradeContext.Stage==UpgradeStage.Final) { + // Copying the data from "Text" column in "Dervided" table + // to "Base" table + UpgradeContext.SchemaHints.Add(new CopyDataHint( + derivedTableNodePath, + new List { + new IdentityPair( + derivedTableColumnPath + "Id", baseTableColumnPath + "Id", false) + }, + new List> { + new Pair( + derivedTableColumnPath + "Text", baseTableColumnPath + "Text"), + })); + } + } + + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion1.cs index 64e6608ab4..ae780f4a1e 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion1.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - public class Derived : Base - { - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + public class Derived : Base + { + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion2.cs index 339e1be98d..cba26771df 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/ModelVersion2.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - // It's necessary to keep it till the final stage of upgrade - [HierarchyRoot] - [Recycled, Obsolete] - public class Derived : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + // It's necessary to keep it till the final stage of upgrade + [HierarchyRoot] + [Recycled, Obsolete] + public class Derived : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/UpgradeTest.cs index cbcb4842e6..0273dc4c4a 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/UpgradeTest.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3 -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [OneTimeSetUp] - public void TestSetUp() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new M1.Base(); - var b = new M1.Derived() { Text = "B" }; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var a = session.Query.All().SingleOrDefault(e => e.Text==null); - var b = session.Query.All().SingleOrDefault(e => e.Text!=null); - Assert.IsNotNull(a); - Assert.IsNotNull(b); - Assert.AreEqual("B", b.Text); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Base).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3 +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [OneTimeSetUp] + public void TestSetUp() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new M1.Base(); + var b = new M1.Derived() { Text = "B" }; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var a = session.Query.All().SingleOrDefault(e => e.Text==null); + var b = session.Query.All().SingleOrDefault(e => e.Text!=null); + Assert.IsNotNull(a); + Assert.IsNotNull(b); + Assert.AreEqual("B", b.Text); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Base).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/Upgrader.cs index 1d71f9c893..2e5f3e1b99 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug3/Upgrader.cs @@ -1,151 +1,151 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Services; -using Xtensive.Orm.Upgrade; -using Xtensive.Sql.Drivers.SqlServer; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3 -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - private static string connectionString; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { -#pragma warning disable 612,618 - // var hints = GetTypeRenameHints("Version1", "Version2"); - hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); - hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); -#pragma warning restore 612,618 - } - - public override void OnBeforeStage() - { - base.OnBeforeStage(); - - if (runningVersion!="2") - return; - - if (UpgradeContext.Stage==UpgradeStage.Upgrading) { - // Relying on Metadata.Type, because - // only system types are registered in model @ this stage. - var typeMetadata = UpgradeContext.Metadata.Types; - int baseTypeId = typeMetadata.Single(t => t.Name==typeof(M1.Base).FullName).Id; - int derivedTypeId = typeMetadata.Single(t => t.Name==typeof(M1.Derived).FullName).Id; - using (var connection = new SqlConnection(connectionString)) { - connection.Open(); - using (var command = connection.CreateCommand()) { - command.CommandText = string.Format(@" - UPDATE [dbo].[Base] SET [TypeId] = {0} - WHERE ([Base].[TypeId] = {1}); - ", baseTypeId, derivedTypeId); - command.ExecuteNonQuery(); - } - connection.Close(); - } - } - } - - public override void OnStage() - { - if (runningVersion=="1") { - // Save connection string for future operation. - connectionString = new DriverFactory().GetConnectionString(UpgradeContext.Configuration.ConnectionInfo); - } - - if (runningVersion!="2") - return; - if (UpgradeContext.Stage==UpgradeStage.Upgrading) { - var session = Session.Demand(); - var directSql = session.Services.Demand(); - var command = directSql.CreateCommand(); - command.CommandText = @" - UPDATE [dbo].[Base] SET [Text] = [th].[Text] FROM ( - SELECT [a].[Id], [a].[Text] FROM [dbo].[Derived] [a]) [th] - WHERE ([Base].[Id] = [th].[Id]); - - DELETE FROM [dbo].[Derived]; - "; - command.ExecuteNonQuery(); - } - } - - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Services; +using Xtensive.Orm.Upgrade; +using Xtensive.Sql.Drivers.SqlServer; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug3 +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + private static string connectionString; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { +#pragma warning disable 612,618 + // var hints = GetTypeRenameHints("Version1", "Version2"); + hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); + hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); +#pragma warning restore 612,618 + } + + public override void OnBeforeStage() + { + base.OnBeforeStage(); + + if (runningVersion!="2") + return; + + if (UpgradeContext.Stage==UpgradeStage.Upgrading) { + // Relying on Metadata.Type, because + // only system types are registered in model @ this stage. + var typeMetadata = UpgradeContext.Metadata.Types; + int baseTypeId = typeMetadata.Single(t => t.Name==typeof(M1.Base).FullName).Id; + int derivedTypeId = typeMetadata.Single(t => t.Name==typeof(M1.Derived).FullName).Id; + using (var connection = new SqlConnection(connectionString)) { + connection.Open(); + using (var command = connection.CreateCommand()) { + command.CommandText = string.Format(@" + UPDATE [dbo].[Base] SET [TypeId] = {0} + WHERE ([Base].[TypeId] = {1}); + ", baseTypeId, derivedTypeId); + command.ExecuteNonQuery(); + } + connection.Close(); + } + } + } + + public override void OnStage() + { + if (runningVersion=="1") { + // Save connection string for future operation. + connectionString = new DriverFactory().GetConnectionString(UpgradeContext.Configuration.ConnectionInfo); + } + + if (runningVersion!="2") + return; + if (UpgradeContext.Stage==UpgradeStage.Upgrading) { + var session = Session.Demand(); + var directSql = session.Services.Demand(); + var command = directSql.CreateCommand(); + command.CommandText = @" + UPDATE [dbo].[Base] SET [Text] = [th].[Text] FROM ( + SELECT [a].[Id], [a].[Text] FROM [dbo].[Derived] [a]) [th] + WHERE ([Base].[Id] = [th].[Id]); + + DELETE FROM [dbo].[Derived]; + "; + command.ExecuteNonQuery(); + } + } + + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion1.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion1.cs index 9462238640..f18d4f0e4d 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion1.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion1.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - public class Derived : Base - { - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + public class Derived : Base + { + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion2.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion2.cs index 8573b94666..ef9e530c50 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion2.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/ModelVersion2.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using Xtensive.Core; -using Xtensive.Orm.Upgrade; -using System; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2 -{ - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } - - // It's necessary to keep it till the final stage of upgrade - [HierarchyRoot] - [Recycled, Obsolete] - public class Derived : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Text { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using Xtensive.Core; +using Xtensive.Orm.Upgrade; +using System; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2 +{ + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } + + // It's necessary to keep it till the final stage of upgrade + [HierarchyRoot] + [Recycled, Obsolete] + public class Derived : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Text { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/UpgradeTest.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/UpgradeTest.cs index a8fc00e2ce..16f332c393 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/UpgradeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/UpgradeTest.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4 -{ - [TestFixture] - public class UpgradeTest - { - private Domain domain; - - [SetUp] - public void SetUp() - { - BuildDomain("1", DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new M1.Base(); - var b = new M1.Derived() { Text = "B" }; - tx.Complete(); - } - } - } - - [Test] - public void UpgradeToVersion2Test() - { - BuildDomain("2", DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) { - using (session.OpenTransaction()) { - var a = session.Query.All().SingleOrDefault(e => e.Text==null); - var b = session.Query.All().SingleOrDefault(e => e.Text!=null); - Assert.IsNotNull(a); - Assert.IsNotNull(b); - Assert.AreEqual("B", b.Text); - } - } - } - - private void BuildDomain(string version, DomainUpgradeMode upgradeMode) - { - if (domain != null) - domain.DisposeSafely(); - - string ns = typeof(M1.Base).Namespace; - string nsPrefix = ns.Substring(0, ns.Length - 1); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = upgradeMode; - configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); - configuration.Types.Register(typeof(Upgrader)); - - using (Upgrader.Enable(version)) { - domain = Domain.Build(configuration); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4 +{ + [TestFixture] + public class UpgradeTest + { + private Domain domain; + + [SetUp] + public void SetUp() + { + BuildDomain("1", DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new M1.Base(); + var b = new M1.Derived() { Text = "B" }; + tx.Complete(); + } + } + } + + [Test] + public void UpgradeToVersion2Test() + { + BuildDomain("2", DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) { + using (session.OpenTransaction()) { + var a = session.Query.All().SingleOrDefault(e => e.Text==null); + var b = session.Query.All().SingleOrDefault(e => e.Text!=null); + Assert.IsNotNull(a); + Assert.IsNotNull(b); + Assert.AreEqual("B", b.Text); + } + } + } + + private void BuildDomain(string version, DomainUpgradeMode upgradeMode) + { + if (domain != null) + domain.DisposeSafely(); + + string ns = typeof(M1.Base).Namespace; + string nsPrefix = ns.Substring(0, ns.Length - 1); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = upgradeMode; + configuration.Types.Register(Assembly.GetExecutingAssembly(), nsPrefix + version); + configuration.Types.Register(typeof(Upgrader)); + + using (Upgrader.Enable(version)) { + domain = Domain.Build(configuration); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/Upgrader.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/Upgrader.cs index 93d4e1a786..83ca262520 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/Upgrader.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_0841_HintGeneratorBug4/Upgrader.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Services; -using Xtensive.Orm.Upgrade; -using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1; -using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2; - -namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4 -{ - [Serializable] - public class Upgrader : UpgradeHandler - { - private static bool isEnabled = false; - private static string runningVersion; - - /// Handler is already enabled. - public static IDisposable Enable(string version) - { - if (isEnabled) - throw new InvalidOperationException(); - isEnabled = true; - runningVersion = version; - return new Disposable(_ => { - isEnabled = false; - runningVersion = null; - }); - } - - public override bool IsEnabled { - get { - return isEnabled; - } - } - - protected override string DetectAssemblyVersion() - { - return runningVersion; - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - protected override void AddUpgradeHints(Collections.ISet hints) - { -#pragma warning disable 612,618 - // var hints = GetTypeRenameHints("Version1", "Version2"); - hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); - hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); -#pragma warning restore 612,618 - } - - public override void OnStage() - { - if (runningVersion!="2") - return; -#pragma warning disable 612,618 - if (UpgradeContext.Stage==UpgradeStage.Upgrading) { - foreach (var derived in Query.All()) { - new M2.Base {Text = derived.Text}; - } -#pragma warning restore 612,618 - } - } - - - private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) - { - var upgradeContext = UpgradeContext.Demand(); - var oldTypes = upgradeContext.ExtractedDomainModel.Types; - var hints = new List(); - foreach (var type in oldTypes) { - var fullName = type.UnderlyingType; - int lastDotIndex = fullName.LastIndexOf("."); - if (lastDotIndex<0) - lastDotIndex = 1; - var ns = fullName.Substring(0, lastDotIndex); - var name = fullName.Substring(lastDotIndex + 1); - if (ns.EndsWith(oldVersionSuffix)) { - string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; - string newFullName = newNs + "." + name; - Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); - if (newType!=null) - hints.Add(new RenameTypeHint(fullName, newType)); - } - } - return hints; - } - - public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - string suffix = ".Version" + runningVersion; - var originalNamespace = type.Namespace; - var nameSpace = originalNamespace.TryCutSuffix(suffix); - return nameSpace!=originalNamespace - && base.IsTypeAvailable(type, upgradeStage); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Services; +using Xtensive.Orm.Upgrade; +using M1 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version1; +using M2 = Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4.Model.Version2; + +namespace Xtensive.Orm.Tests.Issues.Issue_0841_HintGeneratorBug4 +{ + [Serializable] + public class Upgrader : UpgradeHandler + { + private static bool isEnabled = false; + private static string runningVersion; + + /// Handler is already enabled. + public static IDisposable Enable(string version) + { + if (isEnabled) + throw new InvalidOperationException(); + isEnabled = true; + runningVersion = version; + return new Disposable(_ => { + isEnabled = false; + runningVersion = null; + }); + } + + public override bool IsEnabled { + get { + return isEnabled; + } + } + + protected override string DetectAssemblyVersion() + { + return runningVersion; + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + protected override void AddUpgradeHints(Collections.ISet hints) + { +#pragma warning disable 612,618 + // var hints = GetTypeRenameHints("Version1", "Version2"); + hints.Add(new RenameTypeHint(typeof (M1.Base).FullName, typeof (M2.Base))); + hints.Add(new RenameTypeHint(typeof (M1.Derived).FullName, typeof (M2.Derived))); +#pragma warning restore 612,618 + } + + public override void OnStage() + { + if (runningVersion!="2") + return; +#pragma warning disable 612,618 + if (UpgradeContext.Stage==UpgradeStage.Upgrading) { + foreach (var derived in Query.All()) { + new M2.Base {Text = derived.Text}; + } +#pragma warning restore 612,618 + } + } + + + private static List GetTypeRenameHints(string oldVersionSuffix, string newVersionSuffix) + { + var upgradeContext = UpgradeContext.Demand(); + var oldTypes = upgradeContext.ExtractedDomainModel.Types; + var hints = new List(); + foreach (var type in oldTypes) { + var fullName = type.UnderlyingType; + int lastDotIndex = fullName.LastIndexOf("."); + if (lastDotIndex<0) + lastDotIndex = 1; + var ns = fullName.Substring(0, lastDotIndex); + var name = fullName.Substring(lastDotIndex + 1); + if (ns.EndsWith(oldVersionSuffix)) { + string newNs = ns.Substring(0, ns.Length - oldVersionSuffix.Length) + newVersionSuffix; + string newFullName = newNs + "." + name; + Type newType = upgradeContext.Configuration.Types.SingleOrDefault(t => t.FullName==newFullName); + if (newType!=null) + hints.Add(new RenameTypeHint(fullName, newType)); + } + } + return hints; + } + + public override bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + string suffix = ".Version" + runningVersion; + var originalNamespace = type.Namespace; + var nameSpace = originalNamespace.TryCutSuffix(suffix); + return nameSpace!=originalNamespace + && base.IsTypeAvailable(type, upgradeStage); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_OfTypeMissesImplementors.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_OfTypeMissesImplementors.cs index c8454cbc4f..5bd8fff4a3 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/Issue_OfTypeMissesImplementors.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_OfTypeMissesImplementors.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.08.21 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.Issue_OfTypeMissesImplementors_Model; - -namespace Xtensive.Orm.Tests.Issues.Issue_OfTypeMissesImplementors_Model -{ - public interface IHasImplementors : IEntity - { - - } - - [HierarchyRoot] - public abstract class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class Branch1 : Root, IHasImplementors - { - [Field] - public string Name1 { get; set; } - } - - public abstract class Branch2 : Root, IHasImplementors - { - [Field] - public string Name1 { get; set; } - - } - - public class Node1 : Branch2 - { - [Field] - public string Name2 { get; set; } - - } - - public class Node2 : Branch2 - { - [Field] - public string Name2 { get; set; } - } - - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public IHasImplementors Reference { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class Issue_OfTypeMissesImplementors : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Root).Assembly, typeof (Root).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (Domain.OpenSession()) { - using (var t = Session.Current.OpenTransaction()) { - - var c = new Container(); - new Branch1(); - new Node1(); - c.Reference = new Node2(); - - Session.Current.SaveChanges(); - - var items = Query.All().Where(e => e is IHasImplementors).ToList(); - Assert.AreEqual(3, items.Count); - - t.Complete(); - } - } - - using (Domain.OpenSession()) { - using (var t = Session.Current.OpenTransaction()) { - - var c = Query.All().First(); - Assert.IsNotNull(c.Reference); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.08.21 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.Issue_OfTypeMissesImplementors_Model; + +namespace Xtensive.Orm.Tests.Issues.Issue_OfTypeMissesImplementors_Model +{ + public interface IHasImplementors : IEntity + { + + } + + [HierarchyRoot] + public abstract class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class Branch1 : Root, IHasImplementors + { + [Field] + public string Name1 { get; set; } + } + + public abstract class Branch2 : Root, IHasImplementors + { + [Field] + public string Name1 { get; set; } + + } + + public class Node1 : Branch2 + { + [Field] + public string Name2 { get; set; } + + } + + public class Node2 : Branch2 + { + [Field] + public string Name2 { get; set; } + } + + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public IHasImplementors Reference { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class Issue_OfTypeMissesImplementors : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Root).Assembly, typeof (Root).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (Domain.OpenSession()) { + using (var t = Session.Current.OpenTransaction()) { + + var c = new Container(); + new Branch1(); + new Node1(); + c.Reference = new Node2(); + + Session.Current.SaveChanges(); + + var items = Query.All().Where(e => e is IHasImplementors).ToList(); + Assert.AreEqual(3, items.Count); + + t.Complete(); + } + } + + using (Domain.OpenSession()) { + using (var t = Session.Current.OpenTransaction()) { + + var c = Query.All().First(); + Assert.IsNotNull(c.Reference); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/KeyFormatBug.cs b/Orm/Xtensive.Orm.Tests/Issues/KeyFormatBug.cs index 96d4b52bfe..448bdad2f9 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/KeyFormatBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/KeyFormatBug.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.06.11 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues.KeyFormatBug -{ - [Serializable] - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - [Serializable] - public class Child : Base - { - } - - namespace Nested - { - [Serializable] - [HierarchyRoot] - public class Base : Entity - { - [Field, Key] - public long Id { get; private set; } - } - - [Serializable] - public class Child : Base - { - } - } - - [TestFixture] - public class KeyFormatBugTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); - var nestedBaseType = typeof (Nested.Base); - config.Types.Register(nestedBaseType.Assembly, nestedBaseType.Namespace); - config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; - - var persistentType = typeof(Persistent); - var namespaces = ( - from type in config.Types - where persistentType.IsAssignableFrom(type) - select type.Namespace - ).Distinct().ToArray(); - var prefixes = new[] { - "Xtensive.Orm", - "Xtensive.Orm.Metadata", - GetType().Namespace, - }; - var synonyms = - from ns in namespaces - from prefix in prefixes - where ns.StartsWith(prefix) - let tail = ns.Substring(prefix.Length) - let synonym = tail.StartsWith(".") ? tail.Substring(1) : tail - group synonym by ns into g - let shortestSynonymLength = g.Min(s => s.Length) - let shortestSynonym = g.First(s => s.Length==shortestSynonymLength) - select new KeyValuePair(g.Key, shortestSynonym); - foreach (var synonym in synonyms) - config.NamingConvention.NamespaceSynonyms.Add(synonym); - return config; - } - - [Test] - public void CombinedTest() - { - using (var session = Domain.OpenSession()) - using(var tx = session.OpenTransaction()) { - - var entity = new Child(); - var key = entity.Key; - - string formattedKey = key.Format(); - TestLog.Info("Key.ToString() result: {0}", key.ToString()); - TestLog.Info("Key.Format() result: {0}", formattedKey); - Assert.True(formattedKey.Contains("Child")); - Assert.False(formattedKey.Contains("Base")); - - var parsedKey = Key.Parse(Domain, formattedKey); - Assert.AreEqual(key, parsedKey); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.06.11 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues.KeyFormatBug +{ + [Serializable] + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + [Serializable] + public class Child : Base + { + } + + namespace Nested + { + [Serializable] + [HierarchyRoot] + public class Base : Entity + { + [Field, Key] + public long Id { get; private set; } + } + + [Serializable] + public class Child : Base + { + } + } + + [TestFixture] + public class KeyFormatBugTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); + var nestedBaseType = typeof (Nested.Base); + config.Types.Register(nestedBaseType.Assembly, nestedBaseType.Namespace); + config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; + + var persistentType = typeof(Persistent); + var namespaces = ( + from type in config.Types + where persistentType.IsAssignableFrom(type) + select type.Namespace + ).Distinct().ToArray(); + var prefixes = new[] { + "Xtensive.Orm", + "Xtensive.Orm.Metadata", + GetType().Namespace, + }; + var synonyms = + from ns in namespaces + from prefix in prefixes + where ns.StartsWith(prefix) + let tail = ns.Substring(prefix.Length) + let synonym = tail.StartsWith(".") ? tail.Substring(1) : tail + group synonym by ns into g + let shortestSynonymLength = g.Min(s => s.Length) + let shortestSynonym = g.First(s => s.Length==shortestSynonymLength) + select new KeyValuePair(g.Key, shortestSynonym); + foreach (var synonym in synonyms) + config.NamingConvention.NamespaceSynonyms.Add(synonym); + return config; + } + + [Test] + public void CombinedTest() + { + using (var session = Domain.OpenSession()) + using(var tx = session.OpenTransaction()) { + + var entity = new Child(); + var key = entity.Key; + + string formattedKey = key.Format(); + TestLog.Info("Key.ToString() result: {0}", key.ToString()); + TestLog.Info("Key.Format() result: {0}", formattedKey); + Assert.True(formattedKey.Contains("Child")); + Assert.False(formattedKey.Contains("Base")); + + var parsedKey = Key.Parse(Domain, formattedKey); + Assert.AreEqual(key, parsedKey); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/LocalCollectionsTest.cs b/Orm/Xtensive.Orm.Tests/Issues/LocalCollectionsTest.cs index 7766e3ce0e..c9c8fbbcdd 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/LocalCollectionsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/LocalCollectionsTest.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.07.10 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.LocalCollectionsTest_Model; - -namespace Xtensive.Orm.Tests.Issues.LocalCollectionsTest_Model -{ - [HierarchyRoot] - [Index("Text", Unique = true)] - public class TextEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 250)] - public string Text { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Issues -{ - public class LocalCollectionsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (TextEntity).Assembly, typeof (TextEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var s = Domain.OpenSession()) { - using (var t = s.OpenTransaction()) { - - var strings = new HashSet(); - for (int i = 0; i < 800; i++) { - strings.Add(i.ToString()); - } - - var existing = s.Query.All() - .Where(i => i.Text.In(strings)) - .Select(i => i.Text); - foreach (var text in strings.Except(existing)) { - new TextEntity {Text = text}; - } - t.Complete(); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.07.10 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.LocalCollectionsTest_Model; + +namespace Xtensive.Orm.Tests.Issues.LocalCollectionsTest_Model +{ + [HierarchyRoot] + [Index("Text", Unique = true)] + public class TextEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 250)] + public string Text { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Issues +{ + public class LocalCollectionsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (TextEntity).Assembly, typeof (TextEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var s = Domain.OpenSession()) { + using (var t = s.OpenTransaction()) { + + var strings = new HashSet(); + for (int i = 0; i < 800; i++) { + strings.Add(i.ToString()); + } + + var existing = s.Query.All() + .Where(i => i.Text.In(strings)) + .Select(i => i.Text); + foreach (var text in strings.Except(existing)) { + new TextEntity {Text = text}; + } + t.Complete(); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/NotEqualsForNullableColumnTest.cs b/Orm/Xtensive.Orm.Tests/Issues/NotEqualsForNullableColumnTest.cs index 7b8742833a..2ed47c4c70 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/NotEqualsForNullableColumnTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/NotEqualsForNullableColumnTest.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2011.03.25 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Issues.NotEqualsForNullableColumnTest_Model; -using System.Linq; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace NotEqualsForNullableColumnTest_Model - { - [HierarchyRoot] - public class SomeWithNullable : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field] - public string Tag { get; set; } - - [Field] - public Reference Ref { get; set; } - } - - [HierarchyRoot] - public class Reference : Entity - { - [Field, Key] - public long Id { get; private set; } - } - } - - [Serializable] - public class NotEqualsForNullableColumnTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (SomeWithNullable).Assembly, typeof (SomeWithNullable).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var reference = new Reference(); - new SomeWithNullable {Name = "A"}; - new SomeWithNullable {Name = "A", Tag ="Tag"}; - new SomeWithNullable {Name = "A", Ref = reference}; - new SomeWithNullable {Name = "A", Tag = "Tag", Ref=reference}; - - var result = session.Query.All().Where(s => s.Name == "A").ToList(); - Assert.AreEqual(4, result.Count); - result = session.Query.All().Where(s => s.Name != "B").ToList(); - Assert.AreEqual(4, result.Count); - result = session.Query.All().Where(s => s.Tag != "Tag" || s.Tag == null).ToList(); - Assert.AreEqual(2, result.Count); - result = session.Query.All().Where(s => s.Tag != "!Tag" || s.Tag == null).ToList(); - Assert.AreEqual(4, result.Count); - result = session.Query.All().Where(s => s.Ref == reference).ToList(); - Assert.AreEqual(2, result.Count); - result = session.Query.All().Where(s => s.Ref != reference || s.Ref == null).ToList(); - Assert.AreEqual(2, result.Count); - - t.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2011.03.25 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Issues.NotEqualsForNullableColumnTest_Model; +using System.Linq; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace NotEqualsForNullableColumnTest_Model + { + [HierarchyRoot] + public class SomeWithNullable : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field] + public string Tag { get; set; } + + [Field] + public Reference Ref { get; set; } + } + + [HierarchyRoot] + public class Reference : Entity + { + [Field, Key] + public long Id { get; private set; } + } + } + + [Serializable] + public class NotEqualsForNullableColumnTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (SomeWithNullable).Assembly, typeof (SomeWithNullable).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var reference = new Reference(); + new SomeWithNullable {Name = "A"}; + new SomeWithNullable {Name = "A", Tag ="Tag"}; + new SomeWithNullable {Name = "A", Ref = reference}; + new SomeWithNullable {Name = "A", Tag = "Tag", Ref=reference}; + + var result = session.Query.All().Where(s => s.Name == "A").ToList(); + Assert.AreEqual(4, result.Count); + result = session.Query.All().Where(s => s.Name != "B").ToList(); + Assert.AreEqual(4, result.Count); + result = session.Query.All().Where(s => s.Tag != "Tag" || s.Tag == null).ToList(); + Assert.AreEqual(2, result.Count); + result = session.Query.All().Where(s => s.Tag != "!Tag" || s.Tag == null).ToList(); + Assert.AreEqual(4, result.Count); + result = session.Query.All().Where(s => s.Ref == reference).ToList(); + Assert.AreEqual(2, result.Count); + result = session.Query.All().Where(s => s.Ref != reference || s.Ref == null).ToList(); + Assert.AreEqual(2, result.Count); + + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/StrangeLockingExceptionTest.cs b/Orm/Xtensive.Orm.Tests/Issues/StrangeLockingExceptionTest.cs index 2b9864770f..061c76a767 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/StrangeLockingExceptionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/StrangeLockingExceptionTest.cs @@ -1,149 +1,149 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.20 - -using System; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Issues.StrangeLockingExceptionModel; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace StrangeLockingExceptionModel - { - [Serializable] - [HierarchyRoot] - public class TestA : Entity - { - public TestA(Session session) : base(session) { } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Val { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class TestB : Entity - { - public TestB(Session session) : base(session) { } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Val { get; set; } - } - } - - public class StrangeLockingExceptionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(TestA).Assembly, typeof(TestA).Namespace); - return configuration; - } - - protected override void CheckRequirements() - { - Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); - } - - protected override void PopulateData() - { - base.PopulateData(); - using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { - using (var transaction = session.OpenTransaction()) { - for (int I = 0; I < 0x01FF; I++) - new TestA(session); - // To much records??? - for (int I = 0; I < 0x01FFF; I++) - new TestB(session); - transaction.Complete(); - } - } - } - - [Test] - public void Test1() - { - using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { - using (sessionA.OpenTransaction()) { - sessionA.Query.All().Count(); - sessionA.Query.All().Count(); - using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { - using (sessionB.OpenTransaction()) { - sessionB.Query.All().Count(); - // Exception - sessionB.Query.All().Count(); - } - } - } - } - } - - [Test] - public void Test2() - { - using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { - sessionA.Query.All().Count(); - sessionA.Query.All().Count(); - - using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { - sessionB.Query.All().Count(); - // Exception - sessionB.Query.All().Count(); - } - } - } - - [Test] - public void Test3() - { - using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads))) { - sessionA.Query.All().Count(); - sessionA.Query.All().Count(); - using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads))) { - sessionB.Query.All().Count(); - sessionB.Query.All().Count(); - } - } - } - - [Test] - public void Test4() - { - Execute(SessionOptions.ServerProfile); - } - - [Test] - public void Test5() - { - Execute(SessionOptions.ClientProfile); - } - - private void Execute(SessionOptions options) - { - Action action = () => { - using (var session = Domain.OpenSession(new SessionConfiguration(options))) { - using (var t = session.OpenTransaction()) { - session.Query.All().ToList(); - // Exception - session.Query.All().ToList(); - t.Complete(); - } - } - }; - Parallel.Invoke(action, action, action, action, action, action); - } - - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.20 + +using System; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Issues.StrangeLockingExceptionModel; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace StrangeLockingExceptionModel + { + [Serializable] + [HierarchyRoot] + public class TestA : Entity + { + public TestA(Session session) : base(session) { } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Val { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class TestB : Entity + { + public TestB(Session session) : base(session) { } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Val { get; set; } + } + } + + public class StrangeLockingExceptionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestA).Assembly, typeof(TestA).Namespace); + return configuration; + } + + protected override void CheckRequirements() + { + Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); + } + + protected override void PopulateData() + { + base.PopulateData(); + using (var session = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { + using (var transaction = session.OpenTransaction()) { + for (int I = 0; I < 0x01FF; I++) + new TestA(session); + // To much records??? + for (int I = 0; I < 0x01FFF; I++) + new TestB(session); + transaction.Complete(); + } + } + } + + [Test] + public void Test1() + { + using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { + using (sessionA.OpenTransaction()) { + sessionA.Query.All().Count(); + sessionA.Query.All().Count(); + using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile))) { + using (sessionB.OpenTransaction()) { + sessionB.Query.All().Count(); + // Exception + sessionB.Query.All().Count(); + } + } + } + } + } + + [Test] + public void Test2() + { + using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { + sessionA.Query.All().Count(); + sessionA.Query.All().Count(); + + using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ClientProfile))) { + sessionB.Query.All().Count(); + // Exception + sessionB.Query.All().Count(); + } + } + } + + [Test] + public void Test3() + { + using (var sessionA = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads))) { + sessionA.Query.All().Count(); + sessionA.Query.All().Count(); + using (var sessionB = Domain.OpenSession(new SessionConfiguration(SessionOptions.ServerProfile | SessionOptions.NonTransactionalReads))) { + sessionB.Query.All().Count(); + sessionB.Query.All().Count(); + } + } + } + + [Test] + public void Test4() + { + Execute(SessionOptions.ServerProfile); + } + + [Test] + public void Test5() + { + Execute(SessionOptions.ClientProfile); + } + + private void Execute(SessionOptions options) + { + Action action = () => { + using (var session = Domain.OpenSession(new SessionConfiguration(options))) { + using (var t = session.OpenTransaction()) { + session.Query.All().ToList(); + // Exception + session.Query.All().ToList(); + t.Complete(); + } + } + }; + Parallel.Invoke(action, action, action, action, action, action); + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Issues/StructureFieldRemoveTest.cs b/Orm/Xtensive.Orm.Tests/Issues/StructureFieldRemoveTest.cs index da015e1e96..5dd1ec519c 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/StructureFieldRemoveTest.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/StructureFieldRemoveTest.cs @@ -1,191 +1,191 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.06 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Orm.Upgrade; -using V1 = Xtensive.Orm.Tests.Issues.StructureFieldRemoveModel1; -using V2 = Xtensive.Orm.Tests.Issues.StructureFieldRemoveModel2; - -namespace Xtensive.Orm.Tests.Issues -{ - namespace StructureFieldRemoveModel1 - { - public class MyStructure1 : Structure - { - [Field] - public Guid GlobalId { get; set; } - - [Field] - public string Name { get; set; } - } - - public class MyStructure2 : Structure - { - [Field] - public MyStructure1 S1 { get; set; } - } - - public class MyStructure3 : Structure - { - [Field] - public MyStructure2 S2 { get; set; } - } - - [HierarchyRoot] - public class StructureOwner : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyStructure1 S1 { get; set; } - - [Field] - public MyStructure2 S2 { get; set; } - - [Field] - public MyStructure3 S3 { get; set; } - - public StructureOwner(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class StructureOwnerToRemove : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyStructure3 S3 { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override string DetectAssemblyVersion() - { - return "2"; - } - } - } - - namespace StructureFieldRemoveModel2 - { - public class MyStructure1 : Structure - { - [Field] - public string Name { get; set; } - } - - public class MyStructure2 : Structure - { - [Field] - public MyStructure1 S1 { get; set; } - } - - public class MyStructure3 : Structure - { - [Field] - public MyStructure2 S2 { get; set; } - } - - [HierarchyRoot] - public class StructureOwner : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyStructure1 S1 { get; set; } - - [Field] - public MyStructure2 S2 { get; set; } - - [Field] - public MyStructure3 S3 { get; set; } - - public StructureOwner(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class StructureOwnerToAdd : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public MyStructure3 S3 { get; set; } - } - - public class Upgrader : UpgradeHandler - { - protected override string DetectAssemblyVersion() - { - return "2"; - } - - protected override void AddUpgradeHints(ISet hints) - { - hints.Add(new RenameTypeHint(typeof (V1.StructureOwner).FullName, typeof (StructureOwner))); - hints.Add(new RenameTypeHint(typeof (V1.MyStructure1).FullName, typeof (MyStructure1))); - hints.Add(new RenameTypeHint(typeof (V1.MyStructure2).FullName, typeof (MyStructure2))); - hints.Add(new RenameTypeHint(typeof (V1.MyStructure3).FullName, typeof (MyStructure3))); - hints.Add(new RemoveTypeHint(typeof (V1.StructureOwnerToRemove).FullName)); - hints.Add(new RemoveFieldHint(typeof (V1.MyStructure1), "GlobalId")); - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - } - } - - [TestFixture] - public class StructureFieldRemoveTest - { - public Domain BuildDomain(Type type, DomainUpgradeMode mode) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = mode; - configuration.Types.Register(type.Assembly, type.Namespace); - return Domain.Build(configuration); - } - - [Test] - public void MainTest() - { - using (var domain = BuildDomain(typeof (V1.StructureOwner), DomainUpgradeMode.Recreate)) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new V1.StructureOwner(session) { - S1 = {GlobalId = Guid.NewGuid(), Name = "S1"}, - S2 = {S1 = {GlobalId = Guid.NewGuid(), Name = "S2"}}, - S3 = {S2 = {S1 = {GlobalId = Guid.NewGuid(), Name = "S3"}}}, - }; - tx.Complete(); - } - - using (var domain = BuildDomain(typeof (V2.StructureOwner), DomainUpgradeMode.PerformSafely)) - using (var sessoin = domain.OpenSession()) - using (var tx = sessoin.OpenTransaction()) { - var owner = sessoin.Query.All().Single(); - Assert.That(owner.S1.Name, Is.EqualTo("S1")); - Assert.That(owner.S2.S1.Name, Is.EqualTo("S2")); - Assert.That(owner.S3.S2.S1.Name, Is.EqualTo("S3")); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.06 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Orm.Upgrade; +using V1 = Xtensive.Orm.Tests.Issues.StructureFieldRemoveModel1; +using V2 = Xtensive.Orm.Tests.Issues.StructureFieldRemoveModel2; + +namespace Xtensive.Orm.Tests.Issues +{ + namespace StructureFieldRemoveModel1 + { + public class MyStructure1 : Structure + { + [Field] + public Guid GlobalId { get; set; } + + [Field] + public string Name { get; set; } + } + + public class MyStructure2 : Structure + { + [Field] + public MyStructure1 S1 { get; set; } + } + + public class MyStructure3 : Structure + { + [Field] + public MyStructure2 S2 { get; set; } + } + + [HierarchyRoot] + public class StructureOwner : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyStructure1 S1 { get; set; } + + [Field] + public MyStructure2 S2 { get; set; } + + [Field] + public MyStructure3 S3 { get; set; } + + public StructureOwner(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class StructureOwnerToRemove : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyStructure3 S3 { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override string DetectAssemblyVersion() + { + return "2"; + } + } + } + + namespace StructureFieldRemoveModel2 + { + public class MyStructure1 : Structure + { + [Field] + public string Name { get; set; } + } + + public class MyStructure2 : Structure + { + [Field] + public MyStructure1 S1 { get; set; } + } + + public class MyStructure3 : Structure + { + [Field] + public MyStructure2 S2 { get; set; } + } + + [HierarchyRoot] + public class StructureOwner : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyStructure1 S1 { get; set; } + + [Field] + public MyStructure2 S2 { get; set; } + + [Field] + public MyStructure3 S3 { get; set; } + + public StructureOwner(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class StructureOwnerToAdd : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public MyStructure3 S3 { get; set; } + } + + public class Upgrader : UpgradeHandler + { + protected override string DetectAssemblyVersion() + { + return "2"; + } + + protected override void AddUpgradeHints(ISet hints) + { + hints.Add(new RenameTypeHint(typeof (V1.StructureOwner).FullName, typeof (StructureOwner))); + hints.Add(new RenameTypeHint(typeof (V1.MyStructure1).FullName, typeof (MyStructure1))); + hints.Add(new RenameTypeHint(typeof (V1.MyStructure2).FullName, typeof (MyStructure2))); + hints.Add(new RenameTypeHint(typeof (V1.MyStructure3).FullName, typeof (MyStructure3))); + hints.Add(new RemoveTypeHint(typeof (V1.StructureOwnerToRemove).FullName)); + hints.Add(new RemoveFieldHint(typeof (V1.MyStructure1), "GlobalId")); + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + } + } + + [TestFixture] + public class StructureFieldRemoveTest + { + public Domain BuildDomain(Type type, DomainUpgradeMode mode) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = mode; + configuration.Types.Register(type.Assembly, type.Namespace); + return Domain.Build(configuration); + } + + [Test] + public void MainTest() + { + using (var domain = BuildDomain(typeof (V1.StructureOwner), DomainUpgradeMode.Recreate)) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new V1.StructureOwner(session) { + S1 = {GlobalId = Guid.NewGuid(), Name = "S1"}, + S2 = {S1 = {GlobalId = Guid.NewGuid(), Name = "S2"}}, + S3 = {S2 = {S1 = {GlobalId = Guid.NewGuid(), Name = "S3"}}}, + }; + tx.Complete(); + } + + using (var domain = BuildDomain(typeof (V2.StructureOwner), DomainUpgradeMode.PerformSafely)) + using (var sessoin = domain.OpenSession()) + using (var tx = sessoin.OpenTransaction()) { + var owner = sessoin.Query.All().Single(); + Assert.That(owner.S1.Name, Is.EqualTo("S1")); + Assert.That(owner.S2.S1.Name, Is.EqualTo("S2")); + Assert.That(owner.S3.S2.S1.Name, Is.EqualTo("S3")); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/AggregateTest.cs b/Orm/Xtensive.Orm.Tests/Linq/AggregateTest.cs index 6dc2683d52..f98bc4f4c2 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/AggregateTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/AggregateTest.cs @@ -1,327 +1,327 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.04 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Orm.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - [Category("Linq")] - public class AggregateTest : ChinookDOModelTest - { - [Test] - public void EntitySetWithGroupingAggregateTest() - { - var query = - Session.Query.All() - .GroupBy(customer => customer.Address.City) - .Select(grouping => grouping.Max(g => g.Invoices)); - - Assert.Throws(() => QueryDumper.Dump(query)); - } - - [Test] - public void SingleAggregateTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Select(o => o.InvoiceLines.Count()); - QueryDumper.Dump(result); - } - - [Test] - public void DualAggregateTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Select(o => new {SUM = o.InvoiceLines.Count(), SUM2 = o.InvoiceLines.Count()}); - QueryDumper.Dump(result); - } - - [Test] - public void EntityNotSupportedTest() - { - AssertEx.Throws(() => Session.Query.All().Max()); - AssertEx.Throws(() => Session.Query.All().Min()); - } - - [Test] - public void IntAverageTest() - { - var avg = Session.Query.All().Average(o => o.InvoiceId); - var expected = Invoices.Average(o => o.InvoiceId); - if (Domain.Configuration.ConnectionInfo.Provider == WellKnown.Provider.Firebird) { - expected = Math.Truncate(expected); - } - Assert.AreEqual(expected, avg); - } - - [Test] - public void SumWithNoArgTest() - { - var result = Session.Query.All().Select(o => o.Commission).Sum(); - var expected = Invoices.Select(o => o.Commission).Sum(); - - Assert.That(result.HasValue); - Assert.That(expected.HasValue); - - var delta = Math.Abs(result.Value - expected.Value); - - // Add some tolerance - Assert.That(delta, Is.LessThan(0.000000001m)); - Assert.Greater(result, 0); - } - - [Test] - public void SumWithArgTest() - { - var sum = Session.Query.All().Sum(o => o.InvoiceId); - var expected = Session.Query.All().ToList().Sum(o => o.InvoiceId); - Assert.AreEqual(expected, sum); - Assert.Greater(sum, 0); - } - - [Test] - public void CountWithNoPredicateTest() - { - var count = Session.Query.All().Count(); - Assert.Greater(count, 0); - } - - [Test] - public void CountWithPredicateTest() - { - var count = Session.Query.All().Count(o => o.InvoiceId > 10); - var expected = Session.Query.All().ToList().Count(o => o.InvoiceId > 10); - Assert.AreEqual(expected, count); - Assert.Greater(count, 0); - } - - [Test] - public void CountAfterFilterTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle | StorageProvider.Sqlite); - - var q = Session.Query; - - var result = q.All().Where(c => q.All().Where(o => o.Customer==c).Count() > 6); - var expected = Customers.Where(c => Invoices.Where(o => o.Customer==c).Count() > 6); - - var list = result.ToList(); - - Assert.AreEqual(0, expected.Except(list).Count()); - QueryDumper.Dump(result); - Assert.Greater(list.Count, 0); - } - - [Test] - public void WhereCountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Where(c => Session.Query.All().Count(o => o.Customer==c) > 5); - var expected = Customers - .Where(c => Invoices - .Count(o => o.Customer==c) > 5); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void WhereCountWithPredicateTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - where Session.Query.All().Count(o => o.Customer==c) > 6 - select c; - var expected = - from c in Customers - where Invoices - .Count(o => o.Customer==c) > 6 - select c; - Assert.AreEqual(0, expected.Except(result).Count()); - - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void WhereMaxWithSelectorTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - where Session.Query.All() - .Where(o => o.Customer==c) - .Max(o => o.InvoiceDate) < new DateTime(2019, 1, 1) - select c; - var expected = - from c in Customers - where c.Invoices.Any() && Invoices - .Where(o => o.Customer==c) - .Max(o => o.InvoiceDate) < new DateTime(2019, 1, 1) - select c; - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void WhereMinWithSelectorTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - where Session.Query.All() - .Where(o => o.Customer==c) - .Min(o => o.Commission) > 0.089m - select c; - var expected = - from c in Customers - where Invoices - .Where(o => o.Customer==c) - .Min(o => o.Commission) > 0.089m - select c; - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void WhereAverageWithSelectorTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - where Session.Query.All() - .Where(o => o.Customer==c) - .Average(o => o.Commission) < 0.3m - select c; - var expected = - from c in Customers - where Invoices - .Where(o => o.Customer==c) - .Average(o => o.Commission) < 0.3m - select c; - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void SelectCountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .Select(c => Session.Query.All().Count()) - .ToList(); - var expected = Customers - .Select(c => Invoices.Count()); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.Count, 0); - } - - [Test] - public void SelectAnonymousCountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - select new { - Customer = c, - NumberOfOrders = Session.Query.All() - .Count(o => o.Customer==c) - }; - var expected = - from c in Customers - select new { - Customer = c, - NumberOfOrders = Invoices - .Count(o => o.Customer==c) - }; - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void SelectMaxTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = from l in Session.Query.All() - select new { - InvoiceLine = l, - MaxID = Session.Query.All() - .Where(s => s==l.Invoice) - .Max(s => s.InvoiceId) - }; - var expected = from l in InvoiceLines - select new { - InvoiceLine = l, - MaxID = Invoices - .Where(s => s==l.Invoice) - .Max(s => s.InvoiceId) - }; - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void SumCountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var expected = Session.Query.All().ToList().Count(); - var count = Session.Query.All() - .Sum(c => Session.Query.All().Count(o => o.Customer==c)); - Assert.AreEqual(expected, count); - } - - [Test] - public void SumMinTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Where(c => c.Invoices.Count > 0) - .Sum(c => Session.Query.All().Where(o => o.Customer==c).Min(o => o.Commission)); - var expected = Customers - .Where(c => c.Invoices.Count > 0) - .Sum(c => Invoices.Where(o => o.Customer==c).Min(o => o.Commission)); - Assert.AreEqual(expected, result); - } - - [Test] - public void MaxCountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Max(c => Session.Query.All().Count(o => o.Customer==c)); - var expected = Customers - .Max(c => Invoices.Count(o => o.Customer==c)); - Assert.AreEqual(expected, result); - } - - [Test] - public void SelectNullableAggregateTest() - { - var result = Session.Query.All() - .Select(o => (int?) o.InvoiceId) - .Sum(); - var expected = Invoices - .Select(o => (int?) o.InvoiceId) - .Sum(); - Assert.AreEqual(expected, result); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.04 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Orm.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + [Category("Linq")] + public class AggregateTest : ChinookDOModelTest + { + [Test] + public void EntitySetWithGroupingAggregateTest() + { + var query = + Session.Query.All() + .GroupBy(customer => customer.Address.City) + .Select(grouping => grouping.Max(g => g.Invoices)); + + Assert.Throws(() => QueryDumper.Dump(query)); + } + + [Test] + public void SingleAggregateTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Select(o => o.InvoiceLines.Count()); + QueryDumper.Dump(result); + } + + [Test] + public void DualAggregateTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Select(o => new {SUM = o.InvoiceLines.Count(), SUM2 = o.InvoiceLines.Count()}); + QueryDumper.Dump(result); + } + + [Test] + public void EntityNotSupportedTest() + { + AssertEx.Throws(() => Session.Query.All().Max()); + AssertEx.Throws(() => Session.Query.All().Min()); + } + + [Test] + public void IntAverageTest() + { + var avg = Session.Query.All().Average(o => o.InvoiceId); + var expected = Invoices.Average(o => o.InvoiceId); + if (Domain.Configuration.ConnectionInfo.Provider == WellKnown.Provider.Firebird) { + expected = Math.Truncate(expected); + } + Assert.AreEqual(expected, avg); + } + + [Test] + public void SumWithNoArgTest() + { + var result = Session.Query.All().Select(o => o.Commission).Sum(); + var expected = Invoices.Select(o => o.Commission).Sum(); + + Assert.That(result.HasValue); + Assert.That(expected.HasValue); + + var delta = Math.Abs(result.Value - expected.Value); + + // Add some tolerance + Assert.That(delta, Is.LessThan(0.000000001m)); + Assert.Greater(result, 0); + } + + [Test] + public void SumWithArgTest() + { + var sum = Session.Query.All().Sum(o => o.InvoiceId); + var expected = Session.Query.All().ToList().Sum(o => o.InvoiceId); + Assert.AreEqual(expected, sum); + Assert.Greater(sum, 0); + } + + [Test] + public void CountWithNoPredicateTest() + { + var count = Session.Query.All().Count(); + Assert.Greater(count, 0); + } + + [Test] + public void CountWithPredicateTest() + { + var count = Session.Query.All().Count(o => o.InvoiceId > 10); + var expected = Session.Query.All().ToList().Count(o => o.InvoiceId > 10); + Assert.AreEqual(expected, count); + Assert.Greater(count, 0); + } + + [Test] + public void CountAfterFilterTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle | StorageProvider.Sqlite); + + var q = Session.Query; + + var result = q.All().Where(c => q.All().Where(o => o.Customer==c).Count() > 6); + var expected = Customers.Where(c => Invoices.Where(o => o.Customer==c).Count() > 6); + + var list = result.ToList(); + + Assert.AreEqual(0, expected.Except(list).Count()); + QueryDumper.Dump(result); + Assert.Greater(list.Count, 0); + } + + [Test] + public void WhereCountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Where(c => Session.Query.All().Count(o => o.Customer==c) > 5); + var expected = Customers + .Where(c => Invoices + .Count(o => o.Customer==c) > 5); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void WhereCountWithPredicateTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + where Session.Query.All().Count(o => o.Customer==c) > 6 + select c; + var expected = + from c in Customers + where Invoices + .Count(o => o.Customer==c) > 6 + select c; + Assert.AreEqual(0, expected.Except(result).Count()); + + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void WhereMaxWithSelectorTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + where Session.Query.All() + .Where(o => o.Customer==c) + .Max(o => o.InvoiceDate) < new DateTime(2019, 1, 1) + select c; + var expected = + from c in Customers + where c.Invoices.Any() && Invoices + .Where(o => o.Customer==c) + .Max(o => o.InvoiceDate) < new DateTime(2019, 1, 1) + select c; + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void WhereMinWithSelectorTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + where Session.Query.All() + .Where(o => o.Customer==c) + .Min(o => o.Commission) > 0.089m + select c; + var expected = + from c in Customers + where Invoices + .Where(o => o.Customer==c) + .Min(o => o.Commission) > 0.089m + select c; + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void WhereAverageWithSelectorTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + where Session.Query.All() + .Where(o => o.Customer==c) + .Average(o => o.Commission) < 0.3m + select c; + var expected = + from c in Customers + where Invoices + .Where(o => o.Customer==c) + .Average(o => o.Commission) < 0.3m + select c; + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void SelectCountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .Select(c => Session.Query.All().Count()) + .ToList(); + var expected = Customers + .Select(c => Invoices.Count()); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.Count, 0); + } + + [Test] + public void SelectAnonymousCountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + select new { + Customer = c, + NumberOfOrders = Session.Query.All() + .Count(o => o.Customer==c) + }; + var expected = + from c in Customers + select new { + Customer = c, + NumberOfOrders = Invoices + .Count(o => o.Customer==c) + }; + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void SelectMaxTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = from l in Session.Query.All() + select new { + InvoiceLine = l, + MaxID = Session.Query.All() + .Where(s => s==l.Invoice) + .Max(s => s.InvoiceId) + }; + var expected = from l in InvoiceLines + select new { + InvoiceLine = l, + MaxID = Invoices + .Where(s => s==l.Invoice) + .Max(s => s.InvoiceId) + }; + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void SumCountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var expected = Session.Query.All().ToList().Count(); + var count = Session.Query.All() + .Sum(c => Session.Query.All().Count(o => o.Customer==c)); + Assert.AreEqual(expected, count); + } + + [Test] + public void SumMinTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Where(c => c.Invoices.Count > 0) + .Sum(c => Session.Query.All().Where(o => o.Customer==c).Min(o => o.Commission)); + var expected = Customers + .Where(c => c.Invoices.Count > 0) + .Sum(c => Invoices.Where(o => o.Customer==c).Min(o => o.Commission)); + Assert.AreEqual(expected, result); + } + + [Test] + public void MaxCountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Max(c => Session.Query.All().Count(o => o.Customer==c)); + var expected = Customers + .Max(c => Invoices.Count(o => o.Customer==c)); + Assert.AreEqual(expected, result); + } + + [Test] + public void SelectNullableAggregateTest() + { + var result = Session.Query.All() + .Select(o => (int?) o.InvoiceId) + .Sum(); + var expected = Invoices + .Select(o => (int?) o.InvoiceId) + .Sum(); + Assert.AreEqual(expected, result); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ArrayTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ArrayTest.cs index d0739f5f5f..c1cb6d7abd 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ArrayTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ArrayTest.cs @@ -1,182 +1,182 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.04.30 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - [Serializable] - public class ArrayTest : ChinookDOModelTest - { - [Test] - public void NewIntArrayTest() - { - var result = Session.Query.All().Select(x => new[] {1, 2}); - foreach (var array in result) { - Assert.AreEqual(2, array.Length); - Assert.AreEqual(1, array[0]); - Assert.AreEqual(2, array[1]); - } - QueryDumper.Dump(result); - } - - [Test] - public void NewByteArrayTest() - { - var result = Session.Query.All().Select(x => new byte[] {1, 2}); - var expected = Session.Query.All().ToList().Select(x => new byte[] {1, 2}); - var comparer = AdvancedComparer.Default.EqualityComparerImplementation; - Assert.AreEqual(0, expected.Except(result, comparer).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void NewStringArrayTest() - { - var result = Session.Query.All() - .Select(customer => new[] { - customer.CompanyName, - customer.LastName - }); - var expected = Session.Query.All() - .ToList() - .Select(customer => new[] { - customer.CompanyName, - customer.LastName - }); - var comparer = AdvancedComparer.Default.EqualityComparerImplementation; - Assert.AreEqual(0, expected.Except(result, comparer).Count()); - QueryDumper.Dump(result); - } - - - [Test] - public void NewByteArrayAnonymousTest() - { - var result = Session.Query.All() - .Select(p => new { - Value = new byte[] {1, 2, 3}, - p.Name - }); - var expected = Session.Query.All() - .ToList() - .Select(p => new { - Value = new byte[] {1, 2, 3}, - p.Name - }); - var list = result.ToList(); - var expectedList = expected.ToList(); - Assert.AreEqual(expectedList.Count, list.Count); - var comparer = AdvancedComparer.Default; - for (int i = 0; i < expectedList.Count; i++) - Assert.IsTrue(comparer.Equals(expectedList[i].Value, list[i].Value)); - QueryDumper.Dump(result); - } - - - [Test] - public void NewArrayConstantTest() - { - var method = MethodInfo.GetCurrentMethod().Name; - var result = - from r in - from p in Session.Query.All() - select new { - Value = new byte[] {1, 2, 3}, - Method = method, - p.Name - } - orderby r.Name - where r.Method==method - select r; - var list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(method, i.Method); - var expected = - from r in - from p in Session.Query.All().ToList() - select new { - Value = new byte[] {1, 2, 3}, - Method = method, - p.Name - } - orderby r.Name - where r.Method==method - select r; - var expectedList = expected.ToList(); - Assert.AreEqual(expectedList.Count, list.Count); - var comparer = AdvancedComparer.Default; - for (int i = 0; i < expectedList.Count; i++) { - var expectedValue = expectedList[i]; - var value = list[i]; - Assert.AreEqual(expectedValue.Method, value.Method); - Assert.IsTrue(comparer.Equals(expectedValue.Value, value.Value)); - } - QueryDumper.Dump(result); - } - - [Test] - public void ArrayMemberAccessTest() - { - var result = Session.Query.All() - .Select(customer => new[] { - customer.CompanyName, - customer.LastName - }) - .Select(a => a[0]); - var expected = Session.Query.All() - .ToList() - .Select(customer => new[] { - customer.CompanyName, - customer.LastName - }) - .Select(a => a[0]); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - [Ignore("Not supported")] - public void ArrayAggregateAccessTest() - { - var result = Session.Query.All() - .Select(x => new byte[] {1, 2}) - .Select(a => a[0]) - .Sum(b => b); - var expected = Session.Query.All() - .ToList() - .Select(x => new byte[] {1, 2}) - .Select(a => a[0]) - .Sum(b => b); - Assert.AreEqual(expected, result); - QueryDumper.Dump(result); - } - - [Test] - [Ignore("Not supported")] - public void ArrayExpressionIndexAccessTest() - { - var bytes = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; - var result = Session.Query.All() - .Select(e => bytes[e.EmployeeId]); - var expected = Session.Query.All() - .ToList() - .Select(e => bytes[e.EmployeeId]); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.04.30 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + [Serializable] + public class ArrayTest : ChinookDOModelTest + { + [Test] + public void NewIntArrayTest() + { + var result = Session.Query.All().Select(x => new[] {1, 2}); + foreach (var array in result) { + Assert.AreEqual(2, array.Length); + Assert.AreEqual(1, array[0]); + Assert.AreEqual(2, array[1]); + } + QueryDumper.Dump(result); + } + + [Test] + public void NewByteArrayTest() + { + var result = Session.Query.All().Select(x => new byte[] {1, 2}); + var expected = Session.Query.All().ToList().Select(x => new byte[] {1, 2}); + var comparer = AdvancedComparer.Default.EqualityComparerImplementation; + Assert.AreEqual(0, expected.Except(result, comparer).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void NewStringArrayTest() + { + var result = Session.Query.All() + .Select(customer => new[] { + customer.CompanyName, + customer.LastName + }); + var expected = Session.Query.All() + .ToList() + .Select(customer => new[] { + customer.CompanyName, + customer.LastName + }); + var comparer = AdvancedComparer.Default.EqualityComparerImplementation; + Assert.AreEqual(0, expected.Except(result, comparer).Count()); + QueryDumper.Dump(result); + } + + + [Test] + public void NewByteArrayAnonymousTest() + { + var result = Session.Query.All() + .Select(p => new { + Value = new byte[] {1, 2, 3}, + p.Name + }); + var expected = Session.Query.All() + .ToList() + .Select(p => new { + Value = new byte[] {1, 2, 3}, + p.Name + }); + var list = result.ToList(); + var expectedList = expected.ToList(); + Assert.AreEqual(expectedList.Count, list.Count); + var comparer = AdvancedComparer.Default; + for (int i = 0; i < expectedList.Count; i++) + Assert.IsTrue(comparer.Equals(expectedList[i].Value, list[i].Value)); + QueryDumper.Dump(result); + } + + + [Test] + public void NewArrayConstantTest() + { + var method = MethodInfo.GetCurrentMethod().Name; + var result = + from r in + from p in Session.Query.All() + select new { + Value = new byte[] {1, 2, 3}, + Method = method, + p.Name + } + orderby r.Name + where r.Method==method + select r; + var list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(method, i.Method); + var expected = + from r in + from p in Session.Query.All().ToList() + select new { + Value = new byte[] {1, 2, 3}, + Method = method, + p.Name + } + orderby r.Name + where r.Method==method + select r; + var expectedList = expected.ToList(); + Assert.AreEqual(expectedList.Count, list.Count); + var comparer = AdvancedComparer.Default; + for (int i = 0; i < expectedList.Count; i++) { + var expectedValue = expectedList[i]; + var value = list[i]; + Assert.AreEqual(expectedValue.Method, value.Method); + Assert.IsTrue(comparer.Equals(expectedValue.Value, value.Value)); + } + QueryDumper.Dump(result); + } + + [Test] + public void ArrayMemberAccessTest() + { + var result = Session.Query.All() + .Select(customer => new[] { + customer.CompanyName, + customer.LastName + }) + .Select(a => a[0]); + var expected = Session.Query.All() + .ToList() + .Select(customer => new[] { + customer.CompanyName, + customer.LastName + }) + .Select(a => a[0]); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + [Ignore("Not supported")] + public void ArrayAggregateAccessTest() + { + var result = Session.Query.All() + .Select(x => new byte[] {1, 2}) + .Select(a => a[0]) + .Sum(b => b); + var expected = Session.Query.All() + .ToList() + .Select(x => new byte[] {1, 2}) + .Select(a => a[0]) + .Sum(b => b); + Assert.AreEqual(expected, result); + QueryDumper.Dump(result); + } + + [Test] + [Ignore("Not supported")] + public void ArrayExpressionIndexAccessTest() + { + var bytes = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; + var result = Session.Query.All() + .Select(e => bytes[e.EmployeeId]); + var expected = Session.Query.All() + .ToList() + .Select(e => bytes[e.EmployeeId]); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/CompiledQueriesWithClosureTest.cs b/Orm/Xtensive.Orm.Tests/Linq/CompiledQueriesWithClosureTest.cs index 1ebc7db4f5..a6f0bd78ab 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/CompiledQueriesWithClosureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/CompiledQueriesWithClosureTest.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.16 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using CompiledQueriesWithClosureTestModel; - -namespace CompiledQueriesWithClosureTestModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public DateTime Value { get; set; } - } - - public static class Extensions - { - public static DateTime GetUserTime(this DateTime dateTime, TimeZone zone) - { - return dateTime; - } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class CompiledQueriesWithClosureTest : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = new TestEntity {Value = DateTime.Now}; - tx.Complete(); - } - } - - [Test] - public void CompiledQueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var zone = TimeZone.CurrentTimeZone; - var query = session.Query.Execute( - q => q.All().Select(e => e.Value.GetUserTime(zone))); - var result = query.ToList(); - tx.Complete(); - } - } - - [Test] - public void DelayedQueryTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var zone = TimeZone.CurrentTimeZone; - var query = session.Query.ExecuteDelayed( - q => q.All().Select(e => e.Value.GetUserTime(zone))); - var result = query.ToList(); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.16 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using CompiledQueriesWithClosureTestModel; + +namespace CompiledQueriesWithClosureTestModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public DateTime Value { get; set; } + } + + public static class Extensions + { + public static DateTime GetUserTime(this DateTime dateTime, TimeZone zone) + { + return dateTime; + } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class CompiledQueriesWithClosureTest : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = new TestEntity {Value = DateTime.Now}; + tx.Complete(); + } + } + + [Test] + public void CompiledQueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var zone = TimeZone.CurrentTimeZone; + var query = session.Query.Execute( + q => q.All().Select(e => e.Value.GetUserTime(zone))); + var result = query.ToList(); + tx.Complete(); + } + } + + [Test] + public void DelayedQueryTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var zone = TimeZone.CurrentTimeZone; + var query = session.Query.ExecuteDelayed( + q => q.All().Select(e => e.Value.GetUserTime(zone))); + var result = query.ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ComplexTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ComplexTest.cs index 112af48b30..08086a123b 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ComplexTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ComplexTest.cs @@ -1,227 +1,227 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.25 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class ComplexTest : ChinookDOModelTest - { - private static IQueryable GetQuery(QueryEndpoint qe, string filter) - { - var customers = qe.All().Where(cn => cn.CompanyName.StartsWith(filter)); - return customers; - } - - [Test] - public void CachedQueryTest() - { - Assert.Throws(() => { - for (char c = 'A'; c <= 'Z'; c++) { - string firstChar = c.ToString(); - var builtQuery = GetQuery(Session.Query, firstChar); - var query = builtQuery - .Select(customer => customer.Email); - var cachedQuery = Session.Query - .Execute(qe => GetQuery(Session.Query, firstChar).Select(customer => customer.Email)); - var fullQuery = Session.Query.All() - .Where(cn => cn.CompanyName.StartsWith(firstChar)) - .Select(customer => customer.CompanyName); - Assert.IsTrue(query.ToList().SequenceEqual(fullQuery.ToList())); - var cachedQueryList = cachedQuery.ToList(); - var fullQueryList = fullQuery.ToList(); - var condition = cachedQueryList.SequenceEqual(fullQueryList); - Assert.IsTrue(condition); - } - }); - } - - [Test] - public void SubquerySimpleTest() - { - var result = Session.Query.All() - .Select(p => Session.Query.All()); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryMutiple1Test() - { - var result = Session.Query.All() - .Select(customer => - Session.Query.All() - .Select(invoice => Session.Query.All() - .Where(i => i==invoice))); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryMultiple2Test() - { - var result = Session.Query.All() - .Select(custumer => - Session.Query.All() - .Select(i => Session.Query.All() - .Where(y => y.Customer==custumer))); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryMultiple3Test() - { - var result = Session.Query.All() - .Select(customer => - Session.Query.All() - .Select(i => Session.Query.All() - .Where(y => y==i && y.Customer==customer))); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryCalculableFieldTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Select(invoice => Session.Query.All() - .Where(p=>p.Invoice == invoice) - .First() - .UnitPrice); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryCalculableColumnTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .Select(invoice => Session.Query.All() - .Where(p=>p.Invoice==invoice) - .Count()); - var expectedResult = Session.Query.All() - .ToList() - .Select(invoice => Session.Query.All() - .ToList() - .Where(p=>p.Invoice==invoice) - .Count()); - Assert.AreEqual(0, expectedResult.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void CorrelatedQueryTest() - { - var invoiceLines = Session.Query.All(); - var invoices = Session.Query.All(); - var result = from l in invoiceLines - select new { - InvoiceLine = l, - Addresses = invoices - .Where(s => s.InvoiceId==l.Invoice.InvoiceId) - .Select(s => s.BillingAddress.StreetAddress) - }; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - foreach (var p in list) - foreach (var address in p.Addresses) - Assert.IsNotNull(address); - } - - [Test] - public void CorrelatedOrderByTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - orderby Session.Query.All().Where(o => o.Customer==c).Count() , c.CustomerId - select c; - var expected = - from c in Session.Query.All().ToList() - orderby Session.Query.All().ToList().Where(o => o.Customer==c).Count() , c.CustomerId - select c; - var resultList = result.ToList(); - var expectedList = expected.ToList(); - Assert.AreEqual(resultList.Count, expectedList.Count); - for (int i = 0; i < resultList.Count; i++) - Assert.AreEqual(resultList[i], expectedList[i]); - } - - [Test] - public void NestedCorrelationTest() - { - Require.ProviderIsNot(StorageProvider.Oracle); - var result = - from c in Session.Query.All() - where Session.Query.All() - .Where(o => o.Customer==c) - .All(o => Session.Query.All() - .Where(e => o.DesignatedEmployee==e) - .Any(e => e.FirstName.StartsWith("A"))) - select c; - var list = result.ToList(); - Assert.AreEqual(1, list.Count); - } - - [Test] - public void GroupByWithSelectorSelectManyTest() - { - var result = Session.Query.All() - .GroupBy(c => c.Track.Name, - (trackName, invoiceLines) => invoiceLines.Where(k => k.Invoice.Customer.FirstName.Substring(0, 1)==trackName.Substring(0, 1))) - .SelectMany(k => k); - var expected = Session.Query.All() - .ToList() - .GroupBy(c => c.Track.Name, - (trackName, invoiceLines) => invoiceLines.Where(k => k.Invoice.Customer.FirstName.Substring(0, 1)==trackName.Substring(0, 1))) - .SelectMany(k => k); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void ParameterScopeTest() - { - using (new ParameterContext().Activate()) { - Session.Query.All().ToList(); - } - } - - [Test] - public void AsEnumerableSelectDistinctTest() - { - var result = Session.Query.All().ToList().Select(o => o.Customer).Distinct(); - Assert.IsNotNull(result.First()); - Assert.GreaterOrEqual(result.Count(), 59); - } - - [Test] - public void ModifiedClosuresTest() - { - var result = from order in Session.Query.All() - join customer in Session.Query.All() on order.Customer equals customer into oc - from joinedCustomer in oc.DefaultIfEmpty() - select new { - joinedCustomer.CustomerId, - Company = joinedCustomer.CompanyName, - joinedCustomer.Address.Country - }; - var t = result.ToList(); - string searchTerms = "U A"; - var searchCriteria = searchTerms.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); - foreach (var search in searchCriteria) { - var searchTerm = search; - result = result.Where(p => p.Country.Contains(searchTerm)); - } - var ids = (from c in result select c.CustomerId).ToArray(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.25 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class ComplexTest : ChinookDOModelTest + { + private static IQueryable GetQuery(QueryEndpoint qe, string filter) + { + var customers = qe.All().Where(cn => cn.CompanyName.StartsWith(filter)); + return customers; + } + + [Test] + public void CachedQueryTest() + { + Assert.Throws(() => { + for (char c = 'A'; c <= 'Z'; c++) { + string firstChar = c.ToString(); + var builtQuery = GetQuery(Session.Query, firstChar); + var query = builtQuery + .Select(customer => customer.Email); + var cachedQuery = Session.Query + .Execute(qe => GetQuery(Session.Query, firstChar).Select(customer => customer.Email)); + var fullQuery = Session.Query.All() + .Where(cn => cn.CompanyName.StartsWith(firstChar)) + .Select(customer => customer.CompanyName); + Assert.IsTrue(query.ToList().SequenceEqual(fullQuery.ToList())); + var cachedQueryList = cachedQuery.ToList(); + var fullQueryList = fullQuery.ToList(); + var condition = cachedQueryList.SequenceEqual(fullQueryList); + Assert.IsTrue(condition); + } + }); + } + + [Test] + public void SubquerySimpleTest() + { + var result = Session.Query.All() + .Select(p => Session.Query.All()); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryMutiple1Test() + { + var result = Session.Query.All() + .Select(customer => + Session.Query.All() + .Select(invoice => Session.Query.All() + .Where(i => i==invoice))); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryMultiple2Test() + { + var result = Session.Query.All() + .Select(custumer => + Session.Query.All() + .Select(i => Session.Query.All() + .Where(y => y.Customer==custumer))); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryMultiple3Test() + { + var result = Session.Query.All() + .Select(customer => + Session.Query.All() + .Select(i => Session.Query.All() + .Where(y => y==i && y.Customer==customer))); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryCalculableFieldTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Select(invoice => Session.Query.All() + .Where(p=>p.Invoice == invoice) + .First() + .UnitPrice); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryCalculableColumnTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .Select(invoice => Session.Query.All() + .Where(p=>p.Invoice==invoice) + .Count()); + var expectedResult = Session.Query.All() + .ToList() + .Select(invoice => Session.Query.All() + .ToList() + .Where(p=>p.Invoice==invoice) + .Count()); + Assert.AreEqual(0, expectedResult.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void CorrelatedQueryTest() + { + var invoiceLines = Session.Query.All(); + var invoices = Session.Query.All(); + var result = from l in invoiceLines + select new { + InvoiceLine = l, + Addresses = invoices + .Where(s => s.InvoiceId==l.Invoice.InvoiceId) + .Select(s => s.BillingAddress.StreetAddress) + }; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + foreach (var p in list) + foreach (var address in p.Addresses) + Assert.IsNotNull(address); + } + + [Test] + public void CorrelatedOrderByTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + orderby Session.Query.All().Where(o => o.Customer==c).Count() , c.CustomerId + select c; + var expected = + from c in Session.Query.All().ToList() + orderby Session.Query.All().ToList().Where(o => o.Customer==c).Count() , c.CustomerId + select c; + var resultList = result.ToList(); + var expectedList = expected.ToList(); + Assert.AreEqual(resultList.Count, expectedList.Count); + for (int i = 0; i < resultList.Count; i++) + Assert.AreEqual(resultList[i], expectedList[i]); + } + + [Test] + public void NestedCorrelationTest() + { + Require.ProviderIsNot(StorageProvider.Oracle); + var result = + from c in Session.Query.All() + where Session.Query.All() + .Where(o => o.Customer==c) + .All(o => Session.Query.All() + .Where(e => o.DesignatedEmployee==e) + .Any(e => e.FirstName.StartsWith("A"))) + select c; + var list = result.ToList(); + Assert.AreEqual(1, list.Count); + } + + [Test] + public void GroupByWithSelectorSelectManyTest() + { + var result = Session.Query.All() + .GroupBy(c => c.Track.Name, + (trackName, invoiceLines) => invoiceLines.Where(k => k.Invoice.Customer.FirstName.Substring(0, 1)==trackName.Substring(0, 1))) + .SelectMany(k => k); + var expected = Session.Query.All() + .ToList() + .GroupBy(c => c.Track.Name, + (trackName, invoiceLines) => invoiceLines.Where(k => k.Invoice.Customer.FirstName.Substring(0, 1)==trackName.Substring(0, 1))) + .SelectMany(k => k); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void ParameterScopeTest() + { + using (new ParameterContext().Activate()) { + Session.Query.All().ToList(); + } + } + + [Test] + public void AsEnumerableSelectDistinctTest() + { + var result = Session.Query.All().ToList().Select(o => o.Customer).Distinct(); + Assert.IsNotNull(result.First()); + Assert.GreaterOrEqual(result.Count(), 59); + } + + [Test] + public void ModifiedClosuresTest() + { + var result = from order in Session.Query.All() + join customer in Session.Query.All() on order.Customer equals customer into oc + from joinedCustomer in oc.DefaultIfEmpty() + select new { + joinedCustomer.CustomerId, + Company = joinedCustomer.CompanyName, + joinedCustomer.Address.Country + }; + var t = result.ToList(); + string searchTerms = "U A"; + var searchCriteria = searchTerms.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); + foreach (var search in searchCriteria) { + var searchTerm = search; + result = result.Where(p => p.Country.Contains(searchTerm)); + } + var ids = (from c in result select c.CustomerId).ToArray(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ConditionalTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ConditionalTest.cs index 7c03ef54e3..83af18ca46 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ConditionalTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ConditionalTest.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.04.21 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.ConditionalTestModel; -using Xtensive.Orm.Tests.Storage.ForeignKeys; -using System.Linq; - -namespace Xtensive.Orm.Tests.Linq.ConditionalTestModel -{ - [Serializable] - [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] - [HierarchyRoot] - public class Root1 : Entity - { - [Field, Key(0)] - public int Id1 { get; private set; } - - [Field, Key(1)] - public int Id2 { get; private set; } - } - - [Serializable] - public class A : Root1 - { - [Field] - public int FieldA { get; private set; } - } - - [Serializable] - public class B : Root1 - { - [Field] - public int FieldB { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Root2 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Number{ get; set;} - - [Field] - public Root1 Child1{ get; set;} - - [Field] - public Root1 Child2{ get; set;} - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - public class ConditionalTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); - config.Types.Register(typeof (DualIntKeyGenerator)); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - var a1 = new A(); - var b1 = new B(); - var r1 = new Root2() {Number = 123, Child1 = a1, Child2=b1}; - Session.Current.SaveChanges(); - var result = session.Query.All().Select(r=> r.Number == 123 ? r.Child1 : r.Child2); - QueryDumper.Dump(result); - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.04.21 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.ConditionalTestModel; +using Xtensive.Orm.Tests.Storage.ForeignKeys; +using System.Linq; + +namespace Xtensive.Orm.Tests.Linq.ConditionalTestModel +{ + [Serializable] + [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] + [HierarchyRoot] + public class Root1 : Entity + { + [Field, Key(0)] + public int Id1 { get; private set; } + + [Field, Key(1)] + public int Id2 { get; private set; } + } + + [Serializable] + public class A : Root1 + { + [Field] + public int FieldA { get; private set; } + } + + [Serializable] + public class B : Root1 + { + [Field] + public int FieldB { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Root2 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Number{ get; set;} + + [Field] + public Root1 Child1{ get; set;} + + [Field] + public Root1 Child2{ get; set;} + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + public class ConditionalTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Root1).Assembly, typeof (Root1).Namespace); + config.Types.Register(typeof (DualIntKeyGenerator)); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + var a1 = new A(); + var b1 = new B(); + var r1 = new Root2() {Number = 123, Child1 = a1, Child2=b1}; + Session.Current.SaveChanges(); + var result = session.Query.All().Select(r=> r.Number == 123 ? r.Child1 : r.Child2); + QueryDumper.Dump(result); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ContainsAnyAllTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ContainsAnyAllTest.cs index 8b80f38f17..acfe07085f 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ContainsAnyAllTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ContainsAnyAllTest.cs @@ -1,461 +1,461 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class ContainsAnyAllTest : ChinookDOModelTest - { - [Test] - public void AnyWithSubqueryTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Where(o => o.Customer==c) - .Any(o => o.Commission > 0)); - var expected = Customers - .Where(c => Invoices - .Where(o => o.Customer==c) - .Any(o => o.Commission > 0)); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void AnyWithSubqueryNoPredicateTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Where(o => o.Customer==c) - .Any()); - var expected = Customers - .Where(c => Invoices - .Where(o => o.Customer==c) - .Any()); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void AnyWithLocalCollectionTest() - { - var names = new[] {"ABCDE", "Luis"}; - var result = Session.Query.All().Where(c => names.Any(id => c.FirstName==id)); - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void AnyTest() - { - var result = Session.Query.All().Any(); - var expected = Customers.Any(); - Assert.AreEqual(result, expected); - Assert.IsTrue(result); - } - - [Test] - public void AnySubqueryTest() - { - var result = Session.Query.All().Where(c=>c.Invoices.Any()).ToList(); - var expected = Invoices.Select(o => o.Customer).Distinct().ToList(); - Assert.AreEqual(0, expected.Except(result).Count()); - } - - [Test] - public void AllWithSubqueryTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Where(o => o.Customer==c) - .All(o => o.Commission > 0)); - var expected = Customers - .Where(c => Invoices - .Where(o => o.Customer==c) - .All(o => o.Commission > 0)); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void AllWithLocalCollectionTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var patterns = new[] {"a", "e"}; - var result = Session.Query.All().Where(c => patterns.All(p => c.FirstName.Contains(p))); - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void AllTest() - { - var result = Session.Query.All().All(c => c.FirstName.StartsWith("a")); - var expected = Customers.All(c => c.FirstName.StartsWith("a")); - Assert.AreEqual(expected, result); - Assert.IsFalse(result); - } - - [Test] - public void ContainsWithSubqueryTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Select(o => o.Customer) - .Contains(c)); - var expected = Customers - .Where(c => Invoices - .Select(o => o.Customer) - .Contains(c)); - var list = result.ToList(); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(list.Count, 0); - } - - [Test] - public void ContainsWithLocalCollectionTest() - { - var customerIDs = new[] {"ALFKI", "Diego", "AROUT", "Luis"}; - var orders = Session.Query.All(); - var order = orders.Where(o => customerIDs.Contains(o.Customer.FirstName)).First(); - Assert.IsNotNull(order); - } - - [Test] - public void ContainsTest() - { - var result = Session.Query.All() - .Select(c => c.FirstName) - .Contains("Luis"); - var expected = Customers - .Select(c => c.FirstName) - .Contains("Luis"); - Assert.AreEqual(expected, result); - Assert.IsTrue(result); - } - - [Test] - public void SubqueryAllStructureTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Where(o => o.Customer==c) - .All(o => o.BillingAddress.City==c.Address.City)); - var expected = Customers - .Where(c => Invoices - .Where(o => o.Customer==c) - .All(o => o.BillingAddress.City==c.Address.City)); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryAnyStructureTest() - { - var result = Session.Query.All() - .Where(c => Session.Query.All() - .Where(o => o.Customer==c) - .Any(o => o.BillingAddress.City==c.Address.City)); - var expected = Customers - .Where(c => Invoices - .Where(o => o.Customer==c) - .Any(o => o.BillingAddress.City==c.Address.City)); - Assert.AreEqual(0, expected.Except(result).Count()); - result.ToList(); - } - - [Test] - public void AllAndNotAllTest() - { - var result = - from o in Session.Query.All() - where Session.Query.All() - .Where(c => c==o.Customer) - .All(c => c.FirstName.StartsWith("A")) - && !Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where Customers - .Where(c => c==o.Customer) - .All(c => c.FirstName.StartsWith("A")) - && !Employees - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - var list = result.ToList(); - Assert.AreEqual(14, list.Count); - } - - [Test] - public void AllOrAllTest() - { - var result = - from o in Session.Query.All() - where Session.Query.All() - .Where(c => c==o.Customer) - .All(c => c.FirstName.StartsWith("A")) - || Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where Customers - .Where(c => c==o.Customer) - .All(c => c.FirstName.StartsWith("A")) - || Employees - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - var list = result.ToList(); - Assert.AreEqual(128, list.Count); - } - - [Test] - public void NotAnyAndAnyTest() - { - var result = - from o in Session.Query.All() - where !Session.Query.All() - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - && Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .Any(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where !Customers - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - && Employees - .Where(e => e==o.DesignatedEmployee) - .Any(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(111, result.ToList().Count); - } - - [Test] - public void AnyOrAnyTest() - { - var result = - from o in Session.Query.All() - where Session.Query.All() - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - || Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .Any(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where Customers - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - || Employees - .Where(e => e==o.DesignatedEmployee) - .Any(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(result.ToList().Count, 118); - } - - [Test] - public void AnyAndNotAllTest() - { - var result = - from o in Session.Query.All() - where Session.Query.All() - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - && !Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where Customers - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - && !Employees - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(result.ToList().Count, 4); - } - - [Test] - public void NotAnyOrAllTest() - { - var result = - from o in Session.Query.All() - where !Session.Query.All() - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - || Session.Query.All() - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - var expected = - from o in Invoices - where !Customers - .Where(c => c==o.Customer) - .Any(c => c.LastName.StartsWith("A")) - || Employees - .Where(e => e==o.DesignatedEmployee) - .All(e => e.FirstName.EndsWith("t")) - select o; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(408, result.ToList().Count); - } - - [Test] - public void SelectAnyTest() - { - var result = - (from c in Session.Query.All() - select new { - Customer = c, - HasOrders = Session.Query.All() - .Where(o => o.Customer==c) - .Any() - }).ToList(); - var expected = - (from c in Customers - select new { - Customer = c, - HasOrders = Invoices - .Where(o => o.Customer==c) - .Any() - }).ToList(); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(1, result.ToList().Count(i => !i.HasOrders)); - } - - [Test] - public void SelectAllTest() - { - var result = - from c in Session.Query.All() - select new { - Customer = c, - AllEmployeesAreCool = Session.Query.All() - .Where(o => o.Customer==c) - .All(o => o.DesignatedEmployee.FirstName=="Cool") - }; - var expected = - from c in Customers - select new { - Customer = c, - AllEmployeesAreCool = Invoices - .Where(o => o.Customer==c) - .All(o => o.DesignatedEmployee.FirstName=="Cool") - }; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(1, result.ToList().Count(i => i.AllEmployeesAreCool)); - } - - [Test] - public void SelectContainsTest() - { - var result = - from c in Session.Query.All() - select new { - Customer = c, - HasNewOrders = Session.Query.All() - .Where(o => o.InvoiceDate > new DateTime(2020, 1, 1)) - .Select(o => o.Customer) - .Contains(c) - }; - var expected = - from c in Customers - select new { - Customer = c, - HasNewOrders = Invoices - .Where(o => o.InvoiceDate > new DateTime(2020, 1, 1)) - .Select(o => o.Customer) - .Contains(c) - }; - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(0, result.ToList().Count(i => i.HasNewOrders)); - } - - [Test] - public void EntitySetAnyTest() - { - var result = Session.Query.All() - .Where(c => c.Invoices.Any(o => o.Commission > 1m)); - var expected = Customers - .Where(c => c.Invoices.Any(o => o.Commission > 1m)); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(2, result.ToList().Count); - } - - [Test] - public void EntitySetAllTest() - { - Require.ProviderIsNot(StorageProvider.Oracle); - var result = Session.Query.All() - .Where(c => c.Invoices.All(o => o.DesignatedEmployee.FirstName=="???")); - var expected = Customers - .Where(c => c.Invoices.All(o => o.DesignatedEmployee.FirstName=="???")); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(1, result.ToList().Count); - } - - [Test] - public void EntitySetContainsTest() - { - var bestOrder = Session.Query.All().OrderBy(o => o.Commission).First(); - var result = Session.Query.All() - .Where(c => Queryable.Contains(c.Invoices, bestOrder)); - var expected = Customers - .Where(c => Queryable.Contains(c.Invoices, bestOrder)); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.AreEqual(bestOrder.Customer.CustomerId, result.ToList().Single().CustomerId); - } - - [Test] - public void EntitySetAllStructureTest() - { - var result = Session.Query.All() - .Where(c => c.Invoices.All(o => o.BillingAddress.City==c.Address.City)); - var expected = Customers - .Where(c => c.Invoices.All(o => o.BillingAddress.City==c.Address.City)); - Assert.AreEqual(0, expected.Except(result).Count()); - result.ToList(); - } - - [Test] - public void EntitySetAnyStructureTest() - { - Require.ProviderIsNot(StorageProvider.Oracle); - var result = Session.Query.All() - .Where(c => c.Invoices.Any(o => o.BillingAddress.City==c.Address.City)); - var expected = Customers - .Where(c => c.Invoices.Any(o => o.BillingAddress.City==c.Address.City)); - Assert.AreEqual(0, expected.Except(result).Count()); - result.ToList(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class ContainsAnyAllTest : ChinookDOModelTest + { + [Test] + public void AnyWithSubqueryTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Where(o => o.Customer==c) + .Any(o => o.Commission > 0)); + var expected = Customers + .Where(c => Invoices + .Where(o => o.Customer==c) + .Any(o => o.Commission > 0)); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void AnyWithSubqueryNoPredicateTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Where(o => o.Customer==c) + .Any()); + var expected = Customers + .Where(c => Invoices + .Where(o => o.Customer==c) + .Any()); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void AnyWithLocalCollectionTest() + { + var names = new[] {"ABCDE", "Luis"}; + var result = Session.Query.All().Where(c => names.Any(id => c.FirstName==id)); + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void AnyTest() + { + var result = Session.Query.All().Any(); + var expected = Customers.Any(); + Assert.AreEqual(result, expected); + Assert.IsTrue(result); + } + + [Test] + public void AnySubqueryTest() + { + var result = Session.Query.All().Where(c=>c.Invoices.Any()).ToList(); + var expected = Invoices.Select(o => o.Customer).Distinct().ToList(); + Assert.AreEqual(0, expected.Except(result).Count()); + } + + [Test] + public void AllWithSubqueryTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Where(o => o.Customer==c) + .All(o => o.Commission > 0)); + var expected = Customers + .Where(c => Invoices + .Where(o => o.Customer==c) + .All(o => o.Commission > 0)); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void AllWithLocalCollectionTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var patterns = new[] {"a", "e"}; + var result = Session.Query.All().Where(c => patterns.All(p => c.FirstName.Contains(p))); + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void AllTest() + { + var result = Session.Query.All().All(c => c.FirstName.StartsWith("a")); + var expected = Customers.All(c => c.FirstName.StartsWith("a")); + Assert.AreEqual(expected, result); + Assert.IsFalse(result); + } + + [Test] + public void ContainsWithSubqueryTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Select(o => o.Customer) + .Contains(c)); + var expected = Customers + .Where(c => Invoices + .Select(o => o.Customer) + .Contains(c)); + var list = result.ToList(); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(list.Count, 0); + } + + [Test] + public void ContainsWithLocalCollectionTest() + { + var customerIDs = new[] {"ALFKI", "Diego", "AROUT", "Luis"}; + var orders = Session.Query.All(); + var order = orders.Where(o => customerIDs.Contains(o.Customer.FirstName)).First(); + Assert.IsNotNull(order); + } + + [Test] + public void ContainsTest() + { + var result = Session.Query.All() + .Select(c => c.FirstName) + .Contains("Luis"); + var expected = Customers + .Select(c => c.FirstName) + .Contains("Luis"); + Assert.AreEqual(expected, result); + Assert.IsTrue(result); + } + + [Test] + public void SubqueryAllStructureTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Where(o => o.Customer==c) + .All(o => o.BillingAddress.City==c.Address.City)); + var expected = Customers + .Where(c => Invoices + .Where(o => o.Customer==c) + .All(o => o.BillingAddress.City==c.Address.City)); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryAnyStructureTest() + { + var result = Session.Query.All() + .Where(c => Session.Query.All() + .Where(o => o.Customer==c) + .Any(o => o.BillingAddress.City==c.Address.City)); + var expected = Customers + .Where(c => Invoices + .Where(o => o.Customer==c) + .Any(o => o.BillingAddress.City==c.Address.City)); + Assert.AreEqual(0, expected.Except(result).Count()); + result.ToList(); + } + + [Test] + public void AllAndNotAllTest() + { + var result = + from o in Session.Query.All() + where Session.Query.All() + .Where(c => c==o.Customer) + .All(c => c.FirstName.StartsWith("A")) + && !Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where Customers + .Where(c => c==o.Customer) + .All(c => c.FirstName.StartsWith("A")) + && !Employees + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + var list = result.ToList(); + Assert.AreEqual(14, list.Count); + } + + [Test] + public void AllOrAllTest() + { + var result = + from o in Session.Query.All() + where Session.Query.All() + .Where(c => c==o.Customer) + .All(c => c.FirstName.StartsWith("A")) + || Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where Customers + .Where(c => c==o.Customer) + .All(c => c.FirstName.StartsWith("A")) + || Employees + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + var list = result.ToList(); + Assert.AreEqual(128, list.Count); + } + + [Test] + public void NotAnyAndAnyTest() + { + var result = + from o in Session.Query.All() + where !Session.Query.All() + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + && Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .Any(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where !Customers + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + && Employees + .Where(e => e==o.DesignatedEmployee) + .Any(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(111, result.ToList().Count); + } + + [Test] + public void AnyOrAnyTest() + { + var result = + from o in Session.Query.All() + where Session.Query.All() + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + || Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .Any(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where Customers + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + || Employees + .Where(e => e==o.DesignatedEmployee) + .Any(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(result.ToList().Count, 118); + } + + [Test] + public void AnyAndNotAllTest() + { + var result = + from o in Session.Query.All() + where Session.Query.All() + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + && !Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where Customers + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + && !Employees + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(result.ToList().Count, 4); + } + + [Test] + public void NotAnyOrAllTest() + { + var result = + from o in Session.Query.All() + where !Session.Query.All() + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + || Session.Query.All() + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + var expected = + from o in Invoices + where !Customers + .Where(c => c==o.Customer) + .Any(c => c.LastName.StartsWith("A")) + || Employees + .Where(e => e==o.DesignatedEmployee) + .All(e => e.FirstName.EndsWith("t")) + select o; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(408, result.ToList().Count); + } + + [Test] + public void SelectAnyTest() + { + var result = + (from c in Session.Query.All() + select new { + Customer = c, + HasOrders = Session.Query.All() + .Where(o => o.Customer==c) + .Any() + }).ToList(); + var expected = + (from c in Customers + select new { + Customer = c, + HasOrders = Invoices + .Where(o => o.Customer==c) + .Any() + }).ToList(); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(1, result.ToList().Count(i => !i.HasOrders)); + } + + [Test] + public void SelectAllTest() + { + var result = + from c in Session.Query.All() + select new { + Customer = c, + AllEmployeesAreCool = Session.Query.All() + .Where(o => o.Customer==c) + .All(o => o.DesignatedEmployee.FirstName=="Cool") + }; + var expected = + from c in Customers + select new { + Customer = c, + AllEmployeesAreCool = Invoices + .Where(o => o.Customer==c) + .All(o => o.DesignatedEmployee.FirstName=="Cool") + }; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(1, result.ToList().Count(i => i.AllEmployeesAreCool)); + } + + [Test] + public void SelectContainsTest() + { + var result = + from c in Session.Query.All() + select new { + Customer = c, + HasNewOrders = Session.Query.All() + .Where(o => o.InvoiceDate > new DateTime(2020, 1, 1)) + .Select(o => o.Customer) + .Contains(c) + }; + var expected = + from c in Customers + select new { + Customer = c, + HasNewOrders = Invoices + .Where(o => o.InvoiceDate > new DateTime(2020, 1, 1)) + .Select(o => o.Customer) + .Contains(c) + }; + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(0, result.ToList().Count(i => i.HasNewOrders)); + } + + [Test] + public void EntitySetAnyTest() + { + var result = Session.Query.All() + .Where(c => c.Invoices.Any(o => o.Commission > 1m)); + var expected = Customers + .Where(c => c.Invoices.Any(o => o.Commission > 1m)); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(2, result.ToList().Count); + } + + [Test] + public void EntitySetAllTest() + { + Require.ProviderIsNot(StorageProvider.Oracle); + var result = Session.Query.All() + .Where(c => c.Invoices.All(o => o.DesignatedEmployee.FirstName=="???")); + var expected = Customers + .Where(c => c.Invoices.All(o => o.DesignatedEmployee.FirstName=="???")); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(1, result.ToList().Count); + } + + [Test] + public void EntitySetContainsTest() + { + var bestOrder = Session.Query.All().OrderBy(o => o.Commission).First(); + var result = Session.Query.All() + .Where(c => Queryable.Contains(c.Invoices, bestOrder)); + var expected = Customers + .Where(c => Queryable.Contains(c.Invoices, bestOrder)); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.AreEqual(bestOrder.Customer.CustomerId, result.ToList().Single().CustomerId); + } + + [Test] + public void EntitySetAllStructureTest() + { + var result = Session.Query.All() + .Where(c => c.Invoices.All(o => o.BillingAddress.City==c.Address.City)); + var expected = Customers + .Where(c => c.Invoices.All(o => o.BillingAddress.City==c.Address.City)); + Assert.AreEqual(0, expected.Except(result).Count()); + result.ToList(); + } + + [Test] + public void EntitySetAnyStructureTest() + { + Require.ProviderIsNot(StorageProvider.Oracle); + var result = Session.Query.All() + .Where(c => c.Invoices.Any(o => o.BillingAddress.City==c.Address.City)); + var expected = Customers + .Where(c => c.Invoices.Any(o => o.BillingAddress.City==c.Address.City)); + Assert.AreEqual(0, expected.Except(result).Count()); + result.ToList(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ContainsOverKeysCollectionTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ContainsOverKeysCollectionTest.cs index e6f1f29136..1e56cbb0de 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ContainsOverKeysCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ContainsOverKeysCollectionTest.cs @@ -1,433 +1,433 @@ -// Copyright (C) 2013-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Alexey Kulakov -// Created: 2013.12.30 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTestModel; - -namespace Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTestModel -{ - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Field { get; set; } - } - - [HierarchyRoot] - public class MyEntity2 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public MyEntity Entity { get; set; } - } - - [HierarchyRoot] - public class MyEntity3 : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public MyEntity2 Entity { get; set; } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class ComplexKeyEntity : Entity - { - [Field, Key(0)] - public int Id0 { get; private set; } - - [Field, Key(1)] - public int Id1 { get; private set; } - - [Field] - public string Name { get; set; } - - public ComplexKeyEntity(int id0, int id1) - : base(id0, id1) - { - } - } - - public class TestKeyCollection : IReadOnlyCollection - { - private readonly Key[] keys; - - public int Count => keys.Length; - - public IEnumerator GetEnumerator() - { - foreach (var key in keys) - yield return key; - } - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public TestKeyCollection(Key[] array) - { - keys = array; - } - } - - public class TestGenericCollection : IReadOnlyCollection - { - private readonly TKey[] keys; - - public int Count => keys.Length; - - public IEnumerator GetEnumerator() - { - foreach (var key in keys) - yield return key; - } - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public TestGenericCollection(TKey[] array) - { - keys = array; - } - } -} - -namespace Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTest -{ - [TestFixture] - public class ContainsOverKeysCollectionTest : AutoBuildTest - { - private Key[] keyArray; - private TestGenericCollection genericKeyCollection; - private TestKeyCollection nonGenericKeyCollection; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - PopulateEntities(); - PopulateKeysCollections(session); - transaction.Complete(); - } - } - - [Test] - public void DirectKeyContainsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => keyArray.Contains(e.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - } - } - - [Test] - public void DirectKeyInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Key.In(keyArray)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Key.In(nonGenericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Key.In(genericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); - } - } - - [Test] - public void OneLevelContainsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => keyArray.Contains(e.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - } - } - - [Test] - public void OneLevelInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Key.In(keyArray)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Key.In(nonGenericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Key.In(genericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); - } - } - - [Test] - public void TwoLevelContainsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => keyArray.Contains(e.Entity.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Entity.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Entity.Entity.Key)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - } - } - - [Test] - public void TwoLevelInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result = null; - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Entity.Key.In(keyArray)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Entity.Key.In(nonGenericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - - Assert.DoesNotThrow(() => - result = session.Query.All().Where(e => e.Entity.Entity.Key.In(genericKeyCollection)).ToList()); - Assert.That(result.Count, Is.EqualTo(3)); - Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); - } - } - - [Test] - public void SubQueryContainsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result; - - Assert.Throws(() => - result = session.Query.All() - .Where(e => keyArray.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) - .ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => nonGenericKeyCollection.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) - .ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => genericKeyCollection.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) - .ToList()); - } - } - - [Test] - public void SubQueryInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result; - - Assert.Throws(() => - result = session.Query.All() - .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(keyArray)) - .ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(nonGenericKeyCollection)) - .ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(genericKeyCollection)) - .ToList()); - } - } - - [Test] - public void AnonymousTypeKeyContainsTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result; - - Assert.Throws(() => - result = session.Query.All() - .Where(e => keyArray.Contains(new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey)).ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => nonGenericKeyCollection.Contains(new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey)).ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => genericKeyCollection.Contains(new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey)).ToList()); - } - } - - [Test] - public void AnonymousTypeKeyInTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List result; - - Assert.Throws(() => - result = session.Query.All() - .Where(e => new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey.In(keyArray)).ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey.In(nonGenericKeyCollection)).ToList()); - - Assert.Throws(() => - result = session.Query.All() - .Where(e => new { - Key = e.Key, - EntityKey = e.Entity.Key, - DoubleEntityKey = e.Entity.Entity.Key - }.DoubleEntityKey.In(genericKeyCollection)).ToList()); - } - } - - private void PopulateEntities() - { - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "ABC" } - } - }; - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "DEF" } - } - }; - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "GHI" } - } - }; - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "KLM" } - } - }; - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "NOP" } - } - }; - new MyEntity3 { - Entity = new MyEntity2 { - Entity = new MyEntity { Field = "QRS" } - } - }; - } - - private void PopulateKeysCollections(Session session) - { - keyArray = session.Query.All().AsEnumerable().Take(3).Select(e => e.Key).ToArray(); - genericKeyCollection = new TestGenericCollection(keyArray); - nonGenericKeyCollection = new TestKeyCollection(keyArray); - } - } -} +// Copyright (C) 2013-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Alexey Kulakov +// Created: 2013.12.30 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTestModel; + +namespace Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTestModel +{ + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Field { get; set; } + } + + [HierarchyRoot] + public class MyEntity2 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public MyEntity Entity { get; set; } + } + + [HierarchyRoot] + public class MyEntity3 : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public MyEntity2 Entity { get; set; } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class ComplexKeyEntity : Entity + { + [Field, Key(0)] + public int Id0 { get; private set; } + + [Field, Key(1)] + public int Id1 { get; private set; } + + [Field] + public string Name { get; set; } + + public ComplexKeyEntity(int id0, int id1) + : base(id0, id1) + { + } + } + + public class TestKeyCollection : IReadOnlyCollection + { + private readonly Key[] keys; + + public int Count => keys.Length; + + public IEnumerator GetEnumerator() + { + foreach (var key in keys) + yield return key; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public TestKeyCollection(Key[] array) + { + keys = array; + } + } + + public class TestGenericCollection : IReadOnlyCollection + { + private readonly TKey[] keys; + + public int Count => keys.Length; + + public IEnumerator GetEnumerator() + { + foreach (var key in keys) + yield return key; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public TestGenericCollection(TKey[] array) + { + keys = array; + } + } +} + +namespace Xtensive.Orm.Tests.Linq.ContainsOverKeysCollectionTest +{ + [TestFixture] + public class ContainsOverKeysCollectionTest : AutoBuildTest + { + private Key[] keyArray; + private TestGenericCollection genericKeyCollection; + private TestKeyCollection nonGenericKeyCollection; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + PopulateEntities(); + PopulateKeysCollections(session); + transaction.Complete(); + } + } + + [Test] + public void DirectKeyContainsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => keyArray.Contains(e.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + } + } + + [Test] + public void DirectKeyInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Key.In(keyArray)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Key.In(nonGenericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Key.In(genericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Key)), Is.True); + } + } + + [Test] + public void OneLevelContainsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => keyArray.Contains(e.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + } + } + + [Test] + public void OneLevelInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Key.In(keyArray)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Key.In(nonGenericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Key.In(genericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Key)), Is.True); + } + } + + [Test] + public void TwoLevelContainsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => keyArray.Contains(e.Entity.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => nonGenericKeyCollection.Contains(e.Entity.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => genericKeyCollection.Contains(e.Entity.Entity.Key)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + } + } + + [Test] + public void TwoLevelInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result = null; + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Entity.Key.In(keyArray)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Entity.Key.In(nonGenericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + + Assert.DoesNotThrow(() => + result = session.Query.All().Where(e => e.Entity.Entity.Key.In(genericKeyCollection)).ToList()); + Assert.That(result.Count, Is.EqualTo(3)); + Assert.That(result.All(x => keyArray.Contains(x.Entity.Entity.Key)), Is.True); + } + } + + [Test] + public void SubQueryContainsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result; + + Assert.Throws(() => + result = session.Query.All() + .Where(e => keyArray.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) + .ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => nonGenericKeyCollection.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) + .ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => genericKeyCollection.Contains(session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key)) + .ToList()); + } + } + + [Test] + public void SubQueryInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result; + + Assert.Throws(() => + result = session.Query.All() + .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(keyArray)) + .ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(nonGenericKeyCollection)) + .ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => session.Query.All().First(el => el.Key == e.Entity.Entity.Key).Key.In(genericKeyCollection)) + .ToList()); + } + } + + [Test] + public void AnonymousTypeKeyContainsTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result; + + Assert.Throws(() => + result = session.Query.All() + .Where(e => keyArray.Contains(new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey)).ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => nonGenericKeyCollection.Contains(new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey)).ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => genericKeyCollection.Contains(new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey)).ToList()); + } + } + + [Test] + public void AnonymousTypeKeyInTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List result; + + Assert.Throws(() => + result = session.Query.All() + .Where(e => new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey.In(keyArray)).ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey.In(nonGenericKeyCollection)).ToList()); + + Assert.Throws(() => + result = session.Query.All() + .Where(e => new { + Key = e.Key, + EntityKey = e.Entity.Key, + DoubleEntityKey = e.Entity.Entity.Key + }.DoubleEntityKey.In(genericKeyCollection)).ToList()); + } + } + + private void PopulateEntities() + { + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "ABC" } + } + }; + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "DEF" } + } + }; + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "GHI" } + } + }; + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "KLM" } + } + }; + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "NOP" } + } + }; + new MyEntity3 { + Entity = new MyEntity2 { + Entity = new MyEntity { Field = "QRS" } + } + }; + } + + private void PopulateKeysCollections(Session session) + { + keyArray = session.Query.All().AsEnumerable().Take(3).Select(e => e.Key).ToArray(); + genericKeyCollection = new TestGenericCollection(keyArray); + nonGenericKeyCollection = new TestKeyCollection(keyArray); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/ContainsTableTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ContainsTableTest.cs index 209f8bf96a..08f4566b83 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ContainsTableTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ContainsTableTest.cs @@ -1,123 +1,123 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.12.09 - -using System; -using System.Linq; -using System.Threading; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class ContainsTableTest : ChinookDOModelTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.SingleKeyRankTableFullText); - } - - protected override Domain BuildDomain(Xtensive.Orm.Configuration.DomainConfiguration configuration) - { - var domain = base.BuildDomain(configuration); - Thread.Sleep(TimeSpan.FromSeconds(6)); - return domain; - } - - [Test] - public void SearchByTypeWithoutFulltextIndexTest() - { - Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("some text")).Run()); - Assert.Throws(() => Query.ContainsTable (e => e.SimpleTerm("some text")).Run()); - } - - [Test] - public void NullSearchConditionBuilderTest() - { - Assert.Throws(() => Session.Query.ContainsTable(null).Run()); - Assert.Throws(() => Query.ContainsTable(null).Run()); - } - - [Test] - public void NegativeRank() - { - Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("some text"), -1).Run()); - Assert.Throws(() => Query.ContainsTable(e => e.SimpleTerm("some text"), -1).Run()); - } - - [Test] - public void ReuseTest1() - { - var result = Session.Query.Execute(q => q.ContainsTable(e => e.SimpleTerm("Letterbomb")).Count()); - Assert.That(result, Is.EqualTo(1)); - result = Session.Query.Execute(q => q.ContainsTable(e => e.SimpleTerm("abcdefghijklmnop")).Count()); - Assert.That(result, Is.EqualTo(0)); - } - - [Test] - public void ReuseTest2() - { - var result = Query.Execute(() => Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Count()); - Assert.That(result, Is.EqualTo(1)); - result = Query.Execute(() => Query.ContainsTable(e => e.SimpleTerm("abcdefghijklmnop")).Count()); - Assert.That(result, Is.EqualTo(0)); - } - - [Test] - public void QueryingEntitesTest() - { - var tracks = Session.Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).ToList(); - Assert.That(tracks.Count, Is.EqualTo(1)); - foreach (var track in tracks) { - Assert.That(track, Is.Not.Null); - Assert.That(track.Entity, Is.Not.Null); - Assert.That(track.Entity.Name.Contains("Letterbomb"), Is.True); - } - - tracks = Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).ToList(); - Assert.That(tracks.Count, Is.EqualTo(1)); - foreach (var track in tracks) { - Assert.That(track, Is.Not.Null); - Assert.That(track.Entity, Is.Not.Null); - Assert.That(track.Entity.Name.Contains("Letterbomb"), Is.True); - } - } - - [Test] - public void QueryingRankTest() - { - var ranks = Session.Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Select(e=>e.Rank).ToList(); - Assert.That(ranks.Count, Is.EqualTo(1)); - Assert.That(ranks.All(r=> r > 0.0), Is.True); - - ranks = Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Select(e => e.Rank).ToList(); - Assert.That(ranks.Count, Is.EqualTo(1)); - Assert.That(ranks.All(r => r > 0.0), Is.True); - } - - [Test] - public void LimitResultsByRankTest() - { - var actualRanks = Session.Query.ContainsTable(e => e.PrefixTerm("Com")).Select(p => p.Rank).ToList(); - Assert.That(actualRanks.Count, Is.EqualTo(65)); - - var limitedResults = Session.Query.ContainsTable(e => e.PrefixTerm("Com"), 2).Select(p => p.Rank).ToList(); - Assert.That(limitedResults.Count, Is.EqualTo(2)); - var topTwoRanks = actualRanks.OrderByDescending(r => r).Take(2).ToList(); - Assert.That(limitedResults.All(r => topTwoRanks.Contains(r)), Is.True); - - actualRanks = Query.ContainsTable(e => e.PrefixTerm("Com")).Select(p => p.Rank).ToList(); - Assert.That(actualRanks.Count, Is.EqualTo(65)); - - limitedResults = Query.ContainsTable(e => e.PrefixTerm("Com"), 2).Select(p => p.Rank).ToList(); - Assert.That(limitedResults.Count, Is.EqualTo(2)); - topTwoRanks = actualRanks.OrderByDescending(r => r).Take(2).ToList(); - Assert.That(limitedResults.All(r => topTwoRanks.Contains(r)), Is.True); - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.12.09 + +using System; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class ContainsTableTest : ChinookDOModelTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.SingleKeyRankTableFullText); + } + + protected override Domain BuildDomain(Xtensive.Orm.Configuration.DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + Thread.Sleep(TimeSpan.FromSeconds(6)); + return domain; + } + + [Test] + public void SearchByTypeWithoutFulltextIndexTest() + { + Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("some text")).Run()); + Assert.Throws(() => Query.ContainsTable (e => e.SimpleTerm("some text")).Run()); + } + + [Test] + public void NullSearchConditionBuilderTest() + { + Assert.Throws(() => Session.Query.ContainsTable(null).Run()); + Assert.Throws(() => Query.ContainsTable(null).Run()); + } + + [Test] + public void NegativeRank() + { + Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("some text"), -1).Run()); + Assert.Throws(() => Query.ContainsTable(e => e.SimpleTerm("some text"), -1).Run()); + } + + [Test] + public void ReuseTest1() + { + var result = Session.Query.Execute(q => q.ContainsTable(e => e.SimpleTerm("Letterbomb")).Count()); + Assert.That(result, Is.EqualTo(1)); + result = Session.Query.Execute(q => q.ContainsTable(e => e.SimpleTerm("abcdefghijklmnop")).Count()); + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public void ReuseTest2() + { + var result = Query.Execute(() => Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Count()); + Assert.That(result, Is.EqualTo(1)); + result = Query.Execute(() => Query.ContainsTable(e => e.SimpleTerm("abcdefghijklmnop")).Count()); + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public void QueryingEntitesTest() + { + var tracks = Session.Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).ToList(); + Assert.That(tracks.Count, Is.EqualTo(1)); + foreach (var track in tracks) { + Assert.That(track, Is.Not.Null); + Assert.That(track.Entity, Is.Not.Null); + Assert.That(track.Entity.Name.Contains("Letterbomb"), Is.True); + } + + tracks = Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).ToList(); + Assert.That(tracks.Count, Is.EqualTo(1)); + foreach (var track in tracks) { + Assert.That(track, Is.Not.Null); + Assert.That(track.Entity, Is.Not.Null); + Assert.That(track.Entity.Name.Contains("Letterbomb"), Is.True); + } + } + + [Test] + public void QueryingRankTest() + { + var ranks = Session.Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Select(e=>e.Rank).ToList(); + Assert.That(ranks.Count, Is.EqualTo(1)); + Assert.That(ranks.All(r=> r > 0.0), Is.True); + + ranks = Query.ContainsTable(e => e.SimpleTerm("Letterbomb")).Select(e => e.Rank).ToList(); + Assert.That(ranks.Count, Is.EqualTo(1)); + Assert.That(ranks.All(r => r > 0.0), Is.True); + } + + [Test] + public void LimitResultsByRankTest() + { + var actualRanks = Session.Query.ContainsTable(e => e.PrefixTerm("Com")).Select(p => p.Rank).ToList(); + Assert.That(actualRanks.Count, Is.EqualTo(65)); + + var limitedResults = Session.Query.ContainsTable(e => e.PrefixTerm("Com"), 2).Select(p => p.Rank).ToList(); + Assert.That(limitedResults.Count, Is.EqualTo(2)); + var topTwoRanks = actualRanks.OrderByDescending(r => r).Take(2).ToList(); + Assert.That(limitedResults.All(r => topTwoRanks.Contains(r)), Is.True); + + actualRanks = Query.ContainsTable(e => e.PrefixTerm("Com")).Select(p => p.Rank).ToList(); + Assert.That(actualRanks.Count, Is.EqualTo(65)); + + limitedResults = Query.ContainsTable(e => e.PrefixTerm("Com"), 2).Select(p => p.Rank).ToList(); + Assert.That(limitedResults.Count, Is.EqualTo(2)); + topTwoRanks = actualRanks.OrderByDescending(r => r).Take(2).ToList(); + Assert.That(limitedResults.All(r => topTwoRanks.Contains(r)), Is.True); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/ConvariantQueriesTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ConvariantQueriesTest.cs index 09b083abe6..9efccbd72a 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ConvariantQueriesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ConvariantQueriesTest.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.02 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.ConvariantQueriesTestModel; - -namespace Xtensive.Orm.Tests.Linq.ConvariantQueriesTestModel -{ - [HierarchyRoot] - public class MyBaseEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class MyChildEntity : MyBaseEntity - { - [Field] - public int Field { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - public class ConvariantQueriesTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(MyBaseEntity).Assembly, typeof(MyBaseEntity).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - CreateSessionAndTransaction(); - } - - [Test] - public void ConcatTest() - { - var q1 = Query.All().Concat(Query.All()).ToList(); - var q2 = Query.All().Concat(Query.All()).ToList(); - } - - [Test] - public void UnionTest() - { - var q1 = Query.All().Union(Query.All()).ToList(); - var q2 = Query.All().Union(Query.All()).ToList(); - } - - [Test] - public void IntersectTest() - { - //some storages does not support Intersect operation - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - var q1 = Query.All().Intersect(Query.All()).ToList(); - var q2 = Query.All().Intersect(Query.All()).ToList(); - } - - [Test] - public void ExceptTest() - { - //Some storages does not support Except operation - Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); - var q1 = Query.All().Except(Query.All()).ToList(); - var q2 = Query.All().Except(Query.All()).ToList(); - } - - [Test] - public void ContainsTest() - { - var q1 = Query.All() - .Where(baseEntity => Query.All().Contains(baseEntity)) - .ToList(); - var q2 = Query.All() - .Where(childEntity => Query.All().Contains(childEntity)) - .ToList(); - } - - [Test] - public void InTest() - { - var q1 = Query.All() - .Where(baseEntity => baseEntity.In(Query.All())) - .ToList(); - var q2 = Query.All() - .Where(childEntity => childEntity.In(Query.All())) - .ToList(); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.02 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.ConvariantQueriesTestModel; + +namespace Xtensive.Orm.Tests.Linq.ConvariantQueriesTestModel +{ + [HierarchyRoot] + public class MyBaseEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class MyChildEntity : MyBaseEntity + { + [Field] + public int Field { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + public class ConvariantQueriesTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(MyBaseEntity).Assembly, typeof(MyBaseEntity).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + CreateSessionAndTransaction(); + } + + [Test] + public void ConcatTest() + { + var q1 = Query.All().Concat(Query.All()).ToList(); + var q2 = Query.All().Concat(Query.All()).ToList(); + } + + [Test] + public void UnionTest() + { + var q1 = Query.All().Union(Query.All()).ToList(); + var q2 = Query.All().Union(Query.All()).ToList(); + } + + [Test] + public void IntersectTest() + { + //some storages does not support Intersect operation + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + var q1 = Query.All().Intersect(Query.All()).ToList(); + var q2 = Query.All().Intersect(Query.All()).ToList(); + } + + [Test] + public void ExceptTest() + { + //Some storages does not support Except operation + Require.ProviderIsNot(StorageProvider.Firebird | StorageProvider.MySql); + var q1 = Query.All().Except(Query.All()).ToList(); + var q2 = Query.All().Except(Query.All()).ToList(); + } + + [Test] + public void ContainsTest() + { + var q1 = Query.All() + .Where(baseEntity => Query.All().Contains(baseEntity)) + .ToList(); + var q2 = Query.All() + .Where(childEntity => Query.All().Contains(childEntity)) + .ToList(); + } + + [Test] + public void InTest() + { + var q1 = Query.All() + .Where(baseEntity => baseEntity.In(Query.All())) + .ToList(); + var q2 = Query.All() + .Where(childEntity => childEntity.In(Query.All())) + .ToList(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/CustomExpressionCompilers.cs b/Orm/Xtensive.Orm.Tests/Linq/CustomExpressionCompilers.cs index 05b8ccee8c..d23f5a5ea4 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/CustomExpressionCompilers.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/CustomExpressionCompilers.cs @@ -1,205 +1,205 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.11.13 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.CustomExpressionCompilersModel; -using System.Linq; - -namespace Xtensive.Orm.Tests.Linq.CustomExpressionCompilersModel -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field] - [Key] - public int Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public DateTime BirthDay { get; set; } - - public string Fullname - { - get { return string.Format("{0} {1}", FirstName, LastName); } - } - - public string AddPrefix(string prefix) - { - return string.Format("{0}{1}", prefix, LastName); - } - } - - [HierarchyRoot] - public class Assignment : Entity - { - [Field, Key] - public int Id { get; private set; } - [Field] - public bool Active { get; set; } - [Field] - public DateTime Start { get; set; } - [Field] - public DateTime? End { get; set; } - - public bool Current - { - get { return Active && Start <= DateTime.Now && (End == null || End.Value >= DateTime.Now); } - } - } - - [HierarchyRoot] - public class RegistrarTestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - public static int StaticProperty { get { return 0; } } - public int InstanceProperty { get { return Id % 10; } } - - public static int StaticMethod(int value) - { - return value * 2; - } - - public int InstanceMethod(int value) - { - return value * Id; - } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - [CompilerContainer(typeof (Expression))] - internal static class CustomLinqCompilerContainer - { - [Compiler(typeof (Person), "Fullname", TargetKind.PropertyGet)] - public static Expression FullName(Expression personExpression) - { - Expression> ex = person => person.FirstName + " " + person.LastName; - return ex.BindParameters(personExpression); - } - - [Compiler(typeof (Person), "AddPrefix", TargetKind.Method)] - public static Expression AddPrefix(Expression personExpression, Expression prefixExpression) - { - Expression> ex = (person, prefix) => prefix + person.LastName; - return ex.BindParameters(personExpression, prefixExpression); - } - - [Compiler(typeof(Assignment), "Current", TargetKind.PropertyGet)] - public static Expression Current(Expression assignmentExpression) - { - Expression> ex = a => a.Active && (a.Start <= DateTime.Now) && (a.End == null || a.End.Value >= DateTime.Now); - return ex.BindParameters(assignmentExpression); - } - } - - public class CustomExpressionCompilers : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - config.Types.Register(typeof (CustomLinqCompilerContainer)); - RegisterLinqExtensions(config); - return config; - } - - private static void RegisterLinqExtensions(DomainConfiguration config) - { - var extensions = config.LinqExtensions; - var type = typeof (RegistrarTestEntity); - Expression> staticProperty = () => 0; - extensions.Register(type.GetProperty("StaticProperty"), staticProperty); - Expression> instanceProperty = e => e.Id % 10; - extensions.Register(type.GetProperty("InstanceProperty"), instanceProperty); - Expression> staticMethod = value => value * 2; - extensions.Register(type.GetMethod("StaticMethod"), staticMethod); - Expression> instanceMethod = (e, value) => value * e.Id; - extensions.Register(type.GetMethod("InstanceMethod"), instanceMethod); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Fill(); - var expected1 = session.Query.All().AsEnumerable().OrderBy(p => p.Id).Select(p => p.Fullname).ToList(); - Assert.Greater(expected1.Count, 0); - var fullNames1 = session.Query.All().OrderBy(p => p.Id).Select(p => p.Fullname).ToList(); - Assert.IsTrue(expected1.SequenceEqual(fullNames1)); - - var expected2 = session.Query.All().AsEnumerable().OrderBy(p => p.Id).Select(p => p.AddPrefix("Mr. ")).ToList(); - var fullNames2 = session.Query.All().OrderBy(p => p.Id).Select(p => p.AddPrefix("Mr. ")).ToList(); - Assert.IsTrue(expected2.SequenceEqual(fullNames2)); - // Rollback - } - } - } - - [Test] - public void AssignmentCurrentTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Assignment() {Active = true, Start = new DateTime(2009, 11, 23), End = null}; - new Assignment() {Active = false, Start = new DateTime(2009, 10, 3), End = null}; - new Assignment() {Active = false, Start = new DateTime(2020, 01, 10), End = new DateTime(2044, 12, 3)}; - new Assignment() {Active = true, Start = new DateTime(2026, 01, 10), End = new DateTime(2045, 11, 3)}; - new Assignment() {Active = true, Start = new DateTime(2010, 01, 10), End = new DateTime(2035, 11, 3)}; - - var currentCount = session.Query.All().Count(a => a.Current); - Assert.AreEqual(2, currentCount); - // Rollback - } - } - - [Test] - public void RegistrarTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var test = new RegistrarTestEntity(); - var id = test.Id; - var actual = session.Query.All() - .Select(item => new { - Id = item.Id, - StaticMethod = RegistrarTestEntity.StaticMethod(1), - StaticProperty = RegistrarTestEntity.StaticProperty, - InstanceMethod = item.InstanceMethod(1), - InstanceProperty = item.InstanceProperty, - }) - // Fake check to force execution at server side - .Where(item => item.Id >= 0 || item.InstanceMethod == item.InstanceProperty) - .Single(); - Assert.AreEqual(RegistrarTestEntity.StaticMethod(1), actual.StaticMethod); - Assert.AreEqual(RegistrarTestEntity.StaticProperty, actual.StaticProperty); - Assert.AreEqual(test.InstanceMethod(1), actual.InstanceMethod); - Assert.AreEqual(test.InstanceProperty, actual.InstanceProperty); - } - } - - private void Fill() - { - new Person {FirstName = "Ivan", LastName = "Semenov"}; - new Person {FirstName = "John", LastName = "Smith"}; - new Person {FirstName = "Andrew", LastName = "Politkovsky"}; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.11.13 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.CustomExpressionCompilersModel; +using System.Linq; + +namespace Xtensive.Orm.Tests.Linq.CustomExpressionCompilersModel +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field] + [Key] + public int Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public DateTime BirthDay { get; set; } + + public string Fullname + { + get { return string.Format("{0} {1}", FirstName, LastName); } + } + + public string AddPrefix(string prefix) + { + return string.Format("{0}{1}", prefix, LastName); + } + } + + [HierarchyRoot] + public class Assignment : Entity + { + [Field, Key] + public int Id { get; private set; } + [Field] + public bool Active { get; set; } + [Field] + public DateTime Start { get; set; } + [Field] + public DateTime? End { get; set; } + + public bool Current + { + get { return Active && Start <= DateTime.Now && (End == null || End.Value >= DateTime.Now); } + } + } + + [HierarchyRoot] + public class RegistrarTestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + public static int StaticProperty { get { return 0; } } + public int InstanceProperty { get { return Id % 10; } } + + public static int StaticMethod(int value) + { + return value * 2; + } + + public int InstanceMethod(int value) + { + return value * Id; + } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + [CompilerContainer(typeof (Expression))] + internal static class CustomLinqCompilerContainer + { + [Compiler(typeof (Person), "Fullname", TargetKind.PropertyGet)] + public static Expression FullName(Expression personExpression) + { + Expression> ex = person => person.FirstName + " " + person.LastName; + return ex.BindParameters(personExpression); + } + + [Compiler(typeof (Person), "AddPrefix", TargetKind.Method)] + public static Expression AddPrefix(Expression personExpression, Expression prefixExpression) + { + Expression> ex = (person, prefix) => prefix + person.LastName; + return ex.BindParameters(personExpression, prefixExpression); + } + + [Compiler(typeof(Assignment), "Current", TargetKind.PropertyGet)] + public static Expression Current(Expression assignmentExpression) + { + Expression> ex = a => a.Active && (a.Start <= DateTime.Now) && (a.End == null || a.End.Value >= DateTime.Now); + return ex.BindParameters(assignmentExpression); + } + } + + public class CustomExpressionCompilers : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + config.Types.Register(typeof (CustomLinqCompilerContainer)); + RegisterLinqExtensions(config); + return config; + } + + private static void RegisterLinqExtensions(DomainConfiguration config) + { + var extensions = config.LinqExtensions; + var type = typeof (RegistrarTestEntity); + Expression> staticProperty = () => 0; + extensions.Register(type.GetProperty("StaticProperty"), staticProperty); + Expression> instanceProperty = e => e.Id % 10; + extensions.Register(type.GetProperty("InstanceProperty"), instanceProperty); + Expression> staticMethod = value => value * 2; + extensions.Register(type.GetMethod("StaticMethod"), staticMethod); + Expression> instanceMethod = (e, value) => value * e.Id; + extensions.Register(type.GetMethod("InstanceMethod"), instanceMethod); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Fill(); + var expected1 = session.Query.All().AsEnumerable().OrderBy(p => p.Id).Select(p => p.Fullname).ToList(); + Assert.Greater(expected1.Count, 0); + var fullNames1 = session.Query.All().OrderBy(p => p.Id).Select(p => p.Fullname).ToList(); + Assert.IsTrue(expected1.SequenceEqual(fullNames1)); + + var expected2 = session.Query.All().AsEnumerable().OrderBy(p => p.Id).Select(p => p.AddPrefix("Mr. ")).ToList(); + var fullNames2 = session.Query.All().OrderBy(p => p.Id).Select(p => p.AddPrefix("Mr. ")).ToList(); + Assert.IsTrue(expected2.SequenceEqual(fullNames2)); + // Rollback + } + } + } + + [Test] + public void AssignmentCurrentTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Assignment() {Active = true, Start = new DateTime(2009, 11, 23), End = null}; + new Assignment() {Active = false, Start = new DateTime(2009, 10, 3), End = null}; + new Assignment() {Active = false, Start = new DateTime(2020, 01, 10), End = new DateTime(2044, 12, 3)}; + new Assignment() {Active = true, Start = new DateTime(2026, 01, 10), End = new DateTime(2045, 11, 3)}; + new Assignment() {Active = true, Start = new DateTime(2010, 01, 10), End = new DateTime(2035, 11, 3)}; + + var currentCount = session.Query.All().Count(a => a.Current); + Assert.AreEqual(2, currentCount); + // Rollback + } + } + + [Test] + public void RegistrarTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var test = new RegistrarTestEntity(); + var id = test.Id; + var actual = session.Query.All() + .Select(item => new { + Id = item.Id, + StaticMethod = RegistrarTestEntity.StaticMethod(1), + StaticProperty = RegistrarTestEntity.StaticProperty, + InstanceMethod = item.InstanceMethod(1), + InstanceProperty = item.InstanceProperty, + }) + // Fake check to force execution at server side + .Where(item => item.Id >= 0 || item.InstanceMethod == item.InstanceProperty) + .Single(); + Assert.AreEqual(RegistrarTestEntity.StaticMethod(1), actual.StaticMethod); + Assert.AreEqual(RegistrarTestEntity.StaticProperty, actual.StaticProperty); + Assert.AreEqual(test.InstanceMethod(1), actual.InstanceMethod); + Assert.AreEqual(test.InstanceProperty, actual.InstanceProperty); + } + } + + private void Fill() + { + new Person {FirstName = "Ivan", LastName = "Semenov"}; + new Person {FirstName = "John", LastName = "Smith"}; + new Person {FirstName = "Andrew", LastName = "Politkovsky"}; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DataContextTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DataContextTest.cs index 04949878e0..d4e4b42963 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DataContextTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DataContextTest.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.02 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class DataContextTest : ChinookDOModelTest - { - - private class UserException : Exception - { - } - - private class DataContext - { - public IQueryable Invoices { get; private set; } - public IQueryable Customers { get; private set; } - - public IQueryable CustomersException - { - get { throw new UserException(); } - } - - public IQueryable CustomersNull - { - get { return null; } - } - - public IQueryable CustomersNullQueryableExpression - { - get { throw new NotImplementedException(); } - } - - public IQueryable CustomersFakeQueryableExpression - { - get { throw new NotImplementedException(); } - } - - public DataContext(Session session) - { - Invoices = session.Query.All(); - Customers = session.Query.All(); - } - } - - [Test] - public void JoinTest() - { - var context = new DataContext(Session.Current); - var result = - from c in context.Customers - from o in context.Invoices - select new {c, o}; - var expected = from c in Session.Query.All().AsEnumerable() - from o in Session.Query.All().AsEnumerable() - select new {c, o}; - Assert.AreEqual(0, expected.Except(result).Count()); - } - - [Test] - public void NullTest() - { - var context = new DataContext(Session.Current); - AssertEx.Throws(()=>context.CustomersNull.SelectMany(c => context.Invoices, (c, o) => new {c, o})); - } - - [Test] - public void ExceptionTest() - { - var context = new DataContext(Session.Current); - AssertEx.Throws(()=>context.CustomersException.SelectMany(c => context.Invoices, (c, o) => new {c, o})); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.02 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class DataContextTest : ChinookDOModelTest + { + + private class UserException : Exception + { + } + + private class DataContext + { + public IQueryable Invoices { get; private set; } + public IQueryable Customers { get; private set; } + + public IQueryable CustomersException + { + get { throw new UserException(); } + } + + public IQueryable CustomersNull + { + get { return null; } + } + + public IQueryable CustomersNullQueryableExpression + { + get { throw new NotImplementedException(); } + } + + public IQueryable CustomersFakeQueryableExpression + { + get { throw new NotImplementedException(); } + } + + public DataContext(Session session) + { + Invoices = session.Query.All(); + Customers = session.Query.All(); + } + } + + [Test] + public void JoinTest() + { + var context = new DataContext(Session.Current); + var result = + from c in context.Customers + from o in context.Invoices + select new {c, o}; + var expected = from c in Session.Query.All().AsEnumerable() + from o in Session.Query.All().AsEnumerable() + select new {c, o}; + Assert.AreEqual(0, expected.Except(result).Count()); + } + + [Test] + public void NullTest() + { + var context = new DataContext(Session.Current); + AssertEx.Throws(()=>context.CustomersNull.SelectMany(c => context.Invoices, (c, o) => new {c, o})); + } + + [Test] + public void ExceptionTest() + { + var context = new DataContext(Session.Current); + AssertEx.Throws(()=>context.CustomersException.SelectMany(c => context.Invoices, (c, o) => new {c, o})); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/BaseTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/BaseTest.cs index 385ac5aa6a..c041fcbd64 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/BaseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/BaseTest.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.09.15 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset -{ - public abstract class BaseTest : AutoBuildTest - { - protected abstract void RegisterTypes(DomainConfiguration configuration); - - protected virtual void PopulateNonPersistentData() - { - } - - protected virtual void PopulateEntities(Session session) - { - } - - protected virtual void InitializeCustomSettings(DomainConfiguration configuration) - { - } - - protected void ExecuteInsideSession(Action action) - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - action(); - } - } - - protected override void PopulateData() - { - PopulateNonPersistentData(); - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - PopulateEntities(session); - - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - RegisterTypes(configuration); - InitializeCustomSettings(configuration); - return configuration; - } - - protected void RunTest(Expression> filter, int rightCount = 1) - where T : Entity - { - var count = Query.All().Count(filter); - Assert.AreEqual(rightCount, count); - } - - protected void RunWrongTest(Expression> filter) - where T : Entity - { - RunTest(filter, 0); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.09.15 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset +{ + public abstract class BaseTest : AutoBuildTest + { + protected abstract void RegisterTypes(DomainConfiguration configuration); + + protected virtual void PopulateNonPersistentData() + { + } + + protected virtual void PopulateEntities(Session session) + { + } + + protected virtual void InitializeCustomSettings(DomainConfiguration configuration) + { + } + + protected void ExecuteInsideSession(Action action) + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + action(); + } + } + + protected override void PopulateData() + { + PopulateNonPersistentData(); + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + PopulateEntities(session); + + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + RegisterTypes(configuration); + InitializeCustomSettings(configuration); + return configuration; + } + + protected void RunTest(Expression> filter, int rightCount = 1) + where T : Entity + { + var count = Query.All().Count(filter); + Assert.AreEqual(rightCount, count); + } + + protected void RunWrongTest(Expression> filter) + where T : Entity + { + RunTest(filter, 0); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/ComparisonTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/ComparisonTest.cs index c09c9a05ce..9534473936 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/ComparisonTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/ComparisonTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class ComparisonTest : DateTimeBaseTest - { - [Test] - public void EqualsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime==FirstDateTime); - RunTest(c => c.MillisecondDateTime==FirstMillisecondDateTime); - RunTest(c => c.NullableDateTime==NullableDateTime); - - RunWrongTest(c => c.DateTime==WrongDateTime); - RunWrongTest(c => c.MillisecondDateTime==WrongMillisecondDateTime); - RunWrongTest(c => c.NullableDateTime==WrongDateTime); - RunWrongTest(c => c.NullableDateTime==null); - }); - } - - [Test] - public void NotEqualTest() - { - ExecuteInsideSession(() => { - RunTest(c=>c.DateTime!=FirstDateTime.AddYears(1)); - RunTest(c => c.MillisecondDateTime!=FirstMillisecondDateTime.AddYears(1)); - RunTest(c=>c.NullableDateTime!=NullableDateTime.AddYears(1)); - }); - } - - [Test] - public void CompareTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime > FirstDateTime.Date); - RunTest(c => c.DateTime > FirstDateTime.AddSeconds(-1)); - RunTest(c => c.MillisecondDateTime > FirstMillisecondDateTime.AddMilliseconds(-1)); - - RunTest(c => c.DateTime < FirstDateTime.Date.AddDays(1)); - RunTest(c => c.DateTime < FirstDateTime.AddSeconds(1)); - RunTest(c => c.MillisecondDateTime < FirstMillisecondDateTime.AddMilliseconds(1)); - - RunWrongTest(c => c.DateTime > FirstDateTime); - RunWrongTest(c => c.MillisecondDateTime > FirstMillisecondDateTime); - RunWrongTest(c => c.MillisecondDateTime < FirstMillisecondDateTime.Date); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class ComparisonTest : DateTimeBaseTest + { + [Test] + public void EqualsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime==FirstDateTime); + RunTest(c => c.MillisecondDateTime==FirstMillisecondDateTime); + RunTest(c => c.NullableDateTime==NullableDateTime); + + RunWrongTest(c => c.DateTime==WrongDateTime); + RunWrongTest(c => c.MillisecondDateTime==WrongMillisecondDateTime); + RunWrongTest(c => c.NullableDateTime==WrongDateTime); + RunWrongTest(c => c.NullableDateTime==null); + }); + } + + [Test] + public void NotEqualTest() + { + ExecuteInsideSession(() => { + RunTest(c=>c.DateTime!=FirstDateTime.AddYears(1)); + RunTest(c => c.MillisecondDateTime!=FirstMillisecondDateTime.AddYears(1)); + RunTest(c=>c.NullableDateTime!=NullableDateTime.AddYears(1)); + }); + } + + [Test] + public void CompareTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime > FirstDateTime.Date); + RunTest(c => c.DateTime > FirstDateTime.AddSeconds(-1)); + RunTest(c => c.MillisecondDateTime > FirstMillisecondDateTime.AddMilliseconds(-1)); + + RunTest(c => c.DateTime < FirstDateTime.Date.AddDays(1)); + RunTest(c => c.DateTime < FirstDateTime.AddSeconds(1)); + RunTest(c => c.MillisecondDateTime < FirstMillisecondDateTime.AddMilliseconds(1)); + + RunWrongTest(c => c.DateTime > FirstDateTime); + RunWrongTest(c => c.MillisecondDateTime > FirstMillisecondDateTime); + RunWrongTest(c => c.MillisecondDateTime < FirstMillisecondDateTime.Date); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DateTimeToIsoTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DateTimeToIsoTest.cs index 4c85a1b0b7..b58dd50aee 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DateTimeToIsoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DateTimeToIsoTest.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class DateTimeToIsoTest : DateTimeBaseTest - { - [Test] - public void ToIsoStringTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.ToString("s")==FirstDateTime.ToString("s")); - RunWrongTest(c => c.DateTime.ToString("s")==FirstDateTime.AddMinutes(1).ToString("s")); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class DateTimeToIsoTest : DateTimeBaseTest + { + [Test] + public void ToIsoStringTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.ToString("s")==FirstDateTime.ToString("s")); + RunWrongTest(c => c.DateTime.ToString("s")==FirstDateTime.AddMinutes(1).ToString("s")); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DistinctTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DistinctTest.cs index ffbb3e2e1b..e1c301044d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DistinctTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/DistinctTest.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class DistinctTest : DateTimeBaseTest - { - [Test] - public void DistinctByDateTimeTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); - } - - [Test] - public void DistinctByDateTimeWithMillisecondsTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); - } - - [Test] - public void DistinctByNullableDateTimeTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); - } - - private void DistinctPrivate(Expression> selectExpression) - where T : Entity - { - var compiledSelectExpression = selectExpression.Compile(); - var distinctLocal = Query.All().ToArray().Select(compiledSelectExpression).Distinct().OrderBy(c => c); - var distinctByServer = Query.All().Select(selectExpression).Distinct().OrderBy(c => c); - Assert.IsTrue(distinctLocal.SequenceEqual(distinctByServer)); - - distinctByServer = Query.All().Select(selectExpression).Distinct().OrderByDescending(c => c); - Assert.IsFalse(distinctLocal.SequenceEqual(distinctByServer)); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class DistinctTest : DateTimeBaseTest + { + [Test] + public void DistinctByDateTimeTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); + } + + [Test] + public void DistinctByDateTimeWithMillisecondsTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); + } + + [Test] + public void DistinctByNullableDateTimeTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTime)); + } + + private void DistinctPrivate(Expression> selectExpression) + where T : Entity + { + var compiledSelectExpression = selectExpression.Compile(); + var distinctLocal = Query.All().ToArray().Select(compiledSelectExpression).Distinct().OrderBy(c => c); + var distinctByServer = Query.All().Select(selectExpression).Distinct().OrderBy(c => c); + Assert.IsTrue(distinctLocal.SequenceEqual(distinctByServer)); + + distinctByServer = Query.All().Select(selectExpression).Distinct().OrderByDescending(c => c); + Assert.IsFalse(distinctLocal.SequenceEqual(distinctByServer)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/GroupByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/GroupByTest.cs index e5f4cde089..ccae27229b 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/GroupByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/GroupByTest.cs @@ -1,43 +1,43 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class GroupByTest : DateTimeBaseTest - { - [Test] - public void DateTimeGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); - } - - [Test] - public void MillisecondDateTimeGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); - } - - [Test] - public void NullableDateTimeGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); - } - - private void GroupByPrivate(Expression> groupByExpression, Expression> orderByExpression) - where T : Entity - { - var compiledGroupByExpression = groupByExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - var groupByLocal = Query.All().ToArray().GroupBy(compiledGroupByExpression).ToArray(); - var groupByServer = Query.All().GroupBy(groupByExpression); - foreach (var group in groupByServer) { - Assert.Contains(group, groupByLocal); - var localGroup = groupByLocal.Single(c => c.Key.Equals(group.Key)); - Assert.IsTrue(group.OrderBy(compiledOrderByExpression).SequenceEqual(localGroup.OrderBy(compiledOrderByExpression))); - } - } - } +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class GroupByTest : DateTimeBaseTest + { + [Test] + public void DateTimeGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); + } + + [Test] + public void MillisecondDateTimeGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); + } + + [Test] + public void NullableDateTimeGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTime, c => c.Id)); + } + + private void GroupByPrivate(Expression> groupByExpression, Expression> orderByExpression) + where T : Entity + { + var compiledGroupByExpression = groupByExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + var groupByLocal = Query.All().ToArray().GroupBy(compiledGroupByExpression).ToArray(); + var groupByServer = Query.All().GroupBy(groupByExpression); + foreach (var group in groupByServer) { + Assert.Contains(group, groupByLocal); + var localGroup = groupByLocal.Single(c => c.Key.Equals(group.Key)); + Assert.IsTrue(group.OrderBy(compiledOrderByExpression).SequenceEqual(localGroup.OrderBy(compiledOrderByExpression))); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/JoinTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/JoinTest.cs index e534c9b27f..7eb9f0794d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/JoinTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/JoinTest.cs @@ -1,73 +1,73 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class JoinTest : DateTimeBaseTest - { - [Test] - public void DateTimeJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTime, long>( - left => left.DateTime, - right => right.DateTime, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, - c => c.LeftId, - c => c.RightId)); - } - - [Test] - public void MillisecondDateTimeJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTime, long>( - left => left.DateTime, - right => right.DateTime, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, - c => c.LeftId, - c => c.RightId)); - } - - [Test] - public void NullableDateTimeJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTime?, long>( - left => left.DateTime, - right => right.DateTime, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, - c => c.LeftId, - c => c.RightId)); - } - - private void JoinPrivate(Expression> leftJoinExpression, Expression> rightJoinExpression, - Expression> joinResultExpression, Expression> orderByExpression, Expression> thenByExpression) - where T1 : Entity - where T2 : Entity - { - var compiledLeftJoinExpression = leftJoinExpression.Compile(); - var compiledRightJoinExpression = rightJoinExpression.Compile(); - var compiledJoinResultExpression = joinResultExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - var compiledThenByExpression = thenByExpression.Compile(); - var joinLocal = Query.All().ToArray() - .Join(Query.All().ToArray(), compiledLeftJoinExpression, compiledRightJoinExpression, compiledJoinResultExpression) - .OrderBy(compiledOrderByExpression) - .ThenBy(compiledThenByExpression); - - var joinServer = Query.All() - .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) - .OrderBy(orderByExpression) - .ThenBy(thenByExpression); - - Assert.IsTrue(joinLocal.SequenceEqual(joinServer)); - - joinServer = Query.All() - .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) - .OrderByDescending(orderByExpression) - .ThenBy(thenByExpression); - Assert.IsFalse(joinLocal.SequenceEqual(joinServer)); - } - } +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class JoinTest : DateTimeBaseTest + { + [Test] + public void DateTimeJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTime, long>( + left => left.DateTime, + right => right.DateTime, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, + c => c.LeftId, + c => c.RightId)); + } + + [Test] + public void MillisecondDateTimeJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTime, long>( + left => left.DateTime, + right => right.DateTime, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, + c => c.LeftId, + c => c.RightId)); + } + + [Test] + public void NullableDateTimeJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTime?, long>( + left => left.DateTime, + right => right.DateTime, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTime, RightDateTime = right.DateTime }, + c => c.LeftId, + c => c.RightId)); + } + + private void JoinPrivate(Expression> leftJoinExpression, Expression> rightJoinExpression, + Expression> joinResultExpression, Expression> orderByExpression, Expression> thenByExpression) + where T1 : Entity + where T2 : Entity + { + var compiledLeftJoinExpression = leftJoinExpression.Compile(); + var compiledRightJoinExpression = rightJoinExpression.Compile(); + var compiledJoinResultExpression = joinResultExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + var compiledThenByExpression = thenByExpression.Compile(); + var joinLocal = Query.All().ToArray() + .Join(Query.All().ToArray(), compiledLeftJoinExpression, compiledRightJoinExpression, compiledJoinResultExpression) + .OrderBy(compiledOrderByExpression) + .ThenBy(compiledThenByExpression); + + var joinServer = Query.All() + .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) + .OrderBy(orderByExpression) + .ThenBy(thenByExpression); + + Assert.IsTrue(joinLocal.SequenceEqual(joinServer)); + + joinServer = Query.All() + .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) + .OrderByDescending(orderByExpression) + .ThenBy(thenByExpression); + Assert.IsFalse(joinLocal.SequenceEqual(joinServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/MinMaxTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/MinMaxTest.cs index 9aa7a0920d..78cc986822 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/MinMaxTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/MinMaxTest.cs @@ -1,44 +1,44 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class MinMaxTest : DateTimeBaseTest - { - [Test] - public void DateTimeMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); - } - - [Test] - public void MillisecondDateTimeMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); - } - - [Test] - public void NullableDateTimeMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); - } - - private void MinMaxPrivate(Expression> selectExpression) - where T : Entity - { - var compiledSelectExpression = selectExpression.Compile(); - var minLocal = Query.All().ToArray().Min(compiledSelectExpression); - var maxLocal = Query.All().ToArray().Max(compiledSelectExpression); - var minServer = Query.All().Min(selectExpression); - var maxServer = Query.All().Max(selectExpression); - - Assert.AreEqual(minLocal, minServer); - Assert.AreEqual(maxLocal, maxServer); - Assert.AreNotEqual(minLocal, maxServer); - Assert.AreNotEqual(maxLocal, minServer); - } - } +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class MinMaxTest : DateTimeBaseTest + { + [Test] + public void DateTimeMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); + } + + [Test] + public void MillisecondDateTimeMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); + } + + [Test] + public void NullableDateTimeMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTime)); + } + + private void MinMaxPrivate(Expression> selectExpression) + where T : Entity + { + var compiledSelectExpression = selectExpression.Compile(); + var minLocal = Query.All().ToArray().Min(compiledSelectExpression); + var maxLocal = Query.All().ToArray().Max(compiledSelectExpression); + var minServer = Query.All().Min(selectExpression); + var maxServer = Query.All().Max(selectExpression); + + Assert.AreEqual(minLocal, minServer); + Assert.AreEqual(maxLocal, maxServer); + Assert.AreNotEqual(minLocal, maxServer); + Assert.AreNotEqual(maxLocal, minServer); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OperationsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OperationsTest.cs index 7380fab12b..2629b5b40d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OperationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OperationsTest.cs @@ -1,191 +1,191 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class OperationsTest : DateTimeBaseTest - { - [Test] - public void AddYearsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddYears(1)==FirstDateTime.AddYears(1)); - RunTest(c => c.MillisecondDateTime.AddYears(-2)==FirstMillisecondDateTime.AddYears(-2)); - RunTest(c => c.NullableDateTime.Value.AddYears(33)==NullableDateTime.AddYears(33)); - - RunWrongTest(c => c.DateTime.AddYears(1)==FirstDateTime.AddYears(2)); - RunWrongTest(c => c.MillisecondDateTime.AddYears(-1)==FirstMillisecondDateTime.AddYears(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddYears(33)==NullableDateTime.AddYears(44)); - }); - } - - [Test] - public void AddMonthsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddMonths(1)==FirstDateTime.AddMonths(1)); - RunTest(c => c.MillisecondDateTime.AddMonths(-2)==FirstMillisecondDateTime.AddMonths(-2)); - RunTest(c => c.NullableDateTime.Value.AddMonths(33)==NullableDateTime.AddMonths(33)); - - RunWrongTest(c => c.DateTime.AddMonths(1)==FirstDateTime.AddMonths(2)); - RunWrongTest(c => c.MillisecondDateTime.AddMonths(-1)==FirstMillisecondDateTime.AddMonths(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddMonths(33)==NullableDateTime.AddMonths(44)); - }); - } - - [Test] - public void AddDaysTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddDays(1)==FirstDateTime.AddDays(1)); - RunTest(c => c.MillisecondDateTime.AddDays(-2)==FirstMillisecondDateTime.AddDays(-2)); - RunTest(c => c.NullableDateTime.Value.AddDays(33)==NullableDateTime.AddDays(33)); - - RunWrongTest(c => c.DateTime.AddDays(1)==FirstDateTime.AddDays(2)); - RunWrongTest(c => c.MillisecondDateTime.AddDays(-1)==FirstMillisecondDateTime.AddDays(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddDays(33)==NullableDateTime.AddDays(44)); - }); - } - - [Test] - public void AddHoursTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddHours(1)==FirstDateTime.AddHours(1)); - RunTest(c => c.MillisecondDateTime.AddHours(-2)==FirstMillisecondDateTime.AddHours(-2)); - RunTest(c => c.NullableDateTime.Value.AddHours(33)==NullableDateTime.AddHours(33)); - - RunWrongTest(c => c.DateTime.AddHours(1)==FirstDateTime.AddHours(2)); - RunWrongTest(c => c.MillisecondDateTime.AddHours(-1)==FirstMillisecondDateTime.AddHours(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddHours(33)==NullableDateTime.AddHours(44)); - }); - } - - [Test] - public void AddMinutesTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddMinutes(1)==FirstDateTime.AddMinutes(1)); - RunTest(c => c.MillisecondDateTime.AddMinutes(-2)==FirstMillisecondDateTime.AddMinutes(-2)); - RunTest(c => c.NullableDateTime.Value.AddMinutes(33)==NullableDateTime.AddMinutes(33)); - - RunWrongTest(c => c.DateTime.AddMinutes(1)==FirstDateTime.AddMinutes(2)); - RunWrongTest(c => c.MillisecondDateTime.AddMinutes(-1)==FirstMillisecondDateTime.AddMinutes(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddMinutes(33)==NullableDateTime.AddMinutes(44)); - }); - } - - [Test] - public void AddSecondsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.AddSeconds(1)==FirstDateTime.AddSeconds(1)); - RunTest(c => c.MillisecondDateTime.AddSeconds(-2)==FirstMillisecondDateTime.AddSeconds(-2)); - RunTest(c => c.NullableDateTime.Value.AddSeconds(33)==NullableDateTime.AddSeconds(33)); - - RunWrongTest(c => c.DateTime.AddSeconds(1)==FirstDateTime.AddSeconds(2)); - RunWrongTest(c => c.MillisecondDateTime.AddSeconds(-1)==FirstMillisecondDateTime.AddSeconds(-2)); - RunWrongTest(c => c.NullableDateTime.Value.AddSeconds(33)==NullableDateTime.AddSeconds(44)); - }); - } - - [Test] - public void AddMillisecondsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.MillisecondDateTime.AddMilliseconds(-2)==FirstMillisecondDateTime.AddMilliseconds(-2)); - RunWrongTest(c => c.MillisecondDateTime.AddMilliseconds(-1)==FirstMillisecondDateTime.AddMilliseconds(-2)); - }); - } - - [Test] - public void AddTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Add(FirstOffset)==FirstDateTime.Add(FirstOffset)); - RunTest(c => c.MillisecondDateTime.Add(SecondOffset)==FirstMillisecondDateTime.Add(SecondOffset)); - RunTest(c => c.NullableDateTime.Value.Add(FirstOffset)==NullableDateTime.Add(FirstOffset)); - - RunWrongTest(c => c.DateTime.Add(FirstOffset)==FirstDateTime.Add(WrongOffset)); - RunWrongTest(c => c.MillisecondDateTime.Add(SecondOffset)==FirstMillisecondDateTime.Add(WrongOffset)); - RunWrongTest(c => c.NullableDateTime.Value.Add(FirstOffset)==NullableDateTime.Add(WrongOffset)); - }); - } - - [Test] - public void SubtractTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Subtract(FirstOffset)==FirstDateTime.Subtract(FirstOffset)); - RunTest(c => c.MillisecondDateTime.Subtract(SecondOffset)==FirstMillisecondDateTime.Subtract(SecondOffset)); - RunTest(c => c.NullableDateTime.Value.Subtract(FirstOffset)==NullableDateTime.Subtract(FirstOffset)); - - RunWrongTest(c => c.DateTime.Subtract(FirstOffset)==FirstDateTime.Subtract(WrongOffset)); - RunWrongTest(c => c.MillisecondDateTime.Subtract(SecondOffset)==FirstMillisecondDateTime.Subtract(WrongOffset)); - RunWrongTest(c => c.NullableDateTime.Value.Subtract(FirstOffset)==NullableDateTime.Subtract(WrongOffset)); - }); - } - - [Test] - public void SubtractDateTimeTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Subtract(SecondDateTime)==FirstDateTime.Subtract(SecondDateTime)); - RunTest(c => c.MillisecondDateTime.Subtract(SecondDateTime)==FirstMillisecondDateTime.Subtract(SecondDateTime)); - RunTest(c => c.NullableDateTime.Value.Subtract(SecondDateTime)==NullableDateTime.Subtract(SecondDateTime)); - - RunWrongTest(c => c.DateTime.Subtract(SecondDateTime)==FirstDateTime.Subtract(WrongDateTime)); - RunWrongTest(c => c.MillisecondDateTime.Subtract(SecondDateTime)==FirstMillisecondDateTime.Subtract(WrongDateTime)); - RunWrongTest(c => c.NullableDateTime.Value.Subtract(SecondDateTime)==NullableDateTime.Subtract(WrongDateTime)); - }); - } - - [Test] - public void PlusTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime + FirstOffset==FirstDateTime + FirstOffset); - RunTest(c => c.MillisecondDateTime + SecondOffset==FirstMillisecondDateTime + SecondOffset); - RunTest(c => c.NullableDateTime + FirstOffset==NullableDateTime + FirstOffset); - - RunWrongTest(c => c.DateTime + FirstOffset==FirstDateTime + WrongOffset); - RunWrongTest(c => c.MillisecondDateTime + SecondOffset==FirstMillisecondDateTime + WrongOffset); - RunWrongTest(c => c.NullableDateTime + FirstOffset==NullableDateTime + WrongOffset); - }); - } - - [Test] - public void MinusTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime - FirstOffset==FirstDateTime - FirstOffset); - RunTest(c => c.MillisecondDateTime - SecondOffset==FirstMillisecondDateTime - SecondOffset); - RunTest(c => c.NullableDateTime - FirstOffset==NullableDateTime - FirstOffset); - - RunWrongTest(c => c.DateTime - FirstOffset==FirstDateTime - WrongOffset); - RunWrongTest(c => c.MillisecondDateTime - SecondOffset==FirstMillisecondDateTime - WrongOffset); - RunWrongTest(c => c.NullableDateTime - FirstOffset==NullableDateTime - WrongOffset); - }); - } - - [Test] - public void MinusDateTimeTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime - SecondDateTime==FirstDateTime - SecondDateTime); - RunTest(c => c.MillisecondDateTime - SecondDateTime==FirstMillisecondDateTime - SecondDateTime); - RunTest(c => c.NullableDateTime - SecondDateTime==NullableDateTime - SecondDateTime); - - RunWrongTest(c => c.DateTime - SecondDateTime==FirstDateTime - WrongDateTime); - RunWrongTest(c => c.MillisecondDateTime - SecondDateTime==FirstMillisecondDateTime - WrongDateTime); - RunWrongTest(c => c.NullableDateTime - SecondDateTime==NullableDateTime - WrongDateTime); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class OperationsTest : DateTimeBaseTest + { + [Test] + public void AddYearsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddYears(1)==FirstDateTime.AddYears(1)); + RunTest(c => c.MillisecondDateTime.AddYears(-2)==FirstMillisecondDateTime.AddYears(-2)); + RunTest(c => c.NullableDateTime.Value.AddYears(33)==NullableDateTime.AddYears(33)); + + RunWrongTest(c => c.DateTime.AddYears(1)==FirstDateTime.AddYears(2)); + RunWrongTest(c => c.MillisecondDateTime.AddYears(-1)==FirstMillisecondDateTime.AddYears(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddYears(33)==NullableDateTime.AddYears(44)); + }); + } + + [Test] + public void AddMonthsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddMonths(1)==FirstDateTime.AddMonths(1)); + RunTest(c => c.MillisecondDateTime.AddMonths(-2)==FirstMillisecondDateTime.AddMonths(-2)); + RunTest(c => c.NullableDateTime.Value.AddMonths(33)==NullableDateTime.AddMonths(33)); + + RunWrongTest(c => c.DateTime.AddMonths(1)==FirstDateTime.AddMonths(2)); + RunWrongTest(c => c.MillisecondDateTime.AddMonths(-1)==FirstMillisecondDateTime.AddMonths(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddMonths(33)==NullableDateTime.AddMonths(44)); + }); + } + + [Test] + public void AddDaysTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddDays(1)==FirstDateTime.AddDays(1)); + RunTest(c => c.MillisecondDateTime.AddDays(-2)==FirstMillisecondDateTime.AddDays(-2)); + RunTest(c => c.NullableDateTime.Value.AddDays(33)==NullableDateTime.AddDays(33)); + + RunWrongTest(c => c.DateTime.AddDays(1)==FirstDateTime.AddDays(2)); + RunWrongTest(c => c.MillisecondDateTime.AddDays(-1)==FirstMillisecondDateTime.AddDays(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddDays(33)==NullableDateTime.AddDays(44)); + }); + } + + [Test] + public void AddHoursTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddHours(1)==FirstDateTime.AddHours(1)); + RunTest(c => c.MillisecondDateTime.AddHours(-2)==FirstMillisecondDateTime.AddHours(-2)); + RunTest(c => c.NullableDateTime.Value.AddHours(33)==NullableDateTime.AddHours(33)); + + RunWrongTest(c => c.DateTime.AddHours(1)==FirstDateTime.AddHours(2)); + RunWrongTest(c => c.MillisecondDateTime.AddHours(-1)==FirstMillisecondDateTime.AddHours(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddHours(33)==NullableDateTime.AddHours(44)); + }); + } + + [Test] + public void AddMinutesTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddMinutes(1)==FirstDateTime.AddMinutes(1)); + RunTest(c => c.MillisecondDateTime.AddMinutes(-2)==FirstMillisecondDateTime.AddMinutes(-2)); + RunTest(c => c.NullableDateTime.Value.AddMinutes(33)==NullableDateTime.AddMinutes(33)); + + RunWrongTest(c => c.DateTime.AddMinutes(1)==FirstDateTime.AddMinutes(2)); + RunWrongTest(c => c.MillisecondDateTime.AddMinutes(-1)==FirstMillisecondDateTime.AddMinutes(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddMinutes(33)==NullableDateTime.AddMinutes(44)); + }); + } + + [Test] + public void AddSecondsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.AddSeconds(1)==FirstDateTime.AddSeconds(1)); + RunTest(c => c.MillisecondDateTime.AddSeconds(-2)==FirstMillisecondDateTime.AddSeconds(-2)); + RunTest(c => c.NullableDateTime.Value.AddSeconds(33)==NullableDateTime.AddSeconds(33)); + + RunWrongTest(c => c.DateTime.AddSeconds(1)==FirstDateTime.AddSeconds(2)); + RunWrongTest(c => c.MillisecondDateTime.AddSeconds(-1)==FirstMillisecondDateTime.AddSeconds(-2)); + RunWrongTest(c => c.NullableDateTime.Value.AddSeconds(33)==NullableDateTime.AddSeconds(44)); + }); + } + + [Test] + public void AddMillisecondsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.MillisecondDateTime.AddMilliseconds(-2)==FirstMillisecondDateTime.AddMilliseconds(-2)); + RunWrongTest(c => c.MillisecondDateTime.AddMilliseconds(-1)==FirstMillisecondDateTime.AddMilliseconds(-2)); + }); + } + + [Test] + public void AddTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Add(FirstOffset)==FirstDateTime.Add(FirstOffset)); + RunTest(c => c.MillisecondDateTime.Add(SecondOffset)==FirstMillisecondDateTime.Add(SecondOffset)); + RunTest(c => c.NullableDateTime.Value.Add(FirstOffset)==NullableDateTime.Add(FirstOffset)); + + RunWrongTest(c => c.DateTime.Add(FirstOffset)==FirstDateTime.Add(WrongOffset)); + RunWrongTest(c => c.MillisecondDateTime.Add(SecondOffset)==FirstMillisecondDateTime.Add(WrongOffset)); + RunWrongTest(c => c.NullableDateTime.Value.Add(FirstOffset)==NullableDateTime.Add(WrongOffset)); + }); + } + + [Test] + public void SubtractTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Subtract(FirstOffset)==FirstDateTime.Subtract(FirstOffset)); + RunTest(c => c.MillisecondDateTime.Subtract(SecondOffset)==FirstMillisecondDateTime.Subtract(SecondOffset)); + RunTest(c => c.NullableDateTime.Value.Subtract(FirstOffset)==NullableDateTime.Subtract(FirstOffset)); + + RunWrongTest(c => c.DateTime.Subtract(FirstOffset)==FirstDateTime.Subtract(WrongOffset)); + RunWrongTest(c => c.MillisecondDateTime.Subtract(SecondOffset)==FirstMillisecondDateTime.Subtract(WrongOffset)); + RunWrongTest(c => c.NullableDateTime.Value.Subtract(FirstOffset)==NullableDateTime.Subtract(WrongOffset)); + }); + } + + [Test] + public void SubtractDateTimeTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Subtract(SecondDateTime)==FirstDateTime.Subtract(SecondDateTime)); + RunTest(c => c.MillisecondDateTime.Subtract(SecondDateTime)==FirstMillisecondDateTime.Subtract(SecondDateTime)); + RunTest(c => c.NullableDateTime.Value.Subtract(SecondDateTime)==NullableDateTime.Subtract(SecondDateTime)); + + RunWrongTest(c => c.DateTime.Subtract(SecondDateTime)==FirstDateTime.Subtract(WrongDateTime)); + RunWrongTest(c => c.MillisecondDateTime.Subtract(SecondDateTime)==FirstMillisecondDateTime.Subtract(WrongDateTime)); + RunWrongTest(c => c.NullableDateTime.Value.Subtract(SecondDateTime)==NullableDateTime.Subtract(WrongDateTime)); + }); + } + + [Test] + public void PlusTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime + FirstOffset==FirstDateTime + FirstOffset); + RunTest(c => c.MillisecondDateTime + SecondOffset==FirstMillisecondDateTime + SecondOffset); + RunTest(c => c.NullableDateTime + FirstOffset==NullableDateTime + FirstOffset); + + RunWrongTest(c => c.DateTime + FirstOffset==FirstDateTime + WrongOffset); + RunWrongTest(c => c.MillisecondDateTime + SecondOffset==FirstMillisecondDateTime + WrongOffset); + RunWrongTest(c => c.NullableDateTime + FirstOffset==NullableDateTime + WrongOffset); + }); + } + + [Test] + public void MinusTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime - FirstOffset==FirstDateTime - FirstOffset); + RunTest(c => c.MillisecondDateTime - SecondOffset==FirstMillisecondDateTime - SecondOffset); + RunTest(c => c.NullableDateTime - FirstOffset==NullableDateTime - FirstOffset); + + RunWrongTest(c => c.DateTime - FirstOffset==FirstDateTime - WrongOffset); + RunWrongTest(c => c.MillisecondDateTime - SecondOffset==FirstMillisecondDateTime - WrongOffset); + RunWrongTest(c => c.NullableDateTime - FirstOffset==NullableDateTime - WrongOffset); + }); + } + + [Test] + public void MinusDateTimeTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime - SecondDateTime==FirstDateTime - SecondDateTime); + RunTest(c => c.MillisecondDateTime - SecondDateTime==FirstMillisecondDateTime - SecondDateTime); + RunTest(c => c.NullableDateTime - SecondDateTime==NullableDateTime - SecondDateTime); + + RunWrongTest(c => c.DateTime - SecondDateTime==FirstDateTime - WrongDateTime); + RunWrongTest(c => c.MillisecondDateTime - SecondDateTime==FirstMillisecondDateTime - WrongDateTime); + RunWrongTest(c => c.NullableDateTime - SecondDateTime==NullableDateTime - WrongDateTime); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OrderByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OrderByTest.cs index 927bb2ddbc..925a678cd6 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OrderByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OrderByTest.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class OrderByTest : DateTimeBaseTest - { - [Test] - public void DateTimeOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTime, c => c.Id); - OrderByPrivate(c => c.DateTime, c => c); - }); - } - - [Test] - public void MillisecondDateTimeOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTime, c => c.Id); - OrderByPrivate(c => c.DateTime, c => c); - }); - } - - [Test] - public void NullableDateTimeOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTime, c => c.Id); - OrderByPrivate(c => c.DateTime, c => c); - }); - } - - private void OrderByPrivate(Expression> orderByExpression, Expression> thenByExpression) - where T : Entity - { - var compiledOrderByExpression = orderByExpression.Compile(); - var compiledThenByExpression = thenByExpression.Compile(); - var notOrderedLocal = Query.All().ToArray(); - var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression).ThenBy(compiledThenByExpression); - var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression).ThenBy(compiledThenByExpression); - var orderedByServer = Query.All().OrderBy(orderByExpression).ThenBy(thenByExpression); - var orderedByServerDescending = Query.All().OrderByDescending(orderByExpression).ThenBy(thenByExpression); - - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); - } - - protected void OrderByPrivate(Expression> selectorExpression, Expression> orderByExpression) - where T1 : Entity - { - var compiledOrderByExpression = orderByExpression.Compile(); - - var notOrderedLocal = Query.All().Select(selectorExpression).ToArray(); - var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression); - var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression); - var orderedByServer = Query.All().Select(selectorExpression).OrderBy(orderByExpression); - var orderedByServerDescending = Query.All().Select(selectorExpression).OrderByDescending(orderByExpression); - - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); - } - } +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class OrderByTest : DateTimeBaseTest + { + [Test] + public void DateTimeOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTime, c => c.Id); + OrderByPrivate(c => c.DateTime, c => c); + }); + } + + [Test] + public void MillisecondDateTimeOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTime, c => c.Id); + OrderByPrivate(c => c.DateTime, c => c); + }); + } + + [Test] + public void NullableDateTimeOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTime, c => c.Id); + OrderByPrivate(c => c.DateTime, c => c); + }); + } + + private void OrderByPrivate(Expression> orderByExpression, Expression> thenByExpression) + where T : Entity + { + var compiledOrderByExpression = orderByExpression.Compile(); + var compiledThenByExpression = thenByExpression.Compile(); + var notOrderedLocal = Query.All().ToArray(); + var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression).ThenBy(compiledThenByExpression); + var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression).ThenBy(compiledThenByExpression); + var orderedByServer = Query.All().OrderBy(orderByExpression).ThenBy(thenByExpression); + var orderedByServerDescending = Query.All().OrderByDescending(orderByExpression).ThenBy(thenByExpression); + + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); + } + + protected void OrderByPrivate(Expression> selectorExpression, Expression> orderByExpression) + where T1 : Entity + { + var compiledOrderByExpression = orderByExpression.Compile(); + + var notOrderedLocal = Query.All().Select(selectorExpression).ToArray(); + var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression); + var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression); + var orderedByServer = Query.All().Select(selectorExpression).OrderBy(orderByExpression); + var orderedByServerDescending = Query.All().Select(selectorExpression).OrderByDescending(orderByExpression); + + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/PartsExtractionTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/PartsExtractionTest.cs index 2ac53408d1..bc061416f4 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/PartsExtractionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/PartsExtractionTest.cs @@ -1,163 +1,163 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class PartsExtractionTest : DateTimeBaseTest - { - [Test] - public void ExtractYearTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Year==FirstDateTime.Year); - RunTest(c => c.MillisecondDateTime.Year==FirstMillisecondDateTime.Year); - RunTest(c => c.NullableDateTime.Value.Year==NullableDateTime.Year); - - RunWrongTest(c => c.DateTime.Year==WrongDateTime.Year); - RunWrongTest(c => c.MillisecondDateTime.Year==WrongMillisecondDateTime.Year); - RunWrongTest(c => c.NullableDateTime.Value.Year==WrongDateTime.Year); - }); - } - - [Test] - public void ExtractMonthTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Month==FirstDateTime.Month); - RunTest(c => c.MillisecondDateTime.Month==FirstMillisecondDateTime.Month); - RunTest(c => c.NullableDateTime.Value.Month==NullableDateTime.Month); - - RunWrongTest(c => c.DateTime.Month==WrongDateTime.Month); - RunWrongTest(c => c.MillisecondDateTime.Month==WrongMillisecondDateTime.Month); - RunWrongTest(c => c.NullableDateTime.Value.Month==WrongDateTime.Month); - }); - } - - [Test] - public void ExtractDayTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Day==FirstDateTime.Day); - RunTest(c => c.MillisecondDateTime.Day==FirstMillisecondDateTime.Day); - RunTest(c => c.NullableDateTime.Value.Day==NullableDateTime.Day); - - RunWrongTest(c => c.DateTime.Day==WrongDateTime.Day); - RunWrongTest(c => c.MillisecondDateTime.Day==WrongMillisecondDateTime.Day); - RunWrongTest(c => c.NullableDateTime.Value.Day==WrongDateTime.Day); - }); - } - - [Test] - public void ExtractHourTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Hour==FirstDateTime.Hour); - RunTest(c => c.MillisecondDateTime.Hour==FirstMillisecondDateTime.Hour); - RunTest(c => c.NullableDateTime.Value.Hour==NullableDateTime.Hour); - - RunWrongTest(c => c.DateTime.Hour==WrongDateTime.Hour); - RunWrongTest(c => c.MillisecondDateTime.Hour==WrongMillisecondDateTime.Hour); - RunWrongTest(c => c.NullableDateTime.Value.Hour==WrongDateTime.Hour); - }); - } - - [Test] - public void ExtractMinuteTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Minute==FirstDateTime.Minute); - RunTest(c => c.MillisecondDateTime.Minute==FirstMillisecondDateTime.Minute); - RunTest(c => c.NullableDateTime.Value.Minute==NullableDateTime.Minute); - - RunWrongTest(c => c.DateTime.Minute==WrongDateTime.Minute); - RunWrongTest(c => c.MillisecondDateTime.Minute==WrongMillisecondDateTime.Minute); - RunWrongTest(c => c.NullableDateTime.Value.Minute==WrongDateTime.Minute); - }); - } - - [Test] - public void ExtractSecondTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Second==FirstDateTime.Second); - RunTest(c => c.MillisecondDateTime.Second==FirstMillisecondDateTime.Second); - RunTest(c => c.NullableDateTime.Value.Second==NullableDateTime.Second); - - RunWrongTest(c => c.DateTime.Second==WrongDateTime.Second); - RunWrongTest(c => c.MillisecondDateTime.Second==WrongMillisecondDateTime.Second); - RunWrongTest(c => c.NullableDateTime.Value.Second==WrongDateTime.Second); - }); - } - - [Test] - public void ExtractMillisecondTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.MillisecondDateTime.Millisecond==FirstMillisecondDateTime.Millisecond); - RunWrongTest(c => c.MillisecondDateTime.Second==WrongMillisecondDateTime.Millisecond); - }); - } - - [Test] - public void ExtractDateTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.Date==FirstDateTime.Date); - RunTest(c => c.MillisecondDateTime.Date==FirstMillisecondDateTime.Date); - RunTest(c => c.NullableDateTime.Value.Date==NullableDateTime.Date); - - RunWrongTest(c => c.DateTime.Date==WrongDateTime.Date); - RunWrongTest(c => c.MillisecondDateTime.Date==WrongMillisecondDateTime.Date); - RunWrongTest(c => c.NullableDateTime.Value.Date==WrongDateTime.Date); - }); - } - - [Test] - public void ExtractTimeOfDayTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.TimeOfDay==FirstDateTime.TimeOfDay); - RunTest(c => c.MillisecondDateTime.TimeOfDay==FirstMillisecondDateTime.TimeOfDay); - RunTest(c => c.NullableDateTime.Value.TimeOfDay==NullableDateTime.TimeOfDay); - - RunWrongTest(c => c.DateTime.TimeOfDay==WrongDateTime.TimeOfDay); - RunWrongTest(c => c.MillisecondDateTime.TimeOfDay==WrongMillisecondDateTime.TimeOfDay); - RunWrongTest(c => c.NullableDateTime.Value.TimeOfDay==WrongDateTime.TimeOfDay); - }); - } - - [Test] - public void ExtractDayOfYearTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.DayOfYear==FirstDateTime.DayOfYear); - RunTest(c => c.MillisecondDateTime.DayOfYear==FirstMillisecondDateTime.DayOfYear); - RunTest(c => c.NullableDateTime.Value.DayOfYear==NullableDateTime.DayOfYear); - - RunWrongTest(c => c.DateTime.DayOfYear==WrongDateTime.DayOfYear); - RunWrongTest(c => c.MillisecondDateTime.DayOfYear==WrongMillisecondDateTime.DayOfYear); - RunWrongTest(c => c.NullableDateTime.Value.DayOfYear==WrongDateTime.DayOfYear); - }); - } - - [Test] - public void ExtractDayOfWeekTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTime.DayOfWeek==FirstDateTime.DayOfWeek); - RunTest(c => c.MillisecondDateTime.DayOfWeek==FirstMillisecondDateTime.DayOfWeek); - RunTest(c => c.NullableDateTime.Value.DayOfWeek==NullableDateTime.DayOfWeek); - - RunWrongTest(c => c.DateTime.DayOfWeek==WrongDateTime.DayOfWeek); - RunWrongTest(c => c.MillisecondDateTime.DayOfWeek==WrongMillisecondDateTime.DayOfWeek); - RunWrongTest(c => c.NullableDateTime.Value.DayOfWeek==WrongDateTime.DayOfWeek); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class PartsExtractionTest : DateTimeBaseTest + { + [Test] + public void ExtractYearTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Year==FirstDateTime.Year); + RunTest(c => c.MillisecondDateTime.Year==FirstMillisecondDateTime.Year); + RunTest(c => c.NullableDateTime.Value.Year==NullableDateTime.Year); + + RunWrongTest(c => c.DateTime.Year==WrongDateTime.Year); + RunWrongTest(c => c.MillisecondDateTime.Year==WrongMillisecondDateTime.Year); + RunWrongTest(c => c.NullableDateTime.Value.Year==WrongDateTime.Year); + }); + } + + [Test] + public void ExtractMonthTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Month==FirstDateTime.Month); + RunTest(c => c.MillisecondDateTime.Month==FirstMillisecondDateTime.Month); + RunTest(c => c.NullableDateTime.Value.Month==NullableDateTime.Month); + + RunWrongTest(c => c.DateTime.Month==WrongDateTime.Month); + RunWrongTest(c => c.MillisecondDateTime.Month==WrongMillisecondDateTime.Month); + RunWrongTest(c => c.NullableDateTime.Value.Month==WrongDateTime.Month); + }); + } + + [Test] + public void ExtractDayTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Day==FirstDateTime.Day); + RunTest(c => c.MillisecondDateTime.Day==FirstMillisecondDateTime.Day); + RunTest(c => c.NullableDateTime.Value.Day==NullableDateTime.Day); + + RunWrongTest(c => c.DateTime.Day==WrongDateTime.Day); + RunWrongTest(c => c.MillisecondDateTime.Day==WrongMillisecondDateTime.Day); + RunWrongTest(c => c.NullableDateTime.Value.Day==WrongDateTime.Day); + }); + } + + [Test] + public void ExtractHourTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Hour==FirstDateTime.Hour); + RunTest(c => c.MillisecondDateTime.Hour==FirstMillisecondDateTime.Hour); + RunTest(c => c.NullableDateTime.Value.Hour==NullableDateTime.Hour); + + RunWrongTest(c => c.DateTime.Hour==WrongDateTime.Hour); + RunWrongTest(c => c.MillisecondDateTime.Hour==WrongMillisecondDateTime.Hour); + RunWrongTest(c => c.NullableDateTime.Value.Hour==WrongDateTime.Hour); + }); + } + + [Test] + public void ExtractMinuteTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Minute==FirstDateTime.Minute); + RunTest(c => c.MillisecondDateTime.Minute==FirstMillisecondDateTime.Minute); + RunTest(c => c.NullableDateTime.Value.Minute==NullableDateTime.Minute); + + RunWrongTest(c => c.DateTime.Minute==WrongDateTime.Minute); + RunWrongTest(c => c.MillisecondDateTime.Minute==WrongMillisecondDateTime.Minute); + RunWrongTest(c => c.NullableDateTime.Value.Minute==WrongDateTime.Minute); + }); + } + + [Test] + public void ExtractSecondTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Second==FirstDateTime.Second); + RunTest(c => c.MillisecondDateTime.Second==FirstMillisecondDateTime.Second); + RunTest(c => c.NullableDateTime.Value.Second==NullableDateTime.Second); + + RunWrongTest(c => c.DateTime.Second==WrongDateTime.Second); + RunWrongTest(c => c.MillisecondDateTime.Second==WrongMillisecondDateTime.Second); + RunWrongTest(c => c.NullableDateTime.Value.Second==WrongDateTime.Second); + }); + } + + [Test] + public void ExtractMillisecondTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.MillisecondDateTime.Millisecond==FirstMillisecondDateTime.Millisecond); + RunWrongTest(c => c.MillisecondDateTime.Second==WrongMillisecondDateTime.Millisecond); + }); + } + + [Test] + public void ExtractDateTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.Date==FirstDateTime.Date); + RunTest(c => c.MillisecondDateTime.Date==FirstMillisecondDateTime.Date); + RunTest(c => c.NullableDateTime.Value.Date==NullableDateTime.Date); + + RunWrongTest(c => c.DateTime.Date==WrongDateTime.Date); + RunWrongTest(c => c.MillisecondDateTime.Date==WrongMillisecondDateTime.Date); + RunWrongTest(c => c.NullableDateTime.Value.Date==WrongDateTime.Date); + }); + } + + [Test] + public void ExtractTimeOfDayTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.TimeOfDay==FirstDateTime.TimeOfDay); + RunTest(c => c.MillisecondDateTime.TimeOfDay==FirstMillisecondDateTime.TimeOfDay); + RunTest(c => c.NullableDateTime.Value.TimeOfDay==NullableDateTime.TimeOfDay); + + RunWrongTest(c => c.DateTime.TimeOfDay==WrongDateTime.TimeOfDay); + RunWrongTest(c => c.MillisecondDateTime.TimeOfDay==WrongMillisecondDateTime.TimeOfDay); + RunWrongTest(c => c.NullableDateTime.Value.TimeOfDay==WrongDateTime.TimeOfDay); + }); + } + + [Test] + public void ExtractDayOfYearTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.DayOfYear==FirstDateTime.DayOfYear); + RunTest(c => c.MillisecondDateTime.DayOfYear==FirstMillisecondDateTime.DayOfYear); + RunTest(c => c.NullableDateTime.Value.DayOfYear==NullableDateTime.DayOfYear); + + RunWrongTest(c => c.DateTime.DayOfYear==WrongDateTime.DayOfYear); + RunWrongTest(c => c.MillisecondDateTime.DayOfYear==WrongMillisecondDateTime.DayOfYear); + RunWrongTest(c => c.NullableDateTime.Value.DayOfYear==WrongDateTime.DayOfYear); + }); + } + + [Test] + public void ExtractDayOfWeekTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTime.DayOfWeek==FirstDateTime.DayOfWeek); + RunTest(c => c.MillisecondDateTime.DayOfWeek==FirstMillisecondDateTime.DayOfWeek); + RunTest(c => c.NullableDateTime.Value.DayOfWeek==NullableDateTime.DayOfWeek); + + RunWrongTest(c => c.DateTime.DayOfWeek==WrongDateTime.DayOfWeek); + RunWrongTest(c => c.MillisecondDateTime.DayOfWeek==WrongMillisecondDateTime.DayOfWeek); + RunWrongTest(c => c.NullableDateTime.Value.DayOfWeek==WrongDateTime.DayOfWeek); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/WhereTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/WhereTest.cs index 8fa2ded6e2..751a6b57bd 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/WhereTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/WhereTest.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes -{ - public class WhereTest : DateTimeBaseTest - { - [Test] - public void DateTimeWhereTest() - { - ExecuteInsideSession(() => { - WherePrivate(c => c.DateTime==FirstDateTime, c => c.Id); - WherePrivate(c => c.DateTime.Hour==FirstDateTime.Hour, c => c.Id); - WherePrivate(c => c.DateTime.Second==FirstDateTime.Second, c => c.Id); - }); - } - - [Test] - public void MillisecondDateTimeWhereTest() - { - ExecuteInsideSession(() => { - WherePrivate(c => c.DateTime==FirstMillisecondDateTime, c => c.Id); - WherePrivate(c => c.DateTime.Hour==FirstMillisecondDateTime.Hour, c => c.Id); - WherePrivate(c => c.DateTime.Millisecond==FirstMillisecondDateTime.Millisecond, c => c.Id); - }); - } - - [Test] - public void NullableDateTimeWhereTest() - { - ExecuteInsideSession(() => { - WherePrivate(c => c.DateTime==FirstDateTime, c => c.Id); - WherePrivate(c => c.DateTime==null, c => c.Id); - WherePrivate(c => c.DateTime.HasValue && c.DateTime.Value.Hour==FirstDateTime.Hour, c => c.Id); - WherePrivate(c => c.DateTime.HasValue && c.DateTime.Value.Second==FirstDateTime.Second, c => c.Id); - }); - } - - private void WherePrivate(Expression> whereExpression, Expression> orderByExpression) - where T : Entity - { - var compiledWhereExpression = whereExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - - var whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression); - var whereByServer = Query.All().Where(whereExpression).OrderBy(orderByExpression); - Assert.IsTrue(whereLocal.SequenceEqual(whereByServer)); - - whereByServer = Query.All().Where(whereExpression).OrderByDescending(orderByExpression); - Assert.IsFalse(whereLocal.SequenceEqual(whereByServer)); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimes +{ + public class WhereTest : DateTimeBaseTest + { + [Test] + public void DateTimeWhereTest() + { + ExecuteInsideSession(() => { + WherePrivate(c => c.DateTime==FirstDateTime, c => c.Id); + WherePrivate(c => c.DateTime.Hour==FirstDateTime.Hour, c => c.Id); + WherePrivate(c => c.DateTime.Second==FirstDateTime.Second, c => c.Id); + }); + } + + [Test] + public void MillisecondDateTimeWhereTest() + { + ExecuteInsideSession(() => { + WherePrivate(c => c.DateTime==FirstMillisecondDateTime, c => c.Id); + WherePrivate(c => c.DateTime.Hour==FirstMillisecondDateTime.Hour, c => c.Id); + WherePrivate(c => c.DateTime.Millisecond==FirstMillisecondDateTime.Millisecond, c => c.Id); + }); + } + + [Test] + public void NullableDateTimeWhereTest() + { + ExecuteInsideSession(() => { + WherePrivate(c => c.DateTime==FirstDateTime, c => c.Id); + WherePrivate(c => c.DateTime==null, c => c.Id); + WherePrivate(c => c.DateTime.HasValue && c.DateTime.Value.Hour==FirstDateTime.Hour, c => c.Id); + WherePrivate(c => c.DateTime.HasValue && c.DateTime.Value.Second==FirstDateTime.Second, c => c.Id); + }); + } + + private void WherePrivate(Expression> whereExpression, Expression> orderByExpression) + where T : Entity + { + var compiledWhereExpression = whereExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + + var whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression); + var whereByServer = Query.All().Where(whereExpression).OrderBy(orderByExpression); + Assert.IsTrue(whereLocal.SequenceEqual(whereByServer)); + + whereByServer = Query.All().Where(whereExpression).OrderByDescending(orderByExpression); + Assert.IsFalse(whereLocal.SequenceEqual(whereByServer)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeBaseTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeBaseTest.cs index a26d0ee414..91fa766b84 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeBaseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeBaseTest.cs @@ -1,92 +1,92 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.09.15 - -using System; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset -{ - public abstract class DateTimeBaseTest : BaseTest - { - protected static readonly TimeSpan FirstOffset = new TimeSpan(2, 45, 0); // +02:45 - protected static readonly TimeSpan SecondOffset = new TimeSpan(-11, 10, 0); // -11:10 - protected static readonly TimeSpan WrongOffset = new TimeSpan(4, 35, 0); // +04:35 - - protected static readonly DateTime FirstDateTime = new DateTime(2016, 01, 02, 03, 04, 05, DateTimeKind.Unspecified); - protected static readonly DateTime SecondDateTime = new DateTime(2019, 11, 23, 22, 58, 57, DateTimeKind.Unspecified); - protected static readonly DateTime WrongDateTime = new DateTime(2017, 02, 03, 04, 05, 06, DateTimeKind.Unspecified); - protected static readonly DateTime NullableDateTime = SecondDateTime; - - protected static readonly DateTime FirstMillisecondDateTime = FirstDateTime.AddMilliseconds(321); - protected static readonly DateTime SecondMillisecondDateTime = SecondDateTime.AddMilliseconds(987); - protected static readonly DateTime WrongMillisecondDateTime = WrongDateTime.AddMilliseconds(654); - - protected override void RegisterTypes(DomainConfiguration configuration) - { - configuration.Types.Register(typeof (SingleDateTimeEntity)); - configuration.Types.Register(typeof (DateTimeEntity)); - configuration.Types.Register(typeof (MillisecondDateTimeEntity)); - configuration.Types.Register(typeof (NullableDateTimeEntity)); - } - - protected override void PopulateEntities(Session session) - { - new SingleDateTimeEntity { - DateTime = FirstDateTime, - MillisecondDateTime = FirstMillisecondDateTime, - NullableDateTime = NullableDateTime - }; - - new DateTimeEntity { DateTime = FirstDateTime }; - new DateTimeEntity { DateTime = FirstDateTime }; - new DateTimeEntity { DateTime = FirstDateTime.Date }; - new DateTimeEntity { DateTime = SecondDateTime }; - new DateTimeEntity { DateTime = SecondDateTime.Date }; - new DateTimeEntity { DateTime = new DateTime(FirstDateTime.Year, FirstDateTime.Month, FirstDateTime.Day, FirstDateTime.Hour, FirstDateTime.Minute, 0) }; - new DateTimeEntity { DateTime = new DateTime(FirstDateTime.Ticks, DateTimeKind.Local) }; - new DateTimeEntity { DateTime = FirstDateTime.Add(new TimeSpan(987, 23, 34, 45)) }; - new DateTimeEntity { DateTime = FirstDateTime.AddYears(1) }; - new DateTimeEntity { DateTime = FirstDateTime.AddYears(-2) }; - new DateTimeEntity { DateTime = FirstDateTime.AddMonths(44) }; - new DateTimeEntity { DateTime = FirstDateTime.AddMonths(-55) }; - new DateTimeEntity { DateTime = SecondDateTime.AddHours(5) }; - new DateTimeEntity { DateTime = SecondDateTime.AddHours(-15) }; - new DateTimeEntity { DateTime = SecondDateTime.AddMinutes(59) }; - new DateTimeEntity { DateTime = SecondDateTime.AddMinutes(-49) }; - new DateTimeEntity { DateTime = SecondDateTime.AddSeconds(57) }; - new DateTimeEntity { DateTime = SecondDateTime.AddSeconds(-5) }; - - var dateTime = FirstDateTime.AddYears(10); - for (var i = 0; i < 60; ++i) - new DateTimeEntity { DateTime = dateTime.AddSeconds(i) }; - - new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime }; - new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime }; - new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime.Date }; - new MillisecondDateTimeEntity { DateTime = SecondMillisecondDateTime }; - new MillisecondDateTimeEntity { DateTime = SecondMillisecondDateTime.Date }; - new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, 0) }; - new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, FirstMillisecondDateTime.Second, 0) }; - new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Ticks, DateTimeKind.Local) }; - new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime.Add(new TimeSpan(987, 23, 34, 45)) }; - - var index = 0; - foreach (var dateTimeEntity1 in Query.All()) - new MillisecondDateTimeEntity(dateTimeEntity1, ++index % 3==0 ? FirstMillisecondDateTime.Millisecond : SecondMillisecondDateTime.Millisecond); - - dateTime = FirstMillisecondDateTime.AddYears(10); - for (var i = 0; i < 1000; ++i) - new MillisecondDateTimeEntity { DateTime = dateTime.AddMilliseconds(i) }; - - foreach (var dateTimeEntity in Query.All()) - new NullableDateTimeEntity(dateTimeEntity); - - new NullableDateTimeEntity { DateTime = null }; - new NullableDateTimeEntity { DateTime = null }; - } - } +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.09.15 + +using System; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset +{ + public abstract class DateTimeBaseTest : BaseTest + { + protected static readonly TimeSpan FirstOffset = new TimeSpan(2, 45, 0); // +02:45 + protected static readonly TimeSpan SecondOffset = new TimeSpan(-11, 10, 0); // -11:10 + protected static readonly TimeSpan WrongOffset = new TimeSpan(4, 35, 0); // +04:35 + + protected static readonly DateTime FirstDateTime = new DateTime(2016, 01, 02, 03, 04, 05, DateTimeKind.Unspecified); + protected static readonly DateTime SecondDateTime = new DateTime(2019, 11, 23, 22, 58, 57, DateTimeKind.Unspecified); + protected static readonly DateTime WrongDateTime = new DateTime(2017, 02, 03, 04, 05, 06, DateTimeKind.Unspecified); + protected static readonly DateTime NullableDateTime = SecondDateTime; + + protected static readonly DateTime FirstMillisecondDateTime = FirstDateTime.AddMilliseconds(321); + protected static readonly DateTime SecondMillisecondDateTime = SecondDateTime.AddMilliseconds(987); + protected static readonly DateTime WrongMillisecondDateTime = WrongDateTime.AddMilliseconds(654); + + protected override void RegisterTypes(DomainConfiguration configuration) + { + configuration.Types.Register(typeof (SingleDateTimeEntity)); + configuration.Types.Register(typeof (DateTimeEntity)); + configuration.Types.Register(typeof (MillisecondDateTimeEntity)); + configuration.Types.Register(typeof (NullableDateTimeEntity)); + } + + protected override void PopulateEntities(Session session) + { + new SingleDateTimeEntity { + DateTime = FirstDateTime, + MillisecondDateTime = FirstMillisecondDateTime, + NullableDateTime = NullableDateTime + }; + + new DateTimeEntity { DateTime = FirstDateTime }; + new DateTimeEntity { DateTime = FirstDateTime }; + new DateTimeEntity { DateTime = FirstDateTime.Date }; + new DateTimeEntity { DateTime = SecondDateTime }; + new DateTimeEntity { DateTime = SecondDateTime.Date }; + new DateTimeEntity { DateTime = new DateTime(FirstDateTime.Year, FirstDateTime.Month, FirstDateTime.Day, FirstDateTime.Hour, FirstDateTime.Minute, 0) }; + new DateTimeEntity { DateTime = new DateTime(FirstDateTime.Ticks, DateTimeKind.Local) }; + new DateTimeEntity { DateTime = FirstDateTime.Add(new TimeSpan(987, 23, 34, 45)) }; + new DateTimeEntity { DateTime = FirstDateTime.AddYears(1) }; + new DateTimeEntity { DateTime = FirstDateTime.AddYears(-2) }; + new DateTimeEntity { DateTime = FirstDateTime.AddMonths(44) }; + new DateTimeEntity { DateTime = FirstDateTime.AddMonths(-55) }; + new DateTimeEntity { DateTime = SecondDateTime.AddHours(5) }; + new DateTimeEntity { DateTime = SecondDateTime.AddHours(-15) }; + new DateTimeEntity { DateTime = SecondDateTime.AddMinutes(59) }; + new DateTimeEntity { DateTime = SecondDateTime.AddMinutes(-49) }; + new DateTimeEntity { DateTime = SecondDateTime.AddSeconds(57) }; + new DateTimeEntity { DateTime = SecondDateTime.AddSeconds(-5) }; + + var dateTime = FirstDateTime.AddYears(10); + for (var i = 0; i < 60; ++i) + new DateTimeEntity { DateTime = dateTime.AddSeconds(i) }; + + new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime }; + new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime }; + new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime.Date }; + new MillisecondDateTimeEntity { DateTime = SecondMillisecondDateTime }; + new MillisecondDateTimeEntity { DateTime = SecondMillisecondDateTime.Date }; + new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, 0) }; + new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, FirstMillisecondDateTime.Second, 0) }; + new MillisecondDateTimeEntity { DateTime = new DateTime(FirstMillisecondDateTime.Ticks, DateTimeKind.Local) }; + new MillisecondDateTimeEntity { DateTime = FirstMillisecondDateTime.Add(new TimeSpan(987, 23, 34, 45)) }; + + var index = 0; + foreach (var dateTimeEntity1 in Query.All()) + new MillisecondDateTimeEntity(dateTimeEntity1, ++index % 3==0 ? FirstMillisecondDateTime.Millisecond : SecondMillisecondDateTime.Millisecond); + + dateTime = FirstMillisecondDateTime.AddYears(10); + for (var i = 0; i < 1000; ++i) + new MillisecondDateTimeEntity { DateTime = dateTime.AddMilliseconds(i) }; + + foreach (var dateTimeEntity in Query.All()) + new NullableDateTimeEntity(dateTimeEntity); + + new NullableDateTimeEntity { DateTime = null }; + new NullableDateTimeEntity { DateTime = null }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/ComparisonTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/ComparisonTest.cs index 3049b5a9eb..fd891d73e8 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/ComparisonTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/ComparisonTest.cs @@ -1,166 +1,166 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class ComparisonTest : DateTimeOffsetBaseTest - { - [Test] - public void EqualsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset); - - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset); - RunWrongTest(c => c.NullableDateTimeOffset==null); - }); - } - - [Test] - public void EqualsToDateTimeOffsetWithAnotherOffset() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(FirstOffset)); - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(SecondOffset)); - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToLocalTime()); - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToUniversalTime()); - - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(FirstOffset)); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(SecondOffset)); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToLocalTime()); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToUniversalTime()); - - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(FirstOffset)); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(SecondOffset)); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToLocalTime()); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToUniversalTime()); - - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(FirstOffset)); - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(SecondOffset)); - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToLocalTime()); - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToUniversalTime()); - - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(FirstOffset)); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(SecondOffset)); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToLocalTime()); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToUniversalTime()); - - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(FirstOffset)); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(SecondOffset)); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(TimeSpan.Zero)); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToLocalTime()); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToUniversalTime()); - }); - } - - [Test] - public void EqualsToUtcDateTime() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.UtcDateTime); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.UtcDateTime); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.UtcDateTime); - - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.UtcDateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.UtcDateTime); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.UtcDateTime); - }); - } - - [Test] - public void EqualsToLocalDateTime() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.LocalDateTime); - RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.LocalDateTime); - RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.LocalDateTime); - - RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.LocalDateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.LocalDateTime); - RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.LocalDateTime); - }); - } - - [Test] - public void CompareTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset > FirstDateTimeOffset.AddHours(-1)); - RunTest(c => c.MillisecondDateTimeOffset > FirstMillisecondDateTimeOffset.AddMilliseconds(-1)); - RunTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddYears(-1)); - - RunTest(c => c.DateTimeOffset < FirstDateTimeOffset.AddHours(1)); - RunTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.AddMilliseconds(1)); - RunTest(c => c.NullableDateTimeOffset < NullableDateTimeOffset.AddYears(1)); - - RunWrongTest(c => c.DateTimeOffset > FirstDateTimeOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset); - RunWrongTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddSeconds(11)); - }); - } - - [Test] - public void CompareToDateTimeTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset > FirstDateTimeOffset.ToLocalTime().AddHours(-1)); - RunTest(c => c.MillisecondDateTimeOffset > FirstMillisecondDateTimeOffset.ToUniversalTime().AddMilliseconds(-1)); - RunTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.ToLocalTime().Date); - - RunTest(c => c.DateTimeOffset < FirstDateTimeOffset.ToLocalTime().AddHours(1)); - RunTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.ToUniversalTime().AddMilliseconds(1)); - RunTest(c => c.NullableDateTimeOffset < NullableDateTimeOffset.ToUniversalTime().AddYears(1)); - - RunWrongTest(c => c.DateTimeOffset > FirstDateTimeOffset.ToLocalTime()); - RunWrongTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.ToLocalTime()); - RunWrongTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddDays(1).ToUniversalTime()); - }); - } - - [Test(Description = "Might be failed by reasons described in issue DO-657")] - public void CompareToNullableDateTimeOffsetToOffsetTest() - { - DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.ToOffset(FirstOffset)); // works fine - RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.ToOffset(FirstOffset)); // failed - }); - } - - [Test(Description = "Might be failed by reasons described in issue DO-657")] - public void CompareToNullableDateTimeOffsetGetUtcDateTimeTest() - { - DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.UtcDateTime); - RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.UtcDateTime); - }); - } - - [Test(Description = "Might be failed by reasons described in issue DO-657")] - public void CompareToNullableDateTimeOffsetGetLocalDateTimeTest() - { - DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.LocalDateTime); - RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.LocalDateTime); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class ComparisonTest : DateTimeOffsetBaseTest + { + [Test] + public void EqualsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset); + + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset); + RunWrongTest(c => c.NullableDateTimeOffset==null); + }); + } + + [Test] + public void EqualsToDateTimeOffsetWithAnotherOffset() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(FirstOffset)); + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(SecondOffset)); + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToLocalTime()); + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.ToUniversalTime()); + + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(FirstOffset)); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(SecondOffset)); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToLocalTime()); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.ToUniversalTime()); + + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(FirstOffset)); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(SecondOffset)); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToLocalTime()); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.ToUniversalTime()); + + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(FirstOffset)); + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(SecondOffset)); + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToLocalTime()); + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.ToUniversalTime()); + + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(FirstOffset)); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(SecondOffset)); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToLocalTime()); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.ToUniversalTime()); + + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(FirstOffset)); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(SecondOffset)); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToOffset(TimeSpan.Zero)); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToLocalTime()); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.ToUniversalTime()); + }); + } + + [Test] + public void EqualsToUtcDateTime() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.UtcDateTime); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.UtcDateTime); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.UtcDateTime); + + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.UtcDateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.UtcDateTime); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.UtcDateTime); + }); + } + + [Test] + public void EqualsToLocalDateTime() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset==FirstDateTimeOffset.LocalDateTime); + RunTest(c => c.MillisecondDateTimeOffset==FirstMillisecondDateTimeOffset.LocalDateTime); + RunTest(c => c.NullableDateTimeOffset==NullableDateTimeOffset.LocalDateTime); + + RunWrongTest(c => c.DateTimeOffset==WrongDateTimeOffset.LocalDateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset==WrongMillisecondDateTimeOffset.LocalDateTime); + RunWrongTest(c => c.NullableDateTimeOffset==WrongDateTimeOffset.LocalDateTime); + }); + } + + [Test] + public void CompareTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset > FirstDateTimeOffset.AddHours(-1)); + RunTest(c => c.MillisecondDateTimeOffset > FirstMillisecondDateTimeOffset.AddMilliseconds(-1)); + RunTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddYears(-1)); + + RunTest(c => c.DateTimeOffset < FirstDateTimeOffset.AddHours(1)); + RunTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.AddMilliseconds(1)); + RunTest(c => c.NullableDateTimeOffset < NullableDateTimeOffset.AddYears(1)); + + RunWrongTest(c => c.DateTimeOffset > FirstDateTimeOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset); + RunWrongTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddSeconds(11)); + }); + } + + [Test] + public void CompareToDateTimeTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset > FirstDateTimeOffset.ToLocalTime().AddHours(-1)); + RunTest(c => c.MillisecondDateTimeOffset > FirstMillisecondDateTimeOffset.ToUniversalTime().AddMilliseconds(-1)); + RunTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.ToLocalTime().Date); + + RunTest(c => c.DateTimeOffset < FirstDateTimeOffset.ToLocalTime().AddHours(1)); + RunTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.ToUniversalTime().AddMilliseconds(1)); + RunTest(c => c.NullableDateTimeOffset < NullableDateTimeOffset.ToUniversalTime().AddYears(1)); + + RunWrongTest(c => c.DateTimeOffset > FirstDateTimeOffset.ToLocalTime()); + RunWrongTest(c => c.MillisecondDateTimeOffset < FirstMillisecondDateTimeOffset.ToLocalTime()); + RunWrongTest(c => c.NullableDateTimeOffset > NullableDateTimeOffset.AddDays(1).ToUniversalTime()); + }); + } + + [Test(Description = "Might be failed by reasons described in issue DO-657")] + public void CompareToNullableDateTimeOffsetToOffsetTest() + { + DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.ToOffset(FirstOffset)); // works fine + RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.ToOffset(FirstOffset)); // failed + }); + } + + [Test(Description = "Might be failed by reasons described in issue DO-657")] + public void CompareToNullableDateTimeOffsetGetUtcDateTimeTest() + { + DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.UtcDateTime); + RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.UtcDateTime); + }); + } + + [Test(Description = "Might be failed by reasons described in issue DO-657")] + public void CompareToNullableDateTimeOffsetGetLocalDateTimeTest() + { + DateTimeOffset? nullableDateTimeOffset = NullableDateTimeOffset; + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset!=NullableDateTimeOffset.LocalDateTime); + RunTest(c => c.DateTimeOffset!=nullableDateTimeOffset.Value.LocalDateTime); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DateTimeOffsetConstructorTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DateTimeOffsetConstructorTest.cs index e27fedda91..a0dd39a0a2 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DateTimeOffsetConstructorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DateTimeOffsetConstructorTest.cs @@ -1,523 +1,523 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.09.09 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsetConstructorTestModel; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsetConstructorTestModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public DateTime DateTime { get; set; } - - [Field] - public TimeSpan UtcZone { get; set; } - - [Field] - public TimeSpan MoscowZone { get; set; } - - [Field] - public TimeSpan EkaterinburgZone { get; set; } - - [Field] - public TimeSpan NewYorkZone { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class DateTimeOffsetConstructorTest : AutoBuildTest - { - private readonly TimeSpan UtcZone = new TimeSpan(0, 0, 0); - private readonly TimeSpan MoscowZone = new TimeSpan(3, 0, 0); - private readonly TimeSpan EkaterinburgZone = new TimeSpan(5, 0, 0); - private readonly TimeSpan NewYorkZone = new TimeSpan(-5, 0, 0); - - private DateTime[] dateTimes = new DateTime[12]; - private DateTimeOffset[] utcDateTimeOffsets = new DateTimeOffset[12]; - private DateTimeOffset[] moscowDateTimeOffsets = new DateTimeOffset[12]; - private DateTimeOffset[] ekaterinburgDateTimeOffsets = new DateTimeOffset[12]; - private DateTimeOffset[] newYorkDateTimeOffsets = new DateTimeOffset[12]; - - [Test] - public void Test01() - { - //new DateTimeOffset(new DateTime()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset(el.DateTime).Hour > 15); - - var expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - var result = session.Query.All() - .Where(el => new DateTimeOffset(dateTimes[0]).Hour==new DateTimeOffset(el.DateTime).Hour).ToArray(); - - Assert.That(result.Length, Is.EqualTo(1)); - Assert.That(result[0].DateTime.Hour, Is.EqualTo(dateTimes[0].Hour)); - } - } - - [Test] - public void Test02() - { - //new DateTimeOffset(new DateTime(), new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset(el.DateTime, UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset(el.DateTime, EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset(el.DateTime, MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset(el.DateTime, NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - [Test] - public void Test03() - { - //new DateTimeOffset(0, 0, 0, 0, 0, 0, new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - [Test] - public void Test04() - { - //new DateTimeOffset(0, 0, 0, 0, 0, 0, 0, new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - [Test] - public void Test05() - { - //new DateTimeOffset(new DateTime(), new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - [Test] - public void Test06() - { - //new DateTimeOffset(0, 0, 0, 0, 0, 0, new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, el.UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, el.MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, el.EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, el.NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - [Test] - public void Test07() - { - //new DateTimeOffset(0, 0, 0, 0, 0, 0, 0, new TimeSpan()); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, el.UtcZone).Hour > 15); - - var expectedCount = utcDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, el.MoscowZone).Hour > 15); - - expectedCount = moscowDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, el.EkaterinburgZone).Hour > 15); - - expectedCount = ekaterinburgDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - - count = session.Query.All() - .Count(el => new DateTimeOffset( - el.DateTime.Year, - el.DateTime.Month, - el.DateTime.Day, - el.DateTime.Hour, - el.DateTime.Minute, - el.DateTime.Second, - el.DateTime.Millisecond, el.NewYorkZone).Hour > 15); - - expectedCount = newYorkDateTimeOffsets - .Select(TryMoveToLocalTimeZone) - .Count(el => el.Hour > 15); - Assert.That(count, Is.Not.EqualTo(0)); - Assert.That(expectedCount, Is.Not.EqualTo(0)); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } - - protected override void PopulateData() - { - dateTimes = new DateTime[12]; - utcDateTimeOffsets = new DateTimeOffset[12]; - moscowDateTimeOffsets = new DateTimeOffset[12]; - ekaterinburgDateTimeOffsets = new DateTimeOffset[12]; - newYorkDateTimeOffsets = new DateTimeOffset[12]; - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 1; i < 13; i++) { - var datetime = new DateTime(2000 + i, i, 12 + i, 11 + i, 4 * i, 3 * i); - dateTimes[i - 1] = datetime; - utcDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, UtcZone); - moscowDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, MoscowZone); - ekaterinburgDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, EkaterinburgZone); - newYorkDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, NewYorkZone); - - new TestEntity { - DateTime = datetime, - UtcZone = UtcZone, - EkaterinburgZone = EkaterinburgZone, - MoscowZone = MoscowZone, - NewYorkZone = NewYorkZone - }; - } - transaction.Complete(); - } - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - var providerInfo = StorageProviderInfo.Instance.Info; - if (providerInfo.ProviderName == WellKnown.Provider.PostgreSql) { - var localZone = EkaterinburgZone; - var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); - configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); - } - - return configuration; - } - - private DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) - { - if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) - return dateTimeOffset.ToOffset(EkaterinburgZone); - return dateTimeOffset; - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.09.09 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsetConstructorTestModel; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsetConstructorTestModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public DateTime DateTime { get; set; } + + [Field] + public TimeSpan UtcZone { get; set; } + + [Field] + public TimeSpan MoscowZone { get; set; } + + [Field] + public TimeSpan EkaterinburgZone { get; set; } + + [Field] + public TimeSpan NewYorkZone { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class DateTimeOffsetConstructorTest : AutoBuildTest + { + private readonly TimeSpan UtcZone = new TimeSpan(0, 0, 0); + private readonly TimeSpan MoscowZone = new TimeSpan(3, 0, 0); + private readonly TimeSpan EkaterinburgZone = new TimeSpan(5, 0, 0); + private readonly TimeSpan NewYorkZone = new TimeSpan(-5, 0, 0); + + private DateTime[] dateTimes = new DateTime[12]; + private DateTimeOffset[] utcDateTimeOffsets = new DateTimeOffset[12]; + private DateTimeOffset[] moscowDateTimeOffsets = new DateTimeOffset[12]; + private DateTimeOffset[] ekaterinburgDateTimeOffsets = new DateTimeOffset[12]; + private DateTimeOffset[] newYorkDateTimeOffsets = new DateTimeOffset[12]; + + [Test] + public void Test01() + { + //new DateTimeOffset(new DateTime()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset(el.DateTime).Hour > 15); + + var expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + var result = session.Query.All() + .Where(el => new DateTimeOffset(dateTimes[0]).Hour==new DateTimeOffset(el.DateTime).Hour).ToArray(); + + Assert.That(result.Length, Is.EqualTo(1)); + Assert.That(result[0].DateTime.Hour, Is.EqualTo(dateTimes[0].Hour)); + } + } + + [Test] + public void Test02() + { + //new DateTimeOffset(new DateTime(), new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset(el.DateTime, UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset(el.DateTime, EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset(el.DateTime, MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset(el.DateTime, NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + [Test] + public void Test03() + { + //new DateTimeOffset(0, 0, 0, 0, 0, 0, new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + [Test] + public void Test04() + { + //new DateTimeOffset(0, 0, 0, 0, 0, 0, 0, new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + [Test] + public void Test05() + { + //new DateTimeOffset(new DateTime(), new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All().Count(el => new DateTimeOffset(el.DateTime, el.NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + [Test] + public void Test06() + { + //new DateTimeOffset(0, 0, 0, 0, 0, 0, new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, el.UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, el.MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, el.EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, el.NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + [Test] + public void Test07() + { + //new DateTimeOffset(0, 0, 0, 0, 0, 0, 0, new TimeSpan()); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, el.UtcZone).Hour > 15); + + var expectedCount = utcDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, el.MoscowZone).Hour > 15); + + expectedCount = moscowDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, el.EkaterinburgZone).Hour > 15); + + expectedCount = ekaterinburgDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + + count = session.Query.All() + .Count(el => new DateTimeOffset( + el.DateTime.Year, + el.DateTime.Month, + el.DateTime.Day, + el.DateTime.Hour, + el.DateTime.Minute, + el.DateTime.Second, + el.DateTime.Millisecond, el.NewYorkZone).Hour > 15); + + expectedCount = newYorkDateTimeOffsets + .Select(TryMoveToLocalTimeZone) + .Count(el => el.Hour > 15); + Assert.That(count, Is.Not.EqualTo(0)); + Assert.That(expectedCount, Is.Not.EqualTo(0)); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } + + protected override void PopulateData() + { + dateTimes = new DateTime[12]; + utcDateTimeOffsets = new DateTimeOffset[12]; + moscowDateTimeOffsets = new DateTimeOffset[12]; + ekaterinburgDateTimeOffsets = new DateTimeOffset[12]; + newYorkDateTimeOffsets = new DateTimeOffset[12]; + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 1; i < 13; i++) { + var datetime = new DateTime(2000 + i, i, 12 + i, 11 + i, 4 * i, 3 * i); + dateTimes[i - 1] = datetime; + utcDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, UtcZone); + moscowDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, MoscowZone); + ekaterinburgDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, EkaterinburgZone); + newYorkDateTimeOffsets[i - 1] = new DateTimeOffset(datetime, NewYorkZone); + + new TestEntity { + DateTime = datetime, + UtcZone = UtcZone, + EkaterinburgZone = EkaterinburgZone, + MoscowZone = MoscowZone, + NewYorkZone = NewYorkZone + }; + } + transaction.Complete(); + } + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.DateTimeOffset); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + var providerInfo = StorageProviderInfo.Instance.Info; + if (providerInfo.ProviderName == WellKnown.Provider.PostgreSql) { + var localZone = EkaterinburgZone; + var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); + configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); + } + + return configuration; + } + + private DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) + { + if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) + return dateTimeOffset.ToOffset(EkaterinburgZone); + return dateTimeOffset; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DistinctTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DistinctTest.cs index 70f8cbfd00..45930a07fc 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DistinctTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/DistinctTest.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class DistinctTest : DateTimeOffsetBaseTest - { - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void DistinctByDateTimeOffsetTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); - } - - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void DistinctByDateTimeOffsetWithMillisecondsTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); - } - - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void DistinctByNullableDateTimeOffsetTest() - { - ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); - } - - private void DistinctPrivate(Expression> selectExpression) - where T : Entity - { - var compiledSelectExpression = selectExpression.Compile(); - var distinctLocal = Query.All().ToArray().Select(compiledSelectExpression).Distinct().OrderBy(c => c); - var distinctByServer = Query.All().Select(selectExpression).Distinct().OrderBy(c => c); - Assert.IsTrue(distinctLocal.SequenceEqual(distinctByServer)); - - distinctByServer = Query.All().Select(selectExpression).Distinct().OrderByDescending(c => c); - Assert.IsFalse(distinctLocal.SequenceEqual(distinctByServer)); - } - } +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class DistinctTest : DateTimeOffsetBaseTest + { + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void DistinctByDateTimeOffsetTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); + } + + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void DistinctByDateTimeOffsetWithMillisecondsTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); + } + + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void DistinctByNullableDateTimeOffsetTest() + { + ExecuteInsideSession(() => DistinctPrivate(c => c.DateTimeOffset)); + } + + private void DistinctPrivate(Expression> selectExpression) + where T : Entity + { + var compiledSelectExpression = selectExpression.Compile(); + var distinctLocal = Query.All().ToArray().Select(compiledSelectExpression).Distinct().OrderBy(c => c); + var distinctByServer = Query.All().Select(selectExpression).Distinct().OrderBy(c => c); + Assert.IsTrue(distinctLocal.SequenceEqual(distinctByServer)); + + distinctByServer = Query.All().Select(selectExpression).Distinct().OrderByDescending(c => c); + Assert.IsFalse(distinctLocal.SequenceEqual(distinctByServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/GroupByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/GroupByTest.cs index 2405285654..943dc2c011 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/GroupByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/GroupByTest.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class GroupByTest : DateTimeOffsetBaseTest - { - [Test] - public void DateTimeOffsetGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); - } - - [Test(Description = "Might be failed on SQLite because of certain restrictions of work with milliseconds")] - public void MillisecondDateTimeOffsetGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); - } - - [Test] - public void NullableDateTimeOffsetGroupByTest() - { - ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); - } - - private void GroupByPrivate(Expression> groupByExpression, Expression> orderByExpression) - where T : Entity - { - var compiledGroupByExpression = groupByExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - var groupByLocal = Query.All().ToArray().GroupBy(compiledGroupByExpression).ToArray(); - var groupByServer = Query.All().GroupBy(groupByExpression); - foreach (var group in groupByServer) { - Assert.Contains(group, groupByLocal); - var localGroup = groupByLocal.Single(c => c.Key.Equals(group.Key)); - Assert.IsTrue(group.OrderBy(compiledOrderByExpression).SequenceEqual(localGroup.OrderBy(compiledOrderByExpression))); - } - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class GroupByTest : DateTimeOffsetBaseTest + { + [Test] + public void DateTimeOffsetGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); + } + + [Test(Description = "Might be failed on SQLite because of certain restrictions of work with milliseconds")] + public void MillisecondDateTimeOffsetGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); + } + + [Test] + public void NullableDateTimeOffsetGroupByTest() + { + ExecuteInsideSession(() => GroupByPrivate(c => c.DateTimeOffset, c => c.Id)); + } + + private void GroupByPrivate(Expression> groupByExpression, Expression> orderByExpression) + where T : Entity + { + var compiledGroupByExpression = groupByExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + var groupByLocal = Query.All().ToArray().GroupBy(compiledGroupByExpression).ToArray(); + var groupByServer = Query.All().GroupBy(groupByExpression); + foreach (var group in groupByServer) { + Assert.Contains(group, groupByLocal); + var localGroup = groupByLocal.Single(c => c.Key.Equals(group.Key)); + Assert.IsTrue(group.OrderBy(compiledOrderByExpression).SequenceEqual(localGroup.OrderBy(compiledOrderByExpression))); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/JoinTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/JoinTest.cs index c109ab1c32..3aeddb5121 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/JoinTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/JoinTest.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class JoinTest : DateTimeOffsetBaseTest - { - [Test] - public void DateTimeOffsetJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTimeOffset, long>( - left => left.DateTimeOffset, - right => right.DateTimeOffset, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, - c => c.LeftId, - c => c.RightId)); - } - - [Test(Description = "Might be failed on SQLite because of certain restrictions of work with milliseconds")] - public void MillisecondDateTimeOffsetJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTimeOffset, long>( - left => left.DateTimeOffset, - right => right.DateTimeOffset, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, - c => c.LeftId, - c => c.RightId)); - } - - [Test] - public void NullableDateTimeOffsetJoinTest() - { - ExecuteInsideSession(() => JoinPrivate, DateTimeOffset?, long>( - left => left.DateTimeOffset, - right => right.DateTimeOffset, - (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, - c => c.LeftId, - c => c.RightId)); - } - - private void JoinPrivate(Expression> leftJoinExpression, Expression> rightJoinExpression, - Expression> joinResultExpression, Expression> orderByExpression, Expression> thenByExpression) - where T1 : Entity - where T2 : Entity - { - var compiledLeftJoinExpression = leftJoinExpression.Compile(); - var compiledRightJoinExpression = rightJoinExpression.Compile(); - var compiledJoinResultExpression = joinResultExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - var compiledThenByExpression = thenByExpression.Compile(); - var joinLocal = Query.All().ToArray() - .Join(Query.All().ToArray(), compiledLeftJoinExpression, compiledRightJoinExpression, compiledJoinResultExpression) - .OrderBy(compiledOrderByExpression) - .ThenBy(compiledThenByExpression); - - var joinServer = Query.All() - .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) - .OrderBy(orderByExpression) - .ThenBy(thenByExpression); - - Assert.IsTrue(joinLocal.SequenceEqual(joinServer)); - - joinServer = Query.All() - .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) - .OrderByDescending(orderByExpression) - .ThenBy(thenByExpression); - Assert.IsFalse(joinLocal.SequenceEqual(joinServer)); - } - } +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class JoinTest : DateTimeOffsetBaseTest + { + [Test] + public void DateTimeOffsetJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTimeOffset, long>( + left => left.DateTimeOffset, + right => right.DateTimeOffset, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, + c => c.LeftId, + c => c.RightId)); + } + + [Test(Description = "Might be failed on SQLite because of certain restrictions of work with milliseconds")] + public void MillisecondDateTimeOffsetJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTimeOffset, long>( + left => left.DateTimeOffset, + right => right.DateTimeOffset, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, + c => c.LeftId, + c => c.RightId)); + } + + [Test] + public void NullableDateTimeOffsetJoinTest() + { + ExecuteInsideSession(() => JoinPrivate, DateTimeOffset?, long>( + left => left.DateTimeOffset, + right => right.DateTimeOffset, + (left, right) => new JoinResult { LeftId = left.Id, RightId = right.Id, LeftDateTime = left.DateTimeOffset, RightDateTime = right.DateTimeOffset }, + c => c.LeftId, + c => c.RightId)); + } + + private void JoinPrivate(Expression> leftJoinExpression, Expression> rightJoinExpression, + Expression> joinResultExpression, Expression> orderByExpression, Expression> thenByExpression) + where T1 : Entity + where T2 : Entity + { + var compiledLeftJoinExpression = leftJoinExpression.Compile(); + var compiledRightJoinExpression = rightJoinExpression.Compile(); + var compiledJoinResultExpression = joinResultExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + var compiledThenByExpression = thenByExpression.Compile(); + var joinLocal = Query.All().ToArray() + .Join(Query.All().ToArray(), compiledLeftJoinExpression, compiledRightJoinExpression, compiledJoinResultExpression) + .OrderBy(compiledOrderByExpression) + .ThenBy(compiledThenByExpression); + + var joinServer = Query.All() + .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) + .OrderBy(orderByExpression) + .ThenBy(thenByExpression); + + Assert.IsTrue(joinLocal.SequenceEqual(joinServer)); + + joinServer = Query.All() + .Join(Query.All(), leftJoinExpression, rightJoinExpression, joinResultExpression) + .OrderByDescending(orderByExpression) + .ThenBy(thenByExpression); + Assert.IsFalse(joinLocal.SequenceEqual(joinServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/MinMaxTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/MinMaxTest.cs index a129f24087..2c5e16b793 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/MinMaxTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/MinMaxTest.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.07.29 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class MinMaxTest : DateTimeOffsetBaseTest - { - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void DateTimeOffsetMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); - } - - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void MillisecondDateTimeOffsetMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); - } - - [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] - public void NullableDateTimeOffsetMinMaxTest() - { - ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); - } - - private void MinMaxPrivate(Expression> selectExpression) - where T : Entity - { - var compiledSelectExpression = selectExpression.Compile(); - var minLocal = Query.All().ToArray().Min(compiledSelectExpression); - var maxLocal = Query.All().ToArray().Max(compiledSelectExpression); - var minServer = Query.All().Min(selectExpression); - var maxServer = Query.All().Max(selectExpression); - - Assert.AreEqual(minLocal, minServer); - Assert.AreEqual(maxLocal, maxServer); - Assert.AreNotEqual(minLocal, maxServer); - Assert.AreNotEqual(maxLocal, minServer); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.07.29 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class MinMaxTest : DateTimeOffsetBaseTest + { + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void DateTimeOffsetMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); + } + + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void MillisecondDateTimeOffsetMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); + } + + [Test(Description = "Might be failed on SQLite because of incomplete emulating datetimeoffset")] + public void NullableDateTimeOffsetMinMaxTest() + { + ExecuteInsideSession(() => MinMaxPrivate(c => c.DateTimeOffset)); + } + + private void MinMaxPrivate(Expression> selectExpression) + where T : Entity + { + var compiledSelectExpression = selectExpression.Compile(); + var minLocal = Query.All().ToArray().Min(compiledSelectExpression); + var maxLocal = Query.All().ToArray().Max(compiledSelectExpression); + var minServer = Query.All().Min(selectExpression); + var maxServer = Query.All().Max(selectExpression); + + Assert.AreEqual(minLocal, minServer); + Assert.AreEqual(maxLocal, maxServer); + Assert.AreNotEqual(minLocal, maxServer); + Assert.AreNotEqual(maxLocal, minServer); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OperationsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OperationsTest.cs index 6d085aec6d..a784fe6026 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OperationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OperationsTest.cs @@ -1,201 +1,201 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class OperationsTest : DateTimeOffsetBaseTest - { - [Test] - public void AddYearsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddYears(1)==FirstDateTimeOffset.AddYears(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddYears(-2)==FirstMillisecondDateTimeOffset.AddYears(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddYears(33)==NullableDateTimeOffset.AddYears(33)); - - RunWrongTest(c => c.DateTimeOffset.AddYears(1)==FirstDateTimeOffset.AddYears(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddYears(-1)==FirstMillisecondDateTimeOffset.AddYears(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddYears(33)==NullableDateTimeOffset.AddYears(44)); - }); - } - - [Test] - public void AddMonthsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddMonths(1)==FirstDateTimeOffset.AddMonths(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddMonths(-2)==FirstMillisecondDateTimeOffset.AddMonths(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddMonths(33)==NullableDateTimeOffset.AddMonths(33)); - - RunWrongTest(c => c.DateTimeOffset.AddMonths(1)==FirstDateTimeOffset.AddMonths(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddMonths(-1)==FirstMillisecondDateTimeOffset.AddMonths(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddMonths(33)==NullableDateTimeOffset.AddMonths(44)); - }); - } - - [Test] - public void AddDaysTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddDays(1)==FirstDateTimeOffset.AddDays(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddDays(-2)==FirstMillisecondDateTimeOffset.AddDays(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddDays(33)==NullableDateTimeOffset.AddDays(33)); - - RunWrongTest(c => c.DateTimeOffset.AddDays(1)==FirstDateTimeOffset.AddDays(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddDays(-1)==FirstMillisecondDateTimeOffset.AddDays(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddDays(33)==NullableDateTimeOffset.AddDays(44)); - }); - } - - [Test] - public void AddHoursTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddHours(1)==FirstDateTimeOffset.AddHours(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddHours(-2)==FirstMillisecondDateTimeOffset.AddHours(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddHours(33)==NullableDateTimeOffset.AddHours(33)); - - RunWrongTest(c => c.DateTimeOffset.AddHours(1)==FirstDateTimeOffset.AddHours(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddHours(-1)==FirstMillisecondDateTimeOffset.AddHours(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddHours(33)==NullableDateTimeOffset.AddHours(44)); - }); - } - - [Test] - public void AddMinutesTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddMinutes(1)==FirstDateTimeOffset.AddMinutes(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddMinutes(-2)==FirstMillisecondDateTimeOffset.AddMinutes(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddMinutes(33)==NullableDateTimeOffset.AddMinutes(33)); - - RunWrongTest(c => c.DateTimeOffset.AddMinutes(1)==FirstDateTimeOffset.AddMinutes(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddMinutes(-1)==FirstMillisecondDateTimeOffset.AddMinutes(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddMinutes(33)==NullableDateTimeOffset.AddMinutes(44)); - }); - } - - [Test] - public void AddSecondsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.AddSeconds(1)==FirstDateTimeOffset.AddSeconds(1)); - RunTest(c => c.MillisecondDateTimeOffset.AddSeconds(-2)==FirstMillisecondDateTimeOffset.AddSeconds(-2)); - RunTest(c => c.NullableDateTimeOffset.Value.AddSeconds(33)==NullableDateTimeOffset.AddSeconds(33)); - - RunWrongTest(c => c.DateTimeOffset.AddSeconds(1)==FirstDateTimeOffset.AddSeconds(2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddSeconds(-1)==FirstMillisecondDateTimeOffset.AddSeconds(-2)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.AddSeconds(33)==NullableDateTimeOffset.AddSeconds(44)); - }); - } - - [Test] - public void AddMillisecondsTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.MillisecondDateTimeOffset.AddMilliseconds(-2)==FirstMillisecondDateTimeOffset.AddMilliseconds(-2)); - RunWrongTest(c => c.MillisecondDateTimeOffset.AddMilliseconds(-1)==FirstMillisecondDateTimeOffset.AddMilliseconds(-2)); - }); - } - - [Test] - public void AddTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.Add(FirstOffset)==FirstDateTimeOffset.Add(FirstOffset)); - RunTest(c => c.MillisecondDateTimeOffset.Add(SecondOffset)==FirstMillisecondDateTimeOffset.Add(SecondOffset)); - RunTest(c => c.NullableDateTimeOffset.Value.Add(FirstOffset)==NullableDateTimeOffset.Add(FirstOffset)); - - RunWrongTest(c => c.DateTimeOffset.Add(FirstOffset)==FirstDateTimeOffset.Add(WrongOffset)); - RunWrongTest(c => c.MillisecondDateTimeOffset.Add(SecondOffset)==FirstMillisecondDateTimeOffset.Add(WrongOffset)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Add(FirstOffset)==NullableDateTimeOffset.Add(WrongOffset)); - }); - } - - [Test] - public void SubtractTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.Subtract(FirstOffset)==FirstDateTimeOffset.Subtract(FirstOffset)); - RunTest(c => c.MillisecondDateTimeOffset.Subtract(SecondOffset)==FirstMillisecondDateTimeOffset.Subtract(SecondOffset)); - RunTest(c => c.NullableDateTimeOffset.Value.Subtract(FirstOffset)==NullableDateTimeOffset.Subtract(FirstOffset)); - - RunWrongTest(c => c.DateTimeOffset.Subtract(FirstOffset)==FirstDateTimeOffset.Subtract(WrongOffset)); - RunWrongTest(c => c.MillisecondDateTimeOffset.Subtract(SecondOffset)==FirstMillisecondDateTimeOffset.Subtract(WrongOffset)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Subtract(FirstOffset)==NullableDateTimeOffset.Subtract(WrongOffset)); - }); - } - - [Test] - public void SubtractDateTimeTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.Subtract(SecondDateTime)==FirstDateTimeOffset.Subtract(SecondDateTime)); - RunTest(c => c.MillisecondDateTimeOffset.Subtract(SecondDateTime)==FirstMillisecondDateTimeOffset.Subtract(SecondDateTime)); - RunTest(c => c.NullableDateTimeOffset.Value.Subtract(SecondDateTime)==NullableDateTimeOffset.Subtract(SecondDateTime)); - - RunWrongTest(c => c.DateTimeOffset.Subtract(SecondDateTime)==FirstDateTimeOffset.Subtract(WrongDateTime)); - RunWrongTest(c => c.MillisecondDateTimeOffset.Subtract(SecondDateTime)==FirstMillisecondDateTimeOffset.Subtract(WrongDateTime)); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Subtract(SecondDateTime)==NullableDateTimeOffset.Subtract(WrongDateTime)); - }); - } - - [Test] - public void PlusTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset + FirstOffset==FirstDateTimeOffset + FirstOffset); - RunTest(c => c.MillisecondDateTimeOffset + SecondOffset==FirstMillisecondDateTimeOffset + SecondOffset); - RunTest(c => c.NullableDateTimeOffset + FirstOffset==NullableDateTimeOffset + FirstOffset); - - RunWrongTest(c => c.DateTimeOffset + FirstOffset==FirstDateTimeOffset + WrongOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset + SecondOffset==FirstMillisecondDateTimeOffset + WrongOffset); - RunWrongTest(c => c.NullableDateTimeOffset + FirstOffset==NullableDateTimeOffset + WrongOffset); - }); - } - - [Test] - public void MinusTimeSpanTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset - FirstOffset==FirstDateTimeOffset - FirstOffset); - RunTest(c => c.MillisecondDateTimeOffset - SecondOffset==FirstMillisecondDateTimeOffset - SecondOffset); - RunTest(c => c.NullableDateTimeOffset - FirstOffset==NullableDateTimeOffset - FirstOffset); - - RunWrongTest(c => c.DateTimeOffset - FirstOffset==FirstDateTimeOffset - WrongOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset - SecondOffset==FirstMillisecondDateTimeOffset - WrongOffset); - RunWrongTest(c => c.NullableDateTimeOffset - FirstOffset==NullableDateTimeOffset - WrongOffset); - }); - } - - [Test] - public void MinusDateTimeTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset - SecondDateTime==FirstDateTimeOffset - SecondDateTime); - RunTest(c => c.MillisecondDateTimeOffset - SecondDateTime==FirstMillisecondDateTimeOffset - SecondDateTime); - RunTest(c => c.NullableDateTimeOffset - SecondDateTime==NullableDateTimeOffset - SecondDateTime); - - RunWrongTest(c => c.DateTimeOffset - SecondDateTime==FirstDateTimeOffset - WrongDateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset - SecondDateTime==FirstMillisecondDateTimeOffset - WrongDateTime); - RunWrongTest(c => c.NullableDateTimeOffset - SecondDateTime==NullableDateTimeOffset - WrongDateTime); - }); - } - - [Test(Description = "Will fail for PostgreSql because of its restrictions")] - public void ToUniversalTime() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.ToUniversalTime()==FirstDateTimeOffset.ToUniversalTime()); - RunTest(c => c.MillisecondDateTimeOffset.ToUniversalTime()==FirstMillisecondDateTimeOffset.ToUniversalTime()); - RunTest(c => c.NullableDateTimeOffset.Value.ToUniversalTime()==NullableDateTimeOffset.ToUniversalTime()); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class OperationsTest : DateTimeOffsetBaseTest + { + [Test] + public void AddYearsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddYears(1)==FirstDateTimeOffset.AddYears(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddYears(-2)==FirstMillisecondDateTimeOffset.AddYears(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddYears(33)==NullableDateTimeOffset.AddYears(33)); + + RunWrongTest(c => c.DateTimeOffset.AddYears(1)==FirstDateTimeOffset.AddYears(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddYears(-1)==FirstMillisecondDateTimeOffset.AddYears(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddYears(33)==NullableDateTimeOffset.AddYears(44)); + }); + } + + [Test] + public void AddMonthsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddMonths(1)==FirstDateTimeOffset.AddMonths(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddMonths(-2)==FirstMillisecondDateTimeOffset.AddMonths(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddMonths(33)==NullableDateTimeOffset.AddMonths(33)); + + RunWrongTest(c => c.DateTimeOffset.AddMonths(1)==FirstDateTimeOffset.AddMonths(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddMonths(-1)==FirstMillisecondDateTimeOffset.AddMonths(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddMonths(33)==NullableDateTimeOffset.AddMonths(44)); + }); + } + + [Test] + public void AddDaysTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddDays(1)==FirstDateTimeOffset.AddDays(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddDays(-2)==FirstMillisecondDateTimeOffset.AddDays(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddDays(33)==NullableDateTimeOffset.AddDays(33)); + + RunWrongTest(c => c.DateTimeOffset.AddDays(1)==FirstDateTimeOffset.AddDays(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddDays(-1)==FirstMillisecondDateTimeOffset.AddDays(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddDays(33)==NullableDateTimeOffset.AddDays(44)); + }); + } + + [Test] + public void AddHoursTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddHours(1)==FirstDateTimeOffset.AddHours(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddHours(-2)==FirstMillisecondDateTimeOffset.AddHours(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddHours(33)==NullableDateTimeOffset.AddHours(33)); + + RunWrongTest(c => c.DateTimeOffset.AddHours(1)==FirstDateTimeOffset.AddHours(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddHours(-1)==FirstMillisecondDateTimeOffset.AddHours(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddHours(33)==NullableDateTimeOffset.AddHours(44)); + }); + } + + [Test] + public void AddMinutesTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddMinutes(1)==FirstDateTimeOffset.AddMinutes(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddMinutes(-2)==FirstMillisecondDateTimeOffset.AddMinutes(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddMinutes(33)==NullableDateTimeOffset.AddMinutes(33)); + + RunWrongTest(c => c.DateTimeOffset.AddMinutes(1)==FirstDateTimeOffset.AddMinutes(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddMinutes(-1)==FirstMillisecondDateTimeOffset.AddMinutes(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddMinutes(33)==NullableDateTimeOffset.AddMinutes(44)); + }); + } + + [Test] + public void AddSecondsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.AddSeconds(1)==FirstDateTimeOffset.AddSeconds(1)); + RunTest(c => c.MillisecondDateTimeOffset.AddSeconds(-2)==FirstMillisecondDateTimeOffset.AddSeconds(-2)); + RunTest(c => c.NullableDateTimeOffset.Value.AddSeconds(33)==NullableDateTimeOffset.AddSeconds(33)); + + RunWrongTest(c => c.DateTimeOffset.AddSeconds(1)==FirstDateTimeOffset.AddSeconds(2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddSeconds(-1)==FirstMillisecondDateTimeOffset.AddSeconds(-2)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.AddSeconds(33)==NullableDateTimeOffset.AddSeconds(44)); + }); + } + + [Test] + public void AddMillisecondsTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.MillisecondDateTimeOffset.AddMilliseconds(-2)==FirstMillisecondDateTimeOffset.AddMilliseconds(-2)); + RunWrongTest(c => c.MillisecondDateTimeOffset.AddMilliseconds(-1)==FirstMillisecondDateTimeOffset.AddMilliseconds(-2)); + }); + } + + [Test] + public void AddTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.Add(FirstOffset)==FirstDateTimeOffset.Add(FirstOffset)); + RunTest(c => c.MillisecondDateTimeOffset.Add(SecondOffset)==FirstMillisecondDateTimeOffset.Add(SecondOffset)); + RunTest(c => c.NullableDateTimeOffset.Value.Add(FirstOffset)==NullableDateTimeOffset.Add(FirstOffset)); + + RunWrongTest(c => c.DateTimeOffset.Add(FirstOffset)==FirstDateTimeOffset.Add(WrongOffset)); + RunWrongTest(c => c.MillisecondDateTimeOffset.Add(SecondOffset)==FirstMillisecondDateTimeOffset.Add(WrongOffset)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Add(FirstOffset)==NullableDateTimeOffset.Add(WrongOffset)); + }); + } + + [Test] + public void SubtractTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.Subtract(FirstOffset)==FirstDateTimeOffset.Subtract(FirstOffset)); + RunTest(c => c.MillisecondDateTimeOffset.Subtract(SecondOffset)==FirstMillisecondDateTimeOffset.Subtract(SecondOffset)); + RunTest(c => c.NullableDateTimeOffset.Value.Subtract(FirstOffset)==NullableDateTimeOffset.Subtract(FirstOffset)); + + RunWrongTest(c => c.DateTimeOffset.Subtract(FirstOffset)==FirstDateTimeOffset.Subtract(WrongOffset)); + RunWrongTest(c => c.MillisecondDateTimeOffset.Subtract(SecondOffset)==FirstMillisecondDateTimeOffset.Subtract(WrongOffset)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Subtract(FirstOffset)==NullableDateTimeOffset.Subtract(WrongOffset)); + }); + } + + [Test] + public void SubtractDateTimeTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.Subtract(SecondDateTime)==FirstDateTimeOffset.Subtract(SecondDateTime)); + RunTest(c => c.MillisecondDateTimeOffset.Subtract(SecondDateTime)==FirstMillisecondDateTimeOffset.Subtract(SecondDateTime)); + RunTest(c => c.NullableDateTimeOffset.Value.Subtract(SecondDateTime)==NullableDateTimeOffset.Subtract(SecondDateTime)); + + RunWrongTest(c => c.DateTimeOffset.Subtract(SecondDateTime)==FirstDateTimeOffset.Subtract(WrongDateTime)); + RunWrongTest(c => c.MillisecondDateTimeOffset.Subtract(SecondDateTime)==FirstMillisecondDateTimeOffset.Subtract(WrongDateTime)); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Subtract(SecondDateTime)==NullableDateTimeOffset.Subtract(WrongDateTime)); + }); + } + + [Test] + public void PlusTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset + FirstOffset==FirstDateTimeOffset + FirstOffset); + RunTest(c => c.MillisecondDateTimeOffset + SecondOffset==FirstMillisecondDateTimeOffset + SecondOffset); + RunTest(c => c.NullableDateTimeOffset + FirstOffset==NullableDateTimeOffset + FirstOffset); + + RunWrongTest(c => c.DateTimeOffset + FirstOffset==FirstDateTimeOffset + WrongOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset + SecondOffset==FirstMillisecondDateTimeOffset + WrongOffset); + RunWrongTest(c => c.NullableDateTimeOffset + FirstOffset==NullableDateTimeOffset + WrongOffset); + }); + } + + [Test] + public void MinusTimeSpanTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset - FirstOffset==FirstDateTimeOffset - FirstOffset); + RunTest(c => c.MillisecondDateTimeOffset - SecondOffset==FirstMillisecondDateTimeOffset - SecondOffset); + RunTest(c => c.NullableDateTimeOffset - FirstOffset==NullableDateTimeOffset - FirstOffset); + + RunWrongTest(c => c.DateTimeOffset - FirstOffset==FirstDateTimeOffset - WrongOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset - SecondOffset==FirstMillisecondDateTimeOffset - WrongOffset); + RunWrongTest(c => c.NullableDateTimeOffset - FirstOffset==NullableDateTimeOffset - WrongOffset); + }); + } + + [Test] + public void MinusDateTimeTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset - SecondDateTime==FirstDateTimeOffset - SecondDateTime); + RunTest(c => c.MillisecondDateTimeOffset - SecondDateTime==FirstMillisecondDateTimeOffset - SecondDateTime); + RunTest(c => c.NullableDateTimeOffset - SecondDateTime==NullableDateTimeOffset - SecondDateTime); + + RunWrongTest(c => c.DateTimeOffset - SecondDateTime==FirstDateTimeOffset - WrongDateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset - SecondDateTime==FirstMillisecondDateTimeOffset - WrongDateTime); + RunWrongTest(c => c.NullableDateTimeOffset - SecondDateTime==NullableDateTimeOffset - WrongDateTime); + }); + } + + [Test(Description = "Will fail for PostgreSql because of its restrictions")] + public void ToUniversalTime() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.ToUniversalTime()==FirstDateTimeOffset.ToUniversalTime()); + RunTest(c => c.MillisecondDateTimeOffset.ToUniversalTime()==FirstMillisecondDateTimeOffset.ToUniversalTime()); + RunTest(c => c.NullableDateTimeOffset.Value.ToUniversalTime()==NullableDateTimeOffset.ToUniversalTime()); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OrderByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OrderByTest.cs index a739a86945..079a6e1d2d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OrderByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/OrderByTest.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.07.29 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class OrderByTest : DateTimeOffsetBaseTest - { - [Test] - public void DateTimeOffsetOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTimeOffset, c => c.Id); - OrderByPrivate(c => c.DateTimeOffset, c => c); - }); - } - - [Test] - public void MillisecondDateTimeOffsetOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTimeOffset, c => c.Id); - OrderByPrivate(c => c.DateTimeOffset, c => c); - }); - } - - [Test] - public void NullableDateTimeOffsetOrderByTest() - { - ExecuteInsideSession(() => { - OrderByPrivate(c => c.DateTimeOffset, c => c.Id); - OrderByPrivate(c => c.DateTimeOffset, c => c); - }); - } - - private void OrderByPrivate(Expression> orderByExpression, Expression> thenByExpression) - where T : Entity - { - var compiledOrderByExpression = orderByExpression.Compile(); - var compiledThenByExpression = thenByExpression.Compile(); - var notOrderedLocal = Query.All().ToArray(); - var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression).ThenBy(compiledThenByExpression); - var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression).ThenBy(compiledThenByExpression); - var orderedByServer = Query.All().OrderBy(orderByExpression).ThenBy(thenByExpression); - var orderedByServerDescending = Query.All().OrderByDescending(orderByExpression).ThenBy(thenByExpression); - - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); - } - - protected void OrderByPrivate(Expression> selectorExpression, Expression> orderByExpression) - where T1 : Entity - { - var compiledOrderByExpression = orderByExpression.Compile(); - - var notOrderedLocal = Query.All().Select(selectorExpression).ToArray(); - var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression); - var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression); - var orderedByServer = Query.All().Select(selectorExpression).OrderBy(orderByExpression); - var orderedByServerDescending = Query.All().Select(selectorExpression).OrderByDescending(orderByExpression); - - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); - Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); - Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); - Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.07.29 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class OrderByTest : DateTimeOffsetBaseTest + { + [Test] + public void DateTimeOffsetOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTimeOffset, c => c.Id); + OrderByPrivate(c => c.DateTimeOffset, c => c); + }); + } + + [Test] + public void MillisecondDateTimeOffsetOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTimeOffset, c => c.Id); + OrderByPrivate(c => c.DateTimeOffset, c => c); + }); + } + + [Test] + public void NullableDateTimeOffsetOrderByTest() + { + ExecuteInsideSession(() => { + OrderByPrivate(c => c.DateTimeOffset, c => c.Id); + OrderByPrivate(c => c.DateTimeOffset, c => c); + }); + } + + private void OrderByPrivate(Expression> orderByExpression, Expression> thenByExpression) + where T : Entity + { + var compiledOrderByExpression = orderByExpression.Compile(); + var compiledThenByExpression = thenByExpression.Compile(); + var notOrderedLocal = Query.All().ToArray(); + var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression).ThenBy(compiledThenByExpression); + var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression).ThenBy(compiledThenByExpression); + var orderedByServer = Query.All().OrderBy(orderByExpression).ThenBy(thenByExpression); + var orderedByServerDescending = Query.All().OrderByDescending(orderByExpression).ThenBy(thenByExpression); + + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); + } + + protected void OrderByPrivate(Expression> selectorExpression, Expression> orderByExpression) + where T1 : Entity + { + var compiledOrderByExpression = orderByExpression.Compile(); + + var notOrderedLocal = Query.All().Select(selectorExpression).ToArray(); + var orderedLocal = notOrderedLocal.OrderBy(compiledOrderByExpression); + var orderedLocalDescending = notOrderedLocal.OrderByDescending(compiledOrderByExpression); + var orderedByServer = Query.All().Select(selectorExpression).OrderBy(orderByExpression); + var orderedByServerDescending = Query.All().Select(selectorExpression).OrderByDescending(orderByExpression); + + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedLocal)); + Assert.IsFalse(notOrderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocal.SequenceEqual(orderedByServer)); + Assert.IsTrue(orderedLocalDescending.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocal.SequenceEqual(orderedByServerDescending)); + Assert.IsFalse(orderedLocalDescending.SequenceEqual(orderedByServer)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/PartsExtractionTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/PartsExtractionTest.cs index 152081b194..4a3064829d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/PartsExtractionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/PartsExtractionTest.cs @@ -1,295 +1,295 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class PartsExtractionTest : DateTimeOffsetBaseTest - { - [Test] - public void ExtractYearTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.Year==FirstDateTimeOffset.Year); - RunTest(c => c.MillisecondDateTimeOffset.Year==FirstMillisecondDateTimeOffset.Year); - RunTest(c => c.NullableDateTimeOffset.Value.Year==NullableDateTimeOffset.Year); - - RunWrongTest(c => c.DateTimeOffset.Year==WrongDateTimeOffset.Year); - RunWrongTest(c => c.MillisecondDateTimeOffset.Year==WrongMillisecondDateTimeOffset.Year); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Year==WrongDateTimeOffset.Year); - }); - } - - [Test] - public void ExtractMonthTest() - { - ExecuteInsideSession(() => { - RunTest(c => c.DateTimeOffset.Month==FirstDateTimeOffset.Month); - RunTest(c => c.MillisecondDateTimeOffset.Month==FirstMillisecondDateTimeOffset.Month); - RunTest(c => c.NullableDateTimeOffset.Value.Month==NullableDateTimeOffset.Month); - - RunWrongTest(c => c.DateTimeOffset.Month==WrongDateTimeOffset.Month); - RunWrongTest(c => c.MillisecondDateTimeOffset.Month==WrongMillisecondDateTimeOffset.Month); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Month==WrongDateTimeOffset.Month); - }); - } - - [Test] - public void ExtractDayTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - - RunTest(c => c.DateTimeOffset.Day==firstDateTimeOffset.Day); - RunTest(c => c.MillisecondDateTimeOffset.Day==firstMillisecondDateTimeOffset.Day); - RunTest(c => c.NullableDateTimeOffset.Value.Day==nullableDateTimeOffset.Day); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.Day==wrongDateTimeOffset.Day); - RunWrongTest(c => c.MillisecondDateTimeOffset.Day==wrongMillisecondDateTimeOffset.Day); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Day==wrongDateTimeOffset.Day); - }); - } - - [Test] - public void ExtractHourTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - - RunTest(c => c.DateTimeOffset.Hour==firstDateTimeOffset.Hour); - RunTest(c => c.MillisecondDateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour); - RunTest(c => c.NullableDateTimeOffset.Value.Hour==nullableDateTimeOffset.Hour); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.Hour==wrongDateTimeOffset.Hour); - RunWrongTest(c => c.MillisecondDateTimeOffset.Hour==wrongMillisecondDateTimeOffset.Hour); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Hour==wrongDateTimeOffset.Hour); - }); - } - - [Test] - public void ExtractMinuteTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.Minute==firstDateTimeOffset.Minute); - RunTest(c => c.MillisecondDateTimeOffset.Minute==firstMillisecondDateTimeOffset.Minute); - RunTest(c => c.NullableDateTimeOffset.Value.Minute==nullableDateTimeOffset.Minute); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.Minute==wrongDateTimeOffset.Minute); - RunWrongTest(c => c.MillisecondDateTimeOffset.Minute==wrongMillisecondDateTimeOffset.Minute); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Minute==wrongDateTimeOffset.Minute); - }); - } - - [Test] - public void ExtractSecondTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.Second==firstDateTimeOffset.Second); - RunTest(c => c.MillisecondDateTimeOffset.Second==firstMillisecondDateTimeOffset.Second); - RunTest(c => c.NullableDateTimeOffset.Value.Second==nullableDateTimeOffset.Second); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.Second==wrongDateTimeOffset.Second); - RunWrongTest(c => c.MillisecondDateTimeOffset.Second==wrongMillisecondDateTimeOffset.Second); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Second==wrongDateTimeOffset.Second); - }); - } - - [Test] - public void ExtractMillisecondTest() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - RunTest(c => c.MillisecondDateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond); - - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset.Second==wrongMillisecondDateTimeOffset.Millisecond); - }); - } - - [Test] - public void ExtractDateTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.Date==firstDateTimeOffset.Date); - RunTest(c => c.MillisecondDateTimeOffset.Date==firstMillisecondDateTimeOffset.Date); - RunTest(c => c.NullableDateTimeOffset.Value.Date==nullableDateTimeOffset.Date); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.Date==wrongDateTimeOffset.Date); - RunWrongTest(c => c.MillisecondDateTimeOffset.Date==wrongMillisecondDateTimeOffset.Date); - RunWrongTest(c => c.NullableDateTimeOffset.Value.Date==wrongDateTimeOffset.Date); - }); - } - - [Test] - public void ExtractTimeOfDayTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - RunTest(c => c.DateTimeOffset.TimeOfDay==firstDateTimeOffset.TimeOfDay); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.TimeOfDay==wrongDateTimeOffset.TimeOfDay); - }); - } - - [Test] - public void ExtractTimeOfDayWithMillisecondsTest() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - RunTest(c => c.MillisecondDateTimeOffset.TimeOfDay==firstMillisecondDateTimeOffset.TimeOfDay); - - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.MillisecondDateTimeOffset.TimeOfDay==wrongMillisecondDateTimeOffset.TimeOfDay); - }); - } - - [Test] - public void ExtractTimeOfDayOfNullableValueTest() - { - ExecuteInsideSession(() => { - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.NullableDateTimeOffset.Value.TimeOfDay==nullableDateTimeOffset.TimeOfDay); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - RunWrongTest(c => c.NullableDateTimeOffset.Value.TimeOfDay==wrongDateTimeOffset.TimeOfDay); - }); - } - - [Test] - public void ExtractDayOfYearTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.DayOfYear==firstDateTimeOffset.DayOfYear); - RunTest(c => c.MillisecondDateTimeOffset.DayOfYear==firstMillisecondDateTimeOffset.DayOfYear); - RunTest(c => c.NullableDateTimeOffset.Value.DayOfYear==nullableDateTimeOffset.DayOfYear); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.DayOfYear==wrongDateTimeOffset.DayOfYear); - RunWrongTest(c => c.MillisecondDateTimeOffset.DayOfYear==wrongMillisecondDateTimeOffset.DayOfYear); - RunWrongTest(c => c.NullableDateTimeOffset.Value.DayOfYear==wrongDateTimeOffset.DayOfYear); - }); - } - - [Test] - public void ExtractDayOfWeekTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.DayOfWeek==firstDateTimeOffset.DayOfWeek); - RunTest(c => c.MillisecondDateTimeOffset.DayOfWeek==firstMillisecondDateTimeOffset.DayOfWeek); - RunTest(c => c.NullableDateTimeOffset.Value.DayOfWeek==nullableDateTimeOffset.DayOfWeek); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.DayOfWeek==wrongDateTimeOffset.DayOfWeek); - RunWrongTest(c => c.MillisecondDateTimeOffset.DayOfWeek==wrongMillisecondDateTimeOffset.DayOfWeek); - RunWrongTest(c => c.NullableDateTimeOffset.Value.DayOfWeek==wrongDateTimeOffset.DayOfWeek); - }); - } - - [Test] - public void ExtractDateTimeTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.DateTime==firstDateTimeOffset.DateTime); - RunTest(c => c.MillisecondDateTimeOffset.DateTime==firstMillisecondDateTimeOffset.DateTime); - RunTest(c => c.NullableDateTimeOffset.Value.DateTime==nullableDateTimeOffset.DateTime); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.DateTime==wrongDateTimeOffset.DateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset.DateTime==wrongMillisecondDateTimeOffset.DateTime); - RunWrongTest(c => c.NullableDateTimeOffset.Value.DateTime==wrongDateTimeOffset.DateTime); - }); - } - - [Test] - public void ExtractLocalDateTimeTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.LocalDateTime==firstDateTimeOffset.LocalDateTime); - RunTest(c => c.MillisecondDateTimeOffset.LocalDateTime==firstMillisecondDateTimeOffset.LocalDateTime); - RunTest(c => c.NullableDateTimeOffset.Value.LocalDateTime==nullableDateTimeOffset.LocalDateTime); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.LocalDateTime==WrongDateTimeOffset.LocalDateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset.LocalDateTime==wrongMillisecondDateTimeOffset.LocalDateTime); - RunWrongTest(c => c.NullableDateTimeOffset.Value.LocalDateTime==wrongDateTimeOffset.LocalDateTime); - }); - } - - [Test] - public void ExtractUtcDateTimeTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.UtcDateTime==firstDateTimeOffset.UtcDateTime); - RunTest(c => c.MillisecondDateTimeOffset.UtcDateTime==firstMillisecondDateTimeOffset.UtcDateTime); - RunTest(c => c.NullableDateTimeOffset.Value.UtcDateTime==nullableDateTimeOffset.UtcDateTime); - - var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); - var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); - RunWrongTest(c => c.DateTimeOffset.UtcDateTime==wrongDateTimeOffset.UtcDateTime); - RunWrongTest(c => c.MillisecondDateTimeOffset.UtcDateTime==wrongMillisecondDateTimeOffset.UtcDateTime); - RunWrongTest(c => c.NullableDateTimeOffset.Value.UtcDateTime==wrongDateTimeOffset.UtcDateTime); - }); - } - - [Test] - public void ExtractOffsetTest() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); - RunTest(c => c.DateTimeOffset.Offset==firstDateTimeOffset.Offset); - RunTest(c => c.MillisecondDateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset); - RunTest(c => c.NullableDateTimeOffset.Value.Offset==nullableDateTimeOffset.Offset); - }); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class PartsExtractionTest : DateTimeOffsetBaseTest + { + [Test] + public void ExtractYearTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.Year==FirstDateTimeOffset.Year); + RunTest(c => c.MillisecondDateTimeOffset.Year==FirstMillisecondDateTimeOffset.Year); + RunTest(c => c.NullableDateTimeOffset.Value.Year==NullableDateTimeOffset.Year); + + RunWrongTest(c => c.DateTimeOffset.Year==WrongDateTimeOffset.Year); + RunWrongTest(c => c.MillisecondDateTimeOffset.Year==WrongMillisecondDateTimeOffset.Year); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Year==WrongDateTimeOffset.Year); + }); + } + + [Test] + public void ExtractMonthTest() + { + ExecuteInsideSession(() => { + RunTest(c => c.DateTimeOffset.Month==FirstDateTimeOffset.Month); + RunTest(c => c.MillisecondDateTimeOffset.Month==FirstMillisecondDateTimeOffset.Month); + RunTest(c => c.NullableDateTimeOffset.Value.Month==NullableDateTimeOffset.Month); + + RunWrongTest(c => c.DateTimeOffset.Month==WrongDateTimeOffset.Month); + RunWrongTest(c => c.MillisecondDateTimeOffset.Month==WrongMillisecondDateTimeOffset.Month); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Month==WrongDateTimeOffset.Month); + }); + } + + [Test] + public void ExtractDayTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + + RunTest(c => c.DateTimeOffset.Day==firstDateTimeOffset.Day); + RunTest(c => c.MillisecondDateTimeOffset.Day==firstMillisecondDateTimeOffset.Day); + RunTest(c => c.NullableDateTimeOffset.Value.Day==nullableDateTimeOffset.Day); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.Day==wrongDateTimeOffset.Day); + RunWrongTest(c => c.MillisecondDateTimeOffset.Day==wrongMillisecondDateTimeOffset.Day); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Day==wrongDateTimeOffset.Day); + }); + } + + [Test] + public void ExtractHourTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + + RunTest(c => c.DateTimeOffset.Hour==firstDateTimeOffset.Hour); + RunTest(c => c.MillisecondDateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour); + RunTest(c => c.NullableDateTimeOffset.Value.Hour==nullableDateTimeOffset.Hour); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.Hour==wrongDateTimeOffset.Hour); + RunWrongTest(c => c.MillisecondDateTimeOffset.Hour==wrongMillisecondDateTimeOffset.Hour); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Hour==wrongDateTimeOffset.Hour); + }); + } + + [Test] + public void ExtractMinuteTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.Minute==firstDateTimeOffset.Minute); + RunTest(c => c.MillisecondDateTimeOffset.Minute==firstMillisecondDateTimeOffset.Minute); + RunTest(c => c.NullableDateTimeOffset.Value.Minute==nullableDateTimeOffset.Minute); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.Minute==wrongDateTimeOffset.Minute); + RunWrongTest(c => c.MillisecondDateTimeOffset.Minute==wrongMillisecondDateTimeOffset.Minute); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Minute==wrongDateTimeOffset.Minute); + }); + } + + [Test] + public void ExtractSecondTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.Second==firstDateTimeOffset.Second); + RunTest(c => c.MillisecondDateTimeOffset.Second==firstMillisecondDateTimeOffset.Second); + RunTest(c => c.NullableDateTimeOffset.Value.Second==nullableDateTimeOffset.Second); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.Second==wrongDateTimeOffset.Second); + RunWrongTest(c => c.MillisecondDateTimeOffset.Second==wrongMillisecondDateTimeOffset.Second); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Second==wrongDateTimeOffset.Second); + }); + } + + [Test] + public void ExtractMillisecondTest() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + RunTest(c => c.MillisecondDateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond); + + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset.Second==wrongMillisecondDateTimeOffset.Millisecond); + }); + } + + [Test] + public void ExtractDateTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.Date==firstDateTimeOffset.Date); + RunTest(c => c.MillisecondDateTimeOffset.Date==firstMillisecondDateTimeOffset.Date); + RunTest(c => c.NullableDateTimeOffset.Value.Date==nullableDateTimeOffset.Date); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.Date==wrongDateTimeOffset.Date); + RunWrongTest(c => c.MillisecondDateTimeOffset.Date==wrongMillisecondDateTimeOffset.Date); + RunWrongTest(c => c.NullableDateTimeOffset.Value.Date==wrongDateTimeOffset.Date); + }); + } + + [Test] + public void ExtractTimeOfDayTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + RunTest(c => c.DateTimeOffset.TimeOfDay==firstDateTimeOffset.TimeOfDay); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.TimeOfDay==wrongDateTimeOffset.TimeOfDay); + }); + } + + [Test] + public void ExtractTimeOfDayWithMillisecondsTest() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + RunTest(c => c.MillisecondDateTimeOffset.TimeOfDay==firstMillisecondDateTimeOffset.TimeOfDay); + + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.MillisecondDateTimeOffset.TimeOfDay==wrongMillisecondDateTimeOffset.TimeOfDay); + }); + } + + [Test] + public void ExtractTimeOfDayOfNullableValueTest() + { + ExecuteInsideSession(() => { + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.NullableDateTimeOffset.Value.TimeOfDay==nullableDateTimeOffset.TimeOfDay); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + RunWrongTest(c => c.NullableDateTimeOffset.Value.TimeOfDay==wrongDateTimeOffset.TimeOfDay); + }); + } + + [Test] + public void ExtractDayOfYearTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.DayOfYear==firstDateTimeOffset.DayOfYear); + RunTest(c => c.MillisecondDateTimeOffset.DayOfYear==firstMillisecondDateTimeOffset.DayOfYear); + RunTest(c => c.NullableDateTimeOffset.Value.DayOfYear==nullableDateTimeOffset.DayOfYear); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.DayOfYear==wrongDateTimeOffset.DayOfYear); + RunWrongTest(c => c.MillisecondDateTimeOffset.DayOfYear==wrongMillisecondDateTimeOffset.DayOfYear); + RunWrongTest(c => c.NullableDateTimeOffset.Value.DayOfYear==wrongDateTimeOffset.DayOfYear); + }); + } + + [Test] + public void ExtractDayOfWeekTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.DayOfWeek==firstDateTimeOffset.DayOfWeek); + RunTest(c => c.MillisecondDateTimeOffset.DayOfWeek==firstMillisecondDateTimeOffset.DayOfWeek); + RunTest(c => c.NullableDateTimeOffset.Value.DayOfWeek==nullableDateTimeOffset.DayOfWeek); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.DayOfWeek==wrongDateTimeOffset.DayOfWeek); + RunWrongTest(c => c.MillisecondDateTimeOffset.DayOfWeek==wrongMillisecondDateTimeOffset.DayOfWeek); + RunWrongTest(c => c.NullableDateTimeOffset.Value.DayOfWeek==wrongDateTimeOffset.DayOfWeek); + }); + } + + [Test] + public void ExtractDateTimeTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.DateTime==firstDateTimeOffset.DateTime); + RunTest(c => c.MillisecondDateTimeOffset.DateTime==firstMillisecondDateTimeOffset.DateTime); + RunTest(c => c.NullableDateTimeOffset.Value.DateTime==nullableDateTimeOffset.DateTime); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.DateTime==wrongDateTimeOffset.DateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset.DateTime==wrongMillisecondDateTimeOffset.DateTime); + RunWrongTest(c => c.NullableDateTimeOffset.Value.DateTime==wrongDateTimeOffset.DateTime); + }); + } + + [Test] + public void ExtractLocalDateTimeTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.LocalDateTime==firstDateTimeOffset.LocalDateTime); + RunTest(c => c.MillisecondDateTimeOffset.LocalDateTime==firstMillisecondDateTimeOffset.LocalDateTime); + RunTest(c => c.NullableDateTimeOffset.Value.LocalDateTime==nullableDateTimeOffset.LocalDateTime); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.LocalDateTime==WrongDateTimeOffset.LocalDateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset.LocalDateTime==wrongMillisecondDateTimeOffset.LocalDateTime); + RunWrongTest(c => c.NullableDateTimeOffset.Value.LocalDateTime==wrongDateTimeOffset.LocalDateTime); + }); + } + + [Test] + public void ExtractUtcDateTimeTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.UtcDateTime==firstDateTimeOffset.UtcDateTime); + RunTest(c => c.MillisecondDateTimeOffset.UtcDateTime==firstMillisecondDateTimeOffset.UtcDateTime); + RunTest(c => c.NullableDateTimeOffset.Value.UtcDateTime==nullableDateTimeOffset.UtcDateTime); + + var wrongDateTimeOffset = TryMoveToLocalTimeZone(WrongDateTimeOffset); + var wrongMillisecondDateTimeOffset = TryMoveToLocalTimeZone(WrongMillisecondDateTimeOffset); + RunWrongTest(c => c.DateTimeOffset.UtcDateTime==wrongDateTimeOffset.UtcDateTime); + RunWrongTest(c => c.MillisecondDateTimeOffset.UtcDateTime==wrongMillisecondDateTimeOffset.UtcDateTime); + RunWrongTest(c => c.NullableDateTimeOffset.Value.UtcDateTime==wrongDateTimeOffset.UtcDateTime); + }); + } + + [Test] + public void ExtractOffsetTest() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + var nullableDateTimeOffset = TryMoveToLocalTimeZone(NullableDateTimeOffset); + RunTest(c => c.DateTimeOffset.Offset==firstDateTimeOffset.Offset); + RunTest(c => c.MillisecondDateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset); + RunTest(c => c.NullableDateTimeOffset.Value.Offset==nullableDateTimeOffset.Offset); + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/WhereTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/WhereTest.cs index b8bd921135..5c73276e5d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/WhereTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/WhereTest.cs @@ -1,202 +1,202 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets -{ - public class WhereTest : DateTimeOffsetBaseTest - { - [Test] - public void Test01() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset==firstDateTimeOffset, c => c.Id); - }); - } - - [Test] - public void Test02() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Hour==firstDateTimeOffset.Hour, c => c.Id); - }); - } - - [Test] - public void Test03() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Second==firstDateTimeOffset.Second, c => c.Id); - }); - } - - [Test] - public void Test04() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Offset==firstDateTimeOffset.Offset, c => c.Id); - }); - } - - [Test] - public void Test05() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Offset.Hours==firstDateTimeOffset.Offset.Hours, c => c.Id); - }); - } - - [Test] - public void Test06() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Offset.Minutes==firstDateTimeOffset.Offset.Minutes, c => c.Id); - }); - } - - [Test] - public void Test07() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset==firstMillisecondDateTimeOffset, c => c.Id); - }); - } - - [Test] - public void Test08() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour, c => c.Id); - }); - } - - [Test] - public void Test09() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond, c => c.Id); - }); - } - - [Test] - public void Test10() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset, c => c.Id); - }); - } - - [Test] - public void Test11() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset==firstMillisecondDateTimeOffset, c => c.Id); - }); - } - - [Test] - public void Test12() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour, c => c.Id); - }); - } - - [Test] - public void Test13() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond, c => c.Id); - }); - } - - [Test] - public void Test14() - { - ExecuteInsideSession(() => { - var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset, c => c.Id); - }); - } - - [Test] - public void Test15() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset==firstDateTimeOffset, c => c.Id); - }); - } - - [Test] - public void Test16() - { - ExecuteInsideSession(() => { - WherePrivate(c => c.DateTimeOffset==null, c => c.Id); - }); - } - - [Test] - public void Test17() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); - WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Hour==firstDateTimeOffset.Hour, c => c.Id); - }); - } - - [Test] - public void Test18() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(TryMoveToLocalTimeZone(FirstDateTime)); - WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Second==firstDateTimeOffset.Second, c => c.Id); - }); - } - - [Test] - public void Test19() - { - ExecuteInsideSession(() => { - var firstDateTimeOffset = TryMoveToLocalTimeZone(TryMoveToLocalTimeZone(FirstDateTime)); - WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Offset==firstDateTimeOffset.Offset, c => c.Id); - }); - } - - private void WherePrivate(Expression> whereExpression, Expression> orderByExpression) - where T : Entity - { - var compiledWhereExpression = whereExpression.Compile(); - var compiledOrderByExpression = orderByExpression.Compile(); - - var whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression).ToArray(); - var whereByServer = Query.All().Where(whereExpression).OrderBy(orderByExpression).ToArray(); - - Assert.That(whereLocal.Length, Is.Not.EqualTo(0)); - Assert.That(whereByServer.Length, Is.Not.EqualTo(0)); - Assert.IsTrue(whereLocal.SequenceEqual(whereByServer)); - - whereByServer = Query.All().Where(whereExpression).OrderByDescending(orderByExpression).ToArray(); - whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression).ToArray(); - - Assert.That(whereLocal.Length, Is.Not.EqualTo(0)); - Assert.That(whereByServer.Length, Is.Not.EqualTo(0)); - Assert.IsFalse(whereLocal.SequenceEqual(whereByServer)); - } - } +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.DateTimeOffsets +{ + public class WhereTest : DateTimeOffsetBaseTest + { + [Test] + public void Test01() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset==firstDateTimeOffset, c => c.Id); + }); + } + + [Test] + public void Test02() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Hour==firstDateTimeOffset.Hour, c => c.Id); + }); + } + + [Test] + public void Test03() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Second==firstDateTimeOffset.Second, c => c.Id); + }); + } + + [Test] + public void Test04() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Offset==firstDateTimeOffset.Offset, c => c.Id); + }); + } + + [Test] + public void Test05() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Offset.Hours==firstDateTimeOffset.Offset.Hours, c => c.Id); + }); + } + + [Test] + public void Test06() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Offset.Minutes==firstDateTimeOffset.Offset.Minutes, c => c.Id); + }); + } + + [Test] + public void Test07() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset==firstMillisecondDateTimeOffset, c => c.Id); + }); + } + + [Test] + public void Test08() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour, c => c.Id); + }); + } + + [Test] + public void Test09() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond, c => c.Id); + }); + } + + [Test] + public void Test10() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset, c => c.Id); + }); + } + + [Test] + public void Test11() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset==firstMillisecondDateTimeOffset, c => c.Id); + }); + } + + [Test] + public void Test12() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Hour==firstMillisecondDateTimeOffset.Hour, c => c.Id); + }); + } + + [Test] + public void Test13() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Millisecond==firstMillisecondDateTimeOffset.Millisecond, c => c.Id); + }); + } + + [Test] + public void Test14() + { + ExecuteInsideSession(() => { + var firstMillisecondDateTimeOffset = TryMoveToLocalTimeZone(FirstMillisecondDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.Offset==firstMillisecondDateTimeOffset.Offset, c => c.Id); + }); + } + + [Test] + public void Test15() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset==firstDateTimeOffset, c => c.Id); + }); + } + + [Test] + public void Test16() + { + ExecuteInsideSession(() => { + WherePrivate(c => c.DateTimeOffset==null, c => c.Id); + }); + } + + [Test] + public void Test17() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(FirstDateTimeOffset); + WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Hour==firstDateTimeOffset.Hour, c => c.Id); + }); + } + + [Test] + public void Test18() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(TryMoveToLocalTimeZone(FirstDateTime)); + WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Second==firstDateTimeOffset.Second, c => c.Id); + }); + } + + [Test] + public void Test19() + { + ExecuteInsideSession(() => { + var firstDateTimeOffset = TryMoveToLocalTimeZone(TryMoveToLocalTimeZone(FirstDateTime)); + WherePrivate(c => c.DateTimeOffset.HasValue && c.DateTimeOffset.Value.Offset==firstDateTimeOffset.Offset, c => c.Id); + }); + } + + private void WherePrivate(Expression> whereExpression, Expression> orderByExpression) + where T : Entity + { + var compiledWhereExpression = whereExpression.Compile(); + var compiledOrderByExpression = orderByExpression.Compile(); + + var whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression).ToArray(); + var whereByServer = Query.All().Where(whereExpression).OrderBy(orderByExpression).ToArray(); + + Assert.That(whereLocal.Length, Is.Not.EqualTo(0)); + Assert.That(whereByServer.Length, Is.Not.EqualTo(0)); + Assert.IsTrue(whereLocal.SequenceEqual(whereByServer)); + + whereByServer = Query.All().Where(whereExpression).OrderByDescending(orderByExpression).ToArray(); + whereLocal = Query.All().ToArray().Where(compiledWhereExpression).OrderBy(compiledOrderByExpression).ToArray(); + + Assert.That(whereLocal.Length, Is.Not.EqualTo(0)); + Assert.That(whereByServer.Length, Is.Not.EqualTo(0)); + Assert.IsFalse(whereLocal.SequenceEqual(whereByServer)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffsetBaseTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffsetBaseTest.cs index 5f96f221b8..1a2ea40f79 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffsetBaseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffsetBaseTest.cs @@ -1,156 +1,156 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.09.15 - -using System; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset -{ - public abstract class DateTimeOffsetBaseTest : BaseTest - { - protected static readonly DateTime FirstDateTime = new DateTime(2016, 01, 02, 03, 04, 05, DateTimeKind.Unspecified); - protected static readonly DateTime SecondDateTime = new DateTime(2019, 11, 23, 22, 58, 57, DateTimeKind.Unspecified); - protected static readonly DateTime WrongDateTime = new DateTime(2017, 02, 03, 04, 05, 06, DateTimeKind.Unspecified); - protected static readonly DateTime NullableDateTime = SecondDateTime; - - protected static readonly DateTime FirstMillisecondDateTime = FirstDateTime.AddMilliseconds(321); - protected static readonly DateTime SecondMillisecondDateTime = SecondDateTime.AddMilliseconds(987); - protected static readonly DateTime WrongMillisecondDateTime = WrongDateTime.AddMilliseconds(654); - - protected static readonly TimeSpan FirstOffset = new TimeSpan(2, 45, 0); // +02:45 - protected static readonly TimeSpan SecondOffset = new TimeSpan(-11, 10, 0); // -11:10 - protected static readonly TimeSpan WrongOffset = new TimeSpan(4, 35, 0); // +04:35 - - protected static readonly DateTimeOffset FirstDateTimeOffset = new DateTimeOffset(FirstDateTime, FirstOffset); - protected static readonly DateTimeOffset SecondDateTimeOffset = new DateTimeOffset(SecondDateTime, SecondOffset); - protected static readonly DateTimeOffset WrongDateTimeOffset = new DateTimeOffset(WrongDateTime, WrongOffset); - protected static readonly DateTimeOffset NullableDateTimeOffset = SecondDateTimeOffset; - - protected static readonly DateTimeOffset FirstMillisecondDateTimeOffset = new DateTimeOffset(FirstMillisecondDateTime, FirstOffset); - protected static readonly DateTimeOffset SecondMillisecondDateTimeOffset = new DateTimeOffset(SecondMillisecondDateTime, SecondOffset); - protected static readonly DateTimeOffset WrongMillisecondDateTimeOffset = new DateTimeOffset(WrongMillisecondDateTime, WrongOffset); - - protected override void RegisterTypes(DomainConfiguration configuration) - { - configuration.Types.Register(typeof (SingleDateTimeOffsetEntity)); - configuration.Types.Register(typeof (DateTimeOffsetEntity)); - configuration.Types.Register(typeof (MillisecondDateTimeOffsetEntity)); - configuration.Types.Register(typeof (NullableDateTimeOffsetEntity)); - configuration.Types.Register(typeof (DateTimeEntity)); - } - - protected override void InitializeCustomSettings(DomainConfiguration configuration) - { - var providerInfo = StorageProviderInfo.Instance.Info; - if (providerInfo.ProviderName==WellKnown.Provider.PostgreSql) { - var localZone = DateTimeOffset.Now.ToLocalTime().Offset; - var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); - configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); - } - } - - protected override void CheckRequirements() - { - Require.AnyFeatureSupported(ProviderFeatures.DateTimeOffset | ProviderFeatures.DateTimeOffsetEmulation); - } - - protected override void PopulateEntities(Session session) - { - new SingleDateTimeOffsetEntity { - DateTimeOffset = FirstDateTimeOffset, - MillisecondDateTimeOffset = FirstMillisecondDateTimeOffset, - NullableDateTimeOffset = NullableDateTimeOffset - }; - - DateTime[] dateTimes = new[] { - FirstDateTime, - FirstDateTime, - FirstDateTime.Date, - SecondDateTime, - SecondDateTime.Date, - new DateTime(FirstDateTime.Year, FirstDateTime.Month, FirstDateTime.Day, FirstDateTime.Hour, FirstDateTime.Minute, 0), - new DateTime(FirstDateTime.Ticks, DateTimeKind.Unspecified), - FirstDateTime.Add(new TimeSpan(987, 23, 34, 45)),FirstDateTime.AddYears(1),FirstDateTime.AddYears(-2), - FirstDateTime.AddMonths(44), - FirstDateTime.AddMonths(-55), - SecondDateTime.AddHours(5), - SecondDateTime.AddHours(-15), - SecondDateTime.AddMinutes(59), - SecondDateTime.AddMinutes(-49), - SecondDateTime.AddSeconds(57), - SecondDateTime.AddSeconds(-5), - }; - - DateTime[] dateTimesWithMilliseconds = new[] { - FirstMillisecondDateTime, - FirstMillisecondDateTime, - FirstMillisecondDateTime.Date, - SecondMillisecondDateTime, - SecondMillisecondDateTime.Date, - new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, 0), - new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, FirstMillisecondDateTime.Second, 0), - new DateTime(FirstMillisecondDateTime.Ticks, DateTimeKind.Unspecified), - FirstMillisecondDateTime.Add(new TimeSpan(987, 23, 34, 45)), - }; - - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(FirstOffset) }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(SecondOffset) }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(TimeSpan.Zero) }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.Date }; - new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset }; - new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.ToOffset(FirstOffset) }; - new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.ToOffset(SecondOffset) }; - new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.Date }; - new DateTimeOffsetEntity { DateTimeOffset = FirstDateTime }; - new DateTimeOffsetEntity { DateTimeOffset = new DateTimeOffset(FirstDateTime, TimeSpan.Zero) }; - - var index = 0; - foreach (var dateTime in dateTimes) - new DateTimeOffsetEntity(dateTime, ++index % 3==0 ? FirstOffset : SecondOffset); - - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(FirstOffset) }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(SecondOffset) }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero) }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.Date }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.ToOffset(FirstOffset) }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.ToOffset(SecondOffset) }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.Date }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondDateTime }; - new MillisecondDateTimeOffsetEntity { DateTimeOffset = new DateTimeOffset(SecondDateTime, TimeSpan.Zero) }; - - index = 0; - foreach (var dateTime in dateTimesWithMilliseconds) - new MillisecondDateTimeOffsetEntity(dateTime, ++index % 3==0 ? FirstOffset : SecondOffset); - - var dateTimeOffset = FirstMillisecondDateTimeOffset.AddYears(10); - for (var i = 0; i < 1000; ++i) - new MillisecondDateTimeOffsetEntity { DateTimeOffset = dateTimeOffset.AddMilliseconds(i) }; - - foreach (var dateTimeEntity in Query.All()) - new NullableDateTimeOffsetEntity(dateTimeEntity); - - new NullableDateTimeOffsetEntity { DateTimeOffset = null }; - new NullableDateTimeOffsetEntity { DateTimeOffset = null }; - } - - protected DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) - { - if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) - return dateTimeOffset.ToLocalTime(); - return dateTimeOffset; - } - } - - +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.09.15 + +using System; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset +{ + public abstract class DateTimeOffsetBaseTest : BaseTest + { + protected static readonly DateTime FirstDateTime = new DateTime(2016, 01, 02, 03, 04, 05, DateTimeKind.Unspecified); + protected static readonly DateTime SecondDateTime = new DateTime(2019, 11, 23, 22, 58, 57, DateTimeKind.Unspecified); + protected static readonly DateTime WrongDateTime = new DateTime(2017, 02, 03, 04, 05, 06, DateTimeKind.Unspecified); + protected static readonly DateTime NullableDateTime = SecondDateTime; + + protected static readonly DateTime FirstMillisecondDateTime = FirstDateTime.AddMilliseconds(321); + protected static readonly DateTime SecondMillisecondDateTime = SecondDateTime.AddMilliseconds(987); + protected static readonly DateTime WrongMillisecondDateTime = WrongDateTime.AddMilliseconds(654); + + protected static readonly TimeSpan FirstOffset = new TimeSpan(2, 45, 0); // +02:45 + protected static readonly TimeSpan SecondOffset = new TimeSpan(-11, 10, 0); // -11:10 + protected static readonly TimeSpan WrongOffset = new TimeSpan(4, 35, 0); // +04:35 + + protected static readonly DateTimeOffset FirstDateTimeOffset = new DateTimeOffset(FirstDateTime, FirstOffset); + protected static readonly DateTimeOffset SecondDateTimeOffset = new DateTimeOffset(SecondDateTime, SecondOffset); + protected static readonly DateTimeOffset WrongDateTimeOffset = new DateTimeOffset(WrongDateTime, WrongOffset); + protected static readonly DateTimeOffset NullableDateTimeOffset = SecondDateTimeOffset; + + protected static readonly DateTimeOffset FirstMillisecondDateTimeOffset = new DateTimeOffset(FirstMillisecondDateTime, FirstOffset); + protected static readonly DateTimeOffset SecondMillisecondDateTimeOffset = new DateTimeOffset(SecondMillisecondDateTime, SecondOffset); + protected static readonly DateTimeOffset WrongMillisecondDateTimeOffset = new DateTimeOffset(WrongMillisecondDateTime, WrongOffset); + + protected override void RegisterTypes(DomainConfiguration configuration) + { + configuration.Types.Register(typeof (SingleDateTimeOffsetEntity)); + configuration.Types.Register(typeof (DateTimeOffsetEntity)); + configuration.Types.Register(typeof (MillisecondDateTimeOffsetEntity)); + configuration.Types.Register(typeof (NullableDateTimeOffsetEntity)); + configuration.Types.Register(typeof (DateTimeEntity)); + } + + protected override void InitializeCustomSettings(DomainConfiguration configuration) + { + var providerInfo = StorageProviderInfo.Instance.Info; + if (providerInfo.ProviderName==WellKnown.Provider.PostgreSql) { + var localZone = DateTimeOffset.Now.ToLocalTime().Offset; + var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm"); + configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString); + } + } + + protected override void CheckRequirements() + { + Require.AnyFeatureSupported(ProviderFeatures.DateTimeOffset | ProviderFeatures.DateTimeOffsetEmulation); + } + + protected override void PopulateEntities(Session session) + { + new SingleDateTimeOffsetEntity { + DateTimeOffset = FirstDateTimeOffset, + MillisecondDateTimeOffset = FirstMillisecondDateTimeOffset, + NullableDateTimeOffset = NullableDateTimeOffset + }; + + DateTime[] dateTimes = new[] { + FirstDateTime, + FirstDateTime, + FirstDateTime.Date, + SecondDateTime, + SecondDateTime.Date, + new DateTime(FirstDateTime.Year, FirstDateTime.Month, FirstDateTime.Day, FirstDateTime.Hour, FirstDateTime.Minute, 0), + new DateTime(FirstDateTime.Ticks, DateTimeKind.Unspecified), + FirstDateTime.Add(new TimeSpan(987, 23, 34, 45)),FirstDateTime.AddYears(1),FirstDateTime.AddYears(-2), + FirstDateTime.AddMonths(44), + FirstDateTime.AddMonths(-55), + SecondDateTime.AddHours(5), + SecondDateTime.AddHours(-15), + SecondDateTime.AddMinutes(59), + SecondDateTime.AddMinutes(-49), + SecondDateTime.AddSeconds(57), + SecondDateTime.AddSeconds(-5), + }; + + DateTime[] dateTimesWithMilliseconds = new[] { + FirstMillisecondDateTime, + FirstMillisecondDateTime, + FirstMillisecondDateTime.Date, + SecondMillisecondDateTime, + SecondMillisecondDateTime.Date, + new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, 0), + new DateTime(FirstMillisecondDateTime.Year, FirstMillisecondDateTime.Month, FirstMillisecondDateTime.Day, FirstMillisecondDateTime.Hour, FirstMillisecondDateTime.Minute, FirstMillisecondDateTime.Second, 0), + new DateTime(FirstMillisecondDateTime.Ticks, DateTimeKind.Unspecified), + FirstMillisecondDateTime.Add(new TimeSpan(987, 23, 34, 45)), + }; + + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(FirstOffset) }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(SecondOffset) }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.ToOffset(TimeSpan.Zero) }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTimeOffset.Date }; + new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset }; + new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.ToOffset(FirstOffset) }; + new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.ToOffset(SecondOffset) }; + new DateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset.Date }; + new DateTimeOffsetEntity { DateTimeOffset = FirstDateTime }; + new DateTimeOffsetEntity { DateTimeOffset = new DateTimeOffset(FirstDateTime, TimeSpan.Zero) }; + + var index = 0; + foreach (var dateTime in dateTimes) + new DateTimeOffsetEntity(dateTime, ++index % 3==0 ? FirstOffset : SecondOffset); + + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(FirstOffset) }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(SecondOffset) }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.ToOffset(TimeSpan.Zero) }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = FirstMillisecondDateTimeOffset.Date }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.ToOffset(FirstOffset) }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.ToOffset(SecondOffset) }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondMillisecondDateTimeOffset.Date }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondDateTimeOffset }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = SecondDateTime }; + new MillisecondDateTimeOffsetEntity { DateTimeOffset = new DateTimeOffset(SecondDateTime, TimeSpan.Zero) }; + + index = 0; + foreach (var dateTime in dateTimesWithMilliseconds) + new MillisecondDateTimeOffsetEntity(dateTime, ++index % 3==0 ? FirstOffset : SecondOffset); + + var dateTimeOffset = FirstMillisecondDateTimeOffset.AddYears(10); + for (var i = 0; i < 1000; ++i) + new MillisecondDateTimeOffsetEntity { DateTimeOffset = dateTimeOffset.AddMilliseconds(i) }; + + foreach (var dateTimeEntity in Query.All()) + new NullableDateTimeOffsetEntity(dateTimeEntity); + + new NullableDateTimeOffsetEntity { DateTimeOffset = null }; + new NullableDateTimeOffsetEntity { DateTimeOffset = null }; + } + + protected DateTimeOffset TryMoveToLocalTimeZone(DateTimeOffset dateTimeOffset) + { + if (ProviderInfo.ProviderName==WellKnown.Provider.PostgreSql) + return dateTimeOffset.ToLocalTime(); + return dateTimeOffset; + } + } + + } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/JoinResult{T}.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/JoinResult{T}.cs index 1122836330..ec9f24ce1e 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/JoinResult{T}.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/JoinResult{T}.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset -{ - public class JoinResult - { - public long LeftId { get; set; } - public long RightId { get; set; } - public T LeftDateTime { get; set; } - public T RightDateTime { get; set; } - - public override bool Equals(object obj) - { - var equalTo = obj as JoinResult; - if (equalTo==null) - return false; - return LeftId==equalTo.LeftId && - RightId==equalTo.RightId && - LeftDateTime.Equals(equalTo.LeftDateTime) && RightDateTime.Equals(equalTo.RightDateTime); - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset +{ + public class JoinResult + { + public long LeftId { get; set; } + public long RightId { get; set; } + public T LeftDateTime { get; set; } + public T RightDateTime { get; set; } + + public override bool Equals(object obj) + { + var equalTo = obj as JoinResult; + if (equalTo==null) + return false; + return LeftId==equalTo.LeftId && + RightId==equalTo.RightId && + LeftDateTime.Equals(equalTo.LeftDateTime) && RightDateTime.Equals(equalTo.RightDateTime); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/Model.cs b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/Model.cs index 8d9bf8ee4a..e183016ded 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/Model.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/Model.cs @@ -1,147 +1,147 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Groznov -// Created: 2016.08.01 - -using System; - -namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model -{ - [HierarchyRoot] - public class SingleDateTimeEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime DateTime { get; set; } - - [Field] - public DateTime MillisecondDateTime { get; set; } - - [Field] - public DateTime? NullableDateTime { get; set; } - } - - [HierarchyRoot] - public class SingleDateTimeOffsetEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTimeOffset DateTimeOffset { get; set; } - - [Field] - public DateTimeOffset MillisecondDateTimeOffset { get; set; } - - [Field] - public DateTimeOffset? NullableDateTimeOffset { get; set; } - } - - [HierarchyRoot] - public class DateTimeEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime DateTime { get; set; } - } - - [HierarchyRoot] - public class MillisecondDateTimeEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime DateTime { get; set; } - - public MillisecondDateTimeEntity() - { - } - - public MillisecondDateTimeEntity(DateTimeEntity dateTimeEntity, int milliseconds) - { - DateTime = dateTimeEntity.DateTime.AddMilliseconds(milliseconds); - } - } - - [HierarchyRoot] - public class NullableDateTimeEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTime? DateTime { get; set; } - - public NullableDateTimeEntity() - { - } - - public NullableDateTimeEntity(DateTimeEntity dateTimeEntity) - { - DateTime = dateTimeEntity.DateTime; - } - } - - [HierarchyRoot] - public class DateTimeOffsetEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTimeOffset DateTimeOffset { get; set; } - - public DateTimeOffsetEntity() - { - } - - public DateTimeOffsetEntity(DateTime dateTime, TimeSpan offset) - { - DateTimeOffset = new DateTimeOffset(dateTime, offset); - } - } - - [HierarchyRoot] - public class MillisecondDateTimeOffsetEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTimeOffset DateTimeOffset { get; set; } - - public MillisecondDateTimeOffsetEntity() - { - } - - public MillisecondDateTimeOffsetEntity(DateTime dateTimeEntity, TimeSpan offset) - { - DateTimeOffset = new DateTimeOffset(dateTimeEntity, offset); - } - } - - [HierarchyRoot] - public class NullableDateTimeOffsetEntity : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public DateTimeOffset? DateTimeOffset { get; set; } - - public NullableDateTimeOffsetEntity() - { - } - - public NullableDateTimeOffsetEntity(DateTimeOffsetEntity dateTimeOffsetEntity) - { - DateTimeOffset = dateTimeOffsetEntity.DateTimeOffset; - } - } -} +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Groznov +// Created: 2016.08.01 + +using System; + +namespace Xtensive.Orm.Tests.Linq.DateTimeAndDateTimeOffset.Model +{ + [HierarchyRoot] + public class SingleDateTimeEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime DateTime { get; set; } + + [Field] + public DateTime MillisecondDateTime { get; set; } + + [Field] + public DateTime? NullableDateTime { get; set; } + } + + [HierarchyRoot] + public class SingleDateTimeOffsetEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTimeOffset DateTimeOffset { get; set; } + + [Field] + public DateTimeOffset MillisecondDateTimeOffset { get; set; } + + [Field] + public DateTimeOffset? NullableDateTimeOffset { get; set; } + } + + [HierarchyRoot] + public class DateTimeEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime DateTime { get; set; } + } + + [HierarchyRoot] + public class MillisecondDateTimeEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime DateTime { get; set; } + + public MillisecondDateTimeEntity() + { + } + + public MillisecondDateTimeEntity(DateTimeEntity dateTimeEntity, int milliseconds) + { + DateTime = dateTimeEntity.DateTime.AddMilliseconds(milliseconds); + } + } + + [HierarchyRoot] + public class NullableDateTimeEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTime? DateTime { get; set; } + + public NullableDateTimeEntity() + { + } + + public NullableDateTimeEntity(DateTimeEntity dateTimeEntity) + { + DateTime = dateTimeEntity.DateTime; + } + } + + [HierarchyRoot] + public class DateTimeOffsetEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTimeOffset DateTimeOffset { get; set; } + + public DateTimeOffsetEntity() + { + } + + public DateTimeOffsetEntity(DateTime dateTime, TimeSpan offset) + { + DateTimeOffset = new DateTimeOffset(dateTime, offset); + } + } + + [HierarchyRoot] + public class MillisecondDateTimeOffsetEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTimeOffset DateTimeOffset { get; set; } + + public MillisecondDateTimeOffsetEntity() + { + } + + public MillisecondDateTimeOffsetEntity(DateTime dateTimeEntity, TimeSpan offset) + { + DateTimeOffset = new DateTimeOffset(dateTimeEntity, offset); + } + } + + [HierarchyRoot] + public class NullableDateTimeOffsetEntity : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public DateTimeOffset? DateTimeOffset { get; set; } + + public NullableDateTimeOffsetEntity() + { + } + + public NullableDateTimeOffsetEntity(DateTimeOffsetEntity dateTimeOffsetEntity) + { + DateTimeOffset = dateTimeOffsetEntity.DateTimeOffset; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/DistinctTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DistinctTest.cs index 00dd651d78..b9b29dfe7b 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DistinctTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DistinctTest.cs @@ -1,390 +1,390 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.04 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class DistinctTest : ChinookDOModelTest - { - [Test] - public void BlobTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All().Select(c => c.Bytes).Distinct(); - var list = result.ToList(); - } - - [Test] - public void OrderBy2Test() - { - var result = Session.Query.All() - .OrderBy(c => c.CompanyName) - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c); - var expected = Session.Query.All() - .ToList() - .OrderBy(c => c.CompanyName) - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c); - Assert.IsTrue(expected.SequenceEqual(result)); - QueryDumper.Dump(result); - } - - [Test] - public void DefaultTest() - { - var result = Session.Query.All().Distinct(); - var expected = Session.Query.All().ToList().Distinct(); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void ScalarTest() - { - var result = Session.Query.All() - .Select(c => c.Address.City) - .Distinct(); - var expected = Session.Query.All() - .ToList() - .Select(c => c.Address.City) - .Distinct(); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void OrderByTest() - { - var result = Session.Query.All() - .OrderBy(c => c.CustomerId) - .Select(c => c.Address.City) - .Distinct() - .ToList(); - var expected = Session.Query.All() - .ToList() - .OrderBy(c => c.CustomerId) - .Select(c => c.Address.City) - .Distinct(); - Assert.AreEqual(0, expected.Except(result).Count()); - Assert.Greater(result.ToList().Count, 0); - } - - - [Test] - public void DistinctOrderByTest() - { - var result = Session.Query.All() - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c); - var expected = Session.Query.All() - .ToList() - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c); - Assert.IsTrue(expected.SequenceEqual(result)); - QueryDumper.Dump(result); - } - - [Test] - public void CountTest() - { - var result = Session.Query.All() - .Distinct() - .Count(); - var expected = Session.Query.All() - .ToList() - .Distinct() - .Count(); - Assert.AreEqual(expected, result); - } - - [Test] - public void SelectDistinctCountTest() - { - var result = Session.Query.All() - .Select(c => c.Address.City) - .Distinct() - .Count(); - var expected = Session.Query.All() - .ToList() - .Select(c => c.Address.City) - .Distinct() - .Count(); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void NestedSelectDistinctCountTest() - { - var result = Session.Query.All() - .Select(c => c.Address) - .Select(a => a.City) - .Distinct() - .Count(); - var expected = Session.Query.All() - .ToList() - .Select(c => c.Address) - .Select(a => a.City) - .Distinct() - .Count(); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void CountPredicateTest() - { - var result = Session.Query.All() - .Distinct() - .Count(c => c.FirstName=="Leonie"); - var expected = Session.Query.All() - .ToList() - .Distinct() - .Count(c => c.FirstName=="Leonie"); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void SumWithArgTest() - { - var result = Session.Query.All() - .Distinct() - .Sum(o => o.InvoiceId); - var expected = Session.Query.All() - .ToList() - .Distinct() - .Sum(o => o.InvoiceId); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void SumTest() - { - var result = Session.Query.All() - .Select(o => o.InvoiceId) - .Distinct() - .Sum(); - var expected = Session.Query.All() - .ToList() - .Select(o => o.InvoiceId) - .Distinct() - .Sum(); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void TakeTest() - { - // NOTE: Distinct must be forced to apply after top has been computed - var result = Session.Query.All() - .OrderBy(o => o.InvoiceId) - .Take(5) - .Distinct() - .OrderBy(o => o.InvoiceId) - .ToList(); - var expected = Session.Query.All() - .ToList() - .OrderBy(o => o.InvoiceId) - .Take(5) - .Distinct() - .OrderBy(o => o.InvoiceId); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void TakeTakeTest() - { - var result = Session.Query.All() - .OrderBy(o => o.InvoiceId) - .Take(2) - .Take(1); - var expected = Session.Query.All() - .ToList() - .OrderBy(o => o.InvoiceId) - .Take(2) - .Take(1); - var list = result.ToList(); - Assert.IsTrue(expected.SequenceEqual(list)); - Assert.Greater(list.Count, 0); - } - - [Test] - public void DistinctTakeTest1() - { - var result = Session.Query.All().Select(c => c.Key).Distinct().Take(5); - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void DistinctTakeTest() - { - // NOTE: Top must be forced to apply after distinct has been computed - var result = Session.Query.All() - .Distinct() - .OrderBy(o => o.InvoiceId) - .Take(5); - var expected = Session.Query.All() - .ToList() - .Distinct() - .OrderBy(o => o.InvoiceId) - .Take(5); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void TakeCountTest() - { - var result = Session.Query.All() - .Distinct() - .Take(5) - .Count(); - var expected = Session.Query.All() - .ToList() - .Distinct() - .Take(5) - .Count(); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void TakeDistinctCountTest() - { - var result = Session.Query.All() - .Take(5) - .Distinct() - .Count(); - var expected = Session.Query.All() - .ToList() - .Take(5) - .Distinct() - .Count(); - Assert.AreEqual(expected, result); - Assert.Greater(result, 0); - } - - [Test] - public void SkipTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var result = Session.Query.All() - .OrderBy(o => o.InvoiceDate) - .Skip(5) - .Select(o => o.InvoiceDate) - .Distinct().OrderBy(d => d); - var expected = Session.Query.All() - .ToList() - .OrderBy(o => o.InvoiceDate) - .Skip(5) - .Select(o => o.InvoiceDate) - .Distinct().OrderBy(d => d); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void DistinctSkipTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var result = Session.Query.All() - .Distinct() - .OrderBy(c => c.LastName) - .Skip(5); - var expected = Session.Query.All() - .ToList() - .Distinct() - .OrderBy(c => c.LastName) - .Skip(5); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void SkipTakeTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var result = Session.Query.All() - .OrderBy(o => o.InvoiceDate) - .Skip(5) - .Take(10) - .Select(o => o.InvoiceDate) - .Distinct() - .OrderBy(d => d); - var expected = Session.Query.All() - .ToList() - .OrderBy(o => o.InvoiceDate) - .Skip(5) - .Take(10) - .Select(o => o.InvoiceDate) - .Distinct() - .OrderBy(d => d); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void TakeSkipTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var result = Session.Query.All() - .OrderBy(o => o.InvoiceDate) - .Take(10) - .Skip(5) - .Select(o => o.InvoiceDate) - .Distinct() - .OrderBy(d => d); - var expected = Session.Query.All() - .ToList() - .OrderBy(o => o.InvoiceDate) - .Take(10) - .Skip(5) - .Select(o => o.InvoiceDate) - .Distinct() - .OrderBy(d => d); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void DistinctSkipTakeTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var result = Session.Query.All() - .Select(c => c.FirstName) - .Distinct() - .OrderBy(c => c) - .Skip(5) - .Take(10); - var expected = Session.Query.All() - .ToList() - .Select(c => c.FirstName) - .Distinct() - .OrderBy(c => c) - .Skip(5) - .Take(10); - Assert.IsTrue(expected.SequenceEqual(result)); - Assert.Greater(result.ToList().Count, 0); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.04 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class DistinctTest : ChinookDOModelTest + { + [Test] + public void BlobTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All().Select(c => c.Bytes).Distinct(); + var list = result.ToList(); + } + + [Test] + public void OrderBy2Test() + { + var result = Session.Query.All() + .OrderBy(c => c.CompanyName) + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c); + var expected = Session.Query.All() + .ToList() + .OrderBy(c => c.CompanyName) + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c); + Assert.IsTrue(expected.SequenceEqual(result)); + QueryDumper.Dump(result); + } + + [Test] + public void DefaultTest() + { + var result = Session.Query.All().Distinct(); + var expected = Session.Query.All().ToList().Distinct(); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void ScalarTest() + { + var result = Session.Query.All() + .Select(c => c.Address.City) + .Distinct(); + var expected = Session.Query.All() + .ToList() + .Select(c => c.Address.City) + .Distinct(); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void OrderByTest() + { + var result = Session.Query.All() + .OrderBy(c => c.CustomerId) + .Select(c => c.Address.City) + .Distinct() + .ToList(); + var expected = Session.Query.All() + .ToList() + .OrderBy(c => c.CustomerId) + .Select(c => c.Address.City) + .Distinct(); + Assert.AreEqual(0, expected.Except(result).Count()); + Assert.Greater(result.ToList().Count, 0); + } + + + [Test] + public void DistinctOrderByTest() + { + var result = Session.Query.All() + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c); + var expected = Session.Query.All() + .ToList() + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c); + Assert.IsTrue(expected.SequenceEqual(result)); + QueryDumper.Dump(result); + } + + [Test] + public void CountTest() + { + var result = Session.Query.All() + .Distinct() + .Count(); + var expected = Session.Query.All() + .ToList() + .Distinct() + .Count(); + Assert.AreEqual(expected, result); + } + + [Test] + public void SelectDistinctCountTest() + { + var result = Session.Query.All() + .Select(c => c.Address.City) + .Distinct() + .Count(); + var expected = Session.Query.All() + .ToList() + .Select(c => c.Address.City) + .Distinct() + .Count(); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void NestedSelectDistinctCountTest() + { + var result = Session.Query.All() + .Select(c => c.Address) + .Select(a => a.City) + .Distinct() + .Count(); + var expected = Session.Query.All() + .ToList() + .Select(c => c.Address) + .Select(a => a.City) + .Distinct() + .Count(); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void CountPredicateTest() + { + var result = Session.Query.All() + .Distinct() + .Count(c => c.FirstName=="Leonie"); + var expected = Session.Query.All() + .ToList() + .Distinct() + .Count(c => c.FirstName=="Leonie"); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void SumWithArgTest() + { + var result = Session.Query.All() + .Distinct() + .Sum(o => o.InvoiceId); + var expected = Session.Query.All() + .ToList() + .Distinct() + .Sum(o => o.InvoiceId); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void SumTest() + { + var result = Session.Query.All() + .Select(o => o.InvoiceId) + .Distinct() + .Sum(); + var expected = Session.Query.All() + .ToList() + .Select(o => o.InvoiceId) + .Distinct() + .Sum(); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void TakeTest() + { + // NOTE: Distinct must be forced to apply after top has been computed + var result = Session.Query.All() + .OrderBy(o => o.InvoiceId) + .Take(5) + .Distinct() + .OrderBy(o => o.InvoiceId) + .ToList(); + var expected = Session.Query.All() + .ToList() + .OrderBy(o => o.InvoiceId) + .Take(5) + .Distinct() + .OrderBy(o => o.InvoiceId); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void TakeTakeTest() + { + var result = Session.Query.All() + .OrderBy(o => o.InvoiceId) + .Take(2) + .Take(1); + var expected = Session.Query.All() + .ToList() + .OrderBy(o => o.InvoiceId) + .Take(2) + .Take(1); + var list = result.ToList(); + Assert.IsTrue(expected.SequenceEqual(list)); + Assert.Greater(list.Count, 0); + } + + [Test] + public void DistinctTakeTest1() + { + var result = Session.Query.All().Select(c => c.Key).Distinct().Take(5); + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void DistinctTakeTest() + { + // NOTE: Top must be forced to apply after distinct has been computed + var result = Session.Query.All() + .Distinct() + .OrderBy(o => o.InvoiceId) + .Take(5); + var expected = Session.Query.All() + .ToList() + .Distinct() + .OrderBy(o => o.InvoiceId) + .Take(5); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void TakeCountTest() + { + var result = Session.Query.All() + .Distinct() + .Take(5) + .Count(); + var expected = Session.Query.All() + .ToList() + .Distinct() + .Take(5) + .Count(); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void TakeDistinctCountTest() + { + var result = Session.Query.All() + .Take(5) + .Distinct() + .Count(); + var expected = Session.Query.All() + .ToList() + .Take(5) + .Distinct() + .Count(); + Assert.AreEqual(expected, result); + Assert.Greater(result, 0); + } + + [Test] + public void SkipTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var result = Session.Query.All() + .OrderBy(o => o.InvoiceDate) + .Skip(5) + .Select(o => o.InvoiceDate) + .Distinct().OrderBy(d => d); + var expected = Session.Query.All() + .ToList() + .OrderBy(o => o.InvoiceDate) + .Skip(5) + .Select(o => o.InvoiceDate) + .Distinct().OrderBy(d => d); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void DistinctSkipTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var result = Session.Query.All() + .Distinct() + .OrderBy(c => c.LastName) + .Skip(5); + var expected = Session.Query.All() + .ToList() + .Distinct() + .OrderBy(c => c.LastName) + .Skip(5); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void SkipTakeTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var result = Session.Query.All() + .OrderBy(o => o.InvoiceDate) + .Skip(5) + .Take(10) + .Select(o => o.InvoiceDate) + .Distinct() + .OrderBy(d => d); + var expected = Session.Query.All() + .ToList() + .OrderBy(o => o.InvoiceDate) + .Skip(5) + .Take(10) + .Select(o => o.InvoiceDate) + .Distinct() + .OrderBy(d => d); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void TakeSkipTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var result = Session.Query.All() + .OrderBy(o => o.InvoiceDate) + .Take(10) + .Skip(5) + .Select(o => o.InvoiceDate) + .Distinct() + .OrderBy(d => d); + var expected = Session.Query.All() + .ToList() + .OrderBy(o => o.InvoiceDate) + .Take(10) + .Skip(5) + .Select(o => o.InvoiceDate) + .Distinct() + .OrderBy(d => d); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void DistinctSkipTakeTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var result = Session.Query.All() + .Select(c => c.FirstName) + .Distinct() + .OrderBy(c => c) + .Skip(5) + .Take(10); + var expected = Session.Query.All() + .ToList() + .Select(c => c.FirstName) + .Distinct() + .OrderBy(c => c) + .Skip(5) + .Take(10); + Assert.IsTrue(expected.SequenceEqual(result)); + Assert.Greater(result.ToList().Count, 0); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DoubleAggregateToStructTest.cs b/Orm/Xtensive.Orm.Tests/Linq/DoubleAggregateToStructTest.cs index 287e0f48e3..165b463657 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DoubleAggregateToStructTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DoubleAggregateToStructTest.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.04.26 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.DoubleAggregateToStructTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace DoubleAggregateToStructTestModel - { - public struct GroupInfo - { - public int Key { get; set; } - - public int Sum1 { get; set; } - - public int Sum2 { get; set; } - } - - [HierarchyRoot] - public class Aggregated : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public int GroupId { get; private set; } - - [Field] - public int Value1 { get; private set; } - - [Field] - public int Value2 { get; private set; } - - public Aggregated(int value1, int value2) - { - GroupId = 0; - Value1 = value1; - Value2 = value2; - } - } - } - - public class DoubleAggregateToStructTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Aggregated)); - return config; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Aggregated(1, 2); - new Aggregated(2, 3); - tx.Complete(); - } - } - - [Test] - public void SumTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var q = session.Query.All().GroupBy(a => a.GroupId) - .Select(g => new GroupInfo { - Key = g.Key, - Sum1 = g.Sum(x => x.Value1), - Sum2 = g.Sum(x => x.Value2) - }); - var result = q.ToList().Single(); - Assert.That(result.Sum1, Is.EqualTo(3)); - Assert.That(result.Sum2, Is.EqualTo(5)); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.04.26 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.DoubleAggregateToStructTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace DoubleAggregateToStructTestModel + { + public struct GroupInfo + { + public int Key { get; set; } + + public int Sum1 { get; set; } + + public int Sum2 { get; set; } + } + + [HierarchyRoot] + public class Aggregated : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public int GroupId { get; private set; } + + [Field] + public int Value1 { get; private set; } + + [Field] + public int Value2 { get; private set; } + + public Aggregated(int value1, int value2) + { + GroupId = 0; + Value1 = value1; + Value2 = value2; + } + } + } + + public class DoubleAggregateToStructTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Aggregated)); + return config; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Aggregated(1, 2); + new Aggregated(2, 3); + tx.Complete(); + } + } + + [Test] + public void SumTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var q = session.Query.All().GroupBy(a => a.GroupId) + .Select(g => new GroupInfo { + Key = g.Key, + Sum1 = g.Sum(x => x.Value1), + Sum2 = g.Sum(x => x.Value2) + }); + var result = q.ToList().Single(); + Assert.That(result.Sum1, Is.EqualTo(3)); + Assert.That(result.Sum2, Is.EqualTo(5)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/DynamicallyDefinedFields.cs b/Orm/Xtensive.Orm.Tests/Linq/DynamicallyDefinedFields.cs index 0b7710662e..d49ac15dc6 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/DynamicallyDefinedFields.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/DynamicallyDefinedFields.cs @@ -1,1386 +1,1386 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.06.24 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Tests.Linq.DynamicallyDefinedFieldsModel; - -namespace Xtensive.Orm.Tests.Linq.DynamicallyDefinedFieldsModel -{ - [HierarchyRoot] - public class Area : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field(Nullable = false)] - public string Name { get; set; } - - [Field] - public EntitySet Somes { get; private set; } - } - - [HierarchyRoot] - public class Group : Entity - { - [Field, Key] - public long ID { get; set; } - - [Field] - public string Value { get; set; } - } - - [HierarchyRoot] - public class SomeClass : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public Area Area { get; set; } - } - - public class GeoLocation : Structure - { - [Field] - public double Latitude { get; set; } - - [Field] - public double Longitude { get; set; } - } - - public interface ITestInterface : IEntity - { - [Field, Key] - int Id { get; } - - [Field] - string InterfaseImplementorName { get; set; } - } - - [HierarchyRoot] - public class TestInterfaceImplementor : Entity, ITestInterface - { - public int Id { get; private set; } - - public string InterfaseImplementorName { get; set; } - } - - [HierarchyRoot] - public class Removable : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Area Area { get; set; } - - [Field] - public decimal Decimal { get; set; } - } - - public class Module : IModule - { - public void OnBuilt(Domain domain) - { - } - - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - DefineDynamicFields(model); - } - - private void DefineDynamicFields(DomainModelDef model) - { - var testData = TestData.CorrectData; - var areaTypeInfo = model.Types[typeof (Area)]; - areaTypeInfo.DefineField(testData.GroupFieldName, typeof (Group)); - areaTypeInfo.DefineField(testData.GeoLocationFieldName, typeof (GeoLocation)); - areaTypeInfo.DefineField(testData.SomeClassesFieldName, typeof (EntitySet)); - areaTypeInfo.DefineField(testData.IntFieldName, typeof (int)); - areaTypeInfo.DefineField(testData.StringFieldName, typeof (string)); - areaTypeInfo.DefineField(testData.DoubleFieldName, typeof (double)); - areaTypeInfo.DefineField(testData.DateTimeFieldName, typeof (DateTime)); - areaTypeInfo.DefineField(testData.ByteArrayFieldName, typeof (byte[])); - areaTypeInfo.DefineField(testData.ByteFieldName, typeof (byte)); - areaTypeInfo.DefineField(testData.DecimalFieldName, typeof (decimal)); - areaTypeInfo.DefineField(testData.LongFieldName, typeof (long)); - areaTypeInfo.DefineField(testData.FloatFieldName, typeof (float)); - areaTypeInfo.DefineField(testData.InterfaceImplementorFieldName, typeof (ITestInterface)); - areaTypeInfo.DefineField(testData.BooleanFieldName, typeof (bool)); - - var structureTypeInfo = model.Types[typeof (GeoLocation)]; - structureTypeInfo.DefineField(testData.GeoLocationDynamicFieldName, typeof (int)); - - var someClass = model.Types[typeof (SomeClass)]; - someClass.DefineField("DynamicField", typeof (int)); - } - } - - public class TestData - { - public static TestData CorrectData { get; private set; } - - public string AreaName { get; set; } - - public string GroupValue { get; set; } - public Key Group { get; set; } - public string GroupFieldName { get; set; } - - public Key SomeClassKey { get; set; } - public string SomeClassesFieldName { get; set; } - - public GeoLocation GeoLocation { get; set; } - public string GeoLocationFieldName { get; set; } - public int GeoLocationDynamicFieldValue { get; set; } - public string GeoLocationDynamicFieldName { get; set; } - - public bool BooleanFieldValue { get; set; } - public string BooleanFieldName { get; set; } - - public byte ByteFieldValue { get; set; } - public string ByteFieldName { get; set; } - - public int IntFieldValue { get; set; } - public string IntFieldName { get; set; } - - public long LongFieldValue { get; set; } - public string LongFieldName { get; set; } - - public float FloatFieldValue { get; set; } - public string FloatFieldName { get; set; } - - public double DoubleFieldValue { get; set; } - public string DoubleFieldName { get; set; } - - public decimal DecimalFieldValue { get; set; } - public string DecimalFieldName { get; set; } - - public byte[] ByteArrayFieldValue { get; set; } - public string ByteArrayFieldName { get; set; } - - public DateTime DateTimeFieldValue { get; set; } - public string DateTimeFieldName { get; set; } - - public string StringFieldValue { get; set; } - public string StringFieldName { get; set; } - - public Key InterfaceImplementorKey { get; set; } - public string InterfaceImplementorFieldName { get; set; } - - static TestData() - { - CorrectData = new TestData(); - } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class DynamicallyDefinedFields : AutoBuildTest - { - private readonly TestData testData = TestData.CorrectData; - - [Test] - public void WhereTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var storedArea = session.Query.All() - .Where(el => (Group)el[testData.GroupFieldName]==group) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group ,someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (int)el[testData.IntFieldName]==testData.IntFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (long)el[testData.LongFieldName]==testData.LongFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - storedArea = session.Query.All() - .Where(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - storedArea = session.Query.All() - .Where(el => (string)el[testData.StringFieldName]==testData.StringFieldValue) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .Where(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void AllTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - Assert.IsTrue(session.Query.All().All(el => (Group)el[testData.GroupFieldName]==group)); - Assert.IsTrue(session.Query.All().All(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); - Assert.IsTrue(session.Query.All().All(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); - Assert.IsTrue(session.Query.All().All(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); - Assert.IsTrue(session.Query.All().All(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); - if (!IsOracle()) - Assert.IsTrue(session.Query.All().All(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); - Assert.IsTrue(session.Query.All().All(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); - } - } - - [Test] - public void AnyTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - Assert.IsTrue(session.Query.All().Any(el => (Group)el[testData.GroupFieldName]==group)); - Assert.IsTrue(session.Query.All().Any(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); - Assert.IsTrue(session.Query.All().Any(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); - Assert.IsTrue(session.Query.All().Any(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); - if (!IsOracle()) - Assert.IsTrue(session.Query.All().Any(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); - Assert.IsTrue(session.Query.All().Any(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); - } - } - - [Test] - public void CountTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - Assert.AreEqual(1, session.Query.All().Count(el => (Group)el[testData.GroupFieldName]==group)); - Assert.AreEqual(1, session.Query.All().Count(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); - Assert.AreEqual(1, session.Query.All().Count(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); - Assert.AreEqual(1, session.Query.All().Count(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); - if (!IsOracle()) - Assert.AreEqual(1, session.Query.All().Count(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); - Assert.AreEqual(1, session.Query.All().Count(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); - } - } - - - [Test] - public void FirstTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (Group)el[testData.GroupFieldName]==group)); - var storedArea = session.Query.All().First(el => (Group)el[testData.GroupFieldName]==group); - TestFields(storedArea,group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); - storedArea = session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); - storedArea = session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); - storedArea = session.Query.All().First(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); - storedArea = session.Query.All().First(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); - storedArea = session.Query.All().First(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); - storedArea = session.Query.All().First(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); - storedArea = session.Query.All().First(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); - storedArea = session.Query.All().First(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); - storedArea = session.Query.All().First(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); - storedArea = session.Query.All().First(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - Assert.DoesNotThrow(() => session.Query.All().First(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); - storedArea = session.Query.All().First(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - Assert.DoesNotThrow(() => session.Query.All().First(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); - storedArea = session.Query.All().First(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().First(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); - storedArea = session.Query.All().First(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void FirstOrDefaultTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var storedArea = session.Query.All().FirstOrDefault(el => (Group)el[testData.GroupFieldName]==group); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - storedArea = session.Query.All().FirstOrDefault(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - storedArea = session.Query.All().FirstOrDefault(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().FirstOrDefault(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void GroupByTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var storedArea = session.Query.All().GroupBy(el => (Group)el[testData.GroupFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea1 = session.Query.All().GroupBy(el => (GeoLocation)el[testData.GeoLocationFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea2 = session.Query.All().GroupBy(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea3 = session.Query.All().GroupBy(el => (byte)el[testData.ByteFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea4 = session.Query.All().GroupBy(el => (int)el[testData.IntFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea5 = session.Query.All().GroupBy(el => (long)el[testData.LongFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea6 = session.Query.All().GroupBy(el => (float)el[testData.FloatFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea7 = session.Query.All().GroupBy(el => (double)el[testData.DoubleFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea8 = session.Query.All().GroupBy(el => (bool)el[testData.BooleanFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea9 = session.Query.All().GroupBy(el => (decimal)el[testData.DecimalFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - if (!IsOracle()) { - var storedArea10 = session.Query.All().GroupBy(el => (byte[])el[testData.ByteArrayFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - } - - var storedArea11 = session.Query.All().GroupBy(el => (string)el[testData.StringFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - - var storedArea12 = session.Query.All().GroupBy(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]).ToArray(); - Assert.NotNull(storedArea); - Assert.AreEqual(1, storedArea.Length); - } - } - - [Test] - public void OrderByTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var storedArea = session.Query.All() - .OrderBy(el => (Group)el[testData.GroupFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (GeoLocation)el[testData.GeoLocationFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (int) ((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => ((EntitySet)el[testData.SomeClassesFieldName])) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (byte)el[testData.ByteFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (int)el[testData.IntFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (long)el[testData.LongFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (float)el[testData.FloatFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (double)el[testData.DoubleFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (bool)el[testData.BooleanFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (decimal)el[testData.DecimalFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - storedArea = session.Query.All() - .OrderBy(el => (byte[])el[testData.ByteArrayFieldName]) - .FirstOrDefault(); - - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - storedArea = session.Query.All() - .OrderBy(el => (string)el[testData.StringFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All() - .OrderBy(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]) - .FirstOrDefault(); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void SelectTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var groups = session.Query.All() - .Select(el => (Group)el[testData.GroupFieldName]) - .ToArray(); - Assert.NotNull(groups); - Assert.AreEqual(1, groups.Length); - Assert.AreEqual(testData.GroupValue, groups[0].Value); - - var locations = session.Query.All() - .Select(el => (GeoLocation)el[testData.GeoLocationFieldName]) - .ToArray(); - Assert.NotNull(locations); - Assert.AreEqual(1, locations.Length); - Assert.AreEqual(testData.GeoLocation.Latitude, locations[0].Latitude); - Assert.AreEqual(testData.GeoLocation.Longitude, locations[0].Longitude); - - var locInts = session.Query.All() - .Select(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]) - .ToArray(); - Assert.NotNull(locInts); - Assert.AreEqual(1, locations.Length); - Assert.AreEqual(testData.GeoLocationDynamicFieldValue, locInts[0]); - - var entitySets = session.Query.All() - .Select(el => ((EntitySet)el[testData.SomeClassesFieldName])) - .ToArray(); - Assert.NotNull(entitySets); - Assert.AreEqual(1, entitySets.Length); - Assert.AreEqual(1, entitySets[0].Count); - Assert.IsTrue(entitySets[0].Contains(someClass)); - Assert.AreEqual(someClass, entitySets[0].FirstOrDefault()); - - var byteValues = session.Query.All() - .Select(el => (byte)el[testData.ByteFieldName]) - .ToArray(); - Assert.NotNull(byteValues); - Assert.AreEqual(1, byteValues.Length); - Assert.AreEqual(testData.ByteFieldValue, byteValues[0]); - - var intValues = session.Query.All() - .Select(el => (int)el[testData.IntFieldName]) - .ToArray(); - Assert.NotNull(intValues); - Assert.AreEqual(1, intValues.Length); - Assert.AreEqual(testData.IntFieldValue, intValues[0]); - - var longs = session.Query.All() - .Select(el => (long)el[testData.LongFieldName]) - .ToArray(); - Assert.NotNull(longs); - Assert.AreEqual(1, longs.Length); - Assert.AreEqual(testData.LongFieldValue, longs[0]); - - var floats = session.Query.All() - .Select(el => (float)el[testData.FloatFieldName]) - .ToArray(); - Assert.NotNull(floats); - Assert.AreEqual(1, floats.Length); - Assert.AreEqual(testData.FloatFieldValue, floats[0]); - - var doubles = session.Query.All() - .Select(el => (double)el[testData.DoubleFieldName]) - .ToArray(); - Assert.NotNull(doubles); - Assert.AreEqual(1, doubles.Length); - Assert.AreEqual(testData.DoubleFieldValue, doubles[0]); - - var booleans = session.Query.All() - .Select(el => (bool)el[testData.BooleanFieldName]) - .ToArray(); - Assert.NotNull(booleans); - Assert.AreEqual(1, booleans.Length); - Assert.AreEqual(testData.BooleanFieldValue, booleans[0]); - - var decimals = session.Query.All() - .Select(el => (decimal)el[testData.DecimalFieldName]) - .ToArray(); - Assert.NotNull(decimals); - Assert.AreEqual(1, decimals.Length); - Assert.AreEqual(testData.DecimalFieldValue, decimals[0]); - - var byteArrays = session.Query.All() - .Select(el => (byte[])el[testData.ByteArrayFieldName]) - .ToArray(); - Assert.NotNull(byteArrays); - Assert.AreEqual(1, byteArrays.Length); - Assert.AreEqual(testData.ByteArrayFieldValue.Length, byteArrays[0].Length); - for (int i = 0; i < testData.ByteArrayFieldValue.Length; i++) - Assert.AreEqual(testData.ByteArrayFieldValue[i], byteArrays[0][i]); - - var stringValues = session.Query.All() - .Select(el => (string)el[testData.StringFieldName]) - .ToArray(); - Assert.NotNull(stringValues); - Assert.AreEqual(1, stringValues.Length); - Assert.IsFalse(string.IsNullOrEmpty(stringValues[0])); - Assert.AreEqual(testData.StringFieldValue, stringValues[0]); - - var implementations = session.Query.All() - .Select(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]) - .ToArray(); - Assert.NotNull(implementations); - Assert.AreEqual(1, implementations.Length); - var implementation = implementations[0]; - Assert.AreEqual(interfaceImplementor.GetType(), implementation.GetType()); - Assert.AreEqual(interfaceImplementor, implementation); - } - } - - public void SelectManyTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var someClass = session.Query.Single(testData.SomeClassKey); - SomeClass[] someClasses; - Assert.DoesNotThrow( - ()=> { - someClasses = session.Query.All() - .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName])) - .ToArray(); - }); - someClasses = session.Query.All() - .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName])) - .ToArray(); - Assert.NotNull(someClasses); - Assert.AreEqual(1, someClasses.Length); - Assert.AreEqual(someClass, someClasses[0]); - } - } - - [Test] - public void SingeTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (Group)el[testData.GroupFieldName]==group)); - var storedArea = session.Query.All().Single(el => (Group)el[testData.GroupFieldName]==group); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); - storedArea = session.Query.All().Single(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); - storedArea = session.Query.All().Single(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); - storedArea = session.Query.All().Single(el => ((EntitySet) el[testData.SomeClassesFieldName]).Contains(someClass)); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); - storedArea = session.Query.All().Single(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); - storedArea = session.Query.All().Single(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); - storedArea = session.Query.All().Single(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); - storedArea = session.Query.All().Single(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); - storedArea = session.Query.All().Single(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); - storedArea = session.Query.All().Single(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); - storedArea = session.Query.All().Single(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - Assert.DoesNotThrow(() => session.Query.All().Single(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); - storedArea = session.Query.All().Single(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); - storedArea = session.Query.All().Single(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); - TestFields(storedArea, group, someClass, interfaceImplementor); - - Assert.DoesNotThrow(() => session.Query.All().Single(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); - storedArea = session.Query.All().Single(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void SingleOrDefault() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var storedArea = session.Query.All().SingleOrDefault(el => (Group)el[testData.GroupFieldName]==group); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - if (!IsOracle()) { - storedArea = session.Query.All().SingleOrDefault(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - - storedArea = session.Query.All().SingleOrDefault(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - - storedArea = session.Query.All().SingleOrDefault(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); - Assert.NotNull(storedArea); - TestFields(storedArea, group, someClass, interfaceImplementor); - } - } - - [Test] - public void IndirectAppearToDynamicallyDefinedField() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var allRemovable = session.Query.All(); - var array = allRemovable.Select(el=> new {Area = el.Area, Decimal = el.Decimal}) - .GroupBy(f => f.Area) - .Select(el => new { Area = el.Key, Sum = el.Sum(c => c.Decimal) }).ToArray(); - Assert.NotNull(array); - Assert.AreEqual(1, array.Length); - } - } - - [Test] - public void MethodResultAsIndexedInstanceTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var queryResult = session.Query.All() - .Select(el => (((EntitySet)el["SomeClasses"]).FirstOrDefault())["DynamicField"]) - .ToArray(); - Assert.AreEqual(1, queryResult.Length); - Assert.NotNull(queryResult[0]); - Assert.AreEqual(12, queryResult[0]); - } - } - - [Test] - public void MethodResultAsIndexerTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var queryResult = session.Query.All() - .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName.Substring(0,4) + testData.SomeClassesFieldName.Substring(4)])) - .ToArray(); - Assert.AreEqual(1, queryResult.Length); - Assert.NotNull(queryResult[0]); - } - } - - [Test] - public void SimpleMaxTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var maxDecimal = session.Query.All().Max(area => (decimal)area[testData.DecimalFieldName]); - Assert.AreEqual(testData.DecimalFieldValue, maxDecimal); - - var maxByte = session.Query.All().Max(area => (byte)area[testData.ByteFieldName]); - Assert.AreEqual(testData.ByteFieldValue, maxByte); - - var maxInt = session.Query.All().Max(area => (int)area[testData.IntFieldName]); - Assert.AreEqual(testData.IntFieldValue, maxInt); - - var maxLong = session.Query.All().Max(area => (long)area[testData.LongFieldName]); - Assert.AreEqual(testData.LongFieldValue, maxLong); - - var maxFloat = session.Query.All().Max(area => (float)area[testData.FloatFieldName]); - Assert.AreEqual(testData.FloatFieldValue, maxFloat); - - var maxDouble = session.Query.All().Max(area => (double)area[testData.DoubleFieldName]); - Assert.AreEqual(testData.DoubleFieldValue, maxDouble); - - var maxDateTime = session.Query.All().Max(area => (DateTime)area[testData.DateTimeFieldName]); - Assert.NotNull(maxDateTime); - Assert.AreEqual(testData.DateTimeFieldValue, maxDateTime); - - var maxString = session.Query.All().Max(area => (string)area[testData.StringFieldName]); - Assert.NotNull(maxString); - Assert.AreEqual(testData.StringFieldValue, maxString); - } - } - - [Test] - public void ComplexMaxTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var area = session.Query.All().First(p => (decimal)p[testData.DecimalFieldName]==session.Query.All().Max(el => (decimal)el[testData.DecimalFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (byte)p[testData.ByteFieldName]==session.Query.All().Max(el => (byte)el[testData.ByteFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (int)p[testData.IntFieldName]==session.Query.All().Max(el => (int)el[testData.IntFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (long)p[testData.LongFieldName]==session.Query.All().Max(el => (long)el[testData.LongFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (float)p[testData.FloatFieldName]==session.Query.All().Max(el => (float)el[testData.FloatFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (double)p[testData.DoubleFieldName]==session.Query.All().Max(el => (double)el[testData.DoubleFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - } - } - - [Test] - public void MinTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var minDecimal = session.Query.All().Min(area => (decimal)area[testData.DecimalFieldName]); - Assert.AreEqual(testData.DecimalFieldValue, minDecimal); - - var minByte = session.Query.All().Min(area => (byte)area[testData.ByteFieldName]); - Assert.AreEqual(testData.ByteFieldValue, minByte); - - var minInt = session.Query.All().Min(area => (int)area[testData.IntFieldName]); - Assert.AreEqual(testData.IntFieldValue, minInt); - - var minLong = session.Query.All().Min(area => (long)area[testData.LongFieldName]); - Assert.AreEqual(testData.LongFieldValue, minLong); - - var minFloat = session.Query.All().Min(area => (float)area[testData.FloatFieldName]); - Assert.AreEqual(testData.FloatFieldValue, minFloat); - - var minDouble = session.Query.All().Min(area => (double)area[testData.DoubleFieldName]); - Assert.AreEqual(testData.DoubleFieldValue, minDouble); - - var minDateTime = session.Query.All().Min(area => (DateTime)area[testData.DateTimeFieldName]); - Assert.NotNull(minDateTime); - Assert.AreEqual(testData.DateTimeFieldValue, minDateTime); - - var minString = session.Query.All().Min(area => (string)area[testData.StringFieldName]); - Assert.NotNull(minString); - Assert.AreEqual(testData.StringFieldValue, minString); - } - } - - [Test] - public void ComplexMinTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var area = session.Query.All().First(p => (decimal)p[testData.DecimalFieldName]==session.Query.All().Min(el => (decimal)el[testData.DecimalFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (byte)p[testData.ByteFieldName]==session.Query.All().Min(el => (byte)el[testData.ByteFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (int)p[testData.IntFieldName]==session.Query.All().Min(el => (int)el[testData.IntFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (long)p[testData.LongFieldName]==session.Query.All().Min(el => (long)el[testData.LongFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (float)p[testData.FloatFieldName]==session.Query.All().Min(el => (float)el[testData.FloatFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(p => (double)p[testData.DoubleFieldName]==session.Query.All().Min(el => (double)el[testData.DoubleFieldName])); - TestFields(area, group, someClass, interfaceImplementor); - } - } - - [Test] - public void InTest() - { - var localDecimalCollection = new decimal[] { 0m, testData.DecimalFieldValue, 100.1m }; - var localIntCollection = new int[] {0, testData.IntFieldValue, 122}; - var localLongCollection = new long[] {2, testData.LongFieldValue, 245}; - var localByteCollection = new byte[] {8, testData.ByteFieldValue, 120}; - var localFloatCollection = new float[] {0.5f, testData.FloatFieldValue, 1.25f}; - var localDoubleCollection = new double[] {0.5, testData.DoubleFieldValue, 3}; - var localStringCollection = new[] {"aaa", testData.StringFieldValue, "bbb"}; - - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var group = session.Query.Single(testData.Group); - var someClass = session.Query.Single(testData.SomeClassKey); - var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); - - var area = session.Query.All().First(el => ((byte)el[testData.ByteFieldName]).In(localByteCollection)); - TestFields(area ,group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((int)el[testData.IntFieldName]).In(localIntCollection)); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((decimal)el[testData.DecimalFieldName]).In(localDecimalCollection)); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((long)el[testData.LongFieldName]).In(localLongCollection)); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((float)el[testData.FloatFieldName]).In(localFloatCollection)); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((double)el[testData.DoubleFieldName]).In(localDoubleCollection)); - TestFields(area, group, someClass, interfaceImplementor); - - area = session.Query.All().First(el => ((string)el[testData.StringFieldName]).In(localStringCollection)); - TestFields(area, group, someClass, interfaceImplementor); - } - } - - [Test] - public void SumTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var byteSum = session.Query.All().Sum(area => (byte)area[testData.ByteFieldName]); - Assert.AreEqual(testData.ByteFieldValue, byteSum); - - var intSum = session.Query.All().Sum(area => (int)area[testData.IntFieldName]); - Assert.AreEqual(testData.IntFieldValue, intSum); - - var longSum = session.Query.All().Sum(area => (long)area[testData.LongFieldName]); - Assert.AreEqual(testData.LongFieldValue, longSum); - - var floatSum = session.Query.All().Sum(area => (float)area[testData.FloatFieldName]); - Assert.AreEqual(testData.FloatFieldValue, floatSum); - - var doubleSum = session.Query.All().Sum(area => (double)area[testData.DoubleFieldName]); - Assert.AreEqual(testData.DoubleFieldValue, doubleSum); - - var decimalSum = session.Query.All().Sum(area => (decimal)area[testData.DecimalFieldName]); - Assert.AreEqual(testData.DecimalFieldValue, decimalSum); - } - } - - [Test] - public void AverageTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transction = session.OpenTransaction()) { - var byteAvg = session.Query.All().Average(area => (byte)area[testData.ByteFieldName]); - Assert.AreEqual(testData.ByteFieldValue, byteAvg); - - var intAvg = session.Query.All().Average(area => (int)area[testData.IntFieldName]); - Assert.AreEqual(testData.IntFieldValue, intAvg); - - var longAvg = session.Query.All().Average(area => (long)area[testData.LongFieldName]); - Assert.AreEqual(testData.LongFieldValue, longAvg); - - var floatAvg = session.Query.All().Average(area => (float)area[testData.FloatFieldName]); - Assert.AreEqual(testData.FloatFieldValue, floatAvg); - - var doubleAvg = session.Query.All().Average(area => (double)area[testData.DoubleFieldName]); - Assert.AreEqual(testData.DoubleFieldValue, doubleAvg); - - var decimalAvg = session.Query.All().Average(area => (decimal)area[testData.DecimalFieldName]); - Assert.AreEqual(testData.DecimalFieldValue, decimalAvg); - } - } - - [Test] - public void GroupJoinTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transction = session.OpenTransaction()) { - Assert.DoesNotThrow(()=> { - session.Query.All() - .GroupJoin(session.Query.All(), - area => (Group)area[testData.GroupFieldName], - group => group, - (area, groups) => new { - Area = area, - Group = groups.Single() - }); - }); - } - } - - [Test] - public void JoinTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transction = session.OpenTransaction()) { - Assert.DoesNotThrow(() => { - session.Query.All().Join(session.Query.All(), area => (Group)area[testData.GroupFieldName], - group => group, (area, @group) => new {Area = area, Group = group}); - }); - } - } - - [Test] - public void LeftJoinTest() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transction = session.OpenTransaction()) { - Assert.DoesNotThrow(() => { - session.Query.All().LeftJoin(session.Query.All(), area => (Group)area[testData.GroupFieldName], - group => group, (area, @group) => new { Area = area, Group = group }); - }); - } - } - - private void TestFields(Area area, Group group, SomeClass someClass, ITestInterface implementor) - { - Assert.AreEqual(group, (Group)area[testData.GroupFieldName]); - Assert.AreEqual(testData.GeoLocation.Latitude, ((GeoLocation)area[testData.GeoLocationFieldName]).Latitude); - Assert.AreEqual(testData.GeoLocation.Longitude, ((GeoLocation)area[testData.GeoLocationFieldName]).Longitude); - Assert.AreEqual(testData.GeoLocationDynamicFieldValue, (int)((GeoLocation)area[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]); - Assert.AreEqual(1, ((EntitySet)area[testData.SomeClassesFieldName]).Count); - Assert.AreEqual(someClass, ((EntitySet)area[testData.SomeClassesFieldName]).FirstOrDefault()); - Assert.AreEqual(testData.IntFieldValue, area[testData.IntFieldName]); - Assert.AreEqual(testData.StringFieldValue, area[testData.StringFieldName]); - Assert.AreEqual(testData.DoubleFieldValue, (double)area[testData.DoubleFieldName]); - Assert.AreEqual(testData.DateTimeFieldValue, (DateTime)area[testData.DateTimeFieldName]); - Assert.AreEqual(testData.ByteArrayFieldValue, (byte[])area[testData.ByteArrayFieldName]); - Assert.AreEqual(testData.ByteFieldValue, (byte)area[testData.ByteFieldName]); - Assert.AreEqual(testData.DecimalFieldValue, (decimal)area[testData.DecimalFieldName]); - Assert.AreEqual(testData.LongFieldValue, (long)area[testData.LongFieldName]); - Assert.AreEqual(testData.FloatFieldValue, (float)area[testData.FloatFieldName]); - Assert.AreEqual(testData.BooleanFieldValue, (bool)area[testData.BooleanFieldName]); - Assert.AreEqual((ITestInterface)implementor, (ITestInterface)area[testData.InterfaceImplementorFieldName]); - } - - private bool IsOracle() - { - var info = StorageProviderInfo.Instance; - return info.CheckProviderIs(StorageProvider.Oracle); - } - - public override void TestFixtureSetUp() - { - var testData = TestData.CorrectData; - - testData.AreaName = "Name"; - testData.BooleanFieldName = "BoleanField"; - testData.BooleanFieldValue = false; - testData.ByteArrayFieldName = "ByteArrayField"; - testData.ByteArrayFieldValue = new byte[] { 12, 12, 12, 12, 12, 12, 12 }; - testData.ByteFieldName = "ByteField"; - testData.ByteFieldValue = 10; - testData.DateTimeFieldName = "DateTimeField"; - testData.DateTimeFieldValue = new DateTime(2012, 12, 12, 12, 12, 12); - testData.DecimalFieldName = "DecimalField"; - testData.DecimalFieldValue = new decimal(10); - testData.DoubleFieldName = "DoubleField"; - testData.DoubleFieldValue = 10; - testData.FloatFieldName = "FloatField"; - testData.FloatFieldValue = 10; - testData.GeoLocationFieldName = "LocationField"; - testData.GeoLocationDynamicFieldName = "Dynamic"; - testData.GeoLocationDynamicFieldValue = 1555; - testData.GroupFieldName = "Group"; - testData.GroupValue = "Group"; - testData.IntFieldName = "IntField"; - testData.IntFieldValue = 10; - testData.LongFieldName = "LongField"; - testData.LongFieldValue = 10; - testData.InterfaceImplementorFieldName = "ImplementorField"; - testData.SomeClassesFieldName = "SomeClasses"; - testData.StringFieldName = "StringField"; - testData.StringFieldValue = "String"; - - base.TestFixtureSetUp(); - } - - protected override void PopulateData() - { - var testData = TestData.CorrectData; - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var area = new Area {Name = testData.AreaName}; - var group = new Group {Value = testData.GroupValue}; - testData.Group = group.Key; - var someClass = new SomeClass(); - decimal fDecimal = new decimal((double)10); - someClass["DynamicField"] = (int)12; - testData.SomeClassKey = someClass.Key; - var geolocation = new GeoLocation {Latitude = 10, Longitude = 100}; - geolocation[testData.GeoLocationDynamicFieldName] = (int)testData.GeoLocationDynamicFieldValue; - testData.GeoLocation = geolocation; - var interfaceImplementor = new TestInterfaceImplementor {InterfaseImplementorName = typeof (TestInterfaceImplementor).AssemblyQualifiedName}; - testData.InterfaceImplementorKey = interfaceImplementor.Key; - - area[testData.GroupFieldName] = group; - area[testData.GeoLocationFieldName] = testData.GeoLocation; - area[testData.IntFieldName] = testData.IntFieldValue; - area[testData.StringFieldName] = testData.StringFieldValue; - area[testData.DoubleFieldName] = testData.DoubleFieldValue; - area[testData.DateTimeFieldName] = testData.DateTimeFieldValue; - area[testData.ByteArrayFieldName] = testData.ByteArrayFieldValue; - area[testData.ByteFieldName] = testData.ByteFieldValue; - area[testData.DecimalFieldName] = testData.DecimalFieldValue; - area[testData.LongFieldName] = testData.LongFieldValue; - area[testData.FloatFieldName] = testData.FloatFieldValue; - area[testData.BooleanFieldName] = testData.BooleanFieldValue; - area[testData.InterfaceImplementorFieldName] = interfaceImplementor; - - ((EntitySet)area[testData.SomeClassesFieldName]).Add(someClass); - area.Somes.Add(someClass); - someClass.Area = area; - new Removable {Area = area, Decimal = testData.DecimalFieldValue}; - transaction.Complete(); - } - } - - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Area).Assembly, typeof (Area).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.06.24 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Tests.Linq.DynamicallyDefinedFieldsModel; + +namespace Xtensive.Orm.Tests.Linq.DynamicallyDefinedFieldsModel +{ + [HierarchyRoot] + public class Area : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field(Nullable = false)] + public string Name { get; set; } + + [Field] + public EntitySet Somes { get; private set; } + } + + [HierarchyRoot] + public class Group : Entity + { + [Field, Key] + public long ID { get; set; } + + [Field] + public string Value { get; set; } + } + + [HierarchyRoot] + public class SomeClass : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public Area Area { get; set; } + } + + public class GeoLocation : Structure + { + [Field] + public double Latitude { get; set; } + + [Field] + public double Longitude { get; set; } + } + + public interface ITestInterface : IEntity + { + [Field, Key] + int Id { get; } + + [Field] + string InterfaseImplementorName { get; set; } + } + + [HierarchyRoot] + public class TestInterfaceImplementor : Entity, ITestInterface + { + public int Id { get; private set; } + + public string InterfaseImplementorName { get; set; } + } + + [HierarchyRoot] + public class Removable : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Area Area { get; set; } + + [Field] + public decimal Decimal { get; set; } + } + + public class Module : IModule + { + public void OnBuilt(Domain domain) + { + } + + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + DefineDynamicFields(model); + } + + private void DefineDynamicFields(DomainModelDef model) + { + var testData = TestData.CorrectData; + var areaTypeInfo = model.Types[typeof (Area)]; + areaTypeInfo.DefineField(testData.GroupFieldName, typeof (Group)); + areaTypeInfo.DefineField(testData.GeoLocationFieldName, typeof (GeoLocation)); + areaTypeInfo.DefineField(testData.SomeClassesFieldName, typeof (EntitySet)); + areaTypeInfo.DefineField(testData.IntFieldName, typeof (int)); + areaTypeInfo.DefineField(testData.StringFieldName, typeof (string)); + areaTypeInfo.DefineField(testData.DoubleFieldName, typeof (double)); + areaTypeInfo.DefineField(testData.DateTimeFieldName, typeof (DateTime)); + areaTypeInfo.DefineField(testData.ByteArrayFieldName, typeof (byte[])); + areaTypeInfo.DefineField(testData.ByteFieldName, typeof (byte)); + areaTypeInfo.DefineField(testData.DecimalFieldName, typeof (decimal)); + areaTypeInfo.DefineField(testData.LongFieldName, typeof (long)); + areaTypeInfo.DefineField(testData.FloatFieldName, typeof (float)); + areaTypeInfo.DefineField(testData.InterfaceImplementorFieldName, typeof (ITestInterface)); + areaTypeInfo.DefineField(testData.BooleanFieldName, typeof (bool)); + + var structureTypeInfo = model.Types[typeof (GeoLocation)]; + structureTypeInfo.DefineField(testData.GeoLocationDynamicFieldName, typeof (int)); + + var someClass = model.Types[typeof (SomeClass)]; + someClass.DefineField("DynamicField", typeof (int)); + } + } + + public class TestData + { + public static TestData CorrectData { get; private set; } + + public string AreaName { get; set; } + + public string GroupValue { get; set; } + public Key Group { get; set; } + public string GroupFieldName { get; set; } + + public Key SomeClassKey { get; set; } + public string SomeClassesFieldName { get; set; } + + public GeoLocation GeoLocation { get; set; } + public string GeoLocationFieldName { get; set; } + public int GeoLocationDynamicFieldValue { get; set; } + public string GeoLocationDynamicFieldName { get; set; } + + public bool BooleanFieldValue { get; set; } + public string BooleanFieldName { get; set; } + + public byte ByteFieldValue { get; set; } + public string ByteFieldName { get; set; } + + public int IntFieldValue { get; set; } + public string IntFieldName { get; set; } + + public long LongFieldValue { get; set; } + public string LongFieldName { get; set; } + + public float FloatFieldValue { get; set; } + public string FloatFieldName { get; set; } + + public double DoubleFieldValue { get; set; } + public string DoubleFieldName { get; set; } + + public decimal DecimalFieldValue { get; set; } + public string DecimalFieldName { get; set; } + + public byte[] ByteArrayFieldValue { get; set; } + public string ByteArrayFieldName { get; set; } + + public DateTime DateTimeFieldValue { get; set; } + public string DateTimeFieldName { get; set; } + + public string StringFieldValue { get; set; } + public string StringFieldName { get; set; } + + public Key InterfaceImplementorKey { get; set; } + public string InterfaceImplementorFieldName { get; set; } + + static TestData() + { + CorrectData = new TestData(); + } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class DynamicallyDefinedFields : AutoBuildTest + { + private readonly TestData testData = TestData.CorrectData; + + [Test] + public void WhereTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var storedArea = session.Query.All() + .Where(el => (Group)el[testData.GroupFieldName]==group) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group ,someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (int)el[testData.IntFieldName]==testData.IntFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (long)el[testData.LongFieldName]==testData.LongFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + storedArea = session.Query.All() + .Where(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + storedArea = session.Query.All() + .Where(el => (string)el[testData.StringFieldName]==testData.StringFieldValue) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .Where(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void AllTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + Assert.IsTrue(session.Query.All().All(el => (Group)el[testData.GroupFieldName]==group)); + Assert.IsTrue(session.Query.All().All(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); + Assert.IsTrue(session.Query.All().All(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); + Assert.IsTrue(session.Query.All().All(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); + Assert.IsTrue(session.Query.All().All(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); + if (!IsOracle()) + Assert.IsTrue(session.Query.All().All(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); + Assert.IsTrue(session.Query.All().All(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); + } + } + + [Test] + public void AnyTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + Assert.IsTrue(session.Query.All().Any(el => (Group)el[testData.GroupFieldName]==group)); + Assert.IsTrue(session.Query.All().Any(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); + Assert.IsTrue(session.Query.All().Any(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); + Assert.IsTrue(session.Query.All().Any(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); + if (!IsOracle()) + Assert.IsTrue(session.Query.All().Any(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); + Assert.IsTrue(session.Query.All().Any(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); + } + } + + [Test] + public void CountTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + Assert.AreEqual(1, session.Query.All().Count(el => (Group)el[testData.GroupFieldName]==group)); + Assert.AreEqual(1, session.Query.All().Count(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); + Assert.AreEqual(1, session.Query.All().Count(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); + Assert.AreEqual(1, session.Query.All().Count(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); + if (!IsOracle()) + Assert.AreEqual(1, session.Query.All().Count(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); + Assert.AreEqual(1, session.Query.All().Count(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); + } + } + + + [Test] + public void FirstTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (Group)el[testData.GroupFieldName]==group)); + var storedArea = session.Query.All().First(el => (Group)el[testData.GroupFieldName]==group); + TestFields(storedArea,group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); + storedArea = session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); + storedArea = session.Query.All().First(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); + storedArea = session.Query.All().First(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); + storedArea = session.Query.All().First(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); + storedArea = session.Query.All().First(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); + storedArea = session.Query.All().First(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); + storedArea = session.Query.All().First(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); + storedArea = session.Query.All().First(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); + storedArea = session.Query.All().First(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); + storedArea = session.Query.All().First(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + Assert.DoesNotThrow(() => session.Query.All().First(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); + storedArea = session.Query.All().First(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + Assert.DoesNotThrow(() => session.Query.All().First(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); + storedArea = session.Query.All().First(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().First(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); + storedArea = session.Query.All().First(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void FirstOrDefaultTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var storedArea = session.Query.All().FirstOrDefault(el => (Group)el[testData.GroupFieldName]==group); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + storedArea = session.Query.All().FirstOrDefault(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + storedArea = session.Query.All().FirstOrDefault(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().FirstOrDefault(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void GroupByTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var storedArea = session.Query.All().GroupBy(el => (Group)el[testData.GroupFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea1 = session.Query.All().GroupBy(el => (GeoLocation)el[testData.GeoLocationFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea2 = session.Query.All().GroupBy(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea3 = session.Query.All().GroupBy(el => (byte)el[testData.ByteFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea4 = session.Query.All().GroupBy(el => (int)el[testData.IntFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea5 = session.Query.All().GroupBy(el => (long)el[testData.LongFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea6 = session.Query.All().GroupBy(el => (float)el[testData.FloatFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea7 = session.Query.All().GroupBy(el => (double)el[testData.DoubleFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea8 = session.Query.All().GroupBy(el => (bool)el[testData.BooleanFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea9 = session.Query.All().GroupBy(el => (decimal)el[testData.DecimalFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + if (!IsOracle()) { + var storedArea10 = session.Query.All().GroupBy(el => (byte[])el[testData.ByteArrayFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + } + + var storedArea11 = session.Query.All().GroupBy(el => (string)el[testData.StringFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + + var storedArea12 = session.Query.All().GroupBy(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]).ToArray(); + Assert.NotNull(storedArea); + Assert.AreEqual(1, storedArea.Length); + } + } + + [Test] + public void OrderByTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var storedArea = session.Query.All() + .OrderBy(el => (Group)el[testData.GroupFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (GeoLocation)el[testData.GeoLocationFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (int) ((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => ((EntitySet)el[testData.SomeClassesFieldName])) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (byte)el[testData.ByteFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (int)el[testData.IntFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (long)el[testData.LongFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (float)el[testData.FloatFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (double)el[testData.DoubleFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (bool)el[testData.BooleanFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (decimal)el[testData.DecimalFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + storedArea = session.Query.All() + .OrderBy(el => (byte[])el[testData.ByteArrayFieldName]) + .FirstOrDefault(); + + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + storedArea = session.Query.All() + .OrderBy(el => (string)el[testData.StringFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All() + .OrderBy(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]) + .FirstOrDefault(); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void SelectTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var groups = session.Query.All() + .Select(el => (Group)el[testData.GroupFieldName]) + .ToArray(); + Assert.NotNull(groups); + Assert.AreEqual(1, groups.Length); + Assert.AreEqual(testData.GroupValue, groups[0].Value); + + var locations = session.Query.All() + .Select(el => (GeoLocation)el[testData.GeoLocationFieldName]) + .ToArray(); + Assert.NotNull(locations); + Assert.AreEqual(1, locations.Length); + Assert.AreEqual(testData.GeoLocation.Latitude, locations[0].Latitude); + Assert.AreEqual(testData.GeoLocation.Longitude, locations[0].Longitude); + + var locInts = session.Query.All() + .Select(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]) + .ToArray(); + Assert.NotNull(locInts); + Assert.AreEqual(1, locations.Length); + Assert.AreEqual(testData.GeoLocationDynamicFieldValue, locInts[0]); + + var entitySets = session.Query.All() + .Select(el => ((EntitySet)el[testData.SomeClassesFieldName])) + .ToArray(); + Assert.NotNull(entitySets); + Assert.AreEqual(1, entitySets.Length); + Assert.AreEqual(1, entitySets[0].Count); + Assert.IsTrue(entitySets[0].Contains(someClass)); + Assert.AreEqual(someClass, entitySets[0].FirstOrDefault()); + + var byteValues = session.Query.All() + .Select(el => (byte)el[testData.ByteFieldName]) + .ToArray(); + Assert.NotNull(byteValues); + Assert.AreEqual(1, byteValues.Length); + Assert.AreEqual(testData.ByteFieldValue, byteValues[0]); + + var intValues = session.Query.All() + .Select(el => (int)el[testData.IntFieldName]) + .ToArray(); + Assert.NotNull(intValues); + Assert.AreEqual(1, intValues.Length); + Assert.AreEqual(testData.IntFieldValue, intValues[0]); + + var longs = session.Query.All() + .Select(el => (long)el[testData.LongFieldName]) + .ToArray(); + Assert.NotNull(longs); + Assert.AreEqual(1, longs.Length); + Assert.AreEqual(testData.LongFieldValue, longs[0]); + + var floats = session.Query.All() + .Select(el => (float)el[testData.FloatFieldName]) + .ToArray(); + Assert.NotNull(floats); + Assert.AreEqual(1, floats.Length); + Assert.AreEqual(testData.FloatFieldValue, floats[0]); + + var doubles = session.Query.All() + .Select(el => (double)el[testData.DoubleFieldName]) + .ToArray(); + Assert.NotNull(doubles); + Assert.AreEqual(1, doubles.Length); + Assert.AreEqual(testData.DoubleFieldValue, doubles[0]); + + var booleans = session.Query.All() + .Select(el => (bool)el[testData.BooleanFieldName]) + .ToArray(); + Assert.NotNull(booleans); + Assert.AreEqual(1, booleans.Length); + Assert.AreEqual(testData.BooleanFieldValue, booleans[0]); + + var decimals = session.Query.All() + .Select(el => (decimal)el[testData.DecimalFieldName]) + .ToArray(); + Assert.NotNull(decimals); + Assert.AreEqual(1, decimals.Length); + Assert.AreEqual(testData.DecimalFieldValue, decimals[0]); + + var byteArrays = session.Query.All() + .Select(el => (byte[])el[testData.ByteArrayFieldName]) + .ToArray(); + Assert.NotNull(byteArrays); + Assert.AreEqual(1, byteArrays.Length); + Assert.AreEqual(testData.ByteArrayFieldValue.Length, byteArrays[0].Length); + for (int i = 0; i < testData.ByteArrayFieldValue.Length; i++) + Assert.AreEqual(testData.ByteArrayFieldValue[i], byteArrays[0][i]); + + var stringValues = session.Query.All() + .Select(el => (string)el[testData.StringFieldName]) + .ToArray(); + Assert.NotNull(stringValues); + Assert.AreEqual(1, stringValues.Length); + Assert.IsFalse(string.IsNullOrEmpty(stringValues[0])); + Assert.AreEqual(testData.StringFieldValue, stringValues[0]); + + var implementations = session.Query.All() + .Select(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]) + .ToArray(); + Assert.NotNull(implementations); + Assert.AreEqual(1, implementations.Length); + var implementation = implementations[0]; + Assert.AreEqual(interfaceImplementor.GetType(), implementation.GetType()); + Assert.AreEqual(interfaceImplementor, implementation); + } + } + + public void SelectManyTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var someClass = session.Query.Single(testData.SomeClassKey); + SomeClass[] someClasses; + Assert.DoesNotThrow( + ()=> { + someClasses = session.Query.All() + .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName])) + .ToArray(); + }); + someClasses = session.Query.All() + .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName])) + .ToArray(); + Assert.NotNull(someClasses); + Assert.AreEqual(1, someClasses.Length); + Assert.AreEqual(someClass, someClasses[0]); + } + } + + [Test] + public void SingeTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (Group)el[testData.GroupFieldName]==group)); + var storedArea = session.Query.All().Single(el => (Group)el[testData.GroupFieldName]==group); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation)); + storedArea = session.Query.All().Single(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue)); + storedArea = session.Query.All().Single(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass))); + storedArea = session.Query.All().Single(el => ((EntitySet) el[testData.SomeClassesFieldName]).Contains(someClass)); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue)); + storedArea = session.Query.All().Single(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (int)el[testData.IntFieldName]==testData.IntFieldValue)); + storedArea = session.Query.All().Single(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (long)el[testData.LongFieldName]==testData.LongFieldValue)); + storedArea = session.Query.All().Single(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue)); + storedArea = session.Query.All().Single(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue)); + storedArea = session.Query.All().Single(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue)); + storedArea = session.Query.All().Single(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue)); + storedArea = session.Query.All().Single(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + Assert.DoesNotThrow(() => session.Query.All().Single(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue)); + storedArea = session.Query.All().Single(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (string)el[testData.StringFieldName]==testData.StringFieldValue)); + storedArea = session.Query.All().Single(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); + TestFields(storedArea, group, someClass, interfaceImplementor); + + Assert.DoesNotThrow(() => session.Query.All().Single(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor)); + storedArea = session.Query.All().Single(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void SingleOrDefault() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var storedArea = session.Query.All().SingleOrDefault(el => (Group)el[testData.GroupFieldName]==group); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (GeoLocation)el[testData.GeoLocationFieldName]==testData.GeoLocation); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (int)((GeoLocation)el[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]==testData.GeoLocationDynamicFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => ((EntitySet)el[testData.SomeClassesFieldName]).Contains(someClass)); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (byte)el[testData.ByteFieldName]==testData.ByteFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (int)el[testData.IntFieldName]==testData.IntFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (long)el[testData.LongFieldName]==testData.LongFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (float)el[testData.FloatFieldName]==testData.FloatFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (double)el[testData.DoubleFieldName]==testData.DoubleFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (bool)el[testData.BooleanFieldName]==testData.BooleanFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (decimal)el[testData.DecimalFieldName]==testData.DecimalFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + if (!IsOracle()) { + storedArea = session.Query.All().SingleOrDefault(el => (byte[])el[testData.ByteArrayFieldName]==testData.ByteArrayFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + + storedArea = session.Query.All().SingleOrDefault(el => (string)el[testData.StringFieldName]==testData.StringFieldValue); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + + storedArea = session.Query.All().SingleOrDefault(el => (ITestInterface)el[testData.InterfaceImplementorFieldName]==interfaceImplementor); + Assert.NotNull(storedArea); + TestFields(storedArea, group, someClass, interfaceImplementor); + } + } + + [Test] + public void IndirectAppearToDynamicallyDefinedField() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var allRemovable = session.Query.All(); + var array = allRemovable.Select(el=> new {Area = el.Area, Decimal = el.Decimal}) + .GroupBy(f => f.Area) + .Select(el => new { Area = el.Key, Sum = el.Sum(c => c.Decimal) }).ToArray(); + Assert.NotNull(array); + Assert.AreEqual(1, array.Length); + } + } + + [Test] + public void MethodResultAsIndexedInstanceTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var queryResult = session.Query.All() + .Select(el => (((EntitySet)el["SomeClasses"]).FirstOrDefault())["DynamicField"]) + .ToArray(); + Assert.AreEqual(1, queryResult.Length); + Assert.NotNull(queryResult[0]); + Assert.AreEqual(12, queryResult[0]); + } + } + + [Test] + public void MethodResultAsIndexerTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var queryResult = session.Query.All() + .SelectMany(el => ((EntitySet)el[testData.SomeClassesFieldName.Substring(0,4) + testData.SomeClassesFieldName.Substring(4)])) + .ToArray(); + Assert.AreEqual(1, queryResult.Length); + Assert.NotNull(queryResult[0]); + } + } + + [Test] + public void SimpleMaxTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var maxDecimal = session.Query.All().Max(area => (decimal)area[testData.DecimalFieldName]); + Assert.AreEqual(testData.DecimalFieldValue, maxDecimal); + + var maxByte = session.Query.All().Max(area => (byte)area[testData.ByteFieldName]); + Assert.AreEqual(testData.ByteFieldValue, maxByte); + + var maxInt = session.Query.All().Max(area => (int)area[testData.IntFieldName]); + Assert.AreEqual(testData.IntFieldValue, maxInt); + + var maxLong = session.Query.All().Max(area => (long)area[testData.LongFieldName]); + Assert.AreEqual(testData.LongFieldValue, maxLong); + + var maxFloat = session.Query.All().Max(area => (float)area[testData.FloatFieldName]); + Assert.AreEqual(testData.FloatFieldValue, maxFloat); + + var maxDouble = session.Query.All().Max(area => (double)area[testData.DoubleFieldName]); + Assert.AreEqual(testData.DoubleFieldValue, maxDouble); + + var maxDateTime = session.Query.All().Max(area => (DateTime)area[testData.DateTimeFieldName]); + Assert.NotNull(maxDateTime); + Assert.AreEqual(testData.DateTimeFieldValue, maxDateTime); + + var maxString = session.Query.All().Max(area => (string)area[testData.StringFieldName]); + Assert.NotNull(maxString); + Assert.AreEqual(testData.StringFieldValue, maxString); + } + } + + [Test] + public void ComplexMaxTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var area = session.Query.All().First(p => (decimal)p[testData.DecimalFieldName]==session.Query.All().Max(el => (decimal)el[testData.DecimalFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (byte)p[testData.ByteFieldName]==session.Query.All().Max(el => (byte)el[testData.ByteFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (int)p[testData.IntFieldName]==session.Query.All().Max(el => (int)el[testData.IntFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (long)p[testData.LongFieldName]==session.Query.All().Max(el => (long)el[testData.LongFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (float)p[testData.FloatFieldName]==session.Query.All().Max(el => (float)el[testData.FloatFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (double)p[testData.DoubleFieldName]==session.Query.All().Max(el => (double)el[testData.DoubleFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + } + } + + [Test] + public void MinTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var minDecimal = session.Query.All().Min(area => (decimal)area[testData.DecimalFieldName]); + Assert.AreEqual(testData.DecimalFieldValue, minDecimal); + + var minByte = session.Query.All().Min(area => (byte)area[testData.ByteFieldName]); + Assert.AreEqual(testData.ByteFieldValue, minByte); + + var minInt = session.Query.All().Min(area => (int)area[testData.IntFieldName]); + Assert.AreEqual(testData.IntFieldValue, minInt); + + var minLong = session.Query.All().Min(area => (long)area[testData.LongFieldName]); + Assert.AreEqual(testData.LongFieldValue, minLong); + + var minFloat = session.Query.All().Min(area => (float)area[testData.FloatFieldName]); + Assert.AreEqual(testData.FloatFieldValue, minFloat); + + var minDouble = session.Query.All().Min(area => (double)area[testData.DoubleFieldName]); + Assert.AreEqual(testData.DoubleFieldValue, minDouble); + + var minDateTime = session.Query.All().Min(area => (DateTime)area[testData.DateTimeFieldName]); + Assert.NotNull(minDateTime); + Assert.AreEqual(testData.DateTimeFieldValue, minDateTime); + + var minString = session.Query.All().Min(area => (string)area[testData.StringFieldName]); + Assert.NotNull(minString); + Assert.AreEqual(testData.StringFieldValue, minString); + } + } + + [Test] + public void ComplexMinTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var area = session.Query.All().First(p => (decimal)p[testData.DecimalFieldName]==session.Query.All().Min(el => (decimal)el[testData.DecimalFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (byte)p[testData.ByteFieldName]==session.Query.All().Min(el => (byte)el[testData.ByteFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (int)p[testData.IntFieldName]==session.Query.All().Min(el => (int)el[testData.IntFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (long)p[testData.LongFieldName]==session.Query.All().Min(el => (long)el[testData.LongFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (float)p[testData.FloatFieldName]==session.Query.All().Min(el => (float)el[testData.FloatFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(p => (double)p[testData.DoubleFieldName]==session.Query.All().Min(el => (double)el[testData.DoubleFieldName])); + TestFields(area, group, someClass, interfaceImplementor); + } + } + + [Test] + public void InTest() + { + var localDecimalCollection = new decimal[] { 0m, testData.DecimalFieldValue, 100.1m }; + var localIntCollection = new int[] {0, testData.IntFieldValue, 122}; + var localLongCollection = new long[] {2, testData.LongFieldValue, 245}; + var localByteCollection = new byte[] {8, testData.ByteFieldValue, 120}; + var localFloatCollection = new float[] {0.5f, testData.FloatFieldValue, 1.25f}; + var localDoubleCollection = new double[] {0.5, testData.DoubleFieldValue, 3}; + var localStringCollection = new[] {"aaa", testData.StringFieldValue, "bbb"}; + + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var group = session.Query.Single(testData.Group); + var someClass = session.Query.Single(testData.SomeClassKey); + var interfaceImplementor = session.Query.Single(testData.InterfaceImplementorKey); + + var area = session.Query.All().First(el => ((byte)el[testData.ByteFieldName]).In(localByteCollection)); + TestFields(area ,group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((int)el[testData.IntFieldName]).In(localIntCollection)); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((decimal)el[testData.DecimalFieldName]).In(localDecimalCollection)); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((long)el[testData.LongFieldName]).In(localLongCollection)); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((float)el[testData.FloatFieldName]).In(localFloatCollection)); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((double)el[testData.DoubleFieldName]).In(localDoubleCollection)); + TestFields(area, group, someClass, interfaceImplementor); + + area = session.Query.All().First(el => ((string)el[testData.StringFieldName]).In(localStringCollection)); + TestFields(area, group, someClass, interfaceImplementor); + } + } + + [Test] + public void SumTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var byteSum = session.Query.All().Sum(area => (byte)area[testData.ByteFieldName]); + Assert.AreEqual(testData.ByteFieldValue, byteSum); + + var intSum = session.Query.All().Sum(area => (int)area[testData.IntFieldName]); + Assert.AreEqual(testData.IntFieldValue, intSum); + + var longSum = session.Query.All().Sum(area => (long)area[testData.LongFieldName]); + Assert.AreEqual(testData.LongFieldValue, longSum); + + var floatSum = session.Query.All().Sum(area => (float)area[testData.FloatFieldName]); + Assert.AreEqual(testData.FloatFieldValue, floatSum); + + var doubleSum = session.Query.All().Sum(area => (double)area[testData.DoubleFieldName]); + Assert.AreEqual(testData.DoubleFieldValue, doubleSum); + + var decimalSum = session.Query.All().Sum(area => (decimal)area[testData.DecimalFieldName]); + Assert.AreEqual(testData.DecimalFieldValue, decimalSum); + } + } + + [Test] + public void AverageTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transction = session.OpenTransaction()) { + var byteAvg = session.Query.All().Average(area => (byte)area[testData.ByteFieldName]); + Assert.AreEqual(testData.ByteFieldValue, byteAvg); + + var intAvg = session.Query.All().Average(area => (int)area[testData.IntFieldName]); + Assert.AreEqual(testData.IntFieldValue, intAvg); + + var longAvg = session.Query.All().Average(area => (long)area[testData.LongFieldName]); + Assert.AreEqual(testData.LongFieldValue, longAvg); + + var floatAvg = session.Query.All().Average(area => (float)area[testData.FloatFieldName]); + Assert.AreEqual(testData.FloatFieldValue, floatAvg); + + var doubleAvg = session.Query.All().Average(area => (double)area[testData.DoubleFieldName]); + Assert.AreEqual(testData.DoubleFieldValue, doubleAvg); + + var decimalAvg = session.Query.All().Average(area => (decimal)area[testData.DecimalFieldName]); + Assert.AreEqual(testData.DecimalFieldValue, decimalAvg); + } + } + + [Test] + public void GroupJoinTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transction = session.OpenTransaction()) { + Assert.DoesNotThrow(()=> { + session.Query.All() + .GroupJoin(session.Query.All(), + area => (Group)area[testData.GroupFieldName], + group => group, + (area, groups) => new { + Area = area, + Group = groups.Single() + }); + }); + } + } + + [Test] + public void JoinTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transction = session.OpenTransaction()) { + Assert.DoesNotThrow(() => { + session.Query.All().Join(session.Query.All(), area => (Group)area[testData.GroupFieldName], + group => group, (area, @group) => new {Area = area, Group = group}); + }); + } + } + + [Test] + public void LeftJoinTest() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transction = session.OpenTransaction()) { + Assert.DoesNotThrow(() => { + session.Query.All().LeftJoin(session.Query.All(), area => (Group)area[testData.GroupFieldName], + group => group, (area, @group) => new { Area = area, Group = group }); + }); + } + } + + private void TestFields(Area area, Group group, SomeClass someClass, ITestInterface implementor) + { + Assert.AreEqual(group, (Group)area[testData.GroupFieldName]); + Assert.AreEqual(testData.GeoLocation.Latitude, ((GeoLocation)area[testData.GeoLocationFieldName]).Latitude); + Assert.AreEqual(testData.GeoLocation.Longitude, ((GeoLocation)area[testData.GeoLocationFieldName]).Longitude); + Assert.AreEqual(testData.GeoLocationDynamicFieldValue, (int)((GeoLocation)area[testData.GeoLocationFieldName])[testData.GeoLocationDynamicFieldName]); + Assert.AreEqual(1, ((EntitySet)area[testData.SomeClassesFieldName]).Count); + Assert.AreEqual(someClass, ((EntitySet)area[testData.SomeClassesFieldName]).FirstOrDefault()); + Assert.AreEqual(testData.IntFieldValue, area[testData.IntFieldName]); + Assert.AreEqual(testData.StringFieldValue, area[testData.StringFieldName]); + Assert.AreEqual(testData.DoubleFieldValue, (double)area[testData.DoubleFieldName]); + Assert.AreEqual(testData.DateTimeFieldValue, (DateTime)area[testData.DateTimeFieldName]); + Assert.AreEqual(testData.ByteArrayFieldValue, (byte[])area[testData.ByteArrayFieldName]); + Assert.AreEqual(testData.ByteFieldValue, (byte)area[testData.ByteFieldName]); + Assert.AreEqual(testData.DecimalFieldValue, (decimal)area[testData.DecimalFieldName]); + Assert.AreEqual(testData.LongFieldValue, (long)area[testData.LongFieldName]); + Assert.AreEqual(testData.FloatFieldValue, (float)area[testData.FloatFieldName]); + Assert.AreEqual(testData.BooleanFieldValue, (bool)area[testData.BooleanFieldName]); + Assert.AreEqual((ITestInterface)implementor, (ITestInterface)area[testData.InterfaceImplementorFieldName]); + } + + private bool IsOracle() + { + var info = StorageProviderInfo.Instance; + return info.CheckProviderIs(StorageProvider.Oracle); + } + + public override void TestFixtureSetUp() + { + var testData = TestData.CorrectData; + + testData.AreaName = "Name"; + testData.BooleanFieldName = "BoleanField"; + testData.BooleanFieldValue = false; + testData.ByteArrayFieldName = "ByteArrayField"; + testData.ByteArrayFieldValue = new byte[] { 12, 12, 12, 12, 12, 12, 12 }; + testData.ByteFieldName = "ByteField"; + testData.ByteFieldValue = 10; + testData.DateTimeFieldName = "DateTimeField"; + testData.DateTimeFieldValue = new DateTime(2012, 12, 12, 12, 12, 12); + testData.DecimalFieldName = "DecimalField"; + testData.DecimalFieldValue = new decimal(10); + testData.DoubleFieldName = "DoubleField"; + testData.DoubleFieldValue = 10; + testData.FloatFieldName = "FloatField"; + testData.FloatFieldValue = 10; + testData.GeoLocationFieldName = "LocationField"; + testData.GeoLocationDynamicFieldName = "Dynamic"; + testData.GeoLocationDynamicFieldValue = 1555; + testData.GroupFieldName = "Group"; + testData.GroupValue = "Group"; + testData.IntFieldName = "IntField"; + testData.IntFieldValue = 10; + testData.LongFieldName = "LongField"; + testData.LongFieldValue = 10; + testData.InterfaceImplementorFieldName = "ImplementorField"; + testData.SomeClassesFieldName = "SomeClasses"; + testData.StringFieldName = "StringField"; + testData.StringFieldValue = "String"; + + base.TestFixtureSetUp(); + } + + protected override void PopulateData() + { + var testData = TestData.CorrectData; + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var area = new Area {Name = testData.AreaName}; + var group = new Group {Value = testData.GroupValue}; + testData.Group = group.Key; + var someClass = new SomeClass(); + decimal fDecimal = new decimal((double)10); + someClass["DynamicField"] = (int)12; + testData.SomeClassKey = someClass.Key; + var geolocation = new GeoLocation {Latitude = 10, Longitude = 100}; + geolocation[testData.GeoLocationDynamicFieldName] = (int)testData.GeoLocationDynamicFieldValue; + testData.GeoLocation = geolocation; + var interfaceImplementor = new TestInterfaceImplementor {InterfaseImplementorName = typeof (TestInterfaceImplementor).AssemblyQualifiedName}; + testData.InterfaceImplementorKey = interfaceImplementor.Key; + + area[testData.GroupFieldName] = group; + area[testData.GeoLocationFieldName] = testData.GeoLocation; + area[testData.IntFieldName] = testData.IntFieldValue; + area[testData.StringFieldName] = testData.StringFieldValue; + area[testData.DoubleFieldName] = testData.DoubleFieldValue; + area[testData.DateTimeFieldName] = testData.DateTimeFieldValue; + area[testData.ByteArrayFieldName] = testData.ByteArrayFieldValue; + area[testData.ByteFieldName] = testData.ByteFieldValue; + area[testData.DecimalFieldName] = testData.DecimalFieldValue; + area[testData.LongFieldName] = testData.LongFieldValue; + area[testData.FloatFieldName] = testData.FloatFieldValue; + area[testData.BooleanFieldName] = testData.BooleanFieldValue; + area[testData.InterfaceImplementorFieldName] = interfaceImplementor; + + ((EntitySet)area[testData.SomeClassesFieldName]).Add(someClass); + area.Somes.Add(someClass); + someClass.Area = area; + new Removable {Area = area, Decimal = testData.DecimalFieldValue}; + transaction.Complete(); + } + } + + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Area).Assembly, typeof (Area).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/EntitySetTest.cs b/Orm/Xtensive.Orm.Tests/Linq/EntitySetTest.cs index ec23abae8f..26c45557c5 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/EntitySetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/EntitySetTest.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.02 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class EntitySetTest : ChinookDOModelTest - { - [Test] - public void EntitySetAnonymousTest() - { - var result = Session.Query.All() - .Select(c => new {InvoicesFiled = c.Invoices}); - var expected = Session.Query.All() - .ToList() - .Select(c => new {InvoicesFiled = c.Invoices }); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void EntitySetSelectManyAnonymousTest() - { - var result = Session.Query.All() - .Select(c => new {InvoicesFiled = c.Invoices }) - .SelectMany(i => i.InvoicesFiled); - var expected = Session.Query.All() - .ToList() - .Select(c => new {InvoicesFiled = c.Invoices }) - .SelectMany(i => i.InvoicesFiled); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void EntitySetSelectTest() - { - var result = Session.Query.All().OrderBy(c=>c.CustomerId).Select(c => c.Invoices).ToList(); - var expected = Session.Query.All().AsEnumerable().OrderBy(c=>c.CustomerId).Select(c => c.Invoices).ToList(); - Assert.Greater(result.Count, 0); - Assert.AreEqual(expected.Count, result.Count); - for (int i = 0; i < result.Count; i++) - Assert.AreSame(expected[i], result[i]); - } - - [Test] - public void QueryTest() - { - var customer = GetCustomer(); - var expected = customer - .Invoices - .ToList() - .OrderBy(i => i.InvoiceId) - .Select(i => i.InvoiceId) - .ToList(); - var actual = customer - .Invoices - .OrderBy(i => i.InvoiceId) - .Select(i => i.InvoiceId) - .ToList(); - Assert.IsTrue(expected.SequenceEqual(actual)); - } - - [Test] - public void UnsupportedMethodsTest() - { - AssertEx.Throws(() => Session.Query.All().Where(c => c.Invoices.Add(null)).ToList()); - AssertEx.Throws(() => Session.Query.All().Where(c => c.Invoices.Remove(null)).ToList()); - } - - [Test] - public void CountTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var expected = Session.Query.All().Count(); - var count = Session.Query.All() - .Select(c => c.Invoices.Count) - .ToList() - .Sum(); - Assert.AreEqual(expected, count); - } - - [Test] - public void ContainsTest() - { - var bestInvoice = Session.Query.All() - .OrderBy(i => i.Commission) - .First(); - var result = Session.Query.All() - .Where(c => c.Invoices.Contains(bestInvoice)); - Assert.AreEqual(bestInvoice.Customer.CustomerId, result.ToList().Single().CustomerId); - } - - [Test] - public void OuterEntitySetTest() - { - var customer = GetCustomer(); - var result = Session.Query.All().Where(i => customer.Invoices.Contains(i)); - Assert.AreEqual(customer.Invoices.Count, result.ToList().Count); - } - - [Test] - public void JoinWithEntitySetTest() - { - var customer = GetCustomer(); - var result = - from i in customer.Invoices - join e in Session.Query.All() on i.DesignatedEmployee equals e - select e; - Assert.AreEqual(customer.Invoices.Count, result.ToList().Count); - } - - private static Customer GetCustomer() - { - return Session.Demand().Query.All().Where(c => c.FirstName=="Luis").Single(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.02 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class EntitySetTest : ChinookDOModelTest + { + [Test] + public void EntitySetAnonymousTest() + { + var result = Session.Query.All() + .Select(c => new {InvoicesFiled = c.Invoices}); + var expected = Session.Query.All() + .ToList() + .Select(c => new {InvoicesFiled = c.Invoices }); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void EntitySetSelectManyAnonymousTest() + { + var result = Session.Query.All() + .Select(c => new {InvoicesFiled = c.Invoices }) + .SelectMany(i => i.InvoicesFiled); + var expected = Session.Query.All() + .ToList() + .Select(c => new {InvoicesFiled = c.Invoices }) + .SelectMany(i => i.InvoicesFiled); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void EntitySetSelectTest() + { + var result = Session.Query.All().OrderBy(c=>c.CustomerId).Select(c => c.Invoices).ToList(); + var expected = Session.Query.All().AsEnumerable().OrderBy(c=>c.CustomerId).Select(c => c.Invoices).ToList(); + Assert.Greater(result.Count, 0); + Assert.AreEqual(expected.Count, result.Count); + for (int i = 0; i < result.Count; i++) + Assert.AreSame(expected[i], result[i]); + } + + [Test] + public void QueryTest() + { + var customer = GetCustomer(); + var expected = customer + .Invoices + .ToList() + .OrderBy(i => i.InvoiceId) + .Select(i => i.InvoiceId) + .ToList(); + var actual = customer + .Invoices + .OrderBy(i => i.InvoiceId) + .Select(i => i.InvoiceId) + .ToList(); + Assert.IsTrue(expected.SequenceEqual(actual)); + } + + [Test] + public void UnsupportedMethodsTest() + { + AssertEx.Throws(() => Session.Query.All().Where(c => c.Invoices.Add(null)).ToList()); + AssertEx.Throws(() => Session.Query.All().Where(c => c.Invoices.Remove(null)).ToList()); + } + + [Test] + public void CountTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var expected = Session.Query.All().Count(); + var count = Session.Query.All() + .Select(c => c.Invoices.Count) + .ToList() + .Sum(); + Assert.AreEqual(expected, count); + } + + [Test] + public void ContainsTest() + { + var bestInvoice = Session.Query.All() + .OrderBy(i => i.Commission) + .First(); + var result = Session.Query.All() + .Where(c => c.Invoices.Contains(bestInvoice)); + Assert.AreEqual(bestInvoice.Customer.CustomerId, result.ToList().Single().CustomerId); + } + + [Test] + public void OuterEntitySetTest() + { + var customer = GetCustomer(); + var result = Session.Query.All().Where(i => customer.Invoices.Contains(i)); + Assert.AreEqual(customer.Invoices.Count, result.ToList().Count); + } + + [Test] + public void JoinWithEntitySetTest() + { + var customer = GetCustomer(); + var result = + from i in customer.Invoices + join e in Session.Query.All() on i.DesignatedEmployee equals e + select e; + Assert.AreEqual(customer.Invoices.Count, result.ToList().Count); + } + + private static Customer GetCustomer() + { + return Session.Demand().Query.All().Where(c => c.FirstName=="Luis").Single(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ExecuteTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ExecuteTest.cs index e7cbdb242f..31a791da1a 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ExecuteTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ExecuteTest.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.12.15 - -using System.Collections; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class ExecuteTest : ChinookDOModelTest - { - [Test] - public void NonGenericTest() - { - var query = Session.Query.All().Where(i => i.Commission > 0.3m); - Assert.That(query, Is.Not.Empty); - var nonGenericQuery = (IQueryable) query; - foreach (var item in nonGenericQuery) { - Assert.IsNotNull(item); - var invoice = item as Invoice; - Assert.IsNotNull(invoice); - } - - query = Session.Query.All(); - nonGenericQuery = query; - foreach (var item in nonGenericQuery) { - Assert.IsNotNull(item); - var invoice = item as Invoice; - Assert.IsNotNull(invoice); - } - - var provider = query.Provider; - var result = provider.Execute(nonGenericQuery.Expression); - var enumerable = (IEnumerable) result; - foreach (var item in enumerable) { - Assert.IsNotNull(item); - var invoice = item as Invoice; - Assert.IsNotNull(invoice); - } - - query = Session.Query.All().Where(i => i.Commission > 0.3m); - Assert.That(query, Is.Not.Empty); - nonGenericQuery = (IQueryable) query; - result = provider.Execute(nonGenericQuery.Expression); - enumerable = (IEnumerable) result; - foreach (var item in enumerable) { - Assert.IsNotNull(item); - var invoice = item as Invoice; - Assert.IsNotNull(invoice); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.12.15 + +using System.Collections; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class ExecuteTest : ChinookDOModelTest + { + [Test] + public void NonGenericTest() + { + var query = Session.Query.All().Where(i => i.Commission > 0.3m); + Assert.That(query, Is.Not.Empty); + var nonGenericQuery = (IQueryable) query; + foreach (var item in nonGenericQuery) { + Assert.IsNotNull(item); + var invoice = item as Invoice; + Assert.IsNotNull(invoice); + } + + query = Session.Query.All(); + nonGenericQuery = query; + foreach (var item in nonGenericQuery) { + Assert.IsNotNull(item); + var invoice = item as Invoice; + Assert.IsNotNull(invoice); + } + + var provider = query.Provider; + var result = provider.Execute(nonGenericQuery.Expression); + var enumerable = (IEnumerable) result; + foreach (var item in enumerable) { + Assert.IsNotNull(item); + var invoice = item as Invoice; + Assert.IsNotNull(invoice); + } + + query = Session.Query.All().Where(i => i.Commission > 0.3m); + Assert.That(query, Is.Not.Empty); + nonGenericQuery = (IQueryable) query; + result = provider.Execute(nonGenericQuery.Expression); + enumerable = (IEnumerable) result; + foreach (var item in enumerable) { + Assert.IsNotNull(item); + var invoice = item as Invoice; + Assert.IsNotNull(invoice); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/FirstSingleTest.cs b/Orm/Xtensive.Orm.Tests/Linq/FirstSingleTest.cs index de93dbea35..b164e4d015 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/FirstSingleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/FirstSingleTest.cs @@ -1,289 +1,289 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.04 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class FirstSingleTest : ChinookDOModelTest - { - [Test] - public void LengthTest() - { - var length = Session.Query.All() - .Select(customer => customer.FirstName) - .FirstOrDefault() - .Length; - } - - [Test] - public void Length2Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customers = Session.Query.All() - .Where(cutomer => - cutomer - .Invoices - .Select(order => order.BillingAddress.City) - .FirstOrDefault() - .Length > 0); - QueryDumper.Dump(customers); - } - - [Test] - public void Length3Test() - { - var customers = Session.Query.All() - .Where(cutomer => - cutomer - .Invoices - .Select(order => order.BillingAddress.City) - .SingleOrDefault() - .Length > 0); - Assert.Throws(() => QueryDumper.Dump(customers)); - } - - [Test] - public void FirstTest() - { - var customer = Session.Query.All().First(); - Assert.IsNotNull(customer); - } - - [Test] - public void FirstPredicateTest() - { - var customer = Session.Query.All().First(c => c.FirstName=="Luis"); - Assert.IsNotNull(customer); - } - - [Test] - public void WhereFirstTest() - { - var customer = Session.Query.All().Where(c => c.FirstName=="Luis").First(); - Assert.IsNotNull(customer); - } - - [Test] - public void FirstOrDefaultTest() - { - var customer = Session.Query.All().FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void FirstOrDefaultPredicateTest() - { - Session.Query.All().FirstOrDefault(c => c.FirstName=="Luis"); - } - - [Test] - public void WhereFirstOrDefaultTest() - { - var customer = Session.Query.All().Where(c => c.FirstName=="Luis").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void SingleTest() - { - AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().Single()); - } - - [Test] - public void SinglePredicateTest() - { - var customer = Session.Query.All().Single(c => c.FirstName=="Luis"); - Assert.IsNotNull(customer); - } - - [Test] - public void WhereSingleTest() - { - var customer = Session.Query.All().Where(c => c.FirstName=="Luis").Single(); - Assert.IsNotNull(customer); - } - - [Test] - public void SingleOrDefaultTest() - { - AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().SingleOrDefault()); - } - - [Test] - public void SingleOrDefaultPredicateTest() - { - var customer = Session.Query.All().SingleOrDefault(c => c.FirstName=="Luis"); - Assert.IsNotNull(customer); - } - - [Test] - public void WhereSingleOrDefaultTest() - { - var customer = Session.Query.All().Where(c => c.FirstName=="Luis").SingleOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void SelectFirstTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var invoices = Session.Query.All(); - var invoiceLines = Session.Query.All(); - var result = from i in invoices - select new { - Invoice = i, - MaxOrder = invoiceLines - .Where(il => il.Invoice==i) - .OrderByDescending(il => il.UnitPrice * il.Quantity) - .First() - .Invoice - }; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - QueryDumper.Dump(list, true); - } - - [Test] - public void SubqueryFirstTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customersCount = Session.Query.All().Count(c => c.Invoices.Count > 0); - var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.First()); - var list = result.ToList(); - Assert.AreEqual(customersCount, list.Count); - QueryDumper.Dump(list, true); - } - - [Test] - public void SubqueryFirstExpectedExceptionTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All().Select(c => c.Invoices.First()); - AssertEx.ThrowsInvalidOperationException(() => result.ToList()); - } - - [Test] - public void SubqueryFirstOrDefaultTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customersCount = Session.Query.All().Count(); - var result = Session.Query.All().Select(c => c.Invoices.FirstOrDefault()); - var list = result.ToList(); - Assert.AreEqual(customersCount, list.Count); - } - - [Test] - public void SubquerySingleTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customersCount = Session.Query.All().Count(c => c.Invoices.Count > 0); - var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.Take(1).Single()); - var list = result.ToList(); - Assert.AreEqual(customersCount, list.Count); - } - - [Test] - public void SubquerySingleExpectedException1Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All().Select(c => c.Invoices.Take(1).Single()); - AssertEx.ThrowsInvalidOperationException(() => result.ToList()); - } - - [Test] - public void SubquerySingleExpectedException2Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - bool exceptionThrown = false; - var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.Single()); - try { - result.ToList(); - } - catch { - exceptionThrown = true; - } - if (!exceptionThrown) - Assert.Fail("Exception was not thrown."); - } - - [Test] - public void SubquerySingleOrDefaultTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customersCount = Session.Query.All().Count(); - var result = Session.Query.All().Select(c => c.Invoices.Take(1).SingleOrDefault()); - var list = result.ToList(); - Assert.AreEqual(customersCount, list.Count); - } - - [Test] - public void ComplexSubquerySingleOrDefaultTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var playlistCount = Session.Query.All().Count(); - var result = Session.Query.All().Select( - p => new { - Track = p.Tracks.Take(1).SingleOrDefault(), - p.Tracks.Take(1).SingleOrDefault().Name, - p.Tracks.Take(1).SingleOrDefault().Album - }); - var list = result.ToList(); - Assert.AreEqual(playlistCount, list.Count); - } - - [Test] - public void ComplexSubquerySelectSingleOrDefaultTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var playlistCount = Session.Query.All().Count(); - var result = Session.Query.All().Select(c => c.Tracks.Take(1).SingleOrDefault()).Select( - t => new { - Track = t, - t.Name, - t.Album - }); - var list = result.ToList(); - Assert.AreEqual(playlistCount, list.Count); - } - - [Test] - public void ComplexSubqueryFirstTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var playlistCount = Session.Query.All().Count(p => p.Tracks.Any()); - var result = Session.Query.All().Where(p => p.Tracks.Any()).Select( - p => new { - Track = p.Tracks.First(), - p.Tracks.First().Name, - p.Tracks.First().Album - }); - var list = result.ToList(); - Assert.AreEqual(playlistCount, list.Count); - } - - [Test] - public void ComplexSubquerySelectFirstTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var playlistCount = Session.Query.All().Count(x => x.Tracks.Any()); - var result = Session.Query.All() - .Where(p => p.Tracks.Any()) - .Select(p => p.Tracks.First()) - .Select(t => new {Track = t, t.Name, t.Album}); - var list = result.ToList(); - Assert.AreEqual(playlistCount, list.Count); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.04 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class FirstSingleTest : ChinookDOModelTest + { + [Test] + public void LengthTest() + { + var length = Session.Query.All() + .Select(customer => customer.FirstName) + .FirstOrDefault() + .Length; + } + + [Test] + public void Length2Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customers = Session.Query.All() + .Where(cutomer => + cutomer + .Invoices + .Select(order => order.BillingAddress.City) + .FirstOrDefault() + .Length > 0); + QueryDumper.Dump(customers); + } + + [Test] + public void Length3Test() + { + var customers = Session.Query.All() + .Where(cutomer => + cutomer + .Invoices + .Select(order => order.BillingAddress.City) + .SingleOrDefault() + .Length > 0); + Assert.Throws(() => QueryDumper.Dump(customers)); + } + + [Test] + public void FirstTest() + { + var customer = Session.Query.All().First(); + Assert.IsNotNull(customer); + } + + [Test] + public void FirstPredicateTest() + { + var customer = Session.Query.All().First(c => c.FirstName=="Luis"); + Assert.IsNotNull(customer); + } + + [Test] + public void WhereFirstTest() + { + var customer = Session.Query.All().Where(c => c.FirstName=="Luis").First(); + Assert.IsNotNull(customer); + } + + [Test] + public void FirstOrDefaultTest() + { + var customer = Session.Query.All().FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void FirstOrDefaultPredicateTest() + { + Session.Query.All().FirstOrDefault(c => c.FirstName=="Luis"); + } + + [Test] + public void WhereFirstOrDefaultTest() + { + var customer = Session.Query.All().Where(c => c.FirstName=="Luis").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void SingleTest() + { + AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().Single()); + } + + [Test] + public void SinglePredicateTest() + { + var customer = Session.Query.All().Single(c => c.FirstName=="Luis"); + Assert.IsNotNull(customer); + } + + [Test] + public void WhereSingleTest() + { + var customer = Session.Query.All().Where(c => c.FirstName=="Luis").Single(); + Assert.IsNotNull(customer); + } + + [Test] + public void SingleOrDefaultTest() + { + AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().SingleOrDefault()); + } + + [Test] + public void SingleOrDefaultPredicateTest() + { + var customer = Session.Query.All().SingleOrDefault(c => c.FirstName=="Luis"); + Assert.IsNotNull(customer); + } + + [Test] + public void WhereSingleOrDefaultTest() + { + var customer = Session.Query.All().Where(c => c.FirstName=="Luis").SingleOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void SelectFirstTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var invoices = Session.Query.All(); + var invoiceLines = Session.Query.All(); + var result = from i in invoices + select new { + Invoice = i, + MaxOrder = invoiceLines + .Where(il => il.Invoice==i) + .OrderByDescending(il => il.UnitPrice * il.Quantity) + .First() + .Invoice + }; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + QueryDumper.Dump(list, true); + } + + [Test] + public void SubqueryFirstTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customersCount = Session.Query.All().Count(c => c.Invoices.Count > 0); + var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.First()); + var list = result.ToList(); + Assert.AreEqual(customersCount, list.Count); + QueryDumper.Dump(list, true); + } + + [Test] + public void SubqueryFirstExpectedExceptionTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All().Select(c => c.Invoices.First()); + AssertEx.ThrowsInvalidOperationException(() => result.ToList()); + } + + [Test] + public void SubqueryFirstOrDefaultTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customersCount = Session.Query.All().Count(); + var result = Session.Query.All().Select(c => c.Invoices.FirstOrDefault()); + var list = result.ToList(); + Assert.AreEqual(customersCount, list.Count); + } + + [Test] + public void SubquerySingleTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customersCount = Session.Query.All().Count(c => c.Invoices.Count > 0); + var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.Take(1).Single()); + var list = result.ToList(); + Assert.AreEqual(customersCount, list.Count); + } + + [Test] + public void SubquerySingleExpectedException1Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All().Select(c => c.Invoices.Take(1).Single()); + AssertEx.ThrowsInvalidOperationException(() => result.ToList()); + } + + [Test] + public void SubquerySingleExpectedException2Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + bool exceptionThrown = false; + var result = Session.Query.All().Where(c => c.Invoices.Count > 0).Select(c => c.Invoices.Single()); + try { + result.ToList(); + } + catch { + exceptionThrown = true; + } + if (!exceptionThrown) + Assert.Fail("Exception was not thrown."); + } + + [Test] + public void SubquerySingleOrDefaultTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customersCount = Session.Query.All().Count(); + var result = Session.Query.All().Select(c => c.Invoices.Take(1).SingleOrDefault()); + var list = result.ToList(); + Assert.AreEqual(customersCount, list.Count); + } + + [Test] + public void ComplexSubquerySingleOrDefaultTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var playlistCount = Session.Query.All().Count(); + var result = Session.Query.All().Select( + p => new { + Track = p.Tracks.Take(1).SingleOrDefault(), + p.Tracks.Take(1).SingleOrDefault().Name, + p.Tracks.Take(1).SingleOrDefault().Album + }); + var list = result.ToList(); + Assert.AreEqual(playlistCount, list.Count); + } + + [Test] + public void ComplexSubquerySelectSingleOrDefaultTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var playlistCount = Session.Query.All().Count(); + var result = Session.Query.All().Select(c => c.Tracks.Take(1).SingleOrDefault()).Select( + t => new { + Track = t, + t.Name, + t.Album + }); + var list = result.ToList(); + Assert.AreEqual(playlistCount, list.Count); + } + + [Test] + public void ComplexSubqueryFirstTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var playlistCount = Session.Query.All().Count(p => p.Tracks.Any()); + var result = Session.Query.All().Where(p => p.Tracks.Any()).Select( + p => new { + Track = p.Tracks.First(), + p.Tracks.First().Name, + p.Tracks.First().Album + }); + var list = result.ToList(); + Assert.AreEqual(playlistCount, list.Count); + } + + [Test] + public void ComplexSubquerySelectFirstTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var playlistCount = Session.Query.All().Count(x => x.Tracks.Any()); + var result = Session.Query.All() + .Where(p => p.Tracks.Any()) + .Select(p => p.Tracks.First()) + .Select(t => new {Track = t, t.Name, t.Album}); + var list = result.ToList(); + Assert.AreEqual(playlistCount, list.Count); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/FreeTextTest.cs b/Orm/Xtensive.Orm.Tests/Linq/FreeTextTest.cs index fe173bf504..1538ef20ae 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/FreeTextTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/FreeTextTest.cs @@ -1,504 +1,504 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.12.14 - -using System; -using System.Collections.Generic; -using System.Threading; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using System.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - public class FreeTextTest : ChinookDOModelTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.FullText); - } - - protected override Domain BuildDomain(Xtensive.Orm.Configuration.DomainConfiguration configuration) - { - var domain = base.BuildDomain(configuration); - Thread.Sleep(TimeSpan.FromSeconds(6)); - return domain; - } - - [Test] - public void ReuseFreeText1Test() - { - Assert.Throws( - () => { - var result1 = TakeMatchesIncorrect("black babbath back").Count(); - Assert.AreEqual(3, result1); - var result2 = TakeMatchesIncorrect("1212erddfr324324rwefrtb43543543").Count(); - Assert.AreEqual(0, result2); - }); - } - - [Test] - public void ReuseFreeText2Test() - { - var result1 = TakeMatchesCorrect("black babbath back").Count(); - Assert.AreEqual(6, result1); - var result2 = TakeMatchesCorrect("1212erddfr324324rwefrtb43543543").Count(); - Assert.AreEqual(0, result2); - } - - [Test] - public void Test1() - { - var result = Session.Query.FreeText(() => "black babbath back").ToList(); - Assert.AreEqual(6, result.Count); - foreach (var document in result) { - Assert.IsNotNull(document); - Assert.IsNotNull(document.Entity); - } - } - - [Test] - public void Test2() - { - var result = from c in Session.Query.FreeText("black babbath back") select c.Rank; - Assert.AreEqual(6, result.ToList().Count); - } - - [Test] - public void TopNByRankTest() - { - var allMatchingRecords = Session.Query.FreeText("black babbath back"); - Assert.AreEqual(6, allMatchingRecords.Count()); - var topNMatchingRecords = Session.Query.FreeText("black babbath back", 2).ToList(); - Assert.AreEqual(2, topNMatchingRecords.Count()); - var top2Records = allMatchingRecords.OrderByDescending(record => record.Rank).Take(2); - Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); - } - - [Test] - public void TopNByRankQueryTest() - { - var allMatchingRecords = Query.FreeText("black babbath back"); - Assert.AreEqual(6, allMatchingRecords.Count()); - var topNMatchingRecords = Query.FreeText("black babbath back", 2).ToList(); - Assert.AreEqual(2, topNMatchingRecords.Count()); - var top2Records = allMatchingRecords.OrderByDescending(record => record.Rank).Take(2); - Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); - } - - [Test] - public void TopNByRankExpressionTest() - { - var allMatchingRecords = Session.Query.FreeText(() => "black babbath back"); - Assert.AreEqual(6, allMatchingRecords.Count()); - var topNMatchingRecords = Session.Query.FreeText(() => "black babbath back", 2).ToList(); - Assert.AreEqual(2, topNMatchingRecords.Count); - var top2Records = allMatchingRecords.OrderByDescending(rec => rec.Rank).Take(2); - Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); - } - - [Test] - public void TopNByRankQueryExpressionTest() - { - var allMatchingRecords = Query.FreeText(() => "black babbath back"); - Assert.AreEqual(6, allMatchingRecords.Count()); - var topNMatchingRecords = Query.FreeText(() => "black babbath back", 2).ToList(); - Assert.AreEqual(2, topNMatchingRecords.Count); - var top2Records = allMatchingRecords.OrderByDescending(rec => rec.Rank).Take(2); - Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); - } - - [Test] - public void TopNByrankEmptyResultTest() - { - var allMatchingRecords = Session.Query.FreeText(() => "sdgfgfhghd"); - Assert.IsTrue(!allMatchingRecords.Any()); - var topNMatchingRecords = Session.Query.FreeText(() => "sdgfgfhghd", 1); - Assert.IsTrue(!topNMatchingRecords.Any()); - } - - [Test] - public void NegativeTopNTest() - { - Assert.Throws(() => Session.Query.FreeText("sfdgfdhghgf", -1)); - } - - [Test] - public void ZeroTopNTest() - { - Assert.Throws(() => Session.Query.FreeText("sfdgfhgfhhj", 0)); - } - - [Test] - public void TopNByRankJoinTracksTest() - { - var result = - from c in Session.Query.FreeText(() => "black babbath back", 1) - join p in Session.Query.All() on c.Entity.Key equals p.Album.Key - select p; - Assert.AreEqual(12, result.ToList().Count); - foreach (var track in result) { - Assert.IsNotNull(track); - Assert.IsNotNull(track.Key); - } - } - - [Test] - public void JoinTracksTest() - { - var result = - from c in Session.Query.FreeText(() => "black babbath back") - join p in Session.Query.All() on c.Entity.Key equals p.Album.Key - select p; - var list = result.ToList(); - Assert.AreEqual(59, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - Assert.IsNotNull(track.Key); - } - } - - [Test] - public void JoinTracks2Test() - { - var result = - from c in Session.Query.FreeText(() => "black babbath back") - join p in Session.Query.All() on c.Entity equals p.Album - select p; - var list = result.ToList(); - Assert.AreEqual(59, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - Assert.IsNotNull(track.Key); - } - } - - [Test] - public void TopNByRankJoinTracksTest2() - { - var result = - from c in Session.Query.FreeText(() => "black babbath back", 1) - join p in Session.Query.All() on c.Entity equals p.Album - select p; - Assert.AreEqual(12, result.ToList().Count); - foreach (var track in result) { - Assert.IsNotNull(track); - Assert.IsNotNull(track.Key); - } - } - - [Test] - public void JoinAlbumTest() - { - var keywords = "black"; - var result = - from p in Session.Query.FreeText(keywords) - join c in Session.Query.All() on p.Entity.Album.AlbumId equals c.AlbumId - orderby p.Rank - select new {Id = c.AlbumId, Name = c.Title, Rank = p.Rank, Descr = GetTrackDescription(p.Entity)}; - var list = result.ToList(); - } - - [Test] - public void TopNByRankJoinAlbumTest() - { - var keywords = "black"; - var result = - from p in Session.Query.FreeText(keywords, 1) - join c in Session.Query.All() on p.Entity.Album.AlbumId equals c.AlbumId - orderby p.Rank - select new {Id = c.AlbumId, Title = c.Title, Rank = p.Rank, Descr = GetTrackDescription(p.Entity)}; - var list = result.ToList(); - } - - [Test] - public void JoinAlbum2Test() - { - var keywords = "black"; - var result = Session.Query.FreeText(keywords) - .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}) - .OrderBy(@t => @t.Rank) - .Select(@t => new {Id = @t.c.AlbumId, Title = @t.c.Title, Rank = @t.Rank}); - var list = result.ToList(); - } - - [Test] - public void TopNByRankJoinAlbum2Test() - { - var keywords = "black"; - var result = Session.Query.FreeText(keywords, 1) - .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}) - .OrderBy(@t => @t.Rank) - .Select(@t => new {Id = @t.c.AlbumId, Title = @t.c.Title, Rank = @t.Rank}); - var list = result.ToList(); - } - - [Test] - public void JoinAlbum2PgSqlTest() - { - var keywords = "black"; - var result = Session.Query.FreeText(keywords) - .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}); - var list = result.ToList(); - } - - [Test] - public void TopNByRankJoinAlbum2PgSqlTest() - { - var keywords = "black"; - var result = Session.Query.FreeText(keywords, 1) - .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}); - var list = result.ToList(); - } - - [Test] - public void JoinAlbum3Test() - { - - /*[23.07.2010 13:56:17] Alexander Ustinov: (from ftx in ( - from ft in Session.Query.FreeText(() => " ") - where ft.Entity.ObjectType==typeof (Data.Rng.Customer).FullName - select new {ft.Rank, ft.Entity} - ) - join customer in Session.Query.All() on ftx.Entity.ObjectId equals customer.Id - from gasObject in Session.Query.All().Where(go => go.Customer==customer).DefaultIfEmpty() - select new RngCustomerBriefInfo { - ID = customer.Id, - Rank = ftx.Rank, - Number = gasObject==null ? String.Empty : gasObject.AccountNumber, - Name = customer.Name, - Address = AbonentMatchDataProvider.GetGasObjectAddress(gasObject) - }).Take(100).OrderByDescending(i => i.Rank).OrderByDescending(i => i.ID);*/ - var keywords = "black"; - var result = ( - from ft in Session.Query.FreeText(keywords) - join c in Session.Query.All() on ft.Entity.Album equals c - select new {ID = c.AlbumId, Rank = ft.Rank, Name = ft.Entity.Name} - ).Take(100).OrderByDescending(i => i.Rank).ThenByDescending(i => i.ID); -// var result = Session.Query.FreeText(keywords) -// .Where(p => p.Entity.ProductName != typeof(Product).Name) -// .Join(Session.Query.All(), p => p.Entity.Category.Id, c => c.Id, (p, c) => new { p.Rank, c }) -// .OrderBy(@t => @t.Rank) -// .Select(@t => new { Id = @t.c.Id, Name = @t.c.CategoryName, Rank = @t.Rank }); - var list = result.ToList(); - } - - [Test] - public void TopNByRankJoinAlbum3Test() - { - var keywords = "black"; - var result = (from ft in Session.Query.FreeText(keywords, 1) - join c in Session.Query.All() on ft.Entity.Album equals c - select new {ID = c.AlbumId, Rank = ft.Rank, Name = ft.Entity.Name} - ).Take(100).OrderByDescending(i => i.Rank).ThenByDescending(i => i.ID); - var list = result.ToList(); - } - - private static string GetTrackDescription(Track p) - { - return p.Name + ":" + p.UnitPrice; - } - - [Test] - public void JoinTracksWithRanks1Test() - { - var result = - (from c in Session.Query.FreeText(() => "black babbath back") - orderby c.Rank - select new {c.Entity, c.Rank}); - var list = result.ToList(); - Assert.AreEqual(6, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - } - } - - [Test] - public void TopNByRankJoinTracksWithRanks1Test() - { - var result = - (from c in Session.Query.FreeText(() => "black babbath back", 2) - orderby c.Rank - select new {c.Entity, c.Rank}); - var list = result.ToList(); - Assert.AreEqual(2, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - } - } - - [Test] - public void JoinTracksWithRanks2Test() - { - var result = Session.Query.FreeText(() => "black babbath back") - .OrderBy(c => c.Rank) - .Select(x => x.Entity); - var list = result.ToList(); - Assert.AreEqual(6, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - } - } - - [Test] - public void TopNByRankJoinTracksWithRanks2Test() - { - var result = Session.Query.FreeText(() => "black babbath back", 2) - .OrderBy(c => c.Rank) - .Select(x => x.Entity); - var list = result.ToList(); - Assert.AreEqual(2, list.Count); - foreach (var track in result) { - Assert.IsNotNull(track); - } - } - - [Test] - public void OrderByTest() - { - var result = from ft in Session.Query.FreeText(() => "black") - where ft.Entity.TrackId > 0 && ft.Entity.UnitPrice > 0.8m - orderby ft.Entity.Album.Title, ft.Entity.UnitPrice - select new {Track = ft.Entity, ft.Entity.Name}; - var list = result.ToList(); - Assert.AreEqual(26, list.Count); - } - - [Test] - public void TopNByRankOrderByTest() - { - var keywords = "black babbath back"; - var topNByrankOrdered = Session.Query.FreeText(keywords, 3) - .OrderBy(r => r.Rank).ToArray(); - var defaultFreeTextQuery = Session.Query.FreeText(keywords) - .AsEnumerable() - .OrderByDescending(r => r.Rank) - .Take(3) - .OrderBy(r => r.Rank) - .ToList(); - Assert.IsTrue(defaultFreeTextQuery.Count()==3); - Assert.IsTrue(topNByrankOrdered.Count()==3); - Assert.IsTrue( - defaultFreeTextQuery - .Select(rec => rec.Entity.Title) - .SequenceEqual(topNByrankOrdered.Select(rec => rec.Entity.Title))); - } - - [Test] - public void TopNByRankOrderByExpressionTest() - { - var keywords = "black babbath back"; - var topnByRankOrdered = Session.Query.FreeText(() => keywords, 3) - .OrderBy(r => r.Rank); - var defaultFreeTextQuery = Session.Query.FreeText(() => keywords) - .AsEnumerable() - .OrderByDescending(r => r.Rank) - .Take(3) - .OrderBy(r => r.Rank) - .ToList(); - Assert.IsTrue(defaultFreeTextQuery.Count()==3); - Assert.IsTrue(topnByRankOrdered.Count()==3); - Assert.IsTrue( - defaultFreeTextQuery - .Select(rec => rec.Entity.Title) - .SequenceEqual(topnByRankOrdered.Select(rec => rec.Entity.Title))); - } - - [Test] - public void TopNByRankTakeMaxTest() - { - var keywords = "black babbath back"; - var topNByRank = Session.Query.FreeText(keywords, 3).ToList(); - Assert.IsTrue(topNByRank.Count()==3); - var topNByRankTakeSameAmmount = Session.Query.FreeText(keywords, 3).Take(3).OrderByDescending(r => r.Rank); - Assert.IsTrue(topNByRankTakeSameAmmount.Count()==3); - Assert.IsTrue( - topNByRank - .Select(rec => rec.Entity.Title) - .SequenceEqual(topNByRankTakeSameAmmount.Select(rec => rec.Entity.Title))); - } - - [Test] - public void TopNByRankTakeLessThanMaxTest() - { - var keywords = "black babbath back"; - var topNByRank = Session.Query.FreeText(keywords, 3); - Assert.IsTrue(topNByRank.Count()==3); - var topNByRankTakeLess = Session.Query.FreeText(keywords, 3).Take(2).OrderByDescending(r => r.Rank).ToList(); - Assert.IsTrue(topNByRankTakeLess.Count()==2); - Assert.IsTrue( - topNByRankTakeLess - .Select(r => r.Entity.Title) - .SequenceEqual(topNByRank.Take(2).OrderByDescending(r => r.Rank).Select(r => r.Entity.Title))); - } - - [Test] - public void TopNByRankTakeMoreThanMaxTest() - { - var keywords = "black babbath back"; - var topNByRank = Session.Query.FreeText(keywords, 3); - Assert.IsTrue(topNByRank.Count()==3); - var topNByrankTakeMore = Session.Query.FreeText(keywords, 3).Take(4).OrderByDescending(r => r.Rank).ToList(); - Assert.IsTrue(topNByrankTakeMore.Count()==3); - Assert.IsTrue(topNByrankTakeMore.Select(r => r.Entity.Title).SequenceEqual(topNByRank.Select(r => r.Entity.Title))); - } - - [Test] - public void TopNByRankOrderByAndTakeSequenceTest() - { - var keywords = "black babbath back"; - var topNByRank = Session.Query.FreeText(keywords, 3).ToList(); - Assert.IsTrue(topNByRank.Count()==3); - var topNByrankOrderByAndTake = Session.Query.FreeText(keywords, 3) - .OrderBy(r => r.Rank) - .Take(3) - .OrderByDescending(r => r.Rank).Take(2).ToList(); - Assert.IsTrue(topNByrankOrderByAndTake.Count()==2); - Assert.IsTrue( - topNByRank - .Take(2) - .OrderByDescending(r => r.Rank) - .Select(r => r.Entity.Title) - .SequenceEqual(topNByrankOrderByAndTake.Select(rec => rec.Entity.Title))); - } - - [Test] - public void FreeTextOnFullTextStructureField() - { - var keywords = "Boulevard Innere Woodstock Discos"; - var result = Query.FreeText(keywords).ToList(); - Assert.AreEqual(2, result.Count); - } - - [Test] - public void FreeTextTopNByRankOnFullTextStructureField() - { - var keywords = "Rotenturmstrae Innere Stadt Woodstock Boulevard"; - var result = Query.FreeText(keywords, 2).ToList(); - var closestMatch = result.First().Entity; - Assert.AreEqual(2, result.Count); - Assert.IsTrue(closestMatch.Address.StreetAddress=="Rotenturmstrae 4, 1010 Innere Stadt"); - } - - [Test] - public void FreeTextOnStructureField() - { - var result = Query.FreeText("London").ToList(); - Assert.IsTrue(!result.Any()); - } - - private IEnumerable> TakeMatchesIncorrect(string searchCriteria) - { - return Session.Query.Execute(qe => qe.FreeText(searchCriteria)); - } - - private IEnumerable> TakeMatchesCorrect(string searchCriteria) - { - return Session.Query.Execute(qe => qe.FreeText(() => searchCriteria)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.12.14 + +using System; +using System.Collections.Generic; +using System.Threading; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using System.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + public class FreeTextTest : ChinookDOModelTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.FullText); + } + + protected override Domain BuildDomain(Xtensive.Orm.Configuration.DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + Thread.Sleep(TimeSpan.FromSeconds(6)); + return domain; + } + + [Test] + public void ReuseFreeText1Test() + { + Assert.Throws( + () => { + var result1 = TakeMatchesIncorrect("black babbath back").Count(); + Assert.AreEqual(3, result1); + var result2 = TakeMatchesIncorrect("1212erddfr324324rwefrtb43543543").Count(); + Assert.AreEqual(0, result2); + }); + } + + [Test] + public void ReuseFreeText2Test() + { + var result1 = TakeMatchesCorrect("black babbath back").Count(); + Assert.AreEqual(6, result1); + var result2 = TakeMatchesCorrect("1212erddfr324324rwefrtb43543543").Count(); + Assert.AreEqual(0, result2); + } + + [Test] + public void Test1() + { + var result = Session.Query.FreeText(() => "black babbath back").ToList(); + Assert.AreEqual(6, result.Count); + foreach (var document in result) { + Assert.IsNotNull(document); + Assert.IsNotNull(document.Entity); + } + } + + [Test] + public void Test2() + { + var result = from c in Session.Query.FreeText("black babbath back") select c.Rank; + Assert.AreEqual(6, result.ToList().Count); + } + + [Test] + public void TopNByRankTest() + { + var allMatchingRecords = Session.Query.FreeText("black babbath back"); + Assert.AreEqual(6, allMatchingRecords.Count()); + var topNMatchingRecords = Session.Query.FreeText("black babbath back", 2).ToList(); + Assert.AreEqual(2, topNMatchingRecords.Count()); + var top2Records = allMatchingRecords.OrderByDescending(record => record.Rank).Take(2); + Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); + } + + [Test] + public void TopNByRankQueryTest() + { + var allMatchingRecords = Query.FreeText("black babbath back"); + Assert.AreEqual(6, allMatchingRecords.Count()); + var topNMatchingRecords = Query.FreeText("black babbath back", 2).ToList(); + Assert.AreEqual(2, topNMatchingRecords.Count()); + var top2Records = allMatchingRecords.OrderByDescending(record => record.Rank).Take(2); + Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); + } + + [Test] + public void TopNByRankExpressionTest() + { + var allMatchingRecords = Session.Query.FreeText(() => "black babbath back"); + Assert.AreEqual(6, allMatchingRecords.Count()); + var topNMatchingRecords = Session.Query.FreeText(() => "black babbath back", 2).ToList(); + Assert.AreEqual(2, topNMatchingRecords.Count); + var top2Records = allMatchingRecords.OrderByDescending(rec => rec.Rank).Take(2); + Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); + } + + [Test] + public void TopNByRankQueryExpressionTest() + { + var allMatchingRecords = Query.FreeText(() => "black babbath back"); + Assert.AreEqual(6, allMatchingRecords.Count()); + var topNMatchingRecords = Query.FreeText(() => "black babbath back", 2).ToList(); + Assert.AreEqual(2, topNMatchingRecords.Count); + var top2Records = allMatchingRecords.OrderByDescending(rec => rec.Rank).Take(2); + Assert.IsTrue(topNMatchingRecords.Select(rec => rec.Entity.Title).SequenceEqual(top2Records.Select(rec1 => rec1.Entity.Title))); + } + + [Test] + public void TopNByrankEmptyResultTest() + { + var allMatchingRecords = Session.Query.FreeText(() => "sdgfgfhghd"); + Assert.IsTrue(!allMatchingRecords.Any()); + var topNMatchingRecords = Session.Query.FreeText(() => "sdgfgfhghd", 1); + Assert.IsTrue(!topNMatchingRecords.Any()); + } + + [Test] + public void NegativeTopNTest() + { + Assert.Throws(() => Session.Query.FreeText("sfdgfdhghgf", -1)); + } + + [Test] + public void ZeroTopNTest() + { + Assert.Throws(() => Session.Query.FreeText("sfdgfhgfhhj", 0)); + } + + [Test] + public void TopNByRankJoinTracksTest() + { + var result = + from c in Session.Query.FreeText(() => "black babbath back", 1) + join p in Session.Query.All() on c.Entity.Key equals p.Album.Key + select p; + Assert.AreEqual(12, result.ToList().Count); + foreach (var track in result) { + Assert.IsNotNull(track); + Assert.IsNotNull(track.Key); + } + } + + [Test] + public void JoinTracksTest() + { + var result = + from c in Session.Query.FreeText(() => "black babbath back") + join p in Session.Query.All() on c.Entity.Key equals p.Album.Key + select p; + var list = result.ToList(); + Assert.AreEqual(59, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + Assert.IsNotNull(track.Key); + } + } + + [Test] + public void JoinTracks2Test() + { + var result = + from c in Session.Query.FreeText(() => "black babbath back") + join p in Session.Query.All() on c.Entity equals p.Album + select p; + var list = result.ToList(); + Assert.AreEqual(59, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + Assert.IsNotNull(track.Key); + } + } + + [Test] + public void TopNByRankJoinTracksTest2() + { + var result = + from c in Session.Query.FreeText(() => "black babbath back", 1) + join p in Session.Query.All() on c.Entity equals p.Album + select p; + Assert.AreEqual(12, result.ToList().Count); + foreach (var track in result) { + Assert.IsNotNull(track); + Assert.IsNotNull(track.Key); + } + } + + [Test] + public void JoinAlbumTest() + { + var keywords = "black"; + var result = + from p in Session.Query.FreeText(keywords) + join c in Session.Query.All() on p.Entity.Album.AlbumId equals c.AlbumId + orderby p.Rank + select new {Id = c.AlbumId, Name = c.Title, Rank = p.Rank, Descr = GetTrackDescription(p.Entity)}; + var list = result.ToList(); + } + + [Test] + public void TopNByRankJoinAlbumTest() + { + var keywords = "black"; + var result = + from p in Session.Query.FreeText(keywords, 1) + join c in Session.Query.All() on p.Entity.Album.AlbumId equals c.AlbumId + orderby p.Rank + select new {Id = c.AlbumId, Title = c.Title, Rank = p.Rank, Descr = GetTrackDescription(p.Entity)}; + var list = result.ToList(); + } + + [Test] + public void JoinAlbum2Test() + { + var keywords = "black"; + var result = Session.Query.FreeText(keywords) + .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}) + .OrderBy(@t => @t.Rank) + .Select(@t => new {Id = @t.c.AlbumId, Title = @t.c.Title, Rank = @t.Rank}); + var list = result.ToList(); + } + + [Test] + public void TopNByRankJoinAlbum2Test() + { + var keywords = "black"; + var result = Session.Query.FreeText(keywords, 1) + .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}) + .OrderBy(@t => @t.Rank) + .Select(@t => new {Id = @t.c.AlbumId, Title = @t.c.Title, Rank = @t.Rank}); + var list = result.ToList(); + } + + [Test] + public void JoinAlbum2PgSqlTest() + { + var keywords = "black"; + var result = Session.Query.FreeText(keywords) + .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}); + var list = result.ToList(); + } + + [Test] + public void TopNByRankJoinAlbum2PgSqlTest() + { + var keywords = "black"; + var result = Session.Query.FreeText(keywords, 1) + .Join(Session.Query.All(), p => p.Entity.Album.AlbumId, c => c.AlbumId, (p, c) => new {p.Rank, c}); + var list = result.ToList(); + } + + [Test] + public void JoinAlbum3Test() + { + + /*[23.07.2010 13:56:17] Alexander Ustinov: (from ftx in ( + from ft in Session.Query.FreeText(() => " ") + where ft.Entity.ObjectType==typeof (Data.Rng.Customer).FullName + select new {ft.Rank, ft.Entity} + ) + join customer in Session.Query.All() on ftx.Entity.ObjectId equals customer.Id + from gasObject in Session.Query.All().Where(go => go.Customer==customer).DefaultIfEmpty() + select new RngCustomerBriefInfo { + ID = customer.Id, + Rank = ftx.Rank, + Number = gasObject==null ? String.Empty : gasObject.AccountNumber, + Name = customer.Name, + Address = AbonentMatchDataProvider.GetGasObjectAddress(gasObject) + }).Take(100).OrderByDescending(i => i.Rank).OrderByDescending(i => i.ID);*/ + var keywords = "black"; + var result = ( + from ft in Session.Query.FreeText(keywords) + join c in Session.Query.All() on ft.Entity.Album equals c + select new {ID = c.AlbumId, Rank = ft.Rank, Name = ft.Entity.Name} + ).Take(100).OrderByDescending(i => i.Rank).ThenByDescending(i => i.ID); +// var result = Session.Query.FreeText(keywords) +// .Where(p => p.Entity.ProductName != typeof(Product).Name) +// .Join(Session.Query.All(), p => p.Entity.Category.Id, c => c.Id, (p, c) => new { p.Rank, c }) +// .OrderBy(@t => @t.Rank) +// .Select(@t => new { Id = @t.c.Id, Name = @t.c.CategoryName, Rank = @t.Rank }); + var list = result.ToList(); + } + + [Test] + public void TopNByRankJoinAlbum3Test() + { + var keywords = "black"; + var result = (from ft in Session.Query.FreeText(keywords, 1) + join c in Session.Query.All() on ft.Entity.Album equals c + select new {ID = c.AlbumId, Rank = ft.Rank, Name = ft.Entity.Name} + ).Take(100).OrderByDescending(i => i.Rank).ThenByDescending(i => i.ID); + var list = result.ToList(); + } + + private static string GetTrackDescription(Track p) + { + return p.Name + ":" + p.UnitPrice; + } + + [Test] + public void JoinTracksWithRanks1Test() + { + var result = + (from c in Session.Query.FreeText(() => "black babbath back") + orderby c.Rank + select new {c.Entity, c.Rank}); + var list = result.ToList(); + Assert.AreEqual(6, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + } + } + + [Test] + public void TopNByRankJoinTracksWithRanks1Test() + { + var result = + (from c in Session.Query.FreeText(() => "black babbath back", 2) + orderby c.Rank + select new {c.Entity, c.Rank}); + var list = result.ToList(); + Assert.AreEqual(2, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + } + } + + [Test] + public void JoinTracksWithRanks2Test() + { + var result = Session.Query.FreeText(() => "black babbath back") + .OrderBy(c => c.Rank) + .Select(x => x.Entity); + var list = result.ToList(); + Assert.AreEqual(6, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + } + } + + [Test] + public void TopNByRankJoinTracksWithRanks2Test() + { + var result = Session.Query.FreeText(() => "black babbath back", 2) + .OrderBy(c => c.Rank) + .Select(x => x.Entity); + var list = result.ToList(); + Assert.AreEqual(2, list.Count); + foreach (var track in result) { + Assert.IsNotNull(track); + } + } + + [Test] + public void OrderByTest() + { + var result = from ft in Session.Query.FreeText(() => "black") + where ft.Entity.TrackId > 0 && ft.Entity.UnitPrice > 0.8m + orderby ft.Entity.Album.Title, ft.Entity.UnitPrice + select new {Track = ft.Entity, ft.Entity.Name}; + var list = result.ToList(); + Assert.AreEqual(26, list.Count); + } + + [Test] + public void TopNByRankOrderByTest() + { + var keywords = "black babbath back"; + var topNByrankOrdered = Session.Query.FreeText(keywords, 3) + .OrderBy(r => r.Rank).ToArray(); + var defaultFreeTextQuery = Session.Query.FreeText(keywords) + .AsEnumerable() + .OrderByDescending(r => r.Rank) + .Take(3) + .OrderBy(r => r.Rank) + .ToList(); + Assert.IsTrue(defaultFreeTextQuery.Count()==3); + Assert.IsTrue(topNByrankOrdered.Count()==3); + Assert.IsTrue( + defaultFreeTextQuery + .Select(rec => rec.Entity.Title) + .SequenceEqual(topNByrankOrdered.Select(rec => rec.Entity.Title))); + } + + [Test] + public void TopNByRankOrderByExpressionTest() + { + var keywords = "black babbath back"; + var topnByRankOrdered = Session.Query.FreeText(() => keywords, 3) + .OrderBy(r => r.Rank); + var defaultFreeTextQuery = Session.Query.FreeText(() => keywords) + .AsEnumerable() + .OrderByDescending(r => r.Rank) + .Take(3) + .OrderBy(r => r.Rank) + .ToList(); + Assert.IsTrue(defaultFreeTextQuery.Count()==3); + Assert.IsTrue(topnByRankOrdered.Count()==3); + Assert.IsTrue( + defaultFreeTextQuery + .Select(rec => rec.Entity.Title) + .SequenceEqual(topnByRankOrdered.Select(rec => rec.Entity.Title))); + } + + [Test] + public void TopNByRankTakeMaxTest() + { + var keywords = "black babbath back"; + var topNByRank = Session.Query.FreeText(keywords, 3).ToList(); + Assert.IsTrue(topNByRank.Count()==3); + var topNByRankTakeSameAmmount = Session.Query.FreeText(keywords, 3).Take(3).OrderByDescending(r => r.Rank); + Assert.IsTrue(topNByRankTakeSameAmmount.Count()==3); + Assert.IsTrue( + topNByRank + .Select(rec => rec.Entity.Title) + .SequenceEqual(topNByRankTakeSameAmmount.Select(rec => rec.Entity.Title))); + } + + [Test] + public void TopNByRankTakeLessThanMaxTest() + { + var keywords = "black babbath back"; + var topNByRank = Session.Query.FreeText(keywords, 3); + Assert.IsTrue(topNByRank.Count()==3); + var topNByRankTakeLess = Session.Query.FreeText(keywords, 3).Take(2).OrderByDescending(r => r.Rank).ToList(); + Assert.IsTrue(topNByRankTakeLess.Count()==2); + Assert.IsTrue( + topNByRankTakeLess + .Select(r => r.Entity.Title) + .SequenceEqual(topNByRank.Take(2).OrderByDescending(r => r.Rank).Select(r => r.Entity.Title))); + } + + [Test] + public void TopNByRankTakeMoreThanMaxTest() + { + var keywords = "black babbath back"; + var topNByRank = Session.Query.FreeText(keywords, 3); + Assert.IsTrue(topNByRank.Count()==3); + var topNByrankTakeMore = Session.Query.FreeText(keywords, 3).Take(4).OrderByDescending(r => r.Rank).ToList(); + Assert.IsTrue(topNByrankTakeMore.Count()==3); + Assert.IsTrue(topNByrankTakeMore.Select(r => r.Entity.Title).SequenceEqual(topNByRank.Select(r => r.Entity.Title))); + } + + [Test] + public void TopNByRankOrderByAndTakeSequenceTest() + { + var keywords = "black babbath back"; + var topNByRank = Session.Query.FreeText(keywords, 3).ToList(); + Assert.IsTrue(topNByRank.Count()==3); + var topNByrankOrderByAndTake = Session.Query.FreeText(keywords, 3) + .OrderBy(r => r.Rank) + .Take(3) + .OrderByDescending(r => r.Rank).Take(2).ToList(); + Assert.IsTrue(topNByrankOrderByAndTake.Count()==2); + Assert.IsTrue( + topNByRank + .Take(2) + .OrderByDescending(r => r.Rank) + .Select(r => r.Entity.Title) + .SequenceEqual(topNByrankOrderByAndTake.Select(rec => rec.Entity.Title))); + } + + [Test] + public void FreeTextOnFullTextStructureField() + { + var keywords = "Boulevard Innere Woodstock Discos"; + var result = Query.FreeText(keywords).ToList(); + Assert.AreEqual(2, result.Count); + } + + [Test] + public void FreeTextTopNByRankOnFullTextStructureField() + { + var keywords = "Rotenturmstrae Innere Stadt Woodstock Boulevard"; + var result = Query.FreeText(keywords, 2).ToList(); + var closestMatch = result.First().Entity; + Assert.AreEqual(2, result.Count); + Assert.IsTrue(closestMatch.Address.StreetAddress=="Rotenturmstrae 4, 1010 Innere Stadt"); + } + + [Test] + public void FreeTextOnStructureField() + { + var result = Query.FreeText("London").ToList(); + Assert.IsTrue(!result.Any()); + } + + private IEnumerable> TakeMatchesIncorrect(string searchCriteria) + { + return Session.Query.Execute(qe => qe.FreeText(searchCriteria)); + } + + private IEnumerable> TakeMatchesCorrect(string searchCriteria) + { + return Session.Query.Execute(qe => qe.FreeText(() => searchCriteria)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/FullTextColumnsDeclarationTest.cs b/Orm/Xtensive.Orm.Tests/Linq/FullTextColumnsDeclarationTest.cs index 93f76c7704..0bc5c38bcb 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/FullTextColumnsDeclarationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/FullTextColumnsDeclarationTest.cs @@ -1,115 +1,115 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class FullTextColumnsDeclarationTest : ChinookDOModelTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - [Test] - public void CorrectDirectFulltextFieldTest() - { - var columns = MakeUpColumns(t => t.Name); - RunQuery(columns); - } - - [Test] - public void CorrectDirectFulltextFieldsSetTest() - { - var columns = MakeUpColumns(t => t.Name, t=>t.Composer); - RunQuery(columns); - } - - [Test] - public void StructureFulltextFieldTest() - { - var columns = MakeUpColumns(t => t.Address.StreetAddress); - RunQuery(columns); - } - - [Test] - public void StructureNonFulltextFieldTest() - { - var columns = MakeUpColumns(t => t.Address.Country); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void NonPersistentFieldTest() - { - var columns = MakeUpColumns(t => t.FirstName); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void NonPersistentStructureFieldTest() - { - var columns = MakeUpColumns(t => t.Address.JustAProperty); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void EntitySetFieldTest() - { - var columns = MakeUpColumns(t => t.Invoices); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void MethodAsColumnTest() - { - var columns = MakeUpColumns(t => t.GetAge()); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void ReferencedEntityFieldTest() - { - var columns = MakeUpColumns(t => t.Album.Title); - Assert.Throws(() => RunQuery(columns)); - } - - [Test] - public void EmptyColumnsArrayTest() - { - var columns = new Expression>[0]; - Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run(); - } - - [Test] - public void NullColumnsArray() - { - Expression>[] columns = null; - Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run()); - } - - private void RunQuery(Expression>[] columns) - where T:Entity - { - Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run(); - } - - private Expression>[] MakeUpColumns(Expression> column, params Expression>[] additionalColumns) - where T : Entity - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - var columns = new List>>(); - columns.Add(column); - if (additionalColumns!=null) { - columns.AddRange(additionalColumns); - } - return columns.ToArray(); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class FullTextColumnsDeclarationTest : ChinookDOModelTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + [Test] + public void CorrectDirectFulltextFieldTest() + { + var columns = MakeUpColumns(t => t.Name); + RunQuery(columns); + } + + [Test] + public void CorrectDirectFulltextFieldsSetTest() + { + var columns = MakeUpColumns(t => t.Name, t=>t.Composer); + RunQuery(columns); + } + + [Test] + public void StructureFulltextFieldTest() + { + var columns = MakeUpColumns(t => t.Address.StreetAddress); + RunQuery(columns); + } + + [Test] + public void StructureNonFulltextFieldTest() + { + var columns = MakeUpColumns(t => t.Address.Country); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void NonPersistentFieldTest() + { + var columns = MakeUpColumns(t => t.FirstName); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void NonPersistentStructureFieldTest() + { + var columns = MakeUpColumns(t => t.Address.JustAProperty); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void EntitySetFieldTest() + { + var columns = MakeUpColumns(t => t.Invoices); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void MethodAsColumnTest() + { + var columns = MakeUpColumns(t => t.GetAge()); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void ReferencedEntityFieldTest() + { + var columns = MakeUpColumns(t => t.Album.Title); + Assert.Throws(() => RunQuery(columns)); + } + + [Test] + public void EmptyColumnsArrayTest() + { + var columns = new Expression>[0]; + Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run(); + } + + [Test] + public void NullColumnsArray() + { + Expression>[] columns = null; + Assert.Throws(() => Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run()); + } + + private void RunQuery(Expression>[] columns) + where T:Entity + { + Session.Query.ContainsTable(e => e.SimpleTerm("abc"), columns).Run(); + } + + private Expression>[] MakeUpColumns(Expression> column, params Expression>[] additionalColumns) + where T : Entity + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + var columns = new List>>(); + columns.Add(column); + if (additionalColumns!=null) { + columns.AddRange(additionalColumns); + } + return columns.ToArray(); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/GroupByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/GroupByTest.cs index 76c04ed71f..f72136b121 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/GroupByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/GroupByTest.cs @@ -1,1050 +1,1050 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.02.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Tuples; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class GroupByTest : ChinookDOModelTest - { - [Test] - public void NullableGroupingKeyTest() - { - var grouping = Session.Query.All().GroupBy(i => i.ProcessingTime).FirstOrDefault(g=>g.Key==null); - Assert.IsNotNull(grouping); - Assert.IsTrue(grouping.Count()> 0); - } - - [Test] - public void EntityWithLazyLoadFieldTest() - { - var track = Session.Query.All() - .GroupBy(t => t.MediaType) - .First() - .Key; - var columnIndex = Domain.Model.Types[typeof (MediaType)].Fields["Name"].MappingInfo.Offset; - Assert.IsTrue(track.State.Tuple.GetFieldState(columnIndex).IsAvailable()); - } - - [Test] - public void AggregateAfterGroupingTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .GroupBy(t => t.MediaType) - .Select(g => g.Where(p2 => p2.UnitPrice==g.Count())); - - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - - [Test] - public void AggregateAfterGroupingAnonymousTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .GroupBy(t => t.MediaType) - .Select(g => new { - CheapestTracks = - g.Where(t => t.UnitPrice==g.Count()) - }); - - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - - [Test] - public void SimpleTest() - { - var result = Session.Query.All().GroupBy(t => t.UnitPrice); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithWhereTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var query = - Session.Query.All() - .GroupBy(track => track.TrackId) - .Where(grouping => true) - .Select(tracks => tracks.Count()); - - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - - [Test] - public void GroupingAsQueryableTest() - { - var result = Session.Query.All().GroupBy(t => t.UnitPrice); - Assert.That(result, Is.Not.Empty); - foreach (IGrouping grouping in result) - Assert.IsTrue(grouping.GetType().IsOfGenericInterface(typeof (IQueryable<>))); - } - - [Test] - public void SimpleEntityGroupTest() - { - var result = Session.Query.All().GroupBy(t => t); - Assert.That(result, Is.Not.Empty); - DumpGrouping(result); - } - - [Test] - public void EntityGroupWithOrderTest() - { - var result = Session.Query.All().GroupBy(t =>t).OrderBy(g => g.Key.TrackId); - var resultList = result.ToList(); - var expectedList = Session.Query.All().ToList().GroupBy(t => t).OrderBy(g => g.Key.TrackId).ToList(); - Assert.That(resultList, Is.Not.Empty); - Assert.AreEqual(resultList.Count, expectedList.Count()); - for (var i = 0; i < resultList.Count; i++) { - Assert.AreEqual(expectedList[i].Key, resultList[i].Key); - Assert.AreEqual(expectedList[i].Count(), resultList[i].Count()); - Assert.AreEqual(expectedList[i].Count(), resultList[i].AsQueryable().Count()); - } - DumpGrouping(result); - } - - [Test] - public void EntityGroupSimpleTest() - { - var groupByResult = Session.Query.All().GroupBy(t => t.MediaType); - Assert.That(groupByResult, Is.Not.Empty); - DumpGrouping(groupByResult); - } - - [Test] - public void EntityGroupTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var groupByResult = Session.Query.All().GroupBy(t => t.MediaType); - IEnumerable result = groupByResult - .ToList() - .Select(g => g.Key); - IEnumerable expectedKeys = Session.Query.All() - .Select(p => p.MediaType) - .Distinct() - .ToList(); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(t => t.MediaType==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - DumpGrouping(groupByResult); - } - - [Test] - public void EntityKeyGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(t => t.MediaType.Key); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(t => t.MediaType.Key) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(t => t.MediaType.Key==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void EntityFieldGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(t => t.MediaType.Name); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(t => t.MediaType.Name) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(t => t.MediaType.Name==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void StructureGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(customer => customer.Address); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(customer => customer.Address) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(customer => customer.Address==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - - [Test] - public void StructureGroupWithNullFieldTest() - { - var customer = Session.Query.All().First(); - customer.Address.Country = null; - Session.Current.SaveChanges(); - StructureGroupTest(); - } - - [Test] - public void AnonymousTypeGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(customer => new {customer.Address.City, customer.Address.Country}); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(customer => new {customer.Address.City, customer.Address.Country}) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(customer => new {customer.Address.City, customer.Address.Country}==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void AnonymousTypeEntityAndStructureGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(employee => new {employee.Address}); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(employee => new {employee.Address}) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(employee => new {employee.Address}==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void AnonymousStructureGroupTest() - { - var groupByResult = Session.Query.All().GroupBy(customer => new {customer.Address}); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(customer => new {customer.Address}) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(customer => new {customer.Address}==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void AnonymousTypeEntityAndFieldTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var groupByResult = Session.Query.All().GroupBy(t => new { - t.MediaType, - t.MediaType.Name, - }); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(t => new { - t.MediaType, - t.MediaType.Name, - }) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(t => new { - t.MediaType, - t.MediaType.Name, - }==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void AnonymousTypeEntityGroupTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var groupByResult = Session.Query.All().GroupBy(t => new {t.MediaType}); - var list = groupByResult.ToList(); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(t => new {t.MediaType}) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(t => new {t.MediaType}==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void DefaultTest() - { - var groupByResult = Session.Query.All().GroupBy(customer => customer.Address.City); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(customer => customer.Address.City) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(customer => customer.Address.City==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void FilterGroupingByKeyTest() - { - var groupByResult = Session.Query.All() - .GroupBy(i => i.BillingAddress.City) - .Where(grouping => grouping.Key.StartsWith("L")); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(i => i.BillingAddress.City) - .Where(city => city.StartsWith("L")) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(i => i.BillingAddress.City==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void FilterGroupingByCountAggregateTest() - { - var groupByResult = Session.Query.All() - .GroupBy(i => i.BillingAddress.City) - .Where(g => g.Count() > 1); - var result = groupByResult - .ToList() - .Select(g => g.Key); - var expectedKeys = Session.Query.All() - .Select(i => i.BillingAddress.City) - .Where(city => city.StartsWith("L")) - .Distinct() - .ToList(); - Assert.That(result, Is.Not.Empty); - - foreach (var grouping in groupByResult) { - var items = Session.Query.All() - .Where(i => i.BillingAddress.City==grouping.Key) - .ToList(); - Assert.AreEqual(0, items.Except(grouping).Count()); - } - Assert.AreEqual(0, expectedKeys.Except(result).Count()); - DumpGrouping(groupByResult); - } - - [Test] - public void FilterGroupingBySumAggregateTest() - { - var queryable = Session.Query.All().GroupBy(i => i.BillingAddress.City); - - var groupByResult = queryable.Where(city => city.Sum(i => i.Commission) > 2); - - var groupByAlternativeResult = queryable.Where(city => city.Sum(i => i.Commission) <= 2); - - Assert.AreEqual(queryable.Count(), groupByResult.Count() + groupByAlternativeResult.Count()); - - Assert.That(groupByResult, Is.Not.Empty); - Assert.That(groupByAlternativeResult, Is.Not.Empty); - - foreach (IGrouping grouping in groupByResult) { - var sum = grouping.ToList().Sum(i => i.Commission); - Assert.IsTrue(sum > 2); - } - - foreach (IGrouping grouping in groupByAlternativeResult) { - var sum = grouping.ToList().Sum(i => i.Commission); - Assert.IsTrue(sum <= 2); - } - - DumpGrouping(groupByResult); - } - - [Test] - public void GroupByWhereTest() - { - var queryable = Session.Query.All().GroupBy(i => i.BillingAddress.City); - var result = queryable.Where(g => g.Key.StartsWith("L") && g.Count() > 2); - var alternativeResult = queryable.Where(g => !g.Key.StartsWith("L") || g.Count() <= 2); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(queryable.Count(), result.Count() + alternativeResult.Count()); - - foreach (IGrouping grouping in result) { - var startsWithL = grouping.Key.StartsWith("L"); - var countGreater2 = grouping.ToList().Count() > 2; - Assert.IsTrue(startsWithL && countGreater2); - } - - foreach (IGrouping grouping in alternativeResult) { - var startsWithL = grouping.Key.StartsWith("L"); - var countGreater2 = grouping.ToList().Count() > 2; - Assert.IsTrue(!(startsWithL && countGreater2)); - } - - DumpGrouping(result); - } - - [Test] - public void GroupByWhere2Test() - { - IQueryable> result = Session.Query.All() - .GroupBy(o => o.BillingAddress.City) - .Select(g => g.Where(o => o.Commission > 0)); - Assert.That(result, Is.Not.Empty); - - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectTest() - { - var groupBy = Session.Query.All().GroupBy(t => t.Name); - var result = groupBy.Select(g => g); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); - DumpGrouping(result); - } - - [Test] - public void GroupBySelectWithAnonymousTest() - { - var groupBy = Session.Query.All().GroupBy(t => t.Name); - var result = groupBy.Select(g => new {g}); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectKeyTest() - { - var groupBy = Session.Query.All().GroupBy(t => t.Name); - IQueryable result = groupBy.Select(g => g.Key); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectKeyWithSelectCalculableColumnTest() - { - IQueryable result = Session.Query.All().GroupBy(t => t.Name).Select(g => g.Key + "String"); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectKeyWithCalculableColumnTest() - { - var result = Session.Query.All().GroupBy(t => t.Name + "String"); - var list = result.ToList(); - Assert.That(result, Is.Not.Empty); - DumpGrouping(result); - } - - [Test] - public void GroupByWithSelectFirstTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => g.First()); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectGroupingTest() - { - var result = Session.Query.All() - .GroupBy(o => o.Customer) - .Select(g => g); - Assert.That(result, Is.Not.Empty); - DumpGrouping(result); - } - - [Test] - public void GroupBySelectManyTest() - { - var result = Session.Query.All() - .GroupBy(c => c.Address.City) - .SelectMany(g => g); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySelectManyKeyTest() - { - var result = Session.Query.All() - .GroupBy(c => c.Address.City) - .SelectMany(g => g.Key); - Assert.Throws(() => QueryDumper.Dump(result)); - } - - [Test] - public void GroupByEntitySelectManyTest() - { - var result = Session.Query.All() - .GroupBy(o => o.Customer) - .SelectMany(g => g); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySumTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer.FirstName) - .Select(g => g.Sum(i => i.Commission)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByCountTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(o => o.Customer) - .Select(g => new {Customer = g.Key, InvoicesCount = g.Count()}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithFilterTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Customer = g.Key, Invoices = g.Where(i => i.InvoiceDate < DateTime.Now)}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupBySumMinMaxAvgTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => - new { - Sum = g.Sum(o => o.Commission), - Min = g.Min(o => o.Commission), - Max = g.Max(o => o.Commission), - Avg = g.Average(o => o.Commission) - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithConstantResultSelectorTest() - { - var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => - new { - ConstString = "ConstantString" - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithConstantSelectorTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => - new { - ConstString = "ConstantString" - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithAnonymousSelectTest() - { - IQueryable> groupings = Session.Query.All().GroupBy(o => o.Customer); - var result = groupings.Select(g => new {g}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelectorTest() - { - var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) =>c); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - [Test] - public void GroupByWithEntityResultSelector2Test() - { - var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => - new { - Customer = c, - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithEntityResultSelector3Test() - { - IQueryable> result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => g); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByBooleanTest() - { - var result = Session.Query.All().GroupBy(c => c.FirstName.StartsWith("A")); - var expected = Session.Query.All().AsEnumerable().GroupBy(c => c.FirstName.StartsWith("A")); - - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.Select(g => g.Key).OrderBy(k => k) - .SequenceEqual(result.AsEnumerable().Select(g => g.Key).OrderBy(k => k))); - foreach (var group in expected) - Assert.IsTrue(expected.Where(g => g.Key==group.Key) - .SelectMany(g => g).OrderBy(i => i.CustomerId) - .SequenceEqual(result.AsEnumerable() - .Where(g => g.Key==group.Key).SelectMany(g => g).OrderBy(i => i.CustomerId))); - } - - [Test] - public void GroupByBooleanSubquery1Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All().GroupBy(c => c.Invoices.Count > 5); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.That(list.Any(c => c.Any(cc => cc.Invoices.Count > 5))); - DumpGrouping(result); - } - - [Test] - public void GroupByBooleanSubquery2Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Where(c => c.Invoices.Count > 0) - .GroupBy(c => c.Invoices.Average(o => o.Commission) >= 0.4m); - Assert.That(result, Is.Not.Empty); - DumpGrouping(result); - } - - [Test] - public void GroupByWithAggregateResultSelectorTest() - { - IQueryable result = Session.Query.All().GroupBy(i => i.Commission, (c, g) => g.Count()); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithAnonymousResultSelector5Test() - { - var result = Session.Query.All().GroupBy(i => i.Commission, (c, g) => new {Count = g.Count(), Customer = c}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithEntityResultSelector5BisTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Commission) - .Select(g => new {Count = g.Count(), Commission = g.Key}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(o => o.Customer) - .Select(g => new {Count = g.Count(), Customer = g.Key}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis20Test() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => g.Key.CompanyName); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis22Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Count = g.Count(), Customer = g.Key.CompanyName}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis23Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Count = g.Count(), Customer = g.Key}) - .Where(g => g.Customer.CompanyName!=null); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis24Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Count = g.Count(), Customer = g.Key}) - .OrderBy(g => g.Customer.CompanyName); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithEntityResultSelector5Bis212Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Count = new {Count1 = g.Count(), Count2 = g.Count()}}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithEntityResultSelector5Bis21Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new {Count = new {Count1 = g.Count(), Count2 = g.Count()}, Customer = g.Key}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - - [Test] - public void GroupByWithEntityResultSelector5Bis3Test() - { - var result = Session.Query.All() - .GroupBy(i => new {i.InvoiceDate, i.Commission}) - .Select(g => new {Count = g.Count(), InvoiceInfo = g.Key}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithResultSelectorTest2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => - new { - Customer = c, - Sum = g.Sum(i => i.Commission), - Min = g.Min(i => i.Commission), - Max = g.Max(i => i.Commission), - Avg = g.Average(i => i.Commission) - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithResultSelectorTest3Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Select(g => new { - Sum = g.Sum(i => i.Commission), - Min = g.Min(i => i.Commission), - Max = g.Max(i => i.Commission), - Avg = g.Average(i => i.Commission) - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithResultSelectorTest4Test() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => - new { - // Customer = c, - Sum = g.Sum(i => i.Commission), - Min = g.Min(i => i.Commission), - Max = g.Max(i => i.Commission), - Avg = g.Average(i => i.Commission) - }); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithElementSelectorSumTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer, i => i.Commission) - .Select(g => g.Sum()); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithElementSelectorSumAnonymousTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer, i => i.Commission) - .Select(g => new {A = g.Sum(), B = g.Sum()}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithElementSelectorTest() - { - var result = Session.Query.All().GroupBy(i => i.Customer, i => i.Commission); - Assert.That(result, Is.Not.Empty); - DumpGrouping(result); - } - - [Test] - public void GroupByWithElementSelectorSumMaxTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer.CustomerId, i => i.Commission) - .Select(g => new {Sum = g.Sum(), Max = g.Max()}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithAnonymousElementTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var result = Session.Query.All() - .GroupBy(i => i.Customer, i => new {i.Commission}) - .Select(g => g.Sum(i => i.Commission)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByWithTwoPartKeyTest() - { - var result = Session.Query.All() - .GroupBy(i => new {i.Customer.CustomerId, i.InvoiceDate}) - .Select(g => g.Sum(i => i.Commission)); - QueryDumper.Dump(result); - } - - [Test] - public void OrderByGroupByTest() - { - // NOTE: Order-by is lost when group-by is applied (the sequence of groups is not ordered) - var result = Session.Query.All() - .OrderBy(i => i.InvoiceDate) - .GroupBy(i => i.Customer.CustomerId) - .Select(g => g.Sum(i => i.Commission)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void OrderByGroupBySelectManyTest() - { - // NOTE: Order-by is preserved within grouped sub-collections - var result = Session.Query.All() - .OrderBy(i => i.InvoiceDate) - .GroupBy(i => i.Customer.CustomerId) - .SelectMany(g => g); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void FilterGroupingTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Album) - .Select(g => g.Where(i => i.Name.StartsWith("A"))); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void GroupWithJoinTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var query = Session.Query.All() - .GroupBy(c => c.Address.Country) - .Join(Session.Query.All(), - country => country.Key, - c2 => c2.Address.Country, - (country, c2) => new { - country = country.Key, - total = c2.Invoices.Sum(i => i.Commission) - }); - - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - - private void DumpGrouping(IQueryable> result) - { - DumpGrouping(result, false); - } - - private void DumpGrouping(IQueryable> result, bool logOutput) - { - // Just enumerate - foreach (IGrouping grouping in result) { - foreach (var group in grouping) { - int i = 10; - } - } - - // Check - var list = result.ToList(); - Assert.Greater(list.Count, 0); - Assert.AreEqual(list.Count, result.Count()); - foreach (var grouping in result) { - Assert.IsNotNull(grouping.Key); - var count = grouping.ToList().Count(); - Assert.AreEqual(count, grouping.Count()); - Assert.AreEqual(count, grouping.AsQueryable().Count()); - } - if (logOutput) - QueryDumper.Dump(result); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.02.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Tuples; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class GroupByTest : ChinookDOModelTest + { + [Test] + public void NullableGroupingKeyTest() + { + var grouping = Session.Query.All().GroupBy(i => i.ProcessingTime).FirstOrDefault(g=>g.Key==null); + Assert.IsNotNull(grouping); + Assert.IsTrue(grouping.Count()> 0); + } + + [Test] + public void EntityWithLazyLoadFieldTest() + { + var track = Session.Query.All() + .GroupBy(t => t.MediaType) + .First() + .Key; + var columnIndex = Domain.Model.Types[typeof (MediaType)].Fields["Name"].MappingInfo.Offset; + Assert.IsTrue(track.State.Tuple.GetFieldState(columnIndex).IsAvailable()); + } + + [Test] + public void AggregateAfterGroupingTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .GroupBy(t => t.MediaType) + .Select(g => g.Where(p2 => p2.UnitPrice==g.Count())); + + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + + [Test] + public void AggregateAfterGroupingAnonymousTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .GroupBy(t => t.MediaType) + .Select(g => new { + CheapestTracks = + g.Where(t => t.UnitPrice==g.Count()) + }); + + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + + [Test] + public void SimpleTest() + { + var result = Session.Query.All().GroupBy(t => t.UnitPrice); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithWhereTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var query = + Session.Query.All() + .GroupBy(track => track.TrackId) + .Where(grouping => true) + .Select(tracks => tracks.Count()); + + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + + [Test] + public void GroupingAsQueryableTest() + { + var result = Session.Query.All().GroupBy(t => t.UnitPrice); + Assert.That(result, Is.Not.Empty); + foreach (IGrouping grouping in result) + Assert.IsTrue(grouping.GetType().IsOfGenericInterface(typeof (IQueryable<>))); + } + + [Test] + public void SimpleEntityGroupTest() + { + var result = Session.Query.All().GroupBy(t => t); + Assert.That(result, Is.Not.Empty); + DumpGrouping(result); + } + + [Test] + public void EntityGroupWithOrderTest() + { + var result = Session.Query.All().GroupBy(t =>t).OrderBy(g => g.Key.TrackId); + var resultList = result.ToList(); + var expectedList = Session.Query.All().ToList().GroupBy(t => t).OrderBy(g => g.Key.TrackId).ToList(); + Assert.That(resultList, Is.Not.Empty); + Assert.AreEqual(resultList.Count, expectedList.Count()); + for (var i = 0; i < resultList.Count; i++) { + Assert.AreEqual(expectedList[i].Key, resultList[i].Key); + Assert.AreEqual(expectedList[i].Count(), resultList[i].Count()); + Assert.AreEqual(expectedList[i].Count(), resultList[i].AsQueryable().Count()); + } + DumpGrouping(result); + } + + [Test] + public void EntityGroupSimpleTest() + { + var groupByResult = Session.Query.All().GroupBy(t => t.MediaType); + Assert.That(groupByResult, Is.Not.Empty); + DumpGrouping(groupByResult); + } + + [Test] + public void EntityGroupTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var groupByResult = Session.Query.All().GroupBy(t => t.MediaType); + IEnumerable result = groupByResult + .ToList() + .Select(g => g.Key); + IEnumerable expectedKeys = Session.Query.All() + .Select(p => p.MediaType) + .Distinct() + .ToList(); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(t => t.MediaType==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + DumpGrouping(groupByResult); + } + + [Test] + public void EntityKeyGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(t => t.MediaType.Key); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(t => t.MediaType.Key) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(t => t.MediaType.Key==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void EntityFieldGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(t => t.MediaType.Name); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(t => t.MediaType.Name) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(t => t.MediaType.Name==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void StructureGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(customer => customer.Address); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(customer => customer.Address) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(customer => customer.Address==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + + [Test] + public void StructureGroupWithNullFieldTest() + { + var customer = Session.Query.All().First(); + customer.Address.Country = null; + Session.Current.SaveChanges(); + StructureGroupTest(); + } + + [Test] + public void AnonymousTypeGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(customer => new {customer.Address.City, customer.Address.Country}); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(customer => new {customer.Address.City, customer.Address.Country}) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(customer => new {customer.Address.City, customer.Address.Country}==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void AnonymousTypeEntityAndStructureGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(employee => new {employee.Address}); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(employee => new {employee.Address}) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(employee => new {employee.Address}==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void AnonymousStructureGroupTest() + { + var groupByResult = Session.Query.All().GroupBy(customer => new {customer.Address}); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(customer => new {customer.Address}) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(customer => new {customer.Address}==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void AnonymousTypeEntityAndFieldTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var groupByResult = Session.Query.All().GroupBy(t => new { + t.MediaType, + t.MediaType.Name, + }); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(t => new { + t.MediaType, + t.MediaType.Name, + }) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(t => new { + t.MediaType, + t.MediaType.Name, + }==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void AnonymousTypeEntityGroupTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var groupByResult = Session.Query.All().GroupBy(t => new {t.MediaType}); + var list = groupByResult.ToList(); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(t => new {t.MediaType}) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(t => new {t.MediaType}==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void DefaultTest() + { + var groupByResult = Session.Query.All().GroupBy(customer => customer.Address.City); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(customer => customer.Address.City) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(customer => customer.Address.City==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void FilterGroupingByKeyTest() + { + var groupByResult = Session.Query.All() + .GroupBy(i => i.BillingAddress.City) + .Where(grouping => grouping.Key.StartsWith("L")); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(i => i.BillingAddress.City) + .Where(city => city.StartsWith("L")) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(i => i.BillingAddress.City==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void FilterGroupingByCountAggregateTest() + { + var groupByResult = Session.Query.All() + .GroupBy(i => i.BillingAddress.City) + .Where(g => g.Count() > 1); + var result = groupByResult + .ToList() + .Select(g => g.Key); + var expectedKeys = Session.Query.All() + .Select(i => i.BillingAddress.City) + .Where(city => city.StartsWith("L")) + .Distinct() + .ToList(); + Assert.That(result, Is.Not.Empty); + + foreach (var grouping in groupByResult) { + var items = Session.Query.All() + .Where(i => i.BillingAddress.City==grouping.Key) + .ToList(); + Assert.AreEqual(0, items.Except(grouping).Count()); + } + Assert.AreEqual(0, expectedKeys.Except(result).Count()); + DumpGrouping(groupByResult); + } + + [Test] + public void FilterGroupingBySumAggregateTest() + { + var queryable = Session.Query.All().GroupBy(i => i.BillingAddress.City); + + var groupByResult = queryable.Where(city => city.Sum(i => i.Commission) > 2); + + var groupByAlternativeResult = queryable.Where(city => city.Sum(i => i.Commission) <= 2); + + Assert.AreEqual(queryable.Count(), groupByResult.Count() + groupByAlternativeResult.Count()); + + Assert.That(groupByResult, Is.Not.Empty); + Assert.That(groupByAlternativeResult, Is.Not.Empty); + + foreach (IGrouping grouping in groupByResult) { + var sum = grouping.ToList().Sum(i => i.Commission); + Assert.IsTrue(sum > 2); + } + + foreach (IGrouping grouping in groupByAlternativeResult) { + var sum = grouping.ToList().Sum(i => i.Commission); + Assert.IsTrue(sum <= 2); + } + + DumpGrouping(groupByResult); + } + + [Test] + public void GroupByWhereTest() + { + var queryable = Session.Query.All().GroupBy(i => i.BillingAddress.City); + var result = queryable.Where(g => g.Key.StartsWith("L") && g.Count() > 2); + var alternativeResult = queryable.Where(g => !g.Key.StartsWith("L") || g.Count() <= 2); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(queryable.Count(), result.Count() + alternativeResult.Count()); + + foreach (IGrouping grouping in result) { + var startsWithL = grouping.Key.StartsWith("L"); + var countGreater2 = grouping.ToList().Count() > 2; + Assert.IsTrue(startsWithL && countGreater2); + } + + foreach (IGrouping grouping in alternativeResult) { + var startsWithL = grouping.Key.StartsWith("L"); + var countGreater2 = grouping.ToList().Count() > 2; + Assert.IsTrue(!(startsWithL && countGreater2)); + } + + DumpGrouping(result); + } + + [Test] + public void GroupByWhere2Test() + { + IQueryable> result = Session.Query.All() + .GroupBy(o => o.BillingAddress.City) + .Select(g => g.Where(o => o.Commission > 0)); + Assert.That(result, Is.Not.Empty); + + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectTest() + { + var groupBy = Session.Query.All().GroupBy(t => t.Name); + var result = groupBy.Select(g => g); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); + DumpGrouping(result); + } + + [Test] + public void GroupBySelectWithAnonymousTest() + { + var groupBy = Session.Query.All().GroupBy(t => t.Name); + var result = groupBy.Select(g => new {g}); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectKeyTest() + { + var groupBy = Session.Query.All().GroupBy(t => t.Name); + IQueryable result = groupBy.Select(g => g.Key); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(groupBy.ToList().Count(), result.ToList().Count()); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectKeyWithSelectCalculableColumnTest() + { + IQueryable result = Session.Query.All().GroupBy(t => t.Name).Select(g => g.Key + "String"); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectKeyWithCalculableColumnTest() + { + var result = Session.Query.All().GroupBy(t => t.Name + "String"); + var list = result.ToList(); + Assert.That(result, Is.Not.Empty); + DumpGrouping(result); + } + + [Test] + public void GroupByWithSelectFirstTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => g.First()); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectGroupingTest() + { + var result = Session.Query.All() + .GroupBy(o => o.Customer) + .Select(g => g); + Assert.That(result, Is.Not.Empty); + DumpGrouping(result); + } + + [Test] + public void GroupBySelectManyTest() + { + var result = Session.Query.All() + .GroupBy(c => c.Address.City) + .SelectMany(g => g); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySelectManyKeyTest() + { + var result = Session.Query.All() + .GroupBy(c => c.Address.City) + .SelectMany(g => g.Key); + Assert.Throws(() => QueryDumper.Dump(result)); + } + + [Test] + public void GroupByEntitySelectManyTest() + { + var result = Session.Query.All() + .GroupBy(o => o.Customer) + .SelectMany(g => g); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySumTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer.FirstName) + .Select(g => g.Sum(i => i.Commission)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByCountTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(o => o.Customer) + .Select(g => new {Customer = g.Key, InvoicesCount = g.Count()}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithFilterTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Customer = g.Key, Invoices = g.Where(i => i.InvoiceDate < DateTime.Now)}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupBySumMinMaxAvgTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => + new { + Sum = g.Sum(o => o.Commission), + Min = g.Min(o => o.Commission), + Max = g.Max(o => o.Commission), + Avg = g.Average(o => o.Commission) + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithConstantResultSelectorTest() + { + var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => + new { + ConstString = "ConstantString" + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithConstantSelectorTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => + new { + ConstString = "ConstantString" + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithAnonymousSelectTest() + { + IQueryable> groupings = Session.Query.All().GroupBy(o => o.Customer); + var result = groupings.Select(g => new {g}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelectorTest() + { + var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) =>c); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + [Test] + public void GroupByWithEntityResultSelector2Test() + { + var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => + new { + Customer = c, + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithEntityResultSelector3Test() + { + IQueryable> result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => g); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByBooleanTest() + { + var result = Session.Query.All().GroupBy(c => c.FirstName.StartsWith("A")); + var expected = Session.Query.All().AsEnumerable().GroupBy(c => c.FirstName.StartsWith("A")); + + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.Select(g => g.Key).OrderBy(k => k) + .SequenceEqual(result.AsEnumerable().Select(g => g.Key).OrderBy(k => k))); + foreach (var group in expected) + Assert.IsTrue(expected.Where(g => g.Key==group.Key) + .SelectMany(g => g).OrderBy(i => i.CustomerId) + .SequenceEqual(result.AsEnumerable() + .Where(g => g.Key==group.Key).SelectMany(g => g).OrderBy(i => i.CustomerId))); + } + + [Test] + public void GroupByBooleanSubquery1Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All().GroupBy(c => c.Invoices.Count > 5); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.That(list.Any(c => c.Any(cc => cc.Invoices.Count > 5))); + DumpGrouping(result); + } + + [Test] + public void GroupByBooleanSubquery2Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Where(c => c.Invoices.Count > 0) + .GroupBy(c => c.Invoices.Average(o => o.Commission) >= 0.4m); + Assert.That(result, Is.Not.Empty); + DumpGrouping(result); + } + + [Test] + public void GroupByWithAggregateResultSelectorTest() + { + IQueryable result = Session.Query.All().GroupBy(i => i.Commission, (c, g) => g.Count()); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithAnonymousResultSelector5Test() + { + var result = Session.Query.All().GroupBy(i => i.Commission, (c, g) => new {Count = g.Count(), Customer = c}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithEntityResultSelector5BisTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Commission) + .Select(g => new {Count = g.Count(), Commission = g.Key}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(o => o.Customer) + .Select(g => new {Count = g.Count(), Customer = g.Key}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis20Test() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => g.Key.CompanyName); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis22Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Count = g.Count(), Customer = g.Key.CompanyName}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis23Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Count = g.Count(), Customer = g.Key}) + .Where(g => g.Customer.CompanyName!=null); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis24Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Count = g.Count(), Customer = g.Key}) + .OrderBy(g => g.Customer.CompanyName); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithEntityResultSelector5Bis212Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Count = new {Count1 = g.Count(), Count2 = g.Count()}}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithEntityResultSelector5Bis21Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new {Count = new {Count1 = g.Count(), Count2 = g.Count()}, Customer = g.Key}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + + [Test] + public void GroupByWithEntityResultSelector5Bis3Test() + { + var result = Session.Query.All() + .GroupBy(i => new {i.InvoiceDate, i.Commission}) + .Select(g => new {Count = g.Count(), InvoiceInfo = g.Key}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithResultSelectorTest2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => + new { + Customer = c, + Sum = g.Sum(i => i.Commission), + Min = g.Min(i => i.Commission), + Max = g.Max(i => i.Commission), + Avg = g.Average(i => i.Commission) + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithResultSelectorTest3Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Select(g => new { + Sum = g.Sum(i => i.Commission), + Min = g.Min(i => i.Commission), + Max = g.Max(i => i.Commission), + Avg = g.Average(i => i.Commission) + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithResultSelectorTest4Test() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All().GroupBy(i => i.Customer, (c, g) => + new { + // Customer = c, + Sum = g.Sum(i => i.Commission), + Min = g.Min(i => i.Commission), + Max = g.Max(i => i.Commission), + Avg = g.Average(i => i.Commission) + }); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithElementSelectorSumTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer, i => i.Commission) + .Select(g => g.Sum()); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithElementSelectorSumAnonymousTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer, i => i.Commission) + .Select(g => new {A = g.Sum(), B = g.Sum()}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithElementSelectorTest() + { + var result = Session.Query.All().GroupBy(i => i.Customer, i => i.Commission); + Assert.That(result, Is.Not.Empty); + DumpGrouping(result); + } + + [Test] + public void GroupByWithElementSelectorSumMaxTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer.CustomerId, i => i.Commission) + .Select(g => new {Sum = g.Sum(), Max = g.Max()}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithAnonymousElementTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var result = Session.Query.All() + .GroupBy(i => i.Customer, i => new {i.Commission}) + .Select(g => g.Sum(i => i.Commission)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByWithTwoPartKeyTest() + { + var result = Session.Query.All() + .GroupBy(i => new {i.Customer.CustomerId, i.InvoiceDate}) + .Select(g => g.Sum(i => i.Commission)); + QueryDumper.Dump(result); + } + + [Test] + public void OrderByGroupByTest() + { + // NOTE: Order-by is lost when group-by is applied (the sequence of groups is not ordered) + var result = Session.Query.All() + .OrderBy(i => i.InvoiceDate) + .GroupBy(i => i.Customer.CustomerId) + .Select(g => g.Sum(i => i.Commission)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void OrderByGroupBySelectManyTest() + { + // NOTE: Order-by is preserved within grouped sub-collections + var result = Session.Query.All() + .OrderBy(i => i.InvoiceDate) + .GroupBy(i => i.Customer.CustomerId) + .SelectMany(g => g); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void FilterGroupingTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Album) + .Select(g => g.Where(i => i.Name.StartsWith("A"))); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void GroupWithJoinTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var query = Session.Query.All() + .GroupBy(c => c.Address.Country) + .Join(Session.Query.All(), + country => country.Key, + c2 => c2.Address.Country, + (country, c2) => new { + country = country.Key, + total = c2.Invoices.Sum(i => i.Commission) + }); + + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + + private void DumpGrouping(IQueryable> result) + { + DumpGrouping(result, false); + } + + private void DumpGrouping(IQueryable> result, bool logOutput) + { + // Just enumerate + foreach (IGrouping grouping in result) { + foreach (var group in grouping) { + int i = 10; + } + } + + // Check + var list = result.ToList(); + Assert.Greater(list.Count, 0); + Assert.AreEqual(list.Count, result.Count()); + foreach (var grouping in result) { + Assert.IsNotNull(grouping.Key); + var count = grouping.ToList().Count(); + Assert.AreEqual(count, grouping.Count()); + Assert.AreEqual(count, grouping.AsQueryable().Count()); + } + if (logOutput) + QueryDumper.Dump(result); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/GroupByTwoEntitiesWithSameColumnsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/GroupByTwoEntitiesWithSameColumnsTest.cs index 96026a744f..bb85d08466 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/GroupByTwoEntitiesWithSameColumnsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/GroupByTwoEntitiesWithSameColumnsTest.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.06 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.GroupByTwoEntitiesWithSameColumnsTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace GroupByTwoEntitiesWithSameColumnsTestModel - { - [HierarchyRoot] - public class GroupedEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Ref1 Ref1 { get; set; } - - [Field] - public Ref2 Ref2 { get; set; } - } - - [HierarchyRoot] - public class Ref1 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value { get; set; } - } - - [HierarchyRoot] - public class Ref2 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value { get; set; } - } - } - - public class GroupByTwoEntitiesWithSameColumnsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (GroupedEntity)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from e in session.Query.All() - group e by new {e.Ref1, e.Ref2, V1 = e.Ref1.Value, V2 = e.Ref2.Value} - into g - select g; - var result = query.ToList(); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.06 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.GroupByTwoEntitiesWithSameColumnsTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace GroupByTwoEntitiesWithSameColumnsTestModel + { + [HierarchyRoot] + public class GroupedEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Ref1 Ref1 { get; set; } + + [Field] + public Ref2 Ref2 { get; set; } + } + + [HierarchyRoot] + public class Ref1 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value { get; set; } + } + + [HierarchyRoot] + public class Ref2 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value { get; set; } + } + } + + public class GroupByTwoEntitiesWithSameColumnsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (GroupedEntity)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from e in session.Query.All() + group e by new {e.Ref1, e.Ref2, V1 = e.Ref1.Value, V2 = e.Ref2.Value} + into g + select g; + var result = query.ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/InOverSubtypeColumnTest.cs b/Orm/Xtensive.Orm.Tests/Linq/InOverSubtypeColumnTest.cs index 18a9a2c142..1111011ffd 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/InOverSubtypeColumnTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/InOverSubtypeColumnTest.cs @@ -1,137 +1,137 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.07 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.InOverSubtypeColumnTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace InOverSubtypeColumnTestModel - { - [HierarchyRoot] - public class MainEntity : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public RefBase Reference { get; set; } - - public string Info - { - get - { - var refObj = Reference as Ref; - if (refObj==null) - return null; - return refObj.Info; - } - } - } - - [HierarchyRoot] - public class RefBase : Entity - { - [Key, Field] - public long Id { get; set; } - } - - public class Ref : RefBase - { - [Field] - public string Info { get; set; } - } - - [CompilerContainer(typeof (Expression))] - public static class Container - { - [Compiler(typeof (MainEntity), "Info", TargetKind.PropertyGet)] - public static Expression Info(Expression _this) - { - Expression> expr = e => (e.Reference as Ref).Info; - return expr.BindParameters(_this); - } - } - } - - public class InOverSubtypeColumnTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (MainEntity).Assembly, typeof (MainEntity).Namespace); - return configuration; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new MainEntity {Reference = new RefBase()}; - new MainEntity {Reference = new Ref()}; - new MainEntity {Reference = new Ref {Info = "Don't know"}}; - new MainEntity {Reference = new Ref {Info = "IDDQD"}}; - tx.Complete(); - } - } - - [Test] - public void CalculatedFieldTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Where(e => e.Info.In("IDDQD", "IDFKA")) - .ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - } - } - - [Test] - public void DirectExpressionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Where(e => (e.Reference as Ref).Info.In("IDDQD", "IDFKA")) - .ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NullCheck1Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Where(e => (e.Reference as Ref)==null) - .ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NullCheck2Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var result = session.Query.All() - .Where(e => (e.Reference as Ref).Info==null) - .ToList(); - Assert.That(result.Count, Is.EqualTo(2)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.07 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.InOverSubtypeColumnTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace InOverSubtypeColumnTestModel + { + [HierarchyRoot] + public class MainEntity : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public RefBase Reference { get; set; } + + public string Info + { + get + { + var refObj = Reference as Ref; + if (refObj==null) + return null; + return refObj.Info; + } + } + } + + [HierarchyRoot] + public class RefBase : Entity + { + [Key, Field] + public long Id { get; set; } + } + + public class Ref : RefBase + { + [Field] + public string Info { get; set; } + } + + [CompilerContainer(typeof (Expression))] + public static class Container + { + [Compiler(typeof (MainEntity), "Info", TargetKind.PropertyGet)] + public static Expression Info(Expression _this) + { + Expression> expr = e => (e.Reference as Ref).Info; + return expr.BindParameters(_this); + } + } + } + + public class InOverSubtypeColumnTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (MainEntity).Assembly, typeof (MainEntity).Namespace); + return configuration; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new MainEntity {Reference = new RefBase()}; + new MainEntity {Reference = new Ref()}; + new MainEntity {Reference = new Ref {Info = "Don't know"}}; + new MainEntity {Reference = new Ref {Info = "IDDQD"}}; + tx.Complete(); + } + } + + [Test] + public void CalculatedFieldTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Where(e => e.Info.In("IDDQD", "IDFKA")) + .ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + } + } + + [Test] + public void DirectExpressionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Where(e => (e.Reference as Ref).Info.In("IDDQD", "IDFKA")) + .ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NullCheck1Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Where(e => (e.Reference as Ref)==null) + .ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NullCheck2Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var result = session.Query.All() + .Where(e => (e.Reference as Ref).Info==null) + .ToList(); + Assert.That(result.Count, Is.EqualTo(2)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/InTest.cs b/Orm/Xtensive.Orm.Tests/Linq/InTest.cs index f555b12132..e9a585b8a2 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/InTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/InTest.cs @@ -1,326 +1,326 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.09.30 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class InTest : ChinookDOModelTest - { - [Test] - public void StringContainsTest() - { - var list = new List {"Michelle", "Jack"}; - var query1 = from c in Session.Query.All() - where !c.FirstName.In(list) - select c.Invoices; - var query2 = from c in Session.Query.All() - where !c.FirstName.In("Michelle", "Jack") - select c.Invoices; - var expected1 = from c in Session.Query.All().AsEnumerable() - where !list.Contains(c.FirstName) - select c.Invoices; - var expected2 = from c in Session.Query.All().AsEnumerable() - where !c.FirstName.In(list) - select c.Invoices; - Assert.That(query1, Is.Not.Empty); - Assert.That(query2, Is.Not.Empty); - Assert.AreEqual(0, expected1.Except(query1).Count()); - Assert.AreEqual(0, expected2.Except(query1).Count()); - Assert.AreEqual(0, expected1.Except(query2).Count()); - Assert.AreEqual(0, expected2.Except(query2).Count()); - QueryDumper.Dump(query1); - QueryDumper.Dump(query2); - } - - [Test] - public void MartinTest() - { - Session.Query.All() - .LeftJoin(Session.Query.All(), c => c, i => i.Customer, (c, i) => new {Customer = c, Invoice = i}) - .GroupBy(i => new {i.Customer.FirstName, i.Customer.LastName}) - .Select(g => new {Key = g.Key, Count = g.Count(j => j.Invoice!=null)}) - .ToList(); - } - - [Test] - public void LongSequenceIntTest() - { - // Wrong JOIN mapping for temptable version of .In - var list1 = new List {0.05m, 0.18m, 0.41m}; - var list2 = new List(); - for (var i = 0; i < 100; i++) - list2.AddRange(list1); - var query1 = from invoice in Session.Query.All() - where (invoice.Commission).In(list1) - select invoice; - var query2 = from invoice in Session.Query.All() - where (invoice.Commission).In(list2) - select invoice; - var expected = from invoice in Session.Query.All().AsEnumerable() - where (invoice.Commission).In(list1) - select invoice; - Assert.That(query1, Is.Not.Empty); - Assert.That(query2, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query1).Count()); - Assert.AreEqual(0, expected.Except(query2).Count()); - } - - [Test] - public void IntAndDecimalContains1Test() - { - // casts int to decimal - var list = new List {5, 18, 41}; - var query = from invoice in Session.Query.All() - where !((int) invoice.Commission).In(list) - select invoice; - var expected = from invoice in Session.Query.All().AsEnumerable() - where !((int) invoice.Commission).In(list) - select invoice; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void SimpleIntContainsTest() - { - var list = new List {276192, 349492, 232463}; - var query = from track in Session.Query.All() - where track.Milliseconds.In(list) - select track; - var expected = from track in Session.Query.All().AsEnumerable() - where track.Milliseconds.In(list) - select track; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void ReuseIntContainsTest() - { - var list = new List {276192, 349492}; - var invoices = GetTracks(list); - Assert.That(invoices, Is.Not.Empty); - foreach (var invoice in invoices) - Assert.IsTrue(invoice.Milliseconds.In(list)); - - list = new List {232463}; - invoices = GetTracks(list); - Assert.That(invoices, Is.Not.Empty); - foreach (var invoice in invoices) - Assert.IsTrue(invoice.Milliseconds.In(list)); - } - - [Test] - public void IntAndDecimalContains2Test() - { - // casts decimal to int - var list = new List {7, 22, 46}; - var query = from invoice in Session.Query.All() - where !((decimal) invoice.InvoiceId).In(list) - select invoice; - var expected = from invoice in Session.Query.All().AsEnumerable() - where !((decimal) invoice.InvoiceId).In(list) - select invoice; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void EntityContainsTest() - { - var list = Session.Query.All().Take(5).ToList(); - var query = from c in Session.Query.All() - where !c.In(list) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !c.In(list) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void StructContainsTest() - { - var list = Session.Query.All().Take(5).Select(c => c.Address).ToList(); - var query = from c in Session.Query.All() - where !c.Address.In(list) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !c.Address.In(list) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void StructSimpleContainsTest() - { - var list = Session.Query.All().Take(5).Select(c => c.Address).ToList(); - var query = Session.Query.All().Select(c => c.Address).Where(c => c.In(list)); - QueryDumper.Dump(query); - } - - [Test] - public void AnonimousContainsTest() - { - var list = new[] {new {FirstName = "Michelle"}, new {FirstName = "Jack"}}; - var query = Session.Query.All().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); - var expected = Session.Query.All().AsEnumerable().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void AnonimousContains2Test() - { - var list = new[] {new {Id1 = "Michelle", Id2 = "Michelle"}, new {Id1 = "Jack", Id2 = "Jack"}}; - var query = Session.Query.All().Where(c => new {Id1 = c.FirstName, Id2 = c.FirstName}.In(list)).Select(c => c.Invoices); - var expected = Session.Query.All().AsEnumerable().Where(c => new {Id1 = c.FirstName, Id2 = c.FirstName}.In(list)).Select(c => c.Invoices); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void QueryableDoubleContainsTest() - { - var list = Session.Query.All() - .Select(o => o.Commission) - .Distinct() - .Take(10); - var query = from invoice in Session.Query.All() - where !invoice.Commission.In(list) - select invoice; - var expected = from invoice in Session.Query.All().AsEnumerable() - where !invoice.Commission.In(list) - select invoice; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void QueryableEntityContainsTest() - { - var list = Session.Query.All().Take(5); - var query = from c in Session.Query.All() - where !c.In(list) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !c.In(list) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void QueryableStructContainsTest() - { - var list = Session.Query.All() - .Take(5) - .Select(c => c.Address); - var query = from c in Session.Query.All() - where !c.Address.In(list) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !c.Address.In(list) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void QueryableAnonimousContainsTest() - { - var list = Session.Query.All().Take(10).Select(c => new {c.FirstName}); - var query = Session.Query.All().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); - var expected = Session.Query.All().AsEnumerable().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - private IEnumerable GetTracks(IEnumerable ids) - { - return Session.Query.Execute(qe => - from track in qe.All() - where track.Milliseconds.In(ids) - select track); - } - - [Test] - public void ComplexCondition1Test() - { - var includeAlgorithm = IncludeAlgorithm.TemporaryTable; - var list = new List {276192, 349492, 232463}; - var query = from track in Session.Query.All() - where track.Milliseconds.In(includeAlgorithm, list) - select track; - var expected = from track in Session.Query.All().AsEnumerable() - where track.Milliseconds.In(includeAlgorithm, list) - select track; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void ComplexCondition2Test() - { - var includeAlgorithm = IncludeAlgorithm.TemporaryTable; - var query = from track in Session.Query.All() - where track.Milliseconds.In(includeAlgorithm, 276192, 349492, 232463) - select track; - var expected = from track in Session.Query.All().AsEnumerable() - where track.Milliseconds.In(includeAlgorithm, 276192, 349492, 232463) - select track; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void CompiledInTest() - { - var result1 = GetCustomers("Michelle", "Jack") - .Select(customer => customer.FirstName) - .ToList(); - Assert.AreEqual(2, result1.Count); - Assert.IsTrue(result1.Contains("Michelle")); - Assert.IsTrue(result1.Contains("Jack")); - - var result2 = GetCustomers("Leonie") - .Select(customer => customer.FirstName) - .ToList(); - Assert.AreEqual(1, result2.Count); - Assert.AreEqual("Leonie", result2[0]); - } - - private static IEnumerable GetCustomers(params string[] customerNames) - { - return Session.Demand().Query.Execute(qe => qe.All().Where(customer => customer.FirstName.In(customerNames))); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.09.30 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class InTest : ChinookDOModelTest + { + [Test] + public void StringContainsTest() + { + var list = new List {"Michelle", "Jack"}; + var query1 = from c in Session.Query.All() + where !c.FirstName.In(list) + select c.Invoices; + var query2 = from c in Session.Query.All() + where !c.FirstName.In("Michelle", "Jack") + select c.Invoices; + var expected1 = from c in Session.Query.All().AsEnumerable() + where !list.Contains(c.FirstName) + select c.Invoices; + var expected2 = from c in Session.Query.All().AsEnumerable() + where !c.FirstName.In(list) + select c.Invoices; + Assert.That(query1, Is.Not.Empty); + Assert.That(query2, Is.Not.Empty); + Assert.AreEqual(0, expected1.Except(query1).Count()); + Assert.AreEqual(0, expected2.Except(query1).Count()); + Assert.AreEqual(0, expected1.Except(query2).Count()); + Assert.AreEqual(0, expected2.Except(query2).Count()); + QueryDumper.Dump(query1); + QueryDumper.Dump(query2); + } + + [Test] + public void MartinTest() + { + Session.Query.All() + .LeftJoin(Session.Query.All(), c => c, i => i.Customer, (c, i) => new {Customer = c, Invoice = i}) + .GroupBy(i => new {i.Customer.FirstName, i.Customer.LastName}) + .Select(g => new {Key = g.Key, Count = g.Count(j => j.Invoice!=null)}) + .ToList(); + } + + [Test] + public void LongSequenceIntTest() + { + // Wrong JOIN mapping for temptable version of .In + var list1 = new List {0.05m, 0.18m, 0.41m}; + var list2 = new List(); + for (var i = 0; i < 100; i++) + list2.AddRange(list1); + var query1 = from invoice in Session.Query.All() + where (invoice.Commission).In(list1) + select invoice; + var query2 = from invoice in Session.Query.All() + where (invoice.Commission).In(list2) + select invoice; + var expected = from invoice in Session.Query.All().AsEnumerable() + where (invoice.Commission).In(list1) + select invoice; + Assert.That(query1, Is.Not.Empty); + Assert.That(query2, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query1).Count()); + Assert.AreEqual(0, expected.Except(query2).Count()); + } + + [Test] + public void IntAndDecimalContains1Test() + { + // casts int to decimal + var list = new List {5, 18, 41}; + var query = from invoice in Session.Query.All() + where !((int) invoice.Commission).In(list) + select invoice; + var expected = from invoice in Session.Query.All().AsEnumerable() + where !((int) invoice.Commission).In(list) + select invoice; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void SimpleIntContainsTest() + { + var list = new List {276192, 349492, 232463}; + var query = from track in Session.Query.All() + where track.Milliseconds.In(list) + select track; + var expected = from track in Session.Query.All().AsEnumerable() + where track.Milliseconds.In(list) + select track; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void ReuseIntContainsTest() + { + var list = new List {276192, 349492}; + var invoices = GetTracks(list); + Assert.That(invoices, Is.Not.Empty); + foreach (var invoice in invoices) + Assert.IsTrue(invoice.Milliseconds.In(list)); + + list = new List {232463}; + invoices = GetTracks(list); + Assert.That(invoices, Is.Not.Empty); + foreach (var invoice in invoices) + Assert.IsTrue(invoice.Milliseconds.In(list)); + } + + [Test] + public void IntAndDecimalContains2Test() + { + // casts decimal to int + var list = new List {7, 22, 46}; + var query = from invoice in Session.Query.All() + where !((decimal) invoice.InvoiceId).In(list) + select invoice; + var expected = from invoice in Session.Query.All().AsEnumerable() + where !((decimal) invoice.InvoiceId).In(list) + select invoice; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void EntityContainsTest() + { + var list = Session.Query.All().Take(5).ToList(); + var query = from c in Session.Query.All() + where !c.In(list) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !c.In(list) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void StructContainsTest() + { + var list = Session.Query.All().Take(5).Select(c => c.Address).ToList(); + var query = from c in Session.Query.All() + where !c.Address.In(list) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !c.Address.In(list) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void StructSimpleContainsTest() + { + var list = Session.Query.All().Take(5).Select(c => c.Address).ToList(); + var query = Session.Query.All().Select(c => c.Address).Where(c => c.In(list)); + QueryDumper.Dump(query); + } + + [Test] + public void AnonimousContainsTest() + { + var list = new[] {new {FirstName = "Michelle"}, new {FirstName = "Jack"}}; + var query = Session.Query.All().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); + var expected = Session.Query.All().AsEnumerable().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void AnonimousContains2Test() + { + var list = new[] {new {Id1 = "Michelle", Id2 = "Michelle"}, new {Id1 = "Jack", Id2 = "Jack"}}; + var query = Session.Query.All().Where(c => new {Id1 = c.FirstName, Id2 = c.FirstName}.In(list)).Select(c => c.Invoices); + var expected = Session.Query.All().AsEnumerable().Where(c => new {Id1 = c.FirstName, Id2 = c.FirstName}.In(list)).Select(c => c.Invoices); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void QueryableDoubleContainsTest() + { + var list = Session.Query.All() + .Select(o => o.Commission) + .Distinct() + .Take(10); + var query = from invoice in Session.Query.All() + where !invoice.Commission.In(list) + select invoice; + var expected = from invoice in Session.Query.All().AsEnumerable() + where !invoice.Commission.In(list) + select invoice; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void QueryableEntityContainsTest() + { + var list = Session.Query.All().Take(5); + var query = from c in Session.Query.All() + where !c.In(list) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !c.In(list) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void QueryableStructContainsTest() + { + var list = Session.Query.All() + .Take(5) + .Select(c => c.Address); + var query = from c in Session.Query.All() + where !c.Address.In(list) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !c.Address.In(list) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void QueryableAnonimousContainsTest() + { + var list = Session.Query.All().Take(10).Select(c => new {c.FirstName}); + var query = Session.Query.All().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); + var expected = Session.Query.All().AsEnumerable().Where(c => new {c.FirstName}.In(list)).Select(c => c.Invoices); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + private IEnumerable GetTracks(IEnumerable ids) + { + return Session.Query.Execute(qe => + from track in qe.All() + where track.Milliseconds.In(ids) + select track); + } + + [Test] + public void ComplexCondition1Test() + { + var includeAlgorithm = IncludeAlgorithm.TemporaryTable; + var list = new List {276192, 349492, 232463}; + var query = from track in Session.Query.All() + where track.Milliseconds.In(includeAlgorithm, list) + select track; + var expected = from track in Session.Query.All().AsEnumerable() + where track.Milliseconds.In(includeAlgorithm, list) + select track; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void ComplexCondition2Test() + { + var includeAlgorithm = IncludeAlgorithm.TemporaryTable; + var query = from track in Session.Query.All() + where track.Milliseconds.In(includeAlgorithm, 276192, 349492, 232463) + select track; + var expected = from track in Session.Query.All().AsEnumerable() + where track.Milliseconds.In(includeAlgorithm, 276192, 349492, 232463) + select track; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void CompiledInTest() + { + var result1 = GetCustomers("Michelle", "Jack") + .Select(customer => customer.FirstName) + .ToList(); + Assert.AreEqual(2, result1.Count); + Assert.IsTrue(result1.Contains("Michelle")); + Assert.IsTrue(result1.Contains("Jack")); + + var result2 = GetCustomers("Leonie") + .Select(customer => customer.FirstName) + .ToList(); + Assert.AreEqual(1, result2.Count); + Assert.AreEqual("Leonie", result2[0]); + } + + private static IEnumerable GetCustomers(params string[] customerNames) + { + return Session.Demand().Query.Execute(qe => qe.All().Where(customer => customer.FirstName.In(customerNames))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/IndexedMethodsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/IndexedMethodsTest.cs index 93eb320589..862dfbebf1 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/IndexedMethodsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/IndexedMethodsTest.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.14 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class IndexedMethodsTest : ChinookDOModelTest - { - protected override void CheckRequirements() - { - base.CheckRequirements(); - Require.AllFeaturesSupported(ProviderFeatures.RowNumber); - } - - [Test] - public void SelectIndexedTest() - { - var result = Session.Query.All().OrderBy(i => i.InvoiceId).Select((invoice, index) => new {invoice, index}).ToList(); - var expected = Session.Query.All().AsEnumerable().OrderBy(i => i.InvoiceId).Select((invoice, index) => new {invoice, index}).ToList(); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void SelectIndexedWhereTest() - { - var result = Session.Query.All() - .Select((c, i) => new {Customer = c, Index = i}) - .Where(a => a.Customer.FirstName=="Michelle") - .ToList(); - Assert.AreEqual(1, result.Count); - Assert.Greater(result[0].Index, 1); - } - - [Test] - public void SelectManyIndexedTest() - { - var count = Session.Query.All().Count(); - var result = Session.Query.All() - .OrderBy(customer=>customer.LastName) - .SelectMany((customer, index) => customer.Invoices.OrderBy(i=>i.InvoiceId).Select(invoice=>new {index, invoice.Commission})); - var expected = Session.Query.All() - .AsEnumerable() - .OrderBy(customer=>customer.LastName) - .SelectMany((customer, index) => customer.Invoices.OrderBy(i=>i.InvoiceId).Select(invoice=>new {index, invoice.Commission})); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - -// public static IQueryable SelectMany(this IQueryable source, Expression>> collectionSelector, Expression> resultSelector); - [Test] - public void SelectManyIndexedResultSelectorTest() - { - var result = Session.Query.All() - .OrderBy(customer => customer.LastName) - .SelectMany( - (customer, index) => customer.Invoices.OrderBy(i => i.InvoiceId).Select(invoice => new {index, invoice.Commission}), - (customer, takenInvoices) => new {customer, takenInvoices}); - var expected = Session.Query.All() - .AsEnumerable() - .OrderBy(customer => customer.LastName) - .SelectMany( - (customer, index) => customer.Invoices.OrderBy(i => i.InvoiceId).Select(invoice => new {index, invoice.Commission}), - (customer, takenInvoices) => new {customer, takenInvoices }); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void WhereIndexedTest() - { - var avgCommission = Session.Query.All().Select(i => i.Commission).Average(); - var result = Session.Query.All().OrderBy(i => i.InvoiceId) - .Where((invoice, index) => index > 10 || invoice.Commission > avgCommission); - var expected = Session.Query.All().AsEnumerable().OrderBy(i => i.InvoiceId) - .Where((invoice, index) => index > 10 || invoice.Commission > avgCommission); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - - // public static IQueryable Where(this IQueryable source, Expression> predicate); - - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.14 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class IndexedMethodsTest : ChinookDOModelTest + { + protected override void CheckRequirements() + { + base.CheckRequirements(); + Require.AllFeaturesSupported(ProviderFeatures.RowNumber); + } + + [Test] + public void SelectIndexedTest() + { + var result = Session.Query.All().OrderBy(i => i.InvoiceId).Select((invoice, index) => new {invoice, index}).ToList(); + var expected = Session.Query.All().AsEnumerable().OrderBy(i => i.InvoiceId).Select((invoice, index) => new {invoice, index}).ToList(); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void SelectIndexedWhereTest() + { + var result = Session.Query.All() + .Select((c, i) => new {Customer = c, Index = i}) + .Where(a => a.Customer.FirstName=="Michelle") + .ToList(); + Assert.AreEqual(1, result.Count); + Assert.Greater(result[0].Index, 1); + } + + [Test] + public void SelectManyIndexedTest() + { + var count = Session.Query.All().Count(); + var result = Session.Query.All() + .OrderBy(customer=>customer.LastName) + .SelectMany((customer, index) => customer.Invoices.OrderBy(i=>i.InvoiceId).Select(invoice=>new {index, invoice.Commission})); + var expected = Session.Query.All() + .AsEnumerable() + .OrderBy(customer=>customer.LastName) + .SelectMany((customer, index) => customer.Invoices.OrderBy(i=>i.InvoiceId).Select(invoice=>new {index, invoice.Commission})); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + +// public static IQueryable SelectMany(this IQueryable source, Expression>> collectionSelector, Expression> resultSelector); + [Test] + public void SelectManyIndexedResultSelectorTest() + { + var result = Session.Query.All() + .OrderBy(customer => customer.LastName) + .SelectMany( + (customer, index) => customer.Invoices.OrderBy(i => i.InvoiceId).Select(invoice => new {index, invoice.Commission}), + (customer, takenInvoices) => new {customer, takenInvoices}); + var expected = Session.Query.All() + .AsEnumerable() + .OrderBy(customer => customer.LastName) + .SelectMany( + (customer, index) => customer.Invoices.OrderBy(i => i.InvoiceId).Select(invoice => new {index, invoice.Commission}), + (customer, takenInvoices) => new {customer, takenInvoices }); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void WhereIndexedTest() + { + var avgCommission = Session.Query.All().Select(i => i.Commission).Average(); + var result = Session.Query.All().OrderBy(i => i.InvoiceId) + .Where((invoice, index) => index > 10 || invoice.Commission > avgCommission); + var expected = Session.Query.All().AsEnumerable().OrderBy(i => i.InvoiceId) + .Where((invoice, index) => index > 10 || invoice.Commission > avgCommission); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + + // public static IQueryable Where(this IQueryable source, Expression> predicate); + + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/AlphabetTest.cs b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/AlphabetTest.cs index 9f62a3521f..f99be05b1a 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/AlphabetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/AlphabetTest.cs @@ -1,233 +1,233 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.24 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.ObjectModel.Interfaces.Alphabet; -using System.Linq; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Linq.Interfaces -{ - [Serializable] - public class AlphabetTest : AutoBuildTest - { - const int EachCount = 10; - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(INamed).Assembly, typeof(INamed).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - // ClassTable - for (int i = 0; i < EachCount; i++) - new A() {Name = "Name: A" + i}; - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new B() { Name = "Name: B" + i, Tag = "Tag: B" + i}; - named.Name = "Name: B'" + i; - } - for (int i = 0; i < EachCount; i++) { - var tagged = (ITagged)new C() { Name = "Name: C" + i }; - tagged.Tag = "Tag: C'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new D() { Name = "Name: D" + i, Tag= "Tag: D" + i, First = "First: D" + i, Second = "Second: D" + i }; - named.Name = "Name: D'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new E() { Name = "Name: E" + i, Tag = "Tag: E" + i, First = "First: E" + i, Second = "Second: E" + i }; - var composite = (IComposite) named; - named.Name = "Name: E'" + i; - composite.First = "First: E'" + i; - } - - // ConcreteTable - for (int i = 0; i < EachCount; i++) - new F() {Name = "Name: F" + i}; - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new G() { Name = "Name: G" + i, Tag = "Tag: G" + i}; - named.Name = "Name: G'" + i; - } - for (int i = 0; i < EachCount; i++) { - var tagged = (ITagged)new H() { Name = "Name: H" + i }; - tagged.Tag = "Tag: H'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new I() { Name = "Name: I" + i, Tag= "Tag: I" + i, First = "First: I" + i, Second = "Second: I" + i }; - named.Name = "Name: I'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new J() { Name = "Name: J" + i, Tag = "Tag: J" + i, First = "First: J" + i, Second = "Second: J" + i }; - var composite = (IComposite) named; - named.Name = "Name: J'" + i; - composite.First = "First: J'" + i; - } - - // SingleTable - for (int i = 0; i < EachCount; i++) - new K() {Name = "Name: K" + i}; - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new L() { Name = "Name: L" + i, Tag = "Tag: L" + i}; - named.Name = "Name: L'" + i; - } - for (int i = 0; i < EachCount; i++) { - var tagged = (ITagged)new M() { Name = "Name: M" + i }; - tagged.Tag = "Tag: M'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new N() { Name = "Name: N" + i, Tag= "Tag: N" + i, First = "First: N" + i, Second = "Second: N" + i }; - named.Name = "Name: N'" + i; - } - for (int i = 0; i < EachCount; i++) { - var named = (INamed)new O() { Name = "Name: O" + i, Tag = "Tag: O" + i, First = "First: O" + i, Second = "Second: O" + i }; - var composite = (IComposite) named; - named.Name = "Name: O'" + i; - composite.First = "First: O'" + i; - } - - t.Complete(); - } - } - } - - [Test] - public void QueryNamedTest() - { - var primaryIndex = Domain.Model.Types[typeof(INamed)].Indexes.PrimaryIndex; - primaryIndex.Dump(); - var secondaryIndex = Domain.Model.Types[typeof(INamed)].Indexes.GetIndex("Name"); - secondaryIndex.Dump(); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var result = session.Query.All().ToList(); - Assert.Greater(result.Count, 0); - foreach (var iNamed in result) { - Assert.IsNotNull(iNamed); - Assert.IsNotNull(iNamed.Name); - Console.Out.WriteLine(string.Format("Key: {0}; {1}", iNamed.Key, iNamed.Name)); - } - Assert.AreEqual(17 * EachCount, result.Count); - - var filtered = session.Query.All().Where(i => i.Name == "Name: O'0" || i.Name == "Name: A0" || i.Name == "Name: C0").ToList(); - Assert.AreEqual(3, filtered.Count); - - var startsWith = session.Query.All().Where(i => i.Name.StartsWith("Name: J'") || i.Name.StartsWith("Name: L'") || i.Name.StartsWith("Name: C'")).ToList(); - Assert.AreEqual(2 * EachCount, startsWith.Count); - - t.Complete(); - } - } - - [Test] - public void QueryTaggedTest() - { - var index = Domain.Model.Types[typeof(ITagged)].Indexes.PrimaryIndex; - index.Dump(); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var result = session.Query.All().ToList(); - Assert.Greater(result.Count, 0); - foreach (var iTagged in result) { - Assert.IsNotNull(iTagged); - Assert.IsNotNull(iTagged.Tag); - Console.Out.WriteLine(string.Format("Key: {0}; {1}", iTagged.Key, iTagged.Tag)); - } - Assert.AreEqual(12 * EachCount, result.Count); - - var filtered = session.Query.All().Where(i => i.Tag == "Tag: C'0" || i.Tag == "Tag: D0" || i.Tag == "Tag: M'0").ToList(); - Assert.AreEqual(3, filtered.Count); - - var startsWith = session.Query.All().Where(i => i.Tag.StartsWith("Tag: H'") || i.Tag.StartsWith("Tag: C'") || i.Tag.StartsWith("Tag: J'")).ToList(); - Assert.AreEqual(2 * EachCount, startsWith.Count); - - t.Complete(); - } - } - - - [Test] - public void QueryCompositeTest() - { - var index = Domain.Model.Types[typeof(IComposite)].Indexes.PrimaryIndex; - index.Dump(); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var result = session.Query.All().ToList(); - Assert.Greater(result.Count, 0); - foreach (var iComposite in result) { - Assert.IsNotNull(iComposite); - Assert.IsNotNull(iComposite.First); - Assert.IsNotNull(iComposite.Second); - Console.Out.WriteLine(string.Format("Key: {0}; {1}; {2}", iComposite.Key, iComposite.First, iComposite.Second)); - } - Assert.AreEqual(6 * EachCount, result.Count); - - var filtered = session.Query.All().Where(i => i.First == "First: O'0" || i.Second == "Second: O0" || i.First == "First: E'0").ToList(); - Assert.AreEqual(2, filtered.Count); - - var startsWith = session.Query.All().Where(i => i.First.StartsWith("First: O'") || i.Second.StartsWith("Second: O") || i.First.StartsWith("First: E'")).ToList(); - Assert.AreEqual(2 * EachCount, startsWith.Count); - - t.Complete(); - } - } - - [Test] - public void FetchTest() - { - Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var named = session.Query.Single(33L); - Assert.IsNotNull(named); - Assert.AreEqual("Name: D'2", named.Name); - named = session.Query.Single(Key.Create(Domain, 51L)); - Assert.IsNotNull(named); - Assert.AreEqual("Name: F0", named.Name); - t.Complete(); - } - - const int totalCount = EachCount * 15; - var names = new List(totalCount); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - for (long i = 1; i <= totalCount; i++) { - var key = Key.Create(Domain, i); - var named = session.Query.Single(key); - Assert.IsNotNull(named); - Assert.IsNotNull(named.Name); - names.Add(named.Name); - } - t.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var namedQuery = session.Query.All() - .Select(i => i.Name) - .OrderBy(i=>i) - .ToList(); - Assert.AreEqual(170, namedQuery.Count); - Assert.IsTrue(namedQuery.SequenceEqual(names)); - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.24 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.ObjectModel.Interfaces.Alphabet; +using System.Linq; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Linq.Interfaces +{ + [Serializable] + public class AlphabetTest : AutoBuildTest + { + const int EachCount = 10; + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(INamed).Assembly, typeof(INamed).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + // ClassTable + for (int i = 0; i < EachCount; i++) + new A() {Name = "Name: A" + i}; + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new B() { Name = "Name: B" + i, Tag = "Tag: B" + i}; + named.Name = "Name: B'" + i; + } + for (int i = 0; i < EachCount; i++) { + var tagged = (ITagged)new C() { Name = "Name: C" + i }; + tagged.Tag = "Tag: C'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new D() { Name = "Name: D" + i, Tag= "Tag: D" + i, First = "First: D" + i, Second = "Second: D" + i }; + named.Name = "Name: D'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new E() { Name = "Name: E" + i, Tag = "Tag: E" + i, First = "First: E" + i, Second = "Second: E" + i }; + var composite = (IComposite) named; + named.Name = "Name: E'" + i; + composite.First = "First: E'" + i; + } + + // ConcreteTable + for (int i = 0; i < EachCount; i++) + new F() {Name = "Name: F" + i}; + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new G() { Name = "Name: G" + i, Tag = "Tag: G" + i}; + named.Name = "Name: G'" + i; + } + for (int i = 0; i < EachCount; i++) { + var tagged = (ITagged)new H() { Name = "Name: H" + i }; + tagged.Tag = "Tag: H'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new I() { Name = "Name: I" + i, Tag= "Tag: I" + i, First = "First: I" + i, Second = "Second: I" + i }; + named.Name = "Name: I'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new J() { Name = "Name: J" + i, Tag = "Tag: J" + i, First = "First: J" + i, Second = "Second: J" + i }; + var composite = (IComposite) named; + named.Name = "Name: J'" + i; + composite.First = "First: J'" + i; + } + + // SingleTable + for (int i = 0; i < EachCount; i++) + new K() {Name = "Name: K" + i}; + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new L() { Name = "Name: L" + i, Tag = "Tag: L" + i}; + named.Name = "Name: L'" + i; + } + for (int i = 0; i < EachCount; i++) { + var tagged = (ITagged)new M() { Name = "Name: M" + i }; + tagged.Tag = "Tag: M'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new N() { Name = "Name: N" + i, Tag= "Tag: N" + i, First = "First: N" + i, Second = "Second: N" + i }; + named.Name = "Name: N'" + i; + } + for (int i = 0; i < EachCount; i++) { + var named = (INamed)new O() { Name = "Name: O" + i, Tag = "Tag: O" + i, First = "First: O" + i, Second = "Second: O" + i }; + var composite = (IComposite) named; + named.Name = "Name: O'" + i; + composite.First = "First: O'" + i; + } + + t.Complete(); + } + } + } + + [Test] + public void QueryNamedTest() + { + var primaryIndex = Domain.Model.Types[typeof(INamed)].Indexes.PrimaryIndex; + primaryIndex.Dump(); + var secondaryIndex = Domain.Model.Types[typeof(INamed)].Indexes.GetIndex("Name"); + secondaryIndex.Dump(); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var result = session.Query.All().ToList(); + Assert.Greater(result.Count, 0); + foreach (var iNamed in result) { + Assert.IsNotNull(iNamed); + Assert.IsNotNull(iNamed.Name); + Console.Out.WriteLine(string.Format("Key: {0}; {1}", iNamed.Key, iNamed.Name)); + } + Assert.AreEqual(17 * EachCount, result.Count); + + var filtered = session.Query.All().Where(i => i.Name == "Name: O'0" || i.Name == "Name: A0" || i.Name == "Name: C0").ToList(); + Assert.AreEqual(3, filtered.Count); + + var startsWith = session.Query.All().Where(i => i.Name.StartsWith("Name: J'") || i.Name.StartsWith("Name: L'") || i.Name.StartsWith("Name: C'")).ToList(); + Assert.AreEqual(2 * EachCount, startsWith.Count); + + t.Complete(); + } + } + + [Test] + public void QueryTaggedTest() + { + var index = Domain.Model.Types[typeof(ITagged)].Indexes.PrimaryIndex; + index.Dump(); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var result = session.Query.All().ToList(); + Assert.Greater(result.Count, 0); + foreach (var iTagged in result) { + Assert.IsNotNull(iTagged); + Assert.IsNotNull(iTagged.Tag); + Console.Out.WriteLine(string.Format("Key: {0}; {1}", iTagged.Key, iTagged.Tag)); + } + Assert.AreEqual(12 * EachCount, result.Count); + + var filtered = session.Query.All().Where(i => i.Tag == "Tag: C'0" || i.Tag == "Tag: D0" || i.Tag == "Tag: M'0").ToList(); + Assert.AreEqual(3, filtered.Count); + + var startsWith = session.Query.All().Where(i => i.Tag.StartsWith("Tag: H'") || i.Tag.StartsWith("Tag: C'") || i.Tag.StartsWith("Tag: J'")).ToList(); + Assert.AreEqual(2 * EachCount, startsWith.Count); + + t.Complete(); + } + } + + + [Test] + public void QueryCompositeTest() + { + var index = Domain.Model.Types[typeof(IComposite)].Indexes.PrimaryIndex; + index.Dump(); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var result = session.Query.All().ToList(); + Assert.Greater(result.Count, 0); + foreach (var iComposite in result) { + Assert.IsNotNull(iComposite); + Assert.IsNotNull(iComposite.First); + Assert.IsNotNull(iComposite.Second); + Console.Out.WriteLine(string.Format("Key: {0}; {1}; {2}", iComposite.Key, iComposite.First, iComposite.Second)); + } + Assert.AreEqual(6 * EachCount, result.Count); + + var filtered = session.Query.All().Where(i => i.First == "First: O'0" || i.Second == "Second: O0" || i.First == "First: E'0").ToList(); + Assert.AreEqual(2, filtered.Count); + + var startsWith = session.Query.All().Where(i => i.First.StartsWith("First: O'") || i.Second.StartsWith("Second: O") || i.First.StartsWith("First: E'")).ToList(); + Assert.AreEqual(2 * EachCount, startsWith.Count); + + t.Complete(); + } + } + + [Test] + public void FetchTest() + { + Require.AllFeaturesNotSupported(ProviderFeatures.Sequences); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var named = session.Query.Single(33L); + Assert.IsNotNull(named); + Assert.AreEqual("Name: D'2", named.Name); + named = session.Query.Single(Key.Create(Domain, 51L)); + Assert.IsNotNull(named); + Assert.AreEqual("Name: F0", named.Name); + t.Complete(); + } + + const int totalCount = EachCount * 15; + var names = new List(totalCount); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + for (long i = 1; i <= totalCount; i++) { + var key = Key.Create(Domain, i); + var named = session.Query.Single(key); + Assert.IsNotNull(named); + Assert.IsNotNull(named.Name); + names.Add(named.Name); + } + t.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var namedQuery = session.Query.All() + .Select(i => i.Name) + .OrderBy(i=>i) + .ToList(); + Assert.AreEqual(170, namedQuery.Count); + Assert.IsTrue(namedQuery.SequenceEqual(names)); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SimpleTest.cs index 9c2fd274a7..6693b2db1c 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SimpleTest.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2009.06.01 - -using System; -using System.Linq; -using System.Collections.Generic; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Core; -using System.Linq.Dynamic; - -namespace Xtensive.Orm.Tests.Linq.Interfaces -{ - [TestFixture, Category("Linq")] - public sealed class SimpleTest : ChinookDOModelTest - { - public class DTO - { - public decimal? Commission; - } - - [Test] - public void QueryTest() - { - var expected = Session.Query.All().Count(); - var result = Session.Query.All().ToList(); - Assert.AreEqual(expected, result.Count); - Assert.IsTrue(result.All(i => i!=null)); - } - - [Test] - public void QueryUnknownTypeDynamicTest() - { - var type = typeof (Invoice); - var queryable = Session.Query.All(type); - var result = new List(); - var anonyms = queryable.Select("new(Commission as Commission)"); - foreach (dynamic anonym in anonyms) - result.Add(new DTO() {Commission = anonym.Commission}); - Assert.Greater(result.Count, 0); - } - - [Test] - public void QueryOfUnknownTypeCastTest() - { - var type = typeof (Invoice); - var queryable = Session.Query.All(type); - var result = queryable.Cast() - .Select(i => new DTO() {Commission = i.Commission}) - .ToList(); - } - - [Test] - public void ComplexQueryOfUnknownTypeTest() - { - var type = typeof (Invoice); - var queryable = Session.Query.All(type); - var result = queryable.Cast() - .Select(i => new { - i, - c1 = queryable.Count(), - c2 = Session.Query.All(type).Count() - }) - .ToList(); - - int expectedCount = result.Count; - Assert.Greater(expectedCount, 0); - foreach (var item in result) { - Assert.AreEqual(expectedCount, item.c1); - Assert.AreEqual(expectedCount, item.c2); - } - } - - [Test] - public void QueryByInterfaceTest() - { - var actual = Session.Query.All().ToList(); - var expected = Session.Query.All().ToList(); - Assert.AreEqual(0, expected.Except(actual.Cast()).Count()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2009.06.01 + +using System; +using System.Linq; +using System.Collections.Generic; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Core; +using System.Linq.Dynamic; + +namespace Xtensive.Orm.Tests.Linq.Interfaces +{ + [TestFixture, Category("Linq")] + public sealed class SimpleTest : ChinookDOModelTest + { + public class DTO + { + public decimal? Commission; + } + + [Test] + public void QueryTest() + { + var expected = Session.Query.All().Count(); + var result = Session.Query.All().ToList(); + Assert.AreEqual(expected, result.Count); + Assert.IsTrue(result.All(i => i!=null)); + } + + [Test] + public void QueryUnknownTypeDynamicTest() + { + var type = typeof (Invoice); + var queryable = Session.Query.All(type); + var result = new List(); + var anonyms = queryable.Select("new(Commission as Commission)"); + foreach (dynamic anonym in anonyms) + result.Add(new DTO() {Commission = anonym.Commission}); + Assert.Greater(result.Count, 0); + } + + [Test] + public void QueryOfUnknownTypeCastTest() + { + var type = typeof (Invoice); + var queryable = Session.Query.All(type); + var result = queryable.Cast() + .Select(i => new DTO() {Commission = i.Commission}) + .ToList(); + } + + [Test] + public void ComplexQueryOfUnknownTypeTest() + { + var type = typeof (Invoice); + var queryable = Session.Query.All(type); + var result = queryable.Cast() + .Select(i => new { + i, + c1 = queryable.Count(), + c2 = Session.Query.All(type).Count() + }) + .ToList(); + + int expectedCount = result.Count; + Assert.Greater(expectedCount, 0); + foreach (var item in result) { + Assert.AreEqual(expectedCount, item.c1); + Assert.AreEqual(expectedCount, item.c2); + } + } + + [Test] + public void QueryByInterfaceTest() + { + var actual = Session.Query.All().ToList(); + var expected = Session.Query.All().ToList(); + Assert.AreEqual(0, expected.Except(actual.Cast()).Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SlaveryTest.cs b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SlaveryTest.cs index 0da49ca90c..2bb690c5e5 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SlaveryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/Interfaces/SlaveryTest.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.24 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.ObjectModel.Interfaces.Slavery; - -namespace Xtensive.Orm.Tests.Linq.Interfaces -{ - [Serializable] - public class SlaveryTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(ISlave).Assembly, typeof(ISlave).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - { - using (var t = session.OpenTransaction()) - { - - - // Rollback - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.24 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.ObjectModel.Interfaces.Slavery; + +namespace Xtensive.Orm.Tests.Linq.Interfaces +{ + [Serializable] + public class SlaveryTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(ISlave).Assembly, typeof(ISlave).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + { + using (var t = session.OpenTransaction()) + { + + + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/JoinTest.cs b/Orm/Xtensive.Orm.Tests/Linq/JoinTest.cs index dab21150b7..ae9c275990 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/JoinTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/JoinTest.cs @@ -1,393 +1,393 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.12.17 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Comparison; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class JoinTest : ChinookDOModelTest - { - [Test] - public void JoinWrongKeysTest() - { - var result = - from m in Session.Query.All() - join t in Session.Query.All() on m.Key equals t.Key // Wrong join - select t; - Assert.Throws(() => { - var list = result.ToList(); - }); - } - - [Test] - [Ignore("Fix later")] - public void EntityJoinWithNullTest() - { - var id = Session.Query.All().First().TrackId; - var result = Session.Query.All() - .Select(t => t.TrackId==id ? null : t) - .Select(t => t==null ? null : t.MediaType) - .ToList(); - var expected = Session.Query.All().ToList() - .Select(t => t.TrackId==id ? null : t) - .Select(t => t==null ? null : t.MediaType).ToList(); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(result.Count, expected.Count); - } - - [Test] - public void EntityJoinWithNullModifiedTest() - { - var id = Session.Query.All().First().TrackId; - var result = Session.Query.All() - .Select(t=>(t.TrackId==id) && (t==null) ? null : - (t.TrackId==id) && (t!=null) ? t.MediaType /*exception*/ : - (t.TrackId!=id) && (t==null) ? null : t.MediaType) - .ToList(); - var expected = Session.Query.All().ToList() - .Select(p=>p.TrackId==id ? null : p) - .Select(p=>p==null ? null : p.MediaType) - .ToList(); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(result.Count, expected.Count); - } - - - [Test] - public void GroupJoinAggregateTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = - from c in Session.Query.All() - join i in Session.Query.All() on c equals i.Customer into invoices - join e in Session.Query.All() on c.Address.City equals e.Address.City into emps - select new {invoices = invoices.Count(), emps = emps.Count()}; - var list = result.ToList(); - var expected = - Session.Query.All().Select(c => new { - invoices = (int) c.Invoices.Count, - emps = Session.Query.All().Where(e => c.Address.City==e.Address.City).Count() - }).ToList(); - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(expected.Except(list).Count()==0); - } - - [Test] - public void GroupJoinAggregate2Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .GroupJoin(Session.Query.All(), - customer => customer.CustomerId, - invoice => invoice.Customer.CustomerId, - (customer, invoices) => new {customer, invoices}) - .GroupJoin(Session.Query.All(), - customerInvoices => customerInvoices.customer.Address.City, - employee => employee.Address.City, - (customerInvoices, employees) => new { - invoices = customerInvoices.invoices.Count(), - emps = employees.Count(), - sum = employees.Count() + customerInvoices.invoices.Count() - }).OrderBy(t => t.emps).ThenBy(t => t.invoices).ThenBy(t => t.sum); - - var list = result.ToList(); - var expected = Session.Query.All().AsEnumerable() - .GroupJoin(Session.Query.All().AsEnumerable(), - customer => customer.CustomerId, - invoice => invoice.Customer.CustomerId, - (customer, invoices) => new {customer, invoices}) - .GroupJoin(Session.Query.All().AsEnumerable(), - customerInvoices => customerInvoices.customer.Address.City, - employee => employee.Address.City, - (customerInvoices, employees) => new { - invoices = customerInvoices.invoices.Count(), - emps = employees.Count(), - sum = employees.Count() + customerInvoices.invoices.Count() - }).OrderBy(t => t.emps).ThenBy(t => t.invoices).ThenBy(t => t.sum).ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(list)); - - QueryDumper.Dump(expected, true); - QueryDumper.Dump(list, true); - } - - [Test] - public void SimpleJoinTest() - { - var trackCount = Session.Query.All().Count(); - var result = - from track in Session.Query.All() - join mediaType in Session.Query.All() on track.MediaType.MediaTypeId equals mediaType.MediaTypeId - select new {track.Name, mediaTypeName=mediaType.Name, mediaType.MediaTypeId}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(trackCount, list.Count); - } - - [Test] - public void SimpleLeftTest() - { - var traclCount = Session.Query.All().Count(); - var result = Session.Query.All() - .LeftJoin(Session.Query.All(), - track => track.Album.AlbumId, - album => album.AlbumId, - (track, album) => new {track.Name, album.Title, album.AlbumId}); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(traclCount, list.Count); - } - - [Test] - public void LeftJoin1Test() - { - Session.Query.All().First().Album = null; - Session.Current.SaveChanges(); - var tracks = Session.Query.All(); - var albums = Session.Query.All(); - var result = tracks.LeftJoin( - albums, - track => track.Album, - album => album, - (track, album) => new { - track.Name, - Title = album==null ? null : album.Title - }); - Assert.That(result, Is.Not.Empty); - foreach (var item in result) - Console.WriteLine("{0} {1}", item.Name, item.Title); - QueryDumper.Dump(result); - } - - public void LeftJoin2Test() - { - Session.Query.All().First().Album = null; - Session.Current.SaveChanges(); - var tracks = Session.Query.All(); - var albums = Session.Query.All(); - var result = tracks.LeftJoin( - albums, - track => track.Album.AlbumId, - album => album.AlbumId, - (track, album) => new {track.Name, album.Title}); - Assert.That(result, Is.Not.Empty); - foreach (var item in result) - Console.WriteLine("{0} {1}", item.Name, item.Title); - QueryDumper.Dump(result); - } - - [Test] - public void SeveralTest() - { - var tracks = Session.Query.All(); - var tracksCount = tracks.Count(); - var albums = Session.Query.All(); - var mediaTypes = Session.Query.All(); - var result = from t in tracks - join a in albums on t.Album.AlbumId equals a.AlbumId - join m in mediaTypes on t.MediaType.MediaTypeId equals m.MediaTypeId - select new {t, a, m.Name}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(tracksCount, list.Count); - } - - [Test] - public void OneToManyTest() - { - var invoiceLines = Session.Query.All(); - var invoiceLinesCount = invoiceLines.Count(); - var invoices = Session.Query.All(); - var result = from i in invoices - join il in invoiceLines on i.InvoiceId equals il.Invoice.InvoiceId - select new {il.Quantity, i.Total}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(invoiceLinesCount, list.Count); - } - - [Test] - public void EntityJoinTest() - { - var result = - from c in Session.Query.All() - join i in Session.Query.All() on c equals i.Customer - select new {c.FirstName, i.InvoiceDate}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - } - - [Test] - public void AnonymousEntityJoinTest() - { - var result = - from c in Session.Query.All() - join i in Session.Query.All() - on new {Customer = c, Name = c.FirstName} equals new {i.Customer, Name = i.Customer.FirstName} - select new {c.FirstName, i.InvoiceDate}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - } - - [Test] - public void JoinByCalculatedColumnTest() - { - var customers = Session.Query.All(); - var localCustomers = customers.ToList(); - var expected = - from c1 in localCustomers - join c2 in localCustomers - on c1.FirstName.Substring(0, 1).ToUpper() equals c2.FirstName.Substring(0, 1).ToUpper() - select new {l = c1.FirstName, r = c2.FirstName}; - var result = - from c1 in customers - join c2 in customers - on c1.FirstName.Substring(0, 1).ToUpper() equals c2.FirstName.Substring(0, 1).ToUpper() - select new {l = c1.FirstName, r = c2.FirstName}; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(expected.Count(), list.Count()); - } - - [Test] - public void GroupJoinTest() - { - var mediaTypeCount = Session.Query.All().Count(); - var result = - from mediaType in Session.Query.All() - join track in Session.Query.All() - on mediaType equals track.MediaType - into groups - select groups; - - var expected = - from mediaType in Session.Query.All().AsEnumerable() - join track in Session.Query.All().AsEnumerable() - on mediaType equals track.MediaType - into groups - select groups; - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(mediaTypeCount, list.Count); - QueryDumper.Dump(result, true); - } - - [Test] - public void GroupJoinWithComparerTest() - { - var mediaTypes = Session.Query.All(); - var tracks = Session.Query.All(); - var result = - mediaTypes.GroupJoin( - tracks, - m => m.MediaTypeId, - t => t.TrackId, - (m, tGroup) => tGroup, - EqualityComparer.Default); - AssertEx.Throws(() => result.ToList()); - } - - [Test] - public void GroupJoinNestedTest() - { - var mediaTypes = Session.Query.All(); - var tracks = Session.Query.All(); - var mediaTypesCount = mediaTypes.Count(); - var result = - mediaTypes.OrderBy(c => c.Name) - .GroupJoin(tracks, m => m, t => t.MediaType, (m, tGroup) => new { - MediaType = m.Name, - Tracks = tGroup.OrderBy(t => t.Name) - }); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(mediaTypesCount, list.Count); - QueryDumper.Dump(result, true); - } - - [Test] - public void GroupJoinSelectManyTest() - { - var mediaTypes = Session.Query.All(); - var tracks = Session.Query.All(); - var result = mediaTypes - .OrderBy(c => c.Name) - .GroupJoin( - tracks, - t => t, - p => p.MediaType, - (m, tGroup) => new {m, tGroup}) - .SelectMany(g1 => g1.tGroup, (g1, gp) => new {g1, gp}) - .OrderBy(g2 => g2.gp.Name) - .Select(g2 => new {MediaType = g2.g1.m.Name, g2.gp.Name}); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - QueryDumper.Dump(result, true); - } - - [Test] - public void DefaultIfEmptyTest() - { - var mediaTypes = Session.Query.All(); - var tracks = Session.Query.All(); - var mediaTypeCount = mediaTypes.Count(); - var result = mediaTypes.GroupJoin( - tracks, - mediaType => mediaType, - track => track.MediaType, - (c, tGroup) => tGroup.DefaultIfEmpty()); - Assert.Throws(() => { - var list = result.ToList(); - Assert.AreEqual(mediaTypeCount, list.Count); - QueryDumper.Dump(result, true); - }); - - } - - [Test] - public void LeftOuterTest() - { - var mediaTypes = Session.Query.All(); - var tracks = Session.Query.All(); - var tracksCount = tracks.Count(); - var result = mediaTypes.GroupJoin( - tracks, - m => m, - t => t.MediaType, - (m, tGroup) => new {m, tGroup}) - .SelectMany(g => g.tGroup.DefaultIfEmpty(), (g, t) => new {Name = t==null ? "Nothing!" : t.Name, MediaType = g.m.Name}); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(tracksCount, list.Count); - QueryDumper.Dump(result, true); - } - - [Test] - public void GroupJoinAnonymousTest() - { - var query = Session.Query.All() - .GroupJoin(Session.Query.All(), c => c, i => i.Customer, (c, invoices) => new { - c.FirstName, - c.LastName, - c.Phone, - Invoices = invoices - }); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.12.17 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Comparison; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class JoinTest : ChinookDOModelTest + { + [Test] + public void JoinWrongKeysTest() + { + var result = + from m in Session.Query.All() + join t in Session.Query.All() on m.Key equals t.Key // Wrong join + select t; + Assert.Throws(() => { + var list = result.ToList(); + }); + } + + [Test] + [Ignore("Fix later")] + public void EntityJoinWithNullTest() + { + var id = Session.Query.All().First().TrackId; + var result = Session.Query.All() + .Select(t => t.TrackId==id ? null : t) + .Select(t => t==null ? null : t.MediaType) + .ToList(); + var expected = Session.Query.All().ToList() + .Select(t => t.TrackId==id ? null : t) + .Select(t => t==null ? null : t.MediaType).ToList(); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(result.Count, expected.Count); + } + + [Test] + public void EntityJoinWithNullModifiedTest() + { + var id = Session.Query.All().First().TrackId; + var result = Session.Query.All() + .Select(t=>(t.TrackId==id) && (t==null) ? null : + (t.TrackId==id) && (t!=null) ? t.MediaType /*exception*/ : + (t.TrackId!=id) && (t==null) ? null : t.MediaType) + .ToList(); + var expected = Session.Query.All().ToList() + .Select(p=>p.TrackId==id ? null : p) + .Select(p=>p==null ? null : p.MediaType) + .ToList(); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(result.Count, expected.Count); + } + + + [Test] + public void GroupJoinAggregateTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = + from c in Session.Query.All() + join i in Session.Query.All() on c equals i.Customer into invoices + join e in Session.Query.All() on c.Address.City equals e.Address.City into emps + select new {invoices = invoices.Count(), emps = emps.Count()}; + var list = result.ToList(); + var expected = + Session.Query.All().Select(c => new { + invoices = (int) c.Invoices.Count, + emps = Session.Query.All().Where(e => c.Address.City==e.Address.City).Count() + }).ToList(); + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(expected.Except(list).Count()==0); + } + + [Test] + public void GroupJoinAggregate2Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .GroupJoin(Session.Query.All(), + customer => customer.CustomerId, + invoice => invoice.Customer.CustomerId, + (customer, invoices) => new {customer, invoices}) + .GroupJoin(Session.Query.All(), + customerInvoices => customerInvoices.customer.Address.City, + employee => employee.Address.City, + (customerInvoices, employees) => new { + invoices = customerInvoices.invoices.Count(), + emps = employees.Count(), + sum = employees.Count() + customerInvoices.invoices.Count() + }).OrderBy(t => t.emps).ThenBy(t => t.invoices).ThenBy(t => t.sum); + + var list = result.ToList(); + var expected = Session.Query.All().AsEnumerable() + .GroupJoin(Session.Query.All().AsEnumerable(), + customer => customer.CustomerId, + invoice => invoice.Customer.CustomerId, + (customer, invoices) => new {customer, invoices}) + .GroupJoin(Session.Query.All().AsEnumerable(), + customerInvoices => customerInvoices.customer.Address.City, + employee => employee.Address.City, + (customerInvoices, employees) => new { + invoices = customerInvoices.invoices.Count(), + emps = employees.Count(), + sum = employees.Count() + customerInvoices.invoices.Count() + }).OrderBy(t => t.emps).ThenBy(t => t.invoices).ThenBy(t => t.sum).ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(list)); + + QueryDumper.Dump(expected, true); + QueryDumper.Dump(list, true); + } + + [Test] + public void SimpleJoinTest() + { + var trackCount = Session.Query.All().Count(); + var result = + from track in Session.Query.All() + join mediaType in Session.Query.All() on track.MediaType.MediaTypeId equals mediaType.MediaTypeId + select new {track.Name, mediaTypeName=mediaType.Name, mediaType.MediaTypeId}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(trackCount, list.Count); + } + + [Test] + public void SimpleLeftTest() + { + var traclCount = Session.Query.All().Count(); + var result = Session.Query.All() + .LeftJoin(Session.Query.All(), + track => track.Album.AlbumId, + album => album.AlbumId, + (track, album) => new {track.Name, album.Title, album.AlbumId}); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(traclCount, list.Count); + } + + [Test] + public void LeftJoin1Test() + { + Session.Query.All().First().Album = null; + Session.Current.SaveChanges(); + var tracks = Session.Query.All(); + var albums = Session.Query.All(); + var result = tracks.LeftJoin( + albums, + track => track.Album, + album => album, + (track, album) => new { + track.Name, + Title = album==null ? null : album.Title + }); + Assert.That(result, Is.Not.Empty); + foreach (var item in result) + Console.WriteLine("{0} {1}", item.Name, item.Title); + QueryDumper.Dump(result); + } + + public void LeftJoin2Test() + { + Session.Query.All().First().Album = null; + Session.Current.SaveChanges(); + var tracks = Session.Query.All(); + var albums = Session.Query.All(); + var result = tracks.LeftJoin( + albums, + track => track.Album.AlbumId, + album => album.AlbumId, + (track, album) => new {track.Name, album.Title}); + Assert.That(result, Is.Not.Empty); + foreach (var item in result) + Console.WriteLine("{0} {1}", item.Name, item.Title); + QueryDumper.Dump(result); + } + + [Test] + public void SeveralTest() + { + var tracks = Session.Query.All(); + var tracksCount = tracks.Count(); + var albums = Session.Query.All(); + var mediaTypes = Session.Query.All(); + var result = from t in tracks + join a in albums on t.Album.AlbumId equals a.AlbumId + join m in mediaTypes on t.MediaType.MediaTypeId equals m.MediaTypeId + select new {t, a, m.Name}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(tracksCount, list.Count); + } + + [Test] + public void OneToManyTest() + { + var invoiceLines = Session.Query.All(); + var invoiceLinesCount = invoiceLines.Count(); + var invoices = Session.Query.All(); + var result = from i in invoices + join il in invoiceLines on i.InvoiceId equals il.Invoice.InvoiceId + select new {il.Quantity, i.Total}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(invoiceLinesCount, list.Count); + } + + [Test] + public void EntityJoinTest() + { + var result = + from c in Session.Query.All() + join i in Session.Query.All() on c equals i.Customer + select new {c.FirstName, i.InvoiceDate}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + } + + [Test] + public void AnonymousEntityJoinTest() + { + var result = + from c in Session.Query.All() + join i in Session.Query.All() + on new {Customer = c, Name = c.FirstName} equals new {i.Customer, Name = i.Customer.FirstName} + select new {c.FirstName, i.InvoiceDate}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + } + + [Test] + public void JoinByCalculatedColumnTest() + { + var customers = Session.Query.All(); + var localCustomers = customers.ToList(); + var expected = + from c1 in localCustomers + join c2 in localCustomers + on c1.FirstName.Substring(0, 1).ToUpper() equals c2.FirstName.Substring(0, 1).ToUpper() + select new {l = c1.FirstName, r = c2.FirstName}; + var result = + from c1 in customers + join c2 in customers + on c1.FirstName.Substring(0, 1).ToUpper() equals c2.FirstName.Substring(0, 1).ToUpper() + select new {l = c1.FirstName, r = c2.FirstName}; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(expected.Count(), list.Count()); + } + + [Test] + public void GroupJoinTest() + { + var mediaTypeCount = Session.Query.All().Count(); + var result = + from mediaType in Session.Query.All() + join track in Session.Query.All() + on mediaType equals track.MediaType + into groups + select groups; + + var expected = + from mediaType in Session.Query.All().AsEnumerable() + join track in Session.Query.All().AsEnumerable() + on mediaType equals track.MediaType + into groups + select groups; + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(mediaTypeCount, list.Count); + QueryDumper.Dump(result, true); + } + + [Test] + public void GroupJoinWithComparerTest() + { + var mediaTypes = Session.Query.All(); + var tracks = Session.Query.All(); + var result = + mediaTypes.GroupJoin( + tracks, + m => m.MediaTypeId, + t => t.TrackId, + (m, tGroup) => tGroup, + EqualityComparer.Default); + AssertEx.Throws(() => result.ToList()); + } + + [Test] + public void GroupJoinNestedTest() + { + var mediaTypes = Session.Query.All(); + var tracks = Session.Query.All(); + var mediaTypesCount = mediaTypes.Count(); + var result = + mediaTypes.OrderBy(c => c.Name) + .GroupJoin(tracks, m => m, t => t.MediaType, (m, tGroup) => new { + MediaType = m.Name, + Tracks = tGroup.OrderBy(t => t.Name) + }); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(mediaTypesCount, list.Count); + QueryDumper.Dump(result, true); + } + + [Test] + public void GroupJoinSelectManyTest() + { + var mediaTypes = Session.Query.All(); + var tracks = Session.Query.All(); + var result = mediaTypes + .OrderBy(c => c.Name) + .GroupJoin( + tracks, + t => t, + p => p.MediaType, + (m, tGroup) => new {m, tGroup}) + .SelectMany(g1 => g1.tGroup, (g1, gp) => new {g1, gp}) + .OrderBy(g2 => g2.gp.Name) + .Select(g2 => new {MediaType = g2.g1.m.Name, g2.gp.Name}); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + QueryDumper.Dump(result, true); + } + + [Test] + public void DefaultIfEmptyTest() + { + var mediaTypes = Session.Query.All(); + var tracks = Session.Query.All(); + var mediaTypeCount = mediaTypes.Count(); + var result = mediaTypes.GroupJoin( + tracks, + mediaType => mediaType, + track => track.MediaType, + (c, tGroup) => tGroup.DefaultIfEmpty()); + Assert.Throws(() => { + var list = result.ToList(); + Assert.AreEqual(mediaTypeCount, list.Count); + QueryDumper.Dump(result, true); + }); + + } + + [Test] + public void LeftOuterTest() + { + var mediaTypes = Session.Query.All(); + var tracks = Session.Query.All(); + var tracksCount = tracks.Count(); + var result = mediaTypes.GroupJoin( + tracks, + m => m, + t => t.MediaType, + (m, tGroup) => new {m, tGroup}) + .SelectMany(g => g.tGroup.DefaultIfEmpty(), (g, t) => new {Name = t==null ? "Nothing!" : t.Name, MediaType = g.m.Name}); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(tracksCount, list.Count); + QueryDumper.Dump(result, true); + } + + [Test] + public void GroupJoinAnonymousTest() + { + var query = Session.Query.All() + .GroupJoin(Session.Query.All(), c => c, i => i.Customer, (c, invoices) => new { + c.FirstName, + c.LastName, + c.Phone, + Invoices = invoices + }); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/KeysUnionTest.cs b/Orm/Xtensive.Orm.Tests/Linq/KeysUnionTest.cs index e755b41a7f..8bcc89de75 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/KeysUnionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/KeysUnionTest.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.11 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.KeysUnionTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace KeysUnionTestModel - { - [HierarchyRoot] - public class Entity1 : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; private set; } - - public Entity1() - { - Name = TypeInfo.Name; - } - } - - [HierarchyRoot] - public class Entity2 : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string Name { get; private set; } - - public Entity2() - { - Name = TypeInfo.Name; - } - } - } - - public class KeysUnionTest : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Entity1(); - new Entity2(); - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var q1 = session.Query.All().Select(e => new {e.Key, e.Name}); - var q2 = session.Query.All().Select(e => new {e.Key, e.Name}); - var result = q1.Union(q2).ToArray(); - foreach (var r in result) { - Assert.That(r.Key.TypeInfo.Name, Is.EqualTo(r.Name)); - } - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.11 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.KeysUnionTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace KeysUnionTestModel + { + [HierarchyRoot] + public class Entity1 : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; private set; } + + public Entity1() + { + Name = TypeInfo.Name; + } + } + + [HierarchyRoot] + public class Entity2 : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string Name { get; private set; } + + public Entity2() + { + Name = TypeInfo.Name; + } + } + } + + public class KeysUnionTest : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Entity1).Assembly, typeof (Entity1).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Entity1(); + new Entity2(); + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var q1 = session.Query.All().Select(e => new {e.Key, e.Name}); + var q2 = session.Query.All().Select(e => new {e.Key, e.Name}); + var result = q1.Union(q2).ToArray(); + foreach (var r in result) { + Assert.That(r.Key.TypeInfo.Name, Is.EqualTo(r.Name)); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsComplexTest.cs b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsComplexTest.cs index a366399606..cbbf24ecbe 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsComplexTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsComplexTest.cs @@ -1,339 +1,339 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Gamzov -// Created: 2009.09.28 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.LocalCollectionsComplexTestModel; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Linq.LocalCollectionsComplexTestModel -{ - public class Poco1 - { - public EntityA A { get; set; } - - public EntityB B { get; set; } - - public EntityStructure EntityStructure { get; set; } - - public ComplexStructure ComplexStructure { get; set; } - } - - public class Poco2 - { - public Poco1 Poco1 { get; set; } - - public EntityA A { get; set; } - - public EntityB B { get; set; } - - public EntityStructure EntityStructure { get; set; } - - public ComplexStructure ComplexStructure { get; set; } - } - - [Serializable] - public class EntityStructure : Structure - { - [Field] - public EntityA A { get; set; } - - [Field] - public string StructureName { get; set; } - - [Field] - public DateTime StructureAge { get; set; } - } - - [Serializable] - public class ComplexStructure : Structure - { - [Field] - public EntityA A { get; set; } - - [Field] - public string StructureName { get; set; } - - [Field] - public DateTime StructureAge { get; set; } - - [Field] - public EntityStructure EntityStructure { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class EntityA : Entity - { - [Field] - [Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public DateTime Age { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class EntityB : Entity - { - [Field] - [Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public DateTime Age { get; set; } - - [Field] - public ComplexStructure AdditionalInfo { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - public class LocalCollectionsComplexTest : AutoBuildTest - { - private const int count = 10; - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (EntityA).Assembly, typeof (EntityA).Namespace); - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - var entitiesB = Enumerable - .Range(0, count) - .Select(i => new EntityB { - Age = new DateTime(2000 + i, 2, 2), - Name = "NameB_" + i, - AdditionalInfo = new ComplexStructure { - A = new EntityA { - Age = new DateTime(2000 + i, 3, 3), - Name = "NameA_1_" + i - }, - StructureAge = new DateTime(2000 + i, 7, 7), - StructureName = "StructureName_1_" + i, - EntityStructure = new EntityStructure { - A = new EntityA { - Age = new DateTime(2000 + i, 1, 1), - Name = "NameA_2_" + i - }, - StructureAge = new DateTime(2000 + i, 10, 10), - StructureName = "StructureName_2_" + i, - } - } - }) - .ToList(); - t.Complete(); - } - } - } - - [Test] - public void UnionEntityTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Take(count / 2).ToArray(); - var union =session.Query.All().Union(localItems); - var expected =session.Query.All().AsEnumerable().Union(localItems); - Assert.AreEqual(0, expected.Except(union).Count()); - } - } - } - - [Test] - public void UnionStructureTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Select(b => b.AdditionalInfo).Take(count / 2).ToArray(); - var union =session.Query.All().Select(b => b.AdditionalInfo).Union(localItems); - var expected =session.Query.All().AsEnumerable().Select(b => b.AdditionalInfo).Union(localItems); - Assert.AreEqual(0, expected.Except(union).Count()); - } - } - } - - [Test] - public void UnionFieldTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Select(b => b.Name).Take(count / 2).ToArray(); - var union =session.Query.All().Select(b => b.Name).Union(localItems); - var expected =session.Query.All().AsEnumerable().Select(b => b.Name).Union(localItems); - Assert.AreEqual(0, expected.Except(union).Count()); - } - } - } - - [Test] - public void JoinEntityDirectTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Take(count / 2).ToArray(); - var join =session.Query.All().Join(localItems, b => b, l => l, (b, l) => new {b, l}); - var expected =session.Query.All().AsEnumerable().Join(localItems, b => b, l => l, (b, l) => new {b, l}); - Assert.AreEqual(0, expected.Except(join).Count()); - } - } - } - - - [Test] - public void JoinEntityIndirect2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Take(count / 2).ToArray(); - var join =session.Query.All().Join(localItems, b => b.AdditionalInfo.A, l => l.AdditionalInfo.A, (b, l) => new {b, l}); - var expected =session.Query.All().AsEnumerable().Join(localItems, b => b.AdditionalInfo.A, l => l.AdditionalInfo.A, (b, l) => new {b, l}); - Assert.AreEqual(0, expected.Except(join).Count()); - } - } - } - - [Test] - public void JoinEntityIndirect3Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Take(count / 2).ToArray(); - var join =session.Query.All().Join(localItems, a => a, l => l.AdditionalInfo.A, (a, l) => new {a, l}); - var expected =session.Query.All().AsEnumerable().Join(localItems, a => a, l => l.AdditionalInfo.A, (a, l) => new {a, l}); - Assert.AreEqual(0, expected.Except(join).Count()); - } - } - } - - [Test] - public void JoinStructureDirectTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localStructure =session.Query.All().Select(b => b.AdditionalInfo).First(); - var array =session.Query.All().Where(b => b.AdditionalInfo==localStructure).ToArray(); - var localItems =session.Query.All().Select(b => b.AdditionalInfo).ToArray(); - var join =session.Query.All().Select(b => b.AdditionalInfo).Join(localItems, b => b, l => l, (b, l) => new {b, l}); - var expected =session.Query.All().AsEnumerable().Select(b => b.AdditionalInfo).Join(localItems, b => b, l => l, (b, l) => new {b, l}); - var except = expected.Except(join); - var joinArray = join.ToArray(); - var expectedArray = expected.ToArray(); - Assert.AreEqual(0, except.Count()); - } - } - } - - [Test] - public void JoinStructureIndirectTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - var localItems =session.Query.All().Take(count / 2).ToArray(); - var join =session.Query.All().Join(localItems, b => b.AdditionalInfo, l => l.AdditionalInfo, (b, l) => new {b, l}); - var expected =session.Query.All().AsEnumerable().Join(localItems, b => b.AdditionalInfo, l => l.AdditionalInfo, (b, l) => new {b, l}); - Assert.AreEqual(0, expected.Except(join).Count()); - } - } - } - - [Test] - public void JoinEntityPocoTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - using (Session session = Domain.OpenSession()) { - using (TransactionScope t = session.OpenTransaction()) { - session.SaveChanges(); - Poco2[] localItems = GetPocoCollection(); - var join = session.Query.All().Join(localItems, b=>b, p=>p.B, (b,p) => new{b, p.A}).ToList(); - var count = join.Count(); - Assert.IsTrue(count>0); - var expected = session.Query.All().ToList().Join(localItems, b=>b, p=>p.B, (b,p) => new{b, p.A}).ToList(); - var except = expected.Except(join).ToArray(); - Assert.AreEqual(0, except.Length); - } - } - } - - private Poco2[] GetPocoCollection() - { - return Session.Demand().Query.All() - .Join(Session.Demand().Query.All(), b => 1, a => 1, (b, a) => new {a, b}) - .Take(count) - .AsEnumerable() - .Select((ab, i) => new Poco2 { - A = (i % 2==0) ? null : ab.a, - B = (i % 3==0) ? null : ab.b, - ComplexStructure = (i % 5==0) ? null : new ComplexStructure { - A = (i % 13==0) ? null : ab.a, - EntityStructure = new EntityStructure { - A = (i % 21==0) ? null : ab.a, - } - }, - EntityStructure = (i % 7==0) ? null : new EntityStructure { - A = (i % 17==0) ? null : ab.a, - }, - Poco1 = (i % 11==0) ? null : new Poco1 { - A = (i % 23==0) ? null : ab.a, - B = (i % 29==0) ? null : ab.b, - ComplexStructure = (i % 41==0) ? null : new ComplexStructure { - A = (i % 31==0) ? null : ab.a, - EntityStructure = new EntityStructure { - A = (i % 37==0) ? null : ab.a, - } - }, - EntityStructure = (i % 19==0) ? null : new EntityStructure { - A = (i % 51==0) ? null : ab.a, - }, - } - }) - .ToArray(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Gamzov +// Created: 2009.09.28 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.LocalCollectionsComplexTestModel; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Linq.LocalCollectionsComplexTestModel +{ + public class Poco1 + { + public EntityA A { get; set; } + + public EntityB B { get; set; } + + public EntityStructure EntityStructure { get; set; } + + public ComplexStructure ComplexStructure { get; set; } + } + + public class Poco2 + { + public Poco1 Poco1 { get; set; } + + public EntityA A { get; set; } + + public EntityB B { get; set; } + + public EntityStructure EntityStructure { get; set; } + + public ComplexStructure ComplexStructure { get; set; } + } + + [Serializable] + public class EntityStructure : Structure + { + [Field] + public EntityA A { get; set; } + + [Field] + public string StructureName { get; set; } + + [Field] + public DateTime StructureAge { get; set; } + } + + [Serializable] + public class ComplexStructure : Structure + { + [Field] + public EntityA A { get; set; } + + [Field] + public string StructureName { get; set; } + + [Field] + public DateTime StructureAge { get; set; } + + [Field] + public EntityStructure EntityStructure { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class EntityA : Entity + { + [Field] + [Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public DateTime Age { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class EntityB : Entity + { + [Field] + [Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public DateTime Age { get; set; } + + [Field] + public ComplexStructure AdditionalInfo { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + public class LocalCollectionsComplexTest : AutoBuildTest + { + private const int count = 10; + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (EntityA).Assembly, typeof (EntityA).Namespace); + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + var entitiesB = Enumerable + .Range(0, count) + .Select(i => new EntityB { + Age = new DateTime(2000 + i, 2, 2), + Name = "NameB_" + i, + AdditionalInfo = new ComplexStructure { + A = new EntityA { + Age = new DateTime(2000 + i, 3, 3), + Name = "NameA_1_" + i + }, + StructureAge = new DateTime(2000 + i, 7, 7), + StructureName = "StructureName_1_" + i, + EntityStructure = new EntityStructure { + A = new EntityA { + Age = new DateTime(2000 + i, 1, 1), + Name = "NameA_2_" + i + }, + StructureAge = new DateTime(2000 + i, 10, 10), + StructureName = "StructureName_2_" + i, + } + } + }) + .ToList(); + t.Complete(); + } + } + } + + [Test] + public void UnionEntityTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Take(count / 2).ToArray(); + var union =session.Query.All().Union(localItems); + var expected =session.Query.All().AsEnumerable().Union(localItems); + Assert.AreEqual(0, expected.Except(union).Count()); + } + } + } + + [Test] + public void UnionStructureTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Select(b => b.AdditionalInfo).Take(count / 2).ToArray(); + var union =session.Query.All().Select(b => b.AdditionalInfo).Union(localItems); + var expected =session.Query.All().AsEnumerable().Select(b => b.AdditionalInfo).Union(localItems); + Assert.AreEqual(0, expected.Except(union).Count()); + } + } + } + + [Test] + public void UnionFieldTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Select(b => b.Name).Take(count / 2).ToArray(); + var union =session.Query.All().Select(b => b.Name).Union(localItems); + var expected =session.Query.All().AsEnumerable().Select(b => b.Name).Union(localItems); + Assert.AreEqual(0, expected.Except(union).Count()); + } + } + } + + [Test] + public void JoinEntityDirectTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Take(count / 2).ToArray(); + var join =session.Query.All().Join(localItems, b => b, l => l, (b, l) => new {b, l}); + var expected =session.Query.All().AsEnumerable().Join(localItems, b => b, l => l, (b, l) => new {b, l}); + Assert.AreEqual(0, expected.Except(join).Count()); + } + } + } + + + [Test] + public void JoinEntityIndirect2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Take(count / 2).ToArray(); + var join =session.Query.All().Join(localItems, b => b.AdditionalInfo.A, l => l.AdditionalInfo.A, (b, l) => new {b, l}); + var expected =session.Query.All().AsEnumerable().Join(localItems, b => b.AdditionalInfo.A, l => l.AdditionalInfo.A, (b, l) => new {b, l}); + Assert.AreEqual(0, expected.Except(join).Count()); + } + } + } + + [Test] + public void JoinEntityIndirect3Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Take(count / 2).ToArray(); + var join =session.Query.All().Join(localItems, a => a, l => l.AdditionalInfo.A, (a, l) => new {a, l}); + var expected =session.Query.All().AsEnumerable().Join(localItems, a => a, l => l.AdditionalInfo.A, (a, l) => new {a, l}); + Assert.AreEqual(0, expected.Except(join).Count()); + } + } + } + + [Test] + public void JoinStructureDirectTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localStructure =session.Query.All().Select(b => b.AdditionalInfo).First(); + var array =session.Query.All().Where(b => b.AdditionalInfo==localStructure).ToArray(); + var localItems =session.Query.All().Select(b => b.AdditionalInfo).ToArray(); + var join =session.Query.All().Select(b => b.AdditionalInfo).Join(localItems, b => b, l => l, (b, l) => new {b, l}); + var expected =session.Query.All().AsEnumerable().Select(b => b.AdditionalInfo).Join(localItems, b => b, l => l, (b, l) => new {b, l}); + var except = expected.Except(join); + var joinArray = join.ToArray(); + var expectedArray = expected.ToArray(); + Assert.AreEqual(0, except.Count()); + } + } + } + + [Test] + public void JoinStructureIndirectTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + var localItems =session.Query.All().Take(count / 2).ToArray(); + var join =session.Query.All().Join(localItems, b => b.AdditionalInfo, l => l.AdditionalInfo, (b, l) => new {b, l}); + var expected =session.Query.All().AsEnumerable().Join(localItems, b => b.AdditionalInfo, l => l.AdditionalInfo, (b, l) => new {b, l}); + Assert.AreEqual(0, expected.Except(join).Count()); + } + } + } + + [Test] + public void JoinEntityPocoTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + using (Session session = Domain.OpenSession()) { + using (TransactionScope t = session.OpenTransaction()) { + session.SaveChanges(); + Poco2[] localItems = GetPocoCollection(); + var join = session.Query.All().Join(localItems, b=>b, p=>p.B, (b,p) => new{b, p.A}).ToList(); + var count = join.Count(); + Assert.IsTrue(count>0); + var expected = session.Query.All().ToList().Join(localItems, b=>b, p=>p.B, (b,p) => new{b, p.A}).ToList(); + var except = expected.Except(join).ToArray(); + Assert.AreEqual(0, except.Length); + } + } + } + + private Poco2[] GetPocoCollection() + { + return Session.Demand().Query.All() + .Join(Session.Demand().Query.All(), b => 1, a => 1, (b, a) => new {a, b}) + .Take(count) + .AsEnumerable() + .Select((ab, i) => new Poco2 { + A = (i % 2==0) ? null : ab.a, + B = (i % 3==0) ? null : ab.b, + ComplexStructure = (i % 5==0) ? null : new ComplexStructure { + A = (i % 13==0) ? null : ab.a, + EntityStructure = new EntityStructure { + A = (i % 21==0) ? null : ab.a, + } + }, + EntityStructure = (i % 7==0) ? null : new EntityStructure { + A = (i % 17==0) ? null : ab.a, + }, + Poco1 = (i % 11==0) ? null : new Poco1 { + A = (i % 23==0) ? null : ab.a, + B = (i % 29==0) ? null : ab.b, + ComplexStructure = (i % 41==0) ? null : new ComplexStructure { + A = (i % 31==0) ? null : ab.a, + EntityStructure = new EntityStructure { + A = (i % 37==0) ? null : ab.a, + } + }, + EntityStructure = (i % 19==0) ? null : new EntityStructure { + A = (i % 51==0) ? null : ab.a, + }, + } + }) + .ToArray(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs index 6d845f3921..9bc87c0e90 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs @@ -1,928 +1,928 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.09.07 - -using System; -using System.Collections.Generic; -using NUnit.Framework; -using System.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Core; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.Linq.LocalCollectionsTest_Model; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq.LocalCollectionsTest_Model -{ - public class Node - { - public string Name { get; set; } - - public Node Parent { get; set; } - - public Node(string name) - { - Name = name; - } - } - - public class Poco - { - public T Value { get; set; } - - public bool Equals(Poco other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return Equals(other.Value, Value); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (Poco)) - return false; - return Equals((Poco) obj); - } - - public override int GetHashCode() - { - return Value.GetHashCode(); - } - } - - public class Poco - { - public T1 Value1 { get; set; } - public T2 Value2 { get; set; } - - public bool Equals(Poco other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return Equals(other.Value1, Value1) && Equals(other.Value2, Value2); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (Poco)) - return false; - return Equals((Poco) obj); - } - - public override int GetHashCode() - { - unchecked { - return (Value1.GetHashCode() * 397) ^ Value2.GetHashCode(); - } - } - - public Poco(T1 Value1, T2 Value2) - { - this.Value1 = Value1; - this.Value2 = Value2; - } - - public Poco() - { - - } - } - - public class Poco - { - public T1 Value1 { get; set; } - public T2 Value2 { get; set; } - public T3 Value3 { get; set; } - - public Poco(T1 Value1, T2 Value2, T3 Value3) - { - this.Value1 = Value1; - this.Value2 = Value2; - this.Value3 = Value3; - } - - public bool Equals(Poco other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return Equals(other.Value1, Value1) && Equals(other.Value2, Value2) && Equals(other.Value3, Value3); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (Poco)) - return false; - return Equals((Poco) obj); - } - - public override int GetHashCode() - { - unchecked { - int result = Value1.GetHashCode(); - result = (result * 397) ^ Value2.GetHashCode(); - result = (result * 397) ^ Value3.GetHashCode(); - return result; - } - } - - public Poco() - { - - } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - public class LocalCollectionsTest : ChinookDOModelTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); - return config; - } - - [Test] - public void JoinWithLazyLoadFieldTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - // Track.Bytes is LazyLoad field. - var tracks = Session.Query.All().Take(10).ToList(); - var result = - (from il1 in Session.Query.All().Select(il => il.Track) - join il2 in tracks on il1 equals il2 - select new {il1, il2}) - .Take(10); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - } - - [Test] - public void ListContainsTest() - { - var list = new List(){"Michelle", "Jack"}; - var query = from c in Session.Query.All() - where !list.Contains(c.FirstName) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !list.Contains(c.FirstName) - select c.Invoices; - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void ReuseContainsTest() - { - var list = new List {382066, 264829}; - var tracks = GetTracks(list); - foreach (var track in tracks) - Assert.IsTrue(list.Contains(track.Milliseconds)); - - list = new List {217573}; - tracks = GetTracks(list); - foreach (var track in tracks) - Assert.IsTrue(list.Contains(track.Milliseconds)); - - IEnumerable GetTracks(IEnumerable ms) - { - return Session.Query.Execute(qe => - from track in qe.All() - where ms.Contains(track.Milliseconds) - select track); - } - } - - [Test] - public void PairTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var pairs = Session.Query.All() - .Select(customer => new Pair(customer.LastName, (int)customer.Invoices.Count)) - .ToList(); - var query = Session.Query.All() - .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => new {customer, pair.Second}); - var expected = Session.Query.All().AsEnumerable() - .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => new {customer, pair.Second}); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void Pair2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var pairs = Session.Query.All() - .Select(customer => new Pair(customer.LastName, (int)customer.Invoices.Count)) - .ToList(); - var query = Session.Query.All() - .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => pair.Second); - var expected = Session.Query.All().AsEnumerable() - .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => pair.Second); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void Poco1Test() - { - Assert.Throws(() => { - var pocos = Session.Query.All() - .Select(customer => new Poco() { Value = customer.LastName }) - .ToList(); - var query = Session.Query.All() - .Join(pocos, customer => customer.LastName, poco => poco.Value, (customer, poco) => poco); - var expected = Session.Query.All().AsEnumerable() - .Join(pocos, customer => customer.LastName, poco => poco.Value, (customer, poco) => poco); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - }); - } - - [Test] - public void Poco2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var pocos = Session.Query.All() - .Select(customer => new Poco(){Value1 = customer.LastName, Value2 = customer.LastName}) - .ToList(); - var query = Session.Query.All() - .Join(pocos, customer => customer.LastName, poco => poco.Value1, (customer, poco) => poco.Value1); - var expected = Session.Query.All().AsEnumerable() - .Join(pocos, customer => customer.LastName, poco => poco.Value1, (customer, poco) => poco.Value1); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void Poco3Test() - { - var query = Session.Query.All() - .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) - .Select(poco=>new {poco.Value1, poco.Value2}); - var expected = Session.Query.All() - .AsEnumerable() - .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) - .Select(poco=>new {poco.Value1, poco.Value2}); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void Poco4Test() - { - var query = Session.Query.All() - .Select(customer => new Poco(customer.LastName, customer.LastName)) - .Select(poco=>new {poco.Value1, poco.Value2}); - var expected = Session.Query.All() - .AsEnumerable() - .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) - .Select(poco=>new {poco.Value1, poco.Value2}); - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void ArrayContainsTest() - { - var list = new[] {"Michelle", "Jack"}; - var query = from c in Session.Query.All() - where !list.Contains(c.FirstName) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !list.Contains(c.FirstName) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void IListContainsTest() - { - var list = (IList) new List {"Michelle", "Jack"}; - var query = from c in Session.Query.All() - where !list.Contains(c.FirstName) - select c.Invoices; - var expected = from c in Session.Query.All().AsEnumerable() - where !list.Contains(c.FirstName) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - QueryDumper.Dump(query); - } - - [Test] - public void ListNewContainsTest() - { - var query = from c in Session.Query.All() - where !new List {"Michelle", "Jack"}.Contains(c.FirstName) - select c.Invoices; - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - } - - [Test] - public void TypeLoop1Test() - { - var nodes = new Node[10]; - var query = Session.Query.All() - .Join(nodes, invoice => invoice.Customer.Address.City, node => node.Name, (invoice, node) => new {invoice, node}); - Assert.Throws(() => QueryDumper.Dump(query)); - } - - [Test] - public void ContainsTest() - { - var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); - var query = Session.Query.All() - .Where(invoice => localInvoiceCommissions.Contains(invoice.Commission)); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable() - .Where(invoice => localInvoiceCommissions.Contains(invoice.Commission)); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void AnyTest() - { - var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); - var query = Session.Query.All() - .Where(invoice => localInvoiceCommissions.Any(commission => commission==invoice.Commission)); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable() - .Where(invoice => localInvoiceCommissions.Any(commission => commission==invoice.Commission)); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void AllTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); - var query = Session.Query.All() - .Where(invoice => localInvoiceCommissions.All(commission => commission!=invoice.Commission)); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable() - .Where(invoice => localInvoiceCommissions.All(commission => commission!=invoice.Commission)); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void KeyTest() - { - Assert.Throws( () => { - var keys = Session.Query.All().Take(10).Select(invoice => invoice.Key).ToList(); - var query = Session.Query.All() - .Join(keys, invoice => invoice.Key, key => key, (invoice, key) => new {invoice, key}); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable() - .Join(keys, invoice => invoice.Key, key => key, (invoice, key) => new {invoice, key}); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - }); - } - - [Test] - public void JoinEntityTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localInvoices = Session.Query.All().Take(5).ToList(); - var query = Session.Query.All().Join( - localInvoices, - invoice => invoice, - localInvoice => localInvoice, - (invoice, localInvoice) => new {invoice, localInvoice}); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable().Join( - localInvoices, - invoice => invoice, - localInvoice => localInvoice, - (invoice, localInvoice) => new {invoice, localInvoice}); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void JoinEntityFieldTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.MySql); - var localInvoices = Session.Query.All().Take(5).ToList(); - var query = Session.Query.All().Join( - localInvoices, - invoice => invoice.Commission, - localInvoice => localInvoice.Commission, - (invoice, localInvoice) => new {invoice, localInvoice}); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable().Join( - localInvoices, - invoice => invoice.Commission, - localInvoice => localInvoice.Commission, - (invoice, localInvoice) => new {invoice, localInvoice}); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void JoinEntityField2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localCommissions = Session.Query.All().Take(5).Select(invoice => invoice.Commission).ToList(); - var query = Session.Query.All().Join( - localCommissions, - invoice => invoice.Commission, - commission => commission, - (invoice, commission) => new {invoice, commission}); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable().Join( - localCommissions, - invoice => invoice.Commission, - commission => commission, - (invoice, commission) => new {invoice, commission}); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - [Test] - public void JoinEntityField2MaterializeTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localCommissions = Session.Query.All().Take(5).Select(invoice => invoice.Commission).ToList(); - var query = Session.Query.All().Join( - localCommissions, - invoice => invoice.Commission, - commission => commission, - (invoice, commission) => new {invoice, commission}).Select(x => x.commission); - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - var expectedQuery = Session.Query.All().AsEnumerable().Join( - localCommissions, - invoice => invoice.Commission, - commission => commission, - (invoice, commission) => new {invoice, commission}).Select(x => x.commission); - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - - - [Test] - public void SimpleConcatTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var customers = Session.Query.All(); - var result = customers.Where(c => c.Invoices.Count <= 1).Concat(Session.Query.All().ToList().Where(c => c.Invoices.Count > 1)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - Assert.AreEqual(customers.Count(), result.Count()); - } - - [Test] - public void SimpleUnionTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var tracks = Session.Query.All(); - var customers = Session.Query.All(); - var tracksFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); - var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); - var uniqueFirstChars = tracksFirstChars.Union(customerFirstChars); - Assert.That(uniqueFirstChars, Is.Not.Empty); - QueryDumper.Dump(uniqueFirstChars); - } - - [Test] - public void IntersectTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var tracks = Session.Query.All(); - var customers = Session.Query.All(); - var trackFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); - var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); - var commonFirstChars = trackFirstChars.Intersect(customerFirstChars); - Assert.That(commonFirstChars, Is.Not.Empty); - QueryDumper.Dump(commonFirstChars); - } - - [Test] - public void SimpleIntersectTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All() - .Select(i => i.DesignatedEmployee.BirthDate) - .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee.BirthDate)); - - var expected = Session.Query.All() - .AsEnumerable() - .Select(i => i.DesignatedEmployee.BirthDate) - .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee.BirthDate)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SimpleIntersectEntityTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All() - .Select(i => i.DesignatedEmployee) - .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee)); - - var expected = Session.Query.All() - .AsEnumerable() - .Select(i => i.DesignatedEmployee) - .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SimpleExceptTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var tracks = Session.Query.All(); - var customers = Session.Query.All(); - var trackFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); - var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); - var trackOnlyFirstChars = trackFirstChars.Except(customerFirstChars); - - Assert.That(trackOnlyFirstChars, Is.Not.Empty); - QueryDumper.Dump(trackOnlyFirstChars); - } - - [Test] - public void ConcatDifferentTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers - .Select(c => c.Phone) - .Concat(customers.ToList().Select(c => c.Fax)) - .Concat(employees.ToList().Select(e => e.Phone)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void ConcatDifferentTest2() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers - .Select(c => new {Name = c.FirstName, c.Phone}) - .Concat(employees.ToList().Select(e => new {Name = e.FirstName + " " + e.LastName, e.Phone})); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void UnionDifferentTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var employees = Session.Query.All(); - var result = employees - .Select(c => c.EmployeeId) - .Union(employees.ToList() - .Select(e => e.EmployeeId)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void UnionCollationsTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers - .Select(c => c.Address.Country) - .Union(employees.ToList().Select(e => e.Address.Country)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void IntersectDifferentTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers - .Select(c => c.Address.Country) - .Intersect(employees.ToList().Select(e => e.Address.Country)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void ExceptDifferentTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.MySql); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers - .Select(c => c.Address.Country) - .Except(employees.ToList().Select(e => e.Address.Country)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymousTest() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var customers = Session.Query.All(); - var result = customers.Select(c => new {c.Commission, c.InvoiceDate}) - .Union(customers.ToList().Select(c => new {Commission = c.Commission+1, c.InvoiceDate})); - var expected = customers.AsEnumerable().Select(c => new {c.Commission, c.InvoiceDate}) - .Union(customers.ToList().Select(c => new {Commission = c.Commission+1, c.InvoiceDate})); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(result).Count()); - } - - [Test] - public void UnionAnonymousCollationsTest() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var customers = Session.Query.All(); - var result = customers.Select(c => new {c.FirstName, c.LastName}) - .Take(10) - .Union(customers.ToList().Select(c => new {c.FirstName, c.LastName})); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymous2Test() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var customers = Session.Query.All(); - var result = customers.Select(c => new {c.FirstName, c.LastName, c.Address}) - .Where(c => c.Address.StreetAddress.Length < 10) - .Select(c => new {c.FirstName, c.Address.City}) - .Take(10) - .Union(customers.ToList().Select(c => new {c.FirstName, c.Address.City})).Where(c => c.FirstName.Length < 5); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymous3Test() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = customers.Select(c => new {c.FirstName, c.LastName, c.Address}) - .Where(c => c.Address.StreetAddress.Length < 15) - .Select(c => new {Name = c.FirstName, Address = c.Address.City}) - .Take(10) - .Union(employees.ToList().Select(e => new {Name = e.FirstName, Address = e.LastName})) - .Where(c => c.Address.Length < 7); - QueryDumper.Dump(result); - } - - [Test] - public void Grouping1Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localItems = GetLocalItems(10); - var queryable = Session.Query.Store(localItems); - var result = queryable - .GroupBy(keySelector => keySelector.Value3.Substring(0, 1), - (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) - .OrderBy(grouping => grouping.key); - var expected = localItems - .GroupBy(keySelector => keySelector.Value3.Substring(0, 1), - (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) - .OrderBy(grouping => grouping.key); - var expectedList = expected.ToList(); - var resultList = result.ToList(); - - Assert.That(resultList, Is.Not.Empty); - Assert.AreEqual(resultList.Count, expectedList.Count); - - for (var i = 0; i < resultList.Count; i++) { - Console.WriteLine(string.Format("Key (expected/result): {0} / {1}", expectedList[i].key, resultList[i].key)); - foreach (var expectedValue in expectedList[i].Value1) - Console.WriteLine(string.Format("Expected Value: {0}", expectedValue)); - foreach (var resultValue in resultList[i].Value1) - Console.WriteLine(string.Format("Result Value: {0}", resultValue)); - Assert.AreEqual(resultList[i].key, expectedList[i].key); - var isCorrect = expectedList[i].Value1.Except(resultList[i].Value1).Count()==0; - Assert.IsTrue(isCorrect); - } - QueryDumper.Dump(result); - } - - [Test] - public void Grouping2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localItems = GetLocalItems(10); - var queryable = Session.Query.Store(localItems); - var result = queryable - .GroupBy(keySelector => keySelector.Value3[0], (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) - .OrderBy(grouping => grouping.key); - var expected = localItems - .GroupBy(keySelector => keySelector.Value3[0], (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) - .OrderBy(grouping => grouping.key); - var expectedList = expected.ToList(); - var resultList = result.ToList(); - - Assert.That(resultList, Is.Not.Empty); - Assert.AreEqual(resultList.Count, expectedList.Count); - - for (var i = 0; i < resultList.Count; i++) { - Assert.AreEqual(resultList[i].key, expectedList[i].key); - Assert.AreEqual(0, expectedList[i].Value1.Except(resultList[i].Value1).Count()); - } - QueryDumper.Dump(result); - } - - [Test] - public void Subquery1Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localItems = GetLocalItems(10); - var queryable = Session.Query.Store(localItems); - var result = queryable.Select(poco => Session.Query.All() - .Where(invoice => invoice.Commission > poco.Value2)).AsEnumerable() - .Cast>(); - var expected = localItems.Select(poco => Session.Query.All().AsEnumerable() - .Where(invoice => invoice.Commission > poco.Value2)); - var expectedList = expected.ToList(); - var resultList = result.ToList(); - - Assert.That(resultList, Is.Not.Empty); - Assert.AreEqual(resultList.Count, expectedList.Count); - - for (var i = 0; i < resultList.Count; i++) { - Assert.AreEqual(0, expectedList[i].Except(resultList[i]).Count()); - } - QueryDumper.Dump(result); - } - - - - [Test] - public void Subquery2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localItems = GetLocalItems(10); - var queryable = Session.Query.Store(localItems); - var result = queryable - .Select(poco=> queryable.Where(poco2=>poco2.Value2 > poco.Value2).Select(p=>p.Value3)).AsEnumerable().Cast>(); - var expected = localItems - .Select(poco=> localItems.Where(poco2=>poco2.Value2 > poco.Value2).Select(p=>p.Value3)); - var expectedList = expected.ToList(); - var resultList = result.ToList(); - - Assert.That(resultList, Is.Not.Empty); - Assert.AreEqual(resultList.Count, expectedList.Count); - - for (var i = 0; i < resultList.Count; i++) { - Assert.AreEqual(0, expectedList[i].Except(resultList[i]).Count()); - } - QueryDumper.Dump(result); - } - - [Test] - public void Aggregate1Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - var localItems = GetLocalItems(100); - var queryable = Session.Query.Store(localItems); - var result = queryable.Average(selector => selector.Value1); - var expected = localItems.Average(selector => selector.Value1); - Assert.AreEqual(result, expected); - } - - - [Test] - public void Aggregate2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var localItems = GetLocalItems(100); - var queryable = Session.Query.Store(localItems); - var result = Session.Query.All() - .Where(invoice => invoice.Commission > queryable.Max(poco=>poco.Value2)); - var expected = Session.Query.All().AsEnumerable() - .Where(invoice => invoice.Commission > localItems.Max(poco=>poco.Value2)); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(result).Count()); - QueryDumper.Dump(result); - } - - [Test] - public void ClosureCacheTest() - { - Assert.Throws( () => { - var localItems = GetLocalItems(100); - var queryable = Session.Query.Store(localItems); - var result = Session.Query.Execute(qe => qe.All().Where(invoice => invoice.Commission > queryable.Max(poco => poco.Value2))); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - }); - } - - [Test] - [Ignore("Very long")] - public void VeryLongTest() - { - var localItems = GetLocalItems(1000000); - var result = Session.Query.All().Join( - localItems, - invoice => invoice.Commission, - localItem => localItem.Value1, - (invoice, item) => new {invoice.DesignatedEmployee, item.Value2}); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - private IEnumerable> GetLocalItems(int count) - { - return Enumerable - .Range(0, count) - .Select(i => new Poco { - Value1 = i, - Value2 = (decimal)i / 100, - Value3 = Guid.NewGuid().ToString() - } - ) - .ToList(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.09.07 + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using System.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Core; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.Linq.LocalCollectionsTest_Model; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq.LocalCollectionsTest_Model +{ + public class Node + { + public string Name { get; set; } + + public Node Parent { get; set; } + + public Node(string name) + { + Name = name; + } + } + + public class Poco + { + public T Value { get; set; } + + public bool Equals(Poco other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return Equals(other.Value, Value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (Poco)) + return false; + return Equals((Poco) obj); + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + } + + public class Poco + { + public T1 Value1 { get; set; } + public T2 Value2 { get; set; } + + public bool Equals(Poco other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return Equals(other.Value1, Value1) && Equals(other.Value2, Value2); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (Poco)) + return false; + return Equals((Poco) obj); + } + + public override int GetHashCode() + { + unchecked { + return (Value1.GetHashCode() * 397) ^ Value2.GetHashCode(); + } + } + + public Poco(T1 Value1, T2 Value2) + { + this.Value1 = Value1; + this.Value2 = Value2; + } + + public Poco() + { + + } + } + + public class Poco + { + public T1 Value1 { get; set; } + public T2 Value2 { get; set; } + public T3 Value3 { get; set; } + + public Poco(T1 Value1, T2 Value2, T3 Value3) + { + this.Value1 = Value1; + this.Value2 = Value2; + this.Value3 = Value3; + } + + public bool Equals(Poco other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return Equals(other.Value1, Value1) && Equals(other.Value2, Value2) && Equals(other.Value3, Value3); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (Poco)) + return false; + return Equals((Poco) obj); + } + + public override int GetHashCode() + { + unchecked { + int result = Value1.GetHashCode(); + result = (result * 397) ^ Value2.GetHashCode(); + result = (result * 397) ^ Value3.GetHashCode(); + return result; + } + } + + public Poco() + { + + } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + public class LocalCollectionsTest : ChinookDOModelTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Node).Assembly, typeof (Node).Namespace); + return config; + } + + [Test] + public void JoinWithLazyLoadFieldTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + // Track.Bytes is LazyLoad field. + var tracks = Session.Query.All().Take(10).ToList(); + var result = + (from il1 in Session.Query.All().Select(il => il.Track) + join il2 in tracks on il1 equals il2 + select new {il1, il2}) + .Take(10); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + } + + [Test] + public void ListContainsTest() + { + var list = new List(){"Michelle", "Jack"}; + var query = from c in Session.Query.All() + where !list.Contains(c.FirstName) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !list.Contains(c.FirstName) + select c.Invoices; + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void ReuseContainsTest() + { + var list = new List {382066, 264829}; + var tracks = GetTracks(list); + foreach (var track in tracks) + Assert.IsTrue(list.Contains(track.Milliseconds)); + + list = new List {217573}; + tracks = GetTracks(list); + foreach (var track in tracks) + Assert.IsTrue(list.Contains(track.Milliseconds)); + + IEnumerable GetTracks(IEnumerable ms) + { + return Session.Query.Execute(qe => + from track in qe.All() + where ms.Contains(track.Milliseconds) + select track); + } + } + + [Test] + public void PairTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var pairs = Session.Query.All() + .Select(customer => new Pair(customer.LastName, (int)customer.Invoices.Count)) + .ToList(); + var query = Session.Query.All() + .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => new {customer, pair.Second}); + var expected = Session.Query.All().AsEnumerable() + .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => new {customer, pair.Second}); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void Pair2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var pairs = Session.Query.All() + .Select(customer => new Pair(customer.LastName, (int)customer.Invoices.Count)) + .ToList(); + var query = Session.Query.All() + .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => pair.Second); + var expected = Session.Query.All().AsEnumerable() + .Join(pairs, customer => customer.LastName, pair => pair.First, (customer, pair) => pair.Second); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void Poco1Test() + { + Assert.Throws(() => { + var pocos = Session.Query.All() + .Select(customer => new Poco() { Value = customer.LastName }) + .ToList(); + var query = Session.Query.All() + .Join(pocos, customer => customer.LastName, poco => poco.Value, (customer, poco) => poco); + var expected = Session.Query.All().AsEnumerable() + .Join(pocos, customer => customer.LastName, poco => poco.Value, (customer, poco) => poco); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + }); + } + + [Test] + public void Poco2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var pocos = Session.Query.All() + .Select(customer => new Poco(){Value1 = customer.LastName, Value2 = customer.LastName}) + .ToList(); + var query = Session.Query.All() + .Join(pocos, customer => customer.LastName, poco => poco.Value1, (customer, poco) => poco.Value1); + var expected = Session.Query.All().AsEnumerable() + .Join(pocos, customer => customer.LastName, poco => poco.Value1, (customer, poco) => poco.Value1); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void Poco3Test() + { + var query = Session.Query.All() + .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) + .Select(poco=>new {poco.Value1, poco.Value2}); + var expected = Session.Query.All() + .AsEnumerable() + .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) + .Select(poco=>new {poco.Value1, poco.Value2}); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void Poco4Test() + { + var query = Session.Query.All() + .Select(customer => new Poco(customer.LastName, customer.LastName)) + .Select(poco=>new {poco.Value1, poco.Value2}); + var expected = Session.Query.All() + .AsEnumerable() + .Select(customer => new Poco{Value1 = customer.LastName, Value2 = customer.LastName}) + .Select(poco=>new {poco.Value1, poco.Value2}); + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void ArrayContainsTest() + { + var list = new[] {"Michelle", "Jack"}; + var query = from c in Session.Query.All() + where !list.Contains(c.FirstName) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !list.Contains(c.FirstName) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void IListContainsTest() + { + var list = (IList) new List {"Michelle", "Jack"}; + var query = from c in Session.Query.All() + where !list.Contains(c.FirstName) + select c.Invoices; + var expected = from c in Session.Query.All().AsEnumerable() + where !list.Contains(c.FirstName) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + QueryDumper.Dump(query); + } + + [Test] + public void ListNewContainsTest() + { + var query = from c in Session.Query.All() + where !new List {"Michelle", "Jack"}.Contains(c.FirstName) + select c.Invoices; + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + } + + [Test] + public void TypeLoop1Test() + { + var nodes = new Node[10]; + var query = Session.Query.All() + .Join(nodes, invoice => invoice.Customer.Address.City, node => node.Name, (invoice, node) => new {invoice, node}); + Assert.Throws(() => QueryDumper.Dump(query)); + } + + [Test] + public void ContainsTest() + { + var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); + var query = Session.Query.All() + .Where(invoice => localInvoiceCommissions.Contains(invoice.Commission)); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable() + .Where(invoice => localInvoiceCommissions.Contains(invoice.Commission)); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void AnyTest() + { + var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); + var query = Session.Query.All() + .Where(invoice => localInvoiceCommissions.Any(commission => commission==invoice.Commission)); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable() + .Where(invoice => localInvoiceCommissions.Any(commission => commission==invoice.Commission)); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void AllTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localInvoiceCommissions = Session.Query.All().Select(invoice => invoice.Commission).Take(5).ToList(); + var query = Session.Query.All() + .Where(invoice => localInvoiceCommissions.All(commission => commission!=invoice.Commission)); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable() + .Where(invoice => localInvoiceCommissions.All(commission => commission!=invoice.Commission)); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void KeyTest() + { + Assert.Throws( () => { + var keys = Session.Query.All().Take(10).Select(invoice => invoice.Key).ToList(); + var query = Session.Query.All() + .Join(keys, invoice => invoice.Key, key => key, (invoice, key) => new {invoice, key}); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable() + .Join(keys, invoice => invoice.Key, key => key, (invoice, key) => new {invoice, key}); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + }); + } + + [Test] + public void JoinEntityTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localInvoices = Session.Query.All().Take(5).ToList(); + var query = Session.Query.All().Join( + localInvoices, + invoice => invoice, + localInvoice => localInvoice, + (invoice, localInvoice) => new {invoice, localInvoice}); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable().Join( + localInvoices, + invoice => invoice, + localInvoice => localInvoice, + (invoice, localInvoice) => new {invoice, localInvoice}); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void JoinEntityFieldTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.MySql); + var localInvoices = Session.Query.All().Take(5).ToList(); + var query = Session.Query.All().Join( + localInvoices, + invoice => invoice.Commission, + localInvoice => localInvoice.Commission, + (invoice, localInvoice) => new {invoice, localInvoice}); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable().Join( + localInvoices, + invoice => invoice.Commission, + localInvoice => localInvoice.Commission, + (invoice, localInvoice) => new {invoice, localInvoice}); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void JoinEntityField2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localCommissions = Session.Query.All().Take(5).Select(invoice => invoice.Commission).ToList(); + var query = Session.Query.All().Join( + localCommissions, + invoice => invoice.Commission, + commission => commission, + (invoice, commission) => new {invoice, commission}); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable().Join( + localCommissions, + invoice => invoice.Commission, + commission => commission, + (invoice, commission) => new {invoice, commission}); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + [Test] + public void JoinEntityField2MaterializeTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localCommissions = Session.Query.All().Take(5).Select(invoice => invoice.Commission).ToList(); + var query = Session.Query.All().Join( + localCommissions, + invoice => invoice.Commission, + commission => commission, + (invoice, commission) => new {invoice, commission}).Select(x => x.commission); + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + var expectedQuery = Session.Query.All().AsEnumerable().Join( + localCommissions, + invoice => invoice.Commission, + commission => commission, + (invoice, commission) => new {invoice, commission}).Select(x => x.commission); + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + + + [Test] + public void SimpleConcatTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var customers = Session.Query.All(); + var result = customers.Where(c => c.Invoices.Count <= 1).Concat(Session.Query.All().ToList().Where(c => c.Invoices.Count > 1)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + Assert.AreEqual(customers.Count(), result.Count()); + } + + [Test] + public void SimpleUnionTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var tracks = Session.Query.All(); + var customers = Session.Query.All(); + var tracksFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); + var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); + var uniqueFirstChars = tracksFirstChars.Union(customerFirstChars); + Assert.That(uniqueFirstChars, Is.Not.Empty); + QueryDumper.Dump(uniqueFirstChars); + } + + [Test] + public void IntersectTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var tracks = Session.Query.All(); + var customers = Session.Query.All(); + var trackFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); + var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); + var commonFirstChars = trackFirstChars.Intersect(customerFirstChars); + Assert.That(commonFirstChars, Is.Not.Empty); + QueryDumper.Dump(commonFirstChars); + } + + [Test] + public void SimpleIntersectTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All() + .Select(i => i.DesignatedEmployee.BirthDate) + .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee.BirthDate)); + + var expected = Session.Query.All() + .AsEnumerable() + .Select(i => i.DesignatedEmployee.BirthDate) + .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee.BirthDate)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SimpleIntersectEntityTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All() + .Select(i => i.DesignatedEmployee) + .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee)); + + var expected = Session.Query.All() + .AsEnumerable() + .Select(i => i.DesignatedEmployee) + .Intersect(Session.Query.All().ToList().Select(i => i.DesignatedEmployee)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SimpleExceptTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var tracks = Session.Query.All(); + var customers = Session.Query.All(); + var trackFirstChars = tracks.Select(t => t.Name.Substring(0, 1)); + var customerFirstChars = customers.Select(c => c.FirstName.Substring(0, 1)).ToList(); + var trackOnlyFirstChars = trackFirstChars.Except(customerFirstChars); + + Assert.That(trackOnlyFirstChars, Is.Not.Empty); + QueryDumper.Dump(trackOnlyFirstChars); + } + + [Test] + public void ConcatDifferentTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers + .Select(c => c.Phone) + .Concat(customers.ToList().Select(c => c.Fax)) + .Concat(employees.ToList().Select(e => e.Phone)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void ConcatDifferentTest2() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers + .Select(c => new {Name = c.FirstName, c.Phone}) + .Concat(employees.ToList().Select(e => new {Name = e.FirstName + " " + e.LastName, e.Phone})); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void UnionDifferentTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var employees = Session.Query.All(); + var result = employees + .Select(c => c.EmployeeId) + .Union(employees.ToList() + .Select(e => e.EmployeeId)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void UnionCollationsTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers + .Select(c => c.Address.Country) + .Union(employees.ToList().Select(e => e.Address.Country)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void IntersectDifferentTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers + .Select(c => c.Address.Country) + .Intersect(employees.ToList().Select(e => e.Address.Country)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void ExceptDifferentTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.MySql); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers + .Select(c => c.Address.Country) + .Except(employees.ToList().Select(e => e.Address.Country)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymousTest() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var customers = Session.Query.All(); + var result = customers.Select(c => new {c.Commission, c.InvoiceDate}) + .Union(customers.ToList().Select(c => new {Commission = c.Commission+1, c.InvoiceDate})); + var expected = customers.AsEnumerable().Select(c => new {c.Commission, c.InvoiceDate}) + .Union(customers.ToList().Select(c => new {Commission = c.Commission+1, c.InvoiceDate})); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(result).Count()); + } + + [Test] + public void UnionAnonymousCollationsTest() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var customers = Session.Query.All(); + var result = customers.Select(c => new {c.FirstName, c.LastName}) + .Take(10) + .Union(customers.ToList().Select(c => new {c.FirstName, c.LastName})); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymous2Test() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var customers = Session.Query.All(); + var result = customers.Select(c => new {c.FirstName, c.LastName, c.Address}) + .Where(c => c.Address.StreetAddress.Length < 10) + .Select(c => new {c.FirstName, c.Address.City}) + .Take(10) + .Union(customers.ToList().Select(c => new {c.FirstName, c.Address.City})).Where(c => c.FirstName.Length < 5); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymous3Test() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = customers.Select(c => new {c.FirstName, c.LastName, c.Address}) + .Where(c => c.Address.StreetAddress.Length < 15) + .Select(c => new {Name = c.FirstName, Address = c.Address.City}) + .Take(10) + .Union(employees.ToList().Select(e => new {Name = e.FirstName, Address = e.LastName})) + .Where(c => c.Address.Length < 7); + QueryDumper.Dump(result); + } + + [Test] + public void Grouping1Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localItems = GetLocalItems(10); + var queryable = Session.Query.Store(localItems); + var result = queryable + .GroupBy(keySelector => keySelector.Value3.Substring(0, 1), + (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) + .OrderBy(grouping => grouping.key); + var expected = localItems + .GroupBy(keySelector => keySelector.Value3.Substring(0, 1), + (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) + .OrderBy(grouping => grouping.key); + var expectedList = expected.ToList(); + var resultList = result.ToList(); + + Assert.That(resultList, Is.Not.Empty); + Assert.AreEqual(resultList.Count, expectedList.Count); + + for (var i = 0; i < resultList.Count; i++) { + Console.WriteLine(string.Format("Key (expected/result): {0} / {1}", expectedList[i].key, resultList[i].key)); + foreach (var expectedValue in expectedList[i].Value1) + Console.WriteLine(string.Format("Expected Value: {0}", expectedValue)); + foreach (var resultValue in resultList[i].Value1) + Console.WriteLine(string.Format("Result Value: {0}", resultValue)); + Assert.AreEqual(resultList[i].key, expectedList[i].key); + var isCorrect = expectedList[i].Value1.Except(resultList[i].Value1).Count()==0; + Assert.IsTrue(isCorrect); + } + QueryDumper.Dump(result); + } + + [Test] + public void Grouping2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localItems = GetLocalItems(10); + var queryable = Session.Query.Store(localItems); + var result = queryable + .GroupBy(keySelector => keySelector.Value3[0], (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) + .OrderBy(grouping => grouping.key); + var expected = localItems + .GroupBy(keySelector => keySelector.Value3[0], (key, grouping) => new {key, Value1 = grouping.Select(p => p.Value1)}) + .OrderBy(grouping => grouping.key); + var expectedList = expected.ToList(); + var resultList = result.ToList(); + + Assert.That(resultList, Is.Not.Empty); + Assert.AreEqual(resultList.Count, expectedList.Count); + + for (var i = 0; i < resultList.Count; i++) { + Assert.AreEqual(resultList[i].key, expectedList[i].key); + Assert.AreEqual(0, expectedList[i].Value1.Except(resultList[i].Value1).Count()); + } + QueryDumper.Dump(result); + } + + [Test] + public void Subquery1Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localItems = GetLocalItems(10); + var queryable = Session.Query.Store(localItems); + var result = queryable.Select(poco => Session.Query.All() + .Where(invoice => invoice.Commission > poco.Value2)).AsEnumerable() + .Cast>(); + var expected = localItems.Select(poco => Session.Query.All().AsEnumerable() + .Where(invoice => invoice.Commission > poco.Value2)); + var expectedList = expected.ToList(); + var resultList = result.ToList(); + + Assert.That(resultList, Is.Not.Empty); + Assert.AreEqual(resultList.Count, expectedList.Count); + + for (var i = 0; i < resultList.Count; i++) { + Assert.AreEqual(0, expectedList[i].Except(resultList[i]).Count()); + } + QueryDumper.Dump(result); + } + + + + [Test] + public void Subquery2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localItems = GetLocalItems(10); + var queryable = Session.Query.Store(localItems); + var result = queryable + .Select(poco=> queryable.Where(poco2=>poco2.Value2 > poco.Value2).Select(p=>p.Value3)).AsEnumerable().Cast>(); + var expected = localItems + .Select(poco=> localItems.Where(poco2=>poco2.Value2 > poco.Value2).Select(p=>p.Value3)); + var expectedList = expected.ToList(); + var resultList = result.ToList(); + + Assert.That(resultList, Is.Not.Empty); + Assert.AreEqual(resultList.Count, expectedList.Count); + + for (var i = 0; i < resultList.Count; i++) { + Assert.AreEqual(0, expectedList[i].Except(resultList[i]).Count()); + } + QueryDumper.Dump(result); + } + + [Test] + public void Aggregate1Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + var localItems = GetLocalItems(100); + var queryable = Session.Query.Store(localItems); + var result = queryable.Average(selector => selector.Value1); + var expected = localItems.Average(selector => selector.Value1); + Assert.AreEqual(result, expected); + } + + + [Test] + public void Aggregate2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var localItems = GetLocalItems(100); + var queryable = Session.Query.Store(localItems); + var result = Session.Query.All() + .Where(invoice => invoice.Commission > queryable.Max(poco=>poco.Value2)); + var expected = Session.Query.All().AsEnumerable() + .Where(invoice => invoice.Commission > localItems.Max(poco=>poco.Value2)); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(result).Count()); + QueryDumper.Dump(result); + } + + [Test] + public void ClosureCacheTest() + { + Assert.Throws( () => { + var localItems = GetLocalItems(100); + var queryable = Session.Query.Store(localItems); + var result = Session.Query.Execute(qe => qe.All().Where(invoice => invoice.Commission > queryable.Max(poco => poco.Value2))); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + }); + } + + [Test] + [Ignore("Very long")] + public void VeryLongTest() + { + var localItems = GetLocalItems(1000000); + var result = Session.Query.All().Join( + localItems, + invoice => invoice.Commission, + localItem => localItem.Value1, + (invoice, item) => new {invoice.DesignatedEmployee, item.Value2}); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + private IEnumerable> GetLocalItems(int count) + { + return Enumerable + .Range(0, count) + .Select(i => new Poco { + Value1 = i, + Value2 = (decimal)i / 100, + Value3 = Guid.NewGuid().ToString() + } + ) + .ToList(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/LockTest.cs b/Orm/Xtensive.Orm.Tests/Linq/LockTest.cs index 548473222b..e67cacef10 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/LockTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/LockTest.cs @@ -1,261 +1,261 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.08.25 - -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class LockTest : ChinookDOModelTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); - } - - [Test] - public void UpdateLockThrowTest() - { - var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, - LockMode.Update, LockBehavior.ThrowIfLocked); -// Assert.AreEqual(typeof(StorageException), catchedException.GetType()); - } - - [Test] - public void CachingTest() - { - List trackIds = new List(32); - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (var i = 0; i < trackIds.Capacity; i++) - trackIds.Add(new AudioTrack() {Name = "SomeTrack"}.TrackId); - - transaction.Complete(); - } - - ConcurrentBag> results = new ConcurrentBag>(); - var source = trackIds.Select(t => new {PId = t, Bag = results}); - - Parallel.ForEach( - source, - new ParallelOptions {MaxDegreeOfParallelism = 4}, - (sourceItem, state, currentItteration) => { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var trackToLock = session.Query.All().FirstOrDefault(t => t.TrackId==sourceItem.PId); - - EventHandler handler = (sender, args) => { - sourceItem.Bag.Add(new Pair(sourceItem.PId, (int)args.Command.Parameters[0].Value)); - }; - session.Events.DbCommandExecuting += handler; - - if (trackToLock!=null) - trackToLock.Lock(LockMode.Update, LockBehavior.Wait); - - session.Events.DbCommandExecuting -= handler; - } - }); - - try { - Assert.That(results.Count, Is.EqualTo(trackIds.Capacity)); - Assert.That(results.All(t => t.First==t.Second), Is.True); - } - finally { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - session.Remove(session.Query.All().Where(t => t.TrackId.In(trackIds))); - transaction.Complete(); - } - } - } - - - [Test] - public void LockNewlyCreatedEntity() - { - var track = new AudioTrack() {Name = "SomeTrack"}; - using (Session.DisableSaveChanges()) - track.Lock(LockMode.Exclusive, LockBehavior.ThrowIfLocked); - } - - [Test] - public void UpdateLockSkipTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var key = Session.Query.All().First().Key; - var expected = Session.Query.All().Where(c => c.Key == key) - .Lock(LockMode.Update, LockBehavior.Wait).ToList(); - Exception catchedException = null; - int countAfterSkip = 0; - var secondThread = new Thread(() => { - try { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - countAfterSkip = session.Query.All() - .Where(c => c.Key == key) - .Lock(LockMode.Update, LockBehavior.Skip) - .ToList().Count; - } - catch(Exception e) { - catchedException = e; - } - }); - secondThread.Start(); - secondThread.Join(); - if (catchedException != null) - throw catchedException; - Assert.AreEqual(0, countAfterSkip); - } - - [Test] - public void ShareLockThrowTest() - { - Require.ProviderIs(StorageProvider.PostgreSql); - var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, - LockMode.Shared, LockBehavior.ThrowIfLocked); - Assert.AreEqual(typeof(StorageException), catchedException.GetType()); - } - - [Test] - public void ExclusiveLockThrowTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, - LockMode.Exclusive, LockBehavior.ThrowIfLocked); - Assert.AreEqual(typeof(StorageException), catchedException.GetType()); - } - - [Test] - public void ShareLockTest() - { - Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); - var catchedException = ExecuteConcurrentQueries(LockMode.Shared, LockBehavior.ThrowIfLocked, - LockMode.Shared, LockBehavior.ThrowIfLocked); - Assert.IsNull(catchedException); - } - - [Test] - public void LockAfterJoinTest() - { - Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); - var customerKey = Session.Query.All().First().Key; - var invoiceKey = Session.Query.All().Where(i => i.Customer.Key==customerKey).First().Key; - Exception firstThreadException = null; - Exception result = null; - var firstEvent = new ManualResetEvent(false); - var secondEvent = new ManualResetEvent(false); - var firstThread = new Thread(() => { - try { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - session.Query.All().Where(c => c.Key == customerKey) - .Join(session.Query.All().Where(i => i.Key == invoiceKey), c => c, i => i.Customer, (c, i) => c) - .Lock(LockMode.Update, LockBehavior.Wait).ToList(); - secondEvent.Set(); - firstEvent.WaitOne(); - } - } - catch(Exception e) { - firstThreadException = e; - secondEvent.Set(); - return; - } - }); - firstThread.Start(); - secondEvent.WaitOne(); - var secondException = ExecuteQueryAtSeparateThread(s => s.Query.All() - .Where(c => c.Key==customerKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); - Assert.AreEqual(typeof(StorageException), secondException.GetType()); - var thirdException = ExecuteQueryAtSeparateThread(s => s.Query.All() - .Where(i => i.Key==invoiceKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); - Assert.AreEqual(typeof(StorageException), thirdException.GetType()); - firstEvent.Set(); - firstThread.Join(); - if (firstThreadException != null) - throw firstThreadException; - } - - [Test] - public void LockEntityTest() - { - Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); - var customer = Session.Query.All().First(); - var customerKey = customer.Key; - customer.Lock(LockMode.Update, LockBehavior.Wait); - var catchedException = ExecuteQueryAtSeparateThread(s => - s.Query.All().Where(c => c == customer).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); - Assert.AreEqual(typeof(StorageException), catchedException.GetType()); - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - AssertEx.Throws(() => - session.Query.Single(customerKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); - } - - private Exception ExecuteConcurrentQueries(LockMode lockMode0, LockBehavior lockBehavior0, - LockMode lockMode1, LockBehavior lockBehavior1) - { - var key = Session.Query.All().First().Key; - Exception firstThreadException = null; - Exception result = null; - var firstEvent = new ManualResetEvent(false); - var secondEvent = new ManualResetEvent(false); - var firstThread = new Thread(() => { - try { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - session.Query.All().Where(c => c.Key == key).Lock(lockMode0, lockBehavior0).ToList(); - secondEvent.Set(); - firstEvent.WaitOne(); - } - } - catch(Exception e) { - firstThreadException = e; - secondEvent.Set(); - return; - } - }); - firstThread.Start(); - secondEvent.WaitOne(); - if (firstThreadException != null) - throw firstThreadException; - result = ExecuteQueryAtSeparateThread(s => s.Query.All() - .Where(c => c.Key == key).Lock(lockMode1, lockBehavior1)); - firstEvent.Set(); - firstThread.Join(); - return result; - } - - private Exception ExecuteQueryAtSeparateThread(Func> query) - { - Exception result = null; - var thread = new Thread(() => { - try { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - query.Invoke(session).ToList(); - } - } - catch(Exception e) { - result = e; - return; - } - }); - thread.Start(); - thread.Join(); - return result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.08.25 + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class LockTest : ChinookDOModelTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesNotSupported(ProviderFeatures.ExclusiveWriterConnection); + } + + [Test] + public void UpdateLockThrowTest() + { + var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, + LockMode.Update, LockBehavior.ThrowIfLocked); +// Assert.AreEqual(typeof(StorageException), catchedException.GetType()); + } + + [Test] + public void CachingTest() + { + List trackIds = new List(32); + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (var i = 0; i < trackIds.Capacity; i++) + trackIds.Add(new AudioTrack() {Name = "SomeTrack"}.TrackId); + + transaction.Complete(); + } + + ConcurrentBag> results = new ConcurrentBag>(); + var source = trackIds.Select(t => new {PId = t, Bag = results}); + + Parallel.ForEach( + source, + new ParallelOptions {MaxDegreeOfParallelism = 4}, + (sourceItem, state, currentItteration) => { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var trackToLock = session.Query.All().FirstOrDefault(t => t.TrackId==sourceItem.PId); + + EventHandler handler = (sender, args) => { + sourceItem.Bag.Add(new Pair(sourceItem.PId, (int)args.Command.Parameters[0].Value)); + }; + session.Events.DbCommandExecuting += handler; + + if (trackToLock!=null) + trackToLock.Lock(LockMode.Update, LockBehavior.Wait); + + session.Events.DbCommandExecuting -= handler; + } + }); + + try { + Assert.That(results.Count, Is.EqualTo(trackIds.Capacity)); + Assert.That(results.All(t => t.First==t.Second), Is.True); + } + finally { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + session.Remove(session.Query.All().Where(t => t.TrackId.In(trackIds))); + transaction.Complete(); + } + } + } + + + [Test] + public void LockNewlyCreatedEntity() + { + var track = new AudioTrack() {Name = "SomeTrack"}; + using (Session.DisableSaveChanges()) + track.Lock(LockMode.Exclusive, LockBehavior.ThrowIfLocked); + } + + [Test] + public void UpdateLockSkipTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var key = Session.Query.All().First().Key; + var expected = Session.Query.All().Where(c => c.Key == key) + .Lock(LockMode.Update, LockBehavior.Wait).ToList(); + Exception catchedException = null; + int countAfterSkip = 0; + var secondThread = new Thread(() => { + try { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + countAfterSkip = session.Query.All() + .Where(c => c.Key == key) + .Lock(LockMode.Update, LockBehavior.Skip) + .ToList().Count; + } + catch(Exception e) { + catchedException = e; + } + }); + secondThread.Start(); + secondThread.Join(); + if (catchedException != null) + throw catchedException; + Assert.AreEqual(0, countAfterSkip); + } + + [Test] + public void ShareLockThrowTest() + { + Require.ProviderIs(StorageProvider.PostgreSql); + var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, + LockMode.Shared, LockBehavior.ThrowIfLocked); + Assert.AreEqual(typeof(StorageException), catchedException.GetType()); + } + + [Test] + public void ExclusiveLockThrowTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var catchedException = ExecuteConcurrentQueries(LockMode.Update, LockBehavior.Wait, + LockMode.Exclusive, LockBehavior.ThrowIfLocked); + Assert.AreEqual(typeof(StorageException), catchedException.GetType()); + } + + [Test] + public void ShareLockTest() + { + Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); + var catchedException = ExecuteConcurrentQueries(LockMode.Shared, LockBehavior.ThrowIfLocked, + LockMode.Shared, LockBehavior.ThrowIfLocked); + Assert.IsNull(catchedException); + } + + [Test] + public void LockAfterJoinTest() + { + Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); + var customerKey = Session.Query.All().First().Key; + var invoiceKey = Session.Query.All().Where(i => i.Customer.Key==customerKey).First().Key; + Exception firstThreadException = null; + Exception result = null; + var firstEvent = new ManualResetEvent(false); + var secondEvent = new ManualResetEvent(false); + var firstThread = new Thread(() => { + try { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + session.Query.All().Where(c => c.Key == customerKey) + .Join(session.Query.All().Where(i => i.Key == invoiceKey), c => c, i => i.Customer, (c, i) => c) + .Lock(LockMode.Update, LockBehavior.Wait).ToList(); + secondEvent.Set(); + firstEvent.WaitOne(); + } + } + catch(Exception e) { + firstThreadException = e; + secondEvent.Set(); + return; + } + }); + firstThread.Start(); + secondEvent.WaitOne(); + var secondException = ExecuteQueryAtSeparateThread(s => s.Query.All() + .Where(c => c.Key==customerKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); + Assert.AreEqual(typeof(StorageException), secondException.GetType()); + var thirdException = ExecuteQueryAtSeparateThread(s => s.Query.All() + .Where(i => i.Key==invoiceKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); + Assert.AreEqual(typeof(StorageException), thirdException.GetType()); + firstEvent.Set(); + firstThread.Join(); + if (firstThreadException != null) + throw firstThreadException; + } + + [Test] + public void LockEntityTest() + { + Require.ProviderIs(StorageProvider.SqlServer | StorageProvider.PostgreSql); + var customer = Session.Query.All().First(); + var customerKey = customer.Key; + customer.Lock(LockMode.Update, LockBehavior.Wait); + var catchedException = ExecuteQueryAtSeparateThread(s => + s.Query.All().Where(c => c == customer).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); + Assert.AreEqual(typeof(StorageException), catchedException.GetType()); + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + AssertEx.Throws(() => + session.Query.Single(customerKey).Lock(LockMode.Update, LockBehavior.ThrowIfLocked)); + } + + private Exception ExecuteConcurrentQueries(LockMode lockMode0, LockBehavior lockBehavior0, + LockMode lockMode1, LockBehavior lockBehavior1) + { + var key = Session.Query.All().First().Key; + Exception firstThreadException = null; + Exception result = null; + var firstEvent = new ManualResetEvent(false); + var secondEvent = new ManualResetEvent(false); + var firstThread = new Thread(() => { + try { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + session.Query.All().Where(c => c.Key == key).Lock(lockMode0, lockBehavior0).ToList(); + secondEvent.Set(); + firstEvent.WaitOne(); + } + } + catch(Exception e) { + firstThreadException = e; + secondEvent.Set(); + return; + } + }); + firstThread.Start(); + secondEvent.WaitOne(); + if (firstThreadException != null) + throw firstThreadException; + result = ExecuteQueryAtSeparateThread(s => s.Query.All() + .Where(c => c.Key == key).Lock(lockMode1, lockBehavior1)); + firstEvent.Set(); + firstThread.Join(); + return result; + } + + private Exception ExecuteQueryAtSeparateThread(Func> query) + { + Exception result = null; + var thread = new Thread(() => { + try { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + query.Invoke(session).ToList(); + } + } + catch(Exception e) { + result = e; + return; + } + }); + thread.Start(); + thread.Join(); + return result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.Classes.cs b/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.Classes.cs index e5115a51cb..b7c54a765d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.Classes.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.Classes.cs @@ -1,411 +1,411 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.10 - -using System; -using System.Collections.Generic; -using System.Reflection; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Linq -{ - partial class MemberCompilerProviderTest - { - private class NonGenericTarget - { - private string dummy; - - public string InstanceField; - public static string StaticField; - - static public long StaticNonGenericMethod(int a, long b) - { - return a + b; - } - - static public string StaticGenericMethod (T1 obj) - { - return obj.ToString(); - } - - public int InstanceNonGenericMethod(int k) - { - return k; - } - - public T1 InstanceGenericMethod () where T1 : new() - { - return new T1(); - } - - public int MethodWithBuggyCompiler() - { - return 0; - } - - public static int StaticProperty { get; set; } - - public string InstanceProperty { get; set; } - - internal string InternalProperty { get; set; } - - public string this[int a, int b]{ - get { return dummy; } - set { dummy = value; } - } - - public NonGenericTarget(int k) - { - dummy = k.ToString(); - } - } - - private class GenericTarget - { - private T dummy; - - public int InstanceField; - public static int StaticField; - - static public string StaticNonGenericMethod(T obj, int n) - { - return obj.ToString() + n.ToString(); - } - - static public T1 StaticGenericMethod (T obj) where T1 : class - { - return obj as T1; - } - - public short InstanceNonGenericMethod() - { - return 0; - } - - public int InstanceGenericMethod(T1 obj, int n) where T1 : class - { - return obj.GetHashCode() + n; - } - - public static int StaticProperty { get; set; } - - public string InstanceProperty { get; set; } - - public T this[string s] - { - get { return dummy; } - set { dummy = value; } - } - - public GenericTarget(T obj, int k) - { - dummy = obj; - StaticProperty = k; - } - } - - private class CtorCompiler - { - [Compiler(typeof(NonGenericTarget), null, TargetKind.Constructor)] - static public string C1([Type(typeof(int))] string k) - { - return "NonGenericTarget.ctor"; - } - - [Compiler(typeof(GenericTarget<>), null, TargetKind.Constructor)] - static public string C2 (MemberInfo memberInfo, string obj, [Type(typeof(int))] string k) - { - return "GenericTarget`1.ctor"; - } - } - - private class FieldCompiler - { - [Compiler(typeof(NonGenericTarget), "InstanceField", TargetKind.Field)] - static public string C1(string this_) - { - return "NonGenericTarget.InstanceField"; - } - - [Compiler(typeof(NonGenericTarget), "StaticField", TargetKind.Static | TargetKind.Field)] - static public string C2() - { - return "NonGenericTarget.StaticField"; - } - - [Compiler(typeof(GenericTarget<>), "InstanceField", TargetKind.Field)] - static public string C3(MemberInfo memberInfo, string this_) - { - return "GenericTarget`1.InstanceField"; - } - - [Compiler(typeof(GenericTarget<>), "StaticField", TargetKind.Static | TargetKind.Field)] - static public string C4(MemberInfo memberInfo) - { - return "GenericTarget`1.StaticField"; - } - } - - private class MethodCompiler - { - #region Compilers for NonGenericTarget methods - - [Compiler(typeof(NonGenericTarget), "StaticNonGenericMethod", TargetKind.Method | TargetKind.Static)] - static public string C1([Type(typeof(int))]string a, [Type(typeof(long))]string b) - { - return "NonGenericTarget.StaticNonGenericMethod"; - } - - [Compiler(typeof(NonGenericTarget), "StaticGenericMethod", TargetKind.Method | TargetKind.Static, 1)] - static public string C2(MemberInfo memberInfo, string s) - { - return "NonGenericTarget.StaticGenericMethod"; - } - - [Compiler(typeof(NonGenericTarget), "InstanceNonGenericMethod")] - static public string C3(string this_, [Type(typeof(int))] string s) - { - return "NonGenericTarget.InstanceNonGenericMethod"; - } - - [Compiler(typeof(NonGenericTarget), "InstanceGenericMethod", 1)] - static public string C4(MemberInfo memberInfo, string this_) - { - return "NonGenericTarget.InstanceGenericMethod"; - } - - [Compiler(typeof (NonGenericTarget), "MethodWithBuggyCompiler")] - static public string CompilerWithException(string this_) - { - throw new NotImplementedException(); - } - - #endregion - - #region Compilers for GenericTarget methods - - [Compiler(typeof(GenericTarget<>), "StaticNonGenericMethod", TargetKind.Method | TargetKind.Static)] - static public string C5(MemberInfo memberInfo, string s1, [Type(typeof(int))] string s2) - { - return "GenericTarget`1.StaticNonGenericMethod"; - } - - [Compiler(typeof(GenericTarget<>), "StaticGenericMethod", TargetKind.Method | TargetKind.Static, 1)] - static public string C6(MemberInfo memberInfo, string s) - { - return "GenericTarget`1.StaticGenericMethod"; - } - - [Compiler(typeof(GenericTarget<>), "InstanceNonGenericMethod")] - static public string C7(MemberInfo memberInfo, string this_) - { - return "GenericTarget`1.InstanceNonGenericMethod"; - } - - [Compiler(typeof(GenericTarget<>), "InstanceGenericMethod", 1)] - static public string C8(MemberInfo memberInfo, string this_, string s1, [Type(typeof(int))]string s2) - { - return "GenericTarget`1.InstanceGenericMethod"; - } - - #endregion - } - - private class PropertyCompiler - { - #region Compilers for NonGenericTarget properties - - [Compiler(typeof(NonGenericTarget), "StaticProperty", TargetKind.Static | TargetKind.PropertyGet)] - public static string C1() - { - return "NonGenericTarget.get_StaticProperty"; - } - - [Compiler(typeof(NonGenericTarget), "StaticProperty", TargetKind.Static | TargetKind.PropertySet)] - public static string C2([Type(typeof(int))] string s) - { - return "NonGenericTarget.set_StaticProperty"; - } - - [Compiler(typeof(NonGenericTarget), "InstanceProperty", TargetKind.PropertyGet)] - public static string C3(string this_) - { - return "NonGenericTarget.get_InstanceProperty"; - } - - [Compiler(typeof(NonGenericTarget), "InstanceProperty", TargetKind.PropertySet)] - public static string C4(string this_, [Type(typeof(string))] string s) - { - return "NonGenericTarget.set_InstanceProperty"; - } - - [Compiler(typeof(NonGenericTarget), null, TargetKind.PropertyGet)] - public static string C5(string this_, - [Type(typeof(int))] string s1, - [Type(typeof(int))] string s2) - { - return "NonGenericTarget.get_Item"; - } - - [Compiler(typeof(NonGenericTarget), null, TargetKind.PropertySet)] - public static string C6(string this_, - [Type(typeof(int))] string s1, - [Type(typeof(int))] string s2, - [Type(typeof(string))] string value) - { - return "NonGenericTarget.set_Item"; - } - - #endregion - - #region Compilers for GenericTarget properties - - [Compiler(typeof(GenericTarget<>), "StaticProperty", TargetKind.Static | TargetKind.PropertyGet)] - static public string C7(MemberInfo memberInfo) - { - return "GenericTarget`1.get_StaticProperty"; - } - - [Compiler(typeof(GenericTarget<>), "StaticProperty", TargetKind.Static | TargetKind.PropertySet)] - static public string C8(MemberInfo memberInfo, [Type(typeof(int))] string s) - { - return "GenericTarget`1.set_StaticProperty"; - } - - [Compiler(typeof(GenericTarget<>), "InstanceProperty", TargetKind.PropertyGet)] - static public string C9(MemberInfo memberInfo, string this_) - { - return "GenericTarget`1.get_InstanceProperty"; - } - - [Compiler(typeof(GenericTarget<>), "InstanceProperty", TargetKind.PropertySet)] - static public string C10(MemberInfo memberInfo, string this_, [Type(typeof(string))] string s) - { - return "GenericTarget`1.set_InstanceProperty"; - } - - [Compiler(typeof(GenericTarget<>), null, TargetKind.PropertyGet)] - public static string C11(MemberInfo memberInfo, string this_, - [Type(typeof(string))] string s) - { - return "GenericTarget`1.get_Item"; - } - - [Compiler(typeof(GenericTarget<>), null, TargetKind.PropertySet)] - public static string C12(MemberInfo memberInfo, string this_, - [Type(typeof(string))] string s, string value) - { - return "GenericTarget`1.set_Item"; - } - - #endregion - } - - #region Classes for testing conflict handling - - private class ConflictTarget - { - public int ConflictMethod() - { - return 0; - } - } - - private class ConflictCompiler1 - { - [Compiler(typeof(ConflictTarget), "ConflictMethod")] - static public string C([Type(typeof(ConflictTarget))] string s) - { - return "Compiler1"; - } - } - - private class ConflictCompiler2 - { - [Compiler(typeof(ConflictTarget), "ConflictMethod")] - static public string C([Type(typeof(ConflictTarget))] string s) - { - return "Compiler2"; - } - } - - #endregion - - #region Classes for testing fancy generic finding algorithm - - private class SuperGenericTarget where T : class - { - public static string Method(T obj, string s, T1 obj1) where T1 : class - { - return obj.ToString() + s + obj1.ToString(); - } - - public static string Method(int n, string s, T1 obj1) where T1 : class - { - return n.ToString() + s + obj1.ToString(); - } - - public static string Method(int n, string s, double d) - { - return n.ToString() + s + d.ToString(); - } - - public static string Method(int n, T1 obj1, T obj) where T1 : class - { - return n.ToString() + obj1.ToString() + obj.ToString(); - } - } - - private class SuperGenericCompiler - { - [Compiler(typeof(SuperGenericTarget<>), "Method", TargetKind.Static | TargetKind.Method, 1)] - public static string Compiler(MemberInfo memberInfo, - [Type(typeof(int))] string s1, - [Type(typeof(string))] string s2, - string s3) - { - return "OK"; - } - } - - #endregion - - #region Enumerable / Array overload test - - public static class EachExtensions - { - public static void Each(Action action, IEnumerable items) - { - foreach (var item in items) - action.Invoke(item); - } - - public static void Each(Action action, params T[] items) - { - foreach (var item in items) - action.Invoke(item); - } - } - - public static class EachCompilers - { - [Compiler(typeof (EachExtensions), "Each", TargetKind.Static | TargetKind.Method, 1)] - public static string EachInArray(MemberInfo member, string action, - [Type(typeof(MethodHelper.AnyArrayPlaceholder))] string items) - { - return "EachInArray"; - } - - [Compiler(typeof(EachExtensions), "Each", TargetKind.Static | TargetKind.Method, 1)] - public static string EachInEnumerable(MemberInfo member, string action, - [Type(typeof(IEnumerable<>))] string items) - { - return "EachInEnumerable"; - } - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.10 + +using System; +using System.Collections.Generic; +using System.Reflection; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Linq +{ + partial class MemberCompilerProviderTest + { + private class NonGenericTarget + { + private string dummy; + + public string InstanceField; + public static string StaticField; + + static public long StaticNonGenericMethod(int a, long b) + { + return a + b; + } + + static public string StaticGenericMethod (T1 obj) + { + return obj.ToString(); + } + + public int InstanceNonGenericMethod(int k) + { + return k; + } + + public T1 InstanceGenericMethod () where T1 : new() + { + return new T1(); + } + + public int MethodWithBuggyCompiler() + { + return 0; + } + + public static int StaticProperty { get; set; } + + public string InstanceProperty { get; set; } + + internal string InternalProperty { get; set; } + + public string this[int a, int b]{ + get { return dummy; } + set { dummy = value; } + } + + public NonGenericTarget(int k) + { + dummy = k.ToString(); + } + } + + private class GenericTarget + { + private T dummy; + + public int InstanceField; + public static int StaticField; + + static public string StaticNonGenericMethod(T obj, int n) + { + return obj.ToString() + n.ToString(); + } + + static public T1 StaticGenericMethod (T obj) where T1 : class + { + return obj as T1; + } + + public short InstanceNonGenericMethod() + { + return 0; + } + + public int InstanceGenericMethod(T1 obj, int n) where T1 : class + { + return obj.GetHashCode() + n; + } + + public static int StaticProperty { get; set; } + + public string InstanceProperty { get; set; } + + public T this[string s] + { + get { return dummy; } + set { dummy = value; } + } + + public GenericTarget(T obj, int k) + { + dummy = obj; + StaticProperty = k; + } + } + + private class CtorCompiler + { + [Compiler(typeof(NonGenericTarget), null, TargetKind.Constructor)] + static public string C1([Type(typeof(int))] string k) + { + return "NonGenericTarget.ctor"; + } + + [Compiler(typeof(GenericTarget<>), null, TargetKind.Constructor)] + static public string C2 (MemberInfo memberInfo, string obj, [Type(typeof(int))] string k) + { + return "GenericTarget`1.ctor"; + } + } + + private class FieldCompiler + { + [Compiler(typeof(NonGenericTarget), "InstanceField", TargetKind.Field)] + static public string C1(string this_) + { + return "NonGenericTarget.InstanceField"; + } + + [Compiler(typeof(NonGenericTarget), "StaticField", TargetKind.Static | TargetKind.Field)] + static public string C2() + { + return "NonGenericTarget.StaticField"; + } + + [Compiler(typeof(GenericTarget<>), "InstanceField", TargetKind.Field)] + static public string C3(MemberInfo memberInfo, string this_) + { + return "GenericTarget`1.InstanceField"; + } + + [Compiler(typeof(GenericTarget<>), "StaticField", TargetKind.Static | TargetKind.Field)] + static public string C4(MemberInfo memberInfo) + { + return "GenericTarget`1.StaticField"; + } + } + + private class MethodCompiler + { + #region Compilers for NonGenericTarget methods + + [Compiler(typeof(NonGenericTarget), "StaticNonGenericMethod", TargetKind.Method | TargetKind.Static)] + static public string C1([Type(typeof(int))]string a, [Type(typeof(long))]string b) + { + return "NonGenericTarget.StaticNonGenericMethod"; + } + + [Compiler(typeof(NonGenericTarget), "StaticGenericMethod", TargetKind.Method | TargetKind.Static, 1)] + static public string C2(MemberInfo memberInfo, string s) + { + return "NonGenericTarget.StaticGenericMethod"; + } + + [Compiler(typeof(NonGenericTarget), "InstanceNonGenericMethod")] + static public string C3(string this_, [Type(typeof(int))] string s) + { + return "NonGenericTarget.InstanceNonGenericMethod"; + } + + [Compiler(typeof(NonGenericTarget), "InstanceGenericMethod", 1)] + static public string C4(MemberInfo memberInfo, string this_) + { + return "NonGenericTarget.InstanceGenericMethod"; + } + + [Compiler(typeof (NonGenericTarget), "MethodWithBuggyCompiler")] + static public string CompilerWithException(string this_) + { + throw new NotImplementedException(); + } + + #endregion + + #region Compilers for GenericTarget methods + + [Compiler(typeof(GenericTarget<>), "StaticNonGenericMethod", TargetKind.Method | TargetKind.Static)] + static public string C5(MemberInfo memberInfo, string s1, [Type(typeof(int))] string s2) + { + return "GenericTarget`1.StaticNonGenericMethod"; + } + + [Compiler(typeof(GenericTarget<>), "StaticGenericMethod", TargetKind.Method | TargetKind.Static, 1)] + static public string C6(MemberInfo memberInfo, string s) + { + return "GenericTarget`1.StaticGenericMethod"; + } + + [Compiler(typeof(GenericTarget<>), "InstanceNonGenericMethod")] + static public string C7(MemberInfo memberInfo, string this_) + { + return "GenericTarget`1.InstanceNonGenericMethod"; + } + + [Compiler(typeof(GenericTarget<>), "InstanceGenericMethod", 1)] + static public string C8(MemberInfo memberInfo, string this_, string s1, [Type(typeof(int))]string s2) + { + return "GenericTarget`1.InstanceGenericMethod"; + } + + #endregion + } + + private class PropertyCompiler + { + #region Compilers for NonGenericTarget properties + + [Compiler(typeof(NonGenericTarget), "StaticProperty", TargetKind.Static | TargetKind.PropertyGet)] + public static string C1() + { + return "NonGenericTarget.get_StaticProperty"; + } + + [Compiler(typeof(NonGenericTarget), "StaticProperty", TargetKind.Static | TargetKind.PropertySet)] + public static string C2([Type(typeof(int))] string s) + { + return "NonGenericTarget.set_StaticProperty"; + } + + [Compiler(typeof(NonGenericTarget), "InstanceProperty", TargetKind.PropertyGet)] + public static string C3(string this_) + { + return "NonGenericTarget.get_InstanceProperty"; + } + + [Compiler(typeof(NonGenericTarget), "InstanceProperty", TargetKind.PropertySet)] + public static string C4(string this_, [Type(typeof(string))] string s) + { + return "NonGenericTarget.set_InstanceProperty"; + } + + [Compiler(typeof(NonGenericTarget), null, TargetKind.PropertyGet)] + public static string C5(string this_, + [Type(typeof(int))] string s1, + [Type(typeof(int))] string s2) + { + return "NonGenericTarget.get_Item"; + } + + [Compiler(typeof(NonGenericTarget), null, TargetKind.PropertySet)] + public static string C6(string this_, + [Type(typeof(int))] string s1, + [Type(typeof(int))] string s2, + [Type(typeof(string))] string value) + { + return "NonGenericTarget.set_Item"; + } + + #endregion + + #region Compilers for GenericTarget properties + + [Compiler(typeof(GenericTarget<>), "StaticProperty", TargetKind.Static | TargetKind.PropertyGet)] + static public string C7(MemberInfo memberInfo) + { + return "GenericTarget`1.get_StaticProperty"; + } + + [Compiler(typeof(GenericTarget<>), "StaticProperty", TargetKind.Static | TargetKind.PropertySet)] + static public string C8(MemberInfo memberInfo, [Type(typeof(int))] string s) + { + return "GenericTarget`1.set_StaticProperty"; + } + + [Compiler(typeof(GenericTarget<>), "InstanceProperty", TargetKind.PropertyGet)] + static public string C9(MemberInfo memberInfo, string this_) + { + return "GenericTarget`1.get_InstanceProperty"; + } + + [Compiler(typeof(GenericTarget<>), "InstanceProperty", TargetKind.PropertySet)] + static public string C10(MemberInfo memberInfo, string this_, [Type(typeof(string))] string s) + { + return "GenericTarget`1.set_InstanceProperty"; + } + + [Compiler(typeof(GenericTarget<>), null, TargetKind.PropertyGet)] + public static string C11(MemberInfo memberInfo, string this_, + [Type(typeof(string))] string s) + { + return "GenericTarget`1.get_Item"; + } + + [Compiler(typeof(GenericTarget<>), null, TargetKind.PropertySet)] + public static string C12(MemberInfo memberInfo, string this_, + [Type(typeof(string))] string s, string value) + { + return "GenericTarget`1.set_Item"; + } + + #endregion + } + + #region Classes for testing conflict handling + + private class ConflictTarget + { + public int ConflictMethod() + { + return 0; + } + } + + private class ConflictCompiler1 + { + [Compiler(typeof(ConflictTarget), "ConflictMethod")] + static public string C([Type(typeof(ConflictTarget))] string s) + { + return "Compiler1"; + } + } + + private class ConflictCompiler2 + { + [Compiler(typeof(ConflictTarget), "ConflictMethod")] + static public string C([Type(typeof(ConflictTarget))] string s) + { + return "Compiler2"; + } + } + + #endregion + + #region Classes for testing fancy generic finding algorithm + + private class SuperGenericTarget where T : class + { + public static string Method(T obj, string s, T1 obj1) where T1 : class + { + return obj.ToString() + s + obj1.ToString(); + } + + public static string Method(int n, string s, T1 obj1) where T1 : class + { + return n.ToString() + s + obj1.ToString(); + } + + public static string Method(int n, string s, double d) + { + return n.ToString() + s + d.ToString(); + } + + public static string Method(int n, T1 obj1, T obj) where T1 : class + { + return n.ToString() + obj1.ToString() + obj.ToString(); + } + } + + private class SuperGenericCompiler + { + [Compiler(typeof(SuperGenericTarget<>), "Method", TargetKind.Static | TargetKind.Method, 1)] + public static string Compiler(MemberInfo memberInfo, + [Type(typeof(int))] string s1, + [Type(typeof(string))] string s2, + string s3) + { + return "OK"; + } + } + + #endregion + + #region Enumerable / Array overload test + + public static class EachExtensions + { + public static void Each(Action action, IEnumerable items) + { + foreach (var item in items) + action.Invoke(item); + } + + public static void Each(Action action, params T[] items) + { + foreach (var item in items) + action.Invoke(item); + } + } + + public static class EachCompilers + { + [Compiler(typeof (EachExtensions), "Each", TargetKind.Static | TargetKind.Method, 1)] + public static string EachInArray(MemberInfo member, string action, + [Type(typeof(MethodHelper.AnyArrayPlaceholder))] string items) + { + return "EachInArray"; + } + + [Compiler(typeof(EachExtensions), "Each", TargetKind.Static | TargetKind.Method, 1)] + public static string EachInEnumerable(MemberInfo member, string action, + [Type(typeof(IEnumerable<>))] string items) + { + return "EachInEnumerable"; + } + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.cs b/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.cs index 049f4284ae..63caa29f65 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/MemberCompilerProviderTest.cs @@ -1,207 +1,207 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.10 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Linq.MemberCompilation; -using Xtensive.Reflection; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public partial class MemberCompilerProviderTest - { - private readonly string[] dummy = new string[10]; - - private static Func GetCompilerForMethod( - IMemberCompilerProvider provider, Type source, string methodName) - { - if (source.IsGenericTypeDefinition) - source = source.MakeGenericType(typeof (object)); - - var mi = source.GetMethod(methodName); - Assert.IsNotNull(mi); - if (mi.IsGenericMethodDefinition) - mi = mi.MakeGenericMethod(typeof(object)); - var result = provider.GetCompiler(mi); - Assert.IsNotNull(result); - return result; - } - - private static Func GetCompilerForCtor( - IMemberCompilerProvider provider, Type source) - { - if (source.IsGenericTypeDefinition) - source = source.MakeGenericType(typeof(object)); - - var ci = source.GetConstructors().First(); - var result = provider.GetCompiler(ci); - Assert.IsNotNull(result); - return result; - } - - private static Func GetCompilerForField( - IMemberCompilerProvider provider, Type source, string fieldName) - { - if (source.IsGenericTypeDefinition) - source = source.MakeGenericType(typeof(object)); - - var fi = source.GetField(fieldName); - Assert.IsNotNull(fi); - var result = provider.GetCompiler(fi); - Assert.IsNotNull(result); - return result; - } - - [Test] - public void MethodsTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(MethodCompiler)); - - foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) - foreach (string s1 in new[]{"Instance", "Static"}) - foreach (string s2 in new[]{"Generic", "NonGeneric"}) { - string method = s1 + s2 + "Method"; - var d = GetCompilerForMethod(provider, t, method); - Assert.AreEqual(t.Name + "." + method, d(null, dummy)); - } - } - - [Test] - public void PropertiesTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(PropertyCompiler)); - - foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) - foreach (string s1 in new[]{Reflection.WellKnown.GetterPrefix, Reflection.WellKnown.SetterPrefix}) - foreach (string s2 in new[] { "InstanceProperty", "StaticProperty", "Item" }) { - string method = s1 + s2; - var d = GetCompilerForMethod(provider, t, method); - Assert.AreEqual(t.Name + "." + method, d(null, dummy)); - } - } - - [Test] - public void FieldsTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(FieldCompiler)); - - foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) - foreach (string s in new[] {"InstanceField", "StaticField"}) { - var d = GetCompilerForField(provider, t, s); - Assert.AreEqual(t.Name + "." + s, d(null, dummy)); - } - } - - [Test] - public void CtorsTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(CtorCompiler)); - foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) { - var d = GetCompilerForCtor(provider, t); - Assert.AreEqual(t.Name + Reflection.WellKnown.CtorName, d(null, dummy)); - } - } - - [Test] - public void GenericFindTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(SuperGenericCompiler)); - - var mi = typeof (SuperGenericTarget) - .GetMethod("Method", - BindingFlags.Static | BindingFlags.Public, - new[] {"T1"}, - new[] {typeof (int), typeof (string), null}) - .MakeGenericMethod(typeof(string)); - - var d = provider.GetCompiler(mi); - Assert.IsNotNull(d); - Assert.AreEqual("OK", d(null, dummy)); - } - - [Test] - public void ArrayAndEnumerableOverloadTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof (EachCompilers)); - var eachArray = typeof (EachExtensions) - .GetMethods() - .Single(method => method.GetParameterTypes().Any(type => type.IsArray)) - .MakeGenericMethod(typeof (int)); - var eachArrayCompiler = provider.GetCompiler(eachArray); - Assert.AreEqual("EachInArray", eachArrayCompiler.Invoke(null, dummy)); - - var eachEnumerable = typeof (EachExtensions) - .GetMethods() - .Single(method => method.GetParameterTypes() - .Any(type => type.IsGenericType && type.GetGenericTypeDefinition()==typeof(IEnumerable<>))) - .MakeGenericMethod(typeof (int)); - var eachEnumerableCompiler = provider.GetCompiler(eachEnumerable); - Assert.AreEqual("EachInEnumerable", eachEnumerableCompiler.Invoke(null, dummy)); - } - - [Test] - public void ConflictKeepOldTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(ConflictCompiler1)); - provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.KeepOld); - var d = GetCompilerForMethod(provider, typeof(ConflictTarget), "ConflictMethod"); - Assert.AreEqual("Compiler1", d(null, dummy)); - } - - [Test] - public void ConflictOverwriteTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(ConflictCompiler1)); - provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.Overwrite); - var d = GetCompilerForMethod(provider, typeof(ConflictTarget), "ConflictMethod"); - Assert.AreEqual("Compiler2", d(null, dummy)); - } - - [Test] - public void ConflictReportErrorTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof(ConflictCompiler1)); - Assert.Throws(() => provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.ReportError)); - } - - [Test] - public void NonPublicGetterTest() - { - var provider = MemberCompilerProviderFactory.Create(); - var property = typeof (NonGenericTarget) - .GetProperty("InternalProperty", BindingFlags.Instance | BindingFlags.NonPublic); - Assert.IsNotNull(property); - var result = provider.GetCompiler(property); - Assert.IsNull(result); - } - - [Test] - public void ExceptionWrappingTest() - { - var provider = MemberCompilerProviderFactory.Create(); - provider.RegisterCompilers(typeof (MethodCompiler)); - var method = typeof (NonGenericTarget).GetMethod("MethodWithBuggyCompiler", BindingFlags.Instance | BindingFlags.Public); - Assert.IsNotNull(method); - var compiler = provider.GetCompiler(method); - Assert.IsNotNull(compiler); - AssertEx.Throws(() => compiler.Invoke(null, new string[0])); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.10 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Linq.MemberCompilation; +using Xtensive.Reflection; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public partial class MemberCompilerProviderTest + { + private readonly string[] dummy = new string[10]; + + private static Func GetCompilerForMethod( + IMemberCompilerProvider provider, Type source, string methodName) + { + if (source.IsGenericTypeDefinition) + source = source.MakeGenericType(typeof (object)); + + var mi = source.GetMethod(methodName); + Assert.IsNotNull(mi); + if (mi.IsGenericMethodDefinition) + mi = mi.MakeGenericMethod(typeof(object)); + var result = provider.GetCompiler(mi); + Assert.IsNotNull(result); + return result; + } + + private static Func GetCompilerForCtor( + IMemberCompilerProvider provider, Type source) + { + if (source.IsGenericTypeDefinition) + source = source.MakeGenericType(typeof(object)); + + var ci = source.GetConstructors().First(); + var result = provider.GetCompiler(ci); + Assert.IsNotNull(result); + return result; + } + + private static Func GetCompilerForField( + IMemberCompilerProvider provider, Type source, string fieldName) + { + if (source.IsGenericTypeDefinition) + source = source.MakeGenericType(typeof(object)); + + var fi = source.GetField(fieldName); + Assert.IsNotNull(fi); + var result = provider.GetCompiler(fi); + Assert.IsNotNull(result); + return result; + } + + [Test] + public void MethodsTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(MethodCompiler)); + + foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) + foreach (string s1 in new[]{"Instance", "Static"}) + foreach (string s2 in new[]{"Generic", "NonGeneric"}) { + string method = s1 + s2 + "Method"; + var d = GetCompilerForMethod(provider, t, method); + Assert.AreEqual(t.Name + "." + method, d(null, dummy)); + } + } + + [Test] + public void PropertiesTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(PropertyCompiler)); + + foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) + foreach (string s1 in new[]{Reflection.WellKnown.GetterPrefix, Reflection.WellKnown.SetterPrefix}) + foreach (string s2 in new[] { "InstanceProperty", "StaticProperty", "Item" }) { + string method = s1 + s2; + var d = GetCompilerForMethod(provider, t, method); + Assert.AreEqual(t.Name + "." + method, d(null, dummy)); + } + } + + [Test] + public void FieldsTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(FieldCompiler)); + + foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) + foreach (string s in new[] {"InstanceField", "StaticField"}) { + var d = GetCompilerForField(provider, t, s); + Assert.AreEqual(t.Name + "." + s, d(null, dummy)); + } + } + + [Test] + public void CtorsTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(CtorCompiler)); + foreach (var t in new[]{typeof(NonGenericTarget), typeof(GenericTarget<>)}) { + var d = GetCompilerForCtor(provider, t); + Assert.AreEqual(t.Name + Reflection.WellKnown.CtorName, d(null, dummy)); + } + } + + [Test] + public void GenericFindTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(SuperGenericCompiler)); + + var mi = typeof (SuperGenericTarget) + .GetMethod("Method", + BindingFlags.Static | BindingFlags.Public, + new[] {"T1"}, + new[] {typeof (int), typeof (string), null}) + .MakeGenericMethod(typeof(string)); + + var d = provider.GetCompiler(mi); + Assert.IsNotNull(d); + Assert.AreEqual("OK", d(null, dummy)); + } + + [Test] + public void ArrayAndEnumerableOverloadTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof (EachCompilers)); + var eachArray = typeof (EachExtensions) + .GetMethods() + .Single(method => method.GetParameterTypes().Any(type => type.IsArray)) + .MakeGenericMethod(typeof (int)); + var eachArrayCompiler = provider.GetCompiler(eachArray); + Assert.AreEqual("EachInArray", eachArrayCompiler.Invoke(null, dummy)); + + var eachEnumerable = typeof (EachExtensions) + .GetMethods() + .Single(method => method.GetParameterTypes() + .Any(type => type.IsGenericType && type.GetGenericTypeDefinition()==typeof(IEnumerable<>))) + .MakeGenericMethod(typeof (int)); + var eachEnumerableCompiler = provider.GetCompiler(eachEnumerable); + Assert.AreEqual("EachInEnumerable", eachEnumerableCompiler.Invoke(null, dummy)); + } + + [Test] + public void ConflictKeepOldTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(ConflictCompiler1)); + provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.KeepOld); + var d = GetCompilerForMethod(provider, typeof(ConflictTarget), "ConflictMethod"); + Assert.AreEqual("Compiler1", d(null, dummy)); + } + + [Test] + public void ConflictOverwriteTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(ConflictCompiler1)); + provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.Overwrite); + var d = GetCompilerForMethod(provider, typeof(ConflictTarget), "ConflictMethod"); + Assert.AreEqual("Compiler2", d(null, dummy)); + } + + [Test] + public void ConflictReportErrorTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof(ConflictCompiler1)); + Assert.Throws(() => provider.RegisterCompilers(typeof(ConflictCompiler2), ConflictHandlingMethod.ReportError)); + } + + [Test] + public void NonPublicGetterTest() + { + var provider = MemberCompilerProviderFactory.Create(); + var property = typeof (NonGenericTarget) + .GetProperty("InternalProperty", BindingFlags.Instance | BindingFlags.NonPublic); + Assert.IsNotNull(property); + var result = provider.GetCompiler(property); + Assert.IsNull(result); + } + + [Test] + public void ExceptionWrappingTest() + { + var provider = MemberCompilerProviderFactory.Create(); + provider.RegisterCompilers(typeof (MethodCompiler)); + var method = typeof (NonGenericTarget).GetMethod("MethodWithBuggyCompiler", BindingFlags.Instance | BindingFlags.Public); + Assert.IsNotNull(method); + var compiler = provider.GetCompiler(method); + Assert.IsNotNull(compiler); + AssertEx.Throws(() => compiler.Invoke(null, new string[0])); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/MiscTest.cs b/Orm/Xtensive.Orm.Tests/Linq/MiscTest.cs index ec088623f4..131cf7a0cf 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/MiscTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/MiscTest.cs @@ -1,127 +1,127 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.02 - - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - [Serializable] - public class MiscTest : ChinookDOModelTest - { - [Test] - public void MainTest() - { - var query = - (from customer in Session.Query.All() - join invoice in Session.Query.All() on customer equals invoice.Customer into invoiceJoins - from invoiceJoin in invoiceJoins.DefaultIfEmpty() - select new {customer.Address, Invoice = invoiceJoin}) - .GroupBy(x => x.Address.City) - .Select(g => new {City = g.Key, MaxCommission = g.Max(i => i.Invoice.Commission)}); - - Assert.That(query, Is.Not.Empty); - foreach (var queryable in query) { - var city = queryable.City; - var maxCommission = queryable.MaxCommission; - } - } - - [Test] - public void Main2Test() - { - var query = - from grouping in - from customerInvoiceJoin in - from customer in Session.Query.All() - join invoice in Session.Query.All() - on customer equals invoice.Customer into invoiceJoins - from invoiceJoin in invoiceJoins.DefaultIfEmpty() - select new {customer.Address, Invoice = invoiceJoin} - group customerInvoiceJoin by customerInvoiceJoin.Address.City - select new { - City = grouping.Key, - MaxCommission = grouping.Max(i => i.Invoice.Commission), - MinCommission = grouping.Min(i => i.Invoice.Commission), - AverageCommission = grouping.Average(i => i.Invoice.Commission) - }; - - Assert.That(query, Is.Not.Empty); - foreach (var queryable in query) { - var city = queryable.City; - var maxCommission = queryable.MaxCommission; - } - } - - [Test] - public void MakePropertyAccessSwitchingToGeneric() - { - IQueryable queryable = Session.Query.All(); - var expected = Session.Query.All().Select(c => c.FirstName).ToList(); - var result1 = ((IQueryable)SelectPropertySwitchingToGeneric(queryable, "FirstName")).ToList(); - var result2 = ((IQueryable)SelectPropertyBuildingExpression(queryable, "FirstName")).ToList(); - - Assert.That(result1, Is.Not.Empty); - Assert.That(result2, Is.Not.Empty); - Assert.AreEqual(expected.Count, result1.Count); - Assert.AreEqual(expected.Count, result2.Count); - Assert.AreEqual(0, expected.Except(result1).Count()); - Assert.AreEqual(0, expected.Except(result2).Count()); - } - - public IQueryable SelectPropertySwitchingToGeneric(IQueryable queryable, string propertyName) - { - Type entityType = queryable.ElementType; - var propertyInfo = entityType.GetProperty(propertyName); - - var parameter = Expression.Parameter(entityType, "paramName"); - var body = Expression.MakeMemberAccess(parameter, propertyInfo); - var lambda = FastExpression.Lambda(body, parameter); // paramName=>paramName.Name - - var getPropertyValuesMethodInfo = typeof (MiscTest).GetMethod("SelectPropertyGeneric"); - var genericMethod = getPropertyValuesMethodInfo.MakeGenericMethod(entityType, propertyInfo.PropertyType); - return (IQueryable) genericMethod.Invoke(null, new object[] {queryable, lambda}); - } - - public static IQueryable SelectPropertyGeneric(IQueryable queryable, Expression> lambda) - where T : class, IEntity - { - return queryable.Select(lambda); - } - - public IQueryable SelectPropertyBuildingExpression(IQueryable queryable, string propertyName) - { - Type entityType = queryable.ElementType; - var propertyInfo = entityType.GetProperty(propertyName); - var queryAllExpression = Expression.Constant(queryable); - - var selectMethodInfo = typeof (System.Linq.Queryable).GetMethods() - .Single(methodInfo=>methodInfo.Name==Xtensive.Reflection.WellKnown.Queryable.Select - && methodInfo.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length==2); - - var parameter = Expression.Parameter(entityType, "paramName"); - var body = Expression.MakeMemberAccess(parameter, propertyInfo); - var lambda = FastExpression.Lambda(body, parameter); // paramName=>paramName.Name - - var genericSelectMethodInfo = selectMethodInfo.MakeGenericMethod(entityType, propertyInfo.PropertyType); - - var selectExpression = Expression.Call(genericSelectMethodInfo, queryAllExpression, lambda); - - return (IQueryable) FastExpression - .Lambda(selectExpression, EnumerableUtils.Empty) - .Compile() - .DynamicInvoke(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.02 + + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + [Serializable] + public class MiscTest : ChinookDOModelTest + { + [Test] + public void MainTest() + { + var query = + (from customer in Session.Query.All() + join invoice in Session.Query.All() on customer equals invoice.Customer into invoiceJoins + from invoiceJoin in invoiceJoins.DefaultIfEmpty() + select new {customer.Address, Invoice = invoiceJoin}) + .GroupBy(x => x.Address.City) + .Select(g => new {City = g.Key, MaxCommission = g.Max(i => i.Invoice.Commission)}); + + Assert.That(query, Is.Not.Empty); + foreach (var queryable in query) { + var city = queryable.City; + var maxCommission = queryable.MaxCommission; + } + } + + [Test] + public void Main2Test() + { + var query = + from grouping in + from customerInvoiceJoin in + from customer in Session.Query.All() + join invoice in Session.Query.All() + on customer equals invoice.Customer into invoiceJoins + from invoiceJoin in invoiceJoins.DefaultIfEmpty() + select new {customer.Address, Invoice = invoiceJoin} + group customerInvoiceJoin by customerInvoiceJoin.Address.City + select new { + City = grouping.Key, + MaxCommission = grouping.Max(i => i.Invoice.Commission), + MinCommission = grouping.Min(i => i.Invoice.Commission), + AverageCommission = grouping.Average(i => i.Invoice.Commission) + }; + + Assert.That(query, Is.Not.Empty); + foreach (var queryable in query) { + var city = queryable.City; + var maxCommission = queryable.MaxCommission; + } + } + + [Test] + public void MakePropertyAccessSwitchingToGeneric() + { + IQueryable queryable = Session.Query.All(); + var expected = Session.Query.All().Select(c => c.FirstName).ToList(); + var result1 = ((IQueryable)SelectPropertySwitchingToGeneric(queryable, "FirstName")).ToList(); + var result2 = ((IQueryable)SelectPropertyBuildingExpression(queryable, "FirstName")).ToList(); + + Assert.That(result1, Is.Not.Empty); + Assert.That(result2, Is.Not.Empty); + Assert.AreEqual(expected.Count, result1.Count); + Assert.AreEqual(expected.Count, result2.Count); + Assert.AreEqual(0, expected.Except(result1).Count()); + Assert.AreEqual(0, expected.Except(result2).Count()); + } + + public IQueryable SelectPropertySwitchingToGeneric(IQueryable queryable, string propertyName) + { + Type entityType = queryable.ElementType; + var propertyInfo = entityType.GetProperty(propertyName); + + var parameter = Expression.Parameter(entityType, "paramName"); + var body = Expression.MakeMemberAccess(parameter, propertyInfo); + var lambda = FastExpression.Lambda(body, parameter); // paramName=>paramName.Name + + var getPropertyValuesMethodInfo = typeof (MiscTest).GetMethod("SelectPropertyGeneric"); + var genericMethod = getPropertyValuesMethodInfo.MakeGenericMethod(entityType, propertyInfo.PropertyType); + return (IQueryable) genericMethod.Invoke(null, new object[] {queryable, lambda}); + } + + public static IQueryable SelectPropertyGeneric(IQueryable queryable, Expression> lambda) + where T : class, IEntity + { + return queryable.Select(lambda); + } + + public IQueryable SelectPropertyBuildingExpression(IQueryable queryable, string propertyName) + { + Type entityType = queryable.ElementType; + var propertyInfo = entityType.GetProperty(propertyName); + var queryAllExpression = Expression.Constant(queryable); + + var selectMethodInfo = typeof (System.Linq.Queryable).GetMethods() + .Single(methodInfo=>methodInfo.Name==Xtensive.Reflection.WellKnown.Queryable.Select + && methodInfo.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length==2); + + var parameter = Expression.Parameter(entityType, "paramName"); + var body = Expression.MakeMemberAccess(parameter, propertyInfo); + var lambda = FastExpression.Lambda(body, parameter); // paramName=>paramName.Name + + var genericSelectMethodInfo = selectMethodInfo.MakeGenericMethod(entityType, propertyInfo.PropertyType); + + var selectExpression = Expression.Call(genericSelectMethodInfo, queryAllExpression, lambda); + + return (IQueryable) FastExpression + .Lambda(selectExpression, EnumerableUtils.Empty) + .Compile() + .DynamicInvoke(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToEntitiesSamples.cs b/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToEntitiesSamples.cs index 110789133c..1b33be70a2 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToEntitiesSamples.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToEntitiesSamples.cs @@ -1,1265 +1,1265 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - - -namespace Xtensive.Orm.Tests.Linq.Samples -{ - [Category("Linq")] - [TestFixture] - public class LinqToEntitiesSamples : ChinookDOModelTest - { - #region Restriction Operators - - [Category("Restriction Operators")] - [Test(Description = "Where - Simple 1")] - [Description("This sample uses WHERE to find all customers in Seattle.")] - public void LinqToEntities1() - { - var query = from cust in Session.Query.All() - where cust.Address.City=="Seattle" - select cust; - QueryDumper.Dump(query); - } - - - [Category("Restriction Operators")] - [Test(Description = "Where - Simple 2")] - [Description("This sample uses WHERE to find all orders placed in 2005.")] - public void LinqToEntities2() - { - DateTime dt = new DateTime(2005, 1, 1); - var query = from invoice in Session.Query.All() - where invoice.InvoiceDate > dt - select invoice; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "Where - Simple 3")] - [Description("This sample uses WHERE to filter for Tracks that have duration less that 3 minutes and which Genre is Latin.")] - public void LinqToEntities3() - { - var query = from t in Session.Query.All() - where t.Milliseconds < 180000 && t.Genre.GenreId==282 - select t; - - QueryDumper.Dump(query); - } - - - [Category("Restriction Operators")] - [Test(Description = "Where - Simple 4")] - [Description("This sample uses WHERE to filter out Tracks that have a UnitPrice less than 1.")] - public void LinqToEntities4() - { - var query = from p in Session.Query.All() - where p.UnitPrice < 1 - select p; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "Where - Related Entities 1")] - [Description("This sample uses WHERE to get invoices for Customers in Mexico.")] - public void LinqToEntities5() - { - var query = from i in Session.Query.All() - where i.Customer.Address.Country=="Mexico" - select i; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "Where - Related Entities 2")] - [Description("This sample uses WHERE to get invoices which is tracked by employees in the UK.")] - public void LinqToEntities6() - { - var query = from i in Session.Query.All() - where i.DesignatedEmployee.Address.Country=="UK" - select i; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "Any - 1")] - [Description("This sample uses ANY to get employees have any invoices to track.")] - public void LinqToEntities7() - { - var query = from e in Session.Query.All() - where e.Invoices.Any(i => i!=null) - select e; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "Any - 2")] - [Description("This sample uses ANY to check for any playlists which have any Pop tracks.")] - public void LinqToEntities8() - { - var query = Session.Query.All() - .Where(s => s.Tracks - .Any(p => p.MediaType.MediaTypeId==284)) - .Select(s => s); - - QueryDumper.Dump(query); - } - - - [Category("Restriction Operators")] - [Test(Description = "Any - Related Entities")] - [Description("This sample uses WHERE and ANY to get employees who invoiced any customer in Mexico.")] - public void LinqToEntities9() - { - Require.ProviderIsNot(StorageProvider.Oracle); - var query = from e in Session.Query.All() - where e.Invoices.Any(i => i.Customer.Address.Country=="Mexico") - select e; - - QueryDumper.Dump(query); - } - - [Category("Restriction Operators")] - [Test(Description = "All - Simple")] - [Description("This sample uses ALL to get employees who invoiced customers not in Canada.")] - public void LinqToEntities10() - { - Require.ProviderIsNot(StorageProvider.Oracle); - var query = from e in Session.Query.All() - where e.Invoices.All(i => i.Customer.Address.Country!="Canada") - select e; - - QueryDumper.Dump(query); - } - - #endregion - - #region Projection Operators - - [Category("Projection Operators")] - [Test(Description = "Select - Simple 1")] - [Description("This samples uses SELECT to get all Customers as Entity Objects.")] - public void LinqToEntities11() - { - var query = from c in Session.Query.All() - select c; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "Select - Simple 2")] - [Description("This samples uses SELECT to get all Customer Company Names as Strings.")] - public void LinqToEntities12() - { - var query = from c in Session.Query.All() - select c.CompanyName; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "Select - Anonymous 1")] - [Description("This samples uses SELECT to get all Customer Company Names as an anonoymous type.")] - public void LinqToEntities13() - { - var query = from c in Session.Query.All() - select new {c.CompanyName}; - - QueryDumper.Dump(query); - } - - - [Category("Projection Operators")] - [Test(Description = "Select - Anonymous 2")] - [Description("This sample uses SELECT to get all Invoices as anonymous type")] - public void LinqToEntities14() - { - var query = from i in Session.Query.All() - select new {i}; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "Select - Anonymous 3")] - [Description("This sample uses SELECT to get all Invoices and associated Employees as anonymous type")] - public void LinqToEntities15() - { - var query = from i in Session.Query.All() - select new {i, i.DesignatedEmployee}; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "Select - Nested Collection ")] - [Description("This sample uses SELECT to get all Customers, and those Invoiices for each customer with a commission > 0.05")] - public void LinqToEntities15a() - { - var query = Session.Query.All().Select(c => new {Customer = c, Invoices = c.Invoices.Where(i => i.Commission > 0.05m)}); - - QueryDumper.Dump(query); - } - - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Simple 1")] - [Description("This sample uses SELECTMANY to get all Invoices for a Customer as a flat result")] - public void LinqToEntities16() - { - var query = from c in Session.Query.All() - where c.CustomerId==4200 - from i in c.Invoices - select i; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Simple 2")] - [Description("This sample uses SELECTMANY to get all Invoices for a Customer as a flat result using LINQ operators")] - public void LinqToEntities17() - { - var query = Session.Query.All().Where(cust => cust.CustomerId==4200) - .SelectMany(cust => cust.Invoices); - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Simple 3")] - [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result")] - public void LinqToEntities18() - { - var query = from c in Session.Query.All() - where c.Address.Country=="Denmark" - from i in c.Invoices - select i; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Simple 4")] - [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result using LINQ operators")] - public void LinqToEntities19() - { - var query = Session.Query.All().Where(cust => cust.Address.Country=="Denmark") - .SelectMany(cust => cust.Invoices); - - QueryDumper.Dump(query); - } - - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Predicate 1")] - [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result")] - public void LinqToEntities20() - { - var query = from c in Session.Query.All() - where c.Address.Country=="Denmark" - from i in c.Invoices - where i.Commission > 0.05m - select i; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Predicate 2")] - [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as an anonymous type containing the Invoice and Customer flat result")] - public void LinqToEntities21() - { - var query = from c in Session.Query.All() - where c.Address.Country=="Denmark" - from i in c.Invoices - where i.Commission > 0.05m - select new {c, i}; - - QueryDumper.Dump(query); - } - - [Category("Projection Operators")] - [Test(Description = "SelectMany - Predicate 3")] - [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result using LINQ opeartors")] - public void LinqToEntities22() - { - var query = Session.Query.All().Where(cust => cust.Address.Country=="Denmark") - .SelectMany(cust => cust.Invoices.Where(i => i.Commission > 0.05m)); - - QueryDumper.Dump(query); - } - - #endregion - - #region Aggregate Operators - - [Category("Aggregate Operators")] - [Test(Description = "Count - Simple")] - [Description("This sample uses COUNT to get the number of Invoices.")] - public void LinqToEntities23() - { - var query = Session.Query.All().Count(); - - QueryDumper.Dump(query); - } - - - [Category("Aggregate Operators")] - [Test(Description = "Count - Predicate 1")] - [Description("This sample uses COUNT to get the number of Invoices placed by Customers in Mexico.")] - public void LinqToEntities24() - { - var query = Session.Query.All().Where(i => i.Customer.Address.Country=="Mexico").Count(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Count - Predicate 2")] - [Description("This sample uses COUNT to get the number of Invoices shipped to Mexico.")] - public void LinqToEntities25() - { - var query = Session.Query.All() - .Where(i => i.BillingAddress.Country=="Mexico").Count(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Sum - Simple 1")] - [Description("This sample uses SUM to find the total Commission over all Invoices.")] - public void LinqToEntities26() - { - var query = Session.Query.All().Select(i => i.Commission).Sum(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Sum - Simple 2")] - [Description("This sample uses SUM to find the total duration of units on order over all Tracks.")] - public void LinqToEntities27() - { - var query = Session.Query.All().Sum(p => p.Milliseconds); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Sum - Simple 3")] - [Description("This sample uses SUM to find the total duration of units on order over all Tracks which are Classic.")] - public void LinqToEntities28() - { - var query = Session.Query.All().Where(p => p.Genre.GenreId==299).Sum(p => p.Milliseconds); - - QueryDumper.Dump(query); - } - - - [Category("Aggregate Operators")] - [Test(Description = "Min - Simple 1")] - [Description("This sample uses MIN to find the lowest unit price of any Tracks.")] - public void LinqToEntities29() - { - var query = Session.Query.All().Select(p => p.UnitPrice).Min(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Min - Simple 2")] - [Description("This sample uses MIN to find the lowest commission of any Invoice.")] - public void LinqToEntities30() - { - var query = Session.Query.All().Min(i => i.Commission); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Min - Predicate")] - [Description("This sample uses MIN to find the lowest commission of any invoice billed from Mexico.")] - public void LinqToEntities31() - { - var query = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Min(i => i.Commission); - - QueryDumper.Dump(query); - } - - - [Category("Aggregate Operators")] - [Test(Description = "Min - Grouping")] - [Description("This sample uses Min to find the Tracks that have the lowest unit price for each media type, and returns the result as an anonoymous type.")] - public void LinqToEntities32() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .GroupBy(p => p.MediaType) - .Select(g => new { - MediaTypeId = g.Key, - CheapestTracks = - g.Where(p2 => p2.UnitPrice==g.Min(p3 => p3.UnitPrice)) - }); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Max - Simple 1")] - [Description("This sample uses MAX to find the latest hire date of any Employee.")] - public void LinqToEntities33() - { - var query = Session.Query.All().Select(e => e.HireDate).Max(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Max - Simple 2")] - [Description("This sample uses MAX to find the longest units of any Tracks.")] - public void LinqToEntities34() - { - var query = Session.Query.All().Max(p => p.Milliseconds); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Max - Predicate")] - [Description("This sample uses MAX to find the longes units of any Track with MediaTypeId = 305.")] - public void LinqToEntities35() - { - var query = Session.Query.All().Where(p => p.MediaType.MediaTypeId==305).Max(p => p.Milliseconds); - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Max - Grouping")] - [Description("This sample uses MAX to find the Tracks that have the highest unit price for each media type, and returns the result as an anonoymous type.")] - public void LinqToEntities36() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = from p in Session.Query.All() - group p by p.MediaType - into g - select new { - g.Key, - MostExpensiveTracks = - from t2 in g - where t2.UnitPrice==g.Max(t3 => t3.UnitPrice) - select t2 - }; - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Average - Simple 1")] - [Description("This sample uses AVERAGE to find the average commission of all Invoices.")] - public void LinqToEntities37() - { - var query = Session.Query.All().Select(i => i.Commission).Average(); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Average - Simple 2")] - [Description("This sample uses AVERAGE to find the average unit price of all Tracks.")] - public void LinqToEntities38() - { - var query = Session.Query.All().Average(p => p.UnitPrice); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Average - Predicate")] - [Description("This sample uses AVERAGE to find the average unit price of all Tracks with MediaTypeId = 305.")] - public void LinqToEntities39() - { - var query = Session.Query.All().Where(p => p.MediaType.MediaTypeId==305).Average(p => p.UnitPrice); - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Average - Grouping 1")] - [Description("This sample uses AVERAGE to find the Products that have unit price higher than the average unit price of the category for each category.")] - public void LinqToEntities40() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = from p in Session.Query.All() - group p by p.MediaType - into g - select new { - g.Key, - ExpensiveProducts = - from t2 in g - where t2.UnitPrice > g.Average(t3 => t3.UnitPrice) - select t2 - }; - - QueryDumper.Dump(query); - } - - [Category("Aggregate Operators")] - [Test(Description = "Average - Grouping 2")] - [Description("This sample uses AVERAGE to find the average unit price of each media type.")] - public void LinqToEntities41() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .GroupBy(t => t.MediaType) - .Select(g => new { - g.Key, - Average = g.Average(t => t.UnitPrice) - }); - - QueryDumper.Dump(query); - } - - #endregion - - #region Set Operators - - [Category("Set And Element Operators")] - [Test(Description = "First - Simple")] - [Description("This sample uses FIRST and WHERE to get the first (database order) order that is ordered from Paris. The WHERE predicate is evaluated on the server.")] - public void LinqToEntities42() - { - var query = from i in Session.Query.All() - where i.BillingAddress.City=="Paris" - select i; - - // Feb CTP requires AsEnumerable() - var result = query.ToList().First(); - - QueryDumper.Dump(result); - } - - [Category("Set And Element Operators")] - [Test(Description = "First - Predicate")] - [Description("This sample uses FIRST to get the first (database order) order that is ordered from Dublin. The predicate is evaluated on the client.")] - public void LinqToEntities43() - { - var query = from o in Session.Query.All() - select o; - - // Feb CTP requires AsEnumerable() - var result = query - .ToList() - .First(x => x.BillingAddress.City=="Dublin"); - - QueryDumper.Dump(result); - } - - [Category("Set And Element Operators")] - [Test(Description = "First - Ordered")] - [Description("This sample uses FIRST, WHERE and ORDER BY to get the first order that is ordered from Oslo, ordered by date. The predicate is evaluated on the server.")] - public void LinqToEntities44() - { - var query = from i in Session.Query.All() - where i.BillingAddress.City=="Oslo" - orderby i.InvoiceDate - select i; - - // Feb CTP requires AsEnumerable() - var result = query.ToList().First(); - - QueryDumper.Dump(result); - } - - - [Category("Set And Element Operators")] - [Test(Description = "Distinct - Simple")] - [Description("This sample uses DISTINCT to get all the media types of tracks.")] - public void LinqToEntities45() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var query = Session.Query.All().Select(i => i.MediaType).Distinct(); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Union - Simple")] - [Description("This sample uses UNION to get all the invoices where the order country was Mexico or Canada.")] - public void LinqToEntities46() - { - var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); - var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); - var query = mexico.Union(canada); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Union - With Distinct")] - [Description("This sample uses UNION and DISTINCT to get all the employees from invoices where the order country was Mexico or Canada.")] - public void LinqToEntities47() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); - var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); - var union = mexico.Union(canada).Select(i => i.DesignatedEmployee); - - var query = union.Distinct(); - - var actualMexico = Session.Query.All().ToList() - .Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); - var actualCanada = Session.Query.All().ToList() - .Where(i => i.BillingAddress.Country=="Canada").Select(i => i); - var actualUnion = actualMexico.Union(actualCanada).Select(i => i.DesignatedEmployee); - - var actual = actualUnion.Distinct(); - - Assert.AreEqual(0, actual.Select(e => e.EmployeeId).Except(query.ToList().Select(e => e.EmployeeId)).Count()); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Concat - Simple")] - [Description("This sample uses CONCAT to get all invoices where the shipping country was Mexico or Canada.")] - public void LinqToEntities48() - { - var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); - var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); - - var query = mexico.Concat(canada); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Intersect - Simple 1")] - [Description("This sample uses INTERSECT to get common employees where an invoices was ordered from Mexico or Canada.")] - public void LinqToEntities49() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i.DesignatedEmployee); - var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i.DesignatedEmployee); - - var query = mexico.Intersect(canada); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Intersect - Simple 2")] - [Description("This sample uses INTERSECT to get common employees where an invoice was ordered from Mexico or Canada in one consolidated query.")] - public void LinqToEntities50() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All() - .Where(i => i.BillingAddress.Country=="Mexico") - .Select(i => i.DesignatedEmployee) - .Intersect(Session.Query.All() - .Where(i => i.BillingAddress.Country=="Canada") - .Select(i => i.DesignatedEmployee)); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Except - Simple 1")] - [Description("This sample uses EXCEPT to get employees who manages invoices to Mexico but not Canada.")] - public void LinqToEntities51() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All() - .Where(i => i.BillingAddress.Country=="Mexico") - .Select(i => i.DesignatedEmployee) - .Except(Session.Query.All() - .Where(i => i.BillingAddress.Country=="Canada") - .Select(i => i.DesignatedEmployee)); - - QueryDumper.Dump(query); - } - - [Category("Set And Element Operators")] - [Test(Description = "Except - Simple 2")] - [Description("This sample uses EXCEPT to get employees with no invoices sent to Mexico.")] - public void LinqToEntities52() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All().Select(e => e) - .Except(Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i.DesignatedEmployee)); - - QueryDumper.Dump(query); - } - - #endregion - - #region Ordering and Grouping - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy - Simple 1")] - [Description("Select all customers ordered by CompanyName.")] - public void LinqToEntities53() - { - var query = from c in Session.Query.All() - orderby c.CompanyName - select c; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy - Simple 2")] - [Description("Select all customers ordered by CompanyName descending.")] - public void LinqToEntities54() - { - var query = from c in Session.Query.All() - orderby c.CompanyName descending - select c; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy - Simple 3")] - [Description("Select an anonoymous type with all track Ids ordered by Milliseconds.")] - public void LinqToEntities55() - { - var query = from p in Session.Query.All() - orderby p.Milliseconds - select new {p.TrackId}; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy - Simple 4")] - [Description("Select an anonoymous type with all track Ids ordered by Milliseconds using LINQ operators.")] - public void LinqToEntities56() - { - var query = Session.Query.All().OrderBy(p => p.Milliseconds) - .Select(p2 => new {p2.TrackId}); - - QueryDumper.Dump(query); - } - - - [Category("Ordering and Grouping")] - [Test(Description = "OrderByDescending - Simple 1")] - [Description("Select all customers ordered by the descending state.")] - public void LinqToEntities57() - { - var query = from c in Session.Query.All() - orderby c.Address.State descending - select c; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderByDescending - Simple 2")] - [Description("Select all customers ordered by the descending state using LINQ operators.")] - public void LinqToEntities58() - { - var query = Session.Query.All().Select(c => c).OrderByDescending(c2 => c2.Address.State); - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy with ThenBy")] - [Description("Select all customers ordered by the region, then the last name.")] - public void LinqToEntities59() - { - var query = Session.Query.All().Select(c => c).OrderBy(c => c.Address.State).ThenBy(c => c.LastName); - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderByDescending with ThenBy")] - [Description("Select all customers ordered by the state in descending order, then the last name.")] - public void LinqToEntities60() - { - var query = Session.Query.All().Select(c => c).OrderByDescending(c => c.Address.State).ThenBy(c => c.LastName); - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy with ThenByDescending")] - [Description("Select all customers ordered by the state then the last name in descending order.")] - public void LinqToEntities61() - { - var query = Session.Query.All().Select(c => c).OrderBy(c => c.Address.State).ThenByDescending(c => c.LastName); - - QueryDumper.Dump(query); - } - - - [Category("Ordering and Grouping")] - [Test(Description = "OrderByDescending - Simple 3")] - [Description("Select all tracks ordered by the descending unit price.")] - public void LinqToEntities62() - { - var query = from p in Session.Query.All() - orderby p.UnitPrice descending - select p; - - QueryDumper.Dump(query); - } - - - [Category("Ordering and Grouping")] - [Test(Description = "OrderBy - FK Collection")] - [Description("Select all orders for a customer ordered by date that the invoice was placed.")] - public void LinqToEntities63() - { - var query = Session.Query.All().Where(cust => cust.CustomerId==4233) - .SelectMany(c => c.Invoices.Select(i => i)) - .OrderBy(i2 => i2.InvoiceDate); - - foreach (var order in query) { - QueryDumper.Dump(order); - } - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping - Simple 1")] - [Description("Select all states with a customer.")] - public void LinqToEntities64() - { - var query = from c in Session.Query.All() - group c by c.Address.State - into states - select new {states.Key}; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping - Simple 2")] - [Description("Select all dates with orders placed.")] - public void LinqToEntities65() - { - var query = from i in Session.Query.All() - group i by i.InvoiceDate - into dates - select new {dates.Key}; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping - Join 1")] - [Description("Select all States and customer count for each state.")] - public void LinqToEntities66() - { - var query = from c in Session.Query.All() - group c by c.Address.State - into states - select new {State = states.Key, Count = states.Count()}; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping on Key")] - [Description("Select all States and customer count for each state using LINQ operator.")] - public void LinqToEntities67() - { - var query = Session.Query.All().GroupBy(c => c.Address.State).Select(r => new {state = r.Key, count = r.Count()}); - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping with a join on Key 1")] - [Description("Select all Customer states with the total on all invoices for Customers in that state.")] - public void LinqToEntities68() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var query = from c in Session.Query.All() - group c by c.Address.State - into states - join c2 in Session.Query.All() on states.Key equals c2.Address.State - select new {state = states.Key, total = c2.Invoices.Sum(i => i.Total)}; - - QueryDumper.Dump(query); - } - - [Category("Ordering and Grouping")] - [Test(Description = "Grouping with a Key 2")] - [Description("Select all Customer State with the total Commission on all orders for Customers in that State using LINQ operators.")] - public void LinqToEntities69() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var query = Session.Query.All().GroupBy(c => c.Address.State) - .Select(g => new { - Region = g.Key, CommissionTotal = g - .SelectMany(c2 => c2.Invoices) - .Sum(i => i.Commission) - }); - - QueryDumper.Dump(query); - } - - #endregion - - #region Relationship Navigation - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK Collection 1")] - [Description("Select a sequence of all the invoices for a customer using Select.")] - public void LinqToEntities70() - { - var query = Session.Query.All().Where(cust => cust.CustomerId==4200) - .Select(c => c.Invoices.Select(i => i)); - - foreach (var order in query) { - QueryDumper.Dump(order); - } - } - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK Collection 2")] - [Description("Select all the invoices for a customer using SelectMany.")] - public void LinqToEntities71() - { - var query = Session.Query.All().Where(cust => cust.CustomerId==4200).SelectMany(c => c.Invoices); - - QueryDumper.Dump(query); - } - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK Collection property")] - [Description("Select all Employee Ids, and the count of the their invoices.")] - public void LinqToEntities72() - { - var query = from e in Session.Query.All() - select new {e, orders = e.Invoices.Select(i => i)}; - - QueryDumper.Dump(query); - } - - /* not enabled for Feb CTP - [Category("Relationship Navigation")] - [Test(Description = "Select - FK Collection property 2")] - [Description("Select number of orders placed in 2002 for a customer.")] - public void LinqToEntities74() - { - var query = Session.Query.All() - .Where(cust => cust.CustomerID == "ALFKI") - .SelectMany(c => c.Orders) - .Where(i => i.OrderDate.Year == 2002); - - QueryDumper.Dump(query); - } - */ - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK Collection Aggregate property")] - [Description("Select a customer and the sum of the commission of thier invoices.")] - public void LinqToEntities73() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var query = Session.Query.All().Where(cust => cust.CustomerId==4233) - .Select(c => c.Invoices.Sum(i => i.Commission)); - - QueryDumper.Dump(query); - } - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK collection predicate")] - [Description("Select customers with an invoice where the billing address is the same as the customers.")] - public void LinqToEntities75() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var query = Session.Query.All().Where(cust => cust.Invoices.Any(i => i.BillingAddress==cust.Address)).Select(c2 => c2); - - QueryDumper.Dump(query); - } - - [Category("Relationship Navigation")] - [Test(Description = "Select - FK collection Grouping")] - [Description("Selects all states with a customer, and shows the sum of invoices for customers for each state.")] - public void LinqToEntities76() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var query = from c in Session.Query.All() - group c by c.Address.State - into states - join c2 in Session.Query.All() on states.Key equals c2.Address.State - select new {state = states.Key, total = c2.Invoices.Sum(i => i.Total)}; - - QueryDumper.Dump(query); - } - - #endregion - - #region Inheritance - - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "One Level Hierarchy - Simple")] - [Description("Select all tracks, both audio and video trackss, and shows the type.")] - public void LinqToEntities77() - { - var query = Session.Query.All() - .Select(p => p); - - // we need AsEnumerable to force execution, as GetType is not defined in store - var query2 = query - .ToList() - .Select(p => new {type = p.GetType().ToString(), prod = p}); - - QueryDumper.Dump(query2); - } - - - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "One Level Hierarchy - OfType - Simple 1")] - [Description("Select only video tracks.")] - public void LinqToEntities78() - { - var query = Session.Query.All().OfType().Select(p => p); - - QueryDumper.Dump(query); - } - - - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "One Level Hierarchy - OfType - Simple 2")] - [Description("Select only products, which will reutrn all Tracks and subtypes of Tracks (video and audio tracks).")] - public void LinqToEntities79() - { - var query = Session.Query.All().OfType().Select(p => p); - - QueryDumper.Dump(query); - } - - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "One Level Hierarchy - Getting Supertype - OfType")] - [Description("Select only audio tracks.")] - public void LinqToEntities80() - { - var query = Session.Query.All().OfType(); - - QueryDumper.Dump(query); - } - - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "One Level Hierarchy - Getting Supertype - Local")] - [Description("Select only video tracks.")] - public void LinqToEntities81() - { - var query = Session.Query.All().Where(p => p is VideoTrack); - - QueryDumper.Dump(query); - } - - - // Modified according to DO model. - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "Complex Hierarchy - Simple")] - [Description("Select all contacts and show the type of each.")] - public void LinqToEntities82() - { - var query = Session.Query.All().Select(c => c); - - // we need AsEnumerable to force execution, as GetType is not defined in store - Assert.Throws(() => { - var query2 = query - .ToList() - .Select(c => new { type = c.GetType().ToString() }); - - QueryDumper.Dump(query2); - }); - - } - - // Modified according to DO model. - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "Complex Hierarchy - OfType 1")] - [Description("Select all Customer contacts.")] - public void LinqToEntities83() - { - var query = Session.Query.All().OfType().Select(c => c); - - Assert.Throws(() => QueryDumper.Dump(query)); - } - - // Modified according to DO model. - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "Complex Hierarchy - OfType 2")] - [Description("Select all Full contacts, which includes customers and employees.")] - public void LinqToEntities84() - { - var query = Session.Query.All().OfType().Select(c => c); - - Assert.Throws(() => QueryDumper.Dump(query)); - } - - /* not enabled for Feb CTP - [Category("Table per Hierarchy Inheritance")] - [Test(Description = "Complex Hierarchy - using supertype")] - [Description("Select all Customers and Employees, cast as FullContacts to allow join.")] - public void LinqToEntities85() - { - var query = northwindContext - .Contacts - .OfType() - .Cast() - .Union(northwindContext.Contacts.OfType().Cast().Select(ec => ec )) - .ToList() - .Select(c => new {type = c.GetType().ToString(), companyName = c.CompanyName } ); - - QueryDumper.Dump(query); - }*/ - - // Disabled - - /* - - [Category("Table per Concrete Type Inheritance")] - [Test(Description = "Simple")] - [Description("Select all federated products and display thier types.")] - public void LinqToEntities86() - { - var query = Session.Query.All()Fedarated.ToList().Select(p => new { type = p.GetType().ToString(), p }); - - QueryDumper.Dump(query); - } - - [Category("Table per Concrete Type Inheritance")] - [Test(Description = "OfType")] - [Description("Select all discontinued federated products.")] - public void LinqToEntities87() - { - var query = Session.Query.All()Fedarated.OfType().ToList().Select(p => new { type = p.GetType().ToString(), p }); - - QueryDumper.Dump(query); - } - - [Category("Table per Type Inheritance")] - [Test(Description = "Simple")] - [Description("Select all contacts and shows their types.")] - public void LinqToEntities88() - { - var query = northwindContext.ContactsSplit.ToList().Select(c => new { type = c.GetType().ToString(), c }); - - QueryDumper.Dump(query); - } - - [Category("Table per Type Inheritance")] - [Test(Description = "OfType 1")] - [Description("Select all Customers.")] - public void LinqToEntities89() - { - var query = northwindContext - .ContactsSplit - .OfType() - .ToList() - .Select(c => new { type = c.GetType().ToString(), c }); - - QueryDumper.Dump(query); - } -*/ - - - /* - [Category("Table per Type Inheritance")] - [Test(Description = "OfType 2")] - [Description("Select all Customers who are also employees, both as the base ContactSplit type (empty set).")] - public void LinqToEntities90() - { - var query = northwindContext - .ContactsSplit - .OfType() - .Cast() - .Intersect(northwindContext.ContactsSplit.OfType().Cast()) - .ToList() - .Select(c => new { type = c.GetType().ToString(), c }); - - QueryDumper.Dump(query); - } - */ - - #endregion - - #region Runtime behavior closure - - private class MyClass - { - public static decimal Val = 50; - - public decimal GetVal() - { - return MyClass.Val; - } - } - - [Category("Runtime behavior example")] - [Test(Description = "Static variable reference")] - [Description("Uses a local variable as a query parameter.")] - public void LinqToEntities91() - { - MyClass c = new MyClass(); - var query = Session.Query.All().Where(i => i.Commission > MyClass.Val).Select(i => new {i.Commission, i}); - - QueryDumper.Dump(query); - } - - [Category("Runtime behavior example")] - [Test(Description = "Query Parameters")] - [Description("Uses a the value of the local variable at query execution time.")] - public void LinqToEntities92() - { - decimal x = 50; - - var query = Session.Query.All().Where(i => i.Commission > x).Select(i => new {i.Commission, i}); - - x = 100; - - QueryDumper.Dump(query); - } - - [Category("Runtime behavior example")] - [Test(Description = "Deferred Execution and Query Parameters")] - [Description("Each execution uses the current value of the local variable.")] - public void LinqToEntities93() - { - decimal x = 100; - - var query = Session.Query.All().Where(i => i.Commission > x).Select(i => new {i.Commission, i}); - - QueryDumper.Dump(x); - QueryDumper.Dump(query); - - x = 200; - QueryDumper.Dump(x); - QueryDumper.Dump(query); - } - - #endregion - - // Data manipulations region removed - - // Object context region removed - } +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + + +namespace Xtensive.Orm.Tests.Linq.Samples +{ + [Category("Linq")] + [TestFixture] + public class LinqToEntitiesSamples : ChinookDOModelTest + { + #region Restriction Operators + + [Category("Restriction Operators")] + [Test(Description = "Where - Simple 1")] + [Description("This sample uses WHERE to find all customers in Seattle.")] + public void LinqToEntities1() + { + var query = from cust in Session.Query.All() + where cust.Address.City=="Seattle" + select cust; + QueryDumper.Dump(query); + } + + + [Category("Restriction Operators")] + [Test(Description = "Where - Simple 2")] + [Description("This sample uses WHERE to find all orders placed in 2005.")] + public void LinqToEntities2() + { + DateTime dt = new DateTime(2005, 1, 1); + var query = from invoice in Session.Query.All() + where invoice.InvoiceDate > dt + select invoice; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "Where - Simple 3")] + [Description("This sample uses WHERE to filter for Tracks that have duration less that 3 minutes and which Genre is Latin.")] + public void LinqToEntities3() + { + var query = from t in Session.Query.All() + where t.Milliseconds < 180000 && t.Genre.GenreId==282 + select t; + + QueryDumper.Dump(query); + } + + + [Category("Restriction Operators")] + [Test(Description = "Where - Simple 4")] + [Description("This sample uses WHERE to filter out Tracks that have a UnitPrice less than 1.")] + public void LinqToEntities4() + { + var query = from p in Session.Query.All() + where p.UnitPrice < 1 + select p; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "Where - Related Entities 1")] + [Description("This sample uses WHERE to get invoices for Customers in Mexico.")] + public void LinqToEntities5() + { + var query = from i in Session.Query.All() + where i.Customer.Address.Country=="Mexico" + select i; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "Where - Related Entities 2")] + [Description("This sample uses WHERE to get invoices which is tracked by employees in the UK.")] + public void LinqToEntities6() + { + var query = from i in Session.Query.All() + where i.DesignatedEmployee.Address.Country=="UK" + select i; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "Any - 1")] + [Description("This sample uses ANY to get employees have any invoices to track.")] + public void LinqToEntities7() + { + var query = from e in Session.Query.All() + where e.Invoices.Any(i => i!=null) + select e; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "Any - 2")] + [Description("This sample uses ANY to check for any playlists which have any Pop tracks.")] + public void LinqToEntities8() + { + var query = Session.Query.All() + .Where(s => s.Tracks + .Any(p => p.MediaType.MediaTypeId==284)) + .Select(s => s); + + QueryDumper.Dump(query); + } + + + [Category("Restriction Operators")] + [Test(Description = "Any - Related Entities")] + [Description("This sample uses WHERE and ANY to get employees who invoiced any customer in Mexico.")] + public void LinqToEntities9() + { + Require.ProviderIsNot(StorageProvider.Oracle); + var query = from e in Session.Query.All() + where e.Invoices.Any(i => i.Customer.Address.Country=="Mexico") + select e; + + QueryDumper.Dump(query); + } + + [Category("Restriction Operators")] + [Test(Description = "All - Simple")] + [Description("This sample uses ALL to get employees who invoiced customers not in Canada.")] + public void LinqToEntities10() + { + Require.ProviderIsNot(StorageProvider.Oracle); + var query = from e in Session.Query.All() + where e.Invoices.All(i => i.Customer.Address.Country!="Canada") + select e; + + QueryDumper.Dump(query); + } + + #endregion + + #region Projection Operators + + [Category("Projection Operators")] + [Test(Description = "Select - Simple 1")] + [Description("This samples uses SELECT to get all Customers as Entity Objects.")] + public void LinqToEntities11() + { + var query = from c in Session.Query.All() + select c; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "Select - Simple 2")] + [Description("This samples uses SELECT to get all Customer Company Names as Strings.")] + public void LinqToEntities12() + { + var query = from c in Session.Query.All() + select c.CompanyName; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "Select - Anonymous 1")] + [Description("This samples uses SELECT to get all Customer Company Names as an anonoymous type.")] + public void LinqToEntities13() + { + var query = from c in Session.Query.All() + select new {c.CompanyName}; + + QueryDumper.Dump(query); + } + + + [Category("Projection Operators")] + [Test(Description = "Select - Anonymous 2")] + [Description("This sample uses SELECT to get all Invoices as anonymous type")] + public void LinqToEntities14() + { + var query = from i in Session.Query.All() + select new {i}; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "Select - Anonymous 3")] + [Description("This sample uses SELECT to get all Invoices and associated Employees as anonymous type")] + public void LinqToEntities15() + { + var query = from i in Session.Query.All() + select new {i, i.DesignatedEmployee}; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "Select - Nested Collection ")] + [Description("This sample uses SELECT to get all Customers, and those Invoiices for each customer with a commission > 0.05")] + public void LinqToEntities15a() + { + var query = Session.Query.All().Select(c => new {Customer = c, Invoices = c.Invoices.Where(i => i.Commission > 0.05m)}); + + QueryDumper.Dump(query); + } + + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Simple 1")] + [Description("This sample uses SELECTMANY to get all Invoices for a Customer as a flat result")] + public void LinqToEntities16() + { + var query = from c in Session.Query.All() + where c.CustomerId==4200 + from i in c.Invoices + select i; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Simple 2")] + [Description("This sample uses SELECTMANY to get all Invoices for a Customer as a flat result using LINQ operators")] + public void LinqToEntities17() + { + var query = Session.Query.All().Where(cust => cust.CustomerId==4200) + .SelectMany(cust => cust.Invoices); + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Simple 3")] + [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result")] + public void LinqToEntities18() + { + var query = from c in Session.Query.All() + where c.Address.Country=="Denmark" + from i in c.Invoices + select i; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Simple 4")] + [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result using LINQ operators")] + public void LinqToEntities19() + { + var query = Session.Query.All().Where(cust => cust.Address.Country=="Denmark") + .SelectMany(cust => cust.Invoices); + + QueryDumper.Dump(query); + } + + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Predicate 1")] + [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result")] + public void LinqToEntities20() + { + var query = from c in Session.Query.All() + where c.Address.Country=="Denmark" + from i in c.Invoices + where i.Commission > 0.05m + select i; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Predicate 2")] + [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as an anonymous type containing the Invoice and Customer flat result")] + public void LinqToEntities21() + { + var query = from c in Session.Query.All() + where c.Address.Country=="Denmark" + from i in c.Invoices + where i.Commission > 0.05m + select new {c, i}; + + QueryDumper.Dump(query); + } + + [Category("Projection Operators")] + [Test(Description = "SelectMany - Predicate 3")] + [Description("This sample uses SELECTMANY to get all Invoices for Customers in Denmark as a flat result using LINQ opeartors")] + public void LinqToEntities22() + { + var query = Session.Query.All().Where(cust => cust.Address.Country=="Denmark") + .SelectMany(cust => cust.Invoices.Where(i => i.Commission > 0.05m)); + + QueryDumper.Dump(query); + } + + #endregion + + #region Aggregate Operators + + [Category("Aggregate Operators")] + [Test(Description = "Count - Simple")] + [Description("This sample uses COUNT to get the number of Invoices.")] + public void LinqToEntities23() + { + var query = Session.Query.All().Count(); + + QueryDumper.Dump(query); + } + + + [Category("Aggregate Operators")] + [Test(Description = "Count - Predicate 1")] + [Description("This sample uses COUNT to get the number of Invoices placed by Customers in Mexico.")] + public void LinqToEntities24() + { + var query = Session.Query.All().Where(i => i.Customer.Address.Country=="Mexico").Count(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Count - Predicate 2")] + [Description("This sample uses COUNT to get the number of Invoices shipped to Mexico.")] + public void LinqToEntities25() + { + var query = Session.Query.All() + .Where(i => i.BillingAddress.Country=="Mexico").Count(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Sum - Simple 1")] + [Description("This sample uses SUM to find the total Commission over all Invoices.")] + public void LinqToEntities26() + { + var query = Session.Query.All().Select(i => i.Commission).Sum(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Sum - Simple 2")] + [Description("This sample uses SUM to find the total duration of units on order over all Tracks.")] + public void LinqToEntities27() + { + var query = Session.Query.All().Sum(p => p.Milliseconds); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Sum - Simple 3")] + [Description("This sample uses SUM to find the total duration of units on order over all Tracks which are Classic.")] + public void LinqToEntities28() + { + var query = Session.Query.All().Where(p => p.Genre.GenreId==299).Sum(p => p.Milliseconds); + + QueryDumper.Dump(query); + } + + + [Category("Aggregate Operators")] + [Test(Description = "Min - Simple 1")] + [Description("This sample uses MIN to find the lowest unit price of any Tracks.")] + public void LinqToEntities29() + { + var query = Session.Query.All().Select(p => p.UnitPrice).Min(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Min - Simple 2")] + [Description("This sample uses MIN to find the lowest commission of any Invoice.")] + public void LinqToEntities30() + { + var query = Session.Query.All().Min(i => i.Commission); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Min - Predicate")] + [Description("This sample uses MIN to find the lowest commission of any invoice billed from Mexico.")] + public void LinqToEntities31() + { + var query = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Min(i => i.Commission); + + QueryDumper.Dump(query); + } + + + [Category("Aggregate Operators")] + [Test(Description = "Min - Grouping")] + [Description("This sample uses Min to find the Tracks that have the lowest unit price for each media type, and returns the result as an anonoymous type.")] + public void LinqToEntities32() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .GroupBy(p => p.MediaType) + .Select(g => new { + MediaTypeId = g.Key, + CheapestTracks = + g.Where(p2 => p2.UnitPrice==g.Min(p3 => p3.UnitPrice)) + }); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Max - Simple 1")] + [Description("This sample uses MAX to find the latest hire date of any Employee.")] + public void LinqToEntities33() + { + var query = Session.Query.All().Select(e => e.HireDate).Max(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Max - Simple 2")] + [Description("This sample uses MAX to find the longest units of any Tracks.")] + public void LinqToEntities34() + { + var query = Session.Query.All().Max(p => p.Milliseconds); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Max - Predicate")] + [Description("This sample uses MAX to find the longes units of any Track with MediaTypeId = 305.")] + public void LinqToEntities35() + { + var query = Session.Query.All().Where(p => p.MediaType.MediaTypeId==305).Max(p => p.Milliseconds); + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Max - Grouping")] + [Description("This sample uses MAX to find the Tracks that have the highest unit price for each media type, and returns the result as an anonoymous type.")] + public void LinqToEntities36() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = from p in Session.Query.All() + group p by p.MediaType + into g + select new { + g.Key, + MostExpensiveTracks = + from t2 in g + where t2.UnitPrice==g.Max(t3 => t3.UnitPrice) + select t2 + }; + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Average - Simple 1")] + [Description("This sample uses AVERAGE to find the average commission of all Invoices.")] + public void LinqToEntities37() + { + var query = Session.Query.All().Select(i => i.Commission).Average(); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Average - Simple 2")] + [Description("This sample uses AVERAGE to find the average unit price of all Tracks.")] + public void LinqToEntities38() + { + var query = Session.Query.All().Average(p => p.UnitPrice); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Average - Predicate")] + [Description("This sample uses AVERAGE to find the average unit price of all Tracks with MediaTypeId = 305.")] + public void LinqToEntities39() + { + var query = Session.Query.All().Where(p => p.MediaType.MediaTypeId==305).Average(p => p.UnitPrice); + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Average - Grouping 1")] + [Description("This sample uses AVERAGE to find the Products that have unit price higher than the average unit price of the category for each category.")] + public void LinqToEntities40() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = from p in Session.Query.All() + group p by p.MediaType + into g + select new { + g.Key, + ExpensiveProducts = + from t2 in g + where t2.UnitPrice > g.Average(t3 => t3.UnitPrice) + select t2 + }; + + QueryDumper.Dump(query); + } + + [Category("Aggregate Operators")] + [Test(Description = "Average - Grouping 2")] + [Description("This sample uses AVERAGE to find the average unit price of each media type.")] + public void LinqToEntities41() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .GroupBy(t => t.MediaType) + .Select(g => new { + g.Key, + Average = g.Average(t => t.UnitPrice) + }); + + QueryDumper.Dump(query); + } + + #endregion + + #region Set Operators + + [Category("Set And Element Operators")] + [Test(Description = "First - Simple")] + [Description("This sample uses FIRST and WHERE to get the first (database order) order that is ordered from Paris. The WHERE predicate is evaluated on the server.")] + public void LinqToEntities42() + { + var query = from i in Session.Query.All() + where i.BillingAddress.City=="Paris" + select i; + + // Feb CTP requires AsEnumerable() + var result = query.ToList().First(); + + QueryDumper.Dump(result); + } + + [Category("Set And Element Operators")] + [Test(Description = "First - Predicate")] + [Description("This sample uses FIRST to get the first (database order) order that is ordered from Dublin. The predicate is evaluated on the client.")] + public void LinqToEntities43() + { + var query = from o in Session.Query.All() + select o; + + // Feb CTP requires AsEnumerable() + var result = query + .ToList() + .First(x => x.BillingAddress.City=="Dublin"); + + QueryDumper.Dump(result); + } + + [Category("Set And Element Operators")] + [Test(Description = "First - Ordered")] + [Description("This sample uses FIRST, WHERE and ORDER BY to get the first order that is ordered from Oslo, ordered by date. The predicate is evaluated on the server.")] + public void LinqToEntities44() + { + var query = from i in Session.Query.All() + where i.BillingAddress.City=="Oslo" + orderby i.InvoiceDate + select i; + + // Feb CTP requires AsEnumerable() + var result = query.ToList().First(); + + QueryDumper.Dump(result); + } + + + [Category("Set And Element Operators")] + [Test(Description = "Distinct - Simple")] + [Description("This sample uses DISTINCT to get all the media types of tracks.")] + public void LinqToEntities45() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var query = Session.Query.All().Select(i => i.MediaType).Distinct(); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Union - Simple")] + [Description("This sample uses UNION to get all the invoices where the order country was Mexico or Canada.")] + public void LinqToEntities46() + { + var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); + var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); + var query = mexico.Union(canada); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Union - With Distinct")] + [Description("This sample uses UNION and DISTINCT to get all the employees from invoices where the order country was Mexico or Canada.")] + public void LinqToEntities47() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); + var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); + var union = mexico.Union(canada).Select(i => i.DesignatedEmployee); + + var query = union.Distinct(); + + var actualMexico = Session.Query.All().ToList() + .Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); + var actualCanada = Session.Query.All().ToList() + .Where(i => i.BillingAddress.Country=="Canada").Select(i => i); + var actualUnion = actualMexico.Union(actualCanada).Select(i => i.DesignatedEmployee); + + var actual = actualUnion.Distinct(); + + Assert.AreEqual(0, actual.Select(e => e.EmployeeId).Except(query.ToList().Select(e => e.EmployeeId)).Count()); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Concat - Simple")] + [Description("This sample uses CONCAT to get all invoices where the shipping country was Mexico or Canada.")] + public void LinqToEntities48() + { + var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i); + var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i); + + var query = mexico.Concat(canada); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Intersect - Simple 1")] + [Description("This sample uses INTERSECT to get common employees where an invoices was ordered from Mexico or Canada.")] + public void LinqToEntities49() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var mexico = Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i.DesignatedEmployee); + var canada = Session.Query.All().Where(i => i.BillingAddress.Country=="Canada").Select(i => i.DesignatedEmployee); + + var query = mexico.Intersect(canada); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Intersect - Simple 2")] + [Description("This sample uses INTERSECT to get common employees where an invoice was ordered from Mexico or Canada in one consolidated query.")] + public void LinqToEntities50() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All() + .Where(i => i.BillingAddress.Country=="Mexico") + .Select(i => i.DesignatedEmployee) + .Intersect(Session.Query.All() + .Where(i => i.BillingAddress.Country=="Canada") + .Select(i => i.DesignatedEmployee)); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Except - Simple 1")] + [Description("This sample uses EXCEPT to get employees who manages invoices to Mexico but not Canada.")] + public void LinqToEntities51() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All() + .Where(i => i.BillingAddress.Country=="Mexico") + .Select(i => i.DesignatedEmployee) + .Except(Session.Query.All() + .Where(i => i.BillingAddress.Country=="Canada") + .Select(i => i.DesignatedEmployee)); + + QueryDumper.Dump(query); + } + + [Category("Set And Element Operators")] + [Test(Description = "Except - Simple 2")] + [Description("This sample uses EXCEPT to get employees with no invoices sent to Mexico.")] + public void LinqToEntities52() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All().Select(e => e) + .Except(Session.Query.All().Where(i => i.BillingAddress.Country=="Mexico").Select(i => i.DesignatedEmployee)); + + QueryDumper.Dump(query); + } + + #endregion + + #region Ordering and Grouping + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy - Simple 1")] + [Description("Select all customers ordered by CompanyName.")] + public void LinqToEntities53() + { + var query = from c in Session.Query.All() + orderby c.CompanyName + select c; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy - Simple 2")] + [Description("Select all customers ordered by CompanyName descending.")] + public void LinqToEntities54() + { + var query = from c in Session.Query.All() + orderby c.CompanyName descending + select c; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy - Simple 3")] + [Description("Select an anonoymous type with all track Ids ordered by Milliseconds.")] + public void LinqToEntities55() + { + var query = from p in Session.Query.All() + orderby p.Milliseconds + select new {p.TrackId}; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy - Simple 4")] + [Description("Select an anonoymous type with all track Ids ordered by Milliseconds using LINQ operators.")] + public void LinqToEntities56() + { + var query = Session.Query.All().OrderBy(p => p.Milliseconds) + .Select(p2 => new {p2.TrackId}); + + QueryDumper.Dump(query); + } + + + [Category("Ordering and Grouping")] + [Test(Description = "OrderByDescending - Simple 1")] + [Description("Select all customers ordered by the descending state.")] + public void LinqToEntities57() + { + var query = from c in Session.Query.All() + orderby c.Address.State descending + select c; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderByDescending - Simple 2")] + [Description("Select all customers ordered by the descending state using LINQ operators.")] + public void LinqToEntities58() + { + var query = Session.Query.All().Select(c => c).OrderByDescending(c2 => c2.Address.State); + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy with ThenBy")] + [Description("Select all customers ordered by the region, then the last name.")] + public void LinqToEntities59() + { + var query = Session.Query.All().Select(c => c).OrderBy(c => c.Address.State).ThenBy(c => c.LastName); + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderByDescending with ThenBy")] + [Description("Select all customers ordered by the state in descending order, then the last name.")] + public void LinqToEntities60() + { + var query = Session.Query.All().Select(c => c).OrderByDescending(c => c.Address.State).ThenBy(c => c.LastName); + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy with ThenByDescending")] + [Description("Select all customers ordered by the state then the last name in descending order.")] + public void LinqToEntities61() + { + var query = Session.Query.All().Select(c => c).OrderBy(c => c.Address.State).ThenByDescending(c => c.LastName); + + QueryDumper.Dump(query); + } + + + [Category("Ordering and Grouping")] + [Test(Description = "OrderByDescending - Simple 3")] + [Description("Select all tracks ordered by the descending unit price.")] + public void LinqToEntities62() + { + var query = from p in Session.Query.All() + orderby p.UnitPrice descending + select p; + + QueryDumper.Dump(query); + } + + + [Category("Ordering and Grouping")] + [Test(Description = "OrderBy - FK Collection")] + [Description("Select all orders for a customer ordered by date that the invoice was placed.")] + public void LinqToEntities63() + { + var query = Session.Query.All().Where(cust => cust.CustomerId==4233) + .SelectMany(c => c.Invoices.Select(i => i)) + .OrderBy(i2 => i2.InvoiceDate); + + foreach (var order in query) { + QueryDumper.Dump(order); + } + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping - Simple 1")] + [Description("Select all states with a customer.")] + public void LinqToEntities64() + { + var query = from c in Session.Query.All() + group c by c.Address.State + into states + select new {states.Key}; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping - Simple 2")] + [Description("Select all dates with orders placed.")] + public void LinqToEntities65() + { + var query = from i in Session.Query.All() + group i by i.InvoiceDate + into dates + select new {dates.Key}; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping - Join 1")] + [Description("Select all States and customer count for each state.")] + public void LinqToEntities66() + { + var query = from c in Session.Query.All() + group c by c.Address.State + into states + select new {State = states.Key, Count = states.Count()}; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping on Key")] + [Description("Select all States and customer count for each state using LINQ operator.")] + public void LinqToEntities67() + { + var query = Session.Query.All().GroupBy(c => c.Address.State).Select(r => new {state = r.Key, count = r.Count()}); + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping with a join on Key 1")] + [Description("Select all Customer states with the total on all invoices for Customers in that state.")] + public void LinqToEntities68() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var query = from c in Session.Query.All() + group c by c.Address.State + into states + join c2 in Session.Query.All() on states.Key equals c2.Address.State + select new {state = states.Key, total = c2.Invoices.Sum(i => i.Total)}; + + QueryDumper.Dump(query); + } + + [Category("Ordering and Grouping")] + [Test(Description = "Grouping with a Key 2")] + [Description("Select all Customer State with the total Commission on all orders for Customers in that State using LINQ operators.")] + public void LinqToEntities69() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var query = Session.Query.All().GroupBy(c => c.Address.State) + .Select(g => new { + Region = g.Key, CommissionTotal = g + .SelectMany(c2 => c2.Invoices) + .Sum(i => i.Commission) + }); + + QueryDumper.Dump(query); + } + + #endregion + + #region Relationship Navigation + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK Collection 1")] + [Description("Select a sequence of all the invoices for a customer using Select.")] + public void LinqToEntities70() + { + var query = Session.Query.All().Where(cust => cust.CustomerId==4200) + .Select(c => c.Invoices.Select(i => i)); + + foreach (var order in query) { + QueryDumper.Dump(order); + } + } + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK Collection 2")] + [Description("Select all the invoices for a customer using SelectMany.")] + public void LinqToEntities71() + { + var query = Session.Query.All().Where(cust => cust.CustomerId==4200).SelectMany(c => c.Invoices); + + QueryDumper.Dump(query); + } + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK Collection property")] + [Description("Select all Employee Ids, and the count of the their invoices.")] + public void LinqToEntities72() + { + var query = from e in Session.Query.All() + select new {e, orders = e.Invoices.Select(i => i)}; + + QueryDumper.Dump(query); + } + + /* not enabled for Feb CTP + [Category("Relationship Navigation")] + [Test(Description = "Select - FK Collection property 2")] + [Description("Select number of orders placed in 2002 for a customer.")] + public void LinqToEntities74() + { + var query = Session.Query.All() + .Where(cust => cust.CustomerID == "ALFKI") + .SelectMany(c => c.Orders) + .Where(i => i.OrderDate.Year == 2002); + + QueryDumper.Dump(query); + } + */ + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK Collection Aggregate property")] + [Description("Select a customer and the sum of the commission of thier invoices.")] + public void LinqToEntities73() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var query = Session.Query.All().Where(cust => cust.CustomerId==4233) + .Select(c => c.Invoices.Sum(i => i.Commission)); + + QueryDumper.Dump(query); + } + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK collection predicate")] + [Description("Select customers with an invoice where the billing address is the same as the customers.")] + public void LinqToEntities75() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var query = Session.Query.All().Where(cust => cust.Invoices.Any(i => i.BillingAddress==cust.Address)).Select(c2 => c2); + + QueryDumper.Dump(query); + } + + [Category("Relationship Navigation")] + [Test(Description = "Select - FK collection Grouping")] + [Description("Selects all states with a customer, and shows the sum of invoices for customers for each state.")] + public void LinqToEntities76() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var query = from c in Session.Query.All() + group c by c.Address.State + into states + join c2 in Session.Query.All() on states.Key equals c2.Address.State + select new {state = states.Key, total = c2.Invoices.Sum(i => i.Total)}; + + QueryDumper.Dump(query); + } + + #endregion + + #region Inheritance + + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "One Level Hierarchy - Simple")] + [Description("Select all tracks, both audio and video trackss, and shows the type.")] + public void LinqToEntities77() + { + var query = Session.Query.All() + .Select(p => p); + + // we need AsEnumerable to force execution, as GetType is not defined in store + var query2 = query + .ToList() + .Select(p => new {type = p.GetType().ToString(), prod = p}); + + QueryDumper.Dump(query2); + } + + + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "One Level Hierarchy - OfType - Simple 1")] + [Description("Select only video tracks.")] + public void LinqToEntities78() + { + var query = Session.Query.All().OfType().Select(p => p); + + QueryDumper.Dump(query); + } + + + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "One Level Hierarchy - OfType - Simple 2")] + [Description("Select only products, which will reutrn all Tracks and subtypes of Tracks (video and audio tracks).")] + public void LinqToEntities79() + { + var query = Session.Query.All().OfType().Select(p => p); + + QueryDumper.Dump(query); + } + + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "One Level Hierarchy - Getting Supertype - OfType")] + [Description("Select only audio tracks.")] + public void LinqToEntities80() + { + var query = Session.Query.All().OfType(); + + QueryDumper.Dump(query); + } + + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "One Level Hierarchy - Getting Supertype - Local")] + [Description("Select only video tracks.")] + public void LinqToEntities81() + { + var query = Session.Query.All().Where(p => p is VideoTrack); + + QueryDumper.Dump(query); + } + + + // Modified according to DO model. + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "Complex Hierarchy - Simple")] + [Description("Select all contacts and show the type of each.")] + public void LinqToEntities82() + { + var query = Session.Query.All().Select(c => c); + + // we need AsEnumerable to force execution, as GetType is not defined in store + Assert.Throws(() => { + var query2 = query + .ToList() + .Select(c => new { type = c.GetType().ToString() }); + + QueryDumper.Dump(query2); + }); + + } + + // Modified according to DO model. + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "Complex Hierarchy - OfType 1")] + [Description("Select all Customer contacts.")] + public void LinqToEntities83() + { + var query = Session.Query.All().OfType().Select(c => c); + + Assert.Throws(() => QueryDumper.Dump(query)); + } + + // Modified according to DO model. + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "Complex Hierarchy - OfType 2")] + [Description("Select all Full contacts, which includes customers and employees.")] + public void LinqToEntities84() + { + var query = Session.Query.All().OfType().Select(c => c); + + Assert.Throws(() => QueryDumper.Dump(query)); + } + + /* not enabled for Feb CTP + [Category("Table per Hierarchy Inheritance")] + [Test(Description = "Complex Hierarchy - using supertype")] + [Description("Select all Customers and Employees, cast as FullContacts to allow join.")] + public void LinqToEntities85() + { + var query = northwindContext + .Contacts + .OfType() + .Cast() + .Union(northwindContext.Contacts.OfType().Cast().Select(ec => ec )) + .ToList() + .Select(c => new {type = c.GetType().ToString(), companyName = c.CompanyName } ); + + QueryDumper.Dump(query); + }*/ + + // Disabled + + /* + + [Category("Table per Concrete Type Inheritance")] + [Test(Description = "Simple")] + [Description("Select all federated products and display thier types.")] + public void LinqToEntities86() + { + var query = Session.Query.All()Fedarated.ToList().Select(p => new { type = p.GetType().ToString(), p }); + + QueryDumper.Dump(query); + } + + [Category("Table per Concrete Type Inheritance")] + [Test(Description = "OfType")] + [Description("Select all discontinued federated products.")] + public void LinqToEntities87() + { + var query = Session.Query.All()Fedarated.OfType().ToList().Select(p => new { type = p.GetType().ToString(), p }); + + QueryDumper.Dump(query); + } + + [Category("Table per Type Inheritance")] + [Test(Description = "Simple")] + [Description("Select all contacts and shows their types.")] + public void LinqToEntities88() + { + var query = northwindContext.ContactsSplit.ToList().Select(c => new { type = c.GetType().ToString(), c }); + + QueryDumper.Dump(query); + } + + [Category("Table per Type Inheritance")] + [Test(Description = "OfType 1")] + [Description("Select all Customers.")] + public void LinqToEntities89() + { + var query = northwindContext + .ContactsSplit + .OfType() + .ToList() + .Select(c => new { type = c.GetType().ToString(), c }); + + QueryDumper.Dump(query); + } +*/ + + + /* + [Category("Table per Type Inheritance")] + [Test(Description = "OfType 2")] + [Description("Select all Customers who are also employees, both as the base ContactSplit type (empty set).")] + public void LinqToEntities90() + { + var query = northwindContext + .ContactsSplit + .OfType() + .Cast() + .Intersect(northwindContext.ContactsSplit.OfType().Cast()) + .ToList() + .Select(c => new { type = c.GetType().ToString(), c }); + + QueryDumper.Dump(query); + } + */ + + #endregion + + #region Runtime behavior closure + + private class MyClass + { + public static decimal Val = 50; + + public decimal GetVal() + { + return MyClass.Val; + } + } + + [Category("Runtime behavior example")] + [Test(Description = "Static variable reference")] + [Description("Uses a local variable as a query parameter.")] + public void LinqToEntities91() + { + MyClass c = new MyClass(); + var query = Session.Query.All().Where(i => i.Commission > MyClass.Val).Select(i => new {i.Commission, i}); + + QueryDumper.Dump(query); + } + + [Category("Runtime behavior example")] + [Test(Description = "Query Parameters")] + [Description("Uses a the value of the local variable at query execution time.")] + public void LinqToEntities92() + { + decimal x = 50; + + var query = Session.Query.All().Where(i => i.Commission > x).Select(i => new {i.Commission, i}); + + x = 100; + + QueryDumper.Dump(query); + } + + [Category("Runtime behavior example")] + [Test(Description = "Deferred Execution and Query Parameters")] + [Description("Each execution uses the current value of the local variable.")] + public void LinqToEntities93() + { + decimal x = 100; + + var query = Session.Query.All().Where(i => i.Commission > x).Select(i => new {i.Commission, i}); + + QueryDumper.Dump(x); + QueryDumper.Dump(query); + + x = 200; + QueryDumper.Dump(x); + QueryDumper.Dump(query); + } + + #endregion + + // Data manipulations region removed + + // Object context region removed + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToSqlSamples.cs b/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToSqlSamples.cs index f7355afc90..d29e94afcf 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToSqlSamples.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/MsSamples/LinqToSqlSamples.cs @@ -1,1711 +1,1711 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq.Samples -{ - [Category("Linq")] - public class LinqToSqlSamples : ChinookDOModelTest - { - [Category("WHERE")] - [Test(Description = "Where - 1")] - [Description("This sample uses WHERE to filter for Customers in London.")] - public void DLinq1() - { - var q = - from c in Session.Query.All() - where c.Address.City=="London" - select c; - QueryDumper.Dump(q); - } - - [Category("WHERE")] - [Test(Description = "Where - 2")] - [Description("This sample uses WHERE to filter for Employees hired " + - "during or after 2006.")] - public void DLinq2() - { - var q = - from e in Session.Query.All() - where e.HireDate >= new DateTime(2006, 1, 1) - select e; - - QueryDumper.Dump(q); - } - - [Category("WHERE")] - [Test(Description = "Where - 3")] - [Description("This sample uses WHERE to filter for tracks that not longer than 3 minutes " + - "and are not videos.")] - public void DLinq3() - { - var q = - from t in Session.Query.All() - where t.Milliseconds <= 180000 && !(t is VideoTrack) - select t; - - QueryDumper.Dump(q); - } - - [Category("WHERE")] - [Test(Description = "Where - 4")] - [Description("This sample uses WHERE to filter out Products that are either " + - "UnitPrice is greater than 10 or is video.")] - public void DLinq4() - { - var q = - from t in Session.Query.All() - where t.UnitPrice > 10m || (t is VideoTrack) - select t; - - QueryDumper.Dump(q); - } - - [Category("WHERE")] - [Test(Description = "Where - 5")] - [Description("This sample calls WHERE twice to filter out Products that UnitPrice is greater than 10" + - " and is video.")] - public void DLinq5() - { - var q = - Session.Query.All().Where(t => t.UnitPrice > 10m).Where(t => (t is VideoTrack)); - - QueryDumper.Dump(q); - } - - [Category("WHERE")] - [Test(Description = "First - Simple")] - [Description("This sample uses First to select the first Playlist in the table.")] - public void DLinq6() - { - Playlist playlist = Session.Query.All().First(); - QueryDumper.Dump(playlist); - } - - [Category("WHERE")] - [Test(Description = "First - Element")] - [Description("This sample uses First to select the single Customer with Id '4200'.")] - public void DLinq7() - { - Customer cust = Session.Query.All().First(c => c.CustomerId==4200); - QueryDumper.Dump(cust); - } - - [Category("WHERE")] - [Test(Description = "First - Condition")] - [Description("This sample uses First to select an Order with Commission greater than 0.10.")] - public void DLinq8() - { - Invoice inv = Session.Query.All().First(i => i.Commission > 0.10M); - QueryDumper.Dump(inv); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Simple")] - [Description("This sample uses SELECT to return a sequence of just the " + - "Customers' company names.")] - public void DLinq9() - { - var q = - from c in Session.Query.All() - select c.CompanyName; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Anonymous Type 1")] - [Description("This sample uses SELECT and anonymous types to return " + - "a sequence of just the Customers' last names and phone numbers.")] - public void DLinq10() - { - var q = - from c in Session.Query.All() - select new {c.LastName, c.Phone}; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Anonymous Type 2")] - [Description("This sample uses SELECT and anonymous types to return " + - "a sequence of just the Employees' names and phone numbers, " + - "with the FirstName and LastName fields combined into a single field, 'Name', " + - "and the HomePhone field renamed to Phone in the resulting sequence.")] - public void DLinq11() - { - var q = - from e in Session.Query.All() - select new {Name = e.FirstName + " " + e.LastName, Phone = e.Phone}; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Anonymous Type 3")] - [Description("This sample uses SELECT and anonymous types to return " + - "a sequence of all Tracks' IDs and a calculated value " + - "called HalfPrice which is set to the Trask's UnitPrice " + - "divided by 2.")] - public void DLinq12() - { - var q = - from t in Session.Query.All() - select new {t.TrackId, HalfPrice = t.UnitPrice / 2}; - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Conditional ")] - [Description("This sample uses SELECT and a conditional statment to return a sequence of invoices " + - " Id and payment status.")] - public void DLinq13() - { - var q = - from i in Session.Query.All() - select new {i.InvoiceId, PaymentStatus = i.PaymentDate.HasValue && i.PaymentDate.Value < DateTime.UtcNow ? "Paid" : "Not yet paid"}; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Named Type")] - [Description("This sample uses SELECT and a known type to return a sequence of employees' names.")] - public void DLinq14() - { - var q = - from e in Session.Query.All() - select new Name {FirstName = e.FirstName, LastName = e.LastName}; - - QueryDumper.Dump(q); - } - - public class Name - { - public string FirstName; - public string LastName; - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Filtered")] - [Description("This sample uses SELECT and WHERE to return a sequence of " + - "just the London Customers' last names.")] - public void DLinq15() - { - var q = - from c in Session.Query.All() - where c.Address.City=="London" - select c.LastName; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Shaped")] - [Description("This sample uses SELECT and anonymous types to return " + - "a shaped subset of the data about Customers.")] - public void DLinq16() - { - var q = - from c in Session.Query.All() - select new { - c.CustomerId, - CustomerInfo = new {c.CompanyName, c.Address.City, c.Address.Country}, - ContactInfo = new {c.Phone, c.Email, c.Fax} - }; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Select - Nested ")] - [Description("This sample uses nested queries to return a sequence of " + - "all Invoices containing their InvoiceID, a subsequence of the " + - "items in the invoice with cost less than 1 dollar, and commission.")] - public void DLinq17() - { - var q = - from i in Session.Query.All() - select new { - i.InvoiceId, - DiscountedProducts = - from il in i.InvoiceLines - where il.UnitPrice < 1.0m - select il, - i.Commission - }; - - QueryDumper.Dump(q); - } - - [Category("SELECT/DISTINCT")] - [Test(Description = "Distinct")] - [Description("This sample uses Distinct to select a sequence of the unique cities " + - "that have Customers.")] - public void DLinq18() - { - var q = ( - from c in Session.Query.All() - select c.Address.City) - .Distinct(); - - QueryDumper.Dump(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Count - Simple")] - [Description("This sample uses Count to find the number of Customers in the database.")] - public void DLinq19() - { - var q = Session.Query.All().Count(); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Count - Conditional")] - [Description("This sample uses Count to find the number of Track in the database " + - "that are not videos.")] - public void DLinq20() - { - var q = Session.Query.All().Count(t => !(t is VideoTrack)); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Sum - Simple")] - [Description("This sample uses Sum to find the Commission over all Orders.")] - public void DLinq21() - { - var q = Session.Query.All().Select(o => o.Commission).Sum(); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Sum - Mapped")] - [Description("This sample uses Sum to find the total number of milliseconds over all Tracks.")] - public void DLinq22() - { - var q = Session.Query.All().Sum(t => t.Milliseconds); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Min - Simple")] - [Description("This sample uses Min to find the lowest unit price of any Track.")] - public void DLinq23() - { - var q = Session.Query.All().Select(t => t.UnitPrice).Min(); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Min - Mapped")] - [Description("This sample uses Min to find the lowest Commission of any Invoice.")] - public void DLinq24() - { - var q = Session.Query.All().Min(i => i.Commission); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Min - Elements")] - [Description("This sample uses Min to find the Tracks that have the lowest unit price " + - "in each category.")] - public void DLinq25() - { - var categories = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - Id = g.Key, - CheapestTracks = - from t2 in g - where t2.UnitPrice==g.Min(t3 => t3.UnitPrice) - select t2 - }; - - QueryDumper.Dump(categories); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Max - Simple")] - [Description("This sample uses Max to find the latest hire date of any Employee.")] - public void DLinq26() - { - var q = Session.Query.All().Select(e => e.HireDate).Max(); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Max - Mapped")] - [Description("This sample uses Max to find the longest duration of Tracks.")] - public void DLinq27() - { - var q = Session.Query.All().Max(t => t.Milliseconds); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Max - Elements")] - [Description("This sample uses Max to find the Tracks that have the highest unit price " + - "in each category.")] - public void DLinq28() - { - var categories = - Session.Query.All() - .GroupBy(t => t.TrackId) - .Select(g => new { - g.Key, - MostExpensiveTracks = g.Where(p2 => p2.UnitPrice==g.Max(p3 => p3.UnitPrice)) - }); - - QueryDumper.Dump(categories); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Average - Simple")] - [Description("This sample uses Average to find the average Commission of all Invoices.")] - public void DLinq29() - { - var q = Session.Query.All().Select(i => i.Commission).Average(); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Average - Mapped")] - [Description("This sample uses Average to find the average unit price of all Tracks.")] - public void DLinq30() - { - var q = Session.Query.All().Average(t => t.UnitPrice); - Console.WriteLine(q); - } - - [Category("COUNT/SUM/MIN/MAX/AVG")] - [Test(Description = "Average - Elements")] - [Description("This sample uses Average to find the Tracjs that have unit price higher than " + - "the average unit price of the category for each category.")] - public void DLinq31() - { - var categories = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - ExpensiveTracks = - from t2 in g - where t2.UnitPrice > g.Average(t3 => t3.UnitPrice) - select t2 - }; - - QueryDumper.Dump(categories); - } - - - [Category("JOIN")] - [Test(Description = "SelectMany - 1 to Many - 1")] - [Description("This sample uses foreign key navigation in the " + - "from clause to select all Invoices for Customers in London.")] - public void DLinqJoin1() - { - var q = - from c in Session.Query.All() - from i in c.Invoices - where c.Address.City=="London" - select i; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "SelectMany - 1 to Many - 2")] - [Description("This sample uses foreign key navigation in the " + - "where clause to filter for Invoices whose Customer is in the USA " + - "that are paid.")] - public void DLinqJoin2() - { - var q = - from i in Session.Query.All() - where i.Customer.Address.Country=="USA" && i.Status==InvoiceStatus.Paid - select i; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "SelectMany - Many to Many")] - [Description("This sample uses foreign key navigation in the " + - "from clause to filter for Tracks by Jon Bon Jovi, " + - "and also list their price and prlaylist which includes them.")] - public void DLinqJoin3() - { - var q = - from t in Session.Query.All() - from pl in t.Playlists - where t.Composer=="Jon Bon Jovi" - select new {TrackName = t.Name, t.UnitPrice, Playlist = pl.Name}; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "SelectMany - Self-Join")] - [Description("This sample uses foreign key navigation in the " + - "select clause to filter for pairs of employees where " + - "one employee reports to the other and where " + - "both employees are from the same City.")] - public void DLinqJoin4() - { - var q = - from e1 in Session.Query.All() - from e2 in e1.ReportingEmployees - where e1.Address.City==e2.Address.City - select new { - FirstName1 = e1.FirstName, LastName1 = e1.LastName, - FirstName2 = e2.FirstName, LastName2 = e2.LastName, - e1.Address.City - }; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "GroupJoin - Two way join")] - [Description("This sample explictly joins two tables and projects results from both tables.")] - public void DLinqJoin5() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var q = - from c in Session.Query.All() - join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices - select new {c.LastName, OrderCount = invoices.Count()}; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "GroupJoin - Three way join")] - [Description("This sample explictly joins three tables and projects results from each of them.")] - public void DLinqJoin6() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var q = - from c in Session.Query.All() - join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices - join e in Session.Query.All() on c.Address.City equals e.Address.City into emps - select new {c.LastName, invoices = invoices.Count(), emps = emps.Count()}; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "GroupJoin - LEFT OUTER JOIN")] - [Description("This sample shows how to get LEFT OUTER JOIN by using DefaultIfEmpty(). The DefaultIfEmpty() method returns null when there is no Invoice for the Employee.")] - public void DLinqJoin7() - { - var query = - from employee in Session.Query.All() - join invoice in Session.Query.All() on employee equals invoice.DesignatedEmployee into invoiceJoins - from invoiceJoin in invoiceJoins.DefaultIfEmpty() - select new {employee.FirstName, employee.LastName, Order = invoiceJoin}; - - QueryDumper.Dump(query); - } - - [Category("JOIN")] - [Test(Description = "GroupJoin - Projected let assignment")] - [Description("This sample projects a 'let' expression resulting from a join.")] - public void DLinqJoin8() - { - var q = - from c in Session.Query.All() - join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices - let z = c.Address.City + c.Address.Country - from i in invoices - select new {c.LastName, i.InvoiceId, z}; - - QueryDumper.Dump(q); - } - - [Ignore("Too slow")] - [Category("JOIN")] - [Test(Description = "GroupJoin - Composite Key")] - [Description("This sample shows a join with a composite key.")] - public void DLinqJoin9() - { - var q = - from i in Session.Query.All() - from t in Session.Query.All() - join il in Session.Query.All() - on new {InvoiceId = i.InvoiceId, TrackId = t.TrackId} equals new {InvoiceId = il.Invoice.InvoiceId, TrackId = il.Track.TrackId} - into details - from d in details - select new {InvoiceId = i.InvoiceId, ProductId = t.TrackId, d.UnitPrice}; - - QueryDumper.Dump(q); - } - - [Category("JOIN")] - [Test(Description = "GroupJoin - Nullable\\Nonnullable Key Relationship")] - [Description("This sample shows how to construct a join where one side is nullable and the other isn't.")] - public void DLinqJoin10() - { - var q = - from i in Session.Query.All() - join e in Session.Query.All() - on i.DesignatedEmployee.EmployeeId equals (int?) e.EmployeeId into emps - from e in emps - select new {i.InvoiceId, e.FirstName}; - - QueryDumper.Dump(q); - } - - [Category("ORDER BY")] - [Test(Description = "OrderBy - Simple")] - [Description("This sample uses orderby to sort Employees " + - "by hire date.")] - public void DLinq36() - { - var q = - from e in Session.Query.All() - orderby e.HireDate - select e; - - QueryDumper.Dump(q); - } - - [Category("ORDER BY")] - [Test(Description = "OrderBy - With Where")] - [Description("This sample uses where and orderby to sort Orders " + - "billed to London by Commission.")] - public void DLinq37() - { - var q = - from i in Session.Query.All() - where i.BillingAddress.City=="London" - orderby i.Commission - select i; - - QueryDumper.Dump(q); - } - - [Category("ORDER BY")] - [Test(Description = "OrderByDescending")] - [Description("This sample uses orderby to sort Tracks " + - "by unit price from highest to lowest.")] - public void DLinq38() - { - var q = - from t in Session.Query.All() - orderby t.UnitPrice descending - select t; - - QueryDumper.Dump(q); - } - - [Category("ORDER BY")] - [Test(Description = "ThenBy")] - [Description("This sample uses a compound orderby to sort Customers " + - "by city and then last name.")] - public void DLinq39() - { - var q = - from c in Session.Query.All() - orderby c.Address.City , c.LastName - select c; - - QueryDumper.Dump(q); - } - - [Category("ORDER BY")] - [Test(Description = "ThenByDescending")] - [Description("This sample uses orderby to sort Invoices from Id 1 " + - "by billing country, and then by Commission from highest to lowest.")] - public void DLinq40() - { - var q = - from i in Session.Query.All() - where i.InvoiceId==1 - orderby i.BillingAddress.Country , i.Commission descending - select i; - - QueryDumper.Dump(q); - } - - - [Category("ORDER BY")] - [Test(Description = "OrderBy - Group By")] - [Description("This sample uses Orderby, Max and Group By to find the Tracks that have " + - "the highest unit price in each category, and sorts the group by category id.")] - public void DLinq41() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var categories = - Session.Query.All() - .GroupBy(t => t.TrackId) - .OrderBy(g => g.Key) - .Select(g => new { - g.Key, - MostExpensiveTrack = - g.Where(t2 => t2.UnitPrice==g.Max(t3 => t3.UnitPrice)) - }); - - QueryDumper.Dump(categories); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Simple")] - [Description("This sample uses group by to partition Tracks by " + - "Id.")] - public void DLinq42() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select g; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Max")] - [Description("This sample uses group by and Max " + - "to find the maximum unit price for each Id.")] - public void DLinq43() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - MaxPrice = g.Max(t => t.UnitPrice) - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Min")] - [Description("This sample uses group by and Min " + - "to find the minimum unit price for each Id.")] - public void DLinq44() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - MinPrice = g.Min(t => t.UnitPrice) - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Average")] - [Description("This sample uses group by and Average " + - "to find the average UnitPrice for each Id.")] - public void DLinq45() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - AveragePrice = g.Average(t => t.UnitPrice) - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Sum")] - [Description("This sample uses group by and Sum " + - "to find the total UnitPrice for each Id.")] - public void DLinq46() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - TotalPrice = g.Sum(t => t.UnitPrice) - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Count")] - [Description("This sample uses group by and Count " + - "to find the number of Tracks in each Id.")] - public void DLinq47() - { - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - NumTracks = g.Count() - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Count - Conditional")] - [Description("This sample uses group by and Count " + - "to find the number of Track in each Id " + - "that are VideoTracks.")] - public void DLinq48() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - select new { - g.Key, - NumTracks = g.Count(t => (t is VideoTrack)) - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - followed by Where")] - [Description("This sample uses a where clause after a group by clause " + - "to find all categories that have at least 10 track.")] - public void DLinq49() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var q = - from t in Session.Query.All() - group t by t.TrackId - into g - where g.Count() >= 10 - select new { - g.Key, - TrackCount = g.Count() - }; - - QueryDumper.Dump(q); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Multiple Columns")] - [Description("This sample uses Group By to group tracks by TrackId and MediaTypeId.")] - public void DLinq50() - { - var categories = - from t in Session.Query.All() - group t by new {t.TrackId, SupplierId = t.MediaType.MediaTypeId} - into g - select new {g.Key, g}; - - QueryDumper.Dump(categories); - } - - [Category("GROUP BY/HAVING")] - [Test(Description = "GroupBy - Expression")] - [Description("This sample uses Group By to return two sequences of tracks. " + - "The first sequence contains tracks with unit price " + - "greater than 10. The second sequence contains tracks " + - "with unit price less than or equal to 10.")] - public void DLinq51() - { - var categories = - from t in Session.Query.All() - group t by new {Criterion = t.UnitPrice > 10} - into g - select g; - - QueryDumper.Dump(categories); - } - - [Category("EXISTS/IN/ANY/ALL")] - [Test(Description = "Any - Simple")] - [Description("This sample uses Any to return only Customers that have no Invoices.")] - public void DLinq52() - { - var q = - from c in Session.Query.All() - where !c.Invoices.Any() - select c; - - QueryDumper.Dump(q); - } - - [Category("EXISTS/IN/ANY/ALL")] - [Test(Description = "Any - Conditional")] - [Description("This sample uses Any to return only Playlists that have " + - "at least one VideoTrack.")] - public void DLinq53() - { - var q = - from p in Session.Query.All() - where p.Tracks.Any(t => (t is VideoTrack)) - select p; - - QueryDumper.Dump(q); - } - - [Category("EXISTS/IN/ANY/ALL")] - [Test(Description = "All - Conditional")] - [Description("This sample uses All to return Customers whom all of their orders " + - "have been shipped to their own city or whom have no orders.")] - public void DLinq54() - { - var q = - from c in Session.Query.All() - where c.Invoices.All(i => i.BillingAddress.City==c.Address.City) - select c; - - QueryDumper.Dump(q); - } - - [Category("UNION ALL/UNION/INTERSECT")] - [Test(Description = "Concat - Simple")] - [Description("This sample uses Concat to return a sequence of all Customer and Employee " + - "phone/fax numbers.")] - public void DLinq55() - { - var q = ( - from c in Session.Query.All() - select c.Phone - ).Concat( - from c in Session.Query.All() - select c.Fax - ).Concat( - from e in Session.Query.All() - select e.Phone - ); - - QueryDumper.Dump(q); - } - - [Category("UNION ALL/UNION/INTERSECT")] - [Test(Description = "Concat - Compound")] - [Description("This sample uses Concat to return a sequence of all Customer and Employee " + - "name and phone number mappings.")] - public void DLinq56() - { - var q = ( - from c in Session.Query.All() - select new {Name = c.CompanyName, c.Phone} - ).Concat( - from e in Session.Query.All() - select new {Name = e.FirstName + " " + e.LastName, Phone = e.Phone} - ); - - QueryDumper.Dump(q); - } - - [Category("UNION ALL/UNION/INTERSECT")] - [Test(Description = "Union")] - [Description("This sample uses Union to return a sequence of all countries that either " + - "Customers or Employees are in.")] - public void DLinq57() - { - var q = ( - from c in Session.Query.All() - select c.Address.Country - ).Union( - from e in Session.Query.All() - select e.Address.Country - ); - - QueryDumper.Dump(q); - } - - [Category("UNION ALL/UNION/INTERSECT")] - [Test(Description = "Intersect")] - [Description("This sample uses Intersect to return a sequence of all countries that both " + - "Customers and Employees live in.")] - public void DLinq58() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var q = ( - from c in Session.Query.All() - select c.Address.Country - ).Intersect( - from e in Session.Query.All() - select e.Address.Country - ); - - QueryDumper.Dump(q); - } - - [Category("UNION ALL/UNION/INTERSECT")] - [Test(Description = "Except")] - [Description("This sample uses Except to return a sequence of all countries that " + - "Customers live in but no Employees live in.")] - public void DLinq59() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var q = ( - from c in Session.Query.All() - select c.Address.Country - ).Except( - from e in Session.Query.All() - select e.Address.Country - ); - - QueryDumper.Dump(q); - } - - [Category("TOP/BOTTOM")] - [Test(Description = "Take")] - [Description("This sample uses Take to select the first 5 Employees hired.")] - public void DLinq60() - { - var q = ( - from e in Session.Query.All() - orderby e.HireDate - select e) - .Take(5); - - QueryDumper.Dump(q); - } - - [Category("TOP/BOTTOM")] - [Test(Description = "Skip")] - [Description("This sample uses Skip to select all but the 10 most expensive Tracks.")] - public void DLinq61() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var q = ( - from t in Session.Query.All() - orderby t.UnitPrice descending - select t) - .Skip(10); - - QueryDumper.Dump(q); - } - - [Category("Paging")] - [Test(Description = "Paging - Index")] - [Description("This sample uses the Skip and Take operators to do paging by " + - "skipping the first 50 records and then returning the next 10, thereby " + - "providing the data for page 6 of the Customers table.")] - public void DLinq62() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var q = ( - from c in Session.Query.All() - orderby c.LastName - select c) - .Skip(50) - .Take(10); - - QueryDumper.Dump(q); - } - - [Category("Paging")] - [Test(Description = "Paging - Ordered Unique Key")] - [Description("This sample uses a where clause and the Take operator to do paging by, " + - "first filtering to get only the Ids above 50 (the last Id " + - "from page 5), then ordering by Id, and finally taking the first 10 results, " + - "thereby providing the data for page 6 of the Tracks table. " + - "Note that this method only works when ordering by a unique key.")] - public void DLinq63() - { - var q = ( - from t in Session.Query.All() - where t.TrackId > 50 - orderby t.TrackId - select t) - .Take(10); - - QueryDumper.Dump(q); - } - - - [Category("NULL")] - [Test(Description = "null")] - [Description("This sample uses the null value to find Employees " + - "that do not report to another Employee.")] - public void DLinq75() - { - var q = - from e in Session.Query.All() - where e.ReportsToManager==null - select e; - - QueryDumper.Dump(q); - } - - [Category("NULL")] - [Test(Description = "Nullable.HasValue")] - [Description("This sample uses Nullable.HasValue to find Employees " + - "that do not report to another Employee.")] - public void DLinq76() - { - var q = - from e in Session.Query.All() - where !e.BirthDate.HasValue - select e; - - QueryDumper.Dump(q); - } - - [Category("NULL")] - [Test(Description = "Nullable.Value")] - [Description("This sample uses Nullable.Value for Employees " + - "that report to another Employee to return the " + - "Id number of that employee. Note that " + - "the .Value is optional.")] - public void DLinq77() - { - var q = - from e in Session.Query.All() - where e.BirthDate.HasValue - select new {e.FirstName, e.LastName, BirthDate = e.BirthDate.Value}; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String Concatenation")] - [Description("This sample uses the + operator to concatenate string fields " + - "and string literals in forming the Customers' calculated " + - "Location value.")] - public void DLinq78() - { - var q = - from c in Session.Query.All() - select new {c.CustomerId, Location = c.Address.City + ", " + c.Address.Country}; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Length")] - [Description("This sample uses the Length property to find all Tracks whose " + - "name is shorter than 10 characters.")] - public void DLinq79() - { - var q = - from t in Session.Query.All() - where t.Name.Length < 10 - select t; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Contains(substring)")] - [Description("This sample uses the Contains method to find all Customers whose " + - "contact name contains 'Anders'.")] - public void DLinq80() - { - var q = - from c in Session.Query.All() - where c.LastName.Contains("Anders") - select c; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.IndexOf(substring)")] - [Description("This sample uses the IndexOf method to find the first instance of " + - " '@' in each Customer's e-mail.")] - public void DLinq81() - { - var q = - from c in Session.Query.All() - select new {c.Email, AtPos = c.Email.IndexOf("@")}; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.StartsWith(prefix)")] - [Description("This sample uses the StartsWith method to find Customers whose " + - "first name starts with 'Maria'.")] - public void DLinq82() - { - var q = - from c in Session.Query.All() - where c.FirstName.StartsWith("Maria") - select c; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.EndsWith(suffix)")] - [Description("This sample uses the StartsWith method to find Customers whose " + - "last name ends with 'Anders'.")] - public void DLinq83() - { - var q = - from c in Session.Query.All() - where c.LastName.EndsWith("Anders") - select c; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Substring(start)")] - [Description("This sample uses the Substring method to return track names starting " + - "from the third letter.")] - public void DLinq84() - { - var q = - from t in Session.Query.All() - select t.Name.Substring(2); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Substring(start, length)")] - [Description("This sample uses the Substring method to find Employees whose " + - "home phone numbers have '555' as the seventh through ninth digits.")] - public void DLinq85() - { - var q = - from e in Session.Query.All() - where e.Phone.Substring(6, 3)=="555" - select e; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.ToUpper()")] - [Description("This sample uses the ToUpper method to return Employee names " + - "where the last name has been converted to uppercase.")] - public void DLinq86() - { - var q = - from e in Session.Query.All() - select new {LastName = e.LastName.ToUpper(), e.FirstName}; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.ToLower()")] - [Description("This sample uses the ToLower method to return MediaType names " + - "that have been converted to lowercase.")] - public void DLinq87() - { - var q = - from c in Session.Query.All() - select c.Name.ToLower(); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Trim()")] - [Description("This sample uses the Trim method to return the first five " + - "digits of Employee home phone numbers, with leading and " + - "trailing spaces removed.")] - public void DLinq88() - { - var q = - from e in Session.Query.All() - select e.Phone.Substring(0, 5).Trim(); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Insert(pos, str)")] - [Description("This sample uses the Insert method to return a sequence of " + - "employee phone numbers that have a ) in the fifth position, " + - "inserting a : after the ).")] - public void DLinq89() - { - var q = - from e in Session.Query.All() - where e.Phone.Substring(4, 1)==")" - select e.Phone.Insert(5, ":"); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Remove(start)")] - [Description("This sample uses the Insert method to return a sequence of " + - "employee phone numbers that have a ) in the fifth position, " + - "removing all characters starting from the tenth character.")] - public void DLinq90() - { - var q = - from e in Session.Query.All() - where e.Phone.Substring(4, 1)==")" - select e.Phone.Remove(9); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Remove(start, length)")] - [Description("This sample uses the Insert method to return a sequence of " + - "employee phone numbers that have a ) in the fifth position, " + - "removing the first six characters.")] - public void DLinq91() - { - var q = - from e in Session.Query.All() - where e.Phone.Substring(4, 1)==")" - select e.Phone.Remove(0, 6); - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "String.Replace(find, replace)")] - [Description("This sample uses the Replace method to return a sequence of " + - "Supplier information where the Country field has had " + - "UK replaced with United Kingdom and USA replaced with " + - "United States of America.")] - public void DLinq92() - { - var q = - from s in Session.Query.All() - select new { - s.CompanyName, - Country = s.Address.Country.Replace("UK", "United Kingdom") - .Replace("USA", "United States of America") - }; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "DateTime.Year")] - [Description("This sample uses the DateTime's Year property to " + - "find Orders placed in 2005.")] - public void DLinq93() - { - var q = - from i in Session.Query.All() - where i.InvoiceDate.Year==2005 - select i; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "DateTime.Month")] - [Description("This sample uses the DateTime's Month property to " + - "find Invoices placed in December.")] - public void DLinq94() - { - var q = - from i in Session.Query.All() - where i.InvoiceDate.Month==12 - select i; - - QueryDumper.Dump(q); - } - - [Category("String/Date Functions")] - [Test(Description = "DateTime.Day")] - [Description("This sample uses the DateTime's Day property to " + - "find Invoices placed on the 31st day of the month.")] - public void DLinq95() - { - var q = - from i in Session.Query.All() - where i.InvoiceDate.Day==31 - select i; - - QueryDumper.Dump(q); - } - - [Category("Object Identity")] - [Test(Description = "Object Caching - 1")] - [Description("This sample demonstrates how, upon executing the same query twice, " + - "you will receive a reference to the same object in memory each time.")] - public void DLinq96() - { - Customer cust1 = Session.Query.All().First(c => c.CustomerId==4200); - Customer cust2 = Session.Query.All().First(c => c.CustomerId==4200); - - Console.WriteLine("cust1 and cust2 refer to the same object in memory: {0}", - Object.ReferenceEquals(cust1, cust2)); - } - - [Category("Object Identity")] - [Test(Description = "Object Caching - 2")] - [Description("This sample demonstrates how, upon executing different queries that " + - "return the same row from the database, you will receive a " + - "reference to the same object in memory each time.")] - public void DLinq97() - { - Customer cust1 = Session.Query.All().First(c => c.CustomerId==4200); - Customer cust2 = ( - from i in Session.Query.All() - where i.Customer.CustomerId==4200 - select i) - .First() - .Customer; - - Console.WriteLine("cust1 and cust2 refer to the same object in memory: {0}", - Object.ReferenceEquals(cust1, cust2)); - } - - [Category("Object Loading")] - [Test(Description = "Deferred Loading - 1")] - [Description("This sample demonstrates how navigating through relationships in " + - "retrieved objects can end up triggering new queries to the database " + - "if the data was not requested by the original query.")] - public void DLinq98() - { - var custs = - from c in Session.Query.All() - where c.Address.City=="Sao Paulo" - select c; - - foreach (var cust in custs) { - foreach (var inv in cust.Invoices) { - Console.WriteLine("Id {0} has an InvoiceID {1}.", cust.CustomerId, inv.InvoiceId); - } - } - } - - private bool isValidTrack(Track t) - { - return t.Name.LastIndexOf('C')==0; - } - - [Category("Object Loading")] - [Test(Description = "Deferred Loading - (1:M)")] - [Description("This sample demonstrates how navigating through relationships in " + - "retrieved objects can result in triggering new queries to the database " + - "if the data was not requested by the original query.")] - public void DLinq102() - { - var emps = from e in Session.Query.All() - select e; - - foreach (var emp in emps) { - foreach (var inv in emp.Invoices) { - Console.WriteLine("Employee {0} is responsible for invoice #{1}.", emp.FirstName, inv.InvoiceId); - } - } - } - - //[Category("Object Loading")] - //[Test(Description = "Including - Eager Loading - (1:M)")] - //[Description("This sample demonstrates how to use Including to request related " + - // "data during the original query so that additional roundtrips to the " + - // "database are not triggered while navigating through " + - // "the retrieved objects.")] - //public void DLinq103() { - // var emps = ( - // from e in Session.Query.All() - // select e) - // .Including(e => e.Employees); - - // foreach (var emp in emps) - // { - // foreach (var man in emp.Employees) - // { - // Console.WriteLine("Employee {0} reported to Manager {1}.", emp.FirstName, man.FirstName); - // } - // } - //} - - - [Category("Object Loading")] - [Test(Description = "Deferred Loading - (BLOB)")] - [Description("This sample demonstrates how navigating through Link in " + - "retrieved objects can end up triggering new queries to the database " + - "if the data type is Link.")] - public void DLinq104() - { - var emps = from c in Session.Query.All() - select c; - - foreach (Employee emp in emps) { - Console.WriteLine("{0}", emp.LastName); - } - } - - [Category("Conversion Operators")] - [Test(Description = "AsEnumerable")] - [Description("This sample uses AsEnumerable so that the client-side IEnumerable " + - "implementation of Where is used, instead of the default IQueryable " + - "implementation which would be converted to SQL and executed " + - "on the server. This is necessary because the where clause " + - "references a user-defined client-side method, isValidProduct, " + - "which cannot be converted to SQL.")] -// [LinkedMethod("isValidProduct")] - public void DLinq105() - { - var q = - from t in Session.Query.All().ToList() - where isValidTrack(t) - select t; - - QueryDumper.Dump(q); - } - - [Category("Conversion Operators")] - [Test(Description = "ToArray")] - [Description("This sample uses ToArray to immediately evaluate a query into an array " + - "and get the 2nd element.")] - public void DLinq106() - { - var q = - from c in Session.Query.All() - where c.Address.City=="London" - select c; - - Customer[] qArray = q.ToArray(); - QueryDumper.Dump(qArray[1]); - } - - [Category("Conversion Operators")] - [Test(Description = "ToList")] - [Description("This sample uses ToList to immediately evaluate a query into a List.")] - public void DLinq107() - { - var q = - from e in Session.Query.All() - where e.HireDate >= new DateTime(1994, 1, 1) - select e; - - List qList = q.ToList(); - QueryDumper.Dump(qList); - } - - [Category("Conversion Operators")] - [Test(Description = "ToDictionary")] - [Description("This sample uses ToDictionary to immediately evaluate a query and " + - "a key expression into an Dictionary.")] - public void DLinq108() - { - var q = - from p in Session.Query.All() - where p.UnitPrice <= 10 && !(p is VideoTrack) - select p; - - Dictionary qDictionary = q.ToDictionary(t => t.TrackId); - - foreach (int key in qDictionary.Keys) { - Console.WriteLine("Key {0}:", key); - QueryDumper.Dump(qDictionary[key]); - Console.WriteLine(); - } - } - -// -// [Category("Stored Procedures")] -// [Test(Description = "Scalar Return")] -// [Description("This sample uses a stored procedure to return the number of Customers in the 'WA' Region.")] -// public void DLinq113() { -// int count = Query.CustomersCountByRegion("WA"); -// -// Console.WriteLine(count); -// } -// -// [Category("Stored Procedures")] -// [Test(Description = "Single CompilationResult-Set")] -// [Description("This sample uses a stored procedure to return the Id, ContactName, CompanyName" + -// " and City of customers who are in London.")] -// public void DLinq114() { -// IEnumerable result = Session.Query.All()ByCity("London"); -// -// QueryDumper.Dump(result); -// } -// -// [Category("Stored Procedures")] -// [Test(Description = "Single CompilationResult-Set - Multiple Possible Shapes")] -// [Description("This sample uses a stored procedure to return a set of " + -// "Customers in the 'WA' Region. The result set-shape returned depends on the parameter passed in. " + -// "If the parameter equals 1, all Customer properties are returned. " + -// "If the parameter equals 2, the Id, ContactName and CompanyName properties are returned.")] -// public void DLinq115() { -// Console.WriteLine("********** Whole Customer CompilationResult-set ***********"); -// IMultipleResults result = db.WholeOrPartialCustomersSet(1); -// IEnumerable shape1 = result.GetResult(); -// -// QueryDumper.Dump(shape1); -// -// Console.WriteLine(); -// Console.WriteLine("********** Partial Customer CompilationResult-set ***********"); -// result = db.WholeOrPartialCustomersSet(2); -// IEnumerable shape2 = result.GetResult(); -// -// QueryDumper.Dump(shape2); -// } -// -// [Category("Stored Procedures")] -// [Test(Description = "Multiple CompilationResult-Sets")] -// [Description("This sample uses a stored procedure to return the Customer 'SEVES' and all it's Orders.")] -// public void DLinq116() { -// IMultipleResults result = db.GetCustomerAndOrders("SEVES"); -// -// Console.WriteLine("********** Customer CompilationResult-set ***********"); -// IEnumerable customer = result.GetResult(); -// QueryDumper.Dump(customer); -// Console.WriteLine(); -// -// Console.WriteLine("********** Orders CompilationResult-set ***********"); -// IEnumerable orders = result.GetResult(); -// QueryDumper.Dump(orders); -// } -// -// [Category("Stored Procedures")] -// [Test(Description = "Out parameters")] -// [Description("This sample uses a stored procedure that returns an out parameter.")] -// public void DLinq143() { -// decimal? totalSales = 0; -// string Id = "ALFKI"; -// -// // Out parameters are passed by ref, to support scenarios where -// // the parameter is 'in/out'. In this case, the parameter is only -// // 'out'. -// db.CustomerTotalSales(Id, ref totalSales); -// -// Console.WriteLine("Total Sales for Customer '{0}' = {1:C}", Id, totalSales); -// } -// -// -// [Category("User-Defined Functions")] -// [Test(Description = "Scalar Function - Select")] -// [Description("This sample demonstrates using a scalar user-defined function in a projection.")] -// public void DLinq117() { -// var q = from c in db.Categories -// select new {c.Id, TotalUnitPrice = db.TotalProductUnitPriceByCategory(c.Id)}; -// -// QueryDumper.Dump(q); -// } -// -// [Category("User-Defined Functions")] -// [Test(Description = "Scalar Function - Where")] -// [Description("This sample demonstrates using a scalar user-defined function in a where clause.")] -// public void DLinq118() { -// var q = from p in Session.Query.All() -// where p.UnitPrice == db.MinUnitPriceByCategory(p.Id) -// select p; -// -// QueryDumper.Dump(q); -// } -// -// [Category("User-Defined Functions")] -// [Test(Description = "Table-Valued Function")] -// [Description("This sample demonstrates selecting from a table-valued user-defined function.")] -// public void DLinq119() { -// var q = from p in Session.Query.All()UnderThisUnitPrice(10.25M) -// where !(p is DiscontinuedProduct) -// select p; -// -// QueryDumper.Dump(q); -// } -// -// [Category("User-Defined Functions")] -// [Test(Description = "Table-Valued Function - Join")] -// [Description("This sample demonstrates joining to the results of a table-valued user-defined function.")] -// public void DLinq151() { -// var q = from c in db.Categories -// join p in Session.Query.All()UnderThisUnitPrice(8.50M) on c.Id equals p.Id into prods -// from p in prods -// select new {c.Id, c.CategoryName, p.ProductName, p.UnitPrice}; -// -// QueryDumper.Dump(q); -// } - - - [Category("Advanced")] - [Test(Description = "Nested in FROM")] - [Description("This sample uses orderbyDescending and Take to return the " + - "video tracks of the top 10 most expensive tracks.")] - public void DLinq131() - { - var tracks = from t in Session.Query.All().OrderByDescending(t => t.UnitPrice).Take(10) - where t is VideoTrack - select t; - - QueryDumper.Dump(tracks); - } - - [Category("Inheritance")] - [Test(Description = "Simple")] - [Description("This sample returns all contacts where the city is London.")] - public void DLinq135() - { - var cons = from c in Session.Query.All() - select c; - Assert.Throws(() => { - foreach (var con in cons) { - Console.WriteLine("Company name: {0}", con.CompanyName); - Console.WriteLine("Phone: {0}", con.Phone); - Console.WriteLine("This is a {0}", con.GetType()); - Console.WriteLine(); - } - }); - } - - [Category("Inheritance")] - [Test(Description = "OfType")] - [Description("This sample uses OfType to return all customer contacts.")] - public void DLinq136() - { - var cons = from c in Session.Query.All().OfType() - select c; - - Assert.Throws(() => QueryDumper.Dump(cons)) ; - } - - [Category("Inheritance")] - [Test(Description = "IS")] - [Description("This sample uses IS to return all Customers.")] - public void DLinq137() - { - var cons = from c in Session.Query.All() - where c is Customer - select c; - - Assert.Throws(() => QueryDumper.Dump(cons)); - } - - [Category("Inheritance")] - [Test(Description = "AS")] - [Description("This sample uses AS to return FullContact or null.")] - public void DLinq138() - { - var cons = from c in Session.Query.All() - select c as BusinessContact; - - Assert.Throws(() => QueryDumper.Dump(cons)); - } - - [Category("Inheritance")] - [Test(Description = "Cast")] - [Description("This sample uses a cast to retrieve customer contacts who work in 'Around the Horn'.")] - public void DLinq139() - { - var cons = from c in Session.Query.All() - where c is Customer && ((Customer) c).CompanyName=="Around the Horn" - select c; - - Assert.Throws(() => QueryDumper.Dump(cons)); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq.Samples +{ + [Category("Linq")] + public class LinqToSqlSamples : ChinookDOModelTest + { + [Category("WHERE")] + [Test(Description = "Where - 1")] + [Description("This sample uses WHERE to filter for Customers in London.")] + public void DLinq1() + { + var q = + from c in Session.Query.All() + where c.Address.City=="London" + select c; + QueryDumper.Dump(q); + } + + [Category("WHERE")] + [Test(Description = "Where - 2")] + [Description("This sample uses WHERE to filter for Employees hired " + + "during or after 2006.")] + public void DLinq2() + { + var q = + from e in Session.Query.All() + where e.HireDate >= new DateTime(2006, 1, 1) + select e; + + QueryDumper.Dump(q); + } + + [Category("WHERE")] + [Test(Description = "Where - 3")] + [Description("This sample uses WHERE to filter for tracks that not longer than 3 minutes " + + "and are not videos.")] + public void DLinq3() + { + var q = + from t in Session.Query.All() + where t.Milliseconds <= 180000 && !(t is VideoTrack) + select t; + + QueryDumper.Dump(q); + } + + [Category("WHERE")] + [Test(Description = "Where - 4")] + [Description("This sample uses WHERE to filter out Products that are either " + + "UnitPrice is greater than 10 or is video.")] + public void DLinq4() + { + var q = + from t in Session.Query.All() + where t.UnitPrice > 10m || (t is VideoTrack) + select t; + + QueryDumper.Dump(q); + } + + [Category("WHERE")] + [Test(Description = "Where - 5")] + [Description("This sample calls WHERE twice to filter out Products that UnitPrice is greater than 10" + + " and is video.")] + public void DLinq5() + { + var q = + Session.Query.All().Where(t => t.UnitPrice > 10m).Where(t => (t is VideoTrack)); + + QueryDumper.Dump(q); + } + + [Category("WHERE")] + [Test(Description = "First - Simple")] + [Description("This sample uses First to select the first Playlist in the table.")] + public void DLinq6() + { + Playlist playlist = Session.Query.All().First(); + QueryDumper.Dump(playlist); + } + + [Category("WHERE")] + [Test(Description = "First - Element")] + [Description("This sample uses First to select the single Customer with Id '4200'.")] + public void DLinq7() + { + Customer cust = Session.Query.All().First(c => c.CustomerId==4200); + QueryDumper.Dump(cust); + } + + [Category("WHERE")] + [Test(Description = "First - Condition")] + [Description("This sample uses First to select an Order with Commission greater than 0.10.")] + public void DLinq8() + { + Invoice inv = Session.Query.All().First(i => i.Commission > 0.10M); + QueryDumper.Dump(inv); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Simple")] + [Description("This sample uses SELECT to return a sequence of just the " + + "Customers' company names.")] + public void DLinq9() + { + var q = + from c in Session.Query.All() + select c.CompanyName; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Anonymous Type 1")] + [Description("This sample uses SELECT and anonymous types to return " + + "a sequence of just the Customers' last names and phone numbers.")] + public void DLinq10() + { + var q = + from c in Session.Query.All() + select new {c.LastName, c.Phone}; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Anonymous Type 2")] + [Description("This sample uses SELECT and anonymous types to return " + + "a sequence of just the Employees' names and phone numbers, " + + "with the FirstName and LastName fields combined into a single field, 'Name', " + + "and the HomePhone field renamed to Phone in the resulting sequence.")] + public void DLinq11() + { + var q = + from e in Session.Query.All() + select new {Name = e.FirstName + " " + e.LastName, Phone = e.Phone}; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Anonymous Type 3")] + [Description("This sample uses SELECT and anonymous types to return " + + "a sequence of all Tracks' IDs and a calculated value " + + "called HalfPrice which is set to the Trask's UnitPrice " + + "divided by 2.")] + public void DLinq12() + { + var q = + from t in Session.Query.All() + select new {t.TrackId, HalfPrice = t.UnitPrice / 2}; + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Conditional ")] + [Description("This sample uses SELECT and a conditional statment to return a sequence of invoices " + + " Id and payment status.")] + public void DLinq13() + { + var q = + from i in Session.Query.All() + select new {i.InvoiceId, PaymentStatus = i.PaymentDate.HasValue && i.PaymentDate.Value < DateTime.UtcNow ? "Paid" : "Not yet paid"}; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Named Type")] + [Description("This sample uses SELECT and a known type to return a sequence of employees' names.")] + public void DLinq14() + { + var q = + from e in Session.Query.All() + select new Name {FirstName = e.FirstName, LastName = e.LastName}; + + QueryDumper.Dump(q); + } + + public class Name + { + public string FirstName; + public string LastName; + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Filtered")] + [Description("This sample uses SELECT and WHERE to return a sequence of " + + "just the London Customers' last names.")] + public void DLinq15() + { + var q = + from c in Session.Query.All() + where c.Address.City=="London" + select c.LastName; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Shaped")] + [Description("This sample uses SELECT and anonymous types to return " + + "a shaped subset of the data about Customers.")] + public void DLinq16() + { + var q = + from c in Session.Query.All() + select new { + c.CustomerId, + CustomerInfo = new {c.CompanyName, c.Address.City, c.Address.Country}, + ContactInfo = new {c.Phone, c.Email, c.Fax} + }; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Select - Nested ")] + [Description("This sample uses nested queries to return a sequence of " + + "all Invoices containing their InvoiceID, a subsequence of the " + + "items in the invoice with cost less than 1 dollar, and commission.")] + public void DLinq17() + { + var q = + from i in Session.Query.All() + select new { + i.InvoiceId, + DiscountedProducts = + from il in i.InvoiceLines + where il.UnitPrice < 1.0m + select il, + i.Commission + }; + + QueryDumper.Dump(q); + } + + [Category("SELECT/DISTINCT")] + [Test(Description = "Distinct")] + [Description("This sample uses Distinct to select a sequence of the unique cities " + + "that have Customers.")] + public void DLinq18() + { + var q = ( + from c in Session.Query.All() + select c.Address.City) + .Distinct(); + + QueryDumper.Dump(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Count - Simple")] + [Description("This sample uses Count to find the number of Customers in the database.")] + public void DLinq19() + { + var q = Session.Query.All().Count(); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Count - Conditional")] + [Description("This sample uses Count to find the number of Track in the database " + + "that are not videos.")] + public void DLinq20() + { + var q = Session.Query.All().Count(t => !(t is VideoTrack)); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Sum - Simple")] + [Description("This sample uses Sum to find the Commission over all Orders.")] + public void DLinq21() + { + var q = Session.Query.All().Select(o => o.Commission).Sum(); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Sum - Mapped")] + [Description("This sample uses Sum to find the total number of milliseconds over all Tracks.")] + public void DLinq22() + { + var q = Session.Query.All().Sum(t => t.Milliseconds); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Min - Simple")] + [Description("This sample uses Min to find the lowest unit price of any Track.")] + public void DLinq23() + { + var q = Session.Query.All().Select(t => t.UnitPrice).Min(); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Min - Mapped")] + [Description("This sample uses Min to find the lowest Commission of any Invoice.")] + public void DLinq24() + { + var q = Session.Query.All().Min(i => i.Commission); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Min - Elements")] + [Description("This sample uses Min to find the Tracks that have the lowest unit price " + + "in each category.")] + public void DLinq25() + { + var categories = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + Id = g.Key, + CheapestTracks = + from t2 in g + where t2.UnitPrice==g.Min(t3 => t3.UnitPrice) + select t2 + }; + + QueryDumper.Dump(categories); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Max - Simple")] + [Description("This sample uses Max to find the latest hire date of any Employee.")] + public void DLinq26() + { + var q = Session.Query.All().Select(e => e.HireDate).Max(); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Max - Mapped")] + [Description("This sample uses Max to find the longest duration of Tracks.")] + public void DLinq27() + { + var q = Session.Query.All().Max(t => t.Milliseconds); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Max - Elements")] + [Description("This sample uses Max to find the Tracks that have the highest unit price " + + "in each category.")] + public void DLinq28() + { + var categories = + Session.Query.All() + .GroupBy(t => t.TrackId) + .Select(g => new { + g.Key, + MostExpensiveTracks = g.Where(p2 => p2.UnitPrice==g.Max(p3 => p3.UnitPrice)) + }); + + QueryDumper.Dump(categories); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Average - Simple")] + [Description("This sample uses Average to find the average Commission of all Invoices.")] + public void DLinq29() + { + var q = Session.Query.All().Select(i => i.Commission).Average(); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Average - Mapped")] + [Description("This sample uses Average to find the average unit price of all Tracks.")] + public void DLinq30() + { + var q = Session.Query.All().Average(t => t.UnitPrice); + Console.WriteLine(q); + } + + [Category("COUNT/SUM/MIN/MAX/AVG")] + [Test(Description = "Average - Elements")] + [Description("This sample uses Average to find the Tracjs that have unit price higher than " + + "the average unit price of the category for each category.")] + public void DLinq31() + { + var categories = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + ExpensiveTracks = + from t2 in g + where t2.UnitPrice > g.Average(t3 => t3.UnitPrice) + select t2 + }; + + QueryDumper.Dump(categories); + } + + + [Category("JOIN")] + [Test(Description = "SelectMany - 1 to Many - 1")] + [Description("This sample uses foreign key navigation in the " + + "from clause to select all Invoices for Customers in London.")] + public void DLinqJoin1() + { + var q = + from c in Session.Query.All() + from i in c.Invoices + where c.Address.City=="London" + select i; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "SelectMany - 1 to Many - 2")] + [Description("This sample uses foreign key navigation in the " + + "where clause to filter for Invoices whose Customer is in the USA " + + "that are paid.")] + public void DLinqJoin2() + { + var q = + from i in Session.Query.All() + where i.Customer.Address.Country=="USA" && i.Status==InvoiceStatus.Paid + select i; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "SelectMany - Many to Many")] + [Description("This sample uses foreign key navigation in the " + + "from clause to filter for Tracks by Jon Bon Jovi, " + + "and also list their price and prlaylist which includes them.")] + public void DLinqJoin3() + { + var q = + from t in Session.Query.All() + from pl in t.Playlists + where t.Composer=="Jon Bon Jovi" + select new {TrackName = t.Name, t.UnitPrice, Playlist = pl.Name}; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "SelectMany - Self-Join")] + [Description("This sample uses foreign key navigation in the " + + "select clause to filter for pairs of employees where " + + "one employee reports to the other and where " + + "both employees are from the same City.")] + public void DLinqJoin4() + { + var q = + from e1 in Session.Query.All() + from e2 in e1.ReportingEmployees + where e1.Address.City==e2.Address.City + select new { + FirstName1 = e1.FirstName, LastName1 = e1.LastName, + FirstName2 = e2.FirstName, LastName2 = e2.LastName, + e1.Address.City + }; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "GroupJoin - Two way join")] + [Description("This sample explictly joins two tables and projects results from both tables.")] + public void DLinqJoin5() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var q = + from c in Session.Query.All() + join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices + select new {c.LastName, OrderCount = invoices.Count()}; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "GroupJoin - Three way join")] + [Description("This sample explictly joins three tables and projects results from each of them.")] + public void DLinqJoin6() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var q = + from c in Session.Query.All() + join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices + join e in Session.Query.All() on c.Address.City equals e.Address.City into emps + select new {c.LastName, invoices = invoices.Count(), emps = emps.Count()}; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "GroupJoin - LEFT OUTER JOIN")] + [Description("This sample shows how to get LEFT OUTER JOIN by using DefaultIfEmpty(). The DefaultIfEmpty() method returns null when there is no Invoice for the Employee.")] + public void DLinqJoin7() + { + var query = + from employee in Session.Query.All() + join invoice in Session.Query.All() on employee equals invoice.DesignatedEmployee into invoiceJoins + from invoiceJoin in invoiceJoins.DefaultIfEmpty() + select new {employee.FirstName, employee.LastName, Order = invoiceJoin}; + + QueryDumper.Dump(query); + } + + [Category("JOIN")] + [Test(Description = "GroupJoin - Projected let assignment")] + [Description("This sample projects a 'let' expression resulting from a join.")] + public void DLinqJoin8() + { + var q = + from c in Session.Query.All() + join i in Session.Query.All() on c.CustomerId equals i.Customer.CustomerId into invoices + let z = c.Address.City + c.Address.Country + from i in invoices + select new {c.LastName, i.InvoiceId, z}; + + QueryDumper.Dump(q); + } + + [Ignore("Too slow")] + [Category("JOIN")] + [Test(Description = "GroupJoin - Composite Key")] + [Description("This sample shows a join with a composite key.")] + public void DLinqJoin9() + { + var q = + from i in Session.Query.All() + from t in Session.Query.All() + join il in Session.Query.All() + on new {InvoiceId = i.InvoiceId, TrackId = t.TrackId} equals new {InvoiceId = il.Invoice.InvoiceId, TrackId = il.Track.TrackId} + into details + from d in details + select new {InvoiceId = i.InvoiceId, ProductId = t.TrackId, d.UnitPrice}; + + QueryDumper.Dump(q); + } + + [Category("JOIN")] + [Test(Description = "GroupJoin - Nullable\\Nonnullable Key Relationship")] + [Description("This sample shows how to construct a join where one side is nullable and the other isn't.")] + public void DLinqJoin10() + { + var q = + from i in Session.Query.All() + join e in Session.Query.All() + on i.DesignatedEmployee.EmployeeId equals (int?) e.EmployeeId into emps + from e in emps + select new {i.InvoiceId, e.FirstName}; + + QueryDumper.Dump(q); + } + + [Category("ORDER BY")] + [Test(Description = "OrderBy - Simple")] + [Description("This sample uses orderby to sort Employees " + + "by hire date.")] + public void DLinq36() + { + var q = + from e in Session.Query.All() + orderby e.HireDate + select e; + + QueryDumper.Dump(q); + } + + [Category("ORDER BY")] + [Test(Description = "OrderBy - With Where")] + [Description("This sample uses where and orderby to sort Orders " + + "billed to London by Commission.")] + public void DLinq37() + { + var q = + from i in Session.Query.All() + where i.BillingAddress.City=="London" + orderby i.Commission + select i; + + QueryDumper.Dump(q); + } + + [Category("ORDER BY")] + [Test(Description = "OrderByDescending")] + [Description("This sample uses orderby to sort Tracks " + + "by unit price from highest to lowest.")] + public void DLinq38() + { + var q = + from t in Session.Query.All() + orderby t.UnitPrice descending + select t; + + QueryDumper.Dump(q); + } + + [Category("ORDER BY")] + [Test(Description = "ThenBy")] + [Description("This sample uses a compound orderby to sort Customers " + + "by city and then last name.")] + public void DLinq39() + { + var q = + from c in Session.Query.All() + orderby c.Address.City , c.LastName + select c; + + QueryDumper.Dump(q); + } + + [Category("ORDER BY")] + [Test(Description = "ThenByDescending")] + [Description("This sample uses orderby to sort Invoices from Id 1 " + + "by billing country, and then by Commission from highest to lowest.")] + public void DLinq40() + { + var q = + from i in Session.Query.All() + where i.InvoiceId==1 + orderby i.BillingAddress.Country , i.Commission descending + select i; + + QueryDumper.Dump(q); + } + + + [Category("ORDER BY")] + [Test(Description = "OrderBy - Group By")] + [Description("This sample uses Orderby, Max and Group By to find the Tracks that have " + + "the highest unit price in each category, and sorts the group by category id.")] + public void DLinq41() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var categories = + Session.Query.All() + .GroupBy(t => t.TrackId) + .OrderBy(g => g.Key) + .Select(g => new { + g.Key, + MostExpensiveTrack = + g.Where(t2 => t2.UnitPrice==g.Max(t3 => t3.UnitPrice)) + }); + + QueryDumper.Dump(categories); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Simple")] + [Description("This sample uses group by to partition Tracks by " + + "Id.")] + public void DLinq42() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select g; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Max")] + [Description("This sample uses group by and Max " + + "to find the maximum unit price for each Id.")] + public void DLinq43() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + MaxPrice = g.Max(t => t.UnitPrice) + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Min")] + [Description("This sample uses group by and Min " + + "to find the minimum unit price for each Id.")] + public void DLinq44() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + MinPrice = g.Min(t => t.UnitPrice) + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Average")] + [Description("This sample uses group by and Average " + + "to find the average UnitPrice for each Id.")] + public void DLinq45() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + AveragePrice = g.Average(t => t.UnitPrice) + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Sum")] + [Description("This sample uses group by and Sum " + + "to find the total UnitPrice for each Id.")] + public void DLinq46() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + TotalPrice = g.Sum(t => t.UnitPrice) + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Count")] + [Description("This sample uses group by and Count " + + "to find the number of Tracks in each Id.")] + public void DLinq47() + { + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + NumTracks = g.Count() + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Count - Conditional")] + [Description("This sample uses group by and Count " + + "to find the number of Track in each Id " + + "that are VideoTracks.")] + public void DLinq48() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + select new { + g.Key, + NumTracks = g.Count(t => (t is VideoTrack)) + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - followed by Where")] + [Description("This sample uses a where clause after a group by clause " + + "to find all categories that have at least 10 track.")] + public void DLinq49() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var q = + from t in Session.Query.All() + group t by t.TrackId + into g + where g.Count() >= 10 + select new { + g.Key, + TrackCount = g.Count() + }; + + QueryDumper.Dump(q); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Multiple Columns")] + [Description("This sample uses Group By to group tracks by TrackId and MediaTypeId.")] + public void DLinq50() + { + var categories = + from t in Session.Query.All() + group t by new {t.TrackId, SupplierId = t.MediaType.MediaTypeId} + into g + select new {g.Key, g}; + + QueryDumper.Dump(categories); + } + + [Category("GROUP BY/HAVING")] + [Test(Description = "GroupBy - Expression")] + [Description("This sample uses Group By to return two sequences of tracks. " + + "The first sequence contains tracks with unit price " + + "greater than 10. The second sequence contains tracks " + + "with unit price less than or equal to 10.")] + public void DLinq51() + { + var categories = + from t in Session.Query.All() + group t by new {Criterion = t.UnitPrice > 10} + into g + select g; + + QueryDumper.Dump(categories); + } + + [Category("EXISTS/IN/ANY/ALL")] + [Test(Description = "Any - Simple")] + [Description("This sample uses Any to return only Customers that have no Invoices.")] + public void DLinq52() + { + var q = + from c in Session.Query.All() + where !c.Invoices.Any() + select c; + + QueryDumper.Dump(q); + } + + [Category("EXISTS/IN/ANY/ALL")] + [Test(Description = "Any - Conditional")] + [Description("This sample uses Any to return only Playlists that have " + + "at least one VideoTrack.")] + public void DLinq53() + { + var q = + from p in Session.Query.All() + where p.Tracks.Any(t => (t is VideoTrack)) + select p; + + QueryDumper.Dump(q); + } + + [Category("EXISTS/IN/ANY/ALL")] + [Test(Description = "All - Conditional")] + [Description("This sample uses All to return Customers whom all of their orders " + + "have been shipped to their own city or whom have no orders.")] + public void DLinq54() + { + var q = + from c in Session.Query.All() + where c.Invoices.All(i => i.BillingAddress.City==c.Address.City) + select c; + + QueryDumper.Dump(q); + } + + [Category("UNION ALL/UNION/INTERSECT")] + [Test(Description = "Concat - Simple")] + [Description("This sample uses Concat to return a sequence of all Customer and Employee " + + "phone/fax numbers.")] + public void DLinq55() + { + var q = ( + from c in Session.Query.All() + select c.Phone + ).Concat( + from c in Session.Query.All() + select c.Fax + ).Concat( + from e in Session.Query.All() + select e.Phone + ); + + QueryDumper.Dump(q); + } + + [Category("UNION ALL/UNION/INTERSECT")] + [Test(Description = "Concat - Compound")] + [Description("This sample uses Concat to return a sequence of all Customer and Employee " + + "name and phone number mappings.")] + public void DLinq56() + { + var q = ( + from c in Session.Query.All() + select new {Name = c.CompanyName, c.Phone} + ).Concat( + from e in Session.Query.All() + select new {Name = e.FirstName + " " + e.LastName, Phone = e.Phone} + ); + + QueryDumper.Dump(q); + } + + [Category("UNION ALL/UNION/INTERSECT")] + [Test(Description = "Union")] + [Description("This sample uses Union to return a sequence of all countries that either " + + "Customers or Employees are in.")] + public void DLinq57() + { + var q = ( + from c in Session.Query.All() + select c.Address.Country + ).Union( + from e in Session.Query.All() + select e.Address.Country + ); + + QueryDumper.Dump(q); + } + + [Category("UNION ALL/UNION/INTERSECT")] + [Test(Description = "Intersect")] + [Description("This sample uses Intersect to return a sequence of all countries that both " + + "Customers and Employees live in.")] + public void DLinq58() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var q = ( + from c in Session.Query.All() + select c.Address.Country + ).Intersect( + from e in Session.Query.All() + select e.Address.Country + ); + + QueryDumper.Dump(q); + } + + [Category("UNION ALL/UNION/INTERSECT")] + [Test(Description = "Except")] + [Description("This sample uses Except to return a sequence of all countries that " + + "Customers live in but no Employees live in.")] + public void DLinq59() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var q = ( + from c in Session.Query.All() + select c.Address.Country + ).Except( + from e in Session.Query.All() + select e.Address.Country + ); + + QueryDumper.Dump(q); + } + + [Category("TOP/BOTTOM")] + [Test(Description = "Take")] + [Description("This sample uses Take to select the first 5 Employees hired.")] + public void DLinq60() + { + var q = ( + from e in Session.Query.All() + orderby e.HireDate + select e) + .Take(5); + + QueryDumper.Dump(q); + } + + [Category("TOP/BOTTOM")] + [Test(Description = "Skip")] + [Description("This sample uses Skip to select all but the 10 most expensive Tracks.")] + public void DLinq61() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var q = ( + from t in Session.Query.All() + orderby t.UnitPrice descending + select t) + .Skip(10); + + QueryDumper.Dump(q); + } + + [Category("Paging")] + [Test(Description = "Paging - Index")] + [Description("This sample uses the Skip and Take operators to do paging by " + + "skipping the first 50 records and then returning the next 10, thereby " + + "providing the data for page 6 of the Customers table.")] + public void DLinq62() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var q = ( + from c in Session.Query.All() + orderby c.LastName + select c) + .Skip(50) + .Take(10); + + QueryDumper.Dump(q); + } + + [Category("Paging")] + [Test(Description = "Paging - Ordered Unique Key")] + [Description("This sample uses a where clause and the Take operator to do paging by, " + + "first filtering to get only the Ids above 50 (the last Id " + + "from page 5), then ordering by Id, and finally taking the first 10 results, " + + "thereby providing the data for page 6 of the Tracks table. " + + "Note that this method only works when ordering by a unique key.")] + public void DLinq63() + { + var q = ( + from t in Session.Query.All() + where t.TrackId > 50 + orderby t.TrackId + select t) + .Take(10); + + QueryDumper.Dump(q); + } + + + [Category("NULL")] + [Test(Description = "null")] + [Description("This sample uses the null value to find Employees " + + "that do not report to another Employee.")] + public void DLinq75() + { + var q = + from e in Session.Query.All() + where e.ReportsToManager==null + select e; + + QueryDumper.Dump(q); + } + + [Category("NULL")] + [Test(Description = "Nullable.HasValue")] + [Description("This sample uses Nullable.HasValue to find Employees " + + "that do not report to another Employee.")] + public void DLinq76() + { + var q = + from e in Session.Query.All() + where !e.BirthDate.HasValue + select e; + + QueryDumper.Dump(q); + } + + [Category("NULL")] + [Test(Description = "Nullable.Value")] + [Description("This sample uses Nullable.Value for Employees " + + "that report to another Employee to return the " + + "Id number of that employee. Note that " + + "the .Value is optional.")] + public void DLinq77() + { + var q = + from e in Session.Query.All() + where e.BirthDate.HasValue + select new {e.FirstName, e.LastName, BirthDate = e.BirthDate.Value}; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String Concatenation")] + [Description("This sample uses the + operator to concatenate string fields " + + "and string literals in forming the Customers' calculated " + + "Location value.")] + public void DLinq78() + { + var q = + from c in Session.Query.All() + select new {c.CustomerId, Location = c.Address.City + ", " + c.Address.Country}; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Length")] + [Description("This sample uses the Length property to find all Tracks whose " + + "name is shorter than 10 characters.")] + public void DLinq79() + { + var q = + from t in Session.Query.All() + where t.Name.Length < 10 + select t; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Contains(substring)")] + [Description("This sample uses the Contains method to find all Customers whose " + + "contact name contains 'Anders'.")] + public void DLinq80() + { + var q = + from c in Session.Query.All() + where c.LastName.Contains("Anders") + select c; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.IndexOf(substring)")] + [Description("This sample uses the IndexOf method to find the first instance of " + + " '@' in each Customer's e-mail.")] + public void DLinq81() + { + var q = + from c in Session.Query.All() + select new {c.Email, AtPos = c.Email.IndexOf("@")}; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.StartsWith(prefix)")] + [Description("This sample uses the StartsWith method to find Customers whose " + + "first name starts with 'Maria'.")] + public void DLinq82() + { + var q = + from c in Session.Query.All() + where c.FirstName.StartsWith("Maria") + select c; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.EndsWith(suffix)")] + [Description("This sample uses the StartsWith method to find Customers whose " + + "last name ends with 'Anders'.")] + public void DLinq83() + { + var q = + from c in Session.Query.All() + where c.LastName.EndsWith("Anders") + select c; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Substring(start)")] + [Description("This sample uses the Substring method to return track names starting " + + "from the third letter.")] + public void DLinq84() + { + var q = + from t in Session.Query.All() + select t.Name.Substring(2); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Substring(start, length)")] + [Description("This sample uses the Substring method to find Employees whose " + + "home phone numbers have '555' as the seventh through ninth digits.")] + public void DLinq85() + { + var q = + from e in Session.Query.All() + where e.Phone.Substring(6, 3)=="555" + select e; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.ToUpper()")] + [Description("This sample uses the ToUpper method to return Employee names " + + "where the last name has been converted to uppercase.")] + public void DLinq86() + { + var q = + from e in Session.Query.All() + select new {LastName = e.LastName.ToUpper(), e.FirstName}; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.ToLower()")] + [Description("This sample uses the ToLower method to return MediaType names " + + "that have been converted to lowercase.")] + public void DLinq87() + { + var q = + from c in Session.Query.All() + select c.Name.ToLower(); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Trim()")] + [Description("This sample uses the Trim method to return the first five " + + "digits of Employee home phone numbers, with leading and " + + "trailing spaces removed.")] + public void DLinq88() + { + var q = + from e in Session.Query.All() + select e.Phone.Substring(0, 5).Trim(); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Insert(pos, str)")] + [Description("This sample uses the Insert method to return a sequence of " + + "employee phone numbers that have a ) in the fifth position, " + + "inserting a : after the ).")] + public void DLinq89() + { + var q = + from e in Session.Query.All() + where e.Phone.Substring(4, 1)==")" + select e.Phone.Insert(5, ":"); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Remove(start)")] + [Description("This sample uses the Insert method to return a sequence of " + + "employee phone numbers that have a ) in the fifth position, " + + "removing all characters starting from the tenth character.")] + public void DLinq90() + { + var q = + from e in Session.Query.All() + where e.Phone.Substring(4, 1)==")" + select e.Phone.Remove(9); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Remove(start, length)")] + [Description("This sample uses the Insert method to return a sequence of " + + "employee phone numbers that have a ) in the fifth position, " + + "removing the first six characters.")] + public void DLinq91() + { + var q = + from e in Session.Query.All() + where e.Phone.Substring(4, 1)==")" + select e.Phone.Remove(0, 6); + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "String.Replace(find, replace)")] + [Description("This sample uses the Replace method to return a sequence of " + + "Supplier information where the Country field has had " + + "UK replaced with United Kingdom and USA replaced with " + + "United States of America.")] + public void DLinq92() + { + var q = + from s in Session.Query.All() + select new { + s.CompanyName, + Country = s.Address.Country.Replace("UK", "United Kingdom") + .Replace("USA", "United States of America") + }; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "DateTime.Year")] + [Description("This sample uses the DateTime's Year property to " + + "find Orders placed in 2005.")] + public void DLinq93() + { + var q = + from i in Session.Query.All() + where i.InvoiceDate.Year==2005 + select i; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "DateTime.Month")] + [Description("This sample uses the DateTime's Month property to " + + "find Invoices placed in December.")] + public void DLinq94() + { + var q = + from i in Session.Query.All() + where i.InvoiceDate.Month==12 + select i; + + QueryDumper.Dump(q); + } + + [Category("String/Date Functions")] + [Test(Description = "DateTime.Day")] + [Description("This sample uses the DateTime's Day property to " + + "find Invoices placed on the 31st day of the month.")] + public void DLinq95() + { + var q = + from i in Session.Query.All() + where i.InvoiceDate.Day==31 + select i; + + QueryDumper.Dump(q); + } + + [Category("Object Identity")] + [Test(Description = "Object Caching - 1")] + [Description("This sample demonstrates how, upon executing the same query twice, " + + "you will receive a reference to the same object in memory each time.")] + public void DLinq96() + { + Customer cust1 = Session.Query.All().First(c => c.CustomerId==4200); + Customer cust2 = Session.Query.All().First(c => c.CustomerId==4200); + + Console.WriteLine("cust1 and cust2 refer to the same object in memory: {0}", + Object.ReferenceEquals(cust1, cust2)); + } + + [Category("Object Identity")] + [Test(Description = "Object Caching - 2")] + [Description("This sample demonstrates how, upon executing different queries that " + + "return the same row from the database, you will receive a " + + "reference to the same object in memory each time.")] + public void DLinq97() + { + Customer cust1 = Session.Query.All().First(c => c.CustomerId==4200); + Customer cust2 = ( + from i in Session.Query.All() + where i.Customer.CustomerId==4200 + select i) + .First() + .Customer; + + Console.WriteLine("cust1 and cust2 refer to the same object in memory: {0}", + Object.ReferenceEquals(cust1, cust2)); + } + + [Category("Object Loading")] + [Test(Description = "Deferred Loading - 1")] + [Description("This sample demonstrates how navigating through relationships in " + + "retrieved objects can end up triggering new queries to the database " + + "if the data was not requested by the original query.")] + public void DLinq98() + { + var custs = + from c in Session.Query.All() + where c.Address.City=="Sao Paulo" + select c; + + foreach (var cust in custs) { + foreach (var inv in cust.Invoices) { + Console.WriteLine("Id {0} has an InvoiceID {1}.", cust.CustomerId, inv.InvoiceId); + } + } + } + + private bool isValidTrack(Track t) + { + return t.Name.LastIndexOf('C')==0; + } + + [Category("Object Loading")] + [Test(Description = "Deferred Loading - (1:M)")] + [Description("This sample demonstrates how navigating through relationships in " + + "retrieved objects can result in triggering new queries to the database " + + "if the data was not requested by the original query.")] + public void DLinq102() + { + var emps = from e in Session.Query.All() + select e; + + foreach (var emp in emps) { + foreach (var inv in emp.Invoices) { + Console.WriteLine("Employee {0} is responsible for invoice #{1}.", emp.FirstName, inv.InvoiceId); + } + } + } + + //[Category("Object Loading")] + //[Test(Description = "Including - Eager Loading - (1:M)")] + //[Description("This sample demonstrates how to use Including to request related " + + // "data during the original query so that additional roundtrips to the " + + // "database are not triggered while navigating through " + + // "the retrieved objects.")] + //public void DLinq103() { + // var emps = ( + // from e in Session.Query.All() + // select e) + // .Including(e => e.Employees); + + // foreach (var emp in emps) + // { + // foreach (var man in emp.Employees) + // { + // Console.WriteLine("Employee {0} reported to Manager {1}.", emp.FirstName, man.FirstName); + // } + // } + //} + + + [Category("Object Loading")] + [Test(Description = "Deferred Loading - (BLOB)")] + [Description("This sample demonstrates how navigating through Link in " + + "retrieved objects can end up triggering new queries to the database " + + "if the data type is Link.")] + public void DLinq104() + { + var emps = from c in Session.Query.All() + select c; + + foreach (Employee emp in emps) { + Console.WriteLine("{0}", emp.LastName); + } + } + + [Category("Conversion Operators")] + [Test(Description = "AsEnumerable")] + [Description("This sample uses AsEnumerable so that the client-side IEnumerable " + + "implementation of Where is used, instead of the default IQueryable " + + "implementation which would be converted to SQL and executed " + + "on the server. This is necessary because the where clause " + + "references a user-defined client-side method, isValidProduct, " + + "which cannot be converted to SQL.")] +// [LinkedMethod("isValidProduct")] + public void DLinq105() + { + var q = + from t in Session.Query.All().ToList() + where isValidTrack(t) + select t; + + QueryDumper.Dump(q); + } + + [Category("Conversion Operators")] + [Test(Description = "ToArray")] + [Description("This sample uses ToArray to immediately evaluate a query into an array " + + "and get the 2nd element.")] + public void DLinq106() + { + var q = + from c in Session.Query.All() + where c.Address.City=="London" + select c; + + Customer[] qArray = q.ToArray(); + QueryDumper.Dump(qArray[1]); + } + + [Category("Conversion Operators")] + [Test(Description = "ToList")] + [Description("This sample uses ToList to immediately evaluate a query into a List.")] + public void DLinq107() + { + var q = + from e in Session.Query.All() + where e.HireDate >= new DateTime(1994, 1, 1) + select e; + + List qList = q.ToList(); + QueryDumper.Dump(qList); + } + + [Category("Conversion Operators")] + [Test(Description = "ToDictionary")] + [Description("This sample uses ToDictionary to immediately evaluate a query and " + + "a key expression into an Dictionary.")] + public void DLinq108() + { + var q = + from p in Session.Query.All() + where p.UnitPrice <= 10 && !(p is VideoTrack) + select p; + + Dictionary qDictionary = q.ToDictionary(t => t.TrackId); + + foreach (int key in qDictionary.Keys) { + Console.WriteLine("Key {0}:", key); + QueryDumper.Dump(qDictionary[key]); + Console.WriteLine(); + } + } + +// +// [Category("Stored Procedures")] +// [Test(Description = "Scalar Return")] +// [Description("This sample uses a stored procedure to return the number of Customers in the 'WA' Region.")] +// public void DLinq113() { +// int count = Query.CustomersCountByRegion("WA"); +// +// Console.WriteLine(count); +// } +// +// [Category("Stored Procedures")] +// [Test(Description = "Single CompilationResult-Set")] +// [Description("This sample uses a stored procedure to return the Id, ContactName, CompanyName" + +// " and City of customers who are in London.")] +// public void DLinq114() { +// IEnumerable result = Session.Query.All()ByCity("London"); +// +// QueryDumper.Dump(result); +// } +// +// [Category("Stored Procedures")] +// [Test(Description = "Single CompilationResult-Set - Multiple Possible Shapes")] +// [Description("This sample uses a stored procedure to return a set of " + +// "Customers in the 'WA' Region. The result set-shape returned depends on the parameter passed in. " + +// "If the parameter equals 1, all Customer properties are returned. " + +// "If the parameter equals 2, the Id, ContactName and CompanyName properties are returned.")] +// public void DLinq115() { +// Console.WriteLine("********** Whole Customer CompilationResult-set ***********"); +// IMultipleResults result = db.WholeOrPartialCustomersSet(1); +// IEnumerable shape1 = result.GetResult(); +// +// QueryDumper.Dump(shape1); +// +// Console.WriteLine(); +// Console.WriteLine("********** Partial Customer CompilationResult-set ***********"); +// result = db.WholeOrPartialCustomersSet(2); +// IEnumerable shape2 = result.GetResult(); +// +// QueryDumper.Dump(shape2); +// } +// +// [Category("Stored Procedures")] +// [Test(Description = "Multiple CompilationResult-Sets")] +// [Description("This sample uses a stored procedure to return the Customer 'SEVES' and all it's Orders.")] +// public void DLinq116() { +// IMultipleResults result = db.GetCustomerAndOrders("SEVES"); +// +// Console.WriteLine("********** Customer CompilationResult-set ***********"); +// IEnumerable customer = result.GetResult(); +// QueryDumper.Dump(customer); +// Console.WriteLine(); +// +// Console.WriteLine("********** Orders CompilationResult-set ***********"); +// IEnumerable orders = result.GetResult(); +// QueryDumper.Dump(orders); +// } +// +// [Category("Stored Procedures")] +// [Test(Description = "Out parameters")] +// [Description("This sample uses a stored procedure that returns an out parameter.")] +// public void DLinq143() { +// decimal? totalSales = 0; +// string Id = "ALFKI"; +// +// // Out parameters are passed by ref, to support scenarios where +// // the parameter is 'in/out'. In this case, the parameter is only +// // 'out'. +// db.CustomerTotalSales(Id, ref totalSales); +// +// Console.WriteLine("Total Sales for Customer '{0}' = {1:C}", Id, totalSales); +// } +// +// +// [Category("User-Defined Functions")] +// [Test(Description = "Scalar Function - Select")] +// [Description("This sample demonstrates using a scalar user-defined function in a projection.")] +// public void DLinq117() { +// var q = from c in db.Categories +// select new {c.Id, TotalUnitPrice = db.TotalProductUnitPriceByCategory(c.Id)}; +// +// QueryDumper.Dump(q); +// } +// +// [Category("User-Defined Functions")] +// [Test(Description = "Scalar Function - Where")] +// [Description("This sample demonstrates using a scalar user-defined function in a where clause.")] +// public void DLinq118() { +// var q = from p in Session.Query.All() +// where p.UnitPrice == db.MinUnitPriceByCategory(p.Id) +// select p; +// +// QueryDumper.Dump(q); +// } +// +// [Category("User-Defined Functions")] +// [Test(Description = "Table-Valued Function")] +// [Description("This sample demonstrates selecting from a table-valued user-defined function.")] +// public void DLinq119() { +// var q = from p in Session.Query.All()UnderThisUnitPrice(10.25M) +// where !(p is DiscontinuedProduct) +// select p; +// +// QueryDumper.Dump(q); +// } +// +// [Category("User-Defined Functions")] +// [Test(Description = "Table-Valued Function - Join")] +// [Description("This sample demonstrates joining to the results of a table-valued user-defined function.")] +// public void DLinq151() { +// var q = from c in db.Categories +// join p in Session.Query.All()UnderThisUnitPrice(8.50M) on c.Id equals p.Id into prods +// from p in prods +// select new {c.Id, c.CategoryName, p.ProductName, p.UnitPrice}; +// +// QueryDumper.Dump(q); +// } + + + [Category("Advanced")] + [Test(Description = "Nested in FROM")] + [Description("This sample uses orderbyDescending and Take to return the " + + "video tracks of the top 10 most expensive tracks.")] + public void DLinq131() + { + var tracks = from t in Session.Query.All().OrderByDescending(t => t.UnitPrice).Take(10) + where t is VideoTrack + select t; + + QueryDumper.Dump(tracks); + } + + [Category("Inheritance")] + [Test(Description = "Simple")] + [Description("This sample returns all contacts where the city is London.")] + public void DLinq135() + { + var cons = from c in Session.Query.All() + select c; + Assert.Throws(() => { + foreach (var con in cons) { + Console.WriteLine("Company name: {0}", con.CompanyName); + Console.WriteLine("Phone: {0}", con.Phone); + Console.WriteLine("This is a {0}", con.GetType()); + Console.WriteLine(); + } + }); + } + + [Category("Inheritance")] + [Test(Description = "OfType")] + [Description("This sample uses OfType to return all customer contacts.")] + public void DLinq136() + { + var cons = from c in Session.Query.All().OfType() + select c; + + Assert.Throws(() => QueryDumper.Dump(cons)) ; + } + + [Category("Inheritance")] + [Test(Description = "IS")] + [Description("This sample uses IS to return all Customers.")] + public void DLinq137() + { + var cons = from c in Session.Query.All() + where c is Customer + select c; + + Assert.Throws(() => QueryDumper.Dump(cons)); + } + + [Category("Inheritance")] + [Test(Description = "AS")] + [Description("This sample uses AS to return FullContact or null.")] + public void DLinq138() + { + var cons = from c in Session.Query.All() + select c as BusinessContact; + + Assert.Throws(() => QueryDumper.Dump(cons)); + } + + [Category("Inheritance")] + [Test(Description = "Cast")] + [Description("This sample uses a cast to retrieve customer contacts who work in 'Around the Horn'.")] + public void DLinq139() + { + var cons = from c in Session.Query.All() + where c is Customer && ((Customer) c).CompanyName=="Around the Horn" + select c; + + Assert.Throws(() => QueryDumper.Dump(cons)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/NestedCollectionsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/NestedCollectionsTest.cs index 88468f3d04..47ce1f1853 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/NestedCollectionsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/NestedCollectionsTest.cs @@ -1,357 +1,357 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.16 - -using System.Collections; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - [Category("Linq")] - public class NestedCollectionsTest : ChinookDOModelTest - { - private int numberOfCustomers; - private int numberOfInvoices; - private int numberOfEmployees; - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - numberOfCustomers = session.Query.All().Count(); - numberOfInvoices = session.Query.All().Count(); - numberOfEmployees = session.Query.All().Count(); - t.Complete(); - } - } - - [Test] - public void SubqueryTest() - { - var result = - from c in Session.Query.All() - select new { - Customer = c, - Invoices = c.Invoices - .Select(i => new {Invoice = i, InvoiceLines = i.InvoiceLines}) - }; - - Assert.That(result, Is.Not.Empty); - foreach (var a in result) - foreach (var b in a.Invoices) - foreach (var il in b.InvoiceLines) { - } - } - - [Test] - public void SubqueryWithThisTest() - { - var customer = Session.Query.All().First(); - var invoices = customer.Invoices; - Assert.That(invoices, Is.Not.Empty); - QueryDumper.Dump(invoices); - var firstInvoice = customer.FirstInvoice; - Assert.That(firstInvoice, Is.Not.Null); - } - - [Test] - public void SelectOtherParameterTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All().Take(5).Select(c => Session.Query.All().Select(i => c.Invoices.Count())); - Assert.That(result.ToList(), Is.Not.Empty); - } - - [Test] - public void SelectNestedTest() - { - var result = Session.Query.All() - .Select(c => Session.Query.All()) - .Select(qi => qi); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfCustomers * numberOfInvoices, Count(result)); - } - - [Test] - public void SelectDoubleNestedTest() - { - var result = Session.Query.All() - .Take(2) - .Select(c => Session.Query.All() - .Take(2) - .Select(i => Session.Query.All().Take(2))) - .Select(qqe => qqe); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void ComplexSubqueryTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .Take(2) - .Select(c => Session.Query.All() - .Select(i => Session.Query.All() - .Take(2) - .Where(e => e.Invoices.Contains(i))) - .Where(i => i.Count() > 0)) - .Select(qqe => qqe); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectNestedWithCorrelationTest() - { - var result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c)) - .Select(qi => qi); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, Count(result)); - } - - [Test] - public void SelectNestedWithAggregateTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c).Count()); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectAnonymousTest() - { - var result = Session.Query.All() - .Take(10) - .Select(c => new {Invoices = Session.Query.All().Take(10)}); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryAsQuerySourceTest() - { - var result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c)); - Assert.That(result, Is.Not.Empty); - foreach (var invoices in result) { - var subQueryCount = invoices.Count(); - } - } - - [Test] - public void SelectTwoCollectionsTest() - { - var result = Session.Query.All() - .Select(i => new { - Customers = Session.Query.All().Where(c => c==i.Customer), - Employees = Session.Query.All().Where(e => e==i.DesignatedEmployee) - }) - .Select(os => os); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, list.Count); - foreach (var i in list) { - Assert.AreEqual(1, i.Customers.Count()); - Assert.AreEqual(1, i.Employees.Count()); - Assert.AreEqual(1, i.Customers.ToList().Count); - Assert.AreEqual(1, i.Employees.ToList().Count); - } - } - - [Test] - public void SelectNestedSelectManyTest() - { - var result = Session.Query.All() - .Select(c => Session.Query.All()) - .SelectMany(i => i); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfCustomers * numberOfInvoices, Count(result)); - } - - [Test] - public void SelectDoubleNestedSelectManyTest() - { - var result = Session.Query.All() - .Take(10) - .Select(c => Session.Query.All() - .Take(10) - .Select(i => Session.Query.All())) - .SelectMany(i => i) - .SelectMany(i => i); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectNestedWithCorrelationSelectManyTest() - { - var result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c)) - .SelectMany(i => i); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, Count(result)); - } - - [Test] - public void SelectNestedWithCorrelationSelectMany2Test() - { - var result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c)) - .SelectMany(i => i.Select(x => x)); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, Count(result)); - } - - [Test] - public void SelectAnonymousSelectMany1Test() - { - var result = Session.Query.All() - .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) - .SelectMany(i => i.Invoices); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, result.ToList().Count); - } - - [Test] - public void SelectAnonymousSelectMany2Test() - { - var result = Session.Query.All() - .Select(c => new {Invoices = Session.Query.All().Take(10)}) - .SelectMany(i => i.Invoices); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectAnonymousSubqueryTest() - { - var result = Session.Query.All() - .Select(c => new {Customer = c, Invoices = Session.Query.All()}) - .Select(i => i.Customer.Invoices); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectAnonymousSelectMany3Test() - { - IQueryable result = Session.Query.All() - .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) - .SelectMany(a => a.Invoices.Select(i => a.Customer)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectAnonymousSelectMany4Test() - { - var result = Session.Query.All() - .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) - .SelectMany(a => a.Invoices.Select(i => new {a.Customer, Invoice = i})); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(numberOfInvoices, result.ToList().Count); - } - - [Test] - public void SelectAnonymousSelectMany5Test() - { - var result = Session.Query.All() - .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) - .SelectMany(a => a.Invoices.Select(i => a.Customer.FirstName)); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SubquerySimpleTest() - { - var result = Session.Query.All() - .Select(t => Session.Query.All()); - Assert.That(result, Is.Not.Empty); - foreach (IQueryable queryable in result) { - QueryDumper.Dump(queryable); - } - } - - [Test] - public void SubqueryWhereTest() - { - var result = Session.Query.All() - .Select(t => Session.Query.All().Where(m => m==t.MediaType)); - Assert.That(result, Is.Not.Empty); - foreach (IQueryable queryable in result) { - QueryDumper.Dump(queryable); - } - } - - [Test] - public void SubqueryParametrizedFieldTest() - { - var result = Session.Query.All() - .Select(t => Session.Query.All().Select(m => t.UnitPrice)); - Assert.That(result, Is.Not.Empty); - foreach (var queryable in result) { - QueryDumper.Dump(queryable); - } - } - - [Test] - public void SubqueryWithSelectTest() - { - var result = Session.Query.All() - .Select(t => Session.Query.All().Where(m => m==t.MediaType)) - .Select(m => m); - Assert.That(result, Is.Not.Empty); - foreach (IQueryable queryable in result) { - QueryDumper.Dump(queryable); - } - } - - [Test] - public void SubqueryScalarTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .Select(t => Session.Query.All().Count()); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SubqueryWhereEntitySetTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .Where(p => p.Tracks.Count > 0); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - private static int Count(IEnumerable result) - { - var count = 0; - bool? nested = null; - foreach (var item in result) { - if (nested==null) - nested = item is IEnumerable; - if (nested.Value) - count += Count((IEnumerable) item); - else - count++; - } - return count; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.16 + +using System.Collections; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + [Category("Linq")] + public class NestedCollectionsTest : ChinookDOModelTest + { + private int numberOfCustomers; + private int numberOfInvoices; + private int numberOfEmployees; + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + numberOfCustomers = session.Query.All().Count(); + numberOfInvoices = session.Query.All().Count(); + numberOfEmployees = session.Query.All().Count(); + t.Complete(); + } + } + + [Test] + public void SubqueryTest() + { + var result = + from c in Session.Query.All() + select new { + Customer = c, + Invoices = c.Invoices + .Select(i => new {Invoice = i, InvoiceLines = i.InvoiceLines}) + }; + + Assert.That(result, Is.Not.Empty); + foreach (var a in result) + foreach (var b in a.Invoices) + foreach (var il in b.InvoiceLines) { + } + } + + [Test] + public void SubqueryWithThisTest() + { + var customer = Session.Query.All().First(); + var invoices = customer.Invoices; + Assert.That(invoices, Is.Not.Empty); + QueryDumper.Dump(invoices); + var firstInvoice = customer.FirstInvoice; + Assert.That(firstInvoice, Is.Not.Null); + } + + [Test] + public void SelectOtherParameterTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All().Take(5).Select(c => Session.Query.All().Select(i => c.Invoices.Count())); + Assert.That(result.ToList(), Is.Not.Empty); + } + + [Test] + public void SelectNestedTest() + { + var result = Session.Query.All() + .Select(c => Session.Query.All()) + .Select(qi => qi); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfCustomers * numberOfInvoices, Count(result)); + } + + [Test] + public void SelectDoubleNestedTest() + { + var result = Session.Query.All() + .Take(2) + .Select(c => Session.Query.All() + .Take(2) + .Select(i => Session.Query.All().Take(2))) + .Select(qqe => qqe); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void ComplexSubqueryTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .Take(2) + .Select(c => Session.Query.All() + .Select(i => Session.Query.All() + .Take(2) + .Where(e => e.Invoices.Contains(i))) + .Where(i => i.Count() > 0)) + .Select(qqe => qqe); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectNestedWithCorrelationTest() + { + var result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c)) + .Select(qi => qi); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, Count(result)); + } + + [Test] + public void SelectNestedWithAggregateTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c).Count()); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectAnonymousTest() + { + var result = Session.Query.All() + .Take(10) + .Select(c => new {Invoices = Session.Query.All().Take(10)}); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryAsQuerySourceTest() + { + var result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c)); + Assert.That(result, Is.Not.Empty); + foreach (var invoices in result) { + var subQueryCount = invoices.Count(); + } + } + + [Test] + public void SelectTwoCollectionsTest() + { + var result = Session.Query.All() + .Select(i => new { + Customers = Session.Query.All().Where(c => c==i.Customer), + Employees = Session.Query.All().Where(e => e==i.DesignatedEmployee) + }) + .Select(os => os); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, list.Count); + foreach (var i in list) { + Assert.AreEqual(1, i.Customers.Count()); + Assert.AreEqual(1, i.Employees.Count()); + Assert.AreEqual(1, i.Customers.ToList().Count); + Assert.AreEqual(1, i.Employees.ToList().Count); + } + } + + [Test] + public void SelectNestedSelectManyTest() + { + var result = Session.Query.All() + .Select(c => Session.Query.All()) + .SelectMany(i => i); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfCustomers * numberOfInvoices, Count(result)); + } + + [Test] + public void SelectDoubleNestedSelectManyTest() + { + var result = Session.Query.All() + .Take(10) + .Select(c => Session.Query.All() + .Take(10) + .Select(i => Session.Query.All())) + .SelectMany(i => i) + .SelectMany(i => i); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectNestedWithCorrelationSelectManyTest() + { + var result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c)) + .SelectMany(i => i); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, Count(result)); + } + + [Test] + public void SelectNestedWithCorrelationSelectMany2Test() + { + var result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c)) + .SelectMany(i => i.Select(x => x)); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, Count(result)); + } + + [Test] + public void SelectAnonymousSelectMany1Test() + { + var result = Session.Query.All() + .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) + .SelectMany(i => i.Invoices); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, result.ToList().Count); + } + + [Test] + public void SelectAnonymousSelectMany2Test() + { + var result = Session.Query.All() + .Select(c => new {Invoices = Session.Query.All().Take(10)}) + .SelectMany(i => i.Invoices); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectAnonymousSubqueryTest() + { + var result = Session.Query.All() + .Select(c => new {Customer = c, Invoices = Session.Query.All()}) + .Select(i => i.Customer.Invoices); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectAnonymousSelectMany3Test() + { + IQueryable result = Session.Query.All() + .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) + .SelectMany(a => a.Invoices.Select(i => a.Customer)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectAnonymousSelectMany4Test() + { + var result = Session.Query.All() + .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) + .SelectMany(a => a.Invoices.Select(i => new {a.Customer, Invoice = i})); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(numberOfInvoices, result.ToList().Count); + } + + [Test] + public void SelectAnonymousSelectMany5Test() + { + var result = Session.Query.All() + .Select(c => new {Customer = c, Invoices = Session.Query.All().Where(i => i.Customer==c)}) + .SelectMany(a => a.Invoices.Select(i => a.Customer.FirstName)); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SubquerySimpleTest() + { + var result = Session.Query.All() + .Select(t => Session.Query.All()); + Assert.That(result, Is.Not.Empty); + foreach (IQueryable queryable in result) { + QueryDumper.Dump(queryable); + } + } + + [Test] + public void SubqueryWhereTest() + { + var result = Session.Query.All() + .Select(t => Session.Query.All().Where(m => m==t.MediaType)); + Assert.That(result, Is.Not.Empty); + foreach (IQueryable queryable in result) { + QueryDumper.Dump(queryable); + } + } + + [Test] + public void SubqueryParametrizedFieldTest() + { + var result = Session.Query.All() + .Select(t => Session.Query.All().Select(m => t.UnitPrice)); + Assert.That(result, Is.Not.Empty); + foreach (var queryable in result) { + QueryDumper.Dump(queryable); + } + } + + [Test] + public void SubqueryWithSelectTest() + { + var result = Session.Query.All() + .Select(t => Session.Query.All().Where(m => m==t.MediaType)) + .Select(m => m); + Assert.That(result, Is.Not.Empty); + foreach (IQueryable queryable in result) { + QueryDumper.Dump(queryable); + } + } + + [Test] + public void SubqueryScalarTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .Select(t => Session.Query.All().Count()); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SubqueryWhereEntitySetTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .Where(p => p.Tracks.Count > 0); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + private static int Count(IEnumerable result) + { + var count = 0; + bool? nested = null; + foreach (var item in result) { + if (nested==null) + nested = item is IEnumerable; + if (nested.Value) + count += Count((IEnumerable) item); + else + count++; + } + return count; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/NullableEnumMaterializationTest.cs b/Orm/Xtensive.Orm.Tests/Linq/NullableEnumMaterializationTest.cs index 2fbb9a08ff..92a799f91a 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/NullableEnumMaterializationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/NullableEnumMaterializationTest.cs @@ -1,133 +1,133 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.13 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Linq.NullableEnumQueryTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace NullableEnumQueryTestModel - { - public enum MyEnum - { - Foo = 0, - Bar = 1, - Qux = 2, - } - - [HierarchyRoot] - public class EntityWithNullableEnum : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public MyEnum? Value { get; set; } - } - - [HierarchyRoot] - public class RefEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public EntityWithNullableEnum Ref { get; set; } - } - } - - [TestFixture] - public class NullableEnumMaterializationTest : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithNullableEnum)); - configuration.Types.Register(typeof (RefEntity)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new RefEntity {Ref = new EntityWithNullableEnum {Value = MyEnum.Foo}}; - new RefEntity {Ref = new EntityWithNullableEnum {Value = MyEnum.Bar}}; - new RefEntity {Ref = new EntityWithNullableEnum {Value = null}}; - tx.Complete(); - } - } - - [Test] - public void SelectContainsTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var values = new[] {MyEnum.Bar, MyEnum.Foo}; - var query = session.Query.All() - .Select(e => new { - Id = e.Id, - Match = e.Value.HasValue && values.Contains(e.Value.Value) - }); - var result = query.ToList(); - Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void SelectConditionTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var values = new[] {MyEnum.Bar, MyEnum.Foo}; - var query = session.Query.All() - .Select(e => new { - Id = e.Id, - Match = e.Value.HasValue && (e.Value.Value==MyEnum.Foo || e.Value.Value==MyEnum.Bar) - }); - var result = query.ToList(); - Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void SelectContainsWithRefTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var values = new[] {MyEnum.Bar, MyEnum.Foo}; - var query = session.Query.All() - .Select(e => new { - Id = e.Id, - Match = e.Ref!=null && e.Ref.Value.HasValue && values.Contains(e.Ref.Value.Value) - }); - var result = query.ToList(); - Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void SelectConditionWithRefTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var values = new[] {MyEnum.Bar, MyEnum.Foo}; - var query = session.Query.All() - .Select(e => new { - Id = e.Id, - Match = e.Ref!=null && e.Ref.Value.HasValue && (e.Ref.Value.Value==MyEnum.Foo || e.Ref.Value.Value==MyEnum.Bar) - }); - var result = query.ToList(); - Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.13 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Linq.NullableEnumQueryTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace NullableEnumQueryTestModel + { + public enum MyEnum + { + Foo = 0, + Bar = 1, + Qux = 2, + } + + [HierarchyRoot] + public class EntityWithNullableEnum : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public MyEnum? Value { get; set; } + } + + [HierarchyRoot] + public class RefEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public EntityWithNullableEnum Ref { get; set; } + } + } + + [TestFixture] + public class NullableEnumMaterializationTest : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithNullableEnum)); + configuration.Types.Register(typeof (RefEntity)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new RefEntity {Ref = new EntityWithNullableEnum {Value = MyEnum.Foo}}; + new RefEntity {Ref = new EntityWithNullableEnum {Value = MyEnum.Bar}}; + new RefEntity {Ref = new EntityWithNullableEnum {Value = null}}; + tx.Complete(); + } + } + + [Test] + public void SelectContainsTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var values = new[] {MyEnum.Bar, MyEnum.Foo}; + var query = session.Query.All() + .Select(e => new { + Id = e.Id, + Match = e.Value.HasValue && values.Contains(e.Value.Value) + }); + var result = query.ToList(); + Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void SelectConditionTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var values = new[] {MyEnum.Bar, MyEnum.Foo}; + var query = session.Query.All() + .Select(e => new { + Id = e.Id, + Match = e.Value.HasValue && (e.Value.Value==MyEnum.Foo || e.Value.Value==MyEnum.Bar) + }); + var result = query.ToList(); + Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void SelectContainsWithRefTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var values = new[] {MyEnum.Bar, MyEnum.Foo}; + var query = session.Query.All() + .Select(e => new { + Id = e.Id, + Match = e.Ref!=null && e.Ref.Value.HasValue && values.Contains(e.Ref.Value.Value) + }); + var result = query.ToList(); + Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void SelectConditionWithRefTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var values = new[] {MyEnum.Bar, MyEnum.Foo}; + var query = session.Query.All() + .Select(e => new { + Id = e.Id, + Match = e.Ref!=null && e.Ref.Value.HasValue && (e.Ref.Value.Value==MyEnum.Foo || e.Ref.Value.Value==MyEnum.Bar) + }); + var result = query.ToList(); + Assert.That(result.Count(r => r.Match), Is.EqualTo(2)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/OrderByTest.cs b/Orm/Xtensive.Orm.Tests/Linq/OrderByTest.cs index 26e579bfc6..64c5a8c2f1 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/OrderByTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/OrderByTest.cs @@ -1,319 +1,319 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.01.29 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class OrderByTest : ChinookDOModelTest - { - [Test] - public void OrderByEnumTest() - { - var result = Session.Query.All().OrderBy(i => i.Status).ThenBy(i => i.InvoiceId); - var list = result.ToList(); - var expected = Invoices.OrderBy(i => i.Status).ThenBy(i => i.InvoiceId); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(Invoices.Count(), list.Count); - Assert.IsTrue(expected.SequenceEqual(list)); - } - - [Test] - public void OrderByTakeTest() - { - var result = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10); - var list = result.ToList(); - var expected = Invoices.OrderBy(i => i.InvoiceId).Take(10); - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(10, list.Count); - Assert.IsTrue(expected.SequenceEqual(list)); - } - - [Test] - public void EntityFieldTest() - { - var result = Session.Query.All().Select(i => i).OrderBy(g => g.InvoiceId); - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void OrderByAnonymousEntityTest() - { - var result = Session.Query.All() - .Select(il => new {InvoiceLine = il, Invoice = il.Invoice}) - .OrderBy(x => new {x, x.Invoice.Customer}) - .Select(x => new {x, x.Invoice.Customer}); - - var expected = Session.Query.All().ToList() - .Select(il => new {InvoiceLine = il, Invoice = il.Invoice}) - .OrderBy(x => x.InvoiceLine.InvoiceLineId) - .ThenBy(x => x.Invoice.InvoiceId) - .ThenBy(x => x.Invoice.Customer.CustomerId) - .Select(x => new {x, x.Invoice.Customer}); - - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByAnonymousTest() - { - var result = Session.Query.All() - .OrderBy(i => new {i.InvoiceDate, i.Commission}) - .Select(i => new {i.InvoiceDate, i.Commission}); - var expected = Invoices - .OrderBy(i => i.InvoiceDate) - .ThenBy(i => i.Commission) - .Select(i => new {i.InvoiceDate, i.Commission}); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByAnonymous2Test() - { - IQueryable customers = Session.Query.All(); - var result = customers - .Select(c => new {c.Address.Country, c}) - .OrderBy(x => x); - var expected = customers.ToList() - .Select(c => new {c.Address.Country, c}) - .OrderBy(x => x.Country) - .ThenBy(x => x.c.CustomerId); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByDescendingTest() - { - var result = Session.Query.All().OrderByDescending(c => c.Address.Country) - .ThenByDescending(c => c.CustomerId).Select(c => c.Address.City); - var expected = Customers.OrderByDescending(c => c.Address.Country) - .ThenByDescending(c => c.CustomerId).Select(c => c.Address.City); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByEntityTest() - { - var customers = Session.Query.All(); - var result = customers.OrderBy(c => c); - var expected = customers.ToList().OrderBy(c => c.CustomerId); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByExpressionTest() - { - IQueryable customers = Session.Query.All(); - List original = customers.Select(c => c.LastName).ToList().Select(n => n.ToUpper()).ToList(); - original.Sort(); - Assert.That(customers, Is.Not.Empty); - Assert.IsTrue(original.SequenceEqual( - customers - .OrderBy(c => c.LastName.ToUpper()) - .ToList() - .Select(c => c.LastName.ToUpper()))); - } - - [Test] - public void OrderByJoinTest() - { - var result = - from c in Session.Query.All().OrderBy(c => c.LastName) - join i in Session.Query.All().OrderBy(i => i.InvoiceDate) on c equals i.Customer - select new {c.LastName, i.InvoiceDate}; - var expected = - from c in Session.Query.All().ToList().OrderBy(c => c.LastName) - join i in Session.Query.All().ToList().OrderBy(i => i.InvoiceDate) on c equals i.Customer - select new {c.LastName, i.InvoiceDate}; - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderByJoin1Test() - { - var result = Session.Query.All() - .OrderBy(c => c.LastName) - .Join(Session.Query.All() - .Select(i => new {CustomerID = i.Customer.CustomerId, i.InvoiceDate}) - .Take(1000), c => c.CustomerId, x => x.CustomerID, (c, i) => new {c.LastName, i.InvoiceDate}); - var list = result.ToList(); - Assert.That(result, Is.Not.Empty); - Assert.Greater(list.Count, 0); - } - - [Test] - public void OrderByPersistentPropertyTest() - { - IQueryable customers = Session.Query.All(); - List original = customers.Select(c => c.LastName).ToList(); - original.Sort(); - Assert.That(customers, Is.Not.Empty); - Assert.IsTrue(original.SequenceEqual( - customers - .OrderBy(c => c.LastName) - .ToList() - .Select(c => c.LastName))); - } - - [Test] - public void OrderBySelectAnonymousTest() - { - var result = Session.Query.All() - .OrderBy(c => c.CustomerId) - .Select(c => new {c.Fax, c.Phone}); - var expected = Customers.ToList() - .OrderBy(c => c.CustomerId) - .Select(c => new {c.Fax, c.Phone}); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderBySelectManyTest() - { - var result = - from c in Session.Query.All().OrderBy(c => c.LastName) - from i in Session.Query.All().OrderBy(i => i.InvoiceDate) - where c==i.Customer - select new {c.LastName, i.InvoiceDate}; - var expected = - from c in Session.Query.All().ToList().OrderBy(c => c.LastName) - from i in Session.Query.All().ToList().OrderBy(i => i.InvoiceDate) - where c==i.Customer - select new {c.LastName, i.InvoiceDate}; - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void OrderBySelectTest() - { - IQueryable result = Session.Query.All().OrderBy(c => c.CompanyName) - .OrderBy(c => c.Address.Country).Select(c => c.Address.City); - var expected = Session.Query.All().ToList().OrderBy(c => c.CompanyName) - .OrderBy(c => c.Address.Country).Select(c => c.Address.City); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(result).Count()); - } - - [Test] - public void SequentialOrderByTest() - { - IQueryable result = Session.Query.All() - .OrderBy(c => c.CompanyName) - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c) - .Select(c => c); - var expected = Session.Query.All() - .ToList() - .Select(c => c.Address.City) - .Distinct() - .OrderBy(c => c) - .Select(c => c); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void DistinctTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All().Select(i => i.DesignatedEmployee).Distinct(); - var expected = Session.Query.All().ToList().Select(i => i.DesignatedEmployee).Distinct(); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(0, result.ToList().Except(expected).Count()); - } - - [Test] - public void OrderByTakeSkipTest() - { - Require.AllFeaturesSupported(ProviderFeatures.RowNumber); - var original = Session.Query.All().ToList() - .OrderBy(i => i.InvoiceDate) - .Skip(100) - .Take(50) - .OrderBy(i => i.InvoiceDate) - .Where(i => i.PaymentDate!=null) - .Select(i => i.InvoiceDate) - .Distinct() - .Skip(10); - var result = Session.Query.All() - .OrderBy(i => i.InvoiceDate) - .Skip(100) - .Take(50) - .OrderBy(i => i.InvoiceDate) - .Where(i => i.PaymentDate!=null) - .Select(i => i.InvoiceDate) - .Distinct() - .Skip(10); - var originalList = original.ToList(); - var resultList = result.ToList(); - Assert.That(resultList, Is.Not.Empty); - QueryDumper.Dump(originalList); - QueryDumper.Dump(resultList); - Assert.AreEqual(originalList.Count, resultList.Count); - Assert.IsTrue(originalList.SequenceEqual(resultList)); - } - - [Test] - public void PredicateTest() - { - IQueryable result = Session.Query.All() - .OrderBy(i => i.Commission > 0.5m) - .ThenBy(i => i.InvoiceId).Select(i => i.InvoiceId); - List list = result.ToList(); - var queryNullDate = Session.Query.All().Where(i => i.PaymentDate==null).ToList(); - var invoice = queryNullDate[0]; - var dateTime = invoice.PaymentDate; - Assert.IsFalse(dateTime.HasValue); - var listNullDate = queryNullDate.Where(i => i.PaymentDate==null).ToList(); - Assert.That(listNullDate, Is.Not.Empty); - Assert.AreEqual(queryNullDate.Count, listNullDate.Count); - List original = Session.Query.All().ToList() - .OrderBy(i => i.Commission > 0.5m) - .ThenBy(i => i.InvoiceId).Select(i => i.InvoiceId) - .ToList(); - Assert.IsTrue(list.SequenceEqual(original)); - } - - [Test] - public void SelectTest() - { - var result = Session.Query.All().OrderBy(c => c.Phone) - .Select(c => c.LastName); - var expected = Customers.OrderBy(c => c.Phone) - .Select(c => c.LastName); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void ThenByTest() - { - var result = Session.Query.All().OrderBy(c => c.Address.Country) - .ThenBy(c => c.Phone).Select(c => c.Address.City); - var expected = Customers.OrderBy(c => c.Address.Country) - .ThenBy(c => c.Phone).Select(c => c.Address.City); - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(result)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.01.29 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class OrderByTest : ChinookDOModelTest + { + [Test] + public void OrderByEnumTest() + { + var result = Session.Query.All().OrderBy(i => i.Status).ThenBy(i => i.InvoiceId); + var list = result.ToList(); + var expected = Invoices.OrderBy(i => i.Status).ThenBy(i => i.InvoiceId); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(Invoices.Count(), list.Count); + Assert.IsTrue(expected.SequenceEqual(list)); + } + + [Test] + public void OrderByTakeTest() + { + var result = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10); + var list = result.ToList(); + var expected = Invoices.OrderBy(i => i.InvoiceId).Take(10); + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(10, list.Count); + Assert.IsTrue(expected.SequenceEqual(list)); + } + + [Test] + public void EntityFieldTest() + { + var result = Session.Query.All().Select(i => i).OrderBy(g => g.InvoiceId); + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void OrderByAnonymousEntityTest() + { + var result = Session.Query.All() + .Select(il => new {InvoiceLine = il, Invoice = il.Invoice}) + .OrderBy(x => new {x, x.Invoice.Customer}) + .Select(x => new {x, x.Invoice.Customer}); + + var expected = Session.Query.All().ToList() + .Select(il => new {InvoiceLine = il, Invoice = il.Invoice}) + .OrderBy(x => x.InvoiceLine.InvoiceLineId) + .ThenBy(x => x.Invoice.InvoiceId) + .ThenBy(x => x.Invoice.Customer.CustomerId) + .Select(x => new {x, x.Invoice.Customer}); + + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByAnonymousTest() + { + var result = Session.Query.All() + .OrderBy(i => new {i.InvoiceDate, i.Commission}) + .Select(i => new {i.InvoiceDate, i.Commission}); + var expected = Invoices + .OrderBy(i => i.InvoiceDate) + .ThenBy(i => i.Commission) + .Select(i => new {i.InvoiceDate, i.Commission}); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByAnonymous2Test() + { + IQueryable customers = Session.Query.All(); + var result = customers + .Select(c => new {c.Address.Country, c}) + .OrderBy(x => x); + var expected = customers.ToList() + .Select(c => new {c.Address.Country, c}) + .OrderBy(x => x.Country) + .ThenBy(x => x.c.CustomerId); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByDescendingTest() + { + var result = Session.Query.All().OrderByDescending(c => c.Address.Country) + .ThenByDescending(c => c.CustomerId).Select(c => c.Address.City); + var expected = Customers.OrderByDescending(c => c.Address.Country) + .ThenByDescending(c => c.CustomerId).Select(c => c.Address.City); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByEntityTest() + { + var customers = Session.Query.All(); + var result = customers.OrderBy(c => c); + var expected = customers.ToList().OrderBy(c => c.CustomerId); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByExpressionTest() + { + IQueryable customers = Session.Query.All(); + List original = customers.Select(c => c.LastName).ToList().Select(n => n.ToUpper()).ToList(); + original.Sort(); + Assert.That(customers, Is.Not.Empty); + Assert.IsTrue(original.SequenceEqual( + customers + .OrderBy(c => c.LastName.ToUpper()) + .ToList() + .Select(c => c.LastName.ToUpper()))); + } + + [Test] + public void OrderByJoinTest() + { + var result = + from c in Session.Query.All().OrderBy(c => c.LastName) + join i in Session.Query.All().OrderBy(i => i.InvoiceDate) on c equals i.Customer + select new {c.LastName, i.InvoiceDate}; + var expected = + from c in Session.Query.All().ToList().OrderBy(c => c.LastName) + join i in Session.Query.All().ToList().OrderBy(i => i.InvoiceDate) on c equals i.Customer + select new {c.LastName, i.InvoiceDate}; + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderByJoin1Test() + { + var result = Session.Query.All() + .OrderBy(c => c.LastName) + .Join(Session.Query.All() + .Select(i => new {CustomerID = i.Customer.CustomerId, i.InvoiceDate}) + .Take(1000), c => c.CustomerId, x => x.CustomerID, (c, i) => new {c.LastName, i.InvoiceDate}); + var list = result.ToList(); + Assert.That(result, Is.Not.Empty); + Assert.Greater(list.Count, 0); + } + + [Test] + public void OrderByPersistentPropertyTest() + { + IQueryable customers = Session.Query.All(); + List original = customers.Select(c => c.LastName).ToList(); + original.Sort(); + Assert.That(customers, Is.Not.Empty); + Assert.IsTrue(original.SequenceEqual( + customers + .OrderBy(c => c.LastName) + .ToList() + .Select(c => c.LastName))); + } + + [Test] + public void OrderBySelectAnonymousTest() + { + var result = Session.Query.All() + .OrderBy(c => c.CustomerId) + .Select(c => new {c.Fax, c.Phone}); + var expected = Customers.ToList() + .OrderBy(c => c.CustomerId) + .Select(c => new {c.Fax, c.Phone}); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderBySelectManyTest() + { + var result = + from c in Session.Query.All().OrderBy(c => c.LastName) + from i in Session.Query.All().OrderBy(i => i.InvoiceDate) + where c==i.Customer + select new {c.LastName, i.InvoiceDate}; + var expected = + from c in Session.Query.All().ToList().OrderBy(c => c.LastName) + from i in Session.Query.All().ToList().OrderBy(i => i.InvoiceDate) + where c==i.Customer + select new {c.LastName, i.InvoiceDate}; + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void OrderBySelectTest() + { + IQueryable result = Session.Query.All().OrderBy(c => c.CompanyName) + .OrderBy(c => c.Address.Country).Select(c => c.Address.City); + var expected = Session.Query.All().ToList().OrderBy(c => c.CompanyName) + .OrderBy(c => c.Address.Country).Select(c => c.Address.City); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(result).Count()); + } + + [Test] + public void SequentialOrderByTest() + { + IQueryable result = Session.Query.All() + .OrderBy(c => c.CompanyName) + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c) + .Select(c => c); + var expected = Session.Query.All() + .ToList() + .Select(c => c.Address.City) + .Distinct() + .OrderBy(c => c) + .Select(c => c); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void DistinctTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All().Select(i => i.DesignatedEmployee).Distinct(); + var expected = Session.Query.All().ToList().Select(i => i.DesignatedEmployee).Distinct(); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(0, result.ToList().Except(expected).Count()); + } + + [Test] + public void OrderByTakeSkipTest() + { + Require.AllFeaturesSupported(ProviderFeatures.RowNumber); + var original = Session.Query.All().ToList() + .OrderBy(i => i.InvoiceDate) + .Skip(100) + .Take(50) + .OrderBy(i => i.InvoiceDate) + .Where(i => i.PaymentDate!=null) + .Select(i => i.InvoiceDate) + .Distinct() + .Skip(10); + var result = Session.Query.All() + .OrderBy(i => i.InvoiceDate) + .Skip(100) + .Take(50) + .OrderBy(i => i.InvoiceDate) + .Where(i => i.PaymentDate!=null) + .Select(i => i.InvoiceDate) + .Distinct() + .Skip(10); + var originalList = original.ToList(); + var resultList = result.ToList(); + Assert.That(resultList, Is.Not.Empty); + QueryDumper.Dump(originalList); + QueryDumper.Dump(resultList); + Assert.AreEqual(originalList.Count, resultList.Count); + Assert.IsTrue(originalList.SequenceEqual(resultList)); + } + + [Test] + public void PredicateTest() + { + IQueryable result = Session.Query.All() + .OrderBy(i => i.Commission > 0.5m) + .ThenBy(i => i.InvoiceId).Select(i => i.InvoiceId); + List list = result.ToList(); + var queryNullDate = Session.Query.All().Where(i => i.PaymentDate==null).ToList(); + var invoice = queryNullDate[0]; + var dateTime = invoice.PaymentDate; + Assert.IsFalse(dateTime.HasValue); + var listNullDate = queryNullDate.Where(i => i.PaymentDate==null).ToList(); + Assert.That(listNullDate, Is.Not.Empty); + Assert.AreEqual(queryNullDate.Count, listNullDate.Count); + List original = Session.Query.All().ToList() + .OrderBy(i => i.Commission > 0.5m) + .ThenBy(i => i.InvoiceId).Select(i => i.InvoiceId) + .ToList(); + Assert.IsTrue(list.SequenceEqual(original)); + } + + [Test] + public void SelectTest() + { + var result = Session.Query.All().OrderBy(c => c.Phone) + .Select(c => c.LastName); + var expected = Customers.OrderBy(c => c.Phone) + .Select(c => c.LastName); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void ThenByTest() + { + var result = Session.Query.All().OrderBy(c => c.Address.Country) + .ThenBy(c => c.Phone).Select(c => c.Address.City); + var expected = Customers.OrderBy(c => c.Address.Country) + .ThenBy(c => c.Phone).Select(c => c.Address.City); + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(result)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/PocoProjectionWithSubqueryTest.cs b/Orm/Xtensive.Orm.Tests/Linq/PocoProjectionWithSubqueryTest.cs index 86229feffa..faa7994565 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/PocoProjectionWithSubqueryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/PocoProjectionWithSubqueryTest.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.13 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.PocoProjectionWithSubqueryTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace PocoProjectionWithSubqueryTestModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Key, Field] - public long Id { get; private set; } - - public Owner(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class Item1 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Owner Owner { get; set; } - - public Item1(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class Item2 : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Owner Owner { get; set; } - - public Item2(Session session) - : base(session) - { - } - } - - public class QueryModel - { - public long Id { get; set; } - - public IEnumerable Id2 { get; set; } - } - } - - public class PocoProjectionWithSubqueryTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var owner = new Owner(session); - var item1 = new Item1(session) {Owner = owner}; - var item2 = new Item2(session) {Owner = owner}; - tx.Complete(); - } - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = session.Query.All() - .OrderByDescending(i1 => i1.Id) - .Select(i1 => new QueryModel { - Id = i1.Id, - Id2 = session.Query.All() - .Where(i2 => i2.Owner.Id==i1.Owner.Id) - .Select(i2 => i2.Id) - }); - - var count = query.Count(); - Assert.That(count, Is.EqualTo(1)); - - foreach (var item in query) - Assert.That(item.Id2.ToArray().Length, Is.EqualTo(1)); - - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.13 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.PocoProjectionWithSubqueryTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace PocoProjectionWithSubqueryTestModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Key, Field] + public long Id { get; private set; } + + public Owner(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class Item1 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Owner Owner { get; set; } + + public Item1(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class Item2 : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Owner Owner { get; set; } + + public Item2(Session session) + : base(session) + { + } + } + + public class QueryModel + { + public long Id { get; set; } + + public IEnumerable Id2 { get; set; } + } + } + + public class PocoProjectionWithSubqueryTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var owner = new Owner(session); + var item1 = new Item1(session) {Owner = owner}; + var item2 = new Item2(session) {Owner = owner}; + tx.Complete(); + } + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = session.Query.All() + .OrderByDescending(i1 => i1.Id) + .Select(i1 => new QueryModel { + Id = i1.Id, + Id2 = session.Query.All() + .Where(i2 => i2.Owner.Id==i1.Owner.Id) + .Select(i2 => i2.Id) + }); + + var count = query.Count(); + Assert.That(count, Is.EqualTo(1)); + + foreach (var item in query) + Assert.That(item.Id2.ToArray().Length, Is.EqualTo(1)); + + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/ProjectToDtoWithInheritanceTest.cs b/Orm/Xtensive.Orm.Tests/Linq/ProjectToDtoWithInheritanceTest.cs index 4a77b702b4..dd01a7dcf3 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/ProjectToDtoWithInheritanceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/ProjectToDtoWithInheritanceTest.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.26 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.ProjectToDtoWithInheritanceTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace ProjectToDtoWithInheritanceTestModel - { - [HierarchyRoot] - public class ProjectedEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Value { get; set; } - - [Field] - public DateTime Timestamp { get; set; } - } - - public class BaseEntityDto - { - public long Id { get; set; } - - public string Value { get; set; } - } - - public class ChildEntityDto : BaseEntityDto - { - public DateTime Timestamp { get; set; } - } - } - - public class ProjectToDtoWithInheritanceTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ProjectedEntity)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new ProjectedEntity(); - new ProjectedEntity {Timestamp = DateTime.Now}; - var stampMin = new DateTime(2000, 1, 1); - var query = session.Query.All() - .Select(e => new ChildEntityDto { - Id = e.Id, - Value = e.Value, - Timestamp = e.Timestamp - }) - .Where(d => d.Timestamp >= stampMin) - .Select(d => new BaseEntityDto { - Id = d.Id, - Value = d.Value - }); - var result = query.ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.26 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.ProjectToDtoWithInheritanceTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace ProjectToDtoWithInheritanceTestModel + { + [HierarchyRoot] + public class ProjectedEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Value { get; set; } + + [Field] + public DateTime Timestamp { get; set; } + } + + public class BaseEntityDto + { + public long Id { get; set; } + + public string Value { get; set; } + } + + public class ChildEntityDto : BaseEntityDto + { + public DateTime Timestamp { get; set; } + } + } + + public class ProjectToDtoWithInheritanceTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (ProjectedEntity)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new ProjectedEntity(); + new ProjectedEntity {Timestamp = DateTime.Now}; + var stampMin = new DateTime(2000, 1, 1); + var query = session.Query.All() + .Select(e => new ChildEntityDto { + Id = e.Id, + Value = e.Value, + Timestamp = e.Timestamp + }) + .Where(d => d.Timestamp >= stampMin) + .Select(d => new BaseEntityDto { + Id = d.Id, + Value = d.Value + }); + var result = query.ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs b/Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs index 702302b843..929e0f4057 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/QueryDumper.cs @@ -1,578 +1,578 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.03.27 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using System.Xml; -using System.Xml.XPath; -using Xtensive.Core; -using Xtensive.Orm.Linq; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Tests.Linq -{ - public class QueryDumper - { - private int treeDepth; - private int fillStringLength; - private bool containsEnumerable; - - private void DumpInternal(IEnumerable query, bool showResults) - { - EnumerateAll(query); - - if (showResults) { - - treeDepth = 1; - fillStringLength = 0; - containsEnumerable = false; - - var listOfElements = new List(); - foreach (var o in query) - listOfElements.Add(o); - if (listOfElements.Count==0) { - TestLog.Info("NULL"); - return; - } - - try { - var document = new XmlDocument(); - CreateNodeTree(listOfElements, ref document, "Root", document); - - if (!containsEnumerable) { - CorrectNodeTree(ref document); - var str = new StringBuilder("|"); - foreach (XmlNode o in document.DocumentElement.ChildNodes[0].ChildNodes) { - var value = Int32.Parse(o.Attributes["length"].Value); - fillStringLength = fillStringLength + value; - str.Append(" ").Append(o.Name).Append(CreateFillString(value - o.Name.Length - 3, ' ')).Append("|"); - } - - var groupHeader = new List(); - groupHeader.Add(CreateFillString(fillStringLength + 1, '*')); - groupHeader.Add(str.ToString()); - groupHeader.Add(CreateFillString(fillStringLength + 1, '*')); - - if (document.DocumentElement.ChildNodes[0].Attributes["group"]==null) { - foreach (var s in groupHeader) - TestLog.Info(s); - OutputLog(document, null); - } - else - OutputLog(document, groupHeader); - } - else { - TestLog.Info("Correct output is impossible."); -// EnumerateAll(query); - } - } - catch { - TestLog.Info("Errors occurred during execution."); -// EnumerateAll(query); - } - } - } - - public static void Dump(object value) - { - Dump(value, false); - } - - public static void Dump(object value, bool showResults) - { - if (value is IEnumerable) - Dump((IEnumerable) value, showResults); - else { - try { - Dump(new[] {value}, showResults); - } - catch { - TestLog.Info(value==null ? "NULL" : value.ToString()); - } - } - } - - public static void Dump(IEnumerable value) - { - Dump(value, false); - } - - public static void Dump(IEnumerable value, bool showResults) - { - var dumper = new QueryDumper(); - dumper.DumpInternal(value, showResults); - } - - #region Private Length related methods - - private void FillLength(ref XmlDocument document, XmlNode rootNode) - { - foreach (XmlNode node in rootNode.ChildNodes) { - if (!node.HasChildNodes) { - if (node.Attributes["value"]!=null) { - var l = node.Attributes["value"].Value.Length + 5; - if (l > Int32.Parse(node.Attributes["length"].Value) + 5) - node.Attributes["length"].Value = l.ToString(); - else - node.Attributes["length"].Value = (Int32.Parse(node.Attributes["length"].Value) + 5).ToString(); - } - } - else - FillLength(ref document, node); - } - } - - private void FillLengths(ref XmlDocument document, XmlNodeList nodes) - { - foreach (XmlNode node in nodes) - FillLength(ref document, node); - } - - private void CorrectMaxLengths(ref XmlDocument document, XmlNodeList nodes) - { - var firstNodes = nodes; - if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) - firstNodes = nodes[0].ChildNodes; - - foreach (XmlNode node in firstNodes) { - if (!node.HasChildNodes) { - if (node.Attributes["length"]!=null) { - int currentLength = Int32.Parse(node.Attributes["length"].Value); - var resultNodes = document.SelectNodes("//" + node.Name); - foreach (XmlNode o in resultNodes) { - var attribute = Int32.Parse(o.Attributes["length"].Value); - if (attribute > currentLength) - currentLength = attribute; - } - foreach (XmlNode o in resultNodes) - o.Attributes["length"].Value = currentLength.ToString(); - } - } - else { - CorrectMaxLengths(ref document, node.ChildNodes); - } - } - } - - private int FillMaxLengths(ref XmlDocument document, XmlNodeList nodes) - { - var sum = 0; - var correctNodes = nodes; - if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) - correctNodes = nodes[0].ChildNodes; - foreach (XmlNode o in correctNodes) { - if (!o.HasChildNodes) - sum += Int32.Parse(o.Attributes["length"].Value); - else - sum += FillMaxLengths(ref document, o.ChildNodes); - } - if (correctNodes[0].ParentNode.ParentNode!=document.DocumentElement) { - var maxLength = Int32.Parse(correctNodes[0].ParentNode.Attributes["length"].Value); - if (maxLength < sum) - correctNodes[0].ParentNode.Attributes["length"].Value = sum.ToString(); - } - return sum; - } - - private void FillCorrectMaxLengths(ref XmlDocument document, XmlNodeList nodes) - { - var correctNodes = nodes; - if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) - correctNodes = nodes[0].ChildNodes; - foreach (XmlNode node in correctNodes) { - var allNodes = document.SelectNodes("//" + node.Name); - foreach (XmlNode o in allNodes) - o.Attributes["length"].Value = node.Attributes["length"].Value; - if (node.HasChildNodes) - FillCorrectMaxLengths(ref document, node.ChildNodes); - } - } - - #endregion - - private void CreateNodeTree(List values, ref XmlDocument document, string rootElement, XmlNode parentElement) - { - var parentNode = document.CreateElement(rootElement); - parentElement.AppendChild(parentNode); - - if (rootElement!="Root") { - containsEnumerable = true; - var lengthAttribute = document.CreateAttribute("length"); - var depthAttribute = document.CreateAttribute("depth"); - var valueAttribute = document.CreateAttribute("value"); - var enumerableAttribute = document.CreateAttribute("enumerable"); - lengthAttribute.Value = rootElement.Length.ToString(); - depthAttribute.Value = treeDepth.ToString(); - valueAttribute.Value = "NULL"; - enumerableAttribute.Value = "TRUE"; - parentNode.Attributes.Append(lengthAttribute); - parentNode.Attributes.Append(depthAttribute); - parentNode.Attributes.Append(valueAttribute); - parentNode.Attributes.Append(enumerableAttribute); - } - - int groupIndex = 1; - int itemIndex = 0; - - foreach (var value in values) { - treeDepth = 1; - var depth = 1; - XmlNode itemNode = document.CreateElement("Item" + itemIndex); - - if (value==null || !value.GetType().IsGenericType || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()!=typeof (Grouping<,>))) { - itemNode = document.CreateElement("Item" + itemIndex); - itemIndex++; - parentNode.AppendChild(itemNode); - } - - if (value==null || ((GetMemberType(value.GetType())==MemberType.Primitive - || GetMemberType(value.GetType())==MemberType.Unknown) && !value.GetType().IsGenericType) - || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()!=typeof (Grouping<,>)) - && (GetMemberType(value.GetType())==MemberType.Primitive - || GetMemberType(value.GetType())==MemberType.Unknown)) - depth = AddNode(value, null, ref document, itemNode, depth); - - else if (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()==typeof (Grouping<,>)) { - var exactValue = (IEnumerable) value; - foreach (var val in exactValue) { - itemNode = document.CreateElement("Item" + itemIndex); - parentNode.AppendChild(itemNode); - itemIndex++; - var groupAttribute = document.CreateAttribute("group"); - groupAttribute.Value = groupIndex.ToString(); - var keyAttribute = document.CreateAttribute("key"); - keyAttribute.Value = KeyToString(value.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(value, null)); - itemNode.Attributes.Append(groupAttribute); - itemNode.Attributes.Append(keyAttribute); - var properties = val.GetType().GetProperties(); - foreach (var info in properties) - depth = AddNode(val, info, ref document, itemNode, depth); - } - groupIndex++; - } - - else { - var properties = value.GetType().GetProperties(); - foreach (var info in properties) - depth = AddNode(value, info, ref document, itemNode, depth); - } - } - } - - private void CorrectNodeTree(ref XmlDocument document) - { - FillLengths(ref document, document.DocumentElement.ChildNodes); - CorrectMaxLengths(ref document, document.DocumentElement.ChildNodes); - FillMaxLengths(ref document, document.DocumentElement.ChildNodes); - FillCorrectMaxLengths(ref document, document.DocumentElement.ChildNodes); - } - - private int AddNode(object value, PropertyInfo property, ref XmlDocument document, XmlNode parentNode, int depthValue) - { - var depth = depthValue; - - //One column of primitive type - - if (property==null) { - var propertyName = "CompilationResult"; - XmlElement node = document.CreateElement(propertyName); - var valueAttribute = document.CreateAttribute("value"); - var lengthAttribute = document.CreateAttribute("length"); - var depthAttribute = document.CreateAttribute("depth"); - lengthAttribute.Value = propertyName.Length.ToString(); - depthAttribute.Value = depth.ToString(); - node.Attributes.Append(lengthAttribute); - node.Attributes.Append(depthAttribute); - parentNode.AppendChild(node); - valueAttribute.Value = ReplaceTabs(value); - node.Attributes.Append(valueAttribute); - } - - else { - if (property.PropertyType.IsGenericType && - (property.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>) - || (property.PropertyType.GetGenericTypeDefinition()==typeof (IEnumerable<>)))) { - var enumerable = (IEnumerable) property.GetValue(value, property.GetIndexParameters()); - var list = new List(); - foreach (var o in enumerable) - list.Add(o); - CreateNodeTree(list, ref document, property.Name, parentNode); - } - else { - var memberType = GetMemberType(property.PropertyType); - XmlElement node = document.CreateElement(property.Name); - var valueAttribute = document.CreateAttribute("value"); - var lengthAttribute = document.CreateAttribute("length"); - var depthAttribute = document.CreateAttribute("depth"); - lengthAttribute.Value = property.Name.Length.ToString(); - depthAttribute.Value = depth.ToString(); - node.Attributes.Append(lengthAttribute); - node.Attributes.Append(depthAttribute); - - switch (memberType) { - case MemberType.Unknown: - if (ValueIsForOutput(property)) { - parentNode.AppendChild(node); - valueAttribute.Value = ReplaceTabs(property.GetValue(value, null)); - node.Attributes.Append(valueAttribute); - node.Attributes.Append(valueAttribute); - } - break; - case MemberType.Entity: - parentNode.AppendChild(node); - var entityValue = property.GetValue(value, null); - valueAttribute.Value = (entityValue!=null) ? entityValue.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(entityValue, null).ToString() : "NULL"; - node.Attributes.Append(valueAttribute); - break; - case MemberType.Structure: - case MemberType.Anonymous: - if (depth==treeDepth) - treeDepth += 1; - depth += 1; - parentNode.AppendChild(node); - var itemValue = property.GetValue(value, null); - var itemProperties = itemValue.GetType().GetProperties(); - foreach (var itemProperty in itemProperties) - AddNode(itemValue, itemProperty, ref document, node, depth); - depth -= 1; - break; - } - } - } - return depth; - } - - private void OutputLog(XmlDocument document, List groupHeader) - { - int currentGroup = 1; - if (groupHeader!=null) { - TestLog.Info(String.Empty); - TestLog.Info(CreateFillString(fillStringLength + 1, '*')); - TestLog.Info("| Key = " + document.DocumentElement.ChildNodes[0].Attributes["key"].Value); - foreach (var s in groupHeader) - TestLog.Info(s); - } - - foreach (XmlNode node in document.DocumentElement.ChildNodes) { - if (groupHeader!=null && Int32.Parse(node.Attributes["group"].Value) > currentGroup) { - TestLog.Info(String.Empty); - TestLog.Info(CreateFillString(fillStringLength + 1, '*')); - TestLog.Info("| Key = " + node.Attributes["key"].Value); - foreach (var s in groupHeader) - TestLog.Info(s); - currentGroup++; - } - - var nodes = node.Clone().SelectNodes("//*[@depth=1]"); - var helpList = new List>(); - var drawList = new List>(); - - for (int i = 0; i < nodes.Count; i++) { - if (!nodes[i].HasChildNodes) - helpList.Add(new Pair(nodes[i], 0)); - else { - var length = 0; - for (int j = i - 1; j >= 0; j = j - 1) { - if (nodes[j].HasChildNodes) - break; - length += Int32.Parse(nodes[j].Attributes["length"].Value); - } - helpList.Add(new Pair(nodes[i], length)); - } - drawList.Add(new Pair(nodes[i], 0)); - } - DrawSingleLine(drawList); - - for (int i = 2; i <= treeDepth; i++) { - drawList.Clear(); - nodes = node.Clone().SelectNodes("//*[@depth=" + i + "]"); - for (int j = 0; j < nodes.Count; j++) { - var val = helpList.Where(v => v.First.InnerXml==nodes[j].ParentNode.InnerXml); - var value = val!=null ? val.First() : new Pair(null, 0); - - if (((j > 0) && nodes[j - 1].ParentNode.InnerXml!=value.First.InnerXml) || j==0) - drawList.Add(new Pair(nodes[j], value.Second)); - else if ((j > 0) && nodes[j - 1].ParentNode.InnerXml==value.First.InnerXml) - drawList.Add(new Pair(nodes[j], 0)); - } - DrawSingleLine(drawList); - if (i==treeDepth) - break; - helpList.Clear(); - for (int l = 0; l < nodes.Count; l++) { - if (!nodes[l].HasChildNodes) - helpList.Add(new Pair(nodes[l], drawList[l].Second)); - else { - var length = 0; - for (int j = l - 1; j >= 0; j = j - 1) { - if (nodes[j].HasChildNodes) - break; - length += drawList[j].Second + Int32.Parse(drawList[j].First.Attributes["length"].Value); - } - helpList.Add(new Pair(nodes[l], length + drawList[l].Second)); - } - } - } - TestLog.Info(CreateFillString(fillStringLength + 1, '=')); - } - } - - private void DrawSingleLine(List> listOfNodes) - { - var str = new StringBuilder("|"); - var separateLine = new StringBuilder("|"); - bool drawSeporateLine = false; - foreach (var node in listOfNodes) { - if (!node.First.HasChildNodes) { - var partStr = new StringBuilder(); - partStr.Append(CreateFillString(node.Second!=0 ? node.Second - 1 : 0, ' ')) - .Append(node.Second!=0 ? "| " : " ") - .Append(node.First.Attributes["value"].Value).Append(CreateFillString(Int32.Parse - (node.First.Attributes["length"].Value) - node.First.Attributes["value"].Value.Length - 3, ' ')).Append("|"); - separateLine.Append(CreateFillString(partStr.Length, ' ')); - str.Append(partStr); - } - else { - var partStr = new StringBuilder(); - drawSeporateLine = true; - partStr.Append(CreateFillString(node.Second, ' ')); - foreach (XmlNode o in node.First.ChildNodes) { - partStr.Append(" ").Append(o.Name).Append(CreateFillString(Int32.Parse - (o.Attributes["length"].Value) - o.Name.Length - 3, ' ')).Append("|"); - } - separateLine.Append(CreateFillString(partStr.Length, '=')); - str.Append(partStr); - } - } - - if (str.Length < fillStringLength + 1) - str.Append(CreateFillString(fillStringLength - str.Length, ' ')).Append("|"); - if (separateLine.Length < fillStringLength + 1) - separateLine.Append(CreateFillString(fillStringLength - separateLine.Length, ' ')).Append("|"); - - if (str.ToString().EndsWith(" ")) - str.Replace(" ", "|", str.Length - 1, 1); - if (separateLine.ToString().EndsWith(" ")) - separateLine.Replace(" ", "|", str.Length - 1, 1); - - TestLog.Info(str.ToString()); - if (drawSeporateLine) - TestLog.Info(separateLine.ToString()); - } - - private MemberType GetMemberType(Type type) - { - if (typeof (Key).IsAssignableFrom(type)) - return MemberType.Key; - if (typeof (IEntity).IsAssignableFrom(type)) - return MemberType.Entity; - if (typeof (Structure).IsAssignableFrom(type)) - return MemberType.Structure; - if (typeof (EntitySetBase).IsAssignableFrom(type)) - return MemberType.EntitySet; - if (Attribute.IsDefined(type, typeof (CompilerGeneratedAttribute), false) - && type.BaseType==typeof (object) - && type.Name.Contains("AnonymousType") - && (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$")) - && (type.Attributes & TypeAttributes.NotPublic)==TypeAttributes.NotPublic) - return MemberType.Anonymous; - return MemberType.Unknown; - } - - private string ReplaceTabs(object value) - { - if (value==null) - return "NULL"; - if (value.GetType()==typeof (byte[])) - return "ByteArray"; - return value.ToString().Replace("-", " ").Replace("\n", string.Empty) - .Replace("\t", string.Empty).Replace("\\", string.Empty) - .Replace("\"", " ").Replace("\r", " ").Trim(); - } - - private string CreateFillString(int count, char element) - { - var list = Enumerable.Repeat(element, count); - string result = String.Empty; - foreach (var item in list) - result = result + item; - return result; - } - - private bool ValueIsForOutput(PropertyInfo info) - { - var memberType = GetMemberType(info.PropertyType); - return ((!info.CanWrite && info.PropertyType!=typeof (bool) - && memberType!=MemberType.Key - && info.PropertyType!=typeof (PersistenceState)) - || (info.CanWrite)) && info.DeclaringType!=typeof (Persistent) - && info.DeclaringType!=typeof (SessionBound) - && memberType!=MemberType.EntitySet; - } - - private string KeyToString(object key) - { - var properties = key.GetType().GetProperties(); - var str = new StringBuilder("{ "); - switch (GetMemberType(key.GetType())) { - case MemberType.Structure: - case MemberType.Anonymous: - foreach (var info in properties) { - if (ValueIsForOutput(info)) { - str.Append(info.Name).Append(" = "); - var propertyValue = info.GetValue(key, null); - if (GetMemberType(info.PropertyType)==MemberType.Entity) - str.Append((propertyValue!=null) ? info.PropertyType.GetProperty(Orm.WellKnown.KeyFieldName).GetValue(propertyValue, null).ToString() : "NULL"); - if (GetMemberType(info.PropertyType)==MemberType.Structure || GetMemberType(info.PropertyType)==MemberType.Anonymous) - str.Append(ReplaceTabs(KeyToString(info.GetValue(key, null)))); - else - str.Append(ReplaceTabs(propertyValue)) - .Append(" , "); - } - } - break; - case MemberType.Entity: - str.Append(key.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(key, null).ToString()); - break; - - default: - str.Append(ReplaceTabs(key)); - break; - } - if (str[str.Length - 2]==',') - str.Remove(str.Length - 2, 2); - return str.Append(" }").ToString(); - } - - private static void EnumerateAll(IEnumerable enumerable) - { - foreach (var o in enumerable) - if (o!=null) { - if (o.GetType().IsGenericType && (o.GetType().GetGenericTypeDefinition()==typeof (IQueryable<>) - || o.GetType().GetGenericTypeDefinition()==typeof (IEnumerable<>) - || o.GetType().GetGenericTypeDefinition()==typeof (SubQuery<>) - || o.GetType().GetGenericTypeDefinition()==typeof (Grouping<,>))) - EnumerateAll((IEnumerable) o); - var properties = o.GetType().GetProperties(); - foreach (var info in properties) { - if (info.PropertyType.IsGenericType && - (info.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>) - || info.PropertyType.GetGenericTypeDefinition()==typeof (IEnumerable<>) - || info.PropertyType.GetGenericTypeDefinition()==typeof (SubQuery<>) - || info.PropertyType.GetGenericTypeDefinition()==typeof (Grouping<,>) - )) - EnumerateAll((IEnumerable) info.GetValue(o, null)); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.03.27 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; +using System.Xml; +using System.Xml.XPath; +using Xtensive.Core; +using Xtensive.Orm.Linq; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Tests.Linq +{ + public class QueryDumper + { + private int treeDepth; + private int fillStringLength; + private bool containsEnumerable; + + private void DumpInternal(IEnumerable query, bool showResults) + { + EnumerateAll(query); + + if (showResults) { + + treeDepth = 1; + fillStringLength = 0; + containsEnumerable = false; + + var listOfElements = new List(); + foreach (var o in query) + listOfElements.Add(o); + if (listOfElements.Count==0) { + TestLog.Info("NULL"); + return; + } + + try { + var document = new XmlDocument(); + CreateNodeTree(listOfElements, ref document, "Root", document); + + if (!containsEnumerable) { + CorrectNodeTree(ref document); + var str = new StringBuilder("|"); + foreach (XmlNode o in document.DocumentElement.ChildNodes[0].ChildNodes) { + var value = Int32.Parse(o.Attributes["length"].Value); + fillStringLength = fillStringLength + value; + str.Append(" ").Append(o.Name).Append(CreateFillString(value - o.Name.Length - 3, ' ')).Append("|"); + } + + var groupHeader = new List(); + groupHeader.Add(CreateFillString(fillStringLength + 1, '*')); + groupHeader.Add(str.ToString()); + groupHeader.Add(CreateFillString(fillStringLength + 1, '*')); + + if (document.DocumentElement.ChildNodes[0].Attributes["group"]==null) { + foreach (var s in groupHeader) + TestLog.Info(s); + OutputLog(document, null); + } + else + OutputLog(document, groupHeader); + } + else { + TestLog.Info("Correct output is impossible."); +// EnumerateAll(query); + } + } + catch { + TestLog.Info("Errors occurred during execution."); +// EnumerateAll(query); + } + } + } + + public static void Dump(object value) + { + Dump(value, false); + } + + public static void Dump(object value, bool showResults) + { + if (value is IEnumerable) + Dump((IEnumerable) value, showResults); + else { + try { + Dump(new[] {value}, showResults); + } + catch { + TestLog.Info(value==null ? "NULL" : value.ToString()); + } + } + } + + public static void Dump(IEnumerable value) + { + Dump(value, false); + } + + public static void Dump(IEnumerable value, bool showResults) + { + var dumper = new QueryDumper(); + dumper.DumpInternal(value, showResults); + } + + #region Private Length related methods + + private void FillLength(ref XmlDocument document, XmlNode rootNode) + { + foreach (XmlNode node in rootNode.ChildNodes) { + if (!node.HasChildNodes) { + if (node.Attributes["value"]!=null) { + var l = node.Attributes["value"].Value.Length + 5; + if (l > Int32.Parse(node.Attributes["length"].Value) + 5) + node.Attributes["length"].Value = l.ToString(); + else + node.Attributes["length"].Value = (Int32.Parse(node.Attributes["length"].Value) + 5).ToString(); + } + } + else + FillLength(ref document, node); + } + } + + private void FillLengths(ref XmlDocument document, XmlNodeList nodes) + { + foreach (XmlNode node in nodes) + FillLength(ref document, node); + } + + private void CorrectMaxLengths(ref XmlDocument document, XmlNodeList nodes) + { + var firstNodes = nodes; + if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) + firstNodes = nodes[0].ChildNodes; + + foreach (XmlNode node in firstNodes) { + if (!node.HasChildNodes) { + if (node.Attributes["length"]!=null) { + int currentLength = Int32.Parse(node.Attributes["length"].Value); + var resultNodes = document.SelectNodes("//" + node.Name); + foreach (XmlNode o in resultNodes) { + var attribute = Int32.Parse(o.Attributes["length"].Value); + if (attribute > currentLength) + currentLength = attribute; + } + foreach (XmlNode o in resultNodes) + o.Attributes["length"].Value = currentLength.ToString(); + } + } + else { + CorrectMaxLengths(ref document, node.ChildNodes); + } + } + } + + private int FillMaxLengths(ref XmlDocument document, XmlNodeList nodes) + { + var sum = 0; + var correctNodes = nodes; + if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) + correctNodes = nodes[0].ChildNodes; + foreach (XmlNode o in correctNodes) { + if (!o.HasChildNodes) + sum += Int32.Parse(o.Attributes["length"].Value); + else + sum += FillMaxLengths(ref document, o.ChildNodes); + } + if (correctNodes[0].ParentNode.ParentNode!=document.DocumentElement) { + var maxLength = Int32.Parse(correctNodes[0].ParentNode.Attributes["length"].Value); + if (maxLength < sum) + correctNodes[0].ParentNode.Attributes["length"].Value = sum.ToString(); + } + return sum; + } + + private void FillCorrectMaxLengths(ref XmlDocument document, XmlNodeList nodes) + { + var correctNodes = nodes; + if (nodes[0].HasChildNodes && nodes[0].ParentNode==document.DocumentElement) + correctNodes = nodes[0].ChildNodes; + foreach (XmlNode node in correctNodes) { + var allNodes = document.SelectNodes("//" + node.Name); + foreach (XmlNode o in allNodes) + o.Attributes["length"].Value = node.Attributes["length"].Value; + if (node.HasChildNodes) + FillCorrectMaxLengths(ref document, node.ChildNodes); + } + } + + #endregion + + private void CreateNodeTree(List values, ref XmlDocument document, string rootElement, XmlNode parentElement) + { + var parentNode = document.CreateElement(rootElement); + parentElement.AppendChild(parentNode); + + if (rootElement!="Root") { + containsEnumerable = true; + var lengthAttribute = document.CreateAttribute("length"); + var depthAttribute = document.CreateAttribute("depth"); + var valueAttribute = document.CreateAttribute("value"); + var enumerableAttribute = document.CreateAttribute("enumerable"); + lengthAttribute.Value = rootElement.Length.ToString(); + depthAttribute.Value = treeDepth.ToString(); + valueAttribute.Value = "NULL"; + enumerableAttribute.Value = "TRUE"; + parentNode.Attributes.Append(lengthAttribute); + parentNode.Attributes.Append(depthAttribute); + parentNode.Attributes.Append(valueAttribute); + parentNode.Attributes.Append(enumerableAttribute); + } + + int groupIndex = 1; + int itemIndex = 0; + + foreach (var value in values) { + treeDepth = 1; + var depth = 1; + XmlNode itemNode = document.CreateElement("Item" + itemIndex); + + if (value==null || !value.GetType().IsGenericType || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()!=typeof (Grouping<,>))) { + itemNode = document.CreateElement("Item" + itemIndex); + itemIndex++; + parentNode.AppendChild(itemNode); + } + + if (value==null || ((GetMemberType(value.GetType())==MemberType.Primitive + || GetMemberType(value.GetType())==MemberType.Unknown) && !value.GetType().IsGenericType) + || (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()!=typeof (Grouping<,>)) + && (GetMemberType(value.GetType())==MemberType.Primitive + || GetMemberType(value.GetType())==MemberType.Unknown)) + depth = AddNode(value, null, ref document, itemNode, depth); + + else if (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition()==typeof (Grouping<,>)) { + var exactValue = (IEnumerable) value; + foreach (var val in exactValue) { + itemNode = document.CreateElement("Item" + itemIndex); + parentNode.AppendChild(itemNode); + itemIndex++; + var groupAttribute = document.CreateAttribute("group"); + groupAttribute.Value = groupIndex.ToString(); + var keyAttribute = document.CreateAttribute("key"); + keyAttribute.Value = KeyToString(value.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(value, null)); + itemNode.Attributes.Append(groupAttribute); + itemNode.Attributes.Append(keyAttribute); + var properties = val.GetType().GetProperties(); + foreach (var info in properties) + depth = AddNode(val, info, ref document, itemNode, depth); + } + groupIndex++; + } + + else { + var properties = value.GetType().GetProperties(); + foreach (var info in properties) + depth = AddNode(value, info, ref document, itemNode, depth); + } + } + } + + private void CorrectNodeTree(ref XmlDocument document) + { + FillLengths(ref document, document.DocumentElement.ChildNodes); + CorrectMaxLengths(ref document, document.DocumentElement.ChildNodes); + FillMaxLengths(ref document, document.DocumentElement.ChildNodes); + FillCorrectMaxLengths(ref document, document.DocumentElement.ChildNodes); + } + + private int AddNode(object value, PropertyInfo property, ref XmlDocument document, XmlNode parentNode, int depthValue) + { + var depth = depthValue; + + //One column of primitive type + + if (property==null) { + var propertyName = "CompilationResult"; + XmlElement node = document.CreateElement(propertyName); + var valueAttribute = document.CreateAttribute("value"); + var lengthAttribute = document.CreateAttribute("length"); + var depthAttribute = document.CreateAttribute("depth"); + lengthAttribute.Value = propertyName.Length.ToString(); + depthAttribute.Value = depth.ToString(); + node.Attributes.Append(lengthAttribute); + node.Attributes.Append(depthAttribute); + parentNode.AppendChild(node); + valueAttribute.Value = ReplaceTabs(value); + node.Attributes.Append(valueAttribute); + } + + else { + if (property.PropertyType.IsGenericType && + (property.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>) + || (property.PropertyType.GetGenericTypeDefinition()==typeof (IEnumerable<>)))) { + var enumerable = (IEnumerable) property.GetValue(value, property.GetIndexParameters()); + var list = new List(); + foreach (var o in enumerable) + list.Add(o); + CreateNodeTree(list, ref document, property.Name, parentNode); + } + else { + var memberType = GetMemberType(property.PropertyType); + XmlElement node = document.CreateElement(property.Name); + var valueAttribute = document.CreateAttribute("value"); + var lengthAttribute = document.CreateAttribute("length"); + var depthAttribute = document.CreateAttribute("depth"); + lengthAttribute.Value = property.Name.Length.ToString(); + depthAttribute.Value = depth.ToString(); + node.Attributes.Append(lengthAttribute); + node.Attributes.Append(depthAttribute); + + switch (memberType) { + case MemberType.Unknown: + if (ValueIsForOutput(property)) { + parentNode.AppendChild(node); + valueAttribute.Value = ReplaceTabs(property.GetValue(value, null)); + node.Attributes.Append(valueAttribute); + node.Attributes.Append(valueAttribute); + } + break; + case MemberType.Entity: + parentNode.AppendChild(node); + var entityValue = property.GetValue(value, null); + valueAttribute.Value = (entityValue!=null) ? entityValue.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(entityValue, null).ToString() : "NULL"; + node.Attributes.Append(valueAttribute); + break; + case MemberType.Structure: + case MemberType.Anonymous: + if (depth==treeDepth) + treeDepth += 1; + depth += 1; + parentNode.AppendChild(node); + var itemValue = property.GetValue(value, null); + var itemProperties = itemValue.GetType().GetProperties(); + foreach (var itemProperty in itemProperties) + AddNode(itemValue, itemProperty, ref document, node, depth); + depth -= 1; + break; + } + } + } + return depth; + } + + private void OutputLog(XmlDocument document, List groupHeader) + { + int currentGroup = 1; + if (groupHeader!=null) { + TestLog.Info(String.Empty); + TestLog.Info(CreateFillString(fillStringLength + 1, '*')); + TestLog.Info("| Key = " + document.DocumentElement.ChildNodes[0].Attributes["key"].Value); + foreach (var s in groupHeader) + TestLog.Info(s); + } + + foreach (XmlNode node in document.DocumentElement.ChildNodes) { + if (groupHeader!=null && Int32.Parse(node.Attributes["group"].Value) > currentGroup) { + TestLog.Info(String.Empty); + TestLog.Info(CreateFillString(fillStringLength + 1, '*')); + TestLog.Info("| Key = " + node.Attributes["key"].Value); + foreach (var s in groupHeader) + TestLog.Info(s); + currentGroup++; + } + + var nodes = node.Clone().SelectNodes("//*[@depth=1]"); + var helpList = new List>(); + var drawList = new List>(); + + for (int i = 0; i < nodes.Count; i++) { + if (!nodes[i].HasChildNodes) + helpList.Add(new Pair(nodes[i], 0)); + else { + var length = 0; + for (int j = i - 1; j >= 0; j = j - 1) { + if (nodes[j].HasChildNodes) + break; + length += Int32.Parse(nodes[j].Attributes["length"].Value); + } + helpList.Add(new Pair(nodes[i], length)); + } + drawList.Add(new Pair(nodes[i], 0)); + } + DrawSingleLine(drawList); + + for (int i = 2; i <= treeDepth; i++) { + drawList.Clear(); + nodes = node.Clone().SelectNodes("//*[@depth=" + i + "]"); + for (int j = 0; j < nodes.Count; j++) { + var val = helpList.Where(v => v.First.InnerXml==nodes[j].ParentNode.InnerXml); + var value = val!=null ? val.First() : new Pair(null, 0); + + if (((j > 0) && nodes[j - 1].ParentNode.InnerXml!=value.First.InnerXml) || j==0) + drawList.Add(new Pair(nodes[j], value.Second)); + else if ((j > 0) && nodes[j - 1].ParentNode.InnerXml==value.First.InnerXml) + drawList.Add(new Pair(nodes[j], 0)); + } + DrawSingleLine(drawList); + if (i==treeDepth) + break; + helpList.Clear(); + for (int l = 0; l < nodes.Count; l++) { + if (!nodes[l].HasChildNodes) + helpList.Add(new Pair(nodes[l], drawList[l].Second)); + else { + var length = 0; + for (int j = l - 1; j >= 0; j = j - 1) { + if (nodes[j].HasChildNodes) + break; + length += drawList[j].Second + Int32.Parse(drawList[j].First.Attributes["length"].Value); + } + helpList.Add(new Pair(nodes[l], length + drawList[l].Second)); + } + } + } + TestLog.Info(CreateFillString(fillStringLength + 1, '=')); + } + } + + private void DrawSingleLine(List> listOfNodes) + { + var str = new StringBuilder("|"); + var separateLine = new StringBuilder("|"); + bool drawSeporateLine = false; + foreach (var node in listOfNodes) { + if (!node.First.HasChildNodes) { + var partStr = new StringBuilder(); + partStr.Append(CreateFillString(node.Second!=0 ? node.Second - 1 : 0, ' ')) + .Append(node.Second!=0 ? "| " : " ") + .Append(node.First.Attributes["value"].Value).Append(CreateFillString(Int32.Parse + (node.First.Attributes["length"].Value) - node.First.Attributes["value"].Value.Length - 3, ' ')).Append("|"); + separateLine.Append(CreateFillString(partStr.Length, ' ')); + str.Append(partStr); + } + else { + var partStr = new StringBuilder(); + drawSeporateLine = true; + partStr.Append(CreateFillString(node.Second, ' ')); + foreach (XmlNode o in node.First.ChildNodes) { + partStr.Append(" ").Append(o.Name).Append(CreateFillString(Int32.Parse + (o.Attributes["length"].Value) - o.Name.Length - 3, ' ')).Append("|"); + } + separateLine.Append(CreateFillString(partStr.Length, '=')); + str.Append(partStr); + } + } + + if (str.Length < fillStringLength + 1) + str.Append(CreateFillString(fillStringLength - str.Length, ' ')).Append("|"); + if (separateLine.Length < fillStringLength + 1) + separateLine.Append(CreateFillString(fillStringLength - separateLine.Length, ' ')).Append("|"); + + if (str.ToString().EndsWith(" ")) + str.Replace(" ", "|", str.Length - 1, 1); + if (separateLine.ToString().EndsWith(" ")) + separateLine.Replace(" ", "|", str.Length - 1, 1); + + TestLog.Info(str.ToString()); + if (drawSeporateLine) + TestLog.Info(separateLine.ToString()); + } + + private MemberType GetMemberType(Type type) + { + if (typeof (Key).IsAssignableFrom(type)) + return MemberType.Key; + if (typeof (IEntity).IsAssignableFrom(type)) + return MemberType.Entity; + if (typeof (Structure).IsAssignableFrom(type)) + return MemberType.Structure; + if (typeof (EntitySetBase).IsAssignableFrom(type)) + return MemberType.EntitySet; + if (Attribute.IsDefined(type, typeof (CompilerGeneratedAttribute), false) + && type.BaseType==typeof (object) + && type.Name.Contains("AnonymousType") + && (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$")) + && (type.Attributes & TypeAttributes.NotPublic)==TypeAttributes.NotPublic) + return MemberType.Anonymous; + return MemberType.Unknown; + } + + private string ReplaceTabs(object value) + { + if (value==null) + return "NULL"; + if (value.GetType()==typeof (byte[])) + return "ByteArray"; + return value.ToString().Replace("-", " ").Replace("\n", string.Empty) + .Replace("\t", string.Empty).Replace("\\", string.Empty) + .Replace("\"", " ").Replace("\r", " ").Trim(); + } + + private string CreateFillString(int count, char element) + { + var list = Enumerable.Repeat(element, count); + string result = String.Empty; + foreach (var item in list) + result = result + item; + return result; + } + + private bool ValueIsForOutput(PropertyInfo info) + { + var memberType = GetMemberType(info.PropertyType); + return ((!info.CanWrite && info.PropertyType!=typeof (bool) + && memberType!=MemberType.Key + && info.PropertyType!=typeof (PersistenceState)) + || (info.CanWrite)) && info.DeclaringType!=typeof (Persistent) + && info.DeclaringType!=typeof (SessionBound) + && memberType!=MemberType.EntitySet; + } + + private string KeyToString(object key) + { + var properties = key.GetType().GetProperties(); + var str = new StringBuilder("{ "); + switch (GetMemberType(key.GetType())) { + case MemberType.Structure: + case MemberType.Anonymous: + foreach (var info in properties) { + if (ValueIsForOutput(info)) { + str.Append(info.Name).Append(" = "); + var propertyValue = info.GetValue(key, null); + if (GetMemberType(info.PropertyType)==MemberType.Entity) + str.Append((propertyValue!=null) ? info.PropertyType.GetProperty(Orm.WellKnown.KeyFieldName).GetValue(propertyValue, null).ToString() : "NULL"); + if (GetMemberType(info.PropertyType)==MemberType.Structure || GetMemberType(info.PropertyType)==MemberType.Anonymous) + str.Append(ReplaceTabs(KeyToString(info.GetValue(key, null)))); + else + str.Append(ReplaceTabs(propertyValue)) + .Append(" , "); + } + } + break; + case MemberType.Entity: + str.Append(key.GetType().GetProperty(Orm.WellKnown.KeyFieldName).GetValue(key, null).ToString()); + break; + + default: + str.Append(ReplaceTabs(key)); + break; + } + if (str[str.Length - 2]==',') + str.Remove(str.Length - 2, 2); + return str.Append(" }").ToString(); + } + + private static void EnumerateAll(IEnumerable enumerable) + { + foreach (var o in enumerable) + if (o!=null) { + if (o.GetType().IsGenericType && (o.GetType().GetGenericTypeDefinition()==typeof (IQueryable<>) + || o.GetType().GetGenericTypeDefinition()==typeof (IEnumerable<>) + || o.GetType().GetGenericTypeDefinition()==typeof (SubQuery<>) + || o.GetType().GetGenericTypeDefinition()==typeof (Grouping<,>))) + EnumerateAll((IEnumerable) o); + var properties = o.GetType().GetProperties(); + foreach (var info in properties) { + if (info.PropertyType.IsGenericType && + (info.PropertyType.GetGenericTypeDefinition()==typeof (IQueryable<>) + || info.PropertyType.GetGenericTypeDefinition()==typeof (IEnumerable<>) + || info.PropertyType.GetGenericTypeDefinition()==typeof (SubQuery<>) + || info.PropertyType.GetGenericTypeDefinition()==typeof (Grouping<,>) + )) + EnumerateAll((IEnumerable) info.GetValue(o, null)); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/QueryMethodTests.cs b/Orm/Xtensive.Orm.Tests/Linq/QueryMethodTests.cs index b35f8578a0..948c665b18 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/QueryMethodTests.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/QueryMethodTests.cs @@ -1,152 +1,152 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.15 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class QueryMethodTests : ChinookDOModelTest - { - [Test] - public void SingleParameterTest() - { - var key = Session.Query.All().First().Key; - var query = Session.Query.All().Where(c => c==Session.Query.Single(key)); - var expected = Session.Query.All().AsEnumerable().Where(c => c==Session.Query.Single(key)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SingleSubqueryNonGenericTest() - { - var query = Session.Query.All() - .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); - Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); - } - - [Test] - public void SingleSubqueryKeyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SingleSubqueryTupleTest() - { - var query = Session.Query.All() - .Where(c => c == Session.Query.Single(Session.Query.All().FirstOrDefault().CustomerId)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c == Session.Query.Single(Session.Query.All().FirstOrDefault().CustomerId)); - Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); - } - - [Test] - public void SingleOrDefaultParameterTest() - { - var key = Session.Query.All().First().Key; - var query = Session.Query.All() - .Where(c => c==Session.Query.SingleOrDefault(key)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.SingleOrDefault(key)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SingleOrDefaultSubqueryNonGenericTest() - { - var query = Session.Query.All() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); - Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); - } - - [Test] - public void SingleOrDefaultSubqueryKeyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void SingleOrDefaultSubqueryTupleTest() - { - var query = Session.Query.All() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().CustomerId)); - var expected = Session.Query.All().AsEnumerable() - .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().CustomerId)); - Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); - } - - [Test] - public void Store1Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var localCustomers = Session.Query.All().Take(10).ToList(); - var query = Session.Query.All() - .Join( - Session.Query.Store(localCustomers), - customer => customer, - localCustomer => localCustomer, - (customer, localCustomer) => new {customer, localCustomer}); - var expected = Session.Query.All().AsEnumerable() - .Join( - Session.Query.Store(localCustomers), - customer => customer, - localCustomer => localCustomer, - (customer, localCustomer) => new {customer, localCustomer}); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void Store2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - - var query = Session.Query.All() - .Join( - Session.Query.Store(Session.Query.All().Take(10)), - customer => customer, - localCustomer => localCustomer, - (customer, localCustomer) => new {customer, localCustomer}); - var expected = Session.Query.All().AsEnumerable() - .Join( - Session.Query.Store(Session.Query.All().Take(10)), - customer => customer, - localCustomer => localCustomer, - (customer, localCustomer) => new {customer, localCustomer}); - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0, expected.Except(query).Count()); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.15 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class QueryMethodTests : ChinookDOModelTest + { + [Test] + public void SingleParameterTest() + { + var key = Session.Query.All().First().Key; + var query = Session.Query.All().Where(c => c==Session.Query.Single(key)); + var expected = Session.Query.All().AsEnumerable().Where(c => c==Session.Query.Single(key)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SingleSubqueryNonGenericTest() + { + var query = Session.Query.All() + .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); + Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); + } + + [Test] + public void SingleSubqueryKeyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.Single(Session.Query.All().FirstOrDefault().Key)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SingleSubqueryTupleTest() + { + var query = Session.Query.All() + .Where(c => c == Session.Query.Single(Session.Query.All().FirstOrDefault().CustomerId)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c == Session.Query.Single(Session.Query.All().FirstOrDefault().CustomerId)); + Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); + } + + [Test] + public void SingleOrDefaultParameterTest() + { + var key = Session.Query.All().First().Key; + var query = Session.Query.All() + .Where(c => c==Session.Query.SingleOrDefault(key)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.SingleOrDefault(key)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SingleOrDefaultSubqueryNonGenericTest() + { + var query = Session.Query.All() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); + Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); + } + + [Test] + public void SingleOrDefaultSubqueryKeyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().Key)); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void SingleOrDefaultSubqueryTupleTest() + { + var query = Session.Query.All() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().CustomerId)); + var expected = Session.Query.All().AsEnumerable() + .Where(c => c==Session.Query.SingleOrDefault(Session.Query.All().FirstOrDefault().CustomerId)); + Assert.Throws(() => Assert.AreEqual(0, expected.Except(query).Count())); + } + + [Test] + public void Store1Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var localCustomers = Session.Query.All().Take(10).ToList(); + var query = Session.Query.All() + .Join( + Session.Query.Store(localCustomers), + customer => customer, + localCustomer => localCustomer, + (customer, localCustomer) => new {customer, localCustomer}); + var expected = Session.Query.All().AsEnumerable() + .Join( + Session.Query.Store(localCustomers), + customer => customer, + localCustomer => localCustomer, + (customer, localCustomer) => new {customer, localCustomer}); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void Store2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + + var query = Session.Query.All() + .Join( + Session.Query.Store(Session.Query.All().Take(10)), + customer => customer, + localCustomer => localCustomer, + (customer, localCustomer) => new {customer, localCustomer}); + var expected = Session.Query.All().AsEnumerable() + .Join( + Session.Query.Store(Session.Query.All().Take(10)), + customer => customer, + localCustomer => localCustomer, + (customer, localCustomer) => new {customer, localCustomer}); + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0, expected.Except(query).Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/QueryPreprocessorSortingTest.cs b/Orm/Xtensive.Orm.Tests/Linq/QueryPreprocessorSortingTest.cs index 36cab0cee4..ef69bcc654 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/QueryPreprocessorSortingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/QueryPreprocessorSortingTest.cs @@ -1,155 +1,155 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.07.02 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class QueryPreprocessorSortingTest - { - [Service(typeof (IQueryPreprocessor))] - public class NewPreprocessor : QueryPreprocessor - { - public static int CallCount = 0; - - public override Expression Apply(Session session, Expression query) - { - CallCount++; - return query; - } - } - - public class PreprocessorBase : IQueryPreprocessor - { - private static bool Enabled; - - private static readonly List CallSequence = new List(); - - public virtual Expression Apply(Expression query) - { - if (Enabled) - CallSequence.Add(this); - - return query; - } - - public virtual bool IsDependentOn(IQueryPreprocessor other) - { - return false; - } - - public static List GetCallSequence() - { - return CallSequence.ToList(); - } - - public static IDisposable EnableTracking() - { - CallSequence.Clear(); - - Enabled = true; - - return new Disposable(_ => Enabled = false); - } - } - - [Service(typeof (IQueryPreprocessor))] - public class Preprocessor1 : PreprocessorBase - { - } - - [Service(typeof (IQueryPreprocessor))] - public class Preprocessor2 : PreprocessorBase - { - public override bool IsDependentOn(IQueryPreprocessor other) - { - return other is Preprocessor1; - } - } - - [Service(typeof (IQueryPreprocessor))] - public class PreprocessorA : PreprocessorBase - { - public override bool IsDependentOn(IQueryPreprocessor other) - { - return other is PreprocessorC; - } - } - - [Service(typeof (IQueryPreprocessor))] - public class PreprocessorB : PreprocessorBase - { - public override bool IsDependentOn(IQueryPreprocessor other) - { - return other is PreprocessorA; - } - } - - [Service(typeof (IQueryPreprocessor))] - public class PreprocessorC : PreprocessorBase - { - public override bool IsDependentOn(IQueryPreprocessor other) - { - return other is PreprocessorB; - } - } - - [Test] - public void SuccessTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (Preprocessor1)); - configuration.Types.Register(typeof (Preprocessor2)); - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) - using (PreprocessorBase.EnableTracking()) { - var q = session.Query.All().ToList(); - } - - var callSequence = PreprocessorBase.GetCallSequence(); - Assert.That(callSequence.Count, Is.EqualTo(2)); - Assert.That(callSequence[0] is Preprocessor1); - Assert.That(callSequence[1] is Preprocessor2); - } - - [Test] - public void FailureTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (PreprocessorA)); - configuration.Types.Register(typeof (PreprocessorB)); - configuration.Types.Register(typeof (PreprocessorC)); - - AssertEx.ThrowsInvalidOperationException(() => Domain.Build(configuration)); - } - - [Test] - public void NewPreprocessorTest() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (NewPreprocessor)); - - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - NewPreprocessor.CallCount = 0; - var q = session.Query.All().ToList(); - Assert.That(NewPreprocessor.CallCount, Is.EqualTo(1)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.07.02 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class QueryPreprocessorSortingTest + { + [Service(typeof (IQueryPreprocessor))] + public class NewPreprocessor : QueryPreprocessor + { + public static int CallCount = 0; + + public override Expression Apply(Session session, Expression query) + { + CallCount++; + return query; + } + } + + public class PreprocessorBase : IQueryPreprocessor + { + private static bool Enabled; + + private static readonly List CallSequence = new List(); + + public virtual Expression Apply(Expression query) + { + if (Enabled) + CallSequence.Add(this); + + return query; + } + + public virtual bool IsDependentOn(IQueryPreprocessor other) + { + return false; + } + + public static List GetCallSequence() + { + return CallSequence.ToList(); + } + + public static IDisposable EnableTracking() + { + CallSequence.Clear(); + + Enabled = true; + + return new Disposable(_ => Enabled = false); + } + } + + [Service(typeof (IQueryPreprocessor))] + public class Preprocessor1 : PreprocessorBase + { + } + + [Service(typeof (IQueryPreprocessor))] + public class Preprocessor2 : PreprocessorBase + { + public override bool IsDependentOn(IQueryPreprocessor other) + { + return other is Preprocessor1; + } + } + + [Service(typeof (IQueryPreprocessor))] + public class PreprocessorA : PreprocessorBase + { + public override bool IsDependentOn(IQueryPreprocessor other) + { + return other is PreprocessorC; + } + } + + [Service(typeof (IQueryPreprocessor))] + public class PreprocessorB : PreprocessorBase + { + public override bool IsDependentOn(IQueryPreprocessor other) + { + return other is PreprocessorA; + } + } + + [Service(typeof (IQueryPreprocessor))] + public class PreprocessorC : PreprocessorBase + { + public override bool IsDependentOn(IQueryPreprocessor other) + { + return other is PreprocessorB; + } + } + + [Test] + public void SuccessTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (Preprocessor1)); + configuration.Types.Register(typeof (Preprocessor2)); + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) + using (PreprocessorBase.EnableTracking()) { + var q = session.Query.All().ToList(); + } + + var callSequence = PreprocessorBase.GetCallSequence(); + Assert.That(callSequence.Count, Is.EqualTo(2)); + Assert.That(callSequence[0] is Preprocessor1); + Assert.That(callSequence[1] is Preprocessor2); + } + + [Test] + public void FailureTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (PreprocessorA)); + configuration.Types.Register(typeof (PreprocessorB)); + configuration.Types.Register(typeof (PreprocessorC)); + + AssertEx.ThrowsInvalidOperationException(() => Domain.Build(configuration)); + } + + [Test] + public void NewPreprocessorTest() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (NewPreprocessor)); + + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + NewPreprocessor.CallCount = 0; + var q = session.Query.All().ToList(); + Assert.That(NewPreprocessor.CallCount, Is.EqualTo(1)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/QueryRootOverriding.cs b/Orm/Xtensive.Orm.Tests/Linq/QueryRootOverriding.cs index 343519939a..d70e8137da 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/QueryRootOverriding.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/QueryRootOverriding.cs @@ -1,170 +1,170 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.02 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.QueryRootOverridingModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace QueryRootOverridingModel - { - public interface IHidden : IEntity - { - [Field] - bool IsHidden { get; } - } - - [HierarchyRoot] - public class RefEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public HiddenEntity Ref { get; set; } - } - - [HierarchyRoot] - public class NormalEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [HierarchyRoot] - public class HiddenEntity : Entity, IHidden - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public bool IsHidden { get; set; } - } - - public abstract class QueryFilter - { - public abstract IQueryable Apply(IQueryable root); - } - - public class HiddenEntityFilter : QueryFilter - where T : IHidden - { - public override IQueryable Apply(IQueryable root) - { - var typedRoot = (IQueryable) root; - return typedRoot.Where(t => !t.IsHidden); - } - } - - public class FilteringRootBuilder : IQueryRootBuilder - { - private readonly QueryEndpoint query; - - public Expression BuildRootExpression(Type entityType) - { - if (!typeof (IHidden).IsAssignableFrom(entityType)) - return query.All(entityType).Expression; - return CreateFilter(entityType).Apply(query.All(entityType)).Expression; - } - - private static QueryFilter CreateFilter(Type entityType) - { - return (QueryFilter) Activator.CreateInstance(typeof (HiddenEntityFilter<>).MakeGenericType(entityType)); - } - - public FilteringRootBuilder(QueryEndpoint query) - { - this.query = query; - } - } - } - - public class QueryRootOverriding : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (NormalEntity).Assembly, typeof (NormalEntity).Namespace); - return config; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new NormalEntity(); - new RefEntity {Ref = new HiddenEntity()}; - new RefEntity {Ref = new HiddenEntity {IsHidden = true}}; - tx.Complete(); - } - } - - [Test] - public void NormalEntityQuery() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(1)); - tx.Complete(); - } - } - - [Test] - public void HiddenEntityQueryWithoutFilter() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void HiddenEntityQueryWithFilterViaSystemQuery() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { - var count = session.SystemQuery.All().Count(); - Assert.That(count, Is.EqualTo(2)); - tx.Complete(); - } - } - - [Test] - public void HiddenEntityQueryWithFilter() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { - var count = session.Query.All().Count(); - Assert.That(count, Is.EqualTo(1)); - tx.Complete(); - } - } - - [Test] - public void JoinWithHiddenEntity() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { - var count = session.Query - .All() - .Join(session.Query.All(), r => r.Ref.Id, h => h.Id, (r, h) => h) - .Count(); - Assert.That(count, Is.EqualTo(1)); - tx.Complete(); - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.02 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.QueryRootOverridingModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace QueryRootOverridingModel + { + public interface IHidden : IEntity + { + [Field] + bool IsHidden { get; } + } + + [HierarchyRoot] + public class RefEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public HiddenEntity Ref { get; set; } + } + + [HierarchyRoot] + public class NormalEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [HierarchyRoot] + public class HiddenEntity : Entity, IHidden + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public bool IsHidden { get; set; } + } + + public abstract class QueryFilter + { + public abstract IQueryable Apply(IQueryable root); + } + + public class HiddenEntityFilter : QueryFilter + where T : IHidden + { + public override IQueryable Apply(IQueryable root) + { + var typedRoot = (IQueryable) root; + return typedRoot.Where(t => !t.IsHidden); + } + } + + public class FilteringRootBuilder : IQueryRootBuilder + { + private readonly QueryEndpoint query; + + public Expression BuildRootExpression(Type entityType) + { + if (!typeof (IHidden).IsAssignableFrom(entityType)) + return query.All(entityType).Expression; + return CreateFilter(entityType).Apply(query.All(entityType)).Expression; + } + + private static QueryFilter CreateFilter(Type entityType) + { + return (QueryFilter) Activator.CreateInstance(typeof (HiddenEntityFilter<>).MakeGenericType(entityType)); + } + + public FilteringRootBuilder(QueryEndpoint query) + { + this.query = query; + } + } + } + + public class QueryRootOverriding : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (NormalEntity).Assembly, typeof (NormalEntity).Namespace); + return config; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new NormalEntity(); + new RefEntity {Ref = new HiddenEntity()}; + new RefEntity {Ref = new HiddenEntity {IsHidden = true}}; + tx.Complete(); + } + } + + [Test] + public void NormalEntityQuery() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(1)); + tx.Complete(); + } + } + + [Test] + public void HiddenEntityQueryWithoutFilter() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void HiddenEntityQueryWithFilterViaSystemQuery() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { + var count = session.SystemQuery.All().Count(); + Assert.That(count, Is.EqualTo(2)); + tx.Complete(); + } + } + + [Test] + public void HiddenEntityQueryWithFilter() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { + var count = session.Query.All().Count(); + Assert.That(count, Is.EqualTo(1)); + tx.Complete(); + } + } + + [Test] + public void JoinWithHiddenEntity() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + using (session.OverrideQueryRoot(new FilteringRootBuilder(session.Query))) { + var count = session.Query + .All() + .Join(session.Query.All(), r => r.Ref.Id, h => h.Id, (r, h) => h) + .Count(); + Assert.That(count, Is.EqualTo(1)); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/RefTest.cs b/Orm/Xtensive.Orm.Tests/Linq/RefTest.cs index ffa75443e7..05fc6c3b37 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/RefTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/RefTest.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.16 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using System.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - [Ignore("")] - public class RefTest : ChinookDOModelTest - { - private class X - { - public Ref InvoiceRef; - public int SomeInt; - } - - [Test] - public void GetEntityTest() - { - var xs = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10).Select((invoice, index) => - new X { - InvoiceRef = (Ref) invoice.Key, - SomeInt = index - }) - .ToList(); - - var query = - from i in Session.Query.All() - from x in Session.Query.Store(xs) - where i==x.InvoiceRef.Value - select i; - - var expected = - from i in Session.Query.All().AsEnumerable() - from x in xs - where i==x.InvoiceRef.Value - select i; - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0 , expected.Except(query).Count()); - } - - [Test] - public void GetEntity2Test() - { - var xs = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10).Select((invoice, index) => - new X { - InvoiceRef = (Ref) invoice.Key, - SomeInt = index - }) - .ToList(); - - var query = - from i in Session.Query.All() - from x in xs - where i==x.InvoiceRef.Value - select i; - - var expected = - from i in Session.Query.All().AsEnumerable() - from x in xs - where i==x.InvoiceRef.Value - select i; - - Assert.That(query, Is.Not.Empty); - Assert.AreEqual(0 , expected.Except(query).Count()); - } - - [Test] - public void KeyTest() - { - var refs = Session.Query.All().Take(10).Select(invoice => (Ref) invoice).ToList(); - var query = Session.Query.All() - .Join(refs, invoice => invoice.Key, @ref => @ref.Key, (invoice, key) => new {invoice, key}); - - Assert.That(query, Is.Not.Empty); - QueryDumper.Dump(query); - - var expectedQuery = Session.Query.All().AsEnumerable() - .Join(refs, invoice => invoice.Key, @ref => @ref.Key, (invoice, key) => new {invoice, key}); - - Assert.AreEqual(0, expectedQuery.Except(query).Count()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.16 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using System.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + [Ignore("")] + public class RefTest : ChinookDOModelTest + { + private class X + { + public Ref InvoiceRef; + public int SomeInt; + } + + [Test] + public void GetEntityTest() + { + var xs = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10).Select((invoice, index) => + new X { + InvoiceRef = (Ref) invoice.Key, + SomeInt = index + }) + .ToList(); + + var query = + from i in Session.Query.All() + from x in Session.Query.Store(xs) + where i==x.InvoiceRef.Value + select i; + + var expected = + from i in Session.Query.All().AsEnumerable() + from x in xs + where i==x.InvoiceRef.Value + select i; + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0 , expected.Except(query).Count()); + } + + [Test] + public void GetEntity2Test() + { + var xs = Session.Query.All().OrderBy(i => i.InvoiceId).Take(10).Select((invoice, index) => + new X { + InvoiceRef = (Ref) invoice.Key, + SomeInt = index + }) + .ToList(); + + var query = + from i in Session.Query.All() + from x in xs + where i==x.InvoiceRef.Value + select i; + + var expected = + from i in Session.Query.All().AsEnumerable() + from x in xs + where i==x.InvoiceRef.Value + select i; + + Assert.That(query, Is.Not.Empty); + Assert.AreEqual(0 , expected.Except(query).Count()); + } + + [Test] + public void KeyTest() + { + var refs = Session.Query.All().Take(10).Select(invoice => (Ref) invoice).ToList(); + var query = Session.Query.All() + .Join(refs, invoice => invoice.Key, @ref => @ref.Key, (invoice, key) => new {invoice, key}); + + Assert.That(query, Is.Not.Empty); + QueryDumper.Dump(query); + + var expectedQuery = Session.Query.All().AsEnumerable() + .Join(refs, invoice => invoice.Key, @ref => @ref.Key, (invoice, key) => new {invoice, key}); + + Assert.AreEqual(0, expectedQuery.Except(query).Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SearchConditionNodeVisitorTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SearchConditionNodeVisitorTest.cs index 6f1551d7cf..dee7a67d26 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SearchConditionNodeVisitorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SearchConditionNodeVisitorTest.cs @@ -1,1619 +1,1619 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.12.08 - -using System; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.FullTextSearchCondition; -using Xtensive.Orm.FullTextSearchCondition.Interfaces; -using Xtensive.Orm.FullTextSearchCondition.Internals; -using Xtensive.Orm.FullTextSearchCondition.Nodes; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Linq.SearchConditionNodeTranslationModel; - -namespace Xtensive.Orm.Tests.Linq.SearchConditionNodeTranslationModel -{ - [HierarchyRoot] - public class TestEntityWithFullText : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - [FullText("English")] - public string Title { get; set; } - - [Field] - [FullText("English")] - public string Text { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class SearchConditionNodeVisitorTest : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.SingleKeyRankTableFullText); - } - - [Test] - public void Test001() - { - Expression> sc = e => e.SimpleTerm("abc"); - string expectedTranslation = "abc"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test002() - { - Expression> sc = e => e.SimpleTerm(""); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test003() - { - Expression> sc = e => e.SimpleTerm(" "); - string expectedTranslation = "dummy".Trim(); - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test004() - { - Expression> sc = e => e.SimpleTerm(null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test005() - { - Expression> sc = e => e.SimpleTerm(" abc "); - string expectedTranslation = "abc"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test006() - { - Expression> sc = e => e.SimpleTerm("Once upon a time"); - string expectedTranslation = "\"Once upon a time\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test007() - { - Expression> sc = e => e.PrefixTerm("dis"); - string expectedTranslation = "\"dis*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test008() - { - Expression> sc = e => e.PrefixTerm(""); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test009() - { - Expression> sc = e => e.PrefixTerm(" "); - string expectedTranslation = "dummy".Trim(); - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test010() - { - Expression> sc = e => e.PrefixTerm(null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test011() - { - Expression> sc = e => e.PrefixTerm(" dis "); - string expectedTranslation = "\"dis*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test012() - { - Expression> sc = e => e.PrefixTerm("kill all humans"); - string expectedTranslation = "\"kill all humans*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test013() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] {"abc"}); - string expectedTranslation = "FORMSOF (INFLECTIONAL, abc)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test014() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new string[0]); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test015() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test016() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", "" }); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test017() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", null }); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test018() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " " }); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test019() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"abc"}); - string expectedTranslation = "FORMSOF (THESAURUS, abc)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test020() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"abc", "def", "ghi"}); - string expectedTranslation = "FORMSOF (THESAURUS, abc, def, ghi)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test021() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {" abc ", "def ", " ghi"}); - string expectedTranslation = "FORMSOF (THESAURUS, abc, def, ghi)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test022() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"a b c", "d f g"}); - string expectedTranslation = "FORMSOF (THESAURUS, \"a b c\", \"d f g\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test023() - { - Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"Because I do not listen it does not mean I do not care"}); - string expectedTranslation = "FORMSOF (THESAURUS, \"Because I do not listen it does not mean I do not care\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test024() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test025() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc")); - string expectedTranslation = ""; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test026() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("").NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test027() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test028() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm(null).NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test029() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(null)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test030() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm(" ").NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test031() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" ")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test032() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test033() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm("")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test034() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(null).NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test035() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(null)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test036() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test037() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(" ").NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test038() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" ")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test039() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" sdf rrr ")); - string expectedTranslation = "abc NEAR def NEAR \"sdf rrr\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test040() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def").NearPrefixTerm("ghi")); - string expectedTranslation = "abc NEAR def NEAR \"ghi*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test041() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm("ghi").NearSimpleTerm("jkl")); - string expectedTranslation = "abc NEAR \"ghi*\" NEAR jkl"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test042() - { - Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm("ghi").NearPrefixTerm("jkl")); - string expectedTranslation = "abc NEAR \"ghi*\" NEAR \"jkl*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test043() - { - Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(" abc ").NearPrefixTerm(" def ghi ").NearPrefixTerm("aaaa")); - string expectedTranslation = "\"abc*\" NEAR \"def ghi*\" NEAR \"aaaa*\""; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test044() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test045() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test046() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("").NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test047() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test048() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm(" ").NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test049() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" ")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test050() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm(null).NearSimpleTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test051() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(null)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test052() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm("")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test053() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test054() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" ")); - string expectedTranslation = "dummy"; - Assert.Throws(() =>CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test055() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm(" ").NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test056() - { - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(null)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test057() - { - Require.ProviderVersionAtLeast(new Version(11,0)); - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm(null).NearPrefixTerm("abc")); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test058() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" aaaaa b c ")); - string expectedTranslation = "NEAR (abc, def, \"aaaaa b c\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test059() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearPrefixTerm(" aaaaa b c ")); - string expectedTranslation = "NEAR (abc, def, \"aaaaa b c*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test060() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm(" def ").NearSimpleTerm(" aaaaa b c ")); - string expectedTranslation = "NEAR (abc, \"def*\", \"aaaaa b c\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test061() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" aaaaa b c ")); - string expectedTranslation = "NEAR (\"abc*\", def, \"aaaaa b c\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test062() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" def ").NearPrefixTerm(" aaaaa b c ")); - string expectedTranslation = "NEAR (\"abc*\", \"def*\", \"aaaaa b c*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test063() - { - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), -1); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test064() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 0); - string expectedTranslation = "NEAR (abc, def, 0)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test065() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 3333); - string expectedTranslation = "NEAR (abc, def, 3333)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test066() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967294); - string expectedTranslation = "NEAR (abc, def, 4294967294)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test067() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967295); - string expectedTranslation = "NEAR (abc, def, 4294967295)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test068() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967296); - string expectedTranslation = "NEAR (abc, def, MAX)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test069() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), long.MaxValue); - string expectedTranslation = "NEAR (abc, def, MAX)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test070() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 5, false); - string expectedTranslation = "NEAR (abc, def, 5)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test071() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 5, true); - string expectedTranslation = "NEAR (abc, def, 5, TRUE)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test072() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("") - .AndSimpleTerm("def") - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test073() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm("") - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test074() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm("def") - .AndSimpleTerm("") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test075() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm(" ") - .AndSimpleTerm("def") - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test076() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm(" ") - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test077() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm("def") - .AndSimpleTerm(" ") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test078() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm(null) - .AndSimpleTerm("def") - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test079() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm(null) - .AndSimpleTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test080() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndSimpleTerm("def") - .AndSimpleTerm(null) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test081() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("", 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test082() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm("", 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test083() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm("", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test084() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm(" ", 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test085() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm(" ", 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test086() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm(" ", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test087() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm(null, 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test088() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm(null, 0.1f) - .AndSimpleTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test089() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndSimpleTerm("def", 0.1f) - .AndSimpleTerm(null, 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test090() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("") - .AndPrefixTerm("def") - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test091() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm("") - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test092() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm("def") - .AndPrefixTerm("") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test093() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm(" ") - .AndPrefixTerm("def") - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test094() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm(" ") - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test095() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm("def") - .AndPrefixTerm(" ") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test096() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm(null) - .AndPrefixTerm("def") - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test097() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm(null) - .AndPrefixTerm("ghi") - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test098() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc") - .AndPrefixTerm("def") - .AndPrefixTerm(null) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test099() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("", 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test100() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm("", 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test101() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm("", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test102() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm(" ", 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() =>CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test103() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm(" ", 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test104() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm(" ", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test105() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm(null, 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test106() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm(null, 0.1f) - .AndPrefixTerm("ghi", 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test107() - { - Expression> sc = e => e.WeightedTerm( - f => f.PrefixTerm("abc", 0.1f) - .AndPrefixTerm("def", 0.1f) - .AndPrefixTerm(null, 0.1f) - ); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test108() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, null)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test109() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", null})); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test110() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new string[0])); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test111() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", ""})); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test112() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", " "})); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test113() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, null, 0.1f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test114() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", null }, 0.1f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test115() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new string[0], 0.1f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test116() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", "" }, 0.1f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test117() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", " " }, 0.1f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test118() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc"})); - string expectedTranslation = "ISABOUT (FORMSOF (THESAURUS, abc))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test119() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Inflectional, new[] {"abc"})); - string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test120() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Thesaurus, new[] {"abc"}, 0.1f)); - string expectedTranslation = "ISABOUT (FORMSOF (THESAURUS, abc) WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test121() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Inflectional, new[] {"abc"}, 0.1f)); - string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc) WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test122() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " def ", " ghi jkl " })); - string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc, def, \"ghi jkl\"))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test123() - { - Expression> sc = e => e.WeightedTerm( - f => f.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " def ", " ghi jkl " }, 0.1f)); - string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc, def, \"ghi jkl\") WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test124() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g=>g.SimpleTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test125() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test126() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(null))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test127() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm(null).NearSimpleTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test128() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(""))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test129() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm("").NearSimpleTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test130() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(" "))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test131() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.SimpleTerm(" ").NearSimpleTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test132() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(""))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test133() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm("").NearPrefixTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test134() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(" "))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test135() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm(" ").NearPrefixTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test136() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(null))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test137() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm(null).NearPrefixTerm("abc"))); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test138() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm(" abc ").NearPrefixTerm(" ccc ddd ").NearSimpleTerm(" bbb ccc ").NearSimpleTerm(" aaa "))); - string expectedTranslation = "ISABOUT (\"abc*\" NEAR \"ccc ddd*\" NEAR \"bbb ccc\" NEAR aaa)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test139() - { - Expression> sc = e => e.WeightedTerm( - f => f.ProximityTerm(g => g.PrefixTerm(" abc ").NearPrefixTerm(" ccc ddd ").NearSimpleTerm(" bbb ccc ").NearSimpleTerm(" aaa "), 0.1f)); - string expectedTranslation = "ISABOUT (\"abc*\" NEAR \"ccc ddd*\" NEAR \"bbb ccc\" NEAR aaa WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - - [Test] - public void Test140() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -2.0f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test141() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -1.0f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test142() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -0.001f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test143() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.000f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.000))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test144() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.001f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.001))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test145() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.1f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test146() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.9f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.900))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test147() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.998f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.998))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test148() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 1.0f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (1.000))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test149() - { - Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 1.001f)); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test150() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndGenerationTerm(GenerationType.Thesaurus, new []{"abc"}) - .AndPrefixTerm("abc") - .AndProximityTerm(g=>g.SimpleTerm("abc").NearPrefixTerm("def"))); - string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test151() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) - .AndPrefixTerm("abc") - .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.100), FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test152() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }, 0.1f) - .AndPrefixTerm("abc") - .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); - string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc) WEIGHT (0.100), \"abc*\", abc NEAR \"def*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test153() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) - .AndPrefixTerm("abc", 0.1f) - .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); - string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\" WEIGHT (0.100), abc NEAR \"def*\")"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test154() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc") - .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) - .AndPrefixTerm("abc") - .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"),0.1f)); - string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\" WEIGHT (0.100))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test155() - { - Expression> sc = e => e.WeightedTerm( - f => f.SimpleTerm("abc", 0.1f) - .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }, 0.2f) - .AndPrefixTerm("abc", 0.3f) - .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"), 0.4f)); - string expectedTranslation = "ISABOUT (abc WEIGHT (0.100), FORMSOF (THESAURUS, abc) WEIGHT (0.200), \"abc*\" WEIGHT (0.300), abc NEAR \"def*\" WEIGHT (0.400))"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test156() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test157() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(null, 5); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test158() - { - Require.ProviderVersionAtLeast(new Version(11, 0)); - Expression> sc = e => e.CustomProximityTerm(null, 5, true); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test159() - { - Expression> sc = e => e.GenericProximityTerm(null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test160() - { - Expression> sc = e => e.WeightedTerm(null); - string expectedTranslation = "dummy"; - Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); - } - - [Test] - public void Test161() - { - Expression> sc = e => e.SimpleTerm("abc").And().ComplexTerm(f => f.SimpleTerm("def")); - string expectedTranslation = "abc AND (def)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test162() - { - Expression> sc = e => e.ComplexTerm(f => f.SimpleTerm("abc")).And().SimpleTerm("def"); - string expectedTranslation = "(abc) AND def"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test163() - { - Expression> sc = - e => e.SimpleTerm("abc") - .And() - .ComplexTerm(f => f.SimpleTerm("def") - .And() - .ComplexTerm(g => g.SimpleTerm("aaa").Or().SimpleTerm("bbb")) - .AndNot() - .PrefixTerm("ghi") - .Or() - .ComplexTerm(h => h.GenerationTerm(GenerationType.Thesaurus, new[] { "www" })) - .And() - .SimpleTerm("xyz")); - string expectedTranslation = "abc AND (def AND (aaa OR bbb) AND NOT \"ghi*\" OR (FORMSOF (THESAURUS, www)) AND xyz)"; - CompileAndTest(sc, expectedTranslation); - } - - [Test] - public void Test164() - { - Expression> sc = - e => e.SimpleTerm("abc") - .And() - .SimpleTerm("def") - .AndNot() - .PrefixTerm("ghi") - .Or() - .GenerationTerm(GenerationType.Thesaurus, new[] { "www" }) - .And() - .SimpleTerm("xyz"); - string expectedTranslation = "abc AND def AND NOT \"ghi*\" OR FORMSOF (THESAURUS, www) AND xyz"; - CompileAndTest(sc, expectedTranslation); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntityWithFullText)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - private void CompileAndTest(Expression> searchConditionExpression, string expectedTranslation) - { - var visitor = Domain.Handler.GetSearchConditionCompiler(); - var searchCondition = searchConditionExpression.Compile(); - searchCondition.Invoke(SearchConditionNodeFactory.CreateConditonRoot()).AcceptVisitor(visitor); - Assert.That(visitor.CurrentOutput, Is.EqualTo(expectedTranslation)); - - using (var sesion = Domain.OpenSession()) - using (var transaction = sesion.OpenTransaction()) { - //Assert.DoesNotThrow(sesion.Query.ContainsTable(searchConditionExpression).Run); - sesion.Query.ContainsTable(searchConditionExpression).Run(); - } - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.12.08 + +using System; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.FullTextSearchCondition; +using Xtensive.Orm.FullTextSearchCondition.Interfaces; +using Xtensive.Orm.FullTextSearchCondition.Internals; +using Xtensive.Orm.FullTextSearchCondition.Nodes; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Linq.SearchConditionNodeTranslationModel; + +namespace Xtensive.Orm.Tests.Linq.SearchConditionNodeTranslationModel +{ + [HierarchyRoot] + public class TestEntityWithFullText : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + [FullText("English")] + public string Title { get; set; } + + [Field] + [FullText("English")] + public string Text { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class SearchConditionNodeVisitorTest : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.SingleKeyRankTableFullText); + } + + [Test] + public void Test001() + { + Expression> sc = e => e.SimpleTerm("abc"); + string expectedTranslation = "abc"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test002() + { + Expression> sc = e => e.SimpleTerm(""); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test003() + { + Expression> sc = e => e.SimpleTerm(" "); + string expectedTranslation = "dummy".Trim(); + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test004() + { + Expression> sc = e => e.SimpleTerm(null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test005() + { + Expression> sc = e => e.SimpleTerm(" abc "); + string expectedTranslation = "abc"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test006() + { + Expression> sc = e => e.SimpleTerm("Once upon a time"); + string expectedTranslation = "\"Once upon a time\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test007() + { + Expression> sc = e => e.PrefixTerm("dis"); + string expectedTranslation = "\"dis*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test008() + { + Expression> sc = e => e.PrefixTerm(""); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test009() + { + Expression> sc = e => e.PrefixTerm(" "); + string expectedTranslation = "dummy".Trim(); + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test010() + { + Expression> sc = e => e.PrefixTerm(null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test011() + { + Expression> sc = e => e.PrefixTerm(" dis "); + string expectedTranslation = "\"dis*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test012() + { + Expression> sc = e => e.PrefixTerm("kill all humans"); + string expectedTranslation = "\"kill all humans*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test013() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] {"abc"}); + string expectedTranslation = "FORMSOF (INFLECTIONAL, abc)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test014() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new string[0]); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test015() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test016() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", "" }); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test017() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", null }); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test018() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " " }); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test019() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"abc"}); + string expectedTranslation = "FORMSOF (THESAURUS, abc)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test020() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"abc", "def", "ghi"}); + string expectedTranslation = "FORMSOF (THESAURUS, abc, def, ghi)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test021() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {" abc ", "def ", " ghi"}); + string expectedTranslation = "FORMSOF (THESAURUS, abc, def, ghi)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test022() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"a b c", "d f g"}); + string expectedTranslation = "FORMSOF (THESAURUS, \"a b c\", \"d f g\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test023() + { + Expression> sc = e => e.GenerationTerm(GenerationType.Thesaurus, new[] {"Because I do not listen it does not mean I do not care"}); + string expectedTranslation = "FORMSOF (THESAURUS, \"Because I do not listen it does not mean I do not care\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test024() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test025() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc")); + string expectedTranslation = ""; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test026() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("").NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test027() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test028() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm(null).NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test029() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(null)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test030() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm(" ").NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test031() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" ")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test032() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test033() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm("")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test034() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(null).NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test035() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(null)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test036() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test037() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(" ").NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test038() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" ")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test039() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" sdf rrr ")); + string expectedTranslation = "abc NEAR def NEAR \"sdf rrr\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test040() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def").NearPrefixTerm("ghi")); + string expectedTranslation = "abc NEAR def NEAR \"ghi*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test041() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm("ghi").NearSimpleTerm("jkl")); + string expectedTranslation = "abc NEAR \"ghi*\" NEAR jkl"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test042() + { + Expression> sc = e => e.GenericProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm("ghi").NearPrefixTerm("jkl")); + string expectedTranslation = "abc NEAR \"ghi*\" NEAR \"jkl*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test043() + { + Expression> sc = e => e.GenericProximityTerm(f => f.PrefixTerm(" abc ").NearPrefixTerm(" def ghi ").NearPrefixTerm("aaaa")); + string expectedTranslation = "\"abc*\" NEAR \"def ghi*\" NEAR \"aaaa*\""; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test044() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test045() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test046() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("").NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test047() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test048() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm(" ").NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test049() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" ")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test050() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm(null).NearSimpleTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test051() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(null)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test052() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm("")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test053() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("").NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test054() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" ")); + string expectedTranslation = "dummy"; + Assert.Throws(() =>CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test055() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm(" ").NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test056() + { + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(null)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test057() + { + Require.ProviderVersionAtLeast(new Version(11,0)); + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm(null).NearPrefixTerm("abc")); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test058() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" aaaaa b c ")); + string expectedTranslation = "NEAR (abc, def, \"aaaaa b c\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test059() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm(" def ").NearPrefixTerm(" aaaaa b c ")); + string expectedTranslation = "NEAR (abc, def, \"aaaaa b c*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test060() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearPrefixTerm(" def ").NearSimpleTerm(" aaaaa b c ")); + string expectedTranslation = "NEAR (abc, \"def*\", \"aaaaa b c\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test061() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearSimpleTerm(" def ").NearSimpleTerm(" aaaaa b c ")); + string expectedTranslation = "NEAR (\"abc*\", def, \"aaaaa b c\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test062() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.PrefixTerm("abc").NearPrefixTerm(" def ").NearPrefixTerm(" aaaaa b c ")); + string expectedTranslation = "NEAR (\"abc*\", \"def*\", \"aaaaa b c*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test063() + { + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), -1); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test064() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 0); + string expectedTranslation = "NEAR (abc, def, 0)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test065() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 3333); + string expectedTranslation = "NEAR (abc, def, 3333)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test066() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967294); + string expectedTranslation = "NEAR (abc, def, 4294967294)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test067() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967295); + string expectedTranslation = "NEAR (abc, def, 4294967295)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test068() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 4294967296); + string expectedTranslation = "NEAR (abc, def, MAX)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test069() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), long.MaxValue); + string expectedTranslation = "NEAR (abc, def, MAX)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test070() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 5, false); + string expectedTranslation = "NEAR (abc, def, 5)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test071() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(f => f.SimpleTerm("abc").NearSimpleTerm("def"), 5, true); + string expectedTranslation = "NEAR (abc, def, 5, TRUE)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test072() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("") + .AndSimpleTerm("def") + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test073() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm("") + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test074() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm("def") + .AndSimpleTerm("") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test075() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm(" ") + .AndSimpleTerm("def") + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test076() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm(" ") + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test077() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm("def") + .AndSimpleTerm(" ") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test078() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm(null) + .AndSimpleTerm("def") + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test079() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm(null) + .AndSimpleTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test080() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndSimpleTerm("def") + .AndSimpleTerm(null) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test081() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("", 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test082() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm("", 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test083() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm("", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test084() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm(" ", 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test085() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm(" ", 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test086() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm(" ", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test087() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm(null, 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test088() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm(null, 0.1f) + .AndSimpleTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test089() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndSimpleTerm("def", 0.1f) + .AndSimpleTerm(null, 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test090() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("") + .AndPrefixTerm("def") + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test091() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm("") + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test092() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm("def") + .AndPrefixTerm("") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test093() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm(" ") + .AndPrefixTerm("def") + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test094() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm(" ") + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test095() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm("def") + .AndPrefixTerm(" ") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test096() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm(null) + .AndPrefixTerm("def") + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test097() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm(null) + .AndPrefixTerm("ghi") + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test098() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc") + .AndPrefixTerm("def") + .AndPrefixTerm(null) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test099() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("", 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test100() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm("", 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test101() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm("", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test102() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm(" ", 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() =>CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test103() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm(" ", 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test104() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm(" ", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test105() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm(null, 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test106() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm(null, 0.1f) + .AndPrefixTerm("ghi", 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test107() + { + Expression> sc = e => e.WeightedTerm( + f => f.PrefixTerm("abc", 0.1f) + .AndPrefixTerm("def", 0.1f) + .AndPrefixTerm(null, 0.1f) + ); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test108() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, null)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test109() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", null})); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test110() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new string[0])); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test111() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", ""})); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test112() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc", "def", " "})); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test113() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, null, 0.1f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test114() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", null }, 0.1f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test115() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new string[0], 0.1f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test116() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", "" }, 0.1f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test117() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new[] { "abc", "def", " " }, 0.1f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test118() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new []{"abc"})); + string expectedTranslation = "ISABOUT (FORMSOF (THESAURUS, abc))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test119() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Inflectional, new[] {"abc"})); + string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test120() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Thesaurus, new[] {"abc"}, 0.1f)); + string expectedTranslation = "ISABOUT (FORMSOF (THESAURUS, abc) WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test121() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Inflectional, new[] {"abc"}, 0.1f)); + string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc) WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test122() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " def ", " ghi jkl " })); + string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc, def, \"ghi jkl\"))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test123() + { + Expression> sc = e => e.WeightedTerm( + f => f.GenerationTerm(GenerationType.Inflectional, new[] { "abc", " def ", " ghi jkl " }, 0.1f)); + string expectedTranslation = "ISABOUT (FORMSOF (INFLECTIONAL, abc, def, \"ghi jkl\") WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test124() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g=>g.SimpleTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test125() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test126() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(null))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test127() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm(null).NearSimpleTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test128() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(""))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test129() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm("").NearSimpleTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test130() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm("abc").NearSimpleTerm(" "))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test131() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.SimpleTerm(" ").NearSimpleTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test132() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(""))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test133() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm("").NearPrefixTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test134() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(" "))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test135() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm(" ").NearPrefixTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test136() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm("abc").NearPrefixTerm(null))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test137() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm(null).NearPrefixTerm("abc"))); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test138() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm(" abc ").NearPrefixTerm(" ccc ddd ").NearSimpleTerm(" bbb ccc ").NearSimpleTerm(" aaa "))); + string expectedTranslation = "ISABOUT (\"abc*\" NEAR \"ccc ddd*\" NEAR \"bbb ccc\" NEAR aaa)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test139() + { + Expression> sc = e => e.WeightedTerm( + f => f.ProximityTerm(g => g.PrefixTerm(" abc ").NearPrefixTerm(" ccc ddd ").NearSimpleTerm(" bbb ccc ").NearSimpleTerm(" aaa "), 0.1f)); + string expectedTranslation = "ISABOUT (\"abc*\" NEAR \"ccc ddd*\" NEAR \"bbb ccc\" NEAR aaa WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + + [Test] + public void Test140() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -2.0f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test141() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -1.0f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test142() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", -0.001f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test143() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.000f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.000))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test144() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.001f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.001))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test145() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.1f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test146() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.9f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.900))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test147() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 0.998f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.998))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test148() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 1.0f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (1.000))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test149() + { + Expression> sc = e => e.WeightedTerm(f => f.SimpleTerm("abc", 1.001f)); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test150() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndGenerationTerm(GenerationType.Thesaurus, new []{"abc"}) + .AndPrefixTerm("abc") + .AndProximityTerm(g=>g.SimpleTerm("abc").NearPrefixTerm("def"))); + string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test151() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) + .AndPrefixTerm("abc") + .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.100), FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test152() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }, 0.1f) + .AndPrefixTerm("abc") + .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); + string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc) WEIGHT (0.100), \"abc*\", abc NEAR \"def*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test153() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) + .AndPrefixTerm("abc", 0.1f) + .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"))); + string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\" WEIGHT (0.100), abc NEAR \"def*\")"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test154() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc") + .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }) + .AndPrefixTerm("abc") + .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"),0.1f)); + string expectedTranslation = "ISABOUT (abc, FORMSOF (THESAURUS, abc), \"abc*\", abc NEAR \"def*\" WEIGHT (0.100))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test155() + { + Expression> sc = e => e.WeightedTerm( + f => f.SimpleTerm("abc", 0.1f) + .AndGenerationTerm(GenerationType.Thesaurus, new[] { "abc" }, 0.2f) + .AndPrefixTerm("abc", 0.3f) + .AndProximityTerm(g => g.SimpleTerm("abc").NearPrefixTerm("def"), 0.4f)); + string expectedTranslation = "ISABOUT (abc WEIGHT (0.100), FORMSOF (THESAURUS, abc) WEIGHT (0.200), \"abc*\" WEIGHT (0.300), abc NEAR \"def*\" WEIGHT (0.400))"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test156() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test157() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(null, 5); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test158() + { + Require.ProviderVersionAtLeast(new Version(11, 0)); + Expression> sc = e => e.CustomProximityTerm(null, 5, true); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test159() + { + Expression> sc = e => e.GenericProximityTerm(null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test160() + { + Expression> sc = e => e.WeightedTerm(null); + string expectedTranslation = "dummy"; + Assert.Throws(() => CompileAndTest(sc, expectedTranslation)); + } + + [Test] + public void Test161() + { + Expression> sc = e => e.SimpleTerm("abc").And().ComplexTerm(f => f.SimpleTerm("def")); + string expectedTranslation = "abc AND (def)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test162() + { + Expression> sc = e => e.ComplexTerm(f => f.SimpleTerm("abc")).And().SimpleTerm("def"); + string expectedTranslation = "(abc) AND def"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test163() + { + Expression> sc = + e => e.SimpleTerm("abc") + .And() + .ComplexTerm(f => f.SimpleTerm("def") + .And() + .ComplexTerm(g => g.SimpleTerm("aaa").Or().SimpleTerm("bbb")) + .AndNot() + .PrefixTerm("ghi") + .Or() + .ComplexTerm(h => h.GenerationTerm(GenerationType.Thesaurus, new[] { "www" })) + .And() + .SimpleTerm("xyz")); + string expectedTranslation = "abc AND (def AND (aaa OR bbb) AND NOT \"ghi*\" OR (FORMSOF (THESAURUS, www)) AND xyz)"; + CompileAndTest(sc, expectedTranslation); + } + + [Test] + public void Test164() + { + Expression> sc = + e => e.SimpleTerm("abc") + .And() + .SimpleTerm("def") + .AndNot() + .PrefixTerm("ghi") + .Or() + .GenerationTerm(GenerationType.Thesaurus, new[] { "www" }) + .And() + .SimpleTerm("xyz"); + string expectedTranslation = "abc AND def AND NOT \"ghi*\" OR FORMSOF (THESAURUS, www) AND xyz"; + CompileAndTest(sc, expectedTranslation); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntityWithFullText)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + private void CompileAndTest(Expression> searchConditionExpression, string expectedTranslation) + { + var visitor = Domain.Handler.GetSearchConditionCompiler(); + var searchCondition = searchConditionExpression.Compile(); + searchCondition.Invoke(SearchConditionNodeFactory.CreateConditonRoot()).AcceptVisitor(visitor); + Assert.That(visitor.CurrentOutput, Is.EqualTo(expectedTranslation)); + + using (var sesion = Domain.OpenSession()) + using (var transaction = sesion.OpenTransaction()) { + //Assert.DoesNotThrow(sesion.Query.ContainsTable(searchConditionExpression).Run); + sesion.Query.ContainsTable(searchConditionExpression).Run(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs index be8a9134bb..b4fa754263 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs @@ -1,264 +1,264 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.02.18 - -using System; -using System.Diagnostics; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Linq.Dto; -using System.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace Dto - { - public enum BudgetType - { - Default, - Regional, - State - } - - [HierarchyRoot] - public class Manager - : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field,Association(PairTo = "Manager")] - public EntitySet Persons { get; private set; } - } - - [HierarchyRoot] - public class Person - : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Manager Manager { get; set; } - - [Field] - public int? Tag { get; set; } - - [Field] - public BudgetType? BudgetType { get; set; } - } - - public class ManagerDto - { - public int Id { get; set; } - public int? FirstPersonId { get; set; } - } - - public class PersonDto - { - public int Id { get; set; } - public int? ManagerId { get; set; } - public string Name { get; set; } - public int? Tag { get; set; } - public BudgetType? BudgetType { get; set; } - public string Description { get; set; } - } - } - - [Serializable] - public class SelectDtoTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var alex = new Person() { Name = "Alex" }; - var query = session.Query.All() - .Select(p => new PersonDto {Name = p.Name}) - .Where(personDto => personDto.Name == "Alex"); - var result = query.ToList(); - var firstPerson = query.SingleOrDefault(); - Assert.IsTrue(firstPerson.Name == "Alex"); - } - } - - [Test] - public void WhereTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var person5 = new Person() {Name = "John", Tag = 5, BudgetType = BudgetType.Regional}; - var personEmpty = new Person() {Name = "John"}; - - var count = session.Query.All() - .Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Tag = p.Tag, BudgetType = p.BudgetType}) - .Where(x => x.Tag == 5 && x.BudgetType == BudgetType.Regional).OrderBy(dto => dto.Id).Count(); - Assert.AreEqual(1, count); - } - } - - [Test] - public void EnumTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - BudgetType budgetType = BudgetType.Regional; - BudgetType budgetTypeNotNullable = BudgetType.Regional; - BudgetType? budgetTypeNullable = BudgetType.Regional; - Expression> filterExpression = p => p.BudgetType == budgetType; - Expression> filterNullableExpression = p => p.BudgetType == budgetTypeNullable; - Expression> filterNotNullableExpression = p => budgetTypeNotNullable == budgetType; - Expression> propertyExpression = p => p.BudgetType; - var valueExpression = Expression.Convert(Expression.Constant(budgetType), typeof(BudgetType?)); - var body = Expression.Convert(propertyExpression.Body, typeof(BudgetType?)); - Expression> customFilterExpression = Expression.Lambda>( - Expression.Equal(body, valueExpression), - propertyExpression.Parameters); - var persons = session.Query.All().Where(filterExpression).ToList(); - var customPersons = session.Query.All().Where(customFilterExpression).ToList(); - var func = customFilterExpression.Compile(); - func(new Person() {BudgetType = BudgetType.Regional}); - } - } - - [Test] - public void SelectNullableTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var manager1 = new Manager() {Name = "M0"}; - var manager2 = new Manager() {Name = "M0"}; - new Person() { Name = "A", Manager = manager1}; - new Person() { Name = "B", Manager = manager1}; - new Person() { Name = "C", Manager = manager2}; - new Person() { Name = "D", Manager = manager2}; - new Person() { Name = "E" }; - new Person() { Name = "F" }; - - var query = session.Query.All() - .Select(p => new PersonDto { - Id = p.Id, - Name = p.Name, - ManagerId = p.Manager != null ? (int?)p.Manager.Id : null}); - var result = query.ToList(); - Assert.AreEqual(6, result.Count); - } - } - - [Test] - public void GroupByTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Person() {Name = "A", BudgetType = BudgetType.Default}; - new Person() {Name = "B", BudgetType = BudgetType.Default}; - new Person() {Name = "C", BudgetType = BudgetType.Regional}; - new Person() {Name = "D", BudgetType = BudgetType.State}; - new Person() {Name = "E"}; - new Person() {Name = "F"}; - - var types = session.Query.All() - .Select(p => p.BudgetType) - .Distinct() - .ToList(); - Assert.AreEqual(4, types.Count); - - var groups = session.Query.All() - .GroupBy(p => p.BudgetType) - .Select(g => new {g.Key, Count = g.Count()}) - .ToList(); - Assert.AreEqual(4, groups.Count); - - var arrays = session.Query.All() - .Select(p => new PersonDto(){Id = p.Id, Name = p.Name, BudgetType = p.BudgetType}) - .GroupBy(c => c.BudgetType) - .OrderBy(g => g.Key) - .Select(g => new[] {(object) g.Key, (object) g.Count()}) - .ToList(); - Assert.AreEqual(4, arrays.Count); - } - } - - [Test] - public void MethodProjectionTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new Person() { Name = "A", BudgetType = BudgetType.Default }; - new Person() { Name = "B", BudgetType = BudgetType.Default }; - new Person() { Name = "C", BudgetType = BudgetType.Regional }; - new Person() { Name = "D", BudgetType = BudgetType.State }; - new Person() { Name = "E" }; - new Person() { Name = "F" }; - new Person() { Name = null }; - new Person() { Name = null }; - - var selectedMethod = session.Query.All() - .Select(p => new PersonDto() {Id = p.Id, Name = p.Name, Description = GetDescription(p)}) - .OrderBy(x => x.Name) - .ToList(); - - var selectedMethod2 = session.Query.All() - .Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Description = p.Name ?? GetDescription(p) }) - .Where(x => x.Name == null) - .ToList(); - } - } - - [Test] - public void FirstOrDefaultTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var manager = new Manager() { - Name = "Manager" - }; - var looser = new Manager() { - Name = "Looser" - }; - new Person() { Name = "A", BudgetType = BudgetType.Default, Manager = manager}; - new Person() { Name = "B", BudgetType = BudgetType.Default, Manager = manager}; - new Person() { Name = "C", BudgetType = BudgetType.Regional, Manager = manager }; - new Person() { Name = "D", BudgetType = BudgetType.State, Manager = manager }; - new Person() { Name = "E" }; - new Person() { Name = "F" }; - - var list = session.Query.All() - .Select(m => new { Entity = m, FirstPerson = m.Persons.FirstOrDefault() }) - .Select(g => new ManagerDto() { - Id = g.Entity.Id, - FirstPersonId = g.FirstPerson != null ? (int?)g.FirstPerson.Id : null, - }) - .ToList(); - } - } - - public string GetDescription(Person p) - { - if (!p.BudgetType.HasValue) - return "Empty Budget"; - else - return p.BudgetType + " Budget"; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.02.18 + +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Linq.Dto; +using System.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace Dto + { + public enum BudgetType + { + Default, + Regional, + State + } + + [HierarchyRoot] + public class Manager + : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field,Association(PairTo = "Manager")] + public EntitySet Persons { get; private set; } + } + + [HierarchyRoot] + public class Person + : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Manager Manager { get; set; } + + [Field] + public int? Tag { get; set; } + + [Field] + public BudgetType? BudgetType { get; set; } + } + + public class ManagerDto + { + public int Id { get; set; } + public int? FirstPersonId { get; set; } + } + + public class PersonDto + { + public int Id { get; set; } + public int? ManagerId { get; set; } + public string Name { get; set; } + public int? Tag { get; set; } + public BudgetType? BudgetType { get; set; } + public string Description { get; set; } + } + } + + [Serializable] + public class SelectDtoTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var alex = new Person() { Name = "Alex" }; + var query = session.Query.All() + .Select(p => new PersonDto {Name = p.Name}) + .Where(personDto => personDto.Name == "Alex"); + var result = query.ToList(); + var firstPerson = query.SingleOrDefault(); + Assert.IsTrue(firstPerson.Name == "Alex"); + } + } + + [Test] + public void WhereTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var person5 = new Person() {Name = "John", Tag = 5, BudgetType = BudgetType.Regional}; + var personEmpty = new Person() {Name = "John"}; + + var count = session.Query.All() + .Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Tag = p.Tag, BudgetType = p.BudgetType}) + .Where(x => x.Tag == 5 && x.BudgetType == BudgetType.Regional).OrderBy(dto => dto.Id).Count(); + Assert.AreEqual(1, count); + } + } + + [Test] + public void EnumTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + BudgetType budgetType = BudgetType.Regional; + BudgetType budgetTypeNotNullable = BudgetType.Regional; + BudgetType? budgetTypeNullable = BudgetType.Regional; + Expression> filterExpression = p => p.BudgetType == budgetType; + Expression> filterNullableExpression = p => p.BudgetType == budgetTypeNullable; + Expression> filterNotNullableExpression = p => budgetTypeNotNullable == budgetType; + Expression> propertyExpression = p => p.BudgetType; + var valueExpression = Expression.Convert(Expression.Constant(budgetType), typeof(BudgetType?)); + var body = Expression.Convert(propertyExpression.Body, typeof(BudgetType?)); + Expression> customFilterExpression = Expression.Lambda>( + Expression.Equal(body, valueExpression), + propertyExpression.Parameters); + var persons = session.Query.All().Where(filterExpression).ToList(); + var customPersons = session.Query.All().Where(customFilterExpression).ToList(); + var func = customFilterExpression.Compile(); + func(new Person() {BudgetType = BudgetType.Regional}); + } + } + + [Test] + public void SelectNullableTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var manager1 = new Manager() {Name = "M0"}; + var manager2 = new Manager() {Name = "M0"}; + new Person() { Name = "A", Manager = manager1}; + new Person() { Name = "B", Manager = manager1}; + new Person() { Name = "C", Manager = manager2}; + new Person() { Name = "D", Manager = manager2}; + new Person() { Name = "E" }; + new Person() { Name = "F" }; + + var query = session.Query.All() + .Select(p => new PersonDto { + Id = p.Id, + Name = p.Name, + ManagerId = p.Manager != null ? (int?)p.Manager.Id : null}); + var result = query.ToList(); + Assert.AreEqual(6, result.Count); + } + } + + [Test] + public void GroupByTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Person() {Name = "A", BudgetType = BudgetType.Default}; + new Person() {Name = "B", BudgetType = BudgetType.Default}; + new Person() {Name = "C", BudgetType = BudgetType.Regional}; + new Person() {Name = "D", BudgetType = BudgetType.State}; + new Person() {Name = "E"}; + new Person() {Name = "F"}; + + var types = session.Query.All() + .Select(p => p.BudgetType) + .Distinct() + .ToList(); + Assert.AreEqual(4, types.Count); + + var groups = session.Query.All() + .GroupBy(p => p.BudgetType) + .Select(g => new {g.Key, Count = g.Count()}) + .ToList(); + Assert.AreEqual(4, groups.Count); + + var arrays = session.Query.All() + .Select(p => new PersonDto(){Id = p.Id, Name = p.Name, BudgetType = p.BudgetType}) + .GroupBy(c => c.BudgetType) + .OrderBy(g => g.Key) + .Select(g => new[] {(object) g.Key, (object) g.Count()}) + .ToList(); + Assert.AreEqual(4, arrays.Count); + } + } + + [Test] + public void MethodProjectionTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new Person() { Name = "A", BudgetType = BudgetType.Default }; + new Person() { Name = "B", BudgetType = BudgetType.Default }; + new Person() { Name = "C", BudgetType = BudgetType.Regional }; + new Person() { Name = "D", BudgetType = BudgetType.State }; + new Person() { Name = "E" }; + new Person() { Name = "F" }; + new Person() { Name = null }; + new Person() { Name = null }; + + var selectedMethod = session.Query.All() + .Select(p => new PersonDto() {Id = p.Id, Name = p.Name, Description = GetDescription(p)}) + .OrderBy(x => x.Name) + .ToList(); + + var selectedMethod2 = session.Query.All() + .Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Description = p.Name ?? GetDescription(p) }) + .Where(x => x.Name == null) + .ToList(); + } + } + + [Test] + public void FirstOrDefaultTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var manager = new Manager() { + Name = "Manager" + }; + var looser = new Manager() { + Name = "Looser" + }; + new Person() { Name = "A", BudgetType = BudgetType.Default, Manager = manager}; + new Person() { Name = "B", BudgetType = BudgetType.Default, Manager = manager}; + new Person() { Name = "C", BudgetType = BudgetType.Regional, Manager = manager }; + new Person() { Name = "D", BudgetType = BudgetType.State, Manager = manager }; + new Person() { Name = "E" }; + new Person() { Name = "F" }; + + var list = session.Query.All() + .Select(m => new { Entity = m, FirstPerson = m.Persons.FirstOrDefault() }) + .Select(g => new ManagerDto() { + Id = g.Entity.Id, + FirstPersonId = g.FirstPerson != null ? (int?)g.FirstPerson.Id : null, + }) + .ToList(); + } + } + + public string GetDescription(Person p) + { + if (!p.BudgetType.HasValue) + return "Empty Budget"; + else + return p.BudgetType + " Budget"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SelectManyTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SelectManyTest.cs index b102f75655..0d7d9149a6 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SelectManyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SelectManyTest.cs @@ -1,510 +1,510 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.01 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class SelectManyTest : ChinookDOModelTest - { - [Test] - public void GroupJoinTest() - { - var result = Session.Query.All() - .GroupJoin(Session.Query.All(), - i => i.Customer, - c => c, - (i, ic) => new {i, ic}) - .SelectMany(@t => @t.ic.DefaultIfEmpty(), - (@t, x) => new { - CustomerId = x.CustomerId, - Phone = x.Phone, - Country = x.Address.Country - }) - ; - var expected = Session.Query.All().AsEnumerable() - .GroupJoin(Session.Query.All().AsEnumerable(), - i => i.Customer, - c => c, - (i, ic) => new {i, ic}) - .SelectMany(@t => @t.ic.DefaultIfEmpty(), - (@t, x) => new { - CustomerId = x.CustomerId, - Phone = x.Phone, - Country = x.Address.Country - }).OrderBy(t => t.Phone).ThenBy(t => t.Country).ThenBy(t => t.CustomerId); - - var list = result.ToList().OrderBy(t => t.Phone).ThenBy(t => t.Country).ThenBy(t => t.CustomerId).ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(list)); - QueryDumper.Dump(result); - } - - [Test] - public void GroupByTest() - { - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .SelectMany(g => g); - var list = result.ToList(); - var expected = Session.Query.All().ToList(); - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void GroupBy2Test() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .SelectMany(g => g, (grouping, invoice)=>new {Count = grouping.Count(), Invoice = invoice}); - var expected = Session.Query.All().ToList() - .GroupBy(i => i.Customer) - .SelectMany(g => g, (grouping, invoice)=>new {Count = grouping.Count(), Invoice = invoice}); - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(expected.Except(list).IsNullOrEmpty()); - } - - [Test] - public void GroupBySelectorTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .SelectMany(g => g.Select(i => i.Customer)); - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - var expected = Session.Query.All().Select(i => i.Customer).ToList(); - Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void GroupByCountTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)); - var list = result.ToList(); - var expected = Session.Query.All().ToList() - .GroupBy(i => i.Customer) - .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)) - .ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void GroupByCount2Test() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var result = Session.Query.All() - .GroupBy(i => i.Customer) - .Where(g => g.Count() > 2) - .SelectMany(g => g.Select(i => i.Customer)); - var list = result.ToList(); - var expected = Session.Query.All().ToList() - .GroupBy(i => i.Customer) - .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)) - .ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void ParameterTest() - { - var expectedCount = Session.Query.All().Count(); - var result = Session.Query.All() - .SelectMany(i => i.Invoices.Select(t => i)); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expectedCount, result.Count()); - foreach (var customer in result) - Assert.IsNotNull(customer); - } - - [Test] - public void EntitySetDefaultIfEmptyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var expectedCount = - Session.Query.All().Count() + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); - IQueryable result = Session.Query.All().SelectMany(c => c.Invoices.DefaultIfEmpty()); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expectedCount, result.ToList().Count); - } - - [Test] - public void EntitySetSubqueryTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - int expectedCount = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); - IQueryable result = Session.Query.All() - .SelectMany(c => c.Invoices.Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expectedCount, result.ToList().Count); - } - - [Test] - public void EntitySetSubqueryWithResultSelectorTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var expected = Session.Query.All() - .Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); - - IQueryable result = Session.Query.All() - .SelectMany(c => c.Invoices.Where(i => i.DesignatedEmployee.FirstName.StartsWith("A")), (c, i) => i.PaymentDate); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void EntitySetTest() - { - int expected = Session.Query.All().Count(); - IQueryable result = Session.Query.All() - .SelectMany(c => c.Invoices); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void EntitySetWithCastTest() - { - var result = Session.Query.All().SelectMany(c => (IEnumerable) c.Invoices).ToList(); - var expected = Session.Query.All().ToList(); - - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(result.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void SelectManyWithCastTest() - { - var result = Session.Query.All().SelectMany(c => (IEnumerable) Session.Query.All().Where(i => i.Customer==c)).ToList(); - var expected = Session.Query.All().ToList(); - - Assert.That(result, Is.Not.Empty); - Assert.IsTrue(result.Except(expected).IsNullOrEmpty()); - } - - [Test] - public void InnerJoinTest() - { - var invoicesCount = Session.Query.All().Count(); - var result = from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c) - select new {c.FirstName, i.PaymentDate}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(invoicesCount, list.Count); - } - - [Test] - public void NestedTest() - { - IQueryable tracks = Session.Query.All(); - var tracksCount = tracks.Count(); - IQueryable albums = Session.Query.All(); - IQueryable mediaTypes = Session.Query.All(); - var result = from t in tracks - from a in albums - from c in mediaTypes - where t.Album==a && t.MediaType==c - select new {t, a, c.Name}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(tracksCount, list.Count); - } - - [Test] - public void OuterJoinAnonymousTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var assertCount = - Session.Query.All().Count() + - Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); - var result = from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).Select(i => new {i.InvoiceId, c.Phone}).DefaultIfEmpty() - select new {c.LastName, i}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(assertCount, list.Count); - foreach (var item in result) { - Assert.IsNotNull(item); - Assert.IsNotNull(item.LastName); - Assert.IsNotNull(item.i); - } - QueryDumper.Dump(list); - } - - [Test] - public void OuterJoinAnonymousFieldTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var assertCount = - Session.Query.All().Count() + - Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); - var result = from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).Select(i => new {i.InvoiceId, c.Phone}).DefaultIfEmpty() - select new {c.LastName, i.InvoiceId}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(assertCount, list.Count); - QueryDumper.Dump(list); - } - - [Test] -// [ExpectedException(typeof (NullReferenceException))] - public void OuterJoinEntityTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var assertCount = - Session.Query.All().Count() + - Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); - var result = - from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).DefaultIfEmpty() - select new {c.LastName, i.PaymentDate}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(assertCount, list.Count); - QueryDumper.Dump(list); - } - - [Test] - public void OuterJoinValueTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var assertCount = - Session.Query.All().Count() + - Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); - var result = from c in Session.Query.All() - from i in Session.Query.All().Where(i => i.Customer==c).Select(i => i.PaymentDate).DefaultIfEmpty() - select new {c.LastName, i}; - var list = result.ToList(); - - Assert.That(list, Is.Not.Empty); - Assert.AreEqual(assertCount, list.Count); - QueryDumper.Dump(list); - } - - - [Test] - public void SelectManyAfterSelect1Test() - { - IQueryable result = Session.Query.All() - .Select(t => t.Playlists.Select(p => p.Name)) - .SelectMany(p => p); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SelectManyAfterSelect2Test() - { - int expected = Session.Query.All().Count(); - IQueryable result = Session.Query.All() - .Select(c => Session.Query.All().Where(i => i.Customer==c)).SelectMany(i => i); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void SimpleTest() - { - int expected = Session.Query.All().Count(); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c)); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void SimpleWithResultSelectorTest() - { - var expected = Session.Query.All().Count(); - var result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c), (c, i) => new {c, i}); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void SubqueryWithEntityReferenceTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - int expected = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c) - .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void SelectManySelfTest() - { - var result = - from c1 in Session.Query.All() - from c2 in Session.Query.All() - where c1.Address.City==c2.Address.City - select new {c1, c2}; - - var list = result.ToList(); - Assert.That(list, Is.Not.Empty); - } - - [Test] - public void IntersectBetweenFilterAndApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var expected = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Intersect(Session.Query.All()) - .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); - - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void DistinctBetweenFilterAndApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var expected = Session.Query.All().Distinct().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Distinct() - .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); - Assert.That(result, Is.Not.Empty); - Assert.AreEqual(expected, result.ToList().Count); - } - - [Test] - public void TakeBetweenFilterAndApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Take(5)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void SkipBetweenFilterAndApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - IQueryable result = Session.Query.All() - .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Skip(5)); - - Assert.That(result, Is.Not.Empty); - QueryDumper.Dump(result); - } - - [Test] - public void CalculateWithApply() - { - var actual = from c in Session.Query.All() - from i in (c.Invoices.Select(x => c.FirstName + x.BillingAddress.StreetAddress).Where(x => x.StartsWith("M"))) - orderby i - select i; - - var expected = from c in Session.Query.All().ToList() - from i in (c.Invoices.Select(x => c.FirstName + x.BillingAddress.StreetAddress).Where(x => x.StartsWith("M"))) - orderby i - select i; - - Assert.That(actual, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(actual)); - } - - [Test] - public void TwoCalculateWithApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - - var actual = from c in Session.Query.All() - from n in (c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) - .Union(c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) - orderby n - select n; - - var expected = from c in Session.Query.All().ToList() - from n in (c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) - .Union(c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) - orderby n - select n; - - Assert.That(actual, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(actual)); - } - - [Test] - public void TwoFilterWithApplyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var actual = from c in Session.Query.All() - from i in (c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")) - .Intersect(c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")))) - orderby i.InvoiceId - select i.InvoiceId; - var expected = from c in Session.Query.All().ToList() - from i in (c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")).Intersect(c.Invoices)) - orderby i.InvoiceId - select i.InvoiceId; - - Assert.That(actual, Is.Not.Empty); - Assert.IsTrue(expected.SequenceEqual(actual)); - } - - [Test] - public void TwoSelectManyTest() - { - var query = - from i in Session.Query.All().Take(10) - from il in Session.Query.All().Take(10) - select new {InvoiceId = i.InvoiceId, il.UnitPrice}; - - Assert.That(query, Is.Not.Empty); - var count = query.Count(); - TestLog.Info("Records count: {0}", count); - QueryDumper.Dump(query); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.01 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class SelectManyTest : ChinookDOModelTest + { + [Test] + public void GroupJoinTest() + { + var result = Session.Query.All() + .GroupJoin(Session.Query.All(), + i => i.Customer, + c => c, + (i, ic) => new {i, ic}) + .SelectMany(@t => @t.ic.DefaultIfEmpty(), + (@t, x) => new { + CustomerId = x.CustomerId, + Phone = x.Phone, + Country = x.Address.Country + }) + ; + var expected = Session.Query.All().AsEnumerable() + .GroupJoin(Session.Query.All().AsEnumerable(), + i => i.Customer, + c => c, + (i, ic) => new {i, ic}) + .SelectMany(@t => @t.ic.DefaultIfEmpty(), + (@t, x) => new { + CustomerId = x.CustomerId, + Phone = x.Phone, + Country = x.Address.Country + }).OrderBy(t => t.Phone).ThenBy(t => t.Country).ThenBy(t => t.CustomerId); + + var list = result.ToList().OrderBy(t => t.Phone).ThenBy(t => t.Country).ThenBy(t => t.CustomerId).ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(list)); + QueryDumper.Dump(result); + } + + [Test] + public void GroupByTest() + { + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .SelectMany(g => g); + var list = result.ToList(); + var expected = Session.Query.All().ToList(); + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void GroupBy2Test() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .SelectMany(g => g, (grouping, invoice)=>new {Count = grouping.Count(), Invoice = invoice}); + var expected = Session.Query.All().ToList() + .GroupBy(i => i.Customer) + .SelectMany(g => g, (grouping, invoice)=>new {Count = grouping.Count(), Invoice = invoice}); + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(expected.Except(list).IsNullOrEmpty()); + } + + [Test] + public void GroupBySelectorTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .SelectMany(g => g.Select(i => i.Customer)); + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + var expected = Session.Query.All().Select(i => i.Customer).ToList(); + Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void GroupByCountTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)); + var list = result.ToList(); + var expected = Session.Query.All().ToList() + .GroupBy(i => i.Customer) + .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)) + .ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void GroupByCount2Test() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var result = Session.Query.All() + .GroupBy(i => i.Customer) + .Where(g => g.Count() > 2) + .SelectMany(g => g.Select(i => i.Customer)); + var list = result.ToList(); + var expected = Session.Query.All().ToList() + .GroupBy(i => i.Customer) + .SelectMany(g => g.Select(i => i.Customer).Where(c => g.Count() > 2)) + .ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.IsTrue(list.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void ParameterTest() + { + var expectedCount = Session.Query.All().Count(); + var result = Session.Query.All() + .SelectMany(i => i.Invoices.Select(t => i)); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expectedCount, result.Count()); + foreach (var customer in result) + Assert.IsNotNull(customer); + } + + [Test] + public void EntitySetDefaultIfEmptyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var expectedCount = + Session.Query.All().Count() + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); + IQueryable result = Session.Query.All().SelectMany(c => c.Invoices.DefaultIfEmpty()); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expectedCount, result.ToList().Count); + } + + [Test] + public void EntitySetSubqueryTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + int expectedCount = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); + IQueryable result = Session.Query.All() + .SelectMany(c => c.Invoices.Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expectedCount, result.ToList().Count); + } + + [Test] + public void EntitySetSubqueryWithResultSelectorTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var expected = Session.Query.All() + .Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); + + IQueryable result = Session.Query.All() + .SelectMany(c => c.Invoices.Where(i => i.DesignatedEmployee.FirstName.StartsWith("A")), (c, i) => i.PaymentDate); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void EntitySetTest() + { + int expected = Session.Query.All().Count(); + IQueryable result = Session.Query.All() + .SelectMany(c => c.Invoices); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void EntitySetWithCastTest() + { + var result = Session.Query.All().SelectMany(c => (IEnumerable) c.Invoices).ToList(); + var expected = Session.Query.All().ToList(); + + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(result.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void SelectManyWithCastTest() + { + var result = Session.Query.All().SelectMany(c => (IEnumerable) Session.Query.All().Where(i => i.Customer==c)).ToList(); + var expected = Session.Query.All().ToList(); + + Assert.That(result, Is.Not.Empty); + Assert.IsTrue(result.Except(expected).IsNullOrEmpty()); + } + + [Test] + public void InnerJoinTest() + { + var invoicesCount = Session.Query.All().Count(); + var result = from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c) + select new {c.FirstName, i.PaymentDate}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(invoicesCount, list.Count); + } + + [Test] + public void NestedTest() + { + IQueryable tracks = Session.Query.All(); + var tracksCount = tracks.Count(); + IQueryable albums = Session.Query.All(); + IQueryable mediaTypes = Session.Query.All(); + var result = from t in tracks + from a in albums + from c in mediaTypes + where t.Album==a && t.MediaType==c + select new {t, a, c.Name}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(tracksCount, list.Count); + } + + [Test] + public void OuterJoinAnonymousTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var assertCount = + Session.Query.All().Count() + + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); + var result = from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).Select(i => new {i.InvoiceId, c.Phone}).DefaultIfEmpty() + select new {c.LastName, i}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(assertCount, list.Count); + foreach (var item in result) { + Assert.IsNotNull(item); + Assert.IsNotNull(item.LastName); + Assert.IsNotNull(item.i); + } + QueryDumper.Dump(list); + } + + [Test] + public void OuterJoinAnonymousFieldTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var assertCount = + Session.Query.All().Count() + + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); + var result = from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).Select(i => new {i.InvoiceId, c.Phone}).DefaultIfEmpty() + select new {c.LastName, i.InvoiceId}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(assertCount, list.Count); + QueryDumper.Dump(list); + } + + [Test] +// [ExpectedException(typeof (NullReferenceException))] + public void OuterJoinEntityTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var assertCount = + Session.Query.All().Count() + + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); + var result = + from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).DefaultIfEmpty() + select new {c.LastName, i.PaymentDate}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(assertCount, list.Count); + QueryDumper.Dump(list); + } + + [Test] + public void OuterJoinValueTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var assertCount = + Session.Query.All().Count() + + Session.Query.All().Count(c => !Session.Query.All().Any(i => i.Customer==c)); + var result = from c in Session.Query.All() + from i in Session.Query.All().Where(i => i.Customer==c).Select(i => i.PaymentDate).DefaultIfEmpty() + select new {c.LastName, i}; + var list = result.ToList(); + + Assert.That(list, Is.Not.Empty); + Assert.AreEqual(assertCount, list.Count); + QueryDumper.Dump(list); + } + + + [Test] + public void SelectManyAfterSelect1Test() + { + IQueryable result = Session.Query.All() + .Select(t => t.Playlists.Select(p => p.Name)) + .SelectMany(p => p); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SelectManyAfterSelect2Test() + { + int expected = Session.Query.All().Count(); + IQueryable result = Session.Query.All() + .Select(c => Session.Query.All().Where(i => i.Customer==c)).SelectMany(i => i); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void SimpleTest() + { + int expected = Session.Query.All().Count(); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c)); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void SimpleWithResultSelectorTest() + { + var expected = Session.Query.All().Count(); + var result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c), (c, i) => new {c, i}); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void SubqueryWithEntityReferenceTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + int expected = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c) + .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void SelectManySelfTest() + { + var result = + from c1 in Session.Query.All() + from c2 in Session.Query.All() + where c1.Address.City==c2.Address.City + select new {c1, c2}; + + var list = result.ToList(); + Assert.That(list, Is.Not.Empty); + } + + [Test] + public void IntersectBetweenFilterAndApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var expected = Session.Query.All().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Intersect(Session.Query.All()) + .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); + + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void DistinctBetweenFilterAndApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var expected = Session.Query.All().Distinct().Count(i => i.DesignatedEmployee.FirstName.StartsWith("A")); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Distinct() + .Where(i => i.DesignatedEmployee.FirstName.StartsWith("A"))); + Assert.That(result, Is.Not.Empty); + Assert.AreEqual(expected, result.ToList().Count); + } + + [Test] + public void TakeBetweenFilterAndApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Take(5)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void SkipBetweenFilterAndApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + IQueryable result = Session.Query.All() + .SelectMany(c => Session.Query.All().Where(i => i.Customer==c).Skip(5)); + + Assert.That(result, Is.Not.Empty); + QueryDumper.Dump(result); + } + + [Test] + public void CalculateWithApply() + { + var actual = from c in Session.Query.All() + from i in (c.Invoices.Select(x => c.FirstName + x.BillingAddress.StreetAddress).Where(x => x.StartsWith("M"))) + orderby i + select i; + + var expected = from c in Session.Query.All().ToList() + from i in (c.Invoices.Select(x => c.FirstName + x.BillingAddress.StreetAddress).Where(x => x.StartsWith("M"))) + orderby i + select i; + + Assert.That(actual, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(actual)); + } + + [Test] + public void TwoCalculateWithApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + + var actual = from c in Session.Query.All() + from n in (c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) + .Union(c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) + orderby n + select n; + + var expected = from c in Session.Query.All().ToList() + from n in (c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) + .Union(c.Invoices.Select(i => c.FirstName + i.BillingAddress.StreetAddress)) + orderby n + select n; + + Assert.That(actual, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(actual)); + } + + [Test] + public void TwoFilterWithApplyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var actual = from c in Session.Query.All() + from i in (c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")) + .Intersect(c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")))) + orderby i.InvoiceId + select i.InvoiceId; + var expected = from c in Session.Query.All().ToList() + from i in (c.Invoices.Where(x => x.BillingAddress.StreetAddress.StartsWith("A")).Intersect(c.Invoices)) + orderby i.InvoiceId + select i.InvoiceId; + + Assert.That(actual, Is.Not.Empty); + Assert.IsTrue(expected.SequenceEqual(actual)); + } + + [Test] + public void TwoSelectManyTest() + { + var query = + from i in Session.Query.All().Take(10) + from il in Session.Query.All().Take(10) + select new {InvoiceId = i.InvoiceId, il.UnitPrice}; + + Assert.That(query, Is.Not.Empty); + var count = query.Count(); + TestLog.Info("Records count: {0}", count); + QueryDumper.Dump(query); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SelectTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SelectTest.cs index 4127f27d89..ef35e33042 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SelectTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SelectTest.cs @@ -1,999 +1,999 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2009.01.12 - -using System.Collections.Generic; -using NUnit.Framework; -using System; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Tuples; -using Xtensive.Orm.Providers; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Orm.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class SelectTest : ChinookDOModelTest - { - public class InstanceTestClass - { - public string Current - { - get { return ""; } - } - } - - public static class StaticTestClass - { - public static InstanceTestClass Instance - { - get { return new InstanceTestClass(); } - } - } - - public class Context - { - public IQueryable Invoices - { - get { return Session.Demand().Query.All(); } - } - - public IQueryable Customers - { - get { return Session.Demand().Query.All(); } - } - } - - [Test] - public void IndexerSimpleFieldTest() - { - var result = Session.Query - .All() - .OrderBy(customer => customer.CustomerId) - .Select(customer => customer["Phone"]) - .AsEnumerable(); - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(customer => customer.CustomerId) - .Select(customer => customer["Phone"]); - Assert.IsTrue(expected.SequenceEqual(result)); - - var qr = Session.Query.All(); - - var filter = new Dictionary {{"Phone", "Test 718"}}; - - foreach (var item in filter) { - var pair = item; // This is important to use local variable - qr = qr.Where(customer => customer[pair.Key]==pair.Value); - } - - var list = qr.ToList(); - } - - [Test] - public void IndexerEntityTest() - { - var result = Session.Query - .All() - .OrderBy(invoice => invoice.InvoiceId) - .Select(invoice => invoice["Customer"]) - .AsEnumerable(); - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(invoice => invoice.InvoiceId) - .Select(invoice => invoice["Customer"]); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void IndexerStructureTest() - { - var result = Session.Query - .All() - .OrderBy(customer => customer.CustomerId) - .Select(customer => customer["Address"]) - .AsEnumerable(); - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(customer => customer.CustomerId) - .Select(customer => customer["Address"]); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void IndexerError1Test() - { - Assert.Throws(() => { - var result = Session.Query - .All() - .Select(customer => customer["Ph1one"]) - .ToList(); - }); - } - - [Test] - public void IndexerError2Test() - { - Assert.Throws(() => { - var result = Session.Query - .All() - .Where(invoice => invoice["Commission"]==invoice["Id"]) - .ToList(); - }); - } - - - [Test] - public void StaticPropertyTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var customers = Session.Query.All() - .Where(customer => - customer - .Invoices - .Select(invoices => invoices.BillingAddress.State) - .FirstOrDefault()==StaticTestClass.Instance.Current); - QueryDumper.Dump(customers); - } - - [Test] - public void SelectEmployeeTest() - { - var result = Session.Query.All(); - var list = result.ToList(); - } - - [Test] - public void SelectForeignKeyTest() - { - var result = Session.Query.All().Select(t => t.Album.AlbumId); - var list = result.ToList(); - } - - [Test] - public void SelectForeignFieldTest() - { - var result = Session.Query.All().Select(t => t.Album.Title); - var list = result.ToList(); - } - - [Test] - public void SelectUsingContextTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var expectedCount = Session.Query.All().Count(); - var context = new Context(); - var actualCount = context.Invoices.Count(); - var list = context.Invoices.ToList(); - Assert.AreEqual(expectedCount, actualCount); - Assert.AreEqual(expectedCount, list.Count); - - var result = context.Customers.Where(c => context.Invoices.Count(i => i.Customer==c) > 5); - Assert.Greater(result.ToList().Count, 0); - } - - [Test] - public void NullJoinTest() - { - Session.Query.All().First().Album = null; // Set one region reference to NULL - Session.Current.SaveChanges(); - - var tracks = Session.Query.All(); - - var result = tracks.Select(t => t.Album.AlbumId); - - var expectedCount = tracks.ToList().Count(); - var actualCount = result.Count(); - Assert.AreEqual(expectedCount, actualCount); - } - - [Test] - public void AnonymousEntityTest() - { - var result = Session.Query.All() - .Select(album => new {Album = album}) - .Select(a => a.Album); - QueryDumper.Dump(result); - } - - [Test] - public void AnonymousEntityKeyTest() - { - var result = Session.Query.All() - .Select(album => new {Album = album}) - .Select(a => a.Album.Key); - QueryDumper.Dump(result); - } - - [Test] - public void AnonymousEntityFieldTest() - { - var result = Session.Query.All() - .Select(album => new {Album = album}) - .Select(a => a.Album.Title); - QueryDumper.Dump(result); - } - - [Test] - public void AnonymousEntityKeyFieldTest() - { - var result = Session.Query.All() - .Select(album => new {Album = album}) - .Select(a => a.Album.AlbumId); - QueryDumper.Dump(result); - } - - [Test] - public void OutOfHierarchy() - { - Assert.Throws( () => { Assert.Greater(Session.Query.All().Count(), 0); }); - } - - [Test] - public void SimpleSelectTest() - { - var result = Session.Query.All(); - QueryDumper.Dump(result); - } - - [Test] - public void SimpleConstantTest() - { - var tracks = Session.Query.All(); - var result = - from t in tracks - select 0; - var list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(0, i); - } - - [Test] - public void AnonymousColumn() - { - var tracks = Session.Query.All().Select(t => new {t.Name}.Name); - var list = tracks.ToList(); - } - - [Test] - public void AnonymousWithCalculatedColumnsTest() - { - var result = Session.Query.All().Select(c => - new { - n1 = c.FirstName.Length + c.LastName.Length, - n2 = c.LastName.Length + c.FirstName.Length - }); - result = result.Where(i => i.n1 > 10); - result.ToList(); - } - - [Test] - public void AnonymousParameterColumn() - { - var param = new {ProductName = "name"}; - var tracks = Session.Query.All().Select(t => param.ProductName); - QueryDumper.Dump(tracks); - } - - - [Test] - public void NewPairTest() - { - var method = MethodInfo.GetCurrentMethod().Name; - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select new { - Value = new Pair(t.Name, method), - Method = method, - t.Name - } - orderby r.Name - where r.Method==method - select r; - var list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(method, i.Method); - } - - [Test] - public void ConstantTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select 0 - where r==0 - select r; - var list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(0, i); - } - - [Test] - public void ConstantNullStringTest() - { - var tracks = Session.Query.All(); - var result = from t in tracks - select (string) null; - var list = result.ToList(); - foreach (var s in list) - Assert.AreEqual(null, s); - } - - [Test] - public void LocalTest() - { - int x = 10; - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select x - where r==x - select r; - var list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(10, i); - x = 20; - list = result.ToList(); - foreach (var i in list) - Assert.AreEqual(20, i); - } - - [Test] - public void ColumnTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select t.Name - where r!=null - select r; - var list = result.ToList(); - foreach (var s in list) - Assert.IsNotNull(s); - } - - [Test] - public void CalculatedColumnTest() - { - var tracks = Session.Query.All(); - var result = from r in - from t in tracks - select t.UnitPrice * t.UnitPrice - where r > 0 - select r; - var list = result.ToList(); - var checkList = tracks.ToList().Select(t => t.UnitPrice * t.UnitPrice).ToList(); - list.SequenceEqual(checkList); - } - - [Test] - public void KeyTest() - { - var tracks = Session.Query.All(); - var result = tracks - .Select(t => t.Key) - .Where(r => r!=null); - var list = result.ToList(); - Assert.Greater(list.Count, 0); - foreach (var k in list) { - Assert.IsNotNull(k); - var t = Session.Query.SingleOrDefault(k); - Assert.IsNotNull(t); - } - } - - [Test] - public void KeySimpleTest() - { - var result = Session.Query - .All() - .Select(t => t.Key); - QueryDumper.Dump(result); - } - - [Test] - public void AnonymousTest() - { - var tracks = Session.Query.All(); - var result = from t in tracks - select new {t.Name, t.UnitPrice}; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void AnonymousEmptyTest() - { - var tracks = Session.Query.All(); - var result = from t in tracks - select new {}; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void AnonymousCalculatedTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select new {t.Name, TotalPriceInStock = t.UnitPrice * t.UnitPrice} - where r.TotalPriceInStock > 0 - select r; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void JoinedEntityColumnTest() - { - var tracks = Session.Query.All(); - var result = from t in tracks - select t.Album.Title; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - - [Test] - public void JoinedEntityTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select t.Album - where r.Title!=null - select r; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void StructureColumnTest() - { - var invoices = Session.Query.All(); - var result = from i in invoices - select i.Customer.Address; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void StructureTest() - { - var invoices = Session.Query.All(); - var result = from a in ( - from i in invoices - select i.Customer.Address) - where a.City!=null - select a.StreetAddress; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void EntitySetTest() - { - var suppliers = Session.Query.All(); - var result = from s in suppliers - select s.Invoices; - var list = result.ToList(); - } - - [Test] - public void AnonymousWithEntityTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select new {t.Name, Track = t} - where r.Track!=null - select r; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - - [Test] - public void AnonymousNestedTest() - { - var tracks = Session.Query.All(); - var result = - from r in - from t in tracks - select new {t, Desc = new {t.Name, t.UnitPrice}} - where r.Desc.Name!=null - select r; - var list = result.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void NestedQueryTest() - { - var tracks = Session.Query.All(); - var result = from pd in - from t in tracks - select new {ProductKey = t.Key, t.Name, TotalPrice = t.UnitPrice * t.UnitPrice} - where pd.TotalPrice > 100 - select new {PKey = pd.ProductKey, pd.Name, Total = pd.TotalPrice}; - - var list = result.ToList(); - } - - [Test] - public void NestedQueryWithStructuresTest() - { - var invoices = Session.Query.All(); - var result = - from a in - from id in - from i in invoices - select new {ProductKey = i.Key, SupplierAddress = i.Customer.Address} - select new {PKey = id.ProductKey, id.SupplierAddress, SupplierCity = id.SupplierAddress.City} - select new {a.PKey, a.SupplierAddress, a.SupplierCity}; - var list = result.ToList(); - } - - - [Test] - public void NestedQueryWithEntitiesTest() - { - var tracks = Session.Query.All(); - var result = from pd in - from t in tracks - select new {ProductKey = t.Key, Product = t} - select new {PKey = pd.ProductKey, pd.Product}; - - var list = result.ToList(); - } - - [Test] - public void NestedQueryWithAnonymousTest() - { - var tracks = Session.Query.All(); - var result = from pd in - from t in tracks - select new {ProductKey = t.Key, Product = new {Entity = new {t}, Name = t.Name}} - select new {PKey = pd.ProductKey, pd.Product.Name, A = pd, AProduct = pd.Product, AEntity = pd.Product.Entity}; - - var list = result.ToList(); - } - - [Test] - public void SelectEnumTest() - { - var result = from i in Session.Query.All() select i.InvoiceDate.DayOfWeek; - result.ToList(); - } - - [Test] - public void SelectAnonymousEnumTest() - { - var result = from i in Session.Query.All() select new {i.InvoiceDate.DayOfWeek}; - result.ToList(); - } - - [Test] - public void SelectEnumFieldTest() - { - var result = from t in Session.Query.All() select t.MediaFormat; - foreach (var t in result) - Assert.AreEqual(t, MediaFormat.Audio); - } - - [Test] - public void SelectAnonymousEnumFieldTest() - { - var result = from t in Session.Query.All() select new {t.MediaFormat}; - foreach (var t in result) - Assert.AreEqual(t.MediaFormat, MediaFormat.Audio); - } - - [Test] - public void SelectCharTest() - { - var result = from c in Session.Query.All() select c.LastName[0]; - var list = result.ToList(); - } - - [Test] - public void SelectByteArrayLengthTest() - { - var categories = Session.Query.All(); - var result = from c in categories select c.Bytes.Length; - var list = result.ToList(); - } - - [Test] - public void SelectEqualsTest() - { - var customers = Session.Query.All(); - var result = from c in customers select c.CompanyName.Equals("lalala"); - var list = result.ToList(); - } - - [Test] - public void DoubleSelectEntitySet1Test() - { - IQueryable> query = Session.Query.All().Select(c => c.Invoices).Select(c => c); - foreach (var order in query) - QueryDumper.Dump(order); - } - - [Test] - public void DoubleSelectEntitySet2Test() - { - IQueryable> query = Session.Query.All().Select(c => c).Select(c => c.Invoices); - foreach (var order in query) - QueryDumper.Dump(order); - } - - [Test] - public void DoubleSelectEntitySet3Test() - { - var query = Session.Query.All().Select(c => c.Invoices.Select(o => o)); -// var query = Session.Query.All().Select(c => c.Orders); - - foreach (var order in query) - QueryDumper.Dump(order); - } - - [Test] - public void NestedAnonymousTest() - { - var result = Session.Query.All() - .Select(c => new {c}) - .Select(a1 => new {a1}) - .Select(a2 => a2.a1.c.CompanyName); - QueryDumper.Dump(result); - } - - [Test] - public void EntityWithLazyLoadFieldTest() - { - var category = Session.Query.All().Where(c => c.Bytes!=null).First(); - int columnIndex = Domain.Model.Types[typeof (Track)].Fields["Bytes"].MappingInfo.Offset; - Assert.IsFalse(category.State.Tuple.GetFieldState(columnIndex).IsAvailable()); - } - - [Test] - public void AnonymousSelectTest() - { - var result = Session.Query.All() - .Select(i => new {i.InvoiceDate, i.Commission}) - .Select(g => g.InvoiceDate); - QueryDumper.Dump(result); - } - - [Test] - public void SelectJustOuterParameterTest() - { - var result = Session.Query.All().Select(c => Session.Query.All().Select(s => c)); - foreach (var i in result) - i.ToList(); - } - - [Test] - public void NonPersistentFieldTest() - { - var result = from e in Session.Query.All() select e.FullName; - Assert.Throws(() => result.ToList()); - } - - [Test] - public void SelectBigMulTest() - { - var result = - from invoice in Session.Query.All() - select Math.BigMul(invoice.InvoiceId, invoice.DesignatedEmployee.EmployeeId); - result.ToList(); - } - - [Test] - public void SelectSignTest() - { - var result = - from invoice in Session.Query.All() - where invoice.InvoiceId > 0 && invoice.InvoiceId < 50 - let values = new { - Byte = (sbyte) invoice.InvoiceId, - Short = (short) invoice.InvoiceId, - Int = invoice.InvoiceId, - Long = (long) invoice.InvoiceId, - Decimal = (decimal) invoice.InvoiceId, - Float = (float) invoice.InvoiceId, - Double = (double) invoice.InvoiceId, - } - select new { - ByteSign = Math.Sign(values.Byte), - ShortSign = Math.Sign(values.Short), - IntSign = Math.Sign(values.Int), - LongSign = Math.Sign(values.Long), - DecimalSign = Math.Sign(values.Decimal), - FloatSign = Math.Sign(values.Float), - DoubleSign = Math.Sign(values.Double) - }; - foreach (var item in result) { - Assert.AreEqual(1, item.ByteSign); - Assert.AreEqual(1, item.ShortSign); - Assert.AreEqual(1, item.IntSign); - Assert.AreEqual(1, item.LongSign); - Assert.AreEqual(1, item.DecimalSign); - Assert.AreEqual(1, item.FloatSign); - Assert.AreEqual(1, item.DoubleSign); - } - } - - [Test] - public void SelectStringIndexerTest() - { - var result = - Session.Query.All() - .Select(c => new { - String = c.CustomerId, - Char0 = c.Email[0], - Char1 = c.Email[1], - Char2 = c.Email[2], - Char3 = c.Email[3], - Char4 = c.Email[4], - }) - .ToArray() - .OrderBy(item => item.String) - .ToArray(); - var expected = - Session.Query.All() - .ToArray() - .Select(c => new { - String = c.CustomerId, - Char0 = c.Email[0], - Char1 = c.Email[1], - Char2 = c.Email[2], - Char3 = c.Email[3], - Char4 = c.Email[4], - }) - .OrderBy(item => item.String) - .ToArray(); - Assert.AreEqual(expected.Length, result.Length); - for (int i = 0; i < expected.Length; i++) { - Assert.AreEqual(expected[0].String, result[0].String); - Assert.AreEqual(expected[0].Char0, result[0].Char0); - Assert.AreEqual(expected[0].Char1, result[0].Char1); - Assert.AreEqual(expected[0].Char2, result[0].Char2); - Assert.AreEqual(expected[0].Char3, result[0].Char3); - Assert.AreEqual(expected[0].Char4, result[0].Char4); - } - } - - [Test] - public void SelectIndexOfTest() - { - char _char = 'A'; - var result = - Session.Query.All() - .Select(c => new { - String = c.FirstName, - IndexOfChar = c.FirstName.IndexOf(_char), - IndexOfCharStart = c.FirstName.IndexOf(_char, 1), - IndexOfCharStartCount = c.FirstName.IndexOf(_char, 1, 1), - IndexOfString = c.FirstName.IndexOf(_char.ToString()), - IndexOfStringStart = c.FirstName.IndexOf(_char.ToString(), 1), - IndexOfStringStartCount = c.FirstName.IndexOf(_char.ToString(), 1, 1) - }) - .ToArray() - .OrderBy(item => item.String) - .ToArray(); - var expected = - Session.Query.All() - .ToArray() - .Select(c => new { - String = c.FirstName, - IndexOfChar = c.FirstName.IndexOf(_char), - IndexOfCharStart = c.FirstName.IndexOf(_char, 1), - IndexOfCharStartCount = c.FirstName.IndexOf(_char, 1, 1), - IndexOfString = c.FirstName.IndexOf(_char.ToString()), - IndexOfStringStart = c.FirstName.IndexOf(_char.ToString(), 1), - IndexOfStringStartCount = c.FirstName.IndexOf(_char.ToString(), 1, 1) - }) - .OrderBy(item => item.String) - .ToArray(); - Assert.AreEqual(expected.Length, result.Length); - for (int i = 0; i < expected.Length; i++) { - Assert.AreEqual(expected[i].String, result[i].String); - Assert.AreEqual(expected[i].IndexOfChar, result[i].IndexOfChar); - Assert.AreEqual(expected[i].IndexOfCharStart, result[i].IndexOfCharStart); - Assert.AreEqual(expected[i].IndexOfCharStartCount, result[i].IndexOfCharStartCount); - Assert.AreEqual(expected[i].IndexOfString, result[i].IndexOfString); - Assert.AreEqual(expected[i].IndexOfStringStart, result[i].IndexOfStringStart); - Assert.AreEqual(expected[i].IndexOfStringStartCount, result[i].IndexOfStringStartCount); - } - } - - [Test] - public void SelectStringContainsTest() - { - var result = - Session.Query.All() - .Where(c => c.FirstName.Contains('')) - .OrderBy(c => c.FirstName) - .ToArray(); - var expected = - Session.Query.All() - .ToList() - .Where(c => c.FirstName.Contains('')) - .OrderBy(c => c.FirstName) - .ToArray(); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void SelectDateTimeTimeSpanTest() - { - var dateTime = new DateTime(2001, 1, 1, 1, 1, 1); - var timeSpan = new TimeSpan(1, 1, 1, 1); - - var result = Session.Query.All() - .Select(c => new { - CustomerId = c.CustomerId, - DateTime = dateTime, - TimeSpan = timeSpan - }) - .Select(k => new { - DateTime = k.DateTime, - DateTimeDate = k.DateTime.Date, - DateTimeTime = k.DateTime.TimeOfDay, - DateTimeYear = k.DateTime.Year, - DateTimeMonth = k.DateTime.Month, - DateTimeDay = k.DateTime.Day, - DateTimeHour = k.DateTime.Hour, - DateTimeMinute = k.DateTime.Minute, - DateTimeSecond = k.DateTime.Second, - DateTimeDayOfYear = k.DateTime.DayOfYear, - DateTimeDayOfWeek = k.DateTime.DayOfWeek, - TimeSpan = k.TimeSpan, - TimeSpanDays = k.TimeSpan.Days, - TimeSpanHours = k.TimeSpan.Hours, - TimeSpanMinutes = k.TimeSpan.Minutes, - TimeSpanSeconds = k.TimeSpan.Seconds, - TimeSpanTotalDays = k.TimeSpan.TotalDays, - TimeSpanTotalHours = k.TimeSpan.TotalHours, - TimeSpanTotalMinutes = k.TimeSpan.TotalMinutes, - TimeSpanTotalSeconds = k.TimeSpan.TotalSeconds, - TimeSpanTotalMilliSeconds = k.TimeSpan.TotalMilliseconds, - TimeSpanTicks = k.TimeSpan.Ticks, - TimeSpanDuration = k.TimeSpan.Duration(), - TimeSpanFromDays = TimeSpan.FromDays(k.TimeSpan.TotalDays), - TimeSpanFromHours = TimeSpan.FromHours(k.TimeSpan.TotalHours), - TimeSpanFromMinutes = TimeSpan.FromMinutes(k.TimeSpan.TotalMinutes), - TimeSpanFromSeconds = TimeSpan.FromSeconds(k.TimeSpan.TotalSeconds), - TimeSpanFromMilliseconds = TimeSpan.FromMilliseconds(k.TimeSpan.TotalMilliseconds), - }) - .First(); - Assert.AreEqual(dateTime, result.DateTime); - Assert.AreEqual(dateTime.Date, result.DateTimeDate); - Assert.AreEqual(dateTime.TimeOfDay, result.DateTimeTime); - Assert.AreEqual(dateTime.Year, result.DateTimeYear); - Assert.AreEqual(dateTime.Month, result.DateTimeMonth); - Assert.AreEqual(dateTime.Day, result.DateTimeDay); - Assert.AreEqual(dateTime.Hour, result.DateTimeHour); - Assert.AreEqual(dateTime.Minute, result.DateTimeMinute); - Assert.AreEqual(dateTime.Second, result.DateTimeSecond); - Assert.AreEqual(dateTime.DayOfYear, result.DateTimeDayOfYear); - Assert.AreEqual(dateTime.DayOfWeek, result.DateTimeDayOfWeek); - Assert.AreEqual(timeSpan, result.TimeSpan); - Assert.AreEqual(timeSpan.Days, result.TimeSpanDays); - Assert.AreEqual(timeSpan.Hours, result.TimeSpanHours); - Assert.AreEqual(timeSpan.Minutes, result.TimeSpanMinutes); - Assert.AreEqual(timeSpan.Seconds, result.TimeSpanSeconds); - Assert.IsTrue(Math.Abs(timeSpan.TotalDays - result.TimeSpanTotalDays) < 0.1); - Assert.IsTrue(Math.Abs(timeSpan.TotalHours - result.TimeSpanTotalHours) < 0.1); - Assert.IsTrue(Math.Abs(timeSpan.TotalMinutes - result.TimeSpanTotalMinutes) < 0.1); - Assert.IsTrue(Math.Abs(timeSpan.TotalSeconds - result.TimeSpanTotalSeconds) < 0.1); - Assert.IsTrue(Math.Abs(timeSpan.TotalMilliseconds - result.TimeSpanTotalMilliSeconds) < 0.1); - Assert.AreEqual(timeSpan.Ticks, result.TimeSpanTicks); - Assert.AreEqual(timeSpan.Duration(), result.TimeSpanDuration); - Assert.AreEqual(timeSpan, result.TimeSpanFromDays); - Assert.AreEqual(timeSpan, result.TimeSpanFromHours); - Assert.AreEqual(timeSpan, result.TimeSpanFromMinutes); - Assert.AreEqual(timeSpan, result.TimeSpanFromSeconds); - Assert.AreEqual(timeSpan, result.TimeSpanFromMilliseconds); - } - - [Test] - public void SelectSubstringTest() - { - var result = Session.Query.All().Select(c => new { - String = c.Email, - FromTwo = c.Email.Substring(2), - FromThreeTakeOne = c.Email.Substring(3, 1), - }).ToArray(); - foreach (var item in result) { - Assert.AreEqual(item.String.Substring(2), item.FromTwo); - Assert.AreEqual(item.String.Substring(3, 1), item.FromThreeTakeOne); - } - } - - [Test] - public void ExternalPropertyCall() - { - Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All().Select(c => Customers.Single(c2 => c2==c)).ToList(); - } - - [Test] - public void ExternalMethodCall() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .Select(c => GetCustomers().Single(c2 => c2==c)); - var expected = Session.Query.All() - .AsEnumerable() - .Select(c => GetCustomers().AsEnumerable().Single(c2 => c2==c)); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void ExternalMethodWithCorrectParams1Call() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var query = Session.Query.All() - .Select(c => GetCustomers(1).Single(c2 => c2==c)); - var expected = Session.Query.All() - .AsEnumerable() - .Select(c => GetCustomers(1).AsEnumerable().Single(c2 => c2==c)); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void ExternalMethodWithCorrectParams2Call() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - int count = 1; - var query = Session.Query.All() - .Select(c => GetCustomers(count).Single(c2 => c2==c)); - var expected = Session.Query.All() - .AsEnumerable() - .Select(c => GetCustomers(count).AsEnumerable().Single(c2 => c2==c)); - Assert.AreEqual(0, expected.Except(query).Count()); - } - - [Test] - public void ExternalMethodWithIncorrectParamsCall() - { - Assert.Throws(() => { - var query = Session.Query.All().Select(c => GetCustomers(c.Invoices.Count()).Single(c2 => c2==c)).ToList(); - }); - } - - public IQueryable GetCustomers() - { - return Session.Query.All(); - } - - public IQueryable GetCustomers(int count) - { - return Session.Query.All(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2009.01.12 + +using System.Collections.Generic; +using NUnit.Framework; +using System; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Tuples; +using Xtensive.Orm.Providers; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Orm.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class SelectTest : ChinookDOModelTest + { + public class InstanceTestClass + { + public string Current + { + get { return ""; } + } + } + + public static class StaticTestClass + { + public static InstanceTestClass Instance + { + get { return new InstanceTestClass(); } + } + } + + public class Context + { + public IQueryable Invoices + { + get { return Session.Demand().Query.All(); } + } + + public IQueryable Customers + { + get { return Session.Demand().Query.All(); } + } + } + + [Test] + public void IndexerSimpleFieldTest() + { + var result = Session.Query + .All() + .OrderBy(customer => customer.CustomerId) + .Select(customer => customer["Phone"]) + .AsEnumerable(); + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(customer => customer.CustomerId) + .Select(customer => customer["Phone"]); + Assert.IsTrue(expected.SequenceEqual(result)); + + var qr = Session.Query.All(); + + var filter = new Dictionary {{"Phone", "Test 718"}}; + + foreach (var item in filter) { + var pair = item; // This is important to use local variable + qr = qr.Where(customer => customer[pair.Key]==pair.Value); + } + + var list = qr.ToList(); + } + + [Test] + public void IndexerEntityTest() + { + var result = Session.Query + .All() + .OrderBy(invoice => invoice.InvoiceId) + .Select(invoice => invoice["Customer"]) + .AsEnumerable(); + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(invoice => invoice.InvoiceId) + .Select(invoice => invoice["Customer"]); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void IndexerStructureTest() + { + var result = Session.Query + .All() + .OrderBy(customer => customer.CustomerId) + .Select(customer => customer["Address"]) + .AsEnumerable(); + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(customer => customer.CustomerId) + .Select(customer => customer["Address"]); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void IndexerError1Test() + { + Assert.Throws(() => { + var result = Session.Query + .All() + .Select(customer => customer["Ph1one"]) + .ToList(); + }); + } + + [Test] + public void IndexerError2Test() + { + Assert.Throws(() => { + var result = Session.Query + .All() + .Where(invoice => invoice["Commission"]==invoice["Id"]) + .ToList(); + }); + } + + + [Test] + public void StaticPropertyTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var customers = Session.Query.All() + .Where(customer => + customer + .Invoices + .Select(invoices => invoices.BillingAddress.State) + .FirstOrDefault()==StaticTestClass.Instance.Current); + QueryDumper.Dump(customers); + } + + [Test] + public void SelectEmployeeTest() + { + var result = Session.Query.All(); + var list = result.ToList(); + } + + [Test] + public void SelectForeignKeyTest() + { + var result = Session.Query.All().Select(t => t.Album.AlbumId); + var list = result.ToList(); + } + + [Test] + public void SelectForeignFieldTest() + { + var result = Session.Query.All().Select(t => t.Album.Title); + var list = result.ToList(); + } + + [Test] + public void SelectUsingContextTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var expectedCount = Session.Query.All().Count(); + var context = new Context(); + var actualCount = context.Invoices.Count(); + var list = context.Invoices.ToList(); + Assert.AreEqual(expectedCount, actualCount); + Assert.AreEqual(expectedCount, list.Count); + + var result = context.Customers.Where(c => context.Invoices.Count(i => i.Customer==c) > 5); + Assert.Greater(result.ToList().Count, 0); + } + + [Test] + public void NullJoinTest() + { + Session.Query.All().First().Album = null; // Set one region reference to NULL + Session.Current.SaveChanges(); + + var tracks = Session.Query.All(); + + var result = tracks.Select(t => t.Album.AlbumId); + + var expectedCount = tracks.ToList().Count(); + var actualCount = result.Count(); + Assert.AreEqual(expectedCount, actualCount); + } + + [Test] + public void AnonymousEntityTest() + { + var result = Session.Query.All() + .Select(album => new {Album = album}) + .Select(a => a.Album); + QueryDumper.Dump(result); + } + + [Test] + public void AnonymousEntityKeyTest() + { + var result = Session.Query.All() + .Select(album => new {Album = album}) + .Select(a => a.Album.Key); + QueryDumper.Dump(result); + } + + [Test] + public void AnonymousEntityFieldTest() + { + var result = Session.Query.All() + .Select(album => new {Album = album}) + .Select(a => a.Album.Title); + QueryDumper.Dump(result); + } + + [Test] + public void AnonymousEntityKeyFieldTest() + { + var result = Session.Query.All() + .Select(album => new {Album = album}) + .Select(a => a.Album.AlbumId); + QueryDumper.Dump(result); + } + + [Test] + public void OutOfHierarchy() + { + Assert.Throws( () => { Assert.Greater(Session.Query.All().Count(), 0); }); + } + + [Test] + public void SimpleSelectTest() + { + var result = Session.Query.All(); + QueryDumper.Dump(result); + } + + [Test] + public void SimpleConstantTest() + { + var tracks = Session.Query.All(); + var result = + from t in tracks + select 0; + var list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(0, i); + } + + [Test] + public void AnonymousColumn() + { + var tracks = Session.Query.All().Select(t => new {t.Name}.Name); + var list = tracks.ToList(); + } + + [Test] + public void AnonymousWithCalculatedColumnsTest() + { + var result = Session.Query.All().Select(c => + new { + n1 = c.FirstName.Length + c.LastName.Length, + n2 = c.LastName.Length + c.FirstName.Length + }); + result = result.Where(i => i.n1 > 10); + result.ToList(); + } + + [Test] + public void AnonymousParameterColumn() + { + var param = new {ProductName = "name"}; + var tracks = Session.Query.All().Select(t => param.ProductName); + QueryDumper.Dump(tracks); + } + + + [Test] + public void NewPairTest() + { + var method = MethodInfo.GetCurrentMethod().Name; + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select new { + Value = new Pair(t.Name, method), + Method = method, + t.Name + } + orderby r.Name + where r.Method==method + select r; + var list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(method, i.Method); + } + + [Test] + public void ConstantTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select 0 + where r==0 + select r; + var list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(0, i); + } + + [Test] + public void ConstantNullStringTest() + { + var tracks = Session.Query.All(); + var result = from t in tracks + select (string) null; + var list = result.ToList(); + foreach (var s in list) + Assert.AreEqual(null, s); + } + + [Test] + public void LocalTest() + { + int x = 10; + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select x + where r==x + select r; + var list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(10, i); + x = 20; + list = result.ToList(); + foreach (var i in list) + Assert.AreEqual(20, i); + } + + [Test] + public void ColumnTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select t.Name + where r!=null + select r; + var list = result.ToList(); + foreach (var s in list) + Assert.IsNotNull(s); + } + + [Test] + public void CalculatedColumnTest() + { + var tracks = Session.Query.All(); + var result = from r in + from t in tracks + select t.UnitPrice * t.UnitPrice + where r > 0 + select r; + var list = result.ToList(); + var checkList = tracks.ToList().Select(t => t.UnitPrice * t.UnitPrice).ToList(); + list.SequenceEqual(checkList); + } + + [Test] + public void KeyTest() + { + var tracks = Session.Query.All(); + var result = tracks + .Select(t => t.Key) + .Where(r => r!=null); + var list = result.ToList(); + Assert.Greater(list.Count, 0); + foreach (var k in list) { + Assert.IsNotNull(k); + var t = Session.Query.SingleOrDefault(k); + Assert.IsNotNull(t); + } + } + + [Test] + public void KeySimpleTest() + { + var result = Session.Query + .All() + .Select(t => t.Key); + QueryDumper.Dump(result); + } + + [Test] + public void AnonymousTest() + { + var tracks = Session.Query.All(); + var result = from t in tracks + select new {t.Name, t.UnitPrice}; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void AnonymousEmptyTest() + { + var tracks = Session.Query.All(); + var result = from t in tracks + select new {}; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void AnonymousCalculatedTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select new {t.Name, TotalPriceInStock = t.UnitPrice * t.UnitPrice} + where r.TotalPriceInStock > 0 + select r; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void JoinedEntityColumnTest() + { + var tracks = Session.Query.All(); + var result = from t in tracks + select t.Album.Title; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + + [Test] + public void JoinedEntityTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select t.Album + where r.Title!=null + select r; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void StructureColumnTest() + { + var invoices = Session.Query.All(); + var result = from i in invoices + select i.Customer.Address; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void StructureTest() + { + var invoices = Session.Query.All(); + var result = from a in ( + from i in invoices + select i.Customer.Address) + where a.City!=null + select a.StreetAddress; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void EntitySetTest() + { + var suppliers = Session.Query.All(); + var result = from s in suppliers + select s.Invoices; + var list = result.ToList(); + } + + [Test] + public void AnonymousWithEntityTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select new {t.Name, Track = t} + where r.Track!=null + select r; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + + [Test] + public void AnonymousNestedTest() + { + var tracks = Session.Query.All(); + var result = + from r in + from t in tracks + select new {t, Desc = new {t.Name, t.UnitPrice}} + where r.Desc.Name!=null + select r; + var list = result.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void NestedQueryTest() + { + var tracks = Session.Query.All(); + var result = from pd in + from t in tracks + select new {ProductKey = t.Key, t.Name, TotalPrice = t.UnitPrice * t.UnitPrice} + where pd.TotalPrice > 100 + select new {PKey = pd.ProductKey, pd.Name, Total = pd.TotalPrice}; + + var list = result.ToList(); + } + + [Test] + public void NestedQueryWithStructuresTest() + { + var invoices = Session.Query.All(); + var result = + from a in + from id in + from i in invoices + select new {ProductKey = i.Key, SupplierAddress = i.Customer.Address} + select new {PKey = id.ProductKey, id.SupplierAddress, SupplierCity = id.SupplierAddress.City} + select new {a.PKey, a.SupplierAddress, a.SupplierCity}; + var list = result.ToList(); + } + + + [Test] + public void NestedQueryWithEntitiesTest() + { + var tracks = Session.Query.All(); + var result = from pd in + from t in tracks + select new {ProductKey = t.Key, Product = t} + select new {PKey = pd.ProductKey, pd.Product}; + + var list = result.ToList(); + } + + [Test] + public void NestedQueryWithAnonymousTest() + { + var tracks = Session.Query.All(); + var result = from pd in + from t in tracks + select new {ProductKey = t.Key, Product = new {Entity = new {t}, Name = t.Name}} + select new {PKey = pd.ProductKey, pd.Product.Name, A = pd, AProduct = pd.Product, AEntity = pd.Product.Entity}; + + var list = result.ToList(); + } + + [Test] + public void SelectEnumTest() + { + var result = from i in Session.Query.All() select i.InvoiceDate.DayOfWeek; + result.ToList(); + } + + [Test] + public void SelectAnonymousEnumTest() + { + var result = from i in Session.Query.All() select new {i.InvoiceDate.DayOfWeek}; + result.ToList(); + } + + [Test] + public void SelectEnumFieldTest() + { + var result = from t in Session.Query.All() select t.MediaFormat; + foreach (var t in result) + Assert.AreEqual(t, MediaFormat.Audio); + } + + [Test] + public void SelectAnonymousEnumFieldTest() + { + var result = from t in Session.Query.All() select new {t.MediaFormat}; + foreach (var t in result) + Assert.AreEqual(t.MediaFormat, MediaFormat.Audio); + } + + [Test] + public void SelectCharTest() + { + var result = from c in Session.Query.All() select c.LastName[0]; + var list = result.ToList(); + } + + [Test] + public void SelectByteArrayLengthTest() + { + var categories = Session.Query.All(); + var result = from c in categories select c.Bytes.Length; + var list = result.ToList(); + } + + [Test] + public void SelectEqualsTest() + { + var customers = Session.Query.All(); + var result = from c in customers select c.CompanyName.Equals("lalala"); + var list = result.ToList(); + } + + [Test] + public void DoubleSelectEntitySet1Test() + { + IQueryable> query = Session.Query.All().Select(c => c.Invoices).Select(c => c); + foreach (var order in query) + QueryDumper.Dump(order); + } + + [Test] + public void DoubleSelectEntitySet2Test() + { + IQueryable> query = Session.Query.All().Select(c => c).Select(c => c.Invoices); + foreach (var order in query) + QueryDumper.Dump(order); + } + + [Test] + public void DoubleSelectEntitySet3Test() + { + var query = Session.Query.All().Select(c => c.Invoices.Select(o => o)); +// var query = Session.Query.All().Select(c => c.Orders); + + foreach (var order in query) + QueryDumper.Dump(order); + } + + [Test] + public void NestedAnonymousTest() + { + var result = Session.Query.All() + .Select(c => new {c}) + .Select(a1 => new {a1}) + .Select(a2 => a2.a1.c.CompanyName); + QueryDumper.Dump(result); + } + + [Test] + public void EntityWithLazyLoadFieldTest() + { + var category = Session.Query.All().Where(c => c.Bytes!=null).First(); + int columnIndex = Domain.Model.Types[typeof (Track)].Fields["Bytes"].MappingInfo.Offset; + Assert.IsFalse(category.State.Tuple.GetFieldState(columnIndex).IsAvailable()); + } + + [Test] + public void AnonymousSelectTest() + { + var result = Session.Query.All() + .Select(i => new {i.InvoiceDate, i.Commission}) + .Select(g => g.InvoiceDate); + QueryDumper.Dump(result); + } + + [Test] + public void SelectJustOuterParameterTest() + { + var result = Session.Query.All().Select(c => Session.Query.All().Select(s => c)); + foreach (var i in result) + i.ToList(); + } + + [Test] + public void NonPersistentFieldTest() + { + var result = from e in Session.Query.All() select e.FullName; + Assert.Throws(() => result.ToList()); + } + + [Test] + public void SelectBigMulTest() + { + var result = + from invoice in Session.Query.All() + select Math.BigMul(invoice.InvoiceId, invoice.DesignatedEmployee.EmployeeId); + result.ToList(); + } + + [Test] + public void SelectSignTest() + { + var result = + from invoice in Session.Query.All() + where invoice.InvoiceId > 0 && invoice.InvoiceId < 50 + let values = new { + Byte = (sbyte) invoice.InvoiceId, + Short = (short) invoice.InvoiceId, + Int = invoice.InvoiceId, + Long = (long) invoice.InvoiceId, + Decimal = (decimal) invoice.InvoiceId, + Float = (float) invoice.InvoiceId, + Double = (double) invoice.InvoiceId, + } + select new { + ByteSign = Math.Sign(values.Byte), + ShortSign = Math.Sign(values.Short), + IntSign = Math.Sign(values.Int), + LongSign = Math.Sign(values.Long), + DecimalSign = Math.Sign(values.Decimal), + FloatSign = Math.Sign(values.Float), + DoubleSign = Math.Sign(values.Double) + }; + foreach (var item in result) { + Assert.AreEqual(1, item.ByteSign); + Assert.AreEqual(1, item.ShortSign); + Assert.AreEqual(1, item.IntSign); + Assert.AreEqual(1, item.LongSign); + Assert.AreEqual(1, item.DecimalSign); + Assert.AreEqual(1, item.FloatSign); + Assert.AreEqual(1, item.DoubleSign); + } + } + + [Test] + public void SelectStringIndexerTest() + { + var result = + Session.Query.All() + .Select(c => new { + String = c.CustomerId, + Char0 = c.Email[0], + Char1 = c.Email[1], + Char2 = c.Email[2], + Char3 = c.Email[3], + Char4 = c.Email[4], + }) + .ToArray() + .OrderBy(item => item.String) + .ToArray(); + var expected = + Session.Query.All() + .ToArray() + .Select(c => new { + String = c.CustomerId, + Char0 = c.Email[0], + Char1 = c.Email[1], + Char2 = c.Email[2], + Char3 = c.Email[3], + Char4 = c.Email[4], + }) + .OrderBy(item => item.String) + .ToArray(); + Assert.AreEqual(expected.Length, result.Length); + for (int i = 0; i < expected.Length; i++) { + Assert.AreEqual(expected[0].String, result[0].String); + Assert.AreEqual(expected[0].Char0, result[0].Char0); + Assert.AreEqual(expected[0].Char1, result[0].Char1); + Assert.AreEqual(expected[0].Char2, result[0].Char2); + Assert.AreEqual(expected[0].Char3, result[0].Char3); + Assert.AreEqual(expected[0].Char4, result[0].Char4); + } + } + + [Test] + public void SelectIndexOfTest() + { + char _char = 'A'; + var result = + Session.Query.All() + .Select(c => new { + String = c.FirstName, + IndexOfChar = c.FirstName.IndexOf(_char), + IndexOfCharStart = c.FirstName.IndexOf(_char, 1), + IndexOfCharStartCount = c.FirstName.IndexOf(_char, 1, 1), + IndexOfString = c.FirstName.IndexOf(_char.ToString()), + IndexOfStringStart = c.FirstName.IndexOf(_char.ToString(), 1), + IndexOfStringStartCount = c.FirstName.IndexOf(_char.ToString(), 1, 1) + }) + .ToArray() + .OrderBy(item => item.String) + .ToArray(); + var expected = + Session.Query.All() + .ToArray() + .Select(c => new { + String = c.FirstName, + IndexOfChar = c.FirstName.IndexOf(_char), + IndexOfCharStart = c.FirstName.IndexOf(_char, 1), + IndexOfCharStartCount = c.FirstName.IndexOf(_char, 1, 1), + IndexOfString = c.FirstName.IndexOf(_char.ToString()), + IndexOfStringStart = c.FirstName.IndexOf(_char.ToString(), 1), + IndexOfStringStartCount = c.FirstName.IndexOf(_char.ToString(), 1, 1) + }) + .OrderBy(item => item.String) + .ToArray(); + Assert.AreEqual(expected.Length, result.Length); + for (int i = 0; i < expected.Length; i++) { + Assert.AreEqual(expected[i].String, result[i].String); + Assert.AreEqual(expected[i].IndexOfChar, result[i].IndexOfChar); + Assert.AreEqual(expected[i].IndexOfCharStart, result[i].IndexOfCharStart); + Assert.AreEqual(expected[i].IndexOfCharStartCount, result[i].IndexOfCharStartCount); + Assert.AreEqual(expected[i].IndexOfString, result[i].IndexOfString); + Assert.AreEqual(expected[i].IndexOfStringStart, result[i].IndexOfStringStart); + Assert.AreEqual(expected[i].IndexOfStringStartCount, result[i].IndexOfStringStartCount); + } + } + + [Test] + public void SelectStringContainsTest() + { + var result = + Session.Query.All() + .Where(c => c.FirstName.Contains('')) + .OrderBy(c => c.FirstName) + .ToArray(); + var expected = + Session.Query.All() + .ToList() + .Where(c => c.FirstName.Contains('')) + .OrderBy(c => c.FirstName) + .ToArray(); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void SelectDateTimeTimeSpanTest() + { + var dateTime = new DateTime(2001, 1, 1, 1, 1, 1); + var timeSpan = new TimeSpan(1, 1, 1, 1); + + var result = Session.Query.All() + .Select(c => new { + CustomerId = c.CustomerId, + DateTime = dateTime, + TimeSpan = timeSpan + }) + .Select(k => new { + DateTime = k.DateTime, + DateTimeDate = k.DateTime.Date, + DateTimeTime = k.DateTime.TimeOfDay, + DateTimeYear = k.DateTime.Year, + DateTimeMonth = k.DateTime.Month, + DateTimeDay = k.DateTime.Day, + DateTimeHour = k.DateTime.Hour, + DateTimeMinute = k.DateTime.Minute, + DateTimeSecond = k.DateTime.Second, + DateTimeDayOfYear = k.DateTime.DayOfYear, + DateTimeDayOfWeek = k.DateTime.DayOfWeek, + TimeSpan = k.TimeSpan, + TimeSpanDays = k.TimeSpan.Days, + TimeSpanHours = k.TimeSpan.Hours, + TimeSpanMinutes = k.TimeSpan.Minutes, + TimeSpanSeconds = k.TimeSpan.Seconds, + TimeSpanTotalDays = k.TimeSpan.TotalDays, + TimeSpanTotalHours = k.TimeSpan.TotalHours, + TimeSpanTotalMinutes = k.TimeSpan.TotalMinutes, + TimeSpanTotalSeconds = k.TimeSpan.TotalSeconds, + TimeSpanTotalMilliSeconds = k.TimeSpan.TotalMilliseconds, + TimeSpanTicks = k.TimeSpan.Ticks, + TimeSpanDuration = k.TimeSpan.Duration(), + TimeSpanFromDays = TimeSpan.FromDays(k.TimeSpan.TotalDays), + TimeSpanFromHours = TimeSpan.FromHours(k.TimeSpan.TotalHours), + TimeSpanFromMinutes = TimeSpan.FromMinutes(k.TimeSpan.TotalMinutes), + TimeSpanFromSeconds = TimeSpan.FromSeconds(k.TimeSpan.TotalSeconds), + TimeSpanFromMilliseconds = TimeSpan.FromMilliseconds(k.TimeSpan.TotalMilliseconds), + }) + .First(); + Assert.AreEqual(dateTime, result.DateTime); + Assert.AreEqual(dateTime.Date, result.DateTimeDate); + Assert.AreEqual(dateTime.TimeOfDay, result.DateTimeTime); + Assert.AreEqual(dateTime.Year, result.DateTimeYear); + Assert.AreEqual(dateTime.Month, result.DateTimeMonth); + Assert.AreEqual(dateTime.Day, result.DateTimeDay); + Assert.AreEqual(dateTime.Hour, result.DateTimeHour); + Assert.AreEqual(dateTime.Minute, result.DateTimeMinute); + Assert.AreEqual(dateTime.Second, result.DateTimeSecond); + Assert.AreEqual(dateTime.DayOfYear, result.DateTimeDayOfYear); + Assert.AreEqual(dateTime.DayOfWeek, result.DateTimeDayOfWeek); + Assert.AreEqual(timeSpan, result.TimeSpan); + Assert.AreEqual(timeSpan.Days, result.TimeSpanDays); + Assert.AreEqual(timeSpan.Hours, result.TimeSpanHours); + Assert.AreEqual(timeSpan.Minutes, result.TimeSpanMinutes); + Assert.AreEqual(timeSpan.Seconds, result.TimeSpanSeconds); + Assert.IsTrue(Math.Abs(timeSpan.TotalDays - result.TimeSpanTotalDays) < 0.1); + Assert.IsTrue(Math.Abs(timeSpan.TotalHours - result.TimeSpanTotalHours) < 0.1); + Assert.IsTrue(Math.Abs(timeSpan.TotalMinutes - result.TimeSpanTotalMinutes) < 0.1); + Assert.IsTrue(Math.Abs(timeSpan.TotalSeconds - result.TimeSpanTotalSeconds) < 0.1); + Assert.IsTrue(Math.Abs(timeSpan.TotalMilliseconds - result.TimeSpanTotalMilliSeconds) < 0.1); + Assert.AreEqual(timeSpan.Ticks, result.TimeSpanTicks); + Assert.AreEqual(timeSpan.Duration(), result.TimeSpanDuration); + Assert.AreEqual(timeSpan, result.TimeSpanFromDays); + Assert.AreEqual(timeSpan, result.TimeSpanFromHours); + Assert.AreEqual(timeSpan, result.TimeSpanFromMinutes); + Assert.AreEqual(timeSpan, result.TimeSpanFromSeconds); + Assert.AreEqual(timeSpan, result.TimeSpanFromMilliseconds); + } + + [Test] + public void SelectSubstringTest() + { + var result = Session.Query.All().Select(c => new { + String = c.Email, + FromTwo = c.Email.Substring(2), + FromThreeTakeOne = c.Email.Substring(3, 1), + }).ToArray(); + foreach (var item in result) { + Assert.AreEqual(item.String.Substring(2), item.FromTwo); + Assert.AreEqual(item.String.Substring(3, 1), item.FromThreeTakeOne); + } + } + + [Test] + public void ExternalPropertyCall() + { + Require.AllFeaturesSupported(ProviderFeatures.TemporaryTables); + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All().Select(c => Customers.Single(c2 => c2==c)).ToList(); + } + + [Test] + public void ExternalMethodCall() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .Select(c => GetCustomers().Single(c2 => c2==c)); + var expected = Session.Query.All() + .AsEnumerable() + .Select(c => GetCustomers().AsEnumerable().Single(c2 => c2==c)); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void ExternalMethodWithCorrectParams1Call() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var query = Session.Query.All() + .Select(c => GetCustomers(1).Single(c2 => c2==c)); + var expected = Session.Query.All() + .AsEnumerable() + .Select(c => GetCustomers(1).AsEnumerable().Single(c2 => c2==c)); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void ExternalMethodWithCorrectParams2Call() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + int count = 1; + var query = Session.Query.All() + .Select(c => GetCustomers(count).Single(c2 => c2==c)); + var expected = Session.Query.All() + .AsEnumerable() + .Select(c => GetCustomers(count).AsEnumerable().Single(c2 => c2==c)); + Assert.AreEqual(0, expected.Except(query).Count()); + } + + [Test] + public void ExternalMethodWithIncorrectParamsCall() + { + Assert.Throws(() => { + var query = Session.Query.All().Select(c => GetCustomers(c.Invoices.Count()).Single(c2 => c2==c)).ToList(); + }); + } + + public IQueryable GetCustomers() + { + return Session.Query.All(); + } + + public IQueryable GetCustomers(int count) + { + return Session.Query.All(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SelectWithAccessToLocalCollectionTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SelectWithAccessToLocalCollectionTest.cs index c354a3d6d0..bca8a17f0d 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SelectWithAccessToLocalCollectionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SelectWithAccessToLocalCollectionTest.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.16 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.SelectWithAccessToLocalCollectionTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace SelectWithAccessToLocalCollectionTestModel - { - [HierarchyRoot] - public class TestEntity : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public int Value { get; set; } - } - } - - [TestFixture] - public class SelectWithAccessToLocalCollectionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity)); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new TestEntity {Value = 1}; - new TestEntity {Value = 2}; - new TestEntity {Value = 3}; - new TestEntity {Value = 4}; - new TestEntity {Value = 5}; - tx.Complete(); - } - } - - [Test] - public void SelectDirectTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new[] {1, 2, 3}; - var query = session.Query.All() - .Select(e => items.Contains(e.Value)); - TestQuery(query, v => v, 3); - } - } - - [Test] - public void SelectViaAnonymousType1Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new[] {1, 2, 3}; - var query = session.Query.All() - .Select(e => new {e.Id, Value = items.Contains(e.Value)}); - TestQuery(query, v => v.Value, 3); - } - } - - [Test] - public void SelectViaAnonymousType2Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new[] {1, 2, 3}; - var query = session.Query.All() - .Select(e => new {Dummy = e.Value, Value = items.Contains(e.Value)}); - TestQuery(query, v => v.Value, 3); - } - } - - - [Test] - public void SelectViaAnonymousType3Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var items = new[] {1, 2, 3}; - var query = session.Query.All() - .Select(e => new {e, Value = items.Contains(e.Value)}); - TestQuery(query, v => v.Value, 3); - } - } - - private void TestQuery(IEnumerable query, Func valueSelector, int expectedCount) - { - var result = query.ToList(); - var count = result.Count(valueSelector); - Assert.That(count, Is.EqualTo(expectedCount)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.16 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.SelectWithAccessToLocalCollectionTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace SelectWithAccessToLocalCollectionTestModel + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public int Value { get; set; } + } + } + + [TestFixture] + public class SelectWithAccessToLocalCollectionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity)); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new TestEntity {Value = 1}; + new TestEntity {Value = 2}; + new TestEntity {Value = 3}; + new TestEntity {Value = 4}; + new TestEntity {Value = 5}; + tx.Complete(); + } + } + + [Test] + public void SelectDirectTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new[] {1, 2, 3}; + var query = session.Query.All() + .Select(e => items.Contains(e.Value)); + TestQuery(query, v => v, 3); + } + } + + [Test] + public void SelectViaAnonymousType1Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new[] {1, 2, 3}; + var query = session.Query.All() + .Select(e => new {e.Id, Value = items.Contains(e.Value)}); + TestQuery(query, v => v.Value, 3); + } + } + + [Test] + public void SelectViaAnonymousType2Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new[] {1, 2, 3}; + var query = session.Query.All() + .Select(e => new {Dummy = e.Value, Value = items.Contains(e.Value)}); + TestQuery(query, v => v.Value, 3); + } + } + + + [Test] + public void SelectViaAnonymousType3Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var items = new[] {1, 2, 3}; + var query = session.Query.All() + .Select(e => new {e, Value = items.Contains(e.Value)}); + TestQuery(query, v => v.Value, 3); + } + } + + private void TestQuery(IEnumerable query, Func valueSelector, int expectedCount) + { + var result = query.ToList(); + var count = result.Count(valueSelector); + Assert.That(count, Is.EqualTo(expectedCount)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SetOperationsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SetOperationsTest.cs index 3f141e6428..dcd268ea00 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SetOperationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SetOperationsTest.cs @@ -1,253 +1,253 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2009.04.06 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [Serializable] - public class SetOperationsTest : ChinookDOModelTest - { - [Test] - public void SimpleConcatTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); - var customers = Session.Query.All();; - var result = customers.Where(c => c.Invoices.Count <= 1).Concat(Session.Query.All().Where(c => c.Invoices.Count > 1)); - QueryDumper.Dump(result); - Assert.AreEqual(customers.Count(), result.Count()); - } - - [Test] - public void SimpleUnionTest() - { - var products = Session.Query.All(); - var customers = Session.Query.All(); - var productFirstChars = - from p in products - select p.Name.Substring(0, 1); - var customerFirstChars = - from c in customers - select c.CompanyName.Substring(0, 1); - var uniqueFirstChars = productFirstChars.Union(customerFirstChars); - QueryDumper.Dump(uniqueFirstChars); - - } - - [Test] - public void IntersectTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var products = Session.Query.All(); - var customers = Session.Query.All(); - var productFirstChars = - from p in products - select p.Name.Substring(0, 1); - var customerFirstChars = - from c in customers - select c.CompanyName.Substring(0, 1); - var commonFirstChars = productFirstChars.Intersect(customerFirstChars); - QueryDumper.Dump(commonFirstChars); - - } - - [Test] - public void SimpleIntersectTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var query = Session.Query.All() - .Select(o => o.DesignatedEmployee) - .Intersect(Session.Query.All().Select(o => o.DesignatedEmployee)); - - QueryDumper.Dump(query); - } - - [Test] - public void SimpleExceptTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var products = Session.Query.All(); - var customers = Session.Query.All(); - var productFirstChars = - from p in products - select p.Name.Substring(0, 1); - var customerFirstChars = - from c in customers - select c.CompanyName.Substring(0, 1); - var productOnlyFirstChars = productFirstChars.Except(customerFirstChars); - QueryDumper.Dump(productOnlyFirstChars); - } - - [Test] - public void ConcatDifferentTest() - { - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = ( - from c in customers - select c.Phone - ).Concat( - from c in customers - select c.Fax - ).Concat( - from e in employees - select e.Email - ); - QueryDumper.Dump(result); - } - - [Test] - public void ConcatDifferentTest2() - { - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = ( - from c in customers - select new { Name = c.CompanyName, c.Phone } - ).Concat( - from e in employees - select new { Name = e.FirstName + " " + e.LastName, Phone = e.Phone } - ); - QueryDumper.Dump(result); - } - - [Test] - public void UnionDifferentTest() - { - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = ( - from c in customers - select c.Address.Country - ).Union( - from e in employees - select e.Address.Country - ); - QueryDumper.Dump(result); - } - - [Test] - public void IntersectDifferentTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = ( - from c in customers - select c.Address.Country - ).Intersect( - from e in employees - select e.Address.Country - ); - QueryDumper.Dump(result); - } - - [Test] - public void ExceptDifferentTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - Require.ProviderIsNot(StorageProvider.Firebird); - Require.ProviderIsNot(StorageProvider.MySql); - var customers = Session.Query.All(); - var employees = Session.Query.All(); - var result = ( - from c in customers - select c.Address.Country - ).Except( - from e in employees - select e.Address.Country - ); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymousTest() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - var customers = Session.Query.All(); - var result = customers.Select(c => new {Company = c.CompanyName, c.LastName}) - .Take(10) - .Union(customers.Select(c => new {Company = c.CompanyName, c.LastName})); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymous2Test() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - var customers = Session.Query.All(); - var result = customers.Select(c => new { Company = c.CompanyName, c.LastName, c.Address }) - .Where(c => c.Address.StreetAddress.Length < 10) - .Select(c => new {c.Company, c.Address.City}) - .Take(10) - .Union(customers.Select(c => new { Company = c.CompanyName, c.Address.City})).Where(c=>c.Company.Length < 10); - QueryDumper.Dump(result); - } - - [Test] - public void UnionAnonymous3Test() - { - // SQLite does not support paging operations inside set operations - Require.ProviderIsNot(StorageProvider.Sqlite); - - var customers = Session.Query.All(); - var shipper = Session.Query.All(); - var result = customers.Select(c => new { c.FirstName, c.LastName, c.Address }) - .Where(c => c.Address.StreetAddress.Length < 15) - .Select(c => new { Name = c.FirstName, Address = c.Address.City }) - .Take(10) - .Union(shipper.Select(s => new { Name = s.FirstName, Address = s.Phone })) - .Where(c=>c.Address.Length < 7); - QueryDumper.Dump(result); - } - - [Test] - public void UnionStructureTest() - { - var customers = Session.Query.All(); - var result = customers.Select(c => c.Address) - .Where(c => c.StreetAddress.Length > 0) - .Union(customers.Select(c => c.Address)) - .Where(c => c.State=="BC"); - QueryDumper.Dump(result); - } - - [Test] - public void IntersectWithoutOneOfSelect() - { - Require.AllFeaturesSupported(ProviderFeatures.Apply); - var actual = from c in Session.Query.All() - from r in (c.Invoices) - .Intersect(c.Invoices).Select(o => o.PaymentDate) - orderby r - select r; - var expected = from c in Session.Query.All().ToList() - from r in (c.Invoices) - .Intersect(c.Invoices).Select(o => o.PaymentDate) - orderby r - select r; - Assert.That(expected.Except(actual), Is.Empty); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2009.04.06 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [Serializable] + public class SetOperationsTest : ChinookDOModelTest + { + [Test] + public void SimpleConcatTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe | StorageProvider.Oracle); + var customers = Session.Query.All();; + var result = customers.Where(c => c.Invoices.Count <= 1).Concat(Session.Query.All().Where(c => c.Invoices.Count > 1)); + QueryDumper.Dump(result); + Assert.AreEqual(customers.Count(), result.Count()); + } + + [Test] + public void SimpleUnionTest() + { + var products = Session.Query.All(); + var customers = Session.Query.All(); + var productFirstChars = + from p in products + select p.Name.Substring(0, 1); + var customerFirstChars = + from c in customers + select c.CompanyName.Substring(0, 1); + var uniqueFirstChars = productFirstChars.Union(customerFirstChars); + QueryDumper.Dump(uniqueFirstChars); + + } + + [Test] + public void IntersectTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var products = Session.Query.All(); + var customers = Session.Query.All(); + var productFirstChars = + from p in products + select p.Name.Substring(0, 1); + var customerFirstChars = + from c in customers + select c.CompanyName.Substring(0, 1); + var commonFirstChars = productFirstChars.Intersect(customerFirstChars); + QueryDumper.Dump(commonFirstChars); + + } + + [Test] + public void SimpleIntersectTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var query = Session.Query.All() + .Select(o => o.DesignatedEmployee) + .Intersect(Session.Query.All().Select(o => o.DesignatedEmployee)); + + QueryDumper.Dump(query); + } + + [Test] + public void SimpleExceptTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var products = Session.Query.All(); + var customers = Session.Query.All(); + var productFirstChars = + from p in products + select p.Name.Substring(0, 1); + var customerFirstChars = + from c in customers + select c.CompanyName.Substring(0, 1); + var productOnlyFirstChars = productFirstChars.Except(customerFirstChars); + QueryDumper.Dump(productOnlyFirstChars); + } + + [Test] + public void ConcatDifferentTest() + { + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = ( + from c in customers + select c.Phone + ).Concat( + from c in customers + select c.Fax + ).Concat( + from e in employees + select e.Email + ); + QueryDumper.Dump(result); + } + + [Test] + public void ConcatDifferentTest2() + { + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = ( + from c in customers + select new { Name = c.CompanyName, c.Phone } + ).Concat( + from e in employees + select new { Name = e.FirstName + " " + e.LastName, Phone = e.Phone } + ); + QueryDumper.Dump(result); + } + + [Test] + public void UnionDifferentTest() + { + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = ( + from c in customers + select c.Address.Country + ).Union( + from e in employees + select e.Address.Country + ); + QueryDumper.Dump(result); + } + + [Test] + public void IntersectDifferentTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = ( + from c in customers + select c.Address.Country + ).Intersect( + from e in employees + select e.Address.Country + ); + QueryDumper.Dump(result); + } + + [Test] + public void ExceptDifferentTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + Require.ProviderIsNot(StorageProvider.Firebird); + Require.ProviderIsNot(StorageProvider.MySql); + var customers = Session.Query.All(); + var employees = Session.Query.All(); + var result = ( + from c in customers + select c.Address.Country + ).Except( + from e in employees + select e.Address.Country + ); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymousTest() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + var customers = Session.Query.All(); + var result = customers.Select(c => new {Company = c.CompanyName, c.LastName}) + .Take(10) + .Union(customers.Select(c => new {Company = c.CompanyName, c.LastName})); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymous2Test() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + var customers = Session.Query.All(); + var result = customers.Select(c => new { Company = c.CompanyName, c.LastName, c.Address }) + .Where(c => c.Address.StreetAddress.Length < 10) + .Select(c => new {c.Company, c.Address.City}) + .Take(10) + .Union(customers.Select(c => new { Company = c.CompanyName, c.Address.City})).Where(c=>c.Company.Length < 10); + QueryDumper.Dump(result); + } + + [Test] + public void UnionAnonymous3Test() + { + // SQLite does not support paging operations inside set operations + Require.ProviderIsNot(StorageProvider.Sqlite); + + var customers = Session.Query.All(); + var shipper = Session.Query.All(); + var result = customers.Select(c => new { c.FirstName, c.LastName, c.Address }) + .Where(c => c.Address.StreetAddress.Length < 15) + .Select(c => new { Name = c.FirstName, Address = c.Address.City }) + .Take(10) + .Union(shipper.Select(s => new { Name = s.FirstName, Address = s.Phone })) + .Where(c=>c.Address.Length < 7); + QueryDumper.Dump(result); + } + + [Test] + public void UnionStructureTest() + { + var customers = Session.Query.All(); + var result = customers.Select(c => c.Address) + .Where(c => c.StreetAddress.Length > 0) + .Union(customers.Select(c => c.Address)) + .Where(c => c.State=="BC"); + QueryDumper.Dump(result); + } + + [Test] + public void IntersectWithoutOneOfSelect() + { + Require.AllFeaturesSupported(ProviderFeatures.Apply); + var actual = from c in Session.Query.All() + from r in (c.Invoices) + .Intersect(c.Invoices).Select(o => o.PaymentDate) + orderby r + select r; + var expected = from c in Session.Query.All().ToList() + from r in (c.Invoices) + .Intersect(c.Invoices).Select(o => o.PaymentDate) + orderby r + select r; + Assert.That(expected.Except(actual), Is.Empty); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SkipTakeElementAtTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SkipTakeElementAtTest.cs index 42b4d27fcb..93444e08f9 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SkipTakeElementAtTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SkipTakeElementAtTest.cs @@ -1,291 +1,291 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.10.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [Category("Linq")] - [TestFixture] - public class SkipTakeElementAtTest : ChinookDOModelTest - { - [Test] - public void ReuseTake1Test() - { - Assert.Throws(() => { - var result1 = TakeCustomersIncorrect(1).Count(); - Assert.AreEqual(1, result1); - var result2 = TakeCustomersIncorrect(2).Count(); - Assert.AreEqual(2, result2); - }); - } - - [Test] - public void TakeTest() - { - var query = Session.Query.All() - .Where(c => c.Address.Country=="Germany") - .Select(c => c.Key) - .Take(10); - var list = query.ToList(); - Assert.Greater(list.Count, 0); - } - - [Test] - public void MultipleTakeSkipRandomTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - IQueryable query = Session.Query.All().OrderBy(customer => customer.CustomerId); - int count = query.Count(); - var expected = query.AsEnumerable(); - var randomManager = RandomManager.CreateRandom(); - for (int i = 0; i < 5; i++) { - int randomInt = randomManager.Next(0, 9); - switch (randomInt) { - case 0: - // Take with negative count - var takeNegativeCount = randomManager.Next(-count + 1, -1); - query = query.Take(takeNegativeCount); - expected = expected.Take(takeNegativeCount); - break; - case 1: - case 2: - case 3: - case 4: - // Take - var takeCount = randomManager.Next((int) (count * 0.8), count); - query = query.Take(takeCount); - expected = expected.Take(takeCount); - break; - case 5: - case 6: - case 7: - case 8: - // Skip - var skipCount = randomManager.Next((int) (count * 0.1), count); - query = query.Skip(skipCount); - expected = expected.Skip(skipCount); - break; - case 9: - // Skip with negative count - var skipNegativeCount = randomManager.Next((int) (-count*0.1 + 1), -1); - query = query.Skip(skipNegativeCount); - expected = expected.Skip(skipNegativeCount); - break; - } - } - Assert.IsTrue(expected.SequenceEqual(query)); - } - - [Test] - public void ReuseTake2Test() - { - var result1 = TakeCustomersCorrect(1).Count(); - Assert.AreEqual(1, result1); - var result2 = TakeCustomersCorrect(2).Count(); - Assert.AreEqual(2, result2); - } - - [Test] - public void ReuseSkipTest() - { - Assert.Throws(() => { - var totalCount = Session.Query.All().Count(); - var result1 = SkipCustomersIncorrect(1).Count(); - Assert.AreEqual(totalCount - 1, result1); - var result2 = SkipCustomersIncorrect(2).Count(); - Assert.AreEqual(totalCount - 2, result2); - }); - } - - [Test] - public void ReuseSkip2Test() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var totalCount = Session.Query.All().Count(); - var result1 = SkipCustomersCorrect(1).Count(); - Assert.AreEqual(totalCount - 1, result1); - var result2 = SkipCustomersCorrect(2).Count(); - Assert.AreEqual(totalCount - 2, result2); - } - - [Test] - public void ReuseElementAtTest() - { - Assert.Throws(() => { - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = 0; i < customers.Count; i++) - Assert.AreEqual(customers[i], ElementAtIncorrect(i)); - }); - } - - [Test] - public void ReuseElementAt2Test() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) - if (i < 0) { - int index = i; - AssertEx.ThrowsInvalidOperationException(() => ElementAtCorrect(index)); - } - else if (i >= customers.Count) { - int index = i; - AssertEx.ThrowsInvalidOperationException(() => ElementAtCorrect(index)); - } - else - Assert.AreEqual(customers[i], ElementAtCorrect(i)); - } - - - [Test] - public void ReuseElementAtOrDefaultTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0 || i >= customers.Count) - Assert.IsNull(ElementAtOrDefaultCorrect(i)); - else - Assert.AreEqual(customers[i], ElementAtOrDefaultCorrect(i)); - } - } - - [Test] - public void ReuseElementAtOrDefault2Test() - { - Assert.Throws(() => { - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0 || i >= customers.Count) - Assert.IsNull(ElementAtOrDefaultIncorrect(i)); - else - Assert.AreEqual(customers[i], ElementAtOrDefaultIncorrect(i)); - } - }); - } - - [Test] - public void ElementAtOrDefaultIsNotRootTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0 || i >= customers.Count) - Assert.IsNull(Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(i)); - else - Assert.AreEqual(customers[i], Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(i)); - } - } - - [Test] - public void ElementAtOrDefaultIsRootTest() - { - Require.AllFeaturesSupported(ProviderFeatures.RowNumber); - var customers = Session.Query.All().ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0 || i >= customers.Count) - Assert.IsNull(Session.Query.All().ElementAtOrDefault(i)); - else - Assert.AreEqual(customers[i], Session.Query.All().ElementAtOrDefault(i)); - } - } - - [Test] - public void ElementAtIsNotRootTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0) { - int index = i; - AssertEx.ThrowsArgumentOutOfRangeException(() => Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); - } - else if (i >= customers.Count) { - int index = i; - AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); - } - else - Assert.AreEqual(customers[i], Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(i)); - } - } - - [Test] - public void ElementAtIsRootTest() - { - Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); - var customers = Session.Query.All().ToList(); - Assert.IsTrue(customers.Count > 0); - for (int i = -100; i < customers.Count + 100; i++) { - if (i < 0) { - int index = i; - AssertEx.ThrowsArgumentOutOfRangeException(() => Session.Query.All().ElementAt(index)); - } - else if (i >= customers.Count) { - int index = i; - AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().ElementAt(index)); - } - else - Assert.AreEqual(customers[i], Session.Query.All().ElementAt(i)); - } - } - - private IEnumerable TakeCustomersIncorrect(int amount) - { - return Session.Query.Execute(qe => qe.All().Take(amount)); - } - - private IEnumerable TakeCustomersCorrect(int amount) - { - return Session.Query.Execute(qe => qe.All().Take(() => amount)); - } - - private IEnumerable SkipCustomersIncorrect(int skip) - { - return Session.Query.Execute(qe => qe.All().Skip(skip)); - } - - private IEnumerable SkipCustomersCorrect(int skip) - { - return Session.Query.Execute(qe => qe.All().Skip(() => skip)); - } - - private Customer ElementAtIncorrect(int index) - { - return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); - } - - private Customer ElementAtCorrect(int index) - { - return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAt(() => index)); - } - - private Customer ElementAtOrDefaultIncorrect(int index) - { - return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(index)); - } - - private Customer ElementAtOrDefaultCorrect(int index) - { - return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(() => index)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.10.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [Category("Linq")] + [TestFixture] + public class SkipTakeElementAtTest : ChinookDOModelTest + { + [Test] + public void ReuseTake1Test() + { + Assert.Throws(() => { + var result1 = TakeCustomersIncorrect(1).Count(); + Assert.AreEqual(1, result1); + var result2 = TakeCustomersIncorrect(2).Count(); + Assert.AreEqual(2, result2); + }); + } + + [Test] + public void TakeTest() + { + var query = Session.Query.All() + .Where(c => c.Address.Country=="Germany") + .Select(c => c.Key) + .Take(10); + var list = query.ToList(); + Assert.Greater(list.Count, 0); + } + + [Test] + public void MultipleTakeSkipRandomTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + IQueryable query = Session.Query.All().OrderBy(customer => customer.CustomerId); + int count = query.Count(); + var expected = query.AsEnumerable(); + var randomManager = RandomManager.CreateRandom(); + for (int i = 0; i < 5; i++) { + int randomInt = randomManager.Next(0, 9); + switch (randomInt) { + case 0: + // Take with negative count + var takeNegativeCount = randomManager.Next(-count + 1, -1); + query = query.Take(takeNegativeCount); + expected = expected.Take(takeNegativeCount); + break; + case 1: + case 2: + case 3: + case 4: + // Take + var takeCount = randomManager.Next((int) (count * 0.8), count); + query = query.Take(takeCount); + expected = expected.Take(takeCount); + break; + case 5: + case 6: + case 7: + case 8: + // Skip + var skipCount = randomManager.Next((int) (count * 0.1), count); + query = query.Skip(skipCount); + expected = expected.Skip(skipCount); + break; + case 9: + // Skip with negative count + var skipNegativeCount = randomManager.Next((int) (-count*0.1 + 1), -1); + query = query.Skip(skipNegativeCount); + expected = expected.Skip(skipNegativeCount); + break; + } + } + Assert.IsTrue(expected.SequenceEqual(query)); + } + + [Test] + public void ReuseTake2Test() + { + var result1 = TakeCustomersCorrect(1).Count(); + Assert.AreEqual(1, result1); + var result2 = TakeCustomersCorrect(2).Count(); + Assert.AreEqual(2, result2); + } + + [Test] + public void ReuseSkipTest() + { + Assert.Throws(() => { + var totalCount = Session.Query.All().Count(); + var result1 = SkipCustomersIncorrect(1).Count(); + Assert.AreEqual(totalCount - 1, result1); + var result2 = SkipCustomersIncorrect(2).Count(); + Assert.AreEqual(totalCount - 2, result2); + }); + } + + [Test] + public void ReuseSkip2Test() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var totalCount = Session.Query.All().Count(); + var result1 = SkipCustomersCorrect(1).Count(); + Assert.AreEqual(totalCount - 1, result1); + var result2 = SkipCustomersCorrect(2).Count(); + Assert.AreEqual(totalCount - 2, result2); + } + + [Test] + public void ReuseElementAtTest() + { + Assert.Throws(() => { + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = 0; i < customers.Count; i++) + Assert.AreEqual(customers[i], ElementAtIncorrect(i)); + }); + } + + [Test] + public void ReuseElementAt2Test() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) + if (i < 0) { + int index = i; + AssertEx.ThrowsInvalidOperationException(() => ElementAtCorrect(index)); + } + else if (i >= customers.Count) { + int index = i; + AssertEx.ThrowsInvalidOperationException(() => ElementAtCorrect(index)); + } + else + Assert.AreEqual(customers[i], ElementAtCorrect(i)); + } + + + [Test] + public void ReuseElementAtOrDefaultTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0 || i >= customers.Count) + Assert.IsNull(ElementAtOrDefaultCorrect(i)); + else + Assert.AreEqual(customers[i], ElementAtOrDefaultCorrect(i)); + } + } + + [Test] + public void ReuseElementAtOrDefault2Test() + { + Assert.Throws(() => { + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0 || i >= customers.Count) + Assert.IsNull(ElementAtOrDefaultIncorrect(i)); + else + Assert.AreEqual(customers[i], ElementAtOrDefaultIncorrect(i)); + } + }); + } + + [Test] + public void ElementAtOrDefaultIsNotRootTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0 || i >= customers.Count) + Assert.IsNull(Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(i)); + else + Assert.AreEqual(customers[i], Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(i)); + } + } + + [Test] + public void ElementAtOrDefaultIsRootTest() + { + Require.AllFeaturesSupported(ProviderFeatures.RowNumber); + var customers = Session.Query.All().ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0 || i >= customers.Count) + Assert.IsNull(Session.Query.All().ElementAtOrDefault(i)); + else + Assert.AreEqual(customers[i], Session.Query.All().ElementAtOrDefault(i)); + } + } + + [Test] + public void ElementAtIsNotRootTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var customers = Session.Query.All().OrderBy(customer => customer.CustomerId).ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0) { + int index = i; + AssertEx.ThrowsArgumentOutOfRangeException(() => Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); + } + else if (i >= customers.Count) { + int index = i; + AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); + } + else + Assert.AreEqual(customers[i], Session.Query.All().OrderBy(customer => customer.CustomerId).ElementAt(i)); + } + } + + [Test] + public void ElementAtIsRootTest() + { + Require.AnyFeatureSupported(ProviderFeatures.RowNumber | ProviderFeatures.NativePaging); + var customers = Session.Query.All().ToList(); + Assert.IsTrue(customers.Count > 0); + for (int i = -100; i < customers.Count + 100; i++) { + if (i < 0) { + int index = i; + AssertEx.ThrowsArgumentOutOfRangeException(() => Session.Query.All().ElementAt(index)); + } + else if (i >= customers.Count) { + int index = i; + AssertEx.ThrowsInvalidOperationException(() => Session.Query.All().ElementAt(index)); + } + else + Assert.AreEqual(customers[i], Session.Query.All().ElementAt(i)); + } + } + + private IEnumerable TakeCustomersIncorrect(int amount) + { + return Session.Query.Execute(qe => qe.All().Take(amount)); + } + + private IEnumerable TakeCustomersCorrect(int amount) + { + return Session.Query.Execute(qe => qe.All().Take(() => amount)); + } + + private IEnumerable SkipCustomersIncorrect(int skip) + { + return Session.Query.Execute(qe => qe.All().Skip(skip)); + } + + private IEnumerable SkipCustomersCorrect(int skip) + { + return Session.Query.Execute(qe => qe.All().Skip(() => skip)); + } + + private Customer ElementAtIncorrect(int index) + { + return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAt(index)); + } + + private Customer ElementAtCorrect(int index) + { + return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAt(() => index)); + } + + private Customer ElementAtOrDefaultIncorrect(int index) + { + return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(index)); + } + + private Customer ElementAtOrDefaultCorrect(int index) + { + return Session.Query.Execute(qe => qe.All().OrderBy(customer => customer.CustomerId).ElementAtOrDefault(() => index)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SortExpressionExtractorTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SortExpressionExtractorTest.cs index ffbb7aaf12..366407f674 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SortExpressionExtractorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SortExpressionExtractorTest.cs @@ -1,117 +1,117 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.11.02 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Linq; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class SortExpressionExtractorTest - { - public class Entity1 - { - public string Description { get; private set; } - } - - public class Entity2 - { - public string Name { get; private set; } - - public int Age { get; private set; } - - public Entity1 Other { get; private set; } - } - - [Test] - public void Test1() - { - var extractor = new SortExpressionExtractor(); - var baseQuery = GetQuery(); - var query = baseQuery.OrderBy(e => e.Age).ThenBy(e => e.Other.Description); - Assert.That(extractor.Extract(query.Expression)); - Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); - Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); - AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Age); - AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Positive, e => e.Other.Description); - } - - [Test] - public void Test2() - { - var extractor = new SortExpressionExtractor(); - var baseQuery = GetQuery(); - var query = baseQuery.OrderByDescending(e => e.Age).ThenBy(e => e.Other.Description); - Assert.That(extractor.Extract(query.Expression)); - Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); - Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); - AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Negative, e => e.Age); - AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Positive, e => e.Other.Description); - } - - [Test] - public void Test3() - { - var extractor = new SortExpressionExtractor(); - var baseQuery = GetQuery(); - var query = baseQuery.OrderBy(e => e.Age).ThenByDescending(e => e.Other.Description); - Assert.That(extractor.Extract(query.Expression)); - Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); - Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); - AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Age); - AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Negative, e => e.Other.Description); - } - - [Test] - public void Test4() - { - var extractor = new SortExpressionExtractor(); - var baseQuery = GetQuery(); - var query = baseQuery.OrderBy(e => e.Other.Description); - Assert.That(extractor.Extract(query.Expression)); - Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); - Assert.That(extractor.SortExpressions.Count, Is.EqualTo(1)); - AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Other.Description); - } - - [Test] - public void Test5() - { - var extractor = new SortExpressionExtractor(); - var baseQuery = GetQuery(); - Assert.That(extractor.Extract(baseQuery.Expression), Is.False); - } - - private void AssertSortExpressionIs(KeyValuePair item, - Direction exprectedDirection, Expression> expectedExpression) - { - var actualExpression = item.Key; - var actualDirection = item.Value; - - AssertExpressionEquals(expectedExpression, actualExpression); - - Assert.That(actualDirection, Is.EqualTo(exprectedDirection)); - } - - private static void AssertExpressionEquals(LambdaExpression expectedExpression, LambdaExpression actualExpression) - { - var equals = ExpressionTree.Equals(actualExpression, expectedExpression); - Assert.That(equals, "Expected expression '{0}' got '{1}'", expectedExpression.ToString(true), actualExpression.ToString(true)); - } - - private IQueryable GetQuery() - { - return new Entity2[0].AsQueryable(); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.11.02 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Linq; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class SortExpressionExtractorTest + { + public class Entity1 + { + public string Description { get; private set; } + } + + public class Entity2 + { + public string Name { get; private set; } + + public int Age { get; private set; } + + public Entity1 Other { get; private set; } + } + + [Test] + public void Test1() + { + var extractor = new SortExpressionExtractor(); + var baseQuery = GetQuery(); + var query = baseQuery.OrderBy(e => e.Age).ThenBy(e => e.Other.Description); + Assert.That(extractor.Extract(query.Expression)); + Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); + Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); + AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Age); + AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Positive, e => e.Other.Description); + } + + [Test] + public void Test2() + { + var extractor = new SortExpressionExtractor(); + var baseQuery = GetQuery(); + var query = baseQuery.OrderByDescending(e => e.Age).ThenBy(e => e.Other.Description); + Assert.That(extractor.Extract(query.Expression)); + Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); + Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); + AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Negative, e => e.Age); + AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Positive, e => e.Other.Description); + } + + [Test] + public void Test3() + { + var extractor = new SortExpressionExtractor(); + var baseQuery = GetQuery(); + var query = baseQuery.OrderBy(e => e.Age).ThenByDescending(e => e.Other.Description); + Assert.That(extractor.Extract(query.Expression)); + Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); + Assert.That(extractor.SortExpressions.Count, Is.EqualTo(2)); + AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Age); + AssertSortExpressionIs(extractor.SortExpressions[1], Direction.Negative, e => e.Other.Description); + } + + [Test] + public void Test4() + { + var extractor = new SortExpressionExtractor(); + var baseQuery = GetQuery(); + var query = baseQuery.OrderBy(e => e.Other.Description); + Assert.That(extractor.Extract(query.Expression)); + Assert.That(extractor.BaseExpression, Is.SameAs(baseQuery.Expression)); + Assert.That(extractor.SortExpressions.Count, Is.EqualTo(1)); + AssertSortExpressionIs(extractor.SortExpressions[0], Direction.Positive, e => e.Other.Description); + } + + [Test] + public void Test5() + { + var extractor = new SortExpressionExtractor(); + var baseQuery = GetQuery(); + Assert.That(extractor.Extract(baseQuery.Expression), Is.False); + } + + private void AssertSortExpressionIs(KeyValuePair item, + Direction exprectedDirection, Expression> expectedExpression) + { + var actualExpression = item.Key; + var actualDirection = item.Value; + + AssertExpressionEquals(expectedExpression, actualExpression); + + Assert.That(actualDirection, Is.EqualTo(exprectedDirection)); + } + + private static void AssertExpressionEquals(LambdaExpression expectedExpression, LambdaExpression actualExpression) + { + var equals = ExpressionTree.Equals(actualExpression, expectedExpression); + Assert.That(equals, "Expected expression '{0}' got '{1}'", expectedExpression.ToString(true), actualExpression.ToString(true)); + } + + private IQueryable GetQuery() + { + return new Entity2[0].AsQueryable(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SubqueryAndComputedColumnOptimizationTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SubqueryAndComputedColumnOptimizationTest.cs index 9f0c5ebcf1..e9b4b65be2 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SubqueryAndComputedColumnOptimizationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SubqueryAndComputedColumnOptimizationTest.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.08.27 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.SubqueryAndComputedColumnOptimizationTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace SubqueryAndComputedColumnOptimizationTestModel - { - [HierarchyRoot] - public class Product : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - } - - [HierarchyRoot] - public class ProductLocalization : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Description { get; set; } - - [Field] - public string Culture { get; set; } - - [Field] - public Product Product { get; set; } - } - } - - [TestFixture] - public class SubqueryAndComputedColumnOptimizationTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Product).Assembly, typeof (Product).Namespace); - return configuration; - } - - private List> GetLocalizedProducts(Session session, string culture) - { - var query = session.Query.All() - .Select(p => new { - Product = p, - Name = session.Query.All() - .Where(l => l.Product==p && l.Culture==culture) - .Select(l => l.Name) - .FirstOrDefault() ?? p.Name, - Description = session.Query.All() - .Where(l => l.Product==p && l.Culture==culture) - .Select(l => l.Description) - .FirstOrDefault() ?? p.Description - }) - .OrderBy(i => i.Name).ThenBy(i => i.Description); - - return query.AsEnumerable().Select(i => new Pair(i.Product, i.Name)).ToList(); - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var product = new Product { - Name = "DataObjects.Net", - Description = "UberORM" - }; - var localization = new ProductLocalization { - Product = product, - Name = "ДанныеОбъекты.Сеть", - Description = "УберОРМ", - Culture = "ru", - }; - - var russianProducts = GetLocalizedProducts(session, "ru"); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.08.27 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.SubqueryAndComputedColumnOptimizationTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace SubqueryAndComputedColumnOptimizationTestModel + { + [HierarchyRoot] + public class Product : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + } + + [HierarchyRoot] + public class ProductLocalization : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Description { get; set; } + + [Field] + public string Culture { get; set; } + + [Field] + public Product Product { get; set; } + } + } + + [TestFixture] + public class SubqueryAndComputedColumnOptimizationTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Product).Assembly, typeof (Product).Namespace); + return configuration; + } + + private List> GetLocalizedProducts(Session session, string culture) + { + var query = session.Query.All() + .Select(p => new { + Product = p, + Name = session.Query.All() + .Where(l => l.Product==p && l.Culture==culture) + .Select(l => l.Name) + .FirstOrDefault() ?? p.Name, + Description = session.Query.All() + .Where(l => l.Product==p && l.Culture==culture) + .Select(l => l.Description) + .FirstOrDefault() ?? p.Description + }) + .OrderBy(i => i.Name).ThenBy(i => i.Description); + + return query.AsEnumerable().Select(i => new Pair(i.Product, i.Name)).ToList(); + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var product = new Product { + Name = "DataObjects.Net", + Description = "UberORM" + }; + var localization = new ProductLocalization { + Product = product, + Name = "ДанныеОбъекты.Сеть", + Description = "УберОРМ", + Culture = "ru", + }; + + var russianProducts = GetLocalizedProducts(session, "ru"); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/SubqueryWithCalculatedFieldTest.cs b/Orm/Xtensive.Orm.Tests/Linq/SubqueryWithCalculatedFieldTest.cs index 164fb3a7e9..7a9d116f23 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/SubqueryWithCalculatedFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/SubqueryWithCalculatedFieldTest.cs @@ -1,118 +1,118 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.21 - -using System; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Linq; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace SubqueryWithCalculatedFieldTestModel - { - [HierarchyRoot] - public class Subqueried : Entity - { - [Field] - [Key] - public int Id { get; set; } - - [Field] - public decimal Money { get; set; } - - [Field] - public decimal Price { get; set; } - - [Field] - public int Amount { get; set; } - - public decimal Total { get; set; } - } - - [CompilerContainer(typeof (Expression))] - public static class SubqueriedCompiler - { - private static readonly Expression> MyEntTextExpression = a => a.Price * a.Amount; - - [Compiler(typeof (Subqueried), "Total", TargetKind.PropertyGet)] - public static Expression Total(Expression assignmentExpression) - { - return MyEntTextExpression.BindParameters(assignmentExpression); - } - - public class SubqueryWithCalculatedFieldTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Subqueried).Assembly, typeof (Subqueried).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Subqueried {Money = 5, Price = 4, Amount = 2}; - new Subqueried {Money = 3, Price = 2, Amount = 1}; - tx.Complete(); - } - } - - [Test] - public void AggregateWithCustomCompilerTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from item in session.Query.All() - select new {Item = item, FakeKey = 0} - into i group i by i.FakeKey; - - var aggregateQuery = - from item in query - select new { - SumTotal = item.Sum(b => b.Item.Total), - SumMoney = item.Sum(b => b.Item.Money) - }; - - var result = aggregateQuery.ToArray()[0]; - - Assert.That(result.SumTotal, Is.EqualTo(10m)); - Assert.That(result.SumMoney, Is.EqualTo(8m)); - } - } - - [Test] - public void AggregateWithoutCustomCompilerTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var query = - from item in session.Query.All() - select new {Item = item, FakeKey = 0} - into i group i by i.FakeKey; - - var aggregateQuery = - from item in query - select new { - SumTotal = item.Sum(b => b.Item.Amount * b.Item.Price), - SumMoney = item.Sum(b => b.Item.Money) - }; - - var result = aggregateQuery.ToArray()[0]; - - Assert.That(result.SumTotal, Is.EqualTo(10m)); - Assert.That(result.SumMoney, Is.EqualTo(8m)); - } - } - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.21 + +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Linq; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace SubqueryWithCalculatedFieldTestModel + { + [HierarchyRoot] + public class Subqueried : Entity + { + [Field] + [Key] + public int Id { get; set; } + + [Field] + public decimal Money { get; set; } + + [Field] + public decimal Price { get; set; } + + [Field] + public int Amount { get; set; } + + public decimal Total { get; set; } + } + + [CompilerContainer(typeof (Expression))] + public static class SubqueriedCompiler + { + private static readonly Expression> MyEntTextExpression = a => a.Price * a.Amount; + + [Compiler(typeof (Subqueried), "Total", TargetKind.PropertyGet)] + public static Expression Total(Expression assignmentExpression) + { + return MyEntTextExpression.BindParameters(assignmentExpression); + } + + public class SubqueryWithCalculatedFieldTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Subqueried).Assembly, typeof (Subqueried).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Subqueried {Money = 5, Price = 4, Amount = 2}; + new Subqueried {Money = 3, Price = 2, Amount = 1}; + tx.Complete(); + } + } + + [Test] + public void AggregateWithCustomCompilerTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from item in session.Query.All() + select new {Item = item, FakeKey = 0} + into i group i by i.FakeKey; + + var aggregateQuery = + from item in query + select new { + SumTotal = item.Sum(b => b.Item.Total), + SumMoney = item.Sum(b => b.Item.Money) + }; + + var result = aggregateQuery.ToArray()[0]; + + Assert.That(result.SumTotal, Is.EqualTo(10m)); + Assert.That(result.SumMoney, Is.EqualTo(8m)); + } + } + + [Test] + public void AggregateWithoutCustomCompilerTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var query = + from item in session.Query.All() + select new {Item = item, FakeKey = 0} + into i group i by i.FakeKey; + + var aggregateQuery = + from item in query + select new { + SumTotal = item.Sum(b => b.Item.Amount * b.Item.Price), + SumMoney = item.Sum(b => b.Item.Money) + }; + + var result = aggregateQuery.ToArray()[0]; + + Assert.That(result.SumTotal, Is.EqualTo(10m)); + Assert.That(result.SumMoney, Is.EqualTo(8m)); + } + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/TypeAsOptimizationTest.cs b/Orm/Xtensive.Orm.Tests/Linq/TypeAsOptimizationTest.cs index 6eaa9781c0..4d21f217d3 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/TypeAsOptimizationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/TypeAsOptimizationTest.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.08.28 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.TypeAsOptimizationTestModel; - -namespace Xtensive.Orm.Tests.Linq -{ - namespace TypeAsOptimizationTestModel - { - [HierarchyRoot] - public class Parent : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Name { get; set; } - } - - public class Child1 : Parent - { - [Field] - public int IntValue { get; set; } - } - - public class Child2 : Child1 - { - [Field] - public string StringValue { get; set; } - } - - public class OtherChild : Parent - { - [Field] - public DateTime DateValue { get; set; } - } - - public class UniversalResult - { - public Child2 Child2 { get; set; } - public OtherChild Other { get; set; } - } - } - - public class TypeAsOptimizationTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Child1 {Name = "Child1", IntValue = 10}; - new Child2 {Name = "Child2", StringValue = "Hello"}; - var result = session.Query.All() - .Select(p => new UniversalResult {Child2 = p as Child2, Other = p as OtherChild}) - .Where(i => i.Child2.IntValue==10) - .ToList(); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.08.28 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.TypeAsOptimizationTestModel; + +namespace Xtensive.Orm.Tests.Linq +{ + namespace TypeAsOptimizationTestModel + { + [HierarchyRoot] + public class Parent : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Name { get; set; } + } + + public class Child1 : Parent + { + [Field] + public int IntValue { get; set; } + } + + public class Child2 : Child1 + { + [Field] + public string StringValue { get; set; } + } + + public class OtherChild : Parent + { + [Field] + public DateTime DateValue { get; set; } + } + + public class UniversalResult + { + public Child2 Child2 { get; set; } + public OtherChild Other { get; set; } + } + } + + public class TypeAsOptimizationTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Child1 {Name = "Child1", IntValue = 10}; + new Child2 {Name = "Child2", StringValue = "Hello"}; + var result = session.Query.All() + .Select(p => new UniversalResult {Child2 = p as Child2, Other = p as OtherChild}) + .Where(i => i.Child2.IntValue==10) + .ToList(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/TypeCastAndInheritanceTest.cs b/Orm/Xtensive.Orm.Tests/Linq/TypeCastAndInheritanceTest.cs index 5c70ce7cd1..01bbbda30a 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/TypeCastAndInheritanceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/TypeCastAndInheritanceTest.cs @@ -1,494 +1,494 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.04.10 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture, Category("Linq")] - public class TypeCastAndInheritanceTest : ChinookDOModelTest - { - [Test] - public void InheritanceCountTest() - { - var trackCount = Session.Query.All().Count(); - var videoTrackCount = Session.Query.All().Count(); - var audionTrack = Session.Query.All().Count(); - Assert.IsTrue(trackCount > 0); - Assert.IsTrue(videoTrackCount > 0); - Assert.IsTrue(audionTrack > 0); - Assert.AreEqual(trackCount, videoTrackCount, audionTrack); - } - - [Test] - public void IsSimpleTest() - { - var result = Session.Query.All().Where(t => t is VideoTrack); - QueryDumper.Dump(result); - } - - [Test] - public void IsSameTypeTest() - { -#pragma warning disable 183 - var result = Session.Query.All().Where(t => t is Track); -#pragma warning restore 183 - QueryDumper.Dump(result); - } - - [Test] - public void IsSubTypeTest() - { -#pragma warning disable 183 - var result = Session.Query.All().Where(t => t is Track); -#pragma warning restore 183 - QueryDumper.Dump(result); - } - - [Test] - public void IsIntermediateTest() - { - Assert.Throws( () => { - Session.Query.All() - .Where(t => t is IntermediateTrack) - .Select(track => (IntermediateTrack) track) - .Count(); - }); - } - - [Test] - public void IsCountTest() - { - int trackCount = Session.Query.All().Count(); - int intermediateTrackCount = Session.Query.All().Count(); - int videoTrackCount = Session.Query.All().Count(); - int audionTrackCount = Session.Query.All().Count(); - - Assert.Greater(trackCount, 0); - Assert.Greater(intermediateTrackCount, 0); - Assert.Greater(videoTrackCount, 0); - Assert.Greater(audionTrackCount, 0); - - Assert.AreEqual( - trackCount, - intermediateTrackCount); - - Assert.Throws( - () => { - Assert.AreEqual( - intermediateTrackCount, - Session.Query.All() - .Where(t => t is IntermediateTrack) - .Select(track => (IntermediateTrack) track) - .Count()); - }); - Assert.Throws( - () => { - Assert.AreEqual( - videoTrackCount, - Session.Query.All() - .Where(t => t is VideoTrack) - .Select(track => (VideoTrack) track) - .Count()); - }); - - Assert.Throws( - () => { - Assert.AreEqual( - audionTrackCount, - Session.Query.All() - .Where(t => t is AudioTrack) - .Select(track => (AudioTrack) track) - .Count()); - }); - -#pragma warning disable 183 - Assert.AreEqual( - trackCount, - Session.Query.All() - .Where(t => t is Track) - .Count()); -#pragma warning restore 183 - } - - [Test] - public void OfTypeSimpleTest() - { - var result = Session.Query.All().OfType(); - QueryDumper.Dump(result); - } - - [Test] - public void OfTypeSameTypeTest() - { - var result = Session.Query.All().OfType(); - QueryDumper.Dump(result); - } - - [Test] - public void OfTypeSubTypeTest() - { - var result = Session.Query.All().OfType(); - QueryDumper.Dump(result); - } - - [Test] - public void OfTypeIntermediateTest() - { - Session.Query.All() - .OfType() - .Count(); - } - - [Test] - public void OfTypeWithFieldAccessTest() - { - var result = Session.Query.All() - .OfType() - .Select(at => at.Genre); - QueryDumper.Dump(result); - } - - [Test] - public void OfTypeCountTest() - { - int trackCount = Session.Query.All().Count(); - int intermediateTrackCount = Session.Query.All().Count(); - int videoTrackCount = Session.Query.All().Count(); - int audioTrackCount = Session.Query.All().Count(); - - Assert.Greater(trackCount, 0); - Assert.Greater(intermediateTrackCount, 0); - Assert.Greater(videoTrackCount, 0); - Assert.Greater(audioTrackCount, 0); - - Assert.AreEqual(trackCount, intermediateTrackCount); - - Assert.AreEqual( - intermediateTrackCount, - Session.Query.All() - .OfType() - .Count()); - - Assert.AreEqual( - videoTrackCount, - Session.Query.All() - .OfType() - .Count()); - - Assert.AreEqual( - audioTrackCount, - Session.Query.All() - .OfType() - .Count()); - - Assert.AreEqual( - trackCount, - Session.Query.All() - .OfType() - .Count()); - } - - [Test] - public void CastSimpleTest() - { - var videoTracks = Session.Query.All().Cast(); - var list = videoTracks.ToList(); - Assert.Greater(list.Count, 0); - } - - - [Test] - public void CastCountTest() - { - var videoTrackCount1 = Session.Query.All().Count(); - var videoTrackCount2 = Session.Query.All().Cast().Where(track => track!=null).Count(); - Assert.AreEqual(videoTrackCount1, videoTrackCount2); - - var audioTrackCount1 = Session.Query.All().Count(); - var audioTrackCount2 = Session.Query.All().Cast().Where(track => track!=null).Count(); - Assert.AreEqual(audioTrackCount1, audioTrackCount2); - - var trackCount1 = Session.Query.All().Count(); - var trackCount2 = Session.Query.All().Cast().Count(); - Assert.AreEqual(trackCount1, trackCount2); - } - - [Test] - public void OfTypeGetFieldTest() - { - var result = Session.Query.All() - .OfType() - .Select(vt => vt.Name); - QueryDumper.Dump(result); - } - - [Test] - public void IsGetParentFieldTest() - { - var result = Session.Query.All() - .Where(t => t is VideoTrack) - .Select(x => (VideoTrack) x) - .Select(vt => vt.Name); - Assert.Throws(() => QueryDumper.Dump(result)); - } - - [Test] - public void IsGetChildFieldTest() - { - var result = Session.Query.All() - .Where(t => t is VideoTrack) - .Select(x => (VideoTrack) x) - .Select(vt => vt.Name); - Assert.Throws(() => QueryDumper.Dump(result)); - } - - [Test] - public void CastToBaseTest() - { - var result = Session.Query.All() - .Select(x => (Track) x); - QueryDumper.Dump(result); - } - - - [Test] - public void IsBoolResultTest() - { - var result = Session.Query.All() - .Select(x => x is VideoTrack - ? x - : null); - QueryDumper.Dump(result); - } - - [Test] - public void AnonymousCastTest() - { - var result = Session.Query.All() - .Select(x => new {VideoTrack = x as VideoTrack}); - QueryDumper.Dump(result); - } - - [Test] - public void TwoChildrenCastTest() - { - var result = Session.Query.All() - .Select(x => - new { - VideoTrack = x as VideoTrack, - AudioTrack = x as AudioTrack - }); - QueryDumper.Dump(result); - } - - - [Test] - public void ComplexIsCastTest() - { - var result = Session.Query.All() - .Select(x => - new { - VideoTrack = x is VideoTrack - ? (VideoTrack) x - : null, - AudioTrack = x is AudioTrack - ? (AudioTrack) x - : null - }) - .Select(x => - new { - AQ = x.AudioTrack==null - ? "NULL" - : x.AudioTrack.Name, - DQ = x.VideoTrack==null - ? "NULL" - : x.VideoTrack.Name - }); - - Assert.Throws(() => QueryDumper.Dump(result)); - } - - [Test] - public void ComplexAsCastTest() - { - var result = Session.Query.All() - .Select(track => - new { - VideoTrack = track as VideoTrack, - AudioTrack = track as AudioTrack - }) - .Select(anonymousArgument => new { - AQ = anonymousArgument.AudioTrack==null - ? "NULL" - : anonymousArgument.AudioTrack.Name, - DQ = anonymousArgument.VideoTrack==null - ? "NULL" - : anonymousArgument.VideoTrack.Name - }); - QueryDumper.Dump(result); - } - - [Test] - public void ComplexAsCast2Test() - { - var result = Session.Query.All() - .Select(track => - new { - VideoTrack = track, - AudioTrack = track - }) - .Select(anonymousArgument => - new { - AQ = anonymousArgument.AudioTrack as AudioTrack, - DQ = anonymousArgument.VideoTrack as VideoTrack - }); - QueryDumper.Dump(result); - } - - [Test] - public void AsDowncastTest() - { - var result = Session.Query.All() - .Select(track => track as VideoTrack); - QueryDumper.Dump(result); - } - - [Test] - public void AsDowncastWithFieldSelectTest() - { - var result = Session.Query.All() - .Select(track => track as VideoTrack) - .Select(videoTrack => videoTrack==null ? "NULL" : videoTrack.Name); - QueryDumper.Dump(result); - } - - [Test] - public void AsUpcastTest() - { - var result = Session.Query.All() - .Select(videoTrack => videoTrack as Track); - QueryDumper.Dump(result); - } - - [Test] - public void AsUpcastWithFieldSelectTest() - { - var result = Session.Query.All() - .Select(videoTrack => videoTrack as Track) - .Select(track => track==null ? "NULL" : track.Name); - QueryDumper.Dump(result); - } - - [Test] - public void AsUpcastWithConditionalTest() - { - var result = Session.Query.All() - .Select(videoTrack => videoTrack as Track) - .Select(track => track==null ? null : track); - QueryDumper.Dump(result); - } - - [Test] - public void WrongCastTest() - { - var result = Session.Query.All() - .Select(videoTrack => videoTrack as Track) - .Select(track => track as AudioTrack); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceAsSimpleTest() - { - var result = Session.Query.All() - .Select(invoiceLine => invoiceLine.Track as AudioTrack); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceIsSimpleTest() - { - var result = Session.Query.All() - .Where(invoiceLine => invoiceLine.Track is AudioTrack); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceOfTypeSimpleTest() - { - var result = Session.Query.All() - .Select(invoiceLine => invoiceLine.Track) - .OfType(); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceOfTypeWithFieldTest() - { - var result = Session.Query.All() - .Select(invoiceLine => invoiceLine.Track) - .OfType() - .Select(vt => vt.Name); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceAsAnonymousTest() - { - var result = Session.Query.All() - .Select(invoiceLine => new {Track = invoiceLine.Track as AudioTrack}); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceIsAnonymousTest() - { - var result = Session.Query.All() - .Where(invoiceLine => invoiceLine.Track is AudioTrack); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceOfTypeAnonymousTest() - { - var result = Session.Query.All() - .Select(invoiceLine => new {invoiceLine.Track}) - .Select(t => t.Track) - .OfType(); - QueryDumper.Dump(result); - } - - [Test] - public void ReferenceOfTypeAnonymousWithFieldAccessTest() - { - var result = Session.Query.All() - .Select(invoiceLine => new {invoiceLine.Track}) - .Select(t => t.Track) - .OfType() - .Select(ap => ap.Name); - QueryDumper.Dump(result); - } - - [Test] - public void ImplicitNumericTest() - { - long value = 0; - var customer = Session.Query.All().Where(c=>c.CompanyName!=null).OrderBy(c => c.CompanyName).First(); - var result = Session.Query.All() - .Where(c => c==customer) - .Select(c => c.CompanyName.Length + value) - .First(); - Assert.AreEqual(customer.CompanyName.Length, result); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.04.10 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture, Category("Linq")] + public class TypeCastAndInheritanceTest : ChinookDOModelTest + { + [Test] + public void InheritanceCountTest() + { + var trackCount = Session.Query.All().Count(); + var videoTrackCount = Session.Query.All().Count(); + var audionTrack = Session.Query.All().Count(); + Assert.IsTrue(trackCount > 0); + Assert.IsTrue(videoTrackCount > 0); + Assert.IsTrue(audionTrack > 0); + Assert.AreEqual(trackCount, videoTrackCount, audionTrack); + } + + [Test] + public void IsSimpleTest() + { + var result = Session.Query.All().Where(t => t is VideoTrack); + QueryDumper.Dump(result); + } + + [Test] + public void IsSameTypeTest() + { +#pragma warning disable 183 + var result = Session.Query.All().Where(t => t is Track); +#pragma warning restore 183 + QueryDumper.Dump(result); + } + + [Test] + public void IsSubTypeTest() + { +#pragma warning disable 183 + var result = Session.Query.All().Where(t => t is Track); +#pragma warning restore 183 + QueryDumper.Dump(result); + } + + [Test] + public void IsIntermediateTest() + { + Assert.Throws( () => { + Session.Query.All() + .Where(t => t is IntermediateTrack) + .Select(track => (IntermediateTrack) track) + .Count(); + }); + } + + [Test] + public void IsCountTest() + { + int trackCount = Session.Query.All().Count(); + int intermediateTrackCount = Session.Query.All().Count(); + int videoTrackCount = Session.Query.All().Count(); + int audionTrackCount = Session.Query.All().Count(); + + Assert.Greater(trackCount, 0); + Assert.Greater(intermediateTrackCount, 0); + Assert.Greater(videoTrackCount, 0); + Assert.Greater(audionTrackCount, 0); + + Assert.AreEqual( + trackCount, + intermediateTrackCount); + + Assert.Throws( + () => { + Assert.AreEqual( + intermediateTrackCount, + Session.Query.All() + .Where(t => t is IntermediateTrack) + .Select(track => (IntermediateTrack) track) + .Count()); + }); + Assert.Throws( + () => { + Assert.AreEqual( + videoTrackCount, + Session.Query.All() + .Where(t => t is VideoTrack) + .Select(track => (VideoTrack) track) + .Count()); + }); + + Assert.Throws( + () => { + Assert.AreEqual( + audionTrackCount, + Session.Query.All() + .Where(t => t is AudioTrack) + .Select(track => (AudioTrack) track) + .Count()); + }); + +#pragma warning disable 183 + Assert.AreEqual( + trackCount, + Session.Query.All() + .Where(t => t is Track) + .Count()); +#pragma warning restore 183 + } + + [Test] + public void OfTypeSimpleTest() + { + var result = Session.Query.All().OfType(); + QueryDumper.Dump(result); + } + + [Test] + public void OfTypeSameTypeTest() + { + var result = Session.Query.All().OfType(); + QueryDumper.Dump(result); + } + + [Test] + public void OfTypeSubTypeTest() + { + var result = Session.Query.All().OfType(); + QueryDumper.Dump(result); + } + + [Test] + public void OfTypeIntermediateTest() + { + Session.Query.All() + .OfType() + .Count(); + } + + [Test] + public void OfTypeWithFieldAccessTest() + { + var result = Session.Query.All() + .OfType() + .Select(at => at.Genre); + QueryDumper.Dump(result); + } + + [Test] + public void OfTypeCountTest() + { + int trackCount = Session.Query.All().Count(); + int intermediateTrackCount = Session.Query.All().Count(); + int videoTrackCount = Session.Query.All().Count(); + int audioTrackCount = Session.Query.All().Count(); + + Assert.Greater(trackCount, 0); + Assert.Greater(intermediateTrackCount, 0); + Assert.Greater(videoTrackCount, 0); + Assert.Greater(audioTrackCount, 0); + + Assert.AreEqual(trackCount, intermediateTrackCount); + + Assert.AreEqual( + intermediateTrackCount, + Session.Query.All() + .OfType() + .Count()); + + Assert.AreEqual( + videoTrackCount, + Session.Query.All() + .OfType() + .Count()); + + Assert.AreEqual( + audioTrackCount, + Session.Query.All() + .OfType() + .Count()); + + Assert.AreEqual( + trackCount, + Session.Query.All() + .OfType() + .Count()); + } + + [Test] + public void CastSimpleTest() + { + var videoTracks = Session.Query.All().Cast(); + var list = videoTracks.ToList(); + Assert.Greater(list.Count, 0); + } + + + [Test] + public void CastCountTest() + { + var videoTrackCount1 = Session.Query.All().Count(); + var videoTrackCount2 = Session.Query.All().Cast().Where(track => track!=null).Count(); + Assert.AreEqual(videoTrackCount1, videoTrackCount2); + + var audioTrackCount1 = Session.Query.All().Count(); + var audioTrackCount2 = Session.Query.All().Cast().Where(track => track!=null).Count(); + Assert.AreEqual(audioTrackCount1, audioTrackCount2); + + var trackCount1 = Session.Query.All().Count(); + var trackCount2 = Session.Query.All().Cast().Count(); + Assert.AreEqual(trackCount1, trackCount2); + } + + [Test] + public void OfTypeGetFieldTest() + { + var result = Session.Query.All() + .OfType() + .Select(vt => vt.Name); + QueryDumper.Dump(result); + } + + [Test] + public void IsGetParentFieldTest() + { + var result = Session.Query.All() + .Where(t => t is VideoTrack) + .Select(x => (VideoTrack) x) + .Select(vt => vt.Name); + Assert.Throws(() => QueryDumper.Dump(result)); + } + + [Test] + public void IsGetChildFieldTest() + { + var result = Session.Query.All() + .Where(t => t is VideoTrack) + .Select(x => (VideoTrack) x) + .Select(vt => vt.Name); + Assert.Throws(() => QueryDumper.Dump(result)); + } + + [Test] + public void CastToBaseTest() + { + var result = Session.Query.All() + .Select(x => (Track) x); + QueryDumper.Dump(result); + } + + + [Test] + public void IsBoolResultTest() + { + var result = Session.Query.All() + .Select(x => x is VideoTrack + ? x + : null); + QueryDumper.Dump(result); + } + + [Test] + public void AnonymousCastTest() + { + var result = Session.Query.All() + .Select(x => new {VideoTrack = x as VideoTrack}); + QueryDumper.Dump(result); + } + + [Test] + public void TwoChildrenCastTest() + { + var result = Session.Query.All() + .Select(x => + new { + VideoTrack = x as VideoTrack, + AudioTrack = x as AudioTrack + }); + QueryDumper.Dump(result); + } + + + [Test] + public void ComplexIsCastTest() + { + var result = Session.Query.All() + .Select(x => + new { + VideoTrack = x is VideoTrack + ? (VideoTrack) x + : null, + AudioTrack = x is AudioTrack + ? (AudioTrack) x + : null + }) + .Select(x => + new { + AQ = x.AudioTrack==null + ? "NULL" + : x.AudioTrack.Name, + DQ = x.VideoTrack==null + ? "NULL" + : x.VideoTrack.Name + }); + + Assert.Throws(() => QueryDumper.Dump(result)); + } + + [Test] + public void ComplexAsCastTest() + { + var result = Session.Query.All() + .Select(track => + new { + VideoTrack = track as VideoTrack, + AudioTrack = track as AudioTrack + }) + .Select(anonymousArgument => new { + AQ = anonymousArgument.AudioTrack==null + ? "NULL" + : anonymousArgument.AudioTrack.Name, + DQ = anonymousArgument.VideoTrack==null + ? "NULL" + : anonymousArgument.VideoTrack.Name + }); + QueryDumper.Dump(result); + } + + [Test] + public void ComplexAsCast2Test() + { + var result = Session.Query.All() + .Select(track => + new { + VideoTrack = track, + AudioTrack = track + }) + .Select(anonymousArgument => + new { + AQ = anonymousArgument.AudioTrack as AudioTrack, + DQ = anonymousArgument.VideoTrack as VideoTrack + }); + QueryDumper.Dump(result); + } + + [Test] + public void AsDowncastTest() + { + var result = Session.Query.All() + .Select(track => track as VideoTrack); + QueryDumper.Dump(result); + } + + [Test] + public void AsDowncastWithFieldSelectTest() + { + var result = Session.Query.All() + .Select(track => track as VideoTrack) + .Select(videoTrack => videoTrack==null ? "NULL" : videoTrack.Name); + QueryDumper.Dump(result); + } + + [Test] + public void AsUpcastTest() + { + var result = Session.Query.All() + .Select(videoTrack => videoTrack as Track); + QueryDumper.Dump(result); + } + + [Test] + public void AsUpcastWithFieldSelectTest() + { + var result = Session.Query.All() + .Select(videoTrack => videoTrack as Track) + .Select(track => track==null ? "NULL" : track.Name); + QueryDumper.Dump(result); + } + + [Test] + public void AsUpcastWithConditionalTest() + { + var result = Session.Query.All() + .Select(videoTrack => videoTrack as Track) + .Select(track => track==null ? null : track); + QueryDumper.Dump(result); + } + + [Test] + public void WrongCastTest() + { + var result = Session.Query.All() + .Select(videoTrack => videoTrack as Track) + .Select(track => track as AudioTrack); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceAsSimpleTest() + { + var result = Session.Query.All() + .Select(invoiceLine => invoiceLine.Track as AudioTrack); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceIsSimpleTest() + { + var result = Session.Query.All() + .Where(invoiceLine => invoiceLine.Track is AudioTrack); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceOfTypeSimpleTest() + { + var result = Session.Query.All() + .Select(invoiceLine => invoiceLine.Track) + .OfType(); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceOfTypeWithFieldTest() + { + var result = Session.Query.All() + .Select(invoiceLine => invoiceLine.Track) + .OfType() + .Select(vt => vt.Name); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceAsAnonymousTest() + { + var result = Session.Query.All() + .Select(invoiceLine => new {Track = invoiceLine.Track as AudioTrack}); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceIsAnonymousTest() + { + var result = Session.Query.All() + .Where(invoiceLine => invoiceLine.Track is AudioTrack); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceOfTypeAnonymousTest() + { + var result = Session.Query.All() + .Select(invoiceLine => new {invoiceLine.Track}) + .Select(t => t.Track) + .OfType(); + QueryDumper.Dump(result); + } + + [Test] + public void ReferenceOfTypeAnonymousWithFieldAccessTest() + { + var result = Session.Query.All() + .Select(invoiceLine => new {invoiceLine.Track}) + .Select(t => t.Track) + .OfType() + .Select(ap => ap.Name); + QueryDumper.Dump(result); + } + + [Test] + public void ImplicitNumericTest() + { + long value = 0; + var customer = Session.Query.All().Where(c=>c.CompanyName!=null).OrderBy(c => c.CompanyName).First(); + var result = Session.Query.All() + .Where(c => c==customer) + .Select(c => c.CompanyName.Length + value) + .First(); + Assert.AreEqual(customer.CompanyName.Length, result); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Linq/WhereTest.cs b/Orm/Xtensive.Orm.Tests/Linq/WhereTest.cs index 869441ac3d..ada53c8bea 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/WhereTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/WhereTest.cs @@ -1,1339 +1,1339 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.12.13 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Linq -{ - public class TargetField - { - public TargetField(string name, object value) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentException("Parameter 'name' cannot be null or empty."); - - this.Name = name; - this.Value = value; - } - - public string Name { get; private set; } - - public object Value { get; private set; } - } - - [Category("Linq")] - [TestFixture] - public class WhereTest : ChinookDOModelTest - { - private Key albumOutOfExileKey; - private Key mediaTypeFirstKey; - - [OneTimeSetUp] - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - albumOutOfExileKey = session.Query.All().Single(a => a.Title=="Out Of Exile").Key; - mediaTypeFirstKey = session.Query.All().First().Key; - } - } - } - - [Test] - public void IndexerTest() - { - var query = Session.Query.All(); - var kvp = new Pair("Customer", Session.Query.All().First()); - query = query.Where(invoice => invoice[kvp.First]==kvp.Second); - var r = query.ToList(); - } - - [Test] - public void IndexerNullTest() - { - var query = Session.Query.All(); - var parameters = Session.Query.All().Take(1).Select(c => new TargetField("Customer", (Customer) null)).ToList(); - foreach (var item in parameters) { - var field = item; // This is important to use local variable - query = query.Where(invoice => invoice[field.Name]==field.Value); - } - var result = query.ToList(); - } - - [Test] - public void ReferenceFieldConditionTest() - { - var result = Session.Query.All() - .Where(invoice => invoice.Customer!=null) - .ToList(); - -// var expected = Session.Query.All() -// .AsEnumerable() -// .First(invoice => invoice.Customer!=null); -// Assert.AreEqual(expected.Customer, result.Customer); - } - - [Test] - public void IndexerSimpleFieldTest() - { - object freight = Session.Query - .All() - .First(invoice => invoice.Commission > 0.2m) - .Commission; - var result = Session.Query - .All() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice["Commission"]==freight) - .ToList(); - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Commission==(decimal?) freight) - .ToList(); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void IndexerStructureTest() - { - object address = Session.Query - .All() - .First(customer => customer.Address.City.Length > 0) - .Address; - var result = Session.Query - .All() - .OrderBy(customer => customer.CustomerId) - .Where(customer => customer["Address"]==address) - .ToList(); -#pragma warning disable 252,253 - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(customer => customer.CustomerId) - .Where(customer => customer.Address==address) - .ToList(); -#pragma warning restore 252,253 - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void IndexerEntity1Test() - { - object customer = Session.Query - .All() - .First(invoice => invoice.Customer!=null) - .Customer; - var result = Session.Query - .All() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice["Customer"]==customer) - .ToList(); - var expected = Session.Query - .All() - .AsEnumerable() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Customer==customer) - .ToList(); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void EntitySubqueryTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Customer== - Session.Query.All() - .OrderBy(invoice2 => invoice2.Customer.CustomerId) - .First(invoice2 => invoice2.Customer!=null) - .Customer) - .ToList(); - var expected = Session.Query.All() - .AsEnumerable() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Customer== - Session.Query.All() - .OrderBy(invoice2 => invoice2.Customer.CustomerId) - .First(invoice2 => invoice2.Customer!=null) - .Customer) - .ToList(); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void EntitySubqueryIndexerTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var result = Session.Query.All() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Customer== - Session.Query.All() - .OrderBy(invoice2 => invoice2.Customer.CustomerId) - .First(invoice2 => invoice2["Customer"]!=null) - .Customer) - .ToList(); - var expected = Session.Query.All() - .AsEnumerable() - .OrderBy(invoice => invoice.InvoiceId) - .Where(invoice => invoice.Customer== - Session.Query.All() - .OrderBy(invoice2 => invoice2.Customer.CustomerId) - .First(invoice2 => invoice2.Customer!=null) - .Customer) - .ToList(); - Assert.IsTrue(expected.SequenceEqual(result)); - } - - [Test] - public void ParameterTest() - { - var album = Session.Query.All().First(); - var result = Session.Query.All().Where(p => p.Album==album); - QueryDumper.Dump(result); - } - - [Test] - public void MultipleConditionTest() - { - var customerCompanies = Session.Query.All().Select(c => c.CompanyName).Where(cn => cn.StartsWith("A") || cn.StartsWith("B")).ToList(); - Assert.That(customerCompanies.Count, Is.EqualTo(2)); - Assert.That(customerCompanies.All(c => c.StartsWith("A") || c.StartsWith("B"))); - } - - [Test] - public void AnonymousTest() - { - Customer first = Session.Query.All().First(); - var p = new {Company = first.CompanyName, first.LastName}; - var result = Session.Query.All().Select(c => new {Company = c.CompanyName, c.LastName}).Take(10).Where(x => x==p).ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Company, Is.EqualTo(p.Company)); - Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); - } - - - [Test] - public void AnonymousTest2() - { - Customer first = Session.Query.All().First(); - var p = new {Company = first.CompanyName, first.LastName}; - var result = Session.Query.All().Select(c => new {Company = c.CompanyName, c.LastName}).Take(10).Where(x => p==x).ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].Company, Is.EqualTo(p.Company)); - Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); - } - - [Test] - public void AnonymousWithParameterTest() - { - Customer first = Session.Query.All().First(); - var p = new {Company = first.CompanyName, first.LastName}; - var result = Session.Query.All().Where(c => new {Company = c.CompanyName, c.LastName}==p).ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); - Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); - } - - [Test] - public void AnonymousWithParameter2Test() - { - Customer first = Session.Query.All().First(); - var p = new {Company = first.CompanyName, first.LastName}; - var k = new {InternalFiled = p}; - var result = Session.Query.All().Where(c => new {Company = c.CompanyName, c.LastName}==k.InternalFiled).ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); - Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); - } - - - [Test] - public void AnonymousWithParameter3Test() - { - Customer first = Session.Query.All().First(); - var p = new {Company = first.CompanyName, first.LastName}; - var k = new {InternalFiled = p}; - var result = Session.Query.All().Where(c => new {X = new {Company = c.CompanyName, c.LastName}}.X==k.InternalFiled).ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); - Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); - } - - [Test] - public void Anonymous2Test2() - { - var result = Session.Query.All().Where(c => new {Company = c.CompanyName}.Company== "JetBrains s.r.o.").ToList(); - Assert.That(result.Count, Is.EqualTo(1)); - Assert.That(result[0].CompanyName, Is.EqualTo("JetBrains s.r.o.")); - } - - [Test] - public void Anonymous3Test() - { - var expectedResultCount = Session.Query.All().Count(); - var result = Session.Query.All().Where(c => new {c.FirstName, c.LastName}==new {c.FirstName, c.LastName}).ToList(); - Assert.That(result.Count, Is.EqualTo(expectedResultCount)); - } - - [Test] - public void Anonymous4Test() - { - Require.AllFeaturesSupported(ProviderFeatures.RowNumber); - Customer first = Session.Query.All().First(); - Customer second = Session.Query.All().Skip(1).First(); - var p = new {first.Address.PostalCode, first.Address.City}; - var l = new {second.Address.PostalCode, second.Address.City}; - var result = Session.Query.All().Where(c => l==p).ToList(); - Assert.That(result, Is.Empty); - } - - - [Test] - public void ColumnTest() - { - var albums = Session.Query.All(); - var album = albums.Where(a => a.Title=="Plays Metallica By Four Cellos").FirstOrDefault(); - Assert.IsNotNull(album); - Assert.AreEqual("Plays Metallica By Four Cellos", album.Title); - } - - [Test] - public void CalculatedTest() - { - var expected = Session.Query.All().ToList().Where(i => i.Total * i.Commission >= 10).ToList(); - var actual = Session.Query.All().ToList().Where(i => i.Total * i.Commission >= 10).ToList(); - Assert.That(expected.Count, Is.GreaterThan(0)); - Assert.AreEqual(expected.Count, actual.Count); - } - - [Test] - public void StructureTest() - { - var employees = Session.Query.All(); - var employee = employees.Where(e => e.Address.State=="AB").FirstOrDefault(); - Assert.IsNotNull(employee); - Assert.AreEqual("AB", employee.Address.State); - } - - [Test] - public void IdTest() - { - var albums = Session.Query.All(); - var album = albums.Where(a => a.AlbumId==albumOutOfExileKey.Value.GetValue(0)).FirstOrDefault(); - Assert.IsNotNull(album); - Assert.AreEqual("Out Of Exile", album.Title); - } - - [Test] - public void KeyTest() - { - var albums = Session.Query.All(); - var key = Key.Create(Domain, albumOutOfExileKey.Value); - var album = albums.Where(a => a.Key==key).FirstOrDefault(); - Assert.IsNotNull(album); - Assert.AreEqual("Out Of Exile", album.Title); - } - - [Test] - public void InstanceTest() - { - var albumOutOfExile = Session.Query.SingleOrDefault(albumOutOfExileKey); - var albums = Session.Query.All(); - var album = albums.Where(a => a==albumOutOfExile).FirstOrDefault(); - Assert.IsNotNull(album); - Assert.AreEqual("Out Of Exile", album.Title); - } - - [Test] - public void ForeignKeyTest() - { - var album = Session.Query.SingleOrDefault(albumOutOfExileKey); - var tracks = Session.Query.All(); - var track = tracks.Where(t => t.Album.Key==album.Key).FirstOrDefault(); - Assert.IsNotNull(track); - Assert.AreEqual("Out Of Exile", track.Album.Title); - } - - [Test] - public void ForeignIDTest() - { - var album = Session.Query.SingleOrDefault(albumOutOfExileKey); - var products = Session.Query.All(); - var product = products.Where(t => t.Album.AlbumId==album.AlbumId).FirstOrDefault(); - Assert.IsNotNull(product); - Assert.AreEqual("Out Of Exile", product.Album.Title); - } - - [Test] - public void ForeignInstanceTest() - { - var album20 = Session.Query.SingleOrDefault(albumOutOfExileKey); - var tracks = Session.Query.All(); - var track = tracks.Where(t => t.Album==album20).FirstOrDefault(); - Assert.IsNotNull(track); - Assert.AreEqual("Out Of Exile", track.Album.Title); - } - - [Test] - public void ForeignPropertyTest() - { - var tracks = Session.Query.All(); - var trackFormAlbum = tracks.Where(t => t.Album.Title=="Out Of Exile").FirstOrDefault(); - Assert.IsNotNull(trackFormAlbum); - Assert.AreEqual("Out Of Exile", trackFormAlbum.Album.Title); - trackFormAlbum = - tracks.Where( - t => - t.Album.Title=="Out Of Exile" && t.MediaType.Key==mediaTypeFirstKey).FirstOrDefault(); - Assert.IsNotNull(trackFormAlbum); - Assert.AreEqual("Out Of Exile", trackFormAlbum.Album.Title); - } - - [Test] - public void CoalesceTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => (c.Address.State ?? "Australia")=="Australia").FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => (c.Address.State ?? c.Address.PostalCode ?? "Australia")=="Australia").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void ConditionalTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => (i.Customer.LastName=="Ramos" ? 1000 : 0)==1000).FirstOrDefault(); - Assert.IsNotNull(invoice); - invoice = invoices - .Where(i => (i.Customer.LastName=="Ramos" ? 1000 : i.Customer.LastName== "Philips" ? 2000 : 0)==1000).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void StringLengthTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Length==7).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringStartsWithLiteralTest() - { - var mediaTypes = Session.Query.All(); - var mpegType = mediaTypes.Where(c => c.Name.StartsWith("M")).FirstOrDefault(); - Assert.IsNotNull(mpegType); - } - - [Test] - public void StringStartsWithColumnTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName.StartsWith(c.LastName)).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringEndsWithLiteralTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName.EndsWith("s")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringEndsWithColumnTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName.EndsWith(c.LastName)).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringContainsLiteralTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName.Contains("and")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringContainsColumnTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName.Contains(c.LastName)).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringConcatImplicitArgsTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.LastName + "X"=="X").FirstOrDefault(); - Assert.IsNull(customer); - } - - [Test] - public void StringConcatExplicitNArgTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Concat(c.LastName, "X")=="X").FirstOrDefault(); - Assert.IsNull(customer); - customer = customers.Where(c => string.Concat(c.LastName, "X", c.Address.Country)=="X").FirstOrDefault(); - Assert.IsNull(customer); - } - - [Test] - public void StringIsNullOrEmptyTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.IsNullOrEmpty(c.Address.State)).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringToUpperTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.ToUpper()=="ORLANDO").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringToLowerTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.ToLower()=="orlando").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringReplaceTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Replace("land", "earth")=="Oreartho").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringReplaceCharsTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Replace('d', 'g')=="Orlango").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringSubstringTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Substring(0, 4)=="Orla").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringSubstringNoLengthTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Substring(4)=="ndo").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringRemoveTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Remove(1, 2)=="Oando").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringRemoveNoCountTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Remove(2)=="Or").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringIndexOfTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support IndexOf()"); - - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.IndexOf("land")==2).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringIndexOfCharTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support IndexOf()"); - - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.IndexOf('l')==2).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringTrimTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.Trim()=="Orlando").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringToStringTest() - { - // just to prove this is a no op - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.ToString()=="Orlando").FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void DateTimeConstructYMDTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate >= new DateTime(i.InvoiceDate.Year, 1, 1)).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeConstructYMDHMSTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate >= new DateTime(i.InvoiceDate.Year, 1, 1, 10, 25, 55)).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => ((DateTime?) i.InvoiceDate) < ((DateTime?) new DateTime(2010, 12, 31))).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeDayTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Day==5).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeMonthTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Month==12).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeYearTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Year==2010).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeHourTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Hour==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeMinuteTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Minute==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeSecond() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Second==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeMillisecondTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.Millisecond==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeDayOfWeekTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.DayOfWeek==DayOfWeek.Friday).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DateTimeDayOfYearTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceDate.DayOfYear==360).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathAbsTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Abs(i.InvoiceId)==10 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathAcosTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Acos()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Acos(Math.Sin(i.InvoiceId))==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathAsinTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Asin()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Asin(Math.Cos(i.InvoiceId))==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathAtanTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Atan()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Atan(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - invoice = invoices.Where(i => Math.Atan2(i.InvoiceId, 3)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathCosTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Cos(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathSinTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Sin()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Sin(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathTanTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Tan()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Tan(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathExpTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Exp(i.InvoiceId < 1000 ? 1 : 2)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathLogTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Log(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathLog10Test() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Log10(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathSqrtTest() - { -Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Sqrt()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Sqrt(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathCeilingTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Ceiling((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathFloorTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Floor((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathPowTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow()"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Pow(i.InvoiceId < 1000 ? 1 : 2, 3)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathRoundDefaultTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Round((decimal) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathRoundToPlaceTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow() which is used in Round() translation"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Round((decimal) i.InvoiceId, 2)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void MathTruncateTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => Math.Truncate((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void StringLessThanTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.LessThan("Orlando")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringLessThanOrEqualsTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.LessThanOrEqual("Orlando")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringGreaterThanTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.GreaterThan("Orlando")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringGreaterThanOrEqualsTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.GreaterThanOrEqual("Orlando")).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareToLTTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") < 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareToLETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") <= 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareToGTTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") > 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareToGETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") >= 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareToEQTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando")==0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - - [Test] - public void StringCompareToNETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City.CompareTo("Orlando")!=0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareLTTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") < 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareLETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") <= 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareGTTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") > 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareGETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") >= 0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareEQTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando")==0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void StringCompareNETest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando")!=0).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void IntCompareToTest() - { - // prove that x.CompareTo(y) works for types other than string - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId.CompareTo(1000)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalCompareTest() - { - // prove that type.Compare(x,y) works with decimal - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Compare((decimal) i.InvoiceId, 0.0m)==0 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalAddTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Add(i.InvoiceId, 0.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalSubtractTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Subtract(i.InvoiceId, 0.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalMultiplyTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Multiply(i.InvoiceId, 1.0m)==1.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalDivideTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Divide(i.InvoiceId, 1.0m)==1.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalRemainderTest() - { - Require.ProviderIsNot(StorageProvider.SqlServerCe); - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Remainder(i.InvoiceId, 1.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalNegateTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Negate(i.InvoiceId)==1.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalCeilingTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Ceiling(i.InvoiceId)==0.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalFloorTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Floor(i.InvoiceId)==0.0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalRoundDefaultTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Round(i.InvoiceId)==0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalRoundPlacesTest() - { - Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow() which is used in Round() translation"); - - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Round(i.InvoiceId, 2)==0.00m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalTruncateTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => decimal.Truncate(i.InvoiceId)==0m || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void DecimalGTTest() - { - // prove that decimals are treated normally with respect to normal comparison operators - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => ((decimal) i.InvoiceId) > 0.0m).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void FkCompareTest() - { - var employee = Session.Query.All().Where(e => e.ReportsToManager.EmployeeId > 20).FirstOrDefault(); - Assert.IsNotNull(employee); - } - - [Test] - public void IntLessThanTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId < 0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntLessThanOrEqualTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId <= 0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntGreaterThanTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntGreaterThanOrEqualTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId >= 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntEqualTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId==0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntNotEqualTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId!=0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntAddTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId + 0==0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntSubtractTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId - 0==0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntMultiplyTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId * 1==1 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntDivideTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId / 1==1 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntModuloTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId % 1==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntBitwiseAndTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => (i.InvoiceId & 1)==0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void IntBitwiseOrTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => (i.InvoiceId | 1)==1 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - - [Test] - public void IntBitwiseExclusiveOrTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => (i.InvoiceId ^ 1)==1).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntBitwiseNotTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => ~i.InvoiceId==0).FirstOrDefault(); - Assert.IsNull(invoice); - } - - [Test] - public void IntNegateTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => -i.InvoiceId==-1 || i.InvoiceId > 0).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void AndTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId > 0 && i.InvoiceId < 4500).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void OrTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => i.InvoiceId < 5 || i.InvoiceId > 10).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void NotTest() - { - var invoices = Session.Query.All(); - var invoice = invoices.Where(i => !(i.InvoiceId==0)).FirstOrDefault(); - Assert.IsNotNull(invoice); - } - - [Test] - public void EqualsNullTest() - { - // TODO: Check IsNull or Equals(null) - var customers = Session.Query.All(); - var customer = customers.Where(c => c.Address.City!=null).FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => !c.Address.State.Equals(null)).FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => c!=null).FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => !c.Equals(null)).FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => c.Address!=null).FirstOrDefault(); - Assert.IsNotNull(customer); - customer = customers.Where(c => !c.Address.Equals(null)).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void EqualNullReverseTest() - { - var customers = Session.Query.All(); - var customer = customers.Where(c => null!=c.Address.City).FirstOrDefault(); - Assert.IsNotNull(customer); - } - - [Test] - public void TimeSpanTest() - { - var maxProcessingTime = new TimeSpan(5, 0, 0, 0); - Session.Query.All().Where(i => i.ProcessingTime > maxProcessingTime).ToList(); - } - - [Test] - public void NonPersistentFieldTest() - { - var result = from e in Session.Query.All() where e.FullName!=null select e; - Assert.Throws(() => result.ToList()); - } - - [Test] - public void JoinTest() - { - var actual = from customer in Session.Query.All() - join invoice in Session.Query.All() on customer equals invoice.Customer - where invoice.Commission > 30 - orderby new {customer, invoice} - select new {customer, invoice}; - var list = actual.ToList(); - var expected = from customer in Session.Query.All().ToList() - join invoice in Session.Query.All().ToList() on customer equals invoice.Customer - where invoice.Commission > 30 - orderby customer.CustomerId , invoice.InvoiceId - select new {customer, invoice}; - Assert.IsTrue(expected.SequenceEqual(list)); - } - - [Test] - public void ApplyTest() - { - var actual = Session.Query.All() - .Where(customer => customer.Invoices.Any(i => i.Commission > 0.30m)); - var expected = Session.Query.All() - .AsEnumerable() // AG: Just to remeber about it. - .Where(customer => customer.Invoices.Any(i => i.Commission > 0.30m)); - Assert.IsTrue(expected.SequenceEqual(actual)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.12.13 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Linq +{ + public class TargetField + { + public TargetField(string name, object value) + { + if (string.IsNullOrEmpty(name)) + throw new ArgumentException("Parameter 'name' cannot be null or empty."); + + this.Name = name; + this.Value = value; + } + + public string Name { get; private set; } + + public object Value { get; private set; } + } + + [Category("Linq")] + [TestFixture] + public class WhereTest : ChinookDOModelTest + { + private Key albumOutOfExileKey; + private Key mediaTypeFirstKey; + + [OneTimeSetUp] + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + albumOutOfExileKey = session.Query.All().Single(a => a.Title=="Out Of Exile").Key; + mediaTypeFirstKey = session.Query.All().First().Key; + } + } + } + + [Test] + public void IndexerTest() + { + var query = Session.Query.All(); + var kvp = new Pair("Customer", Session.Query.All().First()); + query = query.Where(invoice => invoice[kvp.First]==kvp.Second); + var r = query.ToList(); + } + + [Test] + public void IndexerNullTest() + { + var query = Session.Query.All(); + var parameters = Session.Query.All().Take(1).Select(c => new TargetField("Customer", (Customer) null)).ToList(); + foreach (var item in parameters) { + var field = item; // This is important to use local variable + query = query.Where(invoice => invoice[field.Name]==field.Value); + } + var result = query.ToList(); + } + + [Test] + public void ReferenceFieldConditionTest() + { + var result = Session.Query.All() + .Where(invoice => invoice.Customer!=null) + .ToList(); + +// var expected = Session.Query.All() +// .AsEnumerable() +// .First(invoice => invoice.Customer!=null); +// Assert.AreEqual(expected.Customer, result.Customer); + } + + [Test] + public void IndexerSimpleFieldTest() + { + object freight = Session.Query + .All() + .First(invoice => invoice.Commission > 0.2m) + .Commission; + var result = Session.Query + .All() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice["Commission"]==freight) + .ToList(); + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Commission==(decimal?) freight) + .ToList(); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void IndexerStructureTest() + { + object address = Session.Query + .All() + .First(customer => customer.Address.City.Length > 0) + .Address; + var result = Session.Query + .All() + .OrderBy(customer => customer.CustomerId) + .Where(customer => customer["Address"]==address) + .ToList(); +#pragma warning disable 252,253 + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(customer => customer.CustomerId) + .Where(customer => customer.Address==address) + .ToList(); +#pragma warning restore 252,253 + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void IndexerEntity1Test() + { + object customer = Session.Query + .All() + .First(invoice => invoice.Customer!=null) + .Customer; + var result = Session.Query + .All() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice["Customer"]==customer) + .ToList(); + var expected = Session.Query + .All() + .AsEnumerable() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Customer==customer) + .ToList(); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void EntitySubqueryTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Customer== + Session.Query.All() + .OrderBy(invoice2 => invoice2.Customer.CustomerId) + .First(invoice2 => invoice2.Customer!=null) + .Customer) + .ToList(); + var expected = Session.Query.All() + .AsEnumerable() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Customer== + Session.Query.All() + .OrderBy(invoice2 => invoice2.Customer.CustomerId) + .First(invoice2 => invoice2.Customer!=null) + .Customer) + .ToList(); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void EntitySubqueryIndexerTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var result = Session.Query.All() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Customer== + Session.Query.All() + .OrderBy(invoice2 => invoice2.Customer.CustomerId) + .First(invoice2 => invoice2["Customer"]!=null) + .Customer) + .ToList(); + var expected = Session.Query.All() + .AsEnumerable() + .OrderBy(invoice => invoice.InvoiceId) + .Where(invoice => invoice.Customer== + Session.Query.All() + .OrderBy(invoice2 => invoice2.Customer.CustomerId) + .First(invoice2 => invoice2.Customer!=null) + .Customer) + .ToList(); + Assert.IsTrue(expected.SequenceEqual(result)); + } + + [Test] + public void ParameterTest() + { + var album = Session.Query.All().First(); + var result = Session.Query.All().Where(p => p.Album==album); + QueryDumper.Dump(result); + } + + [Test] + public void MultipleConditionTest() + { + var customerCompanies = Session.Query.All().Select(c => c.CompanyName).Where(cn => cn.StartsWith("A") || cn.StartsWith("B")).ToList(); + Assert.That(customerCompanies.Count, Is.EqualTo(2)); + Assert.That(customerCompanies.All(c => c.StartsWith("A") || c.StartsWith("B"))); + } + + [Test] + public void AnonymousTest() + { + Customer first = Session.Query.All().First(); + var p = new {Company = first.CompanyName, first.LastName}; + var result = Session.Query.All().Select(c => new {Company = c.CompanyName, c.LastName}).Take(10).Where(x => x==p).ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Company, Is.EqualTo(p.Company)); + Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); + } + + + [Test] + public void AnonymousTest2() + { + Customer first = Session.Query.All().First(); + var p = new {Company = first.CompanyName, first.LastName}; + var result = Session.Query.All().Select(c => new {Company = c.CompanyName, c.LastName}).Take(10).Where(x => p==x).ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Company, Is.EqualTo(p.Company)); + Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); + } + + [Test] + public void AnonymousWithParameterTest() + { + Customer first = Session.Query.All().First(); + var p = new {Company = first.CompanyName, first.LastName}; + var result = Session.Query.All().Where(c => new {Company = c.CompanyName, c.LastName}==p).ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); + Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); + } + + [Test] + public void AnonymousWithParameter2Test() + { + Customer first = Session.Query.All().First(); + var p = new {Company = first.CompanyName, first.LastName}; + var k = new {InternalFiled = p}; + var result = Session.Query.All().Where(c => new {Company = c.CompanyName, c.LastName}==k.InternalFiled).ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); + Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); + } + + + [Test] + public void AnonymousWithParameter3Test() + { + Customer first = Session.Query.All().First(); + var p = new {Company = first.CompanyName, first.LastName}; + var k = new {InternalFiled = p}; + var result = Session.Query.All().Where(c => new {X = new {Company = c.CompanyName, c.LastName}}.X==k.InternalFiled).ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].CompanyName, Is.EqualTo(p.Company)); + Assert.That(result[0].LastName, Is.EqualTo(p.LastName)); + } + + [Test] + public void Anonymous2Test2() + { + var result = Session.Query.All().Where(c => new {Company = c.CompanyName}.Company== "JetBrains s.r.o.").ToList(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].CompanyName, Is.EqualTo("JetBrains s.r.o.")); + } + + [Test] + public void Anonymous3Test() + { + var expectedResultCount = Session.Query.All().Count(); + var result = Session.Query.All().Where(c => new {c.FirstName, c.LastName}==new {c.FirstName, c.LastName}).ToList(); + Assert.That(result.Count, Is.EqualTo(expectedResultCount)); + } + + [Test] + public void Anonymous4Test() + { + Require.AllFeaturesSupported(ProviderFeatures.RowNumber); + Customer first = Session.Query.All().First(); + Customer second = Session.Query.All().Skip(1).First(); + var p = new {first.Address.PostalCode, first.Address.City}; + var l = new {second.Address.PostalCode, second.Address.City}; + var result = Session.Query.All().Where(c => l==p).ToList(); + Assert.That(result, Is.Empty); + } + + + [Test] + public void ColumnTest() + { + var albums = Session.Query.All(); + var album = albums.Where(a => a.Title=="Plays Metallica By Four Cellos").FirstOrDefault(); + Assert.IsNotNull(album); + Assert.AreEqual("Plays Metallica By Four Cellos", album.Title); + } + + [Test] + public void CalculatedTest() + { + var expected = Session.Query.All().ToList().Where(i => i.Total * i.Commission >= 10).ToList(); + var actual = Session.Query.All().ToList().Where(i => i.Total * i.Commission >= 10).ToList(); + Assert.That(expected.Count, Is.GreaterThan(0)); + Assert.AreEqual(expected.Count, actual.Count); + } + + [Test] + public void StructureTest() + { + var employees = Session.Query.All(); + var employee = employees.Where(e => e.Address.State=="AB").FirstOrDefault(); + Assert.IsNotNull(employee); + Assert.AreEqual("AB", employee.Address.State); + } + + [Test] + public void IdTest() + { + var albums = Session.Query.All(); + var album = albums.Where(a => a.AlbumId==albumOutOfExileKey.Value.GetValue(0)).FirstOrDefault(); + Assert.IsNotNull(album); + Assert.AreEqual("Out Of Exile", album.Title); + } + + [Test] + public void KeyTest() + { + var albums = Session.Query.All(); + var key = Key.Create(Domain, albumOutOfExileKey.Value); + var album = albums.Where(a => a.Key==key).FirstOrDefault(); + Assert.IsNotNull(album); + Assert.AreEqual("Out Of Exile", album.Title); + } + + [Test] + public void InstanceTest() + { + var albumOutOfExile = Session.Query.SingleOrDefault(albumOutOfExileKey); + var albums = Session.Query.All(); + var album = albums.Where(a => a==albumOutOfExile).FirstOrDefault(); + Assert.IsNotNull(album); + Assert.AreEqual("Out Of Exile", album.Title); + } + + [Test] + public void ForeignKeyTest() + { + var album = Session.Query.SingleOrDefault(albumOutOfExileKey); + var tracks = Session.Query.All(); + var track = tracks.Where(t => t.Album.Key==album.Key).FirstOrDefault(); + Assert.IsNotNull(track); + Assert.AreEqual("Out Of Exile", track.Album.Title); + } + + [Test] + public void ForeignIDTest() + { + var album = Session.Query.SingleOrDefault(albumOutOfExileKey); + var products = Session.Query.All(); + var product = products.Where(t => t.Album.AlbumId==album.AlbumId).FirstOrDefault(); + Assert.IsNotNull(product); + Assert.AreEqual("Out Of Exile", product.Album.Title); + } + + [Test] + public void ForeignInstanceTest() + { + var album20 = Session.Query.SingleOrDefault(albumOutOfExileKey); + var tracks = Session.Query.All(); + var track = tracks.Where(t => t.Album==album20).FirstOrDefault(); + Assert.IsNotNull(track); + Assert.AreEqual("Out Of Exile", track.Album.Title); + } + + [Test] + public void ForeignPropertyTest() + { + var tracks = Session.Query.All(); + var trackFormAlbum = tracks.Where(t => t.Album.Title=="Out Of Exile").FirstOrDefault(); + Assert.IsNotNull(trackFormAlbum); + Assert.AreEqual("Out Of Exile", trackFormAlbum.Album.Title); + trackFormAlbum = + tracks.Where( + t => + t.Album.Title=="Out Of Exile" && t.MediaType.Key==mediaTypeFirstKey).FirstOrDefault(); + Assert.IsNotNull(trackFormAlbum); + Assert.AreEqual("Out Of Exile", trackFormAlbum.Album.Title); + } + + [Test] + public void CoalesceTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => (c.Address.State ?? "Australia")=="Australia").FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => (c.Address.State ?? c.Address.PostalCode ?? "Australia")=="Australia").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void ConditionalTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => (i.Customer.LastName=="Ramos" ? 1000 : 0)==1000).FirstOrDefault(); + Assert.IsNotNull(invoice); + invoice = invoices + .Where(i => (i.Customer.LastName=="Ramos" ? 1000 : i.Customer.LastName== "Philips" ? 2000 : 0)==1000).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void StringLengthTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Length==7).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringStartsWithLiteralTest() + { + var mediaTypes = Session.Query.All(); + var mpegType = mediaTypes.Where(c => c.Name.StartsWith("M")).FirstOrDefault(); + Assert.IsNotNull(mpegType); + } + + [Test] + public void StringStartsWithColumnTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName.StartsWith(c.LastName)).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringEndsWithLiteralTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName.EndsWith("s")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringEndsWithColumnTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName.EndsWith(c.LastName)).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringContainsLiteralTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName.Contains("and")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringContainsColumnTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName.Contains(c.LastName)).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringConcatImplicitArgsTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.LastName + "X"=="X").FirstOrDefault(); + Assert.IsNull(customer); + } + + [Test] + public void StringConcatExplicitNArgTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Concat(c.LastName, "X")=="X").FirstOrDefault(); + Assert.IsNull(customer); + customer = customers.Where(c => string.Concat(c.LastName, "X", c.Address.Country)=="X").FirstOrDefault(); + Assert.IsNull(customer); + } + + [Test] + public void StringIsNullOrEmptyTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.IsNullOrEmpty(c.Address.State)).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringToUpperTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.ToUpper()=="ORLANDO").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringToLowerTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.ToLower()=="orlando").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringReplaceTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Replace("land", "earth")=="Oreartho").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringReplaceCharsTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Replace('d', 'g')=="Orlango").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringSubstringTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Substring(0, 4)=="Orla").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringSubstringNoLengthTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Substring(4)=="ndo").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringRemoveTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Remove(1, 2)=="Oando").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringRemoveNoCountTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Remove(2)=="Or").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringIndexOfTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support IndexOf()"); + + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.IndexOf("land")==2).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringIndexOfCharTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support IndexOf()"); + + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.IndexOf('l')==2).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringTrimTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.Trim()=="Orlando").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringToStringTest() + { + // just to prove this is a no op + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.ToString()=="Orlando").FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void DateTimeConstructYMDTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate >= new DateTime(i.InvoiceDate.Year, 1, 1)).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeConstructYMDHMSTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate >= new DateTime(i.InvoiceDate.Year, 1, 1, 10, 25, 55)).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => ((DateTime?) i.InvoiceDate) < ((DateTime?) new DateTime(2010, 12, 31))).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeDayTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Day==5).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeMonthTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Month==12).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeYearTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Year==2010).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeHourTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Hour==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeMinuteTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Minute==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeSecond() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Second==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeMillisecondTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.Millisecond==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeDayOfWeekTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.DayOfWeek==DayOfWeek.Friday).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DateTimeDayOfYearTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceDate.DayOfYear==360).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathAbsTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Abs(i.InvoiceId)==10 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathAcosTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Acos()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Acos(Math.Sin(i.InvoiceId))==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathAsinTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Asin()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Asin(Math.Cos(i.InvoiceId))==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathAtanTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Atan()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Atan(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + invoice = invoices.Where(i => Math.Atan2(i.InvoiceId, 3)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathCosTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Cos(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathSinTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Sin()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Sin(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathTanTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Tan()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Tan(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathExpTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Exp(i.InvoiceId < 1000 ? 1 : 2)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathLogTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Log(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathLog10Test() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Log10(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathSqrtTest() + { +Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Sqrt()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Sqrt(i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathCeilingTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Ceiling((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathFloorTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Floor((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathPowTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow()"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Pow(i.InvoiceId < 1000 ? 1 : 2, 3)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathRoundDefaultTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Round((decimal) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathRoundToPlaceTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow() which is used in Round() translation"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Round((decimal) i.InvoiceId, 2)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void MathTruncateTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => Math.Truncate((double) i.InvoiceId)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void StringLessThanTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.LessThan("Orlando")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringLessThanOrEqualsTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.LessThanOrEqual("Orlando")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringGreaterThanTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.GreaterThan("Orlando")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringGreaterThanOrEqualsTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.GreaterThanOrEqual("Orlando")).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareToLTTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") < 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareToLETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") <= 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareToGTTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") > 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareToGETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando") >= 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareToEQTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando")==0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + + [Test] + public void StringCompareToNETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City.CompareTo("Orlando")!=0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareLTTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") < 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareLETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") <= 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareGTTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") > 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareGETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando") >= 0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareEQTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando")==0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void StringCompareNETest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => string.Compare(c.Address.City, "Orlando")!=0).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void IntCompareToTest() + { + // prove that x.CompareTo(y) works for types other than string + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId.CompareTo(1000)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalCompareTest() + { + // prove that type.Compare(x,y) works with decimal + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Compare((decimal) i.InvoiceId, 0.0m)==0 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalAddTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Add(i.InvoiceId, 0.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalSubtractTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Subtract(i.InvoiceId, 0.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalMultiplyTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Multiply(i.InvoiceId, 1.0m)==1.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalDivideTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Divide(i.InvoiceId, 1.0m)==1.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalRemainderTest() + { + Require.ProviderIsNot(StorageProvider.SqlServerCe); + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Remainder(i.InvoiceId, 1.0m)==0.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalNegateTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Negate(i.InvoiceId)==1.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalCeilingTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Ceiling(i.InvoiceId)==0.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalFloorTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Floor(i.InvoiceId)==0.0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalRoundDefaultTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Round(i.InvoiceId)==0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalRoundPlacesTest() + { + Require.ProviderIsNot(StorageProvider.Sqlite, "sqlite does not support Pow() which is used in Round() translation"); + + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Round(i.InvoiceId, 2)==0.00m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalTruncateTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => decimal.Truncate(i.InvoiceId)==0m || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void DecimalGTTest() + { + // prove that decimals are treated normally with respect to normal comparison operators + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => ((decimal) i.InvoiceId) > 0.0m).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void FkCompareTest() + { + var employee = Session.Query.All().Where(e => e.ReportsToManager.EmployeeId > 20).FirstOrDefault(); + Assert.IsNotNull(employee); + } + + [Test] + public void IntLessThanTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId < 0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntLessThanOrEqualTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId <= 0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntGreaterThanTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntGreaterThanOrEqualTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId >= 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntEqualTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId==0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntNotEqualTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId!=0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntAddTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId + 0==0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntSubtractTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId - 0==0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntMultiplyTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId * 1==1 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntDivideTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId / 1==1 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntModuloTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId % 1==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntBitwiseAndTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => (i.InvoiceId & 1)==0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void IntBitwiseOrTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => (i.InvoiceId | 1)==1 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + + [Test] + public void IntBitwiseExclusiveOrTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => (i.InvoiceId ^ 1)==1).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntBitwiseNotTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => ~i.InvoiceId==0).FirstOrDefault(); + Assert.IsNull(invoice); + } + + [Test] + public void IntNegateTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => -i.InvoiceId==-1 || i.InvoiceId > 0).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void AndTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId > 0 && i.InvoiceId < 4500).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void OrTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => i.InvoiceId < 5 || i.InvoiceId > 10).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void NotTest() + { + var invoices = Session.Query.All(); + var invoice = invoices.Where(i => !(i.InvoiceId==0)).FirstOrDefault(); + Assert.IsNotNull(invoice); + } + + [Test] + public void EqualsNullTest() + { + // TODO: Check IsNull or Equals(null) + var customers = Session.Query.All(); + var customer = customers.Where(c => c.Address.City!=null).FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => !c.Address.State.Equals(null)).FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => c!=null).FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => !c.Equals(null)).FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => c.Address!=null).FirstOrDefault(); + Assert.IsNotNull(customer); + customer = customers.Where(c => !c.Address.Equals(null)).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void EqualNullReverseTest() + { + var customers = Session.Query.All(); + var customer = customers.Where(c => null!=c.Address.City).FirstOrDefault(); + Assert.IsNotNull(customer); + } + + [Test] + public void TimeSpanTest() + { + var maxProcessingTime = new TimeSpan(5, 0, 0, 0); + Session.Query.All().Where(i => i.ProcessingTime > maxProcessingTime).ToList(); + } + + [Test] + public void NonPersistentFieldTest() + { + var result = from e in Session.Query.All() where e.FullName!=null select e; + Assert.Throws(() => result.ToList()); + } + + [Test] + public void JoinTest() + { + var actual = from customer in Session.Query.All() + join invoice in Session.Query.All() on customer equals invoice.Customer + where invoice.Commission > 30 + orderby new {customer, invoice} + select new {customer, invoice}; + var list = actual.ToList(); + var expected = from customer in Session.Query.All().ToList() + join invoice in Session.Query.All().ToList() on customer equals invoice.Customer + where invoice.Commission > 30 + orderby customer.CustomerId , invoice.InvoiceId + select new {customer, invoice}; + Assert.IsTrue(expected.SequenceEqual(list)); + } + + [Test] + public void ApplyTest() + { + var actual = Session.Query.All() + .Where(customer => customer.Invoices.Any(i => i.Commission > 0.30m)); + var expected = Session.Query.All() + .AsEnumerable() // AG: Just to remeber about it. + .Where(customer => customer.Invoices.Any(i => i.Commission > 0.30m)); + Assert.IsTrue(expected.SequenceEqual(actual)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/AssociationTest.cs b/Orm/Xtensive.Orm.Tests/Model/AssociationTest.cs index 2c3367ae10..bc497ad6c8 100644 --- a/Orm/Xtensive.Orm.Tests/Model/AssociationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/AssociationTest.cs @@ -1,806 +1,806 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.06.16 - -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Tests; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.Association; -using System.Linq; -using System.Collections.Generic; -using System; - -namespace Xtensive.Orm.Tests.Model.Association -{ - [Serializable] - [HierarchyRoot] - public abstract class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public abstract class Root2 : Entity - { - [Field, Key] - public Guid Id { get; private set; } - } - - [Serializable] - public class A : Root - { - [Field] - public B ZeroToOne { get; set; } - - [Field] - public C OneToOneMaster { get; set; } - - [Field] - public D ManyToOneMaster { get; set; } - - [Field] - public EntitySet ZeroToMany { get; private set; } - - [Field] - public EntitySet OneToManyMaster { get; private set; } - - [Field] - public EntitySet ManyToManyMaster { get; private set; } - - [Field] - public IntermediateStructure1 IndirectA { get; set; } - } - - [Serializable] - public class B : Root2 - { - } - - [Serializable] - public class C : Root2 - { - [Field, Association(PairTo = "OneToOneMaster")] - public A OneToOnePaired { get; set; } - - [Field] - public IntermediateStructure1 IndirectA { get; set; } - } - - [Serializable] - public class D : Root2 - { - [Field, Association(PairTo = "ManyToOneMaster")] - public EntitySet OneToManyPaired { get; private set; } - } - - [Serializable] - public class E : Root2 - { - } - - [Serializable] - public class F : Root2 - { - [Field, Association(PairTo = "OneToManyMaster")] - public A ManyToOnePaired { get; set; } - } - - [Serializable] - public class G : Root2 - { - [Field, Association(PairTo = "ManyToManyMaster")] - public EntitySet ManytoManyPaired { get; private set; } - } - - [Serializable] - public class H : Root2 - { - [Field] - public H Parent { get; set; } - - [Field, Association(PairTo = "Parent")] - public EntitySet Children { get; private set; } - } - - public class I : A - { - - } - - [Serializable] - public class IntermediateStructure1 : Structure - { - [Field] - public IntermediateStructure2 IntermediateStructure2 { get; set; } - } - - [Serializable] - public class IntermediateStructure2 : Structure - { - [Field] - public A A { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class AssociationTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(A).Namespace); - return config; - } - - [Test] - public void ToRecordsetTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - var a1 = new A(); - var a2 = new A(); - var rs = a1.TypeInfo.Indexes.PrimaryIndex.GetQuery(); - - foreach (Tuple tuple in rs.GetRecordSet(Session.Current)) { - var rs2 = a1.TypeInfo.Indexes.PrimaryIndex.GetQuery(); - foreach (Tuple tuple2 in rs2.GetRecordSet(Session.Current)) { - TestLog.Debug(tuple2.ToString()); - } - } - // Rollback - } - } - } - - [Test] - public void EntitySetCreation() - { - // Domain.Model.Dump(); - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - var a = new A(); - Assert.IsNotNull(a.ManyToManyMaster); - Assert.IsNotNull(a.OneToManyMaster); - Assert.IsNotNull(a.ZeroToMany); - // Rollback - } - } - } - - [Test] - public void SimpleEntitySetEnumerator() - { - using (var session = Domain.OpenSession()) { - A a; - F f1; - F f2; - F f3; - F f4; - using (var transaction = session.OpenTransaction()) { - a = new A(); - f1 = new F(); - f2 = new F(); - f3 = new F(); - f4 = new F(); - transaction.Complete(); - } - IEnumerator enumerator; - using (var transaction = session.OpenTransaction()) { - Assert.AreEqual(0, a.OneToManyMaster.Count()); // Linq count through enumerate - f1.ManyToOnePaired = a; - f2.ManyToOnePaired = a; - f3.ManyToOnePaired = a; - f4.ManyToOnePaired = a; - - Assert.AreEqual(4, a.OneToManyMaster.Count()); // Enumerate through internal cacee - foreach (F f in a.OneToManyMaster) { - a.OneToManyMaster.Contains(f); // Enumerate through internal cahce - } - enumerator = a.OneToManyMaster.GetEnumerator(); - Assert.IsTrue(enumerator.MoveNext()); - Assert.IsTrue(enumerator.MoveNext()); - transaction.Complete(); - } - // Cache is invalidated here - using (session.OpenTransaction()) { - Assert.AreEqual(4, a.OneToManyMaster.Count()); // Enumerate through recordset request - foreach (F f in a.OneToManyMaster) { - // a.OneToManyMaster.Contains(f.Key); // Enumerate through recordset request - a.OneToManyMaster.Contains(f); // Enumerate through recordset request - } - // Rollback - } - } - } - - [Test] - public void OneToOneAssign() - { - // Domain.Model.Dump(); - using (var session = Domain.OpenSession()) { - C c; - A a; - - using (var t = session.OpenTransaction()) { - c = new C(); - a = new A(); - t.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(a.OneToOneMaster); - Assert.IsNull(c.OneToOnePaired); - c.OneToOnePaired = a; - Assert.IsNotNull(a.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a); - c.OneToOnePaired = a; - Assert.IsNotNull(a.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a); - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(a.OneToOneMaster); - Assert.IsNull(c.OneToOnePaired); - a.OneToOneMaster = c; - Assert.IsNotNull(a.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a); - } - } - } - - [Test] - public void OneToOneChangeOwner() - { - // Domain.Model.Dump(); - using (var session = Domain.OpenSession()) { - C c; - A a1; - A a2; - - using (var t = session.OpenTransaction()) { - c = new C(); - a1 = new A(); - a2 = new A(); - t.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(a1.OneToOneMaster); - Assert.IsNull(a2.OneToOneMaster); - Assert.IsNull(c.OneToOnePaired); - c.OneToOnePaired = a1; - Assert.IsNotNull(a1.OneToOneMaster); - Assert.IsNull(a2.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a1.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a1); - // Change owner - c.OneToOnePaired = a2; - Assert.IsNull(a1.OneToOneMaster); - Assert.IsNotNull(a2.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a2.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a2); - // Change back trough another class - a1.OneToOneMaster = c; - Assert.IsNotNull(a1.OneToOneMaster); - Assert.IsNull(a2.OneToOneMaster); - Assert.IsNotNull(c.OneToOnePaired); - Assert.AreEqual(a1.OneToOneMaster, c); - Assert.AreEqual(c.OneToOnePaired, a1); - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(a1.OneToOneMaster); - Assert.IsNull(a2.OneToOneMaster); - Assert.IsNull(c.OneToOnePaired); - // Rollback - } - } - } - - [Test] - public void ManyToOneAssign() - { - using (var session = Domain.OpenSession()) { - A a; - F f; - - using (var transaction = session.OpenTransaction()) { - a = new A(); - f = new F(); - transaction.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f)); - f.ManyToOnePaired = a; - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - f.ManyToOnePaired = a; - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f)); - // Rollback - } - - // Assign back and commit - using (var transaction = session.OpenTransaction()) { - f.ManyToOnePaired = a; - Assert.IsNotNull(f.ManyToOnePaired); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - Assert.AreEqual(1, a.OneToManyMaster.Count); - transaction.Complete(); - } - - // Check commited state - using (session.OpenTransaction()) { - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - // Rollback - } - } - } - - [Test] - public void ManyToOneAddToSet() - { - using (var session = Domain.OpenSession()) { - A a; - F f; - - using (var transaction = session.OpenTransaction()) { - a = new A(); - f = new F(); - transaction.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f)); - a.OneToManyMaster.Add(f); - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(f.ManyToOnePaired, a); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - a.OneToManyMaster.Add(f); - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(f.ManyToOnePaired, a); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f)); - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f)); - // Rollback - } - } - } - - [Test] - public void ManyToOneChangeOwnerByAssign() - { - using (var session = Domain.OpenSession()) { - A a; - F f1; - F f2; - - using (var transaction = session.OpenTransaction()) { - a = new A(); - f1 = new F(); - f2 = new F(); - transaction.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(f1.ManyToOnePaired); - Assert.IsNull(f2.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f1)); - Assert.IsFalse(a.OneToManyMaster.Contains(f2.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f2)); - f1.ManyToOnePaired = a; - Assert.IsNotNull(f1.ManyToOnePaired); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f1.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f1)); - Assert.IsFalse(a.OneToManyMaster.Contains(f2.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f2)); - f2.ManyToOnePaired = a; - Assert.IsNotNull(f1.ManyToOnePaired); - Assert.IsNotNull(f2.ManyToOnePaired); - Assert.AreEqual(2, a.OneToManyMaster.Count); - Assert.IsTrue(a.OneToManyMaster.Contains(f1)); - Assert.IsTrue(a.OneToManyMaster.Contains(f1.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f2.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f2)); - f1.ManyToOnePaired = null; - Assert.IsNull(f1.ManyToOnePaired); - Assert.IsNotNull(f2.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(1, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f1)); - Assert.IsTrue(a.OneToManyMaster.Contains(f2.Key)); - Assert.IsTrue(a.OneToManyMaster.Contains(f2)); - f1.ManyToOnePaired = a; - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(f1.ManyToOnePaired); - Assert.IsNull(f2.ManyToOnePaired); - Assert.IsNotNull(a.OneToManyMaster); - Assert.AreEqual(0, a.OneToManyMaster.Count); - Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); - Assert.IsFalse(a.OneToManyMaster.Contains(f1)); - // Rollback - } - } - } - - [Test] - public void ManyToOneChangeOwnerByEntitySet() - { - using (var session = Domain.OpenSession()) { - A a1; - A a2; - F f; - - using (var transaction = session.OpenTransaction()) { - a1 = new A(); - a2 = new A(); - f = new F(); - transaction.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a1.OneToManyMaster); - Assert.IsNotNull(a2.OneToManyMaster); - Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a1.OneToManyMaster.Contains(f)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f)); - Assert.AreEqual(0, a1.OneToManyMaster.Count); - Assert.AreEqual(0, a2.OneToManyMaster.Count); - a1.OneToManyMaster.Add(f); - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(f.ManyToOnePaired, a1); - Assert.AreEqual(1, a1.OneToManyMaster.Count); - Assert.AreEqual(0, a2.OneToManyMaster.Count); - Assert.IsTrue(a1.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a1.OneToManyMaster.Contains(f)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f)); - a1.OneToManyMaster.Remove(f); - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a1.OneToManyMaster); - Assert.IsNotNull(a2.OneToManyMaster); - Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a1.OneToManyMaster.Contains(f)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f)); - Assert.AreEqual(0, a1.OneToManyMaster.Count); - Assert.AreEqual(0, a2.OneToManyMaster.Count); - a1.OneToManyMaster.Add(f); - // Change owner - a2.OneToManyMaster.Add(f); - Assert.IsNotNull(f.ManyToOnePaired); - Assert.AreEqual(f.ManyToOnePaired, a2); - Assert.AreEqual(0, a1.OneToManyMaster.Count); - Assert.AreEqual(1, a2.OneToManyMaster.Count); - Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a1.OneToManyMaster.Contains(f)); - Assert.IsTrue(a2.OneToManyMaster.Contains(f.Key)); - Assert.IsTrue(a2.OneToManyMaster.Contains(f)); - // Rollback - } - - using (session.OpenTransaction()) { - Assert.IsNull(f.ManyToOnePaired); - Assert.IsNotNull(a1.OneToManyMaster); - Assert.IsNotNull(a2.OneToManyMaster); - Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a1.OneToManyMaster.Contains(f)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); - Assert.IsFalse(a2.OneToManyMaster.Contains(f)); - Assert.AreEqual(0, a1.OneToManyMaster.Count); - Assert.AreEqual(0, a2.OneToManyMaster.Count); - // Rollback - } - } - } - - [Test] - public void OneToZero() - { - using (var session = Domain.OpenSession()) { - A a; - B b; - using (var transaction = session.OpenTransaction()) { - a = new A(); - b = new B(); - transaction.Complete(); - } - - using (session.OpenTransaction()) { - Assert.IsNull(a.ZeroToOne); - a.ZeroToOne = b; - Assert.AreEqual(a.ZeroToOne, b); - a.ZeroToOne = null; - Assert.IsNull(a.ZeroToOne); - a.ZeroToOne = b; - // Rollback - } - - using (var transactionScope = session.OpenTransaction()) { - Assert.IsNull(a.ZeroToOne); - a.ZeroToOne = b; - transactionScope.Complete(); - } - - using (session.OpenTransaction()) { - Assert.AreEqual(a.ZeroToOne, b); - // Rollback - } - } - } - - [Test] - public void EntitySetMultipleAddRemove(){ - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - A a1 = new A(); - A a2 = new A(); - G g1 = new G(); - g1.ManytoManyPaired.Add(a1); - g1.ManytoManyPaired.Add(a1); - Assert.AreEqual(1, g1.ManytoManyPaired.Count); - } - } - } - - [Test] - public void ManyToMany() - { - using (var session = Domain.OpenSession()) { - A a1; - A a2; - G g1; - G g2; - - using (var transaction = session.OpenTransaction()) { - a1 = new A(); - a2 = new A(); - g1 = new G(); - g2 = new G(); - transaction.Complete(); - } - - using (var t = session.OpenTransaction()) { - Assert.IsNotNull(a1.ManyToManyMaster); - Assert.IsNotNull(g1.ManytoManyPaired); - Assert.AreEqual(0, a1.ManyToManyMaster.Count); - Assert.AreEqual(0, g1.ManytoManyPaired.Count); -// Assert.AreEqual(0, g2.ManyToOnePaired.Count); - a1.ManyToManyMaster.Add(g2); - a1.ManyToManyMaster.Add(g1); -// session.Session.Persist(); - Assert.AreEqual(2, a1.ManyToManyMaster.Count); - Assert.AreEqual(1, g1.ManytoManyPaired.Count, "G1"); - Assert.AreEqual(1, g2.ManytoManyPaired.Count, "G2"); - a1.ManyToManyMaster.Remove(g1); - a1.ManyToManyMaster.Remove(g2); - Assert.IsNotNull(a1.ManyToManyMaster); - Assert.IsNotNull(g1.ManytoManyPaired); - Assert.AreEqual(0, a1.ManyToManyMaster.Count); - Assert.AreEqual(0, g1.ManytoManyPaired.Count); - Assert.AreEqual(0, g2.ManytoManyPaired.Count); - session.SaveChanges(); - a1.ManyToManyMaster.Add(g1); - a2.ManyToManyMaster.Add(g1); - a1.ManyToManyMaster.Add(g2); - a1.ManyToManyMaster.Add(g2); - a1.ManyToManyMaster.Add(g1); - a1.ManyToManyMaster.Add(g1); - g1.ManytoManyPaired.Add(a1); - g2.ManytoManyPaired.Add(a2); - Assert.AreEqual(2, a1.ManyToManyMaster.Count); - Assert.AreEqual(2, a2.ManyToManyMaster.Count); - Assert.AreEqual(2, g1.ManytoManyPaired.Count); - Assert.AreEqual(2, g2.ManytoManyPaired.Count); - // Rollback - } - } - } - - [Test] - public void ManyToManyEnumerator() - { - using (var session = Domain.OpenSession()) { - A a1; - A a2; - G g1; - G g2; - - using (var transaction = session.OpenTransaction()) { - a1 = new A(); - a2 = new A(); - g1 = new G(); - g2 = new G(); - a1.ManyToManyMaster.Add(g1); - g2.ManytoManyPaired.Add(a1); - g1.ManytoManyPaired.Add(a2); - a2.ManyToManyMaster.Add(g2); - transaction.Complete(); - } - - using (var t = session.OpenTransaction()) { - Assert.AreEqual(2, a1.ManyToManyMaster.Count); - Assert.AreEqual(2, a2.ManyToManyMaster.Count); - Assert.AreEqual(2, g1.ManytoManyPaired.Count); - Assert.AreEqual(2, g2.ManytoManyPaired.Count); - CheckEnumerator(a1.ManyToManyMaster, g1, g2); - CheckEnumerator(a2.ManyToManyMaster, g1, g2); - CheckEnumerator(g1.ManytoManyPaired, a1, a2); - CheckEnumerator(g2.ManytoManyPaired, a1, a2); - // Rollback - } - } - } - - [Test] - public void ManyToZero() - { - A a; - E e1; - E e2; - using (var session = Domain.OpenSession()) { - - using (var transaction = session.OpenTransaction()) { - a = new A(); - e1 = new E(); - e2 = new E(); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - Assert.IsNotNull(a.ZeroToMany); - Assert.AreEqual(0, a.ZeroToMany.Count); - Assert.IsFalse(a.ZeroToMany.Contains(e1)); - Assert.IsFalse(a.ZeroToMany.Contains(e2)); - a.ZeroToMany.Add(e1); - a.ZeroToMany.Add(e2); - Assert.AreEqual(2, a.ZeroToMany.Count); - Assert.IsTrue(a.ZeroToMany.Contains(e1)); - Assert.IsTrue(a.ZeroToMany.Contains(e2)); - a.ZeroToMany.Remove(e1); - a.ZeroToMany.Remove(e2); - Assert.AreEqual(0, a.ZeroToMany.Count); - Assert.IsFalse(a.ZeroToMany.Contains(e1)); - Assert.IsFalse(a.ZeroToMany.Contains(e2)); - // Rollback - } - } - } - - [Test] - public void ManyToZeroEnumerator() - { - A a; - E e1; - E e2; - using (var session = Domain.OpenSession()) { - - using (var transaction = session.OpenTransaction()) { - a = new A(); - e1 = new E(); - e2 = new E(); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - Assert.IsNotNull(a.ZeroToMany); - Assert.AreEqual(0, a.ZeroToMany.Count); - Assert.IsFalse(a.ZeroToMany.Contains(e1)); - Assert.IsFalse(a.ZeroToMany.Contains(e2)); - a.ZeroToMany.Add(e1); - a.ZeroToMany.Add(e2); - CheckEnumerator(a.ZeroToMany, e1, e2); - // Rollback - } - } - } - - private void CheckEnumerator(EntitySet entitySet, params T[] items) where T : Entity - { - T[] currentItems = entitySet.ToArray(); - Assert.AreEqual(currentItems.Length, items.Length); - foreach (T item in items) { - Assert.IsTrue(currentItems.Contains(item)); - } - } - - [Test] - public void ParentChildrenTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var h = new H(); - var children = h.Children; - children.Add(new H()); - var first = children.First(); - Assert.AreSame(h, first.Parent); - // Rollback - } - } - } - - [Test] - public void IntermediateStructureTest() - { - using (var session = Domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - - A first = new A(); - A second = new A(); - first.IndirectA.IntermediateStructure2.A = second; - - AssertEx.Throws(second.Remove); - - tx.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.06.16 + +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Tests; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.Association; +using System.Linq; +using System.Collections.Generic; +using System; + +namespace Xtensive.Orm.Tests.Model.Association +{ + [Serializable] + [HierarchyRoot] + public abstract class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public abstract class Root2 : Entity + { + [Field, Key] + public Guid Id { get; private set; } + } + + [Serializable] + public class A : Root + { + [Field] + public B ZeroToOne { get; set; } + + [Field] + public C OneToOneMaster { get; set; } + + [Field] + public D ManyToOneMaster { get; set; } + + [Field] + public EntitySet ZeroToMany { get; private set; } + + [Field] + public EntitySet OneToManyMaster { get; private set; } + + [Field] + public EntitySet ManyToManyMaster { get; private set; } + + [Field] + public IntermediateStructure1 IndirectA { get; set; } + } + + [Serializable] + public class B : Root2 + { + } + + [Serializable] + public class C : Root2 + { + [Field, Association(PairTo = "OneToOneMaster")] + public A OneToOnePaired { get; set; } + + [Field] + public IntermediateStructure1 IndirectA { get; set; } + } + + [Serializable] + public class D : Root2 + { + [Field, Association(PairTo = "ManyToOneMaster")] + public EntitySet OneToManyPaired { get; private set; } + } + + [Serializable] + public class E : Root2 + { + } + + [Serializable] + public class F : Root2 + { + [Field, Association(PairTo = "OneToManyMaster")] + public A ManyToOnePaired { get; set; } + } + + [Serializable] + public class G : Root2 + { + [Field, Association(PairTo = "ManyToManyMaster")] + public EntitySet ManytoManyPaired { get; private set; } + } + + [Serializable] + public class H : Root2 + { + [Field] + public H Parent { get; set; } + + [Field, Association(PairTo = "Parent")] + public EntitySet Children { get; private set; } + } + + public class I : A + { + + } + + [Serializable] + public class IntermediateStructure1 : Structure + { + [Field] + public IntermediateStructure2 IntermediateStructure2 { get; set; } + } + + [Serializable] + public class IntermediateStructure2 : Structure + { + [Field] + public A A { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class AssociationTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(A).Namespace); + return config; + } + + [Test] + public void ToRecordsetTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + var a1 = new A(); + var a2 = new A(); + var rs = a1.TypeInfo.Indexes.PrimaryIndex.GetQuery(); + + foreach (Tuple tuple in rs.GetRecordSet(Session.Current)) { + var rs2 = a1.TypeInfo.Indexes.PrimaryIndex.GetQuery(); + foreach (Tuple tuple2 in rs2.GetRecordSet(Session.Current)) { + TestLog.Debug(tuple2.ToString()); + } + } + // Rollback + } + } + } + + [Test] + public void EntitySetCreation() + { + // Domain.Model.Dump(); + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + var a = new A(); + Assert.IsNotNull(a.ManyToManyMaster); + Assert.IsNotNull(a.OneToManyMaster); + Assert.IsNotNull(a.ZeroToMany); + // Rollback + } + } + } + + [Test] + public void SimpleEntitySetEnumerator() + { + using (var session = Domain.OpenSession()) { + A a; + F f1; + F f2; + F f3; + F f4; + using (var transaction = session.OpenTransaction()) { + a = new A(); + f1 = new F(); + f2 = new F(); + f3 = new F(); + f4 = new F(); + transaction.Complete(); + } + IEnumerator enumerator; + using (var transaction = session.OpenTransaction()) { + Assert.AreEqual(0, a.OneToManyMaster.Count()); // Linq count through enumerate + f1.ManyToOnePaired = a; + f2.ManyToOnePaired = a; + f3.ManyToOnePaired = a; + f4.ManyToOnePaired = a; + + Assert.AreEqual(4, a.OneToManyMaster.Count()); // Enumerate through internal cacee + foreach (F f in a.OneToManyMaster) { + a.OneToManyMaster.Contains(f); // Enumerate through internal cahce + } + enumerator = a.OneToManyMaster.GetEnumerator(); + Assert.IsTrue(enumerator.MoveNext()); + Assert.IsTrue(enumerator.MoveNext()); + transaction.Complete(); + } + // Cache is invalidated here + using (session.OpenTransaction()) { + Assert.AreEqual(4, a.OneToManyMaster.Count()); // Enumerate through recordset request + foreach (F f in a.OneToManyMaster) { + // a.OneToManyMaster.Contains(f.Key); // Enumerate through recordset request + a.OneToManyMaster.Contains(f); // Enumerate through recordset request + } + // Rollback + } + } + } + + [Test] + public void OneToOneAssign() + { + // Domain.Model.Dump(); + using (var session = Domain.OpenSession()) { + C c; + A a; + + using (var t = session.OpenTransaction()) { + c = new C(); + a = new A(); + t.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(a.OneToOneMaster); + Assert.IsNull(c.OneToOnePaired); + c.OneToOnePaired = a; + Assert.IsNotNull(a.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a); + c.OneToOnePaired = a; + Assert.IsNotNull(a.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a); + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(a.OneToOneMaster); + Assert.IsNull(c.OneToOnePaired); + a.OneToOneMaster = c; + Assert.IsNotNull(a.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a); + } + } + } + + [Test] + public void OneToOneChangeOwner() + { + // Domain.Model.Dump(); + using (var session = Domain.OpenSession()) { + C c; + A a1; + A a2; + + using (var t = session.OpenTransaction()) { + c = new C(); + a1 = new A(); + a2 = new A(); + t.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(a1.OneToOneMaster); + Assert.IsNull(a2.OneToOneMaster); + Assert.IsNull(c.OneToOnePaired); + c.OneToOnePaired = a1; + Assert.IsNotNull(a1.OneToOneMaster); + Assert.IsNull(a2.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a1.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a1); + // Change owner + c.OneToOnePaired = a2; + Assert.IsNull(a1.OneToOneMaster); + Assert.IsNotNull(a2.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a2.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a2); + // Change back trough another class + a1.OneToOneMaster = c; + Assert.IsNotNull(a1.OneToOneMaster); + Assert.IsNull(a2.OneToOneMaster); + Assert.IsNotNull(c.OneToOnePaired); + Assert.AreEqual(a1.OneToOneMaster, c); + Assert.AreEqual(c.OneToOnePaired, a1); + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(a1.OneToOneMaster); + Assert.IsNull(a2.OneToOneMaster); + Assert.IsNull(c.OneToOnePaired); + // Rollback + } + } + } + + [Test] + public void ManyToOneAssign() + { + using (var session = Domain.OpenSession()) { + A a; + F f; + + using (var transaction = session.OpenTransaction()) { + a = new A(); + f = new F(); + transaction.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f)); + f.ManyToOnePaired = a; + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + f.ManyToOnePaired = a; + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f)); + // Rollback + } + + // Assign back and commit + using (var transaction = session.OpenTransaction()) { + f.ManyToOnePaired = a; + Assert.IsNotNull(f.ManyToOnePaired); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + Assert.AreEqual(1, a.OneToManyMaster.Count); + transaction.Complete(); + } + + // Check commited state + using (session.OpenTransaction()) { + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + // Rollback + } + } + } + + [Test] + public void ManyToOneAddToSet() + { + using (var session = Domain.OpenSession()) { + A a; + F f; + + using (var transaction = session.OpenTransaction()) { + a = new A(); + f = new F(); + transaction.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f)); + a.OneToManyMaster.Add(f); + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(f.ManyToOnePaired, a); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + a.OneToManyMaster.Add(f); + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(f.ManyToOnePaired, a); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f)); + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f)); + // Rollback + } + } + } + + [Test] + public void ManyToOneChangeOwnerByAssign() + { + using (var session = Domain.OpenSession()) { + A a; + F f1; + F f2; + + using (var transaction = session.OpenTransaction()) { + a = new A(); + f1 = new F(); + f2 = new F(); + transaction.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(f1.ManyToOnePaired); + Assert.IsNull(f2.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f1)); + Assert.IsFalse(a.OneToManyMaster.Contains(f2.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f2)); + f1.ManyToOnePaired = a; + Assert.IsNotNull(f1.ManyToOnePaired); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f1.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f1)); + Assert.IsFalse(a.OneToManyMaster.Contains(f2.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f2)); + f2.ManyToOnePaired = a; + Assert.IsNotNull(f1.ManyToOnePaired); + Assert.IsNotNull(f2.ManyToOnePaired); + Assert.AreEqual(2, a.OneToManyMaster.Count); + Assert.IsTrue(a.OneToManyMaster.Contains(f1)); + Assert.IsTrue(a.OneToManyMaster.Contains(f1.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f2.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f2)); + f1.ManyToOnePaired = null; + Assert.IsNull(f1.ManyToOnePaired); + Assert.IsNotNull(f2.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(1, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f1)); + Assert.IsTrue(a.OneToManyMaster.Contains(f2.Key)); + Assert.IsTrue(a.OneToManyMaster.Contains(f2)); + f1.ManyToOnePaired = a; + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(f1.ManyToOnePaired); + Assert.IsNull(f2.ManyToOnePaired); + Assert.IsNotNull(a.OneToManyMaster); + Assert.AreEqual(0, a.OneToManyMaster.Count); + Assert.IsFalse(a.OneToManyMaster.Contains(f1.Key)); + Assert.IsFalse(a.OneToManyMaster.Contains(f1)); + // Rollback + } + } + } + + [Test] + public void ManyToOneChangeOwnerByEntitySet() + { + using (var session = Domain.OpenSession()) { + A a1; + A a2; + F f; + + using (var transaction = session.OpenTransaction()) { + a1 = new A(); + a2 = new A(); + f = new F(); + transaction.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a1.OneToManyMaster); + Assert.IsNotNull(a2.OneToManyMaster); + Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a1.OneToManyMaster.Contains(f)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f)); + Assert.AreEqual(0, a1.OneToManyMaster.Count); + Assert.AreEqual(0, a2.OneToManyMaster.Count); + a1.OneToManyMaster.Add(f); + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(f.ManyToOnePaired, a1); + Assert.AreEqual(1, a1.OneToManyMaster.Count); + Assert.AreEqual(0, a2.OneToManyMaster.Count); + Assert.IsTrue(a1.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a1.OneToManyMaster.Contains(f)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f)); + a1.OneToManyMaster.Remove(f); + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a1.OneToManyMaster); + Assert.IsNotNull(a2.OneToManyMaster); + Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a1.OneToManyMaster.Contains(f)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f)); + Assert.AreEqual(0, a1.OneToManyMaster.Count); + Assert.AreEqual(0, a2.OneToManyMaster.Count); + a1.OneToManyMaster.Add(f); + // Change owner + a2.OneToManyMaster.Add(f); + Assert.IsNotNull(f.ManyToOnePaired); + Assert.AreEqual(f.ManyToOnePaired, a2); + Assert.AreEqual(0, a1.OneToManyMaster.Count); + Assert.AreEqual(1, a2.OneToManyMaster.Count); + Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a1.OneToManyMaster.Contains(f)); + Assert.IsTrue(a2.OneToManyMaster.Contains(f.Key)); + Assert.IsTrue(a2.OneToManyMaster.Contains(f)); + // Rollback + } + + using (session.OpenTransaction()) { + Assert.IsNull(f.ManyToOnePaired); + Assert.IsNotNull(a1.OneToManyMaster); + Assert.IsNotNull(a2.OneToManyMaster); + Assert.IsFalse(a1.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a1.OneToManyMaster.Contains(f)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f.Key)); + Assert.IsFalse(a2.OneToManyMaster.Contains(f)); + Assert.AreEqual(0, a1.OneToManyMaster.Count); + Assert.AreEqual(0, a2.OneToManyMaster.Count); + // Rollback + } + } + } + + [Test] + public void OneToZero() + { + using (var session = Domain.OpenSession()) { + A a; + B b; + using (var transaction = session.OpenTransaction()) { + a = new A(); + b = new B(); + transaction.Complete(); + } + + using (session.OpenTransaction()) { + Assert.IsNull(a.ZeroToOne); + a.ZeroToOne = b; + Assert.AreEqual(a.ZeroToOne, b); + a.ZeroToOne = null; + Assert.IsNull(a.ZeroToOne); + a.ZeroToOne = b; + // Rollback + } + + using (var transactionScope = session.OpenTransaction()) { + Assert.IsNull(a.ZeroToOne); + a.ZeroToOne = b; + transactionScope.Complete(); + } + + using (session.OpenTransaction()) { + Assert.AreEqual(a.ZeroToOne, b); + // Rollback + } + } + } + + [Test] + public void EntitySetMultipleAddRemove(){ + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + A a1 = new A(); + A a2 = new A(); + G g1 = new G(); + g1.ManytoManyPaired.Add(a1); + g1.ManytoManyPaired.Add(a1); + Assert.AreEqual(1, g1.ManytoManyPaired.Count); + } + } + } + + [Test] + public void ManyToMany() + { + using (var session = Domain.OpenSession()) { + A a1; + A a2; + G g1; + G g2; + + using (var transaction = session.OpenTransaction()) { + a1 = new A(); + a2 = new A(); + g1 = new G(); + g2 = new G(); + transaction.Complete(); + } + + using (var t = session.OpenTransaction()) { + Assert.IsNotNull(a1.ManyToManyMaster); + Assert.IsNotNull(g1.ManytoManyPaired); + Assert.AreEqual(0, a1.ManyToManyMaster.Count); + Assert.AreEqual(0, g1.ManytoManyPaired.Count); +// Assert.AreEqual(0, g2.ManyToOnePaired.Count); + a1.ManyToManyMaster.Add(g2); + a1.ManyToManyMaster.Add(g1); +// session.Session.Persist(); + Assert.AreEqual(2, a1.ManyToManyMaster.Count); + Assert.AreEqual(1, g1.ManytoManyPaired.Count, "G1"); + Assert.AreEqual(1, g2.ManytoManyPaired.Count, "G2"); + a1.ManyToManyMaster.Remove(g1); + a1.ManyToManyMaster.Remove(g2); + Assert.IsNotNull(a1.ManyToManyMaster); + Assert.IsNotNull(g1.ManytoManyPaired); + Assert.AreEqual(0, a1.ManyToManyMaster.Count); + Assert.AreEqual(0, g1.ManytoManyPaired.Count); + Assert.AreEqual(0, g2.ManytoManyPaired.Count); + session.SaveChanges(); + a1.ManyToManyMaster.Add(g1); + a2.ManyToManyMaster.Add(g1); + a1.ManyToManyMaster.Add(g2); + a1.ManyToManyMaster.Add(g2); + a1.ManyToManyMaster.Add(g1); + a1.ManyToManyMaster.Add(g1); + g1.ManytoManyPaired.Add(a1); + g2.ManytoManyPaired.Add(a2); + Assert.AreEqual(2, a1.ManyToManyMaster.Count); + Assert.AreEqual(2, a2.ManyToManyMaster.Count); + Assert.AreEqual(2, g1.ManytoManyPaired.Count); + Assert.AreEqual(2, g2.ManytoManyPaired.Count); + // Rollback + } + } + } + + [Test] + public void ManyToManyEnumerator() + { + using (var session = Domain.OpenSession()) { + A a1; + A a2; + G g1; + G g2; + + using (var transaction = session.OpenTransaction()) { + a1 = new A(); + a2 = new A(); + g1 = new G(); + g2 = new G(); + a1.ManyToManyMaster.Add(g1); + g2.ManytoManyPaired.Add(a1); + g1.ManytoManyPaired.Add(a2); + a2.ManyToManyMaster.Add(g2); + transaction.Complete(); + } + + using (var t = session.OpenTransaction()) { + Assert.AreEqual(2, a1.ManyToManyMaster.Count); + Assert.AreEqual(2, a2.ManyToManyMaster.Count); + Assert.AreEqual(2, g1.ManytoManyPaired.Count); + Assert.AreEqual(2, g2.ManytoManyPaired.Count); + CheckEnumerator(a1.ManyToManyMaster, g1, g2); + CheckEnumerator(a2.ManyToManyMaster, g1, g2); + CheckEnumerator(g1.ManytoManyPaired, a1, a2); + CheckEnumerator(g2.ManytoManyPaired, a1, a2); + // Rollback + } + } + } + + [Test] + public void ManyToZero() + { + A a; + E e1; + E e2; + using (var session = Domain.OpenSession()) { + + using (var transaction = session.OpenTransaction()) { + a = new A(); + e1 = new E(); + e2 = new E(); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + Assert.IsNotNull(a.ZeroToMany); + Assert.AreEqual(0, a.ZeroToMany.Count); + Assert.IsFalse(a.ZeroToMany.Contains(e1)); + Assert.IsFalse(a.ZeroToMany.Contains(e2)); + a.ZeroToMany.Add(e1); + a.ZeroToMany.Add(e2); + Assert.AreEqual(2, a.ZeroToMany.Count); + Assert.IsTrue(a.ZeroToMany.Contains(e1)); + Assert.IsTrue(a.ZeroToMany.Contains(e2)); + a.ZeroToMany.Remove(e1); + a.ZeroToMany.Remove(e2); + Assert.AreEqual(0, a.ZeroToMany.Count); + Assert.IsFalse(a.ZeroToMany.Contains(e1)); + Assert.IsFalse(a.ZeroToMany.Contains(e2)); + // Rollback + } + } + } + + [Test] + public void ManyToZeroEnumerator() + { + A a; + E e1; + E e2; + using (var session = Domain.OpenSession()) { + + using (var transaction = session.OpenTransaction()) { + a = new A(); + e1 = new E(); + e2 = new E(); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + Assert.IsNotNull(a.ZeroToMany); + Assert.AreEqual(0, a.ZeroToMany.Count); + Assert.IsFalse(a.ZeroToMany.Contains(e1)); + Assert.IsFalse(a.ZeroToMany.Contains(e2)); + a.ZeroToMany.Add(e1); + a.ZeroToMany.Add(e2); + CheckEnumerator(a.ZeroToMany, e1, e2); + // Rollback + } + } + } + + private void CheckEnumerator(EntitySet entitySet, params T[] items) where T : Entity + { + T[] currentItems = entitySet.ToArray(); + Assert.AreEqual(currentItems.Length, items.Length); + foreach (T item in items) { + Assert.IsTrue(currentItems.Contains(item)); + } + } + + [Test] + public void ParentChildrenTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var h = new H(); + var children = h.Children; + children.Add(new H()); + var first = children.First(); + Assert.AreSame(h, first.Parent); + // Rollback + } + } + } + + [Test] + public void IntermediateStructureTest() + { + using (var session = Domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + + A first = new A(); + A second = new A(); + first.IndirectA.IntermediateStructure2.A = second; + + AssertEx.Throws(second.Remove); + + tx.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/AssociationsOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Model/AssociationsOverrideTest.cs index 7c65cea3d8..bd48612389 100644 --- a/Orm/Xtensive.Orm.Tests/Model/AssociationsOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/AssociationsOverrideTest.cs @@ -1,99 +1,99 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.04.27 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.DiscardedAssociationsBugModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace DiscardedAssociationsBugModel - { - public class EntityBase : Entity - { - [Key, Field] - public int Id { get; private set; } - } - - public interface ISlave - where T : Entity - { - [Field(Indexed = false)] - [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] - T Owner { get; } - } - - public abstract class Slave : EntityBase, ISlave - where T : Entity - { - public T Owner { get; set; } - } - - [HierarchyRoot] - public class MasterBase : EntityBase - { - } - - [HierarchyRoot] - public class SlaveBase : Slave - { - } - - public class Master1 : MasterBase - { - public class Slave1 : SlaveBase - { - } - } - - public class Master2 : MasterBase - { - [Field, Association(PairTo = "Owner")] - public EntitySet Slaves { get; private set; } - - public class Slave2 : SlaveBase - { - } - } - } - - public class AssociationsOverrideTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.NamingConvention.NamingRules = NamingRules.UnderscoreDots; - config.Types.Register(typeof (Slave<>).Assembly, typeof (Slave<>).Namespace); - return config; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var m1 = new Master1(); - var m2 = new Master2(); - new Master1.Slave1 {Owner = m1}; - new Master2.Slave2 {Owner = m2}; - tx.Complete(); - } - } - - [Test] - public void Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var s1 = Query.All().Single(); - var s2 = Query.All().Single(); - - Assert.That(s1.Owner, Is.Not.Null); - Assert.That(s2.Owner, Is.Not.Null); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.04.27 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.DiscardedAssociationsBugModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace DiscardedAssociationsBugModel + { + public class EntityBase : Entity + { + [Key, Field] + public int Id { get; private set; } + } + + public interface ISlave + where T : Entity + { + [Field(Indexed = false)] + [Association(OnTargetRemove = OnRemoveAction.Cascade, OnOwnerRemove = OnRemoveAction.Clear)] + T Owner { get; } + } + + public abstract class Slave : EntityBase, ISlave + where T : Entity + { + public T Owner { get; set; } + } + + [HierarchyRoot] + public class MasterBase : EntityBase + { + } + + [HierarchyRoot] + public class SlaveBase : Slave + { + } + + public class Master1 : MasterBase + { + public class Slave1 : SlaveBase + { + } + } + + public class Master2 : MasterBase + { + [Field, Association(PairTo = "Owner")] + public EntitySet Slaves { get; private set; } + + public class Slave2 : SlaveBase + { + } + } + } + + public class AssociationsOverrideTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.NamingConvention.NamingRules = NamingRules.UnderscoreDots; + config.Types.Register(typeof (Slave<>).Assembly, typeof (Slave<>).Namespace); + return config; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var m1 = new Master1(); + var m2 = new Master2(); + new Master1.Slave1 {Owner = m1}; + new Master2.Slave2 {Owner = m2}; + tx.Complete(); + } + } + + [Test] + public void Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var s1 = Query.All().Single(); + var s2 = Query.All().Single(); + + Assert.That(s1.Owner, Is.Not.Null); + Assert.That(s2.Owner, Is.Not.Null); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/AutoGenericsOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Model/AutoGenericsOverrideTest.cs index a3eb0ac93c..5ed0fc28ae 100644 --- a/Orm/Xtensive.Orm.Tests/Model/AutoGenericsOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/AutoGenericsOverrideTest.cs @@ -1,60 +1,60 @@ -using System.Collections.Generic; -using NUnit.Framework; -using Xtensive.Orm.Building; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.AutoGenericsOverrideTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace AutoGenericsOverrideTestModel - { - public class Builder : Module - { - public override void OnAutoGenericsBuilt(BuildingContext context, ICollection autoGenerics) - { - autoGenerics.Remove(typeof (MyAutoGeneric)); - autoGenerics.Add(typeof (MyAutoGeneric)); - } - } - - [HierarchyRoot] - public class MyAutoGeneric : Entity - where T : IEntity - { - [Key, Field] - public long Id { get; private set; } - } - - [HierarchyRoot] - public class MyBaseType : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - public class MyChildType : MyBaseType - { - } - } - - [TestFixture] - public class AutoGenericsOverrideTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Builder).Assembly, typeof (Builder).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - var baseTypeGeneric = typeof (MyAutoGeneric); - var childTypeGeneric = typeof (MyAutoGeneric); - - Assert.That(!Domain.Model.Types.Contains(baseTypeGeneric)); - Assert.That(Domain.Model.Types.Contains(childTypeGeneric)); - } - } +using System.Collections.Generic; +using NUnit.Framework; +using Xtensive.Orm.Building; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.AutoGenericsOverrideTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace AutoGenericsOverrideTestModel + { + public class Builder : Module + { + public override void OnAutoGenericsBuilt(BuildingContext context, ICollection autoGenerics) + { + autoGenerics.Remove(typeof (MyAutoGeneric)); + autoGenerics.Add(typeof (MyAutoGeneric)); + } + } + + [HierarchyRoot] + public class MyAutoGeneric : Entity + where T : IEntity + { + [Key, Field] + public long Id { get; private set; } + } + + [HierarchyRoot] + public class MyBaseType : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + public class MyChildType : MyBaseType + { + } + } + + [TestFixture] + public class AutoGenericsOverrideTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Builder).Assembly, typeof (Builder).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + var baseTypeGeneric = typeof (MyAutoGeneric); + var childTypeGeneric = typeof (MyAutoGeneric); + + Assert.That(!Domain.Model.Types.Contains(baseTypeGeneric)); + Assert.That(Domain.Model.Types.Contains(childTypeGeneric)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/CycleReferenceTest.cs b/Orm/Xtensive.Orm.Tests/Model/CycleReferenceTest.cs index 488a072d17..d0a980061a 100644 --- a/Orm/Xtensive.Orm.Tests/Model/CycleReferenceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/CycleReferenceTest.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.04.16 - -using System; -using System.Reflection; -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Model.CycleReferenceTestModel -{ - [Serializable] - [HierarchyRoot] - public class Parent : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public Neighbor Neighbor { get; set; } - } - - [Serializable] - public class Child : Parent - { - } - - [Serializable] - [HierarchyRoot] - public class Neighbor : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, Association(PairTo = "Neighbor")] - public EntitySet Persons { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class CycleReferenceTest - { - [Test] - // [ExpectedException(typeof(InvalidOperationException))] - public void CombinedTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Model.CycleReferenceTestModel"); - - using (var domain = Domain.Build(config)) - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.04.16 + +using System; +using System.Reflection; +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Model.CycleReferenceTestModel +{ + [Serializable] + [HierarchyRoot] + public class Parent : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public Neighbor Neighbor { get; set; } + } + + [Serializable] + public class Child : Parent + { + } + + [Serializable] + [HierarchyRoot] + public class Neighbor : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, Association(PairTo = "Neighbor")] + public EntitySet Persons { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class CycleReferenceTest + { + [Test] + // [ExpectedException(typeof(InvalidOperationException))] + public void CombinedTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Model.CycleReferenceTestModel"); + + using (var domain = Domain.Build(config)) + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/CyclicContainedStructureTest.cs b/Orm/Xtensive.Orm.Tests/Model/CyclicContainedStructureTest.cs index 157da87c43..cbea0d285a 100644 --- a/Orm/Xtensive.Orm.Tests/Model/CyclicContainedStructureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/CyclicContainedStructureTest.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.06.16 - -using System; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Model.ReferenceTestModel -{ - #region Cyclic referenced structures - - [Serializable] - public class S1 : Structure - { - [Field] - public S2 Value { get; set; } - } - - [Serializable] - public class S2 : Structure - { - [Field] - public S3 Value { get; set; } - } - - [Serializable] - public class S3 : Structure - { - [Field] - public S1 Value { get; set; } - } - - #endregion - - #region Cyclic contained structures with inheritance - - [Serializable] - public class Parent : Structure - { - [Field] - public Child Value { get; set; } - } - - [Serializable] - public class Child : Parent - { - } - - #endregion -} - -namespace Xtensive.Orm.Tests.Model -{ - public class CyclicContainedStructureTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Model.ReferenceTestModel"); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain = null; - try { - domain = Domain.Build(configuration); - } - catch (DomainBuilderException e) { - } - return domain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.06.16 + +using System; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Model.ReferenceTestModel +{ + #region Cyclic referenced structures + + [Serializable] + public class S1 : Structure + { + [Field] + public S2 Value { get; set; } + } + + [Serializable] + public class S2 : Structure + { + [Field] + public S3 Value { get; set; } + } + + [Serializable] + public class S3 : Structure + { + [Field] + public S1 Value { get; set; } + } + + #endregion + + #region Cyclic contained structures with inheritance + + [Serializable] + public class Parent : Structure + { + [Field] + public Child Value { get; set; } + } + + [Serializable] + public class Child : Parent + { + } + + #endregion +} + +namespace Xtensive.Orm.Tests.Model +{ + public class CyclicContainedStructureTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Model.ReferenceTestModel"); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain = null; + try { + domain = Domain.Build(configuration); + } + catch (DomainBuilderException e) { + } + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/CyclicHierarchyDependenciesTest.cs b/Orm/Xtensive.Orm.Tests/Model/CyclicHierarchyDependenciesTest.cs index 5e56742126..dd85bf4bae 100644 --- a/Orm/Xtensive.Orm.Tests/Model/CyclicHierarchyDependenciesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/CyclicHierarchyDependenciesTest.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.12 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.CyclicHierarchyDependenciesModel; - -namespace Xtensive.Orm.Tests.CyclicHierarchyDependenciesModel -{ - [Serializable] - [HierarchyRoot] - public class H1 : Entity - { - [Field, Key(0)] - public H2 First { get; private set; } - - [Field, Key(1)] - public H3 Second { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class H2 : Entity - { - [Field, Key(0)] - public H1 First { get; private set; } - - [Field, Key(1)] - public H3 Second { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class H3 : Entity - { - [Field, Key(0)] - public H1 First { get; private set; } - - [Field, Key(1)] - public H2 Second { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class CyclicHierarchyDependenciesTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (H1).Assembly, typeof (H1).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain = null; - try { - domain = Domain.Build(configuration); - Assert.Fail("Epic"); - } - catch (DomainBuilderException e) { - Console.WriteLine(e); - } - return domain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.12 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.CyclicHierarchyDependenciesModel; + +namespace Xtensive.Orm.Tests.CyclicHierarchyDependenciesModel +{ + [Serializable] + [HierarchyRoot] + public class H1 : Entity + { + [Field, Key(0)] + public H2 First { get; private set; } + + [Field, Key(1)] + public H3 Second { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class H2 : Entity + { + [Field, Key(0)] + public H1 First { get; private set; } + + [Field, Key(1)] + public H3 Second { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class H3 : Entity + { + [Field, Key(0)] + public H1 First { get; private set; } + + [Field, Key(1)] + public H2 Second { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class CyclicHierarchyDependenciesTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (H1).Assembly, typeof (H1).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain = null; + try { + domain = Domain.Build(configuration); + Assert.Fail("Epic"); + } + catch (DomainBuilderException e) { + Console.WriteLine(e); + } + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/DuplicatedIndexDueToGenericInterfaceTest.cs b/Orm/Xtensive.Orm.Tests/Model/DuplicatedIndexDueToGenericInterfaceTest.cs index 45dfd4c15b..5819e1227f 100644 --- a/Orm/Xtensive.Orm.Tests/Model/DuplicatedIndexDueToGenericInterfaceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/DuplicatedIndexDueToGenericInterfaceTest.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.11 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Model.DuplicatedIndexDueToGenericInterfaceTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace DuplicatedIndexDueToGenericInterfaceTestModel - { - [HierarchyRoot] - public class ReferencedEntity : Entity - { - [Key, Field] - public int Id { get; private set; } - } - - public interface IHasReferenceGeneric : IEntity - where TReference : Entity - { - [Field] - TReference Ref { get; } - } - - [HierarchyRoot] - public class ImplementorOfGenericInterface : Entity, IHasReferenceGeneric - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public ReferencedEntity Ref { get; set; } - } - - public interface IHasReference : IEntity - { - [Field] - ReferencedEntity Ref { get; } - } - - [HierarchyRoot] - public class ImplementorOfNonGenericInterface : Entity, IHasReference - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public ReferencedEntity Ref { get; set; } - } - } - - [TestFixture] - public class DuplicatedIndexDueToGenericInterfaceTest : AutoBuildTest - { - protected override Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ReferencedEntity).Assembly, typeof (ReferencedEntity).Namespace); - return configuration; - } - - [Test] - public void Test() - { - var indexes1 = Domain.Model.Types[typeof(ImplementorOfGenericInterface)].Indexes; - var refIndexes1 = indexes1.Where(i => i.Columns.Any(c => c.Name=="Ref.Id") && i.IsSecondary && !i.IsVirtual).ToList(); - - var indexes2 = Domain.Model.Types[typeof(ImplementorOfNonGenericInterface)].Indexes; - var refIndexes2 = indexes2.Where(i => i.Columns.Any(c => c.Name == "Ref.Id") && i.IsSecondary && !i.IsVirtual).ToList(); - - Assert.That(refIndexes1.Count, Is.EqualTo(1)); - Assert.That(refIndexes2.Count, Is.EqualTo(1)); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.11 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Model.DuplicatedIndexDueToGenericInterfaceTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace DuplicatedIndexDueToGenericInterfaceTestModel + { + [HierarchyRoot] + public class ReferencedEntity : Entity + { + [Key, Field] + public int Id { get; private set; } + } + + public interface IHasReferenceGeneric : IEntity + where TReference : Entity + { + [Field] + TReference Ref { get; } + } + + [HierarchyRoot] + public class ImplementorOfGenericInterface : Entity, IHasReferenceGeneric + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public ReferencedEntity Ref { get; set; } + } + + public interface IHasReference : IEntity + { + [Field] + ReferencedEntity Ref { get; } + } + + [HierarchyRoot] + public class ImplementorOfNonGenericInterface : Entity, IHasReference + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public ReferencedEntity Ref { get; set; } + } + } + + [TestFixture] + public class DuplicatedIndexDueToGenericInterfaceTest : AutoBuildTest + { + protected override Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (ReferencedEntity).Assembly, typeof (ReferencedEntity).Namespace); + return configuration; + } + + [Test] + public void Test() + { + var indexes1 = Domain.Model.Types[typeof(ImplementorOfGenericInterface)].Indexes; + var refIndexes1 = indexes1.Where(i => i.Columns.Any(c => c.Name=="Ref.Id") && i.IsSecondary && !i.IsVirtual).ToList(); + + var indexes2 = Domain.Model.Types[typeof(ImplementorOfNonGenericInterface)].Indexes; + var refIndexes2 = indexes2.Where(i => i.Columns.Any(c => c.Name == "Ref.Id") && i.IsSecondary && !i.IsVirtual).ToList(); + + Assert.That(refIndexes1.Count, Is.EqualTo(1)); + Assert.That(refIndexes2.Count, Is.EqualTo(1)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/FieldConverterTest.cs b/Orm/Xtensive.Orm.Tests/Model/FieldConverterTest.cs index 19a7647fe2..5abc424920 100644 --- a/Orm/Xtensive.Orm.Tests/Model/FieldConverterTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/FieldConverterTest.cs @@ -1,170 +1,170 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.20 - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.FieldConverterTestModel; - -namespace Xtensive.Orm.Tests.Model.FieldConverterTestModel -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - private string DateValue { get; set; } - - public DateTime? Date - { - get - { - if (string.IsNullOrEmpty(DateValue)) - if (string.IsNullOrEmpty(DateValue)) - return null; - return DateTime.Parse(DateValue); - } - set { DateValue = value.ToString(); } - } - - [Field] - private bool IsChanged { get; set; } - - [Field] - private byte[] CollectionValue { get; set; } - - public ObservableCollection Collection { get; set; } - - private static byte[] Serialize(ObservableCollection collection) - { - var ms = new MemoryStream(); - var bf = new BinaryFormatter(); - bf.Serialize(ms, collection); - return ms.ToArray(); - } - - private static ObservableCollection Deserialize(byte[] bytes) - { - var bf = new BinaryFormatter(); - var ms = new MemoryStream(bytes); - return (ObservableCollection) bf.Deserialize(ms); - } - - protected override void OnInitialize() - { - base.OnInitialize(); - if (CollectionValue != null && CollectionValue.Length > 0) - Collection = Deserialize(CollectionValue); - else - Collection = new ObservableCollection(); - Collection.CollectionChanged += Collection_CollectionChanged; - Session.Events.Persisting += Session_Persisting; - } - - void Session_Persisting(object sender, EventArgs e) - { - if (!IsChanged) - return; - CollectionValue = Serialize(Collection); - IsChanged = false; - } - - void Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - IsChanged = true; - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class FieldConverterTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void SingleValueTest() - { - using (var session = Domain.OpenSession()) { - Key key = null; - var dateTime = new DateTime(2000, 01, 07); - using (var t = session.OpenTransaction()) { - - var person = new Person(); - key = person.Key; - Assert.IsNull(person.Date); - person.Date = dateTime; - - t.Complete(); - } - - using (var t = session.OpenTransaction()) { - - var person = session.Query.Single(key); - Assert.AreEqual(dateTime, person.Date); - - t.Complete(); - } - } - } - - [Test] - public void CollectionTest() - { - Key key; - // Creating entity - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = new Person(); - key = person.Key; - person.Collection.Add(4); - person.Collection.Add(5); - t.Complete(); - } - } - - // Fetching entity & modifying it - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = session.Query.Single(key); - Assert.IsNotNull(person.Collection); - Assert.AreEqual(2, person.Collection.Count); - Assert.AreEqual(4, person.Collection[0]); - Assert.AreEqual(5, person.Collection[1]); - - person.Collection.Add(6); - t.Complete(); - } - } - - // Fetching entity - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var person = session.Query.Single(key); - Assert.IsNotNull(person.Collection); - Assert.AreEqual(3, person.Collection.Count); - Assert.AreEqual(4, person.Collection[0]); - Assert.AreEqual(5, person.Collection[1]); - Assert.AreEqual(6, person.Collection[2]); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.20 + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.FieldConverterTestModel; + +namespace Xtensive.Orm.Tests.Model.FieldConverterTestModel +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + private string DateValue { get; set; } + + public DateTime? Date + { + get + { + if (string.IsNullOrEmpty(DateValue)) + if (string.IsNullOrEmpty(DateValue)) + return null; + return DateTime.Parse(DateValue); + } + set { DateValue = value.ToString(); } + } + + [Field] + private bool IsChanged { get; set; } + + [Field] + private byte[] CollectionValue { get; set; } + + public ObservableCollection Collection { get; set; } + + private static byte[] Serialize(ObservableCollection collection) + { + var ms = new MemoryStream(); + var bf = new BinaryFormatter(); + bf.Serialize(ms, collection); + return ms.ToArray(); + } + + private static ObservableCollection Deserialize(byte[] bytes) + { + var bf = new BinaryFormatter(); + var ms = new MemoryStream(bytes); + return (ObservableCollection) bf.Deserialize(ms); + } + + protected override void OnInitialize() + { + base.OnInitialize(); + if (CollectionValue != null && CollectionValue.Length > 0) + Collection = Deserialize(CollectionValue); + else + Collection = new ObservableCollection(); + Collection.CollectionChanged += Collection_CollectionChanged; + Session.Events.Persisting += Session_Persisting; + } + + void Session_Persisting(object sender, EventArgs e) + { + if (!IsChanged) + return; + CollectionValue = Serialize(Collection); + IsChanged = false; + } + + void Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + IsChanged = true; + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class FieldConverterTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void SingleValueTest() + { + using (var session = Domain.OpenSession()) { + Key key = null; + var dateTime = new DateTime(2000, 01, 07); + using (var t = session.OpenTransaction()) { + + var person = new Person(); + key = person.Key; + Assert.IsNull(person.Date); + person.Date = dateTime; + + t.Complete(); + } + + using (var t = session.OpenTransaction()) { + + var person = session.Query.Single(key); + Assert.AreEqual(dateTime, person.Date); + + t.Complete(); + } + } + } + + [Test] + public void CollectionTest() + { + Key key; + // Creating entity + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = new Person(); + key = person.Key; + person.Collection.Add(4); + person.Collection.Add(5); + t.Complete(); + } + } + + // Fetching entity & modifying it + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = session.Query.Single(key); + Assert.IsNotNull(person.Collection); + Assert.AreEqual(2, person.Collection.Count); + Assert.AreEqual(4, person.Collection[0]); + Assert.AreEqual(5, person.Collection[1]); + + person.Collection.Add(6); + t.Complete(); + } + } + + // Fetching entity + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var person = session.Query.Single(key); + Assert.IsNotNull(person.Collection); + Assert.AreEqual(3, person.Collection.Count); + Assert.AreEqual(4, person.Collection[0]); + Assert.AreEqual(5, person.Collection[1]); + Assert.AreEqual(6, person.Collection[2]); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/FullText/DynamicallyDefinedFieldsAndIndexesTest.cs b/Orm/Xtensive.Orm.Tests/Model/FullText/DynamicallyDefinedFieldsAndIndexesTest.cs index 6ec234f811..baa2956ed1 100644 --- a/Orm/Xtensive.Orm.Tests/Model/FullText/DynamicallyDefinedFieldsAndIndexesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/FullText/DynamicallyDefinedFieldsAndIndexesTest.cs @@ -1,214 +1,214 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2016.11.17 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Model.FullTextIndexOnDynamicallyDefinedFieldsTestModel; - -namespace Xtensive.Orm.Tests.Model.FullTextIndexOnDynamicallyDefinedFieldsTestModel -{ - [HierarchyRoot] - public class Store : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public string Name { get; set; } - - //Will be dynamically defined - //[Field] - //public Address Address { get; set; } - } - - [HierarchyRoot] - public class Customer : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - // index will be added dynamically - //[FullText("English")] - public string FirstName { get; set; } - - [Field] - // index will be added dynamically - //[FullText("English")] - public string LastName { get; set; } - - [Field] - public DateTime DateOfBirth { get; set; } - - //Field will be added dynamically - // and added to FullText - //[Field] - //public string ManagerSpecialComment { get; set; } - - [Field] - public Address Address { get; set; } - - //Field will be added dynamically - // and added to FullText - //[Field] - //public Address OptionalAddress { get; set; } - } - - public class Address : Structure - { - [Field] - public string City { get; set; } - - [Field] - public string Country { get; set; } - - // Will be defided dynamically - // also will be included to FT index - //[Field] - //public string Region { get; set; } - - [Field] - public string Street { get; set; } - - [Field] - public string BuildingNumber { get; set; } - } - - public class Module : IModule - { - public void OnBuilt(Domain domain) - { - } - - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - DefineDynamicFields(model); - DefineFullTextIndex(model); - } - - private void DefineDynamicFields(DomainModelDef model) - { - var addressType = model.Types[typeof (Address)]; - var region = addressType.DefineField("Region", typeof (string)); - region.Length = 200; - - var customerType = model.Types[typeof (Customer)]; - var commentField = customerType.DefineField("ManagerSpecialComment", typeof (string)); - commentField.Length = 250; - - customerType.DefineField("OptionalAddress", typeof(Address)); - - var storeType = model.Types[typeof (Store)]; - storeType.DefineField("Address", typeof (Address)); - } - - private void DefineFullTextIndex(DomainModelDef model) - { - var customerType = model.Types[typeof (Customer)]; - var fieldsToDefineIndex = customerType.Fields - .Where(f => f.Name.In("FirstName", "LastName")) - .Select(f => new FullTextFieldDef(f.Name, true) {Configuration = "English"}); - var index = new FullTextIndexDef(customerType); - index.Fields.AddRange(fieldsToDefineIndex); - - model.FullTextIndexes.Add(index); - - var addressType = model.Types[typeof (Address)]; - fieldsToDefineIndex = addressType.Fields - .Where(f => f.Name.In("Country", "Region", "City", "Street")) - .Select(f => new FullTextFieldDef(f.Name, true) {Configuration = "English"}); - index = new FullTextIndexDef(addressType); - index.Fields.AddRange(fieldsToDefineIndex); - model.FullTextIndexes.Add(index); - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class DynamicallyDefinedFieldsAndIndexesTest : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.FullText); - } - - [Test] - public void FullTextIndexExistanceTest() - { - var customer = Domain.Model.Types[typeof (Customer)]; - var ftIndex = customer.FullTextIndex; - Assert.That(customer.FullTextIndex, Is.Not.Null); - Assert.That(ftIndex.Columns.Count, Is.EqualTo(10)); - - var store = Domain.Model.Types[typeof (Store)]; - ftIndex = store.FullTextIndex; - Assert.That(store.FullTextIndex, Is.Not.Null); - Assert.That(ftIndex.Columns.Count, Is.EqualTo(4)); - } - - [Test] - public void DynamicallyDefinedEntityIndexTest() - { - var customer = Domain.Model.Types[typeof (Customer)]; - var ftIndex = customer.FullTextIndex; - - var firstNameField = customer.Fields["FirstName"]; - Assert.That(ftIndex.Columns.Contains(firstNameField.Column.Name)); - - var lastNameField = customer.Fields["LastName"]; - Assert.IsTrue(ftIndex.Columns.Contains(lastNameField.Column.Name)); - } - - [Test] - public void DynamicallyDefinedStructureIndexTest() - { - var customer = Domain.Model.Types[typeof (Customer)]; - var ftIndex = customer.FullTextIndex; - - var addressField = customer.Fields["Address"]; - var indexedColumns = addressField.Fields - .Where(f => f.Name.In("Country", "Region", "City", "Street")) - .Select(f => f.Column); - Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); - } - - [Test] - public void DynamicallyDefinedBothEntityAndStrucureFieldsTest() - { - var customer = Domain.Model.Types[typeof (Customer)]; - var ftIndex = customer.FullTextIndex; - - var optionalAddressField = customer.Fields["OptionalAddress"]; - var indexedColumns = optionalAddressField.Fields - .Where(f => f.Name.In("Country", "Region", "City", "Street")) - .Select(f => f.Column); - Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); - - var store = Domain.Model.Types[typeof (Store)]; - ftIndex = store.FullTextIndex; - - var addressField = customer.Fields["Address"]; - indexedColumns = addressField.Fields - .Where(f => f.Name.In("Country", "Region", "City", "Street")) - .Select(f => f.Column); - Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2016.11.17 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Model.FullTextIndexOnDynamicallyDefinedFieldsTestModel; + +namespace Xtensive.Orm.Tests.Model.FullTextIndexOnDynamicallyDefinedFieldsTestModel +{ + [HierarchyRoot] + public class Store : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public string Name { get; set; } + + //Will be dynamically defined + //[Field] + //public Address Address { get; set; } + } + + [HierarchyRoot] + public class Customer : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + // index will be added dynamically + //[FullText("English")] + public string FirstName { get; set; } + + [Field] + // index will be added dynamically + //[FullText("English")] + public string LastName { get; set; } + + [Field] + public DateTime DateOfBirth { get; set; } + + //Field will be added dynamically + // and added to FullText + //[Field] + //public string ManagerSpecialComment { get; set; } + + [Field] + public Address Address { get; set; } + + //Field will be added dynamically + // and added to FullText + //[Field] + //public Address OptionalAddress { get; set; } + } + + public class Address : Structure + { + [Field] + public string City { get; set; } + + [Field] + public string Country { get; set; } + + // Will be defided dynamically + // also will be included to FT index + //[Field] + //public string Region { get; set; } + + [Field] + public string Street { get; set; } + + [Field] + public string BuildingNumber { get; set; } + } + + public class Module : IModule + { + public void OnBuilt(Domain domain) + { + } + + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + DefineDynamicFields(model); + DefineFullTextIndex(model); + } + + private void DefineDynamicFields(DomainModelDef model) + { + var addressType = model.Types[typeof (Address)]; + var region = addressType.DefineField("Region", typeof (string)); + region.Length = 200; + + var customerType = model.Types[typeof (Customer)]; + var commentField = customerType.DefineField("ManagerSpecialComment", typeof (string)); + commentField.Length = 250; + + customerType.DefineField("OptionalAddress", typeof(Address)); + + var storeType = model.Types[typeof (Store)]; + storeType.DefineField("Address", typeof (Address)); + } + + private void DefineFullTextIndex(DomainModelDef model) + { + var customerType = model.Types[typeof (Customer)]; + var fieldsToDefineIndex = customerType.Fields + .Where(f => f.Name.In("FirstName", "LastName")) + .Select(f => new FullTextFieldDef(f.Name, true) {Configuration = "English"}); + var index = new FullTextIndexDef(customerType); + index.Fields.AddRange(fieldsToDefineIndex); + + model.FullTextIndexes.Add(index); + + var addressType = model.Types[typeof (Address)]; + fieldsToDefineIndex = addressType.Fields + .Where(f => f.Name.In("Country", "Region", "City", "Street")) + .Select(f => new FullTextFieldDef(f.Name, true) {Configuration = "English"}); + index = new FullTextIndexDef(addressType); + index.Fields.AddRange(fieldsToDefineIndex); + model.FullTextIndexes.Add(index); + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class DynamicallyDefinedFieldsAndIndexesTest : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.FullText); + } + + [Test] + public void FullTextIndexExistanceTest() + { + var customer = Domain.Model.Types[typeof (Customer)]; + var ftIndex = customer.FullTextIndex; + Assert.That(customer.FullTextIndex, Is.Not.Null); + Assert.That(ftIndex.Columns.Count, Is.EqualTo(10)); + + var store = Domain.Model.Types[typeof (Store)]; + ftIndex = store.FullTextIndex; + Assert.That(store.FullTextIndex, Is.Not.Null); + Assert.That(ftIndex.Columns.Count, Is.EqualTo(4)); + } + + [Test] + public void DynamicallyDefinedEntityIndexTest() + { + var customer = Domain.Model.Types[typeof (Customer)]; + var ftIndex = customer.FullTextIndex; + + var firstNameField = customer.Fields["FirstName"]; + Assert.That(ftIndex.Columns.Contains(firstNameField.Column.Name)); + + var lastNameField = customer.Fields["LastName"]; + Assert.IsTrue(ftIndex.Columns.Contains(lastNameField.Column.Name)); + } + + [Test] + public void DynamicallyDefinedStructureIndexTest() + { + var customer = Domain.Model.Types[typeof (Customer)]; + var ftIndex = customer.FullTextIndex; + + var addressField = customer.Fields["Address"]; + var indexedColumns = addressField.Fields + .Where(f => f.Name.In("Country", "Region", "City", "Street")) + .Select(f => f.Column); + Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); + } + + [Test] + public void DynamicallyDefinedBothEntityAndStrucureFieldsTest() + { + var customer = Domain.Model.Types[typeof (Customer)]; + var ftIndex = customer.FullTextIndex; + + var optionalAddressField = customer.Fields["OptionalAddress"]; + var indexedColumns = optionalAddressField.Fields + .Where(f => f.Name.In("Country", "Region", "City", "Street")) + .Select(f => f.Column); + Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); + + var store = Domain.Model.Types[typeof (Store)]; + ftIndex = store.FullTextIndex; + + var addressField = customer.Fields["Address"]; + indexedColumns = addressField.Fields + .Where(f => f.Name.In("Country", "Region", "City", "Street")) + .Select(f => f.Column); + Assert.IsTrue(indexedColumns.All(c => ftIndex.Columns.Contains(c.Name))); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldNamingTest.cs b/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldNamingTest.cs index b6eb3431f8..c898bd1276 100644 --- a/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldNamingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldNamingTest.cs @@ -1,198 +1,198 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2016.11.15 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldNamingTestModel; - -namespace Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldNamingTestModel -{ - [HierarchyRoot] - public class HierarchyWithFullTextIndex : BaseEntity - { - [Field] - [FieldMapping("structureFieldMapping")] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - - [Field, FullText("English")] - public string IndexedStringField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class ClassTableHierarchy : BaseEntity - { - [Field] - [FieldMapping("structureFieldMapping")] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class ConcreteTableHierarchy : BaseEntity - { - [Field] - [FieldMapping("structureFieldMapping")] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class SingleTableHierarchy : BaseEntity - { - [Field] - [FieldMapping("structureFieldMapping")] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - public class StructureWithIndexedField : Structure - { - [Field, FullText("English")] - [FieldMapping("IndexedStringFieldMapping")] - public string IndexedStringField { get; set; } - - [Field, FullText("English")] - [FieldMapping("IndexedStringFieldMapping2")] - public string IndexedStringField1 { get; set; } - - [Field, FullText("English")] - public string IndexedStringField2 { get; set; } - - [Field] - public string UnindexedStringField { get; set; } - } - - public class AnotherStructure : Structure - { - [Field, FullText("English")] - [FieldMapping("AnotherStructureFieldMapping")] - public string StringField { get; set; } - - [Field, FullText("German")] - public string StringField1 { get; set; } - - [Field, FullText("German")] - [FieldMapping("AnotherStructureFieldMapping1")] - public string StringField2 { get; set; } - } - - public class BaseEntity : Entity - { - [Key, Field] - public long Id { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class IndexOnStructureFieldNamingTest : AutoBuildTest - { - private static readonly List UnderscoreRuleExpectedColumns = new List { - "structureFieldMapping_IndexedStringFieldMapping", - "structureFieldMapping_IndexedStringFieldMapping2", - "StructureWithIndexedField2_IndexedStringFieldMapping", - "StructureWithIndexedField2_IndexedStringFieldMapping2", - "StructureWithAnotherIndexedField_AnotherStructureFieldMapping", - "StructureWithAnotherIndexedField_StringField1", - "StructureWithAnotherIndexedField_AnotherStructureFieldMapping1" - }; - - [Test] - public void FullTextIndexPresenceTest() - { - Assert.That(Domain.Model.FullTextIndexes.Count(), Is.EqualTo(4)); - } - - [Test] - public void HierarchyWithFullTextIndexTest() - { - var hierarchy = Domain.Model.Types[typeof (HierarchyWithFullTextIndex)]; - var hierarchyTableColumnNames = hierarchy.Columns.Select(c => c.Name).ToList(); - var hierarchyIndexColumnNames = hierarchy.FullTextIndex.Columns.Select(c => c.Name).ToList(); - Assert.IsTrue(hierarchy.FullTextIndex.Columns.Count==10); - Assert.IsTrue(hierarchyTableColumnNames.ContainsAll(hierarchyIndexColumnNames)); - } - - [Test] - public void ClassTableIndexUnderscoreDotsRuleTest() - { - var classTable = Domain.Model.Types[typeof (ClassTableHierarchy)]; - var classTableColumnNames = classTable.Columns.Select(c => c.Name).ToList(); - var classtableIndexColumnNames = classTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); - Assert.IsTrue(classTable.FullTextIndex.Columns.Count==9); - Assert.IsTrue(classTableColumnNames.ContainsAll(classtableIndexColumnNames)); - foreach (var columnName in UnderscoreRuleExpectedColumns) { - Assert.IsTrue(classtableIndexColumnNames.Contains(columnName)); - } - } - - [Test] - public void ConcreteTableIndexUnderscoreDotsRuleTest() - { - var concreteTable = Domain.Model.Types[typeof (ConcreteTableHierarchy)]; - var concreteTableColumnNames = concreteTable.Columns.Select(c => c.Name).ToList(); - var concreteTableIndexColumnNames = concreteTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); - Assert.IsTrue(concreteTable.FullTextIndex.Columns.Count==9); - Assert.IsTrue(concreteTableColumnNames.ContainsAll(concreteTableIndexColumnNames)); - foreach (var columnName in UnderscoreRuleExpectedColumns) { - Assert.IsTrue(concreteTableIndexColumnNames.Contains(columnName)); - } - } - - [Test] - public void SingleTableUnderscoreDotsRuleTest() - { - var singleTable = Domain.Model.Types[typeof (SingleTableHierarchy)]; - var singleTableColumnNames = singleTable.Columns.Select(c => c.Name).ToList().ToList(); - var singleTableIndexColumnNames = singleTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); - Assert.IsTrue(singleTable.FullTextIndex.Columns.Count==9); - Assert.IsTrue(singleTableColumnNames.ContainsAll(singleTableIndexColumnNames)); - foreach (var columnName in UnderscoreRuleExpectedColumns) { - Assert.IsTrue(singleTableIndexColumnNames.Contains(columnName)); - } - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.FullText); - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (ClassTableHierarchy).Assembly, typeof (ClassTableHierarchy).Namespace); - config.NamingConvention.NamingRules = NamingRules.UnderscoreDots; - config.UpgradeMode = DomainUpgradeMode.Recreate; - return config; - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2016.11.15 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldNamingTestModel; + +namespace Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldNamingTestModel +{ + [HierarchyRoot] + public class HierarchyWithFullTextIndex : BaseEntity + { + [Field] + [FieldMapping("structureFieldMapping")] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + + [Field, FullText("English")] + public string IndexedStringField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class ClassTableHierarchy : BaseEntity + { + [Field] + [FieldMapping("structureFieldMapping")] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class ConcreteTableHierarchy : BaseEntity + { + [Field] + [FieldMapping("structureFieldMapping")] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class SingleTableHierarchy : BaseEntity + { + [Field] + [FieldMapping("structureFieldMapping")] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + public class StructureWithIndexedField : Structure + { + [Field, FullText("English")] + [FieldMapping("IndexedStringFieldMapping")] + public string IndexedStringField { get; set; } + + [Field, FullText("English")] + [FieldMapping("IndexedStringFieldMapping2")] + public string IndexedStringField1 { get; set; } + + [Field, FullText("English")] + public string IndexedStringField2 { get; set; } + + [Field] + public string UnindexedStringField { get; set; } + } + + public class AnotherStructure : Structure + { + [Field, FullText("English")] + [FieldMapping("AnotherStructureFieldMapping")] + public string StringField { get; set; } + + [Field, FullText("German")] + public string StringField1 { get; set; } + + [Field, FullText("German")] + [FieldMapping("AnotherStructureFieldMapping1")] + public string StringField2 { get; set; } + } + + public class BaseEntity : Entity + { + [Key, Field] + public long Id { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class IndexOnStructureFieldNamingTest : AutoBuildTest + { + private static readonly List UnderscoreRuleExpectedColumns = new List { + "structureFieldMapping_IndexedStringFieldMapping", + "structureFieldMapping_IndexedStringFieldMapping2", + "StructureWithIndexedField2_IndexedStringFieldMapping", + "StructureWithIndexedField2_IndexedStringFieldMapping2", + "StructureWithAnotherIndexedField_AnotherStructureFieldMapping", + "StructureWithAnotherIndexedField_StringField1", + "StructureWithAnotherIndexedField_AnotherStructureFieldMapping1" + }; + + [Test] + public void FullTextIndexPresenceTest() + { + Assert.That(Domain.Model.FullTextIndexes.Count(), Is.EqualTo(4)); + } + + [Test] + public void HierarchyWithFullTextIndexTest() + { + var hierarchy = Domain.Model.Types[typeof (HierarchyWithFullTextIndex)]; + var hierarchyTableColumnNames = hierarchy.Columns.Select(c => c.Name).ToList(); + var hierarchyIndexColumnNames = hierarchy.FullTextIndex.Columns.Select(c => c.Name).ToList(); + Assert.IsTrue(hierarchy.FullTextIndex.Columns.Count==10); + Assert.IsTrue(hierarchyTableColumnNames.ContainsAll(hierarchyIndexColumnNames)); + } + + [Test] + public void ClassTableIndexUnderscoreDotsRuleTest() + { + var classTable = Domain.Model.Types[typeof (ClassTableHierarchy)]; + var classTableColumnNames = classTable.Columns.Select(c => c.Name).ToList(); + var classtableIndexColumnNames = classTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); + Assert.IsTrue(classTable.FullTextIndex.Columns.Count==9); + Assert.IsTrue(classTableColumnNames.ContainsAll(classtableIndexColumnNames)); + foreach (var columnName in UnderscoreRuleExpectedColumns) { + Assert.IsTrue(classtableIndexColumnNames.Contains(columnName)); + } + } + + [Test] + public void ConcreteTableIndexUnderscoreDotsRuleTest() + { + var concreteTable = Domain.Model.Types[typeof (ConcreteTableHierarchy)]; + var concreteTableColumnNames = concreteTable.Columns.Select(c => c.Name).ToList(); + var concreteTableIndexColumnNames = concreteTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); + Assert.IsTrue(concreteTable.FullTextIndex.Columns.Count==9); + Assert.IsTrue(concreteTableColumnNames.ContainsAll(concreteTableIndexColumnNames)); + foreach (var columnName in UnderscoreRuleExpectedColumns) { + Assert.IsTrue(concreteTableIndexColumnNames.Contains(columnName)); + } + } + + [Test] + public void SingleTableUnderscoreDotsRuleTest() + { + var singleTable = Domain.Model.Types[typeof (SingleTableHierarchy)]; + var singleTableColumnNames = singleTable.Columns.Select(c => c.Name).ToList().ToList(); + var singleTableIndexColumnNames = singleTable.FullTextIndex.Columns.Select(c => c.Name).ToList(); + Assert.IsTrue(singleTable.FullTextIndex.Columns.Count==9); + Assert.IsTrue(singleTableColumnNames.ContainsAll(singleTableIndexColumnNames)); + foreach (var columnName in UnderscoreRuleExpectedColumns) { + Assert.IsTrue(singleTableIndexColumnNames.Contains(columnName)); + } + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.FullText); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (ClassTableHierarchy).Assembly, typeof (ClassTableHierarchy).Namespace); + config.NamingConvention.NamingRules = NamingRules.UnderscoreDots; + config.UpgradeMode = DomainUpgradeMode.Recreate; + return config; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldTest.cs b/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldTest.cs index 5caad4e0f7..2f8292abb2 100644 --- a/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/FullText/IndexOnStructureFieldTest.cs @@ -1,176 +1,176 @@ -// Copyright (C) 2003-2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2016.11.15 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldTestModel; - -namespace Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldTestModel -{ - [HierarchyRoot] - public class HierarchyWithFullTextIndex : BaseEntity - { - [Field] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - - [Field, FullText("English")] - public string IndexedStringField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class ClassTableHierarchy : BaseEntity - { - [Field] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class ConcreteTableHierarchy : BaseEntity - { - [Field] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class SingleTableHierarchy : BaseEntity - { - [Field] - public StructureWithIndexedField StructureWithIndexedField1 { get; set; } - - [Field] - public StructureWithIndexedField StructureWithIndexedField2 { get; set; } - - [Field] - public AnotherStructure StructureWithAnotherIndexedField { get; set; } - } - - public class StructureWithIndexedField : Structure - { - [Field, FullText("English")] - public string IndexedStringField { get; set; } - - [Field, FullText("English")] - public string IndexedStringField1 { get; set; } - - [Field, FullText("English")] - public string IndexedStringField2 { get; set; } - - [Field] - public string UnindexedStringField { get; set; } - } - - public class AnotherStructure : Structure - { - [Field, FullText("English")] - public string StringField { get; set; } - - [Field, FullText("German")] - public string StringField1 { get; set; } - - [Field, FullText("German")] - public string StringField2 { get; set; } - } - - public class BaseEntity : Entity - { - [Key, Field] - public long Id { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class IndexOnStructureFieldTest : AutoBuildTest - { - [Test] - public void FullTextIndexPresenceTest() - { - Assert.That(Domain.Model.FullTextIndexes.Count(), Is.EqualTo(4)); - } - - [Test] - public void HierarchyWithFullTextIndexTest() - { - var hierarchy = Domain.Model.Types[typeof (HierarchyWithFullTextIndex)]; - foreach (var column in hierarchy.FullTextIndex.Columns) { - FieldInfo correspondingField; - hierarchy.Fields.TryGetValue(column.Name, out correspondingField); - Assert.IsNotNull(correspondingField); - Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); - } - } - - [Test] - public void ClassTableFullTextIndexTest() - { - var simpleClassTable = Domain.Model.Types[typeof (ClassTableHierarchy)]; - foreach (var column in simpleClassTable.FullTextIndex.Columns) { - FieldInfo correspondingField; - simpleClassTable.Fields.TryGetValue(column.Name, out correspondingField); - Assert.IsNotNull(correspondingField); - Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); - } - } - - [Test] - public void ConcreteTableFullTextIndexTest() - { - var simpleConcreteTable = Domain.Model.Types[typeof (ConcreteTableHierarchy)]; - foreach (var column in simpleConcreteTable.FullTextIndex.Columns) { - FieldInfo correspondingField; - simpleConcreteTable.Fields.TryGetValue(column.Name, out correspondingField); - Assert.IsNotNull(correspondingField); - Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); - } - } - - [Test] - public void SingleTableFullTextIndexTest() - { - var simpleSingleTable = Domain.Model.Types[typeof (SingleTableHierarchy)]; - foreach (var column in simpleSingleTable.FullTextIndex.Columns) { - FieldInfo correspondingField; - simpleSingleTable.Fields.TryGetValue(column.Name, out correspondingField); - Assert.IsNotNull(correspondingField); - Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); - } - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.FullText); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ClassTableHierarchy).Assembly, typeof (ClassTableHierarchy).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - } -} +// Copyright (C) 2003-2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2016.11.15 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldTestModel; + +namespace Xtensive.Orm.Tests.Model.FullTextIndexOnStructureFieldTestModel +{ + [HierarchyRoot] + public class HierarchyWithFullTextIndex : BaseEntity + { + [Field] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + + [Field, FullText("English")] + public string IndexedStringField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class ClassTableHierarchy : BaseEntity + { + [Field] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class ConcreteTableHierarchy : BaseEntity + { + [Field] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class SingleTableHierarchy : BaseEntity + { + [Field] + public StructureWithIndexedField StructureWithIndexedField1 { get; set; } + + [Field] + public StructureWithIndexedField StructureWithIndexedField2 { get; set; } + + [Field] + public AnotherStructure StructureWithAnotherIndexedField { get; set; } + } + + public class StructureWithIndexedField : Structure + { + [Field, FullText("English")] + public string IndexedStringField { get; set; } + + [Field, FullText("English")] + public string IndexedStringField1 { get; set; } + + [Field, FullText("English")] + public string IndexedStringField2 { get; set; } + + [Field] + public string UnindexedStringField { get; set; } + } + + public class AnotherStructure : Structure + { + [Field, FullText("English")] + public string StringField { get; set; } + + [Field, FullText("German")] + public string StringField1 { get; set; } + + [Field, FullText("German")] + public string StringField2 { get; set; } + } + + public class BaseEntity : Entity + { + [Key, Field] + public long Id { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class IndexOnStructureFieldTest : AutoBuildTest + { + [Test] + public void FullTextIndexPresenceTest() + { + Assert.That(Domain.Model.FullTextIndexes.Count(), Is.EqualTo(4)); + } + + [Test] + public void HierarchyWithFullTextIndexTest() + { + var hierarchy = Domain.Model.Types[typeof (HierarchyWithFullTextIndex)]; + foreach (var column in hierarchy.FullTextIndex.Columns) { + FieldInfo correspondingField; + hierarchy.Fields.TryGetValue(column.Name, out correspondingField); + Assert.IsNotNull(correspondingField); + Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); + } + } + + [Test] + public void ClassTableFullTextIndexTest() + { + var simpleClassTable = Domain.Model.Types[typeof (ClassTableHierarchy)]; + foreach (var column in simpleClassTable.FullTextIndex.Columns) { + FieldInfo correspondingField; + simpleClassTable.Fields.TryGetValue(column.Name, out correspondingField); + Assert.IsNotNull(correspondingField); + Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); + } + } + + [Test] + public void ConcreteTableFullTextIndexTest() + { + var simpleConcreteTable = Domain.Model.Types[typeof (ConcreteTableHierarchy)]; + foreach (var column in simpleConcreteTable.FullTextIndex.Columns) { + FieldInfo correspondingField; + simpleConcreteTable.Fields.TryGetValue(column.Name, out correspondingField); + Assert.IsNotNull(correspondingField); + Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); + } + } + + [Test] + public void SingleTableFullTextIndexTest() + { + var simpleSingleTable = Domain.Model.Types[typeof (SingleTableHierarchy)]; + foreach (var column in simpleSingleTable.FullTextIndex.Columns) { + FieldInfo correspondingField; + simpleSingleTable.Fields.TryGetValue(column.Name, out correspondingField); + Assert.IsNotNull(correspondingField); + Assert.IsTrue(correspondingField.Columns.Contains(column.Name)); + } + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.FullText); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (ClassTableHierarchy).Assembly, typeof (ClassTableHierarchy).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Model/GenericManyToManyTest.cs b/Orm/Xtensive.Orm.Tests/Model/GenericManyToManyTest.cs index 5ce3a9e036..fc5677d0c1 100644 --- a/Orm/Xtensive.Orm.Tests/Model/GenericManyToManyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/GenericManyToManyTest.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.03.03 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Model -{ - [HierarchyRoot] - public class Source : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public TTag1 Tag1 { get; set; } - - [Field] - public TTag1 Tag2 { get; set; } - - [Field, Association(PairTo = "Sources")] - public EntitySet> Targets { get; private set; } - } - - [HierarchyRoot] - public class Target : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public TTag1 Tag1 { get; set; } - - [Field] - public TTag2 Tag2 { get; set; } - - [Field] - public EntitySet> Sources { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class GenericManyToManyTest : AutoBuildTest - { - - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Target)); - configuration.Types.Register(typeof (Source)); - return configuration; - } - - [Test] - public void CombinedTest() - { - - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.03.03 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Model +{ + [HierarchyRoot] + public class Source : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public TTag1 Tag1 { get; set; } + + [Field] + public TTag1 Tag2 { get; set; } + + [Field, Association(PairTo = "Sources")] + public EntitySet> Targets { get; private set; } + } + + [HierarchyRoot] + public class Target : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public TTag1 Tag1 { get; set; } + + [Field] + public TTag2 Tag2 { get; set; } + + [Field] + public EntitySet> Sources { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class GenericManyToManyTest : AutoBuildTest + { + + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Target)); + configuration.Types.Register(typeof (Source)); + return configuration; + } + + [Test] + public void CombinedTest() + { + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/HierarchyTest.cs b/Orm/Xtensive.Orm.Tests/Model/HierarchyTest.cs index 9d04d65dc6..2347edf955 100644 --- a/Orm/Xtensive.Orm.Tests/Model/HierarchyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/HierarchyTest.cs @@ -1,192 +1,192 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2007.12.26 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.Hierarchies; -using Xtensive.Orm.Upgrade; - -namespace Xtensive.Orm.Tests.Model.Hierarchies -{ - public interface I0 : IEntity - { - [Field] - string AName { get; set; } - } - - public interface IA : I0 - { - } - - [Serializable] - public class A : Entity, IA - { - string I0.AName { get; set; } - - [Field] - public string AName { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class AB : A - { - [Field, Key] - public long ID { get; private set; } - - [Field] - public string ABName { get; set; } - } - - [Serializable] - public class ABC : AB - { - } - - [Serializable] - public abstract class B : Entity - { - } - - [Serializable] - [HierarchyRoot] - public class BC : B - { - [Field, Key] - public Guid ID { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class BD : B - { - [Field, FieldMapping("ID"), Key] - public long ID { get; private set; } - - [Field] - public string AName { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class BE : B - { - [Field, FieldMapping("ID"), Key] - public int ID { get; private set; } - } - - [Serializable] - public class IdentifiableEntity : Entity - { - [Field, Key] - public Guid Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class MyEntity : IdentifiableEntity - { - [Field] - public string Name { get; set; } - } - - public class CustomStorageDefinitionBuilder : IModule - { - public static bool IsEnabled; - - public virtual void OnBuilt(Domain domain) - { - } - - public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - - TypeDef type; - type = model.Types[typeof (A)]; - Assert.IsFalse(context.ModelDef.FindRoot(type)==type); - - type = model.Types[typeof (AB)]; - Assert.IsTrue(context.ModelDef.FindRoot(type)==type); - - type = model.Types[typeof (ABC)]; - Assert.IsFalse(context.ModelDef.FindRoot(type)==type); - - type = model.Types[typeof (B)]; - Assert.IsFalse(context.ModelDef.FindRoot(type)==type); - - type = model.Types[typeof (BC)]; - Assert.IsTrue(context.ModelDef.FindRoot(type)==type); - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class HierarchyTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (A).Assembly, typeof(A).Namespace); - return config; - } - - public override void TestFixtureSetUp() - { - try { - CustomStorageDefinitionBuilder.IsEnabled = true; - base.TestFixtureSetUp(); - } - finally { - CustomStorageDefinitionBuilder.IsEnabled = false; - } - } - - public override void TestFixtureTearDown() - { - CustomStorageDefinitionBuilder.IsEnabled = false; - base.TestFixtureTearDown(); - } - - [Test] - public void MainTest() - { - Assert.IsFalse(Domain.Model.Types.Contains(typeof (A))); - Assert.IsNotNull(Domain.Model.Types[typeof (AB)]); - Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["ID"]); - Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["ABName"]); - Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["AName"]); - Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Fields["ABName"].DeclaringType); - Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Fields["AName"].DeclaringType); - Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Hierarchy.Root); - Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (ABC)].Hierarchy.Root); - Assert.AreEqual(Domain.Model.Types[typeof (AB)].Hierarchy, Domain.Model.Types[typeof (ABC)].Hierarchy); - Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (AB)].Fields["ID"].ValueType); - Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (ABC)].Fields["ID"].ValueType); - Assert.AreEqual(typeof (Guid), Domain.Model.Types[typeof (BC)].Fields["ID"].ValueType); - Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (BD)].Fields["ID"].ValueType); - Assert.AreEqual(typeof (int), Domain.Model.Types[typeof (BE)].Fields["ID"].ValueType); - } - - [Test] - public void AnotherTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var m = new MyEntity(); - m.Name = "Name"; - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2007.12.26 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.Hierarchies; +using Xtensive.Orm.Upgrade; + +namespace Xtensive.Orm.Tests.Model.Hierarchies +{ + public interface I0 : IEntity + { + [Field] + string AName { get; set; } + } + + public interface IA : I0 + { + } + + [Serializable] + public class A : Entity, IA + { + string I0.AName { get; set; } + + [Field] + public string AName { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class AB : A + { + [Field, Key] + public long ID { get; private set; } + + [Field] + public string ABName { get; set; } + } + + [Serializable] + public class ABC : AB + { + } + + [Serializable] + public abstract class B : Entity + { + } + + [Serializable] + [HierarchyRoot] + public class BC : B + { + [Field, Key] + public Guid ID { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class BD : B + { + [Field, FieldMapping("ID"), Key] + public long ID { get; private set; } + + [Field] + public string AName { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class BE : B + { + [Field, FieldMapping("ID"), Key] + public int ID { get; private set; } + } + + [Serializable] + public class IdentifiableEntity : Entity + { + [Field, Key] + public Guid Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class MyEntity : IdentifiableEntity + { + [Field] + public string Name { get; set; } + } + + public class CustomStorageDefinitionBuilder : IModule + { + public static bool IsEnabled; + + public virtual void OnBuilt(Domain domain) + { + } + + public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + + TypeDef type; + type = model.Types[typeof (A)]; + Assert.IsFalse(context.ModelDef.FindRoot(type)==type); + + type = model.Types[typeof (AB)]; + Assert.IsTrue(context.ModelDef.FindRoot(type)==type); + + type = model.Types[typeof (ABC)]; + Assert.IsFalse(context.ModelDef.FindRoot(type)==type); + + type = model.Types[typeof (B)]; + Assert.IsFalse(context.ModelDef.FindRoot(type)==type); + + type = model.Types[typeof (BC)]; + Assert.IsTrue(context.ModelDef.FindRoot(type)==type); + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class HierarchyTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (A).Assembly, typeof(A).Namespace); + return config; + } + + public override void TestFixtureSetUp() + { + try { + CustomStorageDefinitionBuilder.IsEnabled = true; + base.TestFixtureSetUp(); + } + finally { + CustomStorageDefinitionBuilder.IsEnabled = false; + } + } + + public override void TestFixtureTearDown() + { + CustomStorageDefinitionBuilder.IsEnabled = false; + base.TestFixtureTearDown(); + } + + [Test] + public void MainTest() + { + Assert.IsFalse(Domain.Model.Types.Contains(typeof (A))); + Assert.IsNotNull(Domain.Model.Types[typeof (AB)]); + Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["ID"]); + Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["ABName"]); + Assert.IsNotNull(Domain.Model.Types[typeof (AB)].Fields["AName"]); + Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Fields["ABName"].DeclaringType); + Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Fields["AName"].DeclaringType); + Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (AB)].Hierarchy.Root); + Assert.AreEqual(Domain.Model.Types[typeof (AB)], Domain.Model.Types[typeof (ABC)].Hierarchy.Root); + Assert.AreEqual(Domain.Model.Types[typeof (AB)].Hierarchy, Domain.Model.Types[typeof (ABC)].Hierarchy); + Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (AB)].Fields["ID"].ValueType); + Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (ABC)].Fields["ID"].ValueType); + Assert.AreEqual(typeof (Guid), Domain.Model.Types[typeof (BC)].Fields["ID"].ValueType); + Assert.AreEqual(typeof (long), Domain.Model.Types[typeof (BD)].Fields["ID"].ValueType); + Assert.AreEqual(typeof (int), Domain.Model.Types[typeof (BE)].Fields["ID"].ValueType); + } + + [Test] + public void AnotherTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var m = new MyEntity(); + m.Name = "Name"; + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/IndexedStructureFieldTest.cs b/Orm/Xtensive.Orm.Tests/Model/IndexedStructureFieldTest.cs index 06901fac90..a5a7e2c6c3 100644 --- a/Orm/Xtensive.Orm.Tests/Model/IndexedStructureFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/IndexedStructureFieldTest.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.11 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.IndexedStructureFieldTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace IndexedStructureFieldTestModel - { - public interface IHierarchical : IEntity - { - [Field(Nullable = false)] - Hierarchy Hierarchy { get; } - } - - public interface IHierarchical1 : IHierarchical - { - } - - public interface IHierarchical2 : IHierarchical - { - } - - public class Hierarchy : Structure - { - [Field(Indexed = true, Length = 300)] - public string Name { get; set; } - } - - [HierarchyRoot] - public class Indexed1 : Entity, IHierarchical1 - { - [Key, Field] - public int Id { get; set; } - - public Hierarchy Hierarchy { get; set; } - } - - [HierarchyRoot] - public class Indexed2 : Entity, IHierarchical2 - { - [Key, Field] - public int Id { get; set; } - - public Hierarchy Hierarchy { get; set; } - } - } - - public class IndexedStructureFieldTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.NamingConvention.NamingRules = NamingRules.UnderscoreDots; - configuration.Types.Register(typeof (Hierarchy).Assembly, typeof (Hierarchy).Namespace); - return configuration; - } - - [Test] - public void Test() - { - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.11 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.IndexedStructureFieldTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace IndexedStructureFieldTestModel + { + public interface IHierarchical : IEntity + { + [Field(Nullable = false)] + Hierarchy Hierarchy { get; } + } + + public interface IHierarchical1 : IHierarchical + { + } + + public interface IHierarchical2 : IHierarchical + { + } + + public class Hierarchy : Structure + { + [Field(Indexed = true, Length = 300)] + public string Name { get; set; } + } + + [HierarchyRoot] + public class Indexed1 : Entity, IHierarchical1 + { + [Key, Field] + public int Id { get; set; } + + public Hierarchy Hierarchy { get; set; } + } + + [HierarchyRoot] + public class Indexed2 : Entity, IHierarchical2 + { + [Key, Field] + public int Id { get; set; } + + public Hierarchy Hierarchy { get; set; } + } + } + + public class IndexedStructureFieldTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.NamingConvention.NamingRules = NamingRules.UnderscoreDots; + configuration.Types.Register(typeof (Hierarchy).Assembly, typeof (Hierarchy).Namespace); + return configuration; + } + + [Test] + public void Test() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/InheritanceSchemaTest.cs b/Orm/Xtensive.Orm.Tests/Model/InheritanceSchemaTest.cs index aa4981191a..390e95bc26 100644 --- a/Orm/Xtensive.Orm.Tests/Model/InheritanceSchemaTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/InheritanceSchemaTest.cs @@ -1,220 +1,220 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2007.11.30 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Model.InheritanceSchemaModel; -using System.Linq; - -namespace Xtensive.Orm.Tests.Model.InheritanceSchemaModel -{ - [Index("Name")] - public interface IHasName : IEntity - { - [Field(Length = 1000)] - string Name { get; set; } - } - - [Index("Name")] - public interface IHasName2 : IEntity - { - [Field(Length = 1000)] - string Name { get; set; } - } - - [MaterializedView, TableMapping("Creatures")] - public interface ICreature : IHasName - { - } - - [HierarchyRoot] - public abstract class A : Entity - { - [Field, Key] - public long ID { get; private set; } - } - - [Index("Tag")] - public class B : A, IHasName, IHasName2 - { - public string Name { get; set; } - - [Field] - public int Tag { get; set; } - } - - [Index("Age")] - public class C : A - { - [Field, FieldMapping("MyAge")] - public int Age { get; set; } - } - - [Index("Tag")] - public class D : C, ICreature - { - public string Name { get; set; } - - [Field(Length = 1000)] - public virtual string Tag { get; set; } - } - - public class E : D - { - } - - public class F : A, ICreature, IHasName2 - { - string IHasName.Name - { - get { return Name; } - set { Name = value; } - } - - public string Name { get; set; } - } - - [HierarchyRoot] - public class X : Entity, IHasName - { - [Field, Key] - public long ID { get; private set; } - - public string Name { get; set; } - } - - public class Y : X - { - } - - public class Z : Y - { - } - - public abstract class DomainBuilderBase : IModule - { - protected abstract InheritanceSchema InheritanceSchema { get; } - - public void OnBuilt(Domain domain) - {} - - public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - foreach (HierarchyDef hierarchyDef in model.Hierarchies) - hierarchyDef.Schema = InheritanceSchema; - } - } - - public class SingleTableInheritanceBuilder : DomainBuilderBase - { - public static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - } - - protected override InheritanceSchema InheritanceSchema - { - get { return InheritanceSchema.SingleTable; } - } - } - - public class ConcreteTableInheritanceBuilder : DomainBuilderBase - { - public static bool IsEnabled; - - public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) - { - if (!IsEnabled) - return; - base.OnDefinitionsBuilt(context, model); - } - - protected override InheritanceSchema InheritanceSchema - { - get { return InheritanceSchema.ConcreteTable; } - } - } -} - -namespace Xtensive.Orm.Tests.Model.InheritanceSchemaTests -{ - public abstract class InheritanceSchemaTestBase : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var dc = base.BuildConfiguration(); - dc.Types.Register(typeof(A).Assembly, typeof(A).Namespace); - dc.UpgradeMode = DomainUpgradeMode.Recreate; - return dc; - } - - public override void TestFixtureTearDown() - { - ConcreteTableInheritanceBuilder.IsEnabled = false; - SingleTableInheritanceBuilder.IsEnabled = false; - base.TestFixtureTearDown(); - } - } - - public class ClassTableInheritanceTest : InheritanceSchemaTestBase - { - protected override DomainConfiguration BuildConfiguration() - { - var dc = base.BuildConfiguration(); - ConcreteTableInheritanceBuilder.IsEnabled = false; - SingleTableInheritanceBuilder.IsEnabled = false; - return dc; - } - - [Test] - public virtual void MainTest() - { - Domain.Model.Dump(); - } - } - - public class ConcreteTableInheritanceTest : InheritanceSchemaTestBase - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration configuration = base.BuildConfiguration(); - ConcreteTableInheritanceBuilder.IsEnabled = true; - SingleTableInheritanceBuilder.IsEnabled = false; - return configuration; - } - - [Test] - public virtual void MainTest() - { - Domain.Model.Dump(); - } - } - - public class SingleTableInheritanceTest : InheritanceSchemaTestBase - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration configuration = base.BuildConfiguration(); - ConcreteTableInheritanceBuilder.IsEnabled = false; - SingleTableInheritanceBuilder.IsEnabled = true; - return configuration; - } - - [Test] - public virtual void MainTest() - { - Domain.Model.Dump(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2007.11.30 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Model.InheritanceSchemaModel; +using System.Linq; + +namespace Xtensive.Orm.Tests.Model.InheritanceSchemaModel +{ + [Index("Name")] + public interface IHasName : IEntity + { + [Field(Length = 1000)] + string Name { get; set; } + } + + [Index("Name")] + public interface IHasName2 : IEntity + { + [Field(Length = 1000)] + string Name { get; set; } + } + + [MaterializedView, TableMapping("Creatures")] + public interface ICreature : IHasName + { + } + + [HierarchyRoot] + public abstract class A : Entity + { + [Field, Key] + public long ID { get; private set; } + } + + [Index("Tag")] + public class B : A, IHasName, IHasName2 + { + public string Name { get; set; } + + [Field] + public int Tag { get; set; } + } + + [Index("Age")] + public class C : A + { + [Field, FieldMapping("MyAge")] + public int Age { get; set; } + } + + [Index("Tag")] + public class D : C, ICreature + { + public string Name { get; set; } + + [Field(Length = 1000)] + public virtual string Tag { get; set; } + } + + public class E : D + { + } + + public class F : A, ICreature, IHasName2 + { + string IHasName.Name + { + get { return Name; } + set { Name = value; } + } + + public string Name { get; set; } + } + + [HierarchyRoot] + public class X : Entity, IHasName + { + [Field, Key] + public long ID { get; private set; } + + public string Name { get; set; } + } + + public class Y : X + { + } + + public class Z : Y + { + } + + public abstract class DomainBuilderBase : IModule + { + protected abstract InheritanceSchema InheritanceSchema { get; } + + public void OnBuilt(Domain domain) + {} + + public virtual void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + foreach (HierarchyDef hierarchyDef in model.Hierarchies) + hierarchyDef.Schema = InheritanceSchema; + } + } + + public class SingleTableInheritanceBuilder : DomainBuilderBase + { + public static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + } + + protected override InheritanceSchema InheritanceSchema + { + get { return InheritanceSchema.SingleTable; } + } + } + + public class ConcreteTableInheritanceBuilder : DomainBuilderBase + { + public static bool IsEnabled; + + public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model) + { + if (!IsEnabled) + return; + base.OnDefinitionsBuilt(context, model); + } + + protected override InheritanceSchema InheritanceSchema + { + get { return InheritanceSchema.ConcreteTable; } + } + } +} + +namespace Xtensive.Orm.Tests.Model.InheritanceSchemaTests +{ + public abstract class InheritanceSchemaTestBase : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var dc = base.BuildConfiguration(); + dc.Types.Register(typeof(A).Assembly, typeof(A).Namespace); + dc.UpgradeMode = DomainUpgradeMode.Recreate; + return dc; + } + + public override void TestFixtureTearDown() + { + ConcreteTableInheritanceBuilder.IsEnabled = false; + SingleTableInheritanceBuilder.IsEnabled = false; + base.TestFixtureTearDown(); + } + } + + public class ClassTableInheritanceTest : InheritanceSchemaTestBase + { + protected override DomainConfiguration BuildConfiguration() + { + var dc = base.BuildConfiguration(); + ConcreteTableInheritanceBuilder.IsEnabled = false; + SingleTableInheritanceBuilder.IsEnabled = false; + return dc; + } + + [Test] + public virtual void MainTest() + { + Domain.Model.Dump(); + } + } + + public class ConcreteTableInheritanceTest : InheritanceSchemaTestBase + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration configuration = base.BuildConfiguration(); + ConcreteTableInheritanceBuilder.IsEnabled = true; + SingleTableInheritanceBuilder.IsEnabled = false; + return configuration; + } + + [Test] + public virtual void MainTest() + { + Domain.Model.Dump(); + } + } + + public class SingleTableInheritanceTest : InheritanceSchemaTestBase + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration configuration = base.BuildConfiguration(); + ConcreteTableInheritanceBuilder.IsEnabled = false; + SingleTableInheritanceBuilder.IsEnabled = true; + return configuration; + } + + [Test] + public virtual void MainTest() + { + Domain.Model.Dump(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/InheritedKeyFieldTest.cs b/Orm/Xtensive.Orm.Tests/Model/InheritedKeyFieldTest.cs index 5d836ac264..02ddeb514d 100644 --- a/Orm/Xtensive.Orm.Tests/Model/InheritedKeyFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/InheritedKeyFieldTest.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.12 - -using System; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using InheritedKeyFieldModel; - -namespace InheritedKeyFieldModel -{ - [Serializable] - public class H0 : Entity - { - [Field] - public virtual int Id { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class H1 : H0 - { - [Key] - public override int Id - { - get - { - { return base.Id;} - } - } - } - - [Serializable] - [HierarchyRoot] - public class H2 : H0 - { - [Key] - public override int Id - { - get - { - return base.Id; - } - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class InheritedKeyFieldTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (H0).Assembly, typeof (H0).Namespace); - return config; - } - -// protected override Domain BuildDomain(DomainConfiguration configuration) -// { -// Domain domain = null; -// try { -// domain = Domain.Build(configuration); -// } -// catch (DomainBuilderException e) { -// Assert.AreEqual(1, e.Exceptions.Count); -// } -// return domain; -// } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.12 + +using System; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using InheritedKeyFieldModel; + +namespace InheritedKeyFieldModel +{ + [Serializable] + public class H0 : Entity + { + [Field] + public virtual int Id { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class H1 : H0 + { + [Key] + public override int Id + { + get + { + { return base.Id;} + } + } + } + + [Serializable] + [HierarchyRoot] + public class H2 : H0 + { + [Key] + public override int Id + { + get + { + return base.Id; + } + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class InheritedKeyFieldTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (H0).Assembly, typeof (H0).Namespace); + return config; + } + +// protected override Domain BuildDomain(DomainConfiguration configuration) +// { +// Domain domain = null; +// try { +// domain = Domain.Build(configuration); +// } +// catch (DomainBuilderException e) { +// Assert.AreEqual(1, e.Exceptions.Count); +// } +// return domain; +// } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.cs b/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.cs index 2564d39e04..4dce149db2 100644 --- a/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.cs +++ b/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.cs @@ -1,2856 +1,2856 @@ -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tests.Model.InterfaceAssociation -{ - namespace Model1 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model2 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model3 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model4 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model5 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model6 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model7 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model8 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model9 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model10 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Document Document { get; set; } - } - } - - namespace Model11 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model12 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Document Document { get; set; } - } - } - - namespace Model13 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model14 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model15 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model16 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model17 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model18 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model19 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model20 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model21 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model22 - { - public interface IDocument : IEntity - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Document Document { get; set; } - } - } - - namespace Model23 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public Document Document { get; set; } - } - } - - namespace Model24 - { - public interface IDocument : IEntity - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - Document Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Document Document { get; set; } - } - } - - namespace Model25 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model26 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model27 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model28 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model29 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model30 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model31 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model32 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model33 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model34 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - namespace Model35 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - public IDocument Document { get; set; } - } - } - - namespace Model36 - { - public interface IDocument : IEntity - where TItem : IItem - { - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - EntitySet Items { get; } - } - - public interface IItem : IEntity - { - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - IDocument Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument - { - [Field,Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public IDocument Document { get; set; } - } - } - - [TestFixture] - public class InterfaceAssociationTest - { - [Test] - public void CombinedTest01() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model1.Item).Assembly, typeof(Model1.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model1.Document(); - key = document.Key; - new Model1.Item() { Document = document }; - new Model1.Item() { Document = document }; - new Model1.Item() { Document = document }; - new Model1.Item() { Document = document }; - new Model1.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest02() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model2.Item).Assembly, typeof(Model2.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model2.Document(); - key = document.Key; - new Model2.Item() { Document = document }; - new Model2.Item() { Document = document }; - new Model2.Item() { Document = document }; - new Model2.Item() { Document = document }; - new Model2.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest03() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model3.Item).Assembly, typeof(Model3.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model3.Document(); - key = document.Key; - new Model3.Item() { Document = document }; - new Model3.Item() { Document = document }; - new Model3.Item() { Document = document }; - new Model3.Item() { Document = document }; - new Model3.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest04() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model4.Item).Assembly, typeof(Model4.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model4.Document(); - key = document.Key; - new Model4.Item() { Document = document }; - new Model4.Item() { Document = document }; - new Model4.Item() { Document = document }; - new Model4.Item() { Document = document }; - new Model4.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest05() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model5.Item).Assembly, typeof(Model5.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model5.Document(); - key = document.Key; - new Model5.Item() { Document = document }; - new Model5.Item() { Document = document }; - new Model5.Item() { Document = document }; - new Model5.Item() { Document = document }; - new Model5.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest06() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model6.Item).Assembly, typeof(Model6.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model6.Document(); - key = document.Key; - new Model6.Item() { Document = document }; - new Model6.Item() { Document = document }; - new Model6.Item() { Document = document }; - new Model6.Item() { Document = document }; - new Model6.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest07() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model7.Item).Assembly, typeof(Model7.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest08() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model8.Item).Assembly, typeof(Model8.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest09() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model9.Item).Assembly, typeof(Model9.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model9.Document(); - key = document.Key; - new Model9.Item() { Document = document }; - new Model9.Item() { Document = document }; - new Model9.Item() { Document = document }; - new Model9.Item() { Document = document }; - new Model9.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest10() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model10.Item).Assembly, typeof(Model10.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model10.Document(); - key = document.Key; - new Model10.Item() { Document = document }; - new Model10.Item() { Document = document }; - new Model10.Item() { Document = document }; - new Model10.Item() { Document = document }; - new Model10.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest11() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model11.Item).Assembly, typeof(Model11.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest12() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model12.Item).Assembly, typeof(Model12.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest13() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model13.Item).Assembly, typeof(Model13.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model13.Document(); - key = document.Key; - new Model13.Item() { Document = document }; - new Model13.Item() { Document = document }; - new Model13.Item() { Document = document }; - new Model13.Item() { Document = document }; - new Model13.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest14() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model14.Item).Assembly, typeof(Model14.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest15() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model15.Item).Assembly, typeof(Model15.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model15.Document(); - key = document.Key; - new Model15.Item() { Document = document }; - new Model15.Item() { Document = document }; - new Model15.Item() { Document = document }; - new Model15.Item() { Document = document }; - new Model15.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest16() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model16.Item).Assembly, typeof(Model16.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model16.Document(); - key = document.Key; - new Model16.Item() { Document = document }; - new Model16.Item() { Document = document }; - new Model16.Item() { Document = document }; - new Model16.Item() { Document = document }; - new Model16.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest17() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model17.Item).Assembly, typeof(Model17.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model17.Document(); - key = document.Key; - new Model17.Item() { Document = document }; - new Model17.Item() { Document = document }; - new Model17.Item() { Document = document }; - new Model17.Item() { Document = document }; - new Model17.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest18() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model18.Item).Assembly, typeof(Model18.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest19() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model19.Item).Assembly, typeof(Model19.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest20() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model20.Item).Assembly, typeof(Model20.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest21() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model21.Item).Assembly, typeof(Model21.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model21.Document(); - key = document.Key; - new Model21.Item() { Document = document }; - new Model21.Item() { Document = document }; - new Model21.Item() { Document = document }; - new Model21.Item() { Document = document }; - new Model21.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest22() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model22.Item).Assembly, typeof(Model22.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model22.Document(); - key = document.Key; - new Model22.Item() { Document = document }; - new Model22.Item() { Document = document }; - new Model22.Item() { Document = document }; - new Model22.Item() { Document = document }; - new Model22.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest23() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model23.Item).Assembly, typeof(Model23.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest24() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model24.Item).Assembly, typeof(Model24.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest25() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model25.Item).Assembly, typeof(Model25.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model25.Document(); - key = document.Key; - new Model25.Item() { Document = document }; - new Model25.Item() { Document = document }; - new Model25.Item() { Document = document }; - new Model25.Item() { Document = document }; - new Model25.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest26() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model26.Item).Assembly, typeof(Model26.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest27() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model27.Item).Assembly, typeof(Model27.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model27.Document(); - key = document.Key; - new Model27.Item() { Document = document }; - new Model27.Item() { Document = document }; - new Model27.Item() { Document = document }; - new Model27.Item() { Document = document }; - new Model27.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest28() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model28.Item).Assembly, typeof(Model28.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model28.Document(); - key = document.Key; - new Model28.Item() { Document = document }; - new Model28.Item() { Document = document }; - new Model28.Item() { Document = document }; - new Model28.Item() { Document = document }; - new Model28.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest29() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model29.Item).Assembly, typeof(Model29.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model29.Document(); - key = document.Key; - new Model29.Item() { Document = document }; - new Model29.Item() { Document = document }; - new Model29.Item() { Document = document }; - new Model29.Item() { Document = document }; - new Model29.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest30() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model30.Item).Assembly, typeof(Model30.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest31() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model31.Item).Assembly, typeof(Model31.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model31.Document(); - key = document.Key; - new Model31.Item() { Document = document }; - new Model31.Item() { Document = document }; - new Model31.Item() { Document = document }; - new Model31.Item() { Document = document }; - new Model31.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest32() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model32.Item).Assembly, typeof(Model32.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - [Test] - public void CombinedTest33() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model33.Item).Assembly, typeof(Model33.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model33.Document(); - key = document.Key; - new Model33.Item() { Document = document }; - new Model33.Item() { Document = document }; - new Model33.Item() { Document = document }; - new Model33.Item() { Document = document }; - new Model33.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest34() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model34.Item).Assembly, typeof(Model34.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model34.Document(); - key = document.Key; - new Model34.Item() { Document = document }; - new Model34.Item() { Document = document }; - new Model34.Item() { Document = document }; - new Model34.Item() { Document = document }; - new Model34.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest35() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model35.Item).Assembly, typeof(Model35.Item).Namespace); - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model35.Document(); - key = document.Key; - new Model35.Item() { Document = document }; - new Model35.Item() { Document = document }; - new Model35.Item() { Document = document }; - new Model35.Item() { Document = document }; - new Model35.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } - } - [Test] - public void CombinedTest36() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model36.Item).Assembly, typeof(Model36.Item).Namespace); - Assert.Throws(()=>Domain.Build(config)); - } - } +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tests.Model.InterfaceAssociation +{ + namespace Model1 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model2 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model3 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model4 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model5 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model6 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model7 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model8 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model9 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model10 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Document Document { get; set; } + } + } + + namespace Model11 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model12 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Document Document { get; set; } + } + } + + namespace Model13 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model14 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model15 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model16 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model17 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model18 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model19 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model20 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model21 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model22 + { + public interface IDocument : IEntity + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Document Document { get; set; } + } + } + + namespace Model23 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public Document Document { get; set; } + } + } + + namespace Model24 + { + public interface IDocument : IEntity + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + Document Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Document Document { get; set; } + } + } + + namespace Model25 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model26 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model27 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model28 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model29 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model30 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model31 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model32 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model33 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model34 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + namespace Model35 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + public IDocument Document { get; set; } + } + } + + namespace Model36 + { + public interface IDocument : IEntity + where TItem : IItem + { + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + EntitySet Items { get; } + } + + public interface IItem : IEntity + { + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + IDocument Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument + { + [Field,Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Items { get; private set; } + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public IDocument Document { get; set; } + } + } + + [TestFixture] + public class InterfaceAssociationTest + { + [Test] + public void CombinedTest01() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model1.Item).Assembly, typeof(Model1.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model1.Document(); + key = document.Key; + new Model1.Item() { Document = document }; + new Model1.Item() { Document = document }; + new Model1.Item() { Document = document }; + new Model1.Item() { Document = document }; + new Model1.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest02() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model2.Item).Assembly, typeof(Model2.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model2.Document(); + key = document.Key; + new Model2.Item() { Document = document }; + new Model2.Item() { Document = document }; + new Model2.Item() { Document = document }; + new Model2.Item() { Document = document }; + new Model2.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest03() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model3.Item).Assembly, typeof(Model3.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model3.Document(); + key = document.Key; + new Model3.Item() { Document = document }; + new Model3.Item() { Document = document }; + new Model3.Item() { Document = document }; + new Model3.Item() { Document = document }; + new Model3.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest04() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model4.Item).Assembly, typeof(Model4.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model4.Document(); + key = document.Key; + new Model4.Item() { Document = document }; + new Model4.Item() { Document = document }; + new Model4.Item() { Document = document }; + new Model4.Item() { Document = document }; + new Model4.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest05() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model5.Item).Assembly, typeof(Model5.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model5.Document(); + key = document.Key; + new Model5.Item() { Document = document }; + new Model5.Item() { Document = document }; + new Model5.Item() { Document = document }; + new Model5.Item() { Document = document }; + new Model5.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest06() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model6.Item).Assembly, typeof(Model6.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model6.Document(); + key = document.Key; + new Model6.Item() { Document = document }; + new Model6.Item() { Document = document }; + new Model6.Item() { Document = document }; + new Model6.Item() { Document = document }; + new Model6.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest07() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model7.Item).Assembly, typeof(Model7.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest08() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model8.Item).Assembly, typeof(Model8.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest09() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model9.Item).Assembly, typeof(Model9.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model9.Document(); + key = document.Key; + new Model9.Item() { Document = document }; + new Model9.Item() { Document = document }; + new Model9.Item() { Document = document }; + new Model9.Item() { Document = document }; + new Model9.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest10() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model10.Item).Assembly, typeof(Model10.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model10.Document(); + key = document.Key; + new Model10.Item() { Document = document }; + new Model10.Item() { Document = document }; + new Model10.Item() { Document = document }; + new Model10.Item() { Document = document }; + new Model10.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest11() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model11.Item).Assembly, typeof(Model11.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest12() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model12.Item).Assembly, typeof(Model12.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest13() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model13.Item).Assembly, typeof(Model13.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model13.Document(); + key = document.Key; + new Model13.Item() { Document = document }; + new Model13.Item() { Document = document }; + new Model13.Item() { Document = document }; + new Model13.Item() { Document = document }; + new Model13.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest14() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model14.Item).Assembly, typeof(Model14.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest15() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model15.Item).Assembly, typeof(Model15.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model15.Document(); + key = document.Key; + new Model15.Item() { Document = document }; + new Model15.Item() { Document = document }; + new Model15.Item() { Document = document }; + new Model15.Item() { Document = document }; + new Model15.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest16() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model16.Item).Assembly, typeof(Model16.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model16.Document(); + key = document.Key; + new Model16.Item() { Document = document }; + new Model16.Item() { Document = document }; + new Model16.Item() { Document = document }; + new Model16.Item() { Document = document }; + new Model16.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest17() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model17.Item).Assembly, typeof(Model17.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model17.Document(); + key = document.Key; + new Model17.Item() { Document = document }; + new Model17.Item() { Document = document }; + new Model17.Item() { Document = document }; + new Model17.Item() { Document = document }; + new Model17.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest18() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model18.Item).Assembly, typeof(Model18.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest19() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model19.Item).Assembly, typeof(Model19.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest20() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model20.Item).Assembly, typeof(Model20.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest21() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model21.Item).Assembly, typeof(Model21.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model21.Document(); + key = document.Key; + new Model21.Item() { Document = document }; + new Model21.Item() { Document = document }; + new Model21.Item() { Document = document }; + new Model21.Item() { Document = document }; + new Model21.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest22() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model22.Item).Assembly, typeof(Model22.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model22.Document(); + key = document.Key; + new Model22.Item() { Document = document }; + new Model22.Item() { Document = document }; + new Model22.Item() { Document = document }; + new Model22.Item() { Document = document }; + new Model22.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest23() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model23.Item).Assembly, typeof(Model23.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest24() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model24.Item).Assembly, typeof(Model24.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest25() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model25.Item).Assembly, typeof(Model25.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model25.Document(); + key = document.Key; + new Model25.Item() { Document = document }; + new Model25.Item() { Document = document }; + new Model25.Item() { Document = document }; + new Model25.Item() { Document = document }; + new Model25.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest26() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model26.Item).Assembly, typeof(Model26.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest27() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model27.Item).Assembly, typeof(Model27.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model27.Document(); + key = document.Key; + new Model27.Item() { Document = document }; + new Model27.Item() { Document = document }; + new Model27.Item() { Document = document }; + new Model27.Item() { Document = document }; + new Model27.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest28() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model28.Item).Assembly, typeof(Model28.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model28.Document(); + key = document.Key; + new Model28.Item() { Document = document }; + new Model28.Item() { Document = document }; + new Model28.Item() { Document = document }; + new Model28.Item() { Document = document }; + new Model28.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest29() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model29.Item).Assembly, typeof(Model29.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model29.Document(); + key = document.Key; + new Model29.Item() { Document = document }; + new Model29.Item() { Document = document }; + new Model29.Item() { Document = document }; + new Model29.Item() { Document = document }; + new Model29.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest30() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model30.Item).Assembly, typeof(Model30.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest31() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model31.Item).Assembly, typeof(Model31.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model31.Document(); + key = document.Key; + new Model31.Item() { Document = document }; + new Model31.Item() { Document = document }; + new Model31.Item() { Document = document }; + new Model31.Item() { Document = document }; + new Model31.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest32() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model32.Item).Assembly, typeof(Model32.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + [Test] + public void CombinedTest33() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model33.Item).Assembly, typeof(Model33.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model33.Document(); + key = document.Key; + new Model33.Item() { Document = document }; + new Model33.Item() { Document = document }; + new Model33.Item() { Document = document }; + new Model33.Item() { Document = document }; + new Model33.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest34() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model34.Item).Assembly, typeof(Model34.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model34.Document(); + key = document.Key; + new Model34.Item() { Document = document }; + new Model34.Item() { Document = document }; + new Model34.Item() { Document = document }; + new Model34.Item() { Document = document }; + new Model34.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest35() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model35.Item).Assembly, typeof(Model35.Item).Namespace); + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model35.Document(); + key = document.Key; + new Model35.Item() { Document = document }; + new Model35.Item() { Document = document }; + new Model35.Item() { Document = document }; + new Model35.Item() { Document = document }; + new Model35.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } + } + [Test] + public void CombinedTest36() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model36.Item).Assembly, typeof(Model36.Item).Namespace); + Assert.Throws(()=>Domain.Build(config)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.tt b/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.tt index 9a95c64bab..76adc9fa33 100644 --- a/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.tt +++ b/Orm/Xtensive.Orm.Tests/Model/InterfaceAssociationsModelGenerator.tt @@ -1,167 +1,167 @@ -<#@ template language="C#" #> -<#@ assembly name="System.Core.dll" #> -<#@ import namespace="System.Linq" #> -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; - -namespace Xtensive.Orm.Tests.Model.InterfaceAssociation -{ -<# -var shouldFail = new[] {7,8,11,12,14,18,19,20,23,24,26,30,32,36}; -int count = 0; -for(int i=0; i<3; i++) { -for(int j=0; j<2; j++) { -for(int k=0; k<3; k++) { -for(int l=0; l<2; l++) { -count++; -#> - namespace Model<#=count#> - { - public interface IDocument<# if (i == 2) {#><#}#> : IEntity -<# if (i == 2) {#> where TItem : IItem -<#}#> - { - [Field] -<# if (k == 0 || k == 2) {#> - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] -<#}#> -<# if (i == 0) {#> - EntitySet Items { get; }<#}#> -<# if (i == 1) {#> - EntitySet Items { get; }<#}#> -<# if (i == 2) {#> - EntitySet Items { get; }<#}#> - - } - - public interface IItem : IEntity - { - [Field] -<# if (l == 1 && (k == 0 || k == 2)) {#> - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] -<#}#> - <# if (j == 0 || i == 2) {#>I<#}#>Document<# if (i == 2) {#><#}#> Document { get; set; } - } - - [HierarchyRoot] - public class Document : Entity, IDocument<# if (i == 2) {#> -<#} else {#> - -<#}#> - { - [Field,Key] - public int Id { get; private set; } - [Field] -<# if (k == 1 || k == 2) {#> - [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] -<#}#> -<# if (i == 0) {#> - public EntitySet Items { get; private set; }<#}#> -<# if (i == 1) {#> - public EntitySet Items { get; private set; }<#}#> -<# if (i == 2) {#> - public EntitySet Items { get; private set; }<#}#> - - } - - [HierarchyRoot] - public class Item : Entity, IItem - { - [Field, Key] - public int Id { get; private set; } - [Field] -<# if (l == 1 && (k == 1 || k == 2)) {#> - [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] -<#}#> - public <# if (j == 0 || i == 2) {#>I<#}#>Document<# if (i == 2) {#><#}#> Document { get; set; } - } - } - -<#}}}}#> - [TestFixture] - public class InterfaceAssociationTest - { -<# -for(int i = 1; i <= count; i++){ -#> - [Test] - public void CombinedTest<#=string.Format("{0:00}",i)#>() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Model<#=i#>.Item).Assembly, typeof(Model<#=i#>.Item).Namespace); -<# -if (shouldFail.Contains(i)) { -#> - Assert.Throws(()=>Domain.Build(config)); -<# -} -else{ -#> - var domain = Domain.Build(config); - var key = (Key)null; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = new Model<#=i#>.Document(); - key = document.Key; - new Model<#=i#>.Item() { Document = document }; - new Model<#=i#>.Item() { Document = document }; - new Model<#=i#>.Item() { Document = document }; - new Model<#=i#>.Item() { Document = document }; - new Model<#=i#>.Item() { Document = document }; - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single.Document>(key); - var itemCount = 0; - Assert.AreEqual(5, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(5, itemCount); - - var some = document.Items.First(); - some.Document = null; - itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - t.Complete(); - } - - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var document = session.Query.Single.Document>(key); - var itemCount = 0; - Assert.AreEqual(4, document.Items.Count); - foreach (var item in document.Items) { - Assert.IsNotNull(item); - itemCount++; - } - Assert.AreEqual(4, itemCount); - - document.Remove(); - var items = session.Query.All.Item>().ToList(); - Assert.AreEqual(1, items.Count); - - t.Complete(); - } -<#}#> - } -<#}#> - } +<#@ template language="C#" #> +<#@ assembly name="System.Core.dll" #> +<#@ import namespace="System.Linq" #> +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; + +namespace Xtensive.Orm.Tests.Model.InterfaceAssociation +{ +<# +var shouldFail = new[] {7,8,11,12,14,18,19,20,23,24,26,30,32,36}; +int count = 0; +for(int i=0; i<3; i++) { +for(int j=0; j<2; j++) { +for(int k=0; k<3; k++) { +for(int l=0; l<2; l++) { +count++; +#> + namespace Model<#=count#> + { + public interface IDocument<# if (i == 2) {#><#}#> : IEntity +<# if (i == 2) {#> where TItem : IItem +<#}#> + { + [Field] +<# if (k == 0 || k == 2) {#> + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] +<#}#> +<# if (i == 0) {#> + EntitySet Items { get; }<#}#> +<# if (i == 1) {#> + EntitySet Items { get; }<#}#> +<# if (i == 2) {#> + EntitySet Items { get; }<#}#> + + } + + public interface IItem : IEntity + { + [Field] +<# if (l == 1 && (k == 0 || k == 2)) {#> + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] +<#}#> + <# if (j == 0 || i == 2) {#>I<#}#>Document<# if (i == 2) {#><#}#> Document { get; set; } + } + + [HierarchyRoot] + public class Document : Entity, IDocument<# if (i == 2) {#> +<#} else {#> + +<#}#> + { + [Field,Key] + public int Id { get; private set; } + [Field] +<# if (k == 1 || k == 2) {#> + [Association(PairTo = "Document", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] +<#}#> +<# if (i == 0) {#> + public EntitySet Items { get; private set; }<#}#> +<# if (i == 1) {#> + public EntitySet Items { get; private set; }<#}#> +<# if (i == 2) {#> + public EntitySet Items { get; private set; }<#}#> + + } + + [HierarchyRoot] + public class Item : Entity, IItem + { + [Field, Key] + public int Id { get; private set; } + [Field] +<# if (l == 1 && (k == 1 || k == 2)) {#> + [Association(PairTo = "Items", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] +<#}#> + public <# if (j == 0 || i == 2) {#>I<#}#>Document<# if (i == 2) {#><#}#> Document { get; set; } + } + } + +<#}}}}#> + [TestFixture] + public class InterfaceAssociationTest + { +<# +for(int i = 1; i <= count; i++){ +#> + [Test] + public void CombinedTest<#=string.Format("{0:00}",i)#>() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Model<#=i#>.Item).Assembly, typeof(Model<#=i#>.Item).Namespace); +<# +if (shouldFail.Contains(i)) { +#> + Assert.Throws(()=>Domain.Build(config)); +<# +} +else{ +#> + var domain = Domain.Build(config); + var key = (Key)null; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = new Model<#=i#>.Document(); + key = document.Key; + new Model<#=i#>.Item() { Document = document }; + new Model<#=i#>.Item() { Document = document }; + new Model<#=i#>.Item() { Document = document }; + new Model<#=i#>.Item() { Document = document }; + new Model<#=i#>.Item() { Document = document }; + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single.Document>(key); + var itemCount = 0; + Assert.AreEqual(5, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(5, itemCount); + + var some = document.Items.First(); + some.Document = null; + itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + t.Complete(); + } + + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var document = session.Query.Single.Document>(key); + var itemCount = 0; + Assert.AreEqual(4, document.Items.Count); + foreach (var item in document.Items) { + Assert.IsNotNull(item); + itemCount++; + } + Assert.AreEqual(4, itemCount); + + document.Remove(); + var items = session.Query.All.Item>().ToList(); + Assert.AreEqual(1, items.Count); + + t.Complete(); + } +<#}#> + } +<#}#> + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs b/Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs index 2d993eecfe..4125504892 100644 --- a/Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs @@ -1,739 +1,739 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2007.07.04 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Building; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Model.LibraryModel; -using FieldAttributes=Xtensive.Orm.Model.FieldAttributes; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.Tests.Model.LibraryModel -{ - [Serializable] - public class IdentityCard : Structure - { - [Field(Length = 64)] - public string FirstName { get; set; } - - [Field(Length = 64)] - public string SecondName { get; set; } - - [Field(Length = 64)] - public string LastName { get; set; } - } - - [Serializable] - public class Passport : Structure - { - [Field] - public int Number { get; set; } - - [Field] - public IdentityCard Card { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Field, FieldMapping("PassportNumber"), Key] - public int Number - { - get { return GetFieldValue("Number"); } - } - - [Field] - public Passport Passport - { - get { return GetFieldValue("Passport"); } - set - { - SetFieldValue("Passport", value); - } - } - - [Field, Association(PairTo = "Reviewer")] - public EntitySet Reviews { get; private set; } - } - - [Serializable] - [Index("PenName:DESC", Name = "IX_PENNAME")] - public class Author : Person - { - [Field(Length = 64)] - public string PenName { get; set; } - - [Field] - public EntitySet Books { get; private set; } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class Book : Entity - { - [Field(Length = 32), Key] - public string Isbn { get; private set; } - - [Field(Length = 128, Indexed = true)] - public string Title { get; set; } - - [Field, FieldMapping("BookAuthor")] - [Association(OnTargetRemove = OnRemoveAction.Deny)] - public Author Author { get; set; } - - public int Rating { get; set; } - - public Book(string isbn) - : base(isbn) - { - } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class BookReview : Entity - { - [Field, Association(OnTargetRemove = OnRemoveAction.Clear), Key(1)] - public Person Reviewer { get; private set; } - - [Field, FieldMapping("Book"), Association(OnTargetRemove = OnRemoveAction.Cascade), Key(0)] - public Book Book { get; private set; } - - [Field(Length = 4096)] - public string Text { get; set; } - - public BookReview(Book book, Person reviewer) - : base(book, reviewer) - { - } - } - - public class IsbnKeyGenerator : KeyGenerator - { - private int counter; - - public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) - { - } - - public override Tuple GenerateKey(KeyInfo keyInfo, Session session) - { - var result = Tuple.Create(counter.ToString()); - counter++; - return result; - } - } - - public class LibraryDomainBuilder : IModule - { - public static bool IsEnabled; - - private BuildingContext context; - - public void OnBuilt(Domain domain) - { - } - - private void VerifyTypeCollection() - { - var types = context.ModelDef.Types; - Assert.IsNull(types.FindAncestor(types[typeof (Entity)])); - Assert.IsNull(types.FindAncestor(types[typeof (IEntity)])); - Assert.IsNull(types.FindAncestor(types[typeof (Structure)])); - Assert.AreEqual(types.FindAncestor(types[typeof (Passport)]), types[typeof (Structure)]); - Assert.AreEqual(types.FindAncestor(types[typeof (IdentityCard)]), types[typeof (Structure)]); - Assert.AreEqual(types.FindAncestor(types[typeof (Person)]), types[typeof (Entity)]); - Assert.AreEqual(types.FindAncestor(types[typeof (Book)]), types[typeof (Entity)]); - Assert.AreEqual(types.FindAncestor(types[typeof (BookReview)]), types[typeof (Entity)]); - Assert.AreEqual(types.FindAncestor(types[typeof (Author)]), types[typeof (Person)]); - } - - private void RedefineTypes() - { - context.ModelDef.Types.Clear(); - context.ModelDef.DefineType(typeof (BookReview)); - context.ModelDef.DefineType(typeof (Book)); - context.ModelDef.DefineType(typeof (Person)); - context.ModelDef.DefineType(typeof (Author)); - context.ModelDef.DefineType(typeof (Structure)); - context.ModelDef.DefineType(typeof (Passport)); - context.ModelDef.DefineType(typeof (IdentityCard)); - context.ModelDef.DefineType(typeof (Entity)); - context.ModelDef.DefineType(typeof (IEntity)); - } - - private void RedefineFields() - { - var types = context.ModelDef.Types; - foreach (TypeDef type in types) { - type.Fields.Clear(); - type.Indexes.Clear(); - - var properties = - type.UnderlyingType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | - BindingFlags.DeclaredOnly); - for (int index = 0, count = properties.Length; index < count; index++) { - var attributes = properties[index].GetCustomAttributes(typeof (FieldAttribute), true); - if (attributes==null || attributes.Length==0) - continue; - if (!properties[index].Name.Contains(".")) - type.DefineField(properties[index]); - } - } - - types["Book"].Fields["Author"].OnTargetRemove = OnRemoveAction.Deny; - types["BookReview"].Fields["Book"].OnTargetRemove = OnRemoveAction.Cascade; - types["BookReview"].Fields["Reviewer"].OnTargetRemove = OnRemoveAction.Clear; - - - IndexDef indexDef; - - indexDef = types["Author"].DefineIndex("IX_PENNAME"); - indexDef.MappingName = "IX_PENNAME"; - indexDef.KeyFields.Add("PenName", Direction.Negative); - - indexDef = types["Book"].DefineIndex("IX_Title"); - indexDef.KeyFields.Add("Title"); - } - - private void RedefineIndexes() - { - } - - private void VerifyDefinition() - { - Assert.IsNotNull(context.ModelDef.Types[typeof (Entity)]); - Assert.IsNotNull(context.ModelDef.Types[typeof (IEntity)]); - - #region IdentityCard - - TypeDef typeDef = context.ModelDef.Types[typeof (IdentityCard)]; - Assert.IsNotNull(typeDef); - Assert.IsNotNull(typeDef.Fields["FirstName"]); - Assert.AreEqual("FirstName", typeDef.Fields["FirstName"].Name); - Assert.AreEqual(64, typeDef.Fields["FirstName"].Length); - Assert.IsNotNull(typeDef.Fields["SecondName"]); - Assert.AreEqual("SecondName", typeDef.Fields["SecondName"].Name); - Assert.AreEqual(64, typeDef.Fields["SecondName"].Length); - Assert.IsNotNull(typeDef.Fields["LastName"]); - Assert.AreEqual("LastName", typeDef.Fields["LastName"].Name); - Assert.AreEqual(64, typeDef.Fields["LastName"].Length); - - #endregion - - #region Passport - - typeDef = context.ModelDef.Types[typeof (Passport)]; - Assert.IsNotNull(typeDef.Fields["Number"]); - Assert.AreEqual("Number", typeDef.Fields["Number"].Name); - Assert.IsNotNull(typeDef.Fields["Card"]); - Assert.AreEqual("Card", typeDef.Fields["Card"].Name); - - #endregion - - #region Person - - typeDef = context.ModelDef.Types[typeof (Person)]; - Assert.IsNotNull(typeDef); - Assert.IsNotNull(context.ModelDef.Types["Person"]); - Assert.AreEqual(typeDef, context.ModelDef.Types["Person"]); - Assert.AreEqual("Person", typeDef.Name); - - // Fields - Assert.IsNotNull(typeDef.Fields["Passport"]); - Assert.AreEqual("Passport", typeDef.Fields["Passport"].Name); - Assert.IsTrue(typeDef.Fields["Passport"].IsStructure); - Assert.IsFalse(typeDef.Fields["Passport"].IsEntity); - Assert.IsFalse(typeDef.Fields["Passport"].IsEntitySet); - - #endregion - - #region Author - - typeDef = context.ModelDef.Types[typeof (Author)]; - Assert.IsNotNull(typeDef); - Assert.IsNotNull(context.ModelDef.Types["Author"]); - Assert.AreEqual(typeDef, context.ModelDef.Types["Author"]); - Assert.AreEqual("Author", typeDef.Name); - - // Fields - Assert.IsNotNull(typeDef.Fields["PenName"]); - Assert.AreEqual("PenName", typeDef.Fields["PenName"].Name); - - // Indexes - Assert.IsNotNull(typeDef.Indexes["IX_PENNAME"]); - Assert.IsNotNull(typeDef.Indexes[0]); - Assert.AreEqual(typeDef.Indexes["IX_PENNAME"], typeDef.Indexes[0]); - Assert.IsFalse(typeDef.Indexes["IX_PENNAME"].IsPrimary); - Assert.IsFalse(typeDef.Indexes["IX_PENNAME"].IsUnique); - Assert.AreEqual(1, typeDef.Indexes[0].KeyFields.Count); - Assert.IsNotNull(typeDef.Indexes[0].KeyFields[0]); - Assert.AreEqual("PenName", typeDef.Indexes[0].KeyFields[0].Key); - Assert.AreEqual(Direction.Negative, typeDef.Indexes[0].KeyFields[0].Value); - - #endregion - - #region Book - - typeDef = context.ModelDef.Types[typeof (Book)]; - Assert.IsNotNull(typeDef); - Assert.IsNotNull(context.ModelDef.Types["Book"]); - Assert.AreEqual(typeDef, context.ModelDef.Types["Book"]); - Assert.AreEqual("Book", typeDef.Name); - - // Fields - Assert.IsNotNull(typeDef.Fields["Isbn"]); - Assert.AreEqual("Isbn", typeDef.Fields["Isbn"].Name); - Assert.AreEqual(32, typeDef.Fields["Isbn"].Length); - - Assert.IsNotNull(typeDef.Fields["Title"]); - Assert.AreEqual("Title", typeDef.Fields["Title"].Name); - Assert.AreEqual(128, typeDef.Fields["Title"].Length); - - Assert.IsNotNull(typeDef.Fields["Author"]); - Assert.AreEqual(OnRemoveAction.Deny, typeDef.Fields["Author"].OnTargetRemove); - Assert.AreEqual("Author", typeDef.Fields["Author"].Name); - - Assert.IsNotNull(typeDef.Indexes["IX_Title"]); - Assert.IsFalse(typeDef.Indexes["IX_Title"].IsPrimary); - Assert.IsFalse(typeDef.Indexes["IX_Title"].IsUnique); - Assert.AreEqual(1, typeDef.Indexes["IX_Title"].KeyFields.Count); - Assert.AreEqual("Title", typeDef.Indexes["IX_Title"].KeyFields[0].Key); - Assert.AreEqual(Direction.Positive, typeDef.Indexes["IX_Title"].KeyFields[0].Value); - - #endregion - - #region BookReview - - typeDef = context.ModelDef.Types[typeof (BookReview)]; - Assert.IsNotNull(typeDef); - Assert.IsNotNull(context.ModelDef.Types["BookReview"]); - Assert.AreEqual(typeDef, context.ModelDef.Types["BookReview"]); - Assert.AreEqual("BookReview", typeDef.Name); - - // Fields - Assert.IsNotNull(typeDef.Fields["Book"]); - Assert.AreEqual("Book", typeDef.Fields["Book"].Name); - Assert.AreEqual(OnRemoveAction.Cascade, typeDef.Fields["Book"].OnTargetRemove); - - Assert.IsNotNull(typeDef.Fields["Reviewer"]); - Assert.AreEqual("Reviewer", typeDef.Fields["Reviewer"].Name); - Assert.AreEqual(OnRemoveAction.Clear, typeDef.Fields["Reviewer"].OnTargetRemove); - - Assert.IsNotNull(typeDef.Fields["Text"]); - Assert.AreEqual("Text", typeDef.Fields["Text"].Name); - Assert.AreEqual(4096, typeDef.Fields["Text"].Length); - - #endregion - - Console.WriteLine("-- Model verification is completed --"); - } - - #region IModule Members - - public void OnDefinitionsBuilt(BuildingContext buildingContext, DomainModelDef model) - { - if (!IsEnabled) - return; - - context = buildingContext; - - try { - Console.WriteLine("-- Verifying model --"); - VerifyDefinition(); - Console.WriteLine("-- Redefining types --"); - RedefineTypes(); - Console.WriteLine("-- Verifying model --"); - VerifyDefinition(); - Console.WriteLine("-- Redefining fields --"); - RedefineFields(); - Console.WriteLine("-- Redefining indexes --"); - RedefineIndexes(); - Console.WriteLine("-- Verifying model --"); - VerifyDefinition(); - VerifyTypeCollection(); - } - finally { - context = null; - } - } - - #endregion - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class LibraryTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, "Xtensive.Orm.Tests.Model.LibraryModel"); - // config.Builders.Add(typeof (LibraryDomainBuilder)); - return config; - } - - private static void VerifyModel(Domain domain) - { - TypeInfoCollection types = domain.Model.Types; - Assert.AreEqual(types.FindAncestor(types[typeof (Person)]), null); - Assert.AreEqual(types.FindAncestor(types[typeof (Book)]), null); - Assert.AreEqual(types.FindAncestor(types[typeof (BookReview)]), null); - Assert.AreEqual(types.FindAncestor(types[typeof (Author)]), types[typeof (Person)]); - - Assert.AreEqual(types[typeof (Person)].GetAncestor(), null); - Assert.AreEqual(types[typeof (Book)].GetAncestor(), null); - Assert.AreEqual(types[typeof (BookReview)].GetAncestor(), null); - Assert.AreEqual(types[typeof (Author)].GetAncestor(), types[typeof (Person)]); - - ICollection collection = types.Structures; - Assert.IsTrue(collection.Count > 0); - foreach (TypeInfo item in collection) { - Assert.IsTrue(item.IsStructure); - Assert.IsFalse(item.IsInterface); - Assert.IsFalse(item.IsEntity); - } - - collection = types.Interfaces; - Assert.IsFalse(collection.Count > 0); - foreach (TypeInfo item in collection) { - Assert.IsTrue(item.IsInterface); - Assert.IsFalse(item.IsStructure); - Assert.IsFalse(item.IsEntity); - } - - collection = types.Entities; - Assert.IsTrue(collection.Count > 0); - foreach (TypeInfo item in collection) { - Assert.IsTrue(item.IsEntity); - Assert.IsFalse(item.IsInterface); - Assert.IsFalse(item.IsStructure); - } - - #region IdentityCard - - TypeInfo typeInfo = domain.Model.Types[typeof (IdentityCard)]; - - // Fields - Assert.IsNotNull(typeInfo.Fields["FirstName"]); - Assert.AreEqual("FirstName", typeInfo.Fields["FirstName"].Name); - Assert.AreEqual(64, typeInfo.Fields["FirstName"].Length); - Assert.IsTrue(typeInfo.Fields["FirstName"].IsDeclared); - Assert.IsFalse(typeInfo.Fields["FirstName"].IsInherited); - Assert.IsNotNull(typeInfo.Fields["SecondName"]); - Assert.AreEqual("SecondName", typeInfo.Fields["SecondName"].Name); - Assert.AreEqual(64, typeInfo.Fields["SecondName"].Length); - Assert.IsTrue(typeInfo.Fields["SecondName"].IsDeclared); - Assert.IsFalse(typeInfo.Fields["SecondName"].IsInherited); - Assert.IsNotNull(typeInfo.Fields["LastName"]); - Assert.AreEqual("LastName", typeInfo.Fields["LastName"].Name); - Assert.AreEqual(64, typeInfo.Fields["LastName"].Length); - Assert.IsTrue(typeInfo.Fields["LastName"].IsDeclared); - Assert.IsFalse(typeInfo.Fields["LastName"].IsInherited); - - #endregion - - #region Passport - - typeInfo = domain.Model.Types[typeof (Passport)]; - - // Fields - Assert.IsNotNull(typeInfo.Fields["Number"]); - Assert.AreEqual("Number", typeInfo.Fields["Number"].Name); - Assert.IsTrue(typeInfo.Fields["Number"].IsDeclared); - Assert.IsFalse(typeInfo.Fields["Number"].IsInherited); - Assert.IsFalse(typeInfo.Fields["Number"].IsStructure); - Assert.IsFalse(typeInfo.Fields["Number"].IsEntity); - Assert.IsFalse(typeInfo.Fields["Number"].IsEntitySet); - - Assert.IsNotNull(typeInfo.Fields["Card"]); - Assert.AreEqual("Card", typeInfo.Fields["Card"].Name); - Assert.IsTrue(typeInfo.Fields["Card"].IsStructure); - Assert.IsFalse(typeInfo.Fields["Card"].IsEntity); - Assert.IsFalse(typeInfo.Fields["Card"].IsEntitySet); - Assert.AreEqual(3, typeInfo.Fields["Card"].Fields.Count); - Assert.IsTrue(typeInfo.Fields["Card"].IsDeclared); - Assert.IsFalse(typeInfo.Fields["Card"].IsInherited); - - Assert.IsNotNull(typeInfo.Columns["Card.FirstName"]); - Assert.AreEqual("Card.FirstName", typeInfo.Columns["Card.FirstName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Card.FirstName"].Length); - Assert.IsNotNull(typeInfo.Columns["Card.SecondName"]); - Assert.AreEqual("Card.SecondName", typeInfo.Columns["Card.SecondName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Card.SecondName"].Length); - Assert.IsNotNull(typeInfo.Columns["Card.LastName"]); - Assert.AreEqual("Card.LastName", typeInfo.Columns["Card.LastName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Card.LastName"].Length); - - #endregion - - #region Person - - typeInfo = domain.Model.Types[typeof (Person)]; - Assert.IsNotNull(typeInfo); - Assert.IsNotNull(domain.Model.Types["Person"]); - Assert.AreEqual(typeInfo, domain.Model.Types["Person"]); - Assert.AreEqual("Person", typeInfo.Name); - - // Fields - Assert.IsNotNull(typeInfo.Fields["Passport"]); - Assert.AreEqual("Passport", typeInfo.Fields["Passport"].Name); - Assert.IsTrue(typeInfo.Fields["Passport"].IsStructure); - Assert.IsFalse(typeInfo.Fields["Passport"].IsEntity); - Assert.IsFalse(typeInfo.Fields["Passport"].IsEntitySet); - // Assert.AreEqual(typeInfo.Fields["Passport"].Columns.Count, 4); - - Assert.IsNotNull(typeInfo.Fields["Reviews"]); - Assert.AreEqual("Reviews", typeInfo.Fields["Reviews"].Name); - Assert.IsFalse(typeInfo.Fields["Reviews"].IsStructure); - Assert.IsFalse(typeInfo.Fields["Reviews"].IsEntity); - Assert.IsTrue(typeInfo.Fields["Reviews"].IsEntitySet); - - // KeyColumns - Assert.IsNotNull(typeInfo.Columns["Passport.Number"]); - Assert.AreEqual("Passport.Number", typeInfo.Columns["Passport.Number"].Name); - // Assert.AreEqual(person.Fields["Passport"].Indexes[0], person.Key); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.FirstName"]); - Assert.AreEqual("Passport.Card.FirstName", typeInfo.Columns["Passport.Card.FirstName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.FirstName"].Length); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.SecondName"]); - Assert.AreEqual("Passport.Card.SecondName", typeInfo.Columns["Passport.Card.SecondName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.SecondName"].Length); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.LastName"]); - Assert.AreEqual("Passport.Card.LastName", typeInfo.Columns["Passport.Card.LastName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.LastName"].Length); - - // Indexes - if (IsSingleTable(typeInfo) || IsConcreteTable(typeInfo)) - Assert.AreEqual(2, typeInfo.Indexes.Count); - else - Assert.AreEqual(1, typeInfo.Indexes.Count); - Assert.IsNotNull(typeInfo.Indexes["PK_Person"]); - Assert.IsTrue(typeInfo.Indexes["PK_Person"].IsPrimary); - Assert.IsTrue(typeInfo.Indexes["PK_Person"].IsUnique); - Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_Person"].KeyColumns.Count); - Assert.AreEqual(typeInfo.Columns["PassportNumber"], typeInfo.Indexes["PK_Person"].KeyColumns[0].Key); - - #endregion - - #region Author - - typeInfo = domain.Model.Types[typeof (Author)]; - Assert.IsNotNull(typeInfo); - Assert.IsNotNull(domain.Model.Types["Author"]); - Assert.AreEqual(typeInfo, domain.Model.Types["Author"]); - Assert.AreEqual("Author", typeInfo.Name); - - // Fields - Assert.IsNotNull(typeInfo.Fields["Passport"]); - Assert.AreEqual("Passport", typeInfo.Fields["Passport"].Name); - Assert.IsTrue(typeInfo.Fields["Passport"].IsStructure); - Assert.IsTrue(typeInfo.Fields["Passport"].IsInherited); - Assert.AreEqual(5, typeInfo.Fields["Passport"].Fields.Count); - Assert.IsNotNull(typeInfo.Fields["PenName"]); - Assert.AreEqual(true, typeInfo.Fields["PenName"].IsNullable); - Assert.AreEqual("PenName", typeInfo.Fields["PenName"].Name); - Assert.AreEqual(64, typeInfo.Fields["PenName"].Length); - Assert.IsNotNull(typeInfo.Fields["Books"]); - Assert.AreEqual(true, typeInfo.Fields["Books"].IsNullable); - Assert.AreEqual("Books", typeInfo.Fields["Books"].Name); - - Assert.AreEqual(2, typeInfo.Fields.Find(FieldAttributes.Declared).Count); - Assert.AreEqual(9, typeInfo.Fields.Find(FieldAttributes.Inherited).Count); - - // KeyColumns - Assert.IsNotNull(typeInfo.Columns["PassportNumber"]); - Assert.AreEqual("PassportNumber", typeInfo.Columns["PassportNumber"].Name); - // Assert.AreEqual(person.Fields["Passport"].Indexes[0], person.Key); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.FirstName"]); - Assert.AreEqual("Passport.Card.FirstName", typeInfo.Columns["Passport.Card.FirstName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.FirstName"].Length); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.SecondName"]); - Assert.AreEqual("Passport.Card.SecondName", typeInfo.Columns["Passport.Card.SecondName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.SecondName"].Length); - Assert.IsNotNull(typeInfo.Columns["Passport.Card.LastName"]); - Assert.AreEqual("Passport.Card.LastName", typeInfo.Columns["Passport.Card.LastName"].Name); - Assert.AreEqual(64, typeInfo.Columns["Passport.Card.LastName"].Length); - Assert.IsNotNull(typeInfo.Columns["PenName"]); - Assert.AreEqual(true, typeInfo.Columns["PenName"].IsNullable); - Assert.AreEqual("PenName", typeInfo.Columns["PenName"].Name); - Assert.AreEqual(64, typeInfo.Columns["PenName"].Length); - Assert.IsFalse(typeInfo.Columns.Contains("Reviews")); - - // Indexes - if (!IsSingleTable(typeInfo)) { - if (IsConcreteTable(typeInfo)) - Assert.AreEqual(2, typeInfo.Indexes.Count); - else - Assert.AreEqual(3, typeInfo.Indexes.Count); - Assert.IsNotNull(typeInfo.Indexes["Author.IX_PENNAME"]); - Assert.IsNotNull(typeInfo.Indexes[0]); - Assert.AreEqual(typeInfo.Indexes[0], typeInfo.Indexes["Author.IX_PENNAME"]); - Assert.AreEqual(1, typeInfo.Indexes[0].KeyColumns.Count); - Assert.IsNotNull(typeInfo.Indexes[0].KeyColumns[0]); - Assert.AreEqual(typeInfo.Columns["PenName"], typeInfo.Indexes[0].KeyColumns[0].Key); - } - - #endregion - - #region Book - - typeInfo = domain.Model.Types[typeof (Book)]; - Assert.IsNotNull(typeInfo); - Assert.IsNotNull(domain.Model.Types["Book"]); - Assert.AreEqual(typeInfo, domain.Model.Types["Book"]); - Assert.AreEqual(typeInfo.Name, "Book"); - - // Fields - Assert.IsNotNull(typeInfo.Fields["Isbn"]); - Assert.AreEqual(typeInfo.Fields["Isbn"].Name, "Isbn"); - Assert.AreEqual(typeInfo.Fields["Isbn"].Length, 32); - // Assert.AreEqual(book.Fields["Isbn"].Indexes[0], book.Key); - - Assert.IsNotNull(typeInfo.Fields["Title"]); - Assert.AreEqual(typeInfo.Fields["Title"].Name, "Title"); - Assert.AreEqual(typeInfo.Fields["Title"].Length, 128); - - Assert.IsNotNull(typeInfo.Fields["Author"]); - Assert.AreEqual(typeInfo.Fields["Author"].Name, "Author"); - Assert.IsFalse(typeInfo.Fields["Author"].IsStructure); - Assert.IsTrue(typeInfo.Fields["Author"].IsEntity); - Assert.IsFalse(typeInfo.Fields["Author"].IsEntitySet); - Assert.AreEqual(OnRemoveAction.Deny, typeInfo.Fields["Author"].Associations.Last().OnTargetRemove); - - // Indexes - Assert.AreEqual(6, typeInfo.Indexes.Count); - Assert.IsNotNull(typeInfo.Indexes["PK_Book"]); - Assert.IsTrue(typeInfo.Indexes["PK_Book"].IsPrimary); - Assert.IsTrue(typeInfo.Indexes["PK_Book"].IsUnique); - Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_Book"].KeyColumns.Count); - Assert.AreEqual("Isbn", typeInfo.Indexes["PK_Book"].KeyColumns[0].Key.Name); - Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_Book"].KeyColumns[0].Value); - - Assert.IsNotNull(typeInfo.Indexes["Book.FK_Author"]); - Assert.IsFalse(typeInfo.Indexes["Book.FK_Author"].IsPrimary); - Assert.IsFalse(typeInfo.Indexes["Book.FK_Author"].IsUnique); - Assert.AreEqual(domain.Model.Types[typeof(Author)].Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["Book.FK_Author"].KeyColumns.Count); - Assert.AreEqual("BookAuthor", typeInfo.Indexes["Book.FK_Author"].KeyColumns[0].Key.Name); - Assert.AreEqual(Direction.Positive, typeInfo.Indexes["Book.FK_Author"].KeyColumns[0].Value); - - Assert.IsNotNull(typeInfo.Indexes["Book.IX_Title"]); - Assert.IsFalse(typeInfo.Indexes["Book.IX_Title"].IsPrimary); - Assert.IsFalse(typeInfo.Indexes["Book.IX_Title"].IsUnique); - Assert.AreEqual(1, typeInfo.Indexes["Book.IX_Title"].KeyColumns.Count); - Assert.AreEqual("Title", typeInfo.Indexes["Book.IX_Title"].KeyColumns[0].Key.Name); - Assert.AreEqual(Direction.Positive, typeInfo.Indexes["Book.IX_Title"].KeyColumns[0].Value); - - #endregion - - #region BookReview - - typeInfo = domain.Model.Types[typeof (BookReview)]; - Assert.IsNotNull(typeInfo); - Assert.IsNotNull(domain.Model.Types["BookReview"]); - Assert.AreEqual(typeInfo, domain.Model.Types["BookReview"]); - Assert.AreEqual("BookReview", typeInfo.Name); - - // Fields - Assert.IsNotNull(typeInfo.Fields["Book"]); - Assert.AreEqual("Book", typeInfo.Fields["Book"].Name); - Assert.AreEqual(OnRemoveAction.Cascade, typeInfo.Fields["Book"].Associations.Last().OnTargetRemove); - - Assert.IsNotNull(typeInfo.Fields["Reviewer"]); - Assert.AreEqual("Reviewer", typeInfo.Fields["Reviewer"].Name); - Assert.AreEqual(OnRemoveAction.Clear, typeInfo.Fields["Reviewer"].Associations.Last().OnTargetRemove); - - Assert.IsNotNull(typeInfo.Fields["Text"]); - Assert.AreEqual("Text", typeInfo.Fields["Text"].Name); - Assert.AreEqual(4096, typeInfo.Fields["Text"].Length); - - // Indexes - Assert.AreEqual(6, typeInfo.Indexes.Count); - Assert.IsNotNull(typeInfo.Indexes["PK_BookReview"]); - Assert.IsTrue(typeInfo.Indexes["PK_BookReview"].IsPrimary); - Assert.IsTrue(typeInfo.Indexes["PK_BookReview"].IsUnique); - Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_BookReview"].KeyColumns.Count); - Assert.AreEqual("Book", typeInfo.Indexes["PK_BookReview"].KeyColumns[0].Key.Name); - Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_BookReview"].KeyColumns[0].Value); -// Assert.AreEqual("Reviewer.PassportNumber", typeInfo.Indexes["PK_BookReview"].KeyColumns[1].Key.Name); -// Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_BookReview"].KeyColumns[1].Value); - - #endregion - } - - [Test] - public void DuplicatedKeyTest() - { - using (var session = Domain.OpenSession()) { - Book book1; - using (session.OpenTransaction()) { - book1 = new Book("0976470705"); - book1.Remove(); - Session.Current.SaveChanges(); - Book book2 = new Book("0976470705"); - book2.Remove(); - - var k = Key.Create(Domain, "0976470705").Format(); - var key = Key.Parse(Domain, k); - Assert.AreEqual(key, Key.Create(Domain, "0976470705")); - - Assert.IsNull(session.Query.SingleOrDefault(Key.Create(Domain, "0976470705"))); - Assert.AreEqual(null, session.Query.SingleOrDefault(Key.Create(Domain, "0976470705"))); - } - } - } - - [Test] - public void ModelVerificationTest() - { -// Domain.Model.Dump(); - VerifyModel(Domain); - } - - [Test] - public void ComplexKeyTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - Book book = new Book("5-272-00040-4"); - book.Title = "Assembler"; - book.Author = new Author(); - book.Author.Passport.Card.LastName = "Jurov"; - Person reviewer = new Person(); - reviewer.Passport.Card.LastName = "Kochetov"; - reviewer.Passport.Card.FirstName = "Alexius"; - BookReview review = new BookReview(book, reviewer); - Assert.AreEqual((object) book, review.Book); - Assert.AreEqual((object) reviewer, review.Reviewer); - } - } - } - - private static bool IsConcreteTable(TypeInfo typeInfo) - { - return typeInfo.Hierarchy.InheritanceSchema==InheritanceSchema.ConcreteTable; - } - - private static bool IsSingleTable(TypeInfo typeInfo) - { - return typeInfo.Hierarchy.InheritanceSchema==InheritanceSchema.SingleTable; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2007.07.04 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Building; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Model.LibraryModel; +using FieldAttributes=Xtensive.Orm.Model.FieldAttributes; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.Tests.Model.LibraryModel +{ + [Serializable] + public class IdentityCard : Structure + { + [Field(Length = 64)] + public string FirstName { get; set; } + + [Field(Length = 64)] + public string SecondName { get; set; } + + [Field(Length = 64)] + public string LastName { get; set; } + } + + [Serializable] + public class Passport : Structure + { + [Field] + public int Number { get; set; } + + [Field] + public IdentityCard Card { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Field, FieldMapping("PassportNumber"), Key] + public int Number + { + get { return GetFieldValue("Number"); } + } + + [Field] + public Passport Passport + { + get { return GetFieldValue("Passport"); } + set + { + SetFieldValue("Passport", value); + } + } + + [Field, Association(PairTo = "Reviewer")] + public EntitySet Reviews { get; private set; } + } + + [Serializable] + [Index("PenName:DESC", Name = "IX_PENNAME")] + public class Author : Person + { + [Field(Length = 64)] + public string PenName { get; set; } + + [Field] + public EntitySet Books { get; private set; } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class Book : Entity + { + [Field(Length = 32), Key] + public string Isbn { get; private set; } + + [Field(Length = 128, Indexed = true)] + public string Title { get; set; } + + [Field, FieldMapping("BookAuthor")] + [Association(OnTargetRemove = OnRemoveAction.Deny)] + public Author Author { get; set; } + + public int Rating { get; set; } + + public Book(string isbn) + : base(isbn) + { + } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class BookReview : Entity + { + [Field, Association(OnTargetRemove = OnRemoveAction.Clear), Key(1)] + public Person Reviewer { get; private set; } + + [Field, FieldMapping("Book"), Association(OnTargetRemove = OnRemoveAction.Cascade), Key(0)] + public Book Book { get; private set; } + + [Field(Length = 4096)] + public string Text { get; set; } + + public BookReview(Book book, Person reviewer) + : base(book, reviewer) + { + } + } + + public class IsbnKeyGenerator : KeyGenerator + { + private int counter; + + public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) + { + } + + public override Tuple GenerateKey(KeyInfo keyInfo, Session session) + { + var result = Tuple.Create(counter.ToString()); + counter++; + return result; + } + } + + public class LibraryDomainBuilder : IModule + { + public static bool IsEnabled; + + private BuildingContext context; + + public void OnBuilt(Domain domain) + { + } + + private void VerifyTypeCollection() + { + var types = context.ModelDef.Types; + Assert.IsNull(types.FindAncestor(types[typeof (Entity)])); + Assert.IsNull(types.FindAncestor(types[typeof (IEntity)])); + Assert.IsNull(types.FindAncestor(types[typeof (Structure)])); + Assert.AreEqual(types.FindAncestor(types[typeof (Passport)]), types[typeof (Structure)]); + Assert.AreEqual(types.FindAncestor(types[typeof (IdentityCard)]), types[typeof (Structure)]); + Assert.AreEqual(types.FindAncestor(types[typeof (Person)]), types[typeof (Entity)]); + Assert.AreEqual(types.FindAncestor(types[typeof (Book)]), types[typeof (Entity)]); + Assert.AreEqual(types.FindAncestor(types[typeof (BookReview)]), types[typeof (Entity)]); + Assert.AreEqual(types.FindAncestor(types[typeof (Author)]), types[typeof (Person)]); + } + + private void RedefineTypes() + { + context.ModelDef.Types.Clear(); + context.ModelDef.DefineType(typeof (BookReview)); + context.ModelDef.DefineType(typeof (Book)); + context.ModelDef.DefineType(typeof (Person)); + context.ModelDef.DefineType(typeof (Author)); + context.ModelDef.DefineType(typeof (Structure)); + context.ModelDef.DefineType(typeof (Passport)); + context.ModelDef.DefineType(typeof (IdentityCard)); + context.ModelDef.DefineType(typeof (Entity)); + context.ModelDef.DefineType(typeof (IEntity)); + } + + private void RedefineFields() + { + var types = context.ModelDef.Types; + foreach (TypeDef type in types) { + type.Fields.Clear(); + type.Indexes.Clear(); + + var properties = + type.UnderlyingType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | + BindingFlags.DeclaredOnly); + for (int index = 0, count = properties.Length; index < count; index++) { + var attributes = properties[index].GetCustomAttributes(typeof (FieldAttribute), true); + if (attributes==null || attributes.Length==0) + continue; + if (!properties[index].Name.Contains(".")) + type.DefineField(properties[index]); + } + } + + types["Book"].Fields["Author"].OnTargetRemove = OnRemoveAction.Deny; + types["BookReview"].Fields["Book"].OnTargetRemove = OnRemoveAction.Cascade; + types["BookReview"].Fields["Reviewer"].OnTargetRemove = OnRemoveAction.Clear; + + + IndexDef indexDef; + + indexDef = types["Author"].DefineIndex("IX_PENNAME"); + indexDef.MappingName = "IX_PENNAME"; + indexDef.KeyFields.Add("PenName", Direction.Negative); + + indexDef = types["Book"].DefineIndex("IX_Title"); + indexDef.KeyFields.Add("Title"); + } + + private void RedefineIndexes() + { + } + + private void VerifyDefinition() + { + Assert.IsNotNull(context.ModelDef.Types[typeof (Entity)]); + Assert.IsNotNull(context.ModelDef.Types[typeof (IEntity)]); + + #region IdentityCard + + TypeDef typeDef = context.ModelDef.Types[typeof (IdentityCard)]; + Assert.IsNotNull(typeDef); + Assert.IsNotNull(typeDef.Fields["FirstName"]); + Assert.AreEqual("FirstName", typeDef.Fields["FirstName"].Name); + Assert.AreEqual(64, typeDef.Fields["FirstName"].Length); + Assert.IsNotNull(typeDef.Fields["SecondName"]); + Assert.AreEqual("SecondName", typeDef.Fields["SecondName"].Name); + Assert.AreEqual(64, typeDef.Fields["SecondName"].Length); + Assert.IsNotNull(typeDef.Fields["LastName"]); + Assert.AreEqual("LastName", typeDef.Fields["LastName"].Name); + Assert.AreEqual(64, typeDef.Fields["LastName"].Length); + + #endregion + + #region Passport + + typeDef = context.ModelDef.Types[typeof (Passport)]; + Assert.IsNotNull(typeDef.Fields["Number"]); + Assert.AreEqual("Number", typeDef.Fields["Number"].Name); + Assert.IsNotNull(typeDef.Fields["Card"]); + Assert.AreEqual("Card", typeDef.Fields["Card"].Name); + + #endregion + + #region Person + + typeDef = context.ModelDef.Types[typeof (Person)]; + Assert.IsNotNull(typeDef); + Assert.IsNotNull(context.ModelDef.Types["Person"]); + Assert.AreEqual(typeDef, context.ModelDef.Types["Person"]); + Assert.AreEqual("Person", typeDef.Name); + + // Fields + Assert.IsNotNull(typeDef.Fields["Passport"]); + Assert.AreEqual("Passport", typeDef.Fields["Passport"].Name); + Assert.IsTrue(typeDef.Fields["Passport"].IsStructure); + Assert.IsFalse(typeDef.Fields["Passport"].IsEntity); + Assert.IsFalse(typeDef.Fields["Passport"].IsEntitySet); + + #endregion + + #region Author + + typeDef = context.ModelDef.Types[typeof (Author)]; + Assert.IsNotNull(typeDef); + Assert.IsNotNull(context.ModelDef.Types["Author"]); + Assert.AreEqual(typeDef, context.ModelDef.Types["Author"]); + Assert.AreEqual("Author", typeDef.Name); + + // Fields + Assert.IsNotNull(typeDef.Fields["PenName"]); + Assert.AreEqual("PenName", typeDef.Fields["PenName"].Name); + + // Indexes + Assert.IsNotNull(typeDef.Indexes["IX_PENNAME"]); + Assert.IsNotNull(typeDef.Indexes[0]); + Assert.AreEqual(typeDef.Indexes["IX_PENNAME"], typeDef.Indexes[0]); + Assert.IsFalse(typeDef.Indexes["IX_PENNAME"].IsPrimary); + Assert.IsFalse(typeDef.Indexes["IX_PENNAME"].IsUnique); + Assert.AreEqual(1, typeDef.Indexes[0].KeyFields.Count); + Assert.IsNotNull(typeDef.Indexes[0].KeyFields[0]); + Assert.AreEqual("PenName", typeDef.Indexes[0].KeyFields[0].Key); + Assert.AreEqual(Direction.Negative, typeDef.Indexes[0].KeyFields[0].Value); + + #endregion + + #region Book + + typeDef = context.ModelDef.Types[typeof (Book)]; + Assert.IsNotNull(typeDef); + Assert.IsNotNull(context.ModelDef.Types["Book"]); + Assert.AreEqual(typeDef, context.ModelDef.Types["Book"]); + Assert.AreEqual("Book", typeDef.Name); + + // Fields + Assert.IsNotNull(typeDef.Fields["Isbn"]); + Assert.AreEqual("Isbn", typeDef.Fields["Isbn"].Name); + Assert.AreEqual(32, typeDef.Fields["Isbn"].Length); + + Assert.IsNotNull(typeDef.Fields["Title"]); + Assert.AreEqual("Title", typeDef.Fields["Title"].Name); + Assert.AreEqual(128, typeDef.Fields["Title"].Length); + + Assert.IsNotNull(typeDef.Fields["Author"]); + Assert.AreEqual(OnRemoveAction.Deny, typeDef.Fields["Author"].OnTargetRemove); + Assert.AreEqual("Author", typeDef.Fields["Author"].Name); + + Assert.IsNotNull(typeDef.Indexes["IX_Title"]); + Assert.IsFalse(typeDef.Indexes["IX_Title"].IsPrimary); + Assert.IsFalse(typeDef.Indexes["IX_Title"].IsUnique); + Assert.AreEqual(1, typeDef.Indexes["IX_Title"].KeyFields.Count); + Assert.AreEqual("Title", typeDef.Indexes["IX_Title"].KeyFields[0].Key); + Assert.AreEqual(Direction.Positive, typeDef.Indexes["IX_Title"].KeyFields[0].Value); + + #endregion + + #region BookReview + + typeDef = context.ModelDef.Types[typeof (BookReview)]; + Assert.IsNotNull(typeDef); + Assert.IsNotNull(context.ModelDef.Types["BookReview"]); + Assert.AreEqual(typeDef, context.ModelDef.Types["BookReview"]); + Assert.AreEqual("BookReview", typeDef.Name); + + // Fields + Assert.IsNotNull(typeDef.Fields["Book"]); + Assert.AreEqual("Book", typeDef.Fields["Book"].Name); + Assert.AreEqual(OnRemoveAction.Cascade, typeDef.Fields["Book"].OnTargetRemove); + + Assert.IsNotNull(typeDef.Fields["Reviewer"]); + Assert.AreEqual("Reviewer", typeDef.Fields["Reviewer"].Name); + Assert.AreEqual(OnRemoveAction.Clear, typeDef.Fields["Reviewer"].OnTargetRemove); + + Assert.IsNotNull(typeDef.Fields["Text"]); + Assert.AreEqual("Text", typeDef.Fields["Text"].Name); + Assert.AreEqual(4096, typeDef.Fields["Text"].Length); + + #endregion + + Console.WriteLine("-- Model verification is completed --"); + } + + #region IModule Members + + public void OnDefinitionsBuilt(BuildingContext buildingContext, DomainModelDef model) + { + if (!IsEnabled) + return; + + context = buildingContext; + + try { + Console.WriteLine("-- Verifying model --"); + VerifyDefinition(); + Console.WriteLine("-- Redefining types --"); + RedefineTypes(); + Console.WriteLine("-- Verifying model --"); + VerifyDefinition(); + Console.WriteLine("-- Redefining fields --"); + RedefineFields(); + Console.WriteLine("-- Redefining indexes --"); + RedefineIndexes(); + Console.WriteLine("-- Verifying model --"); + VerifyDefinition(); + VerifyTypeCollection(); + } + finally { + context = null; + } + } + + #endregion + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class LibraryTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, "Xtensive.Orm.Tests.Model.LibraryModel"); + // config.Builders.Add(typeof (LibraryDomainBuilder)); + return config; + } + + private static void VerifyModel(Domain domain) + { + TypeInfoCollection types = domain.Model.Types; + Assert.AreEqual(types.FindAncestor(types[typeof (Person)]), null); + Assert.AreEqual(types.FindAncestor(types[typeof (Book)]), null); + Assert.AreEqual(types.FindAncestor(types[typeof (BookReview)]), null); + Assert.AreEqual(types.FindAncestor(types[typeof (Author)]), types[typeof (Person)]); + + Assert.AreEqual(types[typeof (Person)].GetAncestor(), null); + Assert.AreEqual(types[typeof (Book)].GetAncestor(), null); + Assert.AreEqual(types[typeof (BookReview)].GetAncestor(), null); + Assert.AreEqual(types[typeof (Author)].GetAncestor(), types[typeof (Person)]); + + ICollection collection = types.Structures; + Assert.IsTrue(collection.Count > 0); + foreach (TypeInfo item in collection) { + Assert.IsTrue(item.IsStructure); + Assert.IsFalse(item.IsInterface); + Assert.IsFalse(item.IsEntity); + } + + collection = types.Interfaces; + Assert.IsFalse(collection.Count > 0); + foreach (TypeInfo item in collection) { + Assert.IsTrue(item.IsInterface); + Assert.IsFalse(item.IsStructure); + Assert.IsFalse(item.IsEntity); + } + + collection = types.Entities; + Assert.IsTrue(collection.Count > 0); + foreach (TypeInfo item in collection) { + Assert.IsTrue(item.IsEntity); + Assert.IsFalse(item.IsInterface); + Assert.IsFalse(item.IsStructure); + } + + #region IdentityCard + + TypeInfo typeInfo = domain.Model.Types[typeof (IdentityCard)]; + + // Fields + Assert.IsNotNull(typeInfo.Fields["FirstName"]); + Assert.AreEqual("FirstName", typeInfo.Fields["FirstName"].Name); + Assert.AreEqual(64, typeInfo.Fields["FirstName"].Length); + Assert.IsTrue(typeInfo.Fields["FirstName"].IsDeclared); + Assert.IsFalse(typeInfo.Fields["FirstName"].IsInherited); + Assert.IsNotNull(typeInfo.Fields["SecondName"]); + Assert.AreEqual("SecondName", typeInfo.Fields["SecondName"].Name); + Assert.AreEqual(64, typeInfo.Fields["SecondName"].Length); + Assert.IsTrue(typeInfo.Fields["SecondName"].IsDeclared); + Assert.IsFalse(typeInfo.Fields["SecondName"].IsInherited); + Assert.IsNotNull(typeInfo.Fields["LastName"]); + Assert.AreEqual("LastName", typeInfo.Fields["LastName"].Name); + Assert.AreEqual(64, typeInfo.Fields["LastName"].Length); + Assert.IsTrue(typeInfo.Fields["LastName"].IsDeclared); + Assert.IsFalse(typeInfo.Fields["LastName"].IsInherited); + + #endregion + + #region Passport + + typeInfo = domain.Model.Types[typeof (Passport)]; + + // Fields + Assert.IsNotNull(typeInfo.Fields["Number"]); + Assert.AreEqual("Number", typeInfo.Fields["Number"].Name); + Assert.IsTrue(typeInfo.Fields["Number"].IsDeclared); + Assert.IsFalse(typeInfo.Fields["Number"].IsInherited); + Assert.IsFalse(typeInfo.Fields["Number"].IsStructure); + Assert.IsFalse(typeInfo.Fields["Number"].IsEntity); + Assert.IsFalse(typeInfo.Fields["Number"].IsEntitySet); + + Assert.IsNotNull(typeInfo.Fields["Card"]); + Assert.AreEqual("Card", typeInfo.Fields["Card"].Name); + Assert.IsTrue(typeInfo.Fields["Card"].IsStructure); + Assert.IsFalse(typeInfo.Fields["Card"].IsEntity); + Assert.IsFalse(typeInfo.Fields["Card"].IsEntitySet); + Assert.AreEqual(3, typeInfo.Fields["Card"].Fields.Count); + Assert.IsTrue(typeInfo.Fields["Card"].IsDeclared); + Assert.IsFalse(typeInfo.Fields["Card"].IsInherited); + + Assert.IsNotNull(typeInfo.Columns["Card.FirstName"]); + Assert.AreEqual("Card.FirstName", typeInfo.Columns["Card.FirstName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Card.FirstName"].Length); + Assert.IsNotNull(typeInfo.Columns["Card.SecondName"]); + Assert.AreEqual("Card.SecondName", typeInfo.Columns["Card.SecondName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Card.SecondName"].Length); + Assert.IsNotNull(typeInfo.Columns["Card.LastName"]); + Assert.AreEqual("Card.LastName", typeInfo.Columns["Card.LastName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Card.LastName"].Length); + + #endregion + + #region Person + + typeInfo = domain.Model.Types[typeof (Person)]; + Assert.IsNotNull(typeInfo); + Assert.IsNotNull(domain.Model.Types["Person"]); + Assert.AreEqual(typeInfo, domain.Model.Types["Person"]); + Assert.AreEqual("Person", typeInfo.Name); + + // Fields + Assert.IsNotNull(typeInfo.Fields["Passport"]); + Assert.AreEqual("Passport", typeInfo.Fields["Passport"].Name); + Assert.IsTrue(typeInfo.Fields["Passport"].IsStructure); + Assert.IsFalse(typeInfo.Fields["Passport"].IsEntity); + Assert.IsFalse(typeInfo.Fields["Passport"].IsEntitySet); + // Assert.AreEqual(typeInfo.Fields["Passport"].Columns.Count, 4); + + Assert.IsNotNull(typeInfo.Fields["Reviews"]); + Assert.AreEqual("Reviews", typeInfo.Fields["Reviews"].Name); + Assert.IsFalse(typeInfo.Fields["Reviews"].IsStructure); + Assert.IsFalse(typeInfo.Fields["Reviews"].IsEntity); + Assert.IsTrue(typeInfo.Fields["Reviews"].IsEntitySet); + + // KeyColumns + Assert.IsNotNull(typeInfo.Columns["Passport.Number"]); + Assert.AreEqual("Passport.Number", typeInfo.Columns["Passport.Number"].Name); + // Assert.AreEqual(person.Fields["Passport"].Indexes[0], person.Key); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.FirstName"]); + Assert.AreEqual("Passport.Card.FirstName", typeInfo.Columns["Passport.Card.FirstName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.FirstName"].Length); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.SecondName"]); + Assert.AreEqual("Passport.Card.SecondName", typeInfo.Columns["Passport.Card.SecondName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.SecondName"].Length); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.LastName"]); + Assert.AreEqual("Passport.Card.LastName", typeInfo.Columns["Passport.Card.LastName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.LastName"].Length); + + // Indexes + if (IsSingleTable(typeInfo) || IsConcreteTable(typeInfo)) + Assert.AreEqual(2, typeInfo.Indexes.Count); + else + Assert.AreEqual(1, typeInfo.Indexes.Count); + Assert.IsNotNull(typeInfo.Indexes["PK_Person"]); + Assert.IsTrue(typeInfo.Indexes["PK_Person"].IsPrimary); + Assert.IsTrue(typeInfo.Indexes["PK_Person"].IsUnique); + Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_Person"].KeyColumns.Count); + Assert.AreEqual(typeInfo.Columns["PassportNumber"], typeInfo.Indexes["PK_Person"].KeyColumns[0].Key); + + #endregion + + #region Author + + typeInfo = domain.Model.Types[typeof (Author)]; + Assert.IsNotNull(typeInfo); + Assert.IsNotNull(domain.Model.Types["Author"]); + Assert.AreEqual(typeInfo, domain.Model.Types["Author"]); + Assert.AreEqual("Author", typeInfo.Name); + + // Fields + Assert.IsNotNull(typeInfo.Fields["Passport"]); + Assert.AreEqual("Passport", typeInfo.Fields["Passport"].Name); + Assert.IsTrue(typeInfo.Fields["Passport"].IsStructure); + Assert.IsTrue(typeInfo.Fields["Passport"].IsInherited); + Assert.AreEqual(5, typeInfo.Fields["Passport"].Fields.Count); + Assert.IsNotNull(typeInfo.Fields["PenName"]); + Assert.AreEqual(true, typeInfo.Fields["PenName"].IsNullable); + Assert.AreEqual("PenName", typeInfo.Fields["PenName"].Name); + Assert.AreEqual(64, typeInfo.Fields["PenName"].Length); + Assert.IsNotNull(typeInfo.Fields["Books"]); + Assert.AreEqual(true, typeInfo.Fields["Books"].IsNullable); + Assert.AreEqual("Books", typeInfo.Fields["Books"].Name); + + Assert.AreEqual(2, typeInfo.Fields.Find(FieldAttributes.Declared).Count); + Assert.AreEqual(9, typeInfo.Fields.Find(FieldAttributes.Inherited).Count); + + // KeyColumns + Assert.IsNotNull(typeInfo.Columns["PassportNumber"]); + Assert.AreEqual("PassportNumber", typeInfo.Columns["PassportNumber"].Name); + // Assert.AreEqual(person.Fields["Passport"].Indexes[0], person.Key); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.FirstName"]); + Assert.AreEqual("Passport.Card.FirstName", typeInfo.Columns["Passport.Card.FirstName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.FirstName"].Length); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.SecondName"]); + Assert.AreEqual("Passport.Card.SecondName", typeInfo.Columns["Passport.Card.SecondName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.SecondName"].Length); + Assert.IsNotNull(typeInfo.Columns["Passport.Card.LastName"]); + Assert.AreEqual("Passport.Card.LastName", typeInfo.Columns["Passport.Card.LastName"].Name); + Assert.AreEqual(64, typeInfo.Columns["Passport.Card.LastName"].Length); + Assert.IsNotNull(typeInfo.Columns["PenName"]); + Assert.AreEqual(true, typeInfo.Columns["PenName"].IsNullable); + Assert.AreEqual("PenName", typeInfo.Columns["PenName"].Name); + Assert.AreEqual(64, typeInfo.Columns["PenName"].Length); + Assert.IsFalse(typeInfo.Columns.Contains("Reviews")); + + // Indexes + if (!IsSingleTable(typeInfo)) { + if (IsConcreteTable(typeInfo)) + Assert.AreEqual(2, typeInfo.Indexes.Count); + else + Assert.AreEqual(3, typeInfo.Indexes.Count); + Assert.IsNotNull(typeInfo.Indexes["Author.IX_PENNAME"]); + Assert.IsNotNull(typeInfo.Indexes[0]); + Assert.AreEqual(typeInfo.Indexes[0], typeInfo.Indexes["Author.IX_PENNAME"]); + Assert.AreEqual(1, typeInfo.Indexes[0].KeyColumns.Count); + Assert.IsNotNull(typeInfo.Indexes[0].KeyColumns[0]); + Assert.AreEqual(typeInfo.Columns["PenName"], typeInfo.Indexes[0].KeyColumns[0].Key); + } + + #endregion + + #region Book + + typeInfo = domain.Model.Types[typeof (Book)]; + Assert.IsNotNull(typeInfo); + Assert.IsNotNull(domain.Model.Types["Book"]); + Assert.AreEqual(typeInfo, domain.Model.Types["Book"]); + Assert.AreEqual(typeInfo.Name, "Book"); + + // Fields + Assert.IsNotNull(typeInfo.Fields["Isbn"]); + Assert.AreEqual(typeInfo.Fields["Isbn"].Name, "Isbn"); + Assert.AreEqual(typeInfo.Fields["Isbn"].Length, 32); + // Assert.AreEqual(book.Fields["Isbn"].Indexes[0], book.Key); + + Assert.IsNotNull(typeInfo.Fields["Title"]); + Assert.AreEqual(typeInfo.Fields["Title"].Name, "Title"); + Assert.AreEqual(typeInfo.Fields["Title"].Length, 128); + + Assert.IsNotNull(typeInfo.Fields["Author"]); + Assert.AreEqual(typeInfo.Fields["Author"].Name, "Author"); + Assert.IsFalse(typeInfo.Fields["Author"].IsStructure); + Assert.IsTrue(typeInfo.Fields["Author"].IsEntity); + Assert.IsFalse(typeInfo.Fields["Author"].IsEntitySet); + Assert.AreEqual(OnRemoveAction.Deny, typeInfo.Fields["Author"].Associations.Last().OnTargetRemove); + + // Indexes + Assert.AreEqual(6, typeInfo.Indexes.Count); + Assert.IsNotNull(typeInfo.Indexes["PK_Book"]); + Assert.IsTrue(typeInfo.Indexes["PK_Book"].IsPrimary); + Assert.IsTrue(typeInfo.Indexes["PK_Book"].IsUnique); + Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_Book"].KeyColumns.Count); + Assert.AreEqual("Isbn", typeInfo.Indexes["PK_Book"].KeyColumns[0].Key.Name); + Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_Book"].KeyColumns[0].Value); + + Assert.IsNotNull(typeInfo.Indexes["Book.FK_Author"]); + Assert.IsFalse(typeInfo.Indexes["Book.FK_Author"].IsPrimary); + Assert.IsFalse(typeInfo.Indexes["Book.FK_Author"].IsUnique); + Assert.AreEqual(domain.Model.Types[typeof(Author)].Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["Book.FK_Author"].KeyColumns.Count); + Assert.AreEqual("BookAuthor", typeInfo.Indexes["Book.FK_Author"].KeyColumns[0].Key.Name); + Assert.AreEqual(Direction.Positive, typeInfo.Indexes["Book.FK_Author"].KeyColumns[0].Value); + + Assert.IsNotNull(typeInfo.Indexes["Book.IX_Title"]); + Assert.IsFalse(typeInfo.Indexes["Book.IX_Title"].IsPrimary); + Assert.IsFalse(typeInfo.Indexes["Book.IX_Title"].IsUnique); + Assert.AreEqual(1, typeInfo.Indexes["Book.IX_Title"].KeyColumns.Count); + Assert.AreEqual("Title", typeInfo.Indexes["Book.IX_Title"].KeyColumns[0].Key.Name); + Assert.AreEqual(Direction.Positive, typeInfo.Indexes["Book.IX_Title"].KeyColumns[0].Value); + + #endregion + + #region BookReview + + typeInfo = domain.Model.Types[typeof (BookReview)]; + Assert.IsNotNull(typeInfo); + Assert.IsNotNull(domain.Model.Types["BookReview"]); + Assert.AreEqual(typeInfo, domain.Model.Types["BookReview"]); + Assert.AreEqual("BookReview", typeInfo.Name); + + // Fields + Assert.IsNotNull(typeInfo.Fields["Book"]); + Assert.AreEqual("Book", typeInfo.Fields["Book"].Name); + Assert.AreEqual(OnRemoveAction.Cascade, typeInfo.Fields["Book"].Associations.Last().OnTargetRemove); + + Assert.IsNotNull(typeInfo.Fields["Reviewer"]); + Assert.AreEqual("Reviewer", typeInfo.Fields["Reviewer"].Name); + Assert.AreEqual(OnRemoveAction.Clear, typeInfo.Fields["Reviewer"].Associations.Last().OnTargetRemove); + + Assert.IsNotNull(typeInfo.Fields["Text"]); + Assert.AreEqual("Text", typeInfo.Fields["Text"].Name); + Assert.AreEqual(4096, typeInfo.Fields["Text"].Length); + + // Indexes + Assert.AreEqual(6, typeInfo.Indexes.Count); + Assert.IsNotNull(typeInfo.Indexes["PK_BookReview"]); + Assert.IsTrue(typeInfo.Indexes["PK_BookReview"].IsPrimary); + Assert.IsTrue(typeInfo.Indexes["PK_BookReview"].IsUnique); + Assert.AreEqual(typeInfo.Hierarchy.Key.TupleDescriptor.Count, typeInfo.Indexes["PK_BookReview"].KeyColumns.Count); + Assert.AreEqual("Book", typeInfo.Indexes["PK_BookReview"].KeyColumns[0].Key.Name); + Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_BookReview"].KeyColumns[0].Value); +// Assert.AreEqual("Reviewer.PassportNumber", typeInfo.Indexes["PK_BookReview"].KeyColumns[1].Key.Name); +// Assert.AreEqual(Direction.Positive, typeInfo.Indexes["PK_BookReview"].KeyColumns[1].Value); + + #endregion + } + + [Test] + public void DuplicatedKeyTest() + { + using (var session = Domain.OpenSession()) { + Book book1; + using (session.OpenTransaction()) { + book1 = new Book("0976470705"); + book1.Remove(); + Session.Current.SaveChanges(); + Book book2 = new Book("0976470705"); + book2.Remove(); + + var k = Key.Create(Domain, "0976470705").Format(); + var key = Key.Parse(Domain, k); + Assert.AreEqual(key, Key.Create(Domain, "0976470705")); + + Assert.IsNull(session.Query.SingleOrDefault(Key.Create(Domain, "0976470705"))); + Assert.AreEqual(null, session.Query.SingleOrDefault(Key.Create(Domain, "0976470705"))); + } + } + } + + [Test] + public void ModelVerificationTest() + { +// Domain.Model.Dump(); + VerifyModel(Domain); + } + + [Test] + public void ComplexKeyTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + Book book = new Book("5-272-00040-4"); + book.Title = "Assembler"; + book.Author = new Author(); + book.Author.Passport.Card.LastName = "Jurov"; + Person reviewer = new Person(); + reviewer.Passport.Card.LastName = "Kochetov"; + reviewer.Passport.Card.FirstName = "Alexius"; + BookReview review = new BookReview(book, reviewer); + Assert.AreEqual((object) book, review.Book); + Assert.AreEqual((object) reviewer, review.Reviewer); + } + } + } + + private static bool IsConcreteTable(TypeInfo typeInfo) + { + return typeInfo.Hierarchy.InheritanceSchema==InheritanceSchema.ConcreteTable; + } + + private static bool IsSingleTable(TypeInfo typeInfo) + { + return typeInfo.Hierarchy.InheritanceSchema==InheritanceSchema.SingleTable; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Model/MultidatabaseKeysTest.cs b/Orm/Xtensive.Orm.Tests/Model/MultidatabaseKeysTest.cs index 2ea5d31a88..4eb8f34b19 100644 --- a/Orm/Xtensive.Orm.Tests/Model/MultidatabaseKeysTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/MultidatabaseKeysTest.cs @@ -1,200 +1,200 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.07 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using Database1 = Xtensive.Orm.Tests.Model.VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel1; -using Database2 = Xtensive.Orm.Tests.Model.VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel2; - -namespace Xtensive.Orm.Tests.Model -{ - namespace VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel1 - { - [HierarchyRoot] - public class PassengerCar : Entity, Database2.ICar - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int MaxSpeed { get; set; } - } - - [HierarchyRoot] - public class Truck : Entity, Database2.ICar - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int MaxSpeed { get; set; } - } - - [HierarchyRoot] - public class VehiclePassport : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Database2.ICar Vehicle { get; set; } - } - - [HierarchyRoot] - public class Base1MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string NameField { get; set; } - } - - [HierarchyRoot] - public class Base1MyAnotherEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string NameField { get; set; } - } - } - - namespace VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel2 - { - public interface ICar : IEntity - { - int Id { get; } - - int MaxSpeed { get; } - } - - [HierarchyRoot] - public class Base2MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string NameField { get; set; } - } - - [HierarchyRoot] - public class SportCar : Entity, ICar - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int MaxSpeed { get; set; } - } - } - - [TestFixture] - public class MultidatabaseKeysTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "MultidatabaseKeysTestDomain"); - configuration.ConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; - configuration.Types.Register(typeof (Database1.Base1MyEntity).Assembly, typeof (Database1.Base1MyEntity).Namespace); - configuration.Types.Register(typeof (Database2.Base2MyEntity).Assembly, typeof (Database2.Base2MyEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - } - - protected override void PopulateData() - { - var aaa = new []{"a","b","c","d","e","f","g","h","i"}; - using (var session = Domain.OpenSession().Activate()) - using (var transaction = session.Session.OpenTransaction()) { - foreach (var s in aaa) { - new Database1.Base1MyEntity {NameField = s}; - new Database2.Base2MyEntity {NameField = s}; - new Database1.Base1MyAnotherEntity {NameField = s}; - } - for (var i = 0; i < 500; i++) { - new Database1.PassengerCar {MaxSpeed = i}; - new Database1.Truck {MaxSpeed = i}; - new Database2.SportCar {MaxSpeed = i * 2}; - } - transaction.Complete(); - } - } - - [Test] - public void EqualityIdentifiersAreEqualTest() - { - TypeInfo base1MyEntity; - Domain.Model.Types.TryGetValue(typeof (Database1.Base1MyEntity), out base1MyEntity); - TypeInfo base1AnotherEntity; - Domain.Model.Types.TryGetValue(typeof (Database1.Base1MyAnotherEntity), out base1AnotherEntity); - TypeInfo base2MyEntity; - Domain.Model.Types.TryGetValue(typeof (Database2.Base2MyEntity), out base2MyEntity); - - Assert.AreEqual(base1MyEntity.Key.EqualityIdentifier.Equals(base2MyEntity.Key.EqualityIdentifier), true); - Assert.AreEqual(base1MyEntity.Key.EqualityIdentifier.Equals(base1AnotherEntity.Key.EqualityIdentifier), true); - } - - [Test] - public void IntersectionOfGeneratedKeysTest() - { - using (var session = Domain.OpenSession().Activate()) - using (var transaction = session.Session.OpenTransaction()) { - var allBase1Entities = session.Session.Query.All().Select(el=>el.Id); - var allBase1Ids = session.Session.Query.All().Select(el => el.Id).Union(allBase1Entities); - var allBase2Ids = session.Session.Query.All().Select(el => el.Id); - Assert.AreEqual(allBase1Ids.Intersect(allBase2Ids).Count(), 0); - } - using (var session = Domain.OpenSession().Activate()) - using (var transaction = session.Session.OpenTransaction()) { - var grouping = session.Session.Query.All().GroupBy(el => el.Id); - foreach (var group in grouping) - Assert.AreEqual(1, group.Count()); - } - } - - [Test] - public void SelectAllInstancesWhichImplementInterfaceTest() - { - using (var session = Domain.OpenSession().Activate()) - using (var transaction = session.Session.OpenTransaction()) { - var query = session.Session.Query.All(); - Assert.AreEqual(query.Count(), 1500); - } - } - - [Test] - public void SameSeedValueInDifferentKeyGeneratorsTest() - { - var configuration = LoadDomainConfiguration("AppConfigTest", "MultidatabaseKeysTestDomain1"); - configuration.ConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; - configuration.Types.Register(typeof (Database1.Base1MyEntity).Assembly, typeof (Database1.Base1MyEntity).Namespace); - configuration.Types.Register(typeof (Database2.Base2MyEntity).Assembly, typeof (Database2.Base2MyEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - Assert.Throws(() => BuildDomain(configuration)); - } - - [Test] - public void AdditionValueFromAnotheDatabaseTest() - { - using (var session = Domain.OpenSession().Activate()) - using (var transaction = session.Session.OpenTransaction()) { - var sportCar = session.Session.Query.All().First(el => el is Database2.SportCar); - new Database1.VehiclePassport {Vehicle = sportCar}; - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.07 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using Database1 = Xtensive.Orm.Tests.Model.VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel1; +using Database2 = Xtensive.Orm.Tests.Model.VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel2; + +namespace Xtensive.Orm.Tests.Model +{ + namespace VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel1 + { + [HierarchyRoot] + public class PassengerCar : Entity, Database2.ICar + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int MaxSpeed { get; set; } + } + + [HierarchyRoot] + public class Truck : Entity, Database2.ICar + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int MaxSpeed { get; set; } + } + + [HierarchyRoot] + public class VehiclePassport : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Database2.ICar Vehicle { get; set; } + } + + [HierarchyRoot] + public class Base1MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string NameField { get; set; } + } + + [HierarchyRoot] + public class Base1MyAnotherEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string NameField { get; set; } + } + } + + namespace VariousKeyGeneratorsByOneKeyEqualityIdentifierTestModel2 + { + public interface ICar : IEntity + { + int Id { get; } + + int MaxSpeed { get; } + } + + [HierarchyRoot] + public class Base2MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string NameField { get; set; } + } + + [HierarchyRoot] + public class SportCar : Entity, ICar + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int MaxSpeed { get; set; } + } + } + + [TestFixture] + public class MultidatabaseKeysTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "MultidatabaseKeysTestDomain"); + configuration.ConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; + configuration.Types.Register(typeof (Database1.Base1MyEntity).Assembly, typeof (Database1.Base1MyEntity).Namespace); + configuration.Types.Register(typeof (Database2.Base2MyEntity).Assembly, typeof (Database2.Base2MyEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + } + + protected override void PopulateData() + { + var aaa = new []{"a","b","c","d","e","f","g","h","i"}; + using (var session = Domain.OpenSession().Activate()) + using (var transaction = session.Session.OpenTransaction()) { + foreach (var s in aaa) { + new Database1.Base1MyEntity {NameField = s}; + new Database2.Base2MyEntity {NameField = s}; + new Database1.Base1MyAnotherEntity {NameField = s}; + } + for (var i = 0; i < 500; i++) { + new Database1.PassengerCar {MaxSpeed = i}; + new Database1.Truck {MaxSpeed = i}; + new Database2.SportCar {MaxSpeed = i * 2}; + } + transaction.Complete(); + } + } + + [Test] + public void EqualityIdentifiersAreEqualTest() + { + TypeInfo base1MyEntity; + Domain.Model.Types.TryGetValue(typeof (Database1.Base1MyEntity), out base1MyEntity); + TypeInfo base1AnotherEntity; + Domain.Model.Types.TryGetValue(typeof (Database1.Base1MyAnotherEntity), out base1AnotherEntity); + TypeInfo base2MyEntity; + Domain.Model.Types.TryGetValue(typeof (Database2.Base2MyEntity), out base2MyEntity); + + Assert.AreEqual(base1MyEntity.Key.EqualityIdentifier.Equals(base2MyEntity.Key.EqualityIdentifier), true); + Assert.AreEqual(base1MyEntity.Key.EqualityIdentifier.Equals(base1AnotherEntity.Key.EqualityIdentifier), true); + } + + [Test] + public void IntersectionOfGeneratedKeysTest() + { + using (var session = Domain.OpenSession().Activate()) + using (var transaction = session.Session.OpenTransaction()) { + var allBase1Entities = session.Session.Query.All().Select(el=>el.Id); + var allBase1Ids = session.Session.Query.All().Select(el => el.Id).Union(allBase1Entities); + var allBase2Ids = session.Session.Query.All().Select(el => el.Id); + Assert.AreEqual(allBase1Ids.Intersect(allBase2Ids).Count(), 0); + } + using (var session = Domain.OpenSession().Activate()) + using (var transaction = session.Session.OpenTransaction()) { + var grouping = session.Session.Query.All().GroupBy(el => el.Id); + foreach (var group in grouping) + Assert.AreEqual(1, group.Count()); + } + } + + [Test] + public void SelectAllInstancesWhichImplementInterfaceTest() + { + using (var session = Domain.OpenSession().Activate()) + using (var transaction = session.Session.OpenTransaction()) { + var query = session.Session.Query.All(); + Assert.AreEqual(query.Count(), 1500); + } + } + + [Test] + public void SameSeedValueInDifferentKeyGeneratorsTest() + { + var configuration = LoadDomainConfiguration("AppConfigTest", "MultidatabaseKeysTestDomain1"); + configuration.ConnectionInfo = DomainConfigurationFactory.Create().ConnectionInfo; + configuration.Types.Register(typeof (Database1.Base1MyEntity).Assembly, typeof (Database1.Base1MyEntity).Namespace); + configuration.Types.Register(typeof (Database2.Base2MyEntity).Assembly, typeof (Database2.Base2MyEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + Assert.Throws(() => BuildDomain(configuration)); + } + + [Test] + public void AdditionValueFromAnotheDatabaseTest() + { + using (var session = Domain.OpenSession().Activate()) + using (var transaction = session.Session.OpenTransaction()) { + var sportCar = session.Session.Query.All().First(el => el is Database2.SportCar); + new Database1.VehiclePassport {Vehicle = sportCar}; + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Model/NonPublicFieldTest.cs b/Orm/Xtensive.Orm.Tests/Model/NonPublicFieldTest.cs index 059b1c6bd2..cb7c1c8484 100644 --- a/Orm/Xtensive.Orm.Tests/Model/NonPublicFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/NonPublicFieldTest.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.14 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.NonPublicFieldTestModel; - -namespace Xtensive.Orm.Tests.Model.NonPublicFieldTestModel -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string PublicField { get; set;} - - [Field] - internal string InternalField { get; set; } - - [Field] - private string PrivateField { get; set; } - - [Field] - public string ReadOnlyField { get; private set; } - - public void SetState() - { - PublicField = "public"; - InternalField = "internal"; - PrivateField = "private"; - } - - public bool ValidateState() - { - return PublicField=="public" && InternalField=="internal" && PrivateField=="private"; - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class NonPublicFieldTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var myEntity = new MyEntity(); - key = myEntity.Key; - myEntity.SetState(); - - t.Complete(); - } - } - - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var myEntity = session.Query.Single(key); - Assert.IsTrue(myEntity.ValidateState()); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.14 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.NonPublicFieldTestModel; + +namespace Xtensive.Orm.Tests.Model.NonPublicFieldTestModel +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string PublicField { get; set;} + + [Field] + internal string InternalField { get; set; } + + [Field] + private string PrivateField { get; set; } + + [Field] + public string ReadOnlyField { get; private set; } + + public void SetState() + { + PublicField = "public"; + InternalField = "internal"; + PrivateField = "private"; + } + + public bool ValidateState() + { + return PublicField=="public" && InternalField=="internal" && PrivateField=="private"; + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class NonPublicFieldTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (MyEntity).Assembly, typeof (MyEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var myEntity = new MyEntity(); + key = myEntity.Key; + myEntity.SetState(); + + t.Complete(); + } + } + + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var myEntity = session.Query.Single(key); + Assert.IsTrue(myEntity.ValidateState()); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/OnRemoveActionForNonPairedAssociationsTest.cs b/Orm/Xtensive.Orm.Tests/Model/OnRemoveActionForNonPairedAssociationsTest.cs index 95466e0cd1..f40877081a 100644 --- a/Orm/Xtensive.Orm.Tests/Model/OnRemoveActionForNonPairedAssociationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/OnRemoveActionForNonPairedAssociationsTest.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.04.26 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.OnRemoveActionForNonPairedAssociationsTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace OnRemoveActionForNonPairedAssociationsTestModel - { - [HierarchyRoot] - public class Owner : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public Target T1 { get; set; } - - [Field] - public EntitySet T2 { get; set; } - } - - [HierarchyRoot] - public class Target : Entity - { - [Field, Key] - public int Id { get; private set; } - } - } - - public class OnRemoveActionForNonPairedAssociationsTest : AutoBuildTest - { - private Key o1Key; - private Key o2Key; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var o1 = new Owner {T1 = new Target()}; - var o2 = new Owner {T2 = {new Target()}}; - o1Key = o1.Key; - o2Key = o2.Key; - tx.Complete(); - } - } - - [Test] - public void RemoveO1Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var o1 = Query.Single(o1Key); - o1.Remove(); - tx.Complete(); - } - } - - [Test] - public void RemoveO2Test() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var o2 = Query.Single(o2Key); - o2.Remove(); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.04.26 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.OnRemoveActionForNonPairedAssociationsTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace OnRemoveActionForNonPairedAssociationsTestModel + { + [HierarchyRoot] + public class Owner : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public Target T1 { get; set; } + + [Field] + public EntitySet T2 { get; set; } + } + + [HierarchyRoot] + public class Target : Entity + { + [Field, Key] + public int Id { get; private set; } + } + } + + public class OnRemoveActionForNonPairedAssociationsTest : AutoBuildTest + { + private Key o1Key; + private Key o2Key; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Owner).Assembly, typeof (Owner).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var o1 = new Owner {T1 = new Target()}; + var o2 = new Owner {T2 = {new Target()}}; + o1Key = o1.Key; + o2Key = o2.Key; + tx.Complete(); + } + } + + [Test] + public void RemoveO1Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var o1 = Query.Single(o1Key); + o1.Remove(); + tx.Complete(); + } + } + + [Test] + public void RemoveO2Test() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var o2 = Query.Single(o2Key); + o2.Remove(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/PairTest.cs b/Orm/Xtensive.Orm.Tests/Model/PairTest.cs index c224d082b2..b495d91851 100644 --- a/Orm/Xtensive.Orm.Tests/Model/PairTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/PairTest.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.10.09 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests.PairModel; - -namespace Xtensive.Orm.Tests.PairModel -{ - [Serializable] - [HierarchyRoot] - public class Master : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public Slave Slave { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Slave : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field , Association(PairTo = "Slave")] - public Master Master { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class PairTest : AutoBuildTest - { - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Master).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Master m1 = new Master(); - m1.Slave = new Slave(); - Assert.AreEqual(m1, m1.Slave.Master); - Master m2 = new Master(); - m2.Slave = new Slave(); - Assert.AreEqual(m2, m2.Slave.Master); - Slave s1 = m1.Slave; - Slave s2 = m2.Slave; - m1.Slave = m2.Slave; - Assert.IsNull(m2.Slave); - Assert.IsNull(s1.Master); - Assert.AreEqual(m1.Slave, s2); - Assert.AreEqual(m1, s2.Master); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.10.09 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests.PairModel; + +namespace Xtensive.Orm.Tests.PairModel +{ + [Serializable] + [HierarchyRoot] + public class Master : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public Slave Slave { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Slave : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field , Association(PairTo = "Slave")] + public Master Master { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class PairTest : AutoBuildTest + { + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(Master).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Master m1 = new Master(); + m1.Slave = new Slave(); + Assert.AreEqual(m1, m1.Slave.Master); + Master m2 = new Master(); + m2.Slave = new Slave(); + Assert.AreEqual(m2, m2.Slave.Master); + Slave s1 = m1.Slave; + Slave s2 = m2.Slave; + m1.Slave = m2.Slave; + Assert.IsNull(m2.Slave); + Assert.IsNull(s1.Master); + Assert.AreEqual(m1.Slave, s2); + Assert.AreEqual(m1, s2.Master); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/PersistentPropertyWeavingTest.cs b/Orm/Xtensive.Orm.Tests/Model/PersistentPropertyWeavingTest.cs index 5f146189ea..355b99958d 100644 --- a/Orm/Xtensive.Orm.Tests/Model/PersistentPropertyWeavingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/PersistentPropertyWeavingTest.cs @@ -1,303 +1,303 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.13 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.PersistentPropertyWeavingTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace PersistentPropertyWeavingTestModel - { - [HierarchyRoot] - public class Base : Entity - { - [Key, Field] - public long Id { get; private set; } - } - - // Override virtual property - - public class OverrideFieldBase : Base - { - [Field] - public virtual string Value { get; set; } - } - - public class OverrideField : OverrideFieldBase - { - public override string Value { get; set; } - } - - public class GenericOverrideFieldBase : Base - { - [Field] - public virtual T Value { get; set; } - } - - public class GenericOverrideField : GenericOverrideFieldBase - { - public override string Value { get; set; } - } - - public class GenericOverrideField : GenericOverrideFieldBase - { - public override T Value { get; set; } - } - - // Implement persistent interface property - - public interface IImplementField : IEntity - { - [Field] - string Value { get; set; } - } - - public class ImplementField : Base, IImplementField - { - public string Value { get; set; } - } - - public interface IGenericImplementField : IEntity - { - [Field] - T Value { get; set; } - } - - public class GenericImplementField : Base, IGenericImplementField - { - public string Value { get; set; } - } - - public class GenericImplementField : Base, IGenericImplementField - { - public T Value { get; set; } - } - - // Implement non-persistent interface property - - public interface INonPersistentImplementField - { - [Field] - string Value { get; set; } - } - - public class NonPersistentImplementField : Base, INonPersistentImplementField - { - public string Value { get; set; } - } - - public interface INonPersistentGenericImplementField - { - [Field] - T Value { get; set; } - } - - public class NonPersistentGenericImplementField : Base, INonPersistentGenericImplementField - { - public string Value { get; set; } - } - - public class NonPersistentGenericImplementField : Base, INonPersistentGenericImplementField - { - public T Value { get; set; } - } - - // New property - - public class NewFieldBase : Base - { - [Field] - public string PersistentValue { get; set; } - - [Field] - public virtual string PersistentVirtualValue { get; set; } - - public string NonPersistentValue { get; set; } - - public static string NonPersistentStaticValue { get; set; } - } - - public class PersistentNewField : NewFieldBase - { - [Field] - public new string PersistentValue { get; set; } - - [Field] - public new string PersistentVirtualValue { get; set; } - - [Field] - public new string NonPersistentValue { get; set; } - - [Field] - public new string NonPersistentStaticValue { get; set; } - } - - public class NonPersistentNewField : NewFieldBase - { - public new string PersistentValue { get; set; } - - public new string PersistentVirtualValue { get; set; } - - public new string NonPersistentValue { get; set; } - - public new string NonPersistentStaticValue { get; set; } - } - } - - [TestFixture] - public class PersistentPropertyWeavingTest : AutoBuildTest - { - private const string Hello = "Hello"; - private const string Hello1 = "Hello1"; - private const string Hello2 = "Hello2"; - private const string Hello3 = "Hello3"; - private const string Hello4 = "Hello4"; - private const string Hello5 = "Hello5"; - private const string Hello6 = "Hello6"; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); - configuration.Types.Register(typeof (GenericOverrideField)); - configuration.Types.Register(typeof (GenericImplementField)); - configuration.Types.Register(typeof (NonPersistentGenericImplementField)); - return configuration; - } - - [Test] - public void OverrideFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void GenericOverrideFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void GenericOverrideFieldTest2() - { - ExecuteTest>( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void ImplementFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void GenericImplementFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void GenericImplementFieldTest2() - { - ExecuteTest>( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void NonPersistentImplementFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void NonPersistentGenericImplementFieldTest() - { - ExecuteTest( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void NonPersistentGenericImplementFieldTest2() - { - ExecuteTest>( - e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); - } - - [Test] - public void PersistentNewFieldTest() - { - ExecuteTest( - entity => { - var baseEntity = (NewFieldBase) entity; - baseEntity.PersistentValue = Hello1; - baseEntity.PersistentVirtualValue = Hello2; - entity.PersistentValue = Hello3; - entity.PersistentVirtualValue = Hello4; - entity.NonPersistentValue = Hello5; - entity.NonPersistentStaticValue = Hello6; - }, - entity => { - var baseEntity = (NewFieldBase) entity; - Assert.That(baseEntity.PersistentValue, Is.EqualTo(Hello1)); - Assert.That(baseEntity.PersistentVirtualValue, Is.EqualTo(Hello2)); - Assert.That(entity.PersistentValue, Is.EqualTo(Hello3)); - Assert.That(entity.PersistentVirtualValue, Is.EqualTo(Hello4)); - Assert.That(entity.NonPersistentValue, Is.EqualTo(Hello5)); - Assert.That(entity.NonPersistentStaticValue, Is.EqualTo(Hello6)); - }); - } - - [Test] - public void NonPersistentNewFieldTest() - { - ExecuteTest( - entity => { - var baseEntity = (NewFieldBase) entity; - baseEntity.PersistentValue = Hello1; - baseEntity.PersistentVirtualValue = Hello2; - entity.PersistentValue = Hello3; - entity.PersistentVirtualValue = Hello4; - entity.NonPersistentValue = Hello5; - entity.NonPersistentStaticValue = Hello6; - }, - entity => { - var baseEntity = (NewFieldBase) entity; - Assert.That(baseEntity.PersistentValue, Is.EqualTo(Hello1)); - Assert.That(baseEntity.PersistentVirtualValue, Is.EqualTo(Hello2)); - Assert.That(entity.PersistentValue, Is.EqualTo(null)); - Assert.That(entity.PersistentVirtualValue, Is.EqualTo(null)); - Assert.That(entity.NonPersistentValue, Is.EqualTo(null)); - Assert.That(entity.NonPersistentStaticValue, Is.EqualTo(null)); - }); - } - - private void ExecuteTest(Action initializer, Action checker) - where T : Entity, new() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = new T(); - initializer.Invoke(entity); - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = session.Query.All().Single(); - checker.Invoke(entity); - tx.Complete(); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.13 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.PersistentPropertyWeavingTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace PersistentPropertyWeavingTestModel + { + [HierarchyRoot] + public class Base : Entity + { + [Key, Field] + public long Id { get; private set; } + } + + // Override virtual property + + public class OverrideFieldBase : Base + { + [Field] + public virtual string Value { get; set; } + } + + public class OverrideField : OverrideFieldBase + { + public override string Value { get; set; } + } + + public class GenericOverrideFieldBase : Base + { + [Field] + public virtual T Value { get; set; } + } + + public class GenericOverrideField : GenericOverrideFieldBase + { + public override string Value { get; set; } + } + + public class GenericOverrideField : GenericOverrideFieldBase + { + public override T Value { get; set; } + } + + // Implement persistent interface property + + public interface IImplementField : IEntity + { + [Field] + string Value { get; set; } + } + + public class ImplementField : Base, IImplementField + { + public string Value { get; set; } + } + + public interface IGenericImplementField : IEntity + { + [Field] + T Value { get; set; } + } + + public class GenericImplementField : Base, IGenericImplementField + { + public string Value { get; set; } + } + + public class GenericImplementField : Base, IGenericImplementField + { + public T Value { get; set; } + } + + // Implement non-persistent interface property + + public interface INonPersistentImplementField + { + [Field] + string Value { get; set; } + } + + public class NonPersistentImplementField : Base, INonPersistentImplementField + { + public string Value { get; set; } + } + + public interface INonPersistentGenericImplementField + { + [Field] + T Value { get; set; } + } + + public class NonPersistentGenericImplementField : Base, INonPersistentGenericImplementField + { + public string Value { get; set; } + } + + public class NonPersistentGenericImplementField : Base, INonPersistentGenericImplementField + { + public T Value { get; set; } + } + + // New property + + public class NewFieldBase : Base + { + [Field] + public string PersistentValue { get; set; } + + [Field] + public virtual string PersistentVirtualValue { get; set; } + + public string NonPersistentValue { get; set; } + + public static string NonPersistentStaticValue { get; set; } + } + + public class PersistentNewField : NewFieldBase + { + [Field] + public new string PersistentValue { get; set; } + + [Field] + public new string PersistentVirtualValue { get; set; } + + [Field] + public new string NonPersistentValue { get; set; } + + [Field] + public new string NonPersistentStaticValue { get; set; } + } + + public class NonPersistentNewField : NewFieldBase + { + public new string PersistentValue { get; set; } + + public new string PersistentVirtualValue { get; set; } + + public new string NonPersistentValue { get; set; } + + public new string NonPersistentStaticValue { get; set; } + } + } + + [TestFixture] + public class PersistentPropertyWeavingTest : AutoBuildTest + { + private const string Hello = "Hello"; + private const string Hello1 = "Hello1"; + private const string Hello2 = "Hello2"; + private const string Hello3 = "Hello3"; + private const string Hello4 = "Hello4"; + private const string Hello5 = "Hello5"; + private const string Hello6 = "Hello6"; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Base).Assembly, typeof (Base).Namespace); + configuration.Types.Register(typeof (GenericOverrideField)); + configuration.Types.Register(typeof (GenericImplementField)); + configuration.Types.Register(typeof (NonPersistentGenericImplementField)); + return configuration; + } + + [Test] + public void OverrideFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void GenericOverrideFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void GenericOverrideFieldTest2() + { + ExecuteTest>( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void ImplementFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void GenericImplementFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void GenericImplementFieldTest2() + { + ExecuteTest>( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void NonPersistentImplementFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void NonPersistentGenericImplementFieldTest() + { + ExecuteTest( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void NonPersistentGenericImplementFieldTest2() + { + ExecuteTest>( + e => e.Value = Hello, e => Assert.That(e.Value, Is.EqualTo(Hello))); + } + + [Test] + public void PersistentNewFieldTest() + { + ExecuteTest( + entity => { + var baseEntity = (NewFieldBase) entity; + baseEntity.PersistentValue = Hello1; + baseEntity.PersistentVirtualValue = Hello2; + entity.PersistentValue = Hello3; + entity.PersistentVirtualValue = Hello4; + entity.NonPersistentValue = Hello5; + entity.NonPersistentStaticValue = Hello6; + }, + entity => { + var baseEntity = (NewFieldBase) entity; + Assert.That(baseEntity.PersistentValue, Is.EqualTo(Hello1)); + Assert.That(baseEntity.PersistentVirtualValue, Is.EqualTo(Hello2)); + Assert.That(entity.PersistentValue, Is.EqualTo(Hello3)); + Assert.That(entity.PersistentVirtualValue, Is.EqualTo(Hello4)); + Assert.That(entity.NonPersistentValue, Is.EqualTo(Hello5)); + Assert.That(entity.NonPersistentStaticValue, Is.EqualTo(Hello6)); + }); + } + + [Test] + public void NonPersistentNewFieldTest() + { + ExecuteTest( + entity => { + var baseEntity = (NewFieldBase) entity; + baseEntity.PersistentValue = Hello1; + baseEntity.PersistentVirtualValue = Hello2; + entity.PersistentValue = Hello3; + entity.PersistentVirtualValue = Hello4; + entity.NonPersistentValue = Hello5; + entity.NonPersistentStaticValue = Hello6; + }, + entity => { + var baseEntity = (NewFieldBase) entity; + Assert.That(baseEntity.PersistentValue, Is.EqualTo(Hello1)); + Assert.That(baseEntity.PersistentVirtualValue, Is.EqualTo(Hello2)); + Assert.That(entity.PersistentValue, Is.EqualTo(null)); + Assert.That(entity.PersistentVirtualValue, Is.EqualTo(null)); + Assert.That(entity.NonPersistentValue, Is.EqualTo(null)); + Assert.That(entity.NonPersistentStaticValue, Is.EqualTo(null)); + }); + } + + private void ExecuteTest(Action initializer, Action checker) + where T : Entity, new() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = new T(); + initializer.Invoke(entity); + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = session.Query.All().Single(); + checker.Invoke(entity); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/ReferencedKeys.cs b/Orm/Xtensive.Orm.Tests/Model/ReferencedKeys.cs index 609b8c93ac..c126d361cd 100644 --- a/Orm/Xtensive.Orm.Tests/Model/ReferencedKeys.cs +++ b/Orm/Xtensive.Orm.Tests/Model/ReferencedKeys.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.04.01 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.ReferencedKeysModel; - -namespace Xtensive.Orm.Tests.Model.ReferencedKeysModel -{ - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class Country : Entity - { - [Key, Field(Length = 100)] - public string Name { get; private set;} - - [Field] - public City Capital { get; set; } - - public Country(string name) - : base(name) - { - } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.None)] - [HierarchyRoot] - public class City : Entity - { - [Key(0), Field] - public Country Country { get; private set;} - - [Key(1), Field(Length = 100)] - public string Name { get; private set;} - - public City(Country country, string name) - : base(country.Name, name) - { - } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class ReferencedKeys : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Country).Assembly, typeof (Country).Namespace); - return config; - } - - [Test] - public void MainTest() - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.04.01 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.ReferencedKeysModel; + +namespace Xtensive.Orm.Tests.Model.ReferencedKeysModel +{ + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class Country : Entity + { + [Key, Field(Length = 100)] + public string Name { get; private set;} + + [Field] + public City Capital { get; set; } + + public Country(string name) + : base(name) + { + } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.None)] + [HierarchyRoot] + public class City : Entity + { + [Key(0), Field] + public Country Country { get; private set;} + + [Key(1), Field(Length = 100)] + public string Name { get; private set;} + + public City(Country country, string name) + : base(country.Name, name) + { + } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class ReferencedKeys : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Country).Assembly, typeof (Country).Namespace); + return config; + } + + [Test] + public void MainTest() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/RemoveDotsAndHypensTest.cs b/Orm/Xtensive.Orm.Tests/Model/RemoveDotsAndHypensTest.cs index c5b2f7703d..3ee12ecc87 100644 --- a/Orm/Xtensive.Orm.Tests/Model/RemoveDotsAndHypensTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/RemoveDotsAndHypensTest.cs @@ -1,70 +1,70 @@ -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.RemoveDotsAndHypensTestModel; - -namespace Xtensive.Orm.Tests.Model -{ - namespace RemoveDotsAndHypensTestModel - { - [HierarchyRoot] - public class DotObject : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public DotObject Parent { get; set; } - - [Field] - public EntitySet Siblings { get; set; } - - [Field] - public ExtraInfo Info { get; set; } - - [Field] - public string Value { get; set; } - } - - public class ExtraInfo : Structure - { - [Field] - public string Name { get; set; } - } - - [HierarchyRoot] - public class MetaInfo : Entity - where T : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public string Info { get; set; } - } - } - - public class RemoveDotsAndHypensTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (DotObject).Assembly, typeof (DotObject).Namespace); - configuration.NamingConvention.NamingRules = NamingRules.RemoveHyphens | NamingRules.RemoveDots; - return configuration; - } - - [Test] - public void MainTest() - { - foreach (var type in Domain.Model.Types) { - Assert.That(type.MappingName.Contains("_"), Is.Not.True); - Assert.That(type.MappingName.Contains("-"), Is.Not.True); - - foreach (var column in type.Columns) { - Assert.That(column.Name.Contains("_"), Is.Not.True); - Assert.That(column.Name.Contains("-"), Is.Not.True); - } - } - } - } +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.RemoveDotsAndHypensTestModel; + +namespace Xtensive.Orm.Tests.Model +{ + namespace RemoveDotsAndHypensTestModel + { + [HierarchyRoot] + public class DotObject : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public DotObject Parent { get; set; } + + [Field] + public EntitySet Siblings { get; set; } + + [Field] + public ExtraInfo Info { get; set; } + + [Field] + public string Value { get; set; } + } + + public class ExtraInfo : Structure + { + [Field] + public string Name { get; set; } + } + + [HierarchyRoot] + public class MetaInfo : Entity + where T : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public string Info { get; set; } + } + } + + public class RemoveDotsAndHypensTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (DotObject).Assembly, typeof (DotObject).Namespace); + configuration.NamingConvention.NamingRules = NamingRules.RemoveHyphens | NamingRules.RemoveDots; + return configuration; + } + + [Test] + public void MainTest() + { + foreach (var type in Domain.Model.Types) { + Assert.That(type.MappingName.Contains("_"), Is.Not.True); + Assert.That(type.MappingName.Contains("-"), Is.Not.True); + + foreach (var column in type.Columns) { + Assert.That(column.Name.Contains("_"), Is.Not.True); + Assert.That(column.Name.Contains("-"), Is.Not.True); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/SelfContainedStructureTest.cs b/Orm/Xtensive.Orm.Tests/Model/SelfContainedStructureTest.cs index 5396d2d084..1991747ed8 100644 --- a/Orm/Xtensive.Orm.Tests/Model/SelfContainedStructureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/SelfContainedStructureTest.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.12.12 - -using System; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.SelfContainedStructureModel; - -namespace Xtensive.Orm.Tests.Model.SelfContainedStructureModel -{ - [Serializable] - public class SelfContained : Structure - { - [Field] - public SelfContained Value { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class SelfContainedStructureTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (SelfContained).Assembly, typeof (SelfContained).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain = null; - try { - domain = Domain.Build(configuration); - } - catch (DomainBuilderException e) { - } - return domain; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.12.12 + +using System; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.SelfContainedStructureModel; + +namespace Xtensive.Orm.Tests.Model.SelfContainedStructureModel +{ + [Serializable] + public class SelfContained : Structure + { + [Field] + public SelfContained Value { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class SelfContainedStructureTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (SelfContained).Assembly, typeof (SelfContained).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain = null; + try { + domain = Domain.Build(configuration); + } + catch (DomainBuilderException e) { + } + return domain; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/SerializationTest.cs b/Orm/Xtensive.Orm.Tests/Model/SerializationTest.cs index 85a83b4ed6..46049cb3fa 100644 --- a/Orm/Xtensive.Orm.Tests/Model/SerializationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/SerializationTest.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.05.21 - -using System.IO; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class SerializationTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - var model = Domain.Model.ToStoredModel(); - var serialized = model.Serialize(); - var result = StoredDomainModel.Deserialize(serialized); - result.UpdateReferences(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.05.21 + +using System.IO; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class SerializationTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + var model = Domain.Model.ToStoredModel(); + var serialized = model.Serialize(); + var result = StoredDomainModel.Deserialize(serialized); + result.UpdateReferences(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/StringKeyTest.cs b/Orm/Xtensive.Orm.Tests/Model/StringKeyTest.cs index 491ec715ec..8b59bd9844 100644 --- a/Orm/Xtensive.Orm.Tests/Model/StringKeyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/StringKeyTest.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.06.25 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.StringKeyTestModel; - -namespace Xtensive.Orm.Tests.Model.StringKeyTestModel -{ - [Serializable] - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Product : Entity - { - [Key, Field(Length = 100)] - public string Code { get; private set; } - - [Field(Length = 100)] - public string Name { get; set; } - - public Product(string code) : base(code) { } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - public class StringKeyTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Product)); - return config; - } - - [Test] - public void MainTest() - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.06.25 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.StringKeyTestModel; + +namespace Xtensive.Orm.Tests.Model.StringKeyTestModel +{ + [Serializable] + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Product : Entity + { + [Key, Field(Length = 100)] + public string Code { get; private set; } + + [Field(Length = 100)] + public string Name { get; set; } + + public Product(string code) : base(code) { } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + public class StringKeyTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Product)); + return config; + } + + [Test] + public void MainTest() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/StructureWithCustomConstructorTest.cs b/Orm/Xtensive.Orm.Tests/Model/StructureWithCustomConstructorTest.cs index 2aafdeda3f..ff8f7789ca 100644 --- a/Orm/Xtensive.Orm.Tests/Model/StructureWithCustomConstructorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/StructureWithCustomConstructorTest.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.04 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.StructureWithCustomConstructorTestModel; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Tests.Model -{ - namespace StructureWithCustomConstructorTestModel - { - [HierarchyRoot] - public class EntityWithStructure : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public StructureWithConstructor Value { get; private set; } - - public EntityWithStructure() - { - Value = new StructureWithConstructor("This is new"); - } - } - - public class StructureWithConstructor : Structure - { - [Field] - [NotNullOrEmptyConstraint] - public string Value { get; private set; } - - public void Set(string value) - { - Value = value ?? string.Empty; - } - - public StructureWithConstructor(string value) - { - Set(value); - } - } - } - - public class StructureWithCustomConstructorTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (EntityWithStructure)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new EntityWithStructure(); - tx.Complete(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.04 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.StructureWithCustomConstructorTestModel; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Tests.Model +{ + namespace StructureWithCustomConstructorTestModel + { + [HierarchyRoot] + public class EntityWithStructure : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public StructureWithConstructor Value { get; private set; } + + public EntityWithStructure() + { + Value = new StructureWithConstructor("This is new"); + } + } + + public class StructureWithConstructor : Structure + { + [Field] + [NotNullOrEmptyConstraint] + public string Value { get; private set; } + + public void Set(string value) + { + Value = value ?? string.Empty; + } + + public StructureWithConstructor(string value) + { + Set(value); + } + } + } + + public class StructureWithCustomConstructorTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (EntityWithStructure)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new EntityWithStructure(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/UselessTypeInTheMiddleTest.cs b/Orm/Xtensive.Orm.Tests/Model/UselessTypeInTheMiddleTest.cs index 41f1b65961..13e31c8211 100644 --- a/Orm/Xtensive.Orm.Tests/Model/UselessTypeInTheMiddleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/UselessTypeInTheMiddleTest.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.03.04 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Model.UselessTypeInTheMiddleTestModel; - -namespace Xtensive.Orm.Tests.Model.UselessTypeInTheMiddleTestModel -{ - [HierarchyRoot] - public abstract class One : Entity - { - [Key, Field] - public int Id { get; private set; } - } - - public class Two : One - { - // Absense of fields here leads to errors. - } - - public class Three : Two - { - [Field] - public int Value { get; private set; } - } - - [HierarchyRoot] - public class Referencer : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public Two Reference { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model -{ - [TestFixture] - public class UselessTypeInTheMiddleTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (One).Assembly, typeof (One).Namespace); - return configuration; - } - - [Test] - public void QueryTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var three = new Three(); - var twos = session.Query.All().ToList(); - Assert.AreEqual(1, twos.Count); - Assert.AreEqual(three, twos[0]); - } - } - - [Test] - public void CreateTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - new Referencer {Reference = new Three()}; - Session.Current.SaveChanges(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.03.04 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Model.UselessTypeInTheMiddleTestModel; + +namespace Xtensive.Orm.Tests.Model.UselessTypeInTheMiddleTestModel +{ + [HierarchyRoot] + public abstract class One : Entity + { + [Key, Field] + public int Id { get; private set; } + } + + public class Two : One + { + // Absense of fields here leads to errors. + } + + public class Three : Two + { + [Field] + public int Value { get; private set; } + } + + [HierarchyRoot] + public class Referencer : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public Two Reference { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model +{ + [TestFixture] + public class UselessTypeInTheMiddleTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (One).Assembly, typeof (One).Namespace); + return configuration; + } + + [Test] + public void QueryTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var three = new Three(); + var twos = session.Query.All().ToList(); + Assert.AreEqual(1, twos.Count); + Assert.AreEqual(three, twos[0]); + } + } + + [Test] + public void CreateTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + new Referencer {Reference = new Three()}; + Session.Current.SaveChanges(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Model/VersionInfoTest.cs b/Orm/Xtensive.Orm.Tests/Model/VersionInfoTest.cs index 4320b1afb4..79c997e536 100644 --- a/Orm/Xtensive.Orm.Tests/Model/VersionInfoTest.cs +++ b/Orm/Xtensive.Orm.Tests/Model/VersionInfoTest.cs @@ -1,229 +1,229 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.08.13 - -using System.Reflection; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using System; - -#region Models - -namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel1 -{ - [Serializable] - [HierarchyRoot] - public class Parent : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, Version] - public string ParentVersionField { get; set; } - } - - [Serializable] - public class Child : Parent - { - [Field, Version] - public string ChildVersionField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel2 -{ - [Serializable] - [HierarchyRoot] - public class Parent : Entity - { - [Key, Field, Version] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel3 -{ - [Serializable] - [HierarchyRoot] - public class Parent : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(LazyLoad = true), Version] - public string ReferenceField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel -{ - [Serializable] - [HierarchyRoot] - public class Parent : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, Version] - public string ParentVersionField { get; set; } - - [Field] - public string ParentNonVersionField { get; set; } - } - - [Serializable] - public class Child : Parent - { - [Field] - public string ChildNonVersionField { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Simple : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public string NonLazyField1 { get; set; } - - [Field] - public int NonLazyField2 { get; set; } - - [Field] - public SimpleStructure StructureField { get; set; } - - [Field(LazyLoad = true)] - public string LazyField { get; set; } - - [Field] - public Simple ReferenceField { get; set; } - - [Field] - public EntitySet CollectionField { get; private set; } - - [Field] - public byte[] ByteArrayField { get; set; } - } - - [Serializable] - public class SimpleStructure : Structure - { - [Field] - public string NonLazyField { get; set; } - - [Field(LazyLoad = true)] - public string LazyField { get; set; } - - [Field] - public Simple ReferenceField { get; set; } - } -} - -#endregion - -namespace Xtensive.Orm.Tests.Model -{ - using VersionInfoTests.ValidModel; - - [TestFixture] - public class VersionInfoTest - { - [OneTimeSetUp] - public void TestFixtureSetUp() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - - public Domain BuildDomain(string @namespace) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(Assembly.GetExecutingAssembly(), @namespace); - return Domain.Build(configuration); - } - - [Test] - [Ignore("")] - [Obsolete] - public void RootOnlyVersionTest() - { - AssertEx.Throws(() => - BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel1")); - } - - [Test] - public void DenyKeyFieldsTest() - { - AssertEx.Throws(() => - BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel2")); - } - - [Test] - public void DenyLazyLoadFieldsTest() - { - AssertEx.Throws(() => - BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel3")); - } - - [Test] - public void VersionFieldsTest() - { - var domain = BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel"); - var model = domain.Model; - - var parentType = model.Types[typeof (Parent)]; - Assert.IsTrue(parentType.GetVersionFields().Any(field => field==parentType.Fields["ParentVersionField"])); - Assert.IsFalse(parentType.GetVersionFields().Any(field => field==parentType.Fields["ParentNonVersionField"])); - - var childType = model.Types[typeof (Child)]; - Assert.IsTrue(childType.GetVersionFields().Any(field => field==childType.Fields["ParentVersionField"])); - Assert.IsFalse(childType.GetVersionFields().Any(field => field==childType.Fields["ParentNonVersionField"])); - Assert.IsFalse(childType.GetVersionFields().Any(field => field==childType.Fields["ChildNonVersionField"])); - - var simpleType = model.Types[typeof (Simple)]; - Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["NonLazyField1"])); - Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["NonLazyField2"])); - Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["ReferenceField.Id"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["Id"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["TypeId"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["LazyField"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["CollectionField"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField"])); - Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.NonLazyField"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.LazyField"])); - Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.ReferenceField.Id"])); - Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["ByteArrayField"])); - } - - [Test] - public void SerializeVersionInfoTest() - { - var domain = BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel"); - Key key; - VersionInfo version; - - using (var session = domain.OpenSession()) { - using (var transactionScope = session.OpenTransaction()) { - var instance = new Simple(); - instance.NonLazyField1 = "Value"; - instance.NonLazyField2 = 123; - instance.StructureField = new SimpleStructure {NonLazyField = "Value"}; - instance.ReferenceField = instance; - version = instance.VersionInfo; - transactionScope.Complete(); - } - } - - Assert.IsFalse(version.IsVoid); - var versionClone = Cloner.Clone(version); - Assert.IsFalse(versionClone.IsVoid); - Assert.IsTrue(version.Equals(versionClone)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.08.13 + +using System.Reflection; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using System; + +#region Models + +namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel1 +{ + [Serializable] + [HierarchyRoot] + public class Parent : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, Version] + public string ParentVersionField { get; set; } + } + + [Serializable] + public class Child : Parent + { + [Field, Version] + public string ChildVersionField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel2 +{ + [Serializable] + [HierarchyRoot] + public class Parent : Entity + { + [Key, Field, Version] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel3 +{ + [Serializable] + [HierarchyRoot] + public class Parent : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(LazyLoad = true), Version] + public string ReferenceField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel +{ + [Serializable] + [HierarchyRoot] + public class Parent : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, Version] + public string ParentVersionField { get; set; } + + [Field] + public string ParentNonVersionField { get; set; } + } + + [Serializable] + public class Child : Parent + { + [Field] + public string ChildNonVersionField { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Simple : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public string NonLazyField1 { get; set; } + + [Field] + public int NonLazyField2 { get; set; } + + [Field] + public SimpleStructure StructureField { get; set; } + + [Field(LazyLoad = true)] + public string LazyField { get; set; } + + [Field] + public Simple ReferenceField { get; set; } + + [Field] + public EntitySet CollectionField { get; private set; } + + [Field] + public byte[] ByteArrayField { get; set; } + } + + [Serializable] + public class SimpleStructure : Structure + { + [Field] + public string NonLazyField { get; set; } + + [Field(LazyLoad = true)] + public string LazyField { get; set; } + + [Field] + public Simple ReferenceField { get; set; } + } +} + +#endregion + +namespace Xtensive.Orm.Tests.Model +{ + using VersionInfoTests.ValidModel; + + [TestFixture] + public class VersionInfoTest + { + [OneTimeSetUp] + public void TestFixtureSetUp() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + public Domain BuildDomain(string @namespace) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(Assembly.GetExecutingAssembly(), @namespace); + return Domain.Build(configuration); + } + + [Test] + [Ignore("")] + [Obsolete] + public void RootOnlyVersionTest() + { + AssertEx.Throws(() => + BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel1")); + } + + [Test] + public void DenyKeyFieldsTest() + { + AssertEx.Throws(() => + BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel2")); + } + + [Test] + public void DenyLazyLoadFieldsTest() + { + AssertEx.Throws(() => + BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.InvalidModel3")); + } + + [Test] + public void VersionFieldsTest() + { + var domain = BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel"); + var model = domain.Model; + + var parentType = model.Types[typeof (Parent)]; + Assert.IsTrue(parentType.GetVersionFields().Any(field => field==parentType.Fields["ParentVersionField"])); + Assert.IsFalse(parentType.GetVersionFields().Any(field => field==parentType.Fields["ParentNonVersionField"])); + + var childType = model.Types[typeof (Child)]; + Assert.IsTrue(childType.GetVersionFields().Any(field => field==childType.Fields["ParentVersionField"])); + Assert.IsFalse(childType.GetVersionFields().Any(field => field==childType.Fields["ParentNonVersionField"])); + Assert.IsFalse(childType.GetVersionFields().Any(field => field==childType.Fields["ChildNonVersionField"])); + + var simpleType = model.Types[typeof (Simple)]; + Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["NonLazyField1"])); + Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["NonLazyField2"])); + Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["ReferenceField.Id"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["Id"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["TypeId"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["LazyField"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["CollectionField"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField"])); + Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.NonLazyField"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.LazyField"])); + Assert.IsTrue(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["StructureField.ReferenceField.Id"])); + Assert.IsFalse(simpleType.GetVersionColumns().Any(pair => pair.Field==simpleType.Fields["ByteArrayField"])); + } + + [Test] + public void SerializeVersionInfoTest() + { + var domain = BuildDomain("Xtensive.Orm.Tests.Model.VersionInfoTests.ValidModel"); + Key key; + VersionInfo version; + + using (var session = domain.OpenSession()) { + using (var transactionScope = session.OpenTransaction()) { + var instance = new Simple(); + instance.NonLazyField1 = "Value"; + instance.NonLazyField2 = 123; + instance.StructureField = new SimpleStructure {NonLazyField = "Value"}; + instance.ReferenceField = instance; + version = instance.VersionInfo; + transactionScope.Complete(); + } + } + + Assert.IsFalse(version.IsVoid); + var versionClone = Cloner.Clone(version); + Assert.IsFalse(versionClone.IsVoid); + Assert.IsTrue(version.Equals(versionClone)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Chinook.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Chinook.cs index 9a157f0c9c..fca3c2d426 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Chinook.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Chinook.cs @@ -1,321 +1,321 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kudelin -// Created: 2019.09.19 - -using System; -using System.Diagnostics; -using System.Linq; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests.ObjectModel.ChinookDO -{ - public interface IHasCommission : IEntity - { - [Field] - decimal? Commission { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("{Title} (AlbumId = {AlbumId})")] - public class Album : Entity - { - [Field, Key] - public int AlbumId { get; private set; } - - [FullText("English")] - [Field(Nullable = false, Length = 160)] - public string Title { get; set; } - - [Field(Nullable = false)] - public Artist Artist { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("{Name} (ArtistId = {ArtistId})")] - public class Artist : Entity - { - [Field, Key] - public int ArtistId { get; private set; } - - [Field(Nullable = false, Length = 120)] - public string Name { get; set; } - } - - public abstract class Person : Entity - { - [Field(Nullable = false, Length = 20)] - public string LastName { get; set; } - - [Field(Nullable = false, Length = 20)] - public string FirstName { get; set; } - - public string FullName - { - get { return FirstName + " " + LastName; } - } - - [Field] - public Address Address { get; set; } - - [Field(Length = 24)] - public string Phone { get; set; } - - [Field(Length = 24)] - public string Fax { get; set; } - - [Field(Length = 60)] - public string Email { get; set; } - } - - public abstract class BusinessContact : Person - { - [Field(Length = 80)] - public string CompanyName { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("{FirstName} {LastName} (CustomerId = {CustomerId})")] - public class Customer : BusinessContact - { - [Field, Key] - public int CustomerId { get; private set; } - - [Field] - public Employee SupportRep { get; set; } - - [Field, Association(PairTo = "Customer")] - public EntitySet Invoices { get; private set; } - - /// - /// Tests subqery with 'this' scenario. - /// - public Invoice FirstInvoice => Session.Query.All().Where(o => o.Customer==this).FirstOrDefault(); - } - - [HierarchyRoot] - [DebuggerDisplay("{FirstName} {LastName} (EmployeeId = {EmployeeId})")] - public class Employee : Person - { - [Field, Key] - public int EmployeeId { get; private set; } - - [Field(Length = 30)] - public string Title { get; set; } - - [Field] - public DateTime? BirthDate { get; set; } - - [Field] - public DateTime? HireDate { get; set; } - - [Field] - public Employee ReportsToManager { get; set; } - - [Field, Association(PairTo = "ReportsToManager")] - public EntitySet ReportingEmployees { get; set; } - - [Field, Association(PairTo = "DesignatedEmployee")] - public EntitySet Invoices { get; private set; } - - public int? GetAge() => BirthDate.HasValue ? DateTime.Now.Year - BirthDate.Value.Year : (int?) null; - } - - [HierarchyRoot] - [DebuggerDisplay("{Name} (GenreId = {GenreId})")] - public class Genre : Entity - { - [Field, Key] - public int GenreId { get; private set; } - - [Field(Nullable = false, Length = 120)] - public string Name { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("InvoiceId = {InvoiceId}")] - public class Invoice : Entity, IHasCommission - { - [Field, Key] - public int InvoiceId { get; private set; } - - [Field(Nullable = false)] - public DateTime InvoiceDate { get; set; } - - [Field] - public DateTime? PaymentDate { get; set; } - - [Field(Nullable = false)] - public InvoiceStatus Status { get; set; } - - [Field] - public TimeSpan? ProcessingTime { get; set; } - - [Field] - public Address BillingAddress { get; set; } - - [Field(Nullable = false)] - public decimal Total { get; set; } - - [Field] - public decimal? Commission { get; set; } - - [Field, Association(PairTo = "Invoice")] - public EntitySet InvoiceLines { get; private set; } - - [Field] - public Customer Customer { get; set; } - - [Field] - public Employee DesignatedEmployee { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("InvoiceLineId = {InvoiceLineId}")] - public class InvoiceLine : Entity - { - [Field, Key] - public int InvoiceLineId { get; private set; } - - [Field(Nullable = false)] - public decimal UnitPrice { get; set; } - - [Field(Nullable = false)] - public int Quantity { get; set; } - - [Field(Nullable = false)] - public Invoice Invoice { get; set; } - - [Field(Nullable = false)] - public Track Track { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("{Name} (MediaTypeId = {MediaTypeId})")] - public class MediaType : Entity - { - [Field, Key] - public int MediaTypeId { get; private set; } - - [Field(Nullable = false, Length = 120)] - public string Name { get; set; } - } - - [HierarchyRoot] - [DebuggerDisplay("{Name} (PlaylistId = {PlaylistId})")] - public class Playlist : Entity - { - [Field, Key] - public int PlaylistId { get; private set; } - - [Field(Nullable = false, Length = 120)] - public string Name { get; set; } - - [Field] - public EntitySet Tracks { get; private set; } - } - - [HierarchyRoot(InheritanceSchema.SingleTable)] - [DebuggerDisplay("{Name} (TrackId = {TrackId})")] - public abstract class Track : Entity - { - [Field, Key] - public int TrackId { get; private set; } - - [FullText("English")] - [Field(Nullable = false, Length = 200)] - public string Name { get; set; } - - [FullText("English")] - [Field(Length = 220)] - public string Composer { get; set; } - - [Field] - public int Milliseconds { get; set; } - - [Field(LazyLoad = true)] - public byte[] Bytes { get; set; } - - [Field] - public decimal UnitPrice { get; set; } - - [Field] - public Album Album { get; set; } - - [Field] - public MediaType MediaType { get; set; } - - [Field] - public Genre Genre { get; set; } - - [Field, Association(PairTo = "Tracks")] - public EntitySet Playlists { get; private set; } - } - - /// - /// Just for Linq type inheritance tests. - /// - public abstract class IntermediateTrack : Track - { - [Field] - public MediaFormat MediaFormat { get; private set; } - - protected IntermediateTrack(MediaFormat mediaFormat) - { - MediaFormat = mediaFormat; - } - } - - public class AudioTrack : IntermediateTrack - { - public AudioTrack() - : base(MediaFormat.Audio) - { - } - } - - public class VideoTrack : IntermediateTrack - { - public VideoTrack() - : base(MediaFormat.Video) - { - } - } - - public class Address : Structure - { - [FullText("English")] - [Field(Length = 70)] - public string StreetAddress { get; set; } - - [Field(Length = 40)] - public string City { get; set; } - - [Field(Length = 40)] - public string State { get; set; } - - [Field(Length = 40)] - public string Country { get; set; } - - [Field(Length = 10)] - public string PostalCode { get; set; } - - public string JustAProperty { get; set; } - } - - public enum InvoiceStatus - { - Created = 0, - Unpaid = 1, - Paid = 2, - Completed = 3 - } - - public enum MediaFormat - { - Unknown = 0, - Audio = 1, - Video = 2, - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kudelin +// Created: 2019.09.19 + +using System; +using System.Diagnostics; +using System.Linq; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests.ObjectModel.ChinookDO +{ + public interface IHasCommission : IEntity + { + [Field] + decimal? Commission { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("{Title} (AlbumId = {AlbumId})")] + public class Album : Entity + { + [Field, Key] + public int AlbumId { get; private set; } + + [FullText("English")] + [Field(Nullable = false, Length = 160)] + public string Title { get; set; } + + [Field(Nullable = false)] + public Artist Artist { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("{Name} (ArtistId = {ArtistId})")] + public class Artist : Entity + { + [Field, Key] + public int ArtistId { get; private set; } + + [Field(Nullable = false, Length = 120)] + public string Name { get; set; } + } + + public abstract class Person : Entity + { + [Field(Nullable = false, Length = 20)] + public string LastName { get; set; } + + [Field(Nullable = false, Length = 20)] + public string FirstName { get; set; } + + public string FullName + { + get { return FirstName + " " + LastName; } + } + + [Field] + public Address Address { get; set; } + + [Field(Length = 24)] + public string Phone { get; set; } + + [Field(Length = 24)] + public string Fax { get; set; } + + [Field(Length = 60)] + public string Email { get; set; } + } + + public abstract class BusinessContact : Person + { + [Field(Length = 80)] + public string CompanyName { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("{FirstName} {LastName} (CustomerId = {CustomerId})")] + public class Customer : BusinessContact + { + [Field, Key] + public int CustomerId { get; private set; } + + [Field] + public Employee SupportRep { get; set; } + + [Field, Association(PairTo = "Customer")] + public EntitySet Invoices { get; private set; } + + /// + /// Tests subqery with 'this' scenario. + /// + public Invoice FirstInvoice => Session.Query.All().Where(o => o.Customer==this).FirstOrDefault(); + } + + [HierarchyRoot] + [DebuggerDisplay("{FirstName} {LastName} (EmployeeId = {EmployeeId})")] + public class Employee : Person + { + [Field, Key] + public int EmployeeId { get; private set; } + + [Field(Length = 30)] + public string Title { get; set; } + + [Field] + public DateTime? BirthDate { get; set; } + + [Field] + public DateTime? HireDate { get; set; } + + [Field] + public Employee ReportsToManager { get; set; } + + [Field, Association(PairTo = "ReportsToManager")] + public EntitySet ReportingEmployees { get; set; } + + [Field, Association(PairTo = "DesignatedEmployee")] + public EntitySet Invoices { get; private set; } + + public int? GetAge() => BirthDate.HasValue ? DateTime.Now.Year - BirthDate.Value.Year : (int?) null; + } + + [HierarchyRoot] + [DebuggerDisplay("{Name} (GenreId = {GenreId})")] + public class Genre : Entity + { + [Field, Key] + public int GenreId { get; private set; } + + [Field(Nullable = false, Length = 120)] + public string Name { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("InvoiceId = {InvoiceId}")] + public class Invoice : Entity, IHasCommission + { + [Field, Key] + public int InvoiceId { get; private set; } + + [Field(Nullable = false)] + public DateTime InvoiceDate { get; set; } + + [Field] + public DateTime? PaymentDate { get; set; } + + [Field(Nullable = false)] + public InvoiceStatus Status { get; set; } + + [Field] + public TimeSpan? ProcessingTime { get; set; } + + [Field] + public Address BillingAddress { get; set; } + + [Field(Nullable = false)] + public decimal Total { get; set; } + + [Field] + public decimal? Commission { get; set; } + + [Field, Association(PairTo = "Invoice")] + public EntitySet InvoiceLines { get; private set; } + + [Field] + public Customer Customer { get; set; } + + [Field] + public Employee DesignatedEmployee { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("InvoiceLineId = {InvoiceLineId}")] + public class InvoiceLine : Entity + { + [Field, Key] + public int InvoiceLineId { get; private set; } + + [Field(Nullable = false)] + public decimal UnitPrice { get; set; } + + [Field(Nullable = false)] + public int Quantity { get; set; } + + [Field(Nullable = false)] + public Invoice Invoice { get; set; } + + [Field(Nullable = false)] + public Track Track { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("{Name} (MediaTypeId = {MediaTypeId})")] + public class MediaType : Entity + { + [Field, Key] + public int MediaTypeId { get; private set; } + + [Field(Nullable = false, Length = 120)] + public string Name { get; set; } + } + + [HierarchyRoot] + [DebuggerDisplay("{Name} (PlaylistId = {PlaylistId})")] + public class Playlist : Entity + { + [Field, Key] + public int PlaylistId { get; private set; } + + [Field(Nullable = false, Length = 120)] + public string Name { get; set; } + + [Field] + public EntitySet Tracks { get; private set; } + } + + [HierarchyRoot(InheritanceSchema.SingleTable)] + [DebuggerDisplay("{Name} (TrackId = {TrackId})")] + public abstract class Track : Entity + { + [Field, Key] + public int TrackId { get; private set; } + + [FullText("English")] + [Field(Nullable = false, Length = 200)] + public string Name { get; set; } + + [FullText("English")] + [Field(Length = 220)] + public string Composer { get; set; } + + [Field] + public int Milliseconds { get; set; } + + [Field(LazyLoad = true)] + public byte[] Bytes { get; set; } + + [Field] + public decimal UnitPrice { get; set; } + + [Field] + public Album Album { get; set; } + + [Field] + public MediaType MediaType { get; set; } + + [Field] + public Genre Genre { get; set; } + + [Field, Association(PairTo = "Tracks")] + public EntitySet Playlists { get; private set; } + } + + /// + /// Just for Linq type inheritance tests. + /// + public abstract class IntermediateTrack : Track + { + [Field] + public MediaFormat MediaFormat { get; private set; } + + protected IntermediateTrack(MediaFormat mediaFormat) + { + MediaFormat = mediaFormat; + } + } + + public class AudioTrack : IntermediateTrack + { + public AudioTrack() + : base(MediaFormat.Audio) + { + } + } + + public class VideoTrack : IntermediateTrack + { + public VideoTrack() + : base(MediaFormat.Video) + { + } + } + + public class Address : Structure + { + [FullText("English")] + [Field(Length = 70)] + public string StreetAddress { get; set; } + + [Field(Length = 40)] + public string City { get; set; } + + [Field(Length = 40)] + public string State { get; set; } + + [Field(Length = 40)] + public string Country { get; set; } + + [Field(Length = 10)] + public string PostalCode { get; set; } + + public string JustAProperty { get; set; } + } + + public enum InvoiceStatus + { + Created = 0, + Unpaid = 1, + Paid = 2, + Completed = 3 + } + + public enum MediaFormat + { + Unknown = 0, + Audio = 1, + Video = 2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDO.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDO.cs index dc20323267..08d414c179 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDO.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDO.cs @@ -1,311 +1,311 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kudelin -// Created: 2019.09.19 - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Xml.Linq; -using Xtensive.Orm.Configuration; -using IdEntity = System.ValueTuple; - -namespace Xtensive.Orm.Tests.ObjectModel.ChinookDO -{ - public sealed class ImportContext - { - private readonly Dictionary> entities = new Dictionary>(); - - public T GetEntity(int id) where T : Entity => (T) entities[typeof (T)][id]; - - public void AddEntity(int id, T entity) - where T: Entity - { - Dictionary values; - if (!entities.TryGetValue(typeof (T), out values)) { - values = new Dictionary(); - entities.Add(typeof (T), values); - } - - values[id] = entity; - } - } - - public class DataBaseFiller - { - private abstract class Importer - { - public abstract void Import(Dictionary fields, ImportContext context); - } - - private class ArtistImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Artist {Name = (string) fields["Name"]}; - context.AddEntity((int) fields["ArtistId"], entity); - } - } - - private class GenreImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Genre {Name = (string) fields["Name"]}; - context.AddEntity((int) fields["GenreId"], entity); - } - } - - private class MediaTypeImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new MediaType {Name = (string) fields["Name"]}; - context.AddEntity((int) fields["MediaTypeId"], entity); - } - } - - private class PlaylistImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Playlist {Name = (string) fields["Name"]}; - context.AddEntity((int) fields["PlaylistId"], entity); - } - } - - private class AlbumImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Album { - Title = (string) fields["Title"], - Artist = context.GetEntity((int) fields["ArtistId"]) - }; - context.AddEntity((int) fields["AlbumId"], entity); - } - } - - private class TrackImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var mediaType = context.GetEntity((int) fields["MediaTypeId"]); - var entity = CreateTrack(mediaType); - entity.Name = (string) fields["Name"]; - entity.Composer = (string) fields["Composer"]; - entity.Milliseconds = (int) fields["Milliseconds"]; - entity.Bytes = (byte[]) fields["Bytes"]; - entity.UnitPrice = (decimal) fields["UnitPrice"]; - entity.Album = context.GetEntity((int) fields["AlbumId"]); - entity.Genre = context.GetEntity((int) fields["GenreId"]); - - context.AddEntity((int) fields["TrackId"], entity); - } - - private Track CreateTrack(MediaType mediaType) - { - if (mediaType.Name=="Protected MPEG-4 video file") - return new VideoTrack {MediaType = mediaType}; - return new AudioTrack {MediaType = mediaType}; - } - } - - private class EmployeeImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var reportsTo = (int?) fields["ReportsTo"]; - var entity = new Employee{ - LastName = (string) fields["LastName"], - FirstName = (string) fields["FirstName"], - Title = (string) fields["Title"], - BirthDate = (DateTime?) fields["BirthDate"], - HireDate = (DateTime?) fields["HireDate"], - Address = new Address { - StreetAddress = (string) fields["StreetAddress"], - City = (string) fields["City"], - State = (string) fields["State"], - Country = (string) fields["Country"], - PostalCode = (string) fields["PostalCode"], - }, - Phone = (string) fields["Phone"], - Fax = (string) fields["Fax"], - Email = (string) fields["Email"], - ReportsToManager = reportsTo.HasValue ? context.GetEntity(reportsTo.Value) : null - }; - - context.AddEntity((int) fields["EmployeeId"], entity); - } - } - - private class CustomerImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Customer { - FirstName = (string) fields["FirstName"], - LastName = (string) fields["LastName"], - CompanyName = (string) fields["CompanyName"], - Address = new Address { - StreetAddress = (string) fields["StreetAddress"], - City = (string) fields["City"], - State = (string) fields["State"], - Country = (string) fields["Country"], - PostalCode = (string) fields["PostalCode"], - }, - Phone = (string) fields["Phone"], - Fax = (string) fields["Fax"], - Email = (string) fields["Email"], - SupportRep = context.GetEntity((int) fields["SupportRepId"]), - }; - - context.AddEntity((int) fields["CustomerId"], entity); - } - } - - private class InvoiceImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var entity = new Invoice { - InvoiceDate = (DateTime) fields["InvoiceDate"], - PaymentDate = (DateTime?) fields["PaymentDate"], - Status = (InvoiceStatus) fields["Status"], - ProcessingTime = (TimeSpan?) fields["ProcessingTime"], - BillingAddress = new Address { - StreetAddress = (string) fields["BillingStreetAddress"], - City = (string) fields["BillingCity"], - State = (string) fields["BillingState"], - Country = (string) fields["BillingCountry"], - PostalCode = (string) fields["BillingPostalCode"], - }, - Total = (decimal) fields["Total"], - Commission = (decimal) fields["Commission"], - Customer = context.GetEntity((int) fields["CustomerId"]), - DesignatedEmployee = context.GetEntity((int) fields["DesignatedEmployeeId"]), - }; - context.AddEntity((int) fields["InvoiceId"], entity); - } - } - - private class InvoiceLineImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var invoiceLine = new InvoiceLine { - UnitPrice = (decimal) fields["UnitPrice"], - Quantity = (int) fields["Quantity"], - Invoice = context.GetEntity((int) fields["InvoiceId"]), - Track = context.GetEntity((int) fields["TrackId"]) - }; - context.AddEntity((int) fields["InvoiceLineId"], invoiceLine); - } - } - - private class PlaylistTrackImporter : Importer - { - public override void Import(Dictionary fields, ImportContext context) - { - var playlist = context.GetEntity((int) fields["PlaylistId"]); - var track = context.GetEntity((int) fields["TrackId"]); - playlist.Tracks.Add(track); - } - } - - public static void Fill(Domain domain) - { - var path = @"Chinook.xml"; - var xmlTables = ReadXml(path); - - var importContext = new ImportContext(); - - using (var session = domain.OpenSession(new SessionConfiguration("Legacy", SessionOptions.ServerProfile | SessionOptions.AutoActivation))) - using (var tr = session.OpenTransaction(System.Transactions.IsolationLevel.ReadCommitted)) { - Import(xmlTables["Artist"], importContext, new ArtistImporter()); - Import(xmlTables["Genre"], importContext, new GenreImporter()); - Import(xmlTables["MediaType"], importContext, new MediaTypeImporter()); - Import(xmlTables["Playlist"], importContext, new PlaylistImporter()); - Import(xmlTables["Album"], importContext, new AlbumImporter()); - Import(xmlTables["Track"], importContext, new TrackImporter()); - Import(xmlTables["Employee"], importContext, new EmployeeImporter()); - Import(xmlTables["Customer"], importContext, new CustomerImporter()); - Import(xmlTables["Invoice"], importContext, new InvoiceImporter()); - Import(xmlTables["InvoiceLine"], importContext, new InvoiceLineImporter()); - Import(xmlTables["PlaylistTrack"], importContext, new PlaylistTrackImporter()); - - session.SaveChanges(); - tr.Complete(); - } - } - - private static void Import(XmlTable node, ImportContext importContext, Importer importer) - { - foreach (var row in node.Rows) { - var fields = GetFields(row, node.ColumnTypes); - importer.Import(fields, importContext); - } - } - - private static Dictionary GetFields(XElement row, Dictionary columnTypes) - { - var fields = new Dictionary(); - var elements = row.Elements().ToList(); - for (int i = 0; i < elements.Count(); i++) { - var value = elements[i].Value; - object obj = null; - if (!string.IsNullOrEmpty(value)) - obj = ConvertFieldType(columnTypes[elements[i].Name.LocalName], elements[i].Value); - fields.Add(elements[i].Name.LocalName, obj); - } - return fields; - } - - private static object ConvertFieldType(string columnType, string text) - { - var type = Type.GetType(columnType); - switch (columnType) { - case "System.Byte[]": - return Convert.FromBase64String(text); - case "System.Decimal": - return Decimal.Parse(text, CultureInfo.InvariantCulture); - case "System.Single": - return Single.Parse(text, CultureInfo.InvariantCulture); - case "System.DateTime": - return DateTime.Parse(text); - case "System.TimeSpan": - return TimeSpan.FromTicks(Int64.Parse(text, CultureInfo.InvariantCulture)); - default: - return Convert.ChangeType(text, type, CultureInfo.InvariantCulture); - } - } - - private static Dictionary ReadXml(string path) - { - var doc = XDocument.Load(path); - var root = doc.Element("root"); - if (root == null) - throw new Exception("Read xml error"); - var tables = root.Elements(); - var tableMap = new Dictionary(); - - foreach (var table in tables) { - var xmlTable = new XmlTable(); - xmlTable.Name = table.Name.LocalName; - xmlTable.ColumnTypes = table.Element("Columns").Elements().ToDictionary(key => key.Name.LocalName, value => value.Value); - xmlTable.Rows = table.Element("Rows").Elements(); - tableMap.Add(xmlTable.Name, xmlTable); - } - return tableMap; - } - - private class XmlTable - { - public string Name { get; set; } - public Dictionary ColumnTypes { get; set; } - public IEnumerable Rows { get; set; } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kudelin +// Created: 2019.09.19 + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Xml.Linq; +using Xtensive.Orm.Configuration; +using IdEntity = System.ValueTuple; + +namespace Xtensive.Orm.Tests.ObjectModel.ChinookDO +{ + public sealed class ImportContext + { + private readonly Dictionary> entities = new Dictionary>(); + + public T GetEntity(int id) where T : Entity => (T) entities[typeof (T)][id]; + + public void AddEntity(int id, T entity) + where T: Entity + { + Dictionary values; + if (!entities.TryGetValue(typeof (T), out values)) { + values = new Dictionary(); + entities.Add(typeof (T), values); + } + + values[id] = entity; + } + } + + public class DataBaseFiller + { + private abstract class Importer + { + public abstract void Import(Dictionary fields, ImportContext context); + } + + private class ArtistImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Artist {Name = (string) fields["Name"]}; + context.AddEntity((int) fields["ArtistId"], entity); + } + } + + private class GenreImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Genre {Name = (string) fields["Name"]}; + context.AddEntity((int) fields["GenreId"], entity); + } + } + + private class MediaTypeImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new MediaType {Name = (string) fields["Name"]}; + context.AddEntity((int) fields["MediaTypeId"], entity); + } + } + + private class PlaylistImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Playlist {Name = (string) fields["Name"]}; + context.AddEntity((int) fields["PlaylistId"], entity); + } + } + + private class AlbumImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Album { + Title = (string) fields["Title"], + Artist = context.GetEntity((int) fields["ArtistId"]) + }; + context.AddEntity((int) fields["AlbumId"], entity); + } + } + + private class TrackImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var mediaType = context.GetEntity((int) fields["MediaTypeId"]); + var entity = CreateTrack(mediaType); + entity.Name = (string) fields["Name"]; + entity.Composer = (string) fields["Composer"]; + entity.Milliseconds = (int) fields["Milliseconds"]; + entity.Bytes = (byte[]) fields["Bytes"]; + entity.UnitPrice = (decimal) fields["UnitPrice"]; + entity.Album = context.GetEntity((int) fields["AlbumId"]); + entity.Genre = context.GetEntity((int) fields["GenreId"]); + + context.AddEntity((int) fields["TrackId"], entity); + } + + private Track CreateTrack(MediaType mediaType) + { + if (mediaType.Name=="Protected MPEG-4 video file") + return new VideoTrack {MediaType = mediaType}; + return new AudioTrack {MediaType = mediaType}; + } + } + + private class EmployeeImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var reportsTo = (int?) fields["ReportsTo"]; + var entity = new Employee{ + LastName = (string) fields["LastName"], + FirstName = (string) fields["FirstName"], + Title = (string) fields["Title"], + BirthDate = (DateTime?) fields["BirthDate"], + HireDate = (DateTime?) fields["HireDate"], + Address = new Address { + StreetAddress = (string) fields["StreetAddress"], + City = (string) fields["City"], + State = (string) fields["State"], + Country = (string) fields["Country"], + PostalCode = (string) fields["PostalCode"], + }, + Phone = (string) fields["Phone"], + Fax = (string) fields["Fax"], + Email = (string) fields["Email"], + ReportsToManager = reportsTo.HasValue ? context.GetEntity(reportsTo.Value) : null + }; + + context.AddEntity((int) fields["EmployeeId"], entity); + } + } + + private class CustomerImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Customer { + FirstName = (string) fields["FirstName"], + LastName = (string) fields["LastName"], + CompanyName = (string) fields["CompanyName"], + Address = new Address { + StreetAddress = (string) fields["StreetAddress"], + City = (string) fields["City"], + State = (string) fields["State"], + Country = (string) fields["Country"], + PostalCode = (string) fields["PostalCode"], + }, + Phone = (string) fields["Phone"], + Fax = (string) fields["Fax"], + Email = (string) fields["Email"], + SupportRep = context.GetEntity((int) fields["SupportRepId"]), + }; + + context.AddEntity((int) fields["CustomerId"], entity); + } + } + + private class InvoiceImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var entity = new Invoice { + InvoiceDate = (DateTime) fields["InvoiceDate"], + PaymentDate = (DateTime?) fields["PaymentDate"], + Status = (InvoiceStatus) fields["Status"], + ProcessingTime = (TimeSpan?) fields["ProcessingTime"], + BillingAddress = new Address { + StreetAddress = (string) fields["BillingStreetAddress"], + City = (string) fields["BillingCity"], + State = (string) fields["BillingState"], + Country = (string) fields["BillingCountry"], + PostalCode = (string) fields["BillingPostalCode"], + }, + Total = (decimal) fields["Total"], + Commission = (decimal) fields["Commission"], + Customer = context.GetEntity((int) fields["CustomerId"]), + DesignatedEmployee = context.GetEntity((int) fields["DesignatedEmployeeId"]), + }; + context.AddEntity((int) fields["InvoiceId"], entity); + } + } + + private class InvoiceLineImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var invoiceLine = new InvoiceLine { + UnitPrice = (decimal) fields["UnitPrice"], + Quantity = (int) fields["Quantity"], + Invoice = context.GetEntity((int) fields["InvoiceId"]), + Track = context.GetEntity((int) fields["TrackId"]) + }; + context.AddEntity((int) fields["InvoiceLineId"], invoiceLine); + } + } + + private class PlaylistTrackImporter : Importer + { + public override void Import(Dictionary fields, ImportContext context) + { + var playlist = context.GetEntity((int) fields["PlaylistId"]); + var track = context.GetEntity((int) fields["TrackId"]); + playlist.Tracks.Add(track); + } + } + + public static void Fill(Domain domain) + { + var path = @"Chinook.xml"; + var xmlTables = ReadXml(path); + + var importContext = new ImportContext(); + + using (var session = domain.OpenSession(new SessionConfiguration("Legacy", SessionOptions.ServerProfile | SessionOptions.AutoActivation))) + using (var tr = session.OpenTransaction(System.Transactions.IsolationLevel.ReadCommitted)) { + Import(xmlTables["Artist"], importContext, new ArtistImporter()); + Import(xmlTables["Genre"], importContext, new GenreImporter()); + Import(xmlTables["MediaType"], importContext, new MediaTypeImporter()); + Import(xmlTables["Playlist"], importContext, new PlaylistImporter()); + Import(xmlTables["Album"], importContext, new AlbumImporter()); + Import(xmlTables["Track"], importContext, new TrackImporter()); + Import(xmlTables["Employee"], importContext, new EmployeeImporter()); + Import(xmlTables["Customer"], importContext, new CustomerImporter()); + Import(xmlTables["Invoice"], importContext, new InvoiceImporter()); + Import(xmlTables["InvoiceLine"], importContext, new InvoiceLineImporter()); + Import(xmlTables["PlaylistTrack"], importContext, new PlaylistTrackImporter()); + + session.SaveChanges(); + tr.Complete(); + } + } + + private static void Import(XmlTable node, ImportContext importContext, Importer importer) + { + foreach (var row in node.Rows) { + var fields = GetFields(row, node.ColumnTypes); + importer.Import(fields, importContext); + } + } + + private static Dictionary GetFields(XElement row, Dictionary columnTypes) + { + var fields = new Dictionary(); + var elements = row.Elements().ToList(); + for (int i = 0; i < elements.Count(); i++) { + var value = elements[i].Value; + object obj = null; + if (!string.IsNullOrEmpty(value)) + obj = ConvertFieldType(columnTypes[elements[i].Name.LocalName], elements[i].Value); + fields.Add(elements[i].Name.LocalName, obj); + } + return fields; + } + + private static object ConvertFieldType(string columnType, string text) + { + var type = Type.GetType(columnType); + switch (columnType) { + case "System.Byte[]": + return Convert.FromBase64String(text); + case "System.Decimal": + return Decimal.Parse(text, CultureInfo.InvariantCulture); + case "System.Single": + return Single.Parse(text, CultureInfo.InvariantCulture); + case "System.DateTime": + return DateTime.Parse(text); + case "System.TimeSpan": + return TimeSpan.FromTicks(Int64.Parse(text, CultureInfo.InvariantCulture)); + default: + return Convert.ChangeType(text, type, CultureInfo.InvariantCulture); + } + } + + private static Dictionary ReadXml(string path) + { + var doc = XDocument.Load(path); + var root = doc.Element("root"); + if (root == null) + throw new Exception("Read xml error"); + var tables = root.Elements(); + var tableMap = new Dictionary(); + + foreach (var table in tables) { + var xmlTable = new XmlTable(); + xmlTable.Name = table.Name.LocalName; + xmlTable.ColumnTypes = table.Element("Columns").Elements().ToDictionary(key => key.Name.LocalName, value => value.Value); + xmlTable.Rows = table.Element("Rows").Elements(); + tableMap.Add(xmlTable.Name, xmlTable); + } + return tableMap; + } + + private class XmlTable + { + public string Name { get; set; } + public Dictionary ColumnTypes { get; set; } + public IEnumerable Rows { get; set; } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDOModelTest.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDOModelTest.cs index 70329dd1cd..496c0fa652 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDOModelTest.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/ChinookDOModelTest.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Kudelin -// Created: 2019.09.19 - -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.ObjectModel -{ - [TestFixture] - public abstract class ChinookDOModelTest : AutoBuildTest - { - private DisposableSet disposables; - protected Session Session; - - private Album[] albums; - private Artist[] artists; - private Customer[] customers; - private Employee[] employees; - private Genre[] genres; - private Invoice[] invoices; - private InvoiceLine[] invoiceLines; - private MediaType[] mediaTypes; - private Playlist[] playlists; - private Track[] tracks; - - protected IEnumerable Albums => GetEntities(ref albums); - protected IEnumerable Artists => GetEntities(ref artists); - protected IEnumerable Customers => GetEntities(ref customers); - protected IEnumerable Employees => GetEntities(ref employees); - protected IEnumerable Genres => GetEntities(ref genres); - protected IEnumerable Invoices => GetEntities(ref invoices); - protected IEnumerable InvoiceLines => GetEntities(ref invoiceLines); - protected IEnumerable MediaTypes => GetEntities(ref mediaTypes); - protected IEnumerable Playlists => GetEntities(ref playlists); - protected IEnumerable Tracks => GetEntities(ref tracks); - - [SetUp] - public virtual void SetUp() - { - disposables = new DisposableSet(); - disposables.Add(Session = Domain.OpenSession()); - disposables.Add(Session.OpenTransaction()); - } - - [TearDown] - public virtual void TearDown() - { - disposables.DisposeSafely(); - albums = null; - artists = null; - customers = null; - employees = null; - genres = null; - invoices = null; - invoiceLines = null; - mediaTypes = null; - playlists = null; - tracks = null; - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.UpgradeMode = DomainUpgradeMode.Recreate; - config.Types.Register(typeof (Playlist).Assembly, typeof (Playlist).Namespace); - return config; - } - - protected override Domain BuildDomain(DomainConfiguration configuration) - { - Domain domain; - try { - //throw new ApplicationException("Don't validate, just recreate ;)"); - var validateConfig = configuration.Clone(); - validateConfig.UpgradeMode = DomainUpgradeMode.Validate; - domain = Domain.Build(validateConfig); - } - catch (Exception ex) { - var recreateConfig = configuration.Clone(); - recreateConfig.UpgradeMode = DomainUpgradeMode.Recreate; - domain = base.BuildDomain(recreateConfig); - } - - var shouldFill = false; - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var count = session.Query.All().Count(); - if (count==0) - shouldFill = true; - } - - if (shouldFill) - DataBaseFiller.Fill(domain); - return domain; - } - - private T[] GetEntities(ref T[] source) where T : Entity => source ?? (source = Session.Query.All().ToArray()); - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Kudelin +// Created: 2019.09.19 + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.ObjectModel +{ + [TestFixture] + public abstract class ChinookDOModelTest : AutoBuildTest + { + private DisposableSet disposables; + protected Session Session; + + private Album[] albums; + private Artist[] artists; + private Customer[] customers; + private Employee[] employees; + private Genre[] genres; + private Invoice[] invoices; + private InvoiceLine[] invoiceLines; + private MediaType[] mediaTypes; + private Playlist[] playlists; + private Track[] tracks; + + protected IEnumerable Albums => GetEntities(ref albums); + protected IEnumerable Artists => GetEntities(ref artists); + protected IEnumerable Customers => GetEntities(ref customers); + protected IEnumerable Employees => GetEntities(ref employees); + protected IEnumerable Genres => GetEntities(ref genres); + protected IEnumerable Invoices => GetEntities(ref invoices); + protected IEnumerable InvoiceLines => GetEntities(ref invoiceLines); + protected IEnumerable MediaTypes => GetEntities(ref mediaTypes); + protected IEnumerable Playlists => GetEntities(ref playlists); + protected IEnumerable Tracks => GetEntities(ref tracks); + + [SetUp] + public virtual void SetUp() + { + disposables = new DisposableSet(); + disposables.Add(Session = Domain.OpenSession()); + disposables.Add(Session.OpenTransaction()); + } + + [TearDown] + public virtual void TearDown() + { + disposables.DisposeSafely(); + albums = null; + artists = null; + customers = null; + employees = null; + genres = null; + invoices = null; + invoiceLines = null; + mediaTypes = null; + playlists = null; + tracks = null; + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.UpgradeMode = DomainUpgradeMode.Recreate; + config.Types.Register(typeof (Playlist).Assembly, typeof (Playlist).Namespace); + return config; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + Domain domain; + try { + //throw new ApplicationException("Don't validate, just recreate ;)"); + var validateConfig = configuration.Clone(); + validateConfig.UpgradeMode = DomainUpgradeMode.Validate; + domain = Domain.Build(validateConfig); + } + catch (Exception ex) { + var recreateConfig = configuration.Clone(); + recreateConfig.UpgradeMode = DomainUpgradeMode.Recreate; + domain = base.BuildDomain(recreateConfig); + } + + var shouldFill = false; + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var count = session.Query.All().Count(); + if (count==0) + shouldFill = true; + } + + if (shouldFill) + DataBaseFiller.Fill(domain); + return domain; + } + + private T[] GetEntities(ref T[] source) where T : Entity => source ?? (source = Session.Query.All().ToArray()); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/AscxTemplate.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/AscxTemplate.cs index a17cd2fe41..d6a984433d 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/AscxTemplate.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/AscxTemplate.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.16 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class AscxTemplate - : ContentItem - { - [Field] - public string TemplateTypeName { get; set;} - - [Field] - public string AscxHeaderFileID { get; set;} - - [Field] - public string StoredAscxFileID { get; set;} - - [Field] - public DateTime? LastModificationDate { get; set;} - - - public virtual void NotifyModified() - { - LastModificationDate = DateTime.Now; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.16 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class AscxTemplate + : ContentItem + { + [Field] + public string TemplateTypeName { get; set;} + + [Field] + public string AscxHeaderFileID { get; set;} + + [Field] + public string StoredAscxFileID { get; set;} + + [Field] + public DateTime? LastModificationDate { get; set;} + + + public virtual void NotifyModified() + { + LastModificationDate = DateTime.Now; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectory.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectory.cs index f855a7dfa4..c26a2cf85c 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectory.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectory.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - -using System; -using System.Linq; -using System.Text; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - [HierarchyRoot] - public class ContentDirectory - : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public PageTemplate DefaultTemplate { get; set;} - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public Page DefaultPage { get; set;} - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public WebSite WebSite { get; set; } - - [Field] - public string Name { - get { return GetFieldValue("Name");} - set { - if (value==null) - throw new ArgumentException("value"); - var oldPath = ParentDirectory==null ? Name : GetPath(); - SetFieldValue("Name", value.ToLowerInvariant()); - var newPath = GetPath(); - } - } - - [Field, Association(PairTo = "Directories", OnTargetRemove = OnRemoveAction.Cascade)] - public ContentDirectory ParentDirectory { - get{ return GetFieldValue("ParentDirectory");} - set { - var oldPath = ParentDirectory==null ? Name : GetPath(); - SetFieldValue("ParentDirectory", value); - var newPath = GetPath(); - } - } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public ContentItemCollection Items { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public ContentDirectoryCollection Directories { get; private set; } - - public ContentDirectory GetSubDirectory(string subDirectoryName) - { - return Session.Demand().Query.All().Where(dir => dir.Name==subDirectoryName && dir.ParentDirectory==this).FirstOrDefault(); - } - - public ContentItem GetContentItem(string contentItemName) - { - return Session.Demand().Query.All().Where(item => item.Name==contentItemName && item.ParentDirectory==this).FirstOrDefault(); - } - - private void BuildPathRecursive(StringBuilder stringBuilder) - { - if (ParentDirectory!=null) { - ParentDirectory.BuildPathRecursive(stringBuilder); - stringBuilder.Append('/'); - } - stringBuilder.Append(Name); - } - - public string GetPath() - { - var result = new StringBuilder(); - BuildPathRecursive(result); - return result.ToString(); - } - - protected override void OnValidate() - { - base.OnValidate(); - if (WebSite==null) - throw new InvalidOperationException("WebSite"); - if (ParentDirectory==null && WebSite!=this) - throw new InvalidOperationException("ParentDirectory"); - } - - public bool IsSubdirectoryOf(ContentDirectory directory) - { - ContentDirectory parent = ParentDirectory; - while(parent!=null) { - if (parent==directory) - return true; - parent = parent.ParentDirectory; - } - return false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + +using System; +using System.Linq; +using System.Text; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + [HierarchyRoot] + public class ContentDirectory + : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public PageTemplate DefaultTemplate { get; set;} + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public Page DefaultPage { get; set;} + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public WebSite WebSite { get; set; } + + [Field] + public string Name { + get { return GetFieldValue("Name");} + set { + if (value==null) + throw new ArgumentException("value"); + var oldPath = ParentDirectory==null ? Name : GetPath(); + SetFieldValue("Name", value.ToLowerInvariant()); + var newPath = GetPath(); + } + } + + [Field, Association(PairTo = "Directories", OnTargetRemove = OnRemoveAction.Cascade)] + public ContentDirectory ParentDirectory { + get{ return GetFieldValue("ParentDirectory");} + set { + var oldPath = ParentDirectory==null ? Name : GetPath(); + SetFieldValue("ParentDirectory", value); + var newPath = GetPath(); + } + } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public ContentItemCollection Items { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public ContentDirectoryCollection Directories { get; private set; } + + public ContentDirectory GetSubDirectory(string subDirectoryName) + { + return Session.Demand().Query.All().Where(dir => dir.Name==subDirectoryName && dir.ParentDirectory==this).FirstOrDefault(); + } + + public ContentItem GetContentItem(string contentItemName) + { + return Session.Demand().Query.All().Where(item => item.Name==contentItemName && item.ParentDirectory==this).FirstOrDefault(); + } + + private void BuildPathRecursive(StringBuilder stringBuilder) + { + if (ParentDirectory!=null) { + ParentDirectory.BuildPathRecursive(stringBuilder); + stringBuilder.Append('/'); + } + stringBuilder.Append(Name); + } + + public string GetPath() + { + var result = new StringBuilder(); + BuildPathRecursive(result); + return result.ToString(); + } + + protected override void OnValidate() + { + base.OnValidate(); + if (WebSite==null) + throw new InvalidOperationException("WebSite"); + if (ParentDirectory==null && WebSite!=this) + throw new InvalidOperationException("ParentDirectory"); + } + + public bool IsSubdirectoryOf(ContentDirectory directory) + { + ContentDirectory parent = ParentDirectory; + while(parent!=null) { + if (parent==directory) + return true; + parent = parent.ParentDirectory; + } + return false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectoryCollection.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectoryCollection.cs index 83450d73ea..c8e2ba3b38 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectoryCollection.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentDirectoryCollection.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.03 - -using System.Runtime.Serialization; -using Xtensive.Orm; -using FieldInfo=Xtensive.Orm.Model.FieldInfo; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - public class ContentDirectoryCollection - : EntitySet - where TContentItem : ContentDirectory - { - protected override void OnAdding(Entity item) - { - ((ContentDirectory) item).WebSite = ((ContentDirectory) Owner).WebSite; - base.OnAdding(item); - } - - protected ContentDirectoryCollection(Entity owner, FieldInfo field) - : base(owner, field) - { - } - - protected ContentDirectoryCollection(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.03 + +using System.Runtime.Serialization; +using Xtensive.Orm; +using FieldInfo=Xtensive.Orm.Model.FieldInfo; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + public class ContentDirectoryCollection + : EntitySet + where TContentItem : ContentDirectory + { + protected override void OnAdding(Entity item) + { + ((ContentDirectory) item).WebSite = ((ContentDirectory) Owner).WebSite; + base.OnAdding(item); + } + + protected ContentDirectoryCollection(Entity owner, FieldInfo field) + : base(owner, field) + { + } + + protected ContentDirectoryCollection(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentFile.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentFile.cs index bf451ab9fb..8e7523c00b 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentFile.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentFile.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class ContentFile - : ContentItem - { - [Field] - public string StoredFileID { get; set;} - - [Field] - public DateTime? LastModificationDate { get; set;} - - - public virtual void NotifyModified() - { - LastModificationDate = DateTime.Now; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class ContentFile + : ContentItem + { + [Field] + public string StoredFileID { get; set;} + + [Field] + public DateTime? LastModificationDate { get; set;} + + + public virtual void NotifyModified() + { + LastModificationDate = DateTime.Now; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItem.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItem.cs index 03a1246829..764b8e56b2 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItem.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItem.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - [HierarchyRoot] - public class ContentItem - : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] - public WebSite WebSite { get; set; } - - [Field, Association(PairTo = "Items", OnTargetRemove = OnRemoveAction.Cascade)] - public ContentDirectory ParentDirectory { - get { return GetFieldValue("ParentDirectory");} - set { - var oldPath = ParentDirectory==null ? Name : GetPath(); - SetFieldValue("ParentDirectory", value); - } - } - - [Field] - public string Name { - get { return GetFieldValue("Name");} - set { - if (value==null) - throw new ArgumentException("value"); - var oldPath = ParentDirectory==null ? Name : GetPath(); - var newValue = value.ToLowerInvariant(); - SetFieldValue("Name", newValue); - } - } - - public string GetPath() - { - string directoryPath = ParentDirectory==null ? null : ParentDirectory.GetPath(); - if (String.IsNullOrEmpty(directoryPath)) - return Name; - return directoryPath + "/" + Name; - } - - protected override void OnValidate() - { - base.OnValidate(); - if (WebSite == null) - throw new InvalidOperationException("WebSite"); - if (ParentDirectory == null) - throw new InvalidOperationException("ParentDirectory"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + [HierarchyRoot] + public class ContentItem + : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Cascade)] + public WebSite WebSite { get; set; } + + [Field, Association(PairTo = "Items", OnTargetRemove = OnRemoveAction.Cascade)] + public ContentDirectory ParentDirectory { + get { return GetFieldValue("ParentDirectory");} + set { + var oldPath = ParentDirectory==null ? Name : GetPath(); + SetFieldValue("ParentDirectory", value); + } + } + + [Field] + public string Name { + get { return GetFieldValue("Name");} + set { + if (value==null) + throw new ArgumentException("value"); + var oldPath = ParentDirectory==null ? Name : GetPath(); + var newValue = value.ToLowerInvariant(); + SetFieldValue("Name", newValue); + } + } + + public string GetPath() + { + string directoryPath = ParentDirectory==null ? null : ParentDirectory.GetPath(); + if (String.IsNullOrEmpty(directoryPath)) + return Name; + return directoryPath + "/" + Name; + } + + protected override void OnValidate() + { + base.OnValidate(); + if (WebSite == null) + throw new InvalidOperationException("WebSite"); + if (ParentDirectory == null) + throw new InvalidOperationException("ParentDirectory"); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItemCollection.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItemCollection.cs index 7e541d1830..ada5f002be 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItemCollection.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentItemCollection.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.02 - -using System.Runtime.Serialization; -using Xtensive.Orm; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - public class ContentItemCollection - : EntitySet - where TContentItem : ContentItem - { - - protected override void OnAdding(Entity item) - { - ((ContentItem) item).WebSite = ((ContentDirectory) Owner).WebSite; - base.OnAdding(item); - } - - - protected ContentItemCollection(Entity owner, FieldInfo field) - : base(owner, field) - { - } - - protected ContentItemCollection(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.02 + +using System.Runtime.Serialization; +using Xtensive.Orm; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + public class ContentItemCollection + : EntitySet + where TContentItem : ContentItem + { + + protected override void OnAdding(Entity item) + { + ((ContentItem) item).WebSite = ((ContentDirectory) Owner).WebSite; + base.OnAdding(item); + } + + + protected ContentItemCollection(Entity owner, FieldInfo field) + : base(owner, field) + { + } + + protected ContentItemCollection(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReference.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReference.cs index e1ced555c9..3d1132a6d3 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReference.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReference.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - [HierarchyRoot] - public class ContentReference - : Entity - { - [Field, Key] - public int ID { get; private set;} - - [Field, Association(PairTo = "References", OnTargetRemove = OnRemoveAction.Cascade)] - public HtmlContentItem Owner { get; set;} - - [Field] - public ContentReferenceType ReferenceType { get; set;} - - [Field] - public WebSite WebSite { get; set;} - - [Field] - public string ContentPath { get; set;} - - [Field] - public string AbsoluteContentPath { - get { return GetFieldValue("AbsoluteContentPath");} - set { - if (value==null) - throw new ArgumentException("value"); - value = value.TrimStart('/'); - SetFieldValue("AbsoluteContentPath", value); - } - } - - [Field] - public int ContentID { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + [HierarchyRoot] + public class ContentReference + : Entity + { + [Field, Key] + public int ID { get; private set;} + + [Field, Association(PairTo = "References", OnTargetRemove = OnRemoveAction.Cascade)] + public HtmlContentItem Owner { get; set;} + + [Field] + public ContentReferenceType ReferenceType { get; set;} + + [Field] + public WebSite WebSite { get; set;} + + [Field] + public string ContentPath { get; set;} + + [Field] + public string AbsoluteContentPath { + get { return GetFieldValue("AbsoluteContentPath");} + set { + if (value==null) + throw new ArgumentException("value"); + value = value.TrimStart('/'); + SetFieldValue("AbsoluteContentPath", value); + } + } + + [Field] + public int ContentID { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceDto.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceDto.cs index d0baa6cab2..d3171b9686 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceDto.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceDto.cs @@ -1,15 +1,15 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - public class ContentReferenceDto - { - public string ContentPath { get; set;} - - public ContentReferenceType ContentReferenceType { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + public class ContentReferenceDto + { + public string ContentPath { get; set;} + + public ContentReferenceType ContentReferenceType { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceType.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceType.cs index 4c8bbc703a..fecf95ae6d 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceType.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/ContentReferenceType.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - public enum ContentReferenceType - { - Embedded, - Hyperlink - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + public enum ContentReferenceType + { + Embedded, + Hyperlink + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/HtmlContentItem.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/HtmlContentItem.cs index 04f6646e2f..a84e2f9d02 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/HtmlContentItem.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/HtmlContentItem.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.15 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public abstract class HtmlContentItem - : ContentItem - { - [Field] - public string HeaderFileID { get; set;} - - [Field] - public string BodyFileID { get; set;} - - [Field] - public DateTime? LastModificationDate { get; set;} - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet References { get; private set;} - - public virtual void NotifyModified() - { - LastModificationDate = DateTime.Now; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.15 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public abstract class HtmlContentItem + : ContentItem + { + [Field] + public string HeaderFileID { get; set;} + + [Field] + public string BodyFileID { get; set;} + + [Field] + public DateTime? LastModificationDate { get; set;} + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet References { get; private set;} + + public virtual void NotifyModified() + { + LastModificationDate = DateTime.Now; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/IContentStorageFile.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/IContentStorageFile.cs index 82469c76ea..614d1cc3ca 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/IContentStorageFile.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/IContentStorageFile.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.01 - -using System.IO; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - public interface IContentStorageFile - { - string ID { get; } - - Stream Open(); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.01 + +using System.IO; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + public interface IContentStorageFile + { + string ID { get; } + + Stream Open(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Menu.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Menu.cs index bc43093bf7..4b1163de35 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Menu.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Menu.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.16 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class Menu - : ContentItem - { - [Field] - public string StoredFileID { get; set;} - - [Field] - public AscxTemplate Template { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.16 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class Menu + : ContentItem + { + [Field] + public string StoredFileID { get; set;} + + [Field] + public AscxTemplate Template { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsDirectory.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsDirectory.cs index 269b4263ec..7a153857d8 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsDirectory.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsDirectory.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class NewsDirectory - : ContentDirectory - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class NewsDirectory + : ContentDirectory + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsList.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsList.cs index 45e6e9b16e..bff6bfd7fb 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsList.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsList.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class NewsList - : ContentItem - { - public NewsDirectory NewsDirectory { get; set;} - - public int? PageSize { get; set;} - - [Field] - public AscxTemplate Template { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class NewsList + : ContentItem + { + public NewsDirectory NewsDirectory { get; set;} + + public int? PageSize { get; set;} + + [Field] + public AscxTemplate Template { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsPage.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsPage.cs index 44786abda2..8eb7649536 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsPage.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/NewsPage.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.12.14 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class NewsPage - : Page - { - [Field] - public DateTime? NewsDate { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.12.14 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class NewsPage + : Page + { + [Field] + public DateTime? NewsDate { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Page.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Page.cs index 31c4614060..524821150e 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Page.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/Page.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class Page - : HtmlContentItem - { - [Field] - public string KeyWords { get; set;} - - [Field] - public string Title { get; set;} - - [Field] - public string Description { get; set;} - - [Field] - public bool UseDefaultTemplate { get; set;} - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public PageTemplate Template { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class Page + : HtmlContentItem + { + [Field] + public string KeyWords { get; set;} + + [Field] + public string Title { get; set;} + + [Field] + public string Description { get; set;} + + [Field] + public bool UseDefaultTemplate { get; set;} + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public PageTemplate Template { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/PageTemplate.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/PageTemplate.cs index a60c25172d..f60ddcdaeb 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/PageTemplate.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/PageTemplate.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class PageTemplate - : HtmlContentItem - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class PageTemplate + : HtmlContentItem + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSite.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSite.cs index 03e6f7cb6e..240f191472 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSite.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSite.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - public class WebSite - : ContentDirectory - { - [Field] - public string Title { get; set;} - - [Field, Association(OnOwnerRemove = OnRemoveAction.Cascade)] - public EntitySet Urls { get; private set; } - - [Field, Association(OnOwnerRemove = OnRemoveAction.Clear)] - public Page MissingPage { get; set;} - - public WebSite() - { - WebSite = this; - Name = ""; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + public class WebSite + : ContentDirectory + { + [Field] + public string Title { get; set;} + + [Field, Association(OnOwnerRemove = OnRemoveAction.Cascade)] + public EntitySet Urls { get; private set; } + + [Field, Association(OnOwnerRemove = OnRemoveAction.Clear)] + public Page MissingPage { get; set;} + + public WebSite() + { + WebSite = this; + Name = ""; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSiteUrl.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSiteUrl.cs index 3d2bced9ea..4963719b56 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSiteUrl.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Cms/WebSiteUrl.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Ilyin -// Created: 2009.09.08 - -using System; -using Xtensive.Orm.Validation; - -namespace Xtensive.Orm.Tests.ObjectModel.Cms -{ - [Serializable] - [HierarchyRoot] - public class WebSiteUrl - : Entity - { - [Field, Key] - public int ID { get; private set;} - - [Field] - public string Host { - get { return GetFieldValue("Host");} - set { - if (value!=null) { - SetFieldValue("Host", value.ToLowerInvariant()); - } - } - } - - [Field] - public string Path { - get { return GetFieldValue("Path");} - set { - if (value!=null) { - if (value[0]!='/') - throw new ArgumentException("Url path should start with '/'", "value"); - SetFieldValue("Path", value.ToLowerInvariant()); - } - } - } - - [NotNullConstraint] - [Field, Association(PairTo = "Urls", OnTargetRemove = OnRemoveAction.Cascade)] - public WebSite WebSite { get; set;} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Ilyin +// Created: 2009.09.08 + +using System; +using Xtensive.Orm.Validation; + +namespace Xtensive.Orm.Tests.ObjectModel.Cms +{ + [Serializable] + [HierarchyRoot] + public class WebSiteUrl + : Entity + { + [Field, Key] + public int ID { get; private set;} + + [Field] + public string Host { + get { return GetFieldValue("Host");} + set { + if (value!=null) { + SetFieldValue("Host", value.ToLowerInvariant()); + } + } + } + + [Field] + public string Path { + get { return GetFieldValue("Path");} + set { + if (value!=null) { + if (value[0]!='/') + throw new ArgumentException("Url path should start with '/'", "value"); + SetFieldValue("Path", value.ToLowerInvariant()); + } + } + } + + [NotNullConstraint] + [Field, Association(PairTo = "Urls", OnTargetRemove = OnRemoveAction.Cascade)] + public WebSite WebSite { get; set;} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/GenericModel.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/GenericModel.cs index 00f78680c4..63c4df96fd 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/GenericModel.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/GenericModel.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.10.07 - -using System; - -namespace Xtensive.Orm.Tests.ObjectModel.GenericModel -{ - [Serializable] - [HierarchyRoot] - public class A : Entity - where T : A - { - [Field] - public T Generic { get; private set; } - } - - [Serializable] - public class B : A - { - - } - - [Serializable] - public class C : A - where T : A - { - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.10.07 + +using System; + +namespace Xtensive.Orm.Tests.ObjectModel.GenericModel +{ + [Serializable] + [HierarchyRoot] + public class A : Entity + where T : A + { + [Field] + public T Generic { get; private set; } + } + + [Serializable] + public class B : A + { + + } + + [Serializable] + public class C : A + where T : A + { + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/GraphModel.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/GraphModel.cs index 435ee647b9..34efe7cfee 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/GraphModel.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/GraphModel.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.29 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Tests.ObjectModel.GraphModel -{ - [HierarchyRoot] - public class Trunk : Entity - { - [Field,Key] - public int Id { get; private set; } - [Field] - public Trunk Left { get; set; } - [Field, Association(PairTo = "Right", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] - public Trunk Right { get; set; } - [Field, Association(PairTo = "Trunk")] - public EntitySet Branches { get; private set; } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Branch : Entity - { - [Field, Key(1)] - public int Id { get; private set; } - [Field, Key(0)] - public Trunk Trunk { get; private set; } - [Field, Association(PairTo = "Branch")] - public EntitySet Leaves { get; private set; } - - public Branch(Trunk trunk, int id) - : base(trunk, id) - {} - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Leaf : Entity - { - [Field, Key(2)] - public int Id { get; private set; } - [Field, Key(0)] - public Trunk Trunk { get; private set; } - [Field, Key(1)] - public Branch Branch { get; private set; } - - public Leaf(Trunk trunk, Branch branch, int id) - : base(trunk, branch, id) - {} - } - +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.29 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Tests.ObjectModel.GraphModel +{ + [HierarchyRoot] + public class Trunk : Entity + { + [Field,Key] + public int Id { get; private set; } + [Field] + public Trunk Left { get; set; } + [Field, Association(PairTo = "Right", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)] + public Trunk Right { get; set; } + [Field, Association(PairTo = "Trunk")] + public EntitySet Branches { get; private set; } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Branch : Entity + { + [Field, Key(1)] + public int Id { get; private set; } + [Field, Key(0)] + public Trunk Trunk { get; private set; } + [Field, Association(PairTo = "Branch")] + public EntitySet Leaves { get; private set; } + + public Branch(Trunk trunk, int id) + : base(trunk, id) + {} + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Leaf : Entity + { + [Field, Key(2)] + public int Id { get; private set; } + [Field, Key(0)] + public Trunk Trunk { get; private set; } + [Field, Key(1)] + public Branch Branch { get; private set; } + + public Leaf(Trunk trunk, Branch branch, int id) + : base(trunk, branch, id) + {} + } + } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cd b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cd index e556893e66..dae07f87e5 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cd +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cd @@ -1,185 +1,185 @@ - - - - - - AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAACBAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - - - - AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Alphabet.cs - - - + + + + + + AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAACAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAACBAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAIAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + + + + AAAAAAAAAAAAAQAAAAAAAAIAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Alphabet.cs + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cs index 20c170211e..a988f35b1b 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Alphabet.cs @@ -1,234 +1,234 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved_ -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.24 - -using System; -using System.Diagnostics; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests.ObjectModel.Interfaces.Alphabet -{ - [Index("Name")] - public interface INamed : IEntity - { - [Field] - string Name { get; set; } - } - - [Index("Tag")] - public interface ITagged : IEntity - { - [Field] - string Tag { get; set; } - } - - [Index("First")] - public interface IComposite : IEntity - { - [Field] - string First { get; set; } - - [Field] - string Second { get; set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema.ClassTable)] - public class A : Entity, INamed - { - [Field, Key] - public long Id { get; private set; } - public string Name { get; set; } - } - - [Serializable] - public class B : A, INamed, ITagged - { - string INamed.Name { get; set; } - public string Tag { get; set; } - } - - [Serializable] - public class C : A, ITagged - { - string ITagged.Tag { get; set; } - } - - [Serializable] - public class D : B, INamed, IComposite - { - string INamed.Name { get; set; } - public string First { get; set; } - public string Second { get; set;} - } - - [Serializable] - public class E : D, IComposite - { - string IComposite.First { get; set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema.ConcreteTable)] - public class F : Entity, INamed - { - [Field, Key] - public long Id { get; private set; } - public string Name { get; set; } - } - - [Serializable] - public class G : F, INamed, ITagged - { - string INamed.Name { get; set; } - public string Tag { get; set; } - } - - [Serializable] - public class H : F, ITagged - { - string ITagged.Tag { get; set; } - } - - [Serializable] - public class I : G, INamed, IComposite - { - string INamed.Name { get; set; } - public string First { get; set; } - public string Second { get; set; } - } - - [Serializable] - public class J : I, IComposite - { - string IComposite.First { get; set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema.SingleTable)] - public class K : Entity, INamed - { - [Field, Key] - public long Id { get; private set; } - public string Name { get; set; } - } - - [Serializable] - public class L : K, INamed, ITagged - { - string INamed.Name { get; set; } - public string Tag { get; set; } - } - - [Serializable] - public class M : K, ITagged - { - string ITagged.Tag { get; set; } - } - - [Serializable] - public class N : L, INamed, IComposite - { - string INamed.Name { get; set; } - public string First { get; set; } - public string Second { get; set; } - } - - [Serializable] - public class O : N, IComposite - { - string IComposite.First { get; set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema.ClassTable)] - [TypeDiscriminatorValue(0, Default = true)] - public class P : Entity, INamed - { - [Field, Key] - public long Id { get; private set; } - - [Field, TypeDiscriminator] - public int ElementType { get; private set; } - - public string Name { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(1)] - public class Q : P, INamed, ITagged - { - string INamed.Name { get; set; } - public string Tag { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(2)] - public class R : P, ITagged - { - string ITagged.Tag { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(3)] - public class S : Q, INamed, IComposite - { - string INamed.Name { get; set; } - public string First { get; set; } - public string Second { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(4)] - public class T : S, IComposite - { - string IComposite.First { get; set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema.SingleTable)] - [TypeDiscriminatorValue(0, Default = true)] - public class U : Entity, INamed - { - [Field, Key] - public long Id { get; private set; } - - [Field, TypeDiscriminator] - public int ElementType { get; private set; } - - public string Name { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(1)] - public class V : U, INamed, ITagged - { - string INamed.Name { get; set; } - public string Tag { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(2)] - public class W : U, ITagged - { - string ITagged.Tag { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(3)] - public class X : V, INamed, IComposite - { - string INamed.Name { get; set; } - public string First { get; set; } - public string Second { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue(4)] - public class Y : X, IComposite - { - string IComposite.First { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved_ +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.24 + +using System; +using System.Diagnostics; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests.ObjectModel.Interfaces.Alphabet +{ + [Index("Name")] + public interface INamed : IEntity + { + [Field] + string Name { get; set; } + } + + [Index("Tag")] + public interface ITagged : IEntity + { + [Field] + string Tag { get; set; } + } + + [Index("First")] + public interface IComposite : IEntity + { + [Field] + string First { get; set; } + + [Field] + string Second { get; set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema.ClassTable)] + public class A : Entity, INamed + { + [Field, Key] + public long Id { get; private set; } + public string Name { get; set; } + } + + [Serializable] + public class B : A, INamed, ITagged + { + string INamed.Name { get; set; } + public string Tag { get; set; } + } + + [Serializable] + public class C : A, ITagged + { + string ITagged.Tag { get; set; } + } + + [Serializable] + public class D : B, INamed, IComposite + { + string INamed.Name { get; set; } + public string First { get; set; } + public string Second { get; set;} + } + + [Serializable] + public class E : D, IComposite + { + string IComposite.First { get; set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema.ConcreteTable)] + public class F : Entity, INamed + { + [Field, Key] + public long Id { get; private set; } + public string Name { get; set; } + } + + [Serializable] + public class G : F, INamed, ITagged + { + string INamed.Name { get; set; } + public string Tag { get; set; } + } + + [Serializable] + public class H : F, ITagged + { + string ITagged.Tag { get; set; } + } + + [Serializable] + public class I : G, INamed, IComposite + { + string INamed.Name { get; set; } + public string First { get; set; } + public string Second { get; set; } + } + + [Serializable] + public class J : I, IComposite + { + string IComposite.First { get; set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema.SingleTable)] + public class K : Entity, INamed + { + [Field, Key] + public long Id { get; private set; } + public string Name { get; set; } + } + + [Serializable] + public class L : K, INamed, ITagged + { + string INamed.Name { get; set; } + public string Tag { get; set; } + } + + [Serializable] + public class M : K, ITagged + { + string ITagged.Tag { get; set; } + } + + [Serializable] + public class N : L, INamed, IComposite + { + string INamed.Name { get; set; } + public string First { get; set; } + public string Second { get; set; } + } + + [Serializable] + public class O : N, IComposite + { + string IComposite.First { get; set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema.ClassTable)] + [TypeDiscriminatorValue(0, Default = true)] + public class P : Entity, INamed + { + [Field, Key] + public long Id { get; private set; } + + [Field, TypeDiscriminator] + public int ElementType { get; private set; } + + public string Name { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(1)] + public class Q : P, INamed, ITagged + { + string INamed.Name { get; set; } + public string Tag { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(2)] + public class R : P, ITagged + { + string ITagged.Tag { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(3)] + public class S : Q, INamed, IComposite + { + string INamed.Name { get; set; } + public string First { get; set; } + public string Second { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(4)] + public class T : S, IComposite + { + string IComposite.First { get; set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema.SingleTable)] + [TypeDiscriminatorValue(0, Default = true)] + public class U : Entity, INamed + { + [Field, Key] + public long Id { get; private set; } + + [Field, TypeDiscriminator] + public int ElementType { get; private set; } + + public string Name { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(1)] + public class V : U, INamed, ITagged + { + string INamed.Name { get; set; } + public string Tag { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(2)] + public class W : U, ITagged + { + string ITagged.Tag { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(3)] + public class X : V, INamed, IComposite + { + string INamed.Name { get; set; } + public string First { get; set; } + public string Second { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue(4)] + public class Y : X, IComposite + { + string IComposite.First { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cd b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cd index 2a18a239b3..bea185c4a2 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cd +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cd @@ -1,48 +1,48 @@ - - - - - - AgACAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - - - - - EAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - - - - - AAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - - - - EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - - - - AAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - - - - EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ObjectModel\Interfaces\Slavery.cs - - - + + + + + + AgACAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + + + + + EAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + + + + + AAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + + + + EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + + + + AAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + + + + EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + ObjectModel\Interfaces\Slavery.cs + + + \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cs b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cs index a2cbecf316..21e7f2e907 100644 --- a/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cs +++ b/Orm/Xtensive.Orm.Tests/ObjectModel/Interfaces/Slavery.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.24 - -using System; -using System.Diagnostics; - -namespace Xtensive.Orm.Tests.ObjectModel.Interfaces.Slavery -{ - public interface ISlave : IEntity - { - [Field] - IMaster Master { get; set; } - } - - public interface IMaster : IEntity - { - [Field, Association(PairTo = "Master")] - EntitySet Slaves { get; } - } - - public interface ISlave : ISlave - where TMaster : IMaster - { - [Field] - TMaster XMaster { get; set; } - } - - public interface IMaster : IMaster - where TSlave : ISlave - { - [Field, Association(PairTo = "XMaster")] - EntitySet XSlaves { get; } - } - - [Serializable] - [HierarchyRoot] - public class Slave : Entity, ISlave> - { - [Field,Key] - public long Id { get; private set; } - - public IMaster Master { get; set;} - - public IMaster XMaster { get; set;} - - } - - [Serializable] - [HierarchyRoot] - public class Master : Entity, IMaster - { - [Field, Key] - public long Id { get; private set; } - - public EntitySet Slaves { get; private set;} - - public EntitySet XSlaves { get; private set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.24 + +using System; +using System.Diagnostics; + +namespace Xtensive.Orm.Tests.ObjectModel.Interfaces.Slavery +{ + public interface ISlave : IEntity + { + [Field] + IMaster Master { get; set; } + } + + public interface IMaster : IEntity + { + [Field, Association(PairTo = "Master")] + EntitySet Slaves { get; } + } + + public interface ISlave : ISlave + where TMaster : IMaster + { + [Field] + TMaster XMaster { get; set; } + } + + public interface IMaster : IMaster + where TSlave : ISlave + { + [Field, Association(PairTo = "XMaster")] + EntitySet XSlaves { get; } + } + + [Serializable] + [HierarchyRoot] + public class Slave : Entity, ISlave> + { + [Field,Key] + public long Id { get; private set; } + + public IMaster Master { get; set;} + + public IMaster XMaster { get; set;} + + } + + [Serializable] + [HierarchyRoot] + public class Master : Entity, IMaster + { + [Field, Key] + public long Id { get; private set; } + + public EntitySet Slaves { get; private set;} + + public EntitySet XSlaves { get; private set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Rse/HeaderParseTest.cs b/Orm/Xtensive.Orm.Tests/Rse/HeaderParseTest.cs index 3cd1bba899..5ed542d9c8 100644 --- a/Orm/Xtensive.Orm.Tests/Rse/HeaderParseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Rse/HeaderParseTest.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.07 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Rse.Providers; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Tests.Storage.BookAuthorModel; - -namespace Xtensive.Orm.Tests.Rse -{ - public class HeaderParseTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); - return config; - } - - [Test] - public void MainTest() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Book book = new Book {Title = "Title", Text = "Text"}; - key = book.Key; - Session.Current.SaveChanges(); - t.Complete(); - } - } - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - EntityState state = Session.Current.EntityStateCache[key, true]; - Assert.IsNull(state); - IndexInfo ii = Domain.Model.Types[typeof (Book)].Indexes.PrimaryIndex; - - // Select * - CompilableProvider rsMain = ii.GetQuery(); - UpdateCache(session, rsMain.GetRecordSet(session)); - state = Session.Current.EntityStateCache[key, true]; - Assert.IsNotNull(state); - Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); - Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); - ResetState(state); - - // Select Id, TypeId, Title - CompilableProvider rsTitle = rsMain.Select(0, 1, 2); - UpdateCache(session, rsTitle.GetRecordSet(session)); - state = Session.Current.EntityStateCache[key, true]; - Assert.IsNotNull(state); - Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); - Assert.IsFalse(state.Tuple.GetFieldState(3).IsAvailable()); - ResetState(state); - - // Select Id, TypeId, Text - CompilableProvider rsText = rsMain.Select(0, 1, 3); - UpdateCache(session, rsText.GetRecordSet(session)); - state = Session.Current.EntityStateCache[key, true]; - Assert.IsNotNull(state); - Assert.IsFalse(state.Tuple.GetFieldState(2).IsAvailable()); - Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); - ResetState(state); - - // Select a.Id, a.TypeId, a.Title, b.Id, b.TypeId, b.Text - CompilableProvider rsJoin = rsTitle.Alias("a").Join(rsText.Alias("b"), new Pair(0, 0), new Pair(1, 1)); - UpdateCache(session, rsJoin.GetRecordSet(session)); - state = Session.Current.EntityStateCache[key, true]; - Assert.IsNotNull(state); - Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); - Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); - ResetState(state); - } - } - } - - private void UpdateCache(Session session, RecordSet source) - { - var reader = Domain.RecordSetReader; - foreach (var record in reader.Read(source, source.Header, session)) { - for (int i = 0; i < record.Count; i++) { - var key = record.GetKey(i); - if (key==null) - continue; - var tuple = record.GetTuple(i); - if (tuple==null) - continue; - session.UpdateStateInCache(key, tuple); - } - } - } - - private static void ResetState(EntityState state) - { - typeof (EntityState).InvokeMember( - "Invalidate", - BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, - null, state, new object[0]); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.07 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Rse.Providers; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Tests.Storage.BookAuthorModel; + +namespace Xtensive.Orm.Tests.Rse +{ + public class HeaderParseTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); + return config; + } + + [Test] + public void MainTest() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Book book = new Book {Title = "Title", Text = "Text"}; + key = book.Key; + Session.Current.SaveChanges(); + t.Complete(); + } + } + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + EntityState state = Session.Current.EntityStateCache[key, true]; + Assert.IsNull(state); + IndexInfo ii = Domain.Model.Types[typeof (Book)].Indexes.PrimaryIndex; + + // Select * + CompilableProvider rsMain = ii.GetQuery(); + UpdateCache(session, rsMain.GetRecordSet(session)); + state = Session.Current.EntityStateCache[key, true]; + Assert.IsNotNull(state); + Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); + Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); + ResetState(state); + + // Select Id, TypeId, Title + CompilableProvider rsTitle = rsMain.Select(0, 1, 2); + UpdateCache(session, rsTitle.GetRecordSet(session)); + state = Session.Current.EntityStateCache[key, true]; + Assert.IsNotNull(state); + Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); + Assert.IsFalse(state.Tuple.GetFieldState(3).IsAvailable()); + ResetState(state); + + // Select Id, TypeId, Text + CompilableProvider rsText = rsMain.Select(0, 1, 3); + UpdateCache(session, rsText.GetRecordSet(session)); + state = Session.Current.EntityStateCache[key, true]; + Assert.IsNotNull(state); + Assert.IsFalse(state.Tuple.GetFieldState(2).IsAvailable()); + Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); + ResetState(state); + + // Select a.Id, a.TypeId, a.Title, b.Id, b.TypeId, b.Text + CompilableProvider rsJoin = rsTitle.Alias("a").Join(rsText.Alias("b"), new Pair(0, 0), new Pair(1, 1)); + UpdateCache(session, rsJoin.GetRecordSet(session)); + state = Session.Current.EntityStateCache[key, true]; + Assert.IsNotNull(state); + Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable()); + Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable()); + ResetState(state); + } + } + } + + private void UpdateCache(Session session, RecordSet source) + { + var reader = Domain.RecordSetReader; + foreach (var record in reader.Read(source, source.Header, session)) { + for (int i = 0; i < record.Count; i++) { + var key = record.GetKey(i); + if (key==null) + continue; + var tuple = record.GetTuple(i); + if (tuple==null) + continue; + session.UpdateStateInCache(key, tuple); + } + } + } + + private static void ResetState(EntityState state) + { + typeof (EntityState).InvokeMember( + "Invalidate", + BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, + null, state, new object[0]); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Rse/IncludeProviderTest.cs b/Orm/Xtensive.Orm.Tests/Rse/IncludeProviderTest.cs index 70254880ba..9fbe892bd5 100644 --- a/Orm/Xtensive.Orm.Tests/Rse/IncludeProviderTest.cs +++ b/Orm/Xtensive.Orm.Tests/Rse/IncludeProviderTest.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.10.27 - -using System; -using System.Linq; -using NUnit.Framework; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Orm.Rse; - -namespace Xtensive.Orm.Tests.Rse -{ - [Serializable] - [TestFixture, Category("Rse")] - public class IncludeProviderTest: ChinookDOModelTest - { - [Test] - public void SimpleTest() - { - var tracks = Session.Demand().Query.All().Take(10).ToList(); - var ids = tracks.Select(supplier => (Tuple)Tuple.Create(supplier.TrackId)); - - var trackRs = Domain.Model.Types[typeof (Track)].Indexes.PrimaryIndex.GetQuery(); - var inRs = trackRs.Include(() => ids, "columnName", new[] {0}); - var inIndex = inRs.Header.Columns.Count-1; - var whereRs = inRs.Filter(tuple => tuple.GetValueOrDefault(inIndex)); - var result = whereRs.GetRecordSet(Session.Current).ToList(); - Assert.AreEqual(0, whereRs.GetRecordSet(Session.Current).Select(t => t.GetValue(0)).Except(tracks.Select(s => s.TrackId)).Count()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.10.27 + +using System; +using System.Linq; +using NUnit.Framework; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Orm.Rse; + +namespace Xtensive.Orm.Tests.Rse +{ + [Serializable] + [TestFixture, Category("Rse")] + public class IncludeProviderTest: ChinookDOModelTest + { + [Test] + public void SimpleTest() + { + var tracks = Session.Demand().Query.All().Take(10).ToList(); + var ids = tracks.Select(supplier => (Tuple)Tuple.Create(supplier.TrackId)); + + var trackRs = Domain.Model.Types[typeof (Track)].Indexes.PrimaryIndex.GetQuery(); + var inRs = trackRs.Include(() => ids, "columnName", new[] {0}); + var inIndex = inRs.Header.Columns.Count-1; + var whereRs = inRs.Filter(tuple => tuple.GetValueOrDefault(inIndex)); + var result = whereRs.GetRecordSet(Session.Current).ToList(); + Assert.AreEqual(0, whereRs.GetRecordSet(Session.Current).Select(t => t.GetValue(0)).Except(tracks.Select(s => s.TrackId)).Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AbstractGenericsTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AbstractGenericsTest.cs index a13c347a2b..ea4e24276b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AbstractGenericsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AbstractGenericsTest.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.08.03 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Tests.Storage.AbstractGenericTest_Model; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace AbstractGenericTest_Model - { - [HierarchyRoot] - public abstract class Media : Entity - { - [Field,Key] - public int Id { get; private set; } - - [Field] - public string Description { get; set; } - } - - public class SimpleMedia : Media - { - [Field] - public decimal Foo { get; set; } - } - - public class ComplexMedia : Media - { - [Field] - public DateTime Bar { get; set; } - } - - [HierarchyRoot] - public abstract class Track : Entity - where T : Media - { - [Field,Key] - public int Id { get; private set; } - - [Field] - public T Media { get; private set; } - - [Field] - public TimeSpan Duration { get; private set; } - - [Field] - public TimeSpan StartPosition { get; private set; } - - protected Track(TimeSpan duration, TimeSpan startPosition, T media) - { - Duration = duration; - StartPosition = startPosition; - Media = media; - } - } - - public class SimpleTrack : Track - { - public SimpleTrack(TimeSpan duration, TimeSpan startPosition, SimpleMedia media) - : base(duration, startPosition, media) - {} - } - - public class ComplexTrack : Track - { - public ComplexTrack(TimeSpan duration, TimeSpan startPosition, ComplexMedia media) - : base(duration, startPosition, media) - {} - } - } - - public class AbstractGenericsTest - { - [Test] - public void MediaTest() - { - var config = DomainConfigurationFactory.Create(); - config.Types.Register(typeof(Media)); - config.Types.Register(typeof(Track)); - config.Types.Register(typeof(Track)); - config.Types.Register(typeof(SimpleTrack)); - config.Types.Register(typeof(ComplexTrack)); - var domain = Domain.Build(config); - using (var session = domain.OpenSession()) - using (var t = session.OpenTransaction()) { - new SimpleTrack(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(10), new SimpleMedia() {Description = "Simple", Foo = 23}); - new ComplexTrack(TimeSpan.FromMinutes(6), TimeSpan.FromMinutes(15), new ComplexMedia() {Description = "Simple", Bar = DateTime.Now}); - var listSimpleMedia = session.Query.All>().ToList(); - var listComplexMedia = session.Query.All>().ToList(); - Assert.AreEqual(1,listSimpleMedia.Count); - Assert.AreEqual(1,listComplexMedia.Count); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.08.03 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Tests.Storage.AbstractGenericTest_Model; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace AbstractGenericTest_Model + { + [HierarchyRoot] + public abstract class Media : Entity + { + [Field,Key] + public int Id { get; private set; } + + [Field] + public string Description { get; set; } + } + + public class SimpleMedia : Media + { + [Field] + public decimal Foo { get; set; } + } + + public class ComplexMedia : Media + { + [Field] + public DateTime Bar { get; set; } + } + + [HierarchyRoot] + public abstract class Track : Entity + where T : Media + { + [Field,Key] + public int Id { get; private set; } + + [Field] + public T Media { get; private set; } + + [Field] + public TimeSpan Duration { get; private set; } + + [Field] + public TimeSpan StartPosition { get; private set; } + + protected Track(TimeSpan duration, TimeSpan startPosition, T media) + { + Duration = duration; + StartPosition = startPosition; + Media = media; + } + } + + public class SimpleTrack : Track + { + public SimpleTrack(TimeSpan duration, TimeSpan startPosition, SimpleMedia media) + : base(duration, startPosition, media) + {} + } + + public class ComplexTrack : Track + { + public ComplexTrack(TimeSpan duration, TimeSpan startPosition, ComplexMedia media) + : base(duration, startPosition, media) + {} + } + } + + public class AbstractGenericsTest + { + [Test] + public void MediaTest() + { + var config = DomainConfigurationFactory.Create(); + config.Types.Register(typeof(Media)); + config.Types.Register(typeof(Track)); + config.Types.Register(typeof(Track)); + config.Types.Register(typeof(SimpleTrack)); + config.Types.Register(typeof(ComplexTrack)); + var domain = Domain.Build(config); + using (var session = domain.OpenSession()) + using (var t = session.OpenTransaction()) { + new SimpleTrack(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(10), new SimpleMedia() {Description = "Simple", Foo = 23}); + new ComplexTrack(TimeSpan.FromMinutes(6), TimeSpan.FromMinutes(15), new ComplexMedia() {Description = "Simple", Bar = DateTime.Now}); + var listSimpleMedia = session.Query.All>().ToList(); + var listComplexMedia = session.Query.All>().ToList(); + Assert.AreEqual(1,listSimpleMedia.Count); + Assert.AreEqual(1,listComplexMedia.Count); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ActivatorTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ActivatorTest.cs index f80f7be499..a53fa6eb4c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ActivatorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ActivatorTest.cs @@ -1,116 +1,116 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2008.06.11 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.ActivatorModel; -using System.Linq; - -namespace Xtensive.Orm.Tests.Storage.ActivatorModel -{ - [Serializable] - [HierarchyRoot] - public abstract class Ancestor : Entity - { - [Field, Key] - public int ID { get; private set; } - } - - [Serializable] - public class Descendant : Ancestor - { - [Field] - public int Number { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class InitializebleClass : Entity - { - public object syncRoot = new object(); - - protected override void OnInitialize() - { - base.OnInitialize(); - syncRoot = new object(); - } - - public InitializebleClass() - { - syncRoot = new object(); - // , syncRoot. - Assert.IsNotNull(syncRoot); - } - - [Field, Key] - public int ID { get; private set; } - } - - -} - -namespace Xtensive.Orm.Tests.Storage -{ - - - public class ActivatorTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.ActivatorModel"); - return config; - } - - [Test] - public void TestFieldInitializer() - { - using (var session = Domain.OpenSession()) - { - using (var t = session.OpenTransaction()) - { - var obj1 = new InitializebleClass(); - Assert.IsNotNull(obj1.syncRoot); - t.Complete(); - } - } - using (var session = Domain.OpenSession()) - { - using (var t = session.OpenTransaction()) - { - var obj1 = session.Query.All().First(); - Assert.IsNotNull(obj1); - Assert.IsNotNull(obj1.syncRoot); - t.Complete(); - } - } - } - - [Test] - public void Test() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var descendant = new Descendant(); - key = descendant.Key; - t.Complete(); - } - } - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - var ancestor = session.Query.SingleOrDefault(key); - Assert.IsNotNull(ancestor); - - var descendant = session.Query.SingleOrDefault(key); - Assert.IsNotNull(descendant); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2008.06.11 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.ActivatorModel; +using System.Linq; + +namespace Xtensive.Orm.Tests.Storage.ActivatorModel +{ + [Serializable] + [HierarchyRoot] + public abstract class Ancestor : Entity + { + [Field, Key] + public int ID { get; private set; } + } + + [Serializable] + public class Descendant : Ancestor + { + [Field] + public int Number { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class InitializebleClass : Entity + { + public object syncRoot = new object(); + + protected override void OnInitialize() + { + base.OnInitialize(); + syncRoot = new object(); + } + + public InitializebleClass() + { + syncRoot = new object(); + // , syncRoot. + Assert.IsNotNull(syncRoot); + } + + [Field, Key] + public int ID { get; private set; } + } + + +} + +namespace Xtensive.Orm.Tests.Storage +{ + + + public class ActivatorTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.ActivatorModel"); + return config; + } + + [Test] + public void TestFieldInitializer() + { + using (var session = Domain.OpenSession()) + { + using (var t = session.OpenTransaction()) + { + var obj1 = new InitializebleClass(); + Assert.IsNotNull(obj1.syncRoot); + t.Complete(); + } + } + using (var session = Domain.OpenSession()) + { + using (var t = session.OpenTransaction()) + { + var obj1 = session.Query.All().First(); + Assert.IsNotNull(obj1); + Assert.IsNotNull(obj1.syncRoot); + t.Complete(); + } + } + } + + [Test] + public void Test() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var descendant = new Descendant(); + key = descendant.Key; + t.Complete(); + } + } + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + var ancestor = session.Query.SingleOrDefault(key); + Assert.IsNotNull(ancestor); + + var descendant = session.Query.SingleOrDefault(key); + Assert.IsNotNull(descendant); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AggregateTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AggregateTest.cs index 9337f1ebd5..47dd423985 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AggregateTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AggregateTest.cs @@ -1,143 +1,143 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.28 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using System; - -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DbTypeSupportModel; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class AggregateTest : AutoBuildTest - { - private List all; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (X).Assembly, typeof (X).Namespace); - return configuration; - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - CreateSessionAndTransaction(); - - for (int i = 0; i < 10; i++) { - var x = new X(); - x.FByte = (byte) i; - x.FSByte = (sbyte) i; - x.FShort = (short) i; - x.FUShort = (ushort) i; - x.FInt = i; - x.FUInt = (uint) i; - x.FLong = i; - x.FULong = (ulong) i; - x.FDecimal = i; - x.FFloat = i; - x.FDouble = i; - x.FDateTime = new DateTime(2009, 1, i + 1); - x.FTimeSpan = new TimeSpan(i, 0, 0, 0); - } - - all = Session.Demand().Query.All().ToList(); - } - - [Test] - public void SumTest() - { - Assert.AreEqual(all.Sum(x => x.FByte), Session.Demand().Query.All().Sum(x => x.FByte)); - Assert.AreEqual(all.Sum(x => x.FSByte), Session.Demand().Query.All().Sum(x => x.FSByte)); - - Assert.AreEqual(all.Sum(x => x.FShort), Session.Demand().Query.All().Sum(x => x.FShort)); - Assert.AreEqual(all.Sum(x => x.FUShort), Session.Demand().Query.All().Sum(x => x.FUShort)); - - Assert.AreEqual(all.Sum(x => x.FInt), Session.Demand().Query.All().Sum(x => x.FInt)); - Assert.AreEqual(all.Sum(x => x.FUInt), Session.Demand().Query.All().Sum(x => x.FUInt)); - - Assert.AreEqual(all.Sum(x => x.FLong), Session.Demand().Query.All().Sum(x => x.FLong)); - Assert.AreEqual(all.Sum(x => x.FFloat), Session.Demand().Query.All().Sum(x => x.FFloat)); - Assert.AreEqual(all.Sum(x => x.FDecimal), Session.Demand().Query.All().Sum(x => x.FDecimal)); - } - - [Test] - public void AverageTest() - { - //"If Field is of an integer type, AVG is always rounded towards 0. - // For instance, 6 non-null INT records with a sum of -11 yield an average of -1, not -2." - // Firebird documentation - // Funny, isn't it? - if (Domain.Configuration.ConnectionInfo.Provider==WellKnown.Provider.Firebird) { - Assert.AreEqual(Math.Truncate(all.Average(x => x.FByte)), Session.Demand().Query.All().Average(x => x.FByte)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FSByte)), Session.Demand().Query.All().Average(x => x.FSByte)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FShort)), Session.Demand().Query.All().Average(x => x.FShort)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FUShort)), Session.Demand().Query.All().Average(x => x.FUShort)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FInt)), Session.Demand().Query.All().Average(x => x.FInt)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FUInt)), Session.Demand().Query.All().Average(x => x.FUInt)); - Assert.AreEqual(Math.Truncate(all.Average(x => x.FLong)), Session.Demand().Query.All().Average(x => x.FLong)); - } - else { - Assert.AreEqual(all.Average(x => x.FByte), Session.Demand().Query.All().Average(x => x.FByte)); - Assert.AreEqual(all.Average(x => x.FSByte), Session.Demand().Query.All().Average(x => x.FSByte)); - Assert.AreEqual(all.Average(x => x.FShort), Session.Demand().Query.All().Average(x => x.FShort)); - Assert.AreEqual(all.Average(x => x.FUShort), Session.Demand().Query.All().Average(x => x.FUShort)); - Assert.AreEqual(all.Average(x => x.FInt), Session.Demand().Query.All().Average(x => x.FInt)); - Assert.AreEqual(all.Average(x => x.FUInt), Session.Demand().Query.All().Average(x => x.FUInt)); - Assert.AreEqual(all.Average(x => x.FLong), Session.Demand().Query.All().Average(x => x.FLong)); - } - - Assert.AreEqual(all.Average(x => x.FFloat), Session.Demand().Query.All().Average(x => x.FFloat)); - Assert.AreEqual(all.Average(x => x.FDecimal), Session.Demand().Query.All().Average(x => x.FDecimal)); - } - - [Test] - public void MinTest() - { - Assert.AreEqual(all.Min(x => x.FByte), Session.Demand().Query.All().Min(x => x.FByte)); - Assert.AreEqual(all.Min(x => x.FSByte), Session.Demand().Query.All().Min(x => x.FSByte)); - - Assert.AreEqual(all.Min(x => x.FShort), Session.Demand().Query.All().Min(x => x.FShort)); - Assert.AreEqual(all.Min(x => x.FUShort), Session.Demand().Query.All().Min(x => x.FUShort)); - - Assert.AreEqual(all.Min(x => x.FInt), Session.Demand().Query.All().Min(x => x.FInt)); - Assert.AreEqual(all.Min(x => x.FUInt), Session.Demand().Query.All().Min(x => x.FUInt)); - - Assert.AreEqual(all.Min(x => x.FLong), Session.Demand().Query.All().Min(x => x.FLong)); - Assert.AreEqual(all.Min(x => x.FFloat), Session.Demand().Query.All().Min(x => x.FFloat)); - Assert.AreEqual(all.Min(x => x.FDecimal), Session.Demand().Query.All().Min(x => x.FDecimal)); - - Assert.AreEqual(all.Min(x => x.FDateTime), Session.Demand().Query.All().Min(x => x.FDateTime)); - Assert.AreEqual(all.Min(x => x.FTimeSpan), Session.Demand().Query.All().Min(x => x.FTimeSpan)); - - } - - [Test] - public void MaxTest() - { - Assert.AreEqual(all.Max(x => x.FByte), Session.Demand().Query.All().Max(x => x.FByte)); - Assert.AreEqual(all.Max(x => x.FSByte), Session.Demand().Query.All().Max(x => x.FSByte)); - - Assert.AreEqual(all.Max(x => x.FShort), Session.Demand().Query.All().Max(x => x.FShort)); - Assert.AreEqual(all.Max(x => x.FUShort), Session.Demand().Query.All().Max(x => x.FUShort)); - - Assert.AreEqual(all.Max(x => x.FInt), Session.Demand().Query.All().Max(x => x.FInt)); - Assert.AreEqual(all.Max(x => x.FUInt), Session.Demand().Query.All().Max(x => x.FUInt)); - - Assert.AreEqual(all.Max(x => x.FLong), Session.Demand().Query.All().Max(x => x.FLong)); - Assert.AreEqual(all.Max(x => x.FFloat), Session.Demand().Query.All().Max(x => x.FFloat)); - Assert.AreEqual(all.Max(x => x.FDecimal), Session.Demand().Query.All().Max(x => x.FDecimal)); - - Assert.AreEqual(all.Max(x => x.FDateTime), Session.Demand().Query.All().Max(x => x.FDateTime)); - Assert.AreEqual(all.Max(x => x.FTimeSpan), Session.Demand().Query.All().Max(x => x.FTimeSpan)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.28 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using System; + +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DbTypeSupportModel; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class AggregateTest : AutoBuildTest + { + private List all; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (X).Assembly, typeof (X).Namespace); + return configuration; + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + CreateSessionAndTransaction(); + + for (int i = 0; i < 10; i++) { + var x = new X(); + x.FByte = (byte) i; + x.FSByte = (sbyte) i; + x.FShort = (short) i; + x.FUShort = (ushort) i; + x.FInt = i; + x.FUInt = (uint) i; + x.FLong = i; + x.FULong = (ulong) i; + x.FDecimal = i; + x.FFloat = i; + x.FDouble = i; + x.FDateTime = new DateTime(2009, 1, i + 1); + x.FTimeSpan = new TimeSpan(i, 0, 0, 0); + } + + all = Session.Demand().Query.All().ToList(); + } + + [Test] + public void SumTest() + { + Assert.AreEqual(all.Sum(x => x.FByte), Session.Demand().Query.All().Sum(x => x.FByte)); + Assert.AreEqual(all.Sum(x => x.FSByte), Session.Demand().Query.All().Sum(x => x.FSByte)); + + Assert.AreEqual(all.Sum(x => x.FShort), Session.Demand().Query.All().Sum(x => x.FShort)); + Assert.AreEqual(all.Sum(x => x.FUShort), Session.Demand().Query.All().Sum(x => x.FUShort)); + + Assert.AreEqual(all.Sum(x => x.FInt), Session.Demand().Query.All().Sum(x => x.FInt)); + Assert.AreEqual(all.Sum(x => x.FUInt), Session.Demand().Query.All().Sum(x => x.FUInt)); + + Assert.AreEqual(all.Sum(x => x.FLong), Session.Demand().Query.All().Sum(x => x.FLong)); + Assert.AreEqual(all.Sum(x => x.FFloat), Session.Demand().Query.All().Sum(x => x.FFloat)); + Assert.AreEqual(all.Sum(x => x.FDecimal), Session.Demand().Query.All().Sum(x => x.FDecimal)); + } + + [Test] + public void AverageTest() + { + //"If Field is of an integer type, AVG is always rounded towards 0. + // For instance, 6 non-null INT records with a sum of -11 yield an average of -1, not -2." + // Firebird documentation + // Funny, isn't it? + if (Domain.Configuration.ConnectionInfo.Provider==WellKnown.Provider.Firebird) { + Assert.AreEqual(Math.Truncate(all.Average(x => x.FByte)), Session.Demand().Query.All().Average(x => x.FByte)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FSByte)), Session.Demand().Query.All().Average(x => x.FSByte)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FShort)), Session.Demand().Query.All().Average(x => x.FShort)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FUShort)), Session.Demand().Query.All().Average(x => x.FUShort)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FInt)), Session.Demand().Query.All().Average(x => x.FInt)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FUInt)), Session.Demand().Query.All().Average(x => x.FUInt)); + Assert.AreEqual(Math.Truncate(all.Average(x => x.FLong)), Session.Demand().Query.All().Average(x => x.FLong)); + } + else { + Assert.AreEqual(all.Average(x => x.FByte), Session.Demand().Query.All().Average(x => x.FByte)); + Assert.AreEqual(all.Average(x => x.FSByte), Session.Demand().Query.All().Average(x => x.FSByte)); + Assert.AreEqual(all.Average(x => x.FShort), Session.Demand().Query.All().Average(x => x.FShort)); + Assert.AreEqual(all.Average(x => x.FUShort), Session.Demand().Query.All().Average(x => x.FUShort)); + Assert.AreEqual(all.Average(x => x.FInt), Session.Demand().Query.All().Average(x => x.FInt)); + Assert.AreEqual(all.Average(x => x.FUInt), Session.Demand().Query.All().Average(x => x.FUInt)); + Assert.AreEqual(all.Average(x => x.FLong), Session.Demand().Query.All().Average(x => x.FLong)); + } + + Assert.AreEqual(all.Average(x => x.FFloat), Session.Demand().Query.All().Average(x => x.FFloat)); + Assert.AreEqual(all.Average(x => x.FDecimal), Session.Demand().Query.All().Average(x => x.FDecimal)); + } + + [Test] + public void MinTest() + { + Assert.AreEqual(all.Min(x => x.FByte), Session.Demand().Query.All().Min(x => x.FByte)); + Assert.AreEqual(all.Min(x => x.FSByte), Session.Demand().Query.All().Min(x => x.FSByte)); + + Assert.AreEqual(all.Min(x => x.FShort), Session.Demand().Query.All().Min(x => x.FShort)); + Assert.AreEqual(all.Min(x => x.FUShort), Session.Demand().Query.All().Min(x => x.FUShort)); + + Assert.AreEqual(all.Min(x => x.FInt), Session.Demand().Query.All().Min(x => x.FInt)); + Assert.AreEqual(all.Min(x => x.FUInt), Session.Demand().Query.All().Min(x => x.FUInt)); + + Assert.AreEqual(all.Min(x => x.FLong), Session.Demand().Query.All().Min(x => x.FLong)); + Assert.AreEqual(all.Min(x => x.FFloat), Session.Demand().Query.All().Min(x => x.FFloat)); + Assert.AreEqual(all.Min(x => x.FDecimal), Session.Demand().Query.All().Min(x => x.FDecimal)); + + Assert.AreEqual(all.Min(x => x.FDateTime), Session.Demand().Query.All().Min(x => x.FDateTime)); + Assert.AreEqual(all.Min(x => x.FTimeSpan), Session.Demand().Query.All().Min(x => x.FTimeSpan)); + + } + + [Test] + public void MaxTest() + { + Assert.AreEqual(all.Max(x => x.FByte), Session.Demand().Query.All().Max(x => x.FByte)); + Assert.AreEqual(all.Max(x => x.FSByte), Session.Demand().Query.All().Max(x => x.FSByte)); + + Assert.AreEqual(all.Max(x => x.FShort), Session.Demand().Query.All().Max(x => x.FShort)); + Assert.AreEqual(all.Max(x => x.FUShort), Session.Demand().Query.All().Max(x => x.FUShort)); + + Assert.AreEqual(all.Max(x => x.FInt), Session.Demand().Query.All().Max(x => x.FInt)); + Assert.AreEqual(all.Max(x => x.FUInt), Session.Demand().Query.All().Max(x => x.FUInt)); + + Assert.AreEqual(all.Max(x => x.FLong), Session.Demand().Query.All().Max(x => x.FLong)); + Assert.AreEqual(all.Max(x => x.FFloat), Session.Demand().Query.All().Max(x => x.FFloat)); + Assert.AreEqual(all.Max(x => x.FDecimal), Session.Demand().Query.All().Max(x => x.FDecimal)); + + Assert.AreEqual(all.Max(x => x.FDateTime), Session.Demand().Query.All().Max(x => x.FDateTime)); + Assert.AreEqual(all.Max(x => x.FTimeSpan), Session.Demand().Query.All().Max(x => x.FTimeSpan)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AnotherValidationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AnotherValidationTest.cs index 37c6c65889..a5328dbd76 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AnotherValidationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AnotherValidationTest.cs @@ -1,3030 +1,3030 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.10.30 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Validation; -using model1 = Xtensive.Orm.Tests.Storage.AnotherValidation.ValidationModel; -using model2 = Xtensive.Orm.Tests.Storage.AnotherValidation.ImmediateValidationModel; - -#region Models -namespace Xtensive.Orm.Tests.Storage.AnotherValidation.ValidationModel -{ - public class Passport : Structure - { - [Field(Length = 6)] - [NotNullConstraint] - [RegexConstraint("^[0-9]{6}$")] - public string Number { get; set; } - - [Field(Length = 4)] - [NotNullConstraint] - [LengthConstraint(Min = 4, Max = 4)] - [RegexConstraint("^[0-9]+$")] - public string Series { get; set; } - - [Field, NotNullOrEmptyConstraint] - public string Department { get; set; } - - [Field] - [NotNullConstraint] - [LengthConstraint(Min = 7, Max = 7)] - [RegexConstraint("^([0-9]{3})-([0-9]{3})$")] - public string DepartmentNumber { get; set; } - - [Field] - [PastConstraint] - public DateTime DistributeDate { get; set; } - } - - [HierarchyRoot] - public sealed class Measure : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, NotNullOrEmptyConstraint] - public string Name { get; set; } - - [Field(Nullable = true)] - public string ShortName { get; set; } - - [Field] - public ChildClass Field1 { get; set; } - - [Field] - public SecondChildClass Field2 { get; set; } - - [Field] - [Association(PairTo = "Measure")] - public EntitySet Products { get; set; } - } - - [HierarchyRoot] - public sealed class Customer : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Length = 50), NotEmptyConstraint] - public string FirstName { get; set; } - - [Field(Length = 50), NotEmptyConstraint] - public string LastName { get; set; } - - [Field, PastConstraint] - public DateTime Birthday { get; set; } - - [Field(Length = 128), EmailConstraint] - public string Email { get; set; } - - [Field(Length = 50), RegexConstraint(@"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$")] - public string Phone { get; set; } - - [Field] - public Passport Passport { get; set; } - - [Field] - [Association(PairTo = "Customer")] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - public sealed class Product : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, NotEmptyConstraint] - public string Name { get; set; } - - [Field, NotNullConstraint] - public Measure Measure { get; set; } - - [Field] - [Association(PairTo = "Product")] - public EntitySet Reviews { get; set; } - - [Field] - [Association(PairTo = "Product")] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - public sealed class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, PastConstraint] - public DateTime Date { get; set; } - - [Field(DefaultValue = false)] - public bool DeliveryIsOrdered { get; set; } - - [Field, FutureConstraint] - public DateTime DeliveryDate { get; set; } - - [Field, NotNullConstraint] - public Customer Customer { get; set; } - - [Field, NotNullConstraint] - public Product Product { get; set; } - } - - [HierarchyRoot] - public sealed class Review : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, RangeConstraint(Min = 1, Max = 5)] - public int Rating { get; set; } - - [Field, NotEmptyConstraint, LengthConstraint(Min = 3, Max = 255)] - public string Text { get; set; } - - [Field, NotNullConstraint] - public Product Product { get; set; } - } - - public class BaseEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Length = 50), NotEmptyConstraint] - public string NotEmptyString { get; set; } - - [Field(Length = 50), NotNullOrEmptyConstraint] - public string NotNullOrEmptyString { get; set; } - - [Field(Length = 50), NotNullConstraint] - public string NotNullString { get; set; } - - [Field(Length = 50), LengthConstraint(Min = 2, Max = 10)] - public string LimitedLengthString { get; set; } - - [Field, PastConstraint] - public DateTime PastDateTime { get; set; } - - [Field, FutureConstraint] - public DateTime FutureDateTime { get; set; } - - [Field, RangeConstraint(Min = 3, Max = 10)] - public int IntValueInRange { get; set; } - - [Field(Length = 50), RegexConstraint(@"^(\%){3,10}$")] - public string StringForRegexValidation { get; set; } - - [Field] - public virtual string OverridedField { get; set; } - - [NotNullOrEmptyConstraint] - public virtual string PropertyBecomesField { get; set; } - } - - [HierarchyRoot] - public class ChildClass : BaseEntity - { - [NotEmptyConstraint] - public override string OverridedField { get; set; } - } - - [HierarchyRoot] - public class SecondChildClass: BaseEntity - { - [Field] - public override string PropertyBecomesField { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.AnotherValidation.ImmediateValidationModel -{ - public class Passport : Structure - { - [Field(Length = 6)] - [NotNullConstraint(IsImmediate = true)] - [RegexConstraint("^[0-9]{6}$", IsImmediate = true)] - public string Number { get; set; } - - [Field(Length = 4)] - [NotNullConstraint(IsImmediate = true)] - [LengthConstraint(Min = 4, Max = 4, IsImmediate = true)] - [RegexConstraint("^[0-9]+$", IsImmediate = true)] - public string Series { get; set; } - - [Field, NotNullOrEmptyConstraint(IsImmediate = true)] - public string Department { get; set; } - - [Field] - [NotNullConstraint(IsImmediate = true)] - [LengthConstraint(Min = 7, Max = 7, IsImmediate = true)] - [RegexConstraint("^([0-9]{3})-([0-9]{3})$", IsImmediate = true)] - public string DepartmentNumber { get; set; } - - [Field] - [PastConstraint(IsImmediate = true)] - public DateTime DistributeDate { get; set; } - } - - [HierarchyRoot] - public sealed class Measure : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, NotNullOrEmptyConstraint(IsImmediate = true)] - public string Name { get; set; } - - [Field(Nullable = true)] - public string ShortName { get; set; } - - [Field] - public ChildClass Field1 { get; set; } - - [Field] - public SecondChildClass Field2 { get; set; } - - [Field] - [Association(PairTo = "Measure")] - public EntitySet Products { get; set; } - } - - [HierarchyRoot] - public sealed class Customer : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] - public string FirstName { get; set; } - - [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] - public string LastName { get; set; } - - [Field, PastConstraint(IsImmediate = true)] - public DateTime Birthday { get; set; } - - [Field(Length = 128), EmailConstraint(IsImmediate = true)] - public string Email { get; set; } - - [Field(Length = 50), RegexConstraint(@"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$", IsImmediate = true)] - public string Phone { get; set; } - - [Field] - public Passport Passport { get; set; } - - [Field] - [Association(PairTo = "Customer")] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - public sealed class Product : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, NotEmptyConstraint(IsImmediate = true)] - public string Name { get; set; } - - [Field, NotNullConstraint(IsImmediate = true)] - public Measure Measure { get; set; } - - [Field] - [Association(PairTo = "Product")] - public EntitySet Reviews { get; set; } - - [Field] - [Association(PairTo = "Product")] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - public sealed class Order : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, PastConstraint(IsImmediate = true)] - public DateTime Date { get; set; } - - [Field(DefaultValue = false)] - public bool DeliveryIdOrdered { get; set; } - - [Field, FutureConstraint(IsImmediate = true)] - public DateTime DeliveryDate { get; set; } - - [Field, NotNullConstraint(IsImmediate = true)] - public Customer Customer { get; set; } - - [Field, NotNullConstraint(IsImmediate = true)] - public Product Product { get; set; } - } - - [HierarchyRoot] - public sealed class Review : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field, RangeConstraint(Min = 1, Max = 5, IsImmediate = true)] - public int Rating { get; set; } - - [Field, NotEmptyConstraint(IsImmediate = true), LengthConstraint(Min = 3, Max = 255, IsImmediate = true)] - public string Text { get; set; } - - [Field, NotNullConstraint(IsImmediate = true)] - public Product Product { get; set; } - } - - public class BaseEntity : Entity - { - [Field ,Key] - public int Id { get; set; } - - [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] - public string NotEmptyString { get; set; } - - [Field(Length = 50), NotNullOrEmptyConstraint(IsImmediate = true)] - public string NotNullOrEmptyString { get; set; } - - [Field(Length = 50), NotNullConstraint(IsImmediate = true)] - public string NotNullString { get; set; } - - [Field(Length = 50), LengthConstraint(Min = 2, Max = 10, IsImmediate = true)] - public string LimitedLengthString { get; set; } - - [Field, PastConstraint(IsImmediate = true)] - public DateTime PastDateTime { get; set; } - - [Field, FutureConstraint(IsImmediate = true)] - public DateTime FutureDateTime { get; set; } - - [Field, RangeConstraint(Min = 3, Max = 10, IsImmediate = true)] - public int IntValueInRange { get; set; } - - [Field(Length = 50), RegexConstraint(@"^(\%){3,10}$", IsImmediate = true)] - public string StringForRegexValidation { get; set; } - - [Field] - public virtual string OverridedField { get; set; } - - [NotNullOrEmptyConstraint(IsImmediate = true)] - public virtual string PropertyBecomesField { get; set; } - } - - [HierarchyRoot] - public class ChildClass : BaseEntity - { - [NotEmptyConstraint(IsImmediate = true)] - public override string OverridedField { get; set; } - } - - [HierarchyRoot] - public class SecondChildClass : BaseEntity - { - [Field] - public override string PropertyBecomesField { get; set; } - } -} -#endregion - -namespace Xtensive.Orm.Tests.Storage.AnotherValidation -{ - [TestFixture] - class AnotherValidationTest : AutoBuildTest - { - private readonly string[] validEmails = new string[] { - @"Abcdef@example.com", - @"FredBloggs@example.com", - @"Joe.Blow@example.com", - @"A.b.c.d.e.f@example.com", - @"F+r+e+d+B+loggs@example.com", - @"user+mailbox@example.com", - @"customer-department-shipping@example.com", - @"A12345@example.com", - @"123A45@example.com", - @"A12345A@example.com", - @"s'o'm'e'n'a'm'e@example.com", - @"some_name@example.com", - @"s_o_m_e_n_a_m_e@example.com", - @"_somename@example.com", - @"_so__mename@example.com", - @"__________@example.com", - @"_____@_____.___", - }; - private readonly string[] notValidEmails = new string[] { - @".Ablxdf@example", - @"A...fdsfdfgs@example.com", - @"+hgksdfhhs@example.com", - @"+sdjf++@example.com", - @"'jdhhdhdhdh@example", - @"d''f'df@example.com", - @"--------@example.com", - @"a---@example.com", - @"h!fkdsdfsdf@example.com", - @"h#fkdsdfsdf@example.com", - @"h$fkdsdfsdf@example.com", - @"h%fkdsdfsdf@example.com", - @"h&fkdsdfsdf@example.com", - @"h*fkdsdfsdf@example.com", - @"h//fkdsdfsdf@example.com", - @"h\fkdsdfsdf@example.com", - @"hf?kdsdfsdf@example.com", - @"hf^kdsdfsdf@example.com", - @"hf{kdsdfsdf@example.com", - @"hfk|dsdfsdf@example.com", - @"hf}kdsdfsdf@example.com", - @"hfk~dsdfsdf@example.com", - @"hfkdsdfsdf@.com", - @"hfkdsdfsdf@example.", - @"hfkdsdfsdf@example", - @"hfkdsdfsdf@.example.com", - @"hfkdsdfsdf@a----.com", - @"hfkdsdfsdf@------.com" - }; - - private DomainConfiguration configurationForLaterValidation; - private DomainConfiguration configurationForImmediateValidation; - - [OneTimeSetUp] - public void Setup() - { - configurationForLaterValidation = DomainConfigurationFactory.Create(); - configurationForLaterValidation.UpgradeMode = DomainUpgradeMode.Perform; - configurationForLaterValidation.Types.Register(typeof (model1.Customer).Assembly, typeof (model1.Customer).Namespace); - - configurationForImmediateValidation = DomainConfigurationFactory.Create(); - configurationForImmediateValidation.UpgradeMode = DomainUpgradeMode.Perform; - configurationForImmediateValidation.Types.Register(typeof (model2.Customer).Assembly, typeof (model2.Customer).Namespace); - - FillData(); - } - - private void FillData() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var mesure = new model1.Measure {Name = "each", ShortName = "ea"}; - var product = new model1.Product {Name = "Coca-Cola bottle 0.5l", Measure = mesure}; - var review = new model1.Review {Product = product, Rating = 5, Text = "Cool. Great drink"}; - var passport = new model1.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Henry", LastName = "Smith", Birthday = new DateTime(1969, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79879454568"}; - var order = new model1.Order {Product = product, Customer = customer, Date = DateTime.Now, DeliveryDate = DateTime.Now.AddDays(2), DeliveryIsOrdered = true}; - var childClass = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - }; - var secondChildClass = new model1.SecondChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - }; - session.Validate(); - transaction.Complete(); - } - } - - private Domain BuildDomain(bool isImmediate) - { - return isImmediate ? Domain.Build(configurationForImmediateValidation) : Domain.Build(configurationForLaterValidation); - } - - #region ModelTests - [Test] - public void ModelValidationTest() - { - var domain = BuildDomain(false); - var passportType = domain.Model.Types[typeof (model1.Passport)]; - - Assert.That(passportType.HasValidators, Is.EqualTo(true)); - Assert.That(passportType.Validators.Count, Is.EqualTo(0)); - - var passportTypeField = passportType.Fields["Number"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(2)); - - passportTypeField = passportType.Fields["Series"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); - - passportTypeField = passportType.Fields["Department"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); - - passportTypeField = passportType.Fields["DepartmentNumber"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); - - passportTypeField = passportType.Fields["DistributeDate"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); - - - domain = BuildDomain(true); - var passportType1 = domain.Model.Types[typeof (model2.Passport)]; - - passportTypeField = passportType1.Fields["Number"]; - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(2)); - - passportTypeField = passportType1.Fields["Series"]; - Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); - - passportTypeField = passportType1.Fields["Department"]; - Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); - - passportTypeField = passportType1.Fields["DepartmentNumber"]; - Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); - - passportTypeField = passportType1.Fields["DistributeDate"]; - Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); - Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); - } - #endregion - - #region AdditionTests - [Test] - public void NotNullOrEmptyConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - new model1.Measure {Name = "kilogramm", ShortName = "kg"}; - new model1.Measure {Name = "gramm", ShortName = "g"}; - new model1.Measure {Name = "liter"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotNullOrEmptyConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - new model2.Measure {Name = "kilogramm", ShortName = "kg"}; - new model2.Measure {Name = "gramm", ShortName = "g"}; - new model2.Measure {Name = "liter"}; - }); - } - } - - [Test] - public void NotNullOrEmptyConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(() => { - new model1.Measure {Name = "", ShortName = "kg/m"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotNullOrEmptyConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - new model2.Measure {Name = "", ShortName = "kg/m"}; - }); - } - } - - [Test] - public void NotNullConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow(()=> { - var measure = new model1.Measure {Name = "kilogramm", ShortName = "kg"}; - new model1.Product {Name = "Banana", Measure = measure}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotNullConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure {Name = "kilogramm", ShortName = "kg"}; - new model2.Product {Name = "Banana", Measure = measure}; - }); - } - } - - [Test] - public void NotNullConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws(()=> { - new model1.Product {Name = "Banana"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotNullConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - new model2.Product {Name = "Banana", Measure = null}; - }); - } - } - - [Test] - public void NotEmptyConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure {Name = "kilogramm"}; - var product = new model1.Product {Name = "Banana", Measure = measure}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotEmptyConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure {Name = "kilogramm"}; - var product = new model2.Product {Name = "Banana", Measure = measure}; - }); - } - } - - [Test] - public void NotEmptyConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure {Name = "kilogramm"}; - var product = new model1.Product {Name = "", Measure = measure}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateNotEmptyConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure {Name = "kilogramm"}; - var product = new model2.Product {Name = "", Measure = measure}; - }); - } - } - - [Test] - public void RangeConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure {Name = "kilogramm"}; - var product = new model1.Product {Name = "Banana", Measure = measure}; - new model1.Review {Product = product, Text = "Bananas is very tasty", Rating = 5}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateRangeConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure {Name = "kilogramm"}; - var product = new model2.Product {Name = "Banana", Measure = measure}; - new model2.Review {Product = product, Text = "Bananas is very tasty", Rating = 5}; - }); - } - } - - [Test] - public void RangeConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure {Name = "kilogramm"}; - var product = new model1.Product {Name = "Banana", Measure = measure}; - new model1.Review {Product = product, Text = "Bananas is very tasty", Rating = 6}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateRangeConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure {Name = "kilogramm"}; - var product = new model2.Product {Name = "Banana", Measure = measure}; - new model2.Review {Product = product, Text = "Bananas is very tasty", Rating = 6}; - }); - } - } - - [Test] - public void LengthAndRegexConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model1.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79228963315"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateLengthAndRegexConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79228963315"}; - }); - } - } - - [Test] - public void LengthConstraintInStructureOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var passport = new model1.Passport {Number = "357867", Series = "223", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateLengthConstraintInStructureOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "357867", Series = "223", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - }); - } - } - - [Test] - public void LengthConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure {Name = "kilogramm", ShortName = "kg"}; - var product = new model1.Product {Name = "Banana", Measure = measure}; - var review = new model1.Review {Rating = 5, Product = product, Text = "5"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateLengthConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure {Name = "kilogramm", ShortName = "kg"}; - var product = new model2.Product {Name = "Banana", Measure = measure}; - var review = new model2.Review {Rating = 5, Product = product, Text = "5"}; - }); - } - } - - [Test] - public void RegexConstraintInStructureOnNotValidData() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var passport = new model1.Passport {Number = "3578", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateRegexConstraintInStructureOnNotValidData() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "ab8597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - }); - } - } - - [Test] - public void RegexConstraintOnNotValidData() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var passport = new model1.Passport {Number = "357878", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "878d8re7878"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateRegexConstraintOnNotValidData() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var passport = new model2.Passport {Number = "878597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "878d8re7878"}; - }); - } - } - - [Test] - public void EmailConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - foreach (var email in validEmails) { - Assert.DoesNotThrow( - ()=> { - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateEmailConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - foreach (var email in validEmails) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; - }); - } - } - } - - [Test] - public void EmailConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - foreach (var email in notValidEmails) { - Assert.Throws( - () => { - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateEmailConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - foreach (var email in notValidEmails) { - Assert.Throws( - () => { - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; - }); - } - } - } - - [Test] - public void PastConstraintInStructureOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediatePastConstraintInStructureOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - }); - } - } - - [Test] - public void PastConstraintInStructureOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now.AddSeconds(2)}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediatePastConstraintInStructureOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now.AddSeconds(2)}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - }); - } - } - - [Test] - public void PastConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - var product = new model1.Product { Name = "Banana", Measure = new model1.Measure { Name = "kilogramm" } }; - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediatePastConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - }); - } - } - - [Test] - public void PastConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - ()=> { - var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model1.Order {Customer = customer, Product = product, Date = DateTime.Now.AddMinutes(2), DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediatePastConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model2.Order {Customer = customer, Product = product, Date = DateTime.Now.AddMinutes(2), DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - }); - } - } - - [Test] - public void FutureConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateFutureConstraintOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; - }); - } - } - - [Test] - public void FutureConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; - var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now}; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateFutureConstraintOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; - var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; - var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; - new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now}; - session.Validate(); - }); - } - } - - [Test] - public void InheritedFieldsValidationOnValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - } - - [Test] - public void ImmediateInheritedFieldsValidationOnValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - } - - [Test] - public void InheritedFieldsConstraintsOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = null, - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = null, - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now, - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 11, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now.AddSeconds(2), - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%&%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg" - } - }; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateInheritedFieldsConstraintsOnNotValidDataAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = null, - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = null, - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now, - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 11, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now.AddSeconds(2), - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%&%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "sdfd", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg" - } - }; - }); - } - } - } - - [Test] - public void OverridedFieldConsraintAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure1 = new model1.Measure { - Name = "measure", - Field2 = new model1.SecondChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateOverridedFieldConsraintAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure { - Name = "measure", - Field2 = new model2.SecondChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "", - PropertyBecomesField = "sdfljdkf", - LimitedLengthString = "uuuuu" - } - }; - }); - } - } - } - - [Test] - public void InteritedPropertyBecomesFieldAdditionTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure { - Name = "measure", - Field1 = new model1.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "ddd", - PropertyBecomesField = null, - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure { - Name = "measure", - Field2 = new model1.SecondChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "dfdf", - PropertyBecomesField = "", - LimitedLengthString = "uuuuu" - } - }; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateInteritedPropertyBecomesFieldAdditionTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure { - Name = "measure", - Field1 = new model2.ChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "ddd", - PropertyBecomesField = null, - LimitedLengthString = "uuuuu" - } - }; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure { - Name = "measure", - Field2 = new model2.SecondChildClass { - NotEmptyString = "d", - NotNullOrEmptyString = "sdf", - NotNullString = "skdjfh", - FutureDateTime = DateTime.Now.AddDays(2), - IntValueInRange = 5, - PastDateTime = DateTime.Now, - StringForRegexValidation = "%%%%", - OverridedField = "dfdf", - PropertyBecomesField = null, - LimitedLengthString = "uuuuu" - } - }; - }); - } - } - } - #endregion - - #region ChangeTests - [Test] - public void NotNullOrEmptyConstraintOnValidDataChangingTest() - { - - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Measure measure; - using (var transaction = session.OpenTransaction()) { - measure = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - measure.Name = "Unit"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotNullOrEmptyConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Measure measure; - using (var transaction = session.OpenTransaction()) { - measure = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - measure.Name = "Unit"; - }); - } - } - } - - [Test] - public void NotNullOrEmptyConstraintOnNotValidDataChangingTest() - { - - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Measure measure; - using (var transaction = session.OpenTransaction()) { - measure = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - measure.Name = ""; - session.Validate(); - }); - Assert.Throws( - () => { - measure.Name = null; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotNullOrEmptyConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Measure measure; - using (var transaction = session.OpenTransaction()) { - measure = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - measure.Name = ""; - }); - Assert.Throws( - () => { - measure.Name = null; - }); - } - } - } - - [Test] - public void NotNullConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model1.Measure {Name = "bottle", ShortName = "bottle"}; - product.Measure = measure; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotNullConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - var measure = new model2.Measure {Name = "bottle", ShortName = "bottle"}; - product.Measure = measure; - }); - } - } - } - - [Test] - public void NotNullConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - product.Measure = null; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotNullConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - product.Measure = null; - }); - } - } - } - - [Test] - public void NotEmptyConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - product.Name = "Orange"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotEmptyConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - product.Name = "Orange"; - }); - } - } - } - - [Test] - public void NotEmptyConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - product.Name = ""; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateNotEmptyConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Product product; - using (var transaction = session.OpenTransaction()) { - product = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - product.Name = ""; - }); - } - } - } - - [Test] - public void RangeConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - review.Rating = 2; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateRangeConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - review.Rating = 2; - }); - } - } - } - - [Test] - public void RangeConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - review.Rating = 6; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateRangeConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - review.Rating = 6; - }); - } - } - } - - [Test] - public void LengthAndRegexConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - customer.Passport.Series = "6743"; - customer.Passport.Number = "868764"; - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediateLengthAndRegexConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - ()=> { - customer.Passport.Series = "7643"; - customer.Passport.Number = "797834"; - }); - } - } - } - - [Test] - public void LengthConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - ()=> { - customer.Passport.Series = "674"; - customer.Passport.Number = "868764"; - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediateLengthConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - ()=> { - customer.Passport.Series = "764"; - customer.Passport.Number = "797834"; - }); - } - } - } - - [Test] - public void LengthConstraingOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - review.Text = "5"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateLengthConstraingOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Review review; - using (var transaction = session.OpenTransaction()) { - review = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - review.Text = "5"; - }); - } - } - } - - [Test] - public void RegexConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Passport.Series = "6748"; - customer.Passport.Number = "8687"; - session.Validate(); - }); - Assert.Throws( - () => { - customer.Passport.Series = "6748"; - customer.Passport.Number = "8687av"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateRegexConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Passport.Series = "7648"; - customer.Passport.Number = "7978"; - }); - Assert.Throws( - () => { - customer.Passport.Series = "7648"; - customer.Passport.Number = "7978av"; - }); - } - } - } - - [Test] - public void RegexConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Phone = "88dfg78dfg"; - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediateRegexConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Phone = "88dfg78dfg"; - }); - } - } - } - - [Test] - public void EmailConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - foreach (var email in validEmails) { - Assert.DoesNotThrow( - () => { - customer.Email = email; - session.Validate(); - }); - } - } - } - } - - [Test] - public void ImmediateEmailConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - foreach (var email in validEmails) { - Assert.DoesNotThrow( - () => { - customer.Email = email; - }); - } - } - } - } - - [Test] - public void EmailConstraintOnNotValidDataChangingData() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - foreach (var email in notValidEmails) { - Assert.Throws( - () => { - customer.Email = email; - session.Validate(); - }); - } - } - } - } - - [Test] - public void ImmediateEmailConstraintOnNotValidDataChangingData() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - foreach (var email in notValidEmails) { - Assert.Throws( - () => { - customer.Email = email; - }); - } - } - } - } - - [Test] - public void PastConstraintInStructureOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - customer.Passport.DistributeDate = DateTime.Now; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediatePastConstraintInStructureOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - customer.Passport.DistributeDate = DateTime.Now; - }); - } - } - } - - [Test] - public void PastConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Passport.DistributeDate = DateTime.Now.AddSeconds(2); - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediatePastConstraintInStructureOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Customer customer; - using (var transaction = session.OpenTransaction()) { - customer = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - customer.Passport.DistributeDate = DateTime.Now.AddSeconds(2); - }); - } - } - } - - [Test] - public void PastConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - order.Date = DateTime.Now; - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediatePastConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - order.Date = DateTime.Now; - }); - } - } - } - - [Test] - public void PastConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - order.Date = DateTime.Now.AddSeconds(2); - session.Validate(); - }); - - } - } - } - - [Test] - public void ImmediatePastConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - order.Date = DateTime.Now.AddSeconds(2); - }); - } - } - } - - [Test] - public void FutureConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - order.DeliveryDate = DateTime.Now.AddDays(2); - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateFutureConstraintOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - order.DeliveryDate = DateTime.Now.AddDays(2); - }); - } - } - } - - [Test] - public void FutureConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - order.DeliveryDate = DateTime.Now; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateFutureConstraintOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.Order order; - using (var transaction = session.OpenTransaction()) { - order = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - order.DeliveryDate = DateTime.Now; - }); - } - } - } - - [Test] - public void InheritedFieldsValidationOnValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.ChildClass childClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - childClass.NotEmptyString = "d"; - childClass.NotNullOrEmptyString = "sdf"; - childClass.NotNullString = "skdjfh"; - childClass.FutureDateTime = DateTime.Now.AddDays(2); - childClass.IntValueInRange = 5; - childClass.PastDateTime = DateTime.Now; - childClass.StringForRegexValidation = "%%%%"; - childClass.OverridedField = "sdfd"; - childClass.PropertyBecomesField = "sdfljdkf"; - childClass.LimitedLengthString = "uuuuu"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateInheritedFieldsValidationOnValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.ChildClass childClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - childClass.NotEmptyString = "d"; - childClass.NotNullOrEmptyString = "sdf"; - childClass.NotNullString = "skdjfh"; - childClass.FutureDateTime = DateTime.Now.AddDays(2); - childClass.IntValueInRange = 5; - childClass.PastDateTime = DateTime.Now; - childClass.StringForRegexValidation = "%%%%"; - childClass.OverridedField = "sdfd"; - childClass.PropertyBecomesField = "sdfljdkf"; - childClass.LimitedLengthString = "uuuuu"; - }); - } - } - } - - [Test] - public void InheritedFieldsConstraintsOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.ChildClass childClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotEmptyString = ""; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullOrEmptyString = ""; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullOrEmptyString = null; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullString = null; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.FutureDateTime = DateTime.Now; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.IntValueInRange = 11; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.PastDateTime = DateTime.Now.AddSeconds(2); - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.StringForRegexValidation = "%&%%"; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg"; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateInheritedFieldsConstraintsOnNotValidDataChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.ChildClass childClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotEmptyString = ""; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullOrEmptyString = ""; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullOrEmptyString = null; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.NotNullString = null; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.FutureDateTime = DateTime.Now; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.IntValueInRange = 11; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.PastDateTime = DateTime.Now.AddSeconds(2); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.StringForRegexValidation = "%&%%"; - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg"; - }); - } - } - } - - [Test] - public void OverridedFieldConsraintChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.ChildClass childClass; - model1.SecondChildClass secondChildClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - secondChildClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.OverridedField = ""; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - secondChildClass.OverridedField = ""; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateOverridedFieldConsraintChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.ChildClass childClass; - model2.SecondChildClass secondChildClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - secondChildClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.Throws( - () => { - childClass.OverridedField = ""; - }); - } - using (var transaction = session.OpenTransaction()) - { - Assert.DoesNotThrow( - () => { - secondChildClass.OverridedField = ""; - }); - } - } - } - - [Test] - public void InteritedPropertyBecomesFieldChangingTest() - { - using (var domain = BuildDomain(false)) - using (var session = domain.OpenSession()) { - model1.ChildClass childClass; - model1.SecondChildClass secondChildClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - secondChildClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - childClass.PropertyBecomesField = null; - session.Validate(); - }); - } - using (var transaction = session.OpenTransaction()) { - Assert.DoesNotThrow( - () => { - secondChildClass.PropertyBecomesField = null; - session.Validate(); - }); - } - } - } - - [Test] - public void ImmediateInteritedPropertyBecomesFieldChangingTest() - { - using (var domain = BuildDomain(true)) - using (var session = domain.OpenSession()) { - model2.ChildClass childClass; - model2.SecondChildClass secondChildClass; - using (var transaction = session.OpenTransaction()) { - childClass = session.Query.All().First(); - secondChildClass = session.Query.All().First(); - transaction.Complete(); - } - using (var transaction = session.OpenTransaction()) - { - Assert.DoesNotThrow( - () => { - childClass.PropertyBecomesField = null; - }); - } - using (var transaction = session.OpenTransaction()) - { - Assert.DoesNotThrow( - () => { - secondChildClass.PropertyBecomesField = null; - }); - } - } - } - #endregion - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.10.30 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Validation; +using model1 = Xtensive.Orm.Tests.Storage.AnotherValidation.ValidationModel; +using model2 = Xtensive.Orm.Tests.Storage.AnotherValidation.ImmediateValidationModel; + +#region Models +namespace Xtensive.Orm.Tests.Storage.AnotherValidation.ValidationModel +{ + public class Passport : Structure + { + [Field(Length = 6)] + [NotNullConstraint] + [RegexConstraint("^[0-9]{6}$")] + public string Number { get; set; } + + [Field(Length = 4)] + [NotNullConstraint] + [LengthConstraint(Min = 4, Max = 4)] + [RegexConstraint("^[0-9]+$")] + public string Series { get; set; } + + [Field, NotNullOrEmptyConstraint] + public string Department { get; set; } + + [Field] + [NotNullConstraint] + [LengthConstraint(Min = 7, Max = 7)] + [RegexConstraint("^([0-9]{3})-([0-9]{3})$")] + public string DepartmentNumber { get; set; } + + [Field] + [PastConstraint] + public DateTime DistributeDate { get; set; } + } + + [HierarchyRoot] + public sealed class Measure : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, NotNullOrEmptyConstraint] + public string Name { get; set; } + + [Field(Nullable = true)] + public string ShortName { get; set; } + + [Field] + public ChildClass Field1 { get; set; } + + [Field] + public SecondChildClass Field2 { get; set; } + + [Field] + [Association(PairTo = "Measure")] + public EntitySet Products { get; set; } + } + + [HierarchyRoot] + public sealed class Customer : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Length = 50), NotEmptyConstraint] + public string FirstName { get; set; } + + [Field(Length = 50), NotEmptyConstraint] + public string LastName { get; set; } + + [Field, PastConstraint] + public DateTime Birthday { get; set; } + + [Field(Length = 128), EmailConstraint] + public string Email { get; set; } + + [Field(Length = 50), RegexConstraint(@"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$")] + public string Phone { get; set; } + + [Field] + public Passport Passport { get; set; } + + [Field] + [Association(PairTo = "Customer")] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + public sealed class Product : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, NotEmptyConstraint] + public string Name { get; set; } + + [Field, NotNullConstraint] + public Measure Measure { get; set; } + + [Field] + [Association(PairTo = "Product")] + public EntitySet Reviews { get; set; } + + [Field] + [Association(PairTo = "Product")] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + public sealed class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, PastConstraint] + public DateTime Date { get; set; } + + [Field(DefaultValue = false)] + public bool DeliveryIsOrdered { get; set; } + + [Field, FutureConstraint] + public DateTime DeliveryDate { get; set; } + + [Field, NotNullConstraint] + public Customer Customer { get; set; } + + [Field, NotNullConstraint] + public Product Product { get; set; } + } + + [HierarchyRoot] + public sealed class Review : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, RangeConstraint(Min = 1, Max = 5)] + public int Rating { get; set; } + + [Field, NotEmptyConstraint, LengthConstraint(Min = 3, Max = 255)] + public string Text { get; set; } + + [Field, NotNullConstraint] + public Product Product { get; set; } + } + + public class BaseEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Length = 50), NotEmptyConstraint] + public string NotEmptyString { get; set; } + + [Field(Length = 50), NotNullOrEmptyConstraint] + public string NotNullOrEmptyString { get; set; } + + [Field(Length = 50), NotNullConstraint] + public string NotNullString { get; set; } + + [Field(Length = 50), LengthConstraint(Min = 2, Max = 10)] + public string LimitedLengthString { get; set; } + + [Field, PastConstraint] + public DateTime PastDateTime { get; set; } + + [Field, FutureConstraint] + public DateTime FutureDateTime { get; set; } + + [Field, RangeConstraint(Min = 3, Max = 10)] + public int IntValueInRange { get; set; } + + [Field(Length = 50), RegexConstraint(@"^(\%){3,10}$")] + public string StringForRegexValidation { get; set; } + + [Field] + public virtual string OverridedField { get; set; } + + [NotNullOrEmptyConstraint] + public virtual string PropertyBecomesField { get; set; } + } + + [HierarchyRoot] + public class ChildClass : BaseEntity + { + [NotEmptyConstraint] + public override string OverridedField { get; set; } + } + + [HierarchyRoot] + public class SecondChildClass: BaseEntity + { + [Field] + public override string PropertyBecomesField { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.AnotherValidation.ImmediateValidationModel +{ + public class Passport : Structure + { + [Field(Length = 6)] + [NotNullConstraint(IsImmediate = true)] + [RegexConstraint("^[0-9]{6}$", IsImmediate = true)] + public string Number { get; set; } + + [Field(Length = 4)] + [NotNullConstraint(IsImmediate = true)] + [LengthConstraint(Min = 4, Max = 4, IsImmediate = true)] + [RegexConstraint("^[0-9]+$", IsImmediate = true)] + public string Series { get; set; } + + [Field, NotNullOrEmptyConstraint(IsImmediate = true)] + public string Department { get; set; } + + [Field] + [NotNullConstraint(IsImmediate = true)] + [LengthConstraint(Min = 7, Max = 7, IsImmediate = true)] + [RegexConstraint("^([0-9]{3})-([0-9]{3})$", IsImmediate = true)] + public string DepartmentNumber { get; set; } + + [Field] + [PastConstraint(IsImmediate = true)] + public DateTime DistributeDate { get; set; } + } + + [HierarchyRoot] + public sealed class Measure : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, NotNullOrEmptyConstraint(IsImmediate = true)] + public string Name { get; set; } + + [Field(Nullable = true)] + public string ShortName { get; set; } + + [Field] + public ChildClass Field1 { get; set; } + + [Field] + public SecondChildClass Field2 { get; set; } + + [Field] + [Association(PairTo = "Measure")] + public EntitySet Products { get; set; } + } + + [HierarchyRoot] + public sealed class Customer : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] + public string FirstName { get; set; } + + [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] + public string LastName { get; set; } + + [Field, PastConstraint(IsImmediate = true)] + public DateTime Birthday { get; set; } + + [Field(Length = 128), EmailConstraint(IsImmediate = true)] + public string Email { get; set; } + + [Field(Length = 50), RegexConstraint(@"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$", IsImmediate = true)] + public string Phone { get; set; } + + [Field] + public Passport Passport { get; set; } + + [Field] + [Association(PairTo = "Customer")] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + public sealed class Product : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, NotEmptyConstraint(IsImmediate = true)] + public string Name { get; set; } + + [Field, NotNullConstraint(IsImmediate = true)] + public Measure Measure { get; set; } + + [Field] + [Association(PairTo = "Product")] + public EntitySet Reviews { get; set; } + + [Field] + [Association(PairTo = "Product")] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + public sealed class Order : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, PastConstraint(IsImmediate = true)] + public DateTime Date { get; set; } + + [Field(DefaultValue = false)] + public bool DeliveryIdOrdered { get; set; } + + [Field, FutureConstraint(IsImmediate = true)] + public DateTime DeliveryDate { get; set; } + + [Field, NotNullConstraint(IsImmediate = true)] + public Customer Customer { get; set; } + + [Field, NotNullConstraint(IsImmediate = true)] + public Product Product { get; set; } + } + + [HierarchyRoot] + public sealed class Review : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field, RangeConstraint(Min = 1, Max = 5, IsImmediate = true)] + public int Rating { get; set; } + + [Field, NotEmptyConstraint(IsImmediate = true), LengthConstraint(Min = 3, Max = 255, IsImmediate = true)] + public string Text { get; set; } + + [Field, NotNullConstraint(IsImmediate = true)] + public Product Product { get; set; } + } + + public class BaseEntity : Entity + { + [Field ,Key] + public int Id { get; set; } + + [Field(Length = 50), NotEmptyConstraint(IsImmediate = true)] + public string NotEmptyString { get; set; } + + [Field(Length = 50), NotNullOrEmptyConstraint(IsImmediate = true)] + public string NotNullOrEmptyString { get; set; } + + [Field(Length = 50), NotNullConstraint(IsImmediate = true)] + public string NotNullString { get; set; } + + [Field(Length = 50), LengthConstraint(Min = 2, Max = 10, IsImmediate = true)] + public string LimitedLengthString { get; set; } + + [Field, PastConstraint(IsImmediate = true)] + public DateTime PastDateTime { get; set; } + + [Field, FutureConstraint(IsImmediate = true)] + public DateTime FutureDateTime { get; set; } + + [Field, RangeConstraint(Min = 3, Max = 10, IsImmediate = true)] + public int IntValueInRange { get; set; } + + [Field(Length = 50), RegexConstraint(@"^(\%){3,10}$", IsImmediate = true)] + public string StringForRegexValidation { get; set; } + + [Field] + public virtual string OverridedField { get; set; } + + [NotNullOrEmptyConstraint(IsImmediate = true)] + public virtual string PropertyBecomesField { get; set; } + } + + [HierarchyRoot] + public class ChildClass : BaseEntity + { + [NotEmptyConstraint(IsImmediate = true)] + public override string OverridedField { get; set; } + } + + [HierarchyRoot] + public class SecondChildClass : BaseEntity + { + [Field] + public override string PropertyBecomesField { get; set; } + } +} +#endregion + +namespace Xtensive.Orm.Tests.Storage.AnotherValidation +{ + [TestFixture] + class AnotherValidationTest : AutoBuildTest + { + private readonly string[] validEmails = new string[] { + @"Abcdef@example.com", + @"FredBloggs@example.com", + @"Joe.Blow@example.com", + @"A.b.c.d.e.f@example.com", + @"F+r+e+d+B+loggs@example.com", + @"user+mailbox@example.com", + @"customer-department-shipping@example.com", + @"A12345@example.com", + @"123A45@example.com", + @"A12345A@example.com", + @"s'o'm'e'n'a'm'e@example.com", + @"some_name@example.com", + @"s_o_m_e_n_a_m_e@example.com", + @"_somename@example.com", + @"_so__mename@example.com", + @"__________@example.com", + @"_____@_____.___", + }; + private readonly string[] notValidEmails = new string[] { + @".Ablxdf@example", + @"A...fdsfdfgs@example.com", + @"+hgksdfhhs@example.com", + @"+sdjf++@example.com", + @"'jdhhdhdhdh@example", + @"d''f'df@example.com", + @"--------@example.com", + @"a---@example.com", + @"h!fkdsdfsdf@example.com", + @"h#fkdsdfsdf@example.com", + @"h$fkdsdfsdf@example.com", + @"h%fkdsdfsdf@example.com", + @"h&fkdsdfsdf@example.com", + @"h*fkdsdfsdf@example.com", + @"h//fkdsdfsdf@example.com", + @"h\fkdsdfsdf@example.com", + @"hf?kdsdfsdf@example.com", + @"hf^kdsdfsdf@example.com", + @"hf{kdsdfsdf@example.com", + @"hfk|dsdfsdf@example.com", + @"hf}kdsdfsdf@example.com", + @"hfk~dsdfsdf@example.com", + @"hfkdsdfsdf@.com", + @"hfkdsdfsdf@example.", + @"hfkdsdfsdf@example", + @"hfkdsdfsdf@.example.com", + @"hfkdsdfsdf@a----.com", + @"hfkdsdfsdf@------.com" + }; + + private DomainConfiguration configurationForLaterValidation; + private DomainConfiguration configurationForImmediateValidation; + + [OneTimeSetUp] + public void Setup() + { + configurationForLaterValidation = DomainConfigurationFactory.Create(); + configurationForLaterValidation.UpgradeMode = DomainUpgradeMode.Perform; + configurationForLaterValidation.Types.Register(typeof (model1.Customer).Assembly, typeof (model1.Customer).Namespace); + + configurationForImmediateValidation = DomainConfigurationFactory.Create(); + configurationForImmediateValidation.UpgradeMode = DomainUpgradeMode.Perform; + configurationForImmediateValidation.Types.Register(typeof (model2.Customer).Assembly, typeof (model2.Customer).Namespace); + + FillData(); + } + + private void FillData() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var mesure = new model1.Measure {Name = "each", ShortName = "ea"}; + var product = new model1.Product {Name = "Coca-Cola bottle 0.5l", Measure = mesure}; + var review = new model1.Review {Product = product, Rating = 5, Text = "Cool. Great drink"}; + var passport = new model1.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Henry", LastName = "Smith", Birthday = new DateTime(1969, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79879454568"}; + var order = new model1.Order {Product = product, Customer = customer, Date = DateTime.Now, DeliveryDate = DateTime.Now.AddDays(2), DeliveryIsOrdered = true}; + var childClass = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + }; + var secondChildClass = new model1.SecondChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + }; + session.Validate(); + transaction.Complete(); + } + } + + private Domain BuildDomain(bool isImmediate) + { + return isImmediate ? Domain.Build(configurationForImmediateValidation) : Domain.Build(configurationForLaterValidation); + } + + #region ModelTests + [Test] + public void ModelValidationTest() + { + var domain = BuildDomain(false); + var passportType = domain.Model.Types[typeof (model1.Passport)]; + + Assert.That(passportType.HasValidators, Is.EqualTo(true)); + Assert.That(passportType.Validators.Count, Is.EqualTo(0)); + + var passportTypeField = passportType.Fields["Number"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(2)); + + passportTypeField = passportType.Fields["Series"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); + + passportTypeField = passportType.Fields["Department"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); + + passportTypeField = passportType.Fields["DepartmentNumber"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); + + passportTypeField = passportType.Fields["DistributeDate"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); + + + domain = BuildDomain(true); + var passportType1 = domain.Model.Types[typeof (model2.Passport)]; + + passportTypeField = passportType1.Fields["Number"]; + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(2)); + + passportTypeField = passportType1.Fields["Series"]; + Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); + + passportTypeField = passportType1.Fields["Department"]; + Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); + + passportTypeField = passportType1.Fields["DepartmentNumber"]; + Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(3)); + + passportTypeField = passportType1.Fields["DistributeDate"]; + Assert.That(passportTypeField.HasImmediateValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.HasValidators, Is.EqualTo(true)); + Assert.That(passportTypeField.Validators.Count, Is.EqualTo(1)); + } + #endregion + + #region AdditionTests + [Test] + public void NotNullOrEmptyConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + new model1.Measure {Name = "kilogramm", ShortName = "kg"}; + new model1.Measure {Name = "gramm", ShortName = "g"}; + new model1.Measure {Name = "liter"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotNullOrEmptyConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + new model2.Measure {Name = "kilogramm", ShortName = "kg"}; + new model2.Measure {Name = "gramm", ShortName = "g"}; + new model2.Measure {Name = "liter"}; + }); + } + } + + [Test] + public void NotNullOrEmptyConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(() => { + new model1.Measure {Name = "", ShortName = "kg/m"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotNullOrEmptyConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + new model2.Measure {Name = "", ShortName = "kg/m"}; + }); + } + } + + [Test] + public void NotNullConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow(()=> { + var measure = new model1.Measure {Name = "kilogramm", ShortName = "kg"}; + new model1.Product {Name = "Banana", Measure = measure}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotNullConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure {Name = "kilogramm", ShortName = "kg"}; + new model2.Product {Name = "Banana", Measure = measure}; + }); + } + } + + [Test] + public void NotNullConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws(()=> { + new model1.Product {Name = "Banana"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotNullConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + new model2.Product {Name = "Banana", Measure = null}; + }); + } + } + + [Test] + public void NotEmptyConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure {Name = "kilogramm"}; + var product = new model1.Product {Name = "Banana", Measure = measure}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotEmptyConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure {Name = "kilogramm"}; + var product = new model2.Product {Name = "Banana", Measure = measure}; + }); + } + } + + [Test] + public void NotEmptyConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure {Name = "kilogramm"}; + var product = new model1.Product {Name = "", Measure = measure}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateNotEmptyConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure {Name = "kilogramm"}; + var product = new model2.Product {Name = "", Measure = measure}; + }); + } + } + + [Test] + public void RangeConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure {Name = "kilogramm"}; + var product = new model1.Product {Name = "Banana", Measure = measure}; + new model1.Review {Product = product, Text = "Bananas is very tasty", Rating = 5}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateRangeConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure {Name = "kilogramm"}; + var product = new model2.Product {Name = "Banana", Measure = measure}; + new model2.Review {Product = product, Text = "Bananas is very tasty", Rating = 5}; + }); + } + } + + [Test] + public void RangeConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure {Name = "kilogramm"}; + var product = new model1.Product {Name = "Banana", Measure = measure}; + new model1.Review {Product = product, Text = "Bananas is very tasty", Rating = 6}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateRangeConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure {Name = "kilogramm"}; + var product = new model2.Product {Name = "Banana", Measure = measure}; + new model2.Review {Product = product, Text = "Bananas is very tasty", Rating = 6}; + }); + } + } + + [Test] + public void LengthAndRegexConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model1.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79228963315"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateLengthAndRegexConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "357867", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "+79228963315"}; + }); + } + } + + [Test] + public void LengthConstraintInStructureOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var passport = new model1.Passport {Number = "357867", Series = "223", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateLengthConstraintInStructureOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "357867", Series = "223", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + }); + } + } + + [Test] + public void LengthConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure {Name = "kilogramm", ShortName = "kg"}; + var product = new model1.Product {Name = "Banana", Measure = measure}; + var review = new model1.Review {Rating = 5, Product = product, Text = "5"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateLengthConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure {Name = "kilogramm", ShortName = "kg"}; + var product = new model2.Product {Name = "Banana", Measure = measure}; + var review = new model2.Review {Rating = 5, Product = product, Text = "5"}; + }); + } + } + + [Test] + public void RegexConstraintInStructureOnNotValidData() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var passport = new model1.Passport {Number = "3578", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateRegexConstraintInStructureOnNotValidData() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "ab8597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + }); + } + } + + [Test] + public void RegexConstraintOnNotValidData() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var passport = new model1.Passport {Number = "357878", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "878d8re7878"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateRegexConstraintOnNotValidData() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var passport = new model2.Passport {Number = "878597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru", Phone = "878d8re7878"}; + }); + } + } + + [Test] + public void EmailConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + foreach (var email in validEmails) { + Assert.DoesNotThrow( + ()=> { + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateEmailConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + foreach (var email in validEmails) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; + }); + } + } + } + + [Test] + public void EmailConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + foreach (var email in notValidEmails) { + Assert.Throws( + () => { + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateEmailConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + foreach (var email in notValidEmails) { + Assert.Throws( + () => { + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = new DateTime(2012, 12, 1)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = email}; + }); + } + } + } + + [Test] + public void PastConstraintInStructureOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediatePastConstraintInStructureOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + }); + } + } + + [Test] + public void PastConstraintInStructureOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now.AddSeconds(2)}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediatePastConstraintInStructureOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now.AddSeconds(2)}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + }); + } + } + + [Test] + public void PastConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + var product = new model1.Product { Name = "Banana", Measure = new model1.Measure { Name = "kilogramm" } }; + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediatePastConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + }); + } + } + + [Test] + public void PastConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + ()=> { + var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model1.Order {Customer = customer, Product = product, Date = DateTime.Now.AddMinutes(2), DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediatePastConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model2.Order {Customer = customer, Product = product, Date = DateTime.Now.AddMinutes(2), DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + }); + } + } + + [Test] + public void FutureConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateFutureConstraintOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now.AddDays(1)}; + }); + } + } + + [Test] + public void FutureConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var product = new model1.Product {Name = "Banana", Measure = new model1.Measure {Name = "kilogramm"}}; + var passport = new model1.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model1.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model1.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIsOrdered = true, DeliveryDate = DateTime.Now}; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateFutureConstraintOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var product = new model2.Product {Name = "Banana", Measure = new model2.Measure {Name = "kilogramm"}}; + var passport = new model2.Passport {Number = "898597", Series = "2233", Department = "\"Horns & Hooves\" Corp.", DepartmentNumber = "358-845", DistributeDate = DateTime.Now}; + var customer = new model2.Customer {FirstName = "Alexey", LastName = "Kulakov", Birthday = new DateTime(2000, 3, 8), Passport = passport, Email = "login@domain.ru"}; + new model2.Order {Customer = customer, Product = product, Date = DateTime.Now, DeliveryIdOrdered = true, DeliveryDate = DateTime.Now}; + session.Validate(); + }); + } + } + + [Test] + public void InheritedFieldsValidationOnValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + } + + [Test] + public void ImmediateInheritedFieldsValidationOnValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + } + + [Test] + public void InheritedFieldsConstraintsOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = null, + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = null, + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now, + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 11, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now.AddSeconds(2), + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%&%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg" + } + }; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateInheritedFieldsConstraintsOnNotValidDataAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = null, + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = null, + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now, + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 11, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now.AddSeconds(2), + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%&%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "sdfd", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg" + } + }; + }); + } + } + } + + [Test] + public void OverridedFieldConsraintAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure1 = new model1.Measure { + Name = "measure", + Field2 = new model1.SecondChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateOverridedFieldConsraintAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure { + Name = "measure", + Field2 = new model2.SecondChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "", + PropertyBecomesField = "sdfljdkf", + LimitedLengthString = "uuuuu" + } + }; + }); + } + } + } + + [Test] + public void InteritedPropertyBecomesFieldAdditionTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure { + Name = "measure", + Field1 = new model1.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "ddd", + PropertyBecomesField = null, + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure { + Name = "measure", + Field2 = new model1.SecondChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "dfdf", + PropertyBecomesField = "", + LimitedLengthString = "uuuuu" + } + }; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateInteritedPropertyBecomesFieldAdditionTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure { + Name = "measure", + Field1 = new model2.ChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "ddd", + PropertyBecomesField = null, + LimitedLengthString = "uuuuu" + } + }; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure { + Name = "measure", + Field2 = new model2.SecondChildClass { + NotEmptyString = "d", + NotNullOrEmptyString = "sdf", + NotNullString = "skdjfh", + FutureDateTime = DateTime.Now.AddDays(2), + IntValueInRange = 5, + PastDateTime = DateTime.Now, + StringForRegexValidation = "%%%%", + OverridedField = "dfdf", + PropertyBecomesField = null, + LimitedLengthString = "uuuuu" + } + }; + }); + } + } + } + #endregion + + #region ChangeTests + [Test] + public void NotNullOrEmptyConstraintOnValidDataChangingTest() + { + + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Measure measure; + using (var transaction = session.OpenTransaction()) { + measure = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + measure.Name = "Unit"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotNullOrEmptyConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Measure measure; + using (var transaction = session.OpenTransaction()) { + measure = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + measure.Name = "Unit"; + }); + } + } + } + + [Test] + public void NotNullOrEmptyConstraintOnNotValidDataChangingTest() + { + + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Measure measure; + using (var transaction = session.OpenTransaction()) { + measure = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + measure.Name = ""; + session.Validate(); + }); + Assert.Throws( + () => { + measure.Name = null; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotNullOrEmptyConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Measure measure; + using (var transaction = session.OpenTransaction()) { + measure = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + measure.Name = ""; + }); + Assert.Throws( + () => { + measure.Name = null; + }); + } + } + } + + [Test] + public void NotNullConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model1.Measure {Name = "bottle", ShortName = "bottle"}; + product.Measure = measure; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotNullConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + var measure = new model2.Measure {Name = "bottle", ShortName = "bottle"}; + product.Measure = measure; + }); + } + } + } + + [Test] + public void NotNullConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + product.Measure = null; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotNullConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + product.Measure = null; + }); + } + } + } + + [Test] + public void NotEmptyConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + product.Name = "Orange"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotEmptyConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + product.Name = "Orange"; + }); + } + } + } + + [Test] + public void NotEmptyConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + product.Name = ""; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateNotEmptyConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Product product; + using (var transaction = session.OpenTransaction()) { + product = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + product.Name = ""; + }); + } + } + } + + [Test] + public void RangeConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + review.Rating = 2; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateRangeConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + review.Rating = 2; + }); + } + } + } + + [Test] + public void RangeConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + review.Rating = 6; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateRangeConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + review.Rating = 6; + }); + } + } + } + + [Test] + public void LengthAndRegexConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + customer.Passport.Series = "6743"; + customer.Passport.Number = "868764"; + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediateLengthAndRegexConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + ()=> { + customer.Passport.Series = "7643"; + customer.Passport.Number = "797834"; + }); + } + } + } + + [Test] + public void LengthConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + ()=> { + customer.Passport.Series = "674"; + customer.Passport.Number = "868764"; + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediateLengthConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + ()=> { + customer.Passport.Series = "764"; + customer.Passport.Number = "797834"; + }); + } + } + } + + [Test] + public void LengthConstraingOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + review.Text = "5"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateLengthConstraingOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Review review; + using (var transaction = session.OpenTransaction()) { + review = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + review.Text = "5"; + }); + } + } + } + + [Test] + public void RegexConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Passport.Series = "6748"; + customer.Passport.Number = "8687"; + session.Validate(); + }); + Assert.Throws( + () => { + customer.Passport.Series = "6748"; + customer.Passport.Number = "8687av"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateRegexConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Passport.Series = "7648"; + customer.Passport.Number = "7978"; + }); + Assert.Throws( + () => { + customer.Passport.Series = "7648"; + customer.Passport.Number = "7978av"; + }); + } + } + } + + [Test] + public void RegexConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Phone = "88dfg78dfg"; + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediateRegexConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Phone = "88dfg78dfg"; + }); + } + } + } + + [Test] + public void EmailConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + foreach (var email in validEmails) { + Assert.DoesNotThrow( + () => { + customer.Email = email; + session.Validate(); + }); + } + } + } + } + + [Test] + public void ImmediateEmailConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + foreach (var email in validEmails) { + Assert.DoesNotThrow( + () => { + customer.Email = email; + }); + } + } + } + } + + [Test] + public void EmailConstraintOnNotValidDataChangingData() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + foreach (var email in notValidEmails) { + Assert.Throws( + () => { + customer.Email = email; + session.Validate(); + }); + } + } + } + } + + [Test] + public void ImmediateEmailConstraintOnNotValidDataChangingData() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + foreach (var email in notValidEmails) { + Assert.Throws( + () => { + customer.Email = email; + }); + } + } + } + } + + [Test] + public void PastConstraintInStructureOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + customer.Passport.DistributeDate = DateTime.Now; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediatePastConstraintInStructureOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + customer.Passport.DistributeDate = DateTime.Now; + }); + } + } + } + + [Test] + public void PastConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Passport.DistributeDate = DateTime.Now.AddSeconds(2); + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediatePastConstraintInStructureOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Customer customer; + using (var transaction = session.OpenTransaction()) { + customer = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + customer.Passport.DistributeDate = DateTime.Now.AddSeconds(2); + }); + } + } + } + + [Test] + public void PastConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + order.Date = DateTime.Now; + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediatePastConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + order.Date = DateTime.Now; + }); + } + } + } + + [Test] + public void PastConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + order.Date = DateTime.Now.AddSeconds(2); + session.Validate(); + }); + + } + } + } + + [Test] + public void ImmediatePastConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + order.Date = DateTime.Now.AddSeconds(2); + }); + } + } + } + + [Test] + public void FutureConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + order.DeliveryDate = DateTime.Now.AddDays(2); + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateFutureConstraintOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + order.DeliveryDate = DateTime.Now.AddDays(2); + }); + } + } + } + + [Test] + public void FutureConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + order.DeliveryDate = DateTime.Now; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateFutureConstraintOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.Order order; + using (var transaction = session.OpenTransaction()) { + order = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + order.DeliveryDate = DateTime.Now; + }); + } + } + } + + [Test] + public void InheritedFieldsValidationOnValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.ChildClass childClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + childClass.NotEmptyString = "d"; + childClass.NotNullOrEmptyString = "sdf"; + childClass.NotNullString = "skdjfh"; + childClass.FutureDateTime = DateTime.Now.AddDays(2); + childClass.IntValueInRange = 5; + childClass.PastDateTime = DateTime.Now; + childClass.StringForRegexValidation = "%%%%"; + childClass.OverridedField = "sdfd"; + childClass.PropertyBecomesField = "sdfljdkf"; + childClass.LimitedLengthString = "uuuuu"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateInheritedFieldsValidationOnValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.ChildClass childClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + childClass.NotEmptyString = "d"; + childClass.NotNullOrEmptyString = "sdf"; + childClass.NotNullString = "skdjfh"; + childClass.FutureDateTime = DateTime.Now.AddDays(2); + childClass.IntValueInRange = 5; + childClass.PastDateTime = DateTime.Now; + childClass.StringForRegexValidation = "%%%%"; + childClass.OverridedField = "sdfd"; + childClass.PropertyBecomesField = "sdfljdkf"; + childClass.LimitedLengthString = "uuuuu"; + }); + } + } + } + + [Test] + public void InheritedFieldsConstraintsOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.ChildClass childClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotEmptyString = ""; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullOrEmptyString = ""; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullOrEmptyString = null; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullString = null; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.FutureDateTime = DateTime.Now; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.IntValueInRange = 11; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.PastDateTime = DateTime.Now.AddSeconds(2); + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.StringForRegexValidation = "%&%%"; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg"; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateInheritedFieldsConstraintsOnNotValidDataChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.ChildClass childClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotEmptyString = ""; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullOrEmptyString = ""; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullOrEmptyString = null; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.NotNullString = null; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.FutureDateTime = DateTime.Now; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.IntValueInRange = 11; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.PastDateTime = DateTime.Now.AddSeconds(2); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.StringForRegexValidation = "%&%%"; + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.LimitedLengthString = "uuuuujhgdfhjdfhgjfdhgfjdhghfg"; + }); + } + } + } + + [Test] + public void OverridedFieldConsraintChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.ChildClass childClass; + model1.SecondChildClass secondChildClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + secondChildClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.OverridedField = ""; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + secondChildClass.OverridedField = ""; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateOverridedFieldConsraintChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.ChildClass childClass; + model2.SecondChildClass secondChildClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + secondChildClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.Throws( + () => { + childClass.OverridedField = ""; + }); + } + using (var transaction = session.OpenTransaction()) + { + Assert.DoesNotThrow( + () => { + secondChildClass.OverridedField = ""; + }); + } + } + } + + [Test] + public void InteritedPropertyBecomesFieldChangingTest() + { + using (var domain = BuildDomain(false)) + using (var session = domain.OpenSession()) { + model1.ChildClass childClass; + model1.SecondChildClass secondChildClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + secondChildClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + childClass.PropertyBecomesField = null; + session.Validate(); + }); + } + using (var transaction = session.OpenTransaction()) { + Assert.DoesNotThrow( + () => { + secondChildClass.PropertyBecomesField = null; + session.Validate(); + }); + } + } + } + + [Test] + public void ImmediateInteritedPropertyBecomesFieldChangingTest() + { + using (var domain = BuildDomain(true)) + using (var session = domain.OpenSession()) { + model2.ChildClass childClass; + model2.SecondChildClass secondChildClass; + using (var transaction = session.OpenTransaction()) { + childClass = session.Query.All().First(); + secondChildClass = session.Query.All().First(); + transaction.Complete(); + } + using (var transaction = session.OpenTransaction()) + { + Assert.DoesNotThrow( + () => { + childClass.PropertyBecomesField = null; + }); + } + using (var transaction = session.OpenTransaction()) + { + Assert.DoesNotThrow( + () => { + secondChildClass.PropertyBecomesField = null; + }); + } + } + } + #endregion + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/ApplyTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ApplyTest.cs index 8cce9486b8..59643b30e2 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ApplyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ApplyTest.cs @@ -1,113 +1,113 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.03.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Rse; -using Xtensive.Orm.Rse.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class ApplyTest : ChinookDOModelTest - { - private List allCustomers; - private List allInvoices; - private CompilableProvider customerPrimary; - private CompilableProvider orderPrimary; - private int customerIdIndex; - private int invoiceCustomerIndex; - - private void LoadData(Session session) - { - var customerType = Domain.Model.Types[typeof(Customer)]; - var invoiceType = Domain.Model.Types[typeof(Invoice)]; - - var customerIdColumn = customerType.Fields["CustomerId"].Column.Name; - var invoiceCustomerColumn = invoiceType.Fields["Customer"].Fields[0].Column.Name; - - customerPrimary = customerType.Indexes.PrimaryIndex.GetQuery(); - orderPrimary = invoiceType.Indexes.PrimaryIndex.GetQuery(); - - customerIdIndex = customerPrimary.Header.IndexOf(customerIdColumn); - invoiceCustomerIndex = orderPrimary.Header.IndexOf(invoiceCustomerColumn); - - allCustomers = customerPrimary.GetRecordSet(session).ToEntities(0).ToList(); - allInvoices = orderPrimary.GetRecordSet(session).ToEntities(0).ToList(); - } - - [Test] - public void CrossApplyTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - LoadData(session); - long total = 0; - foreach (var customer in allCustomers) - total += allInvoices.Count(o => o.Customer==customer); - var parameter = new ApplyParameter(); - var subquery = orderPrimary - .Filter(t => t.GetValue(invoiceCustomerIndex)==parameter.Value.GetValue(customerIdIndex)) - .Alias("XYZ"); - var result = customerPrimary - .Apply(parameter, subquery) - .Count(Session.Current); - Assert.AreEqual(total, result); - } - } - } - - [Test] - public void OuterApplyTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - LoadData(session); - long total = 0; - foreach (var customer in allCustomers) - total += Math.Max(1, allInvoices.Count(o => o.Customer == customer)); - var parameter = new ApplyParameter(); - var subquery = orderPrimary - .Filter(t => t.GetValue(invoiceCustomerIndex) == parameter.Value.GetValue(customerIdIndex)) - .Alias("XYZ"); - var result = customerPrimary - .Apply(parameter, subquery, false, ApplySequenceType.All, JoinType.LeftOuter) - .Count(Session.Current); - Assert.AreEqual(total, result); - } - } - } - - [Test] - public void CrossApplyExistenseTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - LoadData(session); - long total = 0; - foreach (var customer in allCustomers) - if (allInvoices.Any(o => o.Customer == customer)) - total++; - var parameter = new ApplyParameter(); - var subquery = orderPrimary - .Filter(t => t.GetValue(invoiceCustomerIndex)==parameter.Value.GetValue(customerIdIndex)) - .Existence("LALALA"); - var result = customerPrimary - .Apply(parameter, subquery, false, ApplySequenceType.Single, JoinType.Inner) - .GetRecordSet(Session.Current) - .Count(t => (bool) t.GetValue(t.Count-1)); - Assert.AreEqual(total, result); - } - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.03.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Rse; +using Xtensive.Orm.Rse.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class ApplyTest : ChinookDOModelTest + { + private List allCustomers; + private List allInvoices; + private CompilableProvider customerPrimary; + private CompilableProvider orderPrimary; + private int customerIdIndex; + private int invoiceCustomerIndex; + + private void LoadData(Session session) + { + var customerType = Domain.Model.Types[typeof(Customer)]; + var invoiceType = Domain.Model.Types[typeof(Invoice)]; + + var customerIdColumn = customerType.Fields["CustomerId"].Column.Name; + var invoiceCustomerColumn = invoiceType.Fields["Customer"].Fields[0].Column.Name; + + customerPrimary = customerType.Indexes.PrimaryIndex.GetQuery(); + orderPrimary = invoiceType.Indexes.PrimaryIndex.GetQuery(); + + customerIdIndex = customerPrimary.Header.IndexOf(customerIdColumn); + invoiceCustomerIndex = orderPrimary.Header.IndexOf(invoiceCustomerColumn); + + allCustomers = customerPrimary.GetRecordSet(session).ToEntities(0).ToList(); + allInvoices = orderPrimary.GetRecordSet(session).ToEntities(0).ToList(); + } + + [Test] + public void CrossApplyTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + LoadData(session); + long total = 0; + foreach (var customer in allCustomers) + total += allInvoices.Count(o => o.Customer==customer); + var parameter = new ApplyParameter(); + var subquery = orderPrimary + .Filter(t => t.GetValue(invoiceCustomerIndex)==parameter.Value.GetValue(customerIdIndex)) + .Alias("XYZ"); + var result = customerPrimary + .Apply(parameter, subquery) + .Count(Session.Current); + Assert.AreEqual(total, result); + } + } + } + + [Test] + public void OuterApplyTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + LoadData(session); + long total = 0; + foreach (var customer in allCustomers) + total += Math.Max(1, allInvoices.Count(o => o.Customer == customer)); + var parameter = new ApplyParameter(); + var subquery = orderPrimary + .Filter(t => t.GetValue(invoiceCustomerIndex) == parameter.Value.GetValue(customerIdIndex)) + .Alias("XYZ"); + var result = customerPrimary + .Apply(parameter, subquery, false, ApplySequenceType.All, JoinType.LeftOuter) + .Count(Session.Current); + Assert.AreEqual(total, result); + } + } + } + + [Test] + public void CrossApplyExistenseTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + LoadData(session); + long total = 0; + foreach (var customer in allCustomers) + if (allInvoices.Any(o => o.Customer == customer)) + total++; + var parameter = new ApplyParameter(); + var subquery = orderPrimary + .Filter(t => t.GetValue(invoiceCustomerIndex)==parameter.Value.GetValue(customerIdIndex)) + .Existence("LALALA"); + var result = customerPrimary + .Apply(parameter, subquery, false, ApplySequenceType.Single, JoinType.Inner) + .GetRecordSet(Session.Current) + .Count(t => (bool) t.GetValue(t.Count-1)); + Assert.AreEqual(total, result); + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsAsyncTaskExtensionTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsAsyncTaskExtensionTest.cs index 52284c657a..7c0e7a4584 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsAsyncTaskExtensionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsAsyncTaskExtensionTest.cs @@ -1,190 +1,190 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel; - -namespace Xtensive.Orm.Tests.Storage -{ - public class AsAsyncTaskExtensionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(TestEntity).Assembly, typeof(TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var container = new EntitySetContainer(session); - foreach (var i in Enumerable.Range(-100, 200)) { - container.EntitySet.Add(new TestEntity(session) {Value = i}); - } - transaction.Complete(); - } - } - - [Test] - public async Task PureEnumerableTest() - { - var task = AsEnumerable(1, 2, 3, 4).AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value, Is.EqualTo(before)); - before++; - } - } - - [Test] - public async Task CollectionAsEnumerableTest() - { - var list = new List {1, 2, 3, 4}; - var task = list.AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value, Is.EqualTo(before)); - before++; - } - } - - [Test] - public async Task QueryableAsEnumearbleTest() - { - IQueryable queryableEnumeable = new EnumerableQuery(Enumerable.Range(-100, 200).ToArray()).Where(v => v < 5 && v > 0); - var task = queryableEnumeable.AsEnumerable().AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value, Is.EqualTo(before)); - before++; - } - } - - [Test] - public async Task QueryableTest() - { - IQueryable queryableEnumeable = new EnumerableQuery(Enumerable.Range(-100, 200).ToArray()).Where(v => v < 5 && v > 0); - var task = queryableEnumeable.AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value, Is.EqualTo(before)); - before++; - } - } - - [Test] - public async Task DoQueryableAsEnumeableTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var task = session.Query.All().Where(e => e.Value < 5 && e.Value > 0).AsEnumerable().AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value.Value, Is.EqualTo(before)); - before++; - } - } - } - - [Test] - public async Task PersistentCollectionAsEnumerableTesk() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var container = session.Query.All().First(); - var task = container.EntitySet.Where(e => e.Value < 5 && e.Value > 0).AsEnumerable().AsAsync(); - Assert.That(task.IsCompleted, Is.True); - - int before = 1; - foreach (var value in await task) { - Assert.That(value.Value, Is.EqualTo(before)); - before++; - } - } - } - - [Test] - public async Task DoQueryableTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var task = session.Query.All().Where(e => e.Value < 5 && e.Value > 0).AsAsync(); - Assert.That(task.IsCompleted, Is.False); - - int before = 1; - foreach (var value in await task) { - Assert.That(value.Value, Is.EqualTo(before)); - before++; - } - } - } - - [Test] - public async Task PersistentCollectionTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var container = session.Query.All().First(); - var task = container.EntitySet.Where(e => e.Value < 5 && e.Value > 0).AsAsync(); - Assert.That(task.IsCompleted, Is.False); - - int before = 1; - foreach (var value in await task) { - Assert.That(value.Value, Is.EqualTo(before)); - before++; - } - } - } - - [Test] - public async Task DelayedQueryTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var delayed = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < 5 && e.Value > 0)); - var task = delayed.AsAsync(); - Assert.That(task.IsCompleted, Is.False); - - int before = 1; - foreach (var value in await task) { - Assert.That(value.Value, Is.EqualTo(before)); - before++; - } - } - } - - private IEnumerable AsEnumerable(T a, T b, T c, T d) - { - yield return a; - int counter = 0; - while (counter < Int32.MaxValue/10000) { - counter++; - } - yield return b; - yield return c; - yield return d; - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel; + +namespace Xtensive.Orm.Tests.Storage +{ + public class AsAsyncTaskExtensionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestEntity).Assembly, typeof(TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var container = new EntitySetContainer(session); + foreach (var i in Enumerable.Range(-100, 200)) { + container.EntitySet.Add(new TestEntity(session) {Value = i}); + } + transaction.Complete(); + } + } + + [Test] + public async Task PureEnumerableTest() + { + var task = AsEnumerable(1, 2, 3, 4).AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value, Is.EqualTo(before)); + before++; + } + } + + [Test] + public async Task CollectionAsEnumerableTest() + { + var list = new List {1, 2, 3, 4}; + var task = list.AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value, Is.EqualTo(before)); + before++; + } + } + + [Test] + public async Task QueryableAsEnumearbleTest() + { + IQueryable queryableEnumeable = new EnumerableQuery(Enumerable.Range(-100, 200).ToArray()).Where(v => v < 5 && v > 0); + var task = queryableEnumeable.AsEnumerable().AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value, Is.EqualTo(before)); + before++; + } + } + + [Test] + public async Task QueryableTest() + { + IQueryable queryableEnumeable = new EnumerableQuery(Enumerable.Range(-100, 200).ToArray()).Where(v => v < 5 && v > 0); + var task = queryableEnumeable.AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value, Is.EqualTo(before)); + before++; + } + } + + [Test] + public async Task DoQueryableAsEnumeableTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var task = session.Query.All().Where(e => e.Value < 5 && e.Value > 0).AsEnumerable().AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value.Value, Is.EqualTo(before)); + before++; + } + } + } + + [Test] + public async Task PersistentCollectionAsEnumerableTesk() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var container = session.Query.All().First(); + var task = container.EntitySet.Where(e => e.Value < 5 && e.Value > 0).AsEnumerable().AsAsync(); + Assert.That(task.IsCompleted, Is.True); + + int before = 1; + foreach (var value in await task) { + Assert.That(value.Value, Is.EqualTo(before)); + before++; + } + } + } + + [Test] + public async Task DoQueryableTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var task = session.Query.All().Where(e => e.Value < 5 && e.Value > 0).AsAsync(); + Assert.That(task.IsCompleted, Is.False); + + int before = 1; + foreach (var value in await task) { + Assert.That(value.Value, Is.EqualTo(before)); + before++; + } + } + } + + [Test] + public async Task PersistentCollectionTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var container = session.Query.All().First(); + var task = container.EntitySet.Where(e => e.Value < 5 && e.Value > 0).AsAsync(); + Assert.That(task.IsCompleted, Is.False); + + int before = 1; + foreach (var value in await task) { + Assert.That(value.Value, Is.EqualTo(before)); + before++; + } + } + } + + [Test] + public async Task DelayedQueryTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var delayed = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < 5 && e.Value > 0)); + var task = delayed.AsAsync(); + Assert.That(task.IsCompleted, Is.False); + + int before = 1; + foreach (var value in await task) { + Assert.That(value.Value, Is.EqualTo(before)); + before++; + } + } + } + + private IEnumerable AsEnumerable(T a, T b, T c, T d) + { + yield return a; + int counter = 0; + while (counter < Int32.MaxValue/10000) { + counter++; + } + yield return b; + yield return c; + yield return d; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsyncQueryBaseTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsyncQueryBaseTest.cs index a5def86d47..48820aea36 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsyncQueryBaseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/AsyncQueryBaseTest.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries -{ - [TestFixture] - public abstract class AsyncQueriesBaseTest : AutoBuildTest - { - protected const int DisceplinesPerCourse = 20; - protected const int InitialSpecialitiesCount = 1; - protected const int InitialCoursesCount = 2; - protected const int StudentsPerGroup = 10; - protected const int InitialGroupsCount = 2; - protected const int InitialDisceplinesCount = DisceplinesPerCourse; - protected const int InitialStudentsCount = StudentsPerGroup * InitialGroupsCount; - protected const int InitialTeachersCount = InitialDisceplinesCount; - - protected virtual SessionOptions SessionOptions - { - get { return SessionOptions.Default; } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(Human).Assembly, typeof(Human).Namespace); - configuration.Sessions["Default"].Options = SessionOptions; - return configuration; - } - - protected sealed override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (session.Activate()) { - PopulateSpecialities(session); - PopulateDisceplines(session); - PopulateCourses(session); - PopulateTeachers(session); - PopulateDisceplinesOfCourses(session); - PopulateGroups(session); - PopulateStudents(session); - } - } - - private void PopulateDisceplines(Session session) - { - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < DisceplinesPerCourse; i++) - new Discepline(session) {Name = string.Format("Discepline {0}", i + 1)}; - - transaction.Complete(); - } - } - - private void PopulateCourses(Session session) - { - using (var transaction = session.OpenTransaction()) { - var speciality = session.Query.All().First(); - var currentCourse = new Course(session) { - Name = "Some course", - Year = DateTime.Now.Year, - Speciality = speciality - }; - var previousCourse = new Course(session) { - Name = "Some course", - Year = DateTime.Now.Year - 1, - Speciality = speciality - }; - transaction.Complete(); - } - } - - private void PopulateSpecialities(Session session) - { - using (var transaction = session.OpenTransaction()) { - new Speciality(session) {Name = "Some speciality"}; - transaction.Complete(); - } - } - - private void PopulateDisceplinesOfCourses(Session session) - { - using (var transaction = session.OpenTransaction()) { - var courses = session.Query.All().ToList(); - var disceplines = session.Query.All().ToList(); - var teachers = session.Query.All().ToList(); - - for (int i = 0; i < disceplines.Count; i++) { - new DisceplinesOfCourse(session, courses[0], disceplines[i]) {Teacher = teachers[i]}; - new DisceplinesOfCourse(session, courses[1], disceplines[i]) {Teacher = teachers[i]}; - } - - transaction.Complete(); - } - } - - private void PopulateGroups(Session session) - { - using (var transaction = session.OpenTransaction()) { - var courses = session.Query.All(); - foreach (var course in courses) { - new Group {Name = course.Year==DateTime.Now.Year ? "Current year group" : "Last year group"} - .Courses.Add(course); - } - - transaction.Complete(); - } - } - - private void PopulateTeachers(Session session) - { - using (var transaction = session.OpenTransaction()) { - var allDisceplines = session.Query.All(); - var index = 1; - foreach (var allDiscepline in allDisceplines) { - new Teacher(session) { - Name = string.Format("Name Of Teacher {0}", index), - Surname = string.Format("Surname Of Teacher {0}", index), - DateOfBirth = DateTime.Now.AddYears(-(index + 20)), - Gender = (index % 2 == 1) ? Gender.Male : Gender.Female - }; - index++; - } - - transaction.Complete(); - } - } - - private void PopulateStudents(Session session) - { - var random = new Random(); - using (var transaction = session.OpenTransaction()) { - var allGroups = session.Query.All(); - var index = 1; - foreach (var group in allGroups) { - for (int i = 0; i < StudentsPerGroup; i++) { - group.Students.Add(new Student(session) { - Name = string.Format("Name Of Student {0}", index), - Surname = string.Format("Surname Of Student {0}", index), - DateOfBirth = DateTime.Now.AddYears(-random.Next(20, 25)), - Gender = (index % 2 == 1) ? Gender.Male : Gender.Female - }); - } - - transaction.Complete(); - } - } - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries +{ + [TestFixture] + public abstract class AsyncQueriesBaseTest : AutoBuildTest + { + protected const int DisceplinesPerCourse = 20; + protected const int InitialSpecialitiesCount = 1; + protected const int InitialCoursesCount = 2; + protected const int StudentsPerGroup = 10; + protected const int InitialGroupsCount = 2; + protected const int InitialDisceplinesCount = DisceplinesPerCourse; + protected const int InitialStudentsCount = StudentsPerGroup * InitialGroupsCount; + protected const int InitialTeachersCount = InitialDisceplinesCount; + + protected virtual SessionOptions SessionOptions + { + get { return SessionOptions.Default; } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(Human).Assembly, typeof(Human).Namespace); + configuration.Sessions["Default"].Options = SessionOptions; + return configuration; + } + + protected sealed override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (session.Activate()) { + PopulateSpecialities(session); + PopulateDisceplines(session); + PopulateCourses(session); + PopulateTeachers(session); + PopulateDisceplinesOfCourses(session); + PopulateGroups(session); + PopulateStudents(session); + } + } + + private void PopulateDisceplines(Session session) + { + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < DisceplinesPerCourse; i++) + new Discepline(session) {Name = string.Format("Discepline {0}", i + 1)}; + + transaction.Complete(); + } + } + + private void PopulateCourses(Session session) + { + using (var transaction = session.OpenTransaction()) { + var speciality = session.Query.All().First(); + var currentCourse = new Course(session) { + Name = "Some course", + Year = DateTime.Now.Year, + Speciality = speciality + }; + var previousCourse = new Course(session) { + Name = "Some course", + Year = DateTime.Now.Year - 1, + Speciality = speciality + }; + transaction.Complete(); + } + } + + private void PopulateSpecialities(Session session) + { + using (var transaction = session.OpenTransaction()) { + new Speciality(session) {Name = "Some speciality"}; + transaction.Complete(); + } + } + + private void PopulateDisceplinesOfCourses(Session session) + { + using (var transaction = session.OpenTransaction()) { + var courses = session.Query.All().ToList(); + var disceplines = session.Query.All().ToList(); + var teachers = session.Query.All().ToList(); + + for (int i = 0; i < disceplines.Count; i++) { + new DisceplinesOfCourse(session, courses[0], disceplines[i]) {Teacher = teachers[i]}; + new DisceplinesOfCourse(session, courses[1], disceplines[i]) {Teacher = teachers[i]}; + } + + transaction.Complete(); + } + } + + private void PopulateGroups(Session session) + { + using (var transaction = session.OpenTransaction()) { + var courses = session.Query.All(); + foreach (var course in courses) { + new Group {Name = course.Year==DateTime.Now.Year ? "Current year group" : "Last year group"} + .Courses.Add(course); + } + + transaction.Complete(); + } + } + + private void PopulateTeachers(Session session) + { + using (var transaction = session.OpenTransaction()) { + var allDisceplines = session.Query.All(); + var index = 1; + foreach (var allDiscepline in allDisceplines) { + new Teacher(session) { + Name = string.Format("Name Of Teacher {0}", index), + Surname = string.Format("Surname Of Teacher {0}", index), + DateOfBirth = DateTime.Now.AddYears(-(index + 20)), + Gender = (index % 2 == 1) ? Gender.Male : Gender.Female + }; + index++; + } + + transaction.Complete(); + } + } + + private void PopulateStudents(Session session) + { + var random = new Random(); + using (var transaction = session.OpenTransaction()) { + var allGroups = session.Query.All(); + var index = 1; + foreach (var group in allGroups) { + for (int i = 0; i < StudentsPerGroup; i++) { + group.Students.Add(new Student(session) { + Name = string.Format("Name Of Student {0}", index), + Surname = string.Format("Surname Of Student {0}", index), + DateOfBirth = DateTime.Now.AddYears(-random.Next(20, 25)), + Gender = (index % 2 == 1) ? Gender.Male : Gender.Female + }); + } + + transaction.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ClientProfileTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ClientProfileTest.cs index d216d93591..40f87decbf 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ClientProfileTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ClientProfileTest.cs @@ -1,192 +1,192 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Compiled -{ - public sealed class ClientProfileTest : AsyncQueriesBaseTest - { - private readonly SessionConfiguration inactiveSession = new SessionConfiguration(SessionOptions.ClientProfile); - - [Test] - public async Task Test01() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - } - - [Test] - public async Task Test02() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - } - - [Test] - public async Task Test03() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - Assert.IsInstanceOf>(task); - var disceplineOfLastYearCourse = await task; - Assert.IsInstanceOf(disceplineOfLastYearCourse); - Assert.NotNull(disceplineOfLastYearCourse); - } - } - - [Test] - public async Task Test04() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - Assert.IsInstanceOf>(task); - var disceplineOfLastYearCourse = await task; - Assert.IsInstanceOf(disceplineOfLastYearCourse); - Assert.NotNull(disceplineOfLastYearCourse); - } - } - - [Test] - public async Task Test09() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var qelayedQuery = session.Query.ExecuteDelayed(endpoint => { return endpoint.All(); }); - var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var result = await task; - Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest01() - { - using (var session = Domain.OpenSession(inactiveSession)) { - Console.WriteLine(session.IsActive); - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - var disceplinesOfLastYearCourse = await task; - disceplinesOfLastYearCourse.ToList(); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest02() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - var disceplinesOfLastYearCourse = await task; - disceplinesOfLastYearCourse.ToList(); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest03() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var disceplineOfLastYearCourse = await task; - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest04() - { - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var disceplineOfLastYearCourse = await task; - } - } - - [Test] - public async Task EventsNotificationTest() - { - var sessionOpenedCount = 0; - Domain.SessionOpen += (sender, args) => sessionOpenedCount++; - using (var session = Domain.OpenSession(inactiveSession)) { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - Assert.AreEqual(1, sessionOpenedCount); - } - - [Test] - public async Task AsyncQueryResultsEnumeration() - { - Session session = null; - try - { - session = Domain.OpenSession(inactiveSession); - using (var transaction = session.OpenTransaction()) - foreach (var item in (await session.Query.All().AsAsync())) - { - } - } - finally - { - session.DisposeSafely(); - } - } - - [Test] - public async Task AsyncQueryResultsInterruptedEnumeration() - { - Session session = null; - try { - session = Domain.OpenSession(inactiveSession); - using (var transaction = session.OpenTransaction()) - foreach (var item in await session.Query.All().AsAsync()) { - break; - } - } - finally { - session.DisposeSafely(); - } - } - - [Test] - public async Task RollbackTransactionWhileReaderIsOpen() - { - Session session = null; - try { - session = Domain.OpenSession(inactiveSession); - IEnumerator enumerator; - using (var transaction = session.OpenTransaction()) { - enumerator = (await session.Query.All().AsAsync()).GetEnumerator(); - enumerator.MoveNext(); - var a = enumerator.Current; - } - enumerator.Dispose(); - } - finally { - session.DisposeSafely(); - } - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Compiled +{ + public sealed class ClientProfileTest : AsyncQueriesBaseTest + { + private readonly SessionConfiguration inactiveSession = new SessionConfiguration(SessionOptions.ClientProfile); + + [Test] + public async Task Test01() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + } + + [Test] + public async Task Test02() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + } + + [Test] + public async Task Test03() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + Assert.IsInstanceOf>(task); + var disceplineOfLastYearCourse = await task; + Assert.IsInstanceOf(disceplineOfLastYearCourse); + Assert.NotNull(disceplineOfLastYearCourse); + } + } + + [Test] + public async Task Test04() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + Assert.IsInstanceOf>(task); + var disceplineOfLastYearCourse = await task; + Assert.IsInstanceOf(disceplineOfLastYearCourse); + Assert.NotNull(disceplineOfLastYearCourse); + } + } + + [Test] + public async Task Test09() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var qelayedQuery = session.Query.ExecuteDelayed(endpoint => { return endpoint.All(); }); + var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var result = await task; + Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest01() + { + using (var session = Domain.OpenSession(inactiveSession)) { + Console.WriteLine(session.IsActive); + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + var disceplinesOfLastYearCourse = await task; + disceplinesOfLastYearCourse.ToList(); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest02() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + var disceplinesOfLastYearCourse = await task; + disceplinesOfLastYearCourse.ToList(); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest03() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var disceplineOfLastYearCourse = await task; + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest04() + { + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var disceplineOfLastYearCourse = await task; + } + } + + [Test] + public async Task EventsNotificationTest() + { + var sessionOpenedCount = 0; + Domain.SessionOpen += (sender, args) => sessionOpenedCount++; + using (var session = Domain.OpenSession(inactiveSession)) { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + Assert.AreEqual(1, sessionOpenedCount); + } + + [Test] + public async Task AsyncQueryResultsEnumeration() + { + Session session = null; + try + { + session = Domain.OpenSession(inactiveSession); + using (var transaction = session.OpenTransaction()) + foreach (var item in (await session.Query.All().AsAsync())) + { + } + } + finally + { + session.DisposeSafely(); + } + } + + [Test] + public async Task AsyncQueryResultsInterruptedEnumeration() + { + Session session = null; + try { + session = Domain.OpenSession(inactiveSession); + using (var transaction = session.OpenTransaction()) + foreach (var item in await session.Query.All().AsAsync()) { + break; + } + } + finally { + session.DisposeSafely(); + } + } + + [Test] + public async Task RollbackTransactionWhileReaderIsOpen() + { + Session session = null; + try { + session = Domain.OpenSession(inactiveSession); + IEnumerator enumerator; + using (var transaction = session.OpenTransaction()) { + enumerator = (await session.Query.All().AsAsync()).GetEnumerator(); + enumerator.MoveNext(); + var a = enumerator.Current; + } + enumerator.Dispose(); + } + finally { + session.DisposeSafely(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ServerProfileTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ServerProfileTest.cs index 0379002129..063a6c3d50 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ServerProfileTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Compiled/ServerProfileTest.cs @@ -1,229 +1,229 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Compiled -{ - public class ServerProfileTest : AsyncQueriesBaseTest - { - private readonly SessionConfiguration inactivatedSession = new SessionConfiguration(SessionOptions.ServerProfile); - - [Test] - public async Task Test01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - Console.WriteLine(transaction.Transaction.Guid); - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Console.WriteLine(transaction.Transaction.Guid); - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Console.WriteLine(transaction.Transaction.Guid); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - } - - [Test] - public async Task Test02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - } - - [Test] - public async Task Test03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - Assert.IsInstanceOf>(task); - var disceplineOfLastYearCourse = await task; - Assert.IsInstanceOf(disceplineOfLastYearCourse); - Assert.NotNull(disceplineOfLastYearCourse); - } - } - - [Test] - public async Task Test04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - Assert.IsInstanceOf>(task); - var disceplineOfLastYearCourse = await task; - Assert.IsInstanceOf(disceplineOfLastYearCourse); - Assert.NotNull(disceplineOfLastYearCourse); - } - } - - [Test] - public async Task Test05() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - var qelayedQuery = session.Query.ExecuteDelayed(endpoint => { return endpoint.All(); }); - var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var result = await task; - Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); - } - } - - [Test] - public async Task Test06() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - var qelayedQuery = session.Query.ExecuteDelayed(query => query.All()); - var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var result = await task; - Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest01() - { - using (var session = Domain.OpenSession(inactivatedSession)) - using (var transaction = session.OpenTransaction()) - { - Console.WriteLine(session.IsActive); - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - var disceplinesOfLastYearCourse = await task; - disceplinesOfLastYearCourse.ToList(); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest02() - { - using (var session = Domain.OpenSession(inactivatedSession)) - using (var transaction = session.OpenTransaction()) - { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - var disceplinesOfLastYearCourse = await task; - disceplinesOfLastYearCourse.ToList(); - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest03() - { - using (var session = Domain.OpenSession(inactivatedSession)) - using (var transaction = session.OpenTransaction()) - { - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var disceplineOfLastYearCourse = await task; - } - } - - [Test] - public async Task AsyncQueryInsideInactiveSessionTest04() - { - using (var session = Domain.OpenSession(inactivatedSession)) - using (var transaction = session.OpenTransaction()) - { - var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); - var disceplineOfLastYearCourse = await task; - } - } - - [Test] - public async Task EventsNotificationTest() - { - var transactionOpeningCount = 0; - var transactionOpenedCount = 0; - var sessionOpeningCount = 0; - var sessionOpenedCount = 0; - Domain.SessionOpen += (sender, args) => sessionOpenedCount++; - using (var session = Domain.OpenSession()) { - session.Events.TransactionOpening += (sender, args) => transactionOpeningCount++; - session.Events.TransactionOpened += (sender, args) => transactionOpenedCount++; - using (var transaction = session.OpenTransaction()) { - Console.WriteLine(transaction.Transaction.Guid); - var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); - Assert.IsInstanceOf>>(task); - var disceplinesOfLastYearCourse = await task; - Console.WriteLine(transaction.Transaction.Guid); - Assert.IsInstanceOf>(disceplinesOfLastYearCourse); - var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); - Console.WriteLine(transaction.Transaction.Guid); - Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); - } - } - Assert.AreEqual(1, sessionOpenedCount); - Assert.AreEqual(1, transactionOpeningCount); - Assert.AreEqual(1, transactionOpenedCount); - } - - [Test] - public async Task AsyncQueryResultsEnumeration() - { - Session session = null; - try { - session = Domain.OpenSession(); - using (var transaction = session.OpenTransaction()) - foreach (var item in (await session.Query.All().AsAsync())) { } - } - finally { - session.DisposeSafely(); - } - } - - [Test] - public async Task AsyncQueryResultsInterruptedEnumeration() - { - Session session = null; - try { - session = Domain.OpenSession(); - using (var transaction = session.OpenTransaction()) - foreach (var item in await session.Query.All().AsAsync()) - break; - } - finally { - session.DisposeSafely(); - } - } - - [Test] - public async Task RollbackTransactionWhileReaderIsOpen() - { - Session session = null; - try { - session = Domain.OpenSession(); - IEnumerator enumerator; - using (var transaction = session.OpenTransaction()) { - enumerator = (await session.Query.All().AsAsync()).GetEnumerator(); - enumerator.MoveNext(); - var a = enumerator.Current; - } - enumerator.Dispose(); - } - finally { - session.DisposeSafely(); - } - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Compiled +{ + public class ServerProfileTest : AsyncQueriesBaseTest + { + private readonly SessionConfiguration inactivatedSession = new SessionConfiguration(SessionOptions.ServerProfile); + + [Test] + public async Task Test01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Console.WriteLine(transaction.Transaction.Guid); + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Console.WriteLine(transaction.Transaction.Guid); + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Console.WriteLine(transaction.Transaction.Guid); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + } + + [Test] + public async Task Test02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + } + + [Test] + public async Task Test03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + Assert.IsInstanceOf>(task); + var disceplineOfLastYearCourse = await task; + Assert.IsInstanceOf(disceplineOfLastYearCourse); + Assert.NotNull(disceplineOfLastYearCourse); + } + } + + [Test] + public async Task Test04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + Assert.IsInstanceOf>(task); + var disceplineOfLastYearCourse = await task; + Assert.IsInstanceOf(disceplineOfLastYearCourse); + Assert.NotNull(disceplineOfLastYearCourse); + } + } + + [Test] + public async Task Test05() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + var qelayedQuery = session.Query.ExecuteDelayed(endpoint => { return endpoint.All(); }); + var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var result = await task; + Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); + } + } + + [Test] + public async Task Test06() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + var qelayedQuery = session.Query.ExecuteDelayed(query => query.All()); + var task = session.Query.ExecuteAsync(endpoint => endpoint.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var result = await task; + Assert.NotNull(((DelayedSequence)qelayedQuery).Task.Result); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest01() + { + using (var session = Domain.OpenSession(inactivatedSession)) + using (var transaction = session.OpenTransaction()) + { + Console.WriteLine(session.IsActive); + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + var disceplinesOfLastYearCourse = await task; + disceplinesOfLastYearCourse.ToList(); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest02() + { + using (var session = Domain.OpenSession(inactivatedSession)) + using (var transaction = session.OpenTransaction()) + { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + var disceplinesOfLastYearCourse = await task; + disceplinesOfLastYearCourse.ToList(); + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest03() + { + using (var session = Domain.OpenSession(inactivatedSession)) + using (var transaction = session.OpenTransaction()) + { + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var disceplineOfLastYearCourse = await task; + } + } + + [Test] + public async Task AsyncQueryInsideInactiveSessionTest04() + { + using (var session = Domain.OpenSession(inactivatedSession)) + using (var transaction = session.OpenTransaction()) + { + var task = session.Query.ExecuteAsync(new object(), query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()); + var disceplineOfLastYearCourse = await task; + } + } + + [Test] + public async Task EventsNotificationTest() + { + var transactionOpeningCount = 0; + var transactionOpenedCount = 0; + var sessionOpeningCount = 0; + var sessionOpenedCount = 0; + Domain.SessionOpen += (sender, args) => sessionOpenedCount++; + using (var session = Domain.OpenSession()) { + session.Events.TransactionOpening += (sender, args) => transactionOpeningCount++; + session.Events.TransactionOpened += (sender, args) => transactionOpenedCount++; + using (var transaction = session.OpenTransaction()) { + Console.WriteLine(transaction.Transaction.Guid); + var task = session.Query.ExecuteAsync(query => query.All().Where(d => d.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline)); + Assert.IsInstanceOf>>(task); + var disceplinesOfLastYearCourse = await task; + Console.WriteLine(transaction.Transaction.Guid); + Assert.IsInstanceOf>(disceplinesOfLastYearCourse); + var listOfLastYearCourseDisceplines = disceplinesOfLastYearCourse.ToList(); + Console.WriteLine(transaction.Transaction.Guid); + Assert.AreEqual(20, listOfLastYearCourseDisceplines.Count); + } + } + Assert.AreEqual(1, sessionOpenedCount); + Assert.AreEqual(1, transactionOpeningCount); + Assert.AreEqual(1, transactionOpenedCount); + } + + [Test] + public async Task AsyncQueryResultsEnumeration() + { + Session session = null; + try { + session = Domain.OpenSession(); + using (var transaction = session.OpenTransaction()) + foreach (var item in (await session.Query.All().AsAsync())) { } + } + finally { + session.DisposeSafely(); + } + } + + [Test] + public async Task AsyncQueryResultsInterruptedEnumeration() + { + Session session = null; + try { + session = Domain.OpenSession(); + using (var transaction = session.OpenTransaction()) + foreach (var item in await session.Query.All().AsAsync()) + break; + } + finally { + session.DisposeSafely(); + } + } + + [Test] + public async Task RollbackTransactionWhileReaderIsOpen() + { + Session session = null; + try { + session = Domain.OpenSession(); + IEnumerator enumerator; + using (var transaction = session.OpenTransaction()) { + enumerator = (await session.Query.All().AsAsync()).GetEnumerator(); + enumerator.MoveNext(); + var a = enumerator.Current; + } + enumerator.Dispose(); + } + finally { + session.DisposeSafely(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryClientProfileTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryClientProfileTest.cs index 67fa62af89..e66fc8f415 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryClientProfileTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryClientProfileTest.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries -{ - public class DelayedQueryClientProfileTest : DelayedQueryTestBase - { - protected override SessionConfiguration SessionConfiguration - { - get { return new SessionConfiguration(SessionOptions.ClientProfile); } - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries +{ + public class DelayedQueryClientProfileTest : DelayedQueryTestBase + { + protected override SessionConfiguration SessionConfiguration + { + get { return new SessionConfiguration(SessionOptions.ClientProfile); } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryServerProfileTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryServerProfileTest.cs index 44892b8c21..24392388af 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryServerProfileTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryServerProfileTest.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries -{ - public class DelayedQueryServerProfileTest : DelayedQueryTestBase - { - protected override SessionConfiguration SessionConfiguration - { - get { return new SessionConfiguration(SessionOptions.ServerProfile); } - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries +{ + public class DelayedQueryServerProfileTest : DelayedQueryTestBase + { + protected override SessionConfiguration SessionConfiguration + { + get { return new SessionConfiguration(SessionOptions.ServerProfile); } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryTestBase.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryTestBase.cs index cf865e05eb..c07c32cd1e 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryTestBase.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/DelayedQueryTestBase.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.09.12 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries -{ - public abstract class DelayedQueryTestBase : AsyncQueriesBaseTest - { - protected abstract SessionConfiguration SessionConfiguration { get; } - - [Test] - public async Task GetScalarResultUsingSessionDirectly() - { - using (var session = Domain.OpenSession(SessionConfiguration)) - using (var tx = GetTransactionScope(session)) { - var task = session.Query.ExecuteDelayed( - endpoint => endpoint.All().Where(el => el.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()).AsAsync(); - Assert.IsInstanceOf>(task); - var result = await task; - Assert.IsInstanceOf(result); - Assert.NotNull(result); - } - } - - [Test] - public async Task GetIEnumerableOfResultsUsingSessionDirectly() - { - using (var session = Domain.OpenSession(SessionConfiguration)) - using (var tx = GetTransactionScope(session)) { - var task = session.Query.ExecuteDelayed( - endpoint => endpoint.All().Where(el => el.Course.Year==DateTime.Now.Year - 1).Select(d => d.Discepline)).AsAsync(); - Assert.IsInstanceOf>>(task); - var result = await task; - Assert.IsInstanceOf>(result); - var disceplinesOfCourse = result.ToList(); - Assert.NotNull(disceplinesOfCourse); - Assert.AreNotEqual(0, disceplinesOfCourse.Count); - Assert.AreEqual(20, disceplinesOfCourse.Count); - } - } - - [Test] - public async Task GetOrderedIEnumerableOfResultsUsingSessionDirectly() - { - using (var session = Domain.OpenSession(SessionConfiguration)) - using (var tx = GetTransactionScope(session)) { - var task = session.Query.ExecuteDelayed(endpoint => - endpoint.All().Where(el => el.Course.Year==DateTime.Now.Year - 1) - .Select(d => d.Discepline).OrderBy(d => d.Name)) - .AsAsync(); - Assert.IsInstanceOf>>(task); - var result = await task; - Assert.IsInstanceOf>(result); - var orderedDisceplines = result.ToList(); - Assert.NotNull(orderedDisceplines); - Assert.AreNotEqual(0, orderedDisceplines.Count); - Assert.AreEqual(20, orderedDisceplines.Count); - } - } - - private TransactionScope GetTransactionScope(Session session) - { - if (SessionConfiguration.Supports(SessionOptions.ServerProfile)) - return session.OpenTransaction(); - return null; - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.09.12 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.AsyncQueries.Model; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries +{ + public abstract class DelayedQueryTestBase : AsyncQueriesBaseTest + { + protected abstract SessionConfiguration SessionConfiguration { get; } + + [Test] + public async Task GetScalarResultUsingSessionDirectly() + { + using (var session = Domain.OpenSession(SessionConfiguration)) + using (var tx = GetTransactionScope(session)) { + var task = session.Query.ExecuteDelayed( + endpoint => endpoint.All().Where(el => el.Course.Year == DateTime.Now.Year - 1).Select(d => d.Discepline).First()).AsAsync(); + Assert.IsInstanceOf>(task); + var result = await task; + Assert.IsInstanceOf(result); + Assert.NotNull(result); + } + } + + [Test] + public async Task GetIEnumerableOfResultsUsingSessionDirectly() + { + using (var session = Domain.OpenSession(SessionConfiguration)) + using (var tx = GetTransactionScope(session)) { + var task = session.Query.ExecuteDelayed( + endpoint => endpoint.All().Where(el => el.Course.Year==DateTime.Now.Year - 1).Select(d => d.Discepline)).AsAsync(); + Assert.IsInstanceOf>>(task); + var result = await task; + Assert.IsInstanceOf>(result); + var disceplinesOfCourse = result.ToList(); + Assert.NotNull(disceplinesOfCourse); + Assert.AreNotEqual(0, disceplinesOfCourse.Count); + Assert.AreEqual(20, disceplinesOfCourse.Count); + } + } + + [Test] + public async Task GetOrderedIEnumerableOfResultsUsingSessionDirectly() + { + using (var session = Domain.OpenSession(SessionConfiguration)) + using (var tx = GetTransactionScope(session)) { + var task = session.Query.ExecuteDelayed(endpoint => + endpoint.All().Where(el => el.Course.Year==DateTime.Now.Year - 1) + .Select(d => d.Discepline).OrderBy(d => d.Name)) + .AsAsync(); + Assert.IsInstanceOf>>(task); + var result = await task; + Assert.IsInstanceOf>(result); + var orderedDisceplines = result.ToList(); + Assert.NotNull(orderedDisceplines); + Assert.AreNotEqual(0, orderedDisceplines.Count); + Assert.AreEqual(20, orderedDisceplines.Count); + } + } + + private TransactionScope GetTransactionScope(Session session) + { + if (SessionConfiguration.Supports(SessionOptions.ServerProfile)) + return session.OpenTransaction(); + return null; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Model.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Model.cs index feb8476060..e87c5c487d 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Model.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/Model.cs @@ -1,166 +1,166 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.07.01 - -using System; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Model -{ - [HierarchyRoot] - public abstract class Human : Entity - { - [Field, Key] - public int Id { get; protected set; } - - [Field] - public string Name { get; set; } - - [Field] - public string Surname { get; set; } - - [Field] - public DateTime DateOfBirth { get; set; } - - [Field] - public Gender Gender { get; set; } - - public Human(Session session) - : base(session) - { } - } - - public class Teacher : Human - { - [Field] - [Association(PairTo = "Teacher")] - public EntitySet Disciplines { get; set; } - - public Teacher(Session session) - : base(session) - { } - } - - public class Student : Human - { - [Field] - public Group Group { get; set; } - - public Student(Session session) - : base(session) - { } - } - - [HierarchyRoot] - public class Group : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - [Association(PairTo = "Groups")] - public EntitySet Courses { get; set; } - - [Field] - [Association(PairTo = "Group")] - public EntitySet Students { get; set; } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class DisceplinesOfCourse : Entity - { - [Field, Key(0)] - public Course Course { get; set; } - - [Field, Key(1)] - public Discepline Discepline { get; set; } - - [Field] - public Teacher Teacher { get; set; } - - public DisceplinesOfCourse(Session session, Course course, Discepline discepline) - : base(session, course, discepline) - { } - } - - [HierarchyRoot] - [Index("Name", "Year", Unique = true, Clustered = false)] - public class Course : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 255)] - public string Name { get; set; } - - [Field] - public int Year { get; set; } - - [Field] - public Speciality Speciality { get; set; } - - [Field] - public EntitySet Groups { get; set; } - - public Course(Session session) - : base(session) - { } - } - - [HierarchyRoot] - public class Speciality : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public EntitySet Courses { get; set; } - - public Speciality(Session session) - : base(session) - { } - } - - [HierarchyRoot] - public class Discepline : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Discepline(Session session) - : base(session) - { } - } - - [HierarchyRoot] - public class ClassWithParameterizedConstructor : Entity - { - [Key, Field] - public int Id { get; set; } - - [Field] - public string TextField { get; set; } - - public ClassWithParameterizedConstructor(Session session) - : base(session) - { } - } - - public enum Gender - { - Male, - Female - } -} - +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.07.01 + +using System; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries.Model +{ + [HierarchyRoot] + public abstract class Human : Entity + { + [Field, Key] + public int Id { get; protected set; } + + [Field] + public string Name { get; set; } + + [Field] + public string Surname { get; set; } + + [Field] + public DateTime DateOfBirth { get; set; } + + [Field] + public Gender Gender { get; set; } + + public Human(Session session) + : base(session) + { } + } + + public class Teacher : Human + { + [Field] + [Association(PairTo = "Teacher")] + public EntitySet Disciplines { get; set; } + + public Teacher(Session session) + : base(session) + { } + } + + public class Student : Human + { + [Field] + public Group Group { get; set; } + + public Student(Session session) + : base(session) + { } + } + + [HierarchyRoot] + public class Group : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + [Association(PairTo = "Groups")] + public EntitySet Courses { get; set; } + + [Field] + [Association(PairTo = "Group")] + public EntitySet Students { get; set; } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class DisceplinesOfCourse : Entity + { + [Field, Key(0)] + public Course Course { get; set; } + + [Field, Key(1)] + public Discepline Discepline { get; set; } + + [Field] + public Teacher Teacher { get; set; } + + public DisceplinesOfCourse(Session session, Course course, Discepline discepline) + : base(session, course, discepline) + { } + } + + [HierarchyRoot] + [Index("Name", "Year", Unique = true, Clustered = false)] + public class Course : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 255)] + public string Name { get; set; } + + [Field] + public int Year { get; set; } + + [Field] + public Speciality Speciality { get; set; } + + [Field] + public EntitySet Groups { get; set; } + + public Course(Session session) + : base(session) + { } + } + + [HierarchyRoot] + public class Speciality : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public EntitySet Courses { get; set; } + + public Speciality(Session session) + : base(session) + { } + } + + [HierarchyRoot] + public class Discepline : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Discepline(Session session) + : base(session) + { } + } + + [HierarchyRoot] + public class ClassWithParameterizedConstructor : Entity + { + [Key, Field] + public int Id { get; set; } + + [Field] + public string TextField { get; set; } + + public ClassWithParameterizedConstructor(Session session) + : base(session) + { } + } + + public enum Gender + { + Male, + Female + } +} + diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/PersistWithAsyncQueriesTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/PersistWithAsyncQueriesTest.cs index 3f6812f4bc..70e5371bf9 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/PersistWithAsyncQueriesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncQueries/PersistWithAsyncQueriesTest.cs @@ -1,422 +1,422 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.07.12 - -using System; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.AsyncQueries.PersistWithAsyncQueriesTestModel; - -namespace Xtensive.Orm.Tests.Storage.AsyncQueries.PersistWithAsyncQueriesTestModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public long Value { get; set; } - - public TestEntity(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class EntitySetContainer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet EntitySet { get; set; } - - public EntitySetContainer(Session session) - : base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class PersistWithAsyncQueriesTest : AutoBuildTest - { - private const int TestEntityCount = 25; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < TestEntityCount; i++) - new TestEntity(session) {Value = i}; - transaction.Complete(); - } - } - - [Test] - public async Task AsyncButFullySequential() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var readyToRockQuery = await session.Query.All().AsAsync(); - var anotherAsyncQuery = await session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in readyToRockQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount)); - - count = 0; - foreach (var testEntity in anotherAsyncQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount)); - } - } - - [Test] - public async Task QueryFirstWaitLater() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var readyToRockQuery = session.Query.All().AsAsync(); - - var anotherAsyncQuery = session.Query.All().AsAsync(); - - // some local non-DO work probably; - - int count = 0; - foreach (var testEntity in await readyToRockQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount)); - - count = 0; - foreach (var testEntity in await anotherAsyncQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount)); - } - } - - [Test] - public async Task QueryFirstWaitLaterInDiffferentOrder() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()){ - var readyToRockQuery = session.Query.All().AsAsync(); - var anotherAsyncQuery = session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in await anotherAsyncQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount)); - - count = 0; - foreach (var testEntity in await readyToRockQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount)); - } - } - - [Test] - public async Task ProperPersistSequenceTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var readyToRockQuery = await session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var anotherAsyncQuery = await session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in readyToRockQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - - count = 0; - foreach (var testEntity in anotherAsyncQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 6)); - } - } - - [Test] - public async Task PersistBeforeFirstAsyncQueryAwaitTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var readyToRockQuery = await session.Query.All().AsAsync(); - - var anotherAsyncQuery = await session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in readyToRockQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - - count = 0; - foreach (var testEntity in anotherAsyncQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - } - } - - [Test] - public async Task PersistBeforeSecondAsyncQueryAwaitTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var readyToRockQuery = await session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var anotherAsyncQuery = await session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in readyToRockQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount)); - - count = 0; - foreach (var testEntity in anotherAsyncQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - } - } - - [Test] - public async Task PersistBeforeBothAsyncQueriesAndDelayedWaitTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session) {Value = 101}; - new TestEntity(session) {Value = 102}; - new TestEntity(session) {Value = 103}; - - var readyToRockQuery = session.Query.All().AsAsync(); - - new TestEntity(session) { Value = 104 }; - new TestEntity(session) { Value = 105 }; - new TestEntity(session) { Value = 106 }; - - var anotherAsyncQuery = session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in await anotherAsyncQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount + 6)); - - count = 0; - foreach (var testEntity in await readyToRockQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - } - } - - [Test] - public async Task PersistBeforeFirstAsyncQueryAndDalayedAwaitTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var readyToRockQuery = session.Query.All().AsAsync(); - var anotherAsyncQuery = session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in await anotherAsyncQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - - count = 0; - foreach (var testEntity in await readyToRockQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - } - } - - [Test] - public async Task PersistBeforeSecondAsyncQueryAndDelayedAwaitTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var readyToRockQuery = session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var anotherAsyncQuery = session.Query.All().AsAsync(); - - int count = 0; - foreach (var testEntity in await anotherAsyncQuery) - count++; - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - - count = 0; - foreach (var testEntity in await readyToRockQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount)); - } - } - - #region Manual persist - - [Test] - public async Task ProperManualSavingChanges() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var count = 0; - foreach (var entity in await session.Query.All().AsAsync()) - count++; - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - session.SaveChanges(); - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - count = 0; - session.Query.All().ForEach((e) => count++); - Assert.That(count, Is.EqualTo(TestEntityCount + 6)); - } - } - - [Test] - public async Task AwaitingQueryBeforeManualSavingChanges() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var readyToRockQuery = session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - - int count = 0; - foreach (var entity in await readyToRockQuery) - count++; - - session.SaveChanges(); - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - count = 0; - session.Query.All().ForEach((e) => count++); - Assert.That(count, Is.EqualTo(TestEntityCount + 6)); - } - } - - [Test] - public async Task ManualSavingDuringAsyncQueryExecution() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - var readyToRockQuery = session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - session.SaveChanges(); - - int count = 0; - foreach (var entity in await readyToRockQuery) - count++; - - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - count = 0; - session.Query.All().ForEach((e)=> count++); - Assert.That(count, Is.EqualTo(TestEntityCount + 6)); - } - } - - [Test] - public async Task ManualSavingDuringEnumeration() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var readyToRockQuery = session.Query.All().AsAsync(); - - new TestEntity(session); - new TestEntity(session); - new TestEntity(session); - - bool shouldPersist = true; - - int count = 0; - foreach (var entity in await readyToRockQuery) { - if (count > 10 && shouldPersist) { - session.SaveChanges(); - shouldPersist = false; - } - count++; - } - - Assert.That(count, Is.EqualTo(TestEntityCount)); - count = 0; - session.Query.All().ForEach((e) => count++); - Assert.That(count, Is.EqualTo(TestEntityCount + 3)); - } - } - - #endregion - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.07.12 + +using System; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.AsyncQueries.PersistWithAsyncQueriesTestModel; + +namespace Xtensive.Orm.Tests.Storage.AsyncQueries.PersistWithAsyncQueriesTestModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public long Value { get; set; } + + public TestEntity(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class EntitySetContainer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet EntitySet { get; set; } + + public EntitySetContainer(Session session) + : base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class PersistWithAsyncQueriesTest : AutoBuildTest + { + private const int TestEntityCount = 25; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + for (int i = 0; i < TestEntityCount; i++) + new TestEntity(session) {Value = i}; + transaction.Complete(); + } + } + + [Test] + public async Task AsyncButFullySequential() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var readyToRockQuery = await session.Query.All().AsAsync(); + var anotherAsyncQuery = await session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in readyToRockQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount)); + + count = 0; + foreach (var testEntity in anotherAsyncQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount)); + } + } + + [Test] + public async Task QueryFirstWaitLater() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var readyToRockQuery = session.Query.All().AsAsync(); + + var anotherAsyncQuery = session.Query.All().AsAsync(); + + // some local non-DO work probably; + + int count = 0; + foreach (var testEntity in await readyToRockQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount)); + + count = 0; + foreach (var testEntity in await anotherAsyncQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount)); + } + } + + [Test] + public async Task QueryFirstWaitLaterInDiffferentOrder() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()){ + var readyToRockQuery = session.Query.All().AsAsync(); + var anotherAsyncQuery = session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in await anotherAsyncQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount)); + + count = 0; + foreach (var testEntity in await readyToRockQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount)); + } + } + + [Test] + public async Task ProperPersistSequenceTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var readyToRockQuery = await session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var anotherAsyncQuery = await session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in readyToRockQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + + count = 0; + foreach (var testEntity in anotherAsyncQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 6)); + } + } + + [Test] + public async Task PersistBeforeFirstAsyncQueryAwaitTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var readyToRockQuery = await session.Query.All().AsAsync(); + + var anotherAsyncQuery = await session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in readyToRockQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + + count = 0; + foreach (var testEntity in anotherAsyncQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + } + } + + [Test] + public async Task PersistBeforeSecondAsyncQueryAwaitTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var readyToRockQuery = await session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var anotherAsyncQuery = await session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in readyToRockQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount)); + + count = 0; + foreach (var testEntity in anotherAsyncQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + } + } + + [Test] + public async Task PersistBeforeBothAsyncQueriesAndDelayedWaitTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session) {Value = 101}; + new TestEntity(session) {Value = 102}; + new TestEntity(session) {Value = 103}; + + var readyToRockQuery = session.Query.All().AsAsync(); + + new TestEntity(session) { Value = 104 }; + new TestEntity(session) { Value = 105 }; + new TestEntity(session) { Value = 106 }; + + var anotherAsyncQuery = session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in await anotherAsyncQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount + 6)); + + count = 0; + foreach (var testEntity in await readyToRockQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + } + } + + [Test] + public async Task PersistBeforeFirstAsyncQueryAndDalayedAwaitTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var readyToRockQuery = session.Query.All().AsAsync(); + var anotherAsyncQuery = session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in await anotherAsyncQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + + count = 0; + foreach (var testEntity in await readyToRockQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + } + } + + [Test] + public async Task PersistBeforeSecondAsyncQueryAndDelayedAwaitTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var readyToRockQuery = session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var anotherAsyncQuery = session.Query.All().AsAsync(); + + int count = 0; + foreach (var testEntity in await anotherAsyncQuery) + count++; + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + + count = 0; + foreach (var testEntity in await readyToRockQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount)); + } + } + + #region Manual persist + + [Test] + public async Task ProperManualSavingChanges() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var count = 0; + foreach (var entity in await session.Query.All().AsAsync()) + count++; + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + session.SaveChanges(); + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + count = 0; + session.Query.All().ForEach((e) => count++); + Assert.That(count, Is.EqualTo(TestEntityCount + 6)); + } + } + + [Test] + public async Task AwaitingQueryBeforeManualSavingChanges() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var readyToRockQuery = session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + + int count = 0; + foreach (var entity in await readyToRockQuery) + count++; + + session.SaveChanges(); + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + count = 0; + session.Query.All().ForEach((e) => count++); + Assert.That(count, Is.EqualTo(TestEntityCount + 6)); + } + } + + [Test] + public async Task ManualSavingDuringAsyncQueryExecution() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + var readyToRockQuery = session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + session.SaveChanges(); + + int count = 0; + foreach (var entity in await readyToRockQuery) + count++; + + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + count = 0; + session.Query.All().ForEach((e)=> count++); + Assert.That(count, Is.EqualTo(TestEntityCount + 6)); + } + } + + [Test] + public async Task ManualSavingDuringEnumeration() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var readyToRockQuery = session.Query.All().AsAsync(); + + new TestEntity(session); + new TestEntity(session); + new TestEntity(session); + + bool shouldPersist = true; + + int count = 0; + foreach (var entity in await readyToRockQuery) { + if (count > 10 && shouldPersist) { + session.SaveChanges(); + shouldPersist = false; + } + count++; + } + + Assert.That(count, Is.EqualTo(TestEntityCount)); + count = 0; + session.Query.All().ForEach((e) => count++); + Assert.That(count, Is.EqualTo(TestEntityCount + 3)); + } + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/AsyncSession/AsyncSessionOpeningTest.cs b/Orm/Xtensive.Orm.Tests/Storage/AsyncSession/AsyncSessionOpeningTest.cs index 1320908525..6c11c64338 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/AsyncSession/AsyncSessionOpeningTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/AsyncSession/AsyncSessionOpeningTest.cs @@ -1,253 +1,253 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.07.12 - -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Storage.AsyncSession.TestSessionOpentingModel; - -namespace Xtensive.Orm.Tests.Storage.AsyncSession.TestSessionOpentingModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public TestEntity(Session session) - : base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage.AsyncSession -{ - public class AsyncSessionOpeningTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - [Test] - public async Task Test01() - { - var session = await Domain.OpenSessionAsync(); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - - await TestSession(session); - } - - [Test] - public async Task Test02() - { - var canellationTokenSource = new CancellationTokenSource(); - var session = await Domain.OpenSessionAsync(canellationTokenSource.Token); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test03() - { - var canellationTokenSource = new CancellationTokenSource(); - canellationTokenSource.Cancel(); - - Session session = null; - try { - session = await Domain.OpenSessionAsync(canellationTokenSource.Token); - } - catch (OperationCanceledException exception) { - Assert.That(session, Is.Null); - } - } - - [Test] - public async Task Test04() - { - var session = await Domain.OpenSessionAsync(SessionType.Default); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test05() - { - var session = await Domain.OpenSessionAsync(SessionType.System); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test06() - { - var session = await Domain.OpenSessionAsync(SessionType.KeyGenerator); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test07() - { - var session = await Domain.OpenSessionAsync(SessionType.Service); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test08() - { - var ctSource = new CancellationTokenSource(); - ctSource.Cancel(); - - Session session = null; - Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.Default, ctSource.Token)); - Assert.That(session, Is.Null); - } - - [Test] - public async Task Test09() - { - var ctSource = new CancellationTokenSource(); - ctSource.Cancel(); - - Session session = null; - Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.KeyGenerator, ctSource.Token)); - Assert.That(session, Is.Null); - } - - [Test] - public async Task Test10() - { - var ctSource = new CancellationTokenSource(); - ctSource.Cancel(); - - Session session = null; - Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.System, ctSource.Token)); - Assert.That(session, Is.Null); - } - - [Test] - public async Task Test11() - { - var ctSource = new CancellationTokenSource(); - ctSource.Cancel(); - - Session session = null; - Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.Service, ctSource.Token)); - Assert.That(session, Is.Null); - } - - [Test] - public async Task Test12() - { - var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); - var session = await Domain.OpenSessionAsync(sessionConfiguration); - Assert.That(session, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test13() - { - var sessionConfiguration = new SessionConfiguration(SessionOptions.Default | SessionOptions.AutoActivation); - var session = await Domain.OpenSessionAsync(sessionConfiguration, CancellationToken.None).ConfigureAwait(false); - Assert.That(session, Is.Not.Null); - Assert.That(Session.Current, Is.Not.Null); - - await TestSession(session).ConfigureAwait(false); - } - - [Test] - public async Task Test14() - { - var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); - var session = await Domain.OpenSessionAsync(sessionConfiguration); - Assert.That(session, Is.Not.Null); - await TestSession(session); - } - - [Test] - public async Task Test15() - { - var ctSource = new CancellationTokenSource(); - ctSource.Cancel(); - var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); - - Session session = null; - Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(sessionConfiguration, ctSource.Token)); - Assert.That(session, Is.Null); - } - - [Test] - public async Task Test28() - { - var session = await Domain.OpenSessionAsync(); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - } - - [Test] - public async Task Test29() - { - var session = await Domain.OpenSessionAsync(); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - } - - [Test] - public async Task Test30() - { - var session = await Domain.OpenSessionAsync(); - Assert.That(session, Is.Not.Null); - var handler = session.Handler as SqlSessionHandler; - Assert.That(handler, Is.Not.Null); - } - - private async Task TestSession(Session session) - { - await Task.Run(() => - { - using (session.Activate()) - using (var transacion = session.OpenTransaction()) - { - Assert.That(Session.Current, Is.Not.Null); - Assert.That(Session.Current, Is.EqualTo(session)); - var entity = new TestEntity(session); - session.SaveChanges(); - session.Query.All().First(); - entity.Remove(); - session.SaveChanges(); - } - }); - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.07.12 + +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Storage.AsyncSession.TestSessionOpentingModel; + +namespace Xtensive.Orm.Tests.Storage.AsyncSession.TestSessionOpentingModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public TestEntity(Session session) + : base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage.AsyncSession +{ + public class AsyncSessionOpeningTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + [Test] + public async Task Test01() + { + var session = await Domain.OpenSessionAsync(); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + + await TestSession(session); + } + + [Test] + public async Task Test02() + { + var canellationTokenSource = new CancellationTokenSource(); + var session = await Domain.OpenSessionAsync(canellationTokenSource.Token); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test03() + { + var canellationTokenSource = new CancellationTokenSource(); + canellationTokenSource.Cancel(); + + Session session = null; + try { + session = await Domain.OpenSessionAsync(canellationTokenSource.Token); + } + catch (OperationCanceledException exception) { + Assert.That(session, Is.Null); + } + } + + [Test] + public async Task Test04() + { + var session = await Domain.OpenSessionAsync(SessionType.Default); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test05() + { + var session = await Domain.OpenSessionAsync(SessionType.System); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test06() + { + var session = await Domain.OpenSessionAsync(SessionType.KeyGenerator); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test07() + { + var session = await Domain.OpenSessionAsync(SessionType.Service); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test08() + { + var ctSource = new CancellationTokenSource(); + ctSource.Cancel(); + + Session session = null; + Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.Default, ctSource.Token)); + Assert.That(session, Is.Null); + } + + [Test] + public async Task Test09() + { + var ctSource = new CancellationTokenSource(); + ctSource.Cancel(); + + Session session = null; + Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.KeyGenerator, ctSource.Token)); + Assert.That(session, Is.Null); + } + + [Test] + public async Task Test10() + { + var ctSource = new CancellationTokenSource(); + ctSource.Cancel(); + + Session session = null; + Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.System, ctSource.Token)); + Assert.That(session, Is.Null); + } + + [Test] + public async Task Test11() + { + var ctSource = new CancellationTokenSource(); + ctSource.Cancel(); + + Session session = null; + Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(SessionType.Service, ctSource.Token)); + Assert.That(session, Is.Null); + } + + [Test] + public async Task Test12() + { + var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); + var session = await Domain.OpenSessionAsync(sessionConfiguration); + Assert.That(session, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test13() + { + var sessionConfiguration = new SessionConfiguration(SessionOptions.Default | SessionOptions.AutoActivation); + var session = await Domain.OpenSessionAsync(sessionConfiguration, CancellationToken.None).ConfigureAwait(false); + Assert.That(session, Is.Not.Null); + Assert.That(Session.Current, Is.Not.Null); + + await TestSession(session).ConfigureAwait(false); + } + + [Test] + public async Task Test14() + { + var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); + var session = await Domain.OpenSessionAsync(sessionConfiguration); + Assert.That(session, Is.Not.Null); + await TestSession(session); + } + + [Test] + public async Task Test15() + { + var ctSource = new CancellationTokenSource(); + ctSource.Cancel(); + var sessionConfiguration = new SessionConfiguration(SessionOptions.Default); + + Session session = null; + Assert.ThrowsAsync(async () => session = await Domain.OpenSessionAsync(sessionConfiguration, ctSource.Token)); + Assert.That(session, Is.Null); + } + + [Test] + public async Task Test28() + { + var session = await Domain.OpenSessionAsync(); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + } + + [Test] + public async Task Test29() + { + var session = await Domain.OpenSessionAsync(); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + } + + [Test] + public async Task Test30() + { + var session = await Domain.OpenSessionAsync(); + Assert.That(session, Is.Not.Null); + var handler = session.Handler as SqlSessionHandler; + Assert.That(handler, Is.Not.Null); + } + + private async Task TestSession(Session session) + { + await Task.Run(() => + { + using (session.Activate()) + using (var transacion = session.OpenTransaction()) + { + Assert.That(Session.Current, Is.Not.Null); + Assert.That(Session.Current, Is.EqualTo(session)); + var entity = new TestEntity(session); + session.SaveChanges(); + session.Query.All().First(); + entity.Remove(); + session.SaveChanges(); + } + }); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/BatchingTest.cs b/Orm/Xtensive.Orm.Tests/Storage/BatchingTest.cs index 54bb2d0a6c..b5507c976a 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/BatchingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/BatchingTest.cs @@ -1,146 +1,146 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.18 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.Storage.BatchingTestModel; - -namespace Xtensive.Orm.Tests.Storage.BatchingTestModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public int SomeIntField { get; set; } - - [Field] - public int BatchSize { get; set; } - } - - public class CommandCounter - { - public int CountedCommands { get; private set; } - - public IDisposable Attach(Session session) - { - session.Events.DbCommandExecuted += DbCommandExecutedHandler; - return new Disposable( - (disposing) => { - session.Events.DbCommandExecuted -= DbCommandExecutedHandler; - }); - } - - public void Reset() - { - CountedCommands = 0; - } - - private void DbCommandExecutedHandler(object sender, DbCommandEventArgs e) - { - CountedCommands++; - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [Serializable] - public class BatchingTest : AutoBuildTest - { - private const int TotalEntities = 10; - - [Test] - public void BatchSize0Test() - { - RunTest(0); - } - - [Test] - public void BatchSize1Test() - { - RunTest(1); - } - - [Test] - public void BatchSize2Test() - { - RunTest(2); - } - - [Test] - public void BatchSize100Test() - { - RunTest(100); - } - - [Test] - public void BatchSizeNegativeTest() - { - RunTest(-666); // Heil, satan ]:-> - } - - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Batches); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - private int GetExpectedNumberOfBatches(int batchSize) - { - var size = (batchSize < 1) ? 1 : batchSize; - return (int)Math.Ceiling((decimal)TotalEntities / size); - } - - private void RunTest(int batchSize) - { - var expectedNumberOfBatches = GetExpectedNumberOfBatches(batchSize); - var counter = new CommandCounter(); - using (var session = Domain.OpenSession(new SessionConfiguration {BatchSize = batchSize, Options = SessionOptions.ServerProfile | SessionOptions.AutoActivation})) { - using (var transcation = session.OpenTransaction()) { - for (int i = 0; i < TotalEntities; i++) { - new TestEntity {SomeIntField = i, BatchSize = batchSize}; - } - using (counter.Attach(session)) { - session.SaveChanges(); - } - Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); - counter.Reset(); - transcation.Complete(); - } - using (session.OpenTransaction()) { - session.Query.All().Where(e => e.BatchSize==batchSize).ForEach(te => te.SomeIntField++); - using (counter.Attach(session)) { - session.SaveChanges(); - } - Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); - counter.Reset(); - } - using (session.OpenTransaction()) { - session.Query.All().Where(e => e.BatchSize==batchSize).ForEach(te => te.Remove()); - using (counter.Attach(session)) { - session.SaveChanges(); - } - Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); - counter.Reset(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.18 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Storage.BatchingTestModel; + +namespace Xtensive.Orm.Tests.Storage.BatchingTestModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public int SomeIntField { get; set; } + + [Field] + public int BatchSize { get; set; } + } + + public class CommandCounter + { + public int CountedCommands { get; private set; } + + public IDisposable Attach(Session session) + { + session.Events.DbCommandExecuted += DbCommandExecutedHandler; + return new Disposable( + (disposing) => { + session.Events.DbCommandExecuted -= DbCommandExecutedHandler; + }); + } + + public void Reset() + { + CountedCommands = 0; + } + + private void DbCommandExecutedHandler(object sender, DbCommandEventArgs e) + { + CountedCommands++; + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [Serializable] + public class BatchingTest : AutoBuildTest + { + private const int TotalEntities = 10; + + [Test] + public void BatchSize0Test() + { + RunTest(0); + } + + [Test] + public void BatchSize1Test() + { + RunTest(1); + } + + [Test] + public void BatchSize2Test() + { + RunTest(2); + } + + [Test] + public void BatchSize100Test() + { + RunTest(100); + } + + [Test] + public void BatchSizeNegativeTest() + { + RunTest(-666); // Heil, satan ]:-> + } + + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.Batches); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + private int GetExpectedNumberOfBatches(int batchSize) + { + var size = (batchSize < 1) ? 1 : batchSize; + return (int)Math.Ceiling((decimal)TotalEntities / size); + } + + private void RunTest(int batchSize) + { + var expectedNumberOfBatches = GetExpectedNumberOfBatches(batchSize); + var counter = new CommandCounter(); + using (var session = Domain.OpenSession(new SessionConfiguration {BatchSize = batchSize, Options = SessionOptions.ServerProfile | SessionOptions.AutoActivation})) { + using (var transcation = session.OpenTransaction()) { + for (int i = 0; i < TotalEntities; i++) { + new TestEntity {SomeIntField = i, BatchSize = batchSize}; + } + using (counter.Attach(session)) { + session.SaveChanges(); + } + Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); + counter.Reset(); + transcation.Complete(); + } + using (session.OpenTransaction()) { + session.Query.All().Where(e => e.BatchSize==batchSize).ForEach(te => te.SomeIntField++); + using (counter.Attach(session)) { + session.SaveChanges(); + } + Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); + counter.Reset(); + } + using (session.OpenTransaction()) { + session.Query.All().Where(e => e.BatchSize==batchSize).ForEach(te => te.Remove()); + using (counter.Attach(session)) { + session.SaveChanges(); + } + Assert.That(counter.CountedCommands, Is.EqualTo(expectedNumberOfBatches)); + counter.Reset(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/BatchingWhenValidateEntityVersionsIsEnabledTest.cs b/Orm/Xtensive.Orm.Tests/Storage/BatchingWhenValidateEntityVersionsIsEnabledTest.cs index 7c2e895565..17df103a09 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/BatchingWhenValidateEntityVersionsIsEnabledTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/BatchingWhenValidateEntityVersionsIsEnabledTest.cs @@ -1,173 +1,173 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.12.19 - -using System; -using System.Diagnostics; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using model = Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTestModel; - -namespace Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTestModel -{ - [HierarchyRoot] - public class Store : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public EntitySet StoredBooks { get; set; } - } - - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field] - public EntitySet Authors { get; set; } - - [Field] - [Association(PairTo = "StoredBooks")] - public EntitySet Stores { get; set; } - } - - [HierarchyRoot] - public class Author : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 50)] - public string FirstName { get; set; } - - [Field(Length = 50)] - public string LastName { get; set; } - - [Field] - [Association(PairTo = "Authors")] - public EntitySet Books { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTest -{ - [TestFixture] - public class BatchingWhenValidateEntityVersionsIsEnabledTest : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Batches); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = DomainConfigurationFactory.Create(); - var defaultSession = configuration.Sessions.Default; - defaultSession.Options = defaultSession.Options | SessionOptions.ValidateEntityVersions; - configuration.Types.Register(typeof (model.Book).Assembly, typeof (model.Book).Namespace); - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var author = new model.Author { - FirstName = "William", - LastName = "Shakespeare" - }; - var store = new model.Store {Name = "Store"}; - new model.Store {Name = "RemovedStore"}; - var book = new model.Book {Title = "Romeo and Juliet"}; - book.Authors.Add(author); - book.Stores.Add(store); - transaction.Complete(); - } - } - - [Test] - public void Test01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var store = session.Query.All().Single(el => el.Name=="Store"); - var book = session.Query.All().Single(el => el.Title=="Romeo and Juliet"); - var newBook = new model.Book {Title = "Hamlet"}; - newBook.Authors.Add(session.Query.All().Single()); - newBook.Stores.Add(store); - var newStore = new model.Store {Name = "AnotherStore"}; - var oldBookStore = book.Stores.Single(el => el.Name=="Store"); - oldBookStore.Name = "RenamedStore"; - newStore.Remove(); - session.SaveChanges(); - } - } - - [Test] - public void Test02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var store1 = new model.Store {Name = "store1"}; - var store2 = new model.Store {Name = "store2"}; - var store3 = new model.Store {Name = "store3"}; - store1.Remove(); - store2.Remove(); - store3.Remove(); - session.SaveChanges(); - } - } - - [Test] - public void Test03() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var store1 = new model.Store {Name = "store1"}; - var store2 = new model.Store {Name = "store2"}; - var store3 = new model.Store {Name = "store3"}; - transaction.Complete(); - } - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var stores = session.Query.All().Where(el => el.Name.StartsWith("store")).ToList(); - foreach (var store in stores) { - store.Name += "Changed"; - } - session.SaveChanges(); - } - } - - [Test] - public void Test04() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var storeForRemove = session.Query.All().Single(el => el.Name=="RemovedStore"); - var storeForUpgrade = session.Query.All().Single(el => el.Name=="Store"); - var author = new model.Author() {LastName = "LastName", FirstName = "FirstName"}; - var book = new model.Book() {Title = "The book withot title" }; - book.Stores.Add(storeForUpgrade); - book.Authors.Add(author); - storeForUpgrade.Name = "UpgradedStore"; - storeForRemove.Remove(); - var allStores = session.Query.All().ToList(); - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.12.19 + +using System; +using System.Diagnostics; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using model = Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTestModel; + +namespace Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTestModel +{ + [HierarchyRoot] + public class Store : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public EntitySet StoredBooks { get; set; } + } + + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field] + public EntitySet Authors { get; set; } + + [Field] + [Association(PairTo = "StoredBooks")] + public EntitySet Stores { get; set; } + } + + [HierarchyRoot] + public class Author : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 50)] + public string FirstName { get; set; } + + [Field(Length = 50)] + public string LastName { get; set; } + + [Field] + [Association(PairTo = "Authors")] + public EntitySet Books { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Storage.BatchingWhenValidateEntityVersionsIsEnabledTest +{ + [TestFixture] + public class BatchingWhenValidateEntityVersionsIsEnabledTest : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.AllFeaturesSupported(ProviderFeatures.Batches); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = DomainConfigurationFactory.Create(); + var defaultSession = configuration.Sessions.Default; + defaultSession.Options = defaultSession.Options | SessionOptions.ValidateEntityVersions; + configuration.Types.Register(typeof (model.Book).Assembly, typeof (model.Book).Namespace); + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var author = new model.Author { + FirstName = "William", + LastName = "Shakespeare" + }; + var store = new model.Store {Name = "Store"}; + new model.Store {Name = "RemovedStore"}; + var book = new model.Book {Title = "Romeo and Juliet"}; + book.Authors.Add(author); + book.Stores.Add(store); + transaction.Complete(); + } + } + + [Test] + public void Test01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var store = session.Query.All().Single(el => el.Name=="Store"); + var book = session.Query.All().Single(el => el.Title=="Romeo and Juliet"); + var newBook = new model.Book {Title = "Hamlet"}; + newBook.Authors.Add(session.Query.All().Single()); + newBook.Stores.Add(store); + var newStore = new model.Store {Name = "AnotherStore"}; + var oldBookStore = book.Stores.Single(el => el.Name=="Store"); + oldBookStore.Name = "RenamedStore"; + newStore.Remove(); + session.SaveChanges(); + } + } + + [Test] + public void Test02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var store1 = new model.Store {Name = "store1"}; + var store2 = new model.Store {Name = "store2"}; + var store3 = new model.Store {Name = "store3"}; + store1.Remove(); + store2.Remove(); + store3.Remove(); + session.SaveChanges(); + } + } + + [Test] + public void Test03() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var store1 = new model.Store {Name = "store1"}; + var store2 = new model.Store {Name = "store2"}; + var store3 = new model.Store {Name = "store3"}; + transaction.Complete(); + } + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var stores = session.Query.All().Where(el => el.Name.StartsWith("store")).ToList(); + foreach (var store in stores) { + store.Name += "Changed"; + } + session.SaveChanges(); + } + } + + [Test] + public void Test04() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var storeForRemove = session.Query.All().Single(el => el.Name=="RemovedStore"); + var storeForUpgrade = session.Query.All().Single(el => el.Name=="Store"); + var author = new model.Author() {LastName = "LastName", FirstName = "FirstName"}; + var book = new model.Book() {Title = "The book withot title" }; + book.Stores.Add(storeForUpgrade); + book.Authors.Add(author); + storeForUpgrade.Name = "UpgradedStore"; + storeForRemove.Remove(); + var allStores = session.Query.All().ToList(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/ByteFieldStorageTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ByteFieldStorageTest.cs index 97ab8994e1..83099f9121 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ByteFieldStorageTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ByteFieldStorageTest.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.12.17 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.Storage.ByteFieldStorageTestModel; - -namespace Xtensive.Orm.Tests.Storage.ByteFieldStorageTestModel -{ - [HierarchyRoot] - public class BlobEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public byte[] BlobData { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class ByteFieldStorageTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (BlobEntity).Assembly, typeof (BlobEntity).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var blobData = new byte[] {0, 1}; - - using (Domain.OpenSession()) { - using (var transactionScope = Session.Current.OpenTransaction()) { - var blob = new BlobEntity(); - - blob.BlobData = blobData; - - transactionScope.Complete(); - } - } - - using (Domain.OpenSession()) { - using (var transactionScope = Session.Current.OpenTransaction()) { - var blob = Query.All().Single(); - Assert.AreEqual(blobData.Length, blob.BlobData.Length); - Assert.AreEqual(blobData, blob.BlobData); - transactionScope.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.12.17 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.Storage.ByteFieldStorageTestModel; + +namespace Xtensive.Orm.Tests.Storage.ByteFieldStorageTestModel +{ + [HierarchyRoot] + public class BlobEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public byte[] BlobData { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class ByteFieldStorageTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (BlobEntity).Assembly, typeof (BlobEntity).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var blobData = new byte[] {0, 1}; + + using (Domain.OpenSession()) { + using (var transactionScope = Session.Current.OpenTransaction()) { + var blob = new BlobEntity(); + + blob.BlobData = blobData; + + transactionScope.Complete(); + } + } + + using (Domain.OpenSession()) { + using (var transactionScope = Session.Current.OpenTransaction()) { + var blob = Query.All().Single(); + Assert.AreEqual(blobData.Length, blob.BlobData.Length); + Assert.AreEqual(blobData, blob.BlobData); + transactionScope.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CascadeRemoveTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CascadeRemoveTest.cs index 622c33467a..f3db11399f 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CascadeRemoveTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CascadeRemoveTest.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.03.24 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.CascadeRemoveTestModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace CascadeRemoveTestModel - { - [HierarchyRoot] - public class Bank : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field, Association(PairTo = "Bank", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Branches { get; private set; } - } - - [HierarchyRoot] - public class BankBranch : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Bank Bank { get; set; } - - [Field, Association(PairTo = "Branch", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Accounts { get; private set; } - } - - [HierarchyRoot] - public class BankAccount : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public BankBranch Branch { get; set; } - } - } - - [TestFixture] - public class CascadeRemoveTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Bank).Assembly, typeof (Bank).Namespace); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var bank = new Bank(); - var branch = new BankBranch(); - var account = new BankAccount(); - bank.Branches.Add(branch); - branch.Accounts.Add(account); - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var bank = session.Query.All().Single(); - bank.Remove(); - tx.Complete(); - } - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.03.24 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.CascadeRemoveTestModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace CascadeRemoveTestModel + { + [HierarchyRoot] + public class Bank : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field, Association(PairTo = "Bank", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Branches { get; private set; } + } + + [HierarchyRoot] + public class BankBranch : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Bank Bank { get; set; } + + [Field, Association(PairTo = "Branch", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Accounts { get; private set; } + } + + [HierarchyRoot] + public class BankAccount : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public BankBranch Branch { get; set; } + } + } + + [TestFixture] + public class CascadeRemoveTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Bank).Assembly, typeof (Bank).Namespace); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var bank = new Bank(); + var branch = new BankBranch(); + var account = new BankAccount(); + bank.Branches.Add(branch); + branch.Accounts.Add(account); + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var bank = session.Query.All().Single(); + bank.Remove(); + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ChangedPersistOrderTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ChangedPersistOrderTest.cs index cc4bc74fe3..678852261e 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ChangedPersistOrderTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ChangedPersistOrderTest.cs @@ -1,93 +1,93 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using model = Xtensive.Orm.Tests.Storage.ChangedPersistOrderTestModel; - -namespace Xtensive.Orm.Tests.Storage.ChangedPersistOrderTestModel -{ - [HierarchyRoot] - public class Worker : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public EntitySet EmploymentContracts { get; set; } - } - - [HierarchyRoot] - [Index("ContractNumber", Unique = true)] - public class EmploymentContract : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 10)] - public string ContractNumber { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public DateTime TakesEffectFrom { get; set; } - - [Field] - public DateTime ContractEnds { get; set; } - - [Field] - [Association(PairTo = "EmploymentContracts")] - public Worker Worker { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.ChangedPersistOrderTest -{ - [TestFixture] - public class ChangedPersistOrderTest : AutoBuildTest - { - [Test] - public void MainTest() - { - FillData(ForeignKeyMode.None); - var domain = BuildDomain(ForeignKeyMode.None, DomainUpgradeMode.Perform); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - var contract = session.Query.All().First(el => el.ContractNumber == "w123456"); - var worker = contract.Worker; - contract.Remove(); - var newContract = new model.EmploymentContract { ContractNumber = "w123456", CreationDate = DateTime.Now, TakesEffectFrom = DateTime.Now.Date, Worker = worker }; - transaction.Complete(); - } - } - - private void FillData(ForeignKeyMode mode) - { - var domain = BuildDomain(mode, DomainUpgradeMode.Recreate); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) - { - var worker = new model.Worker { FirstName = "John", LastName = "Smith" }; - new model.EmploymentContract { ContractNumber = "w123456", CreationDate = DateTime.Now, TakesEffectFrom = DateTime.Now.Date }; - transaction.Complete(); - } - } - - private Domain BuildDomain(ForeignKeyMode foreignKeyMode, DomainUpgradeMode upgradeMode) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof(model.EmploymentContract).Assembly, typeof(model.EmploymentContract).Namespace); - configuration.UpgradeMode = upgradeMode; - configuration.ForeignKeyMode = foreignKeyMode; - return Domain.Build(configuration); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using model = Xtensive.Orm.Tests.Storage.ChangedPersistOrderTestModel; + +namespace Xtensive.Orm.Tests.Storage.ChangedPersistOrderTestModel +{ + [HierarchyRoot] + public class Worker : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public EntitySet EmploymentContracts { get; set; } + } + + [HierarchyRoot] + [Index("ContractNumber", Unique = true)] + public class EmploymentContract : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 10)] + public string ContractNumber { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public DateTime TakesEffectFrom { get; set; } + + [Field] + public DateTime ContractEnds { get; set; } + + [Field] + [Association(PairTo = "EmploymentContracts")] + public Worker Worker { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.ChangedPersistOrderTest +{ + [TestFixture] + public class ChangedPersistOrderTest : AutoBuildTest + { + [Test] + public void MainTest() + { + FillData(ForeignKeyMode.None); + var domain = BuildDomain(ForeignKeyMode.None, DomainUpgradeMode.Perform); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + var contract = session.Query.All().First(el => el.ContractNumber == "w123456"); + var worker = contract.Worker; + contract.Remove(); + var newContract = new model.EmploymentContract { ContractNumber = "w123456", CreationDate = DateTime.Now, TakesEffectFrom = DateTime.Now.Date, Worker = worker }; + transaction.Complete(); + } + } + + private void FillData(ForeignKeyMode mode) + { + var domain = BuildDomain(mode, DomainUpgradeMode.Recreate); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) + { + var worker = new model.Worker { FirstName = "John", LastName = "Smith" }; + new model.EmploymentContract { ContractNumber = "w123456", CreationDate = DateTime.Now, TakesEffectFrom = DateTime.Now.Date }; + transaction.Complete(); + } + } + + private Domain BuildDomain(ForeignKeyMode foreignKeyMode, DomainUpgradeMode upgradeMode) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof(model.EmploymentContract).Assembly, typeof(model.EmploymentContract).Namespace); + configuration.UpgradeMode = upgradeMode; + configuration.ForeignKeyMode = foreignKeyMode; + return Domain.Build(configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ClientProfileReferentialIntegrityTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ClientProfileReferentialIntegrityTest.cs index f78bf5072b..b6235c8a45 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ClientProfileReferentialIntegrityTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ClientProfileReferentialIntegrityTest.cs @@ -1,225 +1,225 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.02.12 - -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.ReferentialIntegrityModel; - -namespace Xtensive.Orm.Tests.Storage -{ - public class ClientProfileReferentialIntegrityTest : AutoBuildTest - { - private readonly SessionConfiguration clientProfileConfiguration = new SessionConfiguration(SessionOptions.ClientProfile); - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - A a = new A(); - a.B = new B(); - a.C = new C(); - Session.Current.SaveChanges(); - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(1, session.Query.All().Count()); - Assert.AreEqual(1, session.Query.All().Count()); - - a.B.Remove(); - Assert.AreEqual(null, a.B); - AssertEx.Throws(a.C.Remove); - a.Remove(); - Session.Current.SaveChanges(); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - - Master m = new Master(); - m.OneToMany.Add(new Slave()); - m.OneToMany.Add(new Slave()); - m.OneToMany.Add(new Slave()); - Assert.AreEqual(3, m.OneToMany.Count); - Assert.AreEqual(3, ReferenceFinder.GetReferencesTo(m, m.TypeInfo.Fields["OneToMany"].Associations.Last().Reversed).Count()); - ((IEnumerable)m.OneToMany).First().Remove(); - Assert.AreEqual(2, m.OneToMany.Count); - - m.ZeroToMany.Add(new Slave()); - m.ZeroToMany.Add(new Slave()); - m.ZeroToMany.Add(new Slave()); - Assert.AreEqual(3, m.ZeroToMany.Count); - ((IEnumerable)m.ZeroToMany).First().Remove(); - Assert.AreEqual(2, m.ZeroToMany.Count); - - m.ManyToMany.Add(new Slave()); - m.ManyToMany.Add(new Slave()); - m.ManyToMany.Add(new Slave()); - Assert.AreEqual(3, m.ManyToMany.Count); - ((IEnumerable)m.ManyToMany).First().Remove(); - Assert.AreEqual(2, m.ManyToMany.Count); - - session.SaveChanges(); - } - } - - [Test] - public void RemoveWithException() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - A a; - C c; - using (var t = session.OpenTransaction()) { - a = new A(); - c = new C(); - a.C = c; - TestLog.Debug(a.Key.ToString()); - TestLog.Debug(c.Key.ToString()); - a.Remove(); - Session.Current.SaveChanges(); - } - } - } - - [Test] - public void DeletedEntityAddToReference() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - A a = new A(); - B b = new B(); - b.Remove(); - AssertEx.ThrowsInvalidOperationException(() => a.B = b); - } - } - - [Test] - public void DeletedEntityChangeFields() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - A a = new A(); - a.Remove(); - AssertEx.ThrowsInvalidOperationException(() => a.Name = "newName"); - } - } - - [Test] - public void DeepCascadeRemoveTest() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - var c = new Container(); - c.Package1 = new Package(); - c.Package2 = new Package(); - var item = new PackageItem(); - c.Package1.Items.Add(item); - c.Package2.Items.Add(item); - - c.Remove(); - - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - } - } - - [Test] - public void CascadeRemoveTest() - { - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - var c = new Container(); - c.Package1 = new Package(); - var item = new PackageItem(); - c.Package1.Items.Add(item); - - c.Remove(); - - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - } - } - - [Test] - [Explicit, Category("Performance")] - public void RemovePerformanceTest() - { - const int containersCount = 100; - const int itemCount = 100; - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - using (var t = session.OpenTransaction()) { - for (int i = 0; i < containersCount; i++) { - var c = new Container { Package1 = new Package(), Package2 = new Package() }; - for (int j = 0; j < itemCount; j++) { - c.Package1.Items.Add(new PackageItem()); - c.Package2.Items.Add(new PackageItem()); - } - } - session.SaveChanges(); - t.Complete(); - } - - using (var t = session.OpenTransaction()) { - const int operationCount = containersCount * 3 + containersCount * itemCount * 2; - using (new Measurement("Remove...", operationCount)) { - var containers = session.Query.All(); - foreach (var container in containers) - container.Remove(); - session.SaveChanges(); - } - - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - t.Complete(); - } - } - } - - [Test] - [Explicit, Category("Performance")] - public void SessionRemovePerformanceTest() - { - const int containersCount = 100; - const int itemCount = 100; - using (var session = Domain.OpenSession(clientProfileConfiguration)) - using (session.Activate()) { - for (int i = 0; i < containersCount; i++) { - var c = new Container { Package1 = new Package(), Package2 = new Package() }; - for (int j = 0; j < itemCount; j++) { - c.Package1.Items.Add(new PackageItem()); - c.Package2.Items.Add(new PackageItem()); - } - } - session.SaveChanges(); - - using (var t = session.OpenTransaction()) { - const int operationCount = containersCount * 3 + containersCount * itemCount * 2; - using (new Measurement("Remove...", operationCount)) { - session.Remove(session.Query.All()); - session.SaveChanges(); - } - - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - Assert.AreEqual(0, session.Query.All().Count()); - t.Complete(); - } - } - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.ReferentialIntegrityModel"); - return config; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.02.12 + +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.ReferentialIntegrityModel; + +namespace Xtensive.Orm.Tests.Storage +{ + public class ClientProfileReferentialIntegrityTest : AutoBuildTest + { + private readonly SessionConfiguration clientProfileConfiguration = new SessionConfiguration(SessionOptions.ClientProfile); + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + A a = new A(); + a.B = new B(); + a.C = new C(); + Session.Current.SaveChanges(); + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(1, session.Query.All().Count()); + Assert.AreEqual(1, session.Query.All().Count()); + + a.B.Remove(); + Assert.AreEqual(null, a.B); + AssertEx.Throws(a.C.Remove); + a.Remove(); + Session.Current.SaveChanges(); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + + Master m = new Master(); + m.OneToMany.Add(new Slave()); + m.OneToMany.Add(new Slave()); + m.OneToMany.Add(new Slave()); + Assert.AreEqual(3, m.OneToMany.Count); + Assert.AreEqual(3, ReferenceFinder.GetReferencesTo(m, m.TypeInfo.Fields["OneToMany"].Associations.Last().Reversed).Count()); + ((IEnumerable)m.OneToMany).First().Remove(); + Assert.AreEqual(2, m.OneToMany.Count); + + m.ZeroToMany.Add(new Slave()); + m.ZeroToMany.Add(new Slave()); + m.ZeroToMany.Add(new Slave()); + Assert.AreEqual(3, m.ZeroToMany.Count); + ((IEnumerable)m.ZeroToMany).First().Remove(); + Assert.AreEqual(2, m.ZeroToMany.Count); + + m.ManyToMany.Add(new Slave()); + m.ManyToMany.Add(new Slave()); + m.ManyToMany.Add(new Slave()); + Assert.AreEqual(3, m.ManyToMany.Count); + ((IEnumerable)m.ManyToMany).First().Remove(); + Assert.AreEqual(2, m.ManyToMany.Count); + + session.SaveChanges(); + } + } + + [Test] + public void RemoveWithException() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + A a; + C c; + using (var t = session.OpenTransaction()) { + a = new A(); + c = new C(); + a.C = c; + TestLog.Debug(a.Key.ToString()); + TestLog.Debug(c.Key.ToString()); + a.Remove(); + Session.Current.SaveChanges(); + } + } + } + + [Test] + public void DeletedEntityAddToReference() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + A a = new A(); + B b = new B(); + b.Remove(); + AssertEx.ThrowsInvalidOperationException(() => a.B = b); + } + } + + [Test] + public void DeletedEntityChangeFields() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + A a = new A(); + a.Remove(); + AssertEx.ThrowsInvalidOperationException(() => a.Name = "newName"); + } + } + + [Test] + public void DeepCascadeRemoveTest() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + var c = new Container(); + c.Package1 = new Package(); + c.Package2 = new Package(); + var item = new PackageItem(); + c.Package1.Items.Add(item); + c.Package2.Items.Add(item); + + c.Remove(); + + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + } + } + + [Test] + public void CascadeRemoveTest() + { + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + var c = new Container(); + c.Package1 = new Package(); + var item = new PackageItem(); + c.Package1.Items.Add(item); + + c.Remove(); + + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + } + } + + [Test] + [Explicit, Category("Performance")] + public void RemovePerformanceTest() + { + const int containersCount = 100; + const int itemCount = 100; + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + using (var t = session.OpenTransaction()) { + for (int i = 0; i < containersCount; i++) { + var c = new Container { Package1 = new Package(), Package2 = new Package() }; + for (int j = 0; j < itemCount; j++) { + c.Package1.Items.Add(new PackageItem()); + c.Package2.Items.Add(new PackageItem()); + } + } + session.SaveChanges(); + t.Complete(); + } + + using (var t = session.OpenTransaction()) { + const int operationCount = containersCount * 3 + containersCount * itemCount * 2; + using (new Measurement("Remove...", operationCount)) { + var containers = session.Query.All(); + foreach (var container in containers) + container.Remove(); + session.SaveChanges(); + } + + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + t.Complete(); + } + } + } + + [Test] + [Explicit, Category("Performance")] + public void SessionRemovePerformanceTest() + { + const int containersCount = 100; + const int itemCount = 100; + using (var session = Domain.OpenSession(clientProfileConfiguration)) + using (session.Activate()) { + for (int i = 0; i < containersCount; i++) { + var c = new Container { Package1 = new Package(), Package2 = new Package() }; + for (int j = 0; j < itemCount; j++) { + c.Package1.Items.Add(new PackageItem()); + c.Package2.Items.Add(new PackageItem()); + } + } + session.SaveChanges(); + + using (var t = session.OpenTransaction()) { + const int operationCount = containersCount * 3 + containersCount * itemCount * 2; + using (new Measurement("Remove...", operationCount)) { + session.Remove(session.Query.All()); + session.SaveChanges(); + } + + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + Assert.AreEqual(0, session.Query.All().Count()); + t.Complete(); + } + } + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.ReferentialIntegrityModel"); + return config; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/ClientProfileSessionTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ClientProfileSessionTest.cs index d28f4f5009..5d461bae70 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ClientProfileSessionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ClientProfileSessionTest.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.09.14 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.UI.Model; - -namespace Xtensive.Orm.Tests.UI -{ - namespace Model - { - [HierarchyRoot] - public class Author : Entity - { - [Field,Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - public Author(Session session) : base(session) - { - } - } - } - - [TestFixture] - public class ClientProfileSessionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(Author).Assembly, typeof(Author).Namespace); - return configuration; - } - - private static void AssertNoTransaction(Session session) - { - var directSql = session.Services.Demand(); - Assert.That(directSql.Transaction, Is.Null); - } - - [Test] - public void CreateTest() - { - var config = Domain.Configuration.Sessions.Default.Clone(); - config.Options = SessionOptions.ClientProfile; - using (var session = Domain.OpenSession(config)) { - new Author(session) {Name = "Alex"}; - AssertNoTransaction(session); - } - using (var session = Domain.OpenSession(config)) { - Assert.IsFalse(session.Query.All().Any(a => a.Name == "Alex")); - AssertNoTransaction(session); - } - using (var session = Domain.OpenSession(config)) { - new Author(session) { Name = "Alex" }; - session.SaveChanges(); - Assert.IsTrue(session.Query.All().Any(a => a.Name == "Alex")); - AssertNoTransaction(session); - } - } - - [Test] - public void QueryTest() - { - var config = Domain.Configuration.Sessions.Default.Clone(); - config.Options = SessionOptions.ClientProfile; - using (var session = Domain.OpenSession(config)) { - session.Query.All().ToList(); - } - using (var session = Domain.OpenSession(config)) { - new Author(session) { Name = "Alex" }; - session.SaveChanges(); - var authors = session.Query.All().Where(a => a.Name == "Alex").ToList(); - Assert.Greater(authors.Count, 0); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.09.14 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.UI.Model; + +namespace Xtensive.Orm.Tests.UI +{ + namespace Model + { + [HierarchyRoot] + public class Author : Entity + { + [Field,Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + public Author(Session session) : base(session) + { + } + } + } + + [TestFixture] + public class ClientProfileSessionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(Author).Assembly, typeof(Author).Namespace); + return configuration; + } + + private static void AssertNoTransaction(Session session) + { + var directSql = session.Services.Demand(); + Assert.That(directSql.Transaction, Is.Null); + } + + [Test] + public void CreateTest() + { + var config = Domain.Configuration.Sessions.Default.Clone(); + config.Options = SessionOptions.ClientProfile; + using (var session = Domain.OpenSession(config)) { + new Author(session) {Name = "Alex"}; + AssertNoTransaction(session); + } + using (var session = Domain.OpenSession(config)) { + Assert.IsFalse(session.Query.All().Any(a => a.Name == "Alex")); + AssertNoTransaction(session); + } + using (var session = Domain.OpenSession(config)) { + new Author(session) { Name = "Alex" }; + session.SaveChanges(); + Assert.IsTrue(session.Query.All().Any(a => a.Name == "Alex")); + AssertNoTransaction(session); + } + } + + [Test] + public void QueryTest() + { + var config = Domain.Configuration.Sessions.Default.Clone(); + config.Options = SessionOptions.ClientProfile; + using (var session = Domain.OpenSession(config)) { + session.Query.All().ToList(); + } + using (var session = Domain.OpenSession(config)) { + new Author(session) { Name = "Alex" }; + session.SaveChanges(); + var authors = session.Query.All().Where(a => a.Name == "Alex").ToList(); + Assert.Greater(authors.Count, 0); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ClosureParametersCachingTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ClosureParametersCachingTest.cs index ccb32f903f..de6a8f5ad0 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ClosureParametersCachingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ClosureParametersCachingTest.cs @@ -1,925 +1,925 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.10.26 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.ClosureParametersCachingTestModel; - -namespace Xtensive.Orm.Tests.Storage.ClosureParametersCachingTestModel -{ - #region Entityes - - [HierarchyRoot] - public class PaymentSplit : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - - [Field] - public Payment Payment { get; set; } - - [Field] - public Invoice Invoice { get; set; } - - [Field] - public int Order { get;set; } - - [Field(Precision = 19, Scale = 6)] - public decimal Amount { get; set; } - } - - [HierarchyRoot] - public class Payment : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - } - - [HierarchyRoot] - public class Invoice : Entity - { - [Field, Key] - public long Id { get; set; } - - [Field] - public bool Active { get; set; } - } - - #endregion - - public class BaseValueTypeTester - { - public class NestedValueTypeTester - { - private long privateField; - public long PublicField; - - public int PublicProperty { get; set; } - private int PrivateProperty { get; set; } - - public decimal TestPrivateField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==privateField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPrivateProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PrivateProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public NestedValueTypeTester(long privateFieldValue) - { - privateField = privateFieldValue; - } - - public NestedValueTypeTester(int privatePropertyValue) - { - PrivateProperty = privatePropertyValue; - } - } - - private long privateField; - public long PublicField; - - public int PublicProperty { get; set; } - private int PrivateProperty { get; set; } - - public decimal TestPrivateField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==privateField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPrivateProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PrivateProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public BaseValueTypeTester(long privateFieldValue) - { - privateField = privateFieldValue; - } - - public BaseValueTypeTester(int privatePropertyValue) - { - PrivateProperty = privatePropertyValue; - } - } - - public class InheritorValueTypeTester : BaseValueTypeTester - { - public static long StaticField; - - public decimal TestInheritedPublicField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestInheritedPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestStaticField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==StaticField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal[] TestForIndex(Session session) - { - decimal[] resultSums = new decimal[2]; - for (int i = 0; i < 2; i++) { - resultSums[i] = session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Order==i); - return result; - }) - .Sum(split => split.Amount); - } - - return resultSums; - } - - public decimal[] TestForeachItem(Session session) - { - decimal[] resultSums = new decimal[2]; - foreach (var item in Enumerable.Range(0, 2)) { - resultSums[item] = session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Order==item); - return result; - }) - .Sum(split => split.Amount); - } - - return resultSums; - } - - public decimal TestMethodParameter(Session session, long parameter) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==parameter); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestLocalVariable(Session session, long invoiceId) - { - var invoiceIdLocal = invoiceId; - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==invoiceIdLocal); - return result; - }) - .Sum(split => split.Amount); - } - - public InheritorValueTypeTester(long privateFieldValue) - : base(privateFieldValue) - { - } - - public InheritorValueTypeTester(int privatePropertyValue) - : base(privatePropertyValue) - { - } - } - - - public class BaseReferenceTypeTester - { - public class NestedReferenceTypeTester - { - private Invoice privateField; - public Invoice PublicField; - - public Invoice PublicProperty { get; set; } - private Invoice PrivateProperty { get; set; } - - public decimal TestPrivateField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==privateField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPrivateProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PrivateProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public NestedReferenceTypeTester(Invoice fieldAndPropertyValue) - { - privateField = fieldAndPropertyValue; - PrivateProperty = fieldAndPropertyValue; - } - } - - private Invoice privateField; - public Invoice PublicField; - - public Invoice PublicProperty { get; set; } - private Invoice PrivateProperty { get; set; } - - public decimal TestPrivateField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==privateField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicField(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPrivateProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PrivateProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public BaseReferenceTypeTester(Invoice fieldAndPropertyValue) - { - privateField = fieldAndPropertyValue; - PrivateProperty = fieldAndPropertyValue; - } - } - - public class InheritorReferenceTypeTester : BaseReferenceTypeTester - { - public decimal TestInheritedPublicField(Session session) - { - return session.Query.Execute(q => - { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestInheritedPublicProperty(Session session) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); - return result; - }) - .Sum(split => split.Amount); - } - - public decimal TestMethodParameter(Session session, Invoice parameter) - { - return session.Query.Execute(q => { - var result = q.All() - .Where(split => split.Active && split.Payment.Active && split.Invoice==parameter); - return result; - }) - .Sum(split => split.Amount); - } - - public InheritorReferenceTypeTester(Invoice fieldAndPropertyValue) - : base(fieldAndPropertyValue) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class ClosureParametersCachingTest : AutoBuildTest - { - private Pair idsPair; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Invoice).Assembly, typeof (Invoice).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoice1 = new Invoice(); - var invoice2 = new Invoice(); - new PaymentSplit { - Active = true, - Payment = new Payment { Active = true }, - Invoice = invoice1, - Order = 1, - Amount = 6.0m - }; - new PaymentSplit { - Active = true, - Payment = new Payment { Active = true }, - Invoice = invoice2, - Order = 0, - Amount = 16.0m - }; - - idsPair = new Pair((int)invoice1.Id, (int)invoice2.Id); - tx.Complete(); - } - } - - [Test] - public void LocalVariableClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tester = new InheritorValueTypeTester(-1); - - Domain.QueryCache.Clear(); - Assert.That(tester.TestLocalVariable(session, idsPair.Second), Is.EqualTo(16.0m)); - Assert.That(tester.TestLocalVariable(session, idsPair.First), Is.EqualTo(6.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void MethodValueParameterClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tester = new InheritorValueTypeTester(-1); - - Domain.QueryCache.Clear(); - Assert.That(tester.TestMethodParameter(session, idsPair.Second), Is.EqualTo(16.0m)); - Assert.That(tester.TestMethodParameter(session, idsPair.First), Is.EqualTo(6.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void MethodRefParameterClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - var tester = new InheritorReferenceTypeTester(null); - - Domain.QueryCache.Clear(); - Assert.That(tester.TestMethodParameter(session, invoices[1]), Is.EqualTo(16.0m)); - Assert.That(tester.TestMethodParameter(session, invoices[0]), Is.EqualTo(6.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void ForeachItemClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tester = new InheritorValueTypeTester(-1); - - Domain.QueryCache.Clear(); - var results = tester.TestForeachItem(session); - Assert.That(results.Length, Is.EqualTo(2)); - Assert.That(results[0], Is.EqualTo(16.0m)); - Assert.That(results[1], Is.EqualTo(6.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void ForIndexClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tester = new InheritorValueTypeTester(-1); - - Domain.QueryCache.Clear(); - var results = tester.TestForIndex(session); - Assert.That(results.Length, Is.EqualTo(2)); - Assert.That(results[0], Is.EqualTo(16.0m)); - Assert.That(results[1], Is.EqualTo(6.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void StaticFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var tester = new InheritorValueTypeTester(-1); - InheritorValueTypeTester.StaticField = idsPair.First; - - Domain.QueryCache.Clear(); - Assert.That(tester.TestStaticField(session), Is.EqualTo(6.0m)); - - InheritorValueTypeTester.StaticField = idsPair.Second; - Assert.That(tester.TestStaticField(session), Is.EqualTo(16.0m)); - - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PrivateValueFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; - var second = new BaseValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateField(session); - var secondResult = second.TestPrivateField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PublicValueFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) - { - var first = new BaseValueTypeTester((long)idsPair.First) { PublicField = idsPair.First }; - var second = new BaseValueTypeTester((long)idsPair.Second) { PublicField = idsPair.Second }; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicField(session); - var secondResult = second.TestPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PrivateValuePropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester(idsPair.First) { PublicProperty = idsPair.First }; - var second = new BaseValueTypeTester(idsPair.Second) { PublicProperty = idsPair.Second }; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateProperty(session); - var secondResult = second.TestPrivateProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PublicValuePropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester(idsPair.First) { PublicProperty = idsPair.First }; - var second = new BaseValueTypeTester(idsPair.Second) { PublicProperty = idsPair.Second }; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicProperty(session); - var secondResult = second.TestPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void InhertitedValueFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new InheritorValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; - var second = new InheritorValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestInheritedPublicField(session); - var secondResult = second.TestInheritedPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void InheritedValuePropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new InheritorValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; - var second = new InheritorValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestInheritedPublicProperty(session); - var secondResult = second.TestInheritedPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPrivateValueFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; - var second = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateField(session); - var secondResult = second.TestPrivateField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPublicValueFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; - var second = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicField(session); - var secondResult = second.TestPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPrivateValuePropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester.NestedValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; - var second = new BaseValueTypeTester.NestedValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateProperty(session); - var secondResult = second.TestPrivateProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPublicValuePropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var first = new BaseValueTypeTester.NestedValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; - var second = new BaseValueTypeTester.NestedValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicProperty(session); - var secondResult = second.TestPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PrivateRefFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; - var second = new BaseReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateField(session); - var secondResult = second.TestPrivateField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PublicRefFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; - var second = new BaseReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicField(session); - var secondResult = second.TestPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PrivateRefPropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; - var second = new BaseReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateProperty(session); - var secondResult = second.TestPrivateProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void PublicRefPropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; - var second = new BaseReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicProperty(session); - var secondResult = second.TestPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void InhertitedRefFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new InheritorReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; - var second = new InheritorReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestInheritedPublicField(session); - var secondResult = second.TestInheritedPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void InheritedRefPropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new InheritorReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; - var second = new InheritorReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestInheritedPublicProperty(session); - var secondResult = second.TestInheritedPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPrivateRefFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; - var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateField(session); - var secondResult = second.TestPrivateField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPublicRefFieldClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; - var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicField(session); - var secondResult = second.TestPublicField(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPrivateRefPropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; - var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPrivateProperty(session); - var secondResult = second.TestPrivateProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - - [Test] - public void NestedClassPublicRefPropertyClosureTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var invoices = session.Query.All().ToArray(); - - var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; - var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; - - Domain.QueryCache.Clear(); - var firstResult = first.TestPublicProperty(session); - var secondResult = second.TestPublicProperty(session); - Assert.That(firstResult, Is.EqualTo(6.0m)); - Assert.That(secondResult, Is.EqualTo(16.0m)); - Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); - } - } - } -} +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.10.26 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.ClosureParametersCachingTestModel; + +namespace Xtensive.Orm.Tests.Storage.ClosureParametersCachingTestModel +{ + #region Entityes + + [HierarchyRoot] + public class PaymentSplit : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + + [Field] + public Payment Payment { get; set; } + + [Field] + public Invoice Invoice { get; set; } + + [Field] + public int Order { get;set; } + + [Field(Precision = 19, Scale = 6)] + public decimal Amount { get; set; } + } + + [HierarchyRoot] + public class Payment : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + } + + [HierarchyRoot] + public class Invoice : Entity + { + [Field, Key] + public long Id { get; set; } + + [Field] + public bool Active { get; set; } + } + + #endregion + + public class BaseValueTypeTester + { + public class NestedValueTypeTester + { + private long privateField; + public long PublicField; + + public int PublicProperty { get; set; } + private int PrivateProperty { get; set; } + + public decimal TestPrivateField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==privateField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPrivateProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PrivateProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public NestedValueTypeTester(long privateFieldValue) + { + privateField = privateFieldValue; + } + + public NestedValueTypeTester(int privatePropertyValue) + { + PrivateProperty = privatePropertyValue; + } + } + + private long privateField; + public long PublicField; + + public int PublicProperty { get; set; } + private int PrivateProperty { get; set; } + + public decimal TestPrivateField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==privateField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPrivateProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PrivateProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public BaseValueTypeTester(long privateFieldValue) + { + privateField = privateFieldValue; + } + + public BaseValueTypeTester(int privatePropertyValue) + { + PrivateProperty = privatePropertyValue; + } + } + + public class InheritorValueTypeTester : BaseValueTypeTester + { + public static long StaticField; + + public decimal TestInheritedPublicField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestInheritedPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestStaticField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==StaticField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal[] TestForIndex(Session session) + { + decimal[] resultSums = new decimal[2]; + for (int i = 0; i < 2; i++) { + resultSums[i] = session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Order==i); + return result; + }) + .Sum(split => split.Amount); + } + + return resultSums; + } + + public decimal[] TestForeachItem(Session session) + { + decimal[] resultSums = new decimal[2]; + foreach (var item in Enumerable.Range(0, 2)) { + resultSums[item] = session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Order==item); + return result; + }) + .Sum(split => split.Amount); + } + + return resultSums; + } + + public decimal TestMethodParameter(Session session, long parameter) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==parameter); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestLocalVariable(Session session, long invoiceId) + { + var invoiceIdLocal = invoiceId; + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice.Id==invoiceIdLocal); + return result; + }) + .Sum(split => split.Amount); + } + + public InheritorValueTypeTester(long privateFieldValue) + : base(privateFieldValue) + { + } + + public InheritorValueTypeTester(int privatePropertyValue) + : base(privatePropertyValue) + { + } + } + + + public class BaseReferenceTypeTester + { + public class NestedReferenceTypeTester + { + private Invoice privateField; + public Invoice PublicField; + + public Invoice PublicProperty { get; set; } + private Invoice PrivateProperty { get; set; } + + public decimal TestPrivateField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==privateField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPrivateProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PrivateProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public NestedReferenceTypeTester(Invoice fieldAndPropertyValue) + { + privateField = fieldAndPropertyValue; + PrivateProperty = fieldAndPropertyValue; + } + } + + private Invoice privateField; + public Invoice PublicField; + + public Invoice PublicProperty { get; set; } + private Invoice PrivateProperty { get; set; } + + public decimal TestPrivateField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==privateField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicField(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPrivateProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PrivateProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public BaseReferenceTypeTester(Invoice fieldAndPropertyValue) + { + privateField = fieldAndPropertyValue; + PrivateProperty = fieldAndPropertyValue; + } + } + + public class InheritorReferenceTypeTester : BaseReferenceTypeTester + { + public decimal TestInheritedPublicField(Session session) + { + return session.Query.Execute(q => + { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicField); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestInheritedPublicProperty(Session session) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==PublicProperty); + return result; + }) + .Sum(split => split.Amount); + } + + public decimal TestMethodParameter(Session session, Invoice parameter) + { + return session.Query.Execute(q => { + var result = q.All() + .Where(split => split.Active && split.Payment.Active && split.Invoice==parameter); + return result; + }) + .Sum(split => split.Amount); + } + + public InheritorReferenceTypeTester(Invoice fieldAndPropertyValue) + : base(fieldAndPropertyValue) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class ClosureParametersCachingTest : AutoBuildTest + { + private Pair idsPair; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Invoice).Assembly, typeof (Invoice).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoice1 = new Invoice(); + var invoice2 = new Invoice(); + new PaymentSplit { + Active = true, + Payment = new Payment { Active = true }, + Invoice = invoice1, + Order = 1, + Amount = 6.0m + }; + new PaymentSplit { + Active = true, + Payment = new Payment { Active = true }, + Invoice = invoice2, + Order = 0, + Amount = 16.0m + }; + + idsPair = new Pair((int)invoice1.Id, (int)invoice2.Id); + tx.Complete(); + } + } + + [Test] + public void LocalVariableClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tester = new InheritorValueTypeTester(-1); + + Domain.QueryCache.Clear(); + Assert.That(tester.TestLocalVariable(session, idsPair.Second), Is.EqualTo(16.0m)); + Assert.That(tester.TestLocalVariable(session, idsPair.First), Is.EqualTo(6.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void MethodValueParameterClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tester = new InheritorValueTypeTester(-1); + + Domain.QueryCache.Clear(); + Assert.That(tester.TestMethodParameter(session, idsPair.Second), Is.EqualTo(16.0m)); + Assert.That(tester.TestMethodParameter(session, idsPair.First), Is.EqualTo(6.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void MethodRefParameterClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + var tester = new InheritorReferenceTypeTester(null); + + Domain.QueryCache.Clear(); + Assert.That(tester.TestMethodParameter(session, invoices[1]), Is.EqualTo(16.0m)); + Assert.That(tester.TestMethodParameter(session, invoices[0]), Is.EqualTo(6.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void ForeachItemClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tester = new InheritorValueTypeTester(-1); + + Domain.QueryCache.Clear(); + var results = tester.TestForeachItem(session); + Assert.That(results.Length, Is.EqualTo(2)); + Assert.That(results[0], Is.EqualTo(16.0m)); + Assert.That(results[1], Is.EqualTo(6.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void ForIndexClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tester = new InheritorValueTypeTester(-1); + + Domain.QueryCache.Clear(); + var results = tester.TestForIndex(session); + Assert.That(results.Length, Is.EqualTo(2)); + Assert.That(results[0], Is.EqualTo(16.0m)); + Assert.That(results[1], Is.EqualTo(6.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void StaticFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var tester = new InheritorValueTypeTester(-1); + InheritorValueTypeTester.StaticField = idsPair.First; + + Domain.QueryCache.Clear(); + Assert.That(tester.TestStaticField(session), Is.EqualTo(6.0m)); + + InheritorValueTypeTester.StaticField = idsPair.Second; + Assert.That(tester.TestStaticField(session), Is.EqualTo(16.0m)); + + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PrivateValueFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; + var second = new BaseValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateField(session); + var secondResult = second.TestPrivateField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PublicValueFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) + { + var first = new BaseValueTypeTester((long)idsPair.First) { PublicField = idsPair.First }; + var second = new BaseValueTypeTester((long)idsPair.Second) { PublicField = idsPair.Second }; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicField(session); + var secondResult = second.TestPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PrivateValuePropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester(idsPair.First) { PublicProperty = idsPair.First }; + var second = new BaseValueTypeTester(idsPair.Second) { PublicProperty = idsPair.Second }; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateProperty(session); + var secondResult = second.TestPrivateProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PublicValuePropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester(idsPair.First) { PublicProperty = idsPair.First }; + var second = new BaseValueTypeTester(idsPair.Second) { PublicProperty = idsPair.Second }; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicProperty(session); + var secondResult = second.TestPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void InhertitedValueFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new InheritorValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; + var second = new InheritorValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestInheritedPublicField(session); + var secondResult = second.TestInheritedPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void InheritedValuePropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new InheritorValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; + var second = new InheritorValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestInheritedPublicProperty(session); + var secondResult = second.TestInheritedPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPrivateValueFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; + var second = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateField(session); + var secondResult = second.TestPrivateField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPublicValueFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.First) {PublicField = idsPair.First}; + var second = new BaseValueTypeTester.NestedValueTypeTester((long) idsPair.Second) {PublicField = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicField(session); + var secondResult = second.TestPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPrivateValuePropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester.NestedValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; + var second = new BaseValueTypeTester.NestedValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateProperty(session); + var secondResult = second.TestPrivateProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPublicValuePropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var first = new BaseValueTypeTester.NestedValueTypeTester(idsPair.First) {PublicProperty = idsPair.First}; + var second = new BaseValueTypeTester.NestedValueTypeTester(idsPair.Second) {PublicProperty = idsPair.Second}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicProperty(session); + var secondResult = second.TestPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PrivateRefFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; + var second = new BaseReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateField(session); + var secondResult = second.TestPrivateField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PublicRefFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; + var second = new BaseReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicField(session); + var secondResult = second.TestPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PrivateRefPropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; + var second = new BaseReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateProperty(session); + var secondResult = second.TestPrivateProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void PublicRefPropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; + var second = new BaseReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicProperty(session); + var secondResult = second.TestPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void InhertitedRefFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new InheritorReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; + var second = new InheritorReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestInheritedPublicField(session); + var secondResult = second.TestInheritedPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void InheritedRefPropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new InheritorReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; + var second = new InheritorReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestInheritedPublicProperty(session); + var secondResult = second.TestInheritedPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPrivateRefFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; + var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateField(session); + var secondResult = second.TestPrivateField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPublicRefFieldClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicField = invoices[0]}; + var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicField = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicField(session); + var secondResult = second.TestPublicField(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPrivateRefPropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; + var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPrivateProperty(session); + var secondResult = second.TestPrivateProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + + [Test] + public void NestedClassPublicRefPropertyClosureTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var invoices = session.Query.All().ToArray(); + + var first = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[0]) {PublicProperty = invoices[0]}; + var second = new BaseReferenceTypeTester.NestedReferenceTypeTester(invoices[1]) {PublicProperty = invoices[1]}; + + Domain.QueryCache.Clear(); + var firstResult = first.TestPublicProperty(session); + var secondResult = second.TestPublicProperty(session); + Assert.That(firstResult, Is.EqualTo(6.0m)); + Assert.That(secondResult, Is.EqualTo(16.0m)); + Assert.That(Domain.QueryCache.Count, Is.EqualTo(1)); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/ClusteredIndexesTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ClusteredIndexesTest.cs index efd1190e27..620876bc67 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ClusteredIndexesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ClusteredIndexesTest.cs @@ -1,510 +1,510 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.10.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using NUnit.Framework; -//using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Sql.Model; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Providers; -using ErrorCases = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ErrorCases; -using NonClustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.NonClusteredHierarchy; -using Clustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ClusteredHierarchy; -using CustomClustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.CustomClusteredHierarchy; - -/* - * Common layout for all hierarchies: - * - * Root -------------\ - * / | \ \ - * / | \ \ - * | V \ \ - * | Item \ \ - * | | | - * V V V - * AbstractItem ClusteredItem ClabstractItem - * | | | - * V V V - * AbstractItemChild ClusteredItemChild ClabstractItemChild - * - * AbstractItem is abstract - * ClusteredItem declares clustered secondary index - * ClabstractItem is both abstract and clustered - */ - -namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.NonClusteredHierarchy -{ - [HierarchyRoot(Clustered = false)] - public class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class Item : Root - { - } - - [Index("Value", Clustered = true)] - public class ClusteredItem : Root - { - [Field] - public int Value { get; set; } - } - - public class ClusteredItemChild : ClusteredItem - { - } - - public abstract class AbstractItem : Root - { - } - - public class AbstractItemChild : AbstractItem - { - } - - [Index("Value", Clustered = true)] - public abstract class ClabstractItem : Root - { - [Field] - public int Value { get; set; } - } - - public class ClabstractItemChild : ClabstractItem - { - } -} - -namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ClusteredHierarchy -{ - [HierarchyRoot] - public class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public class Item : Root - { - } - - [Index("Value", Clustered = true)] - public class ClusteredItem : Root - { - [Field] - public int Value { get; set; } - } - - public class ClusteredItemChild : ClusteredItem - { - } - - public abstract class AbstractItem : Root - { - } - - public class AbstractItemChild : AbstractItem - { - } - - [Index("Value", Clustered = true)] - public abstract class ClabstractItem : Root - { - [Field] - public int Value { get; set; } - } - - public class ClabstractItemChild : ClabstractItem - { - } -} - -namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.CustomClusteredHierarchy -{ - - [HierarchyRoot, Index("Value", Clustered = true)] - public class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Value { get; set; } - } - - public class Item : Root - { - } - - [Index("AnotherValue", Clustered = true)] - public class ClusteredItem : Root - { - [Field] - public int AnotherValue { get; set; } - } - - public class ClusteredItemChild : ClusteredItem - { - } - - public abstract class AbstractItem : Root - { - } - - public class AbstractItemChild : AbstractItem - { - } - - [Index("AnotherValue", Clustered = true)] - public abstract class ClabstractItem : Root - { - [Field] - public int AnotherValue { get; set; } - } - - public class ClabstractItemChild : ClabstractItem - { - } -} - -namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ErrorCases -{ - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public class SingleTableBase : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Index("Value", Clustered = true)] - public class SingleTableChild : SingleTableBase - { - [Field] - int Value { get; set; } - } - - [Index("Value", Clustered = true)] - public interface IInterfaceWithClusteredIndex : IEntity - { - [Field] - int Value { get; set; } - } - - [HierarchyRoot] - public class BadInterfaceImplementor : Entity, IInterfaceWithClusteredIndex - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Value { get; set; } - } - - [HierarchyRoot, Index("Value1", Clustered = true), Index("Value2", Clustered = true)] - public class DuplicateClusteredIndex : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Value1 { get; set; } - - [Field] - public int Value2 { get; set; } - } - - [HierarchyRoot, Index("Value", Filter = "IndexRange", Clustered = true)] - public class PartialClusteredIndex : Entity - { - private static Expression> IndexRange() - { - return item => item.Value > 0; - } - - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Value { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class ClusteredIndexesTest - { - private Domain domain; - private HashSet domainTypes; - private InheritanceSchema? inheritanceSchema; - - [OneTimeSetUp] - public void TestFixtureSetUp() - { - Require.AllFeaturesSupported(ProviderFeatures.ClusteredIndexes); - } - - [TearDown] - public void TearDown() - { - CleanDomain(); - } - - private void CleanDomain() - { - if (domain==null) - return; - try { - domain.Dispose(); - } - finally { - domain = null; - } - } - - private IEnumerable GetAllValidTypes() - { - yield return typeof (NonClustered.Root); - yield return typeof (NonClustered.Item); - yield return typeof (NonClustered.ClusteredItem); - yield return typeof (NonClustered.ClusteredItemChild); - yield return typeof (NonClustered.AbstractItem); - yield return typeof (NonClustered.AbstractItemChild); - yield return typeof (NonClustered.ClabstractItem); - yield return typeof (NonClustered.ClabstractItemChild); - - yield return typeof (Clustered.Root); - yield return typeof (Clustered.Item); - yield return typeof (Clustered.ClusteredItem); - yield return typeof (Clustered.ClusteredItemChild); - yield return typeof (Clustered.AbstractItem); - yield return typeof (Clustered.AbstractItemChild); - yield return typeof (Clustered.ClabstractItem); - yield return typeof (Clustered.ClabstractItemChild); - - yield return typeof (CustomClustered.Root); - yield return typeof (CustomClustered.Item); - yield return typeof (CustomClustered.ClusteredItem); - yield return typeof (CustomClustered.ClusteredItemChild); - yield return typeof (CustomClustered.AbstractItem); - yield return typeof (CustomClustered.AbstractItemChild); - yield return typeof (CustomClustered.ClabstractItem); - yield return typeof (CustomClustered.ClabstractItemChild); - } - - private IEnumerable GetTypesValidForSingleTable() - { - yield return typeof (NonClustered.Root); - yield return typeof (NonClustered.Item); - yield return typeof (NonClustered.AbstractItem); - yield return typeof (NonClustered.AbstractItemChild); - - yield return typeof (Clustered.Root); - yield return typeof (Clustered.Item); - yield return typeof (Clustered.AbstractItem); - yield return typeof (Clustered.AbstractItemChild); - - yield return typeof (CustomClustered.Root); - yield return typeof (CustomClustered.Item); - yield return typeof (CustomClustered.AbstractItem); - yield return typeof (CustomClustered.AbstractItemChild); - } - - private Table GetTable(Type type) - { - var declaringType = domain.Model.Types[type]; - if (declaringType.Hierarchy.InheritanceSchema==InheritanceSchema.SingleTable) - declaringType = declaringType.Hierarchy.Root; - var mapping = StorageTestHelper.GetDefaultModelMapping(domain); - return mapping[declaringType]; - } - - private void CheckType(Type type, bool primaryKeyIsClustered, string clusteredSecondaryIndexColumn) - { - var table = GetTable(type); - var primaryKey = table.TableConstraints.OfType().Single(); - var index = table.Indexes.FirstOrDefault(i => i.IsClustered); - if (primaryKeyIsClustered) - Assert.IsTrue(primaryKey.IsClustered); - else - Assert.IsFalse(primaryKey.IsClustered); - if (clusteredSecondaryIndexColumn != null) { - Assert.IsNotNull(index); - Assert.AreEqual(1, index.Columns.Count); - Assert.AreEqual(clusteredSecondaryIndexColumn, index.Columns[0].Name); - } - else - Assert.IsNull(index); - } - - private void BuildDomain(DomainUpgradeMode upgradeMode) - { - CleanDomain(); - - var config = DomainConfigurationFactory.Create(); - - config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; - config.NamingConvention.NamespaceSynonyms[typeof (NonClustered.Root).Namespace] = "NC"; - config.NamingConvention.NamespaceSynonyms[typeof (Clustered.Root).Namespace] = "C"; - config.NamingConvention.NamespaceSynonyms[typeof (CustomClustered.Root).Namespace] = "CC"; - config.NamingConvention.NamespaceSynonyms[typeof (ErrorCases.DuplicateClusteredIndex).Namespace] = "E"; - - foreach (var type in domainTypes) - config.Types.Register(type); - config.Types.Register(typeof (SingleTableSchemaModifier).Assembly, typeof (SingleTableSchemaModifier).Namespace); - - config.UpgradeMode = upgradeMode; - if (inheritanceSchema!=null) - InheritanceSchemaModifier.ActivateModifier(inheritanceSchema.Value); - else - InheritanceSchemaModifier.DeactivateModifiers(); - - domain = Domain.Build(config); - } - - private void InitializeTest(InheritanceSchema? schema, IEnumerable types) - { - inheritanceSchema = schema; - - domainTypes = types.ToHashSet(); - } - - private void RunFailureTest(Type badType) - { - InitializeTest(null, new[] {badType}); - AssertEx.Throws(() => BuildDomain(DomainUpgradeMode.Recreate)); - } - - [Test] - public void ClassTableTest() - { - InitializeTest(InheritanceSchema.ClassTable, GetAllValidTypes()); - - BuildDomain(DomainUpgradeMode.Recreate); - - CheckType(typeof (NonClustered.Root), false, null); - CheckType(typeof (NonClustered.Item), false, null); - CheckType(typeof (NonClustered.ClusteredItem), false, "Value"); - CheckType(typeof (NonClustered.ClusteredItemChild), false, null); - CheckType(typeof (NonClustered.AbstractItem), false, null); - CheckType(typeof (NonClustered.AbstractItemChild), false, null); - CheckType(typeof (NonClustered.ClabstractItem), false, "Value"); - CheckType(typeof (NonClustered.ClabstractItemChild), false, null); - - CheckType(typeof (Clustered.Root), true, null); - CheckType(typeof (Clustered.Item), true, null); - CheckType(typeof (Clustered.ClusteredItem), false, "Value"); - CheckType(typeof (Clustered.ClusteredItemChild), true, null); - CheckType(typeof (Clustered.AbstractItem), true, null); - CheckType(typeof (Clustered.AbstractItemChild), true, null); - CheckType(typeof (Clustered.ClabstractItem), false, "Value"); - CheckType(typeof (Clustered.ClabstractItemChild), true, null); - - CheckType(typeof (CustomClustered.Root), false, "Value"); - CheckType(typeof (CustomClustered.Item), true, null); - CheckType(typeof (CustomClustered.ClusteredItem), false, "AnotherValue"); - CheckType(typeof (CustomClustered.ClusteredItemChild), true, null); - CheckType(typeof (CustomClustered.AbstractItem), true, null); - CheckType(typeof (CustomClustered.AbstractItemChild), true, null); - CheckType(typeof (CustomClustered.ClabstractItem), false, "AnotherValue"); - CheckType(typeof (CustomClustered.ClabstractItemChild), true, null); - - BuildDomain(DomainUpgradeMode.Validate); - } - - [Test] - public void ConcreteTableTest() - { - InitializeTest(InheritanceSchema.ConcreteTable, GetAllValidTypes()); - - BuildDomain(DomainUpgradeMode.Recreate); - - CheckType(typeof (NonClustered.Root), false, null); - CheckType(typeof (NonClustered.Item), false, null); - CheckType(typeof (NonClustered.ClusteredItem), false, "Value"); - CheckType(typeof (NonClustered.ClusteredItemChild), false, "Value"); - // Table does not exist: NonClustered.AbstractItem - CheckType(typeof (NonClustered.AbstractItemChild), false, null); - // Table does not exist: NonClustered.ClabstractItem - CheckType(typeof (NonClustered.ClabstractItemChild), false, "Value"); - - CheckType(typeof (Clustered.Root), true, null); - CheckType(typeof (Clustered.Item), true, null); - CheckType(typeof (Clustered.ClusteredItem), false, "Value"); - CheckType(typeof (Clustered.ClusteredItemChild), false, "Value"); - // Table does not exist: Clustered.AbstractItem - CheckType(typeof (Clustered.AbstractItemChild), true, null); - // Table does not exist: Clustered.ClabstractItem - CheckType(typeof (Clustered.ClabstractItemChild), false, "Value"); - - CheckType(typeof (CustomClustered.Root), false, "Value"); - CheckType(typeof (CustomClustered.Item), false, "Value"); - CheckType(typeof (CustomClustered.ClusteredItem), false, "AnotherValue"); - CheckType(typeof (CustomClustered.ClusteredItemChild), false, "AnotherValue"); - // Table does not exist: CustomClustered.AbstractItem - CheckType(typeof (CustomClustered.AbstractItemChild), false, "Value"); - // Table does not exist: CustomClustered.ClabstractItem - CheckType(typeof (CustomClustered.ClabstractItemChild), false, "AnotherValue"); - - BuildDomain(DomainUpgradeMode.Validate); - } - - [Test] - public void SingleTableTest() - { - InitializeTest(InheritanceSchema.SingleTable, GetTypesValidForSingleTable()); - - BuildDomain(DomainUpgradeMode.Recreate); - - CheckType(typeof (NonClustered.Root), false, null); - CheckType(typeof (NonClustered.Item), false, null); - CheckType(typeof (NonClustered.AbstractItem), false, null); - CheckType(typeof (NonClustered.AbstractItemChild), false, null); - - CheckType(typeof (Clustered.Root), true, null); - CheckType(typeof (Clustered.Item), true, null); - CheckType(typeof (Clustered.AbstractItem), true, null); - CheckType(typeof (Clustered.AbstractItemChild), true, null); - - CheckType(typeof (CustomClustered.Root), false, "Value"); - CheckType(typeof (CustomClustered.Item), false, "Value"); - CheckType(typeof (CustomClustered.AbstractItem), false, "Value"); - CheckType(typeof (CustomClustered.AbstractItemChild), false, "Value"); - - BuildDomain(DomainUpgradeMode.Validate); - } - - [Test] - public void DuplicateClusteredIndexTest() - { - RunFailureTest(typeof (ErrorCases.DuplicateClusteredIndex)); - } - - [Test] - public void PartialClusteredIndexTest() - { - RunFailureTest(typeof (ErrorCases.PartialClusteredIndex)); - } - - [Test] - public void ClusteredIndexInInterfaceTest() - { - RunFailureTest(typeof (ErrorCases.BadInterfaceImplementor)); - } - - [Test] - public void ChangeSingleTableClusteringInChildTest() - { - RunFailureTest(typeof (ErrorCases.SingleTableChild)); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.10.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; +//using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Sql.Model; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Providers; +using ErrorCases = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ErrorCases; +using NonClustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.NonClusteredHierarchy; +using Clustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ClusteredHierarchy; +using CustomClustered = Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.CustomClusteredHierarchy; + +/* + * Common layout for all hierarchies: + * + * Root -------------\ + * / | \ \ + * / | \ \ + * | V \ \ + * | Item \ \ + * | | | + * V V V + * AbstractItem ClusteredItem ClabstractItem + * | | | + * V V V + * AbstractItemChild ClusteredItemChild ClabstractItemChild + * + * AbstractItem is abstract + * ClusteredItem declares clustered secondary index + * ClabstractItem is both abstract and clustered + */ + +namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.NonClusteredHierarchy +{ + [HierarchyRoot(Clustered = false)] + public class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class Item : Root + { + } + + [Index("Value", Clustered = true)] + public class ClusteredItem : Root + { + [Field] + public int Value { get; set; } + } + + public class ClusteredItemChild : ClusteredItem + { + } + + public abstract class AbstractItem : Root + { + } + + public class AbstractItemChild : AbstractItem + { + } + + [Index("Value", Clustered = true)] + public abstract class ClabstractItem : Root + { + [Field] + public int Value { get; set; } + } + + public class ClabstractItemChild : ClabstractItem + { + } +} + +namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ClusteredHierarchy +{ + [HierarchyRoot] + public class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public class Item : Root + { + } + + [Index("Value", Clustered = true)] + public class ClusteredItem : Root + { + [Field] + public int Value { get; set; } + } + + public class ClusteredItemChild : ClusteredItem + { + } + + public abstract class AbstractItem : Root + { + } + + public class AbstractItemChild : AbstractItem + { + } + + [Index("Value", Clustered = true)] + public abstract class ClabstractItem : Root + { + [Field] + public int Value { get; set; } + } + + public class ClabstractItemChild : ClabstractItem + { + } +} + +namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.CustomClusteredHierarchy +{ + + [HierarchyRoot, Index("Value", Clustered = true)] + public class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Value { get; set; } + } + + public class Item : Root + { + } + + [Index("AnotherValue", Clustered = true)] + public class ClusteredItem : Root + { + [Field] + public int AnotherValue { get; set; } + } + + public class ClusteredItemChild : ClusteredItem + { + } + + public abstract class AbstractItem : Root + { + } + + public class AbstractItemChild : AbstractItem + { + } + + [Index("AnotherValue", Clustered = true)] + public abstract class ClabstractItem : Root + { + [Field] + public int AnotherValue { get; set; } + } + + public class ClabstractItemChild : ClabstractItem + { + } +} + +namespace Xtensive.Orm.Tests.Storage.ClusteredIndexesTestModels.ErrorCases +{ + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public class SingleTableBase : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Index("Value", Clustered = true)] + public class SingleTableChild : SingleTableBase + { + [Field] + int Value { get; set; } + } + + [Index("Value", Clustered = true)] + public interface IInterfaceWithClusteredIndex : IEntity + { + [Field] + int Value { get; set; } + } + + [HierarchyRoot] + public class BadInterfaceImplementor : Entity, IInterfaceWithClusteredIndex + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Value { get; set; } + } + + [HierarchyRoot, Index("Value1", Clustered = true), Index("Value2", Clustered = true)] + public class DuplicateClusteredIndex : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Value1 { get; set; } + + [Field] + public int Value2 { get; set; } + } + + [HierarchyRoot, Index("Value", Filter = "IndexRange", Clustered = true)] + public class PartialClusteredIndex : Entity + { + private static Expression> IndexRange() + { + return item => item.Value > 0; + } + + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Value { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class ClusteredIndexesTest + { + private Domain domain; + private HashSet domainTypes; + private InheritanceSchema? inheritanceSchema; + + [OneTimeSetUp] + public void TestFixtureSetUp() + { + Require.AllFeaturesSupported(ProviderFeatures.ClusteredIndexes); + } + + [TearDown] + public void TearDown() + { + CleanDomain(); + } + + private void CleanDomain() + { + if (domain==null) + return; + try { + domain.Dispose(); + } + finally { + domain = null; + } + } + + private IEnumerable GetAllValidTypes() + { + yield return typeof (NonClustered.Root); + yield return typeof (NonClustered.Item); + yield return typeof (NonClustered.ClusteredItem); + yield return typeof (NonClustered.ClusteredItemChild); + yield return typeof (NonClustered.AbstractItem); + yield return typeof (NonClustered.AbstractItemChild); + yield return typeof (NonClustered.ClabstractItem); + yield return typeof (NonClustered.ClabstractItemChild); + + yield return typeof (Clustered.Root); + yield return typeof (Clustered.Item); + yield return typeof (Clustered.ClusteredItem); + yield return typeof (Clustered.ClusteredItemChild); + yield return typeof (Clustered.AbstractItem); + yield return typeof (Clustered.AbstractItemChild); + yield return typeof (Clustered.ClabstractItem); + yield return typeof (Clustered.ClabstractItemChild); + + yield return typeof (CustomClustered.Root); + yield return typeof (CustomClustered.Item); + yield return typeof (CustomClustered.ClusteredItem); + yield return typeof (CustomClustered.ClusteredItemChild); + yield return typeof (CustomClustered.AbstractItem); + yield return typeof (CustomClustered.AbstractItemChild); + yield return typeof (CustomClustered.ClabstractItem); + yield return typeof (CustomClustered.ClabstractItemChild); + } + + private IEnumerable GetTypesValidForSingleTable() + { + yield return typeof (NonClustered.Root); + yield return typeof (NonClustered.Item); + yield return typeof (NonClustered.AbstractItem); + yield return typeof (NonClustered.AbstractItemChild); + + yield return typeof (Clustered.Root); + yield return typeof (Clustered.Item); + yield return typeof (Clustered.AbstractItem); + yield return typeof (Clustered.AbstractItemChild); + + yield return typeof (CustomClustered.Root); + yield return typeof (CustomClustered.Item); + yield return typeof (CustomClustered.AbstractItem); + yield return typeof (CustomClustered.AbstractItemChild); + } + + private Table GetTable(Type type) + { + var declaringType = domain.Model.Types[type]; + if (declaringType.Hierarchy.InheritanceSchema==InheritanceSchema.SingleTable) + declaringType = declaringType.Hierarchy.Root; + var mapping = StorageTestHelper.GetDefaultModelMapping(domain); + return mapping[declaringType]; + } + + private void CheckType(Type type, bool primaryKeyIsClustered, string clusteredSecondaryIndexColumn) + { + var table = GetTable(type); + var primaryKey = table.TableConstraints.OfType().Single(); + var index = table.Indexes.FirstOrDefault(i => i.IsClustered); + if (primaryKeyIsClustered) + Assert.IsTrue(primaryKey.IsClustered); + else + Assert.IsFalse(primaryKey.IsClustered); + if (clusteredSecondaryIndexColumn != null) { + Assert.IsNotNull(index); + Assert.AreEqual(1, index.Columns.Count); + Assert.AreEqual(clusteredSecondaryIndexColumn, index.Columns[0].Name); + } + else + Assert.IsNull(index); + } + + private void BuildDomain(DomainUpgradeMode upgradeMode) + { + CleanDomain(); + + var config = DomainConfigurationFactory.Create(); + + config.NamingConvention.NamespacePolicy = NamespacePolicy.Synonymize; + config.NamingConvention.NamespaceSynonyms[typeof (NonClustered.Root).Namespace] = "NC"; + config.NamingConvention.NamespaceSynonyms[typeof (Clustered.Root).Namespace] = "C"; + config.NamingConvention.NamespaceSynonyms[typeof (CustomClustered.Root).Namespace] = "CC"; + config.NamingConvention.NamespaceSynonyms[typeof (ErrorCases.DuplicateClusteredIndex).Namespace] = "E"; + + foreach (var type in domainTypes) + config.Types.Register(type); + config.Types.Register(typeof (SingleTableSchemaModifier).Assembly, typeof (SingleTableSchemaModifier).Namespace); + + config.UpgradeMode = upgradeMode; + if (inheritanceSchema!=null) + InheritanceSchemaModifier.ActivateModifier(inheritanceSchema.Value); + else + InheritanceSchemaModifier.DeactivateModifiers(); + + domain = Domain.Build(config); + } + + private void InitializeTest(InheritanceSchema? schema, IEnumerable types) + { + inheritanceSchema = schema; + + domainTypes = types.ToHashSet(); + } + + private void RunFailureTest(Type badType) + { + InitializeTest(null, new[] {badType}); + AssertEx.Throws(() => BuildDomain(DomainUpgradeMode.Recreate)); + } + + [Test] + public void ClassTableTest() + { + InitializeTest(InheritanceSchema.ClassTable, GetAllValidTypes()); + + BuildDomain(DomainUpgradeMode.Recreate); + + CheckType(typeof (NonClustered.Root), false, null); + CheckType(typeof (NonClustered.Item), false, null); + CheckType(typeof (NonClustered.ClusteredItem), false, "Value"); + CheckType(typeof (NonClustered.ClusteredItemChild), false, null); + CheckType(typeof (NonClustered.AbstractItem), false, null); + CheckType(typeof (NonClustered.AbstractItemChild), false, null); + CheckType(typeof (NonClustered.ClabstractItem), false, "Value"); + CheckType(typeof (NonClustered.ClabstractItemChild), false, null); + + CheckType(typeof (Clustered.Root), true, null); + CheckType(typeof (Clustered.Item), true, null); + CheckType(typeof (Clustered.ClusteredItem), false, "Value"); + CheckType(typeof (Clustered.ClusteredItemChild), true, null); + CheckType(typeof (Clustered.AbstractItem), true, null); + CheckType(typeof (Clustered.AbstractItemChild), true, null); + CheckType(typeof (Clustered.ClabstractItem), false, "Value"); + CheckType(typeof (Clustered.ClabstractItemChild), true, null); + + CheckType(typeof (CustomClustered.Root), false, "Value"); + CheckType(typeof (CustomClustered.Item), true, null); + CheckType(typeof (CustomClustered.ClusteredItem), false, "AnotherValue"); + CheckType(typeof (CustomClustered.ClusteredItemChild), true, null); + CheckType(typeof (CustomClustered.AbstractItem), true, null); + CheckType(typeof (CustomClustered.AbstractItemChild), true, null); + CheckType(typeof (CustomClustered.ClabstractItem), false, "AnotherValue"); + CheckType(typeof (CustomClustered.ClabstractItemChild), true, null); + + BuildDomain(DomainUpgradeMode.Validate); + } + + [Test] + public void ConcreteTableTest() + { + InitializeTest(InheritanceSchema.ConcreteTable, GetAllValidTypes()); + + BuildDomain(DomainUpgradeMode.Recreate); + + CheckType(typeof (NonClustered.Root), false, null); + CheckType(typeof (NonClustered.Item), false, null); + CheckType(typeof (NonClustered.ClusteredItem), false, "Value"); + CheckType(typeof (NonClustered.ClusteredItemChild), false, "Value"); + // Table does not exist: NonClustered.AbstractItem + CheckType(typeof (NonClustered.AbstractItemChild), false, null); + // Table does not exist: NonClustered.ClabstractItem + CheckType(typeof (NonClustered.ClabstractItemChild), false, "Value"); + + CheckType(typeof (Clustered.Root), true, null); + CheckType(typeof (Clustered.Item), true, null); + CheckType(typeof (Clustered.ClusteredItem), false, "Value"); + CheckType(typeof (Clustered.ClusteredItemChild), false, "Value"); + // Table does not exist: Clustered.AbstractItem + CheckType(typeof (Clustered.AbstractItemChild), true, null); + // Table does not exist: Clustered.ClabstractItem + CheckType(typeof (Clustered.ClabstractItemChild), false, "Value"); + + CheckType(typeof (CustomClustered.Root), false, "Value"); + CheckType(typeof (CustomClustered.Item), false, "Value"); + CheckType(typeof (CustomClustered.ClusteredItem), false, "AnotherValue"); + CheckType(typeof (CustomClustered.ClusteredItemChild), false, "AnotherValue"); + // Table does not exist: CustomClustered.AbstractItem + CheckType(typeof (CustomClustered.AbstractItemChild), false, "Value"); + // Table does not exist: CustomClustered.ClabstractItem + CheckType(typeof (CustomClustered.ClabstractItemChild), false, "AnotherValue"); + + BuildDomain(DomainUpgradeMode.Validate); + } + + [Test] + public void SingleTableTest() + { + InitializeTest(InheritanceSchema.SingleTable, GetTypesValidForSingleTable()); + + BuildDomain(DomainUpgradeMode.Recreate); + + CheckType(typeof (NonClustered.Root), false, null); + CheckType(typeof (NonClustered.Item), false, null); + CheckType(typeof (NonClustered.AbstractItem), false, null); + CheckType(typeof (NonClustered.AbstractItemChild), false, null); + + CheckType(typeof (Clustered.Root), true, null); + CheckType(typeof (Clustered.Item), true, null); + CheckType(typeof (Clustered.AbstractItem), true, null); + CheckType(typeof (Clustered.AbstractItemChild), true, null); + + CheckType(typeof (CustomClustered.Root), false, "Value"); + CheckType(typeof (CustomClustered.Item), false, "Value"); + CheckType(typeof (CustomClustered.AbstractItem), false, "Value"); + CheckType(typeof (CustomClustered.AbstractItemChild), false, "Value"); + + BuildDomain(DomainUpgradeMode.Validate); + } + + [Test] + public void DuplicateClusteredIndexTest() + { + RunFailureTest(typeof (ErrorCases.DuplicateClusteredIndex)); + } + + [Test] + public void PartialClusteredIndexTest() + { + RunFailureTest(typeof (ErrorCases.PartialClusteredIndex)); + } + + [Test] + public void ClusteredIndexInInterfaceTest() + { + RunFailureTest(typeof (ErrorCases.BadInterfaceImplementor)); + } + + [Test] + public void ChangeSingleTableClusteringInChildTest() + { + RunFailureTest(typeof (ErrorCases.SingleTableChild)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CmsTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CmsTest.cs index 641a086e15..b40fd0c6bc 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CmsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CmsTest.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.12.16 - -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.ObjectModel.Cms; - -namespace Xtensive.Orm.Tests.Storage -{ - public class CmsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(ContentFile).Namespace); - return config; - } - - - [Test] - public void Test() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var webSite = new WebSite(); - webSite.Title = "Title"; - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var webSite = session.Query.All().First(); - var result = session.Query.All() - .Where( - r => r.ReferenceType == ContentReferenceType.Embedded && - r.ContentID.In(session.Query.All().Where(nl => nl.WebSite == webSite).Select(nl => nl.Id))); - var list = result.ToList(); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.12.16 + +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.ObjectModel.Cms; + +namespace Xtensive.Orm.Tests.Storage +{ + public class CmsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(ContentFile).Namespace); + return config; + } + + + [Test] + public void Test() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var webSite = new WebSite(); + webSite.Title = "Title"; + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var webSite = session.Query.All().First(); + var result = session.Query.All() + .Where( + r => r.ReferenceType == ContentReferenceType.Embedded && + r.ContentID.In(session.Query.All().Where(nl => nl.WebSite == webSite).Select(nl => nl.Id))); + var list = result.ToList(); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CommandProcessorContextProviderTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CommandProcessorContextProviderTest.cs index 395a003298..9517f0ec67 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CommandProcessorContextProviderTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CommandProcessorContextProviderTest.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2019.07.12 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Storage -{ - public class CommandProcessorContextProviderTest : AutoBuildTest - { - protected override void PopulateData() - { - CreateSessionAndTransaction(); - } - - [Test] - public void GetContextTest() - { - var session = Session.Demand(); - var provider = session.CommandProcessorContextProvider; - var context = provider.ProvideContext(); - - Assert.That(context, Is.Not.Null); - Assert.That(context.AllowPartialExecution, Is.False); - Assert.That(context.ActiveCommand, Is.Null); - Assert.That(context.ActiveTasks, Is.Not.Null); - Assert.That(context.ActiveTasks.Count, Is.EqualTo(0)); - Assert.That(context.ProcessingTasks, Is.Not.Null); - Assert.That(context.ProcessingTasks.Count, Is.EqualTo(0)); - - Assert.That(provider.ProvideContext(), Is.Not.SameAs(provider.ProvideContext())); - } - - [Test] - public void GetContextForPartialExecutionTest() - { - var session = Session.Demand(); - var provider = session.CommandProcessorContextProvider; - var context = provider.ProvideContext(true); - - Assert.That(context, Is.Not.Null); - Assert.That(context.AllowPartialExecution, Is.True); - Assert.That(context.ActiveCommand, Is.Null); - Assert.That(context.ActiveTasks, Is.Not.Null); - Assert.That(context.ActiveTasks.Count, Is.EqualTo(0)); - Assert.That(context.ProcessingTasks, Is.Not.Null); - Assert.That(context.ProcessingTasks.Count, Is.EqualTo(0)); - - Assert.That(provider.ProvideContext(true), Is.Not.SameAs(provider.ProvideContext(true))); - } - } +// Copyright (C) 2019 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2019.07.12 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Storage +{ + public class CommandProcessorContextProviderTest : AutoBuildTest + { + protected override void PopulateData() + { + CreateSessionAndTransaction(); + } + + [Test] + public void GetContextTest() + { + var session = Session.Demand(); + var provider = session.CommandProcessorContextProvider; + var context = provider.ProvideContext(); + + Assert.That(context, Is.Not.Null); + Assert.That(context.AllowPartialExecution, Is.False); + Assert.That(context.ActiveCommand, Is.Null); + Assert.That(context.ActiveTasks, Is.Not.Null); + Assert.That(context.ActiveTasks.Count, Is.EqualTo(0)); + Assert.That(context.ProcessingTasks, Is.Not.Null); + Assert.That(context.ProcessingTasks.Count, Is.EqualTo(0)); + + Assert.That(provider.ProvideContext(), Is.Not.SameAs(provider.ProvideContext())); + } + + [Test] + public void GetContextForPartialExecutionTest() + { + var session = Session.Demand(); + var provider = session.CommandProcessorContextProvider; + var context = provider.ProvideContext(true); + + Assert.That(context, Is.Not.Null); + Assert.That(context.AllowPartialExecution, Is.True); + Assert.That(context.ActiveCommand, Is.Null); + Assert.That(context.ActiveTasks, Is.Not.Null); + Assert.That(context.ActiveTasks.Count, Is.EqualTo(0)); + Assert.That(context.ProcessingTasks, Is.Not.Null); + Assert.That(context.ProcessingTasks.Count, Is.EqualTo(0)); + + Assert.That(provider.ProvideContext(true), Is.Not.SameAs(provider.ProvideContext(true))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CompiledQueryTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CompiledQueryTest.cs index 0577d4238b..365549d0bd 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CompiledQueryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CompiledQueryTest.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.04.25 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using System.Linq; - -namespace Xtensive.Orm.Tests.Storage -{ - [Serializable] - public class CompiledQueryTest : ChinookDOModelTest - { - [Test] - public void CachedSequenceTest() - { - var trackName = "Babylon"; - var unitPrice = 0.9m; - var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice)); - } - - [Test] - public void CachedSubquerySequenceTest() - { - Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); - var addresses = Session.Query.All() - .Select(c => c.Address) - .ToList(); - var expectedItems = Session.Query.All() - .Select(c => new {Customer = c, ProductsCount = c.Invoices.Count}) - .ToDictionary(a => a.Customer.Address); - foreach (var address in addresses) { - var result = Session.Query.Execute( - qe => qe.All() - .Where(c => c.Address==address) - .Select( - c => new { - Customer = c, - Products = Session.Query.All().Where(p => p.Customer.Address==address) - }) - ).ToList(); - var expected = expectedItems[address]; - Assert.AreSame(expected.Customer, result.Single().Customer); - Assert.AreEqual(expected.ProductsCount, result.Single().Products.ToList().Count); - } - } - - [Test] - public void ScalarLongTest() - { - var trackName = "Babylon"; - var unitPrice = 0.9m; - var result = Session.Query.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).LongCount(); - } - - [Test] - public void CachedScalarLongTest() - { - var trackName = "Babylon"; - var unitPrice = 0.9m; - var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).LongCount()); - } - - [Test] - public void CachedScalarTest() - { - var trackName = "Babylon"; - var unitPrice = 0.9m; - var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).Count()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.04.25 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using System.Linq; + +namespace Xtensive.Orm.Tests.Storage +{ + [Serializable] + public class CompiledQueryTest : ChinookDOModelTest + { + [Test] + public void CachedSequenceTest() + { + var trackName = "Babylon"; + var unitPrice = 0.9m; + var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice)); + } + + [Test] + public void CachedSubquerySequenceTest() + { + Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries); + var addresses = Session.Query.All() + .Select(c => c.Address) + .ToList(); + var expectedItems = Session.Query.All() + .Select(c => new {Customer = c, ProductsCount = c.Invoices.Count}) + .ToDictionary(a => a.Customer.Address); + foreach (var address in addresses) { + var result = Session.Query.Execute( + qe => qe.All() + .Where(c => c.Address==address) + .Select( + c => new { + Customer = c, + Products = Session.Query.All().Where(p => p.Customer.Address==address) + }) + ).ToList(); + var expected = expectedItems[address]; + Assert.AreSame(expected.Customer, result.Single().Customer); + Assert.AreEqual(expected.ProductsCount, result.Single().Products.ToList().Count); + } + } + + [Test] + public void ScalarLongTest() + { + var trackName = "Babylon"; + var unitPrice = 0.9m; + var result = Session.Query.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).LongCount(); + } + + [Test] + public void CachedScalarLongTest() + { + var trackName = "Babylon"; + var unitPrice = 0.9m; + var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).LongCount()); + } + + [Test] + public void CachedScalarTest() + { + var trackName = "Babylon"; + var unitPrice = 0.9m; + var result = Session.Query.Execute(qe => qe.All().Where(p => p.Name==trackName && p.UnitPrice > unitPrice).Count()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ConcurrentCommandProcessorExecution.cs b/Orm/Xtensive.Orm.Tests/Storage/ConcurrentCommandProcessorExecution.cs index 1d3a3c22c6..4b2e35712c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ConcurrentCommandProcessorExecution.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ConcurrentCommandProcessorExecution.cs @@ -1,322 +1,322 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel; - -namespace Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public DateTime CreationDate { get; set; } - - [Field] - public long Value { get; set; } - - public TestEntity(Session session) - : base(session) - { - } - } - - [HierarchyRoot] - public class EntitySetContainer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet EntitySet { get; set; } - - public EntitySetContainer(Session session) - : base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class ConcurrentCommandProcessorExecution : AutoBuildTest - { - private const int OneBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize; - private const int TwoBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize * 2; - private const int MoreThatTwoBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize * 2 + 2; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var entityCount = 1000; - for (int i = 0; i < entityCount; i++) { - new TestEntity(session) { Name = "A", Value = i, CreationDate = DateTime.Now.AddSeconds(i) }; - if (i % 10==0) - session.SaveChanges(); - } - transaction.Complete(); - } - } - - [Test] - public async Task InseparableBatchTest() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - await task; - - int countBefore = 1; - foreach (var query in longListOfQueries) { - var actualCount = query.Count(); - var expectedCount = countBefore; - Console.WriteLine(actualCount); - Assert.That(actualCount, Is.EqualTo(expectedCount)); - countBefore = countBefore + 1; - } - } - } - - [Test] - public async Task SeparableBatchTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(TwoBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < TwoBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - await task; - - int countBefore = 1; - foreach (var query in longListOfQueries) { - var actualCount = query.Count(); - var expectedCount = countBefore; - Console.WriteLine(actualCount); - Assert.That(actualCount, Is.EqualTo(expectedCount)); - countBefore = countBefore + 1; - } - } - } - - [Test] - public async Task SeparableBatchTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - await task; - - int countBefore = 1; - foreach (var query in longListOfQueries) { - var actualCount = query.Count(); - var expectedCount = countBefore; - Console.WriteLine(actualCount); - Assert.That(actualCount, Is.EqualTo(expectedCount)); - countBefore = countBefore + 1; - } - } - } - - [Test] - public async Task ActualPersistAfterBatchFinishedTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> looooongListOfQueries = new List>(OneBatchSizedTaskCollectionCount); - int value = 1; - while (looooongListOfQueries.Count < OneBatchSizedTaskCollectionCount) { - var closureValue = value; - looooongListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value++; - } - - var task = looooongListOfQueries.First().AsAsync(); - new TestEntity(session) {Value = 0}; - new TestEntity(session) {Value = 0}; - var result1 = await task; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - var result2 = await anotherTask; - - int countBefore = 1; - foreach (var query in looooongListOfQueries) { - var actualCount = query.Count(); - var expectedCount = countBefore; - Console.WriteLine(actualCount); - Assert.That(actualCount, Is.EqualTo(expectedCount)); - countBefore = countBefore + 1; - } - } - } - - [Test] - public async Task ActualPersistAfterBatchFinishedTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> looooongListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); - int value = 1; - while (looooongListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { - var closureValue = value; - looooongListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value++; - } - - var task = looooongListOfQueries.First().AsAsync(); - new TestEntity(session) {Value = 0}; - new TestEntity(session) {Value = 0}; - var result1 = await task; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - - var result2 = await anotherTask; - - int countBefore = 1; - foreach (var query in looooongListOfQueries) { - var actualCount = query.Count(); - var expectedCount = countBefore; - Console.WriteLine(actualCount); - Assert.That(actualCount, Is.EqualTo(expectedCount)); - countBefore = countBefore + 1; - } - } - } - - [Test] - public async Task PersistDuringNonSeparableBatchExecutionTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount){ - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - new TestEntity(session) {Value = 0}; - new TestEntity(session) {Value = 0}; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - var result1 = await task; - Assert.ThrowsAsync(async () => await anotherTask); - } - } - - [Test] - public async Task PersistDuringNonSeparableBatchExecutionTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - new TestEntity(session) {Value = 0}; - new TestEntity(session) {Value = 0}; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - try { - Assert.ThrowsAsync(async () => await anotherTask); - } - finally { - var result2 = await task; - } - } - } - - [Test] - public async Task PersistDuringSeparableBatchExecutionTest01() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - new TestEntity(session) { Value = 0 }; - new TestEntity(session) { Value = 0 }; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - var result1 = await task; - Assert.ThrowsAsync(async () => await anotherTask); - } - } - - [Test] - public async Task PersistDuringSeparableBatchExecutionTest02() - { - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); - int value = 1; - while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { - var closureValue = value; - longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); - value += 1; - } - - var task = longListOfQueries.First().AsAsync(); - new TestEntity(session) {Value = 0}; - new TestEntity(session) {Value = 0}; - var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); - try { - Assert.ThrowsAsync(async () => await anotherTask); - } - finally { - var result2 = await task; - } - } - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel; + +namespace Xtensive.Orm.Tests.Storage.ConcurrentCommandProcessorExecutionModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public DateTime CreationDate { get; set; } + + [Field] + public long Value { get; set; } + + public TestEntity(Session session) + : base(session) + { + } + } + + [HierarchyRoot] + public class EntitySetContainer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet EntitySet { get; set; } + + public EntitySetContainer(Session session) + : base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class ConcurrentCommandProcessorExecution : AutoBuildTest + { + private const int OneBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize; + private const int TwoBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize * 2; + private const int MoreThatTwoBatchSizedTaskCollectionCount = SessionConfiguration.DefaultBatchSize * 2 + 2; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestEntity).Assembly, typeof (TestEntity).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var entityCount = 1000; + for (int i = 0; i < entityCount; i++) { + new TestEntity(session) { Name = "A", Value = i, CreationDate = DateTime.Now.AddSeconds(i) }; + if (i % 10==0) + session.SaveChanges(); + } + transaction.Complete(); + } + } + + [Test] + public async Task InseparableBatchTest() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + await task; + + int countBefore = 1; + foreach (var query in longListOfQueries) { + var actualCount = query.Count(); + var expectedCount = countBefore; + Console.WriteLine(actualCount); + Assert.That(actualCount, Is.EqualTo(expectedCount)); + countBefore = countBefore + 1; + } + } + } + + [Test] + public async Task SeparableBatchTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(TwoBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < TwoBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + await task; + + int countBefore = 1; + foreach (var query in longListOfQueries) { + var actualCount = query.Count(); + var expectedCount = countBefore; + Console.WriteLine(actualCount); + Assert.That(actualCount, Is.EqualTo(expectedCount)); + countBefore = countBefore + 1; + } + } + } + + [Test] + public async Task SeparableBatchTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + var fastBatch = await session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + await task; + + int countBefore = 1; + foreach (var query in longListOfQueries) { + var actualCount = query.Count(); + var expectedCount = countBefore; + Console.WriteLine(actualCount); + Assert.That(actualCount, Is.EqualTo(expectedCount)); + countBefore = countBefore + 1; + } + } + } + + [Test] + public async Task ActualPersistAfterBatchFinishedTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> looooongListOfQueries = new List>(OneBatchSizedTaskCollectionCount); + int value = 1; + while (looooongListOfQueries.Count < OneBatchSizedTaskCollectionCount) { + var closureValue = value; + looooongListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value++; + } + + var task = looooongListOfQueries.First().AsAsync(); + new TestEntity(session) {Value = 0}; + new TestEntity(session) {Value = 0}; + var result1 = await task; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + var result2 = await anotherTask; + + int countBefore = 1; + foreach (var query in looooongListOfQueries) { + var actualCount = query.Count(); + var expectedCount = countBefore; + Console.WriteLine(actualCount); + Assert.That(actualCount, Is.EqualTo(expectedCount)); + countBefore = countBefore + 1; + } + } + } + + [Test] + public async Task ActualPersistAfterBatchFinishedTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> looooongListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); + int value = 1; + while (looooongListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { + var closureValue = value; + looooongListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value++; + } + + var task = looooongListOfQueries.First().AsAsync(); + new TestEntity(session) {Value = 0}; + new TestEntity(session) {Value = 0}; + var result1 = await task; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + + var result2 = await anotherTask; + + int countBefore = 1; + foreach (var query in looooongListOfQueries) { + var actualCount = query.Count(); + var expectedCount = countBefore; + Console.WriteLine(actualCount); + Assert.That(actualCount, Is.EqualTo(expectedCount)); + countBefore = countBefore + 1; + } + } + } + + [Test] + public async Task PersistDuringNonSeparableBatchExecutionTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount){ + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + new TestEntity(session) {Value = 0}; + new TestEntity(session) {Value = 0}; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + var result1 = await task; + Assert.ThrowsAsync(async () => await anotherTask); + } + } + + [Test] + public async Task PersistDuringNonSeparableBatchExecutionTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(OneBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < OneBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + new TestEntity(session) {Value = 0}; + new TestEntity(session) {Value = 0}; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + try { + Assert.ThrowsAsync(async () => await anotherTask); + } + finally { + var result2 = await task; + } + } + } + + [Test] + public async Task PersistDuringSeparableBatchExecutionTest01() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + new TestEntity(session) { Value = 0 }; + new TestEntity(session) { Value = 0 }; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + var result1 = await task; + Assert.ThrowsAsync(async () => await anotherTask); + } + } + + [Test] + public async Task PersistDuringSeparableBatchExecutionTest02() + { + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + List> longListOfQueries = new List>(MoreThatTwoBatchSizedTaskCollectionCount); + int value = 1; + while (longListOfQueries.Count < MoreThatTwoBatchSizedTaskCollectionCount) { + var closureValue = value; + longListOfQueries.Add(session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value < closureValue))); + value += 1; + } + + var task = longListOfQueries.First().AsAsync(); + new TestEntity(session) {Value = 0}; + new TestEntity(session) {Value = 0}; + var anotherTask = session.Query.ExecuteDelayed((q) => q.All().Where(e => e.Value > 10)).AsAsync(); + try { + Assert.ThrowsAsync(async () => await anotherTask); + } + finally { + var result2 = await task; + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ConnectionStringSupportTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ConnectionStringSupportTest.cs index c2b067252a..feb01cdacd 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ConnectionStringSupportTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ConnectionStringSupportTest.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.10 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class ConnectionStringSupportTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - return DomainConfigurationFactory.CreateForConnectionStringTest(); - } - - [Test] - public void CheckConfigTest() - { - var connectionInfo = Domain.Configuration.ConnectionInfo; - Assert.IsNotNull(connectionInfo.Provider); - Assert.IsNotNull(connectionInfo.ConnectionString); - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.10 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class ConnectionStringSupportTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + return DomainConfigurationFactory.CreateForConnectionStringTest(); + } + + [Test] + public void CheckConfigTest() + { + var connectionInfo = Domain.Configuration.ConnectionInfo; + Assert.IsNotNull(connectionInfo.Provider); + Assert.IsNotNull(connectionInfo.ConnectionString); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ConstraintsTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ConstraintsTest.cs index c7664b01f9..45832ec73c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ConstraintsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ConstraintsTest.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.08.18 - -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.BookAuthorModel; - -namespace Xtensive.Orm.Tests.Storage -{ - public class ConstraintsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); - return config; - } - - [Test] - public void NotNullableViolationTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - var book = new Book(); - - // Text is nullable so it's OK - book.Text = null; - - // Title has length constraint (10 symbols) so InvalidOperationException is expected - AssertEx.Throws(() => { - book.Title = "01234567890"; - session.SaveChanges(); - }); - } - } - } - - [Test] - public void SessionBoundaryViolationTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - Author author = new Author(); - using (var session2 = Domain.OpenSession()) { - using (session2.OpenTransaction()) { - Book book = new Book(); - - // Author is bound to another session - AssertEx.ThrowsInvalidOperationException(() => book.Author = author); - } - } - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.08.18 + +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.BookAuthorModel; + +namespace Xtensive.Orm.Tests.Storage +{ + public class ConstraintsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); + return config; + } + + [Test] + public void NotNullableViolationTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + var book = new Book(); + + // Text is nullable so it's OK + book.Text = null; + + // Title has length constraint (10 symbols) so InvalidOperationException is expected + AssertEx.Throws(() => { + book.Title = "01234567890"; + session.SaveChanges(); + }); + } + } + } + + [Test] + public void SessionBoundaryViolationTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + Author author = new Author(); + using (var session2 = Domain.OpenSession()) { + using (session2.OpenTransaction()) { + Book book = new Book(); + + // Author is bound to another session + AssertEx.ThrowsInvalidOperationException(() => book.Author = author); + } + } + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CoreServicesTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CoreServicesTest.cs index cad41c0c58..6329b4d23f 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CoreServicesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CoreServicesTest.cs @@ -1,261 +1,261 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.03 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Storage.CoreServicesModel; -using FieldInfo=Xtensive.Orm.Model.FieldInfo; - -namespace Xtensive.Orm.Tests.Storage.CoreServicesModel -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Value - { - get { return GetFieldValue("Value"); } - set - { - throw new InvalidOperationException(); - // SetFieldValue("Value", value); - } - } - - [Field] - public MyEntitySet Items { get; private set; } - - #region Custom business logic - - protected override void OnInitialize() - { - base.OnInitialize(); - throw new InvalidOperationException(); - } - - protected override void OnSettingFieldValue(FieldInfo field, object value) - { - base.OnSettingFieldValue(field, value); - throw new InvalidOperationException(); - } - - protected override void OnSetFieldValue(FieldInfo field, object oldValue, object newValue) - { - base.OnSetFieldValue(field, oldValue, newValue); - throw new InvalidOperationException(); - } - - protected override void OnRemoving() - { - base.OnRemoving(); - throw new InvalidOperationException(); - } - - protected override void OnRemove() - { - base.OnRemoving(); - throw new InvalidOperationException(); - } - - protected override void OnValidate() - { - base.OnValidate(); - throw new InvalidOperationException(); - } - - #endregion - - public MyEntity() - { - throw new InvalidOperationException(); - } - } - - [Serializable] - public class MyStructure : Structure - { - [Field] - public string Value - { - get { return GetFieldValue("Value"); } - set - { - throw new InvalidOperationException(); - // SetFieldValue("Value", value); - } - } - - #region Custom business logic - - protected override void OnInitialize() - { - base.OnInitialize(); - throw new InvalidOperationException(); - } - - protected override void OnSettingFieldValue(Xtensive.Orm.Model.FieldInfo field, object value) - { - base.OnSettingFieldValue(field, value); - throw new InvalidOperationException(); - } - - protected override void OnSetFieldValue(Xtensive.Orm.Model.FieldInfo field, object oldValue, object newValue) - { - base.OnSetFieldValue(field, oldValue, newValue); - throw new InvalidOperationException(); - } - - protected override void OnValidate() - { - base.OnValidate(); - throw new InvalidOperationException(); - } - - #endregion - - public MyStructure() - { - throw new InvalidOperationException(); - } - } - - public class MyEntitySet : EntitySet - where T : IEntity - { - - protected override void OnAdding(Entity item) - { - throw new InvalidOperationException(); - } - - protected override void OnAdd(Entity item) - { - throw new InvalidOperationException(); - } - - protected override void OnRemoving(Entity item) - { - throw new InvalidOperationException(); - } - - protected override void OnRemove(Entity item) - { - throw new InvalidOperationException(); - } - - protected override void OnClearing() - { - throw new InvalidOperationException(); - } - - protected override void OnClear() - { - throw new InvalidOperationException(); - } - - protected override void OnInitialize() - { - throw new InvalidOperationException(); - } - - public MyEntitySet(Entity owner, FieldInfo field) - : base(owner, field) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class CoreServicesTest : AutoBuildTest - { - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof(MyEntity).Namespace); - return config; - } - - [Test] - public void CreateInstanceTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var accessor = Session.Current.Services.Get(); - accessor.CreateEntity(typeof (MyEntity)); - accessor.CreateStructure(typeof (MyStructure)); - t.Complete(); - } - } - } - - [Test] - public void SetFieldTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var accessor = Session.Current.Services.Get(); - var myEntity = (MyEntity) accessor.CreateEntity(typeof (MyEntity)); - myEntity.Session.Services.Get().SetFieldValue(myEntity, myEntity.TypeInfo.Fields["Value"], "Value"); - Assert.AreEqual("Value", myEntity.Value); - var myStructure = (MyStructure) accessor.CreateStructure(typeof (MyStructure)); - myStructure.Session.Services.Get().SetFieldValue(myStructure, myStructure.TypeInfo.Fields["Value"], "Value"); - Assert.AreEqual("Value", myStructure.Value); - t.Complete(); - } - } - } - - [Test] - public void RemoveTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var accessor = Session.Current.Services.Get(); - MyEntity myEntity = (MyEntity)accessor.CreateEntity(typeof (MyEntity)); - Key key = myEntity.Key; - Assert.IsNotNull(session.Query.SingleOrDefault(key)); - myEntity.Session.Services.Get().Remove(myEntity); - Assert.AreEqual(PersistenceState.Removed, myEntity.PersistenceState); - Assert.IsNull(session.Query.SingleOrDefault(key)); - t.Complete(); - } - } - } - - [Test] - public void EntitySetTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var pa = Session.Current.Services.Get(); - MyEntity container = (MyEntity)pa.CreateEntity(typeof (MyEntity)); - MyEntity item1 = (MyEntity)pa.CreateEntity(typeof (MyEntity)); - MyEntity item2 = (MyEntity)pa.CreateEntity(typeof (MyEntity)); - - var entitySetAccessor = Session.Current.Services.Get(); - var field = container.TypeInfo.Fields["Items"]; - var entitySet = entitySetAccessor.GetEntitySet(container, field); - entitySetAccessor.Add(entitySet, item1); - entitySetAccessor.Add(entitySet, item2); - Assert.AreEqual(2, entitySet.Count); - entitySetAccessor.Remove(entitySet, item2); - Assert.AreEqual(1, entitySet.Count); - entitySetAccessor.Clear(entitySet); - Assert.AreEqual(0, entitySet.Count); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.03 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Storage.CoreServicesModel; +using FieldInfo=Xtensive.Orm.Model.FieldInfo; + +namespace Xtensive.Orm.Tests.Storage.CoreServicesModel +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Value + { + get { return GetFieldValue("Value"); } + set + { + throw new InvalidOperationException(); + // SetFieldValue("Value", value); + } + } + + [Field] + public MyEntitySet Items { get; private set; } + + #region Custom business logic + + protected override void OnInitialize() + { + base.OnInitialize(); + throw new InvalidOperationException(); + } + + protected override void OnSettingFieldValue(FieldInfo field, object value) + { + base.OnSettingFieldValue(field, value); + throw new InvalidOperationException(); + } + + protected override void OnSetFieldValue(FieldInfo field, object oldValue, object newValue) + { + base.OnSetFieldValue(field, oldValue, newValue); + throw new InvalidOperationException(); + } + + protected override void OnRemoving() + { + base.OnRemoving(); + throw new InvalidOperationException(); + } + + protected override void OnRemove() + { + base.OnRemoving(); + throw new InvalidOperationException(); + } + + protected override void OnValidate() + { + base.OnValidate(); + throw new InvalidOperationException(); + } + + #endregion + + public MyEntity() + { + throw new InvalidOperationException(); + } + } + + [Serializable] + public class MyStructure : Structure + { + [Field] + public string Value + { + get { return GetFieldValue("Value"); } + set + { + throw new InvalidOperationException(); + // SetFieldValue("Value", value); + } + } + + #region Custom business logic + + protected override void OnInitialize() + { + base.OnInitialize(); + throw new InvalidOperationException(); + } + + protected override void OnSettingFieldValue(Xtensive.Orm.Model.FieldInfo field, object value) + { + base.OnSettingFieldValue(field, value); + throw new InvalidOperationException(); + } + + protected override void OnSetFieldValue(Xtensive.Orm.Model.FieldInfo field, object oldValue, object newValue) + { + base.OnSetFieldValue(field, oldValue, newValue); + throw new InvalidOperationException(); + } + + protected override void OnValidate() + { + base.OnValidate(); + throw new InvalidOperationException(); + } + + #endregion + + public MyStructure() + { + throw new InvalidOperationException(); + } + } + + public class MyEntitySet : EntitySet + where T : IEntity + { + + protected override void OnAdding(Entity item) + { + throw new InvalidOperationException(); + } + + protected override void OnAdd(Entity item) + { + throw new InvalidOperationException(); + } + + protected override void OnRemoving(Entity item) + { + throw new InvalidOperationException(); + } + + protected override void OnRemove(Entity item) + { + throw new InvalidOperationException(); + } + + protected override void OnClearing() + { + throw new InvalidOperationException(); + } + + protected override void OnClear() + { + throw new InvalidOperationException(); + } + + protected override void OnInitialize() + { + throw new InvalidOperationException(); + } + + public MyEntitySet(Entity owner, FieldInfo field) + : base(owner, field) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class CoreServicesTest : AutoBuildTest + { + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof(MyEntity).Namespace); + return config; + } + + [Test] + public void CreateInstanceTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var accessor = Session.Current.Services.Get(); + accessor.CreateEntity(typeof (MyEntity)); + accessor.CreateStructure(typeof (MyStructure)); + t.Complete(); + } + } + } + + [Test] + public void SetFieldTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var accessor = Session.Current.Services.Get(); + var myEntity = (MyEntity) accessor.CreateEntity(typeof (MyEntity)); + myEntity.Session.Services.Get().SetFieldValue(myEntity, myEntity.TypeInfo.Fields["Value"], "Value"); + Assert.AreEqual("Value", myEntity.Value); + var myStructure = (MyStructure) accessor.CreateStructure(typeof (MyStructure)); + myStructure.Session.Services.Get().SetFieldValue(myStructure, myStructure.TypeInfo.Fields["Value"], "Value"); + Assert.AreEqual("Value", myStructure.Value); + t.Complete(); + } + } + } + + [Test] + public void RemoveTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var accessor = Session.Current.Services.Get(); + MyEntity myEntity = (MyEntity)accessor.CreateEntity(typeof (MyEntity)); + Key key = myEntity.Key; + Assert.IsNotNull(session.Query.SingleOrDefault(key)); + myEntity.Session.Services.Get().Remove(myEntity); + Assert.AreEqual(PersistenceState.Removed, myEntity.PersistenceState); + Assert.IsNull(session.Query.SingleOrDefault(key)); + t.Complete(); + } + } + } + + [Test] + public void EntitySetTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var pa = Session.Current.Services.Get(); + MyEntity container = (MyEntity)pa.CreateEntity(typeof (MyEntity)); + MyEntity item1 = (MyEntity)pa.CreateEntity(typeof (MyEntity)); + MyEntity item2 = (MyEntity)pa.CreateEntity(typeof (MyEntity)); + + var entitySetAccessor = Session.Current.Services.Get(); + var field = container.TypeInfo.Fields["Items"]; + var entitySet = entitySetAccessor.GetEntitySet(container, field); + entitySetAccessor.Add(entitySet, item1); + entitySetAccessor.Add(entitySet, item2); + Assert.AreEqual(2, entitySet.Count); + entitySetAccessor.Remove(entitySet, item2); + Assert.AreEqual(1, entitySet.Count); + entitySetAccessor.Clear(entitySet); + Assert.AreEqual(0, entitySet.Count); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CrossTransactionEntityAccessTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CrossTransactionEntityAccessTest.cs index c28db2a330..9d1cc079e2 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CrossTransactionEntityAccessTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CrossTransactionEntityAccessTest.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.01.30 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.TransactionsTestModel; - -namespace Xtensive.Orm.Tests.Storage -{ - public class CrossTransactionEntityAccessTest : TransactionsTestBase - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - var defaultSession = configuration.Sessions.Default; - defaultSession.Options = defaultSession.Options | SessionOptions.NonTransactionalReads; - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - Hexagon hexagon; - int kwanza; - StateLifetimeToken token; - using (var tx = session.OpenTransaction()) { - hexagon = new Hexagon(); - hexagon.IncreaseKwanza(); - kwanza = hexagon.Kwanza; - token = hexagon.State.LifetimeToken; - tx.Complete(); - } - - using (var tx = session.OpenTransaction()) { - AssertStateIsValid(hexagon); - Assert.That(hexagon.Kwanza, Is.EqualTo(kwanza)); - Assert.That(hexagon.State.LifetimeToken, Is.EqualTo(token)); - } - } - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.01.30 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.TransactionsTestModel; + +namespace Xtensive.Orm.Tests.Storage +{ + public class CrossTransactionEntityAccessTest : TransactionsTestBase + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + var defaultSession = configuration.Sessions.Default; + defaultSession.Options = defaultSession.Options | SessionOptions.NonTransactionalReads; + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + Hexagon hexagon; + int kwanza; + StateLifetimeToken token; + using (var tx = session.OpenTransaction()) { + hexagon = new Hexagon(); + hexagon.IncreaseKwanza(); + kwanza = hexagon.Kwanza; + token = hexagon.State.LifetimeToken; + tx.Complete(); + } + + using (var tx = session.OpenTransaction()) { + AssertStateIsValid(hexagon); + Assert.That(hexagon.Kwanza, Is.EqualTo(kwanza)); + Assert.That(hexagon.State.LifetimeToken, Is.EqualTo(token)); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CurrentSessionResolverTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CurrentSessionResolverTest.cs index 333e5d199d..e0f8768b78 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CurrentSessionResolverTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CurrentSessionResolverTest.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.07.20 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class CurrentSessionResolverTest - { - [TearDown] - public void TearDown() - { - Session.Resolver = null; - } - - [Test] - public void Tests() - { - var config = DomainConfigurationFactory.Create(); - config.Sessions[WellKnown.Sessions.Default].Options = SessionOptions.ServerProfile; - - using (var domain = Domain.Build(config)) - using (var session = domain.OpenSession()) { - - bool isSessionActive = false; - int resolveCount = 0; - - Session.Resolver = () => { - resolveCount++; - return isSessionActive ? session : null; - }; - - Assert.IsNull(Session.Current); - - Assert.AreEqual(1, resolveCount); - Assert.IsFalse(session.IsActive); - Assert.AreEqual(2, resolveCount); - - isSessionActive = true; - - Assert.AreEqual(session, Session.Current); - Assert.AreEqual(3, resolveCount); - Assert.IsTrue(session.IsActive); - Assert.AreEqual(4, resolveCount); - - isSessionActive = false; - - using (session.Activate()) { - Assert.AreEqual(session, Session.Current); - Assert.IsTrue(session.IsActive); - } - - Assert.AreEqual(4, resolveCount); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.07.20 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class CurrentSessionResolverTest + { + [TearDown] + public void TearDown() + { + Session.Resolver = null; + } + + [Test] + public void Tests() + { + var config = DomainConfigurationFactory.Create(); + config.Sessions[WellKnown.Sessions.Default].Options = SessionOptions.ServerProfile; + + using (var domain = Domain.Build(config)) + using (var session = domain.OpenSession()) { + + bool isSessionActive = false; + int resolveCount = 0; + + Session.Resolver = () => { + resolveCount++; + return isSessionActive ? session : null; + }; + + Assert.IsNull(Session.Current); + + Assert.AreEqual(1, resolveCount); + Assert.IsFalse(session.IsActive); + Assert.AreEqual(2, resolveCount); + + isSessionActive = true; + + Assert.AreEqual(session, Session.Current); + Assert.AreEqual(3, resolveCount); + Assert.IsTrue(session.IsActive); + Assert.AreEqual(4, resolveCount); + + isSessionActive = false; + + using (session.Activate()) { + Assert.AreEqual(session, Session.Current); + Assert.IsTrue(session.IsActive); + } + + Assert.AreEqual(4, resolveCount); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CustomCollationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CustomCollationTest.cs index a4ac24ce07..6dfd4a27c1 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CustomCollationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CustomCollationTest.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.05 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.CustomCollationTestModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace CustomCollationTestModel - { - [HierarchyRoot] - public class Collated : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field(Indexed = true)] - public string Name { get; set; } - } - } - - public class CustomCollationTest : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.Sqlite, "SQLite specific collation used"); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Collation = "StringComparer_InvariantCulture_IgnoreCase"; - configuration.Types.Register(typeof (Collated)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - CreateEntities(); - - var expected = new[] { - "bye", "bye", "hello", "hello", - "пока", "пока", "привет", "привет" - }; - - var actual = session.Query.All() - .OrderBy(c => c.Name) - .AsEnumerable() - .Select(c => c.Name.ToLowerInvariant()) - .ToArray(); - - Assert.That(actual.SequenceEqual(expected)); - } - } - - private static void CreateEntities() - { - new Collated {Name = "hello"}; - new Collated {Name = "привет"}; - new Collated {Name = "bye"}; - new Collated {Name = "пока"}; - - new Collated {Name = "Hello"}; - new Collated {Name = "Привет"}; - new Collated {Name = "Bye"}; - new Collated {Name = "Пока"}; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.05 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.CustomCollationTestModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace CustomCollationTestModel + { + [HierarchyRoot] + public class Collated : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field(Indexed = true)] + public string Name { get; set; } + } + } + + public class CustomCollationTest : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.Sqlite, "SQLite specific collation used"); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Collation = "StringComparer_InvariantCulture_IgnoreCase"; + configuration.Types.Register(typeof (Collated)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + CreateEntities(); + + var expected = new[] { + "bye", "bye", "hello", "hello", + "пока", "пока", "привет", "привет" + }; + + var actual = session.Query.All() + .OrderBy(c => c.Name) + .AsEnumerable() + .Select(c => c.Name.ToLowerInvariant()) + .ToArray(); + + Assert.That(actual.SequenceEqual(expected)); + } + } + + private static void CreateEntities() + { + new Collated {Name = "hello"}; + new Collated {Name = "привет"}; + new Collated {Name = "bye"}; + new Collated {Name = "пока"}; + + new Collated {Name = "Hello"}; + new Collated {Name = "Привет"}; + new Collated {Name = "Bye"}; + new Collated {Name = "Пока"}; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CustomEntityConnectionTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CustomEntityConnectionTest.cs index 95cdf784f4..300e8d4c72 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CustomEntityConnectionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CustomEntityConnectionTest.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.03.15 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.CustomEntityConnectionModel; - -namespace Xtensive.Orm.Tests.Storage.CustomEntityConnectionModel -{ - [HierarchyRoot] - public class Book : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, Association(PairTo = "Right", - OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Links { get; private set; } - } - - [HierarchyRoot] - public class Author : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field, Association(PairTo = "Left", - OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Links { get; private set; } - } - - public abstract class Link : Entity - where TLeft : IEntity - where TRight : IEntity - { - [Key(0), Field] - public TLeft Left { get; private set; } - - [Key(1), Field] - public TRight Right { get; private set; } - - public Link(TLeft left, TRight right) - : base(left, right) - { - } - } - - [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] - public class AuthorBookLink : Link - { - [Field] - public string Comment { get; set; } - - public AuthorBookLink(Author left, Book right) - : base(left, right) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class CustomEntityConnectionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); - return configuration; - } - - [Test] - public void CombinedTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var book = new Book(); - var author = new Author(); - new AuthorBookLink(author, book); - // Session.Current.Persist(); - Assert.AreEqual(1, book.Links.Count); - Assert.AreEqual(1, author.Links.Count); - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.03.15 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.CustomEntityConnectionModel; + +namespace Xtensive.Orm.Tests.Storage.CustomEntityConnectionModel +{ + [HierarchyRoot] + public class Book : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, Association(PairTo = "Right", + OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Links { get; private set; } + } + + [HierarchyRoot] + public class Author : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field, Association(PairTo = "Left", + OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] + public EntitySet Links { get; private set; } + } + + public abstract class Link : Entity + where TLeft : IEntity + where TRight : IEntity + { + [Key(0), Field] + public TLeft Left { get; private set; } + + [Key(1), Field] + public TRight Right { get; private set; } + + public Link(TLeft left, TRight right) + : base(left, right) + { + } + } + + [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] + public class AuthorBookLink : Link + { + [Field] + public string Comment { get; set; } + + public AuthorBookLink(Author left, Book right) + : base(left, right) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class CustomEntityConnectionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Book).Assembly, typeof (Book).Namespace); + return configuration; + } + + [Test] + public void CombinedTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var book = new Book(); + var author = new Author(); + new AuthorBookLink(author, book); + // Session.Current.Persist(); + Assert.AreEqual(1, book.Links.Count); + Assert.AreEqual(1, author.Links.Count); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CustomEntitySetTest.cs b/Orm/Xtensive.Orm.Tests/Storage/CustomEntitySetTest.cs index 09bda0635b..7487777e4b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CustomEntitySetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CustomEntitySetTest.cs @@ -1,85 +1,85 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.11.07 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Storage.CustomEntitySetModel; - -namespace Xtensive.Orm.Tests.Storage.CustomEntitySetModel -{ - [Serializable] - [HierarchyRoot] - public class Root : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - [Serializable] - public class Master : Root - { - [Field] - public CustomEntitySet ZeroToMany { get; private set; } - - [Field] - public CustomEntitySet OneToMany { get; private set; } - - [Field] - public CustomEntitySet ManyToMany { get; private set; } - } - - [Serializable] - public class Slave : Root - { - [Field, Association(PairTo = "OneToMany")] - public Master ManyToOne { get; set; } - - [Field, Association(PairTo = "ManyToMany")] - public CustomEntitySet ManyToMany { get; private set; } - } - - public class CustomEntitySet : EntitySet - where T : Entity - { - public CustomEntitySet(Entity owner, FieldInfo field) - : base(owner, field) - { - } - } -} - - -namespace Xtensive.Orm.Tests.Storage -{ - public class CustomEntitySetTest : AutoBuildTest - { - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); - return config; - } - - [Test] - public void Maintest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Master m = new Master(); - - m.ManyToMany.Add(new Slave()); - Assert.AreEqual(1, m.ManyToMany.Count); - - m.ManyToMany.Add(new Slave()); - Assert.AreEqual(2, m.ManyToMany.Count); - - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.11.07 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Storage.CustomEntitySetModel; + +namespace Xtensive.Orm.Tests.Storage.CustomEntitySetModel +{ + [Serializable] + [HierarchyRoot] + public class Root : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + [Serializable] + public class Master : Root + { + [Field] + public CustomEntitySet ZeroToMany { get; private set; } + + [Field] + public CustomEntitySet OneToMany { get; private set; } + + [Field] + public CustomEntitySet ManyToMany { get; private set; } + } + + [Serializable] + public class Slave : Root + { + [Field, Association(PairTo = "OneToMany")] + public Master ManyToOne { get; set; } + + [Field, Association(PairTo = "ManyToMany")] + public CustomEntitySet ManyToMany { get; private set; } + } + + public class CustomEntitySet : EntitySet + where T : Entity + { + public CustomEntitySet(Entity owner, FieldInfo field) + : base(owner, field) + { + } + } +} + + +namespace Xtensive.Orm.Tests.Storage +{ + public class CustomEntitySetTest : AutoBuildTest + { + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Master).Assembly, typeof (Master).Namespace); + return config; + } + + [Test] + public void Maintest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Master m = new Master(); + + m.ManyToMany.Add(new Slave()); + Assert.AreEqual(1, m.ManyToMany.Count); + + m.ManyToMany.Add(new Slave()); + Assert.AreEqual(2, m.ManyToMany.Count); + + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/CustomMetadataUpgrade.cs b/Orm/Xtensive.Orm.Tests/Storage/CustomMetadataUpgrade.cs index be95f002c6..b105da258f 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/CustomMetadataUpgrade.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/CustomMetadataUpgrade.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.29 - -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Metadata; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class CustomMetadataUpgrade - { - [Test] - public void MainTest() - { - var name = "CustomExtension"; - var text = "Hello world"; - var data = new[] {(byte) 1, (byte) 100}; - - using (var initialDomain = BuildDomain(DomainUpgradeMode.Recreate)) - using (var session = initialDomain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new Extension(name) {Text = text, Data = data}; - tx.Complete(); - } - - using (var upgradedDomain = BuildDomain(DomainUpgradeMode.PerformSafely)) - using (var session = upgradedDomain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var extension = session.Query.All().FirstOrDefault(e => e.Name==name); - Assert.That(extension, Is.Not.Null); - Assert.That(extension.Text, Is.EqualTo(text)); - Assert.That(extension.Data, Is.EquivalentTo(data)); - tx.Complete(); - } - } - - private Domain BuildDomain(DomainUpgradeMode mode) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = mode; - return Domain.Build(configuration); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.29 + +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Metadata; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class CustomMetadataUpgrade + { + [Test] + public void MainTest() + { + var name = "CustomExtension"; + var text = "Hello world"; + var data = new[] {(byte) 1, (byte) 100}; + + using (var initialDomain = BuildDomain(DomainUpgradeMode.Recreate)) + using (var session = initialDomain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new Extension(name) {Text = text, Data = data}; + tx.Complete(); + } + + using (var upgradedDomain = BuildDomain(DomainUpgradeMode.PerformSafely)) + using (var session = upgradedDomain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var extension = session.Query.All().FirstOrDefault(e => e.Name==name); + Assert.That(extension, Is.Not.Null); + Assert.That(extension.Text, Is.EqualTo(text)); + Assert.That(extension.Data, Is.EquivalentTo(data)); + tx.Complete(); + } + } + + private Domain BuildDomain(DomainUpgradeMode mode) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = mode; + return Domain.Build(configuration); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DataErrorInfo.cs b/Orm/Xtensive.Orm.Tests/Storage/DataErrorInfo.cs index 034668e3dc..9678e5f01c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DataErrorInfo.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DataErrorInfo.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.09.17 - -using System; -using System.ComponentModel; -using NUnit.Framework; -using Xtensive.Orm.Validation; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DataErrorInfoTestModel; - -namespace Xtensive.Orm.Tests.Storage.DataErrorInfoTestModel -{ - [Serializable] - [HierarchyRoot] - public class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - [NotNullConstraint] - public string Name { get; set; } - - [Field] - [RangeConstraint(Min = 1)] - public int Age { get; set; } - - public bool IsValid { get; set; } - - protected override void OnValidate() - { - if (!IsValid) - throw new InvalidOperationException("Person is invalid."); - } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class DataErrorInfoTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var person = new Person(); - var personErrorInfo = ((IDataErrorInfo) person); - - Assert.AreEqual("Person is invalid.", personErrorInfo.Error); - Assert.AreEqual("Value should not be null.", personErrorInfo["Name"]); - Assert.AreEqual("Value should not be less than 1.", personErrorInfo["Age"]); - - person.Name = "Alex"; - person.Age = 26; - person.IsValid = true; - session.ValidateAndGetErrors(); - Assert.AreEqual(string.Empty, personErrorInfo.Error); - Assert.AreEqual(string.Empty, personErrorInfo["Name"]); - Assert.AreEqual(string.Empty, personErrorInfo["Age"]); - - person.Age = -1; - session.ValidateAndGetErrors(); - Assert.AreEqual("Value should not be less than 1.", personErrorInfo["Age"]); - - AssertEx.Throws(session.Validate); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.09.17 + +using System; +using System.ComponentModel; +using NUnit.Framework; +using Xtensive.Orm.Validation; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DataErrorInfoTestModel; + +namespace Xtensive.Orm.Tests.Storage.DataErrorInfoTestModel +{ + [Serializable] + [HierarchyRoot] + public class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + [NotNullConstraint] + public string Name { get; set; } + + [Field] + [RangeConstraint(Min = 1)] + public int Age { get; set; } + + public bool IsValid { get; set; } + + protected override void OnValidate() + { + if (!IsValid) + throw new InvalidOperationException("Person is invalid."); + } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class DataErrorInfoTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Person).Assembly, typeof (Person).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var person = new Person(); + var personErrorInfo = ((IDataErrorInfo) person); + + Assert.AreEqual("Person is invalid.", personErrorInfo.Error); + Assert.AreEqual("Value should not be null.", personErrorInfo["Name"]); + Assert.AreEqual("Value should not be less than 1.", personErrorInfo["Age"]); + + person.Name = "Alex"; + person.Age = 26; + person.IsValid = true; + session.ValidateAndGetErrors(); + Assert.AreEqual(string.Empty, personErrorInfo.Error); + Assert.AreEqual(string.Empty, personErrorInfo["Name"]); + Assert.AreEqual(string.Empty, personErrorInfo["Age"]); + + person.Age = -1; + session.ValidateAndGetErrors(); + Assert.AreEqual("Value should not be less than 1.", personErrorInfo["Age"]); + + AssertEx.Throws(session.Validate); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DirectSqlTest.cs b/Orm/Xtensive.Orm.Tests/Storage/DirectSqlTest.cs index bf20e0d387..a950aef90b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DirectSqlTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DirectSqlTest.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.29 - -using System; -using System.Data.Common; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; - -namespace Xtensive.Orm.Tests.Storage -{ - public class DirectSqlTest : AutoBuildTest - { - [HierarchyRoot] - public class Article : Entity - { - [Field, Key] - public int Id {get; private set;} - [Field] - public string Title { get; set; } - [Field] - public string Content { get; set; } - } - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - for (int i = 0; i < 20; i++) { - new Article() { - Title = "Title " + i, - Content = " Content " + i - }; - } - t.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Article)); - return config; - } - - [Test] - public void SqlStorageTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - - using (var session = Domain.OpenSession()) { - var directSql = session.Services.Demand(); - Assert.IsNull(directSql.Transaction); - - using (var t = session.OpenTransaction()) { - var article = new Article {Title = "Some title", Content = "Some content"}; - session.SaveChanges(); - - // Now both are definitely not null - Assert.IsNotNull(directSql.Connection); - Assert.IsNotNull(directSql.Transaction); - - var command = session.Services.Demand().CreateCommand(); - command.CommandText = "DELETE FROM [dbo].[DirectSqlTest.Article];"; - command.ExecuteNonQuery(); - - // Cache invalidation (~ like on rollback, but w/o rollback) - DirectStateAccessor.Get(session).Invalidate(); - - var anotherArticle = new Article { Title = "Another title", Content = "Another content" }; - session.SaveChanges(); - - AssertEx.ThrowsInvalidOperationException(() => Assert.IsNotNull(article.Content)); - Assert.AreEqual(1, session.Query.All
().Count()); - Assert.IsNotNull(anotherArticle.Content); - t.Complete(); - } - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.29 + +using System; +using System.Data.Common; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Tests.Storage +{ + public class DirectSqlTest : AutoBuildTest + { + [HierarchyRoot] + public class Article : Entity + { + [Field, Key] + public int Id {get; private set;} + [Field] + public string Title { get; set; } + [Field] + public string Content { get; set; } + } + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + for (int i = 0; i < 20; i++) { + new Article() { + Title = "Title " + i, + Content = " Content " + i + }; + } + t.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Article)); + return config; + } + + [Test] + public void SqlStorageTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + + using (var session = Domain.OpenSession()) { + var directSql = session.Services.Demand(); + Assert.IsNull(directSql.Transaction); + + using (var t = session.OpenTransaction()) { + var article = new Article {Title = "Some title", Content = "Some content"}; + session.SaveChanges(); + + // Now both are definitely not null + Assert.IsNotNull(directSql.Connection); + Assert.IsNotNull(directSql.Transaction); + + var command = session.Services.Demand().CreateCommand(); + command.CommandText = "DELETE FROM [dbo].[DirectSqlTest.Article];"; + command.ExecuteNonQuery(); + + // Cache invalidation (~ like on rollback, but w/o rollback) + DirectStateAccessor.Get(session).Invalidate(); + + var anotherArticle = new Article { Title = "Another title", Content = "Another content" }; + session.SaveChanges(); + + AssertEx.ThrowsInvalidOperationException(() => Assert.IsNotNull(article.Content)); + Assert.AreEqual(1, session.Query.All
().Count()); + Assert.IsNotNull(anotherArticle.Content); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DisableIndexOnReferenceFieldTest.cs b/Orm/Xtensive.Orm.Tests/Storage/DisableIndexOnReferenceFieldTest.cs index e9f2dc1bd7..eaa54e3a57 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DisableIndexOnReferenceFieldTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DisableIndexOnReferenceFieldTest.cs @@ -1,191 +1,191 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.10.05 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Storage.DisableIndexOnReferenceFieldTestModel; - -namespace Xtensive.Orm.Tests.Storage.DisableIndexOnReferenceFieldTestModel -{ - public interface IReference : IEntity - { - [Field(Indexed = false)] - TestTarget Target { get; set; } - } - - public class ReferenceContainer1 : Structure - { - [Field(Indexed = false)] - public TestTarget Target { get; set; } - } - - public class ReferenceContainer2 : Structure - { - [Field] - public ReferenceContainer1 Container1 { get; set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] - public class TestClassTable : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field(Indexed = false)] - public TestTarget Target { get; set; } - } - - public class TestClassTableChild : TestClassTable - { - [Field] - public string Title { get; set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - public class TestSingleTable : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field(Indexed = false)] - public TestTarget Target { get; set; } - } - - public class TestSingleTableChild : TestSingleTable - { - [Field] - public string Title { get; set; } - } - - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] - public class TestConcreteTable : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public string Name { get; set; } - - [Field(Indexed = false)] - public TestTarget Target { get; set; } - } - - public class TestConcreteTableChild : TestConcreteTable - { - [Field] - public string Title { get; set; } - } - - [HierarchyRoot] - public class TestContainer : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public ReferenceContainer1 Container1 { get; set; } - - [Field] - public ReferenceContainer2 Container2 { get; set; } - } - - [HierarchyRoot] - public class TestImplementNonIndexedField : Entity, IReference - { - [Field, Key] - public int Id { get; private set; } - - // Due to DO-203 applying [Field] resets Indexed = false setting. - // [Field] - public TestTarget Target { get; set; } - } - - [HierarchyRoot] - public class TestAddIndexToImplementedNonIndexedField : Entity, IReference - { - [Field, Key] - public int Id { get; private set; } - - [Field(Indexed = true)] - public TestTarget Target { get; set; } - } - - [HierarchyRoot] - public class TestTarget : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class DisableIndexOnReferenceFieldTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (TestTarget).Assembly, typeof (TestTarget).Namespace); - return config; - } - - private List GetIndexes(Type type) - { - return Domain.Model.Types[type].Indexes - .Where(i => i.IsSecondary && i.KeyColumns.Any(c => c.Key.Name.Contains("Target"))) - .ToList(); - } - - [Test] - public void ClassTableTest() - { - Assert.IsEmpty(GetIndexes(typeof (TestClassTable))); - Assert.IsEmpty(GetIndexes(typeof(TestClassTableChild))); - } - - [Test] - public void SingleTableTest() - { - Assert.IsEmpty(GetIndexes(typeof(TestSingleTable))); - Assert.IsEmpty(GetIndexes(typeof(TestSingleTableChild))); - } - - [Test] - public void ConcreteTableTest() - { - Assert.IsEmpty(GetIndexes(typeof(TestConcreteTable))); - Assert.IsEmpty(GetIndexes(typeof(TestConcreteTableChild))); - } - - [Test] - public void ImplementNonIndexedFieldTest() - { - Assert.IsEmpty(GetIndexes(typeof(TestImplementNonIndexedField))); - } - - [Test] - public void AddIndexToImplementedNonIndexedFieldTest() - { - Assert.IsNotEmpty(GetIndexes(typeof (TestAddIndexToImplementedNonIndexedField))); - } - - [Test] - public void StructureTest() - { - Assert.IsEmpty(GetIndexes(typeof(TestContainer))); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.10.05 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Storage.DisableIndexOnReferenceFieldTestModel; + +namespace Xtensive.Orm.Tests.Storage.DisableIndexOnReferenceFieldTestModel +{ + public interface IReference : IEntity + { + [Field(Indexed = false)] + TestTarget Target { get; set; } + } + + public class ReferenceContainer1 : Structure + { + [Field(Indexed = false)] + public TestTarget Target { get; set; } + } + + public class ReferenceContainer2 : Structure + { + [Field] + public ReferenceContainer1 Container1 { get; set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ClassTable)] + public class TestClassTable : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field(Indexed = false)] + public TestTarget Target { get; set; } + } + + public class TestClassTableChild : TestClassTable + { + [Field] + public string Title { get; set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + public class TestSingleTable : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field(Indexed = false)] + public TestTarget Target { get; set; } + } + + public class TestSingleTableChild : TestSingleTable + { + [Field] + public string Title { get; set; } + } + + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] + public class TestConcreteTable : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string Name { get; set; } + + [Field(Indexed = false)] + public TestTarget Target { get; set; } + } + + public class TestConcreteTableChild : TestConcreteTable + { + [Field] + public string Title { get; set; } + } + + [HierarchyRoot] + public class TestContainer : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public ReferenceContainer1 Container1 { get; set; } + + [Field] + public ReferenceContainer2 Container2 { get; set; } + } + + [HierarchyRoot] + public class TestImplementNonIndexedField : Entity, IReference + { + [Field, Key] + public int Id { get; private set; } + + // Due to DO-203 applying [Field] resets Indexed = false setting. + // [Field] + public TestTarget Target { get; set; } + } + + [HierarchyRoot] + public class TestAddIndexToImplementedNonIndexedField : Entity, IReference + { + [Field, Key] + public int Id { get; private set; } + + [Field(Indexed = true)] + public TestTarget Target { get; set; } + } + + [HierarchyRoot] + public class TestTarget : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class DisableIndexOnReferenceFieldTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (TestTarget).Assembly, typeof (TestTarget).Namespace); + return config; + } + + private List GetIndexes(Type type) + { + return Domain.Model.Types[type].Indexes + .Where(i => i.IsSecondary && i.KeyColumns.Any(c => c.Key.Name.Contains("Target"))) + .ToList(); + } + + [Test] + public void ClassTableTest() + { + Assert.IsEmpty(GetIndexes(typeof (TestClassTable))); + Assert.IsEmpty(GetIndexes(typeof(TestClassTableChild))); + } + + [Test] + public void SingleTableTest() + { + Assert.IsEmpty(GetIndexes(typeof(TestSingleTable))); + Assert.IsEmpty(GetIndexes(typeof(TestSingleTableChild))); + } + + [Test] + public void ConcreteTableTest() + { + Assert.IsEmpty(GetIndexes(typeof(TestConcreteTable))); + Assert.IsEmpty(GetIndexes(typeof(TestConcreteTableChild))); + } + + [Test] + public void ImplementNonIndexedFieldTest() + { + Assert.IsEmpty(GetIndexes(typeof(TestImplementNonIndexedField))); + } + + [Test] + public void AddIndexToImplementedNonIndexedFieldTest() + { + Assert.IsNotEmpty(GetIndexes(typeof (TestAddIndexToImplementedNonIndexedField))); + } + + [Test] + public void StructureTest() + { + Assert.IsEmpty(GetIndexes(typeof(TestContainer))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DisableSaveChangesTest.cs b/Orm/Xtensive.Orm.Tests/Storage/DisableSaveChangesTest.cs index a038d390ef..8c6fa7b6be 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DisableSaveChangesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DisableSaveChangesTest.cs @@ -1,278 +1,278 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.11 - -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using System; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DisableSaveChangesTestModel; - -namespace Xtensive.Orm.Tests.Storage.DisableSaveChangesTestModel -{ - [Serializable] - [HierarchyRoot] - public class Killer : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public int Frags { get; private set; } - - [Field, Association(PairTo = "Killer", OnTargetRemove = OnRemoveAction.Clear)] - private EntitySet Victims { get; set; } - - public void Kill(Victim victim) - { - if (Victims.Add(victim)) - Frags++; - } - } - - [Serializable] - [HierarchyRoot] - public class Victim : Entity - { - [Key, Field] - public int Id { get; private set; } - - public bool IsAlive { get { return Killer==null; } } - - [Field] - public Killer Killer { - get { return GetFieldValue("Killer"); } - private set { - KillDate = value==null ? (DateTime?) null : Transaction.Current.TimeStamp; - SetFieldValue("Killer", value); - } - } - - [Field] - public DateTime? KillDate { get; private set; } - - public void Resurrect() - { - if (IsAlive) - throw new InvalidOperationException("Is not dead yet"); - Killer = null; - } - } - - [Serializable] - [HierarchyRoot] - public class Node : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public EntitySet Children { get; private set; } - - [Field] - public int Tag { get; set; } - - [Field, Association(PairTo = "Children", - OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] - public Node Parent { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class DisableSaveChangesTest : AutoBuildTest - { - private List allTrees; - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Victim).Assembly, typeof (Victim).Namespace); - return configuration; - } - - [Test] - public void DisableAllTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var victim = new Victim(); - var count = session.Query.All().Count(); - using (session.DisableSaveChanges()) { - var anotherVictim = new Victim(); - var newCount = session.Query.All().Count(); - Assert.AreEqual(count, newCount); - session.SaveChanges(); - var newestCount = session.Query.All().Count(); - Assert.AreEqual(count + 1, newestCount); - } - } - } - - [Test] - public void DisableAllCommitTest() - { - Assert.Throws(() => { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var victim = new Victim(); - var count = session.Query.All().Count(); - session.DisableSaveChanges(); - - var anotherVictim = new Victim(); - var newCount = session.Query.All().Count(); - Assert.AreEqual(count, newCount); - t.Complete(); - } - }); - } - - [Test] - public void SimplePinTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var butcher = new Killer(); - var firstVictim = new Victim(); - // "Killers" who have not killed yet should not be considered as killers - using (session.DisableSaveChanges(butcher)) { - session.SaveChanges(); - Assert.AreEqual(PersistenceState.New, butcher.PersistenceState); - Assert.AreEqual(PersistenceState.Synchronized, firstVictim.PersistenceState); - butcher.Kill(firstVictim); - session.SaveChanges(); - Assert.AreEqual(PersistenceState.New, butcher.PersistenceState); - Assert.AreEqual(PersistenceState.Modified, firstVictim.PersistenceState); - } - session.SaveChanges(); - using (session.DisableSaveChanges(butcher)) { - firstVictim.Resurrect(); - var secondVictim = new Victim(); - butcher.Kill(secondVictim); - session.SaveChanges(); - Assert.AreEqual(PersistenceState.Modified, butcher.PersistenceState); - Assert.AreEqual(PersistenceState.Synchronized, firstVictim.PersistenceState); - Assert.AreEqual(PersistenceState.Synchronized, secondVictim.PersistenceState); - } - } - } - - [Test] - public void PinGraphsTest() - { - try { - allTrees = new List(); - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var node = T(T(), T(), T(T())); - using (session.DisableSaveChanges(node)) { - AssertNumberOfNodesInDatabaseIs(0); - foreach (var item in allTrees) - Assert.AreEqual(PersistenceState.New, item.PersistenceState); - } - session.SaveChanges(); - AssertNumberOfNodesInDatabaseIs(allTrees.Count); - using (session.DisableSaveChanges(node)) { - foreach (var item in allTrees) - item.Tag++; - session.SaveChanges(); - Assert.AreEqual(PersistenceState.Modified, node.PersistenceState); - foreach (var item in allTrees.Where(item => item!=node)) - Assert.AreEqual(PersistenceState.Synchronized, item.PersistenceState); - } - session.SaveChanges(); - var newNode = T(node); - using (session.DisableSaveChanges(newNode)) { - AssertNumberOfNodesInDatabaseIs(allTrees.Count - 1); - Assert.AreEqual(PersistenceState.New, newNode.PersistenceState); - Assert.AreEqual(PersistenceState.Modified, node.PersistenceState); - foreach (var item in allTrees.Where(item => item!=newNode && item!=node)) - Assert.AreEqual(PersistenceState.Synchronized, item.PersistenceState); - } - session.SaveChanges(); - AssertNumberOfNodesInDatabaseIs(allTrees.Count); - var cycledNode = T(); - cycledNode.Parent = cycledNode; - using (session.DisableSaveChanges(cycledNode)) { - AssertNumberOfNodesInDatabaseIs(allTrees.Count - 1); - } - session.SaveChanges(); - var cycledGraph = T(T(T(cycledNode))); - cycledGraph.Parent = cycledNode; - using (session.DisableSaveChanges(cycledGraph)) { - AssertNumberOfNodesInDatabaseIs(allTrees.Count - 3); - Assert.AreEqual(PersistenceState.Modified, cycledNode.PersistenceState); - } - session.SaveChanges(); - } - } - finally { - allTrees = null; - } - } - - [Test] - public void NestedPinTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var victim = new Victim(); - using (session.DisableSaveChanges(victim)) - Assert.IsNull(session.DisableSaveChanges(victim)); - } - } - - [Test] - public void PinRemovedEntityTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var victim = new Victim(); - victim.Remove(); - AssertEx.ThrowsInvalidOperationException(() => session.DisableSaveChanges(victim)); - } - } - - [Test] - public void CommittingWithPinnedEntityTest() - { - using (var session = Domain.OpenSession()) - using (var transactionScope = session.OpenTransaction()) { - var victim = new Victim(); - using (session.DisableSaveChanges(victim)) { - transactionScope.Complete(); - AssertEx.ThrowsInvalidOperationException(transactionScope.Dispose); - } - } - } - - [Test] - public void OpenNestedTransactionWithPinnedEntityTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var victim = new Victim(); - using (session.DisableSaveChanges(victim)) - AssertEx.ThrowsInvalidOperationException(() => session.OpenTransaction(TransactionOpenMode.New)); - } - } - - private static void AssertNumberOfNodesInDatabaseIs(int expected) - { - var actual = Session.Demand().Query.All().Count(); - Assert.AreEqual(expected, actual); - } - - private Node T(params Node[] children) - { - var result = new Node(); - allTrees.Add(result); - result.Children.AddRange(children); - return result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.11 + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using System; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DisableSaveChangesTestModel; + +namespace Xtensive.Orm.Tests.Storage.DisableSaveChangesTestModel +{ + [Serializable] + [HierarchyRoot] + public class Killer : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public int Frags { get; private set; } + + [Field, Association(PairTo = "Killer", OnTargetRemove = OnRemoveAction.Clear)] + private EntitySet Victims { get; set; } + + public void Kill(Victim victim) + { + if (Victims.Add(victim)) + Frags++; + } + } + + [Serializable] + [HierarchyRoot] + public class Victim : Entity + { + [Key, Field] + public int Id { get; private set; } + + public bool IsAlive { get { return Killer==null; } } + + [Field] + public Killer Killer { + get { return GetFieldValue("Killer"); } + private set { + KillDate = value==null ? (DateTime?) null : Transaction.Current.TimeStamp; + SetFieldValue("Killer", value); + } + } + + [Field] + public DateTime? KillDate { get; private set; } + + public void Resurrect() + { + if (IsAlive) + throw new InvalidOperationException("Is not dead yet"); + Killer = null; + } + } + + [Serializable] + [HierarchyRoot] + public class Node : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public EntitySet Children { get; private set; } + + [Field] + public int Tag { get; set; } + + [Field, Association(PairTo = "Children", + OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Cascade)] + public Node Parent { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class DisableSaveChangesTest : AutoBuildTest + { + private List allTrees; + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Victim).Assembly, typeof (Victim).Namespace); + return configuration; + } + + [Test] + public void DisableAllTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var victim = new Victim(); + var count = session.Query.All().Count(); + using (session.DisableSaveChanges()) { + var anotherVictim = new Victim(); + var newCount = session.Query.All().Count(); + Assert.AreEqual(count, newCount); + session.SaveChanges(); + var newestCount = session.Query.All().Count(); + Assert.AreEqual(count + 1, newestCount); + } + } + } + + [Test] + public void DisableAllCommitTest() + { + Assert.Throws(() => { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var victim = new Victim(); + var count = session.Query.All().Count(); + session.DisableSaveChanges(); + + var anotherVictim = new Victim(); + var newCount = session.Query.All().Count(); + Assert.AreEqual(count, newCount); + t.Complete(); + } + }); + } + + [Test] + public void SimplePinTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var butcher = new Killer(); + var firstVictim = new Victim(); + // "Killers" who have not killed yet should not be considered as killers + using (session.DisableSaveChanges(butcher)) { + session.SaveChanges(); + Assert.AreEqual(PersistenceState.New, butcher.PersistenceState); + Assert.AreEqual(PersistenceState.Synchronized, firstVictim.PersistenceState); + butcher.Kill(firstVictim); + session.SaveChanges(); + Assert.AreEqual(PersistenceState.New, butcher.PersistenceState); + Assert.AreEqual(PersistenceState.Modified, firstVictim.PersistenceState); + } + session.SaveChanges(); + using (session.DisableSaveChanges(butcher)) { + firstVictim.Resurrect(); + var secondVictim = new Victim(); + butcher.Kill(secondVictim); + session.SaveChanges(); + Assert.AreEqual(PersistenceState.Modified, butcher.PersistenceState); + Assert.AreEqual(PersistenceState.Synchronized, firstVictim.PersistenceState); + Assert.AreEqual(PersistenceState.Synchronized, secondVictim.PersistenceState); + } + } + } + + [Test] + public void PinGraphsTest() + { + try { + allTrees = new List(); + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var node = T(T(), T(), T(T())); + using (session.DisableSaveChanges(node)) { + AssertNumberOfNodesInDatabaseIs(0); + foreach (var item in allTrees) + Assert.AreEqual(PersistenceState.New, item.PersistenceState); + } + session.SaveChanges(); + AssertNumberOfNodesInDatabaseIs(allTrees.Count); + using (session.DisableSaveChanges(node)) { + foreach (var item in allTrees) + item.Tag++; + session.SaveChanges(); + Assert.AreEqual(PersistenceState.Modified, node.PersistenceState); + foreach (var item in allTrees.Where(item => item!=node)) + Assert.AreEqual(PersistenceState.Synchronized, item.PersistenceState); + } + session.SaveChanges(); + var newNode = T(node); + using (session.DisableSaveChanges(newNode)) { + AssertNumberOfNodesInDatabaseIs(allTrees.Count - 1); + Assert.AreEqual(PersistenceState.New, newNode.PersistenceState); + Assert.AreEqual(PersistenceState.Modified, node.PersistenceState); + foreach (var item in allTrees.Where(item => item!=newNode && item!=node)) + Assert.AreEqual(PersistenceState.Synchronized, item.PersistenceState); + } + session.SaveChanges(); + AssertNumberOfNodesInDatabaseIs(allTrees.Count); + var cycledNode = T(); + cycledNode.Parent = cycledNode; + using (session.DisableSaveChanges(cycledNode)) { + AssertNumberOfNodesInDatabaseIs(allTrees.Count - 1); + } + session.SaveChanges(); + var cycledGraph = T(T(T(cycledNode))); + cycledGraph.Parent = cycledNode; + using (session.DisableSaveChanges(cycledGraph)) { + AssertNumberOfNodesInDatabaseIs(allTrees.Count - 3); + Assert.AreEqual(PersistenceState.Modified, cycledNode.PersistenceState); + } + session.SaveChanges(); + } + } + finally { + allTrees = null; + } + } + + [Test] + public void NestedPinTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var victim = new Victim(); + using (session.DisableSaveChanges(victim)) + Assert.IsNull(session.DisableSaveChanges(victim)); + } + } + + [Test] + public void PinRemovedEntityTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var victim = new Victim(); + victim.Remove(); + AssertEx.ThrowsInvalidOperationException(() => session.DisableSaveChanges(victim)); + } + } + + [Test] + public void CommittingWithPinnedEntityTest() + { + using (var session = Domain.OpenSession()) + using (var transactionScope = session.OpenTransaction()) { + var victim = new Victim(); + using (session.DisableSaveChanges(victim)) { + transactionScope.Complete(); + AssertEx.ThrowsInvalidOperationException(transactionScope.Dispose); + } + } + } + + [Test] + public void OpenNestedTransactionWithPinnedEntityTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var victim = new Victim(); + using (session.DisableSaveChanges(victim)) + AssertEx.ThrowsInvalidOperationException(() => session.OpenTransaction(TransactionOpenMode.New)); + } + } + + private static void AssertNumberOfNodesInDatabaseIs(int expected) + { + var actual = Session.Demand().Query.All().Count(); + Assert.AreEqual(expected, actual); + } + + private Node T(params Node[] children) + { + var result = new Node(); + allTrees.Add(result); + result.Children.AddRange(children); + return result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DisableValidationAndImplicitConstraintsTest.cs b/Orm/Xtensive.Orm.Tests/Storage/DisableValidationAndImplicitConstraintsTest.cs index cb44194ff5..a3dada4d99 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DisableValidationAndImplicitConstraintsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DisableValidationAndImplicitConstraintsTest.cs @@ -1,48 +1,48 @@ -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DisableValidationAndImplicitConstraintsTestModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace DisableValidationAndImplicitConstraintsTestModel - { - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Nullable = false)] - public string Name { get; set; } - } - } - - public class DisableValidationAndImplicitConstraintsTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (MyEntity)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - new MyEntity {Name = "Hello"}; - tx.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var entity = Query.All().Single(); - entity.Name = null; - entity.Name = "Bye"; - tx.Complete(); - } - } - } +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DisableValidationAndImplicitConstraintsTestModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace DisableValidationAndImplicitConstraintsTestModel + { + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Nullable = false)] + public string Name { get; set; } + } + } + + public class DisableValidationAndImplicitConstraintsTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (MyEntity)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + new MyEntity {Name = "Hello"}; + tx.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var entity = Query.All().Single(); + entity.Name = null; + entity.Name = "Bye"; + tx.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/DuplicateIndexTest.cs b/Orm/Xtensive.Orm.Tests/Storage/DuplicateIndexTest.cs index 4ae293f2f9..d78d81a8c6 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/DuplicateIndexTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/DuplicateIndexTest.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.02.04 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.DuplicateIndex; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace DuplicateIndex - { - public interface ISlave : IEntity - { - [Field] - Master Master { get; set;} - } - - [HierarchyRoot] - public class Slave : Entity, ISlave - { - [Field, Key] - public int Id { get; private set; } - public Master Master { get; set; } - } - - [HierarchyRoot] - public class Master : Entity - { - [Field, Key] - public int Id { get; private set; } - } - } - - public class DuplicateIndexTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(Master).Assembly, typeof(Master).Namespace); - return config; - } - - [Test] - public void Test() - { - - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.02.04 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.DuplicateIndex; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace DuplicateIndex + { + public interface ISlave : IEntity + { + [Field] + Master Master { get; set;} + } + + [HierarchyRoot] + public class Slave : Entity, ISlave + { + [Field, Key] + public int Id { get; private set; } + public Master Master { get; set; } + } + + [HierarchyRoot] + public class Master : Entity + { + [Field, Key] + public int Id { get; private set; } + } + } + + public class DuplicateIndexTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(Master).Assembly, typeof(Master).Namespace); + return config; + } + + [Test] + public void Test() + { + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/EncryptedConnectionStringTest.cs b/Orm/Xtensive.Orm.Tests/Storage/EncryptedConnectionStringTest.cs index 3e1e0d8752..55a61c0d40 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/EncryptedConnectionStringTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/EncryptedConnectionStringTest.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.01.24 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - [Ignore("No such domain configuration for now")] - public class EncryptedConnectionStringTest : HasConfigurationAccessTest - { - [Test] - public void MainTest() - { - var config = LoadDomainConfiguration("encrypted"); - Assert.That(config.ConnectionInfo.ConnectionString, Is.Not.Null.And.Not.Empty); - Assert.That(config.ConnectionInfo.Provider, Is.Not.Null.And.Not.Empty); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.01.24 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + [Ignore("No such domain configuration for now")] + public class EncryptedConnectionStringTest : HasConfigurationAccessTest + { + [Test] + public void MainTest() + { + var config = LoadDomainConfiguration("encrypted"); + Assert.That(config.ConnectionInfo.ConnectionString, Is.Not.Null.And.Not.Empty); + Assert.That(config.ConnectionInfo.Provider, Is.Not.Null.And.Not.Empty); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/EntitySetRollbackTest.cs b/Orm/Xtensive.Orm.Tests/Storage/EntitySetRollbackTest.cs index 9da5e1edfa..e0f23ca74f 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/EntitySetRollbackTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/EntitySetRollbackTest.cs @@ -1,374 +1,374 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.03.03 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.EntitySetRollbackTestModel; - -namespace Xtensive.Orm.Tests.Storage.EntitySetRollbackTestModel -{ - [HierarchyRoot] - public class Employee : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field, Association(PairTo = "Employees")] - public EntitySet Documents { get; set; } - - [Field] - public EntitySet AccountingDocuments { get; set; } - - } - - [HierarchyRoot] - public class SomeAccountingDocument : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Employees { get; set; } - } - - [HierarchyRoot] - public class AccountingDocument : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Employees { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class EntitySetRollbackTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (AccountingDocument).Assembly, typeof (AccountingDocument).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - [Test] - public void PairedEntitySetTest() - { - using (var session = Domain.OpenSession()) { - Key documentKey; - using (var transaction = session.OpenTransaction()) { - documentKey = new SomeAccountingDocument().Key; - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - for (var i = 0; i < 30; i++) - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var employees = document.Employees.ToList(); - transaction.Complete(); - } - } - } - - [Test] - public void NonPairedEntitySetTest() - { - using (var session = Domain.OpenSession()) { - Key documentKey; - using (var transaction = session.OpenTransaction()) { - documentKey = new AccountingDocument().Key; - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - for (var i = 0; i < 30; i++) - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var employees = document.Employees.ToList(); - transaction.Complete(); - } - } - } - - [Test] - public void RemoveFromEntitySetTest() - { - using (var session = Domain.OpenSession()) { - Key documentKey; - using (var transaction = session.OpenTransaction()) { - var document = new AccountingDocument(); - documentKey = document.Key; - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var documentEntityes = document.Employees.ToList(); - foreach (var documentEntity in documentEntityes) { - document.Employees.Remove(documentEntity); - } - transaction.Complete(); - } - } - } - - [Test] - public void RemoveFromPairedEntitySetTest() - { - using (var session = Domain.OpenSession()) { - Key documentKey; - using (var transaction = session.OpenTransaction()) { - var document = new SomeAccountingDocument(); - documentKey = document.Key; - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var documentEntityes = document.Employees.ToList(); - foreach (var documentEntity in documentEntityes) - document.Employees.Remove(documentEntity); - transaction.Complete(); - } - } - } - - [Test] - public void EntitySetStateCountsTest() - { - int addedItemsCount = 0; - int removedItemsCount = 0; - using (var session = Domain.OpenSession()) { - Key documentKey; - Key employeeToRemoveKey; - using (var transaction = session.OpenTransaction()) { - var document = new AccountingDocument(); - documentKey = document.Key; - for (var i = 0; i < 40; i++) { - document.Employees.Add(new Employee()); - addedItemsCount++; - } - var employee = new Employee(); - employeeToRemoveKey = employee.Key; - document.Employees.Add(employee); - addedItemsCount++; - var entitySetState = session.EntitySetChangeRegistry.GetItems().First(); - Assert.AreEqual(addedItemsCount, entitySetState.CachedItemCount); - Assert.AreEqual(0, entitySetState.FetchedItemsCount); - Assert.AreEqual(addedItemsCount, entitySetState.AddedItemsCount); - Assert.AreEqual(removedItemsCount, entitySetState.RemovedItemsCount); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var employee = session.Query.Single(employeeToRemoveKey); - document.Employees.Remove(employee); - removedItemsCount++; - var entitySetState = session.EntitySetChangeRegistry.GetItems().First(); - Assert.AreEqual(WellKnown.EntitySetPreloadCount + 1 - removedItemsCount, entitySetState.CachedItemCount); - Assert.AreEqual(WellKnown.EntitySetPreloadCount + 1, entitySetState.FetchedItemsCount); - Assert.AreEqual(0, entitySetState.AddedItemsCount); - Assert.AreEqual(removedItemsCount, entitySetState.RemovedItemsCount); - - document.Employees.Prefetch(35); - Assert.AreEqual(35, entitySetState.CachedItemCount); - Assert.AreEqual(35, entitySetState.FetchedItemsCount); - Assert.AreEqual(0, entitySetState.AddedItemsCount); - Assert.AreEqual(0, entitySetState.RemovedItemsCount); - transaction.Complete(); - } - - using (var transaction = session.OpenTransaction()) { - var document = session.Query.Single(documentKey); - var employees = document.Employees.ToList(); - Assert.AreEqual(addedItemsCount - removedItemsCount, employees.Count); - } - } - } - - [Test] - public void NonPairedEntitySetInDisconnectedSessionTest() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); - var defaultConfiguration = configuration.Sessions.Default; - defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; - configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - var domain = BuildDomain(configuration); - - using (var session = domain.OpenSession()) { - var document = new AccountingDocument(); - session.SaveChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.SaveChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.CancelChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.SaveChanges(); - - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - session.SaveChanges(); - - var employees = document.Employees.ToList(); - session.SaveChanges(); - } - } - - [Test] - public void PairedEnitySetInDisconnectedSessionTest() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); - var defaultConfiguration = configuration.Sessions.Default; - defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; - configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; - - var domain = BuildDomain(configuration); - - using (var session = domain.OpenSession()) { - var document = new SomeAccountingDocument(); - session.SaveChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.SaveChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.CancelChanges(); - - document.Employees.Add(new Employee()); - document.Employees.Add(new Employee()); - session.SaveChanges(); - - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - session.SaveChanges(); - - var employees = document.Employees.ToList(); - session.SaveChanges(); - } - } - - [Test] - public void RemoveFromEntitySetInDisconnectedSessionTest() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (AccountingDocument).Assembly, typeof (AccountingDocument).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; - var defaultConfiguration = configuration.Sessions.Default; - defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; - - var domain = BuildDomain(configuration); - - using (var session = domain.OpenSession()) { - var document = new AccountingDocument(); - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - session.SaveChanges(); - - var documentEntityes = document.Employees.ToList(); - foreach (var documentEntity in documentEntityes) - document.Employees.Remove(documentEntity); - session.SaveChanges(); - } - } - - [Test] - public void RemoveFromPairedEntitySetInDisconnectedSessionTest() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; - var defaultConfiguration = configuration.Sessions.Default; - defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; - - var domain = BuildDomain(configuration); - - using (var session = domain.OpenSession()) { - var document = new AccountingDocument(); - for (var i = 0; i < 40; i++) - document.Employees.Add(new Employee()); - session.SaveChanges(); - - var documentEntityes = document.Employees.ToList(); - foreach (var documentEntity in documentEntityes) - document.Employees.Remove(documentEntity); - session.SaveChanges(); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.03.03 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.EntitySetRollbackTestModel; + +namespace Xtensive.Orm.Tests.Storage.EntitySetRollbackTestModel +{ + [HierarchyRoot] + public class Employee : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field, Association(PairTo = "Employees")] + public EntitySet Documents { get; set; } + + [Field] + public EntitySet AccountingDocuments { get; set; } + + } + + [HierarchyRoot] + public class SomeAccountingDocument : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Employees { get; set; } + } + + [HierarchyRoot] + public class AccountingDocument : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Employees { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class EntitySetRollbackTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (AccountingDocument).Assembly, typeof (AccountingDocument).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + [Test] + public void PairedEntitySetTest() + { + using (var session = Domain.OpenSession()) { + Key documentKey; + using (var transaction = session.OpenTransaction()) { + documentKey = new SomeAccountingDocument().Key; + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + for (var i = 0; i < 30; i++) + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var employees = document.Employees.ToList(); + transaction.Complete(); + } + } + } + + [Test] + public void NonPairedEntitySetTest() + { + using (var session = Domain.OpenSession()) { + Key documentKey; + using (var transaction = session.OpenTransaction()) { + documentKey = new AccountingDocument().Key; + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + for (var i = 0; i < 30; i++) + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var employees = document.Employees.ToList(); + transaction.Complete(); + } + } + } + + [Test] + public void RemoveFromEntitySetTest() + { + using (var session = Domain.OpenSession()) { + Key documentKey; + using (var transaction = session.OpenTransaction()) { + var document = new AccountingDocument(); + documentKey = document.Key; + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var documentEntityes = document.Employees.ToList(); + foreach (var documentEntity in documentEntityes) { + document.Employees.Remove(documentEntity); + } + transaction.Complete(); + } + } + } + + [Test] + public void RemoveFromPairedEntitySetTest() + { + using (var session = Domain.OpenSession()) { + Key documentKey; + using (var transaction = session.OpenTransaction()) { + var document = new SomeAccountingDocument(); + documentKey = document.Key; + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var documentEntityes = document.Employees.ToList(); + foreach (var documentEntity in documentEntityes) + document.Employees.Remove(documentEntity); + transaction.Complete(); + } + } + } + + [Test] + public void EntitySetStateCountsTest() + { + int addedItemsCount = 0; + int removedItemsCount = 0; + using (var session = Domain.OpenSession()) { + Key documentKey; + Key employeeToRemoveKey; + using (var transaction = session.OpenTransaction()) { + var document = new AccountingDocument(); + documentKey = document.Key; + for (var i = 0; i < 40; i++) { + document.Employees.Add(new Employee()); + addedItemsCount++; + } + var employee = new Employee(); + employeeToRemoveKey = employee.Key; + document.Employees.Add(employee); + addedItemsCount++; + var entitySetState = session.EntitySetChangeRegistry.GetItems().First(); + Assert.AreEqual(addedItemsCount, entitySetState.CachedItemCount); + Assert.AreEqual(0, entitySetState.FetchedItemsCount); + Assert.AreEqual(addedItemsCount, entitySetState.AddedItemsCount); + Assert.AreEqual(removedItemsCount, entitySetState.RemovedItemsCount); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var employee = session.Query.Single(employeeToRemoveKey); + document.Employees.Remove(employee); + removedItemsCount++; + var entitySetState = session.EntitySetChangeRegistry.GetItems().First(); + Assert.AreEqual(WellKnown.EntitySetPreloadCount + 1 - removedItemsCount, entitySetState.CachedItemCount); + Assert.AreEqual(WellKnown.EntitySetPreloadCount + 1, entitySetState.FetchedItemsCount); + Assert.AreEqual(0, entitySetState.AddedItemsCount); + Assert.AreEqual(removedItemsCount, entitySetState.RemovedItemsCount); + + document.Employees.Prefetch(35); + Assert.AreEqual(35, entitySetState.CachedItemCount); + Assert.AreEqual(35, entitySetState.FetchedItemsCount); + Assert.AreEqual(0, entitySetState.AddedItemsCount); + Assert.AreEqual(0, entitySetState.RemovedItemsCount); + transaction.Complete(); + } + + using (var transaction = session.OpenTransaction()) { + var document = session.Query.Single(documentKey); + var employees = document.Employees.ToList(); + Assert.AreEqual(addedItemsCount - removedItemsCount, employees.Count); + } + } + } + + [Test] + public void NonPairedEntitySetInDisconnectedSessionTest() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); + var defaultConfiguration = configuration.Sessions.Default; + defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; + configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + var domain = BuildDomain(configuration); + + using (var session = domain.OpenSession()) { + var document = new AccountingDocument(); + session.SaveChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.SaveChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.CancelChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.SaveChanges(); + + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + session.SaveChanges(); + + var employees = document.Employees.ToList(); + session.SaveChanges(); + } + } + + [Test] + public void PairedEnitySetInDisconnectedSessionTest() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); + var defaultConfiguration = configuration.Sessions.Default; + defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; + configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; + + var domain = BuildDomain(configuration); + + using (var session = domain.OpenSession()) { + var document = new SomeAccountingDocument(); + session.SaveChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.SaveChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.CancelChanges(); + + document.Employees.Add(new Employee()); + document.Employees.Add(new Employee()); + session.SaveChanges(); + + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + session.SaveChanges(); + + var employees = document.Employees.ToList(); + session.SaveChanges(); + } + } + + [Test] + public void RemoveFromEntitySetInDisconnectedSessionTest() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (AccountingDocument).Assembly, typeof (AccountingDocument).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; + var defaultConfiguration = configuration.Sessions.Default; + defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; + + var domain = BuildDomain(configuration); + + using (var session = domain.OpenSession()) { + var document = new AccountingDocument(); + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + session.SaveChanges(); + + var documentEntityes = document.Employees.ToList(); + foreach (var documentEntity in documentEntityes) + document.Employees.Remove(documentEntity); + session.SaveChanges(); + } + } + + [Test] + public void RemoveFromPairedEntitySetInDisconnectedSessionTest() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(AccountingDocument).Assembly, typeof(AccountingDocument).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.PerformSafely; + var defaultConfiguration = configuration.Sessions.Default; + defaultConfiguration.Options = SessionOptions.ClientProfile | SessionOptions.AutoActivation; + + var domain = BuildDomain(configuration); + + using (var session = domain.OpenSession()) { + var document = new AccountingDocument(); + for (var i = 0; i < 40; i++) + document.Employees.Add(new Employee()); + session.SaveChanges(); + + var documentEntityes = document.Employees.ToList(); + foreach (var documentEntity in documentEntityes) + document.Employees.Remove(documentEntity); + session.SaveChanges(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/EntitySetTest.cs b/Orm/Xtensive.Orm.Tests/Storage/EntitySetTest.cs index 43cb69c474..488316649a 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/EntitySetTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/EntitySetTest.cs @@ -1,508 +1,508 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2009.03.11 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; -using Xtensive.Orm.Tests.Storage.EntitySetModel; - -namespace Xtensive.Orm.Tests.Storage.EntitySetModel -{ - [HierarchyRoot] - public class Publisher : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public EntitySet Books { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Name { get; set; } - - [Field, Association(PairTo = "Books", OnTargetRemove = OnRemoveAction.Clear)] - public Author Author { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Author : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public int Name { get; set; } - - [Field] - public EntitySet Books { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class EntitySetTest : ChinookDOModelTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), typeof (Book).Namespace); - return config; - } - - [Test] - public void SessionActivationTest() - { - using (var session = Domain.OpenSession()) { - Author author; - TransactionScope transactionScope; - - using (session.Activate()) { - using (transactionScope = session.OpenTransaction()) { - author = new Author(); - transactionScope.Complete(); - } - - transactionScope = session.OpenTransaction(); - } - - // Requires manual Session switching, since NorthwindDOModelTest.SetUp - // automatically activates a background Session. - - using (Session.Deactivate()) { - foreach (var book in author.Books) { - } - } - - using (session.Activate()) { - transactionScope.Complete(); - transactionScope.Dispose(); - } - } - } - - [Test] - public void SimpleEntitySetPrefetchTest() - { - Key key; - using (var session = Domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = new Author(); - key = a.Key; - for (int i = 0; i < 10; i++) - a.Books.Add(new Book()); - tx.Complete(); - } - } - - using (var session = Domain.OpenSession()) { - using (var tx = session.OpenTransaction()) { - var a = session.Query.Single(key); - a.Books.ToList(); - var b = new Book(); - a.Books.Add(b); - tx.Complete(); - } - } - } - - [Test] - public void AddNewEntityToEntitySetTest() - { - using (var session = Domain.OpenSession()) { - Author a; - using (var t = session.OpenTransaction()) { - a = new Author(); - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var books = a.Books; // fetch the author - var b = new Book(); - books.Add(b); - Assert.AreEqual(PersistenceState.New, b.PersistenceState); - t.Complete(); - } - } - } - - [Test] - public void PairedEntitySetTest() - { - Author author; - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - author = new Author(); - for (int i = 0; i < 100; i++) { - var book = new Book() { Name = i }; - author.Books.Add(book); - } - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var list = author.Books.ToList(); - foreach (var book in list) - { - Assert.IsNotNull(book); - } - } - } - } - - [Test] - public void NonPairedEntitySetTest() - { - using (var session = Domain.OpenSession()) - { - using (var t = session.OpenTransaction()) { - var publisher = new Publisher(); - for (int i = 0; i < 100; i++) { - var book = new Book() {Name = i}; - publisher.Books.Add(book); - } - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var publisher = session.Query.All().First(); - var list = publisher.Books.ToList(); - foreach (var book in list) { - Assert.IsNotNull(book); - } - } - } - } - - [Test] - public void OneToManyTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var categories = session.Query.All(); - Assert.AreSame(categories.First().Tracks, categories.First().Tracks); - var resultCount = categories.First().Tracks.Count(); - var set = categories.First().Tracks; - var list = set.ToList(); - var queryResult = list.Count; - var setCount = categories.First().Tracks.Count; - Assert.AreEqual(setCount, queryResult); - Assert.AreEqual(queryResult, resultCount); - t.Complete(); - } - } - - [Test] - public void ManyToManyTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var playlists = session.Query.All(); - var tracks = session.Query.All(); - var resultCount = playlists.First().Tracks.Count(); - var queryResult = playlists.First().Tracks.ToList().Count(); - Assert.AreEqual(queryResult, resultCount); - resultCount = tracks.First().Playlists.Count(); - queryResult = tracks.First().Playlists.ToList().Count(); - Assert.AreEqual(queryResult, resultCount); - t.Complete(); - } - } - - [Test] - public void NewObjectTest() - { - const int bookCount = 10; - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author = new Author(); - for (int i = 0; i < bookCount; i++) - author.Books.Add(new Book {Name = i}); - var book = new Book {Name = bookCount}; - author.Books.Add(book); - Assert.AreEqual(author.Books.Count, bookCount + 1); - author.Books.Contains(book); - author.Books.Remove(book); - Assert.AreEqual(author.Books.Count, bookCount); - var enumerator = author.Books.GetEnumerator(); - var list = new List(); - while (enumerator.MoveNext()) - list.Add(enumerator.Current); - Assert.AreEqual(list.Count, author.Books.Count); - author.Books.Clear(); - Assert.AreEqual(author.Books.Count, 0); - t.Complete(); - } - } - - [Test] - public void PersistentObjectTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var playlist = session.Query.All().First(); - var trackCount = playlist.Tracks.Count; - var track = new AudioTrack {Name = "Temp1"}; - playlist.Tracks.Add(track); - Assert.AreEqual(playlist.Tracks.Count, trackCount + 1); - playlist.Tracks.Contains(track); - playlist.Tracks.Remove(track); - Assert.AreEqual(playlist.Tracks.Count, trackCount); - var enumerator = playlist.Tracks.GetEnumerator(); - var list = new List(); - while (enumerator.MoveNext()) - list.Add(enumerator.Current); - Assert.AreEqual(list.Count, playlist.Tracks.Count); - playlist.Tracks.Clear(); - Assert.AreEqual(playlist.Tracks.Count, 0); - Session.Current.SaveChanges(); - t.Complete(); - } - - using (var t = session.OpenTransaction()) { - var category = session.Query.All().First(); - Assert.AreEqual(category.Tracks.Count, 0); - var track = new VideoTrack() {Name = "Temp2"}; - category.Tracks.Add(track); - Session.Current.SaveChanges(); - t.Complete(); - } - - using (var t = session.OpenTransaction()) { - var playlist = session.Query.All().First(); - Assert.AreEqual(playlist.Tracks.Count, 1); - t.Complete(); - } - } - } - - [Test] - public void SetOperationsTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var customer = new Customer{FirstName = "test", LastName = "test2"}; - var invoices1 = GenerateInvoices(2); - var invoices2 = GenerateInvoices(3); - var invoices3 = GenerateInvoices(4); - // UnionWith - customer.Invoices.UnionWith(invoices1); - customer.Invoices.UnionWith(invoices2); - var invoices = customer.Invoices.ToList(); - Assert.IsTrue(invoices.ContainsAll(invoices1)); - Assert.IsTrue(invoices.ContainsAll(invoices2)); - // IntersectWith - customer.Invoices.IntersectWith(invoices1); - invoices = customer.Invoices.ToList(); - Assert.IsTrue(invoices.ContainsAll(invoices1)); - Assert.IsFalse(invoices.ContainsAny(invoices2)); - // ExceptWith - customer.Invoices.ExceptWith(invoices1); - invoices = customer.Invoices.ToList(); - Assert.AreEqual(0, invoices.Count); - // Check all operations with self. - customer.Invoices.UnionWith(invoices3); - customer.Invoices.UnionWith(customer.Invoices); - customer.Invoices.IntersectWith(customer.Invoices); - customer.Invoices.ExceptWith(customer.Invoices); - Assert.AreEqual(0, customer.Invoices.Count); - // rolling back - } - } - - [Test] - public void EnumerateFullyLoadedEntitySetWhenItsOwnerIsRemovedTest() - { - Key author0Key; - Key author1Key; - CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author0 = session.Query.Single(author0Key); - LoadEntitySetThenRemoveOwnerAndEnumerateIt(author0, author0.Books); - - var author1 = session.Query.Single(author1Key); - LoadEntitySetThenRemoveOwnerAndEnumerateIt(author1, author1.Books); - } - } - - [Test] - public void EnumerateNotLoadedEntitySetWhenItsOwnerIsRemovedTest() - { - Key author0Key; - Key author1Key; - CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author0 = session.Query.Single(author0Key); - RemoveOwnerAndEnumerateEntitySet(author0, author0.Books); - - var author1 = session.Query.Single(author1Key); - RemoveOwnerAndEnumerateEntitySet(author1, author1.Books); - } - } - - [Test] - public void ExecutingFutureQueryOnEntitySetWhenItsOwnerHasBeenRemovedTest() - { - Key author0Key; - Key author1Key; - CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); - - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author0 = session.Query.Single(author0Key); - var books0 = author0.Books; - author0.Remove(); - AssertEx.Throws(() => - session.Query.ExecuteDelayed(_ => books0.Where(b => b.Name==0))); - } - } - - [Test] - public void CountPropertyBehaviorTest() - { - const int itemCountOfBigEntitySet = 50; - const int itemCountOfSmallEntitySet = 30; - Key bigKey; - Key smallKey; - Action generator = (a, count) => { - for (var i = 0; i < count; i++) - a.Books.Add(new Book()); - }; - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var bigAuthor = new Author(); - bigKey = bigAuthor.Key; - generator.Invoke(bigAuthor, itemCountOfBigEntitySet); - var smallAuthor = new Author(); - smallKey = smallAuthor.Key; - generator.Invoke(smallAuthor, itemCountOfSmallEntitySet); - t.Complete(); - } - - var booksField = Domain.Model.Types[typeof (Author)].Fields["Books"]; - TestAdd(bigKey, itemCountOfBigEntitySet, booksField); - TestRemove(bigKey, itemCountOfBigEntitySet + 2, booksField); - TestSmallEntitySet(smallKey, itemCountOfSmallEntitySet, booksField); - } - - private void TestAdd(Key key, int itemCount, Orm.Model.FieldInfo booksField) - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author = session.Query.Single(key); - FetchEntitySet(author.Books); - author.Books.Add(new Book()); - EntitySetState setState; - session.Handler.LookupState(key, booksField, out setState); - Assert.IsNull(setState.TotalItemCount); - Assert.AreEqual(itemCount + 1, author.Books.Count); - Assert.AreEqual(itemCount + 1, setState.TotalItemCount); - author.Books.Add(new Book()); - Assert.AreEqual(itemCount + 2, setState.TotalItemCount); - t.Complete(); - } - } - - private void TestRemove(Key key, int itemCount, Xtensive.Orm.Model.FieldInfo booksField) - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author = session.Query.Single(key); - FetchEntitySet(author.Books); - var booksToBeRemoved = session.Query.All().Where(b => b.Author.Key == key).Take(2).ToList(); - var bookToBeRemoved0 = booksToBeRemoved[0]; - var bookToBeRemoved1 = booksToBeRemoved[1]; - author.Books.Remove(bookToBeRemoved0); - EntitySetState setState; - session.Handler.LookupState(key, booksField, out setState); - Assert.IsNull(setState.TotalItemCount); - Assert.AreEqual(itemCount - 1, author.Books.Count); - Assert.AreEqual(itemCount - 1, setState.TotalItemCount); - author.Books.Remove(bookToBeRemoved1); - Assert.AreEqual(itemCount - 2, setState.TotalItemCount); - t.Complete(); - } - } - - private void TestSmallEntitySet(Key key, int itemCount, Xtensive.Orm.Model.FieldInfo booksField) - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var author = session.Query.Single(key); - FetchEntitySet(author.Books); - author.Books.Add(new Book()); - EntitySetState setState; - Assert.IsTrue(session.Handler.LookupState(key, booksField, out setState)); - Assert.AreEqual(itemCount+1, setState.TotalItemCount); - } - } - - private static void LoadEntitySetThenRemoveOwnerAndEnumerateIt(Author owner, EntitySet entitySet) - { - foreach (var book in entitySet) {} - RemoveOwnerAndEnumerateEntitySet(owner, entitySet); - } - - private static void RemoveOwnerAndEnumerateEntitySet(Author owner, EntitySet entitySet) - { - var expectedCount = entitySet.Count; - owner.Remove(); - var actualCount = 0; - entitySet.GetEnumerator().MoveNext(); - } - - private void CreateTwoAuthorsAndTheirBooksSet(out Key author0Key, out Key author1Key) - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Action bookGenerator = (author, count) => { - for (var i = 0; i < count; i++) - author.Books.Add(new Book()); - }; - var author0 = new Author(); - author0Key = author0.Key; - bookGenerator.Invoke(author0, 5); - var author1 = new Author(); - author1Key = author1.Key; - bookGenerator.Invoke(author1, 50); - t.Complete(); - } - } - - private List GenerateInvoices(int count) - { - var result = new List(); - for (var i = 0; i < count; i++) - result.Add(new Invoice()); - return result; - } - - private void FetchEntitySet(EntitySet books) where T : IEntity - { - // fancy trick to force loading at most N items (currently N = 32) - books.Contains(Key.Create(Domain, typeof (T), -77)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2009.03.11 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; +using Xtensive.Orm.Tests.Storage.EntitySetModel; + +namespace Xtensive.Orm.Tests.Storage.EntitySetModel +{ + [HierarchyRoot] + public class Publisher : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public EntitySet Books { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Name { get; set; } + + [Field, Association(PairTo = "Books", OnTargetRemove = OnRemoveAction.Clear)] + public Author Author { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Author : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public int Name { get; set; } + + [Field] + public EntitySet Books { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class EntitySetTest : ChinookDOModelTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), typeof (Book).Namespace); + return config; + } + + [Test] + public void SessionActivationTest() + { + using (var session = Domain.OpenSession()) { + Author author; + TransactionScope transactionScope; + + using (session.Activate()) { + using (transactionScope = session.OpenTransaction()) { + author = new Author(); + transactionScope.Complete(); + } + + transactionScope = session.OpenTransaction(); + } + + // Requires manual Session switching, since NorthwindDOModelTest.SetUp + // automatically activates a background Session. + + using (Session.Deactivate()) { + foreach (var book in author.Books) { + } + } + + using (session.Activate()) { + transactionScope.Complete(); + transactionScope.Dispose(); + } + } + } + + [Test] + public void SimpleEntitySetPrefetchTest() + { + Key key; + using (var session = Domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = new Author(); + key = a.Key; + for (int i = 0; i < 10; i++) + a.Books.Add(new Book()); + tx.Complete(); + } + } + + using (var session = Domain.OpenSession()) { + using (var tx = session.OpenTransaction()) { + var a = session.Query.Single(key); + a.Books.ToList(); + var b = new Book(); + a.Books.Add(b); + tx.Complete(); + } + } + } + + [Test] + public void AddNewEntityToEntitySetTest() + { + using (var session = Domain.OpenSession()) { + Author a; + using (var t = session.OpenTransaction()) { + a = new Author(); + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var books = a.Books; // fetch the author + var b = new Book(); + books.Add(b); + Assert.AreEqual(PersistenceState.New, b.PersistenceState); + t.Complete(); + } + } + } + + [Test] + public void PairedEntitySetTest() + { + Author author; + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + author = new Author(); + for (int i = 0; i < 100; i++) { + var book = new Book() { Name = i }; + author.Books.Add(book); + } + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var list = author.Books.ToList(); + foreach (var book in list) + { + Assert.IsNotNull(book); + } + } + } + } + + [Test] + public void NonPairedEntitySetTest() + { + using (var session = Domain.OpenSession()) + { + using (var t = session.OpenTransaction()) { + var publisher = new Publisher(); + for (int i = 0; i < 100; i++) { + var book = new Book() {Name = i}; + publisher.Books.Add(book); + } + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var publisher = session.Query.All().First(); + var list = publisher.Books.ToList(); + foreach (var book in list) { + Assert.IsNotNull(book); + } + } + } + } + + [Test] + public void OneToManyTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var categories = session.Query.All(); + Assert.AreSame(categories.First().Tracks, categories.First().Tracks); + var resultCount = categories.First().Tracks.Count(); + var set = categories.First().Tracks; + var list = set.ToList(); + var queryResult = list.Count; + var setCount = categories.First().Tracks.Count; + Assert.AreEqual(setCount, queryResult); + Assert.AreEqual(queryResult, resultCount); + t.Complete(); + } + } + + [Test] + public void ManyToManyTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var playlists = session.Query.All(); + var tracks = session.Query.All(); + var resultCount = playlists.First().Tracks.Count(); + var queryResult = playlists.First().Tracks.ToList().Count(); + Assert.AreEqual(queryResult, resultCount); + resultCount = tracks.First().Playlists.Count(); + queryResult = tracks.First().Playlists.ToList().Count(); + Assert.AreEqual(queryResult, resultCount); + t.Complete(); + } + } + + [Test] + public void NewObjectTest() + { + const int bookCount = 10; + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author = new Author(); + for (int i = 0; i < bookCount; i++) + author.Books.Add(new Book {Name = i}); + var book = new Book {Name = bookCount}; + author.Books.Add(book); + Assert.AreEqual(author.Books.Count, bookCount + 1); + author.Books.Contains(book); + author.Books.Remove(book); + Assert.AreEqual(author.Books.Count, bookCount); + var enumerator = author.Books.GetEnumerator(); + var list = new List(); + while (enumerator.MoveNext()) + list.Add(enumerator.Current); + Assert.AreEqual(list.Count, author.Books.Count); + author.Books.Clear(); + Assert.AreEqual(author.Books.Count, 0); + t.Complete(); + } + } + + [Test] + public void PersistentObjectTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var playlist = session.Query.All().First(); + var trackCount = playlist.Tracks.Count; + var track = new AudioTrack {Name = "Temp1"}; + playlist.Tracks.Add(track); + Assert.AreEqual(playlist.Tracks.Count, trackCount + 1); + playlist.Tracks.Contains(track); + playlist.Tracks.Remove(track); + Assert.AreEqual(playlist.Tracks.Count, trackCount); + var enumerator = playlist.Tracks.GetEnumerator(); + var list = new List(); + while (enumerator.MoveNext()) + list.Add(enumerator.Current); + Assert.AreEqual(list.Count, playlist.Tracks.Count); + playlist.Tracks.Clear(); + Assert.AreEqual(playlist.Tracks.Count, 0); + Session.Current.SaveChanges(); + t.Complete(); + } + + using (var t = session.OpenTransaction()) { + var category = session.Query.All().First(); + Assert.AreEqual(category.Tracks.Count, 0); + var track = new VideoTrack() {Name = "Temp2"}; + category.Tracks.Add(track); + Session.Current.SaveChanges(); + t.Complete(); + } + + using (var t = session.OpenTransaction()) { + var playlist = session.Query.All().First(); + Assert.AreEqual(playlist.Tracks.Count, 1); + t.Complete(); + } + } + } + + [Test] + public void SetOperationsTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var customer = new Customer{FirstName = "test", LastName = "test2"}; + var invoices1 = GenerateInvoices(2); + var invoices2 = GenerateInvoices(3); + var invoices3 = GenerateInvoices(4); + // UnionWith + customer.Invoices.UnionWith(invoices1); + customer.Invoices.UnionWith(invoices2); + var invoices = customer.Invoices.ToList(); + Assert.IsTrue(invoices.ContainsAll(invoices1)); + Assert.IsTrue(invoices.ContainsAll(invoices2)); + // IntersectWith + customer.Invoices.IntersectWith(invoices1); + invoices = customer.Invoices.ToList(); + Assert.IsTrue(invoices.ContainsAll(invoices1)); + Assert.IsFalse(invoices.ContainsAny(invoices2)); + // ExceptWith + customer.Invoices.ExceptWith(invoices1); + invoices = customer.Invoices.ToList(); + Assert.AreEqual(0, invoices.Count); + // Check all operations with self. + customer.Invoices.UnionWith(invoices3); + customer.Invoices.UnionWith(customer.Invoices); + customer.Invoices.IntersectWith(customer.Invoices); + customer.Invoices.ExceptWith(customer.Invoices); + Assert.AreEqual(0, customer.Invoices.Count); + // rolling back + } + } + + [Test] + public void EnumerateFullyLoadedEntitySetWhenItsOwnerIsRemovedTest() + { + Key author0Key; + Key author1Key; + CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author0 = session.Query.Single(author0Key); + LoadEntitySetThenRemoveOwnerAndEnumerateIt(author0, author0.Books); + + var author1 = session.Query.Single(author1Key); + LoadEntitySetThenRemoveOwnerAndEnumerateIt(author1, author1.Books); + } + } + + [Test] + public void EnumerateNotLoadedEntitySetWhenItsOwnerIsRemovedTest() + { + Key author0Key; + Key author1Key; + CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author0 = session.Query.Single(author0Key); + RemoveOwnerAndEnumerateEntitySet(author0, author0.Books); + + var author1 = session.Query.Single(author1Key); + RemoveOwnerAndEnumerateEntitySet(author1, author1.Books); + } + } + + [Test] + public void ExecutingFutureQueryOnEntitySetWhenItsOwnerHasBeenRemovedTest() + { + Key author0Key; + Key author1Key; + CreateTwoAuthorsAndTheirBooksSet(out author0Key, out author1Key); + + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author0 = session.Query.Single(author0Key); + var books0 = author0.Books; + author0.Remove(); + AssertEx.Throws(() => + session.Query.ExecuteDelayed(_ => books0.Where(b => b.Name==0))); + } + } + + [Test] + public void CountPropertyBehaviorTest() + { + const int itemCountOfBigEntitySet = 50; + const int itemCountOfSmallEntitySet = 30; + Key bigKey; + Key smallKey; + Action generator = (a, count) => { + for (var i = 0; i < count; i++) + a.Books.Add(new Book()); + }; + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var bigAuthor = new Author(); + bigKey = bigAuthor.Key; + generator.Invoke(bigAuthor, itemCountOfBigEntitySet); + var smallAuthor = new Author(); + smallKey = smallAuthor.Key; + generator.Invoke(smallAuthor, itemCountOfSmallEntitySet); + t.Complete(); + } + + var booksField = Domain.Model.Types[typeof (Author)].Fields["Books"]; + TestAdd(bigKey, itemCountOfBigEntitySet, booksField); + TestRemove(bigKey, itemCountOfBigEntitySet + 2, booksField); + TestSmallEntitySet(smallKey, itemCountOfSmallEntitySet, booksField); + } + + private void TestAdd(Key key, int itemCount, Orm.Model.FieldInfo booksField) + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author = session.Query.Single(key); + FetchEntitySet(author.Books); + author.Books.Add(new Book()); + EntitySetState setState; + session.Handler.LookupState(key, booksField, out setState); + Assert.IsNull(setState.TotalItemCount); + Assert.AreEqual(itemCount + 1, author.Books.Count); + Assert.AreEqual(itemCount + 1, setState.TotalItemCount); + author.Books.Add(new Book()); + Assert.AreEqual(itemCount + 2, setState.TotalItemCount); + t.Complete(); + } + } + + private void TestRemove(Key key, int itemCount, Xtensive.Orm.Model.FieldInfo booksField) + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author = session.Query.Single(key); + FetchEntitySet(author.Books); + var booksToBeRemoved = session.Query.All().Where(b => b.Author.Key == key).Take(2).ToList(); + var bookToBeRemoved0 = booksToBeRemoved[0]; + var bookToBeRemoved1 = booksToBeRemoved[1]; + author.Books.Remove(bookToBeRemoved0); + EntitySetState setState; + session.Handler.LookupState(key, booksField, out setState); + Assert.IsNull(setState.TotalItemCount); + Assert.AreEqual(itemCount - 1, author.Books.Count); + Assert.AreEqual(itemCount - 1, setState.TotalItemCount); + author.Books.Remove(bookToBeRemoved1); + Assert.AreEqual(itemCount - 2, setState.TotalItemCount); + t.Complete(); + } + } + + private void TestSmallEntitySet(Key key, int itemCount, Xtensive.Orm.Model.FieldInfo booksField) + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var author = session.Query.Single(key); + FetchEntitySet(author.Books); + author.Books.Add(new Book()); + EntitySetState setState; + Assert.IsTrue(session.Handler.LookupState(key, booksField, out setState)); + Assert.AreEqual(itemCount+1, setState.TotalItemCount); + } + } + + private static void LoadEntitySetThenRemoveOwnerAndEnumerateIt(Author owner, EntitySet entitySet) + { + foreach (var book in entitySet) {} + RemoveOwnerAndEnumerateEntitySet(owner, entitySet); + } + + private static void RemoveOwnerAndEnumerateEntitySet(Author owner, EntitySet entitySet) + { + var expectedCount = entitySet.Count; + owner.Remove(); + var actualCount = 0; + entitySet.GetEnumerator().MoveNext(); + } + + private void CreateTwoAuthorsAndTheirBooksSet(out Key author0Key, out Key author1Key) + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Action bookGenerator = (author, count) => { + for (var i = 0; i < count; i++) + author.Books.Add(new Book()); + }; + var author0 = new Author(); + author0Key = author0.Key; + bookGenerator.Invoke(author0, 5); + var author1 = new Author(); + author1Key = author1.Key; + bookGenerator.Invoke(author1, 50); + t.Complete(); + } + } + + private List GenerateInvoices(int count) + { + var result = new List(); + for (var i = 0; i < count; i++) + result.Add(new Invoice()); + return result; + } + + private void FetchEntitySet(EntitySet books) where T : IEntity + { + // fancy trick to force loading at most N items (currently N = 32) + books.Contains(Key.Create(Domain, typeof (T), -77)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ExcludeFromAutoVersionTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ExcludeFromAutoVersionTest.cs index 55cc7aad62..67a734c8e8 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ExcludeFromAutoVersionTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ExcludeFromAutoVersionTest.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.04.26 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.ExcludeFromAutoVersionTestModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace ExcludeFromAutoVersionTestModel - { - [HierarchyRoot] - public class Versioned : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Version, Field] - public int Version { get; private set; } - - [Field] - public string Title { get; set; } - - [Version(VersionMode.Skip), Field] - public string Description { get; set; } - - protected override bool UpdateVersion(Entity changedEntity, Orm.Model.FieldInfo changedField) - { - if (changedField.SkipVersion) - return false; - return base.UpdateVersion(changedEntity, changedField); - } - } - } - - public class ExcludeFromAutoVersionTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Versioned)); - return configuration; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var v = new Versioned(); - var originalVersion = v.Version; - v.Description = "foo"; - Assert.That(originalVersion, Is.EqualTo(v.Version)); - v.Title = "bar"; - Assert.That(originalVersion, Is.Not.EqualTo(v.Version)); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.04.26 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.ExcludeFromAutoVersionTestModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace ExcludeFromAutoVersionTestModel + { + [HierarchyRoot] + public class Versioned : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Version, Field] + public int Version { get; private set; } + + [Field] + public string Title { get; set; } + + [Version(VersionMode.Skip), Field] + public string Description { get; set; } + + protected override bool UpdateVersion(Entity changedEntity, Orm.Model.FieldInfo changedField) + { + if (changedField.SkipVersion) + return false; + return base.UpdateVersion(changedEntity, changedField); + } + } + } + + public class ExcludeFromAutoVersionTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Versioned)); + return configuration; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var v = new Versioned(); + var originalVersion = v.Version; + v.Description = "foo"; + Assert.That(originalVersion, Is.EqualTo(v.Version)); + v.Title = "bar"; + Assert.That(originalVersion, Is.Not.EqualTo(v.Version)); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ExecuteDelayedForIOrderedQueryableQuery.cs b/Orm/Xtensive.Orm.Tests/Storage/ExecuteDelayedForIOrderedQueryableQuery.cs index e8a0a91201..b6f8a2f991 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ExecuteDelayedForIOrderedQueryableQuery.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ExecuteDelayedForIOrderedQueryableQuery.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.06.23 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Linq.ExecuteDelayedForIOrderedQueryableQueryModel; - -namespace Xtensive.Orm.Tests.Linq.ExecuteDelayedForIOrderedQueryableQueryModel -{ - [HierarchyRoot] - public class TestEntity : Entity - { - [Field, Key] - public int Id { get; set; } - - [Field] - public int OrderByThisField { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Linq -{ - [TestFixture] - public class ExecuteDelayedForIOrderedQueryableQuery : AutoBuildTest - { - private readonly int[] unsortedValueSequence = new[] {10, 5, 100, 2, 15, 1, 18, 9}; - - [Test] - public void MainTest() - { - var randomer = new Random(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var delaedQuery = session.Query.ExecuteDelayed( - query => from zoo in query.All() - orderby zoo.OrderByThisField - select zoo); - Assert.IsInstanceOf>(delaedQuery); - session.ExecuteUserDefinedDelayedQueries(true); - var sortedValues = new int[unsortedValueSequence.Length]; - unsortedValueSequence.CopyTo(sortedValues, 0); - Array.Sort(sortedValues); - var currentValueIndex = 0; - foreach (var testEntity in delaedQuery) { - Assert.AreEqual(sortedValues[currentValueIndex], testEntity.OrderByThisField); - currentValueIndex++; - } - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof(TestEntity)); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - protected override void PopulateData() - { - var randomer = new Random(); - using (var session = Domain.OpenSession()) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - foreach (var value in unsortedValueSequence) - new TestEntity { OrderByThisField = value }; - - transaction.Complete(); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.06.23 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Linq.ExecuteDelayedForIOrderedQueryableQueryModel; + +namespace Xtensive.Orm.Tests.Linq.ExecuteDelayedForIOrderedQueryableQueryModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + [Field] + public int OrderByThisField { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Linq +{ + [TestFixture] + public class ExecuteDelayedForIOrderedQueryableQuery : AutoBuildTest + { + private readonly int[] unsortedValueSequence = new[] {10, 5, 100, 2, 15, 1, 18, 9}; + + [Test] + public void MainTest() + { + var randomer = new Random(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var delaedQuery = session.Query.ExecuteDelayed( + query => from zoo in query.All() + orderby zoo.OrderByThisField + select zoo); + Assert.IsInstanceOf>(delaedQuery); + session.ExecuteUserDefinedDelayedQueries(true); + var sortedValues = new int[unsortedValueSequence.Length]; + unsortedValueSequence.CopyTo(sortedValues, 0); + Array.Sort(sortedValues); + var currentValueIndex = 0; + foreach (var testEntity in delaedQuery) { + Assert.AreEqual(sortedValues[currentValueIndex], testEntity.OrderByThisField); + currentValueIndex++; + } + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestEntity)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + protected override void PopulateData() + { + var randomer = new Random(); + using (var session = Domain.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + foreach (var value in unsortedValueSequence) + new TestEntity { OrderByThisField = value }; + + transaction.Complete(); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/FailedQueryAndDbCommandNotificationsTest.cs b/Orm/Xtensive.Orm.Tests/Storage/FailedQueryAndDbCommandNotificationsTest.cs index fc7d4fd965..b414748bbc 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/FailedQueryAndDbCommandNotificationsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/FailedQueryAndDbCommandNotificationsTest.cs @@ -1,127 +1,127 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Julian Mamokin -// Created: 2017.02.08 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.FailedQueryAndDbCommandNotificationsTestModel; - -namespace Xtensive.Orm.Tests.Storage.FailedQueryAndDbCommandNotificationsTestModel -{ - [HierarchyRoot] - [Index("UniqueValue", Unique = true)] - public class TestModel : Entity - { - [Key, Field] - public long Id { get; set; } - - [Field] - public string SomeStringField { get; set; } - - [Field] - public DateTime SomeDateTimeField { get; set; } - - [Field] - public int UniqueValue { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class FailedQueryAndDbCommandNotificationsTest : AutoBuildTest - { - [Test] - public void InvalidQueryTest() - { - Exception thrownException = null; - EventHandler invalidQueryHandler = (sender, args) => {thrownException = args.Exception;}; - using (var session = Domain.OpenSession()) { - session.Events.QueryExecuted += invalidQueryHandler; - using (session.OpenTransaction()) - Assert.Throws(() => session.Query.All().Single(m => m.SomeStringField=="lol")); - session.Events.QueryExecuted -= invalidQueryHandler; - Assert.IsNotNull(thrownException); - Assert.AreSame(typeof (InvalidOperationException), thrownException.GetType()); - } - } - - [Test] - public void ValidQueryTest() - { - EventHandler validQueryHandler = (sender, args) => { Assert.IsNull(args.Exception); }; - using (var session = Domain.OpenSession()) { - session.Events.QueryExecuted += validQueryHandler; - using (session.OpenTransaction()) - Assert.DoesNotThrow(() => session.Query.All().Single(m => m.SomeStringField=="string1")); - session.Events.QueryExecuted -= validQueryHandler; - } - } - - [Test] - public void InvalidDbCommandTest() - { - Exception commandExecutedException = null; - EventHandler invalidDbCommandHandler = (sender, args) => { commandExecutedException = args.Exception; }; - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - new TestModel { SomeStringField = "wat", SomeDateTimeField = DateTime.Now, UniqueValue = 1 }; - var expectedException = GetUniqueConstraintViolationExceptionType(); - session.Events.DbCommandExecuted += invalidDbCommandHandler; - Assert.Throws(expectedException, () => session.SaveChanges()); - session.Events.DbCommandExecuted -= invalidDbCommandHandler; - Assert.NotNull(commandExecutedException); - Assert.AreEqual(expectedException, commandExecutedException.GetType()); - } - } - } - - [Test] - public void ValidDbCommandTest() - { - EventHandler validDbCommandHandler = (sender, args) => { Assert.IsNull(args.Exception); }; - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - new TestModel { SomeStringField = "wat", SomeDateTimeField = DateTime.Now, UniqueValue = 3 }; - new TestModel { SomeStringField = "dat", SomeDateTimeField = DateTime.Now, UniqueValue = 4 }; - session.Events.DbCommandExecuted += validDbCommandHandler; - Assert.DoesNotThrow(() => session.SaveChanges()); - session.Events.DbCommandExecuted -= validDbCommandHandler; - } - } - } - - protected override void PopulateData() - { - using(var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new TestModel { SomeStringField = "string1", SomeDateTimeField = DateTime.Now, UniqueValue = 1 }; - transaction.Complete(); - } - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (TestModel).Assembly, typeof (TestModel).Namespace); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - return configuration; - } - - private Type GetUniqueConstraintViolationExceptionType() - { - var providerName = ProviderInfo.ProviderName; - switch (providerName) { - case WellKnown.Provider.MySql: - case WellKnown.Provider.Sqlite: - case WellKnown.Provider.Firebird: - return typeof (StorageException); - default: - return typeof (UniqueConstraintViolationException); - } - } - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Julian Mamokin +// Created: 2017.02.08 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.FailedQueryAndDbCommandNotificationsTestModel; + +namespace Xtensive.Orm.Tests.Storage.FailedQueryAndDbCommandNotificationsTestModel +{ + [HierarchyRoot] + [Index("UniqueValue", Unique = true)] + public class TestModel : Entity + { + [Key, Field] + public long Id { get; set; } + + [Field] + public string SomeStringField { get; set; } + + [Field] + public DateTime SomeDateTimeField { get; set; } + + [Field] + public int UniqueValue { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class FailedQueryAndDbCommandNotificationsTest : AutoBuildTest + { + [Test] + public void InvalidQueryTest() + { + Exception thrownException = null; + EventHandler invalidQueryHandler = (sender, args) => {thrownException = args.Exception;}; + using (var session = Domain.OpenSession()) { + session.Events.QueryExecuted += invalidQueryHandler; + using (session.OpenTransaction()) + Assert.Throws(() => session.Query.All().Single(m => m.SomeStringField=="lol")); + session.Events.QueryExecuted -= invalidQueryHandler; + Assert.IsNotNull(thrownException); + Assert.AreSame(typeof (InvalidOperationException), thrownException.GetType()); + } + } + + [Test] + public void ValidQueryTest() + { + EventHandler validQueryHandler = (sender, args) => { Assert.IsNull(args.Exception); }; + using (var session = Domain.OpenSession()) { + session.Events.QueryExecuted += validQueryHandler; + using (session.OpenTransaction()) + Assert.DoesNotThrow(() => session.Query.All().Single(m => m.SomeStringField=="string1")); + session.Events.QueryExecuted -= validQueryHandler; + } + } + + [Test] + public void InvalidDbCommandTest() + { + Exception commandExecutedException = null; + EventHandler invalidDbCommandHandler = (sender, args) => { commandExecutedException = args.Exception; }; + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + new TestModel { SomeStringField = "wat", SomeDateTimeField = DateTime.Now, UniqueValue = 1 }; + var expectedException = GetUniqueConstraintViolationExceptionType(); + session.Events.DbCommandExecuted += invalidDbCommandHandler; + Assert.Throws(expectedException, () => session.SaveChanges()); + session.Events.DbCommandExecuted -= invalidDbCommandHandler; + Assert.NotNull(commandExecutedException); + Assert.AreEqual(expectedException, commandExecutedException.GetType()); + } + } + } + + [Test] + public void ValidDbCommandTest() + { + EventHandler validDbCommandHandler = (sender, args) => { Assert.IsNull(args.Exception); }; + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + new TestModel { SomeStringField = "wat", SomeDateTimeField = DateTime.Now, UniqueValue = 3 }; + new TestModel { SomeStringField = "dat", SomeDateTimeField = DateTime.Now, UniqueValue = 4 }; + session.Events.DbCommandExecuted += validDbCommandHandler; + Assert.DoesNotThrow(() => session.SaveChanges()); + session.Events.DbCommandExecuted -= validDbCommandHandler; + } + } + } + + protected override void PopulateData() + { + using(var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new TestModel { SomeStringField = "string1", SomeDateTimeField = DateTime.Now, UniqueValue = 1 }; + transaction.Complete(); + } + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (TestModel).Assembly, typeof (TestModel).Namespace); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + return configuration; + } + + private Type GetUniqueConstraintViolationExceptionType() + { + var providerName = ProviderInfo.ProviderName; + switch (providerName) { + case WellKnown.Provider.MySql: + case WellKnown.Provider.Sqlite: + case WellKnown.Provider.Firebird: + return typeof (StorageException); + default: + return typeof (UniqueConstraintViolationException); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/FieldDefaultValueTest.cs b/Orm/Xtensive.Orm.Tests/Storage/FieldDefaultValueTest.cs index 8072cc07ba..6a9d6e3137 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/FieldDefaultValueTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/FieldDefaultValueTest.cs @@ -1,366 +1,366 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.09.19 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Info; -using Xtensive.Orm.Tests.Storage.FieldDefaultValueModel; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage.FieldDefaultValueModel -{ - public static class CodeRegistry - { - public const string GuidKeyValue = "b4fa0c56-be9a-4bd0-a50f-17c4c6b4af91"; - public const string GuidDefaultValue = "6C539ECE-E02A-42C1-B6D3-BEC03A0A25EA"; - public const OneTwo EnumKeyValue = OneTwo.Two; - } - - #region Various enums - - public enum EByte : byte - { - Min = byte.MinValue, Default = 0, Max = byte.MaxValue - } - - public enum ESByte : sbyte - { - Min = sbyte.MinValue, Default = 0, Max = sbyte.MaxValue - } - - public enum EShort : short - { - Min = short.MinValue, Default = 0, Max = short.MaxValue - } - - public enum EUShort : ushort - { - Min = ushort.MinValue, Default = 0, Max = ushort.MaxValue - } - - public enum EInt : int - { - Min = int.MinValue, Default = 0, Max = int.MaxValue - } - - public enum EUInt : uint - { - Min = uint.MinValue, Default = 0, Max = uint.MaxValue - } - - public enum ELong : long - { - Min = long.MinValue, Default = 0, Max = long.MaxValue - } - - public enum EULong : ulong - { - Min = ulong.MinValue, Default = 0, Max = long.MaxValue - } - - public enum OneTwo - { - One = 1, - Two = 2, - } - - #endregion - - [HierarchyRoot] - public class XRef : Entity - { - [Field, Key] - public Guid Id { get; private set;} - - public XRef(Guid key) - : base(key) - {} - } - - [HierarchyRoot] - public class EnumKeyEntity : Entity - { - [Key, Field] - public OneTwo Id { get; private set; } - - [Field] - public OneTwo OneTwoField { get; set; } - - public EnumKeyEntity(OneTwo id) - : base(id) - {} - } - - [Serializable] - [HierarchyRoot] - public class X : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(DefaultValue = true)] - public bool FBool { get; set; } - - [Field(DefaultValue = byte.MaxValue)] - public byte FByte { get; set; } - - [Field(DefaultValue = sbyte.MaxValue)] - public sbyte FSByte { get; set; } - - [Field(DefaultValue = short.MaxValue)] - public short FShort { get; set; } - - [Field(DefaultValue = ushort.MaxValue)] - public ushort FUShort { get; set; } - - [Field(DefaultValue = int.MaxValue)] - public int FInt { get; set; } - - [Field(DefaultValue = uint.MaxValue)] - public uint FUInt { get; set; } - - [Field(DefaultValue = long.MaxValue)] - public long FLong { get; set; } - - [Field(DefaultValue = long.MaxValue)] // SQLite provides only 8 byte signed integer - public ulong FULong { get; set; } - - [Field(DefaultValue = CodeRegistry.GuidDefaultValue)] - public Guid FGuid { get; set; } - - [Field(DefaultValue = float.MaxValue)] - public float FFloat { get; set; } - - [Field(DefaultValue = float.MaxValue)] - public double FDouble { get; set; } - - [Field(DefaultValue = 12.12)] - public decimal FDecimal { get; set; } - - [Field(DefaultValue = "2012.12.12")] - public DateTime FDateTime { get; set; } - - [Field(DefaultValue = 1000)] - public TimeSpan FTimeSpan { get; set; } - - [Field(Length = 1000, DefaultValue = new byte[] {10,10,10,10})] - public byte[] FByteArray { get; set; } - - [Field(Length = int.MaxValue, DefaultValue = new byte[] {10,10,10,10})] - public byte[] FLongByteArray { get; set; } - - [Field(Length = 1000, DefaultValue = "default value")] - public string FString { get; set; } - - [Field(Length = int.MaxValue, DefaultValue = "default value")] - public string FLongString { get; set; } - - [Field(DefaultValue = EByte.Max)] - public EByte FEByte { get; set; } - - [Field(DefaultValue = ESByte.Max)] - public ESByte FESByte { get; set; } - - [Field(DefaultValue = EShort.Max)] - public EShort FEShort { get; set; } - - [Field(DefaultValue = EUShort.Max)] - public EUShort FEUShort { get; set; } - - [Field(DefaultValue = EInt.Max)] - public EInt FEInt { get; set; } - - [Field(DefaultValue = EUInt.Max)] - public EUInt FEUInt { get; set; } - - [Field(DefaultValue = ELong.Max)] - public ELong FELong { get; set; } - - [Field(DefaultValue = EULong.Max)] - public EULong FEULong { get; set; } - - // Nullable fields - - [Field(DefaultValue = true)] - public bool? FNBool { get; set; } - - [Field(DefaultValue = 'x')] - public char? FNChar { get; set; } - - [Field(DefaultValue = byte.MaxValue)] - public byte? FNByte { get; set; } - - [Field(DefaultValue = sbyte.MaxValue)] - public sbyte? FNSByte { get; set; } - - [Field(DefaultValue = short.MaxValue)] - public short? FNShort { get; set; } - - [Field(DefaultValue = ushort.MaxValue)] - public ushort? FNUShort { get; set; } - - [Field(DefaultValue = int.MaxValue)] - public int? FNInt { get; set; } - - [Field(DefaultValue = uint.MaxValue)] - public uint? FNUInt { get; set; } - - [Field(DefaultValue = long.MaxValue)] - public long? FNLong { get; set; } - - [Field(DefaultValue = long.MaxValue)] // SQLite provides only 8 byte signed integer - public ulong? FNULong { get; set; } - - [Field(DefaultValue = CodeRegistry.GuidDefaultValue)] - public Guid? FNGuid { get; set; } - - [Field(DefaultValue = float.MaxValue)] - public float? FNFloat { get; set; } - - [Field(DefaultValue = float.MaxValue)] - public double? FNDouble { get; set; } - - [Field(DefaultValue = 12.12)] - public decimal? FNDecimal { get; set; } - - [Field(DefaultValue = "2012.12.12")] - public DateTime? FNDateTime { get; set; } - - [Field(DefaultValue = 1000)] - public TimeSpan? FNTimeSpan { get; set; } - - [Field(DefaultValue = EByte.Max)] - public EByte? FNEByte { get; set; } - - [Field(DefaultValue = ESByte.Max)] - public ESByte? FNESByte { get; set; } - - [Field(DefaultValue = EShort.Max)] - public EShort? FNEShort { get; set; } - - [Field(DefaultValue = EUShort.Max)] - public EUShort? FNEUShort { get; set; } - - [Field(DefaultValue = EInt.Max)] - public EInt? FNEInt { get; set; } - - [Field(DefaultValue = EUInt.Max)] - public EUInt? FNEUInt { get; set; } - - [Field(DefaultValue = ELong.Max)] - public ELong? FNELong { get; set; } - - [Field(DefaultValue = EULong.Max)] - public EULong? FNEULong { get; set; } - - [Field(DefaultValue = CodeRegistry.GuidKeyValue)] - public XRef Ref { get; set; } - - [Field(DefaultValue = CodeRegistry.EnumKeyValue)] - public EnumKeyEntity EnumKeyEntityRef { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class FieldDefaultValueTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (X).Assembly, typeof (X).Namespace); - return config; - } - - [Test] - public void DefaultValuesTest() - { - using (Domain.OpenSession()) { - Key key; - using (var t = Session.Current.OpenTransaction()) { - // To be sure that the reference field (X.Ref) would have meaning - new XRef(new Guid(CodeRegistry.GuidKeyValue)); - new EnumKeyEntity(CodeRegistry.EnumKeyValue); - key = new X().Key; - t.Complete(); - } - - using (var t = Session.Current.OpenTransaction()) { - X x = Query.SingleOrDefault(key); - Assert.AreEqual(true, x.FBool); - Assert.AreEqual(byte.MaxValue, x.FByte); - Assert.AreEqual(new byte[] {10, 10, 10, 10}, x.FByteArray); - Assert.AreEqual(DateTime.Parse("2012.12.12"), x.FDateTime); - Assert.AreEqual(12.12M, x.FDecimal); - Assert.AreEqual(float.MaxValue, x.FDouble); - Assert.AreEqual(EByte.Max, x.FEByte); - Assert.AreEqual(EInt.Max, x.FEInt); - Assert.AreEqual(ELong.Max, x.FELong); - Assert.AreEqual(ESByte.Max, x.FESByte); - Assert.AreEqual(EShort.Max, x.FEShort); - Assert.AreEqual(EUInt.Max, x.FEUInt); - Assert.AreEqual(EULong.Max, x.FEULong); - Assert.AreEqual(EUShort.Max, x.FEUShort); - Assert.AreEqual(float.MaxValue, x.FFloat); - Assert.AreEqual(new Guid(CodeRegistry.GuidDefaultValue), x.FGuid); - Assert.AreEqual(int.MaxValue, x.FInt); - Assert.AreEqual(long.MaxValue, x.FLong); - Assert.AreEqual(new byte[] {10, 10, 10, 10}, x.FLongByteArray); - Assert.AreEqual("default value", x.FLongString); - Assert.AreEqual(sbyte.MaxValue, x.FSByte); - Assert.AreEqual(short.MaxValue, x.FShort); - Assert.AreEqual("default value", x.FString); - Assert.AreEqual(TimeSpan.FromTicks(1000), x.FTimeSpan); - Assert.AreEqual(uint.MaxValue, x.FUInt); - Assert.AreEqual(long.MaxValue, x.FULong); - Assert.AreEqual(ushort.MaxValue, x.FUShort); - - Assert.AreEqual(true, x.FNBool); - Assert.AreEqual(byte.MaxValue, x.FNByte); - Assert.AreEqual(DateTime.Parse("2012.12.12"), x.FNDateTime); - Assert.AreEqual(12.12M, x.FNDecimal); - Assert.AreEqual(float.MaxValue, x.FNDouble); - Assert.AreEqual(EByte.Max, x.FNEByte); - Assert.AreEqual(EInt.Max, x.FNEInt); - Assert.AreEqual(ELong.Max, x.FNELong); - Assert.AreEqual(ESByte.Max, x.FNESByte); - Assert.AreEqual(EShort.Max, x.FNEShort); - Assert.AreEqual(EUInt.Max, x.FNEUInt); - Assert.AreEqual(EULong.Max, x.FNEULong); - Assert.AreEqual(EUShort.Max, x.FNEUShort); - Assert.AreEqual(float.MaxValue, x.FNFloat); - Assert.AreEqual(new Guid(CodeRegistry.GuidDefaultValue), x.FNGuid); - Assert.AreEqual(int.MaxValue, x.FNInt); - Assert.AreEqual(long.MaxValue, x.FNLong); - Assert.AreEqual(sbyte.MaxValue, x.FNSByte); - Assert.AreEqual(short.MaxValue, x.FNShort); - Assert.AreEqual(TimeSpan.FromTicks(1000), x.FNTimeSpan); - Assert.AreEqual(uint.MaxValue, x.FNUInt); - Assert.AreEqual(long.MaxValue, x.FNULong); - Assert.AreEqual(ushort.MaxValue, x.FNUShort); - Assert.IsNotNull(x.Ref); - Assert.IsNotNull(x.EnumKeyEntityRef); - - t.Complete(); - } - } - } - - [Test] - public void ValidateTest() - { - var configuration = BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Validate; - configuration.Types.Register(typeof (X)); - var domain = Domain.Build(configuration); - domain.Dispose(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.09.19 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Info; +using Xtensive.Orm.Tests.Storage.FieldDefaultValueModel; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage.FieldDefaultValueModel +{ + public static class CodeRegistry + { + public const string GuidKeyValue = "b4fa0c56-be9a-4bd0-a50f-17c4c6b4af91"; + public const string GuidDefaultValue = "6C539ECE-E02A-42C1-B6D3-BEC03A0A25EA"; + public const OneTwo EnumKeyValue = OneTwo.Two; + } + + #region Various enums + + public enum EByte : byte + { + Min = byte.MinValue, Default = 0, Max = byte.MaxValue + } + + public enum ESByte : sbyte + { + Min = sbyte.MinValue, Default = 0, Max = sbyte.MaxValue + } + + public enum EShort : short + { + Min = short.MinValue, Default = 0, Max = short.MaxValue + } + + public enum EUShort : ushort + { + Min = ushort.MinValue, Default = 0, Max = ushort.MaxValue + } + + public enum EInt : int + { + Min = int.MinValue, Default = 0, Max = int.MaxValue + } + + public enum EUInt : uint + { + Min = uint.MinValue, Default = 0, Max = uint.MaxValue + } + + public enum ELong : long + { + Min = long.MinValue, Default = 0, Max = long.MaxValue + } + + public enum EULong : ulong + { + Min = ulong.MinValue, Default = 0, Max = long.MaxValue + } + + public enum OneTwo + { + One = 1, + Two = 2, + } + + #endregion + + [HierarchyRoot] + public class XRef : Entity + { + [Field, Key] + public Guid Id { get; private set;} + + public XRef(Guid key) + : base(key) + {} + } + + [HierarchyRoot] + public class EnumKeyEntity : Entity + { + [Key, Field] + public OneTwo Id { get; private set; } + + [Field] + public OneTwo OneTwoField { get; set; } + + public EnumKeyEntity(OneTwo id) + : base(id) + {} + } + + [Serializable] + [HierarchyRoot] + public class X : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(DefaultValue = true)] + public bool FBool { get; set; } + + [Field(DefaultValue = byte.MaxValue)] + public byte FByte { get; set; } + + [Field(DefaultValue = sbyte.MaxValue)] + public sbyte FSByte { get; set; } + + [Field(DefaultValue = short.MaxValue)] + public short FShort { get; set; } + + [Field(DefaultValue = ushort.MaxValue)] + public ushort FUShort { get; set; } + + [Field(DefaultValue = int.MaxValue)] + public int FInt { get; set; } + + [Field(DefaultValue = uint.MaxValue)] + public uint FUInt { get; set; } + + [Field(DefaultValue = long.MaxValue)] + public long FLong { get; set; } + + [Field(DefaultValue = long.MaxValue)] // SQLite provides only 8 byte signed integer + public ulong FULong { get; set; } + + [Field(DefaultValue = CodeRegistry.GuidDefaultValue)] + public Guid FGuid { get; set; } + + [Field(DefaultValue = float.MaxValue)] + public float FFloat { get; set; } + + [Field(DefaultValue = float.MaxValue)] + public double FDouble { get; set; } + + [Field(DefaultValue = 12.12)] + public decimal FDecimal { get; set; } + + [Field(DefaultValue = "2012.12.12")] + public DateTime FDateTime { get; set; } + + [Field(DefaultValue = 1000)] + public TimeSpan FTimeSpan { get; set; } + + [Field(Length = 1000, DefaultValue = new byte[] {10,10,10,10})] + public byte[] FByteArray { get; set; } + + [Field(Length = int.MaxValue, DefaultValue = new byte[] {10,10,10,10})] + public byte[] FLongByteArray { get; set; } + + [Field(Length = 1000, DefaultValue = "default value")] + public string FString { get; set; } + + [Field(Length = int.MaxValue, DefaultValue = "default value")] + public string FLongString { get; set; } + + [Field(DefaultValue = EByte.Max)] + public EByte FEByte { get; set; } + + [Field(DefaultValue = ESByte.Max)] + public ESByte FESByte { get; set; } + + [Field(DefaultValue = EShort.Max)] + public EShort FEShort { get; set; } + + [Field(DefaultValue = EUShort.Max)] + public EUShort FEUShort { get; set; } + + [Field(DefaultValue = EInt.Max)] + public EInt FEInt { get; set; } + + [Field(DefaultValue = EUInt.Max)] + public EUInt FEUInt { get; set; } + + [Field(DefaultValue = ELong.Max)] + public ELong FELong { get; set; } + + [Field(DefaultValue = EULong.Max)] + public EULong FEULong { get; set; } + + // Nullable fields + + [Field(DefaultValue = true)] + public bool? FNBool { get; set; } + + [Field(DefaultValue = 'x')] + public char? FNChar { get; set; } + + [Field(DefaultValue = byte.MaxValue)] + public byte? FNByte { get; set; } + + [Field(DefaultValue = sbyte.MaxValue)] + public sbyte? FNSByte { get; set; } + + [Field(DefaultValue = short.MaxValue)] + public short? FNShort { get; set; } + + [Field(DefaultValue = ushort.MaxValue)] + public ushort? FNUShort { get; set; } + + [Field(DefaultValue = int.MaxValue)] + public int? FNInt { get; set; } + + [Field(DefaultValue = uint.MaxValue)] + public uint? FNUInt { get; set; } + + [Field(DefaultValue = long.MaxValue)] + public long? FNLong { get; set; } + + [Field(DefaultValue = long.MaxValue)] // SQLite provides only 8 byte signed integer + public ulong? FNULong { get; set; } + + [Field(DefaultValue = CodeRegistry.GuidDefaultValue)] + public Guid? FNGuid { get; set; } + + [Field(DefaultValue = float.MaxValue)] + public float? FNFloat { get; set; } + + [Field(DefaultValue = float.MaxValue)] + public double? FNDouble { get; set; } + + [Field(DefaultValue = 12.12)] + public decimal? FNDecimal { get; set; } + + [Field(DefaultValue = "2012.12.12")] + public DateTime? FNDateTime { get; set; } + + [Field(DefaultValue = 1000)] + public TimeSpan? FNTimeSpan { get; set; } + + [Field(DefaultValue = EByte.Max)] + public EByte? FNEByte { get; set; } + + [Field(DefaultValue = ESByte.Max)] + public ESByte? FNESByte { get; set; } + + [Field(DefaultValue = EShort.Max)] + public EShort? FNEShort { get; set; } + + [Field(DefaultValue = EUShort.Max)] + public EUShort? FNEUShort { get; set; } + + [Field(DefaultValue = EInt.Max)] + public EInt? FNEInt { get; set; } + + [Field(DefaultValue = EUInt.Max)] + public EUInt? FNEUInt { get; set; } + + [Field(DefaultValue = ELong.Max)] + public ELong? FNELong { get; set; } + + [Field(DefaultValue = EULong.Max)] + public EULong? FNEULong { get; set; } + + [Field(DefaultValue = CodeRegistry.GuidKeyValue)] + public XRef Ref { get; set; } + + [Field(DefaultValue = CodeRegistry.EnumKeyValue)] + public EnumKeyEntity EnumKeyEntityRef { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class FieldDefaultValueTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (X).Assembly, typeof (X).Namespace); + return config; + } + + [Test] + public void DefaultValuesTest() + { + using (Domain.OpenSession()) { + Key key; + using (var t = Session.Current.OpenTransaction()) { + // To be sure that the reference field (X.Ref) would have meaning + new XRef(new Guid(CodeRegistry.GuidKeyValue)); + new EnumKeyEntity(CodeRegistry.EnumKeyValue); + key = new X().Key; + t.Complete(); + } + + using (var t = Session.Current.OpenTransaction()) { + X x = Query.SingleOrDefault(key); + Assert.AreEqual(true, x.FBool); + Assert.AreEqual(byte.MaxValue, x.FByte); + Assert.AreEqual(new byte[] {10, 10, 10, 10}, x.FByteArray); + Assert.AreEqual(DateTime.Parse("2012.12.12"), x.FDateTime); + Assert.AreEqual(12.12M, x.FDecimal); + Assert.AreEqual(float.MaxValue, x.FDouble); + Assert.AreEqual(EByte.Max, x.FEByte); + Assert.AreEqual(EInt.Max, x.FEInt); + Assert.AreEqual(ELong.Max, x.FELong); + Assert.AreEqual(ESByte.Max, x.FESByte); + Assert.AreEqual(EShort.Max, x.FEShort); + Assert.AreEqual(EUInt.Max, x.FEUInt); + Assert.AreEqual(EULong.Max, x.FEULong); + Assert.AreEqual(EUShort.Max, x.FEUShort); + Assert.AreEqual(float.MaxValue, x.FFloat); + Assert.AreEqual(new Guid(CodeRegistry.GuidDefaultValue), x.FGuid); + Assert.AreEqual(int.MaxValue, x.FInt); + Assert.AreEqual(long.MaxValue, x.FLong); + Assert.AreEqual(new byte[] {10, 10, 10, 10}, x.FLongByteArray); + Assert.AreEqual("default value", x.FLongString); + Assert.AreEqual(sbyte.MaxValue, x.FSByte); + Assert.AreEqual(short.MaxValue, x.FShort); + Assert.AreEqual("default value", x.FString); + Assert.AreEqual(TimeSpan.FromTicks(1000), x.FTimeSpan); + Assert.AreEqual(uint.MaxValue, x.FUInt); + Assert.AreEqual(long.MaxValue, x.FULong); + Assert.AreEqual(ushort.MaxValue, x.FUShort); + + Assert.AreEqual(true, x.FNBool); + Assert.AreEqual(byte.MaxValue, x.FNByte); + Assert.AreEqual(DateTime.Parse("2012.12.12"), x.FNDateTime); + Assert.AreEqual(12.12M, x.FNDecimal); + Assert.AreEqual(float.MaxValue, x.FNDouble); + Assert.AreEqual(EByte.Max, x.FNEByte); + Assert.AreEqual(EInt.Max, x.FNEInt); + Assert.AreEqual(ELong.Max, x.FNELong); + Assert.AreEqual(ESByte.Max, x.FNESByte); + Assert.AreEqual(EShort.Max, x.FNEShort); + Assert.AreEqual(EUInt.Max, x.FNEUInt); + Assert.AreEqual(EULong.Max, x.FNEULong); + Assert.AreEqual(EUShort.Max, x.FNEUShort); + Assert.AreEqual(float.MaxValue, x.FNFloat); + Assert.AreEqual(new Guid(CodeRegistry.GuidDefaultValue), x.FNGuid); + Assert.AreEqual(int.MaxValue, x.FNInt); + Assert.AreEqual(long.MaxValue, x.FNLong); + Assert.AreEqual(sbyte.MaxValue, x.FNSByte); + Assert.AreEqual(short.MaxValue, x.FNShort); + Assert.AreEqual(TimeSpan.FromTicks(1000), x.FNTimeSpan); + Assert.AreEqual(uint.MaxValue, x.FNUInt); + Assert.AreEqual(long.MaxValue, x.FNULong); + Assert.AreEqual(ushort.MaxValue, x.FNUShort); + Assert.IsNotNull(x.Ref); + Assert.IsNotNull(x.EnumKeyEntityRef); + + t.Complete(); + } + } + } + + [Test] + public void ValidateTest() + { + var configuration = BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Validate; + configuration.Types.Register(typeof (X)); + var domain = Domain.Build(configuration); + domain.Dispose(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/FieldSqlDefaultTest.cs b/Orm/Xtensive.Orm.Tests/Storage/FieldSqlDefaultTest.cs index 06ada1d075..41cd688b15 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/FieldSqlDefaultTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/FieldSqlDefaultTest.cs @@ -1,143 +1,143 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2014.02.26 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.FieldSqlDefaultTestModel; - -namespace Xtensive.Orm.Tests.Storage.FieldSqlDefaultTestModel -{ - [HierarchyRoot] - public class TestEntity1 : Entity - { - [Field (DefaultSqlExpression = "newid()"), Key] - public Guid Id { get; private set; } - } - - [HierarchyRoot] - public class TestEntity : Entity - { - [Field (DefaultSqlExpression = "1"), Key] - public int Id { get; private set; } - - [Field(DefaultValue = byte.MaxValue, DefaultSqlExpression = "64")] - public byte FByte { get; set; } - - [Field(DefaultValue = sbyte.MaxValue, DefaultSqlExpression = "65")] - public sbyte FSByte { get; set; } - - [Field(DefaultValue = short.MaxValue, DefaultSqlExpression = "66")] - public short FShort { get; set; } - - [Field(DefaultValue = ushort.MaxValue, DefaultSqlExpression = "67")] - public ushort FUShort { get; set; } - - [Field(DefaultValue = int.MaxValue, DefaultSqlExpression = "68")] - public int FInt { get; set; } - - [Field(DefaultValue = uint.MaxValue, DefaultSqlExpression = "69")] - public uint FUInt { get; set; } - - [Field(DefaultValue = long.MaxValue, DefaultSqlExpression = "70")] - public long FLong { get; set; } - - [Field(DefaultValue = long.MaxValue, DefaultSqlExpression = "71")] // SQLite provides only 8 byte signed integer - public ulong FULong { get; set; } - - [Field(DefaultValue = float.MaxValue, DefaultSqlExpression = "72.0")] - public float FFloat { get; set; } - - [Field(DefaultValue = float.MaxValue, DefaultSqlExpression = "73.0")] - public double FDouble { get; set; } - - [Field(DefaultValue = 12.12, DefaultSqlExpression = "12.12")] - public decimal FDecimal { get; set; } - - [Field(DefaultValue = "2012.12.12", DefaultSqlExpression = "'2013.12.13'")] - public DateTime FDateTime { get; set; } - - [Field(Length = 1000, DefaultValue = "default value", DefaultSqlExpression = "'sql value'")] - public string FString { get; set; } - } - -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class FieldSqlDefaultTest : AutoBuildTest - { - [Test] - public void MainTest() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(TestEntity)); - Domain = Domain.Build(configuration); - - var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); - using (var connection = driver.CreateConnection()) { - connection.Open(); - var command = connection.CreateCommand(); - var translator = driver.Translator; - command.CommandText = string.Format("INSERT INTO {0}({1}) values(1);", translator.QuoteIdentifier("TestEntity"), translator.QuoteIdentifier("Id")); - command.ExecuteNonQuery(); - connection.Close(); - } - - - using (var session = Domain.OpenSession()) { - using (var transaction = session.OpenTransaction()) { - var entity = session.Query.All().First(); - Assert.AreEqual(1, entity.Id); - Assert.AreEqual(64, entity.FByte); - Assert.AreEqual(65, entity.FSByte); - Assert.AreEqual(66, entity.FShort); - Assert.AreEqual(67, entity.FUShort); - Assert.AreEqual(68, entity.FInt); - Assert.AreEqual(69, entity.FUInt); - Assert.AreEqual(70L, entity.FLong); - Assert.AreEqual(71L, entity.FULong); - Assert.AreEqual(72.0, entity.FFloat); - Assert.AreEqual(73.0, entity.FDouble); - Assert.AreEqual(12.12M, entity.FDecimal); - Assert.AreEqual(DateTime.Parse("2013.12.13"), entity.FDateTime); - Assert.AreEqual("sql value", entity.FString); - transaction.Complete(); - } - } - } - - [Test] - public void DefaultValueTestForKeyFieldTest() - { - Require.ProviderIs(StorageProvider.SqlServer); - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (TestEntity1)); - Domain = Domain.Build(configuration); - - var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); - using (var connection = driver.CreateConnection()) { - connection.Open(); - var command = connection.CreateCommand(); - var translator = driver.Translator; - command.CommandText = string.Format("INSERT INTO {0} DEFAULT VALUES;", translator.QuoteIdentifier("TestEntity1")); - command.ExecuteNonQuery(); - connection.Close(); - } - - using (var session = Domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var entity = session.Query.All().FirstOrDefault(); - Assert.IsNotNull(entity); - Assert.IsNotNull(entity.Id); - } - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2014.02.26 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.FieldSqlDefaultTestModel; + +namespace Xtensive.Orm.Tests.Storage.FieldSqlDefaultTestModel +{ + [HierarchyRoot] + public class TestEntity1 : Entity + { + [Field (DefaultSqlExpression = "newid()"), Key] + public Guid Id { get; private set; } + } + + [HierarchyRoot] + public class TestEntity : Entity + { + [Field (DefaultSqlExpression = "1"), Key] + public int Id { get; private set; } + + [Field(DefaultValue = byte.MaxValue, DefaultSqlExpression = "64")] + public byte FByte { get; set; } + + [Field(DefaultValue = sbyte.MaxValue, DefaultSqlExpression = "65")] + public sbyte FSByte { get; set; } + + [Field(DefaultValue = short.MaxValue, DefaultSqlExpression = "66")] + public short FShort { get; set; } + + [Field(DefaultValue = ushort.MaxValue, DefaultSqlExpression = "67")] + public ushort FUShort { get; set; } + + [Field(DefaultValue = int.MaxValue, DefaultSqlExpression = "68")] + public int FInt { get; set; } + + [Field(DefaultValue = uint.MaxValue, DefaultSqlExpression = "69")] + public uint FUInt { get; set; } + + [Field(DefaultValue = long.MaxValue, DefaultSqlExpression = "70")] + public long FLong { get; set; } + + [Field(DefaultValue = long.MaxValue, DefaultSqlExpression = "71")] // SQLite provides only 8 byte signed integer + public ulong FULong { get; set; } + + [Field(DefaultValue = float.MaxValue, DefaultSqlExpression = "72.0")] + public float FFloat { get; set; } + + [Field(DefaultValue = float.MaxValue, DefaultSqlExpression = "73.0")] + public double FDouble { get; set; } + + [Field(DefaultValue = 12.12, DefaultSqlExpression = "12.12")] + public decimal FDecimal { get; set; } + + [Field(DefaultValue = "2012.12.12", DefaultSqlExpression = "'2013.12.13'")] + public DateTime FDateTime { get; set; } + + [Field(Length = 1000, DefaultValue = "default value", DefaultSqlExpression = "'sql value'")] + public string FString { get; set; } + } + +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class FieldSqlDefaultTest : AutoBuildTest + { + [Test] + public void MainTest() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(TestEntity)); + Domain = Domain.Build(configuration); + + var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); + using (var connection = driver.CreateConnection()) { + connection.Open(); + var command = connection.CreateCommand(); + var translator = driver.Translator; + command.CommandText = string.Format("INSERT INTO {0}({1}) values(1);", translator.QuoteIdentifier("TestEntity"), translator.QuoteIdentifier("Id")); + command.ExecuteNonQuery(); + connection.Close(); + } + + + using (var session = Domain.OpenSession()) { + using (var transaction = session.OpenTransaction()) { + var entity = session.Query.All().First(); + Assert.AreEqual(1, entity.Id); + Assert.AreEqual(64, entity.FByte); + Assert.AreEqual(65, entity.FSByte); + Assert.AreEqual(66, entity.FShort); + Assert.AreEqual(67, entity.FUShort); + Assert.AreEqual(68, entity.FInt); + Assert.AreEqual(69, entity.FUInt); + Assert.AreEqual(70L, entity.FLong); + Assert.AreEqual(71L, entity.FULong); + Assert.AreEqual(72.0, entity.FFloat); + Assert.AreEqual(73.0, entity.FDouble); + Assert.AreEqual(12.12M, entity.FDecimal); + Assert.AreEqual(DateTime.Parse("2013.12.13"), entity.FDateTime); + Assert.AreEqual("sql value", entity.FString); + transaction.Complete(); + } + } + } + + [Test] + public void DefaultValueTestForKeyFieldTest() + { + Require.ProviderIs(StorageProvider.SqlServer); + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (TestEntity1)); + Domain = Domain.Build(configuration); + + var driver = TestSqlDriver.Create(Domain.Configuration.ConnectionInfo); + using (var connection = driver.CreateConnection()) { + connection.Open(); + var command = connection.CreateCommand(); + var translator = driver.Translator; + command.CommandText = string.Format("INSERT INTO {0} DEFAULT VALUES;", translator.QuoteIdentifier("TestEntity1")); + command.ExecuteNonQuery(); + connection.Close(); + } + + using (var session = Domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var entity = session.Query.All().FirstOrDefault(); + Assert.IsNotNull(entity); + Assert.IsNotNull(entity.Id); + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/ForceServerVersion.cs b/Orm/Xtensive.Orm.Tests/Storage/ForceServerVersion.cs index a283c20d72..0a275e8c04 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ForceServerVersion.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ForceServerVersion.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.06 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Storage.ForceServerVersionModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace ForceServerVersionModel - { - [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] - public class Forced : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public DateTime DateTimeField { get; set; } - - public Forced(Session session, int id) - : base(session, id) - { - } - } - } - - public class ForceServerVersion : AutoBuildTest - { - protected override void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - Require.ProviderVersionAtLeast(new Version(10, 0)); - } - - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.ForcedServerVersion = "9.0.0.0"; - configuration.Types.Register(typeof (Forced)); - return configuration; - } - - [Test] - public void MainTest() - { - // Check that DateTime is used instead of DateTime2 - - using (var session = Domain.OpenSession()) { - var accessor = session.Services.Get(); - using (var command = accessor.CreateCommand()) { - command.CommandText = - "select DATA_TYPE " + - "from INFORMATION_SCHEMA.COLUMNS " + - "where TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'Forced' and COLUMN_NAME = 'DateTimeField'"; - var result = command.ExecuteScalar().ToString().ToLowerInvariant(); - Assert.That(result, Is.EqualTo("datetime")); - } - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.06 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Storage.ForceServerVersionModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace ForceServerVersionModel + { + [HierarchyRoot, KeyGenerator(KeyGeneratorKind.None)] + public class Forced : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public DateTime DateTimeField { get; set; } + + public Forced(Session session, int id) + : base(session, id) + { + } + } + } + + public class ForceServerVersion : AutoBuildTest + { + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + Require.ProviderVersionAtLeast(new Version(10, 0)); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.ForcedServerVersion = "9.0.0.0"; + configuration.Types.Register(typeof (Forced)); + return configuration; + } + + [Test] + public void MainTest() + { + // Check that DateTime is used instead of DateTime2 + + using (var session = Domain.OpenSession()) { + var accessor = session.Services.Get(); + using (var command = accessor.CreateCommand()) { + command.CommandText = + "select DATA_TYPE " + + "from INFORMATION_SCHEMA.COLUMNS " + + "where TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'Forced' and COLUMN_NAME = 'DateTimeField'"; + var result = command.ExecuteScalar().ToString().ToLowerInvariant(); + Assert.That(result, Is.EqualTo("datetime")); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/ForeignKeyTest.cs b/Orm/Xtensive.Orm.Tests/Storage/ForeignKeyTest.cs index b0d206facb..0200166113 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/ForeignKeyTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/ForeignKeyTest.cs @@ -1,295 +1,295 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.03.11 - -using System; -using NUnit.Framework; -using Xtensive.IoC; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Tests.Storage.ForeignKeys -{ - [Serializable] - [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] - [HierarchyRoot] - public class User : Entity - { - [Field, Key(0)] - public int Id1 { get; private set; } - - [Field, Key(1)] - public int Id2 { get; private set; } - - [Field] - public string Name { get; set; } - - [Field] - public User Boss { get; set; } - - [Field] - [Association(OnTargetRemove=OnRemoveAction.Clear)] - public Company Company { get; set; } - - [Field] - public EntitySet Projects { get; private set; } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] - [HierarchyRoot] - public class Company : Entity - { - [Field, Key(0)] - public int Id3 { get; private set; } - - [Field, Key(1)] - public int Id4 { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] - public User Director { get; set; } - } - - [Serializable] - [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] - [HierarchyRoot] - public class Project : Entity - { - [Field, Key(0)] - public int Id5 { get; private set; } - - [Field, Key(1)] - public int Id6 { get; private set; } - - [Field] - public string Name { get; set; } - - [Field, Association(PairTo = "Projects")] - public EntitySet Users { get; private set; } - } - - [Serializable] - public class ForeignUser : User - { - [Field] - public string Country { get; set; } - } - - [Service(typeof (KeyGenerator), "DualInt")] - public class DualIntKeyGenerator : KeyGenerator - { - private int seed = 1; - - public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) - { - } - - public override Tuple GenerateKey(KeyInfo keyInfo, Session session) - { - return Tuple.Create(seed++, seed++); - } - } - - [TestFixture] - public class ForeignKeyTest : AutoBuildTest - { - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (User).Assembly, typeof (User).Namespace); - configuration.ForeignKeyMode = ForeignKeyMode.All; - return configuration; - } - - // Insert - - [Test] - public void InsertDescendant() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - Session.Current.SaveChanges(); - } - } - - [Test] - public void InsertSelfReference() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var u1 = new User {Name = "U1"}; - u1.Boss = u1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void InsertInTypeSequence() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - var u2 = new User { Name = "U2" }; - u1.Boss = u2; - Session.Current.SaveChanges(); - } - } - - [Test] - public void InsertInTypeLoop() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - var u2 = new User { Name = "U2" }; - u1.Boss = u2; - u2.Boss = u1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void InsertMultyTypeSequence() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - var c1 = new Company { Name = "C1" }; - u1.Company = c1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void InsertMultyTypeLoop() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - var c1 = new Company { Name = "C1" }; - u1.Company = c1; - c1.Director = u1; - Session.Current.SaveChanges(); - } - } - - - // Update - - [Test] - public void UpdateSelfReference() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - Session.Current.SaveChanges(); - u1.Boss = u1; - Session.Current.SaveChanges(); - } - } - - - [Test] - public void UpdateSequence() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var c1 = new Company { Name = "C1" }; - var u1 = new User { Name = "U1" }; - c1.Director = u1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void UpdateLoop() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var c1 = new Company { Name = "C1" }; - var u1 = new User { Name = "U1" }; - c1.Director = u1; - u1.Company = c1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void UpdateToInserted() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var c1 = new Company { Name = "C1" }; - Session.Current.SaveChanges(); - var u1 = new User { Name = "U1" }; - c1.Director = u1; - Session.Current.SaveChanges(); - } - } - - [Test] - public void UpdateToDeleted() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var c1 = new Company { Name = "C1" }; - var u1 = new User { Name = "U1" }; - c1.Director = u1; - u1.Company = c1; - Session.Current.SaveChanges(); - u1.Remove(); - Session.Current.SaveChanges(); - } - } - - // Delete - - [Test] - public void DeleteSelfReference() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - u1.Boss = u1; - Session.Current.SaveChanges(); - u1.Remove(); - Session.Current.SaveChanges(); - } - } - - // Intermediate Entity - - [Test] - public void InsertIntermediateEntity() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) - { - var u1 = new User { Name = "U1" }; - var p1 = new Project { Name = "P1" }; - u1.Projects.Add(p1); - Session.Current.SaveChanges(); - } - } - - // Mixed test - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.03.11 + +using System; +using NUnit.Framework; +using Xtensive.IoC; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Tests.Storage.ForeignKeys +{ + [Serializable] + [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] + [HierarchyRoot] + public class User : Entity + { + [Field, Key(0)] + public int Id1 { get; private set; } + + [Field, Key(1)] + public int Id2 { get; private set; } + + [Field] + public string Name { get; set; } + + [Field] + public User Boss { get; set; } + + [Field] + [Association(OnTargetRemove=OnRemoveAction.Clear)] + public Company Company { get; set; } + + [Field] + public EntitySet Projects { get; private set; } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] + [HierarchyRoot] + public class Company : Entity + { + [Field, Key(0)] + public int Id3 { get; private set; } + + [Field, Key(1)] + public int Id4 { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(OnTargetRemove = OnRemoveAction.Clear)] + public User Director { get; set; } + } + + [Serializable] + [KeyGenerator(KeyGeneratorKind.Custom, Name = "DualInt")] + [HierarchyRoot] + public class Project : Entity + { + [Field, Key(0)] + public int Id5 { get; private set; } + + [Field, Key(1)] + public int Id6 { get; private set; } + + [Field] + public string Name { get; set; } + + [Field, Association(PairTo = "Projects")] + public EntitySet Users { get; private set; } + } + + [Serializable] + public class ForeignUser : User + { + [Field] + public string Country { get; set; } + } + + [Service(typeof (KeyGenerator), "DualInt")] + public class DualIntKeyGenerator : KeyGenerator + { + private int seed = 1; + + public override void Initialize(Domain ownerDomain, TupleDescriptor keyTupleDescriptor) + { + } + + public override Tuple GenerateKey(KeyInfo keyInfo, Session session) + { + return Tuple.Create(seed++, seed++); + } + } + + [TestFixture] + public class ForeignKeyTest : AutoBuildTest + { + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (User).Assembly, typeof (User).Namespace); + configuration.ForeignKeyMode = ForeignKeyMode.All; + return configuration; + } + + // Insert + + [Test] + public void InsertDescendant() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + Session.Current.SaveChanges(); + } + } + + [Test] + public void InsertSelfReference() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var u1 = new User {Name = "U1"}; + u1.Boss = u1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void InsertInTypeSequence() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + var u2 = new User { Name = "U2" }; + u1.Boss = u2; + Session.Current.SaveChanges(); + } + } + + [Test] + public void InsertInTypeLoop() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + var u2 = new User { Name = "U2" }; + u1.Boss = u2; + u2.Boss = u1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void InsertMultyTypeSequence() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + var c1 = new Company { Name = "C1" }; + u1.Company = c1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void InsertMultyTypeLoop() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + var c1 = new Company { Name = "C1" }; + u1.Company = c1; + c1.Director = u1; + Session.Current.SaveChanges(); + } + } + + + // Update + + [Test] + public void UpdateSelfReference() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + Session.Current.SaveChanges(); + u1.Boss = u1; + Session.Current.SaveChanges(); + } + } + + + [Test] + public void UpdateSequence() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var c1 = new Company { Name = "C1" }; + var u1 = new User { Name = "U1" }; + c1.Director = u1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void UpdateLoop() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var c1 = new Company { Name = "C1" }; + var u1 = new User { Name = "U1" }; + c1.Director = u1; + u1.Company = c1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void UpdateToInserted() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var c1 = new Company { Name = "C1" }; + Session.Current.SaveChanges(); + var u1 = new User { Name = "U1" }; + c1.Director = u1; + Session.Current.SaveChanges(); + } + } + + [Test] + public void UpdateToDeleted() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var c1 = new Company { Name = "C1" }; + var u1 = new User { Name = "U1" }; + c1.Director = u1; + u1.Company = c1; + Session.Current.SaveChanges(); + u1.Remove(); + Session.Current.SaveChanges(); + } + } + + // Delete + + [Test] + public void DeleteSelfReference() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + u1.Boss = u1; + Session.Current.SaveChanges(); + u1.Remove(); + Session.Current.SaveChanges(); + } + } + + // Intermediate Entity + + [Test] + public void InsertIntermediateEntity() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) + { + var u1 = new User { Name = "U1" }; + var p1 = new Project { Name = "P1" }; + u1.Projects.Add(p1); + Session.Current.SaveChanges(); + } + } + + // Mixed test + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/FutureTest.cs b/Orm/Xtensive.Orm.Tests/Storage/FutureTest.cs index d4cabd181a..f173643c8b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/FutureTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/FutureTest.cs @@ -1,114 +1,114 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2009.08.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Linq; -using Xtensive.Orm.Tests; -using Xtensive.Orm.Tests.ObjectModel; -using Xtensive.Orm.Tests.ObjectModel.ChinookDO; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public sealed class FutureTest : ChinookDOModelTest - { - private const decimal SearchedCommission = 0.1m; - - [Test] - public void ExecutionTest() - { - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var futureHighComission = session.Query.ExecuteDelayed( - qe => qe.All().Where(i => i.Commission > 0.1m)); - var futurePaid = session.Query.ExecuteDelayed( - qe => qe.All().Where(i => i.Status==InvoiceStatus.Paid).Count()); - var futureSequenceTrack = session.Query.ExecuteDelayed( - qe => qe.All().Where(p => p.Name.Contains("c"))); - var futureAvgComission = session.Query.ExecuteDelayed( - qe => qe.All().Average(i => i.Commission)); - Assert.Greater(futureHighComission.Count(), 0); // Count() here is IEnumerable.Count() - Assert.Greater(futurePaid.Value, 0); - Assert.Greater(futureSequenceTrack.Count(), 0); // Count() here is IEnumerable.Count() - Assert.Greater(futureAvgComission.Value, 0); - ts.Complete(); - } - } - - [Test] - public void TransactionChangingTest() - { - IEnumerable futureHighComission; - using (var session = Domain.OpenSession()) { - using (var ts = session.OpenTransaction()) { - futureHighComission = session.Query.ExecuteDelayed(qe => qe.All().Where(i => i.Commission > 0.1m)); - ts.Complete(); - } - AssertEx.Throws(() => futureHighComission.GetEnumerator()); - using (session.OpenTransaction()) - AssertEx.Throws(() => futureHighComission.GetEnumerator()); - } - } - - [Test] - public void CachingFutureSequenceTest() - { - Func> futureQueryDelegate = GetFutureSequenceQuery; - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var futureSequenceOrder = session.Query.ExecuteDelayed(futureQueryDelegate); - Assert.Greater(futureSequenceOrder.Count(), 0); - ts.Complete(); - } - - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var futureSequenceOrder = session.Query.ExecuteDelayed(futureQueryDelegate.Method, GetFutureSequenceQueryFake); - Assert.Greater(futureSequenceOrder.Count(), 0); - ts.Complete(); - } - } - - [Test] - public void CachingFutureScalarTest() - { - var cacheKey = new object(); - var invoiceStatus = InvoiceStatus.Paid; - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var futurePaid = session.Query.ExecuteDelayed(cacheKey, - qe => qe.All().Where(i => i.Status==invoiceStatus).Count()); - Assert.Greater(futurePaid.Value, 0); - ts.Complete(); - } - - var t = 0; - using (var session = Domain.OpenSession()) - using (var ts = session.OpenTransaction()) { - var futureScalar = session.Query.ExecuteDelayed(cacheKey, qe => t); - Assert.Greater(futureScalar.Value, 0); - ts.Complete(); - } - } - - private IQueryable GetFutureSequenceQuery(QueryEndpoint queryEndpoint) - { - return Session.Demand().Query.All().Where(o => o.Commission > SearchedCommission); - } - - private IQueryable GetFutureSequenceQueryFake(QueryEndpoint queryEndpoint) - { - return null; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2009.08.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Linq; +using Xtensive.Orm.Tests; +using Xtensive.Orm.Tests.ObjectModel; +using Xtensive.Orm.Tests.ObjectModel.ChinookDO; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public sealed class FutureTest : ChinookDOModelTest + { + private const decimal SearchedCommission = 0.1m; + + [Test] + public void ExecutionTest() + { + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var futureHighComission = session.Query.ExecuteDelayed( + qe => qe.All().Where(i => i.Commission > 0.1m)); + var futurePaid = session.Query.ExecuteDelayed( + qe => qe.All().Where(i => i.Status==InvoiceStatus.Paid).Count()); + var futureSequenceTrack = session.Query.ExecuteDelayed( + qe => qe.All().Where(p => p.Name.Contains("c"))); + var futureAvgComission = session.Query.ExecuteDelayed( + qe => qe.All().Average(i => i.Commission)); + Assert.Greater(futureHighComission.Count(), 0); // Count() here is IEnumerable.Count() + Assert.Greater(futurePaid.Value, 0); + Assert.Greater(futureSequenceTrack.Count(), 0); // Count() here is IEnumerable.Count() + Assert.Greater(futureAvgComission.Value, 0); + ts.Complete(); + } + } + + [Test] + public void TransactionChangingTest() + { + IEnumerable futureHighComission; + using (var session = Domain.OpenSession()) { + using (var ts = session.OpenTransaction()) { + futureHighComission = session.Query.ExecuteDelayed(qe => qe.All().Where(i => i.Commission > 0.1m)); + ts.Complete(); + } + AssertEx.Throws(() => futureHighComission.GetEnumerator()); + using (session.OpenTransaction()) + AssertEx.Throws(() => futureHighComission.GetEnumerator()); + } + } + + [Test] + public void CachingFutureSequenceTest() + { + Func> futureQueryDelegate = GetFutureSequenceQuery; + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var futureSequenceOrder = session.Query.ExecuteDelayed(futureQueryDelegate); + Assert.Greater(futureSequenceOrder.Count(), 0); + ts.Complete(); + } + + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var futureSequenceOrder = session.Query.ExecuteDelayed(futureQueryDelegate.Method, GetFutureSequenceQueryFake); + Assert.Greater(futureSequenceOrder.Count(), 0); + ts.Complete(); + } + } + + [Test] + public void CachingFutureScalarTest() + { + var cacheKey = new object(); + var invoiceStatus = InvoiceStatus.Paid; + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var futurePaid = session.Query.ExecuteDelayed(cacheKey, + qe => qe.All().Where(i => i.Status==invoiceStatus).Count()); + Assert.Greater(futurePaid.Value, 0); + ts.Complete(); + } + + var t = 0; + using (var session = Domain.OpenSession()) + using (var ts = session.OpenTransaction()) { + var futureScalar = session.Query.ExecuteDelayed(cacheKey, qe => t); + Assert.Greater(futureScalar.Value, 0); + ts.Complete(); + } + } + + private IQueryable GetFutureSequenceQuery(QueryEndpoint queryEndpoint) + { + return Session.Demand().Query.All().Where(o => o.Commission > SearchedCommission); + } + + private IQueryable GetFutureSequenceQueryFake(QueryEndpoint queryEndpoint) + { + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/GeneralBehaviorTest.cs b/Orm/Xtensive.Orm.Tests/Storage/GeneralBehaviorTest.cs index a3311d2305..d2f72a4448 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/GeneralBehaviorTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/GeneralBehaviorTest.cs @@ -1,156 +1,156 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2010.02.17 - -using System; -using System.Diagnostics; -using NUnit.Framework; -using Xtensive.Orm.Tests.Storage.GeneralBehaviorTestModel; - -namespace Xtensive.Orm.Tests.Storage.GeneralBehaviorTestModel -{ - [Serializable] - [HierarchyRoot] - public abstract class Person : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field(Length = 50)] - public string Name { get; set; } - } - - [Serializable] - public class Customer : Person - { - [Field, Association(PairTo = "Customer")] - public EntitySet Orders { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Order : Entity - { - [Key, Field] - public int Id { get; private set; } - - [Field] - public int Number { get; set; } - - [Field] - public Customer Customer { get; set; } - } - - [Serializable] - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class CustomerOrder : Entity - { - [Key(0), Field] - public int Id { get; private set; } - - [Key(1), Field] - public Customer Customer { get; private set; } - - [Field] - public int Number { get; set; } - - - // Constructors - - public CustomerOrder(int id, Customer customer) - : base(id, customer) - {} - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public sealed class GeneralBehaviorTest : AutoBuildTest - { - protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); - return configuration; - } - - [Test] - public void AssignReferenceToRemovedEntityTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customer = new Customer(); - customer.Remove(); - var order = new Order(); - AssertEntityRemovalHasBeenDetected(() => order.Customer = customer); - tx.Complete(); - } - } - - [Test] - public void UseRemovedEntityAsKeyForOtherEntityTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customer = new Customer(); - customer.Remove(); - AssertEntityRemovalHasBeenDetected(() => new CustomerOrder(1, customer)); - tx.Complete(); - } - } - - [Test] - public void AddRemovedEntityToEntitySetTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customer = new Customer(); - var order = new Order(); - order.Remove(); - AssertEntityRemovalHasBeenDetected(() => customer.Orders.Add(order)); - tx.Complete(); - } - } - - [Test] - public void RemoveRemovedEntityFromEntitySetTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customer = new Customer(); - var order = new Order(); - order.Remove(); - AssertEntityRemovalHasBeenDetected(() => customer.Orders.Remove(order)); - tx.Complete(); - } - } - - [Test] - public void CallContainsOnEntitySetForRemovedEntityTest() - { - using (var session = Domain.OpenSession()) - using (var tx = session.OpenTransaction()) { - var customer = new Customer(); - var order = new Order(); - order.Remove(); - AssertEntityRemovalHasBeenDetected(() => customer.Orders.Contains(order)); - tx.Complete(); - } - } - - private static void AssertEntityRemovalHasBeenDetected(Action action) - { - try { - action.Invoke(); - } - catch (InvalidOperationException e) { - Assert.AreEqual(Strings.ExEntityIsRemoved, e.Message); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2010.02.17 + +using System; +using System.Diagnostics; +using NUnit.Framework; +using Xtensive.Orm.Tests.Storage.GeneralBehaviorTestModel; + +namespace Xtensive.Orm.Tests.Storage.GeneralBehaviorTestModel +{ + [Serializable] + [HierarchyRoot] + public abstract class Person : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field(Length = 50)] + public string Name { get; set; } + } + + [Serializable] + public class Customer : Person + { + [Field, Association(PairTo = "Customer")] + public EntitySet Orders { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Order : Entity + { + [Key, Field] + public int Id { get; private set; } + + [Field] + public int Number { get; set; } + + [Field] + public Customer Customer { get; set; } + } + + [Serializable] + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class CustomerOrder : Entity + { + [Key(0), Field] + public int Id { get; private set; } + + [Key(1), Field] + public Customer Customer { get; private set; } + + [Field] + public int Number { get; set; } + + + // Constructors + + public CustomerOrder(int id, Customer customer) + : base(id, customer) + {} + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public sealed class GeneralBehaviorTest : AutoBuildTest + { + protected override Xtensive.Orm.Configuration.DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof (Customer).Assembly, typeof (Customer).Namespace); + return configuration; + } + + [Test] + public void AssignReferenceToRemovedEntityTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customer = new Customer(); + customer.Remove(); + var order = new Order(); + AssertEntityRemovalHasBeenDetected(() => order.Customer = customer); + tx.Complete(); + } + } + + [Test] + public void UseRemovedEntityAsKeyForOtherEntityTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customer = new Customer(); + customer.Remove(); + AssertEntityRemovalHasBeenDetected(() => new CustomerOrder(1, customer)); + tx.Complete(); + } + } + + [Test] + public void AddRemovedEntityToEntitySetTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customer = new Customer(); + var order = new Order(); + order.Remove(); + AssertEntityRemovalHasBeenDetected(() => customer.Orders.Add(order)); + tx.Complete(); + } + } + + [Test] + public void RemoveRemovedEntityFromEntitySetTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customer = new Customer(); + var order = new Order(); + order.Remove(); + AssertEntityRemovalHasBeenDetected(() => customer.Orders.Remove(order)); + tx.Complete(); + } + } + + [Test] + public void CallContainsOnEntitySetForRemovedEntityTest() + { + using (var session = Domain.OpenSession()) + using (var tx = session.OpenTransaction()) { + var customer = new Customer(); + var order = new Order(); + order.Remove(); + AssertEntityRemovalHasBeenDetected(() => customer.Orders.Contains(order)); + tx.Complete(); + } + } + + private static void AssertEntityRemovalHasBeenDetected(Action action) + { + try { + action.Invoke(); + } + catch (InvalidOperationException e) { + Assert.AreEqual(Strings.ExEntityIsRemoved, e.Message); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/GenericTest.cs b/Orm/Xtensive.Orm.Tests/Storage/GenericTest.cs index 434aa4585a..b39f6b8404 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/GenericTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/GenericTest.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.03.12 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class GenericTest - { - private Domain domain; - - [HierarchyRoot] - public class PropertyVersion : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - public T PropertyValue { get; set; } - } - - [Test] - public void CombinedTest() - { - if (domain != null) - domain.DisposeSafely(); - - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof(PropertyVersion)); - domain = Domain.Build(configuration); - using (var session = domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - var v = new PropertyVersion() {PropertyValue = 123}; - t.Complete(); - } - using (var t = session.OpenTransaction()) { - var count = session.Query.All>().Count(); - Assert.AreEqual(1, count); - var v = session.Query.All>().FirstOrDefault(); - Assert.IsNotNull(v); - Assert.AreEqual(123, v.PropertyValue); - t.Complete(); - } - } - - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.03.12 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class GenericTest + { + private Domain domain; + + [HierarchyRoot] + public class PropertyVersion : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public T PropertyValue { get; set; } + } + + [Test] + public void CombinedTest() + { + if (domain != null) + domain.DisposeSafely(); + + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.Types.Register(typeof(PropertyVersion)); + domain = Domain.Build(configuration); + using (var session = domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + var v = new PropertyVersion() {PropertyValue = 123}; + t.Complete(); + } + using (var t = session.OpenTransaction()) { + var count = session.Query.All>().Count(); + Assert.AreEqual(1, count); + var v = session.Query.All>().FirstOrDefault(); + Assert.IsNotNull(v); + Assert.AreEqual(123, v.PropertyValue); + t.Complete(); + } + } + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IgnoreRulesValidateTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IgnoreRulesValidateTest.cs index 616299265e..9d679ea0e2 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IgnoreRulesValidateTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IgnoreRulesValidateTest.cs @@ -1,1050 +1,1050 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.08.16 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.Orm.Building.Definitions; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using Model1 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel1; -using ignorablePart = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel2; -using Model2 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel3; -using Model3 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel4; -using Model4 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel5; - -namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel1 -{ - public abstract class Person : Entity - { - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public DateTime Birthday { get; set; } - } - - [HierarchyRoot] - public class Customer : Person - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public EntitySet Orders { get; set; } - - } - - [HierarchyRoot] - public class Author : Person - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public EntitySet Books { get; set; } - } - - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field(Length = 13)] - public string ISBN { get; set; } - - [Field] - [Association(PairTo = "Books")] - public EntitySet Authors { get; set; } - - [Field] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - [Index("Book", "Customer")] - public class Order : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - [Association(PairTo = "Orders")] - public Book Book { get; set; } - - [Field] - [Association(PairTo = "Orders")] - public Customer Customer { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel2 -{ - [HierarchyRoot] - public class IgnoredTable : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string SomeField { get; set; } - - [Field] - public Model1.Book Book { get; set; } - - [Field] - public Model1.Customer Customer { get; set; } - - [Field] - public Model1.Order Order { get; set; } - - [Field] - [Association(PairTo = "IgnoredColumn")] - public Model1.Author Author { get; set; } - } - - public class FieldInjector : IModule - { - - public void OnBuilt(Domain domain) - { - } - - public void OnDefinitionsBuilt(Building.BuildingContext context, DomainModelDef model) - { - var orderType = model.Types[typeof (Model1.Order)]; - var field = orderType.DefineField("SomeIgnoredField", typeof (string)); - field.Length = 100; - - IndexDef indexDef; - if (orderType.Indexes.TryGetValue("IndexName", out indexDef)) { - var fieldsBefore = indexDef.KeyFields.ToList(); - indexDef.KeyFields.Clear(); - indexDef.KeyFields.Add("SomeIgnoredField", Direction.Positive); - foreach (var keyValuePair in fieldsBefore) - indexDef.KeyFields.Add(keyValuePair.Key, keyValuePair.Value); - } - - var ignoredTable = model.Types[typeof (IgnoredTable)]; - if (ignoredTable==null) - return; - - var authorType = model.Types[typeof (Model1.Author)]; - field = authorType.DefineField("IgnoredColumn", ignoredTable.UnderlyingType); - field.IsEntity = true; - } - } -} - -namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel3 -{ - public abstract class Person : Entity - { - [Field] - public string FirstName { get; set; } - - [Field] - public string LastName { get; set; } - - [Field] - public DateTime Birthday { get; set; } - } - - [HierarchyRoot] - public class Customer : Person - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public EntitySet Orders { get; set; } - - } - - [HierarchyRoot] - public class Author : Person - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public EntitySet Books { get; set; } - } - - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string Title { get; set; } - - [Field(Length = 13)] - public string ISBN { get; set; } - - [Field] - [Association(PairTo = "Books")] - public EntitySet Authors { get; set; } - - [Field] - public EntitySet Orders { get; set; } - } - - [HierarchyRoot] - public class Order : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - [Association(PairTo = "Orders")] - public Book Book { get; set; } - - [Field] - [Association(PairTo = "Orders")] - public Customer Customer { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel4 -{ - [HierarchyRoot] - public class MyEntity1 : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstColumn { get; set; } - } - [HierarchyRoot] - public class MyEntity2 : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstColumn { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel5 -{ - [HierarchyRoot] - public class MyEntity1 : Entity - { - [Field, Key] - public long Id { get; private set; } - - [Field] - public string FirstColumn { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - [TestFixture] - public class IgnoreRulesValidateTest - { - private SqlDriver sqlDriver; - private Key changedOrderKey; - private bool isMultidatabaseTest; - private bool isMultischemaTest; - - [OneTimeSetUp] - public void Setup() - { - sqlDriver = TestSqlDriver.Create(GetConnectionInfo()); - } - - [Test] - public void PerformUpdateTest() - { - ClearMultidatabaseAndMultischemaFlags(); - BuildDomainAndFillData(); - UpgradeDomain(DomainUpgradeMode.Perform); - BuildDomainInValidateMode(); - } - - [Test] - public void PerformSafelyUpdateTest() - { - ClearMultidatabaseAndMultischemaFlags(); - BuildDomainAndFillData(); - UpgradeDomain(DomainUpgradeMode.PerformSafely); - BuildDomainInValidateMode(); - } - - [Test] - public void IgnoreSimpleColumnTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "MyEntity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); - IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); - var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1)); - validatedDomain.Dispose(); - } - - [Test] - public void IgnoreReferencedColumnTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); - CreateForeignKey(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity1_MyEntity1ID"); - var ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("ReferencedIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema); - var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1)); - validatedDomain.Dispose(); - } - - [Test] - public void IgnoreSimpleTableTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - var addedColumnsNames = new[] {"Id", "FirstColumn"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25)}; - CreateTable(catalog, schema, "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, schema, "MyIgnoredEntity", "Id", "PK_MyIgnoredEntity_Id"); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreTable("MyIgnoredEntity"); - var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); - validateDomain.Dispose(); - } - - [Test] - public void IgnoreReferencedTableTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; - CreateTable(catalog, schema, "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, schema, "MyIgnoredEntity", "Id", "PK_MyIgnoredEntity_Id"); - CreateForeignKey(catalog, schema, "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreTable("MyIgnoredEntity"); - var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); - validateDomain.Dispose(); - } - - [Test] - public void InsertIntoTableWithIgnoredColumnTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "Myentity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); - IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); - using (var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1))) - using (var session = validatedDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new Model3.MyEntity2 {FirstColumn = "some test"}; - transaction.Complete(); - } - ValidateMyEntity(catalog, schema); - } - - [Test] - public void InsertIntoTableWithNotNullableIgnoredColumnTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - - Catalog catalog = GetCatalog(); - var schema = catalog.Schemas[catalog.DefaultSchema.Name]; - if (schema==null) - schema = catalog.Schemas[0]; - - schema.Tables["MyEntity2"].CreateColumn("SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 30)).IsNullable = false; - SqlAlterTable alter = SqlDdl.Alter(schema.Tables["MyEntity2"], - SqlDdl.AddColumn(schema.Tables["MyEntity2"].TableColumns["SimpleIgnoredColumn"])); - var commandText = sqlDriver.Compile(alter).GetCommandText(); - ExecuteNonQuery(commandText); - IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema.Name); - Assert.Throws(Is.InstanceOf(typeof (StorageException)), () => { - using (var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1))) - using (var session = validatedDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new Model3.MyEntity2 {FirstColumn = "some test"}; - transaction.Complete(); - } - }); - } - - [Test] - public void DropTableWithIgnoredColumnTest() - { - ClearMultidatabaseAndMultischemaFlags(); - Assert.Throws(() => { - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "MyEntity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); - IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); - var performDomain = - BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRuleCollection, typeof (Model4.MyEntity1)); - performDomain.Dispose(); - }); - } - - [Test] - public void DropReferencedTableTest() - { - ClearMultidatabaseAndMultischemaFlags(); - Assert.Throws(() => { - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); - CreateForeignKey(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", - "FK_MyEntity1_MyEntity1ID"); - var ignoreRuleCollection = new IgnoreRuleCollection(); - ignoreRuleCollection.IgnoreColumn("ReferencedIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema); - var performDomain = - BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRuleCollection, typeof (Model4.MyEntity1)); - performDomain.Dispose(); - }); - } - - [Test] - public void IgnoreColumnsByMaskValidateTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - CreateColumn(catalog, schema, "MyEntity2", "IgnoreFirstColumn", new SqlValueType(SqlType.VarChar, 25)); - CreateColumn(catalog, schema, "MyEntity2", "IgnoreSecondColumn", new SqlValueType(SqlType.VarChar, 25)); - CreateColumn(catalog, schema, "MyEntity2", "IgnoreThirdColumn", new SqlValueType(SqlType.VarChar, 25)); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("Ignore*"); - var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); - validateDomain.Dispose(); - } - - [Test] - public void IgnoreTablesByMaskValidateTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - var addedColumnsNames = new[] {"Id", "FirstColumn", "SecondColumn"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int64), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.VarChar, 25)}; - CreateTable(catalog, schema, "IgnoredFirstTable", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, schema, "IgnoredFirstTable", "Id", "PK_IgnoredFirstTable_Id"); - CreateTable(catalog, schema, "IgnoredSecondTable", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, schema, "IgnoredSecondTable", "Id", "PK_IgnoredSecondTable_Id"); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreTable("Ignored*"); - var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); - validateDomain.Dispose(); - } - - [Test] - public void IgnoreAllColumnsInTableByMaskValidateTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.DefaultSchema.Name; - var addedColumnsNames = new[] {"Id", "FirstColumn", "SecondColumn"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int64), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.VarChar, 25)}; - CreateTable(catalog, schema, "IgnoredTable", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, schema, "IgnoredTable", "Id", "PK_IgnoredTable_Id"); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("*").WhenTable("IgnoredTable"); - BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)).Dispose(); - } - - [Test] - public void UpgradeDomainWithIgnoreRuleByMaskInPerformModeTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.Schemas[catalog.DefaultSchema.Name]; - if (schema==null) - schema = catalog.Schemas[0]; - CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredFirstColumn", new SqlValueType(SqlType.VarChar, 25)); - CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredSecondColumn", new SqlValueType(SqlType.VarChar, 25)); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("Ignored*").WhenTable("MyEntity2"); - using (var domain = BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRules, typeof (Model3.MyEntity1))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new Model3.MyEntity1 {FirstColumn = "Some text"}; - new Model3.MyEntity2 {FirstColumn = "Second some test"}; - transaction.Complete(); - } - SqlTableRef myEntity2 = SqlDml.TableRef(schema.Tables["MyEntity2"]); - SqlSelect select = SqlDml.Select(myEntity2); - var compileConfiguration = new SqlCompilerConfiguration(); - compileConfiguration.DatabaseQualifiedObjects = false; - var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); - Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); - Assert.That(ExecuteQuery(commandText, 3), Is.EqualTo(DBNull.Value)); - } - - [Test] - public void UpgradeDomainWithIgnoreRuleByMaskInPerformSafelyModeTest() - { - ClearMultidatabaseAndMultischemaFlags(); - var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); - initialDomain.Dispose(); - Catalog catalog = GetCatalog(); - var schema = catalog.Schemas[catalog.DefaultSchema.Name]; - if (schema==null) - schema = catalog.Schemas[0]; - CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredFirstColumn", new SqlValueType(SqlType.VarChar, 25)); - CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredSecondColumn", new SqlValueType(SqlType.VarChar, 25)); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("Ignored*"); - using (var domain = BuildSimpleDomain(DomainUpgradeMode.PerformSafely, ignoreRules, typeof (Model3.MyEntity1))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - new Model3.MyEntity1 {FirstColumn = "Some text"}; - new Model3.MyEntity2 {FirstColumn = "Second some test"}; - transaction.Complete(); - } - SqlTableRef myEntity2 = SqlDml.TableRef(schema.Tables["MyEntity2"]); - SqlSelect select = SqlDml.Select(myEntity2); - var compileConfiguration = new SqlCompilerConfiguration(); - compileConfiguration.DatabaseQualifiedObjects = false; - var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); - Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); - Assert.That(ExecuteQuery(commandText, 3), Is.EqualTo(DBNull.Value)); - } - - [Test] - public void MultischemaValidateTest() - { - SetMultischema(); - Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); - var catalog = GetCatalog(); - CreateSchema(catalog, "Model1"); - CreateSchema(catalog, "Model2"); - var initialDomain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); - initialDomain.Dispose(); - catalog = GetCatalog(); - CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); - CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); - var addedColumnsNames = new[] { "Id", "FirstColumn", "MyEntity2Id" }; - var addedColumnsTypes = new[] { new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64) }; - CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); - CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); - - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); - ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); - - var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); - validateDomain.Dispose(); - } - - [Test] - public void MultidatabaseValidateTest() - { - SetMultidatabase(); - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - isMultidatabaseTest = true; - var initialDomain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); - initialDomain.Dispose(); - var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); - CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); - CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); - var addedColumnsNames = new[] { "Id", "FirstColumn", "MyEntity2Id" }; - var addedColumnsTypes = new[] { new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64) }; - CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); - CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); - CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("dbo").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - - var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, new[] { typeof (Model1.Customer) }, new[] { typeof (Model3.MyEntity1) }); - validateDomain.Dispose(); - } - - [Test] - public void MultischemaUpgrageInPerformModeTest() - { - SetMultischema(); - Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); - isMultischemaTest = true; - var catalog = GetCatalog(); - CreateSchema(catalog, "Model1"); - CreateSchema(catalog, "Model2"); - BuildDomainAndFillData(); - - catalog = GetCatalog(); - CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); - CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); - var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; - CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); - CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); - - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); - ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); - UpgradeDomain(DomainUpgradeMode.Perform, ignoreRules); - - ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); - BuildDomainInValidateMode(ignoreRules); - ValidateMyEntity(catalog, "Model2"); - } - - [Test] - public void MultischemaUpgrageInPerformSafelyModeTest() - { - SetMultischema(); - Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); - isMultischemaTest = true; - var catalog = GetCatalog(); - CreateSchema(catalog, "Model1"); - CreateSchema(catalog, "Model2"); - BuildDomainAndFillData(); - - catalog = GetCatalog(); - CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); - CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); - var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; - CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); - CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); - CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); - - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); - ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); - UpgradeDomain(DomainUpgradeMode.PerformSafely, ignoreRules); - - ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); - BuildDomainInValidateMode(ignoreRules); - ValidateMyEntity(catalog, "Model2"); - } - - [Test] - public void MultidatabaseUpgradeInPerformModeTest() - { - SetMultidatabase(); - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - isMultidatabaseTest = true; - BuildDomainAndFillData(); - - var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); - CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); - CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); - var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar), new SqlValueType(SqlType.Int64)}; - CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); - CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); - CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); - - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - UpgradeDomain(DomainUpgradeMode.Perform, ignoreRules); - - ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - BuildDomainInValidateMode(ignoreRules); - ValidateMyEntity(secondCatalog, "dbo", true); - } - - [Test] - public void MultidatabaseUpgradeInPerformSafelyModeTest() - { - SetMultidatabase(); - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - isMultidatabaseTest = true; - BuildDomainAndFillData(); - - var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); - CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); - CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); - var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; - var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; - CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); - CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); - CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); - - var ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); - UpgradeDomain(DomainUpgradeMode.PerformSafely, ignoreRules); - - ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); - BuildDomainInValidateMode(ignoreRules); - ValidateMyEntity(secondCatalog, "dbo", true); - } - - private Domain BuildSimpleDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules, Type sourceType, params Type[] additionalSourceTypes) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = mode; - configuration.Types.Register(sourceType.Assembly, sourceType.Namespace); - if (additionalSourceTypes!=null) - additionalSourceTypes.ForEach((t) => configuration.Types.Register(t.Assembly, t.Namespace)); - if (ignoreRules!=null) - configuration.IgnoreRules = ignoreRules; - return Domain.Build(configuration); - } - - private Domain BuildComplexDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules, Type[] firstPartTypes, Type[] secondPartTypes) - { - var config = DomainConfigurationFactory.Create(); - config.UpgradeMode = mode; - if (isMultischemaTest) { - foreach (var type in firstPartTypes) - config.MappingRules.Map(type.Assembly, type.Namespace).ToSchema("Model1"); - - foreach (var type in secondPartTypes) - config.MappingRules.Map(type.Assembly, type.Namespace).ToSchema("Model2"); - } - else if (isMultidatabaseTest) { - foreach (var type in firstPartTypes) - config.MappingRules.Map(type.Assembly, type.Namespace).ToDatabase(Multimapping.MultidatabaseTest.Database1Name); - - foreach (var type in secondPartTypes) - config.MappingRules.Map(type.Assembly, type.Namespace).ToDatabase(Multimapping.MultidatabaseTest.Database2Name); - } - - config.DefaultSchema = "dbo"; - config.DefaultDatabase = GetConnectionInfo().ConnectionUrl.GetDatabase(); - - foreach (var type in firstPartTypes.Union(secondPartTypes)) - config.Types.Register(type.Assembly, type.Namespace); - - if (ignoreRules!=null) - config.IgnoreRules = ignoreRules; - return Domain.Build(config); - } - - private void BuildDomainAndFillData() - { - Domain domain; - if (isMultidatabaseTest || isMultischemaTest) - domain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, - new[] {typeof(Model1.Customer), typeof(ignorablePart.IgnoredTable)}, new[] {typeof(Model3.MyEntity1)}); - else - domain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model1.Customer), typeof (ignorablePart.IgnoredTable)); - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var author = new Model1.Author { - FirstName = "Ivan", - LastName = "Goncharov", - Birthday = new DateTime(1812, 6, 18) - }; - var book = new Model1.Book { ISBN = "9780140440409", Title = "Oblomov" }; - book.Authors.Add(author); - var customer = new Model1.Customer { - FirstName = "Alexey", - LastName = "Kulakov", - Birthday = new DateTime(1988, 8, 31) - }; - var order = new Model1.Order { Book = book, Customer = customer }; - order["SomeIgnoredField"] = "Secret information for FBI :)"; - - if (isMultidatabaseTest || isMultischemaTest) { - new Model3.MyEntity1 {FirstColumn = "first"}; - new Model3.MyEntity2 {FirstColumn = "first"}; - } - transaction.Complete(); - } - domain.Dispose(); - } - - private void UpgradeDomain(DomainUpgradeMode mode) - { - IgnoreRuleCollection ignoreRules = new IgnoreRuleCollection(); - ignoreRules.IgnoreTable("IgnoredTable"); - ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order"); - ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author"); - using (var domain = BuildSimpleDomain(mode, ignoreRules, typeof (Model1.Customer))) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var currentCustomer = session.Query.All().First(c => c.LastName=="Kulakov"); - var order = session.Query.All().First(o => o.Customer.LastName==currentCustomer.LastName); - var newCustomer = new Model1.Customer {FirstName = "Fred", LastName = "Smith", Birthday = new DateTime(1998, 7, 9)}; - order.Customer = newCustomer; - changedOrderKey = order.Key; - transaction.Complete(); - } - } - - private void UpgradeDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules) - { - using (var performDomain = BuildComplexDomain(mode, ignoreRules, new[] { typeof (Model1.Customer) }, new[] { typeof (Model3.MyEntity1) })) - using (var session = performDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var currentCustomer = session.Query.All().First(c => c.LastName=="Kulakov"); - var order = session.Query.All().First(o => o.Customer.LastName==currentCustomer.LastName); - var newCustomer = new Model1.Customer { FirstName = "Fred", LastName = "Smith", Birthday = new DateTime(1998, 7, 9) }; - order.Customer = newCustomer; - changedOrderKey = order.Key; - var currentEntity = session.Query.All().First(ent => ent.FirstColumn=="first"); - currentEntity.FirstColumn = "second"; - transaction.Complete(); - } - } - - private void BuildDomainInValidateMode() - { - var configuration = DomainConfigurationFactory.Create(); - configuration.UpgradeMode = DomainUpgradeMode.Validate; - configuration.Types.Register(typeof (Model1.Customer).Assembly, typeof (Model1.Customer).Namespace); - configuration.Types.Register(typeof (ignorablePart.IgnoredTable).Assembly, typeof (ignorablePart.IgnoredTable).Namespace); - using (var domain = Domain.Build(configuration)) - using (var session = domain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var result = session.Query.All().First(o => o.Key==changedOrderKey); - Assert.That(result["SomeIgnoredField"], Is.EqualTo("Secret information for FBI :)")); - } - } - - private void BuildDomainInValidateMode(IgnoreRuleCollection ignoreRules) - { - var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, - new[] {typeof(Model1.Customer), typeof(ignorablePart.IgnoredTable)}, new[] {typeof(Model3.MyEntity1)}); - - using (validateDomain) - using (var session = validateDomain.OpenSession()) - using (var transaction = session.OpenTransaction()) { - var result = session.Query.All().First(o => o.Key==changedOrderKey); - Assert.That(result["SomeIgnoredField"], Is.EqualTo("Secret information for FBI :)")); - } - } - - private Catalog GetCatalog(string catalogName = null) - { - Catalog catalog; - using (var sqlConnection = sqlDriver.CreateConnection()) { - sqlConnection.Open(); - sqlConnection.BeginTransaction(); - if (catalogName==null) - catalog = sqlDriver.ExtractCatalog(sqlConnection); - else { - var sqlExtractionTaskList = new List(); - sqlExtractionTaskList.Add(new SqlExtractionTask(catalogName)); - catalog = sqlDriver.Extract(sqlConnection, sqlExtractionTaskList).Catalogs.First(); - } - sqlConnection.Commit(); - sqlConnection.Close(); - } - return catalog; - } - - private ConnectionInfo GetConnectionInfo() - { - return DomainConfigurationFactory.Create().ConnectionInfo; - } - - private void ExecuteNonQuery(string commandText) - { - using (var connection = sqlDriver.CreateConnection()) { - connection.Open(); - var command = connection.CreateCommand(commandText); - command.ExecuteNonQuery(); - command.Dispose(); - connection.Close(); - } - } - - private object ExecuteQuery(string commandText, int returnedColumnIndex) - { - var result = new object(); - using (var connection = sqlDriver.CreateConnection()) { - connection.Open(); - var command = connection.CreateCommand(commandText); - var reader = command.ExecuteReader(); - if (reader.Read()) - result = reader.GetValue(returnedColumnIndex); - reader.Dispose(); - command.Dispose(); - connection.Close(); - } - return result; - } - - private void ValidateMyEntity(Catalog catalog, string schema, bool useDatabasePrefix = false) - { - var schemaForValidete = catalog.Schemas[schema]; - if (schemaForValidete==null) - schemaForValidete = catalog.Schemas[0]; - SqlTableRef myEntity2 = SqlDml.TableRef(schemaForValidete.Tables["MyEntity2"]); - SqlSelect select = SqlDml.Select(myEntity2); - var compileConfiguration = new SqlCompilerConfiguration(); - compileConfiguration.DatabaseQualifiedObjects = useDatabasePrefix; - var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); - Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); - } - - private void CreateForeignKey(Catalog catalog, string schema, string table, string column, string referencedTable, - string referencedColumn, string foreignKeyName, bool useDatabasePrefix = false) - { - var schemaForAlter = catalog.Schemas[schema]; - if (schemaForAlter==null) - schemaForAlter = catalog.Schemas[0]; - var foreignKey = schemaForAlter.Tables[table].CreateForeignKey(foreignKeyName); - foreignKey.Columns.Add(schemaForAlter.Tables[table].TableColumns[column]); - foreignKey.ReferencedTable = schemaForAlter.Tables[referencedTable]; - foreignKey.ReferencedColumns.Add(schemaForAlter.Tables[referencedTable].TableColumns[referencedColumn]); - var alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddConstraint(foreignKey)); - var sqlComplieConfig = new SqlCompilerConfiguration(); - sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; - string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void CreatePrimaryKey(Catalog catalog, string schema, string table, string column, string primaryKeyName, bool useDatabasePrefix = false) - { - var schemaForAlter = catalog.Schemas[schema]; - if (schemaForAlter==null) - schemaForAlter = catalog.Schemas[0]; - var primaryKey = schemaForAlter.Tables[table].CreatePrimaryKey(primaryKeyName, - schemaForAlter.Tables[table].TableColumns[column]); - var alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddConstraint(primaryKey)); - var sqlComplieConfig = new SqlCompilerConfiguration(); - sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; - string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void CreateColumn(Catalog catalog, string schema, string table, string columnName, SqlValueType columnType, bool useDatabasePrefix = false) - { - var schemaForAlter = catalog.Schemas[schema]; - if (schemaForAlter==null) - schemaForAlter = catalog.Schemas[0]; - var column = schemaForAlter.Tables[table].CreateColumn(columnName, columnType); - column.IsNullable = true; - SqlAlterTable alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddColumn(column)); - var sqlComplieConfig = new SqlCompilerConfiguration(); - sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; - string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void CreateTable(Catalog catalog, string schema, string tableName, string[] columns, SqlValueType[] columnTypes, bool useDatabasePrefix = false) - { - var schemaForAlter = catalog.Schemas[schema]; - if (schemaForAlter==null) - schemaForAlter = catalog.Schemas[0]; - var table = schemaForAlter.CreateTable(tableName); - - for (var i = 0; i < columns.Length; i++) - new TableColumn(table, columns[i], columnTypes[i]); - - SqlCreateTable create = SqlDdl.Create(table); - var sqlComplieConfig = new SqlCompilerConfiguration(); - sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; - string commandText = sqlDriver.Compile(create, sqlComplieConfig).GetCommandText(); - ExecuteNonQuery(commandText); - } - - private void CreateSchema(Catalog catalog, string schemaName) - { - if (catalog.Schemas[schemaName]==null) { - catalog.CreateSchema(schemaName); - SqlCreateSchema schemaCreate = SqlDdl.Create(catalog.Schemas[schemaName]); - string commandText = sqlDriver.Compile(schemaCreate).GetCommandText(); - ExecuteNonQuery(commandText); - } - } - - private void SetMultidatabase() - { - isMultidatabaseTest = true; - isMultischemaTest = false; - } - - private void SetMultischema() - { - isMultidatabaseTest = false; - isMultischemaTest = true; - } - - private void ClearMultidatabaseAndMultischemaFlags() - { - isMultidatabaseTest = false; - isMultischemaTest = false; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.16 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.Orm.Building.Definitions; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using Model1 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel1; +using ignorablePart = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel2; +using Model2 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel3; +using Model3 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel4; +using Model4 = Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel5; + +namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel1 +{ + public abstract class Person : Entity + { + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public DateTime Birthday { get; set; } + } + + [HierarchyRoot] + public class Customer : Person + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public EntitySet Orders { get; set; } + + } + + [HierarchyRoot] + public class Author : Person + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public EntitySet Books { get; set; } + } + + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field(Length = 13)] + public string ISBN { get; set; } + + [Field] + [Association(PairTo = "Books")] + public EntitySet Authors { get; set; } + + [Field] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + [Index("Book", "Customer")] + public class Order : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + [Association(PairTo = "Orders")] + public Book Book { get; set; } + + [Field] + [Association(PairTo = "Orders")] + public Customer Customer { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel2 +{ + [HierarchyRoot] + public class IgnoredTable : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string SomeField { get; set; } + + [Field] + public Model1.Book Book { get; set; } + + [Field] + public Model1.Customer Customer { get; set; } + + [Field] + public Model1.Order Order { get; set; } + + [Field] + [Association(PairTo = "IgnoredColumn")] + public Model1.Author Author { get; set; } + } + + public class FieldInjector : IModule + { + + public void OnBuilt(Domain domain) + { + } + + public void OnDefinitionsBuilt(Building.BuildingContext context, DomainModelDef model) + { + var orderType = model.Types[typeof (Model1.Order)]; + var field = orderType.DefineField("SomeIgnoredField", typeof (string)); + field.Length = 100; + + IndexDef indexDef; + if (orderType.Indexes.TryGetValue("IndexName", out indexDef)) { + var fieldsBefore = indexDef.KeyFields.ToList(); + indexDef.KeyFields.Clear(); + indexDef.KeyFields.Add("SomeIgnoredField", Direction.Positive); + foreach (var keyValuePair in fieldsBefore) + indexDef.KeyFields.Add(keyValuePair.Key, keyValuePair.Value); + } + + var ignoredTable = model.Types[typeof (IgnoredTable)]; + if (ignoredTable==null) + return; + + var authorType = model.Types[typeof (Model1.Author)]; + field = authorType.DefineField("IgnoredColumn", ignoredTable.UnderlyingType); + field.IsEntity = true; + } + } +} + +namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel3 +{ + public abstract class Person : Entity + { + [Field] + public string FirstName { get; set; } + + [Field] + public string LastName { get; set; } + + [Field] + public DateTime Birthday { get; set; } + } + + [HierarchyRoot] + public class Customer : Person + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public EntitySet Orders { get; set; } + + } + + [HierarchyRoot] + public class Author : Person + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public EntitySet Books { get; set; } + } + + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string Title { get; set; } + + [Field(Length = 13)] + public string ISBN { get; set; } + + [Field] + [Association(PairTo = "Books")] + public EntitySet Authors { get; set; } + + [Field] + public EntitySet Orders { get; set; } + } + + [HierarchyRoot] + public class Order : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + [Association(PairTo = "Orders")] + public Book Book { get; set; } + + [Field] + [Association(PairTo = "Orders")] + public Customer Customer { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel4 +{ + [HierarchyRoot] + public class MyEntity1 : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstColumn { get; set; } + } + [HierarchyRoot] + public class MyEntity2 : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstColumn { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.IgnoreRulesValidateModel5 +{ + [HierarchyRoot] + public class MyEntity1 : Entity + { + [Field, Key] + public long Id { get; private set; } + + [Field] + public string FirstColumn { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + [TestFixture] + public class IgnoreRulesValidateTest + { + private SqlDriver sqlDriver; + private Key changedOrderKey; + private bool isMultidatabaseTest; + private bool isMultischemaTest; + + [OneTimeSetUp] + public void Setup() + { + sqlDriver = TestSqlDriver.Create(GetConnectionInfo()); + } + + [Test] + public void PerformUpdateTest() + { + ClearMultidatabaseAndMultischemaFlags(); + BuildDomainAndFillData(); + UpgradeDomain(DomainUpgradeMode.Perform); + BuildDomainInValidateMode(); + } + + [Test] + public void PerformSafelyUpdateTest() + { + ClearMultidatabaseAndMultischemaFlags(); + BuildDomainAndFillData(); + UpgradeDomain(DomainUpgradeMode.PerformSafely); + BuildDomainInValidateMode(); + } + + [Test] + public void IgnoreSimpleColumnTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "MyEntity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); + IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); + var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1)); + validatedDomain.Dispose(); + } + + [Test] + public void IgnoreReferencedColumnTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); + CreateForeignKey(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity1_MyEntity1ID"); + var ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("ReferencedIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema); + var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1)); + validatedDomain.Dispose(); + } + + [Test] + public void IgnoreSimpleTableTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + var addedColumnsNames = new[] {"Id", "FirstColumn"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25)}; + CreateTable(catalog, schema, "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, schema, "MyIgnoredEntity", "Id", "PK_MyIgnoredEntity_Id"); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreTable("MyIgnoredEntity"); + var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); + validateDomain.Dispose(); + } + + [Test] + public void IgnoreReferencedTableTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; + CreateTable(catalog, schema, "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, schema, "MyIgnoredEntity", "Id", "PK_MyIgnoredEntity_Id"); + CreateForeignKey(catalog, schema, "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreTable("MyIgnoredEntity"); + var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); + validateDomain.Dispose(); + } + + [Test] + public void InsertIntoTableWithIgnoredColumnTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "Myentity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); + IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); + using (var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1))) + using (var session = validatedDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new Model3.MyEntity2 {FirstColumn = "some test"}; + transaction.Complete(); + } + ValidateMyEntity(catalog, schema); + } + + [Test] + public void InsertIntoTableWithNotNullableIgnoredColumnTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + + Catalog catalog = GetCatalog(); + var schema = catalog.Schemas[catalog.DefaultSchema.Name]; + if (schema==null) + schema = catalog.Schemas[0]; + + schema.Tables["MyEntity2"].CreateColumn("SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 30)).IsNullable = false; + SqlAlterTable alter = SqlDdl.Alter(schema.Tables["MyEntity2"], + SqlDdl.AddColumn(schema.Tables["MyEntity2"].TableColumns["SimpleIgnoredColumn"])); + var commandText = sqlDriver.Compile(alter).GetCommandText(); + ExecuteNonQuery(commandText); + IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema.Name); + Assert.Throws(Is.InstanceOf(typeof (StorageException)), () => { + using (var validatedDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRuleCollection, typeof (Model3.MyEntity1))) + using (var session = validatedDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new Model3.MyEntity2 {FirstColumn = "some test"}; + transaction.Complete(); + } + }); + } + + [Test] + public void DropTableWithIgnoredColumnTest() + { + ClearMultidatabaseAndMultischemaFlags(); + Assert.Throws(() => { + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "MyEntity2", "SimpleIgnoredColumn", new SqlValueType(SqlType.VarChar, 25)); + IgnoreRuleCollection ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("SimpleIgnoredColumn").WhenTable("MyEntity2"); + var performDomain = + BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRuleCollection, typeof (Model4.MyEntity1)); + performDomain.Dispose(); + }); + } + + [Test] + public void DropReferencedTableTest() + { + ClearMultidatabaseAndMultischemaFlags(); + Assert.Throws(() => { + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); + CreateForeignKey(catalog, schema, "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", + "FK_MyEntity1_MyEntity1ID"); + var ignoreRuleCollection = new IgnoreRuleCollection(); + ignoreRuleCollection.IgnoreColumn("ReferencedIgnoredColumn").WhenTable("MyEntity2").WhenSchema(schema); + var performDomain = + BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRuleCollection, typeof (Model4.MyEntity1)); + performDomain.Dispose(); + }); + } + + [Test] + public void IgnoreColumnsByMaskValidateTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + CreateColumn(catalog, schema, "MyEntity2", "IgnoreFirstColumn", new SqlValueType(SqlType.VarChar, 25)); + CreateColumn(catalog, schema, "MyEntity2", "IgnoreSecondColumn", new SqlValueType(SqlType.VarChar, 25)); + CreateColumn(catalog, schema, "MyEntity2", "IgnoreThirdColumn", new SqlValueType(SqlType.VarChar, 25)); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("Ignore*"); + var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); + validateDomain.Dispose(); + } + + [Test] + public void IgnoreTablesByMaskValidateTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + var addedColumnsNames = new[] {"Id", "FirstColumn", "SecondColumn"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int64), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.VarChar, 25)}; + CreateTable(catalog, schema, "IgnoredFirstTable", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, schema, "IgnoredFirstTable", "Id", "PK_IgnoredFirstTable_Id"); + CreateTable(catalog, schema, "IgnoredSecondTable", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, schema, "IgnoredSecondTable", "Id", "PK_IgnoredSecondTable_Id"); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreTable("Ignored*"); + var validateDomain = BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)); + validateDomain.Dispose(); + } + + [Test] + public void IgnoreAllColumnsInTableByMaskValidateTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.DefaultSchema.Name; + var addedColumnsNames = new[] {"Id", "FirstColumn", "SecondColumn"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int64), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.VarChar, 25)}; + CreateTable(catalog, schema, "IgnoredTable", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, schema, "IgnoredTable", "Id", "PK_IgnoredTable_Id"); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("*").WhenTable("IgnoredTable"); + BuildSimpleDomain(DomainUpgradeMode.Validate, ignoreRules, typeof (Model3.MyEntity1)).Dispose(); + } + + [Test] + public void UpgradeDomainWithIgnoreRuleByMaskInPerformModeTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.Schemas[catalog.DefaultSchema.Name]; + if (schema==null) + schema = catalog.Schemas[0]; + CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredFirstColumn", new SqlValueType(SqlType.VarChar, 25)); + CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredSecondColumn", new SqlValueType(SqlType.VarChar, 25)); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("Ignored*").WhenTable("MyEntity2"); + using (var domain = BuildSimpleDomain(DomainUpgradeMode.Perform, ignoreRules, typeof (Model3.MyEntity1))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new Model3.MyEntity1 {FirstColumn = "Some text"}; + new Model3.MyEntity2 {FirstColumn = "Second some test"}; + transaction.Complete(); + } + SqlTableRef myEntity2 = SqlDml.TableRef(schema.Tables["MyEntity2"]); + SqlSelect select = SqlDml.Select(myEntity2); + var compileConfiguration = new SqlCompilerConfiguration(); + compileConfiguration.DatabaseQualifiedObjects = false; + var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); + Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); + Assert.That(ExecuteQuery(commandText, 3), Is.EqualTo(DBNull.Value)); + } + + [Test] + public void UpgradeDomainWithIgnoreRuleByMaskInPerformSafelyModeTest() + { + ClearMultidatabaseAndMultischemaFlags(); + var initialDomain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model3.MyEntity1)); + initialDomain.Dispose(); + Catalog catalog = GetCatalog(); + var schema = catalog.Schemas[catalog.DefaultSchema.Name]; + if (schema==null) + schema = catalog.Schemas[0]; + CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredFirstColumn", new SqlValueType(SqlType.VarChar, 25)); + CreateColumn(catalog, schema.Name, "MyEntity2", "IgnoredSecondColumn", new SqlValueType(SqlType.VarChar, 25)); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("Ignored*"); + using (var domain = BuildSimpleDomain(DomainUpgradeMode.PerformSafely, ignoreRules, typeof (Model3.MyEntity1))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + new Model3.MyEntity1 {FirstColumn = "Some text"}; + new Model3.MyEntity2 {FirstColumn = "Second some test"}; + transaction.Complete(); + } + SqlTableRef myEntity2 = SqlDml.TableRef(schema.Tables["MyEntity2"]); + SqlSelect select = SqlDml.Select(myEntity2); + var compileConfiguration = new SqlCompilerConfiguration(); + compileConfiguration.DatabaseQualifiedObjects = false; + var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); + Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); + Assert.That(ExecuteQuery(commandText, 3), Is.EqualTo(DBNull.Value)); + } + + [Test] + public void MultischemaValidateTest() + { + SetMultischema(); + Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); + var catalog = GetCatalog(); + CreateSchema(catalog, "Model1"); + CreateSchema(catalog, "Model2"); + var initialDomain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); + initialDomain.Dispose(); + catalog = GetCatalog(); + CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); + CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); + var addedColumnsNames = new[] { "Id", "FirstColumn", "MyEntity2Id" }; + var addedColumnsTypes = new[] { new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64) }; + CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); + CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); + + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); + ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); + + var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); + validateDomain.Dispose(); + } + + [Test] + public void MultidatabaseValidateTest() + { + SetMultidatabase(); + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + isMultidatabaseTest = true; + var initialDomain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, new[] {typeof(Model1.Customer)}, new[] {typeof(Model3.MyEntity1)}); + initialDomain.Dispose(); + var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); + CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); + CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); + var addedColumnsNames = new[] { "Id", "FirstColumn", "MyEntity2Id" }; + var addedColumnsTypes = new[] { new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64) }; + CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); + CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); + CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("dbo").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + + var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, new[] { typeof (Model1.Customer) }, new[] { typeof (Model3.MyEntity1) }); + validateDomain.Dispose(); + } + + [Test] + public void MultischemaUpgrageInPerformModeTest() + { + SetMultischema(); + Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); + isMultischemaTest = true; + var catalog = GetCatalog(); + CreateSchema(catalog, "Model1"); + CreateSchema(catalog, "Model2"); + BuildDomainAndFillData(); + + catalog = GetCatalog(); + CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); + CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); + var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; + CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); + CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); + + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); + ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); + UpgradeDomain(DomainUpgradeMode.Perform, ignoreRules); + + ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); + BuildDomainInValidateMode(ignoreRules); + ValidateMyEntity(catalog, "Model2"); + } + + [Test] + public void MultischemaUpgrageInPerformSafelyModeTest() + { + SetMultischema(); + Require.AllFeaturesSupported(ProviderFeatures.Multischema | ProviderFeatures.Multidatabase); + isMultischemaTest = true; + var catalog = GetCatalog(); + CreateSchema(catalog, "Model1"); + CreateSchema(catalog, "Model2"); + BuildDomainAndFillData(); + + catalog = GetCatalog(); + CreateColumn(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64)); + CreateForeignKey(catalog, "Model2", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID"); + var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; + CreateTable(catalog, "Model2", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes); + CreatePrimaryKey(catalog, "Model2", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id"); + CreateForeignKey(catalog, "Model2", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id"); + + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); + ignoreRules.IgnoreTable("IgnoredTable").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenSchema("Model1"); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenSchema("Model1"); + UpgradeDomain(DomainUpgradeMode.PerformSafely, ignoreRules); + + ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenSchema("Model2"); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenSchema("Model2"); + BuildDomainInValidateMode(ignoreRules); + ValidateMyEntity(catalog, "Model2"); + } + + [Test] + public void MultidatabaseUpgradeInPerformModeTest() + { + SetMultidatabase(); + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + isMultidatabaseTest = true; + BuildDomainAndFillData(); + + var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); + CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); + CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); + var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar), new SqlValueType(SqlType.Int64)}; + CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); + CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); + CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); + + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + UpgradeDomain(DomainUpgradeMode.Perform, ignoreRules); + + ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + BuildDomainInValidateMode(ignoreRules); + ValidateMyEntity(secondCatalog, "dbo", true); + } + + [Test] + public void MultidatabaseUpgradeInPerformSafelyModeTest() + { + SetMultidatabase(); + Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); + isMultidatabaseTest = true; + BuildDomainAndFillData(); + + var secondCatalog = GetCatalog(Multimapping.MultidatabaseTest.Database2Name); + CreateColumn(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", new SqlValueType(SqlType.Int64), true); + CreateForeignKey(secondCatalog, "dbo", "MyEntity2", "ReferencedIgnoredColumn", "MyEntity1", "Id", "FK_MyEntity2_MyEntity1_MyEntity1ID", true); + var addedColumnsNames = new[] {"Id", "FirstColumn", "MyEntity2Id"}; + var addedColumnsTypes = new[] {new SqlValueType(SqlType.Int32), new SqlValueType(SqlType.VarChar, 25), new SqlValueType(SqlType.Int64)}; + CreateTable(secondCatalog, "dbo", "MyIgnoredEntity", addedColumnsNames, addedColumnsTypes, true); + CreatePrimaryKey(secondCatalog, "dbo", "MyIgnoredEntity", "Id", "PK_MyIgnoreTable_Id", true); + CreateForeignKey(secondCatalog, "dbo", "MyIgnoredEntity", "MyEntity2Id", "MyEntity2", "Id", "FK_MyIgnoredEntity_MyEntity2_Id", true); + + var ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("IgnoredTable").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author").WhenDatabase(Multimapping.MultidatabaseTest.Database1Name); + UpgradeDomain(DomainUpgradeMode.PerformSafely, ignoreRules); + + ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreColumn("ReferencedIgnoredColumn").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + ignoreRules.IgnoreTable("MyIgnoredEntity").WhenDatabase(Multimapping.MultidatabaseTest.Database2Name); + BuildDomainInValidateMode(ignoreRules); + ValidateMyEntity(secondCatalog, "dbo", true); + } + + private Domain BuildSimpleDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules, Type sourceType, params Type[] additionalSourceTypes) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = mode; + configuration.Types.Register(sourceType.Assembly, sourceType.Namespace); + if (additionalSourceTypes!=null) + additionalSourceTypes.ForEach((t) => configuration.Types.Register(t.Assembly, t.Namespace)); + if (ignoreRules!=null) + configuration.IgnoreRules = ignoreRules; + return Domain.Build(configuration); + } + + private Domain BuildComplexDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules, Type[] firstPartTypes, Type[] secondPartTypes) + { + var config = DomainConfigurationFactory.Create(); + config.UpgradeMode = mode; + if (isMultischemaTest) { + foreach (var type in firstPartTypes) + config.MappingRules.Map(type.Assembly, type.Namespace).ToSchema("Model1"); + + foreach (var type in secondPartTypes) + config.MappingRules.Map(type.Assembly, type.Namespace).ToSchema("Model2"); + } + else if (isMultidatabaseTest) { + foreach (var type in firstPartTypes) + config.MappingRules.Map(type.Assembly, type.Namespace).ToDatabase(Multimapping.MultidatabaseTest.Database1Name); + + foreach (var type in secondPartTypes) + config.MappingRules.Map(type.Assembly, type.Namespace).ToDatabase(Multimapping.MultidatabaseTest.Database2Name); + } + + config.DefaultSchema = "dbo"; + config.DefaultDatabase = GetConnectionInfo().ConnectionUrl.GetDatabase(); + + foreach (var type in firstPartTypes.Union(secondPartTypes)) + config.Types.Register(type.Assembly, type.Namespace); + + if (ignoreRules!=null) + config.IgnoreRules = ignoreRules; + return Domain.Build(config); + } + + private void BuildDomainAndFillData() + { + Domain domain; + if (isMultidatabaseTest || isMultischemaTest) + domain = BuildComplexDomain(DomainUpgradeMode.Recreate, null, + new[] {typeof(Model1.Customer), typeof(ignorablePart.IgnoredTable)}, new[] {typeof(Model3.MyEntity1)}); + else + domain = BuildSimpleDomain(DomainUpgradeMode.Recreate, null, typeof (Model1.Customer), typeof (ignorablePart.IgnoredTable)); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var author = new Model1.Author { + FirstName = "Ivan", + LastName = "Goncharov", + Birthday = new DateTime(1812, 6, 18) + }; + var book = new Model1.Book { ISBN = "9780140440409", Title = "Oblomov" }; + book.Authors.Add(author); + var customer = new Model1.Customer { + FirstName = "Alexey", + LastName = "Kulakov", + Birthday = new DateTime(1988, 8, 31) + }; + var order = new Model1.Order { Book = book, Customer = customer }; + order["SomeIgnoredField"] = "Secret information for FBI :)"; + + if (isMultidatabaseTest || isMultischemaTest) { + new Model3.MyEntity1 {FirstColumn = "first"}; + new Model3.MyEntity2 {FirstColumn = "first"}; + } + transaction.Complete(); + } + domain.Dispose(); + } + + private void UpgradeDomain(DomainUpgradeMode mode) + { + IgnoreRuleCollection ignoreRules = new IgnoreRuleCollection(); + ignoreRules.IgnoreTable("IgnoredTable"); + ignoreRules.IgnoreColumn("SomeIgnoredField").WhenTable("Order"); + ignoreRules.IgnoreColumn("IgnoredColumn.Id").WhenTable("Author"); + using (var domain = BuildSimpleDomain(mode, ignoreRules, typeof (Model1.Customer))) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var currentCustomer = session.Query.All().First(c => c.LastName=="Kulakov"); + var order = session.Query.All().First(o => o.Customer.LastName==currentCustomer.LastName); + var newCustomer = new Model1.Customer {FirstName = "Fred", LastName = "Smith", Birthday = new DateTime(1998, 7, 9)}; + order.Customer = newCustomer; + changedOrderKey = order.Key; + transaction.Complete(); + } + } + + private void UpgradeDomain(DomainUpgradeMode mode, IgnoreRuleCollection ignoreRules) + { + using (var performDomain = BuildComplexDomain(mode, ignoreRules, new[] { typeof (Model1.Customer) }, new[] { typeof (Model3.MyEntity1) })) + using (var session = performDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var currentCustomer = session.Query.All().First(c => c.LastName=="Kulakov"); + var order = session.Query.All().First(o => o.Customer.LastName==currentCustomer.LastName); + var newCustomer = new Model1.Customer { FirstName = "Fred", LastName = "Smith", Birthday = new DateTime(1998, 7, 9) }; + order.Customer = newCustomer; + changedOrderKey = order.Key; + var currentEntity = session.Query.All().First(ent => ent.FirstColumn=="first"); + currentEntity.FirstColumn = "second"; + transaction.Complete(); + } + } + + private void BuildDomainInValidateMode() + { + var configuration = DomainConfigurationFactory.Create(); + configuration.UpgradeMode = DomainUpgradeMode.Validate; + configuration.Types.Register(typeof (Model1.Customer).Assembly, typeof (Model1.Customer).Namespace); + configuration.Types.Register(typeof (ignorablePart.IgnoredTable).Assembly, typeof (ignorablePart.IgnoredTable).Namespace); + using (var domain = Domain.Build(configuration)) + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var result = session.Query.All().First(o => o.Key==changedOrderKey); + Assert.That(result["SomeIgnoredField"], Is.EqualTo("Secret information for FBI :)")); + } + } + + private void BuildDomainInValidateMode(IgnoreRuleCollection ignoreRules) + { + var validateDomain = BuildComplexDomain(DomainUpgradeMode.Validate, ignoreRules, + new[] {typeof(Model1.Customer), typeof(ignorablePart.IgnoredTable)}, new[] {typeof(Model3.MyEntity1)}); + + using (validateDomain) + using (var session = validateDomain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var result = session.Query.All().First(o => o.Key==changedOrderKey); + Assert.That(result["SomeIgnoredField"], Is.EqualTo("Secret information for FBI :)")); + } + } + + private Catalog GetCatalog(string catalogName = null) + { + Catalog catalog; + using (var sqlConnection = sqlDriver.CreateConnection()) { + sqlConnection.Open(); + sqlConnection.BeginTransaction(); + if (catalogName==null) + catalog = sqlDriver.ExtractCatalog(sqlConnection); + else { + var sqlExtractionTaskList = new List(); + sqlExtractionTaskList.Add(new SqlExtractionTask(catalogName)); + catalog = sqlDriver.Extract(sqlConnection, sqlExtractionTaskList).Catalogs.First(); + } + sqlConnection.Commit(); + sqlConnection.Close(); + } + return catalog; + } + + private ConnectionInfo GetConnectionInfo() + { + return DomainConfigurationFactory.Create().ConnectionInfo; + } + + private void ExecuteNonQuery(string commandText) + { + using (var connection = sqlDriver.CreateConnection()) { + connection.Open(); + var command = connection.CreateCommand(commandText); + command.ExecuteNonQuery(); + command.Dispose(); + connection.Close(); + } + } + + private object ExecuteQuery(string commandText, int returnedColumnIndex) + { + var result = new object(); + using (var connection = sqlDriver.CreateConnection()) { + connection.Open(); + var command = connection.CreateCommand(commandText); + var reader = command.ExecuteReader(); + if (reader.Read()) + result = reader.GetValue(returnedColumnIndex); + reader.Dispose(); + command.Dispose(); + connection.Close(); + } + return result; + } + + private void ValidateMyEntity(Catalog catalog, string schema, bool useDatabasePrefix = false) + { + var schemaForValidete = catalog.Schemas[schema]; + if (schemaForValidete==null) + schemaForValidete = catalog.Schemas[0]; + SqlTableRef myEntity2 = SqlDml.TableRef(schemaForValidete.Tables["MyEntity2"]); + SqlSelect select = SqlDml.Select(myEntity2); + var compileConfiguration = new SqlCompilerConfiguration(); + compileConfiguration.DatabaseQualifiedObjects = useDatabasePrefix; + var commandText = sqlDriver.Compile(select, compileConfiguration).GetCommandText(); + Assert.That(ExecuteQuery(commandText, 2), Is.EqualTo(DBNull.Value)); + } + + private void CreateForeignKey(Catalog catalog, string schema, string table, string column, string referencedTable, + string referencedColumn, string foreignKeyName, bool useDatabasePrefix = false) + { + var schemaForAlter = catalog.Schemas[schema]; + if (schemaForAlter==null) + schemaForAlter = catalog.Schemas[0]; + var foreignKey = schemaForAlter.Tables[table].CreateForeignKey(foreignKeyName); + foreignKey.Columns.Add(schemaForAlter.Tables[table].TableColumns[column]); + foreignKey.ReferencedTable = schemaForAlter.Tables[referencedTable]; + foreignKey.ReferencedColumns.Add(schemaForAlter.Tables[referencedTable].TableColumns[referencedColumn]); + var alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddConstraint(foreignKey)); + var sqlComplieConfig = new SqlCompilerConfiguration(); + sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; + string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void CreatePrimaryKey(Catalog catalog, string schema, string table, string column, string primaryKeyName, bool useDatabasePrefix = false) + { + var schemaForAlter = catalog.Schemas[schema]; + if (schemaForAlter==null) + schemaForAlter = catalog.Schemas[0]; + var primaryKey = schemaForAlter.Tables[table].CreatePrimaryKey(primaryKeyName, + schemaForAlter.Tables[table].TableColumns[column]); + var alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddConstraint(primaryKey)); + var sqlComplieConfig = new SqlCompilerConfiguration(); + sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; + string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void CreateColumn(Catalog catalog, string schema, string table, string columnName, SqlValueType columnType, bool useDatabasePrefix = false) + { + var schemaForAlter = catalog.Schemas[schema]; + if (schemaForAlter==null) + schemaForAlter = catalog.Schemas[0]; + var column = schemaForAlter.Tables[table].CreateColumn(columnName, columnType); + column.IsNullable = true; + SqlAlterTable alter = SqlDdl.Alter(schemaForAlter.Tables[table], SqlDdl.AddColumn(column)); + var sqlComplieConfig = new SqlCompilerConfiguration(); + sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; + string commandText = sqlDriver.Compile(alter, sqlComplieConfig).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void CreateTable(Catalog catalog, string schema, string tableName, string[] columns, SqlValueType[] columnTypes, bool useDatabasePrefix = false) + { + var schemaForAlter = catalog.Schemas[schema]; + if (schemaForAlter==null) + schemaForAlter = catalog.Schemas[0]; + var table = schemaForAlter.CreateTable(tableName); + + for (var i = 0; i < columns.Length; i++) + new TableColumn(table, columns[i], columnTypes[i]); + + SqlCreateTable create = SqlDdl.Create(table); + var sqlComplieConfig = new SqlCompilerConfiguration(); + sqlComplieConfig.DatabaseQualifiedObjects = useDatabasePrefix; + string commandText = sqlDriver.Compile(create, sqlComplieConfig).GetCommandText(); + ExecuteNonQuery(commandText); + } + + private void CreateSchema(Catalog catalog, string schemaName) + { + if (catalog.Schemas[schemaName]==null) { + catalog.CreateSchema(schemaName); + SqlCreateSchema schemaCreate = SqlDdl.Create(catalog.Schemas[schemaName]); + string commandText = sqlDriver.Compile(schemaCreate).GetCommandText(); + ExecuteNonQuery(commandText); + } + } + + private void SetMultidatabase() + { + isMultidatabaseTest = true; + isMultischemaTest = false; + } + + private void SetMultischema() + { + isMultidatabaseTest = false; + isMultischemaTest = true; + } + + private void ClearMultidatabaseAndMultischemaFlags() + { + isMultidatabaseTest = false; + isMultischemaTest = false; + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/IndexesAndInheritanceSchemaTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IndexesAndInheritanceSchemaTest.cs index 3a1eb3d692..f0db51db23 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IndexesAndInheritanceSchemaTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IndexesAndInheritanceSchemaTest.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.20 - -using NUnit.Framework; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Storage.IndexesAndInheritanceSchemaModel; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace IndexesAndInheritanceSchemaModel - { - [HierarchyRoot] - [Index("ParentValue", "ParentRef", Unique = true, Name = "ParentEntity.IX_ParentValue_ParentRef")] - public class ParentEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field(Length = 100)] - public string ParentValue { get; set; } - - [Field(Nullable = false)] - public ReferencedEntity ParentRef { get; set; } - } - - [Index("ChildValue", "ParentValue", Unique = true, Name = "ChildEntity.IX_ChildValue_ParentValue")] - [Index("ChildValue", Unique = true, Name = "ChildEntity.IX_ChildValue")] - [Index("ParentValue", Unique = true, Name = "ChildEntity.IX_ParentValue")] - public class ChildEntity : ParentEntity - { - [Field] - public int ChildValue { get; private set; } - } - - [HierarchyRoot] - public class ReferencedEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - } - - [TestFixture] - public class IndexesAndInheritanceSchemaTest - { - private Domain BuildDomain(InheritanceSchema schema) - { - var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (ParentEntity).Assembly, typeof (ParentEntity).Namespace); - configuration.Types.Register(typeof (ClassTableSchemaModifier)); - configuration.Types.Register(typeof (SingleTableSchemaModifier)); - configuration.Types.Register(typeof (SingleTableSchemaModifier)); - InheritanceSchemaModifier.ActivateModifier(schema); - return Domain.Build(configuration); - } - - [Test] - public void ClassTableTest() - { - using (var domain = BuildDomain(InheritanceSchema.ClassTable)) { - var model = domain.Model; - } - } - - [Test] - public void SingleTableTest() - { - using (var domain = BuildDomain(InheritanceSchema.SingleTable)) { - var model = domain.Model; - } - } - - [Test] - public void ConcreteTableTest() - { - using (var domain = BuildDomain(InheritanceSchema.ConcreteTable)) { - var model = domain.Model; - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.20 + +using NUnit.Framework; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Storage.IndexesAndInheritanceSchemaModel; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace IndexesAndInheritanceSchemaModel + { + [HierarchyRoot] + [Index("ParentValue", "ParentRef", Unique = true, Name = "ParentEntity.IX_ParentValue_ParentRef")] + public class ParentEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field(Length = 100)] + public string ParentValue { get; set; } + + [Field(Nullable = false)] + public ReferencedEntity ParentRef { get; set; } + } + + [Index("ChildValue", "ParentValue", Unique = true, Name = "ChildEntity.IX_ChildValue_ParentValue")] + [Index("ChildValue", Unique = true, Name = "ChildEntity.IX_ChildValue")] + [Index("ParentValue", Unique = true, Name = "ChildEntity.IX_ParentValue")] + public class ChildEntity : ParentEntity + { + [Field] + public int ChildValue { get; private set; } + } + + [HierarchyRoot] + public class ReferencedEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + } + + [TestFixture] + public class IndexesAndInheritanceSchemaTest + { + private Domain BuildDomain(InheritanceSchema schema) + { + var configuration = DomainConfigurationFactory.Create(); + configuration.Types.Register(typeof (ParentEntity).Assembly, typeof (ParentEntity).Namespace); + configuration.Types.Register(typeof (ClassTableSchemaModifier)); + configuration.Types.Register(typeof (SingleTableSchemaModifier)); + configuration.Types.Register(typeof (SingleTableSchemaModifier)); + InheritanceSchemaModifier.ActivateModifier(schema); + return Domain.Build(configuration); + } + + [Test] + public void ClassTableTest() + { + using (var domain = BuildDomain(InheritanceSchema.ClassTable)) { + var model = domain.Model; + } + } + + [Test] + public void SingleTableTest() + { + using (var domain = BuildDomain(InheritanceSchema.SingleTable)) { + var model = domain.Model; + } + } + + [Test] + public void ConcreteTableTest() + { + using (var domain = BuildDomain(InheritanceSchema.ConcreteTable)) { + var model = domain.Model; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IntermediateQueryTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IntermediateQueryTest.cs index 778579d497..00be2cc4a1 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IntermediateQueryTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IntermediateQueryTest.cs @@ -1,123 +1,123 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.11.17 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Tests.Storage.IntermediateQueryTest_Model; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace IntermediateQueryTest_Model - { - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Parent : Entity - { - [Field, Key] - public Guid ID { get; private set; } - - [Field] - public string Name { get; private set; } - - [Field] - public EntitySet MyChildren { get; private set; } - - public Parent() - : base(Guid.NewGuid()) - { - Name = this.GetType().Name + " " + DateTime.Now; - } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Child : Entity - { - [Field, Key] - public Guid ID { get; private set; } - - [Field] - public string Name { get; private set; } - - public Child() - : base(Guid.NewGuid()) - { - Name = this.GetType().Name + " " + DateTime.Now; - } - } - } - - [Serializable] - public class IntermediateQueryTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); - return config; - } - - [Test] - public void SelectManyTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var parent = new Parent(); - var child = new Child(); - parent.MyChildren.Add(child); - - Session.Current.SaveChanges(); - - var list = session.Query.All() - .SelectMany(p => p.MyChildren, (p, c) => new {MasterId = p.ID, SlaveId = c.ID}) - .ToList(); - - Assert.AreEqual(1, list.Count); - - var p0 = session.Query.All().First(); - foreach (var c in p0.MyChildren) { - Console.WriteLine(c); - } - } - } - - [Test] - public void CustomQueryTestTest() - { - using (var session = Domain.OpenSession()) - using (session.OpenTransaction()) { - var parent = new Parent(); - var child = new Child(); - parent.MyChildren.Add(child); - - Session.Current.SaveChanges(); - - var types = Domain.Model.Types; - var itemsType = Domain.Model - .Types[typeof (Parent)] - .Fields["MyChildren"] - .Associations[0].AuxiliaryType.UnderlyingType; - - var items = session.Query.All(itemsType) as IQueryable>; - if (items!=null) { - // Covariant upcast with work in .NET 4.0+ - var list = items.ToList(); - var result = items - .Select(e => new {MasterId = e.Master.ID, SlaveId = e.Slave.ID}) - .ToList(); - Assert.AreEqual(1, list.Count); - } - - var firstParent = session.Query.All().First(); - foreach (var c in firstParent.MyChildren) - Console.WriteLine(c); - } - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.11.17 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Tests.Storage.IntermediateQueryTest_Model; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace IntermediateQueryTest_Model + { + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Parent : Entity + { + [Field, Key] + public Guid ID { get; private set; } + + [Field] + public string Name { get; private set; } + + [Field] + public EntitySet MyChildren { get; private set; } + + public Parent() + : base(Guid.NewGuid()) + { + Name = this.GetType().Name + " " + DateTime.Now; + } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Child : Entity + { + [Field, Key] + public Guid ID { get; private set; } + + [Field] + public string Name { get; private set; } + + public Child() + : base(Guid.NewGuid()) + { + Name = this.GetType().Name + " " + DateTime.Now; + } + } + } + + [Serializable] + public class IntermediateQueryTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Parent).Assembly, typeof (Parent).Namespace); + return config; + } + + [Test] + public void SelectManyTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var parent = new Parent(); + var child = new Child(); + parent.MyChildren.Add(child); + + Session.Current.SaveChanges(); + + var list = session.Query.All() + .SelectMany(p => p.MyChildren, (p, c) => new {MasterId = p.ID, SlaveId = c.ID}) + .ToList(); + + Assert.AreEqual(1, list.Count); + + var p0 = session.Query.All().First(); + foreach (var c in p0.MyChildren) { + Console.WriteLine(c); + } + } + } + + [Test] + public void CustomQueryTestTest() + { + using (var session = Domain.OpenSession()) + using (session.OpenTransaction()) { + var parent = new Parent(); + var child = new Child(); + parent.MyChildren.Add(child); + + Session.Current.SaveChanges(); + + var types = Domain.Model.Types; + var itemsType = Domain.Model + .Types[typeof (Parent)] + .Fields["MyChildren"] + .Associations[0].AuxiliaryType.UnderlyingType; + + var items = session.Query.All(itemsType) as IQueryable>; + if (items!=null) { + // Covariant upcast with work in .NET 4.0+ + var list = items.ToList(); + var result = items + .Select(e => new {MasterId = e.Master.ID, SlaveId = e.Slave.ID}) + .ToList(); + Assert.AreEqual(1, list.Count); + } + + var firstParent = session.Query.All().First(); + foreach (var c in firstParent.MyChildren) + Console.WriteLine(c); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/NameBuilderAsServiceTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/NameBuilderAsServiceTest.cs index 9534a4e1c4..3fd99df9a2 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/NameBuilderAsServiceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/NameBuilderAsServiceTest.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.02 - -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.IoC.NameBuilderAsServiceTest_Model; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Tests.Storage.IoC.NameBuilderAsServiceTest_Model -{ - [HierarchyRoot] - public class FakeClass : Entity - { - [Field, Key] - public int Id { get; private set; } - } -} - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - public class NameBuilderAsServiceTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); - return config; - } - - [Test] - public void MainTest() - { - var ns = Domain.Services.Get(); - Assert.IsNotNull(ns); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.02 + +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.IoC.NameBuilderAsServiceTest_Model; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Storage.IoC.NameBuilderAsServiceTest_Model +{ + [HierarchyRoot] + public class FakeClass : Entity + { + [Field, Key] + public int Id { get; private set; } + } +} + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + public class NameBuilderAsServiceTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); + return config; + } + + [Test] + public void MainTest() + { + var ns = Domain.Services.Get(); + Assert.IsNotNull(ns); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/NativeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/NativeTest.cs index 0058b66823..add59d9e28 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/NativeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/NativeTest.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.16 - -using System.Configuration; -using NUnit.Framework; -using Xtensive.IoC; -using Xtensive.Orm.Configuration; -using ConfigurationSection=Xtensive.IoC.Configuration.ConfigurationSection; - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - #region Service containers for this test - - public class DomainServiceContainer : ProxyContainerBase - { - public DomainServiceContainer(object configuration, IServiceContainer parent) - : base(configuration, parent) - { - var config = this.GetConfigurationForAssembly(); - var section = (ConfigurationSection) config.GetSection("NativeTest"); - RealContainer = ServiceContainer.Create(section, "domain"); - } - } - - public class SessionServiceContainer : ProxyContainerBase - { - public SessionServiceContainer(object configuration, IServiceContainer parent) - : base(configuration, parent) - { - var config = this.GetConfigurationForAssembly(); - var section = (ConfigurationSection) config.GetSection("NativeTest"); - RealContainer = ServiceContainer.Create(section, "session"); - } - } - - #endregion - - [TestFixture] - public class NativeTest : ServiceTestBase - { - protected override Domain BuildDomain(DomainConfiguration configuration) - { - configuration.ServiceContainerType = typeof (DomainServiceContainer); - configuration.Sessions.Default.ServiceContainerType = typeof (SessionServiceContainer); - return base.BuildDomain(configuration); - } - - [Test] - public void MainTest() - {} - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.16 + +using System.Configuration; +using NUnit.Framework; +using Xtensive.IoC; +using Xtensive.Orm.Configuration; +using ConfigurationSection=Xtensive.IoC.Configuration.ConfigurationSection; + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + #region Service containers for this test + + public class DomainServiceContainer : ProxyContainerBase + { + public DomainServiceContainer(object configuration, IServiceContainer parent) + : base(configuration, parent) + { + var config = this.GetConfigurationForAssembly(); + var section = (ConfigurationSection) config.GetSection("NativeTest"); + RealContainer = ServiceContainer.Create(section, "domain"); + } + } + + public class SessionServiceContainer : ProxyContainerBase + { + public SessionServiceContainer(object configuration, IServiceContainer parent) + : base(configuration, parent) + { + var config = this.GetConfigurationForAssembly(); + var section = (ConfigurationSection) config.GetSection("NativeTest"); + RealContainer = ServiceContainer.Create(section, "session"); + } + } + + #endregion + + [TestFixture] + public class NativeTest : ServiceTestBase + { + protected override Domain BuildDomain(DomainConfiguration configuration) + { + configuration.ServiceContainerType = typeof (DomainServiceContainer); + configuration.Sessions.Default.ServiceContainerType = typeof (SessionServiceContainer); + return base.BuildDomain(configuration); + } + + [Test] + public void MainTest() + {} + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/ProxyContainerBase.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/ProxyContainerBase.cs index 41fb412c9c..55eca7915d 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/ProxyContainerBase.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/ProxyContainerBase.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.02.11 - -using System; -using System.Collections.Generic; -using Xtensive.IoC; - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - public abstract class ProxyContainerBase : ServiceContainerBase - { - public IServiceContainer RealContainer = null; - - protected override IEnumerable HandleGetAll(Type serviceType) - { - return RealContainer.GetAll(serviceType); - } - - protected override object HandleGet(Type serviceType, string name) - { - return RealContainer.Get(serviceType, name); - } - - public ProxyContainerBase(object configuration, IServiceContainer parent) - : base(parent) - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.02.11 + +using System; +using System.Collections.Generic; +using Xtensive.IoC; + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + public abstract class ProxyContainerBase : ServiceContainerBase + { + public IServiceContainer RealContainer = null; + + protected override IEnumerable HandleGetAll(Type serviceType) + { + return RealContainer.GetAll(serviceType); + } + + protected override object HandleGet(Type serviceType, string name) + { + return RealContainer.Get(serviceType, name); + } + + public ProxyContainerBase(object configuration, IServiceContainer parent) + : base(parent) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/QueryFormatterServiceTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/QueryFormatterServiceTest.cs index 0e63793b6c..eb703b9165 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/QueryFormatterServiceTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/QueryFormatterServiceTest.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.03.02 - -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Services; -using Xtensive.Orm.Tests.Storage.IoC.QueryFormatterServiceTestModel; - -namespace Xtensive.Orm.Tests.Storage.IoC.QueryFormatterServiceTestModel -{ - [HierarchyRoot] - public class FakeClass : Entity - { - [Field, Key] - public int Id { get; private set; } - } - -} - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - public class QueryFormatterServiceTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var fs = session.Services.Get(); - Assert.IsNotNull(fs); - - var query = session.Query.All().Where(f => f.Id > 0); - string result = fs.ToSqlString(query); - Assert.That(result, Is.Not.Null.And.Not.Empty); - Console.WriteLine(result); - - result = fs.ToString(query); - - Assert.That(result, Is.Not.Null.And.Not.Empty); - Console.WriteLine(result); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.03.02 + +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Services; +using Xtensive.Orm.Tests.Storage.IoC.QueryFormatterServiceTestModel; + +namespace Xtensive.Orm.Tests.Storage.IoC.QueryFormatterServiceTestModel +{ + [HierarchyRoot] + public class FakeClass : Entity + { + [Field, Key] + public int Id { get; private set; } + } + +} + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + public class QueryFormatterServiceTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var fs = session.Services.Get(); + Assert.IsNotNull(fs); + + var query = session.Query.All().Where(f => f.Id > 0); + string result = fs.ToSqlString(query); + Assert.That(result, Is.Not.Null.And.Not.Empty); + Console.WriteLine(result); + + result = fs.ToString(query); + + Assert.That(result, Is.Not.Null.And.Not.Empty); + Console.WriteLine(result); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/ServiceTestBase.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/ServiceTestBase.cs index a0fce42f84..a44216408f 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/ServiceTestBase.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/ServiceTestBase.cs @@ -1,96 +1,96 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.16 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.IoC.Model; - -namespace Xtensive.Orm.Tests.Storage.IoC.Model -{ - [Serializable] - [HierarchyRoot] - public class MyEntity : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public interface IMyService - { - } - - public class MyServiceImpl : SessionBound, IMyService - { - } -} - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - [TestFixture] - public abstract class ServiceTestBase : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof(MyEntity)); - return config; - } - - [Test] - public void ContainerTest() - { - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - - // Domain-level singleton service - var domainSingleton1 = Domain.Services.Get("singleton"); - var domainSingleton2 = Domain.Services.Get("singleton"); - Assert.AreSame(domainSingleton1, domainSingleton2); - - // Domain-level transient service - var domainTransient1 = Domain.Services.Get("transient"); - var domainTransient2 = Domain.Services.Get("transient"); - Assert.AreNotSame(domainTransient1, domainTransient2); - - // Session-level singleton service - var sessionSingleton1 = session.Services.Get(); - var sessionSingleton2 = session.Services.Get(); - Assert.AreSame(sessionSingleton1, sessionSingleton2); - - using (var session2 = Domain.OpenSession()) { - using (session2.OpenTransaction()) { - // Session-level singleton service from another session - var sessionSingleton3 = Session.Current.Services.Get(); - Assert.AreNotSame(sessionSingleton1, sessionSingleton3); - } - } - } - } - } - - [Test] - public void PerformanceTest() - { - const int iterationCount = 100000; - using (var session = Domain.OpenSession()) { - using (session.OpenTransaction()) { - using (new Measurement("Getting domain-level singleton service.", iterationCount)) - for (int i = 0; i < iterationCount; i++) - Domain.Services.Get("singleton"); - - using (new Measurement("Getting domain-level transient service.", iterationCount)) - for (int i = 0; i < iterationCount; i++) - Domain.Services.Get("transient"); - - using (new Measurement("Getting session-level singleton service.", iterationCount)) - for (int i = 0; i < iterationCount; i++) - session.Services.Get(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.16 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.IoC.Model; + +namespace Xtensive.Orm.Tests.Storage.IoC.Model +{ + [Serializable] + [HierarchyRoot] + public class MyEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public interface IMyService + { + } + + public class MyServiceImpl : SessionBound, IMyService + { + } +} + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + [TestFixture] + public abstract class ServiceTestBase : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(MyEntity)); + return config; + } + + [Test] + public void ContainerTest() + { + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + + // Domain-level singleton service + var domainSingleton1 = Domain.Services.Get("singleton"); + var domainSingleton2 = Domain.Services.Get("singleton"); + Assert.AreSame(domainSingleton1, domainSingleton2); + + // Domain-level transient service + var domainTransient1 = Domain.Services.Get("transient"); + var domainTransient2 = Domain.Services.Get("transient"); + Assert.AreNotSame(domainTransient1, domainTransient2); + + // Session-level singleton service + var sessionSingleton1 = session.Services.Get(); + var sessionSingleton2 = session.Services.Get(); + Assert.AreSame(sessionSingleton1, sessionSingleton2); + + using (var session2 = Domain.OpenSession()) { + using (session2.OpenTransaction()) { + // Session-level singleton service from another session + var sessionSingleton3 = Session.Current.Services.Get(); + Assert.AreNotSame(sessionSingleton1, sessionSingleton3); + } + } + } + } + } + + [Test] + public void PerformanceTest() + { + const int iterationCount = 100000; + using (var session = Domain.OpenSession()) { + using (session.OpenTransaction()) { + using (new Measurement("Getting domain-level singleton service.", iterationCount)) + for (int i = 0; i < iterationCount; i++) + Domain.Services.Get("singleton"); + + using (new Measurement("Getting domain-level transient service.", iterationCount)) + for (int i = 0; i < iterationCount; i++) + Domain.Services.Get("transient"); + + using (new Measurement("Getting session-level singleton service.", iterationCount)) + for (int i = 0; i < iterationCount; i++) + session.Services.Get(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/IoC/SimpleNativeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/IoC/SimpleNativeTest.cs index 6adcbcaa80..8002995101 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/IoC/SimpleNativeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/IoC/SimpleNativeTest.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.01.17 - -using NUnit.Framework; -using Xtensive.IoC; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.IoC.SimpleNativeTestModel; - -namespace Xtensive.Orm.Tests.Storage.IoC.SimpleNativeTestModel -{ - [HierarchyRoot] - public class FakeClass : Entity - { - [Field, Key] - public int Id { get; private set; } - } - - public interface IMyService : ISessionService - { - } - - [Service(typeof(IMyService))] - public class MyService : SessionBound, IMyService - { - [ServiceConstructor] - public MyService(Session session) : - base(session) - { - } - } -} - -namespace Xtensive.Orm.Tests.Storage.IoC -{ - public class SimpleNativeTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - - var s = session.Services.GetService(); - Assert.IsNotNull(s); - s = session.Services.Get(); - Assert.IsNotNull(s); - Assert.IsNotNull((s as SessionBound).Session); - // Rollback - } - } - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.01.17 + +using NUnit.Framework; +using Xtensive.IoC; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.IoC.SimpleNativeTestModel; + +namespace Xtensive.Orm.Tests.Storage.IoC.SimpleNativeTestModel +{ + [HierarchyRoot] + public class FakeClass : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + public interface IMyService : ISessionService + { + } + + [Service(typeof(IMyService))] + public class MyService : SessionBound, IMyService + { + [ServiceConstructor] + public MyService(Session session) : + base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage.IoC +{ + public class SimpleNativeTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (FakeClass).Assembly, typeof (FakeClass).Namespace); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + + var s = session.Services.GetService(); + Assert.IsNotNull(s); + s = session.Services.Get(); + Assert.IsNotNull(s); + Assert.IsNotNull((s as SessionBound).Session); + // Rollback + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/KeysTest.cs b/Orm/Xtensive.Orm.Tests/Storage/KeysTest.cs index e5a205ae20..7c1c3de0d8 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/KeysTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/KeysTest.cs @@ -1,236 +1,236 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: -// Created: 2008.09.17 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.Keys; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Tests.Storage -{ - namespace Keys - { - [HierarchyRoot] - public class FruitRef : Entity - { - [Key, Field] - public long Id { get; private set; } - - [Field] - public Fruit Ref { get; set; } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public abstract class Fruit : Entity - { - [Field(Length = 50), Key] - public string Tag { get; private set; } - - public Fruit(string tag) - : base(tag) - { - } - } - - public class Banana : Fruit - { - public Banana(string tag) - : base(tag) - { - } - } - - public class Apple : Fruit - { - public Apple(string tag) - : base(tag) - { - } - } - - [HierarchyRoot] - [KeyGenerator(KeyGeneratorKind.None)] - public class Test : Entity - { - [Field(Length = 50), Key(0)] - public string Key1 { get; private set; } - - [Field, Key(1)] - public Byte Key2 { get; private set; } - - [Field, Key(2)] - public SByte Key3 { get; private set; } - - [Field, Key(3)] - public DateTime Key4 { get; private set; } - - [Field] - public Int32 Key5 { get; private set; } - - [Field] - public Int64 Key6 { get; private set; } - - [Field] - public UInt16 Key7 { get; private set; } - - [Field] - public UInt32 Key8 { get; private set; } - - [Field] - public Guid Key9 { get; private set; } - - [Field] - public float Key10 { get; private set; } - - [Field] - public double Key11 { get; private set; } - - [Field] - public decimal Key12 { get; private set; } - - [Field] - public bool Key13 { get; private set; } - - [Field] - public string Key14 { get; private set; } - - [Field] - public TimeSpan Key15 { get; private set; } - } - - [Serializable] - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field(Length = 128)] - public Key StringKey { get; set; } - } - } - - public class KeysTest : AutoBuildTest - { - protected override DomainConfiguration BuildConfiguration() - { - var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Apple).Assembly, typeof (Apple).Namespace); - return configuration; - } - - [Test] - public void CreateFormatParseTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Key k1 = Key.Create(Domain, "1"); - Key k2 = Key.Create(Domain, "1"); - Assert.AreEqual(k1, k2); - - Key kk = Key.Create(Domain, ""); - var s = kk.Format(); - var k = Key.Parse(Domain, s); - Assert.AreEqual(k, kk); - t.Complete(); - } - } - - [Test] - public void ResolveKeyTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var descriptor = Domain.Model.Types[typeof (Test)].Hierarchy.Key.TupleDescriptor; - - Tuple tuple = Tuple.Create(descriptor); - tuple.SetValue(0, " , "); - tuple.SetValue(1, 1); - tuple.SetValue(2, -1); - tuple.SetValue(3, DateTime.Now); - - Key k1 = Key.Create(Domain, tuple); - var stringValue = k1.Format(); - var k2 = Key.Parse(Domain, stringValue); - Assert.AreEqual(k1, k2); - t.Complete(); - } - } - - [Test] - public void ResolveNotExistingKeyTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Key key = Key.Create(Domain, typeof (Fruit), "NotExistingFruit"); - var entity = session.Query.SingleOrDefault(key); - var entity2 = session.Query.SingleOrDefault("NotExistingFruit"); - Assert.IsNull(entity); - Assert.IsNull(entity2); - } - } - - [Test] - public void StoreKeyTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var a = new Apple("1"); - var b = new Banana("2"); - var c = new Container(); - - c.StringKey = a.Key; - session.SaveChanges(); - - Assert.AreEqual(c.StringKey, a.Key); - c.StringKey = b.Key; - Assert.AreEqual(c.StringKey, b.Key); - - c.StringKey = null; - session.SaveChanges(); - Assert.AreEqual(c.StringKey, null); - - var appleEntity1 = session.Query.SingleOrDefault("1"); - var appleEntity2 = session.Query.SingleOrDefault(a); - var appleEntity3 = session.Query.SingleOrDefault((object) a); - - Assert.AreEqual(a.Key, appleEntity1.Key); - Assert.AreEqual(a.Key, appleEntity2.Key); - Assert.AreEqual(a.Key, appleEntity3.Key); - - Assert.AreEqual(appleEntity1, appleEntity2); - Assert.AreEqual(appleEntity1, appleEntity3); - - t.Complete(); - } - } - - [Test] - public void NodeIdCreateFormatParseTest() - { - var nodeId = "{59EE3D42-C207-4E65-8EC0-220058B4F8F2}"; - var key = Key.Create(Domain, nodeId, typeof (Apple), TypeReferenceAccuracy.ExactType, "1"); - Assert.That(key.NodeId, Is.EqualTo(nodeId)); - - var keyString = key.Format(); - var key2 = Key.Parse(Domain, keyString); - Assert.That(key2.NodeId, Is.EqualTo(nodeId)); - } - - [Test] - public void NodeIdCreateFormatParseDefaultTest() - { - var key = Key.Create(Domain, typeof (Apple), TypeReferenceAccuracy.ExactType, "1"); - Assert.That(key.NodeId, Is.EqualTo(WellKnown.DefaultNodeId)); - - var keyString = key.Format(); - var key2 = Key.Parse(Domain, keyString); - Assert.That(key2.NodeId, Is.EqualTo(WellKnown.DefaultNodeId)); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: +// Created: 2008.09.17 + +using System; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.Keys; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Tests.Storage +{ + namespace Keys + { + [HierarchyRoot] + public class FruitRef : Entity + { + [Key, Field] + public long Id { get; private set; } + + [Field] + public Fruit Ref { get; set; } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public abstract class Fruit : Entity + { + [Field(Length = 50), Key] + public string Tag { get; private set; } + + public Fruit(string tag) + : base(tag) + { + } + } + + public class Banana : Fruit + { + public Banana(string tag) + : base(tag) + { + } + } + + public class Apple : Fruit + { + public Apple(string tag) + : base(tag) + { + } + } + + [HierarchyRoot] + [KeyGenerator(KeyGeneratorKind.None)] + public class Test : Entity + { + [Field(Length = 50), Key(0)] + public string Key1 { get; private set; } + + [Field, Key(1)] + public Byte Key2 { get; private set; } + + [Field, Key(2)] + public SByte Key3 { get; private set; } + + [Field, Key(3)] + public DateTime Key4 { get; private set; } + + [Field] + public Int32 Key5 { get; private set; } + + [Field] + public Int64 Key6 { get; private set; } + + [Field] + public UInt16 Key7 { get; private set; } + + [Field] + public UInt32 Key8 { get; private set; } + + [Field] + public Guid Key9 { get; private set; } + + [Field] + public float Key10 { get; private set; } + + [Field] + public double Key11 { get; private set; } + + [Field] + public decimal Key12 { get; private set; } + + [Field] + public bool Key13 { get; private set; } + + [Field] + public string Key14 { get; private set; } + + [Field] + public TimeSpan Key15 { get; private set; } + } + + [Serializable] + [HierarchyRoot] + public class Container : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field(Length = 128)] + public Key StringKey { get; set; } + } + } + + public class KeysTest : AutoBuildTest + { + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof (Apple).Assembly, typeof (Apple).Namespace); + return configuration; + } + + [Test] + public void CreateFormatParseTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Key k1 = Key.Create(Domain, "1"); + Key k2 = Key.Create(Domain, "1"); + Assert.AreEqual(k1, k2); + + Key kk = Key.Create(Domain, ""); + var s = kk.Format(); + var k = Key.Parse(Domain, s); + Assert.AreEqual(k, kk); + t.Complete(); + } + } + + [Test] + public void ResolveKeyTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var descriptor = Domain.Model.Types[typeof (Test)].Hierarchy.Key.TupleDescriptor; + + Tuple tuple = Tuple.Create(descriptor); + tuple.SetValue(0, " , "); + tuple.SetValue(1, 1); + tuple.SetValue(2, -1); + tuple.SetValue(3, DateTime.Now); + + Key k1 = Key.Create(Domain, tuple); + var stringValue = k1.Format(); + var k2 = Key.Parse(Domain, stringValue); + Assert.AreEqual(k1, k2); + t.Complete(); + } + } + + [Test] + public void ResolveNotExistingKeyTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Key key = Key.Create(Domain, typeof (Fruit), "NotExistingFruit"); + var entity = session.Query.SingleOrDefault(key); + var entity2 = session.Query.SingleOrDefault("NotExistingFruit"); + Assert.IsNull(entity); + Assert.IsNull(entity2); + } + } + + [Test] + public void StoreKeyTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var a = new Apple("1"); + var b = new Banana("2"); + var c = new Container(); + + c.StringKey = a.Key; + session.SaveChanges(); + + Assert.AreEqual(c.StringKey, a.Key); + c.StringKey = b.Key; + Assert.AreEqual(c.StringKey, b.Key); + + c.StringKey = null; + session.SaveChanges(); + Assert.AreEqual(c.StringKey, null); + + var appleEntity1 = session.Query.SingleOrDefault("1"); + var appleEntity2 = session.Query.SingleOrDefault(a); + var appleEntity3 = session.Query.SingleOrDefault((object) a); + + Assert.AreEqual(a.Key, appleEntity1.Key); + Assert.AreEqual(a.Key, appleEntity2.Key); + Assert.AreEqual(a.Key, appleEntity3.Key); + + Assert.AreEqual(appleEntity1, appleEntity2); + Assert.AreEqual(appleEntity1, appleEntity3); + + t.Complete(); + } + } + + [Test] + public void NodeIdCreateFormatParseTest() + { + var nodeId = "{59EE3D42-C207-4E65-8EC0-220058B4F8F2}"; + var key = Key.Create(Domain, nodeId, typeof (Apple), TypeReferenceAccuracy.ExactType, "1"); + Assert.That(key.NodeId, Is.EqualTo(nodeId)); + + var keyString = key.Format(); + var key2 = Key.Parse(Domain, keyString); + Assert.That(key2.NodeId, Is.EqualTo(nodeId)); + } + + [Test] + public void NodeIdCreateFormatParseDefaultTest() + { + var key = Key.Create(Domain, typeof (Apple), TypeReferenceAccuracy.ExactType, "1"); + Assert.That(key.NodeId, Is.EqualTo(WellKnown.DefaultNodeId)); + + var keyString = key.Format(); + var key2 = Key.Parse(Domain, keyString); + Assert.That(key2.NodeId, Is.EqualTo(WellKnown.DefaultNodeId)); + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/LazyLoadTest.cs b/Orm/Xtensive.Orm.Tests/Storage/LazyLoadTest.cs index fbcaefee1d..f95e7c90bf 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/LazyLoadTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/LazyLoadTest.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.06.26 - -using System; -using System.Reflection; -using NUnit.Framework; -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.BookAuthorModel; - -namespace Xtensive.Orm.Tests.Storage.BookAuthorModel -{ - [Serializable] - [HierarchyRoot] - public class Book : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field(Length = 10)] - public string Title { get; set; } - - [Field(LazyLoad = true)] - public string Text { get; set; } - - [Field] - public Author Author { get; set; } - } - - [Serializable] - [HierarchyRoot] - public class Author : Entity - { - [Field, Key] - public int ID { get; private set; } - - [Field] - public string Name { get; set; } - } -} - -namespace Xtensive.Orm.Tests.Storage -{ - public class LazyLoadTest : AutoBuildTest - { - private const string TEXT = "Text"; - private const string TITLE = "Title"; - private Key key; - - public override void TestFixtureSetUp() - { - base.TestFixtureSetUp(); - - // Creating a book - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Book b = new Book(); - key = b.Key; - b.Title = TITLE; - b.Text = TEXT; - t.Complete(); - } - } - } - - protected override DomainConfiguration BuildConfiguration() - { - DomainConfiguration config = base.BuildConfiguration(); - config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); - return config; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) { - using (var t = session.OpenTransaction()) { - Book b = session.Query.SingleOrDefault(key); - Tuple tuple = b.Tuple; - - Assert.IsTrue(tuple.GetFieldState(2).IsAvailable()); - Assert.IsFalse(tuple.GetFieldState(3).IsAvailable()); - Assert.AreEqual(TITLE, b.Title); - Assert.IsFalse(tuple.GetFieldState(3).IsAvailable()); - - // Fetching lazy load field - Assert.AreEqual(TEXT, b.Text); - t.Complete(); - } - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.06.26 + +using System; +using System.Reflection; +using NUnit.Framework; +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Tests.Storage.BookAuthorModel; + +namespace Xtensive.Orm.Tests.Storage.BookAuthorModel +{ + [Serializable] + [HierarchyRoot] + public class Book : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field(Length = 10)] + public string Title { get; set; } + + [Field(LazyLoad = true)] + public string Text { get; set; } + + [Field] + public Author Author { get; set; } + } + + [Serializable] + [HierarchyRoot] + public class Author : Entity + { + [Field, Key] + public int ID { get; private set; } + + [Field] + public string Name { get; set; } + } +} + +namespace Xtensive.Orm.Tests.Storage +{ + public class LazyLoadTest : AutoBuildTest + { + private const string TEXT = "Text"; + private const string TITLE = "Title"; + private Key key; + + public override void TestFixtureSetUp() + { + base.TestFixtureSetUp(); + + // Creating a book + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Book b = new Book(); + key = b.Key; + b.Title = TITLE; + b.Text = TEXT; + t.Complete(); + } + } + } + + protected override DomainConfiguration BuildConfiguration() + { + DomainConfiguration config = base.BuildConfiguration(); + config.Types.Register(Assembly.GetExecutingAssembly(), "Xtensive.Orm.Tests.Storage.BookAuthorModel"); + return config; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) { + using (var t = session.OpenTransaction()) { + Book b = session.Query.SingleOrDefault(key); + Tuple tuple = b.Tuple; + + Assert.IsTrue(tuple.GetFieldState(2).IsAvailable()); + Assert.IsFalse(tuple.GetFieldState(3).IsAvailable()); + Assert.AreEqual(TITLE, b.Title); + Assert.IsFalse(tuple.GetFieldState(3).IsAvailable()); + + // Fetching lazy load field + Assert.AreEqual(TEXT, b.Text); + t.Complete(); + } + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbBaseTest.cs b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbBaseTest.cs index 8844816c13..04d26ccd21 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbBaseTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbBaseTest.cs @@ -1,370 +1,370 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.26 - -using System; -using System.Linq; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Tests.Storage.LegacyDb.AnimalDbTestModel; - -namespace Xtensive.Orm.Tests.Storage.LegacyDb.AnimalDbTestModel -{ - [Serializable] - [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] - [TypeDiscriminatorValue("Animal", Default = true)] - public class Animal : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field(Length = 50), TypeDiscriminator] - [FieldMapping("Type")] - public string ElementType { get; private set; } - - [Field(Length = 50)] - public string Name { get; set; } - - [Field] - public int Age { get; set; } - - [Field] - [FieldMapping("Owner")] - public Person Owner { get; set; } - } - - [Serializable] - [TypeDiscriminatorValue("Dog")] - public class Dog : Animal - { - } - - [Serializable] - [TypeDiscriminatorValue("Cat")] - public class Cat : Animal - { - } - - [Serializable] - [HierarchyRoot] - public abstract class Person : Entity - { - [Field, Key] - public Guid Id { get; private set;} - - [Field(Length = 50)] - public string Name { get; set; } - - [Field(Length = 50), TypeDiscriminator] - [FieldMapping("Type")] - public string ElementType { get; private set; } - } - - [Serializable] - [TypeDiscriminatorValue("Cat")] - public class CatLover : Person - { - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear)] - public Cat Favorite { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet Pets { get; private set; } - } - - [Serializable] - [TypeDiscriminatorValue("Dog")] - public class DogLover : Person - { - [Association(OnOwnerRemove = OnRemoveAction.Clear)] - public Dog Favorite { get; set; } - - [Field] - [Association(OnOwnerRemove = OnRemoveAction.Clear)] - public EntitySet Pets { get; private set; } - } - - [Serializable] - [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] - public abstract class VetClinic : Entity - { - [Field, Key] - public Guid Id { get; private set; } - - [Field(Length = 50)] - public string Name { get; set; } - - [Field(Length = 50)] - public string Address { get; set; } - - public abstract void Heal(Animal patient); - - public abstract void Kill(Animal victim); - } - - [Serializable] - public class DogClinic : VetClinic - { - public override void Heal(Animal patient) - { - Console.WriteLine(string.Format("Healing the dog {0}", patient.Name)); - } - - public override void Kill(Animal victim) - { - Console.WriteLine(string.Format("Killing the dog {0}", victim.Name)); - } - } - - [Serializable] - public class CatClinic : VetClinic - { - public override void Heal(Animal patient) - { - Console.WriteLine(string.Format("Healing the cat {0}", patient.Name)); - } - - public override void Kill(Animal victim) - { - Console.WriteLine(string.Format("Killing the cat {0}", victim.Name)); - } - } -} - -namespace Xtensive.Orm.Tests.Storage.LegacyDb -{ - public abstract class AnimalDbBaseTest : LegacyDbAutoBuildTest - { - protected abstract DomainUpgradeMode GetUpgradeMode(); - - protected override DomainConfiguration BuildConfiguration() - { - var config = base.BuildConfiguration(); - config.Types.Register(typeof (Animal).Assembly, typeof (Animal).Namespace); - config.UpgradeMode = GetUpgradeMode(); - return config; - } - - protected override string GetCreateDbScript(DomainConfiguration config) - { - return @"CREATE TABLE [dbo].[Person]( - [Id] [uniqueidentifier] NOT NULL, - [Name] [nvarchar](50) NULL, - [Type] [nvarchar](50) NULL, - CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[VetClinic]( - [Id] [uniqueidentifier] NOT NULL, - [Name] [nvarchar](50) NOT NULL, - [Address] [nvarchar](50) NOT NULL -) ON [PRIMARY] - -CREATE TABLE [dbo].[DogClinic]( - [Id] [uniqueidentifier] NOT NULL, - [Name] [nvarchar](50) NOT NULL, - [Address] [nvarchar](50) NOT NULL, - CONSTRAINT [PK_DogClinic] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[CatClinic]( - [Id] [uniqueidentifier] NOT NULL, - [Name] [nvarchar](50) NOT NULL, - [Address] [nvarchar](50) NOT NULL, - CONSTRAINT [PK_CatClinic] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[CatLover]( - [Id] [uniqueidentifier] NOT NULL, - [Favorite.Id] [uniqueidentifier] NULL, - CONSTRAINT [PK_CatLover.Person] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [CatLover.FK_Favorite] ON [dbo].[CatLover] -( - [Favorite.Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE TABLE [dbo].[Animal]( - [Id] [uniqueidentifier] NOT NULL, - [Type] [nvarchar](50) NULL, - [Name] [nvarchar](50) NULL, - [Age] [int] NOT NULL, - [Owner] [uniqueidentifier] NULL, - CONSTRAINT [PK_Animal] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [Animal.FK_Owner] ON [dbo].[Animal] -( - [Owner] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE TABLE [dbo].[DogLover]( - [Id] [uniqueidentifier] NOT NULL, - CONSTRAINT [PK_DogLover.Person] PRIMARY KEY CLUSTERED -( - [Id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE TABLE [dbo].[CatLover-Pets-Cat]( - [CatLover] [uniqueidentifier] NOT NULL, - [Cat] [uniqueidentifier] NOT NULL, - CONSTRAINT [PK_CatLover-Pets-Cat] PRIMARY KEY CLUSTERED -( - [CatLover] ASC, - [Cat] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [CatLover-Pets-Cat.FK_Master] ON [dbo].[CatLover-Pets-Cat] -( - [CatLover] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [CatLover-Pets-Cat.FK_Slave] ON [dbo].[CatLover-Pets-Cat] -( - [Cat] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE TABLE [dbo].[DogLover-Pets-Dog]( - [DogLover] [uniqueidentifier] NOT NULL, - [Dog] [uniqueidentifier] NOT NULL, - CONSTRAINT [PK_DogLover-Pets-Dog] PRIMARY KEY CLUSTERED -( - [DogLover] ASC, - [Dog] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [DogLover-Pets-Dog.FK_Master] ON [dbo].[DogLover-Pets-Dog] -( - [DogLover] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -CREATE NONCLUSTERED INDEX [DogLover-Pets-Dog.FK_Slave] ON [dbo].[DogLover-Pets-Dog] -( - [Dog] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] - -ALTER TABLE [dbo].[Person] ADD DEFAULT (NULL) FOR [Name] - -ALTER TABLE [dbo].[Person] ADD DEFAULT (NULL) FOR [Type] - -ALTER TABLE [dbo].[CatLover] ADD DEFAULT (NULL) FOR [Favorite.Id] - -ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Type] - -ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Name] - -ALTER TABLE [dbo].[Animal] ADD DEFAULT ((0)) FOR [Age] - -ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Owner] - -ALTER TABLE [dbo].[CatLover] WITH CHECK ADD CONSTRAINT [FK_CatLover_Person] FOREIGN KEY([Id]) -REFERENCES [dbo].[Person] ([Id]) - -ALTER TABLE [dbo].[CatLover] CHECK CONSTRAINT [FK_CatLover_Person] - -ALTER TABLE [dbo].[CatLover] WITH CHECK ADD CONSTRAINT [FK_CatLover-Favorite-Cat_Favorite] FOREIGN KEY([Favorite.Id]) -REFERENCES [dbo].[Animal] ([Id]) - -ALTER TABLE [dbo].[CatLover] CHECK CONSTRAINT [FK_CatLover-Favorite-Cat_Favorite] - -ALTER TABLE [dbo].[Animal] WITH CHECK ADD CONSTRAINT [FK_Animal-Owner-Person_Owner] FOREIGN KEY([Owner]) -REFERENCES [dbo].[Person] ([Id]) - -ALTER TABLE [dbo].[Animal] CHECK CONSTRAINT [FK_Animal-Owner-Person_Owner] - -ALTER TABLE [dbo].[DogLover] WITH CHECK ADD CONSTRAINT [FK_DogLover_Person] FOREIGN KEY([Id]) -REFERENCES [dbo].[Person] ([Id]) - -ALTER TABLE [dbo].[DogLover] CHECK CONSTRAINT [FK_DogLover_Person] - -ALTER TABLE [dbo].[CatLover-Pets-Cat] WITH CHECK ADD CONSTRAINT [FK_CatLover-Pets-Cat_Master] FOREIGN KEY([CatLover]) -REFERENCES [dbo].[CatLover] ([Id]) - -ALTER TABLE [dbo].[CatLover-Pets-Cat] CHECK CONSTRAINT [FK_CatLover-Pets-Cat_Master] - -ALTER TABLE [dbo].[CatLover-Pets-Cat] WITH CHECK ADD CONSTRAINT [FK_CatLover-Pets-Cat_Slave] FOREIGN KEY([Cat]) -REFERENCES [dbo].[Animal] ([Id]) - -ALTER TABLE [dbo].[CatLover-Pets-Cat] CHECK CONSTRAINT [FK_CatLover-Pets-Cat_Slave] - -ALTER TABLE [dbo].[DogLover-Pets-Dog] WITH CHECK ADD CONSTRAINT [FK_DogLover-Pets-Dog_Master] FOREIGN KEY([DogLover]) -REFERENCES [dbo].[DogLover] ([Id]) - -ALTER TABLE [dbo].[DogLover-Pets-Dog] CHECK CONSTRAINT [FK_DogLover-Pets-Dog_Master] - -ALTER TABLE [dbo].[DogLover-Pets-Dog] WITH CHECK ADD CONSTRAINT [FK_DogLover-Pets-Dog_Slave] FOREIGN KEY([Dog]) -REFERENCES [dbo].[Animal] ([Id]) - -ALTER TABLE [dbo].[DogLover-Pets-Dog] CHECK CONSTRAINT [FK_DogLover-Pets-Dog_Slave]"; - } - - [Test] - public void MainTest() - { - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - Animal animal = new Animal(); - animal.Name = "Elephant"; - Dog dog = new Dog(); - dog.Name = "Rex"; - Cat cat = new Cat(); - cat.Name = "Pussycat"; - var catLover = new CatLover {Name = "CatLover", Favorite = cat}; - catLover.Pets.Add(cat); - var dogLover = new DogLover { Name = "CatLover", Favorite = dog }; - dogLover.Pets.Add(dog); - var dogClinic = new DogClinic {Name = "Dog healer.", Address = "Address 1"}; - var catClinic = new CatClinic {Name = "Cat healer.", Address = "Address 2"}; - t.Complete(); - } - using (var session = Domain.OpenSession()) - using (var t = session.OpenTransaction()) { - var animals = session.Query.All().ToList(); - var dogs = session.Query.All().ToList(); - var cats = session.Query.All().ToList(); - var persons = session.Query.All().ToList(); - var dogLovers = session.Query.All().ToList(); - var catLovers = session.Query.All().ToList(); - var clinics = session.Query.All().ToList(); - var dogClinics = session.Query.All().ToList(); - var catClinics = session.Query.All().ToList(); - - Assert.AreEqual(3, animals.Count); - Assert.AreEqual(1, dogs.Count); - Assert.AreEqual(1, cats.Count); - - Assert.AreEqual(2, persons.Count); - Assert.AreEqual(1, dogLovers.Count); - Assert.AreEqual(1, catLovers.Count); - - Assert.AreEqual(2, clinics.Count); - Assert.AreEqual(1, dogClinics.Count); - Assert.AreEqual(1, catClinics.Count); - t.Complete(); - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.11.26 + +using System; +using System.Linq; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Tests.Storage.LegacyDb.AnimalDbTestModel; + +namespace Xtensive.Orm.Tests.Storage.LegacyDb.AnimalDbTestModel +{ + [Serializable] + [HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)] + [TypeDiscriminatorValue("Animal", Default = true)] + public class Animal : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field(Length = 50), TypeDiscriminator] + [FieldMapping("Type")] + public string ElementType { get; private set; } + + [Field(Length = 50)] + public string Name { get; set; } + + [Field] + public int Age { get; set; } + + [Field] + [FieldMapping("Owner")] + public Person Owner { get; set; } + } + + [Serializable] + [TypeDiscriminatorValue("Dog")] + public class Dog : Animal + { + } + + [Serializable] + [TypeDiscriminatorValue("Cat")] + public class Cat : Animal + { + } + + [Serializable] + [HierarchyRoot] + public abstract class Person : Entity + { + [Field, Key] + public Guid Id { get; private set;} + + [Field(Length = 50)] + public string Name { get; set; } + + [Field(Length = 50), TypeDiscriminator] + [FieldMapping("Type")] + public string ElementType { get; private set; } + } + + [Serializable] + [TypeDiscriminatorValue("Cat")] + public class CatLover : Person + { + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear)] + public Cat Favorite { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet Pets { get; private set; } + } + + [Serializable] + [TypeDiscriminatorValue("Dog")] + public class DogLover : Person + { + [Association(OnOwnerRemove = OnRemoveAction.Clear)] + public Dog Favorite { get; set; } + + [Field] + [Association(OnOwnerRemove = OnRemoveAction.Clear)] + public EntitySet Pets { get; private set; } + } + + [Serializable] + [HierarchyRoot(InheritanceSchema = InheritanceSchema.ConcreteTable)] + public abstract class VetClinic : Entity + { + [Field, Key] + public Guid Id { get; private set; } + + [Field(Length = 50)] + public string Name { get; set; } + + [Field(Length = 50)] + public string Address { get; set; } + + public abstract void Heal(Animal patient); + + public abstract void Kill(Animal victim); + } + + [Serializable] + public class DogClinic : VetClinic + { + public override void Heal(Animal patient) + { + Console.WriteLine(string.Format("Healing the dog {0}", patient.Name)); + } + + public override void Kill(Animal victim) + { + Console.WriteLine(string.Format("Killing the dog {0}", victim.Name)); + } + } + + [Serializable] + public class CatClinic : VetClinic + { + public override void Heal(Animal patient) + { + Console.WriteLine(string.Format("Healing the cat {0}", patient.Name)); + } + + public override void Kill(Animal victim) + { + Console.WriteLine(string.Format("Killing the cat {0}", victim.Name)); + } + } +} + +namespace Xtensive.Orm.Tests.Storage.LegacyDb +{ + public abstract class AnimalDbBaseTest : LegacyDbAutoBuildTest + { + protected abstract DomainUpgradeMode GetUpgradeMode(); + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof (Animal).Assembly, typeof (Animal).Namespace); + config.UpgradeMode = GetUpgradeMode(); + return config; + } + + protected override string GetCreateDbScript(DomainConfiguration config) + { + return @"CREATE TABLE [dbo].[Person]( + [Id] [uniqueidentifier] NOT NULL, + [Name] [nvarchar](50) NULL, + [Type] [nvarchar](50) NULL, + CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[VetClinic]( + [Id] [uniqueidentifier] NOT NULL, + [Name] [nvarchar](50) NOT NULL, + [Address] [nvarchar](50) NOT NULL +) ON [PRIMARY] + +CREATE TABLE [dbo].[DogClinic]( + [Id] [uniqueidentifier] NOT NULL, + [Name] [nvarchar](50) NOT NULL, + [Address] [nvarchar](50) NOT NULL, + CONSTRAINT [PK_DogClinic] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[CatClinic]( + [Id] [uniqueidentifier] NOT NULL, + [Name] [nvarchar](50) NOT NULL, + [Address] [nvarchar](50) NOT NULL, + CONSTRAINT [PK_CatClinic] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[CatLover]( + [Id] [uniqueidentifier] NOT NULL, + [Favorite.Id] [uniqueidentifier] NULL, + CONSTRAINT [PK_CatLover.Person] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [CatLover.FK_Favorite] ON [dbo].[CatLover] +( + [Favorite.Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE TABLE [dbo].[Animal]( + [Id] [uniqueidentifier] NOT NULL, + [Type] [nvarchar](50) NULL, + [Name] [nvarchar](50) NULL, + [Age] [int] NOT NULL, + [Owner] [uniqueidentifier] NULL, + CONSTRAINT [PK_Animal] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [Animal.FK_Owner] ON [dbo].[Animal] +( + [Owner] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE TABLE [dbo].[DogLover]( + [Id] [uniqueidentifier] NOT NULL, + CONSTRAINT [PK_DogLover.Person] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE TABLE [dbo].[CatLover-Pets-Cat]( + [CatLover] [uniqueidentifier] NOT NULL, + [Cat] [uniqueidentifier] NOT NULL, + CONSTRAINT [PK_CatLover-Pets-Cat] PRIMARY KEY CLUSTERED +( + [CatLover] ASC, + [Cat] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [CatLover-Pets-Cat.FK_Master] ON [dbo].[CatLover-Pets-Cat] +( + [CatLover] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [CatLover-Pets-Cat.FK_Slave] ON [dbo].[CatLover-Pets-Cat] +( + [Cat] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE TABLE [dbo].[DogLover-Pets-Dog]( + [DogLover] [uniqueidentifier] NOT NULL, + [Dog] [uniqueidentifier] NOT NULL, + CONSTRAINT [PK_DogLover-Pets-Dog] PRIMARY KEY CLUSTERED +( + [DogLover] ASC, + [Dog] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [DogLover-Pets-Dog.FK_Master] ON [dbo].[DogLover-Pets-Dog] +( + [DogLover] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +CREATE NONCLUSTERED INDEX [DogLover-Pets-Dog.FK_Slave] ON [dbo].[DogLover-Pets-Dog] +( + [Dog] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +ALTER TABLE [dbo].[Person] ADD DEFAULT (NULL) FOR [Name] + +ALTER TABLE [dbo].[Person] ADD DEFAULT (NULL) FOR [Type] + +ALTER TABLE [dbo].[CatLover] ADD DEFAULT (NULL) FOR [Favorite.Id] + +ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Type] + +ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Name] + +ALTER TABLE [dbo].[Animal] ADD DEFAULT ((0)) FOR [Age] + +ALTER TABLE [dbo].[Animal] ADD DEFAULT (NULL) FOR [Owner] + +ALTER TABLE [dbo].[CatLover] WITH CHECK ADD CONSTRAINT [FK_CatLover_Person] FOREIGN KEY([Id]) +REFERENCES [dbo].[Person] ([Id]) + +ALTER TABLE [dbo].[CatLover] CHECK CONSTRAINT [FK_CatLover_Person] + +ALTER TABLE [dbo].[CatLover] WITH CHECK ADD CONSTRAINT [FK_CatLover-Favorite-Cat_Favorite] FOREIGN KEY([Favorite.Id]) +REFERENCES [dbo].[Animal] ([Id]) + +ALTER TABLE [dbo].[CatLover] CHECK CONSTRAINT [FK_CatLover-Favorite-Cat_Favorite] + +ALTER TABLE [dbo].[Animal] WITH CHECK ADD CONSTRAINT [FK_Animal-Owner-Person_Owner] FOREIGN KEY([Owner]) +REFERENCES [dbo].[Person] ([Id]) + +ALTER TABLE [dbo].[Animal] CHECK CONSTRAINT [FK_Animal-Owner-Person_Owner] + +ALTER TABLE [dbo].[DogLover] WITH CHECK ADD CONSTRAINT [FK_DogLover_Person] FOREIGN KEY([Id]) +REFERENCES [dbo].[Person] ([Id]) + +ALTER TABLE [dbo].[DogLover] CHECK CONSTRAINT [FK_DogLover_Person] + +ALTER TABLE [dbo].[CatLover-Pets-Cat] WITH CHECK ADD CONSTRAINT [FK_CatLover-Pets-Cat_Master] FOREIGN KEY([CatLover]) +REFERENCES [dbo].[CatLover] ([Id]) + +ALTER TABLE [dbo].[CatLover-Pets-Cat] CHECK CONSTRAINT [FK_CatLover-Pets-Cat_Master] + +ALTER TABLE [dbo].[CatLover-Pets-Cat] WITH CHECK ADD CONSTRAINT [FK_CatLover-Pets-Cat_Slave] FOREIGN KEY([Cat]) +REFERENCES [dbo].[Animal] ([Id]) + +ALTER TABLE [dbo].[CatLover-Pets-Cat] CHECK CONSTRAINT [FK_CatLover-Pets-Cat_Slave] + +ALTER TABLE [dbo].[DogLover-Pets-Dog] WITH CHECK ADD CONSTRAINT [FK_DogLover-Pets-Dog_Master] FOREIGN KEY([DogLover]) +REFERENCES [dbo].[DogLover] ([Id]) + +ALTER TABLE [dbo].[DogLover-Pets-Dog] CHECK CONSTRAINT [FK_DogLover-Pets-Dog_Master] + +ALTER TABLE [dbo].[DogLover-Pets-Dog] WITH CHECK ADD CONSTRAINT [FK_DogLover-Pets-Dog_Slave] FOREIGN KEY([Dog]) +REFERENCES [dbo].[Animal] ([Id]) + +ALTER TABLE [dbo].[DogLover-Pets-Dog] CHECK CONSTRAINT [FK_DogLover-Pets-Dog_Slave]"; + } + + [Test] + public void MainTest() + { + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + Animal animal = new Animal(); + animal.Name = "Elephant"; + Dog dog = new Dog(); + dog.Name = "Rex"; + Cat cat = new Cat(); + cat.Name = "Pussycat"; + var catLover = new CatLover {Name = "CatLover", Favorite = cat}; + catLover.Pets.Add(cat); + var dogLover = new DogLover { Name = "CatLover", Favorite = dog }; + dogLover.Pets.Add(dog); + var dogClinic = new DogClinic {Name = "Dog healer.", Address = "Address 1"}; + var catClinic = new CatClinic {Name = "Cat healer.", Address = "Address 2"}; + t.Complete(); + } + using (var session = Domain.OpenSession()) + using (var t = session.OpenTransaction()) { + var animals = session.Query.All().ToList(); + var dogs = session.Query.All().ToList(); + var cats = session.Query.All().ToList(); + var persons = session.Query.All().ToList(); + var dogLovers = session.Query.All().ToList(); + var catLovers = session.Query.All().ToList(); + var clinics = session.Query.All().ToList(); + var dogClinics = session.Query.All().ToList(); + var catClinics = session.Query.All().ToList(); + + Assert.AreEqual(3, animals.Count); + Assert.AreEqual(1, dogs.Count); + Assert.AreEqual(1, cats.Count); + + Assert.AreEqual(2, persons.Count); + Assert.AreEqual(1, dogLovers.Count); + Assert.AreEqual(1, catLovers.Count); + + Assert.AreEqual(2, clinics.Count); + Assert.AreEqual(1, dogClinics.Count); + Assert.AreEqual(1, catClinics.Count); + t.Complete(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbSkipTest.cs b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbSkipTest.cs index c41f3b23b2..3482e14eb6 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbSkipTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbSkipTest.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.03.05 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Storage.LegacyDb -{ - public class AnimalDbSkipTest : AnimalDbBaseTest - { - protected override DomainUpgradeMode GetUpgradeMode() - { - return DomainUpgradeMode.LegacySkip; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.03.05 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Storage.LegacyDb +{ + public class AnimalDbSkipTest : AnimalDbBaseTest + { + protected override DomainUpgradeMode GetUpgradeMode() + { + return DomainUpgradeMode.LegacySkip; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbValidateTest.cs b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbValidateTest.cs index e21c4b1522..d597cc4a9b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbValidateTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/AnimalDbValidateTest.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.03.05 - -using NUnit.Framework; - -namespace Xtensive.Orm.Tests.Storage.LegacyDb -{ - public class AnimalDbValidateTest : AnimalDbBaseTest - { - protected override DomainUpgradeMode GetUpgradeMode() - { - return DomainUpgradeMode.LegacyValidate; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.03.05 + +using NUnit.Framework; + +namespace Xtensive.Orm.Tests.Storage.LegacyDb +{ + public class AnimalDbValidateTest : AnimalDbBaseTest + { + protected override DomainUpgradeMode GetUpgradeMode() + { + return DomainUpgradeMode.LegacyValidate; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/ContainerItemTest.cs b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/ContainerItemTest.cs index d53060de14..e23e913781 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/ContainerItemTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/LegacyDb/ContainerItemTest.cs @@ -1,191 +1,191 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.11.26 - -using System; -using NUnit.Framework; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Tests.Storage.LegacyDb.ContainerItemModel; - -namespace Xtensive.Orm.Tests.Storage.LegacyDb.ContainerItemModel -{ - [Serializable] - [HierarchyRoot] - public class Container : Entity - { - [Field, Key] - public int Id { get; private set; } - - [Field] - [Association(PairTo = "Container", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet Items { get; private set; } - - [Field] - [Association(PairTo = "Container", OnOwnerRemove = OnRemoveAction.Cascade, OnTargetRemove = OnRemoveAction.Clear)] - public EntitySet
.Create(rule.Table); - var matchedTables = matcher.Get(schema.Tables); - if (!MatchingHelper.IsMatchAll(rule.Column)) - foreach (var table in matchedTables) - VisitTable(table, rule); - else - foreach (var table in matchedTables) - RemoveTable(schema.Tables, table); - } - - private void VisitTable(Table table, IgnoreRule rule) - { - var matcher = RuleMatcher.Create(rule.Column); - var matchedColumns = matcher.Get(table.TableColumns); - foreach (var matchedColumn in matchedColumns) - RemoveColumn(table.TableColumns, matchedColumn); - } - - private void RemoveTable(PairedNodeCollection tables, Table tableToRemove) - { - foreach (var foreignKey in foreignKeysOfSchema) - if (foreignKey.Owner==tableToRemove || foreignKey.ReferencedTable==tableToRemove) { - if (foreignKey.Owner==tableToRemove) { - var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable); - if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) - targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name)); - } - foreignKey.Owner.TableConstraints.Remove(foreignKey); - } - tables.Remove(tableToRemove); - } - - private void RemoveColumn(PairedNodeCollection columns, TableColumn columnToRemove) - { - RemoveForeignKeys(columnToRemove); - RemoveIndexes(columnToRemove.Table, columnToRemove.Name); - var resolvedTableName = mappingResolver.GetNodeName(columnToRemove.Table); - if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) - targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToTheIgnoredColumnY, columnToRemove.Table.Name, columnToRemove.Name)); - columns.Remove(columnToRemove); - } - - private void RemoveForeignKeys(TableColumn referencedColumn) - { - foreach (var foreignKey in foreignKeysOfSchema) { - if (foreignKey.ReferencedColumns.Contains(referencedColumn)) - foreignKey.Owner.TableConstraints.Remove(foreignKey); - - if (foreignKey.Columns.Contains(referencedColumn)) { - if (foreignKey.Owner==referencedColumn.Table) { - var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable); - if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) - targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name)); - } - foreignKey.Owner.TableConstraints.Remove(foreignKey); - } - } - } - - private void RemoveIndexes(DataTable table, string columnName) - { - var indexes = table.Indexes.Select(index => index) - .Where(item => item.Columns.Any(column => stringComparer.Equals(column.Name, columnName))) - .ToList(); - foreach (var index in indexes) - table.Indexes.Remove(index); - } - - // Constructors - - /// - /// Creates instance of handler - /// - /// Extracted model - /// Configuration of domain - public IgnoreRulesHandler(SchemaExtractionResult model, DomainConfiguration configuration, MappingResolver resolver) - { - ArgumentValidator.EnsureArgumentNotNull(model, "model"); - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - targetModel = model; - ignoreRules = configuration.IgnoreRules; - mappingResolver = resolver; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class IgnoreRulesHandler + { + private readonly IgnoreRuleCollection ignoreRules; + private readonly SchemaExtractionResult targetModel; + private readonly MappingResolver mappingResolver; + private readonly StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; + + private List foreignKeysOfSchema; + + /// + /// Runs handling of + /// + /// Modified extracted model + public SchemaExtractionResult Handle() + { + foreach (var ignoreRule in ignoreRules) { + var schema = mappingResolver.ResolveSchema(targetModel, ignoreRule.Database, ignoreRule.Schema); + if (schema!=null) + VisitSchema(schema, ignoreRule); + } + return targetModel; + } + + private void VisitSchema(Schema schema, IgnoreRule rule) + { + foreignKeysOfSchema = schema.Tables.SelectMany(t => t.TableConstraints.OfType()).ToList(); + var matcher = RuleMatcher
.Create(rule.Table); + var matchedTables = matcher.Get(schema.Tables); + if (!MatchingHelper.IsMatchAll(rule.Column)) + foreach (var table in matchedTables) + VisitTable(table, rule); + else + foreach (var table in matchedTables) + RemoveTable(schema.Tables, table); + } + + private void VisitTable(Table table, IgnoreRule rule) + { + var matcher = RuleMatcher.Create(rule.Column); + var matchedColumns = matcher.Get(table.TableColumns); + foreach (var matchedColumn in matchedColumns) + RemoveColumn(table.TableColumns, matchedColumn); + } + + private void RemoveTable(PairedNodeCollection tables, Table tableToRemove) + { + foreach (var foreignKey in foreignKeysOfSchema) + if (foreignKey.Owner==tableToRemove || foreignKey.ReferencedTable==tableToRemove) { + if (foreignKey.Owner==tableToRemove) { + var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable); + if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) + targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name)); + } + foreignKey.Owner.TableConstraints.Remove(foreignKey); + } + tables.Remove(tableToRemove); + } + + private void RemoveColumn(PairedNodeCollection columns, TableColumn columnToRemove) + { + RemoveForeignKeys(columnToRemove); + RemoveIndexes(columnToRemove.Table, columnToRemove.Name); + var resolvedTableName = mappingResolver.GetNodeName(columnToRemove.Table); + if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) + targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToTheIgnoredColumnY, columnToRemove.Table.Name, columnToRemove.Name)); + columns.Remove(columnToRemove); + } + + private void RemoveForeignKeys(TableColumn referencedColumn) + { + foreach (var foreignKey in foreignKeysOfSchema) { + if (foreignKey.ReferencedColumns.Contains(referencedColumn)) + foreignKey.Owner.TableConstraints.Remove(foreignKey); + + if (foreignKey.Columns.Contains(referencedColumn)) { + if (foreignKey.Owner==referencedColumn.Table) { + var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable); + if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) + targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name)); + } + foreignKey.Owner.TableConstraints.Remove(foreignKey); + } + } + } + + private void RemoveIndexes(DataTable table, string columnName) + { + var indexes = table.Indexes.Select(index => index) + .Where(item => item.Columns.Any(column => stringComparer.Equals(column.Name, columnName))) + .ToList(); + foreach (var index in indexes) + table.Indexes.Remove(index); + } + + // Constructors + + /// + /// Creates instance of handler + /// + /// Extracted model + /// Configuration of domain + public IgnoreRulesHandler(SchemaExtractionResult model, DomainConfiguration configuration, MappingResolver resolver) + { + ArgumentValidator.EnsureArgumentNotNull(model, "model"); + ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + targetModel = model; + ignoreRules = configuration.IgnoreRules; + mappingResolver = resolver; + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/ISchemaExtractionResultBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/ISchemaExtractionResultBuilder.cs index f38de0694a..9be9a70ea4 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/ISchemaExtractionResultBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/ISchemaExtractionResultBuilder.cs @@ -1,7 +1,7 @@ -namespace Xtensive.Orm.Upgrade.Internals.Interfaces -{ - internal interface ISchemaExtractionResultBuilder - { - SchemaExtractionResult Run(); - } +namespace Xtensive.Orm.Upgrade.Internals.Interfaces +{ + internal interface ISchemaExtractionResultBuilder + { + SchemaExtractionResult Run(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintValidator.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintValidator.cs index adb4acf177..c5e483c476 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintValidator.cs @@ -1,15 +1,15 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.22 - -using Xtensive.Collections; - -namespace Xtensive.Orm.Upgrade.Internals.Interfaces -{ - internal interface IUpgradeHintValidator - { - void Validate(NativeTypeClassifier hintsToValidate); - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.22 + +using Xtensive.Collections; + +namespace Xtensive.Orm.Upgrade.Internals.Interfaces +{ + internal interface IUpgradeHintValidator + { + void Validate(NativeTypeClassifier hintsToValidate); + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintsProcessor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintsProcessor.cs index 8302d516e9..f97c0acd9f 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintsProcessor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Interfaces/IUpgradeHintsProcessor.cs @@ -1,15 +1,15 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.22 - -using System.Collections.Generic; - -namespace Xtensive.Orm.Upgrade.Internals.Interfaces -{ - internal interface IUpgradeHintsProcessor - { - UpgradeHintsProcessingResult Process(IEnumerable inputHints); - } +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.22 + +using System.Collections.Generic; + +namespace Xtensive.Orm.Upgrade.Internals.Interfaces +{ + internal interface IUpgradeHintsProcessor + { + UpgradeHintsProcessingResult Process(IEnumerable inputHints); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/MatchingHelper.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/MatchingHelper.cs index f280a0a013..2167099fd2 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/MatchingHelper.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/MatchingHelper.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.08.20 - -namespace Xtensive.Orm.Upgrade -{ - internal static class MatchingHelper - { - public const string WildcardSymbol = "*"; - - public static bool ContainsWildcardSymbols(string name) - { - return !string.IsNullOrEmpty(name) && name.Contains(WildcardSymbol); - } - - public static bool IsMatchAll(string name) - { - return string.IsNullOrEmpty(name) || name==WildcardSymbol; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.20 + +namespace Xtensive.Orm.Upgrade +{ + internal static class MatchingHelper + { + public const string WildcardSymbol = "*"; + + public static bool ContainsWildcardSymbols(string name) + { + return !string.IsNullOrEmpty(name) && name.Contains(WildcardSymbol); + } + + public static bool IsMatchAll(string name) + { + return string.IsNullOrEmpty(name) || name==WildcardSymbol; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/AssemblyMetadata.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/AssemblyMetadata.cs index 350cc9a55b..fb035b26ff 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/AssemblyMetadata.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/AssemblyMetadata.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.16 - -using Xtensive.Core; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class AssemblyMetadata - { - public string Name { get; private set; } - - public string Version { get; private set; } - - public override string ToString() - { - return string.Format(Strings.MetadataAssemblyFormat, Name, Version); - } - - // Constructors - - public AssemblyMetadata(string name, string version) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - Name = name; - Version = version; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.16 + +using Xtensive.Core; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class AssemblyMetadata + { + public string Name { get; private set; } + + public string Version { get; private set; } + + public override string ToString() + { + return string.Format(Strings.MetadataAssemblyFormat, Name, Version); + } + + // Constructors + + public AssemblyMetadata(string name, string version) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + Name = name; + Version = version; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/ExtensionMetadata.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/ExtensionMetadata.cs index d8f5965553..96e255e2f4 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/ExtensionMetadata.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/ExtensionMetadata.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.16 - -using Xtensive.Core; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class ExtensionMetadata - { - public string Name { get; private set; } - - public string Value { get; private set; } - - public override string ToString() - { - return Name; - } - - // Constructors - - public ExtensionMetadata(string name, string value) - { - ArgumentValidator.EnsureArgumentNotNull(name, "name"); - Name = name; - Value = value; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.16 + +using Xtensive.Core; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class ExtensionMetadata + { + public string Name { get; private set; } + + public string Value { get; private set; } + + public override string ToString() + { + return Name; + } + + // Constructors + + public ExtensionMetadata(string name, string value) + { + ArgumentValidator.EnsureArgumentNotNull(name, "name"); + Name = name; + Value = value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataExtractor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataExtractor.cs index 8b3e713d48..2da0c8f435 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataExtractor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataExtractor.cs @@ -1,134 +1,134 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.16 - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class MetadataExtractor - { - private readonly MetadataMapping mapping; - private readonly ISqlExecutor executor; - - public void ExtractTypes(MetadataSet output, SqlExtractionTask task) - { - var types = new List(); - ExtractTypes(types, task); - output.Types.AddRange(types); - } - - public void ExtractAssemblies(MetadataSet output, SqlExtractionTask task) - { - var assemblies = new List(); - ExtractAssemblies(assemblies, task); - output.Assemblies.AddRange(assemblies); - } - - public void ExtractExtensions(MetadataSet output, SqlExtractionTask task) - { - var extensions = new List(); - ExtractExtensions(extensions, task); - output.Extensions.AddRange(extensions); - } - - #region Private / internal methods - - private void ExtractAssemblies(ICollection output, SqlExtractionTask task) - { - var query = CreateQuery(mapping.Assembly, task, mapping.AssemblyName, mapping.AssemblyVersion); - ExecuteQuery(output, query, ParseAssembly); - } - - private void ExtractTypes(ICollection output, SqlExtractionTask task) - { - var query = CreateQuery(mapping.Type, task, mapping.TypeId, mapping.TypeName); - ExecuteQuery(output, query, ParseType); - } - - private void ExtractExtensions(ICollection output, SqlExtractionTask task) - { - var query = CreateQuery(mapping.Extension, task, mapping.ExtensionName, mapping.ExtensionText); - ExecuteQuery(output, query, ParseExtension); - } - - private ExtensionMetadata ParseExtension(DbDataReader reader) - { - var name = ReadString(reader, 0); - var text = ReadString(reader, 1); - return new ExtensionMetadata(name, text); - } - - private AssemblyMetadata ParseAssembly(DbDataReader reader) - { - var name = ReadString(reader, 0); - var version = ReadString(reader, 1); - return new AssemblyMetadata(name, version); - } - - private TypeMetadata ParseType(DbDataReader reader) - { - var id = ReadInt(reader, 0); - var name = ReadString(reader, 1); - return new TypeMetadata(id, name); - } - - private void ExecuteQuery(ICollection output, ISqlCompileUnit query, Func parser) - { - using (var command = executor.ExecuteReader(query)) { - var reader = command.Reader; - while (reader.Read()) - output.Add(parser.Invoke(reader)); - } - } - - private SqlSelect CreateQuery(string tableName, SqlExtractionTask task, params string[] columnNames) - { - var catalog = new Catalog(task.Catalog); - var schema = catalog.CreateSchema(task.Schema); - var table = schema.CreateTable(tableName); - foreach (var column in columnNames) - table.CreateColumn(column); - var tableRef = SqlDml.TableRef(table); - var select = SqlDml.Select(tableRef); - var columnRefs = columnNames - .Select((c, i) => SqlDml.ColumnRef(tableRef.Columns[i], c)); - foreach (var columnRef in columnRefs) - select.Columns.Add(columnRef); - return select; - } - - private string ReadString(DbDataReader reader, int index) - { - return reader.IsDBNull(index) ? null : (string) mapping.StringMapping.ReadValue(reader, index); - } - - private int ReadInt(DbDataReader reader, int index) - { - return (int) mapping.IntMapping.ReadValue(reader, index); - } - - #endregion - - // Constructors - - public MetadataExtractor(MetadataMapping mapping, ISqlExecutor executor) - { - ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); - ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); - - this.mapping = mapping; - this.executor = executor; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.16 + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class MetadataExtractor + { + private readonly MetadataMapping mapping; + private readonly ISqlExecutor executor; + + public void ExtractTypes(MetadataSet output, SqlExtractionTask task) + { + var types = new List(); + ExtractTypes(types, task); + output.Types.AddRange(types); + } + + public void ExtractAssemblies(MetadataSet output, SqlExtractionTask task) + { + var assemblies = new List(); + ExtractAssemblies(assemblies, task); + output.Assemblies.AddRange(assemblies); + } + + public void ExtractExtensions(MetadataSet output, SqlExtractionTask task) + { + var extensions = new List(); + ExtractExtensions(extensions, task); + output.Extensions.AddRange(extensions); + } + + #region Private / internal methods + + private void ExtractAssemblies(ICollection output, SqlExtractionTask task) + { + var query = CreateQuery(mapping.Assembly, task, mapping.AssemblyName, mapping.AssemblyVersion); + ExecuteQuery(output, query, ParseAssembly); + } + + private void ExtractTypes(ICollection output, SqlExtractionTask task) + { + var query = CreateQuery(mapping.Type, task, mapping.TypeId, mapping.TypeName); + ExecuteQuery(output, query, ParseType); + } + + private void ExtractExtensions(ICollection output, SqlExtractionTask task) + { + var query = CreateQuery(mapping.Extension, task, mapping.ExtensionName, mapping.ExtensionText); + ExecuteQuery(output, query, ParseExtension); + } + + private ExtensionMetadata ParseExtension(DbDataReader reader) + { + var name = ReadString(reader, 0); + var text = ReadString(reader, 1); + return new ExtensionMetadata(name, text); + } + + private AssemblyMetadata ParseAssembly(DbDataReader reader) + { + var name = ReadString(reader, 0); + var version = ReadString(reader, 1); + return new AssemblyMetadata(name, version); + } + + private TypeMetadata ParseType(DbDataReader reader) + { + var id = ReadInt(reader, 0); + var name = ReadString(reader, 1); + return new TypeMetadata(id, name); + } + + private void ExecuteQuery(ICollection output, ISqlCompileUnit query, Func parser) + { + using (var command = executor.ExecuteReader(query)) { + var reader = command.Reader; + while (reader.Read()) + output.Add(parser.Invoke(reader)); + } + } + + private SqlSelect CreateQuery(string tableName, SqlExtractionTask task, params string[] columnNames) + { + var catalog = new Catalog(task.Catalog); + var schema = catalog.CreateSchema(task.Schema); + var table = schema.CreateTable(tableName); + foreach (var column in columnNames) + table.CreateColumn(column); + var tableRef = SqlDml.TableRef(table); + var select = SqlDml.Select(tableRef); + var columnRefs = columnNames + .Select((c, i) => SqlDml.ColumnRef(tableRef.Columns[i], c)); + foreach (var columnRef in columnRefs) + select.Columns.Add(columnRef); + return select; + } + + private string ReadString(DbDataReader reader, int index) + { + return reader.IsDBNull(index) ? null : (string) mapping.StringMapping.ReadValue(reader, index); + } + + private int ReadInt(DbDataReader reader, int index) + { + return (int) mapping.IntMapping.ReadValue(reader, index); + } + + #endregion + + // Constructors + + public MetadataExtractor(MetadataMapping mapping, ISqlExecutor executor) + { + ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); + ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); + + this.mapping = mapping; + this.executor = executor; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataMapping.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataMapping.cs index 764c43dd09..9797b9d952 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataMapping.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataMapping.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.22 - -using System; -using System.Linq; -using System.Linq.Expressions; -using Xtensive.Core; -using Xtensive.Orm.Metadata; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Type = System.Type; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class MetadataMapping - { - private readonly NameBuilder nameBuilder; - - public readonly TypeMapping StringMapping; - public readonly TypeMapping IntMapping; - - public readonly string Assembly; - public readonly string AssemblyName; - public readonly string AssemblyVersion; - - public readonly string Type; - public readonly string TypeId; - public readonly string TypeName; - - public readonly string Extension; - public readonly string ExtensionName; - public readonly string ExtensionText; - - private string TableOf(Type type) - { - var name = type - .GetCustomAttributes(typeof (TableMappingAttribute), false) - .Cast() - .Single().Name; - return nameBuilder.ApplyNamingRules(name); - } - - private string ColumnOf(Expression> expression) - { - var memberExpression = (MemberExpression) expression.Body.StripCasts(); - var name = memberExpression.Member.Name; - return nameBuilder.ApplyNamingRules(name); - } - - // Constructors - - public MetadataMapping(StorageDriver driver, NameBuilder nameBuilder) - { - this.nameBuilder = nameBuilder; - - Assembly = TableOf(typeof (Assembly)); - AssemblyName = ColumnOf((Assembly x) => x.Name); - AssemblyVersion = ColumnOf((Assembly x) => x.Version); - - Type = TableOf(typeof (Metadata.Type)); - TypeId = ColumnOf((Metadata.Type x) => x.Id); - TypeName = ColumnOf((Metadata.Type x) => x.Name); - - Extension = TableOf(typeof (Extension)); - ExtensionName = ColumnOf((Extension x) => x.Name); - ExtensionText = ColumnOf((Extension x) => x.Text); - - StringMapping = driver.GetTypeMapping(typeof (string)); - IntMapping = driver.GetTypeMapping(typeof (int)); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.22 + +using System; +using System.Linq; +using System.Linq.Expressions; +using Xtensive.Core; +using Xtensive.Orm.Metadata; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Type = System.Type; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class MetadataMapping + { + private readonly NameBuilder nameBuilder; + + public readonly TypeMapping StringMapping; + public readonly TypeMapping IntMapping; + + public readonly string Assembly; + public readonly string AssemblyName; + public readonly string AssemblyVersion; + + public readonly string Type; + public readonly string TypeId; + public readonly string TypeName; + + public readonly string Extension; + public readonly string ExtensionName; + public readonly string ExtensionText; + + private string TableOf(Type type) + { + var name = type + .GetCustomAttributes(typeof (TableMappingAttribute), false) + .Cast() + .Single().Name; + return nameBuilder.ApplyNamingRules(name); + } + + private string ColumnOf(Expression> expression) + { + var memberExpression = (MemberExpression) expression.Body.StripCasts(); + var name = memberExpression.Member.Name; + return nameBuilder.ApplyNamingRules(name); + } + + // Constructors + + public MetadataMapping(StorageDriver driver, NameBuilder nameBuilder) + { + this.nameBuilder = nameBuilder; + + Assembly = TableOf(typeof (Assembly)); + AssemblyName = ColumnOf((Assembly x) => x.Name); + AssemblyVersion = ColumnOf((Assembly x) => x.Version); + + Type = TableOf(typeof (Metadata.Type)); + TypeId = ColumnOf((Metadata.Type x) => x.Id); + TypeName = ColumnOf((Metadata.Type x) => x.Name); + + Extension = TableOf(typeof (Extension)); + ExtensionName = ColumnOf((Extension x) => x.Name); + ExtensionText = ColumnOf((Extension x) => x.Text); + + StringMapping = driver.GetTypeMapping(typeof (string)); + IntMapping = driver.GetTypeMapping(typeof (int)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataSet.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataSet.cs index 63820acc09..3b859cd7b2 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataSet.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataSet.cs @@ -1,24 +1,24 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.22 - -using System.Collections.Generic; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class MetadataSet - { - public readonly List Assemblies = new List(); - public readonly List Extensions = new List(); - public readonly List Types = new List(); - - public void UnionWith(MetadataSet other) - { - Assemblies.AddRange(other.Assemblies); - Extensions.AddRange(other.Extensions); - Types.AddRange(other.Types); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.22 + +using System.Collections.Generic; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class MetadataSet + { + public readonly List Assemblies = new List(); + public readonly List Extensions = new List(); + public readonly List Types = new List(); + + public void UnionWith(MetadataSet other) + { + Assemblies.AddRange(other.Assemblies); + Extensions.AddRange(other.Extensions); + Types.AddRange(other.Types); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs index ea8e595c16..a57d746b1c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/MetadataWriter.cs @@ -1,140 +1,140 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.22 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using Xtensive.Tuples; -using ArgumentValidator = Xtensive.Core.ArgumentValidator; -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class MetadataWriter - { - private static readonly TupleDescriptor IntStringDescriptor = TupleDescriptor.Create(new[] {typeof (int), typeof (string)}); - private static readonly TupleDescriptor StringStringDescriptor = TupleDescriptor.Create(new[] {typeof (string), typeof (string)}); - - private sealed class Descriptor : IPersistDescriptor - { - public PersistRequest StoreRequest { get; set; } - public PersistRequest ClearRequest { get; set; } - } - - private readonly StorageDriver driver; - private readonly MetadataMapping mapping; - private readonly SqlExtractionTask task; - private readonly IProviderExecutor executor; - - public void Write(MetadataSet metadata) - { - WriteTypes(metadata.Types); - WriteAssemblies(metadata.Assemblies); - WriteExtensions(metadata.Extensions); - } - - #region Private / internal methods - - private void WriteExtensions(IEnumerable extensions) - { - var extensionTextTransmissionType = - driver.ProviderInfo.Supports(ProviderFeatures.LargeObjects) - ? ParameterTransmissionType.CharacterLob - : ParameterTransmissionType.Regular; - var descriptor = CreateDescriptor(mapping.Extension, - mapping.StringMapping, mapping.ExtensionName, ParameterTransmissionType.Regular, - mapping.StringMapping, mapping.ExtensionText, extensionTextTransmissionType, - ProvideExtensionMetadataFilter); - - executor.Overwrite(descriptor, extensions.Select(item => (Tuple) Tuple.Create(StringStringDescriptor, item.Name, item.Value))); - } - - private void ProvideExtensionMetadataFilter(SqlDelete delete) - { - var knownExtensions = SqlDml.Array(WellKnown.DomainModelExtensionName, WellKnown.PartialIndexDefinitionsExtensionName); - delete.Where = SqlDml.In(delete.Delete[mapping.ExtensionName], knownExtensions); - } - - private void WriteTypes(IEnumerable types) - { - var descriptor = CreateDescriptor(mapping.Type, - mapping.IntMapping, mapping.TypeId, ParameterTransmissionType.Regular, - mapping.StringMapping, mapping.TypeName, ParameterTransmissionType.Regular); - - executor.Overwrite(descriptor, types.Select(item => (Tuple) Tuple.Create(IntStringDescriptor, item.Id, item.Name))); - } - - private void WriteAssemblies(IEnumerable assemblies) - { - var descriptor = CreateDescriptor(mapping.Assembly, - mapping.StringMapping, mapping.AssemblyName, ParameterTransmissionType.Regular, - mapping.StringMapping, mapping.AssemblyVersion, ParameterTransmissionType.Regular); - - executor.Overwrite(descriptor, assemblies.Select(item => (Tuple) Tuple.Create(StringStringDescriptor, item.Name, item.Version))); - } - - private IPersistDescriptor CreateDescriptor(string tableName, - TypeMapping mapping1, string columnName1, ParameterTransmissionType transmissionType1, - TypeMapping mapping2, string columnName2, ParameterTransmissionType transmissionType2, - Action deleteTransform = null) - { - var catalog = new Catalog(task.Catalog); - var schema = catalog.CreateSchema(task.Schema); - var table = schema.CreateTable(tableName); - - var columnNames = new[] {columnName1, columnName2}; - var mappings = new[] {mapping1, mapping2}; - var transmissionTypes = new[] {transmissionType1, transmissionType2}; - - var columns = columnNames.Select(table.CreateColumn).ToList(); - var tableRef = SqlDml.TableRef(table); - - var insert = SqlDml.Insert(tableRef); - var bindings = new PersistParameterBinding[columns.Count]; - for (int i = 0; i < columns.Count; i++) { - var binding = new PersistParameterBinding(mappings[i], i, transmissionTypes[i]); - insert.Values[tableRef.Columns[i]] = binding.ParameterReference; - bindings[i] = binding; - } - - var delete = SqlDml.Delete(tableRef); - if (deleteTransform!=null) - deleteTransform.Invoke(delete); - - var storeRequest = new PersistRequest(driver, insert, bindings); - var clearRequest = new PersistRequest(driver, delete, null); - - storeRequest.Prepare(); - clearRequest.Prepare(); - - return new Descriptor { - StoreRequest = storeRequest, - ClearRequest = clearRequest - }; - } - - #endregion - - // Constructors - - public MetadataWriter(StorageDriver driver, MetadataMapping mapping, SqlExtractionTask task, IProviderExecutor executor) - { - ArgumentValidator.EnsureArgumentNotNull(driver, "driver"); - ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); - ArgumentValidator.EnsureArgumentNotNull(task, "task"); - ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); - - this.driver = driver; - this.mapping = mapping; - this.task = task; - this.executor = executor; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.22 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using Xtensive.Tuples; +using ArgumentValidator = Xtensive.Core.ArgumentValidator; +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class MetadataWriter + { + private static readonly TupleDescriptor IntStringDescriptor = TupleDescriptor.Create(new[] {typeof (int), typeof (string)}); + private static readonly TupleDescriptor StringStringDescriptor = TupleDescriptor.Create(new[] {typeof (string), typeof (string)}); + + private sealed class Descriptor : IPersistDescriptor + { + public PersistRequest StoreRequest { get; set; } + public PersistRequest ClearRequest { get; set; } + } + + private readonly StorageDriver driver; + private readonly MetadataMapping mapping; + private readonly SqlExtractionTask task; + private readonly IProviderExecutor executor; + + public void Write(MetadataSet metadata) + { + WriteTypes(metadata.Types); + WriteAssemblies(metadata.Assemblies); + WriteExtensions(metadata.Extensions); + } + + #region Private / internal methods + + private void WriteExtensions(IEnumerable extensions) + { + var extensionTextTransmissionType = + driver.ProviderInfo.Supports(ProviderFeatures.LargeObjects) + ? ParameterTransmissionType.CharacterLob + : ParameterTransmissionType.Regular; + var descriptor = CreateDescriptor(mapping.Extension, + mapping.StringMapping, mapping.ExtensionName, ParameterTransmissionType.Regular, + mapping.StringMapping, mapping.ExtensionText, extensionTextTransmissionType, + ProvideExtensionMetadataFilter); + + executor.Overwrite(descriptor, extensions.Select(item => (Tuple) Tuple.Create(StringStringDescriptor, item.Name, item.Value))); + } + + private void ProvideExtensionMetadataFilter(SqlDelete delete) + { + var knownExtensions = SqlDml.Array(WellKnown.DomainModelExtensionName, WellKnown.PartialIndexDefinitionsExtensionName); + delete.Where = SqlDml.In(delete.Delete[mapping.ExtensionName], knownExtensions); + } + + private void WriteTypes(IEnumerable types) + { + var descriptor = CreateDescriptor(mapping.Type, + mapping.IntMapping, mapping.TypeId, ParameterTransmissionType.Regular, + mapping.StringMapping, mapping.TypeName, ParameterTransmissionType.Regular); + + executor.Overwrite(descriptor, types.Select(item => (Tuple) Tuple.Create(IntStringDescriptor, item.Id, item.Name))); + } + + private void WriteAssemblies(IEnumerable assemblies) + { + var descriptor = CreateDescriptor(mapping.Assembly, + mapping.StringMapping, mapping.AssemblyName, ParameterTransmissionType.Regular, + mapping.StringMapping, mapping.AssemblyVersion, ParameterTransmissionType.Regular); + + executor.Overwrite(descriptor, assemblies.Select(item => (Tuple) Tuple.Create(StringStringDescriptor, item.Name, item.Version))); + } + + private IPersistDescriptor CreateDescriptor(string tableName, + TypeMapping mapping1, string columnName1, ParameterTransmissionType transmissionType1, + TypeMapping mapping2, string columnName2, ParameterTransmissionType transmissionType2, + Action deleteTransform = null) + { + var catalog = new Catalog(task.Catalog); + var schema = catalog.CreateSchema(task.Schema); + var table = schema.CreateTable(tableName); + + var columnNames = new[] {columnName1, columnName2}; + var mappings = new[] {mapping1, mapping2}; + var transmissionTypes = new[] {transmissionType1, transmissionType2}; + + var columns = columnNames.Select(table.CreateColumn).ToList(); + var tableRef = SqlDml.TableRef(table); + + var insert = SqlDml.Insert(tableRef); + var bindings = new PersistParameterBinding[columns.Count]; + for (int i = 0; i < columns.Count; i++) { + var binding = new PersistParameterBinding(mappings[i], i, transmissionTypes[i]); + insert.Values[tableRef.Columns[i]] = binding.ParameterReference; + bindings[i] = binding; + } + + var delete = SqlDml.Delete(tableRef); + if (deleteTransform!=null) + deleteTransform.Invoke(delete); + + var storeRequest = new PersistRequest(driver, insert, bindings); + var clearRequest = new PersistRequest(driver, delete, null); + + storeRequest.Prepare(); + clearRequest.Prepare(); + + return new Descriptor { + StoreRequest = storeRequest, + ClearRequest = clearRequest + }; + } + + #endregion + + // Constructors + + public MetadataWriter(StorageDriver driver, MetadataMapping mapping, SqlExtractionTask task, IProviderExecutor executor) + { + ArgumentValidator.EnsureArgumentNotNull(driver, "driver"); + ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); + ArgumentValidator.EnsureArgumentNotNull(task, "task"); + ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); + + this.driver = driver; + this.mapping = mapping; + this.task = task; + this.executor = executor; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/TypeMetadata.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/TypeMetadata.cs index 883aefa6f4..3f9bd4238c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/TypeMetadata.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/Metadata/TypeMetadata.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.02.16 - -using Xtensive.Core; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class TypeMetadata - { - public int Id { get; private set; } - - public string Name { get; set; } - - public override string ToString() - { - return string.Format(Strings.MetadataTypeFormat, Name, Id); - } - - // Constructors - - public TypeMetadata(int id, string name) - { - ArgumentValidator.EnsureArgumentNotNull(name, "name"); - - Id = id; - Name = name; - } - - public TypeMetadata(int id, System.Type type) - { - Id = id; - Name = type.GetFullName(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.02.16 + +using Xtensive.Core; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class TypeMetadata + { + public int Id { get; private set; } + + public string Name { get; set; } + + public override string ToString() + { + return string.Format(Strings.MetadataTypeFormat, Name, Id); + } + + // Constructors + + public TypeMetadata(int id, string name) + { + ArgumentValidator.EnsureArgumentNotNull(name, "name"); + + Id = id; + Name = name; + } + + public TypeMetadata(int id, System.Type type) + { + Id = id; + Name = type.GetFullName(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NodeExtractedModelBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NodeExtractedModelBuilder.cs index 6e87ff3c27..2096b8da41 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NodeExtractedModelBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NodeExtractedModelBuilder.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2016.02.23 - -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade.Internals.Interfaces; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Upgrade.Internals -{ - internal sealed class NodeExtractedModelBuilder : ISchemaExtractionResultBuilder - { - private readonly MappingResolver mappingResolver; - private readonly StorageNode defaultStorageNode; - private readonly NodeConfiguration buildingNodeConfiguration; - private readonly bool buildAsCopy; - - public SchemaExtractionResult Run() - { - var result = new SchemaExtractionResult(); - if (buildAsCopy) - CopyCatalogs(result.Catalogs); - else { - GetDefaultNodeCatalogs().ForEach(result.Catalogs.Add); - result.MakeShared(); - } - return result; - } - - private void CopyCatalogs(NodeCollection catalogs) - { - var cloner = new CatalogCloner(); - var defaultNodeCatalogs = GetDefaultNodeCatalogs(); - var currentCatalogNodes = GetCurrentExtratableCatalogs(); - if (currentCatalogNodes.Count==1) { - catalogs.Add(cloner.Clone(defaultNodeCatalogs[0], mappingResolver, currentCatalogNodes[0])); - } - else { - defaultNodeCatalogs - .Select( - catalog => cloner.Clone(catalog, mappingResolver, buildingNodeConfiguration.DatabaseMapping.Apply(catalog.Name))) - .ForEach(catalogs.Add); - } - } - - private IList GetCurrentExtratableCatalogs() - { - return mappingResolver.GetSchemaTasks().GroupBy(t => t.Catalog).Select(t=>t.Key).ToList(); - } - - private IList GetDefaultNodeCatalogs() - { - return defaultStorageNode.Mapping.GetAllSchemaNodes().Select(node => node.Schema.Catalog).Distinct().ToList(); - } - - internal NodeExtractedModelBuilder(UpgradeServiceAccessor services, StorageNode defaultNode, NodeConfiguration buildingNodeConfiguration, bool defaultNodeIsUnreadable) - { - ArgumentValidator.EnsureArgumentNotNull(services, "services"); - ArgumentValidator.EnsureArgumentNotNull(defaultNode, "defaultNode"); - ArgumentValidator.EnsureArgumentNotNull(buildingNodeConfiguration, "buildingNodeConfiguration"); - - mappingResolver = services.MappingResolver; - this.buildingNodeConfiguration = buildingNodeConfiguration; - defaultStorageNode = defaultNode; - buildAsCopy = !defaultNodeIsUnreadable; - } - } +// Copyright (C) 2016 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2016.02.23 + +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade.Internals.Interfaces; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade.Internals +{ + internal sealed class NodeExtractedModelBuilder : ISchemaExtractionResultBuilder + { + private readonly MappingResolver mappingResolver; + private readonly StorageNode defaultStorageNode; + private readonly NodeConfiguration buildingNodeConfiguration; + private readonly bool buildAsCopy; + + public SchemaExtractionResult Run() + { + var result = new SchemaExtractionResult(); + if (buildAsCopy) + CopyCatalogs(result.Catalogs); + else { + GetDefaultNodeCatalogs().ForEach(result.Catalogs.Add); + result.MakeShared(); + } + return result; + } + + private void CopyCatalogs(NodeCollection catalogs) + { + var cloner = new CatalogCloner(); + var defaultNodeCatalogs = GetDefaultNodeCatalogs(); + var currentCatalogNodes = GetCurrentExtratableCatalogs(); + if (currentCatalogNodes.Count==1) { + catalogs.Add(cloner.Clone(defaultNodeCatalogs[0], mappingResolver, currentCatalogNodes[0])); + } + else { + defaultNodeCatalogs + .Select( + catalog => cloner.Clone(catalog, mappingResolver, buildingNodeConfiguration.DatabaseMapping.Apply(catalog.Name))) + .ForEach(catalogs.Add); + } + } + + private IList GetCurrentExtratableCatalogs() + { + return mappingResolver.GetSchemaTasks().GroupBy(t => t.Catalog).Select(t=>t.Key).ToList(); + } + + private IList GetDefaultNodeCatalogs() + { + return defaultStorageNode.Mapping.GetAllSchemaNodes().Select(node => node.Schema.Catalog).Distinct().ToList(); + } + + internal NodeExtractedModelBuilder(UpgradeServiceAccessor services, StorageNode defaultNode, NodeConfiguration buildingNodeConfiguration, bool defaultNodeIsUnreadable) + { + ArgumentValidator.EnsureArgumentNotNull(services, "services"); + ArgumentValidator.EnsureArgumentNotNull(defaultNode, "defaultNode"); + ArgumentValidator.EnsureArgumentNotNull(buildingNodeConfiguration, "buildingNodeConfiguration"); + + mappingResolver = services.MappingResolver; + this.buildingNodeConfiguration = buildingNodeConfiguration; + defaultStorageNode = defaultNode; + buildAsCopy = !defaultNodeIsUnreadable; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NullUpgradeHintsProcessor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NullUpgradeHintsProcessor.cs index 7471a072b2..03a84a47a6 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NullUpgradeHintsProcessor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/NullUpgradeHintsProcessor.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.22 - -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Upgrade.Internals.Interfaces; - -namespace Xtensive.Orm.Upgrade.Internals -{ - internal sealed class NullUpgradeHintsProcessor : IUpgradeHintsProcessor - { - private readonly StoredDomainModel currentDomainModel; - - public UpgradeHintsProcessingResult Process(IEnumerable inputHints) - { - var hints = new NativeTypeClassifier(true); - var typeMapping = new Dictionary(); - var reverseTypeMapping = new Dictionary(); - var fieldMapping = new Dictionary(); - var reverseFieldMapping = new Dictionary(); - var currentModelTypes = currentDomainModel.Types.ToDictionary(t => t.UnderlyingType); - var suspiciousTypes = new List(); - - return new UpgradeHintsProcessingResult(hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentModelTypes, suspiciousTypes); - - } - - public NullUpgradeHintsProcessor(StoredDomainModel currentDomainModel) - { - this.currentDomainModel = currentDomainModel; - } - } +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.22 + +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Upgrade.Internals.Interfaces; + +namespace Xtensive.Orm.Upgrade.Internals +{ + internal sealed class NullUpgradeHintsProcessor : IUpgradeHintsProcessor + { + private readonly StoredDomainModel currentDomainModel; + + public UpgradeHintsProcessingResult Process(IEnumerable inputHints) + { + var hints = new NativeTypeClassifier(true); + var typeMapping = new Dictionary(); + var reverseTypeMapping = new Dictionary(); + var fieldMapping = new Dictionary(); + var reverseFieldMapping = new Dictionary(); + var currentModelTypes = currentDomainModel.Types.ToDictionary(t => t.UnderlyingType); + var suspiciousTypes = new List(); + + return new UpgradeHintsProcessingResult(hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentModelTypes, suspiciousTypes); + + } + + public NullUpgradeHintsProcessor(StoredDomainModel currentDomainModel) + { + this.currentDomainModel = currentDomainModel; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/PartialIndexInfoMap.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/PartialIndexInfoMap.cs index bac55581c9..d492088599 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/PartialIndexInfoMap.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/PartialIndexInfoMap.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2013 Xtensive LLC -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.07.18 - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class PartialIndexInfoMap - { - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - - private readonly Dictionary> items; - - public StoredPartialIndexFilterInfo FindIndex(string table, string index) - { - Dictionary indexesForTable; - StoredPartialIndexFilterInfo result; - if (items.TryGetValue(table, out indexesForTable) && indexesForTable.TryGetValue(index, out result)) - return result; - return null; - } - - public PartialIndexInfoMap(MappingResolver resolver, IEnumerable indexes) - { - ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); - ArgumentValidator.EnsureArgumentNotNull(indexes, "indexes"); - - items = new Dictionary>(Comparer); - - foreach (var index in indexes) { - var tableName = resolver.GetNodeName(index.Database, index.Schema, index.Table); - Dictionary indexesForTable; - if (!items.TryGetValue(tableName, out indexesForTable)) { - indexesForTable = new Dictionary(Comparer); - items.Add(tableName, indexesForTable); - } - indexesForTable.Add(index.Name, index); - } - } - } +// Copyright (C) 2013 Xtensive LLC +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.07.18 + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class PartialIndexInfoMap + { + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + + private readonly Dictionary> items; + + public StoredPartialIndexFilterInfo FindIndex(string table, string index) + { + Dictionary indexesForTable; + StoredPartialIndexFilterInfo result; + if (items.TryGetValue(table, out indexesForTable) && indexesForTable.TryGetValue(index, out result)) + return result; + return null; + } + + public PartialIndexInfoMap(MappingResolver resolver, IEnumerable indexes) + { + ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); + ArgumentValidator.EnsureArgumentNotNull(indexes, "indexes"); + + items = new Dictionary>(Comparer); + + foreach (var index in indexes) { + var tableName = resolver.GetNodeName(index.Database, index.Schema, index.Table); + Dictionary indexesForTable; + if (!items.TryGetValue(tableName, out indexesForTable)) { + indexesForTable = new Dictionary(Comparer); + items.Add(tableName, indexesForTable); + } + indexesForTable.Add(index.Name, index); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/RuleMatcher.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/RuleMatcher.cs index 29ca934e94..82dc042b6d 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/RuleMatcher.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/RuleMatcher.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.08.20 - -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Upgrade -{ - internal abstract class RuleMatcher - where T : Node - { - private class NameMatcher : RuleMatcher - { - private readonly string itemName; - - public override IEnumerable Get(NodeCollection items) - { - var result = items[itemName]; - if (result!=null) - yield return result; - } - - public NameMatcher(string itemName) - { - this.itemName = itemName; - } - } - - private class PatternMatcher : RuleMatcher - { - private readonly Regex matcher; - - public override IEnumerable Get(NodeCollection items) - { - return items.Where(item => matcher.IsMatch(item.Name)).ToList(); - } - - private string CreateRegexPattern(string pattern) - { - var items = pattern.Split(MatchingHelper.WildcardSymbol.ToCharArray()); - for (int i = 0; i < items.Length; i++) - items[i] = Regex.Escape(items[i]); - return string.Format("^{0}$", string.Join(".*", items)); - } - - public PatternMatcher(string pattern) - { - matcher = new Regex(CreateRegexPattern(pattern), RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); - } - } - - private class AllMatcher : RuleMatcher - { - public override IEnumerable Get(NodeCollection items) - { - return items.ToList(); - } - } - - public abstract IEnumerable Get(NodeCollection items); - - public static RuleMatcher Create(string pattern) - { - if (MatchingHelper.IsMatchAll(pattern)) - return new AllMatcher(); - if (MatchingHelper.ContainsWildcardSymbols(pattern)) - return new PatternMatcher(pattern); - return new NameMatcher(pattern); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.08.20 + +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade +{ + internal abstract class RuleMatcher + where T : Node + { + private class NameMatcher : RuleMatcher + { + private readonly string itemName; + + public override IEnumerable Get(NodeCollection items) + { + var result = items[itemName]; + if (result!=null) + yield return result; + } + + public NameMatcher(string itemName) + { + this.itemName = itemName; + } + } + + private class PatternMatcher : RuleMatcher + { + private readonly Regex matcher; + + public override IEnumerable Get(NodeCollection items) + { + return items.Where(item => matcher.IsMatch(item.Name)).ToList(); + } + + private string CreateRegexPattern(string pattern) + { + var items = pattern.Split(MatchingHelper.WildcardSymbol.ToCharArray()); + for (int i = 0; i < items.Length; i++) + items[i] = Regex.Escape(items[i]); + return string.Format("^{0}$", string.Join(".*", items)); + } + + public PatternMatcher(string pattern) + { + matcher = new Regex(CreateRegexPattern(pattern), RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + } + } + + private class AllMatcher : RuleMatcher + { + public override IEnumerable Get(NodeCollection items) + { + return items.ToList(); + } + } + + public abstract IEnumerable Get(NodeCollection items); + + public static RuleMatcher Create(string pattern) + { + if (MatchingHelper.IsMatchAll(pattern)) + return new AllMatcher(); + if (MatchingHelper.ContainsWildcardSymbols(pattern)) + return new PatternMatcher(pattern); + return new NameMatcher(pattern); + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaComparer.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaComparer.cs index aef362b2ee..de21e3dd82 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaComparer.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaComparer.cs @@ -1,294 +1,294 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.01 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Model; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Compares storage models. - /// - internal static class SchemaComparer - { - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - - /// - /// Compares and . - /// - /// The source schema. - /// The target schema. - /// The upgrade hints. - /// Comparison result. - public static SchemaComparisonResult Compare( - StorageModel sourceSchema, StorageModel targetSchema, - HintSet schemaHints, SetSlim upgradeHints, - SchemaUpgradeMode schemaUpgradeMode, DomainModel model, - bool briefExceptionFormat, UpgradeStage upgradeStage) - { - if (schemaHints==null) - schemaHints = new HintSet(sourceSchema, targetSchema); - - var comparer = new Comparer(); - var difference = comparer.Compare(sourceSchema, targetSchema, schemaHints); - var actions = GetUpgradeActions(comparer, difference, schemaHints); - var actionList = actions.Flatten().ToList(); - var comparisonStatus = GetComparisonStatus(actionList, schemaUpgradeMode); - var unsafeActions = GetUnsafeActions(actionList, upgradeHints); - var columnTypeChangeActions = actionList.OfType().Where(IsTypeChangeAction).ToList(); - - if (schemaUpgradeMode!=SchemaUpgradeMode.ValidateLegacy) - return new SchemaComparisonResult( - comparisonStatus, columnTypeChangeActions.Count > 0, null, - schemaHints, difference, actions, unsafeActions); - - // Legacy comparison - - var systemTablesSequence = model.Types.Where(type => type.IsSystem).Select(type => type.MappingName); - var systemTables = new HashSet(systemTablesSequence, Comparer); - - var createTableActions = actionList - .OfType() - .Where( - action => { - var table = action.Difference.Target as TableInfo; - return table!=null && !systemTables.Contains(table.Name); - }) - .ToList(); - - var createColumnActions = actionList - .OfType() - .Where( - action => { - var column = action.Difference.Target as StorageColumnInfo; - return column!=null && !systemTables.Contains(column.Parent.Name); - }) - .ToList(); - - columnTypeChangeActions = columnTypeChangeActions - .Where( - action => { - var sourceType = action.Difference.Source as StorageTypeInfo; - var targetType = action.Difference.Target as StorageTypeInfo; - return sourceType==null || targetType==null || sourceType.IsTypeUndefined - || sourceType.Type.ToNullable()!=targetType.Type.ToNullable(); - }) - .ToList(); - - - var isCompatibleInLegacyMode = - createTableActions.Count==0 - && createColumnActions.Count==0 - && columnTypeChangeActions.Count==0; - - if (briefExceptionFormat) - unsafeActions = - createTableActions.Cast() - .Concat(createColumnActions.Cast()) - .Concat(columnTypeChangeActions.Cast()) - .ToList(); - - return new SchemaComparisonResult( - comparisonStatus, columnTypeChangeActions.Count > 0, isCompatibleInLegacyMode, - schemaHints, difference, actions, unsafeActions); - } - - private static ActionSequence GetUpgradeActions(Comparer comparer, Difference difference, HintSet hints) - { - var actions = difference!=null - ? new Upgrader().GetUpgradeSequence(difference, hints, comparer) - : EnumerableUtils.Empty; - return new ActionSequence {actions}; - } - - private static IList GetUnsafeActions(ICollection actions, SetSlim hints) - { - var unsafeActions = new List(); - - GetUnsafeColumnTypeChanges(actions, hints, unsafeActions); - GetUnsafeColumnRemovals(actions, hints, unsafeActions); - GetUnsafeTableRemovals(actions, hints, unsafeActions); - GetCrossHierarchicalMovements(actions, hints, unsafeActions); - - return unsafeActions; - } - - private static void GetUnsafeColumnTypeChanges( - IEnumerable actions, IEnumerable hints, ICollection output) - { - var columnsWithHints = hints.OfType().SelectMany(hint => hint.AffectedColumns); - - // The following code will not work because HintGenerator generates node paths - // inconsistent with RemoveFieldHint: - - // GetUnsafeColumnActions(actions, columnsWithHints, IsUnsafeTypeChangeAction, output); - - var safeColumns = new HashSet(columnsWithHints, Comparer); - - var unsafeActions = actions - .Where(IsUnsafeTypeChangeAction) - .Where(action => !safeColumns.Contains(action.Path)); - - foreach (var action in unsafeActions) - output.Add(action); - } - - private static void GetUnsafeColumnRemovals( - IEnumerable actions, IEnumerable hints, ICollection output) - { - var columnsWithHints = hints.OfType().SelectMany(hint => hint.AffectedColumns); - GetUnsafeColumnActions(actions, columnsWithHints, a => IsColumnAction(a) && a is RemoveNodeAction, output); - } - - private static void GetUnsafeColumnActions( - IEnumerable actions, IEnumerable columnsWithHints, - Func unsafeActionFilter, ICollection output) - { - var safeColumns = new HashSet(columnsWithHints, Comparer); - var tableMapping = new Dictionary(Comparer); - var reverseTableMapping = new Dictionary(Comparer); - - foreach (var action in actions) { - if (IsTableAction(action)) { - var moveAction = action as MoveNodeAction; - if (moveAction==null) - continue; - string originalPath; - if (reverseTableMapping.TryGetValue(moveAction.Path, out originalPath)) { - tableMapping.Remove(originalPath); - reverseTableMapping.Remove(moveAction.Path); - tableMapping.Add(originalPath, moveAction.NewPath); - reverseTableMapping.Add(moveAction.NewPath, originalPath); - } - else { - tableMapping.Add(moveAction.Path, moveAction.NewPath); - reverseTableMapping.Add(moveAction.NewPath, moveAction.Path); - } - continue; - } - - if (!unsafeActionFilter.Invoke(action)) - continue; - - var columnPath = action.Path; - - // Adjust column path if table was renamed - - var pathItems = columnPath.Split('/'); - if (pathItems.Length!=4) { - // Should not happen, but need to know if this happens - output.Add(action); - continue; - } - - var tablePath = string.Format("Tables/{0}", pathItems[1]); - var columnName = pathItems[3]; - - string originalTablePath; - - if (reverseTableMapping.TryGetValue(tablePath, out originalTablePath)) - columnPath = string.Format("{0}/Columns/{1}", originalTablePath, columnName); - - if (!safeColumns.Contains(columnPath)) - output.Add(action); - } - } - - private static void GetUnsafeTableRemovals(IEnumerable actions, IEnumerable hints, ICollection output) - { - var safeTableRemovals = hints - .OfType() - .SelectMany(hint => hint.AffectedTables) - .ToHashSet(); - - actions - .OfType() - .Where(IsTableAction) - .Where(a => !safeTableRemovals.Contains(a.Path, Comparer)) - .ForEach(output.Add); - } - - private static void GetCrossHierarchicalMovements(IEnumerable actions, IEnumerable hints, ICollection output) - { - (from action in actions.OfType() - let deleteDataHint = action.DataHint as DeleteDataHint - where deleteDataHint!=null && deleteDataHint.PostCopy - select action).ForEach(output.Add); - } - - private static bool IsTypeChangeAction(PropertyChangeAction action) - { - return action.Properties.ContainsKey("Type") - && action.Difference.Parent.Source is StorageColumnInfo - && action.Difference.Parent.Target is StorageColumnInfo; - } - - private static bool IsUnsafeTypeChangeAction(NodeAction action) - { - var propertyChangeAction = action as PropertyChangeAction; - if (propertyChangeAction==null) - return false; - - if (!IsTypeChangeAction(propertyChangeAction)) - return false; - - return !TypeConversionVerifier.CanConvertSafely( - (StorageTypeInfo) propertyChangeAction.Difference.Source, - (StorageTypeInfo) propertyChangeAction.Difference.Target); - } - - private static bool IsTableAction(NodeAction action) - { - var diff = action.Difference as NodeDifference; - if (diff==null) - return false; - var item = diff.Source ?? diff.Target; - return item is TableInfo; - } - - private static bool IsColumnAction(NodeAction action) - { - var diff = action.Difference as NodeDifference; - if (diff==null) - return false; - var item = diff.Source ?? diff.Target; - return item is StorageColumnInfo; - } - - private static SchemaComparisonStatus GetComparisonStatus(ICollection actions, SchemaUpgradeMode schemaUpgradeMode) - { - var filter = schemaUpgradeMode!=SchemaUpgradeMode.ValidateCompatible - ? (Func) (targetType => true) - : targetType => targetType.In(typeof (TableInfo), typeof (StorageColumnInfo)); - var hasCreateActions = actions - .OfType() - .Select(action => action.Difference.Target.GetType()) - .Any(filter); - var hasRemoveActions = actions - .OfType() - .Select(action => action.Difference.Source.GetType()) - .Any(sourceType => sourceType.In(typeof (TableInfo), typeof (StorageColumnInfo))); - - if (hasCreateActions && hasRemoveActions) - return SchemaComparisonStatus.NotEqual; - if (hasCreateActions) - return SchemaComparisonStatus.TargetIsSuperset; - if (hasRemoveActions) - return SchemaComparisonStatus.TargetIsSubset; - return SchemaComparisonStatus.Equal; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.01 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Model; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Compares storage models. + /// + internal static class SchemaComparer + { + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + + /// + /// Compares and . + /// + /// The source schema. + /// The target schema. + /// The upgrade hints. + /// Comparison result. + public static SchemaComparisonResult Compare( + StorageModel sourceSchema, StorageModel targetSchema, + HintSet schemaHints, SetSlim upgradeHints, + SchemaUpgradeMode schemaUpgradeMode, DomainModel model, + bool briefExceptionFormat, UpgradeStage upgradeStage) + { + if (schemaHints==null) + schemaHints = new HintSet(sourceSchema, targetSchema); + + var comparer = new Comparer(); + var difference = comparer.Compare(sourceSchema, targetSchema, schemaHints); + var actions = GetUpgradeActions(comparer, difference, schemaHints); + var actionList = actions.Flatten().ToList(); + var comparisonStatus = GetComparisonStatus(actionList, schemaUpgradeMode); + var unsafeActions = GetUnsafeActions(actionList, upgradeHints); + var columnTypeChangeActions = actionList.OfType().Where(IsTypeChangeAction).ToList(); + + if (schemaUpgradeMode!=SchemaUpgradeMode.ValidateLegacy) + return new SchemaComparisonResult( + comparisonStatus, columnTypeChangeActions.Count > 0, null, + schemaHints, difference, actions, unsafeActions); + + // Legacy comparison + + var systemTablesSequence = model.Types.Where(type => type.IsSystem).Select(type => type.MappingName); + var systemTables = new HashSet(systemTablesSequence, Comparer); + + var createTableActions = actionList + .OfType() + .Where( + action => { + var table = action.Difference.Target as TableInfo; + return table!=null && !systemTables.Contains(table.Name); + }) + .ToList(); + + var createColumnActions = actionList + .OfType() + .Where( + action => { + var column = action.Difference.Target as StorageColumnInfo; + return column!=null && !systemTables.Contains(column.Parent.Name); + }) + .ToList(); + + columnTypeChangeActions = columnTypeChangeActions + .Where( + action => { + var sourceType = action.Difference.Source as StorageTypeInfo; + var targetType = action.Difference.Target as StorageTypeInfo; + return sourceType==null || targetType==null || sourceType.IsTypeUndefined + || sourceType.Type.ToNullable()!=targetType.Type.ToNullable(); + }) + .ToList(); + + + var isCompatibleInLegacyMode = + createTableActions.Count==0 + && createColumnActions.Count==0 + && columnTypeChangeActions.Count==0; + + if (briefExceptionFormat) + unsafeActions = + createTableActions.Cast() + .Concat(createColumnActions.Cast()) + .Concat(columnTypeChangeActions.Cast()) + .ToList(); + + return new SchemaComparisonResult( + comparisonStatus, columnTypeChangeActions.Count > 0, isCompatibleInLegacyMode, + schemaHints, difference, actions, unsafeActions); + } + + private static ActionSequence GetUpgradeActions(Comparer comparer, Difference difference, HintSet hints) + { + var actions = difference!=null + ? new Upgrader().GetUpgradeSequence(difference, hints, comparer) + : EnumerableUtils.Empty; + return new ActionSequence {actions}; + } + + private static IList GetUnsafeActions(ICollection actions, SetSlim hints) + { + var unsafeActions = new List(); + + GetUnsafeColumnTypeChanges(actions, hints, unsafeActions); + GetUnsafeColumnRemovals(actions, hints, unsafeActions); + GetUnsafeTableRemovals(actions, hints, unsafeActions); + GetCrossHierarchicalMovements(actions, hints, unsafeActions); + + return unsafeActions; + } + + private static void GetUnsafeColumnTypeChanges( + IEnumerable actions, IEnumerable hints, ICollection output) + { + var columnsWithHints = hints.OfType().SelectMany(hint => hint.AffectedColumns); + + // The following code will not work because HintGenerator generates node paths + // inconsistent with RemoveFieldHint: + + // GetUnsafeColumnActions(actions, columnsWithHints, IsUnsafeTypeChangeAction, output); + + var safeColumns = new HashSet(columnsWithHints, Comparer); + + var unsafeActions = actions + .Where(IsUnsafeTypeChangeAction) + .Where(action => !safeColumns.Contains(action.Path)); + + foreach (var action in unsafeActions) + output.Add(action); + } + + private static void GetUnsafeColumnRemovals( + IEnumerable actions, IEnumerable hints, ICollection output) + { + var columnsWithHints = hints.OfType().SelectMany(hint => hint.AffectedColumns); + GetUnsafeColumnActions(actions, columnsWithHints, a => IsColumnAction(a) && a is RemoveNodeAction, output); + } + + private static void GetUnsafeColumnActions( + IEnumerable actions, IEnumerable columnsWithHints, + Func unsafeActionFilter, ICollection output) + { + var safeColumns = new HashSet(columnsWithHints, Comparer); + var tableMapping = new Dictionary(Comparer); + var reverseTableMapping = new Dictionary(Comparer); + + foreach (var action in actions) { + if (IsTableAction(action)) { + var moveAction = action as MoveNodeAction; + if (moveAction==null) + continue; + string originalPath; + if (reverseTableMapping.TryGetValue(moveAction.Path, out originalPath)) { + tableMapping.Remove(originalPath); + reverseTableMapping.Remove(moveAction.Path); + tableMapping.Add(originalPath, moveAction.NewPath); + reverseTableMapping.Add(moveAction.NewPath, originalPath); + } + else { + tableMapping.Add(moveAction.Path, moveAction.NewPath); + reverseTableMapping.Add(moveAction.NewPath, moveAction.Path); + } + continue; + } + + if (!unsafeActionFilter.Invoke(action)) + continue; + + var columnPath = action.Path; + + // Adjust column path if table was renamed + + var pathItems = columnPath.Split('/'); + if (pathItems.Length!=4) { + // Should not happen, but need to know if this happens + output.Add(action); + continue; + } + + var tablePath = string.Format("Tables/{0}", pathItems[1]); + var columnName = pathItems[3]; + + string originalTablePath; + + if (reverseTableMapping.TryGetValue(tablePath, out originalTablePath)) + columnPath = string.Format("{0}/Columns/{1}", originalTablePath, columnName); + + if (!safeColumns.Contains(columnPath)) + output.Add(action); + } + } + + private static void GetUnsafeTableRemovals(IEnumerable actions, IEnumerable hints, ICollection output) + { + var safeTableRemovals = hints + .OfType() + .SelectMany(hint => hint.AffectedTables) + .ToHashSet(); + + actions + .OfType() + .Where(IsTableAction) + .Where(a => !safeTableRemovals.Contains(a.Path, Comparer)) + .ForEach(output.Add); + } + + private static void GetCrossHierarchicalMovements(IEnumerable actions, IEnumerable hints, ICollection output) + { + (from action in actions.OfType() + let deleteDataHint = action.DataHint as DeleteDataHint + where deleteDataHint!=null && deleteDataHint.PostCopy + select action).ForEach(output.Add); + } + + private static bool IsTypeChangeAction(PropertyChangeAction action) + { + return action.Properties.ContainsKey("Type") + && action.Difference.Parent.Source is StorageColumnInfo + && action.Difference.Parent.Target is StorageColumnInfo; + } + + private static bool IsUnsafeTypeChangeAction(NodeAction action) + { + var propertyChangeAction = action as PropertyChangeAction; + if (propertyChangeAction==null) + return false; + + if (!IsTypeChangeAction(propertyChangeAction)) + return false; + + return !TypeConversionVerifier.CanConvertSafely( + (StorageTypeInfo) propertyChangeAction.Difference.Source, + (StorageTypeInfo) propertyChangeAction.Difference.Target); + } + + private static bool IsTableAction(NodeAction action) + { + var diff = action.Difference as NodeDifference; + if (diff==null) + return false; + var item = diff.Source ?? diff.Target; + return item is TableInfo; + } + + private static bool IsColumnAction(NodeAction action) + { + var diff = action.Difference as NodeDifference; + if (diff==null) + return false; + var item = diff.Source ?? diff.Target; + return item is StorageColumnInfo; + } + + private static SchemaComparisonStatus GetComparisonStatus(ICollection actions, SchemaUpgradeMode schemaUpgradeMode) + { + var filter = schemaUpgradeMode!=SchemaUpgradeMode.ValidateCompatible + ? (Func) (targetType => true) + : targetType => targetType.In(typeof (TableInfo), typeof (StorageColumnInfo)); + var hasCreateActions = actions + .OfType() + .Select(action => action.Difference.Target.GetType()) + .Any(filter); + var hasRemoveActions = actions + .OfType() + .Select(action => action.Difference.Source.GetType()) + .Any(sourceType => sourceType.In(typeof (TableInfo), typeof (StorageColumnInfo))); + + if (hasCreateActions && hasRemoveActions) + return SchemaComparisonStatus.NotEqual; + if (hasCreateActions) + return SchemaComparisonStatus.TargetIsSuperset; + if (hasRemoveActions) + return SchemaComparisonStatus.TargetIsSubset; + return SchemaComparisonStatus.Equal; + } + } +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaExtractor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaExtractor.cs index 02e208fa83..f819d115ab 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaExtractor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaExtractor.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.16 - -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class SchemaExtractor - { - private readonly UpgradeContext context; - private readonly UpgradeServiceAccessor services; - private readonly ISqlExecutor executor; - - public StorageModel GetSchema() - { - if (context.ExtractedModelCache!=null) - return context.ExtractedModelCache; - - var converter = new SqlModelConverter(services, GetSqlSchema(), GetPartialIndexes()); - var result = converter.Run(); - context.ExtractedModelCache = result; - return result; - } - - public SchemaExtractionResult GetSqlSchema() - { - if (context.ExtractedSqlModelCache!=null) - return context.ExtractedSqlModelCache; - - var schema = new SchemaExtractionResult(executor.Extract(services.MappingResolver.GetSchemaTasks())); - var handledSchema = new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle(); - context.ExtractedSqlModelCache = handledSchema; - return handledSchema; - } - - public void ClearCache() - { - context.ExtractedModelCache = null; - context.ExtractedSqlModelCache = null; - } - - private IEnumerable GetPartialIndexes() - { - if (!services.ProviderInfo.Supports(ProviderFeatures.PartialIndexes)) - return Enumerable.Empty(); - var metadata = context.Metadata; - if (metadata==null) - return Enumerable.Empty(); - var extensions = metadata.Extensions.Where(e => e.Name==WellKnown.PartialIndexDefinitionsExtensionName); - var result = new List(); - foreach (var extension in extensions) { - var items = StoredPartialIndexFilterInfoCollection.Deserialize(extension.Value).Items; - if (items!=null) - result.AddRange(items); - } - return result; - } - - // Constructors - - public SchemaExtractor(UpgradeContext context, Session session) - { - this.context = context; - - services = context.Services; - executor = session.Services.Demand(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.16 + +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class SchemaExtractor + { + private readonly UpgradeContext context; + private readonly UpgradeServiceAccessor services; + private readonly ISqlExecutor executor; + + public StorageModel GetSchema() + { + if (context.ExtractedModelCache!=null) + return context.ExtractedModelCache; + + var converter = new SqlModelConverter(services, GetSqlSchema(), GetPartialIndexes()); + var result = converter.Run(); + context.ExtractedModelCache = result; + return result; + } + + public SchemaExtractionResult GetSqlSchema() + { + if (context.ExtractedSqlModelCache!=null) + return context.ExtractedSqlModelCache; + + var schema = new SchemaExtractionResult(executor.Extract(services.MappingResolver.GetSchemaTasks())); + var handledSchema = new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle(); + context.ExtractedSqlModelCache = handledSchema; + return handledSchema; + } + + public void ClearCache() + { + context.ExtractedModelCache = null; + context.ExtractedSqlModelCache = null; + } + + private IEnumerable GetPartialIndexes() + { + if (!services.ProviderInfo.Supports(ProviderFeatures.PartialIndexes)) + return Enumerable.Empty(); + var metadata = context.Metadata; + if (metadata==null) + return Enumerable.Empty(); + var extensions = metadata.Extensions.Where(e => e.Name==WellKnown.PartialIndexDefinitionsExtensionName); + var result = new List(); + foreach (var extension in extensions) { + var items = StoredPartialIndexFilterInfoCollection.Deserialize(extension.Value).Items; + if (items!=null) + result.AddRange(items); + } + return result; + } + + // Constructors + + public SchemaExtractor(UpgradeContext context, Session session) + { + this.context = context; + + services = context.Services; + executor = session.Services.Demand(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaUpgrader.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaUpgrader.cs index ad9b2ce4ff..cbbad441d7 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaUpgrader.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SchemaUpgrader.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.06 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Logging; -using Xtensive.Modelling.Actions; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Upgrades storage schema. - /// - internal sealed class SchemaUpgrader - { - private readonly UpgradeContext context; - private readonly Session session; - private readonly UpgradeServiceAccessor services; - private readonly ISqlExecutor executor; - private readonly Action> statementProcessor; - private readonly StorageDriver driver; - private readonly SqlConnection connection; - - public void UpgradeSchema(SchemaExtractionResult extractedSchema, - StorageModel sourceModel, StorageModel targetModel, ActionSequence upgradeActions) - { - var enforceChangedColumns = context.Hints - .OfType() - .SelectMany(hint => hint.AffectedColumns) - .ToList(); - - var skipConstraints = context.Stage==UpgradeStage.Upgrading; - - var translator = new SqlActionTranslator( - session.Handlers, executor, context.Services.MappingResolver, - upgradeActions, extractedSchema, sourceModel, targetModel, - enforceChangedColumns, !skipConstraints); - - var result = translator.Translate(); - - if (SqlLog.IsLogged(LogLevel.Info)) - LogStatements(result); - - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnBeforeExecuteActions(result); - - result.ProcessWith(statementProcessor, ExecuteNonTransactionally); - } - - #region Private / internal methods - - private void ExecuteNonTransactionally(IEnumerable batch) - { - driver.CommitTransaction(null, connection); - executor.ExecuteMany(batch); - driver.BeginTransaction(null, connection, null); - } - - private void ExecuteTransactionally(IEnumerable batch) - { - executor.ExecuteMany(batch); - } - - private void LogStatements(IEnumerable statements) - { - SqlLog.Info( - Strings.LogSessionXSchemaUpgradeScriptY, - session.ToStringSafely(), - driver.BuildBatch(statements.ToArray()).Trim()); - } - - #endregion - - // Constructors - - public SchemaUpgrader(UpgradeContext context, Session session) - { - this.context = context; - this.session = session; - - services = context.Services; - connection = context.Services.Connection; - executor = session.Services.Demand(); - - driver = services.StorageDriver; - if (driver.ProviderInfo.Supports(ProviderFeatures.TransactionalDdl)) - statementProcessor = ExecuteTransactionally; - else - statementProcessor = ExecuteNonTransactionally; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.06 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Logging; +using Xtensive.Modelling.Actions; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Upgrades storage schema. + /// + internal sealed class SchemaUpgrader + { + private readonly UpgradeContext context; + private readonly Session session; + private readonly UpgradeServiceAccessor services; + private readonly ISqlExecutor executor; + private readonly Action> statementProcessor; + private readonly StorageDriver driver; + private readonly SqlConnection connection; + + public void UpgradeSchema(SchemaExtractionResult extractedSchema, + StorageModel sourceModel, StorageModel targetModel, ActionSequence upgradeActions) + { + var enforceChangedColumns = context.Hints + .OfType() + .SelectMany(hint => hint.AffectedColumns) + .ToList(); + + var skipConstraints = context.Stage==UpgradeStage.Upgrading; + + var translator = new SqlActionTranslator( + session.Handlers, executor, context.Services.MappingResolver, + upgradeActions, extractedSchema, sourceModel, targetModel, + enforceChangedColumns, !skipConstraints); + + var result = translator.Translate(); + + if (SqlLog.IsLogged(LogLevel.Info)) + LogStatements(result); + + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnBeforeExecuteActions(result); + + result.ProcessWith(statementProcessor, ExecuteNonTransactionally); + } + + #region Private / internal methods + + private void ExecuteNonTransactionally(IEnumerable batch) + { + driver.CommitTransaction(null, connection); + executor.ExecuteMany(batch); + driver.BeginTransaction(null, connection, null); + } + + private void ExecuteTransactionally(IEnumerable batch) + { + executor.ExecuteMany(batch); + } + + private void LogStatements(IEnumerable statements) + { + SqlLog.Info( + Strings.LogSessionXSchemaUpgradeScriptY, + session.ToStringSafely(), + driver.BuildBatch(statements.ToArray()).Trim()); + } + + #endregion + + // Constructors + + public SchemaUpgrader(UpgradeContext context, Session session) + { + this.context = context; + this.session = session; + + services = context.Services; + connection = context.Services.Connection; + executor = session.Services.Demand(); + + driver = services.StorageDriver; + if (driver.ProviderInfo.Supports(ProviderFeatures.TransactionalDdl)) + statementProcessor = ExecuteTransactionally; + else + statementProcessor = ExecuteNonTransactionally; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlActionTranslator.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlActionTranslator.cs index 23213cb9bd..b698de45cf 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlActionTranslator.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlActionTranslator.cs @@ -1,1249 +1,1249 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.24 - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Reflection; -using Xtensive.Sorting; -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Sql; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; -using Xtensive.Orm.Upgrade.Model; -using ReferentialAction = Xtensive.Sql.ReferentialAction; -using TableInfo = Xtensive.Orm.Upgrade.Model.TableInfo; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Translates upgrade s to SQL. - /// - internal sealed class SqlActionTranslator - { - private const string SubqueryAliasName = "th"; - private const string TemporaryNameFormat = "Temp{0}"; - private const string SubqueryTableAliasNameFormat = "a{0}"; - private const string ColumnTypePropertyName = "Type"; - private const string ColumnDefaultPropertyName = "Default"; - - private static readonly StringComparer StringComparer = StringComparer.OrdinalIgnoreCase; - - private readonly ProviderInfo providerInfo; - private readonly string typeIdColumnName; - private readonly List enforceChangedColumns = new List(); - private readonly ISqlExecutor sqlExecutor; - private readonly bool allowCreateConstraints; - - private readonly string collationName; - private readonly ActionSequence actions; - private readonly SchemaExtractionResult sqlModel; - private readonly StorageModel sourceModel; - private readonly StorageModel targetModel; - private readonly StorageDriver driver; - private readonly SequenceQueryBuilder sequenceQueryBuilder; - private readonly MappingResolver resolver; - - private readonly List
createdTables = new List
(); - private readonly List createdSequences = new List(); - private readonly List clearDataActions = new List(); - private readonly HashSet recreatedColumns = new HashSet(); - - - private UpgradeActionSequenceBuilder currentOutput; - - private bool translated; - - /// - /// Translates all registered actions. - /// - public UpgradeActionSequence Translate() - { - if (translated) - throw new InvalidOperationException(Strings.ExCommandsAreAlreadyTranslated); - - translated = true; - currentOutput = new UpgradeActionSequenceBuilder(driver, new UpgradeActionSequence(), SqlUpgradeStage.PreCleanupData); - - // Turn off deferred contraints - if (providerInfo.Supports(ProviderFeatures.DeferrableConstraints)) - currentOutput.RegisterCommand(SqlDdl.Command(SqlCommandType.SetConstraintsAllImmediate)); - - // Data cleanup - ProcessActions(Modelling.Comparison.UpgradeStage.CleanupData, SqlUpgradeStage.CleanupData); - ProcessClearDataActions(false); - - // Prepairing (aka запаривание :-) - ProcessActions(Modelling.Comparison.UpgradeStage.Prepare, SqlUpgradeStage.PreUpgrade); - - // Mutual renaming - ProcessActions(Modelling.Comparison.UpgradeStage.TemporaryRename, SqlUpgradeStage.PreUpgrade); - - // Upgrading - ProcessActions(Modelling.Comparison.UpgradeStage.Upgrade, SqlUpgradeStage.Upgrade); - - // Copying data - ProcessActions(Modelling.Comparison.UpgradeStage.CopyData, SqlUpgradeStage.CopyData); - - // Post copying data - ProcessActions(Modelling.Comparison.UpgradeStage.PostCopyData, SqlUpgradeStage.PostCopyData); - ProcessClearDataActions(true); - - // Cleanup - ProcessActions(Modelling.Comparison.UpgradeStage.Cleanup, SqlUpgradeStage.Cleanup); - - // Turn on deferred contraints - if (providerInfo.Supports(ProviderFeatures.DeferrableConstraints)) - currentOutput.RegisterCommand(SqlDdl.Command(SqlCommandType.SetConstraintsAllDeferred)); - - return currentOutput.Result; - } - - private void VisitAction(NodeAction action) - { - if (action is GroupingNodeAction) - foreach (var nodeAction in ((GroupingNodeAction) action).Actions) - VisitAction(nodeAction); - else if (action is CreateNodeAction) - VisitCreateAction(action as CreateNodeAction); - else if (action is RemoveNodeAction) - VisitRemoveAction(action as RemoveNodeAction); - else if (action is DataAction) - VisitDataAction(action as DataAction); - else - VisitAlterAction(action); - } - - private void VisitCreateAction(CreateNodeAction action) - { - if (action.Type == typeof(TableInfo)) - VisitCreateTableAction(action); - else if (action.Type == typeof(StorageColumnInfo)) - VisitCreateColumnAction(action); - else if (action.Type == typeof(PrimaryIndexInfo)) - VisitCreatePrimaryKeyAction(action); - else if (action.Type == typeof(SecondaryIndexInfo)) - VisitCreateSecondaryIndexAction(action); - else if (action.Type == typeof(ForeignKeyInfo)) - VisitCreateForeignKeyAction(action); - else if (action.Type == typeof(StorageSequenceInfo)) - VisitCreateSequenceAction(action); - else if (action.Type == typeof(StorageFullTextIndexInfo)) - VisitCreateFullTextIndexAction(action); - } - - private void VisitRemoveAction(RemoveNodeAction action) - { - var node = action.Difference.Source; - if (node.GetType() == typeof(TableInfo)) - VisitRemoveTableAction(action); - else if (node.GetType() == typeof(StorageColumnInfo)) - VisitRemoveColumnAction(action); - else if (node.GetType() == typeof(PrimaryIndexInfo)) - VisitRemovePrimaryKeyAction(action); - else if (node.GetType() == typeof(SecondaryIndexInfo)) - VisitRemoveSecondaryIndexAction(action); - else if (node.GetType() == typeof(ForeignKeyInfo)) - VisitRemoveForeignKeyAction(action); - else if (node.GetType() == typeof(StorageSequenceInfo)) - VisitRemoveSequenceAction(action); - else if (node.GetType() == typeof(StorageFullTextIndexInfo)) - VisitRemoveFullTextIndexAction(action); - } - - private void VisitAlterAction(NodeAction action) - { - var propertyChangeAction = action as PropertyChangeAction; - if (propertyChangeAction != null) { - var changedNode = targetModel.Resolve(propertyChangeAction.Path, true); - if (changedNode.GetType()==typeof (StorageSequenceInfo)) - VisitAlterSequenceAction(propertyChangeAction); - else if (changedNode.GetType()==typeof (StorageColumnInfo)) - VisitAlterColumnAction(propertyChangeAction); - return; - } - - var moveNodeAction = action as MoveNodeAction; - if (moveNodeAction==null) - return; - var node = moveNodeAction.Difference.Source; - if (node.GetType()==typeof (TableInfo)) - VisitAlterTableAction(moveNodeAction); - else if (node.GetType()==typeof (StorageColumnInfo)) - VisitMoveColumnAction(moveNodeAction); - else if (node.GetType()==typeof (PrimaryIndexInfo)) - VisitAlterPrimaryKeyAction(moveNodeAction); - else if (node.GetType()==typeof (SecondaryIndexInfo)) - VisitAlterSecondaryIndexAction(moveNodeAction); - else if (node.GetType()==typeof (ForeignKeyInfo)) - VisitAlterForeignKeyAction(moveNodeAction); - } - - private void VisitDataAction(DataAction dataAction) - { - var hint = dataAction.DataHint; - var copyDataHint = hint as CopyDataHint; - if (copyDataHint != null) { - VisitCopyDataAction(dataAction); - return; - } - var deleteDataHint = hint as DeleteDataHint; - if (deleteDataHint != null) { - VisitDeleteDataAction(dataAction); - return; - } - var updateDataHint = hint as UpdateDataHint; - if (updateDataHint != null) { - VisitUpdateDataAction(dataAction); - return; - } - } - - /// Can not create copy command - /// with specific hint parameters. - private void VisitCopyDataAction(DataAction action) - { - var hint = (CopyDataHint) action.DataHint; - var copiedColumns = hint.CopiedColumns - .Select(pair => new Pair( - sourceModel.Resolve(pair.First, true) as StorageColumnInfo, - targetModel.Resolve(pair.Second, true) as StorageColumnInfo)).ToArray(); - var identityColumns = hint.Identities - .Select(pair => new Pair( - sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, - targetModel.Resolve(pair.Target, true) as StorageColumnInfo)).ToArray(); - if (copiedColumns.Length == 0 || identityColumns.Length == 0) - throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); - - var fromTable = FindTable(copiedColumns[0].First.Parent); - var toTable = FindTable(copiedColumns[0].Second.Parent); - var toTableRef = SqlDml.TableRef(toTable); - var update = SqlDml.Update(toTableRef); - - if (fromTable == toTable) { - copiedColumns.ForEach(pair => update.Values[toTableRef[pair.Second.Name]] = toTableRef[pair.First.Name]); - currentOutput.RegisterCommand(update); - return; - } - - if (providerInfo.Supports(ProviderFeatures.UpdateFrom)) { - var fromTableRef = SqlDml.TableRef(fromTable); - var select = SqlDml.Select(fromTableRef); - identityColumns.ForEach(pair => select.Columns.Add(fromTableRef[pair.First.Name])); - copiedColumns.ForEach(pair => select.Columns.Add(fromTableRef[pair.First.Name])); - var selectRef = SqlDml.QueryRef(select, SubqueryAliasName); - update.From = selectRef; - copiedColumns.ForEach(pair => update.Values[toTableRef[pair.Second.Name]] = selectRef[pair.First.Name]); - identityColumns.ForEach(pair => update.Where &= toTableRef[pair.Second.Name]==selectRef[pair.First.Name]); - } - else { - foreach (var columnPair in copiedColumns) { - var fromTableRef = SqlDml.TableRef(fromTable); - var select = SqlDml.Select(fromTableRef); - foreach (var identityColumnPair in identityColumns) - select.Where &= toTableRef[identityColumnPair.Second.Name]==fromTableRef[identityColumnPair.First.Name]; - select.Columns.Add(fromTableRef[columnPair.First.Name]); - update.Values[toTableRef[columnPair.Second.Name]] = select; - update.Where = SqlDml.Exists(select); - } - } - currentOutput.RegisterCommand(update); - } - - private void VisitDeleteDataAction(DataAction action) - { - clearDataActions.Add(action); - } - - private void VisitUpdateDataAction(DataAction action) - { - clearDataActions.Add(action); - } - - private void VisitCreateTableAction(CreateNodeAction action) - { - var tableInfo = action.Difference.Target as TableInfo; - var table = CreateTable(tableInfo); - currentOutput.RegisterCommand(SqlDdl.Create(table)); - } - - private void VisitRemoveTableAction(RemoveNodeAction action) - { - var tableInfo = (TableInfo) action.Difference.Source; - var table = FindTable(tableInfo); - string lockedTable; - sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(table), out lockedTable); - if (!lockedTable.IsNullOrEmpty()) - throw new SchemaSynchronizationException(lockedTable); - currentOutput.RegisterCommand(SqlDdl.Drop(table)); - table.Schema.Tables.Remove(table); - } - - private void VisitAlterTableAction(MoveNodeAction action) - { - var oldTableInfo = (TableInfo) sourceModel.Resolve(action.Path, true); - var oldTable = FindTable(oldTableInfo); - - var newTableNode = resolver.Resolve(sqlModel, action.Name); - var canRename = - providerInfo.Supports(ProviderFeatures.TableRename) - && newTableNode.Schema==oldTable.Schema; - - if (canRename) - currentOutput.RegisterCommand(SqlDdl.Rename(oldTable, newTableNode.Name)); - else - RecreateTableWithNewName(oldTable, newTableNode.Schema, newTableNode.Name); - - oldTableInfo.Name = action.Name; - - RenameSchemaTable(oldTable, oldTable.Schema, newTableNode.Schema, newTableNode.Name); - } - - private void RecreateTableWithNewName(Table oldTable, Schema newSchema, string newName) - { - string lockedTable; - sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(oldTable), out lockedTable); - if (!lockedTable.IsNullOrEmpty()) - throw new SchemaSynchronizationException(lockedTable); - var newTable = newSchema.CreateTable(newName); - // Clone table definition - foreach (var oldColumn in oldTable.TableColumns) { - var newColumn = newTable.CreateColumn(oldColumn.Name, oldColumn.DataType); - newColumn.DbName = oldColumn.DbName; - newColumn.IsNullable = oldColumn.IsNullable; - if (oldColumn.DefaultValue!=null && (oldColumn.DefaultValue is SqlLiteral || oldColumn.DefaultValue is SqlLiteral)) { - var stringLiteral = oldColumn.DefaultValue as SqlLiteral; - if (stringLiteral!=null) - newColumn.DefaultValue = SqlDml.Literal(TryUnquoteLiteral(stringLiteral.GetValue().ToString())); - - var charLiteral = oldColumn.DefaultValue as SqlLiteral; - if (charLiteral!=null) { - var unquotedLiteral = TryUnquoteLiteral(charLiteral.GetValue().ToString()); - newColumn.DefaultValue = SqlDml.Literal(string.IsNullOrEmpty(unquotedLiteral) ? '\0' : Convert.ToChar(unquotedLiteral, CultureInfo.InvariantCulture)); - } - } - else { - newColumn.DefaultValue = oldColumn.DefaultValue; - } - recreatedColumns.Add(oldColumn); - } - - // Clone primary key - var oldPrimaryKey = oldTable.TableConstraints.OfType().FirstOrDefault(); - if (oldPrimaryKey!=null) { - var newPrimaryKey = newTable.CreatePrimaryKey(oldPrimaryKey.Name); - newPrimaryKey.IsClustered = oldPrimaryKey.IsClustered; - foreach (var oldColumn in oldPrimaryKey.Columns) - newPrimaryKey.Columns.Add(newTable.TableColumns[oldColumn.Name]); - } - - // Skip cloning FKs: - // Only SQLite can not add FK via separate statement and FKs are disabled for it - // So there is not reason to clone FKs here - - currentOutput.RegisterCommand(SqlDdl.Create(newTable)); - - // Copying data from one table to another - var oldTableRef = SqlDml.TableRef(oldTable); - var select = SqlDml.Select(oldTableRef); - - foreach (var item in oldTable.Columns) - select.Columns.Add(oldTableRef[item.Name]); - - var insert = SqlDml.Insert(SqlDml.TableRef(newTable)); - insert.From = select; - currentOutput.RegisterCommand(insert); - - // Removing table - currentOutput.RegisterCommand(SqlDdl.Drop(oldTable)); - - newTable.Schema.Tables.Remove(newTable); - } - - private void VisitCreateColumnAction(CreateNodeAction createColumnAction) - { - var columnInfo = (StorageColumnInfo) createColumnAction.Difference.Target; - var table = FindTable(columnInfo.Parent); - - // Ensure table is not newly created - if (createdTables.Contains(table)) - return; - - var column = CreateColumn(columnInfo, table); - if (columnInfo.DefaultValue != null) - column.DefaultValue = SqlDml.Literal(columnInfo.DefaultValue); - if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) - column.DefaultValue = SqlDml.Native(columnInfo.DefaultSqlExpression); - currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddColumn(column))); - } - - private void VisitRemoveColumnAction(RemoveNodeAction removeColumnAction) - { - var columnInfo = (StorageColumnInfo) removeColumnAction.Difference.Source; - - // Ensure table is not removed - var table = FindTable(columnInfo.Parent); - if (table==null) - return; - - var column = FindColumn(table, columnInfo.Name); - if (column==null) - return; - - DropColumn(column, currentOutput); - } - - private void DropColumn(TableColumn column, UpgradeActionSequenceBuilder commandOutput) - { - DropDefaultConstraint(column, commandOutput); - - var table = column.Table; - - if (providerInfo.Supports(ProviderFeatures.ColumnDrop)) { - commandOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropColumn(column))); - table.TableColumns.Remove(column); - return; - } - - // Save original and temporary names - var name = table.Name; - var tempName = GetTemporaryName(table); - - // Recreate table without dropped column - table.TableColumns.Remove(column); - RecreateTableWithNewName(table, table.Schema, tempName); - RenameSchemaTable(table, table.Schema, table.Schema, tempName); - - // Rename table back to original name - if (providerInfo.Supports(ProviderFeatures.TableRename)) - currentOutput.RegisterCommand(SqlDdl.Rename(table, name)); - else - RecreateTableWithNewName(table, table.Schema, name); - RenameSchemaTable(table, table.Schema, table.Schema, name); - } - - private void DropDefaultConstraint(TableColumn column, UpgradeActionSequenceBuilder commandOutput) - { - if (column.DefaultValue.IsNullReference()) - return; - var table = column.Table; - var constraint = table.TableConstraints.OfType().FirstOrDefault(c => c.Column==column); - if (constraint==null) - return; - if (recreatedColumns.Contains(column)) - constraint.NameIsStale = true; - commandOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(constraint))); - } - - private void VisitAlterColumnAction(PropertyChangeAction action) - { - var isNewlyCreatedColumn = action.Difference.Source==null; - if (isNewlyCreatedColumn) - return; // Properties already initilized - - if (!action.Properties.ContainsKey(ColumnTypePropertyName)) - if (!action.Properties.ContainsKey(ColumnDefaultPropertyName)) - return; - - ChangeColumnType(action); - } - - private void VisitMoveColumnAction(MoveNodeAction action) - { - var movementInfo = ((NodeDifference) action.Difference).MovementInfo; - if ((movementInfo & MovementInfo.NameChanged)!=0) { - // Process name changing - var oldColumnInfo = (StorageColumnInfo) sourceModel.Resolve(action.Path, true); - var column = FindColumn(oldColumnInfo.Parent, oldColumnInfo.Name); - RenameColumn(column, action.Name); - oldColumnInfo.Name = action.Name; - } - else - throw new NotSupportedException(); - } - - private void RenameColumn(TableColumn column, string name) - { - var upgradeOutput = currentOutput.ForStage(SqlUpgradeStage.Upgrade); - - if (providerInfo.Supports(ProviderFeatures.ColumnRename)) { - upgradeOutput.RegisterCommand(SqlDdl.Rename(column, name)); - RenameSchemaColumn(column, name); - return; - } - - var table = column.Table; - var originalName = column.Name; - - // Create new column - var newColumn = table.CreateColumn(name, column.DataType); - newColumn.IsNullable = column.IsNullable; - newColumn.DefaultValue = column.DefaultValue; - var addColumnWithNewType = SqlDdl.Alter(column.Table, SqlDdl.AddColumn(newColumn)); - upgradeOutput.RegisterCommand(addColumnWithNewType); - - // Copy data - var tableRef = SqlDml.TableRef(column.Table); - var update = SqlDml.Update(tableRef); - update.Values[tableRef[name]] = tableRef[originalName]; - upgradeOutput.RegisterCommand(update); - - // Drop old column - DropColumn(column, upgradeOutput); - } - - private void VisitCreatePrimaryKeyAction(CreateNodeAction action) - { - var primaryIndex = (PrimaryIndexInfo) action.Difference.Target; - var table = FindTable(primaryIndex.Parent); - - // Ensure table is not newly created - if (createdTables.Contains(table)) - return; - - var primaryKey = CreatePrimaryKey(primaryIndex.Parent, table); - currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddConstraint(primaryKey))); - } - - private void VisitRemovePrimaryKeyAction(RemoveNodeAction action) - { - var primaryIndexInfo = (PrimaryIndexInfo) action.Difference.Source; - var table = FindTable(primaryIndexInfo.Parent); - - // Ensure table is not removed - if (table==null) - return; - - var primaryKey = table.TableConstraints[primaryIndexInfo.Name]; - - currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(primaryKey))); - table.TableConstraints.Remove(primaryKey); - } - - private void VisitAlterPrimaryKeyAction(NodeAction action) - { - throw new NotSupportedException(); - } - - private void VisitCreateSecondaryIndexAction(CreateNodeAction action) - { - var secondaryIndexInfo = (SecondaryIndexInfo) action.Difference.Target; - var table = FindTable(secondaryIndexInfo.Parent); - var index = CreateSecondaryIndex(table, secondaryIndexInfo); - if (index.IsUnique && !allowCreateConstraints) - return; - currentOutput.RegisterCommand(SqlDdl.Create(index)); - } - - private void VisitRemoveSecondaryIndexAction(RemoveNodeAction action) - { - var preCleanupDataOutput = currentOutput.ForStage(SqlUpgradeStage.PreCleanupData); - - var secondaryIndexInfo = (SecondaryIndexInfo) action.Difference.Source; - var table = FindTable(secondaryIndexInfo.Parent); - - // Ensure table is not removed - if (table==null) - return; - - var index = table.Indexes[secondaryIndexInfo.Name]; - preCleanupDataOutput.RegisterCommand(SqlDdl.Drop(index)); - table.Indexes.Remove(index); - } - - private void VisitAlterSecondaryIndexAction(NodeAction action) - { - throw new NotSupportedException(); - } - - private void VisitCreateForeignKeyAction(CreateNodeAction action) - { - if (!allowCreateConstraints) - return; - - var foreignKeyInfo = (ForeignKeyInfo) action.Difference.Target; - var table = FindTable(foreignKeyInfo.Parent); - var foreignKey = CreateForeignKey(foreignKeyInfo); - - currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddConstraint(foreignKey))); - } - - private void VisitRemoveForeignKeyAction(RemoveNodeAction action) - { - var preCleanupDataOutput = currentOutput.ForStage(SqlUpgradeStage.PreCleanupData); - - var foreignKeyInfo = (ForeignKeyInfo) action.Difference.Source; - var table = FindTable(foreignKeyInfo.Parent); - - // Ensure table is not removed - if (table==null) - return; - - var foreignKey = table.TableConstraints[foreignKeyInfo.Name]; - preCleanupDataOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(foreignKey))); - table.TableConstraints.Remove(foreignKey); - } - - private void VisitAlterForeignKeyAction(NodeAction action) - { - throw new NotSupportedException(); - } - - private void VisitCreateSequenceAction(CreateNodeAction action) - { - var sequenceInfo = (StorageSequenceInfo) action.Difference.Target; - if (providerInfo.Supports(ProviderFeatures.Sequences)) { - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - var sequence = node.Schema.CreateSequence(node.Name); - var descriptor = new SequenceDescriptor(sequence, sequenceInfo.Seed, sequenceInfo.Increment) { - MinValue = sequenceInfo.Seed - }; - sequence.SequenceDescriptor = descriptor; - currentOutput.RegisterCommand(SqlDdl.Create(sequence)); - createdSequences.Add(sequence); - } - else { - CreateGeneratorTable(sequenceInfo); - } - } - - private void VisitRemoveSequenceAction(RemoveNodeAction action) - { - var sequenceInfo = (StorageSequenceInfo) action.Difference.Source; - if (providerInfo.Supports(ProviderFeatures.Sequences)) { - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - var sequence = node.GetSequence(); - currentOutput.RegisterCommand(SqlDdl.Drop(sequence)); - node.Schema.Sequences.Remove(sequence); - } - else { - DropGeneratorTable(sequenceInfo); - } - } - - private void VisitAlterSequenceAction(PropertyChangeAction action) - { - var sequenceInfo = (StorageSequenceInfo) targetModel.Resolve(action.Path, true); - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - - // Check if sequence is not newly created - if (IsNewlyCreatedSequence(node)) - return; - - var currentValue = GetCurrentSequenceValue(sequenceInfo); - var newStartValue = currentValue + sequenceInfo.Increment; - - if (providerInfo.Supports(ProviderFeatures.Sequences)) { - var exisitingSequence = node.GetSequence(); - var newSequenceDescriptor = new SequenceDescriptor(exisitingSequence, null, sequenceInfo.Increment); - newSequenceDescriptor.LastValue = currentValue; - exisitingSequence.SequenceDescriptor = newSequenceDescriptor; - currentOutput.RegisterCommand(SqlDdl.Alter(exisitingSequence, newSequenceDescriptor)); - } - else { - sequenceInfo.Current = newStartValue; - DropGeneratorTable(sequenceInfo); - CreateGeneratorTable(sequenceInfo); - } - } - - private bool IsNewlyCreatedSequence(MappingResolveResult node) - { - if (providerInfo.Supports(ProviderFeatures.Sequences)) - return createdSequences.Any(s => s.Name==node.Name && s.Schema==node.Schema); - else - return createdTables.Any(t => t.Name==node.Name && t.Schema==node.Schema); - } - - private void VisitCreateFullTextIndexAction(CreateNodeAction action) - { - var fullTextIndexInfo = (StorageFullTextIndexInfo) action.Difference.Target; - var fullTextSupported = providerInfo.Supports(ProviderFeatures.FullText); - if (!fullTextSupported) - return; - var table = FindTable(fullTextIndexInfo.Parent); - var ftIndex = table.CreateFullTextIndex(fullTextIndexInfo.Name); - ftIndex.UnderlyingUniqueIndex = fullTextIndexInfo.Parent.PrimaryIndex.EscapedName; - ftIndex.FullTextCatalog = fullTextIndexInfo.FullTextCatalog; - ftIndex.ChangeTrackingMode = ConvertFullTextChangeTrackingMode(fullTextIndexInfo.ChangeTrackingMode); - - foreach (var column in fullTextIndexInfo.Columns) { - var tableColumn = FindColumn(table, column.Value.Name); - var ftColumn = ftIndex.CreateIndexColumn(tableColumn); - ftColumn.TypeColumn = (!column.TypeColumnName.IsNullOrEmpty() && providerInfo.Supports(ProviderFeatures.FullTextColumnDataTypeSpecification)) - ? FindColumn(table, column.TypeColumnName) - : null; - ftColumn.Languages.Add(new Language(column.Configuration)); - } - - var fullTextOutput = !providerInfo.Supports(ProviderFeatures.TransactionalFullTextDdl) - ? currentOutput.ForStage(SqlUpgradeStage.NonTransactionalEpilog) - : currentOutput; - fullTextOutput.RegisterCommand(SqlDdl.Create(ftIndex)); - } - - private void VisitRemoveFullTextIndexAction(RemoveNodeAction action) - { - var fullTextIndexInfo = (StorageFullTextIndexInfo) action.Difference.Source; - var fullTextSupported = providerInfo.Supports(ProviderFeatures.FullText); - if (!fullTextSupported) - return; - var table = FindTable(fullTextIndexInfo.Parent); - var ftIndex = table.Indexes[fullTextIndexInfo.Name] ?? table.Indexes.OfType().Single(); - var fullTextOutput = !providerInfo.Supports(ProviderFeatures.TransactionalFullTextDdl) - ? currentOutput.ForStage(SqlUpgradeStage.NonTransactionalProlog) - : currentOutput; - fullTextOutput.RegisterCommand(SqlDdl.Drop(ftIndex)); - table.Indexes.Remove(ftIndex); - } - - private void ProcessClearDataActions(bool postCopy) - { - var updateActions = ( - from action in clearDataActions - let updateDataHint = action.DataHint as UpdateDataHint - where updateDataHint!=null - select action - ).ToList(); - var deleteActions = ( - from action in clearDataActions - let deleteDataHint = action.DataHint as DeleteDataHint - where deleteDataHint!=null && deleteDataHint.PostCopy==postCopy - select action - ).ToList(); - - var deleteFromConnectorTableActions = new List(); - var deleteFromAncestorTableActions = new List(); - foreach (var deleteAction in deleteActions) { - var hint = deleteAction.DataHint as DeleteDataHint; - if (hint.Identities.Any(pair => !pair.IsIdentifiedByConstant)) - deleteFromConnectorTableActions.Add(deleteAction); - else - deleteFromAncestorTableActions.Add(deleteAction); - } - - updateActions.ForEach( - a => ProcessUpdateDataAction(a, postCopy)); - deleteFromConnectorTableActions.ForEach( - a => ProcessDeleteDataAction(a, postCopy)); - ProcessClearAncestorsActions(deleteFromAncestorTableActions, postCopy); - - // Necessary, since this method is called twice on upgrade - clearDataActions.Clear(); - } - - private void ProcessDeleteDataAction(DataAction action, bool postCopy) - { - var deleteOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); - - var hint = (DeleteDataHint) action.DataHint; - var soureTableInfo = (TableInfo) sourceModel.Resolve(hint.SourceTablePath, true); - var table = SqlDml.TableRef(FindTable(soureTableInfo)); - var delete = SqlDml.Delete(table); - - delete.Where = CreateConditionalExpression(hint, table); - - deleteOutput.RegisterCommand(delete); - } - - /// Can not create update command - /// with specific hint parameters. - private void ProcessUpdateDataAction(DataAction action, bool postCopy) - { - var hint = (UpdateDataHint) action.DataHint; - var soureTableInfo = (TableInfo) sourceModel.Resolve(hint.SourceTablePath, true); - var table = SqlDml.TableRef(FindTable(soureTableInfo)); - var update = SqlDml.Update(table); - - var updatedColumns = hint.UpdateParameter - .Select(pair => new Pair( - sourceModel.Resolve(pair.First, true) as StorageColumnInfo, - pair.Second)).ToArray(); - - if (updatedColumns.Length==0) - throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); - - foreach (var pair in updatedColumns) { - var column = pair.First; - var value = pair.Second; - - if (value==null) { - if (providerInfo.Supports(ProviderFeatures.UpdateDefaultValues)) - update.Values[table[column.Name]] = SqlDml.DefaultValue; - else { - if (column.Type.IsNullable) - update.Values[table[column.Name]] = SqlDml.Null; - else - update.Values[table[column.Name]] = GetDefaultValueExpression(column); - } - } - else - update.Values[table[column.Name]] = SqlDml.Literal(value); - } - - update.Where = CreateConditionalExpression(hint, table); - - var updateOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); - - updateOutput.RegisterCommand(update); - } - - private void ProcessClearAncestorsActions(List originalActions, bool postCopy) - { - if (originalActions.Count==0) - return; - - // Merge actions - var deleteActions = new Dictionary>(); - foreach (var action in originalActions) { - var sourceTableInfo = sourceModel.Resolve(action.DataHint.SourceTablePath, true) as TableInfo; - List list; - if (!deleteActions.TryGetValue(sourceTableInfo, out list)) { - list = new List(); - deleteActions.Add(sourceTableInfo, list); - } - list.AddRange(action.DataHint.Identities.Select(pair => pair.Target)); - } - - // Sort actions topologicaly according with foreign keys - var nodes = new List>(); - var foreignKeys = sourceModel.Tables - .SelectMany(table => table.ForeignKeys) - .ToList(); - foreach (var pair in deleteActions) - nodes.Add(new Xtensive.Sorting.Node(pair.Key)); - foreach (var foreignKey in foreignKeys) { - ForeignKeyInfo foreignKeyInfo = foreignKey; - var referencedNode = nodes.FirstOrDefault(node => node.Item==foreignKeyInfo.PrimaryKey.Parent); - var referencingNode = nodes.FirstOrDefault(node => node.Item==foreignKeyInfo.Parent); - if (referencedNode!=null && referencingNode!=null) - new NodeConnection(referencedNode, referencingNode, foreignKey).BindToNodes(); - } - List> edges; - var sortedTables = TopologicalSorter.Sort(nodes, out edges); - sortedTables.Reverse(); - // TODO: Process removed edges - - // Build DML commands - foreach (var table in sortedTables) { - var tableRef = SqlDml.TableRef(FindTable(table)); - var delete = SqlDml.Delete(tableRef); - var typeIds = deleteActions[table]; - foreach (var typeId in typeIds) - delete.Where |= tableRef[typeIdColumnName]==typeId; - - var clearOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); - - clearOutput.RegisterCommand(delete); - } - } - - private void ChangeColumnType(PropertyChangeAction action) - { - var targetColumn = (StorageColumnInfo) targetModel.Resolve(action.Path, true); - var sourceColumn = (StorageColumnInfo) sourceModel.Resolve(action.Path, true); - var column = FindColumn(targetColumn.Parent, targetColumn.Name); - var table = column.Table; - var originalName = column.Name; - - var upgradeOutput = currentOutput.ForStage(SqlUpgradeStage.Upgrade); - var cleanupOutput = currentOutput.ForStage(SqlUpgradeStage.Cleanup); - - // Rename old column - var tempName = GetTemporaryName(column); - if(recreatedColumns.Contains(column)) { - recreatedColumns.Remove(column); - RenameColumn(column, tempName); - recreatedColumns.Add(column); - } - else - RenameColumn(column, tempName); - - // Create new columns - var newTypeInfo = targetColumn.Type; - var newSqlType = (SqlValueType) newTypeInfo.NativeType; - var newColumn = table.CreateColumn(originalName, newSqlType); - - newColumn.IsNullable = newTypeInfo.IsNullable; - if (!newColumn.IsNullable) - newColumn.DefaultValue = GetDefaultValueExpression(targetColumn); - - var addNewColumn = SqlDdl.Alter(table, SqlDdl.AddColumn(newColumn)); - - upgradeOutput.RegisterCommand(addNewColumn); - - // Copy values if possible to convert type - if (TypeConversionVerifier.CanConvert(sourceColumn.Type, newTypeInfo) - || enforceChangedColumns.Contains(sourceColumn.Path, StringComparer)) { - var tableRef = SqlDml.TableRef(table); - var copyValues = SqlDml.Update(tableRef); - if (newTypeInfo.IsNullable) { - if (sourceColumn.Type.Type.StripNullable()==typeof (string) && newSqlType.Length < column.DataType.Length) - copyValues.Values[tableRef[originalName]] = SqlDml.Cast(SqlDml.Substring(tableRef[tempName], 0, newSqlType.Length), newSqlType); - else - copyValues.Values[tableRef[originalName]] = SqlDml.Cast(tableRef[tempName], newSqlType); - } - else { - var getValue = SqlDml.Case(); - getValue.Add(SqlDml.IsNull(tableRef[tempName]), GetDefaultValueExpression(targetColumn)); - - if (newSqlType.Type==SqlType.DateTimeOffset) - getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.DateTimeToDateTimeOffset(tableRef[tempName])); - else if (newSqlType.Type==SqlType.DateTime && providerInfo.Supports(ProviderFeatures.DateTimeOffsetEmulation)) - getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(SqlDml.Extract(SqlDateTimeOffsetPart.DateTime, tableRef[tempName]), newSqlType)); - else - getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(tableRef[tempName], newSqlType)); - - copyValues.Values[tableRef[originalName]] = getValue; - } - upgradeOutput.BreakBatch(); - upgradeOutput.RegisterCommand(copyValues); - } - - // Drop old column - DropColumn(table.TableColumns[tempName], cleanupOutput); - } - - private Table CreateTable(TableInfo tableInfo) - { - var node = resolver.Resolve(sqlModel, tableInfo.Name); - var table = node.Schema.CreateTable(node.Name); - foreach (var columnInfo in tableInfo.Columns) - CreateColumn(columnInfo, table); - if (tableInfo.PrimaryIndex!=null) - CreatePrimaryKey(tableInfo, table); - createdTables.Add(table); - return table; - } - - private TableColumn CreateColumn(StorageColumnInfo columnInfo, Table table) - { - var type = columnInfo.Type.NativeType; - var column = table.CreateColumn(columnInfo.Name, type); - var isPrimaryKeyColumn = - columnInfo.Parent.PrimaryIndex!=null - && columnInfo.Parent.PrimaryIndex.KeyColumns.Any(keyColumn => keyColumn.Value==columnInfo); - - if (!column.IsNullable && column.Name != typeIdColumnName) - if (!isPrimaryKeyColumn) - column.DefaultValue = GetDefaultValueExpression(columnInfo); - else if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) - column.DefaultValue = SqlDml.Native(columnInfo.DefaultSqlExpression); - - column.IsNullable = columnInfo.Type.IsNullable; - - if (columnInfo.Type.Type==typeof (string) && collationName!=null) - column.Collation = table.Schema.Collations[collationName] ?? new Collation(table.Schema, collationName); - - return column; - } - - private ForeignKey CreateForeignKey(ForeignKeyInfo foreignKeyInfo) - { - var referencingTable = FindTable(foreignKeyInfo.Parent); - var foreignKey = referencingTable.CreateForeignKey(foreignKeyInfo.Name); - foreignKey.OnUpdate = ConvertReferentialAction(foreignKeyInfo.OnUpdateAction); - foreignKey.OnDelete = ConvertReferentialAction(foreignKeyInfo.OnRemoveAction); - foreignKey.IsDeferrable = providerInfo.Supports(ProviderFeatures.DeferrableConstraints); - foreignKey.IsInitiallyDeferred = foreignKey.IsDeferrable; - var referencingColumns = foreignKeyInfo.ForeignKeyColumns - .Select(cr => FindColumn(referencingTable, cr.Value.Name)); - foreignKey.Columns.AddRange(referencingColumns); - var referencedTable = FindTable(foreignKeyInfo.PrimaryKey.Parent); - var referencedColumns = foreignKeyInfo.PrimaryKey.KeyColumns - .Select(cr => FindColumn(referencedTable, cr.Value.Name)); - foreignKey.ReferencedTable = referencedTable; - foreignKey.ReferencedColumns.AddRange(referencedColumns); - return foreignKey; - } - - private PrimaryKey CreatePrimaryKey(TableInfo tableInfo, Table table) - { - var columns = tableInfo.PrimaryIndex.KeyColumns.Select(cr => FindColumn(table, cr.Value.Name)).ToArray(); - var primaryKey = table.CreatePrimaryKey(tableInfo.PrimaryIndex.Name, columns); - // For storages that do not support clustered indexes - // PrimaryIndexInfo.IsClustered will be forcibly set to false by DomainModelConverter. - primaryKey.IsClustered = tableInfo.PrimaryIndex.IsClustered; - return primaryKey; - } - - private Index CreateSecondaryIndex(Table table, SecondaryIndexInfo indexInfo) - { - if (indexInfo.KeyColumns.Count == 1) { - var column = FindColumn(table, indexInfo.KeyColumns[0].Value.Name); - if (driver.ServerInfo.DataTypes[column.DataType.Type].Features.Supports(DataTypeFeatures.Spatial)) { - - var spatialIndex = table.CreateSpatialIndex(indexInfo.Name); - spatialIndex.CreateIndexColumn(column); - return spatialIndex; - } - } - - var index = table.CreateIndex(indexInfo.Name); - index.IsUnique = indexInfo.IsUnique; - index.IsClustered = indexInfo.IsClustered; - foreach (var keyColumn in indexInfo.KeyColumns) - index.CreateIndexColumn( - FindColumn(table, keyColumn.Value.Name), - keyColumn.Direction==Direction.Positive); - index.NonkeyColumns.AddRange( - indexInfo.IncludedColumns - .Select(cr => FindColumn(table, cr.Value.Name)).ToArray()); - if (indexInfo.Filter!=null) - index.Where = SqlDml.Native(indexInfo.Filter.Expression); - return index; - } - - private void CreateGeneratorTable(StorageSequenceInfo sequenceInfo) - { - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - var sequenceTable = node.Schema.CreateTable(node.Name); - createdTables.Add(sequenceTable); - var idColumn = sequenceTable.CreateColumn(WellKnown.GeneratorColumnName, - (SqlValueType) sequenceInfo.Type.NativeType); - idColumn.SequenceDescriptor = - new SequenceDescriptor( - idColumn, - sequenceInfo.Current ?? sequenceInfo.Seed, - sequenceInfo.Increment); - sequenceTable.CreatePrimaryKey(string.Format("PK_{0}", sequenceInfo.Name), idColumn); - if (!providerInfo.Supports(ProviderFeatures.InsertDefaultValues)) { - var fakeColumn = sequenceTable.CreateColumn(WellKnown.GeneratorFakeColumnName, driver.MapValueType(typeof(int))); - fakeColumn.IsNullable = true; - } - currentOutput.RegisterCommand(SqlDdl.Create(sequenceTable)); - } - - private void DropGeneratorTable(StorageSequenceInfo sequenceInfo) - { - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - var sequenceTable = node.GetTable(); - string lockedTable; - sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(sequenceTable), out lockedTable); - if (!lockedTable.IsNullOrEmpty()) - throw new SchemaSynchronizationException(lockedTable); - currentOutput.RegisterCommand(SqlDdl.Drop(sequenceTable)); - node.Schema.Tables.Remove(sequenceTable); - } - - private void RenameSchemaTable(Table table, Schema oldSchema, Schema newSchema, string newName) - { - var schema = table.Schema; - - // Renamed table must be removed and added with new name - // for reregistring in dictionary - oldSchema.Tables.Remove(table); - table.Name = newName; - newSchema.Tables.Add(table); - } - - private void RenameSchemaColumn(TableColumn column, string newName) - { - // Renamed column must be removed and added with new name - // for reregistring in dictionary - var table = column.Table; - table.TableColumns.Remove(column); - column.Name = newName; - table.TableColumns.Add(column); - } - - private string GetTemporaryName(Table table) - { - var tempName = string.Format(TemporaryNameFormat, table.Name); - var counter = 0; - while (table.Schema.Tables.Any(t => StringComparer.Compare(t.Name, tempName)==0)) - tempName = string.Format(TemporaryNameFormat, table.Name + ++counter); - return tempName; - } - - private string GetTemporaryName(TableColumn column) - { - var tempName = string.Format(TemporaryNameFormat, column.Name); - var counter = 0; - while (column.Table.Columns.Any(tableColumn => StringComparer.Equals(tableColumn.Name, tempName))) - tempName = string.Format(TemporaryNameFormat, column.Name + ++counter); - return tempName; - } - - private Table FindTable(TableInfo tableInfo) - { - return resolver.Resolve(sqlModel, tableInfo.Name).GetTable(); - } - - private TableColumn FindColumn(Table table, string name) - { - return table.TableColumns[name]; - } - - private TableColumn FindColumn(TableInfo tableInfo, string columnName) - { - return FindTable(tableInfo).TableColumns[columnName]; - } - - private static ReferentialAction ConvertReferentialAction(Model.ReferentialAction toConvert) - { - switch (toConvert) { - case Model.ReferentialAction.None: - return ReferentialAction.NoAction; - case Model.ReferentialAction.Restrict: - return ReferentialAction.Restrict; - case Model.ReferentialAction.Cascade: - return ReferentialAction.Cascade; - case Model.ReferentialAction.Clear: - return ReferentialAction.SetNull; - default: - return ReferentialAction.Restrict; - } - } - - private static ChangeTrackingMode ConvertFullTextChangeTrackingMode(FullTextChangeTrackingMode toConvert) - { - switch (toConvert) { - case FullTextChangeTrackingMode.Auto: - return ChangeTrackingMode.Auto; - case FullTextChangeTrackingMode.Manual: - return ChangeTrackingMode.Manual; - case FullTextChangeTrackingMode.Off: - return ChangeTrackingMode.Off; - case FullTextChangeTrackingMode.OffWithNoPopulation: - return ChangeTrackingMode.OffWithNoPopulation; - default: - return ChangeTrackingMode.Default; - } - } - - /// Can not create expression - /// with specific hint parameters. - private SqlExpression CreateConditionalExpression(DataHint hint, SqlTableRef table) - { - if (hint.Identities.Any(pair => !pair.IsIdentifiedByConstant)) { - var identityColumnPairs = hint.Identities - .Where(pair => !pair.IsIdentifiedByConstant).Select(pair => - new Pair( - sourceModel.Resolve(pair.Target, true) as StorageColumnInfo, - sourceModel.Resolve(pair.Source, true) as StorageColumnInfo)).ToArray(); - var identityConstantPairs = hint.Identities - .Where(pair => pair.IsIdentifiedByConstant).Select(pair => - new Pair( - sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, - pair.Target)).ToArray(); - var selectColumns = identityColumnPairs.Select(columnPair => columnPair.First) - .Concat(identityConstantPairs.Select(constantPair => constantPair.First)).ToArray(); - if (!selectColumns.Any()) - throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); - - var identifiedTable = FindTable(selectColumns[0].Parent); - var identifiedTableRef = SqlDml.TableRef(identifiedTable, - string.Format(SubqueryTableAliasNameFormat, identifiedTable.Name)); - var select = SqlDml.Select(identifiedTableRef); - selectColumns.ForEach(column => select.Columns.Add(identifiedTableRef[column.Name])); - identityColumnPairs.ForEach(pair => - select.Where &= identifiedTableRef[pair.First.Name]==table[pair.Second.Name]); - identityConstantPairs.ForEach(pair => - select.Where &= identifiedTableRef[pair.First.Name]==SqlDml.Literal(pair.Second)); - return SqlDml.Exists(select); - } - else { - var identityConstantPairs = hint.Identities - .Where(pair => pair.IsIdentifiedByConstant).Select(pair => - new Pair( - sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, - pair.Target)).ToArray(); - if (!identityConstantPairs.Any()) - throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); - SqlExpression expression = null; - identityConstantPairs.ForEach(pair => - expression &= table[pair.First.Name]==SqlDml.Literal(pair.Second)); - return expression; - } - } - - private SqlExpression GetDefaultValueExpression(StorageColumnInfo columnInfo) - { - if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) - return SqlDml.Native(columnInfo.DefaultSqlExpression); - if (columnInfo.DefaultValue!=null) - return SqlDml.Literal(columnInfo.DefaultValue); - var type = columnInfo.Type.Type; - return type.IsValueType && !type.IsNullable() ? SqlDml.Literal(Activator.CreateInstance(type)) : null; - } - - private string TryUnquoteLiteral(string stringToUnquote) - { - if (stringToUnquote.StartsWith("N", StringComparison.Ordinal)) { - var unquotedSting = stringToUnquote.Remove(0, 1).Trim(new[] {'\''}).Replace("''", "'"); - return unquotedSting; - } - return stringToUnquote; - } - - private long? GetCurrentSequenceValue(StorageSequenceInfo sequenceInfo) - { - var node = resolver.Resolve(sqlModel, sequenceInfo.Name); - var generatorNode = providerInfo.Supports(ProviderFeatures.Sequences) - ? (SchemaNode) node.GetSequence() - : node.GetTable(); - return sequenceQueryBuilder.BuildNextValueQuery(generatorNode, 0).ExecuteWith(sqlExecutor); - } - - private void ProcessActions(Modelling.Comparison.UpgradeStage modellingStage, SqlUpgradeStage stage) - { - currentOutput = currentOutput.ForStage(stage); - var actionName = modellingStage.ToString(); - var groupingAction = actions - .OfType() - .FirstOrDefault(ga => ga.Comment==actionName); - if (groupingAction!=null) - VisitAction(groupingAction); - } - - // Constructors - - public SqlActionTranslator( - HandlerAccessor handlers, ISqlExecutor sqlExecutor, MappingResolver resolver, - ActionSequence actions, SchemaExtractionResult sqlModel, StorageModel sourceModel, StorageModel targetModel, - List enforceChangedColumns, bool allowCreateConstraints) - { - ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); - ArgumentValidator.EnsureArgumentNotNull(sqlExecutor, "sqlExecutor"); - ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); - ArgumentValidator.EnsureArgumentNotNull(actions, "actions"); - ArgumentValidator.EnsureArgumentNotNull(sqlModel, "sqlModel"); - ArgumentValidator.EnsureArgumentNotNull(sourceModel, "sourceModel"); - ArgumentValidator.EnsureArgumentNotNull(targetModel, "targetModel"); - ArgumentValidator.EnsureArgumentNotNull(enforceChangedColumns, "enforceChangedColumns"); - - driver = handlers.StorageDriver; - providerInfo = handlers.ProviderInfo; - sequenceQueryBuilder = handlers.SequenceQueryBuilder; - providerInfo = handlers.ProviderInfo; - typeIdColumnName = handlers.NameBuilder.TypeIdColumnName; - - this.resolver = resolver; - this.sqlModel = sqlModel; - this.actions = actions; - this.sourceModel = sourceModel; - this.targetModel = targetModel; - this.enforceChangedColumns = enforceChangedColumns; - this.sqlExecutor = sqlExecutor; - this.allowCreateConstraints = allowCreateConstraints; - - if (providerInfo.Supports(ProviderFeatures.Collations)) { - var collation = handlers.Domain.Configuration.Collation; - if (!string.IsNullOrEmpty(collation)) - collationName = collation; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.24 + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Reflection; +using Xtensive.Sorting; +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Sql; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; +using Xtensive.Orm.Upgrade.Model; +using ReferentialAction = Xtensive.Sql.ReferentialAction; +using TableInfo = Xtensive.Orm.Upgrade.Model.TableInfo; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Translates upgrade s to SQL. + /// + internal sealed class SqlActionTranslator + { + private const string SubqueryAliasName = "th"; + private const string TemporaryNameFormat = "Temp{0}"; + private const string SubqueryTableAliasNameFormat = "a{0}"; + private const string ColumnTypePropertyName = "Type"; + private const string ColumnDefaultPropertyName = "Default"; + + private static readonly StringComparer StringComparer = StringComparer.OrdinalIgnoreCase; + + private readonly ProviderInfo providerInfo; + private readonly string typeIdColumnName; + private readonly List enforceChangedColumns = new List(); + private readonly ISqlExecutor sqlExecutor; + private readonly bool allowCreateConstraints; + + private readonly string collationName; + private readonly ActionSequence actions; + private readonly SchemaExtractionResult sqlModel; + private readonly StorageModel sourceModel; + private readonly StorageModel targetModel; + private readonly StorageDriver driver; + private readonly SequenceQueryBuilder sequenceQueryBuilder; + private readonly MappingResolver resolver; + + private readonly List
createdTables = new List
(); + private readonly List createdSequences = new List(); + private readonly List clearDataActions = new List(); + private readonly HashSet recreatedColumns = new HashSet(); + + + private UpgradeActionSequenceBuilder currentOutput; + + private bool translated; + + /// + /// Translates all registered actions. + /// + public UpgradeActionSequence Translate() + { + if (translated) + throw new InvalidOperationException(Strings.ExCommandsAreAlreadyTranslated); + + translated = true; + currentOutput = new UpgradeActionSequenceBuilder(driver, new UpgradeActionSequence(), SqlUpgradeStage.PreCleanupData); + + // Turn off deferred contraints + if (providerInfo.Supports(ProviderFeatures.DeferrableConstraints)) + currentOutput.RegisterCommand(SqlDdl.Command(SqlCommandType.SetConstraintsAllImmediate)); + + // Data cleanup + ProcessActions(Modelling.Comparison.UpgradeStage.CleanupData, SqlUpgradeStage.CleanupData); + ProcessClearDataActions(false); + + // Prepairing (aka запаривание :-) + ProcessActions(Modelling.Comparison.UpgradeStage.Prepare, SqlUpgradeStage.PreUpgrade); + + // Mutual renaming + ProcessActions(Modelling.Comparison.UpgradeStage.TemporaryRename, SqlUpgradeStage.PreUpgrade); + + // Upgrading + ProcessActions(Modelling.Comparison.UpgradeStage.Upgrade, SqlUpgradeStage.Upgrade); + + // Copying data + ProcessActions(Modelling.Comparison.UpgradeStage.CopyData, SqlUpgradeStage.CopyData); + + // Post copying data + ProcessActions(Modelling.Comparison.UpgradeStage.PostCopyData, SqlUpgradeStage.PostCopyData); + ProcessClearDataActions(true); + + // Cleanup + ProcessActions(Modelling.Comparison.UpgradeStage.Cleanup, SqlUpgradeStage.Cleanup); + + // Turn on deferred contraints + if (providerInfo.Supports(ProviderFeatures.DeferrableConstraints)) + currentOutput.RegisterCommand(SqlDdl.Command(SqlCommandType.SetConstraintsAllDeferred)); + + return currentOutput.Result; + } + + private void VisitAction(NodeAction action) + { + if (action is GroupingNodeAction) + foreach (var nodeAction in ((GroupingNodeAction) action).Actions) + VisitAction(nodeAction); + else if (action is CreateNodeAction) + VisitCreateAction(action as CreateNodeAction); + else if (action is RemoveNodeAction) + VisitRemoveAction(action as RemoveNodeAction); + else if (action is DataAction) + VisitDataAction(action as DataAction); + else + VisitAlterAction(action); + } + + private void VisitCreateAction(CreateNodeAction action) + { + if (action.Type == typeof(TableInfo)) + VisitCreateTableAction(action); + else if (action.Type == typeof(StorageColumnInfo)) + VisitCreateColumnAction(action); + else if (action.Type == typeof(PrimaryIndexInfo)) + VisitCreatePrimaryKeyAction(action); + else if (action.Type == typeof(SecondaryIndexInfo)) + VisitCreateSecondaryIndexAction(action); + else if (action.Type == typeof(ForeignKeyInfo)) + VisitCreateForeignKeyAction(action); + else if (action.Type == typeof(StorageSequenceInfo)) + VisitCreateSequenceAction(action); + else if (action.Type == typeof(StorageFullTextIndexInfo)) + VisitCreateFullTextIndexAction(action); + } + + private void VisitRemoveAction(RemoveNodeAction action) + { + var node = action.Difference.Source; + if (node.GetType() == typeof(TableInfo)) + VisitRemoveTableAction(action); + else if (node.GetType() == typeof(StorageColumnInfo)) + VisitRemoveColumnAction(action); + else if (node.GetType() == typeof(PrimaryIndexInfo)) + VisitRemovePrimaryKeyAction(action); + else if (node.GetType() == typeof(SecondaryIndexInfo)) + VisitRemoveSecondaryIndexAction(action); + else if (node.GetType() == typeof(ForeignKeyInfo)) + VisitRemoveForeignKeyAction(action); + else if (node.GetType() == typeof(StorageSequenceInfo)) + VisitRemoveSequenceAction(action); + else if (node.GetType() == typeof(StorageFullTextIndexInfo)) + VisitRemoveFullTextIndexAction(action); + } + + private void VisitAlterAction(NodeAction action) + { + var propertyChangeAction = action as PropertyChangeAction; + if (propertyChangeAction != null) { + var changedNode = targetModel.Resolve(propertyChangeAction.Path, true); + if (changedNode.GetType()==typeof (StorageSequenceInfo)) + VisitAlterSequenceAction(propertyChangeAction); + else if (changedNode.GetType()==typeof (StorageColumnInfo)) + VisitAlterColumnAction(propertyChangeAction); + return; + } + + var moveNodeAction = action as MoveNodeAction; + if (moveNodeAction==null) + return; + var node = moveNodeAction.Difference.Source; + if (node.GetType()==typeof (TableInfo)) + VisitAlterTableAction(moveNodeAction); + else if (node.GetType()==typeof (StorageColumnInfo)) + VisitMoveColumnAction(moveNodeAction); + else if (node.GetType()==typeof (PrimaryIndexInfo)) + VisitAlterPrimaryKeyAction(moveNodeAction); + else if (node.GetType()==typeof (SecondaryIndexInfo)) + VisitAlterSecondaryIndexAction(moveNodeAction); + else if (node.GetType()==typeof (ForeignKeyInfo)) + VisitAlterForeignKeyAction(moveNodeAction); + } + + private void VisitDataAction(DataAction dataAction) + { + var hint = dataAction.DataHint; + var copyDataHint = hint as CopyDataHint; + if (copyDataHint != null) { + VisitCopyDataAction(dataAction); + return; + } + var deleteDataHint = hint as DeleteDataHint; + if (deleteDataHint != null) { + VisitDeleteDataAction(dataAction); + return; + } + var updateDataHint = hint as UpdateDataHint; + if (updateDataHint != null) { + VisitUpdateDataAction(dataAction); + return; + } + } + + /// Can not create copy command + /// with specific hint parameters. + private void VisitCopyDataAction(DataAction action) + { + var hint = (CopyDataHint) action.DataHint; + var copiedColumns = hint.CopiedColumns + .Select(pair => new Pair( + sourceModel.Resolve(pair.First, true) as StorageColumnInfo, + targetModel.Resolve(pair.Second, true) as StorageColumnInfo)).ToArray(); + var identityColumns = hint.Identities + .Select(pair => new Pair( + sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, + targetModel.Resolve(pair.Target, true) as StorageColumnInfo)).ToArray(); + if (copiedColumns.Length == 0 || identityColumns.Length == 0) + throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); + + var fromTable = FindTable(copiedColumns[0].First.Parent); + var toTable = FindTable(copiedColumns[0].Second.Parent); + var toTableRef = SqlDml.TableRef(toTable); + var update = SqlDml.Update(toTableRef); + + if (fromTable == toTable) { + copiedColumns.ForEach(pair => update.Values[toTableRef[pair.Second.Name]] = toTableRef[pair.First.Name]); + currentOutput.RegisterCommand(update); + return; + } + + if (providerInfo.Supports(ProviderFeatures.UpdateFrom)) { + var fromTableRef = SqlDml.TableRef(fromTable); + var select = SqlDml.Select(fromTableRef); + identityColumns.ForEach(pair => select.Columns.Add(fromTableRef[pair.First.Name])); + copiedColumns.ForEach(pair => select.Columns.Add(fromTableRef[pair.First.Name])); + var selectRef = SqlDml.QueryRef(select, SubqueryAliasName); + update.From = selectRef; + copiedColumns.ForEach(pair => update.Values[toTableRef[pair.Second.Name]] = selectRef[pair.First.Name]); + identityColumns.ForEach(pair => update.Where &= toTableRef[pair.Second.Name]==selectRef[pair.First.Name]); + } + else { + foreach (var columnPair in copiedColumns) { + var fromTableRef = SqlDml.TableRef(fromTable); + var select = SqlDml.Select(fromTableRef); + foreach (var identityColumnPair in identityColumns) + select.Where &= toTableRef[identityColumnPair.Second.Name]==fromTableRef[identityColumnPair.First.Name]; + select.Columns.Add(fromTableRef[columnPair.First.Name]); + update.Values[toTableRef[columnPair.Second.Name]] = select; + update.Where = SqlDml.Exists(select); + } + } + currentOutput.RegisterCommand(update); + } + + private void VisitDeleteDataAction(DataAction action) + { + clearDataActions.Add(action); + } + + private void VisitUpdateDataAction(DataAction action) + { + clearDataActions.Add(action); + } + + private void VisitCreateTableAction(CreateNodeAction action) + { + var tableInfo = action.Difference.Target as TableInfo; + var table = CreateTable(tableInfo); + currentOutput.RegisterCommand(SqlDdl.Create(table)); + } + + private void VisitRemoveTableAction(RemoveNodeAction action) + { + var tableInfo = (TableInfo) action.Difference.Source; + var table = FindTable(tableInfo); + string lockedTable; + sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(table), out lockedTable); + if (!lockedTable.IsNullOrEmpty()) + throw new SchemaSynchronizationException(lockedTable); + currentOutput.RegisterCommand(SqlDdl.Drop(table)); + table.Schema.Tables.Remove(table); + } + + private void VisitAlterTableAction(MoveNodeAction action) + { + var oldTableInfo = (TableInfo) sourceModel.Resolve(action.Path, true); + var oldTable = FindTable(oldTableInfo); + + var newTableNode = resolver.Resolve(sqlModel, action.Name); + var canRename = + providerInfo.Supports(ProviderFeatures.TableRename) + && newTableNode.Schema==oldTable.Schema; + + if (canRename) + currentOutput.RegisterCommand(SqlDdl.Rename(oldTable, newTableNode.Name)); + else + RecreateTableWithNewName(oldTable, newTableNode.Schema, newTableNode.Name); + + oldTableInfo.Name = action.Name; + + RenameSchemaTable(oldTable, oldTable.Schema, newTableNode.Schema, newTableNode.Name); + } + + private void RecreateTableWithNewName(Table oldTable, Schema newSchema, string newName) + { + string lockedTable; + sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(oldTable), out lockedTable); + if (!lockedTable.IsNullOrEmpty()) + throw new SchemaSynchronizationException(lockedTable); + var newTable = newSchema.CreateTable(newName); + // Clone table definition + foreach (var oldColumn in oldTable.TableColumns) { + var newColumn = newTable.CreateColumn(oldColumn.Name, oldColumn.DataType); + newColumn.DbName = oldColumn.DbName; + newColumn.IsNullable = oldColumn.IsNullable; + if (oldColumn.DefaultValue!=null && (oldColumn.DefaultValue is SqlLiteral || oldColumn.DefaultValue is SqlLiteral)) { + var stringLiteral = oldColumn.DefaultValue as SqlLiteral; + if (stringLiteral!=null) + newColumn.DefaultValue = SqlDml.Literal(TryUnquoteLiteral(stringLiteral.GetValue().ToString())); + + var charLiteral = oldColumn.DefaultValue as SqlLiteral; + if (charLiteral!=null) { + var unquotedLiteral = TryUnquoteLiteral(charLiteral.GetValue().ToString()); + newColumn.DefaultValue = SqlDml.Literal(string.IsNullOrEmpty(unquotedLiteral) ? '\0' : Convert.ToChar(unquotedLiteral, CultureInfo.InvariantCulture)); + } + } + else { + newColumn.DefaultValue = oldColumn.DefaultValue; + } + recreatedColumns.Add(oldColumn); + } + + // Clone primary key + var oldPrimaryKey = oldTable.TableConstraints.OfType().FirstOrDefault(); + if (oldPrimaryKey!=null) { + var newPrimaryKey = newTable.CreatePrimaryKey(oldPrimaryKey.Name); + newPrimaryKey.IsClustered = oldPrimaryKey.IsClustered; + foreach (var oldColumn in oldPrimaryKey.Columns) + newPrimaryKey.Columns.Add(newTable.TableColumns[oldColumn.Name]); + } + + // Skip cloning FKs: + // Only SQLite can not add FK via separate statement and FKs are disabled for it + // So there is not reason to clone FKs here + + currentOutput.RegisterCommand(SqlDdl.Create(newTable)); + + // Copying data from one table to another + var oldTableRef = SqlDml.TableRef(oldTable); + var select = SqlDml.Select(oldTableRef); + + foreach (var item in oldTable.Columns) + select.Columns.Add(oldTableRef[item.Name]); + + var insert = SqlDml.Insert(SqlDml.TableRef(newTable)); + insert.From = select; + currentOutput.RegisterCommand(insert); + + // Removing table + currentOutput.RegisterCommand(SqlDdl.Drop(oldTable)); + + newTable.Schema.Tables.Remove(newTable); + } + + private void VisitCreateColumnAction(CreateNodeAction createColumnAction) + { + var columnInfo = (StorageColumnInfo) createColumnAction.Difference.Target; + var table = FindTable(columnInfo.Parent); + + // Ensure table is not newly created + if (createdTables.Contains(table)) + return; + + var column = CreateColumn(columnInfo, table); + if (columnInfo.DefaultValue != null) + column.DefaultValue = SqlDml.Literal(columnInfo.DefaultValue); + if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) + column.DefaultValue = SqlDml.Native(columnInfo.DefaultSqlExpression); + currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddColumn(column))); + } + + private void VisitRemoveColumnAction(RemoveNodeAction removeColumnAction) + { + var columnInfo = (StorageColumnInfo) removeColumnAction.Difference.Source; + + // Ensure table is not removed + var table = FindTable(columnInfo.Parent); + if (table==null) + return; + + var column = FindColumn(table, columnInfo.Name); + if (column==null) + return; + + DropColumn(column, currentOutput); + } + + private void DropColumn(TableColumn column, UpgradeActionSequenceBuilder commandOutput) + { + DropDefaultConstraint(column, commandOutput); + + var table = column.Table; + + if (providerInfo.Supports(ProviderFeatures.ColumnDrop)) { + commandOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropColumn(column))); + table.TableColumns.Remove(column); + return; + } + + // Save original and temporary names + var name = table.Name; + var tempName = GetTemporaryName(table); + + // Recreate table without dropped column + table.TableColumns.Remove(column); + RecreateTableWithNewName(table, table.Schema, tempName); + RenameSchemaTable(table, table.Schema, table.Schema, tempName); + + // Rename table back to original name + if (providerInfo.Supports(ProviderFeatures.TableRename)) + currentOutput.RegisterCommand(SqlDdl.Rename(table, name)); + else + RecreateTableWithNewName(table, table.Schema, name); + RenameSchemaTable(table, table.Schema, table.Schema, name); + } + + private void DropDefaultConstraint(TableColumn column, UpgradeActionSequenceBuilder commandOutput) + { + if (column.DefaultValue.IsNullReference()) + return; + var table = column.Table; + var constraint = table.TableConstraints.OfType().FirstOrDefault(c => c.Column==column); + if (constraint==null) + return; + if (recreatedColumns.Contains(column)) + constraint.NameIsStale = true; + commandOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(constraint))); + } + + private void VisitAlterColumnAction(PropertyChangeAction action) + { + var isNewlyCreatedColumn = action.Difference.Source==null; + if (isNewlyCreatedColumn) + return; // Properties already initilized + + if (!action.Properties.ContainsKey(ColumnTypePropertyName)) + if (!action.Properties.ContainsKey(ColumnDefaultPropertyName)) + return; + + ChangeColumnType(action); + } + + private void VisitMoveColumnAction(MoveNodeAction action) + { + var movementInfo = ((NodeDifference) action.Difference).MovementInfo; + if ((movementInfo & MovementInfo.NameChanged)!=0) { + // Process name changing + var oldColumnInfo = (StorageColumnInfo) sourceModel.Resolve(action.Path, true); + var column = FindColumn(oldColumnInfo.Parent, oldColumnInfo.Name); + RenameColumn(column, action.Name); + oldColumnInfo.Name = action.Name; + } + else + throw new NotSupportedException(); + } + + private void RenameColumn(TableColumn column, string name) + { + var upgradeOutput = currentOutput.ForStage(SqlUpgradeStage.Upgrade); + + if (providerInfo.Supports(ProviderFeatures.ColumnRename)) { + upgradeOutput.RegisterCommand(SqlDdl.Rename(column, name)); + RenameSchemaColumn(column, name); + return; + } + + var table = column.Table; + var originalName = column.Name; + + // Create new column + var newColumn = table.CreateColumn(name, column.DataType); + newColumn.IsNullable = column.IsNullable; + newColumn.DefaultValue = column.DefaultValue; + var addColumnWithNewType = SqlDdl.Alter(column.Table, SqlDdl.AddColumn(newColumn)); + upgradeOutput.RegisterCommand(addColumnWithNewType); + + // Copy data + var tableRef = SqlDml.TableRef(column.Table); + var update = SqlDml.Update(tableRef); + update.Values[tableRef[name]] = tableRef[originalName]; + upgradeOutput.RegisterCommand(update); + + // Drop old column + DropColumn(column, upgradeOutput); + } + + private void VisitCreatePrimaryKeyAction(CreateNodeAction action) + { + var primaryIndex = (PrimaryIndexInfo) action.Difference.Target; + var table = FindTable(primaryIndex.Parent); + + // Ensure table is not newly created + if (createdTables.Contains(table)) + return; + + var primaryKey = CreatePrimaryKey(primaryIndex.Parent, table); + currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddConstraint(primaryKey))); + } + + private void VisitRemovePrimaryKeyAction(RemoveNodeAction action) + { + var primaryIndexInfo = (PrimaryIndexInfo) action.Difference.Source; + var table = FindTable(primaryIndexInfo.Parent); + + // Ensure table is not removed + if (table==null) + return; + + var primaryKey = table.TableConstraints[primaryIndexInfo.Name]; + + currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(primaryKey))); + table.TableConstraints.Remove(primaryKey); + } + + private void VisitAlterPrimaryKeyAction(NodeAction action) + { + throw new NotSupportedException(); + } + + private void VisitCreateSecondaryIndexAction(CreateNodeAction action) + { + var secondaryIndexInfo = (SecondaryIndexInfo) action.Difference.Target; + var table = FindTable(secondaryIndexInfo.Parent); + var index = CreateSecondaryIndex(table, secondaryIndexInfo); + if (index.IsUnique && !allowCreateConstraints) + return; + currentOutput.RegisterCommand(SqlDdl.Create(index)); + } + + private void VisitRemoveSecondaryIndexAction(RemoveNodeAction action) + { + var preCleanupDataOutput = currentOutput.ForStage(SqlUpgradeStage.PreCleanupData); + + var secondaryIndexInfo = (SecondaryIndexInfo) action.Difference.Source; + var table = FindTable(secondaryIndexInfo.Parent); + + // Ensure table is not removed + if (table==null) + return; + + var index = table.Indexes[secondaryIndexInfo.Name]; + preCleanupDataOutput.RegisterCommand(SqlDdl.Drop(index)); + table.Indexes.Remove(index); + } + + private void VisitAlterSecondaryIndexAction(NodeAction action) + { + throw new NotSupportedException(); + } + + private void VisitCreateForeignKeyAction(CreateNodeAction action) + { + if (!allowCreateConstraints) + return; + + var foreignKeyInfo = (ForeignKeyInfo) action.Difference.Target; + var table = FindTable(foreignKeyInfo.Parent); + var foreignKey = CreateForeignKey(foreignKeyInfo); + + currentOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.AddConstraint(foreignKey))); + } + + private void VisitRemoveForeignKeyAction(RemoveNodeAction action) + { + var preCleanupDataOutput = currentOutput.ForStage(SqlUpgradeStage.PreCleanupData); + + var foreignKeyInfo = (ForeignKeyInfo) action.Difference.Source; + var table = FindTable(foreignKeyInfo.Parent); + + // Ensure table is not removed + if (table==null) + return; + + var foreignKey = table.TableConstraints[foreignKeyInfo.Name]; + preCleanupDataOutput.RegisterCommand(SqlDdl.Alter(table, SqlDdl.DropConstraint(foreignKey))); + table.TableConstraints.Remove(foreignKey); + } + + private void VisitAlterForeignKeyAction(NodeAction action) + { + throw new NotSupportedException(); + } + + private void VisitCreateSequenceAction(CreateNodeAction action) + { + var sequenceInfo = (StorageSequenceInfo) action.Difference.Target; + if (providerInfo.Supports(ProviderFeatures.Sequences)) { + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + var sequence = node.Schema.CreateSequence(node.Name); + var descriptor = new SequenceDescriptor(sequence, sequenceInfo.Seed, sequenceInfo.Increment) { + MinValue = sequenceInfo.Seed + }; + sequence.SequenceDescriptor = descriptor; + currentOutput.RegisterCommand(SqlDdl.Create(sequence)); + createdSequences.Add(sequence); + } + else { + CreateGeneratorTable(sequenceInfo); + } + } + + private void VisitRemoveSequenceAction(RemoveNodeAction action) + { + var sequenceInfo = (StorageSequenceInfo) action.Difference.Source; + if (providerInfo.Supports(ProviderFeatures.Sequences)) { + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + var sequence = node.GetSequence(); + currentOutput.RegisterCommand(SqlDdl.Drop(sequence)); + node.Schema.Sequences.Remove(sequence); + } + else { + DropGeneratorTable(sequenceInfo); + } + } + + private void VisitAlterSequenceAction(PropertyChangeAction action) + { + var sequenceInfo = (StorageSequenceInfo) targetModel.Resolve(action.Path, true); + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + + // Check if sequence is not newly created + if (IsNewlyCreatedSequence(node)) + return; + + var currentValue = GetCurrentSequenceValue(sequenceInfo); + var newStartValue = currentValue + sequenceInfo.Increment; + + if (providerInfo.Supports(ProviderFeatures.Sequences)) { + var exisitingSequence = node.GetSequence(); + var newSequenceDescriptor = new SequenceDescriptor(exisitingSequence, null, sequenceInfo.Increment); + newSequenceDescriptor.LastValue = currentValue; + exisitingSequence.SequenceDescriptor = newSequenceDescriptor; + currentOutput.RegisterCommand(SqlDdl.Alter(exisitingSequence, newSequenceDescriptor)); + } + else { + sequenceInfo.Current = newStartValue; + DropGeneratorTable(sequenceInfo); + CreateGeneratorTable(sequenceInfo); + } + } + + private bool IsNewlyCreatedSequence(MappingResolveResult node) + { + if (providerInfo.Supports(ProviderFeatures.Sequences)) + return createdSequences.Any(s => s.Name==node.Name && s.Schema==node.Schema); + else + return createdTables.Any(t => t.Name==node.Name && t.Schema==node.Schema); + } + + private void VisitCreateFullTextIndexAction(CreateNodeAction action) + { + var fullTextIndexInfo = (StorageFullTextIndexInfo) action.Difference.Target; + var fullTextSupported = providerInfo.Supports(ProviderFeatures.FullText); + if (!fullTextSupported) + return; + var table = FindTable(fullTextIndexInfo.Parent); + var ftIndex = table.CreateFullTextIndex(fullTextIndexInfo.Name); + ftIndex.UnderlyingUniqueIndex = fullTextIndexInfo.Parent.PrimaryIndex.EscapedName; + ftIndex.FullTextCatalog = fullTextIndexInfo.FullTextCatalog; + ftIndex.ChangeTrackingMode = ConvertFullTextChangeTrackingMode(fullTextIndexInfo.ChangeTrackingMode); + + foreach (var column in fullTextIndexInfo.Columns) { + var tableColumn = FindColumn(table, column.Value.Name); + var ftColumn = ftIndex.CreateIndexColumn(tableColumn); + ftColumn.TypeColumn = (!column.TypeColumnName.IsNullOrEmpty() && providerInfo.Supports(ProviderFeatures.FullTextColumnDataTypeSpecification)) + ? FindColumn(table, column.TypeColumnName) + : null; + ftColumn.Languages.Add(new Language(column.Configuration)); + } + + var fullTextOutput = !providerInfo.Supports(ProviderFeatures.TransactionalFullTextDdl) + ? currentOutput.ForStage(SqlUpgradeStage.NonTransactionalEpilog) + : currentOutput; + fullTextOutput.RegisterCommand(SqlDdl.Create(ftIndex)); + } + + private void VisitRemoveFullTextIndexAction(RemoveNodeAction action) + { + var fullTextIndexInfo = (StorageFullTextIndexInfo) action.Difference.Source; + var fullTextSupported = providerInfo.Supports(ProviderFeatures.FullText); + if (!fullTextSupported) + return; + var table = FindTable(fullTextIndexInfo.Parent); + var ftIndex = table.Indexes[fullTextIndexInfo.Name] ?? table.Indexes.OfType().Single(); + var fullTextOutput = !providerInfo.Supports(ProviderFeatures.TransactionalFullTextDdl) + ? currentOutput.ForStage(SqlUpgradeStage.NonTransactionalProlog) + : currentOutput; + fullTextOutput.RegisterCommand(SqlDdl.Drop(ftIndex)); + table.Indexes.Remove(ftIndex); + } + + private void ProcessClearDataActions(bool postCopy) + { + var updateActions = ( + from action in clearDataActions + let updateDataHint = action.DataHint as UpdateDataHint + where updateDataHint!=null + select action + ).ToList(); + var deleteActions = ( + from action in clearDataActions + let deleteDataHint = action.DataHint as DeleteDataHint + where deleteDataHint!=null && deleteDataHint.PostCopy==postCopy + select action + ).ToList(); + + var deleteFromConnectorTableActions = new List(); + var deleteFromAncestorTableActions = new List(); + foreach (var deleteAction in deleteActions) { + var hint = deleteAction.DataHint as DeleteDataHint; + if (hint.Identities.Any(pair => !pair.IsIdentifiedByConstant)) + deleteFromConnectorTableActions.Add(deleteAction); + else + deleteFromAncestorTableActions.Add(deleteAction); + } + + updateActions.ForEach( + a => ProcessUpdateDataAction(a, postCopy)); + deleteFromConnectorTableActions.ForEach( + a => ProcessDeleteDataAction(a, postCopy)); + ProcessClearAncestorsActions(deleteFromAncestorTableActions, postCopy); + + // Necessary, since this method is called twice on upgrade + clearDataActions.Clear(); + } + + private void ProcessDeleteDataAction(DataAction action, bool postCopy) + { + var deleteOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); + + var hint = (DeleteDataHint) action.DataHint; + var soureTableInfo = (TableInfo) sourceModel.Resolve(hint.SourceTablePath, true); + var table = SqlDml.TableRef(FindTable(soureTableInfo)); + var delete = SqlDml.Delete(table); + + delete.Where = CreateConditionalExpression(hint, table); + + deleteOutput.RegisterCommand(delete); + } + + /// Can not create update command + /// with specific hint parameters. + private void ProcessUpdateDataAction(DataAction action, bool postCopy) + { + var hint = (UpdateDataHint) action.DataHint; + var soureTableInfo = (TableInfo) sourceModel.Resolve(hint.SourceTablePath, true); + var table = SqlDml.TableRef(FindTable(soureTableInfo)); + var update = SqlDml.Update(table); + + var updatedColumns = hint.UpdateParameter + .Select(pair => new Pair( + sourceModel.Resolve(pair.First, true) as StorageColumnInfo, + pair.Second)).ToArray(); + + if (updatedColumns.Length==0) + throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); + + foreach (var pair in updatedColumns) { + var column = pair.First; + var value = pair.Second; + + if (value==null) { + if (providerInfo.Supports(ProviderFeatures.UpdateDefaultValues)) + update.Values[table[column.Name]] = SqlDml.DefaultValue; + else { + if (column.Type.IsNullable) + update.Values[table[column.Name]] = SqlDml.Null; + else + update.Values[table[column.Name]] = GetDefaultValueExpression(column); + } + } + else + update.Values[table[column.Name]] = SqlDml.Literal(value); + } + + update.Where = CreateConditionalExpression(hint, table); + + var updateOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); + + updateOutput.RegisterCommand(update); + } + + private void ProcessClearAncestorsActions(List originalActions, bool postCopy) + { + if (originalActions.Count==0) + return; + + // Merge actions + var deleteActions = new Dictionary>(); + foreach (var action in originalActions) { + var sourceTableInfo = sourceModel.Resolve(action.DataHint.SourceTablePath, true) as TableInfo; + List list; + if (!deleteActions.TryGetValue(sourceTableInfo, out list)) { + list = new List(); + deleteActions.Add(sourceTableInfo, list); + } + list.AddRange(action.DataHint.Identities.Select(pair => pair.Target)); + } + + // Sort actions topologicaly according with foreign keys + var nodes = new List>(); + var foreignKeys = sourceModel.Tables + .SelectMany(table => table.ForeignKeys) + .ToList(); + foreach (var pair in deleteActions) + nodes.Add(new Xtensive.Sorting.Node(pair.Key)); + foreach (var foreignKey in foreignKeys) { + ForeignKeyInfo foreignKeyInfo = foreignKey; + var referencedNode = nodes.FirstOrDefault(node => node.Item==foreignKeyInfo.PrimaryKey.Parent); + var referencingNode = nodes.FirstOrDefault(node => node.Item==foreignKeyInfo.Parent); + if (referencedNode!=null && referencingNode!=null) + new NodeConnection(referencedNode, referencingNode, foreignKey).BindToNodes(); + } + List> edges; + var sortedTables = TopologicalSorter.Sort(nodes, out edges); + sortedTables.Reverse(); + // TODO: Process removed edges + + // Build DML commands + foreach (var table in sortedTables) { + var tableRef = SqlDml.TableRef(FindTable(table)); + var delete = SqlDml.Delete(tableRef); + var typeIds = deleteActions[table]; + foreach (var typeId in typeIds) + delete.Where |= tableRef[typeIdColumnName]==typeId; + + var clearOutput = currentOutput.ForStage(postCopy ? SqlUpgradeStage.PostCopyData : SqlUpgradeStage.CleanupData); + + clearOutput.RegisterCommand(delete); + } + } + + private void ChangeColumnType(PropertyChangeAction action) + { + var targetColumn = (StorageColumnInfo) targetModel.Resolve(action.Path, true); + var sourceColumn = (StorageColumnInfo) sourceModel.Resolve(action.Path, true); + var column = FindColumn(targetColumn.Parent, targetColumn.Name); + var table = column.Table; + var originalName = column.Name; + + var upgradeOutput = currentOutput.ForStage(SqlUpgradeStage.Upgrade); + var cleanupOutput = currentOutput.ForStage(SqlUpgradeStage.Cleanup); + + // Rename old column + var tempName = GetTemporaryName(column); + if(recreatedColumns.Contains(column)) { + recreatedColumns.Remove(column); + RenameColumn(column, tempName); + recreatedColumns.Add(column); + } + else + RenameColumn(column, tempName); + + // Create new columns + var newTypeInfo = targetColumn.Type; + var newSqlType = (SqlValueType) newTypeInfo.NativeType; + var newColumn = table.CreateColumn(originalName, newSqlType); + + newColumn.IsNullable = newTypeInfo.IsNullable; + if (!newColumn.IsNullable) + newColumn.DefaultValue = GetDefaultValueExpression(targetColumn); + + var addNewColumn = SqlDdl.Alter(table, SqlDdl.AddColumn(newColumn)); + + upgradeOutput.RegisterCommand(addNewColumn); + + // Copy values if possible to convert type + if (TypeConversionVerifier.CanConvert(sourceColumn.Type, newTypeInfo) + || enforceChangedColumns.Contains(sourceColumn.Path, StringComparer)) { + var tableRef = SqlDml.TableRef(table); + var copyValues = SqlDml.Update(tableRef); + if (newTypeInfo.IsNullable) { + if (sourceColumn.Type.Type.StripNullable()==typeof (string) && newSqlType.Length < column.DataType.Length) + copyValues.Values[tableRef[originalName]] = SqlDml.Cast(SqlDml.Substring(tableRef[tempName], 0, newSqlType.Length), newSqlType); + else + copyValues.Values[tableRef[originalName]] = SqlDml.Cast(tableRef[tempName], newSqlType); + } + else { + var getValue = SqlDml.Case(); + getValue.Add(SqlDml.IsNull(tableRef[tempName]), GetDefaultValueExpression(targetColumn)); + + if (newSqlType.Type==SqlType.DateTimeOffset) + getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.DateTimeToDateTimeOffset(tableRef[tempName])); + else if (newSqlType.Type==SqlType.DateTime && providerInfo.Supports(ProviderFeatures.DateTimeOffsetEmulation)) + getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(SqlDml.Extract(SqlDateTimeOffsetPart.DateTime, tableRef[tempName]), newSqlType)); + else + getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(tableRef[tempName], newSqlType)); + + copyValues.Values[tableRef[originalName]] = getValue; + } + upgradeOutput.BreakBatch(); + upgradeOutput.RegisterCommand(copyValues); + } + + // Drop old column + DropColumn(table.TableColumns[tempName], cleanupOutput); + } + + private Table CreateTable(TableInfo tableInfo) + { + var node = resolver.Resolve(sqlModel, tableInfo.Name); + var table = node.Schema.CreateTable(node.Name); + foreach (var columnInfo in tableInfo.Columns) + CreateColumn(columnInfo, table); + if (tableInfo.PrimaryIndex!=null) + CreatePrimaryKey(tableInfo, table); + createdTables.Add(table); + return table; + } + + private TableColumn CreateColumn(StorageColumnInfo columnInfo, Table table) + { + var type = columnInfo.Type.NativeType; + var column = table.CreateColumn(columnInfo.Name, type); + var isPrimaryKeyColumn = + columnInfo.Parent.PrimaryIndex!=null + && columnInfo.Parent.PrimaryIndex.KeyColumns.Any(keyColumn => keyColumn.Value==columnInfo); + + if (!column.IsNullable && column.Name != typeIdColumnName) + if (!isPrimaryKeyColumn) + column.DefaultValue = GetDefaultValueExpression(columnInfo); + else if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) + column.DefaultValue = SqlDml.Native(columnInfo.DefaultSqlExpression); + + column.IsNullable = columnInfo.Type.IsNullable; + + if (columnInfo.Type.Type==typeof (string) && collationName!=null) + column.Collation = table.Schema.Collations[collationName] ?? new Collation(table.Schema, collationName); + + return column; + } + + private ForeignKey CreateForeignKey(ForeignKeyInfo foreignKeyInfo) + { + var referencingTable = FindTable(foreignKeyInfo.Parent); + var foreignKey = referencingTable.CreateForeignKey(foreignKeyInfo.Name); + foreignKey.OnUpdate = ConvertReferentialAction(foreignKeyInfo.OnUpdateAction); + foreignKey.OnDelete = ConvertReferentialAction(foreignKeyInfo.OnRemoveAction); + foreignKey.IsDeferrable = providerInfo.Supports(ProviderFeatures.DeferrableConstraints); + foreignKey.IsInitiallyDeferred = foreignKey.IsDeferrable; + var referencingColumns = foreignKeyInfo.ForeignKeyColumns + .Select(cr => FindColumn(referencingTable, cr.Value.Name)); + foreignKey.Columns.AddRange(referencingColumns); + var referencedTable = FindTable(foreignKeyInfo.PrimaryKey.Parent); + var referencedColumns = foreignKeyInfo.PrimaryKey.KeyColumns + .Select(cr => FindColumn(referencedTable, cr.Value.Name)); + foreignKey.ReferencedTable = referencedTable; + foreignKey.ReferencedColumns.AddRange(referencedColumns); + return foreignKey; + } + + private PrimaryKey CreatePrimaryKey(TableInfo tableInfo, Table table) + { + var columns = tableInfo.PrimaryIndex.KeyColumns.Select(cr => FindColumn(table, cr.Value.Name)).ToArray(); + var primaryKey = table.CreatePrimaryKey(tableInfo.PrimaryIndex.Name, columns); + // For storages that do not support clustered indexes + // PrimaryIndexInfo.IsClustered will be forcibly set to false by DomainModelConverter. + primaryKey.IsClustered = tableInfo.PrimaryIndex.IsClustered; + return primaryKey; + } + + private Index CreateSecondaryIndex(Table table, SecondaryIndexInfo indexInfo) + { + if (indexInfo.KeyColumns.Count == 1) { + var column = FindColumn(table, indexInfo.KeyColumns[0].Value.Name); + if (driver.ServerInfo.DataTypes[column.DataType.Type].Features.Supports(DataTypeFeatures.Spatial)) { + + var spatialIndex = table.CreateSpatialIndex(indexInfo.Name); + spatialIndex.CreateIndexColumn(column); + return spatialIndex; + } + } + + var index = table.CreateIndex(indexInfo.Name); + index.IsUnique = indexInfo.IsUnique; + index.IsClustered = indexInfo.IsClustered; + foreach (var keyColumn in indexInfo.KeyColumns) + index.CreateIndexColumn( + FindColumn(table, keyColumn.Value.Name), + keyColumn.Direction==Direction.Positive); + index.NonkeyColumns.AddRange( + indexInfo.IncludedColumns + .Select(cr => FindColumn(table, cr.Value.Name)).ToArray()); + if (indexInfo.Filter!=null) + index.Where = SqlDml.Native(indexInfo.Filter.Expression); + return index; + } + + private void CreateGeneratorTable(StorageSequenceInfo sequenceInfo) + { + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + var sequenceTable = node.Schema.CreateTable(node.Name); + createdTables.Add(sequenceTable); + var idColumn = sequenceTable.CreateColumn(WellKnown.GeneratorColumnName, + (SqlValueType) sequenceInfo.Type.NativeType); + idColumn.SequenceDescriptor = + new SequenceDescriptor( + idColumn, + sequenceInfo.Current ?? sequenceInfo.Seed, + sequenceInfo.Increment); + sequenceTable.CreatePrimaryKey(string.Format("PK_{0}", sequenceInfo.Name), idColumn); + if (!providerInfo.Supports(ProviderFeatures.InsertDefaultValues)) { + var fakeColumn = sequenceTable.CreateColumn(WellKnown.GeneratorFakeColumnName, driver.MapValueType(typeof(int))); + fakeColumn.IsNullable = true; + } + currentOutput.RegisterCommand(SqlDdl.Create(sequenceTable)); + } + + private void DropGeneratorTable(StorageSequenceInfo sequenceInfo) + { + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + var sequenceTable = node.GetTable(); + string lockedTable; + sqlModel.LockedTables.TryGetValue(resolver.GetNodeName(sequenceTable), out lockedTable); + if (!lockedTable.IsNullOrEmpty()) + throw new SchemaSynchronizationException(lockedTable); + currentOutput.RegisterCommand(SqlDdl.Drop(sequenceTable)); + node.Schema.Tables.Remove(sequenceTable); + } + + private void RenameSchemaTable(Table table, Schema oldSchema, Schema newSchema, string newName) + { + var schema = table.Schema; + + // Renamed table must be removed and added with new name + // for reregistring in dictionary + oldSchema.Tables.Remove(table); + table.Name = newName; + newSchema.Tables.Add(table); + } + + private void RenameSchemaColumn(TableColumn column, string newName) + { + // Renamed column must be removed and added with new name + // for reregistring in dictionary + var table = column.Table; + table.TableColumns.Remove(column); + column.Name = newName; + table.TableColumns.Add(column); + } + + private string GetTemporaryName(Table table) + { + var tempName = string.Format(TemporaryNameFormat, table.Name); + var counter = 0; + while (table.Schema.Tables.Any(t => StringComparer.Compare(t.Name, tempName)==0)) + tempName = string.Format(TemporaryNameFormat, table.Name + ++counter); + return tempName; + } + + private string GetTemporaryName(TableColumn column) + { + var tempName = string.Format(TemporaryNameFormat, column.Name); + var counter = 0; + while (column.Table.Columns.Any(tableColumn => StringComparer.Equals(tableColumn.Name, tempName))) + tempName = string.Format(TemporaryNameFormat, column.Name + ++counter); + return tempName; + } + + private Table FindTable(TableInfo tableInfo) + { + return resolver.Resolve(sqlModel, tableInfo.Name).GetTable(); + } + + private TableColumn FindColumn(Table table, string name) + { + return table.TableColumns[name]; + } + + private TableColumn FindColumn(TableInfo tableInfo, string columnName) + { + return FindTable(tableInfo).TableColumns[columnName]; + } + + private static ReferentialAction ConvertReferentialAction(Model.ReferentialAction toConvert) + { + switch (toConvert) { + case Model.ReferentialAction.None: + return ReferentialAction.NoAction; + case Model.ReferentialAction.Restrict: + return ReferentialAction.Restrict; + case Model.ReferentialAction.Cascade: + return ReferentialAction.Cascade; + case Model.ReferentialAction.Clear: + return ReferentialAction.SetNull; + default: + return ReferentialAction.Restrict; + } + } + + private static ChangeTrackingMode ConvertFullTextChangeTrackingMode(FullTextChangeTrackingMode toConvert) + { + switch (toConvert) { + case FullTextChangeTrackingMode.Auto: + return ChangeTrackingMode.Auto; + case FullTextChangeTrackingMode.Manual: + return ChangeTrackingMode.Manual; + case FullTextChangeTrackingMode.Off: + return ChangeTrackingMode.Off; + case FullTextChangeTrackingMode.OffWithNoPopulation: + return ChangeTrackingMode.OffWithNoPopulation; + default: + return ChangeTrackingMode.Default; + } + } + + /// Can not create expression + /// with specific hint parameters. + private SqlExpression CreateConditionalExpression(DataHint hint, SqlTableRef table) + { + if (hint.Identities.Any(pair => !pair.IsIdentifiedByConstant)) { + var identityColumnPairs = hint.Identities + .Where(pair => !pair.IsIdentifiedByConstant).Select(pair => + new Pair( + sourceModel.Resolve(pair.Target, true) as StorageColumnInfo, + sourceModel.Resolve(pair.Source, true) as StorageColumnInfo)).ToArray(); + var identityConstantPairs = hint.Identities + .Where(pair => pair.IsIdentifiedByConstant).Select(pair => + new Pair( + sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, + pair.Target)).ToArray(); + var selectColumns = identityColumnPairs.Select(columnPair => columnPair.First) + .Concat(identityConstantPairs.Select(constantPair => constantPair.First)).ToArray(); + if (!selectColumns.Any()) + throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); + + var identifiedTable = FindTable(selectColumns[0].Parent); + var identifiedTableRef = SqlDml.TableRef(identifiedTable, + string.Format(SubqueryTableAliasNameFormat, identifiedTable.Name)); + var select = SqlDml.Select(identifiedTableRef); + selectColumns.ForEach(column => select.Columns.Add(identifiedTableRef[column.Name])); + identityColumnPairs.ForEach(pair => + select.Where &= identifiedTableRef[pair.First.Name]==table[pair.Second.Name]); + identityConstantPairs.ForEach(pair => + select.Where &= identifiedTableRef[pair.First.Name]==SqlDml.Literal(pair.Second)); + return SqlDml.Exists(select); + } + else { + var identityConstantPairs = hint.Identities + .Where(pair => pair.IsIdentifiedByConstant).Select(pair => + new Pair( + sourceModel.Resolve(pair.Source, true) as StorageColumnInfo, + pair.Target)).ToArray(); + if (!identityConstantPairs.Any()) + throw new InvalidOperationException(Strings.ExIncorrectCommandParameters); + SqlExpression expression = null; + identityConstantPairs.ForEach(pair => + expression &= table[pair.First.Name]==SqlDml.Literal(pair.Second)); + return expression; + } + } + + private SqlExpression GetDefaultValueExpression(StorageColumnInfo columnInfo) + { + if (!string.IsNullOrEmpty(columnInfo.DefaultSqlExpression)) + return SqlDml.Native(columnInfo.DefaultSqlExpression); + if (columnInfo.DefaultValue!=null) + return SqlDml.Literal(columnInfo.DefaultValue); + var type = columnInfo.Type.Type; + return type.IsValueType && !type.IsNullable() ? SqlDml.Literal(Activator.CreateInstance(type)) : null; + } + + private string TryUnquoteLiteral(string stringToUnquote) + { + if (stringToUnquote.StartsWith("N", StringComparison.Ordinal)) { + var unquotedSting = stringToUnquote.Remove(0, 1).Trim(new[] {'\''}).Replace("''", "'"); + return unquotedSting; + } + return stringToUnquote; + } + + private long? GetCurrentSequenceValue(StorageSequenceInfo sequenceInfo) + { + var node = resolver.Resolve(sqlModel, sequenceInfo.Name); + var generatorNode = providerInfo.Supports(ProviderFeatures.Sequences) + ? (SchemaNode) node.GetSequence() + : node.GetTable(); + return sequenceQueryBuilder.BuildNextValueQuery(generatorNode, 0).ExecuteWith(sqlExecutor); + } + + private void ProcessActions(Modelling.Comparison.UpgradeStage modellingStage, SqlUpgradeStage stage) + { + currentOutput = currentOutput.ForStage(stage); + var actionName = modellingStage.ToString(); + var groupingAction = actions + .OfType() + .FirstOrDefault(ga => ga.Comment==actionName); + if (groupingAction!=null) + VisitAction(groupingAction); + } + + // Constructors + + public SqlActionTranslator( + HandlerAccessor handlers, ISqlExecutor sqlExecutor, MappingResolver resolver, + ActionSequence actions, SchemaExtractionResult sqlModel, StorageModel sourceModel, StorageModel targetModel, + List enforceChangedColumns, bool allowCreateConstraints) + { + ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); + ArgumentValidator.EnsureArgumentNotNull(sqlExecutor, "sqlExecutor"); + ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); + ArgumentValidator.EnsureArgumentNotNull(actions, "actions"); + ArgumentValidator.EnsureArgumentNotNull(sqlModel, "sqlModel"); + ArgumentValidator.EnsureArgumentNotNull(sourceModel, "sourceModel"); + ArgumentValidator.EnsureArgumentNotNull(targetModel, "targetModel"); + ArgumentValidator.EnsureArgumentNotNull(enforceChangedColumns, "enforceChangedColumns"); + + driver = handlers.StorageDriver; + providerInfo = handlers.ProviderInfo; + sequenceQueryBuilder = handlers.SequenceQueryBuilder; + providerInfo = handlers.ProviderInfo; + typeIdColumnName = handlers.NameBuilder.TypeIdColumnName; + + this.resolver = resolver; + this.sqlModel = sqlModel; + this.actions = actions; + this.sourceModel = sourceModel; + this.targetModel = targetModel; + this.enforceChangedColumns = enforceChangedColumns; + this.sqlExecutor = sqlExecutor; + this.allowCreateConstraints = allowCreateConstraints; + + if (providerInfo.Supports(ProviderFeatures.Collations)) { + var collation = handlers.Domain.Configuration.Collation; + if (!string.IsNullOrEmpty(collation)) + collationName = collation; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlModelConverter.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlModelConverter.cs index c25b5ed1c2..523bba847c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlModelConverter.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlModelConverter.cs @@ -1,518 +1,518 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.31 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; -using Xtensive.Reflection; -using Xtensive.Modelling; -using Xtensive.Sql; -using Xtensive.Sql.Model; -using Xtensive.Orm.Upgrade.Model; -using Node = Xtensive.Sql.Model.Node; -using ReferentialAction = Xtensive.Orm.Upgrade.Model.ReferentialAction; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Converts to . - /// - internal sealed class SqlModelConverter : SqlModelVisitor - { - private readonly SchemaExtractionResult sourceModel; - private readonly MappingResolver resolver; - private readonly ProviderInfo providerInfo; - private readonly PartialIndexInfoMap partialIndexMap; - private readonly StorageDriver driver; - - private StorageModel targetModel; - private TableInfo currentTable; - - /// - /// Get the result of conversion specified - /// to . - /// - /// The storage model. - public StorageModel Run() - { - if (targetModel==null) { - targetModel = new StorageModel(); - foreach (var catalog in sourceModel.Catalogs) - VisitCatalog(catalog); - } - - return targetModel; - } - - #region SqlModelVisitor implementation - - /// - protected override IPathNode VisitSchema(Schema schema) - { - // Build tables, columns and indexes. - foreach (var table in schema.Tables) - Visit(table); - - // Build foreign keys. - var foreignKeys = schema.Tables.SelectMany(t => t.TableConstraints.OfType()); - foreach (var foreignKey in foreignKeys) - Visit(foreignKey); - foreach (var sequence in schema.Sequences) - VisitSequence(sequence); - - return null; - } - - /// - protected override IPathNode Visit(Node node) - { - if (!providerInfo.Supports(ProviderFeatures.Sequences)) { - var table = node as Table; - if (table!=null && IsGeneratorTable(table)) - return VisitGeneratorTable(table); - } - - return base.Visit(node); - } - - /// - protected override IPathNode VisitTable(Table table) - { - var tableInfo = new TableInfo(targetModel, resolver.GetNodeName(table)); - - currentTable = tableInfo; - - foreach (var column in table.TableColumns) - Visit(column); - - var primaryKey = table.TableConstraints - .SingleOrDefault(constraint => constraint is PrimaryKey); - if (primaryKey!=null) - Visit(primaryKey); - - foreach (var index in table.Indexes) - Visit(index); - - currentTable = null; - - return tableInfo; - } - - /// - protected override IPathNode VisitTableColumn(TableColumn tableColumn) - { - var tableInfo = currentTable; - var typeInfo = ExtractType(tableColumn); - var columnInfo = new StorageColumnInfo(tableInfo, tableColumn.Name, typeInfo); - return columnInfo; - } - - /// - protected override IPathNode VisitForeignKey(ForeignKey key) - { - var referencingTable = targetModel.Tables[resolver.GetNodeName(key.Owner)]; - var referencingColumns = new List(); - - foreach (var refColumn in key.Columns) - referencingColumns.Add(referencingTable.Columns[refColumn.Name]); - - var foreignKeyInfo = new ForeignKeyInfo(referencingTable, key.Name) { - OnUpdateAction = ConvertReferentialAction(key.OnUpdate), - OnRemoveAction = ConvertReferentialAction(key.OnDelete) - }; - - var referencedTable = targetModel.Tables[resolver.GetNodeName(key.ReferencedTable)]; - foreignKeyInfo.PrimaryKey = referencedTable.PrimaryIndex; - - foreach (var column in referencingColumns) - new ForeignKeyColumnRef(foreignKeyInfo, column); - - return foreignKeyInfo; - } - - /// - protected override IPathNode VisitPrimaryKey(PrimaryKey key) - { - var tableInfo = currentTable; - var primaryIndexInfo = new PrimaryIndexInfo(tableInfo, key.Name) {IsClustered = key.IsClustered}; - - foreach (var keyColumn in key.Columns) - new KeyColumnRef(primaryIndexInfo, tableInfo.Columns[keyColumn.Name], - Direction.Positive); - // TODO: Get direction for key columns - primaryIndexInfo.PopulateValueColumns(); - - return primaryIndexInfo; - } - - /// - protected override IPathNode VisitFullTextIndex(FullTextIndex index) - { - var tableInfo = currentTable; - var name = index.Name.IsNullOrEmpty() - ? string.Format("FT_{0}", index.DataTable.Name) - : index.Name; - var ftIndex = new StorageFullTextIndexInfo(tableInfo, name) { - FullTextCatalog = index.FullTextCatalog, - ChangeTrackingMode = ConvertChangeTrackingMode(index.ChangeTrackingMode) - }; - foreach (var column in index.Columns) { - var columnInfo = tableInfo.Columns[column.Column.Name]; - string typeColumn = null; - if (column.TypeColumn!=null) - typeColumn = tableInfo.Columns[column.TypeColumn.Name].Name; - new FullTextColumnRef(ftIndex, columnInfo, column.Languages.Single().Name, typeColumn); - } - return ftIndex; - } - - /// - protected override IPathNode VisitIndex(Index index) - { - var tableInfo = currentTable; - var secondaryIndexInfo = new SecondaryIndexInfo(tableInfo, index.Name) { - IsUnique = index.IsUnique, - IsClustered = index.IsClustered, - Filter = GetFilter(index), - }; - - foreach (var keyColumn in index.Columns) { - var columnInfo = tableInfo.Columns[keyColumn.Column.Name]; - new KeyColumnRef(secondaryIndexInfo, - columnInfo, keyColumn.Ascending ? Direction.Positive : Direction.Negative); - } - - foreach (var valueColumn in index.NonkeyColumns) { - var columnInfo = tableInfo.Columns[valueColumn.Name]; - new IncludedColumnRef(secondaryIndexInfo, columnInfo); - } - - secondaryIndexInfo.PopulatePrimaryKeyColumns(); - - return secondaryIndexInfo; - } - - private PartialIndexFilterInfo GetFilter(Index index) - { - var tableName = resolver.GetNodeName(index.DataTable); - var result = partialIndexMap.FindIndex(tableName, index.DbName); - if (result==null) - return null; - return new PartialIndexFilterInfo(result.Filter); - } - - /// - protected override IPathNode VisitSequence(Sequence sequence) - { - var sequenceInfo = new StorageSequenceInfo(targetModel, resolver.GetNodeName(sequence)) { - Increment = sequence.SequenceDescriptor.Increment.Value, - // StartValue = sequence.SequenceDescriptor.StartValue.Value, - }; - return sequenceInfo; - } - - protected override IPathNode VisitCatalog(Catalog catalog) - { - foreach (var schema in catalog.Schemas) - VisitSchema(schema); - return null; - } - - #endregion - - /// - /// Visits the generator table. - /// - /// The generator table. - /// Visit result. - private IPathNode VisitGeneratorTable(Table generatorTable) - { - var idColumn = generatorTable.TableColumns[0]; - var startValue = idColumn.SequenceDescriptor.StartValue; - var increment = idColumn.SequenceDescriptor.Increment; - var type = ExtractType(idColumn); - var sequence = - new StorageSequenceInfo(targetModel, resolver.GetNodeName(generatorTable)) { - Seed = startValue ?? 0, - Increment = increment ?? 1, - Type = type, - }; - - return sequence; - } - - /// - /// Extracts the from . - /// - /// The column. - /// Data type. - private StorageTypeInfo ExtractType(TableColumn column) - { - var sqlValueType = column.DataType; - Type type; - try { - type = driver.MapSqlType(sqlValueType.Type); - } - catch(ArgumentException) { - return StorageTypeInfo.Undefined; - } - - if (column.IsNullable) { - type = type.ToNullable(); - } - - return new StorageTypeInfo(type, sqlValueType, column.IsNullable, sqlValueType.Length, sqlValueType.Precision, sqlValueType.Scale); - } - - /// - /// Converts the to - /// . - /// - /// The action to convert. - /// Converted action. - private ReferentialAction ConvertReferentialAction(Sql.ReferentialAction toConvert) - { - switch (toConvert) { - case Sql.ReferentialAction.NoAction: - return ReferentialAction.None; - case Sql.ReferentialAction.Restrict: - return ReferentialAction.Restrict; - case Sql.ReferentialAction.Cascade: - return ReferentialAction.Cascade; - case Sql.ReferentialAction.SetNull: - return ReferentialAction.Clear; - case Sql.ReferentialAction.SetDefault: - return ReferentialAction.Default; - default: - return ReferentialAction.Default; - } - } - - /// - /// Converts the to . - /// - /// The mode to convert. - /// Converted mode. - private FullTextChangeTrackingMode ConvertChangeTrackingMode(ChangeTrackingMode toConvert) - { - switch (toConvert) { - case ChangeTrackingMode.Auto: - return FullTextChangeTrackingMode.Auto; - case ChangeTrackingMode.Manual: - return FullTextChangeTrackingMode.Manual; - case ChangeTrackingMode.Off: - return FullTextChangeTrackingMode.Off; - case ChangeTrackingMode.OffWithNoPopulation: - return FullTextChangeTrackingMode.OffWithNoPopulation; - default: - return FullTextChangeTrackingMode.Default; - } - } - - /// - /// Determines whether specific table used as sequence. - /// - /// The table. - /// - /// if table used as sequence; - /// otherwise, . - /// - private bool IsGeneratorTable(Table table) - { - int columnNumber = providerInfo.Supports(ProviderFeatures.InsertDefaultValues) ? 1 : 2; - return table.TableColumns.Count==columnNumber && - table.TableColumns[0].SequenceDescriptor!=null; - } - - - // Constructors - - public SqlModelConverter(UpgradeServiceAccessor services, SchemaExtractionResult sourceModel, - IEnumerable partialIndexes) - { - ArgumentValidator.EnsureArgumentNotNull(services, "handlers"); - ArgumentValidator.EnsureArgumentNotNull(sourceModel, "sourceModel"); - ArgumentValidator.EnsureArgumentNotNull(partialIndexes, "partialIndexes"); - - this.sourceModel = sourceModel; - - resolver = services.MappingResolver; - providerInfo = services.ProviderInfo; - driver = services.StorageDriver; - - partialIndexMap = new PartialIndexInfoMap(resolver, partialIndexes); - } - - #region Not supported - - /// - /// Method is not supported. - protected override IPathNode VisitUniqueConstraint(UniqueConstraint constraint) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitIndexColumn(IndexColumn indexColumn) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitCharacterSet(CharacterSet characterSet) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitCollation(Collation collation) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitDataTable(DataTable dataTable) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitDataTableColumn(DataTableColumn dataTableColumn) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitDomain(Xtensive.Sql.Model.Domain domain) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitHashPartition(HashPartition hashPartition) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitListPartition(ListPartition listPartition) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitPartition(Partition partition) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitPartitionDescriptor(PartitionDescriptor partitionDescriptor) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitPartitionFunction(PartitionFunction partitionFunction) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitPartitionSchema(PartitionSchema partitionSchema) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitTableConstraint(TableConstraint constraint) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitDomainConstraint(DomainConstraint constraint) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitConstraint(Constraint constraint) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitCheckConstraint(CheckConstraint constraint) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitRangePartition(RangePartition rangePartition) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitSequenceDescriptor(SequenceDescriptor sequenceDescriptor) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitTemporaryTable(TemporaryTable temporaryTable) - { - // http://support.x-tensive.com/question/3643/oracle-database-domainbuild-throws-notsupportedexception - return null; - } - - /// - /// Method is not supported. - protected override IPathNode VisitTranslation(Translation translation) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitView(View view) - { - throw new NotSupportedException(); - } - - /// - /// Method is not supported. - protected override IPathNode VisitViewColumn(ViewColumn viewColumn) - { - throw new NotSupportedException(); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.31 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; +using Xtensive.Reflection; +using Xtensive.Modelling; +using Xtensive.Sql; +using Xtensive.Sql.Model; +using Xtensive.Orm.Upgrade.Model; +using Node = Xtensive.Sql.Model.Node; +using ReferentialAction = Xtensive.Orm.Upgrade.Model.ReferentialAction; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Converts to . + /// + internal sealed class SqlModelConverter : SqlModelVisitor + { + private readonly SchemaExtractionResult sourceModel; + private readonly MappingResolver resolver; + private readonly ProviderInfo providerInfo; + private readonly PartialIndexInfoMap partialIndexMap; + private readonly StorageDriver driver; + + private StorageModel targetModel; + private TableInfo currentTable; + + /// + /// Get the result of conversion specified + /// to . + /// + /// The storage model. + public StorageModel Run() + { + if (targetModel==null) { + targetModel = new StorageModel(); + foreach (var catalog in sourceModel.Catalogs) + VisitCatalog(catalog); + } + + return targetModel; + } + + #region SqlModelVisitor implementation + + /// + protected override IPathNode VisitSchema(Schema schema) + { + // Build tables, columns and indexes. + foreach (var table in schema.Tables) + Visit(table); + + // Build foreign keys. + var foreignKeys = schema.Tables.SelectMany(t => t.TableConstraints.OfType()); + foreach (var foreignKey in foreignKeys) + Visit(foreignKey); + foreach (var sequence in schema.Sequences) + VisitSequence(sequence); + + return null; + } + + /// + protected override IPathNode Visit(Node node) + { + if (!providerInfo.Supports(ProviderFeatures.Sequences)) { + var table = node as Table; + if (table!=null && IsGeneratorTable(table)) + return VisitGeneratorTable(table); + } + + return base.Visit(node); + } + + /// + protected override IPathNode VisitTable(Table table) + { + var tableInfo = new TableInfo(targetModel, resolver.GetNodeName(table)); + + currentTable = tableInfo; + + foreach (var column in table.TableColumns) + Visit(column); + + var primaryKey = table.TableConstraints + .SingleOrDefault(constraint => constraint is PrimaryKey); + if (primaryKey!=null) + Visit(primaryKey); + + foreach (var index in table.Indexes) + Visit(index); + + currentTable = null; + + return tableInfo; + } + + /// + protected override IPathNode VisitTableColumn(TableColumn tableColumn) + { + var tableInfo = currentTable; + var typeInfo = ExtractType(tableColumn); + var columnInfo = new StorageColumnInfo(tableInfo, tableColumn.Name, typeInfo); + return columnInfo; + } + + /// + protected override IPathNode VisitForeignKey(ForeignKey key) + { + var referencingTable = targetModel.Tables[resolver.GetNodeName(key.Owner)]; + var referencingColumns = new List(); + + foreach (var refColumn in key.Columns) + referencingColumns.Add(referencingTable.Columns[refColumn.Name]); + + var foreignKeyInfo = new ForeignKeyInfo(referencingTable, key.Name) { + OnUpdateAction = ConvertReferentialAction(key.OnUpdate), + OnRemoveAction = ConvertReferentialAction(key.OnDelete) + }; + + var referencedTable = targetModel.Tables[resolver.GetNodeName(key.ReferencedTable)]; + foreignKeyInfo.PrimaryKey = referencedTable.PrimaryIndex; + + foreach (var column in referencingColumns) + new ForeignKeyColumnRef(foreignKeyInfo, column); + + return foreignKeyInfo; + } + + /// + protected override IPathNode VisitPrimaryKey(PrimaryKey key) + { + var tableInfo = currentTable; + var primaryIndexInfo = new PrimaryIndexInfo(tableInfo, key.Name) {IsClustered = key.IsClustered}; + + foreach (var keyColumn in key.Columns) + new KeyColumnRef(primaryIndexInfo, tableInfo.Columns[keyColumn.Name], + Direction.Positive); + // TODO: Get direction for key columns + primaryIndexInfo.PopulateValueColumns(); + + return primaryIndexInfo; + } + + /// + protected override IPathNode VisitFullTextIndex(FullTextIndex index) + { + var tableInfo = currentTable; + var name = index.Name.IsNullOrEmpty() + ? string.Format("FT_{0}", index.DataTable.Name) + : index.Name; + var ftIndex = new StorageFullTextIndexInfo(tableInfo, name) { + FullTextCatalog = index.FullTextCatalog, + ChangeTrackingMode = ConvertChangeTrackingMode(index.ChangeTrackingMode) + }; + foreach (var column in index.Columns) { + var columnInfo = tableInfo.Columns[column.Column.Name]; + string typeColumn = null; + if (column.TypeColumn!=null) + typeColumn = tableInfo.Columns[column.TypeColumn.Name].Name; + new FullTextColumnRef(ftIndex, columnInfo, column.Languages.Single().Name, typeColumn); + } + return ftIndex; + } + + /// + protected override IPathNode VisitIndex(Index index) + { + var tableInfo = currentTable; + var secondaryIndexInfo = new SecondaryIndexInfo(tableInfo, index.Name) { + IsUnique = index.IsUnique, + IsClustered = index.IsClustered, + Filter = GetFilter(index), + }; + + foreach (var keyColumn in index.Columns) { + var columnInfo = tableInfo.Columns[keyColumn.Column.Name]; + new KeyColumnRef(secondaryIndexInfo, + columnInfo, keyColumn.Ascending ? Direction.Positive : Direction.Negative); + } + + foreach (var valueColumn in index.NonkeyColumns) { + var columnInfo = tableInfo.Columns[valueColumn.Name]; + new IncludedColumnRef(secondaryIndexInfo, columnInfo); + } + + secondaryIndexInfo.PopulatePrimaryKeyColumns(); + + return secondaryIndexInfo; + } + + private PartialIndexFilterInfo GetFilter(Index index) + { + var tableName = resolver.GetNodeName(index.DataTable); + var result = partialIndexMap.FindIndex(tableName, index.DbName); + if (result==null) + return null; + return new PartialIndexFilterInfo(result.Filter); + } + + /// + protected override IPathNode VisitSequence(Sequence sequence) + { + var sequenceInfo = new StorageSequenceInfo(targetModel, resolver.GetNodeName(sequence)) { + Increment = sequence.SequenceDescriptor.Increment.Value, + // StartValue = sequence.SequenceDescriptor.StartValue.Value, + }; + return sequenceInfo; + } + + protected override IPathNode VisitCatalog(Catalog catalog) + { + foreach (var schema in catalog.Schemas) + VisitSchema(schema); + return null; + } + + #endregion + + /// + /// Visits the generator table. + /// + /// The generator table. + /// Visit result. + private IPathNode VisitGeneratorTable(Table generatorTable) + { + var idColumn = generatorTable.TableColumns[0]; + var startValue = idColumn.SequenceDescriptor.StartValue; + var increment = idColumn.SequenceDescriptor.Increment; + var type = ExtractType(idColumn); + var sequence = + new StorageSequenceInfo(targetModel, resolver.GetNodeName(generatorTable)) { + Seed = startValue ?? 0, + Increment = increment ?? 1, + Type = type, + }; + + return sequence; + } + + /// + /// Extracts the from . + /// + /// The column. + /// Data type. + private StorageTypeInfo ExtractType(TableColumn column) + { + var sqlValueType = column.DataType; + Type type; + try { + type = driver.MapSqlType(sqlValueType.Type); + } + catch(ArgumentException) { + return StorageTypeInfo.Undefined; + } + + if (column.IsNullable) { + type = type.ToNullable(); + } + + return new StorageTypeInfo(type, sqlValueType, column.IsNullable, sqlValueType.Length, sqlValueType.Precision, sqlValueType.Scale); + } + + /// + /// Converts the to + /// . + /// + /// The action to convert. + /// Converted action. + private ReferentialAction ConvertReferentialAction(Sql.ReferentialAction toConvert) + { + switch (toConvert) { + case Sql.ReferentialAction.NoAction: + return ReferentialAction.None; + case Sql.ReferentialAction.Restrict: + return ReferentialAction.Restrict; + case Sql.ReferentialAction.Cascade: + return ReferentialAction.Cascade; + case Sql.ReferentialAction.SetNull: + return ReferentialAction.Clear; + case Sql.ReferentialAction.SetDefault: + return ReferentialAction.Default; + default: + return ReferentialAction.Default; + } + } + + /// + /// Converts the to . + /// + /// The mode to convert. + /// Converted mode. + private FullTextChangeTrackingMode ConvertChangeTrackingMode(ChangeTrackingMode toConvert) + { + switch (toConvert) { + case ChangeTrackingMode.Auto: + return FullTextChangeTrackingMode.Auto; + case ChangeTrackingMode.Manual: + return FullTextChangeTrackingMode.Manual; + case ChangeTrackingMode.Off: + return FullTextChangeTrackingMode.Off; + case ChangeTrackingMode.OffWithNoPopulation: + return FullTextChangeTrackingMode.OffWithNoPopulation; + default: + return FullTextChangeTrackingMode.Default; + } + } + + /// + /// Determines whether specific table used as sequence. + /// + /// The table. + /// + /// if table used as sequence; + /// otherwise, . + /// + private bool IsGeneratorTable(Table table) + { + int columnNumber = providerInfo.Supports(ProviderFeatures.InsertDefaultValues) ? 1 : 2; + return table.TableColumns.Count==columnNumber && + table.TableColumns[0].SequenceDescriptor!=null; + } + + + // Constructors + + public SqlModelConverter(UpgradeServiceAccessor services, SchemaExtractionResult sourceModel, + IEnumerable partialIndexes) + { + ArgumentValidator.EnsureArgumentNotNull(services, "handlers"); + ArgumentValidator.EnsureArgumentNotNull(sourceModel, "sourceModel"); + ArgumentValidator.EnsureArgumentNotNull(partialIndexes, "partialIndexes"); + + this.sourceModel = sourceModel; + + resolver = services.MappingResolver; + providerInfo = services.ProviderInfo; + driver = services.StorageDriver; + + partialIndexMap = new PartialIndexInfoMap(resolver, partialIndexes); + } + + #region Not supported + + /// + /// Method is not supported. + protected override IPathNode VisitUniqueConstraint(UniqueConstraint constraint) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitIndexColumn(IndexColumn indexColumn) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitCharacterSet(CharacterSet characterSet) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitCollation(Collation collation) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitDataTable(DataTable dataTable) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitDataTableColumn(DataTableColumn dataTableColumn) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitDomain(Xtensive.Sql.Model.Domain domain) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitHashPartition(HashPartition hashPartition) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitListPartition(ListPartition listPartition) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitPartition(Partition partition) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitPartitionDescriptor(PartitionDescriptor partitionDescriptor) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitPartitionFunction(PartitionFunction partitionFunction) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitPartitionSchema(PartitionSchema partitionSchema) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitTableConstraint(TableConstraint constraint) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitDomainConstraint(DomainConstraint constraint) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitConstraint(Constraint constraint) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitCheckConstraint(CheckConstraint constraint) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitRangePartition(RangePartition rangePartition) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitSequenceDescriptor(SequenceDescriptor sequenceDescriptor) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitTemporaryTable(TemporaryTable temporaryTable) + { + // http://support.x-tensive.com/question/3643/oracle-database-domainbuild-throws-notsupportedexception + return null; + } + + /// + /// Method is not supported. + protected override IPathNode VisitTranslation(Translation translation) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitView(View view) + { + throw new NotSupportedException(); + } + + /// + /// Method is not supported. + protected override IPathNode VisitViewColumn(ViewColumn viewColumn) + { + throw new NotSupportedException(); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorker.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorker.cs index 9240274f81..5845f0b66d 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorker.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorker.cs @@ -1,134 +1,134 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.15 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Upgrade -{ - internal static class SqlWorker - { - public static Func Create(UpgradeServiceAccessor services, SqlWorkerTask task) - { - return () => Run(services, task); - } - - private static SqlWorkerResult Run(UpgradeServiceAccessor services, SqlWorkerTask task) - { - var result = new SqlWorkerResult(); - var executor = new SqlExecutor(services.StorageDriver, services.Connection); - if ((task & SqlWorkerTask.DropSchema) > 0) - DropSchema(services, executor); - if ((task & SqlWorkerTask.ExtractSchema) > 0) - result.Schema = ExtractSchema(services, executor); - if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0) - ExtractMetadata(services, executor, result, task); - - return result; - } - - private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor executor, SqlWorkerResult result, SqlWorkerTask task) - { - var set = new MetadataSet(); - var mapping = new MetadataMapping(services.StorageDriver, services.NameBuilder); - var metadataExtractor = new MetadataExtractor(mapping, executor); - foreach (var metadataTask in services.MappingResolver.GetMetadataTasks() - .Where(metadataTask => !ShouldSkipMetadataExtraction(mapping, result, metadataTask))) { - try { - if (task.HasFlag(SqlWorkerTask.ExtractMetadataAssemblies)) - metadataExtractor.ExtractAssemblies(set, metadataTask); - if (task.HasFlag(SqlWorkerTask.ExtractMetadataTypes)) - metadataExtractor.ExtractTypes(set, metadataTask); - if (task.HasFlag(SqlWorkerTask.ExtractMetadataExtension)) - metadataExtractor.ExtractExtensions(set, metadataTask); - } - catch (Exception exception) { - UpgradeLog.Warning(Strings.LogFailedToExtractMetadataFromXYZ, metadataTask.Catalog, metadataTask.Schema, exception); - } - } - result.Metadata = set; - } - - private static bool ShouldSkipMetadataExtraction(MetadataMapping mapping, SqlWorkerResult result, SqlExtractionTask task) - { - if (result.Schema==null) - return false; - - var tables = GetSchemaTables(result, task); - return tables[mapping.Assembly]==null && tables[mapping.Type]==null && tables[mapping.Extension]==null; - } - - private static PairedNodeCollection GetSchemaTables(SqlWorkerResult result, SqlExtractionTask task) - { - var catalog = GetCatalog(result, task.Catalog); - var schema = GetSchema(catalog, task.Schema); - return schema.Tables; - } - - private static Catalog GetCatalog(SqlWorkerResult result, string catalogName) - { - if (catalogName.IsNullOrEmpty()) - return result.Schema.Catalogs.Single(c => c.Name==catalogName); - return result.Schema.Catalogs[catalogName]; - } - - private static Schema GetSchema(Catalog catalog, string schemaName) - { - if (schemaName.IsNullOrEmpty()) - return catalog.Schemas.Single(s => s.Name==schemaName); - return catalog.Schemas[schemaName]; - } - - private static SchemaExtractionResult ExtractSchema(UpgradeServiceAccessor services, ISqlExecutor executor) - { - var schema = new SchemaExtractionResult(executor.Extract(services.MappingResolver.GetSchemaTasks())); - return new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle(); - } - - private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor executor) - { - var driver = services.StorageDriver; - var extractionResult = ExtractSchema(services, executor); - var schemas = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToList(); - var tables = schemas.SelectMany(s => s.Tables).ToList(); - var sequences = schemas.SelectMany(s => s.Sequences); - - DropForeignKeys(driver, tables, executor); - DropTables(driver, tables, executor); - DropSequences(driver, sequences, executor); - } - - private static void DropSequences(StorageDriver driver, IEnumerable sequences, ISqlExecutor executor) - { - var statements = sequences - .Select(s => driver.Compile(SqlDdl.Drop(s)).GetCommandText()) - .ToList(); - executor.ExecuteMany(statements); - } - - private static void DropTables(StorageDriver driver, IEnumerable
tables, ISqlExecutor executor) - { - var statements = tables - .Select(t => driver.Compile(SqlDdl.Drop(t)).GetCommandText()) - .ToList(); - executor.ExecuteMany(statements); - } - - private static void DropForeignKeys(StorageDriver driver, IEnumerable
tables, ISqlExecutor executor) - { - var statements = tables - .SelectMany(t => t.TableConstraints.OfType()) - .Select(fk => driver.Compile(SqlDdl.Alter(fk.Table, SqlDdl.DropConstraint(fk))).GetCommandText()) - .ToList(); - executor.ExecuteMany(statements); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.15 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade +{ + internal static class SqlWorker + { + public static Func Create(UpgradeServiceAccessor services, SqlWorkerTask task) + { + return () => Run(services, task); + } + + private static SqlWorkerResult Run(UpgradeServiceAccessor services, SqlWorkerTask task) + { + var result = new SqlWorkerResult(); + var executor = new SqlExecutor(services.StorageDriver, services.Connection); + if ((task & SqlWorkerTask.DropSchema) > 0) + DropSchema(services, executor); + if ((task & SqlWorkerTask.ExtractSchema) > 0) + result.Schema = ExtractSchema(services, executor); + if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0) + ExtractMetadata(services, executor, result, task); + + return result; + } + + private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor executor, SqlWorkerResult result, SqlWorkerTask task) + { + var set = new MetadataSet(); + var mapping = new MetadataMapping(services.StorageDriver, services.NameBuilder); + var metadataExtractor = new MetadataExtractor(mapping, executor); + foreach (var metadataTask in services.MappingResolver.GetMetadataTasks() + .Where(metadataTask => !ShouldSkipMetadataExtraction(mapping, result, metadataTask))) { + try { + if (task.HasFlag(SqlWorkerTask.ExtractMetadataAssemblies)) + metadataExtractor.ExtractAssemblies(set, metadataTask); + if (task.HasFlag(SqlWorkerTask.ExtractMetadataTypes)) + metadataExtractor.ExtractTypes(set, metadataTask); + if (task.HasFlag(SqlWorkerTask.ExtractMetadataExtension)) + metadataExtractor.ExtractExtensions(set, metadataTask); + } + catch (Exception exception) { + UpgradeLog.Warning(Strings.LogFailedToExtractMetadataFromXYZ, metadataTask.Catalog, metadataTask.Schema, exception); + } + } + result.Metadata = set; + } + + private static bool ShouldSkipMetadataExtraction(MetadataMapping mapping, SqlWorkerResult result, SqlExtractionTask task) + { + if (result.Schema==null) + return false; + + var tables = GetSchemaTables(result, task); + return tables[mapping.Assembly]==null && tables[mapping.Type]==null && tables[mapping.Extension]==null; + } + + private static PairedNodeCollection GetSchemaTables(SqlWorkerResult result, SqlExtractionTask task) + { + var catalog = GetCatalog(result, task.Catalog); + var schema = GetSchema(catalog, task.Schema); + return schema.Tables; + } + + private static Catalog GetCatalog(SqlWorkerResult result, string catalogName) + { + if (catalogName.IsNullOrEmpty()) + return result.Schema.Catalogs.Single(c => c.Name==catalogName); + return result.Schema.Catalogs[catalogName]; + } + + private static Schema GetSchema(Catalog catalog, string schemaName) + { + if (schemaName.IsNullOrEmpty()) + return catalog.Schemas.Single(s => s.Name==schemaName); + return catalog.Schemas[schemaName]; + } + + private static SchemaExtractionResult ExtractSchema(UpgradeServiceAccessor services, ISqlExecutor executor) + { + var schema = new SchemaExtractionResult(executor.Extract(services.MappingResolver.GetSchemaTasks())); + return new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle(); + } + + private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor executor) + { + var driver = services.StorageDriver; + var extractionResult = ExtractSchema(services, executor); + var schemas = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToList(); + var tables = schemas.SelectMany(s => s.Tables).ToList(); + var sequences = schemas.SelectMany(s => s.Sequences); + + DropForeignKeys(driver, tables, executor); + DropTables(driver, tables, executor); + DropSequences(driver, sequences, executor); + } + + private static void DropSequences(StorageDriver driver, IEnumerable sequences, ISqlExecutor executor) + { + var statements = sequences + .Select(s => driver.Compile(SqlDdl.Drop(s)).GetCommandText()) + .ToList(); + executor.ExecuteMany(statements); + } + + private static void DropTables(StorageDriver driver, IEnumerable
tables, ISqlExecutor executor) + { + var statements = tables + .Select(t => driver.Compile(SqlDdl.Drop(t)).GetCommandText()) + .ToList(); + executor.ExecuteMany(statements); + } + + private static void DropForeignKeys(StorageDriver driver, IEnumerable
tables, ISqlExecutor executor) + { + var statements = tables + .SelectMany(t => t.TableConstraints.OfType()) + .Select(fk => driver.Compile(SqlDdl.Alter(fk.Table, SqlDdl.DropConstraint(fk))).GetCommandText()) + .ToList(); + executor.ExecuteMany(statements); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerResult.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerResult.cs index 1221f8bbaa..8e2d9c9f2c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerResult.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerResult.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.15 - -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class SqlWorkerResult - { - public SchemaExtractionResult Schema { get; set; } - - public MetadataSet Metadata { get; set; } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.15 + +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class SqlWorkerResult + { + public SchemaExtractionResult Schema { get; set; } + + public MetadataSet Metadata { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerTask.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerTask.cs index 164618e06e..6212a2ec77 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerTask.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorkerTask.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.15 - -using System; - -namespace Xtensive.Orm.Upgrade -{ - [Flags] - internal enum SqlWorkerTask - { - None = 0, - DropSchema = 1 << 0, - ExtractSchema = 1 << 1, - ExtractMetadataTypes = 1 << 2, - ExtractMetadataAssemblies = 1 << 3, - ExtractMetadataExtension = 1 << 4, - ExtractMetadata = ExtractMetadataAssemblies | ExtractMetadataExtension | ExtractMetadataTypes - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.15 + +using System; + +namespace Xtensive.Orm.Upgrade +{ + [Flags] + internal enum SqlWorkerTask + { + None = 0, + DropSchema = 1 << 0, + ExtractSchema = 1 << 1, + ExtractMetadataTypes = 1 << 2, + ExtractMetadataAssemblies = 1 << 3, + ExtractMetadataExtension = 1 << 4, + ExtractMetadata = ExtractMetadataAssemblies | ExtractMetadataExtension | ExtractMetadataTypes + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/StageModelFilter.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/StageModelFilter.cs index dbe144285f..87eee0e64f 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/StageModelFilter.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/StageModelFilter.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.14 - -using System; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class StageModelFilter : IModelFilter - { - private readonly ReadOnlyDictionary handlers; - private readonly UpgradeStage stage; - - public bool IsFieldAvailable(PropertyInfo field) - { - var assembly = field.DeclaringType.Assembly; - return handlers.ContainsKey(assembly) && handlers[assembly].IsFieldAvailable(field, stage); - } - - public bool IsTypeAvailable(Type type) - { - var assembly = type.Assembly; - return handlers.ContainsKey(assembly) - && DomainTypeRegistry.IsPersistentType(type) - && handlers[assembly].IsTypeAvailable(type, stage); - } - - // Constructors - - public StageModelFilter(ReadOnlyDictionary handlers, UpgradeStage stage) - { - ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); - - this.handlers = handlers; - this.stage = stage; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.14 + +using System; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class StageModelFilter : IModelFilter + { + private readonly ReadOnlyDictionary handlers; + private readonly UpgradeStage stage; + + public bool IsFieldAvailable(PropertyInfo field) + { + var assembly = field.DeclaringType.Assembly; + return handlers.ContainsKey(assembly) && handlers[assembly].IsFieldAvailable(field, stage); + } + + public bool IsTypeAvailable(Type type) + { + var assembly = type.Assembly; + return handlers.ContainsKey(assembly) + && DomainTypeRegistry.IsPersistentType(type) + && handlers[assembly].IsTypeAvailable(type, stage); + } + + // Constructors + + public StageModelFilter(ReadOnlyDictionary handlers, UpgradeStage stage) + { + ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); + + this.handlers = handlers; + this.stage = stage; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/TypeIdProvider.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/TypeIdProvider.cs index c9695e824c..37fcf993d8 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/TypeIdProvider.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/TypeIdProvider.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.19 - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Model; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class TypeIdProvider : ITypeIdProvider - { - private readonly UpgradeContext context; - - public int GetTypeId(Type type) - { - var mainTypeIdMap = context.FullTypeMap; - var additionalTypeIdMap = context.UserDefinedTypeMap; - if (mainTypeIdMap == null && additionalTypeIdMap.Count==0) - return TypeInfo.NoTypeId; - var typeName = type.GetFullName(); - int typeId = TypeInfo.NoTypeId; - if (context.Stage==UpgradeStage.Upgrading || context.UpgradeMode==DomainUpgradeMode.Validate) { - var mapping = context.UpgradedTypesMapping; - if (mapping!=null) { - string oldTypeName; - if (mapping.TryGetValue(typeName, out oldTypeName)) - return FindTypeIdInBothMapSources(mainTypeIdMap, additionalTypeIdMap, oldTypeName); - } - } - return FindTypeIdInBothMapSources(mainTypeIdMap, additionalTypeIdMap, typeName); - - } - - private int FindTypeIdInBothMapSources(IDictionary mainSource, IDictionary additionalSource, string typeName) - { - int typeId = TypeInfo.NoTypeId; - if (mainSource!=null) - typeId = FindTypeId(mainSource, typeName); - if (typeId!=TypeInfo.NoTypeId) - return typeId; - if (additionalSource!=null) - return FindTypeId(additionalSource, typeName); - return TypeInfo.NoTypeId; - } - - private int FindTypeId(IDictionary typeIdMap, string typeName) - { - int typeId; - return typeIdMap.TryGetValue(typeName, out typeId) ? typeId : TypeInfo.NoTypeId; - } - - - // Constructors - - public TypeIdProvider(UpgradeContext context) - { - ArgumentValidator.EnsureArgumentNotNull(context, "context"); - this.context = context; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.19 + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Model; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class TypeIdProvider : ITypeIdProvider + { + private readonly UpgradeContext context; + + public int GetTypeId(Type type) + { + var mainTypeIdMap = context.FullTypeMap; + var additionalTypeIdMap = context.UserDefinedTypeMap; + if (mainTypeIdMap == null && additionalTypeIdMap.Count==0) + return TypeInfo.NoTypeId; + var typeName = type.GetFullName(); + int typeId = TypeInfo.NoTypeId; + if (context.Stage==UpgradeStage.Upgrading || context.UpgradeMode==DomainUpgradeMode.Validate) { + var mapping = context.UpgradedTypesMapping; + if (mapping!=null) { + string oldTypeName; + if (mapping.TryGetValue(typeName, out oldTypeName)) + return FindTypeIdInBothMapSources(mainTypeIdMap, additionalTypeIdMap, oldTypeName); + } + } + return FindTypeIdInBothMapSources(mainTypeIdMap, additionalTypeIdMap, typeName); + + } + + private int FindTypeIdInBothMapSources(IDictionary mainSource, IDictionary additionalSource, string typeName) + { + int typeId = TypeInfo.NoTypeId; + if (mainSource!=null) + typeId = FindTypeId(mainSource, typeName); + if (typeId!=TypeInfo.NoTypeId) + return typeId; + if (additionalSource!=null) + return FindTypeId(additionalSource, typeName); + return TypeInfo.NoTypeId; + } + + private int FindTypeId(IDictionary typeIdMap, string typeName) + { + int typeId; + return typeIdMap.TryGetValue(typeName, out typeId) ? typeId : TypeInfo.NoTypeId; + } + + + // Constructors + + public TypeIdProvider(UpgradeContext context) + { + ArgumentValidator.EnsureArgumentNotNull(context, "context"); + this.context = context; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeActionSequenceBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeActionSequenceBuilder.cs index 8f51c479d7..06137103d2 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeActionSequenceBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeActionSequenceBuilder.cs @@ -1,80 +1,80 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.18 - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Orm.Providers; -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class UpgradeActionSequenceBuilder - { - private readonly StorageDriver driver; - private readonly List output; - - public SqlUpgradeStage Stage { get; private set; } - - public UpgradeActionSequence Result { get; private set; } - - public void BreakBatch() - { - output.Add(string.Empty); - } - - public void RegisterCommand(ISqlCompileUnit command) - { - output.Add(driver.Compile(command).GetCommandText()); - } - - public UpgradeActionSequenceBuilder ForStage(SqlUpgradeStage stage) - { - return stage==Stage ? this : new UpgradeActionSequenceBuilder(driver, Result, stage); - } - - private static List SelectOutput(UpgradeActionSequence result, SqlUpgradeStage stage) - { - switch (stage) { - case SqlUpgradeStage.NonTransactionalProlog: - return result.NonTransactionalPrologCommands; - case SqlUpgradeStage.NonTransactionalEpilog: - return result.NonTransactionalEpilogCommands; - case SqlUpgradeStage.PreCleanupData: - return result.PreCleanupDataCommands; - case SqlUpgradeStage.CleanupData: - return result.CleanupDataCommands; - case SqlUpgradeStage.PreUpgrade: - return result.PreUpgradeCommands; - case SqlUpgradeStage.Upgrade: - return result.UpgradeCommands; - case SqlUpgradeStage.CopyData: - return result.CopyDataCommands; - case SqlUpgradeStage.PostCopyData: - return result.PostCopyDataCommands; - case SqlUpgradeStage.Cleanup: - return result.CleanupCommands; - default: - throw new ArgumentOutOfRangeException("stage"); - } - } - - // Constructors - - public UpgradeActionSequenceBuilder(StorageDriver driver, UpgradeActionSequence result, SqlUpgradeStage stage) - { - ArgumentValidator.EnsureArgumentNotNull(driver, "driver"); - ArgumentValidator.EnsureArgumentNotNull(result, "result"); - - this.driver = driver; - - output = SelectOutput(result, stage); - - Result = result; - Stage = stage; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.18 + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Orm.Providers; +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class UpgradeActionSequenceBuilder + { + private readonly StorageDriver driver; + private readonly List output; + + public SqlUpgradeStage Stage { get; private set; } + + public UpgradeActionSequence Result { get; private set; } + + public void BreakBatch() + { + output.Add(string.Empty); + } + + public void RegisterCommand(ISqlCompileUnit command) + { + output.Add(driver.Compile(command).GetCommandText()); + } + + public UpgradeActionSequenceBuilder ForStage(SqlUpgradeStage stage) + { + return stage==Stage ? this : new UpgradeActionSequenceBuilder(driver, Result, stage); + } + + private static List SelectOutput(UpgradeActionSequence result, SqlUpgradeStage stage) + { + switch (stage) { + case SqlUpgradeStage.NonTransactionalProlog: + return result.NonTransactionalPrologCommands; + case SqlUpgradeStage.NonTransactionalEpilog: + return result.NonTransactionalEpilogCommands; + case SqlUpgradeStage.PreCleanupData: + return result.PreCleanupDataCommands; + case SqlUpgradeStage.CleanupData: + return result.CleanupDataCommands; + case SqlUpgradeStage.PreUpgrade: + return result.PreUpgradeCommands; + case SqlUpgradeStage.Upgrade: + return result.UpgradeCommands; + case SqlUpgradeStage.CopyData: + return result.CopyDataCommands; + case SqlUpgradeStage.PostCopyData: + return result.PostCopyDataCommands; + case SqlUpgradeStage.Cleanup: + return result.CleanupCommands; + default: + throw new ArgumentOutOfRangeException("stage"); + } + } + + // Constructors + + public UpgradeActionSequenceBuilder(StorageDriver driver, UpgradeActionSequence result, SqlUpgradeStage stage) + { + ArgumentValidator.EnsureArgumentNotNull(driver, "driver"); + ArgumentValidator.EnsureArgumentNotNull(result, "result"); + + this.driver = driver; + + output = SelectOutput(result, stage); + + Result = result; + Stage = stage; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintValidator.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintValidator.cs index 4fd59630b9..fbab6d261b 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintValidator.cs @@ -1,171 +1,171 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.21 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Upgrade.Internals.Interfaces; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Upgrade.Internals -{ - internal sealed class UpgradeHintValidator : IUpgradeHintValidator - { - private readonly StoredDomainModel currentModel; - private readonly StoredDomainModel extractedModel; - private readonly Dictionary typeMapping; - private readonly Dictionary reverseTypeMapping; - - public void Validate(NativeTypeClassifier hintsToValidate) - { - ValidateRenameTypeHints(hintsToValidate.GetItems()); - ValidateRemoveTypeHints(hintsToValidate.GetItems()); - ValidateRenameFieldHints(hintsToValidate.GetItems()); - ValidateRemoveFieldHints(hintsToValidate.GetItems().Where(h => !h.IsExplicit)); - ValidateCopyFieldHints(hintsToValidate.GetItems()); - } - - private void ValidateRenameTypeHints(IEnumerable hints) - { - var sourceTypes = new Dictionary(); - var targetTypes = new Dictionary(); - foreach (var hint in hints) { - var newTypeName = hint.NewType.GetFullName(); - var oldTypeName = hint.OldType; - // Checking that types exists in models - if (!currentModel.Types.Any(type => type.UnderlyingType==newTypeName)) - throw TypeNotFound(hint.NewType.GetFullName()); - if (!extractedModel.Types.Any(type => type.UnderlyingType==oldTypeName)) - throw TypeNotFound(hint.OldType); - // Each original type should be used only once - // Each result type should be used only once - RenameTypeHint evilHint; - if (sourceTypes.TryGetValue(hint.OldType, out evilHint)) - throw HintConflict(hint, evilHint); - if (targetTypes.TryGetValue(hint.NewType, out evilHint)) - throw HintConflict(hint, evilHint); - sourceTypes.Add(hint.OldType, hint); - targetTypes.Add(hint.NewType, hint); - } - } - - private void ValidateRenameFieldHints(IEnumerable hints) - { - var sourceFields = new Dictionary, RenameFieldHint>(); - var targetFields = new Dictionary, RenameFieldHint>(); - foreach (var hint in hints) { - // Both target and source fields should exist - var targetTypeName = hint.TargetType.GetFullName(); - var targetType = currentModel.Types.SingleOrDefault(type => type.UnderlyingType == targetTypeName); - if (targetType==null) - throw TypeNotFound(targetTypeName); - var sourceType = reverseTypeMapping[targetType]; - var sourceTypeName = sourceType.UnderlyingType; - if (sourceType.GetField(hint.OldFieldName)==null) - throw FieldNotFound(sourceTypeName, hint.OldFieldName); - if (targetType.GetField(hint.NewFieldName)==null) - throw FieldNotFound(targetTypeName, hint.NewFieldName); - // Each source field should be used only once - // Each destination field should be used only once - RenameFieldHint evilHint; - var sourceField = new Pair(hint.TargetType, hint.OldFieldName); - var targetField = new Pair(hint.TargetType, hint.NewFieldName); - if (sourceFields.TryGetValue(sourceField, out evilHint)) - throw HintConflict(hint, evilHint); - if (targetFields.TryGetValue(targetField, out evilHint)) - throw HintConflict(hint, evilHint); - sourceFields.Add(sourceField, hint); - targetFields.Add(targetField, hint); - } - } - - private void ValidateCopyFieldHints(IEnumerable hints) - { - foreach (var hint in hints) { - // Checking source type and field - var sourceTypeName = hint.SourceType; - var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType==sourceTypeName); - if (sourceType==null) - throw TypeNotFound(sourceTypeName); - if (!sourceType.AllFields.Any(field => field.Name==hint.SourceField)) - throw FieldNotFound(sourceTypeName, hint.SourceField); - // Checking destination type and field - var targetTypeName = hint.TargetType.GetFullName(); - var targetType = currentModel.Types.SingleOrDefault(type => type.UnderlyingType == targetTypeName); - if (targetType==null) - throw TypeNotFound(targetTypeName); - if (!targetType.AllFields.Any(field => field.Name==hint.TargetField)) - throw FieldNotFound(targetTypeName, hint.TargetField); - } - } - - private void ValidateRemoveFieldHints(IEnumerable hints) - { - foreach (var hint in hints) { - // Checking source type and field - var sourceTypeName = hint.Type; - var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType == sourceTypeName); - if (sourceType==null) - throw TypeNotFound(sourceTypeName); - - // Handling structure field - if (hint.Field.Contains(".", StringComparison.Ordinal)) { - StoredFieldInfo storedField; - string[] path = hint.Field.Split('.'); - var fields = sourceType.AllFields; - string fieldName = string.Empty; - for (int i = 0; i < path.Length; i++) { - fieldName += string.IsNullOrEmpty(fieldName) ? path[i] : "." + path[i]; - string parameter = fieldName; - storedField = fields.SingleOrDefault(field => field.Name==parameter); - if (storedField==null) - throw FieldNotFound(sourceTypeName, hint.Field); - fields = storedField.Fields; - } - } - else if (!sourceType.AllFields.Any(field => field.Name==hint.Field)) - throw FieldNotFound(sourceTypeName, hint.Field); - } - } - - private void ValidateRemoveTypeHints(IEnumerable hints) - { - foreach (var hint in hints) { - // Checking source type - var sourceTypeName = hint.Type; - var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType==sourceTypeName); - if (sourceType==null) - throw TypeNotFound(sourceTypeName); - } - } - - private static InvalidOperationException TypeNotFound(string name) - { - return new InvalidOperationException(string.Format(Strings.ExTypeXIsNotFound, name)); - } - - private static InvalidOperationException FieldNotFound(string typeName, string fieldName) - { - return new InvalidOperationException(string.Format(Strings.ExFieldXYIsNotFound, typeName, fieldName)); - } - - private static InvalidOperationException HintConflict(UpgradeHint hintOne, UpgradeHint hintTwo) - { - return new InvalidOperationException(string.Format(Strings.ExHintXIsConflictingWithHintY, hintOne, hintTwo)); - } - - public UpgradeHintValidator(StoredDomainModel currentModel, StoredDomainModel extractedModel, Dictionary typeMapping, Dictionary reverseTypeMapping) - { - this.currentModel = currentModel; - this.extractedModel = extractedModel; - this.typeMapping = typeMapping; - this.reverseTypeMapping = reverseTypeMapping; - } - } +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.21 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Upgrade.Internals.Interfaces; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Upgrade.Internals +{ + internal sealed class UpgradeHintValidator : IUpgradeHintValidator + { + private readonly StoredDomainModel currentModel; + private readonly StoredDomainModel extractedModel; + private readonly Dictionary typeMapping; + private readonly Dictionary reverseTypeMapping; + + public void Validate(NativeTypeClassifier hintsToValidate) + { + ValidateRenameTypeHints(hintsToValidate.GetItems()); + ValidateRemoveTypeHints(hintsToValidate.GetItems()); + ValidateRenameFieldHints(hintsToValidate.GetItems()); + ValidateRemoveFieldHints(hintsToValidate.GetItems().Where(h => !h.IsExplicit)); + ValidateCopyFieldHints(hintsToValidate.GetItems()); + } + + private void ValidateRenameTypeHints(IEnumerable hints) + { + var sourceTypes = new Dictionary(); + var targetTypes = new Dictionary(); + foreach (var hint in hints) { + var newTypeName = hint.NewType.GetFullName(); + var oldTypeName = hint.OldType; + // Checking that types exists in models + if (!currentModel.Types.Any(type => type.UnderlyingType==newTypeName)) + throw TypeNotFound(hint.NewType.GetFullName()); + if (!extractedModel.Types.Any(type => type.UnderlyingType==oldTypeName)) + throw TypeNotFound(hint.OldType); + // Each original type should be used only once + // Each result type should be used only once + RenameTypeHint evilHint; + if (sourceTypes.TryGetValue(hint.OldType, out evilHint)) + throw HintConflict(hint, evilHint); + if (targetTypes.TryGetValue(hint.NewType, out evilHint)) + throw HintConflict(hint, evilHint); + sourceTypes.Add(hint.OldType, hint); + targetTypes.Add(hint.NewType, hint); + } + } + + private void ValidateRenameFieldHints(IEnumerable hints) + { + var sourceFields = new Dictionary, RenameFieldHint>(); + var targetFields = new Dictionary, RenameFieldHint>(); + foreach (var hint in hints) { + // Both target and source fields should exist + var targetTypeName = hint.TargetType.GetFullName(); + var targetType = currentModel.Types.SingleOrDefault(type => type.UnderlyingType == targetTypeName); + if (targetType==null) + throw TypeNotFound(targetTypeName); + var sourceType = reverseTypeMapping[targetType]; + var sourceTypeName = sourceType.UnderlyingType; + if (sourceType.GetField(hint.OldFieldName)==null) + throw FieldNotFound(sourceTypeName, hint.OldFieldName); + if (targetType.GetField(hint.NewFieldName)==null) + throw FieldNotFound(targetTypeName, hint.NewFieldName); + // Each source field should be used only once + // Each destination field should be used only once + RenameFieldHint evilHint; + var sourceField = new Pair(hint.TargetType, hint.OldFieldName); + var targetField = new Pair(hint.TargetType, hint.NewFieldName); + if (sourceFields.TryGetValue(sourceField, out evilHint)) + throw HintConflict(hint, evilHint); + if (targetFields.TryGetValue(targetField, out evilHint)) + throw HintConflict(hint, evilHint); + sourceFields.Add(sourceField, hint); + targetFields.Add(targetField, hint); + } + } + + private void ValidateCopyFieldHints(IEnumerable hints) + { + foreach (var hint in hints) { + // Checking source type and field + var sourceTypeName = hint.SourceType; + var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType==sourceTypeName); + if (sourceType==null) + throw TypeNotFound(sourceTypeName); + if (!sourceType.AllFields.Any(field => field.Name==hint.SourceField)) + throw FieldNotFound(sourceTypeName, hint.SourceField); + // Checking destination type and field + var targetTypeName = hint.TargetType.GetFullName(); + var targetType = currentModel.Types.SingleOrDefault(type => type.UnderlyingType == targetTypeName); + if (targetType==null) + throw TypeNotFound(targetTypeName); + if (!targetType.AllFields.Any(field => field.Name==hint.TargetField)) + throw FieldNotFound(targetTypeName, hint.TargetField); + } + } + + private void ValidateRemoveFieldHints(IEnumerable hints) + { + foreach (var hint in hints) { + // Checking source type and field + var sourceTypeName = hint.Type; + var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType == sourceTypeName); + if (sourceType==null) + throw TypeNotFound(sourceTypeName); + + // Handling structure field + if (hint.Field.Contains(".", StringComparison.Ordinal)) { + StoredFieldInfo storedField; + string[] path = hint.Field.Split('.'); + var fields = sourceType.AllFields; + string fieldName = string.Empty; + for (int i = 0; i < path.Length; i++) { + fieldName += string.IsNullOrEmpty(fieldName) ? path[i] : "." + path[i]; + string parameter = fieldName; + storedField = fields.SingleOrDefault(field => field.Name==parameter); + if (storedField==null) + throw FieldNotFound(sourceTypeName, hint.Field); + fields = storedField.Fields; + } + } + else if (!sourceType.AllFields.Any(field => field.Name==hint.Field)) + throw FieldNotFound(sourceTypeName, hint.Field); + } + } + + private void ValidateRemoveTypeHints(IEnumerable hints) + { + foreach (var hint in hints) { + // Checking source type + var sourceTypeName = hint.Type; + var sourceType = extractedModel.Types.SingleOrDefault(type => type.UnderlyingType==sourceTypeName); + if (sourceType==null) + throw TypeNotFound(sourceTypeName); + } + } + + private static InvalidOperationException TypeNotFound(string name) + { + return new InvalidOperationException(string.Format(Strings.ExTypeXIsNotFound, name)); + } + + private static InvalidOperationException FieldNotFound(string typeName, string fieldName) + { + return new InvalidOperationException(string.Format(Strings.ExFieldXYIsNotFound, typeName, fieldName)); + } + + private static InvalidOperationException HintConflict(UpgradeHint hintOne, UpgradeHint hintTwo) + { + return new InvalidOperationException(string.Format(Strings.ExHintXIsConflictingWithHintY, hintOne, hintTwo)); + } + + public UpgradeHintValidator(StoredDomainModel currentModel, StoredDomainModel extractedModel, Dictionary typeMapping, Dictionary reverseTypeMapping) + { + this.currentModel = currentModel; + this.extractedModel = extractedModel; + this.typeMapping = typeMapping; + this.reverseTypeMapping = reverseTypeMapping; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessingResult.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessingResult.cs index e3e77d5fe1..55baa70721 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessingResult.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessingResult.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.22 - -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Orm.Model.Stored; - -namespace Xtensive.Orm.Upgrade.Internals -{ - internal sealed class UpgradeHintsProcessingResult - { - public NativeTypeClassifier Hints { get; private set; } - - public Dictionary TypeMapping { get; private set; } - - public Dictionary ReverseTypeMapping { get; private set; } - - public Dictionary FieldMapping { get; private set; } - - public Dictionary ReverseFieldMapping { get; private set; } - - public Dictionary CurrentModelTypes { get; private set; } - - public List SuspiciousTypes { get; set; } - - public bool AreAllTypesMapped() - { - return CurrentModelTypes.Count == TypeMapping.Count && CurrentModelTypes.Count==ReverseTypeMapping.Count; - } - - public Dictionary GetUpgradedTypeMap() - { - return ReverseTypeMapping - .ToDictionary(item => item.Key.UnderlyingType, item => item.Value.UnderlyingType); - } - - public UpgradeHintsProcessingResult(NativeTypeClassifier hints, - Dictionary typeMapping, - Dictionary reverseTypeMapping, - Dictionary fieldMapping, - Dictionary reverseFieldMapping, - Dictionary currentModelTypes, - List suspiciousTypes) - { - Hints = hints; - TypeMapping = typeMapping; - ReverseTypeMapping = reverseTypeMapping; - FieldMapping = fieldMapping; - ReverseFieldMapping = reverseFieldMapping; - CurrentModelTypes = currentModelTypes; - SuspiciousTypes = suspiciousTypes; - } - } +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.22 + +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Orm.Model.Stored; + +namespace Xtensive.Orm.Upgrade.Internals +{ + internal sealed class UpgradeHintsProcessingResult + { + public NativeTypeClassifier Hints { get; private set; } + + public Dictionary TypeMapping { get; private set; } + + public Dictionary ReverseTypeMapping { get; private set; } + + public Dictionary FieldMapping { get; private set; } + + public Dictionary ReverseFieldMapping { get; private set; } + + public Dictionary CurrentModelTypes { get; private set; } + + public List SuspiciousTypes { get; set; } + + public bool AreAllTypesMapped() + { + return CurrentModelTypes.Count == TypeMapping.Count && CurrentModelTypes.Count==ReverseTypeMapping.Count; + } + + public Dictionary GetUpgradedTypeMap() + { + return ReverseTypeMapping + .ToDictionary(item => item.Key.UnderlyingType, item => item.Value.UnderlyingType); + } + + public UpgradeHintsProcessingResult(NativeTypeClassifier hints, + Dictionary typeMapping, + Dictionary reverseTypeMapping, + Dictionary fieldMapping, + Dictionary reverseFieldMapping, + Dictionary currentModelTypes, + List suspiciousTypes) + { + Hints = hints; + TypeMapping = typeMapping; + ReverseTypeMapping = reverseTypeMapping; + FieldMapping = fieldMapping; + ReverseFieldMapping = reverseFieldMapping; + CurrentModelTypes = currentModelTypes; + SuspiciousTypes = suspiciousTypes; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessor.cs index 342ce8cc47..f1b59d1f45 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeHintsProcessor.cs @@ -1,565 +1,565 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.01.21 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Model; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Upgrade.Internals.Extensions; -using Xtensive.Orm.Upgrade.Internals.Interfaces; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Orm.Providers; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Upgrade.Internals -{ - internal sealed class UpgradeHintsProcessor : IUpgradeHintsProcessor - { - private readonly NameBuilder nameBuilder; - private readonly MappingResolver resolver; - - private readonly bool autoDetectTypesMovements; - private readonly DomainModel domainModel; - private readonly StoredDomainModel currentModel; - private readonly StoredDomainModel extractedModel; - private readonly StorageModel extractedStorageModel; - private readonly NativeTypeClassifier hints; - - private readonly Dictionary currentTypes; - private readonly Dictionary extractedTypes; - - private readonly Dictionary typeMapping; - private readonly Dictionary reverseTypeMapping; - private readonly Dictionary fieldMapping; - private readonly Dictionary reverseFieldMapping; - - private List suspiciousTypes; - - public UpgradeHintsProcessingResult Process(IEnumerable inputHints) - { - ArgumentValidator.EnsureArgumentNotNull(inputHints, "inputHints"); - ProcessGenericTypeHints(inputHints); - ProcessTypeChanges(); - ProcessFieldChanges(); - ProcessConnectorTypes(); - ProcessFieldMovements(); - - return new UpgradeHintsProcessingResult(hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentTypes, suspiciousTypes); - } - - #region General steps - - private void ProcessGenericTypeHints(IEnumerable inputHints) - { - hints.AddRange(RewriteGenericTypeHints(inputHints)); - } - - private void ProcessTypeChanges() - { - var renameTypeHints = hints.GetItems().ToChainedBuffer(); - var removeTypeHints = hints.GetItems().ToChainedBuffer(); - BuildTypeMapping(renameTypeHints, removeTypeHints); - } - - private void ProcessFieldChanges() - { - var renameFieldHints = hints.GetItems().ToChainedBuffer(); - var changeFieldTypeHints = hints.GetItems().ToChainedBuffer(); - BuildFieldMapping(renameFieldHints, changeFieldTypeHints); - } - - private void ProcessConnectorTypes() - { - BuildConnectorTypeMapping(); - } - - private void ProcessFieldMovements() - { - var moveFieldHints = hints.GetItems().ToChainedBuffer(); - hints.AddRange(RewriteMoveFieldHints(moveFieldHints)); - hints.AddRange(GenerateTypeIdFieldRemoveHintsForConcreteTable()); - } - - #endregion - - #region Process generic type hints stage - /// - /// Rewtires hints for generic types. - /// - private IEnumerable RewriteGenericTypeHints(IEnumerable hints) - { - // Prepare data - Dictionary renamedTypesLookup; - ChainedBuffer renameGenericTypeHints; - ChainedBuffer renameFieldHints; - GetGenericRenameHints(hints, out renamedTypesLookup, out renameGenericTypeHints, out renameFieldHints); - var rewrittenHints = new ChainedBuffer(); - - var genericTypeMapping = BuildGenericTypeMapping(renamedTypesLookup); - BuildRenameHintsForGenericTypes(genericTypeMapping, rewrittenHints); - BuildRenameFieldHintsForGenericTypes(genericTypeMapping, renameFieldHints, rewrittenHints); - - return hints - .Except(renameGenericTypeHints.Cast()) - .Except(renameFieldHints.Cast()) - .Concat(rewrittenHints); - } - - /// - /// Builds generic types mapping. - /// - private List>>> BuildGenericTypeMapping(Dictionary renamedTypesLookup) - { - var oldGenericTypes = extractedModel.GetGenericTypes(); - var newGenericTypes = domainModel.GetGenericTypes(); - - var genericTypeMapping = new List>>>(); - var newTypesLookup = newGenericTypes.GetClasses().ToDictionary(t => t.GetFullName()); - foreach (var oldGenericDefName in oldGenericTypes.GetClasses()) { - var newGenericDefType = GetNewType(oldGenericDefName, newTypesLookup, renamedTypesLookup); - if (newGenericDefType==null) - continue; - foreach (var pair in oldGenericTypes.GetItems(oldGenericDefName)) { - var genericArgumentsMapping = new List>(); - foreach (var oldGenericArgumentType in pair.Second) { - var newGenericArgumentType = GetNewType(oldGenericArgumentType, newTypesLookup, renamedTypesLookup); - if (newGenericArgumentType == null) - break; - genericArgumentsMapping.Add(new Pair(oldGenericArgumentType, newGenericArgumentType)); - } - if (genericArgumentsMapping.Count==pair.Second.Length) - genericTypeMapping.Add(new Triplet>>( - oldGenericDefName, newGenericDefType, genericArgumentsMapping)); - } - } - return genericTypeMapping; - } - - /// - /// Builds for generic types. - /// - private void BuildRenameHintsForGenericTypes(IList>>> genericTypeMapping, ChainedBuffer rewrittenHints) - { - foreach (var triplet in genericTypeMapping) { - var oldGenericArguments = triplet.Third.Select(pair => pair.First).ToArray(); - var newGenericArguments = triplet.Third.Select(pair => pair.Second).ToArray(); - var oldTypeFullName = GetGenericTypeFullName(triplet.First, oldGenericArguments); - var newType = triplet.Second.MakeGenericType(newGenericArguments); - if (oldTypeFullName!=newType.GetFullName()) - rewrittenHints.Add(new RenameTypeHint(oldTypeFullName, newType)); - } - } - - /// - /// Builds for each of renamed field - /// of generic type. - /// - private void BuildRenameFieldHintsForGenericTypes(IEnumerable>>> genericTypeMapping, IEnumerable renameFieldHints, ChainedBuffer rewrittenHints) - { - var genericTypeDefLookup = ( - from triplet in genericTypeMapping - group triplet by triplet.Second.GetGenericTypeDefinition() - into g - select new { Definition = g.Key, Instances = g.ToArray() } - ).ToDictionary(g => g.Definition); - - // Build rename generic type field hints - foreach (var hint in renameFieldHints) { - var newGenericDefType = hint.TargetType; - var instanceGroup = genericTypeDefLookup.GetValueOrDefault(newGenericDefType); - if (instanceGroup==null) - continue; - foreach (var triplet in instanceGroup.Instances) { - var newGenericArguments = triplet.Third.Select(pair => pair.Second).ToArray(); - rewrittenHints.Add(new RenameFieldHint(newGenericDefType.MakeGenericType(newGenericArguments), - hint.OldFieldName, hint.NewFieldName)); - } - } - } - #endregion - - #region Process type changes stage - // Should be diffenent depending of autoDetectTypeMovements - private void BuildTypeMapping(ICollection renameTypeHints, ICollection removeTypeHints) - { - // Excluding EntitySetItem descendants. - // They're not interesting at all for us, since - // these types aren't ever referenced. - var oldModelTypes = extractedModel.GetNonConnectorTypes(); - - var newConnectorTypes = currentModel.Associations - .Select(association => association.ConnectorType) - .Where(type => type!=null) - .ToHashSet(); - - var newModelTypes = currentModel.Types - .Where(type => !newConnectorTypes.Contains(type)) - .ToDictionary(type => type.UnderlyingType); - - var renameLookup = renameTypeHints.ToDictionary(hint => hint.OldType); - var removeLookup = removeTypeHints.ToDictionary(hint => hint.Type); - - // Types that are neither mapped nor removed. - var suspects = new List(); - - // Mapping types - foreach (var oldType in oldModelTypes) { - var removeTypeHint = removeLookup.GetValueOrDefault(oldType.UnderlyingType); - if (removeTypeHint!=null) - continue; - var renameTypeHint = renameLookup.GetValueOrDefault(oldType.UnderlyingType); - var newTypeName = renameTypeHint!=null - ? renameTypeHint.NewType.GetFullName() - : oldType.UnderlyingType; - var newType = newModelTypes.GetValueOrDefault(newTypeName); - if (newType!=null) - MapType(oldType, newType); - else - //todo:// movements detection should be implemented by other processor - //if (autoDetectTypesMovements) - suspects.Add(oldType); - } - - if (suspects.Count==0 || !autoDetectTypesMovements) { - suspiciousTypes = suspects; - return; - } - - // Now we'll lookup by using DO type name instead of CLR type name - // By default DO type name is a CLR type name without namespace - // however this could be adjusted by domain configuration. - // If CLR name is changed but DO name is preserved we should - // automatically process this type without extra hints. - - newModelTypes = newModelTypes.Values.ToDictionary(t => t.Name); - - foreach (var oldType in suspects) { - var newType = newModelTypes.GetValueOrDefault(oldType.Name); - if (newType!=null && !reverseTypeMapping.ContainsKey(newType)) - MapType(oldType, newType); - else - suspiciousTypes.Add(oldType); - } - - } - - #endregion - - #region Process field changes stage - - private void BuildFieldMapping(ICollection renameFieldHints, ICollection changeFieldTypeHints) - { - foreach (var pair in typeMapping) - BuildFieldMapping(renameFieldHints, changeFieldTypeHints, pair.Key, pair.Value); - - // Will be modified, so we need to copy sequence into independant collection - foreach (var pair in fieldMapping.ToChainedBuffer()) - MapNestedFields(pair.Key, pair.Value); - } - - private void BuildFieldMapping(IEnumerable renames, IEnumerable typeChanges, - StoredTypeInfo oldType, StoredTypeInfo newType) - { - var newFields = newType.Fields.ToDictionary(field => field.Name); - foreach (var oldField in oldType.Fields) { - var renameHint = renames.FirstOrDefault(hint => hint.OldFieldName==oldField.Name && hint.TargetType.GetFullName()==newType.UnderlyingType); - var newFieldName = renameHint!=null - ? renameHint.NewFieldName - : oldField.Name; - - var newField = newFields.GetValueOrDefault(newFieldName); - if (newField==null) - continue; - - if (oldField.IsStructure) { - // If it is structure, we map it immediately - MapField(oldField, newField); - continue; - } - - var typeChangeHint = typeChanges - .FirstOrDefault(hint => hint.Type.GetFullName()==newType.UnderlyingType && hint.FieldName==newField.Name); - if (typeChangeHint==null) { - // Check & skip field if type is changed - var newValueTypeName = newField.IsEntitySet - ? newField.ItemType - : newField.ValueType; - var oldValueTypeName = oldField.IsEntitySet - ? oldField.ItemType - : oldField.ValueType; - var newValueType = currentTypes.GetValueOrDefault(newValueTypeName); - var oldValueType = extractedTypes.GetValueOrDefault(oldValueTypeName); - if (newValueType!=null &&oldValueType!=null) { - // We deal with reference field - var mappedOldValueType = typeMapping.GetValueOrDefault(oldValueType); - if (mappedOldValueType==null) - // Mapped to nothing = removed - continue; - if (mappedOldValueType!=newValueType && !newValueType.AllDescendants.Contains(mappedOldValueType)) - // This isn't a Dog -> Animal type mapping - continue; - } - else - // We deal with regular field - if (oldValueTypeName!=newValueTypeName) - continue; - } - MapField(oldField, newField); - } - } - - #endregion - - #region Process connector types stage - - private void BuildConnectorTypeMapping() - { - var oldAssociations = extractedModel.Associations - .Where(association => association.ConnectorType != null); - foreach (var oldAssociation in oldAssociations) { - if (typeMapping.ContainsKey(oldAssociation.ConnectorType)) - continue; - - var oldReferencingField = oldAssociation.ReferencingField; - var oldReferencingType = oldReferencingField.DeclaringType; - - var newReferencingType = typeMapping.GetValueOrDefault(oldReferencingType); - if (newReferencingType==null) - continue; - - var newReferencingField = fieldMapping.GetValueOrDefault(oldReferencingField); - if (newReferencingField==null) - newReferencingField = newReferencingType.Fields - .SingleOrDefault(field => field.Name==oldReferencingField.Name); - if (newReferencingField==null) - continue; - - var newAssociation = currentModel.Associations - .SingleOrDefault(association => association.ReferencingField == newReferencingField); - if (newAssociation==null || newAssociation.ConnectorType==null) - continue; - - MapType(oldAssociation.ConnectorType, newAssociation.ConnectorType); - - var oldMaster = oldAssociation.ConnectorType.AllFields - .Single(field => field.Name == WellKnown.MasterFieldName); - var newMaster = newAssociation.ConnectorType.AllFields - .Single(field => field.Name == WellKnown.MasterFieldName); - var oldSlave = oldAssociation.ConnectorType.AllFields - .Single(field => field.Name == WellKnown.SlaveFieldName); - var newSlave = newAssociation.ConnectorType.AllFields - .Single(field => field.Name == WellKnown.SlaveFieldName); - - MapFieldRecursively(oldMaster, newMaster); - MapFieldRecursively(oldSlave, newSlave); - } - } - - #endregion - - #region Process field movements stage - - private IEnumerable RewriteMoveFieldHints(IEnumerable moveFieldHints) - { - foreach (var hint in moveFieldHints) { - yield return new CopyFieldHint(hint.SourceType, hint.SourceField, hint.TargetType, hint.TargetField); - yield return new RemoveFieldHint(hint.SourceType, hint.SourceField); - } - } - - private IEnumerable GenerateTypeIdFieldRemoveHintsForConcreteTable() - { - // Removes TypeId field ( = column) from hierarchies with ConcreteTable inheritance mapping - var result = new List(); - var relevantTypes = - from pair in typeMapping - let sourceHierarchy = pair.Key.Hierarchy - let targetHierarchy = pair.Value.Hierarchy - where - targetHierarchy!=null && sourceHierarchy!=null - && targetHierarchy.InheritanceSchema==InheritanceSchema.ConcreteTable - select pair.Key; - - foreach (var type in relevantTypes) { - var typeIdField = type.AllFields.SingleOrDefault(f => f.IsTypeId); - if (typeIdField==null) // Table of old type may not contain TypeId - continue; - var targetType = typeMapping[type]; - var targetTypeIdField = targetType.AllFields.SingleOrDefault(f => f.IsTypeId); - if (targetTypeIdField==null) - continue; - if (targetTypeIdField.IsPrimaryKey) - continue; - if (!extractedStorageModel.Tables.Contains(GetTableName(type))) - continue; - if (!extractedStorageModel.Tables[GetTableName(type)].Columns.Contains(typeIdField.MappingName)) - continue; - var hint = new RemoveFieldHint(targetType.UnderlyingType, targetTypeIdField.Name); - - // Generating affected columns list explicitly for a situation when "type" is renamed to "targetType" - if (type != targetType) - { - hint.IsExplicit = true; - hint.AffectedColumns = new ReadOnlyList(new List { - GetColumnPath(targetType, targetTypeIdField.MappingName) - }); - } - result.Add(hint); - } - return result; - } - - #endregion - - private void GetGenericRenameHints(IEnumerable hints, out Dictionary renameTypeHints, out ChainedBuffer renameGenericTypeHints, out ChainedBuffer renameFieldHints) - { - renameTypeHints = new Dictionary(); - renameGenericTypeHints = new ChainedBuffer(); - renameFieldHints = new ChainedBuffer(); - - foreach (var upgradeHint in hints) { - var renameTypeHint = upgradeHint as RenameTypeHint; - if (renameTypeHint!=null) { - renameTypeHints.Add(renameTypeHint.OldType, renameTypeHint); - if (renameTypeHint.NewType.IsGenericTypeDefinition) - renameGenericTypeHints.Add(renameTypeHint); - } - var renameFieldHint = upgradeHint as RenameFieldHint; - if (renameFieldHint!=null && renameFieldHint.TargetType.IsGenericTypeDefinition) - renameFieldHints.Add(renameFieldHint); - } - } - - #region Map methods - private void MapType(StoredTypeInfo oldType, StoredTypeInfo newType) - { - StoredTypeInfo existingNewType; - if (typeMapping.TryGetValue(oldType, out existingNewType)) { - throw new InvalidOperationException(string.Format( - Strings.ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ, - oldType, newType, existingNewType)); - } - typeMapping[oldType] = newType; - reverseTypeMapping[newType] = oldType; - } - - private void MapField(StoredFieldInfo oldField, StoredFieldInfo newField) - { - StoredFieldInfo existingNewField; - if (fieldMapping.TryGetValue(oldField, out existingNewField)) { - throw new InvalidOperationException(string.Format( - Strings.ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ, - oldField, newField, existingNewField)); - } - fieldMapping[oldField] = newField; - reverseFieldMapping[newField] = oldField; - } - - private void MapNestedFields(StoredFieldInfo oldField, StoredFieldInfo newField) - { - var oldNestedFields = ((IEnumerable)oldField.Fields).ToArray(); - if (oldNestedFields.Length==0) - return; - var oldValueType = extractedModel.Types - .Single(type => type.UnderlyingType==oldField.ValueType); - foreach (var oldNestedField in oldNestedFields) { - var oldNestedFieldOriginalName = oldNestedField.OriginalName; - var oldNestedFieldOrigin = oldValueType.AllFields - .Single(field => field.Name==oldNestedFieldOriginalName); - if (!fieldMapping.ContainsKey(oldNestedFieldOrigin)) - continue; - var newNestedFieldOrigin = fieldMapping[oldNestedFieldOrigin]; - var newNestedField = newField.Fields - .Single(field => field.OriginalName==newNestedFieldOrigin.Name); - MapFieldRecursively(oldNestedField, newNestedField); - } - } - - private void MapFieldRecursively(StoredFieldInfo oldField, StoredFieldInfo newField) - { - MapField(oldField, newField); - MapNestedFields(oldField, newField); - } - - #endregion - - #region Helpers - - private string GetTableName(StoredTypeInfo type) - { - return resolver.GetNodeName( - type.MappingDatabase, type.MappingSchema, type.MappingName); - } - - private string GetColumnPath(StoredTypeInfo type, string columnName) - { - var nodeName = GetTableName(type); - // Due to current implementation of domain model FieldInfo.MappingName is not correct, - // it has naming rules unapplied, corresponding ColumnInfo.Name however is correct. - // StoredFieldInfo.MappingName is taken directly from FieldInfo.MappingName and thus is incorrect too. - // We need to apply naming rules here to make it work. - var actualColumnName = nameBuilder.ApplyNamingRules(columnName); - return string.Format("Tables/{0}/Columns/{1}", nodeName, actualColumnName); - } - - private static Type GetNewType(string oldTypeName, Dictionary newTypes, Dictionary hints) - { - RenameTypeHint hint; - Type newType; - return hints.TryGetValue(oldTypeName, out hint) - ? hint.NewType - : (newTypes.TryGetValue(oldTypeName, out newType) ? newType : null); - } - - private static string GetGenericTypeFullName(string genericDefinitionTypeName, string[] genericArgumentNames) - { - return string.Format("{0}<{1}>", genericDefinitionTypeName.Replace("<>", string.Empty), - genericArgumentNames.ToCommaDelimitedString()); - } - #endregion - - // Constructors - - public UpgradeHintsProcessor( - HandlerAccessor handlers, - MappingResolver resolver, - StoredDomainModel currentDomainModel, - StoredDomainModel extractedDomainModel, - StorageModel extractedStorageModel, - bool autoDetectTypesMovements) - { - ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); - ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); - ArgumentValidator.EnsureArgumentNotNull(currentDomainModel, "currentDomainModel"); - ArgumentValidator.EnsureArgumentNotNull(extractedDomainModel, "extractedDomainModel"); - ArgumentValidator.EnsureArgumentNotNull(extractedStorageModel, "extractedStorageModel"); - - typeMapping = new Dictionary(); - reverseTypeMapping = new Dictionary(); - fieldMapping = new Dictionary(); - reverseFieldMapping = new Dictionary(); - - this.resolver = resolver; - nameBuilder = handlers.NameBuilder; - domainModel = handlers.Domain.Model; - - this.extractedStorageModel = extractedStorageModel; - - currentModel = currentDomainModel; - currentTypes = currentModel.Types.ToDictionary(t => t.UnderlyingType); - - extractedModel = extractedDomainModel; - extractedTypes = extractedModel.Types.ToDictionary(t => t.UnderlyingType); - - this.autoDetectTypesMovements = autoDetectTypesMovements; - hints = new NativeTypeClassifier(true); - suspiciousTypes = new List(); - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.01.21 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Model; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Upgrade.Internals.Extensions; +using Xtensive.Orm.Upgrade.Internals.Interfaces; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Orm.Providers; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Upgrade.Internals +{ + internal sealed class UpgradeHintsProcessor : IUpgradeHintsProcessor + { + private readonly NameBuilder nameBuilder; + private readonly MappingResolver resolver; + + private readonly bool autoDetectTypesMovements; + private readonly DomainModel domainModel; + private readonly StoredDomainModel currentModel; + private readonly StoredDomainModel extractedModel; + private readonly StorageModel extractedStorageModel; + private readonly NativeTypeClassifier hints; + + private readonly Dictionary currentTypes; + private readonly Dictionary extractedTypes; + + private readonly Dictionary typeMapping; + private readonly Dictionary reverseTypeMapping; + private readonly Dictionary fieldMapping; + private readonly Dictionary reverseFieldMapping; + + private List suspiciousTypes; + + public UpgradeHintsProcessingResult Process(IEnumerable inputHints) + { + ArgumentValidator.EnsureArgumentNotNull(inputHints, "inputHints"); + ProcessGenericTypeHints(inputHints); + ProcessTypeChanges(); + ProcessFieldChanges(); + ProcessConnectorTypes(); + ProcessFieldMovements(); + + return new UpgradeHintsProcessingResult(hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentTypes, suspiciousTypes); + } + + #region General steps + + private void ProcessGenericTypeHints(IEnumerable inputHints) + { + hints.AddRange(RewriteGenericTypeHints(inputHints)); + } + + private void ProcessTypeChanges() + { + var renameTypeHints = hints.GetItems().ToChainedBuffer(); + var removeTypeHints = hints.GetItems().ToChainedBuffer(); + BuildTypeMapping(renameTypeHints, removeTypeHints); + } + + private void ProcessFieldChanges() + { + var renameFieldHints = hints.GetItems().ToChainedBuffer(); + var changeFieldTypeHints = hints.GetItems().ToChainedBuffer(); + BuildFieldMapping(renameFieldHints, changeFieldTypeHints); + } + + private void ProcessConnectorTypes() + { + BuildConnectorTypeMapping(); + } + + private void ProcessFieldMovements() + { + var moveFieldHints = hints.GetItems().ToChainedBuffer(); + hints.AddRange(RewriteMoveFieldHints(moveFieldHints)); + hints.AddRange(GenerateTypeIdFieldRemoveHintsForConcreteTable()); + } + + #endregion + + #region Process generic type hints stage + /// + /// Rewtires hints for generic types. + /// + private IEnumerable RewriteGenericTypeHints(IEnumerable hints) + { + // Prepare data + Dictionary renamedTypesLookup; + ChainedBuffer renameGenericTypeHints; + ChainedBuffer renameFieldHints; + GetGenericRenameHints(hints, out renamedTypesLookup, out renameGenericTypeHints, out renameFieldHints); + var rewrittenHints = new ChainedBuffer(); + + var genericTypeMapping = BuildGenericTypeMapping(renamedTypesLookup); + BuildRenameHintsForGenericTypes(genericTypeMapping, rewrittenHints); + BuildRenameFieldHintsForGenericTypes(genericTypeMapping, renameFieldHints, rewrittenHints); + + return hints + .Except(renameGenericTypeHints.Cast()) + .Except(renameFieldHints.Cast()) + .Concat(rewrittenHints); + } + + /// + /// Builds generic types mapping. + /// + private List>>> BuildGenericTypeMapping(Dictionary renamedTypesLookup) + { + var oldGenericTypes = extractedModel.GetGenericTypes(); + var newGenericTypes = domainModel.GetGenericTypes(); + + var genericTypeMapping = new List>>>(); + var newTypesLookup = newGenericTypes.GetClasses().ToDictionary(t => t.GetFullName()); + foreach (var oldGenericDefName in oldGenericTypes.GetClasses()) { + var newGenericDefType = GetNewType(oldGenericDefName, newTypesLookup, renamedTypesLookup); + if (newGenericDefType==null) + continue; + foreach (var pair in oldGenericTypes.GetItems(oldGenericDefName)) { + var genericArgumentsMapping = new List>(); + foreach (var oldGenericArgumentType in pair.Second) { + var newGenericArgumentType = GetNewType(oldGenericArgumentType, newTypesLookup, renamedTypesLookup); + if (newGenericArgumentType == null) + break; + genericArgumentsMapping.Add(new Pair(oldGenericArgumentType, newGenericArgumentType)); + } + if (genericArgumentsMapping.Count==pair.Second.Length) + genericTypeMapping.Add(new Triplet>>( + oldGenericDefName, newGenericDefType, genericArgumentsMapping)); + } + } + return genericTypeMapping; + } + + /// + /// Builds for generic types. + /// + private void BuildRenameHintsForGenericTypes(IList>>> genericTypeMapping, ChainedBuffer rewrittenHints) + { + foreach (var triplet in genericTypeMapping) { + var oldGenericArguments = triplet.Third.Select(pair => pair.First).ToArray(); + var newGenericArguments = triplet.Third.Select(pair => pair.Second).ToArray(); + var oldTypeFullName = GetGenericTypeFullName(triplet.First, oldGenericArguments); + var newType = triplet.Second.MakeGenericType(newGenericArguments); + if (oldTypeFullName!=newType.GetFullName()) + rewrittenHints.Add(new RenameTypeHint(oldTypeFullName, newType)); + } + } + + /// + /// Builds for each of renamed field + /// of generic type. + /// + private void BuildRenameFieldHintsForGenericTypes(IEnumerable>>> genericTypeMapping, IEnumerable renameFieldHints, ChainedBuffer rewrittenHints) + { + var genericTypeDefLookup = ( + from triplet in genericTypeMapping + group triplet by triplet.Second.GetGenericTypeDefinition() + into g + select new { Definition = g.Key, Instances = g.ToArray() } + ).ToDictionary(g => g.Definition); + + // Build rename generic type field hints + foreach (var hint in renameFieldHints) { + var newGenericDefType = hint.TargetType; + var instanceGroup = genericTypeDefLookup.GetValueOrDefault(newGenericDefType); + if (instanceGroup==null) + continue; + foreach (var triplet in instanceGroup.Instances) { + var newGenericArguments = triplet.Third.Select(pair => pair.Second).ToArray(); + rewrittenHints.Add(new RenameFieldHint(newGenericDefType.MakeGenericType(newGenericArguments), + hint.OldFieldName, hint.NewFieldName)); + } + } + } + #endregion + + #region Process type changes stage + // Should be diffenent depending of autoDetectTypeMovements + private void BuildTypeMapping(ICollection renameTypeHints, ICollection removeTypeHints) + { + // Excluding EntitySetItem descendants. + // They're not interesting at all for us, since + // these types aren't ever referenced. + var oldModelTypes = extractedModel.GetNonConnectorTypes(); + + var newConnectorTypes = currentModel.Associations + .Select(association => association.ConnectorType) + .Where(type => type!=null) + .ToHashSet(); + + var newModelTypes = currentModel.Types + .Where(type => !newConnectorTypes.Contains(type)) + .ToDictionary(type => type.UnderlyingType); + + var renameLookup = renameTypeHints.ToDictionary(hint => hint.OldType); + var removeLookup = removeTypeHints.ToDictionary(hint => hint.Type); + + // Types that are neither mapped nor removed. + var suspects = new List(); + + // Mapping types + foreach (var oldType in oldModelTypes) { + var removeTypeHint = removeLookup.GetValueOrDefault(oldType.UnderlyingType); + if (removeTypeHint!=null) + continue; + var renameTypeHint = renameLookup.GetValueOrDefault(oldType.UnderlyingType); + var newTypeName = renameTypeHint!=null + ? renameTypeHint.NewType.GetFullName() + : oldType.UnderlyingType; + var newType = newModelTypes.GetValueOrDefault(newTypeName); + if (newType!=null) + MapType(oldType, newType); + else + //todo:// movements detection should be implemented by other processor + //if (autoDetectTypesMovements) + suspects.Add(oldType); + } + + if (suspects.Count==0 || !autoDetectTypesMovements) { + suspiciousTypes = suspects; + return; + } + + // Now we'll lookup by using DO type name instead of CLR type name + // By default DO type name is a CLR type name without namespace + // however this could be adjusted by domain configuration. + // If CLR name is changed but DO name is preserved we should + // automatically process this type without extra hints. + + newModelTypes = newModelTypes.Values.ToDictionary(t => t.Name); + + foreach (var oldType in suspects) { + var newType = newModelTypes.GetValueOrDefault(oldType.Name); + if (newType!=null && !reverseTypeMapping.ContainsKey(newType)) + MapType(oldType, newType); + else + suspiciousTypes.Add(oldType); + } + + } + + #endregion + + #region Process field changes stage + + private void BuildFieldMapping(ICollection renameFieldHints, ICollection changeFieldTypeHints) + { + foreach (var pair in typeMapping) + BuildFieldMapping(renameFieldHints, changeFieldTypeHints, pair.Key, pair.Value); + + // Will be modified, so we need to copy sequence into independant collection + foreach (var pair in fieldMapping.ToChainedBuffer()) + MapNestedFields(pair.Key, pair.Value); + } + + private void BuildFieldMapping(IEnumerable renames, IEnumerable typeChanges, + StoredTypeInfo oldType, StoredTypeInfo newType) + { + var newFields = newType.Fields.ToDictionary(field => field.Name); + foreach (var oldField in oldType.Fields) { + var renameHint = renames.FirstOrDefault(hint => hint.OldFieldName==oldField.Name && hint.TargetType.GetFullName()==newType.UnderlyingType); + var newFieldName = renameHint!=null + ? renameHint.NewFieldName + : oldField.Name; + + var newField = newFields.GetValueOrDefault(newFieldName); + if (newField==null) + continue; + + if (oldField.IsStructure) { + // If it is structure, we map it immediately + MapField(oldField, newField); + continue; + } + + var typeChangeHint = typeChanges + .FirstOrDefault(hint => hint.Type.GetFullName()==newType.UnderlyingType && hint.FieldName==newField.Name); + if (typeChangeHint==null) { + // Check & skip field if type is changed + var newValueTypeName = newField.IsEntitySet + ? newField.ItemType + : newField.ValueType; + var oldValueTypeName = oldField.IsEntitySet + ? oldField.ItemType + : oldField.ValueType; + var newValueType = currentTypes.GetValueOrDefault(newValueTypeName); + var oldValueType = extractedTypes.GetValueOrDefault(oldValueTypeName); + if (newValueType!=null &&oldValueType!=null) { + // We deal with reference field + var mappedOldValueType = typeMapping.GetValueOrDefault(oldValueType); + if (mappedOldValueType==null) + // Mapped to nothing = removed + continue; + if (mappedOldValueType!=newValueType && !newValueType.AllDescendants.Contains(mappedOldValueType)) + // This isn't a Dog -> Animal type mapping + continue; + } + else + // We deal with regular field + if (oldValueTypeName!=newValueTypeName) + continue; + } + MapField(oldField, newField); + } + } + + #endregion + + #region Process connector types stage + + private void BuildConnectorTypeMapping() + { + var oldAssociations = extractedModel.Associations + .Where(association => association.ConnectorType != null); + foreach (var oldAssociation in oldAssociations) { + if (typeMapping.ContainsKey(oldAssociation.ConnectorType)) + continue; + + var oldReferencingField = oldAssociation.ReferencingField; + var oldReferencingType = oldReferencingField.DeclaringType; + + var newReferencingType = typeMapping.GetValueOrDefault(oldReferencingType); + if (newReferencingType==null) + continue; + + var newReferencingField = fieldMapping.GetValueOrDefault(oldReferencingField); + if (newReferencingField==null) + newReferencingField = newReferencingType.Fields + .SingleOrDefault(field => field.Name==oldReferencingField.Name); + if (newReferencingField==null) + continue; + + var newAssociation = currentModel.Associations + .SingleOrDefault(association => association.ReferencingField == newReferencingField); + if (newAssociation==null || newAssociation.ConnectorType==null) + continue; + + MapType(oldAssociation.ConnectorType, newAssociation.ConnectorType); + + var oldMaster = oldAssociation.ConnectorType.AllFields + .Single(field => field.Name == WellKnown.MasterFieldName); + var newMaster = newAssociation.ConnectorType.AllFields + .Single(field => field.Name == WellKnown.MasterFieldName); + var oldSlave = oldAssociation.ConnectorType.AllFields + .Single(field => field.Name == WellKnown.SlaveFieldName); + var newSlave = newAssociation.ConnectorType.AllFields + .Single(field => field.Name == WellKnown.SlaveFieldName); + + MapFieldRecursively(oldMaster, newMaster); + MapFieldRecursively(oldSlave, newSlave); + } + } + + #endregion + + #region Process field movements stage + + private IEnumerable RewriteMoveFieldHints(IEnumerable moveFieldHints) + { + foreach (var hint in moveFieldHints) { + yield return new CopyFieldHint(hint.SourceType, hint.SourceField, hint.TargetType, hint.TargetField); + yield return new RemoveFieldHint(hint.SourceType, hint.SourceField); + } + } + + private IEnumerable GenerateTypeIdFieldRemoveHintsForConcreteTable() + { + // Removes TypeId field ( = column) from hierarchies with ConcreteTable inheritance mapping + var result = new List(); + var relevantTypes = + from pair in typeMapping + let sourceHierarchy = pair.Key.Hierarchy + let targetHierarchy = pair.Value.Hierarchy + where + targetHierarchy!=null && sourceHierarchy!=null + && targetHierarchy.InheritanceSchema==InheritanceSchema.ConcreteTable + select pair.Key; + + foreach (var type in relevantTypes) { + var typeIdField = type.AllFields.SingleOrDefault(f => f.IsTypeId); + if (typeIdField==null) // Table of old type may not contain TypeId + continue; + var targetType = typeMapping[type]; + var targetTypeIdField = targetType.AllFields.SingleOrDefault(f => f.IsTypeId); + if (targetTypeIdField==null) + continue; + if (targetTypeIdField.IsPrimaryKey) + continue; + if (!extractedStorageModel.Tables.Contains(GetTableName(type))) + continue; + if (!extractedStorageModel.Tables[GetTableName(type)].Columns.Contains(typeIdField.MappingName)) + continue; + var hint = new RemoveFieldHint(targetType.UnderlyingType, targetTypeIdField.Name); + + // Generating affected columns list explicitly for a situation when "type" is renamed to "targetType" + if (type != targetType) + { + hint.IsExplicit = true; + hint.AffectedColumns = new ReadOnlyList(new List { + GetColumnPath(targetType, targetTypeIdField.MappingName) + }); + } + result.Add(hint); + } + return result; + } + + #endregion + + private void GetGenericRenameHints(IEnumerable hints, out Dictionary renameTypeHints, out ChainedBuffer renameGenericTypeHints, out ChainedBuffer renameFieldHints) + { + renameTypeHints = new Dictionary(); + renameGenericTypeHints = new ChainedBuffer(); + renameFieldHints = new ChainedBuffer(); + + foreach (var upgradeHint in hints) { + var renameTypeHint = upgradeHint as RenameTypeHint; + if (renameTypeHint!=null) { + renameTypeHints.Add(renameTypeHint.OldType, renameTypeHint); + if (renameTypeHint.NewType.IsGenericTypeDefinition) + renameGenericTypeHints.Add(renameTypeHint); + } + var renameFieldHint = upgradeHint as RenameFieldHint; + if (renameFieldHint!=null && renameFieldHint.TargetType.IsGenericTypeDefinition) + renameFieldHints.Add(renameFieldHint); + } + } + + #region Map methods + private void MapType(StoredTypeInfo oldType, StoredTypeInfo newType) + { + StoredTypeInfo existingNewType; + if (typeMapping.TryGetValue(oldType, out existingNewType)) { + throw new InvalidOperationException(string.Format( + Strings.ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ, + oldType, newType, existingNewType)); + } + typeMapping[oldType] = newType; + reverseTypeMapping[newType] = oldType; + } + + private void MapField(StoredFieldInfo oldField, StoredFieldInfo newField) + { + StoredFieldInfo existingNewField; + if (fieldMapping.TryGetValue(oldField, out existingNewField)) { + throw new InvalidOperationException(string.Format( + Strings.ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ, + oldField, newField, existingNewField)); + } + fieldMapping[oldField] = newField; + reverseFieldMapping[newField] = oldField; + } + + private void MapNestedFields(StoredFieldInfo oldField, StoredFieldInfo newField) + { + var oldNestedFields = ((IEnumerable)oldField.Fields).ToArray(); + if (oldNestedFields.Length==0) + return; + var oldValueType = extractedModel.Types + .Single(type => type.UnderlyingType==oldField.ValueType); + foreach (var oldNestedField in oldNestedFields) { + var oldNestedFieldOriginalName = oldNestedField.OriginalName; + var oldNestedFieldOrigin = oldValueType.AllFields + .Single(field => field.Name==oldNestedFieldOriginalName); + if (!fieldMapping.ContainsKey(oldNestedFieldOrigin)) + continue; + var newNestedFieldOrigin = fieldMapping[oldNestedFieldOrigin]; + var newNestedField = newField.Fields + .Single(field => field.OriginalName==newNestedFieldOrigin.Name); + MapFieldRecursively(oldNestedField, newNestedField); + } + } + + private void MapFieldRecursively(StoredFieldInfo oldField, StoredFieldInfo newField) + { + MapField(oldField, newField); + MapNestedFields(oldField, newField); + } + + #endregion + + #region Helpers + + private string GetTableName(StoredTypeInfo type) + { + return resolver.GetNodeName( + type.MappingDatabase, type.MappingSchema, type.MappingName); + } + + private string GetColumnPath(StoredTypeInfo type, string columnName) + { + var nodeName = GetTableName(type); + // Due to current implementation of domain model FieldInfo.MappingName is not correct, + // it has naming rules unapplied, corresponding ColumnInfo.Name however is correct. + // StoredFieldInfo.MappingName is taken directly from FieldInfo.MappingName and thus is incorrect too. + // We need to apply naming rules here to make it work. + var actualColumnName = nameBuilder.ApplyNamingRules(columnName); + return string.Format("Tables/{0}/Columns/{1}", nodeName, actualColumnName); + } + + private static Type GetNewType(string oldTypeName, Dictionary newTypes, Dictionary hints) + { + RenameTypeHint hint; + Type newType; + return hints.TryGetValue(oldTypeName, out hint) + ? hint.NewType + : (newTypes.TryGetValue(oldTypeName, out newType) ? newType : null); + } + + private static string GetGenericTypeFullName(string genericDefinitionTypeName, string[] genericArgumentNames) + { + return string.Format("{0}<{1}>", genericDefinitionTypeName.Replace("<>", string.Empty), + genericArgumentNames.ToCommaDelimitedString()); + } + #endregion + + // Constructors + + public UpgradeHintsProcessor( + HandlerAccessor handlers, + MappingResolver resolver, + StoredDomainModel currentDomainModel, + StoredDomainModel extractedDomainModel, + StorageModel extractedStorageModel, + bool autoDetectTypesMovements) + { + ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers"); + ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver"); + ArgumentValidator.EnsureArgumentNotNull(currentDomainModel, "currentDomainModel"); + ArgumentValidator.EnsureArgumentNotNull(extractedDomainModel, "extractedDomainModel"); + ArgumentValidator.EnsureArgumentNotNull(extractedStorageModel, "extractedStorageModel"); + + typeMapping = new Dictionary(); + reverseTypeMapping = new Dictionary(); + fieldMapping = new Dictionary(); + reverseFieldMapping = new Dictionary(); + + this.resolver = resolver; + nameBuilder = handlers.NameBuilder; + domainModel = handlers.Domain.Model; + + this.extractedStorageModel = extractedStorageModel; + + currentModel = currentDomainModel; + currentTypes = currentModel.Types.ToDictionary(t => t.UnderlyingType); + + extractedModel = extractedDomainModel; + extractedTypes = extractedModel.Types.ToDictionary(t => t.UnderlyingType); + + this.autoDetectTypesMovements = autoDetectTypesMovements; + hints = new NativeTypeClassifier(true); + suspiciousTypes = new List(); + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeServiceAccessor.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeServiceAccessor.cs index b9e24fabed..85f2f63709 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeServiceAccessor.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Internals/UpgradeServiceAccessor.cs @@ -1,179 +1,179 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.14 - -using System; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Providers; -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class UpgradeServiceAccessor : LockableBase, IDisposable - { - private readonly object resourcesSyncRoot = new object(); - private readonly DisposableSet resources = new DisposableSet(); - private readonly DisposableSet temporaryResources = new DisposableSet(); - - private DomainConfiguration configuration; - private StorageDriver storageDriver; - private NameBuilder nameBuilder; - private MappingResolver mappingResolver; - private HandlerFactory handlerFactory; - private SqlConnection connection; - private PartialIndexFilterCompiler indexFilterCompiler; - - private ReadOnlyList modules; - private ReadOnlyList orderedUpgradeHandlers; - private ReadOnlyDictionary upgradeHandlers; - private IFullTextCatalogNameBuilder catalogNameBuilder; - - public DomainConfiguration Configuration - { - get { return configuration; } - set - { - this.EnsureNotLocked(); - configuration = value; - } - } - - public HandlerFactory HandlerFactory - { - get { return handlerFactory; } - set - { - this.EnsureNotLocked(); - handlerFactory = value; - } - } - - public StorageDriver StorageDriver - { - get { return storageDriver; } - set - { - this.EnsureNotLocked(); - storageDriver = value; - } - } - - public ProviderInfo ProviderInfo { get { return storageDriver.ProviderInfo; } } - - public NameBuilder NameBuilder - { - get { return nameBuilder; } - set - { - this.EnsureNotLocked(); - nameBuilder = value; - } - } - - public MappingResolver MappingResolver - { - get { return mappingResolver; } - set - { - this.EnsureNotLocked(); - mappingResolver = value; - } - } - - public PartialIndexFilterCompiler IndexFilterCompiler - { - get { return indexFilterCompiler; } - set - { - this.EnsureNotLocked(); - indexFilterCompiler = value; - } - } - - public ReadOnlyList Modules - { - get { return modules; } - set - { - this.EnsureNotLocked(); - modules = value; - } - } - - public ReadOnlyList OrderedUpgradeHandlers - { - get { return orderedUpgradeHandlers; } - set - { - this.EnsureNotLocked(); - orderedUpgradeHandlers = value; - } - } - - public ReadOnlyDictionary UpgradeHandlers - { - get { return upgradeHandlers; } - set - { - this.EnsureNotLocked(); - upgradeHandlers = value; - } - } - - public IFullTextCatalogNameBuilder FulltextCatalogNameBuilder - { - get { return catalogNameBuilder; } - set - { - this.EnsureNotLocked(); - catalogNameBuilder = value; - } - } - - public SqlConnection Connection - { - get { return connection; } - set - { - this.EnsureNotLocked(); - connection = value; - } - } - - public void ClearTemporaryResources() - { - lock (resourcesSyncRoot) { - temporaryResources.Clear(); - } - } - - public void RegisterTemporaryResource(IDisposable resource) - { - ArgumentValidator.EnsureArgumentNotNull(resource, "resource"); - lock (resourcesSyncRoot) { - temporaryResources.Add(resource); - } - } - - public void RegisterResource(IDisposable resource) - { - ArgumentValidator.EnsureArgumentNotNull(resource, "resource"); - lock (resourcesSyncRoot) { - resources.Add(resource); - } - } - - public void Dispose() - { - lock (resourcesSyncRoot) { - resources.DisposeSafely(); - temporaryResources.DisposeSafely(); - } - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.14 + +using System; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class UpgradeServiceAccessor : LockableBase, IDisposable + { + private readonly object resourcesSyncRoot = new object(); + private readonly DisposableSet resources = new DisposableSet(); + private readonly DisposableSet temporaryResources = new DisposableSet(); + + private DomainConfiguration configuration; + private StorageDriver storageDriver; + private NameBuilder nameBuilder; + private MappingResolver mappingResolver; + private HandlerFactory handlerFactory; + private SqlConnection connection; + private PartialIndexFilterCompiler indexFilterCompiler; + + private ReadOnlyList modules; + private ReadOnlyList orderedUpgradeHandlers; + private ReadOnlyDictionary upgradeHandlers; + private IFullTextCatalogNameBuilder catalogNameBuilder; + + public DomainConfiguration Configuration + { + get { return configuration; } + set + { + this.EnsureNotLocked(); + configuration = value; + } + } + + public HandlerFactory HandlerFactory + { + get { return handlerFactory; } + set + { + this.EnsureNotLocked(); + handlerFactory = value; + } + } + + public StorageDriver StorageDriver + { + get { return storageDriver; } + set + { + this.EnsureNotLocked(); + storageDriver = value; + } + } + + public ProviderInfo ProviderInfo { get { return storageDriver.ProviderInfo; } } + + public NameBuilder NameBuilder + { + get { return nameBuilder; } + set + { + this.EnsureNotLocked(); + nameBuilder = value; + } + } + + public MappingResolver MappingResolver + { + get { return mappingResolver; } + set + { + this.EnsureNotLocked(); + mappingResolver = value; + } + } + + public PartialIndexFilterCompiler IndexFilterCompiler + { + get { return indexFilterCompiler; } + set + { + this.EnsureNotLocked(); + indexFilterCompiler = value; + } + } + + public ReadOnlyList Modules + { + get { return modules; } + set + { + this.EnsureNotLocked(); + modules = value; + } + } + + public ReadOnlyList OrderedUpgradeHandlers + { + get { return orderedUpgradeHandlers; } + set + { + this.EnsureNotLocked(); + orderedUpgradeHandlers = value; + } + } + + public ReadOnlyDictionary UpgradeHandlers + { + get { return upgradeHandlers; } + set + { + this.EnsureNotLocked(); + upgradeHandlers = value; + } + } + + public IFullTextCatalogNameBuilder FulltextCatalogNameBuilder + { + get { return catalogNameBuilder; } + set + { + this.EnsureNotLocked(); + catalogNameBuilder = value; + } + } + + public SqlConnection Connection + { + get { return connection; } + set + { + this.EnsureNotLocked(); + connection = value; + } + } + + public void ClearTemporaryResources() + { + lock (resourcesSyncRoot) { + temporaryResources.Clear(); + } + } + + public void RegisterTemporaryResource(IDisposable resource) + { + ArgumentValidator.EnsureArgumentNotNull(resource, "resource"); + lock (resourcesSyncRoot) { + temporaryResources.Add(resource); + } + } + + public void RegisterResource(IDisposable resource) + { + ArgumentValidator.EnsureArgumentNotNull(resource, "resource"); + lock (resourcesSyncRoot) { + resources.Add(resource); + } + } + + public void Dispose() + { + lock (resourcesSyncRoot) { + resources.DisposeSafely(); + temporaryResources.DisposeSafely(); + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoCollection.cs index 0d2370d341..a90e584408 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Column collection. - /// - [Serializable] - public sealed class ColumnInfoCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent. - public ColumnInfoCollection(Node parent) - : base(parent, "Columns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Column collection. + /// + [Serializable] + public sealed class ColumnInfoCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent. + public ColumnInfoCollection(Node parent) + : base(parent, "Columns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoRef.cs index 133e00e76e..7d92afd470 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ColumnInfoRef.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// An abstract base class for all columns refs. - /// - [Serializable] - public abstract class ColumnInfoRef : Ref - where TParent: NodeBase - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// - protected ColumnInfoRef(TParent parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The column. - protected ColumnInfoRef(TParent parent, StorageColumnInfo column) - : base(parent) - { - Value = column; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// An abstract base class for all columns refs. + /// + [Serializable] + public abstract class ColumnInfoRef : Ref + where TParent: NodeBase + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// + protected ColumnInfoRef(TParent parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The column. + protected ColumnInfoRef(TParent parent, StorageColumnInfo column) + : base(parent) + { + Value = column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/IntegrityException.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/IntegrityException.cs index a9f5e71227..bf6032374e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/IntegrityException.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/IntegrityException.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Runtime.Serialization; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Describes errors detected during . execution. - /// - [Serializable] - public class IntegrityException : Exception - { - /// - /// Gets the path of the node which validation has failed. - /// - public string NodePath { get; private set; } - - - // Constructors - - protected IntegrityException() - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The message. - /// The path of the invalid node. - public IntegrityException(string message, string nodePath) - : base(message) - { - NodePath = nodePath; - } - - // Serialization - - /// - /// Initializes a new instance of the class. - /// - /// The that holds the serialized object data about the exception being thrown. - /// The that contains contextual information about the source or destination. - /// The parameter is null. - /// - /// The class name is null or is zero (0). - public IntegrityException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Runtime.Serialization; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Describes errors detected during . execution. + /// + [Serializable] + public class IntegrityException : Exception + { + /// + /// Gets the path of the node which validation has failed. + /// + public string NodePath { get; private set; } + + + // Constructors + + protected IntegrityException() + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The message. + /// The path of the invalid node. + public IntegrityException(string message, string nodePath) + : base(message) + { + NodePath = nodePath; + } + + // Serialization + + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// + /// The class name is null or is zero (0). + public IntegrityException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/ValidationException.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/ValidationException.cs index 9f458b8052..944debbaa3 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/ValidationException.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Exceptions/ValidationException.cs @@ -1,94 +1,94 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Runtime.Serialization; -using System.Security; -using System.Security.Permissions; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Describes errors detected during - /// . execution. - /// - [Serializable] - public class ValidationException : Exception - { - /// - /// Gets the path of the node which validation has failed. - /// - public string NodePath { get; private set; } - - - // Constructors - - /// - protected ValidationException() - { - } - - /// - public ValidationException(string message) - : base(message) - { - } - - /// - public ValidationException(string message, Exception innerException) - : base(message, innerException) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The message. - /// The path of the invalid node. - public ValidationException(string message, string nodePath) - : base(message) - { - NodePath = nodePath; - } - - #region Serializing members - - /// - /// Initializes a new instance of the class. - /// - /// The that holds the serialized object data about the exception being thrown. - /// The that contains contextual information about the source or destination. - /// The parameter is null. - /// - /// The class name is null or is zero (0). - protected ValidationException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - NodePath = info.GetString("NodePath"); - } - - /// - /// When overridden in a derived class, sets the with information about the exception. - /// - /// The that holds the serialized object data about the exception being thrown. - /// The that contains contextual information about the source or destination. - /// The parameter is a null reference (Nothing in Visual Basic). - /// - /// - /// - /// - /// - [SecurityCritical] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("NodePath", NodePath); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Runtime.Serialization; +using System.Security; +using System.Security.Permissions; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Describes errors detected during + /// . execution. + /// + [Serializable] + public class ValidationException : Exception + { + /// + /// Gets the path of the node which validation has failed. + /// + public string NodePath { get; private set; } + + + // Constructors + + /// + protected ValidationException() + { + } + + /// + public ValidationException(string message) + : base(message) + { + } + + /// + public ValidationException(string message, Exception innerException) + : base(message, innerException) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The message. + /// The path of the invalid node. + public ValidationException(string message, string nodePath) + : base(message) + { + NodePath = nodePath; + } + + #region Serializing members + + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// + /// The class name is null or is zero (0). + protected ValidationException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + NodePath = info.GetString("NodePath"); + } + + /// + /// When overridden in a derived class, sets the with information about the exception. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is a null reference (Nothing in Visual Basic). + /// + /// + /// + /// + /// + [SecurityCritical] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("NodePath", NodePath); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyCollection.cs index 8695e9f748..20796c6d5f 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyCollection.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; - -using Xtensive.Modelling; -using Xtensive.Orm.Upgrade.Model; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Foreign key collection. - /// - [Serializable] - public sealed class ForeignKeyCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The table. - public ForeignKeyCollection(TableInfo table) - : base(table, "ForeignKeys") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; + +using Xtensive.Modelling; +using Xtensive.Orm.Upgrade.Model; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Foreign key collection. + /// + [Serializable] + public sealed class ForeignKeyCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The table. + public ForeignKeyCollection(TableInfo table) + : base(table, "ForeignKeys") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnCollection.cs index a10fa227ec..d94d254bc4 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnCollection.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class ForeignKeyColumnCollection : NodeCollectionBase - { - /// - /// Replaces all column references to references to columns of - /// specified index. - /// - /// The index to use. - public void Set(StorageIndexInfo source) - { - Clear(); - foreach (var keyColumn in source.KeyColumns) - new ForeignKeyColumnRef(Parent, keyColumn.Value); - } - - - // Constructors - - /// - public ForeignKeyColumnCollection(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class ForeignKeyColumnCollection : NodeCollectionBase + { + /// + /// Replaces all column references to references to columns of + /// specified index. + /// + /// The index to use. + public void Set(StorageIndexInfo source) + { + Clear(); + foreach (var keyColumn in source.KeyColumns) + new ForeignKeyColumnRef(Parent, keyColumn.Value); + } + + + // Constructors + + /// + public ForeignKeyColumnCollection(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnRef.cs index 42b2c68ee8..001d991aed 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyColumnRef.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.20 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to foreign key column. - /// - [Serializable] - public sealed class ForeignKeyColumnRef : Ref - { - /// - protected override Nesting CreateNesting() - { - return new Nesting( - this, "ForeignKeyColumns"); - } - - - // Constructors - - /// - public ForeignKeyColumnRef(ForeignKeyInfo parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The foreign key. - /// The column. - /// - public ForeignKeyColumnRef(ForeignKeyInfo parent, StorageColumnInfo column) - : base(parent) - { - Value = column; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.20 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to foreign key column. + /// + [Serializable] + public sealed class ForeignKeyColumnRef : Ref + { + /// + protected override Nesting CreateNesting() + { + return new Nesting( + this, "ForeignKeyColumns"); + } + + + // Constructors + + /// + public ForeignKeyColumnRef(ForeignKeyInfo parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The foreign key. + /// The column. + /// + public ForeignKeyColumnRef(ForeignKeyInfo parent, StorageColumnInfo column) + : base(parent) + { + Value = column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyInfo.cs index c190485555..c701091157 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ForeignKeyInfo.cs @@ -1,171 +1,171 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.23 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Foreign key. - /// - [Serializable] - [DataDependent] - public sealed class ForeignKeyInfo : NodeBase - { - private ReferentialAction onUpdateAction; - private ReferentialAction onRemoveAction; - private PrimaryIndexInfo primaryKey; - - /// - /// Gets or sets the foreign index. - /// - [Property(Priority = -1100)] - public PrimaryIndexInfo PrimaryKey - { - get { return primaryKey; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("PrimaryKey", value)) { - primaryKey = value; - scope.Commit(); - } - } - } - - /// - /// Gets foreign key columns. - /// - [Property] - public ForeignKeyColumnCollection ForeignKeyColumns { get; private set; } - - /// - /// Gets or sets the "on remove" action. - /// - [Property(Priority = -110)] - public ReferentialAction OnRemoveAction - { - get { return onRemoveAction; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("OnUpdateAction", value)) { - onRemoveAction = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the "on update" action. - /// - [Property(Priority = -100)] - public ReferentialAction OnUpdateAction - { - get { return onUpdateAction; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("OnUpdateAction", value)) { - onUpdateAction = value; - scope.Commit(); - } - } - } - - /// - /// Validations errors. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - - if (PrimaryKey == null) { - ea.Execute(() => { - throw new ValidationException(Strings.ExUndefinedPrimaryKey, Path); - }); - ea.Complete(); - return; - } - - var pkColumns = PrimaryKey.KeyColumns; - var fkColumns = ForeignKeyColumns; - - if (pkColumns.Count()!=pkColumns.Zip(fkColumns).Where(p => CompareKeyColumns(p.First, p.Second)).Count()) { - ea.Execute(() => { - throw new ValidationException( - Strings.ExInvalidForeignKeyStructure, Path); - }); - } - - // var pkTypes = PrimaryKey.KeyColumns.Select(c => c.Value.Type); - // var fkTypes = ForeignKeyColumns.Select(c => c.Value.Type); - // if (pkTypes.Count()!=pkTypes.Zip(fkTypes).Where(p => p.First==p.Second).Count()) - // ea.Execute(() => { - // throw new ValidationException( - // Strings.ExInvalidForeignKeyStructure, Path); - // }); - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "ForeignKeys"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (ForeignKeyColumns == null) - ForeignKeyColumns = new ForeignKeyColumnCollection(this, "ForeignKeyColumns"); - } - - - private static bool CompareKeyColumns(KeyColumnRef first, ForeignKeyColumnRef second) - { - if (first == null || second == null) - return false; - - return first.Index==second.Index - && CompareTypes(first.Value.Type, second.Value.Type); - } - - private static bool CompareTypes(StorageTypeInfo first, StorageTypeInfo second) - { - if (first==null || second==null) - return false; - if (first.IsTypeUndefined || second.IsTypeUndefined) - return true; - - return first.Type.ToNullable()==second.Type.ToNullable() - && first.Length==second.Length - && first.Scale==second.Scale - && first.Precision==second.Precision; - } - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The name of foreign key. - /// - public ForeignKeyInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.23 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Foreign key. + /// + [Serializable] + [DataDependent] + public sealed class ForeignKeyInfo : NodeBase + { + private ReferentialAction onUpdateAction; + private ReferentialAction onRemoveAction; + private PrimaryIndexInfo primaryKey; + + /// + /// Gets or sets the foreign index. + /// + [Property(Priority = -1100)] + public PrimaryIndexInfo PrimaryKey + { + get { return primaryKey; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("PrimaryKey", value)) { + primaryKey = value; + scope.Commit(); + } + } + } + + /// + /// Gets foreign key columns. + /// + [Property] + public ForeignKeyColumnCollection ForeignKeyColumns { get; private set; } + + /// + /// Gets or sets the "on remove" action. + /// + [Property(Priority = -110)] + public ReferentialAction OnRemoveAction + { + get { return onRemoveAction; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("OnUpdateAction", value)) { + onRemoveAction = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the "on update" action. + /// + [Property(Priority = -100)] + public ReferentialAction OnUpdateAction + { + get { return onUpdateAction; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("OnUpdateAction", value)) { + onUpdateAction = value; + scope.Commit(); + } + } + } + + /// + /// Validations errors. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + + if (PrimaryKey == null) { + ea.Execute(() => { + throw new ValidationException(Strings.ExUndefinedPrimaryKey, Path); + }); + ea.Complete(); + return; + } + + var pkColumns = PrimaryKey.KeyColumns; + var fkColumns = ForeignKeyColumns; + + if (pkColumns.Count()!=pkColumns.Zip(fkColumns).Where(p => CompareKeyColumns(p.First, p.Second)).Count()) { + ea.Execute(() => { + throw new ValidationException( + Strings.ExInvalidForeignKeyStructure, Path); + }); + } + + // var pkTypes = PrimaryKey.KeyColumns.Select(c => c.Value.Type); + // var fkTypes = ForeignKeyColumns.Select(c => c.Value.Type); + // if (pkTypes.Count()!=pkTypes.Zip(fkTypes).Where(p => p.First==p.Second).Count()) + // ea.Execute(() => { + // throw new ValidationException( + // Strings.ExInvalidForeignKeyStructure, Path); + // }); + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "ForeignKeys"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (ForeignKeyColumns == null) + ForeignKeyColumns = new ForeignKeyColumnCollection(this, "ForeignKeyColumns"); + } + + + private static bool CompareKeyColumns(KeyColumnRef first, ForeignKeyColumnRef second) + { + if (first == null || second == null) + return false; + + return first.Index==second.Index + && CompareTypes(first.Value.Type, second.Value.Type); + } + + private static bool CompareTypes(StorageTypeInfo first, StorageTypeInfo second) + { + if (first==null || second==null) + return false; + if (first.IsTypeUndefined || second.IsTypeUndefined) + return true; + + return first.Type.ToNullable()==second.Type.ToNullable() + && first.Length==second.Length + && first.Scale==second.Scale + && first.Precision==second.Precision; + } + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The name of foreign key. + /// + public ForeignKeyInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRef.cs index f14501cc94..1de0251bbe 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRef.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Reference to full-text column. - /// - [Serializable] - public sealed class FullTextColumnRef : ColumnInfoRef - { - [Property(Priority = -1100, CaseInsensitiveComparison = true)] - public string Configuration { get; set; } - - [Property(Priority = -1200, CaseInsensitiveComparison = true)] - public string TypeColumnName { get; set; } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Columns"); - } - - - // Constructors - - /// - public FullTextColumnRef(StorageFullTextIndexInfo parent) - : base(parent) - {} - - /// - public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column) - : base(parent, column) - {} - - /// - public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column, string configuration) - : base(parent, column) - { - Configuration = configuration; - } - - /// - public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column, string configuration, string typeColumn) - : base(parent, column) - { - Configuration = configuration; - TypeColumnName = typeColumn; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Reference to full-text column. + /// + [Serializable] + public sealed class FullTextColumnRef : ColumnInfoRef + { + [Property(Priority = -1100, CaseInsensitiveComparison = true)] + public string Configuration { get; set; } + + [Property(Priority = -1200, CaseInsensitiveComparison = true)] + public string TypeColumnName { get; set; } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Columns"); + } + + + // Constructors + + /// + public FullTextColumnRef(StorageFullTextIndexInfo parent) + : base(parent) + {} + + /// + public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column) + : base(parent, column) + {} + + /// + public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column, string configuration) + : base(parent, column) + { + Configuration = configuration; + } + + /// + public FullTextColumnRef(StorageFullTextIndexInfo parent, StorageColumnInfo column, string configuration, string typeColumn) + : base(parent, column) + { + Configuration = configuration; + TypeColumnName = typeColumn; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRefCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRefCollection.cs index 388b812bc2..e080c8a678 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRefCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextColumnRefCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - -using System; -using System.Diagnostics; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class FullTextColumnRefCollection : NodeCollectionBase - { - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - public FullTextColumnRefCollection(StorageFullTextIndexInfo parent) - : base(parent, "Columns") - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + +using System; +using System.Diagnostics; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class FullTextColumnRefCollection : NodeCollectionBase + { + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + public FullTextColumnRefCollection(StorageFullTextIndexInfo parent) + : base(parent, "Columns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextIndexInfoCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextIndexInfoCollection.cs index d689293440..cba4efdfad 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextIndexInfoCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/FullTextIndexInfoCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.25 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of full-text indexes. - /// - [Serializable] - public class FullTextIndexInfoCollection: NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The table. - public FullTextIndexInfoCollection(TableInfo table) - : base(table, "FullTextIndexes") - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.25 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of full-text indexes. + /// + [Serializable] + public class FullTextIndexInfoCollection: NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The table. + public FullTextIndexInfoCollection(TableInfo table) + : base(table, "FullTextIndexes") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRef.cs index 8d4f10e156..18519d6f50 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRef.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to included column. - /// - [Serializable] - public sealed class IncludedColumnRef : ColumnInfoRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting( - this, "IncludedColumns"); - } - - - // Constructors - - /// - public IncludedColumnRef(SecondaryIndexInfo parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - public IncludedColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column) - : base(parent, column) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to included column. + /// + [Serializable] + public sealed class IncludedColumnRef : ColumnInfoRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting( + this, "IncludedColumns"); + } + + + // Constructors + + /// + public IncludedColumnRef(SecondaryIndexInfo parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + public IncludedColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column) + : base(parent, column) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRefCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRefCollection.cs index aaecc7fc58..b86e941555 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRefCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/IncludedColumnRefCollection.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class IncludedColumnRefCollection : NodeCollectionBase - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - public IncludedColumnRefCollection(SecondaryIndexInfo parent) - : base(parent, "ValueColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class IncludedColumnRefCollection : NodeCollectionBase + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + public IncludedColumnRefCollection(SecondaryIndexInfo parent) + : base(parent, "ValueColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef.cs index 7af00f5877..446bfe634c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to key column. - /// - [Serializable] - public sealed class KeyColumnRef : KeyColumnRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "KeyColumns"); - } - - - // Constructors - - /// - public KeyColumnRef(StorageIndexInfo parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - public KeyColumnRef(StorageIndexInfo parent, StorageColumnInfo column) - : base(parent, column) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - /// The direction. - public KeyColumnRef(StorageIndexInfo parent, StorageColumnInfo column, Direction direction) - : base(parent, column, direction) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to key column. + /// + [Serializable] + public sealed class KeyColumnRef : KeyColumnRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "KeyColumns"); + } + + + // Constructors + + /// + public KeyColumnRef(StorageIndexInfo parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + public KeyColumnRef(StorageIndexInfo parent, StorageColumnInfo column) + : base(parent, column) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + /// The direction. + public KeyColumnRef(StorageIndexInfo parent, StorageColumnInfo column, Direction direction) + : base(parent, column, direction) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRefCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRefCollection.cs index 73e679a3b3..30473adec2 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRefCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRefCollection.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class KeyColumnRefCollection : NodeCollectionBase - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent. - public KeyColumnRefCollection(StorageIndexInfo parent) - : base(parent, "KeyColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class KeyColumnRefCollection : NodeCollectionBase + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent. + public KeyColumnRefCollection(StorageIndexInfo parent) + : base(parent, "KeyColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef{TParent}.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef{TParent}.cs index 56b0b78e08..33afbc2e03 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef{TParent}.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/KeyColumnRef{TParent}.cs @@ -1,85 +1,85 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to key column. - /// - [Serializable] - public abstract class KeyColumnRef : ColumnInfoRef - where TParent: StorageIndexInfo - { - private Direction direction; - - /// - /// Gets or sets the column direction. - /// - [Property(Priority = -1000)] - public Direction Direction { - get { return direction; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Direction", value)) { - direction = value; - scope.Commit(); - } - } - } - - /// - /// Invalid value - /// (). - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - if (direction==Direction.None) { - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidDirectionValue, Path); - }); - } - ea.Complete(); - } - } - - - // Constructors - - /// - public KeyColumnRef(TParent parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - public KeyColumnRef(TParent parent, StorageColumnInfo column) - : base(parent, column) - { - Direction = Direction.Positive; - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - /// The direction. - public KeyColumnRef(TParent parent, StorageColumnInfo column, Direction direction) - : base(parent, column) - { - Direction = direction; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to key column. + /// + [Serializable] + public abstract class KeyColumnRef : ColumnInfoRef + where TParent: StorageIndexInfo + { + private Direction direction; + + /// + /// Gets or sets the column direction. + /// + [Property(Priority = -1000)] + public Direction Direction { + get { return direction; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Direction", value)) { + direction = value; + scope.Commit(); + } + } + } + + /// + /// Invalid value + /// (). + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + if (direction==Direction.None) { + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidDirectionValue, Path); + }); + } + ea.Complete(); + } + } + + + // Constructors + + /// + public KeyColumnRef(TParent parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + public KeyColumnRef(TParent parent, StorageColumnInfo column) + : base(parent, column) + { + Direction = Direction.Positive; + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + /// The direction. + public KeyColumnRef(TParent parent, StorageColumnInfo column, Direction direction) + : base(parent, column) + { + Direction = direction; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeBase.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeBase.cs index 30b4ee5de9..e4beaa8257 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeBase.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeBase.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A base class for all nodes in storage model. - /// - /// The type of the parent node. - [Serializable] - public abstract class NodeBase : Node - where TParent : Node - { -// /// -// protected override void PerformCreate() -// { -// base.PerformCreate(); -// Log.Info("Created: {0}", this); -// } -// -// /// -// protected override void PerformMove(Node newParent, string newName, int newIndex) -// { -// using (Log.InfoRegion("Moving: {0}", this)) -// { -// if (Parent != newParent) -// Log.Info("new Parent={0}", newParent); -// if (Name != newName) -// Log.Info("new Name={0}", newName); -// if (Index != newIndex) -// Log.Info("new Index={0}", newIndex); -// base.PerformMove(newParent, newName, newIndex); -// } -// } -// -// /// -// protected override void PerformShift(int offset) -// { -// Log.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); -// base.PerformShift(offset); -// } -// -// /// -// protected override void ValidateRemove() -// { -// base.ValidateRemove(); -// Log.Info("Removed: {0}", this); -// } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent. - /// The name. - protected NodeBase(TParent parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A base class for all nodes in storage model. + /// + /// The type of the parent node. + [Serializable] + public abstract class NodeBase : Node + where TParent : Node + { +// /// +// protected override void PerformCreate() +// { +// base.PerformCreate(); +// Log.Info("Created: {0}", this); +// } +// +// /// +// protected override void PerformMove(Node newParent, string newName, int newIndex) +// { +// using (Log.InfoRegion("Moving: {0}", this)) +// { +// if (Parent != newParent) +// Log.Info("new Parent={0}", newParent); +// if (Name != newName) +// Log.Info("new Name={0}", newName); +// if (Index != newIndex) +// Log.Info("new Index={0}", newIndex); +// base.PerformMove(newParent, newName, newIndex); +// } +// } +// +// /// +// protected override void PerformShift(int offset) +// { +// Log.Info("Shifting: {0}, from {1} to {2}", this, Index, Index + offset); +// base.PerformShift(offset); +// } +// +// /// +// protected override void ValidateRemove() +// { +// base.ValidateRemove(); +// Log.Info("Removed: {0}", this); +// } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent. + /// The name. + protected NodeBase(TParent parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeCollectionBase.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeCollectionBase.cs index 91c6ce2a26..eb466fd687 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeCollectionBase.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/NodeCollectionBase.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// An abstract base class for any collection of storage model nodes. - /// - /// The type of the node. - /// The type of the parent node. - [Serializable] - public abstract class NodeCollectionBase : NodeCollection - where TNode : Node - where TParent : Node - { - // Constructors - - /// - protected NodeCollectionBase(Node parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// An abstract base class for any collection of storage model nodes. + /// + /// The type of the node. + /// The type of the parent node. + [Serializable] + public abstract class NodeCollectionBase : NodeCollection + where TNode : Node + where TParent : Node + { + // Constructors + + /// + protected NodeCollectionBase(Node parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs index 92d25e9637..7b08bcb8b7 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.10.13 - -using System; -using Xtensive.Core; - -namespace Xtensive.Orm.Upgrade.Model -{ - [Serializable] - public sealed class PartialIndexFilterInfo : IEquatable - { - public string Expression { get; private set; } - - #region Equality members - - public bool Equals(PartialIndexFilterInfo other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return Equals(other.Expression, Expression); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType() != typeof(PartialIndexFilterInfo)) - return false; - return Equals((PartialIndexFilterInfo)obj); - } - - public override int GetHashCode() - { - return Expression.GetHashCode(); - } - - #endregion - - public override string ToString() - { - return Expression; - } - - - // Constructors - - public PartialIndexFilterInfo(string expression) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(expression, "expression"); - Expression = expression; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.10.13 + +using System; +using Xtensive.Core; + +namespace Xtensive.Orm.Upgrade.Model +{ + [Serializable] + public sealed class PartialIndexFilterInfo : IEquatable + { + public string Expression { get; private set; } + + #region Equality members + + public bool Equals(PartialIndexFilterInfo other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return Equals(other.Expression, Expression); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != typeof(PartialIndexFilterInfo)) + return false; + return Equals((PartialIndexFilterInfo)obj); + } + + public override int GetHashCode() + { + return Expression.GetHashCode(); + } + + #endregion + + public override string ToString() + { + return Expression; + } + + + // Constructors + + public PartialIndexFilterInfo(string expression) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(expression, "expression"); + Expression = expression; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryIndexInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryIndexInfo.cs index a12512db1c..2c36569d99 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryIndexInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryIndexInfo.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Primary index. - /// - [Serializable] - public sealed class PrimaryIndexInfo : StorageIndexInfo - { - /// - /// Gets value columns. - /// - [Property(Priority = -100, IgnoreInComparison = true)] - public ValueColumnRefCollection ValueColumns { get; private set; } - - /// - /// Populates collection by - /// including all the columns except - /// into it. - /// - public void PopulateValueColumns() - { - var keySet = KeyColumns.Select(kc => kc.Value).ToHashSet(); - foreach (var column in Parent.Columns.Where(c => !keySet.Contains(c))) - new ValueColumnRef(this, column); - } - - /// - /// Validation error. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - base.ValidateState(); - - var tableColumns = Parent.Columns; - var keys = KeyColumns.Select(keyRef => keyRef.Value).ToList(); - var values = ValueColumns.Select(valueRef => valueRef.Value).ToList(); - var all = keys.Concat(values).ToList(); - - if (keys.Count==0) - ea.Execute(() => { - throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); - }); - if (keys.Where(ci => ci.Type == null || ci.Type.IsNullable).Count() > 0) - ea.Execute(() => { - throw new ValidationException(Strings.ExPrimaryKeyColumnCanNotBeNullable, Path); - }); - - if (all.Count!=tableColumns.Count) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); - }); - if (all.Zip(tableColumns).Where(p => p.First!=p.Second).Any()) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); - }); - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "PrimaryIndex"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (ValueColumns==null) - ValueColumns = new ValueColumnRefCollection(this); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The index name. - public PrimaryIndexInfo(TableInfo table, string name) - : base(table, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Primary index. + /// + [Serializable] + public sealed class PrimaryIndexInfo : StorageIndexInfo + { + /// + /// Gets value columns. + /// + [Property(Priority = -100, IgnoreInComparison = true)] + public ValueColumnRefCollection ValueColumns { get; private set; } + + /// + /// Populates collection by + /// including all the columns except + /// into it. + /// + public void PopulateValueColumns() + { + var keySet = KeyColumns.Select(kc => kc.Value).ToHashSet(); + foreach (var column in Parent.Columns.Where(c => !keySet.Contains(c))) + new ValueColumnRef(this, column); + } + + /// + /// Validation error. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + base.ValidateState(); + + var tableColumns = Parent.Columns; + var keys = KeyColumns.Select(keyRef => keyRef.Value).ToList(); + var values = ValueColumns.Select(valueRef => valueRef.Value).ToList(); + var all = keys.Concat(values).ToList(); + + if (keys.Count==0) + ea.Execute(() => { + throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); + }); + if (keys.Where(ci => ci.Type == null || ci.Type.IsNullable).Count() > 0) + ea.Execute(() => { + throw new ValidationException(Strings.ExPrimaryKeyColumnCanNotBeNullable, Path); + }); + + if (all.Count!=tableColumns.Count) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); + }); + if (all.Zip(tableColumns).Where(p => p.First!=p.Second).Any()) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyStructure, Path); + }); + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "PrimaryIndex"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (ValueColumns==null) + ValueColumns = new ValueColumnRefCollection(this); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The index name. + public PrimaryIndexInfo(TableInfo table, string name) + : base(table, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRef.cs index a4d5aaccef..3ac334747d 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRef.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to key column. - /// - [Serializable] - public sealed class PrimaryKeyColumnRef : KeyColumnRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "PrimaryKeyColumns"); - } - - - // Constructors - - /// - public PrimaryKeyColumnRef(SecondaryIndexInfo parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - public PrimaryKeyColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column) - : base(parent, column) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - /// The direction. - public PrimaryKeyColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column, Direction direction) - : base(parent, column, direction) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to key column. + /// + [Serializable] + public sealed class PrimaryKeyColumnRef : KeyColumnRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "PrimaryKeyColumns"); + } + + + // Constructors + + /// + public PrimaryKeyColumnRef(SecondaryIndexInfo parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + public PrimaryKeyColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column) + : base(parent, column) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + /// The direction. + public PrimaryKeyColumnRef(SecondaryIndexInfo parent, StorageColumnInfo column, Direction direction) + : base(parent, column, direction) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRefCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRefCollection.cs index fedc7c5bf0..6bf5e37836 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRefCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PrimaryKeyColumnRefCollection.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class PrimaryKeyColumnRefCollection : NodeCollectionBase - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent. - public PrimaryKeyColumnRefCollection(SecondaryIndexInfo parent) - : base(parent, "PrimaryKeyColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class PrimaryKeyColumnRefCollection : NodeCollectionBase + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent. + public PrimaryKeyColumnRefCollection(SecondaryIndexInfo parent) + : base(parent, "PrimaryKeyColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Ref.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Ref.cs index 8a22fa6931..5eb2cdf75e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/Ref.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/Ref.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// The reference to model node. - /// - /// The type of the target node. - /// The type of the parent node. - [Serializable] - public abstract class Ref : NodeBase, - IUnnamedNode, - INodeReference - where TTarget : Node - where TParent : Node - { - private TTarget value; - - /// - /// Gets or sets referenced node. - /// - /// Value is already initialized. - [Property(Priority = 0)] - public TTarget Value - { - get { return value; } - set - { -// if (this.value!=null) -// throw Exceptions.AlreadyInitialized("Value"); - EnsureIsEditable(); - using (var scope = LogPropertyChange("Value", value)) { - this.value = value; - scope.Commit(); - } - } - } - - Node INodeReference.Value - { - get { return Value; } - set { Value = (TTarget)value; } - } - - - // Constructors - - /// - protected Ref(TParent parent) - : base(parent, null) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// The reference to model node. + /// + /// The type of the target node. + /// The type of the parent node. + [Serializable] + public abstract class Ref : NodeBase, + IUnnamedNode, + INodeReference + where TTarget : Node + where TParent : Node + { + private TTarget value; + + /// + /// Gets or sets referenced node. + /// + /// Value is already initialized. + [Property(Priority = 0)] + public TTarget Value + { + get { return value; } + set + { +// if (this.value!=null) +// throw Exceptions.AlreadyInitialized("Value"); + EnsureIsEditable(); + using (var scope = LogPropertyChange("Value", value)) { + this.value = value; + scope.Commit(); + } + } + } + + Node INodeReference.Value + { + get { return Value; } + set { Value = (TTarget)value; } + } + + + // Constructors + + /// + protected Ref(TParent parent) + : base(parent, null) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ReferentialAction.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ReferentialAction.cs index cbbdc278b6..8b49c7b821 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ReferentialAction.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ReferentialAction.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.17 - -using System; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Referential integrity maintenance actions. - /// - [Serializable] - public enum ReferentialAction - { - /// - /// Do nothing to maintain referential integrity. - /// - None = 0, - /// - /// The same as . - /// - Default = Restrict, - /// - /// Restricts primary key update \ removal when it is referenced by some foreign key. - /// - Restrict = 1, - /// - /// Cascades primary key update \ removal to its foreign key. - /// - Cascade = 2, - /// - /// Clears the foreign key on its primary key update \ removal. - /// - Clear = 3, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.17 + +using System; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Referential integrity maintenance actions. + /// + [Serializable] + public enum ReferentialAction + { + /// + /// Do nothing to maintain referential integrity. + /// + None = 0, + /// + /// The same as . + /// + Default = Restrict, + /// + /// Restricts primary key update \ removal when it is referenced by some foreign key. + /// + Restrict = 1, + /// + /// Cascades primary key update \ removal to its foreign key. + /// + Cascade = 2, + /// + /// Clears the foreign key on its primary key update \ removal. + /// + Clear = 3, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfo.cs index c7e93cdf24..81887eef1a 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfo.cs @@ -1,155 +1,155 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using System.Linq; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; -using Xtensive.Collections; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Secondary index. - /// - [Serializable] - public sealed class SecondaryIndexInfo : StorageIndexInfo - { - private PartialIndexFilterInfo filter; - - /// - /// Gets value columns. - /// - [Property(Priority = -110)] - public PrimaryKeyColumnRefCollection PrimaryKeyColumns { get; private set; } - - /// - /// Gets included columns. - /// - [Property(Priority = -100)] - public IncludedColumnRefCollection IncludedColumns { get; private set; } - - /// - /// Gets filter expression for partial index. - /// - [Property(Priority = -90)] - public PartialIndexFilterInfo Filter - { - get { return filter; } - set - { - EnsureIsEditable(); - filter = value; - } - } - - /// - /// Populates collection by - /// copying them from primary index. - /// - public void PopulatePrimaryKeyColumns() - { - if (Parent.PrimaryIndex == null) - return; - foreach (var kcr in Parent.PrimaryIndex.KeyColumns) - new PrimaryKeyColumnRef(this, kcr.Value, kcr.Direction); - } - - /// - /// Empty secondary key columns collection. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - - // Secondary key columns: empty set, duplicates - var keyColumns = KeyColumns.Select(valueRef => valueRef.Value).ToList(); - if (keyColumns.Count==0) - ea.Execute(() => { - throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); - }); - foreach (var group in keyColumns - .GroupBy(keyColumn => keyColumn) - .Where(g => g.Count() > 1)) { - ea.Execute((_column) => { - throw new ValidationException( - string.Format(Strings.ExMoreThenOneKeyColumnReferenceToColumnX, _column.Name), - Path); - }, group.Key); - } - - // Primary key columns - if (Parent.PrimaryIndex != null && PrimaryKeyColumns.Count!=Parent.PrimaryIndex.KeyColumns.Count) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); - }); - for (int i = 0; i < PrimaryKeyColumns.Count; i++) { - var ref1 = PrimaryKeyColumns[i]; - var ref2 = Parent.PrimaryIndex.KeyColumns[i]; - if (ref1.Value!=ref2.Value || ref1.Direction!=ref2.Direction) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); - }); - } - - // Included columns - var fullKeySet = - KeyColumns - .Select(cr => cr.Value) - .Concat(PrimaryKeyColumns.Select(cr => cr.Value)) - .ToHashSet(); - foreach (var columnRef in IncludedColumns) { - if (fullKeySet.Contains(columnRef.Value)) - ea.Execute(() => { - throw new ValidationException(Strings.ExInvalidIncludedColumnsCollection, Path); - }); - } - - foreach (var group in IncludedColumns - .GroupBy(keyColumn => keyColumn) - .Where(g => g.Count() > 1)) { - ea.Execute((_column) => { - throw new ValidationException( - string.Format(Strings.ExMoreThenOneIncludedColumnReferenceToColumnX, _column.Name), - Path); - }, group.Key); - } - - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "SecondaryIndexes"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (PrimaryKeyColumns==null) - PrimaryKeyColumns = new PrimaryKeyColumnRefCollection(this); - if (IncludedColumns==null) - IncludedColumns = new IncludedColumnRefCollection(this); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The index name. - public SecondaryIndexInfo(TableInfo table, string name) - : base(table, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using System.Linq; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; +using Xtensive.Collections; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Secondary index. + /// + [Serializable] + public sealed class SecondaryIndexInfo : StorageIndexInfo + { + private PartialIndexFilterInfo filter; + + /// + /// Gets value columns. + /// + [Property(Priority = -110)] + public PrimaryKeyColumnRefCollection PrimaryKeyColumns { get; private set; } + + /// + /// Gets included columns. + /// + [Property(Priority = -100)] + public IncludedColumnRefCollection IncludedColumns { get; private set; } + + /// + /// Gets filter expression for partial index. + /// + [Property(Priority = -90)] + public PartialIndexFilterInfo Filter + { + get { return filter; } + set + { + EnsureIsEditable(); + filter = value; + } + } + + /// + /// Populates collection by + /// copying them from primary index. + /// + public void PopulatePrimaryKeyColumns() + { + if (Parent.PrimaryIndex == null) + return; + foreach (var kcr in Parent.PrimaryIndex.KeyColumns) + new PrimaryKeyColumnRef(this, kcr.Value, kcr.Direction); + } + + /// + /// Empty secondary key columns collection. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + + // Secondary key columns: empty set, duplicates + var keyColumns = KeyColumns.Select(valueRef => valueRef.Value).ToList(); + if (keyColumns.Count==0) + ea.Execute(() => { + throw new ValidationException(Strings.ExEmptyKeyColumnsCollection, Path); + }); + foreach (var group in keyColumns + .GroupBy(keyColumn => keyColumn) + .Where(g => g.Count() > 1)) { + ea.Execute((_column) => { + throw new ValidationException( + string.Format(Strings.ExMoreThenOneKeyColumnReferenceToColumnX, _column.Name), + Path); + }, group.Key); + } + + // Primary key columns + if (Parent.PrimaryIndex != null && PrimaryKeyColumns.Count!=Parent.PrimaryIndex.KeyColumns.Count) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); + }); + for (int i = 0; i < PrimaryKeyColumns.Count; i++) { + var ref1 = PrimaryKeyColumns[i]; + var ref2 = Parent.PrimaryIndex.KeyColumns[i]; + if (ref1.Value!=ref2.Value || ref1.Direction!=ref2.Direction) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidPrimaryKeyColumnsCollection, Path); + }); + } + + // Included columns + var fullKeySet = + KeyColumns + .Select(cr => cr.Value) + .Concat(PrimaryKeyColumns.Select(cr => cr.Value)) + .ToHashSet(); + foreach (var columnRef in IncludedColumns) { + if (fullKeySet.Contains(columnRef.Value)) + ea.Execute(() => { + throw new ValidationException(Strings.ExInvalidIncludedColumnsCollection, Path); + }); + } + + foreach (var group in IncludedColumns + .GroupBy(keyColumn => keyColumn) + .Where(g => g.Count() > 1)) { + ea.Execute((_column) => { + throw new ValidationException( + string.Format(Strings.ExMoreThenOneIncludedColumnReferenceToColumnX, _column.Name), + Path); + }, group.Key); + } + + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "SecondaryIndexes"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (PrimaryKeyColumns==null) + PrimaryKeyColumns = new PrimaryKeyColumnRefCollection(this); + if (IncludedColumns==null) + IncludedColumns = new IncludedColumnRefCollection(this); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The index name. + public SecondaryIndexInfo(TableInfo table, string name) + : base(table, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfoCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfoCollection.cs index 7672ed5f3e..853661a483 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfoCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SecondaryIndexInfoCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of secondary indexes. - /// - [Serializable] - public sealed class SecondaryIndexInfoCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The table. - public SecondaryIndexInfoCollection(TableInfo table) - : base(table, "SecondaryIndexes") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of secondary indexes. + /// + [Serializable] + public sealed class SecondaryIndexInfoCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The table. + public SecondaryIndexInfoCollection(TableInfo table) + : base(table, "SecondaryIndexes") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SequenceInfoCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SequenceInfoCollection.cs index 474c846f15..33145e64ff 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/SequenceInfoCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/SequenceInfoCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.29 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// The collection of instances. - /// - [Serializable] - public sealed class SequenceInfoCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The storage. - public SequenceInfoCollection(StorageModel parent) - : base(parent, "Sequences") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.29 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// The collection of instances. + /// + [Serializable] + public sealed class SequenceInfoCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The storage. + public SequenceInfoCollection(StorageModel parent) + : base(parent, "Sequences") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageColumnInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageColumnInfo.cs index e540acd546..f87a2bae98 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageColumnInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageColumnInfo.cs @@ -1,121 +1,121 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Column. - /// - [Serializable] - public sealed class StorageColumnInfo : NodeBase - { - private StorageTypeInfo type; - private object defaultValue; - private string defaultSqlExpression; - - /// - /// Gets or sets the type of the column. - /// - [Property(Priority = -1000)] - public StorageTypeInfo Type { - get { return type; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Type", value)) { - type = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the default column value. - /// - [Property(IgnoreInComparison = true)] - public object DefaultValue - { - get { return defaultValue; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("DefaultValue", value)) { - defaultValue = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets arbitrary SQL expression as default value for this column. - /// This default value has higher priority than . - /// - [Property(IgnoreInComparison = true)] - public string DefaultSqlExpression - { - get { return defaultSqlExpression; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("DefaultSqlExpression", value)) { - defaultSqlExpression = value; - scope.Commit(); - } - } - } - - /// - /// Validation error. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - if (Type==null) { - ea.Execute(() => { - throw new ValidationException( - string.Format(Strings.ExUndefinedTypeOfColumnX, Name), - Path); - }); - } - ea.Complete(); - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Columns"); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The name. - public StorageColumnInfo(TableInfo table, string name) - : base(table, name) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The column name. - /// Type of the column. - public StorageColumnInfo(TableInfo table, string name, StorageTypeInfo type) - : this(table, name) - { - Type = type; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Column. + /// + [Serializable] + public sealed class StorageColumnInfo : NodeBase + { + private StorageTypeInfo type; + private object defaultValue; + private string defaultSqlExpression; + + /// + /// Gets or sets the type of the column. + /// + [Property(Priority = -1000)] + public StorageTypeInfo Type { + get { return type; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Type", value)) { + type = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the default column value. + /// + [Property(IgnoreInComparison = true)] + public object DefaultValue + { + get { return defaultValue; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("DefaultValue", value)) { + defaultValue = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets arbitrary SQL expression as default value for this column. + /// This default value has higher priority than . + /// + [Property(IgnoreInComparison = true)] + public string DefaultSqlExpression + { + get { return defaultSqlExpression; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("DefaultSqlExpression", value)) { + defaultSqlExpression = value; + scope.Commit(); + } + } + } + + /// + /// Validation error. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + if (Type==null) { + ea.Execute(() => { + throw new ValidationException( + string.Format(Strings.ExUndefinedTypeOfColumnX, Name), + Path); + }); + } + ea.Complete(); + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Columns"); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The name. + public StorageColumnInfo(TableInfo table, string name) + : base(table, name) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The column name. + /// Type of the column. + public StorageColumnInfo(TableInfo table, string name, StorageTypeInfo type) + : this(table, name) + { + Type = type; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageFullTextIndexInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageFullTextIndexInfo.cs index a98386da81..c2b19636fb 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageFullTextIndexInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageFullTextIndexInfo.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.01.14 - -using System; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Full-text index. - /// - [Serializable] - public sealed class StorageFullTextIndexInfo : NodeBase - { - /// - /// Gets columns. - /// - [Property(Priority = -1000)] - public FullTextColumnRefCollection Columns { get; private set; } - - /// - /// Gets name of full-text catalog. - /// - [Property(Priority = -2000)] - public string FullTextCatalog { get; set; } - - /// - /// Gets mode of change tracking for the index. - /// - [Property(Priority = -3000, IgnoreInComparison = true)] - public FullTextChangeTrackingMode ChangeTrackingMode { get; set; } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "FullTextIndexes"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - if (Columns == null) - Columns = new FullTextColumnRefCollection(this); - ChangeTrackingMode = FullTextChangeTrackingMode.Default; - } - - /// - /// - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - base.ValidateState(); - - var tableColumns = Parent.Columns; - var columns = Columns.Select(keyRef => keyRef.Value).ToList(); - - if (columns.Count == 0) { - ea.Execute(() => { - throw new ValidationException(Strings.ExEmptyColumnsCollection, Path); - }); - } - - ea.Complete(); - } - } - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The index. - public StorageFullTextIndexInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.01.14 + +using System; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Full-text index. + /// + [Serializable] + public sealed class StorageFullTextIndexInfo : NodeBase + { + /// + /// Gets columns. + /// + [Property(Priority = -1000)] + public FullTextColumnRefCollection Columns { get; private set; } + + /// + /// Gets name of full-text catalog. + /// + [Property(Priority = -2000)] + public string FullTextCatalog { get; set; } + + /// + /// Gets mode of change tracking for the index. + /// + [Property(Priority = -3000, IgnoreInComparison = true)] + public FullTextChangeTrackingMode ChangeTrackingMode { get; set; } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "FullTextIndexes"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + if (Columns == null) + Columns = new FullTextColumnRefCollection(this); + ChangeTrackingMode = FullTextChangeTrackingMode.Default; + } + + /// + /// + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + base.ValidateState(); + + var tableColumns = Parent.Columns; + var columns = Columns.Select(keyRef => keyRef.Value).ToList(); + + if (columns.Count == 0) { + ea.Execute(() => { + throw new ValidationException(Strings.ExEmptyColumnsCollection, Path); + }); + } + + ea.Complete(); + } + } + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The index. + public StorageFullTextIndexInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageIndexInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageIndexInfo.cs index c9a35ea6bd..75bedeaff7 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageIndexInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageIndexInfo.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Core; - -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// The base abstract class for all indexes. - /// - [Serializable] - public abstract class StorageIndexInfo : NodeBase - { - private bool isUnique; - private bool isClustered; - - /// - /// Gets a value indicating whether this instance is unique. - /// - /// Already initialized. - [Property(Priority = -1100)] - public bool IsUnique - { - get { return isUnique; } - set - { - EnsureIsEditable(); - if (IsPrimary && !value) - throw Exceptions.AlreadyInitialized("IsUnique"); - using (var scope = LogPropertyChange("IsUnique", value)) { - isUnique = value; - scope.Commit(); - } - } - } - - /// - /// Gets a value indicating whether this instance is primary. - /// - [Property(IgnoreInComparison = true)] - public bool IsPrimary { get; private set; } - - /// - /// Gets key columns. - /// - [Property(Priority = -1000)] - public KeyColumnRefCollection KeyColumns { get; private set; } - - /// - /// Gets a value indicating whether this instance is clustered. - /// - [Property(Priority = -900)] - public bool IsClustered - { - get { return isClustered; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("IsClustered", value)) { - isClustered = value; - scope.Commit(); - } - } - } - - /// - protected override void Initialize() - { - base.Initialize(); - IsPrimary = this is PrimaryIndexInfo; - if (IsPrimary) - isUnique = true; - if (KeyColumns == null) - KeyColumns = new KeyColumnRefCollection(this); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent table. - /// The index. - /// - protected StorageIndexInfo(TableInfo parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Core; + +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// The base abstract class for all indexes. + /// + [Serializable] + public abstract class StorageIndexInfo : NodeBase + { + private bool isUnique; + private bool isClustered; + + /// + /// Gets a value indicating whether this instance is unique. + /// + /// Already initialized. + [Property(Priority = -1100)] + public bool IsUnique + { + get { return isUnique; } + set + { + EnsureIsEditable(); + if (IsPrimary && !value) + throw Exceptions.AlreadyInitialized("IsUnique"); + using (var scope = LogPropertyChange("IsUnique", value)) { + isUnique = value; + scope.Commit(); + } + } + } + + /// + /// Gets a value indicating whether this instance is primary. + /// + [Property(IgnoreInComparison = true)] + public bool IsPrimary { get; private set; } + + /// + /// Gets key columns. + /// + [Property(Priority = -1000)] + public KeyColumnRefCollection KeyColumns { get; private set; } + + /// + /// Gets a value indicating whether this instance is clustered. + /// + [Property(Priority = -900)] + public bool IsClustered + { + get { return isClustered; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("IsClustered", value)) { + isClustered = value; + scope.Commit(); + } + } + } + + /// + protected override void Initialize() + { + base.Initialize(); + IsPrimary = this is PrimaryIndexInfo; + if (IsPrimary) + isUnique = true; + if (KeyColumns == null) + KeyColumns = new KeyColumnRefCollection(this); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent table. + /// The index. + /// + protected StorageIndexInfo(TableInfo parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageModel.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageModel.cs index 60341371f1..88cf149090 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageModel.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageModel.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.20 - -using System; - -using Xtensive.Modelling; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Storage schema. - /// - [Serializable] - public sealed class StorageModel : NodeBase, - IModel - { - /// - /// Default node name. - /// - public readonly static string DefaultName = "."; - - private ActionSequence actions; - - /// - public ActionSequence Actions { - get { return actions; } - set { - EnsureIsEditable(); - actions = value; - } - } - - /// - /// Gets tables. - /// - [Property(Priority = 0)] - public TableInfoCollection Tables { get; private set; } - - /// - /// Gets sequences. - /// - [Property] - public SequenceInfoCollection Sequences { get; private set; } - - /// - protected override void Initialize() - { - base.Initialize(); - - if (Tables == null) - Tables = new TableInfoCollection(this); - if (Sequences==null) - Sequences=new SequenceInfoCollection(this); - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The storage name. - public StorageModel(string name) - : base(null, name) - { - } - - /// - /// Initializes a new instance of this class. - /// - public StorageModel() - : base(null, DefaultName) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.20 + +using System; + +using Xtensive.Modelling; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Storage schema. + /// + [Serializable] + public sealed class StorageModel : NodeBase, + IModel + { + /// + /// Default node name. + /// + public readonly static string DefaultName = "."; + + private ActionSequence actions; + + /// + public ActionSequence Actions { + get { return actions; } + set { + EnsureIsEditable(); + actions = value; + } + } + + /// + /// Gets tables. + /// + [Property(Priority = 0)] + public TableInfoCollection Tables { get; private set; } + + /// + /// Gets sequences. + /// + [Property] + public SequenceInfoCollection Sequences { get; private set; } + + /// + protected override void Initialize() + { + base.Initialize(); + + if (Tables == null) + Tables = new TableInfoCollection(this); + if (Sequences==null) + Sequences=new SequenceInfoCollection(this); + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The storage name. + public StorageModel(string name) + : base(null, name) + { + } + + /// + /// Initializes a new instance of this class. + /// + public StorageModel() + : base(null, DefaultName) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageSequenceInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageSequenceInfo.cs index 31c3b07001..c7a5d059fd 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageSequenceInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageSequenceInfo.cs @@ -1,124 +1,124 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.04.29 - -using System; -using Xtensive.Core; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Sequence. - /// - [Serializable] - public sealed class StorageSequenceInfo : NodeBase - { - private StorageTypeInfo type; - private long seed; - private long increment; - - /// - /// Gets or sets the start value. - /// - [Property(IgnoreInComparison = true)] - public long Seed - { - get { return seed; } - set - { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Seed", value)) { - seed = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the increment. - /// - [Property] - public long Increment - { - get { return increment; } - set - { -// Increment value can be negative -// ArgumentValidator -// .EnsureArgumentIsGreaterThan(value, 0, "Increment"); - EnsureIsEditable(); - using (var scope = LogPropertyChange("Increment", value)) { - increment = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the type. - /// - [Property(IgnoreInComparison = true)] - public StorageTypeInfo Type { - get { return type; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("Type", value)) { - type = value; - scope.Commit(); - } - } - } - - /// - /// Gets or sets the current sequence value. - /// - public long? Current { get; set; } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Sequences"); - } - - /// - /// ValidationException. - protected override void ValidateState() - { - using (var ea = new ExceptionAggregator()) { - ea.Execute(base.ValidateState); - if (Increment<=0) { - ea.Execute(() => { - throw new ValidationException( - string.Format(Strings.ExInvalideIncrementValue), - Path); - }); - } - if (Type==null) { - ea.Execute(() => { - throw new ValidationException( - string.Format(string.Format(Strings.ExUndefinedTypeOfSequenceX, Name)), - Path); - }); - } - ea.Complete(); - } - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent. - /// The name. - public StorageSequenceInfo(StorageModel parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.04.29 + +using System; +using Xtensive.Core; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Sequence. + /// + [Serializable] + public sealed class StorageSequenceInfo : NodeBase + { + private StorageTypeInfo type; + private long seed; + private long increment; + + /// + /// Gets or sets the start value. + /// + [Property(IgnoreInComparison = true)] + public long Seed + { + get { return seed; } + set + { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Seed", value)) { + seed = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the increment. + /// + [Property] + public long Increment + { + get { return increment; } + set + { +// Increment value can be negative +// ArgumentValidator +// .EnsureArgumentIsGreaterThan(value, 0, "Increment"); + EnsureIsEditable(); + using (var scope = LogPropertyChange("Increment", value)) { + increment = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the type. + /// + [Property(IgnoreInComparison = true)] + public StorageTypeInfo Type { + get { return type; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("Type", value)) { + type = value; + scope.Commit(); + } + } + } + + /// + /// Gets or sets the current sequence value. + /// + public long? Current { get; set; } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Sequences"); + } + + /// + /// ValidationException. + protected override void ValidateState() + { + using (var ea = new ExceptionAggregator()) { + ea.Execute(base.ValidateState); + if (Increment<=0) { + ea.Execute(() => { + throw new ValidationException( + string.Format(Strings.ExInvalideIncrementValue), + Path); + }); + } + if (Type==null) { + ea.Execute(() => { + throw new ValidationException( + string.Format(string.Format(Strings.ExUndefinedTypeOfSequenceX, Name)), + Path); + }); + } + ea.Complete(); + } + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent. + /// The name. + public StorageSequenceInfo(StorageModel parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs index b7f123fbd3..1176d8610a 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs @@ -1,277 +1,277 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using System.Globalization; -using Xtensive.Core; - -using System.Text; -using Xtensive.Reflection; -using Xtensive.Modelling.Validation; -using Xtensive.Sql; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Type of table column. - /// - [Serializable] - public sealed class StorageTypeInfo : IEquatable, - IValidatable, - ICloneable - { - /// - /// Gets the with undefined type. - /// - public static StorageTypeInfo Undefined { get { return new StorageTypeInfo(); } } - - /// - /// Gets a value indicating whether type is undefined. - /// - public bool IsTypeUndefined { get { return Type==null; } } - - /// - /// Gets the type of the data. - /// - public Type Type { get; private set; } - - /// - /// Indicates whether is nullable. - /// - public bool IsNullable { get; private set; } - - /// - /// Gets the length. - /// - public int? Length { get; private set; } - - /// - /// Gets the scale. - /// - public int? Scale { get; private set; } - - /// - /// Gets the precision. - /// - public int? Precision { get; private set; } - - /// - /// Gets the native type. - /// - public SqlValueType NativeType { get; private set; } - - /// - public void Validate() - { - // TODO: Implement - } - - #region Implementation of ICloneable - - /// - public object Clone() - { - if (IsTypeUndefined) - return Undefined; - var clone = new StorageTypeInfo(Type, NativeType, IsNullable); - clone.Length = Length; - clone.Scale = Scale; - clone.Precision = Precision; - return clone; - } - - #endregion - - #region Equality members - - /// - public bool Equals(StorageTypeInfo other) - { - if (IsTypeUndefined) - return false; - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - if (other.IsTypeUndefined) - return false; - var isEqual = - other.Type==Type && - other.IsNullable==IsNullable && - other.Scale==Scale && - other.Precision==Precision && - other.Length==Length; - - return isEqual; - } - - /// - public override bool Equals(object obj) - { - if (IsTypeUndefined) - return false; - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (StorageTypeInfo)) - return false; - return Equals((StorageTypeInfo) obj); - } - - /// - public override int GetHashCode() - { - unchecked { - int result = (Type!=null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (IsNullable ? 1 : 0); - if (Length.HasValue) - result = (result * 397) ^ Length.Value; - if (Scale.HasValue) - result = (result * 397) ^ Scale.Value; - if (Precision.HasValue) - result = (result * 397) ^ Precision.Value; - return result; - } - } - - /// - /// Implements the operator ==. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator ==(StorageTypeInfo left, StorageTypeInfo right) - { - return Equals(left, right); - } - - /// - /// Implements the operator !=. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator !=(StorageTypeInfo left, StorageTypeInfo right) - { - return !Equals(left, right); - } - - #endregion - - /// - public override string ToString() - { - if (IsTypeUndefined) - return "Type is undefined."; - - var sb = new StringBuilder(); - var type = Type; - if (type.IsNullable()) - type = type.GetGenericArguments()[0]; - sb.Append(string.Format(Strings.PropertyPairFormat, Strings.Type, type.GetShortName())); - if (IsNullable) - sb.Append(Strings.NullableMark); - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Length, Length.HasValue ? Length.Value.ToString() : "null")); - if (Scale > 0) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Scale, Scale)); - if (Precision > 0) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.Precision, Precision)); - if (NativeType!=null) - sb.Append(Strings.Comma).Append(string.Format( - Strings.PropertyPairFormat, Strings.NativeType, NativeType)); - return sb.ToString(); - } - - // Constructors - - private StorageTypeInfo() - { - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - public StorageTypeInfo(Type type, SqlValueType nativeType) - : this(type, nativeType, type.IsClass || type.IsNullable()) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - /// The length. - public StorageTypeInfo(Type type, SqlValueType nativeType, int? length) - : this(type, nativeType, type.IsClass || type.IsNullable(), length) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - /// The length. - /// The precision. - /// The scale. - public StorageTypeInfo(Type type, SqlValueType nativeType, int? length, int? precision, int? scale) - : this(type, nativeType, type.IsClass || type.IsNullable(), length, precision, scale) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - /// Indicates whether type is nullable. - public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable) - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - if (isNullable && type.IsValueType && !type.IsNullable()) - ArgumentValidator.EnsureArgumentIsInRange(true, false, false, "isNullable"); - Type = type; - IsNullable = isNullable; - NativeType = nativeType; - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - /// Indicates whether type is nullable. - /// The length. - public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable, int? length) - : this(type, nativeType, isNullable) - { - Length = length; - } - - /// - /// Initializes a new instance of this class. - /// - /// Underlying data type. - /// The native type. - /// Indicates whether type is nullable. - /// The length. - /// The precision. - /// The scale. - public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable, int? length, int? precision, int? scale) - : this(type, nativeType, isNullable, length) - { - Scale = scale; - Precision = precision; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using System.Globalization; +using Xtensive.Core; + +using System.Text; +using Xtensive.Reflection; +using Xtensive.Modelling.Validation; +using Xtensive.Sql; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Type of table column. + /// + [Serializable] + public sealed class StorageTypeInfo : IEquatable, + IValidatable, + ICloneable + { + /// + /// Gets the with undefined type. + /// + public static StorageTypeInfo Undefined { get { return new StorageTypeInfo(); } } + + /// + /// Gets a value indicating whether type is undefined. + /// + public bool IsTypeUndefined { get { return Type==null; } } + + /// + /// Gets the type of the data. + /// + public Type Type { get; private set; } + + /// + /// Indicates whether is nullable. + /// + public bool IsNullable { get; private set; } + + /// + /// Gets the length. + /// + public int? Length { get; private set; } + + /// + /// Gets the scale. + /// + public int? Scale { get; private set; } + + /// + /// Gets the precision. + /// + public int? Precision { get; private set; } + + /// + /// Gets the native type. + /// + public SqlValueType NativeType { get; private set; } + + /// + public void Validate() + { + // TODO: Implement + } + + #region Implementation of ICloneable + + /// + public object Clone() + { + if (IsTypeUndefined) + return Undefined; + var clone = new StorageTypeInfo(Type, NativeType, IsNullable); + clone.Length = Length; + clone.Scale = Scale; + clone.Precision = Precision; + return clone; + } + + #endregion + + #region Equality members + + /// + public bool Equals(StorageTypeInfo other) + { + if (IsTypeUndefined) + return false; + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + if (other.IsTypeUndefined) + return false; + var isEqual = + other.Type==Type && + other.IsNullable==IsNullable && + other.Scale==Scale && + other.Precision==Precision && + other.Length==Length; + + return isEqual; + } + + /// + public override bool Equals(object obj) + { + if (IsTypeUndefined) + return false; + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (StorageTypeInfo)) + return false; + return Equals((StorageTypeInfo) obj); + } + + /// + public override int GetHashCode() + { + unchecked { + int result = (Type!=null ? Type.GetHashCode() : 0); + result = (result * 397) ^ (IsNullable ? 1 : 0); + if (Length.HasValue) + result = (result * 397) ^ Length.Value; + if (Scale.HasValue) + result = (result * 397) ^ Scale.Value; + if (Precision.HasValue) + result = (result * 397) ^ Precision.Value; + return result; + } + } + + /// + /// Implements the operator ==. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator ==(StorageTypeInfo left, StorageTypeInfo right) + { + return Equals(left, right); + } + + /// + /// Implements the operator !=. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator !=(StorageTypeInfo left, StorageTypeInfo right) + { + return !Equals(left, right); + } + + #endregion + + /// + public override string ToString() + { + if (IsTypeUndefined) + return "Type is undefined."; + + var sb = new StringBuilder(); + var type = Type; + if (type.IsNullable()) + type = type.GetGenericArguments()[0]; + sb.Append(string.Format(Strings.PropertyPairFormat, Strings.Type, type.GetShortName())); + if (IsNullable) + sb.Append(Strings.NullableMark); + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Length, Length.HasValue ? Length.Value.ToString() : "null")); + if (Scale > 0) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Scale, Scale)); + if (Precision > 0) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.Precision, Precision)); + if (NativeType!=null) + sb.Append(Strings.Comma).Append(string.Format( + Strings.PropertyPairFormat, Strings.NativeType, NativeType)); + return sb.ToString(); + } + + // Constructors + + private StorageTypeInfo() + { + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + public StorageTypeInfo(Type type, SqlValueType nativeType) + : this(type, nativeType, type.IsClass || type.IsNullable()) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + /// The length. + public StorageTypeInfo(Type type, SqlValueType nativeType, int? length) + : this(type, nativeType, type.IsClass || type.IsNullable(), length) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + /// The length. + /// The precision. + /// The scale. + public StorageTypeInfo(Type type, SqlValueType nativeType, int? length, int? precision, int? scale) + : this(type, nativeType, type.IsClass || type.IsNullable(), length, precision, scale) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + /// Indicates whether type is nullable. + public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable) + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + if (isNullable && type.IsValueType && !type.IsNullable()) + ArgumentValidator.EnsureArgumentIsInRange(true, false, false, "isNullable"); + Type = type; + IsNullable = isNullable; + NativeType = nativeType; + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + /// Indicates whether type is nullable. + /// The length. + public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable, int? length) + : this(type, nativeType, isNullable) + { + Length = length; + } + + /// + /// Initializes a new instance of this class. + /// + /// Underlying data type. + /// The native type. + /// Indicates whether type is nullable. + /// The length. + /// The precision. + /// The scale. + public StorageTypeInfo(Type type, SqlValueType nativeType, bool isNullable, int? length, int? precision, int? scale) + : this(type, nativeType, isNullable, length) + { + Scale = scale; + Precision = precision; + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfo.cs index 48b2f5548c..07beb0e689 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfo.cs @@ -1,105 +1,105 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; -using Xtensive.Modelling; -using Xtensive.Modelling.Attributes; -using System.Collections.Generic; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// Table. - /// - [Serializable] - public sealed class TableInfo : NodeBase - { - private PrimaryIndexInfo primaryIndex; - - /// - /// Gets columns. - /// - [Property(Priority = -2000)] - public ColumnInfoCollection Columns { get; private set; } - - /// - /// Gets or sets the primary index. - /// - [Property(Priority = -1200, IsImmutable = true)] - public PrimaryIndexInfo PrimaryIndex { - get { return primaryIndex; } - set { - EnsureIsEditable(); - using (var scope = LogPropertyChange("PrimaryIndex", value)) { - primaryIndex = value; - scope.Commit(); - } - } - } - - /// - /// Gets secondary indexes. - /// - [Property(Priority = -1100, IsImmutable = true)] - public SecondaryIndexInfoCollection SecondaryIndexes { get; private set; } - - /// - /// Gets foreign keys. - /// - [Property(Priority = -1000, IsImmutable = true, DependencyRootType = typeof (TableInfoCollection))] - public ForeignKeyCollection ForeignKeys { get; private set; } - - /// - /// Gets full-text indexes. - /// - [Property(Priority = -900, IsImmutable = true)] - public FullTextIndexInfoCollection FullTextIndexes { get; private set;} - - /// - /// Gets all indexes belongs to the table. - /// - /// iterator. - public IEnumerable AllIndexes - { - get - { - yield return PrimaryIndex; - foreach (var indexInfo in SecondaryIndexes) - yield return indexInfo; - } - } - - /// - protected override Nesting CreateNesting() - { - return new Nesting(this, "Tables"); - } - - /// - protected override void Initialize() - { - base.Initialize(); - - if (Columns==null) - Columns = new ColumnInfoCollection(this); - if (SecondaryIndexes == null) - SecondaryIndexes = new SecondaryIndexInfoCollection(this); - if (FullTextIndexes == null) - FullTextIndexes = new FullTextIndexInfoCollection(this); - if (ForeignKeys == null) - ForeignKeys = new ForeignKeyCollection(this); - } - - - // Constructors - - /// - public TableInfo(StorageModel parent, string name) - : base(parent, name) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; +using Xtensive.Modelling; +using Xtensive.Modelling.Attributes; +using System.Collections.Generic; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// Table. + /// + [Serializable] + public sealed class TableInfo : NodeBase + { + private PrimaryIndexInfo primaryIndex; + + /// + /// Gets columns. + /// + [Property(Priority = -2000)] + public ColumnInfoCollection Columns { get; private set; } + + /// + /// Gets or sets the primary index. + /// + [Property(Priority = -1200, IsImmutable = true)] + public PrimaryIndexInfo PrimaryIndex { + get { return primaryIndex; } + set { + EnsureIsEditable(); + using (var scope = LogPropertyChange("PrimaryIndex", value)) { + primaryIndex = value; + scope.Commit(); + } + } + } + + /// + /// Gets secondary indexes. + /// + [Property(Priority = -1100, IsImmutable = true)] + public SecondaryIndexInfoCollection SecondaryIndexes { get; private set; } + + /// + /// Gets foreign keys. + /// + [Property(Priority = -1000, IsImmutable = true, DependencyRootType = typeof (TableInfoCollection))] + public ForeignKeyCollection ForeignKeys { get; private set; } + + /// + /// Gets full-text indexes. + /// + [Property(Priority = -900, IsImmutable = true)] + public FullTextIndexInfoCollection FullTextIndexes { get; private set;} + + /// + /// Gets all indexes belongs to the table. + /// + /// iterator. + public IEnumerable AllIndexes + { + get + { + yield return PrimaryIndex; + foreach (var indexInfo in SecondaryIndexes) + yield return indexInfo; + } + } + + /// + protected override Nesting CreateNesting() + { + return new Nesting(this, "Tables"); + } + + /// + protected override void Initialize() + { + base.Initialize(); + + if (Columns==null) + Columns = new ColumnInfoCollection(this); + if (SecondaryIndexes == null) + SecondaryIndexes = new SecondaryIndexInfoCollection(this); + if (FullTextIndexes == null) + FullTextIndexes = new FullTextIndexInfoCollection(this); + if (ForeignKeys == null) + ForeignKeys = new ForeignKeyCollection(this); + } + + + // Constructors + + /// + public TableInfo(StorageModel parent, string name) + : base(parent, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfoCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfoCollection.cs index 3c70fe78c7..dde50c7d98 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfoCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/TableInfoCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class TableInfoCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The storage. - public TableInfoCollection(StorageModel storage) - : base(storage, "Tables") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class TableInfoCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The storage. + public TableInfoCollection(StorageModel storage) + : base(storage, "Tables") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRef.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRef.cs index 1ff67f97bf..639ece5bd4 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRef.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRef.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// References to value column. - /// - [Serializable] - public sealed class ValueColumnRef : ColumnInfoRef - { - /// - protected override Nesting CreateNesting() - { - return new Nesting( - this, "ValueColumns"); - } - - - // Constructors - - /// - public ValueColumnRef(PrimaryIndexInfo parent) - : base(parent) - { - } - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - /// The referenced column. - public ValueColumnRef(PrimaryIndexInfo parent, StorageColumnInfo column) - : base(parent, column) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// References to value column. + /// + [Serializable] + public sealed class ValueColumnRef : ColumnInfoRef + { + /// + protected override Nesting CreateNesting() + { + return new Nesting( + this, "ValueColumns"); + } + + + // Constructors + + /// + public ValueColumnRef(PrimaryIndexInfo parent) + : base(parent) + { + } + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + /// The referenced column. + public ValueColumnRef(PrimaryIndexInfo parent, StorageColumnInfo column) + : base(parent, column) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRefCollection.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRefCollection.cs index dbd26eabd2..12199ac4b5 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRefCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/ValueColumnRefCollection.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.24 - -using System; - -using Xtensive.Modelling; - -namespace Xtensive.Orm.Upgrade.Model -{ - /// - /// A collection of instances. - /// - [Serializable] - public sealed class ValueColumnRefCollection : NodeCollectionBase, - IUnorderedNodeCollection - { - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The parent index. - public ValueColumnRefCollection(PrimaryIndexInfo parent) - : base(parent, "ValueColumns") - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.24 + +using System; + +using Xtensive.Modelling; + +namespace Xtensive.Orm.Upgrade.Model +{ + /// + /// A collection of instances. + /// + [Serializable] + public sealed class ValueColumnRefCollection : NodeCollectionBase, + IUnorderedNodeCollection + { + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The parent index. + public ValueColumnRefCollection(PrimaryIndexInfo parent) + : base(parent, "ValueColumns") + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonResult.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonResult.cs index 8828de2681..c39e010568 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonResult.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonResult.cs @@ -1,114 +1,114 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.01 - -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Collections; - -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using System.Linq; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// The result of schema comparison. - /// - public sealed class SchemaComparisonResult - { - /// - /// Gets the comparison status. - /// - public SchemaComparisonStatus SchemaComparisonStatus { get; private set; } - - /// - /// Gets or sets a value indicating whether there are unsafe actions. - /// - public bool HasUnsafeActions { get; private set; } - - /// - /// Gets or sets a value indicating whether there are column type changes. - /// - public bool HasColumnTypeChanges { get; private set; } - - /// - /// Indicates whether storage schema is compatible with domain model. - /// - public bool? IsCompatibleInLegacyMode { get; private set; } - - /// - /// Gets the list of unsafe actions. - /// - public ReadOnlyList UnsafeActions { get; private set;} - - #region Additional information - - /// - /// Gets the upgrade hints. - /// - public HintSet Hints { get; private set; } - - /// - /// Gets the schema difference. - /// - public Difference Difference { get; private set; } - - /// - /// Gets all upgrade actions. - /// - public ActionSequence UpgradeActions { get; private set; } - - #endregion - - /// - public override string ToString() - { - return string.Format(Strings.SchemaComparisonResultFormat, - SchemaComparisonStatus, - HasUnsafeActions.ToString().ToLower(), - HasColumnTypeChanges.ToString().ToLower(), - IsCompatibleInLegacyMode.HasValue ? IsCompatibleInLegacyMode.Value.ToString() : Strings.Unknown, - UnsafeActions.Any() ? UnsafeActions.ToDelimitedString("\r\n").Indent(2) : string.Empty, - Hints!=null ? Hints.ToString().Indent(2) : string.Empty, - Difference!=null ? Difference.ToString().Indent(2) : string.Empty); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The comparison status. - /// Indicates whether there are column type changes. - /// Indicates whether schemes are compatible in legacy mode. - /// The upgrade hints. - /// The difference. - /// The upgrade actions. - /// The unsafe (breaking) actions. - public SchemaComparisonResult( - SchemaComparisonStatus schemaComparisonStatus, - bool hasColumnTypeChanges, - bool? isCompatibleInLegacyMode, - HintSet hints, - Difference difference, - ActionSequence upgradeActions, - IList unsafeActions) - { - SchemaComparisonStatus = schemaComparisonStatus; - IsCompatibleInLegacyMode = isCompatibleInLegacyMode; - HasColumnTypeChanges = hasColumnTypeChanges; - Hints = hints; - Difference = difference; - UpgradeActions = upgradeActions; - UnsafeActions = unsafeActions!=null - ? new ReadOnlyList(unsafeActions) - : new ReadOnlyList(new List()); - HasUnsafeActions = UnsafeActions.Any(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.01 + +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Collections; + +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using System.Linq; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// The result of schema comparison. + /// + public sealed class SchemaComparisonResult + { + /// + /// Gets the comparison status. + /// + public SchemaComparisonStatus SchemaComparisonStatus { get; private set; } + + /// + /// Gets or sets a value indicating whether there are unsafe actions. + /// + public bool HasUnsafeActions { get; private set; } + + /// + /// Gets or sets a value indicating whether there are column type changes. + /// + public bool HasColumnTypeChanges { get; private set; } + + /// + /// Indicates whether storage schema is compatible with domain model. + /// + public bool? IsCompatibleInLegacyMode { get; private set; } + + /// + /// Gets the list of unsafe actions. + /// + public ReadOnlyList UnsafeActions { get; private set;} + + #region Additional information + + /// + /// Gets the upgrade hints. + /// + public HintSet Hints { get; private set; } + + /// + /// Gets the schema difference. + /// + public Difference Difference { get; private set; } + + /// + /// Gets all upgrade actions. + /// + public ActionSequence UpgradeActions { get; private set; } + + #endregion + + /// + public override string ToString() + { + return string.Format(Strings.SchemaComparisonResultFormat, + SchemaComparisonStatus, + HasUnsafeActions.ToString().ToLower(), + HasColumnTypeChanges.ToString().ToLower(), + IsCompatibleInLegacyMode.HasValue ? IsCompatibleInLegacyMode.Value.ToString() : Strings.Unknown, + UnsafeActions.Any() ? UnsafeActions.ToDelimitedString("\r\n").Indent(2) : string.Empty, + Hints!=null ? Hints.ToString().Indent(2) : string.Empty, + Difference!=null ? Difference.ToString().Indent(2) : string.Empty); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The comparison status. + /// Indicates whether there are column type changes. + /// Indicates whether schemes are compatible in legacy mode. + /// The upgrade hints. + /// The difference. + /// The upgrade actions. + /// The unsafe (breaking) actions. + public SchemaComparisonResult( + SchemaComparisonStatus schemaComparisonStatus, + bool hasColumnTypeChanges, + bool? isCompatibleInLegacyMode, + HintSet hints, + Difference difference, + ActionSequence upgradeActions, + IList unsafeActions) + { + SchemaComparisonStatus = schemaComparisonStatus; + IsCompatibleInLegacyMode = isCompatibleInLegacyMode; + HasColumnTypeChanges = hasColumnTypeChanges; + Hints = hints; + Difference = difference; + UpgradeActions = upgradeActions; + UnsafeActions = unsafeActions!=null + ? new ReadOnlyList(unsafeActions) + : new ReadOnlyList(new List()); + HasUnsafeActions = UnsafeActions.Any(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonStatus.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonStatus.cs index 4464a0a9e2..fffdb2782d 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonStatus.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaComparisonStatus.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.05.01 - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Schema comparison status. - /// - public enum SchemaComparisonStatus - { - /// - /// Target schema is equal to the extracted schema. - /// - Equal = 0, - /// - /// Target schema contains additional elements. - /// - TargetIsSuperset = 1, - /// - /// Target schema doesn't contain some elements of the extracted schema. - /// - TargetIsSubset = 2, - /// - /// Both new and removed elements are found. - /// - NotEqual = 3 - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.05.01 + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Schema comparison status. + /// + public enum SchemaComparisonStatus + { + /// + /// Target schema is equal to the extracted schema. + /// + Equal = 0, + /// + /// Target schema contains additional elements. + /// + TargetIsSuperset = 1, + /// + /// Target schema doesn't contain some elements of the extracted schema. + /// + TargetIsSubset = 2, + /// + /// Both new and removed elements are found. + /// + NotEqual = 3 + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaExtractionResult.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaExtractionResult.cs index 5161883588..93f7e6c493 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaExtractionResult.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaExtractionResult.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2013.09.02 - -using System.Collections.Generic; -using Xtensive.Sql; -using Xtensive.Sql.Model; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class SchemaExtractionResult - { - public Dictionary LockedTables { get; private set; } - public NodeCollection Catalogs { get; private set; } - public bool IsShared { get; private set; } - - public SchemaExtractionResult MakeShared() - { - foreach (var catalog in Catalogs) - catalog.MakeNamesUnreadable(); - IsShared = true; - return this; - } - - public SchemaExtractionResult() - { - LockedTables = new Dictionary(); - Catalogs = new NodeCollection(); - } - - public SchemaExtractionResult(SqlExtractionResult sqlExtractionResult) - { - LockedTables = new Dictionary(); - Catalogs = sqlExtractionResult.Catalogs; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2013.09.02 + +using System.Collections.Generic; +using Xtensive.Sql; +using Xtensive.Sql.Model; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class SchemaExtractionResult + { + public Dictionary LockedTables { get; private set; } + public NodeCollection Catalogs { get; private set; } + public bool IsShared { get; private set; } + + public SchemaExtractionResult MakeShared() + { + foreach (var catalog in Catalogs) + catalog.MakeNamesUnreadable(); + IsShared = true; + return this; + } + + public SchemaExtractionResult() + { + LockedTables = new Dictionary(); + Catalogs = new NodeCollection(); + } + + public SchemaExtractionResult(SqlExtractionResult sqlExtractionResult) + { + LockedTables = new Dictionary(); + Catalogs = sqlExtractionResult.Catalogs; + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaUpgradeMode.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaUpgradeMode.cs index b33bca619b..57f0261ce6 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SchemaUpgradeMode.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SchemaUpgradeMode.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.04.23 - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Schema upgrade modes. - /// - public enum SchemaUpgradeMode - { - /// - /// Validate schema to be equal to the domain model. - /// - ValidateExact, - - /// - /// Validate schema to be compatible (equal or greater) with the domain model. - /// - ValidateCompatible, - - /// - /// Validate schema to be compatible with the domain model. - /// - ValidateLegacy, - - /// - /// Upgrade schema to domain model. - /// - Perform, - - /// - /// Upgrade schema to domain model safely - - /// i.e. without any operations leading to data lost. - /// - PerformSafely, - - /// - /// Completely recreate the schema. - /// - Recreate, - - /// - /// Skip schema upgrade. - /// - Skip, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.04.23 + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Schema upgrade modes. + /// + public enum SchemaUpgradeMode + { + /// + /// Validate schema to be equal to the domain model. + /// + ValidateExact, + + /// + /// Validate schema to be compatible (equal or greater) with the domain model. + /// + ValidateCompatible, + + /// + /// Validate schema to be compatible with the domain model. + /// + ValidateLegacy, + + /// + /// Upgrade schema to domain model. + /// + Perform, + + /// + /// Upgrade schema to domain model safely - + /// i.e. without any operations leading to data lost. + /// + PerformSafely, + + /// + /// Completely recreate the schema. + /// + Recreate, + + /// + /// Skip schema upgrade. + /// + Skip, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SqlUpgradeStage.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SqlUpgradeStage.cs index db41bf20d6..0d7b4f3390 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SqlUpgradeStage.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SqlUpgradeStage.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.10.21 - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Stage of . - /// - public enum SqlUpgradeStage - { - /// - /// . - /// - NonTransactionalProlog, - /// - /// . - /// - NonTransactionalEpilog, - /// - /// - /// - PreCleanupData, - /// - /// . - /// - CleanupData, - /// - /// . - /// - PreUpgrade, - /// - /// . - /// - Upgrade, - /// - /// . - /// - CopyData, - /// - /// . - /// - PostCopyData, - /// - /// . - /// - Cleanup, - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.10.21 + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Stage of . + /// + public enum SqlUpgradeStage + { + /// + /// . + /// + NonTransactionalProlog, + /// + /// . + /// + NonTransactionalEpilog, + /// + /// + /// + PreCleanupData, + /// + /// . + /// + CleanupData, + /// + /// . + /// + PreUpgrade, + /// + /// . + /// + Upgrade, + /// + /// . + /// + CopyData, + /// + /// . + /// + PostCopyData, + /// + /// . + /// + Cleanup, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs b/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs index 2edf8159eb..c5c34b43fb 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/SystemUpgradeHandler.cs @@ -1,353 +1,353 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.05.01 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; -using Xtensive.Reflection; -using Xtensive.Sql; -using TypeInfo = Xtensive.Orm.Model.TypeInfo; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// implementation - /// for assembly. - /// - public sealed class SystemUpgradeHandler : UpgradeHandler - { - /// - public override bool IsEnabled - { - get - { - // Enabled just for Xtensive.Orm - return Assembly==GetType().Assembly; - } - } - - public override void OnBeforeStage() - { - base.OnBeforeStage(); - - if (UpgradeContext.Stage==UpgradeStage.Upgrading) { - CheckAssemblies(); - SaveExtractedTypeMap(); - ParseStoredDomainModel(); - return; - } - - if (UpgradeContext.UpgradeMode==DomainUpgradeMode.Validate) { - SaveExtractedTypeMap(); - ParseStoredDomainModel(); - } - } - - /// - public override void OnStage() - { - var context = UpgradeContext; - var upgradeMode = context.UpgradeMode; - var session = Session.Demand(); - CheckUserDefinedTypeMap(session.Domain); - - switch (context.Stage) { - case UpgradeStage.Upgrading: - // Perform or PerformSafely - BuildTypeIds(session.Domain); - UpdateMetadata(session); - SaveFullTypeMap(context.StorageNode.TypeIdRegistry); - break; - case UpgradeStage.Final: - if (upgradeMode.IsUpgrading()) { - // Recreate, Perform or PerformSafely - BuildTypeIds(session.Domain); - UpdateMetadata(session); - } - else if (upgradeMode.IsLegacy()) { - // LegacySkip and LegacyValidate - BuildTypeIds(session.Domain); - } - else { - // Skip and Validate - SaveExtractedTypeMap(); - BuildTypeIds(session.Domain); - } - break; - default: - throw new ArgumentOutOfRangeException("context.Stage"); - } - } - - private void BuildTypeIds(Domain domain) - { - var builder = new TypeIdBuilder(domain, UpgradeContext.TypeIdProvider); - var storageNode = UpgradeContext.StorageNode; - var registry = storageNode.TypeIdRegistry; - - builder.BuildTypeIds(registry); - registry.Lock(); - - if (storageNode.Id==WellKnown.DefaultNodeId) - builder.SetDefaultTypeIds(registry); - } - - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } - - private void UpdateMetadata(Session session) - { - var groups = BuildMetadata(session.Domain, session.StorageNode.TypeIdRegistry); - var driver = session.Handlers.StorageDriver; - var mapping = new MetadataMapping(driver, session.Handlers.NameBuilder); - var executor = session.Services.Demand(); - var resolver = UpgradeContext.Services.MappingResolver; - var metadataSchema = UpgradeContext.Configuration.DefaultSchema; - var sqlModel = UpgradeContext.ExtractedSqlModelCache; - var namesShouldBeActualized = UpgradeContext.Configuration.ShareStorageSchemaOverNodes && UpgradeContext.Services.ProviderInfo.Supports(ProviderFeatures.Multischema); - var nodeConfiguration = UpgradeContext.NodeConfiguration; - - foreach (var group in groups) { - var metadataDatabase = group.Key; - var metadata = group.Value; - var schema = resolver.ResolveSchema(sqlModel, metadataDatabase, metadataSchema); - var task = (!namesShouldBeActualized) - ? new SqlExtractionTask(schema.Catalog.GetNameInternal(), schema.GetNameInternal()) - : new SqlExtractionTask(nodeConfiguration.GetActualNameFor(schema.Catalog), nodeConfiguration.GetActualNameFor(schema)); - var writer = new MetadataWriter(driver, mapping, task, executor); - writer.Write(metadata); - } - - var flatMetadata = new MetadataSet(); - foreach (var metadata in groups.Values) - flatMetadata.UnionWith(metadata); - UpgradeContext.Metadata = flatMetadata; - } - - private void CheckAssemblies() - { - var oldMetadata = UpgradeContext.Metadata.Assemblies ?? Enumerable.Empty(); - - var oldAssemblies = oldMetadata - .GroupBy(a => a.Name) - .ToDictionary(g => g.Key, g => g.ToList()); - - var handlers = UpgradeContext.OrderedUpgradeHandlers; - - foreach (var handler in handlers) { - List assemblies; - if (oldAssemblies.TryGetValue(handler.AssemblyName, out assemblies)) { - foreach (var assembly in assemblies) - if (!handler.CanUpgradeFrom(assembly.Version)) - throw HandlerCanNotUpgrade(handler, assembly.Version); - } - else { - if (!handler.CanUpgradeFrom(null)) - throw HandlerCanNotUpgrade(handler, Strings.ZeroAssemblyVersion); - } - } - } - - private static DomainBuilderException HandlerCanNotUpgrade(IUpgradeHandler handler, string sourceVersion) - { - return new DomainBuilderException(string.Format( - Strings.ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported, - handler.AssemblyName, sourceVersion, handler.AssemblyVersion)); - } - - private Dictionary BuildMetadata(Domain domain, TypeIdRegistry registry) - { - var model = domain.Model; - var metadataGroups = model.Databases.ToDictionary(db => db.Name, db => new MetadataSet()); - if (metadataGroups.Count==0) - metadataGroups.Add(string.Empty, new MetadataSet()); - - foreach (var group in metadataGroups) { - var database = group.Key; - var metadata = group.Value; - Func filter = t => t.MappingDatabase==database; - var types = model.Types.Where(filter).ToList(); - var typeMetadata = GetTypeMetadata(types, registry); - var assemblies = types.Select(t => t.UnderlyingType.Assembly).ToHashSet(); - var assemblyMetadata = GetAssemblyMetadata(assemblies); - var storedModel = model.ToStoredModel(registry, filter); - // Since we support storage nodes, stored domain model and real model of a node - // must be synchronized. So we must update types' mappings - storedModel.UpdateMappings(UpgradeContext.NodeConfiguration); - var serializedModel = storedModel.Serialize(); - var modelExtension = new ExtensionMetadata(WellKnown.DomainModelExtensionName, serializedModel); - var indexesExtension = GetPartialIndexes(domain, types); - metadata.Assemblies.AddRange(assemblyMetadata); - metadata.Types.AddRange(typeMetadata); - metadata.Extensions.Add(modelExtension); - if (indexesExtension!=null) - metadata.Extensions.Add(indexesExtension); - } - - return metadataGroups; - } - - private IEnumerable GetAssemblyMetadata(HashSet assemblies) - { - var assemblyMetadata = UpgradeContext.OrderedUpgradeHandlers - .Where(handler => assemblies.Contains(handler.Assembly)) - .Select(handler => new AssemblyMetadata(handler.AssemblyName, handler.AssemblyVersion)); - return assemblyMetadata; - } - - private static IEnumerable GetTypeMetadata(IEnumerable types, TypeIdRegistry registry) - { - return types - .Where(t => t.IsEntity && registry.Contains(t)) - .Select(type => new TypeMetadata(registry[type], type.UnderlyingType.GetFullName())); - } - - private ExtensionMetadata GetPartialIndexes(Domain domain, IEnumerable types) - { - if (!domain.StorageProviderInfo.Supports(ProviderFeatures.PartialIndexes)) - return null; - var compiler = UpgradeContext.Services.IndexFilterCompiler; - var handlers = domain.Handlers; - var indexes = types - .SelectMany(type => type.Indexes - .Where(i => i.IsPartial && !i.IsVirtual && !i.IsAbstract) - .Select(i => new {Type = type, Index = i})) - .Select(item => new StoredPartialIndexFilterInfo { - Database = item.Type.MappingDatabase, - Schema = item.Type.MappingSchema, - Table = item.Type.MappingName, - Name = item.Index.MappingName, - Filter = compiler.Compile(handlers, item.Index) - }) - .ToArray(); - if (indexes.Length==0) - return null; - var items = new StoredPartialIndexFilterInfoCollection { - Items = indexes - }; - return new ExtensionMetadata(WellKnown.PartialIndexDefinitionsExtensionName, items.Serialize()); - } - - private void ParseStoredDomainModel() - { - var context = UpgradeContext; - var extensions = context.Metadata.Extensions.Where(e => e.Name==WellKnown.DomainModelExtensionName); - try { - var found = false; - var types = new List(); - - foreach (var extension in extensions) { - found = true; - var part = StoredDomainModel.Deserialize(extension.Value); - types.AddRange(part.Types); - } - - if (!found) { - UpgradeLog.Info(Strings.LogDomainModelIsNotFoundInStorage); - return; - } - - var model = new StoredDomainModel {Types = types.ToArray()}; - model.UpdateReferences(); - - context.ExtractedDomainModel = model; - } - catch (Exception e) { - UpgradeLog.Warning(e, Strings.LogFailedToExtractDomainModelFromStorage); - } - } - - private void SaveExtractedTypeMap() - { - var map = UpgradeContext.Metadata.Types.ToDictionary(t => t.Name, t => t.Id); - UpgradeContext.FullTypeMap = UpgradeContext.ExtractedTypeMap = map; - } - - private void SaveFullTypeMap(TypeIdRegistry registry) - { - UpgradeContext.FullTypeMap = registry.Types.ToDictionary(t => t.UnderlyingType.GetFullName(), t => registry[t]); - } - - private void CheckUserDefinedTypeMap(Domain domain) - { - if (UpgradeContext.UserDefinedTypeMap.Count == 0) - return; - var types = domain.Model.Types; - var typesExtracted = UpgradeContext.ExtractedTypeMap != null; - var extractedTypeMapping = UpgradeContext.ExtractedTypeMap; - var reversedTypeMapping = (typesExtracted) ? extractedTypeMapping.ToDictionary(el => el.Value, el => el.Key) : null; - var mapping = UpgradeContext.UpgradedTypesMapping ?? new Dictionary(); - foreach (var userDefindeTypeMap in UpgradeContext.UserDefinedTypeMap) { - var type = types.Find(userDefindeTypeMap.Key); - if (type==null) - throw new DomainBuilderException( - string.Format(Strings.ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists, userDefindeTypeMap.Value, userDefindeTypeMap.Key)); - - if (typesExtracted) { - string extractedTypeName; - if (reversedTypeMapping.TryGetValue(userDefindeTypeMap.Value, out extractedTypeName)) { - string oldTypeName; - if (!TryGetOldTypeName(userDefindeTypeMap.Key, out oldTypeName)) { - throw new DomainBuilderException( - string.Format( - Strings.ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes, - userDefindeTypeMap.Value, - userDefindeTypeMap.Key, - extractedTypeName)); - } - else { - if (extractedTypeName!=oldTypeName) - throw new DomainBuilderException( - string.Format( - Strings.ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes, - userDefindeTypeMap.Value, - userDefindeTypeMap.Key, - oldTypeName)); - } - } - } - - var minimalTypeId = TypeInfo.MinTypeId; - var maximalTypeId = int.MaxValue; - if (domain.Model.Databases.Count!=0) { - var databaseConfiguration = domain.Model.Databases[type.MappingDatabase].Configuration; - minimalTypeId = databaseConfiguration.MinTypeId; - maximalTypeId = databaseConfiguration.MaxTypeId; - } - - if (userDefindeTypeMap.Value < minimalTypeId || userDefindeTypeMap.Value > maximalTypeId) - throw new DomainBuilderException( - string.Format(Strings.ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase, - userDefindeTypeMap.Value, - userDefindeTypeMap.Key)); - } - } - - public bool TryGetOldTypeName(string newTypeName, out string oldTypeName) - { - string oldName; - if(UpgradeContext.UpgradedTypesMapping==null) { - oldTypeName = newTypeName; - return true; - } - if (UpgradeContext.UpgradedTypesMapping.TryGetValue(newTypeName, out oldName)) { - oldTypeName = oldName; - return true; - } - oldTypeName = newTypeName; - return false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.05.01 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; +using Xtensive.Reflection; +using Xtensive.Sql; +using TypeInfo = Xtensive.Orm.Model.TypeInfo; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// implementation + /// for assembly. + /// + public sealed class SystemUpgradeHandler : UpgradeHandler + { + /// + public override bool IsEnabled + { + get + { + // Enabled just for Xtensive.Orm + return Assembly==GetType().Assembly; + } + } + + public override void OnBeforeStage() + { + base.OnBeforeStage(); + + if (UpgradeContext.Stage==UpgradeStage.Upgrading) { + CheckAssemblies(); + SaveExtractedTypeMap(); + ParseStoredDomainModel(); + return; + } + + if (UpgradeContext.UpgradeMode==DomainUpgradeMode.Validate) { + SaveExtractedTypeMap(); + ParseStoredDomainModel(); + } + } + + /// + public override void OnStage() + { + var context = UpgradeContext; + var upgradeMode = context.UpgradeMode; + var session = Session.Demand(); + CheckUserDefinedTypeMap(session.Domain); + + switch (context.Stage) { + case UpgradeStage.Upgrading: + // Perform or PerformSafely + BuildTypeIds(session.Domain); + UpdateMetadata(session); + SaveFullTypeMap(context.StorageNode.TypeIdRegistry); + break; + case UpgradeStage.Final: + if (upgradeMode.IsUpgrading()) { + // Recreate, Perform or PerformSafely + BuildTypeIds(session.Domain); + UpdateMetadata(session); + } + else if (upgradeMode.IsLegacy()) { + // LegacySkip and LegacyValidate + BuildTypeIds(session.Domain); + } + else { + // Skip and Validate + SaveExtractedTypeMap(); + BuildTypeIds(session.Domain); + } + break; + default: + throw new ArgumentOutOfRangeException("context.Stage"); + } + } + + private void BuildTypeIds(Domain domain) + { + var builder = new TypeIdBuilder(domain, UpgradeContext.TypeIdProvider); + var storageNode = UpgradeContext.StorageNode; + var registry = storageNode.TypeIdRegistry; + + builder.BuildTypeIds(registry); + registry.Lock(); + + if (storageNode.Id==WellKnown.DefaultNodeId) + builder.SetDefaultTypeIds(registry); + } + + public override bool CanUpgradeFrom(string oldVersion) + { + return true; + } + + private void UpdateMetadata(Session session) + { + var groups = BuildMetadata(session.Domain, session.StorageNode.TypeIdRegistry); + var driver = session.Handlers.StorageDriver; + var mapping = new MetadataMapping(driver, session.Handlers.NameBuilder); + var executor = session.Services.Demand(); + var resolver = UpgradeContext.Services.MappingResolver; + var metadataSchema = UpgradeContext.Configuration.DefaultSchema; + var sqlModel = UpgradeContext.ExtractedSqlModelCache; + var namesShouldBeActualized = UpgradeContext.Configuration.ShareStorageSchemaOverNodes && UpgradeContext.Services.ProviderInfo.Supports(ProviderFeatures.Multischema); + var nodeConfiguration = UpgradeContext.NodeConfiguration; + + foreach (var group in groups) { + var metadataDatabase = group.Key; + var metadata = group.Value; + var schema = resolver.ResolveSchema(sqlModel, metadataDatabase, metadataSchema); + var task = (!namesShouldBeActualized) + ? new SqlExtractionTask(schema.Catalog.GetNameInternal(), schema.GetNameInternal()) + : new SqlExtractionTask(nodeConfiguration.GetActualNameFor(schema.Catalog), nodeConfiguration.GetActualNameFor(schema)); + var writer = new MetadataWriter(driver, mapping, task, executor); + writer.Write(metadata); + } + + var flatMetadata = new MetadataSet(); + foreach (var metadata in groups.Values) + flatMetadata.UnionWith(metadata); + UpgradeContext.Metadata = flatMetadata; + } + + private void CheckAssemblies() + { + var oldMetadata = UpgradeContext.Metadata.Assemblies ?? Enumerable.Empty(); + + var oldAssemblies = oldMetadata + .GroupBy(a => a.Name) + .ToDictionary(g => g.Key, g => g.ToList()); + + var handlers = UpgradeContext.OrderedUpgradeHandlers; + + foreach (var handler in handlers) { + List assemblies; + if (oldAssemblies.TryGetValue(handler.AssemblyName, out assemblies)) { + foreach (var assembly in assemblies) + if (!handler.CanUpgradeFrom(assembly.Version)) + throw HandlerCanNotUpgrade(handler, assembly.Version); + } + else { + if (!handler.CanUpgradeFrom(null)) + throw HandlerCanNotUpgrade(handler, Strings.ZeroAssemblyVersion); + } + } + } + + private static DomainBuilderException HandlerCanNotUpgrade(IUpgradeHandler handler, string sourceVersion) + { + return new DomainBuilderException(string.Format( + Strings.ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported, + handler.AssemblyName, sourceVersion, handler.AssemblyVersion)); + } + + private Dictionary BuildMetadata(Domain domain, TypeIdRegistry registry) + { + var model = domain.Model; + var metadataGroups = model.Databases.ToDictionary(db => db.Name, db => new MetadataSet()); + if (metadataGroups.Count==0) + metadataGroups.Add(string.Empty, new MetadataSet()); + + foreach (var group in metadataGroups) { + var database = group.Key; + var metadata = group.Value; + Func filter = t => t.MappingDatabase==database; + var types = model.Types.Where(filter).ToList(); + var typeMetadata = GetTypeMetadata(types, registry); + var assemblies = types.Select(t => t.UnderlyingType.Assembly).ToHashSet(); + var assemblyMetadata = GetAssemblyMetadata(assemblies); + var storedModel = model.ToStoredModel(registry, filter); + // Since we support storage nodes, stored domain model and real model of a node + // must be synchronized. So we must update types' mappings + storedModel.UpdateMappings(UpgradeContext.NodeConfiguration); + var serializedModel = storedModel.Serialize(); + var modelExtension = new ExtensionMetadata(WellKnown.DomainModelExtensionName, serializedModel); + var indexesExtension = GetPartialIndexes(domain, types); + metadata.Assemblies.AddRange(assemblyMetadata); + metadata.Types.AddRange(typeMetadata); + metadata.Extensions.Add(modelExtension); + if (indexesExtension!=null) + metadata.Extensions.Add(indexesExtension); + } + + return metadataGroups; + } + + private IEnumerable GetAssemblyMetadata(HashSet assemblies) + { + var assemblyMetadata = UpgradeContext.OrderedUpgradeHandlers + .Where(handler => assemblies.Contains(handler.Assembly)) + .Select(handler => new AssemblyMetadata(handler.AssemblyName, handler.AssemblyVersion)); + return assemblyMetadata; + } + + private static IEnumerable GetTypeMetadata(IEnumerable types, TypeIdRegistry registry) + { + return types + .Where(t => t.IsEntity && registry.Contains(t)) + .Select(type => new TypeMetadata(registry[type], type.UnderlyingType.GetFullName())); + } + + private ExtensionMetadata GetPartialIndexes(Domain domain, IEnumerable types) + { + if (!domain.StorageProviderInfo.Supports(ProviderFeatures.PartialIndexes)) + return null; + var compiler = UpgradeContext.Services.IndexFilterCompiler; + var handlers = domain.Handlers; + var indexes = types + .SelectMany(type => type.Indexes + .Where(i => i.IsPartial && !i.IsVirtual && !i.IsAbstract) + .Select(i => new {Type = type, Index = i})) + .Select(item => new StoredPartialIndexFilterInfo { + Database = item.Type.MappingDatabase, + Schema = item.Type.MappingSchema, + Table = item.Type.MappingName, + Name = item.Index.MappingName, + Filter = compiler.Compile(handlers, item.Index) + }) + .ToArray(); + if (indexes.Length==0) + return null; + var items = new StoredPartialIndexFilterInfoCollection { + Items = indexes + }; + return new ExtensionMetadata(WellKnown.PartialIndexDefinitionsExtensionName, items.Serialize()); + } + + private void ParseStoredDomainModel() + { + var context = UpgradeContext; + var extensions = context.Metadata.Extensions.Where(e => e.Name==WellKnown.DomainModelExtensionName); + try { + var found = false; + var types = new List(); + + foreach (var extension in extensions) { + found = true; + var part = StoredDomainModel.Deserialize(extension.Value); + types.AddRange(part.Types); + } + + if (!found) { + UpgradeLog.Info(Strings.LogDomainModelIsNotFoundInStorage); + return; + } + + var model = new StoredDomainModel {Types = types.ToArray()}; + model.UpdateReferences(); + + context.ExtractedDomainModel = model; + } + catch (Exception e) { + UpgradeLog.Warning(e, Strings.LogFailedToExtractDomainModelFromStorage); + } + } + + private void SaveExtractedTypeMap() + { + var map = UpgradeContext.Metadata.Types.ToDictionary(t => t.Name, t => t.Id); + UpgradeContext.FullTypeMap = UpgradeContext.ExtractedTypeMap = map; + } + + private void SaveFullTypeMap(TypeIdRegistry registry) + { + UpgradeContext.FullTypeMap = registry.Types.ToDictionary(t => t.UnderlyingType.GetFullName(), t => registry[t]); + } + + private void CheckUserDefinedTypeMap(Domain domain) + { + if (UpgradeContext.UserDefinedTypeMap.Count == 0) + return; + var types = domain.Model.Types; + var typesExtracted = UpgradeContext.ExtractedTypeMap != null; + var extractedTypeMapping = UpgradeContext.ExtractedTypeMap; + var reversedTypeMapping = (typesExtracted) ? extractedTypeMapping.ToDictionary(el => el.Value, el => el.Key) : null; + var mapping = UpgradeContext.UpgradedTypesMapping ?? new Dictionary(); + foreach (var userDefindeTypeMap in UpgradeContext.UserDefinedTypeMap) { + var type = types.Find(userDefindeTypeMap.Key); + if (type==null) + throw new DomainBuilderException( + string.Format(Strings.ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists, userDefindeTypeMap.Value, userDefindeTypeMap.Key)); + + if (typesExtracted) { + string extractedTypeName; + if (reversedTypeMapping.TryGetValue(userDefindeTypeMap.Value, out extractedTypeName)) { + string oldTypeName; + if (!TryGetOldTypeName(userDefindeTypeMap.Key, out oldTypeName)) { + throw new DomainBuilderException( + string.Format( + Strings.ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes, + userDefindeTypeMap.Value, + userDefindeTypeMap.Key, + extractedTypeName)); + } + else { + if (extractedTypeName!=oldTypeName) + throw new DomainBuilderException( + string.Format( + Strings.ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes, + userDefindeTypeMap.Value, + userDefindeTypeMap.Key, + oldTypeName)); + } + } + } + + var minimalTypeId = TypeInfo.MinTypeId; + var maximalTypeId = int.MaxValue; + if (domain.Model.Databases.Count!=0) { + var databaseConfiguration = domain.Model.Databases[type.MappingDatabase].Configuration; + minimalTypeId = databaseConfiguration.MinTypeId; + maximalTypeId = databaseConfiguration.MaxTypeId; + } + + if (userDefindeTypeMap.Value < minimalTypeId || userDefindeTypeMap.Value > maximalTypeId) + throw new DomainBuilderException( + string.Format(Strings.ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase, + userDefindeTypeMap.Value, + userDefindeTypeMap.Key)); + } + } + + public bool TryGetOldTypeName(string newTypeName, out string oldTypeName) + { + string oldName; + if(UpgradeContext.UpgradedTypesMapping==null) { + oldTypeName = newTypeName; + return true; + } + if (UpgradeContext.UpgradedTypesMapping.TryGetValue(newTypeName, out oldName)) { + oldTypeName = oldName; + return true; + } + oldTypeName = newTypeName; + return false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/TypeConversionVerifier.cs b/Orm/Xtensive.Orm/Orm/Upgrade/TypeConversionVerifier.cs index 92f03c38bb..8e01db5d1b 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/TypeConversionVerifier.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/TypeConversionVerifier.cs @@ -1,183 +1,183 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2009.05.28 - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Orm.Upgrade.Model; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Verifies whether the conversion between types is allowed or not. - /// - public static class TypeConversionVerifier - { - private static readonly Dictionary> supportedConversions; - - /// - /// Verifies whether the source type can be converted to the target type. - /// Loss of data is allowed. - /// - /// The source type. - /// The target type. - /// - /// if the source type can be converted to the - /// target type; otherwise, . - /// - public static bool CanConvert(StorageTypeInfo from, StorageTypeInfo to) - { - ArgumentValidator.EnsureArgumentNotNull(from, "from"); - ArgumentValidator.EnsureArgumentNotNull(to, "to"); - - // Truncation and precision loss is ALLOWED by this method - - if (from.IsTypeUndefined || to.IsTypeUndefined) - return false; - - var fromType = from.Type.StripNullable(); - var toType = to.Type.StripNullable(); - - if (fromType==toType) // Comparing just types - return true; - - // Types are different - if (toType==typeof(string)) - // Checking target string length - return !to.Length.HasValue || CanConvertToString(from, to.Length.Value); - - return supportedConversions.ContainsKey(fromType) && supportedConversions[fromType].Contains(toType); - } - - /// - /// Verifies whether the source type can be converted to the target - /// type without loss of data. - /// - /// The source type. - /// The target type. - /// - /// if the source type can be converted to the - /// target type without loss of data; otherwise, . - /// - public static bool CanConvertSafely(StorageTypeInfo from, StorageTypeInfo to) - { - ArgumentValidator.EnsureArgumentNotNull(from, "from"); - ArgumentValidator.EnsureArgumentNotNull(to, "to"); - - // Truncation and precision loss is NOT ALLOWED by this method - - if (!CanConvert(from, to)) - return false; - if (from.IsNullable && !to.IsNullable) - return false; // Can't convert NULL - - var toType = to.Type.StripNullable(); - var fromType = from.Type.StripNullable(); - - if (toType==typeof(decimal) && fromType==typeof(decimal)) - return CheckScaleAndPrecision(from, to); - else if (toType==typeof(string) && fromType==typeof(string)) - return CheckLength(from, to); - else if (toType==typeof (byte[]) && fromType==typeof (byte[])) - return CheckLength(from, to); - return true; - } - - private static bool CanConvertToString(StorageTypeInfo from, int length) - { - switch (Type.GetTypeCode(from.Type.StripNullable())) { - case TypeCode.Char: - case TypeCode.String: - return true; - case TypeCode.Decimal: - return length >= from.Precision + 2; - case TypeCode.Byte: - return length >= 3; - case TypeCode.SByte: - return length >= 4; - case TypeCode.Int16: - return length >= 6; - case TypeCode.Int32: - return length >= 11; - case TypeCode.Int64: - return length >= 20; - case TypeCode.UInt16: - return length >= 5; - case TypeCode.UInt32: - return length >= 10; - case TypeCode.UInt64: - return length >= 20; - default: - return false; - } - } - - private static bool CheckLength(StorageTypeInfo from, StorageTypeInfo to) - { - if (!to.Length.HasValue) - return true; // Conversion to Var*(max) is always possible, or both types have no length - if (!from.Length.HasValue) - return false; // Conversion from Var*(max) is possible only to Var*(max) - // Otherwise it's possible to convert only when new type has higher length - return from.Length.Value <= to.Length.Value; - } - - private static bool CheckScaleAndPrecision(StorageTypeInfo from, StorageTypeInfo to) - { - return LessOrEqual(from.Scale, to.Scale) && LessOrEqual(from.Precision,to.Precision); - } - - private static bool LessOrEqual(int? a, int? b) - { - // Can't use 'a <= b' because it evalutes to false when both are null - return a==b || a < b; - } - - // Constructors - - static TypeConversionVerifier() - { - supportedConversions = new Dictionary>(); - AddConverter( - typeof (Int16), typeof (UInt16), typeof (Int32), typeof (UInt32), - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Int16), typeof (UInt16), typeof (Char), typeof (Int32), typeof (UInt32), - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), - typeof (Decimal)); - AddConverter( - typeof (Int16), typeof (UInt16), typeof (Char), typeof (Int32), - typeof (UInt32), typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), - typeof (Decimal)); - AddConverter( - typeof (Int32), typeof (UInt32), typeof (Int64), typeof (UInt64), - typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Char), typeof (Int32), typeof (UInt32), typeof (Int64), - typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter( - typeof (UInt16), typeof (Int32), typeof (UInt32), typeof (Int64), - typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); - AddConverter(typeof (Double), typeof (Single), typeof(Decimal)); - AddConverter(typeof (Double)); - } - - private static void AddConverter(params Type[] types) - { - ArgumentValidator.EnsureArgumentIsGreaterThan(types.Length, -1, "types.Length"); - supportedConversions.Add(typeof(T), new List(types)); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2009.05.28 + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Orm.Upgrade.Model; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Verifies whether the conversion between types is allowed or not. + /// + public static class TypeConversionVerifier + { + private static readonly Dictionary> supportedConversions; + + /// + /// Verifies whether the source type can be converted to the target type. + /// Loss of data is allowed. + /// + /// The source type. + /// The target type. + /// + /// if the source type can be converted to the + /// target type; otherwise, . + /// + public static bool CanConvert(StorageTypeInfo from, StorageTypeInfo to) + { + ArgumentValidator.EnsureArgumentNotNull(from, "from"); + ArgumentValidator.EnsureArgumentNotNull(to, "to"); + + // Truncation and precision loss is ALLOWED by this method + + if (from.IsTypeUndefined || to.IsTypeUndefined) + return false; + + var fromType = from.Type.StripNullable(); + var toType = to.Type.StripNullable(); + + if (fromType==toType) // Comparing just types + return true; + + // Types are different + if (toType==typeof(string)) + // Checking target string length + return !to.Length.HasValue || CanConvertToString(from, to.Length.Value); + + return supportedConversions.ContainsKey(fromType) && supportedConversions[fromType].Contains(toType); + } + + /// + /// Verifies whether the source type can be converted to the target + /// type without loss of data. + /// + /// The source type. + /// The target type. + /// + /// if the source type can be converted to the + /// target type without loss of data; otherwise, . + /// + public static bool CanConvertSafely(StorageTypeInfo from, StorageTypeInfo to) + { + ArgumentValidator.EnsureArgumentNotNull(from, "from"); + ArgumentValidator.EnsureArgumentNotNull(to, "to"); + + // Truncation and precision loss is NOT ALLOWED by this method + + if (!CanConvert(from, to)) + return false; + if (from.IsNullable && !to.IsNullable) + return false; // Can't convert NULL + + var toType = to.Type.StripNullable(); + var fromType = from.Type.StripNullable(); + + if (toType==typeof(decimal) && fromType==typeof(decimal)) + return CheckScaleAndPrecision(from, to); + else if (toType==typeof(string) && fromType==typeof(string)) + return CheckLength(from, to); + else if (toType==typeof (byte[]) && fromType==typeof (byte[])) + return CheckLength(from, to); + return true; + } + + private static bool CanConvertToString(StorageTypeInfo from, int length) + { + switch (Type.GetTypeCode(from.Type.StripNullable())) { + case TypeCode.Char: + case TypeCode.String: + return true; + case TypeCode.Decimal: + return length >= from.Precision + 2; + case TypeCode.Byte: + return length >= 3; + case TypeCode.SByte: + return length >= 4; + case TypeCode.Int16: + return length >= 6; + case TypeCode.Int32: + return length >= 11; + case TypeCode.Int64: + return length >= 20; + case TypeCode.UInt16: + return length >= 5; + case TypeCode.UInt32: + return length >= 10; + case TypeCode.UInt64: + return length >= 20; + default: + return false; + } + } + + private static bool CheckLength(StorageTypeInfo from, StorageTypeInfo to) + { + if (!to.Length.HasValue) + return true; // Conversion to Var*(max) is always possible, or both types have no length + if (!from.Length.HasValue) + return false; // Conversion from Var*(max) is possible only to Var*(max) + // Otherwise it's possible to convert only when new type has higher length + return from.Length.Value <= to.Length.Value; + } + + private static bool CheckScaleAndPrecision(StorageTypeInfo from, StorageTypeInfo to) + { + return LessOrEqual(from.Scale, to.Scale) && LessOrEqual(from.Precision,to.Precision); + } + + private static bool LessOrEqual(int? a, int? b) + { + // Can't use 'a <= b' because it evalutes to false when both are null + return a==b || a < b; + } + + // Constructors + + static TypeConversionVerifier() + { + supportedConversions = new Dictionary>(); + AddConverter( + typeof (Int16), typeof (UInt16), typeof (Int32), typeof (UInt32), + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Int16), typeof (UInt16), typeof (Char), typeof (Int32), typeof (UInt32), + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), + typeof (Decimal)); + AddConverter( + typeof (Int16), typeof (UInt16), typeof (Char), typeof (Int32), + typeof (UInt32), typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), + typeof (Decimal)); + AddConverter( + typeof (Int32), typeof (UInt32), typeof (Int64), typeof (UInt64), + typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Char), typeof (Int32), typeof (UInt32), typeof (Int64), + typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (Int64), typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter( + typeof (UInt16), typeof (Int32), typeof (UInt32), typeof (Int64), + typeof (UInt64), typeof (Double), typeof (Single), typeof (Decimal)); + AddConverter(typeof (Double), typeof (Single), typeof(Decimal)); + AddConverter(typeof (Double)); + } + + private static void AddConverter(params Type[] types) + { + ArgumentValidator.EnsureArgumentIsGreaterThan(types.Length, -1, "types.Length"); + supportedConversions.Add(typeof(T), new List(types)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeActionSequence.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeActionSequence.cs index 4ffbc1eda7..c893e952bd 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeActionSequence.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeActionSequence.cs @@ -1,155 +1,155 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.07.15 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// A sequence of upgrade actions. - /// - public sealed class UpgradeActionSequence : IEnumerable - { - /// - /// Gets the number of all actions in sequence (including non-transactional commands). - /// - public int Count - { - get - { - return NonTransactionalPrologCommands.Count - + PreCleanupDataCommands.Count - + CleanupDataCommands.Count - + PreUpgradeCommands.Count - + UpgradeCommands.Count - + CopyDataCommands.Count - + PostCopyDataCommands.Count - + CleanupCommands.Count - + NonTransactionalEpilogCommands.Count; - } - } - - /// - /// Gets or sets pre-cleanup data commands. - /// - /// The pre-cleanup data commands. - public List PreCleanupDataCommands { get; private set; } - - /// - /// Gets or sets the cleanup data commands. - /// - /// The cleanup data commands. - public List CleanupDataCommands { get; private set; } - - /// - /// Gets or sets the pre upgrade commands. - /// - /// The pre upgrade commands. - public List PreUpgradeCommands { get; private set; } - - /// - /// Gets or sets the upgrade commands. - /// - /// The upgrade commands. - public List UpgradeCommands { get; private set; } - - /// - /// Gets or sets the copy data commands. - /// - /// The copy data commands. - public List CopyDataCommands { get; private set; } - - /// - /// Gets or sets the post copy data commands. - /// - /// The post copy data commands. - public List PostCopyDataCommands { get; private set; } - - /// - /// Gets or sets the cleanup commands. - /// - /// The cleanup commands. - public List CleanupCommands { get; private set; } - - /// - /// Gets or sets the non transactional epilog commands. - /// - /// The non transactional epilog commands. - public List NonTransactionalEpilogCommands { get; private set; } - - /// - /// Gets or sets the non transactional prolog commands. - /// - /// The non transactional prolog commands. - public List NonTransactionalPrologCommands { get; private set; } - - /// - /// Handles action sequence with specified processors. - /// - /// Transactional processor. - /// Non-transactional processor. - public void ProcessWith(Action> regularProcessor, Action> nonTransactionalProcessor) - { - ArgumentValidator.EnsureArgumentNotNull(regularProcessor, "regularProcessor"); - ArgumentValidator.EnsureArgumentNotNull(nonTransactionalProcessor, "nonTransactionalProcessor"); - - if (NonTransactionalPrologCommands.Count > 0) - nonTransactionalProcessor.Invoke(NonTransactionalPrologCommands); - - var batchSequence = - new[] { - PreCleanupDataCommands, - CleanupDataCommands, - PreUpgradeCommands, - UpgradeCommands, - CopyDataCommands, - PostCopyDataCommands, - CleanupCommands - } - .Where(batch => batch.Count > 0); - - foreach (var batch in batchSequence) - regularProcessor.Invoke(batch); - - if (NonTransactionalEpilogCommands.Count > 0) - nonTransactionalProcessor.Invoke(NonTransactionalEpilogCommands); - } - - /// - public IEnumerator GetEnumerator() - { - var commands = new List(Count); - ProcessWith(commands.AddRange, commands.AddRange); - return commands.GetEnumerator(); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Initializes a new instance of the class. - /// - public UpgradeActionSequence() - { - NonTransactionalPrologCommands = new List(); - PreCleanupDataCommands = new List(); - CleanupDataCommands = new List(); - PreUpgradeCommands = new List(); - UpgradeCommands = new List(); - CopyDataCommands = new List(); - PostCopyDataCommands = new List(); - CleanupCommands = new List(); - NonTransactionalEpilogCommands = new List(); - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.07.15 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// A sequence of upgrade actions. + /// + public sealed class UpgradeActionSequence : IEnumerable + { + /// + /// Gets the number of all actions in sequence (including non-transactional commands). + /// + public int Count + { + get + { + return NonTransactionalPrologCommands.Count + + PreCleanupDataCommands.Count + + CleanupDataCommands.Count + + PreUpgradeCommands.Count + + UpgradeCommands.Count + + CopyDataCommands.Count + + PostCopyDataCommands.Count + + CleanupCommands.Count + + NonTransactionalEpilogCommands.Count; + } + } + + /// + /// Gets or sets pre-cleanup data commands. + /// + /// The pre-cleanup data commands. + public List PreCleanupDataCommands { get; private set; } + + /// + /// Gets or sets the cleanup data commands. + /// + /// The cleanup data commands. + public List CleanupDataCommands { get; private set; } + + /// + /// Gets or sets the pre upgrade commands. + /// + /// The pre upgrade commands. + public List PreUpgradeCommands { get; private set; } + + /// + /// Gets or sets the upgrade commands. + /// + /// The upgrade commands. + public List UpgradeCommands { get; private set; } + + /// + /// Gets or sets the copy data commands. + /// + /// The copy data commands. + public List CopyDataCommands { get; private set; } + + /// + /// Gets or sets the post copy data commands. + /// + /// The post copy data commands. + public List PostCopyDataCommands { get; private set; } + + /// + /// Gets or sets the cleanup commands. + /// + /// The cleanup commands. + public List CleanupCommands { get; private set; } + + /// + /// Gets or sets the non transactional epilog commands. + /// + /// The non transactional epilog commands. + public List NonTransactionalEpilogCommands { get; private set; } + + /// + /// Gets or sets the non transactional prolog commands. + /// + /// The non transactional prolog commands. + public List NonTransactionalPrologCommands { get; private set; } + + /// + /// Handles action sequence with specified processors. + /// + /// Transactional processor. + /// Non-transactional processor. + public void ProcessWith(Action> regularProcessor, Action> nonTransactionalProcessor) + { + ArgumentValidator.EnsureArgumentNotNull(regularProcessor, "regularProcessor"); + ArgumentValidator.EnsureArgumentNotNull(nonTransactionalProcessor, "nonTransactionalProcessor"); + + if (NonTransactionalPrologCommands.Count > 0) + nonTransactionalProcessor.Invoke(NonTransactionalPrologCommands); + + var batchSequence = + new[] { + PreCleanupDataCommands, + CleanupDataCommands, + PreUpgradeCommands, + UpgradeCommands, + CopyDataCommands, + PostCopyDataCommands, + CleanupCommands + } + .Where(batch => batch.Count > 0); + + foreach (var batch in batchSequence) + regularProcessor.Invoke(batch); + + if (NonTransactionalEpilogCommands.Count > 0) + nonTransactionalProcessor.Invoke(NonTransactionalEpilogCommands); + } + + /// + public IEnumerator GetEnumerator() + { + var commands = new List(Count); + ProcessWith(commands.AddRange, commands.AddRange); + return commands.GetEnumerator(); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Initializes a new instance of the class. + /// + public UpgradeActionSequence() + { + NonTransactionalPrologCommands = new List(); + PreCleanupDataCommands = new List(); + CleanupDataCommands = new List(); + PreUpgradeCommands = new List(); + UpgradeCommands = new List(); + CopyDataCommands = new List(); + PostCopyDataCommands = new List(); + CleanupCommands = new List(); + NonTransactionalEpilogCommands = new List(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeContext.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeContext.cs index 5cb34c5111..5c1abfb71e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeContext.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeContext.cs @@ -1,270 +1,270 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Aleksey Gamzov -// Created: 2008.12.30 - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Modelling.Actions; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Sql.Info; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Upgrade context. - /// - public sealed class UpgradeContext : Context - { - #region IContext members - - /// - /// Gets the current . - /// - public static UpgradeContext Current { get { return UpgradeScope.CurrentContext; } } - - /// - /// Gets the current , or throws , if active context is not found. - /// - /// Current context. - /// is . - public static UpgradeContext Demand() - { - var currentContext = Current; - if (currentContext==null) - throw Exceptions.ContextRequired(); - return currentContext; - } - - /// - public override bool IsActive { get { return UpgradeScope.CurrentContext==this; } } - - /// - protected override UpgradeScope CreateActiveScope() - { - return new UpgradeScope(this); - } - - #endregion - - /// - /// Gets current . - /// - public DomainUpgradeMode UpgradeMode { get; private set; } - - /// - /// Gets the current upgrade stage. - /// - public UpgradeStage Stage { get; internal set; } - - /// - /// Gets the original . - /// - [Obsolete("Use Configuration property instead.")] - public DomainConfiguration OriginalConfiguration { get { return Configuration; } } - - /// - /// Gets the - /// at the current upgrade stage. - /// - public DomainConfiguration Configuration { get; private set; } - - /// - /// Gets (if available). - /// - public NodeConfiguration NodeConfiguration { get; private set; } - - /// - /// Gets parent domain. - /// - public Domain ParentDomain { get; private set; } - - /// - /// Gets the upgrade hints. - /// - public SetSlim Hints { get; private set; } - - /// - /// Gets the recycled definitions. - /// - public ICollection RecycledDefinitions { get; private set; } - - /// - /// Gets the schema upgrade hints. - /// - public HintSet SchemaHints { get; internal set; } - - /// - /// Gets the storage model difference - /// at the current upgrade stage. - /// - public NodeDifference SchemaDifference { get; internal set; } - - /// - /// Gets the schema upgrade actions - /// at the current upgrade stage. - /// - public ActionSequence SchemaUpgradeActions { get; internal set; } - - /// - /// Gets the domain model that was extracted from storage. - /// - public StoredDomainModel ExtractedDomainModel { get; internal set; } - - /// - /// Gets the extracted type map (full name of the type and type identifier). - /// - public Dictionary ExtractedTypeMap { get; internal set; } - - /// - /// Gets type identifier map for all known identifiers. - /// This collection includes all items from , - /// but it might include additional items if new types were added. - /// - public Dictionary FullTypeMap { get; internal set; } - - /// - /// Gets or sets additional type identifier map which defined by user. - /// - /// NOTE THAT, this collection has lower priority than . - /// It means, if this collection and both have mapping for the same type, - /// then type identifier will be defined by value from . - /// - /// - /// If domain configuration has configurations for databases with defined minimal and maximal type identifier, - /// then type identifier must be set within limits, which defined in mapped database. - /// If domain has not configurations for databases then all type identifiers in this collection must be greater then or equal to 100. - /// - /// - public Dictionary UserDefinedTypeMap { get; internal set; } - - /// - /// Gets the map of upgrade handlers. - /// - public ReadOnlyDictionary UpgradeHandlers { get { return Services.UpgradeHandlers; } } - - /// - /// Gets the ordered collection of upgrade handlers. - /// - public ReadOnlyList OrderedUpgradeHandlers { get { return Services.OrderedUpgradeHandlers; } } - - /// - /// Gets the ordered collection of upgrade handlers. - /// - public ReadOnlyList Modules { get { return Services.Modules; } } - - /// - /// Gets that is used for upgrade. - /// Session is available only in - /// and methods. - /// You should not dispose upgrade session. Session lifetime is controlled by DataObjects.Net. - /// - public Session Session { get; internal set; } - - /// - /// Gets that is used for upgrade. - /// You should not modify connection state by calling , - /// or similar methods. Connection state is controlled by DataObjects.Net. - /// - public DbConnection Connection { get { return Services.Connection.UnderlyingConnection; } } - - /// - /// Gets that is used for upgrade. - /// You should not modify transaction state by calling , - /// or similar methods. Transaction state is controlled by DataObjects.Net. - /// - public DbTransaction Transaction { get { return Services.Connection.ActiveTransaction; } } - - /// - /// Gets mapping between new and old persistent types. - /// - public Dictionary UpgradedTypesMapping { get; internal set; } - - /// - /// Gets information about current provider. - /// - public ProviderInfo ProviderInfo { get { return Services.ProviderInfo; } } - - - #region Private / internal members - - internal object Cookie { get; private set; } - - internal UpgradeServiceAccessor Services { get; private set; } - - internal StorageModel ExtractedModelCache { get; set; } - - internal SchemaExtractionResult ExtractedSqlModelCache { get; set; } - - internal StorageModel TargetStorageModel { get; set; } - - internal StorageNode StorageNode { get; set; } - - internal MetadataSet Metadata { get; set; } - - internal ITypeIdProvider TypeIdProvider { get; set; } - - internal bool TypesMovementsAutoDetection { get; set; } - - internal DefaultSchemaInfo DefaultSchemaInfo { get; set; } - - internal static UpgradeContext GetCurrent(object cookie) - { - var current = Current; - return current!=null && current.Cookie==cookie ? current : null; - } - - private void Initialize() - { - Stage = UpgradeMode.IsMultistage() ? UpgradeStage.Upgrading : UpgradeStage.Final; - Hints = new SetSlim(); - RecycledDefinitions = new List(); - Services = new UpgradeServiceAccessor(); - } - - #endregion - - // Constructors. - - internal UpgradeContext(Domain parentDomain, NodeConfiguration nodeConfiguration) - { - ArgumentValidator.EnsureArgumentNotNull(parentDomain, "parentDomain"); - ArgumentValidator.EnsureArgumentNotNull(nodeConfiguration, "nodeConfiguration"); - - UpgradeMode = nodeConfiguration.UpgradeMode; - Configuration = parentDomain.Configuration; - NodeConfiguration = nodeConfiguration; - Cookie = parentDomain.UpgradeContextCookie; - ParentDomain = parentDomain; - TypesMovementsAutoDetection = true; - UserDefinedTypeMap = new Dictionary(); - - Initialize(); - } - - internal UpgradeContext(DomainConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - - UpgradeMode = configuration.UpgradeMode; - Configuration = configuration; - NodeConfiguration = new NodeConfiguration(WellKnown.DefaultNodeId){UpgradeMode = configuration.UpgradeMode}; - NodeConfiguration.Lock(); - Cookie = new object(); - TypesMovementsAutoDetection = true; - UserDefinedTypeMap = new Dictionary(); - Initialize(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Aleksey Gamzov +// Created: 2008.12.30 + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Modelling.Actions; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Sql.Info; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Upgrade context. + /// + public sealed class UpgradeContext : Context + { + #region IContext members + + /// + /// Gets the current . + /// + public static UpgradeContext Current { get { return UpgradeScope.CurrentContext; } } + + /// + /// Gets the current , or throws , if active context is not found. + /// + /// Current context. + /// is . + public static UpgradeContext Demand() + { + var currentContext = Current; + if (currentContext==null) + throw Exceptions.ContextRequired(); + return currentContext; + } + + /// + public override bool IsActive { get { return UpgradeScope.CurrentContext==this; } } + + /// + protected override UpgradeScope CreateActiveScope() + { + return new UpgradeScope(this); + } + + #endregion + + /// + /// Gets current . + /// + public DomainUpgradeMode UpgradeMode { get; private set; } + + /// + /// Gets the current upgrade stage. + /// + public UpgradeStage Stage { get; internal set; } + + /// + /// Gets the original . + /// + [Obsolete("Use Configuration property instead.")] + public DomainConfiguration OriginalConfiguration { get { return Configuration; } } + + /// + /// Gets the + /// at the current upgrade stage. + /// + public DomainConfiguration Configuration { get; private set; } + + /// + /// Gets (if available). + /// + public NodeConfiguration NodeConfiguration { get; private set; } + + /// + /// Gets parent domain. + /// + public Domain ParentDomain { get; private set; } + + /// + /// Gets the upgrade hints. + /// + public SetSlim Hints { get; private set; } + + /// + /// Gets the recycled definitions. + /// + public ICollection RecycledDefinitions { get; private set; } + + /// + /// Gets the schema upgrade hints. + /// + public HintSet SchemaHints { get; internal set; } + + /// + /// Gets the storage model difference + /// at the current upgrade stage. + /// + public NodeDifference SchemaDifference { get; internal set; } + + /// + /// Gets the schema upgrade actions + /// at the current upgrade stage. + /// + public ActionSequence SchemaUpgradeActions { get; internal set; } + + /// + /// Gets the domain model that was extracted from storage. + /// + public StoredDomainModel ExtractedDomainModel { get; internal set; } + + /// + /// Gets the extracted type map (full name of the type and type identifier). + /// + public Dictionary ExtractedTypeMap { get; internal set; } + + /// + /// Gets type identifier map for all known identifiers. + /// This collection includes all items from , + /// but it might include additional items if new types were added. + /// + public Dictionary FullTypeMap { get; internal set; } + + /// + /// Gets or sets additional type identifier map which defined by user. + /// + /// NOTE THAT, this collection has lower priority than . + /// It means, if this collection and both have mapping for the same type, + /// then type identifier will be defined by value from . + /// + /// + /// If domain configuration has configurations for databases with defined minimal and maximal type identifier, + /// then type identifier must be set within limits, which defined in mapped database. + /// If domain has not configurations for databases then all type identifiers in this collection must be greater then or equal to 100. + /// + /// + public Dictionary UserDefinedTypeMap { get; internal set; } + + /// + /// Gets the map of upgrade handlers. + /// + public ReadOnlyDictionary UpgradeHandlers { get { return Services.UpgradeHandlers; } } + + /// + /// Gets the ordered collection of upgrade handlers. + /// + public ReadOnlyList OrderedUpgradeHandlers { get { return Services.OrderedUpgradeHandlers; } } + + /// + /// Gets the ordered collection of upgrade handlers. + /// + public ReadOnlyList Modules { get { return Services.Modules; } } + + /// + /// Gets that is used for upgrade. + /// Session is available only in + /// and methods. + /// You should not dispose upgrade session. Session lifetime is controlled by DataObjects.Net. + /// + public Session Session { get; internal set; } + + /// + /// Gets that is used for upgrade. + /// You should not modify connection state by calling , + /// or similar methods. Connection state is controlled by DataObjects.Net. + /// + public DbConnection Connection { get { return Services.Connection.UnderlyingConnection; } } + + /// + /// Gets that is used for upgrade. + /// You should not modify transaction state by calling , + /// or similar methods. Transaction state is controlled by DataObjects.Net. + /// + public DbTransaction Transaction { get { return Services.Connection.ActiveTransaction; } } + + /// + /// Gets mapping between new and old persistent types. + /// + public Dictionary UpgradedTypesMapping { get; internal set; } + + /// + /// Gets information about current provider. + /// + public ProviderInfo ProviderInfo { get { return Services.ProviderInfo; } } + + + #region Private / internal members + + internal object Cookie { get; private set; } + + internal UpgradeServiceAccessor Services { get; private set; } + + internal StorageModel ExtractedModelCache { get; set; } + + internal SchemaExtractionResult ExtractedSqlModelCache { get; set; } + + internal StorageModel TargetStorageModel { get; set; } + + internal StorageNode StorageNode { get; set; } + + internal MetadataSet Metadata { get; set; } + + internal ITypeIdProvider TypeIdProvider { get; set; } + + internal bool TypesMovementsAutoDetection { get; set; } + + internal DefaultSchemaInfo DefaultSchemaInfo { get; set; } + + internal static UpgradeContext GetCurrent(object cookie) + { + var current = Current; + return current!=null && current.Cookie==cookie ? current : null; + } + + private void Initialize() + { + Stage = UpgradeMode.IsMultistage() ? UpgradeStage.Upgrading : UpgradeStage.Final; + Hints = new SetSlim(); + RecycledDefinitions = new List(); + Services = new UpgradeServiceAccessor(); + } + + #endregion + + // Constructors. + + internal UpgradeContext(Domain parentDomain, NodeConfiguration nodeConfiguration) + { + ArgumentValidator.EnsureArgumentNotNull(parentDomain, "parentDomain"); + ArgumentValidator.EnsureArgumentNotNull(nodeConfiguration, "nodeConfiguration"); + + UpgradeMode = nodeConfiguration.UpgradeMode; + Configuration = parentDomain.Configuration; + NodeConfiguration = nodeConfiguration; + Cookie = parentDomain.UpgradeContextCookie; + ParentDomain = parentDomain; + TypesMovementsAutoDetection = true; + UserDefinedTypeMap = new Dictionary(); + + Initialize(); + } + + internal UpgradeContext(DomainConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + + UpgradeMode = configuration.UpgradeMode; + Configuration = configuration; + NodeConfiguration = new NodeConfiguration(WellKnown.DefaultNodeId){UpgradeMode = configuration.UpgradeMode}; + NodeConfiguration.Lock(); + Cookie = new object(); + TypesMovementsAutoDetection = true; + UserDefinedTypeMap = new Dictionary(); + Initialize(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeHandler.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeHandler.cs index 0437d42f91..3626d37dd9 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeHandler.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeHandler.cs @@ -1,363 +1,363 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.04.30 - -using System; -using System.Collections.Generic; -using System.Reflection; -using Xtensive.Core; -using Xtensive.Reflection; -using System.Linq; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Default implementation. - /// - public class UpgradeHandler : IUpgradeHandler - { - /// - /// The ".Recycled" suffix. - /// - public static readonly string RecycledSuffix = ".Recycled"; - - private Assembly assembly; - private string assemblyName; - private string assemblyVersion; - - /// - public virtual bool IsEnabled { - get { - // Must be disabled for Xtensive.Storage, - // since there is SystemUpgradeHandler. - return Assembly!=typeof(UpgradeHandler).Assembly; - } - } - - /// - public virtual Assembly Assembly { - get { - if (assembly!=null) - return assembly; - assembly = DetectAssembly(); - return assembly; - } - } - - /// - public virtual string AssemblyName { - get { - if (assemblyName!=null) - return assemblyName; - assemblyName = DetectAssemblyName(); - return assemblyName; - } - } - - /// - public virtual string AssemblyVersion { - get { - if (assemblyVersion!=null) - return assemblyVersion; - assemblyVersion = DetectAssemblyVersion(); - return assemblyVersion; - } - } - - /// - public UpgradeContext UpgradeContext { get; private set; } - - /// - /// Determines whether handler is enabled autodetect of types, which moved from one namespace to another. - /// - /// Detection is enabled by default. - /// - /// - public bool TypesMovementsAutoDetection - { - get { return UpgradeContext.TypesMovementsAutoDetection; } - protected set { UpgradeContext.TypesMovementsAutoDetection = value; } - } - - /// - public void OnConfigureUpgradeDomain() - { - var definitions = new List(); - AddRecycledDefinitions(definitions); - ProcessRecycledDefinitions(definitions); - } - - /// - public virtual void OnPrepare() - { - } - - /// - /// context.Stage is out of range. - public virtual void OnBeforeStage() - { - var context = UpgradeContext; - switch (context.Stage) { - case UpgradeStage.Upgrading: - AddUpgradeHints(context.Hints); - AddAutoHints(context.Hints); - break; - case UpgradeStage.Final: - break; - default: - throw new ArgumentOutOfRangeException("context.Stage"); - } - } - - /// - public virtual void OnSchemaReady() - { - } - - /// - public virtual void OnStage() - { - var context = UpgradeContext; - switch (context.Stage) { - case UpgradeStage.Upgrading: - OnUpgrade(); - break; - case UpgradeStage.Final: - break; - default: - throw new ArgumentOutOfRangeException("context.Stage"); - } - } - - /// - public virtual void OnComplete(Domain domain) - { - } - - /// - public virtual void OnBeforeExecuteActions(UpgradeActionSequence actions) - { - } - - /// - public virtual bool CanUpgradeFrom(string oldVersion) - { - return oldVersion==null || oldVersion==AssemblyVersion; - } - - /// UpgradeContext.Stage is out of range. - public virtual bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - if (type.Assembly!=Assembly) - throw new ArgumentOutOfRangeException("type"); - switch (upgradeStage) { - case UpgradeStage.Upgrading: - return true; - case UpgradeStage.Final: - return type.GetAttribute()==null; - default: - throw new ArgumentOutOfRangeException("UpgradeContext.Stage"); - } - } - - /// UpgradeContext.Stage is out of range. - public virtual bool IsFieldAvailable(PropertyInfo field, UpgradeStage upgradeStage) - { - ArgumentValidator.EnsureArgumentNotNull(field, "field"); - var type = field.DeclaringType; - if (type.Assembly!=Assembly) - throw new ArgumentOutOfRangeException("field"); - if (upgradeStage==UpgradeStage.Final) - return field.GetAttribute()==null; - return true; - } - - /// - /// Override this method to implement custom persistent data migration logic. - /// - public virtual void OnUpgrade() - { - // OnUpgrade is public instead of protected, WTF? - } - - #region Protected methods - - /// - /// Override this method to add upgrade hints to - /// collection. - /// - /// A set of hints to add new hints to - /// (a shortcut to collection). - protected virtual void AddUpgradeHints(Collections.ISet hints) - { - } - - /// - /// Detects the assembly this handler is made for. - /// - /// The assembly. - private Assembly DetectAssembly() - { - return GetType().Assembly; - } - - /// - /// Detects the name of the assembly this handler is made for. - /// - /// The name of the assembly. - protected virtual string DetectAssemblyName() - { - var t = GetType(); - var a = Assembly; - var ai = - t.GetAttributes().SingleOrDefault() - ?? Attribute.GetCustomAttributes(a, typeof(AssemblyInfoAttribute), false).SingleOrDefault() as AssemblyInfoAttribute; - return (ai==null || ai.Name.IsNullOrEmpty()) - ? a.GetName().Name - : ai.Name; - } - - /// - /// Detects the version of the assembly this handler is made for. - /// - /// The version of the assembly. - protected virtual string DetectAssemblyVersion() - { - var t = GetType(); - var a = Assembly; - var ai = - t.GetAttributes().SingleOrDefault() - ?? Attribute.GetCustomAttributes(a, typeof(AssemblyInfoAttribute), false).SingleOrDefault() as AssemblyInfoAttribute; - return (ai==null || ai.Version.IsNullOrEmpty()) - ? a.GetName().Version.ToString() - : ai.Version; - } - - /// - /// Adds the "auto" hints - e.g. hints for recycled types. - /// - /// A set of hints to add new hints to - /// (a shortcut to collection). - protected virtual void AddAutoHints(Collections.ISet hints) - { - var context = UpgradeContext; - var types = Assembly.GetTypes(); - var registeredTypes = ( - from t in types - where context.Configuration.Types.Contains(t) - select t).ToArray(); - - var recycledTypes = - from t in registeredTypes - let a = t.GetAttribute() - where a!=null - select new {Type = t, Attribute = a}; - - foreach (var r in recycledTypes) { - var oldName = r.Attribute.OriginalName; - if (oldName.IsNullOrEmpty()) - oldName = GetOriginalName(r.Type); - else if (!oldName.Contains(".", StringComparison.Ordinal)) { - string ns = TryStripRecycledSuffix(r.Type.Namespace); - oldName = ns + "." + oldName; - } - if (string.IsNullOrEmpty(r.Attribute.OriginalName) && !context.ExtractedTypeMap.ContainsKey(oldName)) - continue; - var renameHint = new RenameTypeHint(oldName, r.Type); - var similarHints = - from h in hints - let similarHint = h as RenameTypeHint - where similarHint!=null - where similarHint.NewType==renameHint.NewType - select similarHint; - if (!similarHints.Any()) - hints.Add(renameHint); - } - - var recycledProperties = - from t in registeredTypes - from p in t.GetProperties(BindingFlags.DeclaredOnly - | BindingFlags.Instance - | BindingFlags.Public - | BindingFlags.NonPublic) - let pa = p.GetAttribute() - let ra = p.GetAttribute() - where pa!=null && ra!=null - select new {Property = p, Attribute = ra}; - - foreach (var r in recycledProperties) { - var oldName = r.Attribute.OriginalName; - if (!string.IsNullOrEmpty(oldName)) - hints.Add(new RenameFieldHint(r.Property.DeclaringType, oldName, r.Property.Name)); - } - } - - private void ProcessRecycledDefinitions(ICollection definitions) - { - if (definitions.Count==0) - return; - var hints = UpgradeContext.Hints; - var allDefinitions = UpgradeContext.RecycledDefinitions; - var recycledFieldDefinitions = definitions.OfType(); - foreach (var definition in recycledFieldDefinitions) { - allDefinitions.Add(definition); - if (!string.IsNullOrEmpty(definition.OriginalFieldName) && definition.FieldName!=definition.OriginalFieldName) - hints.Add(new RenameFieldHint(definition.OwnerType, definition.OriginalFieldName, definition.FieldName)); - } - } - - /// - /// Override this method to add recycled definitions. - /// - /// Collection to put recycled definitions to. - protected virtual void AddRecycledDefinitions(ICollection recycledDefinitions) - { - } - - /// - /// Gets the original name of the recycled type. - /// - /// The recycled type to get the original name for. - /// The original name of the recycled type. - protected virtual string GetOriginalName(Type recycledType) - { - var nameOfType = recycledType.IsNested ? recycledType.FullName.Replace(recycledType.Namespace + ".", string.Empty) : recycledType.Name; - return TryStripRecycledSuffix(recycledType.Namespace) + "." + nameOfType; - } - - /// - /// Tries to strip the ".Recycled" suffix from the namespace. - /// - /// The namespace to remove the suffix from. - /// - /// The namespace without ".Recycled" suffix, if it was there; - /// otherwise the same value. - /// - protected virtual string TryStripRecycledSuffix(string nameSpace) - { - return nameSpace.TryCutSuffix(RecycledSuffix); - } - - #endregion - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - public UpgradeHandler() - { - UpgradeContext = UpgradeContext.Demand(); - } - - internal UpgradeHandler(Assembly assembly) - : this() - { - this.assembly = assembly; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.04.30 + +using System; +using System.Collections.Generic; +using System.Reflection; +using Xtensive.Core; +using Xtensive.Reflection; +using System.Linq; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Default implementation. + /// + public class UpgradeHandler : IUpgradeHandler + { + /// + /// The ".Recycled" suffix. + /// + public static readonly string RecycledSuffix = ".Recycled"; + + private Assembly assembly; + private string assemblyName; + private string assemblyVersion; + + /// + public virtual bool IsEnabled { + get { + // Must be disabled for Xtensive.Storage, + // since there is SystemUpgradeHandler. + return Assembly!=typeof(UpgradeHandler).Assembly; + } + } + + /// + public virtual Assembly Assembly { + get { + if (assembly!=null) + return assembly; + assembly = DetectAssembly(); + return assembly; + } + } + + /// + public virtual string AssemblyName { + get { + if (assemblyName!=null) + return assemblyName; + assemblyName = DetectAssemblyName(); + return assemblyName; + } + } + + /// + public virtual string AssemblyVersion { + get { + if (assemblyVersion!=null) + return assemblyVersion; + assemblyVersion = DetectAssemblyVersion(); + return assemblyVersion; + } + } + + /// + public UpgradeContext UpgradeContext { get; private set; } + + /// + /// Determines whether handler is enabled autodetect of types, which moved from one namespace to another. + /// + /// Detection is enabled by default. + /// + /// + public bool TypesMovementsAutoDetection + { + get { return UpgradeContext.TypesMovementsAutoDetection; } + protected set { UpgradeContext.TypesMovementsAutoDetection = value; } + } + + /// + public void OnConfigureUpgradeDomain() + { + var definitions = new List(); + AddRecycledDefinitions(definitions); + ProcessRecycledDefinitions(definitions); + } + + /// + public virtual void OnPrepare() + { + } + + /// + /// context.Stage is out of range. + public virtual void OnBeforeStage() + { + var context = UpgradeContext; + switch (context.Stage) { + case UpgradeStage.Upgrading: + AddUpgradeHints(context.Hints); + AddAutoHints(context.Hints); + break; + case UpgradeStage.Final: + break; + default: + throw new ArgumentOutOfRangeException("context.Stage"); + } + } + + /// + public virtual void OnSchemaReady() + { + } + + /// + public virtual void OnStage() + { + var context = UpgradeContext; + switch (context.Stage) { + case UpgradeStage.Upgrading: + OnUpgrade(); + break; + case UpgradeStage.Final: + break; + default: + throw new ArgumentOutOfRangeException("context.Stage"); + } + } + + /// + public virtual void OnComplete(Domain domain) + { + } + + /// + public virtual void OnBeforeExecuteActions(UpgradeActionSequence actions) + { + } + + /// + public virtual bool CanUpgradeFrom(string oldVersion) + { + return oldVersion==null || oldVersion==AssemblyVersion; + } + + /// UpgradeContext.Stage is out of range. + public virtual bool IsTypeAvailable(Type type, UpgradeStage upgradeStage) + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + if (type.Assembly!=Assembly) + throw new ArgumentOutOfRangeException("type"); + switch (upgradeStage) { + case UpgradeStage.Upgrading: + return true; + case UpgradeStage.Final: + return type.GetAttribute()==null; + default: + throw new ArgumentOutOfRangeException("UpgradeContext.Stage"); + } + } + + /// UpgradeContext.Stage is out of range. + public virtual bool IsFieldAvailable(PropertyInfo field, UpgradeStage upgradeStage) + { + ArgumentValidator.EnsureArgumentNotNull(field, "field"); + var type = field.DeclaringType; + if (type.Assembly!=Assembly) + throw new ArgumentOutOfRangeException("field"); + if (upgradeStage==UpgradeStage.Final) + return field.GetAttribute()==null; + return true; + } + + /// + /// Override this method to implement custom persistent data migration logic. + /// + public virtual void OnUpgrade() + { + // OnUpgrade is public instead of protected, WTF? + } + + #region Protected methods + + /// + /// Override this method to add upgrade hints to + /// collection. + /// + /// A set of hints to add new hints to + /// (a shortcut to collection). + protected virtual void AddUpgradeHints(Collections.ISet hints) + { + } + + /// + /// Detects the assembly this handler is made for. + /// + /// The assembly. + private Assembly DetectAssembly() + { + return GetType().Assembly; + } + + /// + /// Detects the name of the assembly this handler is made for. + /// + /// The name of the assembly. + protected virtual string DetectAssemblyName() + { + var t = GetType(); + var a = Assembly; + var ai = + t.GetAttributes().SingleOrDefault() + ?? Attribute.GetCustomAttributes(a, typeof(AssemblyInfoAttribute), false).SingleOrDefault() as AssemblyInfoAttribute; + return (ai==null || ai.Name.IsNullOrEmpty()) + ? a.GetName().Name + : ai.Name; + } + + /// + /// Detects the version of the assembly this handler is made for. + /// + /// The version of the assembly. + protected virtual string DetectAssemblyVersion() + { + var t = GetType(); + var a = Assembly; + var ai = + t.GetAttributes().SingleOrDefault() + ?? Attribute.GetCustomAttributes(a, typeof(AssemblyInfoAttribute), false).SingleOrDefault() as AssemblyInfoAttribute; + return (ai==null || ai.Version.IsNullOrEmpty()) + ? a.GetName().Version.ToString() + : ai.Version; + } + + /// + /// Adds the "auto" hints - e.g. hints for recycled types. + /// + /// A set of hints to add new hints to + /// (a shortcut to collection). + protected virtual void AddAutoHints(Collections.ISet hints) + { + var context = UpgradeContext; + var types = Assembly.GetTypes(); + var registeredTypes = ( + from t in types + where context.Configuration.Types.Contains(t) + select t).ToArray(); + + var recycledTypes = + from t in registeredTypes + let a = t.GetAttribute() + where a!=null + select new {Type = t, Attribute = a}; + + foreach (var r in recycledTypes) { + var oldName = r.Attribute.OriginalName; + if (oldName.IsNullOrEmpty()) + oldName = GetOriginalName(r.Type); + else if (!oldName.Contains(".", StringComparison.Ordinal)) { + string ns = TryStripRecycledSuffix(r.Type.Namespace); + oldName = ns + "." + oldName; + } + if (string.IsNullOrEmpty(r.Attribute.OriginalName) && !context.ExtractedTypeMap.ContainsKey(oldName)) + continue; + var renameHint = new RenameTypeHint(oldName, r.Type); + var similarHints = + from h in hints + let similarHint = h as RenameTypeHint + where similarHint!=null + where similarHint.NewType==renameHint.NewType + select similarHint; + if (!similarHints.Any()) + hints.Add(renameHint); + } + + var recycledProperties = + from t in registeredTypes + from p in t.GetProperties(BindingFlags.DeclaredOnly + | BindingFlags.Instance + | BindingFlags.Public + | BindingFlags.NonPublic) + let pa = p.GetAttribute() + let ra = p.GetAttribute() + where pa!=null && ra!=null + select new {Property = p, Attribute = ra}; + + foreach (var r in recycledProperties) { + var oldName = r.Attribute.OriginalName; + if (!string.IsNullOrEmpty(oldName)) + hints.Add(new RenameFieldHint(r.Property.DeclaringType, oldName, r.Property.Name)); + } + } + + private void ProcessRecycledDefinitions(ICollection definitions) + { + if (definitions.Count==0) + return; + var hints = UpgradeContext.Hints; + var allDefinitions = UpgradeContext.RecycledDefinitions; + var recycledFieldDefinitions = definitions.OfType(); + foreach (var definition in recycledFieldDefinitions) { + allDefinitions.Add(definition); + if (!string.IsNullOrEmpty(definition.OriginalFieldName) && definition.FieldName!=definition.OriginalFieldName) + hints.Add(new RenameFieldHint(definition.OwnerType, definition.OriginalFieldName, definition.FieldName)); + } + } + + /// + /// Override this method to add recycled definitions. + /// + /// Collection to put recycled definitions to. + protected virtual void AddRecycledDefinitions(ICollection recycledDefinitions) + { + } + + /// + /// Gets the original name of the recycled type. + /// + /// The recycled type to get the original name for. + /// The original name of the recycled type. + protected virtual string GetOriginalName(Type recycledType) + { + var nameOfType = recycledType.IsNested ? recycledType.FullName.Replace(recycledType.Namespace + ".", string.Empty) : recycledType.Name; + return TryStripRecycledSuffix(recycledType.Namespace) + "." + nameOfType; + } + + /// + /// Tries to strip the ".Recycled" suffix from the namespace. + /// + /// The namespace to remove the suffix from. + /// + /// The namespace without ".Recycled" suffix, if it was there; + /// otherwise the same value. + /// + protected virtual string TryStripRecycledSuffix(string nameSpace) + { + return nameSpace.TryCutSuffix(RecycledSuffix); + } + + #endregion + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + public UpgradeHandler() + { + UpgradeContext = UpgradeContext.Demand(); + } + + internal UpgradeHandler(Assembly assembly) + : this() + { + this.assembly = assembly; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeScope.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeScope.cs index bdc231476a..9e5c20c00e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeScope.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeScope.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Aleksey Gamzov -// Created: 2008.12.30 - -using Xtensive.Core; - -using Xtensive.IoC; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// The scope for . - /// - public sealed class UpgradeScope : Scope - { - /// - /// Gets the current context. - /// - public new static UpgradeContext CurrentContext - { - get { return Scope.CurrentContext; } - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The context. - internal UpgradeScope(UpgradeContext context) - : base(context) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Aleksey Gamzov +// Created: 2008.12.30 + +using Xtensive.Core; + +using Xtensive.IoC; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// The scope for . + /// + public sealed class UpgradeScope : Scope + { + /// + /// Gets the current context. + /// + public new static UpgradeContext CurrentContext + { + get { return Scope.CurrentContext; } + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The context. + internal UpgradeScope(UpgradeContext context) + : base(context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeStage.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeStage.cs index b66fa2e417..d64640da18 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeStage.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradeStage.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2009.04.30 - -using System; - -namespace Xtensive.Orm.Upgrade -{ - /// - /// Upgrade stages enumeration. - /// - public enum UpgradeStage - { - /// - /// This stage no longer occurs. It's kept for compatibility with previous versions. - /// - [Obsolete("This stage no longer occurs")] - Initializing = 0x0, - /// - /// The second upgrade stage. - /// All the types are visible, including upgrade-only types; - /// schema is upgraded; - /// events are raised at the beginning of this stage; - /// events are raised at the end of this stage. - /// - Upgrading = 0x1, - /// - /// The final upgrade stage. - /// Only runtime types are visible; upgrade-only types are invisible; - /// schema is upgraded once more (upgrade-only types are removed); - /// - Final = 0x2, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2009.04.30 + +using System; + +namespace Xtensive.Orm.Upgrade +{ + /// + /// Upgrade stages enumeration. + /// + public enum UpgradeStage + { + /// + /// This stage no longer occurs. It's kept for compatibility with previous versions. + /// + [Obsolete("This stage no longer occurs")] + Initializing = 0x0, + /// + /// The second upgrade stage. + /// All the types are visible, including upgrade-only types; + /// schema is upgraded; + /// events are raised at the beginning of this stage; + /// events are raised at the end of this stage. + /// + Upgrading = 0x1, + /// + /// The final upgrade stage. + /// Only runtime types are visible; upgrade-only types are invisible; + /// schema is upgraded once more (upgrade-only types are removed); + /// + Final = 0x2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs index aa387002af..83299a9cbf 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs @@ -1,644 +1,644 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.04.23 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.IoC; -using Xtensive.Modelling.Comparison; -using Xtensive.Modelling.Comparison.Hints; -using Xtensive.Orm.Building.Builders; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Logging; -using Xtensive.Orm.Model; -using Xtensive.Orm.Model.Stored; -using Xtensive.Orm.Providers; -using Xtensive.Orm.Upgrade.Internals; -using Xtensive.Orm.Upgrade.Internals.Interfaces; -using Xtensive.Orm.Upgrade.Model; -using Xtensive.Reflection; -using Xtensive.Sql; -using Xtensive.Sql.Info; - -namespace Xtensive.Orm.Upgrade -{ - internal sealed class UpgradingDomainBuilder - { - private readonly UpgradeContext context; - private readonly DomainUpgradeMode upgradeMode; - - private DefaultSchemaInfo defaultSchemaInfo; - private FutureResult workerResult; - - public static Domain Build(DomainConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - - if (configuration.ConnectionInfo==null) - throw new ArgumentException(Strings.ExConnectionInfoIsMissing, "configuration"); - - if (!configuration.IsLocked) - configuration.Lock(); - - LogManager.Default.AutoInitialize(); - - var context = new UpgradeContext(configuration); - - using (context.Activate()) - using (context.Services) { - return new UpgradingDomainBuilder(context).Run(); - } - } - - public static StorageNode BuildNode(Domain parentDomain, NodeConfiguration nodeConfiguration) - { - ArgumentValidator.EnsureArgumentNotNull(parentDomain, "parentDomain"); - ArgumentValidator.EnsureArgumentNotNull(nodeConfiguration, "nodeConfiguration"); - - nodeConfiguration.Validate(parentDomain.Configuration); - if (!nodeConfiguration.IsLocked) - nodeConfiguration.Lock(); - - var context = new UpgradeContext(parentDomain, nodeConfiguration); - - using (context.Activate()) - using (context.Services) { - new UpgradingDomainBuilder(context).Run(); - return context.StorageNode; - } - } - - private Domain Run() - { - BuildServices(); - OnPrepare(); - - var domain = upgradeMode.IsMultistage() ? BuildMultistageDomain() : BuildSingleStageDomain(); - - OnComplete(domain); - CompleteUpgradeTransaction(); - context.Services.ClearTemporaryResources(); - - return domain; - } - - private void CompleteUpgradeTransaction() - { - var connection = context.Services.Connection; - var driver = context.Services.StorageDriver; - - if (connection.ActiveTransaction==null) - return; - - try { - driver.CommitTransaction(null, connection); - } - catch { - driver.RollbackTransaction(null, connection); - throw; - } - } - - private FutureResult CreateResult(T value) - { - return new ValueFutureResult(value); - } - - private FutureResult CreateResult(Func action) - { - if (context.Configuration.BuildInParallel) - return new AsyncFutureResult(action, UpgradeLog.Instance); - return new SynchronousFutureResult(action); - } - - private Domain BuildMultistageDomain() - { - Domain finalDomain; - using (StartSqlWorker()) { - var finalDomainResult = context.ParentDomain!=null - ? CreateResult(context.ParentDomain) - : CreateResult(CreateBuilder(UpgradeStage.Final)); - using (finalDomainResult) { - OnConfigureUpgradeDomain(); - using (var upgradeDomain = CreateBuilder(UpgradeStage.Upgrading).Invoke()) { - CompleteSqlWorker(); - PerformUpgrade(upgradeDomain, UpgradeStage.Upgrading); - } - finalDomain = finalDomainResult.Get(); - } - } - PerformUpgrade(finalDomain, UpgradeStage.Final); - return finalDomain; - } - - private Domain BuildSingleStageDomain() - { - using (StartSqlWorker()) { - var domain = context.ParentDomain ?? CreateBuilder(UpgradeStage.Final).Invoke(); - CompleteSqlWorker(); - PerformUpgrade(domain, UpgradeStage.Final); - return domain; - } - } - - private void BuildServices() - { - var services = context.Services; - var configuration = context.Configuration; - - services.Configuration = configuration; - services.IndexFilterCompiler = new PartialIndexFilterCompiler(); - - if (context.ParentDomain==null) { - var descriptor = ProviderDescriptor.Get(configuration.ConnectionInfo.Provider); - var driverFactory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); - var handlerFactory = (HandlerFactory) Activator.CreateInstance(descriptor.HandlerFactory); - var driver = StorageDriver.Create(driverFactory, configuration); - services.HandlerFactory = handlerFactory; - services.StorageDriver = driver; - services.NameBuilder = new NameBuilder(configuration, driver.ProviderInfo); - } - else { - var handlers = context.ParentDomain.Handlers; - services.HandlerFactory = handlers.Factory; - services.StorageDriver = handlers.StorageDriver; - services.NameBuilder = handlers.NameBuilder; - } - - CreateConnection(services); - context.DefaultSchemaInfo = defaultSchemaInfo = services.StorageDriver.GetDefaultSchema(services.Connection); - services.MappingResolver = MappingResolver.Create(configuration, context.NodeConfiguration, defaultSchemaInfo); - BuildExternalServices(services, configuration); - services.Lock(); - - context.TypeIdProvider = new TypeIdProvider(context); - } - - private void CreateConnection(UpgradeServiceAccessor serviceAccessor) - { - var driver = serviceAccessor.StorageDriver; - var connection = driver.CreateConnection(null); - - driver.ApplyNodeConfiguration(connection, context.NodeConfiguration); - - try { - driver.OpenConnection(null, connection); - driver.BeginTransaction(null, connection, null); - } - catch { - connection.Dispose(); - throw; - } - - if (driver.ProviderInfo.Supports(ProviderFeatures.SingleConnection)) - serviceAccessor.RegisterTemporaryResource(connection); - else - serviceAccessor.RegisterResource(connection); - - serviceAccessor.Connection = connection; - } - - private void BuildExternalServices(UpgradeServiceAccessor serviceAccessor, DomainConfiguration configuration) - { - var standardRegistrations = new[] { - new ServiceRegistration(typeof (DomainConfiguration), configuration), - new ServiceRegistration(typeof (UpgradeContext), context) - }; - - var modules = configuration.Types.Modules - .Select(type => new ServiceRegistration(typeof (IModule), type, false)); - var handlers = configuration.Types.UpgradeHandlers - .Select(type => new ServiceRegistration(typeof (IUpgradeHandler), type, false)); - var ftCatalogResolvers = configuration.Types.FullTextCatalogResolvers - .Select(type => new ServiceRegistration(typeof (IFullTextCatalogNameBuilder), type, false)); - - var registrations = standardRegistrations.Concat(modules).Concat(handlers).Concat(ftCatalogResolvers); - var serviceContainer = new ServiceContainer(registrations); - serviceAccessor.RegisterResource(serviceContainer); - - BuildModules(serviceAccessor, serviceContainer); - BuildUpgradeHandlers(serviceAccessor, serviceContainer); - BuildFullTextCatalogResolver(serviceAccessor, serviceContainer); - } - - private static void BuildModules(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) - { - serviceAccessor.Modules = new ReadOnlyList(serviceContainer.GetAll().ToList()); - } - - private static void BuildUpgradeHandlers(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) - { - // Getting user handlers - var userHandlers = - from handler in serviceContainer.GetAll() - let assembly = handler.Assembly ?? handler.GetType().Assembly - where handler.IsEnabled - group handler by assembly; - - // Adding user handlers - var handlers = new Dictionary(); - foreach (var group in userHandlers) { - var candidates = group.ToList(); - if (candidates.Count > 1) { - throw new DomainBuilderException( - string.Format(Strings.ExMoreThanOneEnabledXIsProvidedForAssemblyY, typeof (IUpgradeHandler).GetShortName(), @group.Key)); - } - handlers.Add(group.Key, candidates[0]); - } - - // Adding default handlers - var assembliesWithUserHandlers = handlers.Select(pair => pair.Key); - var assembliesWithoutUserHandler = - serviceAccessor.Configuration.Types.PersistentTypes - .Select(type => type.Assembly) - .Distinct() - .Except(assembliesWithUserHandlers); - - foreach (var assembly in assembliesWithoutUserHandler) { - var handler = new UpgradeHandler(assembly); - handlers.Add(assembly, handler); - } - - // Building a list of handlers sorted by dependencies of their assemblies - var dependencies = handlers.Keys.ToDictionary( - assembly => assembly, - assembly => assembly.GetReferencedAssemblies().Select(assemblyName => assemblyName.ToString()).ToHashSet()); - var sortedHandlers = handlers - .SortTopologically((a0, a1) => dependencies[a1.Key].Contains(a0.Key.GetName().ToString())) - .Select(pair => pair.Value); - - // Storing the result - serviceAccessor.UpgradeHandlers = - new ReadOnlyDictionary(handlers); - serviceAccessor.OrderedUpgradeHandlers = - new ReadOnlyList(sortedHandlers.ToList()); - } - - private static void BuildFullTextCatalogResolver(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) - { - //Getting user resolvers - var candidates = from r in serviceContainer.GetAll() - let assembly = r.GetType().Assembly - where r.IsEnabled && assembly!=typeof (IFullTextCatalogNameBuilder).Assembly - select r; - - var userResolversCount = candidates.Count(); - if (userResolversCount > 1) - throw new DomainBuilderException(string.Format(Strings.ExMoreThanOneEnabledXIsProvided, typeof (IFullTextCatalogNameBuilder).GetShortName())); - - var resolver = (userResolversCount==0) - ? new FullTextCatalogNameBuilder() - : candidates.First(); - - //storing sesolver - serviceAccessor.FulltextCatalogNameBuilder = resolver; - } - - /// context.Stage is out of range. - private void PerformUpgrade(Domain domain, UpgradeStage stage) - { - context.Stage = stage; - - OnBeforeStage(); - - using (var session = domain.OpenSession(SessionType.System)) - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - var upgrader = new SchemaUpgrader(context, session); - var extractor = new SchemaExtractor(context, session); - SynchronizeSchema(domain, upgrader, extractor, GetUpgradeMode(stage)); - var storageNode = BuildStorageNode(domain, extractor); - session.SetStorageNode(storageNode); - OnStage(session); - transaction.Complete(); - } - } - - private StorageNode BuildStorageNode(Domain domain, SchemaExtractor extractor) - { - var schemaExtractionResult = GetRealExtractionResult(extractor.GetSqlSchema()); - context.ExtractedSqlModelCache = schemaExtractionResult; - - var modelMapping = ModelMappingBuilder.Build( - domain.Handlers, schemaExtractionResult, - context.Services.MappingResolver, context.NodeConfiguration, context.UpgradeMode.IsLegacy()); - var result = new StorageNode(context.NodeConfiguration, modelMapping, new TypeIdRegistry()); - - // Register default storage node immediately, - // non-default nodes are registered in NodeManager after everything completes successfully. - if (result.Id==WellKnown.DefaultNodeId) - domain.Handlers.StorageNodeRegistry.Add(result); - - context.StorageNode = result; - return result; - } - - private SchemaExtractionResult GetRealExtractionResult(SchemaExtractionResult baseSchemaExtractionResult) - { - if (!context.Configuration.ShareStorageSchemaOverNodes) - return baseSchemaExtractionResult; - // Skip mode is a special case. Real extraction result is generated by - // a builder in the SynchronizeSchema() method. - if (context.NodeConfiguration.UpgradeMode == DomainUpgradeMode.Skip) - return baseSchemaExtractionResult; - - //for default node - if (context.ParentDomain == null) { - if (context.Stage==UpgradeStage.Final) - return baseSchemaExtractionResult.MakeShared(); - return baseSchemaExtractionResult; - } - //for additional nodes - if (context.Stage==UpgradeStage.Final) { - var schemaExtractionResult = new SchemaExtractionResult(); - var defaultNode = context.ParentDomain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId); - defaultNode.Mapping.GetAllSchemaNodes() - .Select(node => node.Schema.Catalog) - .Distinct() - .ForEach(schemaExtractionResult.Catalogs.Add); - return schemaExtractionResult.MakeShared(); - } - return baseSchemaExtractionResult; - } - - private Func CreateBuilder(UpgradeStage stage) - { - var configuration = new DomainBuilderConfiguration { - DomainConfiguration = context.Configuration, - Stage = stage, - Services = context.Services, - ModelFilter = new StageModelFilter(context.UpgradeHandlers, stage), - UpgradeContextCookie = context.Cookie, - RecycledDefinitions = context.RecycledDefinitions, - DefaultSchemaInfo = defaultSchemaInfo - }; - - configuration.Lock(); - Func builder = DomainBuilder.Run; - return builder.Bind(configuration); - } - - //private HintSet GetSchemaHints(StorageModel extractedSchema, StorageModel targetSchema) - //{ - // context.SchemaHints = new HintSet(extractedSchema, targetSchema); - // if (context.Stage==UpgradeStage.Upgrading) - // BuildSchemaHints(extractedSchema); - // return context.SchemaHints; - //} - - private void BuildSchemaHints(StorageModel extractedSchema, UpgradeHintsProcessingResult result, StoredDomainModel currentDomainModel) - { - var oldModel = context.ExtractedDomainModel; - if (oldModel==null) - return; - var handlers = Domain.Demand().Handlers; - // It's important to use same StoredDomainModel of current domain - // in both UpgradeHintsProcessor and HintGenerator instances. - var hintGenerator = new HintGenerator(result.TypeMapping, result.ReverseTypeMapping, result.FieldMapping, result.Hints, handlers, context.Services.MappingResolver, extractedSchema, currentDomainModel, oldModel); - var hints = hintGenerator.Run(); - context.UpgradedTypesMapping = hints.UpgradedTypesMapping; - context.Hints.Clear(); - foreach (var modelHint in hints.ModelHints) - context.Hints.Add(modelHint); - foreach (var schemaHint in hints.SchemaHints) { - try { - context.SchemaHints.Add(schemaHint); - } - catch (Exception error) { - UpgradeLog.Warning(Strings.LogFailedToAddSchemaHintXErrorY, schemaHint, error); - } - } - } - - private void SynchronizeSchema( - Domain domain, SchemaUpgrader upgrader, SchemaExtractor extractor, SchemaUpgradeMode schemaUpgradeMode) - { - using (UpgradeLog.InfoRegion(Strings.LogSynchronizingSchemaInXMode, schemaUpgradeMode)) { - StorageModel targetSchema = null; - if (schemaUpgradeMode==SchemaUpgradeMode.Skip) { - if (context.ParentDomain==null) { - //If we build main domain we should log target model. - //Log of Storage Node target model is not necessary - //because storage target model exactly the same. - targetSchema = GetTargetModel(domain); - context.TargetStorageModel = targetSchema; - if (UpgradeLog.IsLogged(LogLevel.Info)) { - UpgradeLog.Info(Strings.LogTargetSchema); - targetSchema.Dump(); - } - } - var builder = ExtractedModelBuilderFactory.GetBuilder(context); - context.ExtractedSqlModelCache = builder.Run(); - OnSchemaReady(); - return; // Skipping comparison completely - } - - var extractedSchema = extractor.GetSchema(); - - // Hints - var triplet = BuildTargetModelAndHints(extractedSchema); - var hintProcessingResult = triplet.Third; - targetSchema = triplet.First; - context.TargetStorageModel = targetSchema; - var hints = triplet.Second; - if (UpgradeLog.IsLogged(LogLevel.Info)) - { - UpgradeLog.Info(Strings.LogExtractedSchema); - extractedSchema.Dump(); - UpgradeLog.Info(Strings.LogTargetSchema); - targetSchema.Dump(); - } - OnSchemaReady(); - - var breifExceptionFormat = domain.Configuration.SchemaSyncExceptionFormat==SchemaSyncExceptionFormat.Brief; - var result = SchemaComparer.Compare(extractedSchema, targetSchema, - hints, context.Hints, schemaUpgradeMode, domain.Model, breifExceptionFormat, context.Stage); - var shouldDumpSchema = !schemaUpgradeMode.In( - SchemaUpgradeMode.Skip, SchemaUpgradeMode.ValidateCompatible, SchemaUpgradeMode.Recreate); - if (shouldDumpSchema && UpgradeLog.IsLogged(LogLevel.Info)) - UpgradeLog.Info(result.ToString()); - - if (UpgradeLog.IsLogged(LogLevel.Info)) - UpgradeLog.Info(Strings.LogComparisonResultX, result); - - context.SchemaDifference = (NodeDifference) result.Difference; - context.SchemaUpgradeActions = result.UpgradeActions; - - switch (schemaUpgradeMode) { - case SchemaUpgradeMode.ValidateExact: - if (result.SchemaComparisonStatus!=SchemaComparisonStatus.Equal || result.HasColumnTypeChanges) - throw new SchemaSynchronizationException(result); - if (!hintProcessingResult.AreAllTypesMapped() && hintProcessingResult.SuspiciousTypes.Any()) - throw new SchemaSynchronizationException(Strings.ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet); - break; - case SchemaUpgradeMode.ValidateCompatible: - if (result.SchemaComparisonStatus!=SchemaComparisonStatus.Equal - && result.SchemaComparisonStatus!=SchemaComparisonStatus.TargetIsSubset) - throw new SchemaSynchronizationException(result); - break; - case SchemaUpgradeMode.PerformSafely: - if (result.HasUnsafeActions) - throw new SchemaSynchronizationException(result); - goto case SchemaUpgradeMode.Perform; - case SchemaUpgradeMode.Recreate: - case SchemaUpgradeMode.Perform: - upgrader.UpgradeSchema(extractor.GetSqlSchema(), extractedSchema, targetSchema, result.UpgradeActions); - if (result.UpgradeActions.Any()) - extractor.ClearCache(); - break; - case SchemaUpgradeMode.ValidateLegacy: - if (result.IsCompatibleInLegacyMode!=true) - throw new SchemaSynchronizationException(result); - break; - default: - throw new ArgumentOutOfRangeException("schemaUpgradeMode"); - } - } - } - - private Triplet BuildTargetModelAndHints(StorageModel extractedSchema) - { - var handlers = Domain.Demand().Handlers; - var currentDomainModel = GetStoredDomainModel(handlers.Domain.Model); - var hintProcessor = GetHintProcessor(currentDomainModel, extractedSchema, handlers); - var processedInfo = hintProcessor.Process(context.Hints); - var targetModel = GetTargetModel(handlers.Domain, processedInfo.ReverseFieldMapping, processedInfo.CurrentModelTypes, extractedSchema); - context.SchemaHints = new HintSet(extractedSchema, targetModel); - if (context.Stage == UpgradeStage.Upgrading) - BuildSchemaHints(extractedSchema, processedInfo, currentDomainModel); - return new Triplet(targetModel, context.SchemaHints, processedInfo); - } - - - private void OnConfigureUpgradeDomain() - { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnConfigureUpgradeDomain(); - } - - private void OnSchemaReady() - { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnSchemaReady(); - } - - private void OnPrepare() - { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnPrepare(); - } - - private IDisposable StartSqlWorker() - { - var result = CreateResult(SqlWorker.Create(context.Services, upgradeMode.GetSqlWorkerTask())); - workerResult = result; - return result; - } - - private void CompleteSqlWorker() - { - if (!workerResult.IsAvailable) - return; - var result = workerResult.Get(); - context.Metadata = result.Metadata; - if (result.Schema!=null) - context.ExtractedSqlModelCache = result.Schema; - } - - private void OnBeforeStage() - { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnBeforeStage(); - } - - private void OnStage(Session session) - { - context.Session = session; - try { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnStage(); - } - finally { - context.Session = null; - } - } - - private void OnComplete(Domain domain) - { - foreach (var handler in context.OrderedUpgradeHandlers) - handler.OnComplete(domain); - - foreach (var module in context.Modules) - module.OnBuilt(domain); - } - - private StorageModel GetTargetModel(Domain domain) - { - return GetTargetModel(domain, new Dictionary(), new Dictionary(), null); - } - - private StorageModel GetTargetModel(Domain domain, Dictionary fieldMapping, Dictionary currentTypes, StorageModel extractedModel) - { - var indexFilterCompiler = context.Services.IndexFilterCompiler; - var fullTextCatalogResolver = context.Services.FulltextCatalogNameBuilder; - var mappingResolver = context.Services.MappingResolver; - var converter = new DomainModelConverter(domain.Handlers, context.TypeIdProvider, indexFilterCompiler, mappingResolver, fullTextCatalogResolver, context.Stage==UpgradeStage.Upgrading) { - BuildForeignKeys = context.Configuration.Supports(ForeignKeyMode.Reference), - BuildHierarchyForeignKeys = context.Configuration.Supports(ForeignKeyMode.Hierarchy), - FieldMapping = fieldMapping, - CurrentModelTypes = currentTypes, - StorageModel = extractedModel - }; - return converter.Run(); - } - - private IUpgradeHintsProcessor GetHintProcessor(StoredDomainModel currentDomainModel, StorageModel extractedSchema, HandlerAccessor handlers) - { - var oldModel = context.ExtractedDomainModel; - var stage = context.Stage; - - if (stage==UpgradeStage.Upgrading && oldModel!=null) - return new UpgradeHintsProcessor(handlers, context.Services.MappingResolver, currentDomainModel, oldModel, extractedSchema, context.TypesMovementsAutoDetection); - if (context.UpgradeMode==DomainUpgradeMode.Validate && oldModel!=null) - return new UpgradeHintsProcessor(handlers, context.Services.MappingResolver, currentDomainModel, oldModel, extractedSchema, false); - return new NullUpgradeHintsProcessor(currentDomainModel); - } - - private SchemaUpgradeMode GetUpgradeMode(UpgradeStage stage) - { - switch (stage) { - case UpgradeStage.Upgrading: - return upgradeMode.GetUpgradingStageUpgradeMode(); - case UpgradeStage.Final: - return upgradeMode.GetFinalStageUpgradeMode(); - default: - throw new ArgumentOutOfRangeException("stage"); - } - } - - private StoredDomainModel GetStoredDomainModel(DomainModel domainModel) - { - var storedDomainModel = domainModel.ToStoredModel(); - storedDomainModel.UpdateReferences(); - // Since we support storage nodes, stored domain model and real model of a node - // must be synchronized. So we must update types' mappings - storedDomainModel.UpdateMappings(context.NodeConfiguration); - return storedDomainModel; - } - - // Constructors - - private UpgradingDomainBuilder(UpgradeContext context) - { - this.context = context; - - upgradeMode = context.UpgradeMode; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.04.23 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.IoC; +using Xtensive.Modelling.Comparison; +using Xtensive.Modelling.Comparison.Hints; +using Xtensive.Orm.Building.Builders; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Logging; +using Xtensive.Orm.Model; +using Xtensive.Orm.Model.Stored; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Upgrade.Internals; +using Xtensive.Orm.Upgrade.Internals.Interfaces; +using Xtensive.Orm.Upgrade.Model; +using Xtensive.Reflection; +using Xtensive.Sql; +using Xtensive.Sql.Info; + +namespace Xtensive.Orm.Upgrade +{ + internal sealed class UpgradingDomainBuilder + { + private readonly UpgradeContext context; + private readonly DomainUpgradeMode upgradeMode; + + private DefaultSchemaInfo defaultSchemaInfo; + private FutureResult workerResult; + + public static Domain Build(DomainConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + + if (configuration.ConnectionInfo==null) + throw new ArgumentException(Strings.ExConnectionInfoIsMissing, "configuration"); + + if (!configuration.IsLocked) + configuration.Lock(); + + LogManager.Default.AutoInitialize(); + + var context = new UpgradeContext(configuration); + + using (context.Activate()) + using (context.Services) { + return new UpgradingDomainBuilder(context).Run(); + } + } + + public static StorageNode BuildNode(Domain parentDomain, NodeConfiguration nodeConfiguration) + { + ArgumentValidator.EnsureArgumentNotNull(parentDomain, "parentDomain"); + ArgumentValidator.EnsureArgumentNotNull(nodeConfiguration, "nodeConfiguration"); + + nodeConfiguration.Validate(parentDomain.Configuration); + if (!nodeConfiguration.IsLocked) + nodeConfiguration.Lock(); + + var context = new UpgradeContext(parentDomain, nodeConfiguration); + + using (context.Activate()) + using (context.Services) { + new UpgradingDomainBuilder(context).Run(); + return context.StorageNode; + } + } + + private Domain Run() + { + BuildServices(); + OnPrepare(); + + var domain = upgradeMode.IsMultistage() ? BuildMultistageDomain() : BuildSingleStageDomain(); + + OnComplete(domain); + CompleteUpgradeTransaction(); + context.Services.ClearTemporaryResources(); + + return domain; + } + + private void CompleteUpgradeTransaction() + { + var connection = context.Services.Connection; + var driver = context.Services.StorageDriver; + + if (connection.ActiveTransaction==null) + return; + + try { + driver.CommitTransaction(null, connection); + } + catch { + driver.RollbackTransaction(null, connection); + throw; + } + } + + private FutureResult CreateResult(T value) + { + return new ValueFutureResult(value); + } + + private FutureResult CreateResult(Func action) + { + if (context.Configuration.BuildInParallel) + return new AsyncFutureResult(action, UpgradeLog.Instance); + return new SynchronousFutureResult(action); + } + + private Domain BuildMultistageDomain() + { + Domain finalDomain; + using (StartSqlWorker()) { + var finalDomainResult = context.ParentDomain!=null + ? CreateResult(context.ParentDomain) + : CreateResult(CreateBuilder(UpgradeStage.Final)); + using (finalDomainResult) { + OnConfigureUpgradeDomain(); + using (var upgradeDomain = CreateBuilder(UpgradeStage.Upgrading).Invoke()) { + CompleteSqlWorker(); + PerformUpgrade(upgradeDomain, UpgradeStage.Upgrading); + } + finalDomain = finalDomainResult.Get(); + } + } + PerformUpgrade(finalDomain, UpgradeStage.Final); + return finalDomain; + } + + private Domain BuildSingleStageDomain() + { + using (StartSqlWorker()) { + var domain = context.ParentDomain ?? CreateBuilder(UpgradeStage.Final).Invoke(); + CompleteSqlWorker(); + PerformUpgrade(domain, UpgradeStage.Final); + return domain; + } + } + + private void BuildServices() + { + var services = context.Services; + var configuration = context.Configuration; + + services.Configuration = configuration; + services.IndexFilterCompiler = new PartialIndexFilterCompiler(); + + if (context.ParentDomain==null) { + var descriptor = ProviderDescriptor.Get(configuration.ConnectionInfo.Provider); + var driverFactory = (SqlDriverFactory) Activator.CreateInstance(descriptor.DriverFactory); + var handlerFactory = (HandlerFactory) Activator.CreateInstance(descriptor.HandlerFactory); + var driver = StorageDriver.Create(driverFactory, configuration); + services.HandlerFactory = handlerFactory; + services.StorageDriver = driver; + services.NameBuilder = new NameBuilder(configuration, driver.ProviderInfo); + } + else { + var handlers = context.ParentDomain.Handlers; + services.HandlerFactory = handlers.Factory; + services.StorageDriver = handlers.StorageDriver; + services.NameBuilder = handlers.NameBuilder; + } + + CreateConnection(services); + context.DefaultSchemaInfo = defaultSchemaInfo = services.StorageDriver.GetDefaultSchema(services.Connection); + services.MappingResolver = MappingResolver.Create(configuration, context.NodeConfiguration, defaultSchemaInfo); + BuildExternalServices(services, configuration); + services.Lock(); + + context.TypeIdProvider = new TypeIdProvider(context); + } + + private void CreateConnection(UpgradeServiceAccessor serviceAccessor) + { + var driver = serviceAccessor.StorageDriver; + var connection = driver.CreateConnection(null); + + driver.ApplyNodeConfiguration(connection, context.NodeConfiguration); + + try { + driver.OpenConnection(null, connection); + driver.BeginTransaction(null, connection, null); + } + catch { + connection.Dispose(); + throw; + } + + if (driver.ProviderInfo.Supports(ProviderFeatures.SingleConnection)) + serviceAccessor.RegisterTemporaryResource(connection); + else + serviceAccessor.RegisterResource(connection); + + serviceAccessor.Connection = connection; + } + + private void BuildExternalServices(UpgradeServiceAccessor serviceAccessor, DomainConfiguration configuration) + { + var standardRegistrations = new[] { + new ServiceRegistration(typeof (DomainConfiguration), configuration), + new ServiceRegistration(typeof (UpgradeContext), context) + }; + + var modules = configuration.Types.Modules + .Select(type => new ServiceRegistration(typeof (IModule), type, false)); + var handlers = configuration.Types.UpgradeHandlers + .Select(type => new ServiceRegistration(typeof (IUpgradeHandler), type, false)); + var ftCatalogResolvers = configuration.Types.FullTextCatalogResolvers + .Select(type => new ServiceRegistration(typeof (IFullTextCatalogNameBuilder), type, false)); + + var registrations = standardRegistrations.Concat(modules).Concat(handlers).Concat(ftCatalogResolvers); + var serviceContainer = new ServiceContainer(registrations); + serviceAccessor.RegisterResource(serviceContainer); + + BuildModules(serviceAccessor, serviceContainer); + BuildUpgradeHandlers(serviceAccessor, serviceContainer); + BuildFullTextCatalogResolver(serviceAccessor, serviceContainer); + } + + private static void BuildModules(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) + { + serviceAccessor.Modules = new ReadOnlyList(serviceContainer.GetAll().ToList()); + } + + private static void BuildUpgradeHandlers(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) + { + // Getting user handlers + var userHandlers = + from handler in serviceContainer.GetAll() + let assembly = handler.Assembly ?? handler.GetType().Assembly + where handler.IsEnabled + group handler by assembly; + + // Adding user handlers + var handlers = new Dictionary(); + foreach (var group in userHandlers) { + var candidates = group.ToList(); + if (candidates.Count > 1) { + throw new DomainBuilderException( + string.Format(Strings.ExMoreThanOneEnabledXIsProvidedForAssemblyY, typeof (IUpgradeHandler).GetShortName(), @group.Key)); + } + handlers.Add(group.Key, candidates[0]); + } + + // Adding default handlers + var assembliesWithUserHandlers = handlers.Select(pair => pair.Key); + var assembliesWithoutUserHandler = + serviceAccessor.Configuration.Types.PersistentTypes + .Select(type => type.Assembly) + .Distinct() + .Except(assembliesWithUserHandlers); + + foreach (var assembly in assembliesWithoutUserHandler) { + var handler = new UpgradeHandler(assembly); + handlers.Add(assembly, handler); + } + + // Building a list of handlers sorted by dependencies of their assemblies + var dependencies = handlers.Keys.ToDictionary( + assembly => assembly, + assembly => assembly.GetReferencedAssemblies().Select(assemblyName => assemblyName.ToString()).ToHashSet()); + var sortedHandlers = handlers + .SortTopologically((a0, a1) => dependencies[a1.Key].Contains(a0.Key.GetName().ToString())) + .Select(pair => pair.Value); + + // Storing the result + serviceAccessor.UpgradeHandlers = + new ReadOnlyDictionary(handlers); + serviceAccessor.OrderedUpgradeHandlers = + new ReadOnlyList(sortedHandlers.ToList()); + } + + private static void BuildFullTextCatalogResolver(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer) + { + //Getting user resolvers + var candidates = from r in serviceContainer.GetAll() + let assembly = r.GetType().Assembly + where r.IsEnabled && assembly!=typeof (IFullTextCatalogNameBuilder).Assembly + select r; + + var userResolversCount = candidates.Count(); + if (userResolversCount > 1) + throw new DomainBuilderException(string.Format(Strings.ExMoreThanOneEnabledXIsProvided, typeof (IFullTextCatalogNameBuilder).GetShortName())); + + var resolver = (userResolversCount==0) + ? new FullTextCatalogNameBuilder() + : candidates.First(); + + //storing sesolver + serviceAccessor.FulltextCatalogNameBuilder = resolver; + } + + /// context.Stage is out of range. + private void PerformUpgrade(Domain domain, UpgradeStage stage) + { + context.Stage = stage; + + OnBeforeStage(); + + using (var session = domain.OpenSession(SessionType.System)) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + var upgrader = new SchemaUpgrader(context, session); + var extractor = new SchemaExtractor(context, session); + SynchronizeSchema(domain, upgrader, extractor, GetUpgradeMode(stage)); + var storageNode = BuildStorageNode(domain, extractor); + session.SetStorageNode(storageNode); + OnStage(session); + transaction.Complete(); + } + } + + private StorageNode BuildStorageNode(Domain domain, SchemaExtractor extractor) + { + var schemaExtractionResult = GetRealExtractionResult(extractor.GetSqlSchema()); + context.ExtractedSqlModelCache = schemaExtractionResult; + + var modelMapping = ModelMappingBuilder.Build( + domain.Handlers, schemaExtractionResult, + context.Services.MappingResolver, context.NodeConfiguration, context.UpgradeMode.IsLegacy()); + var result = new StorageNode(context.NodeConfiguration, modelMapping, new TypeIdRegistry()); + + // Register default storage node immediately, + // non-default nodes are registered in NodeManager after everything completes successfully. + if (result.Id==WellKnown.DefaultNodeId) + domain.Handlers.StorageNodeRegistry.Add(result); + + context.StorageNode = result; + return result; + } + + private SchemaExtractionResult GetRealExtractionResult(SchemaExtractionResult baseSchemaExtractionResult) + { + if (!context.Configuration.ShareStorageSchemaOverNodes) + return baseSchemaExtractionResult; + // Skip mode is a special case. Real extraction result is generated by + // a builder in the SynchronizeSchema() method. + if (context.NodeConfiguration.UpgradeMode == DomainUpgradeMode.Skip) + return baseSchemaExtractionResult; + + //for default node + if (context.ParentDomain == null) { + if (context.Stage==UpgradeStage.Final) + return baseSchemaExtractionResult.MakeShared(); + return baseSchemaExtractionResult; + } + //for additional nodes + if (context.Stage==UpgradeStage.Final) { + var schemaExtractionResult = new SchemaExtractionResult(); + var defaultNode = context.ParentDomain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId); + defaultNode.Mapping.GetAllSchemaNodes() + .Select(node => node.Schema.Catalog) + .Distinct() + .ForEach(schemaExtractionResult.Catalogs.Add); + return schemaExtractionResult.MakeShared(); + } + return baseSchemaExtractionResult; + } + + private Func CreateBuilder(UpgradeStage stage) + { + var configuration = new DomainBuilderConfiguration { + DomainConfiguration = context.Configuration, + Stage = stage, + Services = context.Services, + ModelFilter = new StageModelFilter(context.UpgradeHandlers, stage), + UpgradeContextCookie = context.Cookie, + RecycledDefinitions = context.RecycledDefinitions, + DefaultSchemaInfo = defaultSchemaInfo + }; + + configuration.Lock(); + Func builder = DomainBuilder.Run; + return builder.Bind(configuration); + } + + //private HintSet GetSchemaHints(StorageModel extractedSchema, StorageModel targetSchema) + //{ + // context.SchemaHints = new HintSet(extractedSchema, targetSchema); + // if (context.Stage==UpgradeStage.Upgrading) + // BuildSchemaHints(extractedSchema); + // return context.SchemaHints; + //} + + private void BuildSchemaHints(StorageModel extractedSchema, UpgradeHintsProcessingResult result, StoredDomainModel currentDomainModel) + { + var oldModel = context.ExtractedDomainModel; + if (oldModel==null) + return; + var handlers = Domain.Demand().Handlers; + // It's important to use same StoredDomainModel of current domain + // in both UpgradeHintsProcessor and HintGenerator instances. + var hintGenerator = new HintGenerator(result.TypeMapping, result.ReverseTypeMapping, result.FieldMapping, result.Hints, handlers, context.Services.MappingResolver, extractedSchema, currentDomainModel, oldModel); + var hints = hintGenerator.Run(); + context.UpgradedTypesMapping = hints.UpgradedTypesMapping; + context.Hints.Clear(); + foreach (var modelHint in hints.ModelHints) + context.Hints.Add(modelHint); + foreach (var schemaHint in hints.SchemaHints) { + try { + context.SchemaHints.Add(schemaHint); + } + catch (Exception error) { + UpgradeLog.Warning(Strings.LogFailedToAddSchemaHintXErrorY, schemaHint, error); + } + } + } + + private void SynchronizeSchema( + Domain domain, SchemaUpgrader upgrader, SchemaExtractor extractor, SchemaUpgradeMode schemaUpgradeMode) + { + using (UpgradeLog.InfoRegion(Strings.LogSynchronizingSchemaInXMode, schemaUpgradeMode)) { + StorageModel targetSchema = null; + if (schemaUpgradeMode==SchemaUpgradeMode.Skip) { + if (context.ParentDomain==null) { + //If we build main domain we should log target model. + //Log of Storage Node target model is not necessary + //because storage target model exactly the same. + targetSchema = GetTargetModel(domain); + context.TargetStorageModel = targetSchema; + if (UpgradeLog.IsLogged(LogLevel.Info)) { + UpgradeLog.Info(Strings.LogTargetSchema); + targetSchema.Dump(); + } + } + var builder = ExtractedModelBuilderFactory.GetBuilder(context); + context.ExtractedSqlModelCache = builder.Run(); + OnSchemaReady(); + return; // Skipping comparison completely + } + + var extractedSchema = extractor.GetSchema(); + + // Hints + var triplet = BuildTargetModelAndHints(extractedSchema); + var hintProcessingResult = triplet.Third; + targetSchema = triplet.First; + context.TargetStorageModel = targetSchema; + var hints = triplet.Second; + if (UpgradeLog.IsLogged(LogLevel.Info)) + { + UpgradeLog.Info(Strings.LogExtractedSchema); + extractedSchema.Dump(); + UpgradeLog.Info(Strings.LogTargetSchema); + targetSchema.Dump(); + } + OnSchemaReady(); + + var breifExceptionFormat = domain.Configuration.SchemaSyncExceptionFormat==SchemaSyncExceptionFormat.Brief; + var result = SchemaComparer.Compare(extractedSchema, targetSchema, + hints, context.Hints, schemaUpgradeMode, domain.Model, breifExceptionFormat, context.Stage); + var shouldDumpSchema = !schemaUpgradeMode.In( + SchemaUpgradeMode.Skip, SchemaUpgradeMode.ValidateCompatible, SchemaUpgradeMode.Recreate); + if (shouldDumpSchema && UpgradeLog.IsLogged(LogLevel.Info)) + UpgradeLog.Info(result.ToString()); + + if (UpgradeLog.IsLogged(LogLevel.Info)) + UpgradeLog.Info(Strings.LogComparisonResultX, result); + + context.SchemaDifference = (NodeDifference) result.Difference; + context.SchemaUpgradeActions = result.UpgradeActions; + + switch (schemaUpgradeMode) { + case SchemaUpgradeMode.ValidateExact: + if (result.SchemaComparisonStatus!=SchemaComparisonStatus.Equal || result.HasColumnTypeChanges) + throw new SchemaSynchronizationException(result); + if (!hintProcessingResult.AreAllTypesMapped() && hintProcessingResult.SuspiciousTypes.Any()) + throw new SchemaSynchronizationException(Strings.ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet); + break; + case SchemaUpgradeMode.ValidateCompatible: + if (result.SchemaComparisonStatus!=SchemaComparisonStatus.Equal + && result.SchemaComparisonStatus!=SchemaComparisonStatus.TargetIsSubset) + throw new SchemaSynchronizationException(result); + break; + case SchemaUpgradeMode.PerformSafely: + if (result.HasUnsafeActions) + throw new SchemaSynchronizationException(result); + goto case SchemaUpgradeMode.Perform; + case SchemaUpgradeMode.Recreate: + case SchemaUpgradeMode.Perform: + upgrader.UpgradeSchema(extractor.GetSqlSchema(), extractedSchema, targetSchema, result.UpgradeActions); + if (result.UpgradeActions.Any()) + extractor.ClearCache(); + break; + case SchemaUpgradeMode.ValidateLegacy: + if (result.IsCompatibleInLegacyMode!=true) + throw new SchemaSynchronizationException(result); + break; + default: + throw new ArgumentOutOfRangeException("schemaUpgradeMode"); + } + } + } + + private Triplet BuildTargetModelAndHints(StorageModel extractedSchema) + { + var handlers = Domain.Demand().Handlers; + var currentDomainModel = GetStoredDomainModel(handlers.Domain.Model); + var hintProcessor = GetHintProcessor(currentDomainModel, extractedSchema, handlers); + var processedInfo = hintProcessor.Process(context.Hints); + var targetModel = GetTargetModel(handlers.Domain, processedInfo.ReverseFieldMapping, processedInfo.CurrentModelTypes, extractedSchema); + context.SchemaHints = new HintSet(extractedSchema, targetModel); + if (context.Stage == UpgradeStage.Upgrading) + BuildSchemaHints(extractedSchema, processedInfo, currentDomainModel); + return new Triplet(targetModel, context.SchemaHints, processedInfo); + } + + + private void OnConfigureUpgradeDomain() + { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnConfigureUpgradeDomain(); + } + + private void OnSchemaReady() + { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnSchemaReady(); + } + + private void OnPrepare() + { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnPrepare(); + } + + private IDisposable StartSqlWorker() + { + var result = CreateResult(SqlWorker.Create(context.Services, upgradeMode.GetSqlWorkerTask())); + workerResult = result; + return result; + } + + private void CompleteSqlWorker() + { + if (!workerResult.IsAvailable) + return; + var result = workerResult.Get(); + context.Metadata = result.Metadata; + if (result.Schema!=null) + context.ExtractedSqlModelCache = result.Schema; + } + + private void OnBeforeStage() + { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnBeforeStage(); + } + + private void OnStage(Session session) + { + context.Session = session; + try { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnStage(); + } + finally { + context.Session = null; + } + } + + private void OnComplete(Domain domain) + { + foreach (var handler in context.OrderedUpgradeHandlers) + handler.OnComplete(domain); + + foreach (var module in context.Modules) + module.OnBuilt(domain); + } + + private StorageModel GetTargetModel(Domain domain) + { + return GetTargetModel(domain, new Dictionary(), new Dictionary(), null); + } + + private StorageModel GetTargetModel(Domain domain, Dictionary fieldMapping, Dictionary currentTypes, StorageModel extractedModel) + { + var indexFilterCompiler = context.Services.IndexFilterCompiler; + var fullTextCatalogResolver = context.Services.FulltextCatalogNameBuilder; + var mappingResolver = context.Services.MappingResolver; + var converter = new DomainModelConverter(domain.Handlers, context.TypeIdProvider, indexFilterCompiler, mappingResolver, fullTextCatalogResolver, context.Stage==UpgradeStage.Upgrading) { + BuildForeignKeys = context.Configuration.Supports(ForeignKeyMode.Reference), + BuildHierarchyForeignKeys = context.Configuration.Supports(ForeignKeyMode.Hierarchy), + FieldMapping = fieldMapping, + CurrentModelTypes = currentTypes, + StorageModel = extractedModel + }; + return converter.Run(); + } + + private IUpgradeHintsProcessor GetHintProcessor(StoredDomainModel currentDomainModel, StorageModel extractedSchema, HandlerAccessor handlers) + { + var oldModel = context.ExtractedDomainModel; + var stage = context.Stage; + + if (stage==UpgradeStage.Upgrading && oldModel!=null) + return new UpgradeHintsProcessor(handlers, context.Services.MappingResolver, currentDomainModel, oldModel, extractedSchema, context.TypesMovementsAutoDetection); + if (context.UpgradeMode==DomainUpgradeMode.Validate && oldModel!=null) + return new UpgradeHintsProcessor(handlers, context.Services.MappingResolver, currentDomainModel, oldModel, extractedSchema, false); + return new NullUpgradeHintsProcessor(currentDomainModel); + } + + private SchemaUpgradeMode GetUpgradeMode(UpgradeStage stage) + { + switch (stage) { + case UpgradeStage.Upgrading: + return upgradeMode.GetUpgradingStageUpgradeMode(); + case UpgradeStage.Final: + return upgradeMode.GetFinalStageUpgradeMode(); + default: + throw new ArgumentOutOfRangeException("stage"); + } + } + + private StoredDomainModel GetStoredDomainModel(DomainModel domainModel) + { + var storedDomainModel = domainModel.ToStoredModel(); + storedDomainModel.UpdateReferences(); + // Since we support storage nodes, stored domain model and real model of a node + // must be synchronized. So we must update types' mappings + storedDomainModel.UpdateMappings(context.NodeConfiguration); + return storedDomainModel; + } + + // Constructors + + private UpgradingDomainBuilder(UpgradeContext context) + { + this.context = context; + + upgradeMode = context.UpgradeMode; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/UrlInfo.cs b/Orm/Xtensive.Orm/Orm/UrlInfo.cs index dad56d8a8d..5133a2f55d 100644 --- a/Orm/Xtensive.Orm/Orm/UrlInfo.cs +++ b/Orm/Xtensive.Orm/Orm/UrlInfo.cs @@ -1,465 +1,465 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2007.06.08 - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Runtime.Serialization; -using System.Security; -using System.Security.Permissions; -using System.Text; -using System.Text.RegularExpressions; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Comparison; - - -namespace Xtensive.Orm -{ - /// - /// Holds an URL and provides easy access to its different parts. - /// - /// - /// - /// The common URL format that would be converted - /// to the can be represented - /// in the BNF form as following: - /// - /// url ::= protocol://[user[:password]@]host[:port]/resource[?parameters] - /// protocol ::= alphanumx[protocol] - /// user ::= alphanumx[user] - /// password ::= alphanumx[password] - /// host ::= hostname | hostnum - /// port ::= digits - /// resource ::= name - /// parameters ::= parameter[&parameter] - /// - /// hostname ::= name[.hostname] - /// hostnum ::= digits.digits.digits.digits - /// - /// parameter ::= name=[name] - /// - /// name ::= alpanumx[name] - /// - /// digits ::= digit[digits] - /// alphanumx ::= alphanum | escape | $ | - | _ | . | + | ! | * | " | ' | ( | ) | , | ; | # | space - /// alphanum ::= alpha | digit - /// escape ::= % hex hex - /// hex ::= digit | a | b | c | d | e | f | A | B | C | D | E | F - /// digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 - /// alpha ::= /* represents any unicode alpa character */ - /// - /// - /// - /// This not fully precise notation because it slightly simplified to be shorter. - /// But it almost completely reflects URL parser - /// capabilities. - /// - /// - /// Here you can see several valid URL samples: - ///
-  /// tcp://localhost/
-  /// tcp://server:40000/myResource
-  /// tcp://admin:admin@localhost:40000/myResource?askTimeout=60
-  /// 
- ///
- ///
- [Serializable] - [DebuggerDisplay("{url}")] - [TypeConverter(typeof(UrlInfoConverter))] - public class UrlInfo : - IEquatable, - IComparable, - ISerializable - { - private static readonly Regex Pattern = new Regex( - @"^(?'proto'[^:]*)://" + - @"((?'username'[^:@]*)" + - @"(:(?'password'[^@]*))?@)?" + - @"(?'host'[^:/]*)" + - @"(:(?'port'\d+))?" + - @"/(?'resource'[^?]*)?" + - @"(\?(?'params'.*))?", - RegexOptions.Compiled|RegexOptions.Singleline); - - private string url = string.Empty; - private string protocol = string.Empty; - private string host = string.Empty; - private int port; - private string resource = string.Empty; - private string user = string.Empty; - private string password = string.Empty; - private ReadOnlyDictionary parameters; - - #region Properties: Url, Protocol, Host, etc... - - /// - /// Gets an URL this instance describes. - /// - public string Url - { - [DebuggerStepThrough] - get { return url; } - } - - /// - /// Gets the protocol part of the current - /// (e.g. "tcp" is the protocol part of the "tcp://admin:password@localhost/resource" URL). - /// - public string Protocol - { - [DebuggerStepThrough] - get { return protocol; } - } - - /// - /// Gets the host part of the current - /// (e.g. "localhost" is the host part of the "tcp://admin:password@localhost/resource" URL). - /// - public string Host - { - [DebuggerStepThrough] - get { return host; } - } - - /// - /// Gets the port part of the current - /// (e.g. 40000 is the port part of the "tcp://admin:password@localhost:40000/resource" URL). - /// - public int Port - { - [DebuggerStepThrough] - get { return port; } - } - - /// - /// Gets the resource name part of the current - /// (e.g. "resource" is the resource name part of the "tcp://admin:password@localhost/resource" URL). - /// - public string Resource - { - [DebuggerStepThrough] - get { return resource; } - } - - /// - /// Gets the user name part of the current - /// (e.g. "admin" is the user name part of the "tcp://admin:password@localhost/resource" URL). - /// - public string User - { - [DebuggerStepThrough] - get { return user; } - } - - /// - /// Gets the password part of the current - /// (e.g. "password" is the password part of the "tcp://admin:password@localhost/resource" URL). - /// - public string Password - { - [DebuggerStepThrough] - get { return password; } - } - - /// - /// Gets additional parameters of the current - /// (e.g. "param1=value1&param2=value2" is the additional parameters part - /// of the "tcp://admin:password@localhost/resource?param1=value1&param2=value2" URL). - /// - /// - /// The mentioned part of the is parsed - /// and represented in a form. - /// - public ReadOnlyDictionary Params - { - [DebuggerStepThrough] - get { return parameters; } - } - - #endregion - - /// - /// Splits URL into parts (protocol, host, port, resource, user, password) and set all - /// derived values to the corresponding properties of the instance. - /// - /// URL to split - /// - /// The expected URL format is as the following: - /// proto://[[user[:password]@]host[:port]]/resource. - /// Note that the empty URL will cause an exception. - /// - /// Specified is invalid (cannot be parsed). - public static UrlInfo Parse(string url) - { - var result = new UrlInfo(); - Parse(url, result); - return result; - } - - private static void Parse(string url, UrlInfo info) - { - try { - string tUrl = url; - if (tUrl.Length==0) - tUrl = ":///"; - - var result = Pattern.Match(tUrl); - if (!result.Success) - throw Exceptions.InvalidUrl(url, "url"); - - int @port = 0; - - if (result.Result("${port}").Length!=0) - @port = int.Parse(result.Result("${port}")); - if (@port<0 || @port>65535) - throw Exceptions.InvalidUrl(url, "port"); - - string tParams = result.Result("${params}"); - string[] aParams = tParams.Split('&'); - var @params = new Dictionary(); - if (tParams!=string.Empty) { - foreach (string sPair in aParams) { - string[] aNameValue = sPair.Split(new char[] {'='}, 2); - if (aNameValue.Length!=2) - throw Exceptions.InvalidUrl(url, "parameters"); - @params.Add(UrlDecode(aNameValue[0]), UrlDecode(aNameValue[1])); - } - } - - info.url = url; - info.user = UrlDecode(result.Result("${username}")); - info.password = UrlDecode(result.Result("${password}")); - info.resource = UrlDecode(result.Result("${resource}")); - info.host = UrlDecode(result.Result("${host}")); - info.protocol = UrlDecode(result.Result("${proto}")); - info.port = @port; - info.parameters = new ReadOnlyDictionary(@params); - } - catch (Exception e) { - if (e is ArgumentException || e is InvalidOperationException) - throw; - else - throw Exceptions.InvalidUrl(url, "url"); - } - } - - #region Nested type: UrlDecoder - - private class UrlDecoder - { - // Fields - private int m_bufferSize; - private byte[] m_byteBuffer; - private char[] m_charBuffer; - private Encoding m_encoding; - private int m_numBytes; - private int m_numChars; - - // Methods - internal UrlDecoder(int bufferSize, Encoding encoding) - { - m_bufferSize = bufferSize; - m_encoding = encoding; - m_charBuffer = new char[bufferSize]; - } - - internal void AddByte(byte b) - { - if (m_byteBuffer==null) - m_byteBuffer = new byte[m_bufferSize]; - m_byteBuffer[m_numBytes++] = b; - } - - internal void AddChar(char ch) - { - if (m_numBytes>0) - FlushBytes(); - m_charBuffer[m_numChars++] = ch; - } - - private void FlushBytes() - { - if (m_numBytes>0) { - m_numChars += m_encoding.GetChars(m_byteBuffer, 0, m_numBytes, m_charBuffer, m_numChars); - m_numBytes = 0; - } - } - - internal string GetString() - { - if (m_numBytes>0) - FlushBytes(); - if (m_numChars>0) - return new string(m_charBuffer, 0, m_numChars); - return string.Empty; - } - } - - #endregion - - #region Private \ internal methods - - private static string UrlDecode(string str) - { - return UrlDecode(str, Encoding.UTF8); - } - - private static string UrlDecode(string s, Encoding e) - { - int len = s.Length; - UrlDecoder decoder = new UrlDecoder(len, e); - for (int i = 0; i=0 && num8>=0) { - byte num9 = (byte)((num7 << 4)|num8); - i += 2; - decoder.AddByte(num9); - continue; - } - } - loc_1: - if ((c&0xff80)=='\0') - decoder.AddByte((byte)c); - else - decoder.AddChar(c); - } - return decoder.GetString().Trim(); - } - - private static int HexToInt(char h) - { - if (h>='0' && h<='9') - return h-'0'; - if (h<'a' || h>'f') { - if (h>='A' && h<='F') - return h-'A'+'\n'; - return -1; - } - return h-'a'+'\n'; - } - - #endregion - - #region IComparable<...>, IEquatable<...> methods - - /// - public bool Equals(UrlInfo other) - { - return AdvancedComparerStruct.System.Equals(url, other.url); - } - - /// - public int CompareTo(UrlInfo other) - { - return AdvancedComparerStruct.System.Compare(url, other.url); - } - - #endregion - - #region Equals, GetHashCode, ==, != - - /// - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - if (obj.GetType()!=typeof (UrlInfo)) - return false; - return Equals((UrlInfo) obj); - } - - /// - public override int GetHashCode() - { - return (url!=null ? url.GetHashCode() : 0); - } - - /// - /// Checks specified objects for equality. - /// - /// - /// - /// - public static bool operator ==(UrlInfo left, UrlInfo right) - { - return Equals(left, right); - } - - /// - /// Checks specified objects for inequality. - /// - /// - /// - /// - public static bool operator !=(UrlInfo left, UrlInfo right) - { - return !Equals(left, right); - } - - #endregion - - /// - public override string ToString() - { - return url; - } - - - // Constructors - - private UrlInfo() - { - } - - #region ISerializable members, deserializing constructor - - /// - /// Deserilizing constructor. - /// - /// The source (see ) for this deserialization. - /// The to populate the data from. - protected UrlInfo(SerializationInfo info, StreamingContext context) - { - Parse(info.GetString("Url"), this); - } - - /// - /// Populates a with the data needed to serialize the target object. - /// - /// The destination (see ) for this serialization. - /// The to populate with data. - /// The caller does not have the required permission. - [SecurityCritical] - public virtual void GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Url", url); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2007.06.08 + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.Serialization; +using System.Security; +using System.Security.Permissions; +using System.Text; +using System.Text.RegularExpressions; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Comparison; + + +namespace Xtensive.Orm +{ + /// + /// Holds an URL and provides easy access to its different parts. + /// + /// + /// + /// The common URL format that would be converted + /// to the can be represented + /// in the BNF form as following: + /// + /// url ::= protocol://[user[:password]@]host[:port]/resource[?parameters] + /// protocol ::= alphanumx[protocol] + /// user ::= alphanumx[user] + /// password ::= alphanumx[password] + /// host ::= hostname | hostnum + /// port ::= digits + /// resource ::= name + /// parameters ::= parameter[&parameter] + /// + /// hostname ::= name[.hostname] + /// hostnum ::= digits.digits.digits.digits + /// + /// parameter ::= name=[name] + /// + /// name ::= alpanumx[name] + /// + /// digits ::= digit[digits] + /// alphanumx ::= alphanum | escape | $ | - | _ | . | + | ! | * | " | ' | ( | ) | , | ; | # | space + /// alphanum ::= alpha | digit + /// escape ::= % hex hex + /// hex ::= digit | a | b | c | d | e | f | A | B | C | D | E | F + /// digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 + /// alpha ::= /* represents any unicode alpa character */ + /// + /// + /// + /// This not fully precise notation because it slightly simplified to be shorter. + /// But it almost completely reflects URL parser + /// capabilities. + /// + /// + /// Here you can see several valid URL samples: + ///
+  /// tcp://localhost/
+  /// tcp://server:40000/myResource
+  /// tcp://admin:admin@localhost:40000/myResource?askTimeout=60
+  /// 
+ ///
+ ///
+ [Serializable] + [DebuggerDisplay("{url}")] + [TypeConverter(typeof(UrlInfoConverter))] + public class UrlInfo : + IEquatable, + IComparable, + ISerializable + { + private static readonly Regex Pattern = new Regex( + @"^(?'proto'[^:]*)://" + + @"((?'username'[^:@]*)" + + @"(:(?'password'[^@]*))?@)?" + + @"(?'host'[^:/]*)" + + @"(:(?'port'\d+))?" + + @"/(?'resource'[^?]*)?" + + @"(\?(?'params'.*))?", + RegexOptions.Compiled|RegexOptions.Singleline); + + private string url = string.Empty; + private string protocol = string.Empty; + private string host = string.Empty; + private int port; + private string resource = string.Empty; + private string user = string.Empty; + private string password = string.Empty; + private ReadOnlyDictionary parameters; + + #region Properties: Url, Protocol, Host, etc... + + /// + /// Gets an URL this instance describes. + /// + public string Url + { + [DebuggerStepThrough] + get { return url; } + } + + /// + /// Gets the protocol part of the current + /// (e.g. "tcp" is the protocol part of the "tcp://admin:password@localhost/resource" URL). + /// + public string Protocol + { + [DebuggerStepThrough] + get { return protocol; } + } + + /// + /// Gets the host part of the current + /// (e.g. "localhost" is the host part of the "tcp://admin:password@localhost/resource" URL). + /// + public string Host + { + [DebuggerStepThrough] + get { return host; } + } + + /// + /// Gets the port part of the current + /// (e.g. 40000 is the port part of the "tcp://admin:password@localhost:40000/resource" URL). + /// + public int Port + { + [DebuggerStepThrough] + get { return port; } + } + + /// + /// Gets the resource name part of the current + /// (e.g. "resource" is the resource name part of the "tcp://admin:password@localhost/resource" URL). + /// + public string Resource + { + [DebuggerStepThrough] + get { return resource; } + } + + /// + /// Gets the user name part of the current + /// (e.g. "admin" is the user name part of the "tcp://admin:password@localhost/resource" URL). + /// + public string User + { + [DebuggerStepThrough] + get { return user; } + } + + /// + /// Gets the password part of the current + /// (e.g. "password" is the password part of the "tcp://admin:password@localhost/resource" URL). + /// + public string Password + { + [DebuggerStepThrough] + get { return password; } + } + + /// + /// Gets additional parameters of the current + /// (e.g. "param1=value1&param2=value2" is the additional parameters part + /// of the "tcp://admin:password@localhost/resource?param1=value1&param2=value2" URL). + /// + /// + /// The mentioned part of the is parsed + /// and represented in a form. + /// + public ReadOnlyDictionary Params + { + [DebuggerStepThrough] + get { return parameters; } + } + + #endregion + + /// + /// Splits URL into parts (protocol, host, port, resource, user, password) and set all + /// derived values to the corresponding properties of the instance. + /// + /// URL to split + /// + /// The expected URL format is as the following: + /// proto://[[user[:password]@]host[:port]]/resource. + /// Note that the empty URL will cause an exception. + /// + /// Specified is invalid (cannot be parsed). + public static UrlInfo Parse(string url) + { + var result = new UrlInfo(); + Parse(url, result); + return result; + } + + private static void Parse(string url, UrlInfo info) + { + try { + string tUrl = url; + if (tUrl.Length==0) + tUrl = ":///"; + + var result = Pattern.Match(tUrl); + if (!result.Success) + throw Exceptions.InvalidUrl(url, "url"); + + int @port = 0; + + if (result.Result("${port}").Length!=0) + @port = int.Parse(result.Result("${port}")); + if (@port<0 || @port>65535) + throw Exceptions.InvalidUrl(url, "port"); + + string tParams = result.Result("${params}"); + string[] aParams = tParams.Split('&'); + var @params = new Dictionary(); + if (tParams!=string.Empty) { + foreach (string sPair in aParams) { + string[] aNameValue = sPair.Split(new char[] {'='}, 2); + if (aNameValue.Length!=2) + throw Exceptions.InvalidUrl(url, "parameters"); + @params.Add(UrlDecode(aNameValue[0]), UrlDecode(aNameValue[1])); + } + } + + info.url = url; + info.user = UrlDecode(result.Result("${username}")); + info.password = UrlDecode(result.Result("${password}")); + info.resource = UrlDecode(result.Result("${resource}")); + info.host = UrlDecode(result.Result("${host}")); + info.protocol = UrlDecode(result.Result("${proto}")); + info.port = @port; + info.parameters = new ReadOnlyDictionary(@params); + } + catch (Exception e) { + if (e is ArgumentException || e is InvalidOperationException) + throw; + else + throw Exceptions.InvalidUrl(url, "url"); + } + } + + #region Nested type: UrlDecoder + + private class UrlDecoder + { + // Fields + private int m_bufferSize; + private byte[] m_byteBuffer; + private char[] m_charBuffer; + private Encoding m_encoding; + private int m_numBytes; + private int m_numChars; + + // Methods + internal UrlDecoder(int bufferSize, Encoding encoding) + { + m_bufferSize = bufferSize; + m_encoding = encoding; + m_charBuffer = new char[bufferSize]; + } + + internal void AddByte(byte b) + { + if (m_byteBuffer==null) + m_byteBuffer = new byte[m_bufferSize]; + m_byteBuffer[m_numBytes++] = b; + } + + internal void AddChar(char ch) + { + if (m_numBytes>0) + FlushBytes(); + m_charBuffer[m_numChars++] = ch; + } + + private void FlushBytes() + { + if (m_numBytes>0) { + m_numChars += m_encoding.GetChars(m_byteBuffer, 0, m_numBytes, m_charBuffer, m_numChars); + m_numBytes = 0; + } + } + + internal string GetString() + { + if (m_numBytes>0) + FlushBytes(); + if (m_numChars>0) + return new string(m_charBuffer, 0, m_numChars); + return string.Empty; + } + } + + #endregion + + #region Private \ internal methods + + private static string UrlDecode(string str) + { + return UrlDecode(str, Encoding.UTF8); + } + + private static string UrlDecode(string s, Encoding e) + { + int len = s.Length; + UrlDecoder decoder = new UrlDecoder(len, e); + for (int i = 0; i=0 && num8>=0) { + byte num9 = (byte)((num7 << 4)|num8); + i += 2; + decoder.AddByte(num9); + continue; + } + } + loc_1: + if ((c&0xff80)=='\0') + decoder.AddByte((byte)c); + else + decoder.AddChar(c); + } + return decoder.GetString().Trim(); + } + + private static int HexToInt(char h) + { + if (h>='0' && h<='9') + return h-'0'; + if (h<'a' || h>'f') { + if (h>='A' && h<='F') + return h-'A'+'\n'; + return -1; + } + return h-'a'+'\n'; + } + + #endregion + + #region IComparable<...>, IEquatable<...> methods + + /// + public bool Equals(UrlInfo other) + { + return AdvancedComparerStruct.System.Equals(url, other.url); + } + + /// + public int CompareTo(UrlInfo other) + { + return AdvancedComparerStruct.System.Compare(url, other.url); + } + + #endregion + + #region Equals, GetHashCode, ==, != + + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType()!=typeof (UrlInfo)) + return false; + return Equals((UrlInfo) obj); + } + + /// + public override int GetHashCode() + { + return (url!=null ? url.GetHashCode() : 0); + } + + /// + /// Checks specified objects for equality. + /// + /// + /// + /// + public static bool operator ==(UrlInfo left, UrlInfo right) + { + return Equals(left, right); + } + + /// + /// Checks specified objects for inequality. + /// + /// + /// + /// + public static bool operator !=(UrlInfo left, UrlInfo right) + { + return !Equals(left, right); + } + + #endregion + + /// + public override string ToString() + { + return url; + } + + + // Constructors + + private UrlInfo() + { + } + + #region ISerializable members, deserializing constructor + + /// + /// Deserilizing constructor. + /// + /// The source (see ) for this deserialization. + /// The to populate the data from. + protected UrlInfo(SerializationInfo info, StreamingContext context) + { + Parse(info.GetString("Url"), this); + } + + /// + /// Populates a with the data needed to serialize the target object. + /// + /// The destination (see ) for this serialization. + /// The to populate with data. + /// The caller does not have the required permission. + [SecurityCritical] + public virtual void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("Url", url); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/UrlInfoConverter.cs b/Orm/Xtensive.Orm/Orm/UrlInfoConverter.cs index 8e29675c45..6b458ee63d 100644 --- a/Orm/Xtensive.Orm/Orm/UrlInfoConverter.cs +++ b/Orm/Xtensive.Orm/Orm/UrlInfoConverter.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2008.08.07 - -using System.ComponentModel; - -namespace Xtensive.Orm -{ - /// - /// Provides a type converter to convert objects to and from other representations. - /// - public class UrlInfoConverter : TypeConverter - { - /// - public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) - { - return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType)); - } - - /// - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) - { - if (value is string) { - return UrlInfo.Parse((string) value); - } - return base.ConvertFrom(context, culture, value); - } - - /// - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) - { - if (destinationType == typeof(string)) { - return ((UrlInfo) value).Url; - } - return base.ConvertTo(context, culture, value, destinationType); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2008.08.07 + +using System.ComponentModel; + +namespace Xtensive.Orm +{ + /// + /// Provides a type converter to convert objects to and from other representations. + /// + public class UrlInfoConverter : TypeConverter + { + /// + public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) + { + return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType)); + } + + /// + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value is string) { + return UrlInfo.Parse((string) value); + } + return base.ConvertFrom(context, culture, value); + } + + /// + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) + { + if (destinationType == typeof(string)) { + return ((UrlInfo) value).Url; + } + return base.ConvertTo(context, culture, value, destinationType); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/EmailConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/EmailConstraint.cs index 66fec143c1..c9e768288a 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/EmailConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/EmailConstraint.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; -using System.Text.RegularExpressions; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures that email address is in correct format. - /// - public sealed class EmailConstraint : PropertyValidator - { - private const string EmailPattern = @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"; - - private static readonly Regex Validator = new Regex(EmailPattern); - - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - - if (field.ValueType!=typeof (string)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var value = (string) fieldValue; - var isValid = string.IsNullOrEmpty(value) || Validator.IsMatch(value); - return isValid ? Success() : Error(Strings.ValueShouldBeAValidEMail, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new EmailConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; +using System.Text.RegularExpressions; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures that email address is in correct format. + /// + public sealed class EmailConstraint : PropertyValidator + { + private const string EmailPattern = @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"; + + private static readonly Regex Validator = new Regex(EmailPattern); + + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + + if (field.ValueType!=typeof (string)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var value = (string) fieldValue; + var isValid = string.IsNullOrEmpty(value) || Validator.IsMatch(value); + return isValid ? Success() : Error(Strings.ValueShouldBeAValidEMail, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new EmailConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/FutureConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/FutureConstraint.cs index 18d7c507fc..b314862299 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/FutureConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/FutureConstraint.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures that date value is in the future. - /// - public sealed class FutureConstraint : PropertyValidator - { - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - - var valueType = field.ValueType; - if (valueType!=typeof (DateTime) && valueType!=typeof (DateTime?)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (DateTime).FullName)); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var isValid = fieldValue==null || (DateTime) fieldValue > DateTime.Now; - return isValid ? Success() : Error(Strings.ValueShouldBeInTheFuture, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new FutureConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures that date value is in the future. + /// + public sealed class FutureConstraint : PropertyValidator + { + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + + var valueType = field.ValueType; + if (valueType!=typeof (DateTime) && valueType!=typeof (DateTime?)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (DateTime).FullName)); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var isValid = fieldValue==null || (DateTime) fieldValue > DateTime.Now; + return isValid ? Success() : Error(Strings.ValueShouldBeInTheFuture, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new FutureConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/LengthConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/LengthConstraint.cs index b851e72499..e88f0403c6 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/LengthConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/LengthConstraint.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2008.07.25 - -using System; -using System.Collections; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures field length (or item count) fits in specified range. - /// - public sealed class LengthConstraint : PropertyValidator - { - /// - /// Gets or sets the minimal allowed length. Default is 0. - /// - public int Min { get; set; } - - /// - /// Gets or sets the maximal allowed length. Default is . - /// - public int Max { get; set; } - - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - if (field.ValueType!=typeof (string) && typeof (ICollection).IsAssignableFrom(field.ValueType)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); - if (Max==int.MaxValue && Min==0) - ThrowConfigurationError(Strings.MaxOrMinPropertyShouldBeSpecified); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - if (fieldValue==null) - return Success(); - - int length; - - if (fieldValue is string) - length = ((string) fieldValue).Length; - else - length = ((ICollection) fieldValue).Count; - - if (length >= Min && length <= Max) - return Success(); - - if (Min==0) - return Error(string.Format(Strings.ValueLengthCanNotBeGreaterThanX, Max), fieldValue); - - if (Max==int.MaxValue) - return Error(string.Format(Strings.ValueLengthCanNotBeLessThanX, Min), fieldValue); - - return Error(string.Format(Strings.ValueLengthCanNotBeLessThanXOrGreaterThanY, Min, Max), fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new LengthConstraint { - IsImmediate = IsImmediate, - Min = Min, - Max = Max, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - public LengthConstraint() - { - Min = 0; - Max = int.MaxValue; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2008.07.25 + +using System; +using System.Collections; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures field length (or item count) fits in specified range. + /// + public sealed class LengthConstraint : PropertyValidator + { + /// + /// Gets or sets the minimal allowed length. Default is 0. + /// + public int Min { get; set; } + + /// + /// Gets or sets the maximal allowed length. Default is . + /// + public int Max { get; set; } + + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + if (field.ValueType!=typeof (string) && typeof (ICollection).IsAssignableFrom(field.ValueType)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); + if (Max==int.MaxValue && Min==0) + ThrowConfigurationError(Strings.MaxOrMinPropertyShouldBeSpecified); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + if (fieldValue==null) + return Success(); + + int length; + + if (fieldValue is string) + length = ((string) fieldValue).Length; + else + length = ((ICollection) fieldValue).Count; + + if (length >= Min && length <= Max) + return Success(); + + if (Min==0) + return Error(string.Format(Strings.ValueLengthCanNotBeGreaterThanX, Max), fieldValue); + + if (Max==int.MaxValue) + return Error(string.Format(Strings.ValueLengthCanNotBeLessThanX, Min), fieldValue); + + return Error(string.Format(Strings.ValueLengthCanNotBeLessThanXOrGreaterThanY, Min, Max), fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new LengthConstraint { + IsImmediate = IsImmediate, + Min = Min, + Max = Max, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + public LengthConstraint() + { + Min = 0; + Max = int.MaxValue; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotEmptyConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotEmptyConstraint.cs index 999bd35bdd..0d79df2e89 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotEmptyConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotEmptyConstraint.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures that property value is not . - /// - public sealed class NotEmptyConstraint : PropertyValidator - { - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - - if (field.ValueType!=typeof (string)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var value = (string) fieldValue; - return value!=string.Empty ? Success() : Error(Strings.ValueShouldNotBeEmpty, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new NotEmptyConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures that property value is not . + /// + public sealed class NotEmptyConstraint : PropertyValidator + { + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + + if (field.ValueType!=typeof (string)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var value = (string) fieldValue; + return value!=string.Empty ? Success() : Error(Strings.ValueShouldNotBeEmpty, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new NotEmptyConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullConstraint.cs index d042a303e9..edd2be36f0 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullConstraint.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures property value is not . - /// - public sealed class NotNullConstraint : PropertyValidator - { - public override ValidationResult Validate(Entity target, object fieldValue) - { - return fieldValue!=null ? Success() : Error(Strings.ValueShouldNotBeNull, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new NotNullConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures property value is not . + /// + public sealed class NotNullConstraint : PropertyValidator + { + public override ValidationResult Validate(Entity target, object fieldValue) + { + return fieldValue!=null ? Success() : Error(Strings.ValueShouldNotBeNull, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new NotNullConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullOrEmptyConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullOrEmptyConstraint.cs index 7d5713c0fa..f0feae7bad 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullOrEmptyConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/NotNullOrEmptyConstraint.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures that property value is not - /// or . - /// - public sealed class NotNullOrEmptyConstraint : PropertyValidator - { - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - - if (field.ValueType!=typeof (string)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var value = (string) fieldValue; - return !string.IsNullOrEmpty(value) ? Success() : Error(Strings.ValueShouldNotBeEmpty, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new NotNullOrEmptyConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures that property value is not + /// or . + /// + public sealed class NotNullOrEmptyConstraint : PropertyValidator + { + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + + if (field.ValueType!=typeof (string)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var value = (string) fieldValue; + return !string.IsNullOrEmpty(value) ? Success() : Error(Strings.ValueShouldNotBeEmpty, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new NotNullOrEmptyConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/PastConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/PastConstraint.cs index 560dd91881..f85426bd19 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/PastConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/PastConstraint.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.05.27 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures that date value is in the past. - /// - public sealed class PastConstraint : PropertyValidator - { - public override void Configure(Domain domain, Model.TypeInfo type, Model.FieldInfo field) - { - base.Configure(domain, type, field); - - var valueType = field.ValueType; - if (valueType!=typeof (DateTime) && valueType!=typeof (DateTime?)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (DateTime).FullName)); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var isValid = fieldValue==null || (DateTime) fieldValue <= DateTime.Now; - return isValid ? Success() : Error(Strings.ValueShouldBeInThePast, fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new PastConstraint { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.05.27 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures that date value is in the past. + /// + public sealed class PastConstraint : PropertyValidator + { + public override void Configure(Domain domain, Model.TypeInfo type, Model.FieldInfo field) + { + base.Configure(domain, type, field); + + var valueType = field.ValueType; + if (valueType!=typeof (DateTime) && valueType!=typeof (DateTime?)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (DateTime).FullName)); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var isValid = fieldValue==null || (DateTime) fieldValue <= DateTime.Now; + return isValid ? Success() : Error(Strings.ValueShouldBeInThePast, fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new PastConstraint { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/RangeConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/RangeConstraint.cs index bfb65047c5..aa51bec297 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/RangeConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/RangeConstraint.cs @@ -1,118 +1,118 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2008.07.25 - -using System; -using System.Collections.Generic; -using Xtensive.Comparison; -using Xtensive.Orm.Model; -using Xtensive.Reflection; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures field value fits in the specified range. - /// - public sealed class RangeConstraint : PropertyValidator - { - private abstract class ValidationHandler - { - protected abstract void Configure(object min, object max); - - public abstract bool Validate(object value); - - public static ValidationHandler Create(Type valueType, object min, object max) - { - var validatorType = typeof (ValidationHandler<>).MakeGenericType(valueType); - var result = (ValidationHandler) Activator.CreateInstance(validatorType); - result.Configure(min, max); - return result; - } - } - - private sealed class ValidationHandler : ValidationHandler - { - private static readonly IComparer Comparer = Comparer.Default; - - private bool hasMin; - private bool hasMax; - - private TValue min; - private TValue max; - - protected override void Configure(object minObj, object maxObj) - { - if (minObj!=null) { - min = (TValue) Convert.ChangeType(minObj, typeof (TValue)); - hasMin = true; - } - - if (maxObj!=null) { - max = (TValue) Convert.ChangeType(maxObj, typeof (TValue)); - hasMax = true; - } - } - - public override bool Validate(object value) - { - var typedValue = (TValue) value; - - return (!hasMin || Comparer.Compare(typedValue, min) >= 0) - && (!hasMax || Comparer.Compare(typedValue, max) <= 0); - } - } - - private ValidationHandler handler; - - /// - /// Gets or sets the minimal allowed value. - /// means "ignore this boundary". - /// Default value is . - /// - public object Min { get; set; } - - /// - /// Gets or sets the maximal allowed value. - /// means "ignore this boundary". - /// Default value is . - /// - public object Max { get; set; } - - public override void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - base.Configure(domain, type, field); - - if (Min==null && Max==null) - ThrowConfigurationError(Strings.MaxOrMinPropertyShouldBeSpecified); - - if (!field.ValueType.IsOfGenericInterface(typeof (IComparable<>))) - ThrowConfigurationError(Strings.FieldShouldBeOfComparableType); - - handler = ValidationHandler.Create(field.ValueType, Min, Max); - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - if (handler.Validate(fieldValue)) - return Success(); - if (Min==null) - return Error(string.Format(Strings.ValueShouldNotBeGreaterThanMax, Max), fieldValue); - if (Max==null) - return Error(string.Format(Strings.ValueShouldNotBeLessThanMin, Min), fieldValue); - return Error(string.Format(Strings.ValueShouldNotBeLessThanMinOrGreaterThanMax, Min, Max), fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new RangeConstraint { - IsImmediate = IsImmediate, - Min = Min, - Max = Max, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2008.07.25 + +using System; +using System.Collections.Generic; +using Xtensive.Comparison; +using Xtensive.Orm.Model; +using Xtensive.Reflection; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures field value fits in the specified range. + /// + public sealed class RangeConstraint : PropertyValidator + { + private abstract class ValidationHandler + { + protected abstract void Configure(object min, object max); + + public abstract bool Validate(object value); + + public static ValidationHandler Create(Type valueType, object min, object max) + { + var validatorType = typeof (ValidationHandler<>).MakeGenericType(valueType); + var result = (ValidationHandler) Activator.CreateInstance(validatorType); + result.Configure(min, max); + return result; + } + } + + private sealed class ValidationHandler : ValidationHandler + { + private static readonly IComparer Comparer = Comparer.Default; + + private bool hasMin; + private bool hasMax; + + private TValue min; + private TValue max; + + protected override void Configure(object minObj, object maxObj) + { + if (minObj!=null) { + min = (TValue) Convert.ChangeType(minObj, typeof (TValue)); + hasMin = true; + } + + if (maxObj!=null) { + max = (TValue) Convert.ChangeType(maxObj, typeof (TValue)); + hasMax = true; + } + } + + public override bool Validate(object value) + { + var typedValue = (TValue) value; + + return (!hasMin || Comparer.Compare(typedValue, min) >= 0) + && (!hasMax || Comparer.Compare(typedValue, max) <= 0); + } + } + + private ValidationHandler handler; + + /// + /// Gets or sets the minimal allowed value. + /// means "ignore this boundary". + /// Default value is . + /// + public object Min { get; set; } + + /// + /// Gets or sets the maximal allowed value. + /// means "ignore this boundary". + /// Default value is . + /// + public object Max { get; set; } + + public override void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + base.Configure(domain, type, field); + + if (Min==null && Max==null) + ThrowConfigurationError(Strings.MaxOrMinPropertyShouldBeSpecified); + + if (!field.ValueType.IsOfGenericInterface(typeof (IComparable<>))) + ThrowConfigurationError(Strings.FieldShouldBeOfComparableType); + + handler = ValidationHandler.Create(field.ValueType, Min, Max); + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + if (handler.Validate(fieldValue)) + return Success(); + if (Min==null) + return Error(string.Format(Strings.ValueShouldNotBeGreaterThanMax, Max), fieldValue); + if (Max==null) + return Error(string.Format(Strings.ValueShouldNotBeLessThanMin, Min), fieldValue); + return Error(string.Format(Strings.ValueShouldNotBeLessThanMinOrGreaterThanMax, Min, Max), fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new RangeConstraint { + IsImmediate = IsImmediate, + Min = Min, + Max = Max, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Constraints/RegexConstraint.cs b/Orm/Xtensive.Orm/Orm/Validation/Constraints/RegexConstraint.cs index 7a2179a451..dec000f95b 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Constraints/RegexConstraint.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Constraints/RegexConstraint.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2008.07.23 - -using System; -using System.Text.RegularExpressions; - -namespace Xtensive.Orm.Validation -{ - /// - /// Ensures property value matches specified regular expression. - /// - public sealed class RegexConstraint : PropertyValidator - { - private Regex regex; - - /// - /// Gets or sets the regular expression pattern. - /// - public string Pattern { get; set; } - - /// - /// Gets or sets the options, default value is . - /// - public RegexOptions Options { get; set; } - - public override void Configure(Domain domain, Model.TypeInfo type, Model.FieldInfo field) - { - base.Configure(domain, type, field); - - if (field.ValueType!=typeof (string)) - ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); - - if (string.IsNullOrEmpty(Pattern)) - ThrowConfigurationError(Strings.RegularExpressionPatternIsNotSpecified); - - try { - regex = new Regex(Pattern, Options); - } - catch (ArgumentException exception) { - ThrowConfigurationError( - string.Format(Strings.FailedToCreateRegularExpressionFromPatternX, Pattern), - exception); - } - } - - public override ValidationResult Validate(Entity target, object fieldValue) - { - var value = (string) fieldValue; - return value==null || regex.IsMatch(value) - ? Success() - : Error(string.Format(Strings.ValueDoesNotMatchRegexPatternX, Pattern), fieldValue); - } - - public override IPropertyValidator CreateNew() - { - return new RegexConstraint(Pattern, Options) { - IsImmediate = IsImmediate, - SkipOnTransactionCommit = SkipOnTransactionCommit, - ValidateOnlyIfModified = ValidateOnlyIfModified - }; - } - - // Constructors - - /// - /// Initializes new instance of this type. - /// - [Obsolete("Use overload with pattern instead.")] - public RegexConstraint() - { - } - - /// - /// Initializes new instance of this type. - /// - /// pattern. - public RegexConstraint(string pattern) - { - Pattern = pattern; - Options = RegexOptions.Compiled; - } - - /// - /// Initializes new instance of this type. - /// - /// pattern. - /// options. - public RegexConstraint(string pattern, RegexOptions options) - { - Pattern = pattern; - Options = options; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2008.07.23 + +using System; +using System.Text.RegularExpressions; + +namespace Xtensive.Orm.Validation +{ + /// + /// Ensures property value matches specified regular expression. + /// + public sealed class RegexConstraint : PropertyValidator + { + private Regex regex; + + /// + /// Gets or sets the regular expression pattern. + /// + public string Pattern { get; set; } + + /// + /// Gets or sets the options, default value is . + /// + public RegexOptions Options { get; set; } + + public override void Configure(Domain domain, Model.TypeInfo type, Model.FieldInfo field) + { + base.Configure(domain, type, field); + + if (field.ValueType!=typeof (string)) + ThrowConfigurationError(string.Format(Strings.FieldShouldBeOfTypeX, typeof (string).FullName)); + + if (string.IsNullOrEmpty(Pattern)) + ThrowConfigurationError(Strings.RegularExpressionPatternIsNotSpecified); + + try { + regex = new Regex(Pattern, Options); + } + catch (ArgumentException exception) { + ThrowConfigurationError( + string.Format(Strings.FailedToCreateRegularExpressionFromPatternX, Pattern), + exception); + } + } + + public override ValidationResult Validate(Entity target, object fieldValue) + { + var value = (string) fieldValue; + return value==null || regex.IsMatch(value) + ? Success() + : Error(string.Format(Strings.ValueDoesNotMatchRegexPatternX, Pattern), fieldValue); + } + + public override IPropertyValidator CreateNew() + { + return new RegexConstraint(Pattern, Options) { + IsImmediate = IsImmediate, + SkipOnTransactionCommit = SkipOnTransactionCommit, + ValidateOnlyIfModified = ValidateOnlyIfModified + }; + } + + // Constructors + + /// + /// Initializes new instance of this type. + /// + [Obsolete("Use overload with pattern instead.")] + public RegexConstraint() + { + } + + /// + /// Initializes new instance of this type. + /// + /// pattern. + public RegexConstraint(string pattern) + { + Pattern = pattern; + Options = RegexOptions.Compiled; + } + + /// + /// Initializes new instance of this type. + /// + /// pattern. + /// options. + public RegexConstraint(string pattern, RegexOptions options) + { + Pattern = pattern; + Options = options; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/EntityErrorInfo.cs b/Orm/Xtensive.Orm/Orm/Validation/EntityErrorInfo.cs index 2c2d0fa613..f2ede2a9de 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/EntityErrorInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/EntityErrorInfo.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.09 - -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Orm.Validation -{ - /// - /// Entity validation error info. - /// - public sealed class EntityErrorInfo - { - /// - /// Gets validated entity. - /// - public Entity Target { get; private set; } - - /// - /// Gets or sets validation errors. - /// - public IList Errors { get; private set; } - - /// - /// Initializes new instance of this type. - /// - /// Validated entity. - public EntityErrorInfo(Entity target, IList errors) - { - ArgumentValidator.EnsureArgumentNotNull(target, "target"); - ArgumentValidator.EnsureArgumentNotNull(errors, "errors"); - - Target = target; - Errors = errors; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.09 + +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Orm.Validation +{ + /// + /// Entity validation error info. + /// + public sealed class EntityErrorInfo + { + /// + /// Gets validated entity. + /// + public Entity Target { get; private set; } + + /// + /// Gets or sets validation errors. + /// + public IList Errors { get; private set; } + + /// + /// Initializes new instance of this type. + /// + /// Validated entity. + public EntityErrorInfo(Entity target, IList errors) + { + ArgumentValidator.EnsureArgumentNotNull(target, "target"); + ArgumentValidator.EnsureArgumentNotNull(errors, "errors"); + + Target = target; + Errors = errors; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/EntitySetFieldValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/EntitySetFieldValidator.cs index 38563ab6eb..f6885e0ae7 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/EntitySetFieldValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/EntitySetFieldValidator.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.11 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Validator that invokes . - /// - public sealed class EntitySetFieldValidator : PropertyValidator - { - public override ValidationResult Validate(Entity target, object fieldValue) - { - try { - var entitySet = (EntitySetBase) fieldValue; - EntitySetBase.ExecuteOnValidate(entitySet); - } - catch(Exception exception) { - return Error(exception, fieldValue); - } - return Success(); - } - - public override IPropertyValidator CreateNew() - { - return new EntitySetFieldValidator(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.11 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Validator that invokes . + /// + public sealed class EntitySetFieldValidator : PropertyValidator + { + public override ValidationResult Validate(Entity target, object fieldValue) + { + try { + var entitySet = (EntitySetBase) fieldValue; + EntitySetBase.ExecuteOnValidate(entitySet); + } + catch(Exception exception) { + return Error(exception, fieldValue); + } + return Success(); + } + + public override IPropertyValidator CreateNew() + { + return new EntitySetFieldValidator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/EntityValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/EntityValidator.cs index f9c2127fbf..d2752c3742 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/EntityValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/EntityValidator.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.11 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Validator that invokes - /// for derived types. - /// - public sealed class EntityValidator : ObjectValidator - { - public override ValidationResult Validate(Entity target) - { - try { - Persistent.ExecuteOnValidate(target); - } - catch(Exception exception) { - return Error(exception); - } - return Success(); - } - - public override IObjectValidator CreateNew() - { - return new EntityValidator(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.11 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Validator that invokes + /// for derived types. + /// + public sealed class EntityValidator : ObjectValidator + { + public override ValidationResult Validate(Entity target) + { + try { + Persistent.ExecuteOnValidate(target); + } + catch(Exception exception) { + return Error(exception); + } + return Success(); + } + + public override IObjectValidator CreateNew() + { + return new EntityValidator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Exceptions/ValidationFailedException.cs b/Orm/Xtensive.Orm/Orm/Validation/Exceptions/ValidationFailedException.cs index 5712ae0742..0bc9ce6f4e 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Exceptions/ValidationFailedException.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Exceptions/ValidationFailedException.cs @@ -1,60 +1,60 @@ -using System; -using System.Collections.Generic; -using System.Runtime.Serialization; -using Xtensive.Core; - -namespace Xtensive.Orm.Validation -{ - /// - /// Validation failure error. - /// - [Serializable] - public class ValidationFailedException : StorageException - { - [NonSerialized] - private IList validationErrors; - - /// - /// Gets validation errors associated with this instance. - /// - public IList ValidationErrors - { - get { return validationErrors; } - set - { - if (validationErrors!=null) - throw Exceptions.AlreadyInitialized("ValidationErrors"); - validationErrors = value; - } - } - - /// - /// Initailizes new instance of this type. - /// - /// Exception message. - public ValidationFailedException(string message) - : base(message) - { - } - - /// - /// Initializes new instance of this type. - /// - /// Exception message. - /// Inner exception. - public ValidationFailedException(string message, Exception inner) - : base(message, inner) - { - } - - /// - /// Performs deserialization. - /// - /// Serialization info. - /// Streaming context. - protected ValidationFailedException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using Xtensive.Core; + +namespace Xtensive.Orm.Validation +{ + /// + /// Validation failure error. + /// + [Serializable] + public class ValidationFailedException : StorageException + { + [NonSerialized] + private IList validationErrors; + + /// + /// Gets validation errors associated with this instance. + /// + public IList ValidationErrors + { + get { return validationErrors; } + set + { + if (validationErrors!=null) + throw Exceptions.AlreadyInitialized("ValidationErrors"); + validationErrors = value; + } + } + + /// + /// Initailizes new instance of this type. + /// + /// Exception message. + public ValidationFailedException(string message) + : base(message) + { + } + + /// + /// Initializes new instance of this type. + /// + /// Exception message. + /// Inner exception. + public ValidationFailedException(string message, Exception inner) + : base(message, inner) + { + } + + /// + /// Performs deserialization. + /// + /// Serialization info. + /// Streaming context. + protected ValidationFailedException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IObjectValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IObjectValidator.cs index d77ffb5d94..397dfbbf98 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IObjectValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IObjectValidator.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.06 - -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Persistent object validator contract. - /// - public interface IObjectValidator : IValidator - { - /// - /// Configures this instance. - /// - /// A domain this validator is bound to. - /// A type this validator is bound to. - void Configure(Domain domain, TypeInfo type); - - /// - /// Validates specified object. - /// - /// An object to validate. - ValidationResult Validate(Entity target); - - /// - /// Creates new unconfigured instance - /// with the same parameters. - /// - /// Newly created validator. - IObjectValidator CreateNew(); - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.06 + +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Persistent object validator contract. + /// + public interface IObjectValidator : IValidator + { + /// + /// Configures this instance. + /// + /// A domain this validator is bound to. + /// A type this validator is bound to. + void Configure(Domain domain, TypeInfo type); + + /// + /// Validates specified object. + /// + /// An object to validate. + ValidationResult Validate(Entity target); + + /// + /// Creates new unconfigured instance + /// with the same parameters. + /// + /// Newly created validator. + IObjectValidator CreateNew(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IPropertyValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IPropertyValidator.cs index 9ec06ce049..70d457572e 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IPropertyValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IPropertyValidator.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.06 - -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Field validator contract. - /// - public interface IPropertyValidator : IValidator - { - /// - /// Gets value indicating if current validator is immediate. - /// Immediate validators execute just before field value changes. - /// - bool IsImmediate { get; set; } - - /// - /// Gets value indicating whether validator should be skipped on transaction commit validation. - /// - bool SkipOnTransactionCommit { get; } - - /// - /// Gets value indicating whether validator should be skipped if field value was not changed. - /// - bool ValidateOnlyIfModified { get; } - - /// - /// Configures this instance. - /// - /// A domain this validator is bound to. - /// A type this validator is bound to. - /// A persitent field this validator is bound to. - void Configure(Domain domain, TypeInfo type, FieldInfo field); - - /// - /// Validates specified object considering new value of a persistent field. - /// - /// An object to validate. - /// Persistent field value. - ValidationResult Validate(Entity target, object fieldValue); - - /// - /// Creates new unconfigured instance - /// with the same parameters. - /// - /// Newly created validator. - IPropertyValidator CreateNew(); - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.06 + +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Field validator contract. + /// + public interface IPropertyValidator : IValidator + { + /// + /// Gets value indicating if current validator is immediate. + /// Immediate validators execute just before field value changes. + /// + bool IsImmediate { get; set; } + + /// + /// Gets value indicating whether validator should be skipped on transaction commit validation. + /// + bool SkipOnTransactionCommit { get; } + + /// + /// Gets value indicating whether validator should be skipped if field value was not changed. + /// + bool ValidateOnlyIfModified { get; } + + /// + /// Configures this instance. + /// + /// A domain this validator is bound to. + /// A type this validator is bound to. + /// A persitent field this validator is bound to. + void Configure(Domain domain, TypeInfo type, FieldInfo field); + + /// + /// Validates specified object considering new value of a persistent field. + /// + /// An object to validate. + /// Persistent field value. + ValidationResult Validate(Entity target, object fieldValue); + + /// + /// Creates new unconfigured instance + /// with the same parameters. + /// + /// Newly created validator. + IPropertyValidator CreateNew(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IValidator.cs index 07a410bff1..b5b5be6933 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Interfaces/IValidator.cs @@ -1,9 +1,9 @@ -namespace Xtensive.Orm.Validation -{ - /// - /// Base contract for any persistent validators. - /// - public interface IValidator - { - } +namespace Xtensive.Orm.Validation +{ + /// + /// Base contract for any persistent validators. + /// + public interface IValidator + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Internals/RealValidationContext.cs b/Orm/Xtensive.Orm/Orm/Validation/Internals/RealValidationContext.cs index d8375fa14e..0caef363f6 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Internals/RealValidationContext.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Internals/RealValidationContext.cs @@ -1,200 +1,200 @@ -// Copyright (C) 2013-2020 Xtensive LLC. -// This code is distributed under MIT license terms. -// See the License.txt file in the project root for more information. -// Created by: Denis Krjuchkov -// Created: 2013.09.12 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - internal sealed class RealValidationContext : ValidationContext - { - private Dictionary entitiesToValidate; - private Dictionary> changedFields; - - public override void Reset() - { - entitiesToValidate = null; - changedFields = null; - } - - public override void Validate(Entity target) - { - var result = ValidateAndGetErrors(target); - - if (result.Count > 0) - throw new ValidationFailedException(GetErrorMessage(ValidationReason.UserRequest)) { - ValidationErrors = new List {new EntityErrorInfo(target, result)} - }; - } - - public override void ValidateSetAttempt(Entity target, FieldInfo field, object value) - { - if (!field.HasImmediateValidators) - return; - - var fieldAccessor = target.GetFieldAccessor(field); - var oldValue = fieldAccessor.GetUntypedValue(target); - var isChanged = fieldAccessor.AreSameValues(oldValue, value); - - foreach (var validator in field.Validators.Where(v => v.IsImmediate && ((!isChanged && v.ValidateOnlyIfModified) || (!v.ValidateOnlyIfModified)))) { - var result = validator.Validate(target, value); - if (result.IsError) - throw new ArgumentException(result.ErrorMessage, "value"); - } - } - - public override void RegisterForValidation(Entity target) - { - RegisterForValidation(target, null); - } - - public override void RegisterForValidation(Entity target, FieldInfo field) - { - if (field.IsStructure) - foreach (var structField in field.Fields) - RegisterForValidation(target, structField); - - - RegisterForValidation(target, (EntityErrorInfo)null); - - HashSet fieldSet; - if (changedFields==null) { - fieldSet = new HashSet(); - changedFields = new Dictionary> {{target, fieldSet}}; - } - else if (!changedFields.TryGetValue(target, out fieldSet)) - changedFields[target] = fieldSet = new HashSet(); - - fieldSet.Add(field); - } - - public override void Validate(ValidationReason reason) - { - var errors = ValidateAndGetErrors(reason); - if (errors.Count > 0) - throw new ValidationFailedException(GetErrorMessage(reason)) {ValidationErrors = errors}; - } - - public override IList ValidateAndGetErrors(Entity target) - { - var result = new List(); - GetValidationErrors(target, result); - if (result.Count==0) - return EmptyValidationResultCollection; - var lockedResult = result.AsReadOnly(); - var errorInfo = new EntityErrorInfo(target, lockedResult); - RegisterForValidation(target, errorInfo); - return lockedResult; - } - - public override IList ValidateOnceAndGetErrors(Entity target) - { - EntityErrorInfo errorInfo; - if (entitiesToValidate!=null && entitiesToValidate.TryGetValue(target, out errorInfo) && errorInfo!=null) - return errorInfo.Errors; - - return ValidateAndGetErrors(target); - } - - public override IList ValidateAndGetErrors() - { - return ValidateAndGetErrors(null); - } - - private IList ValidateAndGetErrors(ValidationReason? reason) - { - var errors = new List(); - GetValidationErrors(errors, reason); - return errors.Count==0 ? EmptyEntityErrorCollection : errors.AsReadOnly(); - } - - private void RegisterForValidation(Entity target, EntityErrorInfo previousStatus) - { - if (!target.TypeInfo.HasValidators) - return; - - if (entitiesToValidate==null) - entitiesToValidate = new Dictionary(); - - entitiesToValidate[target] = previousStatus; - } - - private void GetValidationErrors(List output, ValidationReason? validationReason = null) - { - if (entitiesToValidate==null) - return; - - var currentEntityErrors = new List(); - var entitiesToProcess = entitiesToValidate; - entitiesToValidate = null; - - foreach (var entity in entitiesToProcess.Keys) - if (entity.CanBeValidated) { - GetValidationErrors(entity, currentEntityErrors, validationReason); - if (currentEntityErrors.Count > 0) { - var errorInfo = new EntityErrorInfo(entity, currentEntityErrors.AsReadOnly()); - RegisterForValidation(entity, errorInfo); - output.Add(errorInfo); - currentEntityErrors = new List(); - } - } - } - - private void GetValidationErrors(Entity target, List output, ValidationReason? validationReason = null) - { - foreach (var field in target.TypeInfo.Fields) { - if (!field.HasValidators) - continue; - - object value = null; - bool isValueRetrieved = false; - foreach (var validator in field.Validators) { - if (validationReason.HasValue && validationReason.Value==ValidationReason.Commit && validator.SkipOnTransactionCommit) - continue; - if (validator.ValidateOnlyIfModified) { - if (ShouldSkipModifiedOnlyValidator(target, field)) - continue; - } - if (!isValueRetrieved) { - value = target.GetFieldValue(field); - isValueRetrieved = true; - } - - var result = validator.Validate(target, value); - if (result.IsError) - output.Add(result); - } - } - - foreach (var validator in target.TypeInfo.Validators) { - var result = validator.Validate(target); - if (result.IsError) - output.Add(result); - } - } - - private string GetErrorMessage(ValidationReason reason) - { - switch (reason) { - case ValidationReason.UserRequest: - return Strings.ExValidationFailed; - case ValidationReason.Commit: - return Strings.ExCanNotCommitATransactionEntitiesValidationFailed; - default: - throw new ArgumentOutOfRangeException("reason"); - } - } - - private bool ShouldSkipModifiedOnlyValidator(Entity target, FieldInfo field) - { - return changedFields==null || - !changedFields.TryGetValue(target, out var fieldSet) || - !fieldSet.Contains(field); - } - } +// Copyright (C) 2013-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. +// Created by: Denis Krjuchkov +// Created: 2013.09.12 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + internal sealed class RealValidationContext : ValidationContext + { + private Dictionary entitiesToValidate; + private Dictionary> changedFields; + + public override void Reset() + { + entitiesToValidate = null; + changedFields = null; + } + + public override void Validate(Entity target) + { + var result = ValidateAndGetErrors(target); + + if (result.Count > 0) + throw new ValidationFailedException(GetErrorMessage(ValidationReason.UserRequest)) { + ValidationErrors = new List {new EntityErrorInfo(target, result)} + }; + } + + public override void ValidateSetAttempt(Entity target, FieldInfo field, object value) + { + if (!field.HasImmediateValidators) + return; + + var fieldAccessor = target.GetFieldAccessor(field); + var oldValue = fieldAccessor.GetUntypedValue(target); + var isChanged = fieldAccessor.AreSameValues(oldValue, value); + + foreach (var validator in field.Validators.Where(v => v.IsImmediate && ((!isChanged && v.ValidateOnlyIfModified) || (!v.ValidateOnlyIfModified)))) { + var result = validator.Validate(target, value); + if (result.IsError) + throw new ArgumentException(result.ErrorMessage, "value"); + } + } + + public override void RegisterForValidation(Entity target) + { + RegisterForValidation(target, null); + } + + public override void RegisterForValidation(Entity target, FieldInfo field) + { + if (field.IsStructure) + foreach (var structField in field.Fields) + RegisterForValidation(target, structField); + + + RegisterForValidation(target, (EntityErrorInfo)null); + + HashSet fieldSet; + if (changedFields==null) { + fieldSet = new HashSet(); + changedFields = new Dictionary> {{target, fieldSet}}; + } + else if (!changedFields.TryGetValue(target, out fieldSet)) + changedFields[target] = fieldSet = new HashSet(); + + fieldSet.Add(field); + } + + public override void Validate(ValidationReason reason) + { + var errors = ValidateAndGetErrors(reason); + if (errors.Count > 0) + throw new ValidationFailedException(GetErrorMessage(reason)) {ValidationErrors = errors}; + } + + public override IList ValidateAndGetErrors(Entity target) + { + var result = new List(); + GetValidationErrors(target, result); + if (result.Count==0) + return EmptyValidationResultCollection; + var lockedResult = result.AsReadOnly(); + var errorInfo = new EntityErrorInfo(target, lockedResult); + RegisterForValidation(target, errorInfo); + return lockedResult; + } + + public override IList ValidateOnceAndGetErrors(Entity target) + { + EntityErrorInfo errorInfo; + if (entitiesToValidate!=null && entitiesToValidate.TryGetValue(target, out errorInfo) && errorInfo!=null) + return errorInfo.Errors; + + return ValidateAndGetErrors(target); + } + + public override IList ValidateAndGetErrors() + { + return ValidateAndGetErrors(null); + } + + private IList ValidateAndGetErrors(ValidationReason? reason) + { + var errors = new List(); + GetValidationErrors(errors, reason); + return errors.Count==0 ? EmptyEntityErrorCollection : errors.AsReadOnly(); + } + + private void RegisterForValidation(Entity target, EntityErrorInfo previousStatus) + { + if (!target.TypeInfo.HasValidators) + return; + + if (entitiesToValidate==null) + entitiesToValidate = new Dictionary(); + + entitiesToValidate[target] = previousStatus; + } + + private void GetValidationErrors(List output, ValidationReason? validationReason = null) + { + if (entitiesToValidate==null) + return; + + var currentEntityErrors = new List(); + var entitiesToProcess = entitiesToValidate; + entitiesToValidate = null; + + foreach (var entity in entitiesToProcess.Keys) + if (entity.CanBeValidated) { + GetValidationErrors(entity, currentEntityErrors, validationReason); + if (currentEntityErrors.Count > 0) { + var errorInfo = new EntityErrorInfo(entity, currentEntityErrors.AsReadOnly()); + RegisterForValidation(entity, errorInfo); + output.Add(errorInfo); + currentEntityErrors = new List(); + } + } + } + + private void GetValidationErrors(Entity target, List output, ValidationReason? validationReason = null) + { + foreach (var field in target.TypeInfo.Fields) { + if (!field.HasValidators) + continue; + + object value = null; + bool isValueRetrieved = false; + foreach (var validator in field.Validators) { + if (validationReason.HasValue && validationReason.Value==ValidationReason.Commit && validator.SkipOnTransactionCommit) + continue; + if (validator.ValidateOnlyIfModified) { + if (ShouldSkipModifiedOnlyValidator(target, field)) + continue; + } + if (!isValueRetrieved) { + value = target.GetFieldValue(field); + isValueRetrieved = true; + } + + var result = validator.Validate(target, value); + if (result.IsError) + output.Add(result); + } + } + + foreach (var validator in target.TypeInfo.Validators) { + var result = validator.Validate(target); + if (result.IsError) + output.Add(result); + } + } + + private string GetErrorMessage(ValidationReason reason) + { + switch (reason) { + case ValidationReason.UserRequest: + return Strings.ExValidationFailed; + case ValidationReason.Commit: + return Strings.ExCanNotCommitATransactionEntitiesValidationFailed; + default: + throw new ArgumentOutOfRangeException("reason"); + } + } + + private bool ShouldSkipModifiedOnlyValidator(Entity target, FieldInfo field) + { + return changedFields==null || + !changedFields.TryGetValue(target, out var fieldSet) || + !fieldSet.Contains(field); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationContext.cs b/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationContext.cs index 3741397f8a..2ac95236fc 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationContext.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationContext.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.05 - -using System.Collections.Generic; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - internal abstract class ValidationContext - { - protected static IList EmptyEntityErrorCollection = new List().AsReadOnly(); - - protected static IList EmptyValidationResultCollection = new List().AsReadOnly(); - - public abstract void Reset(); - - public abstract void Validate(ValidationReason reason); - - public abstract void Validate(Entity target); - - public abstract IList ValidateAndGetErrors(); - - public abstract IList ValidateAndGetErrors(Entity target); - - public abstract IList ValidateOnceAndGetErrors(Entity target); - - public abstract void ValidateSetAttempt(Entity target, FieldInfo field, object value); - - public abstract void RegisterForValidation(Entity target); - - public abstract void RegisterForValidation(Entity target, FieldInfo field); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.05 + +using System.Collections.Generic; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + internal abstract class ValidationContext + { + protected static IList EmptyEntityErrorCollection = new List().AsReadOnly(); + + protected static IList EmptyValidationResultCollection = new List().AsReadOnly(); + + public abstract void Reset(); + + public abstract void Validate(ValidationReason reason); + + public abstract void Validate(Entity target); + + public abstract IList ValidateAndGetErrors(); + + public abstract IList ValidateAndGetErrors(Entity target); + + public abstract IList ValidateOnceAndGetErrors(Entity target); + + public abstract void ValidateSetAttempt(Entity target, FieldInfo field, object value); + + public abstract void RegisterForValidation(Entity target); + + public abstract void RegisterForValidation(Entity target, FieldInfo field); + } +} diff --git a/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationReason.cs b/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationReason.cs index 8ca253e9c6..8208914ad2 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationReason.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Internals/ValidationReason.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.11 - -namespace Xtensive.Orm.Validation -{ - internal enum ValidationReason - { - UserRequest, - Commit, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.11 + +namespace Xtensive.Orm.Validation +{ + internal enum ValidationReason + { + UserRequest, + Commit, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/Internals/VoidValidationContext.cs b/Orm/Xtensive.Orm/Orm/Validation/Internals/VoidValidationContext.cs index 116fb31a9e..99a525a8ec 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/Internals/VoidValidationContext.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/Internals/VoidValidationContext.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.12 - -using System.Collections.Generic; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - internal sealed class VoidValidationContext : ValidationContext - { - public override void Reset() - { - } - - public override void Validate(ValidationReason reason) - { - } - - public override void Validate(Entity target) - { - } - - public override IList ValidateAndGetErrors() - { - return EmptyEntityErrorCollection; - } - - public override IList ValidateAndGetErrors(Entity target) - { - return EmptyValidationResultCollection; - } - - public override IList ValidateOnceAndGetErrors(Entity target) - { - return EmptyValidationResultCollection; - } - - public override void ValidateSetAttempt(Entity target, FieldInfo field, object value) - { - } - - public override void RegisterForValidation(Entity target) - { - } - - public override void RegisterForValidation(Entity target, FieldInfo field) - { - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.12 + +using System.Collections.Generic; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + internal sealed class VoidValidationContext : ValidationContext + { + public override void Reset() + { + } + + public override void Validate(ValidationReason reason) + { + } + + public override void Validate(Entity target) + { + } + + public override IList ValidateAndGetErrors() + { + return EmptyEntityErrorCollection; + } + + public override IList ValidateAndGetErrors(Entity target) + { + return EmptyValidationResultCollection; + } + + public override IList ValidateOnceAndGetErrors(Entity target) + { + return EmptyValidationResultCollection; + } + + public override void ValidateSetAttempt(Entity target, FieldInfo field, object value) + { + } + + public override void RegisterForValidation(Entity target) + { + } + + public override void RegisterForValidation(Entity target, FieldInfo field) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/ObjectValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/ObjectValidator.cs index c8f130179f..7091f71be7 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/ObjectValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/ObjectValidator.cs @@ -1,103 +1,103 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.06 - -using System; -using Xtensive.Core; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Standard base type for implementation. - /// - public abstract class ObjectValidator : IObjectValidator - { - /// - /// Gets domain this instance is bound to. - /// - public Domain Domain { get; private set; } - - /// - /// Gets type this instance is bound to. - /// - public TypeInfo Type { get; private set; } - - /// - /// Configures this instance. - /// - /// A domain this validator is bound to. - /// A type this validator is bound to. - public virtual void Configure(Domain domain, TypeInfo type) - { - if (Domain!=null) - throw Exceptions.AlreadyInitialized(null); - - Domain = domain; - Type = type; - } - - /// - /// Validates specified object. - /// - /// An object to validate. - public abstract ValidationResult Validate(Entity target); - - /// - /// Creates new unconfigured instance - /// with the same parameters. - /// - /// Newly created validator. - public abstract IObjectValidator CreateNew(); - - /// - /// Constructs successful validation result. - /// - /// Constructed result. - protected ValidationResult Success() - { - return ValidationResult.Success; - } - - /// - /// Constructs validation failure result. - /// - /// Validation error message. - /// Constructed result. - protected ValidationResult Error(string errorMessage) - { - return new ValidationResult(this, errorMessage); - } - - /// - /// Constructs validation failure result. - /// - /// Validation error message. - /// Constructed result. - protected ValidationResult Error(Exception exception) - { - return new ValidationResult(this, exception.Message); - } - - /// - /// Throws configuration error with specified message. - /// - /// Configuration error message. - protected void ThrowConfigurationError(string message, Exception innerException = null) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(message, "message"); - - var exceptionMessage = string.Format( - Strings.ExValidatorXConfigurationFailedOnTypeYWithMessageZ, - GetType().Name, Type, message); - - var exception = innerException==null - ? new DomainBuilderException(exceptionMessage) - : new DomainBuilderException(message, innerException); - - throw exception; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.06 + +using System; +using Xtensive.Core; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Standard base type for implementation. + /// + public abstract class ObjectValidator : IObjectValidator + { + /// + /// Gets domain this instance is bound to. + /// + public Domain Domain { get; private set; } + + /// + /// Gets type this instance is bound to. + /// + public TypeInfo Type { get; private set; } + + /// + /// Configures this instance. + /// + /// A domain this validator is bound to. + /// A type this validator is bound to. + public virtual void Configure(Domain domain, TypeInfo type) + { + if (Domain!=null) + throw Exceptions.AlreadyInitialized(null); + + Domain = domain; + Type = type; + } + + /// + /// Validates specified object. + /// + /// An object to validate. + public abstract ValidationResult Validate(Entity target); + + /// + /// Creates new unconfigured instance + /// with the same parameters. + /// + /// Newly created validator. + public abstract IObjectValidator CreateNew(); + + /// + /// Constructs successful validation result. + /// + /// Constructed result. + protected ValidationResult Success() + { + return ValidationResult.Success; + } + + /// + /// Constructs validation failure result. + /// + /// Validation error message. + /// Constructed result. + protected ValidationResult Error(string errorMessage) + { + return new ValidationResult(this, errorMessage); + } + + /// + /// Constructs validation failure result. + /// + /// Validation error message. + /// Constructed result. + protected ValidationResult Error(Exception exception) + { + return new ValidationResult(this, exception.Message); + } + + /// + /// Throws configuration error with specified message. + /// + /// Configuration error message. + protected void ThrowConfigurationError(string message, Exception innerException = null) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(message, "message"); + + var exceptionMessage = string.Format( + Strings.ExValidatorXConfigurationFailedOnTypeYWithMessageZ, + GetType().Name, Type, message); + + var exception = innerException==null + ? new DomainBuilderException(exceptionMessage) + : new DomainBuilderException(message, innerException); + + throw exception; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/PropertyValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/PropertyValidator.cs index b29d5b9081..d317804e24 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/PropertyValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/PropertyValidator.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.06 - -using System; -using Xtensive.Core; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Standard base type for implementation. - /// - public abstract class PropertyValidator : Attribute, IPropertyValidator - { - private bool isImmediate; - private bool skipOnTransactionCommiting; - - /// - /// Gets or sets value indicating if current validator is immediate. - /// - public bool IsImmediate - { - get { return isImmediate; } - set - { - if (Domain!=null) - throw Exceptions.AlreadyInitialized(null); - - isImmediate = value; - } - } - - /// - /// Gets or sets value indicating wheteher validation should continue only if field value has changed. - /// - public bool ValidateOnlyIfModified { get; set; } - - /// - /// Gets or sets value indicating if current validator should be skipped on a transaction commit. - /// - public bool SkipOnTransactionCommit - { - get { return skipOnTransactionCommiting; } - set - { - if (Domain!=null) - throw Exceptions.AlreadyInitialized(null); - - skipOnTransactionCommiting = value; - } - } - - /// - /// Gets domain this instance is bound to. - /// - public Domain Domain { get; private set; } - - /// - /// Gets type this instance is bound to. - /// - public TypeInfo Type { get; private set; } - - /// - /// Gets field this instance is bound to. - /// - public FieldInfo Field { get; private set; } - - /// - /// Gets or sets the to be used on setting property value. - /// - [Obsolete("Use IsImmediate property instead.")] - public ConstrainMode Mode - { - get { return IsImmediate ? ConstrainMode.OnSetValue : ConstrainMode.OnValidate; } - set { IsImmediate = value==ConstrainMode.OnSetValue; } - } - - /// - /// Configures this instance. - /// - /// A domain this validator is bound to. - /// A type this validator is bound to. - /// A persitent field this validator is bound to. - public virtual void Configure(Domain domain, TypeInfo type, FieldInfo field) - { - if (Domain!=null) - throw Exceptions.AlreadyInitialized(null); - - Domain = domain; - Type = type; - Field = field; - } - - /// - /// Validates specified object considering new value of a persistent field. - /// - /// An object to validate. - /// Persistent field value. - public abstract ValidationResult Validate(Entity target, object fieldValue); - - /// - /// Creates new unconfigured instance - /// with the same parameters. - /// - public abstract IPropertyValidator CreateNew(); - - /// - /// Constructs successful validation result. - /// - /// Constructed result. - protected ValidationResult Success() - { - return ValidationResult.Success; - } - - /// - /// Constructs validation failure result. - /// - /// Validation error message. - /// Validated value. - /// Constructed result. - protected ValidationResult Error(string errorMessage, object value) - { - return new ValidationResult(this, errorMessage, Field, value); - } - - /// - /// Constructs validation failure result. - /// - /// Validation exception. - /// Validated value. - /// Constructed result. - protected ValidationResult Error(Exception exception, object value) - { - return new ValidationResult(this, exception.Message, Field, value); - } - - /// - /// Throws configuration error with specified message. - /// - /// Configuration error message. - protected void ThrowConfigurationError(string message, Exception innerException = null) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(message, "message"); - - var exceptionMessage = string.Format( - Strings.ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA, - GetType().Name, Type, Field, message); - - var exception = innerException==null - ? new DomainBuilderException(exceptionMessage) - : new DomainBuilderException(message, innerException); - - throw exception; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.06 + +using System; +using Xtensive.Core; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Standard base type for implementation. + /// + public abstract class PropertyValidator : Attribute, IPropertyValidator + { + private bool isImmediate; + private bool skipOnTransactionCommiting; + + /// + /// Gets or sets value indicating if current validator is immediate. + /// + public bool IsImmediate + { + get { return isImmediate; } + set + { + if (Domain!=null) + throw Exceptions.AlreadyInitialized(null); + + isImmediate = value; + } + } + + /// + /// Gets or sets value indicating wheteher validation should continue only if field value has changed. + /// + public bool ValidateOnlyIfModified { get; set; } + + /// + /// Gets or sets value indicating if current validator should be skipped on a transaction commit. + /// + public bool SkipOnTransactionCommit + { + get { return skipOnTransactionCommiting; } + set + { + if (Domain!=null) + throw Exceptions.AlreadyInitialized(null); + + skipOnTransactionCommiting = value; + } + } + + /// + /// Gets domain this instance is bound to. + /// + public Domain Domain { get; private set; } + + /// + /// Gets type this instance is bound to. + /// + public TypeInfo Type { get; private set; } + + /// + /// Gets field this instance is bound to. + /// + public FieldInfo Field { get; private set; } + + /// + /// Gets or sets the to be used on setting property value. + /// + [Obsolete("Use IsImmediate property instead.")] + public ConstrainMode Mode + { + get { return IsImmediate ? ConstrainMode.OnSetValue : ConstrainMode.OnValidate; } + set { IsImmediate = value==ConstrainMode.OnSetValue; } + } + + /// + /// Configures this instance. + /// + /// A domain this validator is bound to. + /// A type this validator is bound to. + /// A persitent field this validator is bound to. + public virtual void Configure(Domain domain, TypeInfo type, FieldInfo field) + { + if (Domain!=null) + throw Exceptions.AlreadyInitialized(null); + + Domain = domain; + Type = type; + Field = field; + } + + /// + /// Validates specified object considering new value of a persistent field. + /// + /// An object to validate. + /// Persistent field value. + public abstract ValidationResult Validate(Entity target, object fieldValue); + + /// + /// Creates new unconfigured instance + /// with the same parameters. + /// + public abstract IPropertyValidator CreateNew(); + + /// + /// Constructs successful validation result. + /// + /// Constructed result. + protected ValidationResult Success() + { + return ValidationResult.Success; + } + + /// + /// Constructs validation failure result. + /// + /// Validation error message. + /// Validated value. + /// Constructed result. + protected ValidationResult Error(string errorMessage, object value) + { + return new ValidationResult(this, errorMessage, Field, value); + } + + /// + /// Constructs validation failure result. + /// + /// Validation exception. + /// Validated value. + /// Constructed result. + protected ValidationResult Error(Exception exception, object value) + { + return new ValidationResult(this, exception.Message, Field, value); + } + + /// + /// Throws configuration error with specified message. + /// + /// Configuration error message. + protected void ThrowConfigurationError(string message, Exception innerException = null) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(message, "message"); + + var exceptionMessage = string.Format( + Strings.ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA, + GetType().Name, Type, Field, message); + + var exception = innerException==null + ? new DomainBuilderException(exceptionMessage) + : new DomainBuilderException(message, innerException); + + throw exception; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/StructureFieldValidator.cs b/Orm/Xtensive.Orm/Orm/Validation/StructureFieldValidator.cs index 132e7536c4..5c3880a6c2 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/StructureFieldValidator.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/StructureFieldValidator.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.11 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Validator and invokes - /// for derived types. - /// - public sealed class StructureFieldValidator : PropertyValidator - { - public override ValidationResult Validate(Entity target, object fieldValue) - { - try { - var structure = (Structure) fieldValue; - Persistent.ExecuteOnValidate(structure); - } - catch(Exception exception) { - return Error(exception, fieldValue); - } - return Success(); - } - - public override IPropertyValidator CreateNew() - { - return new StructureFieldValidator(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.11 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Validator and invokes + /// for derived types. + /// + public sealed class StructureFieldValidator : PropertyValidator + { + public override ValidationResult Validate(Entity target, object fieldValue) + { + try { + var structure = (Structure) fieldValue; + Persistent.ExecuteOnValidate(structure); + } + catch(Exception exception) { + return Error(exception, fieldValue); + } + return Success(); + } + + public override IPropertyValidator CreateNew() + { + return new StructureFieldValidator(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/ValidationMode.cs b/Orm/Xtensive.Orm/Orm/Validation/ValidationMode.cs index 3f828c5aec..27f75c7760 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/ValidationMode.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/ValidationMode.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.07.21 - -using System; - -namespace Xtensive.Orm.Validation -{ - /// - /// Possible validation modes. - /// - [Serializable] - [Obsolete("Use IsImmediate property of a particular constraint instead.")] - public enum ConstrainMode - { - /// - /// The same as . - /// - Default = OnValidate, - - /// - /// Property value will be checked on object validation. - /// - /// - /// Note that when inconsistent region is not open validation can be performed immediatly after setting property value. - /// - OnValidate = 0, - - /// - /// Validation is performed before property value is set. - /// - OnSetValue = 1 - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.07.21 + +using System; + +namespace Xtensive.Orm.Validation +{ + /// + /// Possible validation modes. + /// + [Serializable] + [Obsolete("Use IsImmediate property of a particular constraint instead.")] + public enum ConstrainMode + { + /// + /// The same as . + /// + Default = OnValidate, + + /// + /// Property value will be checked on object validation. + /// + /// + /// Note that when inconsistent region is not open validation can be performed immediatly after setting property value. + /// + OnValidate = 0, + + /// + /// Validation is performed before property value is set. + /// + OnSetValue = 1 + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Validation/ValidationResult.cs b/Orm/Xtensive.Orm/Orm/Validation/ValidationResult.cs index e3653343d5..82dc95a912 100644 --- a/Orm/Xtensive.Orm/Orm/Validation/ValidationResult.cs +++ b/Orm/Xtensive.Orm/Orm/Validation/ValidationResult.cs @@ -1,73 +1,73 @@ -using Xtensive.Core; -using Xtensive.Orm.Model; - -namespace Xtensive.Orm.Validation -{ - /// - /// Validation result. - /// - public class ValidationResult - { - private static readonly ValidationResult SuccessInstance = new ValidationResult(); - - /// - /// Gets successful validation result. - /// - public static ValidationResult Success { get { return SuccessInstance; } } - - private readonly IValidator source; - private readonly bool isError; - private readonly string errorMessage; - private readonly FieldInfo field; - private readonly object value; - - /// - /// Gets validator that produced validation error. - /// - public IValidator Source { get { return source; } } - - /// - /// Gets value indicating validation status. - /// - public bool IsError { get { return isError; } } - - /// - /// Gets error message. - /// - public string ErrorMessage { get { return errorMessage; } } - - /// - /// Gets field validated field. - /// - public FieldInfo Field { get { return field; } } - - /// - /// Gets validated value. - /// - public object Value { get { return value; } } - - private ValidationResult() - { - } - - /// - /// Initializes new instance of this type. - /// - /// Validator that produced this object. - /// Validation error message. - /// Validated field. - /// Validated value. - public ValidationResult(IValidator source, string errorMessage, FieldInfo field = null, object value = null) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(errorMessage, "errorMessage"); - - isError = true; - - this.source = source; - this.errorMessage = errorMessage; - this.field = field; - this.value = value; - } - } +using Xtensive.Core; +using Xtensive.Orm.Model; + +namespace Xtensive.Orm.Validation +{ + /// + /// Validation result. + /// + public class ValidationResult + { + private static readonly ValidationResult SuccessInstance = new ValidationResult(); + + /// + /// Gets successful validation result. + /// + public static ValidationResult Success { get { return SuccessInstance; } } + + private readonly IValidator source; + private readonly bool isError; + private readonly string errorMessage; + private readonly FieldInfo field; + private readonly object value; + + /// + /// Gets validator that produced validation error. + /// + public IValidator Source { get { return source; } } + + /// + /// Gets value indicating validation status. + /// + public bool IsError { get { return isError; } } + + /// + /// Gets error message. + /// + public string ErrorMessage { get { return errorMessage; } } + + /// + /// Gets field validated field. + /// + public FieldInfo Field { get { return field; } } + + /// + /// Gets validated value. + /// + public object Value { get { return value; } } + + private ValidationResult() + { + } + + /// + /// Initializes new instance of this type. + /// + /// Validator that produced this object. + /// Validation error message. + /// Validated field. + /// Validated value. + public ValidationResult(IValidator source, string errorMessage, FieldInfo field = null, object value = null) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(errorMessage, "errorMessage"); + + isError = true; + + this.source = source; + this.errorMessage = errorMessage; + this.field = field; + this.value = value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/VersionCapturer.cs b/Orm/Xtensive.Orm/Orm/VersionCapturer.cs index 0971f468f8..494b6e9d32 100644 --- a/Orm/Xtensive.Orm/Orm/VersionCapturer.cs +++ b/Orm/Xtensive.Orm/Orm/VersionCapturer.cs @@ -1,154 +1,154 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.03.01 - -using System; -using System.Collections.Generic; -using Xtensive.Core; - -using Xtensive.Tuples.Transform; -using System.Linq; - -namespace Xtensive.Orm -{ - /// - /// A service listening to entity change-related events in - /// and writing the information on their original version to set - /// (). - /// - public sealed class VersionCapturer : SessionBound, - IDisposable - { - private readonly VersionSet materializedVersions = new VersionSet(); - private readonly VersionSet modifiedVersions = new VersionSet(); - private readonly List removedKeys = new List(); - - /// - /// Gets the version set updated by this service. - /// - public VersionSet Versions { get; private set; } - - #region Session event handlers - - private void EntityMaterialized(object sender, EntityEventArgs e) - { - materializedVersions.Add(e.Entity, true); - } - - private void TransactionRollbacked(object sender, TransactionEventArgs transactionEventArgs) - { - removedKeys.Clear(); - modifiedVersions.Clear(); - } - - private void TransactionCommitted(object sender, TransactionEventArgs transactionEventArgs) - { - if (transactionEventArgs.Transaction.IsNested) - return; - Versions.MergeWith(materializedVersions, Session); - Versions.MergeWith(modifiedVersions, Session); - foreach (var key in removedKeys) - Versions.Remove(key); - materializedVersions.Clear(); - modifiedVersions.Clear(); - removedKeys.Clear(); - } - - private void TransactionOpened(object sender, TransactionEventArgs transactionEventArgs) - { - if (transactionEventArgs.Transaction.IsNested) - return; - Versions.MergeWith(materializedVersions, Session); - materializedVersions.Clear(); - } - - private void Persisting(object sender, EventArgs eventArgs) - { - var registry = Session.EntityChangeRegistry; - var modifiedStates = registry.GetItems(PersistenceState.Modified) - .Concat(registry.GetItems(PersistenceState.New)); - foreach (var state in modifiedStates) { - var versionTuple = state.Type.VersionExtractor.Apply(TupleTransformType.Tuple, state.Tuple); - modifiedVersions.Add(state.Key, new VersionInfo(versionTuple), true); - } - removedKeys.AddRange(registry.GetItems(PersistenceState.Removed).Select(s => s.Key)); - } - - #endregion - - #region Private methods - - private void AttachEventHandlers() - { - Session.SystemEvents.TransactionOpened += TransactionOpened; - Session.SystemEvents.TransactionCommitted +=TransactionCommitted; - Session.SystemEvents.TransactionRollbacked += TransactionRollbacked; - Session.SystemEvents.EntityMaterialized += EntityMaterialized; - Session.SystemEvents.Persisting += Persisting; - } - - private void DetachEventHandlers() - { - Session.SystemEvents.TransactionOpened -= TransactionOpened; - Session.SystemEvents.TransactionCommitted -= TransactionCommitted; - Session.SystemEvents.TransactionRollbacked -= TransactionRollbacked; - Session.SystemEvents.EntityMaterialized -= EntityMaterialized; - Session.SystemEvents.Persisting -= Persisting; - } - - #endregion - - // Factory methods - - /// - /// Attaches the version capturer to the current session. - /// - /// The to append captured versions to. - /// - /// A newly created attached - /// to the current session. - /// - [Obsolete("Use Attach(Session, VersionSet) instead")] - public static VersionCapturer Attach(VersionSet versions) - { - return Attach(Session.Demand(), versions); - } - - /// - /// Attaches the version capturer to the current session. - /// - /// The session to attach the capturer to. - /// The to append captured versions to. - /// - /// A newly created attached - /// to the specified . - /// - public static VersionCapturer Attach(Session session, VersionSet versions) - { - return new VersionCapturer(session, versions); - } - - - // Constructors - - private VersionCapturer(Session session, VersionSet versions) - : base(session) - { - ArgumentValidator.EnsureArgumentNotNull(versions, "versions"); - Versions = versions; - AttachEventHandlers(); - } - - // Dispose - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - DetachEventHandlers(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.03.01 + +using System; +using System.Collections.Generic; +using Xtensive.Core; + +using Xtensive.Tuples.Transform; +using System.Linq; + +namespace Xtensive.Orm +{ + /// + /// A service listening to entity change-related events in + /// and writing the information on their original version to set + /// (). + /// + public sealed class VersionCapturer : SessionBound, + IDisposable + { + private readonly VersionSet materializedVersions = new VersionSet(); + private readonly VersionSet modifiedVersions = new VersionSet(); + private readonly List removedKeys = new List(); + + /// + /// Gets the version set updated by this service. + /// + public VersionSet Versions { get; private set; } + + #region Session event handlers + + private void EntityMaterialized(object sender, EntityEventArgs e) + { + materializedVersions.Add(e.Entity, true); + } + + private void TransactionRollbacked(object sender, TransactionEventArgs transactionEventArgs) + { + removedKeys.Clear(); + modifiedVersions.Clear(); + } + + private void TransactionCommitted(object sender, TransactionEventArgs transactionEventArgs) + { + if (transactionEventArgs.Transaction.IsNested) + return; + Versions.MergeWith(materializedVersions, Session); + Versions.MergeWith(modifiedVersions, Session); + foreach (var key in removedKeys) + Versions.Remove(key); + materializedVersions.Clear(); + modifiedVersions.Clear(); + removedKeys.Clear(); + } + + private void TransactionOpened(object sender, TransactionEventArgs transactionEventArgs) + { + if (transactionEventArgs.Transaction.IsNested) + return; + Versions.MergeWith(materializedVersions, Session); + materializedVersions.Clear(); + } + + private void Persisting(object sender, EventArgs eventArgs) + { + var registry = Session.EntityChangeRegistry; + var modifiedStates = registry.GetItems(PersistenceState.Modified) + .Concat(registry.GetItems(PersistenceState.New)); + foreach (var state in modifiedStates) { + var versionTuple = state.Type.VersionExtractor.Apply(TupleTransformType.Tuple, state.Tuple); + modifiedVersions.Add(state.Key, new VersionInfo(versionTuple), true); + } + removedKeys.AddRange(registry.GetItems(PersistenceState.Removed).Select(s => s.Key)); + } + + #endregion + + #region Private methods + + private void AttachEventHandlers() + { + Session.SystemEvents.TransactionOpened += TransactionOpened; + Session.SystemEvents.TransactionCommitted +=TransactionCommitted; + Session.SystemEvents.TransactionRollbacked += TransactionRollbacked; + Session.SystemEvents.EntityMaterialized += EntityMaterialized; + Session.SystemEvents.Persisting += Persisting; + } + + private void DetachEventHandlers() + { + Session.SystemEvents.TransactionOpened -= TransactionOpened; + Session.SystemEvents.TransactionCommitted -= TransactionCommitted; + Session.SystemEvents.TransactionRollbacked -= TransactionRollbacked; + Session.SystemEvents.EntityMaterialized -= EntityMaterialized; + Session.SystemEvents.Persisting -= Persisting; + } + + #endregion + + // Factory methods + + /// + /// Attaches the version capturer to the current session. + /// + /// The to append captured versions to. + /// + /// A newly created attached + /// to the current session. + /// + [Obsolete("Use Attach(Session, VersionSet) instead")] + public static VersionCapturer Attach(VersionSet versions) + { + return Attach(Session.Demand(), versions); + } + + /// + /// Attaches the version capturer to the current session. + /// + /// The session to attach the capturer to. + /// The to append captured versions to. + /// + /// A newly created attached + /// to the specified . + /// + public static VersionCapturer Attach(Session session, VersionSet versions) + { + return new VersionCapturer(session, versions); + } + + + // Constructors + + private VersionCapturer(Session session, VersionSet versions) + : base(session) + { + ArgumentValidator.EnsureArgumentNotNull(versions, "versions"); + Versions = versions; + AttachEventHandlers(); + } + + // Dispose + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + DetachEventHandlers(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/VersionInfo.cs b/Orm/Xtensive.Orm/Orm/VersionInfo.cs index 4bf880c32c..bf88dc7011 100644 --- a/Orm/Xtensive.Orm/Orm/VersionInfo.cs +++ b/Orm/Xtensive.Orm/Orm/VersionInfo.cs @@ -1,197 +1,197 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.08.13 - -using System; -using System.Collections; -using System.Diagnostics; -using Xtensive.Core; - -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using System.Runtime.Serialization; - -namespace Xtensive.Orm -{ - /// - /// Contains information about entity version. - /// - [DebuggerDisplay("{Value}")] - [Serializable] - public struct VersionInfo : IEquatable - { - private static VersionInfo @void; - - [NonSerialized] - private int cachedHashCode; - private Tuple value; - - /// - /// Gets the void object. - /// - public static VersionInfo Void { - get { return @void; } - } - - /// - /// Gets a value indicating whether this instance is not contains version. - /// - public bool IsVoid { - [DebuggerStepThrough] - get { return Value==null; } - } - - internal Tuple Value { - [DebuggerStepThrough] - get { - return value; - } - } - - /// - /// Combines this version with the specified key value tuple and specified version tuple. - /// - /// The key to combine. - /// The version info to combine. - /// Combined version info. - internal VersionInfo Combine(Key key, VersionInfo versionInfo) - { - ArgumentValidator.EnsureArgumentNotNull(key, "key"); - - Tuple resultVersion = Value; - if (resultVersion==null) - resultVersion = key.Value; - else - resultVersion = resultVersion.Combine(key.Value); - if (!versionInfo.IsVoid) - resultVersion = resultVersion.Combine(versionInfo.Value); - - return new VersionInfo(resultVersion.ToRegular()); - } - - /// - /// Checks whether this - /// conflicts with . - /// There is no conflict, if all mutually available fields in - /// s are equal, and count of fields is the same. - /// - /// The other . - /// Check result. - public bool ConflictsWith(VersionInfo other) - { - if (Equals(other)) - return false; - - var tuple = Value; - var otherTuple = other.Value; - - if (tuple==null) { - if (otherTuple==null) - return false; - else - return true; - } - else if (otherTuple==null) - return true; - - if (tuple.Count!=otherTuple.Count) - return true; - - int count = tuple.Count; - var availableFlags = tuple.GetFieldStateMap(TupleFieldState.Available); - var otherAvailableFlags = otherTuple.GetFieldStateMap(TupleFieldState.Available); - - for (int i = 0; i - [DebuggerStepThrough] - public bool Equals(VersionInfo other) - { - return Equals(Value, other.Value); - } - - /// - [DebuggerStepThrough] - public override bool Equals(object obj) - { - if (ReferenceEquals(obj, null)) - return false; - if (obj.GetType()!=typeof (VersionInfo)) - return false; - if (obj.GetHashCode()!=GetHashCode()) - return false; - return Equals((VersionInfo) obj); - } - - /// - /// Implements the operator ==. - /// - /// The left. - /// The right. - /// - /// The result of the operator. - /// - public static bool operator ==(VersionInfo left, VersionInfo right) - { - return !left.ConflictsWith(right); - } - - /// - /// Implements the operator !=. - /// - /// The left. - /// The right. - /// - /// The result of the operator. - /// - public static bool operator !=(VersionInfo left, VersionInfo right) - { - return left.ConflictsWith(right); - } - - /// - [DebuggerStepThrough] - public override int GetHashCode() - { - if (cachedHashCode==0) { - if (!IsVoid) - cachedHashCode = Value.GetHashCode(); - if (cachedHashCode==0) - cachedHashCode = -1; - } - return cachedHashCode; - } - - #endregion - - /// - [DebuggerStepThrough] - public override string ToString() - { - return Value==null ? string.Empty : Value.ToString(); - } - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - /// The version tuple. - public VersionInfo(Tuple version) - { - value = version; - cachedHashCode = 0; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.08.13 + +using System; +using System.Collections; +using System.Diagnostics; +using Xtensive.Core; + +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using System.Runtime.Serialization; + +namespace Xtensive.Orm +{ + /// + /// Contains information about entity version. + /// + [DebuggerDisplay("{Value}")] + [Serializable] + public struct VersionInfo : IEquatable + { + private static VersionInfo @void; + + [NonSerialized] + private int cachedHashCode; + private Tuple value; + + /// + /// Gets the void object. + /// + public static VersionInfo Void { + get { return @void; } + } + + /// + /// Gets a value indicating whether this instance is not contains version. + /// + public bool IsVoid { + [DebuggerStepThrough] + get { return Value==null; } + } + + internal Tuple Value { + [DebuggerStepThrough] + get { + return value; + } + } + + /// + /// Combines this version with the specified key value tuple and specified version tuple. + /// + /// The key to combine. + /// The version info to combine. + /// Combined version info. + internal VersionInfo Combine(Key key, VersionInfo versionInfo) + { + ArgumentValidator.EnsureArgumentNotNull(key, "key"); + + Tuple resultVersion = Value; + if (resultVersion==null) + resultVersion = key.Value; + else + resultVersion = resultVersion.Combine(key.Value); + if (!versionInfo.IsVoid) + resultVersion = resultVersion.Combine(versionInfo.Value); + + return new VersionInfo(resultVersion.ToRegular()); + } + + /// + /// Checks whether this + /// conflicts with . + /// There is no conflict, if all mutually available fields in + /// s are equal, and count of fields is the same. + /// + /// The other . + /// Check result. + public bool ConflictsWith(VersionInfo other) + { + if (Equals(other)) + return false; + + var tuple = Value; + var otherTuple = other.Value; + + if (tuple==null) { + if (otherTuple==null) + return false; + else + return true; + } + else if (otherTuple==null) + return true; + + if (tuple.Count!=otherTuple.Count) + return true; + + int count = tuple.Count; + var availableFlags = tuple.GetFieldStateMap(TupleFieldState.Available); + var otherAvailableFlags = otherTuple.GetFieldStateMap(TupleFieldState.Available); + + for (int i = 0; i + [DebuggerStepThrough] + public bool Equals(VersionInfo other) + { + return Equals(Value, other.Value); + } + + /// + [DebuggerStepThrough] + public override bool Equals(object obj) + { + if (ReferenceEquals(obj, null)) + return false; + if (obj.GetType()!=typeof (VersionInfo)) + return false; + if (obj.GetHashCode()!=GetHashCode()) + return false; + return Equals((VersionInfo) obj); + } + + /// + /// Implements the operator ==. + /// + /// The left. + /// The right. + /// + /// The result of the operator. + /// + public static bool operator ==(VersionInfo left, VersionInfo right) + { + return !left.ConflictsWith(right); + } + + /// + /// Implements the operator !=. + /// + /// The left. + /// The right. + /// + /// The result of the operator. + /// + public static bool operator !=(VersionInfo left, VersionInfo right) + { + return left.ConflictsWith(right); + } + + /// + [DebuggerStepThrough] + public override int GetHashCode() + { + if (cachedHashCode==0) { + if (!IsVoid) + cachedHashCode = Value.GetHashCode(); + if (cachedHashCode==0) + cachedHashCode = -1; + } + return cachedHashCode; + } + + #endregion + + /// + [DebuggerStepThrough] + public override string ToString() + { + return Value==null ? string.Empty : Value.ToString(); + } + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + /// The version tuple. + public VersionInfo(Tuple version) + { + value = version; + cachedHashCode = 0; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/VersionSet.cs b/Orm/Xtensive.Orm/Orm/VersionSet.cs index 6549bdeda9..7488629619 100644 --- a/Orm/Xtensive.Orm/Orm/VersionSet.cs +++ b/Orm/Xtensive.Orm/Orm/VersionSet.cs @@ -1,328 +1,328 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.03.01 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Logging; - -namespace Xtensive.Orm -{ - /// - /// Describes a set of key-version pairs used to validate versions. - /// - [Serializable] - public sealed class VersionSet : IEnumerable> - { - private Dictionary, VersionInfo> versions = - new Dictionary, VersionInfo>(); - - /// - public long Count { - get { return versions.Count; } - } - - /// - /// Gets the by the specified key. - /// If there is no such , it returns . - /// - public VersionInfo this[Key key] { - get { - return Get(key); - } - } - - /// - /// Gets the for the specified - /// . - /// If there is no such , it returns . - /// - /// The entity to get associated for. - /// Associated , if found; - /// otherwise, . - public VersionInfo Get(Entity entity) - { - return Get(entity!=null ? entity.Key : null); - } - - /// - /// Gets the by the specified key. - /// If there is no such , it returns . - /// - /// The key to get associated for. - /// Associated , if found; - /// otherwise, . - public VersionInfo Get(Key key) - { - VersionInfo result; - if (versions.TryGetValue(key, out result)) - return result; - else - return VersionInfo.Void; - } - - /// - /// Determines whether this set contains the key of the specified entity. - /// - /// The entity to check the key for containment. - /// Check result. - public bool Contains(Entity entity) - { - if (entity==null) - return false; - return Contains(entity.Key); - } - - /// - /// Determines whether this set contains the specified key. - /// - /// The key to check for containment. - /// Check result. - public bool Contains(Key key) - { - if (key==null) - return false; - return versions.ContainsKey(key); - } - - #region Validate methods - - /// - /// Validates version of the specified . - /// - /// The entity to validate version for. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - public bool Validate(Entity entity) - { - ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); - return Validate(entity.Key, entity.VersionInfo); - } - - /// - /// Validates version of the specified . - /// - /// The entity to validate version for. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - public bool Validate(Entity entity, bool throwOnFailure) - { - ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); - return Validate(entity.Key, entity.VersionInfo, throwOnFailure); - } - - /// - /// Validates the - /// for the specified . - /// - /// The key to validate version for. - /// The version to validate. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - public bool Validate(Key key, VersionInfo version) - { - var expectedVersion = Get(key); - if (expectedVersion.IsVoid) - return true; - else - return expectedVersion==version; - } - - /// - /// Validates the - /// for the specified . - /// - /// The key to validate version for. - /// The version to validate. - /// Indicates whether - /// must be thrown on validation failure. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - /// Version conflict is detected. - public bool Validate(Key key, VersionInfo version, bool throwOnFailure) - { - var result = Validate(key, version); - if (throwOnFailure && !result) { - if (OrmLog.IsLogged(LogLevel.Info)) - OrmLog.Info(Strings.LogSessionXVersionValidationFailedKeyYVersionZExpected3, - "None (VersionSet)", key, version, Get(key)); - throw new VersionConflictException(string.Format( - Strings.ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne, key)); - } - return result; - } - - #endregion - - #region Add, Remove, Clear methods - - /// - /// Adds key and pair - /// of the specified to this set. - /// - /// The entity to add version of. - /// Indicates whether to overwrite an existing - /// key-version pair or not, if it exists. - /// , if operation was successful; - /// otherwise, . - public bool Add(Entity entity, bool overwrite) - { - ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); - var key = entity.Key; - var version = entity.VersionInfo; - return Add(key, version, overwrite); - } - - /// - /// Adds the specified key and pair to this set. - /// - /// The key. - /// The version related to this key. - /// Indicates whether to overwrite an existing - /// key-version pair or not, if it exists. - /// , if operation was successful; - /// otherwise, . - public bool Add(Key key, VersionInfo version, bool overwrite) - { - ArgumentValidator.EnsureArgumentNotNull(key, "key"); - if (!Contains(key)) { - if (version.IsVoid) - return false; - else { - versions.Add(key, version); - return true; - } - } - else if (overwrite) { - if (version.IsVoid) - versions.Remove(key); - else - versions[key] = version; - return true; - } - else - return false; - } - - /// - /// Removed the key and pair - /// of the specified from this set. - /// - /// The entity to remove the key-version pair of. - /// , if operation was successful; - /// otherwise, . - public bool Remove(Entity entity) - { - ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); - return Remove(entity.Key); - } - - /// - /// Removed the specified key and pair from this set. - /// - /// The key. - /// , if operation was successful; - /// otherwise, . - public bool Remove(Key key) - { - ArgumentValidator.EnsureArgumentNotNull(key, "key"); - if (Contains(key)) { - versions.Remove(key); - return true; - } - return false; - } - - /// - /// Clears this set. - /// - public void Clear() - { - versions.Clear(); - } - - #endregion - - /// - /// Merges the current with provided one. - /// - /// The other . - /// - public void MergeWith(VersionSet other, Session session) - { - foreach (var pair in other.versions.Where(p => session.EntityStateCache.ContainsKey(p.Key.Key))) - versions[pair.Key] = pair.Value; - } - - #region IEnumerable<...> methods - - /// - public IEnumerator> GetEnumerator() - { - foreach (var pair in versions) - yield return new KeyValuePair(pair.Key, pair.Value); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion - - - // Constructors - - /// - /// Initializes a new instance of this class. - /// - public VersionSet() - { - } - - /// - /// Initializes a new instance of this class. - /// - /// Initial content. - public VersionSet(params Entity[] source) - { - foreach (var entity in source) - Add(entity, true); - } - - /// - /// Initializes a new instance of this class. - /// - /// Initial content. - public VersionSet(IEnumerable source) - { - foreach (var entity in source) - Add(entity, true); - } - - /// - /// Initializes a new instance of this class. - /// - /// Initial content. - public VersionSet(IEnumerable> source) - { - foreach (var pair in source) - Add(pair.Key, pair.Value, true); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.03.01 + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Logging; + +namespace Xtensive.Orm +{ + /// + /// Describes a set of key-version pairs used to validate versions. + /// + [Serializable] + public sealed class VersionSet : IEnumerable> + { + private Dictionary, VersionInfo> versions = + new Dictionary, VersionInfo>(); + + /// + public long Count { + get { return versions.Count; } + } + + /// + /// Gets the by the specified key. + /// If there is no such , it returns . + /// + public VersionInfo this[Key key] { + get { + return Get(key); + } + } + + /// + /// Gets the for the specified + /// . + /// If there is no such , it returns . + /// + /// The entity to get associated for. + /// Associated , if found; + /// otherwise, . + public VersionInfo Get(Entity entity) + { + return Get(entity!=null ? entity.Key : null); + } + + /// + /// Gets the by the specified key. + /// If there is no such , it returns . + /// + /// The key to get associated for. + /// Associated , if found; + /// otherwise, . + public VersionInfo Get(Key key) + { + VersionInfo result; + if (versions.TryGetValue(key, out result)) + return result; + else + return VersionInfo.Void; + } + + /// + /// Determines whether this set contains the key of the specified entity. + /// + /// The entity to check the key for containment. + /// Check result. + public bool Contains(Entity entity) + { + if (entity==null) + return false; + return Contains(entity.Key); + } + + /// + /// Determines whether this set contains the specified key. + /// + /// The key to check for containment. + /// Check result. + public bool Contains(Key key) + { + if (key==null) + return false; + return versions.ContainsKey(key); + } + + #region Validate methods + + /// + /// Validates version of the specified . + /// + /// The entity to validate version for. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + public bool Validate(Entity entity) + { + ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); + return Validate(entity.Key, entity.VersionInfo); + } + + /// + /// Validates version of the specified . + /// + /// The entity to validate version for. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + public bool Validate(Entity entity, bool throwOnFailure) + { + ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); + return Validate(entity.Key, entity.VersionInfo, throwOnFailure); + } + + /// + /// Validates the + /// for the specified . + /// + /// The key to validate version for. + /// The version to validate. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + public bool Validate(Key key, VersionInfo version) + { + var expectedVersion = Get(key); + if (expectedVersion.IsVoid) + return true; + else + return expectedVersion==version; + } + + /// + /// Validates the + /// for the specified . + /// + /// The key to validate version for. + /// The version to validate. + /// Indicates whether + /// must be thrown on validation failure. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + /// Version conflict is detected. + public bool Validate(Key key, VersionInfo version, bool throwOnFailure) + { + var result = Validate(key, version); + if (throwOnFailure && !result) { + if (OrmLog.IsLogged(LogLevel.Info)) + OrmLog.Info(Strings.LogSessionXVersionValidationFailedKeyYVersionZExpected3, + "None (VersionSet)", key, version, Get(key)); + throw new VersionConflictException(string.Format( + Strings.ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne, key)); + } + return result; + } + + #endregion + + #region Add, Remove, Clear methods + + /// + /// Adds key and pair + /// of the specified to this set. + /// + /// The entity to add version of. + /// Indicates whether to overwrite an existing + /// key-version pair or not, if it exists. + /// , if operation was successful; + /// otherwise, . + public bool Add(Entity entity, bool overwrite) + { + ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); + var key = entity.Key; + var version = entity.VersionInfo; + return Add(key, version, overwrite); + } + + /// + /// Adds the specified key and pair to this set. + /// + /// The key. + /// The version related to this key. + /// Indicates whether to overwrite an existing + /// key-version pair or not, if it exists. + /// , if operation was successful; + /// otherwise, . + public bool Add(Key key, VersionInfo version, bool overwrite) + { + ArgumentValidator.EnsureArgumentNotNull(key, "key"); + if (!Contains(key)) { + if (version.IsVoid) + return false; + else { + versions.Add(key, version); + return true; + } + } + else if (overwrite) { + if (version.IsVoid) + versions.Remove(key); + else + versions[key] = version; + return true; + } + else + return false; + } + + /// + /// Removed the key and pair + /// of the specified from this set. + /// + /// The entity to remove the key-version pair of. + /// , if operation was successful; + /// otherwise, . + public bool Remove(Entity entity) + { + ArgumentValidator.EnsureArgumentNotNull(entity, "entity"); + return Remove(entity.Key); + } + + /// + /// Removed the specified key and pair from this set. + /// + /// The key. + /// , if operation was successful; + /// otherwise, . + public bool Remove(Key key) + { + ArgumentValidator.EnsureArgumentNotNull(key, "key"); + if (Contains(key)) { + versions.Remove(key); + return true; + } + return false; + } + + /// + /// Clears this set. + /// + public void Clear() + { + versions.Clear(); + } + + #endregion + + /// + /// Merges the current with provided one. + /// + /// The other . + /// + public void MergeWith(VersionSet other, Session session) + { + foreach (var pair in other.versions.Where(p => session.EntityStateCache.ContainsKey(p.Key.Key))) + versions[pair.Key] = pair.Value; + } + + #region IEnumerable<...> methods + + /// + public IEnumerator> GetEnumerator() + { + foreach (var pair in versions) + yield return new KeyValuePair(pair.Key, pair.Value); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + + + // Constructors + + /// + /// Initializes a new instance of this class. + /// + public VersionSet() + { + } + + /// + /// Initializes a new instance of this class. + /// + /// Initial content. + public VersionSet(params Entity[] source) + { + foreach (var entity in source) + Add(entity, true); + } + + /// + /// Initializes a new instance of this class. + /// + /// Initial content. + public VersionSet(IEnumerable source) + { + foreach (var entity in source) + Add(entity, true); + } + + /// + /// Initializes a new instance of this class. + /// + /// Initial content. + public VersionSet(IEnumerable> source) + { + foreach (var pair in source) + Add(pair.Key, pair.Value, true); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/VersionValidator.cs b/Orm/Xtensive.Orm/Orm/VersionValidator.cs index c9aeb237e4..190bbdb28e 100644 --- a/Orm/Xtensive.Orm/Orm/VersionValidator.cs +++ b/Orm/Xtensive.Orm/Orm/VersionValidator.cs @@ -1,392 +1,392 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.11.10 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm.Logging; - -using Xtensive.Tuples; -using Tuple = Xtensive.Tuples.Tuple; -using Xtensive.Tuples.Transform; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Model; - -using Xtensive.Orm.Rse; - -namespace Xtensive.Orm -{ - /// - /// An attachable service validating versions inside the specified . - /// - public sealed class VersionValidator : SessionBound, - IDisposable - { - private HashSet processed = new HashSet(); - private Dictionary knownVersions; - private Dictionary queuedVersions; - private Dictionary fetchVersionTasks; - private readonly Func expectedVersionProvider; - private bool isAttached; - - /// - /// Validates the - /// for the specified . - /// - /// The key to validate version for. - /// The version to validate. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - public bool ValidateVersion(Key key, VersionInfo version) - { - var expectedVersion = expectedVersionProvider.Invoke(key); - return expectedVersion.IsVoid || expectedVersion == version; - } - - /// - /// Validates the - /// for the specified . - /// - /// The key to validate version for. - /// The version to validate. - /// Indicates whether - /// must be thrown on validation failure. - /// - /// , if validation passes successfully; - /// otherwise, . - /// - /// Version conflict is detected. - public bool ValidateVersion(Key key, VersionInfo version, bool throwOnFailure) - { - var result = ValidateVersion(key, version); - if (throwOnFailure && !result) { - if (OrmLog.IsLogged(LogLevel.Info)) - OrmLog.Info(Strings.LogSessionXVersionValidationFailedKeyYVersionZExpected3, - Session, key, version, expectedVersionProvider.Invoke(key)); - throw new VersionConflictException(string.Format( - Strings.ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne, key)); - } - return result; - } - - #region Validator logic - - private void Initialize() - { - knownVersions = new Dictionary(); - processed = new HashSet(); - } - - private void FetchVersions() - { - queuedVersions = new Dictionary(); - fetchVersionTasks = new Dictionary(); - - var registry = Session.EntityChangeRegistry; - foreach (var item in registry.GetItems(PersistenceState.New)) - processed.Add(item.Key); - foreach (var item in registry.GetItems(PersistenceState.Modified)) { - EnqueueVersionValidation(item); - processed.Add(item.Key); - } - foreach (var item in registry.GetItems(PersistenceState.Removed)) { - EnqueueVersionValidation(item); - processed.Add(item.Key); - } - if (fetchVersionTasks.Count > 0) - Session.Handler.ExecuteQueryTasks(fetchVersionTasks.Values, true); - } - - private void FetchLeftVersions() - { - queuedVersions = new Dictionary(); - fetchVersionTasks = new Dictionary(); - - foreach (var pair in knownVersions) { - EnqueueVersionValidation(pair.Key); - processed.Add(pair.Key); - } - if (fetchVersionTasks.Count > 0) - Session.Handler.ExecuteQueryTasks(fetchVersionTasks.Values, true); - } - - private void EnqueueVersionValidation(EntityState state) - { - if (state.Type.VersionExtractor==null - || queuedVersions.ContainsKey(state.Key) - || processed.Contains(state.Key)) - return; - VersionInfo version; - if (knownVersions.TryGetValue(state.Key, out version)) - queuedVersions.Add(state.Key, version); - else { - var task = CreateFetchVersionTask(state.Key); - Session.RegisterInternalDelayedQuery(task); - fetchVersionTasks.Add(state.Key, task); - } - } - - private void EnqueueVersionValidation(Key key) - { - if (processed.Contains(key)) - return; - var task = CreateFetchVersionTask(key); - Session.RegisterInternalDelayedQuery(task); - fetchVersionTasks.Add(key, task); - } - - private QueryTask CreateFetchVersionTask(Key key) - { - var type = key.TypeInfo; - var provider = type.Indexes.PrimaryIndex.GetQuery().Seek(key.Value); - var execProvider = Session.Compile(provider); - return new QueryTask(execProvider, Session.GetLifetimeToken(), null); - } - - private void ValidateFetchedVersions() - { - Session.ExecuteInternalDelayedQueries(true); - if (fetchVersionTasks.Count > 0) - foreach (var task in fetchVersionTasks) { - var key = task.Key; - var version = ExtractVersion(task.Key.TypeInfo, task.Value.Result.FirstOrDefault()); - queuedVersions.Add(key, version); - } - foreach (var pair in queuedVersions) - ValidateVersion(pair.Key, pair.Value, true); - } - - private static VersionInfo ExtractVersion(TypeInfo type, Tuple state) - { - if (state==null) - return VersionInfo.Void; - var versionTuple = type.VersionExtractor.Apply(TupleTransformType.Tuple, state); - return new VersionInfo(versionTuple); - } - - private void DropFetchVersionsData() - { - queuedVersions = null; - fetchVersionTasks = null; - } - - #endregion - - #region Event handlers - - private void OnTransactionOpened(object sender, TransactionEventArgs e) - { - if (e.Transaction.IsNested) - return; - Initialize(); - } - - private void OnTransactionCommitting(object sender, TransactionEventArgs e) - { - if (e.Transaction.IsNested) - return; - Session.Persist(PersistReason.ValidateVersions); - try { - FetchLeftVersions(); - ValidateFetchedVersions(); - } - finally { - DropFetchVersionsData(); - } - } - - private void OnTransactionClosed(object sender, TransactionEventArgs e) - { - if (e.Transaction.IsNested) - return; - processed = null; - knownVersions = null; - } - - private void OnEntityVersionInfoChanging(object sender, EntityVersionInfoChangedEventArgs e) - { - OnEntityChanging(e.Entity); - } - - private void OnEntityRemoving(object sender, EntityEventArgs e) - { - OnEntityChanging(e.Entity); - } - - private void OnEntityChanging(Entity entity) - { - // "return" here means "we can't rely on Entity.VersionInfo, - // and so it must be fetched on Session.Persist, or - // there is nothing to validate" - if (entity.PersistenceState==PersistenceState.New) - return; - if (entity.TypeInfo.VersionExtractor==null) - return; - if (entity.State.IsStale && !entity.TypeInfo.HasVersionRoots) - return; - // Here we know the actual version is stored in VersionInfo - if (knownVersions.ContainsKey(entity.Key)) - return; - if (processed.Contains(entity.Key)) - return; - knownVersions.Add(entity.Key, entity.VersionInfo); - } - - private void OnPersisting(object sender, EventArgs e) - { - FetchVersions(); - } - - private void OnPersisted(object sender, EventArgs e) - { - try { - ValidateFetchedVersions(); - } - finally { - DropFetchVersionsData(); - } - } - - #endregion - - #region AttachEventHandlers \ DetachEventHandlers methods - - private void AttachEventHandlers() - { - if (isAttached) - throw new InvalidOperationException(Strings.ExTheServiceIsAlreadyAttachedToSession); - isAttached = true; - try { - Session.SystemEvents.TransactionOpened += OnTransactionOpened; - Session.SystemEvents.TransactionCommitting += OnTransactionCommitting; - Session.SystemEvents.TransactionCommitted += OnTransactionClosed; - Session.SystemEvents.TransactionRollbacked += OnTransactionClosed; - Session.SystemEvents.EntityVersionInfoChanging += OnEntityVersionInfoChanging; - Session.SystemEvents.EntityRemoving += OnEntityRemoving; - Session.SystemEvents.Persisting += OnPersisting; - Session.SystemEvents.Persisted += OnPersisted; - } - catch { - DetachEventHandlers(); - throw; - } - } - - private void DetachEventHandlers() - { - if (isAttached) { - isAttached = false; - Session.SystemEvents.TransactionOpened -= OnTransactionOpened; - Session.SystemEvents.TransactionCommitting -= OnTransactionCommitting; - Session.SystemEvents.TransactionCommitted -= OnTransactionClosed; - Session.SystemEvents.TransactionRollbacked -= OnTransactionClosed; - Session.SystemEvents.EntityVersionInfoChanging -= OnEntityVersionInfoChanging; - Session.SystemEvents.EntityRemoving -= OnEntityRemoving; - Session.SystemEvents.Persisting -= OnPersisting; - Session.SystemEvents.Persisted -= OnPersisted; - } - } - - #endregion - - #region Attach methods (factory methods) - - /// - /// Attaches the validator to the current session. - /// - /// The set containing expected versions. - /// - /// A newly created attached - /// to the current session. - /// - [Obsolete("Use Attach(Session, VersionSet) instead")] - public static VersionValidator Attach(VersionSet expectedVersions) - { - return Attach(Session.Demand(), expectedVersions); - } - - /// - /// Attaches the validator to the specified session. - /// - /// The session to attach validator to. - /// The set containing expected versions. - /// - /// A newly created attached - /// to the specified . - /// - public static VersionValidator Attach(Session session, VersionSet expectedVersions) - { - return new VersionValidator(session, expectedVersions.Get); - } - - /// - /// Attaches the validator to the current session. - /// - /// The expected version provider. - /// A newly created attached - /// to the current session. - [Obsolete("Use Attach(Session, Func) instead")] - public static VersionValidator Attach(Func expectedVersionProvider) - { - return Attach(Session.Demand(), expectedVersionProvider); - } - - /// - /// Attaches the validator to the specified session. - /// - /// The session to attach validator to. - /// The expected version provider. - /// A newly created attached - /// to the specified . - public static VersionValidator Attach(Session session, Func expectedVersionProvider) - { - return new VersionValidator(session, expectedVersionProvider); - } - - #endregion - - - // Constructors - - /// Session is persisting the changes. - private VersionValidator(Session session, Func expectedVersionProvider) - : base(session) - { - ArgumentValidator.EnsureArgumentNotNull(expectedVersionProvider, "expectedVersionProvider"); - if (session.IsPersisting) - throw new InvalidOperationException( - Strings.ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges); - - this.expectedVersionProvider = expectedVersionProvider; - AttachEventHandlers(); - if (session.Transaction!=null) - Initialize(); - } - - // Dispose - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - try { - if (Session.Transaction!=null) { - Session.Persist(PersistReason.ValidateVersions); - FetchLeftVersions(); - ValidateFetchedVersions(); - } - } - finally { - DropFetchVersionsData(); - DetachEventHandlers(); - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.11.10 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm.Logging; + +using Xtensive.Tuples; +using Tuple = Xtensive.Tuples.Tuple; +using Xtensive.Tuples.Transform; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Model; + +using Xtensive.Orm.Rse; + +namespace Xtensive.Orm +{ + /// + /// An attachable service validating versions inside the specified . + /// + public sealed class VersionValidator : SessionBound, + IDisposable + { + private HashSet processed = new HashSet(); + private Dictionary knownVersions; + private Dictionary queuedVersions; + private Dictionary fetchVersionTasks; + private readonly Func expectedVersionProvider; + private bool isAttached; + + /// + /// Validates the + /// for the specified . + /// + /// The key to validate version for. + /// The version to validate. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + public bool ValidateVersion(Key key, VersionInfo version) + { + var expectedVersion = expectedVersionProvider.Invoke(key); + return expectedVersion.IsVoid || expectedVersion == version; + } + + /// + /// Validates the + /// for the specified . + /// + /// The key to validate version for. + /// The version to validate. + /// Indicates whether + /// must be thrown on validation failure. + /// + /// , if validation passes successfully; + /// otherwise, . + /// + /// Version conflict is detected. + public bool ValidateVersion(Key key, VersionInfo version, bool throwOnFailure) + { + var result = ValidateVersion(key, version); + if (throwOnFailure && !result) { + if (OrmLog.IsLogged(LogLevel.Info)) + OrmLog.Info(Strings.LogSessionXVersionValidationFailedKeyYVersionZExpected3, + Session, key, version, expectedVersionProvider.Invoke(key)); + throw new VersionConflictException(string.Format( + Strings.ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne, key)); + } + return result; + } + + #region Validator logic + + private void Initialize() + { + knownVersions = new Dictionary(); + processed = new HashSet(); + } + + private void FetchVersions() + { + queuedVersions = new Dictionary(); + fetchVersionTasks = new Dictionary(); + + var registry = Session.EntityChangeRegistry; + foreach (var item in registry.GetItems(PersistenceState.New)) + processed.Add(item.Key); + foreach (var item in registry.GetItems(PersistenceState.Modified)) { + EnqueueVersionValidation(item); + processed.Add(item.Key); + } + foreach (var item in registry.GetItems(PersistenceState.Removed)) { + EnqueueVersionValidation(item); + processed.Add(item.Key); + } + if (fetchVersionTasks.Count > 0) + Session.Handler.ExecuteQueryTasks(fetchVersionTasks.Values, true); + } + + private void FetchLeftVersions() + { + queuedVersions = new Dictionary(); + fetchVersionTasks = new Dictionary(); + + foreach (var pair in knownVersions) { + EnqueueVersionValidation(pair.Key); + processed.Add(pair.Key); + } + if (fetchVersionTasks.Count > 0) + Session.Handler.ExecuteQueryTasks(fetchVersionTasks.Values, true); + } + + private void EnqueueVersionValidation(EntityState state) + { + if (state.Type.VersionExtractor==null + || queuedVersions.ContainsKey(state.Key) + || processed.Contains(state.Key)) + return; + VersionInfo version; + if (knownVersions.TryGetValue(state.Key, out version)) + queuedVersions.Add(state.Key, version); + else { + var task = CreateFetchVersionTask(state.Key); + Session.RegisterInternalDelayedQuery(task); + fetchVersionTasks.Add(state.Key, task); + } + } + + private void EnqueueVersionValidation(Key key) + { + if (processed.Contains(key)) + return; + var task = CreateFetchVersionTask(key); + Session.RegisterInternalDelayedQuery(task); + fetchVersionTasks.Add(key, task); + } + + private QueryTask CreateFetchVersionTask(Key key) + { + var type = key.TypeInfo; + var provider = type.Indexes.PrimaryIndex.GetQuery().Seek(key.Value); + var execProvider = Session.Compile(provider); + return new QueryTask(execProvider, Session.GetLifetimeToken(), null); + } + + private void ValidateFetchedVersions() + { + Session.ExecuteInternalDelayedQueries(true); + if (fetchVersionTasks.Count > 0) + foreach (var task in fetchVersionTasks) { + var key = task.Key; + var version = ExtractVersion(task.Key.TypeInfo, task.Value.Result.FirstOrDefault()); + queuedVersions.Add(key, version); + } + foreach (var pair in queuedVersions) + ValidateVersion(pair.Key, pair.Value, true); + } + + private static VersionInfo ExtractVersion(TypeInfo type, Tuple state) + { + if (state==null) + return VersionInfo.Void; + var versionTuple = type.VersionExtractor.Apply(TupleTransformType.Tuple, state); + return new VersionInfo(versionTuple); + } + + private void DropFetchVersionsData() + { + queuedVersions = null; + fetchVersionTasks = null; + } + + #endregion + + #region Event handlers + + private void OnTransactionOpened(object sender, TransactionEventArgs e) + { + if (e.Transaction.IsNested) + return; + Initialize(); + } + + private void OnTransactionCommitting(object sender, TransactionEventArgs e) + { + if (e.Transaction.IsNested) + return; + Session.Persist(PersistReason.ValidateVersions); + try { + FetchLeftVersions(); + ValidateFetchedVersions(); + } + finally { + DropFetchVersionsData(); + } + } + + private void OnTransactionClosed(object sender, TransactionEventArgs e) + { + if (e.Transaction.IsNested) + return; + processed = null; + knownVersions = null; + } + + private void OnEntityVersionInfoChanging(object sender, EntityVersionInfoChangedEventArgs e) + { + OnEntityChanging(e.Entity); + } + + private void OnEntityRemoving(object sender, EntityEventArgs e) + { + OnEntityChanging(e.Entity); + } + + private void OnEntityChanging(Entity entity) + { + // "return" here means "we can't rely on Entity.VersionInfo, + // and so it must be fetched on Session.Persist, or + // there is nothing to validate" + if (entity.PersistenceState==PersistenceState.New) + return; + if (entity.TypeInfo.VersionExtractor==null) + return; + if (entity.State.IsStale && !entity.TypeInfo.HasVersionRoots) + return; + // Here we know the actual version is stored in VersionInfo + if (knownVersions.ContainsKey(entity.Key)) + return; + if (processed.Contains(entity.Key)) + return; + knownVersions.Add(entity.Key, entity.VersionInfo); + } + + private void OnPersisting(object sender, EventArgs e) + { + FetchVersions(); + } + + private void OnPersisted(object sender, EventArgs e) + { + try { + ValidateFetchedVersions(); + } + finally { + DropFetchVersionsData(); + } + } + + #endregion + + #region AttachEventHandlers \ DetachEventHandlers methods + + private void AttachEventHandlers() + { + if (isAttached) + throw new InvalidOperationException(Strings.ExTheServiceIsAlreadyAttachedToSession); + isAttached = true; + try { + Session.SystemEvents.TransactionOpened += OnTransactionOpened; + Session.SystemEvents.TransactionCommitting += OnTransactionCommitting; + Session.SystemEvents.TransactionCommitted += OnTransactionClosed; + Session.SystemEvents.TransactionRollbacked += OnTransactionClosed; + Session.SystemEvents.EntityVersionInfoChanging += OnEntityVersionInfoChanging; + Session.SystemEvents.EntityRemoving += OnEntityRemoving; + Session.SystemEvents.Persisting += OnPersisting; + Session.SystemEvents.Persisted += OnPersisted; + } + catch { + DetachEventHandlers(); + throw; + } + } + + private void DetachEventHandlers() + { + if (isAttached) { + isAttached = false; + Session.SystemEvents.TransactionOpened -= OnTransactionOpened; + Session.SystemEvents.TransactionCommitting -= OnTransactionCommitting; + Session.SystemEvents.TransactionCommitted -= OnTransactionClosed; + Session.SystemEvents.TransactionRollbacked -= OnTransactionClosed; + Session.SystemEvents.EntityVersionInfoChanging -= OnEntityVersionInfoChanging; + Session.SystemEvents.EntityRemoving -= OnEntityRemoving; + Session.SystemEvents.Persisting -= OnPersisting; + Session.SystemEvents.Persisted -= OnPersisted; + } + } + + #endregion + + #region Attach methods (factory methods) + + /// + /// Attaches the validator to the current session. + /// + /// The set containing expected versions. + /// + /// A newly created attached + /// to the current session. + /// + [Obsolete("Use Attach(Session, VersionSet) instead")] + public static VersionValidator Attach(VersionSet expectedVersions) + { + return Attach(Session.Demand(), expectedVersions); + } + + /// + /// Attaches the validator to the specified session. + /// + /// The session to attach validator to. + /// The set containing expected versions. + /// + /// A newly created attached + /// to the specified . + /// + public static VersionValidator Attach(Session session, VersionSet expectedVersions) + { + return new VersionValidator(session, expectedVersions.Get); + } + + /// + /// Attaches the validator to the current session. + /// + /// The expected version provider. + /// A newly created attached + /// to the current session. + [Obsolete("Use Attach(Session, Func) instead")] + public static VersionValidator Attach(Func expectedVersionProvider) + { + return Attach(Session.Demand(), expectedVersionProvider); + } + + /// + /// Attaches the validator to the specified session. + /// + /// The session to attach validator to. + /// The expected version provider. + /// A newly created attached + /// to the specified . + public static VersionValidator Attach(Session session, Func expectedVersionProvider) + { + return new VersionValidator(session, expectedVersionProvider); + } + + #endregion + + + // Constructors + + /// Session is persisting the changes. + private VersionValidator(Session session, Func expectedVersionProvider) + : base(session) + { + ArgumentValidator.EnsureArgumentNotNull(expectedVersionProvider, "expectedVersionProvider"); + if (session.IsPersisting) + throw new InvalidOperationException( + Strings.ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges); + + this.expectedVersionProvider = expectedVersionProvider; + AttachEventHandlers(); + if (session.Transaction!=null) + Initialize(); + } + + // Dispose + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + try { + if (Session.Transaction!=null) { + Session.Persist(PersistReason.ValidateVersions); + FetchLeftVersions(); + ValidateFetchedVersions(); + } + } + finally { + DropFetchVersionsData(); + DetachEventHandlers(); + } + } + } +} diff --git a/Orm/Xtensive.Orm/Orm/Weaving/EntityInterfaceAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/EntityInterfaceAttribute.cs index c94bb49b3d..9a4d317a08 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/EntityInterfaceAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/EntityInterfaceAttribute.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.26 - -using System; -using JetBrains.Annotations; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Identifies persistent interface. - /// You should not use this attribute directly. - /// It is automatically applied to your types when needed. - /// - [AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] - [UsedImplicitly] - public sealed class EntityInterfaceAttribute : Attribute - { - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.26 + +using System; +using JetBrains.Annotations; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Identifies persistent interface. + /// You should not use this attribute directly. + /// It is automatically applied to your types when needed. + /// + [AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] + [UsedImplicitly] + public sealed class EntityInterfaceAttribute : Attribute + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Weaving/EntitySetTypeAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/EntitySetTypeAttribute.cs index ec8ca937d6..5b51376aa1 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/EntitySetTypeAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/EntitySetTypeAttribute.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.22 - -using System; -using JetBrains.Annotations; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Identifies persistent type. - /// You should not use this attribute directly. - /// It is automatically applied to your types when needed. - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] - [UsedImplicitly] - public sealed class EntitySetTypeAttribute : Attribute - { - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.22 + +using System; +using JetBrains.Annotations; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Identifies persistent type. + /// You should not use this attribute directly. + /// It is automatically applied to your types when needed. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] + [UsedImplicitly] + public sealed class EntitySetTypeAttribute : Attribute + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Weaving/EntityTypeAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/EntityTypeAttribute.cs index 9735c6a9c0..6e61dee0b4 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/EntityTypeAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/EntityTypeAttribute.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using JetBrains.Annotations; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Identifies persistent type. - /// You should not use this attribute directly. - /// It is automatically applied to your types when needed. - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] - [UsedImplicitly] - public sealed class EntityTypeAttribute : Attribute - { - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using JetBrains.Annotations; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Identifies persistent type. + /// You should not use this attribute directly. + /// It is automatically applied to your types when needed. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] + [UsedImplicitly] + public sealed class EntityTypeAttribute : Attribute + { + } +} diff --git a/Orm/Xtensive.Orm/Orm/Weaving/OverrideFieldNameAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/OverrideFieldNameAttribute.cs index b8c373349f..a7234faae8 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/OverrideFieldNameAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/OverrideFieldNameAttribute.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2010.07.13 - -using System; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Overrides field name for persistence purposes. - /// You should not use this attribute directly. - /// It is automatically applied to your types when needed. - /// - [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] - public sealed class OverrideFieldNameAttribute : Attribute - { - /// - /// Gets or sets the name. - /// - public string Name { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - public OverrideFieldNameAttribute(string name) - { - Name = name; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2010.07.13 + +using System; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Overrides field name for persistence purposes. + /// You should not use this attribute directly. + /// It is automatically applied to your types when needed. + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] + public sealed class OverrideFieldNameAttribute : Attribute + { + /// + /// Gets or sets the name. + /// + public string Name { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public OverrideFieldNameAttribute(string name) + { + Name = name; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Weaving/PersistenceImplementation.cs b/Orm/Xtensive.Orm/Orm/Weaving/PersistenceImplementation.cs index 5212c35ceb..0d1b2462a0 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/PersistenceImplementation.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/PersistenceImplementation.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.27 - -using System; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Helpers routines for persistence weaver. - /// You should not use this type manually. - /// All required invocations are injected automatically. - /// - public static class PersistenceImplementation - { - /// - /// Processes an attempt to call key setter by throwing . - /// - /// Persistent type name. - /// Persistent property name. - public static void HandleKeySet(string typeName, string propertyName) - { - throw new NotSupportedException(string.Format(Strings.ExKeyFieldXInTypeYShouldNotHaveSetAccessor, propertyName, typeName)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.27 + +using System; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Helpers routines for persistence weaver. + /// You should not use this type manually. + /// All required invocations are injected automatically. + /// + public static class PersistenceImplementation + { + /// + /// Processes an attempt to call key setter by throwing . + /// + /// Persistent type name. + /// Persistent property name. + public static void HandleKeySet(string typeName, string propertyName) + { + throw new NotSupportedException(string.Format(Strings.ExKeyFieldXInTypeYShouldNotHaveSetAccessor, propertyName, typeName)); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Weaving/ProcessedByWeaverAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/ProcessedByWeaverAttribute.cs index 5563b310a1..8d9ff89f59 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/ProcessedByWeaverAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/ProcessedByWeaverAttribute.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using JetBrains.Annotations; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Identifies assembly processed by DataObjects.Net weaver. - /// You should not use this attribute directly. - /// It is automatically applied to your assembly when needed. - /// - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = false)] - [UsedImplicitly] - public sealed class ProcessedByWeaverAttribute : Attribute - { - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using JetBrains.Annotations; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Identifies assembly processed by DataObjects.Net weaver. + /// You should not use this attribute directly. + /// It is automatically applied to your assembly when needed. + /// + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = false)] + [UsedImplicitly] + public sealed class ProcessedByWeaverAttribute : Attribute + { + } +} diff --git a/Orm/Xtensive.Orm/Orm/Weaving/StructureTypeAttribute.cs b/Orm/Xtensive.Orm/Orm/Weaving/StructureTypeAttribute.cs index 0be04d804c..1ed187cd44 100644 --- a/Orm/Xtensive.Orm/Orm/Weaving/StructureTypeAttribute.cs +++ b/Orm/Xtensive.Orm/Orm/Weaving/StructureTypeAttribute.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using JetBrains.Annotations; - -namespace Xtensive.Orm.Weaving -{ - /// - /// Identifies persistent type. - /// You should not use this attribute directly. - /// It is automatically applied to your types when needed. - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] - [UsedImplicitly] - public sealed class StructureTypeAttribute : Attribute - { - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using JetBrains.Annotations; + +namespace Xtensive.Orm.Weaving +{ + /// + /// Identifies persistent type. + /// You should not use this attribute directly. + /// It is automatically applied to your types when needed. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] + [UsedImplicitly] + public sealed class StructureTypeAttribute : Attribute + { + } +} diff --git a/Orm/Xtensive.Orm/Orm/WellKnown.cs b/Orm/Xtensive.Orm/Orm/WellKnown.cs index 7820d5dfb1..3ee5bf6f3e 100644 --- a/Orm/Xtensive.Orm/Orm/WellKnown.cs +++ b/Orm/Xtensive.Orm/Orm/WellKnown.cs @@ -1,245 +1,245 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.04.21 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm.Internals; -using Xtensive.Orm.Metadata; -using Xtensive.Orm.Model; -using Xtensive.Orm.Rse.Providers; -using Type=System.Type; -using System.Linq; -using Xtensive.Reflection; - -namespace Xtensive.Orm -{ - /// - /// Various well-known constants related to this namespace. - /// - public static class WellKnown - { - private const string UseDomainStorageProviderInfoSupportedTypesInstead - = "Use Domain.StorageProviderInfo.SupportedTypes instead."; - - /// - /// Default node identifier (empty string). - /// - public const string DefaultNodeId = ""; - - /// - /// Name of the default configuration section (Xtensive.Orm). - /// - public const string DefaultConfigurationSection = "Xtensive.Orm"; - - /// - /// Name of the field. - /// - public const string KeyFieldName = "Key"; - - /// - /// Name of the field. - /// - public const string TypeIdFieldName = "TypeId"; - - /// - /// Name of the property. - /// - public const string PersistenceStatePropertyName = "PersistenceState"; - - /// - /// Name of the field that describes master in - /// or association. - /// - public const string MasterFieldName = "Master"; - - /// - /// Name of the field that describes slave in - /// or association. - /// - public const string SlaveFieldName = "Slave"; - - /// - /// Name of the that describes domain model. - /// - public const string DomainModelExtensionName = "Xtensive.Orm.Model"; - - /// - /// Name of the that describes partial indexes. - /// - public const string PartialIndexDefinitionsExtensionName = "Xtensive.Orm.PartialIndexDefinitions"; - - /// - /// Name of column in key generator table. - /// - public const string GeneratorColumnName = "ID"; - - /// - /// Name of fake column in key generator table. - /// - public const string GeneratorFakeColumnName = "Fake"; - - /// - /// Max number of key fields. - /// - public const int MaxKeyFieldNumber = 8; - - /// - /// Maximal supported length (count of values) of purely generic keys. - /// - public const int MaxGenericKeyLength = 4; - - /// - /// Maximal number of filtering values in an - /// which are to be placed inside a resulted SQL command (as boolean predicate). - /// - public const int MaxNumberOfConditions = 256; - - /// - /// Maximum number of cached keys in . - /// - public const int EntitySetCacheSize = 1024000; - - /// - /// Number of items that are preloaded on first access. - /// - public const int EntitySetPreloadCount = 32; - - /// - /// Gets a read-only hash set containing all supported integer types. - /// - [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] - public static readonly ReadOnlyHashSet SupportedIntegerTypes = - new ReadOnlyHashSet( - new HashSet{ - typeof(sbyte), - typeof(byte), - typeof(short), - typeof(ushort), - typeof(int), - typeof(uint), - typeof(long), - typeof(ulong), - } - ); - - /// - /// Gets a read-only hash set containing all supported numeric types. - /// - [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] - public static readonly ReadOnlyHashSet SupportedNumericTypes = - new ReadOnlyHashSet( - new [] { - typeof(decimal), - typeof(double), - typeof(float), - }.Concat(SupportedIntegerTypes).ToHashSet() - ); - - /// - /// Gets a read-only hash set containing all supported primitive types. - /// - [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] - public static readonly ReadOnlyHashSet SupportedPrimitiveTypes = - new ReadOnlyHashSet( - new [] { - typeof(string), - typeof(Guid), - typeof(DateTime), - typeof(DateTimeOffset), - typeof(TimeSpan), - typeof(byte[]), - }.Concat(SupportedNumericTypes).ToHashSet() - ); - - /// - /// Gets a read-only hash set containing all supported nullable types. - /// - [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] - public static readonly ReadOnlyHashSet SupportedNullableTypes = - new ReadOnlyHashSet( - SupportedPrimitiveTypes.Select(type => type.ToNullable()) - .ToHashSet() - ); - - /// - /// Gets a read-only hash set containing all supported primitive and nullable types. - /// - [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] - public static readonly ReadOnlyHashSet SupportedPrimitiveAndNullableTypes = - new ReadOnlyHashSet( - SupportedPrimitiveTypes.Union(SupportedNullableTypes) - .ToHashSet() - ); - - /// - /// Well-known storage protocol names. - /// - public static class Provider - { - /// - /// Microsoft SQL Server. - /// - public const string SqlServer = "sqlserver"; - /// - /// Microsoft SQL Server. - /// - public const string SqlServerCe = "sqlserverce"; - /// - /// PostgreSQL. - /// - public const string PostgreSql = "postgresql"; - /// - /// Oracle. - /// - public const string Oracle = "oracle"; - /// - /// MySQL. - /// - public const string MySql = "mysql"; - /// - /// Firebird. - /// - public const string Firebird = "firebird"; - /// - /// SQLite. - /// - public const string Sqlite = "sqlite"; - /// - /// All supported protocols (for exception messages, etc). - /// - public const string All = "sqlserver, sqlserverce, postgresql, oracle, mysql, firebird, sqlite"; - } - - /// - /// Well-known session configuration names. - /// - public static class Sessions - { - /// - /// Name of default session configuration. - /// - public const string Default = "Default"; - - /// - /// System session name. - /// - public const string System = "System"; - - /// - /// Service session name. - /// - public const string Service = "Service"; - - /// - /// Generator session name. - /// - public const string KeyGenerator = "KeyGenerator"; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.04.21 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm.Internals; +using Xtensive.Orm.Metadata; +using Xtensive.Orm.Model; +using Xtensive.Orm.Rse.Providers; +using Type=System.Type; +using System.Linq; +using Xtensive.Reflection; + +namespace Xtensive.Orm +{ + /// + /// Various well-known constants related to this namespace. + /// + public static class WellKnown + { + private const string UseDomainStorageProviderInfoSupportedTypesInstead + = "Use Domain.StorageProviderInfo.SupportedTypes instead."; + + /// + /// Default node identifier (empty string). + /// + public const string DefaultNodeId = ""; + + /// + /// Name of the default configuration section (Xtensive.Orm). + /// + public const string DefaultConfigurationSection = "Xtensive.Orm"; + + /// + /// Name of the field. + /// + public const string KeyFieldName = "Key"; + + /// + /// Name of the field. + /// + public const string TypeIdFieldName = "TypeId"; + + /// + /// Name of the property. + /// + public const string PersistenceStatePropertyName = "PersistenceState"; + + /// + /// Name of the field that describes master in + /// or association. + /// + public const string MasterFieldName = "Master"; + + /// + /// Name of the field that describes slave in + /// or association. + /// + public const string SlaveFieldName = "Slave"; + + /// + /// Name of the that describes domain model. + /// + public const string DomainModelExtensionName = "Xtensive.Orm.Model"; + + /// + /// Name of the that describes partial indexes. + /// + public const string PartialIndexDefinitionsExtensionName = "Xtensive.Orm.PartialIndexDefinitions"; + + /// + /// Name of column in key generator table. + /// + public const string GeneratorColumnName = "ID"; + + /// + /// Name of fake column in key generator table. + /// + public const string GeneratorFakeColumnName = "Fake"; + + /// + /// Max number of key fields. + /// + public const int MaxKeyFieldNumber = 8; + + /// + /// Maximal supported length (count of values) of purely generic keys. + /// + public const int MaxGenericKeyLength = 4; + + /// + /// Maximal number of filtering values in an + /// which are to be placed inside a resulted SQL command (as boolean predicate). + /// + public const int MaxNumberOfConditions = 256; + + /// + /// Maximum number of cached keys in . + /// + public const int EntitySetCacheSize = 1024000; + + /// + /// Number of items that are preloaded on first access. + /// + public const int EntitySetPreloadCount = 32; + + /// + /// Gets a read-only hash set containing all supported integer types. + /// + [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] + public static readonly ReadOnlyHashSet SupportedIntegerTypes = + new ReadOnlyHashSet( + new HashSet{ + typeof(sbyte), + typeof(byte), + typeof(short), + typeof(ushort), + typeof(int), + typeof(uint), + typeof(long), + typeof(ulong), + } + ); + + /// + /// Gets a read-only hash set containing all supported numeric types. + /// + [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] + public static readonly ReadOnlyHashSet SupportedNumericTypes = + new ReadOnlyHashSet( + new [] { + typeof(decimal), + typeof(double), + typeof(float), + }.Concat(SupportedIntegerTypes).ToHashSet() + ); + + /// + /// Gets a read-only hash set containing all supported primitive types. + /// + [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] + public static readonly ReadOnlyHashSet SupportedPrimitiveTypes = + new ReadOnlyHashSet( + new [] { + typeof(string), + typeof(Guid), + typeof(DateTime), + typeof(DateTimeOffset), + typeof(TimeSpan), + typeof(byte[]), + }.Concat(SupportedNumericTypes).ToHashSet() + ); + + /// + /// Gets a read-only hash set containing all supported nullable types. + /// + [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] + public static readonly ReadOnlyHashSet SupportedNullableTypes = + new ReadOnlyHashSet( + SupportedPrimitiveTypes.Select(type => type.ToNullable()) + .ToHashSet() + ); + + /// + /// Gets a read-only hash set containing all supported primitive and nullable types. + /// + [Obsolete(UseDomainStorageProviderInfoSupportedTypesInstead)] + public static readonly ReadOnlyHashSet SupportedPrimitiveAndNullableTypes = + new ReadOnlyHashSet( + SupportedPrimitiveTypes.Union(SupportedNullableTypes) + .ToHashSet() + ); + + /// + /// Well-known storage protocol names. + /// + public static class Provider + { + /// + /// Microsoft SQL Server. + /// + public const string SqlServer = "sqlserver"; + /// + /// Microsoft SQL Server. + /// + public const string SqlServerCe = "sqlserverce"; + /// + /// PostgreSQL. + /// + public const string PostgreSql = "postgresql"; + /// + /// Oracle. + /// + public const string Oracle = "oracle"; + /// + /// MySQL. + /// + public const string MySql = "mysql"; + /// + /// Firebird. + /// + public const string Firebird = "firebird"; + /// + /// SQLite. + /// + public const string Sqlite = "sqlite"; + /// + /// All supported protocols (for exception messages, etc). + /// + public const string All = "sqlserver, sqlserverce, postgresql, oracle, mysql, firebird, sqlite"; + } + + /// + /// Well-known session configuration names. + /// + public static class Sessions + { + /// + /// Name of default session configuration. + /// + public const string Default = "Default"; + + /// + /// System session name. + /// + public const string System = "System"; + + /// + /// Service session name. + /// + public const string Service = "Service"; + + /// + /// Generator session name. + /// + public const string KeyGenerator = "KeyGenerator"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Properties/Visibility.cs b/Orm/Xtensive.Orm/Properties/Visibility.cs index ab2bf222f9..8e81dc329b 100644 --- a/Orm/Xtensive.Orm/Properties/Visibility.cs +++ b/Orm/Xtensive.Orm/Properties/Visibility.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.10.04 - -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Framework, PublicKey=" + -"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + -"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + -"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + -"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + -"c45009b2")] -[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Core, PublicKey=" + -"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + -"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + -"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + -"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + -"c45009b2")] -[assembly: InternalsVisibleTo("Xtensive.Orm.Tests, PublicKey=" + -"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + -"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + -"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + -"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + -"c45009b2")] -[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Sql, PublicKey=" + -"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + -"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + -"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + -"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.10.04 + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Framework, PublicKey=" + +"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + +"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + +"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + +"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + +"c45009b2")] +[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Core, PublicKey=" + +"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + +"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + +"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + +"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + +"c45009b2")] +[assembly: InternalsVisibleTo("Xtensive.Orm.Tests, PublicKey=" + +"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + +"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + +"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + +"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + +"c45009b2")] +[assembly: InternalsVisibleTo("Xtensive.Orm.Tests.Sql, PublicKey=" + +"0024000004800000940000000602000000240000525341310004000001000100fbdd689d62e9c6" + +"7bb6356267f95e0b58d478cf56393c4f060fbaff42a9686272e37009ab71bfa2e41046e952f389" + +"f37c6a033d1a2a5354fc97226fc469128e49e6a479ac5d1dd69d7da5607d0dc4ede0765d477745" + +"1034dc3a15f1532d010db3e633e62fc5e67a3ed175457acb9dc6c9d39ccc8ecfdaae62df34d488" + "c45009b2")] \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/AttributeHelper.cs b/Orm/Xtensive.Orm/Reflection/AttributeHelper.cs index 522826d232..8984422c34 100644 --- a/Orm/Xtensive.Orm/Reflection/AttributeHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/AttributeHelper.cs @@ -1,120 +1,120 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.13 - -using System; -using System.Collections.Generic; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; - - -namespace Xtensive.Reflection -{ - /// - /// related helper \ extension methods. - /// - public static class AttributeHelper - { - /// - /// A shortcut to method. - /// This method does not inherit the attribute. - /// - /// The type of attribute to get. - /// Member to get attributes of. - /// An attribute of specified type, or , if none. - public static TAttribute GetAttribute(this MemberInfo member) - where TAttribute: Attribute - { - var attributes = member.GetCustomAttributes(typeof (TAttribute), false); - if (attributes.Length==0) - return null; - if (attributes.Length>1) - throw new InvalidOperationException(string.Format(Strings.ExMultipleAttributesOfTypeXAreNotAllowedHere, - member.GetShortName(true), - typeof (TAttribute).GetShortName())); - return (TAttribute) attributes[0]; - } - - /// - /// A shortcut to method. - /// This method does not inherit the attribute. - /// - /// The type of attribute to get. - /// Member to get attributes of. - /// An array of attributes of specified type. - public static TAttribute[] GetAttributes(this MemberInfo member) - { - return member.GetCustomAttributes(typeof (TAttribute), false).Cast(); - } - - /// - /// A shortcut to method. - /// - /// The type of attributes to get. - /// Member to get attributes of. - /// Attribute search options. - /// An array of attributes of specified type. - public static TAttribute[] GetAttributes(this MemberInfo member, AttributeSearchOptions options) - where TAttribute: Attribute - { - if (options==AttributeSearchOptions.InheritNone) - return member.GetAttributes(); - var attributes = member.GetCustomAttributes(typeof (TAttribute), false).Cast(); - if (attributes.Length==0) { - if ((options & AttributeSearchOptions.InheritFromPropertyOrEvent)!=0) { - var m = member as MethodInfo; - if (m!=null) { - var poe = (MemberInfo) m.GetProperty() ?? m.GetEvent(); - if (poe!=null) - attributes = poe.GetAttributes(); - } - } - if ((options & AttributeSearchOptions.InheritFromBase)!=0 && - (options & AttributeSearchOptions.InheritFromAllBase)==0) { - var bm = member.GetBaseMember(); - if (bm!=null) - attributes = attributes.Combine(bm.GetAttributes(options)); - } - } - - if ((options & AttributeSearchOptions.InheritFromAllBase)!=0 - && member.DeclaringType!=typeof(object)) { - var bm = member.GetBaseMember(); - if (bm!=null) - attributes = attributes.Combine(bm.GetAttributes(options)); - } - - return attributes; - } - - /// - /// A version of - /// returning just one attribute. - /// - /// The type of attribute to get. - /// Member to get attribute of. - /// Attribute search options. - /// An attribute of specified type; - /// , if there is no such attribute; - /// throws , if there is more then one attribute of specified type found. - /// - /// Thrown if there is more then one attribute of specified type found. - public static TAttribute GetAttribute(this MemberInfo member, AttributeSearchOptions options) - where TAttribute: Attribute - { - if (options==AttributeSearchOptions.InheritNone) - return member.GetAttribute(); - var attributes = member.GetAttributes(options); - if (attributes.Length==0) - return null; - if (attributes.Length>1) - throw new InvalidOperationException(string.Format(Strings.ExMultipleAttributesOfTypeXAreNotAllowedHere, - member.GetShortName(true), - typeof(TAttribute).GetShortName())); - return attributes[0]; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.13 + +using System; +using System.Collections.Generic; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; + + +namespace Xtensive.Reflection +{ + /// + /// related helper \ extension methods. + /// + public static class AttributeHelper + { + /// + /// A shortcut to method. + /// This method does not inherit the attribute. + /// + /// The type of attribute to get. + /// Member to get attributes of. + /// An attribute of specified type, or , if none. + public static TAttribute GetAttribute(this MemberInfo member) + where TAttribute: Attribute + { + var attributes = member.GetCustomAttributes(typeof (TAttribute), false); + if (attributes.Length==0) + return null; + if (attributes.Length>1) + throw new InvalidOperationException(string.Format(Strings.ExMultipleAttributesOfTypeXAreNotAllowedHere, + member.GetShortName(true), + typeof (TAttribute).GetShortName())); + return (TAttribute) attributes[0]; + } + + /// + /// A shortcut to method. + /// This method does not inherit the attribute. + /// + /// The type of attribute to get. + /// Member to get attributes of. + /// An array of attributes of specified type. + public static TAttribute[] GetAttributes(this MemberInfo member) + { + return member.GetCustomAttributes(typeof (TAttribute), false).Cast(); + } + + /// + /// A shortcut to method. + /// + /// The type of attributes to get. + /// Member to get attributes of. + /// Attribute search options. + /// An array of attributes of specified type. + public static TAttribute[] GetAttributes(this MemberInfo member, AttributeSearchOptions options) + where TAttribute: Attribute + { + if (options==AttributeSearchOptions.InheritNone) + return member.GetAttributes(); + var attributes = member.GetCustomAttributes(typeof (TAttribute), false).Cast(); + if (attributes.Length==0) { + if ((options & AttributeSearchOptions.InheritFromPropertyOrEvent)!=0) { + var m = member as MethodInfo; + if (m!=null) { + var poe = (MemberInfo) m.GetProperty() ?? m.GetEvent(); + if (poe!=null) + attributes = poe.GetAttributes(); + } + } + if ((options & AttributeSearchOptions.InheritFromBase)!=0 && + (options & AttributeSearchOptions.InheritFromAllBase)==0) { + var bm = member.GetBaseMember(); + if (bm!=null) + attributes = attributes.Combine(bm.GetAttributes(options)); + } + } + + if ((options & AttributeSearchOptions.InheritFromAllBase)!=0 + && member.DeclaringType!=typeof(object)) { + var bm = member.GetBaseMember(); + if (bm!=null) + attributes = attributes.Combine(bm.GetAttributes(options)); + } + + return attributes; + } + + /// + /// A version of + /// returning just one attribute. + /// + /// The type of attribute to get. + /// Member to get attribute of. + /// Attribute search options. + /// An attribute of specified type; + /// , if there is no such attribute; + /// throws , if there is more then one attribute of specified type found. + /// + /// Thrown if there is more then one attribute of specified type found. + public static TAttribute GetAttribute(this MemberInfo member, AttributeSearchOptions options) + where TAttribute: Attribute + { + if (options==AttributeSearchOptions.InheritNone) + return member.GetAttribute(); + var attributes = member.GetAttributes(options); + if (attributes.Length==0) + return null; + if (attributes.Length>1) + throw new InvalidOperationException(string.Format(Strings.ExMultipleAttributesOfTypeXAreNotAllowedHere, + member.GetShortName(true), + typeof(TAttribute).GetShortName())); + return attributes[0]; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/AttributeSearchOptions.cs b/Orm/Xtensive.Orm/Reflection/AttributeSearchOptions.cs index 191da66e95..53c6a44e85 100644 --- a/Orm/Xtensive.Orm/Reflection/AttributeSearchOptions.cs +++ b/Orm/Xtensive.Orm/Reflection/AttributeSearchOptions.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.08.06 - -using System; - -namespace Xtensive.Reflection -{ - /// - /// Search options for methods. - /// - [Flags] - public enum AttributeSearchOptions - { - /// - /// Default options. - /// The same as . - /// - Default = InheritNone, - /// - /// Nothing should be inherited. - /// - InheritNone = 0, - /// - /// If no attributes are found on the specified member, - /// attributes from its base should be inherited. - /// - InheritFromBase = 1, - /// - /// Attributes from all the bases should be inherited. - /// - InheritFromAllBase = 3, - /// - /// If no attributes are found on the specified method, - /// attributes from the property or event it belongs to should be inherited. - /// - InheritFromPropertyOrEvent = 4, - /// - /// All inheritance options. - /// - InheritAll = 7, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.06 + +using System; + +namespace Xtensive.Reflection +{ + /// + /// Search options for methods. + /// + [Flags] + public enum AttributeSearchOptions + { + /// + /// Default options. + /// The same as . + /// + Default = InheritNone, + /// + /// Nothing should be inherited. + /// + InheritNone = 0, + /// + /// If no attributes are found on the specified member, + /// attributes from its base should be inherited. + /// + InheritFromBase = 1, + /// + /// Attributes from all the bases should be inherited. + /// + InheritFromAllBase = 3, + /// + /// If no attributes are found on the specified method, + /// attributes from the property or event it belongs to should be inherited. + /// + InheritFromPropertyOrEvent = 4, + /// + /// All inheritance options. + /// + InheritAll = 7, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/DelegateHelper.cs b/Orm/Xtensive.Orm/Reflection/DelegateHelper.cs index a3c2912bdc..f7c11c75cb 100644 --- a/Orm/Xtensive.Orm/Reflection/DelegateHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/DelegateHelper.cs @@ -1,589 +1,589 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: -// Created: 2007.10.25 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Reflection.Emit; -using System.Text; -using Xtensive.Collections; -using Xtensive.Core; - - - -namespace Xtensive.Reflection -{ - /// - /// Delegate helper \ extension methods. - /// Simplifies various delegate creation. - /// - public static class DelegateHelper - { - #region Constants - - private const string primitiveCastMethodName = "PrimitiveCast"; - private const string ctorMethodName = "Ctor"; - private const string createMethodName = "Create"; - - private static readonly Dictionary opCodeConv = new Dictionary(); - private static readonly Dictionary typeOnStack = new Dictionary(); - - private static readonly Type[] ActionTypes; - private static readonly Type[] FuncTypes; - - public const int MaxNumberOfGenericDelegateParameters = 16; - - /// - /// Aspected private field getter prefix. - /// - public static readonly string AspectedPrivateFieldGetterPrefix = - "~Xtensive.Aspects.PrivateFieldAccessorAspect~Get_"; - - /// - /// Aspected private field setter prefix. - /// - public static readonly string AspectedPrivateFieldSetterPrefix = - "~Xtensive.Aspects.PrivateFieldAccessorAspect~Set_"; - - /// - /// Aspected factory method name. - /// - public static readonly string AspectedFactoryMethodName = - "~Xtensive.Orm.CreateObject"; - - #endregion - - #region Nested type: MethodCallDelegateKey - - private sealed class MethodCallDelegateKey - { - private object[] items; - private int hashCode; - - public bool Equals(MethodCallDelegateKey other) - { - if (ReferenceEquals(null, other)) - return false; - if (other.hashCode!=hashCode) - return false; - var otherItems = other.items; - if (otherItems.Length!=items.Length) - return false; - for (int i = 0; i < items.Length; i++) - if (!Equals(otherItems[i], items[i])) - return false; - return true; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (obj.GetType()!=typeof (MethodCallDelegateKey)) - return false; - return Equals((MethodCallDelegateKey) obj); - } - - public override int GetHashCode() - { - return hashCode; - } - - - // Constructors - - public MethodCallDelegateKey(params object[] items) - { - this.items = items; - unchecked { - foreach (var item in items) - hashCode = hashCode * 397 + (item==null ? 0 : item.GetHashCode()); - } - } - } - - #endregion - - private static ThreadSafeDictionary cachedDelegates = - ThreadSafeDictionary.Create(new object()); - - /// - /// Creates get member delegate. - /// - /// Declaring type. - /// Member type. - /// Member name. - /// delegate - /// that gets member value. - public static Func CreateGetMemberDelegate(string memberName) - { - return InnerCreateGetMemberDelegate>(memberName); - } - - private static TDelegateType InnerCreateGetMemberDelegate(string memberName) - where TDelegateType : class - { - Type type = typeof (TObject); - Type tValue = typeof (TValue); - var methodKey = new MethodCallDelegateKey(typeof (TDelegateType), memberName, type, tValue); - - TDelegateType result = GetCachedDelegate(methodKey) as TDelegateType; - if (result==null) - lock (cachedDelegates.SyncRoot) { - result = GetCachedDelegate(methodKey) as TDelegateType; - if (result!=null) - return result; - - PropertyInfo pi = type.GetProperty(memberName); - FieldInfo fi = type.GetField(memberName); - MethodInfo smi; - if (pi!=null) { - // Member is a Property... - MethodInfo mi = pi.GetGetMethod(true); - if (mi!=null) { - // Calling a property's get accessor is faster/cleaner using - // Delegate.CreateDelegate rather than Reflection.Emit - result = Delegate.CreateDelegate(typeof (TDelegateType), mi) as TDelegateType; - } - else - throw new InvalidOperationException(string.Format(Strings.ExPropertyDoesNotHaveGetter, - memberName, type.GetShortName())); - } - else if (fi!=null) { - // Member is a Field... - DynamicMethod dm = new DynamicMethod("Get" + memberName, - typeof (TValue), new Type[] {type}, type); - ILGenerator il = dm.GetILGenerator(); - // Load the instance of the object (argument 0) onto the stack - il.Emit(OpCodes.Ldarg_0); - // Load the value of the object's field (fi) onto the stack - il.Emit(OpCodes.Ldfld, fi); - // return the value on the top of the stack - il.Emit(OpCodes.Ret); - - result = dm.CreateDelegate(typeof (TDelegateType)) as TDelegateType; - } - else if (null!=(smi = type.GetMethod(AspectedPrivateFieldGetterPrefix + memberName, - BindingFlags.Instance | - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.ExactBinding))) { - result = Delegate.CreateDelegate(typeof (Func), smi) as TDelegateType; - } - else - throw new InvalidOperationException(string.Format(Strings.ExMemberIsNotPublicPropertyOrField, - memberName, type.GetShortName())); - - AddCachedDelegate(methodKey, result as Delegate); - } - return result; - } - - /// - /// Creates property \ member setter delegate. - /// - /// Declaring type. - /// Member type. - /// Member name. - /// delegate - /// that sets member value. - public static Action CreateSetMemberDelegate(string memberName) - { - Type type = typeof (TObject); - Type tValue = typeof (TValue); - var methodKey = new MethodCallDelegateKey(memberName, type, tValue); - - Action result = (Action)GetCachedDelegate(methodKey); - if (result==null) - lock (cachedDelegates.SyncRoot) { - result = (Action)GetCachedDelegate(methodKey); - if (result!=null) - return result; - - PropertyInfo pi = type.GetProperty(memberName); - FieldInfo fi = type.GetField(memberName); - if (pi!=null) { - // Member is a Property... - MethodInfo mi = pi.GetSetMethod(true); - if (mi!=null) { - // Calling a property's get accessor is faster/cleaner using - // Delegate.CreateDelegate rather than Reflection.Emit - // TODO: Check that type conversion is adequate. - result = (Action)Delegate.CreateDelegate(typeof (Action), mi); - } - else - throw new InvalidOperationException(string.Format(Strings.ExPropertyDoesNotHaveSetter, - memberName, type.GetShortName())); - } - else if (fi!=null) { - // Member is a Field... - DynamicMethod dm = new DynamicMethod("Set" + memberName, - typeof (TValue), new Type[] {type}, type); - ILGenerator il = dm.GetILGenerator(); - // Load the instance of the object (argument 0) onto the stack - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - // Load the value of the object's field (fi) onto the stack - il.Emit(OpCodes.Stfld, fi); - // return the value on the top of the stack - il.Emit(OpCodes.Ldc_I4_1); - il.Emit(OpCodes.Ret); - - result = (Action)dm.CreateDelegate(typeof (Func)); - } - else - throw new InvalidOperationException(string.Format(Strings.ExMemberIsNotPublicPropertyOrField, - memberName, type.GetShortName())); - AddCachedDelegate(methodKey, result); - } - return result; - } - - /// - /// Creates primitive type cast delegate - e.g. to . - /// - /// The type to cast. - /// Target type. - /// A delegate allowing to cast to . - /// InvalidCastException. - public static Converter CreatePrimitiveCastDelegate() - where TSource: struct - where TTarget: struct - { - Type sourceType = typeof (TSource); - Type targetType = typeof (TTarget); - string methodName = string.Format("{0}_{1}_{2}", primitiveCastMethodName, sourceType, targetType); - var methodKey = new MethodCallDelegateKey(methodName); - - var result = GetCachedDelegate(methodKey) as Converter; - if (result==null) - lock (cachedDelegates.SyncRoot) { - result = GetCachedDelegate(methodKey) as Converter; - if (result!=null) - return result; - - Type actualSourceType = sourceType; - if (sourceType.IsEnum) - actualSourceType = Enum.GetUnderlyingType(sourceType); - if (!opCodeConv.ContainsKey(actualSourceType)) - throw new InvalidCastException(string.Format(Strings.ExInvalidCast, - sourceType.GetShortName(), - targetType.GetShortName())); - - Type actualTargetType = targetType; - if (targetType.IsEnum) - actualTargetType = Enum.GetUnderlyingType(targetType); - if (!opCodeConv.ContainsKey(actualTargetType)) - throw new InvalidCastException(string.Format(Strings.ExInvalidCast, - sourceType.GetShortName(), - targetType.GetShortName())); - - DynamicMethod dm = new DynamicMethod(methodName, - typeof(TTarget), new Type[] {sourceType}); - ILGenerator il = dm.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - - if (targetType.IsEnum) - if (typeOnStack[actualSourceType]!=typeOnStack[actualSourceType]) - il.Emit(opCodeConv[actualTargetType]); - il.Emit(OpCodes.Ret); - result = dm.CreateDelegate(typeof(Converter)) as Converter; - - AddCachedDelegate(methodKey, result); - } - return result; - } - - /// - /// Creates (generic) method invocation delegate with specified generic argument types. - /// - /// The delegate call target. , if static method should be called. - /// Type, which method should be called by delegate. - /// The name of the method to call by delegate. - /// Generic method arguments. - /// New delegate allowing to call specified generic method on . - /// Type of delegate to create. - public static TDelegate CreateDelegate(object callTarget, Type type, string methodName, params Type[] genericArgumentTypes) - where TDelegate : class - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(methodName, "methodName"); - ArgumentValidator.EnsureArgumentNotNull(genericArgumentTypes, "genericArgumentTypes"); - Type delegateType = typeof (TDelegate); - if (!typeof(Delegate).IsAssignableFrom(delegateType)) - throw new ArgumentException(string.Format(Strings.ExGenericParameterShouldBeOfTypeT, - "TDelegate", typeof(Delegate).GetShortName())); - - BindingFlags bindingFlags = - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.ExactBinding; - if (callTarget == null) { - bindingFlags |= BindingFlags.Static; - bindingFlags |= BindingFlags.FlattenHierarchy; - } - else - bindingFlags |= BindingFlags.Instance; - string[] genericArgumentNames = new string[genericArgumentTypes.Length]; // Actual names doesn't matter - Type[] parameterTypes = delegateType.GetInvokeMethod().GetParameterTypes(); - - MethodInfo methodInfo = MethodHelper.GetMethod(type, methodName, bindingFlags, - genericArgumentNames, parameterTypes); - if (methodInfo==null) - return null; - if (genericArgumentTypes.Length!=0) - methodInfo = methodInfo.MakeGenericMethod(genericArgumentTypes); - if (callTarget==null) - return (TDelegate)(object)Delegate.CreateDelegate(delegateType, methodInfo, true); - - return (TDelegate)(object)Delegate.CreateDelegate(delegateType, callTarget, methodInfo, true); - } - - /// - /// Creates an array of generic method invocation delegates matching the method instance - /// with specified generic argument variants. - /// - /// The delegate call target. , if static method should be called. - /// Type, which method should be called by delegate. - /// The name of the method to call by delegate. - /// Generic method argument variants. - /// An array of delegate allowing to call specified generic method instances on . - /// Type of delegate to create. - /// ArgumentException. - public static TDelegate[] CreateDelegates(object callTarget, Type type, string methodName, IList genericArgumentVariants) - where TDelegate : class - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(methodName, "methodName"); - ArgumentValidator.EnsureArgumentNotNull(genericArgumentVariants, "genericArgumentVariants"); - Type delegateType = typeof (TDelegate); - if (!typeof(Delegate).IsAssignableFrom(delegateType)) - throw new ArgumentException(string.Format(Strings.ExGenericParameterShouldBeOfTypeT, - "TDelegate", typeof(Delegate).GetShortName())); - - int count = genericArgumentVariants.Count; - TDelegate[] delegates = new TDelegate[count]; - if (count==0) - return delegates; - - BindingFlags bindingFlags = - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.ExactBinding; - if (callTarget==null) - bindingFlags |= BindingFlags.Static; - else - bindingFlags |= BindingFlags.Instance; - string[] genericArgumentNames = new string[1]; // Actual names doesn't matter - Type[] parameterTypes = delegateType.GetInvokeMethod().GetParameterTypes(); - - MethodInfo methodInfo = MethodHelper.GetMethod(type, methodName, bindingFlags, - genericArgumentNames, parameterTypes); - if (methodInfo==null) - return null; - - for (int i = 0; i - /// Executes sequence of s. - /// Stops when the executed delegate returns . - /// - /// Type of argument to pass to each delegate. - /// Delegates to execute. - /// Argument to pass to each delegate. - /// Direction of execution. - /// Invalid value. - public static void ExecuteDelegates(ExecutionSequenceHandler[] delegates, ref T argument, Direction direction) - where T: struct - { - if (direction==Direction.None) - throw Exceptions.InvalidArgument(direction, "direction"); - - if (delegates==null) - return; - if (direction==Direction.Positive) { - for (int i = 0; i=0; i--) - if (delegates[i].Invoke(ref argument, i)) - return; - } - } - - - /// - /// Creates a delegate type that represents a delegate that calls a method with specified signature. - /// - /// Type of return value. - /// Types of parameters. - /// Created delegate type. - public static Type MakeDelegateType(Type returnType, params Type[] parameterTypes) - { - ArgumentValidator.EnsureArgumentNotNull(parameterTypes, "parameterTypes"); - if (parameterTypes.Length > MaxNumberOfGenericDelegateParameters) - throw new NotSupportedException(); - if (returnType == typeof(void) || returnType == null) { - if (parameterTypes.Length == 0) - return ActionTypes[0]; - return ActionTypes[parameterTypes.Length].MakeGenericType(parameterTypes); - } - var funcGenericParameters = parameterTypes.Append(returnType); - return FuncTypes[funcGenericParameters.Length - 1].MakeGenericType(funcGenericParameters); - } - - /// - /// Creates a delegate type that represents a delegate that calls a method with specified signature. - /// - /// Type of return value. - /// Types of parameters. - /// Created delegate type. - public static Type MakeDelegateType(Type returnType, IEnumerable parameterTypes) - { - ArgumentValidator.EnsureArgumentNotNull(parameterTypes, "parameterTypes"); - return MakeDelegateType(returnType, parameterTypes.ToArray()); - } - - /// - /// Gets signature of a delegate of a . - /// - /// Type of the delegate. - /// A pair that contains return type as first element and parameter types as second arguments. - public static Pair GetDelegateSignature(Type delegateType) - { - ArgumentValidator.EnsureArgumentNotNull(delegateType, "delegateType"); - // check for non-generic Action - if (delegateType == ActionTypes[0]) - return new Pair(typeof(void), ArrayUtils.EmptyArray); - if (delegateType.IsGenericType) { - var genericTypeDefinition = delegateType.GetGenericTypeDefinition(); - var genericArguments = delegateType.GetGenericArguments(); - int genericArgumentsLength = genericArguments.Length; - // check for Func<> - if (genericArgumentsLength >= 1 - && genericArgumentsLength <= MaxNumberOfGenericDelegateParameters + 1 - && FuncTypes[genericArgumentsLength-1] == genericTypeDefinition) { - var parameterTypes = new Type[genericArguments.Length - 1]; - Array.Copy(genericArguments, parameterTypes, parameterTypes.Length); - return new Pair(genericArguments[genericArgumentsLength - 1], parameterTypes); - } - // check for Action<> - if (genericArgumentsLength >= 1 - && genericArgumentsLength <= MaxNumberOfGenericDelegateParameters - && ActionTypes[genericArgumentsLength] == genericTypeDefinition) - return new Pair(typeof(void), delegateType.GetGenericArguments()); - } - // universal (but slow) strategy - reflect "Invoke" method - var method = delegateType.GetMethod("Invoke", BindingFlags.Public | BindingFlags.Instance); - return new Pair(method.ReturnType, method.GetParameterTypes()); - } - - #region Private members - - private static Delegate GetCachedDelegate(object delegateKey) - { - Delegate result; - return - cachedDelegates.TryGetValue(delegateKey, out result) ? result : null; - } - - private static void AddCachedDelegate(object delegateKey, Delegate value) - { - cachedDelegates.SetValue(delegateKey, value); - } - - #endregion - - - // Type initializer - - static DelegateHelper() - { - opCodeConv.Add(typeof(sbyte), OpCodes.Conv_I1); - opCodeConv.Add(typeof(byte), OpCodes.Conv_U1); - opCodeConv.Add(typeof(short), OpCodes.Conv_I2); - opCodeConv.Add(typeof(ushort), OpCodes.Conv_U2); - opCodeConv.Add(typeof(char), OpCodes.Conv_U2); - opCodeConv.Add(typeof(int), OpCodes.Conv_I4); - opCodeConv.Add(typeof(uint), OpCodes.Conv_U4); - opCodeConv.Add(typeof(long), OpCodes.Conv_I8); - opCodeConv.Add(typeof(ulong), OpCodes.Conv_U8); - opCodeConv.Add(typeof(float), OpCodes.Conv_R4); - opCodeConv.Add(typeof(double), OpCodes.Conv_R8); - typeOnStack.Add(typeof(sbyte), typeof(int)); - typeOnStack.Add(typeof(byte), typeof(uint)); - typeOnStack.Add(typeof(short), typeof(int)); - typeOnStack.Add(typeof(ushort), typeof(uint)); - typeOnStack.Add(typeof(char), typeof(uint)); - typeOnStack.Add(typeof(int), typeof(int)); - typeOnStack.Add(typeof(uint), typeof(uint)); - typeOnStack.Add(typeof(long), typeof(long)); - typeOnStack.Add(typeof(ulong), typeof(ulong)); - typeOnStack.Add(typeof(float), typeof(float)); - typeOnStack.Add(typeof(double), typeof(double)); - - FuncTypes = new[] - { - typeof (Func<>), - - typeof (Func<,>), - typeof (Func<,,>), - typeof (Func<,,,>), - typeof (Func<,,,,>), - - typeof (Func<,,,,,>), - typeof (Func<,,,,,,>), - typeof (Func<,,,,,,,>), - typeof (Func<,,,,,,,,>), - - typeof (Func<,,,,,,,,,>), - typeof (Func<,,,,,,,,,,>), - typeof (Func<,,,,,,,,,,,>), - typeof (Func<,,,,,,,,,,,,>), - - typeof (Func<,,,,,,,,,,,,,>), - typeof (Func<,,,,,,,,,,,,,,>), - typeof (Func<,,,,,,,,,,,,,,,>), - typeof (Func<,,,,,,,,,,,,,,,,>), - }; - - ActionTypes = new[] - { - typeof (Action), - typeof (Action<>), - typeof (Action<,>), - typeof (Action<,,>), - typeof (Action<,,,>), - - typeof (Action<,,,,>), - typeof (Action<,,,,,>), - typeof (Action<,,,,,,>), - typeof (Action<,,,,,,,>), - - typeof (Action<,,,,,,,,>), - typeof (Action<,,,,,,,,,>), - typeof (Action<,,,,,,,,,,>), - typeof (Action<,,,,,,,,,,,>), - - typeof (Action<,,,,,,,,,,,,>), - typeof (Action<,,,,,,,,,,,,,>), - typeof (Action<,,,,,,,,,,,,,,>), - typeof (Action<,,,,,,,,,,,,,,,>), - }; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: +// Created: 2007.10.25 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using Xtensive.Collections; +using Xtensive.Core; + + + +namespace Xtensive.Reflection +{ + /// + /// Delegate helper \ extension methods. + /// Simplifies various delegate creation. + /// + public static class DelegateHelper + { + #region Constants + + private const string primitiveCastMethodName = "PrimitiveCast"; + private const string ctorMethodName = "Ctor"; + private const string createMethodName = "Create"; + + private static readonly Dictionary opCodeConv = new Dictionary(); + private static readonly Dictionary typeOnStack = new Dictionary(); + + private static readonly Type[] ActionTypes; + private static readonly Type[] FuncTypes; + + public const int MaxNumberOfGenericDelegateParameters = 16; + + /// + /// Aspected private field getter prefix. + /// + public static readonly string AspectedPrivateFieldGetterPrefix = + "~Xtensive.Aspects.PrivateFieldAccessorAspect~Get_"; + + /// + /// Aspected private field setter prefix. + /// + public static readonly string AspectedPrivateFieldSetterPrefix = + "~Xtensive.Aspects.PrivateFieldAccessorAspect~Set_"; + + /// + /// Aspected factory method name. + /// + public static readonly string AspectedFactoryMethodName = + "~Xtensive.Orm.CreateObject"; + + #endregion + + #region Nested type: MethodCallDelegateKey + + private sealed class MethodCallDelegateKey + { + private object[] items; + private int hashCode; + + public bool Equals(MethodCallDelegateKey other) + { + if (ReferenceEquals(null, other)) + return false; + if (other.hashCode!=hashCode) + return false; + var otherItems = other.items; + if (otherItems.Length!=items.Length) + return false; + for (int i = 0; i < items.Length; i++) + if (!Equals(otherItems[i], items[i])) + return false; + return true; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (obj.GetType()!=typeof (MethodCallDelegateKey)) + return false; + return Equals((MethodCallDelegateKey) obj); + } + + public override int GetHashCode() + { + return hashCode; + } + + + // Constructors + + public MethodCallDelegateKey(params object[] items) + { + this.items = items; + unchecked { + foreach (var item in items) + hashCode = hashCode * 397 + (item==null ? 0 : item.GetHashCode()); + } + } + } + + #endregion + + private static ThreadSafeDictionary cachedDelegates = + ThreadSafeDictionary.Create(new object()); + + /// + /// Creates get member delegate. + /// + /// Declaring type. + /// Member type. + /// Member name. + /// delegate + /// that gets member value. + public static Func CreateGetMemberDelegate(string memberName) + { + return InnerCreateGetMemberDelegate>(memberName); + } + + private static TDelegateType InnerCreateGetMemberDelegate(string memberName) + where TDelegateType : class + { + Type type = typeof (TObject); + Type tValue = typeof (TValue); + var methodKey = new MethodCallDelegateKey(typeof (TDelegateType), memberName, type, tValue); + + TDelegateType result = GetCachedDelegate(methodKey) as TDelegateType; + if (result==null) + lock (cachedDelegates.SyncRoot) { + result = GetCachedDelegate(methodKey) as TDelegateType; + if (result!=null) + return result; + + PropertyInfo pi = type.GetProperty(memberName); + FieldInfo fi = type.GetField(memberName); + MethodInfo smi; + if (pi!=null) { + // Member is a Property... + MethodInfo mi = pi.GetGetMethod(true); + if (mi!=null) { + // Calling a property's get accessor is faster/cleaner using + // Delegate.CreateDelegate rather than Reflection.Emit + result = Delegate.CreateDelegate(typeof (TDelegateType), mi) as TDelegateType; + } + else + throw new InvalidOperationException(string.Format(Strings.ExPropertyDoesNotHaveGetter, + memberName, type.GetShortName())); + } + else if (fi!=null) { + // Member is a Field... + DynamicMethod dm = new DynamicMethod("Get" + memberName, + typeof (TValue), new Type[] {type}, type); + ILGenerator il = dm.GetILGenerator(); + // Load the instance of the object (argument 0) onto the stack + il.Emit(OpCodes.Ldarg_0); + // Load the value of the object's field (fi) onto the stack + il.Emit(OpCodes.Ldfld, fi); + // return the value on the top of the stack + il.Emit(OpCodes.Ret); + + result = dm.CreateDelegate(typeof (TDelegateType)) as TDelegateType; + } + else if (null!=(smi = type.GetMethod(AspectedPrivateFieldGetterPrefix + memberName, + BindingFlags.Instance | + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.ExactBinding))) { + result = Delegate.CreateDelegate(typeof (Func), smi) as TDelegateType; + } + else + throw new InvalidOperationException(string.Format(Strings.ExMemberIsNotPublicPropertyOrField, + memberName, type.GetShortName())); + + AddCachedDelegate(methodKey, result as Delegate); + } + return result; + } + + /// + /// Creates property \ member setter delegate. + /// + /// Declaring type. + /// Member type. + /// Member name. + /// delegate + /// that sets member value. + public static Action CreateSetMemberDelegate(string memberName) + { + Type type = typeof (TObject); + Type tValue = typeof (TValue); + var methodKey = new MethodCallDelegateKey(memberName, type, tValue); + + Action result = (Action)GetCachedDelegate(methodKey); + if (result==null) + lock (cachedDelegates.SyncRoot) { + result = (Action)GetCachedDelegate(methodKey); + if (result!=null) + return result; + + PropertyInfo pi = type.GetProperty(memberName); + FieldInfo fi = type.GetField(memberName); + if (pi!=null) { + // Member is a Property... + MethodInfo mi = pi.GetSetMethod(true); + if (mi!=null) { + // Calling a property's get accessor is faster/cleaner using + // Delegate.CreateDelegate rather than Reflection.Emit + // TODO: Check that type conversion is adequate. + result = (Action)Delegate.CreateDelegate(typeof (Action), mi); + } + else + throw new InvalidOperationException(string.Format(Strings.ExPropertyDoesNotHaveSetter, + memberName, type.GetShortName())); + } + else if (fi!=null) { + // Member is a Field... + DynamicMethod dm = new DynamicMethod("Set" + memberName, + typeof (TValue), new Type[] {type}, type); + ILGenerator il = dm.GetILGenerator(); + // Load the instance of the object (argument 0) onto the stack + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + // Load the value of the object's field (fi) onto the stack + il.Emit(OpCodes.Stfld, fi); + // return the value on the top of the stack + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Ret); + + result = (Action)dm.CreateDelegate(typeof (Func)); + } + else + throw new InvalidOperationException(string.Format(Strings.ExMemberIsNotPublicPropertyOrField, + memberName, type.GetShortName())); + AddCachedDelegate(methodKey, result); + } + return result; + } + + /// + /// Creates primitive type cast delegate - e.g. to . + /// + /// The type to cast. + /// Target type. + /// A delegate allowing to cast to . + /// InvalidCastException. + public static Converter CreatePrimitiveCastDelegate() + where TSource: struct + where TTarget: struct + { + Type sourceType = typeof (TSource); + Type targetType = typeof (TTarget); + string methodName = string.Format("{0}_{1}_{2}", primitiveCastMethodName, sourceType, targetType); + var methodKey = new MethodCallDelegateKey(methodName); + + var result = GetCachedDelegate(methodKey) as Converter; + if (result==null) + lock (cachedDelegates.SyncRoot) { + result = GetCachedDelegate(methodKey) as Converter; + if (result!=null) + return result; + + Type actualSourceType = sourceType; + if (sourceType.IsEnum) + actualSourceType = Enum.GetUnderlyingType(sourceType); + if (!opCodeConv.ContainsKey(actualSourceType)) + throw new InvalidCastException(string.Format(Strings.ExInvalidCast, + sourceType.GetShortName(), + targetType.GetShortName())); + + Type actualTargetType = targetType; + if (targetType.IsEnum) + actualTargetType = Enum.GetUnderlyingType(targetType); + if (!opCodeConv.ContainsKey(actualTargetType)) + throw new InvalidCastException(string.Format(Strings.ExInvalidCast, + sourceType.GetShortName(), + targetType.GetShortName())); + + DynamicMethod dm = new DynamicMethod(methodName, + typeof(TTarget), new Type[] {sourceType}); + ILGenerator il = dm.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + + if (targetType.IsEnum) + if (typeOnStack[actualSourceType]!=typeOnStack[actualSourceType]) + il.Emit(opCodeConv[actualTargetType]); + il.Emit(OpCodes.Ret); + result = dm.CreateDelegate(typeof(Converter)) as Converter; + + AddCachedDelegate(methodKey, result); + } + return result; + } + + /// + /// Creates (generic) method invocation delegate with specified generic argument types. + /// + /// The delegate call target. , if static method should be called. + /// Type, which method should be called by delegate. + /// The name of the method to call by delegate. + /// Generic method arguments. + /// New delegate allowing to call specified generic method on . + /// Type of delegate to create. + public static TDelegate CreateDelegate(object callTarget, Type type, string methodName, params Type[] genericArgumentTypes) + where TDelegate : class + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(methodName, "methodName"); + ArgumentValidator.EnsureArgumentNotNull(genericArgumentTypes, "genericArgumentTypes"); + Type delegateType = typeof (TDelegate); + if (!typeof(Delegate).IsAssignableFrom(delegateType)) + throw new ArgumentException(string.Format(Strings.ExGenericParameterShouldBeOfTypeT, + "TDelegate", typeof(Delegate).GetShortName())); + + BindingFlags bindingFlags = + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.ExactBinding; + if (callTarget == null) { + bindingFlags |= BindingFlags.Static; + bindingFlags |= BindingFlags.FlattenHierarchy; + } + else + bindingFlags |= BindingFlags.Instance; + string[] genericArgumentNames = new string[genericArgumentTypes.Length]; // Actual names doesn't matter + Type[] parameterTypes = delegateType.GetInvokeMethod().GetParameterTypes(); + + MethodInfo methodInfo = MethodHelper.GetMethod(type, methodName, bindingFlags, + genericArgumentNames, parameterTypes); + if (methodInfo==null) + return null; + if (genericArgumentTypes.Length!=0) + methodInfo = methodInfo.MakeGenericMethod(genericArgumentTypes); + if (callTarget==null) + return (TDelegate)(object)Delegate.CreateDelegate(delegateType, methodInfo, true); + + return (TDelegate)(object)Delegate.CreateDelegate(delegateType, callTarget, methodInfo, true); + } + + /// + /// Creates an array of generic method invocation delegates matching the method instance + /// with specified generic argument variants. + /// + /// The delegate call target. , if static method should be called. + /// Type, which method should be called by delegate. + /// The name of the method to call by delegate. + /// Generic method argument variants. + /// An array of delegate allowing to call specified generic method instances on . + /// Type of delegate to create. + /// ArgumentException. + public static TDelegate[] CreateDelegates(object callTarget, Type type, string methodName, IList genericArgumentVariants) + where TDelegate : class + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(methodName, "methodName"); + ArgumentValidator.EnsureArgumentNotNull(genericArgumentVariants, "genericArgumentVariants"); + Type delegateType = typeof (TDelegate); + if (!typeof(Delegate).IsAssignableFrom(delegateType)) + throw new ArgumentException(string.Format(Strings.ExGenericParameterShouldBeOfTypeT, + "TDelegate", typeof(Delegate).GetShortName())); + + int count = genericArgumentVariants.Count; + TDelegate[] delegates = new TDelegate[count]; + if (count==0) + return delegates; + + BindingFlags bindingFlags = + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.ExactBinding; + if (callTarget==null) + bindingFlags |= BindingFlags.Static; + else + bindingFlags |= BindingFlags.Instance; + string[] genericArgumentNames = new string[1]; // Actual names doesn't matter + Type[] parameterTypes = delegateType.GetInvokeMethod().GetParameterTypes(); + + MethodInfo methodInfo = MethodHelper.GetMethod(type, methodName, bindingFlags, + genericArgumentNames, parameterTypes); + if (methodInfo==null) + return null; + + for (int i = 0; i + /// Executes sequence of s. + /// Stops when the executed delegate returns . + /// + /// Type of argument to pass to each delegate. + /// Delegates to execute. + /// Argument to pass to each delegate. + /// Direction of execution. + /// Invalid value. + public static void ExecuteDelegates(ExecutionSequenceHandler[] delegates, ref T argument, Direction direction) + where T: struct + { + if (direction==Direction.None) + throw Exceptions.InvalidArgument(direction, "direction"); + + if (delegates==null) + return; + if (direction==Direction.Positive) { + for (int i = 0; i=0; i--) + if (delegates[i].Invoke(ref argument, i)) + return; + } + } + + + /// + /// Creates a delegate type that represents a delegate that calls a method with specified signature. + /// + /// Type of return value. + /// Types of parameters. + /// Created delegate type. + public static Type MakeDelegateType(Type returnType, params Type[] parameterTypes) + { + ArgumentValidator.EnsureArgumentNotNull(parameterTypes, "parameterTypes"); + if (parameterTypes.Length > MaxNumberOfGenericDelegateParameters) + throw new NotSupportedException(); + if (returnType == typeof(void) || returnType == null) { + if (parameterTypes.Length == 0) + return ActionTypes[0]; + return ActionTypes[parameterTypes.Length].MakeGenericType(parameterTypes); + } + var funcGenericParameters = parameterTypes.Append(returnType); + return FuncTypes[funcGenericParameters.Length - 1].MakeGenericType(funcGenericParameters); + } + + /// + /// Creates a delegate type that represents a delegate that calls a method with specified signature. + /// + /// Type of return value. + /// Types of parameters. + /// Created delegate type. + public static Type MakeDelegateType(Type returnType, IEnumerable parameterTypes) + { + ArgumentValidator.EnsureArgumentNotNull(parameterTypes, "parameterTypes"); + return MakeDelegateType(returnType, parameterTypes.ToArray()); + } + + /// + /// Gets signature of a delegate of a . + /// + /// Type of the delegate. + /// A pair that contains return type as first element and parameter types as second arguments. + public static Pair GetDelegateSignature(Type delegateType) + { + ArgumentValidator.EnsureArgumentNotNull(delegateType, "delegateType"); + // check for non-generic Action + if (delegateType == ActionTypes[0]) + return new Pair(typeof(void), ArrayUtils.EmptyArray); + if (delegateType.IsGenericType) { + var genericTypeDefinition = delegateType.GetGenericTypeDefinition(); + var genericArguments = delegateType.GetGenericArguments(); + int genericArgumentsLength = genericArguments.Length; + // check for Func<> + if (genericArgumentsLength >= 1 + && genericArgumentsLength <= MaxNumberOfGenericDelegateParameters + 1 + && FuncTypes[genericArgumentsLength-1] == genericTypeDefinition) { + var parameterTypes = new Type[genericArguments.Length - 1]; + Array.Copy(genericArguments, parameterTypes, parameterTypes.Length); + return new Pair(genericArguments[genericArgumentsLength - 1], parameterTypes); + } + // check for Action<> + if (genericArgumentsLength >= 1 + && genericArgumentsLength <= MaxNumberOfGenericDelegateParameters + && ActionTypes[genericArgumentsLength] == genericTypeDefinition) + return new Pair(typeof(void), delegateType.GetGenericArguments()); + } + // universal (but slow) strategy - reflect "Invoke" method + var method = delegateType.GetMethod("Invoke", BindingFlags.Public | BindingFlags.Instance); + return new Pair(method.ReturnType, method.GetParameterTypes()); + } + + #region Private members + + private static Delegate GetCachedDelegate(object delegateKey) + { + Delegate result; + return + cachedDelegates.TryGetValue(delegateKey, out result) ? result : null; + } + + private static void AddCachedDelegate(object delegateKey, Delegate value) + { + cachedDelegates.SetValue(delegateKey, value); + } + + #endregion + + + // Type initializer + + static DelegateHelper() + { + opCodeConv.Add(typeof(sbyte), OpCodes.Conv_I1); + opCodeConv.Add(typeof(byte), OpCodes.Conv_U1); + opCodeConv.Add(typeof(short), OpCodes.Conv_I2); + opCodeConv.Add(typeof(ushort), OpCodes.Conv_U2); + opCodeConv.Add(typeof(char), OpCodes.Conv_U2); + opCodeConv.Add(typeof(int), OpCodes.Conv_I4); + opCodeConv.Add(typeof(uint), OpCodes.Conv_U4); + opCodeConv.Add(typeof(long), OpCodes.Conv_I8); + opCodeConv.Add(typeof(ulong), OpCodes.Conv_U8); + opCodeConv.Add(typeof(float), OpCodes.Conv_R4); + opCodeConv.Add(typeof(double), OpCodes.Conv_R8); + typeOnStack.Add(typeof(sbyte), typeof(int)); + typeOnStack.Add(typeof(byte), typeof(uint)); + typeOnStack.Add(typeof(short), typeof(int)); + typeOnStack.Add(typeof(ushort), typeof(uint)); + typeOnStack.Add(typeof(char), typeof(uint)); + typeOnStack.Add(typeof(int), typeof(int)); + typeOnStack.Add(typeof(uint), typeof(uint)); + typeOnStack.Add(typeof(long), typeof(long)); + typeOnStack.Add(typeof(ulong), typeof(ulong)); + typeOnStack.Add(typeof(float), typeof(float)); + typeOnStack.Add(typeof(double), typeof(double)); + + FuncTypes = new[] + { + typeof (Func<>), + + typeof (Func<,>), + typeof (Func<,,>), + typeof (Func<,,,>), + typeof (Func<,,,,>), + + typeof (Func<,,,,,>), + typeof (Func<,,,,,,>), + typeof (Func<,,,,,,,>), + typeof (Func<,,,,,,,,>), + + typeof (Func<,,,,,,,,,>), + typeof (Func<,,,,,,,,,,>), + typeof (Func<,,,,,,,,,,,>), + typeof (Func<,,,,,,,,,,,,>), + + typeof (Func<,,,,,,,,,,,,,>), + typeof (Func<,,,,,,,,,,,,,,>), + typeof (Func<,,,,,,,,,,,,,,,>), + typeof (Func<,,,,,,,,,,,,,,,,>), + }; + + ActionTypes = new[] + { + typeof (Action), + typeof (Action<>), + typeof (Action<,>), + typeof (Action<,,>), + typeof (Action<,,,>), + + typeof (Action<,,,,>), + typeof (Action<,,,,,>), + typeof (Action<,,,,,,>), + typeof (Action<,,,,,,,>), + + typeof (Action<,,,,,,,,>), + typeof (Action<,,,,,,,,,>), + typeof (Action<,,,,,,,,,,>), + typeof (Action<,,,,,,,,,,,>), + + typeof (Action<,,,,,,,,,,,,>), + typeof (Action<,,,,,,,,,,,,,>), + typeof (Action<,,,,,,,,,,,,,,>), + typeof (Action<,,,,,,,,,,,,,,,>), + }; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/ExecutionSequenceHandler.cs b/Orm/Xtensive.Orm/Reflection/ExecutionSequenceHandler.cs index 1f68f920c6..461dbc2a3b 100644 --- a/Orm/Xtensive.Orm/Reflection/ExecutionSequenceHandler.cs +++ b/Orm/Xtensive.Orm/Reflection/ExecutionSequenceHandler.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.02.09 - -namespace Xtensive.Reflection -{ - /// - /// Execution sequence handler - a delegate that can be passed to - /// method. - /// - /// Argument type. - /// Argument value. - /// Index of executed delegate in sequence. - /// , if execution of sequence should be stopped; - /// otherwise, . - public delegate bool ExecutionSequenceHandler(ref T argument, int index) - where T : struct; +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.02.09 + +namespace Xtensive.Reflection +{ + /// + /// Execution sequence handler - a delegate that can be passed to + /// method. + /// + /// Argument type. + /// Argument value. + /// Index of executed delegate in sequence. + /// , if execution of sequence should be stopped; + /// otherwise, . + public delegate bool ExecutionSequenceHandler(ref T argument, int index) + where T : struct; } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/InterfaceMapping.cs b/Orm/Xtensive.Orm/Reflection/InterfaceMapping.cs index 5747cd189e..eed26444f1 100644 --- a/Orm/Xtensive.Orm/Reflection/InterfaceMapping.cs +++ b/Orm/Xtensive.Orm/Reflection/InterfaceMapping.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2010.08.30 - -using System; -using System.Diagnostics; -using System.Reflection; -using Xtensive.Collections; - -using ReflectionInterfaceMapping=System.Reflection.InterfaceMapping; -using System.Linq; - -namespace Xtensive.Reflection -{ - /// - /// Faster analogue. - /// - [Serializable] - public sealed class InterfaceMapping - { - /// - /// Gets the target type of this mapping. - /// - public Type TargetType { get; private set; } - - /// - /// Gets the interface type of this mapping. - /// - public Type InterfaceType { get; private set; } - - /// - /// Gets the type members of this mapping. - /// - public ReadOnlyList TargetMethods { get; private set; } - - /// - /// Gets the interface members of this mapping. - /// - public ReadOnlyList InterfaceMethods { get; private set; } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The source mapping. - public InterfaceMapping(ReflectionInterfaceMapping source) - { - TargetType = source.TargetType; - InterfaceType = source.InterfaceType; - TargetMethods = new ReadOnlyList(source.TargetMethods.ToList()); - InterfaceMethods = new ReadOnlyList(source.InterfaceMethods.ToList()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2010.08.30 + +using System; +using System.Diagnostics; +using System.Reflection; +using Xtensive.Collections; + +using ReflectionInterfaceMapping=System.Reflection.InterfaceMapping; +using System.Linq; + +namespace Xtensive.Reflection +{ + /// + /// Faster analogue. + /// + [Serializable] + public sealed class InterfaceMapping + { + /// + /// Gets the target type of this mapping. + /// + public Type TargetType { get; private set; } + + /// + /// Gets the interface type of this mapping. + /// + public Type InterfaceType { get; private set; } + + /// + /// Gets the type members of this mapping. + /// + public ReadOnlyList TargetMethods { get; private set; } + + /// + /// Gets the interface members of this mapping. + /// + public ReadOnlyList InterfaceMethods { get; private set; } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The source mapping. + public InterfaceMapping(ReflectionInterfaceMapping source) + { + TargetType = source.TargetType; + InterfaceType = source.InterfaceType; + TargetMethods = new ReadOnlyList(source.TargetMethods.ToList()); + InterfaceMethods = new ReadOnlyList(source.InterfaceMethods.ToList()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/MemberHelper.cs b/Orm/Xtensive.Orm/Reflection/MemberHelper.cs index 80e31be8b5..a08d3c4310 100644 --- a/Orm/Xtensive.Orm/Reflection/MemberHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/MemberHelper.cs @@ -1,301 +1,301 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.13 - -using System; -using System.Reflection; -using System.Security; -using System.Text; -using Xtensive.Reflection; -using System.Linq; -using Xtensive.Collections; - - -namespace Xtensive.Reflection -{ - /// - /// related helper \ extension methods. - /// - public static class MemberHelper - { - /// - /// Gets the binding flags for the specified member. - /// - /// The member to get binding flags for. - /// Binding flags for the specified member. - public static BindingFlags GetBindingFlags(this MemberInfo member) - { - var mi = member as MethodInfo; - var ci = member as ConstructorInfo; - var fi = member as FieldInfo; - var pi = member as PropertyInfo; - var ei = member as EventInfo; - var flags = default(BindingFlags); - if (mi!=null) { - flags |= mi.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - flags |= mi.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return flags; - } - if (pi!=null) { - var getter = pi.GetGetMethod(true); - var setter = pi.GetSetMethod(true); - var method = getter ?? setter; - flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - if (getter!=null) - flags |= getter.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - if (setter!=null) - flags |= setter.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return flags; - } - if (fi!=null) { - flags |= fi.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - flags |= fi.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return flags; - } - if (ei!=null) { - var add = ei.GetAddMethod(true); - var remove = ei.GetRemoveMethod(true); - var method = add ?? remove; - flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - if (add!=null) - flags |= add.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - if (remove!=null) - flags |= remove.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return flags; - } - if (ci!=null) { - flags |= ci.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - flags |= ci.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return flags; - } - return flags; - } - - /// - /// Gets the base member for the specified . - /// - /// The member to get base member for. - /// Base member; - /// , if it does not exist. - public static MemberInfo GetBaseMember(this MemberInfo member) - { - try { - // Items are ordered by probability of their reflection - var pi = member as PropertyInfo; - if (pi!=null) { - var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); - var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetBaseMember(); - if (anyInterfaceAccessor==null) - return null; - return anyInterfaceAccessor.GetProperty(); - } - var fi = member as FieldInfo; - if (fi!=null) - return null; - var mi = member as MethodInfo; - if (mi!=null) { - if (mi.DeclaringType.IsInterface) - return null; - if (mi.IsExplicitImplementation()) - return mi.GetInterfaceMember(); - if (mi.IsAbstract || !mi.IsVirtual) - return null; -// var bmi = mi.GetBaseDefinition(); -// return bmi==mi ? null : bmi; - var bmi = mi.DeclaringType.UnderlyingSystemType.BaseType - .GetMethod(mi.Name, mi.GetBindingFlags() | BindingFlags.ExactBinding, null, mi.GetParameterTypes(), null); - return bmi ?? mi.GetInterfaceMember(); - } - var ci = member as ConstructorInfo; - if (ci!=null) - return null; - var ei = member as EventInfo; - if (ei!=null) { - var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); - var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetBaseMember(); - if (anyInterfaceAccessor==null) - return null; - return anyInterfaceAccessor.GetEvent(); - } - var ti = member as Type; - if (ti!=null) - return ti.BaseType; - } - catch { - } - return null; - } - - #region Interface related methods - - /// - /// Determines whether the specified - /// is explicit implementation of some interface member. - /// - /// The member to check. - /// Check result. - public static bool IsExplicitImplementation(this MemberInfo member) - { - var mi = member as MethodInfo; - var pi = member as PropertyInfo; - var ei = member as EventInfo; - if (mi!=null) { - if (mi.IsPublic) - return false; - if (mi.GetInterfaceMember()==null) - return false; - return mi.IsPrivate; - } - if (pi!=null) - return (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)).IsExplicitImplementation(); - if (ei!=null) - return (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)).IsExplicitImplementation(); - return false; - } - - /// - /// Gets the interface member implementation in its implementor. - /// - /// The member to get the implementation member for. - /// Implementation member; - /// , if no implementation member maps to the specified one. - public static MemberInfo GetImplementation(this MemberInfo member, Type implementor) - { - if (implementor.IsInterface) - return null; - var mi = member as MethodInfo; - var pi = member as PropertyInfo; - var ei = member as EventInfo; - if (mi!=null) { - var iType = mi.DeclaringType.UnderlyingSystemType; - var map = implementor.GetInterfaceMapFast(iType); - for (int i = 0; i < map.InterfaceMethods.Count; i++) { - if (mi==map.InterfaceMethods[i]) - return map.TargetMethods[i]; - } - return null; - } - if (pi!=null) { - var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); - var anyAccessorImplementor = (MethodInfo) anyAccessor.GetImplementation(implementor); - if (anyAccessorImplementor==null) - return null; - return anyAccessorImplementor.GetProperty(); - } - if (ei!=null) { - var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); - var anyAccessorImplementor = (MethodInfo) anyAccessor.GetImplementation(implementor); - if (anyAccessorImplementor==null) - return null; - return anyAccessorImplementor.GetEvent(); - } - return null; - } - - /// - /// Gets the interface member for its explicit or implicit implementor. - /// - /// The member to get the interface member for. - /// Interface member; - /// , if no interface member maps to the specified one, - /// or the member itself is declared in interface. - [SecuritySafeCritical] - public static MemberInfo GetInterfaceMember(this MemberInfo member) - { - if (member.DeclaringType.IsInterface) - return null; - var mi = member as MethodInfo; - var pi = member as PropertyInfo; - var ei = member as EventInfo; - if (mi!=null) { - var type = mi.DeclaringType.UnderlyingSystemType; - foreach (var iType in type.GetInterfaces()) { - var map = type.GetInterfaceMapFast(iType.UnderlyingSystemType); - for (int i = 0; i < map.InterfaceMethods.Count; i++) { - var tmi = map.TargetMethods[i]; - if (mi==tmi) - return map.InterfaceMethods[i]; - if (mi.GetType().FullName==WellKnown.RuntimeMethodInfoName && - tmi.GetType().FullName==WellKnown.RuntimeMethodInfoName && - mi.MethodHandle.Value==tmi.MethodHandle.Value) - return map.InterfaceMethods[i]; - } - } - return null; - } - if (pi!=null) { - var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); - var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetInterfaceMember(); - if (anyInterfaceAccessor==null) - return null; - return anyInterfaceAccessor.GetProperty(); - } - if (ei!=null) { - var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); - var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetInterfaceMember(); - if (anyInterfaceAccessor==null) - return null; - return anyInterfaceAccessor.GetEvent(); - } - return null; - } - - #endregion - - /// - /// Builds correct full generic type and member name. - /// - /// A object which name is built. - /// Indicates whether type name must be included or not. - /// Full member name. - public static string GetFullName(this MemberInfo member, bool includeTypeName) - { - if (member==null) - return null; - if (!includeTypeName) { - if (!member.IsExplicitImplementation()) - return member.Name; - var im = member.GetInterfaceMember(); - return new StringBuilder() - .Append(im.DeclaringType.GetFullName()) - .Append(".") - .Append(im.GetFullName(false)) - .ToString(); - } - return new StringBuilder() - .Append(member.DeclaringType.GetFullName()) - .Append(".") - .Append(member.GetFullName(false)) - .ToString(); - } - - /// - /// Builds correct short generic type and member name. - /// - /// A object which name is built. - /// Indicates whether type name must be included or not. - /// Short member name. - public static string GetShortName(this MemberInfo member, bool includeTypeName) - { - if (member==null) - return null; - var name = member.Name; - if (!includeTypeName) { - int i = name.LastIndexOf('.'); - if (i<=0) - return name; - i = name.LastIndexOf('.', i-1); - if (i<=0) - return name; - return name.Substring(i + 1); - } - return new StringBuilder() - .Append(member.DeclaringType.GetShortName()) - .Append(".") - .Append(member.GetShortName(false)) - .ToString(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.13 + +using System; +using System.Reflection; +using System.Security; +using System.Text; +using Xtensive.Reflection; +using System.Linq; +using Xtensive.Collections; + + +namespace Xtensive.Reflection +{ + /// + /// related helper \ extension methods. + /// + public static class MemberHelper + { + /// + /// Gets the binding flags for the specified member. + /// + /// The member to get binding flags for. + /// Binding flags for the specified member. + public static BindingFlags GetBindingFlags(this MemberInfo member) + { + var mi = member as MethodInfo; + var ci = member as ConstructorInfo; + var fi = member as FieldInfo; + var pi = member as PropertyInfo; + var ei = member as EventInfo; + var flags = default(BindingFlags); + if (mi!=null) { + flags |= mi.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + flags |= mi.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return flags; + } + if (pi!=null) { + var getter = pi.GetGetMethod(true); + var setter = pi.GetSetMethod(true); + var method = getter ?? setter; + flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + if (getter!=null) + flags |= getter.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + if (setter!=null) + flags |= setter.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return flags; + } + if (fi!=null) { + flags |= fi.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + flags |= fi.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return flags; + } + if (ei!=null) { + var add = ei.GetAddMethod(true); + var remove = ei.GetRemoveMethod(true); + var method = add ?? remove; + flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + if (add!=null) + flags |= add.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + if (remove!=null) + flags |= remove.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return flags; + } + if (ci!=null) { + flags |= ci.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + flags |= ci.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return flags; + } + return flags; + } + + /// + /// Gets the base member for the specified . + /// + /// The member to get base member for. + /// Base member; + /// , if it does not exist. + public static MemberInfo GetBaseMember(this MemberInfo member) + { + try { + // Items are ordered by probability of their reflection + var pi = member as PropertyInfo; + if (pi!=null) { + var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); + var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetBaseMember(); + if (anyInterfaceAccessor==null) + return null; + return anyInterfaceAccessor.GetProperty(); + } + var fi = member as FieldInfo; + if (fi!=null) + return null; + var mi = member as MethodInfo; + if (mi!=null) { + if (mi.DeclaringType.IsInterface) + return null; + if (mi.IsExplicitImplementation()) + return mi.GetInterfaceMember(); + if (mi.IsAbstract || !mi.IsVirtual) + return null; +// var bmi = mi.GetBaseDefinition(); +// return bmi==mi ? null : bmi; + var bmi = mi.DeclaringType.UnderlyingSystemType.BaseType + .GetMethod(mi.Name, mi.GetBindingFlags() | BindingFlags.ExactBinding, null, mi.GetParameterTypes(), null); + return bmi ?? mi.GetInterfaceMember(); + } + var ci = member as ConstructorInfo; + if (ci!=null) + return null; + var ei = member as EventInfo; + if (ei!=null) { + var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); + var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetBaseMember(); + if (anyInterfaceAccessor==null) + return null; + return anyInterfaceAccessor.GetEvent(); + } + var ti = member as Type; + if (ti!=null) + return ti.BaseType; + } + catch { + } + return null; + } + + #region Interface related methods + + /// + /// Determines whether the specified + /// is explicit implementation of some interface member. + /// + /// The member to check. + /// Check result. + public static bool IsExplicitImplementation(this MemberInfo member) + { + var mi = member as MethodInfo; + var pi = member as PropertyInfo; + var ei = member as EventInfo; + if (mi!=null) { + if (mi.IsPublic) + return false; + if (mi.GetInterfaceMember()==null) + return false; + return mi.IsPrivate; + } + if (pi!=null) + return (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)).IsExplicitImplementation(); + if (ei!=null) + return (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)).IsExplicitImplementation(); + return false; + } + + /// + /// Gets the interface member implementation in its implementor. + /// + /// The member to get the implementation member for. + /// Implementation member; + /// , if no implementation member maps to the specified one. + public static MemberInfo GetImplementation(this MemberInfo member, Type implementor) + { + if (implementor.IsInterface) + return null; + var mi = member as MethodInfo; + var pi = member as PropertyInfo; + var ei = member as EventInfo; + if (mi!=null) { + var iType = mi.DeclaringType.UnderlyingSystemType; + var map = implementor.GetInterfaceMapFast(iType); + for (int i = 0; i < map.InterfaceMethods.Count; i++) { + if (mi==map.InterfaceMethods[i]) + return map.TargetMethods[i]; + } + return null; + } + if (pi!=null) { + var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); + var anyAccessorImplementor = (MethodInfo) anyAccessor.GetImplementation(implementor); + if (anyAccessorImplementor==null) + return null; + return anyAccessorImplementor.GetProperty(); + } + if (ei!=null) { + var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); + var anyAccessorImplementor = (MethodInfo) anyAccessor.GetImplementation(implementor); + if (anyAccessorImplementor==null) + return null; + return anyAccessorImplementor.GetEvent(); + } + return null; + } + + /// + /// Gets the interface member for its explicit or implicit implementor. + /// + /// The member to get the interface member for. + /// Interface member; + /// , if no interface member maps to the specified one, + /// or the member itself is declared in interface. + [SecuritySafeCritical] + public static MemberInfo GetInterfaceMember(this MemberInfo member) + { + if (member.DeclaringType.IsInterface) + return null; + var mi = member as MethodInfo; + var pi = member as PropertyInfo; + var ei = member as EventInfo; + if (mi!=null) { + var type = mi.DeclaringType.UnderlyingSystemType; + foreach (var iType in type.GetInterfaces()) { + var map = type.GetInterfaceMapFast(iType.UnderlyingSystemType); + for (int i = 0; i < map.InterfaceMethods.Count; i++) { + var tmi = map.TargetMethods[i]; + if (mi==tmi) + return map.InterfaceMethods[i]; + if (mi.GetType().FullName==WellKnown.RuntimeMethodInfoName && + tmi.GetType().FullName==WellKnown.RuntimeMethodInfoName && + mi.MethodHandle.Value==tmi.MethodHandle.Value) + return map.InterfaceMethods[i]; + } + } + return null; + } + if (pi!=null) { + var anyAccessor = (pi.GetGetMethod(true) ?? pi.GetSetMethod(true)); + var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetInterfaceMember(); + if (anyInterfaceAccessor==null) + return null; + return anyInterfaceAccessor.GetProperty(); + } + if (ei!=null) { + var anyAccessor = (ei.GetAddMethod(true) ?? ei.GetRemoveMethod(true)); + var anyInterfaceAccessor = (MethodInfo) anyAccessor.GetInterfaceMember(); + if (anyInterfaceAccessor==null) + return null; + return anyInterfaceAccessor.GetEvent(); + } + return null; + } + + #endregion + + /// + /// Builds correct full generic type and member name. + /// + /// A object which name is built. + /// Indicates whether type name must be included or not. + /// Full member name. + public static string GetFullName(this MemberInfo member, bool includeTypeName) + { + if (member==null) + return null; + if (!includeTypeName) { + if (!member.IsExplicitImplementation()) + return member.Name; + var im = member.GetInterfaceMember(); + return new StringBuilder() + .Append(im.DeclaringType.GetFullName()) + .Append(".") + .Append(im.GetFullName(false)) + .ToString(); + } + return new StringBuilder() + .Append(member.DeclaringType.GetFullName()) + .Append(".") + .Append(member.GetFullName(false)) + .ToString(); + } + + /// + /// Builds correct short generic type and member name. + /// + /// A object which name is built. + /// Indicates whether type name must be included or not. + /// Short member name. + public static string GetShortName(this MemberInfo member, bool includeTypeName) + { + if (member==null) + return null; + var name = member.Name; + if (!includeTypeName) { + int i = name.LastIndexOf('.'); + if (i<=0) + return name; + i = name.LastIndexOf('.', i-1); + if (i<=0) + return name; + return name.Substring(i + 1); + } + return new StringBuilder() + .Append(member.DeclaringType.GetShortName()) + .Append(".") + .Append(member.GetShortName(false)) + .ToString(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/MethodHelper.cs b/Orm/Xtensive.Orm/Reflection/MethodHelper.cs index 04ef1b79ae..02fb3c4d32 100644 --- a/Orm/Xtensive.Orm/Reflection/MethodHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/MethodHelper.cs @@ -1,373 +1,373 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.27 - -using System; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; - -namespace Xtensive.Reflection -{ - /// - /// related helper \ extension methods. - /// - public static class MethodHelper - { - /// - /// This class is used internally by to denote - /// an array of any type when matching parameter types - /// in and . - /// - public struct AnyArrayPlaceholder - { - } - - /// - /// Gets generic method by names \ types of its arguments. - /// - /// Type to search the method in. - /// Method name. - /// Binding attributes. - /// Generic arguments of the method. - /// Either strings or s of parameters (mixing is allowed). - /// Found method, if match was found; - /// otherwise, . - [DebuggerStepThrough] - public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags, string[] genericArgumentNames, object[] parameterTypes) - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - - if (genericArgumentNames==null) - genericArgumentNames = ArrayUtils.EmptyArray; - if (parameterTypes==null) - parameterTypes = ArrayUtils.EmptyArray; - bool parameterTypesAreFullyDefined = true; - for (int i = 0; i - /// Gets constructor by names \ types of its parameters. - /// - /// Type to search constructor in. - /// Binding attributes. - /// Either strings or s of parameters (mixing is allowed). - /// Found constructor, if match was found; - /// otherwise, . - public static ConstructorInfo GetConstructor(this Type type, BindingFlags bindingFlags, object[] parameterTypes) - { - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - - if (parameterTypes == null) - parameterTypes = ArrayUtils.EmptyArray; - - if (parameterTypes.All(o => o is Type)) - return type.GetConstructor(bindingFlags, null, - parameterTypes.Select(o => (Type) o).ToArray(), null); - - var genericArgumentNames = ArrayUtils.EmptyArray; - ConstructorInfo lastMatch = null; - - foreach (ConstructorInfo ci in type.GetConstructors(bindingFlags)) { - if (CheckMethod(ci, type, WellKnown.CtorName, genericArgumentNames, parameterTypes)) { - if (lastMatch!=null) - throw new AmbiguousMatchException(); - lastMatch = ci; - } - } - - return lastMatch; - } - - /// - /// Gets the types of method parameters. - /// - /// The method to get the types of parameters of. - /// The array of types of method parameters. - public static Type[] GetParameterTypes(this MethodBase method) - { - var parameters = method.GetParameters(); - var types = new Type[parameters.Length]; - for (int i = 0; i < parameters.Length; i++) - types[i] = parameters[i].ParameterType; - return types; - } - - #region Property-related methods - - /// - /// Determines whether the specified method is a property accessor. - /// - /// The method to check. - /// - /// if the specified method is property accessor; - /// otherwise, . - /// - public static bool IsPropertyAccessor(this MethodInfo method) - { - return method.IsGetter() || method.IsSetter(); - } - - /// - /// Determines whether the specified method is a property getter. - /// - /// The method to check. - /// - /// if the specified method is getter; - /// otherwise, . - /// - public static bool IsGetter(this MethodInfo method) - { - if (!method.IsSpecialName) - return false; - return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.GetterPrefix); - } - - /// - /// Determines whether the specified method is a property setter. - /// - /// The method to check. - /// - /// if the specified method is setter; - /// otherwise, . - /// - public static bool IsSetter(this MethodInfo method) - { - if (!method.IsSpecialName) - return false; - return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.SetterPrefix); - } - - /// - /// Gets the property to which belongs. - /// - /// The method to get the property for. - /// Found property; - /// , if no property is associated with the method. - public static PropertyInfo GetProperty(this MethodInfo method) - { - if (!method.IsSpecialName) - return null; - var type = method.DeclaringType.UnderlyingSystemType; - string name = method.Name; - string propertyName = TryCutMethodNamePrefix(name, WellKnown.GetterPrefix); - var bindingFlags = method.GetBindingFlags() | BindingFlags.Public; - if (method.IsExplicitImplementation()) - bindingFlags |= BindingFlags.Public; - if (propertyName!=name) - return GetPropertyRecursive(type, bindingFlags, propertyName); - propertyName = TryCutMethodNamePrefix(name, WellKnown.SetterPrefix); - if (propertyName!=name) - return GetPropertyRecursive(type, bindingFlags, propertyName); - return null; - } - - private static PropertyInfo GetPropertyRecursive(Type type, BindingFlags bindingFlags, string propertyName) - { - if (type.IsInterface) - return type.GetProperty(propertyName, bindingFlags); - bindingFlags |= BindingFlags.DeclaredOnly; - while (type!=null) { - var property = type.GetProperty(propertyName, bindingFlags); - if (property!=null) - return property; - type = type.BaseType; - } - return null; - } - - #endregion - - #region Event-related methods - - /// - /// Determines whether the specified method is an event accessor. - /// - /// The method to check. - /// - /// if the specified method is event accessor; - /// otherwise, . - /// - public static bool IsEventAccessor(this MethodInfo method) - { - return method.IsAddEventHandler() || method.IsRemoveEventHandler(); - } - - /// - /// Determines whether the specified method is "add event handler" method. - /// - /// The method to check. - /// - /// if the specified method is "add event handler" method; - /// otherwise, . - /// - public static bool IsAddEventHandler(this MethodInfo method) - { - if (!method.IsSpecialName) - return false; - return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.AddEventHandlerPrefix); - } - - /// - /// Determines whether the specified method is "remove event handler" method. - /// - /// The method to check. - /// - /// if the specified method is "remove event handler" method; - /// otherwise, . - /// - public static bool IsRemoveEventHandler(this MethodInfo method) - { - if (!method.IsSpecialName) - return false; - return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.RemoveEventHandlerPrefix); - } - - /// - /// Gets the event to which belongs. - /// - /// The method to get the event for. - /// Found event; - /// , if no event is associated with the method. - public static EventInfo GetEvent(this MethodInfo method) - { - if (!method.IsSpecialName) - return null; - var type = method.DeclaringType.UnderlyingSystemType; - string name = method.Name; - string eventName = TryCutMethodNamePrefix(name, WellKnown.AddEventHandlerPrefix); - var bindingFlags = method.GetBindingFlags() | BindingFlags.Public; - if (method.IsExplicitImplementation()) - bindingFlags |= BindingFlags.Public; - if (eventName!=name) - return GetEventRecursive(bindingFlags, eventName, type); - eventName = TryCutMethodNamePrefix(name, WellKnown.RemoveEventHandlerPrefix); - if (eventName!=name) - return GetEventRecursive(bindingFlags, eventName, type); - return null; - } - - private static EventInfo GetEventRecursive(BindingFlags bindingFlags, string eventName, Type type) - { - if (type.IsInterface) - return type.GetEvent(eventName, bindingFlags); - bindingFlags |= BindingFlags.DeclaredOnly; - while (type!=null) { - var eventInfo = type.GetEvent(eventName, bindingFlags); - if (eventInfo!=null) - return eventInfo; - type = type.BaseType; - } - return null; - } - - #endregion - - #region Private \ internal methods - - private static bool CheckMethod(MethodBase m, Type type, string name, string[] genericArgumentNames, object[] parameterTypes) - { - // Checking name - if (m.Name!=name) - return false; - int matchCount = 0; - if (m.IsGenericMethod) { - // Checking generic arguments (just by their names, if defined) - Type[] genericArguments = m.GetGenericArguments(); - if (genericArguments.Length!=genericArgumentNames.Length) - return false; - for (int i = 0; i < genericArguments.Length; i++) - if (!genericArgumentNames[i].IsNullOrEmpty() && genericArgumentNames[i]!=genericArguments[i].Name) - break; - else - matchCount++; - if (matchCount!=genericArguments.Length) - return false; - } - else { - // Non-generic method - if (genericArgumentNames.Length!=0) - return false; - } - // Checking parameter types - ParameterInfo[] parameters = m.GetParameters(); - if (parameters.Length!=parameterTypes.Length) - return false; - matchCount = 0; - for (int i = 0; i=0) { - result = methodName.Substring(0, i+1) + methodName.Substring(i+1).TryCutPrefix(prefixToCut); - if (result!=methodName) - return result; - } - return methodName; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.27 + +using System; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; + +namespace Xtensive.Reflection +{ + /// + /// related helper \ extension methods. + /// + public static class MethodHelper + { + /// + /// This class is used internally by to denote + /// an array of any type when matching parameter types + /// in and . + /// + public struct AnyArrayPlaceholder + { + } + + /// + /// Gets generic method by names \ types of its arguments. + /// + /// Type to search the method in. + /// Method name. + /// Binding attributes. + /// Generic arguments of the method. + /// Either strings or s of parameters (mixing is allowed). + /// Found method, if match was found; + /// otherwise, . + [DebuggerStepThrough] + public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags, string[] genericArgumentNames, object[] parameterTypes) + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + + if (genericArgumentNames==null) + genericArgumentNames = ArrayUtils.EmptyArray; + if (parameterTypes==null) + parameterTypes = ArrayUtils.EmptyArray; + bool parameterTypesAreFullyDefined = true; + for (int i = 0; i + /// Gets constructor by names \ types of its parameters. + /// + /// Type to search constructor in. + /// Binding attributes. + /// Either strings or s of parameters (mixing is allowed). + /// Found constructor, if match was found; + /// otherwise, . + public static ConstructorInfo GetConstructor(this Type type, BindingFlags bindingFlags, object[] parameterTypes) + { + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + + if (parameterTypes == null) + parameterTypes = ArrayUtils.EmptyArray; + + if (parameterTypes.All(o => o is Type)) + return type.GetConstructor(bindingFlags, null, + parameterTypes.Select(o => (Type) o).ToArray(), null); + + var genericArgumentNames = ArrayUtils.EmptyArray; + ConstructorInfo lastMatch = null; + + foreach (ConstructorInfo ci in type.GetConstructors(bindingFlags)) { + if (CheckMethod(ci, type, WellKnown.CtorName, genericArgumentNames, parameterTypes)) { + if (lastMatch!=null) + throw new AmbiguousMatchException(); + lastMatch = ci; + } + } + + return lastMatch; + } + + /// + /// Gets the types of method parameters. + /// + /// The method to get the types of parameters of. + /// The array of types of method parameters. + public static Type[] GetParameterTypes(this MethodBase method) + { + var parameters = method.GetParameters(); + var types = new Type[parameters.Length]; + for (int i = 0; i < parameters.Length; i++) + types[i] = parameters[i].ParameterType; + return types; + } + + #region Property-related methods + + /// + /// Determines whether the specified method is a property accessor. + /// + /// The method to check. + /// + /// if the specified method is property accessor; + /// otherwise, . + /// + public static bool IsPropertyAccessor(this MethodInfo method) + { + return method.IsGetter() || method.IsSetter(); + } + + /// + /// Determines whether the specified method is a property getter. + /// + /// The method to check. + /// + /// if the specified method is getter; + /// otherwise, . + /// + public static bool IsGetter(this MethodInfo method) + { + if (!method.IsSpecialName) + return false; + return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.GetterPrefix); + } + + /// + /// Determines whether the specified method is a property setter. + /// + /// The method to check. + /// + /// if the specified method is setter; + /// otherwise, . + /// + public static bool IsSetter(this MethodInfo method) + { + if (!method.IsSpecialName) + return false; + return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.SetterPrefix); + } + + /// + /// Gets the property to which belongs. + /// + /// The method to get the property for. + /// Found property; + /// , if no property is associated with the method. + public static PropertyInfo GetProperty(this MethodInfo method) + { + if (!method.IsSpecialName) + return null; + var type = method.DeclaringType.UnderlyingSystemType; + string name = method.Name; + string propertyName = TryCutMethodNamePrefix(name, WellKnown.GetterPrefix); + var bindingFlags = method.GetBindingFlags() | BindingFlags.Public; + if (method.IsExplicitImplementation()) + bindingFlags |= BindingFlags.Public; + if (propertyName!=name) + return GetPropertyRecursive(type, bindingFlags, propertyName); + propertyName = TryCutMethodNamePrefix(name, WellKnown.SetterPrefix); + if (propertyName!=name) + return GetPropertyRecursive(type, bindingFlags, propertyName); + return null; + } + + private static PropertyInfo GetPropertyRecursive(Type type, BindingFlags bindingFlags, string propertyName) + { + if (type.IsInterface) + return type.GetProperty(propertyName, bindingFlags); + bindingFlags |= BindingFlags.DeclaredOnly; + while (type!=null) { + var property = type.GetProperty(propertyName, bindingFlags); + if (property!=null) + return property; + type = type.BaseType; + } + return null; + } + + #endregion + + #region Event-related methods + + /// + /// Determines whether the specified method is an event accessor. + /// + /// The method to check. + /// + /// if the specified method is event accessor; + /// otherwise, . + /// + public static bool IsEventAccessor(this MethodInfo method) + { + return method.IsAddEventHandler() || method.IsRemoveEventHandler(); + } + + /// + /// Determines whether the specified method is "add event handler" method. + /// + /// The method to check. + /// + /// if the specified method is "add event handler" method; + /// otherwise, . + /// + public static bool IsAddEventHandler(this MethodInfo method) + { + if (!method.IsSpecialName) + return false; + return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.AddEventHandlerPrefix); + } + + /// + /// Determines whether the specified method is "remove event handler" method. + /// + /// The method to check. + /// + /// if the specified method is "remove event handler" method; + /// otherwise, . + /// + public static bool IsRemoveEventHandler(this MethodInfo method) + { + if (!method.IsSpecialName) + return false; + return method.Name!=TryCutMethodNamePrefix(method.Name, WellKnown.RemoveEventHandlerPrefix); + } + + /// + /// Gets the event to which belongs. + /// + /// The method to get the event for. + /// Found event; + /// , if no event is associated with the method. + public static EventInfo GetEvent(this MethodInfo method) + { + if (!method.IsSpecialName) + return null; + var type = method.DeclaringType.UnderlyingSystemType; + string name = method.Name; + string eventName = TryCutMethodNamePrefix(name, WellKnown.AddEventHandlerPrefix); + var bindingFlags = method.GetBindingFlags() | BindingFlags.Public; + if (method.IsExplicitImplementation()) + bindingFlags |= BindingFlags.Public; + if (eventName!=name) + return GetEventRecursive(bindingFlags, eventName, type); + eventName = TryCutMethodNamePrefix(name, WellKnown.RemoveEventHandlerPrefix); + if (eventName!=name) + return GetEventRecursive(bindingFlags, eventName, type); + return null; + } + + private static EventInfo GetEventRecursive(BindingFlags bindingFlags, string eventName, Type type) + { + if (type.IsInterface) + return type.GetEvent(eventName, bindingFlags); + bindingFlags |= BindingFlags.DeclaredOnly; + while (type!=null) { + var eventInfo = type.GetEvent(eventName, bindingFlags); + if (eventInfo!=null) + return eventInfo; + type = type.BaseType; + } + return null; + } + + #endregion + + #region Private \ internal methods + + private static bool CheckMethod(MethodBase m, Type type, string name, string[] genericArgumentNames, object[] parameterTypes) + { + // Checking name + if (m.Name!=name) + return false; + int matchCount = 0; + if (m.IsGenericMethod) { + // Checking generic arguments (just by their names, if defined) + Type[] genericArguments = m.GetGenericArguments(); + if (genericArguments.Length!=genericArgumentNames.Length) + return false; + for (int i = 0; i < genericArguments.Length; i++) + if (!genericArgumentNames[i].IsNullOrEmpty() && genericArgumentNames[i]!=genericArguments[i].Name) + break; + else + matchCount++; + if (matchCount!=genericArguments.Length) + return false; + } + else { + // Non-generic method + if (genericArgumentNames.Length!=0) + return false; + } + // Checking parameter types + ParameterInfo[] parameters = m.GetParameters(); + if (parameters.Length!=parameterTypes.Length) + return false; + matchCount = 0; + for (int i = 0; i=0) { + result = methodName.Substring(0, i+1) + methodName.Substring(i+1).TryCutPrefix(prefixToCut); + if (result!=methodName) + return result; + } + return methodName; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/SequenceHelper.cs b/Orm/Xtensive.Orm/Reflection/SequenceHelper.cs index 5956488d25..3892611e28 100644 --- a/Orm/Xtensive.Orm/Reflection/SequenceHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/SequenceHelper.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.04.17 - -using System; -using System.Collections.Generic; - -namespace Xtensive.Reflection -{ - /// - /// helper methods. - /// - public static class SequenceHelper - { - /// - /// Gets the generic type of where is generic argument. - /// - /// Type of the element. - public static Type GetSequenceType(Type elementType) - { - return typeof (IEnumerable<>).MakeGenericType(elementType); - } - - /// - /// Gets element type of the sequence. - /// - /// Type of the sequence. - public static Type GetElementType(Type sequenceType) - { - Type ienum = FindIEnumerable(sequenceType); - return ienum == null - ? sequenceType - : ienum.GetGenericArguments()[0]; - } - - private static Type FindIEnumerable(Type sequenceType) - { - if (sequenceType == null || sequenceType == typeof (string)) - return null; - if (sequenceType.IsArray) - return typeof (IEnumerable<>).MakeGenericType(sequenceType.GetElementType()); - if (sequenceType.IsGenericType) - foreach (Type arg in sequenceType.GetGenericArguments()) { - Type enumerable = typeof (IEnumerable<>).MakeGenericType(arg); - if (enumerable.IsAssignableFrom(sequenceType)) - return enumerable; - } - Type[] interfaces = sequenceType.GetInterfaces(); - if (interfaces != null && interfaces.Length > 0) - foreach (Type @interface in interfaces) { - Type enumerable = FindIEnumerable(@interface); - if (enumerable != null) - return enumerable; - } - if (sequenceType.BaseType != null && sequenceType.BaseType != typeof (object)) - return FindIEnumerable(sequenceType.BaseType); - return null; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.04.17 + +using System; +using System.Collections.Generic; + +namespace Xtensive.Reflection +{ + /// + /// helper methods. + /// + public static class SequenceHelper + { + /// + /// Gets the generic type of where is generic argument. + /// + /// Type of the element. + public static Type GetSequenceType(Type elementType) + { + return typeof (IEnumerable<>).MakeGenericType(elementType); + } + + /// + /// Gets element type of the sequence. + /// + /// Type of the sequence. + public static Type GetElementType(Type sequenceType) + { + Type ienum = FindIEnumerable(sequenceType); + return ienum == null + ? sequenceType + : ienum.GetGenericArguments()[0]; + } + + private static Type FindIEnumerable(Type sequenceType) + { + if (sequenceType == null || sequenceType == typeof (string)) + return null; + if (sequenceType.IsArray) + return typeof (IEnumerable<>).MakeGenericType(sequenceType.GetElementType()); + if (sequenceType.IsGenericType) + foreach (Type arg in sequenceType.GetGenericArguments()) { + Type enumerable = typeof (IEnumerable<>).MakeGenericType(arg); + if (enumerable.IsAssignableFrom(sequenceType)) + return enumerable; + } + Type[] interfaces = sequenceType.GetInterfaces(); + if (interfaces != null && interfaces.Length > 0) + foreach (Type @interface in interfaces) { + Type enumerable = FindIEnumerable(@interface); + if (enumerable != null) + return enumerable; + } + if (sequenceType.BaseType != null && sequenceType.BaseType != typeof (object)) + return FindIEnumerable(sequenceType.BaseType); + return null; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/TypeHelper.cs b/Orm/Xtensive.Orm/Reflection/TypeHelper.cs index c2f5a07671..56da0889c9 100644 --- a/Orm/Xtensive.Orm/Reflection/TypeHelper.cs +++ b/Orm/Xtensive.Orm/Reflection/TypeHelper.cs @@ -1,1148 +1,1148 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2007.06.13 - -using System; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Reflection; -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading; -using Xtensive.Collections; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Sorting; - - -namespace Xtensive.Reflection -{ - /// - /// related helper \ extension methods. - /// - public static class TypeHelper - { - private const string invokeMethodName = "Invoke"; - - private static readonly object emitLock = new object(); - private static readonly Type ObjectType = typeof(object); - private static readonly Type ArrayType = typeof(Array); - private static readonly Type EnumType = typeof(Enum); - private static readonly Type NullableType = typeof(Nullable<>); - private static readonly int NullableTypeMetadataToken = NullableType.MetadataToken; - private static readonly Module NullableTypeModule = NullableType.Module; - private static readonly Type CompilerGeneratedAttributeType = typeof(CompilerGeneratedAttribute); - private static readonly string TypeHelperNamespace = typeof(TypeHelper).Namespace; - - private static readonly ConcurrentDictionary orderedInterfaces = - new ConcurrentDictionary(); - - private static readonly ConcurrentDictionary orderedCompatibles = - new ConcurrentDictionary(); - - private static readonly ConcurrentDictionary, InterfaceMapping> interfaceMaps = - new ConcurrentDictionary, InterfaceMapping>(); - - private static int createDummyTypeNumber = 0; - private static AssemblyBuilder assemblyBuilder; - private static ModuleBuilder moduleBuilder; - - /// - /// Searches for associated class for , creates its instance, if found. - /// Otherwise returns . - /// - /// Type of result. Can be ether class or interface. - /// Type to search the associate for. - /// Type the associate was found for. - /// Associate type name suffix. - /// Parameters to pass to associate constructor. - /// Newly created associate for , if found; - /// otherwise, . - public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, - object[] constructorParams) - where T : class => - CreateAssociate(forType, out foundForType, associateTypeSuffixes, constructorParams, - Array.Empty>()); - - /// - /// Searches for associated class for , creates its instance, if found. - /// Otherwise returns . - /// - /// Type of result. Can be ether class or interface. - /// Type to search the associate for. - /// Type the associate was found for. - /// Associate type name suffix. - /// High-priority search locations (assembly + namespace pairs). - /// Parameters to pass to associate constructor. - /// Newly created associate for , if found; - /// otherwise, . - public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, - object[] constructorParams, IEnumerable> highPriorityLocations) - where T : class => - CreateAssociate(forType, out foundForType, associateTypeSuffixes, constructorParams, highPriorityLocations, - false); - - /// - /// Searches for associated class for , creates its instance, if found. - /// Otherwise returns . - /// - /// Type of result. Can be ether class or interface. - /// Type to search the associate for. - /// Type the associate was found for. - /// Associate type name suffix. - /// High-priority search locations (assembly + namespace pairs). - /// Parameters to pass to associate constructor. - /// Newly created associate for , if found; - /// otherwise, . - /// If tries to create associates for base class, interfaces, - /// arrays and (if struct) too. - /// is generic type definition. - public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, - object[] constructorParams, IEnumerable> highPriorityLocations, bool exactTypeMatch) - where T : class - { - ArgumentValidator.EnsureArgumentNotNull(forType, nameof(forType)); - if (forType.IsGenericTypeDefinition) { - throw new InvalidOperationException(string.Format( - Strings.ExCantCreateAssociateForGenericTypeDefinitions, GetShortName(forType))); - } - - var locations = new List>(1); - if (highPriorityLocations != null) { - locations.AddRange(highPriorityLocations); - } - - return - CreateAssociateInternal(forType, forType, out foundForType, associateTypeSuffixes, constructorParams, - locations, exactTypeMatch); - } - - private static T CreateAssociateInternal(Type originalForType, Type currentForType, out Type foundForType, - string[] associateTypeSuffixes, object[] constructorParams, List> locations, - bool exactTypeMatch) - where T : class - { - if (currentForType == null) { - foundForType = null; - return null; - } - - string associateTypePrefix; - Type[] genericArguments; - - // Possible cases: generic type, array type, regular type - if (currentForType.IsGenericType) { - // Generic type - associateTypePrefix = currentForType.Name; - genericArguments = currentForType.GetGenericArguments(); - } - else if (currentForType.IsArray) { - // Array type - var elementType = currentForType.GetElementType(); - var rank = currentForType.GetArrayRank(); - associateTypePrefix = rank == 1 ? "Array`1" : $"Array{rank}D`1"; - - genericArguments = new[] {elementType}; - } - else if (currentForType == EnumType) { - // Enum type - var underlyingType = Enum.GetUnderlyingType(originalForType); - associateTypePrefix = "Enum`2"; - genericArguments = new[] {originalForType, underlyingType}; - } - else if (currentForType == ArrayType) { - // Untyped Array type - foundForType = null; - return null; - } - else { - // Regular type - associateTypePrefix = currentForType.Name; - genericArguments = null; - } - - // Replacing 'I' at interface types - if (currentForType.IsInterface && associateTypePrefix.StartsWith("I", StringComparison.Ordinal)) { - associateTypePrefix = AddSuffix(associateTypePrefix.Substring(1), "Interface"); - } - - // Search for exact associate - var result = CreateAssociateInternal(originalForType, currentForType, out foundForType, associateTypePrefix, - associateTypeSuffixes, locations, genericArguments, constructorParams); - if (result != null) { - return result; - } - - if (exactTypeMatch) { - foundForType = null; - return null; - } - - // Nothing is found; trying to find an associate for base type (except Object) - var forTypeBase = currentForType.BaseType; - if (forTypeBase != null) { - while (forTypeBase != null && forTypeBase != ObjectType) { - result = CreateAssociateInternal(originalForType, forTypeBase, out foundForType, - associateTypeSuffixes, constructorParams, locations, true); - if (result != null) { - return result; - } - - forTypeBase = forTypeBase.BaseType; - } - } - - // Nothing is found; trying to find an associate for implemented interface - var interfaces = currentForType.GetInterfaces(); - var interfaceCount = interfaces.Length; - var suppressed = new BitArray(interfaceCount); - while (interfaceCount > 0) { - // Suppressing all the interfaces inherited from others - // to allow their associates to not conflict with each other - for (var i = 0; i < interfaceCount; i++) { - for (var j = 0; j < interfaceCount; j++) { - if (i == j || !interfaces[i].IsAssignableFrom(interfaces[j])) { - continue; - } - - suppressed[i] = true; - break; - } - } - - Type lastGoodInterfaceType = null; - // Scanning non-suppressed interfaces - for (var i = 0; i < interfaceCount; i++) { - if (suppressed[i]) { - continue; - } - - var resultForInterface = CreateAssociateInternal(originalForType, interfaces[i], out foundForType, - associateTypeSuffixes, constructorParams, locations, true); - if (resultForInterface == null) { - continue; - } - - if (result != null) { - throw new InvalidOperationException(string.Format( - Strings.ExMultipleAssociatesMatch, - GetShortName(currentForType), - GetShortName(result.GetType()), - GetShortName(resultForInterface.GetType()))); - } - - result = resultForInterface; - lastGoodInterfaceType = foundForType; - foundForType = null; - } - - if (result != null) { - foundForType = lastGoodInterfaceType; - return result; - } - - // Moving suppressed interfaces to the beginning - // to scan them on the next round - var k = 0; - for (var i = 0; i < interfaceCount; i++) { - if (suppressed[i]) { - interfaces[k] = interfaces[i]; - suppressed[k] = false; - k++; - } - } - - interfaceCount = k; - } - - // Nothing is found; trying to find an associate for Object type - if (currentForType != ObjectType) { - result = CreateAssociateInternal(originalForType, ObjectType, out foundForType, - "Object", associateTypeSuffixes, - locations, null, constructorParams); - if (result != null) { - return result; - } - } - - // Nothing is found at all - foundForType = null; - return null; - } - - private static T CreateAssociateInternal(Type originalForType, - Type currentForType, - out Type foundForType, - string associateTypePrefix, - string[] associateTypeSuffixes, - List> locations, - Type[] genericArguments, - object[] constructorParams) - where T : class - { - var newLocationCount = 0; - var pair = new Pair(typeof(T).Assembly, typeof(T).Namespace); - if (locations.FindIndex(p => p.First == pair.First && p.Second == pair.Second) < 0) { - locations.Add(pair); - newLocationCount++; - } - - pair = new Pair(currentForType.Assembly, currentForType.Namespace); - if (locations.FindIndex(p => p.First == pair.First && p.Second == pair.Second) < 0) { - locations.Add(pair); - newLocationCount++; - } - - try { - for (int i = 0, count = locations.Count; i < count; i++) { - var location = locations[i]; - for (var currentSuffix = 0; currentSuffix < associateTypeSuffixes.Length; currentSuffix++) { - var associateTypeSuffix = associateTypeSuffixes[currentSuffix]; - // Trying exact type match (e.g. EnumerableInterfaceHandler`1<...>) - var associateTypeName = AddSuffix($"{location.Second}.{associateTypePrefix}", associateTypeSuffix); - var suffix = CorrectGenericSuffix(associateTypeName, genericArguments?.Length ?? 0); - if (Activate(location.First, suffix, genericArguments, constructorParams) is T result) { - foundForType = currentForType; - return result; - } - - // Trying to paste original type as generic parameter - suffix = CorrectGenericSuffix(associateTypeName, 1); - result = Activate(location.First, suffix, new[] {originalForType}, constructorParams) as T; - if (result != null) { - foundForType = currentForType; - return result; - } - - // Trying a generic one (e.g. EnumerableInterfaceHandler`2) - Type[] newGenericArguments; - if (genericArguments == null || genericArguments.Length == 0) { - newGenericArguments = new[] {originalForType}; - associateTypeName = AddSuffix($"{location.Second}.{associateTypePrefix}`1", associateTypeSuffix); - } - else { - newGenericArguments = new Type[genericArguments.Length + 1]; - newGenericArguments[0] = originalForType; - Array.Copy(genericArguments, 0, newGenericArguments, 1, genericArguments.Length); - associateTypeName = AddSuffix( - $"{location.Second}.{TrimGenericSuffix(associateTypePrefix)}`{newGenericArguments.Length}", - associateTypeSuffix); - } - - suffix = CorrectGenericSuffix(associateTypeName, newGenericArguments.Length); - result = Activate(location.First, suffix, newGenericArguments, constructorParams) as T; - if (result != null) { - foundForType = currentForType; - return result; - } - } - } - - foundForType = null; - return null; - } - finally { - for (var i = 0; i < newLocationCount; i++) { - locations.RemoveAt(locations.Count - 1); - } - } - } - - /// - /// Creates new dummy type. Such types can be used - /// as generic arguments (to instantiate unique generic - /// instances). - /// - /// Prefix to include into type name. - /// The type to inherit the dummy type from. - /// If , static method with name - /// will be created for each constructor. - /// object of newly created type. - public static Type CreateDummyType(string namePrefix, Type inheritFrom, bool implementProtectedConstructorAccessor) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(namePrefix, nameof(namePrefix)); - ArgumentValidator.EnsureArgumentNotNull(inheritFrom, nameof(inheritFrom)); - - - var n = Interlocked.Increment(ref createDummyTypeNumber); - var typeName = $"{TypeHelperNamespace}.Internal.{namePrefix}{n}"; - - return CreateInheritedDummyType(typeName, inheritFrom, implementProtectedConstructorAccessor); - } - - /// - /// Creates new dummy type inherited from another type. - /// - /// Type name. - /// The type to inherit the dummy type from. - /// If , static method with name - /// will be created for each constructor. - /// New type. - public static Type CreateInheritedDummyType(string typeName, Type inheritFrom, - bool implementProtectedConstructorAccessor) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, nameof(typeName)); - ArgumentValidator.EnsureArgumentNotNull(inheritFrom, nameof(inheritFrom)); - EnsureEmitInitialized(); - lock (emitLock) { - var typeBuilder = moduleBuilder.DefineType( - typeName, - TypeAttributes.Public | TypeAttributes.Sealed, - inheritFrom, - Array.Empty() - ); - const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - foreach (var baseConstructor in inheritFrom.GetConstructors(bindingFlags)) { - var parameters = baseConstructor.GetParameters(); - var parameterTypes = new Type[parameters.Length]; - for (var index = 0; index < parameters.Length; index++) { - parameterTypes[index] = parameters[index].ParameterType; - } - var constructorBuilder = typeBuilder.DefineConstructor( - baseConstructor.Attributes, - CallingConventions.Standard, - parameterTypes - ); - - // Create constructor - var constructorIlGenerator = constructorBuilder.GetILGenerator(); - constructorIlGenerator.Emit(OpCodes.Ldarg_0); - var parametersCount = parameterTypes.Length; - for (short i = 1; i <= parametersCount; i++) { - constructorIlGenerator.Emit(OpCodes.Ldarg, i); - } - - constructorIlGenerator.Emit(OpCodes.Call, baseConstructor); - constructorIlGenerator.Emit(OpCodes.Ret); - - // Create ProtectedConstructorAccessor - if (implementProtectedConstructorAccessor) { - var methodBuilder = typeBuilder.DefineMethod(DelegateHelper.AspectedFactoryMethodName, - MethodAttributes.Private | MethodAttributes.Static, - CallingConventions.Standard, typeBuilder.UnderlyingSystemType, parameterTypes); - var accessorIlGenerator = methodBuilder.GetILGenerator(); - for (short i = 0; i < parameterTypes.Length; i++) { - accessorIlGenerator.Emit(OpCodes.Ldarg, i); - } - - accessorIlGenerator.Emit(OpCodes.Newobj, constructorBuilder); - accessorIlGenerator.Emit(OpCodes.Ret); - } - } - - return typeBuilder.CreateTypeInfo().AsType(); - } - } - - private static void EnsureEmitInitialized() - { - if (moduleBuilder != null) { - return; - } - - lock (emitLock) { - if (moduleBuilder != null) { - return; - } - - var assemblyName = new AssemblyName("Xtensive.TypeHelper.GeneratedTypes"); - assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - var tmp = assemblyBuilder.DefineDynamicModule(assemblyName.Name); - Thread.MemoryBarrier(); - moduleBuilder = tmp; - } - } - - /// - /// Adds suffix to specified generic type name. - /// - /// Type name to add suffix for. - /// Suffix to add. - /// Specified generic type name with its suffix. - public static string AddSuffix(string typeName, string suffix) - { - var i = typeName.IndexOf('`'); - if (i >= 0) { - return typeName.Substring(0, i) + suffix + typeName.Substring(i); - } - - i = typeName.IndexOf('<'); - if (i >= 0) { - return typeName.Substring(0, i) + suffix + typeName.Substring(i); - } - - return typeName + suffix; - } - - /// - /// Instantiates specified generic type; returns , if either no such a type, - /// or an error has occurred. - /// - /// Assembly where the type is located. - /// Name of the type to instantiate. - /// Generic arguments for the type to instantiate - /// ( means type isn't a generic type definition). - /// Arguments to pass to the type constructor. - /// An instance of specified type; , if either no such a type, - /// or an error has occurred. - public static object Activate(Assembly assembly, string typeName, Type[] genericArguments, - params object[] arguments) - { - ArgumentValidator.EnsureArgumentNotNull(assembly, nameof(assembly)); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, nameof(typeName)); - var type = assembly.GetType(typeName, false); - return type == null ? null : Activate(type, genericArguments, arguments); - } - - /// - /// Instantiates specified generic type; returns , if either no such a type, - /// or an error has occurred. - /// - /// Generic type definition to instantiate. - /// Generic arguments for the type to instantiate - /// ( means isn't a generic type definition). - /// Arguments to pass to the type constructor. - /// An instance of specified type; , if either no such a type, - /// or an error has occurred. - [DebuggerStepThrough] - public static object Activate(this Type type, Type[] genericArguments, params object[] arguments) - { - try { - if (type.IsAbstract) { - return null; - } - - if (type.IsGenericTypeDefinition ^ (genericArguments != null)) { - return null; - } - - if (type.IsGenericTypeDefinition) { - if (genericArguments == null) { - genericArguments = Array.Empty(); - } - - var genericParameters = type.GetGenericArguments(); - if (genericParameters.Length != genericArguments.Length) { - return null; - } - - var genericParameterIndexes = genericParameters - .Select((parameter, index) => (parameter, index)) - .ToDictionary(a => a.parameter, a => a.index); - for (var i = 0; i < genericParameters.Length; i++) { - var parameter = genericParameters[i]; - var constraints = parameter.GetGenericParameterConstraints(); - var argument = genericArguments[i]; - foreach (var constraint in constraints) { - var projectedConstraint = constraint; - if (constraint.IsGenericParameter) { - projectedConstraint = genericArguments[genericParameterIndexes[constraint]]; - } - else if (constraint.IsGenericType) { - var constraintArguments = constraint.GetGenericArguments(); - var projectedConstraintArguments = new Type[constraintArguments.Length]; - for (var j = 0; j < constraintArguments.Length; j++) { - projectedConstraintArguments[j] = - genericParameterIndexes.ContainsKey(constraintArguments[j]) - ? genericArguments[genericParameterIndexes[constraintArguments[j]]] - : constraintArguments[j]; - } - - projectedConstraint = constraint - .GetGenericTypeDefinition() - .MakeGenericType(projectedConstraintArguments); - } - - if (!projectedConstraint.IsAssignableFrom(argument)) { - return null; - } - } - } - - type = type.MakeGenericType(genericArguments); - } - - if (arguments == null) { - arguments = Array.Empty(); - } - - const BindingFlags bindingFlags = - BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - - var argumentTypes = new object[arguments.Length]; - for (var i = 0; i < arguments.Length; i++) { - var o = arguments[i]; - if (o == null) { - // Actually a case when GetConstructor will fail, - // so we should fall back to Activator.CreateInstance - return Activator.CreateInstance(type, bindingFlags, null, arguments, null); - } - - argumentTypes[i] = o.GetType(); - } - - var constructor = type.GetConstructor(bindingFlags, argumentTypes); - return constructor == null ? null : constructor.Invoke(arguments); - } - catch (Exception error) { - return null; - } - } - - /// - /// Gets the public constructor of type - /// accepting specified . - /// - /// The type to get the constructor for. - /// The arguments. - /// - /// Appropriate constructor, if a single match is found; - /// otherwise, . - /// - public static ConstructorInfo GetConstructor(this Type type, object[] arguments) - { - var constructors = - from ctor in type.GetConstructors() - let parameters = ctor.GetParameters() - where parameters.Length == arguments.Length - let zipped = parameters.Zip(arguments, (parameter, argument) => (parameter, argument)) - where ( - from pair in zipped - let parameter = pair.parameter - let parameterType = parameter.ParameterType - let argument = pair.argument - let argumentType = argument == null ? ObjectType : argument.GetType() - select - !parameter.IsOut && ( - parameterType.IsAssignableFrom(argumentType) || - (!parameterType.IsValueType && argument == null) || - (parameterType.IsNullable() && argument == null) - ) - ).All(passed => passed) - select ctor; - return constructors.SingleOrDefault(); - } - - /// - /// Orders the specified by their inheritance - /// (very base go first). - /// - /// The types to sort. - /// The list of ordered by their inheritance. - public static List OrderByInheritance(this IEnumerable types) => - TopologicalSorter.Sort(types, (t1, t2) => t1.IsAssignableFrom(t2)); - - /// - /// Fast analogue of . - /// - /// The type. - /// The target interface. - /// Interface map for the specified interface. - public static InterfaceMapping GetInterfaceMapFast(this Type type, Type targetInterface) => - interfaceMaps.GetOrAdd(new Pair(type, targetInterface), - pair => new InterfaceMapping(pair.First.GetInterfaceMap(pair.Second))); - - /// - /// Gets the interfaces of the specified type. - /// Interfaces will be ordered from the very base ones to ancestors. - /// - /// The type to get the interfaces of. - public static Type[] GetInterfaces(this Type type) => - orderedInterfaces.GetOrAdd(type, t => t.GetInterfaces().OrderByInheritance().ToArray()); - - /// - /// Gets the sequence of type itself, all its base types and interfaces. - /// Types will be ordered from the very base ones to ancestors with the specified type in the end of sequence. - /// - /// The type to get compatible types for. - /// The interfaces of the specified type. - public static Type[] GetCompatibles(this Type type) => - orderedCompatibles.GetOrAdd(type, - t => { - var interfaces = t.GetInterfaces(); - var bases = EnumerableUtils.Unfold(t.BaseType, baseType => baseType.BaseType); - return bases - .Concat(interfaces) - .OrderByInheritance() - .AddOne(t) - .ToArray(); - }); - - /// - /// Builds correct full generic type name. - /// - /// A which name is built. - /// Full type name. - public static string GetFullName(this Type type) - { - if (type == null) { - return null; - } - - if (type.IsGenericParameter) { - return type.Name; - } - - var declaringType = type.DeclaringType; - if (declaringType == null) { - return type.GetFullNameBase(); - } - - if (declaringType.IsGenericTypeDefinition) { - declaringType = - declaringType.MakeGenericType( - type.GetGenericArguments() - .Take(declaringType.GetGenericArguments().Length) - .ToArray()); - } - - return $"{declaringType.GetFullName()}+{type.GetFullNameBase()}"; - } - - private static string GetFullNameBase(this Type type) - { - var result = type.DeclaringType != null // Is nested - ? type.Name - : type.Namespace + "." + type.Name; - var arrayBracketPosition = result.IndexOf('['); - if (arrayBracketPosition > 0) { - result = result.Substring(0, arrayBracketPosition); - } - - var arguments = type.GetGenericArguments(); - if (arguments.Length > 0) { - if (type.DeclaringType != null) { - arguments = arguments - .Skip(type.DeclaringType.GetGenericArguments().Length) - .ToArray(); - } - - var sb = new StringBuilder(); - sb.Append(TrimGenericSuffix(result)); - sb.Append('<'); - char? comma = default; - foreach (var argument in arguments) { - if (comma.HasValue) { - sb.Append(comma.Value); - } - - if (!type.IsGenericTypeDefinition) { - sb.Append(GetFullNameBase(argument)); - } - - comma = ','; - } - - sb.Append('>'); - result = sb.ToString(); - } - - if (type.IsArray) { - var sb = new StringBuilder(result); - var elementType = type; - while (elementType?.IsArray == true) { - sb.Append('['); - var commaCount = elementType.GetArrayRank() - 1; - for (var i = 0; i < commaCount; i++) { - sb.Append(','); - } - - sb.Append(']'); - elementType = elementType.GetElementType(); - } - - result = sb.ToString(); - } - - return result; - } - - /// - /// Builds correct short generic type name (without namespaces). - /// - /// A which name is built. - /// Short type name. - public static string GetShortName(this Type type) - { - if (type == null) { - return null; - } - - if (type.IsGenericParameter) { - return type.Name; - } - - var declaringType = type.DeclaringType; - if (declaringType == null) { - return type.GetShortNameBase(); - } - - if (declaringType.IsGenericTypeDefinition) { - declaringType = - declaringType.MakeGenericType( - type.GetGenericArguments() - .Take(declaringType.GetGenericArguments().Length) - .ToArray()); - } - - return $"{declaringType.GetShortName()}+{type.GetShortNameBase()}"; - } - - private static string GetShortNameBase(this Type type) - { - var result = type.Name; - var arrayBracketPosition = result.IndexOf('['); - if (arrayBracketPosition > 0) { - result = result.Substring(0, arrayBracketPosition); - } - - var arguments = type.GetGenericArguments(); - if (arguments.Length > 0) { - if (type.DeclaringType != null) { - arguments = arguments - .Skip(type.DeclaringType.GetGenericArguments().Length) - .ToArray(); - } - - var sb = new StringBuilder(); - sb.Append(TrimGenericSuffix(result)); - sb.Append('<'); - char? comma = default; - foreach (var argument in arguments) { - if (comma.HasValue) { - sb.Append(comma.Value); - } - - if (!type.IsGenericTypeDefinition) { - sb.Append(GetShortNameBase(argument)); - } - - comma = ','; - } - - sb.Append('>'); - result = sb.ToString(); - } - - if (type.IsArray) { - var sb = new StringBuilder(result); - var elementType = type; - while (elementType?.IsArray == true) { - sb.Append('['); - var commaCount = elementType.GetArrayRank() - 1; - for (var i = 0; i < commaCount; i++) { - sb.Append(','); - } - - sb.Append(']'); - elementType = elementType.GetElementType(); - } - - result = sb.ToString(); - } - - return result; - } - - /// - /// Indicates whether is a type. - /// - /// Type to check. - /// if type is nullable type; - /// otherwise, . - public static bool IsNullable(this Type type) => - (type.MetadataToken ^ NullableTypeMetadataToken) == 0 && ReferenceEquals(type.Module, NullableTypeModule); - - /// - /// Indicates whether type is a type. - /// - /// Type to check. - /// if type is nullable type; - /// otherwise, . - public static bool IsNullable() => typeof(T).IsNullable(); - - /// - /// Indicates whether is a final type. - /// - /// Type to check. - /// if type is final type; - /// otherwise, . - public static bool IsFinal(this Type type) => type.IsValueType || type.IsSealed; - - /// - /// Indicates whether type is a final type. - /// - /// Type to check. - /// if type is final type; - /// otherwise, . - public static bool IsFinal() => IsFinal(typeof(T)); - - /// - /// Gets the delegate "Invoke" method (describing the delegate) for - /// the specified . - /// - /// Type of the delegate to get the "Invoke" method of. - /// object describing the delegate "Invoke" method. - public static MethodInfo GetInvokeMethod(this Type delegateType) => delegateType.GetMethod(invokeMethodName); - - - /// - /// Determines whether given is a specification - /// of the provided . - /// - /// The to check. - /// The of the generic method definition - /// to check against. - /// if the specified is a specification - /// of the provided . - public static bool IsGenericMethodSpecificationOf(this MethodInfo method, MethodInfo genericMethodDefinition) => - method.MetadataToken == genericMethodDefinition.MetadataToken - && (ReferenceEquals(method.Module, genericMethodDefinition.Module) - || method.Module == genericMethodDefinition.Module) - && method.IsGenericMethod && genericMethodDefinition.IsGenericMethodDefinition; - - /// - /// Determines whether the specified is an ancestor or an instance of the - /// provided . - /// - /// The type to check. - /// Type of the generic. It is supposed this is an open generic type. - /// - /// if the specified is an ancestor or an instance of the - /// provided ; otherwise, . - /// - public static bool IsOfGenericType(this Type type, Type openGenericBaseType) => - GetGenericType(type, openGenericBaseType) != null; - - /// - /// Determines whether the specified is an ancestor or an instance of - /// the provided and returns closed generic type with the - /// specified type arguments if found. - /// - /// The type to check. - /// Open generic type to be matched. - /// - /// A representing the closed generic version of - /// where type parameters are bound in case it exists in 's inheritance hierarchy; - /// otherwise, . - /// - public static Type GetGenericType(this Type type, Type openGenericBaseType) - { - var definitionMetadataToken = openGenericBaseType.MetadataToken; - var definitionModule = openGenericBaseType.Module; - while (type != null && !ReferenceEquals(type, ObjectType)) { - if ((type.MetadataToken ^ definitionMetadataToken) == 0 && ReferenceEquals(type.Module, definitionModule)) { - return type; - } - - type = type.BaseType; - } - - return null; - } - - /// - /// Determines whether specified is an implementation of the - /// provided . - /// - /// A instance to be checked. - /// A of an open generic - /// to match the specified against. - /// - /// if the specified is an implementation of the - /// provided ; - /// otherwise, . - /// - public static bool IsOfGenericInterface(this Type type, Type openGenericInterface) => - GetGenericInterface(type, openGenericInterface) != null; - - /// - /// Determines whether the specified is an implementation of the - /// provided and returns a instance - /// for the closed generic interface where type arguments are specified if implementation is found. - /// - /// The type to be checked. - /// Open generic to be matched. - /// - /// A representing closed generic version of - /// where type parameters are bound in case it is implemented by the ; - /// otherwise, . - /// - public static Type GetGenericInterface(this Type type, Type openGenericInterface) - { - var metadataToken = openGenericInterface.MetadataToken; - var module = openGenericInterface.Module; - if (type == null || ((type.MetadataToken ^ metadataToken) == 0 && ReferenceEquals(type.Module, module))) { - return type; - } - - // We don't use LINQ as we don't want to create a closure here - foreach (var implementedInterface in type.GetInterfaces()) { - if ((implementedInterface.MetadataToken ^ metadataToken) == 0 - && ReferenceEquals(implementedInterface.Module, module)) { - return implementedInterface; - } - } - - return null; - } - - /// - /// Converts to type that can assign both - /// values of and . - /// This method is a reverse for method. - /// - /// A type to convert. - /// - /// If is a reference type or a instance - /// returns . - /// Otherwise returns of . - /// - public static Type ToNullable(this Type type) - { - ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); - return type.IsValueType && !type.IsNullable() - ? NullableType.MakeGenericType(type) - : type; - } - - /// - /// Converts to if is a value type. - /// Otherwise returns just . - /// This method is a reverse for method. - /// - /// The type to process. - /// - /// of is specified type is a value type. - /// Otherwise return just . - /// - public static Type StripNullable(this Type type) - { - ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); - return type.IsNullable() - ? type.GetGenericArguments()[0] - : type; - } - - /// - /// Determines whether the specified is anonymous type. - /// - /// The type. - /// - /// if the specified type is anonymous; otherwise, . - /// - public static bool IsAnonymous(this Type type) - { - var typeName = type.Name; - return (type.Attributes & TypeAttributes.Public) == 0 - && type.BaseType == ObjectType - && (typeName.StartsWith("<>", StringComparison.Ordinal) || typeName.StartsWith("VB$", StringComparison.Ordinal)) - && typeName.IndexOf("AnonymousType", StringComparison.Ordinal) >= 0 - && type.IsDefined(CompilerGeneratedAttributeType, false); - } - - /// - /// Determines whether the specified is closure type. - /// - /// The type. - /// - /// if the specified type is anonymous; otherwise, . - /// - public static bool IsClosure(this Type type) - { - var typeName = type.Name; - return type.BaseType == ObjectType - && (typeName.StartsWith("<>", StringComparison.Ordinal) || typeName.StartsWith("VB$", StringComparison.Ordinal)) - && typeName.IndexOf("DisplayClass", StringComparison.Ordinal) >= 0 - && type.IsDefined(CompilerGeneratedAttributeType, false); - } - - /// - /// Determines whether is a public non-abstract inheritor of . - /// - /// The type to check. - /// The base type. - /// - /// if type is a public non-abstract inheritor of specified base type; - /// otherwise, . - /// - public static bool IsPublicNonAbstractInheritorOf(this Type type, Type baseType) - { - ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); - ArgumentValidator.EnsureArgumentNotNull(baseType, nameof(baseType)); - return type.IsPublic && !type.IsAbstract && baseType.IsAssignableFrom(type); - } - - /// - /// Determines whether is numeric or nullable numeric - /// - /// The type to check. - /// - /// If type is numeric or nullable numeric; - /// otherwise, . - /// - public static bool IsNumericType(this Type type) - { - ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); - var nonNullableType = type.StripNullable(); - if (nonNullableType.IsEnum) { - return false; - } - - switch (Type.GetTypeCode(nonNullableType)) { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.UInt16: - case TypeCode.UInt32: - case TypeCode.UInt64: - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Decimal: - case TypeCode.Double: - case TypeCode.Single: - return true; - default: - return false; - } - } - - #region Private \ internal methods - - /// - /// Gets information about field in closure. - /// - /// Closure type. - /// Type of field in closure. - /// If field of exists in closure then returns - /// of that field, otherwise, . - internal static MemberInfo TryGetFieldInfoFromClosure(this Type closureType, Type fieldType) => - closureType.IsClosure() - ? closureType.GetFields().FirstOrDefault(field => field.FieldType == fieldType) - : null; - - private static string TrimGenericSuffix(string @string) - { - var backtickPosition = @string.IndexOf('`'); - return backtickPosition < 0 ? @string : @string.Substring(0, backtickPosition); - } - - private static string CorrectGenericSuffix(string typeName, int argumentCount) - { - var backtickPosition = typeName.IndexOf('`'); - if (backtickPosition > 0) { - typeName = typeName.Substring(0, backtickPosition); - } - - return argumentCount == 0 ? typeName : $"{typeName}`{argumentCount}"; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.06.13 + +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using Xtensive.Collections; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Sorting; + + +namespace Xtensive.Reflection +{ + /// + /// related helper \ extension methods. + /// + public static class TypeHelper + { + private const string invokeMethodName = "Invoke"; + + private static readonly object emitLock = new object(); + private static readonly Type ObjectType = typeof(object); + private static readonly Type ArrayType = typeof(Array); + private static readonly Type EnumType = typeof(Enum); + private static readonly Type NullableType = typeof(Nullable<>); + private static readonly int NullableTypeMetadataToken = NullableType.MetadataToken; + private static readonly Module NullableTypeModule = NullableType.Module; + private static readonly Type CompilerGeneratedAttributeType = typeof(CompilerGeneratedAttribute); + private static readonly string TypeHelperNamespace = typeof(TypeHelper).Namespace; + + private static readonly ConcurrentDictionary orderedInterfaces = + new ConcurrentDictionary(); + + private static readonly ConcurrentDictionary orderedCompatibles = + new ConcurrentDictionary(); + + private static readonly ConcurrentDictionary, InterfaceMapping> interfaceMaps = + new ConcurrentDictionary, InterfaceMapping>(); + + private static int createDummyTypeNumber = 0; + private static AssemblyBuilder assemblyBuilder; + private static ModuleBuilder moduleBuilder; + + /// + /// Searches for associated class for , creates its instance, if found. + /// Otherwise returns . + /// + /// Type of result. Can be ether class or interface. + /// Type to search the associate for. + /// Type the associate was found for. + /// Associate type name suffix. + /// Parameters to pass to associate constructor. + /// Newly created associate for , if found; + /// otherwise, . + public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, + object[] constructorParams) + where T : class => + CreateAssociate(forType, out foundForType, associateTypeSuffixes, constructorParams, + Array.Empty>()); + + /// + /// Searches for associated class for , creates its instance, if found. + /// Otherwise returns . + /// + /// Type of result. Can be ether class or interface. + /// Type to search the associate for. + /// Type the associate was found for. + /// Associate type name suffix. + /// High-priority search locations (assembly + namespace pairs). + /// Parameters to pass to associate constructor. + /// Newly created associate for , if found; + /// otherwise, . + public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, + object[] constructorParams, IEnumerable> highPriorityLocations) + where T : class => + CreateAssociate(forType, out foundForType, associateTypeSuffixes, constructorParams, highPriorityLocations, + false); + + /// + /// Searches for associated class for , creates its instance, if found. + /// Otherwise returns . + /// + /// Type of result. Can be ether class or interface. + /// Type to search the associate for. + /// Type the associate was found for. + /// Associate type name suffix. + /// High-priority search locations (assembly + namespace pairs). + /// Parameters to pass to associate constructor. + /// Newly created associate for , if found; + /// otherwise, . + /// If tries to create associates for base class, interfaces, + /// arrays and (if struct) too. + /// is generic type definition. + public static T CreateAssociate(Type forType, out Type foundForType, string[] associateTypeSuffixes, + object[] constructorParams, IEnumerable> highPriorityLocations, bool exactTypeMatch) + where T : class + { + ArgumentValidator.EnsureArgumentNotNull(forType, nameof(forType)); + if (forType.IsGenericTypeDefinition) { + throw new InvalidOperationException(string.Format( + Strings.ExCantCreateAssociateForGenericTypeDefinitions, GetShortName(forType))); + } + + var locations = new List>(1); + if (highPriorityLocations != null) { + locations.AddRange(highPriorityLocations); + } + + return + CreateAssociateInternal(forType, forType, out foundForType, associateTypeSuffixes, constructorParams, + locations, exactTypeMatch); + } + + private static T CreateAssociateInternal(Type originalForType, Type currentForType, out Type foundForType, + string[] associateTypeSuffixes, object[] constructorParams, List> locations, + bool exactTypeMatch) + where T : class + { + if (currentForType == null) { + foundForType = null; + return null; + } + + string associateTypePrefix; + Type[] genericArguments; + + // Possible cases: generic type, array type, regular type + if (currentForType.IsGenericType) { + // Generic type + associateTypePrefix = currentForType.Name; + genericArguments = currentForType.GetGenericArguments(); + } + else if (currentForType.IsArray) { + // Array type + var elementType = currentForType.GetElementType(); + var rank = currentForType.GetArrayRank(); + associateTypePrefix = rank == 1 ? "Array`1" : $"Array{rank}D`1"; + + genericArguments = new[] {elementType}; + } + else if (currentForType == EnumType) { + // Enum type + var underlyingType = Enum.GetUnderlyingType(originalForType); + associateTypePrefix = "Enum`2"; + genericArguments = new[] {originalForType, underlyingType}; + } + else if (currentForType == ArrayType) { + // Untyped Array type + foundForType = null; + return null; + } + else { + // Regular type + associateTypePrefix = currentForType.Name; + genericArguments = null; + } + + // Replacing 'I' at interface types + if (currentForType.IsInterface && associateTypePrefix.StartsWith("I", StringComparison.Ordinal)) { + associateTypePrefix = AddSuffix(associateTypePrefix.Substring(1), "Interface"); + } + + // Search for exact associate + var result = CreateAssociateInternal(originalForType, currentForType, out foundForType, associateTypePrefix, + associateTypeSuffixes, locations, genericArguments, constructorParams); + if (result != null) { + return result; + } + + if (exactTypeMatch) { + foundForType = null; + return null; + } + + // Nothing is found; trying to find an associate for base type (except Object) + var forTypeBase = currentForType.BaseType; + if (forTypeBase != null) { + while (forTypeBase != null && forTypeBase != ObjectType) { + result = CreateAssociateInternal(originalForType, forTypeBase, out foundForType, + associateTypeSuffixes, constructorParams, locations, true); + if (result != null) { + return result; + } + + forTypeBase = forTypeBase.BaseType; + } + } + + // Nothing is found; trying to find an associate for implemented interface + var interfaces = currentForType.GetInterfaces(); + var interfaceCount = interfaces.Length; + var suppressed = new BitArray(interfaceCount); + while (interfaceCount > 0) { + // Suppressing all the interfaces inherited from others + // to allow their associates to not conflict with each other + for (var i = 0; i < interfaceCount; i++) { + for (var j = 0; j < interfaceCount; j++) { + if (i == j || !interfaces[i].IsAssignableFrom(interfaces[j])) { + continue; + } + + suppressed[i] = true; + break; + } + } + + Type lastGoodInterfaceType = null; + // Scanning non-suppressed interfaces + for (var i = 0; i < interfaceCount; i++) { + if (suppressed[i]) { + continue; + } + + var resultForInterface = CreateAssociateInternal(originalForType, interfaces[i], out foundForType, + associateTypeSuffixes, constructorParams, locations, true); + if (resultForInterface == null) { + continue; + } + + if (result != null) { + throw new InvalidOperationException(string.Format( + Strings.ExMultipleAssociatesMatch, + GetShortName(currentForType), + GetShortName(result.GetType()), + GetShortName(resultForInterface.GetType()))); + } + + result = resultForInterface; + lastGoodInterfaceType = foundForType; + foundForType = null; + } + + if (result != null) { + foundForType = lastGoodInterfaceType; + return result; + } + + // Moving suppressed interfaces to the beginning + // to scan them on the next round + var k = 0; + for (var i = 0; i < interfaceCount; i++) { + if (suppressed[i]) { + interfaces[k] = interfaces[i]; + suppressed[k] = false; + k++; + } + } + + interfaceCount = k; + } + + // Nothing is found; trying to find an associate for Object type + if (currentForType != ObjectType) { + result = CreateAssociateInternal(originalForType, ObjectType, out foundForType, + "Object", associateTypeSuffixes, + locations, null, constructorParams); + if (result != null) { + return result; + } + } + + // Nothing is found at all + foundForType = null; + return null; + } + + private static T CreateAssociateInternal(Type originalForType, + Type currentForType, + out Type foundForType, + string associateTypePrefix, + string[] associateTypeSuffixes, + List> locations, + Type[] genericArguments, + object[] constructorParams) + where T : class + { + var newLocationCount = 0; + var pair = new Pair(typeof(T).Assembly, typeof(T).Namespace); + if (locations.FindIndex(p => p.First == pair.First && p.Second == pair.Second) < 0) { + locations.Add(pair); + newLocationCount++; + } + + pair = new Pair(currentForType.Assembly, currentForType.Namespace); + if (locations.FindIndex(p => p.First == pair.First && p.Second == pair.Second) < 0) { + locations.Add(pair); + newLocationCount++; + } + + try { + for (int i = 0, count = locations.Count; i < count; i++) { + var location = locations[i]; + for (var currentSuffix = 0; currentSuffix < associateTypeSuffixes.Length; currentSuffix++) { + var associateTypeSuffix = associateTypeSuffixes[currentSuffix]; + // Trying exact type match (e.g. EnumerableInterfaceHandler`1<...>) + var associateTypeName = AddSuffix($"{location.Second}.{associateTypePrefix}", associateTypeSuffix); + var suffix = CorrectGenericSuffix(associateTypeName, genericArguments?.Length ?? 0); + if (Activate(location.First, suffix, genericArguments, constructorParams) is T result) { + foundForType = currentForType; + return result; + } + + // Trying to paste original type as generic parameter + suffix = CorrectGenericSuffix(associateTypeName, 1); + result = Activate(location.First, suffix, new[] {originalForType}, constructorParams) as T; + if (result != null) { + foundForType = currentForType; + return result; + } + + // Trying a generic one (e.g. EnumerableInterfaceHandler`2) + Type[] newGenericArguments; + if (genericArguments == null || genericArguments.Length == 0) { + newGenericArguments = new[] {originalForType}; + associateTypeName = AddSuffix($"{location.Second}.{associateTypePrefix}`1", associateTypeSuffix); + } + else { + newGenericArguments = new Type[genericArguments.Length + 1]; + newGenericArguments[0] = originalForType; + Array.Copy(genericArguments, 0, newGenericArguments, 1, genericArguments.Length); + associateTypeName = AddSuffix( + $"{location.Second}.{TrimGenericSuffix(associateTypePrefix)}`{newGenericArguments.Length}", + associateTypeSuffix); + } + + suffix = CorrectGenericSuffix(associateTypeName, newGenericArguments.Length); + result = Activate(location.First, suffix, newGenericArguments, constructorParams) as T; + if (result != null) { + foundForType = currentForType; + return result; + } + } + } + + foundForType = null; + return null; + } + finally { + for (var i = 0; i < newLocationCount; i++) { + locations.RemoveAt(locations.Count - 1); + } + } + } + + /// + /// Creates new dummy type. Such types can be used + /// as generic arguments (to instantiate unique generic + /// instances). + /// + /// Prefix to include into type name. + /// The type to inherit the dummy type from. + /// If , static method with name + /// will be created for each constructor. + /// object of newly created type. + public static Type CreateDummyType(string namePrefix, Type inheritFrom, bool implementProtectedConstructorAccessor) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(namePrefix, nameof(namePrefix)); + ArgumentValidator.EnsureArgumentNotNull(inheritFrom, nameof(inheritFrom)); + + + var n = Interlocked.Increment(ref createDummyTypeNumber); + var typeName = $"{TypeHelperNamespace}.Internal.{namePrefix}{n}"; + + return CreateInheritedDummyType(typeName, inheritFrom, implementProtectedConstructorAccessor); + } + + /// + /// Creates new dummy type inherited from another type. + /// + /// Type name. + /// The type to inherit the dummy type from. + /// If , static method with name + /// will be created for each constructor. + /// New type. + public static Type CreateInheritedDummyType(string typeName, Type inheritFrom, + bool implementProtectedConstructorAccessor) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, nameof(typeName)); + ArgumentValidator.EnsureArgumentNotNull(inheritFrom, nameof(inheritFrom)); + EnsureEmitInitialized(); + lock (emitLock) { + var typeBuilder = moduleBuilder.DefineType( + typeName, + TypeAttributes.Public | TypeAttributes.Sealed, + inheritFrom, + Array.Empty() + ); + const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + foreach (var baseConstructor in inheritFrom.GetConstructors(bindingFlags)) { + var parameters = baseConstructor.GetParameters(); + var parameterTypes = new Type[parameters.Length]; + for (var index = 0; index < parameters.Length; index++) { + parameterTypes[index] = parameters[index].ParameterType; + } + var constructorBuilder = typeBuilder.DefineConstructor( + baseConstructor.Attributes, + CallingConventions.Standard, + parameterTypes + ); + + // Create constructor + var constructorIlGenerator = constructorBuilder.GetILGenerator(); + constructorIlGenerator.Emit(OpCodes.Ldarg_0); + var parametersCount = parameterTypes.Length; + for (short i = 1; i <= parametersCount; i++) { + constructorIlGenerator.Emit(OpCodes.Ldarg, i); + } + + constructorIlGenerator.Emit(OpCodes.Call, baseConstructor); + constructorIlGenerator.Emit(OpCodes.Ret); + + // Create ProtectedConstructorAccessor + if (implementProtectedConstructorAccessor) { + var methodBuilder = typeBuilder.DefineMethod(DelegateHelper.AspectedFactoryMethodName, + MethodAttributes.Private | MethodAttributes.Static, + CallingConventions.Standard, typeBuilder.UnderlyingSystemType, parameterTypes); + var accessorIlGenerator = methodBuilder.GetILGenerator(); + for (short i = 0; i < parameterTypes.Length; i++) { + accessorIlGenerator.Emit(OpCodes.Ldarg, i); + } + + accessorIlGenerator.Emit(OpCodes.Newobj, constructorBuilder); + accessorIlGenerator.Emit(OpCodes.Ret); + } + } + + return typeBuilder.CreateTypeInfo().AsType(); + } + } + + private static void EnsureEmitInitialized() + { + if (moduleBuilder != null) { + return; + } + + lock (emitLock) { + if (moduleBuilder != null) { + return; + } + + var assemblyName = new AssemblyName("Xtensive.TypeHelper.GeneratedTypes"); + assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + var tmp = assemblyBuilder.DefineDynamicModule(assemblyName.Name); + Thread.MemoryBarrier(); + moduleBuilder = tmp; + } + } + + /// + /// Adds suffix to specified generic type name. + /// + /// Type name to add suffix for. + /// Suffix to add. + /// Specified generic type name with its suffix. + public static string AddSuffix(string typeName, string suffix) + { + var i = typeName.IndexOf('`'); + if (i >= 0) { + return typeName.Substring(0, i) + suffix + typeName.Substring(i); + } + + i = typeName.IndexOf('<'); + if (i >= 0) { + return typeName.Substring(0, i) + suffix + typeName.Substring(i); + } + + return typeName + suffix; + } + + /// + /// Instantiates specified generic type; returns , if either no such a type, + /// or an error has occurred. + /// + /// Assembly where the type is located. + /// Name of the type to instantiate. + /// Generic arguments for the type to instantiate + /// ( means type isn't a generic type definition). + /// Arguments to pass to the type constructor. + /// An instance of specified type; , if either no such a type, + /// or an error has occurred. + public static object Activate(Assembly assembly, string typeName, Type[] genericArguments, + params object[] arguments) + { + ArgumentValidator.EnsureArgumentNotNull(assembly, nameof(assembly)); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, nameof(typeName)); + var type = assembly.GetType(typeName, false); + return type == null ? null : Activate(type, genericArguments, arguments); + } + + /// + /// Instantiates specified generic type; returns , if either no such a type, + /// or an error has occurred. + /// + /// Generic type definition to instantiate. + /// Generic arguments for the type to instantiate + /// ( means isn't a generic type definition). + /// Arguments to pass to the type constructor. + /// An instance of specified type; , if either no such a type, + /// or an error has occurred. + [DebuggerStepThrough] + public static object Activate(this Type type, Type[] genericArguments, params object[] arguments) + { + try { + if (type.IsAbstract) { + return null; + } + + if (type.IsGenericTypeDefinition ^ (genericArguments != null)) { + return null; + } + + if (type.IsGenericTypeDefinition) { + if (genericArguments == null) { + genericArguments = Array.Empty(); + } + + var genericParameters = type.GetGenericArguments(); + if (genericParameters.Length != genericArguments.Length) { + return null; + } + + var genericParameterIndexes = genericParameters + .Select((parameter, index) => (parameter, index)) + .ToDictionary(a => a.parameter, a => a.index); + for (var i = 0; i < genericParameters.Length; i++) { + var parameter = genericParameters[i]; + var constraints = parameter.GetGenericParameterConstraints(); + var argument = genericArguments[i]; + foreach (var constraint in constraints) { + var projectedConstraint = constraint; + if (constraint.IsGenericParameter) { + projectedConstraint = genericArguments[genericParameterIndexes[constraint]]; + } + else if (constraint.IsGenericType) { + var constraintArguments = constraint.GetGenericArguments(); + var projectedConstraintArguments = new Type[constraintArguments.Length]; + for (var j = 0; j < constraintArguments.Length; j++) { + projectedConstraintArguments[j] = + genericParameterIndexes.ContainsKey(constraintArguments[j]) + ? genericArguments[genericParameterIndexes[constraintArguments[j]]] + : constraintArguments[j]; + } + + projectedConstraint = constraint + .GetGenericTypeDefinition() + .MakeGenericType(projectedConstraintArguments); + } + + if (!projectedConstraint.IsAssignableFrom(argument)) { + return null; + } + } + } + + type = type.MakeGenericType(genericArguments); + } + + if (arguments == null) { + arguments = Array.Empty(); + } + + const BindingFlags bindingFlags = + BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + + var argumentTypes = new object[arguments.Length]; + for (var i = 0; i < arguments.Length; i++) { + var o = arguments[i]; + if (o == null) { + // Actually a case when GetConstructor will fail, + // so we should fall back to Activator.CreateInstance + return Activator.CreateInstance(type, bindingFlags, null, arguments, null); + } + + argumentTypes[i] = o.GetType(); + } + + var constructor = type.GetConstructor(bindingFlags, argumentTypes); + return constructor == null ? null : constructor.Invoke(arguments); + } + catch (Exception error) { + return null; + } + } + + /// + /// Gets the public constructor of type + /// accepting specified . + /// + /// The type to get the constructor for. + /// The arguments. + /// + /// Appropriate constructor, if a single match is found; + /// otherwise, . + /// + public static ConstructorInfo GetConstructor(this Type type, object[] arguments) + { + var constructors = + from ctor in type.GetConstructors() + let parameters = ctor.GetParameters() + where parameters.Length == arguments.Length + let zipped = parameters.Zip(arguments, (parameter, argument) => (parameter, argument)) + where ( + from pair in zipped + let parameter = pair.parameter + let parameterType = parameter.ParameterType + let argument = pair.argument + let argumentType = argument == null ? ObjectType : argument.GetType() + select + !parameter.IsOut && ( + parameterType.IsAssignableFrom(argumentType) || + (!parameterType.IsValueType && argument == null) || + (parameterType.IsNullable() && argument == null) + ) + ).All(passed => passed) + select ctor; + return constructors.SingleOrDefault(); + } + + /// + /// Orders the specified by their inheritance + /// (very base go first). + /// + /// The types to sort. + /// The list of ordered by their inheritance. + public static List OrderByInheritance(this IEnumerable types) => + TopologicalSorter.Sort(types, (t1, t2) => t1.IsAssignableFrom(t2)); + + /// + /// Fast analogue of . + /// + /// The type. + /// The target interface. + /// Interface map for the specified interface. + public static InterfaceMapping GetInterfaceMapFast(this Type type, Type targetInterface) => + interfaceMaps.GetOrAdd(new Pair(type, targetInterface), + pair => new InterfaceMapping(pair.First.GetInterfaceMap(pair.Second))); + + /// + /// Gets the interfaces of the specified type. + /// Interfaces will be ordered from the very base ones to ancestors. + /// + /// The type to get the interfaces of. + public static Type[] GetInterfaces(this Type type) => + orderedInterfaces.GetOrAdd(type, t => t.GetInterfaces().OrderByInheritance().ToArray()); + + /// + /// Gets the sequence of type itself, all its base types and interfaces. + /// Types will be ordered from the very base ones to ancestors with the specified type in the end of sequence. + /// + /// The type to get compatible types for. + /// The interfaces of the specified type. + public static Type[] GetCompatibles(this Type type) => + orderedCompatibles.GetOrAdd(type, + t => { + var interfaces = t.GetInterfaces(); + var bases = EnumerableUtils.Unfold(t.BaseType, baseType => baseType.BaseType); + return bases + .Concat(interfaces) + .OrderByInheritance() + .AddOne(t) + .ToArray(); + }); + + /// + /// Builds correct full generic type name. + /// + /// A which name is built. + /// Full type name. + public static string GetFullName(this Type type) + { + if (type == null) { + return null; + } + + if (type.IsGenericParameter) { + return type.Name; + } + + var declaringType = type.DeclaringType; + if (declaringType == null) { + return type.GetFullNameBase(); + } + + if (declaringType.IsGenericTypeDefinition) { + declaringType = + declaringType.MakeGenericType( + type.GetGenericArguments() + .Take(declaringType.GetGenericArguments().Length) + .ToArray()); + } + + return $"{declaringType.GetFullName()}+{type.GetFullNameBase()}"; + } + + private static string GetFullNameBase(this Type type) + { + var result = type.DeclaringType != null // Is nested + ? type.Name + : type.Namespace + "." + type.Name; + var arrayBracketPosition = result.IndexOf('['); + if (arrayBracketPosition > 0) { + result = result.Substring(0, arrayBracketPosition); + } + + var arguments = type.GetGenericArguments(); + if (arguments.Length > 0) { + if (type.DeclaringType != null) { + arguments = arguments + .Skip(type.DeclaringType.GetGenericArguments().Length) + .ToArray(); + } + + var sb = new StringBuilder(); + sb.Append(TrimGenericSuffix(result)); + sb.Append('<'); + char? comma = default; + foreach (var argument in arguments) { + if (comma.HasValue) { + sb.Append(comma.Value); + } + + if (!type.IsGenericTypeDefinition) { + sb.Append(GetFullNameBase(argument)); + } + + comma = ','; + } + + sb.Append('>'); + result = sb.ToString(); + } + + if (type.IsArray) { + var sb = new StringBuilder(result); + var elementType = type; + while (elementType?.IsArray == true) { + sb.Append('['); + var commaCount = elementType.GetArrayRank() - 1; + for (var i = 0; i < commaCount; i++) { + sb.Append(','); + } + + sb.Append(']'); + elementType = elementType.GetElementType(); + } + + result = sb.ToString(); + } + + return result; + } + + /// + /// Builds correct short generic type name (without namespaces). + /// + /// A which name is built. + /// Short type name. + public static string GetShortName(this Type type) + { + if (type == null) { + return null; + } + + if (type.IsGenericParameter) { + return type.Name; + } + + var declaringType = type.DeclaringType; + if (declaringType == null) { + return type.GetShortNameBase(); + } + + if (declaringType.IsGenericTypeDefinition) { + declaringType = + declaringType.MakeGenericType( + type.GetGenericArguments() + .Take(declaringType.GetGenericArguments().Length) + .ToArray()); + } + + return $"{declaringType.GetShortName()}+{type.GetShortNameBase()}"; + } + + private static string GetShortNameBase(this Type type) + { + var result = type.Name; + var arrayBracketPosition = result.IndexOf('['); + if (arrayBracketPosition > 0) { + result = result.Substring(0, arrayBracketPosition); + } + + var arguments = type.GetGenericArguments(); + if (arguments.Length > 0) { + if (type.DeclaringType != null) { + arguments = arguments + .Skip(type.DeclaringType.GetGenericArguments().Length) + .ToArray(); + } + + var sb = new StringBuilder(); + sb.Append(TrimGenericSuffix(result)); + sb.Append('<'); + char? comma = default; + foreach (var argument in arguments) { + if (comma.HasValue) { + sb.Append(comma.Value); + } + + if (!type.IsGenericTypeDefinition) { + sb.Append(GetShortNameBase(argument)); + } + + comma = ','; + } + + sb.Append('>'); + result = sb.ToString(); + } + + if (type.IsArray) { + var sb = new StringBuilder(result); + var elementType = type; + while (elementType?.IsArray == true) { + sb.Append('['); + var commaCount = elementType.GetArrayRank() - 1; + for (var i = 0; i < commaCount; i++) { + sb.Append(','); + } + + sb.Append(']'); + elementType = elementType.GetElementType(); + } + + result = sb.ToString(); + } + + return result; + } + + /// + /// Indicates whether is a type. + /// + /// Type to check. + /// if type is nullable type; + /// otherwise, . + public static bool IsNullable(this Type type) => + (type.MetadataToken ^ NullableTypeMetadataToken) == 0 && ReferenceEquals(type.Module, NullableTypeModule); + + /// + /// Indicates whether type is a type. + /// + /// Type to check. + /// if type is nullable type; + /// otherwise, . + public static bool IsNullable() => typeof(T).IsNullable(); + + /// + /// Indicates whether is a final type. + /// + /// Type to check. + /// if type is final type; + /// otherwise, . + public static bool IsFinal(this Type type) => type.IsValueType || type.IsSealed; + + /// + /// Indicates whether type is a final type. + /// + /// Type to check. + /// if type is final type; + /// otherwise, . + public static bool IsFinal() => IsFinal(typeof(T)); + + /// + /// Gets the delegate "Invoke" method (describing the delegate) for + /// the specified . + /// + /// Type of the delegate to get the "Invoke" method of. + /// object describing the delegate "Invoke" method. + public static MethodInfo GetInvokeMethod(this Type delegateType) => delegateType.GetMethod(invokeMethodName); + + + /// + /// Determines whether given is a specification + /// of the provided . + /// + /// The to check. + /// The of the generic method definition + /// to check against. + /// if the specified is a specification + /// of the provided . + public static bool IsGenericMethodSpecificationOf(this MethodInfo method, MethodInfo genericMethodDefinition) => + method.MetadataToken == genericMethodDefinition.MetadataToken + && (ReferenceEquals(method.Module, genericMethodDefinition.Module) + || method.Module == genericMethodDefinition.Module) + && method.IsGenericMethod && genericMethodDefinition.IsGenericMethodDefinition; + + /// + /// Determines whether the specified is an ancestor or an instance of the + /// provided . + /// + /// The type to check. + /// Type of the generic. It is supposed this is an open generic type. + /// + /// if the specified is an ancestor or an instance of the + /// provided ; otherwise, . + /// + public static bool IsOfGenericType(this Type type, Type openGenericBaseType) => + GetGenericType(type, openGenericBaseType) != null; + + /// + /// Determines whether the specified is an ancestor or an instance of + /// the provided and returns closed generic type with the + /// specified type arguments if found. + /// + /// The type to check. + /// Open generic type to be matched. + /// + /// A representing the closed generic version of + /// where type parameters are bound in case it exists in 's inheritance hierarchy; + /// otherwise, . + /// + public static Type GetGenericType(this Type type, Type openGenericBaseType) + { + var definitionMetadataToken = openGenericBaseType.MetadataToken; + var definitionModule = openGenericBaseType.Module; + while (type != null && !ReferenceEquals(type, ObjectType)) { + if ((type.MetadataToken ^ definitionMetadataToken) == 0 && ReferenceEquals(type.Module, definitionModule)) { + return type; + } + + type = type.BaseType; + } + + return null; + } + + /// + /// Determines whether specified is an implementation of the + /// provided . + /// + /// A instance to be checked. + /// A of an open generic + /// to match the specified against. + /// + /// if the specified is an implementation of the + /// provided ; + /// otherwise, . + /// + public static bool IsOfGenericInterface(this Type type, Type openGenericInterface) => + GetGenericInterface(type, openGenericInterface) != null; + + /// + /// Determines whether the specified is an implementation of the + /// provided and returns a instance + /// for the closed generic interface where type arguments are specified if implementation is found. + /// + /// The type to be checked. + /// Open generic to be matched. + /// + /// A representing closed generic version of + /// where type parameters are bound in case it is implemented by the ; + /// otherwise, . + /// + public static Type GetGenericInterface(this Type type, Type openGenericInterface) + { + var metadataToken = openGenericInterface.MetadataToken; + var module = openGenericInterface.Module; + if (type == null || ((type.MetadataToken ^ metadataToken) == 0 && ReferenceEquals(type.Module, module))) { + return type; + } + + // We don't use LINQ as we don't want to create a closure here + foreach (var implementedInterface in type.GetInterfaces()) { + if ((implementedInterface.MetadataToken ^ metadataToken) == 0 + && ReferenceEquals(implementedInterface.Module, module)) { + return implementedInterface; + } + } + + return null; + } + + /// + /// Converts to type that can assign both + /// values of and . + /// This method is a reverse for method. + /// + /// A type to convert. + /// + /// If is a reference type or a instance + /// returns . + /// Otherwise returns of . + /// + public static Type ToNullable(this Type type) + { + ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); + return type.IsValueType && !type.IsNullable() + ? NullableType.MakeGenericType(type) + : type; + } + + /// + /// Converts to if is a value type. + /// Otherwise returns just . + /// This method is a reverse for method. + /// + /// The type to process. + /// + /// of is specified type is a value type. + /// Otherwise return just . + /// + public static Type StripNullable(this Type type) + { + ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); + return type.IsNullable() + ? type.GetGenericArguments()[0] + : type; + } + + /// + /// Determines whether the specified is anonymous type. + /// + /// The type. + /// + /// if the specified type is anonymous; otherwise, . + /// + public static bool IsAnonymous(this Type type) + { + var typeName = type.Name; + return (type.Attributes & TypeAttributes.Public) == 0 + && type.BaseType == ObjectType + && (typeName.StartsWith("<>", StringComparison.Ordinal) || typeName.StartsWith("VB$", StringComparison.Ordinal)) + && typeName.IndexOf("AnonymousType", StringComparison.Ordinal) >= 0 + && type.IsDefined(CompilerGeneratedAttributeType, false); + } + + /// + /// Determines whether the specified is closure type. + /// + /// The type. + /// + /// if the specified type is anonymous; otherwise, . + /// + public static bool IsClosure(this Type type) + { + var typeName = type.Name; + return type.BaseType == ObjectType + && (typeName.StartsWith("<>", StringComparison.Ordinal) || typeName.StartsWith("VB$", StringComparison.Ordinal)) + && typeName.IndexOf("DisplayClass", StringComparison.Ordinal) >= 0 + && type.IsDefined(CompilerGeneratedAttributeType, false); + } + + /// + /// Determines whether is a public non-abstract inheritor of . + /// + /// The type to check. + /// The base type. + /// + /// if type is a public non-abstract inheritor of specified base type; + /// otherwise, . + /// + public static bool IsPublicNonAbstractInheritorOf(this Type type, Type baseType) + { + ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); + ArgumentValidator.EnsureArgumentNotNull(baseType, nameof(baseType)); + return type.IsPublic && !type.IsAbstract && baseType.IsAssignableFrom(type); + } + + /// + /// Determines whether is numeric or nullable numeric + /// + /// The type to check. + /// + /// If type is numeric or nullable numeric; + /// otherwise, . + /// + public static bool IsNumericType(this Type type) + { + ArgumentValidator.EnsureArgumentNotNull(type, nameof(type)); + var nonNullableType = type.StripNullable(); + if (nonNullableType.IsEnum) { + return false; + } + + switch (Type.GetTypeCode(nonNullableType)) { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Decimal: + case TypeCode.Double: + case TypeCode.Single: + return true; + default: + return false; + } + } + + #region Private \ internal methods + + /// + /// Gets information about field in closure. + /// + /// Closure type. + /// Type of field in closure. + /// If field of exists in closure then returns + /// of that field, otherwise, . + internal static MemberInfo TryGetFieldInfoFromClosure(this Type closureType, Type fieldType) => + closureType.IsClosure() + ? closureType.GetFields().FirstOrDefault(field => field.FieldType == fieldType) + : null; + + private static string TrimGenericSuffix(string @string) + { + var backtickPosition = @string.IndexOf('`'); + return backtickPosition < 0 ? @string : @string.Substring(0, backtickPosition); + } + + private static string CorrectGenericSuffix(string typeName, int argumentCount) + { + var backtickPosition = typeName.IndexOf('`'); + if (backtickPosition > 0) { + typeName = typeName.Substring(0, backtickPosition); + } + + return argumentCount == 0 ? typeName : $"{typeName}`{argumentCount}"; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/WellKnown.Object.cs b/Orm/Xtensive.Orm/Reflection/WellKnown.Object.cs index f1e8974e1c..a191b83d11 100644 --- a/Orm/Xtensive.Orm/Reflection/WellKnown.Object.cs +++ b/Orm/Xtensive.Orm/Reflection/WellKnown.Object.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.24 - -namespace Xtensive.Reflection -{ - partial class WellKnown - { - /// - /// Various well-known constants related to . - /// - public static class Object - { - /// - /// Returns "Clone". - /// - public const string Clone = "Clone"; - - /// - /// Returns "Equals". - /// - public new const string Equals = "Equals"; - - /// - /// Returns "GetHashCode". - /// - public new const string GetHashCode = "GetHashCode"; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.24 + +namespace Xtensive.Reflection +{ + partial class WellKnown + { + /// + /// Various well-known constants related to . + /// + public static class Object + { + /// + /// Returns "Clone". + /// + public const string Clone = "Clone"; + + /// + /// Returns "Equals". + /// + public new const string Equals = "Equals"; + + /// + /// Returns "GetHashCode". + /// + public new const string GetHashCode = "GetHashCode"; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/WellKnown.Operator.cs b/Orm/Xtensive.Orm/Reflection/WellKnown.Operator.cs index f35627c1ac..4bb481c576 100644 --- a/Orm/Xtensive.Orm/Reflection/WellKnown.Operator.cs +++ b/Orm/Xtensive.Orm/Reflection/WellKnown.Operator.cs @@ -1,148 +1,148 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.24 - -namespace Xtensive.Reflection -{ - partial class WellKnown - { - /// - /// Well-known method names related to operator overloading - /// - public static class Operator - { - /// - /// Returns "op_Addition". - /// - public const string Addition = "op_Addition"; - - /// - /// Returns "op_Subtraction". - /// - public const string Subtraction = "op_Subtraction"; - - /// - /// Returns "op_Multiply". - /// - public const string Multiply = "op_Multiply"; - - /// - /// Returns "op_Division". - /// - public const string Division = "op_Division"; - - /// - /// Returns "op_Modulus". - /// - public const string Modulus = "op_Modulus"; - - /// - /// Returns "op_Increment". - /// - public const string Increment = "op_Increment"; - - /// - /// Returns "op_Decrement". - /// - public const string Decrement = "op_Decrement"; - - /// - /// Returns "op_UnaryNegation". - /// - public const string UnaryNegation = "op_UnaryNegation"; - - /// - /// Returns "op_UnaryPlus". - /// - public const string UnaryPlus = "op_UnaryPlus"; - - /// - /// Returns "op_BitwiseOr". - /// - public const string BitwiseOr = "op_BitwiseOr"; - - /// - /// Returns "op_BitwiseAnd". - /// - public const string BitwiseAnd = "op_BitwiseAnd"; - - /// - /// Returns "op_ExclusiveOr". - /// - public const string ExclusiveOr = "op_ExclusiveOr"; - - /// - /// Returns "op_OnesComplement". - /// - public const string OnesComplement = "op_OnesComplement"; - - /// - /// Returns "op_LeftShift" - /// - public const string LeftShift = "op_LeftShift"; - - /// - /// Returns "op_RightShift - /// - public const string RightShift = "op_RightShift"; - - /// - /// Returns "op_LogicalNot". - /// - public const string LogicalNot = "op_LogicalNot"; - - /// - /// Returns "op_True". - /// - public const string True = "op_True"; - - /// - /// Returns "op_False". - /// - public const string False = "op_False"; - - /// - /// Returns "op_Explicit" - /// - public const string Explicit = "op_Explicit"; - - /// - /// Returns "op_Implicit". - /// - public const string Implicit = "op_Implicit"; - - /// - /// Returns "op_Equality". - /// - public const string Equality = "op_Equality"; - - /// - /// Returns "op_Inequality". - /// - public const string Inequality = "op_Inequality"; - - /// - /// Returns "op_GreaterThan". - /// - public const string GreaterThan = "op_GreaterThan"; - - /// - /// Returns "op_GreaterThanOrEqual". - /// - public const string GreaterThanOrEqual = "op_GreaterThanOrEqual"; - - /// - /// Returns "op_LessThan". - /// - public const string LessThan = "op_LessThan"; - - /// - /// Returns "op_LessThanOrEqual". - /// - public const string LessThanOrEqual = "op_LessThanOrEqual"; - - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.24 + +namespace Xtensive.Reflection +{ + partial class WellKnown + { + /// + /// Well-known method names related to operator overloading + /// + public static class Operator + { + /// + /// Returns "op_Addition". + /// + public const string Addition = "op_Addition"; + + /// + /// Returns "op_Subtraction". + /// + public const string Subtraction = "op_Subtraction"; + + /// + /// Returns "op_Multiply". + /// + public const string Multiply = "op_Multiply"; + + /// + /// Returns "op_Division". + /// + public const string Division = "op_Division"; + + /// + /// Returns "op_Modulus". + /// + public const string Modulus = "op_Modulus"; + + /// + /// Returns "op_Increment". + /// + public const string Increment = "op_Increment"; + + /// + /// Returns "op_Decrement". + /// + public const string Decrement = "op_Decrement"; + + /// + /// Returns "op_UnaryNegation". + /// + public const string UnaryNegation = "op_UnaryNegation"; + + /// + /// Returns "op_UnaryPlus". + /// + public const string UnaryPlus = "op_UnaryPlus"; + + /// + /// Returns "op_BitwiseOr". + /// + public const string BitwiseOr = "op_BitwiseOr"; + + /// + /// Returns "op_BitwiseAnd". + /// + public const string BitwiseAnd = "op_BitwiseAnd"; + + /// + /// Returns "op_ExclusiveOr". + /// + public const string ExclusiveOr = "op_ExclusiveOr"; + + /// + /// Returns "op_OnesComplement". + /// + public const string OnesComplement = "op_OnesComplement"; + + /// + /// Returns "op_LeftShift" + /// + public const string LeftShift = "op_LeftShift"; + + /// + /// Returns "op_RightShift + /// + public const string RightShift = "op_RightShift"; + + /// + /// Returns "op_LogicalNot". + /// + public const string LogicalNot = "op_LogicalNot"; + + /// + /// Returns "op_True". + /// + public const string True = "op_True"; + + /// + /// Returns "op_False". + /// + public const string False = "op_False"; + + /// + /// Returns "op_Explicit" + /// + public const string Explicit = "op_Explicit"; + + /// + /// Returns "op_Implicit". + /// + public const string Implicit = "op_Implicit"; + + /// + /// Returns "op_Equality". + /// + public const string Equality = "op_Equality"; + + /// + /// Returns "op_Inequality". + /// + public const string Inequality = "op_Inequality"; + + /// + /// Returns "op_GreaterThan". + /// + public const string GreaterThan = "op_GreaterThan"; + + /// + /// Returns "op_GreaterThanOrEqual". + /// + public const string GreaterThanOrEqual = "op_GreaterThanOrEqual"; + + /// + /// Returns "op_LessThan". + /// + public const string LessThan = "op_LessThan"; + + /// + /// Returns "op_LessThanOrEqual". + /// + public const string LessThanOrEqual = "op_LessThanOrEqual"; + + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/WellKnown.Queryable.cs b/Orm/Xtensive.Orm/Reflection/WellKnown.Queryable.cs index 8bee3b7533..31cc93dea5 100644 --- a/Orm/Xtensive.Orm/Reflection/WellKnown.Queryable.cs +++ b/Orm/Xtensive.Orm/Reflection/WellKnown.Queryable.cs @@ -1,250 +1,250 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.24 - -using System.Linq; - -namespace Xtensive.Reflection -{ - partial class WellKnown - { - /// - /// Various well-known constants related to . - /// - public static class Queryable - { - /// - /// Returns "Aggregate". - /// - public const string Aggregate = "Aggregate"; - - /// - /// Returns "All". - /// - public const string All = "All"; - - /// - /// Returns "Any". - /// - public const string Any = "Any"; - - /// - /// Returns "AsEnumerable". - /// - public const string AsEnumerable = "AsEnumerable"; - - /// - /// Returns "AsQueryable". - /// - public const string AsQueryable = "AsQueryable"; - - /// - /// Returns "Average". - /// - public const string Average = "Average"; - - /// - /// Returns "Cast". - /// - public const string Cast = "Cast"; - - /// - /// Returns "Concat". - /// - public const string Concat = "Concat"; - - /// - /// Returns "All". - /// - public const string Contains = "Contains"; - - /// - /// Returns "Count". - /// - public const string Count = "Count"; - - /// - /// Returns "DefaultIfEmpty". - /// - public const string DefaultIfEmpty = "DefaultIfEmpty"; - - /// - /// Returns "Distinct". - /// - public const string Distinct = "Distinct"; - - /// - /// Returns "ElementAt". - /// - public const string ElementAt = "ElementAt"; - - /// - /// Returns "ElementAtOrDefault". - /// - public const string ElementAtOrDefault = "ElementAtOrDefault"; - - /// - /// Returns "Except". - /// - public const string Except = "Except"; - - /// - /// Returns "First". - /// - public const string First = "First"; - - /// - /// Returns "FirstOrDefault". - /// - public const string FirstOrDefault = "FirstOrDefault"; - - /// - /// Returns "GroupBy". - /// - public const string GroupBy = "GroupBy"; - - /// - /// Returns "GroupJoin". - /// - public const string GroupJoin = "GroupJoin"; - - /// - /// Returns "Intersect". - /// - public const string Intersect = "Intersect"; - - /// - /// Returns "Join". - /// - public const string Join = "Join"; - - /// - /// Returns "Last". - /// - public const string Last = "Last"; - - /// - /// Returns "LastOrDefault". - /// - public const string LastOrDefault = "LastOrDefault"; - - /// - /// Returns "LongCount". - /// - public const string LongCount = "LongCount"; - - /// - /// Returns "Max". - /// - public const string Max = "Max"; - - /// - /// Returns "Min". - /// - public const string Min = "Min"; - - /// - /// Returns "OfType". - /// - public const string OfType = "OfType"; - - /// - /// Returns "OrderBy". - /// - public const string OrderBy = "OrderBy"; - - /// - /// Returns "OrderByDescending". - /// - public const string OrderByDescending = "OrderByDescending"; - - /// - /// Returns "Reverse". - /// - public const string Reverse = "Reverse"; - - /// - /// Returns "Select". - /// - public const string Select = "Select"; - - /// - /// Returns "SelectMany". - /// - public const string SelectMany = "SelectMany"; - - /// - /// Returns "SequenceEqual". - /// - public const string SequenceEqual = "SequenceEqual"; - - /// - /// Returns "Single". - /// - public const string Single = "Single"; - - /// - /// Returns "SingleOrDefault". - /// - public const string SingleOrDefault = "SingleOrDefault"; - - /// - /// Returns "Skip". - /// - public const string Skip = "Skip"; - - /// - /// Returns "SkipWhile". - /// - public const string SkipWhile = "SkipWhile"; - - /// - /// Returns "Sum". - /// - public const string Sum = "Sum"; - - /// - /// Returns "Take". - /// - public const string Take = "Take"; - - /// - /// Returns "TakeWhile". - /// - public const string TakeWhile = "TakeWhile"; - - /// - /// Returns "ThenBy". - /// - public const string ThenBy = "ThenBy"; - - /// - /// Returns "ThenByDescending". - /// - public const string ThenByDescending = "ThenByDescending"; - - /// - /// Returns "ToArray". - /// - public const string ToArray = "ToArray"; - - /// - /// Returns "ToList". - /// - public const string ToList = "ToList"; - - /// - /// Returns "Union". - /// - public const string Union = "Union"; - - /// - /// Returns "Where". - /// - public const string Where = "Where"; - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.24 + +using System.Linq; + +namespace Xtensive.Reflection +{ + partial class WellKnown + { + /// + /// Various well-known constants related to . + /// + public static class Queryable + { + /// + /// Returns "Aggregate". + /// + public const string Aggregate = "Aggregate"; + + /// + /// Returns "All". + /// + public const string All = "All"; + + /// + /// Returns "Any". + /// + public const string Any = "Any"; + + /// + /// Returns "AsEnumerable". + /// + public const string AsEnumerable = "AsEnumerable"; + + /// + /// Returns "AsQueryable". + /// + public const string AsQueryable = "AsQueryable"; + + /// + /// Returns "Average". + /// + public const string Average = "Average"; + + /// + /// Returns "Cast". + /// + public const string Cast = "Cast"; + + /// + /// Returns "Concat". + /// + public const string Concat = "Concat"; + + /// + /// Returns "All". + /// + public const string Contains = "Contains"; + + /// + /// Returns "Count". + /// + public const string Count = "Count"; + + /// + /// Returns "DefaultIfEmpty". + /// + public const string DefaultIfEmpty = "DefaultIfEmpty"; + + /// + /// Returns "Distinct". + /// + public const string Distinct = "Distinct"; + + /// + /// Returns "ElementAt". + /// + public const string ElementAt = "ElementAt"; + + /// + /// Returns "ElementAtOrDefault". + /// + public const string ElementAtOrDefault = "ElementAtOrDefault"; + + /// + /// Returns "Except". + /// + public const string Except = "Except"; + + /// + /// Returns "First". + /// + public const string First = "First"; + + /// + /// Returns "FirstOrDefault". + /// + public const string FirstOrDefault = "FirstOrDefault"; + + /// + /// Returns "GroupBy". + /// + public const string GroupBy = "GroupBy"; + + /// + /// Returns "GroupJoin". + /// + public const string GroupJoin = "GroupJoin"; + + /// + /// Returns "Intersect". + /// + public const string Intersect = "Intersect"; + + /// + /// Returns "Join". + /// + public const string Join = "Join"; + + /// + /// Returns "Last". + /// + public const string Last = "Last"; + + /// + /// Returns "LastOrDefault". + /// + public const string LastOrDefault = "LastOrDefault"; + + /// + /// Returns "LongCount". + /// + public const string LongCount = "LongCount"; + + /// + /// Returns "Max". + /// + public const string Max = "Max"; + + /// + /// Returns "Min". + /// + public const string Min = "Min"; + + /// + /// Returns "OfType". + /// + public const string OfType = "OfType"; + + /// + /// Returns "OrderBy". + /// + public const string OrderBy = "OrderBy"; + + /// + /// Returns "OrderByDescending". + /// + public const string OrderByDescending = "OrderByDescending"; + + /// + /// Returns "Reverse". + /// + public const string Reverse = "Reverse"; + + /// + /// Returns "Select". + /// + public const string Select = "Select"; + + /// + /// Returns "SelectMany". + /// + public const string SelectMany = "SelectMany"; + + /// + /// Returns "SequenceEqual". + /// + public const string SequenceEqual = "SequenceEqual"; + + /// + /// Returns "Single". + /// + public const string Single = "Single"; + + /// + /// Returns "SingleOrDefault". + /// + public const string SingleOrDefault = "SingleOrDefault"; + + /// + /// Returns "Skip". + /// + public const string Skip = "Skip"; + + /// + /// Returns "SkipWhile". + /// + public const string SkipWhile = "SkipWhile"; + + /// + /// Returns "Sum". + /// + public const string Sum = "Sum"; + + /// + /// Returns "Take". + /// + public const string Take = "Take"; + + /// + /// Returns "TakeWhile". + /// + public const string TakeWhile = "TakeWhile"; + + /// + /// Returns "ThenBy". + /// + public const string ThenBy = "ThenBy"; + + /// + /// Returns "ThenByDescending". + /// + public const string ThenByDescending = "ThenByDescending"; + + /// + /// Returns "ToArray". + /// + public const string ToArray = "ToArray"; + + /// + /// Returns "ToList". + /// + public const string ToList = "ToList"; + + /// + /// Returns "Union". + /// + public const string Union = "Union"; + + /// + /// Returns "Where". + /// + public const string Where = "Where"; + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/WellKnown.Tuple.cs b/Orm/Xtensive.Orm/Reflection/WellKnown.Tuple.cs index fa957209c8..00af1a353d 100644 --- a/Orm/Xtensive.Orm/Reflection/WellKnown.Tuple.cs +++ b/Orm/Xtensive.Orm/Reflection/WellKnown.Tuple.cs @@ -1,133 +1,133 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.24 - -namespace Xtensive.Reflection -{ - partial class WellKnown - { - /// - /// Various well-known constants related to . - /// - public static class Tuple - { - /// - /// Returns "GetValueOrDefault". - /// - public const string GetValueOrDefault = "GetValueOrDefault"; - - /// - /// Returns "GetValue". - /// - public const string GetValue = "GetValue"; - - /// - /// Returns "SetValue". - /// - public const string SetValue = "SetValue"; - - /// - /// Returns "HasValue". - /// - public const string HasValue = "HasValue"; - - /// - /// Returns "GetFieldState". - /// - public const string GetFieldState = "GetFieldState"; - - /// - /// Returns "SetFieldState". - /// - public const string SetFieldState = "SetFieldState"; - - /// - /// Returns "descriptor". - /// - public const string DescriptorFieldName = "descriptor"; - - /// - /// Returns "GetValue{0}". - /// - public const string GetValueX = "GetValue{0}"; - - /// - /// Returns "GetNullableValueOrDefault{0}". - /// - public const string GetNullableValueX = "GetNullableValue{0}"; - - /// - /// Returns "SetValue{0}". - /// - public const string SetValueX = "SetValue{0}"; - - /// - /// Returns "SetNullableValue{0}". - /// - public const string SetNullableValueX = "SetNullableValue{0}"; - - /// - /// Returns "getValueDelegates". - /// - public const string GetValueDelegatesFieldName = "getValueDelegates"; - - /// - /// Returns "getNullableValueDelegates". - /// - public const string GetNullableValueDelegatesFieldName = "getNullableValueDelegates"; - - /// - /// Returns "setValueDelegates". - /// - public const string SetValueDelegatesFieldName = "setValueDelegates"; - - /// - /// Returns "setNullableValueDelegates". - /// - public const string SetNullableValueDelegatesFieldName = "setNullableValueDelegates"; - - /// - /// Returns "GetGetValueDelegate". - /// - public const string GetGetValueDelegate = "GetGetValueDelegate"; - - /// - /// Returns "GetGetNullableValueDelegate". - /// - public const string GetGetNullableValueDelegate = "GetGetNullableValueDelegate"; - - /// - /// Returns "GetSetValueDelegate". - /// - public const string GetSetValueDelegate = "GetSetValueDelegate"; - - /// - /// Returns "GetSetValueDelegate". - /// - public const string GetSetNullableValueDelegate = "GetSetNullableValueDelegate"; - - /// - /// Returns "Descriptor". - /// - public const string Descriptor = "Descriptor"; - - /// - /// Returns "Count". - /// - public const string Count = "Count"; - - /// - /// Returns "Create". - /// - public const string Create = "Create"; - - /// - /// Returns "CreateNew". - /// - public const string CreateNew = "CreateNew"; - } - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.24 + +namespace Xtensive.Reflection +{ + partial class WellKnown + { + /// + /// Various well-known constants related to . + /// + public static class Tuple + { + /// + /// Returns "GetValueOrDefault". + /// + public const string GetValueOrDefault = "GetValueOrDefault"; + + /// + /// Returns "GetValue". + /// + public const string GetValue = "GetValue"; + + /// + /// Returns "SetValue". + /// + public const string SetValue = "SetValue"; + + /// + /// Returns "HasValue". + /// + public const string HasValue = "HasValue"; + + /// + /// Returns "GetFieldState". + /// + public const string GetFieldState = "GetFieldState"; + + /// + /// Returns "SetFieldState". + /// + public const string SetFieldState = "SetFieldState"; + + /// + /// Returns "descriptor". + /// + public const string DescriptorFieldName = "descriptor"; + + /// + /// Returns "GetValue{0}". + /// + public const string GetValueX = "GetValue{0}"; + + /// + /// Returns "GetNullableValueOrDefault{0}". + /// + public const string GetNullableValueX = "GetNullableValue{0}"; + + /// + /// Returns "SetValue{0}". + /// + public const string SetValueX = "SetValue{0}"; + + /// + /// Returns "SetNullableValue{0}". + /// + public const string SetNullableValueX = "SetNullableValue{0}"; + + /// + /// Returns "getValueDelegates". + /// + public const string GetValueDelegatesFieldName = "getValueDelegates"; + + /// + /// Returns "getNullableValueDelegates". + /// + public const string GetNullableValueDelegatesFieldName = "getNullableValueDelegates"; + + /// + /// Returns "setValueDelegates". + /// + public const string SetValueDelegatesFieldName = "setValueDelegates"; + + /// + /// Returns "setNullableValueDelegates". + /// + public const string SetNullableValueDelegatesFieldName = "setNullableValueDelegates"; + + /// + /// Returns "GetGetValueDelegate". + /// + public const string GetGetValueDelegate = "GetGetValueDelegate"; + + /// + /// Returns "GetGetNullableValueDelegate". + /// + public const string GetGetNullableValueDelegate = "GetGetNullableValueDelegate"; + + /// + /// Returns "GetSetValueDelegate". + /// + public const string GetSetValueDelegate = "GetSetValueDelegate"; + + /// + /// Returns "GetSetValueDelegate". + /// + public const string GetSetNullableValueDelegate = "GetSetNullableValueDelegate"; + + /// + /// Returns "Descriptor". + /// + public const string Descriptor = "Descriptor"; + + /// + /// Returns "Count". + /// + public const string Count = "Count"; + + /// + /// Returns "Create". + /// + public const string Create = "Create"; + + /// + /// Returns "CreateNew". + /// + public const string CreateNew = "CreateNew"; + } + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Reflection/WellKnown.cs b/Orm/Xtensive.Orm/Reflection/WellKnown.cs index 08989df548..0156a7e95b 100644 --- a/Orm/Xtensive.Orm/Reflection/WellKnown.cs +++ b/Orm/Xtensive.Orm/Reflection/WellKnown.cs @@ -1,57 +1,57 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.07.30 - -using System.Linq; - -namespace Xtensive.Reflection -{ - /// - /// Various well-known constants related to this namespace. - /// - public static partial class WellKnown - { - /// - /// Returns ".ctor". - /// - public const string CtorName = ".ctor"; - - /// - /// Returns ".cctor". - /// - public const string CctorName = ".cctor"; - - /// - /// Returns "get_". - /// - public const string GetterPrefix = "get_"; - - /// - /// Returns "set_". - /// - public const string SetterPrefix = "set_"; - - /// - /// Returns "Item" - /// - public const string IndexerPropertyName = "Item"; - - /// - /// Returns "add_". - /// - public const string AddEventHandlerPrefix = "add_"; - - /// - /// Returns "remove_". - /// - public const string RemoveEventHandlerPrefix = "remove_"; - - /// - /// Returns "System.Reflection.RuntimeMethodInfo". - /// - public const string RuntimeMethodInfoName = "System.Reflection.RuntimeMethodInfo"; - - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.07.30 + +using System.Linq; + +namespace Xtensive.Reflection +{ + /// + /// Various well-known constants related to this namespace. + /// + public static partial class WellKnown + { + /// + /// Returns ".ctor". + /// + public const string CtorName = ".ctor"; + + /// + /// Returns ".cctor". + /// + public const string CctorName = ".cctor"; + + /// + /// Returns "get_". + /// + public const string GetterPrefix = "get_"; + + /// + /// Returns "set_". + /// + public const string SetterPrefix = "set_"; + + /// + /// Returns "Item" + /// + public const string IndexerPropertyName = "Item"; + + /// + /// Returns "add_". + /// + public const string AddEventHandlerPrefix = "add_"; + + /// + /// Returns "remove_". + /// + public const string RemoveEventHandlerPrefix = "remove_"; + + /// + /// Returns "System.Reflection.RuntimeMethodInfo". + /// + public const string RuntimeMethodInfoName = "System.Reflection.RuntimeMethodInfo"; + + } +} diff --git a/Orm/Xtensive.Orm/Sorting/ConnectionType.cs b/Orm/Xtensive.Orm/Sorting/ConnectionType.cs index c51bef10fb..9eb8912c40 100644 --- a/Orm/Xtensive.Orm/Sorting/ConnectionType.cs +++ b/Orm/Xtensive.Orm/Sorting/ConnectionType.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.10 - -using System; - -namespace Xtensive.Sorting -{ - /// - /// Type of connection. - /// - [Serializable] - public enum ConnectionType - { - /// - /// Connection may be breaked by topological sorter. - /// - Breakable, - - /// - /// Connection cannot be breaked by topological sorter. - /// - Permanent, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.10 + +using System; + +namespace Xtensive.Sorting +{ + /// + /// Type of connection. + /// + [Serializable] + public enum ConnectionType + { + /// + /// Connection may be breaked by topological sorter. + /// + Breakable, + + /// + /// Connection cannot be breaked by topological sorter. + /// + Permanent, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sorting/Node.cs b/Orm/Xtensive.Orm/Sorting/Node.cs index 07f4818250..4de9456392 100644 --- a/Orm/Xtensive.Orm/Sorting/Node.cs +++ b/Orm/Xtensive.Orm/Sorting/Node.cs @@ -1,192 +1,192 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.03.13 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Core; - - -namespace Xtensive.Sorting -{ - /// - /// Sorting node. - /// - /// Type of node item. - /// Type of connection item. - [Serializable] - public class Node - { - private List> incomingConnections; - private ReadOnlyList> incomingConnectionsReadOnlyList; - private List> outgoingConnections; - private ReadOnlyList> outgoingConnectionsReadOnlyList; - - /// - /// Gets node item. - /// - public TNodeItem Item { get; private set; } - - /// - /// Gets of incoming connections. - /// - public ReadOnlyList> IncomingConnections { - get - { - EnsureIncomingConnections(); - return incomingConnectionsReadOnlyList; - } - } - - /// - /// Gets of outgoing connections. - /// - public ReadOnlyList> OutgoingConnections { - get - { - EnsureOutgoingConnections(); - return outgoingConnectionsReadOnlyList; - } - } - - /// - /// Gets count of outgoing connections. - /// - public int OutgoingConnectionCount { get{ return outgoingConnections==null ? 0 : outgoingConnections.Count;} } - - /// - /// Gets count of breakable outgoing connections. - /// - public int BreakableOutgoingConnectionCount { get{ return outgoingConnections==null ? 0 : outgoingConnections.Count - PermanentOutgoingConnectionCount;} } - - /// - /// Gets count of permanent outgoing connections. - /// - public int PermanentOutgoingConnectionCount { get; private set; } - - /// - /// Gets count of breakable incoming connections. - /// - public int BreakableIncomingConnectionCount { get{ return incomingConnections==null ? 0 : incomingConnections.Count - PermanentIncomingConnectionCount;} } - - /// - /// Gets count of breakable incoming connections. - /// - public int IncomingConnectionCount { get{ return incomingConnections==null ? 0 : incomingConnections.Count;} } - - /// - /// Gets count of permanent incoming connections. - /// - public int PermanentIncomingConnectionCount { get; private set; } - - internal void AddOutgoingConnection(NodeConnection connection) - { - EnsureOutgoingConnections(); - outgoingConnections.Add(connection); - if (connection.ConnectionType==ConnectionType.Permanent) - PermanentOutgoingConnectionCount ++; - } - - internal void AddIncomingConnection(NodeConnection connection) - { - EnsureIncomingConnections(); - incomingConnections.Add(connection); - if (connection.ConnectionType==ConnectionType.Permanent) - PermanentIncomingConnectionCount ++; - } - - internal void RemoveOutgoingConnection(NodeConnection connection) - { - if (outgoingConnections!=null) { - outgoingConnections.Remove(connection); - if (connection.ConnectionType==ConnectionType.Permanent) - PermanentOutgoingConnectionCount --; - } - } - - internal void RemoveIncomingConnection(NodeConnection connection) - { - if (incomingConnections!=null) { - incomingConnections.Remove(connection); - if (connection.ConnectionType==ConnectionType.Permanent) - PermanentIncomingConnectionCount --; - } - } - - /// - /// Adds new outgoing connection to node. - /// - /// Paired node. - /// Item of connection. - public NodeConnection AddConnection(Node node, TConnectionItem connectionItem) - { - ArgumentValidator.EnsureArgumentNotNull(node, "node"); - var connection = new NodeConnection(this, node, connectionItem); - connection.BindToNodes(); - return connection; - } - - /// - /// Adds new outgoing connection to node. - /// - /// Paired node. - /// Item of connection. - /// Type of connection. - public NodeConnection AddConnection(Node node, TConnectionItem connectionItem, ConnectionType connectionType) - { - ArgumentValidator.EnsureArgumentNotNull(node, "node"); - var connection = new NodeConnection(this, node, connectionItem, connectionType); - connection.BindToNodes(); - return connection; - } - - /// - /// Removes outgoing connections from node. - /// - /// Paired node. - public IEnumerable> RemoveConnections(Node destination) - { - ArgumentValidator.EnsureArgumentNotNull(destination, "destination"); - if (outgoingConnections==null) - return EnumerableUtils>.Empty; - - var nodesToRemove = outgoingConnections.Where(connection => connection.Destination==destination).ToList(); - EnumerableExtensions.ForEach(nodesToRemove, nodeConnection=>nodeConnection.UnbindFromNodes()); - return nodesToRemove; - } - - - // Private - - private void EnsureIncomingConnections() - { - if (incomingConnectionsReadOnlyList==null) { - incomingConnections = new List>(); - incomingConnectionsReadOnlyList = new ReadOnlyList>(incomingConnections); - } - } - - private void EnsureOutgoingConnections() - { - if (outgoingConnectionsReadOnlyList==null) { - outgoingConnections = new List>(); - outgoingConnectionsReadOnlyList = new ReadOnlyList>(outgoingConnections); - } - } - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The item. - public Node(TNodeItem item) - { - Item = item; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.03.13 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Core; + + +namespace Xtensive.Sorting +{ + /// + /// Sorting node. + /// + /// Type of node item. + /// Type of connection item. + [Serializable] + public class Node + { + private List> incomingConnections; + private ReadOnlyList> incomingConnectionsReadOnlyList; + private List> outgoingConnections; + private ReadOnlyList> outgoingConnectionsReadOnlyList; + + /// + /// Gets node item. + /// + public TNodeItem Item { get; private set; } + + /// + /// Gets of incoming connections. + /// + public ReadOnlyList> IncomingConnections { + get + { + EnsureIncomingConnections(); + return incomingConnectionsReadOnlyList; + } + } + + /// + /// Gets of outgoing connections. + /// + public ReadOnlyList> OutgoingConnections { + get + { + EnsureOutgoingConnections(); + return outgoingConnectionsReadOnlyList; + } + } + + /// + /// Gets count of outgoing connections. + /// + public int OutgoingConnectionCount { get{ return outgoingConnections==null ? 0 : outgoingConnections.Count;} } + + /// + /// Gets count of breakable outgoing connections. + /// + public int BreakableOutgoingConnectionCount { get{ return outgoingConnections==null ? 0 : outgoingConnections.Count - PermanentOutgoingConnectionCount;} } + + /// + /// Gets count of permanent outgoing connections. + /// + public int PermanentOutgoingConnectionCount { get; private set; } + + /// + /// Gets count of breakable incoming connections. + /// + public int BreakableIncomingConnectionCount { get{ return incomingConnections==null ? 0 : incomingConnections.Count - PermanentIncomingConnectionCount;} } + + /// + /// Gets count of breakable incoming connections. + /// + public int IncomingConnectionCount { get{ return incomingConnections==null ? 0 : incomingConnections.Count;} } + + /// + /// Gets count of permanent incoming connections. + /// + public int PermanentIncomingConnectionCount { get; private set; } + + internal void AddOutgoingConnection(NodeConnection connection) + { + EnsureOutgoingConnections(); + outgoingConnections.Add(connection); + if (connection.ConnectionType==ConnectionType.Permanent) + PermanentOutgoingConnectionCount ++; + } + + internal void AddIncomingConnection(NodeConnection connection) + { + EnsureIncomingConnections(); + incomingConnections.Add(connection); + if (connection.ConnectionType==ConnectionType.Permanent) + PermanentIncomingConnectionCount ++; + } + + internal void RemoveOutgoingConnection(NodeConnection connection) + { + if (outgoingConnections!=null) { + outgoingConnections.Remove(connection); + if (connection.ConnectionType==ConnectionType.Permanent) + PermanentOutgoingConnectionCount --; + } + } + + internal void RemoveIncomingConnection(NodeConnection connection) + { + if (incomingConnections!=null) { + incomingConnections.Remove(connection); + if (connection.ConnectionType==ConnectionType.Permanent) + PermanentIncomingConnectionCount --; + } + } + + /// + /// Adds new outgoing connection to node. + /// + /// Paired node. + /// Item of connection. + public NodeConnection AddConnection(Node node, TConnectionItem connectionItem) + { + ArgumentValidator.EnsureArgumentNotNull(node, "node"); + var connection = new NodeConnection(this, node, connectionItem); + connection.BindToNodes(); + return connection; + } + + /// + /// Adds new outgoing connection to node. + /// + /// Paired node. + /// Item of connection. + /// Type of connection. + public NodeConnection AddConnection(Node node, TConnectionItem connectionItem, ConnectionType connectionType) + { + ArgumentValidator.EnsureArgumentNotNull(node, "node"); + var connection = new NodeConnection(this, node, connectionItem, connectionType); + connection.BindToNodes(); + return connection; + } + + /// + /// Removes outgoing connections from node. + /// + /// Paired node. + public IEnumerable> RemoveConnections(Node destination) + { + ArgumentValidator.EnsureArgumentNotNull(destination, "destination"); + if (outgoingConnections==null) + return EnumerableUtils>.Empty; + + var nodesToRemove = outgoingConnections.Where(connection => connection.Destination==destination).ToList(); + EnumerableExtensions.ForEach(nodesToRemove, nodeConnection=>nodeConnection.UnbindFromNodes()); + return nodesToRemove; + } + + + // Private + + private void EnsureIncomingConnections() + { + if (incomingConnectionsReadOnlyList==null) { + incomingConnections = new List>(); + incomingConnectionsReadOnlyList = new ReadOnlyList>(incomingConnections); + } + } + + private void EnsureOutgoingConnections() + { + if (outgoingConnectionsReadOnlyList==null) { + outgoingConnections = new List>(); + outgoingConnectionsReadOnlyList = new ReadOnlyList>(outgoingConnections); + } + } + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The item. + public Node(TNodeItem item) + { + Item = item; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sorting/NodeConnection.cs b/Orm/Xtensive.Orm/Sorting/NodeConnection.cs index 7e2a882122..a877b65e83 100644 --- a/Orm/Xtensive.Orm/Sorting/NodeConnection.cs +++ b/Orm/Xtensive.Orm/Sorting/NodeConnection.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.03.13 - -using System; -using Xtensive.Core; - - -namespace Xtensive.Sorting -{ - /// - /// Connection between two s. - /// - /// Type of node item. - /// Type of connection item. - [Serializable] - public class NodeConnection - { - /// - /// Gets connection item. - /// - public TConnectionItem ConnectionItem { get; private set; } - - /// - /// Gets connection source. - /// - public Node Source { get; private set; } - - /// - /// Gets connection destination. - /// - public Node Destination { get; private set; } - - /// - /// Gets connection type. - /// - public ConnectionType ConnectionType { get; private set; } - - public bool IsBinded { get; private set; } - - public void BindToNodes() - { - if (!IsBinded) { - Source.AddOutgoingConnection(this); - Destination.AddIncomingConnection(this); - IsBinded = true; - } - } - - public void UnbindFromNodes() - { - if (IsBinded) { - Source.RemoveOutgoingConnection(this); - Destination.RemoveIncomingConnection(this); - IsBinded = false; - } - } - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The source. - /// The destination. - /// The connection item. - public NodeConnection(Node source, Node destination, TConnectionItem connectionItem) - : this(source, destination, connectionItem, ConnectionType.Breakable) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The source. - /// The destination. - /// The connection item. - /// Connection type. - public NodeConnection(Node source, Node destination, TConnectionItem connectionItem, ConnectionType connectionType) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNull(destination, "destination"); - ConnectionItem = connectionItem; - Source = source; - Destination = destination; - ConnectionType = connectionType; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.03.13 + +using System; +using Xtensive.Core; + + +namespace Xtensive.Sorting +{ + /// + /// Connection between two s. + /// + /// Type of node item. + /// Type of connection item. + [Serializable] + public class NodeConnection + { + /// + /// Gets connection item. + /// + public TConnectionItem ConnectionItem { get; private set; } + + /// + /// Gets connection source. + /// + public Node Source { get; private set; } + + /// + /// Gets connection destination. + /// + public Node Destination { get; private set; } + + /// + /// Gets connection type. + /// + public ConnectionType ConnectionType { get; private set; } + + public bool IsBinded { get; private set; } + + public void BindToNodes() + { + if (!IsBinded) { + Source.AddOutgoingConnection(this); + Destination.AddIncomingConnection(this); + IsBinded = true; + } + } + + public void UnbindFromNodes() + { + if (IsBinded) { + Source.RemoveOutgoingConnection(this); + Destination.RemoveIncomingConnection(this); + IsBinded = false; + } + } + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The source. + /// The destination. + /// The connection item. + public NodeConnection(Node source, Node destination, TConnectionItem connectionItem) + : this(source, destination, connectionItem, ConnectionType.Breakable) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The source. + /// The destination. + /// The connection item. + /// Connection type. + public NodeConnection(Node source, Node destination, TConnectionItem connectionItem, ConnectionType connectionType) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNull(destination, "destination"); + ConnectionItem = connectionItem; + Source = source; + Destination = destination; + ConnectionType = connectionType; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem, TConnectionItem}.cs b/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem, TConnectionItem}.cs index 9ccf7680ec..845fbbe7f6 100644 --- a/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem, TConnectionItem}.cs +++ b/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem, TConnectionItem}.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.10 - -using System; -using System.Collections.Generic; -using System.Diagnostics; - - -namespace Xtensive.Sorting -{ - /// - /// Describes result of operations. - /// - /// The type of the node item. - /// The type of the connection item. - [Serializable] - public class TopologicalSortResult : TopologicalSortResult - { - /// - /// Gets or sets the found loops. - /// - public List> Loops { get; private set;} - - /// - /// Initializes new instance of this type. - /// - /// The sorting result. - /// The found loops. - public TopologicalSortResult(List result, List> loops) - : base(result) - { - Loops = loops; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.10 + +using System; +using System.Collections.Generic; +using System.Diagnostics; + + +namespace Xtensive.Sorting +{ + /// + /// Describes result of operations. + /// + /// The type of the node item. + /// The type of the connection item. + [Serializable] + public class TopologicalSortResult : TopologicalSortResult + { + /// + /// Gets or sets the found loops. + /// + public List> Loops { get; private set;} + + /// + /// Initializes new instance of this type. + /// + /// The sorting result. + /// The found loops. + public TopologicalSortResult(List result, List> loops) + : base(result) + { + Loops = loops; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem}.cs b/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem}.cs index 97529b86e0..b63a181d28 100644 --- a/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem}.cs +++ b/Orm/Xtensive.Orm/Sorting/TopologicalSortResult{TNodeItem}.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2009.12.10 - -using System; -using System.Collections.Generic; - - -namespace Xtensive.Sorting -{ - /// - /// Base type for . - /// - /// The type of the node item. - [Serializable] - public class TopologicalSortResult - { - /// - /// Gets or sets the sorting result. - /// - public List Result { get; private set;} - - /// - /// Initializes new instance of this type. - /// - /// The sorting result. - public TopologicalSortResult(List result) - { - Result = result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2009.12.10 + +using System; +using System.Collections.Generic; + + +namespace Xtensive.Sorting +{ + /// + /// Base type for . + /// + /// The type of the node item. + [Serializable] + public class TopologicalSortResult + { + /// + /// Gets or sets the sorting result. + /// + public List Result { get; private set;} + + /// + /// Initializes new instance of this type. + /// + /// The sorting result. + public TopologicalSortResult(List result) + { + Result = result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sorting/TopologicalSorter.cs b/Orm/Xtensive.Orm/Sorting/TopologicalSorter.cs index 8fb3e29d82..64566109dc 100644 --- a/Orm/Xtensive.Orm/Sorting/TopologicalSorter.cs +++ b/Orm/Xtensive.Orm/Sorting/TopologicalSorter.cs @@ -1,247 +1,247 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.08.07 - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using System.Linq; -using Xtensive.Core; - - -namespace Xtensive.Sorting -{ - /// - /// Topological sorter for oriented graph of the items. - /// - public static class TopologicalSorter - { - /// - /// Sorts the specified oriented graph of the items in their topological order - /// (following the outgoing connections provided by ). - /// - /// The items to sort. - /// The connector delegate returning - /// if there is outgoing connection between the first and the second node. - /// - /// Sorting result, if there were no loops; - /// otherwise, . - /// - public static List Sort(IEnumerable items, Predicate connector) - { - List> loops; - return Sort(items, connector, out loops); - } - - /// - /// Sorts the specified oriented graph of the items in their topological order - /// (following the outgoing connections provided by ). - /// - /// The items to sort. - /// The connector delegate returning - /// if there is outgoing connection between the first and the second node. - /// The loops, if found. - /// - /// Sorting result, if there were no loops; - /// otherwise, . - /// In this case will contain only the loop edges. - /// - public static List Sort(IEnumerable items, Predicate connector, out List> loops) - { - ArgumentValidator.EnsureArgumentNotNull(items, "items"); - ArgumentValidator.EnsureArgumentNotNull(connector, "connector"); - List> nodes = GetNodes(items, connector); - return Sort(nodes, out loops); - } - - /// - /// Sorts the specified oriented graph of the items in their topological order - /// (following the outgoing connections provided by ). - /// - /// The items to sort. - /// The connector delegate returning - /// if there is outgoing connection between the first and the second node. - /// Edges removed to make graph non-cyclic. - /// - /// Sorting result - /// - public static List Sort(IEnumerable items, Predicate connector, out List> removedEdges) - { - return Sort(items, connector, out removedEdges, false); - } - - /// - /// Sorts the specified oriented graph of the items in their topological order - /// (following the outgoing connections provided by ). - /// - /// The items to sort. - /// The connector delegate returning - /// if there is outgoing connection between the first and the second node. - /// Edges removed to make graph non-cyclic. - /// If removes whole node in the case of loop, otherwise removes only one edge. - /// - /// Sorting result - /// - public static List Sort(IEnumerable items, Predicate connector, out List> removedEdges, bool removeWholeNode) - { - ArgumentValidator.EnsureArgumentNotNull(items, "items"); - ArgumentValidator.EnsureArgumentNotNull(connector, "connector"); - List> nodes = GetNodes(items, connector); - return Sort(nodes, out removedEdges, removeWholeNode); - } - - /// - /// Sorts the specified oriented graph of the nodes in their topological order - /// (following the outgoing connections). - /// - /// The nodes. - /// The loops, if found. - /// Sorting result, if there were no loops; - /// otherwise, . - /// In this case will contain only the loop edges. - public static List Sort(List> nodes, out List> loops) - { - ArgumentValidator.EnsureArgumentNotNull(nodes, "nodes"); - var head = new Queue(); - var tail = new Queue(); - var nodeList = nodes.ToList(); - var nodesToRemove = new List>(); - while (nodeList.Count > 0) { - nodesToRemove.Clear(); - foreach (var node in nodeList) { - if (node.IncomingConnectionCount==0) { - // Add to head - head.Enqueue(node.Item); - nodesToRemove.Add(node); - var connections = node.OutgoingConnections.ToArray(); - foreach (var connection in connections) - connection.UnbindFromNodes(); - } - else if (node.OutgoingConnectionCount==0) { - // Add to tail - tail.Enqueue(node.Item); - nodesToRemove.Add(node); - var connections = node.IncomingConnections.ToArray(); - foreach (var connection in connections) - connection.UnbindFromNodes(); - } - } - if (nodesToRemove.Count==0) { - loops = new List>(nodeList); - return null; - } - foreach (var nodeToRemove in nodesToRemove) - nodeList.Remove(nodeToRemove); - } - loops = null; - return head.Concat(tail.Reverse()).ToList(); - } - - - /// - /// Sorts the specified oriented graph of the nodes in their topological order - /// (following the outgoing connections). - /// - /// The nodes. - /// Edges removed to make graph non-cyclic. - /// Sorting result. - public static List Sort(IEnumerable> nodes, out List> removedEdges) - { - return Sort(nodes, out removedEdges, false); - } - - /// - /// Sorts the specified oriented graph of the nodes in their topological order - /// (following the outgoing connections). - /// - /// The nodes. - /// Edges removed to make graph non-cyclic. - /// If removes whole node in the case of loop, otherwise removes only one edge. - /// Sorting result. - public static List Sort(IEnumerable> nodes, out List> removedEdges, bool removeWholeNode) - { - ArgumentValidator.EnsureArgumentNotNull(nodes, "nodes"); - var head = new Queue(); - var tail = new Queue(); - removedEdges = new List>(); - var nodeList = nodes.ToList(); - var nodesToRemove = new List>(); - while (nodeList.Count > 0) { - nodesToRemove.Clear(); - Node nodeToBreakLoop = null; - NodeConnection edgeToBreakLoop = null; - foreach (var node in nodeList) { - if (node.IncomingConnectionCount==0) { - // Add to head - head.Enqueue(node.Item); - nodesToRemove.Add(node); - var connections = node.OutgoingConnections.ToArray(); - foreach (var connection in connections) - connection.UnbindFromNodes(); - } - else if (node.OutgoingConnectionCount==0) { - // Add to tail - tail.Enqueue(node.Item); - nodesToRemove.Add(node); - var connections = node.IncomingConnections.ToArray(); - foreach (var connection in connections) - connection.UnbindFromNodes(); - } - else { - if (removeWholeNode) { - if (node.PermanentOutgoingConnectionCount==0 && (nodeToBreakLoop==null || node.OutgoingConnectionCount > nodeToBreakLoop.OutgoingConnectionCount)) - nodeToBreakLoop = node; - } - else { - if (node.BreakableOutgoingConnectionCount>0 && edgeToBreakLoop==null) - edgeToBreakLoop = node.OutgoingConnections.First(connection=>connection.ConnectionType==ConnectionType.Breakable); - } - } - } - if (nodesToRemove.Count==0) { - if (nodeToBreakLoop!=null) { - // Remove node - var connections = nodeToBreakLoop.OutgoingConnections.ToArray(); - foreach (var connection in connections) - connection.UnbindFromNodes(); - foreach (var connection in nodeToBreakLoop.IncomingConnections.ToArray()) - connection.UnbindFromNodes(); - removedEdges.AddRange(connections); - tail.Enqueue(nodeToBreakLoop.Item); - nodeList.Remove(nodeToBreakLoop); - } - else if (edgeToBreakLoop!=null) { - // remove edge - removedEdges.Add(edgeToBreakLoop); - edgeToBreakLoop.UnbindFromNodes(); - } - else { - throw new InvalidOperationException(Strings.ExOnlyBreakableNodesSadSmile); - } - } - foreach (var nodeToRemove in nodesToRemove) - nodeList.Remove(nodeToRemove); - } - return head.Concat(tail.Reverse()).ToList(); - } - - private static List> GetNodes(IEnumerable items, Predicate connector) - { - // Converting all the items to nodes - var nodes = new List>(); - foreach (var item in items) - nodes.Add(new Node(item)); - // Adding connections - foreach (var nodeA in nodes) - foreach (var nodeB in nodes) { - if (nodeA==nodeB) - continue; - if (connector.Invoke(nodeA.Item, nodeB.Item)) - nodeA.AddConnection(nodeB, null); - } - return nodes; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.08.07 + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using System.Linq; +using Xtensive.Core; + + +namespace Xtensive.Sorting +{ + /// + /// Topological sorter for oriented graph of the items. + /// + public static class TopologicalSorter + { + /// + /// Sorts the specified oriented graph of the items in their topological order + /// (following the outgoing connections provided by ). + /// + /// The items to sort. + /// The connector delegate returning + /// if there is outgoing connection between the first and the second node. + /// + /// Sorting result, if there were no loops; + /// otherwise, . + /// + public static List Sort(IEnumerable items, Predicate connector) + { + List> loops; + return Sort(items, connector, out loops); + } + + /// + /// Sorts the specified oriented graph of the items in their topological order + /// (following the outgoing connections provided by ). + /// + /// The items to sort. + /// The connector delegate returning + /// if there is outgoing connection between the first and the second node. + /// The loops, if found. + /// + /// Sorting result, if there were no loops; + /// otherwise, . + /// In this case will contain only the loop edges. + /// + public static List Sort(IEnumerable items, Predicate connector, out List> loops) + { + ArgumentValidator.EnsureArgumentNotNull(items, "items"); + ArgumentValidator.EnsureArgumentNotNull(connector, "connector"); + List> nodes = GetNodes(items, connector); + return Sort(nodes, out loops); + } + + /// + /// Sorts the specified oriented graph of the items in their topological order + /// (following the outgoing connections provided by ). + /// + /// The items to sort. + /// The connector delegate returning + /// if there is outgoing connection between the first and the second node. + /// Edges removed to make graph non-cyclic. + /// + /// Sorting result + /// + public static List Sort(IEnumerable items, Predicate connector, out List> removedEdges) + { + return Sort(items, connector, out removedEdges, false); + } + + /// + /// Sorts the specified oriented graph of the items in their topological order + /// (following the outgoing connections provided by ). + /// + /// The items to sort. + /// The connector delegate returning + /// if there is outgoing connection between the first and the second node. + /// Edges removed to make graph non-cyclic. + /// If removes whole node in the case of loop, otherwise removes only one edge. + /// + /// Sorting result + /// + public static List Sort(IEnumerable items, Predicate connector, out List> removedEdges, bool removeWholeNode) + { + ArgumentValidator.EnsureArgumentNotNull(items, "items"); + ArgumentValidator.EnsureArgumentNotNull(connector, "connector"); + List> nodes = GetNodes(items, connector); + return Sort(nodes, out removedEdges, removeWholeNode); + } + + /// + /// Sorts the specified oriented graph of the nodes in their topological order + /// (following the outgoing connections). + /// + /// The nodes. + /// The loops, if found. + /// Sorting result, if there were no loops; + /// otherwise, . + /// In this case will contain only the loop edges. + public static List Sort(List> nodes, out List> loops) + { + ArgumentValidator.EnsureArgumentNotNull(nodes, "nodes"); + var head = new Queue(); + var tail = new Queue(); + var nodeList = nodes.ToList(); + var nodesToRemove = new List>(); + while (nodeList.Count > 0) { + nodesToRemove.Clear(); + foreach (var node in nodeList) { + if (node.IncomingConnectionCount==0) { + // Add to head + head.Enqueue(node.Item); + nodesToRemove.Add(node); + var connections = node.OutgoingConnections.ToArray(); + foreach (var connection in connections) + connection.UnbindFromNodes(); + } + else if (node.OutgoingConnectionCount==0) { + // Add to tail + tail.Enqueue(node.Item); + nodesToRemove.Add(node); + var connections = node.IncomingConnections.ToArray(); + foreach (var connection in connections) + connection.UnbindFromNodes(); + } + } + if (nodesToRemove.Count==0) { + loops = new List>(nodeList); + return null; + } + foreach (var nodeToRemove in nodesToRemove) + nodeList.Remove(nodeToRemove); + } + loops = null; + return head.Concat(tail.Reverse()).ToList(); + } + + + /// + /// Sorts the specified oriented graph of the nodes in their topological order + /// (following the outgoing connections). + /// + /// The nodes. + /// Edges removed to make graph non-cyclic. + /// Sorting result. + public static List Sort(IEnumerable> nodes, out List> removedEdges) + { + return Sort(nodes, out removedEdges, false); + } + + /// + /// Sorts the specified oriented graph of the nodes in their topological order + /// (following the outgoing connections). + /// + /// The nodes. + /// Edges removed to make graph non-cyclic. + /// If removes whole node in the case of loop, otherwise removes only one edge. + /// Sorting result. + public static List Sort(IEnumerable> nodes, out List> removedEdges, bool removeWholeNode) + { + ArgumentValidator.EnsureArgumentNotNull(nodes, "nodes"); + var head = new Queue(); + var tail = new Queue(); + removedEdges = new List>(); + var nodeList = nodes.ToList(); + var nodesToRemove = new List>(); + while (nodeList.Count > 0) { + nodesToRemove.Clear(); + Node nodeToBreakLoop = null; + NodeConnection edgeToBreakLoop = null; + foreach (var node in nodeList) { + if (node.IncomingConnectionCount==0) { + // Add to head + head.Enqueue(node.Item); + nodesToRemove.Add(node); + var connections = node.OutgoingConnections.ToArray(); + foreach (var connection in connections) + connection.UnbindFromNodes(); + } + else if (node.OutgoingConnectionCount==0) { + // Add to tail + tail.Enqueue(node.Item); + nodesToRemove.Add(node); + var connections = node.IncomingConnections.ToArray(); + foreach (var connection in connections) + connection.UnbindFromNodes(); + } + else { + if (removeWholeNode) { + if (node.PermanentOutgoingConnectionCount==0 && (nodeToBreakLoop==null || node.OutgoingConnectionCount > nodeToBreakLoop.OutgoingConnectionCount)) + nodeToBreakLoop = node; + } + else { + if (node.BreakableOutgoingConnectionCount>0 && edgeToBreakLoop==null) + edgeToBreakLoop = node.OutgoingConnections.First(connection=>connection.ConnectionType==ConnectionType.Breakable); + } + } + } + if (nodesToRemove.Count==0) { + if (nodeToBreakLoop!=null) { + // Remove node + var connections = nodeToBreakLoop.OutgoingConnections.ToArray(); + foreach (var connection in connections) + connection.UnbindFromNodes(); + foreach (var connection in nodeToBreakLoop.IncomingConnections.ToArray()) + connection.UnbindFromNodes(); + removedEdges.AddRange(connections); + tail.Enqueue(nodeToBreakLoop.Item); + nodeList.Remove(nodeToBreakLoop); + } + else if (edgeToBreakLoop!=null) { + // remove edge + removedEdges.Add(edgeToBreakLoop); + edgeToBreakLoop.UnbindFromNodes(); + } + else { + throw new InvalidOperationException(Strings.ExOnlyBreakableNodesSadSmile); + } + } + foreach (var nodeToRemove in nodesToRemove) + nodeList.Remove(nodeToRemove); + } + return head.Concat(tail.Reverse()).ToList(); + } + + private static List> GetNodes(IEnumerable items, Predicate connector) + { + // Converting all the items to nodes + var nodes = new List>(); + foreach (var item in items) + nodes.Add(new Node(item)); + // Adding connections + foreach (var nodeA in nodes) + foreach (var nodeB in nodes) { + if (nodeA==nodeB) + continue; + if (connector.Invoke(nodeA.Item, nodeB.Item)) + nodeA.AddConnection(nodeB, null); + } + return nodes; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Compressor.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Compressor.cs index 04da38d7d2..7a3f9b275c 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Compressor.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Compressor.cs @@ -1,207 +1,207 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Text; - -namespace Xtensive.Sql.Compiler -{ - internal sealed class Compressor : NodeVisitor - { - private readonly char newLineEnd; - private char last; - private byte indent; - private StringBuilder buffer; - private Node root; - private Node current; - - public static Node Process(SqlTranslator translator, ContainerNode node) - { - var compressor = new Compressor(translator); - compressor.CreateBuffer(); - compressor.VisitNodeSequence(node); - compressor.FlushBuffer(); - return compressor.root; - } - - #region Private / internal methods - - private void CreateBuffer() - { - buffer = new StringBuilder(); - } - - private void FlushBuffer() - { - if (buffer==null) - return; - string text = buffer.ToString(); - buffer = null; - if (string.IsNullOrEmpty(text)) - return; - AppendNode(new TextNode(text)); - } - - private void ResetLast() - { - last = '\0'; - } - - private void AppendNode(Node node) - { - if (current==null) { - current = node; - root = node; - } - else { - current.Next = node; - current = node; - } - } - - private void Append(string text) - { - if (string.IsNullOrEmpty(text)) - return; - char first = text[0]; - if (first==')' && last==' ') - buffer.Length--; - last = text[text.Length-1]; - buffer.Append(text); - } - - private void AppendLine(string text) - { - buffer.AppendLine(text); - last = newLineEnd; - } - - private void AppendSpace() - { - if (!(last==' ' || last==newLineEnd || last=='(')) { - buffer.Append(' '); - last = ' '; - } - } - - private void AppendIndent() - { - if (indent>0) { - buffer.Append(new string(' ', indent*2)); - last = ' '; - } - } - - private Node VisitBranch(Node node) - { - var originalCurrent = current; - var originalRoot = root; - root = null; - current = null; - try { - CreateBuffer(); - VisitNodeSequence(node); - FlushBuffer(); - return root; - } - finally { - buffer = null; - root = originalRoot; - current = originalCurrent; - } - } - - private void BeginNonTextNode() - { - AppendSpace(); - FlushBuffer(); - } - - private void EndNonTextNode() - { - CreateBuffer(); - ResetLast(); - } - - #endregion - - #region NodeVisitor Members - - public override void Visit(TextNode node) - { - AppendSpace(); - Append(node.Text); - } - - public override void Visit(ContainerNode node) - { - if (node.RequireIndent) { - indent++; - buffer.AppendLine(); - AppendIndent(); - } - VisitNodeSequence(node.Child); - if (node.RequireIndent) - indent--; - } - - public override void Visit(DelimiterNode node) - { - switch (node.Type) { - case SqlDelimiterType.Column: - AppendLine(node.Text); - AppendIndent(); - break; - default: - Append(node.Text); - break; - } - } - - public override void Visit(VariantNode node) - { - BeginNonTextNode(); - var variant = new VariantNode(node.Id); - variant.Main = VisitBranch(node.Main); - variant.Alternative = VisitBranch(node.Alternative); - AppendNode(variant); - EndNonTextNode(); - } - - public override void Visit(PlaceholderNode node) - { - BeginNonTextNode(); - AppendNode(new PlaceholderNode(node.Id)); - EndNonTextNode(); - } - - public override void Visit(CycleItemNode node) - { - BeginNonTextNode(); - AppendNode(new CycleItemNode(node.Index)); - EndNonTextNode(); - } - - public override void Visit(CycleNode node) - { - BeginNonTextNode(); - var cycle = new CycleNode(node.Id); - cycle.Body = VisitBranch(node.Body); - cycle.EmptyCase = VisitBranch(node.EmptyCase); - cycle.Delimiter = node.Delimiter; - AppendNode(cycle); - EndNonTextNode(); - } - - #endregion - - - // Constructors - - private Compressor(SqlTranslator translator) - { - newLineEnd = translator.NewLine[translator.NewLine.Length - 1]; - last = newLineEnd; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Text; + +namespace Xtensive.Sql.Compiler +{ + internal sealed class Compressor : NodeVisitor + { + private readonly char newLineEnd; + private char last; + private byte indent; + private StringBuilder buffer; + private Node root; + private Node current; + + public static Node Process(SqlTranslator translator, ContainerNode node) + { + var compressor = new Compressor(translator); + compressor.CreateBuffer(); + compressor.VisitNodeSequence(node); + compressor.FlushBuffer(); + return compressor.root; + } + + #region Private / internal methods + + private void CreateBuffer() + { + buffer = new StringBuilder(); + } + + private void FlushBuffer() + { + if (buffer==null) + return; + string text = buffer.ToString(); + buffer = null; + if (string.IsNullOrEmpty(text)) + return; + AppendNode(new TextNode(text)); + } + + private void ResetLast() + { + last = '\0'; + } + + private void AppendNode(Node node) + { + if (current==null) { + current = node; + root = node; + } + else { + current.Next = node; + current = node; + } + } + + private void Append(string text) + { + if (string.IsNullOrEmpty(text)) + return; + char first = text[0]; + if (first==')' && last==' ') + buffer.Length--; + last = text[text.Length-1]; + buffer.Append(text); + } + + private void AppendLine(string text) + { + buffer.AppendLine(text); + last = newLineEnd; + } + + private void AppendSpace() + { + if (!(last==' ' || last==newLineEnd || last=='(')) { + buffer.Append(' '); + last = ' '; + } + } + + private void AppendIndent() + { + if (indent>0) { + buffer.Append(new string(' ', indent*2)); + last = ' '; + } + } + + private Node VisitBranch(Node node) + { + var originalCurrent = current; + var originalRoot = root; + root = null; + current = null; + try { + CreateBuffer(); + VisitNodeSequence(node); + FlushBuffer(); + return root; + } + finally { + buffer = null; + root = originalRoot; + current = originalCurrent; + } + } + + private void BeginNonTextNode() + { + AppendSpace(); + FlushBuffer(); + } + + private void EndNonTextNode() + { + CreateBuffer(); + ResetLast(); + } + + #endregion + + #region NodeVisitor Members + + public override void Visit(TextNode node) + { + AppendSpace(); + Append(node.Text); + } + + public override void Visit(ContainerNode node) + { + if (node.RequireIndent) { + indent++; + buffer.AppendLine(); + AppendIndent(); + } + VisitNodeSequence(node.Child); + if (node.RequireIndent) + indent--; + } + + public override void Visit(DelimiterNode node) + { + switch (node.Type) { + case SqlDelimiterType.Column: + AppendLine(node.Text); + AppendIndent(); + break; + default: + Append(node.Text); + break; + } + } + + public override void Visit(VariantNode node) + { + BeginNonTextNode(); + var variant = new VariantNode(node.Id); + variant.Main = VisitBranch(node.Main); + variant.Alternative = VisitBranch(node.Alternative); + AppendNode(variant); + EndNonTextNode(); + } + + public override void Visit(PlaceholderNode node) + { + BeginNonTextNode(); + AppendNode(new PlaceholderNode(node.Id)); + EndNonTextNode(); + } + + public override void Visit(CycleItemNode node) + { + BeginNonTextNode(); + AppendNode(new CycleItemNode(node.Index)); + EndNonTextNode(); + } + + public override void Visit(CycleNode node) + { + BeginNonTextNode(); + var cycle = new CycleNode(node.Id); + cycle.Body = VisitBranch(node.Body); + cycle.EmptyCase = VisitBranch(node.EmptyCase); + cycle.Delimiter = node.Delimiter; + AppendNode(cycle); + EndNonTextNode(); + } + + #endregion + + + // Constructors + + private Compressor(SqlTranslator translator) + { + newLineEnd = translator.NewLine[translator.NewLine.Length - 1]; + last = newLineEnd; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/ContextType.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/ContextType.cs index 9b8d5e795f..ab4d09680c 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/ContextType.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/ContextType.cs @@ -1,12 +1,12 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Compiler -{ - internal enum ContextType - { - Node = 0, - Collection = 1 - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Compiler +{ + internal enum ContextType + { + Node = 0, + Collection = 1 + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/JoinSequence.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/JoinSequence.cs index 7307858df3..0b2677b82a 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/JoinSequence.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/JoinSequence.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.05.18 - -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Compiler -{ - internal sealed class JoinSequence - { - public SqlTable Pivot { get; private set; } - - public IList Tables { get; private set; } - - public IList JoinTypes { get; private set; } - - public IList Conditions { get; private set; } - - public static JoinSequence Build(SqlJoinedTable root) - { - var joins = new List(); - Traverse(root, joins); - - var result = new JoinSequence(); - - foreach (var item in joins) { - if (!(item.Left is SqlJoinedTable)) - result.Tables.Add(item.Left); - if (!(item.Right is SqlJoinedTable)) - result.Tables.Add(item.Right); - result.JoinTypes.Add(item.JoinType); - result.Conditions.Add(item.Expression); - } - - var pivot = result.Tables[0]; - result.Pivot = pivot; - result.Tables.RemoveAt(0); - - result.Tables = new ReadOnlyCollection(result.Tables); - result.JoinTypes = new ReadOnlyCollection(result.JoinTypes); - result.Conditions = new ReadOnlyCollection(result.Conditions); - - return result; - } - - private static void Traverse(SqlJoinedTable root, ICollection output) - { - var left = root.JoinExpression.Left; - var joinedLeft = left as SqlJoinedTable; - if (joinedLeft!=null) - Traverse(joinedLeft, output); - - output.Add(root.JoinExpression); - - var right = root.JoinExpression.Right; - var joinedRight = right as SqlJoinedTable; - if (joinedRight!=null) - Traverse(joinedRight, output); - } - - - // Constructors - - private JoinSequence() - { - Tables = new List(); - JoinTypes = new List(); - Conditions = new List(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.05.18 + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Compiler +{ + internal sealed class JoinSequence + { + public SqlTable Pivot { get; private set; } + + public IList Tables { get; private set; } + + public IList JoinTypes { get; private set; } + + public IList Conditions { get; private set; } + + public static JoinSequence Build(SqlJoinedTable root) + { + var joins = new List(); + Traverse(root, joins); + + var result = new JoinSequence(); + + foreach (var item in joins) { + if (!(item.Left is SqlJoinedTable)) + result.Tables.Add(item.Left); + if (!(item.Right is SqlJoinedTable)) + result.Tables.Add(item.Right); + result.JoinTypes.Add(item.JoinType); + result.Conditions.Add(item.Expression); + } + + var pivot = result.Tables[0]; + result.Pivot = pivot; + result.Tables.RemoveAt(0); + + result.Tables = new ReadOnlyCollection(result.Tables); + result.JoinTypes = new ReadOnlyCollection(result.JoinTypes); + result.Conditions = new ReadOnlyCollection(result.Conditions); + + return result; + } + + private static void Traverse(SqlJoinedTable root, ICollection output) + { + var left = root.JoinExpression.Left; + var joinedLeft = left as SqlJoinedTable; + if (joinedLeft!=null) + Traverse(joinedLeft, output); + + output.Add(root.JoinExpression); + + var right = root.JoinExpression.Right; + var joinedRight = right as SqlJoinedTable; + if (joinedRight!=null) + Traverse(joinedRight, output); + } + + + // Constructors + + private JoinSequence() + { + Tables = new List(); + JoinTypes = new List(); + Conditions = new List(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/NodeVisitor.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/NodeVisitor.cs index b608979c8c..ba71ebd71e 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/NodeVisitor.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/NodeVisitor.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.23 - -using System; - -namespace Xtensive.Sql.Compiler -{ - internal class NodeVisitor - { - public virtual void Visit(TextNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(ContainerNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(DelimiterNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(VariantNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(PlaceholderNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(CycleNode node) - { - throw new InvalidOperationException(); - } - - public virtual void Visit(CycleItemNode node) - { - throw new InvalidOperationException(); - } - - protected void VisitNodeSequence(Node node) - { - while (node != null) { - node.AcceptVisitor(this); - node = node.Next; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.23 + +using System; + +namespace Xtensive.Sql.Compiler +{ + internal class NodeVisitor + { + public virtual void Visit(TextNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(ContainerNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(DelimiterNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(VariantNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(PlaceholderNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(CycleNode node) + { + throw new InvalidOperationException(); + } + + public virtual void Visit(CycleItemNode node) + { + throw new InvalidOperationException(); + } + + protected void VisitNodeSequence(Node node) + { + while (node != null) { + node.AcceptVisitor(this); + node = node.Next; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs index 39b60a6f6e..8d8e9d4c6a 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Compiler -{ - /// - /// Container node in SQL DOM query model. - /// - public class ContainerNode : Node - { - private Node current; - - public Node Child; - public bool RequireIndent; - - public Node Current { get { return current; } } - public bool IsEmpty { get { return Child==null; } } - - public void Add(Node node) - { - if (Child==null) - Child = node; - else - current.Next = node; - current = node; - } - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - public void AppendPlaceholder(object id) - { - Add(new PlaceholderNode(id)); - } - - public void AppendCycleItem(int index) - { - Add(new CycleItemNode(index)); - } - - public void AppendText(string text) - { - if (string.IsNullOrEmpty(text)) - return; - Add(new TextNode(text)); - } - - public void AppendDelimiter(string text) - { - Add(new DelimiterNode(SqlDelimiterType.Row, text)); - } - - public void AppendDelimiter(string text, SqlDelimiterType type) - { - Add(new DelimiterNode(type, text)); - } - - - // Constructors - - public ContainerNode(bool requireIndent) - { - RequireIndent = requireIndent; - } - - public ContainerNode() - { - RequireIndent = false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Compiler +{ + /// + /// Container node in SQL DOM query model. + /// + public class ContainerNode : Node + { + private Node current; + + public Node Child; + public bool RequireIndent; + + public Node Current { get { return current; } } + public bool IsEmpty { get { return Child==null; } } + + public void Add(Node node) + { + if (Child==null) + Child = node; + else + current.Next = node; + current = node; + } + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + public void AppendPlaceholder(object id) + { + Add(new PlaceholderNode(id)); + } + + public void AppendCycleItem(int index) + { + Add(new CycleItemNode(index)); + } + + public void AppendText(string text) + { + if (string.IsNullOrEmpty(text)) + return; + Add(new TextNode(text)); + } + + public void AppendDelimiter(string text) + { + Add(new DelimiterNode(SqlDelimiterType.Row, text)); + } + + public void AppendDelimiter(string text, SqlDelimiterType type) + { + Add(new DelimiterNode(type, text)); + } + + + // Constructors + + public ContainerNode(bool requireIndent) + { + RequireIndent = requireIndent; + } + + public ContainerNode() + { + RequireIndent = false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleItemNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleItemNode.cs index 4935cadf02..74c63e80e9 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleItemNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleItemNode.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.07 - -namespace Xtensive.Sql.Compiler -{ - internal class CycleItemNode : Node - { - public readonly int Index; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - - // Constructors - - public CycleItemNode(int index) - { - Index = index; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.07 + +namespace Xtensive.Sql.Compiler +{ + internal class CycleItemNode : Node + { + public readonly int Index; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + + // Constructors + + public CycleItemNode(int index) + { + Index = index; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleNode.cs index 32bd7de2a7..d215c1da71 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/CycleNode.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.06 - -namespace Xtensive.Sql.Compiler -{ - internal class CycleNode : Node - { - public readonly object Id; - - public Node Body; - public Node EmptyCase; - - public string Delimiter; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - public CycleNode(object id) - { - Id = id; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.06 + +namespace Xtensive.Sql.Compiler +{ + internal class CycleNode : Node + { + public readonly object Id; + + public Node Body; + public Node EmptyCase; + + public string Delimiter; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + public CycleNode(object id) + { + Id = id; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/DelimiterNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/DelimiterNode.cs index 3a0d9d66cf..28b15ac2ba 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/DelimiterNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/DelimiterNode.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Diagnostics; - -namespace Xtensive.Sql.Compiler -{ - [DebuggerDisplay("Text = {Text}")] - internal class DelimiterNode : Node - { - public readonly SqlDelimiterType Type; - public readonly string Text; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - // Constructor - - public DelimiterNode(SqlDelimiterType type, string text) - { - Type = type; - Text = text; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Diagnostics; + +namespace Xtensive.Sql.Compiler +{ + [DebuggerDisplay("Text = {Text}")] + internal class DelimiterNode : Node + { + public readonly SqlDelimiterType Type; + public readonly string Text; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + // Constructor + + public DelimiterNode(SqlDelimiterType type, string text) + { + Type = type; + Text = text; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/Node.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/Node.cs index f05f67154b..a46659b219 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/Node.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/Node.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Compiler -{ - /// - /// Node in SQL DOM query model. - /// - public abstract class Node - { - public Node Next; - - internal abstract void AcceptVisitor(NodeVisitor visitor); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Compiler +{ + /// + /// Node in SQL DOM query model. + /// + public abstract class Node + { + public Node Next; + + internal abstract void AcceptVisitor(NodeVisitor visitor); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/PlaceholderNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/PlaceholderNode.cs index 361aa19711..926cadc7ea 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/PlaceholderNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/PlaceholderNode.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.15 - -namespace Xtensive.Sql.Compiler -{ - internal class PlaceholderNode : Node - { - public readonly object Id; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - public PlaceholderNode(object id) - { - Id = id; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.15 + +namespace Xtensive.Sql.Compiler +{ + internal class PlaceholderNode : Node + { + public readonly object Id; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + public PlaceholderNode(object id) + { + Id = id; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/TextNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/TextNode.cs index 5a2e3da8a9..749f1c0b53 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/TextNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/TextNode.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Diagnostics; - -namespace Xtensive.Sql.Compiler -{ - [DebuggerDisplay("Text = {Text}")] - internal class TextNode : Node - { - public readonly string Text; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - // Constructor - - public TextNode(string text) - { - Text = text; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Diagnostics; + +namespace Xtensive.Sql.Compiler +{ + [DebuggerDisplay("Text = {Text}")] + internal class TextNode : Node + { + public readonly string Text; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + // Constructor + + public TextNode(string text) + { + Text = text; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/VariantNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/VariantNode.cs index 1c1870277a..d0ba1af64a 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/VariantNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/VariantNode.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.23 - -namespace Xtensive.Sql.Compiler -{ - internal class VariantNode : Node - { - public readonly object Id; - - public Node Main; - public Node Alternative; - - internal override void AcceptVisitor(NodeVisitor visitor) - { - visitor.Visit(this); - } - - // Constructor - - public VariantNode(object id) - { - Id = id; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.23 + +namespace Xtensive.Sql.Compiler +{ + internal class VariantNode : Node + { + public readonly object Id; + + public Node Main; + public Node Alternative; + + internal override void AcceptVisitor(NodeVisitor visitor) + { + visitor.Visit(this); + } + + // Constructor + + public VariantNode(object id) + { + Id = id; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/PostCompiler.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/PostCompiler.cs index 6e76c8e3a6..3806a1cbf8 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/PostCompiler.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/PostCompiler.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.23 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace Xtensive.Sql.Compiler -{ - internal class PostCompiler : NodeVisitor - { - private const int MinimalResultCapacity = 64; - private const int ResultCapacityMargin = 16; - - private readonly StringBuilder result; - private readonly SqlPostCompilerConfiguration configuration; - - private string[] currentCycleItem; - - public static string Process(Node root, SqlPostCompilerConfiguration configuration, int estimatedResultLength) - { - var compiler = new PostCompiler(configuration, estimatedResultLength); - compiler.VisitNodeSequence(root); - return compiler.result.ToString(); - } - - #region NodeVisitor members - - public override void Visit(TextNode node) - { - result.Append(node.Text); - } - - public override void Visit(VariantNode node) - { - if (configuration.AlternativeBranches.Contains(node.Id)) - VisitNodeSequence(node.Alternative); - else - VisitNodeSequence(node.Main); - } - - public override void Visit(PlaceholderNode node) - { - string value; - if (!configuration.PlaceholderValues.TryGetValue(node.Id, out value)) - throw new InvalidOperationException(string.Format(Strings.ExValueForPlaceholderXIsNotSet, node.Id)); - result.Append(value); - } - - public override void Visit(CycleItemNode node) - { - result.Append(currentCycleItem[node.Index]); - } - - public override void Visit(CycleNode node) - { - List items; - if (!configuration.DynamicFilterValues.TryGetValue(node.Id, out items)) - throw new InvalidOperationException(string.Format(Strings.ExItemsForCycleXAreNotSpecified, node.Id)); - if (items==null || items.Count==0) { - VisitNodeSequence(node.EmptyCase); - return; - } - for (int i = 0; i < items.Count - 1; i++) { - currentCycleItem = items[i]; - VisitNodeSequence(node.Body); - result.Append(node.Delimiter); - } - currentCycleItem = items[items.Count - 1]; - VisitNodeSequence(node.Body); - } - - #endregion - - - // Constructors - - private PostCompiler(SqlPostCompilerConfiguration configuration, int estimatedResultLength) - { - int capacity = estimatedResultLength + ResultCapacityMargin; - result = new StringBuilder(capacity < MinimalResultCapacity ? MinimalResultCapacity : capacity); - this.configuration = configuration; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.23 + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Xtensive.Sql.Compiler +{ + internal class PostCompiler : NodeVisitor + { + private const int MinimalResultCapacity = 64; + private const int ResultCapacityMargin = 16; + + private readonly StringBuilder result; + private readonly SqlPostCompilerConfiguration configuration; + + private string[] currentCycleItem; + + public static string Process(Node root, SqlPostCompilerConfiguration configuration, int estimatedResultLength) + { + var compiler = new PostCompiler(configuration, estimatedResultLength); + compiler.VisitNodeSequence(root); + return compiler.result.ToString(); + } + + #region NodeVisitor members + + public override void Visit(TextNode node) + { + result.Append(node.Text); + } + + public override void Visit(VariantNode node) + { + if (configuration.AlternativeBranches.Contains(node.Id)) + VisitNodeSequence(node.Alternative); + else + VisitNodeSequence(node.Main); + } + + public override void Visit(PlaceholderNode node) + { + string value; + if (!configuration.PlaceholderValues.TryGetValue(node.Id, out value)) + throw new InvalidOperationException(string.Format(Strings.ExValueForPlaceholderXIsNotSet, node.Id)); + result.Append(value); + } + + public override void Visit(CycleItemNode node) + { + result.Append(currentCycleItem[node.Index]); + } + + public override void Visit(CycleNode node) + { + List items; + if (!configuration.DynamicFilterValues.TryGetValue(node.Id, out items)) + throw new InvalidOperationException(string.Format(Strings.ExItemsForCycleXAreNotSpecified, node.Id)); + if (items==null || items.Count==0) { + VisitNodeSequence(node.EmptyCase); + return; + } + for (int i = 0; i < items.Count - 1; i++) { + currentCycleItem = items[i]; + VisitNodeSequence(node.Body); + result.Append(node.Delimiter); + } + currentCycleItem = items[items.Count - 1]; + VisitNodeSequence(node.Body); + } + + #endregion + + + // Constructors + + private PostCompiler(SqlPostCompilerConfiguration configuration, int estimatedResultLength) + { + int capacity = estimatedResultLength + ResultCapacityMargin; + result = new StringBuilder(capacity < MinimalResultCapacity ? MinimalResultCapacity : capacity); + this.configuration = configuration; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/RecursiveBinaryLogicExtractor.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/RecursiveBinaryLogicExtractor.cs index 94e29f634c..e71727a778 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/RecursiveBinaryLogicExtractor.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/RecursiveBinaryLogicExtractor.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.08.29 - -using System; -using System.Collections.Generic; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Compiler -{ - internal static class RecursiveBinaryLogicExtractor - { - public static List Extract(SqlBinary input) - { - var operatorType = input.NodeType; - if (operatorType!=SqlNodeType.Or && operatorType!=SqlNodeType.And) - throw new NotSupportedException(); - var result = new List(); - Traverse(input, operatorType, result); - return result; - } - - private static void Traverse(SqlExpression expression, SqlNodeType operatorType, List output) - { - if (expression.NodeType==operatorType) { - var binary = (SqlBinary) expression; - Traverse(binary.Left, operatorType, output); - Traverse(binary.Right, operatorType, output); - } - else - output.Add(expression); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.08.29 + +using System; +using System.Collections.Generic; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Compiler +{ + internal static class RecursiveBinaryLogicExtractor + { + public static List Extract(SqlBinary input) + { + var operatorType = input.NodeType; + if (operatorType!=SqlNodeType.Or && operatorType!=SqlNodeType.And) + throw new NotSupportedException(); + var result = new List(); + Traverse(input, operatorType, result); + return result; + } + + private static void Traverse(SqlExpression expression, SqlNodeType operatorType, List output) + { + if (expression.NodeType==operatorType) { + var binary = (SqlBinary) expression; + Traverse(binary.Left, operatorType, output); + Traverse(binary.Right, operatorType, output); + } + else + output.Add(expression); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs index 982565707d..24be3154c5 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilationResult.cs @@ -1,85 +1,85 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Compiler -{ - /// - /// Represents a compilation results. - /// - public sealed class SqlCompilationResult - { - private readonly Node resultNode; - private readonly string resultText; - private readonly IDictionary parameterNames; - private volatile int lastResultLength; - - /// - public override string ToString() - { - return GetCommandText(); - } - - /// - /// Gets the name of the assigned during compilation. - /// All explicitly named parameters are not searched by this method. - /// - /// The parameter. - /// Assigned name. - public string GetParameterName(object parameter) - { - string result; - if (parameterNames==null || !parameterNames.TryGetValue(parameter, out result)) - throw new InvalidOperationException(string.Format(Strings.ExNameForParameterXIsNotFound, parameter)); - return result; - } - - /// - /// Gets the textual representation of SQL DOM statement compilation. - /// - /// The SQL text command. - public string GetCommandText() - { - if (resultText!=null) - return resultText; - string result = PostCompiler.Process(resultNode, new SqlPostCompilerConfiguration(), lastResultLength); - lastResultLength = result.Length; - return result; - } - - /// - /// Gets the textual representation of SQL DOM statement compilation. - /// Query is postprocessed using the specified . - /// - /// The postcompiler configuration. - /// The SQL text command. - public string GetCommandText(SqlPostCompilerConfiguration configuration) - { - if (resultText!=null) - return resultText; - string result = PostCompiler.Process(resultNode, configuration, lastResultLength); - lastResultLength = result.Length; - return result; - } - - - // Constructors - - internal SqlCompilationResult(Node result, IDictionary parameterNames) - { - if (result==null) { - resultText = string.Empty; - return; - } - var textNode = result as TextNode; - if (textNode!=null && textNode.Next==null) - resultText = textNode.Text; - else - resultNode = result; - this.parameterNames = parameterNames.Count > 0 ? parameterNames : null; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Compiler +{ + /// + /// Represents a compilation results. + /// + public sealed class SqlCompilationResult + { + private readonly Node resultNode; + private readonly string resultText; + private readonly IDictionary parameterNames; + private volatile int lastResultLength; + + /// + public override string ToString() + { + return GetCommandText(); + } + + /// + /// Gets the name of the assigned during compilation. + /// All explicitly named parameters are not searched by this method. + /// + /// The parameter. + /// Assigned name. + public string GetParameterName(object parameter) + { + string result; + if (parameterNames==null || !parameterNames.TryGetValue(parameter, out result)) + throw new InvalidOperationException(string.Format(Strings.ExNameForParameterXIsNotFound, parameter)); + return result; + } + + /// + /// Gets the textual representation of SQL DOM statement compilation. + /// + /// The SQL text command. + public string GetCommandText() + { + if (resultText!=null) + return resultText; + string result = PostCompiler.Process(resultNode, new SqlPostCompilerConfiguration(), lastResultLength); + lastResultLength = result.Length; + return result; + } + + /// + /// Gets the textual representation of SQL DOM statement compilation. + /// Query is postprocessed using the specified . + /// + /// The postcompiler configuration. + /// The SQL text command. + public string GetCommandText(SqlPostCompilerConfiguration configuration) + { + if (resultText!=null) + return resultText; + string result = PostCompiler.Process(resultNode, configuration, lastResultLength); + lastResultLength = result.Length; + return result; + } + + + // Constructors + + internal SqlCompilationResult(Node result, IDictionary parameterNames) + { + if (result==null) { + resultText = string.Empty; + return; + } + var textNode = result as TextNode; + if (textNode!=null && textNode.Next==null) + resultText = textNode.Text; + else + resultNode = result; + this.parameterNames = parameterNames.Count > 0 ? parameterNames : null; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs index 2fc69b5cf7..10046919ee 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs @@ -1,1744 +1,1744 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Compiler -{ - /// - /// Base class for any SQL compiler. - /// - public class SqlCompiler : SqlDriverBound, - ISqlVisitor - { - protected readonly SqlValueType decimalType; - protected readonly SqlTranslator translator; - - protected SqlCompilerConfiguration configuration; - protected SqlCompilerContext context; - - public SqlCompilationResult Compile(ISqlCompileUnit unit, SqlCompilerConfiguration compilerConfiguration) - { - ArgumentValidator.EnsureArgumentNotNull(unit, "unit"); - configuration = compilerConfiguration; - context = new SqlCompilerContext(configuration); - unit.AcceptVisitor(this); - return new SqlCompilationResult( - Compressor.Process(translator, context.Output), - context.ParameterNameProvider.NameTable); - } - - public virtual void Visit(SqlAggregate node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Expression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlAlterDomain node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.Entry)); - if (node.Action is SqlAddConstraint) { - var constraint = (DomainConstraint) ((SqlAddConstraint)node.Action).Constraint; - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.AddConstraint)); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); - constraint.Condition.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); - } - else if (node.Action is SqlDropConstraint) { - var action = node.Action as SqlDropConstraint; - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.DropConstraint)); - context.Output.AppendText(translator.Translate(context, action.Constraint, ConstraintSection.Entry)); - } - else if (node.Action is SqlSetDefault) { - var action = node.Action as SqlSetDefault; - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.SetDefault)); - action.DefaultValue.AcceptVisitor(this); - } - else if (node.Action is SqlDropDefault) - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.DropDefault)); - context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.Exit)); - } - } - - public virtual void Visit(SqlAlterPartitionFunction node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlAlterPartitionScheme node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlFragment node) - { - using (context.EnterScope(node)) - using (context.EnterScope(0)) { - node.Expression.AcceptVisitor(this); - } - } - - public virtual void Visit(SqlAlterTable node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); - if (node.Action is SqlAddColumn) { - var column = ((SqlAddColumn) node.Action).Column; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AddColumn)); - Visit(column); - } - else if (node.Action is SqlDropDefault) { - var column = ((SqlDropDefault) node.Action).Column; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.DropDefault)); - } - else if (node.Action is SqlSetDefault) { - var action = node.Action as SqlSetDefault; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetDefault)); - action.DefaultValue.AcceptVisitor(this); - } - else if (node.Action is SqlDropColumn) { - var action = node.Action as SqlDropColumn; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropColumn)); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); - } - else if (node.Action is SqlAlterIdentityInfo) { - var action = node.Action as SqlAlterIdentityInfo; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); - if ((action.InfoOption & SqlAlterIdentityInfoOptions.RestartWithOption)!=0) - context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.RestartValue)); - if ((action.InfoOption & SqlAlterIdentityInfoOptions.IncrementByOption)!=0) { - if (action.SequenceDescriptor.Increment.HasValue && action.SequenceDescriptor.Increment.Value==0) - throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); - context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.Increment)); - } - if ((action.InfoOption & SqlAlterIdentityInfoOptions.MaxValueOption)!=0) { - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); - context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.AlterMaxValue)); - } - if ((action.InfoOption & SqlAlterIdentityInfoOptions.MinValueOption)!=0) { - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); - context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.AlterMinValue)); - } - if ((action.InfoOption & SqlAlterIdentityInfoOptions.CycleOption)!=0) { - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); - context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); - } - } - else if (node.Action is SqlAddConstraint) { - var constraint = ((SqlAddConstraint) node.Action).Constraint as TableConstraint; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AddConstraint)); - Visit(constraint); - } - else if (node.Action is SqlDropConstraint) { - var action = node.Action as SqlDropConstraint; - var constraint = action.Constraint as TableConstraint; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); - } - else if (node.Action is SqlRenameColumn) { - var action = node.Action as SqlRenameColumn; - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.RenameColumn)); - context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.To)); - context.Output.AppendText(translator.QuoteIdentifier(action.NewName)); - } - context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); - } - } - - public virtual void Visit(SqlAlterSequence node) - { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - if ((node.InfoOption & SqlAlterIdentityInfoOptions.RestartWithOption)!=0) - context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.RestartValue)); - if ((node.InfoOption & SqlAlterIdentityInfoOptions.IncrementByOption)!=0) { - if (node.SequenceDescriptor.Increment.HasValue && node.SequenceDescriptor.Increment.Value==0) - throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); - context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.Increment)); - } - if ((node.InfoOption & SqlAlterIdentityInfoOptions.MaxValueOption)!=0) - context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.AlterMaxValue)); - if ((node.InfoOption & SqlAlterIdentityInfoOptions.MinValueOption)!=0) - context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.AlterMinValue)); - if ((node.InfoOption & SqlAlterIdentityInfoOptions.CycleOption)!=0) - context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - - public virtual void Visit(SqlArray node) - { - var items = node.GetValues(); - if (items.Length==0) { - context.Output.AppendText(translator.Translate(context, node, ArraySection.EmptyArray)); - return; - } - context.Output.AppendText(translator.Translate(context, node, ArraySection.Entry)); - for (int i = 0; i < items.Length-1; i++) { - context.Output.AppendText(translator.Translate(context, items[i])); - context.Output.AppendDelimiter(translator.RowItemDelimiter); - } - context.Output.AppendText(translator.Translate(context, items[items.Length-1])); - context.Output.AppendText(translator.Translate(context, node, ArraySection.Exit)); - } - - public virtual void Visit(SqlAssignment node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Left.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(node.NodeType)); - node.Right.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlBatch node) - { - using (context.EnterScope(node)) { - var statements = FlattenBatch(node).ToArray(); - if (statements.Length==0) - return; - if (statements.Length==1) { - statements[0].AcceptVisitor(this); - return; - } - context.Output.AppendText(translator.BatchBegin); - using (context.EnterCollectionScope()) { - foreach (var item in statements) { - item.AcceptVisitor(this); - context.Output.AppendDelimiter(translator.BatchItemDelimiter, SqlDelimiterType.Column); - } - } - context.Output.AppendText(translator.BatchEnd); - } - } - - public virtual void Visit(SqlBetween node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, BetweenSection.Entry)); - node.Expression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, BetweenSection.Between)); - node.Left.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, BetweenSection.And)); - node.Right.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, BetweenSection.Exit)); - } - } - - public virtual void Visit(SqlBinary node) - { - if (node.NodeType==SqlNodeType.In || node.NodeType==SqlNodeType.NotIn) { - var row = node.Right as SqlRow; - var array = node.Right as SqlArray; - bool isEmptyIn = !row.IsNullReference() && row.Count==0 || !array.IsNullReference() && array.Length==0; - if (isEmptyIn) { - SqlDml.Literal(node.NodeType==SqlNodeType.NotIn).AcceptVisitor(this); - return; - } - } - - if (node.NodeType==SqlNodeType.Or || node.NodeType==SqlNodeType.And) { - var expressions = RecursiveBinaryLogicExtractor.Extract(node); - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - expressions[0].AcceptVisitor(this); - foreach (var operand in expressions.Skip(1)) { - context.Output.AppendText(translator.Translate(node.NodeType)); - operand.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - return; - } - - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Left.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(node.NodeType)); - node.Right.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlBreak node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCase node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, CaseSection.Entry)); - - if (!node.Value.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, CaseSection.Value)); - node.Value.AcceptVisitor(this); - } - - using (context.EnterCollectionScope()) { - foreach (KeyValuePair item in node) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.WhenDelimiter); - context.Output.AppendText(translator.Translate(context, node, item.Key, CaseSection.When)); - item.Key.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, item.Value, CaseSection.Then)); - item.Value.AcceptVisitor(this); - } - } - - if (!node.Else.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, CaseSection.Else)); - node.Else.AcceptVisitor(this); - } - - context.Output.AppendText(translator.Translate(context, node, CaseSection.Exit)); - } - } - - public virtual void Visit(SqlCast node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Operand.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlCloseCursor node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCollate node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Operand.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlColumnRef node) - { - context.Output.AppendText(translator.Translate(context, node, ColumnSection.Entry)); - } - - public virtual void Visit(SqlContainsTable node) - { - throw SqlHelper.NotSupported(Strings.FullTextQueries); - } - - public virtual void Visit(SqlNative node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlNativeHint node) - { - // nothing - } - - public virtual void Visit(SqlConcat node) - { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - bool first = true; - foreach (var item in node) { - if (!first) { - context.Output.AppendText(translator.Translate(node.NodeType)); - } - item.AcceptVisitor(this); - first = false; - } - - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - - public virtual void Visit(SqlContainer node) - { - throw new SqlCompilerException(Strings.ExSqlContainerExpressionCanNotBeCompiled); - } - - public virtual void Visit(SqlContinue node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCommand node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreateAssertion node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Assertion.Condition.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlCreateCharacterSet node) - { -// ArgumentValidator.EnsureArgumentNotNull(node.CharacterSet.CharacterSetSource, "CharacterSetSource"); -// context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreateCollation node) - { -// ArgumentValidator.EnsureArgumentNotNull(node.Collation.CharacterSet, "CharacterSet"); -// context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreateDomain node) - { - ArgumentValidator.EnsureArgumentNotNull(node.Domain.DataType, "DataType"); - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.Entry)); - if (!node.Domain.DefaultValue.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.DomainDefaultValue)); - node.Domain.DefaultValue.AcceptVisitor(this); - } - if (node.Domain.DomainConstraints.Count!=0) { - using (context.EnterCollectionScope()) - foreach (DomainConstraint constraint in node.Domain.DomainConstraints) { - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); - constraint.Condition.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); - } - } - if (node.Domain.Collation!=null) - context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.DomainCollate)); - context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.Exit)); - } - } - - public virtual void Visit(SqlCreateIndex node) - { - ArgumentValidator.EnsureArgumentNotNull(node.Index.DataTable, "DataTable"); - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Entry)); - if (node.Index.Columns.Count > 0) { - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.ColumnsEnter)); - using (context.EnterCollectionScope()) { - foreach (var item in node.Index.Columns) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - Visit(node, item); - } - } - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.ColumnsExit)); - } - if (node.Index.NonkeyColumns != null && node.Index.NonkeyColumns.Count != 0 && CheckFeature(IndexFeatures.NonKeyColumns)) { - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.NonkeyColumnsEnter)); - using (context.EnterCollectionScope()) { - foreach (var item in node.Index.NonkeyColumns) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - context.Output.AppendText(translator.QuoteIdentifier(item.Name)); - } - } - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.NonkeyColumnsExit)); - } - - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.StorageOptions)); - - if (!node.Index.Where.IsNullReference() && CheckFeature(IndexFeatures.Filtered)) { - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Where)); - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { - node.Index.Where.AcceptVisitor(this); - } - } - context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Exit)); - } - - public virtual void Visit(SqlCreateIndex node, IndexColumn item) - { - if (!item.Expression.IsNullReference() && CheckFeature(IndexFeatures.Expressions)) { - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) - item.Expression.AcceptVisitor(this); - } - else { - context.Output.AppendText(translator.QuoteIdentifier(item.Column.Name)); - if (!(node.Index.IsFullText || node.Index.IsSpatial) && CheckFeature(IndexFeatures.SortOrder)) - context.Output.AppendText(translator.TranslateSortOrder(item.Ascending)); - } - } - - public virtual void Visit(SqlCreatePartitionFunction node) - { - ArgumentValidator.EnsureArgumentNotNull(node.PartitionFunction.DataType, "DataType"); - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreatePartitionScheme node) - { - ArgumentValidator.EnsureArgumentNotNull(node.PartitionSchema.PartitionFunction, "PartitionFunction"); - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreateSchema node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - if (node.Schema.Assertions.Count>0) - using (context.EnterCollectionScope()) - foreach (Assertion assertion in node.Schema.Assertions) { - new SqlCreateAssertion(assertion).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - if (node.Schema.CharacterSets.Count>0) - using (context.EnterCollectionScope()) - foreach (CharacterSet characterSet in node.Schema.CharacterSets) { - new SqlCreateCharacterSet(characterSet).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - if (node.Schema.Collations.Count>0) - using (context.EnterCollectionScope()) - foreach (Collation collation in node.Schema.Collations) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - new SqlCreateCollation(collation).AcceptVisitor(this); - } - - if (node.Schema.Domains.Count>0) - using (context.EnterCollectionScope()) - foreach (Domain domain in node.Schema.Domains) { - new SqlCreateDomain(domain).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - if (node.Schema.Sequences.Count>0) - using (context.EnterCollectionScope()) - foreach (Sequence sequence in node.Schema.Sequences) { - new SqlCreateSequence(sequence).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - if (node.Schema.Tables.Count>0) - using (context.EnterCollectionScope()) - foreach (Table table in node.Schema.Tables) { - new SqlCreateTable(table).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - if (table.Indexes.Count>0) - using (context.EnterCollectionScope()) - foreach (Index index in table.Indexes) { - new SqlCreateIndex(index).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - } - - if (node.Schema.Translations.Count>0) - using (context.EnterCollectionScope()) - foreach (Translation translation in node.Schema.Translations) { - new SqlCreateTranslation(translation).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - if (node.Schema.Views.Count>0) - using (context.EnterCollectionScope()) - foreach (View view in node.Schema.Views) { - new SqlCreateView(view).AcceptVisitor(this); - context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); - } - - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlCreateSequence node) - { - ArgumentValidator.EnsureArgumentNotNull(node.Sequence.SequenceDescriptor, "SequenceDescriptor"); - using (context.EnterScope(node)) { - if (node.Sequence.SequenceDescriptor.Increment.HasValue && node.Sequence.SequenceDescriptor.Increment.Value==0) - throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); - if (string.IsNullOrEmpty(node.Sequence.Name)) - throw new SqlCompilerException(Strings.ExNameMustBeNotNullOrEmpty); - if (node.Sequence.Schema==null) - throw new SqlCompilerException(Strings.ExSchemaMustBeNotNull); - if (node.Sequence.SequenceDescriptor.MaxValue.HasValue && - node.Sequence.SequenceDescriptor.MinValue.HasValue && - node.Sequence.SequenceDescriptor.MaxValue.Value<=node.Sequence.SequenceDescriptor.MinValue.Value) - throw new SqlCompilerException(Strings.ExTheMaximumValueMustBeGreaterThanTheMinimumValue); - if (node.Sequence.SequenceDescriptor.StartValue.HasValue && - (node.Sequence.SequenceDescriptor.MaxValue.HasValue && - node.Sequence.SequenceDescriptor.MaxValue.Valuenode.Sequence.SequenceDescriptor.StartValue.Value)) - throw new SqlCompilerException(Strings.ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.StartValue)); - context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.Increment)); - context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.MaxValue)); - context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.MinValue)); - context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlCreateTable node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, CreateTableSection.TableElementsEntry)); - - // ReSharper disable ConditionIsAlwaysTrueOrFalse - // ReSharper disable RedundantAssignment - - bool hasItems = false; - - if (node.Table.Columns.Count > 0) - hasItems = VisitCreateTableColumns(node, node.Table.TableColumns, hasItems); - if (node.Table.TableConstraints.Count > 0) - hasItems = VisitCreateTableConstraints(node, node.Table.TableConstraints, hasItems); - - // ReSharper restore ConditionIsAlwaysTrueOrFalse - // ReSharper restore RedundantAssignment - - context.Output.AppendText(translator.Translate(context, node, CreateTableSection.TableElementsExit)); - if (node.Table.PartitionDescriptor!=null) { - context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); - context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Partition)); - } - context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Exit)); - } - } - - protected virtual bool VisitCreateTableConstraints(SqlCreateTable node, IEnumerable constraints, bool hasItems) - { - using (context.EnterCollectionScope()) { - foreach (TableConstraint constraint in constraints) { - if (hasItems) - context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); - else - hasItems = true; - Visit(constraint); - } - } - return hasItems; - } - - protected virtual bool VisitCreateTableColumns(SqlCreateTable node, IEnumerable columns, bool hasItems) - { - using (context.EnterCollectionScope()) { - foreach (var column in columns) { - // Skipping computed columns - if (!column.Expression.IsNullReference() && !CheckFeature(ColumnFeatures.Computed)) - continue; - if (hasItems) - context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); - else - hasItems = true; - Visit(column); - } - } - - return hasItems; - } - - public virtual void Visit(SqlCreateTranslation node) - { -// ArgumentValidator.EnsureArgumentNotNull(node.Translation.SourceCharacterSet, "SourceCharacterSet"); -// ArgumentValidator.EnsureArgumentNotNull(node.Translation.TargetCharacterSet, "TargetCharacterSet"); -// ArgumentValidator.EnsureArgumentNotNull(node.Translation.TranslationSource, "TranslationSource"); -// context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlCreateView node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - if (!node.View.Definition.IsNullReference()) - node.View.Definition.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlCursor node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDeclareCursor node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Entry)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Sensivity)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Scrollability)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Cursor)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Holdability)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Returnability)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.For)); - - node.Cursor.Query.AcceptVisitor(this); - if (node.Cursor.Columns.Count!=0) { - foreach (SqlColumnRef item in node.Cursor.Columns) { - item.AcceptVisitor(this); - } - } - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Updatability)); - context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Exit)); - } - } - - public virtual void Visit(SqlDeclareVariable node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDefaultValue node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDelete node) - { - VisitDeleteDefault(node); - } - - public void VisitDeleteDefault(SqlDelete node) - { - using (context.EnterScope(node)) { - VisitDeleteEntry(node); - VisitDeleteDelete(node); - VisitDeleteFrom(node); - VisitDeleteWhere(node); - VisitDeleteLimit(node); - VisitDeleteExit(node); - } - } - - public virtual void VisitDeleteEntry(SqlDelete node) - { - context.Output.AppendText(translator.Translate(context, node, DeleteSection.Entry)); - } - - public virtual void VisitDeleteDelete(SqlDelete node) - { - if (node.Delete == null) - throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); - - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { - node.Delete.AcceptVisitor(this); - } - } - - public virtual void VisitDeleteFrom(SqlDelete node) - { - if (CheckFeature(QueryFeatures.DeleteFrom) && node.From!=null) { - context.Output.AppendText(translator.Translate(context, node, DeleteSection.From)); - node.From.AcceptVisitor(this); - } - } - - public virtual void VisitDeleteWhere(SqlDelete node) - { - if (!node.Where.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, DeleteSection.Where)); - node.Where.AcceptVisitor(this); - } - } - - public virtual void VisitDeleteLimit(SqlDelete node) - { - if (!node.Limit.IsNullReference()) { - if (!CheckFeature(QueryFeatures.DeleteLimit)) - throw new NotSupportedException(Strings.ExStorageIsNotSupportedLimitationOfRowCountToDelete); - context.Output.AppendText(translator.Translate(context, node, DeleteSection.Limit)); - node.Limit.AcceptVisitor(this); - } - } - - public virtual void VisitDeleteExit(SqlDelete node) - { - context.Output.AppendText(translator.Translate(context, node, DeleteSection.Exit)); - } - - public virtual void Visit(SqlDropAssertion node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropCharacterSet node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropCollation node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropDomain node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropIndex node) - { - ArgumentValidator.EnsureArgumentNotNull(node.Index.DataTable, "DataTable"); - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropPartitionFunction node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropPartitionScheme node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropSchema node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropSequence node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropTable node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropTranslation node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlDropView node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlFastFirstRowsHint node) - { - // nothing - } - - public virtual void Visit(SqlDynamicFilter node) - { - switch (node.Expressions.Count) { - case 0: - SqlDml.Literal(true).AcceptVisitor(this); - break; - case 1: - TranslateDynamicFilterViaInOperator(node); - break; - default: - if (CheckFeature(QueryFeatures.MulticolumnIn)) - TranslateDynamicFilterViaInOperator(node); - else - TranslateDynamicFilterViaMultipleComparisons(node); - break; - } - } - - public virtual void Visit(SqlFetch node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, FetchSection.Entry)); - if (!node.RowCount.IsNullReference()) - node.RowCount.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, FetchSection.Targets)); - foreach (ISqlCursorFetchTarget item in node.Targets) { - item.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, FetchSection.Exit)); - } - } - - public virtual void Visit(SqlForceJoinOrderHint node) - { - // nothing - } - - public virtual void Visit(SqlFreeTextTable node) - { - throw SqlHelper.NotSupported(Strings.FullTextQueries); - } - - public virtual void Visit(SqlFunctionCall node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Entry, -1)); - if (node.Arguments.Count>0) { - using (context.EnterCollectionScope()) { - int argumentPosition = 0; - foreach (SqlExpression item in node.Arguments) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.Translate(context, node, FunctionCallSection.ArgumentDelimiter, argumentPosition)); - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.ArgumentEntry, argumentPosition)); - item.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.ArgumentExit, argumentPosition)); - argumentPosition++; - } - } - } - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Exit, -1)); - } - } - - public virtual void Visit(SqlCustomFunctionCall node) - { - throw new NotSupportedException(string.Format(Strings.ExFunctionXIsNotSupported, node.FunctionType)); - } - - public virtual void Visit(SqlIf node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, IfSection.Entry)); - - node.Condition.AcceptVisitor(this); - - context.Output.AppendText(translator.Translate(context, node, IfSection.True)); - node.True.AcceptVisitor(this); - - if (node.False!=null) { - context.Output.AppendText(translator.Translate(context, node, IfSection.False)); - node.False.AcceptVisitor(this); - } - - context.Output.AppendText(translator.Translate(context, node, IfSection.Exit)); - } - } - - public virtual void Visit(SqlInsert node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, InsertSection.Entry)); - - if (node.Into==null) - throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); - - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { - node.Into.AcceptVisitor(this); - } - - context.Output.AppendText(translator.Translate(context, node, InsertSection.ColumnsEntry)); - if (node.Values.Keys.Count > 0) - using (context.EnterCollectionScope()) - foreach (SqlColumn item in node.Values.Keys) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - context.Output.AppendText(translator.QuoteIdentifier(item.Name)); - } - context.Output.AppendText(translator.Translate(context, node, InsertSection.ColumnsExit)); - - if (node.Values.Keys.Count == 0 && node.From == null) - context.Output.AppendText(translator.Translate(context, node, InsertSection.DefaultValues)); - else { - if (node.From != null) - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { - node.From.AcceptVisitor(this); - } - else { - context.Output.AppendText(translator.Translate(context, node, InsertSection.ValuesEntry)); - using (context.EnterCollectionScope()) - foreach (SqlExpression item in node.Values.Values) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - item.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, InsertSection.ValuesExit)); - } - } - context.Output.AppendText(translator.Translate(context, node, InsertSection.Exit)); - } - } - - public virtual void Visit(SqlJoinExpression node) - { - var leftIsJoin = node.Left is SqlJoinedTable; - if (leftIsJoin) - node.Left.AcceptVisitor(this); - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, JoinSection.Entry)); - if (!leftIsJoin) - node.Left.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, JoinSection.Specification)); - node.Right.AcceptVisitor(this); - if (!node.Expression.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, JoinSection.Condition)); - node.Expression.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, JoinSection.Exit)); - } - } - - public virtual void Visit(SqlJoinHint node) - { - // nothing - } - - public virtual void Visit(SqlLike node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, LikeSection.Entry)); - node.Expression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, LikeSection.Like)); - node.Pattern.AcceptVisitor(this); - if (!node.Escape.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, LikeSection.Escape)); - node.Escape.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, LikeSection.Exit)); - } - } - - public virtual void Visit(SqlLiteral node) - { - context.Output.AppendText(translator.Translate(context, node.GetValue())); - } - - public virtual void Visit(SqlMatch node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, MatchSection.Entry)); - node.Value.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, MatchSection.Specification)); - node.SubQuery.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, MatchSection.Exit)); - } - } - - public virtual void Visit(SqlNull node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlNextValue node) - { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - context.Output.AppendText(translator.Translate(context, node.Sequence)); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - - public virtual void Visit(SqlOpenCursor node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlOrder node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - if (!node.Expression.IsNullReference()) - node.Expression.AcceptVisitor(this); - else if (node.Position > 0) - context.Output.AppendText(node.Position.ToString()); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlParameterRef node) - { - var name = string.IsNullOrEmpty(node.Name) - ? context.ParameterNameProvider.GetName(node.Parameter) - : node.Name; - context.Output.AppendText(translator.ParameterPrefix + name); - } - - public virtual void Visit(SqlQueryRef node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, TableSection.Entry)); - node.Query.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, TableSection.Exit)); - context.Output.AppendText(translator.Translate(context, node, TableSection.AliasDeclaration)); - } - } - - public virtual void Visit(SqlQueryExpression node) - { - var leftIsQueryExpression = node.Left is SqlQueryExpression; - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); - if (!leftIsQueryExpression) - context.Output.AppendText("("); - node.Left.AcceptVisitor(this); - if (!leftIsQueryExpression) - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(node.NodeType)); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); - context.Output.AppendText("("); - node.Right.AcceptVisitor(this); - context.Output.AppendText(")"); - context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); - } - } - - public virtual void Visit(SqlRow node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - using (context.EnterCollectionScope()) { - foreach (SqlExpression item in node) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.RowItemDelimiter); - item.AcceptVisitor(this); - } - } - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlRowNumber node) - { - if (!CheckFeature(QueryFeatures.RowNumber)) - throw SqlHelper.NotSupported(QueryFeatures.RowNumber); - - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - using (context.EnterCollectionScope()) { - foreach (var item in node.OrderBy) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - item.AcceptVisitor(this); - } - } - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlRenameTable node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlRound node) - { - SqlExpression result; - switch (node.Mode) { - case MidpointRounding.ToEven: - result = node.Length.IsNullReference() - ? SqlHelper.BankersRound(node.Argument) - : SqlHelper.BankersRound(node.Argument, node.Length); - break; - case MidpointRounding.AwayFromZero: - result = node.Length.IsNullReference() - ? SqlHelper.RegularRound(node.Argument) - : SqlHelper.RegularRound(node.Argument, node.Length); - break; - default: - throw new ArgumentOutOfRangeException(); - } - if (node.Type==TypeCode.Decimal) - result = SqlDml.Cast(result, decimalType); - result.AcceptVisitor(this); - } - - public virtual void Visit(SqlSelect node) - { - VisitSelectDefault(node); - } - - public void VisitSelectDefault(SqlSelect node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); - VisitSelectHints(node); - VisitSelectColumns(node); - VisitSelectFrom(node); - VisitSelectWhere(node); - VisitSelectGroupBy(node); - VisitSelectOrderBy(node); - VisitSelectLimitOffset(node); - VisitSelectLock(node); - context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); - - } - } - - public virtual void VisitSelectHints(SqlSelect node) - { - if (node.Hints.Count==0) - return; - using (context.EnterCollectionScope()) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.HintsEntry)); - node.Hints[0].AcceptVisitor(this); - for (int i = 1; i < node.Hints.Count; i++) { - context.Output.AppendDelimiter(translator.HintDelimiter); - node.Hints[i].AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, node, SelectSection.HintsExit)); - } - } - - public virtual void VisitSelectColumns(SqlSelect node) - { - if (node.Columns.Count == 0) { - Visit(SqlDml.Asterisk); - return; - } - using (context.EnterCollectionScope()) { - foreach (SqlColumn item in node.Columns) { - if (item is SqlColumnStub) - continue; - var cr = item as SqlColumnRef; - if (!cr.IsNullReference() && cr.SqlColumn is SqlColumnStub) - continue; - - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - if (!cr.IsNullReference()) { - cr.SqlColumn.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, cr, ColumnSection.AliasDeclaration)); - } - else - item.AcceptVisitor(this); - } - } - } - - public virtual void VisitSelectFrom(SqlSelect node) - { - if (node.From==null) - return; - - context.Output.AppendText(translator.Translate(context, node, SelectSection.From)); - - var joinedFrom = node.From as SqlJoinedTable; - var linearJoinRequired = CheckFeature(QueryFeatures.StrictJoinSyntax) && joinedFrom!=null; - - if (!linearJoinRequired) { - node.From.AcceptVisitor(this); - return; - } - - var joinSequence = JoinSequence.Build(joinedFrom); - var previous = joinSequence.Pivot; - previous.AcceptVisitor(this); - - for (int i = 0; i < joinSequence.Tables.Count; i++) { - var table = joinSequence.Tables[i]; - var type = joinSequence.JoinTypes[i]; - var condition = joinSequence.Conditions[i]; - var join = new SqlJoinExpression(type, previous, table, condition); - - context.Output.AppendText(translator.Translate(context, join, JoinSection.Specification)); - table.AcceptVisitor(this); - if (!condition.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, join, JoinSection.Condition)); - condition.AcceptVisitor(this); - } - - previous = table; - } - } - - public virtual void VisitSelectWhere(SqlSelect node) - { - if (node.Where.IsNullReference()) - return; - context.Output.AppendText(translator.Translate(context, node, SelectSection.Where)); - node.Where.AcceptVisitor(this); - } - - public virtual void VisitSelectGroupBy(SqlSelect node) - { - if (node.GroupBy.Count <= 0) - return; - // group by - context.Output.AppendText(translator.Translate(context, node, SelectSection.GroupBy)); - using (context.EnterCollectionScope()) { - foreach (SqlColumn item in node.GroupBy) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - var cr = item as SqlColumnRef; - if (!cr.IsNullReference()) - cr.SqlColumn.AcceptVisitor(this); - else - item.AcceptVisitor(this); - } - } - if (node.Having.IsNullReference()) - return; - // having - context.Output.AppendText(translator.Translate(context, node, SelectSection.Having)); - node.Having.AcceptVisitor(this); - } - - public virtual void VisitSelectOrderBy(SqlSelect node) - { - if (node.OrderBy.Count <= 0) - return; - context.Output.AppendText(translator.Translate(context, node, SelectSection.OrderBy)); - using (context.EnterCollectionScope()) { - foreach (SqlOrder item in node.OrderBy) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - item.AcceptVisitor(this); - } - } - } - - public virtual void VisitSelectLimitOffset(SqlSelect node) - { - if (!node.Limit.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); - node.Limit.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, SelectSection.LimitEnd)); - } - if (!node.Offset.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); - node.Offset.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, SelectSection.OffsetEnd)); - } - } - - public virtual void VisitSelectLock(SqlSelect node) - { - if (node.Lock!=SqlLockType.Empty) - context.Output.AppendText(translator.Translate(node.Lock)); - } - - public virtual void Visit(SqlStatementBlock node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - using (context.EnterCollectionScope()) { - foreach (SqlStatement item in node) { - item.AcceptVisitor(this); - context.Output.AppendDelimiter(translator.BatchItemDelimiter, SqlDelimiterType.Column); - } - } - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlSubQuery node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Query.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlTableColumn node) - { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - } - - public virtual void Visit(SqlTableRef node) - { - context.Output.AppendText( - translator.Translate(context, node, TableSection.Entry)+ - translator.Translate(context, node, TableSection.AliasDeclaration)); - } - - public virtual void Visit(SqlTrim node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, TrimSection.Entry)); - context.Output.AppendText(translator.Translate(node.TrimType)); - if (node.TrimCharacters!=null) - context.Output.AppendText(translator.Translate(context, node.TrimCharacters)); - context.Output.AppendText(translator.Translate(context, node, TrimSection.From)); - node.Expression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, TrimSection.Exit)); - } - } - - public virtual void Visit(SqlUnary node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Operand.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlUpdate node) - { - VisitUpdateDefault(node); - } - - public void VisitUpdateDefault(SqlUpdate node) - { - using (context.EnterScope(node)) { - VisitUpdateEntry(node); - VisitUpdateUpdate(node); - VisitUpdateSet(node); - VisitUpdateFrom(node); - VisitUpdateWhere(node); - VisitUpdateLimit(node); - VisitUpdateExit(node); - } - } - - public virtual void VisitUpdateEntry(SqlUpdate node) - { - context.Output.AppendText(translator.Translate(context, node, UpdateSection.Entry)); - } - - public virtual void VisitUpdateUpdate(SqlUpdate node) - { - if (node.Update == null) - throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); - - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { - node.Update.AcceptVisitor(this); - } - } - - public virtual void VisitUpdateSet(SqlUpdate node) - { - context.Output.AppendText(translator.Translate(context, node, UpdateSection.Set)); - - using (context.EnterCollectionScope()) { - foreach (ISqlLValue item in node.Values.Keys) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - var tc = item as SqlTableColumn; - if (!tc.IsNullReference() && tc.SqlTable!=node.Update) - throw new SqlCompilerException(string.Format(Strings.ExUnboundColumn, tc.Name)); - context.Output.AppendText(translator.QuoteIdentifier(tc.Name)); - context.Output.AppendText(translator.Translate(SqlNodeType.Equals)); - SqlExpression value = node.Values[item]; - value.AcceptVisitor(this); - } - } - } - - public virtual void VisitUpdateFrom(SqlUpdate node) - { - if (Driver.ServerInfo.Query.Features.Supports(QueryFeatures.UpdateFrom) && node.From!=null) { - context.Output.AppendText(translator.Translate(context, node, UpdateSection.From)); - node.From.AcceptVisitor(this); - } - } - - public virtual void VisitUpdateWhere(SqlUpdate node) - { - if (!node.Where.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, node, UpdateSection.Where)); - node.Where.AcceptVisitor(this); - } - } - - public virtual void VisitUpdateLimit(SqlUpdate node) - { - if (!node.Limit.IsNullReference()) { - if (!Driver.ServerInfo.Query.Features.Supports(QueryFeatures.UpdateLimit)) - throw new NotSupportedException(Strings.ExStorageIsNotSupportedLimitationOfRowCountToUpdate); - context.Output.AppendText(translator.Translate(context, node, UpdateSection.Limit)); - node.Limit.AcceptVisitor(this); - } - } - - public virtual void VisitUpdateExit(SqlUpdate node) - { - context.Output.AppendText(translator.Translate(context, node, UpdateSection.Exit)); - } - - public virtual void Visit(SqlPlaceholder node) - { - context.Output.AppendPlaceholder(node.Id); - } - - public virtual void Visit(SqlUserColumn node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); - node.Expression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); - } - } - - public virtual void Visit(SqlUserFunctionCall node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Entry, -1)); - if (node.Arguments.Count>0) { - using (context.EnterCollectionScope()) { - int argumentPosition = 0; - foreach (SqlExpression item in node.Arguments) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.Translate(context, node, FunctionCallSection.ArgumentDelimiter, argumentPosition++)); - item.AcceptVisitor(this); - } - } - } - context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Exit, -1)); - } - } - - public virtual void Visit(SqlVariable node) - { - context.Output.AppendText(translator.Translate(context, node)); - } - - public virtual void Visit(SqlVariant node) - { - using (context.EnterMainVariantScope(node.Id)) - node.Main.AcceptVisitor(this); - - using (context.EnterAlternativeVariantScope(node.Id)) - node.Alternative.AcceptVisitor(this); - } - - public virtual void Visit(SqlWhile node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, WhileSection.Entry)); - node.Condition.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, WhileSection.Statement)); - node.Statement.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, WhileSection.Exit)); - } - } - - public virtual void Visit(TableColumn column) - { - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); - if (column.Expression.IsNullReference()) { - if (column.Domain==null) - ArgumentValidator.EnsureArgumentNotNull(column.DataType, "DataType"); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Type)); - } - if (column.Collation!=null) { - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Collate)); - } - if (!column.DefaultValue.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.DefaultValue)); - column.DefaultValue.AcceptVisitor(this); - } - else if (column.SequenceDescriptor!=null) { - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GeneratedEntry)); - context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.StartValue)); - context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.Increment)); - context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.MaxValue)); - context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.MinValue)); - context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GeneratedExit)); - } - else if (!column.Expression.IsNullReference()) { - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GenerationExpressionEntry)); - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { - column.Expression.AcceptVisitor(this); - } - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GenerationExpressionExit)); - } - if (!column.IsNullable) - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.NotNull)); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Exit)); - } - - private void Visit(TableConstraint constraint) - { - using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); - var checkConstraint = constraint as CheckConstraint; - if (checkConstraint!=null) - VisitCheckConstraint(checkConstraint); - var uniqueConstraint = constraint as UniqueConstraint; - if (uniqueConstraint!=null) - VisitUniqueConstraint(uniqueConstraint); - var foreignKey = constraint as ForeignKey; - if (constraint is ForeignKey) - VisitForeignKeyConstraint(foreignKey); - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); - } - } - - private void VisitForeignKeyConstraint(ForeignKey constraint) - { - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.ForeignKey)); - if (constraint.ReferencedColumns.Count==0) - throw new SqlCompilerException(Strings.ExReferencedColumnsCountCantBeLessThenOne); - if (constraint.Columns.Count==0) - throw new SqlCompilerException(Strings.ExReferencingColumnsCountCantBeLessThenOne); - using (context.EnterCollectionScope()) { - foreach (TableColumn column in constraint.Columns) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); - } - } - - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.ReferencedColumns)); - using (context.EnterCollectionScope()) { - foreach (TableColumn tc in constraint.ReferencedColumns) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - context.Output.AppendText( - translator.Translate(context, tc, TableColumnSection.Entry)); - } - } - } - - private void VisitUniqueConstraint(UniqueConstraint constraint) - { - if (constraint is PrimaryKey) - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.PrimaryKey)); - else - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Unique)); - - if (constraint.Columns.Count > 0) - using (context.EnterCollectionScope()) - foreach (TableColumn tc in constraint.Columns) { - if (!context.IsEmpty) - context.Output.AppendDelimiter(translator.ColumnDelimiter); - context.Output.AppendText(translator.Translate(context, tc, TableColumnSection.Entry)); - } - } - - private void VisitCheckConstraint(CheckConstraint constraint) - { - context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); - constraint.Condition.AcceptVisitor(this); - } - - public virtual void Visit(SqlExtract node) - { - using (context.EnterScope(node)) { - context.Output.AppendText(translator.Translate(context, node, ExtractSection.Entry)); - var part = node.DateTimePart!=SqlDateTimePart.Nothing - ? translator.Translate(node.DateTimePart) - : node.IntervalPart!=SqlIntervalPart.Nothing - ? translator.Translate(node.IntervalPart) - : translator.Translate(node.DateTimeOffsetPart); - context.Output.AppendText(part); - context.Output.AppendText(translator.Translate(context, node, ExtractSection.From)); - node.Operand.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(context, node, ExtractSection.Exit)); - } - } - - private void TranslateDynamicFilterViaInOperator(SqlDynamicFilter node) - { - int numberOfExpressions = node.Expressions.Count; - bool isMulticolumn = numberOfExpressions > 1; - string delimiter = translator.RowItemDelimiter + " "; - context.Output.AppendText(translator.OpeningParenthesis); - SqlExpression filteredExpression = isMulticolumn ? SqlDml.Row(node.Expressions) : node.Expressions[0]; - filteredExpression.AcceptVisitor(this); - context.Output.AppendText(translator.Translate(SqlNodeType.In)); - context.Output.AppendText(translator.RowBegin); - using (context.EnterCycleBodyScope(node.Id, delimiter)) { - if (isMulticolumn) { - context.Output.AppendText(translator.RowBegin); - for (int i = 0; i < numberOfExpressions; i++) { - context.Output.AppendCycleItem(i); - if (i!=numberOfExpressions - 1) - context.Output.AppendDelimiter(translator.RowItemDelimiter); - } - context.Output.AppendText(translator.RowEnd); - } - else - context.Output.AppendCycleItem(0); - } - using (context.EnterCycleEmptyCaseScope(node.Id)) { - SqlExpression nullExpression = isMulticolumn - ? SqlDml.Row(Enumerable.Repeat(SqlDml.Null, numberOfExpressions).ToArray()) - : (SqlExpression) SqlDml.Null; - nullExpression.AcceptVisitor(this); - // Append "and false" to avoid result beeing "undefined" rather than "false" - context.Output.AppendText(translator.ClosingParenthesis); - context.Output.AppendText(translator.Translate(SqlNodeType.And)); - context.Output.AppendText(translator.OpeningParenthesis); - WriteFalseExpression(); - } - context.Output.AppendText(translator.RowEnd); - context.Output.AppendText(translator.ClosingParenthesis); - } - - private void TranslateDynamicFilterViaMultipleComparisons(SqlDynamicFilter node) - { - int numberOfExpressions = node.Expressions.Count; - string delimiter = " " + translator.Translate(SqlNodeType.Or) + " "; - using (context.EnterCycleBodyScope(node.Id, delimiter)) { - context.Output.AppendText(translator.OpeningParenthesis); - for (int i = 0; i < numberOfExpressions; i++) { - node.Expressions[i].AcceptVisitor(this); - context.Output.AppendText(translator.Translate(SqlNodeType.Equals)); - context.Output.AppendCycleItem(i); - if (i!=numberOfExpressions - 1) - context.Output.AppendText(translator.Translate(SqlNodeType.And)); - } - context.Output.AppendText(translator.ClosingParenthesis); - } - using (context.EnterCycleEmptyCaseScope(node.Id)) { - WriteFalseExpression(); - } - } - - private void WriteFalseExpression() - { - SqlDml.Equals(SqlDml.Literal(1), SqlDml.Literal(0)).AcceptVisitor(this); - } - - private static IEnumerable FlattenBatch(SqlBatch batch) - { - foreach (SqlStatement statement in batch) { - var nestedBatch = statement as SqlBatch; - if (nestedBatch!=null) { - foreach (var nestedStatement in FlattenBatch(nestedBatch)) - yield return nestedStatement; - } - else { - yield return statement; - } - } - } - - protected bool CheckFeature(ColumnFeatures features) - { - return Driver.ServerInfo.Column.Features.Supports(features); - } - - protected bool CheckFeature(IndexFeatures features) - { - return Driver.ServerInfo.Index.Features.Supports(features); - } - - protected bool CheckFeature(QueryFeatures features) - { - return Driver.ServerInfo.Query.Features.Supports(features); - } - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The driver. - protected SqlCompiler(SqlDriver driver) - : base(driver) - { - translator = driver.Translator; - decimalType = driver.TypeMappings[typeof (Decimal)].MapType(); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Compiler +{ + /// + /// Base class for any SQL compiler. + /// + public class SqlCompiler : SqlDriverBound, + ISqlVisitor + { + protected readonly SqlValueType decimalType; + protected readonly SqlTranslator translator; + + protected SqlCompilerConfiguration configuration; + protected SqlCompilerContext context; + + public SqlCompilationResult Compile(ISqlCompileUnit unit, SqlCompilerConfiguration compilerConfiguration) + { + ArgumentValidator.EnsureArgumentNotNull(unit, "unit"); + configuration = compilerConfiguration; + context = new SqlCompilerContext(configuration); + unit.AcceptVisitor(this); + return new SqlCompilationResult( + Compressor.Process(translator, context.Output), + context.ParameterNameProvider.NameTable); + } + + public virtual void Visit(SqlAggregate node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Expression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlAlterDomain node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.Entry)); + if (node.Action is SqlAddConstraint) { + var constraint = (DomainConstraint) ((SqlAddConstraint)node.Action).Constraint; + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.AddConstraint)); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); + constraint.Condition.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); + } + else if (node.Action is SqlDropConstraint) { + var action = node.Action as SqlDropConstraint; + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.DropConstraint)); + context.Output.AppendText(translator.Translate(context, action.Constraint, ConstraintSection.Entry)); + } + else if (node.Action is SqlSetDefault) { + var action = node.Action as SqlSetDefault; + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.SetDefault)); + action.DefaultValue.AcceptVisitor(this); + } + else if (node.Action is SqlDropDefault) + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.DropDefault)); + context.Output.AppendText(translator.Translate(context, node, AlterDomainSection.Exit)); + } + } + + public virtual void Visit(SqlAlterPartitionFunction node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlAlterPartitionScheme node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlFragment node) + { + using (context.EnterScope(node)) + using (context.EnterScope(0)) { + node.Expression.AcceptVisitor(this); + } + } + + public virtual void Visit(SqlAlterTable node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Entry)); + if (node.Action is SqlAddColumn) { + var column = ((SqlAddColumn) node.Action).Column; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AddColumn)); + Visit(column); + } + else if (node.Action is SqlDropDefault) { + var column = ((SqlDropDefault) node.Action).Column; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.DropDefault)); + } + else if (node.Action is SqlSetDefault) { + var action = node.Action as SqlSetDefault; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetDefault)); + action.DefaultValue.AcceptVisitor(this); + } + else if (node.Action is SqlDropColumn) { + var action = node.Action as SqlDropColumn; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropColumn)); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); + } + else if (node.Action is SqlAlterIdentityInfo) { + var action = node.Action as SqlAlterIdentityInfo; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AlterColumn)); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); + if ((action.InfoOption & SqlAlterIdentityInfoOptions.RestartWithOption)!=0) + context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.RestartValue)); + if ((action.InfoOption & SqlAlterIdentityInfoOptions.IncrementByOption)!=0) { + if (action.SequenceDescriptor.Increment.HasValue && action.SequenceDescriptor.Increment.Value==0) + throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); + context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.Increment)); + } + if ((action.InfoOption & SqlAlterIdentityInfoOptions.MaxValueOption)!=0) { + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); + context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.AlterMaxValue)); + } + if ((action.InfoOption & SqlAlterIdentityInfoOptions.MinValueOption)!=0) { + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); + context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.AlterMinValue)); + } + if ((action.InfoOption & SqlAlterIdentityInfoOptions.CycleOption)!=0) { + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.SetIdentityInfoElement)); + context.Output.AppendText(translator.Translate(context, action.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); + } + } + else if (node.Action is SqlAddConstraint) { + var constraint = ((SqlAddConstraint) node.Action).Constraint as TableConstraint; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.AddConstraint)); + Visit(constraint); + } + else if (node.Action is SqlDropConstraint) { + var action = node.Action as SqlDropConstraint; + var constraint = action.Constraint as TableConstraint; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropConstraint)); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.DropBehavior)); + } + else if (node.Action is SqlRenameColumn) { + var action = node.Action as SqlRenameColumn; + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.RenameColumn)); + context.Output.AppendText(translator.Translate(context, action.Column, TableColumnSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.To)); + context.Output.AppendText(translator.QuoteIdentifier(action.NewName)); + } + context.Output.AppendText(translator.Translate(context, node, AlterTableSection.Exit)); + } + } + + public virtual void Visit(SqlAlterSequence node) + { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + if ((node.InfoOption & SqlAlterIdentityInfoOptions.RestartWithOption)!=0) + context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.RestartValue)); + if ((node.InfoOption & SqlAlterIdentityInfoOptions.IncrementByOption)!=0) { + if (node.SequenceDescriptor.Increment.HasValue && node.SequenceDescriptor.Increment.Value==0) + throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); + context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.Increment)); + } + if ((node.InfoOption & SqlAlterIdentityInfoOptions.MaxValueOption)!=0) + context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.AlterMaxValue)); + if ((node.InfoOption & SqlAlterIdentityInfoOptions.MinValueOption)!=0) + context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.AlterMinValue)); + if ((node.InfoOption & SqlAlterIdentityInfoOptions.CycleOption)!=0) + context.Output.AppendText(translator.Translate(context, node.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + + public virtual void Visit(SqlArray node) + { + var items = node.GetValues(); + if (items.Length==0) { + context.Output.AppendText(translator.Translate(context, node, ArraySection.EmptyArray)); + return; + } + context.Output.AppendText(translator.Translate(context, node, ArraySection.Entry)); + for (int i = 0; i < items.Length-1; i++) { + context.Output.AppendText(translator.Translate(context, items[i])); + context.Output.AppendDelimiter(translator.RowItemDelimiter); + } + context.Output.AppendText(translator.Translate(context, items[items.Length-1])); + context.Output.AppendText(translator.Translate(context, node, ArraySection.Exit)); + } + + public virtual void Visit(SqlAssignment node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Left.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(node.NodeType)); + node.Right.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlBatch node) + { + using (context.EnterScope(node)) { + var statements = FlattenBatch(node).ToArray(); + if (statements.Length==0) + return; + if (statements.Length==1) { + statements[0].AcceptVisitor(this); + return; + } + context.Output.AppendText(translator.BatchBegin); + using (context.EnterCollectionScope()) { + foreach (var item in statements) { + item.AcceptVisitor(this); + context.Output.AppendDelimiter(translator.BatchItemDelimiter, SqlDelimiterType.Column); + } + } + context.Output.AppendText(translator.BatchEnd); + } + } + + public virtual void Visit(SqlBetween node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, BetweenSection.Entry)); + node.Expression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, BetweenSection.Between)); + node.Left.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, BetweenSection.And)); + node.Right.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, BetweenSection.Exit)); + } + } + + public virtual void Visit(SqlBinary node) + { + if (node.NodeType==SqlNodeType.In || node.NodeType==SqlNodeType.NotIn) { + var row = node.Right as SqlRow; + var array = node.Right as SqlArray; + bool isEmptyIn = !row.IsNullReference() && row.Count==0 || !array.IsNullReference() && array.Length==0; + if (isEmptyIn) { + SqlDml.Literal(node.NodeType==SqlNodeType.NotIn).AcceptVisitor(this); + return; + } + } + + if (node.NodeType==SqlNodeType.Or || node.NodeType==SqlNodeType.And) { + var expressions = RecursiveBinaryLogicExtractor.Extract(node); + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + expressions[0].AcceptVisitor(this); + foreach (var operand in expressions.Skip(1)) { + context.Output.AppendText(translator.Translate(node.NodeType)); + operand.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + return; + } + + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Left.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(node.NodeType)); + node.Right.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlBreak node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCase node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, CaseSection.Entry)); + + if (!node.Value.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, CaseSection.Value)); + node.Value.AcceptVisitor(this); + } + + using (context.EnterCollectionScope()) { + foreach (KeyValuePair item in node) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.WhenDelimiter); + context.Output.AppendText(translator.Translate(context, node, item.Key, CaseSection.When)); + item.Key.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, item.Value, CaseSection.Then)); + item.Value.AcceptVisitor(this); + } + } + + if (!node.Else.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, CaseSection.Else)); + node.Else.AcceptVisitor(this); + } + + context.Output.AppendText(translator.Translate(context, node, CaseSection.Exit)); + } + } + + public virtual void Visit(SqlCast node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Operand.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlCloseCursor node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCollate node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Operand.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlColumnRef node) + { + context.Output.AppendText(translator.Translate(context, node, ColumnSection.Entry)); + } + + public virtual void Visit(SqlContainsTable node) + { + throw SqlHelper.NotSupported(Strings.FullTextQueries); + } + + public virtual void Visit(SqlNative node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlNativeHint node) + { + // nothing + } + + public virtual void Visit(SqlConcat node) + { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + bool first = true; + foreach (var item in node) { + if (!first) { + context.Output.AppendText(translator.Translate(node.NodeType)); + } + item.AcceptVisitor(this); + first = false; + } + + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + + public virtual void Visit(SqlContainer node) + { + throw new SqlCompilerException(Strings.ExSqlContainerExpressionCanNotBeCompiled); + } + + public virtual void Visit(SqlContinue node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCommand node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreateAssertion node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Assertion.Condition.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlCreateCharacterSet node) + { +// ArgumentValidator.EnsureArgumentNotNull(node.CharacterSet.CharacterSetSource, "CharacterSetSource"); +// context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreateCollation node) + { +// ArgumentValidator.EnsureArgumentNotNull(node.Collation.CharacterSet, "CharacterSet"); +// context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreateDomain node) + { + ArgumentValidator.EnsureArgumentNotNull(node.Domain.DataType, "DataType"); + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.Entry)); + if (!node.Domain.DefaultValue.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.DomainDefaultValue)); + node.Domain.DefaultValue.AcceptVisitor(this); + } + if (node.Domain.DomainConstraints.Count!=0) { + using (context.EnterCollectionScope()) + foreach (DomainConstraint constraint in node.Domain.DomainConstraints) { + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); + constraint.Condition.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); + } + } + if (node.Domain.Collation!=null) + context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.DomainCollate)); + context.Output.AppendText(translator.Translate(context, node, CreateDomainSection.Exit)); + } + } + + public virtual void Visit(SqlCreateIndex node) + { + ArgumentValidator.EnsureArgumentNotNull(node.Index.DataTable, "DataTable"); + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Entry)); + if (node.Index.Columns.Count > 0) { + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.ColumnsEnter)); + using (context.EnterCollectionScope()) { + foreach (var item in node.Index.Columns) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + Visit(node, item); + } + } + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.ColumnsExit)); + } + if (node.Index.NonkeyColumns != null && node.Index.NonkeyColumns.Count != 0 && CheckFeature(IndexFeatures.NonKeyColumns)) { + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.NonkeyColumnsEnter)); + using (context.EnterCollectionScope()) { + foreach (var item in node.Index.NonkeyColumns) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + context.Output.AppendText(translator.QuoteIdentifier(item.Name)); + } + } + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.NonkeyColumnsExit)); + } + + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.StorageOptions)); + + if (!node.Index.Where.IsNullReference() && CheckFeature(IndexFeatures.Filtered)) { + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Where)); + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { + node.Index.Where.AcceptVisitor(this); + } + } + context.Output.AppendText(translator.Translate(context, node, CreateIndexSection.Exit)); + } + + public virtual void Visit(SqlCreateIndex node, IndexColumn item) + { + if (!item.Expression.IsNullReference() && CheckFeature(IndexFeatures.Expressions)) { + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) + item.Expression.AcceptVisitor(this); + } + else { + context.Output.AppendText(translator.QuoteIdentifier(item.Column.Name)); + if (!(node.Index.IsFullText || node.Index.IsSpatial) && CheckFeature(IndexFeatures.SortOrder)) + context.Output.AppendText(translator.TranslateSortOrder(item.Ascending)); + } + } + + public virtual void Visit(SqlCreatePartitionFunction node) + { + ArgumentValidator.EnsureArgumentNotNull(node.PartitionFunction.DataType, "DataType"); + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreatePartitionScheme node) + { + ArgumentValidator.EnsureArgumentNotNull(node.PartitionSchema.PartitionFunction, "PartitionFunction"); + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreateSchema node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + if (node.Schema.Assertions.Count>0) + using (context.EnterCollectionScope()) + foreach (Assertion assertion in node.Schema.Assertions) { + new SqlCreateAssertion(assertion).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + if (node.Schema.CharacterSets.Count>0) + using (context.EnterCollectionScope()) + foreach (CharacterSet characterSet in node.Schema.CharacterSets) { + new SqlCreateCharacterSet(characterSet).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + if (node.Schema.Collations.Count>0) + using (context.EnterCollectionScope()) + foreach (Collation collation in node.Schema.Collations) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + new SqlCreateCollation(collation).AcceptVisitor(this); + } + + if (node.Schema.Domains.Count>0) + using (context.EnterCollectionScope()) + foreach (Domain domain in node.Schema.Domains) { + new SqlCreateDomain(domain).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + if (node.Schema.Sequences.Count>0) + using (context.EnterCollectionScope()) + foreach (Sequence sequence in node.Schema.Sequences) { + new SqlCreateSequence(sequence).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + if (node.Schema.Tables.Count>0) + using (context.EnterCollectionScope()) + foreach (Table table in node.Schema.Tables) { + new SqlCreateTable(table).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + if (table.Indexes.Count>0) + using (context.EnterCollectionScope()) + foreach (Index index in table.Indexes) { + new SqlCreateIndex(index).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + } + + if (node.Schema.Translations.Count>0) + using (context.EnterCollectionScope()) + foreach (Translation translation in node.Schema.Translations) { + new SqlCreateTranslation(translation).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + if (node.Schema.Views.Count>0) + using (context.EnterCollectionScope()) + foreach (View view in node.Schema.Views) { + new SqlCreateView(view).AcceptVisitor(this); + context.Output.AppendDelimiter(translator.DdlStatementDelimiter, SqlDelimiterType.Column); + } + + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlCreateSequence node) + { + ArgumentValidator.EnsureArgumentNotNull(node.Sequence.SequenceDescriptor, "SequenceDescriptor"); + using (context.EnterScope(node)) { + if (node.Sequence.SequenceDescriptor.Increment.HasValue && node.Sequence.SequenceDescriptor.Increment.Value==0) + throw new SqlCompilerException(Strings.ExIncrementMustNotBeZero); + if (string.IsNullOrEmpty(node.Sequence.Name)) + throw new SqlCompilerException(Strings.ExNameMustBeNotNullOrEmpty); + if (node.Sequence.Schema==null) + throw new SqlCompilerException(Strings.ExSchemaMustBeNotNull); + if (node.Sequence.SequenceDescriptor.MaxValue.HasValue && + node.Sequence.SequenceDescriptor.MinValue.HasValue && + node.Sequence.SequenceDescriptor.MaxValue.Value<=node.Sequence.SequenceDescriptor.MinValue.Value) + throw new SqlCompilerException(Strings.ExTheMaximumValueMustBeGreaterThanTheMinimumValue); + if (node.Sequence.SequenceDescriptor.StartValue.HasValue && + (node.Sequence.SequenceDescriptor.MaxValue.HasValue && + node.Sequence.SequenceDescriptor.MaxValue.Valuenode.Sequence.SequenceDescriptor.StartValue.Value)) + throw new SqlCompilerException(Strings.ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.StartValue)); + context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.Increment)); + context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.MaxValue)); + context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.MinValue)); + context.Output.AppendText(translator.Translate(context, node.Sequence.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlCreateTable node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, CreateTableSection.TableElementsEntry)); + + // ReSharper disable ConditionIsAlwaysTrueOrFalse + // ReSharper disable RedundantAssignment + + bool hasItems = false; + + if (node.Table.Columns.Count > 0) + hasItems = VisitCreateTableColumns(node, node.Table.TableColumns, hasItems); + if (node.Table.TableConstraints.Count > 0) + hasItems = VisitCreateTableConstraints(node, node.Table.TableConstraints, hasItems); + + // ReSharper restore ConditionIsAlwaysTrueOrFalse + // ReSharper restore RedundantAssignment + + context.Output.AppendText(translator.Translate(context, node, CreateTableSection.TableElementsExit)); + if (node.Table.PartitionDescriptor!=null) { + context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); + context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Partition)); + } + context.Output.AppendText(translator.Translate(context, node, CreateTableSection.Exit)); + } + } + + protected virtual bool VisitCreateTableConstraints(SqlCreateTable node, IEnumerable constraints, bool hasItems) + { + using (context.EnterCollectionScope()) { + foreach (TableConstraint constraint in constraints) { + if (hasItems) + context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); + else + hasItems = true; + Visit(constraint); + } + } + return hasItems; + } + + protected virtual bool VisitCreateTableColumns(SqlCreateTable node, IEnumerable columns, bool hasItems) + { + using (context.EnterCollectionScope()) { + foreach (var column in columns) { + // Skipping computed columns + if (!column.Expression.IsNullReference() && !CheckFeature(ColumnFeatures.Computed)) + continue; + if (hasItems) + context.Output.AppendDelimiter(translator.ColumnDelimiter, SqlDelimiterType.Column); + else + hasItems = true; + Visit(column); + } + } + + return hasItems; + } + + public virtual void Visit(SqlCreateTranslation node) + { +// ArgumentValidator.EnsureArgumentNotNull(node.Translation.SourceCharacterSet, "SourceCharacterSet"); +// ArgumentValidator.EnsureArgumentNotNull(node.Translation.TargetCharacterSet, "TargetCharacterSet"); +// ArgumentValidator.EnsureArgumentNotNull(node.Translation.TranslationSource, "TranslationSource"); +// context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlCreateView node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + if (!node.View.Definition.IsNullReference()) + node.View.Definition.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlCursor node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDeclareCursor node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Entry)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Sensivity)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Scrollability)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Cursor)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Holdability)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Returnability)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.For)); + + node.Cursor.Query.AcceptVisitor(this); + if (node.Cursor.Columns.Count!=0) { + foreach (SqlColumnRef item in node.Cursor.Columns) { + item.AcceptVisitor(this); + } + } + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Updatability)); + context.Output.AppendText(translator.Translate(context, node, DeclareCursorSection.Exit)); + } + } + + public virtual void Visit(SqlDeclareVariable node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDefaultValue node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDelete node) + { + VisitDeleteDefault(node); + } + + public void VisitDeleteDefault(SqlDelete node) + { + using (context.EnterScope(node)) { + VisitDeleteEntry(node); + VisitDeleteDelete(node); + VisitDeleteFrom(node); + VisitDeleteWhere(node); + VisitDeleteLimit(node); + VisitDeleteExit(node); + } + } + + public virtual void VisitDeleteEntry(SqlDelete node) + { + context.Output.AppendText(translator.Translate(context, node, DeleteSection.Entry)); + } + + public virtual void VisitDeleteDelete(SqlDelete node) + { + if (node.Delete == null) + throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); + + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { + node.Delete.AcceptVisitor(this); + } + } + + public virtual void VisitDeleteFrom(SqlDelete node) + { + if (CheckFeature(QueryFeatures.DeleteFrom) && node.From!=null) { + context.Output.AppendText(translator.Translate(context, node, DeleteSection.From)); + node.From.AcceptVisitor(this); + } + } + + public virtual void VisitDeleteWhere(SqlDelete node) + { + if (!node.Where.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, DeleteSection.Where)); + node.Where.AcceptVisitor(this); + } + } + + public virtual void VisitDeleteLimit(SqlDelete node) + { + if (!node.Limit.IsNullReference()) { + if (!CheckFeature(QueryFeatures.DeleteLimit)) + throw new NotSupportedException(Strings.ExStorageIsNotSupportedLimitationOfRowCountToDelete); + context.Output.AppendText(translator.Translate(context, node, DeleteSection.Limit)); + node.Limit.AcceptVisitor(this); + } + } + + public virtual void VisitDeleteExit(SqlDelete node) + { + context.Output.AppendText(translator.Translate(context, node, DeleteSection.Exit)); + } + + public virtual void Visit(SqlDropAssertion node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropCharacterSet node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropCollation node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropDomain node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropIndex node) + { + ArgumentValidator.EnsureArgumentNotNull(node.Index.DataTable, "DataTable"); + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropPartitionFunction node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropPartitionScheme node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropSchema node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropSequence node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropTable node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropTranslation node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlDropView node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlFastFirstRowsHint node) + { + // nothing + } + + public virtual void Visit(SqlDynamicFilter node) + { + switch (node.Expressions.Count) { + case 0: + SqlDml.Literal(true).AcceptVisitor(this); + break; + case 1: + TranslateDynamicFilterViaInOperator(node); + break; + default: + if (CheckFeature(QueryFeatures.MulticolumnIn)) + TranslateDynamicFilterViaInOperator(node); + else + TranslateDynamicFilterViaMultipleComparisons(node); + break; + } + } + + public virtual void Visit(SqlFetch node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, FetchSection.Entry)); + if (!node.RowCount.IsNullReference()) + node.RowCount.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, FetchSection.Targets)); + foreach (ISqlCursorFetchTarget item in node.Targets) { + item.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, FetchSection.Exit)); + } + } + + public virtual void Visit(SqlForceJoinOrderHint node) + { + // nothing + } + + public virtual void Visit(SqlFreeTextTable node) + { + throw SqlHelper.NotSupported(Strings.FullTextQueries); + } + + public virtual void Visit(SqlFunctionCall node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Entry, -1)); + if (node.Arguments.Count>0) { + using (context.EnterCollectionScope()) { + int argumentPosition = 0; + foreach (SqlExpression item in node.Arguments) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.Translate(context, node, FunctionCallSection.ArgumentDelimiter, argumentPosition)); + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.ArgumentEntry, argumentPosition)); + item.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.ArgumentExit, argumentPosition)); + argumentPosition++; + } + } + } + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Exit, -1)); + } + } + + public virtual void Visit(SqlCustomFunctionCall node) + { + throw new NotSupportedException(string.Format(Strings.ExFunctionXIsNotSupported, node.FunctionType)); + } + + public virtual void Visit(SqlIf node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, IfSection.Entry)); + + node.Condition.AcceptVisitor(this); + + context.Output.AppendText(translator.Translate(context, node, IfSection.True)); + node.True.AcceptVisitor(this); + + if (node.False!=null) { + context.Output.AppendText(translator.Translate(context, node, IfSection.False)); + node.False.AcceptVisitor(this); + } + + context.Output.AppendText(translator.Translate(context, node, IfSection.Exit)); + } + } + + public virtual void Visit(SqlInsert node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, InsertSection.Entry)); + + if (node.Into==null) + throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); + + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { + node.Into.AcceptVisitor(this); + } + + context.Output.AppendText(translator.Translate(context, node, InsertSection.ColumnsEntry)); + if (node.Values.Keys.Count > 0) + using (context.EnterCollectionScope()) + foreach (SqlColumn item in node.Values.Keys) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + context.Output.AppendText(translator.QuoteIdentifier(item.Name)); + } + context.Output.AppendText(translator.Translate(context, node, InsertSection.ColumnsExit)); + + if (node.Values.Keys.Count == 0 && node.From == null) + context.Output.AppendText(translator.Translate(context, node, InsertSection.DefaultValues)); + else { + if (node.From != null) + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { + node.From.AcceptVisitor(this); + } + else { + context.Output.AppendText(translator.Translate(context, node, InsertSection.ValuesEntry)); + using (context.EnterCollectionScope()) + foreach (SqlExpression item in node.Values.Values) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + item.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, InsertSection.ValuesExit)); + } + } + context.Output.AppendText(translator.Translate(context, node, InsertSection.Exit)); + } + } + + public virtual void Visit(SqlJoinExpression node) + { + var leftIsJoin = node.Left is SqlJoinedTable; + if (leftIsJoin) + node.Left.AcceptVisitor(this); + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, JoinSection.Entry)); + if (!leftIsJoin) + node.Left.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, JoinSection.Specification)); + node.Right.AcceptVisitor(this); + if (!node.Expression.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, JoinSection.Condition)); + node.Expression.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, JoinSection.Exit)); + } + } + + public virtual void Visit(SqlJoinHint node) + { + // nothing + } + + public virtual void Visit(SqlLike node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, LikeSection.Entry)); + node.Expression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, LikeSection.Like)); + node.Pattern.AcceptVisitor(this); + if (!node.Escape.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, LikeSection.Escape)); + node.Escape.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, LikeSection.Exit)); + } + } + + public virtual void Visit(SqlLiteral node) + { + context.Output.AppendText(translator.Translate(context, node.GetValue())); + } + + public virtual void Visit(SqlMatch node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, MatchSection.Entry)); + node.Value.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, MatchSection.Specification)); + node.SubQuery.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, MatchSection.Exit)); + } + } + + public virtual void Visit(SqlNull node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlNextValue node) + { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + context.Output.AppendText(translator.Translate(context, node.Sequence)); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + + public virtual void Visit(SqlOpenCursor node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlOrder node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + if (!node.Expression.IsNullReference()) + node.Expression.AcceptVisitor(this); + else if (node.Position > 0) + context.Output.AppendText(node.Position.ToString()); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlParameterRef node) + { + var name = string.IsNullOrEmpty(node.Name) + ? context.ParameterNameProvider.GetName(node.Parameter) + : node.Name; + context.Output.AppendText(translator.ParameterPrefix + name); + } + + public virtual void Visit(SqlQueryRef node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, TableSection.Entry)); + node.Query.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, TableSection.Exit)); + context.Output.AppendText(translator.Translate(context, node, TableSection.AliasDeclaration)); + } + } + + public virtual void Visit(SqlQueryExpression node) + { + var leftIsQueryExpression = node.Left is SqlQueryExpression; + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry)); + if (!leftIsQueryExpression) + context.Output.AppendText("("); + node.Left.AcceptVisitor(this); + if (!leftIsQueryExpression) + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(node.NodeType)); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.All)); + context.Output.AppendText("("); + node.Right.AcceptVisitor(this); + context.Output.AppendText(")"); + context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Exit)); + } + } + + public virtual void Visit(SqlRow node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + using (context.EnterCollectionScope()) { + foreach (SqlExpression item in node) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.RowItemDelimiter); + item.AcceptVisitor(this); + } + } + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlRowNumber node) + { + if (!CheckFeature(QueryFeatures.RowNumber)) + throw SqlHelper.NotSupported(QueryFeatures.RowNumber); + + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + using (context.EnterCollectionScope()) { + foreach (var item in node.OrderBy) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + item.AcceptVisitor(this); + } + } + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlRenameTable node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlRound node) + { + SqlExpression result; + switch (node.Mode) { + case MidpointRounding.ToEven: + result = node.Length.IsNullReference() + ? SqlHelper.BankersRound(node.Argument) + : SqlHelper.BankersRound(node.Argument, node.Length); + break; + case MidpointRounding.AwayFromZero: + result = node.Length.IsNullReference() + ? SqlHelper.RegularRound(node.Argument) + : SqlHelper.RegularRound(node.Argument, node.Length); + break; + default: + throw new ArgumentOutOfRangeException(); + } + if (node.Type==TypeCode.Decimal) + result = SqlDml.Cast(result, decimalType); + result.AcceptVisitor(this); + } + + public virtual void Visit(SqlSelect node) + { + VisitSelectDefault(node); + } + + public void VisitSelectDefault(SqlSelect node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Entry)); + VisitSelectHints(node); + VisitSelectColumns(node); + VisitSelectFrom(node); + VisitSelectWhere(node); + VisitSelectGroupBy(node); + VisitSelectOrderBy(node); + VisitSelectLimitOffset(node); + VisitSelectLock(node); + context.Output.AppendText(translator.Translate(context, node, SelectSection.Exit)); + + } + } + + public virtual void VisitSelectHints(SqlSelect node) + { + if (node.Hints.Count==0) + return; + using (context.EnterCollectionScope()) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.HintsEntry)); + node.Hints[0].AcceptVisitor(this); + for (int i = 1; i < node.Hints.Count; i++) { + context.Output.AppendDelimiter(translator.HintDelimiter); + node.Hints[i].AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, node, SelectSection.HintsExit)); + } + } + + public virtual void VisitSelectColumns(SqlSelect node) + { + if (node.Columns.Count == 0) { + Visit(SqlDml.Asterisk); + return; + } + using (context.EnterCollectionScope()) { + foreach (SqlColumn item in node.Columns) { + if (item is SqlColumnStub) + continue; + var cr = item as SqlColumnRef; + if (!cr.IsNullReference() && cr.SqlColumn is SqlColumnStub) + continue; + + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + if (!cr.IsNullReference()) { + cr.SqlColumn.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, cr, ColumnSection.AliasDeclaration)); + } + else + item.AcceptVisitor(this); + } + } + } + + public virtual void VisitSelectFrom(SqlSelect node) + { + if (node.From==null) + return; + + context.Output.AppendText(translator.Translate(context, node, SelectSection.From)); + + var joinedFrom = node.From as SqlJoinedTable; + var linearJoinRequired = CheckFeature(QueryFeatures.StrictJoinSyntax) && joinedFrom!=null; + + if (!linearJoinRequired) { + node.From.AcceptVisitor(this); + return; + } + + var joinSequence = JoinSequence.Build(joinedFrom); + var previous = joinSequence.Pivot; + previous.AcceptVisitor(this); + + for (int i = 0; i < joinSequence.Tables.Count; i++) { + var table = joinSequence.Tables[i]; + var type = joinSequence.JoinTypes[i]; + var condition = joinSequence.Conditions[i]; + var join = new SqlJoinExpression(type, previous, table, condition); + + context.Output.AppendText(translator.Translate(context, join, JoinSection.Specification)); + table.AcceptVisitor(this); + if (!condition.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, join, JoinSection.Condition)); + condition.AcceptVisitor(this); + } + + previous = table; + } + } + + public virtual void VisitSelectWhere(SqlSelect node) + { + if (node.Where.IsNullReference()) + return; + context.Output.AppendText(translator.Translate(context, node, SelectSection.Where)); + node.Where.AcceptVisitor(this); + } + + public virtual void VisitSelectGroupBy(SqlSelect node) + { + if (node.GroupBy.Count <= 0) + return; + // group by + context.Output.AppendText(translator.Translate(context, node, SelectSection.GroupBy)); + using (context.EnterCollectionScope()) { + foreach (SqlColumn item in node.GroupBy) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + var cr = item as SqlColumnRef; + if (!cr.IsNullReference()) + cr.SqlColumn.AcceptVisitor(this); + else + item.AcceptVisitor(this); + } + } + if (node.Having.IsNullReference()) + return; + // having + context.Output.AppendText(translator.Translate(context, node, SelectSection.Having)); + node.Having.AcceptVisitor(this); + } + + public virtual void VisitSelectOrderBy(SqlSelect node) + { + if (node.OrderBy.Count <= 0) + return; + context.Output.AppendText(translator.Translate(context, node, SelectSection.OrderBy)); + using (context.EnterCollectionScope()) { + foreach (SqlOrder item in node.OrderBy) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + item.AcceptVisitor(this); + } + } + } + + public virtual void VisitSelectLimitOffset(SqlSelect node) + { + if (!node.Limit.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Limit)); + node.Limit.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, SelectSection.LimitEnd)); + } + if (!node.Offset.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, SelectSection.Offset)); + node.Offset.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, SelectSection.OffsetEnd)); + } + } + + public virtual void VisitSelectLock(SqlSelect node) + { + if (node.Lock!=SqlLockType.Empty) + context.Output.AppendText(translator.Translate(node.Lock)); + } + + public virtual void Visit(SqlStatementBlock node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + using (context.EnterCollectionScope()) { + foreach (SqlStatement item in node) { + item.AcceptVisitor(this); + context.Output.AppendDelimiter(translator.BatchItemDelimiter, SqlDelimiterType.Column); + } + } + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlSubQuery node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Query.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlTableColumn node) + { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + } + + public virtual void Visit(SqlTableRef node) + { + context.Output.AppendText( + translator.Translate(context, node, TableSection.Entry)+ + translator.Translate(context, node, TableSection.AliasDeclaration)); + } + + public virtual void Visit(SqlTrim node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, TrimSection.Entry)); + context.Output.AppendText(translator.Translate(node.TrimType)); + if (node.TrimCharacters!=null) + context.Output.AppendText(translator.Translate(context, node.TrimCharacters)); + context.Output.AppendText(translator.Translate(context, node, TrimSection.From)); + node.Expression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, TrimSection.Exit)); + } + } + + public virtual void Visit(SqlUnary node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Operand.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlUpdate node) + { + VisitUpdateDefault(node); + } + + public void VisitUpdateDefault(SqlUpdate node) + { + using (context.EnterScope(node)) { + VisitUpdateEntry(node); + VisitUpdateUpdate(node); + VisitUpdateSet(node); + VisitUpdateFrom(node); + VisitUpdateWhere(node); + VisitUpdateLimit(node); + VisitUpdateExit(node); + } + } + + public virtual void VisitUpdateEntry(SqlUpdate node) + { + context.Output.AppendText(translator.Translate(context, node, UpdateSection.Entry)); + } + + public virtual void VisitUpdateUpdate(SqlUpdate node) + { + if (node.Update == null) + throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); + + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableAliasing)) { + node.Update.AcceptVisitor(this); + } + } + + public virtual void VisitUpdateSet(SqlUpdate node) + { + context.Output.AppendText(translator.Translate(context, node, UpdateSection.Set)); + + using (context.EnterCollectionScope()) { + foreach (ISqlLValue item in node.Values.Keys) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + var tc = item as SqlTableColumn; + if (!tc.IsNullReference() && tc.SqlTable!=node.Update) + throw new SqlCompilerException(string.Format(Strings.ExUnboundColumn, tc.Name)); + context.Output.AppendText(translator.QuoteIdentifier(tc.Name)); + context.Output.AppendText(translator.Translate(SqlNodeType.Equals)); + SqlExpression value = node.Values[item]; + value.AcceptVisitor(this); + } + } + } + + public virtual void VisitUpdateFrom(SqlUpdate node) + { + if (Driver.ServerInfo.Query.Features.Supports(QueryFeatures.UpdateFrom) && node.From!=null) { + context.Output.AppendText(translator.Translate(context, node, UpdateSection.From)); + node.From.AcceptVisitor(this); + } + } + + public virtual void VisitUpdateWhere(SqlUpdate node) + { + if (!node.Where.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, node, UpdateSection.Where)); + node.Where.AcceptVisitor(this); + } + } + + public virtual void VisitUpdateLimit(SqlUpdate node) + { + if (!node.Limit.IsNullReference()) { + if (!Driver.ServerInfo.Query.Features.Supports(QueryFeatures.UpdateLimit)) + throw new NotSupportedException(Strings.ExStorageIsNotSupportedLimitationOfRowCountToUpdate); + context.Output.AppendText(translator.Translate(context, node, UpdateSection.Limit)); + node.Limit.AcceptVisitor(this); + } + } + + public virtual void VisitUpdateExit(SqlUpdate node) + { + context.Output.AppendText(translator.Translate(context, node, UpdateSection.Exit)); + } + + public virtual void Visit(SqlPlaceholder node) + { + context.Output.AppendPlaceholder(node.Id); + } + + public virtual void Visit(SqlUserColumn node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, NodeSection.Entry)); + node.Expression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, NodeSection.Exit)); + } + } + + public virtual void Visit(SqlUserFunctionCall node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Entry, -1)); + if (node.Arguments.Count>0) { + using (context.EnterCollectionScope()) { + int argumentPosition = 0; + foreach (SqlExpression item in node.Arguments) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.Translate(context, node, FunctionCallSection.ArgumentDelimiter, argumentPosition++)); + item.AcceptVisitor(this); + } + } + } + context.Output.AppendText(translator.Translate(context, node, FunctionCallSection.Exit, -1)); + } + } + + public virtual void Visit(SqlVariable node) + { + context.Output.AppendText(translator.Translate(context, node)); + } + + public virtual void Visit(SqlVariant node) + { + using (context.EnterMainVariantScope(node.Id)) + node.Main.AcceptVisitor(this); + + using (context.EnterAlternativeVariantScope(node.Id)) + node.Alternative.AcceptVisitor(this); + } + + public virtual void Visit(SqlWhile node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, WhileSection.Entry)); + node.Condition.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, WhileSection.Statement)); + node.Statement.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, WhileSection.Exit)); + } + } + + public virtual void Visit(TableColumn column) + { + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); + if (column.Expression.IsNullReference()) { + if (column.Domain==null) + ArgumentValidator.EnsureArgumentNotNull(column.DataType, "DataType"); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Type)); + } + if (column.Collation!=null) { + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Collate)); + } + if (!column.DefaultValue.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.DefaultValue)); + column.DefaultValue.AcceptVisitor(this); + } + else if (column.SequenceDescriptor!=null) { + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GeneratedEntry)); + context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.StartValue)); + context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.Increment)); + context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.MaxValue)); + context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.MinValue)); + context.Output.AppendText(translator.Translate(context, column.SequenceDescriptor, SequenceDescriptorSection.IsCyclic)); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GeneratedExit)); + } + else if (!column.Expression.IsNullReference()) { + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GenerationExpressionEntry)); + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { + column.Expression.AcceptVisitor(this); + } + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.GenerationExpressionExit)); + } + if (!column.IsNullable) + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.NotNull)); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Exit)); + } + + private void Visit(TableConstraint constraint) + { + using (context.EnterScope(context.NamingOptions & ~SqlCompilerNamingOptions.TableQualifiedColumns)) { + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Entry)); + var checkConstraint = constraint as CheckConstraint; + if (checkConstraint!=null) + VisitCheckConstraint(checkConstraint); + var uniqueConstraint = constraint as UniqueConstraint; + if (uniqueConstraint!=null) + VisitUniqueConstraint(uniqueConstraint); + var foreignKey = constraint as ForeignKey; + if (constraint is ForeignKey) + VisitForeignKeyConstraint(foreignKey); + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Exit)); + } + } + + private void VisitForeignKeyConstraint(ForeignKey constraint) + { + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.ForeignKey)); + if (constraint.ReferencedColumns.Count==0) + throw new SqlCompilerException(Strings.ExReferencedColumnsCountCantBeLessThenOne); + if (constraint.Columns.Count==0) + throw new SqlCompilerException(Strings.ExReferencingColumnsCountCantBeLessThenOne); + using (context.EnterCollectionScope()) { + foreach (TableColumn column in constraint.Columns) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + context.Output.AppendText(translator.Translate(context, column, TableColumnSection.Entry)); + } + } + + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.ReferencedColumns)); + using (context.EnterCollectionScope()) { + foreach (TableColumn tc in constraint.ReferencedColumns) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + context.Output.AppendText( + translator.Translate(context, tc, TableColumnSection.Entry)); + } + } + } + + private void VisitUniqueConstraint(UniqueConstraint constraint) + { + if (constraint is PrimaryKey) + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.PrimaryKey)); + else + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Unique)); + + if (constraint.Columns.Count > 0) + using (context.EnterCollectionScope()) + foreach (TableColumn tc in constraint.Columns) { + if (!context.IsEmpty) + context.Output.AppendDelimiter(translator.ColumnDelimiter); + context.Output.AppendText(translator.Translate(context, tc, TableColumnSection.Entry)); + } + } + + private void VisitCheckConstraint(CheckConstraint constraint) + { + context.Output.AppendText(translator.Translate(context, constraint, ConstraintSection.Check)); + constraint.Condition.AcceptVisitor(this); + } + + public virtual void Visit(SqlExtract node) + { + using (context.EnterScope(node)) { + context.Output.AppendText(translator.Translate(context, node, ExtractSection.Entry)); + var part = node.DateTimePart!=SqlDateTimePart.Nothing + ? translator.Translate(node.DateTimePart) + : node.IntervalPart!=SqlIntervalPart.Nothing + ? translator.Translate(node.IntervalPart) + : translator.Translate(node.DateTimeOffsetPart); + context.Output.AppendText(part); + context.Output.AppendText(translator.Translate(context, node, ExtractSection.From)); + node.Operand.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(context, node, ExtractSection.Exit)); + } + } + + private void TranslateDynamicFilterViaInOperator(SqlDynamicFilter node) + { + int numberOfExpressions = node.Expressions.Count; + bool isMulticolumn = numberOfExpressions > 1; + string delimiter = translator.RowItemDelimiter + " "; + context.Output.AppendText(translator.OpeningParenthesis); + SqlExpression filteredExpression = isMulticolumn ? SqlDml.Row(node.Expressions) : node.Expressions[0]; + filteredExpression.AcceptVisitor(this); + context.Output.AppendText(translator.Translate(SqlNodeType.In)); + context.Output.AppendText(translator.RowBegin); + using (context.EnterCycleBodyScope(node.Id, delimiter)) { + if (isMulticolumn) { + context.Output.AppendText(translator.RowBegin); + for (int i = 0; i < numberOfExpressions; i++) { + context.Output.AppendCycleItem(i); + if (i!=numberOfExpressions - 1) + context.Output.AppendDelimiter(translator.RowItemDelimiter); + } + context.Output.AppendText(translator.RowEnd); + } + else + context.Output.AppendCycleItem(0); + } + using (context.EnterCycleEmptyCaseScope(node.Id)) { + SqlExpression nullExpression = isMulticolumn + ? SqlDml.Row(Enumerable.Repeat(SqlDml.Null, numberOfExpressions).ToArray()) + : (SqlExpression) SqlDml.Null; + nullExpression.AcceptVisitor(this); + // Append "and false" to avoid result beeing "undefined" rather than "false" + context.Output.AppendText(translator.ClosingParenthesis); + context.Output.AppendText(translator.Translate(SqlNodeType.And)); + context.Output.AppendText(translator.OpeningParenthesis); + WriteFalseExpression(); + } + context.Output.AppendText(translator.RowEnd); + context.Output.AppendText(translator.ClosingParenthesis); + } + + private void TranslateDynamicFilterViaMultipleComparisons(SqlDynamicFilter node) + { + int numberOfExpressions = node.Expressions.Count; + string delimiter = " " + translator.Translate(SqlNodeType.Or) + " "; + using (context.EnterCycleBodyScope(node.Id, delimiter)) { + context.Output.AppendText(translator.OpeningParenthesis); + for (int i = 0; i < numberOfExpressions; i++) { + node.Expressions[i].AcceptVisitor(this); + context.Output.AppendText(translator.Translate(SqlNodeType.Equals)); + context.Output.AppendCycleItem(i); + if (i!=numberOfExpressions - 1) + context.Output.AppendText(translator.Translate(SqlNodeType.And)); + } + context.Output.AppendText(translator.ClosingParenthesis); + } + using (context.EnterCycleEmptyCaseScope(node.Id)) { + WriteFalseExpression(); + } + } + + private void WriteFalseExpression() + { + SqlDml.Equals(SqlDml.Literal(1), SqlDml.Literal(0)).AcceptVisitor(this); + } + + private static IEnumerable FlattenBatch(SqlBatch batch) + { + foreach (SqlStatement statement in batch) { + var nestedBatch = statement as SqlBatch; + if (nestedBatch!=null) { + foreach (var nestedStatement in FlattenBatch(nestedBatch)) + yield return nestedStatement; + } + else { + yield return statement; + } + } + } + + protected bool CheckFeature(ColumnFeatures features) + { + return Driver.ServerInfo.Column.Features.Supports(features); + } + + protected bool CheckFeature(IndexFeatures features) + { + return Driver.ServerInfo.Index.Features.Supports(features); + } + + protected bool CheckFeature(QueryFeatures features) + { + return Driver.ServerInfo.Query.Features.Supports(features); + } + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The driver. + protected SqlCompiler(SqlDriver driver) + : base(driver) + { + translator = driver.Translator; + decimalType = driver.TypeMappings[typeof (Decimal)].MapType(); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerConfiguration.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerConfiguration.cs index f3b8b9543a..79667d27d8 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerConfiguration.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerConfiguration.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.15 - -using System.Collections.Generic; -using JetBrains.Annotations; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql.Compiler -{ - /// - /// A various options for . - /// - public sealed class SqlCompilerConfiguration - { - /// - /// Gets or sets the parameter prefix. - /// - public string ParameterNamePrefix { get; set; } - - /// - /// Always use database-qualified objects in generated SQL. - /// This option could be enabled if and only if - /// server supports . - /// - public bool DatabaseQualifiedObjects { get; set; } - - /// - /// Gets database mapping. - /// - public IDictionary SchemaMapping { get; private set; } - - /// - /// Gets database mapping. - /// - public IDictionary DatabaseMapping { get; private set; } - - /// - /// Clones this instance. - /// - /// Clone of this instance. - public SqlCompilerConfiguration Clone() - { - return new SqlCompilerConfiguration { - ParameterNamePrefix = ParameterNamePrefix, - DatabaseQualifiedObjects = DatabaseQualifiedObjects, - }; - } - - public SqlCompilerConfiguration() - { - SchemaMapping = null; - DatabaseMapping = null; - } - - public SqlCompilerConfiguration([NotNull]IDictionary databaseMapping, [NotNull]IDictionary schemaMapping) - { - ArgumentValidator.EnsureArgumentNotNull(databaseMapping, "databaseMapping"); - ArgumentValidator.EnsureArgumentNotNull(schemaMapping, "schemaMapping"); - DatabaseMapping = new ReadOnlyDictionary(databaseMapping); - SchemaMapping = new ReadOnlyDictionary(schemaMapping); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.15 + +using System.Collections.Generic; +using JetBrains.Annotations; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql.Compiler +{ + /// + /// A various options for . + /// + public sealed class SqlCompilerConfiguration + { + /// + /// Gets or sets the parameter prefix. + /// + public string ParameterNamePrefix { get; set; } + + /// + /// Always use database-qualified objects in generated SQL. + /// This option could be enabled if and only if + /// server supports . + /// + public bool DatabaseQualifiedObjects { get; set; } + + /// + /// Gets database mapping. + /// + public IDictionary SchemaMapping { get; private set; } + + /// + /// Gets database mapping. + /// + public IDictionary DatabaseMapping { get; private set; } + + /// + /// Clones this instance. + /// + /// Clone of this instance. + public SqlCompilerConfiguration Clone() + { + return new SqlCompilerConfiguration { + ParameterNamePrefix = ParameterNamePrefix, + DatabaseQualifiedObjects = DatabaseQualifiedObjects, + }; + } + + public SqlCompilerConfiguration() + { + SchemaMapping = null; + DatabaseMapping = null; + } + + public SqlCompilerConfiguration([NotNull]IDictionary databaseMapping, [NotNull]IDictionary schemaMapping) + { + ArgumentValidator.EnsureArgumentNotNull(databaseMapping, "databaseMapping"); + ArgumentValidator.EnsureArgumentNotNull(schemaMapping, "schemaMapping"); + DatabaseMapping = new ReadOnlyDictionary(databaseMapping); + SchemaMapping = new ReadOnlyDictionary(schemaMapping); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerContext.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerContext.cs index 7a1b1ce6f8..f024ef4cb1 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerContext.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerContext.cs @@ -1,153 +1,153 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Compiler -{ - /// - /// SQL compiler context. - /// - public class SqlCompilerContext - { - private SqlNode[] traversalPath; - private readonly Stack traversalStack; - private readonly HashSet traversalTable; - - public SqlTableNameProvider TableNameProvider { get; private set; } - - public SqlParameterNameProvider ParameterNameProvider { get; private set; } - - public ContainerNode Output { get; private set; } - - public SqlCompilerNamingOptions NamingOptions { get; private set; } - - public bool IsEmpty { get { return Output.IsEmpty; } } - - public SqlNodeActualizer SqlNodeActualizer { get; private set; } - - public SqlNode[] GetTraversalPath() - { - if (traversalPath == null) - traversalPath = traversalStack.ToArray(); - return traversalPath; - } - - public bool HasOptions(SqlCompilerNamingOptions requiredOptions) - { - return (NamingOptions & requiredOptions)==requiredOptions; - } - - public SqlCompilerNamingScope EnterScope(SqlCompilerNamingOptions options) - { - if (NamingOptions==options) - return null; - - var scope = new SqlCompilerNamingScope(this, NamingOptions); - NamingOptions = options; - return scope; - } - - internal void CloseScope(SqlCompilerNamingScope scope) - { - NamingOptions = scope.ParentOptions; - } - - #region SqlCompilerOutputScope members - - public SqlCompilerOutputScope EnterScope(SqlNode node) - { - if (traversalTable.Contains(node)) - throw new SqlCompilerException(Strings.ExCircularReferenceDetected); - traversalStack.Push(node); - traversalTable.Add(node); - return OpenScope(ContextType.Node); - } - - public SqlCompilerOutputScope EnterCollectionScope() - { - return OpenScope(ContextType.Collection); - } - - public SqlCompilerOutputScope EnterMainVariantScope(object id) - { - var variant = new VariantNode(id) { - Main = new ContainerNode(), - Alternative = new ContainerNode() - }; - Output.Add(variant); - return OpenScope(ContextType.Collection, (ContainerNode) variant.Main); - } - - public SqlCompilerOutputScope EnterAlternativeVariantScope(object id) - { - var variant = (VariantNode) Output.Current; - if (variant.Id != id) - throw new InvalidOperationException(); - return OpenScope(ContextType.Collection, (ContainerNode) variant.Alternative); - } - - public SqlCompilerOutputScope EnterCycleBodyScope(object id, string delimiter) - { - var cycle = new CycleNode(id) { - Body = new ContainerNode(), - EmptyCase = new ContainerNode(), - Delimiter = delimiter - }; - Output.Add(cycle); - return OpenScope(ContextType.Collection, (ContainerNode) cycle.Body); - } - - public SqlCompilerOutputScope EnterCycleEmptyCaseScope(object id) - { - var cycle = (CycleNode) Output.Current; - if (cycle.Id != id) - throw new InvalidOperationException(); - return OpenScope(ContextType.Collection, (ContainerNode) cycle.EmptyCase); - } - - private SqlCompilerOutputScope OpenScope(ContextType type) - { - var container = new ContainerNode(); - Output.Add(container); - return OpenScope(type, container); - } - - private SqlCompilerOutputScope OpenScope(ContextType type, ContainerNode container) - { - traversalPath = null; - var scope = new SqlCompilerOutputScope(this, Output, type); - Output = container; - return scope; - } - - internal void CloseScope(SqlCompilerOutputScope scope) - { - traversalPath = null; - Output = scope.ParentContainer; - if (scope.Type == ContextType.Node) - traversalTable.Remove(traversalStack.Pop()); - } - - #endregion - - - // Constructor - - internal SqlCompilerContext(SqlCompilerConfiguration configuration) - { - NamingOptions = SqlCompilerNamingOptions.TableQualifiedColumns | SqlCompilerNamingOptions.TableAliasing; - if (configuration.DatabaseQualifiedObjects) - NamingOptions |= SqlCompilerNamingOptions.DatabaseQualifiedObjects; - - TableNameProvider = new SqlTableNameProvider(this); - ParameterNameProvider = new SqlParameterNameProvider(configuration); - traversalStack = new Stack(); - traversalTable = new HashSet(); - Output = new ContainerNode(); - SqlNodeActualizer = new SqlNodeActualizer(configuration.DatabaseMapping, configuration.SchemaMapping); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Compiler +{ + /// + /// SQL compiler context. + /// + public class SqlCompilerContext + { + private SqlNode[] traversalPath; + private readonly Stack traversalStack; + private readonly HashSet traversalTable; + + public SqlTableNameProvider TableNameProvider { get; private set; } + + public SqlParameterNameProvider ParameterNameProvider { get; private set; } + + public ContainerNode Output { get; private set; } + + public SqlCompilerNamingOptions NamingOptions { get; private set; } + + public bool IsEmpty { get { return Output.IsEmpty; } } + + public SqlNodeActualizer SqlNodeActualizer { get; private set; } + + public SqlNode[] GetTraversalPath() + { + if (traversalPath == null) + traversalPath = traversalStack.ToArray(); + return traversalPath; + } + + public bool HasOptions(SqlCompilerNamingOptions requiredOptions) + { + return (NamingOptions & requiredOptions)==requiredOptions; + } + + public SqlCompilerNamingScope EnterScope(SqlCompilerNamingOptions options) + { + if (NamingOptions==options) + return null; + + var scope = new SqlCompilerNamingScope(this, NamingOptions); + NamingOptions = options; + return scope; + } + + internal void CloseScope(SqlCompilerNamingScope scope) + { + NamingOptions = scope.ParentOptions; + } + + #region SqlCompilerOutputScope members + + public SqlCompilerOutputScope EnterScope(SqlNode node) + { + if (traversalTable.Contains(node)) + throw new SqlCompilerException(Strings.ExCircularReferenceDetected); + traversalStack.Push(node); + traversalTable.Add(node); + return OpenScope(ContextType.Node); + } + + public SqlCompilerOutputScope EnterCollectionScope() + { + return OpenScope(ContextType.Collection); + } + + public SqlCompilerOutputScope EnterMainVariantScope(object id) + { + var variant = new VariantNode(id) { + Main = new ContainerNode(), + Alternative = new ContainerNode() + }; + Output.Add(variant); + return OpenScope(ContextType.Collection, (ContainerNode) variant.Main); + } + + public SqlCompilerOutputScope EnterAlternativeVariantScope(object id) + { + var variant = (VariantNode) Output.Current; + if (variant.Id != id) + throw new InvalidOperationException(); + return OpenScope(ContextType.Collection, (ContainerNode) variant.Alternative); + } + + public SqlCompilerOutputScope EnterCycleBodyScope(object id, string delimiter) + { + var cycle = new CycleNode(id) { + Body = new ContainerNode(), + EmptyCase = new ContainerNode(), + Delimiter = delimiter + }; + Output.Add(cycle); + return OpenScope(ContextType.Collection, (ContainerNode) cycle.Body); + } + + public SqlCompilerOutputScope EnterCycleEmptyCaseScope(object id) + { + var cycle = (CycleNode) Output.Current; + if (cycle.Id != id) + throw new InvalidOperationException(); + return OpenScope(ContextType.Collection, (ContainerNode) cycle.EmptyCase); + } + + private SqlCompilerOutputScope OpenScope(ContextType type) + { + var container = new ContainerNode(); + Output.Add(container); + return OpenScope(type, container); + } + + private SqlCompilerOutputScope OpenScope(ContextType type, ContainerNode container) + { + traversalPath = null; + var scope = new SqlCompilerOutputScope(this, Output, type); + Output = container; + return scope; + } + + internal void CloseScope(SqlCompilerOutputScope scope) + { + traversalPath = null; + Output = scope.ParentContainer; + if (scope.Type == ContextType.Node) + traversalTable.Remove(traversalStack.Pop()); + } + + #endregion + + + // Constructor + + internal SqlCompilerContext(SqlCompilerConfiguration configuration) + { + NamingOptions = SqlCompilerNamingOptions.TableQualifiedColumns | SqlCompilerNamingOptions.TableAliasing; + if (configuration.DatabaseQualifiedObjects) + NamingOptions |= SqlCompilerNamingOptions.DatabaseQualifiedObjects; + + TableNameProvider = new SqlTableNameProvider(this); + ParameterNameProvider = new SqlParameterNameProvider(configuration); + traversalStack = new Stack(); + traversalTable = new HashSet(); + Output = new ContainerNode(); + SqlNodeActualizer = new SqlNodeActualizer(configuration.DatabaseMapping, configuration.SchemaMapping); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerException.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerException.cs index feb4d8b148..dc72bafd8a 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerException.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerException.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Runtime.Serialization; - - -namespace Xtensive.Sql.Compiler -{ - /// - /// An exception. - /// - [Serializable] - public class SqlCompilerException : Exception - { - /// - /// Initializes new instance of this type. - /// - /// The message. - public SqlCompilerException(string message) - : base(message) - { - } - - // Serialization - - /// - /// Deserializes instance of this type. - /// - /// - /// - protected SqlCompilerException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Runtime.Serialization; + + +namespace Xtensive.Sql.Compiler +{ + /// + /// An exception. + /// + [Serializable] + public class SqlCompilerException : Exception + { + /// + /// Initializes new instance of this type. + /// + /// The message. + public SqlCompilerException(string message) + : base(message) + { + } + + // Serialization + + /// + /// Deserializes instance of this type. + /// + /// + /// + protected SqlCompilerException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingOptions.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingOptions.cs index ab687aae41..f892c75918 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingOptions.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingOptions.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Sql.Compiler -{ - [Flags] - public enum SqlCompilerNamingOptions - { - None = 0x0, - TableAliasing = 0x1, - TableQualifiedColumns = 0x2, - DatabaseQualifiedObjects = 0x4, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Sql.Compiler +{ + [Flags] + public enum SqlCompilerNamingOptions + { + None = 0x0, + TableAliasing = 0x1, + TableQualifiedColumns = 0x2, + DatabaseQualifiedObjects = 0x4, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingScope.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingScope.cs index 55f720055b..62f20089c5 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingScope.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerNamingScope.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; - -namespace Xtensive.Sql.Compiler -{ - /// - /// SQL compiler naming scope. - /// - [Serializable] - public class SqlCompilerNamingScope : IDisposable - { - private readonly SqlCompilerContext context; - - internal SqlCompilerNamingOptions ParentOptions { get; private set; } - - /// - public void Dispose() - { - context.CloseScope(this); - } - - public SqlCompilerNamingScope(SqlCompilerContext context, SqlCompilerNamingOptions parentOptions) - { - this.context = context; - ParentOptions = parentOptions; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; + +namespace Xtensive.Sql.Compiler +{ + /// + /// SQL compiler naming scope. + /// + [Serializable] + public class SqlCompilerNamingScope : IDisposable + { + private readonly SqlCompilerContext context; + + internal SqlCompilerNamingOptions ParentOptions { get; private set; } + + /// + public void Dispose() + { + context.CloseScope(this); + } + + public SqlCompilerNamingScope(SqlCompilerContext context, SqlCompilerNamingOptions parentOptions) + { + this.context = context; + ParentOptions = parentOptions; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerOutputScope.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerOutputScope.cs index 44e5d9d329..751187b463 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerOutputScope.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompilerOutputScope.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Compiler -{ - /// - /// SQL compiler output scope. - /// - public class SqlCompilerOutputScope : IDisposable - { - private readonly SqlCompilerContext context; - - internal ContextType Type { get; private set; } - - internal ContainerNode ParentContainer { get; private set; } - - /// - public void Dispose() - { - context.CloseScope(this); - } - - internal SqlCompilerOutputScope(SqlCompilerContext context, ContainerNode parentContainer, ContextType type) - { - this.context = context; - Type = type; - ParentContainer = parentContainer; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Compiler +{ + /// + /// SQL compiler output scope. + /// + public class SqlCompilerOutputScope : IDisposable + { + private readonly SqlCompilerContext context; + + internal ContextType Type { get; private set; } + + internal ContainerNode ParentContainer { get; private set; } + + /// + public void Dispose() + { + context.CloseScope(this); + } + + internal SqlCompilerOutputScope(SqlCompilerContext context, ContainerNode parentContainer, ContextType type) + { + this.context = context; + Type = type; + ParentContainer = parentContainer; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlDelimiterType.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlDelimiterType.cs index 9650f63874..e8bb41b884 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlDelimiterType.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlDelimiterType.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Compiler -{ - public enum SqlDelimiterType - { - Default = Column, - Column = 0, - Row = 1, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Compiler +{ + public enum SqlDelimiterType + { + Default = Column, + Column = 0, + Row = 1, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeActualizer.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeActualizer.cs index d9cc8122a4..eb0e1da6ce 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeActualizer.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeActualizer.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2017.03.24 - -using System.Collections.Generic; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Compiler -{ - /// - /// Applies configured mappings to 's or 's name to get actual name. - /// - public sealed class SqlNodeActualizer - { - private readonly IDictionary databaseMapping; - private readonly IDictionary schemaMapping; - - /// - /// Gets actual 's name. - /// - /// which name should be actualized. - /// Actual name. - public string Actualize(Catalog catalog) - { - return catalog.GetActualDbName(databaseMapping); - } - - /// - /// Gets actual 's name. - /// - /// which name should be actualized. - /// Actual name. - public string Actualize(Schema schema) - { - return schema.GetActualDbName(schemaMapping); - } - - /// - /// Creates instance of the class. - /// - /// Database (or Catalog) mappings. - /// Schema mappings. - internal SqlNodeActualizer(IDictionary databaseMapping, IDictionary schemaMapping) - { - this.databaseMapping = databaseMapping; - this.schemaMapping = schemaMapping; - } - } +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2017.03.24 + +using System.Collections.Generic; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Compiler +{ + /// + /// Applies configured mappings to 's or 's name to get actual name. + /// + public sealed class SqlNodeActualizer + { + private readonly IDictionary databaseMapping; + private readonly IDictionary schemaMapping; + + /// + /// Gets actual 's name. + /// + /// which name should be actualized. + /// Actual name. + public string Actualize(Catalog catalog) + { + return catalog.GetActualDbName(databaseMapping); + } + + /// + /// Gets actual 's name. + /// + /// which name should be actualized. + /// Actual name. + public string Actualize(Schema schema) + { + return schema.GetActualDbName(schemaMapping); + } + + /// + /// Creates instance of the class. + /// + /// Database (or Catalog) mappings. + /// Schema mappings. + internal SqlNodeActualizer(IDictionary databaseMapping, IDictionary schemaMapping) + { + this.databaseMapping = databaseMapping; + this.schemaMapping = schemaMapping; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs index 946d21cc30..51071ec2c2 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs @@ -1,282 +1,282 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Compiler -{ - public enum NodeSection - { - Entry = 0, - Exit = 1, - } - - public enum AlterTableSection - { - Entry = 0, - Exit = 1, - AddColumn = 2, - AlterColumn = 3, - DropColumn = 4, - DropBehavior = 5, - AddConstraint = 6, - DropConstraint = 7, - RenameColumn = 8, - To = 9, - } - - public enum AlterDomainSection - { - Entry = 0, - Exit = 1, - AddConstraint = 2, - DropConstraint = 3, - SetDefault = 4, - DropDefault = 5, - } - - public enum ConstraintSection - { - Entry = 0, - Exit = 1, - Check = 2, - PrimaryKey = 3, - Unique = 4, - ForeignKey = 5, - ReferencedColumns = 6, - } - - public enum BetweenSection - { - Entry = 0, - Exit = 1, - Between = 2, - And = 3, - } - - public enum CaseSection - { - Entry = 0, - Exit = 1, - Value = 2, - When = 3, - Then = 4, - Else = 5, - } - - public enum ColumnSection - { - Entry = 0, - Exit = 1, - AliasDeclaration = 2, - } - - public enum CreateDomainSection - { - Entry = 0, - Exit = 1, - DomainDefaultValue = 2, - DomainCollate = 3, - } - - public enum CreateIndexSection - { - Entry = 0, - Exit = 1, - ColumnsEnter = 2, - ColumnsExit = 3, - NonkeyColumnsEnter = 4, - NonkeyColumnsExit = 5, - StorageOptions = 6, - Where = 7, - } - - public enum CreateTableSection - { - Entry = 0, - TableElementsEntry = 1, - TableElementEntry = 2, - TableElementExit = 3, - TableElementsExit = 4, - Partition = 5, - Exit = 6, - } - - public enum DeclareCursorSection - { - Entry = 0, - Exit = 1, - Holdability = 2, - Scrollability = 3, - Sensivity = 4, - Cursor = 5, - Updatability = 6, - Returnability = 7, - For = 8 - } - - public enum DeleteSection - { - Entry = 0, - Exit = 1, - Where = 2, - From = 3, - Limit = 4, - } - - public enum FetchSection - { - Entry = 0, - Exit = 1, - Targets = 2, - } - - public enum FunctionCallSection - { - Entry = 0, - Exit = 1, - ArgumentDelimiter = 2, - ArgumentEntry = 3, - ArgumentExit = 4, - } - - public enum SequenceDescriptorSection - { - StartValue = 0, - Increment = 1, - MaxValue = 2, - MinValue = 3, - IsCyclic = 4, - RestartValue = 5, - AlterMaxValue = 6, - AlterMinValue = 7, - } - - public enum IfSection - { - Entry = 0, - Exit = 1, - True = 2, - False = 3, - } - - public enum InsertSection - { - Entry = 0, - Exit = 1, - ColumnsEntry = 2, - ColumnsExit = 4, - ValuesEntry = 3, - ValuesExit = 5, - DefaultValues = 6, - From = 7, - } - - public enum JoinSection - { - Entry = 0, - Exit = 1, - Specification = 2, - Condition = 3, - } - - public enum LikeSection - { - Entry = 0, - Exit = 1, - Like = 2, - Escape = 3, - } - - public enum MatchSection - { - Entry = 0, - Exit = 1, - Specification = 2, - } - - public enum SelectSection - { - Entry = 0, - Exit = 1, - From = 3, - Where = 4, - GroupBy = 5, - Having = 6, - OrderBy = 7, - HintsEntry = 8, - HintsExit = 9, - Limit = 10, - Offset = 11, - LimitEnd = 12, - OffsetEnd = 13, - } - - public enum TableSection - { - Entry = 0, - Exit = 1, - AliasDeclaration = 2, - } - - public enum TableColumnSection - { - Entry = 0, - Exit = 1, - Type = 2, - DefaultValue = 3, - DropDefault = 4, - SetDefault = 5, - GeneratedEntry = 6, - GeneratedExit = 7, - SetIdentityInfoElement = 8, - GenerationExpressionEntry = 9, - GenerationExpressionExit = 10, - NotNull = 11, - Collate = 12, - } - - public enum TrimSection - { - Entry = 0, - Exit = 1, - From = 2, - } - - public enum ExtractSection - { - Entry = 0, - Exit = 1, - From = 2, - } - - public enum ArraySection - { - Entry = 0, - Exit = 1, - EmptyArray = 2, - } - - public enum UpdateSection - { - Entry = 0, - Exit = 1, - Set = 2, - From = 3, - Where = 4, - Limit = 5, - } - - public enum WhileSection - { - Entry = 0, - Exit = 1, - Statement = 2, - } - - public enum QueryExpressionSection - { - Entry = 0, - Exit = 1, - All = 2, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Compiler +{ + public enum NodeSection + { + Entry = 0, + Exit = 1, + } + + public enum AlterTableSection + { + Entry = 0, + Exit = 1, + AddColumn = 2, + AlterColumn = 3, + DropColumn = 4, + DropBehavior = 5, + AddConstraint = 6, + DropConstraint = 7, + RenameColumn = 8, + To = 9, + } + + public enum AlterDomainSection + { + Entry = 0, + Exit = 1, + AddConstraint = 2, + DropConstraint = 3, + SetDefault = 4, + DropDefault = 5, + } + + public enum ConstraintSection + { + Entry = 0, + Exit = 1, + Check = 2, + PrimaryKey = 3, + Unique = 4, + ForeignKey = 5, + ReferencedColumns = 6, + } + + public enum BetweenSection + { + Entry = 0, + Exit = 1, + Between = 2, + And = 3, + } + + public enum CaseSection + { + Entry = 0, + Exit = 1, + Value = 2, + When = 3, + Then = 4, + Else = 5, + } + + public enum ColumnSection + { + Entry = 0, + Exit = 1, + AliasDeclaration = 2, + } + + public enum CreateDomainSection + { + Entry = 0, + Exit = 1, + DomainDefaultValue = 2, + DomainCollate = 3, + } + + public enum CreateIndexSection + { + Entry = 0, + Exit = 1, + ColumnsEnter = 2, + ColumnsExit = 3, + NonkeyColumnsEnter = 4, + NonkeyColumnsExit = 5, + StorageOptions = 6, + Where = 7, + } + + public enum CreateTableSection + { + Entry = 0, + TableElementsEntry = 1, + TableElementEntry = 2, + TableElementExit = 3, + TableElementsExit = 4, + Partition = 5, + Exit = 6, + } + + public enum DeclareCursorSection + { + Entry = 0, + Exit = 1, + Holdability = 2, + Scrollability = 3, + Sensivity = 4, + Cursor = 5, + Updatability = 6, + Returnability = 7, + For = 8 + } + + public enum DeleteSection + { + Entry = 0, + Exit = 1, + Where = 2, + From = 3, + Limit = 4, + } + + public enum FetchSection + { + Entry = 0, + Exit = 1, + Targets = 2, + } + + public enum FunctionCallSection + { + Entry = 0, + Exit = 1, + ArgumentDelimiter = 2, + ArgumentEntry = 3, + ArgumentExit = 4, + } + + public enum SequenceDescriptorSection + { + StartValue = 0, + Increment = 1, + MaxValue = 2, + MinValue = 3, + IsCyclic = 4, + RestartValue = 5, + AlterMaxValue = 6, + AlterMinValue = 7, + } + + public enum IfSection + { + Entry = 0, + Exit = 1, + True = 2, + False = 3, + } + + public enum InsertSection + { + Entry = 0, + Exit = 1, + ColumnsEntry = 2, + ColumnsExit = 4, + ValuesEntry = 3, + ValuesExit = 5, + DefaultValues = 6, + From = 7, + } + + public enum JoinSection + { + Entry = 0, + Exit = 1, + Specification = 2, + Condition = 3, + } + + public enum LikeSection + { + Entry = 0, + Exit = 1, + Like = 2, + Escape = 3, + } + + public enum MatchSection + { + Entry = 0, + Exit = 1, + Specification = 2, + } + + public enum SelectSection + { + Entry = 0, + Exit = 1, + From = 3, + Where = 4, + GroupBy = 5, + Having = 6, + OrderBy = 7, + HintsEntry = 8, + HintsExit = 9, + Limit = 10, + Offset = 11, + LimitEnd = 12, + OffsetEnd = 13, + } + + public enum TableSection + { + Entry = 0, + Exit = 1, + AliasDeclaration = 2, + } + + public enum TableColumnSection + { + Entry = 0, + Exit = 1, + Type = 2, + DefaultValue = 3, + DropDefault = 4, + SetDefault = 5, + GeneratedEntry = 6, + GeneratedExit = 7, + SetIdentityInfoElement = 8, + GenerationExpressionEntry = 9, + GenerationExpressionExit = 10, + NotNull = 11, + Collate = 12, + } + + public enum TrimSection + { + Entry = 0, + Exit = 1, + From = 2, + } + + public enum ExtractSection + { + Entry = 0, + Exit = 1, + From = 2, + } + + public enum ArraySection + { + Entry = 0, + Exit = 1, + EmptyArray = 2, + } + + public enum UpdateSection + { + Entry = 0, + Exit = 1, + Set = 2, + From = 3, + Where = 4, + Limit = 5, + } + + public enum WhileSection + { + Entry = 0, + Exit = 1, + Statement = 2, + } + + public enum QueryExpressionSection + { + Entry = 0, + Exit = 1, + All = 2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlParameterNameProvider.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlParameterNameProvider.cs index c92451d4a0..f3b814e70a 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlParameterNameProvider.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlParameterNameProvider.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.08.31 - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Compiler -{ - /// - /// SQL parameter name provider. - /// - [Serializable] - public class SqlParameterNameProvider - { - private const string DefaultPrefix = "p"; - private int nextParameter; - private readonly string prefix; - - internal Dictionary NameTable { get; private set; } - - /// - /// Gets the name for the specified . - /// - /// The parameter. - /// Name for the specified parameter. - public string GetName(object parameter) - { - string result; - if (!NameTable.TryGetValue(parameter, out result)) { - result = prefix + nextParameter++; - NameTable.Add(parameter, result); - } - return result; - } - - - // Constructor - - /// - public SqlParameterNameProvider(SqlCompilerConfiguration configuration) - { - NameTable = new Dictionary(); - prefix = string.IsNullOrEmpty(configuration.ParameterNamePrefix) - ? DefaultPrefix - : configuration.ParameterNamePrefix; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.08.31 + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Compiler +{ + /// + /// SQL parameter name provider. + /// + [Serializable] + public class SqlParameterNameProvider + { + private const string DefaultPrefix = "p"; + private int nextParameter; + private readonly string prefix; + + internal Dictionary NameTable { get; private set; } + + /// + /// Gets the name for the specified . + /// + /// The parameter. + /// Name for the specified parameter. + public string GetName(object parameter) + { + string result; + if (!NameTable.TryGetValue(parameter, out result)) { + result = prefix + nextParameter++; + NameTable.Add(parameter, result); + } + return result; + } + + + // Constructor + + /// + public SqlParameterNameProvider(SqlCompilerConfiguration configuration) + { + NameTable = new Dictionary(); + prefix = string.IsNullOrEmpty(configuration.ParameterNamePrefix) + ? DefaultPrefix + : configuration.ParameterNamePrefix; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlPostCompilerConfiguration.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlPostCompilerConfiguration.cs index f8feb194c9..a9f65bbcde 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlPostCompilerConfiguration.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlPostCompilerConfiguration.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.07 - -using System.Collections.Generic; - -namespace Xtensive.Sql.Compiler -{ - /// - /// configuration. - /// - public sealed class SqlPostCompilerConfiguration - { - public HashSet AlternativeBranches { get; private set; } - - public Dictionary PlaceholderValues { get; private set; } - - public Dictionary> DynamicFilterValues { get; private set; } - - - // Constructors - - public SqlPostCompilerConfiguration() - { - AlternativeBranches = new HashSet(); - PlaceholderValues = new Dictionary(); - DynamicFilterValues = new Dictionary>(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.07 + +using System.Collections.Generic; + +namespace Xtensive.Sql.Compiler +{ + /// + /// configuration. + /// + public sealed class SqlPostCompilerConfiguration + { + public HashSet AlternativeBranches { get; private set; } + + public Dictionary PlaceholderValues { get; private set; } + + public Dictionary> DynamicFilterValues { get; private set; } + + + // Constructors + + public SqlPostCompilerConfiguration() + { + AlternativeBranches = new HashSet(); + PlaceholderValues = new Dictionary(); + DynamicFilterValues = new Dictionary>(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlTableNameProvider.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlTableNameProvider.cs index 1c136bf358..46eadca5fe 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlTableNameProvider.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlTableNameProvider.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Compiler -{ - /// - /// Table name provider. - /// - public class SqlTableNameProvider - { - private readonly Dictionary aliasMap = new Dictionary(16); - private readonly Set aliasIndex = new Set(); - private int counter; - private byte prefixIndex; - private byte suffix; - private readonly SqlCompilerContext context; - - private static readonly string[] Prefixes = - new[] { - "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", - "w", "x", "y", "z" - }; - - public string GetName(SqlTable table) - { - if ((context.NamingOptions & SqlCompilerNamingOptions.TableAliasing) == 0) { - aliasIndex.Add(table.Name); - aliasMap[table] = table.Name; - return table.Name; - } - - string result; - if (aliasMap.TryGetValue(table, out result)) - return result; - - var tableRef = table as SqlTableRef; - // Table reference - if (tableRef!=null) { - // Alias - if (tableRef.Name!=tableRef.DataTable.Name) { - result = tableRef.Name; - if (aliasIndex.Contains(result)) - result = GenerateAlias(); - } - else - result = GenerateAlias(); - } - // Table - else { - if (!string.IsNullOrEmpty(table.Name)) { - result = table.Name; - if (aliasIndex.Contains(result)) - result = GenerateAlias(); - } - else - result = GenerateAlias(); - } - - aliasMap[table] = result; - aliasIndex.Add(result); - return result; - } - - internal void Reset() - { - aliasIndex.Clear(); - aliasMap.Clear(); - prefixIndex = 0; - suffix = 0; - } - - private string GenerateAlias() - { - UpdateWordIndex(); - while (true) { - string result = Prefixes[prefixIndex++] + ((suffix > 0) ? suffix.ToString() : string.Empty); - if (!aliasIndex.Contains(result)) - return result; - } - } - - private void UpdateWordIndex() - { - if (prefixIndex < Prefixes.Length) - return; - - prefixIndex = 0; - suffix++; - } - - - // Constructor - - public SqlTableNameProvider(SqlCompilerContext context) - { - this.context = context; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Compiler +{ + /// + /// Table name provider. + /// + public class SqlTableNameProvider + { + private readonly Dictionary aliasMap = new Dictionary(16); + private readonly Set aliasIndex = new Set(); + private int counter; + private byte prefixIndex; + private byte suffix; + private readonly SqlCompilerContext context; + + private static readonly string[] Prefixes = + new[] { + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", + "w", "x", "y", "z" + }; + + public string GetName(SqlTable table) + { + if ((context.NamingOptions & SqlCompilerNamingOptions.TableAliasing) == 0) { + aliasIndex.Add(table.Name); + aliasMap[table] = table.Name; + return table.Name; + } + + string result; + if (aliasMap.TryGetValue(table, out result)) + return result; + + var tableRef = table as SqlTableRef; + // Table reference + if (tableRef!=null) { + // Alias + if (tableRef.Name!=tableRef.DataTable.Name) { + result = tableRef.Name; + if (aliasIndex.Contains(result)) + result = GenerateAlias(); + } + else + result = GenerateAlias(); + } + // Table + else { + if (!string.IsNullOrEmpty(table.Name)) { + result = table.Name; + if (aliasIndex.Contains(result)) + result = GenerateAlias(); + } + else + result = GenerateAlias(); + } + + aliasMap[table] = result; + aliasIndex.Add(result); + return result; + } + + internal void Reset() + { + aliasIndex.Clear(); + aliasMap.Clear(); + prefixIndex = 0; + suffix = 0; + } + + private string GenerateAlias() + { + UpdateWordIndex(); + while (true) { + string result = Prefixes[prefixIndex++] + ((suffix > 0) ? suffix.ToString() : string.Empty); + if (!aliasIndex.Contains(result)) + return result; + } + } + + private void UpdateWordIndex() + { + if (prefixIndex < Prefixes.Length) + return; + + prefixIndex = 0; + suffix++; + } + + + // Constructor + + public SqlTableNameProvider(SqlCompilerContext context) + { + this.context = context; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs index ce068e5f28..8635e3428c 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs @@ -1,1856 +1,1856 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Globalization; -using System.Linq; -using System.Text; -using Xtensive.Core; -using Xtensive.Reflection; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Compiler -{ - /// - /// SQL translator. - /// - public abstract class SqlTranslator : SqlDriverBound - { - public DateTimeFormatInfo DateTimeFormat { get; private set; } - public NumberFormatInfo IntegerNumberFormat { get; private set; } - public NumberFormatInfo FloatNumberFormat { get; private set; } - public NumberFormatInfo DoubleNumberFormat { get; private set; } - - public virtual string NewLine { get { return "\r\n"; } } - - public virtual string OpeningParenthesis { get { return "("; } } - public virtual string ClosingParenthesis { get { return ")"; } } - - public virtual string BatchBegin { get { return string.Empty; } } - public virtual string BatchEnd { get { return string.Empty; } } - public virtual string BatchItemDelimiter { get { return ";"; } } - - public virtual string RowBegin { get { return "("; } } - public virtual string RowEnd { get { return ")"; } } - public virtual string RowItemDelimiter { get { return ","; } } - - public virtual string ArgumentDelimiter { get { return ","; } } - public virtual string ColumnDelimiter { get { return ","; } } - public virtual string WhenDelimiter { get { return string.Empty; } } - public virtual string DdlStatementDelimiter { get { return string.Empty; } } - public virtual string HintDelimiter { get { return string.Empty; } } - - /// - /// Gets the float format string. - /// See for details. - /// - public virtual string FloatFormatString { get { return "0.0######"; } } - - /// - /// Gets the double format string. - /// See for details. - /// - public virtual string DoubleFormatString { get { return "0.0##############"; } } - - /// - /// Gets the date time format string. - /// See for details. - /// - public abstract string DateTimeFormatString { get; } - - /// - /// Gets the time span format string. - /// See for details. - /// - public abstract string TimeSpanFormatString { get; } - - /// - /// Gets the parameter prefix. - /// - public string ParameterPrefix { get; private set; } - - /// - /// Initializes this instance. - /// - public virtual void Initialize() - { - IntegerNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); - FloatNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); - DoubleNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); - DateTimeFormat = (DateTimeFormatInfo) CultureInfo.InvariantCulture.DateTimeFormat.Clone(); - - var queryInfo = Driver.ServerInfo.Query; - ParameterPrefix = queryInfo.Features.Supports(QueryFeatures.ParameterPrefix) - ? queryInfo.ParameterPrefix - : string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlAggregate node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return Translate(node.NodeType) + "(" + (node.Distinct ? "DISTINCT" : string.Empty); - case NodeSection.Exit: - return ")"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlAlterDomain node, AlterDomainSection section) - { - switch (section) { - case AlterDomainSection.Entry: - return "ALTER DOMAIN " + Translate(context, node.Domain); - case AlterDomainSection.AddConstraint: - return "ADD"; - case AlterDomainSection.DropConstraint: - return "DROP"; - case AlterDomainSection.SetDefault: - return "SET DEFAULT"; - case AlterDomainSection.DropDefault: - return "DROP DEFAULT"; - default: - return String.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlAlterPartitionFunction node) - { - var builder = new StringBuilder(); - builder.Append("ALTER PARTITION FUNCTION " + QuoteIdentifier(node.PartitionFunction.DbName) + "()"); - if (node.Option == SqlAlterPartitionFunctionOption.Split) - builder.Append(" SPLIT RANGE ("); - else - builder.Append(" MERGE RANGE ("); - builder.Append(node.Boundary + ")"); - return builder.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlAlterPartitionScheme node) - { - return - "ALTER PARTITION SCHEME " + QuoteIdentifier(node.PartitionSchema.DbName) + " NEXT USED" + - (string.IsNullOrEmpty(node.Filegroup) ? "" : " " + node.Filegroup); - } - - public virtual string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) - { - switch (section) { - case AlterTableSection.Entry: - return "ALTER TABLE " + Translate(context, node.Table); - case AlterTableSection.AddColumn: - return "ADD COLUMN"; - case AlterTableSection.AlterColumn: - return "ALTER COLUMN"; - case AlterTableSection.DropColumn: - return "DROP COLUMN"; - case AlterTableSection.AddConstraint: - return "ADD"; - case AlterTableSection.DropConstraint: - return "DROP"; - case AlterTableSection.RenameColumn: - return "RENAME COLUMN"; - case AlterTableSection.To: - return "TO"; - case AlterTableSection.DropBehavior: - var cascadableAction = node.Action as SqlCascadableAction; - if (cascadableAction==null) - return string.Empty; - return cascadableAction.Cascade ? "CASCADE" : "RESTRICT"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlAlterSequence node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "ALTER SEQUENCE " + Translate(context, node.Sequence); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) - { - switch (section) { - case TableColumnSection.Entry: - return QuoteIdentifier(column.DbName); - case TableColumnSection.Type: - return column.Domain==null ? Translate(column.DataType) : Translate(context, column.Domain); - case TableColumnSection.DefaultValue: - return "DEFAULT"; - case TableColumnSection.DropDefault: - return "DROP DEFAULT"; - case TableColumnSection.SetDefault: - return "SET DEFAULT"; - case TableColumnSection.GenerationExpressionExit: - return ")" + (column.IsPersisted ? " PERSISTED" : ""); - case TableColumnSection.SetIdentityInfoElement: - return "SET"; - case TableColumnSection.NotNull: - return "NOT NULL"; - case TableColumnSection.Collate: - return "COLLATE " + Translate(column.Collation); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) - { - switch (section) { - case ConstraintSection.Entry: { - if (!String.IsNullOrEmpty(constraint.DbName)) - return "CONSTRAINT " + QuoteIdentifier(constraint.DbName); - return String.Empty; - } - case ConstraintSection.Check: - return "CHECK ("; - case ConstraintSection.PrimaryKey: - return "PRIMARY KEY ("; - case ConstraintSection.Unique: - return "UNIQUE ("; - case ConstraintSection.ForeignKey: - return "FOREIGN KEY ("; - case ConstraintSection.ReferencedColumns: { - var fk = (ForeignKey) constraint; - return ") REFERENCES " + Translate(context, fk.ReferencedColumns[0].DataTable) + " ("; - } - case ConstraintSection.Exit: { - var fk = constraint as ForeignKey; - var sb = new StringBuilder(); - sb.Append(")"); - if (fk != null) { - if (fk.MatchType != SqlMatchType.None) - sb.Append(" MATCH " + Translate(fk.MatchType)); - if (fk.OnUpdate != ReferentialAction.NoAction) - sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); - if (fk.OnDelete != ReferentialAction.NoAction) - sb.Append(" ON DELETE " + Translate(fk.OnDelete)); - } - if (constraint.IsDeferrable.HasValue) { - if (constraint.IsDeferrable.Value) - sb.Append(" DEFERRABLE"); - else - sb.Append(" NOT DEFERRABLE"); - } - if (constraint.IsInitiallyDeferred.HasValue) { - if (constraint.IsInitiallyDeferred.Value) - sb.Append(" INITIALLY DEFERRED"); - else - sb.Append(" INITIALLY IMMEDIATE"); - } - return sb.ToString(); - } - default: - return String.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlArray node, ArraySection section) - { - switch (section) { - case ArraySection.Entry: - return "("; - case ArraySection.Exit: - return ")"; - case ArraySection.EmptyArray: - return "(NULL)"; - default: - throw new ArgumentOutOfRangeException("section"); - } - } - -// Type itemType = node.ItemType; -// object[] values = node.GetValues(); -// int count = values.Length; -// if (count==0) -// return "(NULL)"; -// var buffer = new string[count]; -// for (int index = 0; index < count; index++) -// buffer[index] = Translate(context, (SqlLiteral) SqlDml.Literal(values[index], itemType)); -// if (count==1) -// return "(" + buffer[0] + ")"; -// -// buffer[0] = "(" + buffer[0]; -// buffer[count - 1] += ")"; -// return String.Join(RowItemDelimiter, buffer); -// } - - public virtual string Translate(SqlCompilerContext context, SqlAssignment node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "SET"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlBetween node, BetweenSection section) - { - switch (section) { - case BetweenSection.Between: - return Translate(node.NodeType); - case BetweenSection.And: - return "AND"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlBinary node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return (node.NodeType==SqlNodeType.RawConcat) ? string.Empty : OpeningParenthesis; - case NodeSection.Exit: - return (node.NodeType==SqlNodeType.RawConcat) ? string.Empty : ClosingParenthesis; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlBreak node) - { - return "BREAK"; - } - - public virtual string Translate(SqlCompilerContext context, SqlCase node, CaseSection section) - { - switch (section) { - case CaseSection.Entry: - return "(CASE"; - case CaseSection.Else: - return "ELSE"; - case CaseSection.Exit: - return "END)"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlCase node, SqlExpression item, CaseSection section) - { - switch (section) { - case CaseSection.When: - return "WHEN"; - case CaseSection.Then: - return "THEN"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "CAST("; - case NodeSection.Exit: - return " AS " + Translate(node.Type) + ")"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlCloseCursor node) - { - return "CLOSE " + node.Cursor.Name; - } - - public virtual string Translate(SqlCompilerContext context, SqlCollate node, NodeSection section) - { - switch (section) { - case NodeSection.Exit: - return "COLLATE " + node.Collation.DbName; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlColumnRef node, ColumnSection section) - { - switch (section) { - case ColumnSection.Entry: - return QuoteIdentifier(node.Name); - case ColumnSection.AliasDeclaration: - return (string.IsNullOrEmpty(node.Name)) ? string.Empty : "AS " + QuoteIdentifier(node.Name); - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlConcat node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "("; - case NodeSection.Exit: - return ")"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlContinue node) - { - return "CONTINUE"; - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateAssertion node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "CREATE ASSERTION " + Translate(context, node.Assertion) + " CHECK"; - case NodeSection.Exit: - StringBuilder sb = new StringBuilder(); - if (node.Assertion.IsDeferrable.HasValue) { - if (node.Assertion.IsDeferrable.Value) - sb.Append(" DEFERRABLE"); - else - sb.Append(" NOT DEFERRABLE"); - } - if (node.Assertion.IsInitiallyDeferred.HasValue) { - if (node.Assertion.IsInitiallyDeferred.Value) - sb.Append(" INITIALLY DEFERRED"); - else - sb.Append(" INITIALLY IMMEDIATE"); - } - return sb.ToString(); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateCharacterSet node) - { - StringBuilder sb = new StringBuilder(); - // sb.Append("CREATE CHARACTER SET "+Translate(node.CharacterSet)); - // sb.Append(" AS GET "+Translate(node.CharacterSet.CharacterSetSource)); - // if (node.CharacterSet.Collate!=null) - // sb.Append(" COLLATE "+Translate(node.CharacterSet.Collate)); - // else if (node.CharacterSet.CollationSource!=null) { - // sb.Append(" COLLATION FROM "); - // if (node.CharacterSet.CollationSource is IDefaultCollation) - // sb.Append("DEFAULT"); - // else if (node.CharacterSet.CollationSource is ICollation) { - // ICollation collationSource = node.CharacterSet.CollationSource as ICollation; - // sb.Append(Translate(collationSource)); - // } - // else if (node.CharacterSet.CollationSource is IDescendingCollation) { - // IDescendingCollation collationSource = node.CharacterSet.CollationSource as IDescendingCollation; - // sb.Append("DESC ("+Translate(collationSource.Collation)+")"); - // } - // else if (node.CharacterSet.CollationSource is IExternalCollation) - // sb.Append("EXTERNAL ("+QuoteString(((IExternalCollation)node.CharacterSet.CollationSource).Name)+")"); - // else if (node.CharacterSet.CollationSource is ITranslationCollation) { - // ITranslationCollation collationSource = node.CharacterSet.CollationSource as ITranslationCollation; - // sb.Append("TRANSLATION "+Translate(collationSource.Translation)); - // if (collationSource.ThenCollation!=null) - // sb.Append(" THEN COLLATION "+Translate(collationSource.ThenCollation)); - // } - // } - return sb.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateCollation node) - { - StringBuilder sb = new StringBuilder(); - // sb.Append("CREATE COLLATION "+Translate(node.Collation)); - // sb.Append(" FOR "+Translate(node.Collation.CharacterSet)); - // sb.Append(" FROM "); - // if (node.Collation.CollationSource is IDefaultCollation) - // sb.Append("DEFAULT"); - // else if (node.Collation.CollationSource is ICollation) { - // ICollation collationSource = node.Collation.CollationSource as ICollation; - // sb.Append(Translate(collationSource)); - // } - // else if (node.Collation.CollationSource is IDescendingCollation) { - // IDescendingCollation collationSource = node.Collation.CollationSource as IDescendingCollation; - // sb.Append("DESC ("+Translate(collationSource.Collation)+")"); - // } - // else if (node.Collation.CollationSource is IExternalCollation) - // sb.Append("EXTERNAL ("+QuoteString(((IExternalCollation)node.Collation.CollationSource).Name)+")"); - // else if (node.Collation.CollationSource is ITranslationCollation) { - // ITranslationCollation collationSource = node.Collation.CollationSource as ITranslationCollation; - // sb.Append("TRANSLATION "+Translate(collationSource.Translation)); - // if (collationSource.ThenCollation!=null) - // sb.Append(" THEN COLLATION "+Translate(collationSource.ThenCollation)); - // } - // if (node.Collation.PadSpace.HasValue) { - // if (node.Collation.PadSpace.Value) - // sb.Append(" PAD SPACE"); - // else - // sb.Append(" NO PAD"); - // } - return sb.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateDomain node, CreateDomainSection section) - { - switch (section) { - case CreateDomainSection.Entry: - var sb = new StringBuilder(); - sb.Append("CREATE DOMAIN " + Translate(context, node.Domain)); - sb.Append(" AS " + Translate(node.Domain.DataType)); - return sb.ToString(); - case CreateDomainSection.DomainDefaultValue: - return "DEFAULT"; - case CreateDomainSection.DomainCollate: - return "COLLATE " + Translate(node.Domain.Collation); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) - { - switch (section) { - case CreateIndexSection.Entry: - Index index = node.Index; - if (index.IsFullText) { - return "CREATE FULLTEXT INDEX ON " + Translate(context, index.DataTable); - } - var builder = new StringBuilder(); - builder.Append("CREATE "); - if (index.IsUnique) - builder.Append("UNIQUE "); - else if (index.IsBitmap) - builder.Append("BITMAP "); - else if (index.IsSpatial) - builder.Append("SPATIAL "); - if (Driver.ServerInfo.Index.Features.Supports(IndexFeatures.Clustered)) - if (index.IsClustered) - builder.Append("CLUSTERED "); - builder.Append("INDEX " + QuoteIdentifier(index.DbName)); - builder.Append(" ON " + Translate(context, index.DataTable)); - return builder.ToString(); - case CreateIndexSection.ColumnsEnter: - return "("; - case CreateIndexSection.ColumnsExit: - return ")"; - case CreateIndexSection.NonkeyColumnsEnter: - return " INCLUDE ("; - case CreateIndexSection.NonkeyColumnsExit: - return ")"; - case CreateIndexSection.Where: - return " WHERE"; - case CreateIndexSection.Exit: - index = node.Index; - builder = new StringBuilder(); - if (index.FillFactor.HasValue) { - builder.Append(" WITH (FILLFACTOR = " + index.FillFactor.Value + ")"); - } - if (index.PartitionDescriptor != null) { - builder.Append(" " + Translate(index.PartitionDescriptor, true)); - } - else if (!String.IsNullOrEmpty(index.Filegroup)) - builder.Append(" ON " + index.Filegroup); - else if (index is FullTextIndex) { - var ftindex = index as FullTextIndex; - builder.Append(" KEY INDEX " + QuoteIdentifier(ftindex.UnderlyingUniqueIndex)); - } - return builder.ToString(); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreatePartitionFunction node) - { - PartitionFunction pf = node.PartitionFunction; - StringBuilder sb = new StringBuilder(); - sb.Append("CREATE PARTITION FUNCTION " + QuoteIdentifier(pf.DbName)); - sb.Append(" (" + Translate(pf.DataType) + ")"); - sb.Append(" AS RANGE "); - if (pf.BoundaryType == BoundaryType.Left) - sb.Append("LEFT"); - else - sb.Append("RIGHT"); - sb.Append(" FOR VALUES ("); - bool first = true; - foreach (string value in pf.BoundaryValues) { - if (first) - first = false; - else - sb.Append(RowItemDelimiter); - TypeCode t = Type.GetTypeCode(value.GetType()); - if (t == TypeCode.String || t == TypeCode.Char) - sb.Append(QuoteString(value)); - else - sb.Append(value); - } - sb.Append(")"); - return sb.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlCreatePartitionScheme node) - { - PartitionSchema ps = node.PartitionSchema; - var sb = new StringBuilder(); - sb.Append("CREATE PARTITION SCHEME " + QuoteIdentifier(ps.DbName)); - sb.Append(" AS PARTITION " + QuoteIdentifier(ps.PartitionFunction.DbName)); - if (ps.Filegroups.Count <= 1) - sb.Append(" ALL"); - sb.Append(" TO ("); - bool first = true; - foreach (string filegroup in ps.Filegroups) { - if (first) - first = false; - else - sb.Append(RowItemDelimiter); - sb.Append(filegroup); - } - sb.Append(")"); - return sb.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateSchema node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - var sb = new StringBuilder(); - sb.Append("CREATE SCHEMA "); - if (!String.IsNullOrEmpty(node.Schema.DbName)) - sb.Append(QuoteIdentifier(node.Schema.DbName) + (node.Schema.Owner == null ? "" : " ")); - if (node.Schema.Owner != null) - sb.Append("AUTHORIZATION " + QuoteIdentifier(node.Schema.Owner)); - if (node.Schema.DefaultCharacterSet != null) - sb.Append("DEFAULT CHARACTER SET " + Translate(context, node.Schema.DefaultCharacterSet)); - return sb.ToString(); - default: - return String.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateSequence node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return - "CREATE SEQUENCE " + Translate(context, node.Sequence); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) - { - switch (section) { - case CreateTableSection.Entry: { - var sb = new StringBuilder(); - sb.Append("CREATE "); - var temporaryTable = node.Table as TemporaryTable; - if (temporaryTable != null) { - if (temporaryTable.IsGlobal) - sb.Append("GLOBAL "); - else - sb.Append("LOCAL "); - sb.Append("TEMPORARY "); - } - sb.Append("TABLE " + Translate(context, node.Table)); - return sb.ToString(); - } - case CreateTableSection.TableElementsEntry: - return "("; - case CreateTableSection.TableElementsExit: - return ")"; - case CreateTableSection.Partition: - return Translate(node.Table.PartitionDescriptor, true); - case CreateTableSection.Exit: { - string result = string.IsNullOrEmpty(node.Table.Filegroup) - ? string.Empty - : " ON " + QuoteIdentifier(node.Table.Filegroup); - var temporaryTable = node.Table as TemporaryTable; - if (temporaryTable != null) { - result += temporaryTable.PreserveRows ? "ON COMMIT PRESERVE ROWS" : "ON COMMIT DELETE ROWS"; - } - return result; - } - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) - { - return TranslateSequenceDescriptorDefault(context, descriptor, section); - } - - protected string TranslateSequenceDescriptorDefault(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) - { - switch (section) { - case SequenceDescriptorSection.StartValue: - if (descriptor.StartValue.HasValue) - return "START WITH " + descriptor.StartValue.Value; - return string.Empty; - case SequenceDescriptorSection.RestartValue: - if (descriptor.StartValue.HasValue) - return "RESTART WITH " + descriptor.StartValue.Value; - return string.Empty; - case SequenceDescriptorSection.Increment: - if (descriptor.Increment.HasValue) - return "INCREMENT BY " + descriptor.Increment.Value; - return string.Empty; - case SequenceDescriptorSection.MaxValue: - if (descriptor.MaxValue.HasValue) - return "MAXVALUE " + descriptor.MaxValue.Value; - return string.Empty; - case SequenceDescriptorSection.MinValue: - if (descriptor.MinValue.HasValue) - return "MINVALUE " + descriptor.MinValue.Value; - return string.Empty; - case SequenceDescriptorSection.AlterMaxValue: - return descriptor.MaxValue.HasValue ? "MAXVALUE " + descriptor.MaxValue.Value : "NO MAXVALUE"; - case SequenceDescriptorSection.AlterMinValue: - return descriptor.MinValue.HasValue ? "MINVALUE " + descriptor.MinValue.Value : "NO MINVALUE"; - case SequenceDescriptorSection.IsCyclic: - if (descriptor.IsCyclic.HasValue) - return descriptor.IsCyclic.Value ? "CYCLE" : "NO CYCLE"; - return string.Empty; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateTranslation node) - { - var sb = new StringBuilder(); - // sb.Append("CREATE TRANSLATION "+Translate(node.Translation)); - // sb.Append(" FOR "+Translate(node.Translation.SourceCharacterSet)); - // sb.Append(" TO "+Translate(node.Translation.SourceCharacterSet)+" FROM "); - // if (node.Translation.TranslationSource is IIdentityTranslation) - // sb.Append("IDENTITY"); - // else if (node.Translation.TranslationSource is IExternalTranslation) - // sb.Append("EXTERNAL ("+QuoteString(((IExternalTranslation)node.Translation.TranslationSource).Name)+")"); - // else if (node.Translation.TranslationSource is ITranslation) - // sb.Append(Translate((ITranslation)node.Translation.TranslationSource)); - return sb.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlCreateView node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - var sb = new StringBuilder(); - sb.Append("CREATE VIEW " + Translate(context, node.View)); - if (node.View.ViewColumns.Count > 0) { - sb.Append(" ("); - bool first = true; - foreach (DataTableColumn c in node.View.ViewColumns) { - if (first) - first = false; - else - sb.Append(ColumnDelimiter); - sb.Append(c.DbName); - } - sb.Append(")"); - } - sb.Append(" AS"); - return sb.ToString(); - case NodeSection.Exit: - switch (node.View.CheckOptions) { - case CheckOptions.Cascaded: - return "WITH CASCADED CHECK OPTION"; - case CheckOptions.Local: - return "WITH LOCAL CHECK OPTION"; - default: - return string.Empty; - } - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlCursor node) - { - return node.Name; - } - - public virtual string Translate(SqlCompilerContext context, SqlDeclareCursor node, DeclareCursorSection section) - { - switch (section) { - case DeclareCursorSection.Entry: - return "DECLARE " + node.Cursor.Name; - case DeclareCursorSection.Sensivity: - return (node.Cursor.Insensitive ? "INSENSITIVE " : string.Empty); - case DeclareCursorSection.Scrollability: - return (node.Cursor.Scroll ? "SCROLL " : string.Empty); - case DeclareCursorSection.Cursor: - return "CURSOR "; - case DeclareCursorSection.For: - return "FOR"; - case DeclareCursorSection.Holdability: - return (node.Cursor.WithHold ? "WITH HOLD " : "WITHOUT HOLD "); - case DeclareCursorSection.Returnability: - return (node.Cursor.WithReturn ? "WITH RETURN " : "WITHOUT RETURN "); - case DeclareCursorSection.Updatability: - return (node.Cursor.ReadOnly) ? "FOR READ ONLY" : "FOR UPDATE"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlDeclareVariable node) - { - return "DECLARE @" + node.Variable.Name + " AS " + Translate(node.Variable.Type); - } - - public virtual string Translate(SqlCompilerContext context, SqlDefaultValue node) - { - return "DEFAULT"; - } - - public virtual string Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) - { - switch (section) { - case DeleteSection.Entry: - return "DELETE FROM"; - case DeleteSection.From: - return "FROM"; - case DeleteSection.Where: - return "WHERE"; - case DeleteSection.Limit: - return "LIMIT"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlDropAssertion node) - { - return "DROP ASSERTION " + Translate(context, node.Assertion); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropCharacterSet node) - { - return "DROP CHARACTER SET " + Translate(context, node.CharacterSet); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropCollation node) - { - return "DROP COLLATION " + Translate(context, node.Collation); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropDomain node) - { - return "DROP DOMAIN " + Translate(context, node.Domain) + (node.Cascade ? " CASCADE" : " RESTRICT"); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropIndex node) - { - if (!node.Index.IsFullText) - return "DROP INDEX " + QuoteIdentifier(node.Index.DbName) + " ON " + Translate(context, node.Index.DataTable); - else - return "DROP FULLTEXT INDEX ON " + Translate(context, node.Index.DataTable); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropPartitionFunction node) - { - return "DROP PARTITION FUNCTION " + QuoteIdentifier(node.PartitionFunction.DbName); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropPartitionScheme node) - { - return "DROP PARTITION SCHEME " + QuoteIdentifier(node.PartitionSchema.DbName); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropSchema node) - { - return "DROP SCHEMA " + QuoteIdentifier(node.Schema.DbName) + (node.Cascade ? " CASCADE" : " RESTRICT"); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropSequence node) - { - return "DROP SEQUENCE " + Translate(context, node.Sequence) + (node.Cascade ? " CASCADE" : " RESTRICT"); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropTable node) - { - return "DROP TABLE " + Translate(context, node.Table) + (node.Cascade ? " CASCADE" : " RESTRICT"); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropTranslation node) - { - return "DROP TRANSLATION " + Translate(context, node.Translation); - } - - public virtual string Translate(SqlCompilerContext context, SqlDropView node) - { - return "DROP VIEW " + Translate(context, node.View) + (node.Cascade ? " CASCADE" : " RESTRICT"); - } - - public virtual string Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) - { - switch (section) { - case FetchSection.Entry: - return "FETCH " + node.Option; - case FetchSection.Targets: - return "FROM " + node.Cursor.Name + ((node.Targets.Count != 0) ? " INTO" : string.Empty); - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) - { - switch (section) { - case FunctionCallSection.Entry: - switch(node.FunctionType) { - case SqlFunctionType.CurrentUser: - case SqlFunctionType.SessionUser: - case SqlFunctionType.SystemUser: - case SqlFunctionType.User: - return Translate(node.FunctionType); - } - if (node.FunctionType==SqlFunctionType.Position && Driver.ServerInfo.StringIndexingBase > 0) - return "(" + Translate(node.FunctionType) + "("; - return (node.Arguments.Count == 0) ? Translate(node.FunctionType) + "()" : Translate(node.FunctionType) + "("; - case FunctionCallSection.ArgumentEntry: - switch (node.FunctionType) { - case SqlFunctionType.Position: - return position == 1 ? "IN" : string.Empty; - case SqlFunctionType.Substring: - switch (position) { - case 1: - return "FROM"; - case 2: - return "FOR"; - default: - return string.Empty; - } - default: - return string.Empty; - } - case FunctionCallSection.ArgumentExit: - if (node.FunctionType==SqlFunctionType.Substring && position == 1) - return Driver.ServerInfo.StringIndexingBase > 0 ? "+ " + Driver.ServerInfo.StringIndexingBase : string.Empty; - break; - case FunctionCallSection.ArgumentDelimiter: - switch(node.FunctionType) { - case SqlFunctionType.Position: - case SqlFunctionType.Substring: - return String.Empty; - default: - return ArgumentDelimiter; - } - case FunctionCallSection.Exit: - if (node.FunctionType==SqlFunctionType.Position && Driver.ServerInfo.StringIndexingBase > 0) - return - ") - " + Driver.ServerInfo.StringIndexingBase + ")"; - return (node.Arguments.Count != 0) ? ")" : string.Empty; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlExtract extract, ExtractSection section) - { - switch (section) { - case ExtractSection.Entry: - return "EXTRACT("; - case ExtractSection.From: - return "FROM"; - case ExtractSection.Exit: - return ")"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, SqlIf node, IfSection section) - { - switch (section) { - case IfSection.Entry: - return "IF"; - case IfSection.True: - return "BEGIN"; - case IfSection.False: - return "END BEGIN"; - case IfSection.Exit: - return "END"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) - { - switch (section) { - case InsertSection.Entry: - return "INSERT INTO"; - case InsertSection.ColumnsEntry: - return (node.Values.Keys.Count > 0) ? "(" : string.Empty; - case InsertSection.ColumnsExit: - return (node.Values.Keys.Count > 0) ? ")" : string.Empty; - case InsertSection.From: - return "FROM"; - case InsertSection.ValuesEntry: - return "VALUES ("; - case InsertSection.ValuesExit: - return ")"; - case InsertSection.DefaultValues: - return "DEFAULT VALUES"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlJoinExpression node, JoinSection section) - { - var traversalPath = context.GetTraversalPath().Skip(1); - var explicitJoinOrder = - Driver.ServerInfo.Query.Features.Supports(QueryFeatures.ExplicitJoinOrder) - && traversalPath.FirstOrDefault() is SqlJoinExpression; - switch (section) { - case JoinSection.Entry: - return explicitJoinOrder ? "(" : string.Empty; - case JoinSection.Specification: - bool isNatural = node.Expression.IsNullReference() - && node.JoinType!=SqlJoinType.CrossJoin - && node.JoinType!=SqlJoinType.UnionJoin; - return (isNatural ? "NATURAL " : string.Empty) + Translate(node.JoinType) + " JOIN"; - case JoinSection.Condition: - return - node.JoinType==SqlJoinType.UsingJoin ? "USING" : "ON"; - case JoinSection.Exit: - return explicitJoinOrder ? ")" : string.Empty; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlLike node, LikeSection section) - { - switch (section) { - case LikeSection.Entry: - return "("; - case LikeSection.Exit: - return ")"; - case LikeSection.Like: - return node.Not ? "NOT LIKE" : "LIKE"; - case LikeSection.Escape: - return "ESCAPE"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlCompilerContext context, object literalValue) - { - var literalType = literalValue.GetType(); - switch (Type.GetTypeCode(literalType)) { - case TypeCode.Char: - case TypeCode.String: - return QuoteString(literalValue.ToString()); - case TypeCode.DateTime: - return ((DateTime) literalValue).ToString(DateTimeFormatString, DateTimeFormat); - case TypeCode.Single: - return ((float) literalValue).ToString(FloatFormatString, FloatNumberFormat); - case TypeCode.Double: - return ((double) literalValue).ToString(DoubleFormatString, DoubleNumberFormat); - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Decimal: - return Convert.ToString(literalValue, IntegerNumberFormat); - } - if (literalType == typeof(TimeSpan)) - return SqlHelper.TimeSpanToString(((TimeSpan) literalValue), TimeSpanFormatString); - if (literalType==typeof(Guid) || literalType==typeof(byte[])) - throw new NotSupportedException(string.Format( - Strings.ExTranslationOfLiteralOfTypeXIsNotSupported, literalType.GetShortName())); - return literalValue.ToString(); - } - - public virtual string Translate(SqlCompilerContext context, SqlMatch node, MatchSection section) - { - switch (section) { - case MatchSection.Specification: - return " MATCH " + ((node.Unique) ? "UNIQUE " : string.Empty) + Translate(node.MatchType); - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlNative node) - { - return node.Value; - } - - public virtual string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) - { - switch(section) { - case NodeSection.Entry: - return "NEXT VALUE FOR "; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlNull node) - { - return "NULL"; - } - - public virtual string Translate(SqlCompilerContext context, SqlOpenCursor node) - { - return "OPEN " + node.Cursor.Name; - } - - public virtual string Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) - { - switch (section) { - case NodeSection.Exit: - return (node.Ascending) ? "ASC" : "DESC"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlQueryExpression node, QueryExpressionSection section) - { - switch(section) { - case QueryExpressionSection.All: - return node.All ? " ALL" : string.Empty; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlQueryRef node, TableSection section) - { - switch (section) { - case TableSection.Entry: - return node.Query is SqlFreeTextTable || node.Query is SqlContainsTable ? String.Empty : "("; - case TableSection.Exit: - return node.Query is SqlFreeTextTable || node.Query is SqlContainsTable ? String.Empty : ")"; - case TableSection.AliasDeclaration: - string alias = context.TableNameProvider.GetName(node); - return (string.IsNullOrEmpty(alias)) ? string.Empty : QuoteIdentifier(alias); - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlRow node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "("; - case NodeSection.Exit: - return ")"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlRowNumber node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "ROW_NUMBER() OVER(ORDER BY"; - case NodeSection.Exit: - return ")"; - default: - throw new ArgumentOutOfRangeException("section"); - } - } - - public virtual string Translate(SqlCompilerContext context, SqlRenameTable node) - { - return string.Format("ALTER TABLE {0} RENAME TO {1}", Translate(context, node.Table), QuoteIdentifier(node.NewName)); - } - - public virtual string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.Entry: - return node.Distinct ? "SELECT DISTINCT" : "SELECT"; - case SelectSection.From: - return "FROM"; - case SelectSection.Where: - return "WHERE"; - case SelectSection.GroupBy: - return "GROUP BY"; - case SelectSection.Having: - return "HAVING"; - case SelectSection.OrderBy: - return "ORDER BY"; - case SelectSection.Limit: - return "LIMIT"; - case SelectSection.Offset: - return "OFFSET"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlStatementBlock node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "BEGIN"; - case NodeSection.Exit: - return "End"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlSubQuery node, NodeSection section) - { - switch (section) { - case NodeSection.Entry: - return "("; - case NodeSection.Exit: - return ")"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlTable node, NodeSection section) - { - return QuoteIdentifier(context.TableNameProvider.GetName(node)); - } - - public virtual string Translate(SqlCompilerContext context, SqlTableColumn node, NodeSection section) - { - if ((context.NamingOptions & SqlCompilerNamingOptions.TableQualifiedColumns) == 0) - return (((object)node == (object)node.SqlTable.Asterisk) ? node.Name : QuoteIdentifier(node.Name)); - else - return - Translate(context, node.SqlTable, NodeSection.Entry) + "." + - (((object)node == (object)node.SqlTable.Asterisk) ? node.Name : QuoteIdentifier(node.Name)); - } - - public virtual string Translate(SqlCompilerContext context, SqlTableRef node, TableSection section) - { - switch (section) { - case TableSection.Entry: - return Translate(context, node.DataTable); - case TableSection.AliasDeclaration: - string alias = context.TableNameProvider.GetName(node); - return (alias != node.DataTable.DbName) ? " " + QuoteIdentifier(alias) : string.Empty; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlTrim node, TrimSection section) - { - switch (section) { - case TrimSection.Entry: - return "TRIM("; - case TrimSection.From: - return "FROM"; - case TrimSection.Exit: - return ")"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlUnary node, NodeSection section) - { - var omitParenthesis = - node.NodeType==SqlNodeType.Exists - || node.NodeType==SqlNodeType.All - || node.NodeType==SqlNodeType.Some - || node.NodeType==SqlNodeType.Any; - - var isNullCheck = node.NodeType==SqlNodeType.IsNull || node.NodeType==SqlNodeType.IsNotNull; - var result = string.Empty; - - switch (section) { - case NodeSection.Entry: - if (!omitParenthesis) - result += "("; - if (!isNullCheck) - result += Translate(node.NodeType); - break; - case NodeSection.Exit: - if (isNullCheck) - result += Translate(node.NodeType); - if (!omitParenthesis) - result += ")"; - break; - } - - return result; - } - - public virtual string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - switch (section) { - case UpdateSection.Entry: - return "UPDATE"; - case UpdateSection.Set: - return "SET"; - case UpdateSection.From: - return "FROM"; - case UpdateSection.Where: - return (node.Where is SqlCursor) ? "WHERE CURRENT OF" : "WHERE"; - case UpdateSection.Limit: - return "LIMIT"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlUserColumn node, NodeSection section) - { - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlUserFunctionCall node, FunctionCallSection section, int position) - { - switch (section) { - case FunctionCallSection.Entry: - return node.Name + "("; - case FunctionCallSection.Exit: - return ")"; - } - return Translate(context, node as SqlFunctionCall, section, position); - } - - public virtual string Translate(SqlCompilerContext context, SqlVariable node) - { - return "@" + node.Name; - } - - public virtual string Translate(SqlCompilerContext context, SqlWhile node, WhileSection section) - { - switch (section) { - case WhileSection.Entry: - return "WHILE ("; - case WhileSection.Statement: - return ") BEGIN"; - case WhileSection.Exit: - return "END"; - } - return string.Empty; - } - - public virtual string Translate(SqlCompilerContext context, SqlCommand node) - { - switch (node.CommandType) { - case SqlCommandType.SetConstraintsAllDeferred: - return "SET CONSTRAINTS ALL DEFERRED"; - case SqlCommandType.SetConstraintsAllImmediate: - return "SET CONSTRAINTS ALL IMMEDIATE"; - default: - throw new NotSupportedException(string.Format(Strings.ExOperationXIsNotSupported, node.CommandType)); - } - } - - public virtual string Translate(SqlNodeType type) - { - switch (type) { - case SqlNodeType.All: - return "ALL"; - case SqlNodeType.Any: - return "ANY"; - case SqlNodeType.Some: - return "SOME"; - case SqlNodeType.Exists: - return "EXISTS"; - case SqlNodeType.BitAnd: - return "&"; - case SqlNodeType.BitNot: - return "~"; - case SqlNodeType.BitOr: - return "|"; - case SqlNodeType.BitXor: - return "^"; - case SqlNodeType.In: - return "IN"; - case SqlNodeType.Between: - return "BETWEEN"; - case SqlNodeType.And: - return "AND"; - case SqlNodeType.Or: - return "OR"; - case SqlNodeType.IsNull: - return "IS NULL"; - case SqlNodeType.IsNotNull: - return "IS NOT NULL"; - case SqlNodeType.Not: - return "NOT"; - case SqlNodeType.NotBetween: - return "NOT BETWEEN"; - case SqlNodeType.NotIn: - return "NOT IN"; - case SqlNodeType.GreaterThan: - return ">"; - case SqlNodeType.GreaterThanOrEquals: - return ">="; - case SqlNodeType.LessThan: - return "<"; - case SqlNodeType.LessThanOrEquals: - return "<="; - case SqlNodeType.Equals: - case SqlNodeType.Assign: - return "="; - case SqlNodeType.NotEquals: - return "<>"; - case SqlNodeType.Add: - return "+"; - case SqlNodeType.Subtract: - case SqlNodeType.Negate: - return "-"; - case SqlNodeType.Multiply: - return "*"; - case SqlNodeType.Modulo: - return "%"; - case SqlNodeType.Divide: - return "/"; - case SqlNodeType.Avg: - return "AVG"; - case SqlNodeType.Count: - return "COUNT"; - case SqlNodeType.Max: - return "MAX"; - case SqlNodeType.Min: - return "MIN"; - case SqlNodeType.Sum: - return "SUM"; - case SqlNodeType.Concat: - return "||"; - case SqlNodeType.Unique: - return "UNIQUE"; - case SqlNodeType.Union: - return "UNION"; - case SqlNodeType.Intersect: - return "INTERSECT"; - case SqlNodeType.Except: - return "EXCEPT"; - case SqlNodeType.Overlaps: - return "OVERLAPS"; - case SqlNodeType.RawConcat: - return string.Empty; - default: - throw new NotSupportedException(string.Format(Strings.ExOperationXIsNotSupported, type)); - } - } - - public virtual string Translate(SqlJoinType type) - { - switch (type) { - case SqlJoinType.CrossJoin: - return "CROSS"; - case SqlJoinType.FullOuterJoin: - return "FULL OUTER"; - case SqlJoinType.InnerJoin: - return "INNER"; - case SqlJoinType.LeftOuterJoin: - return "LEFT OUTER"; - case SqlJoinType.UnionJoin: - return "UNION"; - case SqlJoinType.RightOuterJoin: - return "RIGHT OUTER"; - case SqlJoinType.CrossApply: - case SqlJoinType.LeftOuterApply: - throw SqlHelper.NotSupported(QueryFeatures.CrossApply); - default: - return string.Empty; - } - } - - public virtual string Translate(SqlMatchType type) - { - switch (type) { - case SqlMatchType.Full: - return "FULL"; - case SqlMatchType.Partial: - return "PARTIAL"; - default: - return string.Empty; - } - } - - private string Translate(PartitionDescriptor partitionDescriptor, bool withOn) - { - if (partitionDescriptor.PartitionSchema != null) - return - (withOn ? "ON " : "") + QuoteIdentifier(partitionDescriptor.PartitionSchema.DbName) + " (" + - QuoteIdentifier(partitionDescriptor.Column.DbName) + ")"; - else { - StringBuilder sb = new StringBuilder(); - sb.Append("PARTITION BY "); - switch (partitionDescriptor.PartitionMethod) { - case PartitionMethod.Hash: - sb.Append("HASH"); - break; - case PartitionMethod.List: - sb.Append("LIST"); - break; - case PartitionMethod.Range: - sb.Append("RANGE"); - break; - } - sb.Append(" (" + QuoteIdentifier(partitionDescriptor.Column.DbName) + ")"); - if (partitionDescriptor.Partitions == null) - sb.Append(" PARTITIONS " + partitionDescriptor.PartitionAmount); - else { - sb.Append(" ("); - bool first = true; - switch (partitionDescriptor.PartitionMethod) { - case PartitionMethod.Hash: - foreach (HashPartition p in partitionDescriptor.Partitions) { - if (first) - first = false; - else - sb.Append(ColumnDelimiter); - sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + - (String.IsNullOrEmpty(p.Filegroup) ? "" : " TABLESPACE " + p.Filegroup)); - } - break; - case PartitionMethod.List: - foreach (ListPartition p in partitionDescriptor.Partitions) { - if (first) - first = false; - else - sb.Append(ColumnDelimiter); - sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + " VALUES ("); - bool firstValue = true; - foreach (string v in p.Values) { - if (firstValue) - firstValue = false; - else - sb.Append(RowItemDelimiter); - TypeCode t = Type.GetTypeCode(v.GetType()); - if (t == TypeCode.String || t == TypeCode.Char) - sb.Append(QuoteString(v)); - else - sb.Append(v); - } - sb.Append(")"); - if (!String.IsNullOrEmpty(p.Filegroup)) - sb.Append(" TABLESPACE " + p.Filegroup); - } - break; - case PartitionMethod.Range: - foreach (RangePartition p in partitionDescriptor.Partitions) { - if (first) - first = false; - else - sb.Append(ColumnDelimiter); - sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + " VALUES LESS THAN ("); - TypeCode t = Type.GetTypeCode(p.Boundary.GetType()); - if (t == TypeCode.String || t == TypeCode.Char) - sb.Append(QuoteString(p.Boundary)); - else - sb.Append(p.Boundary); - sb.Append(")"); - if (!String.IsNullOrEmpty(p.Filegroup)) - sb.Append(" TABLESPACE " + p.Filegroup); - } - break; - } - sb.Append(")"); - } - return sb.ToString(); - } - } - - public virtual string Translate(SqlCompilerContext context, SchemaNode node) - { - var schemaQualified = node.Schema!=null - && Driver.ServerInfo.Query.Features.Supports(QueryFeatures.MultischemaQueries); - - if (!schemaQualified) - return QuoteIdentifier(node.DbName); - - var dbQualified = node.Schema.Catalog!=null - && context.HasOptions(SqlCompilerNamingOptions.DatabaseQualifiedObjects); - var actualizer = context.SqlNodeActualizer; - - return dbQualified - ? QuoteIdentifier(actualizer.Actualize(node.Schema.Catalog), actualizer.Actualize(node.Schema), node.GetDbNameInternal()) - : QuoteIdentifier(actualizer.Actualize(node.Schema), node.DbName); - } - - public virtual string Translate(Collation collation) - { - return QuoteString(collation.DbName); - } - - public virtual string Translate(ReferentialAction action) - { - switch (action) { - case ReferentialAction.Cascade: - return "CASCADE"; - case ReferentialAction.SetDefault: - return "SET DEFAULT"; - case ReferentialAction.SetNull: - return "SET NULL"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlValueType type) - { - if (type.TypeName!=null) - return type.TypeName; - - DataTypeInfo dti = Driver.ServerInfo.DataTypes[type.Type]; - if (dti==null) - throw new NotSupportedException(String.Format(Strings.ExTypeXIsNotSupported, type.Type)); - string text = dti.NativeTypes.First(); - - if (type.Length.HasValue) - return text + "(" + type.Length + ")"; - if (type.Precision.HasValue && type.Scale.HasValue) - return text + "(" + type.Precision + "," + type.Scale + ")"; - if (type.Precision.HasValue) - return text + "(" + type.Precision + ")"; - return text; - } - - public virtual string Translate(SqlFunctionType type) - { - switch (type) { - case SqlFunctionType.CharLength: - case SqlFunctionType.BinaryLength: - return "LENGTH"; - case SqlFunctionType.Concat: - return "CONCAT"; - case SqlFunctionType.CurrentDate: - return "CURRENT_DATE"; - case SqlFunctionType.CurrentTime: - return "CURRENT_TIME"; - case SqlFunctionType.CurrentTimeStamp: - return "CURRENT_TIMESTAMP"; - case SqlFunctionType.Lower: - return "LOWER"; - case SqlFunctionType.Position: - return "POSITION"; - case SqlFunctionType.Substring: - return "SUBSTRING"; - case SqlFunctionType.Upper: - return "UPPER"; - case SqlFunctionType.Abs: - return "ABS"; - case SqlFunctionType.Acos: - return "ACOS"; - case SqlFunctionType.Asin: - return "ASIN"; - case SqlFunctionType.Atan: - return "ATAN"; - case SqlFunctionType.Atan2: - return "ATAN2"; - case SqlFunctionType.Ceiling: - return "CEILING"; - case SqlFunctionType.Coalesce: - return "COALESCE"; - case SqlFunctionType.Cos: - return "COS"; - case SqlFunctionType.Cot: - return "COT"; - case SqlFunctionType.CurrentUser: - return "CURRENT_USER"; - case SqlFunctionType.Degrees: - return "DEGREES"; - case SqlFunctionType.Exp: - return "EXP"; - case SqlFunctionType.Floor: - return "FLOOR"; - case SqlFunctionType.Log: - return "LOG"; - case SqlFunctionType.Log10: - return "LOG10"; - case SqlFunctionType.NullIf: - return "NULLIF"; - case SqlFunctionType.Pi: - return "PI"; - case SqlFunctionType.Power: - return "POWER"; - case SqlFunctionType.Radians: - return "RADIANS"; - case SqlFunctionType.Rand: - return "RAND"; - case SqlFunctionType.Replace: - return "REPLACE"; - case SqlFunctionType.Round: - return "ROUND"; - case SqlFunctionType.Truncate: - return "TRUNCATE"; - case SqlFunctionType.SessionUser: - return "SESSION_USER"; - case SqlFunctionType.Sign: - return "SIGN"; - case SqlFunctionType.Sin: - return "SIN"; - case SqlFunctionType.Sqrt: - return "SQRT"; - case SqlFunctionType.Square: - return "SQUARE"; - case SqlFunctionType.SystemUser: - return "SYSTEM_USER"; - case SqlFunctionType.Tan: - return "TAN"; - default: - throw new NotSupportedException(string.Format(Strings.ExFunctionXIsNotSupported, type)); - } - } - - public virtual string Translate(SqlTrimType type) - { - switch (type) { - case SqlTrimType.Leading: - return "LEADING"; - case SqlTrimType.Trailing: - return "TRAILING"; - case SqlTrimType.Both: - return "BOTH"; - default: - return string.Empty; - } - } - - public virtual string Translate(SqlDateTimePart dateTimePart) - { - switch (dateTimePart) { - case SqlDateTimePart.Year: - return "YEAR"; - case SqlDateTimePart.Month: - return "MONTH"; - case SqlDateTimePart.Day: - return "DAY"; - case SqlDateTimePart.Hour: - return "HOUR"; - case SqlDateTimePart.Minute: - return "MINUTE"; - case SqlDateTimePart.Second: - return "SECOND"; - case SqlDateTimePart.Millisecond: - return "MILLISECOND"; - case SqlDateTimePart.Nanosecond: - return "NANOSECOND"; - case SqlDateTimePart.TimeZoneHour: - return "TIMEZONE_HOUR"; - case SqlDateTimePart.TimeZoneMinute: - return "TIMEZONE_MINUTE"; - case SqlDateTimePart.DayOfYear: - return "DAYOFYEAR"; - case SqlDateTimePart.DayOfWeek: - return "DAYOFWEEK"; - default: - throw new ArgumentOutOfRangeException("dateTimePart"); - } - } - - public virtual string Translate(SqlDateTimeOffsetPart dateTimeOffsetPart) - { - switch (dateTimeOffsetPart) { - case SqlDateTimeOffsetPart.Year: - return "YEAR"; - case SqlDateTimeOffsetPart.Month: - return "MONTH"; - case SqlDateTimeOffsetPart.Day: - return "DAY"; - case SqlDateTimeOffsetPart.Hour: - return "HOUR"; - case SqlDateTimeOffsetPart.Minute: - return "MINUTE"; - case SqlDateTimeOffsetPart.Second: - return "SECOND"; - case SqlDateTimeOffsetPart.Millisecond: - return "MILLISECOND"; - case SqlDateTimeOffsetPart.Nanosecond: - return "NANOSECOND"; - case SqlDateTimeOffsetPart.TimeZoneHour: - return "TZoffset"; - case SqlDateTimeOffsetPart.TimeZoneMinute: - return "TZoffset"; - case SqlDateTimeOffsetPart.DayOfYear: - return "DAYOFYEAR"; - case SqlDateTimeOffsetPart.DayOfWeek: - return "WEEKDAY"; - default: - throw new ArgumentOutOfRangeException("dateTimeOffsetPart"); - } - } - - public virtual string Translate(SqlIntervalPart intervalPart) - { - switch (intervalPart) { - case SqlIntervalPart.Day: - return "DAY"; - case SqlIntervalPart.Hour: - return "HOUR"; - case SqlIntervalPart.Minute: - return "MINUTE"; - case SqlIntervalPart.Second: - return "SECOND"; - case SqlIntervalPart.Millisecond: - return "MILLISECOND"; - case SqlIntervalPart.Nanosecond: - return "NANOSECOND"; - default: - throw new ArgumentOutOfRangeException("intervalPart"); - } - } - - public virtual string Translate(SqlLockType lockType) - { - throw new NotSupportedException(string.Format(Strings.ExLockXIsNotSupported, lockType.ToString(true))); - } - - public virtual string Translate(SqlJoinMethod method) - { - return string.Empty; - } - - /// - /// Returns quoted string. - /// - /// Unquoted string. - /// Quoted string. - public virtual string QuoteString(string str) - { - return SqlHelper.QuoteString(str); - } - - /// - /// Returns string holding quoted identifier name. - /// - /// An of unquoted identifier name parts. - /// Quoted identifier name. - public virtual string QuoteIdentifier(params string[] names) - { - return SqlHelper.QuoteIdentifierWithBrackets(names); - } - - /// - /// Builds the batch from specified SQL statements. - /// - /// The statements. - /// String containing the whole batch. - public virtual string BuildBatch(string[] statements) - { - if (statements.Length==0) - return string.Empty; - var expectedLength = BatchBegin.Length + BatchEnd.Length + - statements.Sum(statement => statement.Length + BatchItemDelimiter.Length + NewLine.Length); - var builder = new StringBuilder(expectedLength); - builder.Append(BatchBegin); - foreach (var statement in statements) { - var actualStatement = statement - .TryCutPrefix(BatchBegin) - .TryCutSuffix(BatchEnd) - .TryCutSuffix(NewLine) - .TryCutSuffix(BatchItemDelimiter) - .Trim(); - if (actualStatement.Length==0) - continue; - builder.Append(actualStatement); - builder.Append(BatchItemDelimiter); - builder.Append(NewLine); - } - builder.Append(BatchEnd); - return builder.ToString(); - } - - public virtual string TranslateSortOrder(bool ascending) - { - return ascending ? "ASC" : "DESC"; - } - - /// - /// Initializes a new instance of the class. - /// - /// The driver. - protected SqlTranslator(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Globalization; +using System.Linq; +using System.Text; +using Xtensive.Core; +using Xtensive.Reflection; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Compiler +{ + /// + /// SQL translator. + /// + public abstract class SqlTranslator : SqlDriverBound + { + public DateTimeFormatInfo DateTimeFormat { get; private set; } + public NumberFormatInfo IntegerNumberFormat { get; private set; } + public NumberFormatInfo FloatNumberFormat { get; private set; } + public NumberFormatInfo DoubleNumberFormat { get; private set; } + + public virtual string NewLine { get { return "\r\n"; } } + + public virtual string OpeningParenthesis { get { return "("; } } + public virtual string ClosingParenthesis { get { return ")"; } } + + public virtual string BatchBegin { get { return string.Empty; } } + public virtual string BatchEnd { get { return string.Empty; } } + public virtual string BatchItemDelimiter { get { return ";"; } } + + public virtual string RowBegin { get { return "("; } } + public virtual string RowEnd { get { return ")"; } } + public virtual string RowItemDelimiter { get { return ","; } } + + public virtual string ArgumentDelimiter { get { return ","; } } + public virtual string ColumnDelimiter { get { return ","; } } + public virtual string WhenDelimiter { get { return string.Empty; } } + public virtual string DdlStatementDelimiter { get { return string.Empty; } } + public virtual string HintDelimiter { get { return string.Empty; } } + + /// + /// Gets the float format string. + /// See for details. + /// + public virtual string FloatFormatString { get { return "0.0######"; } } + + /// + /// Gets the double format string. + /// See for details. + /// + public virtual string DoubleFormatString { get { return "0.0##############"; } } + + /// + /// Gets the date time format string. + /// See for details. + /// + public abstract string DateTimeFormatString { get; } + + /// + /// Gets the time span format string. + /// See for details. + /// + public abstract string TimeSpanFormatString { get; } + + /// + /// Gets the parameter prefix. + /// + public string ParameterPrefix { get; private set; } + + /// + /// Initializes this instance. + /// + public virtual void Initialize() + { + IntegerNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); + FloatNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); + DoubleNumberFormat = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); + DateTimeFormat = (DateTimeFormatInfo) CultureInfo.InvariantCulture.DateTimeFormat.Clone(); + + var queryInfo = Driver.ServerInfo.Query; + ParameterPrefix = queryInfo.Features.Supports(QueryFeatures.ParameterPrefix) + ? queryInfo.ParameterPrefix + : string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlAggregate node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return Translate(node.NodeType) + "(" + (node.Distinct ? "DISTINCT" : string.Empty); + case NodeSection.Exit: + return ")"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlAlterDomain node, AlterDomainSection section) + { + switch (section) { + case AlterDomainSection.Entry: + return "ALTER DOMAIN " + Translate(context, node.Domain); + case AlterDomainSection.AddConstraint: + return "ADD"; + case AlterDomainSection.DropConstraint: + return "DROP"; + case AlterDomainSection.SetDefault: + return "SET DEFAULT"; + case AlterDomainSection.DropDefault: + return "DROP DEFAULT"; + default: + return String.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlAlterPartitionFunction node) + { + var builder = new StringBuilder(); + builder.Append("ALTER PARTITION FUNCTION " + QuoteIdentifier(node.PartitionFunction.DbName) + "()"); + if (node.Option == SqlAlterPartitionFunctionOption.Split) + builder.Append(" SPLIT RANGE ("); + else + builder.Append(" MERGE RANGE ("); + builder.Append(node.Boundary + ")"); + return builder.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlAlterPartitionScheme node) + { + return + "ALTER PARTITION SCHEME " + QuoteIdentifier(node.PartitionSchema.DbName) + " NEXT USED" + + (string.IsNullOrEmpty(node.Filegroup) ? "" : " " + node.Filegroup); + } + + public virtual string Translate(SqlCompilerContext context, SqlAlterTable node, AlterTableSection section) + { + switch (section) { + case AlterTableSection.Entry: + return "ALTER TABLE " + Translate(context, node.Table); + case AlterTableSection.AddColumn: + return "ADD COLUMN"; + case AlterTableSection.AlterColumn: + return "ALTER COLUMN"; + case AlterTableSection.DropColumn: + return "DROP COLUMN"; + case AlterTableSection.AddConstraint: + return "ADD"; + case AlterTableSection.DropConstraint: + return "DROP"; + case AlterTableSection.RenameColumn: + return "RENAME COLUMN"; + case AlterTableSection.To: + return "TO"; + case AlterTableSection.DropBehavior: + var cascadableAction = node.Action as SqlCascadableAction; + if (cascadableAction==null) + return string.Empty; + return cascadableAction.Cascade ? "CASCADE" : "RESTRICT"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlAlterSequence node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "ALTER SEQUENCE " + Translate(context, node.Sequence); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, TableColumn column, TableColumnSection section) + { + switch (section) { + case TableColumnSection.Entry: + return QuoteIdentifier(column.DbName); + case TableColumnSection.Type: + return column.Domain==null ? Translate(column.DataType) : Translate(context, column.Domain); + case TableColumnSection.DefaultValue: + return "DEFAULT"; + case TableColumnSection.DropDefault: + return "DROP DEFAULT"; + case TableColumnSection.SetDefault: + return "SET DEFAULT"; + case TableColumnSection.GenerationExpressionExit: + return ")" + (column.IsPersisted ? " PERSISTED" : ""); + case TableColumnSection.SetIdentityInfoElement: + return "SET"; + case TableColumnSection.NotNull: + return "NOT NULL"; + case TableColumnSection.Collate: + return "COLLATE " + Translate(column.Collation); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, Constraint constraint, ConstraintSection section) + { + switch (section) { + case ConstraintSection.Entry: { + if (!String.IsNullOrEmpty(constraint.DbName)) + return "CONSTRAINT " + QuoteIdentifier(constraint.DbName); + return String.Empty; + } + case ConstraintSection.Check: + return "CHECK ("; + case ConstraintSection.PrimaryKey: + return "PRIMARY KEY ("; + case ConstraintSection.Unique: + return "UNIQUE ("; + case ConstraintSection.ForeignKey: + return "FOREIGN KEY ("; + case ConstraintSection.ReferencedColumns: { + var fk = (ForeignKey) constraint; + return ") REFERENCES " + Translate(context, fk.ReferencedColumns[0].DataTable) + " ("; + } + case ConstraintSection.Exit: { + var fk = constraint as ForeignKey; + var sb = new StringBuilder(); + sb.Append(")"); + if (fk != null) { + if (fk.MatchType != SqlMatchType.None) + sb.Append(" MATCH " + Translate(fk.MatchType)); + if (fk.OnUpdate != ReferentialAction.NoAction) + sb.Append(" ON UPDATE " + Translate(fk.OnUpdate)); + if (fk.OnDelete != ReferentialAction.NoAction) + sb.Append(" ON DELETE " + Translate(fk.OnDelete)); + } + if (constraint.IsDeferrable.HasValue) { + if (constraint.IsDeferrable.Value) + sb.Append(" DEFERRABLE"); + else + sb.Append(" NOT DEFERRABLE"); + } + if (constraint.IsInitiallyDeferred.HasValue) { + if (constraint.IsInitiallyDeferred.Value) + sb.Append(" INITIALLY DEFERRED"); + else + sb.Append(" INITIALLY IMMEDIATE"); + } + return sb.ToString(); + } + default: + return String.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlArray node, ArraySection section) + { + switch (section) { + case ArraySection.Entry: + return "("; + case ArraySection.Exit: + return ")"; + case ArraySection.EmptyArray: + return "(NULL)"; + default: + throw new ArgumentOutOfRangeException("section"); + } + } + +// Type itemType = node.ItemType; +// object[] values = node.GetValues(); +// int count = values.Length; +// if (count==0) +// return "(NULL)"; +// var buffer = new string[count]; +// for (int index = 0; index < count; index++) +// buffer[index] = Translate(context, (SqlLiteral) SqlDml.Literal(values[index], itemType)); +// if (count==1) +// return "(" + buffer[0] + ")"; +// +// buffer[0] = "(" + buffer[0]; +// buffer[count - 1] += ")"; +// return String.Join(RowItemDelimiter, buffer); +// } + + public virtual string Translate(SqlCompilerContext context, SqlAssignment node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "SET"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlBetween node, BetweenSection section) + { + switch (section) { + case BetweenSection.Between: + return Translate(node.NodeType); + case BetweenSection.And: + return "AND"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlBinary node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return (node.NodeType==SqlNodeType.RawConcat) ? string.Empty : OpeningParenthesis; + case NodeSection.Exit: + return (node.NodeType==SqlNodeType.RawConcat) ? string.Empty : ClosingParenthesis; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlBreak node) + { + return "BREAK"; + } + + public virtual string Translate(SqlCompilerContext context, SqlCase node, CaseSection section) + { + switch (section) { + case CaseSection.Entry: + return "(CASE"; + case CaseSection.Else: + return "ELSE"; + case CaseSection.Exit: + return "END)"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlCase node, SqlExpression item, CaseSection section) + { + switch (section) { + case CaseSection.When: + return "WHEN"; + case CaseSection.Then: + return "THEN"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlCast node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "CAST("; + case NodeSection.Exit: + return " AS " + Translate(node.Type) + ")"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlCloseCursor node) + { + return "CLOSE " + node.Cursor.Name; + } + + public virtual string Translate(SqlCompilerContext context, SqlCollate node, NodeSection section) + { + switch (section) { + case NodeSection.Exit: + return "COLLATE " + node.Collation.DbName; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlColumnRef node, ColumnSection section) + { + switch (section) { + case ColumnSection.Entry: + return QuoteIdentifier(node.Name); + case ColumnSection.AliasDeclaration: + return (string.IsNullOrEmpty(node.Name)) ? string.Empty : "AS " + QuoteIdentifier(node.Name); + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlConcat node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "("; + case NodeSection.Exit: + return ")"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlContinue node) + { + return "CONTINUE"; + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateAssertion node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "CREATE ASSERTION " + Translate(context, node.Assertion) + " CHECK"; + case NodeSection.Exit: + StringBuilder sb = new StringBuilder(); + if (node.Assertion.IsDeferrable.HasValue) { + if (node.Assertion.IsDeferrable.Value) + sb.Append(" DEFERRABLE"); + else + sb.Append(" NOT DEFERRABLE"); + } + if (node.Assertion.IsInitiallyDeferred.HasValue) { + if (node.Assertion.IsInitiallyDeferred.Value) + sb.Append(" INITIALLY DEFERRED"); + else + sb.Append(" INITIALLY IMMEDIATE"); + } + return sb.ToString(); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateCharacterSet node) + { + StringBuilder sb = new StringBuilder(); + // sb.Append("CREATE CHARACTER SET "+Translate(node.CharacterSet)); + // sb.Append(" AS GET "+Translate(node.CharacterSet.CharacterSetSource)); + // if (node.CharacterSet.Collate!=null) + // sb.Append(" COLLATE "+Translate(node.CharacterSet.Collate)); + // else if (node.CharacterSet.CollationSource!=null) { + // sb.Append(" COLLATION FROM "); + // if (node.CharacterSet.CollationSource is IDefaultCollation) + // sb.Append("DEFAULT"); + // else if (node.CharacterSet.CollationSource is ICollation) { + // ICollation collationSource = node.CharacterSet.CollationSource as ICollation; + // sb.Append(Translate(collationSource)); + // } + // else if (node.CharacterSet.CollationSource is IDescendingCollation) { + // IDescendingCollation collationSource = node.CharacterSet.CollationSource as IDescendingCollation; + // sb.Append("DESC ("+Translate(collationSource.Collation)+")"); + // } + // else if (node.CharacterSet.CollationSource is IExternalCollation) + // sb.Append("EXTERNAL ("+QuoteString(((IExternalCollation)node.CharacterSet.CollationSource).Name)+")"); + // else if (node.CharacterSet.CollationSource is ITranslationCollation) { + // ITranslationCollation collationSource = node.CharacterSet.CollationSource as ITranslationCollation; + // sb.Append("TRANSLATION "+Translate(collationSource.Translation)); + // if (collationSource.ThenCollation!=null) + // sb.Append(" THEN COLLATION "+Translate(collationSource.ThenCollation)); + // } + // } + return sb.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateCollation node) + { + StringBuilder sb = new StringBuilder(); + // sb.Append("CREATE COLLATION "+Translate(node.Collation)); + // sb.Append(" FOR "+Translate(node.Collation.CharacterSet)); + // sb.Append(" FROM "); + // if (node.Collation.CollationSource is IDefaultCollation) + // sb.Append("DEFAULT"); + // else if (node.Collation.CollationSource is ICollation) { + // ICollation collationSource = node.Collation.CollationSource as ICollation; + // sb.Append(Translate(collationSource)); + // } + // else if (node.Collation.CollationSource is IDescendingCollation) { + // IDescendingCollation collationSource = node.Collation.CollationSource as IDescendingCollation; + // sb.Append("DESC ("+Translate(collationSource.Collation)+")"); + // } + // else if (node.Collation.CollationSource is IExternalCollation) + // sb.Append("EXTERNAL ("+QuoteString(((IExternalCollation)node.Collation.CollationSource).Name)+")"); + // else if (node.Collation.CollationSource is ITranslationCollation) { + // ITranslationCollation collationSource = node.Collation.CollationSource as ITranslationCollation; + // sb.Append("TRANSLATION "+Translate(collationSource.Translation)); + // if (collationSource.ThenCollation!=null) + // sb.Append(" THEN COLLATION "+Translate(collationSource.ThenCollation)); + // } + // if (node.Collation.PadSpace.HasValue) { + // if (node.Collation.PadSpace.Value) + // sb.Append(" PAD SPACE"); + // else + // sb.Append(" NO PAD"); + // } + return sb.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateDomain node, CreateDomainSection section) + { + switch (section) { + case CreateDomainSection.Entry: + var sb = new StringBuilder(); + sb.Append("CREATE DOMAIN " + Translate(context, node.Domain)); + sb.Append(" AS " + Translate(node.Domain.DataType)); + return sb.ToString(); + case CreateDomainSection.DomainDefaultValue: + return "DEFAULT"; + case CreateDomainSection.DomainCollate: + return "COLLATE " + Translate(node.Domain.Collation); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) + { + switch (section) { + case CreateIndexSection.Entry: + Index index = node.Index; + if (index.IsFullText) { + return "CREATE FULLTEXT INDEX ON " + Translate(context, index.DataTable); + } + var builder = new StringBuilder(); + builder.Append("CREATE "); + if (index.IsUnique) + builder.Append("UNIQUE "); + else if (index.IsBitmap) + builder.Append("BITMAP "); + else if (index.IsSpatial) + builder.Append("SPATIAL "); + if (Driver.ServerInfo.Index.Features.Supports(IndexFeatures.Clustered)) + if (index.IsClustered) + builder.Append("CLUSTERED "); + builder.Append("INDEX " + QuoteIdentifier(index.DbName)); + builder.Append(" ON " + Translate(context, index.DataTable)); + return builder.ToString(); + case CreateIndexSection.ColumnsEnter: + return "("; + case CreateIndexSection.ColumnsExit: + return ")"; + case CreateIndexSection.NonkeyColumnsEnter: + return " INCLUDE ("; + case CreateIndexSection.NonkeyColumnsExit: + return ")"; + case CreateIndexSection.Where: + return " WHERE"; + case CreateIndexSection.Exit: + index = node.Index; + builder = new StringBuilder(); + if (index.FillFactor.HasValue) { + builder.Append(" WITH (FILLFACTOR = " + index.FillFactor.Value + ")"); + } + if (index.PartitionDescriptor != null) { + builder.Append(" " + Translate(index.PartitionDescriptor, true)); + } + else if (!String.IsNullOrEmpty(index.Filegroup)) + builder.Append(" ON " + index.Filegroup); + else if (index is FullTextIndex) { + var ftindex = index as FullTextIndex; + builder.Append(" KEY INDEX " + QuoteIdentifier(ftindex.UnderlyingUniqueIndex)); + } + return builder.ToString(); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreatePartitionFunction node) + { + PartitionFunction pf = node.PartitionFunction; + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE PARTITION FUNCTION " + QuoteIdentifier(pf.DbName)); + sb.Append(" (" + Translate(pf.DataType) + ")"); + sb.Append(" AS RANGE "); + if (pf.BoundaryType == BoundaryType.Left) + sb.Append("LEFT"); + else + sb.Append("RIGHT"); + sb.Append(" FOR VALUES ("); + bool first = true; + foreach (string value in pf.BoundaryValues) { + if (first) + first = false; + else + sb.Append(RowItemDelimiter); + TypeCode t = Type.GetTypeCode(value.GetType()); + if (t == TypeCode.String || t == TypeCode.Char) + sb.Append(QuoteString(value)); + else + sb.Append(value); + } + sb.Append(")"); + return sb.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlCreatePartitionScheme node) + { + PartitionSchema ps = node.PartitionSchema; + var sb = new StringBuilder(); + sb.Append("CREATE PARTITION SCHEME " + QuoteIdentifier(ps.DbName)); + sb.Append(" AS PARTITION " + QuoteIdentifier(ps.PartitionFunction.DbName)); + if (ps.Filegroups.Count <= 1) + sb.Append(" ALL"); + sb.Append(" TO ("); + bool first = true; + foreach (string filegroup in ps.Filegroups) { + if (first) + first = false; + else + sb.Append(RowItemDelimiter); + sb.Append(filegroup); + } + sb.Append(")"); + return sb.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateSchema node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + var sb = new StringBuilder(); + sb.Append("CREATE SCHEMA "); + if (!String.IsNullOrEmpty(node.Schema.DbName)) + sb.Append(QuoteIdentifier(node.Schema.DbName) + (node.Schema.Owner == null ? "" : " ")); + if (node.Schema.Owner != null) + sb.Append("AUTHORIZATION " + QuoteIdentifier(node.Schema.Owner)); + if (node.Schema.DefaultCharacterSet != null) + sb.Append("DEFAULT CHARACTER SET " + Translate(context, node.Schema.DefaultCharacterSet)); + return sb.ToString(); + default: + return String.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateSequence node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return + "CREATE SEQUENCE " + Translate(context, node.Sequence); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateTable node, CreateTableSection section) + { + switch (section) { + case CreateTableSection.Entry: { + var sb = new StringBuilder(); + sb.Append("CREATE "); + var temporaryTable = node.Table as TemporaryTable; + if (temporaryTable != null) { + if (temporaryTable.IsGlobal) + sb.Append("GLOBAL "); + else + sb.Append("LOCAL "); + sb.Append("TEMPORARY "); + } + sb.Append("TABLE " + Translate(context, node.Table)); + return sb.ToString(); + } + case CreateTableSection.TableElementsEntry: + return "("; + case CreateTableSection.TableElementsExit: + return ")"; + case CreateTableSection.Partition: + return Translate(node.Table.PartitionDescriptor, true); + case CreateTableSection.Exit: { + string result = string.IsNullOrEmpty(node.Table.Filegroup) + ? string.Empty + : " ON " + QuoteIdentifier(node.Table.Filegroup); + var temporaryTable = node.Table as TemporaryTable; + if (temporaryTable != null) { + result += temporaryTable.PreserveRows ? "ON COMMIT PRESERVE ROWS" : "ON COMMIT DELETE ROWS"; + } + return result; + } + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) + { + return TranslateSequenceDescriptorDefault(context, descriptor, section); + } + + protected string TranslateSequenceDescriptorDefault(SqlCompilerContext context, SequenceDescriptor descriptor, SequenceDescriptorSection section) + { + switch (section) { + case SequenceDescriptorSection.StartValue: + if (descriptor.StartValue.HasValue) + return "START WITH " + descriptor.StartValue.Value; + return string.Empty; + case SequenceDescriptorSection.RestartValue: + if (descriptor.StartValue.HasValue) + return "RESTART WITH " + descriptor.StartValue.Value; + return string.Empty; + case SequenceDescriptorSection.Increment: + if (descriptor.Increment.HasValue) + return "INCREMENT BY " + descriptor.Increment.Value; + return string.Empty; + case SequenceDescriptorSection.MaxValue: + if (descriptor.MaxValue.HasValue) + return "MAXVALUE " + descriptor.MaxValue.Value; + return string.Empty; + case SequenceDescriptorSection.MinValue: + if (descriptor.MinValue.HasValue) + return "MINVALUE " + descriptor.MinValue.Value; + return string.Empty; + case SequenceDescriptorSection.AlterMaxValue: + return descriptor.MaxValue.HasValue ? "MAXVALUE " + descriptor.MaxValue.Value : "NO MAXVALUE"; + case SequenceDescriptorSection.AlterMinValue: + return descriptor.MinValue.HasValue ? "MINVALUE " + descriptor.MinValue.Value : "NO MINVALUE"; + case SequenceDescriptorSection.IsCyclic: + if (descriptor.IsCyclic.HasValue) + return descriptor.IsCyclic.Value ? "CYCLE" : "NO CYCLE"; + return string.Empty; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateTranslation node) + { + var sb = new StringBuilder(); + // sb.Append("CREATE TRANSLATION "+Translate(node.Translation)); + // sb.Append(" FOR "+Translate(node.Translation.SourceCharacterSet)); + // sb.Append(" TO "+Translate(node.Translation.SourceCharacterSet)+" FROM "); + // if (node.Translation.TranslationSource is IIdentityTranslation) + // sb.Append("IDENTITY"); + // else if (node.Translation.TranslationSource is IExternalTranslation) + // sb.Append("EXTERNAL ("+QuoteString(((IExternalTranslation)node.Translation.TranslationSource).Name)+")"); + // else if (node.Translation.TranslationSource is ITranslation) + // sb.Append(Translate((ITranslation)node.Translation.TranslationSource)); + return sb.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlCreateView node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + var sb = new StringBuilder(); + sb.Append("CREATE VIEW " + Translate(context, node.View)); + if (node.View.ViewColumns.Count > 0) { + sb.Append(" ("); + bool first = true; + foreach (DataTableColumn c in node.View.ViewColumns) { + if (first) + first = false; + else + sb.Append(ColumnDelimiter); + sb.Append(c.DbName); + } + sb.Append(")"); + } + sb.Append(" AS"); + return sb.ToString(); + case NodeSection.Exit: + switch (node.View.CheckOptions) { + case CheckOptions.Cascaded: + return "WITH CASCADED CHECK OPTION"; + case CheckOptions.Local: + return "WITH LOCAL CHECK OPTION"; + default: + return string.Empty; + } + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlCursor node) + { + return node.Name; + } + + public virtual string Translate(SqlCompilerContext context, SqlDeclareCursor node, DeclareCursorSection section) + { + switch (section) { + case DeclareCursorSection.Entry: + return "DECLARE " + node.Cursor.Name; + case DeclareCursorSection.Sensivity: + return (node.Cursor.Insensitive ? "INSENSITIVE " : string.Empty); + case DeclareCursorSection.Scrollability: + return (node.Cursor.Scroll ? "SCROLL " : string.Empty); + case DeclareCursorSection.Cursor: + return "CURSOR "; + case DeclareCursorSection.For: + return "FOR"; + case DeclareCursorSection.Holdability: + return (node.Cursor.WithHold ? "WITH HOLD " : "WITHOUT HOLD "); + case DeclareCursorSection.Returnability: + return (node.Cursor.WithReturn ? "WITH RETURN " : "WITHOUT RETURN "); + case DeclareCursorSection.Updatability: + return (node.Cursor.ReadOnly) ? "FOR READ ONLY" : "FOR UPDATE"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlDeclareVariable node) + { + return "DECLARE @" + node.Variable.Name + " AS " + Translate(node.Variable.Type); + } + + public virtual string Translate(SqlCompilerContext context, SqlDefaultValue node) + { + return "DEFAULT"; + } + + public virtual string Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) + { + switch (section) { + case DeleteSection.Entry: + return "DELETE FROM"; + case DeleteSection.From: + return "FROM"; + case DeleteSection.Where: + return "WHERE"; + case DeleteSection.Limit: + return "LIMIT"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlDropAssertion node) + { + return "DROP ASSERTION " + Translate(context, node.Assertion); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropCharacterSet node) + { + return "DROP CHARACTER SET " + Translate(context, node.CharacterSet); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropCollation node) + { + return "DROP COLLATION " + Translate(context, node.Collation); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropDomain node) + { + return "DROP DOMAIN " + Translate(context, node.Domain) + (node.Cascade ? " CASCADE" : " RESTRICT"); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropIndex node) + { + if (!node.Index.IsFullText) + return "DROP INDEX " + QuoteIdentifier(node.Index.DbName) + " ON " + Translate(context, node.Index.DataTable); + else + return "DROP FULLTEXT INDEX ON " + Translate(context, node.Index.DataTable); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropPartitionFunction node) + { + return "DROP PARTITION FUNCTION " + QuoteIdentifier(node.PartitionFunction.DbName); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropPartitionScheme node) + { + return "DROP PARTITION SCHEME " + QuoteIdentifier(node.PartitionSchema.DbName); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropSchema node) + { + return "DROP SCHEMA " + QuoteIdentifier(node.Schema.DbName) + (node.Cascade ? " CASCADE" : " RESTRICT"); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropSequence node) + { + return "DROP SEQUENCE " + Translate(context, node.Sequence) + (node.Cascade ? " CASCADE" : " RESTRICT"); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropTable node) + { + return "DROP TABLE " + Translate(context, node.Table) + (node.Cascade ? " CASCADE" : " RESTRICT"); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropTranslation node) + { + return "DROP TRANSLATION " + Translate(context, node.Translation); + } + + public virtual string Translate(SqlCompilerContext context, SqlDropView node) + { + return "DROP VIEW " + Translate(context, node.View) + (node.Cascade ? " CASCADE" : " RESTRICT"); + } + + public virtual string Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) + { + switch (section) { + case FetchSection.Entry: + return "FETCH " + node.Option; + case FetchSection.Targets: + return "FROM " + node.Cursor.Name + ((node.Targets.Count != 0) ? " INTO" : string.Empty); + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlFunctionCall node, FunctionCallSection section, int position) + { + switch (section) { + case FunctionCallSection.Entry: + switch(node.FunctionType) { + case SqlFunctionType.CurrentUser: + case SqlFunctionType.SessionUser: + case SqlFunctionType.SystemUser: + case SqlFunctionType.User: + return Translate(node.FunctionType); + } + if (node.FunctionType==SqlFunctionType.Position && Driver.ServerInfo.StringIndexingBase > 0) + return "(" + Translate(node.FunctionType) + "("; + return (node.Arguments.Count == 0) ? Translate(node.FunctionType) + "()" : Translate(node.FunctionType) + "("; + case FunctionCallSection.ArgumentEntry: + switch (node.FunctionType) { + case SqlFunctionType.Position: + return position == 1 ? "IN" : string.Empty; + case SqlFunctionType.Substring: + switch (position) { + case 1: + return "FROM"; + case 2: + return "FOR"; + default: + return string.Empty; + } + default: + return string.Empty; + } + case FunctionCallSection.ArgumentExit: + if (node.FunctionType==SqlFunctionType.Substring && position == 1) + return Driver.ServerInfo.StringIndexingBase > 0 ? "+ " + Driver.ServerInfo.StringIndexingBase : string.Empty; + break; + case FunctionCallSection.ArgumentDelimiter: + switch(node.FunctionType) { + case SqlFunctionType.Position: + case SqlFunctionType.Substring: + return String.Empty; + default: + return ArgumentDelimiter; + } + case FunctionCallSection.Exit: + if (node.FunctionType==SqlFunctionType.Position && Driver.ServerInfo.StringIndexingBase > 0) + return + ") - " + Driver.ServerInfo.StringIndexingBase + ")"; + return (node.Arguments.Count != 0) ? ")" : string.Empty; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlExtract extract, ExtractSection section) + { + switch (section) { + case ExtractSection.Entry: + return "EXTRACT("; + case ExtractSection.From: + return "FROM"; + case ExtractSection.Exit: + return ")"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, SqlIf node, IfSection section) + { + switch (section) { + case IfSection.Entry: + return "IF"; + case IfSection.True: + return "BEGIN"; + case IfSection.False: + return "END BEGIN"; + case IfSection.Exit: + return "END"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) + { + switch (section) { + case InsertSection.Entry: + return "INSERT INTO"; + case InsertSection.ColumnsEntry: + return (node.Values.Keys.Count > 0) ? "(" : string.Empty; + case InsertSection.ColumnsExit: + return (node.Values.Keys.Count > 0) ? ")" : string.Empty; + case InsertSection.From: + return "FROM"; + case InsertSection.ValuesEntry: + return "VALUES ("; + case InsertSection.ValuesExit: + return ")"; + case InsertSection.DefaultValues: + return "DEFAULT VALUES"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlJoinExpression node, JoinSection section) + { + var traversalPath = context.GetTraversalPath().Skip(1); + var explicitJoinOrder = + Driver.ServerInfo.Query.Features.Supports(QueryFeatures.ExplicitJoinOrder) + && traversalPath.FirstOrDefault() is SqlJoinExpression; + switch (section) { + case JoinSection.Entry: + return explicitJoinOrder ? "(" : string.Empty; + case JoinSection.Specification: + bool isNatural = node.Expression.IsNullReference() + && node.JoinType!=SqlJoinType.CrossJoin + && node.JoinType!=SqlJoinType.UnionJoin; + return (isNatural ? "NATURAL " : string.Empty) + Translate(node.JoinType) + " JOIN"; + case JoinSection.Condition: + return + node.JoinType==SqlJoinType.UsingJoin ? "USING" : "ON"; + case JoinSection.Exit: + return explicitJoinOrder ? ")" : string.Empty; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlLike node, LikeSection section) + { + switch (section) { + case LikeSection.Entry: + return "("; + case LikeSection.Exit: + return ")"; + case LikeSection.Like: + return node.Not ? "NOT LIKE" : "LIKE"; + case LikeSection.Escape: + return "ESCAPE"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlCompilerContext context, object literalValue) + { + var literalType = literalValue.GetType(); + switch (Type.GetTypeCode(literalType)) { + case TypeCode.Char: + case TypeCode.String: + return QuoteString(literalValue.ToString()); + case TypeCode.DateTime: + return ((DateTime) literalValue).ToString(DateTimeFormatString, DateTimeFormat); + case TypeCode.Single: + return ((float) literalValue).ToString(FloatFormatString, FloatNumberFormat); + case TypeCode.Double: + return ((double) literalValue).ToString(DoubleFormatString, DoubleNumberFormat); + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Decimal: + return Convert.ToString(literalValue, IntegerNumberFormat); + } + if (literalType == typeof(TimeSpan)) + return SqlHelper.TimeSpanToString(((TimeSpan) literalValue), TimeSpanFormatString); + if (literalType==typeof(Guid) || literalType==typeof(byte[])) + throw new NotSupportedException(string.Format( + Strings.ExTranslationOfLiteralOfTypeXIsNotSupported, literalType.GetShortName())); + return literalValue.ToString(); + } + + public virtual string Translate(SqlCompilerContext context, SqlMatch node, MatchSection section) + { + switch (section) { + case MatchSection.Specification: + return " MATCH " + ((node.Unique) ? "UNIQUE " : string.Empty) + Translate(node.MatchType); + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlNative node) + { + return node.Value; + } + + public virtual string Translate(SqlCompilerContext context, SqlNextValue node, NodeSection section) + { + switch(section) { + case NodeSection.Entry: + return "NEXT VALUE FOR "; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlNull node) + { + return "NULL"; + } + + public virtual string Translate(SqlCompilerContext context, SqlOpenCursor node) + { + return "OPEN " + node.Cursor.Name; + } + + public virtual string Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) + { + switch (section) { + case NodeSection.Exit: + return (node.Ascending) ? "ASC" : "DESC"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlQueryExpression node, QueryExpressionSection section) + { + switch(section) { + case QueryExpressionSection.All: + return node.All ? " ALL" : string.Empty; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlQueryRef node, TableSection section) + { + switch (section) { + case TableSection.Entry: + return node.Query is SqlFreeTextTable || node.Query is SqlContainsTable ? String.Empty : "("; + case TableSection.Exit: + return node.Query is SqlFreeTextTable || node.Query is SqlContainsTable ? String.Empty : ")"; + case TableSection.AliasDeclaration: + string alias = context.TableNameProvider.GetName(node); + return (string.IsNullOrEmpty(alias)) ? string.Empty : QuoteIdentifier(alias); + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlRow node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "("; + case NodeSection.Exit: + return ")"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlRowNumber node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "ROW_NUMBER() OVER(ORDER BY"; + case NodeSection.Exit: + return ")"; + default: + throw new ArgumentOutOfRangeException("section"); + } + } + + public virtual string Translate(SqlCompilerContext context, SqlRenameTable node) + { + return string.Format("ALTER TABLE {0} RENAME TO {1}", Translate(context, node.Table), QuoteIdentifier(node.NewName)); + } + + public virtual string Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + { + switch (section) { + case SelectSection.Entry: + return node.Distinct ? "SELECT DISTINCT" : "SELECT"; + case SelectSection.From: + return "FROM"; + case SelectSection.Where: + return "WHERE"; + case SelectSection.GroupBy: + return "GROUP BY"; + case SelectSection.Having: + return "HAVING"; + case SelectSection.OrderBy: + return "ORDER BY"; + case SelectSection.Limit: + return "LIMIT"; + case SelectSection.Offset: + return "OFFSET"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlStatementBlock node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "BEGIN"; + case NodeSection.Exit: + return "End"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlSubQuery node, NodeSection section) + { + switch (section) { + case NodeSection.Entry: + return "("; + case NodeSection.Exit: + return ")"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlTable node, NodeSection section) + { + return QuoteIdentifier(context.TableNameProvider.GetName(node)); + } + + public virtual string Translate(SqlCompilerContext context, SqlTableColumn node, NodeSection section) + { + if ((context.NamingOptions & SqlCompilerNamingOptions.TableQualifiedColumns) == 0) + return (((object)node == (object)node.SqlTable.Asterisk) ? node.Name : QuoteIdentifier(node.Name)); + else + return + Translate(context, node.SqlTable, NodeSection.Entry) + "." + + (((object)node == (object)node.SqlTable.Asterisk) ? node.Name : QuoteIdentifier(node.Name)); + } + + public virtual string Translate(SqlCompilerContext context, SqlTableRef node, TableSection section) + { + switch (section) { + case TableSection.Entry: + return Translate(context, node.DataTable); + case TableSection.AliasDeclaration: + string alias = context.TableNameProvider.GetName(node); + return (alias != node.DataTable.DbName) ? " " + QuoteIdentifier(alias) : string.Empty; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlTrim node, TrimSection section) + { + switch (section) { + case TrimSection.Entry: + return "TRIM("; + case TrimSection.From: + return "FROM"; + case TrimSection.Exit: + return ")"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlUnary node, NodeSection section) + { + var omitParenthesis = + node.NodeType==SqlNodeType.Exists + || node.NodeType==SqlNodeType.All + || node.NodeType==SqlNodeType.Some + || node.NodeType==SqlNodeType.Any; + + var isNullCheck = node.NodeType==SqlNodeType.IsNull || node.NodeType==SqlNodeType.IsNotNull; + var result = string.Empty; + + switch (section) { + case NodeSection.Entry: + if (!omitParenthesis) + result += "("; + if (!isNullCheck) + result += Translate(node.NodeType); + break; + case NodeSection.Exit: + if (isNullCheck) + result += Translate(node.NodeType); + if (!omitParenthesis) + result += ")"; + break; + } + + return result; + } + + public virtual string Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) + { + switch (section) { + case UpdateSection.Entry: + return "UPDATE"; + case UpdateSection.Set: + return "SET"; + case UpdateSection.From: + return "FROM"; + case UpdateSection.Where: + return (node.Where is SqlCursor) ? "WHERE CURRENT OF" : "WHERE"; + case UpdateSection.Limit: + return "LIMIT"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlUserColumn node, NodeSection section) + { + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlUserFunctionCall node, FunctionCallSection section, int position) + { + switch (section) { + case FunctionCallSection.Entry: + return node.Name + "("; + case FunctionCallSection.Exit: + return ")"; + } + return Translate(context, node as SqlFunctionCall, section, position); + } + + public virtual string Translate(SqlCompilerContext context, SqlVariable node) + { + return "@" + node.Name; + } + + public virtual string Translate(SqlCompilerContext context, SqlWhile node, WhileSection section) + { + switch (section) { + case WhileSection.Entry: + return "WHILE ("; + case WhileSection.Statement: + return ") BEGIN"; + case WhileSection.Exit: + return "END"; + } + return string.Empty; + } + + public virtual string Translate(SqlCompilerContext context, SqlCommand node) + { + switch (node.CommandType) { + case SqlCommandType.SetConstraintsAllDeferred: + return "SET CONSTRAINTS ALL DEFERRED"; + case SqlCommandType.SetConstraintsAllImmediate: + return "SET CONSTRAINTS ALL IMMEDIATE"; + default: + throw new NotSupportedException(string.Format(Strings.ExOperationXIsNotSupported, node.CommandType)); + } + } + + public virtual string Translate(SqlNodeType type) + { + switch (type) { + case SqlNodeType.All: + return "ALL"; + case SqlNodeType.Any: + return "ANY"; + case SqlNodeType.Some: + return "SOME"; + case SqlNodeType.Exists: + return "EXISTS"; + case SqlNodeType.BitAnd: + return "&"; + case SqlNodeType.BitNot: + return "~"; + case SqlNodeType.BitOr: + return "|"; + case SqlNodeType.BitXor: + return "^"; + case SqlNodeType.In: + return "IN"; + case SqlNodeType.Between: + return "BETWEEN"; + case SqlNodeType.And: + return "AND"; + case SqlNodeType.Or: + return "OR"; + case SqlNodeType.IsNull: + return "IS NULL"; + case SqlNodeType.IsNotNull: + return "IS NOT NULL"; + case SqlNodeType.Not: + return "NOT"; + case SqlNodeType.NotBetween: + return "NOT BETWEEN"; + case SqlNodeType.NotIn: + return "NOT IN"; + case SqlNodeType.GreaterThan: + return ">"; + case SqlNodeType.GreaterThanOrEquals: + return ">="; + case SqlNodeType.LessThan: + return "<"; + case SqlNodeType.LessThanOrEquals: + return "<="; + case SqlNodeType.Equals: + case SqlNodeType.Assign: + return "="; + case SqlNodeType.NotEquals: + return "<>"; + case SqlNodeType.Add: + return "+"; + case SqlNodeType.Subtract: + case SqlNodeType.Negate: + return "-"; + case SqlNodeType.Multiply: + return "*"; + case SqlNodeType.Modulo: + return "%"; + case SqlNodeType.Divide: + return "/"; + case SqlNodeType.Avg: + return "AVG"; + case SqlNodeType.Count: + return "COUNT"; + case SqlNodeType.Max: + return "MAX"; + case SqlNodeType.Min: + return "MIN"; + case SqlNodeType.Sum: + return "SUM"; + case SqlNodeType.Concat: + return "||"; + case SqlNodeType.Unique: + return "UNIQUE"; + case SqlNodeType.Union: + return "UNION"; + case SqlNodeType.Intersect: + return "INTERSECT"; + case SqlNodeType.Except: + return "EXCEPT"; + case SqlNodeType.Overlaps: + return "OVERLAPS"; + case SqlNodeType.RawConcat: + return string.Empty; + default: + throw new NotSupportedException(string.Format(Strings.ExOperationXIsNotSupported, type)); + } + } + + public virtual string Translate(SqlJoinType type) + { + switch (type) { + case SqlJoinType.CrossJoin: + return "CROSS"; + case SqlJoinType.FullOuterJoin: + return "FULL OUTER"; + case SqlJoinType.InnerJoin: + return "INNER"; + case SqlJoinType.LeftOuterJoin: + return "LEFT OUTER"; + case SqlJoinType.UnionJoin: + return "UNION"; + case SqlJoinType.RightOuterJoin: + return "RIGHT OUTER"; + case SqlJoinType.CrossApply: + case SqlJoinType.LeftOuterApply: + throw SqlHelper.NotSupported(QueryFeatures.CrossApply); + default: + return string.Empty; + } + } + + public virtual string Translate(SqlMatchType type) + { + switch (type) { + case SqlMatchType.Full: + return "FULL"; + case SqlMatchType.Partial: + return "PARTIAL"; + default: + return string.Empty; + } + } + + private string Translate(PartitionDescriptor partitionDescriptor, bool withOn) + { + if (partitionDescriptor.PartitionSchema != null) + return + (withOn ? "ON " : "") + QuoteIdentifier(partitionDescriptor.PartitionSchema.DbName) + " (" + + QuoteIdentifier(partitionDescriptor.Column.DbName) + ")"; + else { + StringBuilder sb = new StringBuilder(); + sb.Append("PARTITION BY "); + switch (partitionDescriptor.PartitionMethod) { + case PartitionMethod.Hash: + sb.Append("HASH"); + break; + case PartitionMethod.List: + sb.Append("LIST"); + break; + case PartitionMethod.Range: + sb.Append("RANGE"); + break; + } + sb.Append(" (" + QuoteIdentifier(partitionDescriptor.Column.DbName) + ")"); + if (partitionDescriptor.Partitions == null) + sb.Append(" PARTITIONS " + partitionDescriptor.PartitionAmount); + else { + sb.Append(" ("); + bool first = true; + switch (partitionDescriptor.PartitionMethod) { + case PartitionMethod.Hash: + foreach (HashPartition p in partitionDescriptor.Partitions) { + if (first) + first = false; + else + sb.Append(ColumnDelimiter); + sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + + (String.IsNullOrEmpty(p.Filegroup) ? "" : " TABLESPACE " + p.Filegroup)); + } + break; + case PartitionMethod.List: + foreach (ListPartition p in partitionDescriptor.Partitions) { + if (first) + first = false; + else + sb.Append(ColumnDelimiter); + sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + " VALUES ("); + bool firstValue = true; + foreach (string v in p.Values) { + if (firstValue) + firstValue = false; + else + sb.Append(RowItemDelimiter); + TypeCode t = Type.GetTypeCode(v.GetType()); + if (t == TypeCode.String || t == TypeCode.Char) + sb.Append(QuoteString(v)); + else + sb.Append(v); + } + sb.Append(")"); + if (!String.IsNullOrEmpty(p.Filegroup)) + sb.Append(" TABLESPACE " + p.Filegroup); + } + break; + case PartitionMethod.Range: + foreach (RangePartition p in partitionDescriptor.Partitions) { + if (first) + first = false; + else + sb.Append(ColumnDelimiter); + sb.Append("PARTITION " + QuoteIdentifier(p.DbName) + " VALUES LESS THAN ("); + TypeCode t = Type.GetTypeCode(p.Boundary.GetType()); + if (t == TypeCode.String || t == TypeCode.Char) + sb.Append(QuoteString(p.Boundary)); + else + sb.Append(p.Boundary); + sb.Append(")"); + if (!String.IsNullOrEmpty(p.Filegroup)) + sb.Append(" TABLESPACE " + p.Filegroup); + } + break; + } + sb.Append(")"); + } + return sb.ToString(); + } + } + + public virtual string Translate(SqlCompilerContext context, SchemaNode node) + { + var schemaQualified = node.Schema!=null + && Driver.ServerInfo.Query.Features.Supports(QueryFeatures.MultischemaQueries); + + if (!schemaQualified) + return QuoteIdentifier(node.DbName); + + var dbQualified = node.Schema.Catalog!=null + && context.HasOptions(SqlCompilerNamingOptions.DatabaseQualifiedObjects); + var actualizer = context.SqlNodeActualizer; + + return dbQualified + ? QuoteIdentifier(actualizer.Actualize(node.Schema.Catalog), actualizer.Actualize(node.Schema), node.GetDbNameInternal()) + : QuoteIdentifier(actualizer.Actualize(node.Schema), node.DbName); + } + + public virtual string Translate(Collation collation) + { + return QuoteString(collation.DbName); + } + + public virtual string Translate(ReferentialAction action) + { + switch (action) { + case ReferentialAction.Cascade: + return "CASCADE"; + case ReferentialAction.SetDefault: + return "SET DEFAULT"; + case ReferentialAction.SetNull: + return "SET NULL"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlValueType type) + { + if (type.TypeName!=null) + return type.TypeName; + + DataTypeInfo dti = Driver.ServerInfo.DataTypes[type.Type]; + if (dti==null) + throw new NotSupportedException(String.Format(Strings.ExTypeXIsNotSupported, type.Type)); + string text = dti.NativeTypes.First(); + + if (type.Length.HasValue) + return text + "(" + type.Length + ")"; + if (type.Precision.HasValue && type.Scale.HasValue) + return text + "(" + type.Precision + "," + type.Scale + ")"; + if (type.Precision.HasValue) + return text + "(" + type.Precision + ")"; + return text; + } + + public virtual string Translate(SqlFunctionType type) + { + switch (type) { + case SqlFunctionType.CharLength: + case SqlFunctionType.BinaryLength: + return "LENGTH"; + case SqlFunctionType.Concat: + return "CONCAT"; + case SqlFunctionType.CurrentDate: + return "CURRENT_DATE"; + case SqlFunctionType.CurrentTime: + return "CURRENT_TIME"; + case SqlFunctionType.CurrentTimeStamp: + return "CURRENT_TIMESTAMP"; + case SqlFunctionType.Lower: + return "LOWER"; + case SqlFunctionType.Position: + return "POSITION"; + case SqlFunctionType.Substring: + return "SUBSTRING"; + case SqlFunctionType.Upper: + return "UPPER"; + case SqlFunctionType.Abs: + return "ABS"; + case SqlFunctionType.Acos: + return "ACOS"; + case SqlFunctionType.Asin: + return "ASIN"; + case SqlFunctionType.Atan: + return "ATAN"; + case SqlFunctionType.Atan2: + return "ATAN2"; + case SqlFunctionType.Ceiling: + return "CEILING"; + case SqlFunctionType.Coalesce: + return "COALESCE"; + case SqlFunctionType.Cos: + return "COS"; + case SqlFunctionType.Cot: + return "COT"; + case SqlFunctionType.CurrentUser: + return "CURRENT_USER"; + case SqlFunctionType.Degrees: + return "DEGREES"; + case SqlFunctionType.Exp: + return "EXP"; + case SqlFunctionType.Floor: + return "FLOOR"; + case SqlFunctionType.Log: + return "LOG"; + case SqlFunctionType.Log10: + return "LOG10"; + case SqlFunctionType.NullIf: + return "NULLIF"; + case SqlFunctionType.Pi: + return "PI"; + case SqlFunctionType.Power: + return "POWER"; + case SqlFunctionType.Radians: + return "RADIANS"; + case SqlFunctionType.Rand: + return "RAND"; + case SqlFunctionType.Replace: + return "REPLACE"; + case SqlFunctionType.Round: + return "ROUND"; + case SqlFunctionType.Truncate: + return "TRUNCATE"; + case SqlFunctionType.SessionUser: + return "SESSION_USER"; + case SqlFunctionType.Sign: + return "SIGN"; + case SqlFunctionType.Sin: + return "SIN"; + case SqlFunctionType.Sqrt: + return "SQRT"; + case SqlFunctionType.Square: + return "SQUARE"; + case SqlFunctionType.SystemUser: + return "SYSTEM_USER"; + case SqlFunctionType.Tan: + return "TAN"; + default: + throw new NotSupportedException(string.Format(Strings.ExFunctionXIsNotSupported, type)); + } + } + + public virtual string Translate(SqlTrimType type) + { + switch (type) { + case SqlTrimType.Leading: + return "LEADING"; + case SqlTrimType.Trailing: + return "TRAILING"; + case SqlTrimType.Both: + return "BOTH"; + default: + return string.Empty; + } + } + + public virtual string Translate(SqlDateTimePart dateTimePart) + { + switch (dateTimePart) { + case SqlDateTimePart.Year: + return "YEAR"; + case SqlDateTimePart.Month: + return "MONTH"; + case SqlDateTimePart.Day: + return "DAY"; + case SqlDateTimePart.Hour: + return "HOUR"; + case SqlDateTimePart.Minute: + return "MINUTE"; + case SqlDateTimePart.Second: + return "SECOND"; + case SqlDateTimePart.Millisecond: + return "MILLISECOND"; + case SqlDateTimePart.Nanosecond: + return "NANOSECOND"; + case SqlDateTimePart.TimeZoneHour: + return "TIMEZONE_HOUR"; + case SqlDateTimePart.TimeZoneMinute: + return "TIMEZONE_MINUTE"; + case SqlDateTimePart.DayOfYear: + return "DAYOFYEAR"; + case SqlDateTimePart.DayOfWeek: + return "DAYOFWEEK"; + default: + throw new ArgumentOutOfRangeException("dateTimePart"); + } + } + + public virtual string Translate(SqlDateTimeOffsetPart dateTimeOffsetPart) + { + switch (dateTimeOffsetPart) { + case SqlDateTimeOffsetPart.Year: + return "YEAR"; + case SqlDateTimeOffsetPart.Month: + return "MONTH"; + case SqlDateTimeOffsetPart.Day: + return "DAY"; + case SqlDateTimeOffsetPart.Hour: + return "HOUR"; + case SqlDateTimeOffsetPart.Minute: + return "MINUTE"; + case SqlDateTimeOffsetPart.Second: + return "SECOND"; + case SqlDateTimeOffsetPart.Millisecond: + return "MILLISECOND"; + case SqlDateTimeOffsetPart.Nanosecond: + return "NANOSECOND"; + case SqlDateTimeOffsetPart.TimeZoneHour: + return "TZoffset"; + case SqlDateTimeOffsetPart.TimeZoneMinute: + return "TZoffset"; + case SqlDateTimeOffsetPart.DayOfYear: + return "DAYOFYEAR"; + case SqlDateTimeOffsetPart.DayOfWeek: + return "WEEKDAY"; + default: + throw new ArgumentOutOfRangeException("dateTimeOffsetPart"); + } + } + + public virtual string Translate(SqlIntervalPart intervalPart) + { + switch (intervalPart) { + case SqlIntervalPart.Day: + return "DAY"; + case SqlIntervalPart.Hour: + return "HOUR"; + case SqlIntervalPart.Minute: + return "MINUTE"; + case SqlIntervalPart.Second: + return "SECOND"; + case SqlIntervalPart.Millisecond: + return "MILLISECOND"; + case SqlIntervalPart.Nanosecond: + return "NANOSECOND"; + default: + throw new ArgumentOutOfRangeException("intervalPart"); + } + } + + public virtual string Translate(SqlLockType lockType) + { + throw new NotSupportedException(string.Format(Strings.ExLockXIsNotSupported, lockType.ToString(true))); + } + + public virtual string Translate(SqlJoinMethod method) + { + return string.Empty; + } + + /// + /// Returns quoted string. + /// + /// Unquoted string. + /// Quoted string. + public virtual string QuoteString(string str) + { + return SqlHelper.QuoteString(str); + } + + /// + /// Returns string holding quoted identifier name. + /// + /// An of unquoted identifier name parts. + /// Quoted identifier name. + public virtual string QuoteIdentifier(params string[] names) + { + return SqlHelper.QuoteIdentifierWithBrackets(names); + } + + /// + /// Builds the batch from specified SQL statements. + /// + /// The statements. + /// String containing the whole batch. + public virtual string BuildBatch(string[] statements) + { + if (statements.Length==0) + return string.Empty; + var expectedLength = BatchBegin.Length + BatchEnd.Length + + statements.Sum(statement => statement.Length + BatchItemDelimiter.Length + NewLine.Length); + var builder = new StringBuilder(expectedLength); + builder.Append(BatchBegin); + foreach (var statement in statements) { + var actualStatement = statement + .TryCutPrefix(BatchBegin) + .TryCutSuffix(BatchEnd) + .TryCutSuffix(NewLine) + .TryCutSuffix(BatchItemDelimiter) + .Trim(); + if (actualStatement.Length==0) + continue; + builder.Append(actualStatement); + builder.Append(BatchItemDelimiter); + builder.Append(NewLine); + } + builder.Append(BatchEnd); + return builder.ToString(); + } + + public virtual string TranslateSortOrder(bool ascending) + { + return ascending ? "ASC" : "DESC"; + } + + /// + /// Initializes a new instance of the class. + /// + /// The driver. + protected SqlTranslator(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAction.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAction.cs index 0dc5caffa4..4d14e86679 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAction.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAction.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public abstract class SqlAction : SqlNode - { - public override void AcceptVisitor(ISqlVisitor visitor) - { - throw new NotSupportedException(); - } - - // Constructors - - protected SqlAction() : base(SqlNodeType.Action) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public abstract class SqlAction : SqlNode + { + public override void AcceptVisitor(ISqlVisitor visitor) + { + throw new NotSupportedException(); + } + + // Constructors + + protected SqlAction() : base(SqlNodeType.Action) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddColumn.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddColumn.cs index 689fc8ba28..7f01dce51a 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddColumn.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAddColumn : SqlAction - { - public TableColumn Column { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlAddColumn(Column); - context.NodeMapping[this] = clone; - - return clone; - } - - // Constructors - - internal SqlAddColumn(TableColumn column) - { - Column = column; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAddColumn : SqlAction + { + public TableColumn Column { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlAddColumn(Column); + context.NodeMapping[this] = clone; + + return clone; + } + + // Constructors + + internal SqlAddColumn(TableColumn column) + { + Column = column; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddConstraint.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddConstraint.cs index 90c87f0eab..1bfbe08e03 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAddConstraint.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAddConstraint : SqlAction - { - public Constraint Constraint { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlAddConstraint(Constraint); - context.NodeMapping[this] = clone; - - return clone; - } - - // Constructors - - internal SqlAddConstraint(Constraint constraint) - { - Constraint = constraint; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAddConstraint : SqlAction + { + public Constraint Constraint { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlAddConstraint(Constraint); + context.NodeMapping[this] = clone; + + return clone; + } + + // Constructors + + internal SqlAddConstraint(Constraint constraint) + { + Constraint = constraint; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAlterIdentityInfo.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAlterIdentityInfo.cs index ff6edaf013..16d36b5561 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAlterIdentityInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlAlterIdentityInfo.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterIdentityInfo : SqlAction - { - public TableColumn Column { get; private set; } - public SequenceDescriptor SequenceDescriptor { get; set; } - public SqlAlterIdentityInfoOptions InfoOption { get; set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlAlterIdentityInfo(Column, (SequenceDescriptor) SequenceDescriptor.Clone(), InfoOption); - context.NodeMapping[this] = clone; - - return clone; - } - - internal SqlAlterIdentityInfo(TableColumn column, SequenceDescriptor sequenceDescriptor, SqlAlterIdentityInfoOptions infoOption) - { - Column = column; - SequenceDescriptor = sequenceDescriptor; - InfoOption = infoOption; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterIdentityInfo : SqlAction + { + public TableColumn Column { get; private set; } + public SequenceDescriptor SequenceDescriptor { get; set; } + public SqlAlterIdentityInfoOptions InfoOption { get; set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlAlterIdentityInfo(Column, (SequenceDescriptor) SequenceDescriptor.Clone(), InfoOption); + context.NodeMapping[this] = clone; + + return clone; + } + + internal SqlAlterIdentityInfo(TableColumn column, SequenceDescriptor sequenceDescriptor, SqlAlterIdentityInfoOptions infoOption) + { + Column = column; + SequenceDescriptor = sequenceDescriptor; + InfoOption = infoOption; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlCascadableAction.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlCascadableAction.cs index 601b040230..006b6aa884 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlCascadableAction.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlCascadableAction.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.10 - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public abstract class SqlCascadableAction : SqlAction - { - public bool Cascade { get; private set; } - - // Constructors - - protected SqlCascadableAction(bool cascade) - { - Cascade = cascade; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.10 + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public abstract class SqlCascadableAction : SqlAction + { + public bool Cascade { get; private set; } + + // Constructors + + protected SqlCascadableAction(bool cascade) + { + Cascade = cascade; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropColumn.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropColumn.cs index 21fb1431dd..39005e1768 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropColumn.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropColumn : SqlCascadableAction - { - public TableColumn Column { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlDropColumn(Column); - context.NodeMapping[this] = clone; - - return clone; - } - - // Constructors - - internal SqlDropColumn(TableColumn column) - : base(true) - { - Column = column; - } - - internal SqlDropColumn(TableColumn column, bool cascade) - : base(cascade) - { - Column = column; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropColumn : SqlCascadableAction + { + public TableColumn Column { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlDropColumn(Column); + context.NodeMapping[this] = clone; + + return clone; + } + + // Constructors + + internal SqlDropColumn(TableColumn column) + : base(true) + { + Column = column; + } + + internal SqlDropColumn(TableColumn column, bool cascade) + : base(cascade) + { + Column = column; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropConstraint.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropConstraint.cs index 783053b53d..4cb8ffc294 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropConstraint.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropConstraint : SqlCascadableAction - { - public Constraint Constraint { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlDropConstraint(Constraint, Cascade); - context.NodeMapping[this] = clone; - - return clone; - } - - // Constructors - - internal SqlDropConstraint(Constraint constraint) - : base(true) - { - Constraint = constraint; - } - - internal SqlDropConstraint(Constraint constraint, bool cascade) - : base(cascade) - { - Constraint = constraint; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropConstraint : SqlCascadableAction + { + public Constraint Constraint { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlDropConstraint(Constraint, Cascade); + context.NodeMapping[this] = clone; + + return clone; + } + + // Constructors + + internal SqlDropConstraint(Constraint constraint) + : base(true) + { + Constraint = constraint; + } + + internal SqlDropConstraint(Constraint constraint, bool cascade) + : base(cascade) + { + Constraint = constraint; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropDefault.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropDefault.cs index 99fd39fb0c..13ffbf509e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropDefault.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlDropDefault.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropDefault : SqlAction - { - public TableColumn Column { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlDropDefault(Column); - context.NodeMapping[this] = clone; - - return clone; - } - - // Constructors - - internal SqlDropDefault(TableColumn column) - { - Column = column; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropDefault : SqlAction + { + public TableColumn Column { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlDropDefault(Column); + context.NodeMapping[this] = clone; + + return clone; + } + + // Constructors + + internal SqlDropDefault(TableColumn column) + { + Column = column; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlRenameColumn.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlRenameColumn.cs index 2b3e13fb6b..4b27855b11 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlRenameColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlRenameColumn.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.10 - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlRenameColumn : SqlAction - { - public TableColumn Column { get; private set; } - public string NewName { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlRenameColumn(Column, NewName); - context.NodeMapping[this] = clone; - return clone; - } - - // Constructors - - internal SqlRenameColumn(TableColumn column, string newName) - { - Column = column; - NewName = newName; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.10 + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlRenameColumn : SqlAction + { + public TableColumn Column { get; private set; } + public string NewName { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlRenameColumn(Column, NewName); + context.NodeMapping[this] = clone; + return clone; + } + + // Constructors + + internal SqlRenameColumn(TableColumn column, string newName) + { + Column = column; + NewName = newName; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlSetDefault.cs b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlSetDefault.cs index ab58b8384c..e72ddabdb6 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlSetDefault.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlSetDefault.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlSetDefault : SqlAction - { - public TableColumn Column { get; private set; } - public SqlExpression DefaultValue { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlSetDefault((SqlExpression) DefaultValue.Clone(context), Column); - context.NodeMapping[this] = clone; - - return clone; - } - - internal SqlSetDefault(SqlExpression defaultValue, TableColumn column) - { - DefaultValue = defaultValue; - Column = column; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlSetDefault : SqlAction + { + public TableColumn Column { get; private set; } + public SqlExpression DefaultValue { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlSetDefault((SqlExpression) DefaultValue.Clone(context), Column); + context.NodeMapping[this] = clone; + + return clone; + } + + internal SqlSetDefault(SqlExpression defaultValue, TableColumn column) + { + DefaultValue = defaultValue; + Column = column; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterIdentityInfoOptions.cs b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterIdentityInfoOptions.cs index 361afe861c..f15147d49e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterIdentityInfoOptions.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterIdentityInfoOptions.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Flags] - [Serializable] - public enum SqlAlterIdentityInfoOptions - { - None = 0x0, - RestartWithOption = 0x1, - IncrementByOption = 0x2, - MaxValueOption = 0x4, - MinValueOption = 0x8, - CycleOption = 0x10, - All = 0x1F - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Flags] + [Serializable] + public enum SqlAlterIdentityInfoOptions + { + None = 0x0, + RestartWithOption = 0x1, + IncrementByOption = 0x2, + MaxValueOption = 0x4, + MinValueOption = 0x8, + CycleOption = 0x10, + All = 0x1F + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterPartitionFunctionOption.cs b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterPartitionFunctionOption.cs index a8e545f027..309a3da986 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterPartitionFunctionOption.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlAlterPartitionFunctionOption.cs @@ -1,15 +1,15 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public enum SqlAlterPartitionFunctionOption - { - Split = 1, - Merge = 2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public enum SqlAlterPartitionFunctionOption + { + Split = 1, + Merge = 2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlCommandType.cs b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlCommandType.cs index e1c0e514d3..39fc8462a9 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlCommandType.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/Misc/SqlCommandType.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.04 - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public enum SqlCommandType - { - SetConstraintsAllDeferred, - SetConstraintsAllImmediate, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.04 + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public enum SqlCommandType + { + SetConstraintsAllDeferred, + SetConstraintsAllImmediate, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterDomain.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterDomain.cs index 523d825eae..ef5c724afe 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterDomain.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterDomain.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterDomain : SqlStatement, ISqlCompileUnit - { - private SqlAction action; - private Domain domain; - - public SqlAction Action { - get { - return action; - } - } - - public Domain Domain { - get { - return domain; - } - } - - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAlterDomain clone = new SqlAlterDomain(domain, (SqlAction)action.Clone(context)); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlAlterDomain(Domain domain, SqlAction action) - : base(SqlNodeType.Alter) - { - this.action = action; - this.domain = domain; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterDomain : SqlStatement, ISqlCompileUnit + { + private SqlAction action; + private Domain domain; + + public SqlAction Action { + get { + return action; + } + } + + public Domain Domain { + get { + return domain; + } + } + + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAlterDomain clone = new SqlAlterDomain(domain, (SqlAction)action.Clone(context)); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlAlterDomain(Domain domain, SqlAction action) + : base(SqlNodeType.Alter) + { + this.action = action; + this.domain = domain; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionFunction.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionFunction.cs index 8e919d6db5..16118bc145 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionFunction.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionFunction.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterPartitionFunction: SqlStatement, - ISqlCompileUnit - { - private PartitionFunction partitionFunction; - private string boundary; - private SqlAlterPartitionFunctionOption option; - - public PartitionFunction PartitionFunction - { - get { return partitionFunction; } - } - - public string Boundary - { - get { return boundary; } - } - - public SqlAlterPartitionFunctionOption Option - { - get { return option; } - set { option = value; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAlterPartitionFunction clone = new SqlAlterPartitionFunction(partitionFunction, boundary, option); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlAlterPartitionFunction(PartitionFunction partitionFunction, string boundary, - SqlAlterPartitionFunctionOption option) - : base(SqlNodeType.Alter) - { - this.partitionFunction = partitionFunction; - this.boundary = boundary; - this.option = option; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterPartitionFunction: SqlStatement, + ISqlCompileUnit + { + private PartitionFunction partitionFunction; + private string boundary; + private SqlAlterPartitionFunctionOption option; + + public PartitionFunction PartitionFunction + { + get { return partitionFunction; } + } + + public string Boundary + { + get { return boundary; } + } + + public SqlAlterPartitionFunctionOption Option + { + get { return option; } + set { option = value; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAlterPartitionFunction clone = new SqlAlterPartitionFunction(partitionFunction, boundary, option); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlAlterPartitionFunction(PartitionFunction partitionFunction, string boundary, + SqlAlterPartitionFunctionOption option) + : base(SqlNodeType.Alter) + { + this.partitionFunction = partitionFunction; + this.boundary = boundary; + this.option = option; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionScheme.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionScheme.cs index 0905e43914..c52bae3f2e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionScheme.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterPartitionScheme.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterPartitionScheme : SqlStatement, ISqlCompileUnit - { - private PartitionSchema partitionSchema; - private string filegroup; - - public PartitionSchema PartitionSchema { - get { - return partitionSchema; - } - } - - public string Filegroup { - get { - return filegroup; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAlterPartitionScheme clone = new SqlAlterPartitionScheme(partitionSchema, filegroup); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlAlterPartitionScheme(PartitionSchema partitionSchema, string filegroup) - : base(SqlNodeType.Alter) - { - this.partitionSchema = partitionSchema; - this.filegroup = filegroup; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterPartitionScheme : SqlStatement, ISqlCompileUnit + { + private PartitionSchema partitionSchema; + private string filegroup; + + public PartitionSchema PartitionSchema { + get { + return partitionSchema; + } + } + + public string Filegroup { + get { + return filegroup; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAlterPartitionScheme clone = new SqlAlterPartitionScheme(partitionSchema, filegroup); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlAlterPartitionScheme(PartitionSchema partitionSchema, string filegroup) + : base(SqlNodeType.Alter) + { + this.partitionSchema = partitionSchema; + this.filegroup = filegroup; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterSequence.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterSequence.cs index 54099527fc..fa8101b226 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterSequence.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterSequence.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterSequence : SqlStatement, ISqlCompileUnit - { - private Sequence sequence; - private SequenceDescriptor sequenceDescriptor; - private SqlAlterIdentityInfoOptions infoOption = SqlAlterIdentityInfoOptions.All; - - public Sequence Sequence { - get { - return sequence; - } - } - - public SequenceDescriptor SequenceDescriptor { - get { - return sequenceDescriptor; - } - } - - public SqlAlterIdentityInfoOptions InfoOption { - get { - return infoOption; - } - set { - infoOption = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAlterSequence clone = new SqlAlterSequence(sequence, (SequenceDescriptor)sequenceDescriptor.Clone(), infoOption); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlAlterSequence(Sequence sequence, SequenceDescriptor sequenceDescriptor, SqlAlterIdentityInfoOptions infoOption) - : base(SqlNodeType.Alter) - { - this.sequence = sequence; - this.sequenceDescriptor = sequenceDescriptor; - this.infoOption = infoOption; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterSequence : SqlStatement, ISqlCompileUnit + { + private Sequence sequence; + private SequenceDescriptor sequenceDescriptor; + private SqlAlterIdentityInfoOptions infoOption = SqlAlterIdentityInfoOptions.All; + + public Sequence Sequence { + get { + return sequence; + } + } + + public SequenceDescriptor SequenceDescriptor { + get { + return sequenceDescriptor; + } + } + + public SqlAlterIdentityInfoOptions InfoOption { + get { + return infoOption; + } + set { + infoOption = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAlterSequence clone = new SqlAlterSequence(sequence, (SequenceDescriptor)sequenceDescriptor.Clone(), infoOption); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlAlterSequence(Sequence sequence, SequenceDescriptor sequenceDescriptor, SqlAlterIdentityInfoOptions infoOption) + : base(SqlNodeType.Alter) + { + this.sequence = sequence; + this.sequenceDescriptor = sequenceDescriptor; + this.infoOption = infoOption; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterTable.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterTable.cs index f00ac26288..0f846d1958 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterTable.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlAlterTable.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlAlterTable : SqlStatement, ISqlCompileUnit - { - private SqlAction action; - private Table table; - - public SqlAction Action { - get { - return action; - } - } - - public Table Table { - get { - return table; - } - } - - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAlterTable clone = new SqlAlterTable(table, (SqlAction)action.Clone(context)); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlAlterTable(Table table, SqlAction action) - : base(SqlNodeType.Alter) - { - this.action = action; - this.table = table; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlAlterTable : SqlStatement, ISqlCompileUnit + { + private SqlAction action; + private Table table; + + public SqlAction Action { + get { + return action; + } + } + + public Table Table { + get { + return table; + } + } + + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAlterTable clone = new SqlAlterTable(table, (SqlAction)action.Clone(context)); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlAlterTable(Table table, SqlAction action) + : base(SqlNodeType.Alter) + { + this.action = action; + this.table = table; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCommand.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCommand.cs index cf116e570f..fb092aff52 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCommand.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCommand.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.04 - -using System; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCommand : SqlStatement, ISqlCompileUnit - { - public SqlCommandType CommandType { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlCommand(CommandType); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlCommand(SqlCommandType commandType) - : base(SqlNodeType.Command) - { - CommandType = commandType; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.04 + +using System; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCommand : SqlStatement, ISqlCompileUnit + { + public SqlCommandType CommandType { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlCommand(CommandType); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlCommand(SqlCommandType commandType) + : base(SqlNodeType.Command) + { + CommandType = commandType; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateAssertion.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateAssertion.cs index bc74aaa99f..97bb786584 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateAssertion.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateAssertion.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateAssertion : SqlStatement, ISqlCompileUnit - { - private Assertion assertion; - - public Assertion Assertion { - get { - return assertion; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateAssertion clone = new SqlCreateAssertion(assertion); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateAssertion(Assertion assertion) : base(SqlNodeType.Create) - { - this.assertion = assertion; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateAssertion : SqlStatement, ISqlCompileUnit + { + private Assertion assertion; + + public Assertion Assertion { + get { + return assertion; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateAssertion clone = new SqlCreateAssertion(assertion); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateAssertion(Assertion assertion) : base(SqlNodeType.Create) + { + this.assertion = assertion; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCharcterSet.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCharcterSet.cs index 9bfd8b6e39..0c05a02fb8 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCharcterSet.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCharcterSet.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateCharacterSet : SqlStatement, ISqlCompileUnit - { - private CharacterSet characterSet; - - public CharacterSet CharacterSet { - get { - return characterSet; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateCharacterSet clone = new SqlCreateCharacterSet(characterSet); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateCharacterSet(CharacterSet characterSet) : base(SqlNodeType.Create) - { - this.characterSet = characterSet; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateCharacterSet : SqlStatement, ISqlCompileUnit + { + private CharacterSet characterSet; + + public CharacterSet CharacterSet { + get { + return characterSet; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateCharacterSet clone = new SqlCreateCharacterSet(characterSet); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateCharacterSet(CharacterSet characterSet) : base(SqlNodeType.Create) + { + this.characterSet = characterSet; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCollation.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCollation.cs index 2435268cdc..3540936fec 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCollation.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateCollation.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateCollation : SqlStatement, ISqlCompileUnit - { - private Collation collation; - - public Collation Collation { - get { - return collation; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateCollation clone = new SqlCreateCollation(collation); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateCollation(Collation collation) : base(SqlNodeType.Create) - { - this.collation = collation; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateCollation : SqlStatement, ISqlCompileUnit + { + private Collation collation; + + public Collation Collation { + get { + return collation; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateCollation clone = new SqlCreateCollation(collation); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateCollation(Collation collation) : base(SqlNodeType.Create) + { + this.collation = collation; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateDomain.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateDomain.cs index cc9011940f..fc51e31431 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateDomain.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateDomain.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateDomain : SqlStatement, ISqlCompileUnit - { - private Domain domain; - - public Domain Domain { - get { - return domain; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateDomain clone = new SqlCreateDomain(domain); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateDomain(Domain domain) : base(SqlNodeType.Create) - { - this.domain = domain; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateDomain : SqlStatement, ISqlCompileUnit + { + private Domain domain; + + public Domain Domain { + get { + return domain; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateDomain clone = new SqlCreateDomain(domain); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateDomain(Domain domain) : base(SqlNodeType.Create) + { + this.domain = domain; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateIndex.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateIndex.cs index 9ea5e8c3f6..a3a1c56557 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateIndex.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateIndex.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateIndex : SqlStatement, ISqlCompileUnit - { - public Index Index { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlCreateIndex(Index); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlCreateIndex(Index index) - : base(SqlNodeType.Create) - { - Index = index; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateIndex : SqlStatement, ISqlCompileUnit + { + public Index Index { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlCreateIndex(Index); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlCreateIndex(Index index) + : base(SqlNodeType.Create) + { + Index = index; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionFunction.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionFunction.cs index fc69094aca..8765756953 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionFunction.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionFunction.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreatePartitionFunction : SqlStatement, ISqlCompileUnit - { - private PartitionFunction partitionFunction; - - public PartitionFunction PartitionFunction { - get { - return partitionFunction; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreatePartitionFunction clone = new SqlCreatePartitionFunction(partitionFunction); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreatePartitionFunction(PartitionFunction partitionFunction) - : base(SqlNodeType.Create) - { - this.partitionFunction = partitionFunction; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreatePartitionFunction : SqlStatement, ISqlCompileUnit + { + private PartitionFunction partitionFunction; + + public PartitionFunction PartitionFunction { + get { + return partitionFunction; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreatePartitionFunction clone = new SqlCreatePartitionFunction(partitionFunction); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreatePartitionFunction(PartitionFunction partitionFunction) + : base(SqlNodeType.Create) + { + this.partitionFunction = partitionFunction; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionScheme.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionScheme.cs index dd2f973bca..3e94b4a50e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionScheme.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreatePartitionScheme.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreatePartitionScheme : SqlStatement, ISqlCompileUnit - { - private PartitionSchema partitionSchema; - - public PartitionSchema PartitionSchema { - get { - return partitionSchema; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreatePartitionScheme clone = new SqlCreatePartitionScheme(partitionSchema); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreatePartitionScheme(PartitionSchema partitionSchema) - : base(SqlNodeType.Create) - { - this.partitionSchema = partitionSchema; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreatePartitionScheme : SqlStatement, ISqlCompileUnit + { + private PartitionSchema partitionSchema; + + public PartitionSchema PartitionSchema { + get { + return partitionSchema; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreatePartitionScheme clone = new SqlCreatePartitionScheme(partitionSchema); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreatePartitionScheme(PartitionSchema partitionSchema) + : base(SqlNodeType.Create) + { + this.partitionSchema = partitionSchema; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSchema.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSchema.cs index 48d2c5f62d..1f6a3c289e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSchema.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSchema.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateSchema : SqlStatement, ISqlCompileUnit - { - private Schema schema; - - public Schema Schema { - get { - return schema; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateSchema clone = new SqlCreateSchema(schema); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateSchema(Schema schema) : base(SqlNodeType.Create) - { - this.schema = schema; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateSchema : SqlStatement, ISqlCompileUnit + { + private Schema schema; + + public Schema Schema { + get { + return schema; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateSchema clone = new SqlCreateSchema(schema); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateSchema(Schema schema) : base(SqlNodeType.Create) + { + this.schema = schema; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSequence.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSequence.cs index ed4593bb47..26b6b515a0 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSequence.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateSequence.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateSequence : SqlStatement, ISqlCompileUnit - { - private Sequence sequence; - - public Sequence Sequence { - get { - return sequence; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateSequence clone = new SqlCreateSequence(sequence); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateSequence(Sequence sequence) : base(SqlNodeType.Create) - { - this.sequence = sequence; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateSequence : SqlStatement, ISqlCompileUnit + { + private Sequence sequence; + + public Sequence Sequence { + get { + return sequence; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateSequence clone = new SqlCreateSequence(sequence); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateSequence(Sequence sequence) : base(SqlNodeType.Create) + { + this.sequence = sequence; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTable.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTable.cs index 7cc124c97d..9bfae4b2ec 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTable.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTable.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateTable : SqlStatement, ISqlCompileUnit - { - private Table table; - - public Table Table { - get { - return table; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateTable clone = new SqlCreateTable(table); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateTable(Table table) : base(SqlNodeType.Create) - { - this.table = table; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateTable : SqlStatement, ISqlCompileUnit + { + private Table table; + + public Table Table { + get { + return table; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateTable clone = new SqlCreateTable(table); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateTable(Table table) : base(SqlNodeType.Create) + { + this.table = table; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTranslation.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTranslation.cs index 32a37e95d3..2aba751c62 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTranslation.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateTranslation.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateTranslation : SqlStatement, ISqlCompileUnit - { - private Translation translation; - - public Translation Translation { - get { - return translation; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateTranslation clone = new SqlCreateTranslation(translation); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateTranslation(Translation translation) : base(SqlNodeType.Create) - { - this.translation = translation; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateTranslation : SqlStatement, ISqlCompileUnit + { + private Translation translation; + + public Translation Translation { + get { + return translation; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateTranslation clone = new SqlCreateTranslation(translation); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateTranslation(Translation translation) : base(SqlNodeType.Create) + { + this.translation = translation; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateView.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateView.cs index 78719998e2..62f35ca8ed 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateView.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlCreateView.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlCreateView : SqlStatement, ISqlCompileUnit - { - private View node; - - public View View { - get { - return node; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCreateView clone = new SqlCreateView(node); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCreateView(View node) : base(SqlNodeType.Create) - { - this.node = node; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlCreateView : SqlStatement, ISqlCompileUnit + { + private View node; + + public View View { + get { + return node; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCreateView clone = new SqlCreateView(node); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCreateView(View node) : base(SqlNodeType.Create) + { + this.node = node; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropAssertion.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropAssertion.cs index d2dd5b39f1..ae6e636a7c 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropAssertion.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropAssertion.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropAssertion : SqlStatement, ISqlCompileUnit - { - private Assertion assertion; - - public Assertion Assertion { - get { - return assertion; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropAssertion clone = new SqlDropAssertion(assertion); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropAssertion(Assertion assertion) : base(SqlNodeType.Drop) - { - this.assertion = assertion; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropAssertion : SqlStatement, ISqlCompileUnit + { + private Assertion assertion; + + public Assertion Assertion { + get { + return assertion; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropAssertion clone = new SqlDropAssertion(assertion); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropAssertion(Assertion assertion) : base(SqlNodeType.Drop) + { + this.assertion = assertion; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCharacterSet.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCharacterSet.cs index 166cef2256..2cf42a8b17 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCharacterSet.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCharacterSet.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropCharacterSet : SqlStatement, ISqlCompileUnit - { - private CharacterSet characterSet; - - public CharacterSet CharacterSet { - get { - return characterSet; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropCharacterSet clone = new SqlDropCharacterSet(characterSet); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropCharacterSet(CharacterSet characterSet) : base(SqlNodeType.Drop) - { - this.characterSet = characterSet; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropCharacterSet : SqlStatement, ISqlCompileUnit + { + private CharacterSet characterSet; + + public CharacterSet CharacterSet { + get { + return characterSet; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropCharacterSet clone = new SqlDropCharacterSet(characterSet); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropCharacterSet(CharacterSet characterSet) : base(SqlNodeType.Drop) + { + this.characterSet = characterSet; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCollation.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCollation.cs index c9f52f7399..92fa51517b 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCollation.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropCollation.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropCollation : SqlStatement, ISqlCompileUnit - { - private Collation collation; - - public Collation Collation { - get { - return collation; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropCollation clone = new SqlDropCollation(collation); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropCollation(Collation collation) : base(SqlNodeType.Drop) - { - this.collation = collation; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropCollation : SqlStatement, ISqlCompileUnit + { + private Collation collation; + + public Collation Collation { + get { + return collation; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropCollation clone = new SqlDropCollation(collation); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropCollation(Collation collation) : base(SqlNodeType.Drop) + { + this.collation = collation; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropDomain.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropDomain.cs index 6a5a51b063..c09fc343a5 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropDomain.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropDomain.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropDomain : SqlStatement, ISqlCompileUnit - { - private Domain domain; - private bool cascade = true; - - public Domain Domain { - get { - return domain; - } - } - - public bool Cascade { - get { - return cascade; - } - set { - cascade = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropDomain clone = new SqlDropDomain(domain); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropDomain(Domain domain) : base(SqlNodeType.Drop) - { - this.domain = domain; - } - - internal SqlDropDomain(Domain domain, bool cascade) : base(SqlNodeType.Drop) - { - this.domain = domain; - this.cascade = cascade; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropDomain : SqlStatement, ISqlCompileUnit + { + private Domain domain; + private bool cascade = true; + + public Domain Domain { + get { + return domain; + } + } + + public bool Cascade { + get { + return cascade; + } + set { + cascade = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropDomain clone = new SqlDropDomain(domain); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropDomain(Domain domain) : base(SqlNodeType.Drop) + { + this.domain = domain; + } + + internal SqlDropDomain(Domain domain, bool cascade) : base(SqlNodeType.Drop) + { + this.domain = domain; + this.cascade = cascade; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropIndex.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropIndex.cs index 3bd90d4039..e871a27bf5 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropIndex.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropIndex.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropIndex : SqlStatement, ISqlCompileUnit - { - private Index index; - //private bool? online; - //private byte? maxDegreeOfParallelism; - //private IPartitionDescriptor partitioningDescriptor; - //private string tableSpace; - - public Index Index { - get { - return index; - } - } - - //public bool? Online { - // get { - // return online; - // } - // set { - // online = value; - // } - //} - - //public byte? MaxDegreeOfParallelism { - // get { - // return maxDegreeOfParallelism; - // } - // set { - // maxDegreeOfParallelism = value; - // } - //} - - //public IPartitionDescriptor PartitionDescriptor { - // get { - // return partitioningDescriptor; - // } - // set { - // partitioningDescriptor = value; - // } - //} - - //public string Filegroup { - // get { - // return tableSpace; - // } - // set { - // tableSpace = value; - // } - //} - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropIndex clone = new SqlDropIndex(index); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropIndex(Index index) - : base(SqlNodeType.Drop) - { - this.index = index; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropIndex : SqlStatement, ISqlCompileUnit + { + private Index index; + //private bool? online; + //private byte? maxDegreeOfParallelism; + //private IPartitionDescriptor partitioningDescriptor; + //private string tableSpace; + + public Index Index { + get { + return index; + } + } + + //public bool? Online { + // get { + // return online; + // } + // set { + // online = value; + // } + //} + + //public byte? MaxDegreeOfParallelism { + // get { + // return maxDegreeOfParallelism; + // } + // set { + // maxDegreeOfParallelism = value; + // } + //} + + //public IPartitionDescriptor PartitionDescriptor { + // get { + // return partitioningDescriptor; + // } + // set { + // partitioningDescriptor = value; + // } + //} + + //public string Filegroup { + // get { + // return tableSpace; + // } + // set { + // tableSpace = value; + // } + //} + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropIndex clone = new SqlDropIndex(index); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropIndex(Index index) + : base(SqlNodeType.Drop) + { + this.index = index; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionFunction.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionFunction.cs index d78bd31a2d..3f691d3800 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionFunction.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionFunction.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropPartitionFunction : SqlStatement, ISqlCompileUnit - { - private PartitionFunction partitionFunction; - - public PartitionFunction PartitionFunction { - get { - return partitionFunction; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropPartitionFunction clone = new SqlDropPartitionFunction(partitionFunction); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropPartitionFunction(PartitionFunction partitionFunction) - : base(SqlNodeType.Drop) - { - this.partitionFunction = partitionFunction; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropPartitionFunction : SqlStatement, ISqlCompileUnit + { + private PartitionFunction partitionFunction; + + public PartitionFunction PartitionFunction { + get { + return partitionFunction; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropPartitionFunction clone = new SqlDropPartitionFunction(partitionFunction); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropPartitionFunction(PartitionFunction partitionFunction) + : base(SqlNodeType.Drop) + { + this.partitionFunction = partitionFunction; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionScheme.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionScheme.cs index ce2a5cd9bb..ab4fb554bb 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionScheme.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropPartitionScheme.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropPartitionScheme : SqlStatement, ISqlCompileUnit - { - private PartitionSchema partitionSchema; - - public PartitionSchema PartitionSchema { - get { - return partitionSchema; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropPartitionScheme clone = new SqlDropPartitionScheme(partitionSchema); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropPartitionScheme(PartitionSchema partitionSchema) - : base(SqlNodeType.Drop) - { - this.partitionSchema = partitionSchema; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropPartitionScheme : SqlStatement, ISqlCompileUnit + { + private PartitionSchema partitionSchema; + + public PartitionSchema PartitionSchema { + get { + return partitionSchema; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropPartitionScheme clone = new SqlDropPartitionScheme(partitionSchema); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropPartitionScheme(PartitionSchema partitionSchema) + : base(SqlNodeType.Drop) + { + this.partitionSchema = partitionSchema; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSchema.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSchema.cs index c5d0716a08..e62dcf6e88 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSchema.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSchema.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropSchema : SqlStatement, ISqlCompileUnit - { - private Schema schema; - private bool cascade = true; - - public Schema Schema { - get { - return schema; - } - } - - public bool Cascade { - get { - return cascade; - } - set { - cascade = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropSchema clone = new SqlDropSchema(schema); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropSchema(Schema schema) : base(SqlNodeType.Drop) - { - this.schema = schema; - } - - internal SqlDropSchema(Schema schema, bool cascade) : base(SqlNodeType.Drop) - { - this.schema = schema; - this.cascade = cascade; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropSchema : SqlStatement, ISqlCompileUnit + { + private Schema schema; + private bool cascade = true; + + public Schema Schema { + get { + return schema; + } + } + + public bool Cascade { + get { + return cascade; + } + set { + cascade = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropSchema clone = new SqlDropSchema(schema); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropSchema(Schema schema) : base(SqlNodeType.Drop) + { + this.schema = schema; + } + + internal SqlDropSchema(Schema schema, bool cascade) : base(SqlNodeType.Drop) + { + this.schema = schema; + this.cascade = cascade; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSequence.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSequence.cs index c38f7564f1..c15d707b34 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSequence.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropSequence.cs @@ -1,60 +1,60 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropSequence : SqlStatement, ISqlCompileUnit - { - private Sequence sequence; - private bool cascade = true; - - public Sequence Sequence { - get { - return sequence; - } - } - - public bool Cascade { - get { - return cascade; - } - set { - cascade = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropSequence clone = new SqlDropSequence(sequence); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropSequence(Sequence sequence) - : base(SqlNodeType.Drop) - { - this.sequence = sequence; - } - - internal SqlDropSequence(Sequence sequence, bool cascade) - : base(SqlNodeType.Drop) - { - this.sequence = sequence; - this.cascade = cascade; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropSequence : SqlStatement, ISqlCompileUnit + { + private Sequence sequence; + private bool cascade = true; + + public Sequence Sequence { + get { + return sequence; + } + } + + public bool Cascade { + get { + return cascade; + } + set { + cascade = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropSequence clone = new SqlDropSequence(sequence); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropSequence(Sequence sequence) + : base(SqlNodeType.Drop) + { + this.sequence = sequence; + } + + internal SqlDropSequence(Sequence sequence, bool cascade) + : base(SqlNodeType.Drop) + { + this.sequence = sequence; + this.cascade = cascade; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTable.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTable.cs index 2b1e53bf53..d5bcd8f871 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTable.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTable.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropTable : SqlStatement, ISqlCompileUnit - { - private Table table; - private bool cascade = true; - - public Table Table { - get { - return table; - } - } - - public bool Cascade { - get { - return cascade; - } - set { - cascade = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropTable clone = new SqlDropTable(table, cascade); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropTable(Table table) : base(SqlNodeType.Drop) - { - this.table = table; - } - - internal SqlDropTable(Table table, bool cascade) : base(SqlNodeType.Drop) - { - this.table = table; - this.cascade = cascade; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropTable : SqlStatement, ISqlCompileUnit + { + private Table table; + private bool cascade = true; + + public Table Table { + get { + return table; + } + } + + public bool Cascade { + get { + return cascade; + } + set { + cascade = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropTable clone = new SqlDropTable(table, cascade); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropTable(Table table) : base(SqlNodeType.Drop) + { + this.table = table; + } + + internal SqlDropTable(Table table, bool cascade) : base(SqlNodeType.Drop) + { + this.table = table; + this.cascade = cascade; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTranslation.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTranslation.cs index 66b3f779a4..539a891b58 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTranslation.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropTranslation.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropTranslation : SqlStatement, ISqlCompileUnit - { - private Translation translation; - - public Translation Translation { - get { - return translation; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropTranslation clone = new SqlDropTranslation(translation); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropTranslation(Translation translation) : base(SqlNodeType.Drop) - { - this.translation = translation; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropTranslation : SqlStatement, ISqlCompileUnit + { + private Translation translation; + + public Translation Translation { + get { + return translation; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropTranslation clone = new SqlDropTranslation(translation); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropTranslation(Translation translation) : base(SqlNodeType.Drop) + { + this.translation = translation; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropView.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropView.cs index d0b3ccb52f..466303b70e 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlDropView.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlDropView.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlDropView : SqlStatement, ISqlCompileUnit - { - private View view; - private bool cascade = true; - - public View View { - get { - return view; - } - } - - public bool Cascade { - get { - return cascade; - } - set { - cascade = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDropView clone = new SqlDropView(view); - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDropView(View view) : base(SqlNodeType.Drop) - { - this.view = view; - } - - internal SqlDropView(View view, bool cascade) : base(SqlNodeType.Drop) - { - this.view = view; - this.cascade = cascade; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlDropView : SqlStatement, ISqlCompileUnit + { + private View view; + private bool cascade = true; + + public View View { + get { + return view; + } + } + + public bool Cascade { + get { + return cascade; + } + set { + cascade = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDropView clone = new SqlDropView(view); + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDropView(View view) : base(SqlNodeType.Drop) + { + this.view = view; + } + + internal SqlDropView(View view, bool cascade) : base(SqlNodeType.Drop) + { + this.view = view; + this.cascade = cascade; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Ddl/SqlRenameTable.cs b/Orm/Xtensive.Orm/Sql/Ddl/SqlRenameTable.cs index c825cc97aa..8abcba3277 100644 --- a/Orm/Xtensive.Orm/Sql/Ddl/SqlRenameTable.cs +++ b/Orm/Xtensive.Orm/Sql/Ddl/SqlRenameTable.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.10 - -using System; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Ddl -{ - [Serializable] - public class SqlRenameTable : SqlStatement, ISqlCompileUnit - { - public Table Table { get; private set; } - public string NewName { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlRenameTable(Table, NewName); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlRenameTable(Table table, string newName) - : base(SqlNodeType.Rename) - { - Table = table; - NewName = newName; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.10 + +using System; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Ddl +{ + [Serializable] + public class SqlRenameTable : SqlStatement, ISqlCompileUnit + { + public Table Table { get; private set; } + public string NewName { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlRenameTable(Table, NewName); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlRenameTable(Table table, string newName) + : base(SqlNodeType.Rename) + { + Table = table; + NewName = newName; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlColumnCollection.cs b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlColumnCollection.cs index 59d6315b2d..b717d00af7 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlColumnCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlColumnCollection.cs @@ -1,162 +1,162 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Core; - - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents collection of s. - /// - [Serializable] - public class SqlColumnCollection : ICollection, IReadOnlyList - { - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - private readonly List columnList; - - /// - /// Gets the number of elements contained in the . - /// - public int Count => columnList.Count; - - /// > - bool ICollection.IsReadOnly => false; - - /// > - IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); - - /// > - IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); - - /// - /// Returns a that iterates through the . - /// - public List.Enumerator GetEnumerator() => columnList.GetEnumerator(); - - /// - /// Gets or sets the column at the specified . - /// - public SqlColumn this[int index] - { - get => columnList[index]; - set => columnList[index] = value; - } - - /// - /// Gets the column with the specified - /// or if collection doesn't contain such a column. - /// - public SqlColumn this[string name] => - string.IsNullOrEmpty(name) ? null : columnList.Find(column => Comparer.Equals(column.Name, name)); - - /// - /// Adds a specified to the end of the . - /// - public void Add(SqlColumn column) => columnList.Add(column); - - /// - /// Builds a to the specified using - /// the provided and then adds it to the end of the . - /// - /// is null. - public void Add(SqlColumn column, string alias) - { - ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); - columnList.Add(SqlDml.ColumnRef(column, alias)); - } - - /// - /// Builds a by the specified and - /// then adds it to the end of the . - /// - public void Add(SqlExpression expression) => - columnList.Add(expression is SqlColumn column ? column : SqlDml.ColumnRef(SqlDml.Column(expression))); - - /// - /// Builds a by the specified and - /// ; then adds it to the end of the . - /// - /// is . - public void Add(SqlExpression expression, string alias) - { - ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); - columnList.Add(SqlDml.ColumnRef(SqlDml.Column(expression), alias)); - } - - /// - /// Builds a by the specified and - /// then inserts it into at the specified . - /// - /// is . - /// is less than 0. - /// -or- is greater than . - public void Insert(int index, SqlExpression expression, string alias) - { - ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); - columnList.Insert(index, SqlDml.ColumnRef(SqlDml.Column(expression), alias)); - } - - /// - /// Adds to the end of the . - /// - /// Columns to be added. - public void AddRange(params SqlColumn[] columns) - { - ArgumentValidator.EnsureArgumentNotNull(columns, nameof(columns)); - columnList.AddRange(columns); - } - - /// - /// Adds to the end of the . - /// - /// Columns to be added. - /// A type of the columns in the specified - /// collection; it must be or its inheritor. - public void AddRange(IEnumerable columns) where TColumn : SqlColumn => - columnList.AddRange(columns); - - /// - public bool Contains(SqlColumn item) => columnList.Contains(item); - - /// - public void CopyTo(SqlColumn[] array, int arrayIndex) => columnList.CopyTo(array, arrayIndex); - - /// - public bool Remove(SqlColumn item) => columnList.Remove(item); - - /// - public void Clear() => columnList.Clear(); - - // Constructors - - /// - /// Initializes new instance of this type. - /// - public SqlColumnCollection() - { - columnList = new List(); - } - - /// - /// Initializes new instance of this type. - /// - public SqlColumnCollection(IEnumerable columns) - { - columnList = new List(columns); - } - - /// - /// Initializes a new instance of the class. - /// This is special version it uses provided list as is. - /// - internal SqlColumnCollection(List columns) - { - columnList = columns; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Core; + + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents collection of s. + /// + [Serializable] + public class SqlColumnCollection : ICollection, IReadOnlyList + { + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + private readonly List columnList; + + /// + /// Gets the number of elements contained in the . + /// + public int Count => columnList.Count; + + /// > + bool ICollection.IsReadOnly => false; + + /// > + IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); + + /// > + IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); + + /// + /// Returns a that iterates through the . + /// + public List.Enumerator GetEnumerator() => columnList.GetEnumerator(); + + /// + /// Gets or sets the column at the specified . + /// + public SqlColumn this[int index] + { + get => columnList[index]; + set => columnList[index] = value; + } + + /// + /// Gets the column with the specified + /// or if collection doesn't contain such a column. + /// + public SqlColumn this[string name] => + string.IsNullOrEmpty(name) ? null : columnList.Find(column => Comparer.Equals(column.Name, name)); + + /// + /// Adds a specified to the end of the . + /// + public void Add(SqlColumn column) => columnList.Add(column); + + /// + /// Builds a to the specified using + /// the provided and then adds it to the end of the . + /// + /// is null. + public void Add(SqlColumn column, string alias) + { + ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); + columnList.Add(SqlDml.ColumnRef(column, alias)); + } + + /// + /// Builds a by the specified and + /// then adds it to the end of the . + /// + public void Add(SqlExpression expression) => + columnList.Add(expression is SqlColumn column ? column : SqlDml.ColumnRef(SqlDml.Column(expression))); + + /// + /// Builds a by the specified and + /// ; then adds it to the end of the . + /// + /// is . + public void Add(SqlExpression expression, string alias) + { + ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); + columnList.Add(SqlDml.ColumnRef(SqlDml.Column(expression), alias)); + } + + /// + /// Builds a by the specified and + /// then inserts it into at the specified . + /// + /// is . + /// is less than 0. + /// -or- is greater than . + public void Insert(int index, SqlExpression expression, string alias) + { + ArgumentValidator.EnsureArgumentNotNull(alias, nameof(alias)); + columnList.Insert(index, SqlDml.ColumnRef(SqlDml.Column(expression), alias)); + } + + /// + /// Adds to the end of the . + /// + /// Columns to be added. + public void AddRange(params SqlColumn[] columns) + { + ArgumentValidator.EnsureArgumentNotNull(columns, nameof(columns)); + columnList.AddRange(columns); + } + + /// + /// Adds to the end of the . + /// + /// Columns to be added. + /// A type of the columns in the specified + /// collection; it must be or its inheritor. + public void AddRange(IEnumerable columns) where TColumn : SqlColumn => + columnList.AddRange(columns); + + /// + public bool Contains(SqlColumn item) => columnList.Contains(item); + + /// + public void CopyTo(SqlColumn[] array, int arrayIndex) => columnList.CopyTo(array, arrayIndex); + + /// + public bool Remove(SqlColumn item) => columnList.Remove(item); + + /// + public void Clear() => columnList.Clear(); + + // Constructors + + /// + /// Initializes new instance of this type. + /// + public SqlColumnCollection() + { + columnList = new List(); + } + + /// + /// Initializes new instance of this type. + /// + public SqlColumnCollection(IEnumerable columns) + { + columnList = new List(columns); + } + + /// + /// Initializes a new instance of the class. + /// This is special version it uses provided list as is. + /// + internal SqlColumnCollection(List columns) + { + columnList = columns; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlOrderCollection.cs b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlOrderCollection.cs index 0312a33dd5..4e3dd31afb 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlOrderCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlOrderCollection.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.ObjectModel; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents collection of s. - /// - [Serializable] - public class SqlOrderCollection : Collection - { - public void Add(SqlExpression expression) - { - Add(SqlDml.Order(expression)); - } - - public void Add(SqlExpression expression, bool ascending) - { - Add(SqlDml.Order(expression, ascending)); - } - - public void Add(int position) - { - Add(SqlDml.Order(position)); - } - - public void Add(int position, bool ascending) - { - Add(SqlDml.Order(position, ascending)); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.ObjectModel; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents collection of s. + /// + [Serializable] + public class SqlOrderCollection : Collection + { + public void Add(SqlExpression expression) + { + Add(SqlDml.Order(expression)); + } + + public void Add(SqlExpression expression, bool ascending) + { + Add(SqlDml.Order(expression, ascending)); + } + + public void Add(int position) + { + Add(SqlDml.Order(position)); + } + + public void Add(int position, bool ascending) + { + Add(SqlDml.Order(position, ascending)); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlTableColumnCollection.cs b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlTableColumnCollection.cs index e359ae0090..e03d3eaa45 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlTableColumnCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlTableColumnCollection.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents collection of s. - /// - [Serializable] - public class SqlTableColumnCollection : IReadOnlyList - { - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - private readonly List columnList; - private Dictionary columnLookup; - - /// - /// Gets the number of elements contained in the . - /// - public int Count => columnList.Count; - - /// > - IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); - - /// > - IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); - - /// - /// Returns a that iterates through the . - /// - public List.Enumerator GetEnumerator() => columnList.GetEnumerator(); - - /// - /// Gets the column at the specified . - /// - public SqlTableColumn this[int index] => columnList[index]; - - /// - /// Gets the column with the specified - /// or if collection doesn't contain such a column. - /// - public SqlTableColumn this[string name] - { - get { - if (string.IsNullOrEmpty(name)) { - return null; - } - - var count = columnList.Count; - return count <= 16 ? FindColumnInList(name) : FindColumnInDictionaryLookup(name, count); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private SqlTableColumn FindColumnInList(string name) - { - foreach (var column in columnList) { - if (Comparer.Equals(column.Name, name)) { - return column; - } - } - - return null; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private SqlTableColumn FindColumnInDictionaryLookup(string name, int count) - { - if (columnLookup != null) { - return columnLookup.TryGetValue(name, out var column) ? column : null; - } - - SqlTableColumn result = null; - columnLookup = new Dictionary(count, Comparer); - for (var index = count - 1; index >= 0; index--) { - var column = columnList[index]; - var columnName = column.Name; - columnLookup[columnName] = column; - if (Comparer.Equals(columnName, name)) { - result = column; - } - } - - return result; - } - - /// - /// Initializes a new instance of the class. - /// - /// A collection of s to be wrapped. - public SqlTableColumnCollection(IEnumerable columns) - { - columnList = new List(columns); - } - - /// - /// Initializes a new instance of the class. - /// This is special version it uses provided list as is. - /// - internal SqlTableColumnCollection(List columns) - { - columnList = columns; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents collection of s. + /// + [Serializable] + public class SqlTableColumnCollection : IReadOnlyList + { + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + private readonly List columnList; + private Dictionary columnLookup; + + /// + /// Gets the number of elements contained in the . + /// + public int Count => columnList.Count; + + /// > + IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); + + /// > + IEnumerator IEnumerable.GetEnumerator() => columnList.GetEnumerator(); + + /// + /// Returns a that iterates through the . + /// + public List.Enumerator GetEnumerator() => columnList.GetEnumerator(); + + /// + /// Gets the column at the specified . + /// + public SqlTableColumn this[int index] => columnList[index]; + + /// + /// Gets the column with the specified + /// or if collection doesn't contain such a column. + /// + public SqlTableColumn this[string name] + { + get { + if (string.IsNullOrEmpty(name)) { + return null; + } + + var count = columnList.Count; + return count <= 16 ? FindColumnInList(name) : FindColumnInDictionaryLookup(name, count); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private SqlTableColumn FindColumnInList(string name) + { + foreach (var column in columnList) { + if (Comparer.Equals(column.Name, name)) { + return column; + } + } + + return null; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private SqlTableColumn FindColumnInDictionaryLookup(string name, int count) + { + if (columnLookup != null) { + return columnLookup.TryGetValue(name, out var column) ? column : null; + } + + SqlTableColumn result = null; + columnLookup = new Dictionary(count, Comparer); + for (var index = count - 1; index >= 0; index--) { + var column = columnList[index]; + var columnName = column.Name; + columnLookup[columnName] = column; + if (Comparer.Equals(columnName, name)) { + result = column; + } + } + + return result; + } + + /// + /// Initializes a new instance of the class. + /// + /// A collection of s to be wrapped. + public SqlTableColumnCollection(IEnumerable columns) + { + columnList = new List(columns); + } + + /// + /// Initializes a new instance of the class. + /// This is special version it uses provided list as is. + /// + internal SqlTableColumnCollection(List columns) + { + columnList = columns; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlAggregate.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlAggregate.cs index 42b1b7d32e..53bf56eb07 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlAggregate.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlAggregate.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlAggregate : SqlExpression - { - private bool distinct; - private SqlExpression expression; - - /// - /// Gets a value indicating whether this is distinct. - /// - /// if distinct; otherwise, . - public bool Distinct - { - get { return distinct; } - } - - /// - /// Gets the expression. - /// - /// The expression. - public SqlExpression Expression - { - get { return expression; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlAggregate) expression; - NodeType = replacingExpression.NodeType; - distinct = replacingExpression.Distinct; - this.expression = replacingExpression.Expression; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlAggregate(NodeType, - expression.IsNullReference() ? null : (SqlExpression) expression.Clone(context), distinct); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlAggregate(SqlNodeType nodeType, SqlExpression expression, bool distinct) : base(nodeType) - { - this.expression = expression; - this.distinct = distinct; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlAggregate : SqlExpression + { + private bool distinct; + private SqlExpression expression; + + /// + /// Gets a value indicating whether this is distinct. + /// + /// if distinct; otherwise, . + public bool Distinct + { + get { return distinct; } + } + + /// + /// Gets the expression. + /// + /// The expression. + public SqlExpression Expression + { + get { return expression; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlAggregate) expression; + NodeType = replacingExpression.NodeType; + distinct = replacingExpression.Distinct; + this.expression = replacingExpression.Expression; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlAggregate(NodeType, + expression.IsNullReference() ? null : (SqlExpression) expression.Clone(context), distinct); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlAggregate(SqlNodeType nodeType, SqlExpression expression, bool distinct) : base(nodeType) + { + this.expression = expression; + this.distinct = distinct; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray.cs index 42bd8671f6..983735ee01 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.13 - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public abstract class SqlArray : SqlExpression - { - public abstract Type ItemType { get; } - public abstract int Length { get; } - public abstract object[] GetValues(); - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlArray() - : base(SqlNodeType.Array) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.13 + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public abstract class SqlArray : SqlExpression + { + public abstract Type ItemType { get; } + public abstract int Length { get; } + public abstract object[] GetValues(); + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlArray() + : base(SqlNodeType.Array) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray{T}.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray{T}.cs index 35ff4e1e8e..64f5f5acea 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray{T}.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray{T}.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents generic array expression. - /// - [Serializable] - public class SqlArray : SqlArray - { - /// - /// Gets the values. - /// - /// The values. - public T[] Values { get; private set; } - - public override Type ItemType { get { return typeof (T); } } - - public override int Length { get { return Values.Length; } } - - public override object[] GetValues() - { - return Values.Cast().ToArray(); - } - - public static implicit operator SqlArray(T[] value) - { - return new SqlArray(value); - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs>(expression, "expression"); - var replacingExpression = (SqlArray) expression; - Values = replacingExpression.Values; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlArray((T[]) Values.Clone()); - context.NodeMapping[this] = clone; - return clone; - } - - - // Constructors - - internal SqlArray(T[] values) - { - Values = values; - } - - internal SqlArray(List values) - { - Values = values.Cast().ToArray(); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents generic array expression. + /// + [Serializable] + public class SqlArray : SqlArray + { + /// + /// Gets the values. + /// + /// The values. + public T[] Values { get; private set; } + + public override Type ItemType { get { return typeof (T); } } + + public override int Length { get { return Values.Length; } } + + public override object[] GetValues() + { + return Values.Cast().ToArray(); + } + + public static implicit operator SqlArray(T[] value) + { + return new SqlArray(value); + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs>(expression, "expression"); + var replacingExpression = (SqlArray) expression; + Values = replacingExpression.Values; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlArray((T[]) Values.Clone()); + context.NodeMapping[this] = clone; + return clone; + } + + + // Constructors + + internal SqlArray(T[] values) + { + Values = values; + } + + internal SqlArray(List values) + { + Values = values.Cast().ToArray(); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBetween.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBetween.cs index efe2bccd9b..72654308b3 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBetween.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBetween.cs @@ -1,81 +1,81 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents between expression. - /// - [Serializable] - public class SqlBetween: SqlExpression - { - private SqlExpression left; - private SqlExpression right; - private SqlExpression expression; - - /// - /// Gets the left boundary of the between predicate. - /// - /// The left boundary of the between predicate. - public SqlExpression Left - { - get { return left; } - } - - /// - /// Gets the right boundary of the between predicate. - /// - /// The right boundary of the between predicate. - public SqlExpression Right - { - get { return right; } - } - - /// - /// Gets the expression to compare. - /// - /// The expression to compare. - public SqlExpression Expression - { - get { return expression; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlBetween replacingExpression = expression as SqlBetween; - NodeType = replacingExpression.NodeType; - left = replacingExpression.Left; - right = replacingExpression.Right; - expression = replacingExpression.Expression; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlBetween clone = new SqlBetween(NodeType, (SqlExpression)expression.Clone(context), (SqlExpression)left.Clone(context), (SqlExpression)right.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlBetween(SqlNodeType nodeType, SqlExpression expression, SqlExpression left, SqlExpression right) - : base(nodeType) - { - this.expression = expression; - this.left = left; - this.right = right; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents between expression. + /// + [Serializable] + public class SqlBetween: SqlExpression + { + private SqlExpression left; + private SqlExpression right; + private SqlExpression expression; + + /// + /// Gets the left boundary of the between predicate. + /// + /// The left boundary of the between predicate. + public SqlExpression Left + { + get { return left; } + } + + /// + /// Gets the right boundary of the between predicate. + /// + /// The right boundary of the between predicate. + public SqlExpression Right + { + get { return right; } + } + + /// + /// Gets the expression to compare. + /// + /// The expression to compare. + public SqlExpression Expression + { + get { return expression; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlBetween replacingExpression = expression as SqlBetween; + NodeType = replacingExpression.NodeType; + left = replacingExpression.Left; + right = replacingExpression.Right; + expression = replacingExpression.Expression; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlBetween clone = new SqlBetween(NodeType, (SqlExpression)expression.Clone(context), (SqlExpression)left.Clone(context), (SqlExpression)right.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlBetween(SqlNodeType nodeType, SqlExpression expression, SqlExpression left, SqlExpression right) + : base(nodeType) + { + this.expression = expression; + this.left = left; + this.right = right; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBinary.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBinary.cs index 9ff4a361b7..aa89c4e053 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBinary.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBinary.cs @@ -1,118 +1,118 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents binary expression. - /// - [Serializable] - public class SqlBinary : SqlExpression - { - /// - /// Gets the left operand of the binary operator. - /// - /// The left operand of the binary operator. - public SqlExpression Left { get; private set; } - - /// - /// Gets the right operand of the binary operator. - /// - /// The right operand of the binary operator. - public SqlExpression Right { get; private set; } - - public static bool operator true(SqlBinary operand) - { - switch (operand.NodeType) { - case SqlNodeType.Equals: - if (((object)operand.Right)==((object)operand.Left)) - return true; - else - return false; - case SqlNodeType.NotEquals: - if (((object)operand.Right)!=((object)operand.Left)) - return true; - else - return false; - case SqlNodeType.And: - if (((SqlBinary)operand.Left ? true : false) && ((SqlBinary)operand.Right ? true : false)) - return true; - else - return false; - case SqlNodeType.Or: - if (((SqlBinary)operand.Left ? true : false) || ((SqlBinary)operand.Right ? true : false)) - return true; - else - return false; - default: - return false; - } - } - - public static bool operator false(SqlBinary operand) - { - switch (operand.NodeType) { - case SqlNodeType.Equals: - if (((object)operand.Right)==((object)operand.Left)) - return false; - else - return true; - case SqlNodeType.NotEquals: - if (((object)operand.Right)!=((object)operand.Left)) - return false; - else - return true; - case SqlNodeType.And: - if (((SqlBinary)operand.Left ? true : false) && ((SqlBinary)operand.Right ? true : false)) - return false; - else - return true; - case SqlNodeType.Or: - if (((SqlBinary)operand.Left ? true : false) || ((SqlBinary)operand.Right ? true : false)) - return false; - else - return true; - default: - return false; - } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlBinary) expression; - NodeType = replacingExpression.NodeType; - Left = replacingExpression.Left; - Right = replacingExpression.Right; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlBinary(NodeType, - (SqlExpression) Left.Clone(context), - (SqlExpression) Right.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlBinary(SqlNodeType nodeType, SqlExpression left, SqlExpression right) : base(nodeType) - { - Left = left; - Right = right; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents binary expression. + /// + [Serializable] + public class SqlBinary : SqlExpression + { + /// + /// Gets the left operand of the binary operator. + /// + /// The left operand of the binary operator. + public SqlExpression Left { get; private set; } + + /// + /// Gets the right operand of the binary operator. + /// + /// The right operand of the binary operator. + public SqlExpression Right { get; private set; } + + public static bool operator true(SqlBinary operand) + { + switch (operand.NodeType) { + case SqlNodeType.Equals: + if (((object)operand.Right)==((object)operand.Left)) + return true; + else + return false; + case SqlNodeType.NotEquals: + if (((object)operand.Right)!=((object)operand.Left)) + return true; + else + return false; + case SqlNodeType.And: + if (((SqlBinary)operand.Left ? true : false) && ((SqlBinary)operand.Right ? true : false)) + return true; + else + return false; + case SqlNodeType.Or: + if (((SqlBinary)operand.Left ? true : false) || ((SqlBinary)operand.Right ? true : false)) + return true; + else + return false; + default: + return false; + } + } + + public static bool operator false(SqlBinary operand) + { + switch (operand.NodeType) { + case SqlNodeType.Equals: + if (((object)operand.Right)==((object)operand.Left)) + return false; + else + return true; + case SqlNodeType.NotEquals: + if (((object)operand.Right)!=((object)operand.Left)) + return false; + else + return true; + case SqlNodeType.And: + if (((SqlBinary)operand.Left ? true : false) && ((SqlBinary)operand.Right ? true : false)) + return false; + else + return true; + case SqlNodeType.Or: + if (((SqlBinary)operand.Left ? true : false) || ((SqlBinary)operand.Right ? true : false)) + return false; + else + return true; + default: + return false; + } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlBinary) expression; + NodeType = replacingExpression.NodeType; + Left = replacingExpression.Left; + Right = replacingExpression.Right; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlBinary(NodeType, + (SqlExpression) Left.Clone(context), + (SqlExpression) Right.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlBinary(SqlNodeType nodeType, SqlExpression left, SqlExpression right) : base(nodeType) + { + Left = left; + Right = right; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCase.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCase.cs index ea0536ea91..9bce925e7f 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCase.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCase.cs @@ -1,149 +1,149 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCase: SqlExpression, IEnumerable> - { - private SqlExpression value; - private IList> cases = new List>(); - private SqlExpression @else; - - public SqlCase Add(SqlExpression key, SqlExpression value) - { - ArgumentValidator.EnsureArgumentNotNull(key, "key"); - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - cases.Add(new KeyValuePair(key, value)); - return this; - } - - public void Clear() - { - cases.Clear(); - value = null; - @else = null; - } - - public bool Remove(SqlExpression key) - { - for(int i = 0; i < cases.Count; i++) - if ((object)cases[i] == (object)key) { - cases.RemoveAt(i); - return true; - } - return false; - } - - public int Count - { - get { return cases.Count; } - } - - public int IndexOf(SqlExpression key) - { - int result = 0; - foreach (KeyValuePair pair in cases) { - if ((object)pair.Key == (object)key) - return result; - result++; - } - return -1; - } - - public SqlExpression this[SqlExpression key] - { - get - { - int index = IndexOf(key); - return index >= 0 ? cases[index].Value : null; - } - set - { - ArgumentValidator.EnsureArgumentNotNull(key, "key"); - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - int index = IndexOf(key); - KeyValuePair @case = new KeyValuePair(key, value); - if (index >= 0) - cases[index] = @case; - else - cases.Add(@case); - } - } - - public SqlExpression Value - { - get { return value; } - set - { - SqlValidator.EnsureIsArithmeticExpression(value); - this.value = value; - } - } - - public SqlExpression Else - { - get { return @else; } - set { @else = value; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlCase replacingExpression = expression as SqlCase; - value = replacingExpression.Value; - @else = replacingExpression.Else; - cases.Clear(); - foreach (KeyValuePair pair in replacingExpression) - cases.Add(pair); - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlCase(value.IsNullReference() ? null : (SqlExpression) value.Clone(context)); - - if (!@else.IsNullReference()) - clone.Else = (SqlExpression) @else.Clone(context); - - foreach (KeyValuePair pair in cases) - clone[(SqlExpression) pair.Key.Clone(context)] = (SqlExpression) pair.Value.Clone(context); - - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - IEnumerator> IEnumerable>. - GetEnumerator() - { - foreach (KeyValuePair pair in cases) { - yield return pair; - } - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable>)this).GetEnumerator(); - } - - internal SqlCase(SqlExpression value) - : base(SqlNodeType.Case) - { - this.value = value; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCase: SqlExpression, IEnumerable> + { + private SqlExpression value; + private IList> cases = new List>(); + private SqlExpression @else; + + public SqlCase Add(SqlExpression key, SqlExpression value) + { + ArgumentValidator.EnsureArgumentNotNull(key, "key"); + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + cases.Add(new KeyValuePair(key, value)); + return this; + } + + public void Clear() + { + cases.Clear(); + value = null; + @else = null; + } + + public bool Remove(SqlExpression key) + { + for(int i = 0; i < cases.Count; i++) + if ((object)cases[i] == (object)key) { + cases.RemoveAt(i); + return true; + } + return false; + } + + public int Count + { + get { return cases.Count; } + } + + public int IndexOf(SqlExpression key) + { + int result = 0; + foreach (KeyValuePair pair in cases) { + if ((object)pair.Key == (object)key) + return result; + result++; + } + return -1; + } + + public SqlExpression this[SqlExpression key] + { + get + { + int index = IndexOf(key); + return index >= 0 ? cases[index].Value : null; + } + set + { + ArgumentValidator.EnsureArgumentNotNull(key, "key"); + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + int index = IndexOf(key); + KeyValuePair @case = new KeyValuePair(key, value); + if (index >= 0) + cases[index] = @case; + else + cases.Add(@case); + } + } + + public SqlExpression Value + { + get { return value; } + set + { + SqlValidator.EnsureIsArithmeticExpression(value); + this.value = value; + } + } + + public SqlExpression Else + { + get { return @else; } + set { @else = value; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlCase replacingExpression = expression as SqlCase; + value = replacingExpression.Value; + @else = replacingExpression.Else; + cases.Clear(); + foreach (KeyValuePair pair in replacingExpression) + cases.Add(pair); + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlCase(value.IsNullReference() ? null : (SqlExpression) value.Clone(context)); + + if (!@else.IsNullReference()) + clone.Else = (SqlExpression) @else.Clone(context); + + foreach (KeyValuePair pair in cases) + clone[(SqlExpression) pair.Key.Clone(context)] = (SqlExpression) pair.Value.Clone(context); + + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + IEnumerator> IEnumerable>. + GetEnumerator() + { + foreach (KeyValuePair pair in cases) { + yield return pair; + } + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable>)this).GetEnumerator(); + } + + internal SqlCase(SqlExpression value) + : base(SqlNodeType.Case) + { + this.value = value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCast.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCast.cs index 7bb4343014..e260601094 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCast.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCast.cs @@ -1,47 +1,47 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCast : SqlExpression - { - public SqlExpression Operand { get; private set; } - public SqlValueType Type { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlCast) expression; - Operand = replacingExpression.Operand; - Type = replacingExpression.Type; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlCast((SqlExpression) Operand.Clone(context), Type); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCast(SqlExpression operand, SqlValueType type) - : base(SqlNodeType.Cast) - { - Operand = operand; - Type = type; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCast : SqlExpression + { + public SqlExpression Operand { get; private set; } + public SqlValueType Type { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlCast) expression; + Operand = replacingExpression.Operand; + Type = replacingExpression.Type; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlCast((SqlExpression) Operand.Clone(context), Type); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCast(SqlExpression operand, SqlValueType type) + : base(SqlNodeType.Cast) + { + Operand = operand; + Type = type; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCollate.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCollate.cs index 4ca48d76b6..eb1357cae2 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCollate.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCollate.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCollate : SqlExpression - { - private Collation collation; - private SqlExpression operand; - - /// - /// Gets the collation. - /// - /// The collation. - public Collation Collation { - get { - return collation; - } - } - - /// - /// Gets the operand. - /// - /// The operand. - public SqlExpression Operand { - get { - return operand; - } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlCollate replacingExpression = expression as SqlCollate; - operand = replacingExpression.Operand; - collation = replacingExpression.Collation; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlCollate clone = new SqlCollate((SqlExpression)operand.Clone(context), collation); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCollate(SqlExpression operand, Collation collation) : base(SqlNodeType.Collate) - { - this.operand = operand; - this.collation = collation; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCollate : SqlExpression + { + private Collation collation; + private SqlExpression operand; + + /// + /// Gets the collation. + /// + /// The collation. + public Collation Collation { + get { + return collation; + } + } + + /// + /// Gets the operand. + /// + /// The operand. + public SqlExpression Operand { + get { + return operand; + } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlCollate replacingExpression = expression as SqlCollate; + operand = replacingExpression.Operand; + collation = replacingExpression.Collation; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlCollate clone = new SqlCollate((SqlExpression)operand.Clone(context), collation); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCollate(SqlExpression operand, Collation collation) : base(SqlNodeType.Collate) + { + this.operand = operand; + this.collation = collation; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumn.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumn.cs index 851f6b8a60..0d81a77c3d 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumn.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public abstract class SqlColumn : SqlExpression - { - private string name; - private SqlTable sqlTable; - - /// - /// Gets or sets the name of this instance. - /// - /// The alias. - public virtual string Name - { - get { return name; } - } - - /// - /// Gets the table reference. - /// - /// The table reference. - public SqlTable SqlTable - { - get { return sqlTable; } - } - - public override void ReplaceWith(SqlExpression expression) - { - var replacingExpression = expression as SqlColumn; - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - sqlTable = replacingExpression.SqlTable; - name = replacingExpression.Name; - } - - // Constructor - - internal SqlColumn(SqlTable sqlTable, string name) : base(SqlNodeType.Column) - { - this.sqlTable = sqlTable; - this.name = name; - } - - internal SqlColumn(string name) : base(SqlNodeType.Column) - { - this.name = name; - } - - internal SqlColumn(SqlTable sqlTable) : base(SqlNodeType.Column) - { - this.sqlTable = sqlTable; - } - - internal SqlColumn() : base(SqlNodeType.Column) - { - } - - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public abstract class SqlColumn : SqlExpression + { + private string name; + private SqlTable sqlTable; + + /// + /// Gets or sets the name of this instance. + /// + /// The alias. + public virtual string Name + { + get { return name; } + } + + /// + /// Gets the table reference. + /// + /// The table reference. + public SqlTable SqlTable + { + get { return sqlTable; } + } + + public override void ReplaceWith(SqlExpression expression) + { + var replacingExpression = expression as SqlColumn; + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + sqlTable = replacingExpression.SqlTable; + name = replacingExpression.Name; + } + + // Constructor + + internal SqlColumn(SqlTable sqlTable, string name) : base(SqlNodeType.Column) + { + this.sqlTable = sqlTable; + this.name = name; + } + + internal SqlColumn(string name) : base(SqlNodeType.Column) + { + this.name = name; + } + + internal SqlColumn(SqlTable sqlTable) : base(SqlNodeType.Column) + { + this.sqlTable = sqlTable; + } + + internal SqlColumn() : base(SqlNodeType.Column) + { + } + + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnRef.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnRef.cs index 42d8ff08ab..3739291305 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnRef.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnRef.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents a reference to a SQL column. - /// - [Serializable] - public class SqlColumnRef : SqlColumn - { - /// - /// Gets the SQL column. - /// - public SqlColumn SqlColumn { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlColumn = ((SqlColumnRef) expression).SqlColumn; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlColumnRef( - SqlTable!=null ? (SqlTable) SqlTable.Clone(context) : null, - (SqlColumn) SqlColumn.Clone(context), Name); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlColumnRef(SqlTable sqlTable, SqlColumn sqlColumn, string name) - : base(sqlTable, name) - { - SqlColumn = sqlColumn; - } - - internal SqlColumnRef(SqlColumn sqlColumn, string name) - : base(null, name) - { - SqlColumn = sqlColumn; - } - - internal SqlColumnRef(SqlColumn sqlColumn) - { - SqlColumn = sqlColumn; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents a reference to a SQL column. + /// + [Serializable] + public class SqlColumnRef : SqlColumn + { + /// + /// Gets the SQL column. + /// + public SqlColumn SqlColumn { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlColumn = ((SqlColumnRef) expression).SqlColumn; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlColumnRef( + SqlTable!=null ? (SqlTable) SqlTable.Clone(context) : null, + (SqlColumn) SqlColumn.Clone(context), Name); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlColumnRef(SqlTable sqlTable, SqlColumn sqlColumn, string name) + : base(sqlTable, name) + { + SqlColumn = sqlColumn; + } + + internal SqlColumnRef(SqlColumn sqlColumn, string name) + : base(null, name) + { + SqlColumn = sqlColumn; + } + + internal SqlColumnRef(SqlColumn sqlColumn) + { + SqlColumn = sqlColumn; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnStub.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnStub.cs index 7c14f54539..88f0f6e0ec 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnStub.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlColumnStub.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.08 - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlColumnStub : SqlColumn - { - public SqlColumn Column { get; set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlColumnStub( - SqlTable != null ? (SqlTable) SqlTable.Clone(context) : null, - Column); - - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - {} - - // Constructors - - internal SqlColumnStub(SqlColumn column) - : base(column.Name ?? string.Empty) - { - Column = column; - } - - private SqlColumnStub(SqlTable sqlTable, SqlColumn column) - : base(sqlTable, column.Name ?? string.Empty) - { - Column = column; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.08 + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlColumnStub : SqlColumn + { + public SqlColumn Column { get; set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlColumnStub( + SqlTable != null ? (SqlTable) SqlTable.Clone(context) : null, + Column); + + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + {} + + // Constructors + + internal SqlColumnStub(SqlColumn column) + : base(column.Name ?? string.Empty) + { + Column = column; + } + + private SqlColumnStub(SqlTable sqlTable, SqlColumn column) + : base(sqlTable, column.Name ?? string.Empty) + { + Column = column; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs index 70fe8c2fdd..f901e2f674 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.01 - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlConcat : SqlExpressionList - { - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var expressionsClone = new Collection(); - foreach (var e in expressions) - expressionsClone.Add((SqlExpression) e.Clone(context)); - - var clone = new SqlConcat(expressionsClone); - return clone; - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlConcat) expression; - expressions.Clear(); - foreach (var e in replacingExpression) - expressions.Add(e); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - - // Constructors - - internal SqlConcat(IList expressions) - : base(SqlNodeType.Concat, expressions) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.01 + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlConcat : SqlExpressionList + { + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var expressionsClone = new Collection(); + foreach (var e in expressions) + expressionsClone.Add((SqlExpression) e.Clone(context)); + + var clone = new SqlConcat(expressionsClone); + return clone; + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlConcat) expression; + expressions.Clear(); + foreach (var e in replacingExpression) + expressions.Add(e); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + + // Constructors + + internal SqlConcat(IList expressions) + : base(SqlNodeType.Concat, expressions) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlContainer.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlContainer.cs index fa8fc2beb4..901a69f29c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlContainer.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlContainer.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.11 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents a container that can hold any value. - /// An attempt to its translation leads to an error. - /// This class can be used to store temporary values inside . - /// - public class SqlContainer : SqlExpression - { - /// - /// Gets the value contained in this instance. - /// - public object Value { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlContainer) expression; - Value = replacingExpression.Value; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlContainer(Value); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - throw new NotSupportedException(); - } - - internal SqlContainer(object value) - : base(SqlNodeType.Container) - { - Value = value; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.11 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents a container that can hold any value. + /// An attempt to its translation leads to an error. + /// This class can be used to store temporary values inside . + /// + public class SqlContainer : SqlExpression + { + /// + /// Gets the value contained in this instance. + /// + public object Value { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlContainer) expression; + Value = replacingExpression.Value; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlContainer(Value); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + throw new NotSupportedException(); + } + + internal SqlContainer(object value) + : base(SqlNodeType.Container) + { + Value = value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCursor.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCursor.cs index a3ddea80ca..9b3bf83d3f 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCursor.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCursor.cs @@ -1,188 +1,188 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCursor: SqlExpression - { - private readonly string name; - private bool insensitive; - private bool scroll; - private ISqlQueryExpression query; - private bool readOnly = false; - private readonly SqlColumnCollection columns = new SqlColumnCollection(); - private bool withHold; - private bool withReturn; - - /// - /// Gets the name of the cursor. - /// - /// The name of the cursor. - public string Name - { - get { return name; } - } - - /// - /// Gets or sets a value indicating whether this - /// makes a temporary copy of the data to be used. - /// - /// if this makes a temporary - /// copy of the data to be used; otherwise, . - public bool Insensitive - { - get { return insensitive; } - set { insensitive = value; } - } - - /// - /// Gets or sets a value indicating whether all fetch options are available for this cursor. - /// - /// if all fetch options are available; otherwise, . - public bool Scroll - { - get { return scroll; } - set { scroll = value; } - } - - /// - /// Gets or sets the select statement that defines the result set of the cursor. - /// - /// The select statement that defines the result set of the cursor. - public ISqlQueryExpression Query - { - get { return query; } - set - { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - query = value; - } - } - - /// - /// Gets or sets a value indicating whether cursor is read only. - /// - /// if cursor is read only; otherwise, . - public bool ReadOnly - { - get { return readOnly; } - set { readOnly = value; } - } - - /// - /// Gets updatable columns within the cursor. - /// - /// Updatable columns within the cursor. - public SqlColumnCollection Columns - { - get { return columns; } - } - - /// - /// Gets or sets a value indicating whether this is holdable cursor. - /// - /// - /// if this instance is a holdable cursor; otherwise, . - /// - public bool WithHold - { - get { return withHold; } - set { withHold = value; } - } - - /// - /// Gets or sets a value indicating whether this instance is result set cursor. - /// - /// - /// if this instance is result set cursor; otherwise, . - /// - public bool WithReturn - { - get { return withReturn; } - set { withReturn = value; } - } - - public SqlDeclareCursor Declare() - { - return new SqlDeclareCursor(this); - } - - public SqlOpenCursor Open() - { - return new SqlOpenCursor(this); - } - - public SqlCloseCursor Close() - { - return new SqlCloseCursor(this); - } - - public SqlFetch Fetch(SqlFetchOption option, SqlExpression rowCount, params ISqlCursorFetchTarget[] target) - { - if (!rowCount.IsNullReference()) { - if (option != SqlFetchOption.Absolute && option != SqlFetchOption.Relative) - throw new ArgumentException(Strings.ExInvalidUsageOfTheRowCountArgument, "rowCount"); - SqlValidator.EnsureIsArithmeticExpression(rowCount); - } - else if (option == SqlFetchOption.Absolute || option == SqlFetchOption.Relative) - throw new ArgumentException(Strings.ExInvalidUsageOfTheOrientationArgument, "option"); - if (target != null) - for (int i = 0, l = target.Length; i < l; i++) - ArgumentValidator.EnsureArgumentNotNull(target[i], "target"); - return new SqlFetch(option, rowCount, this, target); - } - - public SqlFetch Fetch(SqlFetchOption option, params ISqlCursorFetchTarget[] target) - { - return Fetch(option, null, target); - } - - public SqlFetch Fetch(SqlFetchOption option) - { - return Fetch(option, null, (ISqlCursorFetchTarget[]) null); - } - - public SqlFetch Fetch(SqlFetchOption option, SqlExpression rowCount) - { - return Fetch(option, rowCount, (ISqlCursorFetchTarget[]) null); - } - - public SqlFetch Fetch(params ISqlCursorFetchTarget[] target) - { - return Fetch(SqlFetchOption.Next, null, target); - } - - public SqlFetch Fetch() - { - return Fetch(SqlFetchOption.Next, null, (ISqlCursorFetchTarget[])null); - } - - - public override void ReplaceWith(SqlExpression expression) - { - throw new NotImplementedException(); - } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlCursor(string name, ISqlQueryExpression query) - : base(SqlNodeType.Cursor) - { - this.name = name; - this.query = query; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCursor: SqlExpression + { + private readonly string name; + private bool insensitive; + private bool scroll; + private ISqlQueryExpression query; + private bool readOnly = false; + private readonly SqlColumnCollection columns = new SqlColumnCollection(); + private bool withHold; + private bool withReturn; + + /// + /// Gets the name of the cursor. + /// + /// The name of the cursor. + public string Name + { + get { return name; } + } + + /// + /// Gets or sets a value indicating whether this + /// makes a temporary copy of the data to be used. + /// + /// if this makes a temporary + /// copy of the data to be used; otherwise, . + public bool Insensitive + { + get { return insensitive; } + set { insensitive = value; } + } + + /// + /// Gets or sets a value indicating whether all fetch options are available for this cursor. + /// + /// if all fetch options are available; otherwise, . + public bool Scroll + { + get { return scroll; } + set { scroll = value; } + } + + /// + /// Gets or sets the select statement that defines the result set of the cursor. + /// + /// The select statement that defines the result set of the cursor. + public ISqlQueryExpression Query + { + get { return query; } + set + { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + query = value; + } + } + + /// + /// Gets or sets a value indicating whether cursor is read only. + /// + /// if cursor is read only; otherwise, . + public bool ReadOnly + { + get { return readOnly; } + set { readOnly = value; } + } + + /// + /// Gets updatable columns within the cursor. + /// + /// Updatable columns within the cursor. + public SqlColumnCollection Columns + { + get { return columns; } + } + + /// + /// Gets or sets a value indicating whether this is holdable cursor. + /// + /// + /// if this instance is a holdable cursor; otherwise, . + /// + public bool WithHold + { + get { return withHold; } + set { withHold = value; } + } + + /// + /// Gets or sets a value indicating whether this instance is result set cursor. + /// + /// + /// if this instance is result set cursor; otherwise, . + /// + public bool WithReturn + { + get { return withReturn; } + set { withReturn = value; } + } + + public SqlDeclareCursor Declare() + { + return new SqlDeclareCursor(this); + } + + public SqlOpenCursor Open() + { + return new SqlOpenCursor(this); + } + + public SqlCloseCursor Close() + { + return new SqlCloseCursor(this); + } + + public SqlFetch Fetch(SqlFetchOption option, SqlExpression rowCount, params ISqlCursorFetchTarget[] target) + { + if (!rowCount.IsNullReference()) { + if (option != SqlFetchOption.Absolute && option != SqlFetchOption.Relative) + throw new ArgumentException(Strings.ExInvalidUsageOfTheRowCountArgument, "rowCount"); + SqlValidator.EnsureIsArithmeticExpression(rowCount); + } + else if (option == SqlFetchOption.Absolute || option == SqlFetchOption.Relative) + throw new ArgumentException(Strings.ExInvalidUsageOfTheOrientationArgument, "option"); + if (target != null) + for (int i = 0, l = target.Length; i < l; i++) + ArgumentValidator.EnsureArgumentNotNull(target[i], "target"); + return new SqlFetch(option, rowCount, this, target); + } + + public SqlFetch Fetch(SqlFetchOption option, params ISqlCursorFetchTarget[] target) + { + return Fetch(option, null, target); + } + + public SqlFetch Fetch(SqlFetchOption option) + { + return Fetch(option, null, (ISqlCursorFetchTarget[]) null); + } + + public SqlFetch Fetch(SqlFetchOption option, SqlExpression rowCount) + { + return Fetch(option, rowCount, (ISqlCursorFetchTarget[]) null); + } + + public SqlFetch Fetch(params ISqlCursorFetchTarget[] target) + { + return Fetch(SqlFetchOption.Next, null, target); + } + + public SqlFetch Fetch() + { + return Fetch(SqlFetchOption.Next, null, (ISqlCursorFetchTarget[])null); + } + + + public override void ReplaceWith(SqlExpression expression) + { + throw new NotImplementedException(); + } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlCursor(string name, ISqlQueryExpression query) + : base(SqlNodeType.Cursor) + { + this.name = name; + this.query = query; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCustomFunctionCall.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCustomFunctionCall.cs index 928148d471..72741cde81 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCustomFunctionCall.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCustomFunctionCall.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCustomFunctionCall : SqlExpression - { - /// - /// Gets the custom function type. - /// - public SqlCustomFunctionType FunctionType { get; private set; } - - /// - /// Gets the expressions. - /// - public IList Arguments { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlCustomFunctionCall) expression; - FunctionType = replacingExpression.FunctionType; - Arguments.Clear(); - foreach (SqlExpression argument in replacingExpression.Arguments) - Arguments.Add(argument); - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlCustomFunctionCall(FunctionType); - for (int i = 0, l = Arguments.Count; i < l; i++) - clone.Arguments.Add((SqlExpression) Arguments[i].Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public SqlCustomFunctionCall(SqlCustomFunctionType sqlCustomFunctionType, IEnumerable arguments) - : base(SqlNodeType.CustomFunctionCall) - { - FunctionType = sqlCustomFunctionType; - Arguments = new Collection(); - foreach (SqlExpression argument in arguments) - Arguments.Add(argument); - } - - public SqlCustomFunctionCall(SqlCustomFunctionType sqlCustomFunctionType, params SqlExpression[] arguments) - : base(SqlNodeType.CustomFunctionCall) - { - FunctionType = sqlCustomFunctionType; - Arguments = new Collection(); - if (arguments!=null) - foreach (SqlExpression argument in arguments) - Arguments.Add(argument); - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCustomFunctionCall : SqlExpression + { + /// + /// Gets the custom function type. + /// + public SqlCustomFunctionType FunctionType { get; private set; } + + /// + /// Gets the expressions. + /// + public IList Arguments { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlCustomFunctionCall) expression; + FunctionType = replacingExpression.FunctionType; + Arguments.Clear(); + foreach (SqlExpression argument in replacingExpression.Arguments) + Arguments.Add(argument); + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlCustomFunctionCall(FunctionType); + for (int i = 0, l = Arguments.Count; i < l; i++) + clone.Arguments.Add((SqlExpression) Arguments[i].Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public SqlCustomFunctionCall(SqlCustomFunctionType sqlCustomFunctionType, IEnumerable arguments) + : base(SqlNodeType.CustomFunctionCall) + { + FunctionType = sqlCustomFunctionType; + Arguments = new Collection(); + foreach (SqlExpression argument in arguments) + Arguments.Add(argument); + } + + public SqlCustomFunctionCall(SqlCustomFunctionType sqlCustomFunctionType, params SqlExpression[] arguments) + : base(SqlNodeType.CustomFunctionCall) + { + FunctionType = sqlCustomFunctionType; + Arguments = new Collection(); + if (arguments!=null) + foreach (SqlExpression argument in arguments) + Arguments.Add(argument); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDefaultValue.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDefaultValue.cs index 151fe82bfd..f8aeb6425d 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDefaultValue.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDefaultValue.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlDefaultValue : SqlExpression - { - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - } - - internal override object Clone(SqlNodeCloneContext context) - { - return this; - } - - internal SqlDefaultValue() : base(SqlNodeType.DefaultValue) - { - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlDefaultValue : SqlExpression + { + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + } + + internal override object Clone(SqlNodeCloneContext context) + { + return this; + } + + internal SqlDefaultValue() : base(SqlNodeType.DefaultValue) + { + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDynamicFilter.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDynamicFilter.cs index 14f9d0c550..b4a2d0b73c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDynamicFilter.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlDynamicFilter.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.11.06 - -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public class SqlDynamicFilter : SqlExpression - { - public object Id { get; private set; } - - public List Expressions { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlDynamicFilter(Id); - foreach (var expression in Expressions) { - clone.Expressions.Add((SqlExpression) expression.Clone(context)); - } - - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlDynamicFilter) expression; - Id = replacingExpression.Id; - Expressions.Clear(); - Expressions.AddRange(replacingExpression.Expressions); - } - - - // Constructors - - internal SqlDynamicFilter(object id) - : base(SqlNodeType.DynamicFilter) - { - Id = id; - Expressions = new List(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.11.06 + +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public class SqlDynamicFilter : SqlExpression + { + public object Id { get; private set; } + + public List Expressions { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlDynamicFilter(Id); + foreach (var expression in Expressions) { + clone.Expressions.Add((SqlExpression) expression.Clone(context)); + } + + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlDynamicFilter) expression; + Id = replacingExpression.Id; + Expressions.Clear(); + Expressions.AddRange(replacingExpression.Expressions); + } + + + // Constructors + + internal SqlDynamicFilter(object id) + : base(SqlNodeType.DynamicFilter) + { + Id = id; + Expressions = new List(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpression.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpression.cs index fe6a5a20be..080d53d7df 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpression.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpression.cs @@ -1,236 +1,236 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Defines base class for any sql expression. - /// - [Serializable] - public abstract class SqlExpression : SqlNode - { - public static bool operator true(SqlExpression operand) - { - return false; - } - - public static bool operator false(SqlExpression operand) - { - return false; - } - - #region SqlExpression/SqlExpression - - public static SqlExpression operator &(SqlExpression left, SqlExpression right) - { - if (left.IsNullReference()) - return right; - if (right.IsNullReference()) - return left; - if (SqlValidator.IsBooleanExpression(left)) - return SqlDml.And(left, right); - return SqlDml.BitAnd(left, right); - } - - public static SqlExpression operator |(SqlExpression left, SqlExpression right) - { - if (left.IsNullReference()) - return right; - if (right.IsNullReference()) - return left; - if (SqlValidator.IsBooleanExpression(left)) - return SqlDml.Or(left, right); - return SqlDml.BitOr(left, right); - } - - public static SqlExpression operator ^(SqlExpression left, SqlExpression right) - { - return SqlDml.BitXor(left, right); - } - - public static SqlBinary operator == (SqlExpression left, SqlExpression right) - { - return SqlDml.Binary(SqlNodeType.Equals, left, right); - } - - public static SqlBinary operator != (SqlExpression left, SqlExpression right) - { - return SqlDml.Binary(SqlNodeType.NotEquals, left, right); - } - - public static SqlBinary operator > (SqlExpression left, SqlExpression right) - { - return SqlDml.GreaterThan(left, right); - } - - public static SqlBinary operator < (SqlExpression left, SqlExpression right) - { - return SqlDml.LessThan(left, right); - } - - public static SqlBinary operator >= (SqlExpression left, SqlExpression right) - { - return SqlDml.GreaterThanOrEquals(left, right); - } - - public static SqlBinary operator <= (SqlExpression left, SqlExpression right) - { - return SqlDml.LessThanOrEquals(left, right); - } - - public static SqlBinary operator + (SqlExpression left, SqlExpression right) - { - return SqlDml.Add(left, right); - } - - public static SqlBinary operator - (SqlExpression left, SqlExpression right) - { - return SqlDml.Subtract(left, right); - } - - public static SqlUnary operator -(SqlExpression operand) - { - return SqlDml.Negate(operand); - } - - public static SqlBinary operator * (SqlExpression left, SqlExpression right) - { - return SqlDml.Multiply(left, right); - } - - public static SqlBinary operator / (SqlExpression left, SqlExpression right) - { - return SqlDml.Divide(left, right); - } - - public static SqlBinary operator % (SqlExpression left, SqlExpression right) - { - return SqlDml.Modulo(left, right); - } - - # endregion - - public static SqlUnary operator !(SqlExpression operand) - { - return SqlDml.Not(operand); - } - - public static SqlUnary operator ~ (SqlExpression operand) - { - return SqlDml.BitNot(operand); - } - - public static implicit operator SqlExpression(Guid value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(bool value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(sbyte value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(byte value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(byte[] value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(short value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(ushort value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(int value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(uint value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(long value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(ulong value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(float value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(double value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(decimal value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(string value) - { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(DateTime value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(DateTimeOffset value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(TimeSpan value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(char value) - { - return new SqlLiteral(value); - } - - public static implicit operator SqlExpression(SqlSelect select) - { - return SqlDml.SubQuery(select); - } - - public abstract void ReplaceWith(SqlExpression expression); - - // Constructor - - protected SqlExpression(SqlNodeType nodeType) : base(nodeType) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Defines base class for any sql expression. + /// + [Serializable] + public abstract class SqlExpression : SqlNode + { + public static bool operator true(SqlExpression operand) + { + return false; + } + + public static bool operator false(SqlExpression operand) + { + return false; + } + + #region SqlExpression/SqlExpression + + public static SqlExpression operator &(SqlExpression left, SqlExpression right) + { + if (left.IsNullReference()) + return right; + if (right.IsNullReference()) + return left; + if (SqlValidator.IsBooleanExpression(left)) + return SqlDml.And(left, right); + return SqlDml.BitAnd(left, right); + } + + public static SqlExpression operator |(SqlExpression left, SqlExpression right) + { + if (left.IsNullReference()) + return right; + if (right.IsNullReference()) + return left; + if (SqlValidator.IsBooleanExpression(left)) + return SqlDml.Or(left, right); + return SqlDml.BitOr(left, right); + } + + public static SqlExpression operator ^(SqlExpression left, SqlExpression right) + { + return SqlDml.BitXor(left, right); + } + + public static SqlBinary operator == (SqlExpression left, SqlExpression right) + { + return SqlDml.Binary(SqlNodeType.Equals, left, right); + } + + public static SqlBinary operator != (SqlExpression left, SqlExpression right) + { + return SqlDml.Binary(SqlNodeType.NotEquals, left, right); + } + + public static SqlBinary operator > (SqlExpression left, SqlExpression right) + { + return SqlDml.GreaterThan(left, right); + } + + public static SqlBinary operator < (SqlExpression left, SqlExpression right) + { + return SqlDml.LessThan(left, right); + } + + public static SqlBinary operator >= (SqlExpression left, SqlExpression right) + { + return SqlDml.GreaterThanOrEquals(left, right); + } + + public static SqlBinary operator <= (SqlExpression left, SqlExpression right) + { + return SqlDml.LessThanOrEquals(left, right); + } + + public static SqlBinary operator + (SqlExpression left, SqlExpression right) + { + return SqlDml.Add(left, right); + } + + public static SqlBinary operator - (SqlExpression left, SqlExpression right) + { + return SqlDml.Subtract(left, right); + } + + public static SqlUnary operator -(SqlExpression operand) + { + return SqlDml.Negate(operand); + } + + public static SqlBinary operator * (SqlExpression left, SqlExpression right) + { + return SqlDml.Multiply(left, right); + } + + public static SqlBinary operator / (SqlExpression left, SqlExpression right) + { + return SqlDml.Divide(left, right); + } + + public static SqlBinary operator % (SqlExpression left, SqlExpression right) + { + return SqlDml.Modulo(left, right); + } + + # endregion + + public static SqlUnary operator !(SqlExpression operand) + { + return SqlDml.Not(operand); + } + + public static SqlUnary operator ~ (SqlExpression operand) + { + return SqlDml.BitNot(operand); + } + + public static implicit operator SqlExpression(Guid value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(bool value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(sbyte value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(byte value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(byte[] value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(short value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(ushort value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(int value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(uint value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(long value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(ulong value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(float value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(double value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(decimal value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(string value) + { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(DateTime value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(DateTimeOffset value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(TimeSpan value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(char value) + { + return new SqlLiteral(value); + } + + public static implicit operator SqlExpression(SqlSelect select) + { + return SqlDml.SubQuery(select); + } + + public abstract void ReplaceWith(SqlExpression expression); + + // Constructor + + protected SqlExpression(SqlNodeType nodeType) : base(nodeType) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpressionList.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpressionList.cs index f509bc8904..16ae8026b1 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpressionList.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExpressionList.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.09.01 - -using System.Collections; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public abstract class SqlExpressionList : SqlExpression, IList - { - protected IList expressions; - - /// - public SqlExpression this[int index] - { - get { return expressions[index]; } - set - { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - expressions[index] = value; - } - } - - /// - public int Count - { - get { return expressions.Count; } - } - - /// - public bool IsReadOnly - { - get { return false; } - } - - /// - public void Add(SqlExpression item) - { - ArgumentValidator.EnsureArgumentNotNull(item, "item"); - expressions.Add(item); - } - - /// - public void Clear() - { - expressions.Clear(); - } - - /// - public bool Contains(SqlExpression item) - { - return expressions.Contains(item); - } - - /// - public void CopyTo(SqlExpression[] array, int index) - { - expressions.CopyTo(array, index); - } - - /// - public IEnumerator GetEnumerator() - { - return expressions.GetEnumerator(); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return expressions.GetEnumerator(); - } - - /// - public int IndexOf(SqlExpression item) - { - return expressions.IndexOf(item); - } - - /// - public void Insert(int index, SqlExpression item) - { - expressions.Insert(index, item); - } - - /// - public bool Remove(SqlExpression item) - { - return expressions.Remove(item); - } - - /// - public void RemoveAt(int index) - { - expressions.RemoveAt(index); - } - - - // Constructor - - protected SqlExpressionList(SqlNodeType nodeType, IList list) - : base(nodeType) - { - expressions = list; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.09.01 + +using System.Collections; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public abstract class SqlExpressionList : SqlExpression, IList + { + protected IList expressions; + + /// + public SqlExpression this[int index] + { + get { return expressions[index]; } + set + { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + expressions[index] = value; + } + } + + /// + public int Count + { + get { return expressions.Count; } + } + + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + public void Add(SqlExpression item) + { + ArgumentValidator.EnsureArgumentNotNull(item, "item"); + expressions.Add(item); + } + + /// + public void Clear() + { + expressions.Clear(); + } + + /// + public bool Contains(SqlExpression item) + { + return expressions.Contains(item); + } + + /// + public void CopyTo(SqlExpression[] array, int index) + { + expressions.CopyTo(array, index); + } + + /// + public IEnumerator GetEnumerator() + { + return expressions.GetEnumerator(); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return expressions.GetEnumerator(); + } + + /// + public int IndexOf(SqlExpression item) + { + return expressions.IndexOf(item); + } + + /// + public void Insert(int index, SqlExpression item) + { + expressions.Insert(index, item); + } + + /// + public bool Remove(SqlExpression item) + { + return expressions.Remove(item); + } + + /// + public void RemoveAt(int index) + { + expressions.RemoveAt(index); + } + + + // Constructor + + protected SqlExpressionList(SqlNodeType nodeType, IList list) + : base(nodeType) + { + expressions = list; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExtract.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExtract.cs index 280060ecfb..a0c95f5658 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExtract.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlExtract.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.24 - -using System; -using System.Diagnostics; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public class SqlExtract : SqlExpression - { - public SqlDateTimePart DateTimePart { get; private set; } - public SqlDateTimeOffsetPart DateTimeOffsetPart { get; private set; } - public SqlIntervalPart IntervalPart { get; private set; } - - public SqlExpression Operand { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlExtract) expression; - DateTimePart = replacingExpression.DateTimePart; - DateTimeOffsetPart = replacingExpression.DateTimeOffsetPart; - IntervalPart = replacingExpression.IntervalPart; - Operand = replacingExpression.Operand; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = DateTimePart!=SqlDateTimePart.Nothing - ? new SqlExtract(DateTimePart, (SqlExpression) Operand.Clone(context)) - : IntervalPart!=SqlIntervalPart.Nothing - ? new SqlExtract(IntervalPart, (SqlExpression) Operand.Clone(context)) - : new SqlExtract(DateTimeOffsetPart, (SqlExpression) Operand.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlExtract(SqlDateTimePart dateTimePart, SqlExpression operand) - : base(SqlNodeType.Extract) - { - DateTimePart = dateTimePart; - DateTimeOffsetPart = SqlDateTimeOffsetPart.Nothing; - IntervalPart = SqlIntervalPart.Nothing; - Operand = operand; - } - - internal SqlExtract(SqlIntervalPart intervalPart, SqlExpression operand) - : base(SqlNodeType.Extract) - { - DateTimePart = SqlDateTimePart.Nothing; - DateTimeOffsetPart = SqlDateTimeOffsetPart.Nothing; - IntervalPart = intervalPart; - Operand = operand; - } - - public SqlExtract(SqlDateTimeOffsetPart dateTimeOffsetPart, SqlExpression operand) - : base(SqlNodeType.Extract) - { - DateTimePart = SqlDateTimePart.Nothing; - IntervalPart = SqlIntervalPart.Nothing; - DateTimeOffsetPart = dateTimeOffsetPart; - Operand = operand; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.24 + +using System; +using System.Diagnostics; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public class SqlExtract : SqlExpression + { + public SqlDateTimePart DateTimePart { get; private set; } + public SqlDateTimeOffsetPart DateTimeOffsetPart { get; private set; } + public SqlIntervalPart IntervalPart { get; private set; } + + public SqlExpression Operand { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlExtract) expression; + DateTimePart = replacingExpression.DateTimePart; + DateTimeOffsetPart = replacingExpression.DateTimeOffsetPart; + IntervalPart = replacingExpression.IntervalPart; + Operand = replacingExpression.Operand; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = DateTimePart!=SqlDateTimePart.Nothing + ? new SqlExtract(DateTimePart, (SqlExpression) Operand.Clone(context)) + : IntervalPart!=SqlIntervalPart.Nothing + ? new SqlExtract(IntervalPart, (SqlExpression) Operand.Clone(context)) + : new SqlExtract(DateTimeOffsetPart, (SqlExpression) Operand.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlExtract(SqlDateTimePart dateTimePart, SqlExpression operand) + : base(SqlNodeType.Extract) + { + DateTimePart = dateTimePart; + DateTimeOffsetPart = SqlDateTimeOffsetPart.Nothing; + IntervalPart = SqlIntervalPart.Nothing; + Operand = operand; + } + + internal SqlExtract(SqlIntervalPart intervalPart, SqlExpression operand) + : base(SqlNodeType.Extract) + { + DateTimePart = SqlDateTimePart.Nothing; + DateTimeOffsetPart = SqlDateTimeOffsetPart.Nothing; + IntervalPart = intervalPart; + Operand = operand; + } + + public SqlExtract(SqlDateTimeOffsetPart dateTimeOffsetPart, SqlExpression operand) + : base(SqlNodeType.Extract) + { + DateTimePart = SqlDateTimePart.Nothing; + IntervalPart = SqlIntervalPart.Nothing; + DateTimeOffsetPart = dateTimeOffsetPart; + Operand = operand; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlFunctionCall.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlFunctionCall.cs index f9e1ce5ae6..cf09602c5e 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlFunctionCall.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlFunctionCall.cs @@ -1,74 +1,74 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlFunctionCall: SqlExpression - { - /// - /// Gets the expressions. - /// - public IList Arguments { get; private set; } - - /// - /// Gets the function type. - /// - public SqlFunctionType FunctionType { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlFunctionCall) expression; - FunctionType = replacingExpression.FunctionType; - Arguments.Clear(); - foreach (SqlExpression argument in replacingExpression.Arguments) - Arguments.Add(argument); - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlFunctionCall(FunctionType); - for (int i = 0, l = Arguments.Count; i < l; i++) - clone.Arguments.Add((SqlExpression)Arguments[i].Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlFunctionCall(SqlFunctionType functionType, IEnumerable arguments) - : base(SqlNodeType.FunctionCall) - { - FunctionType = functionType; - Arguments = new Collection(); - foreach (SqlExpression argument in arguments) - Arguments.Add(argument); - } - - internal SqlFunctionCall(SqlFunctionType functionType, params SqlExpression[] arguments) - : base(SqlNodeType.FunctionCall) - { - FunctionType = functionType; - Arguments = new Collection(); - if (arguments != null) - foreach (SqlExpression argument in arguments) - Arguments.Add(argument); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlFunctionCall: SqlExpression + { + /// + /// Gets the expressions. + /// + public IList Arguments { get; private set; } + + /// + /// Gets the function type. + /// + public SqlFunctionType FunctionType { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlFunctionCall) expression; + FunctionType = replacingExpression.FunctionType; + Arguments.Clear(); + foreach (SqlExpression argument in replacingExpression.Arguments) + Arguments.Add(argument); + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlFunctionCall(FunctionType); + for (int i = 0, l = Arguments.Count; i < l; i++) + clone.Arguments.Add((SqlExpression)Arguments[i].Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlFunctionCall(SqlFunctionType functionType, IEnumerable arguments) + : base(SqlNodeType.FunctionCall) + { + FunctionType = functionType; + Arguments = new Collection(); + foreach (SqlExpression argument in arguments) + Arguments.Add(argument); + } + + internal SqlFunctionCall(SqlFunctionType functionType, params SqlExpression[] arguments) + : base(SqlNodeType.FunctionCall) + { + FunctionType = functionType; + Arguments = new Collection(); + if (arguments != null) + foreach (SqlExpression argument in arguments) + Arguments.Add(argument); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLike.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLike.cs index 4474efd9ae..5e938aa6b5 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLike.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLike.cs @@ -1,93 +1,93 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents LIKE predicat. - /// - [Serializable] - public class SqlLike : SqlExpression - { - private SqlExpression expression; - private SqlExpression pattern; - private SqlExpression escape; - private bool not = false; - - /// - /// Gets the expression. - /// - /// The expression. - public SqlExpression Expression { - get { - return expression; - } - } - - /// - /// Gets the pattern expression. - /// - /// The pattern. - public SqlExpression Pattern { - get { - return pattern; - } - } - - /// - /// Gets the escape character expression. - /// - /// The escape. - public SqlExpression Escape { - get { - return escape; - } - } - - public bool Not { - get { - return not; - } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlLike replacingExpression = expression as SqlLike; - this.expression = replacingExpression.expression; - pattern = replacingExpression.Pattern; - escape = replacingExpression.Escape; - not = replacingExpression.Not; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlLike((SqlExpression) expression.Clone(context), - (SqlExpression) pattern.Clone(context), - escape.IsNullReference() ? null : (SqlExpression) escape.Clone(context), not); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlLike(SqlExpression expression, SqlExpression pattern, SqlExpression escape, bool not) : base (SqlNodeType.Like) - { - this.expression = expression; - this.pattern = pattern; - this.escape = escape; - this.not = not; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents LIKE predicat. + /// + [Serializable] + public class SqlLike : SqlExpression + { + private SqlExpression expression; + private SqlExpression pattern; + private SqlExpression escape; + private bool not = false; + + /// + /// Gets the expression. + /// + /// The expression. + public SqlExpression Expression { + get { + return expression; + } + } + + /// + /// Gets the pattern expression. + /// + /// The pattern. + public SqlExpression Pattern { + get { + return pattern; + } + } + + /// + /// Gets the escape character expression. + /// + /// The escape. + public SqlExpression Escape { + get { + return escape; + } + } + + public bool Not { + get { + return not; + } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlLike replacingExpression = expression as SqlLike; + this.expression = replacingExpression.expression; + pattern = replacingExpression.Pattern; + escape = replacingExpression.Escape; + not = replacingExpression.Not; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlLike((SqlExpression) expression.Clone(context), + (SqlExpression) pattern.Clone(context), + escape.IsNullReference() ? null : (SqlExpression) escape.Clone(context), not); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlLike(SqlExpression expression, SqlExpression pattern, SqlExpression escape, bool not) : base (SqlNodeType.Like) + { + this.expression = expression; + this.pattern = pattern; + this.escape = escape; + this.not = not; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral.cs index 3e983d7cf8..95b6815fe6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.13 - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public abstract class SqlLiteral : SqlExpression - { - public abstract Type LiteralType { get; } - public abstract object GetValue(); - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlLiteral() - : base(SqlNodeType.Literal) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.13 + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public abstract class SqlLiteral : SqlExpression + { + public abstract Type LiteralType { get; } + public abstract object GetValue(); + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlLiteral() + : base(SqlNodeType.Literal) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral{T}.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral{T}.cs index 83a232d042..4f71119fe2 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral{T}.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlLiteral{T}.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents literal value expression. - /// - [Serializable] - public class SqlLiteral : SqlLiteral - { - /// - /// Gets the value. - /// - /// The value. - public T Value { get; private set; } - - public override Type LiteralType { get { return typeof (T); } } - - public override object GetValue() - { - return Value; - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs>(expression, "expression"); - var replacingExpression = (SqlLiteral) expression; - Value = replacingExpression.Value; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlLiteral(Value); - context.NodeMapping[this] = clone; - return clone; - } - - // Constructor - - internal SqlLiteral(T value) - { - Value = value; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents literal value expression. + /// + [Serializable] + public class SqlLiteral : SqlLiteral + { + /// + /// Gets the value. + /// + /// The value. + public T Value { get; private set; } + + public override Type LiteralType { get { return typeof (T); } } + + public override object GetValue() + { + return Value; + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs>(expression, "expression"); + var replacingExpression = (SqlLiteral) expression; + Value = replacingExpression.Value; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlLiteral(Value); + context.NodeMapping[this] = clone; + return clone; + } + + // Constructor + + internal SqlLiteral(T value) + { + Value = value; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlMatch.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlMatch.cs index 8ed2420140..f92c8117ae 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlMatch.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlMatch.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents MATCH SQL statement. - /// - [Serializable] - public class SqlMatch: SqlExpression - { - private SqlExpression value; - private SqlSubQuery subQuery; - private bool unique = false; - private SqlMatchType matchType = SqlMatchType.None; - - /// - /// Gets the value which will be tested for matching. - /// - public SqlExpression Value - { - get { return value; } - } - - /// - /// Gets the sub query to search of matching. - /// - public SqlSubQuery SubQuery - { - get { return subQuery; } - } - - /// - /// Gets a value indicating whether unique sub query rows for search matching will be used only. - /// - public bool Unique - { - get { return unique; } - } - - /// - /// Gets the type of the match. - /// - public SqlMatchType MatchType - { - get { return matchType; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlMatch replacingExpression = expression as SqlMatch; - value = replacingExpression.Value; - subQuery = replacingExpression.SubQuery; - matchType = replacingExpression.MatchType; - unique = replacingExpression.Unique; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlMatch clone = new SqlMatch((SqlExpression)value.Clone(context), - (SqlSubQuery)subQuery.Clone(context), - unique, - matchType); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlMatch(SqlExpression value, SqlSubQuery subQuery, bool unique, SqlMatchType matchType) - : base(SqlNodeType.Match) - { - this.value = value; - this.subQuery = subQuery; - this.unique = unique; - this.matchType = matchType; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents MATCH SQL statement. + /// + [Serializable] + public class SqlMatch: SqlExpression + { + private SqlExpression value; + private SqlSubQuery subQuery; + private bool unique = false; + private SqlMatchType matchType = SqlMatchType.None; + + /// + /// Gets the value which will be tested for matching. + /// + public SqlExpression Value + { + get { return value; } + } + + /// + /// Gets the sub query to search of matching. + /// + public SqlSubQuery SubQuery + { + get { return subQuery; } + } + + /// + /// Gets a value indicating whether unique sub query rows for search matching will be used only. + /// + public bool Unique + { + get { return unique; } + } + + /// + /// Gets the type of the match. + /// + public SqlMatchType MatchType + { + get { return matchType; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlMatch replacingExpression = expression as SqlMatch; + value = replacingExpression.Value; + subQuery = replacingExpression.SubQuery; + matchType = replacingExpression.MatchType; + unique = replacingExpression.Unique; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlMatch clone = new SqlMatch((SqlExpression)value.Clone(context), + (SqlSubQuery)subQuery.Clone(context), + unique, + matchType); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlMatch(SqlExpression value, SqlSubQuery subQuery, bool unique, SqlMatchType matchType) + : base(SqlNodeType.Match) + { + this.value = value; + this.subQuery = subQuery; + this.unique = unique; + this.matchType = matchType; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNative.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNative.cs index 9e1dccb496..232a6bb130 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNative.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNative.cs @@ -1,291 +1,291 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlNative : SqlExpression, IConvertible - { - /// - /// Gets the value. - /// - public string Value { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlNative) expression; - Value = replacingExpression.Value; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlNative(Value); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - #region IConvertible Members - - /// - ///Returns the for this instance. - /// - /// - /// - ///The enumerated constant that is the of the class or value type that implements this interface. - /// - ///2 - TypeCode IConvertible.GetTypeCode() - { - return Value.GetTypeCode(); - } - - /// - ///Converts the value of this instance to an equivalent Boolean value using the specified culture-specific formatting information. - /// - /// - /// - ///A Boolean value equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return ((IConvertible) Value).ToBoolean(provider); - } - - /// - ///Converts the value of this instance to an equivalent Unicode character using the specified culture-specific formatting information. - /// - /// - /// - ///A Unicode character equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - char IConvertible.ToChar(IFormatProvider provider) - { - return ((IConvertible) Value).ToChar(provider); - } - - /// - ///Converts the value of this instance to an equivalent 8-bit signed integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 8-bit signed integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - sbyte IConvertible.ToSByte(IFormatProvider provider) - { - return ((IConvertible) Value).ToSByte(provider); - } - - /// - ///Converts the value of this instance to an equivalent 8-bit unsigned integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 8-bit unsigned integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - byte IConvertible.ToByte(IFormatProvider provider) - { - return ((IConvertible) Value).ToByte(provider); - } - - /// - ///Converts the value of this instance to an equivalent 16-bit signed integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 16-bit signed integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - short IConvertible.ToInt16(IFormatProvider provider) - { - return ((IConvertible) Value).ToInt16(provider); - } - - /// - ///Converts the value of this instance to an equivalent 16-bit unsigned integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 16-bit unsigned integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - ushort IConvertible.ToUInt16(IFormatProvider provider) - { - return ((IConvertible) Value).ToUInt16(provider); - } - - /// - ///Converts the value of this instance to an equivalent 32-bit signed integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 32-bit signed integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - int IConvertible.ToInt32(IFormatProvider provider) - { - return ((IConvertible) Value).ToInt32(provider); - } - - /// - ///Converts the value of this instance to an equivalent 32-bit unsigned integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 32-bit unsigned integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - uint IConvertible.ToUInt32(IFormatProvider provider) - { - return ((IConvertible) Value).ToUInt32(provider); - } - - /// - ///Converts the value of this instance to an equivalent 64-bit signed integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 64-bit signed integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - long IConvertible.ToInt64(IFormatProvider provider) - { - return ((IConvertible) Value).ToInt64(provider); - } - - /// - ///Converts the value of this instance to an equivalent 64-bit unsigned integer using the specified culture-specific formatting information. - /// - /// - /// - ///An 64-bit unsigned integer equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - ulong IConvertible.ToUInt64(IFormatProvider provider) - { - return ((IConvertible) Value).ToUInt64(provider); - } - - /// - ///Converts the value of this instance to an equivalent single-precision floating-point number using the specified culture-specific formatting information. - /// - /// - /// - ///A single-precision floating-point number equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - float IConvertible.ToSingle(IFormatProvider provider) - { - return ((IConvertible) Value).ToSingle(provider); - } - - /// - ///Converts the value of this instance to an equivalent double-precision floating-point number using the specified culture-specific formatting information. - /// - /// - /// - ///A double-precision floating-point number equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - double IConvertible.ToDouble(IFormatProvider provider) - { - return ((IConvertible) Value).ToDouble(provider); - } - - /// - ///Converts the value of this instance to an equivalent number using the specified culture-specific formatting information. - /// - /// - /// - ///A number equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - return ((IConvertible) Value).ToDecimal(provider); - } - - /// - ///Converts the value of this instance to an equivalent using the specified culture-specific formatting information. - /// - /// - /// - ///A instance equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - return ((IConvertible) Value).ToDateTime(provider); - } - - /// - ///Converts the value of this instance to an equivalent using the specified culture-specific formatting information. - /// - /// - /// - ///A instance equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. 2 - string IConvertible.ToString(IFormatProvider provider) - { - return Value.ToString(provider); - } - - /// - ///Converts the value of this instance to an of the specified that has an equivalent value, using the specified culture-specific formatting information. - /// - /// - /// - ///An instance of type conversionType whose value is equivalent to the value of this instance. - /// - /// - ///An interface implementation that supplies culture-specific formatting information. - ///The to which the value of this instance is converted. 2 - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - return ((IConvertible) Value).ToType(conversionType, provider); - } - - #endregion - - - // Constructors - - internal SqlNative(string value) : base(SqlNodeType.Native) - { - Value = value; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlNative : SqlExpression, IConvertible + { + /// + /// Gets the value. + /// + public string Value { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlNative) expression; + Value = replacingExpression.Value; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlNative(Value); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + #region IConvertible Members + + /// + ///Returns the for this instance. + /// + /// + /// + ///The enumerated constant that is the of the class or value type that implements this interface. + /// + ///2 + TypeCode IConvertible.GetTypeCode() + { + return Value.GetTypeCode(); + } + + /// + ///Converts the value of this instance to an equivalent Boolean value using the specified culture-specific formatting information. + /// + /// + /// + ///A Boolean value equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + bool IConvertible.ToBoolean(IFormatProvider provider) + { + return ((IConvertible) Value).ToBoolean(provider); + } + + /// + ///Converts the value of this instance to an equivalent Unicode character using the specified culture-specific formatting information. + /// + /// + /// + ///A Unicode character equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + char IConvertible.ToChar(IFormatProvider provider) + { + return ((IConvertible) Value).ToChar(provider); + } + + /// + ///Converts the value of this instance to an equivalent 8-bit signed integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 8-bit signed integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + sbyte IConvertible.ToSByte(IFormatProvider provider) + { + return ((IConvertible) Value).ToSByte(provider); + } + + /// + ///Converts the value of this instance to an equivalent 8-bit unsigned integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 8-bit unsigned integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + byte IConvertible.ToByte(IFormatProvider provider) + { + return ((IConvertible) Value).ToByte(provider); + } + + /// + ///Converts the value of this instance to an equivalent 16-bit signed integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 16-bit signed integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + short IConvertible.ToInt16(IFormatProvider provider) + { + return ((IConvertible) Value).ToInt16(provider); + } + + /// + ///Converts the value of this instance to an equivalent 16-bit unsigned integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 16-bit unsigned integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + ushort IConvertible.ToUInt16(IFormatProvider provider) + { + return ((IConvertible) Value).ToUInt16(provider); + } + + /// + ///Converts the value of this instance to an equivalent 32-bit signed integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 32-bit signed integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + int IConvertible.ToInt32(IFormatProvider provider) + { + return ((IConvertible) Value).ToInt32(provider); + } + + /// + ///Converts the value of this instance to an equivalent 32-bit unsigned integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 32-bit unsigned integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + uint IConvertible.ToUInt32(IFormatProvider provider) + { + return ((IConvertible) Value).ToUInt32(provider); + } + + /// + ///Converts the value of this instance to an equivalent 64-bit signed integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 64-bit signed integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + long IConvertible.ToInt64(IFormatProvider provider) + { + return ((IConvertible) Value).ToInt64(provider); + } + + /// + ///Converts the value of this instance to an equivalent 64-bit unsigned integer using the specified culture-specific formatting information. + /// + /// + /// + ///An 64-bit unsigned integer equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + ulong IConvertible.ToUInt64(IFormatProvider provider) + { + return ((IConvertible) Value).ToUInt64(provider); + } + + /// + ///Converts the value of this instance to an equivalent single-precision floating-point number using the specified culture-specific formatting information. + /// + /// + /// + ///A single-precision floating-point number equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + float IConvertible.ToSingle(IFormatProvider provider) + { + return ((IConvertible) Value).ToSingle(provider); + } + + /// + ///Converts the value of this instance to an equivalent double-precision floating-point number using the specified culture-specific formatting information. + /// + /// + /// + ///A double-precision floating-point number equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + double IConvertible.ToDouble(IFormatProvider provider) + { + return ((IConvertible) Value).ToDouble(provider); + } + + /// + ///Converts the value of this instance to an equivalent number using the specified culture-specific formatting information. + /// + /// + /// + ///A number equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + decimal IConvertible.ToDecimal(IFormatProvider provider) + { + return ((IConvertible) Value).ToDecimal(provider); + } + + /// + ///Converts the value of this instance to an equivalent using the specified culture-specific formatting information. + /// + /// + /// + ///A instance equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + DateTime IConvertible.ToDateTime(IFormatProvider provider) + { + return ((IConvertible) Value).ToDateTime(provider); + } + + /// + ///Converts the value of this instance to an equivalent using the specified culture-specific formatting information. + /// + /// + /// + ///A instance equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. 2 + string IConvertible.ToString(IFormatProvider provider) + { + return Value.ToString(provider); + } + + /// + ///Converts the value of this instance to an of the specified that has an equivalent value, using the specified culture-specific formatting information. + /// + /// + /// + ///An instance of type conversionType whose value is equivalent to the value of this instance. + /// + /// + ///An interface implementation that supplies culture-specific formatting information. + ///The to which the value of this instance is converted. 2 + object IConvertible.ToType(Type conversionType, IFormatProvider provider) + { + return ((IConvertible) Value).ToType(conversionType, provider); + } + + #endregion + + + // Constructors + + internal SqlNative(string value) : base(SqlNodeType.Native) + { + Value = value; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNextValue.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNextValue.cs index 8ab71973ec..5780022fd3 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNextValue.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNextValue.cs @@ -1,73 +1,73 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents NEXT VALUE FOR expression. - /// - [Serializable] - public class SqlNextValue : SqlExpression - { - private Sequence sequence; - private int increment = 1; - - /// - /// Gets the increment. - /// - /// The increment. - public int Increment - { - get { return increment; } - } - - /// - /// Gets the sequence. - /// - /// The sequence. - public Sequence Sequence - { - get { return sequence; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlNextValue replacingExpression = expression as SqlNextValue; - sequence = replacingExpression.Sequence; - increment = replacingExpression.Increment; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlNextValue clone = new SqlNextValue(sequence, increment); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlNextValue(Sequence sequence) : base(SqlNodeType.NextValue) - { - this.sequence = sequence; - } - - internal SqlNextValue(Sequence sequence, int increment) : base(SqlNodeType.NextValue) - { - this.sequence = sequence; - this.increment = increment; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents NEXT VALUE FOR expression. + /// + [Serializable] + public class SqlNextValue : SqlExpression + { + private Sequence sequence; + private int increment = 1; + + /// + /// Gets the increment. + /// + /// The increment. + public int Increment + { + get { return increment; } + } + + /// + /// Gets the sequence. + /// + /// The sequence. + public Sequence Sequence + { + get { return sequence; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlNextValue replacingExpression = expression as SqlNextValue; + sequence = replacingExpression.Sequence; + increment = replacingExpression.Increment; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlNextValue clone = new SqlNextValue(sequence, increment); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlNextValue(Sequence sequence) : base(SqlNodeType.NextValue) + { + this.sequence = sequence; + } + + internal SqlNextValue(Sequence sequence, int increment) : base(SqlNodeType.NextValue) + { + this.sequence = sequence; + this.increment = increment; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNull.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNull.cs index a6cc85caae..eeee092eb1 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNull.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlNull.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlNull : SqlExpression - { - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - } - - internal override object Clone(SqlNodeCloneContext context) - { - return this; - } - - internal SqlNull() : base(SqlNodeType.Null) - { - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlNull : SqlExpression + { + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + } + + internal override object Clone(SqlNodeCloneContext context) + { + return this; + } + + internal SqlNull() : base(SqlNodeType.Null) + { + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlParameterRef.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlParameterRef.cs index 3c31bfbce1..b51bf5045d 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlParameterRef.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlParameterRef.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents a Sql parameter. - /// - [Serializable] - public class SqlParameterRef : SqlExpression, ISqlCursorFetchTarget - { - public object Parameter { get; private set; } - public string Name { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlParameterRef) expression; - Name = replacingExpression.Name; - Parameter = replacingExpression.Parameter; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = Name != null - ? new SqlParameterRef(Name) - : new SqlParameterRef(Parameter); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructor - - internal SqlParameterRef(object parameter) : base(SqlNodeType.Parameter) - { - Parameter = parameter; - } - - internal SqlParameterRef(string name) : base(SqlNodeType.Parameter) - { - Name = name; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents a Sql parameter. + /// + [Serializable] + public class SqlParameterRef : SqlExpression, ISqlCursorFetchTarget + { + public object Parameter { get; private set; } + public string Name { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlParameterRef) expression; + Name = replacingExpression.Name; + Parameter = replacingExpression.Parameter; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = Name != null + ? new SqlParameterRef(Name) + : new SqlParameterRef(Parameter); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructor + + internal SqlParameterRef(object parameter) : base(SqlNodeType.Parameter) + { + Parameter = parameter; + } + + internal SqlParameterRef(string name) : base(SqlNodeType.Parameter) + { + Name = name; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlPlaceholder.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlPlaceholder.cs index 4a5fe14225..125f45b549 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlPlaceholder.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlPlaceholder.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.10.10 - -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public class SqlPlaceholder : SqlExpression - { - public object Id { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlPlaceholder(Id); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlPlaceholder) expression; - Id = replacingExpression.Id; - } - - // Constructors - - internal SqlPlaceholder(object id) - : base(SqlNodeType.Placeholder) - { - Id = id; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.10.10 + +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public class SqlPlaceholder : SqlExpression + { + public object Id { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlPlaceholder(Id); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlPlaceholder) expression; + Id = replacingExpression.Id; + } + + // Constructors + + internal SqlPlaceholder(object id) + : base(SqlNodeType.Placeholder) + { + Id = id; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRound.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRound.cs index 1a69935455..b64d8f6dc8 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRound.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRound.cs @@ -1,58 +1,58 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.03 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public sealed class SqlRound : SqlExpression - { - public SqlExpression Argument { get; private set; } - public SqlExpression Length { get; private set; } - public TypeCode Type { get; private set; } - public MidpointRounding Mode { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlRound) expression; - Argument = replacingExpression.Argument; - Length = replacingExpression.Length; - Type = replacingExpression.Type; - Mode = replacingExpression.Mode; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlRound( - (SqlExpression) Argument.Clone(context), - Length.IsNullReference() ? null : (SqlExpression) Length.Clone(context), - Type, Mode); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlRound(SqlExpression argument, SqlExpression length, TypeCode type, MidpointRounding mode) - : base(SqlNodeType.Round) - { - Argument = argument; - Length = length; - Type = type; - Mode = mode; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.03 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public sealed class SqlRound : SqlExpression + { + public SqlExpression Argument { get; private set; } + public SqlExpression Length { get; private set; } + public TypeCode Type { get; private set; } + public MidpointRounding Mode { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlRound) expression; + Argument = replacingExpression.Argument; + Length = replacingExpression.Length; + Type = replacingExpression.Type; + Mode = replacingExpression.Mode; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlRound( + (SqlExpression) Argument.Clone(context), + Length.IsNullReference() ? null : (SqlExpression) Length.Clone(context), + Type, Mode); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlRound(SqlExpression argument, SqlExpression length, TypeCode type, MidpointRounding mode) + : base(SqlNodeType.Round) + { + Argument = argument; + Length = length; + Type = type; + Mode = mode; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs index e9aead40e2..92e799b017 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlRow: SqlExpressionList - { - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var expressionsClone = new Collection(); - foreach (var e in expressions) - expressionsClone.Add((SqlExpression) e.Clone(context)); - - var clone = new SqlRow(expressionsClone); - return clone; - } - - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlRow) expression; - expressions.Clear(); - foreach (SqlExpression e in replacingExpression) - expressions.Add(e); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - - // Constructors - - internal SqlRow(IList expressions) - : base(SqlNodeType.Row, expressions) - { - this.expressions = expressions; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlRow: SqlExpressionList + { + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var expressionsClone = new Collection(); + foreach (var e in expressions) + expressionsClone.Add((SqlExpression) e.Clone(context)); + + var clone = new SqlRow(expressionsClone); + return clone; + } + + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlRow) expression; + expressions.Clear(); + foreach (SqlExpression e in replacingExpression) + expressions.Add(e); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + + // Constructors + + internal SqlRow(IList expressions) + : base(SqlNodeType.Row, expressions) + { + this.expressions = expressions; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRowNumber.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRowNumber.cs index e64b7e49c8..4acacd2612 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRowNumber.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRowNumber.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.21 - -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public class SqlRowNumber : SqlExpression - { - public SqlOrderCollection OrderBy { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlRowNumber(); - foreach (SqlOrder so in OrderBy) - clone.OrderBy.Add((SqlOrder) so.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlRowNumber) expression; - OrderBy.Clear(); - foreach (var item in replacingExpression.OrderBy) - OrderBy.Add(item); - } - - - // Constructors - - internal SqlRowNumber() - : base(SqlNodeType.RowNumber) - { - OrderBy = new SqlOrderCollection(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.21 + +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public class SqlRowNumber : SqlExpression + { + public SqlOrderCollection OrderBy { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlRowNumber(); + foreach (SqlOrder so in OrderBy) + clone.OrderBy.Add((SqlOrder) so.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlRowNumber) expression; + OrderBy.Clear(); + foreach (var item in replacingExpression.OrderBy) + OrderBy.Add(item); + } + + + // Constructors + + internal SqlRowNumber() + : base(SqlNodeType.RowNumber) + { + OrderBy = new SqlOrderCollection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlSubQuery.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlSubQuery.cs index f175c4293b..6f31b191d3 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlSubQuery.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlSubQuery.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents sub query expression. - /// - [Serializable] - public class SqlSubQuery: SqlExpression - { - private ISqlQueryExpression query; - - /// - /// Gets the query. - /// - /// The query. - public ISqlQueryExpression Query - { - get { return query; } - } - - /// - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlSubQuery replacingExpression = expression as SqlSubQuery; - query = replacingExpression.Query; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlSubQuery clone; - SqlSelect select = query as SqlSelect; - SqlQueryExpression expression = query as SqlQueryExpression; - if (select != null) - clone = new SqlSubQuery((SqlSelect)select.Clone(context)); - else - clone = new SqlSubQuery((SqlQueryExpression)expression.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlSubQuery(ISqlQueryExpression query) - : base(SqlNodeType.SubSelect) - { - this.query = query; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents sub query expression. + /// + [Serializable] + public class SqlSubQuery: SqlExpression + { + private ISqlQueryExpression query; + + /// + /// Gets the query. + /// + /// The query. + public ISqlQueryExpression Query + { + get { return query; } + } + + /// + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlSubQuery replacingExpression = expression as SqlSubQuery; + query = replacingExpression.Query; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlSubQuery clone; + SqlSelect select = query as SqlSelect; + SqlQueryExpression expression = query as SqlQueryExpression; + if (select != null) + clone = new SqlSubQuery((SqlSelect)select.Clone(context)); + else + clone = new SqlSubQuery((SqlQueryExpression)expression.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlSubQuery(ISqlQueryExpression query) + : base(SqlNodeType.SubSelect) + { + this.query = query; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTableColumn.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTableColumn.cs index e00b5bfafe..85b75ec5ab 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTableColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTableColumn.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - /// - /// Defines a reference to object - /// - [Serializable] - public class SqlTableColumn : SqlColumn, ISqlLValue - { - public override void ReplaceWith(SqlExpression expression) - { - var replacingExpression = (SqlColumn) expression; - ArgumentValidator.EnsureArgumentNotNull(replacingExpression.SqlTable, "SqlTable"); - ArgumentValidator.EnsureArgumentNotNull(replacingExpression.Name, "Name"); - base.ReplaceWith(expression); - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var table = SqlTable; - SqlNode clonedTable; - if (context.NodeMapping.TryGetValue(SqlTable, out clonedTable)) - table = (SqlTable) clonedTable; - - var clone = new SqlTableColumn(table, Name); - context.NodeMapping[this] = clone; - return clone; - } - - // Constructors - - internal SqlTableColumn(SqlTable sqlTable, string name) - : base(sqlTable, name) - { - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + /// + /// Defines a reference to object + /// + [Serializable] + public class SqlTableColumn : SqlColumn, ISqlLValue + { + public override void ReplaceWith(SqlExpression expression) + { + var replacingExpression = (SqlColumn) expression; + ArgumentValidator.EnsureArgumentNotNull(replacingExpression.SqlTable, "SqlTable"); + ArgumentValidator.EnsureArgumentNotNull(replacingExpression.Name, "Name"); + base.ReplaceWith(expression); + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var table = SqlTable; + SqlNode clonedTable; + if (context.NodeMapping.TryGetValue(SqlTable, out clonedTable)) + table = (SqlTable) clonedTable; + + var clone = new SqlTableColumn(table, Name); + context.NodeMapping[this] = clone; + return clone; + } + + // Constructors + + internal SqlTableColumn(SqlTable sqlTable, string name) + : base(sqlTable, name) + { + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTrim.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTrim.cs index 30fb5f58e7..612c731f82 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTrim.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlTrim.cs @@ -1,76 +1,76 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents Trim function call. - /// - [Serializable] - public class SqlTrim : SqlExpression - { - private SqlExpression expression; - private string trimCharacters; - private SqlTrimType trimType; - - /// - /// Gets the expression. - /// - /// The expression. - public SqlExpression Expression { - get { - return expression; - } - } - - /// - /// Gets the trim characters. - /// - public string TrimCharacters { - get { - return trimCharacters; - } - } - - public SqlTrimType TrimType - { - get { return trimType; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlTrim) expression; - this.expression = replacingExpression.expression; - trimCharacters = replacingExpression.trimCharacters; - trimType = replacingExpression.TrimType; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlTrim((SqlExpression) expression.Clone(context), trimCharacters, trimType); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlTrim(SqlExpression expression, string trimCharacters, SqlTrimType trimType) : base (SqlNodeType.Trim) - { - this.expression = expression; - this.trimCharacters = trimCharacters; - this.trimType = trimType; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents Trim function call. + /// + [Serializable] + public class SqlTrim : SqlExpression + { + private SqlExpression expression; + private string trimCharacters; + private SqlTrimType trimType; + + /// + /// Gets the expression. + /// + /// The expression. + public SqlExpression Expression { + get { + return expression; + } + } + + /// + /// Gets the trim characters. + /// + public string TrimCharacters { + get { + return trimCharacters; + } + } + + public SqlTrimType TrimType + { + get { return trimType; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlTrim) expression; + this.expression = replacingExpression.expression; + trimCharacters = replacingExpression.trimCharacters; + trimType = replacingExpression.TrimType; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlTrim((SqlExpression) expression.Clone(context), trimCharacters, trimType); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlTrim(SqlExpression expression, string trimCharacters, SqlTrimType trimType) : base (SqlNodeType.Trim) + { + this.expression = expression; + this.trimCharacters = trimCharacters; + this.trimType = trimType; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUnary.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUnary.cs index 40186fbe79..d243536bb6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUnary.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUnary.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents unary expression. - /// - [Serializable] - public class SqlUnary : SqlExpression - { - /// - /// Gets the operand of the unary operator. - /// - /// The operand of the unary operator. - public SqlExpression Operand { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - var replacingExpression = (SqlUnary) expression; - NodeType = replacingExpression.NodeType; - Operand = replacingExpression.Operand; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlUnary(NodeType, (SqlExpression) Operand.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlUnary(SqlNodeType nodeType, SqlExpression operand) - : base(nodeType) - { - Operand = operand; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents unary expression. + /// + [Serializable] + public class SqlUnary : SqlExpression + { + /// + /// Gets the operand of the unary operator. + /// + /// The operand of the unary operator. + public SqlExpression Operand { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + var replacingExpression = (SqlUnary) expression; + NodeType = replacingExpression.NodeType; + Operand = replacingExpression.Operand; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlUnary(NodeType, (SqlExpression) Operand.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlUnary(SqlNodeType nodeType, SqlExpression operand) + : base(nodeType) + { + Operand = operand; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserColumn.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserColumn.cs index ced5ab138b..0e569d6e9c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserColumn.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlUserColumn : SqlColumn - { - private SqlExpression expression; - - /// - /// Gets the column expression. - /// - /// The expression. - public SqlExpression Expression - { - get { return expression; } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlUserColumn replacingExpression = expression as SqlUserColumn; - this.expression = replacingExpression.Expression; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlColumn clone; - clone = new SqlUserColumn((SqlExpression)expression.Clone(context)); - - context.NodeMapping[this] = clone; - return clone; - } - - // Constructor - - internal SqlUserColumn(SqlExpression expression) - { - this.expression = expression; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlUserColumn : SqlColumn + { + private SqlExpression expression; + + /// + /// Gets the column expression. + /// + /// The expression. + public SqlExpression Expression + { + get { return expression; } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlUserColumn replacingExpression = expression as SqlUserColumn; + this.expression = replacingExpression.Expression; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlColumn clone; + clone = new SqlUserColumn((SqlExpression)expression.Clone(context)); + + context.NodeMapping[this] = clone; + return clone; + } + + // Constructor + + internal SqlUserColumn(SqlExpression expression) + { + this.expression = expression; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserFunctionCall.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserFunctionCall.cs index 2640c35de4..4b95c23c0a 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserFunctionCall.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlUserFunctionCall.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlUserFunctionCall : SqlFunctionCall - { - private string name; - - /// - /// Gets the function name. - /// - public string Name { - get { - return name; - } - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlUserFunctionCall replacingExpression = expression as SqlUserFunctionCall; - name = replacingExpression.Name; - Arguments.Clear(); - foreach (SqlExpression argument in replacingExpression.Arguments) - Arguments.Add(argument); - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlUserFunctionCall clone = new SqlUserFunctionCall(name); - for (int i = 0, l = Arguments.Count; i < l; i++) - clone.Arguments.Add((SqlExpression)Arguments[i].Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlUserFunctionCall(string name, IEnumerable arguments) - : base(SqlFunctionType.UserDefined, arguments) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - this.name = name; - } - - internal SqlUserFunctionCall(string name, params SqlExpression[] arguments) - : base(SqlFunctionType.UserDefined, arguments) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - this.name = name; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlUserFunctionCall : SqlFunctionCall + { + private string name; + + /// + /// Gets the function name. + /// + public string Name { + get { + return name; + } + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlUserFunctionCall replacingExpression = expression as SqlUserFunctionCall; + name = replacingExpression.Name; + Arguments.Clear(); + foreach (SqlExpression argument in replacingExpression.Arguments) + Arguments.Add(argument); + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlUserFunctionCall clone = new SqlUserFunctionCall(name); + for (int i = 0, l = Arguments.Count; i < l; i++) + clone.Arguments.Add((SqlExpression)Arguments[i].Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlUserFunctionCall(string name, IEnumerable arguments) + : base(SqlFunctionType.UserDefined, arguments) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + this.name = name; + } + + internal SqlUserFunctionCall(string name, params SqlExpression[] arguments) + : base(SqlFunctionType.UserDefined, arguments) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + this.name = name; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariable.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariable.cs index 8fb288f196..535173d001 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariable.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlVariable : SqlExpression, ISqlCursorFetchTarget - { - private string name; - private readonly SqlValueType type; - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get { return name;} - } - - /// - /// Gets the type. - /// - /// The type. - public SqlValueType Type - { - get { return type; } - } - - public SqlDeclareVariable Declare() - { - return new SqlDeclareVariable(this); - } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - SqlVariable replacingExpression = expression as SqlVariable; - name = replacingExpression.Name; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlVariable clone = new SqlVariable(name, type); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlVariable(string name, SqlValueType type) - : base(SqlNodeType.Variable) - { - this.name = name; - this.type = type; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlVariable : SqlExpression, ISqlCursorFetchTarget + { + private string name; + private readonly SqlValueType type; + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get { return name;} + } + + /// + /// Gets the type. + /// + /// The type. + public SqlValueType Type + { + get { return type; } + } + + public SqlDeclareVariable Declare() + { + return new SqlDeclareVariable(this); + } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + SqlVariable replacingExpression = expression as SqlVariable; + name = replacingExpression.Name; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlVariable clone = new SqlVariable(name, type); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlVariable(string name, SqlValueType type) + : base(SqlNodeType.Variable) + { + this.name = name; + this.type = type; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariant.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariant.cs index 2c6fb650f3..60137d5f6f 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariant.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlVariant.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.04.22 - -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - public class SqlVariant : SqlExpression - { - public object Id { get; private set; } - public SqlExpression Main { get; private set; } - public SqlExpression Alternative { get; private set; } - - public override void ReplaceWith(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentIs(expression, "expression"); - - var replacingExpression = (SqlVariant) expression; - Main = replacingExpression.Main; - Alternative = replacingExpression.Alternative; - Id = replacingExpression.Id; - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlVariant(Id, (SqlExpression) Main.Clone(context), (SqlExpression) Alternative.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlVariant(object id, SqlExpression main, SqlExpression alternative) - : base(SqlNodeType.Variant) - { - Main = main; - Alternative = alternative; - Id = id; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.04.22 + +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + public class SqlVariant : SqlExpression + { + public object Id { get; private set; } + public SqlExpression Main { get; private set; } + public SqlExpression Alternative { get; private set; } + + public override void ReplaceWith(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentIs(expression, "expression"); + + var replacingExpression = (SqlVariant) expression; + Main = replacingExpression.Main; + Alternative = replacingExpression.Alternative; + Id = replacingExpression.Id; + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlVariant(Id, (SqlExpression) Main.Clone(context), (SqlExpression) Alternative.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlVariant(object id, SqlExpression main, SqlExpression alternative) + : base(SqlNodeType.Variant) + { + Main = main; + Alternative = alternative; + Id = id; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Extensions.cs b/Orm/Xtensive.Orm/Sql/Dml/Extensions.cs index 7abbb886bb..f08ceb74d5 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Extensions.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Extensions.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.24 - -using System.Text; - -namespace Xtensive.Sql.Dml -{ - /// - /// Various extension methods related to this namespace. - /// - public static class Extensions - { - /// - /// Determines whether the specified expression is a null reference. - /// Use this method instead of comparison with null, - /// because equality operator is overloaded for - /// to yield equality comparison expression. - /// - /// The expression to check. - /// - /// if argument is a null reference; otherwise, . - /// - public static bool IsNullReference(this SqlExpression expression) - { - return ReferenceEquals(expression, null); - } - - public static bool Supports(this SqlLockType available, SqlLockType required) - { - return (available & required)==required; - } - - public static string ToString(this SqlLockType lockType, bool humanReadable) - { - if (!humanReadable) - return lockType.ToString(); - if (lockType==SqlLockType.Empty) - return "No Lock"; - var result = new StringBuilder(); - if (lockType.Supports(SqlLockType.Shared)) - result.Append("Shared"); - if (lockType.Supports(SqlLockType.Update)) - result.Append("Update"); - if (lockType.Supports(SqlLockType.Exclusive)) - result.Append("Exclusive"); - if (lockType.Supports(SqlLockType.SkipLocked)) - result.Append("|Skip locked rows"); - if (lockType.Supports(SqlLockType.ThrowIfLocked)) - result.Append("|Throw exception if locked"); - return result.ToString(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.24 + +using System.Text; + +namespace Xtensive.Sql.Dml +{ + /// + /// Various extension methods related to this namespace. + /// + public static class Extensions + { + /// + /// Determines whether the specified expression is a null reference. + /// Use this method instead of comparison with null, + /// because equality operator is overloaded for + /// to yield equality comparison expression. + /// + /// The expression to check. + /// + /// if argument is a null reference; otherwise, . + /// + public static bool IsNullReference(this SqlExpression expression) + { + return ReferenceEquals(expression, null); + } + + public static bool Supports(this SqlLockType available, SqlLockType required) + { + return (available & required)==required; + } + + public static string ToString(this SqlLockType lockType, bool humanReadable) + { + if (!humanReadable) + return lockType.ToString(); + if (lockType==SqlLockType.Empty) + return "No Lock"; + var result = new StringBuilder(); + if (lockType.Supports(SqlLockType.Shared)) + result.Append("Shared"); + if (lockType.Supports(SqlLockType.Update)) + result.Append("Update"); + if (lockType.Supports(SqlLockType.Exclusive)) + result.Append("Exclusive"); + if (lockType.Supports(SqlLockType.SkipLocked)) + result.Append("|Skip locked rows"); + if (lockType.Supports(SqlLockType.ThrowIfLocked)) + result.Append("|Throw exception if locked"); + return result.ToString(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlFastFirstRowsHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlFastFirstRowsHint.cs index ca69c58ce7..5a666630e5 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlFastFirstRowsHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlFastFirstRowsHint.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlFastFirstRowsHint : SqlHint - { - /// - /// Gets the rows amount. - /// - /// The row amount. - public int Amount { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlFastFirstRowsHint(Amount); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlFastFirstRowsHint(int amount) - { - Amount = amount; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlFastFirstRowsHint : SqlHint + { + /// + /// Gets the rows amount. + /// + /// The row amount. + public int Amount { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlFastFirstRowsHint(Amount); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlFastFirstRowsHint(int amount) + { + Amount = amount; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs index b0627865d8..9cb067e5cc 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Linq; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlForceJoinOrderHint : SqlHint - { - private SqlTable[] tables; - - /// - /// Gets the corresponding tables. - /// - public IEnumerable Tables { get { return tables; } } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlForceJoinOrderHint(); - if (tables!=null) - clone.tables = tables - .Select(table => (SqlTable) table.Clone()) - .ToArray(); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlForceJoinOrderHint() - { - } - - internal SqlForceJoinOrderHint(SqlTable[] tables) - { - this.tables = tables; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Linq; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlForceJoinOrderHint : SqlHint + { + private SqlTable[] tables; + + /// + /// Gets the corresponding tables. + /// + public IEnumerable Tables { get { return tables; } } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlForceJoinOrderHint(); + if (tables!=null) + clone.tables = tables + .Select(table => (SqlTable) table.Clone()) + .ToArray(); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlForceJoinOrderHint() + { + } + + internal SqlForceJoinOrderHint(SqlTable[] tables) + { + this.tables = tables; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlHint.cs index d5dee9ecad..0604b84565 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlHint.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public abstract class SqlHint : SqlNode - { - /// - /// Initializes a new instance of the class. - /// - protected SqlHint() : base(SqlNodeType.Hint) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public abstract class SqlHint : SqlNode + { + /// + /// Initializes a new instance of the class. + /// + protected SqlHint() : base(SqlNodeType.Hint) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs index 07cb7ec38e..01680b6bdf 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs @@ -1,48 +1,48 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents a join option (hint) for a query optimizer. - /// - [Serializable] - public class SqlJoinHint : SqlHint - { - /// - /// Gets the join method. - /// - /// The join method. - public SqlJoinMethod Method { get; private set; } - - /// - /// Gets the table. - /// - public SqlTable Table { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlJoinHint(Method, (SqlTable) Table.Clone()); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlJoinHint(SqlJoinMethod method, SqlTable table) - { - Method = method; - Table = table; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents a join option (hint) for a query optimizer. + /// + [Serializable] + public class SqlJoinHint : SqlHint + { + /// + /// Gets the join method. + /// + /// The join method. + public SqlJoinMethod Method { get; private set; } + + /// + /// Gets the table. + /// + public SqlTable Table { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlJoinHint(Method, (SqlTable) Table.Clone()); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlJoinHint(SqlJoinMethod method, SqlTable table) + { + Method = method; + Table = table; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinMethod.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinMethod.cs index 7892bc4c5f..07eb3f7096 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinMethod.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinMethod.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - /// - /// A list of available join methods for a table. - /// - /// - /// MS SQL Server supports only , , - /// and methods. - /// Oracle supports all methods except method. - /// - [Serializable] - public enum SqlJoinMethod - { - /// - /// Join method is selected by query optimizer. - /// - Default = 0, - - /// - /// Instructs the optimizer to join each specified table to another row source with a nested loops join, - /// using the specified table as the inner table. - /// - Loop = 1, - - /// - /// Instructs the optimizer to join the specified table to another row source with a nested loops join - /// using the specified table as the inner table. - /// - LoopWithIndex = 2, - - /// - /// Instructs the optimizer to exclude nested loops joins when joining each specified table to another row source - /// using the specified table as the inner table. - /// - NoLoop = 3, - - /// - /// Instructs the optimizer to join each specified table with another row source using a sort-merge join. - /// - Merge = 4, - - /// - /// Instructs the optimizer to exclude sort-merge joins when joining each specified table to another row source - /// using the specified table as the inner table. - /// - NoMerge = 5, - - /// - /// Instructs the optimizer to join each specified table with another row source using a hash join. - /// - Hash = 6, - - /// - /// Instructs the optimizer to exclude hash joins when joining each specified table to another row source using - /// the specified table as the inner table. - /// - NoHash = 7, - - /// - /// Specifies that the join operation is performed on the site of the right table. This is useful - /// when the left table is a local table and the right table is a remote table. This method should be used - /// only when the left table has fewer rows than the right table. - /// - Remote = 8, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + /// + /// A list of available join methods for a table. + /// + /// + /// MS SQL Server supports only , , + /// and methods. + /// Oracle supports all methods except method. + /// + [Serializable] + public enum SqlJoinMethod + { + /// + /// Join method is selected by query optimizer. + /// + Default = 0, + + /// + /// Instructs the optimizer to join each specified table to another row source with a nested loops join, + /// using the specified table as the inner table. + /// + Loop = 1, + + /// + /// Instructs the optimizer to join the specified table to another row source with a nested loops join + /// using the specified table as the inner table. + /// + LoopWithIndex = 2, + + /// + /// Instructs the optimizer to exclude nested loops joins when joining each specified table to another row source + /// using the specified table as the inner table. + /// + NoLoop = 3, + + /// + /// Instructs the optimizer to join each specified table with another row source using a sort-merge join. + /// + Merge = 4, + + /// + /// Instructs the optimizer to exclude sort-merge joins when joining each specified table to another row source + /// using the specified table as the inner table. + /// + NoMerge = 5, + + /// + /// Instructs the optimizer to join each specified table with another row source using a hash join. + /// + Hash = 6, + + /// + /// Instructs the optimizer to exclude hash joins when joining each specified table to another row source using + /// the specified table as the inner table. + /// + NoHash = 7, + + /// + /// Specifies that the join operation is performed on the site of the right table. This is useful + /// when the left table is a local table and the right table is a remote table. This method should be used + /// only when the left table has fewer rows than the right table. + /// + Remote = 8, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlNativeHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlNativeHint.cs index 6dfb6c5f00..5ceb57a04c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlNativeHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlNativeHint.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlNativeHint : SqlHint - { - /// - /// Gets the hint text. - /// - /// The hint text. - public string HintText { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var clone = new SqlNativeHint(HintText); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlNativeHint(string hintText) - { - HintText = hintText; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlNativeHint : SqlHint + { + /// + /// Gets the hint text. + /// + /// The hint text. + public string HintText { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var clone = new SqlNativeHint(HintText); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlNativeHint(string hintText) + { + HintText = hintText; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlContainsTable.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlContainsTable.cs index 4c377d939f..78769c8842 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlContainsTable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlContainsTable.cs @@ -1,105 +1,105 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlContainsTable: SqlTable, ISqlQueryExpression - { - public SqlTableRef TargetTable { get; private set; } - - public SqlTableColumnCollection TargetColumns { get; private set; } - - public SqlExpression SearchCondition { get; private set; } - - public SqlExpression TopNByRank { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public new IEnumerator GetEnumerator() - { - yield return this; - } - - public SqlQueryExpression Except(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression Intersect(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression Union(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression UnionAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - - // Constructors - - - internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames) - : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, null) - { - } - - internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames) - : this(dataTable, freeText, columnNames, targetColumnNames, null) - { - } - - internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, SqlExpression topN) - : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, topN) - { - } - - internal SqlContainsTable(DataTable dataTable, SqlExpression searchCondition, ICollection columnNames, ICollection targetColumnNames, SqlExpression topNByRank) - : base(string.Empty) - { - TargetTable = SqlDml.TableRef(dataTable); - SearchCondition = searchCondition; - TopNByRank = topNByRank; - var targetColumnCount = targetColumnNames.Count; - if (targetColumnCount == 0) { - TargetColumns = new SqlTableColumnCollection(new List(1) {Asterisk}); - } - else { - var targetColumns = new List(targetColumnCount); - targetColumns.AddRange(targetColumnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); - TargetColumns = new SqlTableColumnCollection(targetColumns); - } - - var columnList = new List(columnNames.Count); - columnList.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); - columns = new SqlTableColumnCollection(columnList); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlContainsTable: SqlTable, ISqlQueryExpression + { + public SqlTableRef TargetTable { get; private set; } + + public SqlTableColumnCollection TargetColumns { get; private set; } + + public SqlExpression SearchCondition { get; private set; } + + public SqlExpression TopNByRank { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public new IEnumerator GetEnumerator() + { + yield return this; + } + + public SqlQueryExpression Except(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression Intersect(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression Union(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression UnionAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + + // Constructors + + + internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames) + : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, null) + { + } + + internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames) + : this(dataTable, freeText, columnNames, targetColumnNames, null) + { + } + + internal SqlContainsTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, SqlExpression topN) + : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, topN) + { + } + + internal SqlContainsTable(DataTable dataTable, SqlExpression searchCondition, ICollection columnNames, ICollection targetColumnNames, SqlExpression topNByRank) + : base(string.Empty) + { + TargetTable = SqlDml.TableRef(dataTable); + SearchCondition = searchCondition; + TopNByRank = topNByRank; + var targetColumnCount = targetColumnNames.Count; + if (targetColumnCount == 0) { + TargetColumns = new SqlTableColumnCollection(new List(1) {Asterisk}); + } + else { + var targetColumns = new List(targetColumnCount); + targetColumns.AddRange(targetColumnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); + TargetColumns = new SqlTableColumnCollection(targetColumns); + } + + var columnList = new List(columnNames.Count); + columnList.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); + columns = new SqlTableColumnCollection(columnList); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs index 49222cc5d6..3cd4335737 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alena Mikshina -// Created: 2014.05.06 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public sealed class SqlCustomFunctionType : IEquatable - { - public string Name { get; private set; } - - #region Equality members - - public bool Equals(SqlCustomFunctionType other) - { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; - return string.Equals(Name, other.Name); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (ReferenceEquals(this, obj)) - return true; - return Equals((SqlCustomFunctionType) obj); - } - - public override int GetHashCode() - { - return Name.GetHashCode(); - } - - public static bool operator ==(SqlCustomFunctionType left, SqlCustomFunctionType right) - { - return Equals(left, right); - } - - public static bool operator !=(SqlCustomFunctionType left, SqlCustomFunctionType right) - { - return !Equals(left, right); - } - - #endregion - - // Constructors - - public SqlCustomFunctionType(string name) - { - ArgumentValidator.EnsureArgumentNotNull(name, "name"); - - Name = name; - } - } -} +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alena Mikshina +// Created: 2014.05.06 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public sealed class SqlCustomFunctionType : IEquatable + { + public string Name { get; private set; } + + #region Equality members + + public bool Equals(SqlCustomFunctionType other) + { + if (ReferenceEquals(null, other)) + return false; + if (ReferenceEquals(this, other)) + return true; + return string.Equals(Name, other.Name); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + return Equals((SqlCustomFunctionType) obj); + } + + public override int GetHashCode() + { + return Name.GetHashCode(); + } + + public static bool operator ==(SqlCustomFunctionType left, SqlCustomFunctionType right) + { + return Equals(left, right); + } + + public static bool operator !=(SqlCustomFunctionType left, SqlCustomFunctionType right) + { + return !Equals(left, right); + } + + #endregion + + // Constructors + + public SqlCustomFunctionType(string name) + { + ArgumentValidator.EnsureArgumentNotNull(name, "name"); + + Name = name; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimeOffsetPart.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimeOffsetPart.cs index f83af8ccd8..ef07fee4f7 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimeOffsetPart.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimeOffsetPart.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlDateTimeOffsetPart - { - Year, - Month, - Day, - Hour, - Minute, - Second, - Millisecond, - Nanosecond, - TimeZoneHour, - TimeZoneMinute, - DayOfYear, - DayOfWeek, - Date, - DateTime, - LocalDateTime, - UtcDateTime, - Offset, - Nothing, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlDateTimeOffsetPart + { + Year, + Month, + Day, + Hour, + Minute, + Second, + Millisecond, + Nanosecond, + TimeZoneHour, + TimeZoneMinute, + DayOfYear, + DayOfWeek, + Date, + DateTime, + LocalDateTime, + UtcDateTime, + Offset, + Nothing, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimePart.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimePart.cs index c061d5ac00..6650b64122 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimePart.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlDateTimePart.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlDateTimePart - { - Year, - Month, - Day, - Hour, - Minute, - Second, - Millisecond, - Nanosecond, - TimeZoneHour, - TimeZoneMinute, - DayOfYear, - DayOfWeek, - Nothing, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlDateTimePart + { + Year, + Month, + Day, + Hour, + Minute, + Second, + Millisecond, + Nanosecond, + TimeZoneHour, + TimeZoneMinute, + DayOfYear, + DayOfWeek, + Nothing, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlFetchOption.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlFetchOption.cs index 1d991ba012..2d7b4523d5 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlFetchOption.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlFetchOption.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlFetchOption - { - Next = 0, - Prior = 1, - First = 2, - Last = 3, - Absolute = 4, - Relative = 5 - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlFetchOption + { + Next = 0, + Prior = 1, + First = 2, + Last = 3, + Absolute = 4, + Relative = 5 + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlFragment.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlFragment.cs index 9301560721..74ad112034 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlFragment.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlFragment.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.10.10 - -namespace Xtensive.Sql.Dml -{ - public class SqlFragment : SqlNode, ISqlCompileUnit - { - public SqlExpression Expression { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - var expression = (SqlExpression) Expression.Clone(context); - var clone = new SqlFragment(expression); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - - // Constructors - - internal SqlFragment(SqlExpression expression) - : base(SqlNodeType.Fragment) - { - Expression = expression; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.10.10 + +namespace Xtensive.Sql.Dml +{ + public class SqlFragment : SqlNode, ISqlCompileUnit + { + public SqlExpression Expression { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + var expression = (SqlExpression) Expression.Clone(context); + var clone = new SqlFragment(expression); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + + // Constructors + + internal SqlFragment(SqlExpression expression) + : base(SqlNodeType.Fragment) + { + Expression = expression; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlFreeTextTable.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlFreeTextTable.cs index b0f0274ef5..7e9e042ae6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlFreeTextTable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlFreeTextTable.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2009.12.29 - -using System; -using System.Linq; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlFreeTextTable : SqlTable, ISqlQueryExpression - { - public SqlTableRef TargetTable { get; private set; } - - public SqlTableColumnCollection TargetColumns { get; private set; } - - public SqlExpression FreeText { get; private set; } - - public SqlExpression TopNByRank { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public new IEnumerator GetEnumerator() - { - yield return this; - } - - public SqlQueryExpression Except(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression Intersect(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression Union(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - public SqlQueryExpression UnionAll(ISqlQueryExpression operand) - { - throw new NotImplementedException(); - } - - - // Constructors - - internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames) - : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, null) - { - } - - internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames) - : this(dataTable, freeText, columnNames, targetColumnNames, null) - { - } - - internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, SqlExpression topN) - : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, topN) - { - } - - internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames, SqlExpression topNByRank) - : base(string.Empty) - { - TargetTable = SqlDml.TableRef(dataTable); - FreeText = freeText; - TopNByRank = topNByRank; - var targetColumnCount = targetColumnNames.Count; - if (targetColumnCount == 0) { - TargetColumns = new SqlTableColumnCollection(new List(1) {Asterisk}); - } - else { - var targetColumns = new List(targetColumnCount); - targetColumns.AddRange(targetColumnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); - TargetColumns = new SqlTableColumnCollection(targetColumns); - } - - var columnList = new List(columnNames.Count); - columnList.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); - columns = new SqlTableColumnCollection(columnList); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2009.12.29 + +using System; +using System.Linq; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlFreeTextTable : SqlTable, ISqlQueryExpression + { + public SqlTableRef TargetTable { get; private set; } + + public SqlTableColumnCollection TargetColumns { get; private set; } + + public SqlExpression FreeText { get; private set; } + + public SqlExpression TopNByRank { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public new IEnumerator GetEnumerator() + { + yield return this; + } + + public SqlQueryExpression Except(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression Intersect(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression Union(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + public SqlQueryExpression UnionAll(ISqlQueryExpression operand) + { + throw new NotImplementedException(); + } + + + // Constructors + + internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames) + : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, null) + { + } + + internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames) + : this(dataTable, freeText, columnNames, targetColumnNames, null) + { + } + + internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, SqlExpression topN) + : this(dataTable, freeText, columnNames, ArrayUtils.EmptyArray, topN) + { + } + + internal SqlFreeTextTable(DataTable dataTable, SqlExpression freeText, ICollection columnNames, ICollection targetColumnNames, SqlExpression topNByRank) + : base(string.Empty) + { + TargetTable = SqlDml.TableRef(dataTable); + FreeText = freeText; + TopNByRank = topNByRank; + var targetColumnCount = targetColumnNames.Count; + if (targetColumnCount == 0) { + TargetColumns = new SqlTableColumnCollection(new List(1) {Asterisk}); + } + else { + var targetColumns = new List(targetColumnCount); + targetColumns.AddRange(targetColumnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); + TargetColumns = new SqlTableColumnCollection(targetColumns); + } + + var columnList = new List(columnNames.Count); + columnList.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); + columns = new SqlTableColumnCollection(columnList); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlFunctionType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlFunctionType.cs index c5f4fa26bd..a5d4701383 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlFunctionType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlFunctionType.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlFunctionType - { - Concat, - CurrentDate, - CurrentDateTimeOffset, - CurrentTime, - CurrentTimeStamp, - Lower, - CharLength, - BinaryLength, - Position, - Replace, - Substring, - Upper, - UserDefined, - CurrentUser, - SessionUser, - SystemUser, - User, - NullIf, - Coalesce, - LastAutoGeneratedId, - PadLeft, - PadRight, - - // mathematical functions - Abs, - Acos, - Asin, - Atan, - Atan2, - Ceiling, - Cos, - Cot, - Degrees, - Exp, - Floor, - Log, - Log10, - Pi, - Power, - Radians, - Rand, - Round, - Truncate, - Sign, - Sin, - Sqrt, - Square, - Tan, - - // date time / interval functions - // not ansi sql but our cross-server solution - - DateTimeConstruct, - DateTimeAddYears, - DateTimeAddMonths, - DateTimeTruncate, - DateTimeToStringIso, - IntervalConstruct, - IntervalToMilliseconds, - IntervalToNanoseconds, - IntervalAbs, - IntervalNegate, - - // DateTimeOffset / interval functions - DateTimeOffsetConstruct, - DateTimeOffsetAddYears, - DateTimeOffsetAddMonths, - DateTimeOffsetTimeOfDay, - DateTimeOffsetToLocalTime, - DateTimeOffsetToUtcTime, - DateTimeToDateTimeOffset, - - // .NET like rounding functions - - RoundDecimalToEven, - RoundDecimalToZero, - RoundDoubleToEven, - RoundDoubleToZero, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlFunctionType + { + Concat, + CurrentDate, + CurrentDateTimeOffset, + CurrentTime, + CurrentTimeStamp, + Lower, + CharLength, + BinaryLength, + Position, + Replace, + Substring, + Upper, + UserDefined, + CurrentUser, + SessionUser, + SystemUser, + User, + NullIf, + Coalesce, + LastAutoGeneratedId, + PadLeft, + PadRight, + + // mathematical functions + Abs, + Acos, + Asin, + Atan, + Atan2, + Ceiling, + Cos, + Cot, + Degrees, + Exp, + Floor, + Log, + Log10, + Pi, + Power, + Radians, + Rand, + Round, + Truncate, + Sign, + Sin, + Sqrt, + Square, + Tan, + + // date time / interval functions + // not ansi sql but our cross-server solution + + DateTimeConstruct, + DateTimeAddYears, + DateTimeAddMonths, + DateTimeTruncate, + DateTimeToStringIso, + IntervalConstruct, + IntervalToMilliseconds, + IntervalToNanoseconds, + IntervalAbs, + IntervalNegate, + + // DateTimeOffset / interval functions + DateTimeOffsetConstruct, + DateTimeOffsetAddYears, + DateTimeOffsetAddMonths, + DateTimeOffsetTimeOfDay, + DateTimeOffsetToLocalTime, + DateTimeOffsetToUtcTime, + DateTimeToDateTimeOffset, + + // .NET like rounding functions + + RoundDecimalToEven, + RoundDecimalToZero, + RoundDoubleToEven, + RoundDoubleToZero, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlIntervalPart.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlIntervalPart.cs index 23d766520a..f5fcfe39f8 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlIntervalPart.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlIntervalPart.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.02.25 - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlIntervalPart - { - Day = 0, - Hour = 1, - Minute = 2, - Second = 3, - Millisecond = 4, - Nanosecond = 5, - Nothing = 10, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.02.25 + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlIntervalPart + { + Day = 0, + Hour = 1, + Minute = 2, + Second = 3, + Millisecond = 4, + Nanosecond = 5, + Nothing = 10, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinExpression.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinExpression.cs index 11a41fc43c..488624938c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinExpression.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinExpression.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlJoinExpression : SqlNode - { - /// - /// Gets the type of the join. - /// - /// The type of the join. - public SqlJoinType JoinType { get; private set; } - - /// - /// Gets the left. - /// - /// The left. - public SqlTable Left { get; private set; } - - /// - /// Gets the right. - /// - /// The right. - public SqlTable Right { get; private set; } - - /// - /// Gets the expression. - /// - /// The expression. - public SqlExpression Expression { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlJoinExpression(JoinType, - Left==null ? null : (SqlTable) Left.Clone(context), - Right==null ? null : (SqlTable) Right.Clone(context), - Expression==null ? null : (SqlExpression) Expression.Clone(context)); - - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public virtual IEnumerator GetEnumerator() - { - foreach (SqlTable source in Left) - yield return source; - - foreach (SqlTable source in Right) - yield return source; - - yield break; - } - - // Constructor - - internal SqlJoinExpression(SqlJoinType joinType, SqlTable left, SqlTable right, SqlExpression expression) - : base(SqlNodeType.Join) - { - JoinType = joinType; - Left = left; - Right = right; - Expression = expression; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlJoinExpression : SqlNode + { + /// + /// Gets the type of the join. + /// + /// The type of the join. + public SqlJoinType JoinType { get; private set; } + + /// + /// Gets the left. + /// + /// The left. + public SqlTable Left { get; private set; } + + /// + /// Gets the right. + /// + /// The right. + public SqlTable Right { get; private set; } + + /// + /// Gets the expression. + /// + /// The expression. + public SqlExpression Expression { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlJoinExpression(JoinType, + Left==null ? null : (SqlTable) Left.Clone(context), + Right==null ? null : (SqlTable) Right.Clone(context), + Expression==null ? null : (SqlExpression) Expression.Clone(context)); + + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public virtual IEnumerator GetEnumerator() + { + foreach (SqlTable source in Left) + yield return source; + + foreach (SqlTable source in Right) + yield return source; + + yield break; + } + + // Constructor + + internal SqlJoinExpression(SqlJoinType joinType, SqlTable left, SqlTable right, SqlExpression expression) + : base(SqlNodeType.Join) + { + JoinType = joinType; + Left = left; + Right = right; + Expression = expression; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinType.cs index 7bee479a2b..26c9be5935 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinType.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlJoinType - { - CrossJoin, - - InnerJoin, - - RightOuterJoin, - - LeftOuterJoin, - - FullOuterJoin, - - UnionJoin, - - UsingJoin, - - CrossApply, - - LeftOuterApply - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlJoinType + { + CrossJoin, + + InnerJoin, + + RightOuterJoin, + + LeftOuterJoin, + + FullOuterJoin, + + UnionJoin, + + UsingJoin, + + CrossApply, + + LeftOuterApply + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinedTable.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinedTable.cs index 36de650ecb..450791b31c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlJoinedTable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlJoinedTable.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlJoinedTable : SqlTable - { - private SqlJoinExpression joinExpression; - - /// - /// Gets the join expression. - /// - /// The join expression. - public SqlJoinExpression JoinExpression - { - get { return joinExpression; } - } - - /// - /// Gets or sets the aliased columns. - /// - /// Aliased columns. - public SqlColumnCollection AliasedColumns { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) { - return context.NodeMapping[this]; - } - - var clone = new SqlJoinedTable((SqlJoinExpression) joinExpression.Clone(context)) { - AliasedColumns = new SqlColumnCollection(new List(AliasedColumns)) - }; - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - joinExpression.AcceptVisitor(visitor); - } - - /// - public override IEnumerator GetEnumerator() - { - return joinExpression.GetEnumerator(); - } - - - // Constructor - - internal SqlJoinedTable(SqlJoinExpression joinExpression) - : this(joinExpression, joinExpression.Left.Columns, joinExpression.Right.Columns) - { - } - - internal SqlJoinedTable(SqlJoinExpression joinExpression, IReadOnlyList leftColumns, IReadOnlyList rightColumns) - { - this.joinExpression = joinExpression; - var allLeftColumns = joinExpression.Left.Columns; - var allRightColumns = joinExpression.Right.Columns; - - var joinedColumns = new List(allLeftColumns.Count + allRightColumns.Count); - joinedColumns.AddRange(allLeftColumns); - joinedColumns.AddRange(allRightColumns); - columns = new SqlTableColumnCollection(joinedColumns); - - var aliasedColumns = new List(leftColumns.Count + rightColumns.Count); - aliasedColumns.AddRange(leftColumns); - aliasedColumns.AddRange(rightColumns); - AliasedColumns = new SqlColumnCollection(aliasedColumns); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlJoinedTable : SqlTable + { + private SqlJoinExpression joinExpression; + + /// + /// Gets the join expression. + /// + /// The join expression. + public SqlJoinExpression JoinExpression + { + get { return joinExpression; } + } + + /// + /// Gets or sets the aliased columns. + /// + /// Aliased columns. + public SqlColumnCollection AliasedColumns { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) { + return context.NodeMapping[this]; + } + + var clone = new SqlJoinedTable((SqlJoinExpression) joinExpression.Clone(context)) { + AliasedColumns = new SqlColumnCollection(new List(AliasedColumns)) + }; + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + joinExpression.AcceptVisitor(visitor); + } + + /// + public override IEnumerator GetEnumerator() + { + return joinExpression.GetEnumerator(); + } + + + // Constructor + + internal SqlJoinedTable(SqlJoinExpression joinExpression) + : this(joinExpression, joinExpression.Left.Columns, joinExpression.Right.Columns) + { + } + + internal SqlJoinedTable(SqlJoinExpression joinExpression, IReadOnlyList leftColumns, IReadOnlyList rightColumns) + { + this.joinExpression = joinExpression; + var allLeftColumns = joinExpression.Left.Columns; + var allRightColumns = joinExpression.Right.Columns; + + var joinedColumns = new List(allLeftColumns.Count + allRightColumns.Count); + joinedColumns.AddRange(allLeftColumns); + joinedColumns.AddRange(allRightColumns); + columns = new SqlTableColumnCollection(joinedColumns); + + var aliasedColumns = new List(leftColumns.Count + rightColumns.Count); + aliasedColumns.AddRange(leftColumns); + aliasedColumns.AddRange(rightColumns); + AliasedColumns = new SqlColumnCollection(aliasedColumns); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlLockType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlLockType.cs index 134e445824..a97c27a46a 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlLockType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlLockType.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.24 - -using System; - -namespace Xtensive.Sql.Dml -{ - [Flags] - public enum SqlLockType - { - Empty = 0, - Shared = 1, - Update = 2, - Exclusive = 4, - ThrowIfLocked = 8, - SkipLocked = 16, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.24 + +using System; + +namespace Xtensive.Sql.Dml +{ + [Flags] + public enum SqlLockType + { + Empty = 0, + Shared = 1, + Update = 2, + Exclusive = 4, + ThrowIfLocked = 8, + SkipLocked = 16, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlMatchType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlMatchType.cs index c798f60b35..abdc1feac4 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlMatchType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlMatchType.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - /// - /// Enums types of search of matching in MATCH SQL statement. - /// - [Serializable] - public enum SqlMatchType - { - /// - /// If there exists a null value of then the MATCH - /// SQL statement is true. - /// If there exists a row of the such that each - /// value of equals its corresponding value in row, - /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. - /// - None = 0, - - /// - /// If there exists a row of the such that each - /// non-null value of equals its corresponding value in row, - /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. - /// - Partial = 1, - - /// - /// If there exists a null value of then the MATCH - /// SQL statement is false. - /// If there exists a row of the such that each - /// value of equals its corresponding value in row, - /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. - /// - Full = 2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + /// + /// Enums types of search of matching in MATCH SQL statement. + /// + [Serializable] + public enum SqlMatchType + { + /// + /// If there exists a null value of then the MATCH + /// SQL statement is true. + /// If there exists a row of the such that each + /// value of equals its corresponding value in row, + /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. + /// + None = 0, + + /// + /// If there exists a row of the such that each + /// non-null value of equals its corresponding value in row, + /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. + /// + Partial = 1, + + /// + /// If there exists a null value of then the MATCH + /// SQL statement is false. + /// If there exists a row of the such that each + /// value of equals its corresponding value in row, + /// then the MATCH SQL statement is true. Otherwise, the MATCH SQL statement is false. + /// + Full = 2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlOrder.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlOrder.cs index 3da812c7f3..1eddf08e55 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlOrder.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlOrder.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents order specification. - /// - [Serializable] - public class SqlOrder : SqlNode - { - /// - /// Gets the expression to sort by. - /// - /// The expression. - public SqlExpression Expression { get; private set; } - - /// - /// Gets the position of column to sort by. - /// - /// The position. - public int Position { get; private set; } - - /// - /// Gets a value indicating whether this is ascending. - /// - /// if ascending; otherwise, . - public bool Ascending { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = Expression.IsNullReference() - ? new SqlOrder(Position, Ascending) - : new SqlOrder((SqlExpression)Expression.Clone(context), Ascending); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - // Constructors - - internal SqlOrder(SqlExpression expression, bool ascending) - : base(SqlNodeType.Order) - { - Expression = expression; - Ascending = ascending; - } - - internal SqlOrder(int position, bool ascending) : base(SqlNodeType.Order) - { - Position = position; - Ascending = ascending; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents order specification. + /// + [Serializable] + public class SqlOrder : SqlNode + { + /// + /// Gets the expression to sort by. + /// + /// The expression. + public SqlExpression Expression { get; private set; } + + /// + /// Gets the position of column to sort by. + /// + /// The position. + public int Position { get; private set; } + + /// + /// Gets a value indicating whether this is ascending. + /// + /// if ascending; otherwise, . + public bool Ascending { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = Expression.IsNullReference() + ? new SqlOrder(Position, Ascending) + : new SqlOrder((SqlExpression)Expression.Clone(context), Ascending); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + // Constructors + + internal SqlOrder(SqlExpression expression, bool ascending) + : base(SqlNodeType.Order) + { + Expression = expression; + Ascending = ascending; + } + + internal SqlOrder(int position, bool ascending) : base(SqlNodeType.Order) + { + Position = position; + Ascending = ascending; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlQueryRef.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlQueryRef.cs index ae110c9514..57357cfdf8 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlQueryRef.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlQueryRef.cs @@ -1,95 +1,95 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlQueryRef : SqlTable - { - private readonly ISqlQueryExpression query; - - /// - /// Gets the query statement. - /// - /// The query statement. - public ISqlQueryExpression Query - { - get { return query; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlQueryRef clone; - var ss = query as SqlSelect; - if (ss!=null) - clone = new SqlQueryRef((SqlSelect) ss.Clone(context), Name); - else { - var qe = (SqlQueryExpression) query; - clone = new SqlQueryRef((SqlQueryExpression) qe.Clone(context), Name); - } - context.NodeMapping[this] = clone; - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlQueryRef(ISqlQueryExpression query) - : this(query, string.Empty) - { - } - - internal SqlQueryRef(ISqlQueryExpression query, string name) - : base(name) - { - this.query = query; - var queryColumns = new List(); - foreach (var queryExpression in query) { - if (queryExpression is SqlSelect sqlSelect) { - var selectColumns = sqlSelect.Columns; - for (int index = 0, count = selectColumns.Count; index < count; index++) { - var originalColumn = selectColumns[index]; - var column = originalColumn; - if (column is SqlColumnStub stubColumn) { - column = stubColumn.Column; - } - - if (column is SqlColumnRef columnRef) { - stubColumn = columnRef.SqlColumn as SqlColumnStub; - if (!ReferenceEquals(null, stubColumn)) { - column = stubColumn.Column; - } - } - - selectColumns[index] = column; - queryColumns.Add(SqlDml.TableColumn(this, originalColumn.Name)); - } - } - - if (queryExpression is SqlFreeTextTable freeTextTable) { - queryColumns.AddRange( - freeTextTable.Columns.Select(originalColumn => SqlDml.TableColumn(this, originalColumn.Name))); - } - - if (queryExpression is SqlContainsTable containsTable) { - queryColumns.AddRange( - containsTable.Columns.Select(originalColumn => SqlDml.TableColumn(this, originalColumn.Name))); - } - - break; - } - columns = new SqlTableColumnCollection(queryColumns); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlQueryRef : SqlTable + { + private readonly ISqlQueryExpression query; + + /// + /// Gets the query statement. + /// + /// The query statement. + public ISqlQueryExpression Query + { + get { return query; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlQueryRef clone; + var ss = query as SqlSelect; + if (ss!=null) + clone = new SqlQueryRef((SqlSelect) ss.Clone(context), Name); + else { + var qe = (SqlQueryExpression) query; + clone = new SqlQueryRef((SqlQueryExpression) qe.Clone(context), Name); + } + context.NodeMapping[this] = clone; + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlQueryRef(ISqlQueryExpression query) + : this(query, string.Empty) + { + } + + internal SqlQueryRef(ISqlQueryExpression query, string name) + : base(name) + { + this.query = query; + var queryColumns = new List(); + foreach (var queryExpression in query) { + if (queryExpression is SqlSelect sqlSelect) { + var selectColumns = sqlSelect.Columns; + for (int index = 0, count = selectColumns.Count; index < count; index++) { + var originalColumn = selectColumns[index]; + var column = originalColumn; + if (column is SqlColumnStub stubColumn) { + column = stubColumn.Column; + } + + if (column is SqlColumnRef columnRef) { + stubColumn = columnRef.SqlColumn as SqlColumnStub; + if (!ReferenceEquals(null, stubColumn)) { + column = stubColumn.Column; + } + } + + selectColumns[index] = column; + queryColumns.Add(SqlDml.TableColumn(this, originalColumn.Name)); + } + } + + if (queryExpression is SqlFreeTextTable freeTextTable) { + queryColumns.AddRange( + freeTextTable.Columns.Select(originalColumn => SqlDml.TableColumn(this, originalColumn.Name))); + } + + if (queryExpression is SqlContainsTable containsTable) { + queryColumns.AddRange( + containsTable.Columns.Select(originalColumn => SqlDml.TableColumn(this, originalColumn.Name))); + } + + break; + } + columns = new SqlTableColumnCollection(queryColumns); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlTable.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlTable.cs index 275b18ba7f..d6df153392 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlTable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlTable.cs @@ -1,156 +1,156 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - /// - /// Describes a reference to object; - /// - [Serializable] - public abstract class SqlTable : - SqlNode, - IEnumerable - { - private string name; - protected SqlTableColumnCollection columns; - private readonly SqlTableColumn asterisk; - - /// - /// Gets the name of the instance. - /// - /// The name. - public virtual string Name - { - get { return name; } - internal set { name = value; } - } - - /// - /// Gets the collection of columns. - /// - /// The collection of column references. - public SqlTableColumnCollection Columns - { - get { return columns; } - } - - public SqlTableColumn Asterisk - { - get { return asterisk; } - } - - /// - /// An indexer that provides access to collection items by their names. - /// Returns if there is no such item. - /// - public SqlTableColumn this[string name] - { - get { return (name==SqlDml.Asterisk) ? asterisk : columns[name]; } - } - - /// - /// Gets the at the specified index. - /// - /// - public SqlTableColumn this[int index] - { - get { return columns[index]; } - } - - public virtual IEnumerator GetEnumerator() - { - yield return this; - } - - public virtual SqlJoinedTable CrossJoin(SqlTable right) - { - return SqlDml.Join(SqlJoinType.CrossJoin, this, right); - } - - public virtual SqlJoinedTable UnionJoin(SqlTable right) - { - return SqlDml.Join(SqlJoinType.UnionJoin, this, right, null); - } - - public virtual SqlJoinedTable InnerJoin(SqlTable right) - { - return InnerJoin(right, null); - } - - public virtual SqlJoinedTable LeftOuterJoin(SqlTable right) - { - return LeftOuterJoin(right, null); - } - - public virtual SqlJoinedTable RightOuterJoin(SqlTable right) - { - return RightOuterJoin(right, null); - } - - public virtual SqlJoinedTable FullOuterJoin(SqlTable right) - { - return FullOuterJoin(right, null); - } - - public virtual SqlJoinedTable InnerJoin(SqlTable right, SqlExpression expression) - { - return SqlDml.Join(SqlJoinType.InnerJoin, this, right, expression); - } - - public virtual SqlJoinedTable LeftOuterJoin(SqlTable right, SqlExpression expression) - { - return SqlDml.Join(SqlJoinType.LeftOuterJoin, this, right, expression); - } - - public virtual SqlJoinedTable RightOuterJoin(SqlTable right, SqlExpression expression) - { - return SqlDml.Join(SqlJoinType.RightOuterJoin, this, right, expression); - } - - public virtual SqlJoinedTable FullOuterJoin(SqlTable right, SqlExpression expression) - { - return SqlDml.Join(SqlJoinType.FullOuterJoin, this, right, expression); - } - - public virtual SqlJoinedTable UsingJoin(SqlTable right, params SqlColumn[] columns) - { - return SqlDml.Join(this, right, columns); - } - - public virtual SqlJoinedTable CrossApply(SqlTable right) - { - return SqlDml.Join(SqlJoinType.CrossApply, this, right); - } - - public virtual SqlJoinedTable LeftOuterApply(SqlTable right) - { - return SqlDml.Join(SqlJoinType.LeftOuterApply, this, right); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - - // Constructors - - protected SqlTable() : base(SqlNodeType.Table) - { - asterisk = new SqlTableColumn(this, SqlDml.Asterisk.Value); - } - - protected SqlTable(string name) : this() - { - if (!string.IsNullOrEmpty(name)) - this.name = name; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + /// + /// Describes a reference to object; + /// + [Serializable] + public abstract class SqlTable : + SqlNode, + IEnumerable + { + private string name; + protected SqlTableColumnCollection columns; + private readonly SqlTableColumn asterisk; + + /// + /// Gets the name of the instance. + /// + /// The name. + public virtual string Name + { + get { return name; } + internal set { name = value; } + } + + /// + /// Gets the collection of columns. + /// + /// The collection of column references. + public SqlTableColumnCollection Columns + { + get { return columns; } + } + + public SqlTableColumn Asterisk + { + get { return asterisk; } + } + + /// + /// An indexer that provides access to collection items by their names. + /// Returns if there is no such item. + /// + public SqlTableColumn this[string name] + { + get { return (name==SqlDml.Asterisk) ? asterisk : columns[name]; } + } + + /// + /// Gets the at the specified index. + /// + /// + public SqlTableColumn this[int index] + { + get { return columns[index]; } + } + + public virtual IEnumerator GetEnumerator() + { + yield return this; + } + + public virtual SqlJoinedTable CrossJoin(SqlTable right) + { + return SqlDml.Join(SqlJoinType.CrossJoin, this, right); + } + + public virtual SqlJoinedTable UnionJoin(SqlTable right) + { + return SqlDml.Join(SqlJoinType.UnionJoin, this, right, null); + } + + public virtual SqlJoinedTable InnerJoin(SqlTable right) + { + return InnerJoin(right, null); + } + + public virtual SqlJoinedTable LeftOuterJoin(SqlTable right) + { + return LeftOuterJoin(right, null); + } + + public virtual SqlJoinedTable RightOuterJoin(SqlTable right) + { + return RightOuterJoin(right, null); + } + + public virtual SqlJoinedTable FullOuterJoin(SqlTable right) + { + return FullOuterJoin(right, null); + } + + public virtual SqlJoinedTable InnerJoin(SqlTable right, SqlExpression expression) + { + return SqlDml.Join(SqlJoinType.InnerJoin, this, right, expression); + } + + public virtual SqlJoinedTable LeftOuterJoin(SqlTable right, SqlExpression expression) + { + return SqlDml.Join(SqlJoinType.LeftOuterJoin, this, right, expression); + } + + public virtual SqlJoinedTable RightOuterJoin(SqlTable right, SqlExpression expression) + { + return SqlDml.Join(SqlJoinType.RightOuterJoin, this, right, expression); + } + + public virtual SqlJoinedTable FullOuterJoin(SqlTable right, SqlExpression expression) + { + return SqlDml.Join(SqlJoinType.FullOuterJoin, this, right, expression); + } + + public virtual SqlJoinedTable UsingJoin(SqlTable right, params SqlColumn[] columns) + { + return SqlDml.Join(this, right, columns); + } + + public virtual SqlJoinedTable CrossApply(SqlTable right) + { + return SqlDml.Join(SqlJoinType.CrossApply, this, right); + } + + public virtual SqlJoinedTable LeftOuterApply(SqlTable right) + { + return SqlDml.Join(SqlJoinType.LeftOuterApply, this, right); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + + // Constructors + + protected SqlTable() : base(SqlNodeType.Table) + { + asterisk = new SqlTableColumn(this, SqlDml.Asterisk.Value); + } + + protected SqlTable(string name) : this() + { + if (!string.IsNullOrEmpty(name)) + this.name = name; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs index f5930a3b35..2adbae93cf 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs @@ -1,84 +1,84 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Linq; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Collections; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql.Dml -{ - /// - /// Describes a reference to object; - /// - [Serializable] - public class SqlTableRef : SqlTable - { - /// - /// Gets the name of the instance. - /// - /// The name. - public override string Name => string.IsNullOrEmpty(base.Name) ? DataTable.DbName : base.Name; - - /// - /// Gets the referenced table. - /// - /// The table. - public DataTable DataTable { get; private set; } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) { - return context.NodeMapping[this]; - } - - return CreateClone(context); - } - - private SqlTableRef CreateClone(SqlNodeCloneContext context) - { - var clone = new SqlTableRef {Name = Name, DataTable = DataTable}; - context.NodeMapping[this] = clone; - var columnClones = new List(columns.Count); - columnClones.AddRange(columns.Select(column => (SqlTableColumn) column.Clone(context))); - - clone.columns = new SqlTableColumnCollection(columnClones); - - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) => visitor.Visit(this); - - // Constructors - - private SqlTableRef() - { } - - internal SqlTableRef(DataTable dataTable) - : this(dataTable, string.Empty, Array.Empty()) - { } - - internal SqlTableRef(DataTable dataTable, string name) - : this(dataTable, name, Array.Empty()) - { } - - internal SqlTableRef(DataTable dataTable, string name, params string[] columnNames) - : base(name) - { - DataTable = dataTable; - List tableColumns; - if (columnNames.Length == 0) { - tableColumns = new List(dataTable.Columns.Count); - tableColumns.AddRange(dataTable.Columns.Select(column => SqlDml.TableColumn(this, column.Name))); - } - else { - tableColumns = new List(columnNames.Length); - tableColumns.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); - } - columns = new SqlTableColumnCollection(tableColumns); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Linq; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Collections; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql.Dml +{ + /// + /// Describes a reference to object; + /// + [Serializable] + public class SqlTableRef : SqlTable + { + /// + /// Gets the name of the instance. + /// + /// The name. + public override string Name => string.IsNullOrEmpty(base.Name) ? DataTable.DbName : base.Name; + + /// + /// Gets the referenced table. + /// + /// The table. + public DataTable DataTable { get; private set; } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) { + return context.NodeMapping[this]; + } + + return CreateClone(context); + } + + private SqlTableRef CreateClone(SqlNodeCloneContext context) + { + var clone = new SqlTableRef {Name = Name, DataTable = DataTable}; + context.NodeMapping[this] = clone; + var columnClones = new List(columns.Count); + columnClones.AddRange(columns.Select(column => (SqlTableColumn) column.Clone(context))); + + clone.columns = new SqlTableColumnCollection(columnClones); + + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) => visitor.Visit(this); + + // Constructors + + private SqlTableRef() + { } + + internal SqlTableRef(DataTable dataTable) + : this(dataTable, string.Empty, Array.Empty()) + { } + + internal SqlTableRef(DataTable dataTable, string name) + : this(dataTable, name, Array.Empty()) + { } + + internal SqlTableRef(DataTable dataTable, string name, params string[] columnNames) + : base(name) + { + DataTable = dataTable; + List tableColumns; + if (columnNames.Length == 0) { + tableColumns = new List(dataTable.Columns.Count); + tableColumns.AddRange(dataTable.Columns.Select(column => SqlDml.TableColumn(this, column.Name))); + } + else { + tableColumns = new List(columnNames.Length); + tableColumns.AddRange(columnNames.Select(columnName => SqlDml.TableColumn(this, columnName))); + } + columns = new SqlTableColumnCollection(tableColumns); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlTrimType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlTrimType.cs index 45d91389df..9fb89bb6d9 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlTrimType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlTrimType.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public enum SqlTrimType - { - Leading = 0, - Trailing = 1, - Both = 2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public enum SqlTrimType + { + Leading = 0, + Trailing = 1, + Both = 2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlAssignment.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlAssignment.cs index a6347ec57c..fe49d4126c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlAssignment.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlAssignment.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlAssignment : SqlStatement - { - private readonly ISqlLValue left; - private readonly SqlExpression right; - - /// - /// Gets the left operand of the assign statement. - /// - public ISqlLValue Left { - get { - return left; - } - } - - /// - /// Gets the right operand of the assign statement. - /// - public SqlExpression Right { - get { - return right; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlAssignment clone = new SqlAssignment((ISqlLValue)left.Clone(), (SqlExpression)right.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlAssignment(ISqlLValue left, SqlExpression right) - : base(SqlNodeType.Assign) - { - this.right = right; - this.left = left; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlAssignment : SqlStatement + { + private readonly ISqlLValue left; + private readonly SqlExpression right; + + /// + /// Gets the left operand of the assign statement. + /// + public ISqlLValue Left { + get { + return left; + } + } + + /// + /// Gets the right operand of the assign statement. + /// + public SqlExpression Right { + get { + return right; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlAssignment clone = new SqlAssignment((ISqlLValue)left.Clone(), (SqlExpression)right.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlAssignment(ISqlLValue left, SqlExpression right) + : base(SqlNodeType.Assign) + { + this.right = right; + this.left = left; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBatch.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBatch.cs index 8957f4b7fd..b3b0934f21 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBatch.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBatch.cs @@ -1,134 +1,134 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlBatch: SqlStatement, - IList, - ISqlCompileUnit - { - private IList statements = new Collection(); - - #region IList Members - - /// - public void Add(SqlStatement item) - { - statements.Add(item); - } - - public void AddRange(IEnumerable items) - { - foreach (SqlStatement item in items) - Add(item); - } - - /// - public void Clear() - { - statements.Clear(); - } - - /// - public bool Contains(SqlStatement item) - { - return statements.Contains(item); - } - - /// - public void CopyTo(SqlStatement[] array, int arrayIndex) - { - statements.CopyTo(array, arrayIndex); - } - - /// - public bool Remove(SqlStatement item) - { - return statements.Remove(item); - } - - /// - public int Count - { - get { return statements.Count; } - } - - /// - public bool IsReadOnly - { - get { return false; } - } - - /// - public int IndexOf(SqlStatement item) - { - return statements.IndexOf(item); - } - - /// - public void Insert(int index, SqlStatement item) - { - statements.Insert(index, item); - } - - /// - public void RemoveAt(int index) - { - statements.RemoveAt(index); - } - - /// - public SqlStatement this[int index] - { - get { return statements[index]; } - set { statements[index] = value; } - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return statements.GetEnumerator(); - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return statements.GetEnumerator(); - } - - #endregion - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlBatch(); - foreach (SqlStatement s in statements) - clone.Add((SqlStatement) s.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - /// - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - - // Constructors - - internal SqlBatch() - : base(SqlNodeType.Batch) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlBatch: SqlStatement, + IList, + ISqlCompileUnit + { + private IList statements = new Collection(); + + #region IList Members + + /// + public void Add(SqlStatement item) + { + statements.Add(item); + } + + public void AddRange(IEnumerable items) + { + foreach (SqlStatement item in items) + Add(item); + } + + /// + public void Clear() + { + statements.Clear(); + } + + /// + public bool Contains(SqlStatement item) + { + return statements.Contains(item); + } + + /// + public void CopyTo(SqlStatement[] array, int arrayIndex) + { + statements.CopyTo(array, arrayIndex); + } + + /// + public bool Remove(SqlStatement item) + { + return statements.Remove(item); + } + + /// + public int Count + { + get { return statements.Count; } + } + + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + public int IndexOf(SqlStatement item) + { + return statements.IndexOf(item); + } + + /// + public void Insert(int index, SqlStatement item) + { + statements.Insert(index, item); + } + + /// + public void RemoveAt(int index) + { + statements.RemoveAt(index); + } + + /// + public SqlStatement this[int index] + { + get { return statements[index]; } + set { statements[index] = value; } + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return statements.GetEnumerator(); + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return statements.GetEnumerator(); + } + + #endregion + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlBatch(); + foreach (SqlStatement s in statements) + clone.Add((SqlStatement) s.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + /// + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + + // Constructors + + internal SqlBatch() + : base(SqlNodeType.Batch) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBreak.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBreak.cs index 4af7cfb30f..d3e1e52bcc 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBreak.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlBreak.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlBreak : SqlStatement - { - internal override object Clone(SqlNodeCloneContext context) - { - return this; - } - - internal SqlBreak() - : base(SqlNodeType.Break) - { - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlBreak : SqlStatement + { + internal override object Clone(SqlNodeCloneContext context) + { + return this; + } + + internal SqlBreak() + : base(SqlNodeType.Break) + { + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlCloseCursor.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlCloseCursor.cs index 43aa273a33..6d4f6905c8 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlCloseCursor.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlCloseCursor.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlCloseCursor : SqlStatement, ISqlCompileUnit - { - private SqlCursor cursor; - - /// - /// Gets the cursor. - /// - /// The cursor. - public SqlCursor Cursor { - get { - return cursor; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public SqlCloseCursor(SqlCursor cursor) - : base(SqlNodeType.CloseCursor) - { - this.cursor = cursor; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlCloseCursor : SqlStatement, ISqlCompileUnit + { + private SqlCursor cursor; + + /// + /// Gets the cursor. + /// + /// The cursor. + public SqlCursor Cursor { + get { + return cursor; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public SqlCloseCursor(SqlCursor cursor) + : base(SqlNodeType.CloseCursor) + { + this.cursor = cursor; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlContinue.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlContinue.cs index 4b32de1587..4a28f041a6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlContinue.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlContinue.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlContinue : SqlStatement - { - internal override object Clone(SqlNodeCloneContext context) - { - return this; - } - - internal SqlContinue() - : base(SqlNodeType.Continue) - { - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlContinue : SqlStatement + { + internal override object Clone(SqlNodeCloneContext context) + { + return this; + } + + internal SqlContinue() + : base(SqlNodeType.Continue) + { + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareCursor.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareCursor.cs index 661ad0e775..083809df46 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareCursor.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareCursor.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlDeclareCursor : SqlStatement, ISqlCompileUnit - { - private SqlCursor cursor; - - public SqlCursor Cursor { - get { - return cursor; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlDeclareCursor(SqlCursor cursor) - : base(SqlNodeType.DeclareCursor) - { - this.cursor = cursor; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlDeclareCursor : SqlStatement, ISqlCompileUnit + { + private SqlCursor cursor; + + public SqlCursor Cursor { + get { + return cursor; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlDeclareCursor(SqlCursor cursor) + : base(SqlNodeType.DeclareCursor) + { + this.cursor = cursor; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareVariable.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareVariable.cs index f748c08fcd..5789e393f6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareVariable.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDeclareVariable.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlDeclareVariable : SqlStatement, ISqlCompileUnit - { - private SqlVariable variable; - - /// - /// Gets the variable. - /// - /// The variable. - public SqlVariable Variable - { - get { return variable; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDeclareVariable clone = new SqlDeclareVariable(variable); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlDeclareVariable(SqlVariable variable) - : base(SqlNodeType.DeclareVariable) - { - this.variable = variable; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlDeclareVariable : SqlStatement, ISqlCompileUnit + { + private SqlVariable variable; + + /// + /// Gets the variable. + /// + /// The variable. + public SqlVariable Variable + { + get { return variable; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDeclareVariable clone = new SqlDeclareVariable(variable); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlDeclareVariable(SqlVariable variable) + : base(SqlNodeType.DeclareVariable) + { + this.variable = variable; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDelete.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDelete.cs index 1ea9689dfb..8883ea85ea 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDelete.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlDelete.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - /// - /// Describes SQL DELETE statement. - /// - [Serializable] - public class SqlDelete : SqlQueryStatement, ISqlCompileUnit - { - private SqlExpression where; - private SqlTableRef delete; - private SqlTable from; - private SqlExpression limit; - - /// - /// Gets or sets the table. - /// - /// The table to change. - public SqlTableRef Delete - { - get { return delete; } - set { delete = value; } - } - - /// - /// Gets or sets the WHERE clause expression. - /// - /// The WHERE clause expression. - public SqlExpression Where { - get { - return where; - } - set { - if (!value.IsNullReference() && value.GetType()!=typeof(SqlCursor)) - SqlValidator.EnsureIsBooleanExpression(value); - where = value; - } - } - - /// - /// Gets or sets the FROM clause expression. - /// - public SqlTable From - { - get { return from;} - set { from = value; } - } - - /// - /// Gets or sets the LIMIT clause expression - /// - public SqlExpression Limit - { - get { return limit; } - set { limit = value; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlDelete clone = new SqlDelete(); - if (Delete!=null) - clone.Delete = (SqlTableRef)Delete.Clone(context); - if (from!=null) - clone.From = (SqlQueryRef)from.Clone(context); - if (!where.IsNullReference()) - clone.Where = (SqlExpression) where.Clone(context); - - if (Hints.Count>0) - foreach (SqlHint hint in Hints) - clone.Hints.Add((SqlHint)hint.Clone(context)); - - context.NodeMapping[this] = clone; - return clone; - } - - // Constructor - - internal SqlDelete(): base(SqlNodeType.Delete) - { - } - - internal SqlDelete(SqlTableRef table) : this() - { - delete = table; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + /// + /// Describes SQL DELETE statement. + /// + [Serializable] + public class SqlDelete : SqlQueryStatement, ISqlCompileUnit + { + private SqlExpression where; + private SqlTableRef delete; + private SqlTable from; + private SqlExpression limit; + + /// + /// Gets or sets the table. + /// + /// The table to change. + public SqlTableRef Delete + { + get { return delete; } + set { delete = value; } + } + + /// + /// Gets or sets the WHERE clause expression. + /// + /// The WHERE clause expression. + public SqlExpression Where { + get { + return where; + } + set { + if (!value.IsNullReference() && value.GetType()!=typeof(SqlCursor)) + SqlValidator.EnsureIsBooleanExpression(value); + where = value; + } + } + + /// + /// Gets or sets the FROM clause expression. + /// + public SqlTable From + { + get { return from;} + set { from = value; } + } + + /// + /// Gets or sets the LIMIT clause expression + /// + public SqlExpression Limit + { + get { return limit; } + set { limit = value; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlDelete clone = new SqlDelete(); + if (Delete!=null) + clone.Delete = (SqlTableRef)Delete.Clone(context); + if (from!=null) + clone.From = (SqlQueryRef)from.Clone(context); + if (!where.IsNullReference()) + clone.Where = (SqlExpression) where.Clone(context); + + if (Hints.Count>0) + foreach (SqlHint hint in Hints) + clone.Hints.Add((SqlHint)hint.Clone(context)); + + context.NodeMapping[this] = clone; + return clone; + } + + // Constructor + + internal SqlDelete(): base(SqlNodeType.Delete) + { + } + + internal SqlDelete(SqlTableRef table) : this() + { + delete = table; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlFetch.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlFetch.cs index ba798a141d..9094f58cab 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlFetch.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlFetch.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlFetch: SqlStatement, - ISqlCompileUnit - { - private readonly SqlCursor cursor; - private readonly SqlFetchOption option = SqlFetchOption.Next; - private readonly SqlExpression rowCount; - private readonly IList targets = new Collection(); - - /// - /// Gets the cursor. - /// - /// The cursor. - public SqlCursor Cursor - { - get { return cursor; } - } - - /// - /// Gets the fetch option. - /// - /// The fetch option. - public SqlFetchOption Option - { - get { return option; } - } - - /// - /// Gets the row count. - /// - /// The row count. - public SqlExpression RowCount - { - get { return rowCount; } - } - - /// - /// Gets the targets. - /// - /// The targets. - public IList Targets - { - get { return targets; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlFetch(SqlFetchOption option, SqlExpression rowCount, SqlCursor cursor, - params ISqlCursorFetchTarget[] targets) - : base(SqlNodeType.Fetch) - { - this.option = option; - if (targets != null) - for (int i = 0, l = targets.Length; i < l; i++) - this.targets.Add(targets[i]); - this.cursor = cursor; - this.rowCount = rowCount; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlFetch: SqlStatement, + ISqlCompileUnit + { + private readonly SqlCursor cursor; + private readonly SqlFetchOption option = SqlFetchOption.Next; + private readonly SqlExpression rowCount; + private readonly IList targets = new Collection(); + + /// + /// Gets the cursor. + /// + /// The cursor. + public SqlCursor Cursor + { + get { return cursor; } + } + + /// + /// Gets the fetch option. + /// + /// The fetch option. + public SqlFetchOption Option + { + get { return option; } + } + + /// + /// Gets the row count. + /// + /// The row count. + public SqlExpression RowCount + { + get { return rowCount; } + } + + /// + /// Gets the targets. + /// + /// The targets. + public IList Targets + { + get { return targets; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlFetch(SqlFetchOption option, SqlExpression rowCount, SqlCursor cursor, + params ISqlCursorFetchTarget[] targets) + : base(SqlNodeType.Fetch) + { + this.option = option; + if (targets != null) + for (int i = 0, l = targets.Length; i < l; i++) + this.targets.Add(targets[i]); + this.cursor = cursor; + this.rowCount = rowCount; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlIf.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlIf.cs index 9fc806ce21..a448b30744 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlIf.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlIf.cs @@ -1,85 +1,85 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents SQL IF...ELSE statement. - /// - [Serializable] - public class SqlIf: SqlStatement, ISqlCompileUnit - { - private SqlStatement trueStatement; - private SqlStatement falseStatement; - private SqlExpression condition; - - /// - /// Gets or sets the condition. - /// - public SqlExpression Condition { - get { - return condition; - } - set { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - SqlValidator.EnsureIsBooleanExpression(value); - condition = value; - } - } - - /// - /// Gets or sets SQL statement which is carried out if the condition is true. - /// - public SqlStatement True { - get { - return trueStatement; - } - set { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - trueStatement = value; - } - } - - /// - /// Gets or sets SQL statement which is carried out if the condition is false. - /// - public SqlStatement False { - get { - return falseStatement; - } - set { - falseStatement = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlIf clone; - clone = new SqlIf((SqlExpression)condition.Clone(context), - (SqlStatement)trueStatement.Clone(context), - falseStatement==null ? null : (SqlStatement)falseStatement.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - internal SqlIf(SqlExpression condition, SqlStatement trueStatement, SqlStatement falseStatement) - : base(SqlNodeType.Conditional) - { - this.condition = condition; - this.trueStatement = trueStatement; - this.falseStatement = falseStatement; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents SQL IF...ELSE statement. + /// + [Serializable] + public class SqlIf: SqlStatement, ISqlCompileUnit + { + private SqlStatement trueStatement; + private SqlStatement falseStatement; + private SqlExpression condition; + + /// + /// Gets or sets the condition. + /// + public SqlExpression Condition { + get { + return condition; + } + set { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + SqlValidator.EnsureIsBooleanExpression(value); + condition = value; + } + } + + /// + /// Gets or sets SQL statement which is carried out if the condition is true. + /// + public SqlStatement True { + get { + return trueStatement; + } + set { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + trueStatement = value; + } + } + + /// + /// Gets or sets SQL statement which is carried out if the condition is false. + /// + public SqlStatement False { + get { + return falseStatement; + } + set { + falseStatement = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlIf clone; + clone = new SqlIf((SqlExpression)condition.Clone(context), + (SqlStatement)trueStatement.Clone(context), + falseStatement==null ? null : (SqlStatement)falseStatement.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + internal SqlIf(SqlExpression condition, SqlStatement trueStatement, SqlStatement falseStatement) + : base(SqlNodeType.Conditional) + { + this.condition = condition; + this.trueStatement = trueStatement; + this.falseStatement = falseStatement; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlInsert.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlInsert.cs index bccef532ab..f912f1ce21 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlInsert.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlInsert.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlInsert : SqlQueryStatement, ISqlCompileUnit - { - private readonly Dictionary values = new Dictionary(); - - private SqlTableRef into; - private SqlSelect from; - - /// - /// Gets or sets the table. - /// - /// The table to change. - public SqlTableRef Into - { - get { return into; } - set { into = value; } - } - - /// - /// Gets the values. - /// - /// The values. - public Dictionary Values { - get { - return values; - } - } - - /// - /// Gets or sets the FROM clause expression. - /// - public SqlSelect From { - get { - return from; - } - set { - from = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlInsert clone = new SqlInsert(); - if (Into!=null) - clone.Into = (SqlTableRef) Into.Clone(context); - if (from!=null) - clone.From = (SqlSelect) from.Clone(context); - foreach (KeyValuePair p in values) - clone.Values[(SqlTableColumn) p.Key.Clone(context)] = - p.Value.IsNullReference() ? null : (SqlExpression) p.Value.Clone(context); - - if (Hints.Count>0) - foreach (SqlHint hint in Hints) - clone.Hints.Add((SqlHint)hint.Clone(context)); - - context.NodeMapping[this] = clone; - return clone; - } - - // Constructor - - internal SqlInsert(): base(SqlNodeType.Insert) - { - } - - internal SqlInsert(SqlTableRef tableRef) : this() - { - into = tableRef; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlInsert : SqlQueryStatement, ISqlCompileUnit + { + private readonly Dictionary values = new Dictionary(); + + private SqlTableRef into; + private SqlSelect from; + + /// + /// Gets or sets the table. + /// + /// The table to change. + public SqlTableRef Into + { + get { return into; } + set { into = value; } + } + + /// + /// Gets the values. + /// + /// The values. + public Dictionary Values { + get { + return values; + } + } + + /// + /// Gets or sets the FROM clause expression. + /// + public SqlSelect From { + get { + return from; + } + set { + from = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlInsert clone = new SqlInsert(); + if (Into!=null) + clone.Into = (SqlTableRef) Into.Clone(context); + if (from!=null) + clone.From = (SqlSelect) from.Clone(context); + foreach (KeyValuePair p in values) + clone.Values[(SqlTableColumn) p.Key.Clone(context)] = + p.Value.IsNullReference() ? null : (SqlExpression) p.Value.Clone(context); + + if (Hints.Count>0) + foreach (SqlHint hint in Hints) + clone.Hints.Add((SqlHint)hint.Clone(context)); + + context.NodeMapping[this] = clone; + return clone; + } + + // Constructor + + internal SqlInsert(): base(SqlNodeType.Insert) + { + } + + internal SqlInsert(SqlTableRef tableRef) : this() + { + into = tableRef; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlOpenCursor.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlOpenCursor.cs index 93c6b9ddd4..4c12ac8ec9 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlOpenCursor.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlOpenCursor.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlOpenCursor : SqlStatement, ISqlCompileUnit - { - private SqlCursor cursor; - - /// - /// Gets the cursor. - /// - /// The cursor. - public SqlCursor Cursor { - get { - return cursor; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - throw new NotImplementedException(); - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - public SqlOpenCursor(SqlCursor cursor) : base(SqlNodeType.OpenCursor) - { - this.cursor = cursor; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlOpenCursor : SqlStatement, ISqlCompileUnit + { + private SqlCursor cursor; + + /// + /// Gets the cursor. + /// + /// The cursor. + public SqlCursor Cursor { + get { + return cursor; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + throw new NotImplementedException(); + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + public SqlOpenCursor(SqlCursor cursor) : base(SqlNodeType.OpenCursor) + { + this.cursor = cursor; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryExpression.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryExpression.cs index 49b771706f..3d3d2fc6db 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryExpression.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryExpression.cs @@ -1,120 +1,120 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlQueryExpression - : SqlStatement, - ISqlQueryExpression - { - private readonly ISqlQueryExpression left; - private readonly ISqlQueryExpression right; - private readonly bool all; - - public ISqlQueryExpression Left - { - get { return left; } - } - - public ISqlQueryExpression Right - { - get { return right; } - } - - public bool All - { - get { return all; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlQueryExpression clone = new SqlQueryExpression(NodeType, - (ISqlQueryExpression)((SqlNode) left).Clone(context), - (ISqlQueryExpression)((SqlNode) right).Clone(context), all); - context.NodeMapping[this] = clone; - return clone; - } - - #region IEnumerable Members - - public IEnumerator GetEnumerator() - { - foreach (ISqlQueryExpression expression in left) - yield return expression; - - foreach (ISqlQueryExpression expression in right) - yield return expression; - - yield break; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable)this).GetEnumerator(); - } - - #endregion - - #region ISqlCompileUnit Members - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - #endregion - - #region ISqlQueryExpression Members - - public SqlQueryExpression Except(ISqlQueryExpression operand) - { - return SqlDml.Except(this, operand); - } - - public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) - { - return SqlDml.ExceptAll(this, operand); - } - - public SqlQueryExpression Intersect(ISqlQueryExpression operand) - { - return SqlDml.Intersect(this, operand); - } - - public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) - { - return SqlDml.IntersectAll(this, operand); - } - - public SqlQueryExpression Union(ISqlQueryExpression operand) - { - return SqlDml.Union(this, operand); - } - - public SqlQueryExpression UnionAll(ISqlQueryExpression operand) - { - return SqlDml.UnionAll(this, operand); - } - - #endregion - - // Constructor - - internal SqlQueryExpression(SqlNodeType nodeType, ISqlQueryExpression left, ISqlQueryExpression right, bool all) - : base(nodeType) - { - this.left = left; - this.right = right; - this.all = all; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlQueryExpression + : SqlStatement, + ISqlQueryExpression + { + private readonly ISqlQueryExpression left; + private readonly ISqlQueryExpression right; + private readonly bool all; + + public ISqlQueryExpression Left + { + get { return left; } + } + + public ISqlQueryExpression Right + { + get { return right; } + } + + public bool All + { + get { return all; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlQueryExpression clone = new SqlQueryExpression(NodeType, + (ISqlQueryExpression)((SqlNode) left).Clone(context), + (ISqlQueryExpression)((SqlNode) right).Clone(context), all); + context.NodeMapping[this] = clone; + return clone; + } + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + foreach (ISqlQueryExpression expression in left) + yield return expression; + + foreach (ISqlQueryExpression expression in right) + yield return expression; + + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)this).GetEnumerator(); + } + + #endregion + + #region ISqlCompileUnit Members + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + #endregion + + #region ISqlQueryExpression Members + + public SqlQueryExpression Except(ISqlQueryExpression operand) + { + return SqlDml.Except(this, operand); + } + + public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) + { + return SqlDml.ExceptAll(this, operand); + } + + public SqlQueryExpression Intersect(ISqlQueryExpression operand) + { + return SqlDml.Intersect(this, operand); + } + + public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) + { + return SqlDml.IntersectAll(this, operand); + } + + public SqlQueryExpression Union(ISqlQueryExpression operand) + { + return SqlDml.Union(this, operand); + } + + public SqlQueryExpression UnionAll(ISqlQueryExpression operand) + { + return SqlDml.UnionAll(this, operand); + } + + #endregion + + // Constructor + + internal SqlQueryExpression(SqlNodeType nodeType, ISqlQueryExpression left, ISqlQueryExpression right, bool all) + : base(nodeType) + { + this.left = left; + this.right = right; + this.all = all; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryStatement.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryStatement.cs index 9b3d068bca..fdd9d43df5 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryStatement.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlQueryStatement.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Xtensive.Sql.Dml -{ - /// - /// Base class for DML statements. - /// - [Serializable] - public abstract class SqlQueryStatement : SqlStatement - { - private IList hints; - - /// - /// Gets the collection of join hints. - /// - /// The collection of join hints. - public IList Hints - { - get { - if (hints==null) - hints = new Collection(); - return hints; - } - } - - - // Constructors - - protected SqlQueryStatement(SqlNodeType nodeType) : base(nodeType) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Xtensive.Sql.Dml +{ + /// + /// Base class for DML statements. + /// + [Serializable] + public abstract class SqlQueryStatement : SqlStatement + { + private IList hints; + + /// + /// Gets the collection of join hints. + /// + /// The collection of join hints. + public IList Hints + { + get { + if (hints==null) + hints = new Collection(); + return hints; + } + } + + + // Constructors + + protected SqlQueryStatement(SqlNodeType nodeType) : base(nodeType) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs index 0e2aa80c61..daefac97c6 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs @@ -1,312 +1,312 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents SQL SELECT statement. - /// - [Serializable] - public class SqlSelect - : SqlQueryStatement, - ISqlQueryExpression - { - private readonly SqlUserColumn asterisk = SqlDml.Column(SqlDml.Asterisk); - private readonly SqlColumnCollection columns = new SqlColumnCollection(); - private SqlLockType _lock; - private bool distinct; - private SqlTable from; - private SqlColumnCollection groupBy = new SqlColumnCollection(); - private SqlExpression having; - private SqlOrderCollection orderBy; - private SqlExpression where; - private SqlExpression limit; - private SqlExpression offset; - - /// - /// Gets the collection of columns to select. - /// - /// The collection of columns. - public SqlColumnCollection Columns - { - get { return columns; } - } - - /// - /// An indexer that provides access to collection items by their names. - /// Returns if there is no such item. - /// - public SqlColumn this[string name] - { - get { return columns[name]; } - } - - /// - /// An indexer that provides access to collection items by their index. - /// Returns if there is no such item. - /// - public SqlColumn this[int index] - { - get { return columns[index]; } - } - - /// - /// Gets or sets from clause. - /// - /// The from clause. - public SqlTable From - { - get { return from; } - set { from = value; } - } - - /// - /// Gets or sets the where clause. - /// - /// The where clause. - public SqlExpression Where - { - get { return where; } - set - { - if (!value.IsNullReference()) - SqlValidator.EnsureIsBooleanExpression(value); - where = value; - } - } - - /// - /// Gets the collection of columns to group by. - /// - /// The collection of columns. - public SqlColumnCollection GroupBy - { - get - { - if (groupBy == null) - groupBy = new SqlColumnCollection(); - return groupBy; - } - } - - /// - /// Gets or sets the having clause. - /// - /// The having clause. - public SqlExpression Having - { - get { return having; } - set - { - if (!value.IsNullReference()) - SqlValidator.EnsureIsBooleanExpression(value); - having = value; - } - } - - /// - /// Gets the order by clause. - /// - /// The order by clause. - public SqlOrderCollection OrderBy - { - get - { - if (orderBy == null) - orderBy = new SqlOrderCollection(); - return orderBy; - } - } - - /// - /// Gets or sets a value indicating whether this is distinct. - /// - /// if distinct is set; otherwise, . - public bool Distinct - { - get { return distinct; } - set { distinct = value; } - } - - public SqlUserColumn Asterisk - { - get { return asterisk; } - } - - public SqlLockType Lock - { - get { return _lock; } - set { _lock = value; } - } - - /// - /// Gets or sets the limit. - /// - public SqlExpression Limit - { - get { return limit; } - set { - if (!value.IsNullReference()) - SqlValidator.EnsureIsLimitOffsetArgument(value); - limit = value; - } - } - - /// - /// Gets or sets the offset. - /// - public SqlExpression Offset - { - get { return offset; } - set { - if (!value.IsNullReference()) - SqlValidator.EnsureIsLimitOffsetArgument(value); - offset = value; - } - } - - /// - /// Gets value indicating if is specified. - /// - public bool HasLimit - { - get { return !Limit.IsNullReference(); } - } - - /// - /// Gets value indicating if is specified. - /// - public bool HasOffset - { - get { return !Offset.IsNullReference(); } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlSelect clone = new SqlSelect(from==null ? null : (SqlTable) from.Clone(context)); - - foreach (SqlColumn c in columns) - clone.Columns.Add((SqlColumn)c.Clone(context)); - if (groupBy != null) - foreach (SqlColumn c in groupBy) - clone.GroupBy.Add((SqlColumn)c.Clone(context)); - if (!where.IsNullReference()) - clone.Where = (SqlExpression)where.Clone(context); - if (!having.IsNullReference()) - clone.Having = (SqlExpression)having.Clone(context); - if (orderBy != null) - foreach (SqlOrder so in orderBy) - clone.OrderBy.Add((SqlOrder)so.Clone(context)); - clone.Distinct = distinct; - clone.Limit = Limit; - clone.Offset = Offset; - clone.Lock = Lock; - - if (Hints.Count > 0) - foreach (SqlHint hint in Hints) - clone.Hints.Add((SqlHint)hint.Clone(context)); - - context.NodeMapping[this] = clone; - - return clone; - } - - /// - /// Makes a shallow clone of the instance. - /// - public SqlSelect ShallowClone() - { - var result = ReferenceEquals(From, null) - ? SqlDml.Select() - : SqlDml.Select(From); - result.Columns.AddRange(Columns); - result.Distinct = Distinct; - result.GroupBy.AddRange(GroupBy); - result.Having = Having; - result.Offset = Offset; - result.Limit = Limit; - foreach (var order in OrderBy) - result.OrderBy.Add(order); - foreach (var hint in Hints) - result.Hints.Add(hint); - result.Where = Where; - result.Lock = Lock; - return result; - } - - #region ISqlCompileUnit Members - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - #endregion - - #region ISqlQueryExpression Members - - public SqlQueryExpression Except(ISqlQueryExpression operand) - { - return SqlDml.Except(this, operand); - } - - public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) - { - return SqlDml.ExceptAll(this, operand); - } - - public SqlQueryExpression Intersect(ISqlQueryExpression operand) - { - return SqlDml.Intersect(this, operand); - } - - public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) - { - return SqlDml.IntersectAll(this, operand); - } - - public SqlQueryExpression Union(ISqlQueryExpression operand) - { - return SqlDml.Union(this, operand); - } - - public SqlQueryExpression UnionAll(ISqlQueryExpression operand) - { - return SqlDml.UnionAll(this, operand); - } - - public IEnumerator GetEnumerator() - { - yield return this; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable) this).GetEnumerator(); - } - - #endregion - - - // Constructors - - internal SqlSelect(SqlTable from) - : this() - { - this.from = from; - } - - internal SqlSelect() - : base(SqlNodeType.Select) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents SQL SELECT statement. + /// + [Serializable] + public class SqlSelect + : SqlQueryStatement, + ISqlQueryExpression + { + private readonly SqlUserColumn asterisk = SqlDml.Column(SqlDml.Asterisk); + private readonly SqlColumnCollection columns = new SqlColumnCollection(); + private SqlLockType _lock; + private bool distinct; + private SqlTable from; + private SqlColumnCollection groupBy = new SqlColumnCollection(); + private SqlExpression having; + private SqlOrderCollection orderBy; + private SqlExpression where; + private SqlExpression limit; + private SqlExpression offset; + + /// + /// Gets the collection of columns to select. + /// + /// The collection of columns. + public SqlColumnCollection Columns + { + get { return columns; } + } + + /// + /// An indexer that provides access to collection items by their names. + /// Returns if there is no such item. + /// + public SqlColumn this[string name] + { + get { return columns[name]; } + } + + /// + /// An indexer that provides access to collection items by their index. + /// Returns if there is no such item. + /// + public SqlColumn this[int index] + { + get { return columns[index]; } + } + + /// + /// Gets or sets from clause. + /// + /// The from clause. + public SqlTable From + { + get { return from; } + set { from = value; } + } + + /// + /// Gets or sets the where clause. + /// + /// The where clause. + public SqlExpression Where + { + get { return where; } + set + { + if (!value.IsNullReference()) + SqlValidator.EnsureIsBooleanExpression(value); + where = value; + } + } + + /// + /// Gets the collection of columns to group by. + /// + /// The collection of columns. + public SqlColumnCollection GroupBy + { + get + { + if (groupBy == null) + groupBy = new SqlColumnCollection(); + return groupBy; + } + } + + /// + /// Gets or sets the having clause. + /// + /// The having clause. + public SqlExpression Having + { + get { return having; } + set + { + if (!value.IsNullReference()) + SqlValidator.EnsureIsBooleanExpression(value); + having = value; + } + } + + /// + /// Gets the order by clause. + /// + /// The order by clause. + public SqlOrderCollection OrderBy + { + get + { + if (orderBy == null) + orderBy = new SqlOrderCollection(); + return orderBy; + } + } + + /// + /// Gets or sets a value indicating whether this is distinct. + /// + /// if distinct is set; otherwise, . + public bool Distinct + { + get { return distinct; } + set { distinct = value; } + } + + public SqlUserColumn Asterisk + { + get { return asterisk; } + } + + public SqlLockType Lock + { + get { return _lock; } + set { _lock = value; } + } + + /// + /// Gets or sets the limit. + /// + public SqlExpression Limit + { + get { return limit; } + set { + if (!value.IsNullReference()) + SqlValidator.EnsureIsLimitOffsetArgument(value); + limit = value; + } + } + + /// + /// Gets or sets the offset. + /// + public SqlExpression Offset + { + get { return offset; } + set { + if (!value.IsNullReference()) + SqlValidator.EnsureIsLimitOffsetArgument(value); + offset = value; + } + } + + /// + /// Gets value indicating if is specified. + /// + public bool HasLimit + { + get { return !Limit.IsNullReference(); } + } + + /// + /// Gets value indicating if is specified. + /// + public bool HasOffset + { + get { return !Offset.IsNullReference(); } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlSelect clone = new SqlSelect(from==null ? null : (SqlTable) from.Clone(context)); + + foreach (SqlColumn c in columns) + clone.Columns.Add((SqlColumn)c.Clone(context)); + if (groupBy != null) + foreach (SqlColumn c in groupBy) + clone.GroupBy.Add((SqlColumn)c.Clone(context)); + if (!where.IsNullReference()) + clone.Where = (SqlExpression)where.Clone(context); + if (!having.IsNullReference()) + clone.Having = (SqlExpression)having.Clone(context); + if (orderBy != null) + foreach (SqlOrder so in orderBy) + clone.OrderBy.Add((SqlOrder)so.Clone(context)); + clone.Distinct = distinct; + clone.Limit = Limit; + clone.Offset = Offset; + clone.Lock = Lock; + + if (Hints.Count > 0) + foreach (SqlHint hint in Hints) + clone.Hints.Add((SqlHint)hint.Clone(context)); + + context.NodeMapping[this] = clone; + + return clone; + } + + /// + /// Makes a shallow clone of the instance. + /// + public SqlSelect ShallowClone() + { + var result = ReferenceEquals(From, null) + ? SqlDml.Select() + : SqlDml.Select(From); + result.Columns.AddRange(Columns); + result.Distinct = Distinct; + result.GroupBy.AddRange(GroupBy); + result.Having = Having; + result.Offset = Offset; + result.Limit = Limit; + foreach (var order in OrderBy) + result.OrderBy.Add(order); + foreach (var hint in Hints) + result.Hints.Add(hint); + result.Where = Where; + result.Lock = Lock; + return result; + } + + #region ISqlCompileUnit Members + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + #endregion + + #region ISqlQueryExpression Members + + public SqlQueryExpression Except(ISqlQueryExpression operand) + { + return SqlDml.Except(this, operand); + } + + public SqlQueryExpression ExceptAll(ISqlQueryExpression operand) + { + return SqlDml.ExceptAll(this, operand); + } + + public SqlQueryExpression Intersect(ISqlQueryExpression operand) + { + return SqlDml.Intersect(this, operand); + } + + public SqlQueryExpression IntersectAll(ISqlQueryExpression operand) + { + return SqlDml.IntersectAll(this, operand); + } + + public SqlQueryExpression Union(ISqlQueryExpression operand) + { + return SqlDml.Union(this, operand); + } + + public SqlQueryExpression UnionAll(ISqlQueryExpression operand) + { + return SqlDml.UnionAll(this, operand); + } + + public IEnumerator GetEnumerator() + { + yield return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable) this).GetEnumerator(); + } + + #endregion + + + // Constructors + + internal SqlSelect(SqlTable from) + : this() + { + this.from = from; + } + + internal SqlSelect() + : base(SqlNodeType.Select) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlStatementBlock.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlStatementBlock.cs index 742883515d..8f8f549975 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlStatementBlock.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlStatementBlock.cs @@ -1,123 +1,123 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlStatementBlock : SqlStatement, - IList - { - private IList statements = new Collection(); - - #region IList Members - - /// - public void Add(SqlStatement item) - { - statements.Add(item); - } - - /// - public void Clear() - { - statements.Clear(); - } - - /// - public bool Contains(SqlStatement item) - { - return statements.Contains(item); - } - - /// - public void CopyTo(SqlStatement[] array, int arrayIndex) - { - statements.CopyTo(array, arrayIndex); - } - - /// - public bool Remove(SqlStatement item) - { - return statements.Remove(item); - } - - /// - public int Count - { - get { return statements.Count; } - } - - /// - public bool IsReadOnly - { - get { return false; } - } - - /// - public int IndexOf(SqlStatement item) - { - return statements.IndexOf(item); - } - - /// - public void Insert(int index, SqlStatement item) - { - statements.Insert(index, item); - } - - /// - public void RemoveAt(int index) - { - statements.RemoveAt(index); - } - - /// - public SqlStatement this[int index] - { - get { return statements[index]; } - set { statements[index] = value; } - } - - /// - IEnumerator IEnumerable.GetEnumerator() - { - return statements.GetEnumerator(); - } - - /// - public IEnumerator GetEnumerator() - { - return statements.GetEnumerator(); - } - - #endregion - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlStatementBlock clone = new SqlStatementBlock(); - foreach (SqlStatement s in statements) - clone.Add((SqlStatement) s.Clone(context)); - context.NodeMapping[this] = clone; - return clone; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - - internal SqlStatementBlock() - : base(SqlNodeType.BeginEndBlock) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlStatementBlock : SqlStatement, + IList + { + private IList statements = new Collection(); + + #region IList Members + + /// + public void Add(SqlStatement item) + { + statements.Add(item); + } + + /// + public void Clear() + { + statements.Clear(); + } + + /// + public bool Contains(SqlStatement item) + { + return statements.Contains(item); + } + + /// + public void CopyTo(SqlStatement[] array, int arrayIndex) + { + statements.CopyTo(array, arrayIndex); + } + + /// + public bool Remove(SqlStatement item) + { + return statements.Remove(item); + } + + /// + public int Count + { + get { return statements.Count; } + } + + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + public int IndexOf(SqlStatement item) + { + return statements.IndexOf(item); + } + + /// + public void Insert(int index, SqlStatement item) + { + statements.Insert(index, item); + } + + /// + public void RemoveAt(int index) + { + statements.RemoveAt(index); + } + + /// + public SqlStatement this[int index] + { + get { return statements[index]; } + set { statements[index] = value; } + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return statements.GetEnumerator(); + } + + /// + public IEnumerator GetEnumerator() + { + return statements.GetEnumerator(); + } + + #endregion + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlStatementBlock clone = new SqlStatementBlock(); + foreach (SqlStatement s in statements) + clone.Add((SqlStatement) s.Clone(context)); + context.NodeMapping[this] = clone; + return clone; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + + internal SqlStatementBlock() + : base(SqlNodeType.BeginEndBlock) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs index 19dea65b45..7508b002e3 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs @@ -1,111 +1,111 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; - -namespace Xtensive.Sql.Dml -{ - [Serializable] - public class SqlUpdate : SqlQueryStatement, ISqlCompileUnit - { - private SqlExpression where; - private readonly Dictionary values = new Dictionary(); - private SqlTable from; - private SqlTableRef update; - private SqlExpression limit; - - /// - /// Gets or sets the table. - /// - /// The table to change. - public SqlTableRef Update - { - get { return update; } - set { update = value; } - } - - /// - /// Gets the values. - /// - /// The values. - public Dictionary Values { - get { - return values; - } - } - - /// - /// Gets or sets the WHERE clause expression. - /// - /// The WHERE clause expression. - public SqlExpression Where { - get { return where; } - set { - if (!value.IsNullReference() && value.GetType()!=typeof(SqlCursor)) - SqlValidator.EnsureIsBooleanExpression(value); - where = value; - } - } - - /// - /// Gets or sets the FROM clause expression. - /// - public SqlTable From - { - get { return from;} - set { from = value; } - } - - /// - /// Gets or sets the LIMIT clause expression. - /// - public SqlExpression Limit - { - get { return limit; } - set { limit = value; } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - var clone = new SqlUpdate(); - if (update!=null) - clone.Update = (SqlTableRef)Update.Clone(context); - if (from!=null) - clone.From = (SqlQueryRef)from.Clone(context); - foreach (KeyValuePair p in values) - clone.Values[(ISqlLValue) ((SqlExpression) p.Key).Clone(context)] = - p.Value.IsNullReference() ? null : (SqlExpression) p.Value.Clone(context); - if (!where.IsNullReference()) - clone.Where = (SqlExpression)where.Clone(context); - if (!limit.IsNullReference()) - clone.Limit = (SqlExpression)where.Clone(context); - if (Hints.Count>0) - foreach (SqlHint hint in Hints) - clone.Hints.Add((SqlHint)hint.Clone(context)); - - context.NodeMapping[this] = clone; - return clone; - } - - // Constructor - - internal SqlUpdate(): base(SqlNodeType.Update) - { - } - - internal SqlUpdate(SqlTableRef table) : this() - { - update = table; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Dml +{ + [Serializable] + public class SqlUpdate : SqlQueryStatement, ISqlCompileUnit + { + private SqlExpression where; + private readonly Dictionary values = new Dictionary(); + private SqlTable from; + private SqlTableRef update; + private SqlExpression limit; + + /// + /// Gets or sets the table. + /// + /// The table to change. + public SqlTableRef Update + { + get { return update; } + set { update = value; } + } + + /// + /// Gets the values. + /// + /// The values. + public Dictionary Values { + get { + return values; + } + } + + /// + /// Gets or sets the WHERE clause expression. + /// + /// The WHERE clause expression. + public SqlExpression Where { + get { return where; } + set { + if (!value.IsNullReference() && value.GetType()!=typeof(SqlCursor)) + SqlValidator.EnsureIsBooleanExpression(value); + where = value; + } + } + + /// + /// Gets or sets the FROM clause expression. + /// + public SqlTable From + { + get { return from;} + set { from = value; } + } + + /// + /// Gets or sets the LIMIT clause expression. + /// + public SqlExpression Limit + { + get { return limit; } + set { limit = value; } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + var clone = new SqlUpdate(); + if (update!=null) + clone.Update = (SqlTableRef)Update.Clone(context); + if (from!=null) + clone.From = (SqlQueryRef)from.Clone(context); + foreach (KeyValuePair p in values) + clone.Values[(ISqlLValue) ((SqlExpression) p.Key).Clone(context)] = + p.Value.IsNullReference() ? null : (SqlExpression) p.Value.Clone(context); + if (!where.IsNullReference()) + clone.Where = (SqlExpression)where.Clone(context); + if (!limit.IsNullReference()) + clone.Limit = (SqlExpression)where.Clone(context); + if (Hints.Count>0) + foreach (SqlHint hint in Hints) + clone.Hints.Add((SqlHint)hint.Clone(context)); + + context.NodeMapping[this] = clone; + return clone; + } + + // Constructor + + internal SqlUpdate(): base(SqlNodeType.Update) + { + } + + internal SqlUpdate(SqlTableRef table) : this() + { + update = table; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlWhile.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlWhile.cs index 319bb80382..a7e9f98128 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlWhile.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlWhile.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Dml -{ - /// - /// Represents SQL while loop. - /// - [Serializable] - public class SqlWhile : SqlStatement - { - private SqlStatement statement; - private SqlExpression condition; - - /// - /// Gets or sets the statement to execute. - /// - public SqlStatement Statement { - get { - return statement; - } - set { - statement = value; - } - } - - /// - /// Gets or sets the condition for the repeated execution - /// of an SQL statement or statement block. - /// - public SqlExpression Condition { - get { - return condition; - } - set { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - SqlValidator.EnsureIsBooleanExpression(value); - condition = value; - } - } - - internal override object Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.ContainsKey(this)) - return context.NodeMapping[this]; - - SqlWhile clone = new SqlWhile((SqlExpression)condition.Clone(context)); - if (statement!=null) - clone.Statement = (SqlStatement) statement.Clone(context); - context.NodeMapping[this] = clone; - - return clone; - } - - internal SqlWhile(SqlExpression condition) : base(SqlNodeType.While) - { - this.condition = condition; - } - - public override void AcceptVisitor(ISqlVisitor visitor) - { - visitor.Visit(this); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Dml +{ + /// + /// Represents SQL while loop. + /// + [Serializable] + public class SqlWhile : SqlStatement + { + private SqlStatement statement; + private SqlExpression condition; + + /// + /// Gets or sets the statement to execute. + /// + public SqlStatement Statement { + get { + return statement; + } + set { + statement = value; + } + } + + /// + /// Gets or sets the condition for the repeated execution + /// of an SQL statement or statement block. + /// + public SqlExpression Condition { + get { + return condition; + } + set { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + SqlValidator.EnsureIsBooleanExpression(value); + condition = value; + } + } + + internal override object Clone(SqlNodeCloneContext context) + { + if (context.NodeMapping.ContainsKey(this)) + return context.NodeMapping[this]; + + SqlWhile clone = new SqlWhile((SqlExpression)condition.Clone(context)); + if (statement!=null) + clone.Statement = (SqlStatement) statement.Clone(context); + context.NodeMapping[this] = clone; + + return clone; + } + + internal SqlWhile(SqlExpression condition) : base(SqlNodeType.While) + { + this.condition = condition; + } + + public override void AcceptVisitor(ISqlVisitor visitor) + { + visitor.Visit(this); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/ColumnFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/ColumnFeatures.cs index a12ede5326..c92ec959b9 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ColumnFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ColumnFeatures.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines possible column categories. - /// This enumeration has a attribute - /// that allows a bitwise combination of its member values. - /// - /// - /// It is well known that RDBMS servers stores data at table columns. - /// Most of columns requires that their values have been specified by user - /// but there are some exceptions of that rule (e.g. - /// or columns). - /// If you working on your own RDBMS driver - /// implementation you have to provide correct information - /// about RDBMS capabilities. As a consequence you have to specify what - /// column categories are supported (see example below). - /// - /// - /// - [Flags] - public enum ColumnFeatures - { - /// - /// RDBMS server does not support any special columns. - /// - None = 0x0, - - /// - /// RDBMS server supports identity columns. - /// - Identity = 0x1, - - /// - /// RDBMS server supports computed columns. - /// - Computed = 0x2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines possible column categories. + /// This enumeration has a attribute + /// that allows a bitwise combination of its member values. + /// + /// + /// It is well known that RDBMS servers stores data at table columns. + /// Most of columns requires that their values have been specified by user + /// but there are some exceptions of that rule (e.g. + /// or columns). + /// If you working on your own RDBMS driver + /// implementation you have to provide correct information + /// about RDBMS capabilities. As a consequence you have to specify what + /// column categories are supported (see example below). + /// + /// + /// + [Flags] + public enum ColumnFeatures + { + /// + /// RDBMS server does not support any special columns. + /// + None = 0x0, + + /// + /// RDBMS server supports identity columns. + /// + Identity = 0x1, + + /// + /// RDBMS server supports computed columns. + /// + Computed = 0x2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/ColumnInfo.cs b/Orm/Xtensive.Orm/Sql/Info/ColumnInfo.cs index 24120b8d03..8f518c77aa 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ColumnInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ColumnInfo.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a table column. - /// - public class ColumnInfo : EntityInfo - { - private ColumnFeatures features = ColumnFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public ColumnFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a table column. + /// + public class ColumnInfo : EntityInfo + { + private ColumnFeatures features = ColumnFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public ColumnFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/AssertConstraintInfo.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/AssertConstraintInfo.cs index 14f1e87c30..6459cda69a 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/AssertConstraintInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/AssertConstraintInfo.cs @@ -1,15 +1,15 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -namespace Xtensive.Sql.Info -{ - /// - /// Describes assert constaint capabilities. - /// - public class AssertConstraintInfo : EntityInfo - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +namespace Xtensive.Sql.Info +{ + /// + /// Describes assert constaint capabilities. + /// + public class AssertConstraintInfo : EntityInfo + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintFeatures.cs index 54d74cc91a..858c83e2c6 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintFeatures.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Possible features for . - /// - [Flags] - public enum CheckConstraintFeatures - { - /// - /// Indicates that RDBMS does not support any additional features - /// for its constraints. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports deferrable check constraints. - /// - Deferrable = 0x1, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Possible features for . + /// + [Flags] + public enum CheckConstraintFeatures + { + /// + /// Indicates that RDBMS does not support any additional features + /// for its constraints. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports deferrable check constraints. + /// + Deferrable = 0x1, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintInfo.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintInfo.cs index aedfea74f6..fc2821e5a8 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/CheckConstraintInfo.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a check constraint capabilities. - /// - public class CheckConstraintInfo : EntityInfo - { - private int maxExpressionLength; - private CheckConstraintFeatures features = CheckConstraintFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public CheckConstraintFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - - /// - /// Gets or sets the maximal length of the check expression. - /// - /// The maximal length of the check expression. - public int MaxExpressionLength { - get { return maxExpressionLength; } - set { - this.EnsureNotLocked(); - maxExpressionLength = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a check constraint capabilities. + /// + public class CheckConstraintInfo : EntityInfo + { + private int maxExpressionLength; + private CheckConstraintFeatures features = CheckConstraintFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public CheckConstraintFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + + /// + /// Gets or sets the maximal length of the check expression. + /// + /// The maximal length of the check expression. + public int MaxExpressionLength { + get { return maxExpressionLength; } + set { + this.EnsureNotLocked(); + maxExpressionLength = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintActions.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintActions.cs index d4bb5d47ee..b9c32a9e15 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintActions.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintActions.cs @@ -1,54 +1,54 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines all possible actions applicable in the case - /// of foreign key conflict. - /// - [Flags] - public enum ForeignKeyConstraintActions - { - /// - /// No actions are supported. - /// - None = 0x0, - - /// - /// Indicates that RDBMS is capable to do nothing in the case of some - /// foreign key conflict. - /// - NoAction = 0x1, - - /// - /// Indicates that RDBMS is capable to block execution of any instruction - /// leading to foreign key conflict. - /// - Restrict = 0x2, - - /// - /// Indicates that RDBMS is capable to perform some cascading operation - /// (delete or update) in order to preserve referential integrity if - /// it violated by some executed instruction. - /// - Cascade = 0x4, - - /// - /// Indicates that RDBMS is capable to assign default value to a field - /// referenced by foreign key constraint in order to preserve referential - /// integrity if it violated by some executed instruction. - /// - SetDefault = 0x8, - - /// - /// Indicates that RDBMS is capable to assign NULL to a field - /// referenced by foreign key constraint in order to preserve referential - /// integrity if it violated by some executed instruction. - /// - SetNull = 0x10, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines all possible actions applicable in the case + /// of foreign key conflict. + /// + [Flags] + public enum ForeignKeyConstraintActions + { + /// + /// No actions are supported. + /// + None = 0x0, + + /// + /// Indicates that RDBMS is capable to do nothing in the case of some + /// foreign key conflict. + /// + NoAction = 0x1, + + /// + /// Indicates that RDBMS is capable to block execution of any instruction + /// leading to foreign key conflict. + /// + Restrict = 0x2, + + /// + /// Indicates that RDBMS is capable to perform some cascading operation + /// (delete or update) in order to preserve referential integrity if + /// it violated by some executed instruction. + /// + Cascade = 0x4, + + /// + /// Indicates that RDBMS is capable to assign default value to a field + /// referenced by foreign key constraint in order to preserve referential + /// integrity if it violated by some executed instruction. + /// + SetDefault = 0x8, + + /// + /// Indicates that RDBMS is capable to assign NULL to a field + /// referenced by foreign key constraint in order to preserve referential + /// integrity if it violated by some executed instruction. + /// + SetNull = 0x10, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintFeatures.cs index 8698a25c3a..4ca5442c9b 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintFeatures.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using System; -using System.Diagnostics; - -namespace Xtensive.Sql.Info -{ - /// - /// Possible features for . - /// - [Flags] - public enum ForeignKeyConstraintFeatures - { - /// - /// Indicates that RDBMS does not support any additional features - /// for its constraints. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports deferrable foreign key constraints. - /// - Deferrable = 0x1, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using System; +using System.Diagnostics; + +namespace Xtensive.Sql.Info +{ + /// + /// Possible features for . + /// + [Flags] + public enum ForeignKeyConstraintFeatures + { + /// + /// Indicates that RDBMS does not support any additional features + /// for its constraints. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports deferrable foreign key constraints. + /// + Deferrable = 0x1, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintInfo.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintInfo.cs index 70adeef364..a8f6fa5737 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/ForeignKeyConstraintInfo.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a reference constraint capabilities. - /// - public class ForeignKeyConstraintInfo : EntityInfo - { - private ForeignKeyConstraintFeatures features = ForeignKeyConstraintFeatures.None; - private ForeignKeyConstraintActions actions = ForeignKeyConstraintActions.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public ForeignKeyConstraintFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - - /// - /// Gets or sets the constraint rules. - /// - /// The rules. - public ForeignKeyConstraintActions Actions { - get { return actions; } - set { - this.EnsureNotLocked(); - actions = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a reference constraint capabilities. + /// + public class ForeignKeyConstraintInfo : EntityInfo + { + private ForeignKeyConstraintFeatures features = ForeignKeyConstraintFeatures.None; + private ForeignKeyConstraintActions actions = ForeignKeyConstraintActions.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public ForeignKeyConstraintFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + + /// + /// Gets or sets the constraint rules. + /// + /// The rules. + public ForeignKeyConstraintActions Actions { + get { return actions; } + set { + this.EnsureNotLocked(); + actions = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintFeatures.cs index 4ad77e30b2..d5b16591d5 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintFeatures.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Possible features for . - /// - [Flags] - public enum PrimaryKeyConstraintFeatures - { - /// - /// Indicates that RDBMS does not support any additional features - /// for its constraints. - /// - None = 0x0, - - /// - /// Indicates that primary key constraints can be declared clustered. - /// - Clustered = 0x1, - - /// - /// Indicates that primary key constraints can be applied to nullable columns. - /// - Nullable = 0x2, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Possible features for . + /// + [Flags] + public enum PrimaryKeyConstraintFeatures + { + /// + /// Indicates that RDBMS does not support any additional features + /// for its constraints. + /// + None = 0x0, + + /// + /// Indicates that primary key constraints can be declared clustered. + /// + Clustered = 0x1, + + /// + /// Indicates that primary key constraints can be applied to nullable columns. + /// + Nullable = 0x2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintInfo.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintInfo.cs index bdcbb7594f..82b9d7525b 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/PrimaryKeyConstraintInfo.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a primary key constraint capabilities. - /// - public class PrimaryKeyConstraintInfo : EntityInfo - { - private PrimaryKeyConstraintFeatures features = PrimaryKeyConstraintFeatures.None; - - private string constantName; - - /// - /// Gets or sets the constant name of the primary key constraint. - /// - /// This is done for mysql support only. Its' primary keys have always 'PRIMARY' name. - /// The constant name of the primary key constraint. - public string ConstantName - { - get { return constantName; } - set { - this.EnsureNotLocked(); - constantName = value; - } - } - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public PrimaryKeyConstraintFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a primary key constraint capabilities. + /// + public class PrimaryKeyConstraintInfo : EntityInfo + { + private PrimaryKeyConstraintFeatures features = PrimaryKeyConstraintFeatures.None; + + private string constantName; + + /// + /// Gets or sets the constant name of the primary key constraint. + /// + /// This is done for mysql support only. Its' primary keys have always 'PRIMARY' name. + /// The constant name of the primary key constraint. + public string ConstantName + { + get { return constantName; } + set { + this.EnsureNotLocked(); + constantName = value; + } + } + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public PrimaryKeyConstraintFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintFeatures.cs index e8a669aa2e..f33c25986a 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintFeatures.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Possible features for - /// - [Flags] - public enum UniqueConstraintFeatures - { - /// - /// Indicates that RDBMS does not support any additional features - /// for its constraints. - /// - None = 0x0, - - /// - /// Indicates that unique key constraints can be declared clustered. - /// - Clustered = 0x1, - - /// - /// Indicates that unique key constraints can be applied to nullable columns. - /// - Nullable = 0x2, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Possible features for + /// + [Flags] + public enum UniqueConstraintFeatures + { + /// + /// Indicates that RDBMS does not support any additional features + /// for its constraints. + /// + None = 0x0, + + /// + /// Indicates that unique key constraints can be declared clustered. + /// + Clustered = 0x1, + + /// + /// Indicates that unique key constraints can be applied to nullable columns. + /// + Nullable = 0x2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintInfo.cs b/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintInfo.cs index 897c0a5e8d..76041a8836 100644 --- a/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/Constaints/UniqueConstraintInfo.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.20 - -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a unique constaint capabilities - /// - public class UniqueConstraintInfo : EntityInfo - { - private UniqueConstraintFeatures features = UniqueConstraintFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public UniqueConstraintFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.20 + +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a unique constaint capabilities + /// + public class UniqueConstraintInfo : EntityInfo + { + private UniqueConstraintFeatures features = UniqueConstraintFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public UniqueConstraintFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/CoreServerInfo.cs b/Orm/Xtensive.Orm/Sql/Info/CoreServerInfo.cs index 97dc46df0d..7ad3354aa7 100644 --- a/Orm/Xtensive.Orm/Sql/Info/CoreServerInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/CoreServerInfo.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.25 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// A information required for creating a driver. - /// - public class CoreServerInfo : LockableBase - { - private Version serverVersion; - private string connectionString; - private string databaseName; - private string defaultSchemaName; - private bool multipleActiveResultSets; - - /// - /// Gets or sets the server version. - /// - public Version ServerVersion { - get { - return serverVersion; - } - set { - this.EnsureNotLocked(); - serverVersion = value; - } - } - - /// - /// Gets or sets the connection string. - /// - public string ConnectionString { - get { - return connectionString; - } - set { - this.EnsureNotLocked(); - connectionString = value; - } - } - - /// - /// Gets or sets the name of the database. - /// - public string DatabaseName { - get { - return databaseName; - } - set { - this.EnsureNotLocked(); - databaseName = value; - } - } - - /// - /// Gets or sets the default name of the schema. - /// - public string DefaultSchemaName { - get { - return defaultSchemaName; - } - set { - this.EnsureNotLocked(); - defaultSchemaName = value; - } - } - - /// - /// Gets or sets a value indicating whether multiple active result sets are supported. - /// - public bool MultipleActiveResultSets { - get { - return multipleActiveResultSets; - } - set { - this.EnsureNotLocked(); - multipleActiveResultSets = value; - } - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.25 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// A information required for creating a driver. + /// + public class CoreServerInfo : LockableBase + { + private Version serverVersion; + private string connectionString; + private string databaseName; + private string defaultSchemaName; + private bool multipleActiveResultSets; + + /// + /// Gets or sets the server version. + /// + public Version ServerVersion { + get { + return serverVersion; + } + set { + this.EnsureNotLocked(); + serverVersion = value; + } + } + + /// + /// Gets or sets the connection string. + /// + public string ConnectionString { + get { + return connectionString; + } + set { + this.EnsureNotLocked(); + connectionString = value; + } + } + + /// + /// Gets or sets the name of the database. + /// + public string DatabaseName { + get { + return databaseName; + } + set { + this.EnsureNotLocked(); + databaseName = value; + } + } + + /// + /// Gets or sets the default name of the schema. + /// + public string DefaultSchemaName { + get { + return defaultSchemaName; + } + set { + this.EnsureNotLocked(); + defaultSchemaName = value; + } + } + + /// + /// Gets or sets a value indicating whether multiple active result sets are supported. + /// + public bool MultipleActiveResultSets { + get { + return multipleActiveResultSets; + } + set { + this.EnsureNotLocked(); + multipleActiveResultSets = value; + } + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/DataTypeCollection.cs b/Orm/Xtensive.Orm/Sql/Info/DataTypeCollection.cs index 1a8801f1f4..6209cb8d52 100644 --- a/Orm/Xtensive.Orm/Sql/Info/DataTypeCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Info/DataTypeCollection.cs @@ -1,260 +1,260 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Represents a collection of objects that describes all data types existing in database. - /// - public class DataTypeCollection : LockableBase, IEnumerable - { - private readonly Dictionary nativeTypes = - new Dictionary(32, StringComparer.OrdinalIgnoreCase); - - private readonly Dictionary sqlTypes = - new Dictionary(32); - - - /// - /// Gets the by the specified native type name. - /// - /// The instance. - public DataTypeInfo this[string nativeType] - { - get - { - DataTypeInfo result; - nativeTypes.TryGetValue(nativeType, out result); - return result; - } - } - - /// - /// Gets the by the specified . - /// - /// The instance. - public DataTypeInfo this[SqlType sqlType] - { - get - { - DataTypeInfo result; - sqlTypes.TryGetValue(sqlType, out result); - return result; - } - } - - /// - /// Adds the specified type SqlType and the corresponding him to dataTypeInfo to the list of supported types in a specific version of the DBMS. - /// - /// The sqlType to add. - /// The dataTypeInfo to add. - public void Add(SqlType sqlType, DataTypeInfo dataTypeInfo) - { - this.EnsureNotLocked(); - if (!IsLocked) - sqlTypes.Add(sqlType, dataTypeInfo); - } - - /// - /// Boolean (bit). - /// - public DataTypeInfo Boolean { get; set; } - - /// - /// Signed Byte (8 bit integer). - /// - public DataTypeInfo Int8 { get; set; } - - /// - /// Unsigned byte. - /// - public DataTypeInfo UInt8 { get; set; } - - /// - /// Small integer (16 bit integer). - /// - public DataTypeInfo Int16 { get; set; } - - /// - /// Unsigned small integer (word). - /// - public DataTypeInfo UInt16 { get; set; } - - /// - /// Integer (32 bit integer). - /// - public DataTypeInfo Int32 { get; set; } - - /// - /// Unsigned integer. - /// - public DataTypeInfo UInt32 { get; set; } - - /// - /// Long integer (64 bit integer). - /// - public DataTypeInfo Int64 { get; set; } - - /// - /// Unsigned long integer. - /// - public DataTypeInfo UInt64 { get; set; } - - /// - /// Numeric data type with fixed precision and scale. - /// - public DataTypeInfo Decimal { get; set; } - - /// - /// Floating point number data from 3.40E + 38 through 3.40E + 38. - /// Storage size is 4 bytes. - /// - public DataTypeInfo Float { get; set; } - - /// - /// Floating point number data from - 1.79E + 308 through 1.79E + 308. - /// Storage size is 8 bytes. - /// - public DataTypeInfo Double { get; set; } - - /// - /// Date and time data from January 1, 1753 through December 31, 9999, - /// to an accuracy of one three-hundredth of a second (equivalent to 3.33 - /// milliseconds or 0.00333 seconds). Values are rounded to increments - /// of .000, .003, or .007 seconds. - /// Storage size is 8 bytes. - /// - public DataTypeInfo DateTime { get; set; } - - /// - /// Date and time data from January 1,1 A.D. through December 31, 9999 A.D., - /// to an accuracy of 100 nanoseconds. - /// Storage size is 8 to 10 bytes. - /// - public DataTypeInfo DateTimeOffset { get; set; } - - /// - /// A representation of the interval data type. - /// - public DataTypeInfo Interval { get; set; } - - /// - /// Fixed-length Unicode character data of n characters. - /// n must be a value from 1 through 4,000. Storage size is two times n bytes. - /// The SQL-92 synonyms for nchar are national char and national character. - /// - public DataTypeInfo Char { get; set; } - - /// - /// Variable-length Unicode character data of n characters. - /// n must be a value from 1 through 4,000. Storage size, in bytes, is two times - /// the number of characters entered. The data entered can be 0 characters in length. - /// The SQL-92 synonyms for nvarchar are national char varying and national character varying. - /// - public DataTypeInfo VarChar { get; set; } - - /// - /// Variable-length Unicode data with a maximum length of 230 - 1 (1,073,741,823) - /// characters. Storage size, in bytes, is two times the number of characters entered. - /// - public DataTypeInfo VarCharMax { get; set; } - - /// - /// Fixed-length binary data of n bytes. n must be a value from 1 through 8,000. - /// Storage size is n+4 bytes. - /// - public DataTypeInfo Binary { get; set; } - - /// - /// Variable-length binary data of n bytes. n must be a value from 1 through 8,000. - /// Storage size is the actual length of the data entered + 4 bytes, not n bytes. - /// The data entered can be 0 bytes in length. - /// The SQL-92 synonym for varbinary is binary varying. - /// - public DataTypeInfo VarBinary { get; set; } - - /// - /// Variable-length binary data from 0 through 231-1 (2,147,483,647) bytes. - /// - public DataTypeInfo VarBinaryMax { get; set; } - - /// - /// A globally unique identifier (GUID). - /// - public DataTypeInfo Guid { get; set; } - - /// - public override void Lock(bool recursive) - { - base.Lock(recursive); - - foreach (DataTypeInfo item in this) { - if (item==null) - continue; - sqlTypes[item.Type] = item; - foreach (var type in item.NativeTypes) - nativeTypes.Add(type, item); - } - } - - #region IEnumerable Members - - /// - ///Returns an enumerator that iterates through the collection. - /// - /// - /// - ///A that can be used to iterate through the collection. - /// - IEnumerator IEnumerable.GetEnumerator() - { - yield return Boolean; - yield return Int8; - yield return UInt8; - yield return Int16; - yield return UInt16; - yield return Int32; - yield return UInt32; - yield return Int64; - yield return UInt64; - yield return Decimal; - yield return Float; - yield return Double; - yield return DateTime; - yield return DateTimeOffset; - yield return Char; - yield return VarChar; - yield return VarCharMax; - yield return Binary; - yield return VarBinary; - yield return VarBinaryMax; - yield return Guid; - yield return Interval; - yield break; - } - - #endregion - - #region IEnumerable Members - - /// - ///Returns an enumerator that iterates through a collection. - /// - /// - /// - ///An object that can be used to iterate through the collection. - /// - public IEnumerator GetEnumerator() - { - return ((IEnumerable) this).GetEnumerator(); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Represents a collection of objects that describes all data types existing in database. + /// + public class DataTypeCollection : LockableBase, IEnumerable + { + private readonly Dictionary nativeTypes = + new Dictionary(32, StringComparer.OrdinalIgnoreCase); + + private readonly Dictionary sqlTypes = + new Dictionary(32); + + + /// + /// Gets the by the specified native type name. + /// + /// The instance. + public DataTypeInfo this[string nativeType] + { + get + { + DataTypeInfo result; + nativeTypes.TryGetValue(nativeType, out result); + return result; + } + } + + /// + /// Gets the by the specified . + /// + /// The instance. + public DataTypeInfo this[SqlType sqlType] + { + get + { + DataTypeInfo result; + sqlTypes.TryGetValue(sqlType, out result); + return result; + } + } + + /// + /// Adds the specified type SqlType and the corresponding him to dataTypeInfo to the list of supported types in a specific version of the DBMS. + /// + /// The sqlType to add. + /// The dataTypeInfo to add. + public void Add(SqlType sqlType, DataTypeInfo dataTypeInfo) + { + this.EnsureNotLocked(); + if (!IsLocked) + sqlTypes.Add(sqlType, dataTypeInfo); + } + + /// + /// Boolean (bit). + /// + public DataTypeInfo Boolean { get; set; } + + /// + /// Signed Byte (8 bit integer). + /// + public DataTypeInfo Int8 { get; set; } + + /// + /// Unsigned byte. + /// + public DataTypeInfo UInt8 { get; set; } + + /// + /// Small integer (16 bit integer). + /// + public DataTypeInfo Int16 { get; set; } + + /// + /// Unsigned small integer (word). + /// + public DataTypeInfo UInt16 { get; set; } + + /// + /// Integer (32 bit integer). + /// + public DataTypeInfo Int32 { get; set; } + + /// + /// Unsigned integer. + /// + public DataTypeInfo UInt32 { get; set; } + + /// + /// Long integer (64 bit integer). + /// + public DataTypeInfo Int64 { get; set; } + + /// + /// Unsigned long integer. + /// + public DataTypeInfo UInt64 { get; set; } + + /// + /// Numeric data type with fixed precision and scale. + /// + public DataTypeInfo Decimal { get; set; } + + /// + /// Floating point number data from 3.40E + 38 through 3.40E + 38. + /// Storage size is 4 bytes. + /// + public DataTypeInfo Float { get; set; } + + /// + /// Floating point number data from - 1.79E + 308 through 1.79E + 308. + /// Storage size is 8 bytes. + /// + public DataTypeInfo Double { get; set; } + + /// + /// Date and time data from January 1, 1753 through December 31, 9999, + /// to an accuracy of one three-hundredth of a second (equivalent to 3.33 + /// milliseconds or 0.00333 seconds). Values are rounded to increments + /// of .000, .003, or .007 seconds. + /// Storage size is 8 bytes. + /// + public DataTypeInfo DateTime { get; set; } + + /// + /// Date and time data from January 1,1 A.D. through December 31, 9999 A.D., + /// to an accuracy of 100 nanoseconds. + /// Storage size is 8 to 10 bytes. + /// + public DataTypeInfo DateTimeOffset { get; set; } + + /// + /// A representation of the interval data type. + /// + public DataTypeInfo Interval { get; set; } + + /// + /// Fixed-length Unicode character data of n characters. + /// n must be a value from 1 through 4,000. Storage size is two times n bytes. + /// The SQL-92 synonyms for nchar are national char and national character. + /// + public DataTypeInfo Char { get; set; } + + /// + /// Variable-length Unicode character data of n characters. + /// n must be a value from 1 through 4,000. Storage size, in bytes, is two times + /// the number of characters entered. The data entered can be 0 characters in length. + /// The SQL-92 synonyms for nvarchar are national char varying and national character varying. + /// + public DataTypeInfo VarChar { get; set; } + + /// + /// Variable-length Unicode data with a maximum length of 230 - 1 (1,073,741,823) + /// characters. Storage size, in bytes, is two times the number of characters entered. + /// + public DataTypeInfo VarCharMax { get; set; } + + /// + /// Fixed-length binary data of n bytes. n must be a value from 1 through 8,000. + /// Storage size is n+4 bytes. + /// + public DataTypeInfo Binary { get; set; } + + /// + /// Variable-length binary data of n bytes. n must be a value from 1 through 8,000. + /// Storage size is the actual length of the data entered + 4 bytes, not n bytes. + /// The data entered can be 0 bytes in length. + /// The SQL-92 synonym for varbinary is binary varying. + /// + public DataTypeInfo VarBinary { get; set; } + + /// + /// Variable-length binary data from 0 through 231-1 (2,147,483,647) bytes. + /// + public DataTypeInfo VarBinaryMax { get; set; } + + /// + /// A globally unique identifier (GUID). + /// + public DataTypeInfo Guid { get; set; } + + /// + public override void Lock(bool recursive) + { + base.Lock(recursive); + + foreach (DataTypeInfo item in this) { + if (item==null) + continue; + sqlTypes[item.Type] = item; + foreach (var type in item.NativeTypes) + nativeTypes.Add(type, item); + } + } + + #region IEnumerable Members + + /// + ///Returns an enumerator that iterates through the collection. + /// + /// + /// + ///A that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + yield return Boolean; + yield return Int8; + yield return UInt8; + yield return Int16; + yield return UInt16; + yield return Int32; + yield return UInt32; + yield return Int64; + yield return UInt64; + yield return Decimal; + yield return Float; + yield return Double; + yield return DateTime; + yield return DateTimeOffset; + yield return Char; + yield return VarChar; + yield return VarCharMax; + yield return Binary; + yield return VarBinary; + yield return VarBinaryMax; + yield return Guid; + yield return Interval; + yield break; + } + + #endregion + + #region IEnumerable Members + + /// + ///Returns an enumerator that iterates through a collection. + /// + /// + /// + ///An object that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + return ((IEnumerable) this).GetEnumerator(); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/DataTypeFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/DataTypeFeatures.cs index 79dce691ba..252440a479 100644 --- a/Orm/Xtensive.Orm/Sql/Info/DataTypeFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/DataTypeFeatures.cs @@ -1,98 +1,98 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of features those are allows to describe - /// RDBMS capabilities concerning a certain data type. - /// - [Flags] - public enum DataTypeFeatures - { - /// - /// Indicates that RDBMS supports nothing additional - /// for the mentioned data type. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports fill factor property - /// for the mentioned data type. - /// - FillFactor = 0x1, - - /// - /// Indicates that RDBMS allows key constraints - /// for the mentioned data type. - /// - KeyConstraint = 0x2, - - /// - /// Indicates that RDBMS allows multiple columns - /// of the mentioned data type in a single table. - /// - Multiple = 0x4, - - /// - /// Indicates that RDBMS allows null values - /// for the mentioned data type. - /// - Nullable = 0x8, - - /// - /// Indicates that RDBMS allows to declare identity - /// column of the mentioned data type. - /// - Identity = 0x10, - - /// - /// Indicates that RDBMS allows to specify default value - /// for a column of the mentioned data type. - /// - Default = 0x20, - - /// - /// Indicates that RDBMS supports grouping operations - /// by columns of the mentioned data type. - /// - Grouping = 0x40, - - /// - /// Indicates that RDBMS supports ordering operations - /// by columns of the mentioned data type. - /// - Ordering = 0x80, - - /// - /// Indicates that RDBMS allows to build clustered index - /// which includes key columns of the mentioned data type. - /// - Clustering = 0x100, - - /// - /// Indicates that RDBMS allows to build index - /// which includes key columns of the mentioned data type. - /// - Indexing = 0x200, - - /// - /// Indicates that RDBMS allows to include column of the - /// mentioned data type as non-key part of some index. - /// - NonKeyIndexing = 0x400, - - /// - /// Indicates that RDBMS treats zero length value as NULL. - /// - ZeroLengthValueIsNull = 0x800, - - /// - /// Indicates that RDBMS allows to build spatial index. - /// - Spatial = 0x1000, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of features those are allows to describe + /// RDBMS capabilities concerning a certain data type. + /// + [Flags] + public enum DataTypeFeatures + { + /// + /// Indicates that RDBMS supports nothing additional + /// for the mentioned data type. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports fill factor property + /// for the mentioned data type. + /// + FillFactor = 0x1, + + /// + /// Indicates that RDBMS allows key constraints + /// for the mentioned data type. + /// + KeyConstraint = 0x2, + + /// + /// Indicates that RDBMS allows multiple columns + /// of the mentioned data type in a single table. + /// + Multiple = 0x4, + + /// + /// Indicates that RDBMS allows null values + /// for the mentioned data type. + /// + Nullable = 0x8, + + /// + /// Indicates that RDBMS allows to declare identity + /// column of the mentioned data type. + /// + Identity = 0x10, + + /// + /// Indicates that RDBMS allows to specify default value + /// for a column of the mentioned data type. + /// + Default = 0x20, + + /// + /// Indicates that RDBMS supports grouping operations + /// by columns of the mentioned data type. + /// + Grouping = 0x40, + + /// + /// Indicates that RDBMS supports ordering operations + /// by columns of the mentioned data type. + /// + Ordering = 0x80, + + /// + /// Indicates that RDBMS allows to build clustered index + /// which includes key columns of the mentioned data type. + /// + Clustering = 0x100, + + /// + /// Indicates that RDBMS allows to build index + /// which includes key columns of the mentioned data type. + /// + Indexing = 0x200, + + /// + /// Indicates that RDBMS allows to include column of the + /// mentioned data type as non-key part of some index. + /// + NonKeyIndexing = 0x400, + + /// + /// Indicates that RDBMS treats zero length value as NULL. + /// + ZeroLengthValueIsNull = 0x800, + + /// + /// Indicates that RDBMS allows to build spatial index. + /// + Spatial = 0x1000, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/DataTypeInfo.cs b/Orm/Xtensive.Orm/Sql/Info/DataTypeInfo.cs index b41e629436..bd2f3147a7 100644 --- a/Orm/Xtensive.Orm/Sql/Info/DataTypeInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/DataTypeInfo.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a data type. - /// - public sealed class DataTypeInfo - { - public static DataTypeInfo Empty = new DataTypeInfo - { - Type = SqlType.Unknown, - Features = DataTypeFeatures.None, - NativeTypes = ArrayUtils.EmptyArray - }; - - /// - /// Gets the SQL type - /// - public SqlType Type { get; private set; } - - /// - /// Gets the features of this instance. - /// - public DataTypeFeatures Features { get; set; } - - /// - /// Gets the native database type names. - /// - public IEnumerable NativeTypes { get; private set; } - - /// - /// Gets the maximum length of this data type. - /// - public int? MaxLength { get; private set; } - - /// - /// Gets the maximum precision of this data type. - /// - public int? MaxPrecision { get; private set; } - - /// - /// Gets the range. - /// - public ValueRange ValueRange { get; private set; } - - /// - /// Creates a fractional . - /// - public static DataTypeInfo Fractional( - SqlType sqlType, - DataTypeFeatures features, - ValueRange valueRange, - int maxPrecision, - params string[] nativeTypes) - { - ArgumentValidator.EnsureArgumentNotNull(valueRange, "valueRange"); - ArgumentValidator.EnsureArgumentIsGreaterThan(maxPrecision, 0, "maxPrecision"); - return new DataTypeInfo - { - Type = sqlType, - Features = features, - ValueRange = valueRange, - MaxPrecision = maxPrecision, - NativeTypes = nativeTypes.ToArraySafely(), - }; - } - - /// - /// Ranges a range . - /// - public static DataTypeInfo Range( - SqlType sqlType, - DataTypeFeatures features, - ValueRange valueRange, - params string[] nativeTypes) - { - ArgumentValidator.EnsureArgumentNotNull(valueRange, "valueRange"); - return new DataTypeInfo - { - Type = sqlType, - Features = features, - ValueRange = valueRange, - NativeTypes = nativeTypes.ToArraySafely(), - }; - } - - /// - /// Creates a stream . - /// - public static DataTypeInfo Stream( - SqlType sqlType, - DataTypeFeatures features, - int maxLength, - params string[] nativeTypes) - { - ArgumentValidator.EnsureArgumentIsGreaterThan(maxLength, 0, "maxLength"); - return new DataTypeInfo - { - Type = sqlType, - Features = features, - MaxLength = maxLength, - NativeTypes = nativeTypes.ToArraySafely(), - }; - } - - /// - /// Creates a regular - /// - public static DataTypeInfo Regular( - SqlType sqlType, - DataTypeFeatures features, - params string[] nativeTypes) - { - return new DataTypeInfo - { - Type = sqlType, - Features = features, - NativeTypes = nativeTypes.ToArraySafely(), - }; - } - - // Constructors - - private DataTypeInfo() - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a data type. + /// + public sealed class DataTypeInfo + { + public static DataTypeInfo Empty = new DataTypeInfo + { + Type = SqlType.Unknown, + Features = DataTypeFeatures.None, + NativeTypes = ArrayUtils.EmptyArray + }; + + /// + /// Gets the SQL type + /// + public SqlType Type { get; private set; } + + /// + /// Gets the features of this instance. + /// + public DataTypeFeatures Features { get; set; } + + /// + /// Gets the native database type names. + /// + public IEnumerable NativeTypes { get; private set; } + + /// + /// Gets the maximum length of this data type. + /// + public int? MaxLength { get; private set; } + + /// + /// Gets the maximum precision of this data type. + /// + public int? MaxPrecision { get; private set; } + + /// + /// Gets the range. + /// + public ValueRange ValueRange { get; private set; } + + /// + /// Creates a fractional . + /// + public static DataTypeInfo Fractional( + SqlType sqlType, + DataTypeFeatures features, + ValueRange valueRange, + int maxPrecision, + params string[] nativeTypes) + { + ArgumentValidator.EnsureArgumentNotNull(valueRange, "valueRange"); + ArgumentValidator.EnsureArgumentIsGreaterThan(maxPrecision, 0, "maxPrecision"); + return new DataTypeInfo + { + Type = sqlType, + Features = features, + ValueRange = valueRange, + MaxPrecision = maxPrecision, + NativeTypes = nativeTypes.ToArraySafely(), + }; + } + + /// + /// Ranges a range . + /// + public static DataTypeInfo Range( + SqlType sqlType, + DataTypeFeatures features, + ValueRange valueRange, + params string[] nativeTypes) + { + ArgumentValidator.EnsureArgumentNotNull(valueRange, "valueRange"); + return new DataTypeInfo + { + Type = sqlType, + Features = features, + ValueRange = valueRange, + NativeTypes = nativeTypes.ToArraySafely(), + }; + } + + /// + /// Creates a stream . + /// + public static DataTypeInfo Stream( + SqlType sqlType, + DataTypeFeatures features, + int maxLength, + params string[] nativeTypes) + { + ArgumentValidator.EnsureArgumentIsGreaterThan(maxLength, 0, "maxLength"); + return new DataTypeInfo + { + Type = sqlType, + Features = features, + MaxLength = maxLength, + NativeTypes = nativeTypes.ToArraySafely(), + }; + } + + /// + /// Creates a regular + /// + public static DataTypeInfo Regular( + SqlType sqlType, + DataTypeFeatures features, + params string[] nativeTypes) + { + return new DataTypeInfo + { + Type = sqlType, + Features = features, + NativeTypes = nativeTypes.ToArraySafely(), + }; + } + + // Constructors + + private DataTypeInfo() + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/DdlStatements.cs b/Orm/Xtensive.Orm/Sql/Info/DdlStatements.cs index 63152c567d..87cf3ff92a 100644 --- a/Orm/Xtensive.Orm/Sql/Info/DdlStatements.cs +++ b/Orm/Xtensive.Orm/Sql/Info/DdlStatements.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Enumerates possible Data Definition Language(DDL) statements - /// in accordance with SQL92 standard. - /// - [Flags] - public enum DdlStatements - { - /// - /// Indicates that RDBMS does not support any DDL statement - /// for the mentioned database entity. - /// - /// 0x0 - None = 0x0, - - /// - /// Indicates that RDBMS supports statement - /// for the mentioned database entity. - /// For constraints this indicates that RDBMS supports ADD statement. - /// - /// 0x1 - Create = 0x1, - - /// - /// Indicates that RDBMS supports statement - /// for the mentioned database entity. - /// - /// 0x2 - Alter = 0x2, - - /// - /// Indicates that RDBMS supports statement - /// for the mentioned database entity. - /// - /// 0x4 - Drop = 0x4, - - /// - /// Indicates that RDBMS supports statement - /// for the mentioned database entity. - /// - /// 0x4 - Rename = 0x8, - - /// - /// Indicates that RDBMS supports all DDL statements - /// for the mentioned database entity. - /// - /// 0x7 - All = Create | Alter | Drop | Rename - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Enumerates possible Data Definition Language(DDL) statements + /// in accordance with SQL92 standard. + /// + [Flags] + public enum DdlStatements + { + /// + /// Indicates that RDBMS does not support any DDL statement + /// for the mentioned database entity. + /// + /// 0x0 + None = 0x0, + + /// + /// Indicates that RDBMS supports statement + /// for the mentioned database entity. + /// For constraints this indicates that RDBMS supports ADD statement. + /// + /// 0x1 + Create = 0x1, + + /// + /// Indicates that RDBMS supports statement + /// for the mentioned database entity. + /// + /// 0x2 + Alter = 0x2, + + /// + /// Indicates that RDBMS supports statement + /// for the mentioned database entity. + /// + /// 0x4 + Drop = 0x4, + + /// + /// Indicates that RDBMS supports statement + /// for the mentioned database entity. + /// + /// 0x4 + Rename = 0x8, + + /// + /// Indicates that RDBMS supports all DDL statements + /// for the mentioned database entity. + /// + /// 0x7 + All = Create | Alter | Drop | Rename + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/DefaultSchemaInfo.cs b/Orm/Xtensive.Orm/Sql/Info/DefaultSchemaInfo.cs index af1611d162..9604d61bc6 100644 --- a/Orm/Xtensive.Orm/Sql/Info/DefaultSchemaInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/DefaultSchemaInfo.cs @@ -1,35 +1,35 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2014.05.17 - -namespace Xtensive.Sql.Info -{ - /// - /// Default schema information for a particular connection. - /// - public sealed class DefaultSchemaInfo - { - /// - /// Gets default database. - /// - public string Database { get; private set; } - - /// - /// Gets default schema. - /// - public string Schema { get; private set; } - - /// - /// Initializes new instance of this type. - /// - /// Value for . - /// Value for . - public DefaultSchemaInfo(string database, string schema) - { - Database = database; - Schema = schema; - } - } +// Copyright (C) 2014 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2014.05.17 + +namespace Xtensive.Sql.Info +{ + /// + /// Default schema information for a particular connection. + /// + public sealed class DefaultSchemaInfo + { + /// + /// Gets default database. + /// + public string Database { get; private set; } + + /// + /// Gets default schema. + /// + public string Schema { get; private set; } + + /// + /// Initializes new instance of this type. + /// + /// Value for . + /// Value for . + public DefaultSchemaInfo(string database, string schema) + { + Database = database; + Schema = schema; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/EntityInfo.cs b/Orm/Xtensive.Orm/Sql/Info/EntityInfo.cs index 96762cff31..3b7afd2e19 100644 --- a/Orm/Xtensive.Orm/Sql/Info/EntityInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/EntityInfo.cs @@ -1,45 +1,45 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a common database entity. - /// - public class EntityInfo : LockableBase - { - private int maxIdentifierLength; - private DdlStatements allowedDdlStatements; - - /// - /// Gets or sets maximal identifier length. - /// - public int MaxIdentifierLength - { - get { return maxIdentifierLength; } - set - { - this.EnsureNotLocked(); - maxIdentifierLength = value; - } - } - - /// - /// Gets or sets allowed DDL statements for this instance. - /// - /// Allowed DDL statements. - public DdlStatements AllowedDdlStatements - { - get { return allowedDdlStatements; } - set - { - this.EnsureNotLocked(); - allowedDdlStatements = value; - } - } - - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a common database entity. + /// + public class EntityInfo : LockableBase + { + private int maxIdentifierLength; + private DdlStatements allowedDdlStatements; + + /// + /// Gets or sets maximal identifier length. + /// + public int MaxIdentifierLength + { + get { return maxIdentifierLength; } + set + { + this.EnsureNotLocked(); + maxIdentifierLength = value; + } + } + + /// + /// Gets or sets allowed DDL statements for this instance. + /// + /// Allowed DDL statements. + public DdlStatements AllowedDdlStatements + { + get { return allowedDdlStatements; } + set + { + this.EnsureNotLocked(); + allowedDdlStatements = value; + } + } + + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/FeaturesExtensions.cs b/Orm/Xtensive.Orm/Sql/Info/FeaturesExtensions.cs index 74fddfbec1..04dd1c8fa9 100644 --- a/Orm/Xtensive.Orm/Sql/Info/FeaturesExtensions.cs +++ b/Orm/Xtensive.Orm/Sql/Info/FeaturesExtensions.cs @@ -1,104 +1,104 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.15 - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Various extension methods related to this namespace. - /// - public static class FeaturesExtensions - { - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this QueryFeatures available, QueryFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this IndexFeatures available, IndexFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this DataTypeFeatures available, DataTypeFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this ForeignKeyConstraintFeatures available, ForeignKeyConstraintFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this ColumnFeatures available, ColumnFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this ServerFeatures available, ServerFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this IdentityFeatures available, IdentityFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this UniqueConstraintFeatures available, UniqueConstraintFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this PrimaryKeyConstraintFeatures available, PrimaryKeyConstraintFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this TemporaryTableFeatures available, TemporaryTableFeatures required) - { - return (available & required)==required; - } - - /// - /// Determines whether the specified active features is supported. - /// - public static bool Supports(this DdlStatements available, DdlStatements required) - { - return (available & required)==required; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.15 + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Various extension methods related to this namespace. + /// + public static class FeaturesExtensions + { + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this QueryFeatures available, QueryFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this IndexFeatures available, IndexFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this DataTypeFeatures available, DataTypeFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this ForeignKeyConstraintFeatures available, ForeignKeyConstraintFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this ColumnFeatures available, ColumnFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this ServerFeatures available, ServerFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this IdentityFeatures available, IdentityFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this UniqueConstraintFeatures available, UniqueConstraintFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this PrimaryKeyConstraintFeatures available, PrimaryKeyConstraintFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this TemporaryTableFeatures available, TemporaryTableFeatures required) + { + return (available & required)==required; + } + + /// + /// Determines whether the specified active features is supported. + /// + public static bool Supports(this DdlStatements available, DdlStatements required) + { + return (available & required)==required; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/FullTextSearchFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/FullTextSearchFeatures.cs index c426e67d41..f629f348bb 100644 --- a/Orm/Xtensive.Orm/Sql/Info/FullTextSearchFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/FullTextSearchFeatures.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.12 - -namespace Xtensive.Sql.Info -{ - /// - /// Defines full-text options. - /// - public enum FullTextSearchFeatures - { - /// - /// Indicates that RDBMS doesn't support full-text at all. - /// - None = 0x0, - - /// - /// Indicates that RDBMS uses table with 'KEY' and 'RANK' columns. - /// - SingleKeyRankTable = 0x1, - - /// - /// Indicates that RDBMS supports column functions to calculate full-text rank. - /// - Full = 0x2, - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.12 + +namespace Xtensive.Sql.Info +{ + /// + /// Defines full-text options. + /// + public enum FullTextSearchFeatures + { + /// + /// Indicates that RDBMS doesn't support full-text at all. + /// + None = 0x0, + + /// + /// Indicates that RDBMS uses table with 'KEY' and 'RANK' columns. + /// + SingleKeyRankTable = 0x1, + + /// + /// Indicates that RDBMS supports column functions to calculate full-text rank. + /// + Full = 0x2, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/FullTextSearchInfo.cs b/Orm/Xtensive.Orm/Sql/Info/FullTextSearchInfo.cs index dc55e08dba..c7dca694ed 100644 --- a/Orm/Xtensive.Orm/Sql/Info/FullTextSearchInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/FullTextSearchInfo.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a full-text capabilities of a database server. - /// - public class FullTextSearchInfo : EntityInfo - { - private FullTextSearchFeatures features = FullTextSearchFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public FullTextSearchFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a full-text capabilities of a database server. + /// + public class FullTextSearchInfo : EntityInfo + { + private FullTextSearchFeatures features = FullTextSearchFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public FullTextSearchFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/IdentityFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/IdentityFeatures.cs index 350ab4a084..0876e94ff3 100644 --- a/Orm/Xtensive.Orm/Sql/Info/IdentityFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/IdentityFeatures.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of typical features of identity columns. - /// You can combine this features to describe certain RDBMS capabilities. - /// - [Flags] - public enum IdentityFeatures - { - /// - /// Indicates that RDBMS does not support any feature in the list. - /// - None = 0x0, - - /// - /// Indicates that RDBMS allows to specify seed value - /// for identity columns. - /// - Seed = 0x1, - - /// - /// Indicates that RDBMS allows to specify increment value - /// for identity columns. - /// - Increment = 0x2, - - /// - /// Indicates that RDBMS supports automatically incrementing - /// identity columns. - /// - AutoIncrement = 0x4, - - /// - /// Indicates that RDBMS stores state of automatically increment - /// in memory and restore it according data in identity column. - /// - // - // -------------------------------------------------------------------------------------- - // WARNING!!!!!! - // THIS OPTION CAN BROKE CONCURENT ACCESS FROM FEW DOMAINS TO GENERATOR TABLE. - // DO NOT USE THIS OPTION WITH ANY RDBMS EXCEPT MYSQL. - //--------------------------------------------------------------------------------------- - // This option fix dropping settings of auto-increment for generator table in MySQL. - // It makes DO store last generated value in generator table. - AutoIncrementSettingsInMemory = 0x8, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of typical features of identity columns. + /// You can combine this features to describe certain RDBMS capabilities. + /// + [Flags] + public enum IdentityFeatures + { + /// + /// Indicates that RDBMS does not support any feature in the list. + /// + None = 0x0, + + /// + /// Indicates that RDBMS allows to specify seed value + /// for identity columns. + /// + Seed = 0x1, + + /// + /// Indicates that RDBMS allows to specify increment value + /// for identity columns. + /// + Increment = 0x2, + + /// + /// Indicates that RDBMS supports automatically incrementing + /// identity columns. + /// + AutoIncrement = 0x4, + + /// + /// Indicates that RDBMS stores state of automatically increment + /// in memory and restore it according data in identity column. + /// + // + // -------------------------------------------------------------------------------------- + // WARNING!!!!!! + // THIS OPTION CAN BROKE CONCURENT ACCESS FROM FEW DOMAINS TO GENERATOR TABLE. + // DO NOT USE THIS OPTION WITH ANY RDBMS EXCEPT MYSQL. + //--------------------------------------------------------------------------------------- + // This option fix dropping settings of auto-increment for generator table in MySQL. + // It makes DO store last generated value in generator table. + AutoIncrementSettingsInMemory = 0x8, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/IdentityInfo.cs b/Orm/Xtensive.Orm/Sql/Info/IdentityInfo.cs index 6d8de1af4d..9efdb78701 100644 --- a/Orm/Xtensive.Orm/Sql/Info/IdentityInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/IdentityInfo.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes an identity source. - /// - public class IdentityInfo : LockableBase - { - private IdentityFeatures features = IdentityFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public IdentityFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes an identity source. + /// + public class IdentityInfo : LockableBase + { + private IdentityFeatures features = IdentityFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public IdentityFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/IndexFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/IndexFeatures.cs index ffd9d5bb68..f955b75f57 100644 --- a/Orm/Xtensive.Orm/Sql/Info/IndexFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/IndexFeatures.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of possible index features. - /// You can combine this features to describe certain RDBMS capabilities. - /// - [Flags] - public enum IndexFeatures - { - /// - /// Indicates that RDBMS does not support any feature in the list. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports clustered indexes. - /// - Clustered = 0x1, - - /// - /// Indicates that RDBMS allows to include some columns as - /// non key part of an index. - /// - NonKeyColumns = 0x2, - - /// - /// Indicates that RDBMS allows to specify fill factor for an index. - /// - FillFactor = 0x4, - - /// - /// Indicates that RDBMS supports unique indexes. - /// - Unique = 0x8, - - /// - /// Indicates that RDBMS allows to specify max degree of parallelism - /// parameter for an index. - /// - MaxDop = 0x10, - - /// - /// Indicates that RDBMS supports full-text indexes. - /// - FullText = 0x20, - - /// - /// Indicates that RDBMS supports specifying sort order (i.e. asc or desc) for each column in index. - /// - SortOrder = 0x40, - - /// - /// Indicates that RDBMS supports filtered/partial indexes. - /// - Filtered = 0x80, - - /// - /// Indicates that RDBMS supports indexes, based on expressions. - /// - Expressions = 0x100 - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of possible index features. + /// You can combine this features to describe certain RDBMS capabilities. + /// + [Flags] + public enum IndexFeatures + { + /// + /// Indicates that RDBMS does not support any feature in the list. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports clustered indexes. + /// + Clustered = 0x1, + + /// + /// Indicates that RDBMS allows to include some columns as + /// non key part of an index. + /// + NonKeyColumns = 0x2, + + /// + /// Indicates that RDBMS allows to specify fill factor for an index. + /// + FillFactor = 0x4, + + /// + /// Indicates that RDBMS supports unique indexes. + /// + Unique = 0x8, + + /// + /// Indicates that RDBMS allows to specify max degree of parallelism + /// parameter for an index. + /// + MaxDop = 0x10, + + /// + /// Indicates that RDBMS supports full-text indexes. + /// + FullText = 0x20, + + /// + /// Indicates that RDBMS supports specifying sort order (i.e. asc or desc) for each column in index. + /// + SortOrder = 0x40, + + /// + /// Indicates that RDBMS supports filtered/partial indexes. + /// + Filtered = 0x80, + + /// + /// Indicates that RDBMS supports indexes, based on expressions. + /// + Expressions = 0x100 + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/IndexInfo.cs b/Orm/Xtensive.Orm/Sql/Info/IndexInfo.cs index 73f1075820..4baf0e1ddb 100644 --- a/Orm/Xtensive.Orm/Sql/Info/IndexInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/IndexInfo.cs @@ -1,65 +1,65 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes an index. - /// - public class IndexInfo : EntityInfo - { - private IndexFeatures features = IndexFeatures.None; - private int maxLength; - private int maxNumberOfColumns; - private PartitionMethods partitionMethods; - - /// - /// Gets or sets the maximal index length in bytes. - /// - public int MaxLength { - get { return maxLength; } - set { - this.EnsureNotLocked(); - maxLength = value; - } - } - - /// - /// Gets or sets the maximum number of columns per index. - /// - public int MaxNumberOfColumns { - get { return maxNumberOfColumns; } - set { - this.EnsureNotLocked(); - maxNumberOfColumns = value; - } - } - - /// - /// Gets or sets supported partition methods. - /// - public PartitionMethods PartitionMethods { - get { return partitionMethods; } - set { - this.EnsureNotLocked(); - partitionMethods = value; - } - } - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public IndexFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes an index. + /// + public class IndexInfo : EntityInfo + { + private IndexFeatures features = IndexFeatures.None; + private int maxLength; + private int maxNumberOfColumns; + private PartitionMethods partitionMethods; + + /// + /// Gets or sets the maximal index length in bytes. + /// + public int MaxLength { + get { return maxLength; } + set { + this.EnsureNotLocked(); + maxLength = value; + } + } + + /// + /// Gets or sets the maximum number of columns per index. + /// + public int MaxNumberOfColumns { + get { return maxNumberOfColumns; } + set { + this.EnsureNotLocked(); + maxNumberOfColumns = value; + } + } + + /// + /// Gets or sets supported partition methods. + /// + public PartitionMethods PartitionMethods { + get { return partitionMethods; } + set { + this.EnsureNotLocked(); + partitionMethods = value; + } + } + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public IndexFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/IsolationLevels.cs b/Orm/Xtensive.Orm/Sql/Info/IsolationLevels.cs index ed57848915..2532baad46 100644 --- a/Orm/Xtensive.Orm/Sql/Info/IsolationLevels.cs +++ b/Orm/Xtensive.Orm/Sql/Info/IsolationLevels.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of possible transaction isolation levels. - /// - [Flags] - public enum IsolationLevels - { - /// - /// Indicates that RDBMS does not support transaction isolation. - /// - None = 0x0, - - /// - /// Indicates that RDBMS allows to execute transactions without isolation. - /// - ReadUncommitted = 0x1, - - /// - /// Indicates that RDBMS allows to execute transactions with the - /// isolation level. - /// - ReadCommitted = 0x2, - - /// - /// Indicates that RDBMS allows to execute transactions with the - /// isolation level. - /// - RepeatableRead = 0x4, - - /// - /// Indicates that RDBMS allows to execute transactions with the - /// isolation level. - /// - Serializable = 0x8, - - /// - /// Indicates that RDBMS allows to execute transactions with - /// isolation level. - /// - Snapshot = 0x10, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of possible transaction isolation levels. + /// + [Flags] + public enum IsolationLevels + { + /// + /// Indicates that RDBMS does not support transaction isolation. + /// + None = 0x0, + + /// + /// Indicates that RDBMS allows to execute transactions without isolation. + /// + ReadUncommitted = 0x1, + + /// + /// Indicates that RDBMS allows to execute transactions with the + /// isolation level. + /// + ReadCommitted = 0x2, + + /// + /// Indicates that RDBMS allows to execute transactions with the + /// isolation level. + /// + RepeatableRead = 0x4, + + /// + /// Indicates that RDBMS allows to execute transactions with the + /// isolation level. + /// + Serializable = 0x8, + + /// + /// Indicates that RDBMS allows to execute transactions with + /// isolation level. + /// + Snapshot = 0x10, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/PartitionMethods.cs b/Orm/Xtensive.Orm/Sql/Info/PartitionMethods.cs index 70b2f27686..a246b6f421 100644 --- a/Orm/Xtensive.Orm/Sql/Info/PartitionMethods.cs +++ b/Orm/Xtensive.Orm/Sql/Info/PartitionMethods.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of possible horisontal partitioning types. - /// - [Flags] - public enum PartitionMethods - { - /// - /// Indicates that RDBMS does not support partitioning. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports list partitioning. - /// List partitioning enables you to explicitly control how rows map to partitions - /// by specifying a list of discrete values in the description for each partition. - /// - List = 0x1, - - /// - /// Indicates that RDBMS supports range partitioning. - /// Range partitioning maps data to partitions - /// based on ranges of partition key values that you establish for each partition. - /// - Range = 0x2, - - /// - /// Indicates that RDBMS supports hash partitioning. - /// Hash partitioning maps data to partitions - /// based on a hashing algorithm that evenly distributes rows among partitions, - /// giving partitions approximately the same size. - /// - Hash = 0x4, - - /// - /// Indicates that RDBMS supports interval partitioning. - /// Interval partitioning is an extension of range partitioning - /// which instructs the database to automatically create partitions - /// of a specified interval when data inserted into the table exceeds all of the range partitions. - /// - Interval = 0x8, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of possible horisontal partitioning types. + /// + [Flags] + public enum PartitionMethods + { + /// + /// Indicates that RDBMS does not support partitioning. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports list partitioning. + /// List partitioning enables you to explicitly control how rows map to partitions + /// by specifying a list of discrete values in the description for each partition. + /// + List = 0x1, + + /// + /// Indicates that RDBMS supports range partitioning. + /// Range partitioning maps data to partitions + /// based on ranges of partition key values that you establish for each partition. + /// + Range = 0x2, + + /// + /// Indicates that RDBMS supports hash partitioning. + /// Hash partitioning maps data to partitions + /// based on a hashing algorithm that evenly distributes rows among partitions, + /// giving partitions approximately the same size. + /// + Hash = 0x4, + + /// + /// Indicates that RDBMS supports interval partitioning. + /// Interval partitioning is an extension of range partitioning + /// which instructs the database to automatically create partitions + /// of a specified interval when data inserted into the table exceeds all of the range partitions. + /// + Interval = 0x8, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/QueryFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/QueryFeatures.cs index 9fe6d0cc72..00c28c9ec0 100644 --- a/Orm/Xtensive.Orm/Sql/Info/QueryFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/QueryFeatures.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of features which affects query generation. - /// - [Flags] - public enum QueryFeatures - { - /// - /// There are no features affecting query generation. - /// - None = 0, - - /// - /// Indicates that it is possible to use named query parameters. - /// - NamedParameters = 1 << 0, - - /// - /// Indicates that parameter prefix should be used for parameter names - /// (in the case when option is active). - /// - ParameterPrefix = 1 << 2, - - /// - /// Indicates that RDBMS requires multi-table joins to have explicit order. - /// (like "(a join b) join c") - /// - ExplicitJoinOrder = 1 << 3, - - /// - /// Indicates that RDBMS supports batch query execution for DDL statements. - /// - DdlBatches = 1 << 4, - - /// - /// Indicates that RDBMS supports batch query execution for DML statements. - /// - DmlBatches = 1 << 5, - - /// - /// Indicates that RDBMS supports query optimizer hints. - /// - Hints = 1 << 6, - - /// - /// Indicates that RDBMS supports CROSS APPLY and OUTER APPLY operators. - /// - CrossApply = 1 << 7, - - /// - /// Indicates that RDBMS allows boolean expressions in equality/inequality comparisons, - /// inside CASE and COALESCE operators. - /// - FullBooleanExpressionSupport = 1 << 8, - - /// - /// Indicates that RDBMS supports UPDATE ... FROM statements. - /// - UpdateFrom = 1 << 9, - - /// - /// Indicates that RDBMS supports DELETE ... FROM statements. - /// - DeleteFrom = 1 << 10, - - /// - /// Indicates that RDBMS supports result limiting operator (LIMIT and TOP). - /// - Limit = 1 << 11, - - /// - /// Indicates that RDBMS supports result skipping operator (OFFSET and SKIP). - /// - Offset = 1 << 12, - - /// - /// Indicates that RDBMS supports multicolumn IN operator. - /// - MulticolumnIn = 1 << 13, - - /// - /// Indicates whether RDBMS supports ROW_NUMBER window function. - /// - RowNumber = 1 << 14, - - /// - /// Indicates whether RDBMS supports subqueries that return a scalar result. - /// - ScalarSubquery = 1 << 15, - - /// - /// Indicates whether RDBMS supports INSERT INTO Table DEFAULT VALUES syntax. - /// - InsertDefaultValues = 1 << 16, - - /// - /// Indicates whether RDBMS supports UPDATE Table SET COLUMN = DEFAULT syntax. - /// - UpdateDefaultValues = 1 << 17, - - /// - /// Indicates whether RDBMS supports accessing multiple schemasin single statement. - /// - MultischemaQueries = 1 << 18, - - /// - /// Indicates whether RDBMS supports accessing multiple databases in single statement. - /// - MultidatabaseQueries = 1 << 19, - - /// - /// Indicates whether RDBMS requires "order by" clause when "limit" or "offset" is used. - /// - PagingRequiresOrderBy = 1 << 20, - - /// - /// Indicates whether RDBMS raises error when "limit 0" clause is provided. - /// - ZeroLimitIsError = 1 << 21, - - /// - /// Indicates whether RDBMS is strict about join syntax. - /// This means recursive syntax "A join B join C on B.b = C.c on A.a = B.b" could not be used. - /// Linear syntax "A join B on A.a = B.b join C on B.b = C.c" should be used instead. - /// - StrictJoinSyntax = 1 << 22, - - /// - /// Indicates whether RDBMS does not support removal of rows, which have reference to itself. - /// - SelfReferencingRowRemovalIsError = 1 << 23, - - /// - /// Indicates that RDBMS supports limiting operator (LIMIT or TOP or ROWS) in UPDATE statement. - /// - UpdateLimit = 1 << 24, - - /// - /// Indicates that RDBMS supports limiting operator (LIMIT or TOP or ROWS) in DELETE statement. - /// - DeleteLimit = 1 << 25, - - /// - /// Indicates that RDBMS supports paging operators ( and ). - /// - Paging = Limit | Offset, - - /// - /// Indicates that RDBMS supports batches for both DDL and DML statements. - /// - Batches = DdlBatches | DmlBatches, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of features which affects query generation. + /// + [Flags] + public enum QueryFeatures + { + /// + /// There are no features affecting query generation. + /// + None = 0, + + /// + /// Indicates that it is possible to use named query parameters. + /// + NamedParameters = 1 << 0, + + /// + /// Indicates that parameter prefix should be used for parameter names + /// (in the case when option is active). + /// + ParameterPrefix = 1 << 2, + + /// + /// Indicates that RDBMS requires multi-table joins to have explicit order. + /// (like "(a join b) join c") + /// + ExplicitJoinOrder = 1 << 3, + + /// + /// Indicates that RDBMS supports batch query execution for DDL statements. + /// + DdlBatches = 1 << 4, + + /// + /// Indicates that RDBMS supports batch query execution for DML statements. + /// + DmlBatches = 1 << 5, + + /// + /// Indicates that RDBMS supports query optimizer hints. + /// + Hints = 1 << 6, + + /// + /// Indicates that RDBMS supports CROSS APPLY and OUTER APPLY operators. + /// + CrossApply = 1 << 7, + + /// + /// Indicates that RDBMS allows boolean expressions in equality/inequality comparisons, + /// inside CASE and COALESCE operators. + /// + FullBooleanExpressionSupport = 1 << 8, + + /// + /// Indicates that RDBMS supports UPDATE ... FROM statements. + /// + UpdateFrom = 1 << 9, + + /// + /// Indicates that RDBMS supports DELETE ... FROM statements. + /// + DeleteFrom = 1 << 10, + + /// + /// Indicates that RDBMS supports result limiting operator (LIMIT and TOP). + /// + Limit = 1 << 11, + + /// + /// Indicates that RDBMS supports result skipping operator (OFFSET and SKIP). + /// + Offset = 1 << 12, + + /// + /// Indicates that RDBMS supports multicolumn IN operator. + /// + MulticolumnIn = 1 << 13, + + /// + /// Indicates whether RDBMS supports ROW_NUMBER window function. + /// + RowNumber = 1 << 14, + + /// + /// Indicates whether RDBMS supports subqueries that return a scalar result. + /// + ScalarSubquery = 1 << 15, + + /// + /// Indicates whether RDBMS supports INSERT INTO Table DEFAULT VALUES syntax. + /// + InsertDefaultValues = 1 << 16, + + /// + /// Indicates whether RDBMS supports UPDATE Table SET COLUMN = DEFAULT syntax. + /// + UpdateDefaultValues = 1 << 17, + + /// + /// Indicates whether RDBMS supports accessing multiple schemasin single statement. + /// + MultischemaQueries = 1 << 18, + + /// + /// Indicates whether RDBMS supports accessing multiple databases in single statement. + /// + MultidatabaseQueries = 1 << 19, + + /// + /// Indicates whether RDBMS requires "order by" clause when "limit" or "offset" is used. + /// + PagingRequiresOrderBy = 1 << 20, + + /// + /// Indicates whether RDBMS raises error when "limit 0" clause is provided. + /// + ZeroLimitIsError = 1 << 21, + + /// + /// Indicates whether RDBMS is strict about join syntax. + /// This means recursive syntax "A join B join C on B.b = C.c on A.a = B.b" could not be used. + /// Linear syntax "A join B on A.a = B.b join C on B.b = C.c" should be used instead. + /// + StrictJoinSyntax = 1 << 22, + + /// + /// Indicates whether RDBMS does not support removal of rows, which have reference to itself. + /// + SelfReferencingRowRemovalIsError = 1 << 23, + + /// + /// Indicates that RDBMS supports limiting operator (LIMIT or TOP or ROWS) in UPDATE statement. + /// + UpdateLimit = 1 << 24, + + /// + /// Indicates that RDBMS supports limiting operator (LIMIT or TOP or ROWS) in DELETE statement. + /// + DeleteLimit = 1 << 25, + + /// + /// Indicates that RDBMS supports paging operators ( and ). + /// + Paging = Limit | Offset, + + /// + /// Indicates that RDBMS supports batches for both DDL and DML statements. + /// + Batches = DdlBatches | DmlBatches, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/QueryInfo.cs b/Orm/Xtensive.Orm/Sql/Info/QueryInfo.cs index cebdb57dd1..0ccc86fad8 100644 --- a/Orm/Xtensive.Orm/Sql/Info/QueryInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/QueryInfo.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a query. - /// - public class QueryInfo : LockableBase - { - private int maxLength; - private int maxComparisonOperations; - private int maxNestedQueriesAmount; - private string parameterPrefix; - private QueryFeatures features = QueryFeatures.None; - - /// - /// Gets or sets the maximal length of a query text in characters. - /// - public int MaxLength - { - get { return maxLength; } - set - { - this.EnsureNotLocked(); - maxLength = value; - } - } - - /// - /// Gets or sets the maximal number of comparison operations for a single query. - /// - public int MaxComparisonOperations - { - get { return maxComparisonOperations; } - set - { - this.EnsureNotLocked(); - maxComparisonOperations = value; - } - } - - /// - /// Gets or sets the nested subqueries amount. - /// - public int MaxNestedSubqueriesAmount - { - get { return maxNestedQueriesAmount; } - set - { - this.EnsureNotLocked(); - maxNestedQueriesAmount = value; - } - } - - /// - /// Gets or sets the Parameter prefix. - /// - public string ParameterPrefix - { - get { return parameterPrefix; } - set - { - this.EnsureNotLocked(); - parameterPrefix = value; - } - } - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public QueryFeatures Features - { - get { return features; } - set - { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a query. + /// + public class QueryInfo : LockableBase + { + private int maxLength; + private int maxComparisonOperations; + private int maxNestedQueriesAmount; + private string parameterPrefix; + private QueryFeatures features = QueryFeatures.None; + + /// + /// Gets or sets the maximal length of a query text in characters. + /// + public int MaxLength + { + get { return maxLength; } + set + { + this.EnsureNotLocked(); + maxLength = value; + } + } + + /// + /// Gets or sets the maximal number of comparison operations for a single query. + /// + public int MaxComparisonOperations + { + get { return maxComparisonOperations; } + set + { + this.EnsureNotLocked(); + maxComparisonOperations = value; + } + } + + /// + /// Gets or sets the nested subqueries amount. + /// + public int MaxNestedSubqueriesAmount + { + get { return maxNestedQueriesAmount; } + set + { + this.EnsureNotLocked(); + maxNestedQueriesAmount = value; + } + } + + /// + /// Gets or sets the Parameter prefix. + /// + public string ParameterPrefix + { + get { return parameterPrefix; } + set + { + this.EnsureNotLocked(); + parameterPrefix = value; + } + } + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public QueryFeatures Features + { + get { return features; } + set + { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/SequenceFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/SequenceFeatures.cs index b11b7870b3..f07dc9c6a1 100644 --- a/Orm/Xtensive.Orm/Sql/Info/SequenceFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/SequenceFeatures.cs @@ -1,34 +1,34 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of sequence related features. - /// - [Flags] - public enum SequenceFeatures - { - /// - /// Indicates that RDBMS server does not support anything special - /// regarding sequences. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports caching of sequence values - /// (i.e. it would be possible to take several sequential values at a time - /// and then use those values without access to sequence object). - /// - Cache = 0x1, - - /// - /// Indicates that RDBMS allows to specify for a sequence an - /// order of generated values (ascending or descending). - /// - Order = 0x2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of sequence related features. + /// + [Flags] + public enum SequenceFeatures + { + /// + /// Indicates that RDBMS server does not support anything special + /// regarding sequences. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports caching of sequence values + /// (i.e. it would be possible to take several sequential values at a time + /// and then use those values without access to sequence object). + /// + Cache = 0x1, + + /// + /// Indicates that RDBMS allows to specify for a sequence an + /// order of generated values (ascending or descending). + /// + Order = 0x2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/SequenceInfo.cs b/Orm/Xtensive.Orm/Sql/Info/SequenceInfo.cs index 6f87f53027..8a658be099 100644 --- a/Orm/Xtensive.Orm/Sql/Info/SequenceInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/SequenceInfo.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a sequence. - /// - public class SequenceInfo : EntityInfo - { - private SequenceFeatures features = SequenceFeatures.None; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public SequenceFeatures Features - { - get { return features; } - set - { - this.EnsureNotLocked(); - features = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a sequence. + /// + public class SequenceInfo : EntityInfo + { + private SequenceFeatures features = SequenceFeatures.None; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public SequenceFeatures Features + { + get { return features; } + set + { + this.EnsureNotLocked(); + features = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/ServerFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/ServerFeatures.cs index 88adc03201..f3c34c6856 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ServerFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ServerFeatures.cs @@ -1,101 +1,101 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2010.02.05 - -using System; -using System.Diagnostics; - -namespace Xtensive.Sql.Info -{ - /// - /// Features of RBMS. - /// - [Flags] - public enum ServerFeatures - { - /// - /// Empty option set. - /// - None = 0, - - /// - /// Indicates that RDBMS uses large objects (LOBs) for manipulating large data chunks. - /// . - /// . - /// - LargeObjects = 1 << 0, - - /// - /// Indicates that RDBMS supports cursor parameters. - /// - CursorParameters = 1 << 1, - - /// - /// Indicates whether RDBMS supports returning multiple results via cursor parameters. - /// Does matter only if feature is avaliable. - /// - MultipleResultsViaCursorParameters = 1 << 2, - - /// - /// Indicates whether RDBMS supports savepoints. - /// - Savepoints = 1 << 3, - - /// - /// Indicates whether RDBMS supports transactional DDL - /// (except full-text indexes which have separate option). - /// - TransactionalDdl = 1 << 4, - - /// - /// Indicates whether RDBMS supports transactional DDL for full-text indexes. - /// - TransactionalFullTextDdl = 1 << 5, - - /// - /// Indicates whether RDBMS uses key generators that adhere to transaction boundaries. - /// - TransactionalKeyGenerators = 1 << 6, - - /// - /// Indicates whether RDBMS allows only one session to modify database. - /// - ExclusiveWriterConnection = 1 << 7, - - /// - /// Indicates whether RDBMS will perform well if regular tables are used - /// instead of temporary. This has effect only if database does not support - /// local temporary tables. - /// - TemporaryTableEmulation = 1 << 8, - - /// - /// Indicates whether RDBMS requires exactly one connection to be created. - /// This is used for :memory: data source in SQLite provider. - /// - SingleConnection = 1 << 9, - - /// - /// Indicates whether RDBMS supports type of data specification for columns in full text index. - /// - FullTextColumnDataTypeSpecification = 1 << 10, - - /// - /// Indicates whether RDBMS does not support DateTime natively, but allows to emulate it. - /// - DateTimeEmulation = 1 << 11, - - /// - /// Indicates whether RDBMS does not support DateTimeOffset natively, but allows to emulate it. - /// - DateTimeOffsetEmulation = 1 << 12, - - /// - /// Obsolete name for . - /// - [Obsolete("Use ServerFeatures.ExclusiveWriterSession instead.")] - SingleSessionAccess = ExclusiveWriterConnection, - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2010.02.05 + +using System; +using System.Diagnostics; + +namespace Xtensive.Sql.Info +{ + /// + /// Features of RBMS. + /// + [Flags] + public enum ServerFeatures + { + /// + /// Empty option set. + /// + None = 0, + + /// + /// Indicates that RDBMS uses large objects (LOBs) for manipulating large data chunks. + /// . + /// . + /// + LargeObjects = 1 << 0, + + /// + /// Indicates that RDBMS supports cursor parameters. + /// + CursorParameters = 1 << 1, + + /// + /// Indicates whether RDBMS supports returning multiple results via cursor parameters. + /// Does matter only if feature is avaliable. + /// + MultipleResultsViaCursorParameters = 1 << 2, + + /// + /// Indicates whether RDBMS supports savepoints. + /// + Savepoints = 1 << 3, + + /// + /// Indicates whether RDBMS supports transactional DDL + /// (except full-text indexes which have separate option). + /// + TransactionalDdl = 1 << 4, + + /// + /// Indicates whether RDBMS supports transactional DDL for full-text indexes. + /// + TransactionalFullTextDdl = 1 << 5, + + /// + /// Indicates whether RDBMS uses key generators that adhere to transaction boundaries. + /// + TransactionalKeyGenerators = 1 << 6, + + /// + /// Indicates whether RDBMS allows only one session to modify database. + /// + ExclusiveWriterConnection = 1 << 7, + + /// + /// Indicates whether RDBMS will perform well if regular tables are used + /// instead of temporary. This has effect only if database does not support + /// local temporary tables. + /// + TemporaryTableEmulation = 1 << 8, + + /// + /// Indicates whether RDBMS requires exactly one connection to be created. + /// This is used for :memory: data source in SQLite provider. + /// + SingleConnection = 1 << 9, + + /// + /// Indicates whether RDBMS supports type of data specification for columns in full text index. + /// + FullTextColumnDataTypeSpecification = 1 << 10, + + /// + /// Indicates whether RDBMS does not support DateTime natively, but allows to emulate it. + /// + DateTimeEmulation = 1 << 11, + + /// + /// Indicates whether RDBMS does not support DateTimeOffset natively, but allows to emulate it. + /// + DateTimeOffsetEmulation = 1 << 12, + + /// + /// Obsolete name for . + /// + [Obsolete("Use ServerFeatures.ExclusiveWriterSession instead.")] + SingleSessionAccess = ExclusiveWriterConnection, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/ServerInfo.cs b/Orm/Xtensive.Orm/Sql/Info/ServerInfo.cs index 14a05b6e8e..e2ecddae2c 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ServerInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ServerInfo.cs @@ -1,244 +1,244 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Represents a set of information concerning RDBMS capabilities. - /// - public class ServerInfo : LockableBase - { - /// - /// Gets the server supported isolation levels. - /// - public IsolationLevels IsolationLevels { get; private set; } - - /// - /// Gets the server supported isolation levels. - /// - public FullTextSearchInfo FullTextSearch { get; private set; } - - /// - /// Gets the assertion constraint info. - /// - /// The assertion constraint info. - public AssertConstraintInfo Assertion { get; private set; } - - /// - /// Gets the character set info. - /// - /// The character set info. - public EntityInfo CharacterSet { get; private set; } - - /// - /// Gets the collation info. - /// - /// The collation info. - public EntityInfo Collation { get; private set; } - - /// - /// Gets the column info. - /// - /// The column info. - public ColumnInfo Column { get; private set; } - - /// - /// Gets the check constraint info. - /// - /// The check constraint info. - public CheckConstraintInfo CheckConstraint { get; private set; } - - /// - /// Gets the database info. - /// - /// The database info. - public EntityInfo Database { get; private set; } - - /// - /// Gets the domain info. - /// - /// The domain info. - public EntityInfo Domain { get; private set; } - - /// - /// Gets the identity info. - /// - /// The identity info. - public IdentityInfo Identity { get; private set; } - - /// - /// Gets the index info. - /// - /// The index info. - public IndexInfo Index { get; private set; } - - /// - /// Gets the primary key constraint info. - /// - /// The primary key constraint info. - public PrimaryKeyConstraintInfo PrimaryKey { get; private set; } - - /// - /// Gets the query info. - /// - /// The query info. - public QueryInfo Query { get; private set; } - - /// - /// Gets the referential constraint info. - /// - /// The referential constraint info. - public ForeignKeyConstraintInfo ForeignKey { get; private set; } - - /// - /// Gets the schema info. - /// - /// The schema info. - public EntityInfo Schema { get; private set; } - - /// - /// Gets the sequence info. - /// - /// The sequence info. - public SequenceInfo Sequence { get; private set; } - - /// - /// Gets the stored procedure info. - /// - /// The stored procedure info. - public EntityInfo StoredProcedure { get; private set; } - - /// - /// Gets the table info. - /// - /// The table info. - public TableInfo Table { get; private set; } - - /// - /// Gets the temporary table info. - /// - /// The temporary table info. - public TemporaryTableInfo TemporaryTable { get; private set; } - - /// - /// Gets the translation info. - /// - /// The translation info. - public EntityInfo Translation { get; private set; } - - /// - /// Gets the trigger info. - /// - /// The trigger info. - public EntityInfo Trigger { get; private set; } - - /// - /// Gets the unique constraint info. - /// - /// The unique constraint info. - public UniqueConstraintInfo UniqueConstraint { get; private set; } - - /// - /// Gets the view info. - /// - /// The view info. - public EntityInfo View { get; private set; } - - /// - /// Gets the data types. - /// - public DataTypeCollection DataTypes { get; private set; } - - /// - /// Gets the server features. - /// - public ServerFeatures ServerFeatures { get; private set; } - - /// - /// Gets the string indexing base. Normally is equal to 1. - /// - /// The string indexing base. - public int StringIndexingBase { get; private set; } - - /// - /// Builds the server info using specified . - /// - /// The provider. - public static ServerInfo Build(ServerInfoProvider provider) - { - ArgumentValidator.EnsureArgumentNotNull(provider, "provider"); - var info = new ServerInfo { - Assertion = provider.GetAssertionInfo(), - CharacterSet = provider.GetCharacterSetInfo(), - CheckConstraint = provider.GetCheckConstraintInfo(), - Collation = provider.GetCollationInfo(), - Column = provider.GetColumnInfo(), - DataTypes = provider.GetDataTypesInfo(), - Database = provider.GetDatabaseInfo(), - Domain = provider.GetDomainInfo(), - ForeignKey = provider.GetForeignKeyConstraintInfo(), - FullTextSearch = provider.GetFullTextInfo(), - Identity = provider.GetIdentityInfo(), - Index = provider.GetIndexInfo(), - IsolationLevels = provider.GetIsolationLevels(), - PrimaryKey = provider.GetPrimaryKeyInfo(), - Query = provider.GetQueryInfo(), - Schema = provider.GetSchemaInfo(), - Sequence = provider.GetSequenceInfo(), - StoredProcedure = provider.GetStoredProcedureInfo(), - Table = provider.GetTableInfo(), - TemporaryTable = provider.GetTemporaryTableInfo(), - Translation = provider.GetTranslationInfo(), - Trigger = provider.GetTriggerInfo(), - UniqueConstraint = provider.GetUniqueConstraintInfo(), - View = provider.GetViewInfo(), - ServerFeatures = provider.GetServerFeatures(), - StringIndexingBase = provider.GetStringIndexingBase(), - }; - - info.Lock(true); - - return info; - } - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - TryLockEntityInfo(Assertion, recursive); - TryLockEntityInfo(CharacterSet, recursive); - TryLockEntityInfo(CheckConstraint, recursive); - TryLockEntityInfo(Collation, recursive); - TryLockEntityInfo(Column, recursive); - TryLockEntityInfo(DataTypes, recursive); - TryLockEntityInfo(Database, recursive); - TryLockEntityInfo(Domain, recursive); - TryLockEntityInfo(ForeignKey, recursive); - TryLockEntityInfo(Identity, recursive); - TryLockEntityInfo(Index, recursive); - TryLockEntityInfo(PrimaryKey, recursive); - TryLockEntityInfo(Query, recursive); - TryLockEntityInfo(Schema, recursive); - TryLockEntityInfo(Sequence, recursive); - TryLockEntityInfo(StoredProcedure, recursive); - TryLockEntityInfo(Table, recursive); - TryLockEntityInfo(TemporaryTable, recursive); - TryLockEntityInfo(Translation, recursive); - TryLockEntityInfo(Trigger, recursive); - TryLockEntityInfo(UniqueConstraint, recursive); - TryLockEntityInfo(View, recursive); - } - - private static void TryLockEntityInfo(ILockable info, bool recursive) - { - if (info!=null) - info.Lock(recursive); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Represents a set of information concerning RDBMS capabilities. + /// + public class ServerInfo : LockableBase + { + /// + /// Gets the server supported isolation levels. + /// + public IsolationLevels IsolationLevels { get; private set; } + + /// + /// Gets the server supported isolation levels. + /// + public FullTextSearchInfo FullTextSearch { get; private set; } + + /// + /// Gets the assertion constraint info. + /// + /// The assertion constraint info. + public AssertConstraintInfo Assertion { get; private set; } + + /// + /// Gets the character set info. + /// + /// The character set info. + public EntityInfo CharacterSet { get; private set; } + + /// + /// Gets the collation info. + /// + /// The collation info. + public EntityInfo Collation { get; private set; } + + /// + /// Gets the column info. + /// + /// The column info. + public ColumnInfo Column { get; private set; } + + /// + /// Gets the check constraint info. + /// + /// The check constraint info. + public CheckConstraintInfo CheckConstraint { get; private set; } + + /// + /// Gets the database info. + /// + /// The database info. + public EntityInfo Database { get; private set; } + + /// + /// Gets the domain info. + /// + /// The domain info. + public EntityInfo Domain { get; private set; } + + /// + /// Gets the identity info. + /// + /// The identity info. + public IdentityInfo Identity { get; private set; } + + /// + /// Gets the index info. + /// + /// The index info. + public IndexInfo Index { get; private set; } + + /// + /// Gets the primary key constraint info. + /// + /// The primary key constraint info. + public PrimaryKeyConstraintInfo PrimaryKey { get; private set; } + + /// + /// Gets the query info. + /// + /// The query info. + public QueryInfo Query { get; private set; } + + /// + /// Gets the referential constraint info. + /// + /// The referential constraint info. + public ForeignKeyConstraintInfo ForeignKey { get; private set; } + + /// + /// Gets the schema info. + /// + /// The schema info. + public EntityInfo Schema { get; private set; } + + /// + /// Gets the sequence info. + /// + /// The sequence info. + public SequenceInfo Sequence { get; private set; } + + /// + /// Gets the stored procedure info. + /// + /// The stored procedure info. + public EntityInfo StoredProcedure { get; private set; } + + /// + /// Gets the table info. + /// + /// The table info. + public TableInfo Table { get; private set; } + + /// + /// Gets the temporary table info. + /// + /// The temporary table info. + public TemporaryTableInfo TemporaryTable { get; private set; } + + /// + /// Gets the translation info. + /// + /// The translation info. + public EntityInfo Translation { get; private set; } + + /// + /// Gets the trigger info. + /// + /// The trigger info. + public EntityInfo Trigger { get; private set; } + + /// + /// Gets the unique constraint info. + /// + /// The unique constraint info. + public UniqueConstraintInfo UniqueConstraint { get; private set; } + + /// + /// Gets the view info. + /// + /// The view info. + public EntityInfo View { get; private set; } + + /// + /// Gets the data types. + /// + public DataTypeCollection DataTypes { get; private set; } + + /// + /// Gets the server features. + /// + public ServerFeatures ServerFeatures { get; private set; } + + /// + /// Gets the string indexing base. Normally is equal to 1. + /// + /// The string indexing base. + public int StringIndexingBase { get; private set; } + + /// + /// Builds the server info using specified . + /// + /// The provider. + public static ServerInfo Build(ServerInfoProvider provider) + { + ArgumentValidator.EnsureArgumentNotNull(provider, "provider"); + var info = new ServerInfo { + Assertion = provider.GetAssertionInfo(), + CharacterSet = provider.GetCharacterSetInfo(), + CheckConstraint = provider.GetCheckConstraintInfo(), + Collation = provider.GetCollationInfo(), + Column = provider.GetColumnInfo(), + DataTypes = provider.GetDataTypesInfo(), + Database = provider.GetDatabaseInfo(), + Domain = provider.GetDomainInfo(), + ForeignKey = provider.GetForeignKeyConstraintInfo(), + FullTextSearch = provider.GetFullTextInfo(), + Identity = provider.GetIdentityInfo(), + Index = provider.GetIndexInfo(), + IsolationLevels = provider.GetIsolationLevels(), + PrimaryKey = provider.GetPrimaryKeyInfo(), + Query = provider.GetQueryInfo(), + Schema = provider.GetSchemaInfo(), + Sequence = provider.GetSequenceInfo(), + StoredProcedure = provider.GetStoredProcedureInfo(), + Table = provider.GetTableInfo(), + TemporaryTable = provider.GetTemporaryTableInfo(), + Translation = provider.GetTranslationInfo(), + Trigger = provider.GetTriggerInfo(), + UniqueConstraint = provider.GetUniqueConstraintInfo(), + View = provider.GetViewInfo(), + ServerFeatures = provider.GetServerFeatures(), + StringIndexingBase = provider.GetStringIndexingBase(), + }; + + info.Lock(true); + + return info; + } + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + TryLockEntityInfo(Assertion, recursive); + TryLockEntityInfo(CharacterSet, recursive); + TryLockEntityInfo(CheckConstraint, recursive); + TryLockEntityInfo(Collation, recursive); + TryLockEntityInfo(Column, recursive); + TryLockEntityInfo(DataTypes, recursive); + TryLockEntityInfo(Database, recursive); + TryLockEntityInfo(Domain, recursive); + TryLockEntityInfo(ForeignKey, recursive); + TryLockEntityInfo(Identity, recursive); + TryLockEntityInfo(Index, recursive); + TryLockEntityInfo(PrimaryKey, recursive); + TryLockEntityInfo(Query, recursive); + TryLockEntityInfo(Schema, recursive); + TryLockEntityInfo(Sequence, recursive); + TryLockEntityInfo(StoredProcedure, recursive); + TryLockEntityInfo(Table, recursive); + TryLockEntityInfo(TemporaryTable, recursive); + TryLockEntityInfo(Translation, recursive); + TryLockEntityInfo(Trigger, recursive); + TryLockEntityInfo(UniqueConstraint, recursive); + TryLockEntityInfo(View, recursive); + } + + private static void TryLockEntityInfo(ILockable info, bool recursive) + { + if (info!=null) + info.Lock(recursive); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/ServerInfoProvider.cs b/Orm/Xtensive.Orm/Sql/Info/ServerInfoProvider.cs index 8ee7de3cad..f7d842f11e 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ServerInfoProvider.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ServerInfoProvider.cs @@ -1,158 +1,158 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - - - -namespace Xtensive.Sql.Info -{ - /// - /// Describes provider interface. - /// - public abstract class ServerInfoProvider - { - /// - /// Gets the driver. - /// - public SqlDriver Driver { get; private set; } - - /// - /// Gets the collation info. - /// - public abstract EntityInfo GetCollationInfo(); - - /// - /// Gets the character set info. - /// - public abstract EntityInfo GetCharacterSetInfo(); - - /// - /// Gets the translation info. - /// - public abstract EntityInfo GetTranslationInfo(); - - /// - /// Gets the trigger info. - /// - public abstract EntityInfo GetTriggerInfo(); - - /// - /// Gets the stored procedure info. - /// - public abstract EntityInfo GetStoredProcedureInfo(); - - /// - /// Gets the sequence info. - /// - public abstract SequenceInfo GetSequenceInfo(); - - /// - /// Gets the database info. - /// - public abstract EntityInfo GetDatabaseInfo(); - - /// - /// Gets the column info. - /// - public abstract ColumnInfo GetColumnInfo(); - - /// - /// Gets the view info. - /// - public abstract EntityInfo GetViewInfo(); - - /// - /// Gets the schema info. - /// - public abstract EntityInfo GetSchemaInfo(); - - /// - /// Gets the table info. - /// - public abstract TableInfo GetTableInfo(); - - /// - /// Gets the temporary table info. - /// - public abstract TemporaryTableInfo GetTemporaryTableInfo(); - - /// - /// Gets the check constraint info. - /// - public abstract CheckConstraintInfo GetCheckConstraintInfo(); - - /// - /// Gets the unique constraint info. - /// - public abstract UniqueConstraintInfo GetUniqueConstraintInfo(); - - /// - /// Gets the primary key info. - /// - public abstract PrimaryKeyConstraintInfo GetPrimaryKeyInfo(); - - /// - /// Gets the referential constraint info. - /// - public abstract FullTextSearchInfo GetFullTextInfo(); - - /// - /// Gets the referential constraint info. - /// - public abstract ForeignKeyConstraintInfo GetForeignKeyConstraintInfo(); - - /// - /// Gets the index info. - /// - public abstract IndexInfo GetIndexInfo(); - - /// - /// Gets the query info. - /// - public abstract QueryInfo GetQueryInfo(); - - /// - /// Gets the identity info. - /// - public abstract IdentityInfo GetIdentityInfo(); - - /// - /// Gets the collection of supported data types. - /// - public abstract DataTypeCollection GetDataTypesInfo(); - - /// - /// Gets the supported isolation levels. - /// - public abstract IsolationLevels GetIsolationLevels(); - - /// - /// Gets the domain info. - /// - public abstract EntityInfo GetDomainInfo(); - - /// - /// Gets the assertion info. - /// - public abstract AssertConstraintInfo GetAssertionInfo(); - - /// - /// Gets the server features. - /// - public abstract ServerFeatures GetServerFeatures(); - - /// - /// Gets the string indexing base. - /// - public abstract int GetStringIndexingBase(); - - /// - /// Initializes new instance of this type. - /// - /// The driver. - protected ServerInfoProvider(SqlDriver driver) - { - Driver = driver; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + + + +namespace Xtensive.Sql.Info +{ + /// + /// Describes provider interface. + /// + public abstract class ServerInfoProvider + { + /// + /// Gets the driver. + /// + public SqlDriver Driver { get; private set; } + + /// + /// Gets the collation info. + /// + public abstract EntityInfo GetCollationInfo(); + + /// + /// Gets the character set info. + /// + public abstract EntityInfo GetCharacterSetInfo(); + + /// + /// Gets the translation info. + /// + public abstract EntityInfo GetTranslationInfo(); + + /// + /// Gets the trigger info. + /// + public abstract EntityInfo GetTriggerInfo(); + + /// + /// Gets the stored procedure info. + /// + public abstract EntityInfo GetStoredProcedureInfo(); + + /// + /// Gets the sequence info. + /// + public abstract SequenceInfo GetSequenceInfo(); + + /// + /// Gets the database info. + /// + public abstract EntityInfo GetDatabaseInfo(); + + /// + /// Gets the column info. + /// + public abstract ColumnInfo GetColumnInfo(); + + /// + /// Gets the view info. + /// + public abstract EntityInfo GetViewInfo(); + + /// + /// Gets the schema info. + /// + public abstract EntityInfo GetSchemaInfo(); + + /// + /// Gets the table info. + /// + public abstract TableInfo GetTableInfo(); + + /// + /// Gets the temporary table info. + /// + public abstract TemporaryTableInfo GetTemporaryTableInfo(); + + /// + /// Gets the check constraint info. + /// + public abstract CheckConstraintInfo GetCheckConstraintInfo(); + + /// + /// Gets the unique constraint info. + /// + public abstract UniqueConstraintInfo GetUniqueConstraintInfo(); + + /// + /// Gets the primary key info. + /// + public abstract PrimaryKeyConstraintInfo GetPrimaryKeyInfo(); + + /// + /// Gets the referential constraint info. + /// + public abstract FullTextSearchInfo GetFullTextInfo(); + + /// + /// Gets the referential constraint info. + /// + public abstract ForeignKeyConstraintInfo GetForeignKeyConstraintInfo(); + + /// + /// Gets the index info. + /// + public abstract IndexInfo GetIndexInfo(); + + /// + /// Gets the query info. + /// + public abstract QueryInfo GetQueryInfo(); + + /// + /// Gets the identity info. + /// + public abstract IdentityInfo GetIdentityInfo(); + + /// + /// Gets the collection of supported data types. + /// + public abstract DataTypeCollection GetDataTypesInfo(); + + /// + /// Gets the supported isolation levels. + /// + public abstract IsolationLevels GetIsolationLevels(); + + /// + /// Gets the domain info. + /// + public abstract EntityInfo GetDomainInfo(); + + /// + /// Gets the assertion info. + /// + public abstract AssertConstraintInfo GetAssertionInfo(); + + /// + /// Gets the server features. + /// + public abstract ServerFeatures GetServerFeatures(); + + /// + /// Gets the string indexing base. + /// + public abstract int GetStringIndexingBase(); + + /// + /// Initializes new instance of this type. + /// + /// The driver. + protected ServerInfoProvider(SqlDriver driver) + { + Driver = driver; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/TableInfo.cs b/Orm/Xtensive.Orm/Sql/Info/TableInfo.cs index e9ca576a45..44b8dd165c 100644 --- a/Orm/Xtensive.Orm/Sql/Info/TableInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/TableInfo.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a table. - /// - public class TableInfo : EntityInfo - { - private PartitionMethods partitionMethods; - private int maxNumberOfColumns; - - /// - /// Gets supported partition methods. - /// - public PartitionMethods PartitionMethods { - get { return partitionMethods; } - set { - this.EnsureNotLocked(); - partitionMethods = value; - } - } - - /// - /// Gets or sets the maximum number of columns per table. - /// - public int MaxNumberOfColumns { - get { return maxNumberOfColumns; } - set { - this.EnsureNotLocked(); - maxNumberOfColumns = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a table. + /// + public class TableInfo : EntityInfo + { + private PartitionMethods partitionMethods; + private int maxNumberOfColumns; + + /// + /// Gets supported partition methods. + /// + public PartitionMethods PartitionMethods { + get { return partitionMethods; } + set { + this.EnsureNotLocked(); + partitionMethods = value; + } + } + + /// + /// Gets or sets the maximum number of columns per table. + /// + public int MaxNumberOfColumns { + get { return maxNumberOfColumns; } + set { + this.EnsureNotLocked(); + maxNumberOfColumns = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/TemporaryTableFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/TemporaryTableFeatures.cs index 9a65738f3c..9df1a79ca3 100644 --- a/Orm/Xtensive.Orm/Sql/Info/TemporaryTableFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/TemporaryTableFeatures.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of possible temporary table features. - /// - [Flags] - public enum TemporaryTableFeatures - { - /// - /// Indicates that RDBMS does not support temporary tables. - /// - None = 0x0, - - /// - /// Indicates that RDBMS supports globally visible temporary tables. - /// - Global = 0x1, - - /// - /// Indicates that RDBMS supports temporary tables - /// which are visible only in a local context. - /// - Local = 0x2, - - /// - /// Indicates that RDBMS allows to delete rows on commit. - /// - DeleteRowsOnCommit = 0x4, - - /// - /// Indicates that RDBMS allows to preserve rows on commit. - /// - PreserveRowsOnCommit = 0x8, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of possible temporary table features. + /// + [Flags] + public enum TemporaryTableFeatures + { + /// + /// Indicates that RDBMS does not support temporary tables. + /// + None = 0x0, + + /// + /// Indicates that RDBMS supports globally visible temporary tables. + /// + Global = 0x1, + + /// + /// Indicates that RDBMS supports temporary tables + /// which are visible only in a local context. + /// + Local = 0x2, + + /// + /// Indicates that RDBMS allows to delete rows on commit. + /// + DeleteRowsOnCommit = 0x4, + + /// + /// Indicates that RDBMS allows to preserve rows on commit. + /// + PreserveRowsOnCommit = 0x8, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/TemporaryTableInfo.cs b/Orm/Xtensive.Orm/Sql/Info/TemporaryTableInfo.cs index ba3a0a620a..cea045af24 100644 --- a/Orm/Xtensive.Orm/Sql/Info/TemporaryTableInfo.cs +++ b/Orm/Xtensive.Orm/Sql/Info/TemporaryTableInfo.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Info -{ - /// - /// Describes a temporary table. - /// - public class TemporaryTableInfo : EntityInfo - { - private TemporaryTableFeatures features; - private int maxNumberOfColumns; - - /// - /// Gets or sets the features of this instance. - /// - /// The features. - public TemporaryTableFeatures Features { - get { return features; } - set { - this.EnsureNotLocked(); - features = value; - } - } - - /// - /// Gets or sets the maximum number of columns per table. - /// - public int MaxNumberOfColumns { - get { return maxNumberOfColumns; } - set { - this.EnsureNotLocked(); - maxNumberOfColumns = value; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Info +{ + /// + /// Describes a temporary table. + /// + public class TemporaryTableInfo : EntityInfo + { + private TemporaryTableFeatures features; + private int maxNumberOfColumns; + + /// + /// Gets or sets the features of this instance. + /// + /// The features. + public TemporaryTableFeatures Features { + get { return features; } + set { + this.EnsureNotLocked(); + features = value; + } + } + + /// + /// Gets or sets the maximum number of columns per table. + /// + public int MaxNumberOfColumns { + get { return maxNumberOfColumns; } + set { + this.EnsureNotLocked(); + maxNumberOfColumns = value; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Info/ValueRange.Types.cs b/Orm/Xtensive.Orm/Sql/Info/ValueRange.Types.cs index bb86d8cc43..e8c7569b24 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ValueRange.Types.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ValueRange.Types.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.21 - -namespace Xtensive.Sql.Info -{ - /// - /// Provides a s for standard .Net struct types. - /// - public partial class ValueRange - { - /// - /// Standard value range for . - /// - public static readonly ValueRange Bool = new ValueRange(false, true); - /// - /// Standard value range for . - /// - public static readonly ValueRange Char = new ValueRange(char.MinValue, char.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange SByte = new ValueRange(sbyte.MinValue, sbyte.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Int16 = new ValueRange(short.MinValue, short.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Int32 = new ValueRange(int.MinValue, int.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Int64 = new ValueRange(long.MinValue, long.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Byte = new ValueRange(byte.MinValue, byte.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange UInt16 = new ValueRange(ushort.MinValue, ushort.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange UInt32 = new ValueRange(uint.MinValue, uint.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange UInt64 = new ValueRange(ulong.MinValue, ulong.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Float = new ValueRange(float.MinValue, float.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Double = new ValueRange(double.MinValue, double.MaxValue); - /// - /// Standard value range for . - /// - public static readonly ValueRange Decimal = new ValueRange(decimal.MinValue, decimal.MaxValue); - /// - /// Standard value range for - /// - public static readonly ValueRange DateTime = - new ValueRange(System.DateTime.MinValue, System.DateTime.MaxValue); - /// - /// Standard value range for - /// - public static readonly ValueRange DateTimeOffset = - new ValueRange(System.DateTimeOffset.MinValue, System.DateTimeOffset.MaxValue); - /// - /// Standard value range for - /// - public static readonly ValueRange TimeSpan = - new ValueRange(System.TimeSpan.MinValue, System.TimeSpan.MaxValue); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.21 + +namespace Xtensive.Sql.Info +{ + /// + /// Provides a s for standard .Net struct types. + /// + public partial class ValueRange + { + /// + /// Standard value range for . + /// + public static readonly ValueRange Bool = new ValueRange(false, true); + /// + /// Standard value range for . + /// + public static readonly ValueRange Char = new ValueRange(char.MinValue, char.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange SByte = new ValueRange(sbyte.MinValue, sbyte.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Int16 = new ValueRange(short.MinValue, short.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Int32 = new ValueRange(int.MinValue, int.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Int64 = new ValueRange(long.MinValue, long.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Byte = new ValueRange(byte.MinValue, byte.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange UInt16 = new ValueRange(ushort.MinValue, ushort.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange UInt32 = new ValueRange(uint.MinValue, uint.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange UInt64 = new ValueRange(ulong.MinValue, ulong.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Float = new ValueRange(float.MinValue, float.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Double = new ValueRange(double.MinValue, double.MaxValue); + /// + /// Standard value range for . + /// + public static readonly ValueRange Decimal = new ValueRange(decimal.MinValue, decimal.MaxValue); + /// + /// Standard value range for + /// + public static readonly ValueRange DateTime = + new ValueRange(System.DateTime.MinValue, System.DateTime.MaxValue); + /// + /// Standard value range for + /// + public static readonly ValueRange DateTimeOffset = + new ValueRange(System.DateTimeOffset.MinValue, System.DateTimeOffset.MaxValue); + /// + /// Standard value range for + /// + public static readonly ValueRange TimeSpan = + new ValueRange(System.TimeSpan.MinValue, System.TimeSpan.MaxValue); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/ValueRange.cs b/Orm/Xtensive.Orm/Sql/Info/ValueRange.cs index b9867a4a21..7e089a1130 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ValueRange.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ValueRange.cs @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.07 - -using System; -using System.Diagnostics; - -namespace Xtensive.Sql.Info -{ - /// - /// Represents a contiguous range of values. - /// - public abstract partial class ValueRange - { - /// - /// Gets the min value. - /// - public abstract object GetMinValue(); - - /// - /// Gets the max value. - /// - public abstract object GetMaxValue(); - - /// - /// Gets the default value. - /// - public abstract object GetDefaultValue(); - - /// - /// Determines whether default value has been specified. - /// - public abstract bool HasDefaultValue(); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.07 + +using System; +using System.Diagnostics; + +namespace Xtensive.Sql.Info +{ + /// + /// Represents a contiguous range of values. + /// + public abstract partial class ValueRange + { + /// + /// Gets the min value. + /// + public abstract object GetMinValue(); + + /// + /// Gets the max value. + /// + public abstract object GetMaxValue(); + + /// + /// Gets the default value. + /// + public abstract object GetDefaultValue(); + + /// + /// Determines whether default value has been specified. + /// + public abstract bool HasDefaultValue(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/ValueRange{T}.cs b/Orm/Xtensive.Orm/Sql/Info/ValueRange{T}.cs index c25e5d3ee8..ee75aac271 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ValueRange{T}.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ValueRange{T}.cs @@ -1,86 +1,86 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - - -namespace Xtensive.Sql.Info -{ - /// - /// Represents a strictly typed contiguous range of values. - /// - public sealed class ValueRange : ValueRange - where T: struct, IComparable - { - /// - /// A minimum value in the . - /// - public T MinValue { get; private set; } - - /// - /// A maximum value in the . - /// - public T MaxValue { get; private set; } - - /// - /// A default value from the . - /// - /// - /// A value belonging to the - /// or if not specified. - /// - public T? DefaultValue { get; private set; } - - public override object GetMinValue() - { - return MinValue; - } - - public override object GetMaxValue() - { - return MaxValue; - } - - public override object GetDefaultValue() - { - return DefaultValue; - } - - public override bool HasDefaultValue() - { - return DefaultValue.HasValue; - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The min value. - /// The max value. - public ValueRange(T minValue, T maxValue) - : this(minValue, maxValue, null) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The min value. - /// The max value. - /// The default value. - public ValueRange(T minValue, T maxValue, T? defaultValue) - { - if (minValue.CompareTo(maxValue) > 0) - throw new ArgumentOutOfRangeException(); - if (defaultValue.HasValue) - if (minValue.CompareTo(defaultValue.Value) > 0 || maxValue.CompareTo(defaultValue.Value) < 0) - throw new ArgumentOutOfRangeException(); - MinValue = minValue; - MaxValue = maxValue; - DefaultValue = defaultValue; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + + +namespace Xtensive.Sql.Info +{ + /// + /// Represents a strictly typed contiguous range of values. + /// + public sealed class ValueRange : ValueRange + where T: struct, IComparable + { + /// + /// A minimum value in the . + /// + public T MinValue { get; private set; } + + /// + /// A maximum value in the . + /// + public T MaxValue { get; private set; } + + /// + /// A default value from the . + /// + /// + /// A value belonging to the + /// or if not specified. + /// + public T? DefaultValue { get; private set; } + + public override object GetMinValue() + { + return MinValue; + } + + public override object GetMaxValue() + { + return MaxValue; + } + + public override object GetDefaultValue() + { + return DefaultValue; + } + + public override bool HasDefaultValue() + { + return DefaultValue.HasValue; + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The min value. + /// The max value. + public ValueRange(T minValue, T maxValue) + : this(minValue, maxValue, null) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The min value. + /// The max value. + /// The default value. + public ValueRange(T minValue, T maxValue, T? defaultValue) + { + if (minValue.CompareTo(maxValue) > 0) + throw new ArgumentOutOfRangeException(); + if (defaultValue.HasValue) + if (minValue.CompareTo(defaultValue.Value) > 0 || maxValue.CompareTo(defaultValue.Value) < 0) + throw new ArgumentOutOfRangeException(); + MinValue = minValue; + MaxValue = maxValue; + DefaultValue = defaultValue; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Info/ViewFeatures.cs b/Orm/Xtensive.Orm/Sql/Info/ViewFeatures.cs index 71b68307bb..37426b22b8 100644 --- a/Orm/Xtensive.Orm/Sql/Info/ViewFeatures.cs +++ b/Orm/Xtensive.Orm/Sql/Info/ViewFeatures.cs @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Info -{ - /// - /// Defines a list of RDBMS dependent view features. - /// - [Flags] - public enum ViewFeatures - { - /// - /// Indicates that RDBMS does not support features from this list. - /// - None = 0x0, - - /// - /// Indicates that RDBMS allows to create local views - /// those are visible only in current execution context. - /// - Local = 0x1, - - /// - /// Indicates that RDBMS allows to create views based on - /// some other views instead of tables. - /// - Cascaded = 0x2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Info +{ + /// + /// Defines a list of RDBMS dependent view features. + /// + [Flags] + public enum ViewFeatures + { + /// + /// Indicates that RDBMS does not support features from this list. + /// + None = 0x0, + + /// + /// Indicates that RDBMS allows to create local views + /// those are visible only in current execution context. + /// + Local = 0x1, + + /// + /// Indicates that RDBMS allows to create views based on + /// some other views instead of tables. + /// + Cascaded = 0x2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/IBinaryLargeObject.cs b/Orm/Xtensive.Orm/Sql/Interfaces/IBinaryLargeObject.cs index 40ebf613be..b86d8e25bf 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/IBinaryLargeObject.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/IBinaryLargeObject.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent native binary large objects (BLOBs) query parameter. - /// - public interface IBinaryLargeObject : ILargeObject - { - /// - /// Writes a part of the specified buffer to this LOB. - /// - /// The buffer. - /// The offset. - /// The length. - void Write(byte[] buffer, int offset, int count); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent native binary large objects (BLOBs) query parameter. + /// + public interface IBinaryLargeObject : ILargeObject + { + /// + /// Writes a part of the specified buffer to this LOB. + /// + /// The buffer. + /// The offset. + /// The length. + void Write(byte[] buffer, int offset, int count); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ICharacterLargeObject.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ICharacterLargeObject.cs index 121f96ad2d..4fb0469b62 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ICharacterLargeObject.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ICharacterLargeObject.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent character large objects (CLOBs) query parameter. - /// - public interface ICharacterLargeObject : ILargeObject - { - /// - /// Writes a part of the specified buffer to this LOB. - /// - /// The buffer. - /// The offset. - /// The length. - void Write(char[] buffer, int offset, int count); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent character large objects (CLOBs) query parameter. + /// + public interface ICharacterLargeObject : ILargeObject + { + /// + /// Writes a part of the specified buffer to this LOB. + /// + /// The buffer. + /// The offset. + /// The length. + void Write(char[] buffer, int offset, int count); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ILargeObject.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ILargeObject.cs index 8939e6a78e..42158cc1c3 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ILargeObject.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ILargeObject.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.11 - -using System; -using System.Data.Common; - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent native large objects (LOBs) query parameter. - /// - public interface ILargeObject : IDisposable - { - /// - /// Gets a value indicating whether this instance is null. - /// - /// - /// if this instance is null; otherwise, . - /// - bool IsNull { get; } - - /// - /// Gets a value indicating whether this instance is empty. - /// - /// - /// if this instance is empty; otherwise, . - /// - bool IsEmpty { get; } - - /// - /// Nullifies this instance. - /// - void Nullify(); - - /// - /// Erases this instance. - /// - void Erase(); - - /// - /// Binds this LOB to the specified parameter. - /// - /// The parameter to bind to. - void BindTo(DbParameter parameter); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.11 + +using System; +using System.Data.Common; + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent native large objects (LOBs) query parameter. + /// + public interface ILargeObject : IDisposable + { + /// + /// Gets a value indicating whether this instance is null. + /// + /// + /// if this instance is null; otherwise, . + /// + bool IsNull { get; } + + /// + /// Gets a value indicating whether this instance is empty. + /// + /// + /// if this instance is empty; otherwise, . + /// + bool IsEmpty { get; } + + /// + /// Nullifies this instance. + /// + void Nullify(); + + /// + /// Erases this instance. + /// + void Erase(); + + /// + /// Binds this LOB to the specified parameter. + /// + /// The parameter to bind to. + void BindTo(DbParameter parameter); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCompileUnit.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCompileUnit.cs index eb2e4789b1..d5b9917258 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCompileUnit.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCompileUnit.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent SQL compilation unit. - /// - public interface ISqlCompileUnit : ISqlNode - { - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent SQL compilation unit. + /// + public interface ISqlCompileUnit : ISqlNode + { + } +} diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCursorFetchTarget.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCursorFetchTarget.cs index e1ba9cd4df..2abb6a8f73 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCursorFetchTarget.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlCursorFetchTarget.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent cursor fetch target. - /// - public interface ISqlCursorFetchTarget : ISqlLValue - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent cursor fetch target. + /// + public interface ISqlCursorFetchTarget : ISqlLValue + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlLValue.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlLValue.cs index 176ccd5f0b..e620f946ad 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlLValue.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlLValue.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent LValue in SQL DOM query model. - /// - public interface ISqlLValue : ISqlNode - { - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent LValue in SQL DOM query model. + /// + public interface ISqlLValue : ISqlNode + { + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlNode.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlNode.cs index e9940a44e8..cbdeb2e6ec 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlNode.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlNode.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent node in SQL DOM query model. - /// - public interface ISqlNode : ICloneable - { - SqlNodeType NodeType { get; } - void AcceptVisitor(ISqlVisitor visitor); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent node in SQL DOM query model. + /// + public interface ISqlNode : ICloneable + { + SqlNodeType NodeType { get; } + void AcceptVisitor(ISqlVisitor visitor); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlQueryExpression.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlQueryExpression.cs index c10e04fec9..8f23066403 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlQueryExpression.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlQueryExpression.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql -{ - /// - /// A contract for server-independent expression in SQL DOM query model. - /// - public interface ISqlQueryExpression : ISqlCompileUnit, IEnumerable - { - SqlQueryExpression Except(ISqlQueryExpression operand); - SqlQueryExpression ExceptAll(ISqlQueryExpression operand); - SqlQueryExpression Intersect(ISqlQueryExpression operand); - SqlQueryExpression IntersectAll(ISqlQueryExpression operand); - SqlQueryExpression Union(ISqlQueryExpression operand); - SqlQueryExpression UnionAll(ISqlQueryExpression operand); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql +{ + /// + /// A contract for server-independent expression in SQL DOM query model. + /// + public interface ISqlQueryExpression : ISqlCompileUnit, IEnumerable + { + SqlQueryExpression Except(ISqlQueryExpression operand); + SqlQueryExpression ExceptAll(ISqlQueryExpression operand); + SqlQueryExpression Intersect(ISqlQueryExpression operand); + SqlQueryExpression IntersectAll(ISqlQueryExpression operand); + SqlQueryExpression Union(ISqlQueryExpression operand); + SqlQueryExpression UnionAll(ISqlQueryExpression operand); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlVisitor.cs b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlVisitor.cs index b24aefa09f..dc8af5096e 100644 --- a/Orm/Xtensive.Orm/Sql/Interfaces/ISqlVisitor.cs +++ b/Orm/Xtensive.Orm/Sql/Interfaces/ISqlVisitor.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql -{ - /// - /// A contract for visitor of SQL DOM query model. - /// - public interface ISqlVisitor - { - void Visit(SqlAggregate node); - void Visit(SqlAlterDomain node); - void Visit(SqlAlterPartitionFunction node); - void Visit(SqlAlterPartitionScheme node); - void Visit(SqlAlterTable node); - void Visit(SqlAlterSequence node); - void Visit(SqlArray node); - void Visit(SqlAssignment node); - void Visit(SqlBatch node); - void Visit(SqlBetween node); - void Visit(SqlBinary node); - void Visit(SqlBreak node); - void Visit(SqlCase node); - void Visit(SqlCast node); - void Visit(SqlCloseCursor node); - void Visit(SqlCollate node); - void Visit(SqlColumnRef node); - void Visit(SqlConcat node); - void Visit(SqlContainsTable node); - void Visit(SqlContinue node); - void Visit(SqlContainer node); - void Visit(SqlCommand node); - void Visit(SqlCreateAssertion node); - void Visit(SqlCreateCharacterSet node); - void Visit(SqlCreateCollation node); - void Visit(SqlCreateDomain node); - void Visit(SqlCreateIndex node); - void Visit(SqlCreatePartitionFunction node); - void Visit(SqlCreatePartitionScheme node); - void Visit(SqlCreateSchema node); - void Visit(SqlCreateSequence node); - void Visit(SqlCreateTable node); - void Visit(SqlCreateTranslation node); - void Visit(SqlCreateView node); - void Visit(SqlCursor node); - void Visit(SqlDeclareCursor node); - void Visit(SqlDefaultValue node); - void Visit(SqlDelete node); - void Visit(SqlDropAssertion node); - void Visit(SqlDropCharacterSet node); - void Visit(SqlDropCollation node); - void Visit(SqlDropDomain node); - void Visit(SqlDropIndex node); - void Visit(SqlDropPartitionFunction node); - void Visit(SqlDropPartitionScheme node); - void Visit(SqlDropSchema node); - void Visit(SqlDropSequence node); - void Visit(SqlDropTable node); - void Visit(SqlDropTranslation node); - void Visit(SqlDropView node); - void Visit(SqlDynamicFilter node); - void Visit(SqlPlaceholder node); - void Visit(SqlExtract node); - void Visit(SqlFastFirstRowsHint node); - void Visit(SqlFetch node); - void Visit(SqlForceJoinOrderHint node); - void Visit(SqlFreeTextTable node); - void Visit(SqlFunctionCall node); - void Visit(SqlCustomFunctionCall node); - void Visit(SqlIf node); - void Visit(SqlInsert node); - void Visit(SqlJoinExpression node); - void Visit(SqlJoinHint node); - void Visit(SqlLike node); - void Visit(SqlLiteral node); - void Visit(SqlMatch node); - void Visit(SqlNative node); - void Visit(SqlNativeHint node); - void Visit(SqlNextValue value); - void Visit(SqlNull node); - void Visit(SqlOpenCursor node); - void Visit(SqlOrder node); - void Visit(SqlParameterRef node); - void Visit(SqlRound node); - void Visit(SqlQueryExpression node); - void Visit(SqlQueryRef node); - void Visit(SqlRow node); - void Visit(SqlRowNumber node); - void Visit(SqlRenameTable node); - void Visit(SqlStatementBlock node); - void Visit(SqlTableColumn node); - void Visit(SqlTableRef node); - void Visit(SqlTrim node); - void Visit(SqlSelect node); - void Visit(SqlSubQuery node); - void Visit(SqlUnary node); - void Visit(SqlUpdate node); - void Visit(SqlUserColumn node); - void Visit(SqlUserFunctionCall node); - void Visit(SqlDeclareVariable node); - void Visit(SqlVariable node); - void Visit(SqlVariant node); - void Visit(SqlWhile node); - void Visit(SqlFragment node); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql +{ + /// + /// A contract for visitor of SQL DOM query model. + /// + public interface ISqlVisitor + { + void Visit(SqlAggregate node); + void Visit(SqlAlterDomain node); + void Visit(SqlAlterPartitionFunction node); + void Visit(SqlAlterPartitionScheme node); + void Visit(SqlAlterTable node); + void Visit(SqlAlterSequence node); + void Visit(SqlArray node); + void Visit(SqlAssignment node); + void Visit(SqlBatch node); + void Visit(SqlBetween node); + void Visit(SqlBinary node); + void Visit(SqlBreak node); + void Visit(SqlCase node); + void Visit(SqlCast node); + void Visit(SqlCloseCursor node); + void Visit(SqlCollate node); + void Visit(SqlColumnRef node); + void Visit(SqlConcat node); + void Visit(SqlContainsTable node); + void Visit(SqlContinue node); + void Visit(SqlContainer node); + void Visit(SqlCommand node); + void Visit(SqlCreateAssertion node); + void Visit(SqlCreateCharacterSet node); + void Visit(SqlCreateCollation node); + void Visit(SqlCreateDomain node); + void Visit(SqlCreateIndex node); + void Visit(SqlCreatePartitionFunction node); + void Visit(SqlCreatePartitionScheme node); + void Visit(SqlCreateSchema node); + void Visit(SqlCreateSequence node); + void Visit(SqlCreateTable node); + void Visit(SqlCreateTranslation node); + void Visit(SqlCreateView node); + void Visit(SqlCursor node); + void Visit(SqlDeclareCursor node); + void Visit(SqlDefaultValue node); + void Visit(SqlDelete node); + void Visit(SqlDropAssertion node); + void Visit(SqlDropCharacterSet node); + void Visit(SqlDropCollation node); + void Visit(SqlDropDomain node); + void Visit(SqlDropIndex node); + void Visit(SqlDropPartitionFunction node); + void Visit(SqlDropPartitionScheme node); + void Visit(SqlDropSchema node); + void Visit(SqlDropSequence node); + void Visit(SqlDropTable node); + void Visit(SqlDropTranslation node); + void Visit(SqlDropView node); + void Visit(SqlDynamicFilter node); + void Visit(SqlPlaceholder node); + void Visit(SqlExtract node); + void Visit(SqlFastFirstRowsHint node); + void Visit(SqlFetch node); + void Visit(SqlForceJoinOrderHint node); + void Visit(SqlFreeTextTable node); + void Visit(SqlFunctionCall node); + void Visit(SqlCustomFunctionCall node); + void Visit(SqlIf node); + void Visit(SqlInsert node); + void Visit(SqlJoinExpression node); + void Visit(SqlJoinHint node); + void Visit(SqlLike node); + void Visit(SqlLiteral node); + void Visit(SqlMatch node); + void Visit(SqlNative node); + void Visit(SqlNativeHint node); + void Visit(SqlNextValue value); + void Visit(SqlNull node); + void Visit(SqlOpenCursor node); + void Visit(SqlOrder node); + void Visit(SqlParameterRef node); + void Visit(SqlRound node); + void Visit(SqlQueryExpression node); + void Visit(SqlQueryRef node); + void Visit(SqlRow node); + void Visit(SqlRowNumber node); + void Visit(SqlRenameTable node); + void Visit(SqlStatementBlock node); + void Visit(SqlTableColumn node); + void Visit(SqlTableRef node); + void Visit(SqlTrim node); + void Visit(SqlSelect node); + void Visit(SqlSubQuery node); + void Visit(SqlUnary node); + void Visit(SqlUpdate node); + void Visit(SqlUserColumn node); + void Visit(SqlUserFunctionCall node); + void Visit(SqlDeclareVariable node); + void Visit(SqlVariable node); + void Visit(SqlVariant node); + void Visit(SqlWhile node); + void Visit(SqlFragment node); + } +} diff --git a/Orm/Xtensive.Orm/Sql/Internals/SqlNodeCloneContext.cs b/Orm/Xtensive.Orm/Sql/Internals/SqlNodeCloneContext.cs index 353cf7cef6..66cd2f37c1 100644 --- a/Orm/Xtensive.Orm/Sql/Internals/SqlNodeCloneContext.cs +++ b/Orm/Xtensive.Orm/Sql/Internals/SqlNodeCloneContext.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; - -namespace Xtensive.Sql -{ - internal class SqlNodeCloneContext - { - private Dictionary nodeMapping = new Dictionary(); - - public Dictionary NodeMapping { - get { - return nodeMapping; - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; + +namespace Xtensive.Sql +{ + internal class SqlNodeCloneContext + { + private Dictionary nodeMapping = new Dictionary(); + + public Dictionary NodeMapping { + get { + return nodeMapping; + } + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Internals/SqlValidator.cs b/Orm/Xtensive.Orm/Sql/Internals/SqlValidator.cs index 1058d38c5b..c42811e37d 100644 --- a/Orm/Xtensive.Orm/Sql/Internals/SqlValidator.cs +++ b/Orm/Xtensive.Orm/Sql/Internals/SqlValidator.cs @@ -1,239 +1,239 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql -{ - internal static class SqlValidator - { - private static readonly HashSet supportedTypes; - - public static void EnsureAreSqlRowArguments(IEnumerable nodes) - { - ArgumentValidator.EnsureArgumentNotNull(nodes, "expressions"); - foreach (SqlExpression expression in nodes) - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - } - - public static void EnsureIsBooleanExpression(SqlExpression node) - { - if (!IsBooleanExpression(node)) - throw new ArgumentException(Strings.ExInvalidExpressionType); - } - - public static void EnsureIsCharacterExpression(SqlExpression node) - { - if (!IsCharacterExpression(node)) - throw new ArgumentException(Strings.ExInvalidExpressionType); - } - - public static void EnsureIsRowValueConstructor(SqlExpression node) - { - ArgumentValidator.EnsureArgumentNotNull(node, "expression"); - if (!(IsArithmeticExpression(node) || node is SqlRow || node is SqlSubQuery)) - throw new ArgumentException(Strings.ExInvalidExpressionType); - } - - public static void EnsureIsArithmeticExpression(SqlExpression node) - { - if (!IsArithmeticExpression(node)) - throw new ArgumentException(Strings.ExInvalidExpressionType); - } - - public static void EnsureIsSubSelect(SqlExpression node) - { - ArgumentValidator.EnsureArgumentNotNull(node, "expression"); - if (!(node is SqlSubQuery)) - throw new ArgumentException(Strings.ExInvalidExpressionType); - } - - public static void EnsureIsLimitOffsetArgument(SqlExpression node) - { - ArgumentValidator.EnsureArgumentNotNull(node, "node"); - if (!IsLimitOffsetArgument(node)) - throw new InvalidOperationException(Strings.ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset); - } - - public static bool IsBooleanExpression(SqlExpression node) - { - if (node==null) - return true; - switch (node.NodeType) { - case SqlNodeType.And: - case SqlNodeType.Between: - case SqlNodeType.Case: - case SqlNodeType.Native: - case SqlNodeType.Column: - case SqlNodeType.ColumnRef: - case SqlNodeType.Equals: - case SqlNodeType.Exists: - case SqlNodeType.FunctionCall: - case SqlNodeType.CustomFunctionCall: - case SqlNodeType.GreaterThan: - case SqlNodeType.GreaterThanOrEquals: - case SqlNodeType.In: - case SqlNodeType.IsNull: - case SqlNodeType.IsNotNull: - case SqlNodeType.LessThan: - case SqlNodeType.LessThanOrEquals: - case SqlNodeType.Like: - case SqlNodeType.Not: - case SqlNodeType.NotBetween: - case SqlNodeType.NotIn: - case SqlNodeType.NotEquals: - case SqlNodeType.Null: - case SqlNodeType.Match: - case SqlNodeType.Or: - case SqlNodeType.Overlaps: - case SqlNodeType.Parameter: - case SqlNodeType.SubSelect: - case SqlNodeType.Unique: - case SqlNodeType.Variable: - case SqlNodeType.Placeholder: - case SqlNodeType.DynamicFilter: - return true; - case SqlNodeType.Cast: - return ((SqlCast) node).Type.Type==SqlType.Boolean; - case SqlNodeType.Literal: - return (node is SqlLiteral); - case SqlNodeType.Variant: - var variant = (SqlVariant) node; - return IsBooleanExpression(variant.Main) && IsBooleanExpression(variant.Alternative); - default: - return false; - } - } - - public static bool IsArithmeticExpression(SqlExpression node) - { - if (node==null) - return true; - switch (node.NodeType) { - case SqlNodeType.Add: - case SqlNodeType.Avg: - case SqlNodeType.BitAnd: - case SqlNodeType.BitNot: - case SqlNodeType.BitOr: - case SqlNodeType.BitXor: - case SqlNodeType.Case: - case SqlNodeType.Cast: - case SqlNodeType.Column: - case SqlNodeType.Concat: - case SqlNodeType.Native: - case SqlNodeType.Count: - case SqlNodeType.Divide: - case SqlNodeType.FunctionCall: - case SqlNodeType.CustomFunctionCall: - case SqlNodeType.Literal: - case SqlNodeType.Max: - case SqlNodeType.Min: - case SqlNodeType.Modulo: - case SqlNodeType.Multiply: - case SqlNodeType.Negate: - case SqlNodeType.Null: - case SqlNodeType.Parameter: - case SqlNodeType.Subtract: - case SqlNodeType.SubSelect: - case SqlNodeType.Sum: - case SqlNodeType.Variable: - case SqlNodeType.Extract: - case SqlNodeType.Round: - case SqlNodeType.Placeholder: - case SqlNodeType.DateTimeMinusInterval: - case SqlNodeType.DateTimePlusInterval: - case SqlNodeType.DateTimeMinusDateTime: - return true; - case SqlNodeType.Variant: - var variant = (SqlVariant) node; - return IsArithmeticExpression(variant.Main) && IsArithmeticExpression(variant.Alternative); - default: - return false; - } - } - - public static bool IsCharacterExpression(SqlExpression node) - { - if (node==null) - return true; - if (node is SqlBinary) - return true; // Allow easy operation for SQLite - switch (node.NodeType) { - case SqlNodeType.Add: - case SqlNodeType.Case: - case SqlNodeType.Cast: - case SqlNodeType.Column: - case SqlNodeType.Concat: - case SqlNodeType.Native: - case SqlNodeType.RawConcat: - case SqlNodeType.FunctionCall: - case SqlNodeType.CustomFunctionCall: - case SqlNodeType.Literal: - case SqlNodeType.Null: - case SqlNodeType.Parameter: - case SqlNodeType.SubSelect: - case SqlNodeType.Trim: - case SqlNodeType.Variable: - case SqlNodeType.Placeholder: - return true; - case SqlNodeType.Variant: - var variant = (SqlVariant)node; - return IsCharacterExpression(variant.Main) && IsCharacterExpression(variant.Alternative); - default: - return false; - } - } - - public static bool IsLimitOffsetArgument(SqlExpression node) - { - switch (node.NodeType) { - case SqlNodeType.Literal: - case SqlNodeType.Placeholder: - return true; - case SqlNodeType.Variant: - var variant = (SqlVariant) node; - return IsLimitOffsetArgument(variant.Main) && IsLimitOffsetArgument(variant.Alternative); - default: - return false; - } - } - - public static bool IsLiteralTypeSupported(Type type) - { - return supportedTypes.Contains(type); - } - - // Static constructor - - static SqlValidator() - { - supportedTypes = new[] - { - typeof (bool), - typeof (char), - typeof (sbyte), - typeof (byte), - typeof (short), - typeof (ushort), - typeof (int), - typeof (uint), - typeof (long), - typeof (ulong), - typeof (string), - typeof (float), - typeof (double), - typeof (decimal), - typeof (DateTime), - typeof (DateTimeOffset), - typeof (TimeSpan), - typeof (byte[]), - typeof (Guid) - }.ToHashSet(); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql +{ + internal static class SqlValidator + { + private static readonly HashSet supportedTypes; + + public static void EnsureAreSqlRowArguments(IEnumerable nodes) + { + ArgumentValidator.EnsureArgumentNotNull(nodes, "expressions"); + foreach (SqlExpression expression in nodes) + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + } + + public static void EnsureIsBooleanExpression(SqlExpression node) + { + if (!IsBooleanExpression(node)) + throw new ArgumentException(Strings.ExInvalidExpressionType); + } + + public static void EnsureIsCharacterExpression(SqlExpression node) + { + if (!IsCharacterExpression(node)) + throw new ArgumentException(Strings.ExInvalidExpressionType); + } + + public static void EnsureIsRowValueConstructor(SqlExpression node) + { + ArgumentValidator.EnsureArgumentNotNull(node, "expression"); + if (!(IsArithmeticExpression(node) || node is SqlRow || node is SqlSubQuery)) + throw new ArgumentException(Strings.ExInvalidExpressionType); + } + + public static void EnsureIsArithmeticExpression(SqlExpression node) + { + if (!IsArithmeticExpression(node)) + throw new ArgumentException(Strings.ExInvalidExpressionType); + } + + public static void EnsureIsSubSelect(SqlExpression node) + { + ArgumentValidator.EnsureArgumentNotNull(node, "expression"); + if (!(node is SqlSubQuery)) + throw new ArgumentException(Strings.ExInvalidExpressionType); + } + + public static void EnsureIsLimitOffsetArgument(SqlExpression node) + { + ArgumentValidator.EnsureArgumentNotNull(node, "node"); + if (!IsLimitOffsetArgument(node)) + throw new InvalidOperationException(Strings.ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset); + } + + public static bool IsBooleanExpression(SqlExpression node) + { + if (node==null) + return true; + switch (node.NodeType) { + case SqlNodeType.And: + case SqlNodeType.Between: + case SqlNodeType.Case: + case SqlNodeType.Native: + case SqlNodeType.Column: + case SqlNodeType.ColumnRef: + case SqlNodeType.Equals: + case SqlNodeType.Exists: + case SqlNodeType.FunctionCall: + case SqlNodeType.CustomFunctionCall: + case SqlNodeType.GreaterThan: + case SqlNodeType.GreaterThanOrEquals: + case SqlNodeType.In: + case SqlNodeType.IsNull: + case SqlNodeType.IsNotNull: + case SqlNodeType.LessThan: + case SqlNodeType.LessThanOrEquals: + case SqlNodeType.Like: + case SqlNodeType.Not: + case SqlNodeType.NotBetween: + case SqlNodeType.NotIn: + case SqlNodeType.NotEquals: + case SqlNodeType.Null: + case SqlNodeType.Match: + case SqlNodeType.Or: + case SqlNodeType.Overlaps: + case SqlNodeType.Parameter: + case SqlNodeType.SubSelect: + case SqlNodeType.Unique: + case SqlNodeType.Variable: + case SqlNodeType.Placeholder: + case SqlNodeType.DynamicFilter: + return true; + case SqlNodeType.Cast: + return ((SqlCast) node).Type.Type==SqlType.Boolean; + case SqlNodeType.Literal: + return (node is SqlLiteral); + case SqlNodeType.Variant: + var variant = (SqlVariant) node; + return IsBooleanExpression(variant.Main) && IsBooleanExpression(variant.Alternative); + default: + return false; + } + } + + public static bool IsArithmeticExpression(SqlExpression node) + { + if (node==null) + return true; + switch (node.NodeType) { + case SqlNodeType.Add: + case SqlNodeType.Avg: + case SqlNodeType.BitAnd: + case SqlNodeType.BitNot: + case SqlNodeType.BitOr: + case SqlNodeType.BitXor: + case SqlNodeType.Case: + case SqlNodeType.Cast: + case SqlNodeType.Column: + case SqlNodeType.Concat: + case SqlNodeType.Native: + case SqlNodeType.Count: + case SqlNodeType.Divide: + case SqlNodeType.FunctionCall: + case SqlNodeType.CustomFunctionCall: + case SqlNodeType.Literal: + case SqlNodeType.Max: + case SqlNodeType.Min: + case SqlNodeType.Modulo: + case SqlNodeType.Multiply: + case SqlNodeType.Negate: + case SqlNodeType.Null: + case SqlNodeType.Parameter: + case SqlNodeType.Subtract: + case SqlNodeType.SubSelect: + case SqlNodeType.Sum: + case SqlNodeType.Variable: + case SqlNodeType.Extract: + case SqlNodeType.Round: + case SqlNodeType.Placeholder: + case SqlNodeType.DateTimeMinusInterval: + case SqlNodeType.DateTimePlusInterval: + case SqlNodeType.DateTimeMinusDateTime: + return true; + case SqlNodeType.Variant: + var variant = (SqlVariant) node; + return IsArithmeticExpression(variant.Main) && IsArithmeticExpression(variant.Alternative); + default: + return false; + } + } + + public static bool IsCharacterExpression(SqlExpression node) + { + if (node==null) + return true; + if (node is SqlBinary) + return true; // Allow easy operation for SQLite + switch (node.NodeType) { + case SqlNodeType.Add: + case SqlNodeType.Case: + case SqlNodeType.Cast: + case SqlNodeType.Column: + case SqlNodeType.Concat: + case SqlNodeType.Native: + case SqlNodeType.RawConcat: + case SqlNodeType.FunctionCall: + case SqlNodeType.CustomFunctionCall: + case SqlNodeType.Literal: + case SqlNodeType.Null: + case SqlNodeType.Parameter: + case SqlNodeType.SubSelect: + case SqlNodeType.Trim: + case SqlNodeType.Variable: + case SqlNodeType.Placeholder: + return true; + case SqlNodeType.Variant: + var variant = (SqlVariant)node; + return IsCharacterExpression(variant.Main) && IsCharacterExpression(variant.Alternative); + default: + return false; + } + } + + public static bool IsLimitOffsetArgument(SqlExpression node) + { + switch (node.NodeType) { + case SqlNodeType.Literal: + case SqlNodeType.Placeholder: + return true; + case SqlNodeType.Variant: + var variant = (SqlVariant) node; + return IsLimitOffsetArgument(variant.Main) && IsLimitOffsetArgument(variant.Alternative); + default: + return false; + } + } + + public static bool IsLiteralTypeSupported(Type type) + { + return supportedTypes.Contains(type); + } + + // Static constructor + + static SqlValidator() + { + supportedTypes = new[] + { + typeof (bool), + typeof (char), + typeof (sbyte), + typeof (byte), + typeof (short), + typeof (ushort), + typeof (int), + typeof (uint), + typeof (long), + typeof (ulong), + typeof (string), + typeof (float), + typeof (double), + typeof (decimal), + typeof (DateTime), + typeof (DateTimeOffset), + typeof (TimeSpan), + typeof (byte[]), + typeof (Guid) + }.ToHashSet(); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Action.cs b/Orm/Xtensive.Orm/Sql/Model/Action.cs index b4ce712e33..95200cfa25 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Action.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Action.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - [Flags] - [Serializable] - public enum Action - { - All = 0x01, - Delete = 0x02, - Insert = 0x04, - Update = 0x08, - Refrences = 0x10, - Usage = 0x20, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + [Flags] + [Serializable] + public enum Action + { + All = 0x01, + Delete = 0x02, + Insert = 0x04, + Update = 0x08, + Refrences = 0x10, + Usage = 0x20, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/BoundaryType.cs b/Orm/Xtensive.Orm/Sql/Model/BoundaryType.cs index e02c2567ec..7b39da0ea1 100644 --- a/Orm/Xtensive.Orm/Sql/Model/BoundaryType.cs +++ b/Orm/Xtensive.Orm/Sql/Model/BoundaryType.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Specifies to which side of each boundary value interval, left or right, the boundary value - /// belongs. - /// - [Serializable] - public enum BoundaryType - { - /// - /// Default value is equal to . - /// - Default = 0, - /// - /// Specifies that boundary value belongs to the left side of boundary value interval. - /// - Left = 0, - /// - /// Specifies that boundary value belongs to the right side of boundary value interval. - /// - Right = 1, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Specifies to which side of each boundary value interval, left or right, the boundary value + /// belongs. + /// + [Serializable] + public enum BoundaryType + { + /// + /// Default value is equal to . + /// + Default = 0, + /// + /// Specifies that boundary value belongs to the left side of boundary value interval. + /// + Left = 0, + /// + /// Specifies that boundary value belongs to the right side of boundary value interval. + /// + Right = 1, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Catalog.cs b/Orm/Xtensive.Orm/Sql/Model/Catalog.cs index 06083334f0..d7259e16c0 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Catalog.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Catalog.cs @@ -1,207 +1,207 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a single database catalog that can contain multiple database schemas. - /// - [Serializable] - public class Catalog : Node - { - private bool isNamesReadingDenied = false; - - private Schema defaultSchema; - private PairedNodeCollection schemas; - private PairedNodeCollection partitionFunctions; - private PairedNodeCollection partitionSchemas; - - /// - public override string Name - { - get { - if (!isNamesReadingDenied) - return base.Name; - throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); - } - set { - if (!isNamesReadingDenied) - base.Name = value; - else - throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); - } - } - - /// - public override string DbName - { - get { - if (!isNamesReadingDenied) - return base.DbName; - throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); - } - set { - if (!isNamesReadingDenied) - base.DbName = value; - else - throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); - } - } - - /// - /// Creates a schema. - /// - /// The name. - /// - public Schema CreateSchema(string name) - { - return new Schema(this, name); - } - - /// - /// Creates the partition function. - /// - /// The name. - /// Type of the input parameter. - /// The boundary values. - public PartitionFunction CreatePartitionFunction(string name, SqlValueType dataType, params string[] boundaryValues) - { - return new PartitionFunction(this, name, dataType, boundaryValues); - } - - /// - /// Creates the partition schema. - /// - /// The name. - /// The partition function. - /// The filegroups. - public PartitionSchema CreatePartitionSchema(string name, PartitionFunction partitionFunction, params string[] filegroups) - { - return new PartitionSchema(this, name, partitionFunction, filegroups); - } - - /// - /// Default of this instance. - /// - /// - public Schema DefaultSchema - { - get - { - if (defaultSchema != null) - return defaultSchema; - if (Schemas.Count > 0) - return Schemas[0]; - return null; - } - set { - this.EnsureNotLocked(); - if (defaultSchema == value) - return; - if (value!=null && !schemas.Contains(value)) - schemas.Add(value); - defaultSchema = value; - } - } - - /// - /// Gets the schemas. - /// - /// The schemas. - public PairedNodeCollection Schemas - { - get { return schemas; } - } - - /// - /// Gets the partition functions. - /// - /// The partition functions. - public PairedNodeCollection PartitionFunctions - { - get - { - if (partitionFunctions==null) - partitionFunctions = new PairedNodeCollection(this, "PartitionFunctions"); - return partitionFunctions; - } - } - - /// - /// Gets the partition schemes. - /// - /// The partition schemes. - public PairedNodeCollection PartitionSchemas - { - get - { - if (partitionSchemas==null) - partitionSchemas = - new PairedNodeCollection(this, "PartitionSchemas"); - return partitionSchemas; - } - } - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - schemas.Lock(recursive); - } - - #endregion - - internal void MakeNamesUnreadable() - { - isNamesReadingDenied = true; - this.Schemas.ForEach(s => s.MakeNamesUnreadable()); - this.PartitionFunctions.ForEach(pf => pf.MakeNamesUnreadable()); - this.PartitionSchemas.ForEach(ps => ps.MakeNamesUnreadable()); - } - - internal string GetActualName(IDictionary catalogNameMap) - { - if (!isNamesReadingDenied) - return Name; - if (catalogNameMap==null) - throw new ArgumentNullException("catalogNameMap"); - - var name = GetNameInternal(); - string actualName; - if (catalogNameMap.TryGetValue(name, out actualName)) - return actualName; - return name; - } - - internal string GetActualDbName(IDictionary catalogNameMap) - { - if (!isNamesReadingDenied) - return DbName; - if (catalogNameMap==null) - throw new InvalidOperationException("Unable to calculate real name for catalog"); - var name = GetDbNameInternal(); - string actualName; - if (catalogNameMap.TryGetValue(name, out actualName)) - return actualName; - return name; - } - - // Constructors - - public Catalog(string name) : base(name) - { - schemas = - new PairedNodeCollection(this, "Schemas", 1); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a single database catalog that can contain multiple database schemas. + /// + [Serializable] + public class Catalog : Node + { + private bool isNamesReadingDenied = false; + + private Schema defaultSchema; + private PairedNodeCollection schemas; + private PairedNodeCollection partitionFunctions; + private PairedNodeCollection partitionSchemas; + + /// + public override string Name + { + get { + if (!isNamesReadingDenied) + return base.Name; + throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); + } + set { + if (!isNamesReadingDenied) + base.Name = value; + else + throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); + } + } + + /// + public override string DbName + { + get { + if (!isNamesReadingDenied) + return base.DbName; + throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); + } + set { + if (!isNamesReadingDenied) + base.DbName = value; + else + throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); + } + } + + /// + /// Creates a schema. + /// + /// The name. + /// + public Schema CreateSchema(string name) + { + return new Schema(this, name); + } + + /// + /// Creates the partition function. + /// + /// The name. + /// Type of the input parameter. + /// The boundary values. + public PartitionFunction CreatePartitionFunction(string name, SqlValueType dataType, params string[] boundaryValues) + { + return new PartitionFunction(this, name, dataType, boundaryValues); + } + + /// + /// Creates the partition schema. + /// + /// The name. + /// The partition function. + /// The filegroups. + public PartitionSchema CreatePartitionSchema(string name, PartitionFunction partitionFunction, params string[] filegroups) + { + return new PartitionSchema(this, name, partitionFunction, filegroups); + } + + /// + /// Default of this instance. + /// + /// + public Schema DefaultSchema + { + get + { + if (defaultSchema != null) + return defaultSchema; + if (Schemas.Count > 0) + return Schemas[0]; + return null; + } + set { + this.EnsureNotLocked(); + if (defaultSchema == value) + return; + if (value!=null && !schemas.Contains(value)) + schemas.Add(value); + defaultSchema = value; + } + } + + /// + /// Gets the schemas. + /// + /// The schemas. + public PairedNodeCollection Schemas + { + get { return schemas; } + } + + /// + /// Gets the partition functions. + /// + /// The partition functions. + public PairedNodeCollection PartitionFunctions + { + get + { + if (partitionFunctions==null) + partitionFunctions = new PairedNodeCollection(this, "PartitionFunctions"); + return partitionFunctions; + } + } + + /// + /// Gets the partition schemes. + /// + /// The partition schemes. + public PairedNodeCollection PartitionSchemas + { + get + { + if (partitionSchemas==null) + partitionSchemas = + new PairedNodeCollection(this, "PartitionSchemas"); + return partitionSchemas; + } + } + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + schemas.Lock(recursive); + } + + #endregion + + internal void MakeNamesUnreadable() + { + isNamesReadingDenied = true; + this.Schemas.ForEach(s => s.MakeNamesUnreadable()); + this.PartitionFunctions.ForEach(pf => pf.MakeNamesUnreadable()); + this.PartitionSchemas.ForEach(ps => ps.MakeNamesUnreadable()); + } + + internal string GetActualName(IDictionary catalogNameMap) + { + if (!isNamesReadingDenied) + return Name; + if (catalogNameMap==null) + throw new ArgumentNullException("catalogNameMap"); + + var name = GetNameInternal(); + string actualName; + if (catalogNameMap.TryGetValue(name, out actualName)) + return actualName; + return name; + } + + internal string GetActualDbName(IDictionary catalogNameMap) + { + if (!isNamesReadingDenied) + return DbName; + if (catalogNameMap==null) + throw new InvalidOperationException("Unable to calculate real name for catalog"); + var name = GetDbNameInternal(); + string actualName; + if (catalogNameMap.TryGetValue(name, out actualName)) + return actualName; + return name; + } + + // Constructors + + public Catalog(string name) : base(name) + { + schemas = + new PairedNodeCollection(this, "Schemas", 1); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/CatalogHelper.cs b/Orm/Xtensive.Orm/Sql/Model/CatalogHelper.cs index 98f882b2fb..063acfdb84 100644 --- a/Orm/Xtensive.Orm/Sql/Model/CatalogHelper.cs +++ b/Orm/Xtensive.Orm/Sql/Model/CatalogHelper.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2015 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2015.09.03 - -using System; -using System.Linq; - -namespace Xtensive.Sql.Model -{ - [Obsolete] - public class CatalogHelper - { - public static void MoveSchemaNodes(Catalog catalog, string sourceSchemaName, string targetSchemaName) - { - var sourceSchema = catalog.Schemas[sourceSchemaName]; - var targetSchema = catalog.Schemas[targetSchemaName]; - - ChangeSchemaOfNodeCollection(sourceSchema.Sequences, targetSchema); - ChangeSchemaOfNodeCollection(sourceSchema.Tables, targetSchema); - ChangeSchemaOfNodeCollection(sourceSchema.Views, targetSchema); - ChangeSchemaOfNodeCollection(sourceSchema.Collations, targetSchema); - } - - private static void ChangeSchemaOfNodeCollection(NodeCollection nodeCollection, Schema targetSchema) where T : SchemaNode - { - var localCollectionExpression = nodeCollection.ToList(); - foreach (var node in localCollectionExpression) - node.Schema = targetSchema; - } - } -} +// Copyright (C) 2015 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2015.09.03 + +using System; +using System.Linq; + +namespace Xtensive.Sql.Model +{ + [Obsolete] + public class CatalogHelper + { + public static void MoveSchemaNodes(Catalog catalog, string sourceSchemaName, string targetSchemaName) + { + var sourceSchema = catalog.Schemas[sourceSchemaName]; + var targetSchema = catalog.Schemas[targetSchemaName]; + + ChangeSchemaOfNodeCollection(sourceSchema.Sequences, targetSchema); + ChangeSchemaOfNodeCollection(sourceSchema.Tables, targetSchema); + ChangeSchemaOfNodeCollection(sourceSchema.Views, targetSchema); + ChangeSchemaOfNodeCollection(sourceSchema.Collations, targetSchema); + } + + private static void ChangeSchemaOfNodeCollection(NodeCollection nodeCollection, Schema targetSchema) where T : SchemaNode + { + var localCollectionExpression = nodeCollection.ToList(); + foreach (var node in localCollectionExpression) + node.Schema = targetSchema; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/CatalogNode.cs b/Orm/Xtensive.Orm/Sql/Model/CatalogNode.cs index 57a1d77728..061ec72bcd 100644 --- a/Orm/Xtensive.Orm/Sql/Model/CatalogNode.cs +++ b/Orm/Xtensive.Orm/Sql/Model/CatalogNode.cs @@ -1,136 +1,136 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a bound object. - /// - [Serializable] - public abstract class CatalogNode : Node, IPairedNode - { - private Catalog catalog; - private bool isNamesReadingDenied = false; - - /// - public override string Name - { - get { - if (!isNamesReadingDenied) - return base.Name; - throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); - } - set { - if (!isNamesReadingDenied) - base.Name = value; - else - throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); - } - } - - /// - public override string DbName - { - get { - if (!isNamesReadingDenied) - return base.DbName; - throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); - } - set { - if (!isNamesReadingDenied) - base.DbName = value; - else - throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); - } - } - - /// - /// Gets or sets the this instance belongs to. - /// - /// The catalog this instance belongs to. - public Catalog Catalog - { - get { return catalog; } - set { - this.EnsureNotLocked(); - if (catalog != value) - ChangeCatalog(value); - } - } - - /// - /// Changes the catalog. - /// - /// The new value of catalog property. - protected abstract void ChangeCatalog(Catalog value); - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, Catalog value) - { - this.EnsureNotLocked(); - catalog = value; - } - - #endregion - - internal void MakeNamesUnreadable() - { - isNamesReadingDenied = true; - } - - internal string GetActualName(IDictionary nodeNameMap) - { - if (!isNamesReadingDenied) - return Name; - if (nodeNameMap==null) - throw new ArgumentNullException("nodeNameMap"); - - var name = GetNameInternal(); - string actualName; - if (nodeNameMap.TryGetValue(name, out actualName)) - return actualName; - return name; - } - - internal string GetActualDbName(IDictionary nodeNameMap) - { - if (!isNamesReadingDenied) - return DbName; - if (nodeNameMap==null) - throw new ArgumentNullException("nodeNameMap"); - - var name = GetDbNameInternal(); - string actualName; - if (nodeNameMap.TryGetValue(name, out actualName)) - return actualName; - return name; - } - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The catalog. - /// The name. - protected CatalogNode(Catalog catalog, string name) - : base(name) - { - ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); - Catalog = catalog; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a bound object. + /// + [Serializable] + public abstract class CatalogNode : Node, IPairedNode + { + private Catalog catalog; + private bool isNamesReadingDenied = false; + + /// + public override string Name + { + get { + if (!isNamesReadingDenied) + return base.Name; + throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); + } + set { + if (!isNamesReadingDenied) + base.Name = value; + else + throw new InvalidOperationException(Strings.ExNameValueReadingOrSettingIsDenied); + } + } + + /// + public override string DbName + { + get { + if (!isNamesReadingDenied) + return base.DbName; + throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); + } + set { + if (!isNamesReadingDenied) + base.DbName = value; + else + throw new InvalidOperationException(Strings.ExDbNameValueReadingOrSettingIsDenied); + } + } + + /// + /// Gets or sets the this instance belongs to. + /// + /// The catalog this instance belongs to. + public Catalog Catalog + { + get { return catalog; } + set { + this.EnsureNotLocked(); + if (catalog != value) + ChangeCatalog(value); + } + } + + /// + /// Changes the catalog. + /// + /// The new value of catalog property. + protected abstract void ChangeCatalog(Catalog value); + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, Catalog value) + { + this.EnsureNotLocked(); + catalog = value; + } + + #endregion + + internal void MakeNamesUnreadable() + { + isNamesReadingDenied = true; + } + + internal string GetActualName(IDictionary nodeNameMap) + { + if (!isNamesReadingDenied) + return Name; + if (nodeNameMap==null) + throw new ArgumentNullException("nodeNameMap"); + + var name = GetNameInternal(); + string actualName; + if (nodeNameMap.TryGetValue(name, out actualName)) + return actualName; + return name; + } + + internal string GetActualDbName(IDictionary nodeNameMap) + { + if (!isNamesReadingDenied) + return DbName; + if (nodeNameMap==null) + throw new ArgumentNullException("nodeNameMap"); + + var name = GetDbNameInternal(); + string actualName; + if (nodeNameMap.TryGetValue(name, out actualName)) + return actualName; + return name; + } + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The catalog. + /// The name. + protected CatalogNode(Catalog catalog, string name) + : base(name) + { + ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); + Catalog = catalog; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/ChangeTrackingMode.cs b/Orm/Xtensive.Orm/Sql/Model/ChangeTrackingMode.cs index 7c21f9e884..4042503105 100644 --- a/Orm/Xtensive.Orm/Sql/Model/ChangeTrackingMode.cs +++ b/Orm/Xtensive.Orm/Sql/Model/ChangeTrackingMode.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2017.06.17 - -namespace Xtensive.Sql.Model -{ - /// - /// Enumeartes possible full-text change tracking modes. - /// - public enum ChangeTrackingMode - { - /// - /// The tracked changes will be propagated as data is modified (automatic population). - /// - Auto = 0, - - /// - /// The tracked changes will be propagated manually (manual population). - /// - Manual = 1, - - /// - /// Storage does not keep a list of changes to the indexed data. Indexes will be populated after they are created. - /// - Off = 2, - - /// - /// Storage does not keep a list of changes to the indexed data. Indexes' population should be started manually. - /// - OffWithNoPopulation = 3, - - /// - /// Default change tracking mode. - /// - Default = Auto, - } -} +// Copyright (C) 2017 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2017.06.17 + +namespace Xtensive.Sql.Model +{ + /// + /// Enumeartes possible full-text change tracking modes. + /// + public enum ChangeTrackingMode + { + /// + /// The tracked changes will be propagated as data is modified (automatic population). + /// + Auto = 0, + + /// + /// The tracked changes will be propagated manually (manual population). + /// + Manual = 1, + + /// + /// Storage does not keep a list of changes to the indexed data. Indexes will be populated after they are created. + /// + Off = 2, + + /// + /// Storage does not keep a list of changes to the indexed data. Indexes' population should be started manually. + /// + OffWithNoPopulation = 3, + + /// + /// Default change tracking mode. + /// + Default = Auto, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/CharacterSet.cs b/Orm/Xtensive.Orm/Sql/Model/CharacterSet.cs index 721bfc966b..f173e786d3 100644 --- a/Orm/Xtensive.Orm/Sql/Model/CharacterSet.cs +++ b/Orm/Xtensive.Orm/Sql/Model/CharacterSet.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a character set object. - /// - [Serializable] - public class CharacterSet : SchemaNode - { - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.CharacterSets.Remove(this); - if (value!=null) - value.CharacterSets.Add(this); - } - - #endregion - - #region Constructors - - internal CharacterSet(Schema schema, string name) : base(schema, name) - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a character set object. + /// + [Serializable] + public class CharacterSet : SchemaNode + { + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.CharacterSets.Remove(this); + if (value!=null) + value.CharacterSets.Add(this); + } + + #endregion + + #region Constructors + + internal CharacterSet(Schema schema, string name) : base(schema, name) + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/CheckOptions.cs b/Orm/Xtensive.Orm/Sql/Model/CheckOptions.cs index 3fd3c78a9d..4967498c5e 100644 --- a/Orm/Xtensive.Orm/Sql/Model/CheckOptions.cs +++ b/Orm/Xtensive.Orm/Sql/Model/CheckOptions.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Levels of checking to be done when inserting or updating data through a view. - /// - [Serializable] - public enum CheckOptions - { - /// - /// The same as . - /// - Default = None, - - /// - /// None check options are set. - /// - None = 0, - - /// - /// This option is identical to option except that you can update - /// a row so that it no longer can be retrieved through the view. - /// This can only happen when the view is directly or indirectly dependent on a view - /// that was defined with no WITH CHECK OPTION clause. - /// - Local = 1, - - /// - /// This option specifies that every row that is inserted or updated through the view - /// must conform to the definition of the view. In addition, the search conditions - /// of all dependent views are checked when a row is inserted or updated. If a row - /// does not conform to the definition of the view, that row cannot be retrieved using the view. - /// - Cascaded = 2, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Levels of checking to be done when inserting or updating data through a view. + /// + [Serializable] + public enum CheckOptions + { + /// + /// The same as . + /// + Default = None, + + /// + /// None check options are set. + /// + None = 0, + + /// + /// This option is identical to option except that you can update + /// a row so that it no longer can be retrieved through the view. + /// This can only happen when the view is directly or indirectly dependent on a view + /// that was defined with no WITH CHECK OPTION clause. + /// + Local = 1, + + /// + /// This option specifies that every row that is inserted or updated through the view + /// must conform to the definition of the view. In addition, the search conditions + /// of all dependent views are checked when a row is inserted or updated. If a row + /// does not conform to the definition of the view, that row cannot be retrieved using the view. + /// + Cascaded = 2, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Collation.cs b/Orm/Xtensive.Orm/Sql/Model/Collation.cs index 45808460d4..5038e26887 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Collation.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Collation.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a collation object thst specifies the rules for how strings - /// of character data are sorted and compared, based on the norms of - /// particular languages and locales. - /// - [Serializable] - public class Collation : SchemaNode - { - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Collations.Remove(this); - if (value!=null) - value.Collations.Add(this); - } - - #endregion - - #region Constructors - - internal Collation(Schema schema, string name) : base(schema, name) - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a collation object thst specifies the rules for how strings + /// of character data are sorted and compared, based on the norms of + /// particular languages and locales. + /// + [Serializable] + public class Collation : SchemaNode + { + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Collations.Remove(this); + if (value!=null) + value.Collations.Add(this); + } + + #endregion + + #region Constructors + + internal Collation(Schema schema, string name) : base(schema, name) + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/Assertion.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/Assertion.cs index 100b0f0a4f..48f6713161 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/Assertion.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/Assertion.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a named constraint that may relate to the content - /// of individual rows of a table, to the entire contents of a table, - /// or to a state required to exist among a number of tables. - /// - [Serializable] - public class Assertion : SchemaNode - { - private Constraint constraint; - - /// - /// Gets or sets the check condition for this instance. - /// - /// The condition. - public SqlExpression Condition - { - get { return constraint.Condition; } - set { constraint.Condition = value; } - } - - /// - /// Indicates that the constraint is deferrable or not. - /// - /// - public bool? IsDeferrable - { - get { return constraint.IsDeferrable; } - set { constraint.IsDeferrable = value; } - } - - /// - /// Indicates that the initial constraint mode is deferred or not. - /// - /// - public bool? IsInitiallyDeferred - { - get { return constraint.IsInitiallyDeferred; } - set { constraint.IsInitiallyDeferred = value; } - } - - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Assertions.Remove(this); - if (value!=null) - value.Assertions.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - constraint.Lock(recursive); - } - - #endregion - - #region Constructors - - internal Assertion(Schema schema, string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(schema, name) - { - constraint = new Constraint(name, condition, isDeferrable, isInitiallyDeferred); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a named constraint that may relate to the content + /// of individual rows of a table, to the entire contents of a table, + /// or to a state required to exist among a number of tables. + /// + [Serializable] + public class Assertion : SchemaNode + { + private Constraint constraint; + + /// + /// Gets or sets the check condition for this instance. + /// + /// The condition. + public SqlExpression Condition + { + get { return constraint.Condition; } + set { constraint.Condition = value; } + } + + /// + /// Indicates that the constraint is deferrable or not. + /// + /// + public bool? IsDeferrable + { + get { return constraint.IsDeferrable; } + set { constraint.IsDeferrable = value; } + } + + /// + /// Indicates that the initial constraint mode is deferred or not. + /// + /// + public bool? IsInitiallyDeferred + { + get { return constraint.IsInitiallyDeferred; } + set { constraint.IsInitiallyDeferred = value; } + } + + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Assertions.Remove(this); + if (value!=null) + value.Assertions.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + constraint.Lock(recursive); + } + + #endregion + + #region Constructors + + internal Assertion(Schema schema, string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(schema, name) + { + constraint = new Constraint(name, condition, isDeferrable, isInitiallyDeferred); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/CheckConstraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/CheckConstraint.cs index 2c36f20963..4731c33669 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/CheckConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/CheckConstraint.cs @@ -1,22 +1,22 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents check constraint. - /// - public class CheckConstraint : TableConstraint - { - // Constructors - - internal CheckConstraint(Table table, string name, SqlExpression condition) - : base(table, name, condition, null, null) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents check constraint. + /// + public class CheckConstraint : TableConstraint + { + // Constructors + + internal CheckConstraint(Table table, string name, SqlExpression condition) + : base(table, name, condition, null, null) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/Constraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/Constraint.cs index 676b06822f..8c5d3c6ab7 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/Constraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/Constraint.cs @@ -1,126 +1,126 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents integrity constraint object. - /// - [Serializable] - public class Constraint : Node - { - private bool? isDeferrable; - private bool? isInitiallyDeferred; - private SqlExpression condition; - - /// - /// Indicates that the constraint is deferrable or not. - /// - /// - public bool? IsDeferrable - { - get { return isDeferrable; } - set - { - this.EnsureNotLocked(); - isDeferrable = value; - } - } - - /// - /// Indicates that the initial constraint mode is deferred or not. - /// - /// - public bool? IsInitiallyDeferred - { - get { return isInitiallyDeferred; } - set - { - this.EnsureNotLocked(); - isInitiallyDeferred = value; - } - } - - /// - /// Gets or sets the check condition for this instance. - /// - /// The condition. - public SqlExpression Condition - { - get { return condition; } - set - { - this.EnsureNotLocked(); - condition = value; - } - } - - #region Constructors - - internal protected Constraint(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name) - { - this.isDeferrable = isDeferrable; - this.isInitiallyDeferred = isInitiallyDeferred; - this.condition = condition; - } - - #endregion - } - - /// - /// Represents integrity constraint object. - /// - [Serializable] - public abstract class Constraint : Constraint, IPairedNode where T: Node, IConstrainable - { - private T owner; - - /// - /// Gets or sets the constraint owner. - /// - /// The owner. - public T Owner - { - get { return owner; } - set - { - this.EnsureNotLocked(); - ChangeOwner(value); - } - } - - /// - /// Changes the owner. - /// - /// The owner. - protected abstract void ChangeOwner(T value); - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, T value) - { - this.EnsureNotLocked(); - owner = value; - } - - #endregion - - #region Constructors - - internal protected Constraint(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name, condition, isDeferrable, isInitiallyDeferred) - { - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents integrity constraint object. + /// + [Serializable] + public class Constraint : Node + { + private bool? isDeferrable; + private bool? isInitiallyDeferred; + private SqlExpression condition; + + /// + /// Indicates that the constraint is deferrable or not. + /// + /// + public bool? IsDeferrable + { + get { return isDeferrable; } + set + { + this.EnsureNotLocked(); + isDeferrable = value; + } + } + + /// + /// Indicates that the initial constraint mode is deferred or not. + /// + /// + public bool? IsInitiallyDeferred + { + get { return isInitiallyDeferred; } + set + { + this.EnsureNotLocked(); + isInitiallyDeferred = value; + } + } + + /// + /// Gets or sets the check condition for this instance. + /// + /// The condition. + public SqlExpression Condition + { + get { return condition; } + set + { + this.EnsureNotLocked(); + condition = value; + } + } + + #region Constructors + + internal protected Constraint(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name) + { + this.isDeferrable = isDeferrable; + this.isInitiallyDeferred = isInitiallyDeferred; + this.condition = condition; + } + + #endregion + } + + /// + /// Represents integrity constraint object. + /// + [Serializable] + public abstract class Constraint : Constraint, IPairedNode where T: Node, IConstrainable + { + private T owner; + + /// + /// Gets or sets the constraint owner. + /// + /// The owner. + public T Owner + { + get { return owner; } + set + { + this.EnsureNotLocked(); + ChangeOwner(value); + } + } + + /// + /// Changes the owner. + /// + /// The owner. + protected abstract void ChangeOwner(T value); + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, T value) + { + this.EnsureNotLocked(); + owner = value; + } + + #endregion + + #region Constructors + + internal protected Constraint(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name, condition, isDeferrable, isInitiallyDeferred) + { + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/DefaultConstraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/DefaultConstraint.cs index b15e00cf03..d866545bcc 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/DefaultConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/DefaultConstraint.cs @@ -1,38 +1,38 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.06.07 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents default constraint. - /// - [Serializable] - public sealed class DefaultConstraint : TableConstraint - { - /// - /// Gets the column. - /// - public TableColumn Column { get; private set; } - - /// - /// Gets or sets value indicates that name of constraint is stale. - /// - public bool NameIsStale { get; internal set; } - - // Constructors - - internal DefaultConstraint(Table table, string name, TableColumn column) - : base(table, name) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - Column = column; - NameIsStale = false; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.06.07 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents default constraint. + /// + [Serializable] + public sealed class DefaultConstraint : TableConstraint + { + /// + /// Gets the column. + /// + public TableColumn Column { get; private set; } + + /// + /// Gets or sets value indicates that name of constraint is stale. + /// + public bool NameIsStale { get; internal set; } + + // Constructors + + internal DefaultConstraint(Table table, string name, TableColumn column) + : base(table, name) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + Column = column; + NameIsStale = false; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/DomainConstraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/DomainConstraint.cs index c0d983deae..ab2502749d 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/DomainConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/DomainConstraint.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a constraint object. - /// - [Serializable] - public class DomainConstraint : Constraint - { - /// - /// Gets or sets the this instance belongs to. - /// - /// The domain. - public Domain Domain - { - get { return Owner; } - set { Owner = value; } - } - - #region Constraint Members - - /// - /// Changes the domain. - /// - /// The value. - protected override void ChangeOwner(Domain value) - { - if (Domain!=null) - Domain.DomainConstraints.Remove(this); - if (value!=null) - value.DomainConstraints.Add(this); - } - - #endregion - - #region Constructors - - internal DomainConstraint(Domain domain, string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name, condition, isDeferrable, isInitiallyDeferred) - { - Domain = domain; - } - - internal DomainConstraint(Domain domain, string name, SqlExpression condition) : this(domain, name, condition, null, null) - { - Domain = domain; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a constraint object. + /// + [Serializable] + public class DomainConstraint : Constraint + { + /// + /// Gets or sets the this instance belongs to. + /// + /// The domain. + public Domain Domain + { + get { return Owner; } + set { Owner = value; } + } + + #region Constraint Members + + /// + /// Changes the domain. + /// + /// The value. + protected override void ChangeOwner(Domain value) + { + if (Domain!=null) + Domain.DomainConstraints.Remove(this); + if (value!=null) + value.DomainConstraints.Add(this); + } + + #endregion + + #region Constructors + + internal DomainConstraint(Domain domain, string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) : base(name, condition, isDeferrable, isInitiallyDeferred) + { + Domain = domain; + } + + internal DomainConstraint(Domain domain, string name, SqlExpression condition) : this(domain, name, condition, null, null) + { + Domain = domain; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/ForeignKey.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/ForeignKey.cs index ac29eb6bc4..a411e1bbcb 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/ForeignKey.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/ForeignKey.cs @@ -1,113 +1,113 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a foreign key constraint that provides referential integrity - /// for the data in the column or columns. constraints require that - /// each value in the column exists in the corresponding referenced column or columns - /// in the referenced table. - /// - [Serializable] - public class ForeignKey : TableConstraint - { - private NodeCollection columns = new NodeCollection(); - private Table referencedTable; - private NodeCollection referencedColumns = new NodeCollection(); - private SqlMatchType matchType = SqlMatchType.None; - private ReferentialAction onUpdate = ReferentialAction.NoAction; - private ReferentialAction onDelete = ReferentialAction.NoAction; - - /// - /// Gets the referencing columns. - /// - /// The referencing columns. - public NodeCollection Columns - { - get { return columns; } - } - - /// - /// Gets the referenced columns. - /// - /// The referenced columns. - public NodeCollection ReferencedColumns - { - get { return referencedColumns; } - } - - /// - /// Gets or sets the referenced table. - /// - /// The referenced table. - public Table ReferencedTable - { - get { return referencedTable; } - set { referencedTable = value; } - } - - /// - /// Match type. - /// - /// - public SqlMatchType MatchType - { - get { return matchType; } - set { matchType = value; } - } - - /// - /// Specifies what action happens to rows in the table - /// when those rows have a referential relationship - /// and the referenced row is updated in the parent table. - /// - /// - public ReferentialAction OnUpdate - { - get { return onUpdate; } - set { onUpdate = value; } - } - - /// - /// Specifies what action happens to rows in the table, - /// if those rows have a referential relationship and - /// the referenced row is deleted from the parent table. - /// - /// - public ReferentialAction OnDelete - { - get { return onDelete; } - set { onDelete = value; } - } - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - columns.Lock(recursive); - referencedColumns.Lock(recursive); - } - - #endregion - - #region Constructors - - internal ForeignKey(Table table, string name) : base(table, name) - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a foreign key constraint that provides referential integrity + /// for the data in the column or columns. constraints require that + /// each value in the column exists in the corresponding referenced column or columns + /// in the referenced table. + /// + [Serializable] + public class ForeignKey : TableConstraint + { + private NodeCollection columns = new NodeCollection(); + private Table referencedTable; + private NodeCollection referencedColumns = new NodeCollection(); + private SqlMatchType matchType = SqlMatchType.None; + private ReferentialAction onUpdate = ReferentialAction.NoAction; + private ReferentialAction onDelete = ReferentialAction.NoAction; + + /// + /// Gets the referencing columns. + /// + /// The referencing columns. + public NodeCollection Columns + { + get { return columns; } + } + + /// + /// Gets the referenced columns. + /// + /// The referenced columns. + public NodeCollection ReferencedColumns + { + get { return referencedColumns; } + } + + /// + /// Gets or sets the referenced table. + /// + /// The referenced table. + public Table ReferencedTable + { + get { return referencedTable; } + set { referencedTable = value; } + } + + /// + /// Match type. + /// + /// + public SqlMatchType MatchType + { + get { return matchType; } + set { matchType = value; } + } + + /// + /// Specifies what action happens to rows in the table + /// when those rows have a referential relationship + /// and the referenced row is updated in the parent table. + /// + /// + public ReferentialAction OnUpdate + { + get { return onUpdate; } + set { onUpdate = value; } + } + + /// + /// Specifies what action happens to rows in the table, + /// if those rows have a referential relationship and + /// the referenced row is deleted from the parent table. + /// + /// + public ReferentialAction OnDelete + { + get { return onDelete; } + set { onDelete = value; } + } + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + columns.Lock(recursive); + referencedColumns.Lock(recursive); + } + + #endregion + + #region Constructors + + internal ForeignKey(Table table, string name) : base(table, name) + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/PrimaryKey.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/PrimaryKey.cs index 5d5bdc3ff0..9ca9d85ef9 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/PrimaryKey.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/PrimaryKey.cs @@ -1,21 +1,21 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents primary key constraint. - /// - [Serializable] - public class PrimaryKey - : UniqueConstraint - { - internal PrimaryKey(Table table, string name, params TableColumn[] columns) - : base(table, name, columns) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents primary key constraint. + /// + [Serializable] + public class PrimaryKey + : UniqueConstraint + { + internal PrimaryKey(Table table, string name, params TableColumn[] columns) + : base(table, name, columns) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/TableConstraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/TableConstraint.cs index 6e52ce265e..5b10514197 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/TableConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/TableConstraint.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a base constraint object. - /// - [Serializable] - public abstract class TableConstraint - : Constraint
- { - /// - /// Gets or sets the this instance belongs to. - /// - /// The table. - public Table Table - { - get { return Owner; } - set { Owner = value; } - } - - /// - /// Changes the table. - /// - /// The value. - protected override void ChangeOwner(Table value) - { - if (Table != null) - Table.TableConstraints.Remove(this); - if (value != null) - value.TableConstraints.Add(this); - } - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The table. - /// The name. - /// The condition. - /// Is constraint deferrable. - /// Is constraint initially deferred. - protected TableConstraint(Table table, string name, SqlExpression condition, bool? isDeferrable, - bool? isInitiallyDeferred) - : base(name, condition, isDeferrable, isInitiallyDeferred) - { - Table = table; - } - - /// - /// Initializes a new instance of the class. - /// - /// The table. - /// The name. - protected TableConstraint(Table table, string name) - : this(table, name, null, null, null) - { - } - - #endregion - - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a base constraint object. + /// + [Serializable] + public abstract class TableConstraint + : Constraint
+ { + /// + /// Gets or sets the this instance belongs to. + /// + /// The table. + public Table Table + { + get { return Owner; } + set { Owner = value; } + } + + /// + /// Changes the table. + /// + /// The value. + protected override void ChangeOwner(Table value) + { + if (Table != null) + Table.TableConstraints.Remove(this); + if (value != null) + value.TableConstraints.Add(this); + } + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The table. + /// The name. + /// The condition. + /// Is constraint deferrable. + /// Is constraint initially deferred. + protected TableConstraint(Table table, string name, SqlExpression condition, bool? isDeferrable, + bool? isInitiallyDeferred) + : base(name, condition, isDeferrable, isInitiallyDeferred) + { + Table = table; + } + + /// + /// Initializes a new instance of the class. + /// + /// The table. + /// The name. + protected TableConstraint(Table table, string name) + : this(table, name, null, null, null) + { + } + + #endregion + + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Constraints/UniqueConstraint.cs b/Orm/Xtensive.Orm/Sql/Model/Constraints/UniqueConstraint.cs index 7cdad54775..49d97f259a 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Constraints/UniqueConstraint.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Constraints/UniqueConstraint.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Collections; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents unique table constraint. - /// - [Serializable] - public class UniqueConstraint : TableConstraint - { - private NodeCollection columns; - private bool isClustered; - - public bool IsClustered { - get { return isClustered; } - set { - this.EnsureNotLocked(); - isClustered = value; - } - } - - /// - /// Gets the columns. - /// - /// The columns. - public NodeCollection Columns - { - get { return columns; } - } - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - columns.Lock(recursive); - } - - #region Constructors - - internal UniqueConstraint(Table table, string name, params TableColumn[] columns) : base(table, name, null, null, null) - { - this.columns = new NodeCollection(columns.Length); - for (int i = 0, count = columns.Length; i + /// Represents unique table constraint. + /// + [Serializable] + public class UniqueConstraint : TableConstraint + { + private NodeCollection columns; + private bool isClustered; + + public bool IsClustered { + get { return isClustered; } + set { + this.EnsureNotLocked(); + isClustered = value; + } + } + + /// + /// Gets the columns. + /// + /// The columns. + public NodeCollection Columns + { + get { return columns; } + } + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + columns.Lock(recursive); + } + + #region Constructors + + internal UniqueConstraint(Table table, string name, params TableColumn[] columns) : base(table, name, null, null, null) + { + this.columns = new NodeCollection(columns.Length); + for (int i = 0, count = columns.Length; i - /// An base class for and types. - /// - [Serializable] - public abstract class DataTable : SchemaNode - { - private PairedNodeCollection indexes; - - /// - /// Creates the index. - /// - /// The name. - public Index CreateIndex(string name) - { - return new Index(this, name); - } - - /// - /// Creates the full-text index. - /// - /// The name. - public FullTextIndex CreateFullTextIndex(string name) - { - return new FullTextIndex(this, name); - } - - /// - /// Creates the spatial index. - /// - /// The name. - public SpatialIndex CreateSpatialIndex(string name) - { - return new SpatialIndex(this, name); - } - - /// - /// Gets the indexes. - /// - /// The indexes. - public PairedNodeCollection Indexes - { - get { return indexes; } - } - - #region DataTable Members - - /// - /// Gets the columns. - /// - /// The columns. - public abstract IList Columns { get; } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - indexes.Lock(recursive); - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The schema. - /// The name. - protected DataTable(Schema schema, string name) : base(schema, name) - { - indexes = new PairedNodeCollection(this, "Indexes"); - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; + +namespace Xtensive.Sql.Model +{ + /// + /// An base class for and types. + /// + [Serializable] + public abstract class DataTable : SchemaNode + { + private PairedNodeCollection indexes; + + /// + /// Creates the index. + /// + /// The name. + public Index CreateIndex(string name) + { + return new Index(this, name); + } + + /// + /// Creates the full-text index. + /// + /// The name. + public FullTextIndex CreateFullTextIndex(string name) + { + return new FullTextIndex(this, name); + } + + /// + /// Creates the spatial index. + /// + /// The name. + public SpatialIndex CreateSpatialIndex(string name) + { + return new SpatialIndex(this, name); + } + + /// + /// Gets the indexes. + /// + /// The indexes. + public PairedNodeCollection Indexes + { + get { return indexes; } + } + + #region DataTable Members + + /// + /// Gets the columns. + /// + /// The columns. + public abstract IList Columns { get; } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + indexes.Lock(recursive); + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The schema. + /// The name. + protected DataTable(Schema schema, string name) : base(schema, name) + { + indexes = new PairedNodeCollection(this, "Indexes"); + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/DataTableColumn.cs b/Orm/Xtensive.Orm/Sql/Model/DataTableColumn.cs index de2b6e9e32..bebaf04825 100644 --- a/Orm/Xtensive.Orm/Sql/Model/DataTableColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Model/DataTableColumn.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represent a bound column. - /// - [Serializable] - public abstract class DataTableColumn : DataTableNode - { - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The data table. - /// The name. - protected DataTableColumn(DataTable dataTable, string name) : base(dataTable, name) - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represent a bound column. + /// + [Serializable] + public abstract class DataTableColumn : DataTableNode + { + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The data table. + /// The name. + protected DataTableColumn(DataTable dataTable, string name) : base(dataTable, name) + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/DataTableNode.cs b/Orm/Xtensive.Orm/Sql/Model/DataTableNode.cs index 485a0bf8d7..61c29297d8 100644 --- a/Orm/Xtensive.Orm/Sql/Model/DataTableNode.cs +++ b/Orm/Xtensive.Orm/Sql/Model/DataTableNode.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a bound object. - /// - [Serializable] - public abstract class DataTableNode : Node, IPairedNode - { - private DataTable dataTable; - - /// - /// Gets or sets the this instance belongs to. - /// - /// The dataTable this instance belongs to. - public DataTable DataTable - { - get { return dataTable; } - protected set { - this.EnsureNotLocked(); - if (dataTable != value) { - ChangeDataTable(value); - } - } - } - - /// - /// Changes the data table. - /// - /// The value. - protected abstract void ChangeDataTable(DataTable value); - - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, DataTable value) - { - this.EnsureNotLocked(); - dataTable = value; - } - - #endregion - - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The dataTable. - /// The name. - protected DataTableNode(DataTable dataTable, string name) : base(name) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - DataTable = dataTable; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a bound object. + /// + [Serializable] + public abstract class DataTableNode : Node, IPairedNode + { + private DataTable dataTable; + + /// + /// Gets or sets the this instance belongs to. + /// + /// The dataTable this instance belongs to. + public DataTable DataTable + { + get { return dataTable; } + protected set { + this.EnsureNotLocked(); + if (dataTable != value) { + ChangeDataTable(value); + } + } + } + + /// + /// Changes the data table. + /// + /// The value. + protected abstract void ChangeDataTable(DataTable value); + + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, DataTable value) + { + this.EnsureNotLocked(); + dataTable = value; + } + + #endregion + + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The dataTable. + /// The name. + protected DataTableNode(DataTable dataTable, string name) : base(name) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + DataTable = dataTable; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Domain.cs b/Orm/Xtensive.Orm/Sql/Model/Domain.cs index 1062040f03..81e1af2c43 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Domain.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Domain.cs @@ -1,145 +1,145 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a domain object that is a set of permissible values. - /// A domain is defined in a schema and is identified by a domain name. - /// The purpose of a domain is to constrain the set of valid values - /// that can be stored in SQL-data by various operations. - /// - [Serializable] - public class Domain : SchemaNode,IConstrainable - { - private SqlValueType dataType; - private SqlExpression defaultValue; - private readonly PairedNodeCollection constraints; - private Collation collation; - - /// - /// Creates the domain constraint. - /// - /// The name. - /// The condition. - public DomainConstraint CreateConstraint(string name, SqlExpression condition) - { - return new DomainConstraint(this, name, condition); - } - - /// - /// Gets or sets the data type of the domain. - /// - /// The data type. - public SqlValueType DataType - { - get { return dataType; } - set - { - this.EnsureNotLocked(); - dataType = value; - } - } - - /// - /// Gets or sets the default value. - /// - /// The default value. - public SqlExpression DefaultValue - { - get { return defaultValue; } - set - { - this.EnsureNotLocked(); - defaultValue = value; - } - } - - /// - /// Gets or sets the collation. - /// - /// The collation. - public Collation Collation - { - get { return collation; } - set - { - this.EnsureNotLocked(); - collation = value; - } - } - - /// - /// Gets the constraints. - /// - /// The constraints. - public PairedNodeCollection DomainConstraints - { - get { return constraints; } - } - - #region IConstrainable members - - /// - /// Gets the constraints. - /// - /// The constraints. - IList IConstrainable.Constraints - { - get - { - return constraints.ToArray().Convert(i => (Constraint)i); - } - } - - #endregion - - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Domains.Remove(this); - if (value!=null) - value.Domains.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - constraints.Lock(recursive); - } - - #endregion - - #region Constructors - - internal Domain(Schema schema, string name, SqlValueType dataType, SqlExpression defaultValue) : base(schema, name) - { - this.dataType = dataType; - this.defaultValue = defaultValue; - constraints = - new PairedNodeCollection(this, "DomainConstraints"); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a domain object that is a set of permissible values. + /// A domain is defined in a schema and is identified by a domain name. + /// The purpose of a domain is to constrain the set of valid values + /// that can be stored in SQL-data by various operations. + /// + [Serializable] + public class Domain : SchemaNode,IConstrainable + { + private SqlValueType dataType; + private SqlExpression defaultValue; + private readonly PairedNodeCollection constraints; + private Collation collation; + + /// + /// Creates the domain constraint. + /// + /// The name. + /// The condition. + public DomainConstraint CreateConstraint(string name, SqlExpression condition) + { + return new DomainConstraint(this, name, condition); + } + + /// + /// Gets or sets the data type of the domain. + /// + /// The data type. + public SqlValueType DataType + { + get { return dataType; } + set + { + this.EnsureNotLocked(); + dataType = value; + } + } + + /// + /// Gets or sets the default value. + /// + /// The default value. + public SqlExpression DefaultValue + { + get { return defaultValue; } + set + { + this.EnsureNotLocked(); + defaultValue = value; + } + } + + /// + /// Gets or sets the collation. + /// + /// The collation. + public Collation Collation + { + get { return collation; } + set + { + this.EnsureNotLocked(); + collation = value; + } + } + + /// + /// Gets the constraints. + /// + /// The constraints. + public PairedNodeCollection DomainConstraints + { + get { return constraints; } + } + + #region IConstrainable members + + /// + /// Gets the constraints. + /// + /// The constraints. + IList IConstrainable.Constraints + { + get + { + return constraints.ToArray().Convert(i => (Constraint)i); + } + } + + #endregion + + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Domains.Remove(this); + if (value!=null) + value.Domains.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + constraints.Lock(recursive); + } + + #endregion + + #region Constructors + + internal Domain(Schema schema, string name, SqlValueType dataType, SqlExpression defaultValue) : base(schema, name) + { + this.dataType = dataType; + this.defaultValue = defaultValue; + constraints = + new PairedNodeCollection(this, "DomainConstraints"); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Extractor.cs b/Orm/Xtensive.Orm/Sql/Model/Extractor.cs index 33a78535f1..8d8b07ae57 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Extractor.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Extractor.cs @@ -1,113 +1,113 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data.Common; -using Xtensive.Core; - - -namespace Xtensive.Sql.Model -{ - /// - /// Builds by extracting the metadata from existing database. - /// - public abstract class Extractor - { - /// - /// Gets the driver. - /// - protected SqlDriver Driver { get; private set; } - - /// - /// Gets the connection. - /// - protected SqlConnection Connection { get; private set; } - - /// - /// Extracts all schemes from the database. - /// - /// Catalog to extract. - /// that holds all schemes in the database. - public abstract Catalog ExtractCatalog(string catalogName); - - /// - /// Extracts the specified schema from the database. - /// - /// Extracted instance. - [Obsolete("Use Extractor.ExtractSchemes(...) instead")] - public abstract Schema ExtractSchema(string catalogName, string schemaName); - - /// - /// Extract specified schemes from the database - /// - /// Catalog to extract - /// Names of schemes which must be extracted - /// that holds specified schemas schemes in the database. - public virtual Catalog ExtractSchemes(string catalogName, string[] schemaNames) - { - ArgumentValidator.EnsureArgumentNotNull(catalogName, "catalogName"); - ArgumentValidator.EnsureArgumentNotNull(schemaNames, "schemaNames"); - if(schemaNames.Length==0) - return new Catalog(catalogName); - var schema = ExtractSchema(catalogName, schemaNames[0]); - return schema.Catalog; - } - - - /// - /// Initializes the translator with specified and . - /// - /// The connection. - public void Initialize(SqlConnection connection) - { - Connection = connection; - Initialize(); - } - - /// - /// Performs custom initialization. - /// Called within . - /// - protected virtual void Initialize() - { - } - - #region Helper methods - - /// - /// Executes the reader againts the command created from the specified . - /// - /// The statement to execute. - /// Executed reader. - protected virtual DbDataReader ExecuteReader(ISqlCompileUnit statement) - { - using (var command = Connection.CreateCommand(statement)) - return command.ExecuteReader(); - } - - /// - /// Executes the reader againts the command created from the specified . - /// - /// The command text to execute. - /// Executed reader. - protected virtual DbDataReader ExecuteReader(string commandText) - { - using (var command = Connection.CreateCommand(commandText)) - return command.ExecuteReader(); - } - - #endregion - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The driver. - protected Extractor(SqlDriver driver) - { - Driver = driver; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data.Common; +using Xtensive.Core; + + +namespace Xtensive.Sql.Model +{ + /// + /// Builds by extracting the metadata from existing database. + /// + public abstract class Extractor + { + /// + /// Gets the driver. + /// + protected SqlDriver Driver { get; private set; } + + /// + /// Gets the connection. + /// + protected SqlConnection Connection { get; private set; } + + /// + /// Extracts all schemes from the database. + /// + /// Catalog to extract. + /// that holds all schemes in the database. + public abstract Catalog ExtractCatalog(string catalogName); + + /// + /// Extracts the specified schema from the database. + /// + /// Extracted instance. + [Obsolete("Use Extractor.ExtractSchemes(...) instead")] + public abstract Schema ExtractSchema(string catalogName, string schemaName); + + /// + /// Extract specified schemes from the database + /// + /// Catalog to extract + /// Names of schemes which must be extracted + /// that holds specified schemas schemes in the database. + public virtual Catalog ExtractSchemes(string catalogName, string[] schemaNames) + { + ArgumentValidator.EnsureArgumentNotNull(catalogName, "catalogName"); + ArgumentValidator.EnsureArgumentNotNull(schemaNames, "schemaNames"); + if(schemaNames.Length==0) + return new Catalog(catalogName); + var schema = ExtractSchema(catalogName, schemaNames[0]); + return schema.Catalog; + } + + + /// + /// Initializes the translator with specified and . + /// + /// The connection. + public void Initialize(SqlConnection connection) + { + Connection = connection; + Initialize(); + } + + /// + /// Performs custom initialization. + /// Called within . + /// + protected virtual void Initialize() + { + } + + #region Helper methods + + /// + /// Executes the reader againts the command created from the specified . + /// + /// The statement to execute. + /// Executed reader. + protected virtual DbDataReader ExecuteReader(ISqlCompileUnit statement) + { + using (var command = Connection.CreateCommand(statement)) + return command.ExecuteReader(); + } + + /// + /// Executes the reader againts the command created from the specified . + /// + /// The command text to execute. + /// Executed reader. + protected virtual DbDataReader ExecuteReader(string commandText) + { + using (var command = Connection.CreateCommand(commandText)) + return command.ExecuteReader(); + } + + #endregion + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The driver. + protected Extractor(SqlDriver driver) + { + Driver = driver; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/FullTextIndex.cs b/Orm/Xtensive.Orm/Sql/Model/FullTextIndex.cs index 8f4a5cb915..e0522a625b 100644 --- a/Orm/Xtensive.Orm/Sql/Model/FullTextIndex.cs +++ b/Orm/Xtensive.Orm/Sql/Model/FullTextIndex.cs @@ -1,83 +1,83 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2010.01.14 - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents full-text index. - /// - [Serializable] - public class FullTextIndex : Index - { - private string fullTextCatalog; - private string underlyingUniqueIndex; - private ChangeTrackingMode changeTrackingMode; - - /// - public override bool IsFullText { get { return true; } } - - /// - /// Gets or sets the full text catalog. - /// - public string FullTextCatalog - { - get { return fullTextCatalog; } - set - { - this.EnsureNotLocked(); - fullTextCatalog = value; - } - } - - /// - /// Gets or sets the mode of change tracking. - /// - public ChangeTrackingMode ChangeTrackingMode - { - get { return changeTrackingMode; } - set - { - this.EnsureNotLocked(); - changeTrackingMode = value; - } - } - - /// - /// Gets or sets the underlying unique index name. - /// - public string UnderlyingUniqueIndex - { - get { return underlyingUniqueIndex; } - set - { - this.EnsureNotLocked(); - underlyingUniqueIndex = value; - } - } - - /// - /// Creates the full-text index column. - /// - /// The column. - /// Newly created object. - public new IndexColumn CreateIndexColumn(DataTableColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new IndexColumn(this, column, true); - } - - - - internal FullTextIndex(DataTable dataTable, string name) - : base(dataTable, name) - { - changeTrackingMode = ChangeTrackingMode.Auto; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2010.01.14 + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents full-text index. + /// + [Serializable] + public class FullTextIndex : Index + { + private string fullTextCatalog; + private string underlyingUniqueIndex; + private ChangeTrackingMode changeTrackingMode; + + /// + public override bool IsFullText { get { return true; } } + + /// + /// Gets or sets the full text catalog. + /// + public string FullTextCatalog + { + get { return fullTextCatalog; } + set + { + this.EnsureNotLocked(); + fullTextCatalog = value; + } + } + + /// + /// Gets or sets the mode of change tracking. + /// + public ChangeTrackingMode ChangeTrackingMode + { + get { return changeTrackingMode; } + set + { + this.EnsureNotLocked(); + changeTrackingMode = value; + } + } + + /// + /// Gets or sets the underlying unique index name. + /// + public string UnderlyingUniqueIndex + { + get { return underlyingUniqueIndex; } + set + { + this.EnsureNotLocked(); + underlyingUniqueIndex = value; + } + } + + /// + /// Creates the full-text index column. + /// + /// The column. + /// Newly created object. + public new IndexColumn CreateIndexColumn(DataTableColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new IndexColumn(this, column, true); + } + + + + internal FullTextIndex(DataTable dataTable, string name) + : base(dataTable, name) + { + changeTrackingMode = ChangeTrackingMode.Auto; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Index.cs b/Orm/Xtensive.Orm/Sql/Model/Index.cs index 97c7bc84ff..2edac8d910 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Index.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Index.cs @@ -1,250 +1,250 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents an index. - /// - [Serializable] - public class Index : DataTableNode, IPartitionable - { - private PairedNodeCollection columns; - private NodeCollection nonkeyColumns; - private bool isUnique; - private bool isBitmap; - private bool isClustered; - private byte? fillFactor; - private string filegroup; - private PartitionDescriptor partitionDescriptor; - private SqlExpression where; - - /// - /// Creates the index column. - /// - /// The column. - public IndexColumn CreateIndexColumn(DataTableColumn column) - { - return CreateIndexColumn(column, true); - } - - /// - /// Creates the index column. - /// - /// The column. - /// The sort direction. - public IndexColumn CreateIndexColumn(DataTableColumn column, bool ascending) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new IndexColumn(this, column, ascending); - } - - /// - /// Creates the index column. - /// - /// The expression. - /// instance. - public IndexColumn CreateIndexColumn(SqlExpression expression) - { - return CreateIndexColumn(expression, true); - } - - /// - /// Creates the index column. - /// - /// The expression. - /// instance. - public IndexColumn CreateIndexColumn(SqlExpression expression, bool ascending) - { - if (expression.IsNullReference()) - throw new ArgumentNullException("expression"); - return new IndexColumn(this, expression, ascending); - } - - /// - /// Columns, this instance is based on. - /// - public PairedNodeCollection Columns - { - get { return columns; } - } - - /// - /// Non key columns to be added to the the index. - /// - public NodeCollection NonkeyColumns - { - get { return nonkeyColumns; } - } - - /// - /// Gets or sets the index filter expression. - /// - public SqlExpression Where - { - get { return where; } - set - { - this.EnsureNotLocked(); - where = value; - } - } - - /// - /// Gets or sets the value indicating that this index is unique index. - /// Unique index is one in which no two rows are permitted to have the same index key value. - /// - public bool IsUnique - { - get { return isUnique; } - set - { - this.EnsureNotLocked(); - isUnique = value; - } - } - - /// - /// Gets or sets the value indicating that this index is full-text index. - /// - public virtual bool IsFullText - { - get { return false; } - } - - /// - /// Gets or sets the value indicating that this index is spatial index. - /// - public virtual bool IsSpatial - { - get { return false; } - } - - /// - /// Gets or sets the value indicating that this index is bitmap index. - /// A bitmap index is a special kind of index that stores the bulk of its data as bitmaps - /// and answers most queries by performing bitwise logical operations on these bitmaps. - /// - public bool IsBitmap - { - get { return isBitmap; } - set - { - this.EnsureNotLocked(); - isBitmap = value; - } - } - - /// - /// Gets or sets the value indicating that this index is clustered index. - /// Clustered index is the index in which the logical order of the key values - /// determines the physical order of the corresponding rows in a table. - /// The bottom, or leaf, level of the clustered index contains the actual data rows - /// of the table. A table or view is allowed one clustered index at a time. - /// - public bool IsClustered - { - get { return isClustered; } - set - { - this.EnsureNotLocked(); - isClustered = value; - } - } - - /// - /// Specifies a percentage that indicates how full the database server should make the leaf level - /// of each index page during index creation or rebuild. - /// - public byte? FillFactor - { - get { return fillFactor; } - set - { - this.EnsureNotLocked(); - fillFactor = value; - } - } - - /// - /// Gets or sets the value indicating that specified index will be created on the specified tablespace or filegroup. - /// If no location is specified and the table or view is not partitioned, the index uses the same filegroup - /// as the underlying table or view. - /// - public string Filegroup - { - get { return filegroup; } - set - { - this.EnsureNotLocked(); - filegroup = value; - } - } - - /// - /// Gets or sets the partition descriptor. - /// - /// The partition descriptor. - public PartitionDescriptor PartitionDescriptor - { - get { return partitionDescriptor; } - set { - this.EnsureNotLocked(); - PartitionDescriptor old = partitionDescriptor; - partitionDescriptor = value; - if (old!=null && old.Owner==this) - old.Owner = null; - if (partitionDescriptor!=null && partitionDescriptor.Owner!=this) - partitionDescriptor.Owner = this; - } - } - - #region DataTableNode Members - - /// - /// Changes the data table. - /// - /// The value. - protected override void ChangeDataTable(DataTable value) - { - if (DataTable!=null) - DataTable.Indexes.Remove(this); - if (value!=null) - value.Indexes.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - columns.Lock(recursive); - nonkeyColumns.Lock(recursive); - if (partitionDescriptor!=null) - partitionDescriptor.Lock(recursive); - } - - #endregion - - #region Constructors - - internal Index(DataTable dataTable, string name) : base(dataTable, name) - { - nonkeyColumns = new NodeCollection(); - columns = new PairedNodeCollection(this, "Columns"); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents an index. + /// + [Serializable] + public class Index : DataTableNode, IPartitionable + { + private PairedNodeCollection columns; + private NodeCollection nonkeyColumns; + private bool isUnique; + private bool isBitmap; + private bool isClustered; + private byte? fillFactor; + private string filegroup; + private PartitionDescriptor partitionDescriptor; + private SqlExpression where; + + /// + /// Creates the index column. + /// + /// The column. + public IndexColumn CreateIndexColumn(DataTableColumn column) + { + return CreateIndexColumn(column, true); + } + + /// + /// Creates the index column. + /// + /// The column. + /// The sort direction. + public IndexColumn CreateIndexColumn(DataTableColumn column, bool ascending) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new IndexColumn(this, column, ascending); + } + + /// + /// Creates the index column. + /// + /// The expression. + /// instance. + public IndexColumn CreateIndexColumn(SqlExpression expression) + { + return CreateIndexColumn(expression, true); + } + + /// + /// Creates the index column. + /// + /// The expression. + /// instance. + public IndexColumn CreateIndexColumn(SqlExpression expression, bool ascending) + { + if (expression.IsNullReference()) + throw new ArgumentNullException("expression"); + return new IndexColumn(this, expression, ascending); + } + + /// + /// Columns, this instance is based on. + /// + public PairedNodeCollection Columns + { + get { return columns; } + } + + /// + /// Non key columns to be added to the the index. + /// + public NodeCollection NonkeyColumns + { + get { return nonkeyColumns; } + } + + /// + /// Gets or sets the index filter expression. + /// + public SqlExpression Where + { + get { return where; } + set + { + this.EnsureNotLocked(); + where = value; + } + } + + /// + /// Gets or sets the value indicating that this index is unique index. + /// Unique index is one in which no two rows are permitted to have the same index key value. + /// + public bool IsUnique + { + get { return isUnique; } + set + { + this.EnsureNotLocked(); + isUnique = value; + } + } + + /// + /// Gets or sets the value indicating that this index is full-text index. + /// + public virtual bool IsFullText + { + get { return false; } + } + + /// + /// Gets or sets the value indicating that this index is spatial index. + /// + public virtual bool IsSpatial + { + get { return false; } + } + + /// + /// Gets or sets the value indicating that this index is bitmap index. + /// A bitmap index is a special kind of index that stores the bulk of its data as bitmaps + /// and answers most queries by performing bitwise logical operations on these bitmaps. + /// + public bool IsBitmap + { + get { return isBitmap; } + set + { + this.EnsureNotLocked(); + isBitmap = value; + } + } + + /// + /// Gets or sets the value indicating that this index is clustered index. + /// Clustered index is the index in which the logical order of the key values + /// determines the physical order of the corresponding rows in a table. + /// The bottom, or leaf, level of the clustered index contains the actual data rows + /// of the table. A table or view is allowed one clustered index at a time. + /// + public bool IsClustered + { + get { return isClustered; } + set + { + this.EnsureNotLocked(); + isClustered = value; + } + } + + /// + /// Specifies a percentage that indicates how full the database server should make the leaf level + /// of each index page during index creation or rebuild. + /// + public byte? FillFactor + { + get { return fillFactor; } + set + { + this.EnsureNotLocked(); + fillFactor = value; + } + } + + /// + /// Gets or sets the value indicating that specified index will be created on the specified tablespace or filegroup. + /// If no location is specified and the table or view is not partitioned, the index uses the same filegroup + /// as the underlying table or view. + /// + public string Filegroup + { + get { return filegroup; } + set + { + this.EnsureNotLocked(); + filegroup = value; + } + } + + /// + /// Gets or sets the partition descriptor. + /// + /// The partition descriptor. + public PartitionDescriptor PartitionDescriptor + { + get { return partitionDescriptor; } + set { + this.EnsureNotLocked(); + PartitionDescriptor old = partitionDescriptor; + partitionDescriptor = value; + if (old!=null && old.Owner==this) + old.Owner = null; + if (partitionDescriptor!=null && partitionDescriptor.Owner!=this) + partitionDescriptor.Owner = this; + } + } + + #region DataTableNode Members + + /// + /// Changes the data table. + /// + /// The value. + protected override void ChangeDataTable(DataTable value) + { + if (DataTable!=null) + DataTable.Indexes.Remove(this); + if (value!=null) + value.Indexes.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + columns.Lock(recursive); + nonkeyColumns.Lock(recursive); + if (partitionDescriptor!=null) + partitionDescriptor.Lock(recursive); + } + + #endregion + + #region Constructors + + internal Index(DataTable dataTable, string name) : base(dataTable, name) + { + nonkeyColumns = new NodeCollection(); + columns = new PairedNodeCollection(this, "Columns"); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/IndexColumn.cs b/Orm/Xtensive.Orm/Sql/Model/IndexColumn.cs index 947f7bc76d..303184a2df 100644 --- a/Orm/Xtensive.Orm/Sql/Model/IndexColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Model/IndexColumn.cs @@ -1,160 +1,160 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represent a bound column. - /// - [Serializable] - public class IndexColumn : Node, IPairedNode - { - private DataTableColumn column; - private bool ascending; - private Index index; - private SqlExpression expression; - private readonly NodeCollection languages = new NodeCollection(); - private DataTableColumn typeColumn; - - /// - /// Gets or sets the index. - /// - /// The index. - public Index Index - { - get { return index; } - set { - this.EnsureNotLocked(); - if (index == value) - return; - if (index!=null) - index.Columns.Remove(this); - index = null; - if (value!=null) - value.Columns.Add(this); - } - } - - /// - /// Gets or sets the column. - /// - /// The column. - public DataTableColumn Column - { - get { return column; } - set - { - this.EnsureNotLocked(); - column = value; - } - } - - /// - /// Gets or sets column that contains type of data for . - /// - public DataTableColumn TypeColumn - { - get { return typeColumn; } - set - { - this.EnsureNotLocked(); - typeColumn = value; - } - } - - /// - /// Gets or sets a value indicating the ascending or descending sort direction for this instance. - /// The default is . - /// - /// - /// if ascending; otherwise, . - /// - public bool Ascending - { - get { return ascending; } - set - { - this.EnsureNotLocked(); - ascending = value; - } - } - - /// - /// Gets or sets a name of the node. - /// - /// - public override string Name - { - get { return !expression.IsNullReference() ? string.Empty : column.Name; } - set { throw new NotSupportedException(); } - } - - /// - /// Gets or sets the expression. - /// - public SqlExpression Expression - { - get { return expression; } - set - { - this.EnsureNotLocked(); - expression = value; - } - } - - /// - /// Gets or sets the language. - /// - public NodeCollection Languages - { - get { return languages; } - } - - #region ILockable Members - /// - public override void Lock(bool recursive) - { - languages.Lock(recursive); - base.Lock(recursive); - } - #endregion - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, Index value) - { - this.EnsureNotLocked(); - index = value; - } - - #endregion - - #region Constructors - - internal IndexColumn(Index index, DataTableColumn column, bool ascending) - { - Column = column; - Index = index; - this.ascending = ascending; - } - - internal IndexColumn(Index index, SqlExpression expression, bool ascending) - { - this.expression = expression; - Index = index; - this.ascending = ascending; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represent a bound column. + /// + [Serializable] + public class IndexColumn : Node, IPairedNode + { + private DataTableColumn column; + private bool ascending; + private Index index; + private SqlExpression expression; + private readonly NodeCollection languages = new NodeCollection(); + private DataTableColumn typeColumn; + + /// + /// Gets or sets the index. + /// + /// The index. + public Index Index + { + get { return index; } + set { + this.EnsureNotLocked(); + if (index == value) + return; + if (index!=null) + index.Columns.Remove(this); + index = null; + if (value!=null) + value.Columns.Add(this); + } + } + + /// + /// Gets or sets the column. + /// + /// The column. + public DataTableColumn Column + { + get { return column; } + set + { + this.EnsureNotLocked(); + column = value; + } + } + + /// + /// Gets or sets column that contains type of data for . + /// + public DataTableColumn TypeColumn + { + get { return typeColumn; } + set + { + this.EnsureNotLocked(); + typeColumn = value; + } + } + + /// + /// Gets or sets a value indicating the ascending or descending sort direction for this instance. + /// The default is . + /// + /// + /// if ascending; otherwise, . + /// + public bool Ascending + { + get { return ascending; } + set + { + this.EnsureNotLocked(); + ascending = value; + } + } + + /// + /// Gets or sets a name of the node. + /// + /// + public override string Name + { + get { return !expression.IsNullReference() ? string.Empty : column.Name; } + set { throw new NotSupportedException(); } + } + + /// + /// Gets or sets the expression. + /// + public SqlExpression Expression + { + get { return expression; } + set + { + this.EnsureNotLocked(); + expression = value; + } + } + + /// + /// Gets or sets the language. + /// + public NodeCollection Languages + { + get { return languages; } + } + + #region ILockable Members + /// + public override void Lock(bool recursive) + { + languages.Lock(recursive); + base.Lock(recursive); + } + #endregion + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, Index value) + { + this.EnsureNotLocked(); + index = value; + } + + #endregion + + #region Constructors + + internal IndexColumn(Index index, DataTableColumn column, bool ascending) + { + Column = column; + Index = index; + this.ascending = ascending; + } + + internal IndexColumn(Index index, SqlExpression expression, bool ascending) + { + this.expression = expression; + Index = index; + this.ascending = ascending; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IConstrainable.cs b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IConstrainable.cs index b4378eaee6..273004ec82 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IConstrainable.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IConstrainable.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a node that is capable of being constrained. - /// - public interface IConstrainable - { - /// - /// Gets the node constraints. - /// - /// The constraints. - IList Constraints { get; } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a node that is capable of being constrained. + /// + public interface IConstrainable + { + /// + /// Gets the node constraints. + /// + /// The constraints. + IList Constraints { get; } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPairedNode.cs b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPairedNode.cs index c57f667869..4d9e8d9595 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPairedNode.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPairedNode.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Model -{ - /// - /// Describes an object that is paired with some . - /// - public interface IPairedNode where TOwner: Node - { - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void UpdatePairedProperty(string property, TOwner value); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Model +{ + /// + /// Describes an object that is paired with some . + /// + public interface IPairedNode where TOwner: Node + { + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void UpdatePairedProperty(string property, TOwner value); + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPartitionable.cs b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPartitionable.cs index 71455c9591..2adeb5f758 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPartitionable.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPartitionable.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Model -{ - /// - /// Defines an object that supports partitioning. - /// - public interface IPartitionable - { - /// - /// Gets or sets the partition descriptor. - /// - /// The partition descriptor. - PartitionDescriptor PartitionDescriptor { get; set; } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Model +{ + /// + /// Defines an object that supports partitioning. + /// + public interface IPartitionable + { + /// + /// Gets or sets the partition descriptor. + /// + /// The partition descriptor. + PartitionDescriptor PartitionDescriptor { get; set; } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPermission.cs b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPermission.cs index 2a5b248d80..fd2bdce555 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPermission.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Interfaces/IPermission.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System.Collections.Generic; - -namespace Xtensive.Sql.Model -{ - public interface IPermission - { - Action Action { get; set; } - // INSERT, UPDATE, REFERENCES - IList PrivilegeColumns { get; } - bool Deny { get; set; } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System.Collections.Generic; + +namespace Xtensive.Sql.Model +{ + public interface IPermission + { + Action Action { get; set; } + // INSERT, UPDATE, REFERENCES + IList PrivilegeColumns { get; } + bool Deny { get; set; } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Interfaces/ISequenceable.cs b/Orm/Xtensive.Orm/Sql/Model/Interfaces/ISequenceable.cs index c6abb476e2..82375d4a52 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Interfaces/ISequenceable.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Interfaces/ISequenceable.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -namespace Xtensive.Sql.Model -{ - /// - /// Defines an object that could be the source of a sequence. - /// - public interface ISequenceable - { - /// - /// Gets or sets the sequence descriptor. - /// - /// The sequence descriptor. - SequenceDescriptor SequenceDescriptor { get; set; } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +namespace Xtensive.Sql.Model +{ + /// + /// Defines an object that could be the source of a sequence. + /// + public interface ISequenceable + { + /// + /// Gets or sets the sequence descriptor. + /// + /// The sequence descriptor. + SequenceDescriptor SequenceDescriptor { get; set; } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Language.cs b/Orm/Xtensive.Orm/Sql/Model/Language.cs index 5024cade50..2c6ec0ae49 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Language.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Language.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Gamzov -// Created: 2010.01.25 - -using System; - -namespace Xtensive.Sql.Model -{ - [Serializable] - public class Language : Node - { - public Language(string name) - { - Name = name; - } - } +// Copyright (C) 2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Gamzov +// Created: 2010.01.25 + +using System; + +namespace Xtensive.Sql.Model +{ + [Serializable] + public class Language : Node + { + public Language(string name) + { + Name = name; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Node.cs b/Orm/Xtensive.Orm/Sql/Model/Node.cs index c2f846c22f..4dab3e8a4d 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Node.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Node.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Diagnostics; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents base lockable named node. - /// - [Serializable] - [DebuggerDisplay("Name = {Name}")] - public abstract class Node: LockableBase - { - private string name; - private string dbName; - - /// - /// Gets or sets a name of the node. - /// - public virtual string Name - { - get { return name; } - set - { - this.EnsureNotLocked(); - name = value; - } - } - - /// - /// Gets or sets a db name of the node. - /// - public virtual string DbName - { - get { return string.IsNullOrEmpty(dbName) ? name : dbName; } - set - { - this.EnsureNotLocked(); - dbName = value; - } - } - - internal string GetNameInternal() - { - return name; - } - - internal string GetDbNameInternal() - { - return string.IsNullOrEmpty(dbName) ? name : dbName;; - } - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - protected Node(string name) - { - this.name = name; - } - - /// - /// Initializes a new instance of the class. - /// - protected Node() - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Diagnostics; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents base lockable named node. + /// + [Serializable] + [DebuggerDisplay("Name = {Name}")] + public abstract class Node: LockableBase + { + private string name; + private string dbName; + + /// + /// Gets or sets a name of the node. + /// + public virtual string Name + { + get { return name; } + set + { + this.EnsureNotLocked(); + name = value; + } + } + + /// + /// Gets or sets a db name of the node. + /// + public virtual string DbName + { + get { return string.IsNullOrEmpty(dbName) ? name : dbName; } + set + { + this.EnsureNotLocked(); + dbName = value; + } + } + + internal string GetNameInternal() + { + return name; + } + + internal string GetDbNameInternal() + { + return string.IsNullOrEmpty(dbName) ? name : dbName;; + } + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + protected Node(string name) + { + this.name = name; + } + + /// + /// Initializes a new instance of the class. + /// + protected Node() + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/NodeCollection.cs b/Orm/Xtensive.Orm/Sql/Model/NodeCollection.cs index 36c7124e4c..093774af4e 100644 --- a/Orm/Xtensive.Orm/Sql/Model/NodeCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Model/NodeCollection.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Collections; - - -namespace Xtensive.Sql.Model -{ - /// - /// Represents lockable indexed by collection of s. - /// - /// Node type - [Serializable] - [DebuggerDisplay("Count = {Count}")] - public class NodeCollection: CollectionBaseSlim - where TNode: Node - { - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - - private readonly IDictionary nameIndex; - - /// - /// Gets a value indicating whether this instance is read-only. - /// - /// - /// if this instance is read-only; otherwise, . - public override bool IsReadOnly { get { return IsLocked || base.IsReadOnly; } } - - /// - public override void Add(TNode item) - { - base.Add(item); - if (!string.IsNullOrEmpty(item.GetNameInternal())) - nameIndex.Add(item.GetNameInternal(), item); - } - - public override bool Remove(TNode item) - { - bool result = base.Remove(item); - if (result) - nameIndex.Remove(item.GetNameInternal()); - return result; - } - - public override void Clear() - { - base.Clear(); - nameIndex.Clear(); - } - - /// - /// Gets the at the specified index. - /// - public TNode this[string index] { - get { - if (string.IsNullOrEmpty(index)) - return default(TNode); - TNode result; - return nameIndex.TryGetValue(index, out result) ? result : default(TNode); - } - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - public NodeCollection() - : this(0) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The initial collection capacity. - public NodeCollection(int capacity) - : base(capacity) - { - nameIndex = new Dictionary(capacity, Comparer); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Collections; + + +namespace Xtensive.Sql.Model +{ + /// + /// Represents lockable indexed by collection of s. + /// + /// Node type + [Serializable] + [DebuggerDisplay("Count = {Count}")] + public class NodeCollection: CollectionBaseSlim + where TNode: Node + { + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + + private readonly IDictionary nameIndex; + + /// + /// Gets a value indicating whether this instance is read-only. + /// + /// + /// if this instance is read-only; otherwise, . + public override bool IsReadOnly { get { return IsLocked || base.IsReadOnly; } } + + /// + public override void Add(TNode item) + { + base.Add(item); + if (!string.IsNullOrEmpty(item.GetNameInternal())) + nameIndex.Add(item.GetNameInternal(), item); + } + + public override bool Remove(TNode item) + { + bool result = base.Remove(item); + if (result) + nameIndex.Remove(item.GetNameInternal()); + return result; + } + + public override void Clear() + { + base.Clear(); + nameIndex.Clear(); + } + + /// + /// Gets the at the specified index. + /// + public TNode this[string index] { + get { + if (string.IsNullOrEmpty(index)) + return default(TNode); + TNode result; + return nameIndex.TryGetValue(index, out result) ? result : default(TNode); + } + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + public NodeCollection() + : this(0) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The initial collection capacity. + public NodeCollection(int capacity) + : base(capacity) + { + nameIndex = new Dictionary(capacity, Comparer); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/PairedNodeCollection.cs b/Orm/Xtensive.Orm/Sql/Model/PairedNodeCollection.cs index 0c4b6dd501..94e7e4b9d2 100644 --- a/Orm/Xtensive.Orm/Sql/Model/PairedNodeCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Model/PairedNodeCollection.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents paired collection of s. - /// - /// Owner node type - /// Item node type - [Serializable] - public class PairedNodeCollection: NodeCollection - where TOwner : Node - where TNode : Node, IPairedNode - { - private readonly TOwner owner; - private readonly string property; - - /// - /// Gets a value indicating whether the is read-only. - /// - /// - /// if the is read-only; otherwise, . - public override bool IsReadOnly - { - get { return IsLocked ? true : base.IsReadOnly; } - } - - /// - public override void Add(TNode item) - { - base.Add(item); - item.UpdatePairedProperty(property, owner); - } - - /// - public override bool Remove(TNode item) - { - bool result = base.Remove(item); - item.UpdatePairedProperty(property, null); - return result; - } - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The collectionowner. - /// Owner collection property. - public PairedNodeCollection(TOwner owner, string property) - : this(owner, property, 0) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The collection owner. - /// Owner collection property. - /// The initial collection capacity. - public PairedNodeCollection(TOwner owner, string property, int capacity) - : base(capacity) - { - ArgumentValidator.EnsureArgumentNotNull(owner, "owner"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(property, "property"); - this.owner = owner; - this.property = property; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents paired collection of s. + /// + /// Owner node type + /// Item node type + [Serializable] + public class PairedNodeCollection: NodeCollection + where TOwner : Node + where TNode : Node, IPairedNode + { + private readonly TOwner owner; + private readonly string property; + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// if the is read-only; otherwise, . + public override bool IsReadOnly + { + get { return IsLocked ? true : base.IsReadOnly; } + } + + /// + public override void Add(TNode item) + { + base.Add(item); + item.UpdatePairedProperty(property, owner); + } + + /// + public override bool Remove(TNode item) + { + bool result = base.Remove(item); + item.UpdatePairedProperty(property, null); + return result; + } + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The collectionowner. + /// Owner collection property. + public PairedNodeCollection(TOwner owner, string property) + : this(owner, property, 0) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The collection owner. + /// Owner collection property. + /// The initial collection capacity. + public PairedNodeCollection(TOwner owner, string property, int capacity) + : base(capacity) + { + ArgumentValidator.EnsureArgumentNotNull(owner, "owner"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(property, "property"); + this.owner = owner; + this.property = property; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/PartitionMethod.cs b/Orm/Xtensive.Orm/Sql/Model/PartitionMethod.cs index 9b3fd89a6e..0d4a51e2b0 100644 --- a/Orm/Xtensive.Orm/Sql/Model/PartitionMethod.cs +++ b/Orm/Xtensive.Orm/Sql/Model/PartitionMethod.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Enumeration of possible partitioning methods. - /// - [Serializable] - public enum PartitionMethod - { - /// - /// None. - /// Value is . - /// - None = 0, - - /// - /// Indicates that table rows should be assigned to partitions - /// based on column values falling within a given range. - /// Value is . - /// - Range = 1, - - /// - /// Indicates that table rows should be assigned to partitions - /// based on columns values matching one of a set of discrete values. - /// Value is . - /// - List = 2, - - /// - /// Indicates that table rows should be assigned to partitions - /// based on the value returned by a user-defined expression - /// that operates on column values in rows to be inserted into the table. - /// Value is . - /// - Hash = 4, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Enumeration of possible partitioning methods. + /// + [Serializable] + public enum PartitionMethod + { + /// + /// None. + /// Value is . + /// + None = 0, + + /// + /// Indicates that table rows should be assigned to partitions + /// based on column values falling within a given range. + /// Value is . + /// + Range = 1, + + /// + /// Indicates that table rows should be assigned to partitions + /// based on columns values matching one of a set of discrete values. + /// Value is . + /// + List = 2, + + /// + /// Indicates that table rows should be assigned to partitions + /// based on the value returned by a user-defined expression + /// that operates on column values in rows to be inserted into the table. + /// Value is . + /// + Hash = 4, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/HashPartition.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/HashPartition.cs index a83f7f9653..5858acf706 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/HashPartition.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/HashPartition.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a hash partition. - /// - [Serializable] - public class HashPartition : Partition - { - #region Constructors - - internal HashPartition(PartitionDescriptor partitionDescriptor, string filegroup) : base(partitionDescriptor, filegroup) - { - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a hash partition. + /// + [Serializable] + public class HashPartition : Partition + { + #region Constructors + + internal HashPartition(PartitionDescriptor partitionDescriptor, string filegroup) : base(partitionDescriptor, filegroup) + { + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/ListPartition.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/ListPartition.cs index aacc29636b..88722254ba 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/ListPartition.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/ListPartition.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a list partition. - /// - [Serializable] - public class ListPartition : Partition - { - /// - /// Gets or sets the values. - /// - /// The values. - public string[] Values { get; set; } - - #region Constructors - - internal ListPartition(PartitionDescriptor partitionDescriptor, string filegroup, params string[] values) : base(partitionDescriptor, filegroup) - { - Values = values; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a list partition. + /// + [Serializable] + public class ListPartition : Partition + { + /// + /// Gets or sets the values. + /// + /// The values. + public string[] Values { get; set; } + + #region Constructors + + internal ListPartition(PartitionDescriptor partitionDescriptor, string filegroup, params string[] values) : base(partitionDescriptor, filegroup) + { + Values = values; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/Partition.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/Partition.cs index f5752fc596..ccf77801e4 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/Partition.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/Partition.cs @@ -1,77 +1,77 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a single partition object. - /// - [Serializable] - public abstract class Partition : Node, IPairedNode - { - private PartitionDescriptor partitionDescriptor; - - /// - /// Gets or sets the tablespace name or a filegroup name (according to RDBMS) - /// that contains this instance. - /// - /// The tablespace or a filegroup name. - public string Filegroup - { - get { return Name; } - set { Name = value; } - } - - /// - /// Gets or sets the partitionDescriptor. - /// - /// The partitionDescriptor. - public PartitionDescriptor PartitionDescriptor - { - get { return partitionDescriptor; } - set { - this.EnsureNotLocked(); - if (partitionDescriptor == value) - return; - if (partitionDescriptor!=null) - partitionDescriptor.Partitions.Remove(this); - partitionDescriptor = null; - if (value!=null && !value.Partitions.Contains(this)) - value.Partitions.Add(this); - } - } - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, PartitionDescriptor value) - { - this.EnsureNotLocked(); - partitionDescriptor = value; - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The partition descriptor. - /// The filegroup. - protected Partition(PartitionDescriptor partitionDescriptor, string filegroup) : base(filegroup) - { - PartitionDescriptor = partitionDescriptor; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a single partition object. + /// + [Serializable] + public abstract class Partition : Node, IPairedNode + { + private PartitionDescriptor partitionDescriptor; + + /// + /// Gets or sets the tablespace name or a filegroup name (according to RDBMS) + /// that contains this instance. + /// + /// The tablespace or a filegroup name. + public string Filegroup + { + get { return Name; } + set { Name = value; } + } + + /// + /// Gets or sets the partitionDescriptor. + /// + /// The partitionDescriptor. + public PartitionDescriptor PartitionDescriptor + { + get { return partitionDescriptor; } + set { + this.EnsureNotLocked(); + if (partitionDescriptor == value) + return; + if (partitionDescriptor!=null) + partitionDescriptor.Partitions.Remove(this); + partitionDescriptor = null; + if (value!=null && !value.Partitions.Contains(this)) + value.Partitions.Add(this); + } + } + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, PartitionDescriptor value) + { + this.EnsureNotLocked(); + partitionDescriptor = value; + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The partition descriptor. + /// The filegroup. + protected Partition(PartitionDescriptor partitionDescriptor, string filegroup) : base(filegroup) + { + PartitionDescriptor = partitionDescriptor; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionDescriptor.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionDescriptor.cs index 847d7ee334..c4ca99ae9f 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionDescriptor.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionDescriptor.cs @@ -1,184 +1,184 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a set of information concerning object partitioning. - /// - [Serializable] - public class PartitionDescriptor : Node - { - private IPartitionable owner; - private TableColumn column; - private int partitionAmount; - private PairedNodeCollection partitions; - private PartitionMethod partitionMethod; - private PartitionSchema partitionSchema; - - /// - /// Creates the hash partition. - /// - /// The filegroup. - /// - public HashPartition CreateHashPartition(string filegroup) - { - return new HashPartition(this, filegroup); - } - - /// - /// Creates the list partition. - /// - /// The filegroup. - /// The values. - /// - public ListPartition CreateListPartition(string filegroup, params string[] values) - { - return new ListPartition(this, filegroup, values); - } - - /// - /// Creates the range partition. - /// - /// The filegroup. - /// The boundary. - /// - public RangePartition CreateRangePartition(string filegroup, string boundary) - { - return new RangePartition(this, filegroup, boundary); - } - - /// - /// Gets or sets the owner. - /// - /// The owner. - public IPartitionable Owner - { - get { return owner; } - set { - this.EnsureNotLocked(); - IPartitionable old = owner; - owner = value; - if (old!=null && old.PartitionDescriptor==this) - old.PartitionDescriptor = null; - if (owner!=null && owner.PartitionDescriptor!=this) - owner.PartitionDescriptor = this; - } - } - - /// - /// Gets or sets the column against which an object will be partitioned. - /// - /// The column. - public TableColumn Column - { - get { return column; } - set - { - this.EnsureNotLocked(); - column = value; - } - } - - /// - /// Gets or sets the partition amount. - /// - /// The partition amount. - public int PartitionAmount - { - get { return partitionAmount; } - set - { - this.EnsureNotLocked(); - partitionAmount = value; - } - } - - /// - /// Gets the partitions. - /// - /// The partitions. - public PairedNodeCollection Partitions - { - get { return partitions; } - } - - /// - /// Gets or sets the partition method. - /// - /// The partition method. - public PartitionMethod PartitionMethod - { - get { return partitionMethod; } - set - { - this.EnsureNotLocked(); - partitionMethod = value; - } - } - - /// - /// Gets or sets the partition schema. - /// - /// The partition schema. - public PartitionSchema PartitionSchema - { - get { return partitionSchema; } - set - { - this.EnsureNotLocked(); - partitionSchema = value; - } - } - - #region Constructors - - private PartitionDescriptor(IPartitionable owner, TableColumn column) - { - this.owner = owner; - Column = column; - partitions = new PairedNodeCollection(this, "Partitions"); - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The column. - /// The partition schema. - public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionSchema partitionSchema) : this(owner, column) - { - this.partitionSchema = partitionSchema; - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The column. - /// The partition method. - /// The partition amount. - public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionMethod partitionMethod, int partitionAmount) : this(owner, column) - { - this.partitionAmount = partitionAmount; - this.partitionMethod = partitionMethod; - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The column. - /// The partition method. - public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionMethod partitionMethod) : this(owner, column) - { - this.partitionMethod = partitionMethod; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a set of information concerning object partitioning. + /// + [Serializable] + public class PartitionDescriptor : Node + { + private IPartitionable owner; + private TableColumn column; + private int partitionAmount; + private PairedNodeCollection partitions; + private PartitionMethod partitionMethod; + private PartitionSchema partitionSchema; + + /// + /// Creates the hash partition. + /// + /// The filegroup. + /// + public HashPartition CreateHashPartition(string filegroup) + { + return new HashPartition(this, filegroup); + } + + /// + /// Creates the list partition. + /// + /// The filegroup. + /// The values. + /// + public ListPartition CreateListPartition(string filegroup, params string[] values) + { + return new ListPartition(this, filegroup, values); + } + + /// + /// Creates the range partition. + /// + /// The filegroup. + /// The boundary. + /// + public RangePartition CreateRangePartition(string filegroup, string boundary) + { + return new RangePartition(this, filegroup, boundary); + } + + /// + /// Gets or sets the owner. + /// + /// The owner. + public IPartitionable Owner + { + get { return owner; } + set { + this.EnsureNotLocked(); + IPartitionable old = owner; + owner = value; + if (old!=null && old.PartitionDescriptor==this) + old.PartitionDescriptor = null; + if (owner!=null && owner.PartitionDescriptor!=this) + owner.PartitionDescriptor = this; + } + } + + /// + /// Gets or sets the column against which an object will be partitioned. + /// + /// The column. + public TableColumn Column + { + get { return column; } + set + { + this.EnsureNotLocked(); + column = value; + } + } + + /// + /// Gets or sets the partition amount. + /// + /// The partition amount. + public int PartitionAmount + { + get { return partitionAmount; } + set + { + this.EnsureNotLocked(); + partitionAmount = value; + } + } + + /// + /// Gets the partitions. + /// + /// The partitions. + public PairedNodeCollection Partitions + { + get { return partitions; } + } + + /// + /// Gets or sets the partition method. + /// + /// The partition method. + public PartitionMethod PartitionMethod + { + get { return partitionMethod; } + set + { + this.EnsureNotLocked(); + partitionMethod = value; + } + } + + /// + /// Gets or sets the partition schema. + /// + /// The partition schema. + public PartitionSchema PartitionSchema + { + get { return partitionSchema; } + set + { + this.EnsureNotLocked(); + partitionSchema = value; + } + } + + #region Constructors + + private PartitionDescriptor(IPartitionable owner, TableColumn column) + { + this.owner = owner; + Column = column; + partitions = new PairedNodeCollection(this, "Partitions"); + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The column. + /// The partition schema. + public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionSchema partitionSchema) : this(owner, column) + { + this.partitionSchema = partitionSchema; + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The column. + /// The partition method. + /// The partition amount. + public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionMethod partitionMethod, int partitionAmount) : this(owner, column) + { + this.partitionAmount = partitionAmount; + this.partitionMethod = partitionMethod; + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The column. + /// The partition method. + public PartitionDescriptor(IPartitionable owner, TableColumn column, PartitionMethod partitionMethod) : this(owner, column) + { + this.partitionMethod = partitionMethod; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionFunction.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionFunction.cs index 7980fbf579..7c90459697 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionFunction.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionFunction.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a function in the current catalog that maps the rows of a table or index - /// into partitions based on the values of a specified column. - /// - [Serializable] - public class PartitionFunction : CatalogNode - { - private SqlValueType dataType; - private BoundaryType boundaryType = BoundaryType.Left; - private string[] boundaryValues; - - /// - /// Gets or sets the data type of the column used for partitioning. - /// - /// The data type of the column used for partitioning. - public SqlValueType DataType - { - get { return dataType; } - set - { - this.EnsureNotLocked(); - dataType = value; - } - } - - /// - /// Gets or sets the boundary type that affects the partitioning behavior. - /// - /// The boundary type. - public BoundaryType BoundaryType - { - get { return boundaryType; } - set - { - this.EnsureNotLocked(); - boundaryType = value; - } - } - - /// - /// Gets or sets the boundary values for each partition of a partitioned table or index - /// that uses this partition function. - /// - /// The boundary values. - public string[] BoundaryValues - { - get { return boundaryValues; } - set - { - this.EnsureNotLocked(); - boundaryValues = value; - } - } - - #region CatalogNode Members - - /// - /// Changes the catalog. - /// - /// The new value of catalog property. - protected override void ChangeCatalog(Catalog value) - { - if (Catalog!=null) - Catalog.PartitionFunctions.Remove(this); - if (value!=null) - value.PartitionFunctions.Add(this); - } - - #endregion - - #region Constructors - - internal PartitionFunction(Catalog catalog, string name, SqlValueType dataType, - params string[] boundaryValues) : base(catalog, name) - { - this.dataType = dataType; - this.boundaryValues = boundaryValues; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a function in the current catalog that maps the rows of a table or index + /// into partitions based on the values of a specified column. + /// + [Serializable] + public class PartitionFunction : CatalogNode + { + private SqlValueType dataType; + private BoundaryType boundaryType = BoundaryType.Left; + private string[] boundaryValues; + + /// + /// Gets or sets the data type of the column used for partitioning. + /// + /// The data type of the column used for partitioning. + public SqlValueType DataType + { + get { return dataType; } + set + { + this.EnsureNotLocked(); + dataType = value; + } + } + + /// + /// Gets or sets the boundary type that affects the partitioning behavior. + /// + /// The boundary type. + public BoundaryType BoundaryType + { + get { return boundaryType; } + set + { + this.EnsureNotLocked(); + boundaryType = value; + } + } + + /// + /// Gets or sets the boundary values for each partition of a partitioned table or index + /// that uses this partition function. + /// + /// The boundary values. + public string[] BoundaryValues + { + get { return boundaryValues; } + set + { + this.EnsureNotLocked(); + boundaryValues = value; + } + } + + #region CatalogNode Members + + /// + /// Changes the catalog. + /// + /// The new value of catalog property. + protected override void ChangeCatalog(Catalog value) + { + if (Catalog!=null) + Catalog.PartitionFunctions.Remove(this); + if (value!=null) + value.PartitionFunctions.Add(this); + } + + #endregion + + #region Constructors + + internal PartitionFunction(Catalog catalog, string name, SqlValueType dataType, + params string[] boundaryValues) : base(catalog, name) + { + this.dataType = dataType; + this.boundaryValues = boundaryValues; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionSchema.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionSchema.cs index 7d6a1cb3a8..4a7fbbbd04 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionSchema.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/PartitionSchema.cs @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a schema in the current that maps the partitions of a - /// partitioned table or index to filegroups. The number and domain of the partitions of a - /// partitioned table or index are determined in a . - /// - [Serializable] - public class PartitionSchema : CatalogNode - { - private PartitionFunction partitionFunction; - private IList filegroups = new Collection(); - - /// - /// Specifies the names of the filegroups to hold the partitions specified - /// by . Filegroup name must already exist in the . - /// - /// The filegroups. - public IList Filegroups - { - get { return filegroups; } - } - - /// - /// Gets or sets the partition function. - /// - /// The partition function. - public PartitionFunction PartitionFunction - { - get { return partitionFunction; } - set { - this.EnsureNotLocked(); - if (partitionFunction == value) - return; - if (value!=null && Catalog!=null && !Catalog.PartitionFunctions.Contains(value)) - Catalog.PartitionFunctions.Add(value); - partitionFunction = value; - } - } - - #region CatalogNode Members - - /// - /// Changes the catalog. - /// - /// The new value of catalog property. - protected override void ChangeCatalog(Catalog value) - { - if (Catalog!=null) - Catalog.PartitionSchemas.Remove(this); - if (value!=null) - value.PartitionSchemas.Add(this); - } - - #endregion - - #region Constructors - - internal PartitionSchema(Catalog catalog, string name, PartitionFunction partitionFunction, - params string[] filegroups) : base(catalog, name) - { - this.partitionFunction = partitionFunction; - foreach (string filegroup in filegroups) - this.filegroups.Add(filegroup); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a schema in the current that maps the partitions of a + /// partitioned table or index to filegroups. The number and domain of the partitions of a + /// partitioned table or index are determined in a . + /// + [Serializable] + public class PartitionSchema : CatalogNode + { + private PartitionFunction partitionFunction; + private IList filegroups = new Collection(); + + /// + /// Specifies the names of the filegroups to hold the partitions specified + /// by . Filegroup name must already exist in the . + /// + /// The filegroups. + public IList Filegroups + { + get { return filegroups; } + } + + /// + /// Gets or sets the partition function. + /// + /// The partition function. + public PartitionFunction PartitionFunction + { + get { return partitionFunction; } + set { + this.EnsureNotLocked(); + if (partitionFunction == value) + return; + if (value!=null && Catalog!=null && !Catalog.PartitionFunctions.Contains(value)) + Catalog.PartitionFunctions.Add(value); + partitionFunction = value; + } + } + + #region CatalogNode Members + + /// + /// Changes the catalog. + /// + /// The new value of catalog property. + protected override void ChangeCatalog(Catalog value) + { + if (Catalog!=null) + Catalog.PartitionSchemas.Remove(this); + if (value!=null) + value.PartitionSchemas.Add(this); + } + + #endregion + + #region Constructors + + internal PartitionSchema(Catalog catalog, string name, PartitionFunction partitionFunction, + params string[] filegroups) : base(catalog, name) + { + this.partitionFunction = partitionFunction; + foreach (string filegroup in filegroups) + this.filegroups.Add(filegroup); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Partitioning/RangePartition.cs b/Orm/Xtensive.Orm/Sql/Model/Partitioning/RangePartition.cs index 2408f76a4f..5ad30791a1 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Partitioning/RangePartition.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Partitioning/RangePartition.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a range partition. - /// - [Serializable] - public class RangePartition : Partition - { - private string boundary; - - /// - /// Gets or sets the partition boundary. - /// - /// The boundary. - public string Boundary - { - get { return boundary; } - set - { - this.EnsureNotLocked(); - boundary = value; - } - } - - #region Constructors - - internal RangePartition(PartitionDescriptor partitionDescriptor, string filegroup, string boundary) - : base(partitionDescriptor, filegroup) - { - this.boundary = boundary; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a range partition. + /// + [Serializable] + public class RangePartition : Partition + { + private string boundary; + + /// + /// Gets or sets the partition boundary. + /// + /// The boundary. + public string Boundary + { + get { return boundary; } + set + { + this.EnsureNotLocked(); + boundary = value; + } + } + + #region Constructors + + internal RangePartition(PartitionDescriptor partitionDescriptor, string filegroup, string boundary) + : base(partitionDescriptor, filegroup) + { + this.boundary = boundary; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/ReferentialAction.cs b/Orm/Xtensive.Orm/Sql/Model/ReferentialAction.cs index 0690c3a31b..398012aa36 100644 --- a/Orm/Xtensive.Orm/Sql/Model/ReferentialAction.cs +++ b/Orm/Xtensive.Orm/Sql/Model/ReferentialAction.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Defines all possible actions applicable in the case - /// of foreign key conflict. - /// - [Serializable] - public enum ReferentialAction - { - /// - /// Indicates that RDBMS is capable to do nothing in the case of some - /// foreign key conflict. - /// - NoAction = 0, - - /// - /// Indicates that RDBMS is capable to block execution of any instruction - /// leading to foreign key conflict. - /// - Restrict = 1, - - /// - /// Indicates that RDBMS is capable to perform some cascading operation - /// (delete or update) in order to preserve referential integrity if - /// it violated by some executed instruction. - /// - Cascade = 2, - - /// - /// Indicates that RDBMS is capable to assign default value to a field - /// referenced by foreign key constraint in order to preserve referential - /// integrity if it violated by some executed instruction. - /// - SetDefault = 3, - - /// - /// Indicates that RDBMS is capable to assign NULL to a field - /// referenced by foreign key constraint in order to preserve referential - /// integrity if it violated by some executed instruction. - /// - SetNull = 4, - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Defines all possible actions applicable in the case + /// of foreign key conflict. + /// + [Serializable] + public enum ReferentialAction + { + /// + /// Indicates that RDBMS is capable to do nothing in the case of some + /// foreign key conflict. + /// + NoAction = 0, + + /// + /// Indicates that RDBMS is capable to block execution of any instruction + /// leading to foreign key conflict. + /// + Restrict = 1, + + /// + /// Indicates that RDBMS is capable to perform some cascading operation + /// (delete or update) in order to preserve referential integrity if + /// it violated by some executed instruction. + /// + Cascade = 2, + + /// + /// Indicates that RDBMS is capable to assign default value to a field + /// referenced by foreign key constraint in order to preserve referential + /// integrity if it violated by some executed instruction. + /// + SetDefault = 3, + + /// + /// Indicates that RDBMS is capable to assign NULL to a field + /// referenced by foreign key constraint in order to preserve referential + /// integrity if it violated by some executed instruction. + /// + SetNull = 4, + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Schema.cs b/Orm/Xtensive.Orm/Sql/Model/Schema.cs index 85a424e682..d3e1ba6771 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Schema.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Schema.cs @@ -1,277 +1,277 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// A schema is a persistent descriptor that includes the name of the SQL-schema, - /// the default character set for the schema, - /// and the descriptor of every component of the schema. - /// - [Serializable] - public class Schema : CatalogNode - { - private CharacterSet defaultCharacterSet; - - /// - /// Creates the sequence. - /// - /// The name. - public Sequence CreateSequence(string name) - { - return new Sequence(this, name); - } - - /// - /// Creates the temporary table. - /// - /// The name. - public TemporaryTable CreateTemporaryTable(string name) - { - return new TemporaryTable(this, name); - } - - /// - /// Creates the table. - /// - /// The name. - public Table CreateTable(string name) - { - return new Table(this, name); - } - - /// - /// Creates the view. - /// - /// The name. - public View CreateView(string name) - { - return new View(this, name); - } - - /// - /// Creates the view. - /// - /// The name. - /// The select statement. - public View CreateView(string name, SqlNative definition) - { - return new View(this, name, definition); - } - - /// - /// Creates the view. - /// - /// The name. - /// The select statement. - /// The check options. - public View CreateView(string name, SqlNative definition, CheckOptions checkOptions) - { - return new View(this, name, definition, checkOptions); - } - - /// - /// Creates the assertion. - /// - /// The name. - /// The condition. - /// Is assertion deferrable. - /// Is assertion initially deferred. - public Assertion CreateAssertion(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) - { - return new Assertion(this, name, condition, isDeferrable, isInitiallyDeferred); - } - - /// - /// Creates the assertion. - /// - /// The name. - /// The condition. - public Assertion CreateAssertion(string name, SqlExpression condition) - { - return new Assertion(this, name, condition, null, null); - } - - /// - /// Creates the character set. - /// - /// The name. - public CharacterSet CreateCharacterSet(string name) - { - return new CharacterSet(this, name); - } - - /// - /// Creates the translation. - /// - /// The name. - public Translation CreateTranslation(string name) - { - return new Translation(this, name); - } - - /// - /// Creates the collation. - /// - /// The name. - public Collation CreateCollation(string name) - { - return new Collation(this, name); - } - - /// - /// Creates the domain. - /// - /// The name. - /// Datatype. - /// The default value. - public Domain CreateDomain(string name, SqlValueType dataType, SqlExpression defaultValue) - { - return new Domain(this, name, dataType, defaultValue); - } - - /// - /// Creates the domain. - /// - /// The name. - /// Datatype. - public Domain CreateDomain(string name, SqlValueType dataType) - { - return new Domain(this, name, dataType, null); - } - - /// - /// Gets the sequences. - /// - /// The sequences. - public PairedNodeCollection Sequences { get; private set; } - - /// - /// Gets the assertions. - /// - /// The assertions. - public PairedNodeCollection Assertions { get; private set; } - - /// - /// Gets the domains. - /// - /// The domains. - public PairedNodeCollection Domains { get; private set; } - - /// - /// Gets the collations. - /// - /// The collations. - public PairedNodeCollection Collations { get; private set; } - - /// - /// Gets the character sets. - /// - /// The character sets. - public PairedNodeCollection CharacterSets { get; private set; } - - /// - /// Gets or sets the default character set. - /// - /// The default character set. - public CharacterSet DefaultCharacterSet - { - get - { - if (defaultCharacterSet != null) - return defaultCharacterSet; - if (CharacterSets.Count > 0) - return CharacterSets[0]; - return null; - } - set { - this.EnsureNotLocked(); - if (defaultCharacterSet == value) - return; - if (value!=null && !CharacterSets.Contains(value)) - CharacterSets.Add(value); - defaultCharacterSet = value; - } - } - - /// - /// Gets the translations. - /// - /// The translations. - public PairedNodeCollection Translations { get; private set; } - - /// - /// Gets the views. - /// - /// The views. - public PairedNodeCollection Views { get; private set; } - - /// - /// Gets the tables. - /// - /// The tables. - public PairedNodeCollection Tables { get; private set; } - - /// - /// Gets or sets the owner. - /// - /// The owner. - public string Owner { get; set; } - - #region CatalogNode Members - - /// - /// Changes the catalog. - /// - /// The new value of catalog property. - protected override void ChangeCatalog(Catalog value) - { - if (Catalog!=null) - Catalog.Schemas.Remove(this); - if (value!=null) - value.Schemas.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - Tables.Lock(recursive); - Views.Lock(recursive); - Assertions.Lock(recursive); - CharacterSets.Lock(recursive); - Collations.Lock(recursive); - Translations.Lock(recursive); - Domains.Lock(recursive); - Sequences.Lock(recursive); - } - - #endregion - - // Constructors - - internal Schema(Catalog catalog, string name) - : base(catalog, name) - { - Tables = new PairedNodeCollection(this, "Tables"); - Views = new PairedNodeCollection(this, "Views"); - Assertions = new PairedNodeCollection(this, "Assertions"); - CharacterSets = new PairedNodeCollection(this, "CharacterSets"); - Collations = new PairedNodeCollection(this, "Collations"); - Translations = new PairedNodeCollection(this, "Translations"); - Domains = new PairedNodeCollection(this, "Domains"); - Sequences = new PairedNodeCollection(this, "Sequences"); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// A schema is a persistent descriptor that includes the name of the SQL-schema, + /// the default character set for the schema, + /// and the descriptor of every component of the schema. + /// + [Serializable] + public class Schema : CatalogNode + { + private CharacterSet defaultCharacterSet; + + /// + /// Creates the sequence. + /// + /// The name. + public Sequence CreateSequence(string name) + { + return new Sequence(this, name); + } + + /// + /// Creates the temporary table. + /// + /// The name. + public TemporaryTable CreateTemporaryTable(string name) + { + return new TemporaryTable(this, name); + } + + /// + /// Creates the table. + /// + /// The name. + public Table CreateTable(string name) + { + return new Table(this, name); + } + + /// + /// Creates the view. + /// + /// The name. + public View CreateView(string name) + { + return new View(this, name); + } + + /// + /// Creates the view. + /// + /// The name. + /// The select statement. + public View CreateView(string name, SqlNative definition) + { + return new View(this, name, definition); + } + + /// + /// Creates the view. + /// + /// The name. + /// The select statement. + /// The check options. + public View CreateView(string name, SqlNative definition, CheckOptions checkOptions) + { + return new View(this, name, definition, checkOptions); + } + + /// + /// Creates the assertion. + /// + /// The name. + /// The condition. + /// Is assertion deferrable. + /// Is assertion initially deferred. + public Assertion CreateAssertion(string name, SqlExpression condition, bool? isDeferrable, bool? isInitiallyDeferred) + { + return new Assertion(this, name, condition, isDeferrable, isInitiallyDeferred); + } + + /// + /// Creates the assertion. + /// + /// The name. + /// The condition. + public Assertion CreateAssertion(string name, SqlExpression condition) + { + return new Assertion(this, name, condition, null, null); + } + + /// + /// Creates the character set. + /// + /// The name. + public CharacterSet CreateCharacterSet(string name) + { + return new CharacterSet(this, name); + } + + /// + /// Creates the translation. + /// + /// The name. + public Translation CreateTranslation(string name) + { + return new Translation(this, name); + } + + /// + /// Creates the collation. + /// + /// The name. + public Collation CreateCollation(string name) + { + return new Collation(this, name); + } + + /// + /// Creates the domain. + /// + /// The name. + /// Datatype. + /// The default value. + public Domain CreateDomain(string name, SqlValueType dataType, SqlExpression defaultValue) + { + return new Domain(this, name, dataType, defaultValue); + } + + /// + /// Creates the domain. + /// + /// The name. + /// Datatype. + public Domain CreateDomain(string name, SqlValueType dataType) + { + return new Domain(this, name, dataType, null); + } + + /// + /// Gets the sequences. + /// + /// The sequences. + public PairedNodeCollection Sequences { get; private set; } + + /// + /// Gets the assertions. + /// + /// The assertions. + public PairedNodeCollection Assertions { get; private set; } + + /// + /// Gets the domains. + /// + /// The domains. + public PairedNodeCollection Domains { get; private set; } + + /// + /// Gets the collations. + /// + /// The collations. + public PairedNodeCollection Collations { get; private set; } + + /// + /// Gets the character sets. + /// + /// The character sets. + public PairedNodeCollection CharacterSets { get; private set; } + + /// + /// Gets or sets the default character set. + /// + /// The default character set. + public CharacterSet DefaultCharacterSet + { + get + { + if (defaultCharacterSet != null) + return defaultCharacterSet; + if (CharacterSets.Count > 0) + return CharacterSets[0]; + return null; + } + set { + this.EnsureNotLocked(); + if (defaultCharacterSet == value) + return; + if (value!=null && !CharacterSets.Contains(value)) + CharacterSets.Add(value); + defaultCharacterSet = value; + } + } + + /// + /// Gets the translations. + /// + /// The translations. + public PairedNodeCollection Translations { get; private set; } + + /// + /// Gets the views. + /// + /// The views. + public PairedNodeCollection Views { get; private set; } + + /// + /// Gets the tables. + /// + /// The tables. + public PairedNodeCollection Tables { get; private set; } + + /// + /// Gets or sets the owner. + /// + /// The owner. + public string Owner { get; set; } + + #region CatalogNode Members + + /// + /// Changes the catalog. + /// + /// The new value of catalog property. + protected override void ChangeCatalog(Catalog value) + { + if (Catalog!=null) + Catalog.Schemas.Remove(this); + if (value!=null) + value.Schemas.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + Tables.Lock(recursive); + Views.Lock(recursive); + Assertions.Lock(recursive); + CharacterSets.Lock(recursive); + Collations.Lock(recursive); + Translations.Lock(recursive); + Domains.Lock(recursive); + Sequences.Lock(recursive); + } + + #endregion + + // Constructors + + internal Schema(Catalog catalog, string name) + : base(catalog, name) + { + Tables = new PairedNodeCollection(this, "Tables"); + Views = new PairedNodeCollection(this, "Views"); + Assertions = new PairedNodeCollection(this, "Assertions"); + CharacterSets = new PairedNodeCollection(this, "CharacterSets"); + Collations = new PairedNodeCollection(this, "Collations"); + Translations = new PairedNodeCollection(this, "Translations"); + Domains = new PairedNodeCollection(this, "Domains"); + Sequences = new PairedNodeCollection(this, "Sequences"); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/SchemaNode.cs b/Orm/Xtensive.Orm/Sql/Model/SchemaNode.cs index ee9802846b..d117b89558 100644 --- a/Orm/Xtensive.Orm/Sql/Model/SchemaNode.cs +++ b/Orm/Xtensive.Orm/Sql/Model/SchemaNode.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents any bound . - /// - [Serializable] - public abstract class SchemaNode : Node, IPairedNode - { - private Schema schema; - - /// - /// instance this instance belongs to. - /// - public Schema Schema - { - get { return schema; } - set { - this.EnsureNotLocked(); - if (schema != value) - ChangeSchema(value); - } - } - - /// - /// Changes the schema. - /// - /// The value. - protected abstract void ChangeSchema(Schema value); - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - void IPairedNode.UpdatePairedProperty(string property, Schema value) - { - this.EnsureNotLocked(); - schema = value; - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The schema. - /// The name. - protected SchemaNode(Schema schema, string name) : base(name) - { - ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); - Schema = schema; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents any bound . + /// + [Serializable] + public abstract class SchemaNode : Node, IPairedNode + { + private Schema schema; + + /// + /// instance this instance belongs to. + /// + public Schema Schema + { + get { return schema; } + set { + this.EnsureNotLocked(); + if (schema != value) + ChangeSchema(value); + } + } + + /// + /// Changes the schema. + /// + /// The value. + protected abstract void ChangeSchema(Schema value); + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + void IPairedNode.UpdatePairedProperty(string property, Schema value) + { + this.EnsureNotLocked(); + schema = value; + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The schema. + /// The name. + protected SchemaNode(Schema schema, string name) : base(name) + { + ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); + Schema = schema; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Sequence.cs b/Orm/Xtensive.Orm/Sql/Model/Sequence.cs index 01e85e2329..826136fad0 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Sequence.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Sequence.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents an object that generates unique numbers, mostly used for primary key values. - /// - [Serializable] - public class Sequence : SchemaNode, ISequenceable - { - private SqlValueType dataType; - private SequenceDescriptor sequenceDescriptor; - - /// - /// Gets or sets the sequence descriptor. - /// - /// The sequence descriptor. - public SequenceDescriptor SequenceDescriptor - { - get { return sequenceDescriptor; } - set { - this.EnsureNotLocked(); - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - sequenceDescriptor = value; - SequenceDescriptor old = sequenceDescriptor; - sequenceDescriptor = value; - if (old!=null && old.Owner==this) - old.Owner = null; - if (sequenceDescriptor!=null && sequenceDescriptor.Owner!=this) - sequenceDescriptor.Owner = this; - } - } - - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Sequences.Remove(this); - if (value!=null) - value.Sequences.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - if (sequenceDescriptor!=null) - sequenceDescriptor.Lock(recursive); - } - - #endregion - - #region Constructors - - internal Sequence(Schema schema, string name) : base(schema, name) - { - sequenceDescriptor = new SequenceDescriptor(this); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents an object that generates unique numbers, mostly used for primary key values. + /// + [Serializable] + public class Sequence : SchemaNode, ISequenceable + { + private SqlValueType dataType; + private SequenceDescriptor sequenceDescriptor; + + /// + /// Gets or sets the sequence descriptor. + /// + /// The sequence descriptor. + public SequenceDescriptor SequenceDescriptor + { + get { return sequenceDescriptor; } + set { + this.EnsureNotLocked(); + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + sequenceDescriptor = value; + SequenceDescriptor old = sequenceDescriptor; + sequenceDescriptor = value; + if (old!=null && old.Owner==this) + old.Owner = null; + if (sequenceDescriptor!=null && sequenceDescriptor.Owner!=this) + sequenceDescriptor.Owner = this; + } + } + + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Sequences.Remove(this); + if (value!=null) + value.Sequences.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + if (sequenceDescriptor!=null) + sequenceDescriptor.Lock(recursive); + } + + #endregion + + #region Constructors + + internal Sequence(Schema schema, string name) : base(schema, name) + { + sequenceDescriptor = new SequenceDescriptor(this); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/SequenceDescriptor.cs b/Orm/Xtensive.Orm/Sql/Model/SequenceDescriptor.cs index 42e345c9eb..6b3a3e812e 100644 --- a/Orm/Xtensive.Orm/Sql/Model/SequenceDescriptor.cs +++ b/Orm/Xtensive.Orm/Sql/Model/SequenceDescriptor.cs @@ -1,215 +1,215 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a set of information concerning sequence. - /// - [Serializable] - public class SequenceDescriptor : Node, ICloneable - { - private ISequenceable owner; - private long? startValue; - private long? increment; - private long? maxValue; - private long? minValue; - private bool? isCyclic; - private long? lastValue; - - /// - /// Gets or sets the owner. - /// - /// The owner. - public ISequenceable Owner - { - get { return owner; } - set { - this.EnsureNotLocked(); - ISequenceable old = owner; - owner = value; - if (old!=null && old.SequenceDescriptor==this) - old.SequenceDescriptor = null; - if (owner!=null && owner.SequenceDescriptor!=this) - owner.SequenceDescriptor = this; - } - } - - /// - /// Gets or sets the start value. - /// - /// - /// The start value must lie between the minimum and maximum value. - /// - public long? StartValue - { - get { return startValue; } - set - { - this.EnsureNotLocked(); - startValue = value; - } - } - - /// - /// Gets or sets the increment. - /// - /// - /// If increment is not specified, then an increment of 1 - /// is implicit. Increment must not be 0. - /// - public long? Increment - { - get { return increment; } - set { - this.EnsureNotLocked(); - if (value.HasValue && value.Value == 0) - throw new ArgumentException(Strings.ExIncrementMustNotBeZero); - increment = value; - } - } - - /// - /// Gets or sets the max value. - /// - /// - /// The maximum value must be greater than the minimum value. - /// - public long? MaxValue - { - get { return maxValue; } - set { - this.EnsureNotLocked(); - maxValue = value; - } - } - - /// - /// Gets or sets the min value. - /// - /// - /// The maximum value must be greater than the minimum value. - /// - public long? MinValue - { - get { return minValue; } - set - { - this.EnsureNotLocked(); - minValue = value; - } - } - - /// - /// Gets or sets the last value. - /// - public long? LastValue - { - get { return lastValue; } - set - { - this.EnsureNotLocked(); - lastValue = value; - } - } - - /// - /// Gets or sets a value indicating whether this instance is isCyclic. - /// - /// if isCyclic; otherwise, . - public bool? IsCyclic - { - get { return isCyclic; } - set - { - this.EnsureNotLocked(); - isCyclic = value; - } - } - - - #region IClonable Members - - /// - ///Creates a new object that is a copy of the current instance. - /// - /// - ///A new object that is a copy of this instance. - /// - public object Clone() - { - return new SequenceDescriptor(owner, startValue, increment, maxValue, minValue, isCyclic); - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - public SequenceDescriptor(ISequenceable owner) - { - this.owner = owner; - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The start value. - public SequenceDescriptor(ISequenceable owner, long? startValue) - : this(owner, startValue, null, null, null, null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The start value. - /// The increment. - public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment) - : this(owner, startValue, increment, null, null, null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The start value. - /// The increment. - /// The max value. - /// The min value. - public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment, long? maxValue, long? minValue) - : this(owner, startValue, increment, maxValue, minValue, null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The owner. - /// The start value. - /// The increment. - /// The max value. - /// The min value. - /// The is cyclic. - public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment, long? maxValue, long? minValue, bool? isCyclic) - { - StartValue = startValue; - Increment = increment; - this.maxValue = maxValue; - this.minValue = minValue; - this.isCyclic = isCyclic; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a set of information concerning sequence. + /// + [Serializable] + public class SequenceDescriptor : Node, ICloneable + { + private ISequenceable owner; + private long? startValue; + private long? increment; + private long? maxValue; + private long? minValue; + private bool? isCyclic; + private long? lastValue; + + /// + /// Gets or sets the owner. + /// + /// The owner. + public ISequenceable Owner + { + get { return owner; } + set { + this.EnsureNotLocked(); + ISequenceable old = owner; + owner = value; + if (old!=null && old.SequenceDescriptor==this) + old.SequenceDescriptor = null; + if (owner!=null && owner.SequenceDescriptor!=this) + owner.SequenceDescriptor = this; + } + } + + /// + /// Gets or sets the start value. + /// + /// + /// The start value must lie between the minimum and maximum value. + /// + public long? StartValue + { + get { return startValue; } + set + { + this.EnsureNotLocked(); + startValue = value; + } + } + + /// + /// Gets or sets the increment. + /// + /// + /// If increment is not specified, then an increment of 1 + /// is implicit. Increment must not be 0. + /// + public long? Increment + { + get { return increment; } + set { + this.EnsureNotLocked(); + if (value.HasValue && value.Value == 0) + throw new ArgumentException(Strings.ExIncrementMustNotBeZero); + increment = value; + } + } + + /// + /// Gets or sets the max value. + /// + /// + /// The maximum value must be greater than the minimum value. + /// + public long? MaxValue + { + get { return maxValue; } + set { + this.EnsureNotLocked(); + maxValue = value; + } + } + + /// + /// Gets or sets the min value. + /// + /// + /// The maximum value must be greater than the minimum value. + /// + public long? MinValue + { + get { return minValue; } + set + { + this.EnsureNotLocked(); + minValue = value; + } + } + + /// + /// Gets or sets the last value. + /// + public long? LastValue + { + get { return lastValue; } + set + { + this.EnsureNotLocked(); + lastValue = value; + } + } + + /// + /// Gets or sets a value indicating whether this instance is isCyclic. + /// + /// if isCyclic; otherwise, . + public bool? IsCyclic + { + get { return isCyclic; } + set + { + this.EnsureNotLocked(); + isCyclic = value; + } + } + + + #region IClonable Members + + /// + ///Creates a new object that is a copy of the current instance. + /// + /// + ///A new object that is a copy of this instance. + /// + public object Clone() + { + return new SequenceDescriptor(owner, startValue, increment, maxValue, minValue, isCyclic); + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + public SequenceDescriptor(ISequenceable owner) + { + this.owner = owner; + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The start value. + public SequenceDescriptor(ISequenceable owner, long? startValue) + : this(owner, startValue, null, null, null, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The start value. + /// The increment. + public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment) + : this(owner, startValue, increment, null, null, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The start value. + /// The increment. + /// The max value. + /// The min value. + public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment, long? maxValue, long? minValue) + : this(owner, startValue, increment, maxValue, minValue, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The owner. + /// The start value. + /// The increment. + /// The max value. + /// The min value. + /// The is cyclic. + public SequenceDescriptor(ISequenceable owner, long? startValue, long? increment, long? maxValue, long? minValue, bool? isCyclic) + { + StartValue = startValue; + Increment = increment; + this.maxValue = maxValue; + this.minValue = minValue; + this.isCyclic = isCyclic; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/SpatialIndex.cs b/Orm/Xtensive.Orm/Sql/Model/SpatialIndex.cs index c633ab402f..0ce8622e75 100644 --- a/Orm/Xtensive.Orm/Sql/Model/SpatialIndex.cs +++ b/Orm/Xtensive.Orm/Sql/Model/SpatialIndex.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2011.09.25 - -using System; - -namespace Xtensive.Sql.Model -{ - public class SpatialIndex : Index - { - public override bool IsSpatial - { - get { return true; } - } - - internal SpatialIndex(DataTable dataTable, string name) - : base(dataTable, name) - { - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2011.09.25 + +using System; + +namespace Xtensive.Sql.Model +{ + public class SpatialIndex : Index + { + public override bool IsSpatial + { + get { return true; } + } + + internal SpatialIndex(DataTable dataTable, string name) + : base(dataTable, name) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/SqlModelVisitor.cs b/Orm/Xtensive.Orm/Sql/Model/SqlModelVisitor.cs index 778110765a..bc5b238efc 100644 --- a/Orm/Xtensive.Orm/Sql/Model/SqlModelVisitor.cs +++ b/Orm/Xtensive.Orm/Sql/Model/SqlModelVisitor.cs @@ -1,347 +1,347 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Ivan Galkin -// Created: 2009.03.31 - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// An abstract base class for all database model visitors. - /// - public abstract class SqlModelVisitor - where TResult : class - { - - /// - /// Visits a node. - /// - /// The node. - /// Visit result. - /// Node type is unknown. - protected virtual TResult Visit(Node node) - { - var characterSet = node as CharacterSet; - if (characterSet!=null) - return VisitCharacterSet(characterSet); - var collation = node as Collation; - if (collation!=null) - return VisitCollation(collation); - var temporaryTable = node as TemporaryTable; - if (temporaryTable!=null) - return VisitTemporaryTable(temporaryTable); - var table = node as Table; - if (table!=null) - return VisitTable(table); - var view = node as View; - if (view!=null) - return VisitView(view); - var dataTable = node as DataTable; - if (dataTable!=null) - return VisitDataTable(dataTable); - var tableColumn = node as TableColumn; - if (tableColumn!=null) - return VisitTableColumn(tableColumn); - var viewColumn = node as ViewColumn; - if (viewColumn!=null) - return VisitViewColumn(viewColumn); - var dataTableColumn = node as DataTableColumn; - if (dataTableColumn!=null) - return VisitDataTableColumn(dataTableColumn); - var domain = node as Domain; - if (domain!=null) - return VisitDomain(domain); - var ftIndex = node as FullTextIndex; - if (ftIndex != null) - return VisitFullTextIndex(ftIndex); - var index = node as Index; - if (index!=null) - return VisitIndex(index); - var indexColumn = node as IndexColumn; - if (indexColumn!=null) - return VisitIndexColumn(indexColumn); - var foreignKey = node as ForeignKey; - if (foreignKey!=null) - return VisitForeignKey(foreignKey); - var primaryKey = node as PrimaryKey; - if (primaryKey!=null) - return VisitPrimaryKey(primaryKey); - var uniqueConstraint = node as UniqueConstraint; - if (uniqueConstraint!=null) - return VisitUniqueConstraint(uniqueConstraint); - var checkConstraint = node as CheckConstraint; - if (checkConstraint!=null) - return VisitCheckConstraint(checkConstraint); - var domainConstraint = node as DomainConstraint; - if (domainConstraint!=null) - return VisitDomainConstraint(domainConstraint); - var constraint = node as Constraint; - if (constraint!=null) - return VisitConstraint(constraint); - var schema = node as Schema; - if (schema!=null) - return VisitSchema(schema); - var sequence = node as Sequence; - if (sequence!=null) - return VisitSequence(sequence); - var sequenceDescriptor = node as SequenceDescriptor; - if (sequenceDescriptor!=null) - return VisitSequenceDescriptor(sequenceDescriptor); - var catalog = node as Catalog; - if (catalog!=null) - return VisitCatalog(catalog); - var translation = node as Translation; - if (translation!=null) - return VisitTranslation(translation); - var hashPartition = node as HashPartition; - if (hashPartition!=null) - return VisitHashPartition(hashPartition); - var listPartition = node as ListPartition; - if (listPartition!=null) - return VisitListPartition(listPartition); - var rangePartition = node as RangePartition; - if (rangePartition!=null) - return VisitRangePartition(rangePartition); - var partition = node as Partition; - if (partition!=null) - return VisitPartition(partition); - var partitionDescriptor = node as PartitionDescriptor; - if (partitionDescriptor!=null) - return VisitPartitionDescriptor(partitionDescriptor); - var partitionFunction = node as PartitionFunction; - if (partitionFunction!=null) - return VisitPartitionFunction(partitionFunction); - var partitionSchema = node as PartitionSchema; - if (partitionSchema!=null) - return VisitPartitionSchema(partitionSchema); - - throw new ArgumentException(Strings.ExNodeTypeIsUnknown, "node"); - } - - /// - /// Visits unique constraint. - /// - /// The constraint. - /// Visit result. - protected abstract TResult VisitUniqueConstraint(UniqueConstraint constraint); - - /// - /// Visits table constraint. - /// - /// The constraint. - /// Visit result. - protected abstract TResult VisitTableConstraint(TableConstraint constraint); - - /// - /// Visits primary key. - /// - /// The key. - /// Visit result. - protected abstract TResult VisitPrimaryKey(PrimaryKey key); - - /// - /// Visits foreign key. - /// - /// The key. - /// Visit result. - protected abstract TResult VisitForeignKey(ForeignKey key); - - /// - /// Visits domain constraint. - /// - /// The constraint. - /// Visit result. - protected abstract TResult VisitDomainConstraint(DomainConstraint constraint); - - /// - /// Visits a constraint. - /// - /// The constraint. - /// Visit result. - protected abstract TResult VisitConstraint(Constraint constraint); - - /// - /// Visits check constraint. - /// - /// The constraint. - /// Visit result. - protected abstract TResult VisitCheckConstraint(CheckConstraint constraint); - - /// - /// Visits range partition. - /// - /// The range partition. - /// Visit result. - protected abstract TResult VisitRangePartition(RangePartition rangePartition); - - /// - /// Visits partition schema. - /// - /// The partition schema. - /// Visit result. - protected abstract TResult VisitPartitionSchema(PartitionSchema partitionSchema); - - /// - /// Visits partition function. - /// - /// The partition function. - /// Visit result. - protected abstract TResult VisitPartitionFunction(PartitionFunction partitionFunction); - - /// - /// Visits partition descriptor. - /// - /// The partition descriptor. - /// Visit result. - protected abstract TResult VisitPartitionDescriptor(PartitionDescriptor partitionDescriptor); - - /// - /// Visits a partition. - /// - /// The partition. - /// Visit result. - protected abstract TResult VisitPartition(Partition partition); - - /// - /// Visits list partition. - /// - /// The list partition. - /// Visit result. - protected abstract TResult VisitListPartition(ListPartition listPartition); - - /// - /// Visits hash partition. - /// - /// The hash partition. - /// Visit result. - protected abstract TResult VisitHashPartition(HashPartition hashPartition); - - /// - /// Visits a catalog. - /// - /// The catalog. - /// Visit result. - protected abstract TResult VisitCatalog(Catalog catalog); - - /// - /// Visits character set. - /// - /// The character set. - /// Visit result. - protected abstract TResult VisitCharacterSet(CharacterSet characterSet); - - /// - /// Visits a collation. - /// - /// The collation. - /// Visit result. - protected abstract TResult VisitCollation(Collation collation); - - /// - /// Visits data table. - /// - /// The data table. - /// Visit result. - protected abstract TResult VisitDataTable(DataTable dataTable); - - /// - /// Visits data table column. - /// - /// The data table column. - /// Visit result. - protected abstract TResult VisitDataTableColumn(DataTableColumn dataTableColumn); - - /// - /// Visits a domain. - /// - /// The domain. - /// Visit result. - protected abstract TResult VisitDomain(Domain domain); - - /// - /// Visits the full-text index. - /// - /// The index. - /// Visit result. - protected abstract TResult VisitFullTextIndex(FullTextIndex index); - - /// - /// Visits an index. - /// - /// The index. - /// Visit result. - protected abstract TResult VisitIndex(Index index); - - /// - /// Visits index column. - /// - /// The index column. - /// Visit result. - protected abstract TResult VisitIndexColumn(IndexColumn indexColumn); - - /// - /// Visits a schema. - /// - /// The schema. - /// Visit result. - protected abstract TResult VisitSchema(Schema schema); - - /// - /// Visits a sequence. - /// - /// The sequence. - /// Visit result. - protected abstract TResult VisitSequence(Sequence sequence); - - /// - /// Visits sequence descriptor. - /// - /// The sequence descriptor. - /// Visit result. - protected abstract TResult VisitSequenceDescriptor(SequenceDescriptor sequenceDescriptor); - - /// - /// Visits a table. - /// - /// The table. - /// Visit result. - protected abstract TResult VisitTable(Table table); - - /// - /// Visits table column. - /// - /// The table column. - /// Visit result. - protected abstract TResult VisitTableColumn(TableColumn tableColumn); - - /// - /// Visits temporary table. - /// - /// The temporary table. - /// Visit result. - protected abstract TResult VisitTemporaryTable(TemporaryTable temporaryTable); - - /// - /// Visits a translation. - /// - /// The translation. - /// Visit result. - protected abstract TResult VisitTranslation(Translation translation); - - /// - /// Visits a view. - /// - /// The view. - /// Visit result. - protected abstract TResult VisitView(View view); - - /// - /// Visits view column. - /// - /// The view column. - /// Visit result. - protected abstract TResult VisitViewColumn(ViewColumn viewColumn); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Ivan Galkin +// Created: 2009.03.31 + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// An abstract base class for all database model visitors. + /// + public abstract class SqlModelVisitor + where TResult : class + { + + /// + /// Visits a node. + /// + /// The node. + /// Visit result. + /// Node type is unknown. + protected virtual TResult Visit(Node node) + { + var characterSet = node as CharacterSet; + if (characterSet!=null) + return VisitCharacterSet(characterSet); + var collation = node as Collation; + if (collation!=null) + return VisitCollation(collation); + var temporaryTable = node as TemporaryTable; + if (temporaryTable!=null) + return VisitTemporaryTable(temporaryTable); + var table = node as Table; + if (table!=null) + return VisitTable(table); + var view = node as View; + if (view!=null) + return VisitView(view); + var dataTable = node as DataTable; + if (dataTable!=null) + return VisitDataTable(dataTable); + var tableColumn = node as TableColumn; + if (tableColumn!=null) + return VisitTableColumn(tableColumn); + var viewColumn = node as ViewColumn; + if (viewColumn!=null) + return VisitViewColumn(viewColumn); + var dataTableColumn = node as DataTableColumn; + if (dataTableColumn!=null) + return VisitDataTableColumn(dataTableColumn); + var domain = node as Domain; + if (domain!=null) + return VisitDomain(domain); + var ftIndex = node as FullTextIndex; + if (ftIndex != null) + return VisitFullTextIndex(ftIndex); + var index = node as Index; + if (index!=null) + return VisitIndex(index); + var indexColumn = node as IndexColumn; + if (indexColumn!=null) + return VisitIndexColumn(indexColumn); + var foreignKey = node as ForeignKey; + if (foreignKey!=null) + return VisitForeignKey(foreignKey); + var primaryKey = node as PrimaryKey; + if (primaryKey!=null) + return VisitPrimaryKey(primaryKey); + var uniqueConstraint = node as UniqueConstraint; + if (uniqueConstraint!=null) + return VisitUniqueConstraint(uniqueConstraint); + var checkConstraint = node as CheckConstraint; + if (checkConstraint!=null) + return VisitCheckConstraint(checkConstraint); + var domainConstraint = node as DomainConstraint; + if (domainConstraint!=null) + return VisitDomainConstraint(domainConstraint); + var constraint = node as Constraint; + if (constraint!=null) + return VisitConstraint(constraint); + var schema = node as Schema; + if (schema!=null) + return VisitSchema(schema); + var sequence = node as Sequence; + if (sequence!=null) + return VisitSequence(sequence); + var sequenceDescriptor = node as SequenceDescriptor; + if (sequenceDescriptor!=null) + return VisitSequenceDescriptor(sequenceDescriptor); + var catalog = node as Catalog; + if (catalog!=null) + return VisitCatalog(catalog); + var translation = node as Translation; + if (translation!=null) + return VisitTranslation(translation); + var hashPartition = node as HashPartition; + if (hashPartition!=null) + return VisitHashPartition(hashPartition); + var listPartition = node as ListPartition; + if (listPartition!=null) + return VisitListPartition(listPartition); + var rangePartition = node as RangePartition; + if (rangePartition!=null) + return VisitRangePartition(rangePartition); + var partition = node as Partition; + if (partition!=null) + return VisitPartition(partition); + var partitionDescriptor = node as PartitionDescriptor; + if (partitionDescriptor!=null) + return VisitPartitionDescriptor(partitionDescriptor); + var partitionFunction = node as PartitionFunction; + if (partitionFunction!=null) + return VisitPartitionFunction(partitionFunction); + var partitionSchema = node as PartitionSchema; + if (partitionSchema!=null) + return VisitPartitionSchema(partitionSchema); + + throw new ArgumentException(Strings.ExNodeTypeIsUnknown, "node"); + } + + /// + /// Visits unique constraint. + /// + /// The constraint. + /// Visit result. + protected abstract TResult VisitUniqueConstraint(UniqueConstraint constraint); + + /// + /// Visits table constraint. + /// + /// The constraint. + /// Visit result. + protected abstract TResult VisitTableConstraint(TableConstraint constraint); + + /// + /// Visits primary key. + /// + /// The key. + /// Visit result. + protected abstract TResult VisitPrimaryKey(PrimaryKey key); + + /// + /// Visits foreign key. + /// + /// The key. + /// Visit result. + protected abstract TResult VisitForeignKey(ForeignKey key); + + /// + /// Visits domain constraint. + /// + /// The constraint. + /// Visit result. + protected abstract TResult VisitDomainConstraint(DomainConstraint constraint); + + /// + /// Visits a constraint. + /// + /// The constraint. + /// Visit result. + protected abstract TResult VisitConstraint(Constraint constraint); + + /// + /// Visits check constraint. + /// + /// The constraint. + /// Visit result. + protected abstract TResult VisitCheckConstraint(CheckConstraint constraint); + + /// + /// Visits range partition. + /// + /// The range partition. + /// Visit result. + protected abstract TResult VisitRangePartition(RangePartition rangePartition); + + /// + /// Visits partition schema. + /// + /// The partition schema. + /// Visit result. + protected abstract TResult VisitPartitionSchema(PartitionSchema partitionSchema); + + /// + /// Visits partition function. + /// + /// The partition function. + /// Visit result. + protected abstract TResult VisitPartitionFunction(PartitionFunction partitionFunction); + + /// + /// Visits partition descriptor. + /// + /// The partition descriptor. + /// Visit result. + protected abstract TResult VisitPartitionDescriptor(PartitionDescriptor partitionDescriptor); + + /// + /// Visits a partition. + /// + /// The partition. + /// Visit result. + protected abstract TResult VisitPartition(Partition partition); + + /// + /// Visits list partition. + /// + /// The list partition. + /// Visit result. + protected abstract TResult VisitListPartition(ListPartition listPartition); + + /// + /// Visits hash partition. + /// + /// The hash partition. + /// Visit result. + protected abstract TResult VisitHashPartition(HashPartition hashPartition); + + /// + /// Visits a catalog. + /// + /// The catalog. + /// Visit result. + protected abstract TResult VisitCatalog(Catalog catalog); + + /// + /// Visits character set. + /// + /// The character set. + /// Visit result. + protected abstract TResult VisitCharacterSet(CharacterSet characterSet); + + /// + /// Visits a collation. + /// + /// The collation. + /// Visit result. + protected abstract TResult VisitCollation(Collation collation); + + /// + /// Visits data table. + /// + /// The data table. + /// Visit result. + protected abstract TResult VisitDataTable(DataTable dataTable); + + /// + /// Visits data table column. + /// + /// The data table column. + /// Visit result. + protected abstract TResult VisitDataTableColumn(DataTableColumn dataTableColumn); + + /// + /// Visits a domain. + /// + /// The domain. + /// Visit result. + protected abstract TResult VisitDomain(Domain domain); + + /// + /// Visits the full-text index. + /// + /// The index. + /// Visit result. + protected abstract TResult VisitFullTextIndex(FullTextIndex index); + + /// + /// Visits an index. + /// + /// The index. + /// Visit result. + protected abstract TResult VisitIndex(Index index); + + /// + /// Visits index column. + /// + /// The index column. + /// Visit result. + protected abstract TResult VisitIndexColumn(IndexColumn indexColumn); + + /// + /// Visits a schema. + /// + /// The schema. + /// Visit result. + protected abstract TResult VisitSchema(Schema schema); + + /// + /// Visits a sequence. + /// + /// The sequence. + /// Visit result. + protected abstract TResult VisitSequence(Sequence sequence); + + /// + /// Visits sequence descriptor. + /// + /// The sequence descriptor. + /// Visit result. + protected abstract TResult VisitSequenceDescriptor(SequenceDescriptor sequenceDescriptor); + + /// + /// Visits a table. + /// + /// The table. + /// Visit result. + protected abstract TResult VisitTable(Table table); + + /// + /// Visits table column. + /// + /// The table column. + /// Visit result. + protected abstract TResult VisitTableColumn(TableColumn tableColumn); + + /// + /// Visits temporary table. + /// + /// The temporary table. + /// Visit result. + protected abstract TResult VisitTemporaryTable(TemporaryTable temporaryTable); + + /// + /// Visits a translation. + /// + /// The translation. + /// Visit result. + protected abstract TResult VisitTranslation(Translation translation); + + /// + /// Visits a view. + /// + /// The view. + /// Visit result. + protected abstract TResult VisitView(View view); + + /// + /// Visits view column. + /// + /// The view column. + /// Visit result. + protected abstract TResult VisitViewColumn(ViewColumn viewColumn); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/Table.cs b/Orm/Xtensive.Orm/Sql/Model/Table.cs index 83b13ed60f..e8091f6ab7 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Table.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Table.cs @@ -1,217 +1,217 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a table object. - /// - [Serializable] - public class Table : DataTable,IConstrainable,IPartitionable - { - private readonly PairedNodeCollection columns; - private readonly PairedNodeCollection constraints; - private PartitionDescriptor partitionDescriptor; - private string filegroup; - - /// - /// Creates the table column. - /// - /// The name. - /// Column datatype. - public TableColumn CreateColumn(string name, SqlValueType dataType) - { - return new TableColumn(this, name, dataType); - } - - /// - /// Creates the table column. - /// - /// The name. - public TableColumn CreateColumn(string name) - { - return new TableColumn(this, name, null); - } - - /// - /// Creates the check constraint. - /// - /// The name. - /// The condition. - public CheckConstraint CreateCheckConstraint(string name, SqlExpression condition) - { - return new CheckConstraint(this, name, condition); - } - - /// - /// Creates the default constraint. - /// - /// The name. - /// The column. - /// Default constraint. - public DefaultConstraint CreateDefaultConstraint(string name, TableColumn column) - { - return new DefaultConstraint(this, name, column); - } - - /// - /// Creates the primary key. - /// - /// The name. - /// The columns. - public PrimaryKey CreatePrimaryKey(string name, params TableColumn[] columns) - { - return new PrimaryKey(this, name, columns); - } - - /// - /// Creates the unique constraint. - /// - /// The name. - /// The columns. - public UniqueConstraint CreateUniqueConstraint(string name, params TableColumn[] columns) - { - return new UniqueConstraint(this, name, columns); - } - - /// - /// Creates the foreign key. - /// - /// The name. - public ForeignKey CreateForeignKey(string name) - { - return new ForeignKey(this, name); - } - - /// - /// Gets the columns. - /// - /// The columns. - public PairedNodeCollection TableColumns - { - get { return columns; } - } - - /// - /// Gets the constraints. - /// - /// The constraints. - public PairedNodeCollection TableConstraints - { - get { return constraints; } - } - - /// - /// Gets or sets the partitioning descriptor. - /// - /// The partitioning descriptor. - public PartitionDescriptor PartitionDescriptor - { - get { return partitionDescriptor; } - set - { - this.EnsureNotLocked(); - PartitionDescriptor old = partitionDescriptor; - partitionDescriptor = value; - if (old != null && old.Owner == this) - old.Owner = null; - if (partitionDescriptor != null && partitionDescriptor.Owner != this) - partitionDescriptor.Owner = this; - } - } - - /// - /// Gets or sets the value indicating that specified table will be created on the specified tablespace or filegroup. - /// If no location is specified and the table or view is not partitioned, the table will bw located at the - /// default filegroup. - /// - public string Filegroup - { - get { return filegroup; } - set - { - this.EnsureNotLocked(); - filegroup = value; - } - } - - #region DataTable Members - - /// - /// Gets the columns. - /// - /// The columns. - public override IList Columns - { - get { return TableColumns.ToArray().Convert(i => (DataTableColumn) i); } - } - - #endregion - - #region IConstrainable Members - - /// - /// Gets the node constraints. - /// - /// The constraints. - IList IConstrainable.Constraints - { - get { return constraints.ToArray().Convert(i => (Constraint)i); } - } - - #endregion - - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema != null) - Schema.Tables.Remove(this); - if (value != null) - value.Tables.Add(this); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - constraints.Lock(recursive); - columns.Lock(recursive); - if (partitionDescriptor != null) - partitionDescriptor.Lock(recursive); - } - - #endregion - - #region Constructors - - internal Table(Schema schema, string name) - : base(schema, name) - { - columns = - new PairedNodeCollection(this, "TableColumns"); - constraints = - new PairedNodeCollection(this, "TableConstraints"); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a table object. + /// + [Serializable] + public class Table : DataTable,IConstrainable,IPartitionable + { + private readonly PairedNodeCollection columns; + private readonly PairedNodeCollection constraints; + private PartitionDescriptor partitionDescriptor; + private string filegroup; + + /// + /// Creates the table column. + /// + /// The name. + /// Column datatype. + public TableColumn CreateColumn(string name, SqlValueType dataType) + { + return new TableColumn(this, name, dataType); + } + + /// + /// Creates the table column. + /// + /// The name. + public TableColumn CreateColumn(string name) + { + return new TableColumn(this, name, null); + } + + /// + /// Creates the check constraint. + /// + /// The name. + /// The condition. + public CheckConstraint CreateCheckConstraint(string name, SqlExpression condition) + { + return new CheckConstraint(this, name, condition); + } + + /// + /// Creates the default constraint. + /// + /// The name. + /// The column. + /// Default constraint. + public DefaultConstraint CreateDefaultConstraint(string name, TableColumn column) + { + return new DefaultConstraint(this, name, column); + } + + /// + /// Creates the primary key. + /// + /// The name. + /// The columns. + public PrimaryKey CreatePrimaryKey(string name, params TableColumn[] columns) + { + return new PrimaryKey(this, name, columns); + } + + /// + /// Creates the unique constraint. + /// + /// The name. + /// The columns. + public UniqueConstraint CreateUniqueConstraint(string name, params TableColumn[] columns) + { + return new UniqueConstraint(this, name, columns); + } + + /// + /// Creates the foreign key. + /// + /// The name. + public ForeignKey CreateForeignKey(string name) + { + return new ForeignKey(this, name); + } + + /// + /// Gets the columns. + /// + /// The columns. + public PairedNodeCollection TableColumns + { + get { return columns; } + } + + /// + /// Gets the constraints. + /// + /// The constraints. + public PairedNodeCollection TableConstraints + { + get { return constraints; } + } + + /// + /// Gets or sets the partitioning descriptor. + /// + /// The partitioning descriptor. + public PartitionDescriptor PartitionDescriptor + { + get { return partitionDescriptor; } + set + { + this.EnsureNotLocked(); + PartitionDescriptor old = partitionDescriptor; + partitionDescriptor = value; + if (old != null && old.Owner == this) + old.Owner = null; + if (partitionDescriptor != null && partitionDescriptor.Owner != this) + partitionDescriptor.Owner = this; + } + } + + /// + /// Gets or sets the value indicating that specified table will be created on the specified tablespace or filegroup. + /// If no location is specified and the table or view is not partitioned, the table will bw located at the + /// default filegroup. + /// + public string Filegroup + { + get { return filegroup; } + set + { + this.EnsureNotLocked(); + filegroup = value; + } + } + + #region DataTable Members + + /// + /// Gets the columns. + /// + /// The columns. + public override IList Columns + { + get { return TableColumns.ToArray().Convert(i => (DataTableColumn) i); } + } + + #endregion + + #region IConstrainable Members + + /// + /// Gets the node constraints. + /// + /// The constraints. + IList IConstrainable.Constraints + { + get { return constraints.ToArray().Convert(i => (Constraint)i); } + } + + #endregion + + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema != null) + Schema.Tables.Remove(this); + if (value != null) + value.Tables.Add(this); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + constraints.Lock(recursive); + columns.Lock(recursive); + if (partitionDescriptor != null) + partitionDescriptor.Lock(recursive); + } + + #endregion + + #region Constructors + + internal Table(Schema schema, string name) + : base(schema, name) + { + columns = + new PairedNodeCollection(this, "TableColumns"); + constraints = + new PairedNodeCollection(this, "TableConstraints"); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/TableColumn.cs b/Orm/Xtensive.Orm/Sql/Model/TableColumn.cs index 8000f87f11..8e7cb54a25 100644 --- a/Orm/Xtensive.Orm/Sql/Model/TableColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Model/TableColumn.cs @@ -1,212 +1,212 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a bound column. - /// - [Serializable] - public class TableColumn : DataTableColumn, IPairedNode
,ISequenceable - { - private SqlValueType dataType; - private Domain domain; - private SqlExpression defaultValue; - private SequenceDescriptor sequenceDescriptor; - private SqlExpression expression; - private bool isPersisted; - private Collation collation; - private bool isNullable; - - /// - /// Gets or sets the . - /// - /// The datatype. - public SqlValueType DataType - { - get { return dataType; } - set - { - this.EnsureNotLocked(); - dataType = value; - } - } - - /// - /// Gets or sets the domain. - /// - /// The domain. - public Domain Domain - { - get { return domain; } - set - { - this.EnsureNotLocked(); - domain = value; - } - } - - /// - /// Specifies the value provided for the column when a value is not explicitly supplied during an insert. - /// - public SqlExpression DefaultValue - { - get { return defaultValue; } - set - { - this.EnsureNotLocked(); - defaultValue = value; - } - } - - /// - /// Gets or sets the sequence descriptor. - /// - /// The sequence descriptor. - public SequenceDescriptor SequenceDescriptor - { - get { return sequenceDescriptor; } - set { - SequenceDescriptor old = sequenceDescriptor; - sequenceDescriptor = value; - if (old!=null && old.Owner==this) - old.Owner = null; - if (sequenceDescriptor!=null && sequenceDescriptor.Owner!=this) - sequenceDescriptor.Owner = this; - } - } - - /// - /// Gets or sets the computed expression that defines the value of a computed column. - /// - /// The expression of a computed column. - public SqlExpression Expression - { - get { return expression; } - set - { - this.EnsureNotLocked(); - expression = value; - } - } - - /// - /// Gets or sets a value indicating whether RDBMS will physically store the computed values in the table, - /// and update the values when any other columns on which the computed column depends are updated. . - /// - /// - /// if this instance is persisted; otherwise, . - /// - public bool IsPersisted - { - get { return isPersisted; } - set - { - this.EnsureNotLocked(); - isPersisted = value; - } - } - - /// - /// Gets or sets the collation. - /// - /// The collation. - public Collation Collation - { - get { return collation; } - set - { - this.EnsureNotLocked(); - collation = value; - } - } - - /// - /// Gets or sets a value indicating whether null values are allowed in the column. - /// - /// - /// if this instance is nullable; otherwise, . - /// - public bool IsNullable - { - get { return isNullable; } - set - { - this.EnsureNotLocked(); - isNullable = value; - } - } - - /// - /// Gets or sets the this instance belongs to. - /// - /// The table. - public Table Table - { - get { return (Table)DataTable; } - set - { - this.EnsureNotLocked(); - DataTable = value; - } - } - - - #region DataTableNode Members - - /// - /// Changes the data table. - /// - /// The value. - protected override void ChangeDataTable(DataTable value) - { - Table oldTable = DataTable as Table; - Table newTable = value as Table; - if (oldTable!=null) - oldTable.TableColumns.Remove(this); - if (newTable!=null) - newTable.TableColumns.Add(this); - } - - #endregion - - #region IPairedNode
Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - public void UpdatePairedProperty(string property, Table value) - { - ((IPairedNode)this).UpdatePairedProperty(property, value); - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - if (sequenceDescriptor!=null) - sequenceDescriptor.Lock(recursive); - } - - #endregion - - internal TableColumn(Table table, string name, SqlValueType dataType) : base(table, name) - { - this.dataType = dataType; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a bound column. + /// + [Serializable] + public class TableColumn : DataTableColumn, IPairedNode
,ISequenceable + { + private SqlValueType dataType; + private Domain domain; + private SqlExpression defaultValue; + private SequenceDescriptor sequenceDescriptor; + private SqlExpression expression; + private bool isPersisted; + private Collation collation; + private bool isNullable; + + /// + /// Gets or sets the . + /// + /// The datatype. + public SqlValueType DataType + { + get { return dataType; } + set + { + this.EnsureNotLocked(); + dataType = value; + } + } + + /// + /// Gets or sets the domain. + /// + /// The domain. + public Domain Domain + { + get { return domain; } + set + { + this.EnsureNotLocked(); + domain = value; + } + } + + /// + /// Specifies the value provided for the column when a value is not explicitly supplied during an insert. + /// + public SqlExpression DefaultValue + { + get { return defaultValue; } + set + { + this.EnsureNotLocked(); + defaultValue = value; + } + } + + /// + /// Gets or sets the sequence descriptor. + /// + /// The sequence descriptor. + public SequenceDescriptor SequenceDescriptor + { + get { return sequenceDescriptor; } + set { + SequenceDescriptor old = sequenceDescriptor; + sequenceDescriptor = value; + if (old!=null && old.Owner==this) + old.Owner = null; + if (sequenceDescriptor!=null && sequenceDescriptor.Owner!=this) + sequenceDescriptor.Owner = this; + } + } + + /// + /// Gets or sets the computed expression that defines the value of a computed column. + /// + /// The expression of a computed column. + public SqlExpression Expression + { + get { return expression; } + set + { + this.EnsureNotLocked(); + expression = value; + } + } + + /// + /// Gets or sets a value indicating whether RDBMS will physically store the computed values in the table, + /// and update the values when any other columns on which the computed column depends are updated. . + /// + /// + /// if this instance is persisted; otherwise, . + /// + public bool IsPersisted + { + get { return isPersisted; } + set + { + this.EnsureNotLocked(); + isPersisted = value; + } + } + + /// + /// Gets or sets the collation. + /// + /// The collation. + public Collation Collation + { + get { return collation; } + set + { + this.EnsureNotLocked(); + collation = value; + } + } + + /// + /// Gets or sets a value indicating whether null values are allowed in the column. + /// + /// + /// if this instance is nullable; otherwise, . + /// + public bool IsNullable + { + get { return isNullable; } + set + { + this.EnsureNotLocked(); + isNullable = value; + } + } + + /// + /// Gets or sets the this instance belongs to. + /// + /// The table. + public Table Table + { + get { return (Table)DataTable; } + set + { + this.EnsureNotLocked(); + DataTable = value; + } + } + + + #region DataTableNode Members + + /// + /// Changes the data table. + /// + /// The value. + protected override void ChangeDataTable(DataTable value) + { + Table oldTable = DataTable as Table; + Table newTable = value as Table; + if (oldTable!=null) + oldTable.TableColumns.Remove(this); + if (newTable!=null) + newTable.TableColumns.Add(this); + } + + #endregion + + #region IPairedNode
Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + public void UpdatePairedProperty(string property, Table value) + { + ((IPairedNode)this).UpdatePairedProperty(property, value); + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + if (sequenceDescriptor!=null) + sequenceDescriptor.Lock(recursive); + } + + #endregion + + internal TableColumn(Table table, string name, SqlValueType dataType) : base(table, name) + { + this.dataType = dataType; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/TemporaryTable.cs b/Orm/Xtensive.Orm/Sql/Model/TemporaryTable.cs index e6c4952374..6185386aa4 100644 --- a/Orm/Xtensive.Orm/Sql/Model/TemporaryTable.cs +++ b/Orm/Xtensive.Orm/Sql/Model/TemporaryTable.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a temporary table object. - /// - [Serializable] - public class TemporaryTable : Table - { - private bool isGlobal; - private bool preserveRows; - - /// - /// Gets or sets a value indicating whether this instance is global. - /// If value is the this instance is local. - /// - /// - /// if this instance is global; otherwise, . - /// - public bool IsGlobal - { - get { return isGlobal; } - set - { - this.EnsureNotLocked(); - isGlobal = value; - } - } - - /// - /// Gets or sets a value indicating whether rows are preserved on commit. - /// - /// - /// if rows are preserved on commit; otherwise, . - /// - public bool PreserveRows - { - get { return preserveRows; } - set - { - this.EnsureNotLocked(); - preserveRows = value; - } - } - - - #region Constructors - - internal TemporaryTable(Schema schema, string name, bool isGlobal, bool preserveRows) : base(schema, name) - { - this.isGlobal = isGlobal; - this.preserveRows = preserveRows; - } - - internal TemporaryTable(Schema schema, string name) : this(schema, name, false, false) - { - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a temporary table object. + /// + [Serializable] + public class TemporaryTable : Table + { + private bool isGlobal; + private bool preserveRows; + + /// + /// Gets or sets a value indicating whether this instance is global. + /// If value is the this instance is local. + /// + /// + /// if this instance is global; otherwise, . + /// + public bool IsGlobal + { + get { return isGlobal; } + set + { + this.EnsureNotLocked(); + isGlobal = value; + } + } + + /// + /// Gets or sets a value indicating whether rows are preserved on commit. + /// + /// + /// if rows are preserved on commit; otherwise, . + /// + public bool PreserveRows + { + get { return preserveRows; } + set + { + this.EnsureNotLocked(); + preserveRows = value; + } + } + + + #region Constructors + + internal TemporaryTable(Schema schema, string name, bool isGlobal, bool preserveRows) : base(schema, name) + { + this.isGlobal = isGlobal; + this.preserveRows = preserveRows; + } + + internal TemporaryTable(Schema schema, string name) : this(schema, name, false, false) + { + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/Translation.cs b/Orm/Xtensive.Orm/Sql/Model/Translation.cs index e42f4f48ff..d87f3adc59 100644 --- a/Orm/Xtensive.Orm/Sql/Model/Translation.cs +++ b/Orm/Xtensive.Orm/Sql/Model/Translation.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a characher translation object. - /// - [Serializable] - public class Translation : SchemaNode - { - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Translations.Remove(this); - if (value!=null) - value.Translations.Add(this); - } - - #endregion - - #region Constructors - - internal Translation(Schema schema, string name) : base(schema, name) - { - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a characher translation object. + /// + [Serializable] + public class Translation : SchemaNode + { + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Translations.Remove(this); + if (value!=null) + value.Translations.Add(this); + } + + #endregion + + #region Constructors + + internal Translation(Schema schema, string name) : base(schema, name) + { + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Sql/Model/View.cs b/Orm/Xtensive.Orm/Sql/Model/View.cs index 672ea8b50c..889d4e1350 100644 --- a/Orm/Xtensive.Orm/Sql/Model/View.cs +++ b/Orm/Xtensive.Orm/Sql/Model/View.cs @@ -1,137 +1,137 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using Xtensive.Core; -using Xtensive.Collections; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql.Model -{ - /// - /// Represents a View node. - /// - [Serializable] - public class View : DataTable - { - private PairedNodeCollection columns; - private CheckOptions checkOptions = CheckOptions.None; - private SqlNative definition; - - /// - /// Creates the view column. - /// - /// The name. - public ViewColumn CreateColumn(string name) - { - return new ViewColumn(this, name); - } - - /// - /// Gets the columns. - /// - /// The columns. - public PairedNodeCollection ViewColumns - { - get { return columns; } - } - - /// - /// Specifies the level of checking to be done when inserting or updating data through a view. - /// If the option is specified, every row that is inserted or updated through the view must - /// conform to the definition of that view. - /// - public CheckOptions CheckOptions - { - get { return checkOptions; } - set { - this.EnsureNotLocked(); - checkOptions = value; - } - } - - /// - /// The statement that defines the view. The statement can use more than one table - /// and other views. - /// - public SqlNative Definition - { - get { return definition; } - set - { - this.EnsureNotLocked(); - definition = value; - } - } - - - #region SchemaNode Members - - /// - /// Changes the schema. - /// - /// The value. - protected override void ChangeSchema(Schema value) - { - if (Schema!=null) - Schema.Views.Remove(this); - if (value!=null) - value.Views.Add(this); - } - - #endregion - - #region DataTable Members - - /// - /// Gets the columns. - /// - /// The columns. - public override IList Columns { - get { - return ViewColumns.ToArray().Convert(i => (DataTableColumn) i); - } - } - - #endregion - - #region ILockable Members - - /// - /// Locks the instance and (possible) all dependent objects. - /// - /// if all dependent objects should be locked too. - public override void Lock(bool recursive) - { - base.Lock(recursive); - columns.Lock(recursive); - } - - #endregion - - #region Constructors - - internal View(Schema schema, string name) - : base(schema, name) - { - columns = new PairedNodeCollection(this, "ViewColumns"); - } - - internal View(Schema schema, string name, SqlNative definition) - : this(schema, name, definition, CheckOptions.None) - { - } - - internal View(Schema schema, string name, SqlNative definition, CheckOptions checkOptions) - : base(schema, name) - { - columns = new PairedNodeCollection(this, "ViewColumns"); - this.definition = definition; - this.checkOptions = checkOptions; - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using Xtensive.Core; +using Xtensive.Collections; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql.Model +{ + /// + /// Represents a View node. + /// + [Serializable] + public class View : DataTable + { + private PairedNodeCollection columns; + private CheckOptions checkOptions = CheckOptions.None; + private SqlNative definition; + + /// + /// Creates the view column. + /// + /// The name. + public ViewColumn CreateColumn(string name) + { + return new ViewColumn(this, name); + } + + /// + /// Gets the columns. + /// + /// The columns. + public PairedNodeCollection ViewColumns + { + get { return columns; } + } + + /// + /// Specifies the level of checking to be done when inserting or updating data through a view. + /// If the option is specified, every row that is inserted or updated through the view must + /// conform to the definition of that view. + /// + public CheckOptions CheckOptions + { + get { return checkOptions; } + set { + this.EnsureNotLocked(); + checkOptions = value; + } + } + + /// + /// The statement that defines the view. The statement can use more than one table + /// and other views. + /// + public SqlNative Definition + { + get { return definition; } + set + { + this.EnsureNotLocked(); + definition = value; + } + } + + + #region SchemaNode Members + + /// + /// Changes the schema. + /// + /// The value. + protected override void ChangeSchema(Schema value) + { + if (Schema!=null) + Schema.Views.Remove(this); + if (value!=null) + value.Views.Add(this); + } + + #endregion + + #region DataTable Members + + /// + /// Gets the columns. + /// + /// The columns. + public override IList Columns { + get { + return ViewColumns.ToArray().Convert(i => (DataTableColumn) i); + } + } + + #endregion + + #region ILockable Members + + /// + /// Locks the instance and (possible) all dependent objects. + /// + /// if all dependent objects should be locked too. + public override void Lock(bool recursive) + { + base.Lock(recursive); + columns.Lock(recursive); + } + + #endregion + + #region Constructors + + internal View(Schema schema, string name) + : base(schema, name) + { + columns = new PairedNodeCollection(this, "ViewColumns"); + } + + internal View(Schema schema, string name, SqlNative definition) + : this(schema, name, definition, CheckOptions.None) + { + } + + internal View(Schema schema, string name, SqlNative definition, CheckOptions checkOptions) + : base(schema, name) + { + columns = new PairedNodeCollection(this, "ViewColumns"); + this.definition = definition; + this.checkOptions = checkOptions; + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Model/ViewColumn.cs b/Orm/Xtensive.Orm/Sql/Model/ViewColumn.cs index a2f986f3c8..d4d70764cd 100644 --- a/Orm/Xtensive.Orm/Sql/Model/ViewColumn.cs +++ b/Orm/Xtensive.Orm/Sql/Model/ViewColumn.cs @@ -1,70 +1,70 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - -namespace Xtensive.Sql.Model -{ - /// - /// Represent a bound column. - /// - [Serializable] - public class ViewColumn : DataTableColumn, IPairedNode - { - /// - /// Gets or sets the this instance belongs to. - /// - /// The view. - public View View - { - get { return (View) DataTable; } - set - { - this.EnsureNotLocked(); - DataTable = value; - } - } - - #region DataTableNode Members - - /// - /// Changes the data table. - /// - /// The value. - protected override void ChangeDataTable(DataTable value) - { - View oldView = DataTable as View; - View newView = value as View; - if (oldView!=null) - oldView.ViewColumns.Remove(this); - if (newView!=null) - newView.ViewColumns.Add(this); - } - - #endregion - - #region IPairedNode Members - - /// - /// Updates the paired property. - /// - /// The collection property name. - /// The collection owner. - public void UpdatePairedProperty(string property, View value) - { - ((IPairedNode)this).UpdatePairedProperty(property, value); - } - - #endregion - - #region Constructors - - internal ViewColumn(View view, string name) : base(view, name) - { - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + +namespace Xtensive.Sql.Model +{ + /// + /// Represent a bound column. + /// + [Serializable] + public class ViewColumn : DataTableColumn, IPairedNode + { + /// + /// Gets or sets the this instance belongs to. + /// + /// The view. + public View View + { + get { return (View) DataTable; } + set + { + this.EnsureNotLocked(); + DataTable = value; + } + } + + #region DataTableNode Members + + /// + /// Changes the data table. + /// + /// The value. + protected override void ChangeDataTable(DataTable value) + { + View oldView = DataTable as View; + View newView = value as View; + if (oldView!=null) + oldView.ViewColumns.Remove(this); + if (newView!=null) + newView.ViewColumns.Add(this); + } + + #endregion + + #region IPairedNode Members + + /// + /// Updates the paired property. + /// + /// The collection property name. + /// The collection owner. + public void UpdatePairedProperty(string property, View value) + { + ((IPairedNode)this).UpdatePairedProperty(property, value); + } + + #endregion + + #region Constructors + + internal ViewColumn(View view, string name) : base(view, name) + { + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlConnection.cs b/Orm/Xtensive.Orm/Sql/SqlConnection.cs index 15783cde8d..505aec54f4 100644 --- a/Orm/Xtensive.Orm/Sql/SqlConnection.cs +++ b/Orm/Xtensive.Orm/Sql/SqlConnection.cs @@ -1,372 +1,372 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Data; -using System.Data.Common; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql -{ - /// - /// A connection to a database. - /// - public abstract class SqlConnection : SqlDriverBound, - IDisposable - { - private int? commandTimeout; - private ConnectionInfo connectionInfo; - private IExtensionCollection extensions; - private bool isDisposed; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected void EnsureIsNotDisposed() - { - if (isDisposed) { - throw new InvalidOperationException("Connection is disposed."); - } - } - - /// - /// Gets the underlying connection. - /// - public abstract DbConnection UnderlyingConnection { get; } - - /// - /// Gets the active transaction. - /// - public abstract DbTransaction ActiveTransaction { get; } - - /// - /// Gets associated with this instance. - /// - public IExtensionCollection Extensions => extensions ?? (extensions = new ExtensionCollection()); - - /// - /// Gets or sets to use. - /// - public ConnectionInfo ConnectionInfo - { - get => connectionInfo; - set { - ArgumentValidator.EnsureArgumentNotNull(value, nameof(value)); - EnsureIsNotDisposed(); - - UnderlyingConnection.ConnectionString = Driver.GetConnectionString(value); - connectionInfo = value; - } - } - - /// - /// Gets or sets the command timeout. - /// - public int? CommandTimeout - { - get => commandTimeout; - set { - if (value != null) { - ArgumentValidator.EnsureArgumentIsInRange(value.Value, 0, 65535, nameof(value)); - } - - EnsureIsNotDisposed(); - - commandTimeout = value; - } - } - - /// - /// Gets the state of the connection. - /// - public ConnectionState State => isDisposed ? ConnectionState.Closed : UnderlyingConnection.State; - - /// - /// Creates and returns a object associated with the current connection. - /// - /// Created command. - public DbCommand CreateCommand() - { - EnsureIsNotDisposed(); - var command = CreateNativeCommand(); - if (commandTimeout != null) { - command.CommandTimeout = commandTimeout.Value; - } - - command.Transaction = ActiveTransaction; - return command; - } - - /// - /// Creates and returns a object with specified . - /// Created command will be associated with the current connection. - /// - /// Created command. - public DbCommand CreateCommand(ISqlCompileUnit statement) - { - ArgumentValidator.EnsureArgumentNotNull(statement, nameof(statement)); - EnsureIsNotDisposed(); - - var command = CreateCommand(); - command.CommandText = Driver.Compile(statement).GetCommandText(); - return command; - } - - /// - /// Creates and returns a object with specified . - /// Created command will be associated with the current connection. - /// - /// Created command. - public DbCommand CreateCommand(string commandText) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(commandText, nameof(commandText)); - EnsureIsNotDisposed(); - - var command = CreateCommand(); - command.CommandText = commandText; - return command; - } - - /// - /// Creates the parameter. - /// - /// Created parameter. - public abstract DbParameter CreateParameter(); - - /// - /// Creates the cursor parameter. - /// - /// Created parameter. - public virtual DbParameter CreateCursorParameter() => throw SqlHelper.NotSupported(ServerFeatures.CursorParameters); - - /// - /// Creates the character large object bound to this connection. - /// Created object initially have NULL value ( returns ) - /// - /// Created CLOB. - public virtual ICharacterLargeObject CreateCharacterLargeObject() => - throw SqlHelper.NotSupported(ServerFeatures.LargeObjects); - - /// - /// Creates the binary large object bound to this connection. - /// Created object initially have NULL value ( returns ) - /// - /// Created BLOB. - public virtual IBinaryLargeObject CreateBinaryLargeObject() => - throw SqlHelper.NotSupported(ServerFeatures.LargeObjects); - - /// - /// Opens the connection. - /// - public virtual void Open() - { - EnsureIsNotDisposed(); - UnderlyingConnection.Open(); - } - - /// - /// Opens the connection and initialize it with given script. - /// - /// Initialization script. - public virtual void OpenAndInitialize(string initializationScript) - { - UnderlyingConnection.Open(); - if (string.IsNullOrEmpty(initializationScript)) { - return; - } - - using (var command = UnderlyingConnection.CreateCommand()) { - command.CommandText = initializationScript; - command.ExecuteNonQuery(); - } - } - - /// - /// Opens the connection asynchronously. - /// - /// Token to control cancellation. - /// Awaitable task. - public virtual Task OpenAsync(CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - return UnderlyingConnection.OpenAsync(cancellationToken); - } - - /// - /// Opens the connection and initialize it with given script asynchronously. - /// - /// Initialization script. - /// Token to control cancellation. - /// Awaitable task. - public virtual async Task OpenAndInitializeAsync(string initializationScript, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - await UnderlyingConnection.OpenAsync(cancellationToken).ConfigureAwait(false); - if (string.IsNullOrEmpty(initializationScript)) { - return; - } - - try { - using (var command = UnderlyingConnection.CreateCommand()) { - command.CommandText = initializationScript; - await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); - } - } - catch (OperationCanceledException exception) { - UnderlyingConnection.Close(); - throw; - } - } - - /// - /// Closes the connection. - /// - public virtual void Close() - { - EnsureIsNotDisposed(); - UnderlyingConnection.Close(); - } - - /// - /// Begins the transaction. - /// - public abstract void BeginTransaction(); - - /// - /// Begins the transaction with the specified . - /// - /// The isolation level. - public abstract void BeginTransaction(IsolationLevel isolationLevel); - - /// - /// Commits the current transaction. - /// - public virtual void Commit() - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - - try { - ActiveTransaction.Commit(); - } - finally { - ActiveTransaction.Dispose(); - ClearActiveTransaction(); - } - } - - /// - /// Rollbacks the current transaction. - /// - public virtual void Rollback() - { - EnsureIsNotDisposed(); - EnsureTransactionIsActive(); - - try { - ActiveTransaction.Rollback(); - } - finally { - ActiveTransaction.Dispose(); - ClearActiveTransaction(); - } - } - - /// - /// Makes the transaction savepoint. - /// - /// The name of the savepoint. - public virtual void MakeSavepoint(string name) - { - EnsureIsNotDisposed(); - // That's ok to make a savepoint even if they aren't supported - - // default impl. will fail on rollback - } - - /// - /// Rollbacks current transaction to the specified savepoint. - /// - /// The name of the savepoint. - public virtual void RollbackToSavepoint(string name) => throw SqlHelper.NotSupported(ServerFeatures.Savepoints); - - /// - /// Releases the savepoint with the specfied name. - /// - /// The name of the savepoint. - public virtual void ReleaseSavepoint(string name) - { - EnsureIsNotDisposed(); - // That's ok to release a savepoint even if they aren't supported - - // default impl. will fail on rollback - } - - /// - public void Dispose() - { - if (isDisposed) { - return; - } - isDisposed = true; - - try { - if (ActiveTransaction != null) { - ActiveTransaction.Dispose(); - ClearActiveTransaction(); - } - } - finally { - UnderlyingConnection.DisposeSafely(); - ClearUnderlyingConnection(); - } - } - - /// - /// Clears the active transaction (i.e. sets to . - /// - protected abstract void ClearActiveTransaction(); - - /// - /// Clears underlying connection (i.e. sets to . - /// - protected abstract void ClearUnderlyingConnection(); - - /// - /// Creates the native command. - /// - /// Created command. - protected virtual DbCommand CreateNativeCommand() => UnderlyingConnection.CreateCommand(); - - /// - /// Ensures the transaction is active (i.e. is not ). - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected void EnsureTransactionIsActive() - { - if (ActiveTransaction == null) { - throw new InvalidOperationException(Strings.ExTransactionShouldBeActive); - } - } - - /// - /// Ensures the transaction is not active (i.e. is ). - /// - protected void EnsureTransactionIsNotActive() - { - if (ActiveTransaction != null) { - throw new InvalidOperationException(Strings.ExTransactionShouldNotBeActive); - } - } - - // Constructors - - protected SqlConnection(SqlDriver driver) - : base(driver) - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Data; +using System.Data.Common; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql +{ + /// + /// A connection to a database. + /// + public abstract class SqlConnection : SqlDriverBound, + IDisposable + { + private int? commandTimeout; + private ConnectionInfo connectionInfo; + private IExtensionCollection extensions; + private bool isDisposed; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected void EnsureIsNotDisposed() + { + if (isDisposed) { + throw new InvalidOperationException("Connection is disposed."); + } + } + + /// + /// Gets the underlying connection. + /// + public abstract DbConnection UnderlyingConnection { get; } + + /// + /// Gets the active transaction. + /// + public abstract DbTransaction ActiveTransaction { get; } + + /// + /// Gets associated with this instance. + /// + public IExtensionCollection Extensions => extensions ?? (extensions = new ExtensionCollection()); + + /// + /// Gets or sets to use. + /// + public ConnectionInfo ConnectionInfo + { + get => connectionInfo; + set { + ArgumentValidator.EnsureArgumentNotNull(value, nameof(value)); + EnsureIsNotDisposed(); + + UnderlyingConnection.ConnectionString = Driver.GetConnectionString(value); + connectionInfo = value; + } + } + + /// + /// Gets or sets the command timeout. + /// + public int? CommandTimeout + { + get => commandTimeout; + set { + if (value != null) { + ArgumentValidator.EnsureArgumentIsInRange(value.Value, 0, 65535, nameof(value)); + } + + EnsureIsNotDisposed(); + + commandTimeout = value; + } + } + + /// + /// Gets the state of the connection. + /// + public ConnectionState State => isDisposed ? ConnectionState.Closed : UnderlyingConnection.State; + + /// + /// Creates and returns a object associated with the current connection. + /// + /// Created command. + public DbCommand CreateCommand() + { + EnsureIsNotDisposed(); + var command = CreateNativeCommand(); + if (commandTimeout != null) { + command.CommandTimeout = commandTimeout.Value; + } + + command.Transaction = ActiveTransaction; + return command; + } + + /// + /// Creates and returns a object with specified . + /// Created command will be associated with the current connection. + /// + /// Created command. + public DbCommand CreateCommand(ISqlCompileUnit statement) + { + ArgumentValidator.EnsureArgumentNotNull(statement, nameof(statement)); + EnsureIsNotDisposed(); + + var command = CreateCommand(); + command.CommandText = Driver.Compile(statement).GetCommandText(); + return command; + } + + /// + /// Creates and returns a object with specified . + /// Created command will be associated with the current connection. + /// + /// Created command. + public DbCommand CreateCommand(string commandText) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(commandText, nameof(commandText)); + EnsureIsNotDisposed(); + + var command = CreateCommand(); + command.CommandText = commandText; + return command; + } + + /// + /// Creates the parameter. + /// + /// Created parameter. + public abstract DbParameter CreateParameter(); + + /// + /// Creates the cursor parameter. + /// + /// Created parameter. + public virtual DbParameter CreateCursorParameter() => throw SqlHelper.NotSupported(ServerFeatures.CursorParameters); + + /// + /// Creates the character large object bound to this connection. + /// Created object initially have NULL value ( returns ) + /// + /// Created CLOB. + public virtual ICharacterLargeObject CreateCharacterLargeObject() => + throw SqlHelper.NotSupported(ServerFeatures.LargeObjects); + + /// + /// Creates the binary large object bound to this connection. + /// Created object initially have NULL value ( returns ) + /// + /// Created BLOB. + public virtual IBinaryLargeObject CreateBinaryLargeObject() => + throw SqlHelper.NotSupported(ServerFeatures.LargeObjects); + + /// + /// Opens the connection. + /// + public virtual void Open() + { + EnsureIsNotDisposed(); + UnderlyingConnection.Open(); + } + + /// + /// Opens the connection and initialize it with given script. + /// + /// Initialization script. + public virtual void OpenAndInitialize(string initializationScript) + { + UnderlyingConnection.Open(); + if (string.IsNullOrEmpty(initializationScript)) { + return; + } + + using (var command = UnderlyingConnection.CreateCommand()) { + command.CommandText = initializationScript; + command.ExecuteNonQuery(); + } + } + + /// + /// Opens the connection asynchronously. + /// + /// Token to control cancellation. + /// Awaitable task. + public virtual Task OpenAsync(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + return UnderlyingConnection.OpenAsync(cancellationToken); + } + + /// + /// Opens the connection and initialize it with given script asynchronously. + /// + /// Initialization script. + /// Token to control cancellation. + /// Awaitable task. + public virtual async Task OpenAndInitializeAsync(string initializationScript, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + await UnderlyingConnection.OpenAsync(cancellationToken).ConfigureAwait(false); + if (string.IsNullOrEmpty(initializationScript)) { + return; + } + + try { + using (var command = UnderlyingConnection.CreateCommand()) { + command.CommandText = initializationScript; + await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false); + } + } + catch (OperationCanceledException exception) { + UnderlyingConnection.Close(); + throw; + } + } + + /// + /// Closes the connection. + /// + public virtual void Close() + { + EnsureIsNotDisposed(); + UnderlyingConnection.Close(); + } + + /// + /// Begins the transaction. + /// + public abstract void BeginTransaction(); + + /// + /// Begins the transaction with the specified . + /// + /// The isolation level. + public abstract void BeginTransaction(IsolationLevel isolationLevel); + + /// + /// Commits the current transaction. + /// + public virtual void Commit() + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + + try { + ActiveTransaction.Commit(); + } + finally { + ActiveTransaction.Dispose(); + ClearActiveTransaction(); + } + } + + /// + /// Rollbacks the current transaction. + /// + public virtual void Rollback() + { + EnsureIsNotDisposed(); + EnsureTransactionIsActive(); + + try { + ActiveTransaction.Rollback(); + } + finally { + ActiveTransaction.Dispose(); + ClearActiveTransaction(); + } + } + + /// + /// Makes the transaction savepoint. + /// + /// The name of the savepoint. + public virtual void MakeSavepoint(string name) + { + EnsureIsNotDisposed(); + // That's ok to make a savepoint even if they aren't supported - + // default impl. will fail on rollback + } + + /// + /// Rollbacks current transaction to the specified savepoint. + /// + /// The name of the savepoint. + public virtual void RollbackToSavepoint(string name) => throw SqlHelper.NotSupported(ServerFeatures.Savepoints); + + /// + /// Releases the savepoint with the specfied name. + /// + /// The name of the savepoint. + public virtual void ReleaseSavepoint(string name) + { + EnsureIsNotDisposed(); + // That's ok to release a savepoint even if they aren't supported - + // default impl. will fail on rollback + } + + /// + public void Dispose() + { + if (isDisposed) { + return; + } + isDisposed = true; + + try { + if (ActiveTransaction != null) { + ActiveTransaction.Dispose(); + ClearActiveTransaction(); + } + } + finally { + UnderlyingConnection.DisposeSafely(); + ClearUnderlyingConnection(); + } + } + + /// + /// Clears the active transaction (i.e. sets to . + /// + protected abstract void ClearActiveTransaction(); + + /// + /// Clears underlying connection (i.e. sets to . + /// + protected abstract void ClearUnderlyingConnection(); + + /// + /// Creates the native command. + /// + /// Created command. + protected virtual DbCommand CreateNativeCommand() => UnderlyingConnection.CreateCommand(); + + /// + /// Ensures the transaction is active (i.e. is not ). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected void EnsureTransactionIsActive() + { + if (ActiveTransaction == null) { + throw new InvalidOperationException(Strings.ExTransactionShouldBeActive); + } + } + + /// + /// Ensures the transaction is not active (i.e. is ). + /// + protected void EnsureTransactionIsNotActive() + { + if (ActiveTransaction != null) { + throw new InvalidOperationException(Strings.ExTransactionShouldNotBeActive); + } + } + + // Constructors + + protected SqlConnection(SqlDriver driver) + : base(driver) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDdl.cs b/Orm/Xtensive.Orm/Sql/SqlDdl.cs index 9fdb611555..c718140301 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDdl.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDdl.cs @@ -1,450 +1,450 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.09 - -using System; -using Xtensive.Core; -using Xtensive.Sql.Ddl; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql -{ - /// - /// A factory for SQL DDL operations. - /// - public static class SqlDdl - { - public static SqlCreateAssertion Create(Assertion assertion) - { - ArgumentValidator.EnsureArgumentNotNull(assertion, "assertion"); - return new SqlCreateAssertion(assertion); - } - - public static SqlCreateCharacterSet Create(CharacterSet characterSet) - { - ArgumentValidator.EnsureArgumentNotNull(characterSet, "characterSet"); - return new SqlCreateCharacterSet(characterSet); - } - - public static SqlCreateCollation Create(Collation collation) - { - ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); - return new SqlCreateCollation(collation); - } - - public static SqlCreateDomain Create(Domain domain) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - return new SqlCreateDomain(domain); - } - - public static SqlCreateIndex Create(Index index) - { - ArgumentValidator.EnsureArgumentNotNull(index, "index"); - return new SqlCreateIndex(index); - } - - public static SqlCreatePartitionFunction Create(PartitionFunction partitionFunction) - { - ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); - return new SqlCreatePartitionFunction(partitionFunction); - } - - public static SqlCreatePartitionScheme Create(PartitionSchema partitionSchema) - { - ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); - return new SqlCreatePartitionScheme(partitionSchema); - } - - public static SqlCreateSchema Create(Schema schema) - { - ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); - return new SqlCreateSchema(schema); - } - - public static SqlCreateSequence Create(Sequence sequence) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - return new SqlCreateSequence(sequence); - } - - public static SqlCreateTable Create(Table table) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlCreateTable(table); - } - - public static SqlCreateTranslation Create(Translation translation) - { - ArgumentValidator.EnsureArgumentNotNull(translation, "translation"); - return new SqlCreateTranslation(translation); - } - - public static SqlCreateView Create(View view) - { - ArgumentValidator.EnsureArgumentNotNull(view, "view"); - return new SqlCreateView(view); - } - - public static SqlDropAssertion Drop(Assertion assertion) - { - ArgumentValidator.EnsureArgumentNotNull(assertion, "assertion"); - return new SqlDropAssertion(assertion); - } - - public static SqlDropCharacterSet Drop(CharacterSet characterSet) - { - ArgumentValidator.EnsureArgumentNotNull(characterSet, "characterSet"); - return new SqlDropCharacterSet(characterSet); - } - - public static SqlDropCollation Drop(Collation collation) - { - ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); - return new SqlDropCollation(collation); - } - - public static SqlDropDomain Drop(Domain domain) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - return new SqlDropDomain(domain); - } - - public static SqlDropIndex Drop(Index index) - { - ArgumentValidator.EnsureArgumentNotNull(index, "index"); - return new SqlDropIndex(index); - } - - //public static SqlDropIndex Drop(IIndex index, bool? online) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, null); - //} - - //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, null, maxDegreeOfParallelism); - //} - - //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, maxDegreeOfParallelism); - //} - - //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism, IPartitionDescriptor partitioningDescriptor) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, maxDegreeOfParallelism, partitioningDescriptor); - //} - - //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism, string tableSpace) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, maxDegreeOfParallelism, tableSpace); - //} - - //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism, IPartitionDescriptor partitioningDescriptor) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, null, maxDegreeOfParallelism, partitioningDescriptor); - //} - - //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism, string tableSpace) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, null, maxDegreeOfParallelism, tableSpace); - //} - - //public static SqlDropIndex Drop(IIndex index, bool? online, IPartitionDescriptor partitioningDescriptor) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, null, partitioningDescriptor); - //} - - //public static SqlDropIndex Drop(IIndex index, bool? online, string tableSpace) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, online, null, tableSpace); - //} - - //public static SqlDropIndex Drop(IIndex index, IPartitionDescriptor partitioningDescriptor) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, null, null, partitioningDescriptor); - //} - - //public static SqlDropIndex Drop(IIndex index, string tableSpace) - //{ - // ArgumentValidator.EnsureArgumentNotNull(index, "index"); - // return new SqlDropIndex(index, null, null, tableSpace); - //} - - public static SqlDropPartitionFunction Drop(PartitionFunction partitionFunction) - { - ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); - return new SqlDropPartitionFunction(partitionFunction); - } - - public static SqlDropPartitionScheme Drop(PartitionSchema partitionSchema) - { - ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); - return new SqlDropPartitionScheme(partitionSchema); - } - - public static SqlDropDomain Drop(Domain domain, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - return new SqlDropDomain(domain, cascade); - } - - public static SqlDropSchema Drop(Schema schema) - { - ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); - return new SqlDropSchema(schema); - } - - public static SqlDropSchema Drop(Schema schema, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); - return new SqlDropSchema(schema, cascade); - } - - public static SqlDropSequence Drop(Sequence sequence) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - return new SqlDropSequence(sequence); - } - - public static SqlDropSequence Drop(Sequence sequence, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - return new SqlDropSequence(sequence, cascade); - } - - public static SqlDropTable Drop(Table table) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlDropTable(table); - } - - public static SqlDropTable Drop(Table table, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlDropTable(table, cascade); - } - - public static SqlDropTranslation Drop(Translation translation) - { - ArgumentValidator.EnsureArgumentNotNull(translation, "translation"); - return new SqlDropTranslation(translation); - } - - public static SqlDropView Drop(View view) - { - ArgumentValidator.EnsureArgumentNotNull(view, "view"); - return new SqlDropView(view); - } - - public static SqlDropView Drop(View view, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(view, "view"); - return new SqlDropView(view, cascade); - } - - public static SqlAlterTable Alter(Table table, SqlAction action) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - ArgumentValidator.EnsureArgumentNotNull(action, "action"); - if (action is SqlSetDefault && ((SqlSetDefault)action).Column==null || - action is SqlDropDefault && ((SqlDropDefault)action).Column==null) - throw new ArgumentException(Strings.ExInvalidActionType, "action"); - if (action is SqlAddColumn && ((SqlAddColumn)action).Column.DataTable!=null && - ((SqlAddColumn)action).Column.DataTable!=table || - action is SqlSetDefault && ((SqlSetDefault)action).Column.DataTable!=null && - ((SqlSetDefault)action).Column.DataTable!=table || - action is SqlDropDefault && ((SqlDropDefault)action).Column.DataTable!=null && - ((SqlDropDefault)action).Column.DataTable!=table || - action is SqlDropColumn && ((SqlDropColumn)action).Column.DataTable!=null && - ((SqlDropColumn)action).Column.DataTable!=table || - action is SqlAlterIdentityInfo && ((SqlAlterIdentityInfo)action).Column.DataTable!=null && - ((SqlAlterIdentityInfo)action).Column.DataTable!=table) - throw new ArgumentException(Strings.ExColumnBelongsToOtherTable, "action"); - else if (action is SqlAddConstraint) { - var constraint = ((SqlAddConstraint) action).Constraint as TableConstraint; - if (constraint==null) - throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); - else if (constraint.Table!=null && constraint.Table!=table) - throw new ArgumentException(Strings.ExConstraintBelongsToOtherTable, "action"); - } - else if (action is SqlDropConstraint) { - var constraint = ((SqlDropConstraint) action).Constraint as TableConstraint; - if (constraint==null) - throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); - else if (constraint.Table!=null && constraint.Table!=table) - throw new ArgumentException(Strings.ExConstraintBelongsToOtherTable, "action"); - } - return new SqlAlterTable(table, action); - } - - public static SqlRenameTable Rename(Table table, string newName) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(newName, "newName"); - if (table.Name==newName) - throw new ArgumentException(Strings.ExTableAlreadyHasSpecifiedName); - return new SqlRenameTable(table, newName); - } - - public static SqlAlterTable Rename(TableColumn column, string newName) - { - ArgumentValidator.EnsureArgumentNotNull(column, "table"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(newName, "newName"); - if (column.Name==newName) - throw new ArgumentException(Strings.ExColumnAlreadyHasSpecifiedName); - return Alter(column.Table, new SqlRenameColumn(column, newName)); - } - - public static SqlAlterSequence Alter(Sequence sequence, SequenceDescriptor descriptor, SqlAlterIdentityInfoOptions infoOption) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); - return new SqlAlterSequence(sequence, descriptor, infoOption); - } - - public static SqlAlterSequence Alter(Sequence sequence, SequenceDescriptor descriptor) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); - return new SqlAlterSequence(sequence, descriptor, SqlAlterIdentityInfoOptions.All); - } - - public static SqlAlterDomain Alter(Domain domain, SqlAction action) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - ArgumentValidator.EnsureArgumentNotNull(action, "action"); - if (action is SqlAddConstraint) { - DomainConstraint constraint = ((SqlAddConstraint)action).Constraint as DomainConstraint; - if (constraint==null) - throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); - else if (constraint.Domain!=null && constraint.Domain!=domain) - throw new ArgumentException(Strings.ExConstraintBelongsToOtherDomain, "action"); - } - else if (action is SqlDropConstraint) { - DomainConstraint constraint = ((SqlDropConstraint)action).Constraint as DomainConstraint; - if (constraint==null) - throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); - else if (constraint.Domain!=null && constraint.Domain!=domain) - throw new ArgumentException(Strings.ExConstraintBelongsToOtherDomain, "action"); - } - else if (action is SqlSetDefault && ((SqlSetDefault)action).Column!=null || - action is SqlDropDefault && ((SqlDropDefault)action).Column!=null) - throw new ArgumentException(Strings.ExInvalidActionType, "action"); - else if (action is SqlAddColumn || action is SqlDropColumn || action is SqlAlterIdentityInfo) - throw new ArgumentException(Strings.ExInvalidActionType, "action"); - return new SqlAlterDomain(domain, action); - } - - public static SqlAlterPartitionFunction Alter( - PartitionFunction partitionFunction, string booundary, SqlAlterPartitionFunctionOption option) - { - ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); - ArgumentValidator.EnsureArgumentNotNull(booundary, "booundary"); - return new SqlAlterPartitionFunction(partitionFunction, booundary, option); - } - - public static SqlAlterPartitionScheme Alter(PartitionSchema partitionSchema) - { - ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); - return new SqlAlterPartitionScheme(partitionSchema, null); - } - - public static SqlAlterPartitionScheme Alter(PartitionSchema partitionSchema, string filegroup) - { - ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); - return new SqlAlterPartitionScheme(partitionSchema, filegroup); - } - - public static SqlAlterIdentityInfo Alter(TableColumn column, SequenceDescriptor descriptor) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); - return new SqlAlterIdentityInfo(column, descriptor, SqlAlterIdentityInfoOptions.All); - } - - public static SqlAlterIdentityInfo Alter( - TableColumn column, SequenceDescriptor descriptor, SqlAlterIdentityInfoOptions infoOption) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); - return new SqlAlterIdentityInfo(column, descriptor, infoOption); - } - - public static SqlAddColumn AddColumn(TableColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new SqlAddColumn(column); - } - - public static SqlAddConstraint AddConstraint(Constraint constraint) - { - ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); - return new SqlAddConstraint(constraint); - } - - public static SqlDropColumn DropColumn(TableColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new SqlDropColumn(column); - } - - public static SqlDropColumn DropColumn(TableColumn column, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new SqlDropColumn(column, cascade); - } - - public static SqlDropConstraint DropConstraint(Constraint constraint) - { - ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); - return new SqlDropConstraint(constraint); - } - - public static SqlDropConstraint DropConstraint(Constraint constraint, bool cascade) - { - ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); - return new SqlDropConstraint(constraint, cascade); - } - - public static SqlSetDefault SetDefault(SqlExpression defaulValue, TableColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(defaulValue, "defaulValue"); - return new SqlSetDefault(defaulValue, column); - } - - public static SqlSetDefault SetDefault(SqlExpression defaulValue) - { - return SetDefault(defaulValue, null); - } - - public static SqlDropDefault DropDefault(TableColumn column) - { - return new SqlDropDefault(column); - } - - public static SqlDropDefault DropDefault() - { - return DropDefault(null); - } - - public static SqlCommand Command(SqlCommandType commandType) - { - return new SqlCommand(commandType); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.09 + +using System; +using Xtensive.Core; +using Xtensive.Sql.Ddl; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql +{ + /// + /// A factory for SQL DDL operations. + /// + public static class SqlDdl + { + public static SqlCreateAssertion Create(Assertion assertion) + { + ArgumentValidator.EnsureArgumentNotNull(assertion, "assertion"); + return new SqlCreateAssertion(assertion); + } + + public static SqlCreateCharacterSet Create(CharacterSet characterSet) + { + ArgumentValidator.EnsureArgumentNotNull(characterSet, "characterSet"); + return new SqlCreateCharacterSet(characterSet); + } + + public static SqlCreateCollation Create(Collation collation) + { + ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); + return new SqlCreateCollation(collation); + } + + public static SqlCreateDomain Create(Domain domain) + { + ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); + return new SqlCreateDomain(domain); + } + + public static SqlCreateIndex Create(Index index) + { + ArgumentValidator.EnsureArgumentNotNull(index, "index"); + return new SqlCreateIndex(index); + } + + public static SqlCreatePartitionFunction Create(PartitionFunction partitionFunction) + { + ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); + return new SqlCreatePartitionFunction(partitionFunction); + } + + public static SqlCreatePartitionScheme Create(PartitionSchema partitionSchema) + { + ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); + return new SqlCreatePartitionScheme(partitionSchema); + } + + public static SqlCreateSchema Create(Schema schema) + { + ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); + return new SqlCreateSchema(schema); + } + + public static SqlCreateSequence Create(Sequence sequence) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + return new SqlCreateSequence(sequence); + } + + public static SqlCreateTable Create(Table table) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlCreateTable(table); + } + + public static SqlCreateTranslation Create(Translation translation) + { + ArgumentValidator.EnsureArgumentNotNull(translation, "translation"); + return new SqlCreateTranslation(translation); + } + + public static SqlCreateView Create(View view) + { + ArgumentValidator.EnsureArgumentNotNull(view, "view"); + return new SqlCreateView(view); + } + + public static SqlDropAssertion Drop(Assertion assertion) + { + ArgumentValidator.EnsureArgumentNotNull(assertion, "assertion"); + return new SqlDropAssertion(assertion); + } + + public static SqlDropCharacterSet Drop(CharacterSet characterSet) + { + ArgumentValidator.EnsureArgumentNotNull(characterSet, "characterSet"); + return new SqlDropCharacterSet(characterSet); + } + + public static SqlDropCollation Drop(Collation collation) + { + ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); + return new SqlDropCollation(collation); + } + + public static SqlDropDomain Drop(Domain domain) + { + ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); + return new SqlDropDomain(domain); + } + + public static SqlDropIndex Drop(Index index) + { + ArgumentValidator.EnsureArgumentNotNull(index, "index"); + return new SqlDropIndex(index); + } + + //public static SqlDropIndex Drop(IIndex index, bool? online) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, null); + //} + + //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, null, maxDegreeOfParallelism); + //} + + //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, maxDegreeOfParallelism); + //} + + //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism, IPartitionDescriptor partitioningDescriptor) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, maxDegreeOfParallelism, partitioningDescriptor); + //} + + //public static SqlDropIndex Drop(IIndex index, bool? online, byte? maxDegreeOfParallelism, string tableSpace) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, maxDegreeOfParallelism, tableSpace); + //} + + //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism, IPartitionDescriptor partitioningDescriptor) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, null, maxDegreeOfParallelism, partitioningDescriptor); + //} + + //public static SqlDropIndex Drop(IIndex index, byte? maxDegreeOfParallelism, string tableSpace) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, null, maxDegreeOfParallelism, tableSpace); + //} + + //public static SqlDropIndex Drop(IIndex index, bool? online, IPartitionDescriptor partitioningDescriptor) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, null, partitioningDescriptor); + //} + + //public static SqlDropIndex Drop(IIndex index, bool? online, string tableSpace) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, online, null, tableSpace); + //} + + //public static SqlDropIndex Drop(IIndex index, IPartitionDescriptor partitioningDescriptor) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, null, null, partitioningDescriptor); + //} + + //public static SqlDropIndex Drop(IIndex index, string tableSpace) + //{ + // ArgumentValidator.EnsureArgumentNotNull(index, "index"); + // return new SqlDropIndex(index, null, null, tableSpace); + //} + + public static SqlDropPartitionFunction Drop(PartitionFunction partitionFunction) + { + ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); + return new SqlDropPartitionFunction(partitionFunction); + } + + public static SqlDropPartitionScheme Drop(PartitionSchema partitionSchema) + { + ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); + return new SqlDropPartitionScheme(partitionSchema); + } + + public static SqlDropDomain Drop(Domain domain, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); + return new SqlDropDomain(domain, cascade); + } + + public static SqlDropSchema Drop(Schema schema) + { + ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); + return new SqlDropSchema(schema); + } + + public static SqlDropSchema Drop(Schema schema, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); + return new SqlDropSchema(schema, cascade); + } + + public static SqlDropSequence Drop(Sequence sequence) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + return new SqlDropSequence(sequence); + } + + public static SqlDropSequence Drop(Sequence sequence, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + return new SqlDropSequence(sequence, cascade); + } + + public static SqlDropTable Drop(Table table) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlDropTable(table); + } + + public static SqlDropTable Drop(Table table, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlDropTable(table, cascade); + } + + public static SqlDropTranslation Drop(Translation translation) + { + ArgumentValidator.EnsureArgumentNotNull(translation, "translation"); + return new SqlDropTranslation(translation); + } + + public static SqlDropView Drop(View view) + { + ArgumentValidator.EnsureArgumentNotNull(view, "view"); + return new SqlDropView(view); + } + + public static SqlDropView Drop(View view, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(view, "view"); + return new SqlDropView(view, cascade); + } + + public static SqlAlterTable Alter(Table table, SqlAction action) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + ArgumentValidator.EnsureArgumentNotNull(action, "action"); + if (action is SqlSetDefault && ((SqlSetDefault)action).Column==null || + action is SqlDropDefault && ((SqlDropDefault)action).Column==null) + throw new ArgumentException(Strings.ExInvalidActionType, "action"); + if (action is SqlAddColumn && ((SqlAddColumn)action).Column.DataTable!=null && + ((SqlAddColumn)action).Column.DataTable!=table || + action is SqlSetDefault && ((SqlSetDefault)action).Column.DataTable!=null && + ((SqlSetDefault)action).Column.DataTable!=table || + action is SqlDropDefault && ((SqlDropDefault)action).Column.DataTable!=null && + ((SqlDropDefault)action).Column.DataTable!=table || + action is SqlDropColumn && ((SqlDropColumn)action).Column.DataTable!=null && + ((SqlDropColumn)action).Column.DataTable!=table || + action is SqlAlterIdentityInfo && ((SqlAlterIdentityInfo)action).Column.DataTable!=null && + ((SqlAlterIdentityInfo)action).Column.DataTable!=table) + throw new ArgumentException(Strings.ExColumnBelongsToOtherTable, "action"); + else if (action is SqlAddConstraint) { + var constraint = ((SqlAddConstraint) action).Constraint as TableConstraint; + if (constraint==null) + throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); + else if (constraint.Table!=null && constraint.Table!=table) + throw new ArgumentException(Strings.ExConstraintBelongsToOtherTable, "action"); + } + else if (action is SqlDropConstraint) { + var constraint = ((SqlDropConstraint) action).Constraint as TableConstraint; + if (constraint==null) + throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); + else if (constraint.Table!=null && constraint.Table!=table) + throw new ArgumentException(Strings.ExConstraintBelongsToOtherTable, "action"); + } + return new SqlAlterTable(table, action); + } + + public static SqlRenameTable Rename(Table table, string newName) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(newName, "newName"); + if (table.Name==newName) + throw new ArgumentException(Strings.ExTableAlreadyHasSpecifiedName); + return new SqlRenameTable(table, newName); + } + + public static SqlAlterTable Rename(TableColumn column, string newName) + { + ArgumentValidator.EnsureArgumentNotNull(column, "table"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(newName, "newName"); + if (column.Name==newName) + throw new ArgumentException(Strings.ExColumnAlreadyHasSpecifiedName); + return Alter(column.Table, new SqlRenameColumn(column, newName)); + } + + public static SqlAlterSequence Alter(Sequence sequence, SequenceDescriptor descriptor, SqlAlterIdentityInfoOptions infoOption) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); + return new SqlAlterSequence(sequence, descriptor, infoOption); + } + + public static SqlAlterSequence Alter(Sequence sequence, SequenceDescriptor descriptor) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); + return new SqlAlterSequence(sequence, descriptor, SqlAlterIdentityInfoOptions.All); + } + + public static SqlAlterDomain Alter(Domain domain, SqlAction action) + { + ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); + ArgumentValidator.EnsureArgumentNotNull(action, "action"); + if (action is SqlAddConstraint) { + DomainConstraint constraint = ((SqlAddConstraint)action).Constraint as DomainConstraint; + if (constraint==null) + throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); + else if (constraint.Domain!=null && constraint.Domain!=domain) + throw new ArgumentException(Strings.ExConstraintBelongsToOtherDomain, "action"); + } + else if (action is SqlDropConstraint) { + DomainConstraint constraint = ((SqlDropConstraint)action).Constraint as DomainConstraint; + if (constraint==null) + throw new ArgumentException(Strings.ExInvalidConstraintType, "action"); + else if (constraint.Domain!=null && constraint.Domain!=domain) + throw new ArgumentException(Strings.ExConstraintBelongsToOtherDomain, "action"); + } + else if (action is SqlSetDefault && ((SqlSetDefault)action).Column!=null || + action is SqlDropDefault && ((SqlDropDefault)action).Column!=null) + throw new ArgumentException(Strings.ExInvalidActionType, "action"); + else if (action is SqlAddColumn || action is SqlDropColumn || action is SqlAlterIdentityInfo) + throw new ArgumentException(Strings.ExInvalidActionType, "action"); + return new SqlAlterDomain(domain, action); + } + + public static SqlAlterPartitionFunction Alter( + PartitionFunction partitionFunction, string booundary, SqlAlterPartitionFunctionOption option) + { + ArgumentValidator.EnsureArgumentNotNull(partitionFunction, "partitionFunction"); + ArgumentValidator.EnsureArgumentNotNull(booundary, "booundary"); + return new SqlAlterPartitionFunction(partitionFunction, booundary, option); + } + + public static SqlAlterPartitionScheme Alter(PartitionSchema partitionSchema) + { + ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); + return new SqlAlterPartitionScheme(partitionSchema, null); + } + + public static SqlAlterPartitionScheme Alter(PartitionSchema partitionSchema, string filegroup) + { + ArgumentValidator.EnsureArgumentNotNull(partitionSchema, "partitionSchema"); + return new SqlAlterPartitionScheme(partitionSchema, filegroup); + } + + public static SqlAlterIdentityInfo Alter(TableColumn column, SequenceDescriptor descriptor) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); + return new SqlAlterIdentityInfo(column, descriptor, SqlAlterIdentityInfoOptions.All); + } + + public static SqlAlterIdentityInfo Alter( + TableColumn column, SequenceDescriptor descriptor, SqlAlterIdentityInfoOptions infoOption) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + ArgumentValidator.EnsureArgumentNotNull(descriptor, "info"); + return new SqlAlterIdentityInfo(column, descriptor, infoOption); + } + + public static SqlAddColumn AddColumn(TableColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new SqlAddColumn(column); + } + + public static SqlAddConstraint AddConstraint(Constraint constraint) + { + ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); + return new SqlAddConstraint(constraint); + } + + public static SqlDropColumn DropColumn(TableColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new SqlDropColumn(column); + } + + public static SqlDropColumn DropColumn(TableColumn column, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new SqlDropColumn(column, cascade); + } + + public static SqlDropConstraint DropConstraint(Constraint constraint) + { + ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); + return new SqlDropConstraint(constraint); + } + + public static SqlDropConstraint DropConstraint(Constraint constraint, bool cascade) + { + ArgumentValidator.EnsureArgumentNotNull(constraint, "constraint"); + return new SqlDropConstraint(constraint, cascade); + } + + public static SqlSetDefault SetDefault(SqlExpression defaulValue, TableColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(defaulValue, "defaulValue"); + return new SqlSetDefault(defaulValue, column); + } + + public static SqlSetDefault SetDefault(SqlExpression defaulValue) + { + return SetDefault(defaulValue, null); + } + + public static SqlDropDefault DropDefault(TableColumn column) + { + return new SqlDropDefault(column); + } + + public static SqlDropDefault DropDefault() + { + return DropDefault(null); + } + + public static SqlCommand Command(SqlCommandType commandType) + { + return new SqlCommand(commandType); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDml.cs b/Orm/Xtensive.Orm/Sql/SqlDml.cs index ebe100165a..cfd8bd51de 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDml.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDml.cs @@ -1,2074 +1,2074 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Reflection; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Model; -using System.Linq; - -namespace Xtensive.Sql -{ - /// - /// A factory for SQL DML operations. - /// - public static class SqlDml - { - public static readonly SqlDefaultValue DefaultValue = new SqlDefaultValue(); - public static readonly SqlNull Null = new SqlNull(); - public static readonly SqlBreak Break = new SqlBreak(); - public static readonly SqlContinue Continue = new SqlContinue(); - public static readonly SqlNative Asterisk = Native("*"); - - #region Aggregates - - public static SqlAggregate Count() - { - return Count(Asterisk); - } - - public static SqlAggregate Count(SqlExpression expression) - { - return Count(expression, false); - } - - public static SqlAggregate Count(SqlExpression expression, bool distinct) - { - return new SqlAggregate(SqlNodeType.Count, expression, distinct); - } - - public static SqlAggregate Avg(SqlExpression expression) - { - return Avg(expression, false); - } - - public static SqlAggregate Avg(SqlExpression expression, bool distinct) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlAggregate(SqlNodeType.Avg, expression, distinct); - } - - public static SqlAggregate Sum(SqlExpression expression) - { - return Sum(expression, false); - } - - public static SqlAggregate Sum(SqlExpression expression, bool distinct) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlAggregate(SqlNodeType.Sum, expression, distinct); - } - - public static SqlAggregate Min(SqlExpression expression) - { - return Min(expression, false); - } - - public static SqlAggregate Min(SqlExpression expression, bool distinct) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlAggregate(SqlNodeType.Min, expression, distinct); - } - - public static SqlAggregate Max(SqlExpression expression) - { - return Max(expression, false); - } - - public static SqlAggregate Max(SqlExpression expression, bool distinct) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlAggregate(SqlNodeType.Max, expression, distinct); - } - - #endregion - - #region Arithmetic - - public static SqlBinary Add(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.Add, left, right); - } - - public static SqlBinary Subtract(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.Subtract, left, right); - } - - public static SqlBinary Multiply(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.Multiply, left, right); - } - - public static SqlBinary Divide(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.Divide, left, right); - } - - public static SqlBinary Modulo(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.Modulo, left, right); - } - - #endregion - - #region Array - - public static SqlArray Array(IEnumerable values) - { - var valueList = values.ToList(); - if (valueList.Count==0) - return Array(ArrayUtils.EmptyArray); - var itemType = valueList[0].GetType(); - foreach (var t in values.Select(value => value.GetType())) { - if (!itemType.IsAssignableFrom(t)) - throw new ArgumentException(Strings.ExTypesOfValuesAreDifferent); - } - var resultType = typeof (SqlArray<>).MakeGenericType(itemType); - var result = Activator.CreateInstance( - resultType, - BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, - null, new object[] {valueList}, null); - return (SqlArray) result; - } - - public static SqlArray Array(params bool[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params char[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params sbyte[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params byte[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params short[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params ushort[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params int[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params uint[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params long[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params ulong[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params float[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params double[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params decimal[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params string[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params DateTime[] value) - { - return new SqlArray(value); - } - - public static SqlArray Array(params TimeSpan[] value) - { - return new SqlArray(value); - } - - #endregion - - #region Binary - - public static SqlBinary BitAnd(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.BitAnd, left, right); - } - - public static SqlBinary BitOr(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.BitOr, left, right); - } - - public static SqlBinary BitXor(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - return Binary(SqlNodeType.BitXor, left, right); - } - - public static SqlBinary And(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsBooleanExpression(left); - SqlValidator.EnsureIsBooleanExpression(right); - return Binary(SqlNodeType.And, left, right); - } - - public static SqlBinary Or(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsBooleanExpression(left); - SqlValidator.EnsureIsBooleanExpression(right); - return Binary(SqlNodeType.Or, left, right); - } - - public static SqlQueryExpression Except(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Except(left, right, false); - } - - public static SqlQueryExpression ExceptAll(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Except(left, right, true); - } - - private static SqlQueryExpression Except(ISqlQueryExpression left, ISqlQueryExpression right, bool all) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlQueryExpression(SqlNodeType.Except, left, right, all); - } - - public static SqlQueryExpression Intersect(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Intersect(left, right, false); - } - - public static SqlQueryExpression IntersectAll(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Intersect(left, right, true); - } - - private static SqlQueryExpression Intersect(ISqlQueryExpression left, ISqlQueryExpression right, bool all) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlQueryExpression(SqlNodeType.Intersect, left, right, all); - } - - public static SqlQueryExpression Union(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Union(left, right, false); - } - - public static SqlQueryExpression UnionAll(ISqlQueryExpression left, ISqlQueryExpression right) - { - return Union(left, right, true); - } - - private static SqlQueryExpression Union(ISqlQueryExpression left, ISqlQueryExpression right, bool all) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlQueryExpression(SqlNodeType.Union, left, right, all); - } - - public static SqlBinary In(SqlExpression left, ISqlQueryExpression right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.In, left, SubQuery(right)); - } - - public static SqlBinary In(SqlExpression left, SqlRow right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.In, left, right); - } - - public static SqlBinary In(SqlExpression left, SqlArray right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.In, left, right); - } - - public static SqlBinary NotIn(SqlExpression left, ISqlQueryExpression right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.NotIn, left, SubQuery(right)); - } - - public static SqlBinary NotIn(SqlExpression left, SqlRow right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.NotIn, left, right); - } - - public static SqlBinary NotIn(SqlExpression left, SqlArray right) - { - SqlValidator.EnsureIsRowValueConstructor(left); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.NotIn, left, right); - } - - public static SqlBetween Between( - SqlExpression expression, SqlExpression leftBoundary, SqlExpression rightBoundary) - { - SqlValidator.EnsureIsRowValueConstructor(expression); - SqlValidator.EnsureIsRowValueConstructor(leftBoundary); - SqlValidator.EnsureIsRowValueConstructor(rightBoundary); - return - new SqlBetween( - SqlNodeType.Between, expression, leftBoundary, rightBoundary); - } - - public static SqlBetween NotBetween( - SqlExpression expression, SqlExpression leftBoundary, SqlExpression rightBoundary) - { - SqlValidator.EnsureIsRowValueConstructor(expression); - SqlValidator.EnsureIsRowValueConstructor(leftBoundary); - SqlValidator.EnsureIsRowValueConstructor(rightBoundary); - return - new SqlBetween( - SqlNodeType.NotBetween, expression, leftBoundary, rightBoundary); - } - - internal static SqlBinary Binary(SqlNodeType nodeType, SqlExpression left, SqlExpression right) - { - return new SqlBinary(nodeType, left, right); - } - - #endregion - - #region Cast - - public static SqlCast Cast(SqlExpression operand, SqlValueType type) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(type, "type"); - return new SqlCast(operand, type); - } - - public static SqlCast Cast(SqlExpression operand, SqlType type) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCast(operand, new SqlValueType(type)); - } - - public static SqlCast Cast(SqlExpression operand, SqlType type, int size) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCast(operand, new SqlValueType(type, size)); - } - - public static SqlCast Cast(SqlExpression operand, SqlType type, short precision, short scale) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCast(operand, new SqlValueType(type, precision, scale)); - } - - public static SqlCast Cast(SqlExpression operand, SqlType type, short precision) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlCast(operand, new SqlValueType(type, precision, 0)); - } - - #endregion - - #region Comparison - - public static SqlBinary Equals(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.Equals, left, right); - } - - public static SqlBinary NotEquals(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.NotEquals, left, right); - } - - public static SqlBinary GreaterThan(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.GreaterThan, left, right); - } - - public static SqlBinary LessThan(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.LessThan, left, right); - } - - public static SqlBinary GreaterThanOrEquals(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.GreaterThanOrEquals, left, right); - } - - public static SqlBinary LessThanOrEquals(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return Binary(SqlNodeType.LessThanOrEquals, left, right); - } - - #endregion - - # region DateTime functions - - public static SqlFunctionCall CurrentDate() - { - return new SqlFunctionCall(SqlFunctionType.CurrentDate); - } - - /* - public static SqlFunctionCall CurrentTime() - { - return new SqlFunctionCall(SqlFunctionType.CurrentTime); - } - - public static SqlFunctionCall CurrentTime(uint precision) - { - return new SqlFunctionCall(SqlFunctionType.CurrentTime, Literal(precision)); - } - - public static SqlFunctionCall CurrentTime(SqlExpression precision) - { - SqlValidator.EnsureIsArithmeticExpression(precision); - return new SqlFunctionCall(SqlFunctionType.CurrentTime, precision); - } - */ - - public static SqlFunctionCall CurrentTimeStamp() - { - return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp); - } - - public static SqlFunctionCall CurrentTimeStamp(uint precision) - { - return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp, Literal(precision)); - } - - public static SqlFunctionCall CurrentTimeStamp(SqlExpression precision) - { - SqlValidator.EnsureIsArithmeticExpression(precision); - return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp, precision); - } - - public static SqlExtract Extract(SqlDateTimePart part, SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsArithmeticExpression(operand); - if (part==SqlDateTimePart.Nothing) - throw new ArgumentException(); - return new SqlExtract(part, operand); - } - - public static SqlExtract Extract(SqlIntervalPart part, SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsArithmeticExpression(operand); - if (part==SqlIntervalPart.Nothing) - throw new ArgumentException(); - return new SqlExtract(part, operand); - } - - public static SqlFunctionCall DateTimeConstruct(SqlExpression year, SqlExpression month, SqlExpression day) - { - ArgumentValidator.EnsureArgumentNotNull(year, "year"); - ArgumentValidator.EnsureArgumentNotNull(month, "month"); - ArgumentValidator.EnsureArgumentNotNull(day, "day"); - SqlValidator.EnsureIsArithmeticExpression(year); - SqlValidator.EnsureIsArithmeticExpression(month); - SqlValidator.EnsureIsArithmeticExpression(day); - return new SqlFunctionCall(SqlFunctionType.DateTimeConstruct, year, month, day); - } - - public static SqlBinary DateTimePlusInterval(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimePlusInterval, left, right); - } - - public static SqlBinary DateTimeMinusInterval(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimeMinusInterval, left, right); - } - - public static SqlBinary DateTimeMinusDateTime(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimeMinusDateTime, left, right); - } - - public static SqlFunctionCall DateTimeAddYears(SqlExpression source, SqlExpression years) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNull(years, "years"); - return new SqlFunctionCall(SqlFunctionType.DateTimeAddYears, source, years); - } - - public static SqlFunctionCall DateTimeAddMonths(SqlExpression source, SqlExpression months) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNull(months, "months"); - return new SqlFunctionCall(SqlFunctionType.DateTimeAddMonths, source, months); - } - - public static SqlFunctionCall DateTimeToStringIso(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlFunctionCall(SqlFunctionType.DateTimeToStringIso, expression); - } - - public static SqlFunctionCall DateTimeTruncate(SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - return new SqlFunctionCall(SqlFunctionType.DateTimeTruncate, source); - } - - public static SqlFunctionCall IntervalConstruct(SqlExpression nanoseconds) - { - ArgumentValidator.EnsureArgumentNotNull(nanoseconds, "nanoseconds"); - return new SqlFunctionCall(SqlFunctionType.IntervalConstruct, nanoseconds); - } - - public static SqlFunctionCall IntervalToMilliseconds(SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - return new SqlFunctionCall(SqlFunctionType.IntervalToMilliseconds, source); - } - - public static SqlFunctionCall IntervalToNanoseconds(SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - return new SqlFunctionCall(SqlFunctionType.IntervalToNanoseconds, source); - } - - public static SqlFunctionCall IntervalAbs(SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - return new SqlFunctionCall(SqlFunctionType.IntervalAbs, source); - } - - public static SqlFunctionCall IntervalNegate(SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - return new SqlFunctionCall(SqlFunctionType.IntervalNegate, source); - } - - #endregion - - # region DateTimeOffset functions - - public static SqlFunctionCall CurrentDateTimeOffset() - { - return new SqlFunctionCall(SqlFunctionType.CurrentDateTimeOffset); - } - - public static SqlExtract Extract(SqlDateTimeOffsetPart part, SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsArithmeticExpression(operand); - if (part==SqlDateTimeOffsetPart.Nothing) - throw new ArgumentException(); - return new SqlExtract(part, operand); - } - - public static SqlFunctionCall DateTimeOffsetConstruct(SqlExpression dateTime, SqlExpression offset) - { - ArgumentValidator.EnsureArgumentNotNull(dateTime, "dateTime"); - ArgumentValidator.EnsureArgumentNotNull(offset, "offset"); - SqlValidator.EnsureIsArithmeticExpression(offset); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetConstruct, dateTime, offset); - } - - public static SqlBinary DateTimeOffsetPlusInterval(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimeOffsetPlusInterval, left, right); - } - - public static SqlBinary DateTimeOffsetMinusInterval(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimeOffsetMinusInterval, left, right); - } - - public static SqlBinary DateTimeOffsetMinusDateTimeOffset(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.DateTimeOffsetMinusDateTimeOffset, left, right); - } - - public static SqlFunctionCall DateTimeOffsetAddYears(SqlExpression source, SqlExpression years) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNull(years, "years"); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetAddYears, source, years); - } - - public static SqlFunctionCall DateTimeOffsetAddMonths(SqlExpression source, SqlExpression months) - { - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - ArgumentValidator.EnsureArgumentNotNull(months, "months"); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetAddMonths, source, months); - } - - public static SqlFunctionCall DateTimeOffsetTimeOfDay(SqlExpression dateTimeOffset) - { - ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetTimeOfDay, dateTimeOffset); - } - - public static SqlFunctionCall DateTimeOffsetToLocalTime(SqlExpression dateTimeOffset) - { - ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetToLocalTime, dateTimeOffset); - } - - public static SqlFunctionCall DateTimeOffsetToUtcTime(SqlExpression dateTimeOffset) - { - ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); - return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetToUtcTime, dateTimeOffset); - } - - public static SqlFunctionCall DateTimeToDateTimeOffset(SqlExpression dateTime) - { - ArgumentValidator.EnsureArgumentNotNull(dateTime, "dateTime"); - return new SqlFunctionCall(SqlFunctionType.DateTimeToDateTimeOffset, dateTime); - } - - #endregion - - #region FunctionCall - - public static SqlUserFunctionCall FunctionCall(string name, IEnumerable expressions) - { - SqlValidator.EnsureAreSqlRowArguments(expressions); - return new SqlUserFunctionCall(name, expressions); - } - - public static SqlUserFunctionCall FunctionCall(string name, params SqlExpression[] expressions) - { - Collection collection = new Collection(); - for (int i = 0, l = expressions.Length; i()); - } - - public static SqlFunctionCall CurrentUser() - { - return new SqlFunctionCall(SqlFunctionType.CurrentUser); - } - - public static SqlFunctionCall SessionUser() - { - return new SqlFunctionCall(SqlFunctionType.SessionUser); - } - - public static SqlFunctionCall SystemUser() - { - return new SqlFunctionCall(SqlFunctionType.SystemUser); - } - - public static SqlFunctionCall User() - { - return new SqlFunctionCall(SqlFunctionType.User); - } - - public static SqlFunctionCall NullIf(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - //SqlCase c = new SqlCase(null); - //c[left==right] = Null; - //c.Else = left; - //return c; - return new SqlFunctionCall(SqlFunctionType.NullIf, left, right); - } - - public static SqlFunctionCall Coalesce(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(left); - SqlValidator.EnsureIsArithmeticExpression(right); - //SqlCase c = new SqlCase(null); - //c[IsNotNull(left)] = left; - //c.Else = right; - //return c; - return new SqlFunctionCall(SqlFunctionType.Coalesce, left, right); - } - - public static SqlFunctionCall Coalesce( - SqlExpression left, SqlExpression right, params SqlExpression[] values) - { - //if (values!=null && values.Length>0) { - // SqlExpression[] v = null; - // if (values.Length>1) { - // v = new SqlExpression[values.Length-1]; - // for (int i = 1, l = values.Length; i leftColumns, IReadOnlyList rightColumns) - { - return Join(joinType, left, right, leftColumns, rightColumns, null); - } - - public static SqlJoinedTable Join(SqlJoinType joinType, SqlTable left, SqlTable right, SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - if (!expression.IsNullReference() && (joinType == SqlJoinType.CrossApply || joinType == SqlJoinType.LeftOuterApply)) - throw new ArgumentException(Strings.ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply, "expression"); - return new SqlJoinedTable(new SqlJoinExpression(joinType, left, right, expression)); - } - - public static SqlJoinedTable Join(SqlJoinType joinType, SqlTable left, SqlTable right, - IReadOnlyList leftColumns, IReadOnlyList rightColumns, SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - if (!expression.IsNullReference() && (joinType == SqlJoinType.CrossApply || joinType == SqlJoinType.LeftOuterApply)) - throw new ArgumentException(Strings.ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply, "expression"); - return new SqlJoinedTable(new SqlJoinExpression(joinType, left, right, expression), leftColumns, rightColumns); - } - - public static SqlJoinedTable Join(SqlTable left, SqlTable right, params SqlColumn[] columns) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlJoinedTable(new SqlJoinExpression(SqlJoinType.UsingJoin, left, right, Row(columns))); - } - - #endregion - - #region Literal - - public static SqlLiteral Literal(bool value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(char value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(sbyte value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(byte value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(short value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(ushort value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(int value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(uint value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(long value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(ulong value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(float value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(double value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(decimal value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(string value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(DateTime value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(TimeSpan value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(byte[] value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(Guid value) - { - return new SqlLiteral(value); - } - - public static SqlLiteral Literal(object value) - { - var valueType = value.GetType(); - var resultType = typeof (SqlLiteral<>).MakeGenericType(valueType); - var result = Activator.CreateInstance( - resultType, - BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, - null, new[] {value}, null); - return (SqlLiteral) result; - } - - public static SqlExpression LiteralOrContainer(object value) - { - var valueType = value.GetType(); - return SqlValidator.IsLiteralTypeSupported(valueType) - ? (SqlExpression) Literal(value) - : Container(value); - } - - #endregion - - # region Match - - public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, bool unique, SqlMatchType matchType) - { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - ArgumentValidator.EnsureArgumentNotNull(query, "query"); - return new SqlMatch(value, SubQuery(query), unique, matchType); - } - - public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, bool unique) - { - return Match(value, query, unique, SqlMatchType.None); - } - - public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, SqlMatchType matchType) - { - return Match(value, query, false, matchType); - } - - public static SqlMatch Match(SqlRow value, ISqlQueryExpression query) - { - return Match(value, query, false, SqlMatchType.None); - } - - public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, bool unique, SqlMatchType matchType) - { - ArgumentValidator.EnsureArgumentNotNull(value, "value"); - ArgumentValidator.EnsureArgumentNotNull(query, "query"); - return new SqlMatch(SubQuery(value), SubQuery(query), unique, matchType); - } - - public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, bool unique) - { - return Match(value, query, unique, SqlMatchType.None); - } - - public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, SqlMatchType matchType) - { - return Match(value, query, false, matchType); - } - - public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query) - { - return Match(value, query, false, SqlMatchType.None); - } - - # endregion - - # region Math functions - - public static SqlFunctionCall Abs(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Abs, argument); - } - - public static SqlFunctionCall Acos(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Acos, argument); - } - - public static SqlFunctionCall Asin(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Asin, argument); - } - - public static SqlFunctionCall Atan(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Atan, argument); - } - - public static SqlFunctionCall Atan2(SqlExpression argument1, SqlExpression argument2) - { - ArgumentValidator.EnsureArgumentNotNull(argument1, "argument1"); - ArgumentValidator.EnsureArgumentNotNull(argument2, "argument2"); - SqlValidator.EnsureIsArithmeticExpression(argument1); - SqlValidator.EnsureIsArithmeticExpression(argument2); - return new SqlFunctionCall(SqlFunctionType.Atan2, argument1, argument2); - } - - public static SqlFunctionCall Ceiling(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Ceiling, argument); - } - - public static SqlFunctionCall Cos(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Cos, argument); - } - - public static SqlFunctionCall Cot(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Cot, argument); - } - - public static SqlFunctionCall Degrees(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Degrees, argument); - } - - public static SqlFunctionCall Exp(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Exp, argument); - } - - public static SqlFunctionCall Floor(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Floor, argument); - } - - public static SqlFunctionCall Log(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Log, argument); - } - - public static SqlFunctionCall Log10(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Log10, argument); - } - - public static SqlFunctionCall Pi() - { - return new SqlFunctionCall(SqlFunctionType.Pi); - } - - public static SqlFunctionCall Power(SqlExpression argument, SqlExpression power) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - ArgumentValidator.EnsureArgumentNotNull(power, "power"); - SqlValidator.EnsureIsArithmeticExpression(power); - return new SqlFunctionCall(SqlFunctionType.Power, argument, power); - } - - public static SqlFunctionCall Radians(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Radians, argument); - } - - public static SqlFunctionCall Rand(SqlExpression seed) - { - if (!seed.IsNullReference()) { - SqlValidator.EnsureIsArithmeticExpression(seed); - return new SqlFunctionCall(SqlFunctionType.Rand, seed); - } - else - return new SqlFunctionCall(SqlFunctionType.Rand, seed); - } - - public static SqlFunctionCall Rand() - { - return Rand(null); - } - - public static SqlFunctionCall Round(SqlExpression argument, SqlExpression length) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - ArgumentValidator.EnsureArgumentNotNull(length, "length"); - SqlValidator.EnsureIsArithmeticExpression(length); - return new SqlFunctionCall(SqlFunctionType.Round, argument, length); - } - - public static SqlFunctionCall Round(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Round, argument); - } - - public static SqlRound Round(SqlExpression argument, SqlExpression length, TypeCode type, MidpointRounding mode) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - if (type!=TypeCode.Decimal && type!=TypeCode.Double) - throw new ArgumentOutOfRangeException("type"); - return new SqlRound(argument, length, type, mode); - } - - public static SqlFunctionCall Truncate(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Truncate, argument); - } - - public static SqlFunctionCall Sign(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Sign, argument); - } - - public static SqlFunctionCall Sin(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Sin, argument); - } - - public static SqlFunctionCall Sqrt(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Sqrt, argument); - } - - public static SqlFunctionCall Square(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Square, argument); - } - - public static SqlFunctionCall Tan(SqlExpression argument) - { - ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); - SqlValidator.EnsureIsArithmeticExpression(argument); - return new SqlFunctionCall(SqlFunctionType.Tan, argument); - } - - # endregion - - #region Misc - - public static SqlNative Native(string value) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(value, "value"); - return new SqlNative(value); - } - - public static SqlSubQuery SubQuery(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlSubQuery(operand); - } - - public static SqlCursor Cursor(string name) - { - return Cursor(name, null); - } - - public static SqlCursor Cursor(string name, ISqlQueryExpression query) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlCursor(name, query); - } - - public static SqlParameterRef ParameterRef(object parameter) - { - ArgumentValidator.EnsureArgumentNotNull(parameter, "parameter"); - return new SqlParameterRef(parameter); - } - - public static SqlParameterRef ParameterRef(string name) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlParameterRef(name); - } - - public static SqlCase Case(SqlExpression value) - { - return new SqlCase(value); - } - - public static SqlCase Case() - { - return Case(null); - } - - public static SqlNextValue NextValue(Sequence sequence) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - return new SqlNextValue(sequence); - } - - public static SqlNextValue NextValue(Sequence sequence, int increment) - { - ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); - return new SqlNextValue(sequence, increment); - } - - public static SqlStatementBlock StatementBlock() - { - return new SqlStatementBlock(); - } - - public static SqlVariant Variant(object id, SqlExpression main, SqlExpression alternative) - { - ArgumentValidator.EnsureArgumentNotNull(id, "id"); - ArgumentValidator.EnsureArgumentNotNull(main, "main"); - ArgumentValidator.EnsureArgumentNotNull(alternative, "alternative"); - return new SqlVariant(id, main, alternative); - } - - public static SqlPlaceholder Placeholder(object id) - { - ArgumentValidator.EnsureArgumentNotNull(id, "id"); - return new SqlPlaceholder(id); - } - - public static SqlDynamicFilter DynamicFilter(object id) - { - ArgumentValidator.EnsureArgumentNotNull(id, "id"); - return new SqlDynamicFilter(id); - } - - public static SqlContainer Container(object value) - { - return new SqlContainer(value); - } - - public static SqlFunctionCall LastAutoGeneratedId() - { - return new SqlFunctionCall(SqlFunctionType.LastAutoGeneratedId); - } - - public static SqlRowNumber RowNumber() - { - return new SqlRowNumber(); - } - - #endregion - - #region OrderBy - - public static SqlOrder Order(SqlExpression expression) - { - return Order(expression, true); - } - - public static SqlOrder Order(SqlExpression expression, bool ascending) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlOrder(expression, ascending); - } - - public static SqlOrder Order(int position) - { - return Order(position, true); - } - - public static SqlOrder Order(int position, bool ascending) - { - if (position<=0) - throw new ArgumentOutOfRangeException( - "position", position, Strings.ExPositionValueShouldBeGreaterThanZero); - return new SqlOrder(position, ascending); - } - - #endregion - - #region Row - - public static SqlRow Row(IList expressions) - { - SqlValidator.EnsureAreSqlRowArguments(expressions); - return new SqlRow(expressions); - } - - public static SqlRow Row(params SqlExpression[] expressions) - { - Collection collection = new Collection(); - for (int i = 0, l = expressions.Length; i()); - } - - #endregion - - #region Statement - - public static SqlFragment Fragment(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlFragment(expression); - } - - public static SqlWhile While(SqlExpression condition) - { - ArgumentValidator.EnsureArgumentNotNull(condition, "condition"); - SqlValidator.EnsureIsBooleanExpression(condition); - return new SqlWhile(condition); - } - - public static SqlBatch Batch() - { - return new SqlBatch(); - } - - public static SqlAssignment Assign(SqlVariable left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(right); - return new SqlAssignment(left, right); - } - - public static SqlAssignment Assign(SqlParameterRef left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsArithmeticExpression(right); - return new SqlAssignment(left, right); - } - - public static SqlIf If(SqlExpression condition, SqlStatement ifTrue, SqlStatement ifFalse) - { - ArgumentValidator.EnsureArgumentNotNull(condition, "condition"); - SqlValidator.EnsureIsBooleanExpression(condition); - ArgumentValidator.EnsureArgumentNotNull(ifTrue, "ifTrue"); - return new SqlIf(condition, ifTrue, ifFalse); - } - - public static SqlIf If(SqlExpression condition, SqlStatement ifTrue) - { - return If(condition, ifTrue, null); - } - - public static SqlDelete Delete() - { - return new SqlDelete(); - } - - public static SqlDelete Delete(SqlTableRef table) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlDelete(table); - } - - public static SqlUpdate Update() - { - return new SqlUpdate(); - } - - public static SqlUpdate Update(SqlTableRef tableRef) - { - ArgumentValidator.EnsureArgumentNotNull(tableRef, "table"); - return new SqlUpdate(tableRef); - } - - public static SqlInsert Insert() - { - return new SqlInsert(); - } - - public static SqlInsert Insert(SqlTableRef tableRef) - { - ArgumentValidator.EnsureArgumentNotNull(tableRef, "table"); - return new SqlInsert(tableRef); - } - - public static SqlSelect Select() - { - return new SqlSelect(); - } - - public static SqlSelect Select(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - var result = new SqlSelect(); - result.Columns.Add(expression); - return result; - } - - public static SqlSelect Select(SqlTable table) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlSelect(table); - } - - #endregion - - # region String functions - - public static SqlConcat Concat(SqlExpression left, SqlExpression right) - { - return new SqlConcat(new [] {left, right}); - } - - public static SqlConcat Concat(params SqlExpression[] items) - { - ArgumentValidator.EnsureArgumentNotNull(items, "items"); - foreach (var item in items) - SqlValidator.EnsureIsCharacterExpression(item); - return new SqlConcat(items); - } - - /// - /// Concates underlying expression without any sign between. - /// - /// Left expression - /// Right expression - /// New expression. - public static SqlBinary RawConcat(SqlExpression left, SqlExpression right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - SqlValidator.EnsureIsCharacterExpression(left); - SqlValidator.EnsureIsCharacterExpression(right); - return new SqlBinary(SqlNodeType.RawConcat, left, right); - } - - public static SqlFunctionCall Substring(SqlExpression operand, int start) - { - return Substring(operand, start, null); - } - - public static SqlFunctionCall Substring(SqlExpression operand, int start, int? length) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - if (length<0) - throw new ArgumentException(Strings.ExLengthShouldBeNotNegativeValue, "length"); - var arguments = new Collection(); - arguments.Add(operand); - arguments.Add(new SqlLiteral(start)); - if (length.HasValue) - arguments.Add(new SqlLiteral(length.Value)); - return new SqlFunctionCall(SqlFunctionType.Substring, arguments); - } - - public static SqlFunctionCall Substring( - SqlExpression operand, SqlExpression start) - { - return Substring(operand, start, null); - } - - public static SqlFunctionCall Substring( - SqlExpression operand, SqlExpression start, SqlExpression length) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(start, "start"); - SqlValidator.EnsureIsCharacterExpression(operand); - SqlValidator.EnsureIsArithmeticExpression(start); - if (length != null) - SqlValidator.EnsureIsArithmeticExpression(length); - var arguments = new Collection(); - arguments.Add(operand); - arguments.Add(start); - if (length != null) - arguments.Add(length); - return new SqlFunctionCall(SqlFunctionType.Substring, arguments); - } - - public static SqlFunctionCall Upper(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - var arguments = new Collection(); - arguments.Add(operand); - return new SqlFunctionCall(SqlFunctionType.Upper, arguments); - } - - public static SqlFunctionCall Lower(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - var arguments = new Collection(); - arguments.Add(operand); - return new SqlFunctionCall(SqlFunctionType.Lower, arguments); - } - - public static SqlTrim Trim(SqlExpression operand, SqlTrimType trimType, string trimCharacters) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - ArgumentValidator.EnsureArgumentNotNull(trimCharacters, "trimCharacters"); - return new SqlTrim(operand, trimCharacters, trimType); - } - - public static SqlTrim Trim(SqlExpression operand, SqlTrimType trimType) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - return new SqlTrim(operand, null, trimType); - } - - public static SqlTrim Trim(SqlExpression operand) - { - return Trim(operand, SqlTrimType.Both); - } - - public static SqlLike Like( - SqlExpression expression, SqlExpression pattern, SqlExpression escape) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - SqlValidator.EnsureIsCharacterExpression(expression); - SqlValidator.EnsureIsCharacterExpression(pattern); - SqlValidator.EnsureIsCharacterExpression(escape); - return new SqlLike(expression, pattern, escape, false); - } - - public static SqlLike Like(SqlExpression expression, SqlExpression pattern) - { - return Like(expression, pattern, null); - } - - public static SqlLike Like(SqlExpression expression, string pattern) - { - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - return Like(expression, new SqlLiteral(pattern), null); - } - - public static SqlLike Like(SqlExpression expression, string pattern, char escape) - { - SqlValidator.EnsureIsCharacterExpression(expression); - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - return Like(expression, new SqlLiteral(pattern), new SqlLiteral(escape)); - } - - public static SqlLike NotLike( - SqlExpression expression, SqlExpression pattern, SqlExpression escape) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - SqlValidator.EnsureIsCharacterExpression(expression); - SqlValidator.EnsureIsCharacterExpression(pattern); - SqlValidator.EnsureIsCharacterExpression(escape); - return new SqlLike(expression, pattern, escape, true); - } - - public static SqlLike NotLike(SqlExpression expression, SqlExpression pattern) - { - return NotLike(expression, pattern, null); - } - - public static SqlLike NotLike(SqlExpression expression, string pattern) - { - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - return NotLike(expression, new SqlLiteral(pattern), null); - } - - public static SqlLike NotLike(SqlExpression expression, string pattern, char escape) - { - SqlValidator.EnsureIsCharacterExpression(expression); - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - return NotLike(expression, new SqlLiteral(pattern), new SqlLiteral(escape)); - } - - public static SqlBinary Overlaps(DateTime from1, TimeSpan span1, DateTime from2, TimeSpan span2) - { - return new SqlBinary(SqlNodeType.Overlaps, Row(from1, span1), Row(from2, span2)); - } - - public static SqlBinary Overlaps(DateTime from1, DateTime to1, DateTime from2, DateTime to2) - { - return new SqlBinary(SqlNodeType.Overlaps, Row(from1, to1), Row(from2, to2)); - } - - public static SqlBinary Overlaps(SqlExpression from1, SqlExpression toOrSpan1, SqlExpression from2, SqlExpression toOrSpan2) - { - ArgumentValidator.EnsureArgumentNotNull(from1, "from1"); - ArgumentValidator.EnsureArgumentNotNull(toOrSpan1, "toOrSpan1"); - ArgumentValidator.EnsureArgumentNotNull(from2, "from2"); - ArgumentValidator.EnsureArgumentNotNull(toOrSpan2, "toOrSpan2"); - return new SqlBinary(SqlNodeType.Overlaps, Row(from1, toOrSpan1), Row(from2, toOrSpan2)); - } - - public static SqlBinary Overlaps(SqlRow left, SqlRow right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.Overlaps, left, right); - } - - public static SqlBinary Overlaps(SqlSelect left, SqlRow right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.Overlaps, SubQuery(left), right); - } - - public static SqlBinary Overlaps(SqlRow left, SqlSelect right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.Overlaps, left, SubQuery(right)); - } - - public static SqlBinary Overlaps(SqlSelect left, SqlSelect right) - { - ArgumentValidator.EnsureArgumentNotNull(left, "left"); - ArgumentValidator.EnsureArgumentNotNull(right, "right"); - return new SqlBinary(SqlNodeType.Overlaps, left, right); - } - - public static SqlFunctionCall BinaryLength(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - var arguments = new Collection(); - arguments.Add(operand); - return new SqlFunctionCall(SqlFunctionType.BinaryLength, arguments); - } - - public static SqlFunctionCall CharLength(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - return new SqlFunctionCall(SqlFunctionType.CharLength, operand); - } - - public static SqlFunctionCall Position(SqlExpression pattern, SqlExpression source) - { - ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); - ArgumentValidator.EnsureArgumentNotNull(source, "source"); - SqlValidator.EnsureIsCharacterExpression(pattern); - SqlValidator.EnsureIsCharacterExpression(source); - var arguments = new Collection(); - arguments.Add(pattern); - arguments.Add(source); - return new SqlFunctionCall(SqlFunctionType.Position, arguments); - } - - public static SqlFunctionCall Replace(SqlExpression text, SqlExpression from, SqlExpression to) - { - ArgumentValidator.EnsureArgumentNotNull(text, "text"); - ArgumentValidator.EnsureArgumentNotNull(from, "from"); - ArgumentValidator.EnsureArgumentNotNull(to, "to"); - SqlValidator.EnsureIsCharacterExpression(text); - SqlValidator.EnsureIsCharacterExpression(from); - SqlValidator.EnsureIsCharacterExpression(to); - var arguments = new Collection(); - arguments.Add(text); - arguments.Add(from); - arguments.Add(to); - return new SqlFunctionCall(SqlFunctionType.Replace, arguments); - } - - public static SqlCollate Collate(SqlExpression operand, Collation collation) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsCharacterExpression(operand); - ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); - return new SqlCollate(operand, collation); - } - - - public static SqlFunctionCall PadLeft(SqlExpression operand, SqlExpression length) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(length, "length"); - return new SqlFunctionCall(SqlFunctionType.PadLeft, operand, length); - } - - public static SqlFunctionCall PadLeft(SqlExpression operand, SqlExpression length, SqlExpression padChar) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(length, "length"); - ArgumentValidator.EnsureArgumentNotNull(padChar, "padChar"); - return new SqlFunctionCall(SqlFunctionType.PadLeft, operand, length, padChar); - } - - public static SqlFunctionCall PadRight(SqlExpression operand, SqlExpression length) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(length, "length"); - return new SqlFunctionCall(SqlFunctionType.PadRight, operand, length); - } - - public static SqlFunctionCall PadRight(SqlExpression operand, SqlExpression length, SqlExpression padChar) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - ArgumentValidator.EnsureArgumentNotNull(length, "length"); - ArgumentValidator.EnsureArgumentNotNull(padChar, "padChar"); - return new SqlFunctionCall(SqlFunctionType.PadRight, operand, length, padChar); - } - - # endregion - - #region DataTable & Column - - public static SqlTableColumn TableColumn(SqlTable sqlTable) - { - ArgumentValidator.EnsureArgumentNotNull(sqlTable, "table"); - return new SqlTableColumn(sqlTable, string.Empty); - } - - public static SqlTableColumn TableColumn(SqlTable sqlTable, string name) - { - ArgumentValidator.EnsureArgumentNotNull(sqlTable, "table"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlTableColumn(sqlTable, name); - } - - public static SqlUserColumn Column(SqlExpression expression) - { - ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); - return new SqlUserColumn(expression); - } - - public static SqlColumnRef ColumnRef(SqlColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new SqlColumnRef(column); - } - - public static SqlColumnRef ColumnRef(SqlColumn column, string alias) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(alias, "alias"); - return new SqlColumnRef(column, alias); - } - - public static SqlColumnStub ColumnStub(SqlColumn column) - { - ArgumentValidator.EnsureArgumentNotNull(column, "column"); - return new SqlColumnStub(column); - } - - public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); - return new SqlFreeTextTable(dataTable, freeText, columnNames); - } - - public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, IList targetColumnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); - ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); - return new SqlFreeTextTable(dataTable, freeText, columnNames, targetColumnNames); - } - - public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, SqlExpression topN) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); - ArgumentValidator.EnsureArgumentNotNull(topN, "topN"); - return new SqlFreeTextTable(dataTable, freeText, columnNames, topN); - } - - public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, IList targetColumNames, SqlExpression topN) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); - ArgumentValidator.EnsureArgumentNotNull(targetColumNames, "targetColumNames"); - ArgumentValidator.EnsureArgumentNotNull(topN, "topN"); - return new SqlFreeTextTable(dataTable, freeText, columnNames, targetColumNames, topN); - } - - public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); - return new SqlContainsTable(dataTable, searchText, columnNames); - } - - public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, IList targetColumnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); - ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); - return new SqlContainsTable(dataTable, searchText, columnNames, targetColumnNames); - } - - public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, SqlExpression topN) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); - return new SqlContainsTable(dataTable, searchText, columnNames, topN); - } - - public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, IList targetColumnNames, SqlExpression topN) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); - ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); - return new SqlContainsTable(dataTable, searchText, columnNames, targetColumnNames, topN); - } - - public static SqlTableRef TableRef(DataTable dataTable) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - return new SqlTableRef(dataTable); - } - - public static SqlTableRef TableRef(DataTable dataTable, IEnumerable columnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); - return new SqlTableRef(dataTable, string.Empty, columnNames.ToArray()); - } - - public static SqlTableRef TableRef(DataTable dataTable, string name) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlTableRef(dataTable, name); - } - - public static SqlTableRef TableRef(DataTable dataTable, string name, IEnumerable columnNames) - { - ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); - return new SqlTableRef(dataTable, name, columnNames.ToArray()); - } - - public static SqlQueryRef QueryRef(ISqlQueryExpression query) - { - ArgumentValidator.EnsureArgumentNotNull(query, "query"); - return new SqlQueryRef(query); - } - - public static SqlQueryRef QueryRef(ISqlQueryExpression query, string alias) - { - ArgumentValidator.EnsureArgumentNotNull(query, "query"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(alias, "alias"); - return new SqlQueryRef(query, alias); - } - - #endregion - - #region Unary - - public static SqlUnary BitNot(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsArithmeticExpression(operand); - return Unary(SqlNodeType.BitNot, operand); - } - - public static SqlUnary Negate(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsArithmeticExpression(operand); - return Unary(SqlNodeType.Negate, operand); - } - - public static SqlUnary Not(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - SqlValidator.EnsureIsBooleanExpression(operand); - return Unary(SqlNodeType.Not, operand); - } - - public static SqlUnary IsNull(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.IsNull, operand); - } - - public static SqlUnary IsNotNull(SqlExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.IsNotNull, operand); - } - - public static SqlUnary Unique(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.Unique, SubQuery(operand)); - } - - public static SqlUnary Exists(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return new SqlUnary(SqlNodeType.Exists, SubQuery(operand)); - } - - public static SqlUnary All(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.All, SubQuery(operand)); - } - - public static SqlUnary Any(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.Any, SubQuery(operand)); - } - - public static SqlUnary Some(ISqlQueryExpression operand) - { - ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); - return Unary(SqlNodeType.Some, SubQuery(operand)); - } - - internal static SqlUnary Unary(SqlNodeType nodeType, SqlExpression operand) - { - return new SqlUnary(nodeType, operand); - } - - #endregion - - #region Variable - - public static SqlVariable Variable(string name, SqlValueType type) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlVariable(name, type); - } - - public static SqlVariable Variable(string name, SqlType type) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlVariable(name, new SqlValueType(type)); - } - - public static SqlVariable Variable(string name, SqlType type, int size) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlVariable(name, new SqlValueType(type, size)); - } - - public static SqlVariable Variable(string name, SqlType type, short precision, short scale) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); - return new SqlVariable(name, new SqlValueType(type, precision, scale)); - } - - public static SqlVariable Variable(string name, SqlType type, short precision) - { - return Variable(name, type, precision, 0); - } - - #endregion - - #region Hints - - public static SqlJoinHint JoinHint(SqlJoinMethod method, SqlTable table) - { - ArgumentValidator.EnsureArgumentNotNull(table, "table"); - return new SqlJoinHint(method, table); - } - - public static SqlForceJoinOrderHint ForceJoinOrderHint() - { - return new SqlForceJoinOrderHint(); - } - - public static SqlForceJoinOrderHint ForceJoinOrderHint(params SqlTable[] sqlTables) - { - ArgumentValidator.EnsureArgumentNotNull(sqlTables, "sqlTables"); - return new SqlForceJoinOrderHint(sqlTables); - } - - public static SqlFastFirstRowsHint FastFirstRowsHint(int amount) - { - ArgumentValidator.EnsureArgumentIsGreaterThan(amount, 0, "amount"); - return new SqlFastFirstRowsHint(amount); - } - - public static SqlNativeHint NativeHint(string hintText) - { - ArgumentValidator.EnsureArgumentNotNullOrEmpty(hintText, "hintText"); - return new SqlNativeHint(hintText); - } - - #endregion - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Reflection; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Model; +using System.Linq; + +namespace Xtensive.Sql +{ + /// + /// A factory for SQL DML operations. + /// + public static class SqlDml + { + public static readonly SqlDefaultValue DefaultValue = new SqlDefaultValue(); + public static readonly SqlNull Null = new SqlNull(); + public static readonly SqlBreak Break = new SqlBreak(); + public static readonly SqlContinue Continue = new SqlContinue(); + public static readonly SqlNative Asterisk = Native("*"); + + #region Aggregates + + public static SqlAggregate Count() + { + return Count(Asterisk); + } + + public static SqlAggregate Count(SqlExpression expression) + { + return Count(expression, false); + } + + public static SqlAggregate Count(SqlExpression expression, bool distinct) + { + return new SqlAggregate(SqlNodeType.Count, expression, distinct); + } + + public static SqlAggregate Avg(SqlExpression expression) + { + return Avg(expression, false); + } + + public static SqlAggregate Avg(SqlExpression expression, bool distinct) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlAggregate(SqlNodeType.Avg, expression, distinct); + } + + public static SqlAggregate Sum(SqlExpression expression) + { + return Sum(expression, false); + } + + public static SqlAggregate Sum(SqlExpression expression, bool distinct) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlAggregate(SqlNodeType.Sum, expression, distinct); + } + + public static SqlAggregate Min(SqlExpression expression) + { + return Min(expression, false); + } + + public static SqlAggregate Min(SqlExpression expression, bool distinct) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlAggregate(SqlNodeType.Min, expression, distinct); + } + + public static SqlAggregate Max(SqlExpression expression) + { + return Max(expression, false); + } + + public static SqlAggregate Max(SqlExpression expression, bool distinct) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlAggregate(SqlNodeType.Max, expression, distinct); + } + + #endregion + + #region Arithmetic + + public static SqlBinary Add(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.Add, left, right); + } + + public static SqlBinary Subtract(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.Subtract, left, right); + } + + public static SqlBinary Multiply(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.Multiply, left, right); + } + + public static SqlBinary Divide(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.Divide, left, right); + } + + public static SqlBinary Modulo(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.Modulo, left, right); + } + + #endregion + + #region Array + + public static SqlArray Array(IEnumerable values) + { + var valueList = values.ToList(); + if (valueList.Count==0) + return Array(ArrayUtils.EmptyArray); + var itemType = valueList[0].GetType(); + foreach (var t in values.Select(value => value.GetType())) { + if (!itemType.IsAssignableFrom(t)) + throw new ArgumentException(Strings.ExTypesOfValuesAreDifferent); + } + var resultType = typeof (SqlArray<>).MakeGenericType(itemType); + var result = Activator.CreateInstance( + resultType, + BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, + null, new object[] {valueList}, null); + return (SqlArray) result; + } + + public static SqlArray Array(params bool[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params char[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params sbyte[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params byte[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params short[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params ushort[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params int[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params uint[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params long[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params ulong[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params float[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params double[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params decimal[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params string[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params DateTime[] value) + { + return new SqlArray(value); + } + + public static SqlArray Array(params TimeSpan[] value) + { + return new SqlArray(value); + } + + #endregion + + #region Binary + + public static SqlBinary BitAnd(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.BitAnd, left, right); + } + + public static SqlBinary BitOr(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.BitOr, left, right); + } + + public static SqlBinary BitXor(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + return Binary(SqlNodeType.BitXor, left, right); + } + + public static SqlBinary And(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsBooleanExpression(left); + SqlValidator.EnsureIsBooleanExpression(right); + return Binary(SqlNodeType.And, left, right); + } + + public static SqlBinary Or(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsBooleanExpression(left); + SqlValidator.EnsureIsBooleanExpression(right); + return Binary(SqlNodeType.Or, left, right); + } + + public static SqlQueryExpression Except(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Except(left, right, false); + } + + public static SqlQueryExpression ExceptAll(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Except(left, right, true); + } + + private static SqlQueryExpression Except(ISqlQueryExpression left, ISqlQueryExpression right, bool all) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlQueryExpression(SqlNodeType.Except, left, right, all); + } + + public static SqlQueryExpression Intersect(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Intersect(left, right, false); + } + + public static SqlQueryExpression IntersectAll(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Intersect(left, right, true); + } + + private static SqlQueryExpression Intersect(ISqlQueryExpression left, ISqlQueryExpression right, bool all) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlQueryExpression(SqlNodeType.Intersect, left, right, all); + } + + public static SqlQueryExpression Union(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Union(left, right, false); + } + + public static SqlQueryExpression UnionAll(ISqlQueryExpression left, ISqlQueryExpression right) + { + return Union(left, right, true); + } + + private static SqlQueryExpression Union(ISqlQueryExpression left, ISqlQueryExpression right, bool all) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlQueryExpression(SqlNodeType.Union, left, right, all); + } + + public static SqlBinary In(SqlExpression left, ISqlQueryExpression right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.In, left, SubQuery(right)); + } + + public static SqlBinary In(SqlExpression left, SqlRow right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.In, left, right); + } + + public static SqlBinary In(SqlExpression left, SqlArray right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.In, left, right); + } + + public static SqlBinary NotIn(SqlExpression left, ISqlQueryExpression right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.NotIn, left, SubQuery(right)); + } + + public static SqlBinary NotIn(SqlExpression left, SqlRow right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.NotIn, left, right); + } + + public static SqlBinary NotIn(SqlExpression left, SqlArray right) + { + SqlValidator.EnsureIsRowValueConstructor(left); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.NotIn, left, right); + } + + public static SqlBetween Between( + SqlExpression expression, SqlExpression leftBoundary, SqlExpression rightBoundary) + { + SqlValidator.EnsureIsRowValueConstructor(expression); + SqlValidator.EnsureIsRowValueConstructor(leftBoundary); + SqlValidator.EnsureIsRowValueConstructor(rightBoundary); + return + new SqlBetween( + SqlNodeType.Between, expression, leftBoundary, rightBoundary); + } + + public static SqlBetween NotBetween( + SqlExpression expression, SqlExpression leftBoundary, SqlExpression rightBoundary) + { + SqlValidator.EnsureIsRowValueConstructor(expression); + SqlValidator.EnsureIsRowValueConstructor(leftBoundary); + SqlValidator.EnsureIsRowValueConstructor(rightBoundary); + return + new SqlBetween( + SqlNodeType.NotBetween, expression, leftBoundary, rightBoundary); + } + + internal static SqlBinary Binary(SqlNodeType nodeType, SqlExpression left, SqlExpression right) + { + return new SqlBinary(nodeType, left, right); + } + + #endregion + + #region Cast + + public static SqlCast Cast(SqlExpression operand, SqlValueType type) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(type, "type"); + return new SqlCast(operand, type); + } + + public static SqlCast Cast(SqlExpression operand, SqlType type) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCast(operand, new SqlValueType(type)); + } + + public static SqlCast Cast(SqlExpression operand, SqlType type, int size) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCast(operand, new SqlValueType(type, size)); + } + + public static SqlCast Cast(SqlExpression operand, SqlType type, short precision, short scale) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCast(operand, new SqlValueType(type, precision, scale)); + } + + public static SqlCast Cast(SqlExpression operand, SqlType type, short precision) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlCast(operand, new SqlValueType(type, precision, 0)); + } + + #endregion + + #region Comparison + + public static SqlBinary Equals(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.Equals, left, right); + } + + public static SqlBinary NotEquals(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.NotEquals, left, right); + } + + public static SqlBinary GreaterThan(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.GreaterThan, left, right); + } + + public static SqlBinary LessThan(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.LessThan, left, right); + } + + public static SqlBinary GreaterThanOrEquals(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.GreaterThanOrEquals, left, right); + } + + public static SqlBinary LessThanOrEquals(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return Binary(SqlNodeType.LessThanOrEquals, left, right); + } + + #endregion + + # region DateTime functions + + public static SqlFunctionCall CurrentDate() + { + return new SqlFunctionCall(SqlFunctionType.CurrentDate); + } + + /* + public static SqlFunctionCall CurrentTime() + { + return new SqlFunctionCall(SqlFunctionType.CurrentTime); + } + + public static SqlFunctionCall CurrentTime(uint precision) + { + return new SqlFunctionCall(SqlFunctionType.CurrentTime, Literal(precision)); + } + + public static SqlFunctionCall CurrentTime(SqlExpression precision) + { + SqlValidator.EnsureIsArithmeticExpression(precision); + return new SqlFunctionCall(SqlFunctionType.CurrentTime, precision); + } + */ + + public static SqlFunctionCall CurrentTimeStamp() + { + return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp); + } + + public static SqlFunctionCall CurrentTimeStamp(uint precision) + { + return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp, Literal(precision)); + } + + public static SqlFunctionCall CurrentTimeStamp(SqlExpression precision) + { + SqlValidator.EnsureIsArithmeticExpression(precision); + return new SqlFunctionCall(SqlFunctionType.CurrentTimeStamp, precision); + } + + public static SqlExtract Extract(SqlDateTimePart part, SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsArithmeticExpression(operand); + if (part==SqlDateTimePart.Nothing) + throw new ArgumentException(); + return new SqlExtract(part, operand); + } + + public static SqlExtract Extract(SqlIntervalPart part, SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsArithmeticExpression(operand); + if (part==SqlIntervalPart.Nothing) + throw new ArgumentException(); + return new SqlExtract(part, operand); + } + + public static SqlFunctionCall DateTimeConstruct(SqlExpression year, SqlExpression month, SqlExpression day) + { + ArgumentValidator.EnsureArgumentNotNull(year, "year"); + ArgumentValidator.EnsureArgumentNotNull(month, "month"); + ArgumentValidator.EnsureArgumentNotNull(day, "day"); + SqlValidator.EnsureIsArithmeticExpression(year); + SqlValidator.EnsureIsArithmeticExpression(month); + SqlValidator.EnsureIsArithmeticExpression(day); + return new SqlFunctionCall(SqlFunctionType.DateTimeConstruct, year, month, day); + } + + public static SqlBinary DateTimePlusInterval(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimePlusInterval, left, right); + } + + public static SqlBinary DateTimeMinusInterval(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimeMinusInterval, left, right); + } + + public static SqlBinary DateTimeMinusDateTime(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimeMinusDateTime, left, right); + } + + public static SqlFunctionCall DateTimeAddYears(SqlExpression source, SqlExpression years) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNull(years, "years"); + return new SqlFunctionCall(SqlFunctionType.DateTimeAddYears, source, years); + } + + public static SqlFunctionCall DateTimeAddMonths(SqlExpression source, SqlExpression months) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNull(months, "months"); + return new SqlFunctionCall(SqlFunctionType.DateTimeAddMonths, source, months); + } + + public static SqlFunctionCall DateTimeToStringIso(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlFunctionCall(SqlFunctionType.DateTimeToStringIso, expression); + } + + public static SqlFunctionCall DateTimeTruncate(SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + return new SqlFunctionCall(SqlFunctionType.DateTimeTruncate, source); + } + + public static SqlFunctionCall IntervalConstruct(SqlExpression nanoseconds) + { + ArgumentValidator.EnsureArgumentNotNull(nanoseconds, "nanoseconds"); + return new SqlFunctionCall(SqlFunctionType.IntervalConstruct, nanoseconds); + } + + public static SqlFunctionCall IntervalToMilliseconds(SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + return new SqlFunctionCall(SqlFunctionType.IntervalToMilliseconds, source); + } + + public static SqlFunctionCall IntervalToNanoseconds(SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + return new SqlFunctionCall(SqlFunctionType.IntervalToNanoseconds, source); + } + + public static SqlFunctionCall IntervalAbs(SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + return new SqlFunctionCall(SqlFunctionType.IntervalAbs, source); + } + + public static SqlFunctionCall IntervalNegate(SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + return new SqlFunctionCall(SqlFunctionType.IntervalNegate, source); + } + + #endregion + + # region DateTimeOffset functions + + public static SqlFunctionCall CurrentDateTimeOffset() + { + return new SqlFunctionCall(SqlFunctionType.CurrentDateTimeOffset); + } + + public static SqlExtract Extract(SqlDateTimeOffsetPart part, SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsArithmeticExpression(operand); + if (part==SqlDateTimeOffsetPart.Nothing) + throw new ArgumentException(); + return new SqlExtract(part, operand); + } + + public static SqlFunctionCall DateTimeOffsetConstruct(SqlExpression dateTime, SqlExpression offset) + { + ArgumentValidator.EnsureArgumentNotNull(dateTime, "dateTime"); + ArgumentValidator.EnsureArgumentNotNull(offset, "offset"); + SqlValidator.EnsureIsArithmeticExpression(offset); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetConstruct, dateTime, offset); + } + + public static SqlBinary DateTimeOffsetPlusInterval(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimeOffsetPlusInterval, left, right); + } + + public static SqlBinary DateTimeOffsetMinusInterval(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimeOffsetMinusInterval, left, right); + } + + public static SqlBinary DateTimeOffsetMinusDateTimeOffset(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.DateTimeOffsetMinusDateTimeOffset, left, right); + } + + public static SqlFunctionCall DateTimeOffsetAddYears(SqlExpression source, SqlExpression years) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNull(years, "years"); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetAddYears, source, years); + } + + public static SqlFunctionCall DateTimeOffsetAddMonths(SqlExpression source, SqlExpression months) + { + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + ArgumentValidator.EnsureArgumentNotNull(months, "months"); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetAddMonths, source, months); + } + + public static SqlFunctionCall DateTimeOffsetTimeOfDay(SqlExpression dateTimeOffset) + { + ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetTimeOfDay, dateTimeOffset); + } + + public static SqlFunctionCall DateTimeOffsetToLocalTime(SqlExpression dateTimeOffset) + { + ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetToLocalTime, dateTimeOffset); + } + + public static SqlFunctionCall DateTimeOffsetToUtcTime(SqlExpression dateTimeOffset) + { + ArgumentValidator.EnsureArgumentNotNull(dateTimeOffset, "dateTimeOffset"); + return new SqlFunctionCall(SqlFunctionType.DateTimeOffsetToUtcTime, dateTimeOffset); + } + + public static SqlFunctionCall DateTimeToDateTimeOffset(SqlExpression dateTime) + { + ArgumentValidator.EnsureArgumentNotNull(dateTime, "dateTime"); + return new SqlFunctionCall(SqlFunctionType.DateTimeToDateTimeOffset, dateTime); + } + + #endregion + + #region FunctionCall + + public static SqlUserFunctionCall FunctionCall(string name, IEnumerable expressions) + { + SqlValidator.EnsureAreSqlRowArguments(expressions); + return new SqlUserFunctionCall(name, expressions); + } + + public static SqlUserFunctionCall FunctionCall(string name, params SqlExpression[] expressions) + { + Collection collection = new Collection(); + for (int i = 0, l = expressions.Length; i()); + } + + public static SqlFunctionCall CurrentUser() + { + return new SqlFunctionCall(SqlFunctionType.CurrentUser); + } + + public static SqlFunctionCall SessionUser() + { + return new SqlFunctionCall(SqlFunctionType.SessionUser); + } + + public static SqlFunctionCall SystemUser() + { + return new SqlFunctionCall(SqlFunctionType.SystemUser); + } + + public static SqlFunctionCall User() + { + return new SqlFunctionCall(SqlFunctionType.User); + } + + public static SqlFunctionCall NullIf(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + //SqlCase c = new SqlCase(null); + //c[left==right] = Null; + //c.Else = left; + //return c; + return new SqlFunctionCall(SqlFunctionType.NullIf, left, right); + } + + public static SqlFunctionCall Coalesce(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(left); + SqlValidator.EnsureIsArithmeticExpression(right); + //SqlCase c = new SqlCase(null); + //c[IsNotNull(left)] = left; + //c.Else = right; + //return c; + return new SqlFunctionCall(SqlFunctionType.Coalesce, left, right); + } + + public static SqlFunctionCall Coalesce( + SqlExpression left, SqlExpression right, params SqlExpression[] values) + { + //if (values!=null && values.Length>0) { + // SqlExpression[] v = null; + // if (values.Length>1) { + // v = new SqlExpression[values.Length-1]; + // for (int i = 1, l = values.Length; i leftColumns, IReadOnlyList rightColumns) + { + return Join(joinType, left, right, leftColumns, rightColumns, null); + } + + public static SqlJoinedTable Join(SqlJoinType joinType, SqlTable left, SqlTable right, SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + if (!expression.IsNullReference() && (joinType == SqlJoinType.CrossApply || joinType == SqlJoinType.LeftOuterApply)) + throw new ArgumentException(Strings.ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply, "expression"); + return new SqlJoinedTable(new SqlJoinExpression(joinType, left, right, expression)); + } + + public static SqlJoinedTable Join(SqlJoinType joinType, SqlTable left, SqlTable right, + IReadOnlyList leftColumns, IReadOnlyList rightColumns, SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + if (!expression.IsNullReference() && (joinType == SqlJoinType.CrossApply || joinType == SqlJoinType.LeftOuterApply)) + throw new ArgumentException(Strings.ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply, "expression"); + return new SqlJoinedTable(new SqlJoinExpression(joinType, left, right, expression), leftColumns, rightColumns); + } + + public static SqlJoinedTable Join(SqlTable left, SqlTable right, params SqlColumn[] columns) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlJoinedTable(new SqlJoinExpression(SqlJoinType.UsingJoin, left, right, Row(columns))); + } + + #endregion + + #region Literal + + public static SqlLiteral Literal(bool value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(char value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(sbyte value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(byte value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(short value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(ushort value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(int value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(uint value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(long value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(ulong value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(float value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(double value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(decimal value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(string value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(DateTime value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(TimeSpan value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(byte[] value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(Guid value) + { + return new SqlLiteral(value); + } + + public static SqlLiteral Literal(object value) + { + var valueType = value.GetType(); + var resultType = typeof (SqlLiteral<>).MakeGenericType(valueType); + var result = Activator.CreateInstance( + resultType, + BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, + null, new[] {value}, null); + return (SqlLiteral) result; + } + + public static SqlExpression LiteralOrContainer(object value) + { + var valueType = value.GetType(); + return SqlValidator.IsLiteralTypeSupported(valueType) + ? (SqlExpression) Literal(value) + : Container(value); + } + + #endregion + + # region Match + + public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, bool unique, SqlMatchType matchType) + { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + ArgumentValidator.EnsureArgumentNotNull(query, "query"); + return new SqlMatch(value, SubQuery(query), unique, matchType); + } + + public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, bool unique) + { + return Match(value, query, unique, SqlMatchType.None); + } + + public static SqlMatch Match(SqlRow value, ISqlQueryExpression query, SqlMatchType matchType) + { + return Match(value, query, false, matchType); + } + + public static SqlMatch Match(SqlRow value, ISqlQueryExpression query) + { + return Match(value, query, false, SqlMatchType.None); + } + + public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, bool unique, SqlMatchType matchType) + { + ArgumentValidator.EnsureArgumentNotNull(value, "value"); + ArgumentValidator.EnsureArgumentNotNull(query, "query"); + return new SqlMatch(SubQuery(value), SubQuery(query), unique, matchType); + } + + public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, bool unique) + { + return Match(value, query, unique, SqlMatchType.None); + } + + public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query, SqlMatchType matchType) + { + return Match(value, query, false, matchType); + } + + public static SqlMatch Match(ISqlQueryExpression value, ISqlQueryExpression query) + { + return Match(value, query, false, SqlMatchType.None); + } + + # endregion + + # region Math functions + + public static SqlFunctionCall Abs(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Abs, argument); + } + + public static SqlFunctionCall Acos(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Acos, argument); + } + + public static SqlFunctionCall Asin(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Asin, argument); + } + + public static SqlFunctionCall Atan(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Atan, argument); + } + + public static SqlFunctionCall Atan2(SqlExpression argument1, SqlExpression argument2) + { + ArgumentValidator.EnsureArgumentNotNull(argument1, "argument1"); + ArgumentValidator.EnsureArgumentNotNull(argument2, "argument2"); + SqlValidator.EnsureIsArithmeticExpression(argument1); + SqlValidator.EnsureIsArithmeticExpression(argument2); + return new SqlFunctionCall(SqlFunctionType.Atan2, argument1, argument2); + } + + public static SqlFunctionCall Ceiling(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Ceiling, argument); + } + + public static SqlFunctionCall Cos(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Cos, argument); + } + + public static SqlFunctionCall Cot(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Cot, argument); + } + + public static SqlFunctionCall Degrees(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Degrees, argument); + } + + public static SqlFunctionCall Exp(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Exp, argument); + } + + public static SqlFunctionCall Floor(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Floor, argument); + } + + public static SqlFunctionCall Log(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Log, argument); + } + + public static SqlFunctionCall Log10(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Log10, argument); + } + + public static SqlFunctionCall Pi() + { + return new SqlFunctionCall(SqlFunctionType.Pi); + } + + public static SqlFunctionCall Power(SqlExpression argument, SqlExpression power) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + ArgumentValidator.EnsureArgumentNotNull(power, "power"); + SqlValidator.EnsureIsArithmeticExpression(power); + return new SqlFunctionCall(SqlFunctionType.Power, argument, power); + } + + public static SqlFunctionCall Radians(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Radians, argument); + } + + public static SqlFunctionCall Rand(SqlExpression seed) + { + if (!seed.IsNullReference()) { + SqlValidator.EnsureIsArithmeticExpression(seed); + return new SqlFunctionCall(SqlFunctionType.Rand, seed); + } + else + return new SqlFunctionCall(SqlFunctionType.Rand, seed); + } + + public static SqlFunctionCall Rand() + { + return Rand(null); + } + + public static SqlFunctionCall Round(SqlExpression argument, SqlExpression length) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + ArgumentValidator.EnsureArgumentNotNull(length, "length"); + SqlValidator.EnsureIsArithmeticExpression(length); + return new SqlFunctionCall(SqlFunctionType.Round, argument, length); + } + + public static SqlFunctionCall Round(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Round, argument); + } + + public static SqlRound Round(SqlExpression argument, SqlExpression length, TypeCode type, MidpointRounding mode) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + if (type!=TypeCode.Decimal && type!=TypeCode.Double) + throw new ArgumentOutOfRangeException("type"); + return new SqlRound(argument, length, type, mode); + } + + public static SqlFunctionCall Truncate(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Truncate, argument); + } + + public static SqlFunctionCall Sign(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Sign, argument); + } + + public static SqlFunctionCall Sin(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Sin, argument); + } + + public static SqlFunctionCall Sqrt(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Sqrt, argument); + } + + public static SqlFunctionCall Square(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Square, argument); + } + + public static SqlFunctionCall Tan(SqlExpression argument) + { + ArgumentValidator.EnsureArgumentNotNull(argument, "argument"); + SqlValidator.EnsureIsArithmeticExpression(argument); + return new SqlFunctionCall(SqlFunctionType.Tan, argument); + } + + # endregion + + #region Misc + + public static SqlNative Native(string value) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(value, "value"); + return new SqlNative(value); + } + + public static SqlSubQuery SubQuery(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlSubQuery(operand); + } + + public static SqlCursor Cursor(string name) + { + return Cursor(name, null); + } + + public static SqlCursor Cursor(string name, ISqlQueryExpression query) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlCursor(name, query); + } + + public static SqlParameterRef ParameterRef(object parameter) + { + ArgumentValidator.EnsureArgumentNotNull(parameter, "parameter"); + return new SqlParameterRef(parameter); + } + + public static SqlParameterRef ParameterRef(string name) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlParameterRef(name); + } + + public static SqlCase Case(SqlExpression value) + { + return new SqlCase(value); + } + + public static SqlCase Case() + { + return Case(null); + } + + public static SqlNextValue NextValue(Sequence sequence) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + return new SqlNextValue(sequence); + } + + public static SqlNextValue NextValue(Sequence sequence, int increment) + { + ArgumentValidator.EnsureArgumentNotNull(sequence, "sequence"); + return new SqlNextValue(sequence, increment); + } + + public static SqlStatementBlock StatementBlock() + { + return new SqlStatementBlock(); + } + + public static SqlVariant Variant(object id, SqlExpression main, SqlExpression alternative) + { + ArgumentValidator.EnsureArgumentNotNull(id, "id"); + ArgumentValidator.EnsureArgumentNotNull(main, "main"); + ArgumentValidator.EnsureArgumentNotNull(alternative, "alternative"); + return new SqlVariant(id, main, alternative); + } + + public static SqlPlaceholder Placeholder(object id) + { + ArgumentValidator.EnsureArgumentNotNull(id, "id"); + return new SqlPlaceholder(id); + } + + public static SqlDynamicFilter DynamicFilter(object id) + { + ArgumentValidator.EnsureArgumentNotNull(id, "id"); + return new SqlDynamicFilter(id); + } + + public static SqlContainer Container(object value) + { + return new SqlContainer(value); + } + + public static SqlFunctionCall LastAutoGeneratedId() + { + return new SqlFunctionCall(SqlFunctionType.LastAutoGeneratedId); + } + + public static SqlRowNumber RowNumber() + { + return new SqlRowNumber(); + } + + #endregion + + #region OrderBy + + public static SqlOrder Order(SqlExpression expression) + { + return Order(expression, true); + } + + public static SqlOrder Order(SqlExpression expression, bool ascending) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlOrder(expression, ascending); + } + + public static SqlOrder Order(int position) + { + return Order(position, true); + } + + public static SqlOrder Order(int position, bool ascending) + { + if (position<=0) + throw new ArgumentOutOfRangeException( + "position", position, Strings.ExPositionValueShouldBeGreaterThanZero); + return new SqlOrder(position, ascending); + } + + #endregion + + #region Row + + public static SqlRow Row(IList expressions) + { + SqlValidator.EnsureAreSqlRowArguments(expressions); + return new SqlRow(expressions); + } + + public static SqlRow Row(params SqlExpression[] expressions) + { + Collection collection = new Collection(); + for (int i = 0, l = expressions.Length; i()); + } + + #endregion + + #region Statement + + public static SqlFragment Fragment(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlFragment(expression); + } + + public static SqlWhile While(SqlExpression condition) + { + ArgumentValidator.EnsureArgumentNotNull(condition, "condition"); + SqlValidator.EnsureIsBooleanExpression(condition); + return new SqlWhile(condition); + } + + public static SqlBatch Batch() + { + return new SqlBatch(); + } + + public static SqlAssignment Assign(SqlVariable left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(right); + return new SqlAssignment(left, right); + } + + public static SqlAssignment Assign(SqlParameterRef left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsArithmeticExpression(right); + return new SqlAssignment(left, right); + } + + public static SqlIf If(SqlExpression condition, SqlStatement ifTrue, SqlStatement ifFalse) + { + ArgumentValidator.EnsureArgumentNotNull(condition, "condition"); + SqlValidator.EnsureIsBooleanExpression(condition); + ArgumentValidator.EnsureArgumentNotNull(ifTrue, "ifTrue"); + return new SqlIf(condition, ifTrue, ifFalse); + } + + public static SqlIf If(SqlExpression condition, SqlStatement ifTrue) + { + return If(condition, ifTrue, null); + } + + public static SqlDelete Delete() + { + return new SqlDelete(); + } + + public static SqlDelete Delete(SqlTableRef table) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlDelete(table); + } + + public static SqlUpdate Update() + { + return new SqlUpdate(); + } + + public static SqlUpdate Update(SqlTableRef tableRef) + { + ArgumentValidator.EnsureArgumentNotNull(tableRef, "table"); + return new SqlUpdate(tableRef); + } + + public static SqlInsert Insert() + { + return new SqlInsert(); + } + + public static SqlInsert Insert(SqlTableRef tableRef) + { + ArgumentValidator.EnsureArgumentNotNull(tableRef, "table"); + return new SqlInsert(tableRef); + } + + public static SqlSelect Select() + { + return new SqlSelect(); + } + + public static SqlSelect Select(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + var result = new SqlSelect(); + result.Columns.Add(expression); + return result; + } + + public static SqlSelect Select(SqlTable table) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlSelect(table); + } + + #endregion + + # region String functions + + public static SqlConcat Concat(SqlExpression left, SqlExpression right) + { + return new SqlConcat(new [] {left, right}); + } + + public static SqlConcat Concat(params SqlExpression[] items) + { + ArgumentValidator.EnsureArgumentNotNull(items, "items"); + foreach (var item in items) + SqlValidator.EnsureIsCharacterExpression(item); + return new SqlConcat(items); + } + + /// + /// Concates underlying expression without any sign between. + /// + /// Left expression + /// Right expression + /// New expression. + public static SqlBinary RawConcat(SqlExpression left, SqlExpression right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + SqlValidator.EnsureIsCharacterExpression(left); + SqlValidator.EnsureIsCharacterExpression(right); + return new SqlBinary(SqlNodeType.RawConcat, left, right); + } + + public static SqlFunctionCall Substring(SqlExpression operand, int start) + { + return Substring(operand, start, null); + } + + public static SqlFunctionCall Substring(SqlExpression operand, int start, int? length) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + if (length<0) + throw new ArgumentException(Strings.ExLengthShouldBeNotNegativeValue, "length"); + var arguments = new Collection(); + arguments.Add(operand); + arguments.Add(new SqlLiteral(start)); + if (length.HasValue) + arguments.Add(new SqlLiteral(length.Value)); + return new SqlFunctionCall(SqlFunctionType.Substring, arguments); + } + + public static SqlFunctionCall Substring( + SqlExpression operand, SqlExpression start) + { + return Substring(operand, start, null); + } + + public static SqlFunctionCall Substring( + SqlExpression operand, SqlExpression start, SqlExpression length) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(start, "start"); + SqlValidator.EnsureIsCharacterExpression(operand); + SqlValidator.EnsureIsArithmeticExpression(start); + if (length != null) + SqlValidator.EnsureIsArithmeticExpression(length); + var arguments = new Collection(); + arguments.Add(operand); + arguments.Add(start); + if (length != null) + arguments.Add(length); + return new SqlFunctionCall(SqlFunctionType.Substring, arguments); + } + + public static SqlFunctionCall Upper(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + var arguments = new Collection(); + arguments.Add(operand); + return new SqlFunctionCall(SqlFunctionType.Upper, arguments); + } + + public static SqlFunctionCall Lower(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + var arguments = new Collection(); + arguments.Add(operand); + return new SqlFunctionCall(SqlFunctionType.Lower, arguments); + } + + public static SqlTrim Trim(SqlExpression operand, SqlTrimType trimType, string trimCharacters) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + ArgumentValidator.EnsureArgumentNotNull(trimCharacters, "trimCharacters"); + return new SqlTrim(operand, trimCharacters, trimType); + } + + public static SqlTrim Trim(SqlExpression operand, SqlTrimType trimType) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + return new SqlTrim(operand, null, trimType); + } + + public static SqlTrim Trim(SqlExpression operand) + { + return Trim(operand, SqlTrimType.Both); + } + + public static SqlLike Like( + SqlExpression expression, SqlExpression pattern, SqlExpression escape) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + SqlValidator.EnsureIsCharacterExpression(expression); + SqlValidator.EnsureIsCharacterExpression(pattern); + SqlValidator.EnsureIsCharacterExpression(escape); + return new SqlLike(expression, pattern, escape, false); + } + + public static SqlLike Like(SqlExpression expression, SqlExpression pattern) + { + return Like(expression, pattern, null); + } + + public static SqlLike Like(SqlExpression expression, string pattern) + { + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + return Like(expression, new SqlLiteral(pattern), null); + } + + public static SqlLike Like(SqlExpression expression, string pattern, char escape) + { + SqlValidator.EnsureIsCharacterExpression(expression); + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + return Like(expression, new SqlLiteral(pattern), new SqlLiteral(escape)); + } + + public static SqlLike NotLike( + SqlExpression expression, SqlExpression pattern, SqlExpression escape) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + SqlValidator.EnsureIsCharacterExpression(expression); + SqlValidator.EnsureIsCharacterExpression(pattern); + SqlValidator.EnsureIsCharacterExpression(escape); + return new SqlLike(expression, pattern, escape, true); + } + + public static SqlLike NotLike(SqlExpression expression, SqlExpression pattern) + { + return NotLike(expression, pattern, null); + } + + public static SqlLike NotLike(SqlExpression expression, string pattern) + { + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + return NotLike(expression, new SqlLiteral(pattern), null); + } + + public static SqlLike NotLike(SqlExpression expression, string pattern, char escape) + { + SqlValidator.EnsureIsCharacterExpression(expression); + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + return NotLike(expression, new SqlLiteral(pattern), new SqlLiteral(escape)); + } + + public static SqlBinary Overlaps(DateTime from1, TimeSpan span1, DateTime from2, TimeSpan span2) + { + return new SqlBinary(SqlNodeType.Overlaps, Row(from1, span1), Row(from2, span2)); + } + + public static SqlBinary Overlaps(DateTime from1, DateTime to1, DateTime from2, DateTime to2) + { + return new SqlBinary(SqlNodeType.Overlaps, Row(from1, to1), Row(from2, to2)); + } + + public static SqlBinary Overlaps(SqlExpression from1, SqlExpression toOrSpan1, SqlExpression from2, SqlExpression toOrSpan2) + { + ArgumentValidator.EnsureArgumentNotNull(from1, "from1"); + ArgumentValidator.EnsureArgumentNotNull(toOrSpan1, "toOrSpan1"); + ArgumentValidator.EnsureArgumentNotNull(from2, "from2"); + ArgumentValidator.EnsureArgumentNotNull(toOrSpan2, "toOrSpan2"); + return new SqlBinary(SqlNodeType.Overlaps, Row(from1, toOrSpan1), Row(from2, toOrSpan2)); + } + + public static SqlBinary Overlaps(SqlRow left, SqlRow right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.Overlaps, left, right); + } + + public static SqlBinary Overlaps(SqlSelect left, SqlRow right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.Overlaps, SubQuery(left), right); + } + + public static SqlBinary Overlaps(SqlRow left, SqlSelect right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.Overlaps, left, SubQuery(right)); + } + + public static SqlBinary Overlaps(SqlSelect left, SqlSelect right) + { + ArgumentValidator.EnsureArgumentNotNull(left, "left"); + ArgumentValidator.EnsureArgumentNotNull(right, "right"); + return new SqlBinary(SqlNodeType.Overlaps, left, right); + } + + public static SqlFunctionCall BinaryLength(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + var arguments = new Collection(); + arguments.Add(operand); + return new SqlFunctionCall(SqlFunctionType.BinaryLength, arguments); + } + + public static SqlFunctionCall CharLength(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + return new SqlFunctionCall(SqlFunctionType.CharLength, operand); + } + + public static SqlFunctionCall Position(SqlExpression pattern, SqlExpression source) + { + ArgumentValidator.EnsureArgumentNotNull(pattern, "pattern"); + ArgumentValidator.EnsureArgumentNotNull(source, "source"); + SqlValidator.EnsureIsCharacterExpression(pattern); + SqlValidator.EnsureIsCharacterExpression(source); + var arguments = new Collection(); + arguments.Add(pattern); + arguments.Add(source); + return new SqlFunctionCall(SqlFunctionType.Position, arguments); + } + + public static SqlFunctionCall Replace(SqlExpression text, SqlExpression from, SqlExpression to) + { + ArgumentValidator.EnsureArgumentNotNull(text, "text"); + ArgumentValidator.EnsureArgumentNotNull(from, "from"); + ArgumentValidator.EnsureArgumentNotNull(to, "to"); + SqlValidator.EnsureIsCharacterExpression(text); + SqlValidator.EnsureIsCharacterExpression(from); + SqlValidator.EnsureIsCharacterExpression(to); + var arguments = new Collection(); + arguments.Add(text); + arguments.Add(from); + arguments.Add(to); + return new SqlFunctionCall(SqlFunctionType.Replace, arguments); + } + + public static SqlCollate Collate(SqlExpression operand, Collation collation) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsCharacterExpression(operand); + ArgumentValidator.EnsureArgumentNotNull(collation, "collation"); + return new SqlCollate(operand, collation); + } + + + public static SqlFunctionCall PadLeft(SqlExpression operand, SqlExpression length) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(length, "length"); + return new SqlFunctionCall(SqlFunctionType.PadLeft, operand, length); + } + + public static SqlFunctionCall PadLeft(SqlExpression operand, SqlExpression length, SqlExpression padChar) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(length, "length"); + ArgumentValidator.EnsureArgumentNotNull(padChar, "padChar"); + return new SqlFunctionCall(SqlFunctionType.PadLeft, operand, length, padChar); + } + + public static SqlFunctionCall PadRight(SqlExpression operand, SqlExpression length) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(length, "length"); + return new SqlFunctionCall(SqlFunctionType.PadRight, operand, length); + } + + public static SqlFunctionCall PadRight(SqlExpression operand, SqlExpression length, SqlExpression padChar) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + ArgumentValidator.EnsureArgumentNotNull(length, "length"); + ArgumentValidator.EnsureArgumentNotNull(padChar, "padChar"); + return new SqlFunctionCall(SqlFunctionType.PadRight, operand, length, padChar); + } + + # endregion + + #region DataTable & Column + + public static SqlTableColumn TableColumn(SqlTable sqlTable) + { + ArgumentValidator.EnsureArgumentNotNull(sqlTable, "table"); + return new SqlTableColumn(sqlTable, string.Empty); + } + + public static SqlTableColumn TableColumn(SqlTable sqlTable, string name) + { + ArgumentValidator.EnsureArgumentNotNull(sqlTable, "table"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlTableColumn(sqlTable, name); + } + + public static SqlUserColumn Column(SqlExpression expression) + { + ArgumentValidator.EnsureArgumentNotNull(expression, "expression"); + return new SqlUserColumn(expression); + } + + public static SqlColumnRef ColumnRef(SqlColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new SqlColumnRef(column); + } + + public static SqlColumnRef ColumnRef(SqlColumn column, string alias) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(alias, "alias"); + return new SqlColumnRef(column, alias); + } + + public static SqlColumnStub ColumnStub(SqlColumn column) + { + ArgumentValidator.EnsureArgumentNotNull(column, "column"); + return new SqlColumnStub(column); + } + + public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); + return new SqlFreeTextTable(dataTable, freeText, columnNames); + } + + public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, IList targetColumnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); + ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); + return new SqlFreeTextTable(dataTable, freeText, columnNames, targetColumnNames); + } + + public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, SqlExpression topN) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); + ArgumentValidator.EnsureArgumentNotNull(topN, "topN"); + return new SqlFreeTextTable(dataTable, freeText, columnNames, topN); + } + + public static SqlFreeTextTable FreeTextTable(DataTable dataTable, SqlExpression freeText, IList columnNames, IList targetColumNames, SqlExpression topN) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(freeText, "freeText"); + ArgumentValidator.EnsureArgumentNotNull(targetColumNames, "targetColumNames"); + ArgumentValidator.EnsureArgumentNotNull(topN, "topN"); + return new SqlFreeTextTable(dataTable, freeText, columnNames, targetColumNames, topN); + } + + public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); + return new SqlContainsTable(dataTable, searchText, columnNames); + } + + public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, IList targetColumnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); + ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); + return new SqlContainsTable(dataTable, searchText, columnNames, targetColumnNames); + } + + public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, SqlExpression topN) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); + return new SqlContainsTable(dataTable, searchText, columnNames, topN); + } + + public static SqlContainsTable ContainsTable(DataTable dataTable, SqlExpression searchText, IList columnNames, IList targetColumnNames, SqlExpression topN) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(searchText, "searchText"); + ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); + return new SqlContainsTable(dataTable, searchText, columnNames, targetColumnNames, topN); + } + + public static SqlTableRef TableRef(DataTable dataTable) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + return new SqlTableRef(dataTable); + } + + public static SqlTableRef TableRef(DataTable dataTable, IEnumerable columnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); + return new SqlTableRef(dataTable, string.Empty, columnNames.ToArray()); + } + + public static SqlTableRef TableRef(DataTable dataTable, string name) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlTableRef(dataTable, name); + } + + public static SqlTableRef TableRef(DataTable dataTable, string name, IEnumerable columnNames) + { + ArgumentValidator.EnsureArgumentNotNull(dataTable, "dataTable"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + ArgumentValidator.EnsureArgumentNotNull(columnNames, "columnNames"); + return new SqlTableRef(dataTable, name, columnNames.ToArray()); + } + + public static SqlQueryRef QueryRef(ISqlQueryExpression query) + { + ArgumentValidator.EnsureArgumentNotNull(query, "query"); + return new SqlQueryRef(query); + } + + public static SqlQueryRef QueryRef(ISqlQueryExpression query, string alias) + { + ArgumentValidator.EnsureArgumentNotNull(query, "query"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(alias, "alias"); + return new SqlQueryRef(query, alias); + } + + #endregion + + #region Unary + + public static SqlUnary BitNot(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsArithmeticExpression(operand); + return Unary(SqlNodeType.BitNot, operand); + } + + public static SqlUnary Negate(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsArithmeticExpression(operand); + return Unary(SqlNodeType.Negate, operand); + } + + public static SqlUnary Not(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + SqlValidator.EnsureIsBooleanExpression(operand); + return Unary(SqlNodeType.Not, operand); + } + + public static SqlUnary IsNull(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.IsNull, operand); + } + + public static SqlUnary IsNotNull(SqlExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.IsNotNull, operand); + } + + public static SqlUnary Unique(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.Unique, SubQuery(operand)); + } + + public static SqlUnary Exists(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return new SqlUnary(SqlNodeType.Exists, SubQuery(operand)); + } + + public static SqlUnary All(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.All, SubQuery(operand)); + } + + public static SqlUnary Any(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.Any, SubQuery(operand)); + } + + public static SqlUnary Some(ISqlQueryExpression operand) + { + ArgumentValidator.EnsureArgumentNotNull(operand, "operand"); + return Unary(SqlNodeType.Some, SubQuery(operand)); + } + + internal static SqlUnary Unary(SqlNodeType nodeType, SqlExpression operand) + { + return new SqlUnary(nodeType, operand); + } + + #endregion + + #region Variable + + public static SqlVariable Variable(string name, SqlValueType type) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlVariable(name, type); + } + + public static SqlVariable Variable(string name, SqlType type) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlVariable(name, new SqlValueType(type)); + } + + public static SqlVariable Variable(string name, SqlType type, int size) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlVariable(name, new SqlValueType(type, size)); + } + + public static SqlVariable Variable(string name, SqlType type, short precision, short scale) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name"); + return new SqlVariable(name, new SqlValueType(type, precision, scale)); + } + + public static SqlVariable Variable(string name, SqlType type, short precision) + { + return Variable(name, type, precision, 0); + } + + #endregion + + #region Hints + + public static SqlJoinHint JoinHint(SqlJoinMethod method, SqlTable table) + { + ArgumentValidator.EnsureArgumentNotNull(table, "table"); + return new SqlJoinHint(method, table); + } + + public static SqlForceJoinOrderHint ForceJoinOrderHint() + { + return new SqlForceJoinOrderHint(); + } + + public static SqlForceJoinOrderHint ForceJoinOrderHint(params SqlTable[] sqlTables) + { + ArgumentValidator.EnsureArgumentNotNull(sqlTables, "sqlTables"); + return new SqlForceJoinOrderHint(sqlTables); + } + + public static SqlFastFirstRowsHint FastFirstRowsHint(int amount) + { + ArgumentValidator.EnsureArgumentIsGreaterThan(amount, 0, "amount"); + return new SqlFastFirstRowsHint(amount); + } + + public static SqlNativeHint NativeHint(string hintText) + { + ArgumentValidator.EnsureArgumentNotNullOrEmpty(hintText, "hintText"); + return new SqlNativeHint(hintText); + } + + #endregion + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDriver.cs b/Orm/Xtensive.Orm/Sql/SqlDriver.cs index b489ab3e73..667941d42c 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDriver.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDriver.cs @@ -1,385 +1,385 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Compiler; -using Xtensive.Sql.Info; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql -{ - /// - /// Declares a base functionality of any . - /// - public abstract class SqlDriver - { - private SqlDriverFactory origin; - private ConnectionInfo originConnectionInfo; - - /// - /// Gets an instance that provides the most essential information about underlying RDBMS. - /// - public CoreServerInfo CoreServerInfo { get; private set; } - - /// - /// Gets an instance that provides complete information about underlying RDBMS. - /// - /// - public ServerInfo ServerInfo { get; private set; } - - /// - /// Gets the type mappings. - /// - public TypeMappingRegistry TypeMappings { get; private set; } - - /// - /// Gets the . - /// - public SqlTranslator Translator { get; private set; } - - /// - /// Gets connection string for the specified . - /// - /// to convert. - /// Connection string. - public string GetConnectionString(ConnectionInfo connectionInfo) - { - return origin.GetConnectionString(connectionInfo); - } - - /// - /// Compiles the specified statement into SQL command representation. - /// - /// The Sql.Dom statement. - /// Result of compilation. - public SqlCompilationResult Compile(ISqlCompileUnit statement) - { - ArgumentValidator.EnsureArgumentNotNull(statement, "statement"); - return CreateCompiler().Compile(statement, new SqlCompilerConfiguration()); - } - - /// - /// Compiles the specified statement into SQL command representation. - /// - /// The Sql.Dom statement. - /// The options of compilation. - /// Result of compilation. - public SqlCompilationResult Compile(ISqlCompileUnit statement, SqlCompilerConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(statement, "statement"); - ArgumentValidator.EnsureArgumentNotNull(configuration, "options"); - ValidateCompilerConfiguration(configuration); - return CreateCompiler().Compile(statement, configuration); - } - - /// - /// Gets for the specified . - /// - /// to use. - /// for the specified . - public DefaultSchemaInfo GetDefaultSchema(SqlConnection connection) - { - ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); - if (connection.Driver!=this) - throw new ArgumentException(Strings.ExSpecifiedConnectionDoesNotBelongToThisDriver); - - return origin.GetDefaultSchema(connection.UnderlyingConnection, connection.ActiveTransaction); - } - - /// - /// Extracts catalogs/schemas according to the specified . - /// - /// Extraction tasks. - /// Connection to use. - /// Extracted catalogs. - public SqlExtractionResult Extract(SqlConnection connection, IEnumerable tasks) - { - ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); - ArgumentValidator.EnsureArgumentNotNull(tasks, "tasks"); - - if (connection.Driver!=this) - throw new ArgumentException(Strings.ExSpecifiedConnectionDoesNotBelongToThisDriver); - - var taskGroups = tasks - .GroupBy(t => t.Catalog) - .ToDictionary(g => g.Key, g => g.ToList()); - - var result = new SqlExtractionResult(); - - foreach (var taskGroup in taskGroups) { - var catalogName = taskGroup.Key; - var tasksForCatalog = taskGroup.Value; - - if (tasksForCatalog.All(t => !t.AllSchemas)) { - // extracting all the schemes we need - var schemasToExtract = tasksForCatalog.Select(t => t.Schema).ToArray(); - var catalog = BuildExtractor(connection) - .ExtractSchemes(catalogName, schemasToExtract); - CleanSchemas(catalog, schemasToExtract); - result.Catalogs.Add(catalog); - } - else { - // Extracting whole catalog - var catalog = BuildExtractor(connection).ExtractCatalog(catalogName); - result.Catalogs.Add(catalog); - } - } - - return result; - } - - /// - /// Extracts all schemas from the database. - /// - /// The connection. - /// - /// that holds all schemas in the database. - /// - public Catalog ExtractCatalog(SqlConnection connection) - { - var defaultSchema = GetDefaultSchema(connection); - var task = new SqlExtractionTask(defaultSchema.Database); - return Extract(connection, new[] {task}).Catalogs.Single(); - } - - /// - /// Extracts the default schema from the database. - /// - /// The connection. - /// - /// that holds just the default schema in the database. - /// - public Schema ExtractDefaultSchema(SqlConnection connection) - { - var defaultSchema = GetDefaultSchema(connection); - return ExtractSchema(connection, defaultSchema.Database, defaultSchema.Schema); - } - - /// - /// Extracts the specified schema from the database. - /// - /// The connection. - /// - /// Extracted instance. - /// - public Schema ExtractSchema(SqlConnection connection, string schemaName) - { - var defaultSchema = GetDefaultSchema(connection); - return ExtractSchema(connection, defaultSchema.Database, schemaName); - } - - /// - /// Creates the connection using default connection information. - /// - public SqlConnection CreateConnection() - { - var result = DoCreateConnection(); - result.ConnectionInfo = originConnectionInfo; - return result; - } - - /// - /// Creates the connection using specified connection information. - /// - /// - /// - public SqlConnection CreateConnection(ConnectionInfo connectionInfo) - { - var result = DoCreateConnection(); - result.ConnectionInfo = connectionInfo; - return result; - } - - /// - /// Gets the type of the exception. - /// - /// The exception. - /// Type of the exception. - public virtual SqlExceptionType GetExceptionType(Exception exception) - { - return SqlExceptionType.Unknown; - } - - /// - /// Gets information about exception. - /// - /// The exception. - /// Information about exception. - public virtual SqlExceptionInfo GetExceptionInfo(Exception exception) - { - return SqlExceptionInfo.Create(GetExceptionType(exception)); - } - - /// - /// Creates the SQL DOM compiler. - /// - /// Created compiler. - protected abstract SqlCompiler CreateCompiler(); - - /// - /// Creates the SQL DOM translator. - /// - /// Created translator - protected abstract SqlTranslator CreateTranslator(); - - /// - /// Creates the extractor. - /// - /// Created extractor. - protected abstract Extractor CreateExtractor(); - - /// - /// Creates the type mapper. - /// - /// Created type mapper. - protected abstract TypeMapper CreateTypeMapper(); - - /// - /// Creates the server info provider. - /// - /// Created server info provider. - protected abstract ServerInfoProvider CreateServerInfoProvider(); - - /// - /// Creates connection. - /// - /// Created connection. - protected abstract SqlConnection DoCreateConnection(); - - protected virtual void RegisterCustomMappings(TypeMappingRegistryBuilder builder) - { - } - - protected virtual void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) - { - } - - #region Private / internal methods - - internal void Initialize(SqlDriverFactory creator, ConnectionInfo creatorConnectionInfo) - { - origin = creator; - originConnectionInfo = creatorConnectionInfo; - - var serverInfoProvider = CreateServerInfoProvider(); - ServerInfo = ServerInfo.Build(serverInfoProvider); - - var typeMapper = CreateTypeMapper(); - typeMapper.Initialize(); - TypeMappings = CreateTypeMappingCollection(typeMapper); - - Translator = CreateTranslator(); - Translator.Initialize(); - } - - private TypeMappingRegistry CreateTypeMappingCollection(TypeMapper mapper) - { - var builder = new TypeMappingRegistryBuilder(mapper); - RegisterStandardMappings(builder); - RegisterStandardReverseMappings(builder); - RegisterCustomMappings(builder); - RegisterCustomReverseMappings(builder); - return builder.Build(); - } - - private static void RegisterStandardMappings(TypeMappingRegistryBuilder builder) - { - var mapper = builder.Mapper; - - builder.Add(typeof (bool), mapper.ReadBoolean, mapper.BindBoolean, mapper.MapBoolean); - builder.Add(typeof (char), mapper.ReadChar, mapper.BindChar, mapper.MapChar); - builder.Add(typeof (string), mapper.ReadString, mapper.BindString, mapper.MapString); - builder.Add(typeof (byte), mapper.ReadByte, mapper.BindByte, mapper.MapByte); - builder.Add(typeof (sbyte), mapper.ReadSByte, mapper.BindSByte, mapper.MapSByte); - builder.Add(typeof (short), mapper.ReadShort, mapper.BindShort, mapper.MapShort); - builder.Add(typeof (ushort), mapper.ReadUShort, mapper.BindUShort, mapper.MapUShort); - builder.Add(typeof (int), mapper.ReadInt, mapper.BindInt, mapper.MapInt); - builder.Add(typeof (uint), mapper.ReadUInt, mapper.BindUInt, mapper.MapUInt); - builder.Add(typeof (long), mapper.ReadLong, mapper.BindLong, mapper.MapLong); - builder.Add(typeof (ulong), mapper.ReadULong, mapper.BindULong, mapper.MapULong); - builder.Add(typeof (float), mapper.ReadFloat, mapper.BindFloat, mapper.MapFloat); - builder.Add(typeof (double), mapper.ReadDouble, mapper.BindDouble, mapper.MapDouble); - builder.Add(typeof (decimal), mapper.ReadDecimal, mapper.BindDecimal, mapper.MapDecimal); - builder.Add(typeof (DateTime), mapper.ReadDateTime, mapper.BindDateTime, mapper.MapDateTime); - builder.Add(typeof (TimeSpan), mapper.ReadTimeSpan, mapper.BindTimeSpan, mapper.MapTimeSpan); - builder.Add(typeof (Guid), mapper.ReadGuid, mapper.BindGuid, mapper.MapGuid); - builder.Add(typeof (byte[]), mapper.ReadByteArray, mapper.BindByteArray, mapper.MapByteArray); - } - - private static void RegisterStandardReverseMappings(TypeMappingRegistryBuilder builder) - { - builder.AddReverse(SqlType.Boolean, typeof(bool)); - builder.AddReverse(SqlType.Int8, typeof(sbyte)); - builder.AddReverse(SqlType.UInt8, typeof(byte)); - builder.AddReverse(SqlType.Int16, typeof(short)); - builder.AddReverse(SqlType.UInt16, typeof(ushort)); - builder.AddReverse(SqlType.Int32, typeof(int)); - builder.AddReverse(SqlType.UInt32, typeof(uint)); - builder.AddReverse(SqlType.Int64, typeof(long)); - builder.AddReverse(SqlType.UInt64, typeof(ulong)); - builder.AddReverse(SqlType.Decimal, typeof(decimal)); - builder.AddReverse(SqlType.Float, typeof(float)); - builder.AddReverse(SqlType.Double, typeof(double)); - builder.AddReverse(SqlType.DateTime, typeof(DateTime)); - builder.AddReverse(SqlType.Interval, typeof(TimeSpan)); - builder.AddReverse(SqlType.Char, typeof(string)); - builder.AddReverse(SqlType.VarChar, typeof(string)); - builder.AddReverse(SqlType.VarCharMax, typeof(string)); - builder.AddReverse(SqlType.Binary, typeof(byte[])); - builder.AddReverse(SqlType.VarBinary, typeof(byte[])); - builder.AddReverse(SqlType.VarBinaryMax, typeof(byte[])); - builder.AddReverse(SqlType.Guid, typeof(Guid)); - } - - private Extractor BuildExtractor(SqlConnection connection) - { - var extractor = CreateExtractor(); - extractor.Initialize(connection); - return extractor; - } - - private void ValidateCompilerConfiguration(SqlCompilerConfiguration configuration) - { - var supported = ServerInfo.Query.Features.Supports(QueryFeatures.MultidatabaseQueries); - var requested = configuration.DatabaseQualifiedObjects; - if (requested && !supported) - throw SqlHelper.NotSupported(QueryFeatures.MultidatabaseQueries); - } - - private Schema ExtractSchema(SqlConnection connection, string databaseName, string schemaName) - { - var task = new SqlExtractionTask(databaseName, schemaName); - return Extract(connection, new[] {task}).Catalogs[databaseName].Schemas.FirstOrDefault(el=>el.Name==schemaName); - } - - private void CleanSchemas(Catalog catalog, IEnumerable allowedSchemas) - { - // We allow extractors to extract schemas that were not requested - // After extraction is complete, this methods removes not-necessary parts - - var allowed = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var schema in allowedSchemas) - allowed.Add(schema); - - var schemasToRemove = catalog.Schemas - .Where(s => !allowed.Contains(s.Name)) - .ToList(); - - foreach (var schema in schemasToRemove) - catalog.Schemas.Remove(schema); - } - - #endregion - - protected SqlDriver(CoreServerInfo coreServerInfo) - { - coreServerInfo.Lock(); - CoreServerInfo = coreServerInfo; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Compiler; +using Xtensive.Sql.Info; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql +{ + /// + /// Declares a base functionality of any . + /// + public abstract class SqlDriver + { + private SqlDriverFactory origin; + private ConnectionInfo originConnectionInfo; + + /// + /// Gets an instance that provides the most essential information about underlying RDBMS. + /// + public CoreServerInfo CoreServerInfo { get; private set; } + + /// + /// Gets an instance that provides complete information about underlying RDBMS. + /// + /// + public ServerInfo ServerInfo { get; private set; } + + /// + /// Gets the type mappings. + /// + public TypeMappingRegistry TypeMappings { get; private set; } + + /// + /// Gets the . + /// + public SqlTranslator Translator { get; private set; } + + /// + /// Gets connection string for the specified . + /// + /// to convert. + /// Connection string. + public string GetConnectionString(ConnectionInfo connectionInfo) + { + return origin.GetConnectionString(connectionInfo); + } + + /// + /// Compiles the specified statement into SQL command representation. + /// + /// The Sql.Dom statement. + /// Result of compilation. + public SqlCompilationResult Compile(ISqlCompileUnit statement) + { + ArgumentValidator.EnsureArgumentNotNull(statement, "statement"); + return CreateCompiler().Compile(statement, new SqlCompilerConfiguration()); + } + + /// + /// Compiles the specified statement into SQL command representation. + /// + /// The Sql.Dom statement. + /// The options of compilation. + /// Result of compilation. + public SqlCompilationResult Compile(ISqlCompileUnit statement, SqlCompilerConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(statement, "statement"); + ArgumentValidator.EnsureArgumentNotNull(configuration, "options"); + ValidateCompilerConfiguration(configuration); + return CreateCompiler().Compile(statement, configuration); + } + + /// + /// Gets for the specified . + /// + /// to use. + /// for the specified . + public DefaultSchemaInfo GetDefaultSchema(SqlConnection connection) + { + ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); + if (connection.Driver!=this) + throw new ArgumentException(Strings.ExSpecifiedConnectionDoesNotBelongToThisDriver); + + return origin.GetDefaultSchema(connection.UnderlyingConnection, connection.ActiveTransaction); + } + + /// + /// Extracts catalogs/schemas according to the specified . + /// + /// Extraction tasks. + /// Connection to use. + /// Extracted catalogs. + public SqlExtractionResult Extract(SqlConnection connection, IEnumerable tasks) + { + ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); + ArgumentValidator.EnsureArgumentNotNull(tasks, "tasks"); + + if (connection.Driver!=this) + throw new ArgumentException(Strings.ExSpecifiedConnectionDoesNotBelongToThisDriver); + + var taskGroups = tasks + .GroupBy(t => t.Catalog) + .ToDictionary(g => g.Key, g => g.ToList()); + + var result = new SqlExtractionResult(); + + foreach (var taskGroup in taskGroups) { + var catalogName = taskGroup.Key; + var tasksForCatalog = taskGroup.Value; + + if (tasksForCatalog.All(t => !t.AllSchemas)) { + // extracting all the schemes we need + var schemasToExtract = tasksForCatalog.Select(t => t.Schema).ToArray(); + var catalog = BuildExtractor(connection) + .ExtractSchemes(catalogName, schemasToExtract); + CleanSchemas(catalog, schemasToExtract); + result.Catalogs.Add(catalog); + } + else { + // Extracting whole catalog + var catalog = BuildExtractor(connection).ExtractCatalog(catalogName); + result.Catalogs.Add(catalog); + } + } + + return result; + } + + /// + /// Extracts all schemas from the database. + /// + /// The connection. + /// + /// that holds all schemas in the database. + /// + public Catalog ExtractCatalog(SqlConnection connection) + { + var defaultSchema = GetDefaultSchema(connection); + var task = new SqlExtractionTask(defaultSchema.Database); + return Extract(connection, new[] {task}).Catalogs.Single(); + } + + /// + /// Extracts the default schema from the database. + /// + /// The connection. + /// + /// that holds just the default schema in the database. + /// + public Schema ExtractDefaultSchema(SqlConnection connection) + { + var defaultSchema = GetDefaultSchema(connection); + return ExtractSchema(connection, defaultSchema.Database, defaultSchema.Schema); + } + + /// + /// Extracts the specified schema from the database. + /// + /// The connection. + /// + /// Extracted instance. + /// + public Schema ExtractSchema(SqlConnection connection, string schemaName) + { + var defaultSchema = GetDefaultSchema(connection); + return ExtractSchema(connection, defaultSchema.Database, schemaName); + } + + /// + /// Creates the connection using default connection information. + /// + public SqlConnection CreateConnection() + { + var result = DoCreateConnection(); + result.ConnectionInfo = originConnectionInfo; + return result; + } + + /// + /// Creates the connection using specified connection information. + /// + /// + /// + public SqlConnection CreateConnection(ConnectionInfo connectionInfo) + { + var result = DoCreateConnection(); + result.ConnectionInfo = connectionInfo; + return result; + } + + /// + /// Gets the type of the exception. + /// + /// The exception. + /// Type of the exception. + public virtual SqlExceptionType GetExceptionType(Exception exception) + { + return SqlExceptionType.Unknown; + } + + /// + /// Gets information about exception. + /// + /// The exception. + /// Information about exception. + public virtual SqlExceptionInfo GetExceptionInfo(Exception exception) + { + return SqlExceptionInfo.Create(GetExceptionType(exception)); + } + + /// + /// Creates the SQL DOM compiler. + /// + /// Created compiler. + protected abstract SqlCompiler CreateCompiler(); + + /// + /// Creates the SQL DOM translator. + /// + /// Created translator + protected abstract SqlTranslator CreateTranslator(); + + /// + /// Creates the extractor. + /// + /// Created extractor. + protected abstract Extractor CreateExtractor(); + + /// + /// Creates the type mapper. + /// + /// Created type mapper. + protected abstract TypeMapper CreateTypeMapper(); + + /// + /// Creates the server info provider. + /// + /// Created server info provider. + protected abstract ServerInfoProvider CreateServerInfoProvider(); + + /// + /// Creates connection. + /// + /// Created connection. + protected abstract SqlConnection DoCreateConnection(); + + protected virtual void RegisterCustomMappings(TypeMappingRegistryBuilder builder) + { + } + + protected virtual void RegisterCustomReverseMappings(TypeMappingRegistryBuilder builder) + { + } + + #region Private / internal methods + + internal void Initialize(SqlDriverFactory creator, ConnectionInfo creatorConnectionInfo) + { + origin = creator; + originConnectionInfo = creatorConnectionInfo; + + var serverInfoProvider = CreateServerInfoProvider(); + ServerInfo = ServerInfo.Build(serverInfoProvider); + + var typeMapper = CreateTypeMapper(); + typeMapper.Initialize(); + TypeMappings = CreateTypeMappingCollection(typeMapper); + + Translator = CreateTranslator(); + Translator.Initialize(); + } + + private TypeMappingRegistry CreateTypeMappingCollection(TypeMapper mapper) + { + var builder = new TypeMappingRegistryBuilder(mapper); + RegisterStandardMappings(builder); + RegisterStandardReverseMappings(builder); + RegisterCustomMappings(builder); + RegisterCustomReverseMappings(builder); + return builder.Build(); + } + + private static void RegisterStandardMappings(TypeMappingRegistryBuilder builder) + { + var mapper = builder.Mapper; + + builder.Add(typeof (bool), mapper.ReadBoolean, mapper.BindBoolean, mapper.MapBoolean); + builder.Add(typeof (char), mapper.ReadChar, mapper.BindChar, mapper.MapChar); + builder.Add(typeof (string), mapper.ReadString, mapper.BindString, mapper.MapString); + builder.Add(typeof (byte), mapper.ReadByte, mapper.BindByte, mapper.MapByte); + builder.Add(typeof (sbyte), mapper.ReadSByte, mapper.BindSByte, mapper.MapSByte); + builder.Add(typeof (short), mapper.ReadShort, mapper.BindShort, mapper.MapShort); + builder.Add(typeof (ushort), mapper.ReadUShort, mapper.BindUShort, mapper.MapUShort); + builder.Add(typeof (int), mapper.ReadInt, mapper.BindInt, mapper.MapInt); + builder.Add(typeof (uint), mapper.ReadUInt, mapper.BindUInt, mapper.MapUInt); + builder.Add(typeof (long), mapper.ReadLong, mapper.BindLong, mapper.MapLong); + builder.Add(typeof (ulong), mapper.ReadULong, mapper.BindULong, mapper.MapULong); + builder.Add(typeof (float), mapper.ReadFloat, mapper.BindFloat, mapper.MapFloat); + builder.Add(typeof (double), mapper.ReadDouble, mapper.BindDouble, mapper.MapDouble); + builder.Add(typeof (decimal), mapper.ReadDecimal, mapper.BindDecimal, mapper.MapDecimal); + builder.Add(typeof (DateTime), mapper.ReadDateTime, mapper.BindDateTime, mapper.MapDateTime); + builder.Add(typeof (TimeSpan), mapper.ReadTimeSpan, mapper.BindTimeSpan, mapper.MapTimeSpan); + builder.Add(typeof (Guid), mapper.ReadGuid, mapper.BindGuid, mapper.MapGuid); + builder.Add(typeof (byte[]), mapper.ReadByteArray, mapper.BindByteArray, mapper.MapByteArray); + } + + private static void RegisterStandardReverseMappings(TypeMappingRegistryBuilder builder) + { + builder.AddReverse(SqlType.Boolean, typeof(bool)); + builder.AddReverse(SqlType.Int8, typeof(sbyte)); + builder.AddReverse(SqlType.UInt8, typeof(byte)); + builder.AddReverse(SqlType.Int16, typeof(short)); + builder.AddReverse(SqlType.UInt16, typeof(ushort)); + builder.AddReverse(SqlType.Int32, typeof(int)); + builder.AddReverse(SqlType.UInt32, typeof(uint)); + builder.AddReverse(SqlType.Int64, typeof(long)); + builder.AddReverse(SqlType.UInt64, typeof(ulong)); + builder.AddReverse(SqlType.Decimal, typeof(decimal)); + builder.AddReverse(SqlType.Float, typeof(float)); + builder.AddReverse(SqlType.Double, typeof(double)); + builder.AddReverse(SqlType.DateTime, typeof(DateTime)); + builder.AddReverse(SqlType.Interval, typeof(TimeSpan)); + builder.AddReverse(SqlType.Char, typeof(string)); + builder.AddReverse(SqlType.VarChar, typeof(string)); + builder.AddReverse(SqlType.VarCharMax, typeof(string)); + builder.AddReverse(SqlType.Binary, typeof(byte[])); + builder.AddReverse(SqlType.VarBinary, typeof(byte[])); + builder.AddReverse(SqlType.VarBinaryMax, typeof(byte[])); + builder.AddReverse(SqlType.Guid, typeof(Guid)); + } + + private Extractor BuildExtractor(SqlConnection connection) + { + var extractor = CreateExtractor(); + extractor.Initialize(connection); + return extractor; + } + + private void ValidateCompilerConfiguration(SqlCompilerConfiguration configuration) + { + var supported = ServerInfo.Query.Features.Supports(QueryFeatures.MultidatabaseQueries); + var requested = configuration.DatabaseQualifiedObjects; + if (requested && !supported) + throw SqlHelper.NotSupported(QueryFeatures.MultidatabaseQueries); + } + + private Schema ExtractSchema(SqlConnection connection, string databaseName, string schemaName) + { + var task = new SqlExtractionTask(databaseName, schemaName); + return Extract(connection, new[] {task}).Catalogs[databaseName].Schemas.FirstOrDefault(el=>el.Name==schemaName); + } + + private void CleanSchemas(Catalog catalog, IEnumerable allowedSchemas) + { + // We allow extractors to extract schemas that were not requested + // After extraction is complete, this methods removes not-necessary parts + + var allowed = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var schema in allowedSchemas) + allowed.Add(schema); + + var schemasToRemove = catalog.Schemas + .Where(s => !allowed.Contains(s.Name)) + .ToList(); + + foreach (var schema in schemasToRemove) + catalog.Schemas.Remove(schema); + } + + #endregion + + protected SqlDriver(CoreServerInfo coreServerInfo) + { + coreServerInfo.Lock(); + CoreServerInfo = coreServerInfo; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDriverBound.cs b/Orm/Xtensive.Orm/Sql/SqlDriverBound.cs index c33a9ff5fb..918743c8b7 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDriverBound.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDriverBound.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.25 - - - -namespace Xtensive.Sql -{ - /// - /// A bound object. - /// - public abstract class SqlDriverBound - { - /// - /// Gets the driver. - /// - public SqlDriver Driver { get; private set; } - - /// - /// Initializes new instance of this type. - /// - /// The driver. - public SqlDriverBound(SqlDriver driver) - { - Driver = driver; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.25 + + + +namespace Xtensive.Sql +{ + /// + /// A bound object. + /// + public abstract class SqlDriverBound + { + /// + /// Gets the driver. + /// + public SqlDriver Driver { get; private set; } + + /// + /// Initializes new instance of this type. + /// + /// The driver. + public SqlDriverBound(SqlDriver driver) + { + Driver = driver; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDriverConfiguration.cs b/Orm/Xtensive.Orm/Sql/SqlDriverConfiguration.cs index 9206c07b6d..9dcebec5af 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDriverConfiguration.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDriverConfiguration.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.27 - -namespace Xtensive.Sql -{ - /// - /// Configuration for . - /// - public sealed class SqlDriverConfiguration - { - /// - /// Gets or sets forced server version. - /// - public string ForcedServerVersion { get; set; } - - /// - /// Gets or sets connection initialization SQL script. - /// - public string ConnectionInitializationSql { get; set; } - - /// - /// Gets or sets a value indicating that connection should be checked before actual usage. - /// - public bool EnsureConnectionIsAlive { get; set; } - - /// - /// Clones this instance. - /// - /// Clone of this instance. - public SqlDriverConfiguration Clone() - { - return new SqlDriverConfiguration { - ForcedServerVersion = ForcedServerVersion, - ConnectionInitializationSql = ConnectionInitializationSql, - EnsureConnectionIsAlive = EnsureConnectionIsAlive - }; - } - - /// - /// Creates new instance of this type. - /// - public SqlDriverConfiguration() - { - } - } +// Copyright (C) 2003-2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.27 + +namespace Xtensive.Sql +{ + /// + /// Configuration for . + /// + public sealed class SqlDriverConfiguration + { + /// + /// Gets or sets forced server version. + /// + public string ForcedServerVersion { get; set; } + + /// + /// Gets or sets connection initialization SQL script. + /// + public string ConnectionInitializationSql { get; set; } + + /// + /// Gets or sets a value indicating that connection should be checked before actual usage. + /// + public bool EnsureConnectionIsAlive { get; set; } + + /// + /// Clones this instance. + /// + /// Clone of this instance. + public SqlDriverConfiguration Clone() + { + return new SqlDriverConfiguration { + ForcedServerVersion = ForcedServerVersion, + ConnectionInitializationSql = ConnectionInitializationSql, + EnsureConnectionIsAlive = EnsureConnectionIsAlive + }; + } + + /// + /// Creates new instance of this type. + /// + public SqlDriverConfiguration() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlDriverFactory.cs b/Orm/Xtensive.Orm/Sql/SqlDriverFactory.cs index ebf46f44cc..295cdcffbe 100644 --- a/Orm/Xtensive.Orm/Sql/SqlDriverFactory.cs +++ b/Orm/Xtensive.Orm/Sql/SqlDriverFactory.cs @@ -1,106 +1,106 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.23 - -using System.Data.Common; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql -{ - /// - /// Creates drivers from the specified connection info. - /// - public abstract class SqlDriverFactory - { - /// - /// Gets driver for the specified . - /// - /// Connection information to use. - /// Driver for . - public SqlDriver GetDriver(ConnectionInfo connectionInfo) - { - return GetDriver(connectionInfo, new SqlDriverConfiguration()); - } - - /// - /// Creates driver from the specified . - /// - /// The connection info to create driver from. - /// Forced server version. - /// Created driver. - public SqlDriver GetDriver(ConnectionInfo connectionInfo, string forcedVersion) - { - return GetDriver(connectionInfo, new SqlDriverConfiguration {ForcedServerVersion = forcedVersion}); - } - - /// - /// Create driver from the specified - /// and . - /// - /// The connection info to create driver from. - /// Additional configuration options for the driver. - /// Created driver. - public SqlDriver GetDriver(ConnectionInfo connectionInfo, SqlDriverConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - - var connectionString = GetConnectionString(connectionInfo); - configuration = configuration.Clone(); - var driver = CreateDriver(connectionString, configuration); - driver.Initialize(this, connectionInfo); - return driver; - } - - /// - /// Gets connection string for the specified . - /// - /// Connection information to process. - /// Connection string for . - public string GetConnectionString(ConnectionInfo connectionInfo) - { - ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); - return connectionInfo.ConnectionString - ?? BuildConnectionString(connectionInfo.ConnectionUrl); - } - - /// - /// Gets for the specified . - /// - /// to use. - /// to use. - /// for the specified . - public DefaultSchemaInfo GetDefaultSchema(DbConnection connection, DbTransaction transaction = null) - { - ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); - return ReadDefaultSchema(connection, transaction); - } - - /// - /// Reads for the specified . - /// - /// to use. - /// to use. - /// for the specified . - protected abstract DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction); - - /// - /// Creates the driver from the specified . - /// - /// The connection string to create driver from. - /// Additional configuration for the driver. - /// Created driver. - protected abstract SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration); - - /// - /// Builds the connection string from the specified URL. - /// - /// The connection URL. - /// Built connection string - protected abstract string BuildConnectionString(UrlInfo connectionUrl); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.23 + +using System.Data.Common; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql +{ + /// + /// Creates drivers from the specified connection info. + /// + public abstract class SqlDriverFactory + { + /// + /// Gets driver for the specified . + /// + /// Connection information to use. + /// Driver for . + public SqlDriver GetDriver(ConnectionInfo connectionInfo) + { + return GetDriver(connectionInfo, new SqlDriverConfiguration()); + } + + /// + /// Creates driver from the specified . + /// + /// The connection info to create driver from. + /// Forced server version. + /// Created driver. + public SqlDriver GetDriver(ConnectionInfo connectionInfo, string forcedVersion) + { + return GetDriver(connectionInfo, new SqlDriverConfiguration {ForcedServerVersion = forcedVersion}); + } + + /// + /// Create driver from the specified + /// and . + /// + /// The connection info to create driver from. + /// Additional configuration options for the driver. + /// Created driver. + public SqlDriver GetDriver(ConnectionInfo connectionInfo, SqlDriverConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); + ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + + var connectionString = GetConnectionString(connectionInfo); + configuration = configuration.Clone(); + var driver = CreateDriver(connectionString, configuration); + driver.Initialize(this, connectionInfo); + return driver; + } + + /// + /// Gets connection string for the specified . + /// + /// Connection information to process. + /// Connection string for . + public string GetConnectionString(ConnectionInfo connectionInfo) + { + ArgumentValidator.EnsureArgumentNotNull(connectionInfo, "connectionInfo"); + return connectionInfo.ConnectionString + ?? BuildConnectionString(connectionInfo.ConnectionUrl); + } + + /// + /// Gets for the specified . + /// + /// to use. + /// to use. + /// for the specified . + public DefaultSchemaInfo GetDefaultSchema(DbConnection connection, DbTransaction transaction = null) + { + ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); + return ReadDefaultSchema(connection, transaction); + } + + /// + /// Reads for the specified . + /// + /// to use. + /// to use. + /// for the specified . + protected abstract DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction); + + /// + /// Creates the driver from the specified . + /// + /// The connection string to create driver from. + /// Additional configuration for the driver. + /// Created driver. + protected abstract SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration); + + /// + /// Builds the connection string from the specified URL. + /// + /// The connection URL. + /// Built connection string + protected abstract string BuildConnectionString(UrlInfo connectionUrl); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlExceptionInfo.cs b/Orm/Xtensive.Orm/Sql/SqlExceptionInfo.cs index d2bcf7274f..5df2ce237f 100644 --- a/Orm/Xtensive.Orm/Sql/SqlExceptionInfo.cs +++ b/Orm/Xtensive.Orm/Sql/SqlExceptionInfo.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2011 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2011.09.29 - -using System.Text; -using Xtensive.Core; - -namespace Xtensive.Sql -{ - /// - /// Information about exception occurred while executing SQL query. - /// - public class SqlExceptionInfo : LockableBase - { - private SqlExceptionType type; - private string database; - private string table; - private string column; - private string value; - private string constraint; - - /// - /// Type of error. - /// - public SqlExceptionType Type { - get { return type; } - set { this.EnsureNotLocked(); type = value; } - } - - /// - /// Database in which error occurred (if any). - /// - public string Database { - get { return database; } - set { this.EnsureNotLocked(); database = value; } - } - - /// - /// Table in which error occurred (if any). - /// - public string Table { - get { return table; } - set { this.EnsureNotLocked(); table = value; } - } - - /// - /// Column in which error occurred (if any). - /// - public string Column { - get { return column; } - set { this.EnsureNotLocked(); column = value; } - } - - /// - /// Value that caused error (if any). - /// - public string Value { - get { return value; } - set { this.EnsureNotLocked(); this.value = value; } - } - - /// - /// Name of the constraint or unique index that caused error (if any). - /// - public string Constraint { - get { return constraint; } - set { this.EnsureNotLocked(); constraint = value; } - } - - /// - public override string ToString() - { - var builder = new StringBuilder(); - builder.AppendFormat(Strings.TypeX, type); - if (!string.IsNullOrEmpty(database)) - builder.AppendFormat(Strings.DatabaseX, database); - if (!string.IsNullOrEmpty(table)) - builder.AppendFormat(Strings.TableX, table); - if (!string.IsNullOrEmpty(column)) - builder.AppendFormat(Strings.ColumnX, column); - if (!string.IsNullOrEmpty(value)) - builder.AppendFormat(Strings.ValueX, value); - if (!string.IsNullOrEmpty(constraint)) - builder.AppendFormat(Strings.ConstraintX, constraint); - return builder.ToString(); - } - - /// - /// Creates locked with only specified. - /// - /// Type of exception. - /// Created . - public static SqlExceptionInfo Create(SqlExceptionType type) - { - var result = new SqlExceptionInfo {Type = type}; - result.Lock(); - return result; - } - } +// Copyright (C) 2011 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2011.09.29 + +using System.Text; +using Xtensive.Core; + +namespace Xtensive.Sql +{ + /// + /// Information about exception occurred while executing SQL query. + /// + public class SqlExceptionInfo : LockableBase + { + private SqlExceptionType type; + private string database; + private string table; + private string column; + private string value; + private string constraint; + + /// + /// Type of error. + /// + public SqlExceptionType Type { + get { return type; } + set { this.EnsureNotLocked(); type = value; } + } + + /// + /// Database in which error occurred (if any). + /// + public string Database { + get { return database; } + set { this.EnsureNotLocked(); database = value; } + } + + /// + /// Table in which error occurred (if any). + /// + public string Table { + get { return table; } + set { this.EnsureNotLocked(); table = value; } + } + + /// + /// Column in which error occurred (if any). + /// + public string Column { + get { return column; } + set { this.EnsureNotLocked(); column = value; } + } + + /// + /// Value that caused error (if any). + /// + public string Value { + get { return value; } + set { this.EnsureNotLocked(); this.value = value; } + } + + /// + /// Name of the constraint or unique index that caused error (if any). + /// + public string Constraint { + get { return constraint; } + set { this.EnsureNotLocked(); constraint = value; } + } + + /// + public override string ToString() + { + var builder = new StringBuilder(); + builder.AppendFormat(Strings.TypeX, type); + if (!string.IsNullOrEmpty(database)) + builder.AppendFormat(Strings.DatabaseX, database); + if (!string.IsNullOrEmpty(table)) + builder.AppendFormat(Strings.TableX, table); + if (!string.IsNullOrEmpty(column)) + builder.AppendFormat(Strings.ColumnX, column); + if (!string.IsNullOrEmpty(value)) + builder.AppendFormat(Strings.ValueX, value); + if (!string.IsNullOrEmpty(constraint)) + builder.AppendFormat(Strings.ConstraintX, constraint); + return builder.ToString(); + } + + /// + /// Creates locked with only specified. + /// + /// Type of exception. + /// Created . + public static SqlExceptionInfo Create(SqlExceptionType type) + { + var result = new SqlExceptionInfo {Type = type}; + result.Lock(); + return result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlExceptionType.cs b/Orm/Xtensive.Orm/Sql/SqlExceptionType.cs index 95298ccdee..23f6cdb925 100644 --- a/Orm/Xtensive.Orm/Sql/SqlExceptionType.cs +++ b/Orm/Xtensive.Orm/Sql/SqlExceptionType.cs @@ -1,59 +1,59 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.08.14 - -namespace Xtensive.Sql -{ - /// - /// Possible exeception types. - /// - public enum SqlExceptionType - { - /// - /// Reason of exception is unknown. - /// - Unknown, - - /// - /// Connection error (such as timeout). - /// - ConnectionError, - - /// - /// Syntax error in query. - /// - SyntaxError, - - /// - /// Check constraint violation (including NOT NULL constraints) - /// - CheckConstraintViolation, - - /// - /// Unique constraint violation (also denotes unique and primary index key duplication). - /// - UniqueConstraintViolation, - - /// - /// Referential constraint (aka foreign key) violation. - /// - ReferentialConstraintViolation, - - /// - /// Deadlock. - /// - Deadlock, - - /// - /// Concurrent access serialization failure. - /// - SerializationFailure, - - /// - /// Operation timed out. - /// - OperationTimeout, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.08.14 + +namespace Xtensive.Sql +{ + /// + /// Possible exeception types. + /// + public enum SqlExceptionType + { + /// + /// Reason of exception is unknown. + /// + Unknown, + + /// + /// Connection error (such as timeout). + /// + ConnectionError, + + /// + /// Syntax error in query. + /// + SyntaxError, + + /// + /// Check constraint violation (including NOT NULL constraints) + /// + CheckConstraintViolation, + + /// + /// Unique constraint violation (also denotes unique and primary index key duplication). + /// + UniqueConstraintViolation, + + /// + /// Referential constraint (aka foreign key) violation. + /// + ReferentialConstraintViolation, + + /// + /// Deadlock. + /// + Deadlock, + + /// + /// Concurrent access serialization failure. + /// + SerializationFailure, + + /// + /// Operation timed out. + /// + OperationTimeout, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlExtensions.cs b/Orm/Xtensive.Orm/Sql/SqlExtensions.cs index 558c0aa1c4..5d656e584f 100644 --- a/Orm/Xtensive.Orm/Sql/SqlExtensions.cs +++ b/Orm/Xtensive.Orm/Sql/SqlExtensions.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.30 - -using System; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Dml; - -namespace Xtensive.Sql -{ - /// - /// Various extension methods related to this namespace. - /// - public static class SqlExtensions - { - private const char SchemaSeparator = '/'; - private const string SchemaSeparatorString = "/"; - - /// - /// Extracts the database component from the specified . - /// - /// The URL. - /// Database name. - public static string GetDatabase(this UrlInfo url) - { - var resource = url.Resource; - int position = resource.IndexOf(SchemaSeparator); - if (position < 0) - return url.Resource.TryCutSuffix(SchemaSeparatorString); - return resource.Substring(0, position); - } - - /// - /// Extracts the schema component from the specified . - /// If schema is not specified returns . - /// - /// The URL. - /// The default schema name. - /// Schema name. - public static string GetSchema(this UrlInfo url, string defaultValue) - { - var resource = url.Resource; - int position = resource.IndexOf(SchemaSeparator); - if (position < 0) - return defaultValue; - var result = resource.Substring(position + 1).TryCutSuffix(SchemaSeparatorString); - return string.IsNullOrEmpty(result) ? defaultValue : result; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.30 + +using System; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Dml; + +namespace Xtensive.Sql +{ + /// + /// Various extension methods related to this namespace. + /// + public static class SqlExtensions + { + private const char SchemaSeparator = '/'; + private const string SchemaSeparatorString = "/"; + + /// + /// Extracts the database component from the specified . + /// + /// The URL. + /// Database name. + public static string GetDatabase(this UrlInfo url) + { + var resource = url.Resource; + int position = resource.IndexOf(SchemaSeparator); + if (position < 0) + return url.Resource.TryCutSuffix(SchemaSeparatorString); + return resource.Substring(0, position); + } + + /// + /// Extracts the schema component from the specified . + /// If schema is not specified returns . + /// + /// The URL. + /// The default schema name. + /// Schema name. + public static string GetSchema(this UrlInfo url, string defaultValue) + { + var resource = url.Resource; + int position = resource.IndexOf(SchemaSeparator); + if (position < 0) + return defaultValue; + var result = resource.Substring(position + 1).TryCutSuffix(SchemaSeparatorString); + return string.IsNullOrEmpty(result) ? defaultValue : result; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlExtractionResult.cs b/Orm/Xtensive.Orm/Sql/SqlExtractionResult.cs index a3413e4164..5927002c49 100644 --- a/Orm/Xtensive.Orm/Sql/SqlExtractionResult.cs +++ b/Orm/Xtensive.Orm/Sql/SqlExtractionResult.cs @@ -1,25 +1,25 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.03.06 - -using Xtensive.Sql.Model; - -namespace Xtensive.Sql -{ - /// - /// Result of SQL schema extraction. - /// - public sealed class SqlExtractionResult - { - public NodeCollection Catalogs { get; set; } - - // Constructors - - public SqlExtractionResult() - { - Catalogs = new NodeCollection(); - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.03.06 + +using Xtensive.Sql.Model; + +namespace Xtensive.Sql +{ + /// + /// Result of SQL schema extraction. + /// + public sealed class SqlExtractionResult + { + public NodeCollection Catalogs { get; set; } + + // Constructors + + public SqlExtractionResult() + { + Catalogs = new NodeCollection(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlExtractionTask.cs b/Orm/Xtensive.Orm/Sql/SqlExtractionTask.cs index 11e872f1de..24433c5242 100644 --- a/Orm/Xtensive.Orm/Sql/SqlExtractionTask.cs +++ b/Orm/Xtensive.Orm/Sql/SqlExtractionTask.cs @@ -1,45 +1,45 @@ -using Xtensive.Core; -using Xtensive.Sql.Model; - -namespace Xtensive.Sql -{ - /// - /// A task for - /// - public sealed class SqlExtractionTask - { - /// - /// Gets catalog to extact. - /// - public string Catalog { get; private set; } - - /// - /// Gets schema to extract. - /// - public string Schema { get; private set; } - - /// - /// Gets value indicating if all schemas in the specified catalog - /// should be extracted. - /// - public bool AllSchemas { get { return Schema==null; } } - - // Constructors - - public SqlExtractionTask(string catalog) - { - ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); - - Catalog = catalog; - } - - public SqlExtractionTask(string catalog, string schema) - { - ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); - ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); - - Catalog = catalog; - Schema = schema; - } - } +using Xtensive.Core; +using Xtensive.Sql.Model; + +namespace Xtensive.Sql +{ + /// + /// A task for + /// + public sealed class SqlExtractionTask + { + /// + /// Gets catalog to extact. + /// + public string Catalog { get; private set; } + + /// + /// Gets schema to extract. + /// + public string Schema { get; private set; } + + /// + /// Gets value indicating if all schemas in the specified catalog + /// should be extracted. + /// + public bool AllSchemas { get { return Schema==null; } } + + // Constructors + + public SqlExtractionTask(string catalog) + { + ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); + + Catalog = catalog; + } + + public SqlExtractionTask(string catalog, string schema) + { + ArgumentValidator.EnsureArgumentNotNull(catalog, "catalog"); + ArgumentValidator.EnsureArgumentNotNull(schema, "schema"); + + Catalog = catalog; + Schema = schema; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlHelper.cs b/Orm/Xtensive.Orm/Sql/SqlHelper.cs index f40ff7f314..dcc10e826b 100644 --- a/Orm/Xtensive.Orm/Sql/SqlHelper.cs +++ b/Orm/Xtensive.Orm/Sql/SqlHelper.cs @@ -1,437 +1,437 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.17 - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using JetBrains.Annotations; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Sql.Dml; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql -{ - /// - /// Various helper methods related to this namespace. - /// - public static class SqlHelper - { - public readonly struct EscapeSetup - { - public static readonly EscapeSetup WithQuotes = - new EscapeSetup('.', '\"', '\"', '\"', '\"'); - public static readonly EscapeSetup WithBrackets = - new EscapeSetup('.', '[', ']', ']', ']'); - public static readonly EscapeSetup WithBackTick = - new EscapeSetup('.', '`', '`', '`', '`'); - - public readonly char Delimiter; - public readonly char Opener; - public readonly char Closer; - public readonly char EscapeCloser1; - public readonly char EscapeCloser2; - - public EscapeSetup(char delimiter, char opener, char closer, char escapeCloser1, char escapeCloser2) - { - Delimiter = delimiter; - Opener = opener; - Closer = closer; - EscapeCloser1 = escapeCloser1; - EscapeCloser2 = escapeCloser2; - } - } - - /// - /// Validates the specified URL againts charactes that usually forbidden inside connection strings. - /// - /// The URL. - public static void ValidateConnectionUrl(UrlInfo url) - { - var forbiddenChars = new[] {'=', ';'}; - bool isBadUrl = url.Host.IndexOfAny(forbiddenChars) >= 0 - || url.Resource.IndexOfAny(forbiddenChars) >= 0 - || url.User.IndexOfAny(forbiddenChars) >= 0 - || url.Password.IndexOfAny(forbiddenChars) >= 0; - if (isBadUrl) - throw new ArgumentException( - Strings.ExPartOfUrlContainsForbiddenCharacters + forbiddenChars.ToCommaDelimitedString(), "url"); - } - - /// - /// Quotes the specified identifier with quotes (i.e. ""). - /// - /// Quoted identifier. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string QuoteIdentifierWithQuotes(string[] names) - => Quote(EscapeSetup.WithQuotes, names); - - /// - /// Quotes the specified identifier with square brackets (i.e. []). - /// - /// Quoted indentifier. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string QuoteIdentifierWithBrackets(string[] names) - => Quote(EscapeSetup.WithBrackets, names); - - /// - /// Quotes the specified identifier with square brackets (i.e. ``). - /// - /// Quoted identifier. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static string QuoteIdentifierWithBackTick(string[] names) - => Quote(EscapeSetup.WithBackTick, names); - - private static unsafe string Quote(in EscapeSetup setup, string[] names) - { - // That's one of frequently called methods, so it's optimized for speed. - - // 1. Find resultLength - var resultLength = 0; - foreach (var name in names) { - if (string.IsNullOrEmpty(name)) - continue; - if (resultLength != 0) - resultLength++; - resultLength += 2 + name.Length; - var start = 0; - while (true) { - start = 1 + name.IndexOf(setup.Closer, start); - if (start == 0) - break; - resultLength++; - } - } - - // 2. Create the resulting string at once - var result = new string(setup.Delimiter, resultLength); - fixed (char* pResult = result) { - var p = pResult; - foreach (var name in names) { - if (string.IsNullOrEmpty(name)) - continue; - if (p != pResult) - p++; // Skip the delimiter (initial result value is a repeating delimiter) - *p++ = setup.Opener; - fixed (char* pName = name) { - var pNameEnd = pName + name.Length; - for (var pn = pName; pn < pNameEnd; pn++) { - var c = *pn; - if (c == setup.Closer) { - *p++ = setup.EscapeCloser1; - *p++ = setup.EscapeCloser2; - continue; - } - *p++ = c; - } - } - *p++ = setup.Closer; - } - } - return result; - } - - /// - /// Converts the specified interval expression to expression - /// that represents number of milliseconds in that interval. - /// This is a generic implementation via s. - /// It's suitable for any server, but can be inefficient. - /// - /// The interval to convert. - /// Result of conversion. - public static SqlExpression IntervalToMilliseconds(SqlExpression interval) - { - var days = SqlDml.Extract(SqlIntervalPart.Day, interval); - var hours = SqlDml.Extract(SqlIntervalPart.Hour, interval); - var minutes = SqlDml.Extract(SqlIntervalPart.Minute, interval); - var seconds = SqlDml.Extract(SqlIntervalPart.Second, interval); - var milliseconds = SqlDml.Extract(SqlIntervalPart.Millisecond, interval); - - return (((days * 24L + hours) * 60L + minutes) * 60L + seconds) * 1000L + milliseconds; - } - - /// - /// Converts the specified interval expression to expression - /// that represents number of milliseconds in that interval. - /// This is a generic implementation via s. - /// It's suitable for any server, but can be inefficient. - /// - /// The interval to convert. - /// Result of conversion. - public static SqlExpression IntervalToNanoseconds(SqlExpression interval) - { - var nanoseconds = SqlDml.Extract(SqlIntervalPart.Nanosecond, interval); - - return IntervalToMilliseconds(interval) * 1000000L + nanoseconds; - } - - /// - /// Converts the specified interval expression to expression - /// that represents absolute value (duration) of the specified interval. - /// This is a generic implementation that uses comparison with zero interval. - /// It's suitable for any server, but can be inefficient. - /// - /// The source. - /// Result of conversion. - public static SqlExpression IntervalAbs(SqlExpression source) - { - var result = SqlDml.Case(); - result.Add(source >= SqlDml.Literal(new TimeSpan(0)), source); - result.Else = SqlDml.IntervalNegate(source); - return result; - } - - /// - /// Performs banker's rounding on the specified argument. - /// - /// The value to round. - /// Result of rounding. - public static SqlExpression BankersRound(SqlExpression value) - { - var mainPart = 2 * SqlDml.Floor((value + 0.5) / 2); - var extraPart = SqlDml.Case(); - extraPart.Add(value - mainPart > 0.5, 1); - extraPart.Else = 0; - return mainPart + extraPart; - } - - /// - /// Performs banker's rounding on the speicified argument - /// to a specified number of fractional digits. - /// - /// The value to round. - /// The digits. - /// Result of rounding. - public static SqlExpression BankersRound(SqlExpression value, SqlExpression digits) - { - var scale = SqlDml.Power(10, digits); - return BankersRound(value * scale) / scale; - } - - /// - /// Performs "rounding as tought in school" on the specified argument. - /// - /// The value to round. - /// Result of rounding. - public static SqlExpression RegularRound(SqlExpression value) - { - var result = SqlDml.Case(); - result.Add(value > 0, SqlDml.Truncate(value + 0.5)); - result.Else = SqlDml.Truncate(value - 0.5); - return result; - } - - /// - /// Performs "rounding as tought in school" on the specified argument - /// to a specified number of fractional digits. - /// - /// The value to round. - /// The digits. - /// Result of rounding. - public static SqlExpression RegularRound(SqlExpression argument, SqlExpression digits) - { - var scale = SqlDml.Power(10, digits); - return RegularRound(argument * scale) / scale; - } - - public static string GuidToString(Guid guid) - { - return guid.ToString("N"); - } - - public static Guid GuidFromString(string value) - { - return new Guid(value); - } - - /// - /// Converts the specified to string using the specified format string. - /// - /// The value. - /// The format string. - /// Formatted representation of the . - /// - /// Format string can contain any of these placeholders: - /// - /// {0}negative sign, if argument represents a negative ; , otherwise. - /// {1}absolute value of property. - /// {2}absolute value of property. - /// {3}absolute value of property. - /// {4}absolute value of property. - /// {5}absolute value of property. - /// - /// - public static string TimeSpanToString(TimeSpan value, string format) - { - int days = value.Days; - int hours = value.Hours; - int minutes = value.Minutes; - int seconds = value.Seconds; - int milliseconds = value.Milliseconds; - - bool negative = false; - - if (days < 0) { - days = -days; - negative = true; - } - - if (hours < 0) { - hours = -hours; - negative = true; - } - - if (minutes < 0) { - minutes = -minutes; - negative = true; - } - - if (seconds < 0) { - seconds = -seconds; - negative = true; - } - - if (milliseconds < 0) { - milliseconds = -milliseconds; - negative = true; - } - - return String.Format(format, negative ? "-" : string.Empty, - days, hours, minutes, seconds, milliseconds); - } - - public static SqlExpression GenericPad(SqlFunctionCall node) - { - string paddingFunction; - switch (node.FunctionType) { - case SqlFunctionType.PadLeft: - paddingFunction = "lpad"; - break; - case SqlFunctionType.PadRight: - paddingFunction = "rpad"; - break; - default: - throw new InvalidOperationException(); - } - var operand = node.Arguments[0]; - var result = SqlDml.Case(); - result.Add( - SqlDml.CharLength(operand) < node.Arguments[1], - SqlDml.FunctionCall(paddingFunction, node.Arguments)); - result.Else = operand; - return result; - } - - /// - /// Reads the database and schema using the specified query. - /// By contract query should return database in first column and schema in second. - /// - /// The query text. - /// The connection to use. - /// The transaction to use. - /// instance. - public static DefaultSchemaInfo ReadDatabaseAndSchema(string queryText, - DbConnection connection, DbTransaction transaction) - { - ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); - ArgumentValidator.EnsureArgumentNotNullOrEmpty(queryText, "queryText"); - - using (var command = connection.CreateCommand()) { - command.CommandText = queryText; - command.Transaction = transaction; - using (var reader = command.ExecuteReader()) { - if (!reader.Read()) - throw new InvalidOperationException(Strings.ExCanNotReadDatabaseAndSchemaNames); - return new DefaultSchemaInfo(reader.GetString(0), reader.GetString(1)); - } - } - } - - /// - /// Executes (if any). - /// - /// Connection to initialize. - /// Driver configuration. - public static void ExecuteInitializationSql(DbConnection connection, SqlDriverConfiguration configuration) - { - if (string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) - return; - using (var command = connection.CreateCommand()) { - command.CommandText = configuration.ConnectionInitializationSql; - command.ExecuteNonQuery(); - } - } - - /// - /// Reduces the isolation level to the most commonly supported ones. - /// - /// The level. - /// Converted isolation level. - public static IsolationLevel ReduceIsolationLevel(IsolationLevel level) - { - switch (level) { - case IsolationLevel.ReadUncommitted: - case IsolationLevel.ReadCommitted: - return IsolationLevel.ReadCommitted; - case IsolationLevel.RepeatableRead: - case IsolationLevel.Serializable: - case IsolationLevel.Snapshot: - return IsolationLevel.Serializable; - default: - throw new NotSupportedException(string.Format(Strings.ExIsolationLevelXIsNotSupported, level)); - } - } - - /// - /// Quotes the string using standard SQL quoting rules. - /// - /// The value. - /// Quoted string. - public static string QuoteString(string value) - { - return "'" + value.Replace("'", "''").Replace("\0", string.Empty) + "'"; - } - - /// - /// Creates a with message that says that - /// is not supported by current storage. - /// - /// The feature. - /// Created exception. - public static NotSupportedException NotSupported(string feature) - { - return new NotSupportedException(string.Format(Strings.ExThisStorageDoesNotSupportX, feature)); - } - - /// - /// Creates a with message that says that - /// is not supported by current storage. - /// - /// The feature. - /// Created exception. - public static NotSupportedException NotSupported(QueryFeatures feature) - { - return NotSupported(feature.ToString()); - } - - /// - /// Creates a with message that says that - /// is not supported by current storage. - /// - /// The feature. - /// Created exception. - public static NotSupportedException NotSupported(ServerFeatures feature) - { - return NotSupported(feature.ToString()); - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.17 + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using JetBrains.Annotations; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Sql.Dml; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql +{ + /// + /// Various helper methods related to this namespace. + /// + public static class SqlHelper + { + public readonly struct EscapeSetup + { + public static readonly EscapeSetup WithQuotes = + new EscapeSetup('.', '\"', '\"', '\"', '\"'); + public static readonly EscapeSetup WithBrackets = + new EscapeSetup('.', '[', ']', ']', ']'); + public static readonly EscapeSetup WithBackTick = + new EscapeSetup('.', '`', '`', '`', '`'); + + public readonly char Delimiter; + public readonly char Opener; + public readonly char Closer; + public readonly char EscapeCloser1; + public readonly char EscapeCloser2; + + public EscapeSetup(char delimiter, char opener, char closer, char escapeCloser1, char escapeCloser2) + { + Delimiter = delimiter; + Opener = opener; + Closer = closer; + EscapeCloser1 = escapeCloser1; + EscapeCloser2 = escapeCloser2; + } + } + + /// + /// Validates the specified URL againts charactes that usually forbidden inside connection strings. + /// + /// The URL. + public static void ValidateConnectionUrl(UrlInfo url) + { + var forbiddenChars = new[] {'=', ';'}; + bool isBadUrl = url.Host.IndexOfAny(forbiddenChars) >= 0 + || url.Resource.IndexOfAny(forbiddenChars) >= 0 + || url.User.IndexOfAny(forbiddenChars) >= 0 + || url.Password.IndexOfAny(forbiddenChars) >= 0; + if (isBadUrl) + throw new ArgumentException( + Strings.ExPartOfUrlContainsForbiddenCharacters + forbiddenChars.ToCommaDelimitedString(), "url"); + } + + /// + /// Quotes the specified identifier with quotes (i.e. ""). + /// + /// Quoted identifier. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string QuoteIdentifierWithQuotes(string[] names) + => Quote(EscapeSetup.WithQuotes, names); + + /// + /// Quotes the specified identifier with square brackets (i.e. []). + /// + /// Quoted indentifier. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string QuoteIdentifierWithBrackets(string[] names) + => Quote(EscapeSetup.WithBrackets, names); + + /// + /// Quotes the specified identifier with square brackets (i.e. ``). + /// + /// Quoted identifier. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string QuoteIdentifierWithBackTick(string[] names) + => Quote(EscapeSetup.WithBackTick, names); + + private static unsafe string Quote(in EscapeSetup setup, string[] names) + { + // That's one of frequently called methods, so it's optimized for speed. + + // 1. Find resultLength + var resultLength = 0; + foreach (var name in names) { + if (string.IsNullOrEmpty(name)) + continue; + if (resultLength != 0) + resultLength++; + resultLength += 2 + name.Length; + var start = 0; + while (true) { + start = 1 + name.IndexOf(setup.Closer, start); + if (start == 0) + break; + resultLength++; + } + } + + // 2. Create the resulting string at once + var result = new string(setup.Delimiter, resultLength); + fixed (char* pResult = result) { + var p = pResult; + foreach (var name in names) { + if (string.IsNullOrEmpty(name)) + continue; + if (p != pResult) + p++; // Skip the delimiter (initial result value is a repeating delimiter) + *p++ = setup.Opener; + fixed (char* pName = name) { + var pNameEnd = pName + name.Length; + for (var pn = pName; pn < pNameEnd; pn++) { + var c = *pn; + if (c == setup.Closer) { + *p++ = setup.EscapeCloser1; + *p++ = setup.EscapeCloser2; + continue; + } + *p++ = c; + } + } + *p++ = setup.Closer; + } + } + return result; + } + + /// + /// Converts the specified interval expression to expression + /// that represents number of milliseconds in that interval. + /// This is a generic implementation via s. + /// It's suitable for any server, but can be inefficient. + /// + /// The interval to convert. + /// Result of conversion. + public static SqlExpression IntervalToMilliseconds(SqlExpression interval) + { + var days = SqlDml.Extract(SqlIntervalPart.Day, interval); + var hours = SqlDml.Extract(SqlIntervalPart.Hour, interval); + var minutes = SqlDml.Extract(SqlIntervalPart.Minute, interval); + var seconds = SqlDml.Extract(SqlIntervalPart.Second, interval); + var milliseconds = SqlDml.Extract(SqlIntervalPart.Millisecond, interval); + + return (((days * 24L + hours) * 60L + minutes) * 60L + seconds) * 1000L + milliseconds; + } + + /// + /// Converts the specified interval expression to expression + /// that represents number of milliseconds in that interval. + /// This is a generic implementation via s. + /// It's suitable for any server, but can be inefficient. + /// + /// The interval to convert. + /// Result of conversion. + public static SqlExpression IntervalToNanoseconds(SqlExpression interval) + { + var nanoseconds = SqlDml.Extract(SqlIntervalPart.Nanosecond, interval); + + return IntervalToMilliseconds(interval) * 1000000L + nanoseconds; + } + + /// + /// Converts the specified interval expression to expression + /// that represents absolute value (duration) of the specified interval. + /// This is a generic implementation that uses comparison with zero interval. + /// It's suitable for any server, but can be inefficient. + /// + /// The source. + /// Result of conversion. + public static SqlExpression IntervalAbs(SqlExpression source) + { + var result = SqlDml.Case(); + result.Add(source >= SqlDml.Literal(new TimeSpan(0)), source); + result.Else = SqlDml.IntervalNegate(source); + return result; + } + + /// + /// Performs banker's rounding on the specified argument. + /// + /// The value to round. + /// Result of rounding. + public static SqlExpression BankersRound(SqlExpression value) + { + var mainPart = 2 * SqlDml.Floor((value + 0.5) / 2); + var extraPart = SqlDml.Case(); + extraPart.Add(value - mainPart > 0.5, 1); + extraPart.Else = 0; + return mainPart + extraPart; + } + + /// + /// Performs banker's rounding on the speicified argument + /// to a specified number of fractional digits. + /// + /// The value to round. + /// The digits. + /// Result of rounding. + public static SqlExpression BankersRound(SqlExpression value, SqlExpression digits) + { + var scale = SqlDml.Power(10, digits); + return BankersRound(value * scale) / scale; + } + + /// + /// Performs "rounding as tought in school" on the specified argument. + /// + /// The value to round. + /// Result of rounding. + public static SqlExpression RegularRound(SqlExpression value) + { + var result = SqlDml.Case(); + result.Add(value > 0, SqlDml.Truncate(value + 0.5)); + result.Else = SqlDml.Truncate(value - 0.5); + return result; + } + + /// + /// Performs "rounding as tought in school" on the specified argument + /// to a specified number of fractional digits. + /// + /// The value to round. + /// The digits. + /// Result of rounding. + public static SqlExpression RegularRound(SqlExpression argument, SqlExpression digits) + { + var scale = SqlDml.Power(10, digits); + return RegularRound(argument * scale) / scale; + } + + public static string GuidToString(Guid guid) + { + return guid.ToString("N"); + } + + public static Guid GuidFromString(string value) + { + return new Guid(value); + } + + /// + /// Converts the specified to string using the specified format string. + /// + /// The value. + /// The format string. + /// Formatted representation of the . + /// + /// Format string can contain any of these placeholders: + /// + /// {0}negative sign, if argument represents a negative ; , otherwise. + /// {1}absolute value of property. + /// {2}absolute value of property. + /// {3}absolute value of property. + /// {4}absolute value of property. + /// {5}absolute value of property. + /// + /// + public static string TimeSpanToString(TimeSpan value, string format) + { + int days = value.Days; + int hours = value.Hours; + int minutes = value.Minutes; + int seconds = value.Seconds; + int milliseconds = value.Milliseconds; + + bool negative = false; + + if (days < 0) { + days = -days; + negative = true; + } + + if (hours < 0) { + hours = -hours; + negative = true; + } + + if (minutes < 0) { + minutes = -minutes; + negative = true; + } + + if (seconds < 0) { + seconds = -seconds; + negative = true; + } + + if (milliseconds < 0) { + milliseconds = -milliseconds; + negative = true; + } + + return String.Format(format, negative ? "-" : string.Empty, + days, hours, minutes, seconds, milliseconds); + } + + public static SqlExpression GenericPad(SqlFunctionCall node) + { + string paddingFunction; + switch (node.FunctionType) { + case SqlFunctionType.PadLeft: + paddingFunction = "lpad"; + break; + case SqlFunctionType.PadRight: + paddingFunction = "rpad"; + break; + default: + throw new InvalidOperationException(); + } + var operand = node.Arguments[0]; + var result = SqlDml.Case(); + result.Add( + SqlDml.CharLength(operand) < node.Arguments[1], + SqlDml.FunctionCall(paddingFunction, node.Arguments)); + result.Else = operand; + return result; + } + + /// + /// Reads the database and schema using the specified query. + /// By contract query should return database in first column and schema in second. + /// + /// The query text. + /// The connection to use. + /// The transaction to use. + /// instance. + public static DefaultSchemaInfo ReadDatabaseAndSchema(string queryText, + DbConnection connection, DbTransaction transaction) + { + ArgumentValidator.EnsureArgumentNotNull(connection, "connection"); + ArgumentValidator.EnsureArgumentNotNullOrEmpty(queryText, "queryText"); + + using (var command = connection.CreateCommand()) { + command.CommandText = queryText; + command.Transaction = transaction; + using (var reader = command.ExecuteReader()) { + if (!reader.Read()) + throw new InvalidOperationException(Strings.ExCanNotReadDatabaseAndSchemaNames); + return new DefaultSchemaInfo(reader.GetString(0), reader.GetString(1)); + } + } + } + + /// + /// Executes (if any). + /// + /// Connection to initialize. + /// Driver configuration. + public static void ExecuteInitializationSql(DbConnection connection, SqlDriverConfiguration configuration) + { + if (string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) + return; + using (var command = connection.CreateCommand()) { + command.CommandText = configuration.ConnectionInitializationSql; + command.ExecuteNonQuery(); + } + } + + /// + /// Reduces the isolation level to the most commonly supported ones. + /// + /// The level. + /// Converted isolation level. + public static IsolationLevel ReduceIsolationLevel(IsolationLevel level) + { + switch (level) { + case IsolationLevel.ReadUncommitted: + case IsolationLevel.ReadCommitted: + return IsolationLevel.ReadCommitted; + case IsolationLevel.RepeatableRead: + case IsolationLevel.Serializable: + case IsolationLevel.Snapshot: + return IsolationLevel.Serializable; + default: + throw new NotSupportedException(string.Format(Strings.ExIsolationLevelXIsNotSupported, level)); + } + } + + /// + /// Quotes the string using standard SQL quoting rules. + /// + /// The value. + /// Quoted string. + public static string QuoteString(string value) + { + return "'" + value.Replace("'", "''").Replace("\0", string.Empty) + "'"; + } + + /// + /// Creates a with message that says that + /// is not supported by current storage. + /// + /// The feature. + /// Created exception. + public static NotSupportedException NotSupported(string feature) + { + return new NotSupportedException(string.Format(Strings.ExThisStorageDoesNotSupportX, feature)); + } + + /// + /// Creates a with message that says that + /// is not supported by current storage. + /// + /// The feature. + /// Created exception. + public static NotSupportedException NotSupported(QueryFeatures feature) + { + return NotSupported(feature.ToString()); + } + + /// + /// Creates a with message that says that + /// is not supported by current storage. + /// + /// The feature. + /// Created exception. + public static NotSupportedException NotSupported(ServerFeatures feature) + { + return NotSupported(feature.ToString()); + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/SqlNode.cs b/Orm/Xtensive.Orm/Sql/SqlNode.cs index 99c76a1d5e..85086169db 100644 --- a/Orm/Xtensive.Orm/Sql/SqlNode.cs +++ b/Orm/Xtensive.Orm/Sql/SqlNode.cs @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Represents any node in Sql expression tree. - /// - [Serializable] - public abstract class SqlNode : ISqlNode - { - /// - /// Gets the type of the node. - /// - /// The type of the node. - public SqlNodeType NodeType { get; internal set; } - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - var context = new SqlNodeCloneContext(); - return Clone(context); - } - - internal abstract object Clone(SqlNodeCloneContext context); - - internal SqlNode(SqlNodeType nodeType) - { - NodeType = nodeType; - } - - public abstract void AcceptVisitor(ISqlVisitor visitor); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Represents any node in Sql expression tree. + /// + [Serializable] + public abstract class SqlNode : ISqlNode + { + /// + /// Gets the type of the node. + /// + /// The type of the node. + public SqlNodeType NodeType { get; internal set; } + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + var context = new SqlNodeCloneContext(); + return Clone(context); + } + + internal abstract object Clone(SqlNodeCloneContext context); + + internal SqlNode(SqlNodeType nodeType) + { + NodeType = nodeType; + } + + public abstract void AcceptVisitor(ISqlVisitor visitor); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlNodeType.cs b/Orm/Xtensive.Orm/Sql/SqlNodeType.cs index 624a0f9bce..d3ae897d5a 100644 --- a/Orm/Xtensive.Orm/Sql/SqlNodeType.cs +++ b/Orm/Xtensive.Orm/Sql/SqlNodeType.cs @@ -1,115 +1,115 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - [Serializable] - public enum SqlNodeType - { - Action, - Add, - All, - Alter, - And, - Any, - Array, - Assign, - Avg, - Batch, - BeginEndBlock, - Between, - BitAnd, - BitNot, - BitOr, - BitXor, - Break, - Case, - Cast, - CloseCursor, - Collate, - Column, - ColumnRef, - Command, - Concat, - Conditional, - Continue, - Container, - Count, - Create, - Cursor, - DateTimePlusInterval, - DateTimeMinusInterval, - DateTimeMinusDateTime, - DateTimeOffsetPlusInterval, - DateTimeOffsetMinusInterval, - DateTimeOffsetMinusDateTimeOffset, - DeclareCursor, - DefaultValue, - Delete, - Divide, - Drop, - DynamicFilter, - RawConcat, - Equals, - Except, - Exists, - Extract, - Fetch, - FunctionCall, - CustomFunctionCall, - GreaterThan, - GreaterThanOrEquals, - In, - Insert, - Intersect, - IsNull, - IsNotNull, - Join, - Hint, - Placeholder, - LessThan, - LessThanOrEquals, - Like, - Literal, - Match, - Max, - Min, - Modulo, - Multiply, - Native, - NextValue, - Not, - NotBetween, - NotEquals, - NotIn, - Negate, - Null, - OpenCursor, - Or, - Order, - Overlaps, - Parameter, - Rename, - Row, - RowNumber, - Round, - Select, - Some, - SubSelect, - Subtract, - Sum, - Table, - Trim, - Union, - Unique, - Update, - Variable, - Variant, - DeclareVariable, - While, - Fragment, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + [Serializable] + public enum SqlNodeType + { + Action, + Add, + All, + Alter, + And, + Any, + Array, + Assign, + Avg, + Batch, + BeginEndBlock, + Between, + BitAnd, + BitNot, + BitOr, + BitXor, + Break, + Case, + Cast, + CloseCursor, + Collate, + Column, + ColumnRef, + Command, + Concat, + Conditional, + Continue, + Container, + Count, + Create, + Cursor, + DateTimePlusInterval, + DateTimeMinusInterval, + DateTimeMinusDateTime, + DateTimeOffsetPlusInterval, + DateTimeOffsetMinusInterval, + DateTimeOffsetMinusDateTimeOffset, + DeclareCursor, + DefaultValue, + Delete, + Divide, + Drop, + DynamicFilter, + RawConcat, + Equals, + Except, + Exists, + Extract, + Fetch, + FunctionCall, + CustomFunctionCall, + GreaterThan, + GreaterThanOrEquals, + In, + Insert, + Intersect, + IsNull, + IsNotNull, + Join, + Hint, + Placeholder, + LessThan, + LessThanOrEquals, + Like, + Literal, + Match, + Max, + Min, + Modulo, + Multiply, + Native, + NextValue, + Not, + NotBetween, + NotEquals, + NotIn, + Negate, + Null, + OpenCursor, + Or, + Order, + Overlaps, + Parameter, + Rename, + Row, + RowNumber, + Round, + Select, + Some, + SubSelect, + Subtract, + Sum, + Table, + Trim, + Union, + Unique, + Update, + Variable, + Variant, + DeclareVariable, + While, + Fragment, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlStatement.cs b/Orm/Xtensive.Orm/Sql/SqlStatement.cs index b025e4a536..49a5f7d0d9 100644 --- a/Orm/Xtensive.Orm/Sql/SqlStatement.cs +++ b/Orm/Xtensive.Orm/Sql/SqlStatement.cs @@ -1,19 +1,19 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Base class for SQL statements. - /// - [Serializable] - public abstract class SqlStatement : SqlNode - { - protected SqlStatement(SqlNodeType nodeType) : base(nodeType) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Base class for SQL statements. + /// + [Serializable] + public abstract class SqlStatement : SqlNode + { + protected SqlStatement(SqlNodeType nodeType) : base(nodeType) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/SqlType.cs b/Orm/Xtensive.Orm/Sql/SqlType.cs index aea4648880..a932533e7e 100644 --- a/Orm/Xtensive.Orm/Sql/SqlType.cs +++ b/Orm/Xtensive.Orm/Sql/SqlType.cs @@ -1,213 +1,213 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; - -namespace Xtensive.Sql -{ - /// - /// Enumerates supported SQL column types. - /// - [Serializable] - public struct SqlType : IEquatable - { - public readonly string Name; - - /// - /// An unknown type. - /// - public static readonly SqlType Unknown = new SqlType("Unknown"); - - #region Numeric - - /// - /// Boolean. - /// - public static readonly SqlType Boolean = new SqlType("Boolean"); - /// - /// Signed byte (8 bit). - /// - public static readonly SqlType Int8 = new SqlType("Int8"); - /// - /// Unsigned byte (8 bit). - /// - public static readonly SqlType UInt8 = new SqlType("UInt8"); - /// - /// Small integer (16 bit). - /// - public static readonly SqlType Int16 = new SqlType("Int16"); - /// - /// Unsigned small integer (16 bit). - /// - public static readonly SqlType UInt16 = new SqlType("UInt16"); - /// - /// Integer (32 bit). - /// - public static readonly SqlType Int32 = new SqlType("Int32"); - /// - /// Unsigned integer (32 bit). - /// - public static readonly SqlType UInt32 = new SqlType("UInt32"); - /// - /// Long integer (64 bit). - /// - public static readonly SqlType Int64 = new SqlType("Int64"); - /// - /// Unsigned long (64 bit). - /// - public static readonly SqlType UInt64 = new SqlType("UInt64"); - /// - /// Numeric data type with fixed precision and scale. - /// - public static readonly SqlType Decimal = new SqlType("Decimal"); - - #endregion - - #region Real - - /// - /// Floating point number data from –3.40E + 38 through 3.40E + 38. - /// Storage size is 4 bytes. - /// - public static readonly SqlType Float = new SqlType("Float"); - /// - /// Floating point number data from - 1.79E + 308 through 1.79E + 308. - /// Storage size is 8 bytes. - /// - public static readonly SqlType Double = new SqlType("Double"); - - #endregion - - #region DateTime - - /// - /// Date and time data from January 1, 1753 through December 31, 9999, - /// to an accuracy of one three-hundredth of a second (equivalent to 3.33 - /// milliseconds or 0.00333 seconds). Values are rounded to increments - /// of .000, .003, or .007 seconds. - /// Storage size is 8 bytes. - /// - public static readonly SqlType DateTime = new SqlType("DateTime"); - - /// - /// Date and time data from January 1,1 A.D. through December 31, 9999 A.D., - /// to an accuracy of 100 nanoseconds. - /// Storage size is 8 to 10 bytes. - /// - public static readonly SqlType DateTimeOffset = new SqlType("DateTimeOffset"); - - /// - /// Datetime interval. - /// - public static readonly SqlType Interval = new SqlType("Interval"); - - #endregion - - #region String - - /// - /// Fixed-length Unicode character data of n characters. - /// n must be a value from 1 through 4,000. Storage size is two times n bytes. - /// The SQL-92 synonyms for nchar are national char and national character. - /// - public static readonly SqlType Char = new SqlType("Char"); - /// - /// Variable-length Unicode character data of n characters. - /// n must be a value from 1 through 4,000. Storage size, in bytes, is two times - /// the number of characters entered. The data entered can be 0 characters in length. - /// The SQL-92 synonyms for nvarchar are national char varying and national character varying. - /// - public static readonly SqlType VarChar = new SqlType("VarChar"); - - /// - /// Variable-length Unicode data with a maximum length of 2^30 - 1 (1,073,741,823) - /// characters. Storage size, in bytes, is two times the number of characters entered. - /// - public static readonly SqlType VarCharMax = new SqlType("VarCharMax"); - - #endregion - - #region Binary - - /// - /// Fixed-length binary data of n bytes. n must be a value from 1 through 8,000. - /// Storage size is n+4 bytes. - /// - public static readonly SqlType Binary = new SqlType("Binary"); - - /// - /// Variable-length binary data of n bytes. n must be a value from 1 through 8,000. - /// Storage size is the actual length of the data entered + 4 bytes, not n bytes. - /// The data entered can be 0 bytes in length. - /// The SQL-92 synonym for varbinary is binary varying. - /// - public static readonly SqlType VarBinary = new SqlType("VarBinary"); - - /// - /// Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes. - /// - public static readonly SqlType VarBinaryMax = new SqlType("VarBinaryMax"); - - #endregion - - #region Other - - /// - /// A globally unique identifier (GUID). - /// - public static readonly SqlType Guid = new SqlType("Guid"); - - #endregion - - #region Equality members - - /// - /// Implements the equality operator. - /// - /// The first argument. - /// The second argument. - /// The result of the operator. - public static bool operator ==(SqlType left, SqlType right) - { - return left.Equals(right); - } - - /// - /// Implements the inequality operator. - /// - /// The first argument. - /// The second argument. - /// The result of the operator. - public static bool operator !=(SqlType left, SqlType right) - { - return !(left==right); - } - - public bool Equals(SqlType other) - { - return string.Equals(Name, other.Name, StringComparison.Ordinal); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - return obj is SqlType && Equals((SqlType) obj); - } - - public override int GetHashCode() - { - return (Name!=null ? Name.GetHashCode() : 0); - } - - #endregion - - // Constructors - - public SqlType(string name) - { - Name = name; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; + +namespace Xtensive.Sql +{ + /// + /// Enumerates supported SQL column types. + /// + [Serializable] + public struct SqlType : IEquatable + { + public readonly string Name; + + /// + /// An unknown type. + /// + public static readonly SqlType Unknown = new SqlType("Unknown"); + + #region Numeric + + /// + /// Boolean. + /// + public static readonly SqlType Boolean = new SqlType("Boolean"); + /// + /// Signed byte (8 bit). + /// + public static readonly SqlType Int8 = new SqlType("Int8"); + /// + /// Unsigned byte (8 bit). + /// + public static readonly SqlType UInt8 = new SqlType("UInt8"); + /// + /// Small integer (16 bit). + /// + public static readonly SqlType Int16 = new SqlType("Int16"); + /// + /// Unsigned small integer (16 bit). + /// + public static readonly SqlType UInt16 = new SqlType("UInt16"); + /// + /// Integer (32 bit). + /// + public static readonly SqlType Int32 = new SqlType("Int32"); + /// + /// Unsigned integer (32 bit). + /// + public static readonly SqlType UInt32 = new SqlType("UInt32"); + /// + /// Long integer (64 bit). + /// + public static readonly SqlType Int64 = new SqlType("Int64"); + /// + /// Unsigned long (64 bit). + /// + public static readonly SqlType UInt64 = new SqlType("UInt64"); + /// + /// Numeric data type with fixed precision and scale. + /// + public static readonly SqlType Decimal = new SqlType("Decimal"); + + #endregion + + #region Real + + /// + /// Floating point number data from –3.40E + 38 through 3.40E + 38. + /// Storage size is 4 bytes. + /// + public static readonly SqlType Float = new SqlType("Float"); + /// + /// Floating point number data from - 1.79E + 308 through 1.79E + 308. + /// Storage size is 8 bytes. + /// + public static readonly SqlType Double = new SqlType("Double"); + + #endregion + + #region DateTime + + /// + /// Date and time data from January 1, 1753 through December 31, 9999, + /// to an accuracy of one three-hundredth of a second (equivalent to 3.33 + /// milliseconds or 0.00333 seconds). Values are rounded to increments + /// of .000, .003, or .007 seconds. + /// Storage size is 8 bytes. + /// + public static readonly SqlType DateTime = new SqlType("DateTime"); + + /// + /// Date and time data from January 1,1 A.D. through December 31, 9999 A.D., + /// to an accuracy of 100 nanoseconds. + /// Storage size is 8 to 10 bytes. + /// + public static readonly SqlType DateTimeOffset = new SqlType("DateTimeOffset"); + + /// + /// Datetime interval. + /// + public static readonly SqlType Interval = new SqlType("Interval"); + + #endregion + + #region String + + /// + /// Fixed-length Unicode character data of n characters. + /// n must be a value from 1 through 4,000. Storage size is two times n bytes. + /// The SQL-92 synonyms for nchar are national char and national character. + /// + public static readonly SqlType Char = new SqlType("Char"); + /// + /// Variable-length Unicode character data of n characters. + /// n must be a value from 1 through 4,000. Storage size, in bytes, is two times + /// the number of characters entered. The data entered can be 0 characters in length. + /// The SQL-92 synonyms for nvarchar are national char varying and national character varying. + /// + public static readonly SqlType VarChar = new SqlType("VarChar"); + + /// + /// Variable-length Unicode data with a maximum length of 2^30 - 1 (1,073,741,823) + /// characters. Storage size, in bytes, is two times the number of characters entered. + /// + public static readonly SqlType VarCharMax = new SqlType("VarCharMax"); + + #endregion + + #region Binary + + /// + /// Fixed-length binary data of n bytes. n must be a value from 1 through 8,000. + /// Storage size is n+4 bytes. + /// + public static readonly SqlType Binary = new SqlType("Binary"); + + /// + /// Variable-length binary data of n bytes. n must be a value from 1 through 8,000. + /// Storage size is the actual length of the data entered + 4 bytes, not n bytes. + /// The data entered can be 0 bytes in length. + /// The SQL-92 synonym for varbinary is binary varying. + /// + public static readonly SqlType VarBinary = new SqlType("VarBinary"); + + /// + /// Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes. + /// + public static readonly SqlType VarBinaryMax = new SqlType("VarBinaryMax"); + + #endregion + + #region Other + + /// + /// A globally unique identifier (GUID). + /// + public static readonly SqlType Guid = new SqlType("Guid"); + + #endregion + + #region Equality members + + /// + /// Implements the equality operator. + /// + /// The first argument. + /// The second argument. + /// The result of the operator. + public static bool operator ==(SqlType left, SqlType right) + { + return left.Equals(right); + } + + /// + /// Implements the inequality operator. + /// + /// The first argument. + /// The second argument. + /// The result of the operator. + public static bool operator !=(SqlType left, SqlType right) + { + return !(left==right); + } + + public bool Equals(SqlType other) + { + return string.Equals(Name, other.Name, StringComparison.Ordinal); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + return obj is SqlType && Equals((SqlType) obj); + } + + public override int GetHashCode() + { + return (Name!=null ? Name.GetHashCode() : 0); + } + + #endregion + + // Constructors + + public SqlType(string name) + { + Name = name; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/SqlValueType.cs b/Orm/Xtensive.Orm/Sql/SqlValueType.cs index d08623b1b7..5ec3d0c4d2 100644 --- a/Orm/Xtensive.Orm/Sql/SqlValueType.cs +++ b/Orm/Xtensive.Orm/Sql/SqlValueType.cs @@ -1,241 +1,241 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. - -using System; -using Xtensive.Core; - - -namespace Xtensive.Sql -{ - /// - /// Represents an SQL type with specific , and . - /// - [Serializable] - public sealed class SqlValueType - : IEquatable - { - /// - /// Gets the . - /// - public SqlType Type { get; private set; } - - /// - /// Gets the name of the type in case when has value . - /// - public string TypeName { get; private set; } - - /// - /// Gets or sets the length. - /// - public int? Length { get; private set; } - - /// - /// Gets the scale. - /// - public int? Scale { get; private set; } - - /// - /// Gets the precision. - /// - public int? Precision { get; private set; } - - /// - public override int GetHashCode() - { - unchecked { - int result = Type.GetHashCode(); - result = 29*result + Length.GetHashCode(); - result = 29*result + Scale.GetHashCode(); - result = 29*result + Precision.GetHashCode(); - return result; - } - } - - /// - public bool Equals(SqlValueType other) - { - if (ReferenceEquals(other, null)) - return false; - return - other.Type==Type && - other.TypeName==TypeName && - other.Length==Length && - other.Precision==Precision && - other.Scale==Scale; - } - - /// - public override bool Equals(object obj) - { - return Equals(obj as SqlValueType); - } - - /// - /// Implements the operator ==. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator ==(SqlValueType left, SqlValueType right) - { - if (ReferenceEquals(left, right)) - return true; - if (ReferenceEquals(left, null)) - return false; - if (ReferenceEquals(right, null)) - return false; - return left.Equals(right); - } - - /// - /// Implements the operator !=. - /// - /// The left. - /// The right. - /// The result of the operator. - public static bool operator !=(SqlValueType left, SqlValueType right) - { - return !(left==right); - } - - public static bool IsNumeric(SqlValueType valueType) - { - var sqlType = valueType.Type; - - if (sqlType==SqlType.UInt8 || - sqlType==SqlType.Decimal || - sqlType==SqlType.Double || - sqlType==SqlType.Float || - sqlType==SqlType.Int16 || - sqlType==SqlType.Int32 || - sqlType==SqlType.Int64 || - sqlType==SqlType.Int8 || - sqlType==SqlType.UInt16 || - sqlType==SqlType.UInt32 || - sqlType==SqlType.UInt64) - return true; - return false; - } - - public static bool IsExactNumeric(SqlValueType valueType) - { - var sqlType = valueType.Type; - - if (sqlType==SqlType.UInt8 || - sqlType==SqlType.Decimal || - sqlType==SqlType.Int16 || - sqlType==SqlType.Int32 || - sqlType==SqlType.Int64 || - sqlType==SqlType.Int8 || - sqlType==SqlType.UInt16 || - sqlType==SqlType.UInt32 || - sqlType==SqlType.UInt64) - return true; - return false; - } - - public override string ToString() - { - if (TypeName!=null) - return TypeName; - if (Length!=null) - return string.Format("{0}({1})", Type, Length.Value); - if (Precision!=null) - return string.Format("{0}({1},{2})", Type, Precision.Value, Scale.Value); - return Type.ToString(); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The type. - public SqlValueType(SqlType type) - : this(type, null, null, null, null) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The type. - /// The length. - public SqlValueType(SqlType type, int length) - : this(type, null, length, null, null) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The type. - /// The precision. - /// The scale. - public SqlValueType(SqlType type, int precision, int scale) - : this(type, null, null, precision, scale) - { - } - - /// - /// Initializes new instance of this type. - /// - /// Name of the type. - public SqlValueType(string typeName) - : this(SqlType.Unknown, typeName, null, null, null) - { - } - - /// - /// Initializes new instance of this type. - /// - /// Name of the type. - /// The length. - public SqlValueType(string typeName, int length) - : this(SqlType.Unknown, typeName, length, null, null) - { - } - - /// - /// Initializes new instance of this type. - /// - /// Name of the type. - /// The precision. - /// The scale. - public SqlValueType(string typeName, int precision, int scale) - : this(SqlType.Unknown, typeName, null, precision, scale) - { - } - - /// - /// Initializes new instance of this type. - /// - /// The type. - /// Name of the type. - /// The length. - /// The precision. - /// The scale. - public SqlValueType(SqlType type, string typeName, int? length, int? precision, int? scale) - { - if ((type==SqlType.Unknown)!=(typeName!=null)) - throw new ArgumentException(Strings.ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown); - if (precision.HasValue && precision != 0 && length.HasValue && length != 0) - throw new ArgumentException(Strings.ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether); - if (precision.HasValue!=scale.HasValue) - throw new ArgumentException(Strings.ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether); - if (typeName!=null) - ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, "typeName"); - if (length!=null) - ArgumentValidator.EnsureArgumentIsGreaterThan(length.Value, 0, "length"); - if (precision!=null) - ArgumentValidator.EnsureArgumentIsInRange(scale.Value, 0, precision.Value, "scale"); - Type = type; - TypeName = typeName; - Length = length; - Precision = precision; - Scale = scale; - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. + +using System; +using Xtensive.Core; + + +namespace Xtensive.Sql +{ + /// + /// Represents an SQL type with specific , and . + /// + [Serializable] + public sealed class SqlValueType + : IEquatable + { + /// + /// Gets the . + /// + public SqlType Type { get; private set; } + + /// + /// Gets the name of the type in case when has value . + /// + public string TypeName { get; private set; } + + /// + /// Gets or sets the length. + /// + public int? Length { get; private set; } + + /// + /// Gets the scale. + /// + public int? Scale { get; private set; } + + /// + /// Gets the precision. + /// + public int? Precision { get; private set; } + + /// + public override int GetHashCode() + { + unchecked { + int result = Type.GetHashCode(); + result = 29*result + Length.GetHashCode(); + result = 29*result + Scale.GetHashCode(); + result = 29*result + Precision.GetHashCode(); + return result; + } + } + + /// + public bool Equals(SqlValueType other) + { + if (ReferenceEquals(other, null)) + return false; + return + other.Type==Type && + other.TypeName==TypeName && + other.Length==Length && + other.Precision==Precision && + other.Scale==Scale; + } + + /// + public override bool Equals(object obj) + { + return Equals(obj as SqlValueType); + } + + /// + /// Implements the operator ==. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator ==(SqlValueType left, SqlValueType right) + { + if (ReferenceEquals(left, right)) + return true; + if (ReferenceEquals(left, null)) + return false; + if (ReferenceEquals(right, null)) + return false; + return left.Equals(right); + } + + /// + /// Implements the operator !=. + /// + /// The left. + /// The right. + /// The result of the operator. + public static bool operator !=(SqlValueType left, SqlValueType right) + { + return !(left==right); + } + + public static bool IsNumeric(SqlValueType valueType) + { + var sqlType = valueType.Type; + + if (sqlType==SqlType.UInt8 || + sqlType==SqlType.Decimal || + sqlType==SqlType.Double || + sqlType==SqlType.Float || + sqlType==SqlType.Int16 || + sqlType==SqlType.Int32 || + sqlType==SqlType.Int64 || + sqlType==SqlType.Int8 || + sqlType==SqlType.UInt16 || + sqlType==SqlType.UInt32 || + sqlType==SqlType.UInt64) + return true; + return false; + } + + public static bool IsExactNumeric(SqlValueType valueType) + { + var sqlType = valueType.Type; + + if (sqlType==SqlType.UInt8 || + sqlType==SqlType.Decimal || + sqlType==SqlType.Int16 || + sqlType==SqlType.Int32 || + sqlType==SqlType.Int64 || + sqlType==SqlType.Int8 || + sqlType==SqlType.UInt16 || + sqlType==SqlType.UInt32 || + sqlType==SqlType.UInt64) + return true; + return false; + } + + public override string ToString() + { + if (TypeName!=null) + return TypeName; + if (Length!=null) + return string.Format("{0}({1})", Type, Length.Value); + if (Precision!=null) + return string.Format("{0}({1},{2})", Type, Precision.Value, Scale.Value); + return Type.ToString(); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The type. + public SqlValueType(SqlType type) + : this(type, null, null, null, null) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The type. + /// The length. + public SqlValueType(SqlType type, int length) + : this(type, null, length, null, null) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The type. + /// The precision. + /// The scale. + public SqlValueType(SqlType type, int precision, int scale) + : this(type, null, null, precision, scale) + { + } + + /// + /// Initializes new instance of this type. + /// + /// Name of the type. + public SqlValueType(string typeName) + : this(SqlType.Unknown, typeName, null, null, null) + { + } + + /// + /// Initializes new instance of this type. + /// + /// Name of the type. + /// The length. + public SqlValueType(string typeName, int length) + : this(SqlType.Unknown, typeName, length, null, null) + { + } + + /// + /// Initializes new instance of this type. + /// + /// Name of the type. + /// The precision. + /// The scale. + public SqlValueType(string typeName, int precision, int scale) + : this(SqlType.Unknown, typeName, null, precision, scale) + { + } + + /// + /// Initializes new instance of this type. + /// + /// The type. + /// Name of the type. + /// The length. + /// The precision. + /// The scale. + public SqlValueType(SqlType type, string typeName, int? length, int? precision, int? scale) + { + if ((type==SqlType.Unknown)!=(typeName!=null)) + throw new ArgumentException(Strings.ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown); + if (precision.HasValue && precision != 0 && length.HasValue && length != 0) + throw new ArgumentException(Strings.ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether); + if (precision.HasValue!=scale.HasValue) + throw new ArgumentException(Strings.ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether); + if (typeName!=null) + ArgumentValidator.EnsureArgumentNotNullOrEmpty(typeName, "typeName"); + if (length!=null) + ArgumentValidator.EnsureArgumentIsGreaterThan(length.Value, 0, "length"); + if (precision!=null) + ArgumentValidator.EnsureArgumentIsInRange(scale.Value, 0, precision.Value, "scale"); + Type = type; + TypeName = typeName; + Length = length; + Precision = precision; + Scale = scale; + } + } +} diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/CustomTypeMapper.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/CustomTypeMapper.cs index e523677fc1..30d8c0e8a6 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/CustomTypeMapper.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/CustomTypeMapper.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.07 - -using System; -using System.Data.Common; - -namespace Xtensive.Sql -{ - public abstract class CustomTypeMapper - { - public abstract Type Type { get; } - - public virtual bool Enabled { get { return true; } } - - public virtual bool ParameterCastRequired { get { return false; } } - - public abstract object ReadValue(DbDataReader reader, int index); - - public abstract void BindValue(DbParameter parameter, object value); - - public abstract SqlValueType MapType(int? length, int? precision, int? scale); - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.07 + +using System; +using System.Data.Common; + +namespace Xtensive.Sql +{ + public abstract class CustomTypeMapper + { + public abstract Type Type { get; } + + public virtual bool Enabled { get { return true; } } + + public virtual bool ParameterCastRequired { get { return false; } } + + public abstract object ReadValue(DbDataReader reader, int index); + + public abstract void BindValue(DbParameter parameter, object value); + + public abstract SqlValueType MapType(int? length, int? precision, int? scale); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapper.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapper.cs index 3a52bb3427..45636c6669 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapper.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapper.cs @@ -1,425 +1,425 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.06.19 - -using System; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.IO; -using System.Linq; -using System.Runtime.Serialization.Formatters.Binary; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql -{ - /// - /// Abstract base class for any value (data) type mapper. - /// - public abstract class TypeMapper - { - private const int DecimalPrecisionLimit = 60; - - private static readonly ValueRange Int64TimeSpanRange = new ValueRange( - TimeSpan.FromTicks(TimeSpan.MinValue.Ticks / 100), - TimeSpan.FromTicks(TimeSpan.MaxValue.Ticks / 100)); - - public SqlDriver Driver { get; private set; } - - protected int? MaxDecimalPrecision { get; private set; } - protected int? VarCharMaxLength { get; private set; } - protected int? VarBinaryMaxLength { get; private set; } - - public virtual bool IsParameterCastRequired(Type type) - { - return false; - } - - #region BindXxx methods - - public virtual void BindBoolean(DbParameter parameter, object value) - { - parameter.DbType = DbType.Boolean; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindChar(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - if (value==null) { - parameter.Value = DBNull.Value; - return; - } - var _char = (char) value; - parameter.Value = _char==default(char) ? string.Empty : _char.ToString(); - } - - public virtual void BindString(DbParameter parameter, object value) - { - parameter.DbType = DbType.String; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.Byte; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindSByte(DbParameter parameter, object value) - { - parameter.DbType = DbType.SByte; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int16; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindUShort(DbParameter parameter, object value) - { - parameter.DbType = DbType.UInt16; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int32; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindUInt(DbParameter parameter, object value) - { - parameter.DbType = DbType.UInt32; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindLong(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int64; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindULong(DbParameter parameter, object value) - { - parameter.DbType = DbType.UInt64; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindFloat(DbParameter parameter, object value) - { - parameter.DbType = DbType.Single; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindDouble(DbParameter parameter, object value) - { - parameter.DbType = DbType.Double; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindDecimal(DbParameter parameter, object value) - { - parameter.DbType = DbType.Decimal; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindDateTime(DbParameter parameter, object value) - { - parameter.DbType = DbType.DateTime; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindDateTimeOffset(DbParameter parameter, object value) - { - parameter.DbType = DbType.DateTimeOffset; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindTimeSpan(DbParameter parameter, object value) - { - parameter.DbType = DbType.Int64; - if (value!=null) { - var timeSpan = ValueRangeValidator.Correct((TimeSpan) value, Int64TimeSpanRange); - parameter.Value = timeSpan.Ticks * 100; - } - else - parameter.Value = DBNull.Value; - } - - public virtual void BindGuid(DbParameter parameter, object value) - { - parameter.DbType = DbType.Guid; - parameter.Value = value ?? DBNull.Value; - } - - public virtual void BindByteArray(DbParameter parameter, object value) - { - parameter.DbType = DbType.Binary; - parameter.Value = value ?? DBNull.Value; - } - - #endregion - - #region ReadXxx methods - - public virtual object ReadBoolean(DbDataReader reader, int index) - { - return reader.GetBoolean(index); - } - - public virtual object ReadChar(DbDataReader reader, int index) - { - return reader.GetString(index).SingleOrDefault(); - } - - public virtual object ReadString(DbDataReader reader, int index) - { - return reader.GetString(index); - } - - public virtual object ReadByte(DbDataReader reader, int index) - { - return reader.GetByte(index); - } - - public virtual object ReadSByte(DbDataReader reader, int index) - { - return Convert.ToSByte(reader[index]); - } - - public virtual object ReadShort(DbDataReader reader, int index) - { - return reader.GetInt16(index); - } - - public virtual object ReadUShort(DbDataReader reader, int index) - { - return Convert.ToUInt16(reader[index]); - } - - public virtual object ReadInt(DbDataReader reader, int index) - { - return reader.GetInt32(index); - } - - public virtual object ReadUInt(DbDataReader reader, int index) - { - return Convert.ToUInt32(reader[index]); - } - - public virtual object ReadLong(DbDataReader reader, int index) - { - return reader.GetInt64(index); - } - - public virtual object ReadULong(DbDataReader reader, int index) - { - return Convert.ToUInt64(reader[index]); - } - - public virtual object ReadFloat(DbDataReader reader, int index) - { - return reader.GetFloat(index); - } - - public virtual object ReadDouble(DbDataReader reader, int index) - { - return reader.GetDouble(index); - } - - public virtual object ReadDecimal(DbDataReader reader, int index) - { - return reader.GetDecimal(index); - } - - public virtual object ReadDateTime(DbDataReader reader, int index) - { - return reader.GetDateTime(index); - } - - public virtual object ReadDateTimeOffset(DbDataReader reader, int index) - { - return (DateTimeOffset) reader.GetValue(index); - } - - public virtual object ReadTimeSpan(DbDataReader reader, int index) - { - long value; - try { - value = reader.GetInt64(index); - } - catch (InvalidCastException) { - value = (long) reader.GetDecimal(index); - } - return TimeSpan.FromTicks(value / 100); - } - - public virtual object ReadGuid(DbDataReader reader, int index) - { - return reader.GetGuid(index); - } - - public virtual object ReadByteArray(DbDataReader reader, int index) - { - var value = reader[index]; - if (value == null || value is byte[]) - return value; - - var formatter = new BinaryFormatter(); - var stream = new MemoryStream(); - formatter.Serialize(stream, value); - return stream.ToArray(); - } - - #endregion - - #region MapXxx methods - - public virtual SqlValueType MapBoolean(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Boolean); - } - - public virtual SqlValueType MapChar(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.VarChar, 1); - } - - public virtual SqlValueType MapString(int? length, int? precision, int? scale) - { - return ChooseStreamType(SqlType.VarChar, SqlType.VarCharMax, length, VarCharMaxLength); - } - - public virtual SqlValueType MapByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.UInt8); - } - - public virtual SqlValueType MapSByte(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int8); - } - - public virtual SqlValueType MapShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int16); - } - - public virtual SqlValueType MapUShort(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.UInt16); - } - - public virtual SqlValueType MapInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int32); - } - - public virtual SqlValueType MapUInt(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.UInt32); - } - - public virtual SqlValueType MapLong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - public virtual SqlValueType MapULong(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.UInt64); - } - - public virtual SqlValueType MapFloat(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Float); - } - - public virtual SqlValueType MapDouble(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Double); - } - - public virtual SqlValueType MapDecimal(int? length, int? precision, int? scale) - { - if (MaxDecimalPrecision==null) - return new SqlValueType(SqlType.Decimal); - if (precision==null) { - var resultPrecision = Math.Min(DecimalPrecisionLimit, MaxDecimalPrecision.Value); - var resultScale = resultPrecision / 2; - return new SqlValueType(SqlType.Decimal, resultPrecision, resultScale); - } - if (precision.Value > MaxDecimalPrecision.Value) - throw new InvalidOperationException(string.Format( - Strings.ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY, - precision.Value, MaxDecimalPrecision.Value)); - return new SqlValueType(SqlType.Decimal, null, null, precision, scale); - } - - public virtual SqlValueType MapDateTime(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.DateTime); - } - - public virtual SqlValueType MapDateTimeOffset(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.DateTimeOffset); - } - - public virtual SqlValueType MapTimeSpan(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Int64); - } - - public virtual SqlValueType MapGuid(int? length, int? precision, int? scale) - { - return new SqlValueType(SqlType.Guid); - } - - public virtual SqlValueType MapByteArray(int? length, int? precision, int? scale) - { - return ChooseStreamType(SqlType.VarBinary, SqlType.VarBinaryMax, length, VarBinaryMaxLength); - } - - #endregion - - protected static SqlValueType ChooseStreamType(SqlType varType, SqlType varMaxType, int? length, int? varTypeMaxLength) - { - if (varTypeMaxLength==null) - return new SqlValueType(varMaxType); - if (length==null) - return new SqlValueType(varType, varTypeMaxLength.Value); - if (length.Value > varTypeMaxLength.Value) - return new SqlValueType(varMaxType); - return new SqlValueType(varType, length.Value); - } - - /// - /// Initializes this instance. - /// - public virtual void Initialize() - { - var varchar = Driver.ServerInfo.DataTypes.VarChar; - if (varchar!=null) - VarCharMaxLength = varchar.MaxLength; - var varbinary = Driver.ServerInfo.DataTypes.VarBinary; - if (varbinary!=null) - VarBinaryMaxLength = varbinary.MaxLength; - var _decimal = Driver.ServerInfo.DataTypes.Decimal; - if (_decimal!=null) - MaxDecimalPrecision = _decimal.MaxPrecision; - } - - // Constructors - - protected TypeMapper(SqlDriver driver) - { - Driver = driver; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.06.19 + +using System; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql +{ + /// + /// Abstract base class for any value (data) type mapper. + /// + public abstract class TypeMapper + { + private const int DecimalPrecisionLimit = 60; + + private static readonly ValueRange Int64TimeSpanRange = new ValueRange( + TimeSpan.FromTicks(TimeSpan.MinValue.Ticks / 100), + TimeSpan.FromTicks(TimeSpan.MaxValue.Ticks / 100)); + + public SqlDriver Driver { get; private set; } + + protected int? MaxDecimalPrecision { get; private set; } + protected int? VarCharMaxLength { get; private set; } + protected int? VarBinaryMaxLength { get; private set; } + + public virtual bool IsParameterCastRequired(Type type) + { + return false; + } + + #region BindXxx methods + + public virtual void BindBoolean(DbParameter parameter, object value) + { + parameter.DbType = DbType.Boolean; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindChar(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + if (value==null) { + parameter.Value = DBNull.Value; + return; + } + var _char = (char) value; + parameter.Value = _char==default(char) ? string.Empty : _char.ToString(); + } + + public virtual void BindString(DbParameter parameter, object value) + { + parameter.DbType = DbType.String; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.Byte; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindSByte(DbParameter parameter, object value) + { + parameter.DbType = DbType.SByte; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int16; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindUShort(DbParameter parameter, object value) + { + parameter.DbType = DbType.UInt16; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int32; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindUInt(DbParameter parameter, object value) + { + parameter.DbType = DbType.UInt32; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindLong(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int64; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindULong(DbParameter parameter, object value) + { + parameter.DbType = DbType.UInt64; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindFloat(DbParameter parameter, object value) + { + parameter.DbType = DbType.Single; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindDouble(DbParameter parameter, object value) + { + parameter.DbType = DbType.Double; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindDecimal(DbParameter parameter, object value) + { + parameter.DbType = DbType.Decimal; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindDateTime(DbParameter parameter, object value) + { + parameter.DbType = DbType.DateTime; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindDateTimeOffset(DbParameter parameter, object value) + { + parameter.DbType = DbType.DateTimeOffset; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindTimeSpan(DbParameter parameter, object value) + { + parameter.DbType = DbType.Int64; + if (value!=null) { + var timeSpan = ValueRangeValidator.Correct((TimeSpan) value, Int64TimeSpanRange); + parameter.Value = timeSpan.Ticks * 100; + } + else + parameter.Value = DBNull.Value; + } + + public virtual void BindGuid(DbParameter parameter, object value) + { + parameter.DbType = DbType.Guid; + parameter.Value = value ?? DBNull.Value; + } + + public virtual void BindByteArray(DbParameter parameter, object value) + { + parameter.DbType = DbType.Binary; + parameter.Value = value ?? DBNull.Value; + } + + #endregion + + #region ReadXxx methods + + public virtual object ReadBoolean(DbDataReader reader, int index) + { + return reader.GetBoolean(index); + } + + public virtual object ReadChar(DbDataReader reader, int index) + { + return reader.GetString(index).SingleOrDefault(); + } + + public virtual object ReadString(DbDataReader reader, int index) + { + return reader.GetString(index); + } + + public virtual object ReadByte(DbDataReader reader, int index) + { + return reader.GetByte(index); + } + + public virtual object ReadSByte(DbDataReader reader, int index) + { + return Convert.ToSByte(reader[index]); + } + + public virtual object ReadShort(DbDataReader reader, int index) + { + return reader.GetInt16(index); + } + + public virtual object ReadUShort(DbDataReader reader, int index) + { + return Convert.ToUInt16(reader[index]); + } + + public virtual object ReadInt(DbDataReader reader, int index) + { + return reader.GetInt32(index); + } + + public virtual object ReadUInt(DbDataReader reader, int index) + { + return Convert.ToUInt32(reader[index]); + } + + public virtual object ReadLong(DbDataReader reader, int index) + { + return reader.GetInt64(index); + } + + public virtual object ReadULong(DbDataReader reader, int index) + { + return Convert.ToUInt64(reader[index]); + } + + public virtual object ReadFloat(DbDataReader reader, int index) + { + return reader.GetFloat(index); + } + + public virtual object ReadDouble(DbDataReader reader, int index) + { + return reader.GetDouble(index); + } + + public virtual object ReadDecimal(DbDataReader reader, int index) + { + return reader.GetDecimal(index); + } + + public virtual object ReadDateTime(DbDataReader reader, int index) + { + return reader.GetDateTime(index); + } + + public virtual object ReadDateTimeOffset(DbDataReader reader, int index) + { + return (DateTimeOffset) reader.GetValue(index); + } + + public virtual object ReadTimeSpan(DbDataReader reader, int index) + { + long value; + try { + value = reader.GetInt64(index); + } + catch (InvalidCastException) { + value = (long) reader.GetDecimal(index); + } + return TimeSpan.FromTicks(value / 100); + } + + public virtual object ReadGuid(DbDataReader reader, int index) + { + return reader.GetGuid(index); + } + + public virtual object ReadByteArray(DbDataReader reader, int index) + { + var value = reader[index]; + if (value == null || value is byte[]) + return value; + + var formatter = new BinaryFormatter(); + var stream = new MemoryStream(); + formatter.Serialize(stream, value); + return stream.ToArray(); + } + + #endregion + + #region MapXxx methods + + public virtual SqlValueType MapBoolean(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Boolean); + } + + public virtual SqlValueType MapChar(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.VarChar, 1); + } + + public virtual SqlValueType MapString(int? length, int? precision, int? scale) + { + return ChooseStreamType(SqlType.VarChar, SqlType.VarCharMax, length, VarCharMaxLength); + } + + public virtual SqlValueType MapByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.UInt8); + } + + public virtual SqlValueType MapSByte(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int8); + } + + public virtual SqlValueType MapShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int16); + } + + public virtual SqlValueType MapUShort(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.UInt16); + } + + public virtual SqlValueType MapInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int32); + } + + public virtual SqlValueType MapUInt(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.UInt32); + } + + public virtual SqlValueType MapLong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + public virtual SqlValueType MapULong(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.UInt64); + } + + public virtual SqlValueType MapFloat(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Float); + } + + public virtual SqlValueType MapDouble(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Double); + } + + public virtual SqlValueType MapDecimal(int? length, int? precision, int? scale) + { + if (MaxDecimalPrecision==null) + return new SqlValueType(SqlType.Decimal); + if (precision==null) { + var resultPrecision = Math.Min(DecimalPrecisionLimit, MaxDecimalPrecision.Value); + var resultScale = resultPrecision / 2; + return new SqlValueType(SqlType.Decimal, resultPrecision, resultScale); + } + if (precision.Value > MaxDecimalPrecision.Value) + throw new InvalidOperationException(string.Format( + Strings.ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY, + precision.Value, MaxDecimalPrecision.Value)); + return new SqlValueType(SqlType.Decimal, null, null, precision, scale); + } + + public virtual SqlValueType MapDateTime(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.DateTime); + } + + public virtual SqlValueType MapDateTimeOffset(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.DateTimeOffset); + } + + public virtual SqlValueType MapTimeSpan(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Int64); + } + + public virtual SqlValueType MapGuid(int? length, int? precision, int? scale) + { + return new SqlValueType(SqlType.Guid); + } + + public virtual SqlValueType MapByteArray(int? length, int? precision, int? scale) + { + return ChooseStreamType(SqlType.VarBinary, SqlType.VarBinaryMax, length, VarBinaryMaxLength); + } + + #endregion + + protected static SqlValueType ChooseStreamType(SqlType varType, SqlType varMaxType, int? length, int? varTypeMaxLength) + { + if (varTypeMaxLength==null) + return new SqlValueType(varMaxType); + if (length==null) + return new SqlValueType(varType, varTypeMaxLength.Value); + if (length.Value > varTypeMaxLength.Value) + return new SqlValueType(varMaxType); + return new SqlValueType(varType, length.Value); + } + + /// + /// Initializes this instance. + /// + public virtual void Initialize() + { + var varchar = Driver.ServerInfo.DataTypes.VarChar; + if (varchar!=null) + VarCharMaxLength = varchar.MaxLength; + var varbinary = Driver.ServerInfo.DataTypes.VarBinary; + if (varbinary!=null) + VarBinaryMaxLength = varbinary.MaxLength; + var _decimal = Driver.ServerInfo.DataTypes.Decimal; + if (_decimal!=null) + MaxDecimalPrecision = _decimal.MaxPrecision; + } + + // Constructors + + protected TypeMapper(SqlDriver driver) + { + Driver = driver; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapping.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapping.cs index 5841e47330..61a94a1333 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapping.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMapping.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.03 - -using System; -using System.Data.Common; - -namespace Xtensive.Sql -{ - /// - /// Value (data) type mapping. - /// - public sealed class TypeMapping - { - private readonly Func valueReader; - private readonly Action valueBinder; - private readonly Func mapper; - - public Type Type { get; private set; } - public bool ParameterCastRequired { get; private set; } - - public object ReadValue(DbDataReader reader, int index) - { - return valueReader.Invoke(reader, index); - } - - public void BindValue(DbParameter parameter, object value) - { - valueBinder.Invoke(parameter, value); - } - - public SqlValueType MapType() - { - return mapper.Invoke(null, null, null); - } - - public SqlValueType MapType(int? length, int? precision, int? scale) - { - return mapper.Invoke(length, precision, scale); - } - - - // Constructors - - internal TypeMapping(Type type, - Func valueReader, - Action valueBinder, - Func mapper, - bool parameterCastRequired) - { - Type = type; - - this.valueReader = valueReader; - this.valueBinder = valueBinder; - this.mapper = mapper; - - ParameterCastRequired = parameterCastRequired; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.03 + +using System; +using System.Data.Common; + +namespace Xtensive.Sql +{ + /// + /// Value (data) type mapping. + /// + public sealed class TypeMapping + { + private readonly Func valueReader; + private readonly Action valueBinder; + private readonly Func mapper; + + public Type Type { get; private set; } + public bool ParameterCastRequired { get; private set; } + + public object ReadValue(DbDataReader reader, int index) + { + return valueReader.Invoke(reader, index); + } + + public void BindValue(DbParameter parameter, object value) + { + valueBinder.Invoke(parameter, value); + } + + public SqlValueType MapType() + { + return mapper.Invoke(null, null, null); + } + + public SqlValueType MapType(int? length, int? precision, int? scale) + { + return mapper.Invoke(length, precision, scale); + } + + + // Constructors + + internal TypeMapping(Type type, + Func valueReader, + Action valueBinder, + Func mapper, + bool parameterCastRequired) + { + Type = type; + + this.valueReader = valueReader; + this.valueBinder = valueBinder; + this.mapper = mapper; + + ParameterCastRequired = parameterCastRequired; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistry.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistry.cs index 1d4a8f3c3e..adad1e3b86 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistry.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistry.cs @@ -1,66 +1,66 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.07.03 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Reflection; - -namespace Xtensive.Sql -{ - /// - /// A collection of objects. - /// - public sealed class TypeMappingRegistry - { - public ReadOnlyDictionary Mappings { get; private set; } - public ReadOnlyDictionary ReverseMappings { get; private set; } - - public TypeMapping this[Type type] { get { return GetMapping(type); } } - - public TypeMapping TryGetMapping(Type type) - { - if (type.IsEnum) - type = Enum.GetUnderlyingType(type); - - TypeMapping result; - Mappings.TryGetValue(type, out result); - return result; - } - - public TypeMapping GetMapping(Type type) - { - var result = TryGetMapping(type); - if (result==null) - throw new NotSupportedException(string.Format( - Strings.ExTypeXIsNotSupported, type.GetFullName())); - return result; - } - - /// - /// Converts the specified to corresponding .NET type. - /// - /// The type to convert. - /// Converter type. - public Type MapSqlType(SqlType sqlType) - { - Type type; - if (!ReverseMappings.TryGetValue(sqlType, out type)) - throw new NotSupportedException(string.Format( - Strings.ExTypeXIsNotSupported, sqlType.Name)); - return type; - } - - // Constructors - - public TypeMappingRegistry(IEnumerable mappings, IEnumerable> reverseMappings) - { - Mappings = new ReadOnlyDictionary(mappings.ToDictionary(m => m.Type)); - ReverseMappings = new ReadOnlyDictionary(reverseMappings.ToDictionary(r => r.Key, r => r.Value), true); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.07.03 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Reflection; + +namespace Xtensive.Sql +{ + /// + /// A collection of objects. + /// + public sealed class TypeMappingRegistry + { + public ReadOnlyDictionary Mappings { get; private set; } + public ReadOnlyDictionary ReverseMappings { get; private set; } + + public TypeMapping this[Type type] { get { return GetMapping(type); } } + + public TypeMapping TryGetMapping(Type type) + { + if (type.IsEnum) + type = Enum.GetUnderlyingType(type); + + TypeMapping result; + Mappings.TryGetValue(type, out result); + return result; + } + + public TypeMapping GetMapping(Type type) + { + var result = TryGetMapping(type); + if (result==null) + throw new NotSupportedException(string.Format( + Strings.ExTypeXIsNotSupported, type.GetFullName())); + return result; + } + + /// + /// Converts the specified to corresponding .NET type. + /// + /// The type to convert. + /// Converter type. + public Type MapSqlType(SqlType sqlType) + { + Type type; + if (!ReverseMappings.TryGetValue(sqlType, out type)) + throw new NotSupportedException(string.Format( + Strings.ExTypeXIsNotSupported, sqlType.Name)); + return type; + } + + // Constructors + + public TypeMappingRegistry(IEnumerable mappings, IEnumerable> reverseMappings) + { + Mappings = new ReadOnlyDictionary(mappings.ToDictionary(m => m.Type)); + ReverseMappings = new ReadOnlyDictionary(reverseMappings.ToDictionary(r => r.Key, r => r.Value), true); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistryBuilder.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistryBuilder.cs index da7a9de348..89e0fd7942 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistryBuilder.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/TypeMappingRegistryBuilder.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.06.07 - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using Xtensive.Core; - -namespace Xtensive.Sql -{ - public sealed class TypeMappingRegistryBuilder - { - public TypeMapper Mapper { get; private set; } - - private readonly List mappings = new List(); - private readonly Dictionary reverseMappings = new Dictionary(); - - public void Add(Type type, Func valueReader, - Action valueBinder, Func mapper) - { - var mapping = new TypeMapping( - type, valueReader, valueBinder, - mapper, Mapper.IsParameterCastRequired(type)); - - mappings.Add(mapping); - } - - public void Add(CustomTypeMapper customMapper) - { - // Allow custom mapper to dynamically disable itself - if (!customMapper.Enabled) - return; - - var mapping = new TypeMapping( - customMapper.Type, customMapper.ReadValue, customMapper.BindValue, - customMapper.MapType, customMapper.ParameterCastRequired); - - mappings.Add(mapping); - } - - public void AddReverse(SqlType sqlType, Type type) - { - reverseMappings.Add(sqlType, type); - } - - public TypeMappingRegistry Build() - { - return new TypeMappingRegistry(mappings, reverseMappings); - } - - // Constructors - - public TypeMappingRegistryBuilder(TypeMapper mapper) - { - ArgumentValidator.EnsureArgumentNotNull(mapper, "mapper"); - Mapper = mapper; - } - } +// Copyright (C) 2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.06.07 + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using Xtensive.Core; + +namespace Xtensive.Sql +{ + public sealed class TypeMappingRegistryBuilder + { + public TypeMapper Mapper { get; private set; } + + private readonly List mappings = new List(); + private readonly Dictionary reverseMappings = new Dictionary(); + + public void Add(Type type, Func valueReader, + Action valueBinder, Func mapper) + { + var mapping = new TypeMapping( + type, valueReader, valueBinder, + mapper, Mapper.IsParameterCastRequired(type)); + + mappings.Add(mapping); + } + + public void Add(CustomTypeMapper customMapper) + { + // Allow custom mapper to dynamically disable itself + if (!customMapper.Enabled) + return; + + var mapping = new TypeMapping( + customMapper.Type, customMapper.ReadValue, customMapper.BindValue, + customMapper.MapType, customMapper.ParameterCastRequired); + + mappings.Add(mapping); + } + + public void AddReverse(SqlType sqlType, Type type) + { + reverseMappings.Add(sqlType, type); + } + + public TypeMappingRegistry Build() + { + return new TypeMappingRegistry(mappings, reverseMappings); + } + + // Constructors + + public TypeMappingRegistryBuilder(TypeMapper mapper) + { + ArgumentValidator.EnsureArgumentNotNull(mapper, "mapper"); + Mapper = mapper; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/ValueRangeValidator.cs b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/ValueRangeValidator.cs index 3b6806cddc..75ec147732 100644 --- a/Orm/Xtensive.Orm/Sql/ValueTypeMapping/ValueRangeValidator.cs +++ b/Orm/Xtensive.Orm/Sql/ValueTypeMapping/ValueRangeValidator.cs @@ -1,61 +1,61 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.03 - -using System; -using Xtensive.Reflection; -using Xtensive.Sql.Info; - -namespace Xtensive.Sql -{ - /// - /// A range validator for primitive types. - /// - public static class ValueRangeValidator - { - /// - /// Ensures that the specified value is in . - /// - /// Type of the value to validate. - /// The value. - /// The allowed range. - public static void Validate(T value, ValueRange allowedRange) - where T : struct, IComparable - { - if (allowedRange.MinValue.CompareTo(value) > 0) - throw OutOfRange(Strings.ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ, - typeof (T).GetShortName(), allowedRange.MinValue, value); - if (allowedRange.MaxValue.CompareTo(value) < 0) - throw OutOfRange(Strings.ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ, - typeof (T).GetShortName(), allowedRange.MaxValue, value); - } - - /// - /// Corrects the specified value to fall into the . - /// - /// Type of the value to validate - /// The value. - /// The allowed range. - /// Corrected value. - public static T Correct(T value, ValueRange allowedRange) - where T : struct, IComparable - { - if (allowedRange.MinValue.CompareTo(value) > 0) - return allowedRange.MinValue; - if (allowedRange.MaxValue.CompareTo(value) < 0) - return allowedRange.MaxValue; - return value; - } - - private static InvalidOperationException OutOfRange(string format, - string typeName, T boundaryValue, T suppliedValue) - { - return new InvalidOperationException( - string.Format( - Strings.ExThisStorageDoesNotSupportX, - string.Format(format, typeName, boundaryValue, suppliedValue))); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2009.12.03 + +using System; +using Xtensive.Reflection; +using Xtensive.Sql.Info; + +namespace Xtensive.Sql +{ + /// + /// A range validator for primitive types. + /// + public static class ValueRangeValidator + { + /// + /// Ensures that the specified value is in . + /// + /// Type of the value to validate. + /// The value. + /// The allowed range. + public static void Validate(T value, ValueRange allowedRange) + where T : struct, IComparable + { + if (allowedRange.MinValue.CompareTo(value) > 0) + throw OutOfRange(Strings.ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ, + typeof (T).GetShortName(), allowedRange.MinValue, value); + if (allowedRange.MaxValue.CompareTo(value) < 0) + throw OutOfRange(Strings.ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ, + typeof (T).GetShortName(), allowedRange.MaxValue, value); + } + + /// + /// Corrects the specified value to fall into the . + /// + /// Type of the value to validate + /// The value. + /// The allowed range. + /// Corrected value. + public static T Correct(T value, ValueRange allowedRange) + where T : struct, IComparable + { + if (allowedRange.MinValue.CompareTo(value) > 0) + return allowedRange.MinValue; + if (allowedRange.MaxValue.CompareTo(value) < 0) + return allowedRange.MaxValue; + return value; + } + + private static InvalidOperationException OutOfRange(string format, + string typeName, T boundaryValue, T suppliedValue) + { + return new InvalidOperationException( + string.Format( + Strings.ExThisStorageDoesNotSupportX, + string.Format(format, typeName, boundaryValue, suppliedValue))); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Strings.Designer.cs b/Orm/Xtensive.Orm/Strings.Designer.cs index af333ee6e0..dbd186ecd1 100644 --- a/Orm/Xtensive.Orm/Strings.Designer.cs +++ b/Orm/Xtensive.Orm/Strings.Designer.cs @@ -1,10001 +1,10001 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Xtensive { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Strings { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Strings() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Strings", typeof(Strings).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Culture. - /// - internal static string _Culture { - get { - return ResourceManager.GetString("_Culture", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Actual Model. - /// - internal static string ActualModel { - get { - return ResourceManager.GetString("ActualModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Actual target model. - /// - internal static string ActualTargetModel { - get { - return ResourceManager.GetString("ActualTargetModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to *. - /// - internal static string AnyCulture { - get { - return ResourceManager.GetString("AnyCulture", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Applying rule '{0}' to '{1}'. - /// - internal static string ApplyingRuleXToY { - get { - return ResourceManager.GetString("ApplyingRuleXToY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Applying [{0}] to property '{1}' failed. {2}. - /// - internal static string AspectExApplyingXToPropertyYFailedZ { - get { - return ResourceManager.GetString("AspectExApplyingXToPropertyYFailedZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both localizable message resource and not localizable message can not be specified at once (location: {0}).. - /// - internal static string AspectExBothLocalizableMessageResourceAndNotLocalizableMessageCanNotBeSpecifiedAtOnceLocationX { - get { - return ResourceManager.GetString("AspectExBothLocalizableMessageResourceAndNotLocalizableMessageCanNotBeSpecifiedAt" + - "OnceLocationX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field constraint can not be applied to read only property {0}.. - /// - internal static string AspectExFieldConstraintCanNotBeAppliedToReadOnlyPropertyX { - get { - return ResourceManager.GetString("AspectExFieldConstraintCanNotBeAppliedToReadOnlyPropertyX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: multiple attributes of type '{1}' are not allowed here.. - /// - internal static string AspectExMultipleAttributesOfTypeXAreNotAllowedHere { - get { - return ResourceManager.GetString("AspectExMultipleAttributesOfTypeXAreNotAllowedHere", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [{0}] attribute on '{1}' requires a comparer for type '{2}'.. - /// - internal static string AspectExNoComparer { - get { - return ResourceManager.GetString("AspectExNoComparer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' and '{1}' properties must be used together (location: {2}).. - /// - internal static string AspectExXAndYPropertiesMustBeUsedTogetherLocationZ { - get { - return ResourceManager.GetString("AspectExXAndYPropertiesMustBeUsedTogetherLocationZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' does not support '{1}' value type (location: {2}).. - /// - internal static string AspectExXDoesNotSupportYValueTypeLocationZ { - get { - return ResourceManager.GetString("AspectExXDoesNotSupportYValueTypeLocationZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Associations. - /// - internal static string Associations { - get { - return ResourceManager.GetString("Associations", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Box({0}). - /// - internal static string BoxFormat { - get { - return ResourceManager.GetString("BoxFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cached({0}). - /// - internal static string CachedFormat { - get { - return ResourceManager.GetString("CachedFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't access member '{0}'. - /// - internal static string CantAccessMemberX { - get { - return ResourceManager.GetString("CantAccessMemberX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (can't change type of column '{0}'). - /// - internal static string CantChangeTypeOfColumnX { - get { - return ResourceManager.GetString("CantChangeTypeOfColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (can't remove column '{0}'). - /// - internal static string CantRemoveColumnX { - get { - return ResourceManager.GetString("CantRemoveColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (can't remove table '{0}'). - /// - internal static string CantRemoveTableX { - get { - return ResourceManager.GetString("CantRemoveTableX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Columns. - /// - internal static string Columns { - get { - return ResourceManager.GetString("Columns", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column: {0};. - /// - internal static string ColumnX { - get { - return ResourceManager.GetString("ColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to , . - /// - internal static string Comma { - get { - return ResourceManager.GetString("Comma", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ComparisonRule({0}, {1}). - /// - internal static string ComparisonRuleFormat { - get { - return ResourceManager.GetString("ComparisonRuleFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ComparisonRules({0}, [{1}]). - /// - internal static string ComparisonRulesFormat { - get { - return ResourceManager.GetString("ComparisonRulesFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0,6:F2}s @{1,-5} {2,5} {3,-24} {4}{5}. - /// - internal static string ComprehensiveLogFormat { - get { - return ResourceManager.GetString("ComprehensiveLogFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Constraint: {0};. - /// - internal static string ConstraintX { - get { - return ResourceManager.GetString("ConstraintX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Custom Definitions. - /// - internal static string CustomDefinitions { - get { - return ResourceManager.GetString("CustomDefinitions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Database: {0};. - /// - internal static string DatabaseX { - get { - return ResourceManager.GetString("DatabaseX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Date must be in the past.. - /// - internal static string DateMustBeInThePast { - get { - return ResourceManager.GetString("DateMustBeInThePast", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Difference. - /// - internal static string Difference { - get { - return ResourceManager.GetString("Difference", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "{1}" != "{2}" ({0}): {3}. - /// - internal static string DifferenceFormat { - get { - return ResourceManager.GetString("DifferenceFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to +{0}: . - /// - internal static string DifferencePropertyNamePrefix { - get { - return ResourceManager.GetString("DifferencePropertyNamePrefix", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ''. - /// - internal static string EmptyString { - get { - return ResourceManager.GetString("EmptyString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entire({0}). - /// - internal static string EntireFormat { - get { - return ResourceManager.GetString("EntireFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key = '{0}', Tuple = {1}, State = {2}. - /// - internal static string EntityStateFormat { - get { - return ResourceManager.GetString("EntityStateFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity with Key = '{0}' does not exist.. - /// - internal static string EntityWithKeyXDoesNotExist { - get { - return ResourceManager.GetString("EntityWithKeyXDoesNotExist", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity: {0};. - /// - internal static string EntityX { - get { - return ResourceManager.GetString("EntityX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The accessed member is not a property.. - /// - internal static string ExAccessedMemberIsNotProperty { - get { - return ResourceManager.GetString("ExAccessedMemberIsNotProperty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The access to a type's member can not be extracted from the specified expression.. - /// - internal static string ExAccessToTypeMemberCanNotBeExtractedFromSpecifiedExpression { - get { - return ResourceManager.GetString("ExAccessToTypeMemberCanNotBeExtractedFromSpecifiedExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Active serialization context is not found.. - /// - internal static string ExActiveSerializationContextIsNotFound { - get { - return ResourceManager.GetString("ExActiveSerializationContextIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Active Session is required for this operation. Use Session.Open(...) to open it.. - /// - internal static string ExActiveSessionIsRequiredForThisOperation { - get { - return ResourceManager.GetString("ExActiveSessionIsRequiredForThisOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Active Transaction is required for this operation. Use Session.OpenTransaction(...) to open it.. - /// - internal static string ExActiveTransactionIsRequiredForThisOperationUseSessionOpenTransactionToOpenIt { - get { - return ResourceManager.GetString("ExActiveTransactionIsRequiredForThisOperationUseSessionOpenTransactionToOpenIt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Actual conjunction operand count greater than MaxConjunctionOperandCount.. - /// - internal static string ExActualConjunctionOperandCountGreaterThanExpected { - get { - return ResourceManager.GetString("ExActualConjunctionOperandCountGreaterThanExpected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Actual schema version of assembly '{0}' is expected to be '{1}', but currently it is '{2}'.. - /// - internal static string ExActualSchemaVersionOfAssemblyXIsExpectedToBeYButCurrentlyItIsZ { - get { - return ResourceManager.GetString("ExActualSchemaVersionOfAssemblyXIsExpectedToBeYButCurrentlyItIsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' expression. Aggregate method '{1} is not supported.. - /// - internal static string ExAggregateMethodXIsNotSupported { - get { - return ResourceManager.GetString("ExAggregateMethodXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' expression. Aggregates for non primitive types are not supported.. - /// - internal static string ExAggregatesForNonPrimitiveTypesAreNotSupported { - get { - return ResourceManager.GetString("ExAggregatesForNonPrimitiveTypesAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Aggregate '{0}' is not supported for type '{1}'. - /// - internal static string ExAggregateXIsNotSupportedForTypeY { - get { - return ResourceManager.GetString("ExAggregateXIsNotSupportedForTypeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'All' method is only supported for root expressions or subqueries.. - /// - internal static string ExAllMethodIsOnlySupportedForRootExpressionsOrSubqueries { - get { - return ResourceManager.GetString("ExAllMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UndoDescriptor is already completed.. - /// - internal static string ExAlreadyCompleted { - get { - return ResourceManager.GetString("ExAlreadyCompleted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Object is already disposed.. - /// - internal static string ExAlreadyDisposed { - get { - return ResourceManager.GetString("ExAlreadyDisposed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance is already initialized.. - /// - internal static string ExAlreadyInitialized { - get { - return ResourceManager.GetString("ExAlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Any' method is only supported for root expressions or subqueries.. - /// - internal static string ExAnyMethodIsOnlySupportedForRootExpressionsOrSubqueries { - get { - return ResourceManager.GetString("ExAnyMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument can't be an empty string.. - /// - internal static string ExArgumentCannotBeEmptyString { - get { - return ResourceManager.GetString("ExArgumentCannotBeEmptyString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument cannot be white spaces only string.. - /// - internal static string ExArgumentCannotBeWhiteSpacesOnlyString { - get { - return ResourceManager.GetString("ExArgumentCannotBeWhiteSpacesOnlyString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument must be greater than '{0}'. - /// - internal static string ExArgumentMustBeGreaterThanX { - get { - return ResourceManager.GetString("ExArgumentMustBeGreaterThanX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument must be greater that or equal '{0}'. - /// - internal static string ExArgumentMustBeGreaterThatOrEqualX { - get { - return ResourceManager.GetString("ExArgumentMustBeGreaterThatOrEqualX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument must be less than or equal '{0}'. - /// - internal static string ExArgumentMustBeLessThanOrEqualX { - get { - return ResourceManager.GetString("ExArgumentMustBeLessThanOrEqualX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument must be less than '{0}'. - /// - internal static string ExArgumentMustBeLessThanX { - get { - return ResourceManager.GetString("ExArgumentMustBeLessThanX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The argument must not be of type '{0}'.. - /// - internal static string ExArgumentMustnotBeOfTypeX { - get { - return ResourceManager.GetString("ExArgumentMustnotBeOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument should be in range [{0}...{1}].. - /// - internal static string ExArgumentShouldBeInRange { - get { - return ResourceManager.GetString("ExArgumentShouldBeInRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument value must be greater than or equal to zero.. - /// - internal static string ExArgumentValueMustBeGreaterThanOrEqualToZero { - get { - return ResourceManager.GetString("ExArgumentValueMustBeGreaterThanOrEqualToZero", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Argument value must be greater than zero.. - /// - internal static string ExArgumentValueMustBeGreaterThanZero { - get { - return ResourceManager.GetString("ExArgumentValueMustBeGreaterThanZero", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The argument '{0}' is less than the argument '{1}'.. - /// - internal static string ExArgumentXIsLessThanArgumentY { - get { - return ResourceManager.GetString("ExArgumentXIsLessThanArgumentY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Array does not have zero-based indexing.. - /// - internal static string ExArrayDoesNotHaveZeroBasedIndexing { - get { - return ResourceManager.GetString("ExArrayDoesNotHaveZeroBasedIndexing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Array is multidimentional.. - /// - internal static string ExArrayIsMultidimensional { - get { - return ResourceManager.GetString("ExArrayIsMultidimensional", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A set of exceptions is caught.. - /// - internal static string ExASetOfExceptionsIsCaught { - get { - return ResourceManager.GetString("ExASetOfExceptionsIsCaught", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'as' operator supports casting only inside Entity hierarchy.. - /// - internal static string ExAsOperatorSupportsEntityOnly { - get { - return ResourceManager.GetString("ExAsOperatorSupportsEntityOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Assembly version mismatch: main assembly '{0} {1}', extension assembly '{2} {3}'.. - /// - internal static string ExAssemblyVersionMismatchMainAssemblyXYExtensionsAssemblyAB { - get { - return ResourceManager.GetString("ExAssemblyVersionMismatchMainAssemblyXYExtensionsAssemblyAB", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'AssociationAttribute' can't be applied to '{0}' field.. - /// - internal static string ExAssociationAttributeCanNotBeAppliedToXField { - get { - return ResourceManager.GetString("ExAssociationAttributeCanNotBeAppliedToXField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Association multiplicity '{0}' is not valid for field '{1}'.. - /// - internal static string ExAssociationMultiplicityIsNotValidForField { - get { - return ResourceManager.GetString("ExAssociationMultiplicityIsNotValidForField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to At least one column index pair must be specified.. - /// - internal static string ExAtLeastOneColumnIndexPairMustBeSpecified { - get { - return ResourceManager.GetString("ExAtLeastOneColumnIndexPairMustBeSpecified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to At least one loop have been found in persistent type dependencies graph. Suspicious types: {0}. - /// - internal static string ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX { - get { - return ResourceManager.GetString("ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AtomicContext is suspended.. - /// - internal static string ExAtomicContextIsSuspended { - get { - return ResourceManager.GetString("ExAtomicContextIsSuspended", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An attempt to automatically activate Session '{0}' inside Session '{1}' (Session switching) is blocked. - ///Most likely, mixed usage of objects from different Sessions is a result of a bug in your code. - ///Use manual Session activation (Session.Deactivate(), Session.Activate()) or - ///SessionOptions.AllowSwitching flag to avoid this exception, if this is intentional.. - /// - internal static string ExAttemptToAutomaticallyActivateSessionXInsideSessionYIsBlocked { - get { - return ResourceManager.GetString("ExAttemptToAutomaticallyActivateSessionXInsideSessionYIsBlocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to BatchingCommandProcessor does not support validation of number of affected rows.. - /// - internal static string ExBatchingCommandProcessorDoesNotSupportValidationOfNumberOfAffectedRows { - get { - return ResourceManager.GetString("ExBatchingCommandProcessorDoesNotSupportValidationOfNumberOfAffectedRows", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Binary expressions with NodeType = 'ExpressionType.{0}' aren't supported.. - /// - internal static string ExBinaryExpressionsWithNodeTypeXAreNotSupported { - get { - return ResourceManager.GetString("ExBinaryExpressionsWithNodeTypeXAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Binary expression '{0}' of type '{1}' is not supported.. - /// - internal static string ExBinaryExpressionXOfTypeXIsNotSupported { - get { - return ResourceManager.GetString("ExBinaryExpressionXOfTypeXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Binding has failed for {0}. Check property declaration.. - /// - internal static string ExBindingFailedForX { - get { - return ResourceManager.GetString("ExBindingFailedForX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not EntityExpression(EntityFieldExpression).. - /// - internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotEntityExpressionEntityFieldExpression { - get { - return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotEntityExpressionEntityFieldE" + - "xpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not KeyExpression.. - /// - internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotKeyExpression { - get { - return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotKeyExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not StructureExpression.. - /// - internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotStructureExpression { - get { - return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotStructureExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both measurements have no value.. - /// - internal static string ExBothMeasurementsHaveNoValue { - get { - return ResourceManager.GetString("ExBothMeasurementsHaveNoValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both parts of binary expression '{0}' are of the different type. Use type cast.. - /// - internal static string ExBothPartsOfBinaryExpressionXAreOfTheDifferentType { - get { - return ResourceManager.GetString("ExBothPartsOfBinaryExpressionXAreOfTheDifferentType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both Source and Target are null.. - /// - internal static string ExBothSourceAndTargetAreNull { - get { - return ResourceManager.GetString("ExBothSourceAndTargetAreNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't activate service '{0}'. Error: {1}. - /// - internal static string ExCannotActivateServiceXErrorY { - get { - return ResourceManager.GetString("ExCannotActivateServiceXErrorY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't activate service '{0}' with name "{1}". Error: {2}. - /// - internal static string ExCannotActivateServiceXWithKeyYErrorZ { - get { - return ResourceManager.GetString("ExCannotActivateServiceXWithKeyYErrorZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempt to associate non-empty EntityState with Key of unknown type.. - /// - internal static string ExCannotAssociateNonEmptyEntityStateWithKeyOfUnknownType { - get { - return ResourceManager.GetString("ExCannotAssociateNonEmptyEntityStateWithKeyOfUnknownType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not commit a transaction. Entities validation failed.. - /// - internal static string ExCanNotCommitATransactionEntitiesValidationFailed { - get { - return ResourceManager.GetString("ExCanNotCommitATransactionEntitiesValidationFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not commit a transaction: ValidationContext is in inconsistent state.. - /// - internal static string ExCanNotCommitATransactionValidationContextIsInInconsistentState { - get { - return ResourceManager.GetString("ExCanNotCommitATransactionValidationContextIsInInconsistentState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not commit a transaction. Validation context is in invalid state.. - /// - internal static string ExCanNotCommitATransactionValidationContextIsInInvalidState { - get { - return ResourceManager.GetString("ExCanNotCommitATransactionValidationContextIsInInvalidState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't compile - active CompilationContext has no Compiler (Compiler is null).. - /// - internal static string ExCanNotCompileNoCompiler { - get { - return ResourceManager.GetString("ExCanNotCompileNoCompiler", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't compile - no active EnumerationContext exists.. - /// - internal static string ExCanNotCompileNoEnumerationContext { - get { - return ResourceManager.GetString("ExCanNotCompileNoEnumerationContext", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not complete outer transaction: inner transaction is active.. - /// - internal static string ExCanNotCompleteOuterTransactionInnerTransactionIsActive { - get { - return ResourceManager.GetString("ExCanNotCompleteOuterTransactionInnerTransactionIsActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't extract foreign key.. - /// - internal static string ExCanNotExtractForeignKey { - get { - return ResourceManager.GetString("ExCanNotExtractForeignKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't find a constructor to execute {0}.. - /// - internal static string ExCannotFindConstructorToExecuteX { - get { - return ResourceManager.GetString("ExCannotFindConstructorToExecuteX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot find a handler of type '{0}'.. - /// - internal static string ExCannotFindHandlerOfTypeX { - get { - return ResourceManager.GetString("ExCannotFindHandlerOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not find reference to column "{0}".. - /// - internal static string ExCanNotFindReferenceToColumnX { - get { - return ResourceManager.GetString("ExCanNotFindReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't generate next version value of type '{0}'.. - /// - internal static string ExCannotGenerateNextVersionValueOfTypeX { - get { - return ResourceManager.GetString("ExCannotGenerateNextVersionValueOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not get validation context: there is no active transaction.. - /// - internal static string ExCanNotGetValidationContextThereIsNoActiveTransaction { - get { - return ResourceManager.GetString("ExCanNotGetValidationContextThereIsNoActiveTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not mark state as modified: it is not valid in current transaction.. - /// - internal static string ExCanNotMarkStateAsModifiedItIsNotValidInCurrentTransaction { - get { - return ResourceManager.GetString("ExCanNotMarkStateAsModifiedItIsNotValidInCurrentTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't merge the state.. - /// - internal static string ExCanNotMergeTheState { - get { - return ResourceManager.GetString("ExCanNotMergeTheState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not open more than one inner transaction.. - /// - internal static string ExCanNotOpenMoreThanOneInnerTransaction { - get { - return ResourceManager.GetString("ExCanNotOpenMoreThanOneInnerTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not open a transaction: there is no current Session.. - /// - internal static string ExCanNotOpenTransactionNoCurrentSession { - get { - return ResourceManager.GetString("ExCanNotOpenTransactionNoCurrentSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't parse the call to the comparison method.. - /// - internal static string ExCannotParseCallToComparisonMethod { - get { - return ResourceManager.GetString("ExCannotParseCallToComparisonMethod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not persist: there are pinned entities.. - /// - internal static string ExCanNotPersistThereArePinnedEntities { - get { - return ResourceManager.GetString("ExCanNotPersistThereArePinnedEntities", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not read database and schema names. - /// - internal static string ExCanNotReadDatabaseAndSchemaNames { - get { - return ResourceManager.GetString("ExCanNotReadDatabaseAndSchemaNames", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot resolve entity with key '{0}'.. - /// - internal static string ExCannotResolveEntityWithKeyX { - get { - return ResourceManager.GetString("ExCannotResolveEntityWithKeyX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not reuse opened transaction: requested isolation level is different.. - /// - internal static string ExCanNotReuseOpenedTransactionRequestedIsolationLevelIsDifferent { - get { - return ResourceManager.GetString("ExCanNotReuseOpenedTransactionRequestedIsolationLevelIsDifferent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot upgrade schema safely. Details: - ///{0}. - /// - internal static string ExCanNotUpgradeSchemaSafely_DetailsX { - get { - return ResourceManager.GetString("ExCanNotUpgradeSchemaSafely_DetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot use default generator for complex (multicolumn) Keys.. - /// - internal static string ExCannotUseDefaultGeneratorForComplexKeys { - get { - return ResourceManager.GetString("ExCannotUseDefaultGeneratorForComplexKeys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't access member of type 'EntitySet<>'.. - /// - internal static string ExCantAccessMemberOfTypeEntitySet { - get { - return ResourceManager.GetString("ExCantAccessMemberOfTypeEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't compile the provider '{0}'.. - /// - internal static string ExCantCompileProviderX { - get { - return ResourceManager.GetString("ExCantCompileProviderX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't convert the {0} to the {1}.. - /// - internal static string ExCantConvertXToY { - get { - return ResourceManager.GetString("ExCantConvertXToY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't create associates for generic type definitions (type '{0}').. - /// - internal static string ExCantCreateAssociateForGenericTypeDefinitions { - get { - return ResourceManager.GetString("ExCantCreateAssociateForGenericTypeDefinitions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't find associated {0} of type '{1}' for type '{2}'.. - /// - internal static string ExCantFindAssociate { - get { - return ResourceManager.GetString("ExCantFindAssociate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't find associated {0} of type '{1}' for type '{2}' or '{3}'.. - /// - internal static string ExCantFindAssociate2 { - get { - return ResourceManager.GetString("ExCantFindAssociate2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Blocking descriptor can't be invoked.. - /// - internal static string ExCantInvokeBlockingDescriptor { - get { - return ResourceManager.GetString("ExCantInvokeBlockingDescriptor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't merge state.. - /// - internal static string ExCantMergeState { - get { - return ResourceManager.GetString("ExCantMergeState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't open EnumerationScope, since there is no current CompilationContext.. - /// - internal static string ExCantOpenEnumerationScopeSinceThereIsNoCurrentCompilationContext { - get { - return ResourceManager.GetString("ExCantOpenEnumerationScopeSinceThereIsNoCurrentCompilationContext", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to InfinityType.None can't be passed to this constructor.. - /// - internal static string ExCantPassNoInfinityToThisConstructor { - get { - return ResourceManager.GetString("ExCantPassNoInfinityToThisConstructor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't register state.. - /// - internal static string ExCantRegisterState { - get { - return ResourceManager.GetString("ExCantRegisterState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ChainedBuffer.Remove() method is not supported.. - /// - internal static string ExChainedBufferRemoveMethodIsNotSupported { - get { - return ResourceManager.GetString("ExChainedBufferRemoveMethodIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Circular reference is detected.. - /// - internal static string ExCircularReferenceDetected { - get { - return ResourceManager.GetString("ExCircularReferenceDetected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Clustered index can not be declared in interface '{0}'. - /// - internal static string ExClusteredIndexCanNotBeDeclaredInInterfaceX { - get { - return ResourceManager.GetString("ExClusteredIndexCanNotBeDeclaredInInterfaceX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection already contains item with the specified key.. - /// - internal static string ExCollectionAlreadyContainsItemWithSpecifiedKey { - get { - return ResourceManager.GetString("ExCollectionAlreadyContainsItemWithSpecifiedKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collecton already contains specified item.. - /// - internal static string ExCollectionAlreadyContainsSpecifiedItem { - get { - return ResourceManager.GetString("ExCollectionAlreadyContainsSpecifiedItem", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection cannot contain any neither null or empty string values.. - /// - internal static string ExCollectionCannotContainAnyNeitherNullOrEmptyStringValues { - get { - return ResourceManager.GetString("ExCollectionCannotContainAnyNeitherNullOrEmptyStringValues", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection has been changed during the enumeration.. - /// - internal static string ExCollectionHasBeenChanged { - get { - return ResourceManager.GetString("ExCollectionHasBeenChanged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection has been modified.. - /// - internal static string ExCollectionHasBeenModified { - get { - return ResourceManager.GetString("ExCollectionHasBeenModified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection is empty.. - /// - internal static string ExCollectionIsEmpty { - get { - return ResourceManager.GetString("ExCollectionIsEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection is read-only.. - /// - internal static string ExCollectionIsReadOnly { - get { - return ResourceManager.GetString("ExCollectionIsReadOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item should be either an ICollection or ICountable.. - /// - internal static string ExCollectionOrCoutableExcpected { - get { - return ResourceManager.GetString("ExCollectionOrCoutableExcpected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The collection property {0} is bound to the property {1} that isn't collection.. - /// - internal static string ExCollectionPropertyXIsBoundToPropertyYThatIsNotCollection { - get { - return ResourceManager.GetString("ExCollectionPropertyXIsBoundToPropertyYThatIsNotCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collection should contain at least {0} elements.. - /// - internal static string ExCollectionShouldContainAtLeastXElements { - get { - return ResourceManager.GetString("ExCollectionShouldContainAtLeastXElements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column already has specified name.. - /// - internal static string ExColumnAlreadyHasSpecifiedName { - get { - return ResourceManager.GetString("ExColumnAlreadyHasSpecifiedName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column belongs to other table.. - /// - internal static string ExColumnBelongsToOtherTable { - get { - return ResourceManager.GetString("ExColumnBelongsToOtherTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column group could not be found.. - /// - internal static string ExColumnGroupCouldNotBeFound { - get { - return ResourceManager.GetString("ExColumnGroupCouldNotBeFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value length {0} is greater than column length {1}.. - /// - internal static string ExColumnLength { - get { - return ResourceManager.GetString("ExColumnLength", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to assign null to non-nullable column.. - /// - internal static string ExColumnNotNullable { - get { - return ResourceManager.GetString("ExColumnNotNullable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Columns used by the CalculatedColumn's expression containing the ApplyParameter are removed.. - /// - internal static string ExColumnsUsedByCalculatedColumnExpressionContainingApplyParameterAreRemoved { - get { - return ResourceManager.GetString("ExColumnsUsedByCalculatedColumnExpressionContainingApplyParameterAreRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Columns used by the predicate containing ApplyParameter are removed.. - /// - internal static string ExColumnsUsedByPredicateContainingApplyParameterAreRemoved { - get { - return ResourceManager.GetString("ExColumnsUsedByPredicateContainingApplyParameterAreRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column "{0}" contains both key and value collections.. - /// - internal static string ExColumnXContainsBothKeyAndValueCollections { - get { - return ResourceManager.GetString("ExColumnXContainsBothKeyAndValueCollections", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column '{0}' is not found.. - /// - internal static string ExColumnXIsNotFound { - get { - return ResourceManager.GetString("ExColumnXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Column with name '{0}' is not found in table '{1}'.. - /// - internal static string ExColumnXIsNotFoundInTableY { - get { - return ResourceManager.GetString("ExColumnXIsNotFoundInTableY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Commands are already translated.. - /// - internal static string ExCommandsAreAlreadyTranslated { - get { - return ResourceManager.GetString("ExCommandsAreAlreadyTranslated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Comparer for type '{0}' is not available.. - /// - internal static string ExComparerForTypeIsNotAvailable { - get { - return ResourceManager.GetString("ExComparerForTypeIsNotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [CompilerContainer] attribute isn't applied to type '{0}'.. - /// - internal static string ExCompilerContainerAttributeIsNotAppliedToTypeX { - get { - return ResourceManager.GetString("ExCompilerContainerAttributeIsNotAppliedToTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler for {0} is already registered.. - /// - internal static string ExCompilerForXIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExCompilerForXIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} has invalid target member.. - /// - internal static string ExCompilerXHasInvalidTargetMember { - get { - return ResourceManager.GetString("ExCompilerXHasInvalidTargetMember", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} has invalid target type: target type should be either non-generic or generic type definition.. - /// - internal static string ExCompilerXHasInvalidTargetType { - get { - return ResourceManager.GetString("ExCompilerXHasInvalidTargetType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} has too many parameters.. - /// - internal static string ExCompilerXHasTooManyParameters { - get { - return ResourceManager.GetString("ExCompilerXHasTooManyParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} should have first parameter of type MemberInfo. - /// - internal static string ExCompilerXShouldHaveMemberInfoParameter { - get { - return ResourceManager.GetString("ExCompilerXShouldHaveMemberInfoParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} should have parameter {1} of type {2}. - /// - internal static string ExCompilerXShouldHaveParameterYOfTypeZ { - get { - return ResourceManager.GetString("ExCompilerXShouldHaveParameterYOfTypeZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} should have "this" parameter.. - /// - internal static string ExCompilerXShouldHaveThisParameter { - get { - return ResourceManager.GetString("ExCompilerXShouldHaveThisParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compiler {0} should return {1}.. - /// - internal static string ExCompilerXShouldReturnY { - get { - return ResourceManager.GetString("ExCompilerXShouldReturnY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Complete method must be called just once.. - /// - internal static string ExCompleteMustBeCalledJustOnce { - get { - return ResourceManager.GetString("ExCompleteMustBeCalledJustOnce", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Concurrency conflict.. - /// - internal static string ExConcurrencyConflict { - get { - return ResourceManager.GetString("ExConcurrencyConflict", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Configuration for Domain with name '{0}' is not found in application configuration file (section '{1}').. - /// - internal static string ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile { - get { - return ResourceManager.GetString("ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Configuration with '{0}' name already registered.. - /// - internal static string ExConfigurationWithXNameAlreadyRegistered { - get { - return ResourceManager.GetString("ExConfigurationWithXNameAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ConnectionInfo is missing. If you are using configuration file you should specify either 'connectionUrl' element or 'connectionString' and 'provider' elements. - /// - internal static string ExConnectionInfoIsMissing { - get { - return ResourceManager.GetString("ExConnectionInfoIsMissing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'connectionString' element.. - /// - internal static string ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrConnectionStringElement { - get { - return ResourceManager.GetString("ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrConnectionStringEl" + - "ement", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'provider' and 'connectionString' elements.. - /// - internal static string ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnectionStringElements { - get { - return ResourceManager.GetString("ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnect" + - "ionStringElements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection is not open.. - /// - internal static string ExConnectionIsNotOpen { - get { - return ResourceManager.GetString("ExConnectionIsNotOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection is required.. - /// - internal static string ExConnectionIsRequired { - get { - return ResourceManager.GetString("ExConnectionIsRequired", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection string with name '{0}' is not found.. - /// - internal static string ExConnectionStringWithNameXIsNotFound { - get { - return ResourceManager.GetString("ExConnectionStringWithNameXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection string with name '{0}' is null or empty.. - /// - internal static string ExConnectionStringWithNameXIsNullOrEmpty { - get { - return ResourceManager.GetString("ExConnectionStringWithNameXIsNullOrEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Constraint belongs to other domain.. - /// - internal static string ExConstraintBelongsToOtherDomain { - get { - return ResourceManager.GetString("ExConstraintBelongsToOtherDomain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Constraint belongs to other table.. - /// - internal static string ExConstraintBelongsToOtherTable { - get { - return ResourceManager.GetString("ExConstraintBelongsToOtherTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Constraint violation: constraint {0} on field '{1}.{2}' of object '{3}' failed on value {4}.. - /// - internal static string ExConstraintViolation { - get { - return ResourceManager.GetString("ExConstraintViolation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Container type does not provide a suitable constructor.. - /// - internal static string ExContainerTypeDoesNotProvideASuitableConstructor { - get { - return ResourceManager.GetString("ExContainerTypeDoesNotProvideASuitableConstructor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Container type must implement {0}.. - /// - internal static string ExContainerTypeMustImplementX { - get { - return ResourceManager.GetString("ExContainerTypeMustImplementX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Contains' method is only supported for root expressions or subqueries.. - /// - internal static string ExContainsMethodIsOnlySupportedForRootExpressionsOrSubqueries { - get { - return ResourceManager.GetString("ExContainsMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Context is not activated.. - /// - internal static string ExContextMustBeActivated { - get { - return ResourceManager.GetString("ExContextMustBeActivated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is required. Use {1} to set it.. - /// - internal static string ExContextRequired { - get { - return ResourceManager.GetString("ExContextRequired", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Control character used as escape character. - /// - internal static string ExControlCharacterUsedAsEscapeCharacter { - get { - return ResourceManager.GetString("ExControlCharacterUsedAsEscapeCharacter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to copy a part of the stream to itself. Use StreamExtensions.Copy method instead.. - /// - internal static string ExCopyToMustOperateWithDifferentStreams { - get { - return ResourceManager.GetString("ExCopyToMustOperateWithDifferentStreams", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not construct new Key instance. Type '{0}' is not an entity.. - /// - internal static string ExCouldNotConstructNewKeyInstanceTypeXIsNotAnEntity { - get { - return ResourceManager.GetString("ExCouldNotConstructNewKeyInstanceTypeXIsNotAnEntity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find anonymous mapping for field '{0}'.. - /// - internal static string ExCouldNotFindAnonymousMappingForFieldX { - get { - return ResourceManager.GetString("ExCouldNotFindAnonymousMappingForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find entity mapping for field '{0}'.. - /// - internal static string ExCouldNotFindEntityMappingForFieldX { - get { - return ResourceManager.GetString("ExCouldNotFindEntityMappingForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find field segment for field '{0}'.. - /// - internal static string ExCouldNotFindFieldSegmentForFieldX { - get { - return ResourceManager.GetString("ExCouldNotFindFieldSegmentForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find grouping mapping for field '{0}'.. - /// - internal static string ExCouldNotFindGroupingMappingForFieldX { - get { - return ResourceManager.GetString("ExCouldNotFindGroupingMappingForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find subquery mapping for field '{0}'.. - /// - internal static string ExCouldNotFindSubqueryMappingForFieldX { - get { - return ResourceManager.GetString("ExCouldNotFindSubqueryMappingForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not get member {0} from expression.. - /// - internal static string ExCouldNotGetMemberXFromExpression { - get { - return ResourceManager.GetString("ExCouldNotGetMemberXFromExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not load types from the assembly '{0}'.. - /// - internal static string ExCouldNotLoadTypesFromAssembly { - get { - return ResourceManager.GetString("ExCouldNotLoadTypesFromAssembly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not resolve {0} '{1}' within the domain.. - /// - internal static string ExCouldNotResolveXYWithinDomain { - get { - return ResourceManager.GetString("ExCouldNotResolveXYWithinDomain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Culture of the applied rule should either be undefined (null), or be the same as on target rule.. - /// - internal static string ExCultureOfAppliedRuleShouldBeEitherNullOrTheSameAsOnTarget { - get { - return ResourceManager.GetString("ExCultureOfAppliedRuleShouldBeEitherNullOrTheSameAsOnTarget", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current compiler is not suitable for this operation, most likely there is no active Session.. - /// - internal static string ExCurrentCompilerIsNotSuitableForThisOperationMostLikelyThereIsNoActiveSession { - get { - return ResourceManager.GetString("ExCurrentCompilerIsNotSuitableForThisOperationMostLikelyThereIsNoActiveSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current provider does not support ContainsTable functionality.. - /// - internal static string ExCurrentProviderDoesNotSupportContainsTableFunctionality { - get { - return ResourceManager.GetString("ExCurrentProviderDoesNotSupportContainsTableFunctionality", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current session getter is already assigned.. - /// - internal static string ExCurrentSessionGetterIsAlreadyAssigned { - get { - return ResourceManager.GetString("ExCurrentSessionGetterIsAlreadyAssigned", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current storage does not support changing column types. - /// - internal static string ExCurrentStorageDoesNotSupportChangingColumnTypes { - get { - return ResourceManager.GetString("ExCurrentStorageDoesNotSupportChangingColumnTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current storage provider does not support savepoints (nested transactions).. - /// - internal static string ExCurrentStorageProviderDoesNotSupportSavepoints { - get { - return ResourceManager.GetString("ExCurrentStorageProviderDoesNotSupportSavepoints", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current type of expression '{0}' is not supported.. - /// - internal static string ExCurrentTypeOfExpressionXIsNotSupported { - get { - return ResourceManager.GetString("ExCurrentTypeOfExpressionXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current type '{0}' is not supported.. - /// - internal static string ExCurrentTypeXIsNotSupported { - get { - return ResourceManager.GetString("ExCurrentTypeXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Custom type identifier '{0}' of type '{1}' beyongs the limits defined for database.. - /// - internal static string ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase { - get { - return ResourceManager.GetString("ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Custom type identifier '{0}' of type '{1}' conflicts with type '{2}' in extracted map of types.. - /// - internal static string ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes { - get { - return ResourceManager.GetString("ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cyclic dependency between databases found: {0}. - /// - internal static string ExCyclicDependencyBetweenDatabasesFoundX { - get { - return ResourceManager.GetString("ExCyclicDependencyBetweenDatabasesFoundX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cyclic dependency in query preprocessor graph is detected.. - /// - internal static string ExCyclicDependencyInQueryPreprocessorGraphIsDetected { - get { - return ResourceManager.GetString("ExCyclicDependencyInQueryPreprocessorGraphIsDetected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Database mapping requires multidatabase domain configuration. Please provide at least DefaultDatabase and DefaultSchema settings.. - /// - internal static string ExDatabaseMappingRequiresMultidatabaseDomainConfiguration { - get { - return ResourceManager.GetString("ExDatabaseMappingRequiresMultidatabaseDomainConfiguration", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DateTime.ToString() method is not supported, use the DateTime.ToString("s").. - /// - internal static string ExDateTimeToStringMethodIsNotSupported { - get { - return ResourceManager.GetString("ExDateTimeToStringMethodIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DbName value reading or setting is denied.. - /// - internal static string ExDbNameValueReadingOrSettingIsDenied { - get { - return ResourceManager.GetString("ExDbNameValueReadingOrSettingIsDenied", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deadlock was found.. - /// - internal static string ExDeadlock { - get { - return ResourceManager.GetString("ExDeadlock", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Default generator can serve hierarchy with exactly one key field.. - /// - internal static string ExDefaultGeneratorCanServeHierarchyWithExactlyOneKeyField { - get { - return ResourceManager.GetString("ExDefaultGeneratorCanServeHierarchyWithExactlyOneKeyField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DefaultSchema and DefaultDatabase should be specified when multi-database mode is active.. - /// - internal static string ExDefaultSchemaAndDefaultDatabaseShouldBeSpecifiedWhenMultidatabaseModeIsActive { - get { - return ResourceManager.GetString("ExDefaultSchemaAndDefaultDatabaseShouldBeSpecifiedWhenMultidatabaseModeIsActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DefaultSchema should be specified when multi-schema or multi-database mode is active.. - /// - internal static string ExDefaultSchemaShouldBeSpecifiedWhenMultischemaOrMultidatabaseModeIsActive { - get { - return ResourceManager.GetString("ExDefaultSchemaShouldBeSpecifiedWhenMultischemaOrMultidatabaseModeIsActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Default storage node can not be removed.. - /// - internal static string ExDefaultStorageNodeCanNotBeRemoved { - get { - return ResourceManager.GetString("ExDefaultStorageNodeCanNotBeRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Default type is already registered.. - /// - internal static string ExDefaultTypeIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExDefaultTypeIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dependency operation with full name "{0}" is already registered.. - /// - internal static string ExDependencyOperationIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExDependencyOperationIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Descriptor is in invalid state.. - /// - internal static string ExDescriptorIsInInvalidState { - get { - return ResourceManager.GetString("ExDescriptorIsInInvalidState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deserialization error: some SerializationData slots were not recognized, thus the format of the serialized data differs from the supported one.. - /// - internal static string ExDeserializationErrorUnrecognizedSlotsAreFound { - get { - return ResourceManager.GetString("ExDeserializationErrorUnrecognizedSlotsAreFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stream length not enough to deserialize object of specified type.. - /// - internal static string ExDeserializationStreamLengthIncorrect { - get { - return ResourceManager.GetString("ExDeserializationStreamLengthIncorrect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Destionation array is too small.. - /// - internal static string ExDestionationArrayIsTooSmall { - get { - return ResourceManager.GetString("ExDestionationArrayIsTooSmall", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The detection of changes in user structure collection isn't supported.. - /// - internal static string ExDetectionOfChangesInUserStructureCollectionIsNotSupported { - get { - return ResourceManager.GetString("ExDetectionOfChangesInUserStructureCollectionIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Difference related to {0} type is not found on the UpgradeContext stack.. - /// - internal static string ExDifferenceRelatedToXTypeIsNotFoundOnTheUpgradeContextStack { - get { - return ResourceManager.GetString("ExDifferenceRelatedToXTypeIsNotFoundOnTheUpgradeContextStack", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Different TupleDescriptors are not valid here: {0} and {1}.. - /// - internal static string ExDifferentTupleDescriptors { - get { - return ResourceManager.GetString("ExDifferentTupleDescriptors", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Direct querying for entity set in compiled queries is not supported, use QueryEndpoint.Items() instead.. - /// - internal static string ExDirectQueryingForEntitySetInCompiledQueriesIsNotSupportedUseQueryEndpointItemsInstead { - get { - return ResourceManager.GetString("ExDirectQueryingForEntitySetInCompiledQueriesIsNotSupportedUseQueryEndpointItemsI" + - "nstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DisconnectedState is already attached to session.. - /// - internal static string ExDisconnectedStateIsAlreadyAttachedToSession { - get { - return ResourceManager.GetString("ExDisconnectedStateIsAlreadyAttachedToSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DisconnectedState is detached.. - /// - internal static string ExDisconnectedStateIsDetached { - get { - return ResourceManager.GetString("ExDisconnectedStateIsDetached", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' expression. Downcast from '{1}' to '{2}' not supported. Use 'OfType' or 'as' operator instead.. - /// - internal static string ExDowncastFromXToXNotSupportedUseOfTypeOrAsOperatorInstead { - get { - return ResourceManager.GetString("ExDowncastFromXToXNotSupportedUseOfTypeOrAsOperatorInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Duplicate assembly name: '{0}'.. - /// - internal static string ExDuplicateAssemblyNameX { - get { - return ResourceManager.GetString("ExDuplicateAssemblyNameX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The duplicate for the operation {0} is found.. - /// - internal static string ExDuplicateForOperationXIsFound { - get { - return ResourceManager.GetString("ExDuplicateForOperationXIsFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'ElementAt' does not support query provider of type '{0}'.. - /// - internal static string ExElementAtDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExElementAtDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ElementAt index must be greater or equal to zero.. - /// - internal static string ExElementAtIndexMustBeGreaterOrEqualToZero { - get { - return ResourceManager.GetString("ExElementAtIndexMustBeGreaterOrEqualToZero", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'ElementAt({0})' not supported in compiled queries (Query.Execute). Use 'ElementAt(Expression<Func<int>>)' instead.For example use 'ElementAt(()=>{0})'.. - /// - internal static string ExElementAtNotSupportedInCompiledQueries { - get { - return ResourceManager.GetString("ExElementAtNotSupportedInCompiledQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'ElementAtOrDefault' does not support query provider of type '{0}'.. - /// - internal static string ExElementAtOrDefaultDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExElementAtOrDefaultDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'ElementAtOrDefault({0})' not supported in compiled queries (Query.Execute). Use 'ElementAtOrDefault(Expression<Func<int>>)' instead.For example use 'ElementAtOrDefault(()=>{0})'.. - /// - internal static string ExElementAtOrDefaultNotSupportedInCompiledQueries { - get { - return ResourceManager.GetString("ExElementAtOrDefaultNotSupportedInCompiledQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Element with name '{0}' is contained in this instance already.. - /// - internal static string ExElementWithNameContainedInThisInstanceAlready { - get { - return ResourceManager.GetString("ExElementWithNameContainedInThisInstanceAlready", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Element with type '{0}' is already contained in this instance.. - /// - internal static string ExElementWithTypeIsContainedInThisInstanceAlready { - get { - return ResourceManager.GetString("ExElementWithTypeIsContainedInThisInstanceAlready", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Columns collection is empty.. - /// - internal static string ExEmptyColumnsCollection { - get { - return ResourceManager.GetString("ExEmptyColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to KeyColumns collection is empty.. - /// - internal static string ExEmptyKeyColumnsCollection { - get { - return ResourceManager.GetString("ExEmptyKeyColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to EndPoints order of both ranges must be equal.. - /// - internal static string ExEndPointOrderMustBeEqual { - get { - return ResourceManager.GetString("ExEndPointOrderMustBeEqual", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}'. Entities '{1}' and '{2}' belong to different hierarchies.. - /// - internal static string ExEntitiesXAndXBelongToDifferentHierarchies { - get { - return ResourceManager.GetString("ExEntitiesXAndXBelongToDifferentHierarchies", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity of type '{0}' does not have full-text index.. - /// - internal static string ExEntityDoesNotHaveFullTextIndex { - get { - return ResourceManager.GetString("ExEntityDoesNotHaveFullTextIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity is already detached from Session. Likely, this is result of creation of new Entity with the same Key.. - /// - internal static string ExEntityIsAlreadyDetachedFromSession { - get { - return ResourceManager.GetString("ExEntityIsAlreadyDetachedFromSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity is in inconsistent state.. - /// - internal static string ExEntityIsInInconsistentState { - get { - return ResourceManager.GetString("ExEntityIsInInconsistentState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity is removed.. - /// - internal static string ExEntityIsRemoved { - get { - return ResourceManager.GetString("ExEntityIsRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity of type '{0}' is incompatible with this EntitySet.. - /// - internal static string ExEntityOfTypeXIsIncompatibleWithThisEntitySet { - get { - return ResourceManager.GetString("ExEntityOfTypeXIsIncompatibleWithThisEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to modify removed entity.. - /// - internal static string ExEntityRemoved { - get { - return ResourceManager.GetString("ExEntityRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to EntitySet can't be assigned.. - /// - internal static string ExEntitySetCanTBeAssigned { - get { - return ResourceManager.GetString("ExEntitySetCanTBeAssigned", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity set is invalid due to current transaction is not active.. - /// - internal static string ExEntitySetInvalidBecauseTransactionIsNotActive { - get { - return ResourceManager.GetString("ExEntitySetInvalidBecauseTransactionIsNotActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity with key '{0}' already exists. - /// - internal static string ExEntityWithKeyXAlreadyExists { - get { - return ResourceManager.GetString("ExEntityWithKeyXAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity '{0}' is bound to another Session.. - /// - internal static string ExEntityXIsBoundToAnotherSession { - get { - return ResourceManager.GetString("ExEntityXIsBoundToAnotherSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enumeration is already finished.. - /// - internal static string ExEnumerationIsAlreadyFinished { - get { - return ResourceManager.GetString("ExEnumerationIsAlreadyFinished", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enumeration is not started.. - /// - internal static string ExEnumerationIsNotStarted { - get { - return ResourceManager.GetString("ExEnumerationIsNotStarted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to insert instance of type '{0}' with specified key. Query affected {1} tables, but expected {2} tables.. - /// - internal static string ExErrorOnInsert { - get { - return ResourceManager.GetString("ExErrorOnInsert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to update instance of type {0} with specified key. Query affected {1} tables, but expecrted {2} tables.. - /// - internal static string ExErrorOnUpdate { - get { - return ResourceManager.GetString("ExErrorOnUpdate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Some errors have been occurred during storage build. See error log for details.. - /// - internal static string ExErrorsDuringStorageBuild { - get { - return ResourceManager.GetString("ExErrorsDuringStorageBuild", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Escape character must differ from delimiter character.. - /// - internal static string ExEscapeCharacterMustDifferFromDelimiterCharacter { - get { - return ResourceManager.GetString("ExEscapeCharacterMustDifferFromDelimiterCharacter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Exception has been thrown by the parameter value accessor.. - /// - internal static string ExExceptionHasBeenThrownByTheParameterValueAccessor { - get { - return ResourceManager.GetString("ExExceptionHasBeenThrownByTheParameterValueAccessor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Exception has been thrown by the user member compiler.. - /// - internal static string ExExceptionHasBeenThrownByTheUserMemberCompiler { - get { - return ResourceManager.GetString("ExExceptionHasBeenThrownByTheUserMemberCompiler", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The exception was thrown during the task's execution.. - /// - internal static string ExExceptionWasThrownDuringTaskExecution { - get { - return ResourceManager.GetString("ExExceptionWasThrownDuringTaskExecution", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ExcludeFields does not support query provider of type '{0}'.. - /// - internal static string ExExcludeFieldsDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExExcludeFieldsDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The expected value of the parameter is already set.. - /// - internal static string ExExpectedValueOfParameterIsAlreadySet { - get { - return ResourceManager.GetString("ExExpectedValueOfParameterIsAlreadySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' must reference field.. - /// - internal static string ExExpression0MustReferenceField { - get { - return ResourceManager.GetString("ExExpression0MustReferenceField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' must reference property.. - /// - internal static string ExExpression0MustReferenceProperty { - get { - return ResourceManager.GetString("ExExpression0MustReferenceProperty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' defined outside of CachingQuery closure.. - /// - internal static string ExExpressionDefinedOutsideOfCachingQueryClosure { - get { - return ResourceManager.GetString("ExExpressionDefinedOutsideOfCachingQueryClosure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The expression having the different normal form must not be a root expression.. - /// - internal static string ExExpressionHavingDifferentNormalFormMustNotBeRoot { - get { - return ResourceManager.GetString("ExExpressionHavingDifferentNormalFormMustNotBeRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The expression having the equal normal form must be a root expression.. - /// - internal static string ExExpressionHavingEqualNormalFormMustBeRoot { - get { - return ResourceManager.GetString("ExExpressionHavingEqualNormalFormMustBeRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The expression must return a value of type '{0}'.. - /// - internal static string ExExpressionMustReturnValueOfTypeX { - get { - return ResourceManager.GetString("ExExpressionMustReturnValueOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' is not a sequence.. - /// - internal static string ExExpressionXIsNotASequence { - get { - return ResourceManager.GetString("ExExpressionXIsNotASequence", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted and target schemas are equal but there are changes in type identifiers set.. - /// - internal static string ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet { - get { - return ResourceManager.GetString("ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted schema is not compatible with the target schema. Details: - ///{0}. - /// - internal static string ExExtractedSchemaIsNotCompatibleWithTheTargetSchema_DetailsX { - get { - return ResourceManager.GetString("ExExtractedSchemaIsNotCompatibleWithTheTargetSchema_DetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted schema is not equal to the target schema. Details: - ///{0}. - /// - internal static string ExExtractedSchemaIsNotEqualToTheTargetSchema_DetailsX { - get { - return ResourceManager.GetString("ExExtractedSchemaIsNotEqualToTheTargetSchema_DetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field access expression '{0}' does not access to '{1}' type members.. - /// - internal static string ExFieldAccessExpressionXDoesNotAccessToYTypeMembers { - get { - return ResourceManager.GetString("ExFieldAccessExpressionXDoesNotAccessToYTypeMembers", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field belongs to a different type.. - /// - internal static string ExFieldBelongsToADifferentType { - get { - return ResourceManager.GetString("ExFieldBelongsToADifferentType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field with index '{0}' is infinite.. - /// - internal static string ExFieldIsInfinite { - get { - return ResourceManager.GetString("ExFieldIsInfinite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not an Entity field in Type '{1}'.. - /// - internal static string ExFieldIsNotAnEntityField { - get { - return ResourceManager.GetString("ExFieldIsNotAnEntityField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not structure.. - /// - internal static string ExFieldIsNotStructure { - get { - return ResourceManager.GetString("ExFieldIsNotStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field must be of EntitySet<> type.. - /// - internal static string ExFieldMustBeOfEntitySetType { - get { - return ResourceManager.GetString("ExFieldMustBeOfEntitySetType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' must be persistent (marked by [Field] attribute).. - /// - internal static string ExFieldMustBePersistent { - get { - return ResourceManager.GetString("ExFieldMustBePersistent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not found in model.. - /// - internal static string ExFieldNotFoundInModel { - get { - return ResourceManager.GetString("ExFieldNotFoundInModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field of type '{0}' cannot be nullable. For value types consider using Nullable<T>.. - /// - internal static string ExFieldOfTypeXCannotBeNullableForValueTypesConsiderUsingNullableT { - get { - return ResourceManager.GetString("ExFieldOfTypeXCannotBeNullableForValueTypesConsiderUsingNullableT", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field with name '{0}' already exists in EntityInfo.Fields collection.. - /// - internal static string ExFieldWithNameAlreadyExistsInEntityFieldsCollection { - get { - return ResourceManager.GetString("ExFieldWithNameAlreadyExistsInEntityFieldsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field with name '{0}' is already registered.. - /// - internal static string ExFieldWithNameXIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExFieldWithNameXIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' cannot be LazyLoad as it is included into primary key.. - /// - internal static string ExFieldXCannotBeLazyLoadAsItIsIncludedInPrimaryKey { - get { - return ResourceManager.GetString("ExFieldXCannotBeLazyLoadAsItIsIncludedInPrimaryKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' cannot be Nullable as it is included into primary key.. - /// - internal static string ExFieldXCannotBeNullableAsItIsIncludedInPrimaryKey { - get { - return ResourceManager.GetString("ExFieldXCannotBeNullableAsItIsIncludedInPrimaryKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' has '{1}' type but is marked as not nullable.. - /// - internal static string ExFieldXHasYTypeButIsMarkedAsNotNullable { - get { - return ResourceManager.GetString("ExFieldXHasYTypeButIsMarkedAsNotNullable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is already defined in type '{1}' or in its ancestor.. - /// - internal static string ExFieldXIsAlreadyDefinedInTypeXOrItsAncestor { - get { - return ResourceManager.GetString("ExFieldXIsAlreadyDefinedInTypeXOrItsAncestor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not an entity reference, nor entity set.. - /// - internal static string ExFieldXIsNotAnEntityReferenceNorEntitySet { - get { - return ResourceManager.GetString("ExFieldXIsNotAnEntityReferenceNorEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not an entity set.. - /// - internal static string ExFieldXIsNotAnEntitySet { - get { - return ResourceManager.GetString("ExFieldXIsNotAnEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not an EntitySet field.. - /// - internal static string ExFieldXIsNotAnEntitySetField { - get { - return ResourceManager.GetString("ExFieldXIsNotAnEntitySetField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The field {0} is not declared in the type {1} or in one of its ancestors.. - /// - internal static string ExFieldXIsNotDeclaredInTypeYOrInOneOfItsAncestors { - get { - return ResourceManager.GetString("ExFieldXIsNotDeclaredInTypeYOrInOneOfItsAncestors", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not entity.. - /// - internal static string ExFieldXIsNotEntity { - get { - return ResourceManager.GetString("ExFieldXIsNotEntity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is not primitive.. - /// - internal static string ExFieldXIsNotPrimitive { - get { - return ResourceManager.GetString("ExFieldXIsNotPrimitive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' not found in type '{1}'.. - /// - internal static string ExFieldXNotFoundInTypeX { - get { - return ResourceManager.GetString("ExFieldXNotFoundInTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}.{1}' is already paired with '{2}.{3}'. Please remove [Association] attribute at '{4}.{5}'.. - /// - internal static string ExFieldXYIsAlreadyPairedWithABRemoveCD { - get { - return ResourceManager.GetString("ExFieldXYIsAlreadyPairedWithABRemoveCD", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}.{1}' is not found.. - /// - internal static string ExFieldXYIsNotFound { - get { - return ResourceManager.GetString("ExFieldXYIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Filter tuple descriptor mistmatches with source mapping descriptor.. - /// - internal static string ExFilterTupleDescriptorMistmatchesWithSourceMappingDescriptor { - get { - return ResourceManager.GetString("ExFilterTupleDescriptorMistmatchesWithSourceMappingDescriptor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The foreign key's value have not been loaded.. - /// - internal static string ExForeignKeyValueHaveNotBeenLoaded { - get { - return ResourceManager.GetString("ExForeignKeyValueHaveNotBeenLoaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'FreeText<T>({0})' not supported in compiled queries (Query.Execute). Use 'FreeText<T>(Expression<Func<int>>)' instead.For example use 'FreeText<T>(()=>{0})'.. - /// - internal static string ExFreeTextNotSupportedInCompiledQueries { - get { - return ResourceManager.GetString("ExFreeTextNotSupportedInCompiledQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Function '{0}' is not supported.. - /// - internal static string ExFunctionXIsNotSupported { - get { - return ResourceManager.GetString("ExFunctionXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Generic parameter '{0}' should be of type '{1}'.. - /// - internal static string ExGenericParameterShouldBeOfTypeT { - get { - return ResourceManager.GetString("ExGenericParameterShouldBeOfTypeT", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The given key was not present in the dictionary.. - /// - internal static string ExGivenKeyNotPresent { - get { - return ResourceManager.GetString("ExGivenKeyNotPresent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to GroupBy overload '{0}' is not supported.. - /// - internal static string ExGroupByOverloadXIsNotSupported { - get { - return ResourceManager.GetString("ExGroupByOverloadXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hierarchy is not found for type '{0}'.. - /// - internal static string ExHierarchyIsNotFoundForTypeX { - get { - return ResourceManager.GetString("ExHierarchyIsNotFoundForTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hierarchy root is not registered.. - /// - internal static string ExHierarchyRootIsNotRegistered { - get { - return ResourceManager.GetString("ExHierarchyRootIsNotRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hierarchy '{0}' doesn't contain any key fields.. - /// - internal static string ExHierarchyXDoesntContainAnyKeyFields { - get { - return ResourceManager.GetString("ExHierarchyXDoesntContainAnyKeyFields", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hint '{0}' is conflicting with hint '{1}'. - /// - internal static string ExHintXIsConflictingWithHintY { - get { - return ResourceManager.GetString("ExHintXIsConflictingWithHintY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignore rule '{0}' must be applied to column or table.. - /// - internal static string ExIgnoreRuleXMustBeAppliedToColumnOrTable { - get { - return ResourceManager.GetString("ExIgnoreRuleXMustBeAppliedToColumnOrTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Implementors of {0} interface belong to hierarchies one of which includes TypeId, but another doesn't: {1} & {2}.. - /// - internal static string ExImplementorsOfXInterfaceBelongToHierarchiesOneOfWhichIncludesTypeIdButAnotherDoesntYZ { - get { - return ResourceManager.GetString("ExImplementorsOfXInterfaceBelongToHierarchiesOneOfWhichIncludesTypeIdButAnotherDo" + - "esntYZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Implementors of {0} interface belong to hierarchies with different key structure: {1} & {2}.. - /// - internal static string ExImplementorsOfXInterfaceBelongToHierarchiesWithDifferentKeyStructureYZ { - get { - return ResourceManager.GetString("ExImplementorsOfXInterfaceBelongToHierarchiesWithDifferentKeyStructureYZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Conversion from type {0} to type {1} is inadmissible.. - /// - internal static string ExInadmissibleTypeConversion { - get { - return ResourceManager.GetString("ExInadmissibleTypeConversion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to IncludeFields does not support query provider of type '{0}'.. - /// - internal static string ExIncludeFieldsDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExIncludeFieldsDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incompatible array type.. - /// - internal static string ExIncompatibleArrayType { - get { - return ResourceManager.GetString("ExIncompatibleArrayType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The two collections cannot be combined because they use different comparison operations.. - /// - internal static string ExInconsistentComparisons { - get { - return ResourceManager.GetString("ExInconsistentComparisons", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect command parameters.. - /// - internal static string ExIncorrectCommandParameters { - get { - return ResourceManager.GetString("ExIncorrectCommandParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect namespace synonyms.. - /// - internal static string ExIncorrectNamespaceSynonyms { - get { - return ResourceManager.GetString("ExIncorrectNamespaceSynonyms", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect Stage value: '{0}'.. - /// - internal static string ExIncorrectStageValue { - get { - return ResourceManager.GetString("ExIncorrectStageValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Increment must not be 0.. - /// - internal static string ExIncrementMustNotBeZero { - get { - return ResourceManager.GetString("ExIncrementMustNotBeZero", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index already contains field '{0}'.. - /// - internal static string ExIndexAlreadyContainsField { - get { - return ResourceManager.GetString("ExIndexAlreadyContainsField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Indexed properties are not supported.. - /// - internal static string ExIndexedPropertiesAreNotSupported { - get { - return ResourceManager.GetString("ExIndexedPropertiesAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Indexes of columns to be loaded are not specified.. - /// - internal static string ExIndexesOfColumnsToBeLoadedAreNotSpecified { - get { - return ResourceManager.GetString("ExIndexesOfColumnsToBeLoadedAreNotSpecified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index field '{0}' is incorrect.. - /// - internal static string ExIndexFieldXIsIncorrect { - get { - return ResourceManager.GetString("ExIndexFieldXIsIncorrect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index '{0}' is changed.. - /// - internal static string ExIndexIsChanged { - get { - return ResourceManager.GetString("ExIndexIsChanged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index must contain at least one field.. - /// - internal static string ExIndexMustContainAtLeastOneField { - get { - return ResourceManager.GetString("ExIndexMustContainAtLeastOneField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index name '{0}' is invalid.. - /// - internal static string ExIndexNameXIsInvalid { - get { - return ResourceManager.GetString("ExIndexNameXIsInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index is out of range.. - /// - internal static string ExIndexOutOfRange { - get { - return ResourceManager.GetString("ExIndexOutOfRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index should be in [{0}...{1}] range.. - /// - internal static string ExIndexShouldBeInNMRange { - get { - return ResourceManager.GetString("ExIndexShouldBeInNMRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index with name '{0}' already exists in EntityInfo.Indexes collection.. - /// - internal static string ExIndexWithNameAlreadyExistsInEntityInfoIndexesCollection { - get { - return ResourceManager.GetString("ExIndexWithNameAlreadyExistsInEntityInfoIndexesCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index with name '{0}' is already registered.. - /// - internal static string ExIndexWithNameXIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExIndexWithNameXIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index '{0}' can not be both partial and clustered. - /// - internal static string ExIndexXCanNotBeBothPartialAndClustered { - get { - return ResourceManager.GetString("ExIndexXCanNotBeBothPartialAndClustered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index '{0}' is not found.. - /// - internal static string ExIndexXIsNotFound { - get { - return ResourceManager.GetString("ExIndexXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inheritance schema '{0}' is invalid.. - /// - internal static string ExInheritanceSchemaIsInvalid { - get { - return ResourceManager.GetString("ExInheritanceSchemaIsInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance is empty.. - /// - internal static string ExInstanceIsEmpty { - get { - return ResourceManager.GetString("ExInstanceIsEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance is locked.. - /// - internal static string ExInstanceIsLocked { - get { - return ResourceManager.GetString("ExInstanceIsLocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple instances of type '{0}' with specified key are found.. - /// - internal static string ExInstanceMultipleResults { - get { - return ResourceManager.GetString("ExInstanceMultipleResults", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance must be locked before this operation.. - /// - internal static string ExInstanceMustBeLockedBeforeThisOperation { - get { - return ResourceManager.GetString("ExInstanceMustBeLockedBeforeThisOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A instance must have non-null IHasSyncRoot.SyncRoot property value.. - /// - internal static string ExInstanceMustHaveSyncRoot { - get { - return ResourceManager.GetString("ExInstanceMustHaveSyncRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance of type '{0}' with specified key is not found.. - /// - internal static string ExInstanceNotFound { - get { - return ResourceManager.GetString("ExInstanceNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Interface '{0}' does not belong to '{1}' hierarchy.. - /// - internal static string ExInterfaceXDoesNotBelongToXHierarchy { - get { - return ResourceManager.GetString("ExInterfaceXDoesNotBelongToXHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Interface '{0}' is implemented by types mapped to different databases: {1}, {2}. - /// - internal static string ExInterfaceXIsImplementedByTypesMappedToDifferentDatabasesYZ { - get { - return ResourceManager.GetString("ExInterfaceXIsImplementedByTypesMappedToDifferentDatabasesYZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Internal error: {0}. - /// - internal static string ExInternalError { - get { - return ResourceManager.GetString("ExInternalError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid action type.. - /// - internal static string ExInvalidActionType { - get { - return ResourceManager.GetString("ExInvalidActionType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Active scope is invalid - it differs from the expected one. Probably you have forgot to dispose some nested scope.. - /// - internal static string ExInvalidActiveScope { - get { - return ResourceManager.GetString("ExInvalidActiveScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid AfterPath property value.. - /// - internal static string ExInvalidAfterPathPropertyValue { - get { - return ResourceManager.GetString("ExInvalidAfterPathPropertyValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid arguments: non-null 'typeName' is allowed if and only if 'type' equals 'SqlType.Unknown'. - /// - internal static string ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown { - get { - return ResourceManager.GetString("ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid arguments: 'precision' and 'length' should not be used together. - /// - internal static string ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether { - get { - return ResourceManager.GetString("ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid arguments: 'scale' and 'precision' should be used together. - /// - internal static string ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether { - get { - return ResourceManager.GetString("ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid argument type: expected type is {0}.. - /// - internal static string ExInvalidArgumentType { - get { - return ResourceManager.GetString("ExInvalidArgumentType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid boolean string '{0}'.. - /// - internal static string ExInvalidBooleanStringX { - get { - return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified capacity value is less than collection count.. - /// - internal static string ExInvalidCapacity { - get { - return ResourceManager.GetString("ExInvalidCapacity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cast from '{0}' to '{1}' is invalid.. - /// - internal static string ExInvalidCast { - get { - return ResourceManager.GetString("ExInvalidCast", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid constraint type.. - /// - internal static string ExInvalidConstraintType { - get { - return ResourceManager.GetString("ExInvalidConstraintType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid context activation sequence.. - /// - internal static string ExInvalidContextActivationSequence { - get { - return ResourceManager.GetString("ExInvalidContextActivationSequence", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid context deactivation sequence.. - /// - internal static string ExInvalidContextDeactivationSequence { - get { - return ResourceManager.GetString("ExInvalidContextDeactivationSequence", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Direction value (Direction.None).. - /// - internal static string ExInvalidDirectionValue { - get { - return ResourceManager.GetString("ExInvalidDirectionValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Increment value must be greater then zero.. - /// - internal static string ExInvalideIncrementValue { - get { - return ResourceManager.GetString("ExInvalideIncrementValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid expression type.. - /// - internal static string ExInvalidExpressionType { - get { - return ResourceManager.GetString("ExInvalidExpressionType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid field map size. Expected {0}.. - /// - internal static string ExInvalidFieldMapSizeExpectedX { - get { - return ResourceManager.GetString("ExInvalidFieldMapSizeExpectedX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid field name '{0}'.. - /// - internal static string ExInvalidFieldNameX { - get { - return ResourceManager.GetString("ExInvalidFieldNameX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid field value, constraint {0} is violated.. - /// - internal static string ExInvalidFieldValueConstraintXIsViolated { - get { - return ResourceManager.GetString("ExInvalidFieldValueConstraintXIsViolated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid fill factor '{0}'. Value must be between 0 and 1.. - /// - internal static string ExInvalidFillFactorXValueMustBeBetween0And1 { - get { - return ResourceManager.GetString("ExInvalidFillFactorXValueMustBeBetween0And1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence.. - /// - internal static string ExInvalidForeignKeyStructure { - get { - return ResourceManager.GetString("ExInvalidForeignKeyStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' formatter process type is invalid for the current operation.. - /// - internal static string ExInvalidFormatterProcessType { - get { - return ResourceManager.GetString("ExInvalidFormatterProcessType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to IncludedColumns collection is invalid.. - /// - internal static string ExInvalidIncludedColumnsCollection { - get { - return ResourceManager.GetString("ExInvalidIncludedColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create Key. Key params do not correspond to its structure.. - /// - internal static string ExInvalidKeyParams { - get { - return ResourceManager.GetString("ExInvalidKeyParams", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to String representaion of the Key has invalid format.. - /// - internal static string ExInvalidKeyString { - get { - return ResourceManager.GetString("ExInvalidKeyString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Length attribute on '{0}' field.. - /// - internal static string ExInvalidLengthAttributeOnXField { - get { - return ResourceManager.GetString("ExInvalidLengthAttributeOnXField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid mapping name '{0}'.. - /// - internal static string ExInvalidMappingNameX { - get { - return ResourceManager.GetString("ExInvalidMappingNameX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Nesting of node "{0}".. - /// - internal static string ExInvalidNestingOfNodeX { - get { - return ResourceManager.GetString("ExInvalidNestingOfNodeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid node identifier.. - /// - internal static string ExInvalidNodeIdentifier { - get { - return ResourceManager.GetString("ExInvalidNodeIdentifier", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid node state.. - /// - internal static string ExInvalidNodeState { - get { - return ResourceManager.GetString("ExInvalidNodeState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid number of parameters in NewExpression.. - /// - internal static string ExInvalidNumberOfParametersInNewExpression { - get { - return ResourceManager.GetString("ExInvalidNumberOfParametersInNewExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Object serializer is invalid, since similar value serializer exists.. - /// - internal static string ExInvalidObjectSerializerSimilarValueSerializerExists { - get { - return ResourceManager.GetString("ExInvalidObjectSerializerSimilarValueSerializerExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Parent value.. - /// - internal static string ExInvalidParentValue { - get { - return ResourceManager.GetString("ExInvalidParentValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Precision attribute on field '{0}'.. - /// - internal static string ExInvalidPrecisionAttributeOnFieldX { - get { - return ResourceManager.GetString("ExInvalidPrecisionAttributeOnFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid prefetch selector '{0}'.. - /// - internal static string ExInvalidPrefetchSelectorX { - get { - return ResourceManager.GetString("ExInvalidPrefetchSelectorX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PrimaryKeyColumns collection is invalid.. - /// - internal static string ExInvalidPrimaryKeyColumnsCollection { - get { - return ResourceManager.GetString("ExInvalidPrimaryKeyColumnsCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table.. - /// - internal static string ExInvalidPrimaryKeyStructure { - get { - return ResourceManager.GetString("ExInvalidPrimaryKeyStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Record with invalid (possibly - unspecified) type is found.. - /// - internal static string ExInvalidRecordType { - get { - return ResourceManager.GetString("ExInvalidRecordType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Scale attribute on field '{0}'.. - /// - internal static string ExInvalidScaleAttributeOnFieldX { - get { - return ResourceManager.GetString("ExInvalidScaleAttributeOnFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid scope disposal order.. - /// - internal static string ExInvalidScopeDisposalOrder { - get { - return ResourceManager.GetString("ExInvalidScopeDisposalOrder", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' can't be an IsReferable serializer, since it serializes IReference type.. - /// - internal static string ExInvalidSerializerBehaviorMustNotBeReferable { - get { - return ResourceManager.GetString("ExInvalidSerializerBehaviorMustNotBeReferable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Generic parameter T is resolved to associated '{0}', although '{1}' is expected.. - /// - internal static string ExInvalidSerializerType { - get { - return ResourceManager.GetString("ExInvalidSerializerType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The Session of specified ISessionBound object is invalid.. - /// - internal static string ExInvalidSession { - get { - return ResourceManager.GetString("ExInvalidSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid sort expression '{0}'. - /// - internal static string ExInvalidSortExpressionX { - get { - return ResourceManager.GetString("ExInvalidSortExpressionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid transaction state ('{0}'). Expected state(s) is (are) '{1}'.. - /// - internal static string ExInvalidTransactionState { - get { - return ResourceManager.GetString("ExInvalidTransactionState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid TupleDescriptor. Expected descriptor is {0}.. - /// - internal static string ExInvalidTupleDescriptorExpectedDescriptorIs { - get { - return ResourceManager.GetString("ExInvalidTupleDescriptorExpectedDescriptorIs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid upgrader version.. - /// - internal static string ExInvalidUpgraderVersion { - get { - return ResourceManager.GetString("ExInvalidUpgraderVersion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "{0}" is invalid URL.. - /// - internal static string ExInvalidUrl { - get { - return ResourceManager.GetString("ExInvalidUrl", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid usage of the "orientation" argument.. - /// - internal static string ExInvalidUsageOfTheOrientationArgument { - get { - return ResourceManager.GetString("ExInvalidUsageOfTheOrientationArgument", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid usage of the "rowCount" argument.. - /// - internal static string ExInvalidUsageOfTheRowCountArgument { - get { - return ResourceManager.GetString("ExInvalidUsageOfTheRowCountArgument", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Isolation level '{0}' is not supported. - /// - internal static string ExIsolationLevelXIsNotSupported { - get { - return ResourceManager.GetString("ExIsolationLevelXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item already exists.. - /// - internal static string ExItemAlreadyExists { - get { - return ResourceManager.GetString("ExItemAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item by key ='{0}' was not found.. - /// - internal static string ExItemByKeyXWasNotFound { - get { - return ResourceManager.GetString("ExItemByKeyXWasNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified item cannot be cached because its type is incompatible with underlying storage format.. - /// - internal static string ExItemCantBeCachedIncompatibleType { - get { - return ResourceManager.GetString("ExItemCantBeCachedIncompatibleType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified item cannot be cached because its type is incompatible with ITuple.. - /// - internal static string ExItemCantBeComparedIncompatibleType { - get { - return ResourceManager.GetString("ExItemCantBeComparedIncompatibleType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified item is already in use.. - /// - internal static string ExItemIsInUse { - get { - return ResourceManager.GetString("ExItemIsInUse", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified item is not in use.. - /// - internal static string ExItemIsNotInUse { - get { - return ResourceManager.GetString("ExItemIsNotInUse", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified item isn't pooled.. - /// - internal static string ExItemIsNotPooled { - get { - return ResourceManager.GetString("ExItemIsNotPooled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified item isn't found.. - /// - internal static string ExItemNotFound { - get { - return ResourceManager.GetString("ExItemNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item is not found in EntitySet.. - /// - internal static string ExItemNotFoundInEntitySet { - get { - return ResourceManager.GetString("ExItemNotFoundInEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Items for cycle '{0}' are not specified.. - /// - internal static string ExItemsForCycleXAreNotSpecified { - get { - return ResourceManager.GetString("ExItemsForCycleXAreNotSpecified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item with key '{0}' was not found.. - /// - internal static string ExItemWithKeyXWasNotFound { - get { - return ResourceManager.GetString("ExItemWithKeyXWasNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item with name '{0}' was not found.. - /// - internal static string ExItemWithNameWasNotFound { - get { - return ResourceManager.GetString("ExItemWithNameWasNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item with name '{0}' already exists.. - /// - internal static string ExItemWithNameXAlreadyExists { - get { - return ResourceManager.GetString("ExItemWithNameXAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item with name '{0}' already exists in '{1}'.. - /// - internal static string ExItemWithNameXAlreadyExistsInY { - get { - return ResourceManager.GetString("ExItemWithNameXAlreadyExistsInY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item with Name '{0}' is not found.. - /// - internal static string ExItemWithNameXIsNotFound { - get { - return ResourceManager.GetString("ExItemWithNameXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An item with the same key has already been added.. - /// - internal static string ExItemWithTheSameKeyHasBeenAdded { - get { - return ResourceManager.GetString("ExItemWithTheSameKeyHasBeenAdded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Join expression should be NULL for CROSS APPLY & OUTER APPLY.. - /// - internal static string ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply { - get { - return ResourceManager.GetString("ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key already exists.. - /// - internal static string ExKeyAlreadyExists { - get { - return ResourceManager.GetString("ExKeyAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key can not be null.. - /// - internal static string ExKeyCanNotBeNull { - get { - return ResourceManager.GetString("ExKeyCanNotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate expression '{0}'. Key comparer is not supported in GroupJoin.. - /// - internal static string ExKeyComparerNotSupportedInGroupJoin { - get { - return ResourceManager.GetString("ExKeyComparerNotSupportedInGroupJoin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key contains multiple fields with IsTypeId==true flag.. - /// - internal static string ExKeyContainsMultipleFieldsWithIsTypeIdTrueFlag { - get { - return ResourceManager.GetString("ExKeyContainsMultipleFieldsWithIsTypeIdTrueFlag", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key field can't be of '{0}' type.. - /// - internal static string ExKeyFieldCantBeOfXType { - get { - return ResourceManager.GetString("ExKeyFieldCantBeOfXType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key fields '{0}' and '{1}' have the same position: '{2}'.. - /// - internal static string ExKeyFieldsXAndXHaveTheSamePositionX { - get { - return ResourceManager.GetString("ExKeyFieldsXAndXHaveTheSamePositionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key property '{0}' declared in '{1}' should not have public or protected set accessor. Use base protected constructor to set Key value.. - /// - internal static string ExKeyFieldXInTypeYShouldNotHaveSetAccessor { - get { - return ResourceManager.GetString("ExKeyFieldXInTypeYShouldNotHaveSetAccessor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key field '{0}' was not found in type '{1}'.. - /// - internal static string ExKeyFieldXWasNotFoundInTypeY { - get { - return ResourceManager.GetString("ExKeyFieldXWasNotFoundInTypeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key field '{0}.{1}' is not found.. - /// - internal static string ExKeyFieldXXIsNotFound { - get { - return ResourceManager.GetString("ExKeyFieldXXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [KeyGenerator] attribute on type '{0}' requires Name to be set.. - /// - internal static string ExKeyGeneratorAttributeOnTypeXRequiresNameToBeSet { - get { - return ResourceManager.GetString("ExKeyGeneratorAttributeOnTypeXRequiresNameToBeSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key generators '{0}' and '{1}' have the same seed value.. - /// - internal static string ExKeyGeneratorsXAndYHaveTheSameSeedValue { - get { - return ResourceManager.GetString("ExKeyGeneratorsXAndYHaveTheSameSeedValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key indexes are specified for non-generic Key.. - /// - internal static string ExKeyIndexesAreSpecifiedForNonGenericKey { - get { - return ResourceManager.GetString("ExKeyIndexesAreSpecifiedForNonGenericKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key must have exact type here.. - /// - internal static string ExKeyMustHaveExactType { - get { - return ResourceManager.GetString("ExKeyMustHaveExactType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key of specified type cannot be generated by this KeyGenerator.. - /// - internal static string ExKeyOfSpecifiedTypeCannotBeGeneratedByThisKeyGenerator { - get { - return ResourceManager.GetString("ExKeyOfSpecifiedTypeCannotBeGeneratedByThisKeyGenerator", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key of '{0}' does not match key of '{1}'.. - /// - internal static string ExKeyOfXDoesNotMatchKeyOfY { - get { - return ResourceManager.GetString("ExKeyOfXDoesNotMatchKeyOfY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key provider '{0}' and hierarchy {1} key field amount mismatch.. - /// - internal static string ExKeyProviderXAndHierarchyYKeyFieldAmountMismatch { - get { - return ResourceManager.GetString("ExKeyProviderXAndHierarchyYKeyFieldAmountMismatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key provider '{0}' should define at least one key field.. - /// - internal static string ExKeyProviderXShouldDefineAtLeastOneKeyField { - get { - return ResourceManager.GetString("ExKeyProviderXShouldDefineAtLeastOneKeyField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}'. Keys of '{1}' and '{2}' not compatible.. - /// - internal static string ExKeysOfXAndXNotCompatible { - get { - return ResourceManager.GetString("ExKeysOfXAndXNotCompatible", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key structure for '{0}' contains NULL value.. - /// - internal static string ExKeyStructureForXContainsNULLValue { - get { - return ResourceManager.GetString("ExKeyStructureForXContainsNULLValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key values array is empty.. - /// - internal static string ExKeyValuesArrayIsEmpty { - get { - return ResourceManager.GetString("ExKeyValuesArrayIsEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key {0} is not found.. - /// - internal static string ExKeyXIsNotFound { - get { - return ResourceManager.GetString("ExKeyXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key {0} should have exact type.. - /// - internal static string ExKeyXShouldHaveExactType { - get { - return ResourceManager.GetString("ExKeyXShouldHaveExactType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key '{0}' was not found in storage.. - /// - internal static string ExKeyXWasNotFoundInStorage { - get { - return ResourceManager.GetString("ExKeyXWasNotFoundInStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LambdaExpression returned by '{0}' should return value that is assignable to '{1}'. - /// - internal static string ExLambdaExpressionReturnedByXShouldReturnValueThatIsAssignableToY { - get { - return ResourceManager.GetString("ExLambdaExpressionReturnedByXShouldReturnValueThatIsAssignableToY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LambdaExpression returned by '{0}' should take one parameter of type '{1}' or any base type of it. - /// - internal static string ExLambdaExpressionReturnedByXShouldTakeOneParameterOfTypeYOrAnyBaseTypeOfIt { - get { - return ResourceManager.GetString("ExLambdaExpressionReturnedByXShouldTakeOneParameterOfTypeYOrAnyBaseTypeOfIt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lambda parameter is out of scope.. - /// - internal static string ExLambdaParameterIsOutOfScope { - get { - return ResourceManager.GetString("ExLambdaParameterIsOutOfScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lambda parameter '{0}' is out of scope.. - /// - internal static string ExLambdaParameterXIsOutOfScope { - get { - return ResourceManager.GetString("ExLambdaParameterXIsOutOfScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lambda '{0}' must have only one parameter.. - /// - internal static string ExLambdaXMustHaveOnlyOneParameter { - get { - return ResourceManager.GetString("ExLambdaXMustHaveOnlyOneParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LeftJoin does not support query provider of type '{0}'.. - /// - internal static string ExLeftJoinDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExLeftJoinDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Legacy schema is not compatible. Details: - ///{0}. - /// - internal static string ExLegacySchemaIsNotCompatible_DetailsX { - get { - return ResourceManager.GetString("ExLegacySchemaIsNotCompatible_DetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Length' constraint violation on field '{0}'.. - /// - internal static string ExLengthConstraintViolationOnFieldX { - get { - return ResourceManager.GetString("ExLengthConstraintViolationOnFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Length should be not negative value.. - /// - internal static string ExLengthShouldBeNotNegativeValue { - get { - return ResourceManager.GetString("ExLengthShouldBeNotNegativeValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The limit of the graph depth is exceeded.. - /// - internal static string ExLimitOfGraphDepthIsExceeded { - get { - return ResourceManager.GetString("ExLimitOfGraphDepthIsExceeded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Linked operation for property {0} missing.. - /// - internal static string ExLinkedOperationMissingFormat { - get { - return ResourceManager.GetString("ExLinkedOperationMissingFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate expression '{0}'. LINQ translator does not support method '{1}'.. - /// - internal static string ExLinqTranslatorDoesNotSupportMethodX { - get { - return ResourceManager.GetString("ExLinqTranslatorDoesNotSupportMethodX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Literal type '{0}' is not supported.. - /// - internal static string ExLiteralTypeXIsNotSupported { - get { - return ResourceManager.GetString("ExLiteralTypeXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Local collection should not be query root.. - /// - internal static string ExLocalCollectionShouldNotBeQueryRoot { - get { - return ResourceManager.GetString("ExLocalCollectionShouldNotBeQueryRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lock does not support query provider of type '{0}'.. - /// - internal static string ExLockDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExLockDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lock '{0}' is not supported. - /// - internal static string ExLockXIsNotSupported { - get { - return ResourceManager.GetString("ExLockXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LogManager already initialized.. - /// - internal static string ExLogManagerAlreadyInitialized { - get { - return ResourceManager.GetString("ExLogManagerAlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LogManager must be initialized before using.. - /// - internal static string ExLogManagerMustBeInitializedBeforeUsing { - get { - return ResourceManager.GetString("ExLogManagerMustBeInitializedBeforeUsing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loop in action dependency chain is detected.. - /// - internal static string ExLoopInActionDependencyChain { - get { - return ResourceManager.GetString("ExLoopInActionDependencyChain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The mapping for the property {0} has already been registered.. - /// - internal static string ExMappingForPropertyXHasAlreadyBeenRegistered { - get { - return ResourceManager.GetString("ExMappingForPropertyXHasAlreadyBeenRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Materialization error: Entity's TypeId column does not exist in the underlying RecordSet.. - /// - internal static string ExMaterializationErrorTypeIdColumnDoesNotExistsInTheUnderlyingRecordSet { - get { - return ResourceManager.GetString("ExMaterializationErrorTypeIdColumnDoesNotExistsInTheUnderlyingRecordSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Maximal item count is {0}.. - /// - internal static string ExMaxItemCountIsN { - get { - return ResourceManager.GetString("ExMaxItemCountIsN", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Measurement is already completed.. - /// - internal static string ExMeasurementIsAlreadyCompleted { - get { - return ResourceManager.GetString("ExMeasurementIsAlreadyCompleted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Measurement '{0}' must have value.. - /// - internal static string ExMeasurementMustHaveValue { - get { - return ResourceManager.GetString("ExMeasurementMustHaveValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Member: '{0}' is not a Public Property or Field of Type: '{1}'. - /// - internal static string ExMemberIsNotPublicPropertyOrField { - get { - return ResourceManager.GetString("ExMemberIsNotPublicPropertyOrField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Member '{0}' is not found. Check that either static parameterless method or static property with such name exists.. - /// - internal static string ExMemberXIsNotFoundCheckThatSuchMemberExists { - get { - return ResourceManager.GetString("ExMemberXIsNotFoundCheckThatSuchMemberExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Member '{0}' is not supported. - /// - internal static string ExMemberXIsNotSupported { - get { - return ResourceManager.GetString("ExMemberXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Member '{0}' of type '{1}' is not initialized. Check if constructor argument is correct or field initialized through initializer.. - /// - internal static string ExMemberXOfTypeYIsNotInitializedCheckIfConstructorArgumentIsCorrectOrFieldInitializedThroughInitializer { - get { - return ResourceManager.GetString("ExMemberXOfTypeYIsNotInitializedCheckIfConstructorArgumentIsCorrectOrFieldInitial" + - "izedThroughInitializer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Member '{0}' should return value that is assignable to LambdaExpression. - /// - internal static string ExMemberXShouldReturnValueThatIsAssignableToLambdaExpression { - get { - return ResourceManager.GetString("ExMemberXShouldReturnValueThatIsAssignableToLambdaExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Merge operation require intersection of operands.. - /// - internal static string ExMergeOperationRequireIntersectionOfOperands { - get { - return ResourceManager.GetString("ExMergeOperationRequireIntersectionOfOperands", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MethodCall expression '{0}' is not supported.. - /// - internal static string ExMethodCallExpressionXIsNotSupported { - get { - return ResourceManager.GetString("ExMethodCallExpressionXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' method isn't supported.. - /// - internal static string ExMethodXIsntSupported { - get { - return ResourceManager.GetString("ExMethodXIsntSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Method '{0}' is not found.. - /// - internal static string ExMethodXNotFound { - get { - return ResourceManager.GetString("ExMethodXNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MinMaxValues aren't supported for TupleFieldAdvancedComparer.. - /// - internal static string ExMinMaxValuesAreNotSupportedForTupleFieldAdvancedComparer { - get { - return ResourceManager.GetString("ExMinMaxValuesAreNotSupportedForTupleFieldAdvancedComparer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mistmatch count of left and right expressions.. - /// - internal static string ExMistmatchCountOfLeftAndRightExpressions { - get { - return ResourceManager.GetString("ExMistmatchCountOfLeftAndRightExpressions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Model object cannot be removed.. - /// - internal static string ExModelObjectCannotBeRemoved { - get { - return ResourceManager.GetString("ExModelObjectCannotBeRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to More than one enabled {0} is provided.. - /// - internal static string ExMoreThanOneEnabledXIsProvided { - get { - return ResourceManager.GetString("ExMoreThanOneEnabledXIsProvided", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to More than one enabled {0} is provided for assembly '{1}'.. - /// - internal static string ExMoreThanOneEnabledXIsProvidedForAssemblyY { - get { - return ResourceManager.GetString("ExMoreThanOneEnabledXIsProvidedForAssemblyY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to IncludedColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneIncludedColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneIncludedColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to KeyColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneKeyColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneKeyColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ValueColumns collection contains more then one reference to column "{0}".. - /// - internal static string ExMoreThenOneValueColumnReferenceToColumnX { - get { - return ResourceManager.GetString("ExMoreThenOneValueColumnReferenceToColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multi-database mode is active, but no database specified for '{0}'. - /// - internal static string ExMultidatabaseModeIsActiveButNoDatabaseSpecifiedForX { - get { - return ResourceManager.GetString("ExMultidatabaseModeIsActiveButNoDatabaseSpecifiedForX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple associates match type '{0}' by its interfaces (at least '{1}' and '{2}').. - /// - internal static string ExMultipleAssociatesMatch { - get { - return ResourceManager.GetString("ExMultipleAssociatesMatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: multiple attributes of type '{1}' are not allowed here.. - /// - internal static string ExMultipleAttributesOfTypeXAreNotAllowedHere { - get { - return ResourceManager.GetString("ExMultipleAttributesOfTypeXAreNotAllowedHere", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple hints found.. - /// - internal static string ExMultipleHintsFound { - get { - return ResourceManager.GetString("ExMultipleHintsFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple languages not supported for fulltext column {0} of index {1}.. - /// - internal static string ExMultipleLanguagesNotSupportedForFulltextColumnXOfIndexY { - get { - return ResourceManager.GetString("ExMultipleLanguagesNotSupportedForFulltextColumnXOfIndexY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified query returns multiple results.. - /// - internal static string ExMultipleResults { - get { - return ResourceManager.GetString("ExMultipleResults", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple services match to the specified arguments.. - /// - internal static string ExMultipleServicesMatchToTheSpecifiedArguments { - get { - return ResourceManager.GetString("ExMultipleServicesMatchToTheSpecifiedArguments", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multi-schema mode is active, but no schema specified for '{0}'. - /// - internal static string ExMultischemaModeIsActiveButNoSchemaSpecifiedForX { - get { - return ResourceManager.GetString("ExMultischemaModeIsActiveButNoSchemaSpecifiedForX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name for parameter '{0}' is not found'. - /// - internal static string ExNameForParameterXIsNotFound { - get { - return ResourceManager.GetString("ExNameForParameterXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name must be not null or empty.. - /// - internal static string ExNameMustBeNotNullOrEmpty { - get { - return ResourceManager.GetString("ExNameMustBeNotNullOrEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name value reading or setting is denied.. - /// - internal static string ExNameValueReadingOrSettingIsDenied { - get { - return ResourceManager.GetString("ExNameValueReadingOrSettingIsDenied", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name '{0}' is invalid.. - /// - internal static string ExNameXIsInvalid { - get { - return ResourceManager.GetString("ExNameXIsInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nested collection is not supported.. - /// - internal static string ExNestedCollectionIsNotSupported { - get { - return ResourceManager.GetString("ExNestedCollectionIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nested field '{0}' is not supported.. - /// - internal static string ExNestedFieldXIsNotSupported { - get { - return ResourceManager.GetString("ExNestedFieldXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There are no more available items.. - /// - internal static string ExNoAvailableItems { - get { - return ResourceManager.GetString("ExNoAvailableItems", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Comparer.Current is null.. - /// - internal static string ExNoCurrentComparer { - get { - return ResourceManager.GetString("ExNoCurrentComparer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no current Session.. - /// - internal static string ExNoCurrentSession { - get { - return ResourceManager.GetString("ExNoCurrentSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgarder.Current is null.. - /// - internal static string ExNoCurrentUpgrader { - get { - return ResourceManager.GetString("ExNoCurrentUpgrader", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Node type is unknown.. - /// - internal static string ExNodeTypeIsUnknown { - get { - return ResourceManager.GetString("ExNodeTypeIsUnknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Node "{0}" must be processed before being compared as reference (value of "{1}".{2}).. - /// - internal static string ExNodeXMustBeProcessedBeforeBeingComparedAsReferenceValueOfYZ { - get { - return ResourceManager.GetString("ExNodeXMustBeProcessedBeforeBeingComparedAsReferenceValueOfYZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No message template is registered for code: {0}. - /// - internal static string ExNoMessageTemplateIsRegisteredForCodeX { - get { - return ResourceManager.GetString("ExNoMessageTemplateIsRegisteredForCodeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Non-enum parameters for Enum.HasFlag are not supported. - /// - internal static string ExNonEnumParametersForEnumHasFlagAreNotSupported { - get { - return ResourceManager.GetString("ExNonEnumParametersForEnumHasFlagAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nesting must be created for any node.. - /// - internal static string ExNoNesting { - get { - return ResourceManager.GetString("ExNoNesting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Non-LINQ calls are not supported within Query.ExecuteDelayed. - /// - internal static string ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed { - get { - return ResourceManager.GetString("ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Non-temporary keys must be generated by descendants.. - /// - internal static string ExNonTemporaryKeysMustBeGeneratedByDescendants { - get { - return ResourceManager.GetString("ExNonTemporaryKeysMustBeGeneratedByDescendants", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no object with specified key.. - /// - internal static string ExNoObjectWithSpecifiedKey { - get { - return ResourceManager.GetString("ExNoObjectWithSpecifiedKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No operation registration scope. Use OperationRegistry.BeginRegistration method to open it.. - /// - internal static string ExNoOperationRegistrationScope { - get { - return ResourceManager.GetString("ExNoOperationRegistrationScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The normalized boolean expression must be the root expression.. - /// - internal static string ExNormalizedExpressionMustBeRoot { - get { - return ResourceManager.GetString("ExNormalizedExpressionMustBeRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The normalized boolean expression must have the '{0}' form.. - /// - internal static string ExNormalizedExpressionMustHaveXForm { - get { - return ResourceManager.GetString("ExNormalizedExpressionMustHaveXForm", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The normalized boolean expression must not be the root expression.. - /// - internal static string ExNormalizedExpressionMustNotBeRoot { - get { - return ResourceManager.GetString("ExNormalizedExpressionMustNotBeRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Instance is not initialized (or not initialized properly).. - /// - internal static string ExNotInitialized { - get { - return ResourceManager.GetString("ExNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'NotNullable' constraint violation on field '{0}'.. - /// - internal static string ExNotNullableConstraintViolationOnFieldX { - get { - return ResourceManager.GetString("ExNotNullableConstraintViolationOnFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No upgrade handler is found for assembly '{0}', version '{1}'.. - /// - internal static string ExNoUpgradeHandlerIsFoundForAssemblyXVersionY { - get { - return ResourceManager.GetString("ExNoUpgradeHandlerIsFoundForAssemblyXVersionY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nullable and NullableOnUpgrade flags can't be used with '{0}' field. They can be used only with reference-typed fields (except Structure descendants).. - /// - internal static string ExNullableAndNullableOnUpgradeCannotBeUsedWithXField { - get { - return ResourceManager.GetString("ExNullableAndNullableOnUpgradeCannotBeUsedWithXField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The nullable property {0} is bound to the property {1} that isn't nullable.. - /// - internal static string ExNullablePropertyXIsBoundToPropertyYThatIsNotNullable { - get { - return ResourceManager.GetString("ExNullablePropertyXIsBoundToPropertyYThatIsNotNullable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified object and the context are incompatible.. - /// - internal static string ExObjectAndContextAreIncompatible { - get { - return ResourceManager.GetString("ExObjectAndContextAreIncompatible", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Object is read-only.. - /// - internal static string ExObjectIsReadOnly { - get { - return ResourceManager.GetString("ExObjectIsReadOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to OfType supports casting only inside IEntity hierarchy.. - /// - internal static string ExOfTypeSupportsOnlyEntityConversion { - get { - return ResourceManager.GetString("ExOfTypeSupportsOnlyEntityConversion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You can't Activate new operation, since old ActiveOperation is still running.. - /// - internal static string ExOldActiveOperationIsStillRunning { - get { - return ResourceManager.GetString("ExOldActiveOperationIsStillRunning", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only breakable nodes :(. - /// - internal static string ExOnlyBreakableNodesSadSmile { - get { - return ResourceManager.GetString("ExOnlyBreakableNodesSadSmile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only entities could be hierarchy roots.. - /// - internal static string ExOnlyEntitiesCouldBeHierarchyRoots { - get { - return ResourceManager.GetString("ExOnlyEntitiesCouldBeHierarchyRoots", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only equality ranges are supported.. - /// - internal static string ExOnlyEqualityRangesAreSupported { - get { - return ResourceManager.GetString("ExOnlyEqualityRangesAreSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only the normalized expression having the different normal form can be added as the immediate descendant to the root expression.. - /// - internal static string ExOnlyNormalizedExpressionCanBeAddedAsChildToRoot { - get { - return ResourceManager.GetString("ExOnlyNormalizedExpressionCanBeAddedAsChildToRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only one ancestor of each instance of this generic type is allowed.. - /// - internal static string ExOnlyOneAncestorOfEachInstanceOfThisGenericTypeIsAllowed { - get { - return ResourceManager.GetString("ExOnlyOneAncestorOfEachInstanceOfThisGenericTypeIsAllowed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only one operation can be registered in each scope.. - /// - internal static string ExOnlyOneOperationCanBeRegisteredInEachScope { - get { - return ResourceManager.GetString("ExOnlyOneOperationCanBeRegisteredInEachScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only one primary operation can be logged by each OperationContext instance.. - /// - internal static string ExOnlyOnePrimaryOperationCanBeLogged { - get { - return ResourceManager.GetString("ExOnlyOnePrimaryOperationCanBeLogged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only 'Prefetch(source, expression, params[] expressions)' method is supported within prefetch expression. But found '{0}'.. - /// - internal static string ExOnlyPrefetchMethodSupportedButFoundX { - get { - return ResourceManager.GetString("ExOnlyPrefetchMethodSupportedButFoundX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only persistented property access, calls of Prefetch method or anonymous type constructors are supported, but found '{0}' expression.. - /// - internal static string ExOnlyPropertAccessPrefetchOrAnonymousTypeSupportedButFoundX { - get { - return ResourceManager.GetString("ExOnlyPropertAccessPrefetchOrAnonymousTypeSupportedButFoundX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only secondary indexes can be declared partial.. - /// - internal static string ExOnlySecondaryIndexesCanBeDeclaredPartial { - get { - return ResourceManager.GetString("ExOnlySecondaryIndexesCanBeDeclaredPartial", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only single-column key supported.. - /// - internal static string ExOnlySingleColumnKeySupported { - get { - return ResourceManager.GetString("ExOnlySingleColumnKeySupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only SqlLiteral or SqlPlaceholder can be used in Limit/Offset. - /// - internal static string ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset { - get { - return ResourceManager.GetString("ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}.{1}' OnOwnerRemove action is not equal to '{2}.{3}' OnTargetRemove action.. - /// - internal static string ExOnOwnerRemoveActionIsNotEqualToOnTargetRemoveAction { - get { - return ResourceManager.GetString("ExOnOwnerRemoveActionIsNotEqualToOnTargetRemoveAction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation isn't marked as started. See Sessopn.Operations.OperationStarted() method.. - /// - internal static string ExOperationIsNotMarkedAsStarted { - get { - return ResourceManager.GetString("ExOperationIsNotMarkedAsStarted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation isn't registered yet. See Session.Oeprations.RegisterOperations().. - /// - internal static string ExOperationIsNotRegisteredYet { - get { - return ResourceManager.GetString("ExOperationIsNotRegisteredYet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation LinkType should be defined before it can be registered in OperationDictionary.. - /// - internal static string ExOperationLinkTypeUndefined { - get { - return ResourceManager.GetString("ExOperationLinkTypeUndefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation must be locked before it can be registered in OperationDictionary.. - /// - internal static string ExOperationMustBeLocked { - get { - return ResourceManager.GetString("ExOperationMustBeLocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation PropertyName must be specified before it can be registered in OperationDictionary.. - /// - internal static string ExOperationPropertyNameUndefined { - get { - return ResourceManager.GetString("ExOperationPropertyNameUndefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to OperatonStarted is alerady called for this operation.. - /// - internal static string ExOperationStartedIsAlreadyCalledForThisOperation { - get { - return ResourceManager.GetString("ExOperationStartedIsAlreadyCalledForThisOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operation '{0}' is not supported. - /// - internal static string ExOperationXIsNotSupported { - get { - return ResourceManager.GetString("ExOperationXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Option '{0}' is mutually exclusive with option '{1}'. - /// - internal static string ExOptionXIsMutuallyExclusiveWithOptionY { - get { - return ResourceManager.GetString("ExOptionXIsMutuallyExclusiveWithOptionY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The ordering of records is not specified for RowNumberProvider.. - /// - internal static string ExOrderingOfRecordsIsNotSpecifiedForRowNumberProvider { - get { - return ResourceManager.GetString("ExOrderingOfRecordsIsNotSpecifiedForRowNumberProvider", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Order key not found in mapping.. - /// - internal static string ExOrderKeyNotFoundInMapping { - get { - return ResourceManager.GetString("ExOrderKeyNotFoundInMapping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Origin is not null.. - /// - internal static string ExOriginIsNotNull { - get { - return ResourceManager.GetString("ExOriginIsNotNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Origin is null.. - /// - internal static string ExOriginIsNull { - get { - return ResourceManager.GetString("ExOriginIsNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Outer parameter reference found, but no SqlCompiler provided. - /// - internal static string ExOuterParameterReferenceFoundButNoSqlCompilerProvided { - get { - return ResourceManager.GetString("ExOuterParameterReferenceFoundButNoSqlCompilerProvided", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Object is outside of initial transaction scope.. - /// - internal static string ExOutOfTransactionScope { - get { - return ResourceManager.GetString("ExOutOfTransactionScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Paired field '{0}' has wrong type. A descendant of Entity or EntitySet is expected.. - /// - internal static string ExPairedFieldXHasWrongTypeItShouldBeReferenceToEntityOrAEntitySet { - get { - return ResourceManager.GetString("ExPairedFieldXHasWrongTypeItShouldBeReferenceToEntityOrAEntitySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Paired field '{0}.{1}' was not found in '{2}' type.. - /// - internal static string ExPairedFieldXYWasNotFoundInZType { - get { - return ResourceManager.GetString("ExPairedFieldXYWasNotFoundInZType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Paired identity columns for types '{0}' and '{1}' not found. - /// - internal static string ExPairedIdentityColumnsForTypesXAndXNotFound { - get { - return ResourceManager.GetString("ExPairedIdentityColumnsForTypesXAndXNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [Association] attribute with PairTo can not be use with field '{0}' of type '{1}'. It is already applied to field '{2}' of type '{3}'.. - /// - internal static string ExPairToAttributeCanNotBeAppliedToXField { - get { - return ResourceManager.GetString("ExPairToAttributeCanNotBeAppliedToXField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ParameterExpression must have same type as ProjectionExpression.ItemProjector. - /// - internal static string ExParameterExpressionMustHaveSameTypeAsProjectionExpressionItemProjector { - get { - return ResourceManager.GetString("ExParameterExpressionMustHaveSameTypeAsProjectionExpressionItemProjector", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameters count is not same as source column lists count.. - /// - internal static string ExParametersCountIsNotSameAsSourceColumnListsCount { - get { - return ResourceManager.GetString("ExParametersCountIsNotSameAsSourceColumnListsCount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter '{0}' is not a tuple access expression. - /// - internal static string ExParameterXIsNotATupleAccessExpression { - get { - return ResourceManager.GetString("ExParameterXIsNotATupleAccessExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Part of URL contains forbidden characters. Forbidden characters: . - /// - internal static string ExPartOfUrlContainsForbiddenCharacters { - get { - return ResourceManager.GetString("ExPartOfUrlContainsForbiddenCharacters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Node with path "{0}" is not found.. - /// - internal static string ExPathXNotFound { - get { - return ResourceManager.GetString("ExPathXNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expected target model. - /// - internal static string ExpectedTargetModel { - get { - return ResourceManager.GetString("ExpectedTargetModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Persistent type '{0}' is not entity or persistent interface.. - /// - internal static string ExPersistentTypeXIsNotEntityOrPersistentInterface { - get { - return ResourceManager.GetString("ExPersistentTypeXIsNotEntityOrPersistentInterface", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Explicit mapping name setting is redundant. The same name '{0}' will be generated automatically.. - /// - internal static string ExplicitMappingNameSettingIsRedundantTheSameNameXWillBeGeneratedAutomatically { - get { - return ResourceManager.GetString("ExplicitMappingNameSettingIsRedundantTheSameNameXWillBeGeneratedAutomatically", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Pool should be in syncronized mode to utilize AutoCleanup feature.. - /// - internal static string ExPoolMustBeSyncronized { - get { - return ResourceManager.GetString("ExPoolMustBeSyncronized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item already exists in the pool with another key.. - /// - internal static string ExPoolWrongKey { - get { - return ResourceManager.GetString("ExPoolWrongKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Port value must be in [0,65535] range.. - /// - internal static string ExPortOutOfRange { - get { - return ResourceManager.GetString("ExPortOutOfRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Position value should be greater than zero.. - /// - internal static string ExPositionValueShouldBeGreaterThanZero { - get { - return ResourceManager.GetString("ExPositionValueShouldBeGreaterThanZero", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Precision should be non-negative value.. - /// - internal static string ExPrecisionShouldBeNonNegativeValue { - get { - return ResourceManager.GetString("ExPrecisionShouldBeNonNegativeValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Predicate contains accesses to different ApplyParameters.. - /// - internal static string ExPredicateContainsAccessesToDifferentApplyParameters { - get { - return ResourceManager.GetString("ExPredicateContainsAccessesToDifferentApplyParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Prefetch does not support query provider of type '{0}'.. - /// - internal static string ExPrefetchDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExPrefetchDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to expressions of type '{0}' are not supported. - /// - internal static string ExpressionsOfTypeXAreNotSupported { - get { - return ResourceManager.GetString("ExpressionsOfTypeXAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' is unknown.. - /// - internal static string ExpressionXIsUnknown { - get { - return ResourceManager.GetString("ExpressionXIsUnknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expression '{0}' should take {1} parameters. - /// - internal static string ExpressionXShouldTakeYParameters { - get { - return ResourceManager.GetString("ExpressionXShouldTakeYParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Primary key column can not be nullable.. - /// - internal static string ExPrimaryKeyColumnCanNotBeNullable { - get { - return ResourceManager.GetString("ExPrimaryKeyColumnCanNotBeNullable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is a part of primary key. It can't be changed.. - /// - internal static string ExPrimaryKeyFieldCantBeChanged { - get { - return ResourceManager.GetString("ExPrimaryKeyFieldCantBeChanged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Primary key field '{0}' can't be marked as Version.. - /// - internal static string ExPrimaryKeyFieldXCanTBeMarkedAsVersion { - get { - return ResourceManager.GetString("ExPrimaryKeyFieldXCanTBeMarkedAsVersion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The primitive property {0} is bound to the property {1} that isn't primitive.. - /// - internal static string ExPrimitivePropertyXIsBoundToPropertyYThatIsNotPrimitive { - get { - return ResourceManager.GetString("ExPrimitivePropertyXIsBoundToPropertyYThatIsNotPrimitive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Processing of VoidProvider is not supported.. - /// - internal static string ExProcessingOfVoidProviderIsNotSupported { - get { - return ResourceManager.GetString("ExProcessingOfVoidProviderIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The properties {0} and {1} have different primitive types.. - /// - internal static string ExPropertiesXAndYHaveDifferentPrimitiveTypes { - get { - return ResourceManager.GetString("ExPropertiesXAndYHaveDifferentPrimitiveTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The properties "{0}" and "{1}" have incompatible types.. - /// - internal static string ExPropertiesXAndYHaveIncompatibleTypes { - get { - return ResourceManager.GetString("ExPropertiesXAndYHaveIncompatibleTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' of type '{1}' does not have public get accessor.. - /// - internal static string ExPropertyDoesNotHaveGetter { - get { - return ResourceManager.GetString("ExPropertyDoesNotHaveGetter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' of type '{1}' does not have public set accessor.. - /// - internal static string ExPropertyDoesNotHaveSetter { - get { - return ResourceManager.GetString("ExPropertyDoesNotHaveSetter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' is already initialized.. - /// - internal static string ExPropertyIsAlreadyInitialized { - get { - return ResourceManager.GetString("ExPropertyIsAlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' is not initialized (or not initialized properly).. - /// - internal static string ExPropertyIsNotInitialized { - get { - return ResourceManager.GetString("ExPropertyIsNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property value must belong to the same Model.. - /// - internal static string ExPropertyValueMustBelongToTheSameModel { - get { - return ResourceManager.GetString("ExPropertyValueMustBelongToTheSameModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' doesn't have public setter.. - /// - internal static string ExPropertyXDoesnTHavePublicSetter { - get { - return ResourceManager.GetString("ExPropertyXDoesnTHavePublicSetter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}' must be declared in type '{1}'.. - /// - internal static string ExPropertyXMustBeDeclaredInTypeY { - get { - return ResourceManager.GetString("ExPropertyXMustBeDeclaredInTypeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property '{0}.{1}' doesn't have public getter.. - /// - internal static string ExPropertyXYDoesnTHavePublicGetter { - get { - return ResourceManager.GetString("ExPropertyXYDoesnTHavePublicGetter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Property "{0}.{1}" is not found.. - /// - internal static string ExPropertyXYIsNotFound { - get { - return ResourceManager.GetString("ExPropertyXYIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Provider must be either CompilableProvider or ExecutableProvider. - /// - internal static string ExProviderMustBeEitherCompilableProviderOrExecutableProvider { - get { - return ResourceManager.GetString("ExProviderMustBeEitherCompilableProviderOrExecutableProvider", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Provider '{0}' does not implement LogProvider class.. - /// - internal static string ExProviderXDoesNotImplementLogProviderClass { - get { - return ResourceManager.GetString("ExProviderXDoesNotImplementLogProviderClass", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Provider "{0}" is not supported. Use one of the following: {1}.. - /// - internal static string ExProviderXIsNotSupportedUseOneOfTheFollowingY { - get { - return ResourceManager.GetString("ExProviderXIsNotSupportedUseOneOfTheFollowingY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The query contains closures of different types.. - /// - internal static string ExQueryContainsClosuresOfDifferentTypes { - get { - return ResourceManager.GetString("ExQueryContainsClosuresOfDifferentTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Query task is not executed yet.. - /// - internal static string ExQueryTaskIsNotExecutedYet { - get { - return ResourceManager.GetString("ExQueryTaskIsNotExecutedYet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Range is empty.. - /// - internal static string ExRangeIsEmpty { - get { - return ResourceManager.GetString("ExRangeIsEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reader is not in consistent state.. - /// - internal static string ExReaderIsNotInConsistentState { - get { - return ResourceManager.GetString("ExReaderIsNotInConsistentState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Recursive associate lookup is detected.. - /// - internal static string ExRecursiveAssociateLookupDetected { - get { - return ResourceManager.GetString("ExRecursiveAssociateLookupDetected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Recursive constructor paremeter dependency is detected.. - /// - internal static string ExRecursiveConstructorParemeterDependencyIsDetected { - get { - return ResourceManager.GetString("ExRecursiveConstructorParemeterDependencyIsDetected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referenced columns count cannot be less then one.. - /// - internal static string ExReferencedColumnsCountCantBeLessThenOne { - get { - return ResourceManager.GetString("ExReferencedColumnsCountCantBeLessThenOne", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referenced column "{0}" does not belong to index "{1}".. - /// - internal static string ExReferencedColumnXDoesNotBelongToIndexY { - get { - return ResourceManager.GetString("ExReferencedColumnXDoesNotBelongToIndexY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referenced field '{0}' and paired field are equal.. - /// - internal static string ExReferencedFieldXAndPairedFieldAreEqual { - get { - return ResourceManager.GetString("ExReferencedFieldXAndPairedFieldAreEqual", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reference '{0}' is already defined.. - /// - internal static string ExReferenceIsAlreadyDefined { - get { - return ResourceManager.GetString("ExReferenceIsAlreadyDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reference '{0}' is not resolved yet.. - /// - internal static string ExReferenceIsNotResolvedYet { - get { - return ResourceManager.GetString("ExReferenceIsNotResolvedYet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reference points to null.. - /// - internal static string ExReferenceIsNull { - get { - return ResourceManager.GetString("ExReferenceIsNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The reference property {0} is bound to the property {1} that isn't reference.. - /// - internal static string ExReferencePropertyXIsBoundToPropertyYThatIsNotReference { - get { - return ResourceManager.GetString("ExReferencePropertyXIsBoundToPropertyYThatIsNotReference", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reference registration error: Reference addition is already registered.. - /// - internal static string ExReferenceRegistrationErrorReferenceAdditionIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExReferenceRegistrationErrorReferenceAdditionIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reference registration error: Reference removal is already registered.. - /// - internal static string ExReferenceRregistrationErrorReferenceRemovalIsAlreadyRegistered { - get { - return ResourceManager.GetString("ExReferenceRregistrationErrorReferenceRemovalIsAlreadyRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referencing columns count cannot be less then one.. - /// - internal static string ExReferencingColumnsCountCantBeLessThenOne { - get { - return ResourceManager.GetString("ExReferencingColumnsCountCantBeLessThenOne", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The referencing entity's tuple is not loaded.. - /// - internal static string ExReferencingEntityTupleIsNotLoaded { - get { - return ResourceManager.GetString("ExReferencingEntityTupleIsNotLoaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The referencing entity with key {0} is not found.. - /// - internal static string ExReferencingEntityWithKeyXIsNotFound { - get { - return ResourceManager.GetString("ExReferencingEntityWithKeyXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referential integrity violation.. - /// - internal static string ExReferentialIntegrityViolation { - get { - return ResourceManager.GetString("ExReferentialIntegrityViolation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Request is not prepared. - /// - internal static string ExRequestIsNotPrepared { - get { - return ResourceManager.GetString("ExRequestIsNotPrepared", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resource property {0} is not of string type.. - /// - internal static string ExResourcePropertyXIsNotOfStringType { - get { - return ResourceManager.GetString("ExResourcePropertyXIsNotOfStringType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Result is not available.. - /// - internal static string ExResultIsNotAvailable { - get { - return ResourceManager.GetString("ExResultIsNotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value of '{0}' type cannot be assigned to property of '{1}' type.. - /// - internal static string ExResultTypeIncorrect { - get { - return ResourceManager.GetString("ExResultTypeIncorrect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Row amount should be positive number.. - /// - internal static string ExRowAmountShouldBePositiveNumber { - get { - return ResourceManager.GetString("ExRowAmountShouldBePositiveNumber", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ROW_NUMBER window function is not supported on this version of PostgreSQL. - /// - internal static string ExRowNumberWindowFunctionIsNotSupportedOnThisVersionOfPostgreSql { - get { - return ResourceManager.GetString("ExRowNumberWindowFunctionIsNotSupportedOnThisVersionOfPostgreSql", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Running operation registration must be finished before invocation of this method.. - /// - internal static string ExRunningOperationRegistrationMustBeFinished { - get { - return ResourceManager.GetString("ExRunningOperationRegistrationMustBeFinished", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scale should be non-negative value.. - /// - internal static string ExScaleShouldBeNonNegativeValue { - get { - return ResourceManager.GetString("ExScaleShouldBeNonNegativeValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Schema mapping requires multischema domain configuration. Please provide at least DefaultSchema setting.. - /// - internal static string ExSchemaMappingRequiresMultischemaDomainConfiguration { - get { - return ResourceManager.GetString("ExSchemaMappingRequiresMultischemaDomainConfiguration", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Schema must be not null.. - /// - internal static string ExSchemaMustBeNotNull { - get { - return ResourceManager.GetString("ExSchemaMustBeNotNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scope-bound transaction can be committed only by its scope. Use TransactionScopeBase.Complete() \ Dispose() methods of appropriate TransactionScopeBase descendant instance to do this.. - /// - internal static string ExScopeBoundTransactionCanBeCommittedOnlyByItsScope { - get { - return ResourceManager.GetString("ExScopeBoundTransactionCanBeCommittedOnlyByItsScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scope can't be disposed. Most likely it is bound to a different thread.. - /// - internal static string ExScopeCantBeDisposed { - get { - return ResourceManager.GetString("ExScopeCantBeDisposed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is required.. - /// - internal static string ExScopeRequired { - get { - return ResourceManager.GetString("ExScopeRequired", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Section '{0}' is not found in application configuration file.. - /// - internal static string ExSectionIsNotFoundInApplicationConfigurationFile { - get { - return ResourceManager.GetString("ExSectionIsNotFoundInApplicationConfigurationFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Segment is out of range.. - /// - internal static string ExSegmentIsOutOfRange { - get { - return ResourceManager.GetString("ExSegmentIsOutOfRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SelectMany collection selector '{0}' must have only one lambda parameter.. - /// - internal static string ExSelectManyCollectionSelector0MustHaveOnlyOneLambdaParameter { - get { - return ResourceManager.GetString("ExSelectManyCollectionSelector0MustHaveOnlyOneLambdaParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The SelectProvider removes columns used for an ordering.. - /// - internal static string ExSelectProviderRemovesColumnsUsedForOrdering { - get { - return ResourceManager.GetString("ExSelectProviderRemovesColumnsUsedForOrdering", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sequence contains more than one element.. - /// - internal static string ExSequenceContainsMoreThanOneElement { - get { - return ResourceManager.GetString("ExSequenceContainsMoreThanOneElement", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sequence contains no elements.. - /// - internal static string ExSequenceContainsNoElements { - get { - return ResourceManager.GetString("ExSequenceContainsNoElements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sequence '{0}' is not found in storage.. - /// - internal static string ExSequenceXIsNotFoundInStorage { - get { - return ResourceManager.GetString("ExSequenceXIsNotFoundInStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service can not be attached to Session while it is persisting the changes.. - /// - internal static string ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges { - get { - return ResourceManager.GetString("ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service '{0}' is not found.. - /// - internal static string ExServiceNotFound { - get { - return ResourceManager.GetString("ExServiceNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service of type '{0}' is not available.. - /// - internal static string ExServiceOfTypeXIsNotAvailable { - get { - return ResourceManager.GetString("ExServiceOfTypeXIsNotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service with name '{0}' already exists in StorageInfo.Services collection.. - /// - internal static string ExServiceWithNameAlreadyExistsInStorageInfoServicesCollection { - get { - return ResourceManager.GetString("ExServiceWithNameAlreadyExistsInStorageInfoServicesCollection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service with name "{0}" of type '{1}' is not available.. - /// - internal static string ExServiceWithNameXOfTypeYIsNotAvailable { - get { - return ResourceManager.GetString("ExServiceWithNameXOfTypeYIsNotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Service '{0}' is not supported.. - /// - internal static string ExServiceXIsNotSupported { - get { - return ResourceManager.GetString("ExServiceXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session bound object is out of session scope.. - /// - internal static string ExSessionBoundObjectOutOfSessionScope { - get { - return ResourceManager.GetString("ExSessionBoundObjectOutOfSessionScope", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session is already disposed.. - /// - internal static string ExSessionIsAlreadyDisposed { - get { - return ResourceManager.GetString("ExSessionIsAlreadyDisposed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session is not open. Use Session.Open(...) to open it.. - /// - internal static string ExSessionIsNotOpen { - get { - return ResourceManager.GetString("ExSessionIsNotOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session of another SessionBound must be the same.. - /// - internal static string ExSessionOfAnotherSessionBoundMustBeTheSame { - get { - return ResourceManager.GetString("ExSessionOfAnotherSessionBoundMustBeTheSame", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session with name '{0}' already exists.. - /// - internal static string ExSessionWithNameXAlreadyExists { - get { - return ResourceManager.GetString("ExSessionWithNameXAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}' still uses single available connection.. - /// - internal static string ExSessionXStillUsesSingleAvailableConnection { - get { - return ResourceManager.GetString("ExSessionXStillUsesSingleAvailableConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Single hierarchy is mapped to multiple databases: {0}, {1}. - /// - internal static string ExSingleHierarchyIsMappedToMultipleDatabasesXY { - get { - return ResourceManager.GetString("ExSingleHierarchyIsMappedToMultipleDatabasesXY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Size should be not negative value.. - /// - internal static string ExSizeShouldBeNotNegativeValue { - get { - return ResourceManager.GetString("ExSizeShouldBeNotNegativeValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Skip' does not support query provider of type '{0}'.. - /// - internal static string ExSkipDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExSkipDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Skip({0})' not supported in compiled queries (Query.Execute). Use 'Skip(Expression<Func<int>>)' instead.For example use 'Skip(()=>{0})'.. - /// - internal static string ExSkipNotSupportedInCompiledQueries { - get { - return ResourceManager.GetString("ExSkipNotSupportedInCompiledQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Some operands are not Expressions of type 'System.Boolean'.. - /// - internal static string ExSomeOperandsAreNotExpressionsOfTypeBoolean { - get { - return ResourceManager.GetString("ExSomeOperandsAreNotExpressionsOfTypeBoolean", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Source column list contains null values.. - /// - internal static string ExSourceColumnListContainsNullValues { - get { - return ResourceManager.GetString("ExSourceColumnListContainsNullValues", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Special character {0} used as escape character.. - /// - internal static string ExSpecialCharacterXUsedAsEscapeCharacter { - get { - return ResourceManager.GetString("ExSpecialCharacterXUsedAsEscapeCharacter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified capacity value is less than collection count.. - /// - internal static string ExSpecifiedCapacityIsLessThenCollectionCount { - get { - return ResourceManager.GetString("ExSpecifiedCapacityIsLessThenCollectionCount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified connection does not belong to this driver.. - /// - internal static string ExSpecifiedConnectionDoesNotBelongToThisDriver { - get { - return ResourceManager.GetString("ExSpecifiedConnectionDoesNotBelongToThisDriver", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified expression can't be parsed.. - /// - internal static string ExSpecifiedExpressionCanNotBeParsed { - get { - return ResourceManager.GetString("ExSpecifiedExpressionCanNotBeParsed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified expression is not a MemberExpression.. - /// - internal static string ExSpecifiedExpressionIsNotMemberExpression { - get { - return ResourceManager.GetString("ExSpecifiedExpressionIsNotMemberExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified key field type is not supported by this temporary key generator.. - /// - internal static string ExSpecifiedKeyFieldTypeIsNotSupportedByThisTemporaryKeyGenerator { - get { - return ResourceManager.GetString("ExSpecifiedKeyFieldTypeIsNotSupportedByThisTemporaryKeyGenerator", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified precision ({0}) is greater than maximum supported by storage ({1}).. - /// - internal static string ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY { - get { - return ResourceManager.GetString("ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified property {0} is not persistent.. - /// - internal static string ExSpecifiedPropertyXIsNotPersistent { - get { - return ResourceManager.GetString("ExSpecifiedPropertyXIsNotPersistent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified RedoDescriptor can't be logged.. - /// - internal static string ExSpecifiedRedoDescriptorCantBeLogged { - get { - return ResourceManager.GetString("ExSpecifiedRedoDescriptorCantBeLogged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified type's hierarchy is different from the key's hierarchy.. - /// - internal static string ExSpecifiedTypeHierarchyIsDifferentFromKeyHierarchy { - get { - return ResourceManager.GetString("ExSpecifiedTypeHierarchyIsDifferentFromKeyHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified type should be either GeneratedTupleDescriptor or its descendant.. - /// - internal static string ExSpecifiedTypeShouldBeGeneratedTupleDescriptorOrItsDescendant { - get { - return ResourceManager.GetString("ExSpecifiedTypeShouldBeGeneratedTupleDescriptorOrItsDescendant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified values aren't enough to create key for type '{0}'.. - /// - internal static string ExSpecifiedValuesArentEnoughToCreateKeyForTypeX { - get { - return ResourceManager.GetString("ExSpecifiedValuesArentEnoughToCreateKeyForTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sql container expression can not be compiled.. - /// - internal static string ExSqlContainerExpressionCanNotBeCompiled { - get { - return ResourceManager.GetString("ExSqlContainerExpressionCanNotBeCompiled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SQL Server below 2005 is not supported.. - /// - internal static string ExSqlServerBelow2005IsNotSupported { - get { - return ResourceManager.GetString("ExSqlServerBelow2005IsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SQL Server supports trimming of space characters only.. - /// - internal static string ExSqlServerSupportsTrimmingOfSpaceCharactersOnly { - get { - return ResourceManager.GetString("ExSqlServerSupportsTrimmingOfSpaceCharactersOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to State is not loaded.. - /// - internal static string ExStateIsNotLoaded { - get { - return ResourceManager.GetString("ExStateIsNotLoaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to State is removed.. - /// - internal static string ExStateIsRemoved { - get { - return ResourceManager.GetString("ExStateIsRemoved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to StateTransaction property value differs from the current transaction.. - /// - internal static string ExStateTransactionIsDifferent { - get { - return ResourceManager.GetString("ExStateTransactionIsDifferent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to State with key '{0}' is already exists.. - /// - internal static string ExStateWithKeyXIsAlreadyExists { - get { - return ResourceManager.GetString("ExStateWithKeyXIsAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage is not supported limitation of row count to delete.. - /// - internal static string ExStorageIsNotSupportedLimitationOfRowCountToDelete { - get { - return ResourceManager.GetString("ExStorageIsNotSupportedLimitationOfRowCountToDelete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage is not supported limitation of row count to update.. - /// - internal static string ExStorageIsNotSupportedLimitationOfRowCountToUpdate { - get { - return ResourceManager.GetString("ExStorageIsNotSupportedLimitationOfRowCountToUpdate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage node is already selected.. - /// - internal static string ExStorageNodeIsAlreadySelected { - get { - return ResourceManager.GetString("ExStorageNodeIsAlreadySelected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage node with id '{0}' is not found.. - /// - internal static string ExStorageNodeWithIdXIsNotFound { - get { - return ResourceManager.GetString("ExStorageNodeWithIdXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage provider '{0}' is not found.. - /// - internal static string ExStorageProviderXIsNotFound { - get { - return ResourceManager.GetString("ExStorageProviderXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to String does not correspond to the specified descriptor.. - /// - internal static string ExStringDoesNotCorrespondToDescriptor { - get { - return ResourceManager.GetString("ExStringDoesNotCorrespondToDescriptor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to String.Trim(char[]), String.TrimStart(char[]), string.TrimEnd(char[]) supported only with argument being array of constants.. - /// - internal static string ExStringTrimSupportedOnlyWithConstants { - get { - return ResourceManager.GetString("ExStringTrimSupportedOnlyWithConstants", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Structure of field '{0}' does not match structure of field '{1}'.. - /// - internal static string ExStructureOfFieldXDoesNotMatchStructureOfFieldY { - get { - return ResourceManager.GetString("ExStructureOfFieldXDoesNotMatchStructureOfFieldY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Structures do not support fields of type '{0}'.. - /// - internal static string ExStructuresDoNotSupportFieldsOfTypeX { - get { - return ResourceManager.GetString("ExStructuresDoNotSupportFieldsOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Structure '{0}' can't contain field of the same type.. - /// - internal static string ExStructureXCantContainFieldOfTheSameType { - get { - return ResourceManager.GetString("ExStructureXCantContainFieldOfTheSameType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to System date \ time has been changed.. - /// - internal static string ExSystemTimeChanged { - get { - return ResourceManager.GetString("ExSystemTimeChanged", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table already has specified name.. - /// - internal static string ExTableAlreadyHasSpecifiedName { - get { - return ResourceManager.GetString("ExTableAlreadyHasSpecifiedName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table is not set.. - /// - internal static string ExTablePropertyIsNotSet { - get { - return ResourceManager.GetString("ExTablePropertyIsNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table '{0}' can't be removed due to the foreign key '{1}' of a ignored table or column.. - /// - internal static string ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn { - get { - return ResourceManager.GetString("ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table '{0}' can't be removed due to the ignored column '{1}'.. - /// - internal static string ExTableXCantBeRemovedDueToTheIgnoredColumnY { - get { - return ResourceManager.GetString("ExTableXCantBeRemovedDueToTheIgnoredColumnY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table with name '{0}' is not found.. - /// - internal static string ExTableXIsNotFound { - get { - return ResourceManager.GetString("ExTableXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Take' does not support query provider of type '{0}'.. - /// - internal static string ExTakeDoesNotSupportQueryProviderOfTypeX { - get { - return ResourceManager.GetString("ExTakeDoesNotSupportQueryProviderOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Take({0})' not supported in compiled queries (Query.Execute). Use 'Take(Expression<Func<int>>)' instead.For example use 'Take(()=>{0})'.. - /// - internal static string ExTakeNotSupportedInCompiledQueries { - get { - return ResourceManager.GetString("ExTakeNotSupportedInCompiledQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Target member is not found for compiler {0}. - /// - internal static string ExTargetMemberIsNotFoundForCompilerX { - get { - return ResourceManager.GetString("ExTargetMemberIsNotFoundForCompilerX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Target object already exists: "{0}". To assign a new one, you must remove the old one first.. - /// - internal static string ExTargetObjectExistsX { - get { - return ResourceManager.GetString("ExTargetObjectExistsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Temporary tables are not supported by current storage. - /// - internal static string ExTemporaryTablesAreNotSupportedByCurrentStorage { - get { - return ResourceManager.GetString("ExTemporaryTablesAreNotSupportedByCurrentStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Temporary table '{0}' is locked. - /// - internal static string ExTemporaryTableXIsLocked { - get { - return ResourceManager.GetString("ExTemporaryTableXIsLocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Term weight value must be between {0} and {1}. - /// - internal static string ExTermWeightValueMustBeBetweenXAndY { - get { - return ResourceManager.GetString("ExTermWeightValueMustBeBetweenXAndY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The data type must be exact numeric without scale or with zero scale.. - /// - internal static string ExTheDataTypeMustBeExactNumericWithoutScaleOrWithZeroScale { - get { - return ResourceManager.GetString("ExTheDataTypeMustBeExactNumericWithoutScaleOrWithZeroScale", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The data type must be exact numeric with scale 0.. - /// - internal static string ExTheDataTypeMustBeExactNumericWithScale0 { - get { - return ResourceManager.GetString("ExTheDataTypeMustBeExactNumericWithScale0", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The maximum value must be greater than the minimum value.. - /// - internal static string ExTheMaximumValueMustBeGreaterThanTheMinimumValue { - get { - return ResourceManager.GetString("ExTheMaximumValueMustBeGreaterThanTheMinimumValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The number of sources is too small. Expected number is {0}.. - /// - internal static string ExTheNumberOfSourcesIsTooSmallExpected { - get { - return ResourceManager.GetString("ExTheNumberOfSourcesIsTooSmallExpected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There are no suitable types in '{0}'.. - /// - internal static string ExThereAreNoSuitableTypes { - get { - return ResourceManager.GetString("ExThereAreNoSuitableTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no current HttpRequest, or SessionManager is not bound to it yet.. - /// - internal static string ExThereIsNoCurrentHttpRequestOrSessionManagerIsnTBoundToItYet { - get { - return ResourceManager.GetString("ExThereIsNoCurrentHttpRequestOrSessionManagerIsnTBoundToItYet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The scale must be less than or equal to precision.. - /// - internal static string ExTheScaleMustBeLessThanOrEqualToPrecision { - get { - return ResourceManager.GetString("ExTheScaleMustBeLessThanOrEqualToPrecision", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The service is already attached to Session.. - /// - internal static string ExTheServiceIsAlreadyAttachedToSession { - get { - return ResourceManager.GetString("ExTheServiceIsAlreadyAttachedToSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The start value should be between the minimum and maximum value.. - /// - internal static string ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue { - get { - return ResourceManager.GetString("ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This instance is expired due to transaction boundaries.. - /// - internal static string ExThisInstanceIsExpiredDueToTransactionBoundaries { - get { - return ResourceManager.GetString("ExThisInstanceIsExpiredDueToTransactionBoundaries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This method should not be called, use Apply(Session, Expression) instead. - /// - internal static string ExThisMethodShouldNotBeCalledUseApplySessionExpressionInstead { - get { - return ResourceManager.GetString("ExThisMethodShouldNotBeCalledUseApplySessionExpressionInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This operation is not allowed for the parameter context operating with expected values of parameters.. - /// - internal static string ExThisOperationIsNotAllowedForParameterContextOperatingWithExpectedValuesOfParameters { - get { - return ResourceManager.GetString("ExThisOperationIsNotAllowedForParameterContextOperatingWithExpectedValuesOfParame" + - "ters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This storage does not support '{0}'.. - /// - internal static string ExThisStorageDoesNotSupportX { - get { - return ResourceManager.GetString("ExThisStorageDoesNotSupportX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This storage does not support '{0}' values greather than '{1}'. Supplied value is '{2}'.. - /// - internal static string ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ { - get { - return ResourceManager.GetString("ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This storage does not support '{0}' values less than '{1}'. Supplied value is '{2}'.. - /// - internal static string ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ { - get { - return ResourceManager.GetString("ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction is already activated.. - /// - internal static string ExTransactionIsAlreadyActivated { - get { - return ResourceManager.GetString("ExTransactionIsAlreadyActivated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction is already open.. - /// - internal static string ExTransactionIsAlreadyOpen { - get { - return ResourceManager.GetString("ExTransactionIsAlreadyOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction is not active.. - /// - internal static string ExTransactionIsNotActive { - get { - return ResourceManager.GetString("ExTransactionIsNotActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction is not open.. - /// - internal static string ExTransactionIsNotOpen { - get { - return ResourceManager.GetString("ExTransactionIsNotOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A transaction is running, but there should be no active transaction.. - /// - internal static string ExTransactionIsRunning { - get { - return ResourceManager.GetString("ExTransactionIsRunning", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TransactionScope.IsCompleted can not be set to 'false'.. - /// - internal static string ExTransactionScopeIsCompletedCanNotBeSetToFalse { - get { - return ResourceManager.GetString("ExTransactionScopeIsCompletedCanNotBeSetToFalse", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction should be active. - /// - internal static string ExTransactionShouldBeActive { - get { - return ResourceManager.GetString("ExTransactionShouldBeActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Transaction should not be active. - /// - internal static string ExTransactionShouldNotBeActive { - get { - return ResourceManager.GetString("ExTransactionShouldNotBeActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translation of DateTime.ToString(string) with arbitrary arguments is not supported. Use DateTime.ToString("s").. - /// - internal static string ExTranslationOfDateTimeToStringWithArbitraryArgumentsIsNotSupported { - get { - return ResourceManager.GetString("ExTranslationOfDateTimeToStringWithArbitraryArgumentsIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translation of In/Contains is not supported in this case. - /// - internal static string ExTranslationOfInContainsIsNotSupportedInThisCase { - get { - return ResourceManager.GetString("ExTranslationOfInContainsIsNotSupportedInThisCase", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translation of literal of type '{0}' is not supported.. - /// - internal static string ExTranslationOfLiteralOfTypeXIsNotSupported { - get { - return ResourceManager.GetString("ExTranslationOfLiteralOfTypeXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translation of {0} method does not support any parameter type, but {1}.. - /// - internal static string ExTranslationOfXMethodDoesNotSupportAnyTypeOfParameterButY { - get { - return ResourceManager.GetString("ExTranslationOfXMethodDoesNotSupportAnyTypeOfParameterButY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type cannot be null.. - /// - internal static string ExTypeCantBeNull { - get { - return ResourceManager.GetString("ExTypeCantBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type column '{0}' for fulltext column'{1}' must be type of string.. - /// - internal static string ExTypeColumnXForFulltextColumnYMustBeTypeOfString { - get { - return ResourceManager.GetString("ExTypeColumnXForFulltextColumnYMustBeTypeOfString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeDef '{0}' already belongs to hierarchy with '{1}' root.. - /// - internal static string ExTypeDefXIsAlreadyBelongsToHierarchyWithTheRootY { - get { - return ResourceManager.GetString("ExTypeDefXIsAlreadyBelongsToHierarchyWithTheRootY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeDiscriminator field is already set.. - /// - internal static string ExTypeDiscriminatorFieldIsAlreadySet { - get { - return ResourceManager.GetString("ExTypeDiscriminatorFieldIsAlreadySet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type discriminator field is not found for '{0}' type. - /// - internal static string ExTypeDiscriminatorIsNotFoundForXType { - get { - return ResourceManager.GetString("ExTypeDiscriminatorIsNotFoundForXType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type discriminator value is required unless {0} is marked as default type in hierarchy.. - /// - internal static string ExTypeDiscriminatorValueIsRequiredUnlessXIsMarkedAsDefaultTypeInHierarchy { - get { - return ResourceManager.GetString("ExTypeDiscriminatorValueIsRequiredUnlessXIsMarkedAsDefaultTypeInHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' has no primary index.. - /// - internal static string ExTypeHasNoPrimaryIndex { - get { - return ResourceManager.GetString("ExTypeHasNoPrimaryIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeId for type '{0}' is not found.. - /// - internal static string ExTypeIdForTypeXIsNotFound { - get { - return ResourceManager.GetString("ExTypeIdForTypeXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeId is not assigned for type '{0}'.. - /// - internal static string ExTypeIdIsNotAssignedForTypeX { - get { - return ResourceManager.GetString("ExTypeIdIsNotAssignedForTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type with TypeId={0} is not registered.. - /// - internal static string ExTypeIdXIsNotRegistered { - get { - return ResourceManager.GetString("ExTypeIdXIsNotRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeInfo hierarchy does not correspond to provided hierarchy.. - /// - internal static string ExTypeInfoHierarchyMistmatch { - get { - return ResourceManager.GetString("ExTypeInfoHierarchyMistmatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'TypeIs' method supports only Entities and Structures.. - /// - internal static string ExTypeIsMethodSupportsOnlyEntitiesAndStructures { - get { - return ResourceManager.GetString("ExTypeIsMethodSupportsOnlyEntitiesAndStructures", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type is not supported by BinaryPrimitiveSerializer.. - /// - internal static string ExTypeIsNotSupportedByBinaryPrimitiveSerializer { - get { - return ResourceManager.GetString("ExTypeIsNotSupportedByBinaryPrimitiveSerializer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid type specified.. - /// - internal static string ExTypeMustBeEntityDescendant { - get { - return ResourceManager.GetString("ExTypeMustBeEntityDescendant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not found in model.. - /// - internal static string ExTypeNotFoundInModel { - get { - return ResourceManager.GetString("ExTypeNotFoundInModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of entity stored in Key is undefined.. - /// - internal static string ExTypeOfEntityStoredInKeyIsUndefined { - get { - return ResourceManager.GetString("ExTypeOfEntityStoredInKeyIsUndefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type of the expression's return value is not '{0}'.. - /// - internal static string ExTypeOfExpressionReturnValueIsNotX { - get { - return ResourceManager.GetString("ExTypeOfExpressionReturnValueIsNotX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of '{0}' must be a descendant of {1} type.. - /// - internal static string ExTypeOfXMustBeADescendantOfYType { - get { - return ResourceManager.GetString("ExTypeOfXMustBeADescendantOfYType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of {0} property must be {1}.. - /// - internal static string ExTypeOfXPropertyMustBeY { - get { - return ResourceManager.GetString("ExTypeOfXPropertyMustBeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Types of values are different. - /// - internal static string ExTypesOfValuesAreDifferent { - get { - return ResourceManager.GetString("ExTypesOfValuesAreDifferent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type with name '{0}' is already defined.. - /// - internal static string ExTypeWithNameXIsAlreadyDefined { - get { - return ResourceManager.GetString("ExTypeWithNameXIsAlreadyDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type with name '{0}' is not found in metadata.. - /// - internal static string ExTypeWithNameXIsNotFoundInMetadata { - get { - return ResourceManager.GetString("ExTypeWithNameXIsNotFoundInMetadata", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type with name '{0}' isn't registered in the Domain.. - /// - internal static string ExTypeWithNameXIsNotRegistered { - get { - return ResourceManager.GetString("ExTypeWithNameXIsNotRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type with type TypeId='{0}' is not found.. - /// - internal static string ExTypeWithTypeIdXIsNotFound { - get { - return ResourceManager.GetString("ExTypeWithTypeIdXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type {0} can't be transformed.. - /// - internal static string ExTypeXCanNotBeTransformed { - get { - return ResourceManager.GetString("ExTypeXCanNotBeTransformed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' can't contain Version fields, because it is not a hierarchy root type.. - /// - internal static string ExTypeXCantContainsVersionFieldsAsItsNotAHierarchyRoot { - get { - return ResourceManager.GetString("ExTypeXCantContainsVersionFieldsAsItsNotAHierarchyRoot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' declares clustered index '{1}', but only root type can declare clustered indexes in single table hierarhy. - /// - internal static string ExTypeXDeclaresClusteredIndexYButOnlyRootTypeCanDeclareClusteredIndexInSingleTableHierarchy { - get { - return ResourceManager.GetString("ExTypeXDeclaresClusteredIndexYButOnlyRootTypeCanDeclareClusteredIndexInSingleTabl" + - "eHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not contain '{1}' field.. - /// - internal static string ExTypeXDoesNotContainYField { - get { - return ResourceManager.GetString("ExTypeXDoesNotContainYField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not has any public readable properties or fields, so it can't be persisted to storage.. - /// - internal static string ExTypeXDoesNotHasAnyPublicReadablePropertiesOrFieldsSoItCanTBePersistedToStorage { - get { - return ResourceManager.GetString("ExTypeXDoesNotHasAnyPublicReadablePropertiesOrFieldsSoItCanTBePersistedToStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not have a parameterless constructor.. - /// - internal static string ExTypeXDoesNotHaveAParameterlessConstructor { - get { - return ResourceManager.GetString("ExTypeXDoesNotHaveAParameterlessConstructor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not have property '{1}'.. - /// - internal static string ExTypeXDoesNotHavePropertyY { - get { - return ResourceManager.GetString("ExTypeXDoesNotHavePropertyY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not implement '{1}' interface.. - /// - internal static string ExTypeXDoesNotImplementYInterface { - get { - return ResourceManager.GetString("ExTypeXDoesNotImplementYInterface", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type {0} has already been registered.. - /// - internal static string ExTypeXHasAlreadyBeenRegistered { - get { - return ResourceManager.GetString("ExTypeXHasAlreadyBeenRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' has multiple clustered indexes: {1}. - /// - internal static string ExTypeXHasMultipleClusteredIndexesY { - get { - return ResourceManager.GetString("ExTypeXHasMultipleClusteredIndexesY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type {0} hasn't been registered.. - /// - internal static string ExTypeXHasNotBeenRegistered { - get { - return ResourceManager.GetString("ExTypeXHasNotBeenRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is already defined.. - /// - internal static string ExTypeXIsAlreadyDefined { - get { - return ResourceManager.GetString("ExTypeXIsAlreadyDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not collatable.. - /// - internal static string ExTypeXIsNotCollatable { - get { - return ResourceManager.GetString("ExTypeXIsNotCollatable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not found.. - /// - internal static string ExTypeXIsNotFound { - get { - return ResourceManager.GetString("ExTypeXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not registered.. - /// - internal static string ExTypeXIsNotRegistered { - get { - return ResourceManager.GetString("ExTypeXIsNotRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not registered in the model.. - /// - internal static string ExTypeXIsNotRegisteredInTheModel { - get { - return ResourceManager.GetString("ExTypeXIsNotRegisteredInTheModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not structure.. - /// - internal static string ExTypeXIsNotStructure { - get { - return ResourceManager.GetString("ExTypeXIsNotStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The type {0} isn't a subclass of the type {1}.. - /// - internal static string ExTypeXIsNotSubclassOfTypeY { - get { - return ResourceManager.GetString("ExTypeXIsNotSubclassOfTypeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not supported.. - /// - internal static string ExTypeXIsNotSupported { - get { - return ResourceManager.GetString("ExTypeXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not supported in 'new' expression.. - /// - internal static string ExTypeXIsNotSupportedInNewExpression { - get { - return ResourceManager.GetString("ExTypeXIsNotSupportedInNewExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' must belong to hierarchy.. - /// - internal static string ExTypeXMustBelongToHierarchy { - get { - return ResourceManager.GetString("ExTypeXMustBelongToHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' must be non-abstract type.. - /// - internal static string ExTypeXMustBeNonAbstractType { - get { - return ResourceManager.GetString("ExTypeXMustBeNonAbstractType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' must be reference type.. - /// - internal static string ExTypeXMustBeReferenceType { - get { - return ResourceManager.GetString("ExTypeXMustBeReferenceType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' must implement '{1}', or must be its descendant.. - /// - internal static string ExTypeXMustImplementY { - get { - return ResourceManager.GetString("ExTypeXMustImplementY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' should not be generic.. - /// - internal static string ExTypeXShouldNotBeGeneric { - get { - return ResourceManager.GetString("ExTypeXShouldNotBeGeneric", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' was not registered for activation.. - /// - internal static string ExTypeXWasNotRegisteredForActivation { - get { - return ResourceManager.GetString("ExTypeXWasNotRegisteredForActivation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to activate EntitySet for '{0}' field because it does not has association.. - /// - internal static string ExUnableToActivateEntitySetWithoutAssociation { - get { - return ResourceManager.GetString("ExUnableToActivateEntitySetWithoutAssociation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to apply VersionAttribute with VersionMode.Auto or Version.Mode.Manual mode set on field {0} of type {1}. Only VersionMode.Skip is allowed.. - /// - internal static string ExUnableToApplyVersionOnFieldXOfTypeY { - get { - return ResourceManager.GetString("ExUnableToApplyVersionOnFieldXOfTypeY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to associate field '{0}' with field '{1}'. Field '{0}' is already mapped to field '{2}'.. - /// - internal static string ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ { - get { - return ResourceManager.GetString("ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to associate type '{0}' with type '{1}'. Type '{0}' is already mapped to type '{2}'.. - /// - internal static string ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ { - get { - return ResourceManager.GetString("ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to bind parameters to lambda {0}. Parameters count is incorrect.. - /// - internal static string ExUnableToBindParametersToLambdaXParametersCountIsIncorrect { - get { - return ResourceManager.GetString("ExUnableToBindParametersToLambdaXParametersCountIsIncorrect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build full-text indexes for hierarchy '{0}' with InheritanceSchema.ClassTable.. - /// - internal static string ExUnableToBuildFulltextIndexesForHierarchyWithInheritanceSchemaClassTable { - get { - return ResourceManager.GetString("ExUnableToBuildFulltextIndexesForHierarchyWithInheritanceSchemaClassTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build generic instance types for '{0}' type because it contains more then 1 generic parameter.. - /// - internal static string ExUnableToBuildGenericInstanceTypesForXTypeBecauseItContainsMoreThen1GenericParameter { - get { - return ResourceManager.GetString("ExUnableToBuildGenericInstanceTypesForXTypeBecauseItContainsMoreThen1GenericParam" + - "eter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build generic instance types for '{0}' type because parameter is not constrained.. - /// - internal static string ExUnableToBuildGenericInstanceTypesForXTypeBecauseParameterIsNotConstrained { - get { - return ResourceManager.GetString("ExUnableToBuildGenericInstanceTypesForXTypeBecauseParameterIsNotConstrained", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build index {0} because it contains inherited fields.. - /// - internal static string ExUnableToBuildIndexXBecauseItWasBuiltOverInheritedFields { - get { - return ResourceManager.GetString("ExUnableToBuildIndexXBecauseItWasBuiltOverInheritedFields", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build subquery result for expression '{0}'. resultType is not IEnumerable<>.. - /// - internal static string ExUnableToBuildSubqueryResultForExpressionXResultTypeIsNotIEnumerable { - get { - return ResourceManager.GetString("ExUnableToBuildSubqueryResultForExpressionXResultTypeIsNotIEnumerable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to build subquery result for expression '{0}'. State contains no parameters.. - /// - internal static string ExUnableToBuildSubqueryResultForExpressionXStateContainsNoParameters { - get { - return ResourceManager.GetString("ExUnableToBuildSubqueryResultForExpressionXStateContainsNoParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to cast item of type '{0}' to '{1}' in queries.. - /// - internal static string ExUnableToCastItemOfTypeXToY { - get { - return ResourceManager.GetString("ExUnableToCastItemOfTypeXToY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to cast null value to {0}; use {0}? instead.. - /// - internal static string ExUnableToCastNullValueToXUseXInstead { - get { - return ResourceManager.GetString("ExUnableToCastNullValueToXUseXInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to clone non-user session configuration.. - /// - internal static string ExUnableToCloneNonUserSessionConfiguration { - get { - return ResourceManager.GetString("ExUnableToCloneNonUserSessionConfiguration", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create the connection. Check if all needed assemblies are available.. - /// - internal static string ExUnableToCreateConnection { - get { - return ResourceManager.GetString("ExUnableToCreateConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create key for '{0}' hierarchy. Key value or key generator should be specified.. - /// - internal static string ExUnableToCreateKeyForXHierarchy { - get { - return ResourceManager.GetString("ExUnableToCreateKeyForXHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create provider instance. Check if provider's class has static "Instance" property.. - /// - internal static string ExUnableToCreateProviderInstance { - get { - return ResourceManager.GetString("ExUnableToCreateProviderInstance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to define type identifier '{0}' for type '{1}'. Type is not exists.. - /// - internal static string ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists { - get { - return ResourceManager.GetString("ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find column '{0}' of index '{1}' in primary index.. - /// - internal static string ExUnableToFindColumnInPrimaryIndex { - get { - return ResourceManager.GetString("ExUnableToFindColumnInPrimaryIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find factory method for type '{0}'. Make sure assembly '{0}' is processed by weaver. See section 2 of Manual for details.. - /// - internal static string ExUnableToFindFactoryMethodForTypeXMakeSureAssemblyYProcessedByWeaver { - get { - return ResourceManager.GetString("ExUnableToFindFactoryMethodForTypeXMakeSureAssemblyYProcessedByWeaver", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find master association of association '{0}'. - /// - internal static string ExUnableToFindMasterAssociation { - get { - return ResourceManager.GetString("ExUnableToFindMasterAssociation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find type '{0}' in current model.. - /// - internal static string ExUnableToFindTypeXInCurrentModel { - get { - return ResourceManager.GetString("ExUnableToFindTypeXInCurrentModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to get TableColumn instance from index.. - /// - internal static string ExUnableToGetTableColumnInstanceFromIndex { - get { - return ResourceManager.GetString("ExUnableToGetTableColumnInstanceFromIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to get type of provider by name '{0}'.. - /// - internal static string ExUnableToGetTypeOfProviderByNameX { - get { - return ResourceManager.GetString("ExUnableToGetTypeOfProviderByNameX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to handle EntitySetExpression without specified Owner.. - /// - internal static string ExUnableToHandleEntitySetExpressionWithoutSpecifiedOwner { - get { - return ResourceManager.GetString("ExUnableToHandleEntitySetExpressionWithoutSpecifiedOwner", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to initialize JoinIndexProvider. Columns count mismatch.. - /// - internal static string ExUnableToInitializeJoinIndexProviderColumnsCountMismatch { - get { - return ResourceManager.GetString("ExUnableToInitializeJoinIndexProviderColumnsCountMismatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to materialize back local collection item '{0}'.. - /// - internal static string ExUnableToMaterializeBackLocalCollectionItem { - get { - return ResourceManager.GetString("ExUnableToMaterializeBackLocalCollectionItem", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to modify removed object.. - /// - internal static string ExUnableToModifyDeletedObject { - get { - return ResourceManager.GetString("ExUnableToModifyDeletedObject", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to parse prefetch expression '{0}'.. - /// - internal static string ExUnabletoParsePrefetchExpressionX { - get { - return ResourceManager.GetString("ExUnabletoParsePrefetchExpressionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to parse value '{0}' for field '{1}'. - /// - internal static string ExUnableToParseValueXForFieldY { - get { - return ResourceManager.GetString("ExUnableToParseValueXForFieldY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to persist type '{0}' to storage because of loop reference.. - /// - internal static string ExUnableToPersistTypeXBecauseOfLoopReference { - get { - return ResourceManager.GetString("ExUnableToPersistTypeXBecauseOfLoopReference", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to process recycled field definition '{0}': owner type is not registered in model.. - /// - internal static string ExUnableToProcessRecycledFieldDefinitionXOwnerTypeIsNotRegisteredInModel { - get { - return ResourceManager.GetString("ExUnableToProcessRecycledFieldDefinitionXOwnerTypeIsNotRegisteredInModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to remap FieldExpression.. - /// - internal static string ExUnableToRemapFieldExpression { - get { - return ResourceManager.GetString("ExUnableToRemapFieldExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to remap KeyExpression.. - /// - internal static string ExUnableToRemapKeyExpression { - get { - return ResourceManager.GetString("ExUnableToRemapKeyExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to remap one of filtered columns.. - /// - internal static string ExUnableToRemapOneOfFilteredColumns { - get { - return ResourceManager.GetString("ExUnableToRemapOneOfFilteredColumns", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to remove Owner from EntitySetExpression.. - /// - internal static string ExUnableToRemoveOwnerFromEntitySetExpression { - get { - return ResourceManager.GetString("ExUnableToRemoveOwnerFromEntitySetExpression", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to resolve database for node '{0}'. Please verify that this database exists.. - /// - internal static string ExUnableToResolveDatabaseForNodeXPleaseVerifyThatThisDatabaseExists { - get { - return ResourceManager.GetString("ExUnableToResolveDatabaseForNodeXPleaseVerifyThatThisDatabaseExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to resolve owner of FieldExpression '{0}'.. - /// - internal static string ExUnableToResolveOwnerOfFieldExpressionX { - get { - return ResourceManager.GetString("ExUnableToResolveOwnerOfFieldExpressionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to resolve owner of StructureExpression '{0}'.. - /// - internal static string ExUnableToResolveOwnerOfStructureExpressionX { - get { - return ResourceManager.GetString("ExUnableToResolveOwnerOfStructureExpressionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to resolve schema for node '{0}'. Please verify that this schema exists.. - /// - internal static string ExUnableToResolveSchemaForNodeXPleaseVerifyThatThisSchemaExists { - get { - return ResourceManager.GetString("ExUnableToResolveSchemaForNodeXPleaseVerifyThatThisSchemaExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to resolve type for Key '{0}'.. - /// - internal static string ExUnableToResolveTypeForKeyX { - get { - return ResourceManager.GetString("ExUnableToResolveTypeForKeyX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited started asynchronous queries before persisting any changes.. - /// - internal static string ExUnableToSaveModifiedEntitesBecauseOfIncompleteAsynchronousQueries { - get { - return ResourceManager.GetString("ExUnableToSaveModifiedEntitesBecauseOfIncompleteAsynchronousQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited asyncronous queries before persisting any changes.. - /// - internal static string ExUnableToSaveModifiedEntitesBecauseSomeAsynchronousQueryIsIncomplete { - get { - return ResourceManager.GetString("ExUnableToSaveModifiedEntitesBecauseSomeAsynchronousQueryIsIncomplete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to set 'Indexed' flag on EntitySet field {0}.. - /// - internal static string ExUnableToSetIndexedFlagOnEntitySetFieldX { - get { - return ResourceManager.GetString("ExUnableToSetIndexedFlagOnEntitySetFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to set 'Indexed' flag on Structure field {0}.. - /// - internal static string ExUnableToSetIndexedFlagOnStructureFieldX { - get { - return ResourceManager.GetString("ExUnableToSetIndexedFlagOnStructureFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to set Key field '{0}' explicitly.. - /// - internal static string ExUnableToSetKeyFieldXExplicitly { - get { - return ResourceManager.GetString("ExUnableToSetKeyFieldXExplicitly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to store untyped 'Key' to storage. Use '{0}' instead of 'Key'.. - /// - internal static string ExUnableToStoreUntypedKeyToStorage { - get { - return ResourceManager.GetString("ExUnableToStoreUntypedKeyToStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate lambda expression '{0}' because it requires to materialize entity of type '{1}'.. - /// - internal static string ExUnableToTranslateLambdaExpressionXBecauseItRequiresToMaterializeEntityOfTypeX { - get { - return ResourceManager.GetString("ExUnableToTranslateLambdaExpressionXBecauseItRequiresToMaterializeEntityOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' expression. See inner exception for details.. - /// - internal static string ExUnableToTranslateXExpressionSeeInnerExceptionForDetails { - get { - return ResourceManager.GetString("ExUnableToTranslateXExpressionSeeInnerExceptionForDetails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' in partial index definition for index '{1}'. Reason: {2}.. - /// - internal static string ExUnableToTranslateXInPartialIndexDefinitionForIndexYReasonZ { - get { - return ResourceManager.GetString("ExUnableToTranslateXInPartialIndexDefinitionForIndexYReasonZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to use base implementation of VisitGenericExpression without specifying genericProcessor delegate.. - /// - internal static string ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericProcessorDelegate { - get { - return ResourceManager.GetString("ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericPr" + - "ocessorDelegate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Usage of ElementAt(int) or ElementAtOrDefault(int) in Query.Execute is wrong. Use ElementAt(Func<int>) or ElementAtOrDefault(Func<int>) instead.. - /// - internal static string ExUnableToUseElementAtIntInQueryExecuteUseElementAtFuncIntInstead { - get { - return ResourceManager.GetString("ExUnableToUseElementAtIntInQueryExecuteUseElementAtFuncIntInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to use expression {0} as {1} parameter of lambda {2} because of type mistmatch.. - /// - internal static string ExUnableToUseExpressionXAsXParameterOfLambdaXBecauseOfTypeMistmatch { - get { - return ResourceManager.GetString("ExUnableToUseExpressionXAsXParameterOfLambdaXBecauseOfTypeMistmatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to use IQueryable '{0}' in Query.Execute statement.. - /// - internal static string ExUnableToUseIQueryableXInQueryExecuteStatement { - get { - return ResourceManager.GetString("ExUnableToUseIQueryableXInQueryExecuteStatement", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unauthorized: the caller is declared outside of any of registered assemblies.. - /// - internal static string ExUnauthorizedAccessDeclarationOfCallerTypeIsNotInRegisteredAssembly { - get { - return ResourceManager.GetString("ExUnauthorizedAccessDeclarationOfCallerTypeIsNotInRegisteredAssembly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unbound column '{0}'.. - /// - internal static string ExUnboundColumn { - get { - return ResourceManager.GetString("ExUnboundColumn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ForeignKey is undefined.. - /// - internal static string ExUndefinedForeignKey { - get { - return ResourceManager.GetString("ExUndefinedForeignKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PrimaryKey is undefined.. - /// - internal static string ExUndefinedPrimaryKey { - get { - return ResourceManager.GetString("ExUndefinedPrimaryKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of column "{0}" is undefined.. - /// - internal static string ExUndefinedTypeOfColumnX { - get { - return ResourceManager.GetString("ExUndefinedTypeOfColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type of sequence "{0}" is undefined.. - /// - internal static string ExUndefinedTypeOfSequenceX { - get { - return ResourceManager.GetString("ExUndefinedTypeOfSequenceX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Underlying storage provider does not support SQL.. - /// - internal static string ExUnderlyingStorageProviderDoesNotSupportSQL { - get { - return ResourceManager.GetString("ExUnderlyingStorageProviderDoesNotSupportSQL", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unexpected type of parameter.. - /// - internal static string ExUnexpectedTypeOfParameter { - get { - return ResourceManager.GetString("ExUnexpectedTypeOfParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown entity serialization kind '{0}'.. - /// - internal static string ExUnknownEntitySerializationKindX { - get { - return ResourceManager.GetString("ExUnknownEntitySerializationKindX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown expression type: '{0} ({1})'. - /// - internal static string ExUnknownExpressionType { - get { - return ResourceManager.GetString("ExUnknownExpressionType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}' expression. Unknown "In" syntax.. - /// - internal static string ExUnknownInSyntax { - get { - return ResourceManager.GetString("ExUnknownInSyntax", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not supported by current storage provider.. - /// - internal static string ExUnsupportedColumnType { - get { - return ResourceManager.GetString("ExUnsupportedColumnType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unsupported expression type: '{0}'.. - /// - internal static string ExUnsupportedExpressionType { - get { - return ResourceManager.GetString("ExUnsupportedExpressionType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unsupported field type: '{0}'. - /// - internal static string ExUnsupportedFieldTypeX { - get { - return ResourceManager.GetString("ExUnsupportedFieldTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index '{0}' with attributes '{1}' is not supported.. - /// - internal static string ExUnsupportedIndex { - get { - return ResourceManager.GetString("ExUnsupportedIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unsupported type: '{0}'.. - /// - internal static string ExUnsupportedType { - get { - return ResourceManager.GetString("ExUnsupportedType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade hint error. Source field '{0}' not found.. - /// - internal static string ExUpgradeHintSourceFieldNotFound { - get { - return ResourceManager.GetString("ExUpgradeHintSourceFieldNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade hint error. Source type '{0}' not found.. - /// - internal static string ExUpgradeHintSourceTypeNotFound { - get { - return ResourceManager.GetString("ExUpgradeHintSourceTypeNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade hint error. Target field '{0}' not found.. - /// - internal static string ExUpgradeHintTargetFieldNotFound { - get { - return ResourceManager.GetString("ExUpgradeHintTargetFieldNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade hint error. Target type '{0}' not found.. - /// - internal static string ExUpgradeHintTargetTypeNotFound { - get { - return ResourceManager.GetString("ExUpgradeHintTargetTypeNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade of assembly '{0}' from version '{1}' to '{2}' is not supported.. - /// - internal static string ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported { - get { - return ResourceManager.GetString("ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade sequence validation failure.. - /// - internal static string ExUpgradeSequenceValidationFailure { - get { - return ResourceManager.GetString("ExUpgradeSequenceValidationFailure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use LogCaptureScope constructor instead.. - /// - internal static string ExUseLogCaptureScopeConstructorInstead { - get { - return ResourceManager.GetString("ExUseLogCaptureScopeConstructorInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use LogIndentScope constructor instead.. - /// - internal static string ExUseLogIndentScopeConstructorInstead { - get { - return ResourceManager.GetString("ExUseLogIndentScopeConstructorInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}'. Use method ('{1}') on First/FirstOrDefault instead of Single/SingleOrDefault.. - /// - internal static string ExUseMethodXOnFirstInsteadOfSingle { - get { - return ResourceManager.GetString("ExUseMethodXOnFirstInsteadOfSingle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User defined type identifier '{0}' for type '{1}' less then 100.. - /// - internal static string ExUserDefinedTypeIdentifierXForTypeYLessThan100 { - get { - return ResourceManager.GetString("ExUserDefinedTypeIdentifierXForTypeYLessThan100", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to validateVersion=true is incompatible with PersistRequestKind=Insert. - /// - internal static string ExValidateVersionEqTrueIsIncompatibleWithPersistRequestKindEqInsert { - get { - return ResourceManager.GetString("ExValidateVersionEqTrueIsIncompatibleWithPersistRequestKindEqInsert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validation context is in invalid state. This means that some validation error has happened, but later it was suppressed.. - /// - internal static string ExValidationContextIsInvalid { - get { - return ResourceManager.GetString("ExValidationContextIsInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validation failed.. - /// - internal static string ExValidationFailed { - get { - return ResourceManager.GetString("ExValidationFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validator '{0}' configuration failed on type '{1}' field '{2}'. {3}. - /// - internal static string ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA { - get { - return ResourceManager.GetString("ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validator '{0}' configuration failed on type '{1}'. {2}. - /// - internal static string ExValidatorXConfigurationFailedOnTypeYWithMessageZ { - get { - return ResourceManager.GetString("ExValidatorXConfigurationFailedOnTypeYWithMessageZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value for parameter '{0}' is not set.. - /// - internal static string ExValueForParameterXIsNotSet { - get { - return ResourceManager.GetString("ExValueForParameterXIsNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value for placeholder '{0}' is not set.. - /// - internal static string ExValueForPlaceholderXIsNotSet { - get { - return ResourceManager.GetString("ExValueForPlaceholderXIsNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value is already assigned.. - /// - internal static string ExValueIsAlreadyAssigned { - get { - return ResourceManager.GetString("ExValueIsAlreadyAssigned", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}.{1}': '{2}' value is not acceptable for 'OnTargetRemove' property.. - /// - internal static string ExValueIsNotAcceptableForOnTargetRemoveProperty { - get { - return ResourceManager.GetString("ExValueIsNotAcceptableForOnTargetRemoveProperty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value is not available.. - /// - internal static string ExValueIsNotAvailable { - get { - return ResourceManager.GetString("ExValueIsNotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The value of the parameter {0} can't be {1}, if the value of the parameter {2} is {3}.. - /// - internal static string ExValueOfParameterWCantBeXIfValueOfParameterYIsZ { - get { - return ResourceManager.GetString("ExValueOfParameterWCantBeXIfValueOfParameterYIsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should be '{0}' descendant.. - /// - internal static string ExValueShouldBeXDescendant { - get { - return ResourceManager.GetString("ExValueShouldBeXDescendant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value with name '{0}' already exists.. - /// - internal static string ExValueWithNameXAlreadyExists { - get { - return ResourceManager.GetString("ExValueWithNameXAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value with name '{0}' is not found.. - /// - internal static string ExValueWithNameXIsNotFound { - get { - return ResourceManager.GetString("ExValueWithNameXIsNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not allowed or invalid here.. - /// - internal static string ExValueXIsNotAllowedHere { - get { - return ResourceManager.GetString("ExValueXIsNotAllowedHere", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version conflict.. - /// - internal static string ExVersionConflict { - get { - return ResourceManager.GetString("ExVersionConflict", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version conflict on object {0}: expected: {1} = {2}, but it is {3}.. - /// - internal static string ExVersionConflictEx { - get { - return ResourceManager.GetString("ExVersionConflictEx", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version field '{0}' can't be LazyLoad field.. - /// - internal static string ExVersionFieldXCanTBeLazyLoadField { - get { - return ResourceManager.GetString("ExVersionFieldXCanTBeLazyLoadField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version field '{0}' can't be of {1} type.. - /// - internal static string ExVersionFieldXCanTBeOfYType { - get { - return ResourceManager.GetString("ExVersionFieldXCanTBeOfYType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version field '{0}' can't be System field.. - /// - internal static string ExVersionFieldXCanTBeSystemField { - get { - return ResourceManager.GetString("ExVersionFieldXCanTBeSystemField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version of entity with key '{0}' differs from the expected one.. - /// - internal static string ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne { - get { - return ResourceManager.GetString("ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version root object can't implement IHasVersionRoots.. - /// - internal static string ExVersionRootObjectCantImplementIHasVersionRoots { - get { - return ResourceManager.GetString("ExVersionRootObjectCantImplementIHasVersionRoots", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to VisitKeyField is not supported by '{0}'.. - /// - internal static string ExVisitKeyFieldIsNotSupportedByX { - get { - return ResourceManager.GetString("ExVisitKeyFieldIsNotSupportedByX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Wrong key structure.. - /// - internal static string ExWrongKeyStructure { - get { - return ResourceManager.GetString("ExWrongKeyStructure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Wrong persistent type candidate: '{0}'.. - /// - internal static string ExWrongPersistentTypeCandidate { - get { - return ResourceManager.GetString("ExWrongPersistentTypeCandidate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Source collection contains at least one item of type "{0}", that cannot be cast to the item type of the destination collection.. - /// - internal static string ExWrongSourceCollectionElementType { - get { - return ResourceManager.GetString("ExWrongSourceCollectionElementType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} can't be executed on specified sources.. - /// - internal static string ExXCantBeExecuted { - get { - return ResourceManager.GetString("ExXCantBeExecuted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' descendant is already a root of another hierarchy.. - /// - internal static string ExXDescendantIsAlreadyARootOfAnotherHierarchy { - get { - return ResourceManager.GetString("ExXDescendantIsAlreadyARootOfAnotherHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' does not support '{1}'.. - /// - internal static string ExXDoesNotSupportX { - get { - return ResourceManager.GetString("ExXDoesNotSupportX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' field is not declared in Entity descendant, so cannot be used as type discriminator.. - /// - internal static string ExXFieldIsNotDeclaredInEntityDescendantSoCannotBeUsedAsTypeDiscriminator { - get { - return ResourceManager.GetString("ExXFieldIsNotDeclaredInEntityDescendantSoCannotBeUsedAsTypeDiscriminator", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} implementors don't belong to any hierarchy.. - /// - internal static string ExXImplementorsDontBelongToAnyHierarchy { - get { - return ResourceManager.GetString("ExXImplementorsDontBelongToAnyHierarchy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The {0} is neither class nor value type.. - /// - internal static string ExXIsNeitherClassNorValueType { - get { - return ResourceManager.GetString("ExXIsNeitherClassNorValueType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not suitable field for full-text search. - /// - internal static string ExXIsNotSuitableFieldFoFullTextSearch { - get { - return ResourceManager.GetString("ExXIsNotSuitableFieldFoFullTextSearch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not supported. - /// - internal static string ExXIsNotSupported { - get { - return ResourceManager.GetString("ExXIsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not valid name for {1}.. - /// - internal static string ExXIsNotValidNameForX { - get { - return ResourceManager.GetString("ExXIsNotValidNameForX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is obsolete. Use {1} and {2} instead.. - /// - internal static string ExXIsObsoleteUseYAndZInstead { - get { - return ResourceManager.GetString("ExXIsObsoleteUseYAndZInstead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' must be active.. - /// - internal static string ExXMustBeActive { - get { - return ResourceManager.GetString("ExXMustBeActive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' must be inherited from '{1}'.. - /// - internal static string ExXMustBeInheritedFromX { - get { - return ResourceManager.GetString("ExXMustBeInheritedFromX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' name can't be empty.. - /// - internal static string ExXNameCantBeEmpty { - get { - return ResourceManager.GetString("ExXNameCantBeEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be of type '{4}' but actually it is '{5}'.. - /// - internal static string ExXYFieldPairedToZAFieldShouldBeBButCurrentIsC { - get { - return ResourceManager.GetString("ExXYFieldPairedToZAFieldShouldBeBButCurrentIsC", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be 'EntitySet<{4}>' but it is 'EntitySet<{5}>'.. - /// - internal static string ExXYFieldPairedToZAFieldShouldBeEntitySetOfBButCurrentIsC { - get { - return ResourceManager.GetString("ExXYFieldPairedToZAFieldShouldBeEntitySetOfBButCurrentIsC", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must either apply or cancel cached changes before changing this property.. - /// - internal static string ExYouMustEitherApplyOrCancelCachedChangesToChangeThisProperty { - get { - return ResourceManager.GetString("ExYouMustEitherApplyOrCancelCachedChangesToChangeThisProperty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to create regular expression from pattern '{0}'.. - /// - internal static string FailedToCreateRegularExpressionFromPatternX { - get { - return ResourceManager.GetString("FailedToCreateRegularExpressionFromPatternX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field should be of comparable type.. - /// - internal static string FieldShouldBeOfComparableType { - get { - return ResourceManager.GetString("FieldShouldBeOfComparableType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field should be of type '{0}'.. - /// - internal static string FieldShouldBeOfTypeX { - get { - return ResourceManager.GetString("FieldShouldBeOfTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field: {0};. - /// - internal static string FieldX { - get { - return ResourceManager.GetString("FieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to field '{0}' does not exist in table for '{1}'. - /// - internal static string FieldXDoesNotExistInTableForY { - get { - return ResourceManager.GetString("FieldXDoesNotExistInTableForY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field '{0}' is complex and cannot be used for search.. - /// - internal static string FieldXIsComplexAndCannotBeUsedForSearch { - get { - return ResourceManager.GetString("FieldXIsComplexAndCannotBeUsedForSearch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to full. - /// - internal static string Full { - get { - return ResourceManager.GetString("Full", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Full text queries. - /// - internal static string FullTextQueries { - get { - return ResourceManager.GetString("FullTextQueries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Generators. - /// - internal static string Generators { - get { - return ResourceManager.GetString("Generators", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} (v{1}). - /// - internal static string HasVersionFormat { - get { - return ResourceManager.GetString("HasVersionFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hierarchy columns. - /// - internal static string HierarchyColumns { - get { - return ResourceManager.GetString("HierarchyColumns", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Indexes. - /// - internal static string Indexes { - get { - return ResourceManager.GetString("Indexes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}{1}d. - /// - internal static string InfinitesimalFormat { - get { - return ResourceManager.GetString("InfinitesimalFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to inf. - /// - internal static string Infinity { - get { - return ResourceManager.GetString("Infinity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} change(s). - /// - internal static string ItemChangeCountFormat { - get { - return ResourceManager.GetString("ItemChangeCountFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}. - /// - internal static string ItemChangeFormat { - get { - return ResourceManager.GetString("ItemChangeFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to translate '{0}'. Join keys length mismatch.. - /// - internal static string JoinKeysLengthMismatch { - get { - return ResourceManager.GetString("JoinKeysLengthMismatch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}, {1}. - /// - internal static string KeyFormat { - get { - return ResourceManager.GetString("KeyFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} (unknown), {1}. - /// - internal static string KeyFormatUnknownKeyType { - get { - return ResourceManager.GetString("KeyFormatUnknownKeyType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key generators. - /// - internal static string KeyGenerators { - get { - return ResourceManager.GetString("KeyGenerators", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Key mapping. - /// - internal static string KeyMapping { - get { - return ResourceManager.GetString("KeyMapping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to known. - /// - internal static string Known { - get { - return ResourceManager.GetString("Known", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Length. - /// - internal static string Length { - get { - return ResourceManager.GetString("Length", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Async operation error.. - /// - internal static string LogAsyncOperationError { - get { - return ResourceManager.GetString("LogAsyncOperationError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempt to use disposed instance of type '{0}'.. - /// - internal static string LogAttemptToUseDisposedInstance { - get { - return ResourceManager.GetString("LogAttemptToUseDisposedInstance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatic upgrade sequence validation. - /// - internal static string LogAutomaticUpgradeSequenceValidation { - get { - return ResourceManager.GetString("LogAutomaticUpgradeSequenceValidation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Building declared field '{0}.{1}'. - /// - internal static string LogBuildingDeclaredFieldXY { - get { - return ResourceManager.GetString("LogBuildingDeclaredFieldXY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Building index '{0}'. - /// - internal static string LogBuildingIndexX { - get { - return ResourceManager.GetString("LogBuildingIndexX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Building inherited field '{0}.{1}'. - /// - internal static string LogBuildingInheritedFieldXY { - get { - return ResourceManager.GetString("LogBuildingInheritedFieldXY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Building interface field '{0}.{1}'. - /// - internal static string LogBuildingInterfaceFieldXY { - get { - return ResourceManager.GetString("LogBuildingInterfaceFieldXY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Building {0}. - /// - internal static string LogBuildingX { - get { - return ResourceManager.GetString("LogBuildingX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Calculating database dependencies. - /// - internal static string LogCalculatingDatabaseDependencies { - get { - return ResourceManager.GetString("LogCalculatingDatabaseDependencies", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can't find {0} ('{1}') for type '{2}'.. - /// - internal static string LogCantFindAssociateFor { - get { - return ResourceManager.GetString("LogCantFindAssociateFor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Changes are successfully applied.. - /// - internal static string LogChangesAreSuccessfullyApplied { - get { - return ResourceManager.GetString("LogChangesAreSuccessfullyApplied", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Clearing comparison result: - ///{0}. - /// - internal static string LogClearingComparisonResultX { - get { - return ResourceManager.GetString("LogClearingComparisonResultX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Comparison result: - ///{0}. - /// - internal static string LogComparisonResultX { - get { - return ResourceManager.GetString("LogComparisonResultX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection restore failed.. - /// - internal static string LogConnectionRestoreFailed { - get { - return ResourceManager.GetString("LogConnectionRestoreFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection successfully restored.. - /// - internal static string LogConnectionSuccessfullyRestored { - get { - return ResourceManager.GetString("LogConnectionSuccessfullyRestored", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Creating {0}. - /// - internal static string LogCreatingX { - get { - return ResourceManager.GetString("LogCreatingX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Defining field '{0}'. - /// - internal static string LogDefiningFieldX { - get { - return ResourceManager.GetString("LogDefiningFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Defining hierarchy for type '{0}'. - /// - internal static string LogDefiningHierarchyForTypeX { - get { - return ResourceManager.GetString("LogDefiningHierarchyForTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Defining indexes. - /// - internal static string LogDefiningIndexes { - get { - return ResourceManager.GetString("LogDefiningIndexes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Defining '{0}'. - /// - internal static string LogDefiningX { - get { - return ResourceManager.GetString("LogDefiningX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DisconnectedState.CancelChanges. - /// - internal static string LogDisconnectedStateCancelChanges { - get { - return ResourceManager.GetString("LogDisconnectedStateCancelChanges", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Domain is disposing.. - /// - internal static string LogDomainIsDisposing { - get { - return ResourceManager.GetString("LogDomainIsDisposing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Domain is disposing by a finalizer.. - /// - internal static string LogDomainIsDisposingByAFinalizer { - get { - return ResourceManager.GetString("LogDomainIsDisposingByAFinalizer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Domain model is not found in the storage.. - /// - internal static string LogDomainModelIsNotFoundInStorage { - get { - return ResourceManager.GetString("LogDomainModelIsNotFoundInStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Exception!. - /// - internal static string LogException { - get { - return ResourceManager.GetString("LogException", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Executing action: '{0}'. - /// - internal static string LogExecutingActionX { - get { - return ResourceManager.GetString("LogExecutingActionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error setting default value {0} for column '{1}' in type '{2}'. Most likely, its type is incorrect.. - /// - internal static string LogExErrorSettingDefaultValueXForColumnYInTypeZ { - get { - return ResourceManager.GetString("LogExErrorSettingDefaultValueXForColumnYInTypeZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Explicit LazyLoad=true on field '{0}' is redundant.. - /// - internal static string LogExplicitLazyLoadAttributeOnFieldXIsRedundant { - get { - return ResourceManager.GetString("LogExplicitLazyLoadAttributeOnFieldXIsRedundant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Extracted schema:. - /// - internal static string LogExtractedSchema { - get { - return ResourceManager.GetString("LogExtractedSchema", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to add schema hint '{0}' to schema hint collection. The hint will be ignored. - ///Likely, the schema object (table, column, etc.) it references does not exists, because it was manually removed from the database. - ///Error: {1}. - /// - internal static string LogFailedToAddSchemaHintXErrorY { - get { - return ResourceManager.GetString("LogFailedToAddSchemaHintXErrorY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to extract domain model from the storage.. - /// - internal static string LogFailedToExtractDomainModelFromStorage { - get { - return ResourceManager.GetString("LogFailedToExtractDomainModelFromStorage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to extract metadata from '{0}.{1}': {2}. - /// - internal static string LogFailedToExtractMetadataFromXYZ { - get { - return ResourceManager.GetString("LogFailedToExtractMetadataFromXYZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Field: '{0}'. - /// - internal static string LogFieldX { - get { - return ResourceManager.GetString("LogFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Full text indexes are not supported by current storage, ignoring index '{0}'. - /// - internal static string LogFullTextIndexesAreNotSupportedByCurrentStorageIgnoringIndexX { - get { - return ResourceManager.GetString("LogFullTextIndexesAreNotSupportedByCurrentStorageIgnoringIndexX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}<{1}, {2}>' creation has failed for '{3}'.. - /// - internal static string LogGenericAssociateCreationHasFailedFor { - get { - return ResourceManager.GetString("LogGenericAssociateCreationHasFailedFor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}<{1}, {2}>' was used for '{3}'.. - /// - internal static string LogGenericAssociateIsUsedFor { - get { - return ResourceManager.GetString("LogGenericAssociateIsUsedFor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Given connection is corrupted. Trying to restore the connection.. - /// - internal static string LogGivenConnectionIsCorruptedTryingToRestoreTheConnection { - get { - return ResourceManager.GetString("LogGivenConnectionIsCorruptedTryingToRestoreTheConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hierarchy: '{0}'. - /// - internal static string LogHierarchyX { - get { - return ResourceManager.GetString("LogHierarchyX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index: '{0}'. - /// - internal static string LogIndexX { - get { - return ResourceManager.GetString("LogIndexX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inspecting hierarchy '{0}'. - /// - internal static string LogInspectingHierarchyX { - get { - return ResourceManager.GetString("LogInspectingHierarchyX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inspecting model definition. - /// - internal static string LogInspectingModelDefinition { - get { - return ResourceManager.GetString("LogInspectingModelDefinition", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inspecting type '{0}'. - /// - internal static string LogInspectingTypeX { - get { - return ResourceManager.GetString("LogInspectingTypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}:. - /// - internal static string LogItemFormat { - get { - return ResourceManager.GetString("LogItemFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Metadata.Assembly created: '{0}'.. - /// - internal static string LogMetadataAssemblyCreatedX { - get { - return ResourceManager.GetString("LogMetadataAssemblyCreatedX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Metadata.Assembly updated: '{0}', from version '{1}' to '{2}'.. - /// - internal static string LogMetadataAssemblyUpdatedXFromVersionYToZ { - get { - return ResourceManager.GetString("LogMetadataAssemblyUpdatedXFromVersionYToZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Metadata.Type renamed: '{0}' to '{1}'.. - /// - internal static string LogMetadataTypeRenamedXToY { - get { - return ResourceManager.GetString("LogMetadataTypeRenamedXToY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Opening session '{0}'.. - /// - internal static string LogOpeningSessionX { - get { - return ResourceManager.GetString("LogOpeningSessionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Processing fixup actions. - /// - internal static string LogProcessingFixupActions { - get { - return ResourceManager.GetString("LogProcessingFixupActions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Processing mapping rules. - /// - internal static string LogProcessingMappingRules { - get { - return ResourceManager.GetString("LogProcessingMappingRules", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Processing '{0}'. - /// - internal static string LogProcessingX { - get { - return ResourceManager.GetString("LogProcessingX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: started.. - /// - internal static string LogRegionBegin { - get { - return ResourceManager.GetString("LogRegionBegin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: completed.. - /// - internal static string LogRegionEnd { - get { - return ResourceManager.GetString("LogRegionEnd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error during undoing the relation synchronization.. - /// - internal static string LogRelationSyncUndoError { - get { - return ResourceManager.GetString("LogRelationSyncUndoError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reusing cached mapping information for '{0}'. - /// - internal static string LogReusingCachedMappingInformationForX { - get { - return ResourceManager.GetString("LogReusingCachedMappingInformationForX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Safe dispose of '{0}' failing.. - /// - internal static string LogSafeDisposeFailing { - get { - return ResourceManager.GetString("LogSafeDisposeFailing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scope dispose error.. - /// - internal static string LogScopeDisposeError { - get { - return ResourceManager.GetString("LogScopeDisposeError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SessionManager.EndRequest method was not invoked during processing of the previous request to this module.. - /// - internal static string LogSessionManagerEndRequestMethodWasNotInvoked { - get { - return ResourceManager.GetString("LogSessionManagerEndRequestMethodWasNotInvoked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Beginning transaction @ {1}.. - /// - internal static string LogSessionXBeginningTransactionWithYIsolationLevel { - get { - return ResourceManager.GetString("LogSessionXBeginningTransactionWithYIsolationLevel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Caching: {1}.. - /// - internal static string LogSessionXCachingY { - get { - return ResourceManager.GetString("LogSessionXCachingY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Closing connection '{1}'.. - /// - internal static string LogSessionXClosingConnectionY { - get { - return ResourceManager.GetString("LogSessionXClosingConnectionY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Committed transaction.. - /// - internal static string LogSessionXCommittedTransaction { - get { - return ResourceManager.GetString("LogSessionXCommittedTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Committing transaction.. - /// - internal static string LogSessionXCommittingTransaction { - get { - return ResourceManager.GetString("LogSessionXCommittingTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Commit transaction.. - /// - internal static string LogSessionXCommitTransaction { - get { - return ResourceManager.GetString("LogSessionXCommitTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Creating connection.. - /// - internal static string LogSessionXCreatingConnection { - get { - return ResourceManager.GetString("LogSessionXCreatingConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. DisconnectedState.ApplyChanges. - /// - internal static string LogSessionXDisconnectedStateApplyChanges { - get { - return ResourceManager.GetString("LogSessionXDisconnectedStateApplyChanges", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. DisconnectedState.Attach. - /// - internal static string LogSessionXDisconnectedStateAttach { - get { - return ResourceManager.GetString("LogSessionXDisconnectedStateAttach", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. DisconnectedState.Connect(). - /// - internal static string LogSessionXDisconnectedStateConnect { - get { - return ResourceManager.GetString("LogSessionXDisconnectedStateConnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. DisconnectedState is disconnected. - /// - internal static string LogSessionXDisconnectedStateDisconnect { - get { - return ResourceManager.GetString("LogSessionXDisconnectedStateDisconnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Disposing.. - /// - internal static string LogSessionXDisposing { - get { - return ResourceManager.GetString("LogSessionXDisposing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Disposing connection.. - /// - internal static string LogSessionXDisposingConnection { - get { - return ResourceManager.GetString("LogSessionXDisposingConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Identifying entity: Key = '{1}', identified as '{2}'.. - /// - internal static string LogSessionXEntityWithKeyYIdentifiedAsZ { - get { - return ResourceManager.GetString("LogSessionXEntityWithKeyYIdentifiedAsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Getting value: Key = '{1}', Field = '{2}'.. - /// - internal static string LogSessionXGettingValueKeyYFieldZ { - get { - return ResourceManager.GetString("LogSessionXGettingValueKeyYFieldZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Invalidate.. - /// - internal static string LogSessionXInvalidate { - get { - return ResourceManager.GetString("LogSessionXInvalidate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Make savepoint '{1}'.. - /// - internal static string LogSessionXMakeSavepointY { - get { - return ResourceManager.GetString("LogSessionXMakeSavepointY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Materializing {1}: Key = '{2}'.. - /// - internal static string LogSessionXMaterializingYKeyZ { - get { - return ResourceManager.GetString("LogSessionXMaterializingYKeyZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Opening connection '{1}'.. - /// - internal static string LogSessionXOpeningConnectionY { - get { - return ResourceManager.GetString("LogSessionXOpeningConnectionY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Opening transaction.. - /// - internal static string LogSessionXOpeningTransaction { - get { - return ResourceManager.GetString("LogSessionXOpeningTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Persist completed.. - /// - internal static string LogSessionXPersistCompleted { - get { - return ResourceManager.GetString("LogSessionXPersistCompleted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Persisting (reason: {1}).. - /// - internal static string LogSessionXPersistingReasonY { - get { - return ResourceManager.GetString("LogSessionXPersistingReasonY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. SQL batch: - ///{1}. - /// - internal static string LogSessionXQueryY { - get { - return ResourceManager.GetString("LogSessionXQueryY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Release savepoint '{1}'.. - /// - internal static string LogSessionXReleaseSavepointY { - get { - return ResourceManager.GetString("LogSessionXReleaseSavepointY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Remapping entity keys.. - /// - internal static string LogSessionXRemappingEntityKeys { - get { - return ResourceManager.GetString("LogSessionXRemappingEntityKeys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Removing: Key = '{1}'.. - /// - internal static string LogSessionXRemovingKeyY { - get { - return ResourceManager.GetString("LogSessionXRemovingKeyY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Exact type is unknown. Fetch is required.. - /// - internal static string LogSessionXResolvingKeyYExactTypeIsUnknownFetchIsRequired { - get { - return ResourceManager.GetString("LogSessionXResolvingKeyYExactTypeIsUnknownFetchIsRequired", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Exact type is {2}.. - /// - internal static string LogSessionXResolvingKeyYExactTypeIsZ { - get { - return ResourceManager.GetString("LogSessionXResolvingKeyYExactTypeIsZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Key is already resolved.. - /// - internal static string LogSessionXResolvingKeyYKeyIsAlreadyResolved { - get { - return ResourceManager.GetString("LogSessionXResolvingKeyYKeyIsAlreadyResolved", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Rollback to savepoint '{1}'.. - /// - internal static string LogSessionXRollbackToSavepointY { - get { - return ResourceManager.GetString("LogSessionXRollbackToSavepointY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Rollback transaction.. - /// - internal static string LogSessionXRollbackTransaction { - get { - return ResourceManager.GetString("LogSessionXRollbackTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Rolled back transaction.. - /// - internal static string LogSessionXRolledBackTransaction { - get { - return ResourceManager.GetString("LogSessionXRolledBackTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Rolling back transaction.. - /// - internal static string LogSessionXRollingBackTransaction { - get { - return ResourceManager.GetString("LogSessionXRollingBackTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Schema upgrade script: - ///{1}. - /// - internal static string LogSessionXSchemaUpgradeScriptY { - get { - return ResourceManager.GetString("LogSessionXSchemaUpgradeScriptY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Setting value: Key = '{1}', Field = '{2}'.. - /// - internal static string LogSessionXSettingValueKeyYFieldZ { - get { - return ResourceManager.GetString("LogSessionXSettingValueKeyYFieldZ", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Transaction. - /// - internal static string LogSessionXTransaction { - get { - return ResourceManager.GetString("LogSessionXTransaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Updating cache: {1}.. - /// - internal static string LogSessionXUpdatingCacheY { - get { - return ResourceManager.GetString("LogSessionXUpdatingCacheY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session '{0}'. Version validation failed: Key = '{1}', Version = '{2}' (expected version = '{3}').. - /// - internal static string LogSessionXVersionValidationFailedKeyYVersionZExpected3 { - get { - return ResourceManager.GetString("LogSessionXVersionValidationFailedKeyYVersionZExpected3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Skipping entity '{0}' as it does not belong to any hierarchy thus it cannot be persistent.. - /// - internal static string LogSkippingEntityXAsItDoesNotBelongToAnyHierarchyThusItCannotBePersistent { - get { - return ResourceManager.GetString("LogSkippingEntityXAsItDoesNotBelongToAnyHierarchyThusItCannotBePersistent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Skipping schema synchronization.. - /// - internal static string LogSkippingSchemaSynchronization { - get { - return ResourceManager.GetString("LogSkippingSchemaSynchronization", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specification of type column for fulltext column is not supported by current storage. Ignoring type column specification for column '{0}'.. - /// - internal static string LogSpecificationOfTypeColumnForFulltextColumnIsNotSupportedByCurrentStorageIgnoringTypeColumnSpecificationForColumnX { - get { - return ResourceManager.GetString("LogSpecificationOfTypeColumnForFulltextColumnIsNotSupportedByCurrentStorageIgnori" + - "ngTypeColumnSpecificationForColumnX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage '{0}' does not support partial indexes, ignoring filter for partial index '{0}'.. - /// - internal static string LogStorageXDoesNotSupportPartialIndexesIgnoringFilterForPartialIndexY { - get { - return ResourceManager.GetString("LogStorageXDoesNotSupportPartialIndexesIgnoringFilterForPartialIndexY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SyncContext must have no pending actions at this point.. - /// - internal static string LogSyncContextMustHaveNoPendingActions { - get { - return ResourceManager.GetString("LogSyncContextMustHaveNoPendingActions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Synchronizing schema in {0} mode. - /// - internal static string LogSynchronizingSchemaInXMode { - get { - return ResourceManager.GetString("LogSynchronizingSchemaInXMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Target schema:. - /// - internal static string LogTargetSchema { - get { - return ResourceManager.GetString("LogTargetSchema", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to close single available connection: it is still used by session '{0}'.. - /// - internal static string LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX { - get { - return ResourceManager.GetString("LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to get default hasher for type {0}. - /// - internal static string LogUnableToGetDefaultHasherForTypeXxx { - get { - return ResourceManager.GetString("LogUnableToGetDefaultHasherForTypeXxx", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to get default SQL comparer for type {0}.. - /// - internal static string LogUnableToGetDefaultNodeComparerForTypeXxx { - get { - return ResourceManager.GetString("LogUnableToGetDefaultNodeComparerForTypeXxx", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error during Undo execution: descriptor {0}.. - /// - internal static string LogUndoError { - get { - return ResourceManager.GetString("LogUndoError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validating mapping configuration. - /// - internal static string LogValidatingMappingConfiguration { - get { - return ResourceManager.GetString("LogValidatingMappingConfiguration", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validation failed.. - /// - internal static string LogValidationFailed { - get { - return ResourceManager.GetString("LogValidationFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 'Max' or 'Min' property should be specified.. - /// - internal static string MaxOrMinPropertyShouldBeSpecified { - get { - return ResourceManager.GetString("MaxOrMinPropertyShouldBeSpecified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to member access sequence contains non-persistent fields. - /// - internal static string MemberAccessSequenceContainsNonPersistentFields { - get { - return ResourceManager.GetString("MemberAccessSequenceContainsNonPersistentFields", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} (Version={1}). - /// - internal static string MetadataAssemblyFormat { - get { - return ResourceManager.GetString("MetadataAssemblyFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} (Id={1}). - /// - internal static string MetadataTypeFormat { - get { - return ResourceManager.GetString("MetadataTypeFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Model. - /// - internal static string Model { - get { - return ResourceManager.GetString("Model", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Model Definition. - /// - internal static string ModelDefinition { - get { - return ResourceManager.GetString("ModelDefinition", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to n/a. - /// - internal static string NA { - get { - return ResourceManager.GetString("NA", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Native type. - /// - internal static string NativeType { - get { - return ResourceManager.GetString("NativeType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}.{1}. - /// - internal static string NodeCollectionFullNameFormat { - get { - return ResourceManager.GetString("NodeCollectionFullNameFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} ({1}). - /// - internal static string NodeFormat { - get { - return ResourceManager.GetString("NodeFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} ({1}). - /// - internal static string NodeInfoFormat { - get { - return ResourceManager.GetString("NodeInfoFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to n/a. - /// - internal static string NotAvailable { - get { - return ResourceManager.GetString("NotAvailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to null. - /// - internal static string Null { - get { - return ResourceManager.GetString("Null", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ?. - /// - internal static string NullableMark { - get { - return ResourceManager.GetString("NullableMark", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to only primitive and reference fields are supported. - /// - internal static string OnlyPrimitiveAndReferenceFieldsAreSupported { - get { - return ResourceManager.GetString("OnlyPrimitiveAndReferenceFieldsAreSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Operations. - /// - internal static string Operations { - get { - return ResourceManager.GetString("Operations", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Original exception(s). - /// - internal static string OriginalExceptions { - get { - return ResourceManager.GetString("OriginalExceptions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Original message '{0}'. - /// - internal static string OriginalMessageX { - get { - return ResourceManager.GetString("OriginalMessageX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ({0}, {1}). - /// - internal static string PairFormat { - get { - return ResourceManager.GetString("PairFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to parameters of type other than '{0}' are not supported. - /// - internal static string ParametersOfTypeOtherThanXAreNotSupported { - get { - return ResourceManager.GetString("ParametersOfTypeOtherThanXAreNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to partial. - /// - internal static string Partial { - get { - return ResourceManager.GetString("Partial", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Precision. - /// - internal static string Precision { - get { - return ResourceManager.GetString("Precision", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to +{0}: {1}. - /// - internal static string PropertyChangeFormat { - get { - return ResourceManager.GetString("PropertyChangeFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: {1}. - /// - internal static string PropertyPairFormat { - get { - return ResourceManager.GetString("PropertyPairFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: value can not be empty.. - /// - internal static string PropertyValueCanNotBeEmpty { - get { - return ResourceManager.GetString("PropertyValueCanNotBeEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: value can not be null.. - /// - internal static string PropertyValueCanNotBeNull { - get { - return ResourceManager.GetString("PropertyValueCanNotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: length of the value must be in [{1} ... {2}] range.. - /// - internal static string PropertyValueLengthMustBeInXYRange { - get { - return ResourceManager.GetString("PropertyValueLengthMustBeInXYRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: value must be in [{1} ... {2}] range.. - /// - internal static string PropertyValueMustBeInXYRange { - get { - return ResourceManager.GetString("PropertyValueMustBeInXYRange", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Query '{0}'. - /// - internal static string QueryX { - get { - return ResourceManager.GetString("QueryX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to read-only. - /// - internal static string ReadOnly { - get { - return ResourceManager.GetString("ReadOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to r/o. - /// - internal static string ReadOnlyShort { - get { - return ResourceManager.GetString("ReadOnlyShort", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to read-write. - /// - internal static string ReadWrite { - get { - return ResourceManager.GetString("ReadWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to r/w. - /// - internal static string ReadWriteShort { - get { - return ResourceManager.GetString("ReadWriteShort", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to recursive. - /// - internal static string Recursive { - get { - return ResourceManager.GetString("Recursive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to #({0}). - /// - internal static string ReferenceFormat { - get { - return ResourceManager.GetString("ReferenceFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Referential integrity violation on attempt to remove '{0}', Key='{1}'. - ///Association: {2} - ///Referencing Entity Key: {3} - ///Referenced Entity Key: {4}. - /// - internal static string ReferentialIntegrityViolationOnAttemptToRemoveXKeyY { - get { - return ResourceManager.GetString("ReferentialIntegrityViolationOnAttemptToRemoveXKeyY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ref<{0}>({1}). - /// - internal static string RefFormat { - get { - return ResourceManager.GetString("RefFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Regular expression pattern is not specified.. - /// - internal static string RegularExpressionPatternIsNotSpecified { - get { - return ResourceManager.GetString("RegularExpressionPatternIsNotSpecified", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {6:s} @{1,-5} {2,5} {3,-24} {4}{5}. - /// - internal static string ReleaseLogFormat { - get { - return ResourceManager.GetString("ReleaseLogFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reversed({0}). - /// - internal static string ReversedFormat { - get { - return ResourceManager.GetString("ReversedFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to RowNumber{0}. - /// - internal static string RowNumberX { - get { - return ResourceManager.GetString("RowNumberX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scale. - /// - internal static string Scale { - get { - return ResourceManager.GetString("Scale", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Schema comparison result: {0} - ///Has unsafe actions: {1} - ///Has column type changes: {2} - ///Compatible in ValidateLegacy mode: {3} - /// - ///Unsafe actions: - ///{4} - ///Schema hints: - ///{5} - ///Schema difference: - ///{6}. - /// - internal static string SchemaComparisonResultFormat { - get { - return ResourceManager.GetString("SchemaComparisonResultFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [{0} ... {1}]. - /// - internal static string SegmentFormat { - get { - return ResourceManager.GetString("SegmentFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type='{0}', #='{1}' ({2}). - /// - internal static string SerializationDataFormat { - get { - return ResourceManager.GetString("SerializationDataFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {3}: {5}. - /// - internal static string SimpleLogFormat { - get { - return ResourceManager.GetString("SimpleLogFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SQL error details '{0}'. - /// - internal static string SqlErrorDetailsX { - get { - return ResourceManager.GetString("SqlErrorDetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SQL error occured.. - /// - internal static string SqlErrorOccured { - get { - return ResourceManager.GetString("SqlErrorOccured", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Storage error details '{0}'. - /// - internal static string StorageErrorDetailsX { - get { - return ResourceManager.GetString("StorageErrorDetailsX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Subquery '{0}' header must have only one column.. - /// - internal static string SubqueryXHeaderMustHaveOnlyOneColumn { - get { - return ResourceManager.GetString("SubqueryXHeaderMustHaveOnlyOneColumn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to system types. - /// - internal static string SystemTypes { - get { - return ResourceManager.GetString("SystemTypes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Table: {0};. - /// - internal static string TableX { - get { - return ResourceManager.GetString("TableX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ThreadSafeCached({0}). - /// - internal static string ThreadSafeCachedFormat { - get { - return ResourceManager.GetString("ThreadSafeCachedFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: {1} of ({2}). - /// - internal static string TransformedTupleFormat { - get { - return ResourceManager.GetString("TransformedTupleFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ({0}, {1}, {2}). - /// - internal static string TripletFormat { - get { - return ResourceManager.GetString("TripletFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TupleDescriptor({0}). - /// - internal static string TupleDescriptorFormat { - get { - return ResourceManager.GetString("TupleDescriptorFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ({0}). - /// - internal static string TupleFormat { - get { - return ResourceManager.GetString("TupleFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}({1}). - /// - internal static string TupleTransformFormat { - get { - return ResourceManager.GetString("TupleTransformFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type. - /// - internal static string Type { - get { - return ResourceManager.GetString("Type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TypeId for type {0} is already assigned.. - /// - internal static string TypeIdForTypeXIsAlreadyAssigned { - get { - return ResourceManager.GetString("TypeIdForTypeXIsAlreadyAssigned", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type ID range for database '{0}' ({1}, {2}) is exhausted. - /// - internal static string TypeIdRangeForDatabaseXYZIsExhausted { - get { - return ResourceManager.GetString("TypeIdRangeForDatabaseXYZIsExhausted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Types. - /// - internal static string Types { - get { - return ResourceManager.GetString("Types", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type: {0};. - /// - internal static string TypeX { - get { - return ResourceManager.GetString("TypeX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not implement '{1}.{2}' property.. - /// - internal static string TypeXDoesNotImplementYZField { - get { - return ResourceManager.GetString("TypeXDoesNotImplementYZField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' does not participate in the specified association.. - /// - internal static string TypeXDoesNotParticipateInTheSpecifiedAssociation { - get { - return ResourceManager.GetString("TypeXDoesNotParticipateInTheSpecifiedAssociation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not an '{1}' descendant.. - /// - internal static string TypeXIsNotAnYDescendant { - get { - return ResourceManager.GetString("TypeXIsNotAnYDescendant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not registered.. - /// - internal static string TypeXIsNotRegistered { - get { - return ResourceManager.GetString("TypeXIsNotRegistered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not supported '{1}' node.. - /// - internal static string TypeXIsNotSupportedYNode { - get { - return ResourceManager.GetString("TypeXIsNotSupportedYNode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to dispose an item when disposable container has an invalid state.. - /// - internal static string UnableToDisposeItemWhenContainerIsNotDisposed { - get { - return ResourceManager.GetString("UnableToDisposeItemWhenContainerIsNotDisposed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find column '{0}' of type '{1}' of current model.. - /// - internal static string UnableToFindColumnXInTypeYOfCurrentModel { - get { - return ResourceManager.GetString("UnableToFindColumnXInTypeYOfCurrentModel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to invalidate session state: newly created entities are attached to session.. - /// - internal static string UnableToInvalidateSessionStateNewlyCreatedEntitiesAreAttachedToSession { - get { - return ResourceManager.GetString("UnableToInvalidateSessionStateNewlyCreatedEntitiesAreAttachedToSession", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to unknown. - /// - internal static string Unknown { - get { - return ResourceManager.GetString("Unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <Unnamed>. - /// - internal static string UnnamedNodeDisplayName { - get { - return ResourceManager.GetString("UnnamedNodeDisplayName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Upgrade sequence. - /// - internal static string UpgradeSequence { - get { - return ResourceManager.GetString("UpgradeSequence", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Validators. - /// - internal static string Validators { - get { - return ResourceManager.GetString("Validators", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value can not be less then {0}.. - /// - internal static string ValueCanNotBeLessThenX { - get { - return ResourceManager.GetString("ValueCanNotBeLessThenX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value can not be null.. - /// - internal static string ValueCanNotBeNull { - get { - return ResourceManager.GetString("ValueCanNotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value can not be an entity that is already removed.. - /// - internal static string ValueCanNotBeRemovedEntity { - get { - return ResourceManager.GetString("ValueCanNotBeRemovedEntity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value does not match regex pattern '{0}'.. - /// - internal static string ValueDoesNotMatchRegexPatternX { - get { - return ResourceManager.GetString("ValueDoesNotMatchRegexPatternX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value length can not be greater than {0}.. - /// - internal static string ValueLengthCanNotBeGreaterThanX { - get { - return ResourceManager.GetString("ValueLengthCanNotBeGreaterThanX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value length can not be less than {0}.. - /// - internal static string ValueLengthCanNotBeLessThanX { - get { - return ResourceManager.GetString("ValueLengthCanNotBeLessThanX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value length can not be less than {0} or greater than {1}.. - /// - internal static string ValueLengthCanNotBeLessThanXOrGreaterThanY { - get { - return ResourceManager.GetString("ValueLengthCanNotBeLessThanXOrGreaterThanY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value can not exceed {0}.. - /// - internal static string ValueLengthCanNotExceedX { - get { - return ResourceManager.GetString("ValueLengthCanNotExceedX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should be a valid e-mail.. - /// - internal static string ValueShouldBeAValidEMail { - get { - return ResourceManager.GetString("ValueShouldBeAValidEMail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should be in the future.. - /// - internal static string ValueShouldBeInTheFuture { - get { - return ResourceManager.GetString("ValueShouldBeInTheFuture", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should be in the past.. - /// - internal static string ValueShouldBeInThePast { - get { - return ResourceManager.GetString("ValueShouldBeInThePast", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should match regex pattern '{0}'. - /// - internal static string ValueShouldMatchRegexPatternX { - get { - return ResourceManager.GetString("ValueShouldMatchRegexPatternX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be empty.. - /// - internal static string ValueShouldNotBeEmpty { - get { - return ResourceManager.GetString("ValueShouldNotBeEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be null or empty.. - /// - internal static string ValueShouldNotBeEmptyOrEmpty { - get { - return ResourceManager.GetString("ValueShouldNotBeEmptyOrEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be greater than {0}.. - /// - internal static string ValueShouldNotBeGreaterThanMax { - get { - return ResourceManager.GetString("ValueShouldNotBeGreaterThanMax", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be less than {0}.. - /// - internal static string ValueShouldNotBeLessThanMin { - get { - return ResourceManager.GetString("ValueShouldNotBeLessThanMin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be less than {0} or greater than {1}.. - /// - internal static string ValueShouldNotBeLessThanMinOrGreaterThanMax { - get { - return ResourceManager.GetString("ValueShouldNotBeLessThanMinOrGreaterThanMax", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value should not be null.. - /// - internal static string ValueShouldNotBeNull { - get { - return ResourceManager.GetString("ValueShouldNotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value type mismatch for field '{0}'. - /// - internal static string ValueTypeMismatchForFieldX { - get { - return ResourceManager.GetString("ValueTypeMismatchForFieldX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value: {0};. - /// - internal static string ValueX { - get { - return ResourceManager.GetString("ValueX", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version field '{0}' can't be TypeId field.. - /// - internal static string VersionFieldXCanTBeTypeIdField { - get { - return ResourceManager.GetString("VersionFieldXCanTBeTypeIdField", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}. - /// - internal static string X { - get { - return ResourceManager.GetString("X", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} in {1}. - /// - internal static string XInY { - get { - return ResourceManager.GetString("XInY", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not applicable to '{1}' descendants.. - /// - internal static string XIsNotApplicableToYDescendants { - get { - return ResourceManager.GetString("XIsNotApplicableToYDescendants", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}. - /// - internal static string XW0001 { - get { - return ResourceManager.GetString("XW0001", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <none>. - /// - internal static string ZeroAssemblyVersion { - get { - return ResourceManager.GetString("ZeroAssemblyVersion", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Xtensive { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Xtensive.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Culture. + /// + internal static string _Culture { + get { + return ResourceManager.GetString("_Culture", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual Model. + /// + internal static string ActualModel { + get { + return ResourceManager.GetString("ActualModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual target model. + /// + internal static string ActualTargetModel { + get { + return ResourceManager.GetString("ActualTargetModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to *. + /// + internal static string AnyCulture { + get { + return ResourceManager.GetString("AnyCulture", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Applying rule '{0}' to '{1}'. + /// + internal static string ApplyingRuleXToY { + get { + return ResourceManager.GetString("ApplyingRuleXToY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Applying [{0}] to property '{1}' failed. {2}. + /// + internal static string AspectExApplyingXToPropertyYFailedZ { + get { + return ResourceManager.GetString("AspectExApplyingXToPropertyYFailedZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both localizable message resource and not localizable message can not be specified at once (location: {0}).. + /// + internal static string AspectExBothLocalizableMessageResourceAndNotLocalizableMessageCanNotBeSpecifiedAtOnceLocationX { + get { + return ResourceManager.GetString("AspectExBothLocalizableMessageResourceAndNotLocalizableMessageCanNotBeSpecifiedAt" + + "OnceLocationX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field constraint can not be applied to read only property {0}.. + /// + internal static string AspectExFieldConstraintCanNotBeAppliedToReadOnlyPropertyX { + get { + return ResourceManager.GetString("AspectExFieldConstraintCanNotBeAppliedToReadOnlyPropertyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: multiple attributes of type '{1}' are not allowed here.. + /// + internal static string AspectExMultipleAttributesOfTypeXAreNotAllowedHere { + get { + return ResourceManager.GetString("AspectExMultipleAttributesOfTypeXAreNotAllowedHere", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [{0}] attribute on '{1}' requires a comparer for type '{2}'.. + /// + internal static string AspectExNoComparer { + get { + return ResourceManager.GetString("AspectExNoComparer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' and '{1}' properties must be used together (location: {2}).. + /// + internal static string AspectExXAndYPropertiesMustBeUsedTogetherLocationZ { + get { + return ResourceManager.GetString("AspectExXAndYPropertiesMustBeUsedTogetherLocationZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' does not support '{1}' value type (location: {2}).. + /// + internal static string AspectExXDoesNotSupportYValueTypeLocationZ { + get { + return ResourceManager.GetString("AspectExXDoesNotSupportYValueTypeLocationZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Associations. + /// + internal static string Associations { + get { + return ResourceManager.GetString("Associations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Box({0}). + /// + internal static string BoxFormat { + get { + return ResourceManager.GetString("BoxFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cached({0}). + /// + internal static string CachedFormat { + get { + return ResourceManager.GetString("CachedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't access member '{0}'. + /// + internal static string CantAccessMemberX { + get { + return ResourceManager.GetString("CantAccessMemberX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (can't change type of column '{0}'). + /// + internal static string CantChangeTypeOfColumnX { + get { + return ResourceManager.GetString("CantChangeTypeOfColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (can't remove column '{0}'). + /// + internal static string CantRemoveColumnX { + get { + return ResourceManager.GetString("CantRemoveColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (can't remove table '{0}'). + /// + internal static string CantRemoveTableX { + get { + return ResourceManager.GetString("CantRemoveTableX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Columns. + /// + internal static string Columns { + get { + return ResourceManager.GetString("Columns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column: {0};. + /// + internal static string ColumnX { + get { + return ResourceManager.GetString("ColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string Comma { + get { + return ResourceManager.GetString("Comma", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ComparisonRule({0}, {1}). + /// + internal static string ComparisonRuleFormat { + get { + return ResourceManager.GetString("ComparisonRuleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ComparisonRules({0}, [{1}]). + /// + internal static string ComparisonRulesFormat { + get { + return ResourceManager.GetString("ComparisonRulesFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0,6:F2}s @{1,-5} {2,5} {3,-24} {4}{5}. + /// + internal static string ComprehensiveLogFormat { + get { + return ResourceManager.GetString("ComprehensiveLogFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Constraint: {0};. + /// + internal static string ConstraintX { + get { + return ResourceManager.GetString("ConstraintX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Definitions. + /// + internal static string CustomDefinitions { + get { + return ResourceManager.GetString("CustomDefinitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database: {0};. + /// + internal static string DatabaseX { + get { + return ResourceManager.GetString("DatabaseX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date must be in the past.. + /// + internal static string DateMustBeInThePast { + get { + return ResourceManager.GetString("DateMustBeInThePast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Difference. + /// + internal static string Difference { + get { + return ResourceManager.GetString("Difference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to "{1}" != "{2}" ({0}): {3}. + /// + internal static string DifferenceFormat { + get { + return ResourceManager.GetString("DifferenceFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to +{0}: . + /// + internal static string DifferencePropertyNamePrefix { + get { + return ResourceManager.GetString("DifferencePropertyNamePrefix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ''. + /// + internal static string EmptyString { + get { + return ResourceManager.GetString("EmptyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entire({0}). + /// + internal static string EntireFormat { + get { + return ResourceManager.GetString("EntireFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key = '{0}', Tuple = {1}, State = {2}. + /// + internal static string EntityStateFormat { + get { + return ResourceManager.GetString("EntityStateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity with Key = '{0}' does not exist.. + /// + internal static string EntityWithKeyXDoesNotExist { + get { + return ResourceManager.GetString("EntityWithKeyXDoesNotExist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity: {0};. + /// + internal static string EntityX { + get { + return ResourceManager.GetString("EntityX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The accessed member is not a property.. + /// + internal static string ExAccessedMemberIsNotProperty { + get { + return ResourceManager.GetString("ExAccessedMemberIsNotProperty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The access to a type's member can not be extracted from the specified expression.. + /// + internal static string ExAccessToTypeMemberCanNotBeExtractedFromSpecifiedExpression { + get { + return ResourceManager.GetString("ExAccessToTypeMemberCanNotBeExtractedFromSpecifiedExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active serialization context is not found.. + /// + internal static string ExActiveSerializationContextIsNotFound { + get { + return ResourceManager.GetString("ExActiveSerializationContextIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active Session is required for this operation. Use Session.Open(...) to open it.. + /// + internal static string ExActiveSessionIsRequiredForThisOperation { + get { + return ResourceManager.GetString("ExActiveSessionIsRequiredForThisOperation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active Transaction is required for this operation. Use Session.OpenTransaction(...) to open it.. + /// + internal static string ExActiveTransactionIsRequiredForThisOperationUseSessionOpenTransactionToOpenIt { + get { + return ResourceManager.GetString("ExActiveTransactionIsRequiredForThisOperationUseSessionOpenTransactionToOpenIt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual conjunction operand count greater than MaxConjunctionOperandCount.. + /// + internal static string ExActualConjunctionOperandCountGreaterThanExpected { + get { + return ResourceManager.GetString("ExActualConjunctionOperandCountGreaterThanExpected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual schema version of assembly '{0}' is expected to be '{1}', but currently it is '{2}'.. + /// + internal static string ExActualSchemaVersionOfAssemblyXIsExpectedToBeYButCurrentlyItIsZ { + get { + return ResourceManager.GetString("ExActualSchemaVersionOfAssemblyXIsExpectedToBeYButCurrentlyItIsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' expression. Aggregate method '{1} is not supported.. + /// + internal static string ExAggregateMethodXIsNotSupported { + get { + return ResourceManager.GetString("ExAggregateMethodXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' expression. Aggregates for non primitive types are not supported.. + /// + internal static string ExAggregatesForNonPrimitiveTypesAreNotSupported { + get { + return ResourceManager.GetString("ExAggregatesForNonPrimitiveTypesAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aggregate '{0}' is not supported for type '{1}'. + /// + internal static string ExAggregateXIsNotSupportedForTypeY { + get { + return ResourceManager.GetString("ExAggregateXIsNotSupportedForTypeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'All' method is only supported for root expressions or subqueries.. + /// + internal static string ExAllMethodIsOnlySupportedForRootExpressionsOrSubqueries { + get { + return ResourceManager.GetString("ExAllMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UndoDescriptor is already completed.. + /// + internal static string ExAlreadyCompleted { + get { + return ResourceManager.GetString("ExAlreadyCompleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object is already disposed.. + /// + internal static string ExAlreadyDisposed { + get { + return ResourceManager.GetString("ExAlreadyDisposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance is already initialized.. + /// + internal static string ExAlreadyInitialized { + get { + return ResourceManager.GetString("ExAlreadyInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Any' method is only supported for root expressions or subqueries.. + /// + internal static string ExAnyMethodIsOnlySupportedForRootExpressionsOrSubqueries { + get { + return ResourceManager.GetString("ExAnyMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument can't be an empty string.. + /// + internal static string ExArgumentCannotBeEmptyString { + get { + return ResourceManager.GetString("ExArgumentCannotBeEmptyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument cannot be white spaces only string.. + /// + internal static string ExArgumentCannotBeWhiteSpacesOnlyString { + get { + return ResourceManager.GetString("ExArgumentCannotBeWhiteSpacesOnlyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument must be greater than '{0}'. + /// + internal static string ExArgumentMustBeGreaterThanX { + get { + return ResourceManager.GetString("ExArgumentMustBeGreaterThanX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument must be greater that or equal '{0}'. + /// + internal static string ExArgumentMustBeGreaterThatOrEqualX { + get { + return ResourceManager.GetString("ExArgumentMustBeGreaterThatOrEqualX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument must be less than or equal '{0}'. + /// + internal static string ExArgumentMustBeLessThanOrEqualX { + get { + return ResourceManager.GetString("ExArgumentMustBeLessThanOrEqualX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument must be less than '{0}'. + /// + internal static string ExArgumentMustBeLessThanX { + get { + return ResourceManager.GetString("ExArgumentMustBeLessThanX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The argument must not be of type '{0}'.. + /// + internal static string ExArgumentMustnotBeOfTypeX { + get { + return ResourceManager.GetString("ExArgumentMustnotBeOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument should be in range [{0}...{1}].. + /// + internal static string ExArgumentShouldBeInRange { + get { + return ResourceManager.GetString("ExArgumentShouldBeInRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument value must be greater than or equal to zero.. + /// + internal static string ExArgumentValueMustBeGreaterThanOrEqualToZero { + get { + return ResourceManager.GetString("ExArgumentValueMustBeGreaterThanOrEqualToZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Argument value must be greater than zero.. + /// + internal static string ExArgumentValueMustBeGreaterThanZero { + get { + return ResourceManager.GetString("ExArgumentValueMustBeGreaterThanZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The argument '{0}' is less than the argument '{1}'.. + /// + internal static string ExArgumentXIsLessThanArgumentY { + get { + return ResourceManager.GetString("ExArgumentXIsLessThanArgumentY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Array does not have zero-based indexing.. + /// + internal static string ExArrayDoesNotHaveZeroBasedIndexing { + get { + return ResourceManager.GetString("ExArrayDoesNotHaveZeroBasedIndexing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Array is multidimentional.. + /// + internal static string ExArrayIsMultidimensional { + get { + return ResourceManager.GetString("ExArrayIsMultidimensional", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A set of exceptions is caught.. + /// + internal static string ExASetOfExceptionsIsCaught { + get { + return ResourceManager.GetString("ExASetOfExceptionsIsCaught", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'as' operator supports casting only inside Entity hierarchy.. + /// + internal static string ExAsOperatorSupportsEntityOnly { + get { + return ResourceManager.GetString("ExAsOperatorSupportsEntityOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Assembly version mismatch: main assembly '{0} {1}', extension assembly '{2} {3}'.. + /// + internal static string ExAssemblyVersionMismatchMainAssemblyXYExtensionsAssemblyAB { + get { + return ResourceManager.GetString("ExAssemblyVersionMismatchMainAssemblyXYExtensionsAssemblyAB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'AssociationAttribute' can't be applied to '{0}' field.. + /// + internal static string ExAssociationAttributeCanNotBeAppliedToXField { + get { + return ResourceManager.GetString("ExAssociationAttributeCanNotBeAppliedToXField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Association multiplicity '{0}' is not valid for field '{1}'.. + /// + internal static string ExAssociationMultiplicityIsNotValidForField { + get { + return ResourceManager.GetString("ExAssociationMultiplicityIsNotValidForField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least one column index pair must be specified.. + /// + internal static string ExAtLeastOneColumnIndexPairMustBeSpecified { + get { + return ResourceManager.GetString("ExAtLeastOneColumnIndexPairMustBeSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least one loop have been found in persistent type dependencies graph. Suspicious types: {0}. + /// + internal static string ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX { + get { + return ResourceManager.GetString("ExAtLeastOneLoopHaveBeenFoundInPersistentTypeDependenciesGraphSuspiciousTypesX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AtomicContext is suspended.. + /// + internal static string ExAtomicContextIsSuspended { + get { + return ResourceManager.GetString("ExAtomicContextIsSuspended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An attempt to automatically activate Session '{0}' inside Session '{1}' (Session switching) is blocked. + ///Most likely, mixed usage of objects from different Sessions is a result of a bug in your code. + ///Use manual Session activation (Session.Deactivate(), Session.Activate()) or + ///SessionOptions.AllowSwitching flag to avoid this exception, if this is intentional.. + /// + internal static string ExAttemptToAutomaticallyActivateSessionXInsideSessionYIsBlocked { + get { + return ResourceManager.GetString("ExAttemptToAutomaticallyActivateSessionXInsideSessionYIsBlocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to BatchingCommandProcessor does not support validation of number of affected rows.. + /// + internal static string ExBatchingCommandProcessorDoesNotSupportValidationOfNumberOfAffectedRows { + get { + return ResourceManager.GetString("ExBatchingCommandProcessorDoesNotSupportValidationOfNumberOfAffectedRows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Binary expressions with NodeType = 'ExpressionType.{0}' aren't supported.. + /// + internal static string ExBinaryExpressionsWithNodeTypeXAreNotSupported { + get { + return ResourceManager.GetString("ExBinaryExpressionsWithNodeTypeXAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Binary expression '{0}' of type '{1}' is not supported.. + /// + internal static string ExBinaryExpressionXOfTypeXIsNotSupported { + get { + return ResourceManager.GetString("ExBinaryExpressionXOfTypeXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Binding has failed for {0}. Check property declaration.. + /// + internal static string ExBindingFailedForX { + get { + return ResourceManager.GetString("ExBindingFailedForX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not EntityExpression(EntityFieldExpression).. + /// + internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotEntityExpressionEntityFieldExpression { + get { + return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotEntityExpressionEntityFieldE" + + "xpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not KeyExpression.. + /// + internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotKeyExpression { + get { + return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotKeyExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both left and right part of binary expression '{0}' are NULL or not StructureExpression.. + /// + internal static string ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotStructureExpression { + get { + return ResourceManager.GetString("ExBothLeftAndRightPartOfBinaryExpressionXAreNULLOrNotStructureExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both measurements have no value.. + /// + internal static string ExBothMeasurementsHaveNoValue { + get { + return ResourceManager.GetString("ExBothMeasurementsHaveNoValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both parts of binary expression '{0}' are of the different type. Use type cast.. + /// + internal static string ExBothPartsOfBinaryExpressionXAreOfTheDifferentType { + get { + return ResourceManager.GetString("ExBothPartsOfBinaryExpressionXAreOfTheDifferentType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both Source and Target are null.. + /// + internal static string ExBothSourceAndTargetAreNull { + get { + return ResourceManager.GetString("ExBothSourceAndTargetAreNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't activate service '{0}'. Error: {1}. + /// + internal static string ExCannotActivateServiceXErrorY { + get { + return ResourceManager.GetString("ExCannotActivateServiceXErrorY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't activate service '{0}' with name "{1}". Error: {2}. + /// + internal static string ExCannotActivateServiceXWithKeyYErrorZ { + get { + return ResourceManager.GetString("ExCannotActivateServiceXWithKeyYErrorZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attempt to associate non-empty EntityState with Key of unknown type.. + /// + internal static string ExCannotAssociateNonEmptyEntityStateWithKeyOfUnknownType { + get { + return ResourceManager.GetString("ExCannotAssociateNonEmptyEntityStateWithKeyOfUnknownType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not commit a transaction. Entities validation failed.. + /// + internal static string ExCanNotCommitATransactionEntitiesValidationFailed { + get { + return ResourceManager.GetString("ExCanNotCommitATransactionEntitiesValidationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not commit a transaction: ValidationContext is in inconsistent state.. + /// + internal static string ExCanNotCommitATransactionValidationContextIsInInconsistentState { + get { + return ResourceManager.GetString("ExCanNotCommitATransactionValidationContextIsInInconsistentState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not commit a transaction. Validation context is in invalid state.. + /// + internal static string ExCanNotCommitATransactionValidationContextIsInInvalidState { + get { + return ResourceManager.GetString("ExCanNotCommitATransactionValidationContextIsInInvalidState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't compile - active CompilationContext has no Compiler (Compiler is null).. + /// + internal static string ExCanNotCompileNoCompiler { + get { + return ResourceManager.GetString("ExCanNotCompileNoCompiler", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't compile - no active EnumerationContext exists.. + /// + internal static string ExCanNotCompileNoEnumerationContext { + get { + return ResourceManager.GetString("ExCanNotCompileNoEnumerationContext", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not complete outer transaction: inner transaction is active.. + /// + internal static string ExCanNotCompleteOuterTransactionInnerTransactionIsActive { + get { + return ResourceManager.GetString("ExCanNotCompleteOuterTransactionInnerTransactionIsActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't extract foreign key.. + /// + internal static string ExCanNotExtractForeignKey { + get { + return ResourceManager.GetString("ExCanNotExtractForeignKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't find a constructor to execute {0}.. + /// + internal static string ExCannotFindConstructorToExecuteX { + get { + return ResourceManager.GetString("ExCannotFindConstructorToExecuteX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find a handler of type '{0}'.. + /// + internal static string ExCannotFindHandlerOfTypeX { + get { + return ResourceManager.GetString("ExCannotFindHandlerOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not find reference to column "{0}".. + /// + internal static string ExCanNotFindReferenceToColumnX { + get { + return ResourceManager.GetString("ExCanNotFindReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't generate next version value of type '{0}'.. + /// + internal static string ExCannotGenerateNextVersionValueOfTypeX { + get { + return ResourceManager.GetString("ExCannotGenerateNextVersionValueOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not get validation context: there is no active transaction.. + /// + internal static string ExCanNotGetValidationContextThereIsNoActiveTransaction { + get { + return ResourceManager.GetString("ExCanNotGetValidationContextThereIsNoActiveTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not mark state as modified: it is not valid in current transaction.. + /// + internal static string ExCanNotMarkStateAsModifiedItIsNotValidInCurrentTransaction { + get { + return ResourceManager.GetString("ExCanNotMarkStateAsModifiedItIsNotValidInCurrentTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't merge the state.. + /// + internal static string ExCanNotMergeTheState { + get { + return ResourceManager.GetString("ExCanNotMergeTheState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not open more than one inner transaction.. + /// + internal static string ExCanNotOpenMoreThanOneInnerTransaction { + get { + return ResourceManager.GetString("ExCanNotOpenMoreThanOneInnerTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not open a transaction: there is no current Session.. + /// + internal static string ExCanNotOpenTransactionNoCurrentSession { + get { + return ResourceManager.GetString("ExCanNotOpenTransactionNoCurrentSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't parse the call to the comparison method.. + /// + internal static string ExCannotParseCallToComparisonMethod { + get { + return ResourceManager.GetString("ExCannotParseCallToComparisonMethod", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not persist: there are pinned entities.. + /// + internal static string ExCanNotPersistThereArePinnedEntities { + get { + return ResourceManager.GetString("ExCanNotPersistThereArePinnedEntities", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not read database and schema names. + /// + internal static string ExCanNotReadDatabaseAndSchemaNames { + get { + return ResourceManager.GetString("ExCanNotReadDatabaseAndSchemaNames", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot resolve entity with key '{0}'.. + /// + internal static string ExCannotResolveEntityWithKeyX { + get { + return ResourceManager.GetString("ExCannotResolveEntityWithKeyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can not reuse opened transaction: requested isolation level is different.. + /// + internal static string ExCanNotReuseOpenedTransactionRequestedIsolationLevelIsDifferent { + get { + return ResourceManager.GetString("ExCanNotReuseOpenedTransactionRequestedIsolationLevelIsDifferent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot upgrade schema safely. Details: + ///{0}. + /// + internal static string ExCanNotUpgradeSchemaSafely_DetailsX { + get { + return ResourceManager.GetString("ExCanNotUpgradeSchemaSafely_DetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot use default generator for complex (multicolumn) Keys.. + /// + internal static string ExCannotUseDefaultGeneratorForComplexKeys { + get { + return ResourceManager.GetString("ExCannotUseDefaultGeneratorForComplexKeys", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't access member of type 'EntitySet<>'.. + /// + internal static string ExCantAccessMemberOfTypeEntitySet { + get { + return ResourceManager.GetString("ExCantAccessMemberOfTypeEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't compile the provider '{0}'.. + /// + internal static string ExCantCompileProviderX { + get { + return ResourceManager.GetString("ExCantCompileProviderX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't convert the {0} to the {1}.. + /// + internal static string ExCantConvertXToY { + get { + return ResourceManager.GetString("ExCantConvertXToY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't create associates for generic type definitions (type '{0}').. + /// + internal static string ExCantCreateAssociateForGenericTypeDefinitions { + get { + return ResourceManager.GetString("ExCantCreateAssociateForGenericTypeDefinitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't find associated {0} of type '{1}' for type '{2}'.. + /// + internal static string ExCantFindAssociate { + get { + return ResourceManager.GetString("ExCantFindAssociate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't find associated {0} of type '{1}' for type '{2}' or '{3}'.. + /// + internal static string ExCantFindAssociate2 { + get { + return ResourceManager.GetString("ExCantFindAssociate2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blocking descriptor can't be invoked.. + /// + internal static string ExCantInvokeBlockingDescriptor { + get { + return ResourceManager.GetString("ExCantInvokeBlockingDescriptor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't merge state.. + /// + internal static string ExCantMergeState { + get { + return ResourceManager.GetString("ExCantMergeState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't open EnumerationScope, since there is no current CompilationContext.. + /// + internal static string ExCantOpenEnumerationScopeSinceThereIsNoCurrentCompilationContext { + get { + return ResourceManager.GetString("ExCantOpenEnumerationScopeSinceThereIsNoCurrentCompilationContext", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to InfinityType.None can't be passed to this constructor.. + /// + internal static string ExCantPassNoInfinityToThisConstructor { + get { + return ResourceManager.GetString("ExCantPassNoInfinityToThisConstructor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't register state.. + /// + internal static string ExCantRegisterState { + get { + return ResourceManager.GetString("ExCantRegisterState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ChainedBuffer.Remove() method is not supported.. + /// + internal static string ExChainedBufferRemoveMethodIsNotSupported { + get { + return ResourceManager.GetString("ExChainedBufferRemoveMethodIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Circular reference is detected.. + /// + internal static string ExCircularReferenceDetected { + get { + return ResourceManager.GetString("ExCircularReferenceDetected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clustered index can not be declared in interface '{0}'. + /// + internal static string ExClusteredIndexCanNotBeDeclaredInInterfaceX { + get { + return ResourceManager.GetString("ExClusteredIndexCanNotBeDeclaredInInterfaceX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection already contains item with the specified key.. + /// + internal static string ExCollectionAlreadyContainsItemWithSpecifiedKey { + get { + return ResourceManager.GetString("ExCollectionAlreadyContainsItemWithSpecifiedKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collecton already contains specified item.. + /// + internal static string ExCollectionAlreadyContainsSpecifiedItem { + get { + return ResourceManager.GetString("ExCollectionAlreadyContainsSpecifiedItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection cannot contain any neither null or empty string values.. + /// + internal static string ExCollectionCannotContainAnyNeitherNullOrEmptyStringValues { + get { + return ResourceManager.GetString("ExCollectionCannotContainAnyNeitherNullOrEmptyStringValues", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection has been changed during the enumeration.. + /// + internal static string ExCollectionHasBeenChanged { + get { + return ResourceManager.GetString("ExCollectionHasBeenChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection has been modified.. + /// + internal static string ExCollectionHasBeenModified { + get { + return ResourceManager.GetString("ExCollectionHasBeenModified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection is empty.. + /// + internal static string ExCollectionIsEmpty { + get { + return ResourceManager.GetString("ExCollectionIsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection is read-only.. + /// + internal static string ExCollectionIsReadOnly { + get { + return ResourceManager.GetString("ExCollectionIsReadOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item should be either an ICollection or ICountable.. + /// + internal static string ExCollectionOrCoutableExcpected { + get { + return ResourceManager.GetString("ExCollectionOrCoutableExcpected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The collection property {0} is bound to the property {1} that isn't collection.. + /// + internal static string ExCollectionPropertyXIsBoundToPropertyYThatIsNotCollection { + get { + return ResourceManager.GetString("ExCollectionPropertyXIsBoundToPropertyYThatIsNotCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collection should contain at least {0} elements.. + /// + internal static string ExCollectionShouldContainAtLeastXElements { + get { + return ResourceManager.GetString("ExCollectionShouldContainAtLeastXElements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column already has specified name.. + /// + internal static string ExColumnAlreadyHasSpecifiedName { + get { + return ResourceManager.GetString("ExColumnAlreadyHasSpecifiedName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column belongs to other table.. + /// + internal static string ExColumnBelongsToOtherTable { + get { + return ResourceManager.GetString("ExColumnBelongsToOtherTable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column group could not be found.. + /// + internal static string ExColumnGroupCouldNotBeFound { + get { + return ResourceManager.GetString("ExColumnGroupCouldNotBeFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value length {0} is greater than column length {1}.. + /// + internal static string ExColumnLength { + get { + return ResourceManager.GetString("ExColumnLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to assign null to non-nullable column.. + /// + internal static string ExColumnNotNullable { + get { + return ResourceManager.GetString("ExColumnNotNullable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Columns used by the CalculatedColumn's expression containing the ApplyParameter are removed.. + /// + internal static string ExColumnsUsedByCalculatedColumnExpressionContainingApplyParameterAreRemoved { + get { + return ResourceManager.GetString("ExColumnsUsedByCalculatedColumnExpressionContainingApplyParameterAreRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Columns used by the predicate containing ApplyParameter are removed.. + /// + internal static string ExColumnsUsedByPredicateContainingApplyParameterAreRemoved { + get { + return ResourceManager.GetString("ExColumnsUsedByPredicateContainingApplyParameterAreRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column "{0}" contains both key and value collections.. + /// + internal static string ExColumnXContainsBothKeyAndValueCollections { + get { + return ResourceManager.GetString("ExColumnXContainsBothKeyAndValueCollections", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column '{0}' is not found.. + /// + internal static string ExColumnXIsNotFound { + get { + return ResourceManager.GetString("ExColumnXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Column with name '{0}' is not found in table '{1}'.. + /// + internal static string ExColumnXIsNotFoundInTableY { + get { + return ResourceManager.GetString("ExColumnXIsNotFoundInTableY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Commands are already translated.. + /// + internal static string ExCommandsAreAlreadyTranslated { + get { + return ResourceManager.GetString("ExCommandsAreAlreadyTranslated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Comparer for type '{0}' is not available.. + /// + internal static string ExComparerForTypeIsNotAvailable { + get { + return ResourceManager.GetString("ExComparerForTypeIsNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [CompilerContainer] attribute isn't applied to type '{0}'.. + /// + internal static string ExCompilerContainerAttributeIsNotAppliedToTypeX { + get { + return ResourceManager.GetString("ExCompilerContainerAttributeIsNotAppliedToTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler for {0} is already registered.. + /// + internal static string ExCompilerForXIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExCompilerForXIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} has invalid target member.. + /// + internal static string ExCompilerXHasInvalidTargetMember { + get { + return ResourceManager.GetString("ExCompilerXHasInvalidTargetMember", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} has invalid target type: target type should be either non-generic or generic type definition.. + /// + internal static string ExCompilerXHasInvalidTargetType { + get { + return ResourceManager.GetString("ExCompilerXHasInvalidTargetType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} has too many parameters.. + /// + internal static string ExCompilerXHasTooManyParameters { + get { + return ResourceManager.GetString("ExCompilerXHasTooManyParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} should have first parameter of type MemberInfo. + /// + internal static string ExCompilerXShouldHaveMemberInfoParameter { + get { + return ResourceManager.GetString("ExCompilerXShouldHaveMemberInfoParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} should have parameter {1} of type {2}. + /// + internal static string ExCompilerXShouldHaveParameterYOfTypeZ { + get { + return ResourceManager.GetString("ExCompilerXShouldHaveParameterYOfTypeZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} should have "this" parameter.. + /// + internal static string ExCompilerXShouldHaveThisParameter { + get { + return ResourceManager.GetString("ExCompilerXShouldHaveThisParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compiler {0} should return {1}.. + /// + internal static string ExCompilerXShouldReturnY { + get { + return ResourceManager.GetString("ExCompilerXShouldReturnY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Complete method must be called just once.. + /// + internal static string ExCompleteMustBeCalledJustOnce { + get { + return ResourceManager.GetString("ExCompleteMustBeCalledJustOnce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Concurrency conflict.. + /// + internal static string ExConcurrencyConflict { + get { + return ResourceManager.GetString("ExConcurrencyConflict", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration for Domain with name '{0}' is not found in application configuration file (section '{1}').. + /// + internal static string ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile { + get { + return ResourceManager.GetString("ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Configuration with '{0}' name already registered.. + /// + internal static string ExConfigurationWithXNameAlreadyRegistered { + get { + return ResourceManager.GetString("ExConfigurationWithXNameAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ConnectionInfo is missing. If you are using configuration file you should specify either 'connectionUrl' element or 'connectionString' and 'provider' elements. + /// + internal static string ExConnectionInfoIsMissing { + get { + return ResourceManager.GetString("ExConnectionInfoIsMissing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'connectionString' element.. + /// + internal static string ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrConnectionStringElement { + get { + return ResourceManager.GetString("ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrConnectionStringEl" + + "ement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'provider' and 'connectionString' elements.. + /// + internal static string ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnectionStringElements { + get { + return ResourceManager.GetString("ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnect" + + "ionStringElements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection is not open.. + /// + internal static string ExConnectionIsNotOpen { + get { + return ResourceManager.GetString("ExConnectionIsNotOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection is required.. + /// + internal static string ExConnectionIsRequired { + get { + return ResourceManager.GetString("ExConnectionIsRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string with name '{0}' is not found.. + /// + internal static string ExConnectionStringWithNameXIsNotFound { + get { + return ResourceManager.GetString("ExConnectionStringWithNameXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection string with name '{0}' is null or empty.. + /// + internal static string ExConnectionStringWithNameXIsNullOrEmpty { + get { + return ResourceManager.GetString("ExConnectionStringWithNameXIsNullOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Constraint belongs to other domain.. + /// + internal static string ExConstraintBelongsToOtherDomain { + get { + return ResourceManager.GetString("ExConstraintBelongsToOtherDomain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Constraint belongs to other table.. + /// + internal static string ExConstraintBelongsToOtherTable { + get { + return ResourceManager.GetString("ExConstraintBelongsToOtherTable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Constraint violation: constraint {0} on field '{1}.{2}' of object '{3}' failed on value {4}.. + /// + internal static string ExConstraintViolation { + get { + return ResourceManager.GetString("ExConstraintViolation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Container type does not provide a suitable constructor.. + /// + internal static string ExContainerTypeDoesNotProvideASuitableConstructor { + get { + return ResourceManager.GetString("ExContainerTypeDoesNotProvideASuitableConstructor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Container type must implement {0}.. + /// + internal static string ExContainerTypeMustImplementX { + get { + return ResourceManager.GetString("ExContainerTypeMustImplementX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Contains' method is only supported for root expressions or subqueries.. + /// + internal static string ExContainsMethodIsOnlySupportedForRootExpressionsOrSubqueries { + get { + return ResourceManager.GetString("ExContainsMethodIsOnlySupportedForRootExpressionsOrSubqueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Context is not activated.. + /// + internal static string ExContextMustBeActivated { + get { + return ResourceManager.GetString("ExContextMustBeActivated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is required. Use {1} to set it.. + /// + internal static string ExContextRequired { + get { + return ResourceManager.GetString("ExContextRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Control character used as escape character. + /// + internal static string ExControlCharacterUsedAsEscapeCharacter { + get { + return ResourceManager.GetString("ExControlCharacterUsedAsEscapeCharacter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to copy a part of the stream to itself. Use StreamExtensions.Copy method instead.. + /// + internal static string ExCopyToMustOperateWithDifferentStreams { + get { + return ResourceManager.GetString("ExCopyToMustOperateWithDifferentStreams", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not construct new Key instance. Type '{0}' is not an entity.. + /// + internal static string ExCouldNotConstructNewKeyInstanceTypeXIsNotAnEntity { + get { + return ResourceManager.GetString("ExCouldNotConstructNewKeyInstanceTypeXIsNotAnEntity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find anonymous mapping for field '{0}'.. + /// + internal static string ExCouldNotFindAnonymousMappingForFieldX { + get { + return ResourceManager.GetString("ExCouldNotFindAnonymousMappingForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find entity mapping for field '{0}'.. + /// + internal static string ExCouldNotFindEntityMappingForFieldX { + get { + return ResourceManager.GetString("ExCouldNotFindEntityMappingForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find field segment for field '{0}'.. + /// + internal static string ExCouldNotFindFieldSegmentForFieldX { + get { + return ResourceManager.GetString("ExCouldNotFindFieldSegmentForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find grouping mapping for field '{0}'.. + /// + internal static string ExCouldNotFindGroupingMappingForFieldX { + get { + return ResourceManager.GetString("ExCouldNotFindGroupingMappingForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find subquery mapping for field '{0}'.. + /// + internal static string ExCouldNotFindSubqueryMappingForFieldX { + get { + return ResourceManager.GetString("ExCouldNotFindSubqueryMappingForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not get member {0} from expression.. + /// + internal static string ExCouldNotGetMemberXFromExpression { + get { + return ResourceManager.GetString("ExCouldNotGetMemberXFromExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not load types from the assembly '{0}'.. + /// + internal static string ExCouldNotLoadTypesFromAssembly { + get { + return ResourceManager.GetString("ExCouldNotLoadTypesFromAssembly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not resolve {0} '{1}' within the domain.. + /// + internal static string ExCouldNotResolveXYWithinDomain { + get { + return ResourceManager.GetString("ExCouldNotResolveXYWithinDomain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Culture of the applied rule should either be undefined (null), or be the same as on target rule.. + /// + internal static string ExCultureOfAppliedRuleShouldBeEitherNullOrTheSameAsOnTarget { + get { + return ResourceManager.GetString("ExCultureOfAppliedRuleShouldBeEitherNullOrTheSameAsOnTarget", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current compiler is not suitable for this operation, most likely there is no active Session.. + /// + internal static string ExCurrentCompilerIsNotSuitableForThisOperationMostLikelyThereIsNoActiveSession { + get { + return ResourceManager.GetString("ExCurrentCompilerIsNotSuitableForThisOperationMostLikelyThereIsNoActiveSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current provider does not support ContainsTable functionality.. + /// + internal static string ExCurrentProviderDoesNotSupportContainsTableFunctionality { + get { + return ResourceManager.GetString("ExCurrentProviderDoesNotSupportContainsTableFunctionality", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current session getter is already assigned.. + /// + internal static string ExCurrentSessionGetterIsAlreadyAssigned { + get { + return ResourceManager.GetString("ExCurrentSessionGetterIsAlreadyAssigned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current storage does not support changing column types. + /// + internal static string ExCurrentStorageDoesNotSupportChangingColumnTypes { + get { + return ResourceManager.GetString("ExCurrentStorageDoesNotSupportChangingColumnTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current storage provider does not support savepoints (nested transactions).. + /// + internal static string ExCurrentStorageProviderDoesNotSupportSavepoints { + get { + return ResourceManager.GetString("ExCurrentStorageProviderDoesNotSupportSavepoints", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current type of expression '{0}' is not supported.. + /// + internal static string ExCurrentTypeOfExpressionXIsNotSupported { + get { + return ResourceManager.GetString("ExCurrentTypeOfExpressionXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current type '{0}' is not supported.. + /// + internal static string ExCurrentTypeXIsNotSupported { + get { + return ResourceManager.GetString("ExCurrentTypeXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom type identifier '{0}' of type '{1}' beyongs the limits defined for database.. + /// + internal static string ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase { + get { + return ResourceManager.GetString("ExCustomTypeIdentifierXOfTypeYBeyongsTheLimitsDefinedForDatabase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom type identifier '{0}' of type '{1}' conflicts with type '{2}' in extracted map of types.. + /// + internal static string ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes { + get { + return ResourceManager.GetString("ExCustomTypeIdentifierXOfTypeYConflictsWithTypeZInExtractedMapOfTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cyclic dependency between databases found: {0}. + /// + internal static string ExCyclicDependencyBetweenDatabasesFoundX { + get { + return ResourceManager.GetString("ExCyclicDependencyBetweenDatabasesFoundX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cyclic dependency in query preprocessor graph is detected.. + /// + internal static string ExCyclicDependencyInQueryPreprocessorGraphIsDetected { + get { + return ResourceManager.GetString("ExCyclicDependencyInQueryPreprocessorGraphIsDetected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Database mapping requires multidatabase domain configuration. Please provide at least DefaultDatabase and DefaultSchema settings.. + /// + internal static string ExDatabaseMappingRequiresMultidatabaseDomainConfiguration { + get { + return ResourceManager.GetString("ExDatabaseMappingRequiresMultidatabaseDomainConfiguration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DateTime.ToString() method is not supported, use the DateTime.ToString("s").. + /// + internal static string ExDateTimeToStringMethodIsNotSupported { + get { + return ResourceManager.GetString("ExDateTimeToStringMethodIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DbName value reading or setting is denied.. + /// + internal static string ExDbNameValueReadingOrSettingIsDenied { + get { + return ResourceManager.GetString("ExDbNameValueReadingOrSettingIsDenied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deadlock was found.. + /// + internal static string ExDeadlock { + get { + return ResourceManager.GetString("ExDeadlock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default generator can serve hierarchy with exactly one key field.. + /// + internal static string ExDefaultGeneratorCanServeHierarchyWithExactlyOneKeyField { + get { + return ResourceManager.GetString("ExDefaultGeneratorCanServeHierarchyWithExactlyOneKeyField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DefaultSchema and DefaultDatabase should be specified when multi-database mode is active.. + /// + internal static string ExDefaultSchemaAndDefaultDatabaseShouldBeSpecifiedWhenMultidatabaseModeIsActive { + get { + return ResourceManager.GetString("ExDefaultSchemaAndDefaultDatabaseShouldBeSpecifiedWhenMultidatabaseModeIsActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DefaultSchema should be specified when multi-schema or multi-database mode is active.. + /// + internal static string ExDefaultSchemaShouldBeSpecifiedWhenMultischemaOrMultidatabaseModeIsActive { + get { + return ResourceManager.GetString("ExDefaultSchemaShouldBeSpecifiedWhenMultischemaOrMultidatabaseModeIsActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default storage node can not be removed.. + /// + internal static string ExDefaultStorageNodeCanNotBeRemoved { + get { + return ResourceManager.GetString("ExDefaultStorageNodeCanNotBeRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default type is already registered.. + /// + internal static string ExDefaultTypeIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExDefaultTypeIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dependency operation with full name "{0}" is already registered.. + /// + internal static string ExDependencyOperationIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExDependencyOperationIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Descriptor is in invalid state.. + /// + internal static string ExDescriptorIsInInvalidState { + get { + return ResourceManager.GetString("ExDescriptorIsInInvalidState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deserialization error: some SerializationData slots were not recognized, thus the format of the serialized data differs from the supported one.. + /// + internal static string ExDeserializationErrorUnrecognizedSlotsAreFound { + get { + return ResourceManager.GetString("ExDeserializationErrorUnrecognizedSlotsAreFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stream length not enough to deserialize object of specified type.. + /// + internal static string ExDeserializationStreamLengthIncorrect { + get { + return ResourceManager.GetString("ExDeserializationStreamLengthIncorrect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Destionation array is too small.. + /// + internal static string ExDestionationArrayIsTooSmall { + get { + return ResourceManager.GetString("ExDestionationArrayIsTooSmall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The detection of changes in user structure collection isn't supported.. + /// + internal static string ExDetectionOfChangesInUserStructureCollectionIsNotSupported { + get { + return ResourceManager.GetString("ExDetectionOfChangesInUserStructureCollectionIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Difference related to {0} type is not found on the UpgradeContext stack.. + /// + internal static string ExDifferenceRelatedToXTypeIsNotFoundOnTheUpgradeContextStack { + get { + return ResourceManager.GetString("ExDifferenceRelatedToXTypeIsNotFoundOnTheUpgradeContextStack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Different TupleDescriptors are not valid here: {0} and {1}.. + /// + internal static string ExDifferentTupleDescriptors { + get { + return ResourceManager.GetString("ExDifferentTupleDescriptors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Direct querying for entity set in compiled queries is not supported, use QueryEndpoint.Items() instead.. + /// + internal static string ExDirectQueryingForEntitySetInCompiledQueriesIsNotSupportedUseQueryEndpointItemsInstead { + get { + return ResourceManager.GetString("ExDirectQueryingForEntitySetInCompiledQueriesIsNotSupportedUseQueryEndpointItemsI" + + "nstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DisconnectedState is already attached to session.. + /// + internal static string ExDisconnectedStateIsAlreadyAttachedToSession { + get { + return ResourceManager.GetString("ExDisconnectedStateIsAlreadyAttachedToSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DisconnectedState is detached.. + /// + internal static string ExDisconnectedStateIsDetached { + get { + return ResourceManager.GetString("ExDisconnectedStateIsDetached", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' expression. Downcast from '{1}' to '{2}' not supported. Use 'OfType' or 'as' operator instead.. + /// + internal static string ExDowncastFromXToXNotSupportedUseOfTypeOrAsOperatorInstead { + get { + return ResourceManager.GetString("ExDowncastFromXToXNotSupportedUseOfTypeOrAsOperatorInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate assembly name: '{0}'.. + /// + internal static string ExDuplicateAssemblyNameX { + get { + return ResourceManager.GetString("ExDuplicateAssemblyNameX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The duplicate for the operation {0} is found.. + /// + internal static string ExDuplicateForOperationXIsFound { + get { + return ResourceManager.GetString("ExDuplicateForOperationXIsFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'ElementAt' does not support query provider of type '{0}'.. + /// + internal static string ExElementAtDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExElementAtDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ElementAt index must be greater or equal to zero.. + /// + internal static string ExElementAtIndexMustBeGreaterOrEqualToZero { + get { + return ResourceManager.GetString("ExElementAtIndexMustBeGreaterOrEqualToZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'ElementAt({0})' not supported in compiled queries (Query.Execute). Use 'ElementAt(Expression<Func<int>>)' instead.For example use 'ElementAt(()=>{0})'.. + /// + internal static string ExElementAtNotSupportedInCompiledQueries { + get { + return ResourceManager.GetString("ExElementAtNotSupportedInCompiledQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'ElementAtOrDefault' does not support query provider of type '{0}'.. + /// + internal static string ExElementAtOrDefaultDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExElementAtOrDefaultDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'ElementAtOrDefault({0})' not supported in compiled queries (Query.Execute). Use 'ElementAtOrDefault(Expression<Func<int>>)' instead.For example use 'ElementAtOrDefault(()=>{0})'.. + /// + internal static string ExElementAtOrDefaultNotSupportedInCompiledQueries { + get { + return ResourceManager.GetString("ExElementAtOrDefaultNotSupportedInCompiledQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Element with name '{0}' is contained in this instance already.. + /// + internal static string ExElementWithNameContainedInThisInstanceAlready { + get { + return ResourceManager.GetString("ExElementWithNameContainedInThisInstanceAlready", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Element with type '{0}' is already contained in this instance.. + /// + internal static string ExElementWithTypeIsContainedInThisInstanceAlready { + get { + return ResourceManager.GetString("ExElementWithTypeIsContainedInThisInstanceAlready", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Columns collection is empty.. + /// + internal static string ExEmptyColumnsCollection { + get { + return ResourceManager.GetString("ExEmptyColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KeyColumns collection is empty.. + /// + internal static string ExEmptyKeyColumnsCollection { + get { + return ResourceManager.GetString("ExEmptyKeyColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EndPoints order of both ranges must be equal.. + /// + internal static string ExEndPointOrderMustBeEqual { + get { + return ResourceManager.GetString("ExEndPointOrderMustBeEqual", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}'. Entities '{1}' and '{2}' belong to different hierarchies.. + /// + internal static string ExEntitiesXAndXBelongToDifferentHierarchies { + get { + return ResourceManager.GetString("ExEntitiesXAndXBelongToDifferentHierarchies", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity of type '{0}' does not have full-text index.. + /// + internal static string ExEntityDoesNotHaveFullTextIndex { + get { + return ResourceManager.GetString("ExEntityDoesNotHaveFullTextIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity is already detached from Session. Likely, this is result of creation of new Entity with the same Key.. + /// + internal static string ExEntityIsAlreadyDetachedFromSession { + get { + return ResourceManager.GetString("ExEntityIsAlreadyDetachedFromSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity is in inconsistent state.. + /// + internal static string ExEntityIsInInconsistentState { + get { + return ResourceManager.GetString("ExEntityIsInInconsistentState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity is removed.. + /// + internal static string ExEntityIsRemoved { + get { + return ResourceManager.GetString("ExEntityIsRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity of type '{0}' is incompatible with this EntitySet.. + /// + internal static string ExEntityOfTypeXIsIncompatibleWithThisEntitySet { + get { + return ResourceManager.GetString("ExEntityOfTypeXIsIncompatibleWithThisEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to modify removed entity.. + /// + internal static string ExEntityRemoved { + get { + return ResourceManager.GetString("ExEntityRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EntitySet can't be assigned.. + /// + internal static string ExEntitySetCanTBeAssigned { + get { + return ResourceManager.GetString("ExEntitySetCanTBeAssigned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity set is invalid due to current transaction is not active.. + /// + internal static string ExEntitySetInvalidBecauseTransactionIsNotActive { + get { + return ResourceManager.GetString("ExEntitySetInvalidBecauseTransactionIsNotActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity with key '{0}' already exists. + /// + internal static string ExEntityWithKeyXAlreadyExists { + get { + return ResourceManager.GetString("ExEntityWithKeyXAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Entity '{0}' is bound to another Session.. + /// + internal static string ExEntityXIsBoundToAnotherSession { + get { + return ResourceManager.GetString("ExEntityXIsBoundToAnotherSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enumeration is already finished.. + /// + internal static string ExEnumerationIsAlreadyFinished { + get { + return ResourceManager.GetString("ExEnumerationIsAlreadyFinished", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enumeration is not started.. + /// + internal static string ExEnumerationIsNotStarted { + get { + return ResourceManager.GetString("ExEnumerationIsNotStarted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to insert instance of type '{0}' with specified key. Query affected {1} tables, but expected {2} tables.. + /// + internal static string ExErrorOnInsert { + get { + return ResourceManager.GetString("ExErrorOnInsert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to update instance of type {0} with specified key. Query affected {1} tables, but expecrted {2} tables.. + /// + internal static string ExErrorOnUpdate { + get { + return ResourceManager.GetString("ExErrorOnUpdate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some errors have been occurred during storage build. See error log for details.. + /// + internal static string ExErrorsDuringStorageBuild { + get { + return ResourceManager.GetString("ExErrorsDuringStorageBuild", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Escape character must differ from delimiter character.. + /// + internal static string ExEscapeCharacterMustDifferFromDelimiterCharacter { + get { + return ResourceManager.GetString("ExEscapeCharacterMustDifferFromDelimiterCharacter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exception has been thrown by the parameter value accessor.. + /// + internal static string ExExceptionHasBeenThrownByTheParameterValueAccessor { + get { + return ResourceManager.GetString("ExExceptionHasBeenThrownByTheParameterValueAccessor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exception has been thrown by the user member compiler.. + /// + internal static string ExExceptionHasBeenThrownByTheUserMemberCompiler { + get { + return ResourceManager.GetString("ExExceptionHasBeenThrownByTheUserMemberCompiler", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The exception was thrown during the task's execution.. + /// + internal static string ExExceptionWasThrownDuringTaskExecution { + get { + return ResourceManager.GetString("ExExceptionWasThrownDuringTaskExecution", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ExcludeFields does not support query provider of type '{0}'.. + /// + internal static string ExExcludeFieldsDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExExcludeFieldsDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The expected value of the parameter is already set.. + /// + internal static string ExExpectedValueOfParameterIsAlreadySet { + get { + return ResourceManager.GetString("ExExpectedValueOfParameterIsAlreadySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' must reference field.. + /// + internal static string ExExpression0MustReferenceField { + get { + return ResourceManager.GetString("ExExpression0MustReferenceField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' must reference property.. + /// + internal static string ExExpression0MustReferenceProperty { + get { + return ResourceManager.GetString("ExExpression0MustReferenceProperty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' defined outside of CachingQuery closure.. + /// + internal static string ExExpressionDefinedOutsideOfCachingQueryClosure { + get { + return ResourceManager.GetString("ExExpressionDefinedOutsideOfCachingQueryClosure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The expression having the different normal form must not be a root expression.. + /// + internal static string ExExpressionHavingDifferentNormalFormMustNotBeRoot { + get { + return ResourceManager.GetString("ExExpressionHavingDifferentNormalFormMustNotBeRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The expression having the equal normal form must be a root expression.. + /// + internal static string ExExpressionHavingEqualNormalFormMustBeRoot { + get { + return ResourceManager.GetString("ExExpressionHavingEqualNormalFormMustBeRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The expression must return a value of type '{0}'.. + /// + internal static string ExExpressionMustReturnValueOfTypeX { + get { + return ResourceManager.GetString("ExExpressionMustReturnValueOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' is not a sequence.. + /// + internal static string ExExpressionXIsNotASequence { + get { + return ResourceManager.GetString("ExExpressionXIsNotASequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted and target schemas are equal but there are changes in type identifiers set.. + /// + internal static string ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet { + get { + return ResourceManager.GetString("ExExtractedAndTargetSchemasAreEqualButThereAreChangesInTypeIdentifiersSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted schema is not compatible with the target schema. Details: + ///{0}. + /// + internal static string ExExtractedSchemaIsNotCompatibleWithTheTargetSchema_DetailsX { + get { + return ResourceManager.GetString("ExExtractedSchemaIsNotCompatibleWithTheTargetSchema_DetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted schema is not equal to the target schema. Details: + ///{0}. + /// + internal static string ExExtractedSchemaIsNotEqualToTheTargetSchema_DetailsX { + get { + return ResourceManager.GetString("ExExtractedSchemaIsNotEqualToTheTargetSchema_DetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field access expression '{0}' does not access to '{1}' type members.. + /// + internal static string ExFieldAccessExpressionXDoesNotAccessToYTypeMembers { + get { + return ResourceManager.GetString("ExFieldAccessExpressionXDoesNotAccessToYTypeMembers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field belongs to a different type.. + /// + internal static string ExFieldBelongsToADifferentType { + get { + return ResourceManager.GetString("ExFieldBelongsToADifferentType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field with index '{0}' is infinite.. + /// + internal static string ExFieldIsInfinite { + get { + return ResourceManager.GetString("ExFieldIsInfinite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not an Entity field in Type '{1}'.. + /// + internal static string ExFieldIsNotAnEntityField { + get { + return ResourceManager.GetString("ExFieldIsNotAnEntityField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not structure.. + /// + internal static string ExFieldIsNotStructure { + get { + return ResourceManager.GetString("ExFieldIsNotStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field must be of EntitySet<> type.. + /// + internal static string ExFieldMustBeOfEntitySetType { + get { + return ResourceManager.GetString("ExFieldMustBeOfEntitySetType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' must be persistent (marked by [Field] attribute).. + /// + internal static string ExFieldMustBePersistent { + get { + return ResourceManager.GetString("ExFieldMustBePersistent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not found in model.. + /// + internal static string ExFieldNotFoundInModel { + get { + return ResourceManager.GetString("ExFieldNotFoundInModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field of type '{0}' cannot be nullable. For value types consider using Nullable<T>.. + /// + internal static string ExFieldOfTypeXCannotBeNullableForValueTypesConsiderUsingNullableT { + get { + return ResourceManager.GetString("ExFieldOfTypeXCannotBeNullableForValueTypesConsiderUsingNullableT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field with name '{0}' already exists in EntityInfo.Fields collection.. + /// + internal static string ExFieldWithNameAlreadyExistsInEntityFieldsCollection { + get { + return ResourceManager.GetString("ExFieldWithNameAlreadyExistsInEntityFieldsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field with name '{0}' is already registered.. + /// + internal static string ExFieldWithNameXIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExFieldWithNameXIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' cannot be LazyLoad as it is included into primary key.. + /// + internal static string ExFieldXCannotBeLazyLoadAsItIsIncludedInPrimaryKey { + get { + return ResourceManager.GetString("ExFieldXCannotBeLazyLoadAsItIsIncludedInPrimaryKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' cannot be Nullable as it is included into primary key.. + /// + internal static string ExFieldXCannotBeNullableAsItIsIncludedInPrimaryKey { + get { + return ResourceManager.GetString("ExFieldXCannotBeNullableAsItIsIncludedInPrimaryKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' has '{1}' type but is marked as not nullable.. + /// + internal static string ExFieldXHasYTypeButIsMarkedAsNotNullable { + get { + return ResourceManager.GetString("ExFieldXHasYTypeButIsMarkedAsNotNullable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is already defined in type '{1}' or in its ancestor.. + /// + internal static string ExFieldXIsAlreadyDefinedInTypeXOrItsAncestor { + get { + return ResourceManager.GetString("ExFieldXIsAlreadyDefinedInTypeXOrItsAncestor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not an entity reference, nor entity set.. + /// + internal static string ExFieldXIsNotAnEntityReferenceNorEntitySet { + get { + return ResourceManager.GetString("ExFieldXIsNotAnEntityReferenceNorEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not an entity set.. + /// + internal static string ExFieldXIsNotAnEntitySet { + get { + return ResourceManager.GetString("ExFieldXIsNotAnEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not an EntitySet field.. + /// + internal static string ExFieldXIsNotAnEntitySetField { + get { + return ResourceManager.GetString("ExFieldXIsNotAnEntitySetField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The field {0} is not declared in the type {1} or in one of its ancestors.. + /// + internal static string ExFieldXIsNotDeclaredInTypeYOrInOneOfItsAncestors { + get { + return ResourceManager.GetString("ExFieldXIsNotDeclaredInTypeYOrInOneOfItsAncestors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not entity.. + /// + internal static string ExFieldXIsNotEntity { + get { + return ResourceManager.GetString("ExFieldXIsNotEntity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is not primitive.. + /// + internal static string ExFieldXIsNotPrimitive { + get { + return ResourceManager.GetString("ExFieldXIsNotPrimitive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' not found in type '{1}'.. + /// + internal static string ExFieldXNotFoundInTypeX { + get { + return ResourceManager.GetString("ExFieldXNotFoundInTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}.{1}' is already paired with '{2}.{3}'. Please remove [Association] attribute at '{4}.{5}'.. + /// + internal static string ExFieldXYIsAlreadyPairedWithABRemoveCD { + get { + return ResourceManager.GetString("ExFieldXYIsAlreadyPairedWithABRemoveCD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}.{1}' is not found.. + /// + internal static string ExFieldXYIsNotFound { + get { + return ResourceManager.GetString("ExFieldXYIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Filter tuple descriptor mistmatches with source mapping descriptor.. + /// + internal static string ExFilterTupleDescriptorMistmatchesWithSourceMappingDescriptor { + get { + return ResourceManager.GetString("ExFilterTupleDescriptorMistmatchesWithSourceMappingDescriptor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The foreign key's value have not been loaded.. + /// + internal static string ExForeignKeyValueHaveNotBeenLoaded { + get { + return ResourceManager.GetString("ExForeignKeyValueHaveNotBeenLoaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'FreeText<T>({0})' not supported in compiled queries (Query.Execute). Use 'FreeText<T>(Expression<Func<int>>)' instead.For example use 'FreeText<T>(()=>{0})'.. + /// + internal static string ExFreeTextNotSupportedInCompiledQueries { + get { + return ResourceManager.GetString("ExFreeTextNotSupportedInCompiledQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Function '{0}' is not supported.. + /// + internal static string ExFunctionXIsNotSupported { + get { + return ResourceManager.GetString("ExFunctionXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generic parameter '{0}' should be of type '{1}'.. + /// + internal static string ExGenericParameterShouldBeOfTypeT { + get { + return ResourceManager.GetString("ExGenericParameterShouldBeOfTypeT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The given key was not present in the dictionary.. + /// + internal static string ExGivenKeyNotPresent { + get { + return ResourceManager.GetString("ExGivenKeyNotPresent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to GroupBy overload '{0}' is not supported.. + /// + internal static string ExGroupByOverloadXIsNotSupported { + get { + return ResourceManager.GetString("ExGroupByOverloadXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hierarchy is not found for type '{0}'.. + /// + internal static string ExHierarchyIsNotFoundForTypeX { + get { + return ResourceManager.GetString("ExHierarchyIsNotFoundForTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hierarchy root is not registered.. + /// + internal static string ExHierarchyRootIsNotRegistered { + get { + return ResourceManager.GetString("ExHierarchyRootIsNotRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hierarchy '{0}' doesn't contain any key fields.. + /// + internal static string ExHierarchyXDoesntContainAnyKeyFields { + get { + return ResourceManager.GetString("ExHierarchyXDoesntContainAnyKeyFields", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hint '{0}' is conflicting with hint '{1}'. + /// + internal static string ExHintXIsConflictingWithHintY { + get { + return ResourceManager.GetString("ExHintXIsConflictingWithHintY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ignore rule '{0}' must be applied to column or table.. + /// + internal static string ExIgnoreRuleXMustBeAppliedToColumnOrTable { + get { + return ResourceManager.GetString("ExIgnoreRuleXMustBeAppliedToColumnOrTable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Implementors of {0} interface belong to hierarchies one of which includes TypeId, but another doesn't: {1} & {2}.. + /// + internal static string ExImplementorsOfXInterfaceBelongToHierarchiesOneOfWhichIncludesTypeIdButAnotherDoesntYZ { + get { + return ResourceManager.GetString("ExImplementorsOfXInterfaceBelongToHierarchiesOneOfWhichIncludesTypeIdButAnotherDo" + + "esntYZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Implementors of {0} interface belong to hierarchies with different key structure: {1} & {2}.. + /// + internal static string ExImplementorsOfXInterfaceBelongToHierarchiesWithDifferentKeyStructureYZ { + get { + return ResourceManager.GetString("ExImplementorsOfXInterfaceBelongToHierarchiesWithDifferentKeyStructureYZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Conversion from type {0} to type {1} is inadmissible.. + /// + internal static string ExInadmissibleTypeConversion { + get { + return ResourceManager.GetString("ExInadmissibleTypeConversion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IncludeFields does not support query provider of type '{0}'.. + /// + internal static string ExIncludeFieldsDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExIncludeFieldsDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incompatible array type.. + /// + internal static string ExIncompatibleArrayType { + get { + return ResourceManager.GetString("ExIncompatibleArrayType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The two collections cannot be combined because they use different comparison operations.. + /// + internal static string ExInconsistentComparisons { + get { + return ResourceManager.GetString("ExInconsistentComparisons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect command parameters.. + /// + internal static string ExIncorrectCommandParameters { + get { + return ResourceManager.GetString("ExIncorrectCommandParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect namespace synonyms.. + /// + internal static string ExIncorrectNamespaceSynonyms { + get { + return ResourceManager.GetString("ExIncorrectNamespaceSynonyms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect Stage value: '{0}'.. + /// + internal static string ExIncorrectStageValue { + get { + return ResourceManager.GetString("ExIncorrectStageValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Increment must not be 0.. + /// + internal static string ExIncrementMustNotBeZero { + get { + return ResourceManager.GetString("ExIncrementMustNotBeZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index already contains field '{0}'.. + /// + internal static string ExIndexAlreadyContainsField { + get { + return ResourceManager.GetString("ExIndexAlreadyContainsField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Indexed properties are not supported.. + /// + internal static string ExIndexedPropertiesAreNotSupported { + get { + return ResourceManager.GetString("ExIndexedPropertiesAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Indexes of columns to be loaded are not specified.. + /// + internal static string ExIndexesOfColumnsToBeLoadedAreNotSpecified { + get { + return ResourceManager.GetString("ExIndexesOfColumnsToBeLoadedAreNotSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index field '{0}' is incorrect.. + /// + internal static string ExIndexFieldXIsIncorrect { + get { + return ResourceManager.GetString("ExIndexFieldXIsIncorrect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index '{0}' is changed.. + /// + internal static string ExIndexIsChanged { + get { + return ResourceManager.GetString("ExIndexIsChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index must contain at least one field.. + /// + internal static string ExIndexMustContainAtLeastOneField { + get { + return ResourceManager.GetString("ExIndexMustContainAtLeastOneField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index name '{0}' is invalid.. + /// + internal static string ExIndexNameXIsInvalid { + get { + return ResourceManager.GetString("ExIndexNameXIsInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index is out of range.. + /// + internal static string ExIndexOutOfRange { + get { + return ResourceManager.GetString("ExIndexOutOfRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index should be in [{0}...{1}] range.. + /// + internal static string ExIndexShouldBeInNMRange { + get { + return ResourceManager.GetString("ExIndexShouldBeInNMRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index with name '{0}' already exists in EntityInfo.Indexes collection.. + /// + internal static string ExIndexWithNameAlreadyExistsInEntityInfoIndexesCollection { + get { + return ResourceManager.GetString("ExIndexWithNameAlreadyExistsInEntityInfoIndexesCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index with name '{0}' is already registered.. + /// + internal static string ExIndexWithNameXIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExIndexWithNameXIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index '{0}' can not be both partial and clustered. + /// + internal static string ExIndexXCanNotBeBothPartialAndClustered { + get { + return ResourceManager.GetString("ExIndexXCanNotBeBothPartialAndClustered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index '{0}' is not found.. + /// + internal static string ExIndexXIsNotFound { + get { + return ResourceManager.GetString("ExIndexXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inheritance schema '{0}' is invalid.. + /// + internal static string ExInheritanceSchemaIsInvalid { + get { + return ResourceManager.GetString("ExInheritanceSchemaIsInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance is empty.. + /// + internal static string ExInstanceIsEmpty { + get { + return ResourceManager.GetString("ExInstanceIsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance is locked.. + /// + internal static string ExInstanceIsLocked { + get { + return ResourceManager.GetString("ExInstanceIsLocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple instances of type '{0}' with specified key are found.. + /// + internal static string ExInstanceMultipleResults { + get { + return ResourceManager.GetString("ExInstanceMultipleResults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance must be locked before this operation.. + /// + internal static string ExInstanceMustBeLockedBeforeThisOperation { + get { + return ResourceManager.GetString("ExInstanceMustBeLockedBeforeThisOperation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A instance must have non-null IHasSyncRoot.SyncRoot property value.. + /// + internal static string ExInstanceMustHaveSyncRoot { + get { + return ResourceManager.GetString("ExInstanceMustHaveSyncRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance of type '{0}' with specified key is not found.. + /// + internal static string ExInstanceNotFound { + get { + return ResourceManager.GetString("ExInstanceNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Interface '{0}' does not belong to '{1}' hierarchy.. + /// + internal static string ExInterfaceXDoesNotBelongToXHierarchy { + get { + return ResourceManager.GetString("ExInterfaceXDoesNotBelongToXHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Interface '{0}' is implemented by types mapped to different databases: {1}, {2}. + /// + internal static string ExInterfaceXIsImplementedByTypesMappedToDifferentDatabasesYZ { + get { + return ResourceManager.GetString("ExInterfaceXIsImplementedByTypesMappedToDifferentDatabasesYZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal error: {0}. + /// + internal static string ExInternalError { + get { + return ResourceManager.GetString("ExInternalError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid action type.. + /// + internal static string ExInvalidActionType { + get { + return ResourceManager.GetString("ExInvalidActionType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active scope is invalid - it differs from the expected one. Probably you have forgot to dispose some nested scope.. + /// + internal static string ExInvalidActiveScope { + get { + return ResourceManager.GetString("ExInvalidActiveScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid AfterPath property value.. + /// + internal static string ExInvalidAfterPathPropertyValue { + get { + return ResourceManager.GetString("ExInvalidAfterPathPropertyValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid arguments: non-null 'typeName' is allowed if and only if 'type' equals 'SqlType.Unknown'. + /// + internal static string ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown { + get { + return ResourceManager.GetString("ExInvalidArgumentsNonNullTypeNameIsAllowedIfAndOnlyIfTypeEqualsSqlTypeUnknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid arguments: 'precision' and 'length' should not be used together. + /// + internal static string ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether { + get { + return ResourceManager.GetString("ExInvalidArgumentsPrecisionAndLengthShouldNotBeUsedTogether", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid arguments: 'scale' and 'precision' should be used together. + /// + internal static string ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether { + get { + return ResourceManager.GetString("ExInvalidArgumentsScaleAndPrecisionShouldBeUsedTogether", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid argument type: expected type is {0}.. + /// + internal static string ExInvalidArgumentType { + get { + return ResourceManager.GetString("ExInvalidArgumentType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid boolean string '{0}'.. + /// + internal static string ExInvalidBooleanStringX { + get { + return ResourceManager.GetString("ExInvalidBooleanStringX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified capacity value is less than collection count.. + /// + internal static string ExInvalidCapacity { + get { + return ResourceManager.GetString("ExInvalidCapacity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cast from '{0}' to '{1}' is invalid.. + /// + internal static string ExInvalidCast { + get { + return ResourceManager.GetString("ExInvalidCast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid constraint type.. + /// + internal static string ExInvalidConstraintType { + get { + return ResourceManager.GetString("ExInvalidConstraintType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid context activation sequence.. + /// + internal static string ExInvalidContextActivationSequence { + get { + return ResourceManager.GetString("ExInvalidContextActivationSequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid context deactivation sequence.. + /// + internal static string ExInvalidContextDeactivationSequence { + get { + return ResourceManager.GetString("ExInvalidContextDeactivationSequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Direction value (Direction.None).. + /// + internal static string ExInvalidDirectionValue { + get { + return ResourceManager.GetString("ExInvalidDirectionValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Increment value must be greater then zero.. + /// + internal static string ExInvalideIncrementValue { + get { + return ResourceManager.GetString("ExInvalideIncrementValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid expression type.. + /// + internal static string ExInvalidExpressionType { + get { + return ResourceManager.GetString("ExInvalidExpressionType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid field map size. Expected {0}.. + /// + internal static string ExInvalidFieldMapSizeExpectedX { + get { + return ResourceManager.GetString("ExInvalidFieldMapSizeExpectedX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid field name '{0}'.. + /// + internal static string ExInvalidFieldNameX { + get { + return ResourceManager.GetString("ExInvalidFieldNameX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid field value, constraint {0} is violated.. + /// + internal static string ExInvalidFieldValueConstraintXIsViolated { + get { + return ResourceManager.GetString("ExInvalidFieldValueConstraintXIsViolated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid fill factor '{0}'. Value must be between 0 and 1.. + /// + internal static string ExInvalidFillFactorXValueMustBeBetween0And1 { + get { + return ResourceManager.GetString("ExInvalidFillFactorXValueMustBeBetween0And1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence.. + /// + internal static string ExInvalidForeignKeyStructure { + get { + return ResourceManager.GetString("ExInvalidForeignKeyStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' formatter process type is invalid for the current operation.. + /// + internal static string ExInvalidFormatterProcessType { + get { + return ResourceManager.GetString("ExInvalidFormatterProcessType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IncludedColumns collection is invalid.. + /// + internal static string ExInvalidIncludedColumnsCollection { + get { + return ResourceManager.GetString("ExInvalidIncludedColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create Key. Key params do not correspond to its structure.. + /// + internal static string ExInvalidKeyParams { + get { + return ResourceManager.GetString("ExInvalidKeyParams", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to String representaion of the Key has invalid format.. + /// + internal static string ExInvalidKeyString { + get { + return ResourceManager.GetString("ExInvalidKeyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Length attribute on '{0}' field.. + /// + internal static string ExInvalidLengthAttributeOnXField { + get { + return ResourceManager.GetString("ExInvalidLengthAttributeOnXField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid mapping name '{0}'.. + /// + internal static string ExInvalidMappingNameX { + get { + return ResourceManager.GetString("ExInvalidMappingNameX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Nesting of node "{0}".. + /// + internal static string ExInvalidNestingOfNodeX { + get { + return ResourceManager.GetString("ExInvalidNestingOfNodeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid node identifier.. + /// + internal static string ExInvalidNodeIdentifier { + get { + return ResourceManager.GetString("ExInvalidNodeIdentifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid node state.. + /// + internal static string ExInvalidNodeState { + get { + return ResourceManager.GetString("ExInvalidNodeState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid number of parameters in NewExpression.. + /// + internal static string ExInvalidNumberOfParametersInNewExpression { + get { + return ResourceManager.GetString("ExInvalidNumberOfParametersInNewExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object serializer is invalid, since similar value serializer exists.. + /// + internal static string ExInvalidObjectSerializerSimilarValueSerializerExists { + get { + return ResourceManager.GetString("ExInvalidObjectSerializerSimilarValueSerializerExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Parent value.. + /// + internal static string ExInvalidParentValue { + get { + return ResourceManager.GetString("ExInvalidParentValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Precision attribute on field '{0}'.. + /// + internal static string ExInvalidPrecisionAttributeOnFieldX { + get { + return ResourceManager.GetString("ExInvalidPrecisionAttributeOnFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid prefetch selector '{0}'.. + /// + internal static string ExInvalidPrefetchSelectorX { + get { + return ResourceManager.GetString("ExInvalidPrefetchSelectorX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PrimaryKeyColumns collection is invalid.. + /// + internal static string ExInvalidPrimaryKeyColumnsCollection { + get { + return ResourceManager.GetString("ExInvalidPrimaryKeyColumnsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table.. + /// + internal static string ExInvalidPrimaryKeyStructure { + get { + return ResourceManager.GetString("ExInvalidPrimaryKeyStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record with invalid (possibly - unspecified) type is found.. + /// + internal static string ExInvalidRecordType { + get { + return ResourceManager.GetString("ExInvalidRecordType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Scale attribute on field '{0}'.. + /// + internal static string ExInvalidScaleAttributeOnFieldX { + get { + return ResourceManager.GetString("ExInvalidScaleAttributeOnFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid scope disposal order.. + /// + internal static string ExInvalidScopeDisposalOrder { + get { + return ResourceManager.GetString("ExInvalidScopeDisposalOrder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' can't be an IsReferable serializer, since it serializes IReference type.. + /// + internal static string ExInvalidSerializerBehaviorMustNotBeReferable { + get { + return ResourceManager.GetString("ExInvalidSerializerBehaviorMustNotBeReferable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generic parameter T is resolved to associated '{0}', although '{1}' is expected.. + /// + internal static string ExInvalidSerializerType { + get { + return ResourceManager.GetString("ExInvalidSerializerType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Session of specified ISessionBound object is invalid.. + /// + internal static string ExInvalidSession { + get { + return ResourceManager.GetString("ExInvalidSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid sort expression '{0}'. + /// + internal static string ExInvalidSortExpressionX { + get { + return ResourceManager.GetString("ExInvalidSortExpressionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid transaction state ('{0}'). Expected state(s) is (are) '{1}'.. + /// + internal static string ExInvalidTransactionState { + get { + return ResourceManager.GetString("ExInvalidTransactionState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid TupleDescriptor. Expected descriptor is {0}.. + /// + internal static string ExInvalidTupleDescriptorExpectedDescriptorIs { + get { + return ResourceManager.GetString("ExInvalidTupleDescriptorExpectedDescriptorIs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid upgrader version.. + /// + internal static string ExInvalidUpgraderVersion { + get { + return ResourceManager.GetString("ExInvalidUpgraderVersion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to "{0}" is invalid URL.. + /// + internal static string ExInvalidUrl { + get { + return ResourceManager.GetString("ExInvalidUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid usage of the "orientation" argument.. + /// + internal static string ExInvalidUsageOfTheOrientationArgument { + get { + return ResourceManager.GetString("ExInvalidUsageOfTheOrientationArgument", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid usage of the "rowCount" argument.. + /// + internal static string ExInvalidUsageOfTheRowCountArgument { + get { + return ResourceManager.GetString("ExInvalidUsageOfTheRowCountArgument", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Isolation level '{0}' is not supported. + /// + internal static string ExIsolationLevelXIsNotSupported { + get { + return ResourceManager.GetString("ExIsolationLevelXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item already exists.. + /// + internal static string ExItemAlreadyExists { + get { + return ResourceManager.GetString("ExItemAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item by key ='{0}' was not found.. + /// + internal static string ExItemByKeyXWasNotFound { + get { + return ResourceManager.GetString("ExItemByKeyXWasNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified item cannot be cached because its type is incompatible with underlying storage format.. + /// + internal static string ExItemCantBeCachedIncompatibleType { + get { + return ResourceManager.GetString("ExItemCantBeCachedIncompatibleType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified item cannot be cached because its type is incompatible with ITuple.. + /// + internal static string ExItemCantBeComparedIncompatibleType { + get { + return ResourceManager.GetString("ExItemCantBeComparedIncompatibleType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified item is already in use.. + /// + internal static string ExItemIsInUse { + get { + return ResourceManager.GetString("ExItemIsInUse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified item is not in use.. + /// + internal static string ExItemIsNotInUse { + get { + return ResourceManager.GetString("ExItemIsNotInUse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified item isn't pooled.. + /// + internal static string ExItemIsNotPooled { + get { + return ResourceManager.GetString("ExItemIsNotPooled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified item isn't found.. + /// + internal static string ExItemNotFound { + get { + return ResourceManager.GetString("ExItemNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item is not found in EntitySet.. + /// + internal static string ExItemNotFoundInEntitySet { + get { + return ResourceManager.GetString("ExItemNotFoundInEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Items for cycle '{0}' are not specified.. + /// + internal static string ExItemsForCycleXAreNotSpecified { + get { + return ResourceManager.GetString("ExItemsForCycleXAreNotSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item with key '{0}' was not found.. + /// + internal static string ExItemWithKeyXWasNotFound { + get { + return ResourceManager.GetString("ExItemWithKeyXWasNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item with name '{0}' was not found.. + /// + internal static string ExItemWithNameWasNotFound { + get { + return ResourceManager.GetString("ExItemWithNameWasNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item with name '{0}' already exists.. + /// + internal static string ExItemWithNameXAlreadyExists { + get { + return ResourceManager.GetString("ExItemWithNameXAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item with name '{0}' already exists in '{1}'.. + /// + internal static string ExItemWithNameXAlreadyExistsInY { + get { + return ResourceManager.GetString("ExItemWithNameXAlreadyExistsInY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item with Name '{0}' is not found.. + /// + internal static string ExItemWithNameXIsNotFound { + get { + return ResourceManager.GetString("ExItemWithNameXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An item with the same key has already been added.. + /// + internal static string ExItemWithTheSameKeyHasBeenAdded { + get { + return ResourceManager.GetString("ExItemWithTheSameKeyHasBeenAdded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Join expression should be NULL for CROSS APPLY & OUTER APPLY.. + /// + internal static string ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply { + get { + return ResourceManager.GetString("ExJoinExpressionShouldBeNullForCrossApplyAndOuterApply", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key already exists.. + /// + internal static string ExKeyAlreadyExists { + get { + return ResourceManager.GetString("ExKeyAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key can not be null.. + /// + internal static string ExKeyCanNotBeNull { + get { + return ResourceManager.GetString("ExKeyCanNotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate expression '{0}'. Key comparer is not supported in GroupJoin.. + /// + internal static string ExKeyComparerNotSupportedInGroupJoin { + get { + return ResourceManager.GetString("ExKeyComparerNotSupportedInGroupJoin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key contains multiple fields with IsTypeId==true flag.. + /// + internal static string ExKeyContainsMultipleFieldsWithIsTypeIdTrueFlag { + get { + return ResourceManager.GetString("ExKeyContainsMultipleFieldsWithIsTypeIdTrueFlag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key field can't be of '{0}' type.. + /// + internal static string ExKeyFieldCantBeOfXType { + get { + return ResourceManager.GetString("ExKeyFieldCantBeOfXType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key fields '{0}' and '{1}' have the same position: '{2}'.. + /// + internal static string ExKeyFieldsXAndXHaveTheSamePositionX { + get { + return ResourceManager.GetString("ExKeyFieldsXAndXHaveTheSamePositionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key property '{0}' declared in '{1}' should not have public or protected set accessor. Use base protected constructor to set Key value.. + /// + internal static string ExKeyFieldXInTypeYShouldNotHaveSetAccessor { + get { + return ResourceManager.GetString("ExKeyFieldXInTypeYShouldNotHaveSetAccessor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key field '{0}' was not found in type '{1}'.. + /// + internal static string ExKeyFieldXWasNotFoundInTypeY { + get { + return ResourceManager.GetString("ExKeyFieldXWasNotFoundInTypeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key field '{0}.{1}' is not found.. + /// + internal static string ExKeyFieldXXIsNotFound { + get { + return ResourceManager.GetString("ExKeyFieldXXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [KeyGenerator] attribute on type '{0}' requires Name to be set.. + /// + internal static string ExKeyGeneratorAttributeOnTypeXRequiresNameToBeSet { + get { + return ResourceManager.GetString("ExKeyGeneratorAttributeOnTypeXRequiresNameToBeSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key generators '{0}' and '{1}' have the same seed value.. + /// + internal static string ExKeyGeneratorsXAndYHaveTheSameSeedValue { + get { + return ResourceManager.GetString("ExKeyGeneratorsXAndYHaveTheSameSeedValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key indexes are specified for non-generic Key.. + /// + internal static string ExKeyIndexesAreSpecifiedForNonGenericKey { + get { + return ResourceManager.GetString("ExKeyIndexesAreSpecifiedForNonGenericKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key must have exact type here.. + /// + internal static string ExKeyMustHaveExactType { + get { + return ResourceManager.GetString("ExKeyMustHaveExactType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key of specified type cannot be generated by this KeyGenerator.. + /// + internal static string ExKeyOfSpecifiedTypeCannotBeGeneratedByThisKeyGenerator { + get { + return ResourceManager.GetString("ExKeyOfSpecifiedTypeCannotBeGeneratedByThisKeyGenerator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key of '{0}' does not match key of '{1}'.. + /// + internal static string ExKeyOfXDoesNotMatchKeyOfY { + get { + return ResourceManager.GetString("ExKeyOfXDoesNotMatchKeyOfY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key provider '{0}' and hierarchy {1} key field amount mismatch.. + /// + internal static string ExKeyProviderXAndHierarchyYKeyFieldAmountMismatch { + get { + return ResourceManager.GetString("ExKeyProviderXAndHierarchyYKeyFieldAmountMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key provider '{0}' should define at least one key field.. + /// + internal static string ExKeyProviderXShouldDefineAtLeastOneKeyField { + get { + return ResourceManager.GetString("ExKeyProviderXShouldDefineAtLeastOneKeyField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}'. Keys of '{1}' and '{2}' not compatible.. + /// + internal static string ExKeysOfXAndXNotCompatible { + get { + return ResourceManager.GetString("ExKeysOfXAndXNotCompatible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key structure for '{0}' contains NULL value.. + /// + internal static string ExKeyStructureForXContainsNULLValue { + get { + return ResourceManager.GetString("ExKeyStructureForXContainsNULLValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key values array is empty.. + /// + internal static string ExKeyValuesArrayIsEmpty { + get { + return ResourceManager.GetString("ExKeyValuesArrayIsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key {0} is not found.. + /// + internal static string ExKeyXIsNotFound { + get { + return ResourceManager.GetString("ExKeyXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key {0} should have exact type.. + /// + internal static string ExKeyXShouldHaveExactType { + get { + return ResourceManager.GetString("ExKeyXShouldHaveExactType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key '{0}' was not found in storage.. + /// + internal static string ExKeyXWasNotFoundInStorage { + get { + return ResourceManager.GetString("ExKeyXWasNotFoundInStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LambdaExpression returned by '{0}' should return value that is assignable to '{1}'. + /// + internal static string ExLambdaExpressionReturnedByXShouldReturnValueThatIsAssignableToY { + get { + return ResourceManager.GetString("ExLambdaExpressionReturnedByXShouldReturnValueThatIsAssignableToY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LambdaExpression returned by '{0}' should take one parameter of type '{1}' or any base type of it. + /// + internal static string ExLambdaExpressionReturnedByXShouldTakeOneParameterOfTypeYOrAnyBaseTypeOfIt { + get { + return ResourceManager.GetString("ExLambdaExpressionReturnedByXShouldTakeOneParameterOfTypeYOrAnyBaseTypeOfIt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lambda parameter is out of scope.. + /// + internal static string ExLambdaParameterIsOutOfScope { + get { + return ResourceManager.GetString("ExLambdaParameterIsOutOfScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lambda parameter '{0}' is out of scope.. + /// + internal static string ExLambdaParameterXIsOutOfScope { + get { + return ResourceManager.GetString("ExLambdaParameterXIsOutOfScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lambda '{0}' must have only one parameter.. + /// + internal static string ExLambdaXMustHaveOnlyOneParameter { + get { + return ResourceManager.GetString("ExLambdaXMustHaveOnlyOneParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LeftJoin does not support query provider of type '{0}'.. + /// + internal static string ExLeftJoinDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExLeftJoinDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Legacy schema is not compatible. Details: + ///{0}. + /// + internal static string ExLegacySchemaIsNotCompatible_DetailsX { + get { + return ResourceManager.GetString("ExLegacySchemaIsNotCompatible_DetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Length' constraint violation on field '{0}'.. + /// + internal static string ExLengthConstraintViolationOnFieldX { + get { + return ResourceManager.GetString("ExLengthConstraintViolationOnFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Length should be not negative value.. + /// + internal static string ExLengthShouldBeNotNegativeValue { + get { + return ResourceManager.GetString("ExLengthShouldBeNotNegativeValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The limit of the graph depth is exceeded.. + /// + internal static string ExLimitOfGraphDepthIsExceeded { + get { + return ResourceManager.GetString("ExLimitOfGraphDepthIsExceeded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Linked operation for property {0} missing.. + /// + internal static string ExLinkedOperationMissingFormat { + get { + return ResourceManager.GetString("ExLinkedOperationMissingFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate expression '{0}'. LINQ translator does not support method '{1}'.. + /// + internal static string ExLinqTranslatorDoesNotSupportMethodX { + get { + return ResourceManager.GetString("ExLinqTranslatorDoesNotSupportMethodX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Literal type '{0}' is not supported.. + /// + internal static string ExLiteralTypeXIsNotSupported { + get { + return ResourceManager.GetString("ExLiteralTypeXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Local collection should not be query root.. + /// + internal static string ExLocalCollectionShouldNotBeQueryRoot { + get { + return ResourceManager.GetString("ExLocalCollectionShouldNotBeQueryRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock does not support query provider of type '{0}'.. + /// + internal static string ExLockDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExLockDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock '{0}' is not supported. + /// + internal static string ExLockXIsNotSupported { + get { + return ResourceManager.GetString("ExLockXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LogManager already initialized.. + /// + internal static string ExLogManagerAlreadyInitialized { + get { + return ResourceManager.GetString("ExLogManagerAlreadyInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LogManager must be initialized before using.. + /// + internal static string ExLogManagerMustBeInitializedBeforeUsing { + get { + return ResourceManager.GetString("ExLogManagerMustBeInitializedBeforeUsing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loop in action dependency chain is detected.. + /// + internal static string ExLoopInActionDependencyChain { + get { + return ResourceManager.GetString("ExLoopInActionDependencyChain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The mapping for the property {0} has already been registered.. + /// + internal static string ExMappingForPropertyXHasAlreadyBeenRegistered { + get { + return ResourceManager.GetString("ExMappingForPropertyXHasAlreadyBeenRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Materialization error: Entity's TypeId column does not exist in the underlying RecordSet.. + /// + internal static string ExMaterializationErrorTypeIdColumnDoesNotExistsInTheUnderlyingRecordSet { + get { + return ResourceManager.GetString("ExMaterializationErrorTypeIdColumnDoesNotExistsInTheUnderlyingRecordSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximal item count is {0}.. + /// + internal static string ExMaxItemCountIsN { + get { + return ResourceManager.GetString("ExMaxItemCountIsN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measurement is already completed.. + /// + internal static string ExMeasurementIsAlreadyCompleted { + get { + return ResourceManager.GetString("ExMeasurementIsAlreadyCompleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Measurement '{0}' must have value.. + /// + internal static string ExMeasurementMustHaveValue { + get { + return ResourceManager.GetString("ExMeasurementMustHaveValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Member: '{0}' is not a Public Property or Field of Type: '{1}'. + /// + internal static string ExMemberIsNotPublicPropertyOrField { + get { + return ResourceManager.GetString("ExMemberIsNotPublicPropertyOrField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Member '{0}' is not found. Check that either static parameterless method or static property with such name exists.. + /// + internal static string ExMemberXIsNotFoundCheckThatSuchMemberExists { + get { + return ResourceManager.GetString("ExMemberXIsNotFoundCheckThatSuchMemberExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Member '{0}' is not supported. + /// + internal static string ExMemberXIsNotSupported { + get { + return ResourceManager.GetString("ExMemberXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Member '{0}' of type '{1}' is not initialized. Check if constructor argument is correct or field initialized through initializer.. + /// + internal static string ExMemberXOfTypeYIsNotInitializedCheckIfConstructorArgumentIsCorrectOrFieldInitializedThroughInitializer { + get { + return ResourceManager.GetString("ExMemberXOfTypeYIsNotInitializedCheckIfConstructorArgumentIsCorrectOrFieldInitial" + + "izedThroughInitializer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Member '{0}' should return value that is assignable to LambdaExpression. + /// + internal static string ExMemberXShouldReturnValueThatIsAssignableToLambdaExpression { + get { + return ResourceManager.GetString("ExMemberXShouldReturnValueThatIsAssignableToLambdaExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Merge operation require intersection of operands.. + /// + internal static string ExMergeOperationRequireIntersectionOfOperands { + get { + return ResourceManager.GetString("ExMergeOperationRequireIntersectionOfOperands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MethodCall expression '{0}' is not supported.. + /// + internal static string ExMethodCallExpressionXIsNotSupported { + get { + return ResourceManager.GetString("ExMethodCallExpressionXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' method isn't supported.. + /// + internal static string ExMethodXIsntSupported { + get { + return ResourceManager.GetString("ExMethodXIsntSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Method '{0}' is not found.. + /// + internal static string ExMethodXNotFound { + get { + return ResourceManager.GetString("ExMethodXNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MinMaxValues aren't supported for TupleFieldAdvancedComparer.. + /// + internal static string ExMinMaxValuesAreNotSupportedForTupleFieldAdvancedComparer { + get { + return ResourceManager.GetString("ExMinMaxValuesAreNotSupportedForTupleFieldAdvancedComparer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mistmatch count of left and right expressions.. + /// + internal static string ExMistmatchCountOfLeftAndRightExpressions { + get { + return ResourceManager.GetString("ExMistmatchCountOfLeftAndRightExpressions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Model object cannot be removed.. + /// + internal static string ExModelObjectCannotBeRemoved { + get { + return ResourceManager.GetString("ExModelObjectCannotBeRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More than one enabled {0} is provided.. + /// + internal static string ExMoreThanOneEnabledXIsProvided { + get { + return ResourceManager.GetString("ExMoreThanOneEnabledXIsProvided", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More than one enabled {0} is provided for assembly '{1}'.. + /// + internal static string ExMoreThanOneEnabledXIsProvidedForAssemblyY { + get { + return ResourceManager.GetString("ExMoreThanOneEnabledXIsProvidedForAssemblyY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IncludedColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneIncludedColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneIncludedColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KeyColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneKeyColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneKeyColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ValueColumns collection contains more then one reference to column "{0}".. + /// + internal static string ExMoreThenOneValueColumnReferenceToColumnX { + get { + return ResourceManager.GetString("ExMoreThenOneValueColumnReferenceToColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multi-database mode is active, but no database specified for '{0}'. + /// + internal static string ExMultidatabaseModeIsActiveButNoDatabaseSpecifiedForX { + get { + return ResourceManager.GetString("ExMultidatabaseModeIsActiveButNoDatabaseSpecifiedForX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple associates match type '{0}' by its interfaces (at least '{1}' and '{2}').. + /// + internal static string ExMultipleAssociatesMatch { + get { + return ResourceManager.GetString("ExMultipleAssociatesMatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: multiple attributes of type '{1}' are not allowed here.. + /// + internal static string ExMultipleAttributesOfTypeXAreNotAllowedHere { + get { + return ResourceManager.GetString("ExMultipleAttributesOfTypeXAreNotAllowedHere", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple hints found.. + /// + internal static string ExMultipleHintsFound { + get { + return ResourceManager.GetString("ExMultipleHintsFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple languages not supported for fulltext column {0} of index {1}.. + /// + internal static string ExMultipleLanguagesNotSupportedForFulltextColumnXOfIndexY { + get { + return ResourceManager.GetString("ExMultipleLanguagesNotSupportedForFulltextColumnXOfIndexY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified query returns multiple results.. + /// + internal static string ExMultipleResults { + get { + return ResourceManager.GetString("ExMultipleResults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple services match to the specified arguments.. + /// + internal static string ExMultipleServicesMatchToTheSpecifiedArguments { + get { + return ResourceManager.GetString("ExMultipleServicesMatchToTheSpecifiedArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multi-schema mode is active, but no schema specified for '{0}'. + /// + internal static string ExMultischemaModeIsActiveButNoSchemaSpecifiedForX { + get { + return ResourceManager.GetString("ExMultischemaModeIsActiveButNoSchemaSpecifiedForX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name for parameter '{0}' is not found'. + /// + internal static string ExNameForParameterXIsNotFound { + get { + return ResourceManager.GetString("ExNameForParameterXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name must be not null or empty.. + /// + internal static string ExNameMustBeNotNullOrEmpty { + get { + return ResourceManager.GetString("ExNameMustBeNotNullOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name value reading or setting is denied.. + /// + internal static string ExNameValueReadingOrSettingIsDenied { + get { + return ResourceManager.GetString("ExNameValueReadingOrSettingIsDenied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name '{0}' is invalid.. + /// + internal static string ExNameXIsInvalid { + get { + return ResourceManager.GetString("ExNameXIsInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nested collection is not supported.. + /// + internal static string ExNestedCollectionIsNotSupported { + get { + return ResourceManager.GetString("ExNestedCollectionIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nested field '{0}' is not supported.. + /// + internal static string ExNestedFieldXIsNotSupported { + get { + return ResourceManager.GetString("ExNestedFieldXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no more available items.. + /// + internal static string ExNoAvailableItems { + get { + return ResourceManager.GetString("ExNoAvailableItems", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Comparer.Current is null.. + /// + internal static string ExNoCurrentComparer { + get { + return ResourceManager.GetString("ExNoCurrentComparer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no current Session.. + /// + internal static string ExNoCurrentSession { + get { + return ResourceManager.GetString("ExNoCurrentSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgarder.Current is null.. + /// + internal static string ExNoCurrentUpgrader { + get { + return ResourceManager.GetString("ExNoCurrentUpgrader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Node type is unknown.. + /// + internal static string ExNodeTypeIsUnknown { + get { + return ResourceManager.GetString("ExNodeTypeIsUnknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Node "{0}" must be processed before being compared as reference (value of "{1}".{2}).. + /// + internal static string ExNodeXMustBeProcessedBeforeBeingComparedAsReferenceValueOfYZ { + get { + return ResourceManager.GetString("ExNodeXMustBeProcessedBeforeBeingComparedAsReferenceValueOfYZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No message template is registered for code: {0}. + /// + internal static string ExNoMessageTemplateIsRegisteredForCodeX { + get { + return ResourceManager.GetString("ExNoMessageTemplateIsRegisteredForCodeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-enum parameters for Enum.HasFlag are not supported. + /// + internal static string ExNonEnumParametersForEnumHasFlagAreNotSupported { + get { + return ResourceManager.GetString("ExNonEnumParametersForEnumHasFlagAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nesting must be created for any node.. + /// + internal static string ExNoNesting { + get { + return ResourceManager.GetString("ExNoNesting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-LINQ calls are not supported within Query.ExecuteDelayed. + /// + internal static string ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed { + get { + return ResourceManager.GetString("ExNonLinqCallsAreNotSupportedWithinQueryExecuteDelayed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-temporary keys must be generated by descendants.. + /// + internal static string ExNonTemporaryKeysMustBeGeneratedByDescendants { + get { + return ResourceManager.GetString("ExNonTemporaryKeysMustBeGeneratedByDescendants", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no object with specified key.. + /// + internal static string ExNoObjectWithSpecifiedKey { + get { + return ResourceManager.GetString("ExNoObjectWithSpecifiedKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No operation registration scope. Use OperationRegistry.BeginRegistration method to open it.. + /// + internal static string ExNoOperationRegistrationScope { + get { + return ResourceManager.GetString("ExNoOperationRegistrationScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The normalized boolean expression must be the root expression.. + /// + internal static string ExNormalizedExpressionMustBeRoot { + get { + return ResourceManager.GetString("ExNormalizedExpressionMustBeRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The normalized boolean expression must have the '{0}' form.. + /// + internal static string ExNormalizedExpressionMustHaveXForm { + get { + return ResourceManager.GetString("ExNormalizedExpressionMustHaveXForm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The normalized boolean expression must not be the root expression.. + /// + internal static string ExNormalizedExpressionMustNotBeRoot { + get { + return ResourceManager.GetString("ExNormalizedExpressionMustNotBeRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance is not initialized (or not initialized properly).. + /// + internal static string ExNotInitialized { + get { + return ResourceManager.GetString("ExNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'NotNullable' constraint violation on field '{0}'.. + /// + internal static string ExNotNullableConstraintViolationOnFieldX { + get { + return ResourceManager.GetString("ExNotNullableConstraintViolationOnFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No upgrade handler is found for assembly '{0}', version '{1}'.. + /// + internal static string ExNoUpgradeHandlerIsFoundForAssemblyXVersionY { + get { + return ResourceManager.GetString("ExNoUpgradeHandlerIsFoundForAssemblyXVersionY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nullable and NullableOnUpgrade flags can't be used with '{0}' field. They can be used only with reference-typed fields (except Structure descendants).. + /// + internal static string ExNullableAndNullableOnUpgradeCannotBeUsedWithXField { + get { + return ResourceManager.GetString("ExNullableAndNullableOnUpgradeCannotBeUsedWithXField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The nullable property {0} is bound to the property {1} that isn't nullable.. + /// + internal static string ExNullablePropertyXIsBoundToPropertyYThatIsNotNullable { + get { + return ResourceManager.GetString("ExNullablePropertyXIsBoundToPropertyYThatIsNotNullable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified object and the context are incompatible.. + /// + internal static string ExObjectAndContextAreIncompatible { + get { + return ResourceManager.GetString("ExObjectAndContextAreIncompatible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object is read-only.. + /// + internal static string ExObjectIsReadOnly { + get { + return ResourceManager.GetString("ExObjectIsReadOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OfType supports casting only inside IEntity hierarchy.. + /// + internal static string ExOfTypeSupportsOnlyEntityConversion { + get { + return ResourceManager.GetString("ExOfTypeSupportsOnlyEntityConversion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can't Activate new operation, since old ActiveOperation is still running.. + /// + internal static string ExOldActiveOperationIsStillRunning { + get { + return ResourceManager.GetString("ExOldActiveOperationIsStillRunning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only breakable nodes :(. + /// + internal static string ExOnlyBreakableNodesSadSmile { + get { + return ResourceManager.GetString("ExOnlyBreakableNodesSadSmile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only entities could be hierarchy roots.. + /// + internal static string ExOnlyEntitiesCouldBeHierarchyRoots { + get { + return ResourceManager.GetString("ExOnlyEntitiesCouldBeHierarchyRoots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only equality ranges are supported.. + /// + internal static string ExOnlyEqualityRangesAreSupported { + get { + return ResourceManager.GetString("ExOnlyEqualityRangesAreSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only the normalized expression having the different normal form can be added as the immediate descendant to the root expression.. + /// + internal static string ExOnlyNormalizedExpressionCanBeAddedAsChildToRoot { + get { + return ResourceManager.GetString("ExOnlyNormalizedExpressionCanBeAddedAsChildToRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only one ancestor of each instance of this generic type is allowed.. + /// + internal static string ExOnlyOneAncestorOfEachInstanceOfThisGenericTypeIsAllowed { + get { + return ResourceManager.GetString("ExOnlyOneAncestorOfEachInstanceOfThisGenericTypeIsAllowed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only one operation can be registered in each scope.. + /// + internal static string ExOnlyOneOperationCanBeRegisteredInEachScope { + get { + return ResourceManager.GetString("ExOnlyOneOperationCanBeRegisteredInEachScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only one primary operation can be logged by each OperationContext instance.. + /// + internal static string ExOnlyOnePrimaryOperationCanBeLogged { + get { + return ResourceManager.GetString("ExOnlyOnePrimaryOperationCanBeLogged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only 'Prefetch(source, expression, params[] expressions)' method is supported within prefetch expression. But found '{0}'.. + /// + internal static string ExOnlyPrefetchMethodSupportedButFoundX { + get { + return ResourceManager.GetString("ExOnlyPrefetchMethodSupportedButFoundX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only persistented property access, calls of Prefetch method or anonymous type constructors are supported, but found '{0}' expression.. + /// + internal static string ExOnlyPropertAccessPrefetchOrAnonymousTypeSupportedButFoundX { + get { + return ResourceManager.GetString("ExOnlyPropertAccessPrefetchOrAnonymousTypeSupportedButFoundX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only secondary indexes can be declared partial.. + /// + internal static string ExOnlySecondaryIndexesCanBeDeclaredPartial { + get { + return ResourceManager.GetString("ExOnlySecondaryIndexesCanBeDeclaredPartial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only single-column key supported.. + /// + internal static string ExOnlySingleColumnKeySupported { + get { + return ResourceManager.GetString("ExOnlySingleColumnKeySupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only SqlLiteral or SqlPlaceholder can be used in Limit/Offset. + /// + internal static string ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset { + get { + return ResourceManager.GetString("ExOnlySqlLiteralOrSqlPlaceholderCanBeUsedInLimitOffset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}.{1}' OnOwnerRemove action is not equal to '{2}.{3}' OnTargetRemove action.. + /// + internal static string ExOnOwnerRemoveActionIsNotEqualToOnTargetRemoveAction { + get { + return ResourceManager.GetString("ExOnOwnerRemoveActionIsNotEqualToOnTargetRemoveAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation isn't marked as started. See Sessopn.Operations.OperationStarted() method.. + /// + internal static string ExOperationIsNotMarkedAsStarted { + get { + return ResourceManager.GetString("ExOperationIsNotMarkedAsStarted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation isn't registered yet. See Session.Oeprations.RegisterOperations().. + /// + internal static string ExOperationIsNotRegisteredYet { + get { + return ResourceManager.GetString("ExOperationIsNotRegisteredYet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation LinkType should be defined before it can be registered in OperationDictionary.. + /// + internal static string ExOperationLinkTypeUndefined { + get { + return ResourceManager.GetString("ExOperationLinkTypeUndefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation must be locked before it can be registered in OperationDictionary.. + /// + internal static string ExOperationMustBeLocked { + get { + return ResourceManager.GetString("ExOperationMustBeLocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation PropertyName must be specified before it can be registered in OperationDictionary.. + /// + internal static string ExOperationPropertyNameUndefined { + get { + return ResourceManager.GetString("ExOperationPropertyNameUndefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OperatonStarted is alerady called for this operation.. + /// + internal static string ExOperationStartedIsAlreadyCalledForThisOperation { + get { + return ResourceManager.GetString("ExOperationStartedIsAlreadyCalledForThisOperation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operation '{0}' is not supported. + /// + internal static string ExOperationXIsNotSupported { + get { + return ResourceManager.GetString("ExOperationXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Option '{0}' is mutually exclusive with option '{1}'. + /// + internal static string ExOptionXIsMutuallyExclusiveWithOptionY { + get { + return ResourceManager.GetString("ExOptionXIsMutuallyExclusiveWithOptionY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The ordering of records is not specified for RowNumberProvider.. + /// + internal static string ExOrderingOfRecordsIsNotSpecifiedForRowNumberProvider { + get { + return ResourceManager.GetString("ExOrderingOfRecordsIsNotSpecifiedForRowNumberProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Order key not found in mapping.. + /// + internal static string ExOrderKeyNotFoundInMapping { + get { + return ResourceManager.GetString("ExOrderKeyNotFoundInMapping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Origin is not null.. + /// + internal static string ExOriginIsNotNull { + get { + return ResourceManager.GetString("ExOriginIsNotNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Origin is null.. + /// + internal static string ExOriginIsNull { + get { + return ResourceManager.GetString("ExOriginIsNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Outer parameter reference found, but no SqlCompiler provided. + /// + internal static string ExOuterParameterReferenceFoundButNoSqlCompilerProvided { + get { + return ResourceManager.GetString("ExOuterParameterReferenceFoundButNoSqlCompilerProvided", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object is outside of initial transaction scope.. + /// + internal static string ExOutOfTransactionScope { + get { + return ResourceManager.GetString("ExOutOfTransactionScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paired field '{0}' has wrong type. A descendant of Entity or EntitySet is expected.. + /// + internal static string ExPairedFieldXHasWrongTypeItShouldBeReferenceToEntityOrAEntitySet { + get { + return ResourceManager.GetString("ExPairedFieldXHasWrongTypeItShouldBeReferenceToEntityOrAEntitySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paired field '{0}.{1}' was not found in '{2}' type.. + /// + internal static string ExPairedFieldXYWasNotFoundInZType { + get { + return ResourceManager.GetString("ExPairedFieldXYWasNotFoundInZType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paired identity columns for types '{0}' and '{1}' not found. + /// + internal static string ExPairedIdentityColumnsForTypesXAndXNotFound { + get { + return ResourceManager.GetString("ExPairedIdentityColumnsForTypesXAndXNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [Association] attribute with PairTo can not be use with field '{0}' of type '{1}'. It is already applied to field '{2}' of type '{3}'.. + /// + internal static string ExPairToAttributeCanNotBeAppliedToXField { + get { + return ResourceManager.GetString("ExPairToAttributeCanNotBeAppliedToXField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ParameterExpression must have same type as ProjectionExpression.ItemProjector. + /// + internal static string ExParameterExpressionMustHaveSameTypeAsProjectionExpressionItemProjector { + get { + return ResourceManager.GetString("ExParameterExpressionMustHaveSameTypeAsProjectionExpressionItemProjector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameters count is not same as source column lists count.. + /// + internal static string ExParametersCountIsNotSameAsSourceColumnListsCount { + get { + return ResourceManager.GetString("ExParametersCountIsNotSameAsSourceColumnListsCount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' is not a tuple access expression. + /// + internal static string ExParameterXIsNotATupleAccessExpression { + get { + return ResourceManager.GetString("ExParameterXIsNotATupleAccessExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Part of URL contains forbidden characters. Forbidden characters: . + /// + internal static string ExPartOfUrlContainsForbiddenCharacters { + get { + return ResourceManager.GetString("ExPartOfUrlContainsForbiddenCharacters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Node with path "{0}" is not found.. + /// + internal static string ExPathXNotFound { + get { + return ResourceManager.GetString("ExPathXNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected target model. + /// + internal static string ExpectedTargetModel { + get { + return ResourceManager.GetString("ExpectedTargetModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Persistent type '{0}' is not entity or persistent interface.. + /// + internal static string ExPersistentTypeXIsNotEntityOrPersistentInterface { + get { + return ResourceManager.GetString("ExPersistentTypeXIsNotEntityOrPersistentInterface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Explicit mapping name setting is redundant. The same name '{0}' will be generated automatically.. + /// + internal static string ExplicitMappingNameSettingIsRedundantTheSameNameXWillBeGeneratedAutomatically { + get { + return ResourceManager.GetString("ExplicitMappingNameSettingIsRedundantTheSameNameXWillBeGeneratedAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pool should be in syncronized mode to utilize AutoCleanup feature.. + /// + internal static string ExPoolMustBeSyncronized { + get { + return ResourceManager.GetString("ExPoolMustBeSyncronized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item already exists in the pool with another key.. + /// + internal static string ExPoolWrongKey { + get { + return ResourceManager.GetString("ExPoolWrongKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port value must be in [0,65535] range.. + /// + internal static string ExPortOutOfRange { + get { + return ResourceManager.GetString("ExPortOutOfRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Position value should be greater than zero.. + /// + internal static string ExPositionValueShouldBeGreaterThanZero { + get { + return ResourceManager.GetString("ExPositionValueShouldBeGreaterThanZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Precision should be non-negative value.. + /// + internal static string ExPrecisionShouldBeNonNegativeValue { + get { + return ResourceManager.GetString("ExPrecisionShouldBeNonNegativeValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Predicate contains accesses to different ApplyParameters.. + /// + internal static string ExPredicateContainsAccessesToDifferentApplyParameters { + get { + return ResourceManager.GetString("ExPredicateContainsAccessesToDifferentApplyParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Prefetch does not support query provider of type '{0}'.. + /// + internal static string ExPrefetchDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExPrefetchDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to expressions of type '{0}' are not supported. + /// + internal static string ExpressionsOfTypeXAreNotSupported { + get { + return ResourceManager.GetString("ExpressionsOfTypeXAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' is unknown.. + /// + internal static string ExpressionXIsUnknown { + get { + return ResourceManager.GetString("ExpressionXIsUnknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expression '{0}' should take {1} parameters. + /// + internal static string ExpressionXShouldTakeYParameters { + get { + return ResourceManager.GetString("ExpressionXShouldTakeYParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary key column can not be nullable.. + /// + internal static string ExPrimaryKeyColumnCanNotBeNullable { + get { + return ResourceManager.GetString("ExPrimaryKeyColumnCanNotBeNullable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is a part of primary key. It can't be changed.. + /// + internal static string ExPrimaryKeyFieldCantBeChanged { + get { + return ResourceManager.GetString("ExPrimaryKeyFieldCantBeChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary key field '{0}' can't be marked as Version.. + /// + internal static string ExPrimaryKeyFieldXCanTBeMarkedAsVersion { + get { + return ResourceManager.GetString("ExPrimaryKeyFieldXCanTBeMarkedAsVersion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The primitive property {0} is bound to the property {1} that isn't primitive.. + /// + internal static string ExPrimitivePropertyXIsBoundToPropertyYThatIsNotPrimitive { + get { + return ResourceManager.GetString("ExPrimitivePropertyXIsBoundToPropertyYThatIsNotPrimitive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Processing of VoidProvider is not supported.. + /// + internal static string ExProcessingOfVoidProviderIsNotSupported { + get { + return ResourceManager.GetString("ExProcessingOfVoidProviderIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The properties {0} and {1} have different primitive types.. + /// + internal static string ExPropertiesXAndYHaveDifferentPrimitiveTypes { + get { + return ResourceManager.GetString("ExPropertiesXAndYHaveDifferentPrimitiveTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The properties "{0}" and "{1}" have incompatible types.. + /// + internal static string ExPropertiesXAndYHaveIncompatibleTypes { + get { + return ResourceManager.GetString("ExPropertiesXAndYHaveIncompatibleTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' of type '{1}' does not have public get accessor.. + /// + internal static string ExPropertyDoesNotHaveGetter { + get { + return ResourceManager.GetString("ExPropertyDoesNotHaveGetter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' of type '{1}' does not have public set accessor.. + /// + internal static string ExPropertyDoesNotHaveSetter { + get { + return ResourceManager.GetString("ExPropertyDoesNotHaveSetter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' is already initialized.. + /// + internal static string ExPropertyIsAlreadyInitialized { + get { + return ResourceManager.GetString("ExPropertyIsAlreadyInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' is not initialized (or not initialized properly).. + /// + internal static string ExPropertyIsNotInitialized { + get { + return ResourceManager.GetString("ExPropertyIsNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property value must belong to the same Model.. + /// + internal static string ExPropertyValueMustBelongToTheSameModel { + get { + return ResourceManager.GetString("ExPropertyValueMustBelongToTheSameModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' doesn't have public setter.. + /// + internal static string ExPropertyXDoesnTHavePublicSetter { + get { + return ResourceManager.GetString("ExPropertyXDoesnTHavePublicSetter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}' must be declared in type '{1}'.. + /// + internal static string ExPropertyXMustBeDeclaredInTypeY { + get { + return ResourceManager.GetString("ExPropertyXMustBeDeclaredInTypeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property '{0}.{1}' doesn't have public getter.. + /// + internal static string ExPropertyXYDoesnTHavePublicGetter { + get { + return ResourceManager.GetString("ExPropertyXYDoesnTHavePublicGetter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Property "{0}.{1}" is not found.. + /// + internal static string ExPropertyXYIsNotFound { + get { + return ResourceManager.GetString("ExPropertyXYIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Provider must be either CompilableProvider or ExecutableProvider. + /// + internal static string ExProviderMustBeEitherCompilableProviderOrExecutableProvider { + get { + return ResourceManager.GetString("ExProviderMustBeEitherCompilableProviderOrExecutableProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Provider '{0}' does not implement LogProvider class.. + /// + internal static string ExProviderXDoesNotImplementLogProviderClass { + get { + return ResourceManager.GetString("ExProviderXDoesNotImplementLogProviderClass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Provider "{0}" is not supported. Use one of the following: {1}.. + /// + internal static string ExProviderXIsNotSupportedUseOneOfTheFollowingY { + get { + return ResourceManager.GetString("ExProviderXIsNotSupportedUseOneOfTheFollowingY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The query contains closures of different types.. + /// + internal static string ExQueryContainsClosuresOfDifferentTypes { + get { + return ResourceManager.GetString("ExQueryContainsClosuresOfDifferentTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query task is not executed yet.. + /// + internal static string ExQueryTaskIsNotExecutedYet { + get { + return ResourceManager.GetString("ExQueryTaskIsNotExecutedYet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Range is empty.. + /// + internal static string ExRangeIsEmpty { + get { + return ResourceManager.GetString("ExRangeIsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reader is not in consistent state.. + /// + internal static string ExReaderIsNotInConsistentState { + get { + return ResourceManager.GetString("ExReaderIsNotInConsistentState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recursive associate lookup is detected.. + /// + internal static string ExRecursiveAssociateLookupDetected { + get { + return ResourceManager.GetString("ExRecursiveAssociateLookupDetected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recursive constructor paremeter dependency is detected.. + /// + internal static string ExRecursiveConstructorParemeterDependencyIsDetected { + get { + return ResourceManager.GetString("ExRecursiveConstructorParemeterDependencyIsDetected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referenced columns count cannot be less then one.. + /// + internal static string ExReferencedColumnsCountCantBeLessThenOne { + get { + return ResourceManager.GetString("ExReferencedColumnsCountCantBeLessThenOne", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referenced column "{0}" does not belong to index "{1}".. + /// + internal static string ExReferencedColumnXDoesNotBelongToIndexY { + get { + return ResourceManager.GetString("ExReferencedColumnXDoesNotBelongToIndexY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referenced field '{0}' and paired field are equal.. + /// + internal static string ExReferencedFieldXAndPairedFieldAreEqual { + get { + return ResourceManager.GetString("ExReferencedFieldXAndPairedFieldAreEqual", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference '{0}' is already defined.. + /// + internal static string ExReferenceIsAlreadyDefined { + get { + return ResourceManager.GetString("ExReferenceIsAlreadyDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference '{0}' is not resolved yet.. + /// + internal static string ExReferenceIsNotResolvedYet { + get { + return ResourceManager.GetString("ExReferenceIsNotResolvedYet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference points to null.. + /// + internal static string ExReferenceIsNull { + get { + return ResourceManager.GetString("ExReferenceIsNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The reference property {0} is bound to the property {1} that isn't reference.. + /// + internal static string ExReferencePropertyXIsBoundToPropertyYThatIsNotReference { + get { + return ResourceManager.GetString("ExReferencePropertyXIsBoundToPropertyYThatIsNotReference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference registration error: Reference addition is already registered.. + /// + internal static string ExReferenceRegistrationErrorReferenceAdditionIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExReferenceRegistrationErrorReferenceAdditionIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference registration error: Reference removal is already registered.. + /// + internal static string ExReferenceRregistrationErrorReferenceRemovalIsAlreadyRegistered { + get { + return ResourceManager.GetString("ExReferenceRregistrationErrorReferenceRemovalIsAlreadyRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referencing columns count cannot be less then one.. + /// + internal static string ExReferencingColumnsCountCantBeLessThenOne { + get { + return ResourceManager.GetString("ExReferencingColumnsCountCantBeLessThenOne", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The referencing entity's tuple is not loaded.. + /// + internal static string ExReferencingEntityTupleIsNotLoaded { + get { + return ResourceManager.GetString("ExReferencingEntityTupleIsNotLoaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The referencing entity with key {0} is not found.. + /// + internal static string ExReferencingEntityWithKeyXIsNotFound { + get { + return ResourceManager.GetString("ExReferencingEntityWithKeyXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referential integrity violation.. + /// + internal static string ExReferentialIntegrityViolation { + get { + return ResourceManager.GetString("ExReferentialIntegrityViolation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Request is not prepared. + /// + internal static string ExRequestIsNotPrepared { + get { + return ResourceManager.GetString("ExRequestIsNotPrepared", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resource property {0} is not of string type.. + /// + internal static string ExResourcePropertyXIsNotOfStringType { + get { + return ResourceManager.GetString("ExResourcePropertyXIsNotOfStringType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Result is not available.. + /// + internal static string ExResultIsNotAvailable { + get { + return ResourceManager.GetString("ExResultIsNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value of '{0}' type cannot be assigned to property of '{1}' type.. + /// + internal static string ExResultTypeIncorrect { + get { + return ResourceManager.GetString("ExResultTypeIncorrect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Row amount should be positive number.. + /// + internal static string ExRowAmountShouldBePositiveNumber { + get { + return ResourceManager.GetString("ExRowAmountShouldBePositiveNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ROW_NUMBER window function is not supported on this version of PostgreSQL. + /// + internal static string ExRowNumberWindowFunctionIsNotSupportedOnThisVersionOfPostgreSql { + get { + return ResourceManager.GetString("ExRowNumberWindowFunctionIsNotSupportedOnThisVersionOfPostgreSql", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Running operation registration must be finished before invocation of this method.. + /// + internal static string ExRunningOperationRegistrationMustBeFinished { + get { + return ResourceManager.GetString("ExRunningOperationRegistrationMustBeFinished", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale should be non-negative value.. + /// + internal static string ExScaleShouldBeNonNegativeValue { + get { + return ResourceManager.GetString("ExScaleShouldBeNonNegativeValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Schema mapping requires multischema domain configuration. Please provide at least DefaultSchema setting.. + /// + internal static string ExSchemaMappingRequiresMultischemaDomainConfiguration { + get { + return ResourceManager.GetString("ExSchemaMappingRequiresMultischemaDomainConfiguration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Schema must be not null.. + /// + internal static string ExSchemaMustBeNotNull { + get { + return ResourceManager.GetString("ExSchemaMustBeNotNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scope-bound transaction can be committed only by its scope. Use TransactionScopeBase.Complete() \ Dispose() methods of appropriate TransactionScopeBase descendant instance to do this.. + /// + internal static string ExScopeBoundTransactionCanBeCommittedOnlyByItsScope { + get { + return ResourceManager.GetString("ExScopeBoundTransactionCanBeCommittedOnlyByItsScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scope can't be disposed. Most likely it is bound to a different thread.. + /// + internal static string ExScopeCantBeDisposed { + get { + return ResourceManager.GetString("ExScopeCantBeDisposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is required.. + /// + internal static string ExScopeRequired { + get { + return ResourceManager.GetString("ExScopeRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Section '{0}' is not found in application configuration file.. + /// + internal static string ExSectionIsNotFoundInApplicationConfigurationFile { + get { + return ResourceManager.GetString("ExSectionIsNotFoundInApplicationConfigurationFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Segment is out of range.. + /// + internal static string ExSegmentIsOutOfRange { + get { + return ResourceManager.GetString("ExSegmentIsOutOfRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SelectMany collection selector '{0}' must have only one lambda parameter.. + /// + internal static string ExSelectManyCollectionSelector0MustHaveOnlyOneLambdaParameter { + get { + return ResourceManager.GetString("ExSelectManyCollectionSelector0MustHaveOnlyOneLambdaParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The SelectProvider removes columns used for an ordering.. + /// + internal static string ExSelectProviderRemovesColumnsUsedForOrdering { + get { + return ResourceManager.GetString("ExSelectProviderRemovesColumnsUsedForOrdering", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequence contains more than one element.. + /// + internal static string ExSequenceContainsMoreThanOneElement { + get { + return ResourceManager.GetString("ExSequenceContainsMoreThanOneElement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequence contains no elements.. + /// + internal static string ExSequenceContainsNoElements { + get { + return ResourceManager.GetString("ExSequenceContainsNoElements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequence '{0}' is not found in storage.. + /// + internal static string ExSequenceXIsNotFoundInStorage { + get { + return ResourceManager.GetString("ExSequenceXIsNotFoundInStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service can not be attached to Session while it is persisting the changes.. + /// + internal static string ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges { + get { + return ResourceManager.GetString("ExServiceCanNotBeAttachedToSessionWhileItIsPersistingTheChanges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service '{0}' is not found.. + /// + internal static string ExServiceNotFound { + get { + return ResourceManager.GetString("ExServiceNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service of type '{0}' is not available.. + /// + internal static string ExServiceOfTypeXIsNotAvailable { + get { + return ResourceManager.GetString("ExServiceOfTypeXIsNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service with name '{0}' already exists in StorageInfo.Services collection.. + /// + internal static string ExServiceWithNameAlreadyExistsInStorageInfoServicesCollection { + get { + return ResourceManager.GetString("ExServiceWithNameAlreadyExistsInStorageInfoServicesCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service with name "{0}" of type '{1}' is not available.. + /// + internal static string ExServiceWithNameXOfTypeYIsNotAvailable { + get { + return ResourceManager.GetString("ExServiceWithNameXOfTypeYIsNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Service '{0}' is not supported.. + /// + internal static string ExServiceXIsNotSupported { + get { + return ResourceManager.GetString("ExServiceXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session bound object is out of session scope.. + /// + internal static string ExSessionBoundObjectOutOfSessionScope { + get { + return ResourceManager.GetString("ExSessionBoundObjectOutOfSessionScope", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session is already disposed.. + /// + internal static string ExSessionIsAlreadyDisposed { + get { + return ResourceManager.GetString("ExSessionIsAlreadyDisposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session is not open. Use Session.Open(...) to open it.. + /// + internal static string ExSessionIsNotOpen { + get { + return ResourceManager.GetString("ExSessionIsNotOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session of another SessionBound must be the same.. + /// + internal static string ExSessionOfAnotherSessionBoundMustBeTheSame { + get { + return ResourceManager.GetString("ExSessionOfAnotherSessionBoundMustBeTheSame", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session with name '{0}' already exists.. + /// + internal static string ExSessionWithNameXAlreadyExists { + get { + return ResourceManager.GetString("ExSessionWithNameXAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}' still uses single available connection.. + /// + internal static string ExSessionXStillUsesSingleAvailableConnection { + get { + return ResourceManager.GetString("ExSessionXStillUsesSingleAvailableConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single hierarchy is mapped to multiple databases: {0}, {1}. + /// + internal static string ExSingleHierarchyIsMappedToMultipleDatabasesXY { + get { + return ResourceManager.GetString("ExSingleHierarchyIsMappedToMultipleDatabasesXY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Size should be not negative value.. + /// + internal static string ExSizeShouldBeNotNegativeValue { + get { + return ResourceManager.GetString("ExSizeShouldBeNotNegativeValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Skip' does not support query provider of type '{0}'.. + /// + internal static string ExSkipDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExSkipDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Skip({0})' not supported in compiled queries (Query.Execute). Use 'Skip(Expression<Func<int>>)' instead.For example use 'Skip(()=>{0})'.. + /// + internal static string ExSkipNotSupportedInCompiledQueries { + get { + return ResourceManager.GetString("ExSkipNotSupportedInCompiledQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some operands are not Expressions of type 'System.Boolean'.. + /// + internal static string ExSomeOperandsAreNotExpressionsOfTypeBoolean { + get { + return ResourceManager.GetString("ExSomeOperandsAreNotExpressionsOfTypeBoolean", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Source column list contains null values.. + /// + internal static string ExSourceColumnListContainsNullValues { + get { + return ResourceManager.GetString("ExSourceColumnListContainsNullValues", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Special character {0} used as escape character.. + /// + internal static string ExSpecialCharacterXUsedAsEscapeCharacter { + get { + return ResourceManager.GetString("ExSpecialCharacterXUsedAsEscapeCharacter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified capacity value is less than collection count.. + /// + internal static string ExSpecifiedCapacityIsLessThenCollectionCount { + get { + return ResourceManager.GetString("ExSpecifiedCapacityIsLessThenCollectionCount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified connection does not belong to this driver.. + /// + internal static string ExSpecifiedConnectionDoesNotBelongToThisDriver { + get { + return ResourceManager.GetString("ExSpecifiedConnectionDoesNotBelongToThisDriver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified expression can't be parsed.. + /// + internal static string ExSpecifiedExpressionCanNotBeParsed { + get { + return ResourceManager.GetString("ExSpecifiedExpressionCanNotBeParsed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified expression is not a MemberExpression.. + /// + internal static string ExSpecifiedExpressionIsNotMemberExpression { + get { + return ResourceManager.GetString("ExSpecifiedExpressionIsNotMemberExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified key field type is not supported by this temporary key generator.. + /// + internal static string ExSpecifiedKeyFieldTypeIsNotSupportedByThisTemporaryKeyGenerator { + get { + return ResourceManager.GetString("ExSpecifiedKeyFieldTypeIsNotSupportedByThisTemporaryKeyGenerator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified precision ({0}) is greater than maximum supported by storage ({1}).. + /// + internal static string ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY { + get { + return ResourceManager.GetString("ExSpecifiedPrecisionXIsGreaterThanMaximumSupportedByStorageY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified property {0} is not persistent.. + /// + internal static string ExSpecifiedPropertyXIsNotPersistent { + get { + return ResourceManager.GetString("ExSpecifiedPropertyXIsNotPersistent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified RedoDescriptor can't be logged.. + /// + internal static string ExSpecifiedRedoDescriptorCantBeLogged { + get { + return ResourceManager.GetString("ExSpecifiedRedoDescriptorCantBeLogged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified type's hierarchy is different from the key's hierarchy.. + /// + internal static string ExSpecifiedTypeHierarchyIsDifferentFromKeyHierarchy { + get { + return ResourceManager.GetString("ExSpecifiedTypeHierarchyIsDifferentFromKeyHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified type should be either GeneratedTupleDescriptor or its descendant.. + /// + internal static string ExSpecifiedTypeShouldBeGeneratedTupleDescriptorOrItsDescendant { + get { + return ResourceManager.GetString("ExSpecifiedTypeShouldBeGeneratedTupleDescriptorOrItsDescendant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified values aren't enough to create key for type '{0}'.. + /// + internal static string ExSpecifiedValuesArentEnoughToCreateKeyForTypeX { + get { + return ResourceManager.GetString("ExSpecifiedValuesArentEnoughToCreateKeyForTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sql container expression can not be compiled.. + /// + internal static string ExSqlContainerExpressionCanNotBeCompiled { + get { + return ResourceManager.GetString("ExSqlContainerExpressionCanNotBeCompiled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SQL Server below 2005 is not supported.. + /// + internal static string ExSqlServerBelow2005IsNotSupported { + get { + return ResourceManager.GetString("ExSqlServerBelow2005IsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SQL Server supports trimming of space characters only.. + /// + internal static string ExSqlServerSupportsTrimmingOfSpaceCharactersOnly { + get { + return ResourceManager.GetString("ExSqlServerSupportsTrimmingOfSpaceCharactersOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State is not loaded.. + /// + internal static string ExStateIsNotLoaded { + get { + return ResourceManager.GetString("ExStateIsNotLoaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State is removed.. + /// + internal static string ExStateIsRemoved { + get { + return ResourceManager.GetString("ExStateIsRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to StateTransaction property value differs from the current transaction.. + /// + internal static string ExStateTransactionIsDifferent { + get { + return ResourceManager.GetString("ExStateTransactionIsDifferent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State with key '{0}' is already exists.. + /// + internal static string ExStateWithKeyXIsAlreadyExists { + get { + return ResourceManager.GetString("ExStateWithKeyXIsAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage is not supported limitation of row count to delete.. + /// + internal static string ExStorageIsNotSupportedLimitationOfRowCountToDelete { + get { + return ResourceManager.GetString("ExStorageIsNotSupportedLimitationOfRowCountToDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage is not supported limitation of row count to update.. + /// + internal static string ExStorageIsNotSupportedLimitationOfRowCountToUpdate { + get { + return ResourceManager.GetString("ExStorageIsNotSupportedLimitationOfRowCountToUpdate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage node is already selected.. + /// + internal static string ExStorageNodeIsAlreadySelected { + get { + return ResourceManager.GetString("ExStorageNodeIsAlreadySelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage node with id '{0}' is not found.. + /// + internal static string ExStorageNodeWithIdXIsNotFound { + get { + return ResourceManager.GetString("ExStorageNodeWithIdXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage provider '{0}' is not found.. + /// + internal static string ExStorageProviderXIsNotFound { + get { + return ResourceManager.GetString("ExStorageProviderXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to String does not correspond to the specified descriptor.. + /// + internal static string ExStringDoesNotCorrespondToDescriptor { + get { + return ResourceManager.GetString("ExStringDoesNotCorrespondToDescriptor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to String.Trim(char[]), String.TrimStart(char[]), string.TrimEnd(char[]) supported only with argument being array of constants.. + /// + internal static string ExStringTrimSupportedOnlyWithConstants { + get { + return ResourceManager.GetString("ExStringTrimSupportedOnlyWithConstants", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Structure of field '{0}' does not match structure of field '{1}'.. + /// + internal static string ExStructureOfFieldXDoesNotMatchStructureOfFieldY { + get { + return ResourceManager.GetString("ExStructureOfFieldXDoesNotMatchStructureOfFieldY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Structures do not support fields of type '{0}'.. + /// + internal static string ExStructuresDoNotSupportFieldsOfTypeX { + get { + return ResourceManager.GetString("ExStructuresDoNotSupportFieldsOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Structure '{0}' can't contain field of the same type.. + /// + internal static string ExStructureXCantContainFieldOfTheSameType { + get { + return ResourceManager.GetString("ExStructureXCantContainFieldOfTheSameType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System date \ time has been changed.. + /// + internal static string ExSystemTimeChanged { + get { + return ResourceManager.GetString("ExSystemTimeChanged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table already has specified name.. + /// + internal static string ExTableAlreadyHasSpecifiedName { + get { + return ResourceManager.GetString("ExTableAlreadyHasSpecifiedName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table is not set.. + /// + internal static string ExTablePropertyIsNotSet { + get { + return ResourceManager.GetString("ExTablePropertyIsNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table '{0}' can't be removed due to the foreign key '{1}' of a ignored table or column.. + /// + internal static string ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn { + get { + return ResourceManager.GetString("ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table '{0}' can't be removed due to the ignored column '{1}'.. + /// + internal static string ExTableXCantBeRemovedDueToTheIgnoredColumnY { + get { + return ResourceManager.GetString("ExTableXCantBeRemovedDueToTheIgnoredColumnY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table with name '{0}' is not found.. + /// + internal static string ExTableXIsNotFound { + get { + return ResourceManager.GetString("ExTableXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Take' does not support query provider of type '{0}'.. + /// + internal static string ExTakeDoesNotSupportQueryProviderOfTypeX { + get { + return ResourceManager.GetString("ExTakeDoesNotSupportQueryProviderOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Take({0})' not supported in compiled queries (Query.Execute). Use 'Take(Expression<Func<int>>)' instead.For example use 'Take(()=>{0})'.. + /// + internal static string ExTakeNotSupportedInCompiledQueries { + get { + return ResourceManager.GetString("ExTakeNotSupportedInCompiledQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target member is not found for compiler {0}. + /// + internal static string ExTargetMemberIsNotFoundForCompilerX { + get { + return ResourceManager.GetString("ExTargetMemberIsNotFoundForCompilerX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target object already exists: "{0}". To assign a new one, you must remove the old one first.. + /// + internal static string ExTargetObjectExistsX { + get { + return ResourceManager.GetString("ExTargetObjectExistsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temporary tables are not supported by current storage. + /// + internal static string ExTemporaryTablesAreNotSupportedByCurrentStorage { + get { + return ResourceManager.GetString("ExTemporaryTablesAreNotSupportedByCurrentStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Temporary table '{0}' is locked. + /// + internal static string ExTemporaryTableXIsLocked { + get { + return ResourceManager.GetString("ExTemporaryTableXIsLocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Term weight value must be between {0} and {1}. + /// + internal static string ExTermWeightValueMustBeBetweenXAndY { + get { + return ResourceManager.GetString("ExTermWeightValueMustBeBetweenXAndY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The data type must be exact numeric without scale or with zero scale.. + /// + internal static string ExTheDataTypeMustBeExactNumericWithoutScaleOrWithZeroScale { + get { + return ResourceManager.GetString("ExTheDataTypeMustBeExactNumericWithoutScaleOrWithZeroScale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The data type must be exact numeric with scale 0.. + /// + internal static string ExTheDataTypeMustBeExactNumericWithScale0 { + get { + return ResourceManager.GetString("ExTheDataTypeMustBeExactNumericWithScale0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The maximum value must be greater than the minimum value.. + /// + internal static string ExTheMaximumValueMustBeGreaterThanTheMinimumValue { + get { + return ResourceManager.GetString("ExTheMaximumValueMustBeGreaterThanTheMinimumValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The number of sources is too small. Expected number is {0}.. + /// + internal static string ExTheNumberOfSourcesIsTooSmallExpected { + get { + return ResourceManager.GetString("ExTheNumberOfSourcesIsTooSmallExpected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no suitable types in '{0}'.. + /// + internal static string ExThereAreNoSuitableTypes { + get { + return ResourceManager.GetString("ExThereAreNoSuitableTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no current HttpRequest, or SessionManager is not bound to it yet.. + /// + internal static string ExThereIsNoCurrentHttpRequestOrSessionManagerIsnTBoundToItYet { + get { + return ResourceManager.GetString("ExThereIsNoCurrentHttpRequestOrSessionManagerIsnTBoundToItYet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The scale must be less than or equal to precision.. + /// + internal static string ExTheScaleMustBeLessThanOrEqualToPrecision { + get { + return ResourceManager.GetString("ExTheScaleMustBeLessThanOrEqualToPrecision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The service is already attached to Session.. + /// + internal static string ExTheServiceIsAlreadyAttachedToSession { + get { + return ResourceManager.GetString("ExTheServiceIsAlreadyAttachedToSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The start value should be between the minimum and maximum value.. + /// + internal static string ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue { + get { + return ResourceManager.GetString("ExTheStartValueShouldBeBetweenTheMinimumAndMaximumValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This instance is expired due to transaction boundaries.. + /// + internal static string ExThisInstanceIsExpiredDueToTransactionBoundaries { + get { + return ResourceManager.GetString("ExThisInstanceIsExpiredDueToTransactionBoundaries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This method should not be called, use Apply(Session, Expression) instead. + /// + internal static string ExThisMethodShouldNotBeCalledUseApplySessionExpressionInstead { + get { + return ResourceManager.GetString("ExThisMethodShouldNotBeCalledUseApplySessionExpressionInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This operation is not allowed for the parameter context operating with expected values of parameters.. + /// + internal static string ExThisOperationIsNotAllowedForParameterContextOperatingWithExpectedValuesOfParameters { + get { + return ResourceManager.GetString("ExThisOperationIsNotAllowedForParameterContextOperatingWithExpectedValuesOfParame" + + "ters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This storage does not support '{0}'.. + /// + internal static string ExThisStorageDoesNotSupportX { + get { + return ResourceManager.GetString("ExThisStorageDoesNotSupportX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This storage does not support '{0}' values greather than '{1}'. Supplied value is '{2}'.. + /// + internal static string ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ { + get { + return ResourceManager.GetString("ExThisStorageDoesNotSupportXValuesGreatherThanYSuppliedValueIsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This storage does not support '{0}' values less than '{1}'. Supplied value is '{2}'.. + /// + internal static string ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ { + get { + return ResourceManager.GetString("ExThisStorageDoesNotSupportXValuesLessThanYSuppliedValueIsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction is already activated.. + /// + internal static string ExTransactionIsAlreadyActivated { + get { + return ResourceManager.GetString("ExTransactionIsAlreadyActivated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction is already open.. + /// + internal static string ExTransactionIsAlreadyOpen { + get { + return ResourceManager.GetString("ExTransactionIsAlreadyOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction is not active.. + /// + internal static string ExTransactionIsNotActive { + get { + return ResourceManager.GetString("ExTransactionIsNotActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction is not open.. + /// + internal static string ExTransactionIsNotOpen { + get { + return ResourceManager.GetString("ExTransactionIsNotOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A transaction is running, but there should be no active transaction.. + /// + internal static string ExTransactionIsRunning { + get { + return ResourceManager.GetString("ExTransactionIsRunning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TransactionScope.IsCompleted can not be set to 'false'.. + /// + internal static string ExTransactionScopeIsCompletedCanNotBeSetToFalse { + get { + return ResourceManager.GetString("ExTransactionScopeIsCompletedCanNotBeSetToFalse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction should be active. + /// + internal static string ExTransactionShouldBeActive { + get { + return ResourceManager.GetString("ExTransactionShouldBeActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transaction should not be active. + /// + internal static string ExTransactionShouldNotBeActive { + get { + return ResourceManager.GetString("ExTransactionShouldNotBeActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation of DateTime.ToString(string) with arbitrary arguments is not supported. Use DateTime.ToString("s").. + /// + internal static string ExTranslationOfDateTimeToStringWithArbitraryArgumentsIsNotSupported { + get { + return ResourceManager.GetString("ExTranslationOfDateTimeToStringWithArbitraryArgumentsIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation of In/Contains is not supported in this case. + /// + internal static string ExTranslationOfInContainsIsNotSupportedInThisCase { + get { + return ResourceManager.GetString("ExTranslationOfInContainsIsNotSupportedInThisCase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation of literal of type '{0}' is not supported.. + /// + internal static string ExTranslationOfLiteralOfTypeXIsNotSupported { + get { + return ResourceManager.GetString("ExTranslationOfLiteralOfTypeXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation of {0} method does not support any parameter type, but {1}.. + /// + internal static string ExTranslationOfXMethodDoesNotSupportAnyTypeOfParameterButY { + get { + return ResourceManager.GetString("ExTranslationOfXMethodDoesNotSupportAnyTypeOfParameterButY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type cannot be null.. + /// + internal static string ExTypeCantBeNull { + get { + return ResourceManager.GetString("ExTypeCantBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type column '{0}' for fulltext column'{1}' must be type of string.. + /// + internal static string ExTypeColumnXForFulltextColumnYMustBeTypeOfString { + get { + return ResourceManager.GetString("ExTypeColumnXForFulltextColumnYMustBeTypeOfString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeDef '{0}' already belongs to hierarchy with '{1}' root.. + /// + internal static string ExTypeDefXIsAlreadyBelongsToHierarchyWithTheRootY { + get { + return ResourceManager.GetString("ExTypeDefXIsAlreadyBelongsToHierarchyWithTheRootY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeDiscriminator field is already set.. + /// + internal static string ExTypeDiscriminatorFieldIsAlreadySet { + get { + return ResourceManager.GetString("ExTypeDiscriminatorFieldIsAlreadySet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type discriminator field is not found for '{0}' type. + /// + internal static string ExTypeDiscriminatorIsNotFoundForXType { + get { + return ResourceManager.GetString("ExTypeDiscriminatorIsNotFoundForXType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type discriminator value is required unless {0} is marked as default type in hierarchy.. + /// + internal static string ExTypeDiscriminatorValueIsRequiredUnlessXIsMarkedAsDefaultTypeInHierarchy { + get { + return ResourceManager.GetString("ExTypeDiscriminatorValueIsRequiredUnlessXIsMarkedAsDefaultTypeInHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' has no primary index.. + /// + internal static string ExTypeHasNoPrimaryIndex { + get { + return ResourceManager.GetString("ExTypeHasNoPrimaryIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeId for type '{0}' is not found.. + /// + internal static string ExTypeIdForTypeXIsNotFound { + get { + return ResourceManager.GetString("ExTypeIdForTypeXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeId is not assigned for type '{0}'.. + /// + internal static string ExTypeIdIsNotAssignedForTypeX { + get { + return ResourceManager.GetString("ExTypeIdIsNotAssignedForTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type with TypeId={0} is not registered.. + /// + internal static string ExTypeIdXIsNotRegistered { + get { + return ResourceManager.GetString("ExTypeIdXIsNotRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeInfo hierarchy does not correspond to provided hierarchy.. + /// + internal static string ExTypeInfoHierarchyMistmatch { + get { + return ResourceManager.GetString("ExTypeInfoHierarchyMistmatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'TypeIs' method supports only Entities and Structures.. + /// + internal static string ExTypeIsMethodSupportsOnlyEntitiesAndStructures { + get { + return ResourceManager.GetString("ExTypeIsMethodSupportsOnlyEntitiesAndStructures", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type is not supported by BinaryPrimitiveSerializer.. + /// + internal static string ExTypeIsNotSupportedByBinaryPrimitiveSerializer { + get { + return ResourceManager.GetString("ExTypeIsNotSupportedByBinaryPrimitiveSerializer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid type specified.. + /// + internal static string ExTypeMustBeEntityDescendant { + get { + return ResourceManager.GetString("ExTypeMustBeEntityDescendant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not found in model.. + /// + internal static string ExTypeNotFoundInModel { + get { + return ResourceManager.GetString("ExTypeNotFoundInModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of entity stored in Key is undefined.. + /// + internal static string ExTypeOfEntityStoredInKeyIsUndefined { + get { + return ResourceManager.GetString("ExTypeOfEntityStoredInKeyIsUndefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type of the expression's return value is not '{0}'.. + /// + internal static string ExTypeOfExpressionReturnValueIsNotX { + get { + return ResourceManager.GetString("ExTypeOfExpressionReturnValueIsNotX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of '{0}' must be a descendant of {1} type.. + /// + internal static string ExTypeOfXMustBeADescendantOfYType { + get { + return ResourceManager.GetString("ExTypeOfXMustBeADescendantOfYType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of {0} property must be {1}.. + /// + internal static string ExTypeOfXPropertyMustBeY { + get { + return ResourceManager.GetString("ExTypeOfXPropertyMustBeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Types of values are different. + /// + internal static string ExTypesOfValuesAreDifferent { + get { + return ResourceManager.GetString("ExTypesOfValuesAreDifferent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type with name '{0}' is already defined.. + /// + internal static string ExTypeWithNameXIsAlreadyDefined { + get { + return ResourceManager.GetString("ExTypeWithNameXIsAlreadyDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type with name '{0}' is not found in metadata.. + /// + internal static string ExTypeWithNameXIsNotFoundInMetadata { + get { + return ResourceManager.GetString("ExTypeWithNameXIsNotFoundInMetadata", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type with name '{0}' isn't registered in the Domain.. + /// + internal static string ExTypeWithNameXIsNotRegistered { + get { + return ResourceManager.GetString("ExTypeWithNameXIsNotRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type with type TypeId='{0}' is not found.. + /// + internal static string ExTypeWithTypeIdXIsNotFound { + get { + return ResourceManager.GetString("ExTypeWithTypeIdXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type {0} can't be transformed.. + /// + internal static string ExTypeXCanNotBeTransformed { + get { + return ResourceManager.GetString("ExTypeXCanNotBeTransformed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' can't contain Version fields, because it is not a hierarchy root type.. + /// + internal static string ExTypeXCantContainsVersionFieldsAsItsNotAHierarchyRoot { + get { + return ResourceManager.GetString("ExTypeXCantContainsVersionFieldsAsItsNotAHierarchyRoot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' declares clustered index '{1}', but only root type can declare clustered indexes in single table hierarhy. + /// + internal static string ExTypeXDeclaresClusteredIndexYButOnlyRootTypeCanDeclareClusteredIndexInSingleTableHierarchy { + get { + return ResourceManager.GetString("ExTypeXDeclaresClusteredIndexYButOnlyRootTypeCanDeclareClusteredIndexInSingleTabl" + + "eHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not contain '{1}' field.. + /// + internal static string ExTypeXDoesNotContainYField { + get { + return ResourceManager.GetString("ExTypeXDoesNotContainYField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not has any public readable properties or fields, so it can't be persisted to storage.. + /// + internal static string ExTypeXDoesNotHasAnyPublicReadablePropertiesOrFieldsSoItCanTBePersistedToStorage { + get { + return ResourceManager.GetString("ExTypeXDoesNotHasAnyPublicReadablePropertiesOrFieldsSoItCanTBePersistedToStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not have a parameterless constructor.. + /// + internal static string ExTypeXDoesNotHaveAParameterlessConstructor { + get { + return ResourceManager.GetString("ExTypeXDoesNotHaveAParameterlessConstructor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not have property '{1}'.. + /// + internal static string ExTypeXDoesNotHavePropertyY { + get { + return ResourceManager.GetString("ExTypeXDoesNotHavePropertyY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not implement '{1}' interface.. + /// + internal static string ExTypeXDoesNotImplementYInterface { + get { + return ResourceManager.GetString("ExTypeXDoesNotImplementYInterface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type {0} has already been registered.. + /// + internal static string ExTypeXHasAlreadyBeenRegistered { + get { + return ResourceManager.GetString("ExTypeXHasAlreadyBeenRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' has multiple clustered indexes: {1}. + /// + internal static string ExTypeXHasMultipleClusteredIndexesY { + get { + return ResourceManager.GetString("ExTypeXHasMultipleClusteredIndexesY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type {0} hasn't been registered.. + /// + internal static string ExTypeXHasNotBeenRegistered { + get { + return ResourceManager.GetString("ExTypeXHasNotBeenRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is already defined.. + /// + internal static string ExTypeXIsAlreadyDefined { + get { + return ResourceManager.GetString("ExTypeXIsAlreadyDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not collatable.. + /// + internal static string ExTypeXIsNotCollatable { + get { + return ResourceManager.GetString("ExTypeXIsNotCollatable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not found.. + /// + internal static string ExTypeXIsNotFound { + get { + return ResourceManager.GetString("ExTypeXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not registered.. + /// + internal static string ExTypeXIsNotRegistered { + get { + return ResourceManager.GetString("ExTypeXIsNotRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not registered in the model.. + /// + internal static string ExTypeXIsNotRegisteredInTheModel { + get { + return ResourceManager.GetString("ExTypeXIsNotRegisteredInTheModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not structure.. + /// + internal static string ExTypeXIsNotStructure { + get { + return ResourceManager.GetString("ExTypeXIsNotStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type {0} isn't a subclass of the type {1}.. + /// + internal static string ExTypeXIsNotSubclassOfTypeY { + get { + return ResourceManager.GetString("ExTypeXIsNotSubclassOfTypeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not supported.. + /// + internal static string ExTypeXIsNotSupported { + get { + return ResourceManager.GetString("ExTypeXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not supported in 'new' expression.. + /// + internal static string ExTypeXIsNotSupportedInNewExpression { + get { + return ResourceManager.GetString("ExTypeXIsNotSupportedInNewExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' must belong to hierarchy.. + /// + internal static string ExTypeXMustBelongToHierarchy { + get { + return ResourceManager.GetString("ExTypeXMustBelongToHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' must be non-abstract type.. + /// + internal static string ExTypeXMustBeNonAbstractType { + get { + return ResourceManager.GetString("ExTypeXMustBeNonAbstractType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' must be reference type.. + /// + internal static string ExTypeXMustBeReferenceType { + get { + return ResourceManager.GetString("ExTypeXMustBeReferenceType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' must implement '{1}', or must be its descendant.. + /// + internal static string ExTypeXMustImplementY { + get { + return ResourceManager.GetString("ExTypeXMustImplementY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' should not be generic.. + /// + internal static string ExTypeXShouldNotBeGeneric { + get { + return ResourceManager.GetString("ExTypeXShouldNotBeGeneric", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' was not registered for activation.. + /// + internal static string ExTypeXWasNotRegisteredForActivation { + get { + return ResourceManager.GetString("ExTypeXWasNotRegisteredForActivation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to activate EntitySet for '{0}' field because it does not has association.. + /// + internal static string ExUnableToActivateEntitySetWithoutAssociation { + get { + return ResourceManager.GetString("ExUnableToActivateEntitySetWithoutAssociation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to apply VersionAttribute with VersionMode.Auto or Version.Mode.Manual mode set on field {0} of type {1}. Only VersionMode.Skip is allowed.. + /// + internal static string ExUnableToApplyVersionOnFieldXOfTypeY { + get { + return ResourceManager.GetString("ExUnableToApplyVersionOnFieldXOfTypeY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to associate field '{0}' with field '{1}'. Field '{0}' is already mapped to field '{2}'.. + /// + internal static string ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ { + get { + return ResourceManager.GetString("ExUnableToAssociateFieldXWithFieldYFieldXIsAlreadyMappedToFieldZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to associate type '{0}' with type '{1}'. Type '{0}' is already mapped to type '{2}'.. + /// + internal static string ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ { + get { + return ResourceManager.GetString("ExUnableToAssociateTypeXWithTypeYTypeXIsAlreadyMappedToTypeZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to bind parameters to lambda {0}. Parameters count is incorrect.. + /// + internal static string ExUnableToBindParametersToLambdaXParametersCountIsIncorrect { + get { + return ResourceManager.GetString("ExUnableToBindParametersToLambdaXParametersCountIsIncorrect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build full-text indexes for hierarchy '{0}' with InheritanceSchema.ClassTable.. + /// + internal static string ExUnableToBuildFulltextIndexesForHierarchyWithInheritanceSchemaClassTable { + get { + return ResourceManager.GetString("ExUnableToBuildFulltextIndexesForHierarchyWithInheritanceSchemaClassTable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build generic instance types for '{0}' type because it contains more then 1 generic parameter.. + /// + internal static string ExUnableToBuildGenericInstanceTypesForXTypeBecauseItContainsMoreThen1GenericParameter { + get { + return ResourceManager.GetString("ExUnableToBuildGenericInstanceTypesForXTypeBecauseItContainsMoreThen1GenericParam" + + "eter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build generic instance types for '{0}' type because parameter is not constrained.. + /// + internal static string ExUnableToBuildGenericInstanceTypesForXTypeBecauseParameterIsNotConstrained { + get { + return ResourceManager.GetString("ExUnableToBuildGenericInstanceTypesForXTypeBecauseParameterIsNotConstrained", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build index {0} because it contains inherited fields.. + /// + internal static string ExUnableToBuildIndexXBecauseItWasBuiltOverInheritedFields { + get { + return ResourceManager.GetString("ExUnableToBuildIndexXBecauseItWasBuiltOverInheritedFields", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build subquery result for expression '{0}'. resultType is not IEnumerable<>.. + /// + internal static string ExUnableToBuildSubqueryResultForExpressionXResultTypeIsNotIEnumerable { + get { + return ResourceManager.GetString("ExUnableToBuildSubqueryResultForExpressionXResultTypeIsNotIEnumerable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to build subquery result for expression '{0}'. State contains no parameters.. + /// + internal static string ExUnableToBuildSubqueryResultForExpressionXStateContainsNoParameters { + get { + return ResourceManager.GetString("ExUnableToBuildSubqueryResultForExpressionXStateContainsNoParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to cast item of type '{0}' to '{1}' in queries.. + /// + internal static string ExUnableToCastItemOfTypeXToY { + get { + return ResourceManager.GetString("ExUnableToCastItemOfTypeXToY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to cast null value to {0}; use {0}? instead.. + /// + internal static string ExUnableToCastNullValueToXUseXInstead { + get { + return ResourceManager.GetString("ExUnableToCastNullValueToXUseXInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to clone non-user session configuration.. + /// + internal static string ExUnableToCloneNonUserSessionConfiguration { + get { + return ResourceManager.GetString("ExUnableToCloneNonUserSessionConfiguration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create the connection. Check if all needed assemblies are available.. + /// + internal static string ExUnableToCreateConnection { + get { + return ResourceManager.GetString("ExUnableToCreateConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create key for '{0}' hierarchy. Key value or key generator should be specified.. + /// + internal static string ExUnableToCreateKeyForXHierarchy { + get { + return ResourceManager.GetString("ExUnableToCreateKeyForXHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create provider instance. Check if provider's class has static "Instance" property.. + /// + internal static string ExUnableToCreateProviderInstance { + get { + return ResourceManager.GetString("ExUnableToCreateProviderInstance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to define type identifier '{0}' for type '{1}'. Type is not exists.. + /// + internal static string ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists { + get { + return ResourceManager.GetString("ExUnableToDefineTypeIdentifierXForTypeYTypeIsNotExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find column '{0}' of index '{1}' in primary index.. + /// + internal static string ExUnableToFindColumnInPrimaryIndex { + get { + return ResourceManager.GetString("ExUnableToFindColumnInPrimaryIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find factory method for type '{0}'. Make sure assembly '{0}' is processed by weaver. See section 2 of Manual for details.. + /// + internal static string ExUnableToFindFactoryMethodForTypeXMakeSureAssemblyYProcessedByWeaver { + get { + return ResourceManager.GetString("ExUnableToFindFactoryMethodForTypeXMakeSureAssemblyYProcessedByWeaver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find master association of association '{0}'. + /// + internal static string ExUnableToFindMasterAssociation { + get { + return ResourceManager.GetString("ExUnableToFindMasterAssociation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find type '{0}' in current model.. + /// + internal static string ExUnableToFindTypeXInCurrentModel { + get { + return ResourceManager.GetString("ExUnableToFindTypeXInCurrentModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to get TableColumn instance from index.. + /// + internal static string ExUnableToGetTableColumnInstanceFromIndex { + get { + return ResourceManager.GetString("ExUnableToGetTableColumnInstanceFromIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to get type of provider by name '{0}'.. + /// + internal static string ExUnableToGetTypeOfProviderByNameX { + get { + return ResourceManager.GetString("ExUnableToGetTypeOfProviderByNameX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to handle EntitySetExpression without specified Owner.. + /// + internal static string ExUnableToHandleEntitySetExpressionWithoutSpecifiedOwner { + get { + return ResourceManager.GetString("ExUnableToHandleEntitySetExpressionWithoutSpecifiedOwner", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to initialize JoinIndexProvider. Columns count mismatch.. + /// + internal static string ExUnableToInitializeJoinIndexProviderColumnsCountMismatch { + get { + return ResourceManager.GetString("ExUnableToInitializeJoinIndexProviderColumnsCountMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to materialize back local collection item '{0}'.. + /// + internal static string ExUnableToMaterializeBackLocalCollectionItem { + get { + return ResourceManager.GetString("ExUnableToMaterializeBackLocalCollectionItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to modify removed object.. + /// + internal static string ExUnableToModifyDeletedObject { + get { + return ResourceManager.GetString("ExUnableToModifyDeletedObject", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to parse prefetch expression '{0}'.. + /// + internal static string ExUnabletoParsePrefetchExpressionX { + get { + return ResourceManager.GetString("ExUnabletoParsePrefetchExpressionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to parse value '{0}' for field '{1}'. + /// + internal static string ExUnableToParseValueXForFieldY { + get { + return ResourceManager.GetString("ExUnableToParseValueXForFieldY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to persist type '{0}' to storage because of loop reference.. + /// + internal static string ExUnableToPersistTypeXBecauseOfLoopReference { + get { + return ResourceManager.GetString("ExUnableToPersistTypeXBecauseOfLoopReference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to process recycled field definition '{0}': owner type is not registered in model.. + /// + internal static string ExUnableToProcessRecycledFieldDefinitionXOwnerTypeIsNotRegisteredInModel { + get { + return ResourceManager.GetString("ExUnableToProcessRecycledFieldDefinitionXOwnerTypeIsNotRegisteredInModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to remap FieldExpression.. + /// + internal static string ExUnableToRemapFieldExpression { + get { + return ResourceManager.GetString("ExUnableToRemapFieldExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to remap KeyExpression.. + /// + internal static string ExUnableToRemapKeyExpression { + get { + return ResourceManager.GetString("ExUnableToRemapKeyExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to remap one of filtered columns.. + /// + internal static string ExUnableToRemapOneOfFilteredColumns { + get { + return ResourceManager.GetString("ExUnableToRemapOneOfFilteredColumns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to remove Owner from EntitySetExpression.. + /// + internal static string ExUnableToRemoveOwnerFromEntitySetExpression { + get { + return ResourceManager.GetString("ExUnableToRemoveOwnerFromEntitySetExpression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to resolve database for node '{0}'. Please verify that this database exists.. + /// + internal static string ExUnableToResolveDatabaseForNodeXPleaseVerifyThatThisDatabaseExists { + get { + return ResourceManager.GetString("ExUnableToResolveDatabaseForNodeXPleaseVerifyThatThisDatabaseExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to resolve owner of FieldExpression '{0}'.. + /// + internal static string ExUnableToResolveOwnerOfFieldExpressionX { + get { + return ResourceManager.GetString("ExUnableToResolveOwnerOfFieldExpressionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to resolve owner of StructureExpression '{0}'.. + /// + internal static string ExUnableToResolveOwnerOfStructureExpressionX { + get { + return ResourceManager.GetString("ExUnableToResolveOwnerOfStructureExpressionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to resolve schema for node '{0}'. Please verify that this schema exists.. + /// + internal static string ExUnableToResolveSchemaForNodeXPleaseVerifyThatThisSchemaExists { + get { + return ResourceManager.GetString("ExUnableToResolveSchemaForNodeXPleaseVerifyThatThisSchemaExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to resolve type for Key '{0}'.. + /// + internal static string ExUnableToResolveTypeForKeyX { + get { + return ResourceManager.GetString("ExUnableToResolveTypeForKeyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited started asynchronous queries before persisting any changes.. + /// + internal static string ExUnableToSaveModifiedEntitesBecauseOfIncompleteAsynchronousQueries { + get { + return ResourceManager.GetString("ExUnableToSaveModifiedEntitesBecauseOfIncompleteAsynchronousQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited asyncronous queries before persisting any changes.. + /// + internal static string ExUnableToSaveModifiedEntitesBecauseSomeAsynchronousQueryIsIncomplete { + get { + return ResourceManager.GetString("ExUnableToSaveModifiedEntitesBecauseSomeAsynchronousQueryIsIncomplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to set 'Indexed' flag on EntitySet field {0}.. + /// + internal static string ExUnableToSetIndexedFlagOnEntitySetFieldX { + get { + return ResourceManager.GetString("ExUnableToSetIndexedFlagOnEntitySetFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to set 'Indexed' flag on Structure field {0}.. + /// + internal static string ExUnableToSetIndexedFlagOnStructureFieldX { + get { + return ResourceManager.GetString("ExUnableToSetIndexedFlagOnStructureFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to set Key field '{0}' explicitly.. + /// + internal static string ExUnableToSetKeyFieldXExplicitly { + get { + return ResourceManager.GetString("ExUnableToSetKeyFieldXExplicitly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to store untyped 'Key' to storage. Use '{0}' instead of 'Key'.. + /// + internal static string ExUnableToStoreUntypedKeyToStorage { + get { + return ResourceManager.GetString("ExUnableToStoreUntypedKeyToStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate lambda expression '{0}' because it requires to materialize entity of type '{1}'.. + /// + internal static string ExUnableToTranslateLambdaExpressionXBecauseItRequiresToMaterializeEntityOfTypeX { + get { + return ResourceManager.GetString("ExUnableToTranslateLambdaExpressionXBecauseItRequiresToMaterializeEntityOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' expression. See inner exception for details.. + /// + internal static string ExUnableToTranslateXExpressionSeeInnerExceptionForDetails { + get { + return ResourceManager.GetString("ExUnableToTranslateXExpressionSeeInnerExceptionForDetails", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' in partial index definition for index '{1}'. Reason: {2}.. + /// + internal static string ExUnableToTranslateXInPartialIndexDefinitionForIndexYReasonZ { + get { + return ResourceManager.GetString("ExUnableToTranslateXInPartialIndexDefinitionForIndexYReasonZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to use base implementation of VisitGenericExpression without specifying genericProcessor delegate.. + /// + internal static string ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericProcessorDelegate { + get { + return ResourceManager.GetString("ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericPr" + + "ocessorDelegate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Usage of ElementAt(int) or ElementAtOrDefault(int) in Query.Execute is wrong. Use ElementAt(Func<int>) or ElementAtOrDefault(Func<int>) instead.. + /// + internal static string ExUnableToUseElementAtIntInQueryExecuteUseElementAtFuncIntInstead { + get { + return ResourceManager.GetString("ExUnableToUseElementAtIntInQueryExecuteUseElementAtFuncIntInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to use expression {0} as {1} parameter of lambda {2} because of type mistmatch.. + /// + internal static string ExUnableToUseExpressionXAsXParameterOfLambdaXBecauseOfTypeMistmatch { + get { + return ResourceManager.GetString("ExUnableToUseExpressionXAsXParameterOfLambdaXBecauseOfTypeMistmatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to use IQueryable '{0}' in Query.Execute statement.. + /// + internal static string ExUnableToUseIQueryableXInQueryExecuteStatement { + get { + return ResourceManager.GetString("ExUnableToUseIQueryableXInQueryExecuteStatement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unauthorized: the caller is declared outside of any of registered assemblies.. + /// + internal static string ExUnauthorizedAccessDeclarationOfCallerTypeIsNotInRegisteredAssembly { + get { + return ResourceManager.GetString("ExUnauthorizedAccessDeclarationOfCallerTypeIsNotInRegisteredAssembly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unbound column '{0}'.. + /// + internal static string ExUnboundColumn { + get { + return ResourceManager.GetString("ExUnboundColumn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ForeignKey is undefined.. + /// + internal static string ExUndefinedForeignKey { + get { + return ResourceManager.GetString("ExUndefinedForeignKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PrimaryKey is undefined.. + /// + internal static string ExUndefinedPrimaryKey { + get { + return ResourceManager.GetString("ExUndefinedPrimaryKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of column "{0}" is undefined.. + /// + internal static string ExUndefinedTypeOfColumnX { + get { + return ResourceManager.GetString("ExUndefinedTypeOfColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type of sequence "{0}" is undefined.. + /// + internal static string ExUndefinedTypeOfSequenceX { + get { + return ResourceManager.GetString("ExUndefinedTypeOfSequenceX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Underlying storage provider does not support SQL.. + /// + internal static string ExUnderlyingStorageProviderDoesNotSupportSQL { + get { + return ResourceManager.GetString("ExUnderlyingStorageProviderDoesNotSupportSQL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unexpected type of parameter.. + /// + internal static string ExUnexpectedTypeOfParameter { + get { + return ResourceManager.GetString("ExUnexpectedTypeOfParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown entity serialization kind '{0}'.. + /// + internal static string ExUnknownEntitySerializationKindX { + get { + return ResourceManager.GetString("ExUnknownEntitySerializationKindX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown expression type: '{0} ({1})'. + /// + internal static string ExUnknownExpressionType { + get { + return ResourceManager.GetString("ExUnknownExpressionType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}' expression. Unknown "In" syntax.. + /// + internal static string ExUnknownInSyntax { + get { + return ResourceManager.GetString("ExUnknownInSyntax", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not supported by current storage provider.. + /// + internal static string ExUnsupportedColumnType { + get { + return ResourceManager.GetString("ExUnsupportedColumnType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported expression type: '{0}'.. + /// + internal static string ExUnsupportedExpressionType { + get { + return ResourceManager.GetString("ExUnsupportedExpressionType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported field type: '{0}'. + /// + internal static string ExUnsupportedFieldTypeX { + get { + return ResourceManager.GetString("ExUnsupportedFieldTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index '{0}' with attributes '{1}' is not supported.. + /// + internal static string ExUnsupportedIndex { + get { + return ResourceManager.GetString("ExUnsupportedIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported type: '{0}'.. + /// + internal static string ExUnsupportedType { + get { + return ResourceManager.GetString("ExUnsupportedType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade hint error. Source field '{0}' not found.. + /// + internal static string ExUpgradeHintSourceFieldNotFound { + get { + return ResourceManager.GetString("ExUpgradeHintSourceFieldNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade hint error. Source type '{0}' not found.. + /// + internal static string ExUpgradeHintSourceTypeNotFound { + get { + return ResourceManager.GetString("ExUpgradeHintSourceTypeNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade hint error. Target field '{0}' not found.. + /// + internal static string ExUpgradeHintTargetFieldNotFound { + get { + return ResourceManager.GetString("ExUpgradeHintTargetFieldNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade hint error. Target type '{0}' not found.. + /// + internal static string ExUpgradeHintTargetTypeNotFound { + get { + return ResourceManager.GetString("ExUpgradeHintTargetTypeNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade of assembly '{0}' from version '{1}' to '{2}' is not supported.. + /// + internal static string ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported { + get { + return ResourceManager.GetString("ExUpgradeOfAssemblyXFromVersionYToZIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade sequence validation failure.. + /// + internal static string ExUpgradeSequenceValidationFailure { + get { + return ResourceManager.GetString("ExUpgradeSequenceValidationFailure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use LogCaptureScope constructor instead.. + /// + internal static string ExUseLogCaptureScopeConstructorInstead { + get { + return ResourceManager.GetString("ExUseLogCaptureScopeConstructorInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use LogIndentScope constructor instead.. + /// + internal static string ExUseLogIndentScopeConstructorInstead { + get { + return ResourceManager.GetString("ExUseLogIndentScopeConstructorInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}'. Use method ('{1}') on First/FirstOrDefault instead of Single/SingleOrDefault.. + /// + internal static string ExUseMethodXOnFirstInsteadOfSingle { + get { + return ResourceManager.GetString("ExUseMethodXOnFirstInsteadOfSingle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User defined type identifier '{0}' for type '{1}' less then 100.. + /// + internal static string ExUserDefinedTypeIdentifierXForTypeYLessThan100 { + get { + return ResourceManager.GetString("ExUserDefinedTypeIdentifierXForTypeYLessThan100", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to validateVersion=true is incompatible with PersistRequestKind=Insert. + /// + internal static string ExValidateVersionEqTrueIsIncompatibleWithPersistRequestKindEqInsert { + get { + return ResourceManager.GetString("ExValidateVersionEqTrueIsIncompatibleWithPersistRequestKindEqInsert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validation context is in invalid state. This means that some validation error has happened, but later it was suppressed.. + /// + internal static string ExValidationContextIsInvalid { + get { + return ResourceManager.GetString("ExValidationContextIsInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validation failed.. + /// + internal static string ExValidationFailed { + get { + return ResourceManager.GetString("ExValidationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validator '{0}' configuration failed on type '{1}' field '{2}'. {3}. + /// + internal static string ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA { + get { + return ResourceManager.GetString("ExValidatorXConfigurationFailedOnTypeYFieldZWithMessageA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validator '{0}' configuration failed on type '{1}'. {2}. + /// + internal static string ExValidatorXConfigurationFailedOnTypeYWithMessageZ { + get { + return ResourceManager.GetString("ExValidatorXConfigurationFailedOnTypeYWithMessageZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value for parameter '{0}' is not set.. + /// + internal static string ExValueForParameterXIsNotSet { + get { + return ResourceManager.GetString("ExValueForParameterXIsNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value for placeholder '{0}' is not set.. + /// + internal static string ExValueForPlaceholderXIsNotSet { + get { + return ResourceManager.GetString("ExValueForPlaceholderXIsNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value is already assigned.. + /// + internal static string ExValueIsAlreadyAssigned { + get { + return ResourceManager.GetString("ExValueIsAlreadyAssigned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}.{1}': '{2}' value is not acceptable for 'OnTargetRemove' property.. + /// + internal static string ExValueIsNotAcceptableForOnTargetRemoveProperty { + get { + return ResourceManager.GetString("ExValueIsNotAcceptableForOnTargetRemoveProperty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value is not available.. + /// + internal static string ExValueIsNotAvailable { + get { + return ResourceManager.GetString("ExValueIsNotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value of the parameter {0} can't be {1}, if the value of the parameter {2} is {3}.. + /// + internal static string ExValueOfParameterWCantBeXIfValueOfParameterYIsZ { + get { + return ResourceManager.GetString("ExValueOfParameterWCantBeXIfValueOfParameterYIsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should be '{0}' descendant.. + /// + internal static string ExValueShouldBeXDescendant { + get { + return ResourceManager.GetString("ExValueShouldBeXDescendant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value with name '{0}' already exists.. + /// + internal static string ExValueWithNameXAlreadyExists { + get { + return ResourceManager.GetString("ExValueWithNameXAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value with name '{0}' is not found.. + /// + internal static string ExValueWithNameXIsNotFound { + get { + return ResourceManager.GetString("ExValueWithNameXIsNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not allowed or invalid here.. + /// + internal static string ExValueXIsNotAllowedHere { + get { + return ResourceManager.GetString("ExValueXIsNotAllowedHere", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version conflict.. + /// + internal static string ExVersionConflict { + get { + return ResourceManager.GetString("ExVersionConflict", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version conflict on object {0}: expected: {1} = {2}, but it is {3}.. + /// + internal static string ExVersionConflictEx { + get { + return ResourceManager.GetString("ExVersionConflictEx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version field '{0}' can't be LazyLoad field.. + /// + internal static string ExVersionFieldXCanTBeLazyLoadField { + get { + return ResourceManager.GetString("ExVersionFieldXCanTBeLazyLoadField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version field '{0}' can't be of {1} type.. + /// + internal static string ExVersionFieldXCanTBeOfYType { + get { + return ResourceManager.GetString("ExVersionFieldXCanTBeOfYType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version field '{0}' can't be System field.. + /// + internal static string ExVersionFieldXCanTBeSystemField { + get { + return ResourceManager.GetString("ExVersionFieldXCanTBeSystemField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version of entity with key '{0}' differs from the expected one.. + /// + internal static string ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne { + get { + return ResourceManager.GetString("ExVersionOfEntityWithKeyXDiffersFromTheExpectedOne", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version root object can't implement IHasVersionRoots.. + /// + internal static string ExVersionRootObjectCantImplementIHasVersionRoots { + get { + return ResourceManager.GetString("ExVersionRootObjectCantImplementIHasVersionRoots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VisitKeyField is not supported by '{0}'.. + /// + internal static string ExVisitKeyFieldIsNotSupportedByX { + get { + return ResourceManager.GetString("ExVisitKeyFieldIsNotSupportedByX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wrong key structure.. + /// + internal static string ExWrongKeyStructure { + get { + return ResourceManager.GetString("ExWrongKeyStructure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wrong persistent type candidate: '{0}'.. + /// + internal static string ExWrongPersistentTypeCandidate { + get { + return ResourceManager.GetString("ExWrongPersistentTypeCandidate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Source collection contains at least one item of type "{0}", that cannot be cast to the item type of the destination collection.. + /// + internal static string ExWrongSourceCollectionElementType { + get { + return ResourceManager.GetString("ExWrongSourceCollectionElementType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} can't be executed on specified sources.. + /// + internal static string ExXCantBeExecuted { + get { + return ResourceManager.GetString("ExXCantBeExecuted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' descendant is already a root of another hierarchy.. + /// + internal static string ExXDescendantIsAlreadyARootOfAnotherHierarchy { + get { + return ResourceManager.GetString("ExXDescendantIsAlreadyARootOfAnotherHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' does not support '{1}'.. + /// + internal static string ExXDoesNotSupportX { + get { + return ResourceManager.GetString("ExXDoesNotSupportX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' field is not declared in Entity descendant, so cannot be used as type discriminator.. + /// + internal static string ExXFieldIsNotDeclaredInEntityDescendantSoCannotBeUsedAsTypeDiscriminator { + get { + return ResourceManager.GetString("ExXFieldIsNotDeclaredInEntityDescendantSoCannotBeUsedAsTypeDiscriminator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} implementors don't belong to any hierarchy.. + /// + internal static string ExXImplementorsDontBelongToAnyHierarchy { + get { + return ResourceManager.GetString("ExXImplementorsDontBelongToAnyHierarchy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The {0} is neither class nor value type.. + /// + internal static string ExXIsNeitherClassNorValueType { + get { + return ResourceManager.GetString("ExXIsNeitherClassNorValueType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not suitable field for full-text search. + /// + internal static string ExXIsNotSuitableFieldFoFullTextSearch { + get { + return ResourceManager.GetString("ExXIsNotSuitableFieldFoFullTextSearch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not supported. + /// + internal static string ExXIsNotSupported { + get { + return ResourceManager.GetString("ExXIsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not valid name for {1}.. + /// + internal static string ExXIsNotValidNameForX { + get { + return ResourceManager.GetString("ExXIsNotValidNameForX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is obsolete. Use {1} and {2} instead.. + /// + internal static string ExXIsObsoleteUseYAndZInstead { + get { + return ResourceManager.GetString("ExXIsObsoleteUseYAndZInstead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' must be active.. + /// + internal static string ExXMustBeActive { + get { + return ResourceManager.GetString("ExXMustBeActive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' must be inherited from '{1}'.. + /// + internal static string ExXMustBeInheritedFromX { + get { + return ResourceManager.GetString("ExXMustBeInheritedFromX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' name can't be empty.. + /// + internal static string ExXNameCantBeEmpty { + get { + return ResourceManager.GetString("ExXNameCantBeEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be of type '{4}' but actually it is '{5}'.. + /// + internal static string ExXYFieldPairedToZAFieldShouldBeBButCurrentIsC { + get { + return ResourceManager.GetString("ExXYFieldPairedToZAFieldShouldBeBButCurrentIsC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be 'EntitySet<{4}>' but it is 'EntitySet<{5}>'.. + /// + internal static string ExXYFieldPairedToZAFieldShouldBeEntitySetOfBButCurrentIsC { + get { + return ResourceManager.GetString("ExXYFieldPairedToZAFieldShouldBeEntitySetOfBButCurrentIsC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must either apply or cancel cached changes before changing this property.. + /// + internal static string ExYouMustEitherApplyOrCancelCachedChangesToChangeThisProperty { + get { + return ResourceManager.GetString("ExYouMustEitherApplyOrCancelCachedChangesToChangeThisProperty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create regular expression from pattern '{0}'.. + /// + internal static string FailedToCreateRegularExpressionFromPatternX { + get { + return ResourceManager.GetString("FailedToCreateRegularExpressionFromPatternX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field should be of comparable type.. + /// + internal static string FieldShouldBeOfComparableType { + get { + return ResourceManager.GetString("FieldShouldBeOfComparableType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field should be of type '{0}'.. + /// + internal static string FieldShouldBeOfTypeX { + get { + return ResourceManager.GetString("FieldShouldBeOfTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field: {0};. + /// + internal static string FieldX { + get { + return ResourceManager.GetString("FieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to field '{0}' does not exist in table for '{1}'. + /// + internal static string FieldXDoesNotExistInTableForY { + get { + return ResourceManager.GetString("FieldXDoesNotExistInTableForY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is complex and cannot be used for search.. + /// + internal static string FieldXIsComplexAndCannotBeUsedForSearch { + get { + return ResourceManager.GetString("FieldXIsComplexAndCannotBeUsedForSearch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to full. + /// + internal static string Full { + get { + return ResourceManager.GetString("Full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full text queries. + /// + internal static string FullTextQueries { + get { + return ResourceManager.GetString("FullTextQueries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generators. + /// + internal static string Generators { + get { + return ResourceManager.GetString("Generators", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} (v{1}). + /// + internal static string HasVersionFormat { + get { + return ResourceManager.GetString("HasVersionFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hierarchy columns. + /// + internal static string HierarchyColumns { + get { + return ResourceManager.GetString("HierarchyColumns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Indexes. + /// + internal static string Indexes { + get { + return ResourceManager.GetString("Indexes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}{1}d. + /// + internal static string InfinitesimalFormat { + get { + return ResourceManager.GetString("InfinitesimalFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to inf. + /// + internal static string Infinity { + get { + return ResourceManager.GetString("Infinity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} change(s). + /// + internal static string ItemChangeCountFormat { + get { + return ResourceManager.GetString("ItemChangeCountFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}. + /// + internal static string ItemChangeFormat { + get { + return ResourceManager.GetString("ItemChangeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to translate '{0}'. Join keys length mismatch.. + /// + internal static string JoinKeysLengthMismatch { + get { + return ResourceManager.GetString("JoinKeysLengthMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}, {1}. + /// + internal static string KeyFormat { + get { + return ResourceManager.GetString("KeyFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} (unknown), {1}. + /// + internal static string KeyFormatUnknownKeyType { + get { + return ResourceManager.GetString("KeyFormatUnknownKeyType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key generators. + /// + internal static string KeyGenerators { + get { + return ResourceManager.GetString("KeyGenerators", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key mapping. + /// + internal static string KeyMapping { + get { + return ResourceManager.GetString("KeyMapping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to known. + /// + internal static string Known { + get { + return ResourceManager.GetString("Known", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Length. + /// + internal static string Length { + get { + return ResourceManager.GetString("Length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Async operation error.. + /// + internal static string LogAsyncOperationError { + get { + return ResourceManager.GetString("LogAsyncOperationError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attempt to use disposed instance of type '{0}'.. + /// + internal static string LogAttemptToUseDisposedInstance { + get { + return ResourceManager.GetString("LogAttemptToUseDisposedInstance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic upgrade sequence validation. + /// + internal static string LogAutomaticUpgradeSequenceValidation { + get { + return ResourceManager.GetString("LogAutomaticUpgradeSequenceValidation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Building declared field '{0}.{1}'. + /// + internal static string LogBuildingDeclaredFieldXY { + get { + return ResourceManager.GetString("LogBuildingDeclaredFieldXY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Building index '{0}'. + /// + internal static string LogBuildingIndexX { + get { + return ResourceManager.GetString("LogBuildingIndexX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Building inherited field '{0}.{1}'. + /// + internal static string LogBuildingInheritedFieldXY { + get { + return ResourceManager.GetString("LogBuildingInheritedFieldXY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Building interface field '{0}.{1}'. + /// + internal static string LogBuildingInterfaceFieldXY { + get { + return ResourceManager.GetString("LogBuildingInterfaceFieldXY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Building {0}. + /// + internal static string LogBuildingX { + get { + return ResourceManager.GetString("LogBuildingX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calculating database dependencies. + /// + internal static string LogCalculatingDatabaseDependencies { + get { + return ResourceManager.GetString("LogCalculatingDatabaseDependencies", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Can't find {0} ('{1}') for type '{2}'.. + /// + internal static string LogCantFindAssociateFor { + get { + return ResourceManager.GetString("LogCantFindAssociateFor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changes are successfully applied.. + /// + internal static string LogChangesAreSuccessfullyApplied { + get { + return ResourceManager.GetString("LogChangesAreSuccessfullyApplied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clearing comparison result: + ///{0}. + /// + internal static string LogClearingComparisonResultX { + get { + return ResourceManager.GetString("LogClearingComparisonResultX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Comparison result: + ///{0}. + /// + internal static string LogComparisonResultX { + get { + return ResourceManager.GetString("LogComparisonResultX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection restore failed.. + /// + internal static string LogConnectionRestoreFailed { + get { + return ResourceManager.GetString("LogConnectionRestoreFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection successfully restored.. + /// + internal static string LogConnectionSuccessfullyRestored { + get { + return ResourceManager.GetString("LogConnectionSuccessfullyRestored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Creating {0}. + /// + internal static string LogCreatingX { + get { + return ResourceManager.GetString("LogCreatingX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Defining field '{0}'. + /// + internal static string LogDefiningFieldX { + get { + return ResourceManager.GetString("LogDefiningFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Defining hierarchy for type '{0}'. + /// + internal static string LogDefiningHierarchyForTypeX { + get { + return ResourceManager.GetString("LogDefiningHierarchyForTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Defining indexes. + /// + internal static string LogDefiningIndexes { + get { + return ResourceManager.GetString("LogDefiningIndexes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Defining '{0}'. + /// + internal static string LogDefiningX { + get { + return ResourceManager.GetString("LogDefiningX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DisconnectedState.CancelChanges. + /// + internal static string LogDisconnectedStateCancelChanges { + get { + return ResourceManager.GetString("LogDisconnectedStateCancelChanges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Domain is disposing.. + /// + internal static string LogDomainIsDisposing { + get { + return ResourceManager.GetString("LogDomainIsDisposing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Domain is disposing by a finalizer.. + /// + internal static string LogDomainIsDisposingByAFinalizer { + get { + return ResourceManager.GetString("LogDomainIsDisposingByAFinalizer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Domain model is not found in the storage.. + /// + internal static string LogDomainModelIsNotFoundInStorage { + get { + return ResourceManager.GetString("LogDomainModelIsNotFoundInStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exception!. + /// + internal static string LogException { + get { + return ResourceManager.GetString("LogException", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Executing action: '{0}'. + /// + internal static string LogExecutingActionX { + get { + return ResourceManager.GetString("LogExecutingActionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error setting default value {0} for column '{1}' in type '{2}'. Most likely, its type is incorrect.. + /// + internal static string LogExErrorSettingDefaultValueXForColumnYInTypeZ { + get { + return ResourceManager.GetString("LogExErrorSettingDefaultValueXForColumnYInTypeZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Explicit LazyLoad=true on field '{0}' is redundant.. + /// + internal static string LogExplicitLazyLoadAttributeOnFieldXIsRedundant { + get { + return ResourceManager.GetString("LogExplicitLazyLoadAttributeOnFieldXIsRedundant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extracted schema:. + /// + internal static string LogExtractedSchema { + get { + return ResourceManager.GetString("LogExtractedSchema", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to add schema hint '{0}' to schema hint collection. The hint will be ignored. + ///Likely, the schema object (table, column, etc.) it references does not exists, because it was manually removed from the database. + ///Error: {1}. + /// + internal static string LogFailedToAddSchemaHintXErrorY { + get { + return ResourceManager.GetString("LogFailedToAddSchemaHintXErrorY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to extract domain model from the storage.. + /// + internal static string LogFailedToExtractDomainModelFromStorage { + get { + return ResourceManager.GetString("LogFailedToExtractDomainModelFromStorage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to extract metadata from '{0}.{1}': {2}. + /// + internal static string LogFailedToExtractMetadataFromXYZ { + get { + return ResourceManager.GetString("LogFailedToExtractMetadataFromXYZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field: '{0}'. + /// + internal static string LogFieldX { + get { + return ResourceManager.GetString("LogFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full text indexes are not supported by current storage, ignoring index '{0}'. + /// + internal static string LogFullTextIndexesAreNotSupportedByCurrentStorageIgnoringIndexX { + get { + return ResourceManager.GetString("LogFullTextIndexesAreNotSupportedByCurrentStorageIgnoringIndexX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}<{1}, {2}>' creation has failed for '{3}'.. + /// + internal static string LogGenericAssociateCreationHasFailedFor { + get { + return ResourceManager.GetString("LogGenericAssociateCreationHasFailedFor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}<{1}, {2}>' was used for '{3}'.. + /// + internal static string LogGenericAssociateIsUsedFor { + get { + return ResourceManager.GetString("LogGenericAssociateIsUsedFor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Given connection is corrupted. Trying to restore the connection.. + /// + internal static string LogGivenConnectionIsCorruptedTryingToRestoreTheConnection { + get { + return ResourceManager.GetString("LogGivenConnectionIsCorruptedTryingToRestoreTheConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hierarchy: '{0}'. + /// + internal static string LogHierarchyX { + get { + return ResourceManager.GetString("LogHierarchyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index: '{0}'. + /// + internal static string LogIndexX { + get { + return ResourceManager.GetString("LogIndexX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inspecting hierarchy '{0}'. + /// + internal static string LogInspectingHierarchyX { + get { + return ResourceManager.GetString("LogInspectingHierarchyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inspecting model definition. + /// + internal static string LogInspectingModelDefinition { + get { + return ResourceManager.GetString("LogInspectingModelDefinition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inspecting type '{0}'. + /// + internal static string LogInspectingTypeX { + get { + return ResourceManager.GetString("LogInspectingTypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}:. + /// + internal static string LogItemFormat { + get { + return ResourceManager.GetString("LogItemFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metadata.Assembly created: '{0}'.. + /// + internal static string LogMetadataAssemblyCreatedX { + get { + return ResourceManager.GetString("LogMetadataAssemblyCreatedX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metadata.Assembly updated: '{0}', from version '{1}' to '{2}'.. + /// + internal static string LogMetadataAssemblyUpdatedXFromVersionYToZ { + get { + return ResourceManager.GetString("LogMetadataAssemblyUpdatedXFromVersionYToZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metadata.Type renamed: '{0}' to '{1}'.. + /// + internal static string LogMetadataTypeRenamedXToY { + get { + return ResourceManager.GetString("LogMetadataTypeRenamedXToY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Opening session '{0}'.. + /// + internal static string LogOpeningSessionX { + get { + return ResourceManager.GetString("LogOpeningSessionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Processing fixup actions. + /// + internal static string LogProcessingFixupActions { + get { + return ResourceManager.GetString("LogProcessingFixupActions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Processing mapping rules. + /// + internal static string LogProcessingMappingRules { + get { + return ResourceManager.GetString("LogProcessingMappingRules", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Processing '{0}'. + /// + internal static string LogProcessingX { + get { + return ResourceManager.GetString("LogProcessingX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: started.. + /// + internal static string LogRegionBegin { + get { + return ResourceManager.GetString("LogRegionBegin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: completed.. + /// + internal static string LogRegionEnd { + get { + return ResourceManager.GetString("LogRegionEnd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error during undoing the relation synchronization.. + /// + internal static string LogRelationSyncUndoError { + get { + return ResourceManager.GetString("LogRelationSyncUndoError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reusing cached mapping information for '{0}'. + /// + internal static string LogReusingCachedMappingInformationForX { + get { + return ResourceManager.GetString("LogReusingCachedMappingInformationForX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Safe dispose of '{0}' failing.. + /// + internal static string LogSafeDisposeFailing { + get { + return ResourceManager.GetString("LogSafeDisposeFailing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scope dispose error.. + /// + internal static string LogScopeDisposeError { + get { + return ResourceManager.GetString("LogScopeDisposeError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SessionManager.EndRequest method was not invoked during processing of the previous request to this module.. + /// + internal static string LogSessionManagerEndRequestMethodWasNotInvoked { + get { + return ResourceManager.GetString("LogSessionManagerEndRequestMethodWasNotInvoked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Beginning transaction @ {1}.. + /// + internal static string LogSessionXBeginningTransactionWithYIsolationLevel { + get { + return ResourceManager.GetString("LogSessionXBeginningTransactionWithYIsolationLevel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Caching: {1}.. + /// + internal static string LogSessionXCachingY { + get { + return ResourceManager.GetString("LogSessionXCachingY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Closing connection '{1}'.. + /// + internal static string LogSessionXClosingConnectionY { + get { + return ResourceManager.GetString("LogSessionXClosingConnectionY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Committed transaction.. + /// + internal static string LogSessionXCommittedTransaction { + get { + return ResourceManager.GetString("LogSessionXCommittedTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Committing transaction.. + /// + internal static string LogSessionXCommittingTransaction { + get { + return ResourceManager.GetString("LogSessionXCommittingTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Commit transaction.. + /// + internal static string LogSessionXCommitTransaction { + get { + return ResourceManager.GetString("LogSessionXCommitTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Creating connection.. + /// + internal static string LogSessionXCreatingConnection { + get { + return ResourceManager.GetString("LogSessionXCreatingConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. DisconnectedState.ApplyChanges. + /// + internal static string LogSessionXDisconnectedStateApplyChanges { + get { + return ResourceManager.GetString("LogSessionXDisconnectedStateApplyChanges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. DisconnectedState.Attach. + /// + internal static string LogSessionXDisconnectedStateAttach { + get { + return ResourceManager.GetString("LogSessionXDisconnectedStateAttach", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. DisconnectedState.Connect(). + /// + internal static string LogSessionXDisconnectedStateConnect { + get { + return ResourceManager.GetString("LogSessionXDisconnectedStateConnect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. DisconnectedState is disconnected. + /// + internal static string LogSessionXDisconnectedStateDisconnect { + get { + return ResourceManager.GetString("LogSessionXDisconnectedStateDisconnect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Disposing.. + /// + internal static string LogSessionXDisposing { + get { + return ResourceManager.GetString("LogSessionXDisposing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Disposing connection.. + /// + internal static string LogSessionXDisposingConnection { + get { + return ResourceManager.GetString("LogSessionXDisposingConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Identifying entity: Key = '{1}', identified as '{2}'.. + /// + internal static string LogSessionXEntityWithKeyYIdentifiedAsZ { + get { + return ResourceManager.GetString("LogSessionXEntityWithKeyYIdentifiedAsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Getting value: Key = '{1}', Field = '{2}'.. + /// + internal static string LogSessionXGettingValueKeyYFieldZ { + get { + return ResourceManager.GetString("LogSessionXGettingValueKeyYFieldZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Invalidate.. + /// + internal static string LogSessionXInvalidate { + get { + return ResourceManager.GetString("LogSessionXInvalidate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Make savepoint '{1}'.. + /// + internal static string LogSessionXMakeSavepointY { + get { + return ResourceManager.GetString("LogSessionXMakeSavepointY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Materializing {1}: Key = '{2}'.. + /// + internal static string LogSessionXMaterializingYKeyZ { + get { + return ResourceManager.GetString("LogSessionXMaterializingYKeyZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Opening connection '{1}'.. + /// + internal static string LogSessionXOpeningConnectionY { + get { + return ResourceManager.GetString("LogSessionXOpeningConnectionY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Opening transaction.. + /// + internal static string LogSessionXOpeningTransaction { + get { + return ResourceManager.GetString("LogSessionXOpeningTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Persist completed.. + /// + internal static string LogSessionXPersistCompleted { + get { + return ResourceManager.GetString("LogSessionXPersistCompleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Persisting (reason: {1}).. + /// + internal static string LogSessionXPersistingReasonY { + get { + return ResourceManager.GetString("LogSessionXPersistingReasonY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. SQL batch: + ///{1}. + /// + internal static string LogSessionXQueryY { + get { + return ResourceManager.GetString("LogSessionXQueryY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Release savepoint '{1}'.. + /// + internal static string LogSessionXReleaseSavepointY { + get { + return ResourceManager.GetString("LogSessionXReleaseSavepointY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Remapping entity keys.. + /// + internal static string LogSessionXRemappingEntityKeys { + get { + return ResourceManager.GetString("LogSessionXRemappingEntityKeys", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Removing: Key = '{1}'.. + /// + internal static string LogSessionXRemovingKeyY { + get { + return ResourceManager.GetString("LogSessionXRemovingKeyY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Exact type is unknown. Fetch is required.. + /// + internal static string LogSessionXResolvingKeyYExactTypeIsUnknownFetchIsRequired { + get { + return ResourceManager.GetString("LogSessionXResolvingKeyYExactTypeIsUnknownFetchIsRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Exact type is {2}.. + /// + internal static string LogSessionXResolvingKeyYExactTypeIsZ { + get { + return ResourceManager.GetString("LogSessionXResolvingKeyYExactTypeIsZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Resolving key '{1}'. Key is already resolved.. + /// + internal static string LogSessionXResolvingKeyYKeyIsAlreadyResolved { + get { + return ResourceManager.GetString("LogSessionXResolvingKeyYKeyIsAlreadyResolved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Rollback to savepoint '{1}'.. + /// + internal static string LogSessionXRollbackToSavepointY { + get { + return ResourceManager.GetString("LogSessionXRollbackToSavepointY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Rollback transaction.. + /// + internal static string LogSessionXRollbackTransaction { + get { + return ResourceManager.GetString("LogSessionXRollbackTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Rolled back transaction.. + /// + internal static string LogSessionXRolledBackTransaction { + get { + return ResourceManager.GetString("LogSessionXRolledBackTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Rolling back transaction.. + /// + internal static string LogSessionXRollingBackTransaction { + get { + return ResourceManager.GetString("LogSessionXRollingBackTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Schema upgrade script: + ///{1}. + /// + internal static string LogSessionXSchemaUpgradeScriptY { + get { + return ResourceManager.GetString("LogSessionXSchemaUpgradeScriptY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Setting value: Key = '{1}', Field = '{2}'.. + /// + internal static string LogSessionXSettingValueKeyYFieldZ { + get { + return ResourceManager.GetString("LogSessionXSettingValueKeyYFieldZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Transaction. + /// + internal static string LogSessionXTransaction { + get { + return ResourceManager.GetString("LogSessionXTransaction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Updating cache: {1}.. + /// + internal static string LogSessionXUpdatingCacheY { + get { + return ResourceManager.GetString("LogSessionXUpdatingCacheY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session '{0}'. Version validation failed: Key = '{1}', Version = '{2}' (expected version = '{3}').. + /// + internal static string LogSessionXVersionValidationFailedKeyYVersionZExpected3 { + get { + return ResourceManager.GetString("LogSessionXVersionValidationFailedKeyYVersionZExpected3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skipping entity '{0}' as it does not belong to any hierarchy thus it cannot be persistent.. + /// + internal static string LogSkippingEntityXAsItDoesNotBelongToAnyHierarchyThusItCannotBePersistent { + get { + return ResourceManager.GetString("LogSkippingEntityXAsItDoesNotBelongToAnyHierarchyThusItCannotBePersistent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skipping schema synchronization.. + /// + internal static string LogSkippingSchemaSynchronization { + get { + return ResourceManager.GetString("LogSkippingSchemaSynchronization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specification of type column for fulltext column is not supported by current storage. Ignoring type column specification for column '{0}'.. + /// + internal static string LogSpecificationOfTypeColumnForFulltextColumnIsNotSupportedByCurrentStorageIgnoringTypeColumnSpecificationForColumnX { + get { + return ResourceManager.GetString("LogSpecificationOfTypeColumnForFulltextColumnIsNotSupportedByCurrentStorageIgnori" + + "ngTypeColumnSpecificationForColumnX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage '{0}' does not support partial indexes, ignoring filter for partial index '{0}'.. + /// + internal static string LogStorageXDoesNotSupportPartialIndexesIgnoringFilterForPartialIndexY { + get { + return ResourceManager.GetString("LogStorageXDoesNotSupportPartialIndexesIgnoringFilterForPartialIndexY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SyncContext must have no pending actions at this point.. + /// + internal static string LogSyncContextMustHaveNoPendingActions { + get { + return ResourceManager.GetString("LogSyncContextMustHaveNoPendingActions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Synchronizing schema in {0} mode. + /// + internal static string LogSynchronizingSchemaInXMode { + get { + return ResourceManager.GetString("LogSynchronizingSchemaInXMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target schema:. + /// + internal static string LogTargetSchema { + get { + return ResourceManager.GetString("LogTargetSchema", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to close single available connection: it is still used by session '{0}'.. + /// + internal static string LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX { + get { + return ResourceManager.GetString("LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to get default hasher for type {0}. + /// + internal static string LogUnableToGetDefaultHasherForTypeXxx { + get { + return ResourceManager.GetString("LogUnableToGetDefaultHasherForTypeXxx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to get default SQL comparer for type {0}.. + /// + internal static string LogUnableToGetDefaultNodeComparerForTypeXxx { + get { + return ResourceManager.GetString("LogUnableToGetDefaultNodeComparerForTypeXxx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error during Undo execution: descriptor {0}.. + /// + internal static string LogUndoError { + get { + return ResourceManager.GetString("LogUndoError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validating mapping configuration. + /// + internal static string LogValidatingMappingConfiguration { + get { + return ResourceManager.GetString("LogValidatingMappingConfiguration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validation failed.. + /// + internal static string LogValidationFailed { + get { + return ResourceManager.GetString("LogValidationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 'Max' or 'Min' property should be specified.. + /// + internal static string MaxOrMinPropertyShouldBeSpecified { + get { + return ResourceManager.GetString("MaxOrMinPropertyShouldBeSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to member access sequence contains non-persistent fields. + /// + internal static string MemberAccessSequenceContainsNonPersistentFields { + get { + return ResourceManager.GetString("MemberAccessSequenceContainsNonPersistentFields", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} (Version={1}). + /// + internal static string MetadataAssemblyFormat { + get { + return ResourceManager.GetString("MetadataAssemblyFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} (Id={1}). + /// + internal static string MetadataTypeFormat { + get { + return ResourceManager.GetString("MetadataTypeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Model. + /// + internal static string Model { + get { + return ResourceManager.GetString("Model", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Model Definition. + /// + internal static string ModelDefinition { + get { + return ResourceManager.GetString("ModelDefinition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to n/a. + /// + internal static string NA { + get { + return ResourceManager.GetString("NA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Native type. + /// + internal static string NativeType { + get { + return ResourceManager.GetString("NativeType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}.{1}. + /// + internal static string NodeCollectionFullNameFormat { + get { + return ResourceManager.GetString("NodeCollectionFullNameFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string NodeFormat { + get { + return ResourceManager.GetString("NodeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string NodeInfoFormat { + get { + return ResourceManager.GetString("NodeInfoFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to n/a. + /// + internal static string NotAvailable { + get { + return ResourceManager.GetString("NotAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to null. + /// + internal static string Null { + get { + return ResourceManager.GetString("Null", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ?. + /// + internal static string NullableMark { + get { + return ResourceManager.GetString("NullableMark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to only primitive and reference fields are supported. + /// + internal static string OnlyPrimitiveAndReferenceFieldsAreSupported { + get { + return ResourceManager.GetString("OnlyPrimitiveAndReferenceFieldsAreSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operations. + /// + internal static string Operations { + get { + return ResourceManager.GetString("Operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Original exception(s). + /// + internal static string OriginalExceptions { + get { + return ResourceManager.GetString("OriginalExceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Original message '{0}'. + /// + internal static string OriginalMessageX { + get { + return ResourceManager.GetString("OriginalMessageX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0}, {1}). + /// + internal static string PairFormat { + get { + return ResourceManager.GetString("PairFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to parameters of type other than '{0}' are not supported. + /// + internal static string ParametersOfTypeOtherThanXAreNotSupported { + get { + return ResourceManager.GetString("ParametersOfTypeOtherThanXAreNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to partial. + /// + internal static string Partial { + get { + return ResourceManager.GetString("Partial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Precision. + /// + internal static string Precision { + get { + return ResourceManager.GetString("Precision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to +{0}: {1}. + /// + internal static string PropertyChangeFormat { + get { + return ResourceManager.GetString("PropertyChangeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: {1}. + /// + internal static string PropertyPairFormat { + get { + return ResourceManager.GetString("PropertyPairFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: value can not be empty.. + /// + internal static string PropertyValueCanNotBeEmpty { + get { + return ResourceManager.GetString("PropertyValueCanNotBeEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: value can not be null.. + /// + internal static string PropertyValueCanNotBeNull { + get { + return ResourceManager.GetString("PropertyValueCanNotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: length of the value must be in [{1} ... {2}] range.. + /// + internal static string PropertyValueLengthMustBeInXYRange { + get { + return ResourceManager.GetString("PropertyValueLengthMustBeInXYRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: value must be in [{1} ... {2}] range.. + /// + internal static string PropertyValueMustBeInXYRange { + get { + return ResourceManager.GetString("PropertyValueMustBeInXYRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Query '{0}'. + /// + internal static string QueryX { + get { + return ResourceManager.GetString("QueryX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to read-only. + /// + internal static string ReadOnly { + get { + return ResourceManager.GetString("ReadOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to r/o. + /// + internal static string ReadOnlyShort { + get { + return ResourceManager.GetString("ReadOnlyShort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to read-write. + /// + internal static string ReadWrite { + get { + return ResourceManager.GetString("ReadWrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to r/w. + /// + internal static string ReadWriteShort { + get { + return ResourceManager.GetString("ReadWriteShort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to recursive. + /// + internal static string Recursive { + get { + return ResourceManager.GetString("Recursive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #({0}). + /// + internal static string ReferenceFormat { + get { + return ResourceManager.GetString("ReferenceFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Referential integrity violation on attempt to remove '{0}', Key='{1}'. + ///Association: {2} + ///Referencing Entity Key: {3} + ///Referenced Entity Key: {4}. + /// + internal static string ReferentialIntegrityViolationOnAttemptToRemoveXKeyY { + get { + return ResourceManager.GetString("ReferentialIntegrityViolationOnAttemptToRemoveXKeyY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ref<{0}>({1}). + /// + internal static string RefFormat { + get { + return ResourceManager.GetString("RefFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Regular expression pattern is not specified.. + /// + internal static string RegularExpressionPatternIsNotSpecified { + get { + return ResourceManager.GetString("RegularExpressionPatternIsNotSpecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {6:s} @{1,-5} {2,5} {3,-24} {4}{5}. + /// + internal static string ReleaseLogFormat { + get { + return ResourceManager.GetString("ReleaseLogFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reversed({0}). + /// + internal static string ReversedFormat { + get { + return ResourceManager.GetString("ReversedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RowNumber{0}. + /// + internal static string RowNumberX { + get { + return ResourceManager.GetString("RowNumberX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scale. + /// + internal static string Scale { + get { + return ResourceManager.GetString("Scale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Schema comparison result: {0} + ///Has unsafe actions: {1} + ///Has column type changes: {2} + ///Compatible in ValidateLegacy mode: {3} + /// + ///Unsafe actions: + ///{4} + ///Schema hints: + ///{5} + ///Schema difference: + ///{6}. + /// + internal static string SchemaComparisonResultFormat { + get { + return ResourceManager.GetString("SchemaComparisonResultFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [{0} ... {1}]. + /// + internal static string SegmentFormat { + get { + return ResourceManager.GetString("SegmentFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type='{0}', #='{1}' ({2}). + /// + internal static string SerializationDataFormat { + get { + return ResourceManager.GetString("SerializationDataFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {3}: {5}. + /// + internal static string SimpleLogFormat { + get { + return ResourceManager.GetString("SimpleLogFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SQL error details '{0}'. + /// + internal static string SqlErrorDetailsX { + get { + return ResourceManager.GetString("SqlErrorDetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SQL error occured.. + /// + internal static string SqlErrorOccured { + get { + return ResourceManager.GetString("SqlErrorOccured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Storage error details '{0}'. + /// + internal static string StorageErrorDetailsX { + get { + return ResourceManager.GetString("StorageErrorDetailsX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subquery '{0}' header must have only one column.. + /// + internal static string SubqueryXHeaderMustHaveOnlyOneColumn { + get { + return ResourceManager.GetString("SubqueryXHeaderMustHaveOnlyOneColumn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to system types. + /// + internal static string SystemTypes { + get { + return ResourceManager.GetString("SystemTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Table: {0};. + /// + internal static string TableX { + get { + return ResourceManager.GetString("TableX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ThreadSafeCached({0}). + /// + internal static string ThreadSafeCachedFormat { + get { + return ResourceManager.GetString("ThreadSafeCachedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: {1} of ({2}). + /// + internal static string TransformedTupleFormat { + get { + return ResourceManager.GetString("TransformedTupleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0}, {1}, {2}). + /// + internal static string TripletFormat { + get { + return ResourceManager.GetString("TripletFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TupleDescriptor({0}). + /// + internal static string TupleDescriptorFormat { + get { + return ResourceManager.GetString("TupleDescriptorFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0}). + /// + internal static string TupleFormat { + get { + return ResourceManager.GetString("TupleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}({1}). + /// + internal static string TupleTransformFormat { + get { + return ResourceManager.GetString("TupleTransformFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + internal static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TypeId for type {0} is already assigned.. + /// + internal static string TypeIdForTypeXIsAlreadyAssigned { + get { + return ResourceManager.GetString("TypeIdForTypeXIsAlreadyAssigned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type ID range for database '{0}' ({1}, {2}) is exhausted. + /// + internal static string TypeIdRangeForDatabaseXYZIsExhausted { + get { + return ResourceManager.GetString("TypeIdRangeForDatabaseXYZIsExhausted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Types. + /// + internal static string Types { + get { + return ResourceManager.GetString("Types", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type: {0};. + /// + internal static string TypeX { + get { + return ResourceManager.GetString("TypeX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not implement '{1}.{2}' property.. + /// + internal static string TypeXDoesNotImplementYZField { + get { + return ResourceManager.GetString("TypeXDoesNotImplementYZField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' does not participate in the specified association.. + /// + internal static string TypeXDoesNotParticipateInTheSpecifiedAssociation { + get { + return ResourceManager.GetString("TypeXDoesNotParticipateInTheSpecifiedAssociation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not an '{1}' descendant.. + /// + internal static string TypeXIsNotAnYDescendant { + get { + return ResourceManager.GetString("TypeXIsNotAnYDescendant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not registered.. + /// + internal static string TypeXIsNotRegistered { + get { + return ResourceManager.GetString("TypeXIsNotRegistered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not supported '{1}' node.. + /// + internal static string TypeXIsNotSupportedYNode { + get { + return ResourceManager.GetString("TypeXIsNotSupportedYNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to dispose an item when disposable container has an invalid state.. + /// + internal static string UnableToDisposeItemWhenContainerIsNotDisposed { + get { + return ResourceManager.GetString("UnableToDisposeItemWhenContainerIsNotDisposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find column '{0}' of type '{1}' of current model.. + /// + internal static string UnableToFindColumnXInTypeYOfCurrentModel { + get { + return ResourceManager.GetString("UnableToFindColumnXInTypeYOfCurrentModel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to invalidate session state: newly created entities are attached to session.. + /// + internal static string UnableToInvalidateSessionStateNewlyCreatedEntitiesAreAttachedToSession { + get { + return ResourceManager.GetString("UnableToInvalidateSessionStateNewlyCreatedEntitiesAreAttachedToSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown. + /// + internal static string Unknown { + get { + return ResourceManager.GetString("Unknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <Unnamed>. + /// + internal static string UnnamedNodeDisplayName { + get { + return ResourceManager.GetString("UnnamedNodeDisplayName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Upgrade sequence. + /// + internal static string UpgradeSequence { + get { + return ResourceManager.GetString("UpgradeSequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validators. + /// + internal static string Validators { + get { + return ResourceManager.GetString("Validators", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value can not be less then {0}.. + /// + internal static string ValueCanNotBeLessThenX { + get { + return ResourceManager.GetString("ValueCanNotBeLessThenX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value can not be null.. + /// + internal static string ValueCanNotBeNull { + get { + return ResourceManager.GetString("ValueCanNotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value can not be an entity that is already removed.. + /// + internal static string ValueCanNotBeRemovedEntity { + get { + return ResourceManager.GetString("ValueCanNotBeRemovedEntity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value does not match regex pattern '{0}'.. + /// + internal static string ValueDoesNotMatchRegexPatternX { + get { + return ResourceManager.GetString("ValueDoesNotMatchRegexPatternX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value length can not be greater than {0}.. + /// + internal static string ValueLengthCanNotBeGreaterThanX { + get { + return ResourceManager.GetString("ValueLengthCanNotBeGreaterThanX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value length can not be less than {0}.. + /// + internal static string ValueLengthCanNotBeLessThanX { + get { + return ResourceManager.GetString("ValueLengthCanNotBeLessThanX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value length can not be less than {0} or greater than {1}.. + /// + internal static string ValueLengthCanNotBeLessThanXOrGreaterThanY { + get { + return ResourceManager.GetString("ValueLengthCanNotBeLessThanXOrGreaterThanY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value can not exceed {0}.. + /// + internal static string ValueLengthCanNotExceedX { + get { + return ResourceManager.GetString("ValueLengthCanNotExceedX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should be a valid e-mail.. + /// + internal static string ValueShouldBeAValidEMail { + get { + return ResourceManager.GetString("ValueShouldBeAValidEMail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should be in the future.. + /// + internal static string ValueShouldBeInTheFuture { + get { + return ResourceManager.GetString("ValueShouldBeInTheFuture", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should be in the past.. + /// + internal static string ValueShouldBeInThePast { + get { + return ResourceManager.GetString("ValueShouldBeInThePast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should match regex pattern '{0}'. + /// + internal static string ValueShouldMatchRegexPatternX { + get { + return ResourceManager.GetString("ValueShouldMatchRegexPatternX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be empty.. + /// + internal static string ValueShouldNotBeEmpty { + get { + return ResourceManager.GetString("ValueShouldNotBeEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be null or empty.. + /// + internal static string ValueShouldNotBeEmptyOrEmpty { + get { + return ResourceManager.GetString("ValueShouldNotBeEmptyOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be greater than {0}.. + /// + internal static string ValueShouldNotBeGreaterThanMax { + get { + return ResourceManager.GetString("ValueShouldNotBeGreaterThanMax", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be less than {0}.. + /// + internal static string ValueShouldNotBeLessThanMin { + get { + return ResourceManager.GetString("ValueShouldNotBeLessThanMin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be less than {0} or greater than {1}.. + /// + internal static string ValueShouldNotBeLessThanMinOrGreaterThanMax { + get { + return ResourceManager.GetString("ValueShouldNotBeLessThanMinOrGreaterThanMax", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value should not be null.. + /// + internal static string ValueShouldNotBeNull { + get { + return ResourceManager.GetString("ValueShouldNotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value type mismatch for field '{0}'. + /// + internal static string ValueTypeMismatchForFieldX { + get { + return ResourceManager.GetString("ValueTypeMismatchForFieldX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value: {0};. + /// + internal static string ValueX { + get { + return ResourceManager.GetString("ValueX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version field '{0}' can't be TypeId field.. + /// + internal static string VersionFieldXCanTBeTypeIdField { + get { + return ResourceManager.GetString("VersionFieldXCanTBeTypeIdField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}. + /// + internal static string X { + get { + return ResourceManager.GetString("X", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} in {1}. + /// + internal static string XInY { + get { + return ResourceManager.GetString("XInY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not applicable to '{1}' descendants.. + /// + internal static string XIsNotApplicableToYDescendants { + get { + return ResourceManager.GetString("XIsNotApplicableToYDescendants", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}. + /// + internal static string XW0001 { + get { + return ResourceManager.GetString("XW0001", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <none>. + /// + internal static string ZeroAssemblyVersion { + get { + return ResourceManager.GetString("ZeroAssemblyVersion", resourceCulture); + } + } + } +} diff --git a/Orm/Xtensive.Orm/Strings.resx b/Orm/Xtensive.Orm/Strings.resx index 26fff0ec83..717405e85f 100644 --- a/Orm/Xtensive.Orm/Strings.resx +++ b/Orm/Xtensive.Orm/Strings.resx @@ -1,3427 +1,3427 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Argument value must be greater than or equal to zero. - - - Argument value must be greater than zero. - - - Collection already contains item with the specified key. - - - Collection has been changed during the enumeration. - - - Collection is empty. - - - Collection is read-only. - - - Dependency operation with full name "{0}" is already registered. - - - Descriptor is in invalid state. - - - Destionation array is too small. - - - The given key was not present in the dictionary. - - - Incompatible array type. - - - The two collections cannot be combined because they use different comparison operations. - - - Index should be in [{0}...{1}] range. - - - Instance is locked. - - - The specified capacity value is less than collection count. - - - The specified item cannot be cached because its type is incompatible with underlying storage format. - - - Specified item is already in use. - - - Specified item is not in use. - - - Specified item isn't pooled. - - - Specified item isn't found. - - - Linked operation for property {0} missing. - - - Maximal item count is {0}. - - - There are no more available items. - - - There is no object with specified key. - - - Operation LinkType should be defined before it can be registered in OperationDictionary. - - - Operation must be locked before it can be registered in OperationDictionary. - - - Operation PropertyName must be specified before it can be registered in OperationDictionary. - - - Pool should be in syncronized mode to utilize AutoCleanup feature. - - - Item already exists in the pool with another key. - - - Port value must be in [0,65535] range. - - - "{0}" is invalid URL. - - - Array does not have zero-based indexing. - - - Source collection contains at least one item of type "{0}", that cannot be cast to the item type of the destination collection. - - - A instance must have non-null IHasSyncRoot.SyncRoot property value. - - - Could not load types from the assembly '{0}'. - - - The specified item cannot be cached because its type is incompatible with ITuple. - - - Argument can't be an empty string. - - - Array is multidimentional. - - - Collecton already contains specified item. - - - The specified capacity value is less than collection count. - - - Index is out of range. - - - Invalid argument type: expected type is {0}. - - - System date \ time has been changed. - - - Measurement is already completed. - - - Internal error: {0} - - - An item with the same key has already been added. - - - Argument should be in range [{0}...{1}]. - - - Property '{0}' of type '{1}' does not have public get accessor. - - - Property '{0}' of type '{1}' does not have public set accessor. - - - Member: '{0}' is not a Public Property or Field of Type: '{1}' - - - Stream length not enough to deserialize object of specified type. - - - Type is not supported by BinaryPrimitiveSerializer. - - - Object is read-only. - - - Instance is already initialized. - - - Property '{0}' is already initialized. - - - Active scope is invalid - it differs from the expected one. Probably you have forgot to dispose some nested scope. - - - Scope can't be disposed. Most likely it is bound to a different thread. - - - {0} is required. Use {1} to set it. - - - Can't find associated {0} of type '{1}' for type '{2}'. - - - Unable to copy a part of the stream to itself. Use StreamExtensions.Copy method instead. - - - Unable to create provider instance. Check if provider's class has static "Instance" property. - - - Scope dispose error. - - - Item should be either an ICollection or ICountable. - - - Can't create associates for generic type definitions (type '{0}'). - - - Multiple associates match type '{0}' by its interfaces (at least '{1}' and '{2}'). - - - '{0}<{1}, {2}>' creation has failed for '{3}'. - - - '{0}<{1}, {2}>' was used for '{3}'. - - - Can't find associated {0} of type '{1}' for type '{2}' or '{3}'. - - - InfinityType.None can't be passed to this constructor. - - - Value is not available. - - - inf - - - Reversed({0}) - - - Conversion from type {0} to type {1} is inadmissible. - - - Can't find {0} ('{1}') for type '{2}'. - - - MinMaxValues aren't supported for TupleFieldAdvancedComparer. - - - Specified type should be either GeneratedTupleDescriptor or its descendant. - - - Type '{0}' must be reference type. - - - Type '{0}' must implement '{1}', or must be its descendant. - - - Field with index '{0}' is infinite. - - - Culture of the applied rule should either be undefined (null), or be the same as on target rule. - - - {0}{1}d - - - Generic parameter '{0}' should be of type '{1}'. - - - Merge operation require intersection of operands. - - - EndPoints order of both ranges must be equal. - - - Range is empty. - - - '{0}' is not allowed or invalid here. - - - Item with name '{0}' was not found. - - - Enumeration is already finished. - - - Cast from '{0}' to '{1}' is invalid. - - - Both measurements have no value. - - - Measurement '{0}' must have value. - - - * - - - ComparisonRule({0}, {1}) - - - ComparisonRules({0}, [{1}]) - - - Box({0}) - - - Entire({0}) - - - ({0}, {1}) - - - ({0}, {1}, {2}) - - - ({0}) - - - null - - - recursive - - - Recursive associate lookup is detected. - - - Instance is not initialized (or not initialized properly). - - - Property '{0}' is not initialized (or not initialized properly). - - - Different TupleDescriptors are not valid here: {0} and {1}. - - - {0}: started. - - - {0}: completed. - - - Attempt to use disposed instance of type '{0}'. - - - Safe dispose of '{0}' failing. - - - Invalid TupleDescriptor. Expected descriptor is {0}. - - - {0}: {1} of ({2}) - - - {0}({1}) - - - The number of sources is too small. Expected number is {0}. - - - TupleDescriptor({0}) - - - [{0} ... {1}] - - - read-only - - - r/o - - - read-write - - - r/w - - - {0}: multiple attributes of type '{1}' are not allowed here. - - - {0} (v{1}) - - - Exception! - - - Use LogCaptureScope constructor instead. - - - Unable to get default hasher for type {0} - - - Original exception(s) - - - A set of exceptions is caught. - - - Service '{0}' is not found. - - - Cached({0}) - - - ThreadSafeCached({0}) - - - Value for parameter '{0}' is not set. - - - Object is already disposed. - - - Record with invalid (possibly - unspecified) type is found. - - - Generic parameter T is resolved to associated '{0}', although '{1}' is expected. - - - '{0}' formatter process type is invalid for the current operation. - - - Reference '{0}' is already defined. - - - Reference '{0}' is not resolved yet. - - - Reference points to null. - - - #({0}) - - - Invalid field map size. Expected {0}. - - - '' - - - Deserialization error: some SerializationData slots were not recognized, thus the format of the serialized data differs from the supported one. - - - '{0}' can't be an IsReferable serializer, since it serializes IReference type. - - - Unable to dispose an item when disposable container has an invalid state. - - - Value with name '{0}' already exists. - - - Value with name '{0}' is not found. - - - Type='{0}', #='{1}' ({2}) - - - Object serializer is invalid, since similar value serializer exists. - - - String does not correspond to the specified descriptor. - - - Unknown expression type: '{0} ({1})' - - - Escape character must differ from delimiter character. - - - The expression must return a value of type '{0}'. - - - The argument must not be of type '{0}'. - - - The expression having the equal normal form must be a root expression. - - - The expression having the different normal form must not be a root expression. - - - Only the normalized expression having the different normal form can be added as the immediate descendant to the root expression. - - - Actual conjunction operand count greater than MaxConjunctionOperandCount. - - - Can't parse the call to the comparison method. - - - Some operands are not Expressions of type 'System.Boolean'. - - - The expected value of the parameter is already set. - - - This operation is not allowed for the parameter context operating with expected values of parameters. - - - {0} is required. - - - Only one ancestor of each instance of this generic type is allowed. - - - Lambda parameter '{0}' is out of scope. - - - The argument '{0}' is less than the argument '{1}'. - - - Argument must be greater than '{0}' - - - Argument must be less than '{0}' - - - Key already exists. - - - Type '{0}' must be non-abstract type. - - - The exception was thrown during the task's execution. - - - Unable to cast null value to {0}; use {0}? instead. - - - {0,6:F2}s @{1,-5} {2,5} {3,-24} {4}{5} - - - {6:s} @{1,-5} {2,5} {3,-24} {4}{5} - - - {3}: {5} - - - Unable to bind parameters to lambda {0}. Parameters count is incorrect. - - - Unable to use expression {0} as {1} parameter of lambda {2} because of type mistmatch. - - - Type '{0}' does not have property '{1}'. - - - Resource property {0} is not of string type. - - - The type {0} has already been registered. - - - The mapping for the property {0} has already been registered. - - - The type {0} hasn't been registered. - - - The specified expression is not a MemberExpression. - - - The accessed member is not a property. - - - The specified expression can't be parsed. - - - Key {0} is not found. - - - Collection has been modified. - - - The properties "{0}" and "{1}" have incompatible types. - - - The reference property {0} is bound to the property {1} that isn't reference. - - - The collection property {0} is bound to the property {1} that isn't collection. - - - The primitive property {0} is bound to the property {1} that isn't primitive. - - - The type {0} isn't a subclass of the type {1}. - - - The limit of the graph depth is exceeded. - - - Nested collection is not supported. - - - The detection of changes in user structure collection isn't supported. - - - The type {0} can't be transformed. - - - {0} in {1} - - - Can't activate service '{0}'. Error: {1} - - - Can't activate service '{0}' with name "{1}". Error: {2} - - - Multiple services match to the specified arguments. - - - Service of type '{0}' is not available. - - - Service with name "{0}" of type '{1}' is not available. - - - Container type must implement {0}. - - - Container type does not provide a suitable constructor. - - - Recursive constructor paremeter dependency is detected. - - - The {0} is neither class nor value type. - - - Argument must be greater that or equal '{0}' - - - Argument must be less than or equal '{0}' - - - Use LogIndentScope constructor instead. - - - Only breakable nodes :( - - - Segment is out of range. - - - The nullable property {0} is bound to the property {1} that isn't nullable. - - - The properties {0} and {1} have different primitive types. - - - Invalid Parent value. - - - Item with name '{0}' already exists. - - - Item with Name '{0}' is not found. - - - Model object cannot be removed. - - - Type of {0} property must be {1}. - - - Invalid node state. - - - Binding has failed for {0}. Check property declaration. - - - Nesting must be created for any node. - - - {0} ({1}) - - - Target object already exists: "{0}". To assign a new one, you must remove the old one first. - - - Can't find a constructor to execute {0}. - - - Node with path "{0}" is not found. - - - Item already exists. - - - Multiple hints found. - - - "{1}" != "{2}" ({0}): {3} - - - +{0}: {1} - - - {0} - - - {0} change(s) - - - Both Source and Target are null. - - - +{0}: - - - Property value must belong to the same Model. - - - Loop in action dependency chain is detected. - - - Comparer.Current is null. - - - Invalid context deactivation sequence. - - - Invalid context activation sequence. - - - Invalid AfterPath property value. - - - Invalid Nesting of node "{0}". - - - Upgarder.Current is null. - - - Automatic upgrade sequence validation - - - Validation failed. - - - Difference - - - {0}: - - - Expected target model - - - Actual target model - - - Upgrade sequence validation failure. - - - Node "{0}" must be processed before being compared as reference (value of "{1}".{2}). - - - Upgrade sequence - - - Difference related to {0} type is not found on the UpgradeContext stack. - - - Property "{0}.{1}" is not found. - - - Invalid transaction state ('{0}'). Expected state(s) is (are) '{1}'. - - - Transaction is already activated. - - - TransactionScope.IsCompleted can not be set to 'false'. - - - Scope-bound transaction can be committed only by its scope. Use TransactionScopeBase.Complete() \ Dispose() methods of appropriate TransactionScopeBase descendant instance to do this. - - - - - - - - - Special character {0} used as escape character. - - - Control character used as escape character - - - Comparer for type '{0}' is not available. - - - Type '{0}' is not registered. - - - Unable to find master association of association '{0}' - - - Could not resolve {0} '{1}' within the domain. - - - Type with TypeId={0} is not registered. - - - TypeId for type {0} is already assigned. - - - Item with key '{0}' was not found. - - - Item with name '{0}' already exists in '{1}'. - - - TypeId is not assigned for type '{0}'. - - - {0} ({1}) - - - <Unnamed> - - - Key contains multiple fields with IsTypeId==true flag. - - - Can't extract foreign key. - - - TypeDiscriminator field is already set. - - - Default type is already registered. - - - Instance must be locked before this operation. - - - {0}.{1} - - - Error setting default value {0} for column '{1}' in type '{2}'. Most likely, its type is incorrect. - - - Index '{0}' is changed. - - - Unable to insert instance of type '{0}' with specified key. Query affected {1} tables, but expected {2} tables. - - - Multiple instances of type '{0}' with specified key are found. - - - Instance of type '{0}' with specified key is not found. - - - Specified query returns multiple results. - - - Type '{0}' has no primary index. - - - Unable to create the connection. Check if all needed assemblies are available. - - - Type '{0}' is not supported by current storage provider. - - - Index '{0}' with attributes '{1}' is not supported. - - - Unable to update instance of type {0} with specified key. Query affected {1} tables, but expecrted {2} tables. - - - Reader is not in consistent state. - - - Enumeration is not started. - - - Unable to find column '{0}' of index '{1}' in primary index. - - - Transaction is already open. - - - Transaction is not open. - - - Index '{0}' is not found. - - - Incorrect command parameters. - - - String.Trim(char[]), String.TrimStart(char[]), string.TrimEnd(char[]) supported only with argument being array of constants. - - - Sequence '{0}' is not found in storage. - - - SQL error occured. - - - Storage error details '{0}' - - - SQL error details '{0}' - - - Original message '{0}' - - - Query '{0}' - - - ROW_NUMBER window function is not supported on this version of PostgreSQL - - - Session '{0}'. Schema upgrade script: -{1} - - - Parameters count is not same as source column lists count. - - - Source column list contains null values. - - - Session '{0}'. Creating connection. - - - Session '{0}'. Opening connection '{1}'. - - - Session '{0}'. Closing connection '{1}'. - - - Session '{0}'. Disposing connection. - - - Session '{0}'. Beginning transaction @ {1}. - - - Session '{0}'. Commit transaction. - - - Session '{0}'. Rollback transaction. - - - Session '{0}'. SQL batch: -{1} - - - '{0}' is not supported - - - Temporary table '{0}' is locked - - - Session '{0}'. Make savepoint '{1}'. - - - Session '{0}'. Rollback to savepoint '{1}'. - - - Session '{0}'. Release savepoint '{1}'. - - - Connection is not open. - - - Commands are already translated. - - - Current storage provider does not support savepoints (nested transactions). - - - Storage '{0}' does not support partial indexes, ignoring filter for partial index '{0}'. - - - Outer parameter reference found, but no SqlCompiler provided - - - Translation of In/Contains is not supported in this case - - - Request is not prepared - - - There are no suitable types in '{0}'. - - - Element with name '{0}' is contained in this instance already. - - - Service with name '{0}' already exists in StorageInfo.Services collection. - - - Field with name '{0}' already exists in EntityInfo.Fields collection. - - - Index with name '{0}' already exists in EntityInfo.Indexes collection. - - - Unsupported type: '{0}'. - - - Element with type '{0}' is already contained in this instance. - - - Type cannot be null. - - - Index already contains field '{0}'. - - - Index field '{0}' is incorrect. - - - Type '{0}' is not found in model. - - - Object is outside of initial transaction scope. - - - Unable to modify removed object. - - - Session bound object is out of session scope. - - - Field '{0}' is not found in model. - - - Value of '{0}' type cannot be assigned to property of '{1}' type. - - - Storage provider '{0}' is not found. - - - Unable to create Key. Key params do not correspond to its structure. - - - TypeInfo hierarchy does not correspond to provided hierarchy. - - - Field '{0}' is a part of primary key. It can't be changed. - - - Unable to modify removed entity. - - - {0}: multiple attributes of type '{1}' are not allowed here. - - - Value length {0} is greater than column length {1}. - - - Unable to assign null to non-nullable column. - - - Invalid type specified. - - - The Session of specified ISessionBound object is invalid. - - - Value can not be null. - - - Entity is removed. - - - Value can not exceed {0}. - - - Value should match regex pattern '{0}' - - - Invalid field value, constraint {0} is violated. - - - Value can not be less then {0}. - - - Some errors have been occurred during storage build. See error log for details. - - - Key field '{0}' was not found in type '{1}'. - - - Value type mismatch for field '{0}' - - - Field with name '{0}' is already registered. - - - Field '{0}' is already defined in type '{1}' or in its ancestor. - - - Interface '{0}' does not belong to '{1}' hierarchy. - - - Type '{0}' does not implement '{1}.{2}' property. - - - Constraint violation: constraint {0} on field '{1}.{2}' of object '{3}' failed on value {4}. - - - Value can not be an entity that is already removed. - - - Indexed properties are not supported. - - - Type '{0}' is not registered in the model. - - - Field '{0}' cannot be LazyLoad as it is included into primary key. - - - Type with name '{0}' is already defined. - - - Type '{0}' is already defined. - - - Index with name '{0}' is already registered. - - - Type '{0}' was not registered for activation. - - - TypeDef '{0}' already belongs to hierarchy with '{1}' root. - - - '{0}' descendant is already a root of another hierarchy. - - - Paired field '{0}' has wrong type. A descendant of Entity or EntitySet is expected. - - - Referenced field '{0}' and paired field are equal. - - - Paired field '{0}.{1}' was not found in '{2}' type. - - - 'AssociationAttribute' can't be applied to '{0}' field. - - - Key provider '{0}' should define at least one key field. - - - Key provider '{0}' and hierarchy {1} key field amount mismatch. - - - Invalid Length attribute on '{0}' field. - - - Field '{0}' has '{1}' type but is marked as not nullable. - - - Explicit LazyLoad=true on field '{0}' is redundant. - - - Explicit mapping name setting is redundant. The same name '{0}' will be generated automatically. - - - Invalid mapping name '{0}'. - - - Index must contain at least one field. - - - Invalid fill factor '{0}'. Value must be between 0 and 1. - - - Column '{0}' is not found. - - - Type '{0}' does not implement '{1}' interface. - - - Type '{0}' is not collatable. - - - '{0}' is not applicable to '{1}' descendants. - - - Name '{0}' is invalid. - - - Index name '{0}' is invalid. - - - Property '{0}' must be declared in type '{1}'. - - - Unsupported field type: '{0}' - - - Key '{0}' was not found in storage. - - - Cannot find a handler of type '{0}'. - - - Key can not be null. - - - Creating {0} - - - Building {0} - - - Model - - - Generators - - - Actual Model - - - Model Definition - - - Custom Definitions - - - Types - - - Defining '{0}' - - - Associations - - - Indexes - - - Columns - - - Hierarchy columns - - - Wrong persistent type candidate: '{0}'. - - - 'NotNullable' constraint violation on field '{0}'. - - - 'Length' constraint violation on field '{0}'. - - - Session is already disposed. - - - Cannot use default generator for complex (multicolumn) Keys. - - - Unable to clone non-user session configuration. - - - Entity is in inconsistent state. - - - Can not open a transaction: there is no current Session. - - - Field '{0}.{1}' is not found. - - - Entity '{0}' is bound to another Session. - - - Value should be '{0}' descendant. - - - EntitySet can't be assigned. - - - Association multiplicity '{0}' is not valid for field '{1}'. - - - Field '{0}.{1}' is already paired with '{2}.{3}'. Please remove [Association] attribute at '{4}.{5}'. - - - Unable to activate EntitySet for '{0}' field because it does not has association. - - - Entity set is invalid due to current transaction is not active. - - - Can not commit a transaction: ValidationContext is in inconsistent state. - - - Item is not found in EntitySet. - - - Can not get validation context: there is no active transaction. - - - Default generator can serve hierarchy with exactly one key field. - - - Type '{0}' is not supported. - - - Key property '{0}' declared in '{1}' should not have public or protected set accessor. Use base protected constructor to set Key value. - - - Unable to set Key field '{0}' explicitly. - - - Section '{0}' is not found in application configuration file. - - - Configuration for Domain with name '{0}' is not found in application configuration file (section '{1}'). - - - Field '{0}' cannot be Nullable as it is included into primary key. - - - There is no current Session. - - - Wrong key structure. - - - StateTransaction property value differs from the current transaction. - - - String representaion of the Key has invalid format. - - - Attempt to associate non-empty EntityState with Key of unknown type. - - - [Association] attribute with PairTo can not be use with field '{0}' of type '{1}'. It is already applied to field '{2}' of type '{3}'. - - - Session with name '{0}' already exists. - - - system types - - - Unsupported expression type: '{0}'. - - - Field '{0}' is not an Entity field in Type '{1}'. - - - Type '{0}' is not an '{1}' descendant. - - - Session is not open. Use Session.Open(...) to open it. - - - Unable to find factory method for type '{0}'. Make sure assembly '{0}' is processed by weaver. See section 2 of Manual for details. - - - Active serialization context is not found. - - - Cannot resolve entity with key '{0}'. - - - Unable to resolve type for Key '{0}'. - - - Unknown entity serialization kind '{0}'. - - - Unable to create key for '{0}' hierarchy. Key value or key generator should be specified. - - - [CompilerContainer] attribute isn't applied to type '{0}'. - - - Invalid upgrader version. - - - TypeId for type '{0}' is not found. - - - Type with type TypeId='{0}' is not found. - - - Actual schema version of assembly '{0}' is expected to be '{1}', but currently it is '{2}'. - - - Only equality ranges are supported. - - - Could not find field segment for field '{0}'. - - - Could not find entity mapping for field '{0}'. - - - Could not find anonymous mapping for field '{0}'. - - - Binary expressions with NodeType = 'ExpressionType.{0}' aren't supported. - - - Could not find grouping mapping for field '{0}'. - - - Could not find subquery mapping for field '{0}'. - - - Specified values aren't enough to create key for type '{0}'. - - - Extracted schema is not compatible with the target schema. Details: -{0} - - - Cannot upgrade schema safely. Details: -{0} - - - Upgrade of assembly '{0}' from version '{1}' to '{2}' is not supported. - - - <none> - - - Duplicate assembly name: '{0}'. - - - No upgrade handler is found for assembly '{0}', version '{1}'. - - - Type with name '{0}' is not found in metadata. - - - Metadata.Type renamed: '{0}' to '{1}'. - - - {0} (Version={1}) - - - {0} (Id={1}) - - - Metadata.Assembly created: '{0}'. - - - Metadata.Assembly updated: '{0}', from version '{1}' to '{2}'. - - - More than one enabled {0} is provided for assembly '{1}'. - - - Extracted schema is not equal to the target schema. Details: -{0} - - - Schema comparison result: {0} -Has unsafe actions: {1} -Has column type changes: {2} -Compatible in ValidateLegacy mode: {3} - -Unsafe actions: -{4} -Schema hints: -{5} -Schema difference: -{6} - - - Comparison result: -{0} - - - Clearing comparison result: -{0} - - - Synchronizing schema in {0} mode - - - Target schema: - - - Extracted schema: - - - Structures do not support fields of type '{0}'. - - - Defining hierarchy for type '{0}' - - - Defining field '{0}' - - - Building declared field '{0}.{1}' - - - Building inherited field '{0}.{1}' - - - Building interface field '{0}.{1}' - - - Defining indexes - - - Building index '{0}' - - - Skipping entity '{0}' as it does not belong to any hierarchy thus it cannot be persistent. - - - Unable to translate '{0}' expression. Downcast from '{1}' to '{2}' not supported. Use 'OfType' or 'as' operator instead. - - - 'as' operator supports casting only inside Entity hierarchy. - - - Prefetch does not support query provider of type '{0}'. - - - ExcludeFields does not support query provider of type '{0}'. - - - IncludeFields does not support query provider of type '{0}'. - - - Method '{0}' is not found. - - - OfType supports casting only inside IEntity hierarchy. - - - Lambda parameter is out of scope. - - - Failed to extract domain model from the storage. - - - Domain model is not found in the storage. - - - Type '{0}' is not found. - - - Hint '{0}' is conflicting with hint '{1}' - - - Key of '{0}' does not match key of '{1}'. - - - Type '{0}' must belong to hierarchy. - - - Unauthorized: the caller is declared outside of any of registered assemblies. - - - Structure of field '{0}' does not match structure of field '{1}'. - - - Invalid Scale attribute on field '{0}'. - - - Invalid Precision attribute on field '{0}'. - - - Unable to translate expression '{0}'. Key comparer is not supported in GroupJoin. - - - Type '{0}' does not participate in the specified association. - - - Active Session is required for this operation. Use Session.Open(...) to open it. - - - Referential integrity violation. - - - Referential integrity violation on attempt to remove '{0}', Key='{1}'. -Association: {2} -Referencing Entity Key: {3} -Referenced Entity Key: {4} - - - LeftJoin does not support query provider of type '{0}'. - - - Type '{0}' does not have a parameterless constructor. - - - Current session getter is already assigned. - - - Value is already assigned. - - - Materialization error: Entity's TypeId column does not exist in the underlying RecordSet. - - - {0}, {1} - - - {0} (unknown), {1} - - - Key values array is empty. - - - Key indexes are specified for non-generic Key. - - - Sequence contains no elements. - - - Key = '{0}', Tuple = {1}, State = {2} - - - n/a - - - Table with name '{0}' is not found. - - - Column with name '{0}' is not found in table '{1}'. - - - Provider "{0}" is not supported. Use one of the following: {1}. - - - Type '{0}' does not contain '{1}' field. - - - Field must be of EntitySet<> type. - - - Field '{0}' is not an EntitySet field. - - - Entity of type '{0}' is incompatible with this EntitySet. - - - Entity with Key = '{0}' does not exist. - - - There is no current HttpRequest, or SessionManager is not bound to it yet. - - - The query contains closures of different types. - - - Invalid prefetch selector '{0}'. - - - Can not commit a transaction. Validation context is in invalid state. - - - Lock does not support query provider of type '{0}'. - - - This instance is expired due to transaction boundaries. - - - '{0}.{1}' OnOwnerRemove action is not equal to '{2}.{3}' OnTargetRemove action. - - - Unable to associate type '{0}' with type '{1}'. Type '{0}' is already mapped to type '{2}'. - - - Unable to associate field '{0}' with field '{1}'. Field '{0}' is already mapped to field '{2}'. - - - Inheritance schema '{0}' is invalid. - - - VisitKeyField is not supported by '{0}'. - - - Paired identity columns for types '{0}' and '{1}' not found - - - Could not get member {0} from expression. - - - Incorrect namespace synonyms. - - - '{0}' method isn't supported. - - - Expression '{0}' is unknown. - - - Field '{0}' is not structure. - - - Nested field '{0}' is not supported. - - - Field '{0}' is not primitive. - - - Field '{0}' is not entity. - - - Persistent type '{0}' is not entity or persistent interface. - - - Configuration with '{0}' name already registered. - - - '{0}' name can't be empty. - - - '{0}' is not valid name for {1}. - - - Hierarchy '{0}' doesn't contain any key fields. - - - Key structure for '{0}' contains NULL value. - - - Key field '{0}.{1}' is not found. - - - Key field can't be of '{0}' type. - - - '{0}' must be inherited from '{1}'. - - - Field of type '{0}' cannot be nullable. For value types consider using Nullable<T>. - - - Structure '{0}' can't contain field of the same type. - - - '{0}.{1}': '{2}' value is not acceptable for 'OnTargetRemove' property. - - - Hierarchy is not found for type '{0}'. - - - Unable to build generic instance types for '{0}' type because it contains more then 1 generic parameter. - - - Unable to build generic instance types for '{0}' type because parameter is not constrained. - - - Item by key ='{0}' was not found. - - - At least one loop have been found in persistent type dependencies graph. Suspicious types: {0} - - - Key fields '{0}' and '{1}' have the same position: '{2}'. - - - Unable to remap FieldExpression. - - - Unable to translate '{0}' expression. Aggregates for non primitive types are not supported. - - - ParameterExpression must have same type as ProjectionExpression.ItemProjector - - - '{0}' does not support '{1}'. - - - Hierarchy root is not registered. - - - Only entities could be hierarchy roots. - - - Field '{0}' is not an entity reference, nor entity set. - - - Field '{0}' is not an entity set. - - - Unable to remap KeyExpression. - - - Unable to handle EntitySetExpression without specified Owner. - - - Unable to remove Owner from EntitySetExpression. - - - Unable to use base implementation of VisitGenericExpression without specifying genericProcessor delegate. - - - Unable to resolve owner of StructureExpression '{0}'. - - - Unable to resolve owner of FieldExpression '{0}'. - - - SelectMany collection selector '{0}' must have only one lambda parameter. - - - Subquery '{0}' header must have only one column. - - - Unable to translate expression '{0}'. LINQ translator does not support method '{1}'. - - - 'Contains' method is only supported for root expressions or subqueries. - - - 'All' method is only supported for root expressions or subqueries. - - - 'Any' method is only supported for root expressions or subqueries. - - - 'TypeIs' method supports only Entities and Structures. - - - Binary expression '{0}' of type '{1}' is not supported. - - - Both left and right part of binary expression '{0}' are NULL or not StructureExpression. - - - Both left and right part of binary expression '{0}' are NULL or not EntityExpression(EntityFieldExpression). - - - Both left and right part of binary expression '{0}' are NULL or not KeyExpression. - - - Mistmatch count of left and right expressions. - - - Unable to build subquery result for expression '{0}'. State contains no parameters. - - - Unable to build subquery result for expression '{0}'. resultType is not IEnumerable<>. - - - MethodCall expression '{0}' is not supported. - - - Lambda '{0}' must have only one parameter. - - - Unable to translate '{0}' expression. Aggregate method '{1} is not supported. - - - Can't access member of type 'EntitySet<>'. - - - Can't access member '{0}' - - - Unable to translate lambda expression '{0}' because it requires to materialize entity of type '{1}'. - - - Type '{0}' is not supported in 'new' expression. - - - Can not commit a transaction. Entities validation failed. - - - Type '{0}' is not structure. - - - Unable to materialize back local collection item '{0}'. - - - Type '{0}' does not has any public readable properties or fields, so it can't be persisted to storage. - - - The specified type's hierarchy is different from the key's hierarchy. - - - The field {0} is not declared in the type {1} or in one of its ancestors. - - - Indexes of columns to be loaded are not specified. - - - The referencing entity with key {0} is not found. - - - The referencing entity's tuple is not loaded. - - - The foreign key's value have not been loaded. - - - The access to a type's member can not be extracted from the specified expression. - - - The specified property {0} is not persistent. - - - Primary key field '{0}' can't be marked as Version. - - - Version field '{0}' can't be LazyLoad field. - - - Version field '{0}' can't be of {1} type. - - - Version field '{0}' can't be System field. - - - Version field '{0}' can't be TypeId field. - - - Type '{0}' can't contain Version fields, because it is not a hierarchy root type. - - - 'Take' does not support query provider of type '{0}'. - - - 'Skip' does not support query provider of type '{0}'. - - - Version root object can't implement IHasVersionRoots. - - - Unable to use IQueryable '{0}' in Query.Execute statement. - - - Could not construct new Key instance. Type '{0}' is not an entity. - - - (can't change type of column '{0}') - - - (can't remove table '{0}') - - - (can't remove column '{0}') - - - Unable to build index {0} because it contains inherited fields. - - - Session '{0}'. Disposing. - - - Domain is disposing. - - - Domain is disposing by a finalizer. - - - Opening session '{0}'. - - - Session '{0}'. Removing: Key = '{1}'. - - - Session '{0}'. Materializing {1}: Key = '{2}'. - - - Session '{0}'. Getting value: Key = '{1}', Field = '{2}'. - - - Session '{0}'. Setting value: Key = '{1}', Field = '{2}'. - - - Session '{0}'. Resolving key '{1}'. Exact type is unknown. Fetch is required. - - - Session '{0}'. Resolving key '{1}'. Exact type is {2}. - - - known - - - unknown - - - Session '{0}'. Resolving key '{1}'. Key is already resolved. - - - Session '{0}'. Caching: {1}. - - - Session '{0}'. Updating cache: {1}. - - - Session '{0}'. Persisting (reason: {1}). - - - partial - - - full - - - Session '{0}'. Persist completed. - - - Processing fixup actions - - - Executing action: '{0}' - - - Hierarchy: '{0}' - - - Field: '{0}' - - - Index: '{0}' - - - Inspecting hierarchy '{0}' - - - Inspecting type '{0}' - - - Inspecting model definition - - - Member '{0}' of type '{1}' is not initialized. Check if constructor argument is correct or field initialized through initializer. - - - Invalid number of parameters in NewExpression. - - - 'ElementAt' does not support query provider of type '{0}'. - - - 'ElementAtOrDefault' does not support query provider of type '{0}'. - - - Usage of ElementAt(int) or ElementAtOrDefault(int) in Query.Execute is wrong. Use ElementAt(Func<int>) or ElementAtOrDefault(Func<int>) instead. - - - ElementAt index must be greater or equal to zero. - - - Local collection should not be query root. - - - Connection is required. - - - DisconnectedState is already attached to session. - - - DisconnectedState is detached. - - - State with key '{0}' is already exists. - - - State is not loaded. - - - State is removed. - - - Key {0} should have exact type. - - - Service '{0}' is not supported. - - - {0} is obsolete. Use {1} and {2} instead. - - - Can not complete outer transaction: inner transaction is active. - - - Can not open more than one inner transaction. - - - Can not reuse opened transaction: requested isolation level is different. - - - Can not mark state as modified: it is not valid in current transaction. - - - Transaction is not active. - - - Version of entity with key '{0}' differs from the expected one. - - - The service is already attached to Session. - - - Service can not be attached to Session while it is persisting the changes. - - - Can't register state. - - - Can't merge state. - - - Session '{0}'. Opening transaction. - - - Session '{0}'. Committing transaction. - - - Session '{0}'. Committed transaction. - - - Session '{0}'. Rolling back transaction. - - - Session '{0}'. Rolled back transaction. - - - Unable to translate '{0}' expression. See inner exception for details. - - - Expression '{0}' defined outside of CachingQuery closure. - - - Expression '{0}' is not a sequence. - - - 'Take({0})' not supported in compiled queries (Query.Execute). Use 'Take(Expression<Func<int>>)' instead.For example use 'Take(()=>{0})'. - - - 'Skip({0})' not supported in compiled queries (Query.Execute). Use 'Skip(Expression<Func<int>>)' instead.For example use 'Skip(()=>{0})'. - - - 'ElementAt({0})' not supported in compiled queries (Query.Execute). Use 'ElementAt(Expression<Func<int>>)' instead.For example use 'ElementAt(()=>{0})'. - - - 'ElementAtOrDefault({0})' not supported in compiled queries (Query.Execute). Use 'ElementAtOrDefault(Expression<Func<int>>)' instead.For example use 'ElementAtOrDefault(()=>{0})'. - - - Can not persist: there are pinned entities. - - - Type discriminator value is required unless {0} is marked as default type in hierarchy. - - - '{0}' field is not declared in Entity descendant, so cannot be used as type discriminator. - - - Unable to persist type '{0}' to storage because of loop reference. - - - Unable to store untyped 'Key' to storage. Use '{0}' instead of 'Key'. - - - Field belongs to a different type. - - - SessionManager.EndRequest method was not invoked during processing of the previous request to this module. - - - Both parts of binary expression '{0}' are of the different type. Use type cast. - - - Field '{0}' not found in type '{1}'. - - - Unable to build full-text indexes for hierarchy '{0}' with InheritanceSchema.ClassTable. - - - Unable to translate '{0}'. Use method ('{1}') on First/FirstOrDefault instead of Single/SingleOrDefault. - - - Session '{0}'. Transaction - - - Unable to translate '{0}' expression. Unknown "In" syntax. - - - Field '{0}' must be persistent (marked by [Field] attribute). - - - Entity of type '{0}' does not have full-text index. - - - Unable to translate '{0}'. Entities '{1}' and '{2}' belong to different hierarchies. - - - Unable to translate '{0}'. Join keys length mismatch. - - - Unable to translate '{0}'. Keys of '{1}' and '{2}' not compatible. - - - Ref<{0}>({1}) - - - 'FreeText<T>({0})' not supported in compiled queries (Query.Execute). Use 'FreeText<T>(Expression<Func<int>>)' instead.For example use 'FreeText<T>(()=>{0})'. - - - Session of another SessionBound must be the same. - - - Underlying storage provider does not support SQL. - - - ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'provider' and 'connectionString' elements. - - - Non-temporary keys must be generated by descendants. - - - Specified key field type is not supported by this temporary key generator. - - - Key of specified type cannot be generated by this KeyGenerator. - - - Key generators - - - [KeyGenerator] attribute on type '{0}' requires Name to be set. - - - A transaction is running, but there should be no active transaction. - - - Can't merge the state. - - - Query task is not executed yet. - - - Cyclic dependency in query preprocessor graph is detected. - - - An attempt to automatically activate Session '{0}' inside Session '{1}' (Session switching) is blocked. -Most likely, mixed usage of objects from different Sessions is a result of a bug in your code. -Use manual Session activation (Session.Deactivate(), Session.Activate()) or -SessionOptions.AllowSwitching flag to avoid this exception, if this is intentional. - - - The duplicate for the operation {0} is found. - - - Can't generate next version value of type '{0}'. - - - Property '{0}.{1}' doesn't have public getter. - - - Property '{0}' doesn't have public setter. - - - Type of '{0}' must be a descendant of {1} type. - - - Active Transaction is required for this operation. Use Session.OpenTransaction(...) to open it. - - - Legacy schema is not compatible. Details: -{0} - - - Skipping schema synchronization. - - - '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be of type '{4}' but actually it is '{5}'. - - - '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be 'EntitySet<{4}>' but it is 'EntitySet<{5}>'. - - - ConnectionInfo is missing. If you are using configuration file you should specify either 'connectionUrl' element or 'connectionString' and 'provider' elements - - - ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'connectionString' element. - - - Type with name '{0}' isn't registered in the Domain. - - - Session '{0}'. Invalidate. - - - Session '{0}'. DisconnectedState.Attach - - - Session '{0}'. DisconnectedState.Connect() - - - Session '{0}'. DisconnectedState is disconnected - - - Session '{0}'. DisconnectedState.ApplyChanges - - - Operations - - - Key mapping - - - DisconnectedState.CancelChanges - - - Changes are successfully applied. - - - Key must have exact type here. - - - SyncContext must have no pending actions at this point. - - - Session '{0}'. Remapping entity keys. - - - Entity is already detached from Session. Likely, this is result of creation of new Entity with the same Key. - - - Unable to cast item of type '{0}' to '{1}' in queries. - - - Origin is null. - - - Origin is not null. - - - Only one primary operation can be logged by each OperationContext instance. - - - Session '{0}'. Identifying entity: Key = '{1}', identified as '{2}'. - - - Unable to apply VersionAttribute with VersionMode.Auto or Version.Mode.Manual mode set on field {0} of type {1}. Only VersionMode.Skip is allowed. - - - Invalid scope disposal order. - - - No operation registration scope. Use OperationRegistry.BeginRegistration method to open it. - - - Only one operation can be registered in each scope. - - - Running operation registration must be finished before invocation of this method. - - - You must either apply or cancel cached changes before changing this property. - - - Failed to add schema hint '{0}' to schema hint collection. The hint will be ignored. -Likely, the schema object (table, column, etc.) it references does not exists, because it was manually removed from the database. -Error: {1} - - - Session '{0}'. Version validation failed: Key = '{1}', Version = '{2}' (expected version = '{3}'). - - - Operation isn't registered yet. See Session.Oeprations.RegisterOperations(). - - - OperatonStarted is alerady called for this operation. - - - Operation isn't marked as started. See Sessopn.Operations.OperationStarted() method. - - - Nullable and NullableOnUpgrade flags can't be used with '{0}' field. They can be used only with reference-typed fields (except Structure descendants). - - - {0} - - - - - - - - - - - - - - - - - - - - - - - - Unable to parse value '{0}' for field '{1}' - - - Entity: {0}; - - - Field: {0}; - - - Unable to set 'Indexed' flag on EntitySet field {0}. - - - Unable to set 'Indexed' flag on Structure field {0}. - - - Only secondary indexes can be declared partial. - - - Member '{0}' is not found. Check that either static parameterless method or static property with such name exists. - - - Member '{0}' should return value that is assignable to LambdaExpression - - - LambdaExpression returned by '{0}' should take one parameter of type '{1}' or any base type of it - - - LambdaExpression returned by '{0}' should return value that is assignable to '{1}' - - - Unable to translate '{0}' in partial index definition for index '{1}'. Reason: {2}. - - - member access sequence contains non-persistent fields - - - parameters of type other than '{0}' are not supported - - - expressions of type '{0}' are not supported - - - only primitive and reference fields are supported - - - field '{0}' does not exist in table for '{1}' - - - Type '{0}' has multiple clustered indexes: {1} - - - Type '{0}' declares clustered index '{1}', but only root type can declare clustered indexes in single table hierarhy - - - Index '{0}' can not be both partial and clustered - - - Clustered index can not be declared in interface '{0}' - - - Member '{0}' is not supported - - - Expression '{0}' should take {1} parameters - - - Entity with key '{0}' already exists - - - Invalid field name '{0}'. - - - Can't compile the provider '{0}'. - - - '{0}' must be active. - - - Provider must be either CompilableProvider or ExecutableProvider - - - At least one column index pair must be specified. - - - Can't compile - no active EnumerationContext exists. - - - Can't compile - active CompilationContext has no Compiler (Compiler is null). - - - Can't open EnumerationScope, since there is no current CompilationContext. - - - n/a - - - The type of the expression's return value is not '{0}'. - - - The normalized boolean expression must have the '{0}' form. - - - The normalized boolean expression must be the root expression. - - - The normalized boolean expression must not be the root expression. - - - {0} can't be executed on specified sources. - - - Parameter '{0}' is not a tuple access expression - - - The value of the parameter {0} can't be {1}, if the value of the parameter {2} is {3}. - - - The SelectProvider removes columns used for an ordering. - - - Aggregate '{0}' is not supported for type '{1}' - - - RowNumber{0} - - - The ordering of records is not specified for RowNumberProvider. - - - Can't convert the {0} to the {1}. - - - Predicate contains accesses to different ApplyParameters. - - - Columns used by the predicate containing ApplyParameter are removed. - - - Columns used by the CalculatedColumn's expression containing the ApplyParameter are removed. - - - Order key not found in mapping. - - - Filter tuple descriptor mistmatches with source mapping descriptor. - - - Unable to initialize JoinIndexProvider. Columns count mismatch. - - - Column group could not be found. - - - Only single-column key supported. - - - Sequence contains more than one element. - - - Current compiler is not suitable for this operation, most likely there is no active Session. - - - Processing of VoidProvider is not supported. - - - KeyColumns collection is empty. - - - Column "{0}" contains both key and value collections. - - - Can not find reference to column "{0}". - - - KeyColumns collection contains more then one reference to column "{0}". - - - Referenced column "{0}" does not belong to index "{1}". - - - ValueColumns collection contains more then one reference to column "{0}". - - - Type of column "{0}" is undefined. - - - PrimaryKey is undefined. - - - Primary key column can not be nullable. - - - ForeignKey is undefined. - - - Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence. - - - Culture - - - Length - - - Precision - - - Scale - - - Type - - - {0}: {1} - - - , - - - Invalid Direction value (Direction.None). - - - PrimaryKeyColumns collection is invalid. - - - IncludedColumns collection is invalid. - - - IncludedColumns collection contains more then one reference to column "{0}". - - - ? - - - Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table. - - - Increment value must be greater then zero. - - - Type of sequence "{0}" is undefined. - - - Columns collection is empty. - - - Native type - - - Specified RedoDescriptor can't be logged. - - - Error during Undo execution: descriptor {0}. - - - Concurrency conflict. - - - Deadlock was found. - - - Version conflict. - - - Version conflict on object {0}: expected: {1} = {2}, but it is {3}. - - - AtomicContext is suspended. - - - You can't Activate new operation, since old ActiveOperation is still running. - - - Blocking descriptor can't be invoked. - - - UndoDescriptor is already completed. - - - Complete method must be called just once. - - - Context is not activated. - - - The specified object and the context are incompatible. - - - Incorrect Stage value: '{0}'. - - - Error during undoing the relation synchronization. - - - Value does not match regex pattern '{0}'. - - - {0}: value can not be empty. - - - Field constraint can not be applied to read only property {0}. - - - '{0}' does not support '{1}' value type (location: {2}). - - - {0} - - - Validation failed. - - - {0}: value can not be null. - - - {0}: length of the value must be in [{1} ... {2}] range. - - - {0}: value must be in [{1} ... {2}] range. - - - [{0}] attribute on '{1}' requires a comparer for type '{2}'. - - - Date must be in the past. - - - Value should be in the future. - - - Value should be in the past. - - - Value length can not be greater than {0}. - - - Value length can not be less than {0}. - - - Value length can not be less than {0} or greater than {1}. - - - 'Max' or 'Min' property should be specified. - - - Value should not be empty. - - - Value should not be null. - - - Value should not be null or empty. - - - Field should be of comparable type. - - - Value should not be greater than {0}. - - - Value should not be less than {0}. - - - Value should not be less than {0} or greater than {1}. - - - Regular expression pattern is not specified. - - - Failed to create regular expression from pattern '{0}'. - - - Applying [{0}] to property '{1}' failed. {2} - - - Validation context is in invalid state. This means that some validation error has happened, but later it was suppressed. - - - '{0}' and '{1}' properties must be used together (location: {2}). - - - Both localizable message resource and not localizable message can not be specified at once (location: {0}). - - - SQL Server below 2005 is not supported. - - - SQL Server supports trimming of space characters only. - - - Invalid boolean string '{0}'. - - - Multiple languages not supported for fulltext column {0} of index {1}. - - - No message template is registered for code: {0} - - - Table is not set. - - - Invalid expression type. - - - Unbound column '{0}'. - - - Size should be not negative value. - - - Scale should be non-negative value. - - - Precision should be non-negative value. - - - The scale must be less than or equal to precision. - - - Length should be not negative value. - - - Position value should be greater than zero. - - - Invalid usage of the "rowCount" argument. - - - Invalid usage of the "orientation" argument. - - - Referenced columns count cannot be less then one. - - - Referencing columns count cannot be less then one. - - - Row amount should be positive number. - - - Circular reference is detected. - - - The data type must be exact numeric with scale 0. - - - Literal type '{0}' is not supported. - - - Unable to get default SQL comparer for type {0}. - - - Join expression should be NULL for CROSS APPLY & OUTER APPLY. - - - Node type is unknown. - - - Sql container expression can not be compiled. - - - Specified connection does not belong to this driver. - - - Translation of literal of type '{0}' is not supported. - - - Function '{0}' is not supported. - - - Part of URL contains forbidden characters. Forbidden characters: - - - Operation '{0}' is not supported - - - Specified precision ({0}) is greater than maximum supported by storage ({1}). - - - Table already has specified name. - - - Column already has specified name. - - - Isolation level '{0}' is not supported - - - Lock '{0}' is not supported - - - Only SqlLiteral or SqlPlaceholder can be used in Limit/Offset - - - Name for parameter '{0}' is not found' - - - Value for placeholder '{0}' is not set. - - - Items for cycle '{0}' are not specified. - - - Transaction should be active - - - Transaction should not be active - - - Types of values are different - - - This storage does not support '{0}' values less than '{1}'. Supplied value is '{2}'. - - - This storage does not support '{0}' values greather than '{1}'. Supplied value is '{2}'. - - - Can not read database and schema names - - - This storage does not support '{0}'. - - - Full text queries - - - Increment must not be 0. - - - The data type must be exact numeric without scale or with zero scale. - - - Name must be not null or empty. - - - Schema must be not null. - - - The maximum value must be greater than the minimum value. - - - The start value should be between the minimum and maximum value. - - - Invalid action type. - - - Column belongs to other table. - - - Invalid constraint type. - - - Constraint belongs to other table. - - - Constraint belongs to other domain. - - - Invalid arguments: 'scale' and 'precision' should be used together - - - Invalid arguments: 'precision' and 'length' should not be used together - - - Invalid arguments: non-null 'typeName' is allowed if and only if 'type' equals 'SqlType.Unknown' - - - Type: {0}; - - - Database: {0}; - - - Table: {0}; - - - Column: {0}; - - - Value: {0}; - - - Constraint: {0}; - - - Unable to invalidate session state: newly created entities are attached to session. - - - DefaultSchema should be specified when multi-schema or multi-database mode is active. - - - DefaultSchema and DefaultDatabase should be specified when multi-database mode is active. - - - Processing mapping rules - - - {0} implementors don't belong to any hierarchy. - - - Implementors of {0} interface belong to hierarchies one of which includes TypeId, but another doesn't: {1} & {2}. - - - Implementors of {0} interface belong to hierarchies with different key structure: {1} & {2}. - - - Validating mapping configuration - - - Single hierarchy is mapped to multiple databases: {0}, {1} - - - Interface '{0}' is implemented by types mapped to different databases: {1}, {2} - - - Multi-schema mode is active, but no schema specified for '{0}' - - - Multi-database mode is active, but no database specified for '{0}' - - - Cyclic dependency between databases found: {0} - - - Processing '{0}' - - - Reusing cached mapping information for '{0}' - - - Applying rule '{0}' to '{1}' - - - Calculating database dependencies - - - Temporary tables are not supported by current storage - - - Type ID range for database '{0}' ({1}, {2}) is exhausted - - - Full text indexes are not supported by current storage, ignoring index '{0}' - - - Exception has been thrown by the parameter value accessor. - - - Type discriminator field is not found for '{0}' type - - - Current storage does not support changing column types - - - Direct querying for entity set in compiled queries is not supported, use QueryEndpoint.Items() instead. - - - Compiler {0} has too many parameters. - - - Compiler {0} should have first parameter of type MemberInfo - - - Compiler {0} should return {1}. - - - Compiler {0} should have parameter {1} of type {2} - - - Compiler {0} has invalid target type: target type should be either non-generic or generic type definition. - - - Compiler {0} has invalid target member. - - - Compiler {0} should have "this" parameter. - - - Target member is not found for compiler {0} - - - Compiler for {0} is already registered. - - - Type '{0}' should not be generic. - - - Failed to extract metadata from '{0}.{1}': {2} - - - This method should not be called, use Apply(Session, Expression) instead - - - Option '{0}' is mutually exclusive with option '{1}' - - - Exception has been thrown by the user member compiler. - - - Session '{0}' still uses single available connection. - - - Unable to close single available connection: it is still used by session '{0}'. - - - validateVersion=true is incompatible with PersistRequestKind=Insert - - - BatchingCommandProcessor does not support validation of number of affected rows. - - - Unable to resolve schema for node '{0}'. Please verify that this schema exists. - - - Unable to resolve database for node '{0}'. Please verify that this database exists. - - - Invalid sort expression '{0}' - - - Non-enum parameters for Enum.HasFlag are not supported - - - Non-LINQ calls are not supported within Query.ExecuteDelayed - - - Ignore rule '{0}' must be applied to column or table. - - - Table '{0}' can't be removed due to the foreign key '{1}' of a ignored table or column. - - - Table '{0}' can't be removed due to the ignored column '{1}'. - - - Field should be of type '{0}'. - - - Validator '{0}' configuration failed on type '{1}'. {2} - - - Validator '{0}' configuration failed on type '{1}' field '{2}'. {3} - - - Value should be a valid e-mail. - - - Validators - - - Connection string with name '{0}' is not found. - - - Connection string with name '{0}' is null or empty. - - - Unable to process recycled field definition '{0}': owner type is not registered in model. - - - DateTime.ToString() method is not supported, use the DateTime.ToString("s"). - - - Translation of DateTime.ToString(string) with arbitrary arguments is not supported. Use DateTime.ToString("s"). - - - ChainedBuffer.Remove() method is not supported. - - - Instance is empty. - - - LogManager already initialized. - - - LogManager must be initialized before using. - - - Provider '{0}' does not implement LogProvider class. - - - Unable to get type of provider by name '{0}'. - - - GroupBy overload '{0}' is not supported. - - - Specification of type column for fulltext column is not supported by current storage. Ignoring type column specification for column '{0}'. - - - Type column '{0}' for fulltext column'{1}' must be type of string. - - - Key generators '{0}' and '{1}' have the same seed value. - - - Current type '{0}' is not supported. - - - Current type of expression '{0}' is not supported. - - - Type of entity stored in Key is undefined. - - - Assembly version mismatch: main assembly '{0} {1}', extension assembly '{2} {3}'. - - - Result is not available. - - - Async operation error. - - - Default storage node can not be removed. - - - Invalid node identifier. - - - Storage node with id '{0}' is not found. - - - Storage node is already selected. - - - Type '{0}' is not registered. - - - Schema mapping requires multischema domain configuration. Please provide at least DefaultSchema setting. - - - Database mapping requires multidatabase domain configuration. Please provide at least DefaultDatabase and DefaultSchema settings. - - - Unable to define type identifier '{0}' for type '{1}'. Type is not exists. - - - User defined type identifier '{0}' for type '{1}' less then 100. - - - Custom type identifier '{0}' of type '{1}' beyongs the limits defined for database. - - - Custom type identifier '{0}' of type '{1}' conflicts with type '{2}' in extracted map of types. - - - Storage is not supported limitation of row count to update. - - - Storage is not supported limitation of row count to delete. - - - Unable to remap one of filtered columns. - - - Unable to find type '{0}' in current model. - - - Unable to find column '{0}' of type '{1}' of current model. - - - Translation of {0} method does not support any parameter type, but {1}. - - - Reference registration error: Reference removal is already registered. - - - Reference registration error: Reference addition is already registered. - - - Collection should contain at least {0} elements. - - - Type '{0}' is not supported '{1}' node. - - - Term weight value must be between {0} and {1} - - - Current provider does not support ContainsTable functionality. - - - Argument cannot be white spaces only string. - - - Collection cannot contain any neither null or empty string values. - - - Field '{0}' is complex and cannot be used for search. - - - '{0}' is not suitable field for full-text search - - - Field access expression '{0}' does not access to '{1}' type members. - - - Unexpected type of parameter. - - - Unable to get TableColumn instance from index. - - - More than one enabled {0} is provided. - - - Name value reading or setting is denied. - - - DbName value reading or setting is denied. - - - Extracted and target schemas are equal but there are changes in type identifiers set. - - - Given connection is corrupted. Trying to restore the connection. - - - Connection restore failed. - - - Connection successfully restored. - - - Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited started asynchronous queries before persisting any changes. - - - Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited asyncronous queries before persisting any changes. - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Argument value must be greater than or equal to zero. + + + Argument value must be greater than zero. + + + Collection already contains item with the specified key. + + + Collection has been changed during the enumeration. + + + Collection is empty. + + + Collection is read-only. + + + Dependency operation with full name "{0}" is already registered. + + + Descriptor is in invalid state. + + + Destionation array is too small. + + + The given key was not present in the dictionary. + + + Incompatible array type. + + + The two collections cannot be combined because they use different comparison operations. + + + Index should be in [{0}...{1}] range. + + + Instance is locked. + + + The specified capacity value is less than collection count. + + + The specified item cannot be cached because its type is incompatible with underlying storage format. + + + Specified item is already in use. + + + Specified item is not in use. + + + Specified item isn't pooled. + + + Specified item isn't found. + + + Linked operation for property {0} missing. + + + Maximal item count is {0}. + + + There are no more available items. + + + There is no object with specified key. + + + Operation LinkType should be defined before it can be registered in OperationDictionary. + + + Operation must be locked before it can be registered in OperationDictionary. + + + Operation PropertyName must be specified before it can be registered in OperationDictionary. + + + Pool should be in syncronized mode to utilize AutoCleanup feature. + + + Item already exists in the pool with another key. + + + Port value must be in [0,65535] range. + + + "{0}" is invalid URL. + + + Array does not have zero-based indexing. + + + Source collection contains at least one item of type "{0}", that cannot be cast to the item type of the destination collection. + + + A instance must have non-null IHasSyncRoot.SyncRoot property value. + + + Could not load types from the assembly '{0}'. + + + The specified item cannot be cached because its type is incompatible with ITuple. + + + Argument can't be an empty string. + + + Array is multidimentional. + + + Collecton already contains specified item. + + + The specified capacity value is less than collection count. + + + Index is out of range. + + + Invalid argument type: expected type is {0}. + + + System date \ time has been changed. + + + Measurement is already completed. + + + Internal error: {0} + + + An item with the same key has already been added. + + + Argument should be in range [{0}...{1}]. + + + Property '{0}' of type '{1}' does not have public get accessor. + + + Property '{0}' of type '{1}' does not have public set accessor. + + + Member: '{0}' is not a Public Property or Field of Type: '{1}' + + + Stream length not enough to deserialize object of specified type. + + + Type is not supported by BinaryPrimitiveSerializer. + + + Object is read-only. + + + Instance is already initialized. + + + Property '{0}' is already initialized. + + + Active scope is invalid - it differs from the expected one. Probably you have forgot to dispose some nested scope. + + + Scope can't be disposed. Most likely it is bound to a different thread. + + + {0} is required. Use {1} to set it. + + + Can't find associated {0} of type '{1}' for type '{2}'. + + + Unable to copy a part of the stream to itself. Use StreamExtensions.Copy method instead. + + + Unable to create provider instance. Check if provider's class has static "Instance" property. + + + Scope dispose error. + + + Item should be either an ICollection or ICountable. + + + Can't create associates for generic type definitions (type '{0}'). + + + Multiple associates match type '{0}' by its interfaces (at least '{1}' and '{2}'). + + + '{0}<{1}, {2}>' creation has failed for '{3}'. + + + '{0}<{1}, {2}>' was used for '{3}'. + + + Can't find associated {0} of type '{1}' for type '{2}' or '{3}'. + + + InfinityType.None can't be passed to this constructor. + + + Value is not available. + + + inf + + + Reversed({0}) + + + Conversion from type {0} to type {1} is inadmissible. + + + Can't find {0} ('{1}') for type '{2}'. + + + MinMaxValues aren't supported for TupleFieldAdvancedComparer. + + + Specified type should be either GeneratedTupleDescriptor or its descendant. + + + Type '{0}' must be reference type. + + + Type '{0}' must implement '{1}', or must be its descendant. + + + Field with index '{0}' is infinite. + + + Culture of the applied rule should either be undefined (null), or be the same as on target rule. + + + {0}{1}d + + + Generic parameter '{0}' should be of type '{1}'. + + + Merge operation require intersection of operands. + + + EndPoints order of both ranges must be equal. + + + Range is empty. + + + '{0}' is not allowed or invalid here. + + + Item with name '{0}' was not found. + + + Enumeration is already finished. + + + Cast from '{0}' to '{1}' is invalid. + + + Both measurements have no value. + + + Measurement '{0}' must have value. + + + * + + + ComparisonRule({0}, {1}) + + + ComparisonRules({0}, [{1}]) + + + Box({0}) + + + Entire({0}) + + + ({0}, {1}) + + + ({0}, {1}, {2}) + + + ({0}) + + + null + + + recursive + + + Recursive associate lookup is detected. + + + Instance is not initialized (or not initialized properly). + + + Property '{0}' is not initialized (or not initialized properly). + + + Different TupleDescriptors are not valid here: {0} and {1}. + + + {0}: started. + + + {0}: completed. + + + Attempt to use disposed instance of type '{0}'. + + + Safe dispose of '{0}' failing. + + + Invalid TupleDescriptor. Expected descriptor is {0}. + + + {0}: {1} of ({2}) + + + {0}({1}) + + + The number of sources is too small. Expected number is {0}. + + + TupleDescriptor({0}) + + + [{0} ... {1}] + + + read-only + + + r/o + + + read-write + + + r/w + + + {0}: multiple attributes of type '{1}' are not allowed here. + + + {0} (v{1}) + + + Exception! + + + Use LogCaptureScope constructor instead. + + + Unable to get default hasher for type {0} + + + Original exception(s) + + + A set of exceptions is caught. + + + Service '{0}' is not found. + + + Cached({0}) + + + ThreadSafeCached({0}) + + + Value for parameter '{0}' is not set. + + + Object is already disposed. + + + Record with invalid (possibly - unspecified) type is found. + + + Generic parameter T is resolved to associated '{0}', although '{1}' is expected. + + + '{0}' formatter process type is invalid for the current operation. + + + Reference '{0}' is already defined. + + + Reference '{0}' is not resolved yet. + + + Reference points to null. + + + #({0}) + + + Invalid field map size. Expected {0}. + + + '' + + + Deserialization error: some SerializationData slots were not recognized, thus the format of the serialized data differs from the supported one. + + + '{0}' can't be an IsReferable serializer, since it serializes IReference type. + + + Unable to dispose an item when disposable container has an invalid state. + + + Value with name '{0}' already exists. + + + Value with name '{0}' is not found. + + + Type='{0}', #='{1}' ({2}) + + + Object serializer is invalid, since similar value serializer exists. + + + String does not correspond to the specified descriptor. + + + Unknown expression type: '{0} ({1})' + + + Escape character must differ from delimiter character. + + + The expression must return a value of type '{0}'. + + + The argument must not be of type '{0}'. + + + The expression having the equal normal form must be a root expression. + + + The expression having the different normal form must not be a root expression. + + + Only the normalized expression having the different normal form can be added as the immediate descendant to the root expression. + + + Actual conjunction operand count greater than MaxConjunctionOperandCount. + + + Can't parse the call to the comparison method. + + + Some operands are not Expressions of type 'System.Boolean'. + + + The expected value of the parameter is already set. + + + This operation is not allowed for the parameter context operating with expected values of parameters. + + + {0} is required. + + + Only one ancestor of each instance of this generic type is allowed. + + + Lambda parameter '{0}' is out of scope. + + + The argument '{0}' is less than the argument '{1}'. + + + Argument must be greater than '{0}' + + + Argument must be less than '{0}' + + + Key already exists. + + + Type '{0}' must be non-abstract type. + + + The exception was thrown during the task's execution. + + + Unable to cast null value to {0}; use {0}? instead. + + + {0,6:F2}s @{1,-5} {2,5} {3,-24} {4}{5} + + + {6:s} @{1,-5} {2,5} {3,-24} {4}{5} + + + {3}: {5} + + + Unable to bind parameters to lambda {0}. Parameters count is incorrect. + + + Unable to use expression {0} as {1} parameter of lambda {2} because of type mistmatch. + + + Type '{0}' does not have property '{1}'. + + + Resource property {0} is not of string type. + + + The type {0} has already been registered. + + + The mapping for the property {0} has already been registered. + + + The type {0} hasn't been registered. + + + The specified expression is not a MemberExpression. + + + The accessed member is not a property. + + + The specified expression can't be parsed. + + + Key {0} is not found. + + + Collection has been modified. + + + The properties "{0}" and "{1}" have incompatible types. + + + The reference property {0} is bound to the property {1} that isn't reference. + + + The collection property {0} is bound to the property {1} that isn't collection. + + + The primitive property {0} is bound to the property {1} that isn't primitive. + + + The type {0} isn't a subclass of the type {1}. + + + The limit of the graph depth is exceeded. + + + Nested collection is not supported. + + + The detection of changes in user structure collection isn't supported. + + + The type {0} can't be transformed. + + + {0} in {1} + + + Can't activate service '{0}'. Error: {1} + + + Can't activate service '{0}' with name "{1}". Error: {2} + + + Multiple services match to the specified arguments. + + + Service of type '{0}' is not available. + + + Service with name "{0}" of type '{1}' is not available. + + + Container type must implement {0}. + + + Container type does not provide a suitable constructor. + + + Recursive constructor paremeter dependency is detected. + + + The {0} is neither class nor value type. + + + Argument must be greater that or equal '{0}' + + + Argument must be less than or equal '{0}' + + + Use LogIndentScope constructor instead. + + + Only breakable nodes :( + + + Segment is out of range. + + + The nullable property {0} is bound to the property {1} that isn't nullable. + + + The properties {0} and {1} have different primitive types. + + + Invalid Parent value. + + + Item with name '{0}' already exists. + + + Item with Name '{0}' is not found. + + + Model object cannot be removed. + + + Type of {0} property must be {1}. + + + Invalid node state. + + + Binding has failed for {0}. Check property declaration. + + + Nesting must be created for any node. + + + {0} ({1}) + + + Target object already exists: "{0}". To assign a new one, you must remove the old one first. + + + Can't find a constructor to execute {0}. + + + Node with path "{0}" is not found. + + + Item already exists. + + + Multiple hints found. + + + "{1}" != "{2}" ({0}): {3} + + + +{0}: {1} + + + {0} + + + {0} change(s) + + + Both Source and Target are null. + + + +{0}: + + + Property value must belong to the same Model. + + + Loop in action dependency chain is detected. + + + Comparer.Current is null. + + + Invalid context deactivation sequence. + + + Invalid context activation sequence. + + + Invalid AfterPath property value. + + + Invalid Nesting of node "{0}". + + + Upgarder.Current is null. + + + Automatic upgrade sequence validation + + + Validation failed. + + + Difference + + + {0}: + + + Expected target model + + + Actual target model + + + Upgrade sequence validation failure. + + + Node "{0}" must be processed before being compared as reference (value of "{1}".{2}). + + + Upgrade sequence + + + Difference related to {0} type is not found on the UpgradeContext stack. + + + Property "{0}.{1}" is not found. + + + Invalid transaction state ('{0}'). Expected state(s) is (are) '{1}'. + + + Transaction is already activated. + + + TransactionScope.IsCompleted can not be set to 'false'. + + + Scope-bound transaction can be committed only by its scope. Use TransactionScopeBase.Complete() \ Dispose() methods of appropriate TransactionScopeBase descendant instance to do this. + + + + + + + + + Special character {0} used as escape character. + + + Control character used as escape character + + + Comparer for type '{0}' is not available. + + + Type '{0}' is not registered. + + + Unable to find master association of association '{0}' + + + Could not resolve {0} '{1}' within the domain. + + + Type with TypeId={0} is not registered. + + + TypeId for type {0} is already assigned. + + + Item with key '{0}' was not found. + + + Item with name '{0}' already exists in '{1}'. + + + TypeId is not assigned for type '{0}'. + + + {0} ({1}) + + + <Unnamed> + + + Key contains multiple fields with IsTypeId==true flag. + + + Can't extract foreign key. + + + TypeDiscriminator field is already set. + + + Default type is already registered. + + + Instance must be locked before this operation. + + + {0}.{1} + + + Error setting default value {0} for column '{1}' in type '{2}'. Most likely, its type is incorrect. + + + Index '{0}' is changed. + + + Unable to insert instance of type '{0}' with specified key. Query affected {1} tables, but expected {2} tables. + + + Multiple instances of type '{0}' with specified key are found. + + + Instance of type '{0}' with specified key is not found. + + + Specified query returns multiple results. + + + Type '{0}' has no primary index. + + + Unable to create the connection. Check if all needed assemblies are available. + + + Type '{0}' is not supported by current storage provider. + + + Index '{0}' with attributes '{1}' is not supported. + + + Unable to update instance of type {0} with specified key. Query affected {1} tables, but expecrted {2} tables. + + + Reader is not in consistent state. + + + Enumeration is not started. + + + Unable to find column '{0}' of index '{1}' in primary index. + + + Transaction is already open. + + + Transaction is not open. + + + Index '{0}' is not found. + + + Incorrect command parameters. + + + String.Trim(char[]), String.TrimStart(char[]), string.TrimEnd(char[]) supported only with argument being array of constants. + + + Sequence '{0}' is not found in storage. + + + SQL error occured. + + + Storage error details '{0}' + + + SQL error details '{0}' + + + Original message '{0}' + + + Query '{0}' + + + ROW_NUMBER window function is not supported on this version of PostgreSQL + + + Session '{0}'. Schema upgrade script: +{1} + + + Parameters count is not same as source column lists count. + + + Source column list contains null values. + + + Session '{0}'. Creating connection. + + + Session '{0}'. Opening connection '{1}'. + + + Session '{0}'. Closing connection '{1}'. + + + Session '{0}'. Disposing connection. + + + Session '{0}'. Beginning transaction @ {1}. + + + Session '{0}'. Commit transaction. + + + Session '{0}'. Rollback transaction. + + + Session '{0}'. SQL batch: +{1} + + + '{0}' is not supported + + + Temporary table '{0}' is locked + + + Session '{0}'. Make savepoint '{1}'. + + + Session '{0}'. Rollback to savepoint '{1}'. + + + Session '{0}'. Release savepoint '{1}'. + + + Connection is not open. + + + Commands are already translated. + + + Current storage provider does not support savepoints (nested transactions). + + + Storage '{0}' does not support partial indexes, ignoring filter for partial index '{0}'. + + + Outer parameter reference found, but no SqlCompiler provided + + + Translation of In/Contains is not supported in this case + + + Request is not prepared + + + There are no suitable types in '{0}'. + + + Element with name '{0}' is contained in this instance already. + + + Service with name '{0}' already exists in StorageInfo.Services collection. + + + Field with name '{0}' already exists in EntityInfo.Fields collection. + + + Index with name '{0}' already exists in EntityInfo.Indexes collection. + + + Unsupported type: '{0}'. + + + Element with type '{0}' is already contained in this instance. + + + Type cannot be null. + + + Index already contains field '{0}'. + + + Index field '{0}' is incorrect. + + + Type '{0}' is not found in model. + + + Object is outside of initial transaction scope. + + + Unable to modify removed object. + + + Session bound object is out of session scope. + + + Field '{0}' is not found in model. + + + Value of '{0}' type cannot be assigned to property of '{1}' type. + + + Storage provider '{0}' is not found. + + + Unable to create Key. Key params do not correspond to its structure. + + + TypeInfo hierarchy does not correspond to provided hierarchy. + + + Field '{0}' is a part of primary key. It can't be changed. + + + Unable to modify removed entity. + + + {0}: multiple attributes of type '{1}' are not allowed here. + + + Value length {0} is greater than column length {1}. + + + Unable to assign null to non-nullable column. + + + Invalid type specified. + + + The Session of specified ISessionBound object is invalid. + + + Value can not be null. + + + Entity is removed. + + + Value can not exceed {0}. + + + Value should match regex pattern '{0}' + + + Invalid field value, constraint {0} is violated. + + + Value can not be less then {0}. + + + Some errors have been occurred during storage build. See error log for details. + + + Key field '{0}' was not found in type '{1}'. + + + Value type mismatch for field '{0}' + + + Field with name '{0}' is already registered. + + + Field '{0}' is already defined in type '{1}' or in its ancestor. + + + Interface '{0}' does not belong to '{1}' hierarchy. + + + Type '{0}' does not implement '{1}.{2}' property. + + + Constraint violation: constraint {0} on field '{1}.{2}' of object '{3}' failed on value {4}. + + + Value can not be an entity that is already removed. + + + Indexed properties are not supported. + + + Type '{0}' is not registered in the model. + + + Field '{0}' cannot be LazyLoad as it is included into primary key. + + + Type with name '{0}' is already defined. + + + Type '{0}' is already defined. + + + Index with name '{0}' is already registered. + + + Type '{0}' was not registered for activation. + + + TypeDef '{0}' already belongs to hierarchy with '{1}' root. + + + '{0}' descendant is already a root of another hierarchy. + + + Paired field '{0}' has wrong type. A descendant of Entity or EntitySet is expected. + + + Referenced field '{0}' and paired field are equal. + + + Paired field '{0}.{1}' was not found in '{2}' type. + + + 'AssociationAttribute' can't be applied to '{0}' field. + + + Key provider '{0}' should define at least one key field. + + + Key provider '{0}' and hierarchy {1} key field amount mismatch. + + + Invalid Length attribute on '{0}' field. + + + Field '{0}' has '{1}' type but is marked as not nullable. + + + Explicit LazyLoad=true on field '{0}' is redundant. + + + Explicit mapping name setting is redundant. The same name '{0}' will be generated automatically. + + + Invalid mapping name '{0}'. + + + Index must contain at least one field. + + + Invalid fill factor '{0}'. Value must be between 0 and 1. + + + Column '{0}' is not found. + + + Type '{0}' does not implement '{1}' interface. + + + Type '{0}' is not collatable. + + + '{0}' is not applicable to '{1}' descendants. + + + Name '{0}' is invalid. + + + Index name '{0}' is invalid. + + + Property '{0}' must be declared in type '{1}'. + + + Unsupported field type: '{0}' + + + Key '{0}' was not found in storage. + + + Cannot find a handler of type '{0}'. + + + Key can not be null. + + + Creating {0} + + + Building {0} + + + Model + + + Generators + + + Actual Model + + + Model Definition + + + Custom Definitions + + + Types + + + Defining '{0}' + + + Associations + + + Indexes + + + Columns + + + Hierarchy columns + + + Wrong persistent type candidate: '{0}'. + + + 'NotNullable' constraint violation on field '{0}'. + + + 'Length' constraint violation on field '{0}'. + + + Session is already disposed. + + + Cannot use default generator for complex (multicolumn) Keys. + + + Unable to clone non-user session configuration. + + + Entity is in inconsistent state. + + + Can not open a transaction: there is no current Session. + + + Field '{0}.{1}' is not found. + + + Entity '{0}' is bound to another Session. + + + Value should be '{0}' descendant. + + + EntitySet can't be assigned. + + + Association multiplicity '{0}' is not valid for field '{1}'. + + + Field '{0}.{1}' is already paired with '{2}.{3}'. Please remove [Association] attribute at '{4}.{5}'. + + + Unable to activate EntitySet for '{0}' field because it does not has association. + + + Entity set is invalid due to current transaction is not active. + + + Can not commit a transaction: ValidationContext is in inconsistent state. + + + Item is not found in EntitySet. + + + Can not get validation context: there is no active transaction. + + + Default generator can serve hierarchy with exactly one key field. + + + Type '{0}' is not supported. + + + Key property '{0}' declared in '{1}' should not have public or protected set accessor. Use base protected constructor to set Key value. + + + Unable to set Key field '{0}' explicitly. + + + Section '{0}' is not found in application configuration file. + + + Configuration for Domain with name '{0}' is not found in application configuration file (section '{1}'). + + + Field '{0}' cannot be Nullable as it is included into primary key. + + + There is no current Session. + + + Wrong key structure. + + + StateTransaction property value differs from the current transaction. + + + String representaion of the Key has invalid format. + + + Attempt to associate non-empty EntityState with Key of unknown type. + + + [Association] attribute with PairTo can not be use with field '{0}' of type '{1}'. It is already applied to field '{2}' of type '{3}'. + + + Session with name '{0}' already exists. + + + system types + + + Unsupported expression type: '{0}'. + + + Field '{0}' is not an Entity field in Type '{1}'. + + + Type '{0}' is not an '{1}' descendant. + + + Session is not open. Use Session.Open(...) to open it. + + + Unable to find factory method for type '{0}'. Make sure assembly '{0}' is processed by weaver. See section 2 of Manual for details. + + + Active serialization context is not found. + + + Cannot resolve entity with key '{0}'. + + + Unable to resolve type for Key '{0}'. + + + Unknown entity serialization kind '{0}'. + + + Unable to create key for '{0}' hierarchy. Key value or key generator should be specified. + + + [CompilerContainer] attribute isn't applied to type '{0}'. + + + Invalid upgrader version. + + + TypeId for type '{0}' is not found. + + + Type with type TypeId='{0}' is not found. + + + Actual schema version of assembly '{0}' is expected to be '{1}', but currently it is '{2}'. + + + Only equality ranges are supported. + + + Could not find field segment for field '{0}'. + + + Could not find entity mapping for field '{0}'. + + + Could not find anonymous mapping for field '{0}'. + + + Binary expressions with NodeType = 'ExpressionType.{0}' aren't supported. + + + Could not find grouping mapping for field '{0}'. + + + Could not find subquery mapping for field '{0}'. + + + Specified values aren't enough to create key for type '{0}'. + + + Extracted schema is not compatible with the target schema. Details: +{0} + + + Cannot upgrade schema safely. Details: +{0} + + + Upgrade of assembly '{0}' from version '{1}' to '{2}' is not supported. + + + <none> + + + Duplicate assembly name: '{0}'. + + + No upgrade handler is found for assembly '{0}', version '{1}'. + + + Type with name '{0}' is not found in metadata. + + + Metadata.Type renamed: '{0}' to '{1}'. + + + {0} (Version={1}) + + + {0} (Id={1}) + + + Metadata.Assembly created: '{0}'. + + + Metadata.Assembly updated: '{0}', from version '{1}' to '{2}'. + + + More than one enabled {0} is provided for assembly '{1}'. + + + Extracted schema is not equal to the target schema. Details: +{0} + + + Schema comparison result: {0} +Has unsafe actions: {1} +Has column type changes: {2} +Compatible in ValidateLegacy mode: {3} + +Unsafe actions: +{4} +Schema hints: +{5} +Schema difference: +{6} + + + Comparison result: +{0} + + + Clearing comparison result: +{0} + + + Synchronizing schema in {0} mode + + + Target schema: + + + Extracted schema: + + + Structures do not support fields of type '{0}'. + + + Defining hierarchy for type '{0}' + + + Defining field '{0}' + + + Building declared field '{0}.{1}' + + + Building inherited field '{0}.{1}' + + + Building interface field '{0}.{1}' + + + Defining indexes + + + Building index '{0}' + + + Skipping entity '{0}' as it does not belong to any hierarchy thus it cannot be persistent. + + + Unable to translate '{0}' expression. Downcast from '{1}' to '{2}' not supported. Use 'OfType' or 'as' operator instead. + + + 'as' operator supports casting only inside Entity hierarchy. + + + Prefetch does not support query provider of type '{0}'. + + + ExcludeFields does not support query provider of type '{0}'. + + + IncludeFields does not support query provider of type '{0}'. + + + Method '{0}' is not found. + + + OfType supports casting only inside IEntity hierarchy. + + + Lambda parameter is out of scope. + + + Failed to extract domain model from the storage. + + + Domain model is not found in the storage. + + + Type '{0}' is not found. + + + Hint '{0}' is conflicting with hint '{1}' + + + Key of '{0}' does not match key of '{1}'. + + + Type '{0}' must belong to hierarchy. + + + Unauthorized: the caller is declared outside of any of registered assemblies. + + + Structure of field '{0}' does not match structure of field '{1}'. + + + Invalid Scale attribute on field '{0}'. + + + Invalid Precision attribute on field '{0}'. + + + Unable to translate expression '{0}'. Key comparer is not supported in GroupJoin. + + + Type '{0}' does not participate in the specified association. + + + Active Session is required for this operation. Use Session.Open(...) to open it. + + + Referential integrity violation. + + + Referential integrity violation on attempt to remove '{0}', Key='{1}'. +Association: {2} +Referencing Entity Key: {3} +Referenced Entity Key: {4} + + + LeftJoin does not support query provider of type '{0}'. + + + Type '{0}' does not have a parameterless constructor. + + + Current session getter is already assigned. + + + Value is already assigned. + + + Materialization error: Entity's TypeId column does not exist in the underlying RecordSet. + + + {0}, {1} + + + {0} (unknown), {1} + + + Key values array is empty. + + + Key indexes are specified for non-generic Key. + + + Sequence contains no elements. + + + Key = '{0}', Tuple = {1}, State = {2} + + + n/a + + + Table with name '{0}' is not found. + + + Column with name '{0}' is not found in table '{1}'. + + + Provider "{0}" is not supported. Use one of the following: {1}. + + + Type '{0}' does not contain '{1}' field. + + + Field must be of EntitySet<> type. + + + Field '{0}' is not an EntitySet field. + + + Entity of type '{0}' is incompatible with this EntitySet. + + + Entity with Key = '{0}' does not exist. + + + There is no current HttpRequest, or SessionManager is not bound to it yet. + + + The query contains closures of different types. + + + Invalid prefetch selector '{0}'. + + + Can not commit a transaction. Validation context is in invalid state. + + + Lock does not support query provider of type '{0}'. + + + This instance is expired due to transaction boundaries. + + + '{0}.{1}' OnOwnerRemove action is not equal to '{2}.{3}' OnTargetRemove action. + + + Unable to associate type '{0}' with type '{1}'. Type '{0}' is already mapped to type '{2}'. + + + Unable to associate field '{0}' with field '{1}'. Field '{0}' is already mapped to field '{2}'. + + + Inheritance schema '{0}' is invalid. + + + VisitKeyField is not supported by '{0}'. + + + Paired identity columns for types '{0}' and '{1}' not found + + + Could not get member {0} from expression. + + + Incorrect namespace synonyms. + + + '{0}' method isn't supported. + + + Expression '{0}' is unknown. + + + Field '{0}' is not structure. + + + Nested field '{0}' is not supported. + + + Field '{0}' is not primitive. + + + Field '{0}' is not entity. + + + Persistent type '{0}' is not entity or persistent interface. + + + Configuration with '{0}' name already registered. + + + '{0}' name can't be empty. + + + '{0}' is not valid name for {1}. + + + Hierarchy '{0}' doesn't contain any key fields. + + + Key structure for '{0}' contains NULL value. + + + Key field '{0}.{1}' is not found. + + + Key field can't be of '{0}' type. + + + '{0}' must be inherited from '{1}'. + + + Field of type '{0}' cannot be nullable. For value types consider using Nullable<T>. + + + Structure '{0}' can't contain field of the same type. + + + '{0}.{1}': '{2}' value is not acceptable for 'OnTargetRemove' property. + + + Hierarchy is not found for type '{0}'. + + + Unable to build generic instance types for '{0}' type because it contains more then 1 generic parameter. + + + Unable to build generic instance types for '{0}' type because parameter is not constrained. + + + Item by key ='{0}' was not found. + + + At least one loop have been found in persistent type dependencies graph. Suspicious types: {0} + + + Key fields '{0}' and '{1}' have the same position: '{2}'. + + + Unable to remap FieldExpression. + + + Unable to translate '{0}' expression. Aggregates for non primitive types are not supported. + + + ParameterExpression must have same type as ProjectionExpression.ItemProjector + + + '{0}' does not support '{1}'. + + + Hierarchy root is not registered. + + + Only entities could be hierarchy roots. + + + Field '{0}' is not an entity reference, nor entity set. + + + Field '{0}' is not an entity set. + + + Unable to remap KeyExpression. + + + Unable to handle EntitySetExpression without specified Owner. + + + Unable to remove Owner from EntitySetExpression. + + + Unable to use base implementation of VisitGenericExpression without specifying genericProcessor delegate. + + + Unable to resolve owner of StructureExpression '{0}'. + + + Unable to resolve owner of FieldExpression '{0}'. + + + SelectMany collection selector '{0}' must have only one lambda parameter. + + + Subquery '{0}' header must have only one column. + + + Unable to translate expression '{0}'. LINQ translator does not support method '{1}'. + + + 'Contains' method is only supported for root expressions or subqueries. + + + 'All' method is only supported for root expressions or subqueries. + + + 'Any' method is only supported for root expressions or subqueries. + + + 'TypeIs' method supports only Entities and Structures. + + + Binary expression '{0}' of type '{1}' is not supported. + + + Both left and right part of binary expression '{0}' are NULL or not StructureExpression. + + + Both left and right part of binary expression '{0}' are NULL or not EntityExpression(EntityFieldExpression). + + + Both left and right part of binary expression '{0}' are NULL or not KeyExpression. + + + Mistmatch count of left and right expressions. + + + Unable to build subquery result for expression '{0}'. State contains no parameters. + + + Unable to build subquery result for expression '{0}'. resultType is not IEnumerable<>. + + + MethodCall expression '{0}' is not supported. + + + Lambda '{0}' must have only one parameter. + + + Unable to translate '{0}' expression. Aggregate method '{1} is not supported. + + + Can't access member of type 'EntitySet<>'. + + + Can't access member '{0}' + + + Unable to translate lambda expression '{0}' because it requires to materialize entity of type '{1}'. + + + Type '{0}' is not supported in 'new' expression. + + + Can not commit a transaction. Entities validation failed. + + + Type '{0}' is not structure. + + + Unable to materialize back local collection item '{0}'. + + + Type '{0}' does not has any public readable properties or fields, so it can't be persisted to storage. + + + The specified type's hierarchy is different from the key's hierarchy. + + + The field {0} is not declared in the type {1} or in one of its ancestors. + + + Indexes of columns to be loaded are not specified. + + + The referencing entity with key {0} is not found. + + + The referencing entity's tuple is not loaded. + + + The foreign key's value have not been loaded. + + + The access to a type's member can not be extracted from the specified expression. + + + The specified property {0} is not persistent. + + + Primary key field '{0}' can't be marked as Version. + + + Version field '{0}' can't be LazyLoad field. + + + Version field '{0}' can't be of {1} type. + + + Version field '{0}' can't be System field. + + + Version field '{0}' can't be TypeId field. + + + Type '{0}' can't contain Version fields, because it is not a hierarchy root type. + + + 'Take' does not support query provider of type '{0}'. + + + 'Skip' does not support query provider of type '{0}'. + + + Version root object can't implement IHasVersionRoots. + + + Unable to use IQueryable '{0}' in Query.Execute statement. + + + Could not construct new Key instance. Type '{0}' is not an entity. + + + (can't change type of column '{0}') + + + (can't remove table '{0}') + + + (can't remove column '{0}') + + + Unable to build index {0} because it contains inherited fields. + + + Session '{0}'. Disposing. + + + Domain is disposing. + + + Domain is disposing by a finalizer. + + + Opening session '{0}'. + + + Session '{0}'. Removing: Key = '{1}'. + + + Session '{0}'. Materializing {1}: Key = '{2}'. + + + Session '{0}'. Getting value: Key = '{1}', Field = '{2}'. + + + Session '{0}'. Setting value: Key = '{1}', Field = '{2}'. + + + Session '{0}'. Resolving key '{1}'. Exact type is unknown. Fetch is required. + + + Session '{0}'. Resolving key '{1}'. Exact type is {2}. + + + known + + + unknown + + + Session '{0}'. Resolving key '{1}'. Key is already resolved. + + + Session '{0}'. Caching: {1}. + + + Session '{0}'. Updating cache: {1}. + + + Session '{0}'. Persisting (reason: {1}). + + + partial + + + full + + + Session '{0}'. Persist completed. + + + Processing fixup actions + + + Executing action: '{0}' + + + Hierarchy: '{0}' + + + Field: '{0}' + + + Index: '{0}' + + + Inspecting hierarchy '{0}' + + + Inspecting type '{0}' + + + Inspecting model definition + + + Member '{0}' of type '{1}' is not initialized. Check if constructor argument is correct or field initialized through initializer. + + + Invalid number of parameters in NewExpression. + + + 'ElementAt' does not support query provider of type '{0}'. + + + 'ElementAtOrDefault' does not support query provider of type '{0}'. + + + Usage of ElementAt(int) or ElementAtOrDefault(int) in Query.Execute is wrong. Use ElementAt(Func<int>) or ElementAtOrDefault(Func<int>) instead. + + + ElementAt index must be greater or equal to zero. + + + Local collection should not be query root. + + + Connection is required. + + + DisconnectedState is already attached to session. + + + DisconnectedState is detached. + + + State with key '{0}' is already exists. + + + State is not loaded. + + + State is removed. + + + Key {0} should have exact type. + + + Service '{0}' is not supported. + + + {0} is obsolete. Use {1} and {2} instead. + + + Can not complete outer transaction: inner transaction is active. + + + Can not open more than one inner transaction. + + + Can not reuse opened transaction: requested isolation level is different. + + + Can not mark state as modified: it is not valid in current transaction. + + + Transaction is not active. + + + Version of entity with key '{0}' differs from the expected one. + + + The service is already attached to Session. + + + Service can not be attached to Session while it is persisting the changes. + + + Can't register state. + + + Can't merge state. + + + Session '{0}'. Opening transaction. + + + Session '{0}'. Committing transaction. + + + Session '{0}'. Committed transaction. + + + Session '{0}'. Rolling back transaction. + + + Session '{0}'. Rolled back transaction. + + + Unable to translate '{0}' expression. See inner exception for details. + + + Expression '{0}' defined outside of CachingQuery closure. + + + Expression '{0}' is not a sequence. + + + 'Take({0})' not supported in compiled queries (Query.Execute). Use 'Take(Expression<Func<int>>)' instead.For example use 'Take(()=>{0})'. + + + 'Skip({0})' not supported in compiled queries (Query.Execute). Use 'Skip(Expression<Func<int>>)' instead.For example use 'Skip(()=>{0})'. + + + 'ElementAt({0})' not supported in compiled queries (Query.Execute). Use 'ElementAt(Expression<Func<int>>)' instead.For example use 'ElementAt(()=>{0})'. + + + 'ElementAtOrDefault({0})' not supported in compiled queries (Query.Execute). Use 'ElementAtOrDefault(Expression<Func<int>>)' instead.For example use 'ElementAtOrDefault(()=>{0})'. + + + Can not persist: there are pinned entities. + + + Type discriminator value is required unless {0} is marked as default type in hierarchy. + + + '{0}' field is not declared in Entity descendant, so cannot be used as type discriminator. + + + Unable to persist type '{0}' to storage because of loop reference. + + + Unable to store untyped 'Key' to storage. Use '{0}' instead of 'Key'. + + + Field belongs to a different type. + + + SessionManager.EndRequest method was not invoked during processing of the previous request to this module. + + + Both parts of binary expression '{0}' are of the different type. Use type cast. + + + Field '{0}' not found in type '{1}'. + + + Unable to build full-text indexes for hierarchy '{0}' with InheritanceSchema.ClassTable. + + + Unable to translate '{0}'. Use method ('{1}') on First/FirstOrDefault instead of Single/SingleOrDefault. + + + Session '{0}'. Transaction + + + Unable to translate '{0}' expression. Unknown "In" syntax. + + + Field '{0}' must be persistent (marked by [Field] attribute). + + + Entity of type '{0}' does not have full-text index. + + + Unable to translate '{0}'. Entities '{1}' and '{2}' belong to different hierarchies. + + + Unable to translate '{0}'. Join keys length mismatch. + + + Unable to translate '{0}'. Keys of '{1}' and '{2}' not compatible. + + + Ref<{0}>({1}) + + + 'FreeText<T>({0})' not supported in compiled queries (Query.Execute). Use 'FreeText<T>(Expression<Func<int>>)' instead.For example use 'FreeText<T>(()=>{0})'. + + + Session of another SessionBound must be the same. + + + Underlying storage provider does not support SQL. + + + ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'provider' and 'connectionString' elements. + + + Non-temporary keys must be generated by descendants. + + + Specified key field type is not supported by this temporary key generator. + + + Key of specified type cannot be generated by this KeyGenerator. + + + Key generators + + + [KeyGenerator] attribute on type '{0}' requires Name to be set. + + + A transaction is running, but there should be no active transaction. + + + Can't merge the state. + + + Query task is not executed yet. + + + Cyclic dependency in query preprocessor graph is detected. + + + An attempt to automatically activate Session '{0}' inside Session '{1}' (Session switching) is blocked. +Most likely, mixed usage of objects from different Sessions is a result of a bug in your code. +Use manual Session activation (Session.Deactivate(), Session.Activate()) or +SessionOptions.AllowSwitching flag to avoid this exception, if this is intentional. + + + The duplicate for the operation {0} is found. + + + Can't generate next version value of type '{0}'. + + + Property '{0}.{1}' doesn't have public getter. + + + Property '{0}' doesn't have public setter. + + + Type of '{0}' must be a descendant of {1} type. + + + Active Transaction is required for this operation. Use Session.OpenTransaction(...) to open it. + + + Legacy schema is not compatible. Details: +{0} + + + Skipping schema synchronization. + + + '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be of type '{4}' but actually it is '{5}'. + + + '{0}.{1}' field, which is declared as paired to '{2}.{3}' field, should be 'EntitySet<{4}>' but it is 'EntitySet<{5}>'. + + + ConnectionInfo is missing. If you are using configuration file you should specify either 'connectionUrl' element or 'connectionString' and 'provider' elements + + + ConnectionInfo is wrong. You should set either 'connectionUrl' element or 'connectionString' element. + + + Type with name '{0}' isn't registered in the Domain. + + + Session '{0}'. Invalidate. + + + Session '{0}'. DisconnectedState.Attach + + + Session '{0}'. DisconnectedState.Connect() + + + Session '{0}'. DisconnectedState is disconnected + + + Session '{0}'. DisconnectedState.ApplyChanges + + + Operations + + + Key mapping + + + DisconnectedState.CancelChanges + + + Changes are successfully applied. + + + Key must have exact type here. + + + SyncContext must have no pending actions at this point. + + + Session '{0}'. Remapping entity keys. + + + Entity is already detached from Session. Likely, this is result of creation of new Entity with the same Key. + + + Unable to cast item of type '{0}' to '{1}' in queries. + + + Origin is null. + + + Origin is not null. + + + Only one primary operation can be logged by each OperationContext instance. + + + Session '{0}'. Identifying entity: Key = '{1}', identified as '{2}'. + + + Unable to apply VersionAttribute with VersionMode.Auto or Version.Mode.Manual mode set on field {0} of type {1}. Only VersionMode.Skip is allowed. + + + Invalid scope disposal order. + + + No operation registration scope. Use OperationRegistry.BeginRegistration method to open it. + + + Only one operation can be registered in each scope. + + + Running operation registration must be finished before invocation of this method. + + + You must either apply or cancel cached changes before changing this property. + + + Failed to add schema hint '{0}' to schema hint collection. The hint will be ignored. +Likely, the schema object (table, column, etc.) it references does not exists, because it was manually removed from the database. +Error: {1} + + + Session '{0}'. Version validation failed: Key = '{1}', Version = '{2}' (expected version = '{3}'). + + + Operation isn't registered yet. See Session.Oeprations.RegisterOperations(). + + + OperatonStarted is alerady called for this operation. + + + Operation isn't marked as started. See Sessopn.Operations.OperationStarted() method. + + + Nullable and NullableOnUpgrade flags can't be used with '{0}' field. They can be used only with reference-typed fields (except Structure descendants). + + + {0} + + + + + + + + + + + + + + + + + + + + + + + + Unable to parse value '{0}' for field '{1}' + + + Entity: {0}; + + + Field: {0}; + + + Unable to set 'Indexed' flag on EntitySet field {0}. + + + Unable to set 'Indexed' flag on Structure field {0}. + + + Only secondary indexes can be declared partial. + + + Member '{0}' is not found. Check that either static parameterless method or static property with such name exists. + + + Member '{0}' should return value that is assignable to LambdaExpression + + + LambdaExpression returned by '{0}' should take one parameter of type '{1}' or any base type of it + + + LambdaExpression returned by '{0}' should return value that is assignable to '{1}' + + + Unable to translate '{0}' in partial index definition for index '{1}'. Reason: {2}. + + + member access sequence contains non-persistent fields + + + parameters of type other than '{0}' are not supported + + + expressions of type '{0}' are not supported + + + only primitive and reference fields are supported + + + field '{0}' does not exist in table for '{1}' + + + Type '{0}' has multiple clustered indexes: {1} + + + Type '{0}' declares clustered index '{1}', but only root type can declare clustered indexes in single table hierarhy + + + Index '{0}' can not be both partial and clustered + + + Clustered index can not be declared in interface '{0}' + + + Member '{0}' is not supported + + + Expression '{0}' should take {1} parameters + + + Entity with key '{0}' already exists + + + Invalid field name '{0}'. + + + Can't compile the provider '{0}'. + + + '{0}' must be active. + + + Provider must be either CompilableProvider or ExecutableProvider + + + At least one column index pair must be specified. + + + Can't compile - no active EnumerationContext exists. + + + Can't compile - active CompilationContext has no Compiler (Compiler is null). + + + Can't open EnumerationScope, since there is no current CompilationContext. + + + n/a + + + The type of the expression's return value is not '{0}'. + + + The normalized boolean expression must have the '{0}' form. + + + The normalized boolean expression must be the root expression. + + + The normalized boolean expression must not be the root expression. + + + {0} can't be executed on specified sources. + + + Parameter '{0}' is not a tuple access expression + + + The value of the parameter {0} can't be {1}, if the value of the parameter {2} is {3}. + + + The SelectProvider removes columns used for an ordering. + + + Aggregate '{0}' is not supported for type '{1}' + + + RowNumber{0} + + + The ordering of records is not specified for RowNumberProvider. + + + Can't convert the {0} to the {1}. + + + Predicate contains accesses to different ApplyParameters. + + + Columns used by the predicate containing ApplyParameter are removed. + + + Columns used by the CalculatedColumn's expression containing the ApplyParameter are removed. + + + Order key not found in mapping. + + + Filter tuple descriptor mistmatches with source mapping descriptor. + + + Unable to initialize JoinIndexProvider. Columns count mismatch. + + + Column group could not be found. + + + Only single-column key supported. + + + Sequence contains more than one element. + + + Current compiler is not suitable for this operation, most likely there is no active Session. + + + Processing of VoidProvider is not supported. + + + KeyColumns collection is empty. + + + Column "{0}" contains both key and value collections. + + + Can not find reference to column "{0}". + + + KeyColumns collection contains more then one reference to column "{0}". + + + Referenced column "{0}" does not belong to index "{1}". + + + ValueColumns collection contains more then one reference to column "{0}". + + + Type of column "{0}" is undefined. + + + PrimaryKey is undefined. + + + Primary key column can not be nullable. + + + ForeignKey is undefined. + + + Invalid ForeignKey structure: its column sequence do not match PrimaryKey column sequence. + + + Culture + + + Length + + + Precision + + + Scale + + + Type + + + {0}: {1} + + + , + + + Invalid Direction value (Direction.None). + + + PrimaryKeyColumns collection is invalid. + + + IncludedColumns collection is invalid. + + + IncludedColumns collection contains more then one reference to column "{0}". + + + ? + + + Invalid PrimaryKeyInfo structure: sequence KeyColumns and ValueColumns do not match sequence of all the Columns of the table. + + + Increment value must be greater then zero. + + + Type of sequence "{0}" is undefined. + + + Columns collection is empty. + + + Native type + + + Specified RedoDescriptor can't be logged. + + + Error during Undo execution: descriptor {0}. + + + Concurrency conflict. + + + Deadlock was found. + + + Version conflict. + + + Version conflict on object {0}: expected: {1} = {2}, but it is {3}. + + + AtomicContext is suspended. + + + You can't Activate new operation, since old ActiveOperation is still running. + + + Blocking descriptor can't be invoked. + + + UndoDescriptor is already completed. + + + Complete method must be called just once. + + + Context is not activated. + + + The specified object and the context are incompatible. + + + Incorrect Stage value: '{0}'. + + + Error during undoing the relation synchronization. + + + Value does not match regex pattern '{0}'. + + + {0}: value can not be empty. + + + Field constraint can not be applied to read only property {0}. + + + '{0}' does not support '{1}' value type (location: {2}). + + + {0} + + + Validation failed. + + + {0}: value can not be null. + + + {0}: length of the value must be in [{1} ... {2}] range. + + + {0}: value must be in [{1} ... {2}] range. + + + [{0}] attribute on '{1}' requires a comparer for type '{2}'. + + + Date must be in the past. + + + Value should be in the future. + + + Value should be in the past. + + + Value length can not be greater than {0}. + + + Value length can not be less than {0}. + + + Value length can not be less than {0} or greater than {1}. + + + 'Max' or 'Min' property should be specified. + + + Value should not be empty. + + + Value should not be null. + + + Value should not be null or empty. + + + Field should be of comparable type. + + + Value should not be greater than {0}. + + + Value should not be less than {0}. + + + Value should not be less than {0} or greater than {1}. + + + Regular expression pattern is not specified. + + + Failed to create regular expression from pattern '{0}'. + + + Applying [{0}] to property '{1}' failed. {2} + + + Validation context is in invalid state. This means that some validation error has happened, but later it was suppressed. + + + '{0}' and '{1}' properties must be used together (location: {2}). + + + Both localizable message resource and not localizable message can not be specified at once (location: {0}). + + + SQL Server below 2005 is not supported. + + + SQL Server supports trimming of space characters only. + + + Invalid boolean string '{0}'. + + + Multiple languages not supported for fulltext column {0} of index {1}. + + + No message template is registered for code: {0} + + + Table is not set. + + + Invalid expression type. + + + Unbound column '{0}'. + + + Size should be not negative value. + + + Scale should be non-negative value. + + + Precision should be non-negative value. + + + The scale must be less than or equal to precision. + + + Length should be not negative value. + + + Position value should be greater than zero. + + + Invalid usage of the "rowCount" argument. + + + Invalid usage of the "orientation" argument. + + + Referenced columns count cannot be less then one. + + + Referencing columns count cannot be less then one. + + + Row amount should be positive number. + + + Circular reference is detected. + + + The data type must be exact numeric with scale 0. + + + Literal type '{0}' is not supported. + + + Unable to get default SQL comparer for type {0}. + + + Join expression should be NULL for CROSS APPLY & OUTER APPLY. + + + Node type is unknown. + + + Sql container expression can not be compiled. + + + Specified connection does not belong to this driver. + + + Translation of literal of type '{0}' is not supported. + + + Function '{0}' is not supported. + + + Part of URL contains forbidden characters. Forbidden characters: + + + Operation '{0}' is not supported + + + Specified precision ({0}) is greater than maximum supported by storage ({1}). + + + Table already has specified name. + + + Column already has specified name. + + + Isolation level '{0}' is not supported + + + Lock '{0}' is not supported + + + Only SqlLiteral or SqlPlaceholder can be used in Limit/Offset + + + Name for parameter '{0}' is not found' + + + Value for placeholder '{0}' is not set. + + + Items for cycle '{0}' are not specified. + + + Transaction should be active + + + Transaction should not be active + + + Types of values are different + + + This storage does not support '{0}' values less than '{1}'. Supplied value is '{2}'. + + + This storage does not support '{0}' values greather than '{1}'. Supplied value is '{2}'. + + + Can not read database and schema names + + + This storage does not support '{0}'. + + + Full text queries + + + Increment must not be 0. + + + The data type must be exact numeric without scale or with zero scale. + + + Name must be not null or empty. + + + Schema must be not null. + + + The maximum value must be greater than the minimum value. + + + The start value should be between the minimum and maximum value. + + + Invalid action type. + + + Column belongs to other table. + + + Invalid constraint type. + + + Constraint belongs to other table. + + + Constraint belongs to other domain. + + + Invalid arguments: 'scale' and 'precision' should be used together + + + Invalid arguments: 'precision' and 'length' should not be used together + + + Invalid arguments: non-null 'typeName' is allowed if and only if 'type' equals 'SqlType.Unknown' + + + Type: {0}; + + + Database: {0}; + + + Table: {0}; + + + Column: {0}; + + + Value: {0}; + + + Constraint: {0}; + + + Unable to invalidate session state: newly created entities are attached to session. + + + DefaultSchema should be specified when multi-schema or multi-database mode is active. + + + DefaultSchema and DefaultDatabase should be specified when multi-database mode is active. + + + Processing mapping rules + + + {0} implementors don't belong to any hierarchy. + + + Implementors of {0} interface belong to hierarchies one of which includes TypeId, but another doesn't: {1} & {2}. + + + Implementors of {0} interface belong to hierarchies with different key structure: {1} & {2}. + + + Validating mapping configuration + + + Single hierarchy is mapped to multiple databases: {0}, {1} + + + Interface '{0}' is implemented by types mapped to different databases: {1}, {2} + + + Multi-schema mode is active, but no schema specified for '{0}' + + + Multi-database mode is active, but no database specified for '{0}' + + + Cyclic dependency between databases found: {0} + + + Processing '{0}' + + + Reusing cached mapping information for '{0}' + + + Applying rule '{0}' to '{1}' + + + Calculating database dependencies + + + Temporary tables are not supported by current storage + + + Type ID range for database '{0}' ({1}, {2}) is exhausted + + + Full text indexes are not supported by current storage, ignoring index '{0}' + + + Exception has been thrown by the parameter value accessor. + + + Type discriminator field is not found for '{0}' type + + + Current storage does not support changing column types + + + Direct querying for entity set in compiled queries is not supported, use QueryEndpoint.Items() instead. + + + Compiler {0} has too many parameters. + + + Compiler {0} should have first parameter of type MemberInfo + + + Compiler {0} should return {1}. + + + Compiler {0} should have parameter {1} of type {2} + + + Compiler {0} has invalid target type: target type should be either non-generic or generic type definition. + + + Compiler {0} has invalid target member. + + + Compiler {0} should have "this" parameter. + + + Target member is not found for compiler {0} + + + Compiler for {0} is already registered. + + + Type '{0}' should not be generic. + + + Failed to extract metadata from '{0}.{1}': {2} + + + This method should not be called, use Apply(Session, Expression) instead + + + Option '{0}' is mutually exclusive with option '{1}' + + + Exception has been thrown by the user member compiler. + + + Session '{0}' still uses single available connection. + + + Unable to close single available connection: it is still used by session '{0}'. + + + validateVersion=true is incompatible with PersistRequestKind=Insert + + + BatchingCommandProcessor does not support validation of number of affected rows. + + + Unable to resolve schema for node '{0}'. Please verify that this schema exists. + + + Unable to resolve database for node '{0}'. Please verify that this database exists. + + + Invalid sort expression '{0}' + + + Non-enum parameters for Enum.HasFlag are not supported + + + Non-LINQ calls are not supported within Query.ExecuteDelayed + + + Ignore rule '{0}' must be applied to column or table. + + + Table '{0}' can't be removed due to the foreign key '{1}' of a ignored table or column. + + + Table '{0}' can't be removed due to the ignored column '{1}'. + + + Field should be of type '{0}'. + + + Validator '{0}' configuration failed on type '{1}'. {2} + + + Validator '{0}' configuration failed on type '{1}' field '{2}'. {3} + + + Value should be a valid e-mail. + + + Validators + + + Connection string with name '{0}' is not found. + + + Connection string with name '{0}' is null or empty. + + + Unable to process recycled field definition '{0}': owner type is not registered in model. + + + DateTime.ToString() method is not supported, use the DateTime.ToString("s"). + + + Translation of DateTime.ToString(string) with arbitrary arguments is not supported. Use DateTime.ToString("s"). + + + ChainedBuffer.Remove() method is not supported. + + + Instance is empty. + + + LogManager already initialized. + + + LogManager must be initialized before using. + + + Provider '{0}' does not implement LogProvider class. + + + Unable to get type of provider by name '{0}'. + + + GroupBy overload '{0}' is not supported. + + + Specification of type column for fulltext column is not supported by current storage. Ignoring type column specification for column '{0}'. + + + Type column '{0}' for fulltext column'{1}' must be type of string. + + + Key generators '{0}' and '{1}' have the same seed value. + + + Current type '{0}' is not supported. + + + Current type of expression '{0}' is not supported. + + + Type of entity stored in Key is undefined. + + + Assembly version mismatch: main assembly '{0} {1}', extension assembly '{2} {3}'. + + + Result is not available. + + + Async operation error. + + + Default storage node can not be removed. + + + Invalid node identifier. + + + Storage node with id '{0}' is not found. + + + Storage node is already selected. + + + Type '{0}' is not registered. + + + Schema mapping requires multischema domain configuration. Please provide at least DefaultSchema setting. + + + Database mapping requires multidatabase domain configuration. Please provide at least DefaultDatabase and DefaultSchema settings. + + + Unable to define type identifier '{0}' for type '{1}'. Type is not exists. + + + User defined type identifier '{0}' for type '{1}' less then 100. + + + Custom type identifier '{0}' of type '{1}' beyongs the limits defined for database. + + + Custom type identifier '{0}' of type '{1}' conflicts with type '{2}' in extracted map of types. + + + Storage is not supported limitation of row count to update. + + + Storage is not supported limitation of row count to delete. + + + Unable to remap one of filtered columns. + + + Unable to find type '{0}' in current model. + + + Unable to find column '{0}' of type '{1}' of current model. + + + Translation of {0} method does not support any parameter type, but {1}. + + + Reference registration error: Reference removal is already registered. + + + Reference registration error: Reference addition is already registered. + + + Collection should contain at least {0} elements. + + + Type '{0}' is not supported '{1}' node. + + + Term weight value must be between {0} and {1} + + + Current provider does not support ContainsTable functionality. + + + Argument cannot be white spaces only string. + + + Collection cannot contain any neither null or empty string values. + + + Field '{0}' is complex and cannot be used for search. + + + '{0}' is not suitable field for full-text search + + + Field access expression '{0}' does not access to '{1}' type members. + + + Unexpected type of parameter. + + + Unable to get TableColumn instance from index. + + + More than one enabled {0} is provided. + + + Name value reading or setting is denied. + + + DbName value reading or setting is denied. + + + Extracted and target schemas are equal but there are changes in type identifiers set. + + + Given connection is corrupted. Trying to restore the connection. + + + Connection restore failed. + + + Connection successfully restored. + + + Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited started asynchronous queries before persisting any changes. + + + Unable to save modified entites because some asynchronous query is incomplete. Make sure you awaited asyncronous queries before persisting any changes. + + diff --git a/Orm/Xtensive.Orm/Tuples/AccessorDelegates.cs b/Orm/Xtensive.Orm/Tuples/AccessorDelegates.cs index f90b6d6085..031fe946d6 100644 --- a/Orm/Xtensive.Orm/Tuples/AccessorDelegates.cs +++ b/Orm/Xtensive.Orm/Tuples/AccessorDelegates.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.17 - -using Xtensive.Tuples.Packed; - -namespace Xtensive.Tuples -{ - /// - /// Incapsulates method. - /// - /// Type of a value. - /// Tuple to use. - /// Field descriptor. - /// State of a field. - /// - internal delegate TValue GetValueDelegate(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState); - - /// - /// Incapsulates method. - /// - /// Type of a value. - /// Tuple to use. - /// Field descriptor. - /// A value. - internal delegate void SetValueDelegate(PackedTuple tuple, ref PackedFieldDescriptor descriptor, TValue value); +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.17 + +using Xtensive.Tuples.Packed; + +namespace Xtensive.Tuples +{ + /// + /// Incapsulates method. + /// + /// Type of a value. + /// Tuple to use. + /// Field descriptor. + /// State of a field. + /// + internal delegate TValue GetValueDelegate(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState); + + /// + /// Incapsulates method. + /// + /// Type of a value. + /// Tuple to use. + /// Field descriptor. + /// A value. + internal delegate void SetValueDelegate(PackedTuple tuple, ref PackedFieldDescriptor descriptor, TValue value); } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/DifferentialTuple.cs b/Orm/Xtensive.Orm/Tuples/DifferentialTuple.cs index d4be881242..3c94b46dde 100644 --- a/Orm/Xtensive.Orm/Tuples/DifferentialTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/DifferentialTuple.cs @@ -1,235 +1,235 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.05.22 - -using System; -using System.Diagnostics; -using System.Runtime.Serialization; -using Xtensive.Core; - - - -namespace Xtensive.Tuples -{ - /// - /// Differential tuple. Combines read-only tuple - /// with tuple providing all the - /// changes made to . - /// - [Serializable] - public sealed class DifferentialTuple : Tuple - { - private Tuple origin; - private Tuple difference; - private DifferentialTuple backupedDifference; - - /// - public override TupleDescriptor Descriptor { - [DebuggerStepThrough] - get { return origin.Descriptor; } - } - - /// - public override int Count { - [DebuggerStepThrough] - get { return origin.Count; } - } - - /// - /// Gets original tuple. - /// - public Tuple Origin { - [DebuggerStepThrough] - get { return origin; } - [DebuggerStepThrough] - set { origin = value; } - } - - /// - /// Gets or sets difference tuple. - /// Can be (acts as if no values are available in this tuple). - /// - public Tuple Difference { - [DebuggerStepThrough] - get { return difference; } - [DebuggerStepThrough] - set { - if (value!=null && value.Descriptor!=Descriptor) - throw new ArgumentException( - string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, Descriptor), - "value"); - difference = value; - } - } - - /// - /// Indicates whether field with specified is changed. - /// - /// Index of the field to check. - /// if specified field is changed; - /// otherwise, . - public bool IsChanged(int fieldIndex) - { - if (difference==null) - return false; - return difference.GetFieldState(fieldIndex).IsAvailable(); - } - - /// - /// Merges the with the . - /// - public void Merge() - { - if (difference==null) - return; - BackupDifference(); - origin = origin.ToRegular(); - origin.MergeWith(difference, 0, origin.Descriptor.Count, MergeBehavior.PreferDifference); - difference = null; - } - - protected internal void RestoreDifference() - { - if (backupedDifference != null) { - origin.MergeWith(backupedDifference.Origin, MergeBehavior.PreferDifference); - if (difference==null) - difference = backupedDifference.Difference.Clone(); - else - difference.MergeWith(backupedDifference, 0, MergeBehavior.PreferDifference); - backupedDifference = null; - } - } - - protected internal void BackupDifference() - { - if (difference != null) - backupedDifference = (DifferentialTuple) this.Clone(); - } - - protected internal void DropBackedUpDifference() - { - backupedDifference = null; - } - - /// - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - Tuple tuple; - if (isWriting) { - if (difference == null) - difference = origin.CreateNew(); - tuple = difference; - } - else - tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() - ? difference - : origin; - return tuple.GetMappedContainer(fieldIndex, isWriting); - } - - #region GetFieldState, GetValueOrDefault, SetValue methods - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() - ? difference - : origin; - return tuple.GetFieldState(fieldIndex); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() - ? difference - : origin; - tuple.SetFieldState(fieldIndex, fieldState); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() - ? difference - : origin; - return tuple.GetValue(fieldIndex, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - if (difference == null) - difference = origin.CreateNew(); - difference.SetValue(fieldIndex, fieldValue); - } - - #endregion - - #region CreateNew, Clone, Reset methods - - /// - public override Tuple CreateNew() - { - return new DifferentialTuple(origin.CreateNew()); - } - - /// - public override Tuple Clone() - { - return new DifferentialTuple( - origin.Clone(), - difference==null ? null : difference.Clone(), - backupedDifference==null ? null : (DifferentialTuple) backupedDifference.Clone()); - } - - /// - /// Resets all the changes in by re-creating it. - /// - public void Reset() - { - difference = null; - } - - #endregion - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// Initial property value. - public DifferentialTuple(Tuple origin) - { - ArgumentValidator.EnsureArgumentNotNull(origin, "origin"); - this.origin = origin; - difference = null; - backupedDifference = null; - } - - /// - /// Initializes a new instance of this type. - /// - /// Initial property value. - /// Initial property value. - /// Tuple descriptors mismatch. - public DifferentialTuple(Tuple origin, Tuple difference) - { - ArgumentValidator.EnsureArgumentNotNull(origin, "origin"); - if (difference!=null && origin.Descriptor!=difference.Descriptor) - throw new ArgumentException( - string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, origin.Descriptor), - "difference"); - this.origin = origin; - this.difference = difference; - backupedDifference = null; - } - - private DifferentialTuple(Tuple origin, Tuple difference, DifferentialTuple backupedDifference) - : this(origin, difference) - { - this.backupedDifference = backupedDifference; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.05.22 + +using System; +using System.Diagnostics; +using System.Runtime.Serialization; +using Xtensive.Core; + + + +namespace Xtensive.Tuples +{ + /// + /// Differential tuple. Combines read-only tuple + /// with tuple providing all the + /// changes made to . + /// + [Serializable] + public sealed class DifferentialTuple : Tuple + { + private Tuple origin; + private Tuple difference; + private DifferentialTuple backupedDifference; + + /// + public override TupleDescriptor Descriptor { + [DebuggerStepThrough] + get { return origin.Descriptor; } + } + + /// + public override int Count { + [DebuggerStepThrough] + get { return origin.Count; } + } + + /// + /// Gets original tuple. + /// + public Tuple Origin { + [DebuggerStepThrough] + get { return origin; } + [DebuggerStepThrough] + set { origin = value; } + } + + /// + /// Gets or sets difference tuple. + /// Can be (acts as if no values are available in this tuple). + /// + public Tuple Difference { + [DebuggerStepThrough] + get { return difference; } + [DebuggerStepThrough] + set { + if (value!=null && value.Descriptor!=Descriptor) + throw new ArgumentException( + string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, Descriptor), + "value"); + difference = value; + } + } + + /// + /// Indicates whether field with specified is changed. + /// + /// Index of the field to check. + /// if specified field is changed; + /// otherwise, . + public bool IsChanged(int fieldIndex) + { + if (difference==null) + return false; + return difference.GetFieldState(fieldIndex).IsAvailable(); + } + + /// + /// Merges the with the . + /// + public void Merge() + { + if (difference==null) + return; + BackupDifference(); + origin = origin.ToRegular(); + origin.MergeWith(difference, 0, origin.Descriptor.Count, MergeBehavior.PreferDifference); + difference = null; + } + + protected internal void RestoreDifference() + { + if (backupedDifference != null) { + origin.MergeWith(backupedDifference.Origin, MergeBehavior.PreferDifference); + if (difference==null) + difference = backupedDifference.Difference.Clone(); + else + difference.MergeWith(backupedDifference, 0, MergeBehavior.PreferDifference); + backupedDifference = null; + } + } + + protected internal void BackupDifference() + { + if (difference != null) + backupedDifference = (DifferentialTuple) this.Clone(); + } + + protected internal void DropBackedUpDifference() + { + backupedDifference = null; + } + + /// + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + Tuple tuple; + if (isWriting) { + if (difference == null) + difference = origin.CreateNew(); + tuple = difference; + } + else + tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() + ? difference + : origin; + return tuple.GetMappedContainer(fieldIndex, isWriting); + } + + #region GetFieldState, GetValueOrDefault, SetValue methods + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() + ? difference + : origin; + return tuple.GetFieldState(fieldIndex); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() + ? difference + : origin; + tuple.SetFieldState(fieldIndex, fieldState); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + var tuple = difference != null && difference.GetFieldState(fieldIndex).IsAvailable() + ? difference + : origin; + return tuple.GetValue(fieldIndex, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + if (difference == null) + difference = origin.CreateNew(); + difference.SetValue(fieldIndex, fieldValue); + } + + #endregion + + #region CreateNew, Clone, Reset methods + + /// + public override Tuple CreateNew() + { + return new DifferentialTuple(origin.CreateNew()); + } + + /// + public override Tuple Clone() + { + return new DifferentialTuple( + origin.Clone(), + difference==null ? null : difference.Clone(), + backupedDifference==null ? null : (DifferentialTuple) backupedDifference.Clone()); + } + + /// + /// Resets all the changes in by re-creating it. + /// + public void Reset() + { + difference = null; + } + + #endregion + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// Initial property value. + public DifferentialTuple(Tuple origin) + { + ArgumentValidator.EnsureArgumentNotNull(origin, "origin"); + this.origin = origin; + difference = null; + backupedDifference = null; + } + + /// + /// Initializes a new instance of this type. + /// + /// Initial property value. + /// Initial property value. + /// Tuple descriptors mismatch. + public DifferentialTuple(Tuple origin, Tuple difference) + { + ArgumentValidator.EnsureArgumentNotNull(origin, "origin"); + if (difference!=null && origin.Descriptor!=difference.Descriptor) + throw new ArgumentException( + string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, origin.Descriptor), + "difference"); + this.origin = origin; + this.difference = difference; + backupedDifference = null; + } + + private DifferentialTuple(Tuple origin, Tuple difference, DifferentialTuple backupedDifference) + : this(origin, difference) + { + this.backupedDifference = backupedDifference; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/FastReadOnlyTuple.cs b/Orm/Xtensive.Orm/Tuples/FastReadOnlyTuple.cs index 94286dce86..55c1f452a4 100644 --- a/Orm/Xtensive.Orm/Tuples/FastReadOnlyTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/FastReadOnlyTuple.cs @@ -1,88 +1,88 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.11.01 - -using System; -using System.Diagnostics; -using Xtensive.Core; - - -namespace Xtensive.Tuples -{ - /// - /// Fast read-only implementation. - /// - [Serializable] - public sealed class FastReadOnlyTuple : Tuple - { - private readonly TupleDescriptor descriptor; - private readonly TupleFieldState[] states; - private readonly object[] values; - private int? cachedHash; - - /// - public override TupleDescriptor Descriptor - { - get { return descriptor; } - } - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - return states[fieldIndex]; - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - throw Exceptions.ObjectIsReadOnly(null); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - fieldState = states[fieldIndex]; - return values[fieldIndex]; - } - - /// - /// - /// - /// Always throws . - /// - /// Always thrown by this method. - public override void SetValue(int fieldIndex, object fieldValue) - { - throw Exceptions.ObjectIsReadOnly(null); - } - - /// - public override int GetHashCode() - { - if (!cachedHash.HasValue) - cachedHash = base.GetHashCode(); - return cachedHash.GetValueOrDefault(); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The tuple to create the fast read-only tuple from. - public FastReadOnlyTuple(Tuple source) - { - descriptor = source.Descriptor; - int count = descriptor.Count; - values = new object[count]; - states = new TupleFieldState[count]; - for (int i = 0; i + /// Fast read-only implementation. + /// + [Serializable] + public sealed class FastReadOnlyTuple : Tuple + { + private readonly TupleDescriptor descriptor; + private readonly TupleFieldState[] states; + private readonly object[] values; + private int? cachedHash; + + /// + public override TupleDescriptor Descriptor + { + get { return descriptor; } + } + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + return states[fieldIndex]; + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + throw Exceptions.ObjectIsReadOnly(null); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + fieldState = states[fieldIndex]; + return values[fieldIndex]; + } + + /// + /// + /// + /// Always throws . + /// + /// Always thrown by this method. + public override void SetValue(int fieldIndex, object fieldValue) + { + throw Exceptions.ObjectIsReadOnly(null); + } + + /// + public override int GetHashCode() + { + if (!cachedHash.HasValue) + cachedHash = base.GetHashCode(); + return cachedHash.GetValueOrDefault(); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The tuple to create the fast read-only tuple from. + public FastReadOnlyTuple(Tuple source) + { + descriptor = source.Descriptor; + int count = descriptor.Count; + values = new object[count]; + states = new TupleFieldState[count]; + for (int i = 0; i - /// Describes a tuple. - /// - public interface ITuple : - ICloneable, - ITupleFactory - { - /// - /// Gets tuple descriptor. - /// - TupleDescriptor Descriptor { get; } - - /// - /// Gets field count for this instance. - /// - int Count { get;} - - /// - /// Clones the tuple. - /// - /// A new instance of the tuple of the same type - /// and with the same field values. - new Tuple Clone(); - - /// - /// Gets the field state associated with the field. - /// - /// Index of the field to get the state for. - TupleFieldState GetFieldState(int fieldIndex); - - /// - /// Gets the field value by its index. - /// - /// Index of the field to get value of. - /// Field value. - /// - /// If field value is not available (see ), - /// an exception will be thrown. - /// - /// Field value is not available. - object GetValue(int fieldIndex); - - /// - /// Gets the field value by its index, if it is available; - /// otherwise returns default value for field type. - /// - /// Index of the field to get value of. - /// Field state associated with the field. - /// Field value, if it is available; otherwise, default value for field type. - object GetValue(int fieldIndex, out TupleFieldState fieldState); - - /// - /// Gets the value field value by its index, if it is available (see ) and is not null (see ); - /// otherwise returns . - /// - /// Index of the field to get value of. - /// Field value, if it is available and not null; otherwise, . - object GetValueOrDefault(int fieldIndex); - - /// - /// Sets the field value by its index. - /// - /// Index of the field to set value of. - /// Field value. - /// Type of stored value is incompatible - /// with the specified one. - void SetValue(int fieldIndex, object fieldValue); - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.05.30 + +using System; + +namespace Xtensive.Tuples +{ + /// + /// Describes a tuple. + /// + public interface ITuple : + ICloneable, + ITupleFactory + { + /// + /// Gets tuple descriptor. + /// + TupleDescriptor Descriptor { get; } + + /// + /// Gets field count for this instance. + /// + int Count { get;} + + /// + /// Clones the tuple. + /// + /// A new instance of the tuple of the same type + /// and with the same field values. + new Tuple Clone(); + + /// + /// Gets the field state associated with the field. + /// + /// Index of the field to get the state for. + TupleFieldState GetFieldState(int fieldIndex); + + /// + /// Gets the field value by its index. + /// + /// Index of the field to get value of. + /// Field value. + /// + /// If field value is not available (see ), + /// an exception will be thrown. + /// + /// Field value is not available. + object GetValue(int fieldIndex); + + /// + /// Gets the field value by its index, if it is available; + /// otherwise returns default value for field type. + /// + /// Index of the field to get value of. + /// Field state associated with the field. + /// Field value, if it is available; otherwise, default value for field type. + object GetValue(int fieldIndex, out TupleFieldState fieldState); + + /// + /// Gets the value field value by its index, if it is available (see ) and is not null (see ); + /// otherwise returns . + /// + /// Index of the field to get value of. + /// Field value, if it is available and not null; otherwise, . + object GetValueOrDefault(int fieldIndex); + + /// + /// Sets the field value by its index. + /// + /// Index of the field to set value of. + /// Field value. + /// Type of stored value is incompatible + /// with the specified one. + void SetValue(int fieldIndex, object fieldValue); + } +} diff --git a/Orm/Xtensive.Orm/Tuples/Interfaces/ITupleFactory.cs b/Orm/Xtensive.Orm/Tuples/Interfaces/ITupleFactory.cs index 1e4471bf71..9d2608f862 100644 --- a/Orm/Xtensive.Orm/Tuples/Interfaces/ITupleFactory.cs +++ b/Orm/Xtensive.Orm/Tuples/Interfaces/ITupleFactory.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.02.04 - -namespace Xtensive.Tuples -{ - /// - /// factory contract. - /// - public interface ITupleFactory - { - /// - /// Creates new instance of the tuple of the same type. - /// - /// A new instance of the tuple of the same type. - Tuple CreateNew(); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.02.04 + +namespace Xtensive.Tuples +{ + /// + /// factory contract. + /// + public interface ITupleFactory + { + /// + /// Creates new instance of the tuple of the same type. + /// + /// A new instance of the tuple of the same type. + Tuple CreateNew(); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/MergeBehavior.cs b/Orm/Xtensive.Orm/Tuples/MergeBehavior.cs index 42c79eb06d..0743e7f555 100644 --- a/Orm/Xtensive.Orm/Tuples/MergeBehavior.cs +++ b/Orm/Xtensive.Orm/Tuples/MergeBehavior.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Dmitri Maximov -// Created: 2008.07.21 - -namespace Xtensive.Tuples -{ - /// - /// Possible tuple merge behaviors. - /// - public enum MergeBehavior - { - /// - /// The same as - /// - Default = PreferOrigin, - - /// - /// Origin values are preferrable. - /// - PreferOrigin = 0, - - /// - /// Difference values are preferrable. - /// - PreferDifference = 1, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Dmitri Maximov +// Created: 2008.07.21 + +namespace Xtensive.Tuples +{ + /// + /// Possible tuple merge behaviors. + /// + public enum MergeBehavior + { + /// + /// The same as + /// + Default = PreferOrigin, + + /// + /// Origin values are preferrable. + /// + PreferOrigin = 0, + + /// + /// Difference values are preferrable. + /// + PreferDifference = 1, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Packed/FieldPackingType.cs b/Orm/Xtensive.Orm/Tuples/Packed/FieldPackingType.cs index 738c731729..825160a1ae 100644 --- a/Orm/Xtensive.Orm/Tuples/Packed/FieldPackingType.cs +++ b/Orm/Xtensive.Orm/Tuples/Packed/FieldPackingType.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2003-2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.23 - -namespace Xtensive.Tuples.Packed -{ - internal enum FieldPackingType - { - Object = 0, - Value = 1 - } +// Copyright (C) 2003-2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.23 + +namespace Xtensive.Tuples.Packed +{ + internal enum FieldPackingType + { + Object = 0, + Value = 1 + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs b/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs index 63c6cc81b5..32792fe39d 100644 --- a/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs +++ b/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs @@ -1,560 +1,560 @@ -// Copyright (C) 2003-2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.01.22 - -using System; - -namespace Xtensive.Tuples.Packed -{ - internal abstract class PackedFieldAccessor - { - /// - /// Getter delegate. - /// - protected Delegate Getter; - - /// - /// Setter delegate. - /// - protected Delegate Setter; - - /// - /// Nullable getter delegate. - /// - protected Delegate NullableGetter; - - /// - /// Nullable setter delegate. - /// - protected Delegate NullableSetter; - - public readonly int Rank; - public readonly int ValueBitCount; - protected readonly long ValueBitMask; - - public void SetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, bool isNullable, T value) - { - var setter = (isNullable ? NullableSetter : Setter) as SetValueDelegate; - if (setter!=null) - setter.Invoke(tuple, ref descriptor, value); - else - SetUntypedValue(tuple, ref descriptor, value); - } - - public T GetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, bool isNullable, out TupleFieldState fieldState) - { - var getter = (isNullable ? NullableGetter : Getter) as GetValueDelegate; - if (getter!=null) - return getter.Invoke(tuple, ref descriptor, out fieldState); - var targetType = typeof (T); - - //Dirty hack of nullable enum reading - if (isNullable) - targetType = Nullable.GetUnderlyingType(targetType) ?? targetType; - if (targetType.IsEnum) - return (T) Enum.ToObject(targetType, GetUntypedValue(tuple, ref descriptor, out fieldState)); - return (T) GetUntypedValue(tuple, ref descriptor, out fieldState); - } - - public abstract object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState); - - public abstract void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value); - - public abstract void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, - PackedTuple target, ref PackedFieldDescriptor targetDescriptor); - - public abstract bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, - PackedTuple right, ref PackedFieldDescriptor rightDescriptor); - - public abstract int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor); - - protected PackedFieldAccessor(int rank) - { - Rank = rank; - ValueBitCount = 1 << Rank; - - // What we want here is to shift 1L by ValueBitCount to left and then subtract 1 - // This gives us a mask. For example if bit count = 4 then - // 0000_0001 << 4 = 0001_0000 - // 0001_000 - 1 = 0000_1111 - // However in case bit count equal to data type size left shift doesn't work as we want - // e.g. for Int8 : 0000_0001 << 8 = 0000_0001 but we would like it to be 0000_0000 - // because 0000_0000 - 1 = 1111_1111 and this is exactly what we need. - // As a workaround we do left shift in two steps. In the example above - // 0000_0001 << 7 = 1000_0000 - // and then - // 1000_0000 << 1 = 0000_0000 - ValueBitMask = (1L << (ValueBitCount - 1) << 1) - 1; - } - } - - internal sealed class ObjectFieldAccessor : PackedFieldAccessor - { - public override object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) - { - var state = tuple.GetFieldState(ref descriptor); - fieldState = state; - return state==TupleFieldState.Available ? tuple.Objects[descriptor.ObjectIndex] : null; - } - - public override void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value) - { - tuple.Objects[descriptor.ObjectIndex] = value; - if (value!=null) - tuple.SetFieldState(ref descriptor, TupleFieldState.Available); - else - tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); - } - - public override void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, - PackedTuple target, ref PackedFieldDescriptor targetDescriptor) - { - target.Objects[targetDescriptor.ObjectIndex] = source.Objects[sourceDescriptor.ObjectIndex]; - } - - public override bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, - PackedTuple right, ref PackedFieldDescriptor rightDescriptor) - { - var leftValue = left.Objects[leftDescriptor.ObjectIndex]; - var rightValue = right.Objects[rightDescriptor.ObjectIndex]; - return leftValue.Equals(rightValue); - } - - public override int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor) - { - return tuple.Objects[descriptor.ObjectIndex].GetHashCode(); - } - - public ObjectFieldAccessor() - : base(-1) - { } - } - - internal abstract class ValueFieldAccessor : PackedFieldAccessor - { - public Type FieldType { get; protected set; } - - private static int GetRank(int bitSize) - { - var rank = 0; - while ((bitSize >>= 1) > 0) { - rank++; - } - - return rank; - } - - protected ValueFieldAccessor(int bitCount) - : base(GetRank(bitCount)) - {} - } - - internal abstract class ValueFieldAccessor : ValueFieldAccessor - where T : struct, IEquatable - { - private static readonly T DefaultValue = default; - private static readonly T? NullValue = null; - - protected virtual long Encode(T value) => throw new NotSupportedException(); - - protected virtual void Encode(T value, long[] values, int offset) => throw new NotSupportedException(); - - protected virtual T Decode(long value) => throw new NotSupportedException(); - - protected virtual T Decode(long[] values, int offset) => throw new NotSupportedException(); - - public override object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) - { - var state = tuple.GetFieldState(ref descriptor); - fieldState = state; - return state==TupleFieldState.Available ? (object) Load(tuple, ref descriptor) : null; - } - - public override void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value) - { - if (value!=null) { - Store(tuple, ref descriptor, (T) value); - tuple.SetFieldState(ref descriptor, TupleFieldState.Available); - } - else { - tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); - } - } - - public override void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, - PackedTuple target, ref PackedFieldDescriptor targetDescriptor) - { - Store(target, ref targetDescriptor, Load(source, ref sourceDescriptor)); - } - - public override bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, - PackedTuple right, ref PackedFieldDescriptor rightDescriptor) - { - var leftValue = Load(left, ref leftDescriptor); - var rightValue = Load(right, ref rightDescriptor); - return leftValue.Equals(rightValue); - } - - public override int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor) - { - return Load(tuple, ref descriptor).GetHashCode(); - } - - private T GetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) - { - var state = tuple.GetFieldState(ref descriptor); - fieldState = state; - return state==TupleFieldState.Available ? Load(tuple, ref descriptor) : DefaultValue; - } - - private T? GetNullableValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) - { - var state = tuple.GetFieldState(ref descriptor); - fieldState = state; - return state==TupleFieldState.Available ? Load(tuple, ref descriptor) : NullValue; - } - - private void SetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, T value) - { - Store(tuple, ref descriptor, value); - tuple.SetFieldState(ref descriptor, TupleFieldState.Available); - } - - private void SetNullableValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, T? value) - { - if (value!=null) { - Store(tuple, ref descriptor, value.Value); - tuple.SetFieldState(ref descriptor, TupleFieldState.Available); - } - else - tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); - } - - private void Store(PackedTuple tuple, ref PackedFieldDescriptor d, T value) - { - if (Rank > 6) { - Encode(value, tuple.Values, d.ValueIndex); - return; - } - - var encoded = Encode(value); - var block = tuple.Values[d.ValueIndex]; - var mask = ValueBitMask << d.ValueBitOffset; - tuple.Values[d.ValueIndex] = (block & ~mask) | ((encoded << d.ValueBitOffset) & mask); - } - - private T Load(PackedTuple tuple, ref PackedFieldDescriptor d) - { - if (Rank > 6) { - return Decode(tuple.Values, d.ValueIndex); - } - - var encoded = (tuple.Values[d.ValueIndex] >> d.ValueBitOffset) & ValueBitMask; - return Decode(encoded); - } - - protected ValueFieldAccessor(int bits) - : base(bits) - { - FieldType = typeof(T); - Getter = (GetValueDelegate) GetValue; - Setter = (SetValueDelegate) SetValue; - - NullableGetter = (GetValueDelegate) GetNullableValue; - NullableSetter = (SetValueDelegate) SetNullableValue; - } - } - - internal sealed class BooleanFieldAccessor : ValueFieldAccessor - { - protected override long Encode(bool value) - { - return value ? 1L : 0L; - } - - protected override bool Decode(long value) - { - return value!=0; - } - - public BooleanFieldAccessor() - : base(1) - { - } - } - - internal sealed class FloatFieldAccessor : ValueFieldAccessor - { - protected override long Encode(float value) - { - unsafe { - return *(int*) &value; - } - } - - protected override float Decode(long value) - { - var intValue = unchecked ((int) value); - unsafe { - return *(float*) &intValue; - } - } - - public FloatFieldAccessor() - : base(sizeof(float) * 8) - { - } - } - - internal sealed class DoubleFieldAccessor : ValueFieldAccessor - { - protected override long Encode(double value) - { - return BitConverter.DoubleToInt64Bits(value); - } - - protected override double Decode(long value) - { - return BitConverter.Int64BitsToDouble(value); - } - - public DoubleFieldAccessor() - : base(sizeof(double) * 8) - { - } - } - - internal sealed class TimeSpanFieldAccessor : ValueFieldAccessor - { - protected override long Encode(TimeSpan value) - { - return value.Ticks; - } - - protected override TimeSpan Decode(long value) - { - return TimeSpan.FromTicks(value); - } - - public TimeSpanFieldAccessor() - : base(sizeof(long) * 8) - { - } - } - - internal sealed class DateTimeFieldAccessor : ValueFieldAccessor - { - protected override long Encode(DateTime value) - { - return value.ToBinary(); - } - - protected override DateTime Decode(long value) - { - return DateTime.FromBinary(value); - } - - public DateTimeFieldAccessor() - : base(sizeof(long) * 8) - { - } - } - - internal sealed class ByteFieldAccessor : ValueFieldAccessor - { - protected override long Encode(byte value) - { - return value; - } - - protected override byte Decode(long value) - { - return unchecked ((byte) value); - } - - public ByteFieldAccessor() - : base(sizeof(byte) * 8) - { - } - } - - internal sealed class SByteFieldAccessor : ValueFieldAccessor - { - protected override long Encode(sbyte value) - { - return value; - } - - protected override sbyte Decode(long value) - { - return unchecked ((sbyte) value); - } - - public SByteFieldAccessor() - : base(sizeof(sbyte) * 8) - { - } - } - - internal sealed class ShortFieldAccessor : ValueFieldAccessor - { - protected override long Encode(short value) - { - return value; - } - - protected override short Decode(long value) - { - return unchecked ((short) value); - } - - public ShortFieldAccessor() - : base(sizeof(short) * 8) - { - } - } - - internal sealed class UShortFieldAccessor : ValueFieldAccessor - { - protected override long Encode(ushort value) - { - return value; - } - - protected override ushort Decode(long value) - { - return unchecked ((ushort) value); - } - - public UShortFieldAccessor() - : base(sizeof(ushort) * 8) - { - } - } - - internal sealed class IntFieldAccessor : ValueFieldAccessor - { - protected override long Encode(int value) - { - return value; - } - - protected override int Decode(long value) - { - return unchecked ((int) value); - } - - public IntFieldAccessor() - : base(sizeof(int) * 8) - { - } - } - - internal sealed class UIntFieldAccessor : ValueFieldAccessor - { - protected override long Encode(uint value) - { - return value; - } - - protected override uint Decode(long value) - { - return unchecked ((uint) value); - } - - public UIntFieldAccessor() - : base(sizeof(uint) * 8) - { - } - } - - internal sealed class LongFieldAccessor : ValueFieldAccessor - { - protected override long Encode(long value) - { - return value; - } - - protected override long Decode(long value) - { - return value; - } - - public LongFieldAccessor() - : base(sizeof(long) * 8) - { - } - } - - internal sealed class ULongFieldAccessor : ValueFieldAccessor - { - protected override long Encode(ulong value) - { - return unchecked((long) value); - } - - protected override ulong Decode(long value) - { - return unchecked((ulong) value); - } - - public ULongFieldAccessor() - : base(sizeof(ulong) * 8) - { - } - } - - internal sealed class GuidFieldAccessor : ValueFieldAccessor - { - protected override Guid Decode(long[] values, int offset) - { - unsafe { - fixed (long* valuePtr = &values[offset]) - return *(Guid*) valuePtr; - } - } - - protected override void Encode(Guid value, long[] values, int offset) - { - unsafe { - fixed (long* valuePtr = &values[offset]) - *(Guid*) valuePtr = value; - } - } - - private static unsafe int GetSize() - { - return sizeof (Guid); - } - - public GuidFieldAccessor() - : base(GetSize() * 8) - { - } - } - - internal sealed class DecimalFieldAccessor : ValueFieldAccessor - { - protected override decimal Decode(long[] values, int offset) - { - unsafe { - fixed (long* valuePtr = &values[offset]) - return *(decimal*) valuePtr; - } - } - - protected override void Encode(decimal value, long[] values, int offset) - { - unsafe { - fixed (long* valuePtr = &values[offset]) - *(decimal*) valuePtr = value; - } - } - public DecimalFieldAccessor() - : base(sizeof(decimal) * 8) - { - } - } -} +// Copyright (C) 2003-2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.01.22 + +using System; + +namespace Xtensive.Tuples.Packed +{ + internal abstract class PackedFieldAccessor + { + /// + /// Getter delegate. + /// + protected Delegate Getter; + + /// + /// Setter delegate. + /// + protected Delegate Setter; + + /// + /// Nullable getter delegate. + /// + protected Delegate NullableGetter; + + /// + /// Nullable setter delegate. + /// + protected Delegate NullableSetter; + + public readonly int Rank; + public readonly int ValueBitCount; + protected readonly long ValueBitMask; + + public void SetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, bool isNullable, T value) + { + var setter = (isNullable ? NullableSetter : Setter) as SetValueDelegate; + if (setter!=null) + setter.Invoke(tuple, ref descriptor, value); + else + SetUntypedValue(tuple, ref descriptor, value); + } + + public T GetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, bool isNullable, out TupleFieldState fieldState) + { + var getter = (isNullable ? NullableGetter : Getter) as GetValueDelegate; + if (getter!=null) + return getter.Invoke(tuple, ref descriptor, out fieldState); + var targetType = typeof (T); + + //Dirty hack of nullable enum reading + if (isNullable) + targetType = Nullable.GetUnderlyingType(targetType) ?? targetType; + if (targetType.IsEnum) + return (T) Enum.ToObject(targetType, GetUntypedValue(tuple, ref descriptor, out fieldState)); + return (T) GetUntypedValue(tuple, ref descriptor, out fieldState); + } + + public abstract object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState); + + public abstract void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value); + + public abstract void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, + PackedTuple target, ref PackedFieldDescriptor targetDescriptor); + + public abstract bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, + PackedTuple right, ref PackedFieldDescriptor rightDescriptor); + + public abstract int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor); + + protected PackedFieldAccessor(int rank) + { + Rank = rank; + ValueBitCount = 1 << Rank; + + // What we want here is to shift 1L by ValueBitCount to left and then subtract 1 + // This gives us a mask. For example if bit count = 4 then + // 0000_0001 << 4 = 0001_0000 + // 0001_000 - 1 = 0000_1111 + // However in case bit count equal to data type size left shift doesn't work as we want + // e.g. for Int8 : 0000_0001 << 8 = 0000_0001 but we would like it to be 0000_0000 + // because 0000_0000 - 1 = 1111_1111 and this is exactly what we need. + // As a workaround we do left shift in two steps. In the example above + // 0000_0001 << 7 = 1000_0000 + // and then + // 1000_0000 << 1 = 0000_0000 + ValueBitMask = (1L << (ValueBitCount - 1) << 1) - 1; + } + } + + internal sealed class ObjectFieldAccessor : PackedFieldAccessor + { + public override object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) + { + var state = tuple.GetFieldState(ref descriptor); + fieldState = state; + return state==TupleFieldState.Available ? tuple.Objects[descriptor.ObjectIndex] : null; + } + + public override void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value) + { + tuple.Objects[descriptor.ObjectIndex] = value; + if (value!=null) + tuple.SetFieldState(ref descriptor, TupleFieldState.Available); + else + tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); + } + + public override void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, + PackedTuple target, ref PackedFieldDescriptor targetDescriptor) + { + target.Objects[targetDescriptor.ObjectIndex] = source.Objects[sourceDescriptor.ObjectIndex]; + } + + public override bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, + PackedTuple right, ref PackedFieldDescriptor rightDescriptor) + { + var leftValue = left.Objects[leftDescriptor.ObjectIndex]; + var rightValue = right.Objects[rightDescriptor.ObjectIndex]; + return leftValue.Equals(rightValue); + } + + public override int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor) + { + return tuple.Objects[descriptor.ObjectIndex].GetHashCode(); + } + + public ObjectFieldAccessor() + : base(-1) + { } + } + + internal abstract class ValueFieldAccessor : PackedFieldAccessor + { + public Type FieldType { get; protected set; } + + private static int GetRank(int bitSize) + { + var rank = 0; + while ((bitSize >>= 1) > 0) { + rank++; + } + + return rank; + } + + protected ValueFieldAccessor(int bitCount) + : base(GetRank(bitCount)) + {} + } + + internal abstract class ValueFieldAccessor : ValueFieldAccessor + where T : struct, IEquatable + { + private static readonly T DefaultValue = default; + private static readonly T? NullValue = null; + + protected virtual long Encode(T value) => throw new NotSupportedException(); + + protected virtual void Encode(T value, long[] values, int offset) => throw new NotSupportedException(); + + protected virtual T Decode(long value) => throw new NotSupportedException(); + + protected virtual T Decode(long[] values, int offset) => throw new NotSupportedException(); + + public override object GetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) + { + var state = tuple.GetFieldState(ref descriptor); + fieldState = state; + return state==TupleFieldState.Available ? (object) Load(tuple, ref descriptor) : null; + } + + public override void SetUntypedValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, object value) + { + if (value!=null) { + Store(tuple, ref descriptor, (T) value); + tuple.SetFieldState(ref descriptor, TupleFieldState.Available); + } + else { + tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); + } + } + + public override void CopyValue(PackedTuple source, ref PackedFieldDescriptor sourceDescriptor, + PackedTuple target, ref PackedFieldDescriptor targetDescriptor) + { + Store(target, ref targetDescriptor, Load(source, ref sourceDescriptor)); + } + + public override bool ValueEquals(PackedTuple left, ref PackedFieldDescriptor leftDescriptor, + PackedTuple right, ref PackedFieldDescriptor rightDescriptor) + { + var leftValue = Load(left, ref leftDescriptor); + var rightValue = Load(right, ref rightDescriptor); + return leftValue.Equals(rightValue); + } + + public override int GetValueHashCode(PackedTuple tuple, ref PackedFieldDescriptor descriptor) + { + return Load(tuple, ref descriptor).GetHashCode(); + } + + private T GetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) + { + var state = tuple.GetFieldState(ref descriptor); + fieldState = state; + return state==TupleFieldState.Available ? Load(tuple, ref descriptor) : DefaultValue; + } + + private T? GetNullableValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, out TupleFieldState fieldState) + { + var state = tuple.GetFieldState(ref descriptor); + fieldState = state; + return state==TupleFieldState.Available ? Load(tuple, ref descriptor) : NullValue; + } + + private void SetValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, T value) + { + Store(tuple, ref descriptor, value); + tuple.SetFieldState(ref descriptor, TupleFieldState.Available); + } + + private void SetNullableValue(PackedTuple tuple, ref PackedFieldDescriptor descriptor, T? value) + { + if (value!=null) { + Store(tuple, ref descriptor, value.Value); + tuple.SetFieldState(ref descriptor, TupleFieldState.Available); + } + else + tuple.SetFieldState(ref descriptor, TupleFieldState.Available | TupleFieldState.Null); + } + + private void Store(PackedTuple tuple, ref PackedFieldDescriptor d, T value) + { + if (Rank > 6) { + Encode(value, tuple.Values, d.ValueIndex); + return; + } + + var encoded = Encode(value); + var block = tuple.Values[d.ValueIndex]; + var mask = ValueBitMask << d.ValueBitOffset; + tuple.Values[d.ValueIndex] = (block & ~mask) | ((encoded << d.ValueBitOffset) & mask); + } + + private T Load(PackedTuple tuple, ref PackedFieldDescriptor d) + { + if (Rank > 6) { + return Decode(tuple.Values, d.ValueIndex); + } + + var encoded = (tuple.Values[d.ValueIndex] >> d.ValueBitOffset) & ValueBitMask; + return Decode(encoded); + } + + protected ValueFieldAccessor(int bits) + : base(bits) + { + FieldType = typeof(T); + Getter = (GetValueDelegate) GetValue; + Setter = (SetValueDelegate) SetValue; + + NullableGetter = (GetValueDelegate) GetNullableValue; + NullableSetter = (SetValueDelegate) SetNullableValue; + } + } + + internal sealed class BooleanFieldAccessor : ValueFieldAccessor + { + protected override long Encode(bool value) + { + return value ? 1L : 0L; + } + + protected override bool Decode(long value) + { + return value!=0; + } + + public BooleanFieldAccessor() + : base(1) + { + } + } + + internal sealed class FloatFieldAccessor : ValueFieldAccessor + { + protected override long Encode(float value) + { + unsafe { + return *(int*) &value; + } + } + + protected override float Decode(long value) + { + var intValue = unchecked ((int) value); + unsafe { + return *(float*) &intValue; + } + } + + public FloatFieldAccessor() + : base(sizeof(float) * 8) + { + } + } + + internal sealed class DoubleFieldAccessor : ValueFieldAccessor + { + protected override long Encode(double value) + { + return BitConverter.DoubleToInt64Bits(value); + } + + protected override double Decode(long value) + { + return BitConverter.Int64BitsToDouble(value); + } + + public DoubleFieldAccessor() + : base(sizeof(double) * 8) + { + } + } + + internal sealed class TimeSpanFieldAccessor : ValueFieldAccessor + { + protected override long Encode(TimeSpan value) + { + return value.Ticks; + } + + protected override TimeSpan Decode(long value) + { + return TimeSpan.FromTicks(value); + } + + public TimeSpanFieldAccessor() + : base(sizeof(long) * 8) + { + } + } + + internal sealed class DateTimeFieldAccessor : ValueFieldAccessor + { + protected override long Encode(DateTime value) + { + return value.ToBinary(); + } + + protected override DateTime Decode(long value) + { + return DateTime.FromBinary(value); + } + + public DateTimeFieldAccessor() + : base(sizeof(long) * 8) + { + } + } + + internal sealed class ByteFieldAccessor : ValueFieldAccessor + { + protected override long Encode(byte value) + { + return value; + } + + protected override byte Decode(long value) + { + return unchecked ((byte) value); + } + + public ByteFieldAccessor() + : base(sizeof(byte) * 8) + { + } + } + + internal sealed class SByteFieldAccessor : ValueFieldAccessor + { + protected override long Encode(sbyte value) + { + return value; + } + + protected override sbyte Decode(long value) + { + return unchecked ((sbyte) value); + } + + public SByteFieldAccessor() + : base(sizeof(sbyte) * 8) + { + } + } + + internal sealed class ShortFieldAccessor : ValueFieldAccessor + { + protected override long Encode(short value) + { + return value; + } + + protected override short Decode(long value) + { + return unchecked ((short) value); + } + + public ShortFieldAccessor() + : base(sizeof(short) * 8) + { + } + } + + internal sealed class UShortFieldAccessor : ValueFieldAccessor + { + protected override long Encode(ushort value) + { + return value; + } + + protected override ushort Decode(long value) + { + return unchecked ((ushort) value); + } + + public UShortFieldAccessor() + : base(sizeof(ushort) * 8) + { + } + } + + internal sealed class IntFieldAccessor : ValueFieldAccessor + { + protected override long Encode(int value) + { + return value; + } + + protected override int Decode(long value) + { + return unchecked ((int) value); + } + + public IntFieldAccessor() + : base(sizeof(int) * 8) + { + } + } + + internal sealed class UIntFieldAccessor : ValueFieldAccessor + { + protected override long Encode(uint value) + { + return value; + } + + protected override uint Decode(long value) + { + return unchecked ((uint) value); + } + + public UIntFieldAccessor() + : base(sizeof(uint) * 8) + { + } + } + + internal sealed class LongFieldAccessor : ValueFieldAccessor + { + protected override long Encode(long value) + { + return value; + } + + protected override long Decode(long value) + { + return value; + } + + public LongFieldAccessor() + : base(sizeof(long) * 8) + { + } + } + + internal sealed class ULongFieldAccessor : ValueFieldAccessor + { + protected override long Encode(ulong value) + { + return unchecked((long) value); + } + + protected override ulong Decode(long value) + { + return unchecked((ulong) value); + } + + public ULongFieldAccessor() + : base(sizeof(ulong) * 8) + { + } + } + + internal sealed class GuidFieldAccessor : ValueFieldAccessor + { + protected override Guid Decode(long[] values, int offset) + { + unsafe { + fixed (long* valuePtr = &values[offset]) + return *(Guid*) valuePtr; + } + } + + protected override void Encode(Guid value, long[] values, int offset) + { + unsafe { + fixed (long* valuePtr = &values[offset]) + *(Guid*) valuePtr = value; + } + } + + private static unsafe int GetSize() + { + return sizeof (Guid); + } + + public GuidFieldAccessor() + : base(GetSize() * 8) + { + } + } + + internal sealed class DecimalFieldAccessor : ValueFieldAccessor + { + protected override decimal Decode(long[] values, int offset) + { + unsafe { + fixed (long* valuePtr = &values[offset]) + return *(decimal*) valuePtr; + } + } + + protected override void Encode(decimal value, long[] values, int offset) + { + unsafe { + fixed (long* valuePtr = &values[offset]) + *(decimal*) valuePtr = value; + } + } + public DecimalFieldAccessor() + : base(sizeof(decimal) * 8) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldDescriptor.cs b/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldDescriptor.cs index 24c7f16c35..817a9008e8 100644 --- a/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldDescriptor.cs +++ b/Orm/Xtensive.Orm/Tuples/Packed/PackedFieldDescriptor.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.29 - -using System; - -namespace Xtensive.Tuples.Packed -{ - [Serializable] - internal struct PackedFieldDescriptor - { - private const int OffsetBitCount = 6; - private const int OffsetMask = (1 << OffsetBitCount) - 1; - - internal int DataPosition; - internal int StatePosition; - - [NonSerialized] - public PackedFieldAccessor Accessor; - - public bool IsObjectField => Accessor.Rank < 0; - - public int ObjectIndex => DataPosition; - - public int ValueIndex => DataPosition >> OffsetBitCount; - public int ValueBitOffset => DataPosition & OffsetMask; - - public int StateIndex => StatePosition >> OffsetBitCount; - public int StateBitOffset => StatePosition & OffsetMask; - } +// Copyright (C) 2003-2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.29 + +using System; + +namespace Xtensive.Tuples.Packed +{ + [Serializable] + internal struct PackedFieldDescriptor + { + private const int OffsetBitCount = 6; + private const int OffsetMask = (1 << OffsetBitCount) - 1; + + internal int DataPosition; + internal int StatePosition; + + [NonSerialized] + public PackedFieldAccessor Accessor; + + public bool IsObjectField => Accessor.Rank < 0; + + public int ObjectIndex => DataPosition; + + public int ValueIndex => DataPosition >> OffsetBitCount; + public int ValueBitOffset => DataPosition & OffsetMask; + + public int StateIndex => StatePosition >> OffsetBitCount; + public int StateBitOffset => StatePosition & OffsetMask; + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Packed/PackedTuple.cs b/Orm/Xtensive.Orm/Tuples/Packed/PackedTuple.cs index f6e5179d22..a7b44cbd76 100644 --- a/Orm/Xtensive.Orm/Tuples/Packed/PackedTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/Packed/PackedTuple.cs @@ -1,144 +1,144 @@ -// Copyright (C) 2003-2012 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2012.12.29 - -using System; - -namespace Xtensive.Tuples.Packed -{ - [Serializable] - internal sealed class PackedTuple : RegularTuple - { - private static readonly object[] EmptyObjectArray = new object[0]; - - public readonly TupleDescriptor PackedDescriptor; - public readonly long[] Values; - public readonly object[] Objects; - - public override TupleDescriptor Descriptor - { - get { return PackedDescriptor; } - } - - public override Tuple Clone() - { - return new PackedTuple(this); - } - - public override Tuple CreateNew() - { - return new PackedTuple(PackedDescriptor); - } - - public override bool Equals(Tuple other) - { - var packedOther = other as PackedTuple; - if (packedOther==null) - return base.Equals(other); - - if (ReferenceEquals(packedOther, this)) - return true; - if (Descriptor!=packedOther.Descriptor) - return false; - - var fieldDescriptors = PackedDescriptor.FieldDescriptors; - var count = Count; - for (int i = 0; i < count; i++) { - ref var descriptor = ref fieldDescriptors[i]; - var thisState = GetFieldState(ref descriptor); - var otherState = packedOther.GetFieldState(ref descriptor); - if (thisState!=otherState) - return false; - if (thisState!=TupleFieldState.Available) - continue; - var accessor = descriptor.Accessor; - if (!accessor.ValueEquals(this, ref descriptor, packedOther, ref descriptor)) - return false; - } - - return true; - } - - public override int GetHashCode() - { - var count = Count; - var fieldDescriptors = PackedDescriptor.FieldDescriptors; - int result = 0; - for (int i = 0; i < count; i++) { - ref var descriptor = ref fieldDescriptors[i]; - var accessor = descriptor.Accessor; - var state = GetFieldState(ref fieldDescriptors[i]); - var fieldHash = state==TupleFieldState.Available - ? accessor.GetValueHashCode(this, ref descriptor) - : 0; - result = HashCodeMultiplier * result ^ fieldHash; - } - return result; - } - - public override TupleFieldState GetFieldState(int fieldIndex) - { - return GetFieldState(ref PackedDescriptor.FieldDescriptors[fieldIndex]); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - if (fieldState==TupleFieldState.Null) { - throw new ArgumentOutOfRangeException(nameof(fieldState)); - } - - SetFieldState(ref PackedDescriptor.FieldDescriptors[fieldIndex], fieldState); - } - - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - ref var descriptor = ref PackedDescriptor.FieldDescriptors[fieldIndex]; - return descriptor.Accessor.GetUntypedValue(this, ref descriptor, out fieldState); - } - - public override void SetValue(int fieldIndex, object fieldValue) - { - ref var descriptor = ref PackedDescriptor.FieldDescriptors[fieldIndex]; - descriptor.Accessor.SetUntypedValue(this, ref descriptor, fieldValue); - } - - public void SetFieldState(ref PackedFieldDescriptor d, TupleFieldState fieldState) - { - var bits = (long) fieldState; - var block = Values[d.StateIndex]; - Values[d.StateIndex] = (block & ~(3L << d.StateBitOffset)) | (bits << d.StateBitOffset); - - if (fieldState!=TupleFieldState.Available && d.IsObjectField) { - Objects[d.ObjectIndex] = null; - } - } - - public TupleFieldState GetFieldState(ref PackedFieldDescriptor d) - { - var block = Values[d.StateIndex]; - return (TupleFieldState) ((block >> d.StateBitOffset) & 3); - } - - public PackedTuple(TupleDescriptor descriptor) - { - PackedDescriptor = descriptor; - - Values = new long[PackedDescriptor.ValuesLength]; - Objects = PackedDescriptor.ObjectsLength > 0 - ? new object[PackedDescriptor.ObjectsLength] - : EmptyObjectArray; - } - - private PackedTuple(PackedTuple origin) - { - PackedDescriptor = origin.PackedDescriptor; - - Values = (long[]) origin.Values.Clone(); - Objects = PackedDescriptor.ObjectsLength > 0 - ? (object[]) origin.Objects.Clone() - : EmptyObjectArray; - } - } +// Copyright (C) 2003-2012 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2012.12.29 + +using System; + +namespace Xtensive.Tuples.Packed +{ + [Serializable] + internal sealed class PackedTuple : RegularTuple + { + private static readonly object[] EmptyObjectArray = new object[0]; + + public readonly TupleDescriptor PackedDescriptor; + public readonly long[] Values; + public readonly object[] Objects; + + public override TupleDescriptor Descriptor + { + get { return PackedDescriptor; } + } + + public override Tuple Clone() + { + return new PackedTuple(this); + } + + public override Tuple CreateNew() + { + return new PackedTuple(PackedDescriptor); + } + + public override bool Equals(Tuple other) + { + var packedOther = other as PackedTuple; + if (packedOther==null) + return base.Equals(other); + + if (ReferenceEquals(packedOther, this)) + return true; + if (Descriptor!=packedOther.Descriptor) + return false; + + var fieldDescriptors = PackedDescriptor.FieldDescriptors; + var count = Count; + for (int i = 0; i < count; i++) { + ref var descriptor = ref fieldDescriptors[i]; + var thisState = GetFieldState(ref descriptor); + var otherState = packedOther.GetFieldState(ref descriptor); + if (thisState!=otherState) + return false; + if (thisState!=TupleFieldState.Available) + continue; + var accessor = descriptor.Accessor; + if (!accessor.ValueEquals(this, ref descriptor, packedOther, ref descriptor)) + return false; + } + + return true; + } + + public override int GetHashCode() + { + var count = Count; + var fieldDescriptors = PackedDescriptor.FieldDescriptors; + int result = 0; + for (int i = 0; i < count; i++) { + ref var descriptor = ref fieldDescriptors[i]; + var accessor = descriptor.Accessor; + var state = GetFieldState(ref fieldDescriptors[i]); + var fieldHash = state==TupleFieldState.Available + ? accessor.GetValueHashCode(this, ref descriptor) + : 0; + result = HashCodeMultiplier * result ^ fieldHash; + } + return result; + } + + public override TupleFieldState GetFieldState(int fieldIndex) + { + return GetFieldState(ref PackedDescriptor.FieldDescriptors[fieldIndex]); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + if (fieldState==TupleFieldState.Null) { + throw new ArgumentOutOfRangeException(nameof(fieldState)); + } + + SetFieldState(ref PackedDescriptor.FieldDescriptors[fieldIndex], fieldState); + } + + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + ref var descriptor = ref PackedDescriptor.FieldDescriptors[fieldIndex]; + return descriptor.Accessor.GetUntypedValue(this, ref descriptor, out fieldState); + } + + public override void SetValue(int fieldIndex, object fieldValue) + { + ref var descriptor = ref PackedDescriptor.FieldDescriptors[fieldIndex]; + descriptor.Accessor.SetUntypedValue(this, ref descriptor, fieldValue); + } + + public void SetFieldState(ref PackedFieldDescriptor d, TupleFieldState fieldState) + { + var bits = (long) fieldState; + var block = Values[d.StateIndex]; + Values[d.StateIndex] = (block & ~(3L << d.StateBitOffset)) | (bits << d.StateBitOffset); + + if (fieldState!=TupleFieldState.Available && d.IsObjectField) { + Objects[d.ObjectIndex] = null; + } + } + + public TupleFieldState GetFieldState(ref PackedFieldDescriptor d) + { + var block = Values[d.StateIndex]; + return (TupleFieldState) ((block >> d.StateBitOffset) & 3); + } + + public PackedTuple(TupleDescriptor descriptor) + { + PackedDescriptor = descriptor; + + Values = new long[PackedDescriptor.ValuesLength]; + Objects = PackedDescriptor.ObjectsLength > 0 + ? new object[PackedDescriptor.ObjectsLength] + : EmptyObjectArray; + } + + private PackedTuple(PackedTuple origin) + { + PackedDescriptor = origin.PackedDescriptor; + + Values = (long[]) origin.Values.Clone(); + Objects = PackedDescriptor.ObjectsLength > 0 + ? (object[]) origin.Objects.Clone() + : EmptyObjectArray; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/ReferencedTuple.cs b/Orm/Xtensive.Orm/Tuples/ReferencedTuple.cs index 7666149190..087cbfb9d0 100644 --- a/Orm/Xtensive.Orm/Tuples/ReferencedTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/ReferencedTuple.cs @@ -1,71 +1,71 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Kofman -// Created: 2009.04.03 - -using System; -using Xtensive.Core; - - -namespace Xtensive.Tuples -{ - /// - /// Tuple that references another tuple by getter delegate. - /// - public class ReferencedTuple : Tuple - { - private readonly Func tupleGetter; - - private Tuple InnerTuple - { - get { return tupleGetter.Invoke(); } - } - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - return InnerTuple.GetFieldState(fieldIndex); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - InnerTuple.SetFieldState(fieldIndex, fieldState); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - return InnerTuple.GetValue(fieldIndex, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - InnerTuple.SetValue(fieldIndex, fieldValue); - } - - /// - public override TupleDescriptor Descriptor - { - get { return InnerTuple.Descriptor; } - } - - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - return InnerTuple.GetMappedContainer(fieldIndex, isWriting); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The delegate to get inner tuple. - public ReferencedTuple(Func tupleGetter) - { - this.tupleGetter = tupleGetter; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Kofman +// Created: 2009.04.03 + +using System; +using Xtensive.Core; + + +namespace Xtensive.Tuples +{ + /// + /// Tuple that references another tuple by getter delegate. + /// + public class ReferencedTuple : Tuple + { + private readonly Func tupleGetter; + + private Tuple InnerTuple + { + get { return tupleGetter.Invoke(); } + } + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + return InnerTuple.GetFieldState(fieldIndex); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + InnerTuple.SetFieldState(fieldIndex, fieldState); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + return InnerTuple.GetValue(fieldIndex, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + InnerTuple.SetValue(fieldIndex, fieldValue); + } + + /// + public override TupleDescriptor Descriptor + { + get { return InnerTuple.Descriptor; } + } + + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + return InnerTuple.GetMappedContainer(fieldIndex, isWriting); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The delegate to get inner tuple. + public ReferencedTuple(Func tupleGetter) + { + this.tupleGetter = tupleGetter; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/RegularTuple.cs b/Orm/Xtensive.Orm/Tuples/RegularTuple.cs index 3c4cb59b0e..05147fdfad 100644 --- a/Orm/Xtensive.Orm/Tuples/RegularTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/RegularTuple.cs @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.01.24 - -using System; -using System.Runtime.Serialization; - - -namespace Xtensive.Tuples -{ - /// - /// Base class for any regular tuple. - /// - [DataContract] - [Serializable] - public abstract class RegularTuple : Tuple - { - // Constructors - - /// - /// Initializes new instance of this type. - /// - protected RegularTuple() - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.01.24 + +using System; +using System.Runtime.Serialization; + + +namespace Xtensive.Tuples +{ + /// + /// Base class for any regular tuple. + /// + [DataContract] + [Serializable] + public abstract class RegularTuple : Tuple + { + // Constructors + + /// + /// Initializes new instance of this type. + /// + protected RegularTuple() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/CombineTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/CombineTransform.cs index 75a612c478..855b927d2b 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/CombineTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/CombineTransform.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.04.30 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Xtensive.Core; -using Xtensive.Reflection; - - -namespace Xtensive.Tuples.Transform -{ - /// - /// This class is used for source s combining. - /// - [Serializable] - public sealed class CombineTransform : MapTransform - { - private TupleDescriptor[] sources; - - /// - /// Gets tuple descriptors this transform merges. - /// - public IReadOnlyList Sources - { - [DebuggerStepThrough] - get => Array.AsReadOnly(sources); - } - - /// - public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) - { - return base.Apply(transformType, source1, source2); - } - - /// - public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2, Tuple source3) - { - return base.Apply(transformType, source1, source2, source3); - } - - /// - public override string ToString() - { - string description = string.Format("{0}, {1}", - sources.ToDelimitedString(" + "), - IsReadOnly ? - Strings.ReadOnlyShort : - Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Source tuple descriptors. - public CombineTransform(bool isReadOnly, params TupleDescriptor[] sources) - : base(isReadOnly) - { - int totalLength = sources.Sum(s => s.Count); - var types = new Type[totalLength]; - var map = new Pair[totalLength]; - int index = 0; - for (int i = 0; i(i, j); - } - } - this.sources = sources; - Descriptor = TupleDescriptor.Create(types); - SetMap(map); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.04.30 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Xtensive.Core; +using Xtensive.Reflection; + + +namespace Xtensive.Tuples.Transform +{ + /// + /// This class is used for source s combining. + /// + [Serializable] + public sealed class CombineTransform : MapTransform + { + private TupleDescriptor[] sources; + + /// + /// Gets tuple descriptors this transform merges. + /// + public IReadOnlyList Sources + { + [DebuggerStepThrough] + get => Array.AsReadOnly(sources); + } + + /// + public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) + { + return base.Apply(transformType, source1, source2); + } + + /// + public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2, Tuple source3) + { + return base.Apply(transformType, source1, source2, source3); + } + + /// + public override string ToString() + { + string description = string.Format("{0}, {1}", + sources.ToDelimitedString(" + "), + IsReadOnly ? + Strings.ReadOnlyShort : + Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Source tuple descriptors. + public CombineTransform(bool isReadOnly, params TupleDescriptor[] sources) + : base(isReadOnly) + { + int totalLength = sources.Sum(s => s.Count); + var types = new Type[totalLength]; + var map = new Pair[totalLength]; + int index = 0; + for (int i = 0; i(i, j); + } + } + this.sources = sources; + Descriptor = TupleDescriptor.Create(types); + SetMap(map); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform.cs index 389f9fdf04..abe4fbe4e9 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform.cs @@ -1,113 +1,113 @@ -// Copyright (C) a Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 20.06.2008 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Xtensive.Core; -using Xtensive.Reflection; - -namespace Xtensive.Tuples.Transform -{ - /// - /// Cuts in specified value to the . - /// - public class CutInTransform : MapTransform - { - private int index; - private TupleDescriptor[] sources; - - /// - /// Gets the start index at witch this transform cuts in specified value. - /// - public int Index - { - [DebuggerStepThrough] - get { return index; } - } - - /// - /// Gets tuple descriptors this transform cuts in. - /// - public IReadOnlyList Sources - { - [DebuggerStepThrough] - get => Array.AsReadOnly(sources); - } - - /// - public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) - { - return base.Apply(transformType, source1, source2); - } - - /// - public override string ToString() - { - string description = string.Format("{0}, {1}", - sources.ToDelimitedString(" + "), - IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Start index. - /// Source tuple descriptors. - public CutInTransform(bool isReadOnly, int index , params TupleDescriptor[] sources) - : base(isReadOnly) - { - this.index = index; - int totalLength = sources.Sum(s => s.Count); - Type[] types = new Type[totalLength]; - Pair[] map = new Pair[totalLength]; - TupleDescriptor sourceDescriptor = sources[0]; - TupleDescriptor cutInDescriptor = sources[1]; - int sourceCount = sourceDescriptor.Count; - int cutInCount = cutInDescriptor.Count; - - bool isIndex = false; - bool isEndOfTuple = false; - int ind = 0; - - if (index == sourceCount) { - sourceCount++; - isEndOfTuple = true; - } - else if (index < 0 || index > sourceCount) - throw new ArgumentOutOfRangeException("index"); - for (int i = 0; i < sourceCount; i++) - { - if ((i == index) && !isIndex) { - for (int j = 0; j < cutInCount; j++) - { - types[ind] = cutInDescriptor[j]; - map[ind++] = new Pair(1, j); - } - if (!isEndOfTuple) { - i--; - isIndex = true; - } - } - else { - types[ind] = sourceDescriptor[i]; - map[ind++] = new Pair(0, i); - } - } - this.sources = sources; - Descriptor = TupleDescriptor.Create(types); - SetMap(map); - } - } +// Copyright (C) a Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 20.06.2008 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Xtensive.Core; +using Xtensive.Reflection; + +namespace Xtensive.Tuples.Transform +{ + /// + /// Cuts in specified value to the . + /// + public class CutInTransform : MapTransform + { + private int index; + private TupleDescriptor[] sources; + + /// + /// Gets the start index at witch this transform cuts in specified value. + /// + public int Index + { + [DebuggerStepThrough] + get { return index; } + } + + /// + /// Gets tuple descriptors this transform cuts in. + /// + public IReadOnlyList Sources + { + [DebuggerStepThrough] + get => Array.AsReadOnly(sources); + } + + /// + public new Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) + { + return base.Apply(transformType, source1, source2); + } + + /// + public override string ToString() + { + string description = string.Format("{0}, {1}", + sources.ToDelimitedString(" + "), + IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Start index. + /// Source tuple descriptors. + public CutInTransform(bool isReadOnly, int index , params TupleDescriptor[] sources) + : base(isReadOnly) + { + this.index = index; + int totalLength = sources.Sum(s => s.Count); + Type[] types = new Type[totalLength]; + Pair[] map = new Pair[totalLength]; + TupleDescriptor sourceDescriptor = sources[0]; + TupleDescriptor cutInDescriptor = sources[1]; + int sourceCount = sourceDescriptor.Count; + int cutInCount = cutInDescriptor.Count; + + bool isIndex = false; + bool isEndOfTuple = false; + int ind = 0; + + if (index == sourceCount) { + sourceCount++; + isEndOfTuple = true; + } + else if (index < 0 || index > sourceCount) + throw new ArgumentOutOfRangeException("index"); + for (int i = 0; i < sourceCount; i++) + { + if ((i == index) && !isIndex) { + for (int j = 0; j < cutInCount; j++) + { + types[ind] = cutInDescriptor[j]; + map[ind++] = new Pair(1, j); + } + if (!isEndOfTuple) { + i--; + isIndex = true; + } + } + else { + types[ind] = sourceDescriptor[i]; + map[ind++] = new Pair(0, i); + } + } + this.sources = sources; + Descriptor = TupleDescriptor.Create(types); + SetMap(map); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform{T}.cs b/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform{T}.cs index de8db8352b..c957ab4e31 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform{T}.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/CutInTransform{T}.cs @@ -1,56 +1,56 @@ -// Copyright (C) a Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 20.06.2008 - -using System; -using System.Collections.Generic; -using System.Linq; -using Xtensive.Collections; -using Xtensive.Reflection; -using Xtensive.Tuples.Transform; -using Xtensive.Tuples.Transform.Internals; - - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Cuts in specified value to the . - /// - public sealed class CutInTransform : CutInTransform - { - - /// - public Tuple Apply(TupleTransformType transformType, Tuple source1, T source2) - { - return Apply(transformType, source1, Tuple.Create(source2)); - } - - /// - public override string ToString() - { - string description = string.Format("Index {0}, {1}", - Index, - IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Start index. - /// Source tuple descriptor. - public CutInTransform(bool isReadOnly, int index, TupleDescriptor source1) - : base(isReadOnly, index, source1, TupleDescriptor.Create(new Type[]{typeof(T)})) - { - } - } +// Copyright (C) a Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 20.06.2008 + +using System; +using System.Collections.Generic; +using System.Linq; +using Xtensive.Collections; +using Xtensive.Reflection; +using Xtensive.Tuples.Transform; +using Xtensive.Tuples.Transform.Internals; + + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Cuts in specified value to the . + /// + public sealed class CutInTransform : CutInTransform + { + + /// + public Tuple Apply(TupleTransformType transformType, Tuple source1, T source2) + { + return Apply(transformType, source1, Tuple.Create(source2)); + } + + /// + public override string ToString() + { + string description = string.Format("Index {0}, {1}", + Index, + IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Start index. + /// Source tuple descriptor. + public CutInTransform(bool isReadOnly, int index, TupleDescriptor source1) + : base(isReadOnly, index, source1, TupleDescriptor.Create(new Type[]{typeof(T)})) + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/CutOutTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/CutOutTransform.cs index 88a3bd9a3a..792341ed30 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/CutOutTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/CutOutTransform.cs @@ -1,90 +1,90 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.07.07 - -using System; -using System.Diagnostics; -using Xtensive.Core; -using Xtensive.Reflection; - - - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Cuts out specified from the . - /// - public sealed class CutOutTransform : MapTransform - { - private Segment segment; - - /// - /// Gets the segment this transform cuts out. - /// - public Segment Segment - { - [DebuggerStepThrough] - get { return segment; } - } - - /// - public new Tuple Apply(TupleTransformType transformType, Tuple source) - { - return base.Apply(transformType, source); - } - - /// - public override string ToString() - { - string description = string.Format("{0}, {1}", - segment, - IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Source tuple descriptor. - /// The segment to cut out. - public CutOutTransform(bool isReadOnly, TupleDescriptor sourceDescriptor, in Segment segment) - : base(isReadOnly) - { - this.segment = segment; - Type[] fields = new Type[sourceDescriptor.Count - segment.Length]; - int[] map = new int[sourceDescriptor.Count - segment.Length]; - int j = segment.Offset; - bool flag = false; - if (sourceDescriptor.Count >= j + segment.Length) - for (int i = 0; i < sourceDescriptor.Count - segment.Length; i++) { - if ((i < j)) { - fields[i] = sourceDescriptor[i]; - map[i] = i; - } - if (i == j) { - flag = true; - j += segment.Length; - } - if (flag) - { - fields[i] = sourceDescriptor[j]; - map[i] = j; - j++; - } - } - else - throw new InvalidOperationException(Strings.ExSegmentIsOutOfRange); - Descriptor = TupleDescriptor.Create(fields); - SetSingleSourceMap(map); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.07.07 + +using System; +using System.Diagnostics; +using Xtensive.Core; +using Xtensive.Reflection; + + + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Cuts out specified from the . + /// + public sealed class CutOutTransform : MapTransform + { + private Segment segment; + + /// + /// Gets the segment this transform cuts out. + /// + public Segment Segment + { + [DebuggerStepThrough] + get { return segment; } + } + + /// + public new Tuple Apply(TupleTransformType transformType, Tuple source) + { + return base.Apply(transformType, source); + } + + /// + public override string ToString() + { + string description = string.Format("{0}, {1}", + segment, + IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Source tuple descriptor. + /// The segment to cut out. + public CutOutTransform(bool isReadOnly, TupleDescriptor sourceDescriptor, in Segment segment) + : base(isReadOnly) + { + this.segment = segment; + Type[] fields = new Type[sourceDescriptor.Count - segment.Length]; + int[] map = new int[sourceDescriptor.Count - segment.Length]; + int j = segment.Offset; + bool flag = false; + if (sourceDescriptor.Count >= j + segment.Length) + for (int i = 0; i < sourceDescriptor.Count - segment.Length; i++) { + if ((i < j)) { + fields[i] = sourceDescriptor[i]; + map[i] = i; + } + if (i == j) { + flag = true; + j += segment.Length; + } + if (flag) + { + fields[i] = sourceDescriptor[j]; + map[i] = j; + j++; + } + } + else + throw new InvalidOperationException(Strings.ExSegmentIsOutOfRange); + Descriptor = TupleDescriptor.Create(fields); + SetSingleSourceMap(map); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/Interfaces/ITupleTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/Interfaces/ITupleTransform.cs index 456ed7e3aa..8036eaef5a 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/Interfaces/ITupleTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/Interfaces/ITupleTransform.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.04.30 - -using Xtensive.Tuples.Transform; - -namespace Xtensive.Tuples -{ - /// - /// Tuple transformation definition. - /// - public interface ITupleTransform - { - /// - /// Gets describing the tuples - /// this transform may produce. - /// means "any" (i.e. transform definition - /// is not descriptor-dependent). - /// - TupleDescriptor Descriptor { get; } - - /// - /// Gets the default result tuple. - /// Can be used to get default values for the result tuple fields. - /// Must be a read-only tuple. - /// - Tuple DefaultResult { get; } - - /// - /// Indicates whether transform always produces read-only tuples or not. - /// - bool IsReadOnly { get; } - - /// - /// Applies the transformation. - /// - /// The type of transformation to perform. - /// Transformation arguments. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - Tuple Apply(TupleTransformType transformType, params object[] arguments); - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.04.30 + +using Xtensive.Tuples.Transform; + +namespace Xtensive.Tuples +{ + /// + /// Tuple transformation definition. + /// + public interface ITupleTransform + { + /// + /// Gets describing the tuples + /// this transform may produce. + /// means "any" (i.e. transform definition + /// is not descriptor-dependent). + /// + TupleDescriptor Descriptor { get; } + + /// + /// Gets the default result tuple. + /// Can be used to get default values for the result tuple fields. + /// Must be a read-only tuple. + /// + Tuple DefaultResult { get; } + + /// + /// Indicates whether transform always produces read-only tuples or not. + /// + bool IsReadOnly { get; } + + /// + /// Applies the transformation. + /// + /// The type of transformation to perform. + /// Transformation arguments. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + Tuple Apply(TupleTransformType transformType, params object[] arguments); + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple.cs b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple.cs index 3e98ee958c..19628222ce 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.05.07 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform.Internals -{ - /// - /// A result tuple mapping arbitrary count of source tuples to a single one (this). - /// - [Serializable] - public sealed class MapTransformTuple : TransformedTuple - { - private readonly Tuple[] tuples; - - /// - public override IReadOnlyList Arguments - { - [DebuggerStepThrough] - get => Array.AsReadOnly(tuples); - } - - #region GetFieldState, GetValue, SetValue methods - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - var indexes = TypedTransform.map[fieldIndex]; - return tuples[indexes.First].GetFieldState(indexes.Second); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - var indexes = TypedTransform.map[fieldIndex]; - tuples[indexes.First].SetFieldState(indexes.Second, fieldState); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - var indexes = TypedTransform.map[fieldIndex]; - return tuples[indexes.First].GetValue(indexes.Second, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - if (Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - var indexes = TypedTransform.map[fieldIndex]; - tuples[indexes.First].SetValue(indexes.Second, fieldValue); - } - - #endregion - - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - if (isWriting && Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - var map = TypedTransform.map[fieldIndex]; - return tuples[map.First].GetMappedContainer(map.Second, isWriting); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The transform. - /// Source tuples. - public MapTransformTuple(MapTransform transform, params Tuple[] sources) - : base(transform) - { - ArgumentValidator.EnsureArgumentNotNull(sources, "tuples"); - // Other checks are omitted: this transform should be fast, so delayed errors are ok - this.tuples = sources; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.05.07 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform.Internals +{ + /// + /// A result tuple mapping arbitrary count of source tuples to a single one (this). + /// + [Serializable] + public sealed class MapTransformTuple : TransformedTuple + { + private readonly Tuple[] tuples; + + /// + public override IReadOnlyList Arguments + { + [DebuggerStepThrough] + get => Array.AsReadOnly(tuples); + } + + #region GetFieldState, GetValue, SetValue methods + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + var indexes = TypedTransform.map[fieldIndex]; + return tuples[indexes.First].GetFieldState(indexes.Second); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + var indexes = TypedTransform.map[fieldIndex]; + tuples[indexes.First].SetFieldState(indexes.Second, fieldState); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + var indexes = TypedTransform.map[fieldIndex]; + return tuples[indexes.First].GetValue(indexes.Second, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + if (Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + var indexes = TypedTransform.map[fieldIndex]; + tuples[indexes.First].SetValue(indexes.Second, fieldValue); + } + + #endregion + + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + if (isWriting && Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + var map = TypedTransform.map[fieldIndex]; + return tuples[map.First].GetMappedContainer(map.Second, isWriting); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The transform. + /// Source tuples. + public MapTransformTuple(MapTransform transform, params Tuple[] sources) + : base(transform) + { + ArgumentValidator.EnsureArgumentNotNull(sources, "tuples"); + // Other checks are omitted: this transform should be fast, so delayed errors are ok + this.tuples = sources; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple1.cs b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple1.cs index 79e8331a49..7e2ca9dd2b 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple1.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple1.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.04 - -using System; -using System.Collections.Generic; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform.Internals -{ - /// - /// A result tuple mapping 1 source tuple to a single one (this). - /// - [Serializable] - public sealed class MapTransformTuple1 : TransformedTuple - { - private Tuple tuple; - - /// - public override IReadOnlyList Arguments { - get { - Tuple[] copy = new Tuple[1]; - copy[0] = tuple; - return copy; - } - } - - #region GetFieldState, GetValue, SetValue methods - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - int index = GetMappedFieldIndex(fieldIndex); - return index == MapTransform.NoMapping ? TupleFieldState.Default : tuple.GetFieldState(index); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - int index = GetMappedFieldIndex(fieldIndex); - if (index == MapTransform.NoMapping) - return; - tuple.SetFieldState(index, fieldState); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - int index = GetMappedFieldIndex(fieldIndex); - if (index==MapTransform.NoMapping) - return TypedTransform.DefaultResult.GetValue(fieldIndex, out fieldState); - return tuple.GetValue(index, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - if (Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - tuple.SetValue(GetMappedFieldIndex(fieldIndex), fieldValue); - } - - #endregion - - private int GetMappedFieldIndex(int fieldIndex) - { - int mappedIndex = TypedTransform.singleSourceMap[fieldIndex]; - return mappedIndex < 0 ? MapTransform.NoMapping :mappedIndex; - } - - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - if (isWriting && Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - var index = GetMappedFieldIndex(fieldIndex); - return index == MapTransform.NoMapping - ? new Pair() - : tuple.GetMappedContainer(index, isWriting); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The transform. - /// Source tuple. - public MapTransformTuple1(MapTransform transform, Tuple source) - : base(transform) - { - tuple = source; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.04 + +using System; +using System.Collections.Generic; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform.Internals +{ + /// + /// A result tuple mapping 1 source tuple to a single one (this). + /// + [Serializable] + public sealed class MapTransformTuple1 : TransformedTuple + { + private Tuple tuple; + + /// + public override IReadOnlyList Arguments { + get { + Tuple[] copy = new Tuple[1]; + copy[0] = tuple; + return copy; + } + } + + #region GetFieldState, GetValue, SetValue methods + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + int index = GetMappedFieldIndex(fieldIndex); + return index == MapTransform.NoMapping ? TupleFieldState.Default : tuple.GetFieldState(index); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + int index = GetMappedFieldIndex(fieldIndex); + if (index == MapTransform.NoMapping) + return; + tuple.SetFieldState(index, fieldState); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + int index = GetMappedFieldIndex(fieldIndex); + if (index==MapTransform.NoMapping) + return TypedTransform.DefaultResult.GetValue(fieldIndex, out fieldState); + return tuple.GetValue(index, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + if (Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + tuple.SetValue(GetMappedFieldIndex(fieldIndex), fieldValue); + } + + #endregion + + private int GetMappedFieldIndex(int fieldIndex) + { + int mappedIndex = TypedTransform.singleSourceMap[fieldIndex]; + return mappedIndex < 0 ? MapTransform.NoMapping :mappedIndex; + } + + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + if (isWriting && Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + var index = GetMappedFieldIndex(fieldIndex); + return index == MapTransform.NoMapping + ? new Pair() + : tuple.GetMappedContainer(index, isWriting); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The transform. + /// Source tuple. + public MapTransformTuple1(MapTransform transform, Tuple source) + : base(transform) + { + tuple = source; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple3.cs b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple3.cs index 7e66a7f582..fae607272e 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple3.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/Internals/MapTransformTuple3.cs @@ -1,102 +1,102 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.04 - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform.Internals -{ - /// - /// A result tuple mapping up to 3 source tuples to a single one (this). - /// - [Serializable] - public sealed class MapTransformTuple3 : TransformedTuple - { - private FixedList3 tuples; - - /// - public override IReadOnlyList Arguments { - get { - Tuple[] copy = new Tuple[tuples.Count]; - for (int i = 0; i < tuples.Count; i++) - copy[i] = tuples[i]; - return copy; - } - } - - #region GetFieldState, GetValue, SetValue methods - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - var indexes = TypedTransform.map[fieldIndex]; - return tuples[indexes.First].GetFieldState(indexes.Second); - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - var indexes = TypedTransform.map[fieldIndex]; - tuples[indexes.First].SetFieldState(indexes.Second, fieldState); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - Pair indexes = TypedTransform.map[fieldIndex]; - return tuples[indexes.First].GetValue(indexes.Second, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - if (Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - Pair indexes = TypedTransform.map[fieldIndex]; - tuples[indexes.First].SetValue(indexes.Second, fieldValue); - } - - #endregion - - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - if (isWriting && Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - var map = TypedTransform.map[fieldIndex]; - return tuples[map.First].GetMappedContainer(map.Second, isWriting); - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The transform. - /// First source tuple. - /// 2nd source tuple. - public MapTransformTuple3(MapTransform transform, Tuple source1, Tuple source2) - : base(transform) - { - tuples = new FixedList3(source1, source2); - } - - /// - /// Initializes new instance of this type. - /// - /// The transform. - /// First source tuple. - /// 2nd source tuple. - /// 3rd source tuple. - public MapTransformTuple3(MapTransform transform, Tuple source1, Tuple source2, Tuple source3) - : base(transform) - { - tuples = new FixedList3(source1, source2, source3); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.04 + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform.Internals +{ + /// + /// A result tuple mapping up to 3 source tuples to a single one (this). + /// + [Serializable] + public sealed class MapTransformTuple3 : TransformedTuple + { + private FixedList3 tuples; + + /// + public override IReadOnlyList Arguments { + get { + Tuple[] copy = new Tuple[tuples.Count]; + for (int i = 0; i < tuples.Count; i++) + copy[i] = tuples[i]; + return copy; + } + } + + #region GetFieldState, GetValue, SetValue methods + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + var indexes = TypedTransform.map[fieldIndex]; + return tuples[indexes.First].GetFieldState(indexes.Second); + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + var indexes = TypedTransform.map[fieldIndex]; + tuples[indexes.First].SetFieldState(indexes.Second, fieldState); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + Pair indexes = TypedTransform.map[fieldIndex]; + return tuples[indexes.First].GetValue(indexes.Second, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + if (Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + Pair indexes = TypedTransform.map[fieldIndex]; + tuples[indexes.First].SetValue(indexes.Second, fieldValue); + } + + #endregion + + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + if (isWriting && Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + var map = TypedTransform.map[fieldIndex]; + return tuples[map.First].GetMappedContainer(map.Second, isWriting); + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The transform. + /// First source tuple. + /// 2nd source tuple. + public MapTransformTuple3(MapTransform transform, Tuple source1, Tuple source2) + : base(transform) + { + tuples = new FixedList3(source1, source2); + } + + /// + /// Initializes new instance of this type. + /// + /// The transform. + /// First source tuple. + /// 2nd source tuple. + /// 3rd source tuple. + public MapTransformTuple3(MapTransform transform, Tuple source1, Tuple source2, Tuple source3) + : base(transform) + { + tuples = new FixedList3(source1, source2, source3); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/Internals/ReadOnlyTransformTuple.cs b/Orm/Xtensive.Orm/Tuples/Transform/Internals/ReadOnlyTransformTuple.cs index 69ba81ccb1..f319cf6fdb 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/Internals/ReadOnlyTransformTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/Internals/ReadOnlyTransformTuple.cs @@ -1,69 +1,69 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2007.06.15 - -using System; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform.Internals -{ - /// - /// A tuple wrapper for . - /// - [Serializable] - public sealed class ReadOnlyTransformTuple : WrappingTransformTupleBase - { - /// - public override ITupleTransform Transform { - get { - return ReadOnlyTransform.Instance; - } - } - - /// - /// - /// This method always returns of s - /// to block any access to the original tuple. - /// - public override IReadOnlyList Arguments { - get { - return Array.Empty(); - } - } - - protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) - { - throw Exceptions.ObjectIsReadOnly(null); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - throw Exceptions.ObjectIsReadOnly(null); - } - - protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - if (isWriting && Transform.IsReadOnly) - throw Exceptions.ObjectIsReadOnly(null); - return origin.GetMappedContainer(fieldIndex, isWriting); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// Tuple to provide read-only wrapper for. - public ReadOnlyTransformTuple(Tuple tuple) - : base(tuple) - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.06.15 + +using System; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform.Internals +{ + /// + /// A tuple wrapper for . + /// + [Serializable] + public sealed class ReadOnlyTransformTuple : WrappingTransformTupleBase + { + /// + public override ITupleTransform Transform { + get { + return ReadOnlyTransform.Instance; + } + } + + /// + /// + /// This method always returns of s + /// to block any access to the original tuple. + /// + public override IReadOnlyList Arguments { + get { + return Array.Empty(); + } + } + + protected internal override void SetFieldState(int fieldIndex, TupleFieldState fieldState) + { + throw Exceptions.ObjectIsReadOnly(null); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + throw Exceptions.ObjectIsReadOnly(null); + } + + protected internal override Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + if (isWriting && Transform.IsReadOnly) + throw Exceptions.ObjectIsReadOnly(null); + return origin.GetMappedContainer(fieldIndex, isWriting); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// Tuple to provide read-only wrapper for. + public ReadOnlyTransformTuple(Tuple tuple) + : base(tuple) + { + } + } +} diff --git a/Orm/Xtensive.Orm/Tuples/Transform/MapTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/MapTransform.cs index 572ec3f445..aa85d8b350 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/MapTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/MapTransform.cs @@ -1,320 +1,320 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.05.07 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Collections; -using Xtensive.Core; -using Xtensive.Reflection; - - -using Xtensive.Tuples.Transform.Internals; - -namespace Xtensive.Tuples.Transform -{ - /// - /// Base class for any tuple field mapping transform. - /// Maps fields of destination tuple to fields of a set of source tuples. - /// - [Serializable] - public class MapTransform : TupleTransformBase - { - private readonly bool isReadOnly; - private int sourceCount; - internal IReadOnlyList singleSourceMap; - internal Pair[] map; - - /// - /// Means that no mapping is available for the specified field index. - /// - public const int NoMapping = int.MinValue; - - /// - public override bool IsReadOnly { - [DebuggerStepThrough] - get { return isReadOnly; } - } - - /// - /// Gets the count of source this transform maps to the target one. - /// - public int SourceCount - { - [DebuggerStepThrough] - get { return sourceCount; } - } - - /// - /// Gets or sets destination-to-source field map for the first source only. - /// - public IReadOnlyList SingleSourceMap { - [DebuggerStepThrough] - get => singleSourceMap; - } - - /// - /// Gets or sets destination-to-source field map. - /// - public IReadOnlyList> Map - { - [DebuggerStepThrough] - get { return Array.AsReadOnly(map); } - } - - protected void SetSingleSourceMap(IReadOnlyList singleSourceMap) - { - ArgumentValidator.EnsureArgumentNotNull(singleSourceMap, nameof(singleSourceMap)); - var newMap = new Pair[Descriptor.Count]; - var index = 0; - for (; index < newMap.Length && index < singleSourceMap.Count; index++) { - newMap[index] = new Pair(0, singleSourceMap[index]); - } - while (index < newMap.Length) { - newMap[index++] = new Pair(0, NoMapping); - } - - map = newMap; - this.singleSourceMap = singleSourceMap; - sourceCount = 1; - } - - protected void SetMap(Pair[] map) - { - ArgumentValidator.EnsureArgumentNotNull(map, nameof(map)); - int[] newFirstSourceMap = new int[map.Length]; - int index = 0; - int newSourceCount = -1; - foreach (var mappedTo in map) { - if (mappedTo.First>newSourceCount) - newSourceCount = mappedTo.First; - newFirstSourceMap[index++] = mappedTo.First==0 ? mappedTo.Second : -1; - } - newSourceCount++; - this.map = map; - if (newSourceCount==1) - singleSourceMap = newFirstSourceMap; - else - singleSourceMap = null; - sourceCount = newSourceCount; - } - - /// - public override Tuple Apply(TupleTransformType transformType, params object[] arguments) - { - ArgumentValidator.EnsureArgumentNotNull(arguments, "arguments"); - switch (sourceCount) { - case 1: - return Apply(transformType, (Tuple)arguments[0]); - case 2: - return Apply(transformType, (Tuple)arguments[0], (Tuple)arguments[1]); - case 3: - return Apply(transformType, (Tuple)arguments[0], (Tuple)arguments[1], (Tuple)arguments[2]); - default: - return Apply(transformType, arguments.Cast()); - } - } - - /// - /// Applies the transformation. - /// - /// The type of transformation to perform. - /// Transformation sources. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - public Tuple Apply(TupleTransformType transformType, params Tuple[] sources) - { - ArgumentValidator.EnsureArgumentNotNull(sources, "sources"); - if (sourceCount>sources.Length) - throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); - switch (sourceCount) { - case 1: - return Apply(transformType, sources[0]); - case 2: - return Apply(transformType, sources[0], sources[1]); - case 3: - return Apply(transformType, sources[0], sources[1], sources[2]); - default: - switch (transformType) { - case TupleTransformType.Auto: - foreach (Tuple tuple in sources) - if (tuple is TransformedTuple) - goto case TupleTransformType.Tuple; - goto case TupleTransformType.TransformedTuple; - case TupleTransformType.TransformedTuple: - return new MapTransformTuple(this, sources); - case TupleTransformType.Tuple: - Tuple result = Tuple.Create(Descriptor); - sources.CopyTo(result, map); - return result; - default: - throw new ArgumentOutOfRangeException("transformType"); - } - } - } - - /// - /// Applies the transformation. - /// - /// The type of transformation to perform. - /// Transformation source. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - protected Tuple Apply(TupleTransformType transformType, Tuple source) - { - if (sourceCount>1) - throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); - switch (transformType) { - case TupleTransformType.Auto: - if (source is TransformedTuple) - goto case TupleTransformType.Tuple; - goto case TupleTransformType.TransformedTuple; - case TupleTransformType.TransformedTuple: - return new MapTransformTuple1(this, source); - case TupleTransformType.Tuple: - Tuple result = Tuple.Create(Descriptor); - source.CopyTo(result, singleSourceMap); - return result; - default: - throw new ArgumentOutOfRangeException("transformType"); - } - } - - /// - /// Applies the transformation. - /// - /// The type of transformation to perform. - /// First transformation source. - /// Second transformation source. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - protected Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) - { - if (sourceCount>2) - throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); - switch (transformType) { - case TupleTransformType.Auto: - if (source1 is TransformedTuple) - goto case TupleTransformType.Tuple; - if (source2 is TransformedTuple) - goto case TupleTransformType.Tuple; - goto case TupleTransformType.TransformedTuple; - case TupleTransformType.TransformedTuple: - return new MapTransformTuple3(this, source1, source2); - case TupleTransformType.Tuple: - FixedList3 sources = new FixedList3(source1, source2); - Tuple result = Tuple.Create(Descriptor); - sources.CopyTo(result, map); - return result; - default: - throw new ArgumentOutOfRangeException("transformType"); - } - } - - /// - /// Applies the transformation. - /// - /// The type of transformation to perform. - /// First transformation source. - /// Second transformation source. - /// Third transformation source. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - protected Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2, Tuple source3) - { - if (sourceCount>3) - throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); - switch (transformType) { - case TupleTransformType.Auto: - if (source1 is TransformedTuple) - goto case TupleTransformType.Tuple; - if (source2 is TransformedTuple) - goto case TupleTransformType.Tuple; - if (source3 is TransformedTuple) - goto case TupleTransformType.Tuple; - goto case TupleTransformType.TransformedTuple; - case TupleTransformType.TransformedTuple: - return new MapTransformTuple3(this, source1, source2, source3); - case TupleTransformType.Tuple: - FixedList3 sources = new FixedList3(source1, source2, source3); - Tuple result = Tuple.Create(Descriptor); - sources.CopyTo(result, map); - return result; - default: - throw new ArgumentOutOfRangeException("transformType"); - } - } - - /// - public override string ToString() - { - string description = string.Format("{0}: {1}, {2}", - SourceCount, - SourceCount==1 ? - singleSourceMap.ToCommaDelimitedString() : - map.ToCommaDelimitedString(), - isReadOnly ? - Strings.ReadOnlyShort : - Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Initial property value. - /// property value. - public MapTransform(bool isReadOnly, TupleDescriptor descriptor, Pair[] map) - : this(isReadOnly, descriptor) - { - SetMap(map); - } - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Initial property value. - /// property value. - public MapTransform(bool isReadOnly, TupleDescriptor descriptor, IReadOnlyList map) - : this(isReadOnly, descriptor) - { - SetSingleSourceMap(map); - } - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Initial property value. - protected MapTransform(bool isReadOnly, TupleDescriptor descriptor) - : this(isReadOnly) - { - ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); - Descriptor = descriptor; - this.isReadOnly = isReadOnly; - } - - /// - /// Initializes a new instance of this type. - /// - /// property value. - protected MapTransform(bool isReadOnly) - { - this.isReadOnly = isReadOnly; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.05.07 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Collections; +using Xtensive.Core; +using Xtensive.Reflection; + + +using Xtensive.Tuples.Transform.Internals; + +namespace Xtensive.Tuples.Transform +{ + /// + /// Base class for any tuple field mapping transform. + /// Maps fields of destination tuple to fields of a set of source tuples. + /// + [Serializable] + public class MapTransform : TupleTransformBase + { + private readonly bool isReadOnly; + private int sourceCount; + internal IReadOnlyList singleSourceMap; + internal Pair[] map; + + /// + /// Means that no mapping is available for the specified field index. + /// + public const int NoMapping = int.MinValue; + + /// + public override bool IsReadOnly { + [DebuggerStepThrough] + get { return isReadOnly; } + } + + /// + /// Gets the count of source this transform maps to the target one. + /// + public int SourceCount + { + [DebuggerStepThrough] + get { return sourceCount; } + } + + /// + /// Gets or sets destination-to-source field map for the first source only. + /// + public IReadOnlyList SingleSourceMap { + [DebuggerStepThrough] + get => singleSourceMap; + } + + /// + /// Gets or sets destination-to-source field map. + /// + public IReadOnlyList> Map + { + [DebuggerStepThrough] + get { return Array.AsReadOnly(map); } + } + + protected void SetSingleSourceMap(IReadOnlyList singleSourceMap) + { + ArgumentValidator.EnsureArgumentNotNull(singleSourceMap, nameof(singleSourceMap)); + var newMap = new Pair[Descriptor.Count]; + var index = 0; + for (; index < newMap.Length && index < singleSourceMap.Count; index++) { + newMap[index] = new Pair(0, singleSourceMap[index]); + } + while (index < newMap.Length) { + newMap[index++] = new Pair(0, NoMapping); + } + + map = newMap; + this.singleSourceMap = singleSourceMap; + sourceCount = 1; + } + + protected void SetMap(Pair[] map) + { + ArgumentValidator.EnsureArgumentNotNull(map, nameof(map)); + int[] newFirstSourceMap = new int[map.Length]; + int index = 0; + int newSourceCount = -1; + foreach (var mappedTo in map) { + if (mappedTo.First>newSourceCount) + newSourceCount = mappedTo.First; + newFirstSourceMap[index++] = mappedTo.First==0 ? mappedTo.Second : -1; + } + newSourceCount++; + this.map = map; + if (newSourceCount==1) + singleSourceMap = newFirstSourceMap; + else + singleSourceMap = null; + sourceCount = newSourceCount; + } + + /// + public override Tuple Apply(TupleTransformType transformType, params object[] arguments) + { + ArgumentValidator.EnsureArgumentNotNull(arguments, "arguments"); + switch (sourceCount) { + case 1: + return Apply(transformType, (Tuple)arguments[0]); + case 2: + return Apply(transformType, (Tuple)arguments[0], (Tuple)arguments[1]); + case 3: + return Apply(transformType, (Tuple)arguments[0], (Tuple)arguments[1], (Tuple)arguments[2]); + default: + return Apply(transformType, arguments.Cast()); + } + } + + /// + /// Applies the transformation. + /// + /// The type of transformation to perform. + /// Transformation sources. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + public Tuple Apply(TupleTransformType transformType, params Tuple[] sources) + { + ArgumentValidator.EnsureArgumentNotNull(sources, "sources"); + if (sourceCount>sources.Length) + throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); + switch (sourceCount) { + case 1: + return Apply(transformType, sources[0]); + case 2: + return Apply(transformType, sources[0], sources[1]); + case 3: + return Apply(transformType, sources[0], sources[1], sources[2]); + default: + switch (transformType) { + case TupleTransformType.Auto: + foreach (Tuple tuple in sources) + if (tuple is TransformedTuple) + goto case TupleTransformType.Tuple; + goto case TupleTransformType.TransformedTuple; + case TupleTransformType.TransformedTuple: + return new MapTransformTuple(this, sources); + case TupleTransformType.Tuple: + Tuple result = Tuple.Create(Descriptor); + sources.CopyTo(result, map); + return result; + default: + throw new ArgumentOutOfRangeException("transformType"); + } + } + } + + /// + /// Applies the transformation. + /// + /// The type of transformation to perform. + /// Transformation source. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + protected Tuple Apply(TupleTransformType transformType, Tuple source) + { + if (sourceCount>1) + throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); + switch (transformType) { + case TupleTransformType.Auto: + if (source is TransformedTuple) + goto case TupleTransformType.Tuple; + goto case TupleTransformType.TransformedTuple; + case TupleTransformType.TransformedTuple: + return new MapTransformTuple1(this, source); + case TupleTransformType.Tuple: + Tuple result = Tuple.Create(Descriptor); + source.CopyTo(result, singleSourceMap); + return result; + default: + throw new ArgumentOutOfRangeException("transformType"); + } + } + + /// + /// Applies the transformation. + /// + /// The type of transformation to perform. + /// First transformation source. + /// Second transformation source. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + protected Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2) + { + if (sourceCount>2) + throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); + switch (transformType) { + case TupleTransformType.Auto: + if (source1 is TransformedTuple) + goto case TupleTransformType.Tuple; + if (source2 is TransformedTuple) + goto case TupleTransformType.Tuple; + goto case TupleTransformType.TransformedTuple; + case TupleTransformType.TransformedTuple: + return new MapTransformTuple3(this, source1, source2); + case TupleTransformType.Tuple: + FixedList3 sources = new FixedList3(source1, source2); + Tuple result = Tuple.Create(Descriptor); + sources.CopyTo(result, map); + return result; + default: + throw new ArgumentOutOfRangeException("transformType"); + } + } + + /// + /// Applies the transformation. + /// + /// The type of transformation to perform. + /// First transformation source. + /// Second transformation source. + /// Third transformation source. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + protected Tuple Apply(TupleTransformType transformType, Tuple source1, Tuple source2, Tuple source3) + { + if (sourceCount>3) + throw new InvalidOperationException(string.Format(Strings.ExTheNumberOfSourcesIsTooSmallExpected, sourceCount)); + switch (transformType) { + case TupleTransformType.Auto: + if (source1 is TransformedTuple) + goto case TupleTransformType.Tuple; + if (source2 is TransformedTuple) + goto case TupleTransformType.Tuple; + if (source3 is TransformedTuple) + goto case TupleTransformType.Tuple; + goto case TupleTransformType.TransformedTuple; + case TupleTransformType.TransformedTuple: + return new MapTransformTuple3(this, source1, source2, source3); + case TupleTransformType.Tuple: + FixedList3 sources = new FixedList3(source1, source2, source3); + Tuple result = Tuple.Create(Descriptor); + sources.CopyTo(result, map); + return result; + default: + throw new ArgumentOutOfRangeException("transformType"); + } + } + + /// + public override string ToString() + { + string description = string.Format("{0}: {1}, {2}", + SourceCount, + SourceCount==1 ? + singleSourceMap.ToCommaDelimitedString() : + map.ToCommaDelimitedString(), + isReadOnly ? + Strings.ReadOnlyShort : + Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Initial property value. + /// property value. + public MapTransform(bool isReadOnly, TupleDescriptor descriptor, Pair[] map) + : this(isReadOnly, descriptor) + { + SetMap(map); + } + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Initial property value. + /// property value. + public MapTransform(bool isReadOnly, TupleDescriptor descriptor, IReadOnlyList map) + : this(isReadOnly, descriptor) + { + SetSingleSourceMap(map); + } + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Initial property value. + protected MapTransform(bool isReadOnly, TupleDescriptor descriptor) + : this(isReadOnly) + { + ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); + Descriptor = descriptor; + this.isReadOnly = isReadOnly; + } + + /// + /// Initializes a new instance of this type. + /// + /// property value. + protected MapTransform(bool isReadOnly) + { + this.isReadOnly = isReadOnly; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/ReadOnlyTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/ReadOnlyTransform.cs index 8bf6699cec..b235e8d8b7 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/ReadOnlyTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/ReadOnlyTransform.cs @@ -1,82 +1,82 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.02 - -using System; -using System.Diagnostics; -using System.Linq; -using Xtensive.Core; - -using Xtensive.Tuples.Transform.Internals; - -namespace Xtensive.Tuples.Transform -{ - /// - /// Describes read-only tuple transformation. - /// - [Serializable] - public sealed class ReadOnlyTransform : TupleTransformBase - { - private static readonly ReadOnlyTransform instance = new ReadOnlyTransform(); - - /// - /// Gets the only instance of this type. - /// - public static ReadOnlyTransform Instance { - [DebuggerStepThrough] - get { return instance; } - } - - /// - /// - /// Implementation in this class always returns . - /// - public override bool IsReadOnly { - [DebuggerStepThrough] - get { - return true; - } - } - - /// - public override Tuple Apply(TupleTransformType transformType, params object[] arguments) - { - ArgumentValidator.EnsureArgumentNotNull(arguments, "arguments"); - return Apply(transformType, arguments[0]); - } - - /// - /// Typed version of . - /// - /// The type of transformation to perform. - /// Transformation argument. - /// Transformation result - - /// either or descendant, - /// dependently on specified . - public Tuple Apply(TupleTransformType transformType, Tuple source) - { - switch (transformType) { - case TupleTransformType.Auto: - // TODO: Implement "Auto" for generated read-only tuples, when they'll be ready - case TupleTransformType.TransformedTuple: - if (source is ReadOnlyTransformTuple) - return source; - return new ReadOnlyTransformTuple(source); - case TupleTransformType.Tuple: - // TODO: Return generated read-only tuple copy - return new ReadOnlyTransformTuple(source.ToRegular()); - default: - throw new ArgumentOutOfRangeException("transformType"); - } - } - - - // Constructors - - private ReadOnlyTransform() - { - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.02 + +using System; +using System.Diagnostics; +using System.Linq; +using Xtensive.Core; + +using Xtensive.Tuples.Transform.Internals; + +namespace Xtensive.Tuples.Transform +{ + /// + /// Describes read-only tuple transformation. + /// + [Serializable] + public sealed class ReadOnlyTransform : TupleTransformBase + { + private static readonly ReadOnlyTransform instance = new ReadOnlyTransform(); + + /// + /// Gets the only instance of this type. + /// + public static ReadOnlyTransform Instance { + [DebuggerStepThrough] + get { return instance; } + } + + /// + /// + /// Implementation in this class always returns . + /// + public override bool IsReadOnly { + [DebuggerStepThrough] + get { + return true; + } + } + + /// + public override Tuple Apply(TupleTransformType transformType, params object[] arguments) + { + ArgumentValidator.EnsureArgumentNotNull(arguments, "arguments"); + return Apply(transformType, arguments[0]); + } + + /// + /// Typed version of . + /// + /// The type of transformation to perform. + /// Transformation argument. + /// Transformation result - + /// either or descendant, + /// dependently on specified . + public Tuple Apply(TupleTransformType transformType, Tuple source) + { + switch (transformType) { + case TupleTransformType.Auto: + // TODO: Implement "Auto" for generated read-only tuples, when they'll be ready + case TupleTransformType.TransformedTuple: + if (source is ReadOnlyTransformTuple) + return source; + return new ReadOnlyTransformTuple(source); + case TupleTransformType.Tuple: + // TODO: Return generated read-only tuple copy + return new ReadOnlyTransformTuple(source.ToRegular()); + default: + throw new ArgumentOutOfRangeException("transformType"); + } + } + + + // Constructors + + private ReadOnlyTransform() + { + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/SegmentTransform.cs b/Orm/Xtensive.Orm/Tuples/Transform/SegmentTransform.cs index 87b284b7ff..774d3c8b4e 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/SegmentTransform.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/SegmentTransform.cs @@ -1,72 +1,72 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.05.20 - -using System; -using System.Diagnostics; -using Xtensive.Core; -using Xtensive.Reflection; - - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Extracts specified from the . - /// - public sealed class SegmentTransform : MapTransform - { - private Segment segment; - - /// - /// Gets the segment this transform extracts. - /// - public Segment Segment - { - [DebuggerStepThrough] - get { return segment; } - } - - /// - public new Tuple Apply(TupleTransformType transformType, Tuple source) - { - return base.Apply(transformType, source); - } - - /// - public override string ToString() - { - string description = string.Format("{0}, {1}", - segment, - IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); - return string.Format(Strings.TupleTransformFormat, - GetType().GetShortName(), - description); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// property value. - /// Source tuple descriptor. - /// The segment to extract. - public SegmentTransform(bool isReadOnly, TupleDescriptor sourceDescriptor, in Segment segment) - : base(isReadOnly) - { - this.segment = segment; - Type[] fields = new Type[segment.Length]; - int[] map = new int[segment.Length]; - for (int i = 0, j = segment.Offset; i < segment.Length; i++, j++) { - fields[i] = sourceDescriptor[j]; - map[i] = j; - } - Descriptor = TupleDescriptor.Create(fields); - SetSingleSourceMap(map); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.05.20 + +using System; +using System.Diagnostics; +using Xtensive.Core; +using Xtensive.Reflection; + + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Extracts specified from the . + /// + public sealed class SegmentTransform : MapTransform + { + private Segment segment; + + /// + /// Gets the segment this transform extracts. + /// + public Segment Segment + { + [DebuggerStepThrough] + get { return segment; } + } + + /// + public new Tuple Apply(TupleTransformType transformType, Tuple source) + { + return base.Apply(transformType, source); + } + + /// + public override string ToString() + { + string description = string.Format("{0}, {1}", + segment, + IsReadOnly ? Strings.ReadOnlyShort : Strings.ReadWriteShort); + return string.Format(Strings.TupleTransformFormat, + GetType().GetShortName(), + description); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// property value. + /// Source tuple descriptor. + /// The segment to extract. + public SegmentTransform(bool isReadOnly, TupleDescriptor sourceDescriptor, in Segment segment) + : base(isReadOnly) + { + this.segment = segment; + Type[] fields = new Type[segment.Length]; + int[] map = new int[segment.Length]; + for (int i = 0, j = segment.Offset; i < segment.Length; i++, j++) { + fields[i] = sourceDescriptor[j]; + map[i] = j; + } + Descriptor = TupleDescriptor.Create(fields); + SetSingleSourceMap(map); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple.cs b/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple.cs index 71e527d278..34a88c5e7d 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.05.07 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Base class for any transformed tuples. - /// - [Serializable] - public abstract class TransformedTuple : Tuple - { - /// - /// Gets the transform used to produce this instance. - /// - public abstract ITupleTransform Transform { get; } - - /// - /// Gets a list of arguments used in method - /// to produce this tuple. - /// means arguments are unknown an this stage. - /// - public abstract IReadOnlyList Arguments { get; } - - /// - public override TupleDescriptor Descriptor - { - [DebuggerStepThrough] - get { return Transform.Descriptor; } - } - - /// - public override string ToString() - { - return string.Format(Strings.TransformedTupleFormat, - base.ToString(), - Transform, - Arguments.ToCommaDelimitedString()); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.05.07 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Base class for any transformed tuples. + /// + [Serializable] + public abstract class TransformedTuple : Tuple + { + /// + /// Gets the transform used to produce this instance. + /// + public abstract ITupleTransform Transform { get; } + + /// + /// Gets a list of arguments used in method + /// to produce this tuple. + /// means arguments are unknown an this stage. + /// + public abstract IReadOnlyList Arguments { get; } + + /// + public override TupleDescriptor Descriptor + { + [DebuggerStepThrough] + get { return Transform.Descriptor; } + } + + /// + public override string ToString() + { + return string.Format(Strings.TransformedTupleFormat, + base.ToString(), + Transform, + Arguments.ToCommaDelimitedString()); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple{TTupleTransform}.cs b/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple{TTupleTransform}.cs index 60aaf417f0..54b7567ab1 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple{TTupleTransform}.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/TransformedTuple{TTupleTransform}.cs @@ -1,51 +1,51 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.04.30 - -using System; -using System.Diagnostics; - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Base class for all transformed tuples. - /// - [Serializable] - public abstract class TransformedTuple : TransformedTuple - where TTupleTransform : ITupleTransform - { - private TTupleTransform transform; - - /// - public override ITupleTransform Transform - { - [DebuggerStepThrough] - get { return transform; } - } - - /// - /// Gets or sets the transform used to produce this instance. - /// - public TTupleTransform TypedTransform { - get { return transform; } - protected set { - transform = value; - } - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// Tuple transform. - protected TransformedTuple(TTupleTransform transform) - { - this.transform = transform; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.04.30 + +using System; +using System.Diagnostics; + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Base class for all transformed tuples. + /// + [Serializable] + public abstract class TransformedTuple : TransformedTuple + where TTupleTransform : ITupleTransform + { + private TTupleTransform transform; + + /// + public override ITupleTransform Transform + { + [DebuggerStepThrough] + get { return transform; } + } + + /// + /// Gets or sets the transform used to produce this instance. + /// + public TTupleTransform TypedTransform { + get { return transform; } + protected set { + transform = value; + } + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// Tuple transform. + protected TransformedTuple(TTupleTransform transform) + { + this.transform = transform; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformBase.cs b/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformBase.cs index 19fbb22f35..945eaa8fe9 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformBase.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformBase.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.04.30 - -using System; -using System.Diagnostics; -using Xtensive.Reflection; - -namespace Xtensive.Tuples.Transform -{ - /// - /// Base class for any tuple transform. - /// - [Serializable] - public abstract class TupleTransformBase : ITupleTransform - { - private TupleDescriptor descriptor; - private Tuple defaultResult; - - /// - public TupleDescriptor Descriptor - { - get { return descriptor; } - protected set { - descriptor = value; - defaultResult = null; - } - } - - /// - public Tuple DefaultResult { - get { - if (defaultResult==null && descriptor!=null) - defaultResult = Tuple.Create(descriptor).ToReadOnly(TupleTransformType.Tuple); - return defaultResult; - } - } - - /// - public virtual bool IsReadOnly { - [DebuggerStepThrough] - get { return false; } - } - - /// - public abstract Tuple Apply(TupleTransformType transformType, params object[] arguments); - - /// - public override string ToString() - { - return GetType().GetShortName(); - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.04.30 + +using System; +using System.Diagnostics; +using Xtensive.Reflection; + +namespace Xtensive.Tuples.Transform +{ + /// + /// Base class for any tuple transform. + /// + [Serializable] + public abstract class TupleTransformBase : ITupleTransform + { + private TupleDescriptor descriptor; + private Tuple defaultResult; + + /// + public TupleDescriptor Descriptor + { + get { return descriptor; } + protected set { + descriptor = value; + defaultResult = null; + } + } + + /// + public Tuple DefaultResult { + get { + if (defaultResult==null && descriptor!=null) + defaultResult = Tuple.Create(descriptor).ToReadOnly(TupleTransformType.Tuple); + return defaultResult; + } + } + + /// + public virtual bool IsReadOnly { + [DebuggerStepThrough] + get { return false; } + } + + /// + public abstract Tuple Apply(TupleTransformType transformType, params object[] arguments); + + /// + public override string ToString() + { + return GetType().GetShortName(); + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformType.cs b/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformType.cs index 215f326297..2a10b5e8f2 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformType.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/TupleTransformType.cs @@ -1,36 +1,36 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kochetov -// Created: 2008.05.06 - -using System; - -namespace Xtensive.Tuples.Transform -{ - /// - /// Enumerates possible tuple transformation types. - /// - [Serializable] - public enum TupleTransformType - { - /// - /// Default transform type (). - /// - Default = Auto, - /// - /// Transform type is detected automatically based on sources. - /// - Auto = 0, - /// - /// must be returned. - /// A wrapper performing specified transform on-the-fly is returned. - /// - TransformedTuple, - /// - /// must be returned. - /// Transform is performed right now and a newly created tuple is returned. - /// - Tuple - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kochetov +// Created: 2008.05.06 + +using System; + +namespace Xtensive.Tuples.Transform +{ + /// + /// Enumerates possible tuple transformation types. + /// + [Serializable] + public enum TupleTransformType + { + /// + /// Default transform type (). + /// + Default = Auto, + /// + /// Transform type is detected automatically based on sources. + /// + Auto = 0, + /// + /// must be returned. + /// A wrapper performing specified transform on-the-fly is returned. + /// + TransformedTuple, + /// + /// must be returned. + /// Transform is performed right now and a newly created tuple is returned. + /// + Tuple + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs b/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs index c5ce21a6fc..5d2c9aba60 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.06.02 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Xtensive.Core; - - -namespace Xtensive.Tuples.Transform -{ - /// - /// Base class for one-to-one tuple transformations. - /// - [Serializable] - public abstract class WrappingTransformTupleBase: TransformedTuple - { - protected readonly Tuple origin; - - /// - public override TupleDescriptor Descriptor - { - [DebuggerStepThrough] - get => origin.Descriptor; - } - - /// - public override int Count { - [DebuggerStepThrough] - get => origin.Count; - } - - /// - public override IReadOnlyList Arguments { - [DebuggerStepThrough] - get => new object[] {origin}; - } - - #region GetFieldState, GetValueOrDefault, SetValue methods - - /// - public override TupleFieldState GetFieldState(int fieldIndex) - { - return origin.GetFieldState(fieldIndex); - } - - /// - public override object GetValue(int fieldIndex, out TupleFieldState fieldState) - { - return origin.GetValue(fieldIndex, out fieldState); - } - - /// - public override void SetValue(int fieldIndex, object fieldValue) - { - origin.SetValue(fieldIndex, fieldValue); - } - - #endregion - - /// - public sealed override bool Equals(Tuple other) - { - return origin.Equals(other); - } - - /// - public sealed override int GetHashCode() - { - return origin.GetHashCode(); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - /// Tuple to provide the wrapper for. - protected WrappingTransformTupleBase(Tuple tuple) - { - ArgumentValidator.EnsureArgumentNotNull(tuple, "tuple"); - origin = tuple; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.06.02 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Xtensive.Core; + + +namespace Xtensive.Tuples.Transform +{ + /// + /// Base class for one-to-one tuple transformations. + /// + [Serializable] + public abstract class WrappingTransformTupleBase: TransformedTuple + { + protected readonly Tuple origin; + + /// + public override TupleDescriptor Descriptor + { + [DebuggerStepThrough] + get => origin.Descriptor; + } + + /// + public override int Count { + [DebuggerStepThrough] + get => origin.Count; + } + + /// + public override IReadOnlyList Arguments { + [DebuggerStepThrough] + get => new object[] {origin}; + } + + #region GetFieldState, GetValueOrDefault, SetValue methods + + /// + public override TupleFieldState GetFieldState(int fieldIndex) + { + return origin.GetFieldState(fieldIndex); + } + + /// + public override object GetValue(int fieldIndex, out TupleFieldState fieldState) + { + return origin.GetValue(fieldIndex, out fieldState); + } + + /// + public override void SetValue(int fieldIndex, object fieldValue) + { + origin.SetValue(fieldIndex, fieldValue); + } + + #endregion + + /// + public sealed override bool Equals(Tuple other) + { + return origin.Equals(other); + } + + /// + public sealed override int GetHashCode() + { + return origin.GetHashCode(); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + /// Tuple to provide the wrapper for. + protected WrappingTransformTupleBase(Tuple tuple) + { + ArgumentValidator.EnsureArgumentNotNull(tuple, "tuple"); + origin = tuple; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/Tuple.cs b/Orm/Xtensive.Orm/Tuples/Tuple.cs index 678e3b8271..3a79b05e2d 100644 --- a/Orm/Xtensive.Orm/Tuples/Tuple.cs +++ b/Orm/Xtensive.Orm/Tuples/Tuple.cs @@ -1,599 +1,599 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2007.05.30 - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Runtime.Serialization; -using System.Text; -using Xtensive.Comparison; -using Xtensive.Core; - - -using Xtensive.Tuples.Packed; - -namespace Xtensive.Tuples -{ - /// - /// A base class for auto generated tuples. - /// - [DataContract] - [Serializable] - public abstract class Tuple : ITuple, IEquatable - { - /// - /// Per-field hash code multiplier used in calculation. - /// - public const int HashCodeMultiplier = 397; - - /// - [IgnoreDataMember] - public abstract TupleDescriptor Descriptor { get; } - - /// - [IgnoreDataMember] - public virtual int Count - { - [DebuggerStepThrough] - get { return Descriptor.Count; } - } - - /// - Tuple ITupleFactory.CreateNew() - { - return CreateNew(); - } - - /// - Tuple ITuple.Clone() - { - return Clone(); - } - - /// - object ICloneable.Clone() - { - return Clone(); - } - - /// - public virtual Tuple CreateNew() - { - return Create(Descriptor); - } - - /// - public virtual Tuple Clone() - { - return (Tuple) MemberwiseClone(); - } - - /// - public abstract TupleFieldState GetFieldState(int fieldIndex); - - protected internal abstract void SetFieldState(int fieldIndex, TupleFieldState fieldState); - - /// - public abstract object GetValue(int fieldIndex, out TupleFieldState fieldState); - - /// - /// Field value is not available. - public object GetValue(int fieldIndex) - { - TupleFieldState state; - var result = GetValue(fieldIndex, out state); - return state.IsNull() ? null : result; - } - - /// - public object GetValueOrDefault(int fieldIndex) - { - TupleFieldState state; - var value = GetValue(fieldIndex, out state); - return state==TupleFieldState.Available ? value : null; - } - - /// - public abstract void SetValue(int fieldIndex, object fieldValue); - - /// - /// Gets the value field value by its index, if it is available; - /// otherwise returns . - /// - /// Index of the field to get value of. - /// Field state associated with the field. - /// Field value, if it is available; otherwise, . - /// The type of value to get. - public T GetValue(int fieldIndex, out TupleFieldState fieldState) - { - var isNullable = null==default(T); // Is nullable value type or class - - if (this is PackedTuple packedTuple) { - ref var descriptor = ref packedTuple.PackedDescriptor.FieldDescriptors[fieldIndex]; - return descriptor.Accessor.GetValue(packedTuple, ref descriptor, isNullable, out fieldState); - } - - var mappedContainer = GetMappedContainer(fieldIndex, false); - if (mappedContainer.First is PackedTuple mappedTuple) { - ref var descriptor = ref mappedTuple.PackedDescriptor.FieldDescriptors[mappedContainer.Second]; - return descriptor.Accessor.GetValue(mappedTuple, ref descriptor, isNullable, out fieldState); - } - - var value = GetValue(fieldIndex, out fieldState); - return value!=null ? (T) value : default(T); - } - - /// - /// Gets the value field value by its index. - /// - /// Index of the field to get value of. - /// Field value. - /// The type of value to get. - /// - /// If field value is not available (see ), - /// an exception will be thrown. - /// - /// Field value is not available. - /// Value is available, but it can't be cast - /// to specified type. E.g. if value is , field is struct, - /// but is not a type. - public T GetValue(int fieldIndex) - { - TupleFieldState fieldState; - var result = GetValue(fieldIndex, out fieldState); - - if (fieldState.IsNull()) { - if (default(T)!=null) - throw new InvalidCastException(string.Format(Strings.ExUnableToCastNullValueToXUseXInstead, typeof (T))); - return default(T); - } - - return result; - } - - /// - /// Gets the value field value by its index. - /// - /// Index of the field to get value of. - /// Field value. - /// The type of value to get. - /// - /// If field value is not available (see ), - /// an exception will be thrown. - /// - /// Value is available, but it can't be cast - /// to specified type. E.g. if value is , field is struct, - /// but is not a type. - public T GetValueOrDefault(int fieldIndex) - { - TupleFieldState fieldState; - var result = GetValue(fieldIndex, out fieldState); - return fieldState==TupleFieldState.Available ? result : default(T); - } - - /// - /// Sets the field value by its index. - /// - /// Index of the field to set value of. - /// Field value. - /// The type of value to set. - /// Type of stored value and - /// are incompatible. - public void SetValue(int fieldIndex, T fieldValue) - { - var isNullable = null==default(T); // Is nullable value type or class - - if (this is PackedTuple packedTuple) { - ref var descriptor = ref packedTuple.PackedDescriptor.FieldDescriptors[fieldIndex]; - descriptor.Accessor.SetValue(packedTuple, ref descriptor, isNullable, fieldValue); - return; - } - - var mappedContainer = GetMappedContainer(fieldIndex, true); - if (mappedContainer.First is PackedTuple mappedTuple) { - ref var descriptor = ref mappedTuple.PackedDescriptor.FieldDescriptors[mappedContainer.Second]; - descriptor.Accessor.SetValue(mappedTuple, ref descriptor, isNullable, fieldValue); - return; - } - - SetValue(fieldIndex, (object) fieldValue); - } - - /// - /// Gets the tuple containing actual value of the specified field. - /// - /// Index of the field to get the value container for. - /// Tuple container and remapped field index. - protected internal virtual Pair GetMappedContainer(int fieldIndex, bool isWriting) - { - return new Pair(this, fieldIndex); - } - - #region Equals, GetHashCode - - /// - public override sealed bool Equals(object obj) - { - return Equals(obj as Tuple); - } - - /// - public virtual bool Equals(Tuple other) - { - if (ReferenceEquals(other, null)) - return false; - if (ReferenceEquals(other, this)) - return true; - if (Descriptor!=other.Descriptor) - return false; - - var count = Count; - for (int i = 0; i < count; i++) { - TupleFieldState thisState; - TupleFieldState otherState; - var thisValue = GetValue(i, out thisState); - var otherValue = other.GetValue(i, out otherState); - if (thisState!=otherState) - return false; - if (thisState!=TupleFieldState.Available) - continue; - if (!Equals(thisValue, otherValue)) - return false; - } - - return true; - } - - /// - public override int GetHashCode() - { - var count = Count; - int result = 0; - for (int i = 0; i < count; i++) { - TupleFieldState state; - object value = GetValue(i, out state); - result = HashCodeMultiplier * result ^ (value!=null ? value.GetHashCode() : 0); - } - return result; - } - - #endregion - - #region ToString methods - - /// - public override string ToString() - { - var sb = new StringBuilder(16); - for (int i = 0; i < Count; i++) { - TupleFieldState state; - var value = GetValue(i, out state); - if (i > 0) - sb.Append(", "); - if (!state.IsAvailable()) - sb.Append(Strings.NotAvailable); - else if (state.IsNull()) - sb.Append(Strings.Null); - else if (Descriptor[i]==typeof (string)) { - if (string.IsNullOrEmpty(value as string)) - sb.Append(Strings.EmptyString); - else - sb.Append(value); - } - else - sb.Append(value); - } - return string.Format(Strings.TupleFormat, sb); - } - - #endregion - - #region Create methods (base) - - /// - /// Creates new by its field types. - /// - /// Array of field types. - /// Newly created object. - public static RegularTuple Create(params Type[] fieldTypes) - { - TupleDescriptor descriptor = TupleDescriptor.Create(fieldTypes); - return Create(descriptor); - } - - /// - /// Creates new by its descriptor. - /// - /// The descriptor. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor) - { - if (descriptor==null) - throw new ArgumentNullException("descriptor"); - return new PackedTuple(descriptor); - } - - #endregion - - #region Create methods - - /// - /// Creates new by its field value(s). - /// - /// Type of the only tuple field. - /// Value of the only tuple field. - /// Newly created object. - public static RegularTuple Create(T value) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T) - }); - return Create(descriptor, value); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the only tuple field. - /// Tuple descriptor. - /// Value of the only tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T value) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value); - return tuple; - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Newly created object. - public static RegularTuple Create(T1 value1, T2 value2) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T1), - typeof (T2) - }); - return Create(descriptor, value1, value2); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Tuple descriptor. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value1); - tuple.SetValue(1, value2); - return tuple; - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Newly created object. - public static RegularTuple Create(T1 value1, T2 value2, T3 value3) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T1), - typeof (T2), - typeof (T3) - }); - return Create(descriptor, value1, value2, value3); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Tuple descriptor. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value1); - tuple.SetValue(1, value2); - tuple.SetValue(2, value3); - return tuple; - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Newly created object. - public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T1), - typeof (T2), - typeof (T3), - typeof (T4) - }); - return Create(descriptor, value1, value2, value3, value4); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Tuple descriptor. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value1); - tuple.SetValue(1, value2); - tuple.SetValue(2, value3); - tuple.SetValue(3, value4); - return tuple; - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Type of the 5th tuple field. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Value of the 5th tuple field. - /// Newly created object. - public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T1), - typeof (T2), - typeof (T3), - typeof (T4), - typeof (T5) - }); - return Create(descriptor, value1, value2, value3, value4, value5); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Type of the 5th tuple field. - /// Tuple descriptor. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Value of the 5th tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value1); - tuple.SetValue(1, value2); - tuple.SetValue(2, value3); - tuple.SetValue(3, value4); - tuple.SetValue(4, value5); - return tuple; - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Type of the 5th tuple field. - /// Type of the 6th tuple field. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Value of the 5th tuple field. - /// Value of the 6th tuple field. - /// Newly created object. - public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) - { - TupleDescriptor descriptor = TupleDescriptor.Create(new[] { - typeof (T1), - typeof (T2), - typeof (T3), - typeof (T4), - typeof (T5), - typeof (T6) - }); - return Create(descriptor, value1, value2, value3, value4, value5, value6); - } - - /// - /// Creates new by its field value(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Type of the 5th tuple field. - /// Type of the 6th tuple field. - /// Tuple descriptor. - /// Value of the first tuple field. - /// Value of the 2nd tuple field. - /// Value of the 3rd tuple field. - /// Value of the 4th tuple field. - /// Value of the 5th tuple field. - /// Value of the 6th tuple field. - /// Newly created object. - public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) - { - RegularTuple tuple = Create(descriptor); - tuple.SetValue(0, value1); - tuple.SetValue(1, value2); - tuple.SetValue(2, value3); - tuple.SetValue(3, value4); - tuple.SetValue(4, value5); - tuple.SetValue(5, value6); - return tuple; - } - - #endregion - - /// - public static Tuple Parse(TupleDescriptor descriptor, string source) - { - return descriptor.Parse(source); - } - - - // Constructors - - /// - /// Initializes a new instance of this type. - /// - protected Tuple() - { - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.05.30 + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text; +using Xtensive.Comparison; +using Xtensive.Core; + + +using Xtensive.Tuples.Packed; + +namespace Xtensive.Tuples +{ + /// + /// A base class for auto generated tuples. + /// + [DataContract] + [Serializable] + public abstract class Tuple : ITuple, IEquatable + { + /// + /// Per-field hash code multiplier used in calculation. + /// + public const int HashCodeMultiplier = 397; + + /// + [IgnoreDataMember] + public abstract TupleDescriptor Descriptor { get; } + + /// + [IgnoreDataMember] + public virtual int Count + { + [DebuggerStepThrough] + get { return Descriptor.Count; } + } + + /// + Tuple ITupleFactory.CreateNew() + { + return CreateNew(); + } + + /// + Tuple ITuple.Clone() + { + return Clone(); + } + + /// + object ICloneable.Clone() + { + return Clone(); + } + + /// + public virtual Tuple CreateNew() + { + return Create(Descriptor); + } + + /// + public virtual Tuple Clone() + { + return (Tuple) MemberwiseClone(); + } + + /// + public abstract TupleFieldState GetFieldState(int fieldIndex); + + protected internal abstract void SetFieldState(int fieldIndex, TupleFieldState fieldState); + + /// + public abstract object GetValue(int fieldIndex, out TupleFieldState fieldState); + + /// + /// Field value is not available. + public object GetValue(int fieldIndex) + { + TupleFieldState state; + var result = GetValue(fieldIndex, out state); + return state.IsNull() ? null : result; + } + + /// + public object GetValueOrDefault(int fieldIndex) + { + TupleFieldState state; + var value = GetValue(fieldIndex, out state); + return state==TupleFieldState.Available ? value : null; + } + + /// + public abstract void SetValue(int fieldIndex, object fieldValue); + + /// + /// Gets the value field value by its index, if it is available; + /// otherwise returns . + /// + /// Index of the field to get value of. + /// Field state associated with the field. + /// Field value, if it is available; otherwise, . + /// The type of value to get. + public T GetValue(int fieldIndex, out TupleFieldState fieldState) + { + var isNullable = null==default(T); // Is nullable value type or class + + if (this is PackedTuple packedTuple) { + ref var descriptor = ref packedTuple.PackedDescriptor.FieldDescriptors[fieldIndex]; + return descriptor.Accessor.GetValue(packedTuple, ref descriptor, isNullable, out fieldState); + } + + var mappedContainer = GetMappedContainer(fieldIndex, false); + if (mappedContainer.First is PackedTuple mappedTuple) { + ref var descriptor = ref mappedTuple.PackedDescriptor.FieldDescriptors[mappedContainer.Second]; + return descriptor.Accessor.GetValue(mappedTuple, ref descriptor, isNullable, out fieldState); + } + + var value = GetValue(fieldIndex, out fieldState); + return value!=null ? (T) value : default(T); + } + + /// + /// Gets the value field value by its index. + /// + /// Index of the field to get value of. + /// Field value. + /// The type of value to get. + /// + /// If field value is not available (see ), + /// an exception will be thrown. + /// + /// Field value is not available. + /// Value is available, but it can't be cast + /// to specified type. E.g. if value is , field is struct, + /// but is not a type. + public T GetValue(int fieldIndex) + { + TupleFieldState fieldState; + var result = GetValue(fieldIndex, out fieldState); + + if (fieldState.IsNull()) { + if (default(T)!=null) + throw new InvalidCastException(string.Format(Strings.ExUnableToCastNullValueToXUseXInstead, typeof (T))); + return default(T); + } + + return result; + } + + /// + /// Gets the value field value by its index. + /// + /// Index of the field to get value of. + /// Field value. + /// The type of value to get. + /// + /// If field value is not available (see ), + /// an exception will be thrown. + /// + /// Value is available, but it can't be cast + /// to specified type. E.g. if value is , field is struct, + /// but is not a type. + public T GetValueOrDefault(int fieldIndex) + { + TupleFieldState fieldState; + var result = GetValue(fieldIndex, out fieldState); + return fieldState==TupleFieldState.Available ? result : default(T); + } + + /// + /// Sets the field value by its index. + /// + /// Index of the field to set value of. + /// Field value. + /// The type of value to set. + /// Type of stored value and + /// are incompatible. + public void SetValue(int fieldIndex, T fieldValue) + { + var isNullable = null==default(T); // Is nullable value type or class + + if (this is PackedTuple packedTuple) { + ref var descriptor = ref packedTuple.PackedDescriptor.FieldDescriptors[fieldIndex]; + descriptor.Accessor.SetValue(packedTuple, ref descriptor, isNullable, fieldValue); + return; + } + + var mappedContainer = GetMappedContainer(fieldIndex, true); + if (mappedContainer.First is PackedTuple mappedTuple) { + ref var descriptor = ref mappedTuple.PackedDescriptor.FieldDescriptors[mappedContainer.Second]; + descriptor.Accessor.SetValue(mappedTuple, ref descriptor, isNullable, fieldValue); + return; + } + + SetValue(fieldIndex, (object) fieldValue); + } + + /// + /// Gets the tuple containing actual value of the specified field. + /// + /// Index of the field to get the value container for. + /// Tuple container and remapped field index. + protected internal virtual Pair GetMappedContainer(int fieldIndex, bool isWriting) + { + return new Pair(this, fieldIndex); + } + + #region Equals, GetHashCode + + /// + public override sealed bool Equals(object obj) + { + return Equals(obj as Tuple); + } + + /// + public virtual bool Equals(Tuple other) + { + if (ReferenceEquals(other, null)) + return false; + if (ReferenceEquals(other, this)) + return true; + if (Descriptor!=other.Descriptor) + return false; + + var count = Count; + for (int i = 0; i < count; i++) { + TupleFieldState thisState; + TupleFieldState otherState; + var thisValue = GetValue(i, out thisState); + var otherValue = other.GetValue(i, out otherState); + if (thisState!=otherState) + return false; + if (thisState!=TupleFieldState.Available) + continue; + if (!Equals(thisValue, otherValue)) + return false; + } + + return true; + } + + /// + public override int GetHashCode() + { + var count = Count; + int result = 0; + for (int i = 0; i < count; i++) { + TupleFieldState state; + object value = GetValue(i, out state); + result = HashCodeMultiplier * result ^ (value!=null ? value.GetHashCode() : 0); + } + return result; + } + + #endregion + + #region ToString methods + + /// + public override string ToString() + { + var sb = new StringBuilder(16); + for (int i = 0; i < Count; i++) { + TupleFieldState state; + var value = GetValue(i, out state); + if (i > 0) + sb.Append(", "); + if (!state.IsAvailable()) + sb.Append(Strings.NotAvailable); + else if (state.IsNull()) + sb.Append(Strings.Null); + else if (Descriptor[i]==typeof (string)) { + if (string.IsNullOrEmpty(value as string)) + sb.Append(Strings.EmptyString); + else + sb.Append(value); + } + else + sb.Append(value); + } + return string.Format(Strings.TupleFormat, sb); + } + + #endregion + + #region Create methods (base) + + /// + /// Creates new by its field types. + /// + /// Array of field types. + /// Newly created object. + public static RegularTuple Create(params Type[] fieldTypes) + { + TupleDescriptor descriptor = TupleDescriptor.Create(fieldTypes); + return Create(descriptor); + } + + /// + /// Creates new by its descriptor. + /// + /// The descriptor. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor) + { + if (descriptor==null) + throw new ArgumentNullException("descriptor"); + return new PackedTuple(descriptor); + } + + #endregion + + #region Create methods + + /// + /// Creates new by its field value(s). + /// + /// Type of the only tuple field. + /// Value of the only tuple field. + /// Newly created object. + public static RegularTuple Create(T value) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T) + }); + return Create(descriptor, value); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the only tuple field. + /// Tuple descriptor. + /// Value of the only tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T value) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value); + return tuple; + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Newly created object. + public static RegularTuple Create(T1 value1, T2 value2) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T1), + typeof (T2) + }); + return Create(descriptor, value1, value2); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Tuple descriptor. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value1); + tuple.SetValue(1, value2); + return tuple; + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Newly created object. + public static RegularTuple Create(T1 value1, T2 value2, T3 value3) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T1), + typeof (T2), + typeof (T3) + }); + return Create(descriptor, value1, value2, value3); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Tuple descriptor. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value1); + tuple.SetValue(1, value2); + tuple.SetValue(2, value3); + return tuple; + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Newly created object. + public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T1), + typeof (T2), + typeof (T3), + typeof (T4) + }); + return Create(descriptor, value1, value2, value3, value4); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Tuple descriptor. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value1); + tuple.SetValue(1, value2); + tuple.SetValue(2, value3); + tuple.SetValue(3, value4); + return tuple; + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Type of the 5th tuple field. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Value of the 5th tuple field. + /// Newly created object. + public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T1), + typeof (T2), + typeof (T3), + typeof (T4), + typeof (T5) + }); + return Create(descriptor, value1, value2, value3, value4, value5); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Type of the 5th tuple field. + /// Tuple descriptor. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Value of the 5th tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value1); + tuple.SetValue(1, value2); + tuple.SetValue(2, value3); + tuple.SetValue(3, value4); + tuple.SetValue(4, value5); + return tuple; + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Type of the 5th tuple field. + /// Type of the 6th tuple field. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Value of the 5th tuple field. + /// Value of the 6th tuple field. + /// Newly created object. + public static RegularTuple Create(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + TupleDescriptor descriptor = TupleDescriptor.Create(new[] { + typeof (T1), + typeof (T2), + typeof (T3), + typeof (T4), + typeof (T5), + typeof (T6) + }); + return Create(descriptor, value1, value2, value3, value4, value5, value6); + } + + /// + /// Creates new by its field value(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Type of the 5th tuple field. + /// Type of the 6th tuple field. + /// Tuple descriptor. + /// Value of the first tuple field. + /// Value of the 2nd tuple field. + /// Value of the 3rd tuple field. + /// Value of the 4th tuple field. + /// Value of the 5th tuple field. + /// Value of the 6th tuple field. + /// Newly created object. + public static RegularTuple Create(TupleDescriptor descriptor, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + RegularTuple tuple = Create(descriptor); + tuple.SetValue(0, value1); + tuple.SetValue(1, value2); + tuple.SetValue(2, value3); + tuple.SetValue(3, value4); + tuple.SetValue(4, value5); + tuple.SetValue(5, value6); + return tuple; + } + + #endregion + + /// + public static Tuple Parse(TupleDescriptor descriptor, string source) + { + return descriptor.Parse(source); + } + + + // Constructors + + /// + /// Initializes a new instance of this type. + /// + protected Tuple() + { + } + } +} diff --git a/Orm/Xtensive.Orm/Tuples/TupleDescriptor.cs b/Orm/Xtensive.Orm/Tuples/TupleDescriptor.cs index abc91cdcd1..219cc68099 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleDescriptor.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleDescriptor.cs @@ -1,312 +1,312 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2007.05.30 - - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.Serialization; -using System.Text; -using Xtensive.Core; -using Xtensive.Linq.SerializableExpressions.Internals; -using Xtensive.Reflection; -using Xtensive.Tuples.Packed; - -namespace Xtensive.Tuples -{ - /// - /// Tuple descriptor. - /// Provides information about structure. - /// - [Serializable] - public sealed class TupleDescriptor : IEquatable, IReadOnlyList, ISerializable - { - private static readonly TupleDescriptor EmptyDescriptor = new TupleDescriptor(Array.Empty()); - - private readonly int FieldCount; - internal readonly int ValuesLength; - internal readonly int ObjectsLength; - - [NonSerialized] - internal readonly PackedFieldDescriptor[] FieldDescriptors; - - [field: NonSerialized] - private Type[] FieldTypes { get; } - - /// - /// Gets the empty tuple descriptor. - /// - /// The empty tuple descriptor. - public static TupleDescriptor Empty - { - [DebuggerStepThrough] - get => EmptyDescriptor; - } - - #region IList members - - /// - public Type this[int fieldIndex] - { - get => FieldTypes[fieldIndex]; - set => throw Exceptions.CollectionIsReadOnly(null); - } - - /// - public int Count - { - [DebuggerStepThrough] - get => FieldCount; - } - - /// - public IEnumerator GetEnumerator() - { - for (var index = 0; index < FieldCount; index++) { - yield return FieldTypes[index]; - } - } - - /// - [DebuggerStepThrough] - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion - - #region IEquatable members, GetHashCode - - /// - public bool Equals(TupleDescriptor other) - { - if (ReferenceEquals(other, null)) - return false; - if (ReferenceEquals(other, this)) - return true; - if (FieldCount!=other.FieldCount) - return false; - for (int i = 0; i < FieldCount; i++) - if (FieldTypes[i]!=other.FieldTypes[i]) - return false; - return true; - } - - /// - public override bool Equals(object obj) - { - return Equals(obj as TupleDescriptor); - } - - /// - public override int GetHashCode() - { - int result = FieldCount; - for (int i = 0; i < FieldCount; i++) - result = unchecked (FieldTypes[i].GetHashCode() + 29 * result); - return result; - } - - public static bool operator ==(TupleDescriptor left, TupleDescriptor right) - { - if (ReferenceEquals(left, right)) - return true; - if (ReferenceEquals(left, null)) - return false; - return left.Equals(right); - } - - public static bool operator !=(TupleDescriptor left, TupleDescriptor right) - { - return !(left==right); - } - - #endregion - - public void GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("FieldCount", FieldCount); - info.AddValue("ValuesLength", ValuesLength); - info.AddValue("ObjectsLength", ObjectsLength); - - var typeNames = new string[FieldTypes.Length]; - for (var i = 0; i < typeNames.Length; i++) - typeNames[i] = FieldTypes[i].ToSerializableForm(); - - info.AddValue("FieldTypes", typeNames); - info.AddValue("FieldDescriptors", FieldDescriptors); - } - - /// - public override string ToString() - { - var sb = new StringBuilder(); - for (int i = 0; i < FieldCount; i++) { - if (i > 0) - sb.Append(", "); - sb.Append(FieldTypes[i].GetShortName()); - } - return string.Format(Strings.TupleDescriptorFormat, sb); - } - - #region Create methods (base) - - public static TupleDescriptor Create(Type t1) - { - return new TupleDescriptor(new [] {t1}); - } - - public static TupleDescriptor Create(Type t1, Type t2) - { - return new TupleDescriptor(new [] {t1, t2}); - } - - public static TupleDescriptor Create(Type t1, Type t2, Type t3) - { - return new TupleDescriptor(new [] {t1, t2, t3}); - } - - public static TupleDescriptor Create(Type t1, Type t2, Type t3, Type t4) - { - return new TupleDescriptor(new [] {t1, t2, t3, t4}); - } - - /// - /// Creates or returns already created descriptor - /// for provided set of types. - /// - /// List of tuple field types. - /// Either new or existing tuple descriptor - /// describing the specified set of fields. - public static TupleDescriptor Create(Type[] fieldTypes) - { - ArgumentValidator.EnsureArgumentNotNull(fieldTypes, nameof(fieldTypes)); - if (fieldTypes.Length == 0) { - return EmptyDescriptor; - } - return new TupleDescriptor(fieldTypes); - } - - /// - /// Creates tuple descriptor containing head of the current one. - /// - /// Head field count. - /// Either new or existing tuple descriptor - /// describing the specified set of fields. - public TupleDescriptor Head(int fieldCount) - { - ArgumentValidator.EnsureArgumentIsInRange(fieldCount, 1, Count, nameof(fieldCount)); - var fieldTypes = new Type[fieldCount]; - Array.Copy(FieldTypes, 0, fieldTypes, 0, fieldCount); - return new TupleDescriptor(fieldTypes); - } - - /// - /// Creates tuple descriptor containing tail of the current one. - /// - /// Tail field count. - /// Either new or existing tuple descriptor - /// describing the specified set of fields. - public TupleDescriptor Tail(int tailFieldCount) - { - ArgumentValidator.EnsureArgumentIsInRange(tailFieldCount, 1, Count, nameof(tailFieldCount)); - var fieldTypes = new Type[tailFieldCount]; - Array.Copy(FieldTypes, Count - tailFieldCount, fieldTypes, 0, tailFieldCount); - return new TupleDescriptor(fieldTypes); - } - - #endregion - - #region Create<...> methods (generic shortcuts) - - /// - /// Creates new by its field type(s). - /// - /// Type of the only tuple field. - /// Newly created object. - public static TupleDescriptor Create() - => Create(typeof(T)); - - /// - /// Creates new by its field type(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Newly created object - public static TupleDescriptor Create() - => Create(typeof(T1), typeof(T2)); - - /// - /// Creates new by its field type(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Newly created object - public static TupleDescriptor Create() - => Create(typeof(T1), typeof(T2), typeof(T3)); - - /// - /// Creates new by its field type(s). - /// - /// Type of the first tuple field. - /// Type of the 2nd tuple field. - /// Type of the 3rd tuple field. - /// Type of the 4th tuple field. - /// Newly created object - public static TupleDescriptor Create() - => Create(typeof(T1), typeof(T2), typeof(T3), typeof(T4)); - - #endregion - - // Constructors - - private TupleDescriptor(Type[] fieldTypes) - { - FieldTypes = fieldTypes; - FieldCount = fieldTypes.Length; - FieldDescriptors = new PackedFieldDescriptor[FieldCount]; - - switch (FieldCount) { - case 0: - return; - case 1: - TupleLayout.ConfigureLen1(FieldTypes, - ref FieldDescriptors[0], - out ValuesLength, out ObjectsLength); - break; - case 2: - TupleLayout.ConfigureLen2(FieldTypes, - ref FieldDescriptors[0], ref FieldDescriptors[1], - out ValuesLength, out ObjectsLength); - break; - default: - TupleLayout.Configure(FieldTypes, FieldDescriptors, out ValuesLength, out ObjectsLength); - break; - } - - } - - public TupleDescriptor(SerializationInfo info, StreamingContext context) - { - FieldCount = info.GetInt32("FieldCount"); - ValuesLength = info.GetInt32("ValuesLength"); - ObjectsLength = info.GetInt32("ObjectsLength"); - - var typeNames = (string[]) info.GetValue("FieldTypes", typeof(string[])); - FieldDescriptors = (PackedFieldDescriptor[])info.GetValue( - "FieldDescriptors", typeof(PackedFieldDescriptor[])); - - FieldTypes = new Type[typeNames.Length]; - for (var i = 0; i < typeNames.Length; i++) { - FieldTypes[i] = typeNames[i].GetTypeFromSerializableForm(); - TupleLayout.ConfigureFieldAccessor(ref FieldDescriptors[i], FieldTypes[i]); - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.05.30 + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.Serialization; +using System.Text; +using Xtensive.Core; +using Xtensive.Linq.SerializableExpressions.Internals; +using Xtensive.Reflection; +using Xtensive.Tuples.Packed; + +namespace Xtensive.Tuples +{ + /// + /// Tuple descriptor. + /// Provides information about structure. + /// + [Serializable] + public sealed class TupleDescriptor : IEquatable, IReadOnlyList, ISerializable + { + private static readonly TupleDescriptor EmptyDescriptor = new TupleDescriptor(Array.Empty()); + + private readonly int FieldCount; + internal readonly int ValuesLength; + internal readonly int ObjectsLength; + + [NonSerialized] + internal readonly PackedFieldDescriptor[] FieldDescriptors; + + [field: NonSerialized] + private Type[] FieldTypes { get; } + + /// + /// Gets the empty tuple descriptor. + /// + /// The empty tuple descriptor. + public static TupleDescriptor Empty + { + [DebuggerStepThrough] + get => EmptyDescriptor; + } + + #region IList members + + /// + public Type this[int fieldIndex] + { + get => FieldTypes[fieldIndex]; + set => throw Exceptions.CollectionIsReadOnly(null); + } + + /// + public int Count + { + [DebuggerStepThrough] + get => FieldCount; + } + + /// + public IEnumerator GetEnumerator() + { + for (var index = 0; index < FieldCount; index++) { + yield return FieldTypes[index]; + } + } + + /// + [DebuggerStepThrough] + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + + #region IEquatable members, GetHashCode + + /// + public bool Equals(TupleDescriptor other) + { + if (ReferenceEquals(other, null)) + return false; + if (ReferenceEquals(other, this)) + return true; + if (FieldCount!=other.FieldCount) + return false; + for (int i = 0; i < FieldCount; i++) + if (FieldTypes[i]!=other.FieldTypes[i]) + return false; + return true; + } + + /// + public override bool Equals(object obj) + { + return Equals(obj as TupleDescriptor); + } + + /// + public override int GetHashCode() + { + int result = FieldCount; + for (int i = 0; i < FieldCount; i++) + result = unchecked (FieldTypes[i].GetHashCode() + 29 * result); + return result; + } + + public static bool operator ==(TupleDescriptor left, TupleDescriptor right) + { + if (ReferenceEquals(left, right)) + return true; + if (ReferenceEquals(left, null)) + return false; + return left.Equals(right); + } + + public static bool operator !=(TupleDescriptor left, TupleDescriptor right) + { + return !(left==right); + } + + #endregion + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("FieldCount", FieldCount); + info.AddValue("ValuesLength", ValuesLength); + info.AddValue("ObjectsLength", ObjectsLength); + + var typeNames = new string[FieldTypes.Length]; + for (var i = 0; i < typeNames.Length; i++) + typeNames[i] = FieldTypes[i].ToSerializableForm(); + + info.AddValue("FieldTypes", typeNames); + info.AddValue("FieldDescriptors", FieldDescriptors); + } + + /// + public override string ToString() + { + var sb = new StringBuilder(); + for (int i = 0; i < FieldCount; i++) { + if (i > 0) + sb.Append(", "); + sb.Append(FieldTypes[i].GetShortName()); + } + return string.Format(Strings.TupleDescriptorFormat, sb); + } + + #region Create methods (base) + + public static TupleDescriptor Create(Type t1) + { + return new TupleDescriptor(new [] {t1}); + } + + public static TupleDescriptor Create(Type t1, Type t2) + { + return new TupleDescriptor(new [] {t1, t2}); + } + + public static TupleDescriptor Create(Type t1, Type t2, Type t3) + { + return new TupleDescriptor(new [] {t1, t2, t3}); + } + + public static TupleDescriptor Create(Type t1, Type t2, Type t3, Type t4) + { + return new TupleDescriptor(new [] {t1, t2, t3, t4}); + } + + /// + /// Creates or returns already created descriptor + /// for provided set of types. + /// + /// List of tuple field types. + /// Either new or existing tuple descriptor + /// describing the specified set of fields. + public static TupleDescriptor Create(Type[] fieldTypes) + { + ArgumentValidator.EnsureArgumentNotNull(fieldTypes, nameof(fieldTypes)); + if (fieldTypes.Length == 0) { + return EmptyDescriptor; + } + return new TupleDescriptor(fieldTypes); + } + + /// + /// Creates tuple descriptor containing head of the current one. + /// + /// Head field count. + /// Either new or existing tuple descriptor + /// describing the specified set of fields. + public TupleDescriptor Head(int fieldCount) + { + ArgumentValidator.EnsureArgumentIsInRange(fieldCount, 1, Count, nameof(fieldCount)); + var fieldTypes = new Type[fieldCount]; + Array.Copy(FieldTypes, 0, fieldTypes, 0, fieldCount); + return new TupleDescriptor(fieldTypes); + } + + /// + /// Creates tuple descriptor containing tail of the current one. + /// + /// Tail field count. + /// Either new or existing tuple descriptor + /// describing the specified set of fields. + public TupleDescriptor Tail(int tailFieldCount) + { + ArgumentValidator.EnsureArgumentIsInRange(tailFieldCount, 1, Count, nameof(tailFieldCount)); + var fieldTypes = new Type[tailFieldCount]; + Array.Copy(FieldTypes, Count - tailFieldCount, fieldTypes, 0, tailFieldCount); + return new TupleDescriptor(fieldTypes); + } + + #endregion + + #region Create<...> methods (generic shortcuts) + + /// + /// Creates new by its field type(s). + /// + /// Type of the only tuple field. + /// Newly created object. + public static TupleDescriptor Create() + => Create(typeof(T)); + + /// + /// Creates new by its field type(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Newly created object + public static TupleDescriptor Create() + => Create(typeof(T1), typeof(T2)); + + /// + /// Creates new by its field type(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Newly created object + public static TupleDescriptor Create() + => Create(typeof(T1), typeof(T2), typeof(T3)); + + /// + /// Creates new by its field type(s). + /// + /// Type of the first tuple field. + /// Type of the 2nd tuple field. + /// Type of the 3rd tuple field. + /// Type of the 4th tuple field. + /// Newly created object + public static TupleDescriptor Create() + => Create(typeof(T1), typeof(T2), typeof(T3), typeof(T4)); + + #endregion + + // Constructors + + private TupleDescriptor(Type[] fieldTypes) + { + FieldTypes = fieldTypes; + FieldCount = fieldTypes.Length; + FieldDescriptors = new PackedFieldDescriptor[FieldCount]; + + switch (FieldCount) { + case 0: + return; + case 1: + TupleLayout.ConfigureLen1(FieldTypes, + ref FieldDescriptors[0], + out ValuesLength, out ObjectsLength); + break; + case 2: + TupleLayout.ConfigureLen2(FieldTypes, + ref FieldDescriptors[0], ref FieldDescriptors[1], + out ValuesLength, out ObjectsLength); + break; + default: + TupleLayout.Configure(FieldTypes, FieldDescriptors, out ValuesLength, out ObjectsLength); + break; + } + + } + + public TupleDescriptor(SerializationInfo info, StreamingContext context) + { + FieldCount = info.GetInt32("FieldCount"); + ValuesLength = info.GetInt32("ValuesLength"); + ObjectsLength = info.GetInt32("ObjectsLength"); + + var typeNames = (string[]) info.GetValue("FieldTypes", typeof(string[])); + FieldDescriptors = (PackedFieldDescriptor[])info.GetValue( + "FieldDescriptors", typeof(PackedFieldDescriptor[])); + + FieldTypes = new Type[typeNames.Length]; + for (var i = 0; i < typeNames.Length; i++) { + FieldTypes[i] = typeNames[i].GetTypeFromSerializableForm(); + TupleLayout.ConfigureFieldAccessor(ref FieldDescriptors[i], FieldTypes[i]); + } + } + } +} diff --git a/Orm/Xtensive.Orm/Tuples/TupleExtensions.cs b/Orm/Xtensive.Orm/Tuples/TupleExtensions.cs index 37937fdfa4..68d0aa0d47 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleExtensions.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleExtensions.cs @@ -1,557 +1,557 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alex Yakunin -// Created: 2008.05.31 - -using System; -using System.Collections; -using System.Collections.Generic; -using Xtensive.Collections; -using Xtensive.Core; - -using Xtensive.Tuples.Packed; -using Xtensive.Tuples.Transform; - -namespace Xtensive.Tuples -{ - /// - /// Various extension methods for and types. - /// - public static class TupleExtensions - { - #region Copy methods - - /// - /// Copies a range of elements from - /// starting at the specified source index - /// and pastes them to - /// starting at the specified target index. - /// - /// Source tuple to copy. - /// Tuple that receives the data. - /// The index in the tuple at which copying begins. - /// The index in the tuple at which copying begins. - /// The number of elements to copy. - public static void CopyTo(this Tuple source, Tuple target, int startIndex, int targetStartIndex, int length) - { - var packedSource = source as PackedTuple; - var packedTarget = target as PackedTuple; - - if (packedSource!=null && packedTarget!=null) - PartiallyCopyTupleFast(packedSource, packedTarget, startIndex, targetStartIndex, length); - else - PartiallyCopyTupleSlow(source, target, startIndex, targetStartIndex, length); - } - - /// - /// Copies a range of elements from - /// starting at the specified source index - /// and pastes them to - /// starting at the first element. - /// - /// Source tuple to copy. - /// Tuple that receives the data. - /// The index in the tuple at which copying begins. - /// The number of elements to copy. - public static void CopyTo(this Tuple source, Tuple target, int startIndex, int length) - { - source.CopyTo(target, startIndex, 0, length); - } - - /// - /// Copies a range of elements from - /// starting at the - /// and pastes them into - /// starting at the first element. - /// - /// Source tuple to copy. - /// Tuple that receives the data. - /// The index in the tuple at which copying begins. - public static void CopyTo(this Tuple source, Tuple target, int startIndex) - { - source.CopyTo(target, startIndex, 0, source.Count - startIndex); - } - - /// - /// Copies all the elements from - /// starting at the first element - /// and pastes them into - /// starting at the first element. - /// - /// Source tuple to copy. - /// Tuple that receives the data. - public static void CopyTo(this Tuple source, Tuple target) - { - source.CopyTo(target, 0, 0, source.Count); - } - - /// - /// Copies a set of elements from - /// to using - /// specified target-to-source field index . - /// - /// Source tuple to copy. - /// Tuple that receives the data. - /// Target-to-source field index map. - /// Negative value in this map means "skip this element". - public static void CopyTo(this Tuple source, Tuple target, IReadOnlyList map) - { - var packedSource = source as PackedTuple; - var packedTarget = target as PackedTuple; - - if (packedSource!=null && packedTarget!=null) - CopyTupleWithMappingFast(packedSource, packedTarget, map); - else - CopyTupleWithMappingSlow(source, target, map); - } - - /// - /// Copies a set of elements from s - /// to using - /// specified target-to-source field index . - /// - /// Source tuples to copy. - /// Tuple that receives the data. - /// Target-to-source field index map. - /// Negative value in this map means "skip this element". - public static void CopyTo(this Tuple[] sources, Tuple target, Pair[] map) - { - var haveSlowSource = false; - var packedSources = new PackedTuple[sources.Length]; - - for (int i = 0; i < sources.Length; i++) { - var packedSource = sources[i] as PackedTuple; - if (packedSource==null) { - haveSlowSource = true; - break; - } - packedSources[i] = packedSource; - } - - if (!haveSlowSource) { - var packedTarget = target as PackedTuple; - if (packedTarget!=null) { - CopyTupleArrayWithMappingFast(packedSources, packedTarget, map); - return; - } - } - - CopyTupleArrayWithMappingSlow(sources, target, map); - } - - /// - /// Copies a set of elements from s - /// to using - /// specified target-to-source field index . - /// - /// Source tuples to copy. - /// Tuple that receives the data. - /// Target-to-source field index map. - /// Negative value in this map means "skip this element". - public static void CopyTo(this FixedList3 sources, Tuple target, Pair[] map) - { - var haveSlowSource = false; - var packedSources = new FixedList3(); - - for (int i = 0; i < sources.Count; i++) { - var packedSource = sources[i] as PackedTuple; - if (packedSource==null) { - haveSlowSource = true; - break; - } - packedSources.Push(packedSource); - } - - if (!haveSlowSource) { - var packedTarget = target as PackedTuple; - if (packedTarget!=null) { - Copy3TuplesWithMappingFast(packedSources, packedTarget, map); - return; - } - } - - Copy3TuplesWithMappingSlow(sources, target, map); - } - - #endregion - - #region Transforms - - /// - /// Combines the with . - /// - /// The first to combine. - /// The second to combine. - /// - public static Tuple Combine(this Tuple left, Tuple right) - { - var transform = new CombineTransform(false, new[] {left.Descriptor, right.Descriptor}); - return transform.Apply(TupleTransformType.TransformedTuple, left, right); - } - - /// - /// Cuts out from . - /// - /// The to get segment from. - /// The to cut off. - /// - public static Tuple GetSegment(this Tuple tuple, in Segment segment) - { - var length = segment.Length; - var map = new int[length]; - var fieldTypes = new Type[length]; - for (var index = 0; index < map.Length; index++) { - var sourceIndex = segment.Offset + index; - map[index] = sourceIndex; - fieldTypes[index] = tuple.Descriptor[sourceIndex]; - } - var descriptor = TupleDescriptor.Create(fieldTypes); - var transform = new MapTransform(false, descriptor, map); - return transform.Apply(TupleTransformType.TransformedTuple, tuple); - } - - #endregion - - #region Merge methods - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the specified - /// . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - /// The index in the tuple at which merging begins. - /// The number of elements to process. - /// The merge behavior that will be used to resolve conflicts when both values - /// from and are available. - /// Tuple descriptors mismatch. - public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, int length, MergeBehavior behavior) - { - if (difference==null) - return; - if (origin.Descriptor!=difference.Descriptor) - throw new ArgumentException(string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, origin.Descriptor), "difference"); - - var packedOrigin = origin as PackedTuple; - var packedDifference = difference as PackedTuple; - var useFast = packedOrigin!=null && packedDifference!=null; - - switch (behavior) { - case MergeBehavior.PreferOrigin: - if (useFast) - MergeTuplesPreferOriginFast(packedOrigin, packedDifference, startIndex, length); - else - MergeTuplesPreferOriginSlow(origin, difference, startIndex, length); - break; - case MergeBehavior.PreferDifference: - if (useFast) - PartiallyCopyTupleFast(packedDifference, packedOrigin, startIndex, startIndex, length); - else - PartiallyCopyTupleSlow(difference, origin, startIndex, startIndex, length); - break; - default: - throw new ArgumentOutOfRangeException("behavior"); - } - } - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the default . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - /// The index in the tuple at which merging begins. - /// The number of elements to process. - public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, int length) - { - MergeWith(origin, difference, startIndex, length, MergeBehavior.Default); - } - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the specified - /// . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - /// The index in the tuple at which merging begins. - /// The merge behavior that will be used to resolve conflicts when both values - /// from and are available. - public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, MergeBehavior behavior) - { - MergeWith(origin, difference, startIndex, origin.Count, behavior); - } - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the default value of . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - /// The index in the tuple at which merging begins. - public static void MergeWith(this Tuple origin, Tuple difference, int startIndex) - { - MergeWith(origin, difference, startIndex, origin.Count, MergeBehavior.Default); - } - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the default value of . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - /// The merge behavior that will be used to resolve conflicts when both values - /// from and are available. - public static void MergeWith(this Tuple origin, Tuple difference, MergeBehavior behavior) - { - MergeWith(origin, difference, 0, origin.Count, behavior); - } - - /// - /// Merges a range of fields from - /// starting at the specified index with the fields from - /// with the default value of . - /// - /// Tuple containing original values and receiving the data. - /// Tuple with differences to merge with. - public static void MergeWith(this Tuple origin, Tuple difference) - { - MergeWith(origin, difference, 0, origin.Count, MergeBehavior.Default); - } - - #endregion - - #region ToXxx methods - - /// - /// Creates instance "filled" with the same field values - /// as the specified tuple. - /// - /// The tuple to clone as . - /// A new instance of with the same field values - /// as the specified tuple. - public static RegularTuple ToRegular(this Tuple source) - { - if (source==null) - return null; - var result = Tuple.Create(source.Descriptor); - source.CopyTo(result); - return result; - } - - /// - /// Converts tuple to read-only one. - /// - /// The tuple to convert to read-only. - /// The type of transformation to perform. - /// Read-only version of tuple. - public static Tuple ToReadOnly(this Tuple source, TupleTransformType transformType) - { - if (source==null) - return null; - return ReadOnlyTransform.Instance.Apply(transformType, source); - } - - /// - /// Converts tuple to fast read-only one. - /// - /// The tuple to convert to fast read-only. - /// Fast read-only version of tuple. - public static Tuple ToFastReadOnly(this Tuple source) - { - if (source==null) - return null; - if (source.GetType()==typeof (FastReadOnlyTuple)) - return source; - return new FastReadOnlyTuple(source); - } - - #endregion - - /// - /// Gets the field state map of the specified . - /// - /// The to inspect. - /// The state to compare with. - /// Newly created instance which holds inspection result. - public static BitArray GetFieldStateMap(this Tuple target, TupleFieldState requestedState) - { - var count = target.Descriptor.Count; - var result = new BitArray(count); - - switch (requestedState) { - case TupleFieldState.Default: - for (int i = 0; i < count; i++) - result[i] = target.GetFieldState(i)==0; - break; - default: - for (int i = 0; i < count; i++) - result[i] = (requestedState & target.GetFieldState(i)) != 0; - break; - } - return result; - } - - /// - /// Initializes the specified with default values. - /// - /// Tuple to initialize. - /// instance that flags that field should have null value. - /// Tuple descriptor field count is not equal to count. - public static void Initialize(this Tuple target, BitArray nullableMap) - { - var descriptor = target.Descriptor; - if (descriptor.Count!=nullableMap.Count) - throw new ArgumentException(String.Format(Strings.ExInvalidFieldMapSizeExpectedX, descriptor.Count)); - - for (int i = 0; i < target.Count; i++) { - if (nullableMap[i]) - target.SetFieldState(i, TupleFieldState.Available | TupleFieldState.Null); - else { - var fieldType = descriptor[i]; - if (fieldType.IsValueType) - target.SetValue(i, Activator.CreateInstance(fieldType)); - else - target.SetFieldState(i, TupleFieldState.Available); - } - } - } - - private static void CopyValue(Tuple source, int sourceIndex, Tuple target, int targetIndex) - { - TupleFieldState fieldState; - var value = source.GetValue(sourceIndex, out fieldState); - if (!fieldState.IsAvailable()) - return; - target.SetValue(targetIndex, fieldState.IsAvailableAndNull() ? null : value); - } - - private static void CopyPackedValue(PackedTuple source, int sourceIndex, PackedTuple target, int targetIndex) - { - ref var sourceDescriptor = ref source.PackedDescriptor.FieldDescriptors[sourceIndex]; - ref var targetDescriptor = ref target.PackedDescriptor.FieldDescriptors[targetIndex]; - - var fieldState = source.GetFieldState(ref sourceDescriptor); - if (!fieldState.IsAvailable()) { - return; - } - - if (fieldState.IsAvailableAndNull()) { - target.SetValue(targetIndex, null); - return; - } - - var accessor = sourceDescriptor.Accessor; - if (accessor != targetDescriptor.Accessor) { - throw new InvalidOperationException(string.Format( - Strings.ExInvalidCast, - source.PackedDescriptor[sourceIndex], - target.PackedDescriptor[targetIndex])); - } - - target.SetFieldState(targetIndex, TupleFieldState.Available); - accessor.CopyValue(source, ref sourceDescriptor, target, ref targetDescriptor); - } - - private static void PartiallyCopyTupleSlow(Tuple source, Tuple target, int sourceStartIndex, int targetStartIndex, int length) - { - for (int i = 0; i < length; i++) - CopyValue(source, sourceStartIndex + i, target, targetStartIndex + i); - } - - private static void PartiallyCopyTupleFast(PackedTuple source, PackedTuple target, int sourceStartIndex, int targetStartIndex, int length) - { - for (int i = 0; i < length; i++) - CopyPackedValue(source, sourceStartIndex + i, target, targetStartIndex + i); - } - - private static void CopyTupleWithMappingSlow(Tuple source, Tuple target, IReadOnlyList map) - { - for (int targetIndex = 0; targetIndex < map.Count; targetIndex++) { - var sourceIndex = map[targetIndex]; - if (sourceIndex >= 0) - CopyValue(source, sourceIndex, target, targetIndex); - } - } - - private static void CopyTupleWithMappingFast(PackedTuple source, PackedTuple target, IReadOnlyList map) - { - for (int targetIndex = 0; targetIndex < map.Count; targetIndex++) { - var sourceIndex = map[targetIndex]; - if (sourceIndex >= 0) - CopyPackedValue(source, sourceIndex, target, targetIndex); - } - } - - private static void CopyTupleArrayWithMappingSlow(Tuple[] sources, Tuple target, Pair[] map) - { - for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { - var sourceInfo = map[targetIndex]; - var sourceTupleIndex = sourceInfo.First; - var sourceFieldIndex = sourceInfo.Second; - if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) - CopyValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); - } - } - - private static void CopyTupleArrayWithMappingFast(PackedTuple[] sources, PackedTuple target, Pair[] map) - { - for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { - var sourceInfo = map[targetIndex]; - var sourceTupleIndex = sourceInfo.First; - var sourceFieldIndex = sourceInfo.Second; - if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) - CopyPackedValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); - } - } - - private static void Copy3TuplesWithMappingSlow(FixedList3 sources, Tuple target, Pair[] map) - { - for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { - var sourceInfo = map[targetIndex]; - var sourceTupleIndex = sourceInfo.First; - var sourceFieldIndex = sourceInfo.Second; - if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) - CopyValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); - } - } - - private static void Copy3TuplesWithMappingFast(FixedList3 sources, PackedTuple target, Pair[] map) - { - for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { - var sourceInfo = map[targetIndex]; - var sourceTupleIndex = sourceInfo.First; - var sourceFieldIndex = sourceInfo.Second; - if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) - CopyPackedValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); - } - } - - private static void MergeTuplesPreferOriginSlow(Tuple origin, Tuple difference, int startIndex, int length) - { - var bound = startIndex + length; - for (int index = startIndex; index < bound; index++) { - TupleFieldState fieldState; - if (!origin.GetFieldState(index).IsAvailable()) - CopyValue(difference, index, origin, index); - } - } - - private static void MergeTuplesPreferOriginFast(PackedTuple origin, PackedTuple difference, int startIndex, int length) - { - var bound = startIndex + length; - for (int index = startIndex; index < bound; index++) { - TupleFieldState fieldState; - if (!origin.GetFieldState(index).IsAvailable()) - CopyPackedValue(difference, index, origin, index); - } - } - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alex Yakunin +// Created: 2008.05.31 + +using System; +using System.Collections; +using System.Collections.Generic; +using Xtensive.Collections; +using Xtensive.Core; + +using Xtensive.Tuples.Packed; +using Xtensive.Tuples.Transform; + +namespace Xtensive.Tuples +{ + /// + /// Various extension methods for and types. + /// + public static class TupleExtensions + { + #region Copy methods + + /// + /// Copies a range of elements from + /// starting at the specified source index + /// and pastes them to + /// starting at the specified target index. + /// + /// Source tuple to copy. + /// Tuple that receives the data. + /// The index in the tuple at which copying begins. + /// The index in the tuple at which copying begins. + /// The number of elements to copy. + public static void CopyTo(this Tuple source, Tuple target, int startIndex, int targetStartIndex, int length) + { + var packedSource = source as PackedTuple; + var packedTarget = target as PackedTuple; + + if (packedSource!=null && packedTarget!=null) + PartiallyCopyTupleFast(packedSource, packedTarget, startIndex, targetStartIndex, length); + else + PartiallyCopyTupleSlow(source, target, startIndex, targetStartIndex, length); + } + + /// + /// Copies a range of elements from + /// starting at the specified source index + /// and pastes them to + /// starting at the first element. + /// + /// Source tuple to copy. + /// Tuple that receives the data. + /// The index in the tuple at which copying begins. + /// The number of elements to copy. + public static void CopyTo(this Tuple source, Tuple target, int startIndex, int length) + { + source.CopyTo(target, startIndex, 0, length); + } + + /// + /// Copies a range of elements from + /// starting at the + /// and pastes them into + /// starting at the first element. + /// + /// Source tuple to copy. + /// Tuple that receives the data. + /// The index in the tuple at which copying begins. + public static void CopyTo(this Tuple source, Tuple target, int startIndex) + { + source.CopyTo(target, startIndex, 0, source.Count - startIndex); + } + + /// + /// Copies all the elements from + /// starting at the first element + /// and pastes them into + /// starting at the first element. + /// + /// Source tuple to copy. + /// Tuple that receives the data. + public static void CopyTo(this Tuple source, Tuple target) + { + source.CopyTo(target, 0, 0, source.Count); + } + + /// + /// Copies a set of elements from + /// to using + /// specified target-to-source field index . + /// + /// Source tuple to copy. + /// Tuple that receives the data. + /// Target-to-source field index map. + /// Negative value in this map means "skip this element". + public static void CopyTo(this Tuple source, Tuple target, IReadOnlyList map) + { + var packedSource = source as PackedTuple; + var packedTarget = target as PackedTuple; + + if (packedSource!=null && packedTarget!=null) + CopyTupleWithMappingFast(packedSource, packedTarget, map); + else + CopyTupleWithMappingSlow(source, target, map); + } + + /// + /// Copies a set of elements from s + /// to using + /// specified target-to-source field index . + /// + /// Source tuples to copy. + /// Tuple that receives the data. + /// Target-to-source field index map. + /// Negative value in this map means "skip this element". + public static void CopyTo(this Tuple[] sources, Tuple target, Pair[] map) + { + var haveSlowSource = false; + var packedSources = new PackedTuple[sources.Length]; + + for (int i = 0; i < sources.Length; i++) { + var packedSource = sources[i] as PackedTuple; + if (packedSource==null) { + haveSlowSource = true; + break; + } + packedSources[i] = packedSource; + } + + if (!haveSlowSource) { + var packedTarget = target as PackedTuple; + if (packedTarget!=null) { + CopyTupleArrayWithMappingFast(packedSources, packedTarget, map); + return; + } + } + + CopyTupleArrayWithMappingSlow(sources, target, map); + } + + /// + /// Copies a set of elements from s + /// to using + /// specified target-to-source field index . + /// + /// Source tuples to copy. + /// Tuple that receives the data. + /// Target-to-source field index map. + /// Negative value in this map means "skip this element". + public static void CopyTo(this FixedList3 sources, Tuple target, Pair[] map) + { + var haveSlowSource = false; + var packedSources = new FixedList3(); + + for (int i = 0; i < sources.Count; i++) { + var packedSource = sources[i] as PackedTuple; + if (packedSource==null) { + haveSlowSource = true; + break; + } + packedSources.Push(packedSource); + } + + if (!haveSlowSource) { + var packedTarget = target as PackedTuple; + if (packedTarget!=null) { + Copy3TuplesWithMappingFast(packedSources, packedTarget, map); + return; + } + } + + Copy3TuplesWithMappingSlow(sources, target, map); + } + + #endregion + + #region Transforms + + /// + /// Combines the with . + /// + /// The first to combine. + /// The second to combine. + /// + public static Tuple Combine(this Tuple left, Tuple right) + { + var transform = new CombineTransform(false, new[] {left.Descriptor, right.Descriptor}); + return transform.Apply(TupleTransformType.TransformedTuple, left, right); + } + + /// + /// Cuts out from . + /// + /// The to get segment from. + /// The to cut off. + /// + public static Tuple GetSegment(this Tuple tuple, in Segment segment) + { + var length = segment.Length; + var map = new int[length]; + var fieldTypes = new Type[length]; + for (var index = 0; index < map.Length; index++) { + var sourceIndex = segment.Offset + index; + map[index] = sourceIndex; + fieldTypes[index] = tuple.Descriptor[sourceIndex]; + } + var descriptor = TupleDescriptor.Create(fieldTypes); + var transform = new MapTransform(false, descriptor, map); + return transform.Apply(TupleTransformType.TransformedTuple, tuple); + } + + #endregion + + #region Merge methods + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the specified + /// . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + /// The index in the tuple at which merging begins. + /// The number of elements to process. + /// The merge behavior that will be used to resolve conflicts when both values + /// from and are available. + /// Tuple descriptors mismatch. + public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, int length, MergeBehavior behavior) + { + if (difference==null) + return; + if (origin.Descriptor!=difference.Descriptor) + throw new ArgumentException(string.Format(Strings.ExInvalidTupleDescriptorExpectedDescriptorIs, origin.Descriptor), "difference"); + + var packedOrigin = origin as PackedTuple; + var packedDifference = difference as PackedTuple; + var useFast = packedOrigin!=null && packedDifference!=null; + + switch (behavior) { + case MergeBehavior.PreferOrigin: + if (useFast) + MergeTuplesPreferOriginFast(packedOrigin, packedDifference, startIndex, length); + else + MergeTuplesPreferOriginSlow(origin, difference, startIndex, length); + break; + case MergeBehavior.PreferDifference: + if (useFast) + PartiallyCopyTupleFast(packedDifference, packedOrigin, startIndex, startIndex, length); + else + PartiallyCopyTupleSlow(difference, origin, startIndex, startIndex, length); + break; + default: + throw new ArgumentOutOfRangeException("behavior"); + } + } + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the default . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + /// The index in the tuple at which merging begins. + /// The number of elements to process. + public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, int length) + { + MergeWith(origin, difference, startIndex, length, MergeBehavior.Default); + } + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the specified + /// . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + /// The index in the tuple at which merging begins. + /// The merge behavior that will be used to resolve conflicts when both values + /// from and are available. + public static void MergeWith(this Tuple origin, Tuple difference, int startIndex, MergeBehavior behavior) + { + MergeWith(origin, difference, startIndex, origin.Count, behavior); + } + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the default value of . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + /// The index in the tuple at which merging begins. + public static void MergeWith(this Tuple origin, Tuple difference, int startIndex) + { + MergeWith(origin, difference, startIndex, origin.Count, MergeBehavior.Default); + } + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the default value of . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + /// The merge behavior that will be used to resolve conflicts when both values + /// from and are available. + public static void MergeWith(this Tuple origin, Tuple difference, MergeBehavior behavior) + { + MergeWith(origin, difference, 0, origin.Count, behavior); + } + + /// + /// Merges a range of fields from + /// starting at the specified index with the fields from + /// with the default value of . + /// + /// Tuple containing original values and receiving the data. + /// Tuple with differences to merge with. + public static void MergeWith(this Tuple origin, Tuple difference) + { + MergeWith(origin, difference, 0, origin.Count, MergeBehavior.Default); + } + + #endregion + + #region ToXxx methods + + /// + /// Creates instance "filled" with the same field values + /// as the specified tuple. + /// + /// The tuple to clone as . + /// A new instance of with the same field values + /// as the specified tuple. + public static RegularTuple ToRegular(this Tuple source) + { + if (source==null) + return null; + var result = Tuple.Create(source.Descriptor); + source.CopyTo(result); + return result; + } + + /// + /// Converts tuple to read-only one. + /// + /// The tuple to convert to read-only. + /// The type of transformation to perform. + /// Read-only version of tuple. + public static Tuple ToReadOnly(this Tuple source, TupleTransformType transformType) + { + if (source==null) + return null; + return ReadOnlyTransform.Instance.Apply(transformType, source); + } + + /// + /// Converts tuple to fast read-only one. + /// + /// The tuple to convert to fast read-only. + /// Fast read-only version of tuple. + public static Tuple ToFastReadOnly(this Tuple source) + { + if (source==null) + return null; + if (source.GetType()==typeof (FastReadOnlyTuple)) + return source; + return new FastReadOnlyTuple(source); + } + + #endregion + + /// + /// Gets the field state map of the specified . + /// + /// The to inspect. + /// The state to compare with. + /// Newly created instance which holds inspection result. + public static BitArray GetFieldStateMap(this Tuple target, TupleFieldState requestedState) + { + var count = target.Descriptor.Count; + var result = new BitArray(count); + + switch (requestedState) { + case TupleFieldState.Default: + for (int i = 0; i < count; i++) + result[i] = target.GetFieldState(i)==0; + break; + default: + for (int i = 0; i < count; i++) + result[i] = (requestedState & target.GetFieldState(i)) != 0; + break; + } + return result; + } + + /// + /// Initializes the specified with default values. + /// + /// Tuple to initialize. + /// instance that flags that field should have null value. + /// Tuple descriptor field count is not equal to count. + public static void Initialize(this Tuple target, BitArray nullableMap) + { + var descriptor = target.Descriptor; + if (descriptor.Count!=nullableMap.Count) + throw new ArgumentException(String.Format(Strings.ExInvalidFieldMapSizeExpectedX, descriptor.Count)); + + for (int i = 0; i < target.Count; i++) { + if (nullableMap[i]) + target.SetFieldState(i, TupleFieldState.Available | TupleFieldState.Null); + else { + var fieldType = descriptor[i]; + if (fieldType.IsValueType) + target.SetValue(i, Activator.CreateInstance(fieldType)); + else + target.SetFieldState(i, TupleFieldState.Available); + } + } + } + + private static void CopyValue(Tuple source, int sourceIndex, Tuple target, int targetIndex) + { + TupleFieldState fieldState; + var value = source.GetValue(sourceIndex, out fieldState); + if (!fieldState.IsAvailable()) + return; + target.SetValue(targetIndex, fieldState.IsAvailableAndNull() ? null : value); + } + + private static void CopyPackedValue(PackedTuple source, int sourceIndex, PackedTuple target, int targetIndex) + { + ref var sourceDescriptor = ref source.PackedDescriptor.FieldDescriptors[sourceIndex]; + ref var targetDescriptor = ref target.PackedDescriptor.FieldDescriptors[targetIndex]; + + var fieldState = source.GetFieldState(ref sourceDescriptor); + if (!fieldState.IsAvailable()) { + return; + } + + if (fieldState.IsAvailableAndNull()) { + target.SetValue(targetIndex, null); + return; + } + + var accessor = sourceDescriptor.Accessor; + if (accessor != targetDescriptor.Accessor) { + throw new InvalidOperationException(string.Format( + Strings.ExInvalidCast, + source.PackedDescriptor[sourceIndex], + target.PackedDescriptor[targetIndex])); + } + + target.SetFieldState(targetIndex, TupleFieldState.Available); + accessor.CopyValue(source, ref sourceDescriptor, target, ref targetDescriptor); + } + + private static void PartiallyCopyTupleSlow(Tuple source, Tuple target, int sourceStartIndex, int targetStartIndex, int length) + { + for (int i = 0; i < length; i++) + CopyValue(source, sourceStartIndex + i, target, targetStartIndex + i); + } + + private static void PartiallyCopyTupleFast(PackedTuple source, PackedTuple target, int sourceStartIndex, int targetStartIndex, int length) + { + for (int i = 0; i < length; i++) + CopyPackedValue(source, sourceStartIndex + i, target, targetStartIndex + i); + } + + private static void CopyTupleWithMappingSlow(Tuple source, Tuple target, IReadOnlyList map) + { + for (int targetIndex = 0; targetIndex < map.Count; targetIndex++) { + var sourceIndex = map[targetIndex]; + if (sourceIndex >= 0) + CopyValue(source, sourceIndex, target, targetIndex); + } + } + + private static void CopyTupleWithMappingFast(PackedTuple source, PackedTuple target, IReadOnlyList map) + { + for (int targetIndex = 0; targetIndex < map.Count; targetIndex++) { + var sourceIndex = map[targetIndex]; + if (sourceIndex >= 0) + CopyPackedValue(source, sourceIndex, target, targetIndex); + } + } + + private static void CopyTupleArrayWithMappingSlow(Tuple[] sources, Tuple target, Pair[] map) + { + for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { + var sourceInfo = map[targetIndex]; + var sourceTupleIndex = sourceInfo.First; + var sourceFieldIndex = sourceInfo.Second; + if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) + CopyValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); + } + } + + private static void CopyTupleArrayWithMappingFast(PackedTuple[] sources, PackedTuple target, Pair[] map) + { + for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { + var sourceInfo = map[targetIndex]; + var sourceTupleIndex = sourceInfo.First; + var sourceFieldIndex = sourceInfo.Second; + if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) + CopyPackedValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); + } + } + + private static void Copy3TuplesWithMappingSlow(FixedList3 sources, Tuple target, Pair[] map) + { + for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { + var sourceInfo = map[targetIndex]; + var sourceTupleIndex = sourceInfo.First; + var sourceFieldIndex = sourceInfo.Second; + if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) + CopyValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); + } + } + + private static void Copy3TuplesWithMappingFast(FixedList3 sources, PackedTuple target, Pair[] map) + { + for (int targetIndex = 0; targetIndex < map.Length; targetIndex++) { + var sourceInfo = map[targetIndex]; + var sourceTupleIndex = sourceInfo.First; + var sourceFieldIndex = sourceInfo.Second; + if (sourceTupleIndex >= 0 && sourceFieldIndex >= 0) + CopyPackedValue(sources[sourceTupleIndex], sourceFieldIndex, target, targetIndex); + } + } + + private static void MergeTuplesPreferOriginSlow(Tuple origin, Tuple difference, int startIndex, int length) + { + var bound = startIndex + length; + for (int index = startIndex; index < bound; index++) { + TupleFieldState fieldState; + if (!origin.GetFieldState(index).IsAvailable()) + CopyValue(difference, index, origin, index); + } + } + + private static void MergeTuplesPreferOriginFast(PackedTuple origin, PackedTuple difference, int startIndex, int length) + { + var bound = startIndex + length; + for (int index = startIndex; index < bound; index++) { + TupleFieldState fieldState; + if (!origin.GetFieldState(index).IsAvailable()) + CopyPackedValue(difference, index, origin, index); + } + } + } +} diff --git a/Orm/Xtensive.Orm/Tuples/TupleFieldState.cs b/Orm/Xtensive.Orm/Tuples/TupleFieldState.cs index 05f0b5ea0a..2839d9ef42 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleFieldState.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleFieldState.cs @@ -1,33 +1,33 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Nick Svetlov -// Created: 2007.06.18 - -using System; - -namespace Xtensive.Tuples -{ - /// - /// Defines field state that can be set or get for each field in . - /// - [Flags] - public enum TupleFieldState - { - /// - /// Default value - /// - Default = 0x0, - - /// - /// Field value is available in tuple. - /// - Available = 0x01, - - /// - /// Field has null value. - /// Used with both nullable and non-nullable fields. - /// - Null = 0x02, - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Nick Svetlov +// Created: 2007.06.18 + +using System; + +namespace Xtensive.Tuples +{ + /// + /// Defines field state that can be set or get for each field in . + /// + [Flags] + public enum TupleFieldState + { + /// + /// Default value + /// + Default = 0x0, + + /// + /// Field value is available in tuple. + /// + Available = 0x01, + + /// + /// Field has null value. + /// Used with both nullable and non-nullable fields. + /// + Null = 0x02, + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/TupleFieldStateExtensions.cs b/Orm/Xtensive.Orm/Tuples/TupleFieldStateExtensions.cs index aa5f831858..43c5a3c1da 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleFieldStateExtensions.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleFieldStateExtensions.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexis Kochetov -// Created: 2009.09.17 - -using System; -using Xtensive.Tuples; - -using Tuple = Xtensive.Tuples.Tuple; - -namespace Xtensive.Tuples -{ - /// - /// Extension methods for . - /// - public static class TupleFieldStateExtensions - { - /// - /// Checks if specified field state has flag. - /// - /// to check. - /// if field state value has flag; otherwise, . - public static bool IsAvailable(this TupleFieldState fieldState) - { - return (fieldState & TupleFieldState.Available) != 0; - } - - /// - /// Checks if specified field state has flag. - /// - /// to check. - /// if field state value has flag; otherwise, . - /// Field value is not available. - public static bool IsNull(this TupleFieldState fieldState) - { - if ((fieldState & TupleFieldState.Available) == 0) - throw new InvalidOperationException(Strings.ExValueIsNotAvailable); - return (fieldState & TupleFieldState.Null) == TupleFieldState.Null; - } - - /// - /// Checks if specified field state has both and flags. - /// - /// to check. - /// if field state value has both and flags; otherwise, . - public static bool IsAvailableAndNull(this TupleFieldState fieldState) - { - return fieldState == (TupleFieldState.Available | TupleFieldState.Null); - } - - /// - /// Checks if specified field state has flag and has no flag. - /// - /// to check. - /// if field state value is equal to ; - /// otherwise, . - public static bool HasValue(this TupleFieldState fieldState) - { - return fieldState == TupleFieldState.Available; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexis Kochetov +// Created: 2009.09.17 + +using System; +using Xtensive.Tuples; + +using Tuple = Xtensive.Tuples.Tuple; + +namespace Xtensive.Tuples +{ + /// + /// Extension methods for . + /// + public static class TupleFieldStateExtensions + { + /// + /// Checks if specified field state has flag. + /// + /// to check. + /// if field state value has flag; otherwise, . + public static bool IsAvailable(this TupleFieldState fieldState) + { + return (fieldState & TupleFieldState.Available) != 0; + } + + /// + /// Checks if specified field state has flag. + /// + /// to check. + /// if field state value has flag; otherwise, . + /// Field value is not available. + public static bool IsNull(this TupleFieldState fieldState) + { + if ((fieldState & TupleFieldState.Available) == 0) + throw new InvalidOperationException(Strings.ExValueIsNotAvailable); + return (fieldState & TupleFieldState.Null) == TupleFieldState.Null; + } + + /// + /// Checks if specified field state has both and flags. + /// + /// to check. + /// if field state value has both and flags; otherwise, . + public static bool IsAvailableAndNull(this TupleFieldState fieldState) + { + return fieldState == (TupleFieldState.Available | TupleFieldState.Null); + } + + /// + /// Checks if specified field state has flag and has no flag. + /// + /// to check. + /// if field state value is equal to ; + /// otherwise, . + public static bool HasValue(this TupleFieldState fieldState) + { + return fieldState == TupleFieldState.Available; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Tuples/TupleFormatExtensions.cs b/Orm/Xtensive.Orm/Tuples/TupleFormatExtensions.cs index 099a9cba53..4454c1cbdd 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleFormatExtensions.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleFormatExtensions.cs @@ -1,148 +1,148 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Elena Vakhtina -// Created: 2008.11.11 - -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using System.Web; -using Xtensive.Conversion; -using Xtensive.Core; - -using Xtensive.Tuples; -using Xtensive.Reflection; -using Tuple = Xtensive.Tuples.Tuple; -using System.Linq; - -namespace Xtensive.Tuples -{ - /// - /// Extension methods for . - /// - public static class TupleFormatExtensions - { - private const string NullValue = "null"; - private const char Quote = '"'; - private const char Escape = '\\'; - private const char Comma = ','; - - /// - /// Converts the to - /// its string representation. - /// - /// The tuple to convert. - /// Indicates whether to use , - /// or method. - /// String representation of . - public static string ToString(this Tuple source, bool format) - { - return format ? source.Format() : source.ToString(); - } - - /// - /// Returns string representation of the specified . - /// - /// The to format. - /// - /// String representation of the specified . - /// - public static string Format(this Tuple source) - { - ArgumentValidator.EnsureArgumentNotNull(source, "tuple"); - var descriptor = source.Descriptor; - var count = source.Count; - var targets = new string[count]; - for (int i = 0; i < count; i++) - FormatHandler.Get(descriptor[i]).Execute(source, targets, i); - return targets.RevertibleJoin(Escape, Comma); - } - - /// - /// Returns a with specified - /// parsed from the string. - /// - /// The descriptor of to parse. - /// The string to parse. - /// A parsed from the string. - /// string - /// can't be parsed to a with specified . - public static Tuple Parse(this TupleDescriptor descriptor, string source) - { - ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); - var target = Tuple.Create(descriptor); - var count = target.Count; - var sources = source.RevertibleSplit(Escape, Comma).ToArray(); - for (int i = 0; i < count; i++) - ParseHandler.Get(descriptor[i]).Execute(sources, target, i); - return target; - } - - #region Handler classes - - private abstract class FormatHandler - { - public abstract void Execute(Tuple source, string[] targets, int fieldIndex); - - public static FormatHandler Get(Type fieldType) - { - return (FormatHandler) Activator.CreateInstance(typeof (FormatHandler<>).MakeGenericType(fieldType)); - } - } - - private sealed class FormatHandler : FormatHandler - { - public override void Execute(Tuple source, string[] targets, int fieldIndex) - { - var fieldState = source.GetFieldState(fieldIndex); - string result; - if (!fieldState.IsAvailable()) - result = string.Empty; - else if (fieldState.IsNull()) - result = NullValue; - else { - result = AdvancedConverterProvider.Default - .GetConverter() - .Convert(source.GetValue(fieldIndex, out fieldState)); - if (result.IsNullOrEmpty() || result==NullValue || result.Contains(Quote)) - result = Quote + (result ?? string.Empty).Escape(Escape, new char[Quote]) + Quote; // Quoting - } - targets[fieldIndex] = result; - } - } - - private abstract class ParseHandler - { - public abstract void Execute(string[] source, Tuple target, int fieldIndex); - - public static ParseHandler Get(Type fieldType) - { - return (ParseHandler) Activator.CreateInstance(typeof (ParseHandler<>).MakeGenericType(fieldType)); - } - } - - private sealed class ParseHandler : ParseHandler - { - public override void Execute(string[] sources, Tuple target, int fieldIndex) - { - string source = sources[fieldIndex]; - if (source.IsNullOrEmpty()) - return; - if (source==NullValue) { - target.SetValue(fieldIndex, null); - return; - } - if (source[0]==Quote && source[source.Length - 1]==Quote) - source = source.Substring(1, source.Length - 2).Unescape(Escape); - var result = AdvancedConverterProvider.Default - .GetConverter() - .Convert(source); - target.SetValue(fieldIndex, result); - } - } - - #endregion - } -} +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Elena Vakhtina +// Created: 2008.11.11 + +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Web; +using Xtensive.Conversion; +using Xtensive.Core; + +using Xtensive.Tuples; +using Xtensive.Reflection; +using Tuple = Xtensive.Tuples.Tuple; +using System.Linq; + +namespace Xtensive.Tuples +{ + /// + /// Extension methods for . + /// + public static class TupleFormatExtensions + { + private const string NullValue = "null"; + private const char Quote = '"'; + private const char Escape = '\\'; + private const char Comma = ','; + + /// + /// Converts the to + /// its string representation. + /// + /// The tuple to convert. + /// Indicates whether to use , + /// or method. + /// String representation of . + public static string ToString(this Tuple source, bool format) + { + return format ? source.Format() : source.ToString(); + } + + /// + /// Returns string representation of the specified . + /// + /// The to format. + /// + /// String representation of the specified . + /// + public static string Format(this Tuple source) + { + ArgumentValidator.EnsureArgumentNotNull(source, "tuple"); + var descriptor = source.Descriptor; + var count = source.Count; + var targets = new string[count]; + for (int i = 0; i < count; i++) + FormatHandler.Get(descriptor[i]).Execute(source, targets, i); + return targets.RevertibleJoin(Escape, Comma); + } + + /// + /// Returns a with specified + /// parsed from the string. + /// + /// The descriptor of to parse. + /// The string to parse. + /// A parsed from the string. + /// string + /// can't be parsed to a with specified . + public static Tuple Parse(this TupleDescriptor descriptor, string source) + { + ArgumentValidator.EnsureArgumentNotNull(descriptor, "descriptor"); + var target = Tuple.Create(descriptor); + var count = target.Count; + var sources = source.RevertibleSplit(Escape, Comma).ToArray(); + for (int i = 0; i < count; i++) + ParseHandler.Get(descriptor[i]).Execute(sources, target, i); + return target; + } + + #region Handler classes + + private abstract class FormatHandler + { + public abstract void Execute(Tuple source, string[] targets, int fieldIndex); + + public static FormatHandler Get(Type fieldType) + { + return (FormatHandler) Activator.CreateInstance(typeof (FormatHandler<>).MakeGenericType(fieldType)); + } + } + + private sealed class FormatHandler : FormatHandler + { + public override void Execute(Tuple source, string[] targets, int fieldIndex) + { + var fieldState = source.GetFieldState(fieldIndex); + string result; + if (!fieldState.IsAvailable()) + result = string.Empty; + else if (fieldState.IsNull()) + result = NullValue; + else { + result = AdvancedConverterProvider.Default + .GetConverter() + .Convert(source.GetValue(fieldIndex, out fieldState)); + if (result.IsNullOrEmpty() || result==NullValue || result.Contains(Quote)) + result = Quote + (result ?? string.Empty).Escape(Escape, new char[Quote]) + Quote; // Quoting + } + targets[fieldIndex] = result; + } + } + + private abstract class ParseHandler + { + public abstract void Execute(string[] source, Tuple target, int fieldIndex); + + public static ParseHandler Get(Type fieldType) + { + return (ParseHandler) Activator.CreateInstance(typeof (ParseHandler<>).MakeGenericType(fieldType)); + } + } + + private sealed class ParseHandler : ParseHandler + { + public override void Execute(string[] sources, Tuple target, int fieldIndex) + { + string source = sources[fieldIndex]; + if (source.IsNullOrEmpty()) + return; + if (source==NullValue) { + target.SetValue(fieldIndex, null); + return; + } + if (source[0]==Quote && source[source.Length - 1]==Quote) + source = source.Substring(1, source.Length - 2).Unescape(Escape); + var result = AdvancedConverterProvider.Default + .GetConverter() + .Convert(source); + target.SetValue(fieldIndex, result); + } + } + + #endregion + } +} diff --git a/Orm/Xtensive.Orm/Tuples/TupleUpdater.cs b/Orm/Xtensive.Orm/Tuples/TupleUpdater.cs index 5277268992..201a731c8d 100644 --- a/Orm/Xtensive.Orm/Tuples/TupleUpdater.cs +++ b/Orm/Xtensive.Orm/Tuples/TupleUpdater.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexander Nikolaev -// Created: 2009.03.17 - -using System; -using Xtensive.Core; - - -namespace Xtensive.Tuples -{ - /// - /// Helper type allowing to update tuples using functional style syntax. - /// - [Serializable] - public struct TupleUpdater - { - private readonly Tuple tuple; - - /// - /// Gets the wrapped tuple. - /// - /// The tuple. - public Tuple Tuple { get { return tuple; } } - - /// - /// Updates the field of with the specified index. - /// - /// The field index. - /// The new field value - /// - public TupleUpdater SetValue(int fieldIndex, object value) - { - tuple.SetValue(fieldIndex, value); - return this; - } - - - // Constructors - - /// - /// Initializes new instance of this type. - /// - /// The tuple to wrap. - public TupleUpdater(Tuple tuple) - { - ArgumentValidator.EnsureArgumentNotNull(tuple, "tuple"); - this.tuple = tuple; - } - } +// Copyright (C) 2003-2010 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexander Nikolaev +// Created: 2009.03.17 + +using System; +using Xtensive.Core; + + +namespace Xtensive.Tuples +{ + /// + /// Helper type allowing to update tuples using functional style syntax. + /// + [Serializable] + public struct TupleUpdater + { + private readonly Tuple tuple; + + /// + /// Gets the wrapped tuple. + /// + /// The tuple. + public Tuple Tuple { get { return tuple; } } + + /// + /// Updates the field of with the specified index. + /// + /// The field index. + /// The new field value + /// + public TupleUpdater SetValue(int fieldIndex, object value) + { + tuple.SetValue(fieldIndex, value); + return this; + } + + + // Constructors + + /// + /// Initializes new instance of this type. + /// + /// The tuple to wrap. + public TupleUpdater(Tuple tuple) + { + ArgumentValidator.EnsureArgumentNotNull(tuple, "tuple"); + this.tuple = tuple; + } + } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Xtensive.Orm.csproj b/Orm/Xtensive.Orm/Xtensive.Orm.csproj index da76472f56..1e49e1339f 100644 --- a/Orm/Xtensive.Orm/Xtensive.Orm.csproj +++ b/Orm/Xtensive.Orm/Xtensive.Orm.csproj @@ -1,82 +1,82 @@ - - - true - $(SolutionDir)_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.xml - $(SolutionDir)_Build\$(Configuration)\lib\ - - - - netstandard2.0 - Xtensive - Xtensive.Orm - $(DoProductName) - $(Title) - $(DoProductName) is the object-relational mapper (ORM) and business logic layer (BLL) framework - true - ..\Orm.snk - true - 2 - - - TRACE;DEBUG;NETSTANDARD - - - TRACE;NETSTANDARD - true - portable - - - - - - - - - - - - - - - - - - TextTemplatingFileGenerator - - - TextTemplatingFileGenerator - - - TextTemplatingFileGenerator - - - TextTemplatingFileGenerator - - - TextTemplatingFileGenerator - - - - - TextTemplatingFileGenerator - PrimitiveArithmetics.cs - - - TextTemplatingFileGenerator - DelegateBindExtensions.cs - - - TextTemplatingFileGenerator - ExpressionCompileExtensions.cs - - - - TextTemplatingFileGenerator - InternalLogs.cs - - - TextTemplatingFileGenerator - MemberCompilerProvider-CreateCompiler.cs - - + + + true + $(SolutionDir)_Build\$(Configuration)\lib\$(TargetFramework)\Xtensive.Orm.xml + $(SolutionDir)_Build\$(Configuration)\lib\ + + + + netstandard2.0 + Xtensive + Xtensive.Orm + $(DoProductName) + $(Title) + $(DoProductName) is the object-relational mapper (ORM) and business logic layer (BLL) framework + true + ..\Orm.snk + true + 2 + + + TRACE;DEBUG;NETSTANDARD + + + TRACE;NETSTANDARD + true + portable + + + + + + + + + + + + + + + + + + TextTemplatingFileGenerator + + + TextTemplatingFileGenerator + + + TextTemplatingFileGenerator + + + TextTemplatingFileGenerator + + + TextTemplatingFileGenerator + + + + + TextTemplatingFileGenerator + PrimitiveArithmetics.cs + + + TextTemplatingFileGenerator + DelegateBindExtensions.cs + + + TextTemplatingFileGenerator + ExpressionCompileExtensions.cs + + + + TextTemplatingFileGenerator + InternalLogs.cs + + + TextTemplatingFileGenerator + MemberCompilerProvider-CreateCompiler.cs + + \ No newline at end of file diff --git a/TestFileForBuildServerTests.txt b/TestFileForBuildServerTests.txt index 02b6e66aa9..3228e449f8 100644 --- a/TestFileForBuildServerTests.txt +++ b/TestFileForBuildServerTests.txt @@ -1,3 +1,3 @@ -Change1 -Change2 +Change1 +Change2 Change3 \ No newline at end of file diff --git a/Version.props b/Version.props index 64601c8523..a89ca78ee9 100644 --- a/Version.props +++ b/Version.props @@ -1,9 +1,9 @@ - - - - - 6.0.3 - - - - + + + + + 6.0.3 + + + + diff --git a/Weaver/Xtensive.Orm.Weaver/AccessorKind.cs b/Weaver/Xtensive.Orm.Weaver/AccessorKind.cs index 9b9d8f6c22..4f6a992003 100644 --- a/Weaver/Xtensive.Orm.Weaver/AccessorKind.cs +++ b/Weaver/Xtensive.Orm.Weaver/AccessorKind.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.22 - -namespace Xtensive.Orm.Weaver -{ - public enum AccessorKind - { - Getter, - Setter, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.22 + +namespace Xtensive.Orm.Weaver +{ + public enum AccessorKind + { + Getter, + Setter, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ActionResult.cs b/Weaver/Xtensive.Orm.Weaver/ActionResult.cs index 3c3f31e96d..06417c9118 100644 --- a/Weaver/Xtensive.Orm.Weaver/ActionResult.cs +++ b/Weaver/Xtensive.Orm.Weaver/ActionResult.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public enum ActionResult - { - Failure, - Success, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public enum ActionResult + { + Failure, + Success, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Application/ConsoleMessageWriter.cs b/Weaver/Xtensive.Orm.Weaver/Application/ConsoleMessageWriter.cs index e24d78a416..a759504890 100644 --- a/Weaver/Xtensive.Orm.Weaver/Application/ConsoleMessageWriter.cs +++ b/Weaver/Xtensive.Orm.Weaver/Application/ConsoleMessageWriter.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; - -namespace Xtensive.Orm.Weaver.Application -{ - internal sealed class ConsoleMessageWriter : MessageWriter - { - public override void Write(ProcessorMessage message) - { - Console.WriteLine(message); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; + +namespace Xtensive.Orm.Weaver.Application +{ + internal sealed class ConsoleMessageWriter : MessageWriter + { + public override void Write(ProcessorMessage message) + { + Console.WriteLine(message); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Application/ExitCode.cs b/Weaver/Xtensive.Orm.Weaver/Application/ExitCode.cs index c6e9464ef3..aa4bd58155 100644 --- a/Weaver/Xtensive.Orm.Weaver/Application/ExitCode.cs +++ b/Weaver/Xtensive.Orm.Weaver/Application/ExitCode.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver.Application -{ - internal static class ExitCode - { - public const int Success = 0; - public const int ProcessorError = 1; - public const int InternalError = 2; - public const int InvalidCommandLine = 3; - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver.Application +{ + internal static class ExitCode + { + public const int Success = 0; + public const int ProcessorError = 1; + public const int InternalError = 2; + public const int InvalidCommandLine = 3; + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Application/Program.cs b/Weaver/Xtensive.Orm.Weaver/Application/Program.cs index 99afab7b13..1132f04812 100644 --- a/Weaver/Xtensive.Orm.Weaver/Application/Program.cs +++ b/Weaver/Xtensive.Orm.Weaver/Application/Program.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.IO; - -namespace Xtensive.Orm.Weaver.Application -{ - internal sealed class Program - { - private static readonly string[] OptionPrefixes = new[] {"-", "/", "--"}; - - private readonly string[] args; - private readonly ProcessorConfiguration configuration; - - private static void Main(string[] args) - { - try { - new Program(args).Run(); - } - catch (Exception exception) { - Console.Error.WriteLine(exception); - Environment.Exit(ExitCode.InternalError); - } - } - - private void Run() - { - if (args.Length==0) - ShowNoArgumentsErrorAndExit(); - - foreach (var arg in args) - ProcessArgument(arg); - - var processor = new AssemblyProcessor(configuration, new ConsoleMessageWriter()); - var result = processor.Execute(); - - ExitAccordingToResult(result); - } - - private void ExitAccordingToResult(ActionResult result) - { - Environment.Exit(result==ActionResult.Success ? ExitCode.Success : ExitCode.ProcessorError); - } - - private void ProcessArgument(string argument) - { - if (argument.StartsWith("@", StringComparison.Ordinal)) { - foreach (var line in File.ReadLines(argument.Substring(1))) - ProcessArgument(line); - return; - } - - if (!configuration.Parse(StripOptionPrefix(argument))) - ShowInvalidArgumentErrorAndExit(argument); - } - - private string StripOptionPrefix(string argument) - { - foreach (var prefix in OptionPrefixes) - if (argument.StartsWith(prefix, StringComparison.Ordinal)) - return argument.Substring(prefix.Length); - return argument; - } - - private void ShowNoArgumentsErrorAndExit() - { - Console.Error.WriteLine("No arguments specified"); - Environment.Exit(ExitCode.InvalidCommandLine); - } - - private void ShowInvalidArgumentErrorAndExit(string argument) - { - Console.Error.WriteLine("Invalid argument: {0}", argument); - Environment.Exit(ExitCode.InvalidCommandLine); - } - - private Program(string[] args) - { - this.args = args; - configuration = new ProcessorConfiguration(); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.IO; + +namespace Xtensive.Orm.Weaver.Application +{ + internal sealed class Program + { + private static readonly string[] OptionPrefixes = new[] {"-", "/", "--"}; + + private readonly string[] args; + private readonly ProcessorConfiguration configuration; + + private static void Main(string[] args) + { + try { + new Program(args).Run(); + } + catch (Exception exception) { + Console.Error.WriteLine(exception); + Environment.Exit(ExitCode.InternalError); + } + } + + private void Run() + { + if (args.Length==0) + ShowNoArgumentsErrorAndExit(); + + foreach (var arg in args) + ProcessArgument(arg); + + var processor = new AssemblyProcessor(configuration, new ConsoleMessageWriter()); + var result = processor.Execute(); + + ExitAccordingToResult(result); + } + + private void ExitAccordingToResult(ActionResult result) + { + Environment.Exit(result==ActionResult.Success ? ExitCode.Success : ExitCode.ProcessorError); + } + + private void ProcessArgument(string argument) + { + if (argument.StartsWith("@", StringComparison.Ordinal)) { + foreach (var line in File.ReadLines(argument.Substring(1))) + ProcessArgument(line); + return; + } + + if (!configuration.Parse(StripOptionPrefix(argument))) + ShowInvalidArgumentErrorAndExit(argument); + } + + private string StripOptionPrefix(string argument) + { + foreach (var prefix in OptionPrefixes) + if (argument.StartsWith(prefix, StringComparison.Ordinal)) + return argument.Substring(prefix.Length); + return argument; + } + + private void ShowNoArgumentsErrorAndExit() + { + Console.Error.WriteLine("No arguments specified"); + Environment.Exit(ExitCode.InvalidCommandLine); + } + + private void ShowInvalidArgumentErrorAndExit(string argument) + { + Console.Error.WriteLine("Invalid argument: {0}", argument); + Environment.Exit(ExitCode.InvalidCommandLine); + } + + private Program(string[] args) + { + this.args = args; + configuration = new ProcessorConfiguration(); + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/AssemblyChecker.cs b/Weaver/Xtensive.Orm.Weaver/AssemblyChecker.cs index 33473b6cff..a9131db362 100644 --- a/Weaver/Xtensive.Orm.Weaver/AssemblyChecker.cs +++ b/Weaver/Xtensive.Orm.Weaver/AssemblyChecker.cs @@ -1,40 +1,40 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.09.02 - -using System.Collections.Generic; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public sealed class AssemblyChecker - { - private readonly Dictionary frameworkAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); - private readonly Dictionary netStandardAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); - - - public void RegisterFrameworkAssembly(string name, string publicKeyToken) - { - frameworkAssemblies.Add(name, WeavingHelper.ParsePublicKeyToken(publicKeyToken)); - } - - public void RegisterNetStandardAssembly(string name, string publicKeyToken) - { - netStandardAssemblies.Add(name, WeavingHelper.ParsePublicKeyToken(publicKeyToken)); - } - - public bool IsFrameworkAssembly(AssemblyNameReference reference) - { - byte[] expectedToken; - return frameworkAssemblies.TryGetValue(reference.Name, out expectedToken) && reference.HasPublicKeyToken(expectedToken); - } - - public bool IsNetStandardAssembly(AssemblyNameReference reference) - { - byte[] expectedToken; - return netStandardAssemblies.TryGetValue(reference.Name, out expectedToken) && reference.HasPublicKeyToken(expectedToken); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.09.02 + +using System.Collections.Generic; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public sealed class AssemblyChecker + { + private readonly Dictionary frameworkAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); + private readonly Dictionary netStandardAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); + + + public void RegisterFrameworkAssembly(string name, string publicKeyToken) + { + frameworkAssemblies.Add(name, WeavingHelper.ParsePublicKeyToken(publicKeyToken)); + } + + public void RegisterNetStandardAssembly(string name, string publicKeyToken) + { + netStandardAssemblies.Add(name, WeavingHelper.ParsePublicKeyToken(publicKeyToken)); + } + + public bool IsFrameworkAssembly(AssemblyNameReference reference) + { + byte[] expectedToken; + return frameworkAssemblies.TryGetValue(reference.Name, out expectedToken) && reference.HasPublicKeyToken(expectedToken); + } + + public bool IsNetStandardAssembly(AssemblyNameReference reference) + { + byte[] expectedToken; + return netStandardAssemblies.TryGetValue(reference.Name, out expectedToken) && reference.HasPublicKeyToken(expectedToken); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/AssemblyProcessor.cs b/Weaver/Xtensive.Orm.Weaver/AssemblyProcessor.cs index 5d5c6faab5..17d5ea1ddd 100644 --- a/Weaver/Xtensive.Orm.Weaver/AssemblyProcessor.cs +++ b/Weaver/Xtensive.Orm.Weaver/AssemblyProcessor.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using Mono.Cecil; -using Xtensive.Orm.Weaver.Stages; - -namespace Xtensive.Orm.Weaver -{ - internal sealed class AssemblyProcessor - { - private readonly ProcessorConfiguration configuration; - private readonly MessageWriter messageWriter; - - public ActionResult Execute() - { - var logger = new MessageLogger(messageWriter); - var referencedAssemblies = configuration.ReferencedAssemblies ?? Enumerable.Empty(); - var assemblyResolver = new AssemblyResolver(referencedAssemblies, logger); - - var context = new ProcessorContext { - Configuration = configuration, - ApplicationDirectory = Path.GetDirectoryName(GetType().Assembly.Location), - Logger = logger, - Language = WeavingHelper.ParseLanguage(configuration.ProjectType), - AssemblyResolver = assemblyResolver, - MetadataResolver = new MetadataResolver(assemblyResolver), - }; - - context.InputFile = FileHelper.ExpandPath(configuration.InputFile); - context.OutputFile = FileHelper.ExpandPath(configuration.OutputFile); - if (string.IsNullOrEmpty(context.OutputFile)) - context.OutputFile = context.InputFile; - - using (context) { - foreach (var stage in GetStages()) { - var stageResult = ExecuteStage(context, stage); - if (stageResult!=ActionResult.Success) - return stageResult; - } - } - - return ActionResult.Success; - } - - private IEnumerable GetStages() - { - return new ProcessorStage[] { - new TransformAssemblyStage(), - new LoadAssemblyStage(), - new ImportReferencesStage(), - new RegisterFrameworkAssembliesStage(), - new RegisterNetStandardAssembliesStage(), - new FindPersistentTypesStage(), - new ModifyPersistentTypesStage(), - new MarkAssemblyStage(), - new WriteStatusStage(), - new ExecuteWeavingTasksStage(), - new SaveAssemblyStage(), - new WriteStampStage(), - }; - } - - private static ActionResult ExecuteStage(ProcessorContext context, ProcessorStage stage) - { - try { - return stage.CanExecute(context) ? stage.Execute(context) : ActionResult.Success; - } - catch (StageFailedException) { - return ActionResult.Failure; - } - catch (Exception exception) { - context.Logger.Write(MessageCode.ErrorInternal, exception); - return ActionResult.Failure; - } - } - - public AssemblyProcessor(ProcessorConfiguration configuration, MessageWriter messageWriter) - { - this.configuration = configuration; - this.messageWriter = messageWriter; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Mono.Cecil; +using Xtensive.Orm.Weaver.Stages; + +namespace Xtensive.Orm.Weaver +{ + internal sealed class AssemblyProcessor + { + private readonly ProcessorConfiguration configuration; + private readonly MessageWriter messageWriter; + + public ActionResult Execute() + { + var logger = new MessageLogger(messageWriter); + var referencedAssemblies = configuration.ReferencedAssemblies ?? Enumerable.Empty(); + var assemblyResolver = new AssemblyResolver(referencedAssemblies, logger); + + var context = new ProcessorContext { + Configuration = configuration, + ApplicationDirectory = Path.GetDirectoryName(GetType().Assembly.Location), + Logger = logger, + Language = WeavingHelper.ParseLanguage(configuration.ProjectType), + AssemblyResolver = assemblyResolver, + MetadataResolver = new MetadataResolver(assemblyResolver), + }; + + context.InputFile = FileHelper.ExpandPath(configuration.InputFile); + context.OutputFile = FileHelper.ExpandPath(configuration.OutputFile); + if (string.IsNullOrEmpty(context.OutputFile)) + context.OutputFile = context.InputFile; + + using (context) { + foreach (var stage in GetStages()) { + var stageResult = ExecuteStage(context, stage); + if (stageResult!=ActionResult.Success) + return stageResult; + } + } + + return ActionResult.Success; + } + + private IEnumerable GetStages() + { + return new ProcessorStage[] { + new TransformAssemblyStage(), + new LoadAssemblyStage(), + new ImportReferencesStage(), + new RegisterFrameworkAssembliesStage(), + new RegisterNetStandardAssembliesStage(), + new FindPersistentTypesStage(), + new ModifyPersistentTypesStage(), + new MarkAssemblyStage(), + new WriteStatusStage(), + new ExecuteWeavingTasksStage(), + new SaveAssemblyStage(), + new WriteStampStage(), + }; + } + + private static ActionResult ExecuteStage(ProcessorContext context, ProcessorStage stage) + { + try { + return stage.CanExecute(context) ? stage.Execute(context) : ActionResult.Success; + } + catch (StageFailedException) { + return ActionResult.Failure; + } + catch (Exception exception) { + context.Logger.Write(MessageCode.ErrorInternal, exception); + return ActionResult.Failure; + } + } + + public AssemblyProcessor(ProcessorConfiguration configuration, MessageWriter messageWriter) + { + this.configuration = configuration; + this.messageWriter = messageWriter; + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/AssemblyResolver.cs b/Weaver/Xtensive.Orm.Weaver/AssemblyResolver.cs index 4a9048823d..e8fd454c69 100644 --- a/Weaver/Xtensive.Orm.Weaver/AssemblyResolver.cs +++ b/Weaver/Xtensive.Orm.Weaver/AssemblyResolver.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - internal sealed class AssemblyResolver : IAssemblyResolver - { - private readonly MessageLogger logger; - private readonly Dictionary assemblyFiles = new Dictionary(WeavingHelper.AssemblyNameComparer); - private readonly Dictionary loadedAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); - private readonly IAssemblyResolver defaultAssemblyResolver; - - public AssemblyDefinition Resolve(AssemblyNameReference name) - { - return ResolveInternal(name); - } - - public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) - { - return ResolveInternal(name); - } - - public AssemblyDefinition Resolve(string fullName) - { - return ResolveInternal(AssemblyNameReference.Parse(fullName)); - } - - public AssemblyDefinition Resolve(string fullName, ReaderParameters parameters) - { - return ResolveInternal(AssemblyNameReference.Parse(fullName)); - } - - private AssemblyDefinition ResolveInternal(AssemblyNameReference name) - { - var shortName = name.Name; - ModuleDefinition module; - if (!loadedAssemblies.TryGetValue(shortName, out module)) { - string file; - if (!TryGetAssemblyFile(shortName, out file)) { - AssemblyDefinition resolvedAssembly; - try { - resolvedAssembly = defaultAssemblyResolver.Resolve(name); - } - catch (Exception) { - resolvedAssembly = null; - } - if (resolvedAssembly==null) { - logger.Write(MessageCode.ErrorUnableToFindReferencedAssembly, shortName); - throw new StageFailedException(); - } - return resolvedAssembly; - } - module = LoadAssembly(file); - loadedAssemblies.Add(shortName, module); - } - return module.Assembly; - } - - private bool TryGetAssemblyFile(string shortName, out string file) - { - if (assemblyFiles.TryGetValue(shortName, out file)) - return true; - return false; - } - - private ModuleDefinition LoadAssembly(string file) - { - var parameters = new ReaderParameters { - ReadingMode = ReadingMode.Deferred, - AssemblyResolver = this, - MetadataResolver = new MetadataResolver(this), - }; - return ModuleDefinition.ReadModule(file, parameters); - } - - public AssemblyResolver(IEnumerable referencedAssemblies, MessageLogger logger) - { - if (referencedAssemblies==null) - throw new ArgumentNullException("referencedAssemblies"); - if (logger==null) - throw new ArgumentNullException("logger"); - - this.logger = logger; - - foreach (var file in referencedAssemblies) { - var name = Path.GetFileNameWithoutExtension(file); - if (name!=null && File.Exists(file)) - assemblyFiles.Add(name, file); - else - logger.Write(MessageCode.WarningReferencedAssemblyFileIsNotFound, file); - } - this.defaultAssemblyResolver = new DefaultAssemblyResolver(); - } - - public void Dispose() - { - defaultAssemblyResolver.Dispose(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + internal sealed class AssemblyResolver : IAssemblyResolver + { + private readonly MessageLogger logger; + private readonly Dictionary assemblyFiles = new Dictionary(WeavingHelper.AssemblyNameComparer); + private readonly Dictionary loadedAssemblies = new Dictionary(WeavingHelper.AssemblyNameComparer); + private readonly IAssemblyResolver defaultAssemblyResolver; + + public AssemblyDefinition Resolve(AssemblyNameReference name) + { + return ResolveInternal(name); + } + + public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) + { + return ResolveInternal(name); + } + + public AssemblyDefinition Resolve(string fullName) + { + return ResolveInternal(AssemblyNameReference.Parse(fullName)); + } + + public AssemblyDefinition Resolve(string fullName, ReaderParameters parameters) + { + return ResolveInternal(AssemblyNameReference.Parse(fullName)); + } + + private AssemblyDefinition ResolveInternal(AssemblyNameReference name) + { + var shortName = name.Name; + ModuleDefinition module; + if (!loadedAssemblies.TryGetValue(shortName, out module)) { + string file; + if (!TryGetAssemblyFile(shortName, out file)) { + AssemblyDefinition resolvedAssembly; + try { + resolvedAssembly = defaultAssemblyResolver.Resolve(name); + } + catch (Exception) { + resolvedAssembly = null; + } + if (resolvedAssembly==null) { + logger.Write(MessageCode.ErrorUnableToFindReferencedAssembly, shortName); + throw new StageFailedException(); + } + return resolvedAssembly; + } + module = LoadAssembly(file); + loadedAssemblies.Add(shortName, module); + } + return module.Assembly; + } + + private bool TryGetAssemblyFile(string shortName, out string file) + { + if (assemblyFiles.TryGetValue(shortName, out file)) + return true; + return false; + } + + private ModuleDefinition LoadAssembly(string file) + { + var parameters = new ReaderParameters { + ReadingMode = ReadingMode.Deferred, + AssemblyResolver = this, + MetadataResolver = new MetadataResolver(this), + }; + return ModuleDefinition.ReadModule(file, parameters); + } + + public AssemblyResolver(IEnumerable referencedAssemblies, MessageLogger logger) + { + if (referencedAssemblies==null) + throw new ArgumentNullException("referencedAssemblies"); + if (logger==null) + throw new ArgumentNullException("logger"); + + this.logger = logger; + + foreach (var file in referencedAssemblies) { + var name = Path.GetFileNameWithoutExtension(file); + if (name!=null && File.Exists(file)) + assemblyFiles.Add(name, file); + else + logger.Write(MessageCode.WarningReferencedAssemblyFileIsNotFound, file); + } + this.defaultAssemblyResolver = new DefaultAssemblyResolver(); + } + + public void Dispose() + { + defaultAssemblyResolver.Dispose(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Extensions.cs b/Weaver/Xtensive.Orm.Weaver/Extensions.cs index 54ec2a2363..78d2c8f3fc 100644 --- a/Weaver/Xtensive.Orm.Weaver/Extensions.cs +++ b/Weaver/Xtensive.Orm.Weaver/Extensions.cs @@ -1,64 +1,64 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System.Collections.Generic; -using System.Linq; -using Mono.Cecil; -using Mono.Collections.Generic; - -namespace Xtensive.Orm.Weaver -{ - public static class Extensions - { - public static bool HasAttribute(this ICustomAttributeProvider target, string fullName) - { - var comparer = WeavingHelper.TypeNameComparer; - return target.CustomAttributes.Any(a => comparer.Equals(a.AttributeType.FullName, fullName)); - } - - public static bool HasPublicKeyToken(this AssemblyNameReference reference, IList expectedToken) - { - var tokenToCheck = reference.PublicKeyToken; - return tokenToCheck!=null - && tokenToCheck.Length==expectedToken.Count - && tokenToCheck.SequenceEqual(expectedToken); - } - - public static bool HasReferenceTo(this ModuleDefinition module, string assemblyName, IList publicKeyToken) - { - return module.AssemblyReferences.Any(r => r.Name==assemblyName && r.HasPublicKeyToken(publicKeyToken)); - } - - public static bool Remove(this Collection items, string name) - where T : MemberReference - { - var index = items.IndexOf(name); - if (index < 0) - return false; - items.RemoveAt(index); - return true; - } - - public static int IndexOf(this Collection items, string name) - where T : MemberReference - { - var comparer = WeavingHelper.TypeNameComparer; - - for (int i = 0; i < items.Count; i++) - if (comparer.Equals(items[i].Name, name)) - return i; - - return -1; - } - - public static TypeReference StripGenericParameters(this TypeReference type) - { - if (type.IsGenericInstance) - type = type.GetElementType(); - return type; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; +using Mono.Collections.Generic; + +namespace Xtensive.Orm.Weaver +{ + public static class Extensions + { + public static bool HasAttribute(this ICustomAttributeProvider target, string fullName) + { + var comparer = WeavingHelper.TypeNameComparer; + return target.CustomAttributes.Any(a => comparer.Equals(a.AttributeType.FullName, fullName)); + } + + public static bool HasPublicKeyToken(this AssemblyNameReference reference, IList expectedToken) + { + var tokenToCheck = reference.PublicKeyToken; + return tokenToCheck!=null + && tokenToCheck.Length==expectedToken.Count + && tokenToCheck.SequenceEqual(expectedToken); + } + + public static bool HasReferenceTo(this ModuleDefinition module, string assemblyName, IList publicKeyToken) + { + return module.AssemblyReferences.Any(r => r.Name==assemblyName && r.HasPublicKeyToken(publicKeyToken)); + } + + public static bool Remove(this Collection items, string name) + where T : MemberReference + { + var index = items.IndexOf(name); + if (index < 0) + return false; + items.RemoveAt(index); + return true; + } + + public static int IndexOf(this Collection items, string name) + where T : MemberReference + { + var comparer = WeavingHelper.TypeNameComparer; + + for (int i = 0; i < items.Count; i++) + if (comparer.Equals(items[i].Name, name)) + return i; + + return -1; + } + + public static TypeReference StripGenericParameters(this TypeReference type) + { + if (type.IsGenericInstance) + type = type.GetElementType(); + return type; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/FileHelper.cs b/Weaver/Xtensive.Orm.Weaver/FileHelper.cs index 3ccf60fc02..f517f30067 100644 --- a/Weaver/Xtensive.Orm.Weaver/FileHelper.cs +++ b/Weaver/Xtensive.Orm.Weaver/FileHelper.cs @@ -1,67 +1,67 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System; -using System.IO; - -namespace Xtensive.Orm.Weaver -{ - internal static class FileHelper - { - private static readonly byte[] StampFileData = {(byte) 'X'}; - - public static string GetDebugSymbolsFile(string file) - { - return Path.ChangeExtension(file, ".pdb"); - } - - public static string GetStatusFile(string file) - { - return file + ".weaver-status"; - } - - public static string GetStampFile(string file) - { - return file + ".weaver-stamp"; - } - - public static string GetBackupFile(string file) - { - var directory = Path.GetDirectoryName(file); - var name = Path.GetFileName(file); - return Path.Combine(directory, "BeforeWeaving", name); - } - - public static string ExpandPath(string path) - { - return string.IsNullOrEmpty(path) || Path.IsPathRooted(path) - ? path - : Path.Combine(Directory.GetCurrentDirectory(), path); - } - - public static void CopyWithPdb(ProcessorContext context, string sourceFile, string targetFile) - { - var targetDirectory = Path.GetDirectoryName(targetFile); - if (!Directory.Exists(targetDirectory)) - Directory.CreateDirectory(targetDirectory); - File.Copy(sourceFile, targetFile, true); - if (context.Configuration.ProcessDebugSymbols) { - var sourcePdb = GetDebugSymbolsFile(sourceFile); - var targetPdb = GetDebugSymbolsFile(targetFile); - File.Copy(sourcePdb, targetPdb, true); - } - } - - public static void Touch(string file) - { - // File.SetLastWriteTimeUtc does not have right precision on Linux before .NET Core 3 - // https://github.com/dotnet/corefx/issues/31379 - - using (var stream = File.OpenWrite(file)) - stream.Write(StampFileData); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System; +using System.IO; + +namespace Xtensive.Orm.Weaver +{ + internal static class FileHelper + { + private static readonly byte[] StampFileData = {(byte) 'X'}; + + public static string GetDebugSymbolsFile(string file) + { + return Path.ChangeExtension(file, ".pdb"); + } + + public static string GetStatusFile(string file) + { + return file + ".weaver-status"; + } + + public static string GetStampFile(string file) + { + return file + ".weaver-stamp"; + } + + public static string GetBackupFile(string file) + { + var directory = Path.GetDirectoryName(file); + var name = Path.GetFileName(file); + return Path.Combine(directory, "BeforeWeaving", name); + } + + public static string ExpandPath(string path) + { + return string.IsNullOrEmpty(path) || Path.IsPathRooted(path) + ? path + : Path.Combine(Directory.GetCurrentDirectory(), path); + } + + public static void CopyWithPdb(ProcessorContext context, string sourceFile, string targetFile) + { + var targetDirectory = Path.GetDirectoryName(targetFile); + if (!Directory.Exists(targetDirectory)) + Directory.CreateDirectory(targetDirectory); + File.Copy(sourceFile, targetFile, true); + if (context.Configuration.ProcessDebugSymbols) { + var sourcePdb = GetDebugSymbolsFile(sourceFile); + var targetPdb = GetDebugSymbolsFile(targetFile); + File.Copy(sourcePdb, targetPdb, true); + } + } + + public static void Touch(string file) + { + // File.SetLastWriteTimeUtc does not have right precision on Linux before .NET Core 3 + // https://github.com/dotnet/corefx/issues/31379 + + using (var stream = File.OpenWrite(file)) + stream.Write(StampFileData); + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/FrameworkAssemblyList.cs b/Weaver/Xtensive.Orm.Weaver/FrameworkAssemblyList.cs index adca65ea26..9abd64dafd 100644 --- a/Weaver/Xtensive.Orm.Weaver/FrameworkAssemblyList.cs +++ b/Weaver/Xtensive.Orm.Weaver/FrameworkAssemblyList.cs @@ -1,153 +1,153 @@ -// Generated by DumpFrameworkAssemblyList tool - -namespace Xtensive.Orm.Weaver -{ - internal static class FrameworkAssemblyList - { - public static string[] Get() - { - return new[] { - "Accessibility b03f5f7f11d50a3a", - "AddInProcess b77a5c561934e089", - "AddInProcess32 b77a5c561934e089", - "AddInUtil b77a5c561934e089", - "ComSvcConfig b03f5f7f11d50a3a", - "CustomMarshalers b03f5f7f11d50a3a", - "DataSvcUtil b77a5c561934e089", - "EdmGen b77a5c561934e089", - "FSharp.Core b03f5f7f11d50a3a", - "infocard b77a5c561934e089", - "ISymWrapper b03f5f7f11d50a3a", - "Microsoft.Build b03f5f7f11d50a3a", - "Microsoft.Build.Conversion.v3.5 b03f5f7f11d50a3a", - "Microsoft.Build.Conversion.v4.0 b03f5f7f11d50a3a", - "Microsoft.Build.Engine b03f5f7f11d50a3a", - "Microsoft.Build.Framework b03f5f7f11d50a3a", - "Microsoft.Build.Tasks.v3.5 b03f5f7f11d50a3a", - "Microsoft.Build.Tasks.v4.0 b03f5f7f11d50a3a", - "Microsoft.Build.Utilities.v3.5 b03f5f7f11d50a3a", - "Microsoft.Build.Utilities.v4.0 b03f5f7f11d50a3a", - "Microsoft.CSharp b03f5f7f11d50a3a", - "Microsoft.Data.Entity.Build.Tasks b03f5f7f11d50a3a", - "Microsoft.JScript b03f5f7f11d50a3a", - "Microsoft.Transactions.Bridge b03f5f7f11d50a3a", - "Microsoft.Transactions.Bridge.Dtc b03f5f7f11d50a3a", - "Microsoft.VisualBasic b03f5f7f11d50a3a", - "Microsoft.VisualBasic.Compatibility b03f5f7f11d50a3a", - "Microsoft.VisualBasic.Compatibility.Data b03f5f7f11d50a3a", - "Microsoft.VisualC b03f5f7f11d50a3a", - "Microsoft.VisualC.STLCLR b03f5f7f11d50a3a", - "MSBuild b03f5f7f11d50a3a", - "mscorlib b77a5c561934e089", - "PresentationBuildTasks 31bf3856ad364e35", - "PresentationCFFRasterizer 31bf3856ad364e35", - "PresentationCore 31bf3856ad364e35", - "PresentationFramework 31bf3856ad364e35", - "PresentationFramework.Aero 31bf3856ad364e35", - "PresentationFramework.Classic 31bf3856ad364e35", - "PresentationFramework.Luna 31bf3856ad364e35", - "PresentationFramework.Royale 31bf3856ad364e35", - "PresentationUI 31bf3856ad364e35", - "ReachFramework 31bf3856ad364e35", - "Sentinel.v3.5Client b03f5f7f11d50a3a", - "ServiceModelReg b03f5f7f11d50a3a", - "SMSvcHost b03f5f7f11d50a3a", - "sysglobl b03f5f7f11d50a3a", - "System b77a5c561934e089", - "System.Activities 31bf3856ad364e35", - "System.Activities.Core.Presentation 31bf3856ad364e35", - "System.Activities.DurableInstancing 31bf3856ad364e35", - "System.Activities.Presentation 31bf3856ad364e35", - "System.AddIn b77a5c561934e089", - "System.AddIn.Contract b03f5f7f11d50a3a", - "System.ComponentModel.Composition b77a5c561934e089", - "System.ComponentModel.DataAnnotations 31bf3856ad364e35", - "System.Configuration b03f5f7f11d50a3a", - "System.Configuration.Install b03f5f7f11d50a3a", - "System.Core b77a5c561934e089", - "System.Data b77a5c561934e089", - "System.Data.DataSetExtensions b77a5c561934e089", - "System.Data.Entity b77a5c561934e089", - "System.Data.Entity.Design b77a5c561934e089", - "System.Data.Linq b77a5c561934e089", - "System.Data.OracleClient b77a5c561934e089", - "System.Data.Services b77a5c561934e089", - "System.Data.Services.Client b77a5c561934e089", - "System.Data.Services.Design b77a5c561934e089", - "System.Data.SqlXml b77a5c561934e089", - "System.Deployment b03f5f7f11d50a3a", - "System.Design b03f5f7f11d50a3a", - "System.Device b77a5c561934e089", - "System.DirectoryServices b03f5f7f11d50a3a", - "System.DirectoryServices.AccountManagement b77a5c561934e089", - "System.DirectoryServices.Protocols b03f5f7f11d50a3a", - "System.Drawing b03f5f7f11d50a3a", - "System.Drawing.Design b03f5f7f11d50a3a", - "System.Dynamic b03f5f7f11d50a3a", - "System.EnterpriseServices b03f5f7f11d50a3a", - "System.IdentityModel b77a5c561934e089", - "System.IdentityModel.Selectors b77a5c561934e089", - "System.IO.Log b03f5f7f11d50a3a", - "System.Management b03f5f7f11d50a3a", - "System.Management.Instrumentation b77a5c561934e089", - "System.Messaging b03f5f7f11d50a3a", - "System.Net b03f5f7f11d50a3a", - "System.Numerics b77a5c561934e089", - "System.Printing 31bf3856ad364e35", - "System.Runtime.Caching b03f5f7f11d50a3a", - "System.Runtime.DurableInstancing 31bf3856ad364e35", - "System.Runtime.Remoting b77a5c561934e089", - "System.Runtime.Serialization b77a5c561934e089", - "System.Runtime.Serialization.Formatters.Soap b03f5f7f11d50a3a", - "System.Security b03f5f7f11d50a3a", - "System.ServiceModel b77a5c561934e089", - "System.ServiceModel.Activation 31bf3856ad364e35", - "System.ServiceModel.Activities 31bf3856ad364e35", - "System.ServiceModel.Channels 31bf3856ad364e35", - "System.ServiceModel.Discovery 31bf3856ad364e35", - "System.ServiceModel.Install b77a5c561934e089", - "System.ServiceModel.Routing 31bf3856ad364e35", - "System.ServiceModel.WasHosting b77a5c561934e089", - "System.ServiceModel.Web 31bf3856ad364e35", - "System.ServiceProcess b03f5f7f11d50a3a", - "System.Speech 31bf3856ad364e35", - "System.Transactions b77a5c561934e089", - "System.Web b03f5f7f11d50a3a", - "System.Web.Abstractions 31bf3856ad364e35", - "System.Web.ApplicationServices 31bf3856ad364e35", - "System.Web.DataVisualization 31bf3856ad364e35", - "System.Web.DataVisualization.Design 31bf3856ad364e35", - "System.Web.DynamicData 31bf3856ad364e35", - "System.Web.DynamicData.Design 31bf3856ad364e35", - "System.Web.Entity b77a5c561934e089", - "System.Web.Entity.Design b77a5c561934e089", - "System.Web.Extensions 31bf3856ad364e35", - "System.Web.Extensions.Design 31bf3856ad364e35", - "System.Web.Mobile b03f5f7f11d50a3a", - "System.Web.RegularExpressions b03f5f7f11d50a3a", - "System.Web.Routing 31bf3856ad364e35", - "System.Web.Services b03f5f7f11d50a3a", - "System.Windows.Forms b77a5c561934e089", - "System.Windows.Forms.DataVisualization 31bf3856ad364e35", - "System.Windows.Forms.DataVisualization.Design 31bf3856ad364e35", - "System.Windows.Input.Manipulations b77a5c561934e089", - "System.Windows.Presentation b77a5c561934e089", - "System.Workflow.Activities 31bf3856ad364e35", - "System.Workflow.ComponentModel 31bf3856ad364e35", - "System.Workflow.Runtime 31bf3856ad364e35", - "System.WorkflowServices 31bf3856ad364e35", - "System.Xaml b77a5c561934e089", - "System.Xml b77a5c561934e089", - "System.Xml.Linq b77a5c561934e089", - "UIAutomationClient 31bf3856ad364e35", - "UIAutomationClientsideProviders 31bf3856ad364e35", - "UIAutomationProvider 31bf3856ad364e35", - "UIAutomationTypes 31bf3856ad364e35", - "WindowsBase 31bf3856ad364e35", - "WindowsFormsIntegration 31bf3856ad364e35", - "WsatConfig b03f5f7f11d50a3a", - "XamlBuildTask 31bf3856ad364e35", - }; - } - } -} +// Generated by DumpFrameworkAssemblyList tool + +namespace Xtensive.Orm.Weaver +{ + internal static class FrameworkAssemblyList + { + public static string[] Get() + { + return new[] { + "Accessibility b03f5f7f11d50a3a", + "AddInProcess b77a5c561934e089", + "AddInProcess32 b77a5c561934e089", + "AddInUtil b77a5c561934e089", + "ComSvcConfig b03f5f7f11d50a3a", + "CustomMarshalers b03f5f7f11d50a3a", + "DataSvcUtil b77a5c561934e089", + "EdmGen b77a5c561934e089", + "FSharp.Core b03f5f7f11d50a3a", + "infocard b77a5c561934e089", + "ISymWrapper b03f5f7f11d50a3a", + "Microsoft.Build b03f5f7f11d50a3a", + "Microsoft.Build.Conversion.v3.5 b03f5f7f11d50a3a", + "Microsoft.Build.Conversion.v4.0 b03f5f7f11d50a3a", + "Microsoft.Build.Engine b03f5f7f11d50a3a", + "Microsoft.Build.Framework b03f5f7f11d50a3a", + "Microsoft.Build.Tasks.v3.5 b03f5f7f11d50a3a", + "Microsoft.Build.Tasks.v4.0 b03f5f7f11d50a3a", + "Microsoft.Build.Utilities.v3.5 b03f5f7f11d50a3a", + "Microsoft.Build.Utilities.v4.0 b03f5f7f11d50a3a", + "Microsoft.CSharp b03f5f7f11d50a3a", + "Microsoft.Data.Entity.Build.Tasks b03f5f7f11d50a3a", + "Microsoft.JScript b03f5f7f11d50a3a", + "Microsoft.Transactions.Bridge b03f5f7f11d50a3a", + "Microsoft.Transactions.Bridge.Dtc b03f5f7f11d50a3a", + "Microsoft.VisualBasic b03f5f7f11d50a3a", + "Microsoft.VisualBasic.Compatibility b03f5f7f11d50a3a", + "Microsoft.VisualBasic.Compatibility.Data b03f5f7f11d50a3a", + "Microsoft.VisualC b03f5f7f11d50a3a", + "Microsoft.VisualC.STLCLR b03f5f7f11d50a3a", + "MSBuild b03f5f7f11d50a3a", + "mscorlib b77a5c561934e089", + "PresentationBuildTasks 31bf3856ad364e35", + "PresentationCFFRasterizer 31bf3856ad364e35", + "PresentationCore 31bf3856ad364e35", + "PresentationFramework 31bf3856ad364e35", + "PresentationFramework.Aero 31bf3856ad364e35", + "PresentationFramework.Classic 31bf3856ad364e35", + "PresentationFramework.Luna 31bf3856ad364e35", + "PresentationFramework.Royale 31bf3856ad364e35", + "PresentationUI 31bf3856ad364e35", + "ReachFramework 31bf3856ad364e35", + "Sentinel.v3.5Client b03f5f7f11d50a3a", + "ServiceModelReg b03f5f7f11d50a3a", + "SMSvcHost b03f5f7f11d50a3a", + "sysglobl b03f5f7f11d50a3a", + "System b77a5c561934e089", + "System.Activities 31bf3856ad364e35", + "System.Activities.Core.Presentation 31bf3856ad364e35", + "System.Activities.DurableInstancing 31bf3856ad364e35", + "System.Activities.Presentation 31bf3856ad364e35", + "System.AddIn b77a5c561934e089", + "System.AddIn.Contract b03f5f7f11d50a3a", + "System.ComponentModel.Composition b77a5c561934e089", + "System.ComponentModel.DataAnnotations 31bf3856ad364e35", + "System.Configuration b03f5f7f11d50a3a", + "System.Configuration.Install b03f5f7f11d50a3a", + "System.Core b77a5c561934e089", + "System.Data b77a5c561934e089", + "System.Data.DataSetExtensions b77a5c561934e089", + "System.Data.Entity b77a5c561934e089", + "System.Data.Entity.Design b77a5c561934e089", + "System.Data.Linq b77a5c561934e089", + "System.Data.OracleClient b77a5c561934e089", + "System.Data.Services b77a5c561934e089", + "System.Data.Services.Client b77a5c561934e089", + "System.Data.Services.Design b77a5c561934e089", + "System.Data.SqlXml b77a5c561934e089", + "System.Deployment b03f5f7f11d50a3a", + "System.Design b03f5f7f11d50a3a", + "System.Device b77a5c561934e089", + "System.DirectoryServices b03f5f7f11d50a3a", + "System.DirectoryServices.AccountManagement b77a5c561934e089", + "System.DirectoryServices.Protocols b03f5f7f11d50a3a", + "System.Drawing b03f5f7f11d50a3a", + "System.Drawing.Design b03f5f7f11d50a3a", + "System.Dynamic b03f5f7f11d50a3a", + "System.EnterpriseServices b03f5f7f11d50a3a", + "System.IdentityModel b77a5c561934e089", + "System.IdentityModel.Selectors b77a5c561934e089", + "System.IO.Log b03f5f7f11d50a3a", + "System.Management b03f5f7f11d50a3a", + "System.Management.Instrumentation b77a5c561934e089", + "System.Messaging b03f5f7f11d50a3a", + "System.Net b03f5f7f11d50a3a", + "System.Numerics b77a5c561934e089", + "System.Printing 31bf3856ad364e35", + "System.Runtime.Caching b03f5f7f11d50a3a", + "System.Runtime.DurableInstancing 31bf3856ad364e35", + "System.Runtime.Remoting b77a5c561934e089", + "System.Runtime.Serialization b77a5c561934e089", + "System.Runtime.Serialization.Formatters.Soap b03f5f7f11d50a3a", + "System.Security b03f5f7f11d50a3a", + "System.ServiceModel b77a5c561934e089", + "System.ServiceModel.Activation 31bf3856ad364e35", + "System.ServiceModel.Activities 31bf3856ad364e35", + "System.ServiceModel.Channels 31bf3856ad364e35", + "System.ServiceModel.Discovery 31bf3856ad364e35", + "System.ServiceModel.Install b77a5c561934e089", + "System.ServiceModel.Routing 31bf3856ad364e35", + "System.ServiceModel.WasHosting b77a5c561934e089", + "System.ServiceModel.Web 31bf3856ad364e35", + "System.ServiceProcess b03f5f7f11d50a3a", + "System.Speech 31bf3856ad364e35", + "System.Transactions b77a5c561934e089", + "System.Web b03f5f7f11d50a3a", + "System.Web.Abstractions 31bf3856ad364e35", + "System.Web.ApplicationServices 31bf3856ad364e35", + "System.Web.DataVisualization 31bf3856ad364e35", + "System.Web.DataVisualization.Design 31bf3856ad364e35", + "System.Web.DynamicData 31bf3856ad364e35", + "System.Web.DynamicData.Design 31bf3856ad364e35", + "System.Web.Entity b77a5c561934e089", + "System.Web.Entity.Design b77a5c561934e089", + "System.Web.Extensions 31bf3856ad364e35", + "System.Web.Extensions.Design 31bf3856ad364e35", + "System.Web.Mobile b03f5f7f11d50a3a", + "System.Web.RegularExpressions b03f5f7f11d50a3a", + "System.Web.Routing 31bf3856ad364e35", + "System.Web.Services b03f5f7f11d50a3a", + "System.Windows.Forms b77a5c561934e089", + "System.Windows.Forms.DataVisualization 31bf3856ad364e35", + "System.Windows.Forms.DataVisualization.Design 31bf3856ad364e35", + "System.Windows.Input.Manipulations b77a5c561934e089", + "System.Windows.Presentation b77a5c561934e089", + "System.Workflow.Activities 31bf3856ad364e35", + "System.Workflow.ComponentModel 31bf3856ad364e35", + "System.Workflow.Runtime 31bf3856ad364e35", + "System.WorkflowServices 31bf3856ad364e35", + "System.Xaml b77a5c561934e089", + "System.Xml b77a5c561934e089", + "System.Xml.Linq b77a5c561934e089", + "UIAutomationClient 31bf3856ad364e35", + "UIAutomationClientsideProviders 31bf3856ad364e35", + "UIAutomationProvider 31bf3856ad364e35", + "UIAutomationTypes 31bf3856ad364e35", + "WindowsBase 31bf3856ad364e35", + "WindowsFormsIntegration 31bf3856ad364e35", + "WsatConfig b03f5f7f11d50a3a", + "XamlBuildTask 31bf3856ad364e35", + }; + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/Internals/CsPropertyChecker.cs b/Weaver/Xtensive.Orm.Weaver/Internals/CsPropertyChecker.cs index 6a27e879c6..97a64c85b6 100644 --- a/Weaver/Xtensive.Orm.Weaver/Internals/CsPropertyChecker.cs +++ b/Weaver/Xtensive.Orm.Weaver/Internals/CsPropertyChecker.cs @@ -1,43 +1,43 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.06.23 - -namespace Xtensive.Orm.Weaver -{ - /// - /// Property checker for CSharp language. - /// - internal sealed class CsPropertyChecker : IPersistentPropertyChecker - { - /// - public bool HasSkippedProperties { get; private set; } - - /// - public bool ShouldProcess(PropertyInfo property, ProcessorContext context) - { - if (property.IsAutomatic) - return true; - var def = property.Definition; - var getter = def.GetMethod; - var setter = def.SetMethod; - - var baseMethod = getter ?? setter; - - // if the property has a human made body we shouldn't touch them - if (!baseMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute)) - return false; - - // if it's compiler-generated property though - // we should check it contains both getter and setter - // otherwise the whole idea is corrupted - if (getter==null || setter==null) { - context.Logger.Write(MessageCode.WarningPersistentPropertyHasNoSetterOrGetter, string.Format("'{0}' property of '{1}' type", property.Name, property.DeclaringType.FullName)); - HasSkippedProperties = true; - return false; - } - return true; - } - } +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.06.23 + +namespace Xtensive.Orm.Weaver +{ + /// + /// Property checker for CSharp language. + /// + internal sealed class CsPropertyChecker : IPersistentPropertyChecker + { + /// + public bool HasSkippedProperties { get; private set; } + + /// + public bool ShouldProcess(PropertyInfo property, ProcessorContext context) + { + if (property.IsAutomatic) + return true; + var def = property.Definition; + var getter = def.GetMethod; + var setter = def.SetMethod; + + var baseMethod = getter ?? setter; + + // if the property has a human made body we shouldn't touch them + if (!baseMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute)) + return false; + + // if it's compiler-generated property though + // we should check it contains both getter and setter + // otherwise the whole idea is corrupted + if (getter==null || setter==null) { + context.Logger.Write(MessageCode.WarningPersistentPropertyHasNoSetterOrGetter, string.Format("'{0}' property of '{1}' type", property.Name, property.DeclaringType.FullName)); + HasSkippedProperties = true; + return false; + } + return true; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Internals/IPersistentPropertyChecker.cs b/Weaver/Xtensive.Orm.Weaver/Internals/IPersistentPropertyChecker.cs index 1228136cbf..7a37591be0 100644 --- a/Weaver/Xtensive.Orm.Weaver/Internals/IPersistentPropertyChecker.cs +++ b/Weaver/Xtensive.Orm.Weaver/Internals/IPersistentPropertyChecker.cs @@ -1,27 +1,27 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.06.23 - -namespace Xtensive.Orm.Weaver -{ - /// - /// Declares API of persistent property checher - /// - internal interface IPersistentPropertyChecker - { - /// - /// Returns whether there were some properties used to be processed but have to be skiped for some reason - /// - bool HasSkippedProperties { get; } - - /// - /// Checks whether the property should be processed. - /// - /// Property information. - /// Processor context. - /// Result of check - bool ShouldProcess(PropertyInfo property, ProcessorContext context); - } +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.06.23 + +namespace Xtensive.Orm.Weaver +{ + /// + /// Declares API of persistent property checher + /// + internal interface IPersistentPropertyChecker + { + /// + /// Returns whether there were some properties used to be processed but have to be skiped for some reason + /// + bool HasSkippedProperties { get; } + + /// + /// Checks whether the property should be processed. + /// + /// Property information. + /// Processor context. + /// Result of check + bool ShouldProcess(PropertyInfo property, ProcessorContext context); + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Internals/VbPropertyChecker.cs b/Weaver/Xtensive.Orm.Weaver/Internals/VbPropertyChecker.cs index f435acef9a..9473b3da9f 100644 --- a/Weaver/Xtensive.Orm.Weaver/Internals/VbPropertyChecker.cs +++ b/Weaver/Xtensive.Orm.Weaver/Internals/VbPropertyChecker.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Alexey Kulakov -// Created: 2018.06.23 - -namespace Xtensive.Orm.Weaver -{ - /// - /// Property checker for Non-CSharp languages. - /// - internal sealed class VbPropertyChecker : IPersistentPropertyChecker - { - /// - public bool HasSkippedProperties {get { return false; }} - - /// - public bool ShouldProcess(PropertyInfo property, ProcessorContext context) - { - return property.IsAutomatic; - } - } +// Copyright (C) 2018 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Alexey Kulakov +// Created: 2018.06.23 + +namespace Xtensive.Orm.Weaver +{ + /// + /// Property checker for Non-CSharp languages. + /// + internal sealed class VbPropertyChecker : IPersistentPropertyChecker + { + /// + public bool HasSkippedProperties {get { return false; }} + + /// + public bool ShouldProcess(PropertyInfo property, ProcessorContext context) + { + return property.IsAutomatic; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/MessageCode.cs b/Weaver/Xtensive.Orm.Weaver/MessageCode.cs index 4f79179f20..bf37ad9d9d 100644 --- a/Weaver/Xtensive.Orm.Weaver/MessageCode.cs +++ b/Weaver/Xtensive.Orm.Weaver/MessageCode.cs @@ -1,28 +1,28 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public enum MessageCode - { - Unknown = 0, - - ErrorInternal = 1, - ErrorInputFileIsNotFound = 2 , - ErrorStrongNameKeyIsNotFound = 3, - ErrorUnableToLocateOrmAssembly = 4, - ErrorUnableToFindReferencedAssembly = 5, - ErrorUnableToRemoveBackingField = 6, - ErrorEntityLimitIsExceeded = 7, - ErrorLicenseIsInvalid = 8, - ErrorSubscriptionExpired = 9, - ErrorPersistentPropertiesWereNotProcessed = 10, - - WarningDebugSymbolsFileIsNotFound = 1000, - WarningReferencedAssemblyFileIsNotFound = 1001, - WarningPersistentPropertyHasNoSetterOrGetter =1002, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public enum MessageCode + { + Unknown = 0, + + ErrorInternal = 1, + ErrorInputFileIsNotFound = 2 , + ErrorStrongNameKeyIsNotFound = 3, + ErrorUnableToLocateOrmAssembly = 4, + ErrorUnableToFindReferencedAssembly = 5, + ErrorUnableToRemoveBackingField = 6, + ErrorEntityLimitIsExceeded = 7, + ErrorLicenseIsInvalid = 8, + ErrorSubscriptionExpired = 9, + ErrorPersistentPropertiesWereNotProcessed = 10, + + WarningDebugSymbolsFileIsNotFound = 1000, + WarningReferencedAssemblyFileIsNotFound = 1001, + WarningPersistentPropertyHasNoSetterOrGetter =1002, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/MessageLocation.cs b/Weaver/Xtensive.Orm.Weaver/MessageLocation.cs index b308d92a2c..79448f961b 100644 --- a/Weaver/Xtensive.Orm.Weaver/MessageLocation.cs +++ b/Weaver/Xtensive.Orm.Weaver/MessageLocation.cs @@ -1,46 +1,46 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System.Globalization; - -namespace Xtensive.Orm.Weaver -{ - public sealed class MessageLocation - { - private readonly string file; - private readonly int line; - private readonly int column; - - public string File - { - get { return file; } - } - - public int Line - { - get { return line; } - } - - public int Column - { - get { return column; } - } - - public override string ToString() - { - return string.IsNullOrEmpty(File) - ? "" - : string.Format(CultureInfo.InvariantCulture, "{0}({1},{2})", file, line, column); - } - - public MessageLocation(string file = null, int line = 0, int column = 0) - { - this.file = file; - this.line = line; - this.column = column; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System.Globalization; + +namespace Xtensive.Orm.Weaver +{ + public sealed class MessageLocation + { + private readonly string file; + private readonly int line; + private readonly int column; + + public string File + { + get { return file; } + } + + public int Line + { + get { return line; } + } + + public int Column + { + get { return column; } + } + + public override string ToString() + { + return string.IsNullOrEmpty(File) + ? "" + : string.Format(CultureInfo.InvariantCulture, "{0}({1},{2})", file, line, column); + } + + public MessageLocation(string file = null, int line = 0, int column = 0) + { + this.file = file; + this.line = line; + this.column = column; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/MessageLogger.cs b/Weaver/Xtensive.Orm.Weaver/MessageLogger.cs index 8ce6b82659..8da5641f49 100644 --- a/Weaver/Xtensive.Orm.Weaver/MessageLogger.cs +++ b/Weaver/Xtensive.Orm.Weaver/MessageLogger.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; -using System.Globalization; - -namespace Xtensive.Orm.Weaver -{ - public sealed class MessageLogger - { - private static readonly Dictionary Messages; - - private readonly MessageWriter writer; - - public void Write(MessageCode code) - { - Write(code, null, null, null); - } - - public void Write(MessageCode code, MessageLocation location) - { - Write(code, null, location, null); - } - - public void Write(MessageCode code, string extraInformation) - { - Write(code, extraInformation, null, null); - } - - public void Write(MessageCode code, string extraInformation, MessageLocation location) - { - Write(code, extraInformation, location, null); - } - - public void Write(MessageCode code, Exception exception) - { - Write(code, exception.Message, null, exception); - } - - public void Write(MessageCode code, string extraInformation, MessageLocation location, Exception exception) - { - string description; - if (!Messages.TryGetValue(code, out description)) - throw new ArgumentOutOfRangeException("code"); - - var messageCode = string.Format(CultureInfo.InvariantCulture, "XW{0:0000}", (int) code); - var messageText = string.IsNullOrEmpty(extraInformation) - ? description - : string.Format("{0}: {1}", description, extraInformation); - - var message = new ProcessorMessage { - MessageCode = messageCode, - MessageText = messageText, - Location = location, - Type = GetMessageType(code), - Exception = exception - }; - - writer.Write(message); - } - - private static MessageType GetMessageType(MessageCode code) - { - var value = (int) code; - return value >= 1000 ? MessageType.Warning : MessageType.Error; - } - - private static void RegisterMessage(MessageCode code, string description) - { - Messages.Add(code, description); - } - - public MessageLogger(MessageWriter writer) - { - if (writer==null) - throw new ArgumentNullException("writer"); - this.writer = writer; - } - - static MessageLogger() - { - Messages = new Dictionary(); - - RegisterMessage(MessageCode.ErrorInternal, "Internal error"); - RegisterMessage(MessageCode.ErrorInputFileIsNotFound, "Input file is not found"); - RegisterMessage(MessageCode.ErrorStrongNameKeyIsNotFound, "Strong name key file is not found"); - RegisterMessage(MessageCode.ErrorUnableToLocateOrmAssembly, "Unable to locate Xtensive.Orm assembly"); - RegisterMessage(MessageCode.ErrorUnableToFindReferencedAssembly, "Unable to find referenced assembly"); - RegisterMessage(MessageCode.ErrorUnableToRemoveBackingField, "Unable to remove backing field"); - RegisterMessage(MessageCode.ErrorEntityLimitIsExceeded, - "Number of persistent types in assembly exceeds the maximal available types per assembly for Community Edition. " + - "Consider upgrading to any commercial edition of DataObjects.Net."); - RegisterMessage(MessageCode.ErrorLicenseIsInvalid, "DataObjects.Net license is invalid."); - RegisterMessage(MessageCode.ErrorSubscriptionExpired, - "Your subscription expired and is not valid for this release of DataObjects.Net."); - RegisterMessage(MessageCode.ErrorPersistentPropertiesWereNotProcessed, "Some of perstistent properties were not processed. Check warnings for details."); - - - RegisterMessage(MessageCode.WarningDebugSymbolsFileIsNotFound, "Debug symbols file is not found"); - RegisterMessage(MessageCode.WarningReferencedAssemblyFileIsNotFound, "Referenced assembly file is not found"); - RegisterMessage(MessageCode.WarningPersistentPropertyHasNoSetterOrGetter, "Persistent property was skipped due to it has no setter or getter"); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace Xtensive.Orm.Weaver +{ + public sealed class MessageLogger + { + private static readonly Dictionary Messages; + + private readonly MessageWriter writer; + + public void Write(MessageCode code) + { + Write(code, null, null, null); + } + + public void Write(MessageCode code, MessageLocation location) + { + Write(code, null, location, null); + } + + public void Write(MessageCode code, string extraInformation) + { + Write(code, extraInformation, null, null); + } + + public void Write(MessageCode code, string extraInformation, MessageLocation location) + { + Write(code, extraInformation, location, null); + } + + public void Write(MessageCode code, Exception exception) + { + Write(code, exception.Message, null, exception); + } + + public void Write(MessageCode code, string extraInformation, MessageLocation location, Exception exception) + { + string description; + if (!Messages.TryGetValue(code, out description)) + throw new ArgumentOutOfRangeException("code"); + + var messageCode = string.Format(CultureInfo.InvariantCulture, "XW{0:0000}", (int) code); + var messageText = string.IsNullOrEmpty(extraInformation) + ? description + : string.Format("{0}: {1}", description, extraInformation); + + var message = new ProcessorMessage { + MessageCode = messageCode, + MessageText = messageText, + Location = location, + Type = GetMessageType(code), + Exception = exception + }; + + writer.Write(message); + } + + private static MessageType GetMessageType(MessageCode code) + { + var value = (int) code; + return value >= 1000 ? MessageType.Warning : MessageType.Error; + } + + private static void RegisterMessage(MessageCode code, string description) + { + Messages.Add(code, description); + } + + public MessageLogger(MessageWriter writer) + { + if (writer==null) + throw new ArgumentNullException("writer"); + this.writer = writer; + } + + static MessageLogger() + { + Messages = new Dictionary(); + + RegisterMessage(MessageCode.ErrorInternal, "Internal error"); + RegisterMessage(MessageCode.ErrorInputFileIsNotFound, "Input file is not found"); + RegisterMessage(MessageCode.ErrorStrongNameKeyIsNotFound, "Strong name key file is not found"); + RegisterMessage(MessageCode.ErrorUnableToLocateOrmAssembly, "Unable to locate Xtensive.Orm assembly"); + RegisterMessage(MessageCode.ErrorUnableToFindReferencedAssembly, "Unable to find referenced assembly"); + RegisterMessage(MessageCode.ErrorUnableToRemoveBackingField, "Unable to remove backing field"); + RegisterMessage(MessageCode.ErrorEntityLimitIsExceeded, + "Number of persistent types in assembly exceeds the maximal available types per assembly for Community Edition. " + + "Consider upgrading to any commercial edition of DataObjects.Net."); + RegisterMessage(MessageCode.ErrorLicenseIsInvalid, "DataObjects.Net license is invalid."); + RegisterMessage(MessageCode.ErrorSubscriptionExpired, + "Your subscription expired and is not valid for this release of DataObjects.Net."); + RegisterMessage(MessageCode.ErrorPersistentPropertiesWereNotProcessed, "Some of perstistent properties were not processed. Check warnings for details."); + + + RegisterMessage(MessageCode.WarningDebugSymbolsFileIsNotFound, "Debug symbols file is not found"); + RegisterMessage(MessageCode.WarningReferencedAssemblyFileIsNotFound, "Referenced assembly file is not found"); + RegisterMessage(MessageCode.WarningPersistentPropertyHasNoSetterOrGetter, "Persistent property was skipped due to it has no setter or getter"); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/MessageType.cs b/Weaver/Xtensive.Orm.Weaver/MessageType.cs index 80fb772f43..53b9055445 100644 --- a/Weaver/Xtensive.Orm.Weaver/MessageType.cs +++ b/Weaver/Xtensive.Orm.Weaver/MessageType.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public enum MessageType - { - Error, - Warning, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public enum MessageType + { + Error, + Warning, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/MessageWriter.cs b/Weaver/Xtensive.Orm.Weaver/MessageWriter.cs index 34dc6180fa..7598468e7f 100644 --- a/Weaver/Xtensive.Orm.Weaver/MessageWriter.cs +++ b/Weaver/Xtensive.Orm.Weaver/MessageWriter.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public abstract class MessageWriter - { - public abstract void Write(ProcessorMessage message); - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public abstract class MessageWriter + { + public abstract void Write(ProcessorMessage message); + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/NetStandardAssemblyList.cs b/Weaver/Xtensive.Orm.Weaver/NetStandardAssemblyList.cs index 73cc8c7bc8..235bc7583e 100644 --- a/Weaver/Xtensive.Orm.Weaver/NetStandardAssemblyList.cs +++ b/Weaver/Xtensive.Orm.Weaver/NetStandardAssemblyList.cs @@ -1,124 +1,124 @@ -namespace Xtensive.Orm.Weaver -{ - internal static class NetStandardAssemblyList - { - public static string[] Get() - { - return new[] { - "Microsoft.Win32.Primitives b03f5f7f11d50a3a", - "mscorlib b77a5c561934e089", - "netstandard cc7b13ffcd2ddd51", - "System.AppContext b03f5f7f11d50a3a", - "System.Collections.Concurrent b03f5f7f11d50a3a", - "System.Collections b03f5f7f11d50a3a", - "System.Collections.NonGeneric b03f5f7f11d50a3a", - "System.Collections.Specialized b03f5f7f11d50a3a", - "System.ComponentModel.Composition b77a5c561934e089", - "System.ComponentModel b03f5f7f11d50a3a", - "System.ComponentModel.EventBasedAsync b03f5f7f11d50a3a", - "System.ComponentModel.Primitives b03f5f7f11d50a3a", - "System.ComponentModel.TypeConverter b03f5f7f11d50a3a", - "System.Console b03f5f7f11d50a3a", - "System.Core b77a5c561934e089", - "System.Data.Common b03f5f7f11d50a3a", - "System.Data b77a5c561934e089", - "System.Diagnostics.Contracts b03f5f7f11d50a3a", - "System.Diagnostics.Debug b03f5f7f11d50a3a", - "System.Diagnostics.FileVersionInfo b03f5f7f11d50a3a", - "System.Diagnostics.Process b03f5f7f11d50a3a", - "System.Diagnostics.StackTrace b03f5f7f11d50a3a", - "System.Diagnostics.TextWriterTraceListener b03f5f7f11d50a3a", - "System.Diagnostics.Tools b03f5f7f11d50a3a", - "System.Diagnostics.TraceSource b03f5f7f11d50a3a", - "System.Diagnostics.Tracing b03f5f7f11d50a3a", - "System b77a5c561934e089", - "System.Drawing b03f5f7f11d50a3a", - "System.Drawing.Primitives b03f5f7f11d50a3a", - "System.Dynamic.Runtime b03f5f7f11d50a3a", - "System.Globalization.Calendars b03f5f7f11d50a3a", - "System.Globalization b03f5f7f11d50a3a", - "System.Globalization.Extensions b03f5f7f11d50a3a", - "System.IO.Compression b77a5c561934e089", - "System.IO.Compression.FileSystem b77a5c561934e089", - "System.IO.Compression.ZipFile b77a5c561934e089", - "System.IO b03f5f7f11d50a3a", - "System.IO.FileSystem b03f5f7f11d50a3a", - "System.IO.FileSystem.DriveInfo b03f5f7f11d50a3a", - "System.IO.FileSystem.Primitives b03f5f7f11d50a3a", - "System.IO.FileSystem.Watcher b03f5f7f11d50a3a", - "System.IO.IsolatedStorage b03f5f7f11d50a3a", - "System.IO.MemoryMappedFiles b03f5f7f11d50a3a", - "System.IO.Pipes b03f5f7f11d50a3a", - "System.IO.UnmanagedMemoryStream b03f5f7f11d50a3a", - "System.Linq b03f5f7f11d50a3a", - "System.Linq.Expressions b03f5f7f11d50a3a", - "System.Linq.Parallel b03f5f7f11d50a3a", - "System.Linq.Queryable b03f5f7f11d50a3a", - "System.Net b03f5f7f11d50a3a", - "System.Net.Http b03f5f7f11d50a3a", - "System.Net.NameResolution b03f5f7f11d50a3a", - "System.Net.NetworkInformation b03f5f7f11d50a3a", - "System.Net.Ping b03f5f7f11d50a3a", - "System.Net.Primitives b03f5f7f11d50a3a", - "System.Net.Requests b03f5f7f11d50a3a", - "System.Net.Security b03f5f7f11d50a3a", - "System.Net.Sockets b03f5f7f11d50a3a", - "System.Net.WebHeaderCollection b03f5f7f11d50a3a", - "System.Net.WebSockets.Client b03f5f7f11d50a3a", - "System.Net.WebSockets b03f5f7f11d50a3a", - "System.Numerics b77a5c561934e089", - "System.ObjectModel b03f5f7f11d50a3a", - "System.Reflection b03f5f7f11d50a3a", - "System.Reflection.Extensions b03f5f7f11d50a3a", - "System.Reflection.Primitives b03f5f7f11d50a3a", - "System.Resources.Reader b03f5f7f11d50a3a", - "System.Resources.ResourceManager b03f5f7f11d50a3a", - "System.Resources.Writer b03f5f7f11d50a3a", - "System.Runtime.CompilerServices.VisualC b03f5f7f11d50a3a", - "System.Runtime b03f5f7f11d50a3a", - "System.Runtime.Extensions b03f5f7f11d50a3a", - "System.Runtime.Handles b03f5f7f11d50a3a", - "System.Runtime.InteropServices b03f5f7f11d50a3a", - "System.Runtime.InteropServices.RuntimeInformation b03f5f7f11d50a3a", - "System.Runtime.Numerics b03f5f7f11d50a3a", - "System.Runtime.Serialization b77a5c561934e089", - "System.Runtime.Serialization.Formatters b03f5f7f11d50a3a", - "System.Runtime.Serialization.Json b03f5f7f11d50a3a", - "System.Runtime.Serialization.Primitives b03f5f7f11d50a3a", - "System.Runtime.Serialization.Xml b03f5f7f11d50a3a", - "System.Security.Claims b03f5f7f11d50a3a", - "System.Security.Cryptography.Algorithms b03f5f7f11d50a3a", - "System.Security.Cryptography.Csp b03f5f7f11d50a3a", - "System.Security.Cryptography.Encoding b03f5f7f11d50a3a", - "System.Security.Cryptography.Primitives b03f5f7f11d50a3a", - "System.Security.Cryptography.X509Certificates b03f5f7f11d50a3a", - "System.Security.Principal b03f5f7f11d50a3a", - "System.Security.SecureString b03f5f7f11d50a3a", - "System.ServiceModel.Web 31bf3856ad364e35", - "System.Text.Encoding b03f5f7f11d50a3a", - "System.Text.Encoding.Extensions b03f5f7f11d50a3a", - "System.Text.RegularExpressions b03f5f7f11d50a3a", - "System.Threading b03f5f7f11d50a3a", - "System.Threading.Overlapped b03f5f7f11d50a3a", - "System.Threading.Tasks b03f5f7f11d50a3a", - "System.Threading.Tasks.Parallel b03f5f7f11d50a3a", - "System.Threading.Thread b03f5f7f11d50a3a", - "System.Threading.ThreadPool b03f5f7f11d50a3a", - "System.Threading.Timer b03f5f7f11d50a3a", - "System.Transactions b77a5c561934e089", - "System.ValueTuple cc7b13ffcd2ddd51", - "System.Web b03f5f7f11d50a3a", - "System.Windows b03f5f7f11d50a3a", - "System.Xml b77a5c561934e089", - "System.Xml.Linq b77a5c561934e089", - "System.Xml.ReaderWriter b03f5f7f11d50a3a", - "System.Xml.Serialization b77a5c561934e089", - "System.Xml.XDocument b03f5f7f11d50a3a", - "System.Xml.XmlDocument b03f5f7f11d50a3a", - "System.Xml.XmlSerializer b03f5f7f11d50a3a", - "System.Xml.XPath b03f5f7f11d50a3a", - "System.Xml.XPath.XDocument b03f5f7f11d50a3a", - }; - } - } +namespace Xtensive.Orm.Weaver +{ + internal static class NetStandardAssemblyList + { + public static string[] Get() + { + return new[] { + "Microsoft.Win32.Primitives b03f5f7f11d50a3a", + "mscorlib b77a5c561934e089", + "netstandard cc7b13ffcd2ddd51", + "System.AppContext b03f5f7f11d50a3a", + "System.Collections.Concurrent b03f5f7f11d50a3a", + "System.Collections b03f5f7f11d50a3a", + "System.Collections.NonGeneric b03f5f7f11d50a3a", + "System.Collections.Specialized b03f5f7f11d50a3a", + "System.ComponentModel.Composition b77a5c561934e089", + "System.ComponentModel b03f5f7f11d50a3a", + "System.ComponentModel.EventBasedAsync b03f5f7f11d50a3a", + "System.ComponentModel.Primitives b03f5f7f11d50a3a", + "System.ComponentModel.TypeConverter b03f5f7f11d50a3a", + "System.Console b03f5f7f11d50a3a", + "System.Core b77a5c561934e089", + "System.Data.Common b03f5f7f11d50a3a", + "System.Data b77a5c561934e089", + "System.Diagnostics.Contracts b03f5f7f11d50a3a", + "System.Diagnostics.Debug b03f5f7f11d50a3a", + "System.Diagnostics.FileVersionInfo b03f5f7f11d50a3a", + "System.Diagnostics.Process b03f5f7f11d50a3a", + "System.Diagnostics.StackTrace b03f5f7f11d50a3a", + "System.Diagnostics.TextWriterTraceListener b03f5f7f11d50a3a", + "System.Diagnostics.Tools b03f5f7f11d50a3a", + "System.Diagnostics.TraceSource b03f5f7f11d50a3a", + "System.Diagnostics.Tracing b03f5f7f11d50a3a", + "System b77a5c561934e089", + "System.Drawing b03f5f7f11d50a3a", + "System.Drawing.Primitives b03f5f7f11d50a3a", + "System.Dynamic.Runtime b03f5f7f11d50a3a", + "System.Globalization.Calendars b03f5f7f11d50a3a", + "System.Globalization b03f5f7f11d50a3a", + "System.Globalization.Extensions b03f5f7f11d50a3a", + "System.IO.Compression b77a5c561934e089", + "System.IO.Compression.FileSystem b77a5c561934e089", + "System.IO.Compression.ZipFile b77a5c561934e089", + "System.IO b03f5f7f11d50a3a", + "System.IO.FileSystem b03f5f7f11d50a3a", + "System.IO.FileSystem.DriveInfo b03f5f7f11d50a3a", + "System.IO.FileSystem.Primitives b03f5f7f11d50a3a", + "System.IO.FileSystem.Watcher b03f5f7f11d50a3a", + "System.IO.IsolatedStorage b03f5f7f11d50a3a", + "System.IO.MemoryMappedFiles b03f5f7f11d50a3a", + "System.IO.Pipes b03f5f7f11d50a3a", + "System.IO.UnmanagedMemoryStream b03f5f7f11d50a3a", + "System.Linq b03f5f7f11d50a3a", + "System.Linq.Expressions b03f5f7f11d50a3a", + "System.Linq.Parallel b03f5f7f11d50a3a", + "System.Linq.Queryable b03f5f7f11d50a3a", + "System.Net b03f5f7f11d50a3a", + "System.Net.Http b03f5f7f11d50a3a", + "System.Net.NameResolution b03f5f7f11d50a3a", + "System.Net.NetworkInformation b03f5f7f11d50a3a", + "System.Net.Ping b03f5f7f11d50a3a", + "System.Net.Primitives b03f5f7f11d50a3a", + "System.Net.Requests b03f5f7f11d50a3a", + "System.Net.Security b03f5f7f11d50a3a", + "System.Net.Sockets b03f5f7f11d50a3a", + "System.Net.WebHeaderCollection b03f5f7f11d50a3a", + "System.Net.WebSockets.Client b03f5f7f11d50a3a", + "System.Net.WebSockets b03f5f7f11d50a3a", + "System.Numerics b77a5c561934e089", + "System.ObjectModel b03f5f7f11d50a3a", + "System.Reflection b03f5f7f11d50a3a", + "System.Reflection.Extensions b03f5f7f11d50a3a", + "System.Reflection.Primitives b03f5f7f11d50a3a", + "System.Resources.Reader b03f5f7f11d50a3a", + "System.Resources.ResourceManager b03f5f7f11d50a3a", + "System.Resources.Writer b03f5f7f11d50a3a", + "System.Runtime.CompilerServices.VisualC b03f5f7f11d50a3a", + "System.Runtime b03f5f7f11d50a3a", + "System.Runtime.Extensions b03f5f7f11d50a3a", + "System.Runtime.Handles b03f5f7f11d50a3a", + "System.Runtime.InteropServices b03f5f7f11d50a3a", + "System.Runtime.InteropServices.RuntimeInformation b03f5f7f11d50a3a", + "System.Runtime.Numerics b03f5f7f11d50a3a", + "System.Runtime.Serialization b77a5c561934e089", + "System.Runtime.Serialization.Formatters b03f5f7f11d50a3a", + "System.Runtime.Serialization.Json b03f5f7f11d50a3a", + "System.Runtime.Serialization.Primitives b03f5f7f11d50a3a", + "System.Runtime.Serialization.Xml b03f5f7f11d50a3a", + "System.Security.Claims b03f5f7f11d50a3a", + "System.Security.Cryptography.Algorithms b03f5f7f11d50a3a", + "System.Security.Cryptography.Csp b03f5f7f11d50a3a", + "System.Security.Cryptography.Encoding b03f5f7f11d50a3a", + "System.Security.Cryptography.Primitives b03f5f7f11d50a3a", + "System.Security.Cryptography.X509Certificates b03f5f7f11d50a3a", + "System.Security.Principal b03f5f7f11d50a3a", + "System.Security.SecureString b03f5f7f11d50a3a", + "System.ServiceModel.Web 31bf3856ad364e35", + "System.Text.Encoding b03f5f7f11d50a3a", + "System.Text.Encoding.Extensions b03f5f7f11d50a3a", + "System.Text.RegularExpressions b03f5f7f11d50a3a", + "System.Threading b03f5f7f11d50a3a", + "System.Threading.Overlapped b03f5f7f11d50a3a", + "System.Threading.Tasks b03f5f7f11d50a3a", + "System.Threading.Tasks.Parallel b03f5f7f11d50a3a", + "System.Threading.Thread b03f5f7f11d50a3a", + "System.Threading.ThreadPool b03f5f7f11d50a3a", + "System.Threading.Timer b03f5f7f11d50a3a", + "System.Transactions b77a5c561934e089", + "System.ValueTuple cc7b13ffcd2ddd51", + "System.Web b03f5f7f11d50a3a", + "System.Windows b03f5f7f11d50a3a", + "System.Xml b77a5c561934e089", + "System.Xml.Linq b77a5c561934e089", + "System.Xml.ReaderWriter b03f5f7f11d50a3a", + "System.Xml.Serialization b77a5c561934e089", + "System.Xml.XDocument b03f5f7f11d50a3a", + "System.Xml.XmlDocument b03f5f7f11d50a3a", + "System.Xml.XmlSerializer b03f5f7f11d50a3a", + "System.Xml.XPath b03f5f7f11d50a3a", + "System.Xml.XPath.XDocument b03f5f7f11d50a3a", + }; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/PersistentTypeKind.cs b/Weaver/Xtensive.Orm.Weaver/PersistentTypeKind.cs index 58c4c969df..8a4add66c1 100644 --- a/Weaver/Xtensive.Orm.Weaver/PersistentTypeKind.cs +++ b/Weaver/Xtensive.Orm.Weaver/PersistentTypeKind.cs @@ -1,17 +1,17 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -namespace Xtensive.Orm.Weaver -{ - public enum PersistentTypeKind - { - None, - Entity, - EntitySet, - EntityInterface, - Structure, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +namespace Xtensive.Orm.Weaver +{ + public enum PersistentTypeKind + { + None, + Entity, + EntitySet, + EntityInterface, + Structure, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ProcessorConfiguration.cs b/Weaver/Xtensive.Orm.Weaver/ProcessorConfiguration.cs index c0a890d0bb..b35d7a65ed 100644 --- a/Weaver/Xtensive.Orm.Weaver/ProcessorConfiguration.cs +++ b/Weaver/Xtensive.Orm.Weaver/ProcessorConfiguration.cs @@ -1,177 +1,177 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; - -namespace Xtensive.Orm.Weaver -{ - public sealed class ProcessorConfiguration - { - private static class Parser - { - private const string WriteStatus = "status"; - private const string WriteStamp = "stamp"; - private const string MakeBackup = "backup"; - private const string ProcessDebugSymbols = "pdb"; - - private const string InputFile = "input"; - private const string OutputFile = "output"; - private const string StrongNameKey = "snk"; - private const string ProjectType = "type"; - private const string ReferencedAssembly = "r"; - - private static readonly char[] KeyValueSeparators = new[] {':', '='}; - - private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; - - public static bool Parse(ProcessorConfiguration configuration, string item) - { - if (Comparer.Equals(item, MakeBackup)) { - configuration.MakeBackup = true; - return true; - } - - if (Comparer.Equals(item, WriteStatus)) { - configuration.WriteStatusFile = true; - return true; - } - - if (Comparer.Equals(item, WriteStamp)) { - configuration.WriteStampFile = true; - return true; - } - - if (Comparer.Equals(item, ProcessDebugSymbols)) { - configuration.ProcessDebugSymbols = true; - return true; - } - - string key; - string value; - - if (!ParseKeyValue(item, out key, out value)) - return false; - - if (Comparer.Equals(key, InputFile)) { - configuration.InputFile = value; - return true; - } - - if (Comparer.Equals(key, OutputFile)) { - configuration.OutputFile = value; - return true; - } - - if (Comparer.Equals(key, StrongNameKey)) { - configuration.StrongNameKey = value; - return true; - } - - if (Comparer.Equals(key, ProjectType)) { - configuration.ProjectType = value; - return true; - } - - if (Comparer.Equals(key, ReferencedAssembly)) { - configuration.ReferencedAssemblies.Add(value); - return true; - } - - return false; - } - - private static bool ParseKeyValue(string item, out string key, out string value) - { - var position = item.IndexOfAny(KeyValueSeparators); - if (position < 0 || position > item.Length - 2) { - key = null; - value = null; - return false; - } - key = item.Substring(0, position); - value = item.Substring(position + 1); - return true; - } - } - - private string inputFile; - private string outputFile; - private string strongNameKey; - private string projectType; - private bool makeBackup; - private bool writeStatusFile; - private bool writeStampFile; - private bool processDebugSymbols; - private IList referencedAssemblies; - - public string InputFile - { - get { return inputFile; } - set { inputFile = value; } - } - - public string OutputFile - { - get { return outputFile; } - set { outputFile = value; } - } - - public string StrongNameKey - { - get { return strongNameKey; } - set { strongNameKey = value; } - } - - public string ProjectType - { - get { return projectType; } - set { projectType = value; } - } - - public bool MakeBackup - { - get { return makeBackup; } - set { makeBackup = value; } - } - - public bool ProcessDebugSymbols - { - get { return processDebugSymbols; } - set { processDebugSymbols = value; } - } - - public bool WriteStatusFile - { - get { return writeStatusFile; } - set { writeStatusFile = value; } - } - - public bool WriteStampFile - { - get { return writeStampFile; } - set { writeStampFile = value; } - } - - public IList ReferencedAssemblies - { - get { return referencedAssemblies; } - set { referencedAssemblies = value; } - } - - public bool Parse(string parameterString) - { - if (parameterString==null) - throw new ArgumentNullException("parameterString"); - return Parser.Parse(this, parameterString); - } - - public ProcessorConfiguration() - { - ReferencedAssemblies = new List(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; + +namespace Xtensive.Orm.Weaver +{ + public sealed class ProcessorConfiguration + { + private static class Parser + { + private const string WriteStatus = "status"; + private const string WriteStamp = "stamp"; + private const string MakeBackup = "backup"; + private const string ProcessDebugSymbols = "pdb"; + + private const string InputFile = "input"; + private const string OutputFile = "output"; + private const string StrongNameKey = "snk"; + private const string ProjectType = "type"; + private const string ReferencedAssembly = "r"; + + private static readonly char[] KeyValueSeparators = new[] {':', '='}; + + private static readonly StringComparer Comparer = StringComparer.OrdinalIgnoreCase; + + public static bool Parse(ProcessorConfiguration configuration, string item) + { + if (Comparer.Equals(item, MakeBackup)) { + configuration.MakeBackup = true; + return true; + } + + if (Comparer.Equals(item, WriteStatus)) { + configuration.WriteStatusFile = true; + return true; + } + + if (Comparer.Equals(item, WriteStamp)) { + configuration.WriteStampFile = true; + return true; + } + + if (Comparer.Equals(item, ProcessDebugSymbols)) { + configuration.ProcessDebugSymbols = true; + return true; + } + + string key; + string value; + + if (!ParseKeyValue(item, out key, out value)) + return false; + + if (Comparer.Equals(key, InputFile)) { + configuration.InputFile = value; + return true; + } + + if (Comparer.Equals(key, OutputFile)) { + configuration.OutputFile = value; + return true; + } + + if (Comparer.Equals(key, StrongNameKey)) { + configuration.StrongNameKey = value; + return true; + } + + if (Comparer.Equals(key, ProjectType)) { + configuration.ProjectType = value; + return true; + } + + if (Comparer.Equals(key, ReferencedAssembly)) { + configuration.ReferencedAssemblies.Add(value); + return true; + } + + return false; + } + + private static bool ParseKeyValue(string item, out string key, out string value) + { + var position = item.IndexOfAny(KeyValueSeparators); + if (position < 0 || position > item.Length - 2) { + key = null; + value = null; + return false; + } + key = item.Substring(0, position); + value = item.Substring(position + 1); + return true; + } + } + + private string inputFile; + private string outputFile; + private string strongNameKey; + private string projectType; + private bool makeBackup; + private bool writeStatusFile; + private bool writeStampFile; + private bool processDebugSymbols; + private IList referencedAssemblies; + + public string InputFile + { + get { return inputFile; } + set { inputFile = value; } + } + + public string OutputFile + { + get { return outputFile; } + set { outputFile = value; } + } + + public string StrongNameKey + { + get { return strongNameKey; } + set { strongNameKey = value; } + } + + public string ProjectType + { + get { return projectType; } + set { projectType = value; } + } + + public bool MakeBackup + { + get { return makeBackup; } + set { makeBackup = value; } + } + + public bool ProcessDebugSymbols + { + get { return processDebugSymbols; } + set { processDebugSymbols = value; } + } + + public bool WriteStatusFile + { + get { return writeStatusFile; } + set { writeStatusFile = value; } + } + + public bool WriteStampFile + { + get { return writeStampFile; } + set { writeStampFile = value; } + } + + public IList ReferencedAssemblies + { + get { return referencedAssemblies; } + set { referencedAssemblies = value; } + } + + public bool Parse(string parameterString) + { + if (parameterString==null) + throw new ArgumentNullException("parameterString"); + return Parser.Parse(this, parameterString); + } + + public ProcessorConfiguration() + { + ReferencedAssemblies = new List(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ProcessorContext.cs b/Weaver/Xtensive.Orm.Weaver/ProcessorContext.cs index 275106a6b2..de29113c61 100644 --- a/Weaver/Xtensive.Orm.Weaver/ProcessorContext.cs +++ b/Weaver/Xtensive.Orm.Weaver/ProcessorContext.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public sealed class ProcessorContext : IDisposable - { - public ProcessorConfiguration Configuration { get; set; } - - public string ApplicationDirectory { get; set; } - - public MessageLogger Logger { get; set; } - - public SourceLanguage Language { get; set; } - - public bool SkipProcessing { get; set; } - - public bool TranformationPerformed { get; set; } - - public bool ShouldAddReferenceToOrm { get; set; } - - public IList WeavingTasks { get; set; } - - public ModuleDefinition TargetModule { get; set; } - - public ReferenceRegistry References { get; set; } - - public IAssemblyResolver AssemblyResolver { get; set; } - - public IMetadataResolver MetadataResolver { get; set; } - - public AssemblyChecker AssemblyChecker { get; set; } - - public IList PersistentTypes { get; set; } - - public string InputFile { get; set; } - - public string OutputFile { get; set; } - - public void Dispose() - { - AssemblyResolver?.Dispose(); - TargetModule?.Dispose(); - } - - public ProcessorContext() - { - WeavingTasks = new List(); - References = new ReferenceRegistry(); - PersistentTypes = new List(); - AssemblyChecker = new AssemblyChecker(); - ShouldAddReferenceToOrm = false; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public sealed class ProcessorContext : IDisposable + { + public ProcessorConfiguration Configuration { get; set; } + + public string ApplicationDirectory { get; set; } + + public MessageLogger Logger { get; set; } + + public SourceLanguage Language { get; set; } + + public bool SkipProcessing { get; set; } + + public bool TranformationPerformed { get; set; } + + public bool ShouldAddReferenceToOrm { get; set; } + + public IList WeavingTasks { get; set; } + + public ModuleDefinition TargetModule { get; set; } + + public ReferenceRegistry References { get; set; } + + public IAssemblyResolver AssemblyResolver { get; set; } + + public IMetadataResolver MetadataResolver { get; set; } + + public AssemblyChecker AssemblyChecker { get; set; } + + public IList PersistentTypes { get; set; } + + public string InputFile { get; set; } + + public string OutputFile { get; set; } + + public void Dispose() + { + AssemblyResolver?.Dispose(); + TargetModule?.Dispose(); + } + + public ProcessorContext() + { + WeavingTasks = new List(); + References = new ReferenceRegistry(); + PersistentTypes = new List(); + AssemblyChecker = new AssemblyChecker(); + ShouldAddReferenceToOrm = false; + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/ProcessorMessage.cs b/Weaver/Xtensive.Orm.Weaver/ProcessorMessage.cs index 95114e5183..ea8b82cb8e 100644 --- a/Weaver/Xtensive.Orm.Weaver/ProcessorMessage.cs +++ b/Weaver/Xtensive.Orm.Weaver/ProcessorMessage.cs @@ -1,75 +1,75 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Text; - -namespace Xtensive.Orm.Weaver -{ - public sealed class ProcessorMessage - { - private MessageLocation location; - private MessageType type; - private string messageText; - private string messageCode; - private Exception exception; - - public MessageLocation Location - { - get { return location; } - set { location = value; } - } - - public MessageType Type - { - get { return type; } - set { type = value; } - } - - public string MessageCode - { - get { return messageCode; } - set { messageCode = value; } - } - - public string MessageText - { - get { return messageText; } - set { messageText = value; } - } - - public Exception Exception - { - get { return exception; } - set { exception = value; } - } - - public override string ToString() - { - var resultBuilder = new StringBuilder(); - if (location!=null) - resultBuilder.Append(location); - resultBuilder.AppendFormat("{0} {1}: {2}", GetMessageTypeName(type), messageCode, messageText); - if (Exception!=null) { - resultBuilder.AppendLine(); - resultBuilder.Append(Exception.StackTrace); - } - return resultBuilder.ToString(); - } - - private static string GetMessageTypeName(MessageType type) - { - switch (type) { - case MessageType.Warning: - return "warning"; - case MessageType.Error: - return "error"; - default: - throw new ArgumentOutOfRangeException("type"); - } - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Text; + +namespace Xtensive.Orm.Weaver +{ + public sealed class ProcessorMessage + { + private MessageLocation location; + private MessageType type; + private string messageText; + private string messageCode; + private Exception exception; + + public MessageLocation Location + { + get { return location; } + set { location = value; } + } + + public MessageType Type + { + get { return type; } + set { type = value; } + } + + public string MessageCode + { + get { return messageCode; } + set { messageCode = value; } + } + + public string MessageText + { + get { return messageText; } + set { messageText = value; } + } + + public Exception Exception + { + get { return exception; } + set { exception = value; } + } + + public override string ToString() + { + var resultBuilder = new StringBuilder(); + if (location!=null) + resultBuilder.Append(location); + resultBuilder.AppendFormat("{0} {1}: {2}", GetMessageTypeName(type), messageCode, messageText); + if (Exception!=null) { + resultBuilder.AppendLine(); + resultBuilder.Append(Exception.StackTrace); + } + return resultBuilder.ToString(); + } + + private static string GetMessageTypeName(MessageType type) + { + switch (type) { + case MessageType.Warning: + return "warning"; + case MessageType.Error: + return "error"; + default: + throw new ArgumentOutOfRangeException("type"); + } + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ProcessorStage.cs b/Weaver/Xtensive.Orm.Weaver/ProcessorStage.cs index 5c32d1be05..3f3321ecda 100644 --- a/Weaver/Xtensive.Orm.Weaver/ProcessorStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/ProcessorStage.cs @@ -1,18 +1,18 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public abstract class ProcessorStage - { - public virtual bool CanExecute(ProcessorContext context) - { - return !context.SkipProcessing; - } - - public abstract ActionResult Execute(ProcessorContext context); - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public abstract class ProcessorStage + { + public virtual bool CanExecute(ProcessorContext context) + { + return !context.SkipProcessing; + } + + public abstract ActionResult Execute(ProcessorContext context); + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ProcessorStageAttribute.cs b/Weaver/Xtensive.Orm.Weaver/ProcessorStageAttribute.cs index 7225412ef2..c0112b7a0c 100644 --- a/Weaver/Xtensive.Orm.Weaver/ProcessorStageAttribute.cs +++ b/Weaver/Xtensive.Orm.Weaver/ProcessorStageAttribute.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.25 - -using System; - -namespace Xtensive.Orm.Weaver -{ - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class ProcessorStageAttribute : Attribute - { - public Type StageType { get; private set; } - public int Priority { get; private set; } - - public ProcessorStageAttribute(Type stageType, int priority) - { - StageType = stageType; - Priority = priority; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.25 + +using System; + +namespace Xtensive.Orm.Weaver +{ + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] + public sealed class ProcessorStageAttribute : Attribute + { + public Type StageType { get; private set; } + public int Priority { get; private set; } + + public ProcessorStageAttribute(Type stageType, int priority) + { + StageType = stageType; + Priority = priority; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/PropertyInfo.cs b/Weaver/Xtensive.Orm.Weaver/PropertyInfo.cs index 23ad9bde1f..0571aa18b8 100644 --- a/Weaver/Xtensive.Orm.Weaver/PropertyInfo.cs +++ b/Weaver/Xtensive.Orm.Weaver/PropertyInfo.cs @@ -1,98 +1,98 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.26 - -using System; -using System.Collections.Generic; -using System.Text; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public sealed class PropertyInfo - { - public TypeInfo DeclaringType { get; private set; } - - public PropertyDefinition Definition { get; private set; } - - public string Name { get { return Definition.Name; } } - - public bool IsInstance { get { return Definition.HasThis; } } - - public bool IsAutomatic { get; set; } - - public bool IsNew { get; set; } - - public bool IsOverride { get; set; } - - public bool IsExplicitInterfaceImplementation { get; set; } - - public bool IsPersistent { get; set; } - - public bool IsKey { get; set; } - - public string PersistentName { get; set; } - - public PropertyInfo BaseProperty { get; set; } - - public IList ImplementedProperties { get; set; } - - public MethodDefinition AnyAccessor - { - get { return Definition.GetMethod ?? Definition.SetMethod; } - } - - public override string ToString() - { - var resultBuilder = new StringBuilder(); - resultBuilder.Append(Name); - resultBuilder.AppendFormat(" [type({0})]", Definition.PropertyType.FullName); - if (IsInstance) - resultBuilder.Append(" [instance]"); - if (IsAutomatic) - resultBuilder.Append(" [automatic]"); - if (IsNew) - resultBuilder.Append(" [new]"); - if (IsOverride) - resultBuilder.Append(" [override]"); - if (IsExplicitInterfaceImplementation) - resultBuilder.Append(" [explicit_implementation]"); - if (IsKey) - resultBuilder.Append(" [key]"); - if (IsPersistent) { - if (PersistentName!=null) - resultBuilder.AppendFormat(" [persistent({0})]", PersistentName); - else - resultBuilder.Append(" [persistent]"); - } - foreach (var implementedProperty in ImplementedProperties) - resultBuilder.AppendFormat(" [implements({0}::{1})]", implementedProperty.DeclaringType.FullName, implementedProperty.Name); - return resultBuilder.ToString(); - } - - public PropertyInfo FindBase(Func predicate) - { - var current = BaseProperty; - while (current!=null) { - if (predicate.Invoke(current)) - return current; - current = current.BaseProperty; - } - return null; - } - - public PropertyInfo(TypeInfo declaringType, PropertyDefinition definition) - { - if (declaringType==null) - throw new ArgumentNullException("declaringType"); - if (definition==null) - throw new ArgumentNullException("definition"); - - DeclaringType = declaringType; - Definition = definition; - ImplementedProperties = new List(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.26 + +using System; +using System.Collections.Generic; +using System.Text; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public sealed class PropertyInfo + { + public TypeInfo DeclaringType { get; private set; } + + public PropertyDefinition Definition { get; private set; } + + public string Name { get { return Definition.Name; } } + + public bool IsInstance { get { return Definition.HasThis; } } + + public bool IsAutomatic { get; set; } + + public bool IsNew { get; set; } + + public bool IsOverride { get; set; } + + public bool IsExplicitInterfaceImplementation { get; set; } + + public bool IsPersistent { get; set; } + + public bool IsKey { get; set; } + + public string PersistentName { get; set; } + + public PropertyInfo BaseProperty { get; set; } + + public IList ImplementedProperties { get; set; } + + public MethodDefinition AnyAccessor + { + get { return Definition.GetMethod ?? Definition.SetMethod; } + } + + public override string ToString() + { + var resultBuilder = new StringBuilder(); + resultBuilder.Append(Name); + resultBuilder.AppendFormat(" [type({0})]", Definition.PropertyType.FullName); + if (IsInstance) + resultBuilder.Append(" [instance]"); + if (IsAutomatic) + resultBuilder.Append(" [automatic]"); + if (IsNew) + resultBuilder.Append(" [new]"); + if (IsOverride) + resultBuilder.Append(" [override]"); + if (IsExplicitInterfaceImplementation) + resultBuilder.Append(" [explicit_implementation]"); + if (IsKey) + resultBuilder.Append(" [key]"); + if (IsPersistent) { + if (PersistentName!=null) + resultBuilder.AppendFormat(" [persistent({0})]", PersistentName); + else + resultBuilder.Append(" [persistent]"); + } + foreach (var implementedProperty in ImplementedProperties) + resultBuilder.AppendFormat(" [implements({0}::{1})]", implementedProperty.DeclaringType.FullName, implementedProperty.Name); + return resultBuilder.ToString(); + } + + public PropertyInfo FindBase(Func predicate) + { + var current = BaseProperty; + while (current!=null) { + if (predicate.Invoke(current)) + return current; + current = current.BaseProperty; + } + return null; + } + + public PropertyInfo(TypeInfo declaringType, PropertyDefinition definition) + { + if (declaringType==null) + throw new ArgumentNullException("declaringType"); + if (definition==null) + throw new ArgumentNullException("definition"); + + DeclaringType = declaringType; + Definition = definition; + ImplementedProperties = new List(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/ReferenceRegistry.cs b/Weaver/Xtensive.Orm.Weaver/ReferenceRegistry.cs index 1bcc82789a..a6d48a20b6 100644 --- a/Weaver/Xtensive.Orm.Weaver/ReferenceRegistry.cs +++ b/Weaver/Xtensive.Orm.Weaver/ReferenceRegistry.cs @@ -1,63 +1,63 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System.Collections.Generic; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public sealed class ReferenceRegistry - { - public AssemblyNameReference OrmAssembly { get; set; } - - // mscorlib - public TypeReference Type { get; set; } - public TypeReference Exception { get; set; } - public TypeReference RuntimeTypeHandle { get; set; } - public TypeReference StreamingContext { get; set; } - public TypeReference SerializationInfo { get; set; } - - public MethodReference TypeGetTypeFromHandle { get; set; } - public MethodReference CompilerGeneratedAttributeConstructor { get; set; } - - // Xtensive.Core - public TypeReference Tuple { get; set; } - - // Xtensive.Orm - public TypeReference Session { get; set; } - public TypeReference Entity { get; set; } - public TypeReference EntityInterface { get; set; } - public TypeReference EntityState { get; set; } - public TypeReference EntitySetItem { get; set; } - public TypeReference FieldInfo { get; set; } - public TypeReference Persistent { get; set; } - public TypeReference PersistenceImplementation { get; set; } - - public MethodReference ProcessedByWeaverAttributeConstructor { get; set; } - public MethodReference EntityTypeAttributeConstructor { get; set; } - public MethodReference EntitySetTypeAttributeConstructor { get; set; } - public MethodReference EntityInterfaceAttributeConstructor { get; set; } - public MethodReference StructureTypeAttributeConstructor { get; set; } - public MethodReference OverrideFieldNameAttributeConstructor { get; set; } - - public MethodReference PersistenceImplementationHandleKeySet { get; set; } - - public MethodReference PersistentInitialize { get; set; } - public MethodReference PersistentInitializationError { get; set; } - - public MethodReference PersistentGetterDefinition { get; set; } - public MethodReference PersistentSetterDefinition { get; set; } - - public IDictionary PersistentGetters { get; set; } - public IDictionary PersistentSetters { get; set; } - - public ReferenceRegistry() - { - PersistentGetters = new Dictionary(); - PersistentSetters = new Dictionary(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System.Collections.Generic; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public sealed class ReferenceRegistry + { + public AssemblyNameReference OrmAssembly { get; set; } + + // mscorlib + public TypeReference Type { get; set; } + public TypeReference Exception { get; set; } + public TypeReference RuntimeTypeHandle { get; set; } + public TypeReference StreamingContext { get; set; } + public TypeReference SerializationInfo { get; set; } + + public MethodReference TypeGetTypeFromHandle { get; set; } + public MethodReference CompilerGeneratedAttributeConstructor { get; set; } + + // Xtensive.Core + public TypeReference Tuple { get; set; } + + // Xtensive.Orm + public TypeReference Session { get; set; } + public TypeReference Entity { get; set; } + public TypeReference EntityInterface { get; set; } + public TypeReference EntityState { get; set; } + public TypeReference EntitySetItem { get; set; } + public TypeReference FieldInfo { get; set; } + public TypeReference Persistent { get; set; } + public TypeReference PersistenceImplementation { get; set; } + + public MethodReference ProcessedByWeaverAttributeConstructor { get; set; } + public MethodReference EntityTypeAttributeConstructor { get; set; } + public MethodReference EntitySetTypeAttributeConstructor { get; set; } + public MethodReference EntityInterfaceAttributeConstructor { get; set; } + public MethodReference StructureTypeAttributeConstructor { get; set; } + public MethodReference OverrideFieldNameAttributeConstructor { get; set; } + + public MethodReference PersistenceImplementationHandleKeySet { get; set; } + + public MethodReference PersistentInitialize { get; set; } + public MethodReference PersistentInitializationError { get; set; } + + public MethodReference PersistentGetterDefinition { get; set; } + public MethodReference PersistentSetterDefinition { get; set; } + + public IDictionary PersistentGetters { get; set; } + public IDictionary PersistentSetters { get; set; } + + public ReferenceRegistry() + { + PersistentGetters = new Dictionary(); + PersistentSetters = new Dictionary(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/SourceLanguage.cs b/Weaver/Xtensive.Orm.Weaver/SourceLanguage.cs index 6813a42668..2e68e82c2d 100644 --- a/Weaver/Xtensive.Orm.Weaver/SourceLanguage.cs +++ b/Weaver/Xtensive.Orm.Weaver/SourceLanguage.cs @@ -1,16 +1,16 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.12.19 - -namespace Xtensive.Orm.Weaver -{ - public enum SourceLanguage - { - Unknown, - CSharp, - FSharp, - VbNet, - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.12.19 + +namespace Xtensive.Orm.Weaver +{ + public enum SourceLanguage + { + Unknown, + CSharp, + FSharp, + VbNet, + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/StageFailedException.cs b/Weaver/Xtensive.Orm.Weaver/StageFailedException.cs index ae7014bce2..3f778bf555 100644 --- a/Weaver/Xtensive.Orm.Weaver/StageFailedException.cs +++ b/Weaver/Xtensive.Orm.Weaver/StageFailedException.cs @@ -1,14 +1,14 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; - -namespace Xtensive.Orm.Weaver -{ - internal sealed class StageFailedException : Exception - { - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; + +namespace Xtensive.Orm.Weaver +{ + internal sealed class StageFailedException : Exception + { + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/ExecuteWeavingTasksStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/ExecuteWeavingTasksStage.cs index 48e8cda098..d45bb1a417 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/ExecuteWeavingTasksStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/ExecuteWeavingTasksStage.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class ExecuteWeavingTasksStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - var failure = false; - - foreach (var task in context.WeavingTasks) { - if (task.Execute(context)==ActionResult.Failure) - failure = true; - } - - return failure ? ActionResult.Failure : ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class ExecuteWeavingTasksStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + var failure = false; + + foreach (var task in context.WeavingTasks) { + if (task.Execute(context)==ActionResult.Failure) + failure = true; + } + + return failure ? ActionResult.Failure : ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/FindPersistentTypesStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/FindPersistentTypesStage.cs index 7296d7a932..e22fbc84a6 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/FindPersistentTypesStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/FindPersistentTypesStage.cs @@ -1,221 +1,221 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class FindPersistentTypesStage : ProcessorStage - { - private readonly Dictionary processedTypes = new Dictionary(); - private Func autoPropertyChecker; - - public override ActionResult Execute(ProcessorContext context) - { - if (context.Language==SourceLanguage.VbNet) - autoPropertyChecker = IsVbAutoProperty; - else - autoPropertyChecker = IsCSharpAutoProperty; - - var typesToInspect = context.TargetModule.GetTypes() - .Where(t => t.IsClass && t.BaseType!=null || t.IsInterface); - foreach (var type in typesToInspect) { - var result = InspectType(context, type); - if (result.Kind!=PersistentTypeKind.None) - context.PersistentTypes.Add(result); - } - - context.SkipProcessing = context.PersistentTypes.Count==0; - return ActionResult.Success; - } - - private TypeInfo InspectDefinedType(ProcessorContext context, TypeIdentity identity, TypeDefinition type) - { - if (type.IsClass) { - var baseType = InspectType(context, type.BaseType); - var kind = baseType.Kind; - var result = new TypeInfo(type, kind, baseType); - var expectPersistentProperties = kind==PersistentTypeKind.Entity || kind==PersistentTypeKind.Structure; - if (expectPersistentProperties) - foreach (var @interface in type.Interfaces) - result.Interfaces.Add(InspectType(context, @interface.InterfaceType)); - processedTypes.Add(identity, result); - if (expectPersistentProperties) - InspectProperties(context, result); - return result; - } - else { - var isPersistent = false; - var interfaces = new List(); - foreach (var @interface in type.Interfaces) { - var current = InspectType(context, @interface.InterfaceType); - interfaces.Add(current); - if (current.Kind==PersistentTypeKind.EntityInterface) - isPersistent = true; - } - var kind = isPersistent ? PersistentTypeKind.EntityInterface : PersistentTypeKind.None; - var result = new TypeInfo(type, kind) {Interfaces = interfaces}; - processedTypes.Add(identity, result); - InspectProperties(context, result); - return result; - } - } - - private TypeInfo InspectType(ProcessorContext context, TypeReference type) - { - type = type.StripGenericParameters(); - - var identity = new TypeIdentity(type); - - TypeInfo existing; - if (processedTypes.TryGetValue(identity, out existing)) - return existing; - - AssemblyNameReference reference; - if (type.Scope.MetadataScopeType==MetadataScopeType.AssemblyNameReference) - reference = (AssemblyNameReference) type.Scope; - else if (type.Scope.MetadataScopeType==MetadataScopeType.ModuleDefinition) { - var defenition = (ModuleDefinition) type.Scope; - reference = defenition.Assembly.Name; - } - else { - // If type.Scope.MetadataScoreType==MetadataScoreType.ModuleReference - // then unable to understand which assembly is it, - // because ModuleReference contains only name of Module. - throw new InvalidOperationException("Unable to inspect ModuleReference"); - } - if (context.AssemblyChecker.IsFrameworkAssembly(reference) || context.AssemblyChecker.IsNetStandardAssembly(reference)) { - var result = new TypeInfo(type, PersistentTypeKind.None); - processedTypes.Add(identity, result); - return result; - } - if (reference.FullName==WellKnown.OrmAssemblyFullName) { - var result = new TypeInfo(type, ClassifyOrmType(type)); - processedTypes.Add(identity, result); - return result; - } - return InspectDefinedType(context, identity, type.Resolve()); - } - - private PersistentTypeKind ClassifyOrmType(TypeReference type) - { - var comparer = WeavingHelper.TypeNameComparer; - var name = type.FullName; - if (comparer.Equals(name, WellKnown.EntityType)) - return PersistentTypeKind.Entity; - if (comparer.Equals(name, WellKnown.StructureType)) - return PersistentTypeKind.Structure; - if (comparer.Equals(name, WellKnown.EntitySetType)) - return PersistentTypeKind.EntitySet; - if (comparer.Equals(name, WellKnown.EntityInterfaceType)) - return PersistentTypeKind.EntityInterface; - return PersistentTypeKind.None; - } - - private void InspectProperties(ProcessorContext context, TypeInfo type) - { - foreach (var property in type.Definition.Properties) { - var propertyInfo = new PropertyInfo(type, property); - // only indexers has parameters and we skip them - if (propertyInfo.AnyAccessor==null || property.HasParameters) - continue; - propertyInfo.IsAutomatic = autoPropertyChecker.Invoke(type.Definition, property); - propertyInfo.IsPersistent = propertyInfo.IsInstance && property.HasAttribute(WellKnown.FieldAttribute); - propertyInfo.IsKey = propertyInfo.IsPersistent && property.HasAttribute(WellKnown.KeyAttribute); - type.Properties.Add(propertyInfo.Name, propertyInfo); - } - - var baseType = type.BaseType; - if (baseType!=null) - foreach (var property in type.Properties.Values) { - var baseProperty = baseType.FindProperty(property.Name); - if (baseProperty==null) - continue; - property.BaseProperty = baseProperty; - var thisAccessor = property.AnyAccessor; - var baseAccessor = baseProperty.AnyAccessor; - if (baseAccessor.IsVirtual && thisAccessor.IsVirtual && !thisAccessor.IsNewSlot) { - property.IsOverride = true; - InheritPersistence(property, baseProperty); - } - else { - property.IsNew = true; - var persistentBase = property.FindBase(p => p.IsPersistent); - if (persistentBase!=null) - property.PersistentName = WeavingHelper.BuildComplexPersistentName(type, property); - } - } - - var propertiesToImplement = new HashSet(type.Interfaces.SelectMany(i => i.Properties.Values)); - - // Exclude explicit implementations - foreach (var property in type.Properties.Values) { - var implementedAccessor = property.AnyAccessor.Overrides.FirstOrDefault(); - if (implementedAccessor==null) - continue; - var interfaceType = GetType(new TypeIdentity(implementedAccessor.DeclaringType.StripGenericParameters())); - var implementedPropertyName = WeavingHelper.GetPropertyName(implementedAccessor.Name); - var implementedProperty = interfaceType.FindProperty(implementedPropertyName); - if (implementedProperty==null) - continue; - property.ImplementedProperties.Add(implementedProperty); - property.IsExplicitInterfaceImplementation = true; - if (context.Language!=SourceLanguage.VbNet) - property.PersistentName = WeavingHelper.BuildComplexPersistentName(interfaceType, implementedProperty); - propertiesToImplement.Remove(implementedProperty); - InheritPersistence(property, implementedProperty); - } - - // Try associate remaining properties - foreach (var property in propertiesToImplement) { - PropertyInfo implementor; - if (type.Properties.TryGetValue(property.Name, out implementor)) { - implementor.ImplementedProperties.Add(property); - InheritPersistence(implementor, property); - } - } - } - - private TypeInfo GetType(TypeIdentity identity) - { - TypeInfo result; - if (!processedTypes.TryGetValue(identity, out result)) - throw new InvalidOperationException(string.Format("Unable to find type '{0}'", identity.TypeName)); - return result; - } - - private static void InheritPersistence(PropertyInfo property, PropertyInfo baseProperty) - { - if (baseProperty.IsPersistent) - property.IsPersistent = true; - - if (baseProperty.IsKey) - property.IsKey = true; - } - - private static bool IsCSharpAutoProperty(TypeDefinition type, PropertyDefinition property) - { - return property.GetMethod!=null && property.SetMethod!=null - && property.GetMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute) - && property.SetMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute); - } - - private static bool IsVbAutoProperty(TypeDefinition type, PropertyDefinition property) - { - if (property.GetMethod==null || property.SetMethod==null) - return false; - var backingFieldIndex = type.Fields.IndexOf("_" + property.Name); - if (backingFieldIndex < 0) - return false; - var backingField = type.Fields[backingFieldIndex]; - return backingField.IsPrivate; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class FindPersistentTypesStage : ProcessorStage + { + private readonly Dictionary processedTypes = new Dictionary(); + private Func autoPropertyChecker; + + public override ActionResult Execute(ProcessorContext context) + { + if (context.Language==SourceLanguage.VbNet) + autoPropertyChecker = IsVbAutoProperty; + else + autoPropertyChecker = IsCSharpAutoProperty; + + var typesToInspect = context.TargetModule.GetTypes() + .Where(t => t.IsClass && t.BaseType!=null || t.IsInterface); + foreach (var type in typesToInspect) { + var result = InspectType(context, type); + if (result.Kind!=PersistentTypeKind.None) + context.PersistentTypes.Add(result); + } + + context.SkipProcessing = context.PersistentTypes.Count==0; + return ActionResult.Success; + } + + private TypeInfo InspectDefinedType(ProcessorContext context, TypeIdentity identity, TypeDefinition type) + { + if (type.IsClass) { + var baseType = InspectType(context, type.BaseType); + var kind = baseType.Kind; + var result = new TypeInfo(type, kind, baseType); + var expectPersistentProperties = kind==PersistentTypeKind.Entity || kind==PersistentTypeKind.Structure; + if (expectPersistentProperties) + foreach (var @interface in type.Interfaces) + result.Interfaces.Add(InspectType(context, @interface.InterfaceType)); + processedTypes.Add(identity, result); + if (expectPersistentProperties) + InspectProperties(context, result); + return result; + } + else { + var isPersistent = false; + var interfaces = new List(); + foreach (var @interface in type.Interfaces) { + var current = InspectType(context, @interface.InterfaceType); + interfaces.Add(current); + if (current.Kind==PersistentTypeKind.EntityInterface) + isPersistent = true; + } + var kind = isPersistent ? PersistentTypeKind.EntityInterface : PersistentTypeKind.None; + var result = new TypeInfo(type, kind) {Interfaces = interfaces}; + processedTypes.Add(identity, result); + InspectProperties(context, result); + return result; + } + } + + private TypeInfo InspectType(ProcessorContext context, TypeReference type) + { + type = type.StripGenericParameters(); + + var identity = new TypeIdentity(type); + + TypeInfo existing; + if (processedTypes.TryGetValue(identity, out existing)) + return existing; + + AssemblyNameReference reference; + if (type.Scope.MetadataScopeType==MetadataScopeType.AssemblyNameReference) + reference = (AssemblyNameReference) type.Scope; + else if (type.Scope.MetadataScopeType==MetadataScopeType.ModuleDefinition) { + var defenition = (ModuleDefinition) type.Scope; + reference = defenition.Assembly.Name; + } + else { + // If type.Scope.MetadataScoreType==MetadataScoreType.ModuleReference + // then unable to understand which assembly is it, + // because ModuleReference contains only name of Module. + throw new InvalidOperationException("Unable to inspect ModuleReference"); + } + if (context.AssemblyChecker.IsFrameworkAssembly(reference) || context.AssemblyChecker.IsNetStandardAssembly(reference)) { + var result = new TypeInfo(type, PersistentTypeKind.None); + processedTypes.Add(identity, result); + return result; + } + if (reference.FullName==WellKnown.OrmAssemblyFullName) { + var result = new TypeInfo(type, ClassifyOrmType(type)); + processedTypes.Add(identity, result); + return result; + } + return InspectDefinedType(context, identity, type.Resolve()); + } + + private PersistentTypeKind ClassifyOrmType(TypeReference type) + { + var comparer = WeavingHelper.TypeNameComparer; + var name = type.FullName; + if (comparer.Equals(name, WellKnown.EntityType)) + return PersistentTypeKind.Entity; + if (comparer.Equals(name, WellKnown.StructureType)) + return PersistentTypeKind.Structure; + if (comparer.Equals(name, WellKnown.EntitySetType)) + return PersistentTypeKind.EntitySet; + if (comparer.Equals(name, WellKnown.EntityInterfaceType)) + return PersistentTypeKind.EntityInterface; + return PersistentTypeKind.None; + } + + private void InspectProperties(ProcessorContext context, TypeInfo type) + { + foreach (var property in type.Definition.Properties) { + var propertyInfo = new PropertyInfo(type, property); + // only indexers has parameters and we skip them + if (propertyInfo.AnyAccessor==null || property.HasParameters) + continue; + propertyInfo.IsAutomatic = autoPropertyChecker.Invoke(type.Definition, property); + propertyInfo.IsPersistent = propertyInfo.IsInstance && property.HasAttribute(WellKnown.FieldAttribute); + propertyInfo.IsKey = propertyInfo.IsPersistent && property.HasAttribute(WellKnown.KeyAttribute); + type.Properties.Add(propertyInfo.Name, propertyInfo); + } + + var baseType = type.BaseType; + if (baseType!=null) + foreach (var property in type.Properties.Values) { + var baseProperty = baseType.FindProperty(property.Name); + if (baseProperty==null) + continue; + property.BaseProperty = baseProperty; + var thisAccessor = property.AnyAccessor; + var baseAccessor = baseProperty.AnyAccessor; + if (baseAccessor.IsVirtual && thisAccessor.IsVirtual && !thisAccessor.IsNewSlot) { + property.IsOverride = true; + InheritPersistence(property, baseProperty); + } + else { + property.IsNew = true; + var persistentBase = property.FindBase(p => p.IsPersistent); + if (persistentBase!=null) + property.PersistentName = WeavingHelper.BuildComplexPersistentName(type, property); + } + } + + var propertiesToImplement = new HashSet(type.Interfaces.SelectMany(i => i.Properties.Values)); + + // Exclude explicit implementations + foreach (var property in type.Properties.Values) { + var implementedAccessor = property.AnyAccessor.Overrides.FirstOrDefault(); + if (implementedAccessor==null) + continue; + var interfaceType = GetType(new TypeIdentity(implementedAccessor.DeclaringType.StripGenericParameters())); + var implementedPropertyName = WeavingHelper.GetPropertyName(implementedAccessor.Name); + var implementedProperty = interfaceType.FindProperty(implementedPropertyName); + if (implementedProperty==null) + continue; + property.ImplementedProperties.Add(implementedProperty); + property.IsExplicitInterfaceImplementation = true; + if (context.Language!=SourceLanguage.VbNet) + property.PersistentName = WeavingHelper.BuildComplexPersistentName(interfaceType, implementedProperty); + propertiesToImplement.Remove(implementedProperty); + InheritPersistence(property, implementedProperty); + } + + // Try associate remaining properties + foreach (var property in propertiesToImplement) { + PropertyInfo implementor; + if (type.Properties.TryGetValue(property.Name, out implementor)) { + implementor.ImplementedProperties.Add(property); + InheritPersistence(implementor, property); + } + } + } + + private TypeInfo GetType(TypeIdentity identity) + { + TypeInfo result; + if (!processedTypes.TryGetValue(identity, out result)) + throw new InvalidOperationException(string.Format("Unable to find type '{0}'", identity.TypeName)); + return result; + } + + private static void InheritPersistence(PropertyInfo property, PropertyInfo baseProperty) + { + if (baseProperty.IsPersistent) + property.IsPersistent = true; + + if (baseProperty.IsKey) + property.IsKey = true; + } + + private static bool IsCSharpAutoProperty(TypeDefinition type, PropertyDefinition property) + { + return property.GetMethod!=null && property.SetMethod!=null + && property.GetMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute) + && property.SetMethod.HasAttribute(WellKnown.CompilerGeneratedAttribute); + } + + private static bool IsVbAutoProperty(TypeDefinition type, PropertyDefinition property) + { + if (property.GetMethod==null || property.SetMethod==null) + return false; + var backingFieldIndex = type.Fields.IndexOf("_" + property.Name); + if (backingFieldIndex < 0) + return false; + var backingField = type.Fields[backingFieldIndex]; + return backingField.IsPrivate; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/ImportReferencesStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/ImportReferencesStage.cs index df86660c74..c2f7b1b611 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/ImportReferencesStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/ImportReferencesStage.cs @@ -1,172 +1,172 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System; -using System.Collections.Generic; -using System.Linq; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class ImportReferencesStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - var registry = context.References; - var mscorlibAssembly = context.TargetModule.TypeSystem.CoreLibrary; - - AssemblyNameReference ormAssembly; - if (!TryGetOrmAssembly(context, out ormAssembly)) { - context.SkipProcessing = true; - return ActionResult.Success; - } - registry.OrmAssembly = ormAssembly; - - var stringType = context.TargetModule.TypeSystem.String; - var voidType = context.TargetModule.TypeSystem.Void; - - // mscorlib - var typeType = registry.Type = ImportType(context, mscorlibAssembly, "System.Type"); - var exceptionType = registry.Exception = ImportType(context, mscorlibAssembly, "System.Exception"); - var runtimeTypeHandleType = registry.RuntimeTypeHandle = ImportType(context, mscorlibAssembly, "System.RuntimeTypeHandle", true); - registry.SerializationInfo = ImportType(context, mscorlibAssembly, "System.Runtime.Serialization.SerializationInfo"); - registry.StreamingContext = ImportType(context, mscorlibAssembly, "System.Runtime.Serialization.StreamingContext", true); - registry.TypeGetTypeFromHandle = ImportMethod(context, typeType, "GetTypeFromHandle", false, typeType, runtimeTypeHandleType); - registry.CompilerGeneratedAttributeConstructor = ImportConstructor(context, mscorlibAssembly, WellKnown.CompilerGeneratedAttribute); - - // Xtensive.Core - registry.Tuple = ImportType(context, ormAssembly, "Xtensive.Tuples.Tuple"); - - // Xtensive.Orm - registry.Session = ImportType(context, ormAssembly, "Xtensive.Orm.Session"); - registry.Entity = ImportType(context, ormAssembly, WellKnown.EntityType); - registry.EntityInterface = ImportType(context, ormAssembly, WellKnown.EntityInterfaceType); - registry.EntityState = ImportType(context, ormAssembly, "Xtensive.Orm.EntityState"); - registry.FieldInfo = ImportType(context, ormAssembly, "Xtensive.Orm.Model.FieldInfo"); - registry.EntitySetItem = ImportType(context, ormAssembly, WellKnown.EntitySetItemType); - var persistentType = registry.Persistent = ImportType(context, ormAssembly, "Xtensive.Orm.Persistent"); - - registry.PersistenceImplementation = ImportType(context, ormAssembly, "Xtensive.Orm.Weaving.PersistenceImplementation"); - registry.PersistenceImplementationHandleKeySet = ImportMethod(context, registry.PersistenceImplementation, "HandleKeySet", false, voidType, stringType, stringType); - - registry.PersistentInitialize = ImportMethod(context, persistentType, "Initialize", true, voidType, typeType); - registry.PersistentInitializationError = ImportMethod(context, persistentType, "InitializationError", true, voidType, typeType, exceptionType); - - - var persistentGetter = new MethodReference("GetFieldValue", voidType, persistentType) {HasThis = true}; - var getterType = new GenericParameter("!!T", persistentGetter); - persistentGetter.ReturnType = getterType; - persistentGetter.Parameters.Add(new ParameterDefinition(stringType)); - persistentGetter.GenericParameters.Add(getterType); - registry.PersistentGetterDefinition = context.TargetModule.ImportReference(persistentGetter); - - var persistentSetter = new MethodReference("SetFieldValue", voidType, persistentType) {HasThis = true}; - var setterType = new GenericParameter("!!T", persistentSetter); - persistentSetter.Parameters.Add(new ParameterDefinition(stringType)); - persistentSetter.Parameters.Add(new ParameterDefinition(setterType)); - persistentSetter.GenericParameters.Add(setterType); - registry.PersistentSetterDefinition = context.TargetModule.ImportReference(persistentSetter); - - registry.ProcessedByWeaverAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.ProcessedByWeaverAttribute); - registry.EntityTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntityTypeAttribute); - registry.EntitySetTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntitySetTypeAttribute); - registry.EntityInterfaceAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntityInterfaceAttribute); - registry.StructureTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.StructureTypeAttribute); - registry.OverrideFieldNameAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.OverrideFieldNameAttribute, stringType); - - return ActionResult.Success; - } - - private TypeReference ImportType(ProcessorContext context, IMetadataScope assembly, string fullName, bool isValueType = false) - { - var splitName = SplitTypeName(fullName); - var targetModule = context.TargetModule; - var reference = new TypeReference(splitName.Item1, splitName.Item2, targetModule, assembly, isValueType); - return targetModule.ImportReference(reference); - } - - private MethodReference ImportConstructor(ProcessorContext context, IMetadataScope assembly, string fullName, params TypeReference[] parameterTypes) - { - var splitName = SplitTypeName(fullName); - var targetModule = context.TargetModule; - var typeReference = new TypeReference(splitName.Item1, splitName.Item2, targetModule, assembly); - var constructorReference = new MethodReference(WellKnown.Constructor, targetModule.TypeSystem.Void, typeReference) {HasThis = true}; - foreach (var type in parameterTypes) - constructorReference.Parameters.Add(new ParameterDefinition(type)); - return targetModule.ImportReference(constructorReference); - } - - private MethodReference ImportMethod(ProcessorContext context, TypeReference declaringType, string methodName, - bool hasThis, TypeReference returnType, params TypeReference[] parameterTypes) - { - var targetModule = context.TargetModule; - var methodReference = new MethodReference(methodName,returnType, declaringType) {HasThis = hasThis}; - foreach (var parameterType in parameterTypes) - methodReference.Parameters.Add(new ParameterDefinition(parameterType)); - return targetModule.ImportReference(methodReference); - } - - private bool TryGetOrmAssembly(ProcessorContext context, out AssemblyNameReference assemblyNameReference) - { - // check for direct reference - var comparer = WeavingHelper.AssemblyNameComparer; - assemblyNameReference = context.TargetModule.AssemblyReferences - .FirstOrDefault(r => comparer.Equals(r.FullName, WellKnown.OrmAssemblyFullName)); - - if (assemblyNameReference != null) { - return true; - } - - // check whether project had reference to Xtensive.Orm assembly - // but omitted during project compilation as not used. - if (!IsOrmReferenceOmmitedByCompiler(context.Configuration.ReferencedAssemblies)) { - return false; - } - - // if target module has't got reference to the assembly and there was reference to the assembly in project - // then probably some of target module referenses references the assembly. - // So try to get it - assemblyNameReference = context.TargetModule.AssemblyReferences - .Select(r => context.AssemblyResolver.Resolve(r)) - .SelectMany(r => r.Modules) - .SelectMany(m => m.AssemblyReferences) - .FirstOrDefault(ar => comparer.Equals(ar.FullName, WellKnown.OrmAssemblyFullName)); - - if (assemblyNameReference != null) { - context.ShouldAddReferenceToOrm = true; - return true; - } - return false; - } - - private bool IsOrmReferenceOmmitedByCompiler(IList projectReferences) - { - if (projectReferences.Count == 0) { - return false; - } - var lastItemIndex = projectReferences.Count - 1; - - // Orm assembly tends to be at the end of the list - string searchCreteria = WellKnown.OrmAssemblyShortName + ".dll"; - for (int i = lastItemIndex; i >= 0; i--) { - if (projectReferences[i].EndsWith(searchCreteria, StringComparison.OrdinalIgnoreCase)) { - return true; - } - } - return false; - } - - private static Tuple SplitTypeName(string fullName) - { - var index = fullName.LastIndexOf(".", StringComparison.InvariantCulture); - if (index < 0) - return Tuple.Create(String.Empty, fullName); - return Tuple.Create( - fullName.Substring(0, index), - fullName.Substring(index + 1)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System; +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class ImportReferencesStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + var registry = context.References; + var mscorlibAssembly = context.TargetModule.TypeSystem.CoreLibrary; + + AssemblyNameReference ormAssembly; + if (!TryGetOrmAssembly(context, out ormAssembly)) { + context.SkipProcessing = true; + return ActionResult.Success; + } + registry.OrmAssembly = ormAssembly; + + var stringType = context.TargetModule.TypeSystem.String; + var voidType = context.TargetModule.TypeSystem.Void; + + // mscorlib + var typeType = registry.Type = ImportType(context, mscorlibAssembly, "System.Type"); + var exceptionType = registry.Exception = ImportType(context, mscorlibAssembly, "System.Exception"); + var runtimeTypeHandleType = registry.RuntimeTypeHandle = ImportType(context, mscorlibAssembly, "System.RuntimeTypeHandle", true); + registry.SerializationInfo = ImportType(context, mscorlibAssembly, "System.Runtime.Serialization.SerializationInfo"); + registry.StreamingContext = ImportType(context, mscorlibAssembly, "System.Runtime.Serialization.StreamingContext", true); + registry.TypeGetTypeFromHandle = ImportMethod(context, typeType, "GetTypeFromHandle", false, typeType, runtimeTypeHandleType); + registry.CompilerGeneratedAttributeConstructor = ImportConstructor(context, mscorlibAssembly, WellKnown.CompilerGeneratedAttribute); + + // Xtensive.Core + registry.Tuple = ImportType(context, ormAssembly, "Xtensive.Tuples.Tuple"); + + // Xtensive.Orm + registry.Session = ImportType(context, ormAssembly, "Xtensive.Orm.Session"); + registry.Entity = ImportType(context, ormAssembly, WellKnown.EntityType); + registry.EntityInterface = ImportType(context, ormAssembly, WellKnown.EntityInterfaceType); + registry.EntityState = ImportType(context, ormAssembly, "Xtensive.Orm.EntityState"); + registry.FieldInfo = ImportType(context, ormAssembly, "Xtensive.Orm.Model.FieldInfo"); + registry.EntitySetItem = ImportType(context, ormAssembly, WellKnown.EntitySetItemType); + var persistentType = registry.Persistent = ImportType(context, ormAssembly, "Xtensive.Orm.Persistent"); + + registry.PersistenceImplementation = ImportType(context, ormAssembly, "Xtensive.Orm.Weaving.PersistenceImplementation"); + registry.PersistenceImplementationHandleKeySet = ImportMethod(context, registry.PersistenceImplementation, "HandleKeySet", false, voidType, stringType, stringType); + + registry.PersistentInitialize = ImportMethod(context, persistentType, "Initialize", true, voidType, typeType); + registry.PersistentInitializationError = ImportMethod(context, persistentType, "InitializationError", true, voidType, typeType, exceptionType); + + + var persistentGetter = new MethodReference("GetFieldValue", voidType, persistentType) {HasThis = true}; + var getterType = new GenericParameter("!!T", persistentGetter); + persistentGetter.ReturnType = getterType; + persistentGetter.Parameters.Add(new ParameterDefinition(stringType)); + persistentGetter.GenericParameters.Add(getterType); + registry.PersistentGetterDefinition = context.TargetModule.ImportReference(persistentGetter); + + var persistentSetter = new MethodReference("SetFieldValue", voidType, persistentType) {HasThis = true}; + var setterType = new GenericParameter("!!T", persistentSetter); + persistentSetter.Parameters.Add(new ParameterDefinition(stringType)); + persistentSetter.Parameters.Add(new ParameterDefinition(setterType)); + persistentSetter.GenericParameters.Add(setterType); + registry.PersistentSetterDefinition = context.TargetModule.ImportReference(persistentSetter); + + registry.ProcessedByWeaverAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.ProcessedByWeaverAttribute); + registry.EntityTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntityTypeAttribute); + registry.EntitySetTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntitySetTypeAttribute); + registry.EntityInterfaceAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.EntityInterfaceAttribute); + registry.StructureTypeAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.StructureTypeAttribute); + registry.OverrideFieldNameAttributeConstructor = ImportConstructor(context, ormAssembly, WellKnown.OverrideFieldNameAttribute, stringType); + + return ActionResult.Success; + } + + private TypeReference ImportType(ProcessorContext context, IMetadataScope assembly, string fullName, bool isValueType = false) + { + var splitName = SplitTypeName(fullName); + var targetModule = context.TargetModule; + var reference = new TypeReference(splitName.Item1, splitName.Item2, targetModule, assembly, isValueType); + return targetModule.ImportReference(reference); + } + + private MethodReference ImportConstructor(ProcessorContext context, IMetadataScope assembly, string fullName, params TypeReference[] parameterTypes) + { + var splitName = SplitTypeName(fullName); + var targetModule = context.TargetModule; + var typeReference = new TypeReference(splitName.Item1, splitName.Item2, targetModule, assembly); + var constructorReference = new MethodReference(WellKnown.Constructor, targetModule.TypeSystem.Void, typeReference) {HasThis = true}; + foreach (var type in parameterTypes) + constructorReference.Parameters.Add(new ParameterDefinition(type)); + return targetModule.ImportReference(constructorReference); + } + + private MethodReference ImportMethod(ProcessorContext context, TypeReference declaringType, string methodName, + bool hasThis, TypeReference returnType, params TypeReference[] parameterTypes) + { + var targetModule = context.TargetModule; + var methodReference = new MethodReference(methodName,returnType, declaringType) {HasThis = hasThis}; + foreach (var parameterType in parameterTypes) + methodReference.Parameters.Add(new ParameterDefinition(parameterType)); + return targetModule.ImportReference(methodReference); + } + + private bool TryGetOrmAssembly(ProcessorContext context, out AssemblyNameReference assemblyNameReference) + { + // check for direct reference + var comparer = WeavingHelper.AssemblyNameComparer; + assemblyNameReference = context.TargetModule.AssemblyReferences + .FirstOrDefault(r => comparer.Equals(r.FullName, WellKnown.OrmAssemblyFullName)); + + if (assemblyNameReference != null) { + return true; + } + + // check whether project had reference to Xtensive.Orm assembly + // but omitted during project compilation as not used. + if (!IsOrmReferenceOmmitedByCompiler(context.Configuration.ReferencedAssemblies)) { + return false; + } + + // if target module has't got reference to the assembly and there was reference to the assembly in project + // then probably some of target module referenses references the assembly. + // So try to get it + assemblyNameReference = context.TargetModule.AssemblyReferences + .Select(r => context.AssemblyResolver.Resolve(r)) + .SelectMany(r => r.Modules) + .SelectMany(m => m.AssemblyReferences) + .FirstOrDefault(ar => comparer.Equals(ar.FullName, WellKnown.OrmAssemblyFullName)); + + if (assemblyNameReference != null) { + context.ShouldAddReferenceToOrm = true; + return true; + } + return false; + } + + private bool IsOrmReferenceOmmitedByCompiler(IList projectReferences) + { + if (projectReferences.Count == 0) { + return false; + } + var lastItemIndex = projectReferences.Count - 1; + + // Orm assembly tends to be at the end of the list + string searchCreteria = WellKnown.OrmAssemblyShortName + ".dll"; + for (int i = lastItemIndex; i >= 0; i--) { + if (projectReferences[i].EndsWith(searchCreteria, StringComparison.OrdinalIgnoreCase)) { + return true; + } + } + return false; + } + + private static Tuple SplitTypeName(string fullName) + { + var index = fullName.LastIndexOf(".", StringComparison.InvariantCulture); + if (index < 0) + return Tuple.Create(String.Empty, fullName); + return Tuple.Create( + fullName.Substring(0, index), + fullName.Substring(index + 1)); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/LoadAssemblyStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/LoadAssemblyStage.cs index 3e9d7b7249..849ee0ac37 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/LoadAssemblyStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/LoadAssemblyStage.cs @@ -1,49 +1,49 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System.IO; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class LoadAssemblyStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - var configuration = context.Configuration; - var inputFile = context.InputFile; - - if (string.IsNullOrEmpty(inputFile) || !File.Exists(inputFile)) { - context.Logger.Write(MessageCode.ErrorInputFileIsNotFound, inputFile); - return ActionResult.Failure; - } - - if (configuration.ProcessDebugSymbols) { - var debugSymbolsFile = FileHelper.GetDebugSymbolsFile(inputFile); - if (!File.Exists(debugSymbolsFile)) { - configuration.ProcessDebugSymbols = false; - context.Logger.Write(MessageCode.WarningDebugSymbolsFileIsNotFound, debugSymbolsFile); - } - } - - var readerParameters = new ReaderParameters { - ReadingMode = ReadingMode.Deferred, - AssemblyResolver = context.AssemblyResolver, - MetadataResolver = context.MetadataResolver, - InMemory = true, - ReadWrite = inputFile==context.OutputFile, - // will be used DefaultSymbolReaderProvider - // it can identify pdb file by module - // so there is no need to open stream and set SymbolReaderProvider - ReadSymbols = configuration.ProcessDebugSymbols - }; - - context.TargetModule = ModuleDefinition.ReadModule(inputFile, readerParameters); - - return ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System.IO; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class LoadAssemblyStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + var configuration = context.Configuration; + var inputFile = context.InputFile; + + if (string.IsNullOrEmpty(inputFile) || !File.Exists(inputFile)) { + context.Logger.Write(MessageCode.ErrorInputFileIsNotFound, inputFile); + return ActionResult.Failure; + } + + if (configuration.ProcessDebugSymbols) { + var debugSymbolsFile = FileHelper.GetDebugSymbolsFile(inputFile); + if (!File.Exists(debugSymbolsFile)) { + configuration.ProcessDebugSymbols = false; + context.Logger.Write(MessageCode.WarningDebugSymbolsFileIsNotFound, debugSymbolsFile); + } + } + + var readerParameters = new ReaderParameters { + ReadingMode = ReadingMode.Deferred, + AssemblyResolver = context.AssemblyResolver, + MetadataResolver = context.MetadataResolver, + InMemory = true, + ReadWrite = inputFile==context.OutputFile, + // will be used DefaultSymbolReaderProvider + // it can identify pdb file by module + // so there is no need to open stream and set SymbolReaderProvider + ReadSymbols = configuration.ProcessDebugSymbols + }; + + context.TargetModule = ModuleDefinition.ReadModule(inputFile, readerParameters); + + return ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/MarkAssemblyStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/MarkAssemblyStage.cs index 8fd6ace0a2..4e3887fb04 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/MarkAssemblyStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/MarkAssemblyStage.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using Xtensive.Orm.Weaver.Tasks; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class MarkAssemblyStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - context.WeavingTasks.Add(new AddAttributeTask( - context.TargetModule.Assembly, context.References.ProcessedByWeaverAttributeConstructor)); - return ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using Xtensive.Orm.Weaver.Tasks; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class MarkAssemblyStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + context.WeavingTasks.Add(new AddAttributeTask( + context.TargetModule.Assembly, context.References.ProcessedByWeaverAttributeConstructor)); + return ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/ModifyPersistentTypesStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/ModifyPersistentTypesStage.cs index 1597c74dc5..5f8e0c016b 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/ModifyPersistentTypesStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/ModifyPersistentTypesStage.cs @@ -1,144 +1,144 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System.Linq; -using Mono.Cecil; -using Xtensive.Orm.Weaver.Tasks; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class ModifyPersistentTypesStage : ProcessorStage - { - private IPersistentPropertyChecker propertyChecker; - - private TypeReference[][] entityFactorySignatures; - private TypeReference[][] structureFactorySignatures; - private TypeReference[][] entitySetFactorySignatures; - - public override ActionResult Execute(ProcessorContext context) - { - var references = context.References; - - entityFactorySignatures = new[] { - new[] {references.SerializationInfo, references.StreamingContext}, - new[] {references.Session, references.EntityState}, - }; - - structureFactorySignatures = new[] { - new[] {references.SerializationInfo, references.StreamingContext}, - new[] {references.Session, references.Tuple}, - new[] {references.Persistent, references.FieldInfo}, - }; - - entitySetFactorySignatures = new[] { - new[] {references.SerializationInfo, references.StreamingContext}, - new[] {references.Entity, references.FieldInfo}, - }; - - propertyChecker = (context.Language==SourceLanguage.CSharp) - ? (IPersistentPropertyChecker) new CsPropertyChecker() - : new VbPropertyChecker(); - - foreach (var type in context.PersistentTypes) - switch (type.Kind) { - case PersistentTypeKind.Entity: - ProcessEntity(context, type); - break; - case PersistentTypeKind.EntitySet: - ProcessEntitySet(context, type); - break; - case PersistentTypeKind.EntityInterface: - ProcessEntityInterface(context, type); - break; - case PersistentTypeKind.Structure: - ProcessStructure(context, type); - break; - } - - if (propertyChecker.HasSkippedProperties) { - context.Logger.Write(MessageCode.ErrorPersistentPropertiesWereNotProcessed); - return ActionResult.Failure; - } - - return ActionResult.Success; - } - - private void ProcessEntityInterface(ProcessorContext context, TypeInfo type) - { - context.WeavingTasks.Add(new AddAttributeTask(type.Definition, context.References.EntityInterfaceAttributeConstructor)); - } - - private void ProcessEntitySet(ProcessorContext context, TypeInfo type) - { - var definition = type.Definition; - - foreach (var signature in entitySetFactorySignatures) - context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); - - context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.EntitySetTypeAttributeConstructor)); - } - - private void ProcessEntity(ProcessorContext context, TypeInfo type) - { - var definition = type.Definition; - - foreach (var signature in entityFactorySignatures) - context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); - - ProcessFields(context, type); - ProcessConstructors(context, type); - - context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.EntityTypeAttributeConstructor)); - } - - private void ProcessStructure(ProcessorContext context, TypeInfo type) - { - var definition = type.Definition; - - foreach (var signature in structureFactorySignatures) - context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); - - ProcessFields(context, type); - ProcessConstructors(context, type); - - context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.StructureTypeAttributeConstructor)); - } - - private void ProcessFields(ProcessorContext context, TypeInfo type) - { - foreach (var property in type.Properties.Values.Where(p => p.IsPersistent)) { - if (!propertyChecker.ShouldProcess(property, context)) - continue; - - var typeDefinition = type.Definition; - var propertyDefinition = property.Definition; - var persistentName = property.PersistentName ?? property.Name; - // Backing field - context.WeavingTasks.Add(new RemoveBackingFieldTask(typeDefinition, propertyDefinition)); - // Getter - context.WeavingTasks.Add(new ImplementFieldAccessorTask(AccessorKind.Getter, - typeDefinition, propertyDefinition, persistentName)); - // Setter - if (property.IsKey) - context.WeavingTasks.Add(new ImplementKeySetterTask(typeDefinition, propertyDefinition)); - else - context.WeavingTasks.Add(new ImplementFieldAccessorTask(AccessorKind.Setter, - typeDefinition, propertyDefinition, persistentName)); - if (property.PersistentName!=null) - context.WeavingTasks.Add(new AddAttributeTask(propertyDefinition, - context.References.OverrideFieldNameAttributeConstructor, property.PersistentName)); - } - } - - private static void ProcessConstructors(ProcessorContext context, TypeInfo type) - { - var userConstructors = type.Definition.Methods - .Where(m => m.IsConstructor && !m.IsStatic && !m.HasAttribute(WellKnown.CompilerGeneratedAttribute)); - foreach (var constructor in userConstructors) - context.WeavingTasks.Add(new ImplementInitializablePatternTask(type.Definition, constructor)); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System.Linq; +using Mono.Cecil; +using Xtensive.Orm.Weaver.Tasks; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class ModifyPersistentTypesStage : ProcessorStage + { + private IPersistentPropertyChecker propertyChecker; + + private TypeReference[][] entityFactorySignatures; + private TypeReference[][] structureFactorySignatures; + private TypeReference[][] entitySetFactorySignatures; + + public override ActionResult Execute(ProcessorContext context) + { + var references = context.References; + + entityFactorySignatures = new[] { + new[] {references.SerializationInfo, references.StreamingContext}, + new[] {references.Session, references.EntityState}, + }; + + structureFactorySignatures = new[] { + new[] {references.SerializationInfo, references.StreamingContext}, + new[] {references.Session, references.Tuple}, + new[] {references.Persistent, references.FieldInfo}, + }; + + entitySetFactorySignatures = new[] { + new[] {references.SerializationInfo, references.StreamingContext}, + new[] {references.Entity, references.FieldInfo}, + }; + + propertyChecker = (context.Language==SourceLanguage.CSharp) + ? (IPersistentPropertyChecker) new CsPropertyChecker() + : new VbPropertyChecker(); + + foreach (var type in context.PersistentTypes) + switch (type.Kind) { + case PersistentTypeKind.Entity: + ProcessEntity(context, type); + break; + case PersistentTypeKind.EntitySet: + ProcessEntitySet(context, type); + break; + case PersistentTypeKind.EntityInterface: + ProcessEntityInterface(context, type); + break; + case PersistentTypeKind.Structure: + ProcessStructure(context, type); + break; + } + + if (propertyChecker.HasSkippedProperties) { + context.Logger.Write(MessageCode.ErrorPersistentPropertiesWereNotProcessed); + return ActionResult.Failure; + } + + return ActionResult.Success; + } + + private void ProcessEntityInterface(ProcessorContext context, TypeInfo type) + { + context.WeavingTasks.Add(new AddAttributeTask(type.Definition, context.References.EntityInterfaceAttributeConstructor)); + } + + private void ProcessEntitySet(ProcessorContext context, TypeInfo type) + { + var definition = type.Definition; + + foreach (var signature in entitySetFactorySignatures) + context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); + + context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.EntitySetTypeAttributeConstructor)); + } + + private void ProcessEntity(ProcessorContext context, TypeInfo type) + { + var definition = type.Definition; + + foreach (var signature in entityFactorySignatures) + context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); + + ProcessFields(context, type); + ProcessConstructors(context, type); + + context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.EntityTypeAttributeConstructor)); + } + + private void ProcessStructure(ProcessorContext context, TypeInfo type) + { + var definition = type.Definition; + + foreach (var signature in structureFactorySignatures) + context.WeavingTasks.Add(new ImplementFactoryTask(definition, signature)); + + ProcessFields(context, type); + ProcessConstructors(context, type); + + context.WeavingTasks.Add(new AddAttributeTask(definition, context.References.StructureTypeAttributeConstructor)); + } + + private void ProcessFields(ProcessorContext context, TypeInfo type) + { + foreach (var property in type.Properties.Values.Where(p => p.IsPersistent)) { + if (!propertyChecker.ShouldProcess(property, context)) + continue; + + var typeDefinition = type.Definition; + var propertyDefinition = property.Definition; + var persistentName = property.PersistentName ?? property.Name; + // Backing field + context.WeavingTasks.Add(new RemoveBackingFieldTask(typeDefinition, propertyDefinition)); + // Getter + context.WeavingTasks.Add(new ImplementFieldAccessorTask(AccessorKind.Getter, + typeDefinition, propertyDefinition, persistentName)); + // Setter + if (property.IsKey) + context.WeavingTasks.Add(new ImplementKeySetterTask(typeDefinition, propertyDefinition)); + else + context.WeavingTasks.Add(new ImplementFieldAccessorTask(AccessorKind.Setter, + typeDefinition, propertyDefinition, persistentName)); + if (property.PersistentName!=null) + context.WeavingTasks.Add(new AddAttributeTask(propertyDefinition, + context.References.OverrideFieldNameAttributeConstructor, property.PersistentName)); + } + } + + private static void ProcessConstructors(ProcessorContext context, TypeInfo type) + { + var userConstructors = type.Definition.Methods + .Where(m => m.IsConstructor && !m.IsStatic && !m.HasAttribute(WellKnown.CompilerGeneratedAttribute)); + foreach (var constructor in userConstructors) + context.WeavingTasks.Add(new ImplementInitializablePatternTask(type.Definition, constructor)); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/RegisterFrameworkAssembliesStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/RegisterFrameworkAssembliesStage.cs index 826052d6da..f5f0f82e47 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/RegisterFrameworkAssembliesStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/RegisterFrameworkAssembliesStage.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.27 - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class RegisterFrameworkAssembliesStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - foreach (var assembly in FrameworkAssemblyList.Get()) { - var items = assembly.Split(); - context.AssemblyChecker.RegisterFrameworkAssembly(items[0], items[1]); - } - return ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.27 + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class RegisterFrameworkAssembliesStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + foreach (var assembly in FrameworkAssemblyList.Get()) { + var items = assembly.Split(); + context.AssemblyChecker.RegisterFrameworkAssembly(items[0], items[1]); + } + return ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/RegisterNetStandardAssembliesStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/RegisterNetStandardAssembliesStage.cs index 8b4232af57..6f9c4e8e23 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/RegisterNetStandardAssembliesStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/RegisterNetStandardAssembliesStage.cs @@ -1,20 +1,20 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2018.05.31 - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class RegisterNetStandardAssembliesStage : ProcessorStage - { - public override ActionResult Execute(ProcessorContext context) - { - foreach (var assembly in NetStandardAssemblyList.Get()) { - var items = assembly.Split(); - context.AssemblyChecker.RegisterNetStandardAssembly(items[0], items[1]); - } - return ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2018.05.31 + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class RegisterNetStandardAssembliesStage : ProcessorStage + { + public override ActionResult Execute(ProcessorContext context) + { + foreach (var assembly in NetStandardAssemblyList.Get()) { + var items = assembly.Split(); + context.AssemblyChecker.RegisterNetStandardAssembly(items[0], items[1]); + } + return ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/SaveAssemblyStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/SaveAssemblyStage.cs index 6624414eb6..2f454a1caf 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/SaveAssemblyStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/SaveAssemblyStage.cs @@ -1,62 +1,62 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System.IO; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class SaveAssemblyStage : ProcessorStage - { - public override bool CanExecute(ProcessorContext context) - { - return true; - } - - public override ActionResult Execute(ProcessorContext context) - { - var configuration = context.Configuration; - - var inputFile = context.InputFile; - var outputFile = context.OutputFile; - var outputIsInput = inputFile==outputFile; - - if (context.SkipProcessing) { - if (!outputIsInput) { - FileHelper.CopyWithPdb(context, inputFile, outputFile); - } - return ActionResult.Success; - } - - if (!context.TranformationPerformed && context.Configuration.MakeBackup && outputIsInput) { - FileHelper.CopyWithPdb(context, inputFile, FileHelper.GetBackupFile(inputFile)); - } - - if (context.ShouldAddReferenceToOrm) { - context.TargetModule.AssemblyReferences.Add(context.References.OrmAssembly); - } - - var writerParameters = new WriterParameters { - WriteSymbols = configuration.ProcessDebugSymbols - }; - - var strongNameKey = configuration.StrongNameKey; - if (!string.IsNullOrEmpty(strongNameKey)) { - if (File.Exists(strongNameKey)) { - writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey); - } - else { - context.Logger.Write(MessageCode.ErrorStrongNameKeyIsNotFound); - return ActionResult.Failure; - } - } - - context.TargetModule.Write(outputFile, writerParameters); - - return ActionResult.Success; - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System.IO; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class SaveAssemblyStage : ProcessorStage + { + public override bool CanExecute(ProcessorContext context) + { + return true; + } + + public override ActionResult Execute(ProcessorContext context) + { + var configuration = context.Configuration; + + var inputFile = context.InputFile; + var outputFile = context.OutputFile; + var outputIsInput = inputFile==outputFile; + + if (context.SkipProcessing) { + if (!outputIsInput) { + FileHelper.CopyWithPdb(context, inputFile, outputFile); + } + return ActionResult.Success; + } + + if (!context.TranformationPerformed && context.Configuration.MakeBackup && outputIsInput) { + FileHelper.CopyWithPdb(context, inputFile, FileHelper.GetBackupFile(inputFile)); + } + + if (context.ShouldAddReferenceToOrm) { + context.TargetModule.AssemblyReferences.Add(context.References.OrmAssembly); + } + + var writerParameters = new WriterParameters { + WriteSymbols = configuration.ProcessDebugSymbols + }; + + var strongNameKey = configuration.StrongNameKey; + if (!string.IsNullOrEmpty(strongNameKey)) { + if (File.Exists(strongNameKey)) { + writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey); + } + else { + context.Logger.Write(MessageCode.ErrorStrongNameKeyIsNotFound); + return ActionResult.Failure; + } + } + + context.TargetModule.Write(outputFile, writerParameters); + + return ActionResult.Success; + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/TransformAssemblyStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/TransformAssemblyStage.cs index 571baf17f6..4b02c993b5 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/TransformAssemblyStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/TransformAssemblyStage.cs @@ -1,68 +1,68 @@ -using System.IO; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class TransformAssemblyStage : ProcessorStage - { - public override bool CanExecute(ProcessorContext context) - { - return true; - } - - public override ActionResult Execute(ProcessorContext context) - { - var configuration = context.Configuration; - var inputFile = context.InputFile; - var outputFile = inputFile; - - if (string.IsNullOrEmpty(inputFile) || !File.Exists(inputFile)) { - context.Logger.Write(MessageCode.ErrorInputFileIsNotFound, inputFile); - return ActionResult.Failure; - } - - if (configuration.ProcessDebugSymbols) { - var debugSymbolsFile = FileHelper.GetDebugSymbolsFile(inputFile); - if (!File.Exists(debugSymbolsFile)) { - configuration.ProcessDebugSymbols = false; - context.Logger.Write(MessageCode.WarningDebugSymbolsFileIsNotFound, debugSymbolsFile); - } - } - - var readerParameters = new ReaderParameters { - ReadingMode = ReadingMode.Deferred, - AssemblyResolver = context.AssemblyResolver, - MetadataResolver = context.MetadataResolver, - InMemory = true, - ReadWrite = true, - // will be used DefaultSymbolReaderProvider - // it can identify pdb file by module - // so there is no need to open stream and set SymbolReaderProvider - ReadSymbols = configuration.ProcessDebugSymbols - }; - - var targetModule = ModuleDefinition.ReadModule(inputFile, readerParameters); - - if (context.Configuration.MakeBackup) - FileHelper.CopyWithPdb(context, inputFile, FileHelper.GetBackupFile(inputFile)); - - var writerParameters = new WriterParameters(){ - WriteSymbols = configuration.ProcessDebugSymbols - }; - - var strongNameKey = configuration.StrongNameKey; - if (!string.IsNullOrEmpty(strongNameKey)) { - if (File.Exists(strongNameKey)) - writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey); - else { - context.Logger.Write(MessageCode.ErrorStrongNameKeyIsNotFound); - return ActionResult.Failure; - } - } - targetModule.Write(outputFile, writerParameters); - - context.TranformationPerformed = true; - return ActionResult.Success; - } - } -} +using System.IO; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class TransformAssemblyStage : ProcessorStage + { + public override bool CanExecute(ProcessorContext context) + { + return true; + } + + public override ActionResult Execute(ProcessorContext context) + { + var configuration = context.Configuration; + var inputFile = context.InputFile; + var outputFile = inputFile; + + if (string.IsNullOrEmpty(inputFile) || !File.Exists(inputFile)) { + context.Logger.Write(MessageCode.ErrorInputFileIsNotFound, inputFile); + return ActionResult.Failure; + } + + if (configuration.ProcessDebugSymbols) { + var debugSymbolsFile = FileHelper.GetDebugSymbolsFile(inputFile); + if (!File.Exists(debugSymbolsFile)) { + configuration.ProcessDebugSymbols = false; + context.Logger.Write(MessageCode.WarningDebugSymbolsFileIsNotFound, debugSymbolsFile); + } + } + + var readerParameters = new ReaderParameters { + ReadingMode = ReadingMode.Deferred, + AssemblyResolver = context.AssemblyResolver, + MetadataResolver = context.MetadataResolver, + InMemory = true, + ReadWrite = true, + // will be used DefaultSymbolReaderProvider + // it can identify pdb file by module + // so there is no need to open stream and set SymbolReaderProvider + ReadSymbols = configuration.ProcessDebugSymbols + }; + + var targetModule = ModuleDefinition.ReadModule(inputFile, readerParameters); + + if (context.Configuration.MakeBackup) + FileHelper.CopyWithPdb(context, inputFile, FileHelper.GetBackupFile(inputFile)); + + var writerParameters = new WriterParameters(){ + WriteSymbols = configuration.ProcessDebugSymbols + }; + + var strongNameKey = configuration.StrongNameKey; + if (!string.IsNullOrEmpty(strongNameKey)) { + if (File.Exists(strongNameKey)) + writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey); + else { + context.Logger.Write(MessageCode.ErrorStrongNameKeyIsNotFound); + return ActionResult.Failure; + } + } + targetModule.Write(outputFile, writerParameters); + + context.TranformationPerformed = true; + return ActionResult.Success; + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/WriteStampStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/WriteStampStage.cs index 0fb681843d..145de14366 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/WriteStampStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/WriteStampStage.cs @@ -1,23 +1,23 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.27 - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class WriteStampStage : ProcessorStage - { - public override bool CanExecute(ProcessorContext context) - { - return context.Configuration.WriteStampFile; - } - - public override ActionResult Execute(ProcessorContext context) - { - var stampFile = FileHelper.GetStampFile(context.OutputFile); - FileHelper.Touch(stampFile); - return ActionResult.Success; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.27 + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class WriteStampStage : ProcessorStage + { + public override bool CanExecute(ProcessorContext context) + { + return context.Configuration.WriteStampFile; + } + + public override ActionResult Execute(ProcessorContext context) + { + var stampFile = FileHelper.GetStampFile(context.OutputFile); + FileHelper.Touch(stampFile); + return ActionResult.Success; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Stages/WriteStatusStage.cs b/Weaver/Xtensive.Orm.Weaver/Stages/WriteStatusStage.cs index 0d2ea4f4e3..b60c66964b 100644 --- a/Weaver/Xtensive.Orm.Weaver/Stages/WriteStatusStage.cs +++ b/Weaver/Xtensive.Orm.Weaver/Stages/WriteStatusStage.cs @@ -1,55 +1,55 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System.IO; - -namespace Xtensive.Orm.Weaver.Stages -{ - internal sealed class WriteStatusStage : ProcessorStage - { - public override bool CanExecute(ProcessorContext context) - { - return base.CanExecute(context) && context.Configuration.WriteStatusFile; - } - - public override ActionResult Execute(ProcessorContext context) - { - var statusFile = FileHelper.GetStatusFile(context.OutputFile); - - using (var writer = new StreamWriter(statusFile)) - DumpTypes(context, writer); - - return ActionResult.Success; - } - - private static void DumpTypes(ProcessorContext context, StreamWriter writer) - { - const string indent = " "; - - foreach (var type in context.PersistentTypes) { - WriteWithWrapping(writer, string.Empty, indent, type.ToString()); - foreach (var property in type.Properties.Values) - WriteWithWrapping(writer, indent, indent, property.ToString()); - } - } - - private static void WriteWithWrapping(StreamWriter writer, string baseIndent, string indent, string line) - { - var items = line.Split(); - if (items.Length==0) - return; - writer.Write(baseIndent); - writer.WriteLine(items[0]); - for (var i = 1; i < items.Length; i++) { - writer.Write(baseIndent); - writer.Write(indent); - writer.Write(items[i]); - writer.WriteLine(); - } - writer.WriteLine(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System.IO; + +namespace Xtensive.Orm.Weaver.Stages +{ + internal sealed class WriteStatusStage : ProcessorStage + { + public override bool CanExecute(ProcessorContext context) + { + return base.CanExecute(context) && context.Configuration.WriteStatusFile; + } + + public override ActionResult Execute(ProcessorContext context) + { + var statusFile = FileHelper.GetStatusFile(context.OutputFile); + + using (var writer = new StreamWriter(statusFile)) + DumpTypes(context, writer); + + return ActionResult.Success; + } + + private static void DumpTypes(ProcessorContext context, StreamWriter writer) + { + const string indent = " "; + + foreach (var type in context.PersistentTypes) { + WriteWithWrapping(writer, string.Empty, indent, type.ToString()); + foreach (var property in type.Properties.Values) + WriteWithWrapping(writer, indent, indent, property.ToString()); + } + } + + private static void WriteWithWrapping(StreamWriter writer, string baseIndent, string indent, string line) + { + var items = line.Split(); + if (items.Length==0) + return; + writer.Write(baseIndent); + writer.WriteLine(items[0]); + for (var i = 1; i < items.Length; i++) { + writer.Write(baseIndent); + writer.Write(indent); + writer.Write(items[i]); + writer.WriteLine(); + } + writer.WriteLine(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/AddAttributeTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/AddAttributeTask.cs index 5478660ca3..2848631200 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/AddAttributeTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/AddAttributeTask.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class AddAttributeTask : WeavingTask - { - private readonly ICustomAttributeProvider target; - private readonly MethodReference attributeConstructor; - private readonly object[] parameters; - - public override ActionResult Execute(ProcessorContext context) - { - var attribute = new CustomAttribute(attributeConstructor); - for (var i = 0; i < attributeConstructor.Parameters.Count; i++) { - var type = attributeConstructor.Parameters[i].ParameterType; - var value = parameters[i]; - attribute.ConstructorArguments.Add(new CustomAttributeArgument(type, value)); - } - target.CustomAttributes.Add(attribute); - return ActionResult.Success; - } - - public AddAttributeTask(ICustomAttributeProvider target, MethodReference attributeConstructor, params object[] parameters) - { - if (target==null) - throw new ArgumentNullException("target"); - if (attributeConstructor==null) - throw new ArgumentNullException("attributeConstructor"); - if (attributeConstructor.Parameters.Count!=parameters.Length) - throw new ArgumentException("Invalid number of constructor parameters"); - - this.target = target; - this.attributeConstructor = attributeConstructor; - this.parameters = parameters; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class AddAttributeTask : WeavingTask + { + private readonly ICustomAttributeProvider target; + private readonly MethodReference attributeConstructor; + private readonly object[] parameters; + + public override ActionResult Execute(ProcessorContext context) + { + var attribute = new CustomAttribute(attributeConstructor); + for (var i = 0; i < attributeConstructor.Parameters.Count; i++) { + var type = attributeConstructor.Parameters[i].ParameterType; + var value = parameters[i]; + attribute.ConstructorArguments.Add(new CustomAttributeArgument(type, value)); + } + target.CustomAttributes.Add(attribute); + return ActionResult.Success; + } + + public AddAttributeTask(ICustomAttributeProvider target, MethodReference attributeConstructor, params object[] parameters) + { + if (target==null) + throw new ArgumentNullException("target"); + if (attributeConstructor==null) + throw new ArgumentNullException("attributeConstructor"); + if (attributeConstructor.Parameters.Count!=parameters.Length) + throw new ArgumentException("Invalid number of constructor parameters"); + + this.target = target; + this.attributeConstructor = attributeConstructor; + this.parameters = parameters; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFactoryTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFactoryTask.cs index 989d97fdb5..5ec71ea2f8 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFactoryTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFactoryTask.cs @@ -1,110 +1,110 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Linq; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class ImplementFactoryTask : WeavingTask - { - private const MethodAttributes ConstructorAttributes = - MethodAttributes.Family - | MethodAttributes.HideBySig - | MethodAttributes.SpecialName - | MethodAttributes.RTSpecialName; - - private const MethodAttributes FactoryMethodAttributes = - MethodAttributes.Private - | MethodAttributes.Static; - - private readonly TypeDefinition targetType; - private readonly TypeReference[] signature; - private TypeReference voidType; - - public override ActionResult Execute(ProcessorContext context) - { - voidType = context.TargetModule.TypeSystem.Void; - var constructor = GetExistingConstructor() ?? DefineConstructor(context); - if (!targetType.IsAbstract) - DefineFactoryMethod(context, constructor); - return ActionResult.Success; - } - - private MethodDefinition DefineConstructor(ProcessorContext context) - { - var baseConstructor = GetBaseConstructor(context); - var method = new MethodDefinition(WellKnown.Constructor, ConstructorAttributes, voidType) {HasThis = true}; - DefineParameters(method); - WeavingHelper.MarkAsCompilerGenerated(context, method); - var il = method.Body.GetILProcessor(); - WeavingHelper.EmitLoadArguments(il, signature.Length + 1); - il.Emit(OpCodes.Call, baseConstructor); - il.Emit(OpCodes.Ret); - targetType.Methods.Add(method); - return method; - } - - private void DefineFactoryMethod(ProcessorContext context, MethodReference constructor) - { - var returnType = (TypeReference) targetType; - if (targetType.HasGenericParameters) { - returnType = WeavingHelper.CreateGenericInstance(targetType); - constructor = new MethodReference(WellKnown.Constructor, voidType, returnType) {HasThis = true}; - DefineParameters(constructor); - } - var method = new MethodDefinition(WellKnown.FactoryMethod, FactoryMethodAttributes, returnType); - DefineParameters(method); - WeavingHelper.MarkAsCompilerGenerated(context, method); - var il = method.Body.GetILProcessor(); - WeavingHelper.EmitLoadArguments(il, signature.Length); - il.Emit(OpCodes.Newobj, constructor); - il.Emit(OpCodes.Ret); - targetType.Methods.Add(method); - } - - private MethodDefinition GetExistingConstructor() - { - var parameterTypes = signature.Select(t => new TypeIdentity(t)).ToList(); - var constructors = targetType.Methods.Where(m => m.IsConstructor && !m.IsStatic); - var existingConstructor = constructors - .FirstOrDefault(m => m.Parameters.Select(p => new TypeIdentity(p.ParameterType)).SequenceEqual(parameterTypes)); - return existingConstructor; - } - - private MethodReference GetBaseConstructor(ProcessorContext context) - { - var reference = new MethodReference(WellKnown.Constructor, voidType, targetType.BaseType) {HasThis = true}; - DefineParameters(reference); - return context.TargetModule.ImportReference(reference); - } - - private void DefineParameters(MethodDefinition method) - { - for (int i = 0; i < signature.Length; i++) - method.Parameters.Add(new ParameterDefinition("p" + i, ParameterAttributes.In, signature[i])); - } - - private void DefineParameters(MethodReference reference) - { - foreach (var item in signature) - reference.Parameters.Add(new ParameterDefinition(item)); - } - - public ImplementFactoryTask(TypeDefinition targetType, TypeReference[] signature) - { - if (targetType==null) - throw new ArgumentNullException("targetType"); - if (signature==null) - throw new ArgumentNullException("signature"); - - this.targetType = targetType; - this.signature = signature; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class ImplementFactoryTask : WeavingTask + { + private const MethodAttributes ConstructorAttributes = + MethodAttributes.Family + | MethodAttributes.HideBySig + | MethodAttributes.SpecialName + | MethodAttributes.RTSpecialName; + + private const MethodAttributes FactoryMethodAttributes = + MethodAttributes.Private + | MethodAttributes.Static; + + private readonly TypeDefinition targetType; + private readonly TypeReference[] signature; + private TypeReference voidType; + + public override ActionResult Execute(ProcessorContext context) + { + voidType = context.TargetModule.TypeSystem.Void; + var constructor = GetExistingConstructor() ?? DefineConstructor(context); + if (!targetType.IsAbstract) + DefineFactoryMethod(context, constructor); + return ActionResult.Success; + } + + private MethodDefinition DefineConstructor(ProcessorContext context) + { + var baseConstructor = GetBaseConstructor(context); + var method = new MethodDefinition(WellKnown.Constructor, ConstructorAttributes, voidType) {HasThis = true}; + DefineParameters(method); + WeavingHelper.MarkAsCompilerGenerated(context, method); + var il = method.Body.GetILProcessor(); + WeavingHelper.EmitLoadArguments(il, signature.Length + 1); + il.Emit(OpCodes.Call, baseConstructor); + il.Emit(OpCodes.Ret); + targetType.Methods.Add(method); + return method; + } + + private void DefineFactoryMethod(ProcessorContext context, MethodReference constructor) + { + var returnType = (TypeReference) targetType; + if (targetType.HasGenericParameters) { + returnType = WeavingHelper.CreateGenericInstance(targetType); + constructor = new MethodReference(WellKnown.Constructor, voidType, returnType) {HasThis = true}; + DefineParameters(constructor); + } + var method = new MethodDefinition(WellKnown.FactoryMethod, FactoryMethodAttributes, returnType); + DefineParameters(method); + WeavingHelper.MarkAsCompilerGenerated(context, method); + var il = method.Body.GetILProcessor(); + WeavingHelper.EmitLoadArguments(il, signature.Length); + il.Emit(OpCodes.Newobj, constructor); + il.Emit(OpCodes.Ret); + targetType.Methods.Add(method); + } + + private MethodDefinition GetExistingConstructor() + { + var parameterTypes = signature.Select(t => new TypeIdentity(t)).ToList(); + var constructors = targetType.Methods.Where(m => m.IsConstructor && !m.IsStatic); + var existingConstructor = constructors + .FirstOrDefault(m => m.Parameters.Select(p => new TypeIdentity(p.ParameterType)).SequenceEqual(parameterTypes)); + return existingConstructor; + } + + private MethodReference GetBaseConstructor(ProcessorContext context) + { + var reference = new MethodReference(WellKnown.Constructor, voidType, targetType.BaseType) {HasThis = true}; + DefineParameters(reference); + return context.TargetModule.ImportReference(reference); + } + + private void DefineParameters(MethodDefinition method) + { + for (int i = 0; i < signature.Length; i++) + method.Parameters.Add(new ParameterDefinition("p" + i, ParameterAttributes.In, signature[i])); + } + + private void DefineParameters(MethodReference reference) + { + foreach (var item in signature) + reference.Parameters.Add(new ParameterDefinition(item)); + } + + public ImplementFactoryTask(TypeDefinition targetType, TypeReference[] signature) + { + if (targetType==null) + throw new ArgumentNullException("targetType"); + if (signature==null) + throw new ArgumentNullException("signature"); + + this.targetType = targetType; + this.signature = signature; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFieldAccessorTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFieldAccessorTask.cs index 1d79d6c41a..006a761d90 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFieldAccessorTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementFieldAccessorTask.cs @@ -1,91 +1,91 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Collections.Generic; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class ImplementFieldAccessorTask : WeavingTask - { - private readonly TypeDefinition type; - private readonly PropertyDefinition property; - private readonly string persistentName; - private readonly AccessorKind kind; - - public override ActionResult Execute(ProcessorContext context) - { - switch (kind) { - case AccessorKind.Getter: - ImplementGetter(context); - break; - case AccessorKind.Setter: - ImplementSetter(context); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - return ActionResult.Success; - } - - private void ImplementSetter(ProcessorContext context) - { - var accessor = GetAccessor(context, - context.References.PersistentSetters, context.References.PersistentSetterDefinition); - var body = property.SetMethod.Body; - body.Instructions.Clear(); - var il = body.GetILProcessor(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldstr, persistentName); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Call, accessor); - il.Emit(OpCodes.Ret); - } - - private void ImplementGetter(ProcessorContext context) - { - var accessor = GetAccessor(context, - context.References.PersistentGetters, context.References.PersistentGetterDefinition); - var body = property.GetMethod.Body; - body.Instructions.Clear(); - var il = body.GetILProcessor(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldstr, persistentName); - il.Emit(OpCodes.Call, accessor); - il.Emit(OpCodes.Ret); - } - - private MethodReference GetAccessor(ProcessorContext context, - IDictionary registry, MethodReference definition) - { - var identity = new TypeIdentity(property.PropertyType); - MethodReference result; - if (!registry.TryGetValue(identity, out result)) { - var accessor = new GenericInstanceMethod(definition); - accessor.GenericArguments.Add(property.PropertyType); - result = context.TargetModule.ImportReference(accessor); - registry.Add(identity, result); - } - return result; - } - - public ImplementFieldAccessorTask(AccessorKind kind, TypeDefinition type, PropertyDefinition property, string persistentName) - { - if (type==null) - throw new ArgumentNullException("type"); - if (property==null) - throw new ArgumentNullException("property"); - - this.kind = kind; - this.type = type; - this.property = property; - this.persistentName = persistentName; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Collections.Generic; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class ImplementFieldAccessorTask : WeavingTask + { + private readonly TypeDefinition type; + private readonly PropertyDefinition property; + private readonly string persistentName; + private readonly AccessorKind kind; + + public override ActionResult Execute(ProcessorContext context) + { + switch (kind) { + case AccessorKind.Getter: + ImplementGetter(context); + break; + case AccessorKind.Setter: + ImplementSetter(context); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return ActionResult.Success; + } + + private void ImplementSetter(ProcessorContext context) + { + var accessor = GetAccessor(context, + context.References.PersistentSetters, context.References.PersistentSetterDefinition); + var body = property.SetMethod.Body; + body.Instructions.Clear(); + var il = body.GetILProcessor(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldstr, persistentName); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Call, accessor); + il.Emit(OpCodes.Ret); + } + + private void ImplementGetter(ProcessorContext context) + { + var accessor = GetAccessor(context, + context.References.PersistentGetters, context.References.PersistentGetterDefinition); + var body = property.GetMethod.Body; + body.Instructions.Clear(); + var il = body.GetILProcessor(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldstr, persistentName); + il.Emit(OpCodes.Call, accessor); + il.Emit(OpCodes.Ret); + } + + private MethodReference GetAccessor(ProcessorContext context, + IDictionary registry, MethodReference definition) + { + var identity = new TypeIdentity(property.PropertyType); + MethodReference result; + if (!registry.TryGetValue(identity, out result)) { + var accessor = new GenericInstanceMethod(definition); + accessor.GenericArguments.Add(property.PropertyType); + result = context.TargetModule.ImportReference(accessor); + registry.Add(identity, result); + } + return result; + } + + public ImplementFieldAccessorTask(AccessorKind kind, TypeDefinition type, PropertyDefinition property, string persistentName) + { + if (type==null) + throw new ArgumentNullException("type"); + if (property==null) + throw new ArgumentNullException("property"); + + this.kind = kind; + this.type = type; + this.property = property; + this.persistentName = persistentName; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementInitializablePatternTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementInitializablePatternTask.cs index 2e9de5f67f..9be4a2742c 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementInitializablePatternTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementInitializablePatternTask.cs @@ -1,130 +1,130 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using System.Linq; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class ImplementInitializablePatternTask : WeavingTask - { - private readonly TypeDefinition type; - private readonly MethodDefinition constructor; - - public override ActionResult Execute(ProcessorContext context) - { - var body = constructor.Body; - var il = body.GetILProcessor(); - var leavePlaceholder = il.Create(OpCodes.Nop); - - var initializeCall = EmitInitializeCall(context, il); - il.Append(leavePlaceholder); - - var exceptionType = context.References.Exception; - var handlerBlock = EmitExceptionHandler(context, il, exceptionType); - var handlerStart = handlerBlock.Item1; - var handlerEnd = handlerBlock.Item2; - var tryStart = GetStartInstruction(il); - var tryEnd = handlerStart; - - ReplaceRetWithBr(il, tryStart, initializeCall, initializeCall); - var ret = il.Create(OpCodes.Ret); - il.Append(ret); - il.Replace(leavePlaceholder, il.Create(OpCodes.Leave, ret)); - - body.InitLocals = true; - var handler = new ExceptionHandler(ExceptionHandlerType.Catch) { - TryStart = tryStart, - TryEnd = tryEnd, - HandlerStart = handlerStart, - HandlerEnd = handlerEnd, - CatchType = exceptionType, - }; - body.ExceptionHandlers.Add(handler); - - return ActionResult.Success; - } - - private void ReplaceRetWithBr(ILProcessor il, Instruction start, Instruction end, Instruction brTarget) - { - var current = start; - while (current!=end) { - var next = current.Next; - if (current.OpCode.Code==Code.Ret) - il.Replace(current, il.Create(OpCodes.Br, brTarget)); - current = next; - } - } - - private Instruction GetStartInstruction(ILProcessor il) - { - var instructions = constructor.Body.Instructions; - var baseConstructorCall = instructions.FirstOrDefault(IsBaseConstructorCall); - var startInstruction = baseConstructorCall!=null ? baseConstructorCall.Next : instructions.FirstOrDefault(); - if (startInstruction==null) { - il.Emit(OpCodes.Nop); - startInstruction = instructions.FirstOrDefault(); - } - return startInstruction; - } - - private bool IsBaseConstructorCall(Instruction instruction) - { - if (instruction.OpCode.Code!=Code.Call) - return false; - var method = instruction.Operand as MethodReference; - if (method==null) - return false; - if (method.Name!=WellKnown.Constructor) - return false; - return true; - } - - private Instruction EmitInitializeCall(ProcessorContext context, ILProcessor il) - { - var initializedType = type.HasGenericParameters ? WeavingHelper.CreateGenericInstance(type) : type; - var start = il.Create(OpCodes.Ldarg_0); - il.Append(start); - il.Emit(OpCodes.Ldtoken, initializedType); - il.Emit(OpCodes.Call, context.References.TypeGetTypeFromHandle); - il.Emit(OpCodes.Call, context.References.PersistentInitialize); - return start; - } - - private Tuple EmitExceptionHandler(ProcessorContext context, ILProcessor il, TypeReference exceptionType) - { - var initializedType = type.HasGenericParameters ? WeavingHelper.CreateGenericInstance(type) : type; - var variables = constructor.Body.Variables; - var instructions = constructor.Body.Instructions; - var variableIndex = variables.Count; - variables.Add(new VariableDefinition(exceptionType)); - il.Emit(OpCodes.Stloc, variableIndex); - var start = instructions[instructions.Count - 1]; - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldtoken, initializedType); - il.Emit(OpCodes.Call, context.References.TypeGetTypeFromHandle); - il.Emit(OpCodes.Ldloc, variableIndex); - il.Emit(OpCodes.Call, context.References.PersistentInitializationError); - il.Emit(OpCodes.Rethrow); - il.Emit(OpCodes.Nop); - var end = instructions[instructions.Count - 1]; - return Tuple.Create(start, end); - } - - public ImplementInitializablePatternTask(TypeDefinition type, MethodDefinition constructor) - { - if (type==null) - throw new ArgumentNullException("type"); - if (constructor==null) - throw new ArgumentNullException("constructor"); - - this.type = type; - this.constructor = constructor; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class ImplementInitializablePatternTask : WeavingTask + { + private readonly TypeDefinition type; + private readonly MethodDefinition constructor; + + public override ActionResult Execute(ProcessorContext context) + { + var body = constructor.Body; + var il = body.GetILProcessor(); + var leavePlaceholder = il.Create(OpCodes.Nop); + + var initializeCall = EmitInitializeCall(context, il); + il.Append(leavePlaceholder); + + var exceptionType = context.References.Exception; + var handlerBlock = EmitExceptionHandler(context, il, exceptionType); + var handlerStart = handlerBlock.Item1; + var handlerEnd = handlerBlock.Item2; + var tryStart = GetStartInstruction(il); + var tryEnd = handlerStart; + + ReplaceRetWithBr(il, tryStart, initializeCall, initializeCall); + var ret = il.Create(OpCodes.Ret); + il.Append(ret); + il.Replace(leavePlaceholder, il.Create(OpCodes.Leave, ret)); + + body.InitLocals = true; + var handler = new ExceptionHandler(ExceptionHandlerType.Catch) { + TryStart = tryStart, + TryEnd = tryEnd, + HandlerStart = handlerStart, + HandlerEnd = handlerEnd, + CatchType = exceptionType, + }; + body.ExceptionHandlers.Add(handler); + + return ActionResult.Success; + } + + private void ReplaceRetWithBr(ILProcessor il, Instruction start, Instruction end, Instruction brTarget) + { + var current = start; + while (current!=end) { + var next = current.Next; + if (current.OpCode.Code==Code.Ret) + il.Replace(current, il.Create(OpCodes.Br, brTarget)); + current = next; + } + } + + private Instruction GetStartInstruction(ILProcessor il) + { + var instructions = constructor.Body.Instructions; + var baseConstructorCall = instructions.FirstOrDefault(IsBaseConstructorCall); + var startInstruction = baseConstructorCall!=null ? baseConstructorCall.Next : instructions.FirstOrDefault(); + if (startInstruction==null) { + il.Emit(OpCodes.Nop); + startInstruction = instructions.FirstOrDefault(); + } + return startInstruction; + } + + private bool IsBaseConstructorCall(Instruction instruction) + { + if (instruction.OpCode.Code!=Code.Call) + return false; + var method = instruction.Operand as MethodReference; + if (method==null) + return false; + if (method.Name!=WellKnown.Constructor) + return false; + return true; + } + + private Instruction EmitInitializeCall(ProcessorContext context, ILProcessor il) + { + var initializedType = type.HasGenericParameters ? WeavingHelper.CreateGenericInstance(type) : type; + var start = il.Create(OpCodes.Ldarg_0); + il.Append(start); + il.Emit(OpCodes.Ldtoken, initializedType); + il.Emit(OpCodes.Call, context.References.TypeGetTypeFromHandle); + il.Emit(OpCodes.Call, context.References.PersistentInitialize); + return start; + } + + private Tuple EmitExceptionHandler(ProcessorContext context, ILProcessor il, TypeReference exceptionType) + { + var initializedType = type.HasGenericParameters ? WeavingHelper.CreateGenericInstance(type) : type; + var variables = constructor.Body.Variables; + var instructions = constructor.Body.Instructions; + var variableIndex = variables.Count; + variables.Add(new VariableDefinition(exceptionType)); + il.Emit(OpCodes.Stloc, variableIndex); + var start = instructions[instructions.Count - 1]; + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldtoken, initializedType); + il.Emit(OpCodes.Call, context.References.TypeGetTypeFromHandle); + il.Emit(OpCodes.Ldloc, variableIndex); + il.Emit(OpCodes.Call, context.References.PersistentInitializationError); + il.Emit(OpCodes.Rethrow); + il.Emit(OpCodes.Nop); + var end = instructions[instructions.Count - 1]; + return Tuple.Create(start, end); + } + + public ImplementInitializablePatternTask(TypeDefinition type, MethodDefinition constructor) + { + if (type==null) + throw new ArgumentNullException("type"); + if (constructor==null) + throw new ArgumentNullException("constructor"); + + this.type = type; + this.constructor = constructor; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementKeySetterTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementKeySetterTask.cs index fc5719dbd3..ae343de3a2 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementKeySetterTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/ImplementKeySetterTask.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -using System; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class ImplementKeySetterTask : WeavingTask - { - private readonly TypeDefinition type; - private readonly PropertyDefinition property; - - public override ActionResult Execute(ProcessorContext context) - { - var body = property.SetMethod.Body; - body.Instructions.Clear(); - var il = body.GetILProcessor(); - il.Emit(OpCodes.Ldstr, type.Name); - il.Emit(OpCodes.Ldstr, property.Name); - il.Emit(OpCodes.Call, context.References.PersistenceImplementationHandleKeySet); - il.Emit(OpCodes.Ret); - return ActionResult.Success; - } - - public ImplementKeySetterTask(TypeDefinition type, PropertyDefinition property) - { - if (type==null) - throw new ArgumentNullException("type"); - if (property==null) - throw new ArgumentNullException("property"); - - this.type = type; - this.property = property; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +using System; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class ImplementKeySetterTask : WeavingTask + { + private readonly TypeDefinition type; + private readonly PropertyDefinition property; + + public override ActionResult Execute(ProcessorContext context) + { + var body = property.SetMethod.Body; + body.Instructions.Clear(); + var il = body.GetILProcessor(); + il.Emit(OpCodes.Ldstr, type.Name); + il.Emit(OpCodes.Ldstr, property.Name); + il.Emit(OpCodes.Call, context.References.PersistenceImplementationHandleKeySet); + il.Emit(OpCodes.Ret); + return ActionResult.Success; + } + + public ImplementKeySetterTask(TypeDefinition type, PropertyDefinition property) + { + if (type==null) + throw new ArgumentNullException("type"); + if (property==null) + throw new ArgumentNullException("property"); + + this.type = type; + this.property = property; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/Tasks/RemoveBackingFieldTask.cs b/Weaver/Xtensive.Orm.Weaver/Tasks/RemoveBackingFieldTask.cs index 4db4353214..1704c9c956 100644 --- a/Weaver/Xtensive.Orm.Weaver/Tasks/RemoveBackingFieldTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/Tasks/RemoveBackingFieldTask.cs @@ -1,50 +1,50 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver.Tasks -{ - internal sealed class RemoveBackingFieldTask : WeavingTask - { - private readonly TypeDefinition type; - private readonly PropertyDefinition property; - - public override ActionResult Execute(ProcessorContext context) - { - var fieldName = GetBackingFieldName(); - if (fieldName!=null && type.Fields.Remove(fieldName)) - return ActionResult.Success; - context.Logger.Write(MessageCode.ErrorUnableToRemoveBackingField, - string.Format("type: {0}, property: {1}, field: {2}", type.FullName, property.Name, fieldName)); - return ActionResult.Failure; - } - - private string GetBackingFieldName() - { - foreach (var instruction in property.GetMethod.Body.Instructions) { - if (instruction.OpCode.Code==Code.Ldfld) { - var field = (FieldReference) instruction.Operand; - return field.Name; - } - } - return null; - } - - public RemoveBackingFieldTask(TypeDefinition type, PropertyDefinition property) - { - if (type==null) - throw new ArgumentNullException("type"); - if (property==null) - throw new ArgumentNullException("property"); - - this.type = type; - this.property = property; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver.Tasks +{ + internal sealed class RemoveBackingFieldTask : WeavingTask + { + private readonly TypeDefinition type; + private readonly PropertyDefinition property; + + public override ActionResult Execute(ProcessorContext context) + { + var fieldName = GetBackingFieldName(); + if (fieldName!=null && type.Fields.Remove(fieldName)) + return ActionResult.Success; + context.Logger.Write(MessageCode.ErrorUnableToRemoveBackingField, + string.Format("type: {0}, property: {1}, field: {2}", type.FullName, property.Name, fieldName)); + return ActionResult.Failure; + } + + private string GetBackingFieldName() + { + foreach (var instruction in property.GetMethod.Body.Instructions) { + if (instruction.OpCode.Code==Code.Ldfld) { + var field = (FieldReference) instruction.Operand; + return field.Name; + } + } + return null; + } + + public RemoveBackingFieldTask(TypeDefinition type, PropertyDefinition property) + { + if (type==null) + throw new ArgumentNullException("type"); + if (property==null) + throw new ArgumentNullException("property"); + + this.type = type; + this.property = property; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs b/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs index 0b51e6b311..932bd2f747 100644 --- a/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs +++ b/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs @@ -1,68 +1,68 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public struct TypeIdentity : IEquatable - { - private readonly string assemblyName; - private readonly string typeName; - - public string AssemblyName - { - get { return assemblyName; } - } - - public string TypeName - { - get { return typeName; } - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - return obj is TypeIdentity && Equals((TypeIdentity) obj); - } - - public bool Equals(TypeIdentity other) - { - return WeavingHelper.AssemblyNameComparer.Equals(AssemblyName, other.AssemblyName) - && WeavingHelper.TypeNameComparer.Equals(TypeName, other.TypeName); - } - - public override int GetHashCode() - { - unchecked { - var typeNameHash = TypeName!=null ? WeavingHelper.TypeNameComparer.GetHashCode(TypeName) : 0; - var assemblyNameHash = AssemblyName!=null ? WeavingHelper.AssemblyNameComparer.GetHashCode(AssemblyName) : 0; - return assemblyNameHash * 397 ^ typeNameHash; - } - } - - public static bool operator ==(TypeIdentity left, TypeIdentity right) - { - return left.Equals(right); - } - - public static bool operator !=(TypeIdentity left, TypeIdentity right) - { - return !left.Equals(right); - } - - public TypeIdentity(TypeReference type) - { - if (type==null) - throw new ArgumentNullException("type"); - - assemblyName = type.Scope.Name; - typeName = type.FullName; - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public struct TypeIdentity : IEquatable + { + private readonly string assemblyName; + private readonly string typeName; + + public string AssemblyName + { + get { return assemblyName; } + } + + public string TypeName + { + get { return typeName; } + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + return obj is TypeIdentity && Equals((TypeIdentity) obj); + } + + public bool Equals(TypeIdentity other) + { + return WeavingHelper.AssemblyNameComparer.Equals(AssemblyName, other.AssemblyName) + && WeavingHelper.TypeNameComparer.Equals(TypeName, other.TypeName); + } + + public override int GetHashCode() + { + unchecked { + var typeNameHash = TypeName!=null ? WeavingHelper.TypeNameComparer.GetHashCode(TypeName) : 0; + var assemblyNameHash = AssemblyName!=null ? WeavingHelper.AssemblyNameComparer.GetHashCode(AssemblyName) : 0; + return assemblyNameHash * 397 ^ typeNameHash; + } + } + + public static bool operator ==(TypeIdentity left, TypeIdentity right) + { + return left.Equals(right); + } + + public static bool operator !=(TypeIdentity left, TypeIdentity right) + { + return !left.Equals(right); + } + + public TypeIdentity(TypeReference type) + { + if (type==null) + throw new ArgumentNullException("type"); + + assemblyName = type.Scope.Name; + typeName = type.FullName; + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/TypeInfo.cs b/Weaver/Xtensive.Orm.Weaver/TypeInfo.cs index d414b97c4f..1f427bef1e 100644 --- a/Weaver/Xtensive.Orm.Weaver/TypeInfo.cs +++ b/Weaver/Xtensive.Orm.Weaver/TypeInfo.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.21 - -using System; -using System.Collections.Generic; -using System.Text; -using Mono.Cecil; - -namespace Xtensive.Orm.Weaver -{ - public sealed class TypeInfo - { - public string Name { get; private set; } - - public string FullName { get; private set; } - - public PersistentTypeKind Kind { get; private set; } - - public TypeDefinition Definition { get; private set; } - - public TypeInfo BaseType { get; set; } - - public IList Interfaces { get; set; } - - public IDictionary Properties { get; set; } - - public override string ToString() - { - var resultBuilder = new StringBuilder(); - resultBuilder.AppendFormat("{0}", FullName); - resultBuilder.AppendFormat(" [kind({0})]", Kind); - if (BaseType!=null) - resultBuilder.AppendFormat(" [inherits({0})]", BaseType.FullName); - foreach (var @interface in Interfaces) - resultBuilder.AppendFormat(" [implements({0})]", @interface.FullName); - return resultBuilder.ToString(); - } - - public PropertyInfo FindProperty(string name) - { - var current = this; - while (current!=null) { - PropertyInfo result; - if (current.Properties.TryGetValue(name, out result)) - return result; - current = current.BaseType; - } - return null; - } - - private void InitializeCollections() - { - Interfaces = new List(); - Properties = new Dictionary(WeavingHelper.TypeNameComparer); - } - - public TypeInfo(TypeReference reference, PersistentTypeKind kind) - { - if (reference==null) - throw new ArgumentNullException("reference"); - - Name = reference.Name; - FullName = reference.FullName; - Kind = kind; - - InitializeCollections(); - } - - public TypeInfo(TypeDefinition definition, PersistentTypeKind kind, TypeInfo baseType = null) - { - if (definition==null) - throw new ArgumentNullException("definition"); - - Name = definition.Name; - FullName = definition.FullName; - Kind = kind; - - Definition = definition; - BaseType = baseType; - - InitializeCollections(); - } - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.21 + +using System; +using System.Collections.Generic; +using System.Text; +using Mono.Cecil; + +namespace Xtensive.Orm.Weaver +{ + public sealed class TypeInfo + { + public string Name { get; private set; } + + public string FullName { get; private set; } + + public PersistentTypeKind Kind { get; private set; } + + public TypeDefinition Definition { get; private set; } + + public TypeInfo BaseType { get; set; } + + public IList Interfaces { get; set; } + + public IDictionary Properties { get; set; } + + public override string ToString() + { + var resultBuilder = new StringBuilder(); + resultBuilder.AppendFormat("{0}", FullName); + resultBuilder.AppendFormat(" [kind({0})]", Kind); + if (BaseType!=null) + resultBuilder.AppendFormat(" [inherits({0})]", BaseType.FullName); + foreach (var @interface in Interfaces) + resultBuilder.AppendFormat(" [implements({0})]", @interface.FullName); + return resultBuilder.ToString(); + } + + public PropertyInfo FindProperty(string name) + { + var current = this; + while (current!=null) { + PropertyInfo result; + if (current.Properties.TryGetValue(name, out result)) + return result; + current = current.BaseType; + } + return null; + } + + private void InitializeCollections() + { + Interfaces = new List(); + Properties = new Dictionary(WeavingHelper.TypeNameComparer); + } + + public TypeInfo(TypeReference reference, PersistentTypeKind kind) + { + if (reference==null) + throw new ArgumentNullException("reference"); + + Name = reference.Name; + FullName = reference.FullName; + Kind = kind; + + InitializeCollections(); + } + + public TypeInfo(TypeDefinition definition, PersistentTypeKind kind, TypeInfo baseType = null) + { + if (definition==null) + throw new ArgumentNullException("definition"); + + Name = definition.Name; + FullName = definition.FullName; + Kind = kind; + + Definition = definition; + BaseType = baseType; + + InitializeCollections(); + } + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/WeavingHelper.cs b/Weaver/Xtensive.Orm.Weaver/WeavingHelper.cs index c06bda2918..fd7e7de358 100644 --- a/Weaver/Xtensive.Orm.Weaver/WeavingHelper.cs +++ b/Weaver/Xtensive.Orm.Weaver/WeavingHelper.cs @@ -1,108 +1,108 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System; -using System.Collections.Generic; -using System.Text; -using Mono.Cecil; -using Mono.Cecil.Cil; - -namespace Xtensive.Orm.Weaver -{ - public static class WeavingHelper - { - public static readonly StringComparer AssemblyNameComparer = StringComparer.OrdinalIgnoreCase; - public static readonly StringComparer TypeNameComparer = StringComparer.Ordinal; - - public static byte[] ParsePublicKeyToken(string value) - { - var result = new List(); - for (var i = 0; i + 1 < value.Length; i += 2) { - var itemValue = value.Substring(i, 2); - result.Add(Convert.ToByte(itemValue, 16)); - } - return result.ToArray(); - } - - public static string FormatPublicKeyToken(byte[] value) - { - var result = new StringBuilder(); - for (var i = 0; i < value.Length; i++) - result.Append(value[i].ToString("x2")); - return result.ToString(); - } - - public static string GetPropertyName(string accessorName) - { - const string getterPrefix = "get_"; - const string setterPrefix = "set_"; - - if (accessorName.StartsWith(getterPrefix, StringComparison.Ordinal)) - return accessorName.Substring(getterPrefix.Length); - if (accessorName.StartsWith(setterPrefix, StringComparison.Ordinal)) - return accessorName.Substring(setterPrefix.Length); - throw new InvalidOperationException(String.Format("Invalid or unsupported accessor name '{0}'", accessorName)); - } - - public static void MarkAsCompilerGenerated(ProcessorContext context, ICustomAttributeProvider target) - { - if (context==null) - throw new ArgumentNullException("context"); - if (target==null) - throw new ArgumentNullException("target"); - target.CustomAttributes.Add(new CustomAttribute(context.References.CompilerGeneratedAttributeConstructor)); - } - - public static void EmitLoadArguments(ILProcessor il, int count) - { - if (il==null) - throw new ArgumentNullException("il"); - if (count > Byte.MaxValue) - throw new ArgumentOutOfRangeException("count"); - - if (count > 0) - il.Emit(OpCodes.Ldarg_0); - if (count > 1) - il.Emit(OpCodes.Ldarg_1); - if (count > 2) - il.Emit(OpCodes.Ldarg_2); - if (count > 3) - il.Emit(OpCodes.Ldarg_3); - if (count > 4) - for (var i = 4; i < count; i++) - il.Emit(OpCodes.Ldarg_S, (byte) i); - } - - public static TypeReference CreateGenericInstance(TypeDefinition type) - { - var typeInstance = new GenericInstanceType(type); - foreach (var parameter in type.GenericParameters) - typeInstance.GenericArguments.Add(parameter); - return typeInstance; - } - - public static string BuildComplexPersistentName(TypeInfo type, PropertyInfo property) - { - return String.Format("{0}.{1}", type.Name, property.Name); - } - - public static SourceLanguage ParseLanguage(string projectType) - { - if (string.IsNullOrEmpty(projectType)) - return SourceLanguage.Unknown; - switch (projectType.ToLowerInvariant()) { - case ".csproj": - return SourceLanguage.CSharp; - case ".vbproj": - return SourceLanguage.VbNet; - case ".fsproj": - return SourceLanguage.FSharp; - default: - return SourceLanguage.Unknown; - } - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System; +using System.Collections.Generic; +using System.Text; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Xtensive.Orm.Weaver +{ + public static class WeavingHelper + { + public static readonly StringComparer AssemblyNameComparer = StringComparer.OrdinalIgnoreCase; + public static readonly StringComparer TypeNameComparer = StringComparer.Ordinal; + + public static byte[] ParsePublicKeyToken(string value) + { + var result = new List(); + for (var i = 0; i + 1 < value.Length; i += 2) { + var itemValue = value.Substring(i, 2); + result.Add(Convert.ToByte(itemValue, 16)); + } + return result.ToArray(); + } + + public static string FormatPublicKeyToken(byte[] value) + { + var result = new StringBuilder(); + for (var i = 0; i < value.Length; i++) + result.Append(value[i].ToString("x2")); + return result.ToString(); + } + + public static string GetPropertyName(string accessorName) + { + const string getterPrefix = "get_"; + const string setterPrefix = "set_"; + + if (accessorName.StartsWith(getterPrefix, StringComparison.Ordinal)) + return accessorName.Substring(getterPrefix.Length); + if (accessorName.StartsWith(setterPrefix, StringComparison.Ordinal)) + return accessorName.Substring(setterPrefix.Length); + throw new InvalidOperationException(String.Format("Invalid or unsupported accessor name '{0}'", accessorName)); + } + + public static void MarkAsCompilerGenerated(ProcessorContext context, ICustomAttributeProvider target) + { + if (context==null) + throw new ArgumentNullException("context"); + if (target==null) + throw new ArgumentNullException("target"); + target.CustomAttributes.Add(new CustomAttribute(context.References.CompilerGeneratedAttributeConstructor)); + } + + public static void EmitLoadArguments(ILProcessor il, int count) + { + if (il==null) + throw new ArgumentNullException("il"); + if (count > Byte.MaxValue) + throw new ArgumentOutOfRangeException("count"); + + if (count > 0) + il.Emit(OpCodes.Ldarg_0); + if (count > 1) + il.Emit(OpCodes.Ldarg_1); + if (count > 2) + il.Emit(OpCodes.Ldarg_2); + if (count > 3) + il.Emit(OpCodes.Ldarg_3); + if (count > 4) + for (var i = 4; i < count; i++) + il.Emit(OpCodes.Ldarg_S, (byte) i); + } + + public static TypeReference CreateGenericInstance(TypeDefinition type) + { + var typeInstance = new GenericInstanceType(type); + foreach (var parameter in type.GenericParameters) + typeInstance.GenericArguments.Add(parameter); + return typeInstance; + } + + public static string BuildComplexPersistentName(TypeInfo type, PropertyInfo property) + { + return String.Format("{0}.{1}", type.Name, property.Name); + } + + public static SourceLanguage ParseLanguage(string projectType) + { + if (string.IsNullOrEmpty(projectType)) + return SourceLanguage.Unknown; + switch (projectType.ToLowerInvariant()) { + case ".csproj": + return SourceLanguage.CSharp; + case ".vbproj": + return SourceLanguage.VbNet; + case ".fsproj": + return SourceLanguage.FSharp; + default: + return SourceLanguage.Unknown; + } + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/WeavingTask.cs b/Weaver/Xtensive.Orm.Weaver/WeavingTask.cs index 5decb7485c..b3783a525e 100644 --- a/Weaver/Xtensive.Orm.Weaver/WeavingTask.cs +++ b/Weaver/Xtensive.Orm.Weaver/WeavingTask.cs @@ -1,13 +1,13 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.19 - -namespace Xtensive.Orm.Weaver -{ - public abstract class WeavingTask - { - public abstract ActionResult Execute(ProcessorContext context); - } +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.19 + +namespace Xtensive.Orm.Weaver +{ + public abstract class WeavingTask + { + public abstract ActionResult Execute(ProcessorContext context); + } } \ No newline at end of file diff --git a/Weaver/Xtensive.Orm.Weaver/WellKnown.cs b/Weaver/Xtensive.Orm.Weaver/WellKnown.cs index 9af49cb279..a363ae729c 100644 --- a/Weaver/Xtensive.Orm.Weaver/WellKnown.cs +++ b/Weaver/Xtensive.Orm.Weaver/WellKnown.cs @@ -1,52 +1,52 @@ -// Copyright (C) 2013 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2013.08.20 - -using System; -using System.Collections.ObjectModel; - -namespace Xtensive.Orm.Weaver -{ - public static class WellKnown - { - public static readonly ReadOnlyCollection XtensivePublicKeyToken; - - public static readonly string OrmAssemblyShortName = "Xtensive.Orm"; - public static readonly string OrmAssemblyFullName; - - public static readonly string EntityType = "Xtensive.Orm.Entity"; - public static readonly string EntityInterfaceType = "Xtensive.Orm.IEntity"; - public static readonly string EntitySetType = "Xtensive.Orm.EntitySet`1"; - public static readonly string EntitySetItemType = "Xtensive.Orm.Internals.EntitySetItem`2"; - public static readonly string StructureType = "Xtensive.Orm.Structure"; - - public static readonly string KeyAttribute = "Xtensive.Orm.KeyAttribute"; - public static readonly string FieldAttribute = "Xtensive.Orm.FieldAttribute"; - - public static readonly string ProcessedByWeaverAttribute = "Xtensive.Orm.Weaving.ProcessedByWeaverAttribute"; - public static readonly string EntityTypeAttribute = "Xtensive.Orm.Weaving.EntityTypeAttribute"; - public static readonly string EntityInterfaceAttribute = "Xtensive.Orm.Weaving.EntityInterfaceAttribute"; - public static readonly string EntitySetTypeAttribute = "Xtensive.Orm.Weaving.EntitySetTypeAttribute"; - public static readonly string StructureTypeAttribute = "Xtensive.Orm.Weaving.StructureTypeAttribute"; - public static readonly string OverrideFieldNameAttribute = "Xtensive.Orm.Weaving.OverrideFieldNameAttribute"; - - public static readonly string CompilerGeneratedAttribute = "System.Runtime.CompilerServices.CompilerGeneratedAttribute"; - - public static readonly string Constructor = ".ctor"; - public static readonly string FactoryMethod = "~Xtensive.Orm.CreateObject"; - - static WellKnown() - { - var thisAssembly = typeof(WellKnown).Assembly.GetName(); - var publicKeyToken = thisAssembly.GetPublicKeyToken(); - - OrmAssemblyFullName = string.Format( - "{0}, Version={1}, Culture=neutral, PublicKeyToken={2}", - OrmAssemblyShortName, thisAssembly.Version, WeavingHelper.FormatPublicKeyToken(publicKeyToken)); - - XtensivePublicKeyToken = new ReadOnlyCollection(publicKeyToken); - } - } -} +// Copyright (C) 2013 Xtensive LLC. +// All rights reserved. +// For conditions of distribution and use, see license. +// Created by: Denis Krjuchkov +// Created: 2013.08.20 + +using System; +using System.Collections.ObjectModel; + +namespace Xtensive.Orm.Weaver +{ + public static class WellKnown + { + public static readonly ReadOnlyCollection XtensivePublicKeyToken; + + public static readonly string OrmAssemblyShortName = "Xtensive.Orm"; + public static readonly string OrmAssemblyFullName; + + public static readonly string EntityType = "Xtensive.Orm.Entity"; + public static readonly string EntityInterfaceType = "Xtensive.Orm.IEntity"; + public static readonly string EntitySetType = "Xtensive.Orm.EntitySet`1"; + public static readonly string EntitySetItemType = "Xtensive.Orm.Internals.EntitySetItem`2"; + public static readonly string StructureType = "Xtensive.Orm.Structure"; + + public static readonly string KeyAttribute = "Xtensive.Orm.KeyAttribute"; + public static readonly string FieldAttribute = "Xtensive.Orm.FieldAttribute"; + + public static readonly string ProcessedByWeaverAttribute = "Xtensive.Orm.Weaving.ProcessedByWeaverAttribute"; + public static readonly string EntityTypeAttribute = "Xtensive.Orm.Weaving.EntityTypeAttribute"; + public static readonly string EntityInterfaceAttribute = "Xtensive.Orm.Weaving.EntityInterfaceAttribute"; + public static readonly string EntitySetTypeAttribute = "Xtensive.Orm.Weaving.EntitySetTypeAttribute"; + public static readonly string StructureTypeAttribute = "Xtensive.Orm.Weaving.StructureTypeAttribute"; + public static readonly string OverrideFieldNameAttribute = "Xtensive.Orm.Weaving.OverrideFieldNameAttribute"; + + public static readonly string CompilerGeneratedAttribute = "System.Runtime.CompilerServices.CompilerGeneratedAttribute"; + + public static readonly string Constructor = ".ctor"; + public static readonly string FactoryMethod = "~Xtensive.Orm.CreateObject"; + + static WellKnown() + { + var thisAssembly = typeof(WellKnown).Assembly.GetName(); + var publicKeyToken = thisAssembly.GetPublicKeyToken(); + + OrmAssemblyFullName = string.Format( + "{0}, Version={1}, Culture=neutral, PublicKeyToken={2}", + OrmAssemblyShortName, thisAssembly.Version, WeavingHelper.FormatPublicKeyToken(publicKeyToken)); + + XtensivePublicKeyToken = new ReadOnlyCollection(publicKeyToken); + } + } +} diff --git a/Weaver/Xtensive.Orm.Weaver/Xtensive.Orm.Weaver.csproj b/Weaver/Xtensive.Orm.Weaver/Xtensive.Orm.Weaver.csproj index c5b5b914dc..ee1ba8b301 100644 --- a/Weaver/Xtensive.Orm.Weaver/Xtensive.Orm.Weaver.csproj +++ b/Weaver/Xtensive.Orm.Weaver/Xtensive.Orm.Weaver.csproj @@ -1,18 +1,18 @@ - - - Exe - netcoreapp3.0 - false - false - true - ..\..\Orm\Orm.snk - ..\..\_Build\$(Configuration)\tools\weaver\ - Major - - - - - - - + + + Exe + netcoreapp3.0 + false + false + true + ..\..\Orm\Orm.snk + ..\..\_Build\$(Configuration)\tools\weaver\ + Major + + + + + + + \ No newline at end of file